Snap for 7736437 from e21c7248e31c1a0ca4e03a3af867ec60a013a96c to sc-v2-release

Change-Id: I74150cb9180d303b8435475566562b05074497f7
diff --git a/.gitignore b/.gitignore
index 4294f4a..b61e3b7 100644
--- a/.gitignore
+++ b/.gitignore
@@ -90,7 +90,6 @@
 /tools/protoc_wrapper
 /tools/python
 /tools/skia_goldctl
-/tools/swarming_client
 angle.iml
 angle_debug.txt
 build
diff --git a/.vpython b/.vpython
index c249e9c..2f2413c 100644
--- a/.vpython
+++ b/.vpython
@@ -9,7 +9,7 @@
 # CIPD (the "Chrome Infrastructure Package Deployer" service). Unlike `pip`,
 # this never requires the end-user machine to have a working python extension
 # compilation environment. All of these packages are built using:
-#   https://chromium.googlesource.com/infra/infra/+/master/infra/tools/dockerbuild/
+#   https://chromium.googlesource.com/infra/infra/+/main/infra/tools/dockerbuild/
 #
 # All python scripts in the repo share this same spec, to avoid dependency
 # fragmentation.
@@ -20,10 +20,10 @@
 #   vpython path/to/script.py some --arguments
 #
 # Read more about `vpython` and how to modify this file here:
-#   https://chromium.googlesource.com/infra/infra/+/master/doc/users/vpython.md
+#   https://chromium.googlesource.com/infra/infra/+/main/doc/users/vpython.md
 #
 # For the definition of this spec, see:
-#   https://chromium.googlesource.com/infra/luci/luci-go/+/master/vpython/api/vpython/spec.proto
+#   https://chromium.googlesource.com/infra/luci/luci-go/+/main/vpython/api/vpython/spec.proto
 
 python_version: "2.7"
 
diff --git a/.vpython3 b/.vpython3
index c935dee..be96e51 100644
--- a/.vpython3
+++ b/.vpython3
@@ -9,7 +9,7 @@
 # CIPD (the "Chrome Infrastructure Package Deployer" service). Unlike `pip`,
 # this never requires the end-user machine to have a working python extension
 # compilation environment. All of these packages are built using:
-#   https://chromium.googlesource.com/infra/infra/+/master/infra/tools/dockerbuild/
+#   https://chromium.googlesource.com/infra/infra/+/main/infra/tools/dockerbuild/
 #
 # All python scripts in the repo share this same spec, to avoid dependency
 # fragmentation.
@@ -20,7 +20,7 @@
 #   vpython path/to/script.py some --arguments
 #
 # Read more about `vpython` and how to modify this file here:
-#   https://chromium.googlesource.com/infra/infra/+/master/doc/users/vpython.md
+#   https://chromium.googlesource.com/infra/infra/+/main/doc/users/vpython.md
 
 python_version: "3.8"
 
diff --git a/Android.bp b/Android.bp
index ebff06c..616a2d9 100644
--- a/Android.bp
+++ b/Android.bp
@@ -16,7 +16,7 @@
     cflags: [
         "-DANDROID",
         "-DANDROID_NDK_VERSION_ROLL=r22_1",
-        "-DCR_CLANG_REVISION=\"llvmorg-13-init-15163-g98033fdc-1\"",
+        "-DCR_CLANG_REVISION=\"llvmorg-14-init-3191-g0e03450a-1\"",
         "-DCR_LIBCXX_REVISION=79a2e924d96e2fc1e4b937c42efd08898fa472d7",
         "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
         "-DHAVE_SYS_UIO_H",
@@ -33,10 +33,7 @@
         "-Oz",
         "-Wno-builtin-assume-aligned-alignment",
         "-Wno-builtin-macro-redefined",
-        "-Wno-deprecated-copy",
-        "-Wno-final-dtor-non-final-class",
         "-Wno-ignored-pragma-optimize",
-        "-Wno-implicit-fallthrough",
         "-Wno-missing-field-initializers",
         "-Wno-psabi",
         "-Wno-trigraphs",
@@ -86,7 +83,7 @@
         "-DANDROID",
         "-DANDROID_NDK_VERSION_ROLL=r22_1",
         "-DANGLE_USE_EGL_LOADER",
-        "-DCR_CLANG_REVISION=\"llvmorg-13-init-15163-g98033fdc-1\"",
+        "-DCR_CLANG_REVISION=\"llvmorg-14-init-3191-g0e03450a-1\"",
         "-DCR_LIBCXX_REVISION=79a2e924d96e2fc1e4b937c42efd08898fa472d7",
         "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
         "-DEGL_EGLEXT_PROTOTYPES",
@@ -106,10 +103,7 @@
         "-Oz",
         "-Wno-builtin-assume-aligned-alignment",
         "-Wno-builtin-macro-redefined",
-        "-Wno-deprecated-copy",
-        "-Wno-final-dtor-non-final-class",
         "-Wno-ignored-pragma-optimize",
-        "-Wno-implicit-fallthrough",
         "-Wno-missing-field-initializers",
         "-Wno-psabi",
         "-Wno-trigraphs",
@@ -186,7 +180,7 @@
         "-DANGLE_GLESV2_LIBRARY_NAME=\"libGLESv2_angle\"",
         "-DANGLE_USE_ABSEIL",
         "-DANGLE_USE_EGL_LOADER",
-        "-DCR_CLANG_REVISION=\"llvmorg-13-init-15163-g98033fdc-1\"",
+        "-DCR_CLANG_REVISION=\"llvmorg-14-init-3191-g0e03450a-1\"",
         "-DCR_LIBCXX_REVISION=79a2e924d96e2fc1e4b937c42efd08898fa472d7",
         "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
         "-DEGLAPI=__attribute__((visibility(\"default\")))",
@@ -208,10 +202,7 @@
         "-Oz",
         "-Wno-builtin-assume-aligned-alignment",
         "-Wno-builtin-macro-redefined",
-        "-Wno-deprecated-copy",
-        "-Wno-final-dtor-non-final-class",
         "-Wno-ignored-pragma-optimize",
-        "-Wno-implicit-fallthrough",
         "-Wno-missing-field-initializers",
         "-Wno-psabi",
         "-Wno-trigraphs",
@@ -286,7 +277,7 @@
     cflags: [
         "-DANDROID",
         "-DANDROID_NDK_VERSION_ROLL=r22_1",
-        "-DCR_CLANG_REVISION=\"llvmorg-13-init-15163-g98033fdc-1\"",
+        "-DCR_CLANG_REVISION=\"llvmorg-14-init-3191-g0e03450a-1\"",
         "-DCR_LIBCXX_REVISION=79a2e924d96e2fc1e4b937c42efd08898fa472d7",
         "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
         "-DEGL_EGLEXT_PROTOTYPES",
@@ -308,10 +299,7 @@
         "-Oz",
         "-Wno-builtin-assume-aligned-alignment",
         "-Wno-builtin-macro-redefined",
-        "-Wno-deprecated-copy",
-        "-Wno-final-dtor-non-final-class",
         "-Wno-ignored-pragma-optimize",
-        "-Wno-implicit-fallthrough",
         "-Wno-missing-field-initializers",
         "-Wno-psabi",
         "-Wno-trigraphs",
@@ -337,7 +325,7 @@
     local_include_dirs: [
         "",
         "third_party/vulkan-deps/vulkan-headers/src/include/",
-        "third_party/vulkan_memory_allocator/src/",
+        "third_party/vulkan_memory_allocator/include/",
     ],
     srcs: [
         "third_party/vulkan_memory_allocator/vma.cpp",
@@ -346,7 +334,7 @@
     cflags: [
         "-DANDROID",
         "-DANDROID_NDK_VERSION_ROLL=r22_1",
-        "-DCR_CLANG_REVISION=\"llvmorg-13-init-15163-g98033fdc-1\"",
+        "-DCR_CLANG_REVISION=\"llvmorg-14-init-3191-g0e03450a-1\"",
         "-DCR_LIBCXX_REVISION=79a2e924d96e2fc1e4b937c42efd08898fa472d7",
         "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
         "-DHAVE_SYS_UIO_H",
@@ -366,7 +354,6 @@
         "-Wno-builtin-assume-aligned-alignment",
         "-Wno-builtin-macro-redefined",
         "-Wno-deprecated-copy",
-        "-Wno-final-dtor-non-final-class",
         "-Wno-ignored-pragma-optimize",
         "-Wno-implicit-fallthrough",
         "-Wno-missing-field-initializers",
@@ -396,7 +383,7 @@
         "src/",
         "src/third_party/volk/",
         "third_party/vulkan-deps/vulkan-headers/src/include/",
-        "third_party/vulkan_memory_allocator/src/",
+        "third_party/vulkan_memory_allocator/include/",
     ],
     srcs: [
         "src/libANGLE/renderer/vulkan/vk_mem_alloc_wrapper.cpp",
@@ -406,7 +393,7 @@
         "-DANDROID",
         "-DANDROID_NDK_VERSION_ROLL=r22_1",
         "-DANGLE_SHARED_LIBVULKAN=1",
-        "-DCR_CLANG_REVISION=\"llvmorg-13-init-15163-g98033fdc-1\"",
+        "-DCR_CLANG_REVISION=\"llvmorg-14-init-3191-g0e03450a-1\"",
         "-DCR_LIBCXX_REVISION=79a2e924d96e2fc1e4b937c42efd08898fa472d7",
         "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
         "-DHAVE_SYS_UIO_H",
@@ -427,7 +414,6 @@
         "-Wno-builtin-macro-redefined",
         "-Wno-deprecated-copy",
         "-Wno-extra-semi-stmt",
-        "-Wno-final-dtor-non-final-class",
         "-Wno-ignored-pragma-optimize",
         "-Wno-implicit-fallthrough",
         "-Wno-missing-field-initializers",
@@ -494,7 +480,7 @@
         "-DANGLE_USE_ABSEIL",
         "-DANGLE_VK_LAYERS_DIR=\"angledata\"",
         "-DANGLE_VK_MOCK_ICD_JSON=\"angledata/VkICD_mock_icd.json\"",
-        "-DCR_CLANG_REVISION=\"llvmorg-13-init-15163-g98033fdc-1\"",
+        "-DCR_CLANG_REVISION=\"llvmorg-14-init-3191-g0e03450a-1\"",
         "-DCR_LIBCXX_REVISION=79a2e924d96e2fc1e4b937c42efd08898fa472d7",
         "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
         "-DHAVE_SYS_UIO_H",
@@ -511,10 +497,7 @@
         "-Oz",
         "-Wno-builtin-assume-aligned-alignment",
         "-Wno-builtin-macro-redefined",
-        "-Wno-deprecated-copy",
-        "-Wno-final-dtor-non-final-class",
         "-Wno-ignored-pragma-optimize",
-        "-Wno-implicit-fallthrough",
         "-Wno-missing-field-initializers",
         "-Wno-psabi",
         "-Wno-trigraphs",
@@ -545,7 +528,7 @@
     cflags: [
         "-DANDROID",
         "-DANDROID_NDK_VERSION_ROLL=r22_1",
-        "-DCR_CLANG_REVISION=\"llvmorg-13-init-15163-g98033fdc-1\"",
+        "-DCR_CLANG_REVISION=\"llvmorg-14-init-3191-g0e03450a-1\"",
         "-DCR_LIBCXX_REVISION=79a2e924d96e2fc1e4b937c42efd08898fa472d7",
         "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
         "-DHAVE_SYS_UIO_H",
@@ -562,10 +545,7 @@
         "-Oz",
         "-Wno-builtin-assume-aligned-alignment",
         "-Wno-builtin-macro-redefined",
-        "-Wno-deprecated-copy",
-        "-Wno-final-dtor-non-final-class",
         "-Wno-ignored-pragma-optimize",
-        "-Wno-implicit-fallthrough",
         "-Wno-missing-field-initializers",
         "-Wno-psabi",
         "-Wno-trigraphs",
@@ -594,7 +574,7 @@
         "-DANDROID",
         "-DANDROID_NDK_VERSION_ROLL=r22_1",
         "-DANGLE_SHARED_LIBVULKAN=1",
-        "-DCR_CLANG_REVISION=\"llvmorg-13-init-15163-g98033fdc-1\"",
+        "-DCR_CLANG_REVISION=\"llvmorg-14-init-3191-g0e03450a-1\"",
         "-DCR_LIBCXX_REVISION=79a2e924d96e2fc1e4b937c42efd08898fa472d7",
         "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
         "-DHAVE_SYS_UIO_H",
@@ -611,10 +591,7 @@
         "-Oz",
         "-Wno-builtin-assume-aligned-alignment",
         "-Wno-builtin-macro-redefined",
-        "-Wno-deprecated-copy",
-        "-Wno-final-dtor-non-final-class",
         "-Wno-ignored-pragma-optimize",
-        "-Wno-implicit-fallthrough",
         "-Wno-missing-field-initializers",
         "-Wno-psabi",
         "-Wno-trigraphs",
@@ -672,7 +649,7 @@
         "-DANDROID",
         "-DANDROID_NDK_VERSION_ROLL=r22_1",
         "-DANGLE_USE_ABSEIL",
-        "-DCR_CLANG_REVISION=\"llvmorg-13-init-15163-g98033fdc-1\"",
+        "-DCR_CLANG_REVISION=\"llvmorg-14-init-3191-g0e03450a-1\"",
         "-DCR_LIBCXX_REVISION=79a2e924d96e2fc1e4b937c42efd08898fa472d7",
         "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
         "-DHAVE_SYS_UIO_H",
@@ -688,10 +665,7 @@
         "-Oz",
         "-Wno-builtin-assume-aligned-alignment",
         "-Wno-builtin-macro-redefined",
-        "-Wno-deprecated-copy",
-        "-Wno-final-dtor-non-final-class",
         "-Wno-ignored-pragma-optimize",
-        "-Wno-implicit-fallthrough",
         "-Wno-missing-field-initializers",
         "-Wno-psabi",
         "-Wno-trigraphs",
@@ -738,7 +712,7 @@
         "-DANDROID",
         "-DANDROID_NDK_VERSION_ROLL=r22_1",
         "-DANGLE_USE_ABSEIL",
-        "-DCR_CLANG_REVISION=\"llvmorg-13-init-15163-g98033fdc-1\"",
+        "-DCR_CLANG_REVISION=\"llvmorg-14-init-3191-g0e03450a-1\"",
         "-DCR_LIBCXX_REVISION=79a2e924d96e2fc1e4b937c42efd08898fa472d7",
         "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
         "-DHAVE_SYS_UIO_H",
@@ -755,10 +729,7 @@
         "-Oz",
         "-Wno-builtin-assume-aligned-alignment",
         "-Wno-builtin-macro-redefined",
-        "-Wno-deprecated-copy",
-        "-Wno-final-dtor-non-final-class",
         "-Wno-ignored-pragma-optimize",
-        "-Wno-implicit-fallthrough",
         "-Wno-missing-field-initializers",
         "-Wno-psabi",
         "-Wno-trigraphs",
@@ -864,7 +835,7 @@
         "-DANGLE_SHARED_LIBVULKAN=1",
         "-DANGLE_USE_ABSEIL",
         "-DANGLE_USE_CUSTOM_VULKAN_CMD_BUFFERS=1",
-        "-DCR_CLANG_REVISION=\"llvmorg-13-init-15163-g98033fdc-1\"",
+        "-DCR_CLANG_REVISION=\"llvmorg-14-init-3191-g0e03450a-1\"",
         "-DCR_LIBCXX_REVISION=79a2e924d96e2fc1e4b937c42efd08898fa472d7",
         "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
         "-DHAVE_SYS_UIO_H",
@@ -882,10 +853,7 @@
         "-Oz",
         "-Wno-builtin-assume-aligned-alignment",
         "-Wno-builtin-macro-redefined",
-        "-Wno-deprecated-copy",
-        "-Wno-final-dtor-non-final-class",
         "-Wno-ignored-pragma-optimize",
-        "-Wno-implicit-fallthrough",
         "-Wno-missing-field-initializers",
         "-Wno-psabi",
         "-Wno-trigraphs",
@@ -1205,7 +1173,7 @@
     cflags: [
         "-DANDROID",
         "-DANDROID_NDK_VERSION_ROLL=r22_1",
-        "-DCR_CLANG_REVISION=\"llvmorg-13-init-15163-g98033fdc-1\"",
+        "-DCR_CLANG_REVISION=\"llvmorg-14-init-3191-g0e03450a-1\"",
         "-DCR_LIBCXX_REVISION=79a2e924d96e2fc1e4b937c42efd08898fa472d7",
         "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
         "-DHAVE_SYS_UIO_H",
@@ -1221,8 +1189,6 @@
         "-Oz",
         "-Wno-builtin-assume-aligned-alignment",
         "-Wno-builtin-macro-redefined",
-        "-Wno-deprecated-copy",
-        "-Wno-final-dtor-non-final-class",
         "-Wno-ignored-pragma-optimize",
         "-Wno-implicit-fallthrough",
         "-Wno-missing-field-initializers",
@@ -1231,6 +1197,8 @@
         "-Wno-trigraphs",
         "-Wno-unknown-warning-option",
         "-Wno-unneeded-internal-declaration",
+        "-Wno-unreachable-code-break",
+        "-Wno-unreachable-code-return",
         "-Wno-unused-but-set-parameter",
         "-Wno-unused-but-set-variable",
         "-Wno-unused-parameter",
@@ -1317,7 +1285,7 @@
     cflags: [
         "-DANDROID",
         "-DANDROID_NDK_VERSION_ROLL=r22_1",
-        "-DCR_CLANG_REVISION=\"llvmorg-13-init-15163-g98033fdc-1\"",
+        "-DCR_CLANG_REVISION=\"llvmorg-14-init-3191-g0e03450a-1\"",
         "-DCR_LIBCXX_REVISION=79a2e924d96e2fc1e4b937c42efd08898fa472d7",
         "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
         "-DHAVE_SYS_UIO_H",
@@ -1333,8 +1301,6 @@
         "-Oz",
         "-Wno-builtin-assume-aligned-alignment",
         "-Wno-builtin-macro-redefined",
-        "-Wno-deprecated-copy",
-        "-Wno-final-dtor-non-final-class",
         "-Wno-ignored-pragma-optimize",
         "-Wno-implicit-fallthrough",
         "-Wno-missing-field-initializers",
@@ -1343,6 +1309,8 @@
         "-Wno-trigraphs",
         "-Wno-unknown-warning-option",
         "-Wno-unneeded-internal-declaration",
+        "-Wno-unreachable-code-break",
+        "-Wno-unreachable-code-return",
         "-Wno-unused-but-set-parameter",
         "-Wno-unused-but-set-variable",
         "-Wno-unused-parameter",
@@ -1423,7 +1391,7 @@
     cflags: [
         "-DANDROID",
         "-DANDROID_NDK_VERSION_ROLL=r22_1",
-        "-DCR_CLANG_REVISION=\"llvmorg-13-init-15163-g98033fdc-1\"",
+        "-DCR_CLANG_REVISION=\"llvmorg-14-init-3191-g0e03450a-1\"",
         "-DCR_LIBCXX_REVISION=79a2e924d96e2fc1e4b937c42efd08898fa472d7",
         "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
         "-DGLSLANG_ANGLE",
@@ -1440,9 +1408,7 @@
         "-Wno-builtin-macro-redefined",
         "-Wno-c++11-narrowing",
         "-Wno-conversion",
-        "-Wno-deprecated-copy",
         "-Wno-extra-semi",
-        "-Wno-final-dtor-non-final-class",
         "-Wno-ignored-pragma-optimize",
         "-Wno-ignored-qualifiers",
         "-Wno-implicit-fallthrough",
@@ -1478,7 +1444,7 @@
     cflags: [
         "-DANDROID",
         "-DANDROID_NDK_VERSION_ROLL=r22_1",
-        "-DCR_CLANG_REVISION=\"llvmorg-13-init-15163-g98033fdc-1\"",
+        "-DCR_CLANG_REVISION=\"llvmorg-14-init-3191-g0e03450a-1\"",
         "-DCR_LIBCXX_REVISION=79a2e924d96e2fc1e4b937c42efd08898fa472d7",
         "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
         "-DHAVE_SYS_UIO_H",
@@ -1493,10 +1459,7 @@
         "-Wno-builtin-macro-redefined",
         "-Wno-c++11-narrowing",
         "-Wno-conversion",
-        "-Wno-deprecated-copy",
-        "-Wno-final-dtor-non-final-class",
         "-Wno-ignored-pragma-optimize",
-        "-Wno-implicit-fallthrough",
         "-Wno-misleading-indentation",
         "-Wno-missing-field-initializers",
         "-Wno-psabi",
@@ -1540,7 +1503,7 @@
         "-DANDROID",
         "-DANDROID_NDK_VERSION_ROLL=r22_1",
         "-DANGLE_USE_ABSEIL",
-        "-DCR_CLANG_REVISION=\"llvmorg-13-init-15163-g98033fdc-1\"",
+        "-DCR_CLANG_REVISION=\"llvmorg-14-init-3191-g0e03450a-1\"",
         "-DCR_LIBCXX_REVISION=79a2e924d96e2fc1e4b937c42efd08898fa472d7",
         "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
         "-DHAVE_SYS_UIO_H",
@@ -1556,10 +1519,7 @@
         "-Oz",
         "-Wno-builtin-assume-aligned-alignment",
         "-Wno-builtin-macro-redefined",
-        "-Wno-deprecated-copy",
-        "-Wno-final-dtor-non-final-class",
         "-Wno-ignored-pragma-optimize",
-        "-Wno-implicit-fallthrough",
         "-Wno-missing-field-initializers",
         "-Wno-psabi",
         "-Wno-trigraphs",
@@ -1583,7 +1543,7 @@
     cflags: [
         "-DANDROID",
         "-DANDROID_NDK_VERSION_ROLL=r22_1",
-        "-DCR_CLANG_REVISION=\"llvmorg-13-init-15163-g98033fdc-1\"",
+        "-DCR_CLANG_REVISION=\"llvmorg-14-init-3191-g0e03450a-1\"",
         "-DCR_LIBCXX_REVISION=79a2e924d96e2fc1e4b937c42efd08898fa472d7",
         "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
         "-DHAVE_SYS_UIO_H",
@@ -1599,10 +1559,7 @@
         "-Oz",
         "-Wno-builtin-assume-aligned-alignment",
         "-Wno-builtin-macro-redefined",
-        "-Wno-deprecated-copy",
-        "-Wno-final-dtor-non-final-class",
         "-Wno-ignored-pragma-optimize",
-        "-Wno-implicit-fallthrough",
         "-Wno-missing-field-initializers",
         "-Wno-psabi",
         "-Wno-trigraphs",
@@ -1625,7 +1582,7 @@
     cflags: [
         "-DANDROID",
         "-DANDROID_NDK_VERSION_ROLL=r22_1",
-        "-DCR_CLANG_REVISION=\"llvmorg-13-init-15163-g98033fdc-1\"",
+        "-DCR_CLANG_REVISION=\"llvmorg-14-init-3191-g0e03450a-1\"",
         "-DCR_LIBCXX_REVISION=79a2e924d96e2fc1e4b937c42efd08898fa472d7",
         "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
         "-DHAVE_SYS_UIO_H",
@@ -1641,10 +1598,7 @@
         "-Oz",
         "-Wno-builtin-assume-aligned-alignment",
         "-Wno-builtin-macro-redefined",
-        "-Wno-deprecated-copy",
-        "-Wno-final-dtor-non-final-class",
         "-Wno-ignored-pragma-optimize",
-        "-Wno-implicit-fallthrough",
         "-Wno-missing-field-initializers",
         "-Wno-psabi",
         "-Wno-trigraphs",
@@ -1686,7 +1640,7 @@
         "-DANDROID",
         "-DANDROID_NDK_VERSION_ROLL=r22_1",
         "-DANGLE_USE_ABSEIL",
-        "-DCR_CLANG_REVISION=\"llvmorg-13-init-15163-g98033fdc-1\"",
+        "-DCR_CLANG_REVISION=\"llvmorg-14-init-3191-g0e03450a-1\"",
         "-DCR_LIBCXX_REVISION=79a2e924d96e2fc1e4b937c42efd08898fa472d7",
         "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
         "-DHAVE_SYS_UIO_H",
@@ -1702,10 +1656,7 @@
         "-Oz",
         "-Wno-builtin-assume-aligned-alignment",
         "-Wno-builtin-macro-redefined",
-        "-Wno-deprecated-copy",
-        "-Wno-final-dtor-non-final-class",
         "-Wno-ignored-pragma-optimize",
-        "-Wno-implicit-fallthrough",
         "-Wno-missing-field-initializers",
         "-Wno-psabi",
         "-Wno-trigraphs",
@@ -1748,7 +1699,7 @@
         "-DANDROID",
         "-DANDROID_NDK_VERSION_ROLL=r22_1",
         "-DANGLE_USE_ABSEIL",
-        "-DCR_CLANG_REVISION=\"llvmorg-13-init-15163-g98033fdc-1\"",
+        "-DCR_CLANG_REVISION=\"llvmorg-14-init-3191-g0e03450a-1\"",
         "-DCR_LIBCXX_REVISION=79a2e924d96e2fc1e4b937c42efd08898fa472d7",
         "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
         "-DHAVE_SYS_UIO_H",
@@ -1764,10 +1715,7 @@
         "-Oz",
         "-Wno-builtin-assume-aligned-alignment",
         "-Wno-builtin-macro-redefined",
-        "-Wno-deprecated-copy",
-        "-Wno-final-dtor-non-final-class",
         "-Wno-ignored-pragma-optimize",
-        "-Wno-implicit-fallthrough",
         "-Wno-missing-field-initializers",
         "-Wno-psabi",
         "-Wno-trigraphs",
@@ -1823,7 +1771,7 @@
         "-DANDROID",
         "-DANDROID_NDK_VERSION_ROLL=r22_1",
         "-DANGLE_USE_ABSEIL",
-        "-DCR_CLANG_REVISION=\"llvmorg-13-init-15163-g98033fdc-1\"",
+        "-DCR_CLANG_REVISION=\"llvmorg-14-init-3191-g0e03450a-1\"",
         "-DCR_LIBCXX_REVISION=79a2e924d96e2fc1e4b937c42efd08898fa472d7",
         "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
         "-DHAVE_SYS_UIO_H",
@@ -1839,10 +1787,7 @@
         "-Oz",
         "-Wno-builtin-assume-aligned-alignment",
         "-Wno-builtin-macro-redefined",
-        "-Wno-deprecated-copy",
-        "-Wno-final-dtor-non-final-class",
         "-Wno-ignored-pragma-optimize",
-        "-Wno-implicit-fallthrough",
         "-Wno-missing-field-initializers",
         "-Wno-psabi",
         "-Wno-trigraphs",
@@ -1958,49 +1903,51 @@
         "src/compiler/translator/glslang_wrapper.cpp",
         "src/compiler/translator/tree_ops/ClampIndirectIndices.cpp",
         "src/compiler/translator/tree_ops/ClampPointSize.cpp",
+        "src/compiler/translator/tree_ops/ConvertUnsupportedConstructorsToFunctionCalls.cpp",
         "src/compiler/translator/tree_ops/DeclareAndInitBuiltinsForInstancedMultiview.cpp",
         "src/compiler/translator/tree_ops/DeferGlobalInitializers.cpp",
         "src/compiler/translator/tree_ops/EmulateGLFragColorBroadcast.cpp",
         "src/compiler/translator/tree_ops/EmulateMultiDrawShaderBuiltins.cpp",
-        "src/compiler/translator/tree_ops/EmulatePrecision.cpp",
         "src/compiler/translator/tree_ops/FoldExpressions.cpp",
         "src/compiler/translator/tree_ops/ForcePrecisionQualifier.cpp",
         "src/compiler/translator/tree_ops/InitializeVariables.cpp",
+        "src/compiler/translator/tree_ops/MonomorphizeUnsupportedFunctions.cpp",
         "src/compiler/translator/tree_ops/NameNamelessUniformBuffers.cpp",
         "src/compiler/translator/tree_ops/PruneEmptyCases.cpp",
         "src/compiler/translator/tree_ops/PruneNoOps.cpp",
+        "src/compiler/translator/tree_ops/RecordConstantPrecision.cpp",
         "src/compiler/translator/tree_ops/RemoveArrayLengthMethod.cpp",
         "src/compiler/translator/tree_ops/RemoveAtomicCounterBuiltins.cpp",
         "src/compiler/translator/tree_ops/RemoveDynamicIndexing.cpp",
         "src/compiler/translator/tree_ops/RemoveInactiveInterfaceVariables.cpp",
         "src/compiler/translator/tree_ops/RemoveInvariantDeclaration.cpp",
         "src/compiler/translator/tree_ops/RemoveUnreferencedVariables.cpp",
+        "src/compiler/translator/tree_ops/RewriteArrayOfArrayOfOpaqueUniforms.cpp",
         "src/compiler/translator/tree_ops/RewriteAtomicCounters.cpp",
         "src/compiler/translator/tree_ops/RewriteCubeMapSamplersAs2DArray.cpp",
         "src/compiler/translator/tree_ops/RewriteDfdy.cpp",
-        "src/compiler/translator/tree_ops/RewriteRowMajorMatrices.cpp",
         "src/compiler/translator/tree_ops/RewriteStructSamplers.cpp",
         "src/compiler/translator/tree_ops/RewriteTexelFetchOffset.cpp",
         "src/compiler/translator/tree_ops/ScalarizeVecAndMatConstructorArgs.cpp",
         "src/compiler/translator/tree_ops/SeparateDeclarations.cpp",
+        "src/compiler/translator/tree_ops/SeparateStructFromUniformDeclarations.cpp",
         "src/compiler/translator/tree_ops/SimplifyLoopConditions.cpp",
         "src/compiler/translator/tree_ops/SplitSequenceOperator.cpp",
         "src/compiler/translator/tree_ops/vulkan/DeclarePerVertexBlocks.cpp",
         "src/compiler/translator/tree_ops/vulkan/EarlyFragmentTestsOptimization.cpp",
         "src/compiler/translator/tree_ops/vulkan/EmulateFragColorData.cpp",
         "src/compiler/translator/tree_ops/vulkan/FlagSamplersWithTexelFetch.cpp",
-        "src/compiler/translator/tree_ops/vulkan/MonomorphizeUnsupportedFunctionsInVulkanGLSL.cpp",
         "src/compiler/translator/tree_ops/vulkan/ReplaceForShaderFramebufferFetch.cpp",
-        "src/compiler/translator/tree_ops/vulkan/RewriteArrayOfArrayOfOpaqueUniforms.cpp",
         "src/compiler/translator/tree_ops/vulkan/RewriteInterpolateAtOffset.cpp",
         "src/compiler/translator/tree_ops/vulkan/RewriteR32fImages.cpp",
-        "src/compiler/translator/tree_ops/vulkan/SeparateStructFromUniformDeclarations.cpp",
         "src/compiler/translator/tree_util/DriverUniform.cpp",
         "src/compiler/translator/tree_util/FindFunction.cpp",
         "src/compiler/translator/tree_util/FindMain.cpp",
+        "src/compiler/translator/tree_util/FindPreciseNodes.cpp",
         "src/compiler/translator/tree_util/FindSymbolNode.cpp",
         "src/compiler/translator/tree_util/IntermNodePatternMatcher.cpp",
         "src/compiler/translator/tree_util/IntermNode_util.cpp",
+        "src/compiler/translator/tree_util/IntermRebuild.cpp",
         "src/compiler/translator/tree_util/IntermTraverse.cpp",
         "src/compiler/translator/tree_util/ReplaceArrayOfMatrixVarying.cpp",
         "src/compiler/translator/tree_util/ReplaceClipCullDistanceVariable.cpp",
@@ -2019,7 +1966,7 @@
         "-DANDROID_NDK_VERSION_ROLL=r22_1",
         "-DANGLE_ENABLE_VULKAN",
         "-DANGLE_USE_ABSEIL",
-        "-DCR_CLANG_REVISION=\"llvmorg-13-init-15163-g98033fdc-1\"",
+        "-DCR_CLANG_REVISION=\"llvmorg-14-init-3191-g0e03450a-1\"",
         "-DCR_LIBCXX_REVISION=79a2e924d96e2fc1e4b937c42efd08898fa472d7",
         "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
         "-DHAVE_SYS_UIO_H",
@@ -2036,10 +1983,7 @@
         "-Wno-builtin-assume-aligned-alignment",
         "-Wno-builtin-macro-redefined",
         "-Wno-conversion",
-        "-Wno-deprecated-copy",
-        "-Wno-final-dtor-non-final-class",
         "-Wno-ignored-pragma-optimize",
-        "-Wno-implicit-fallthrough",
         "-Wno-missing-field-initializers",
         "-Wno-psabi",
         "-Wno-trigraphs",
@@ -2073,7 +2017,7 @@
     cflags: [
         "-DANDROID",
         "-DANDROID_NDK_VERSION_ROLL=r22_1",
-        "-DCR_CLANG_REVISION=\"llvmorg-13-init-15163-g98033fdc-1\"",
+        "-DCR_CLANG_REVISION=\"llvmorg-14-init-3191-g0e03450a-1\"",
         "-DCR_LIBCXX_REVISION=79a2e924d96e2fc1e4b937c42efd08898fa472d7",
         "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
         "-DHAVE_SYS_UIO_H",
@@ -2089,10 +2033,7 @@
         "-Oz",
         "-Wno-builtin-assume-aligned-alignment",
         "-Wno-builtin-macro-redefined",
-        "-Wno-deprecated-copy",
-        "-Wno-final-dtor-non-final-class",
         "-Wno-ignored-pragma-optimize",
-        "-Wno-implicit-fallthrough",
         "-Wno-missing-field-initializers",
         "-Wno-psabi",
         "-Wno-trigraphs",
@@ -2133,7 +2074,7 @@
         "-DANDROID",
         "-DANDROID_NDK_VERSION_ROLL=r22_1",
         "-DANGLE_USE_ABSEIL",
-        "-DCR_CLANG_REVISION=\"llvmorg-13-init-15163-g98033fdc-1\"",
+        "-DCR_CLANG_REVISION=\"llvmorg-14-init-3191-g0e03450a-1\"",
         "-DCR_LIBCXX_REVISION=79a2e924d96e2fc1e4b937c42efd08898fa472d7",
         "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
         "-DHAVE_SYS_UIO_H",
@@ -2150,10 +2091,7 @@
         "-Oz",
         "-Wno-builtin-assume-aligned-alignment",
         "-Wno-builtin-macro-redefined",
-        "-Wno-deprecated-copy",
-        "-Wno-final-dtor-non-final-class",
         "-Wno-ignored-pragma-optimize",
-        "-Wno-implicit-fallthrough",
         "-Wno-missing-field-initializers",
         "-Wno-psabi",
         "-Wno-trigraphs",
@@ -2194,7 +2132,7 @@
         "-DANDROID",
         "-DANDROID_NDK_VERSION_ROLL=r22_1",
         "-DANGLE_USE_ABSEIL",
-        "-DCR_CLANG_REVISION=\"llvmorg-13-init-15163-g98033fdc-1\"",
+        "-DCR_CLANG_REVISION=\"llvmorg-14-init-3191-g0e03450a-1\"",
         "-DCR_LIBCXX_REVISION=79a2e924d96e2fc1e4b937c42efd08898fa472d7",
         "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
         "-DHAVE_SYS_UIO_H",
@@ -2210,10 +2148,7 @@
         "-Oz",
         "-Wno-builtin-assume-aligned-alignment",
         "-Wno-builtin-macro-redefined",
-        "-Wno-deprecated-copy",
-        "-Wno-final-dtor-non-final-class",
         "-Wno-ignored-pragma-optimize",
-        "-Wno-implicit-fallthrough",
         "-Wno-missing-field-initializers",
         "-Wno-psabi",
         "-Wno-trigraphs",
@@ -2258,7 +2193,7 @@
         "-DANDROID",
         "-DANDROID_NDK_VERSION_ROLL=r22_1",
         "-DANGLE_USE_ABSEIL",
-        "-DCR_CLANG_REVISION=\"llvmorg-13-init-15163-g98033fdc-1\"",
+        "-DCR_CLANG_REVISION=\"llvmorg-14-init-3191-g0e03450a-1\"",
         "-DCR_LIBCXX_REVISION=79a2e924d96e2fc1e4b937c42efd08898fa472d7",
         "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
         "-DHAVE_SYS_UIO_H",
@@ -2274,10 +2209,7 @@
         "-Oz",
         "-Wno-builtin-assume-aligned-alignment",
         "-Wno-builtin-macro-redefined",
-        "-Wno-deprecated-copy",
-        "-Wno-final-dtor-non-final-class",
         "-Wno-ignored-pragma-optimize",
-        "-Wno-implicit-fallthrough",
         "-Wno-missing-field-initializers",
         "-Wno-psabi",
         "-Wno-trigraphs",
@@ -2299,7 +2231,7 @@
     cflags: [
         "-DANDROID",
         "-DANDROID_NDK_VERSION_ROLL=r22_1",
-        "-DCR_CLANG_REVISION=\"llvmorg-13-init-15163-g98033fdc-1\"",
+        "-DCR_CLANG_REVISION=\"llvmorg-14-init-3191-g0e03450a-1\"",
         "-DCR_LIBCXX_REVISION=79a2e924d96e2fc1e4b937c42efd08898fa472d7",
         "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
         "-DHAVE_SYS_UIO_H",
@@ -2316,10 +2248,7 @@
         "-Oz",
         "-Wno-builtin-assume-aligned-alignment",
         "-Wno-builtin-macro-redefined",
-        "-Wno-deprecated-copy",
-        "-Wno-final-dtor-non-final-class",
         "-Wno-ignored-pragma-optimize",
-        "-Wno-implicit-fallthrough",
         "-Wno-missing-field-initializers",
         "-Wno-psabi",
         "-Wno-trigraphs",
@@ -2364,7 +2293,7 @@
         "-DANDROID",
         "-DANDROID_NDK_VERSION_ROLL=r22_1",
         "-DANGLE_USE_ABSEIL",
-        "-DCR_CLANG_REVISION=\"llvmorg-13-init-15163-g98033fdc-1\"",
+        "-DCR_CLANG_REVISION=\"llvmorg-14-init-3191-g0e03450a-1\"",
         "-DCR_LIBCXX_REVISION=79a2e924d96e2fc1e4b937c42efd08898fa472d7",
         "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
         "-DHAVE_SYS_UIO_H",
@@ -2380,10 +2309,7 @@
         "-Oz",
         "-Wno-builtin-assume-aligned-alignment",
         "-Wno-builtin-macro-redefined",
-        "-Wno-deprecated-copy",
-        "-Wno-final-dtor-non-final-class",
         "-Wno-ignored-pragma-optimize",
-        "-Wno-implicit-fallthrough",
         "-Wno-missing-field-initializers",
         "-Wno-psabi",
         "-Wno-trigraphs",
@@ -2427,10 +2353,9 @@
         "-DANDROID",
         "-DANDROID_NDK_VERSION_ROLL=r22_1",
         "-DANGLE_ENABLE_VULKAN",
-        "-DANGLE_HAS_VULKAN_SYSTEM_INFO",
         "-DANGLE_USE_ABSEIL",
         "-DANGLE_USE_CUSTOM_VULKAN_CMD_BUFFERS=1",
-        "-DCR_CLANG_REVISION=\"llvmorg-13-init-15163-g98033fdc-1\"",
+        "-DCR_CLANG_REVISION=\"llvmorg-14-init-3191-g0e03450a-1\"",
         "-DCR_LIBCXX_REVISION=79a2e924d96e2fc1e4b937c42efd08898fa472d7",
         "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
         "-DHAVE_SYS_UIO_H",
@@ -2447,10 +2372,7 @@
         "-Oz",
         "-Wno-builtin-assume-aligned-alignment",
         "-Wno-builtin-macro-redefined",
-        "-Wno-deprecated-copy",
-        "-Wno-final-dtor-non-final-class",
         "-Wno-ignored-pragma-optimize",
-        "-Wno-implicit-fallthrough",
         "-Wno-missing-field-initializers",
         "-Wno-psabi",
         "-Wno-trigraphs",
@@ -2476,7 +2398,7 @@
     cflags: [
         "-DANDROID",
         "-DANDROID_NDK_VERSION_ROLL=r22_1",
-        "-DCR_CLANG_REVISION=\"llvmorg-13-init-15163-g98033fdc-1\"",
+        "-DCR_CLANG_REVISION=\"llvmorg-14-init-3191-g0e03450a-1\"",
         "-DCR_LIBCXX_REVISION=79a2e924d96e2fc1e4b937c42efd08898fa472d7",
         "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
         "-DHAVE_SYS_UIO_H",
@@ -2493,10 +2415,7 @@
         "-Oz",
         "-Wno-builtin-assume-aligned-alignment",
         "-Wno-builtin-macro-redefined",
-        "-Wno-deprecated-copy",
-        "-Wno-final-dtor-non-final-class",
         "-Wno-ignored-pragma-optimize",
-        "-Wno-implicit-fallthrough",
         "-Wno-missing-field-initializers",
         "-Wno-psabi",
         "-Wno-trigraphs",
@@ -2550,7 +2469,7 @@
     cflags: [
         "-DANDROID",
         "-DANDROID_NDK_VERSION_ROLL=r22_1",
-        "-DCR_CLANG_REVISION=\"llvmorg-13-init-15163-g98033fdc-1\"",
+        "-DCR_CLANG_REVISION=\"llvmorg-14-init-3191-g0e03450a-1\"",
         "-DCR_LIBCXX_REVISION=79a2e924d96e2fc1e4b937c42efd08898fa472d7",
         "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
         "-DHAVE_SYS_UIO_H",
@@ -2565,10 +2484,7 @@
         "-Wno-builtin-assume-aligned-alignment",
         "-Wno-builtin-macro-redefined",
         "-Wno-c++11-narrowing",
-        "-Wno-deprecated-copy",
-        "-Wno-final-dtor-non-final-class",
         "-Wno-ignored-pragma-optimize",
-        "-Wno-implicit-fallthrough",
         "-Wno-misleading-indentation",
         "-Wno-missing-field-initializers",
         "-Wno-psabi",
@@ -2626,7 +2542,7 @@
                 "-DANDROID_NDK_VERSION_ROLL=r22_1",
                 "-DARMV8_OS_ANDROID",
                 "-DCRC32_ARMV8_CRC32",
-                "-DCR_CLANG_REVISION=\"llvmorg-13-init-15163-g98033fdc-1\"",
+                "-DCR_CLANG_REVISION=\"llvmorg-14-init-3191-g0e03450a-1\"",
                 "-DCR_LIBCXX_REVISION=79a2e924d96e2fc1e4b937c42efd08898fa472d7",
                 "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
                 "-DHAVE_SYS_UIO_H",
@@ -2643,10 +2559,7 @@
                 "-Oz",
                 "-Wno-builtin-assume-aligned-alignment",
                 "-Wno-builtin-macro-redefined",
-                "-Wno-deprecated-copy",
-                "-Wno-final-dtor-non-final-class",
                 "-Wno-ignored-pragma-optimize",
-                "-Wno-implicit-fallthrough",
                 "-Wno-missing-field-initializers",
                 "-Wno-psabi",
                 "-Wno-trigraphs",
@@ -2671,7 +2584,7 @@
                 "-DANDROID_NDK_VERSION_ROLL=r22_1",
                 "-DARMV8_OS_ANDROID",
                 "-DCRC32_ARMV8_CRC32",
-                "-DCR_CLANG_REVISION=\"llvmorg-13-init-15163-g98033fdc-1\"",
+                "-DCR_CLANG_REVISION=\"llvmorg-14-init-3191-g0e03450a-1\"",
                 "-DCR_LIBCXX_REVISION=79a2e924d96e2fc1e4b937c42efd08898fa472d7",
                 "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
                 "-DHAVE_SYS_UIO_H",
@@ -2688,10 +2601,7 @@
                 "-Oz",
                 "-Wno-builtin-assume-aligned-alignment",
                 "-Wno-builtin-macro-redefined",
-                "-Wno-deprecated-copy",
-                "-Wno-final-dtor-non-final-class",
                 "-Wno-ignored-pragma-optimize",
-                "-Wno-implicit-fallthrough",
                 "-Wno-missing-field-initializers",
                 "-Wno-psabi",
                 "-Wno-trigraphs",
@@ -2716,7 +2626,7 @@
     cflags: [
         "-DANDROID",
         "-DANDROID_NDK_VERSION_ROLL=r22_1",
-        "-DCR_CLANG_REVISION=\"llvmorg-13-init-15163-g98033fdc-1\"",
+        "-DCR_CLANG_REVISION=\"llvmorg-14-init-3191-g0e03450a-1\"",
         "-DCR_LIBCXX_REVISION=79a2e924d96e2fc1e4b937c42efd08898fa472d7",
         "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
         "-DHAVE_SYS_UIO_H",
@@ -2732,10 +2642,7 @@
         "-Oz",
         "-Wno-builtin-assume-aligned-alignment",
         "-Wno-builtin-macro-redefined",
-        "-Wno-deprecated-copy",
-        "-Wno-final-dtor-non-final-class",
         "-Wno-ignored-pragma-optimize",
-        "-Wno-implicit-fallthrough",
         "-Wno-missing-field-initializers",
         "-Wno-psabi",
         "-Wno-trigraphs",
@@ -2763,7 +2670,7 @@
     cflags: [
         "-DANDROID",
         "-DANDROID_NDK_VERSION_ROLL=r22_1",
-        "-DCR_CLANG_REVISION=\"llvmorg-13-init-15163-g98033fdc-1\"",
+        "-DCR_CLANG_REVISION=\"llvmorg-14-init-3191-g0e03450a-1\"",
         "-DCR_LIBCXX_REVISION=79a2e924d96e2fc1e4b937c42efd08898fa472d7",
         "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
         "-DHAVE_SYS_UIO_H",
@@ -2780,10 +2687,7 @@
         "-Oz",
         "-Wno-builtin-assume-aligned-alignment",
         "-Wno-builtin-macro-redefined",
-        "-Wno-deprecated-copy",
-        "-Wno-final-dtor-non-final-class",
         "-Wno-ignored-pragma-optimize",
-        "-Wno-implicit-fallthrough",
         "-Wno-missing-field-initializers",
         "-Wno-psabi",
         "-Wno-trigraphs",
@@ -2835,7 +2739,7 @@
     cflags: [
         "-DANDROID",
         "-DANDROID_NDK_VERSION_ROLL=r22_1",
-        "-DCR_CLANG_REVISION=\"llvmorg-13-init-15163-g98033fdc-1\"",
+        "-DCR_CLANG_REVISION=\"llvmorg-14-init-3191-g0e03450a-1\"",
         "-DCR_LIBCXX_REVISION=79a2e924d96e2fc1e4b937c42efd08898fa472d7",
         "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
         "-DHAVE_SYS_UIO_H",
@@ -2849,10 +2753,7 @@
         "-Wno-builtin-assume-aligned-alignment",
         "-Wno-builtin-macro-redefined",
         "-Wno-c++11-narrowing",
-        "-Wno-deprecated-copy",
-        "-Wno-final-dtor-non-final-class",
         "-Wno-ignored-pragma-optimize",
-        "-Wno-implicit-fallthrough",
         "-Wno-misleading-indentation",
         "-Wno-missing-field-initializers",
         "-Wno-psabi",
@@ -2898,7 +2799,7 @@
     cflags: [
         "-DANDROID",
         "-DANDROID_NDK_VERSION_ROLL=r22_1",
-        "-DCR_CLANG_REVISION=\"llvmorg-13-init-15163-g98033fdc-1\"",
+        "-DCR_CLANG_REVISION=\"llvmorg-14-init-3191-g0e03450a-1\"",
         "-DCR_LIBCXX_REVISION=79a2e924d96e2fc1e4b937c42efd08898fa472d7",
         "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
         "-DHAVE_SYS_UIO_H",
@@ -2913,10 +2814,7 @@
         "-Wno-builtin-assume-aligned-alignment",
         "-Wno-builtin-macro-redefined",
         "-Wno-c++11-narrowing",
-        "-Wno-deprecated-copy",
-        "-Wno-final-dtor-non-final-class",
         "-Wno-ignored-pragma-optimize",
-        "-Wno-implicit-fallthrough",
         "-Wno-misleading-indentation",
         "-Wno-missing-field-initializers",
         "-Wno-psabi",
@@ -2995,7 +2893,7 @@
     cflags: [
         "-DANDROID",
         "-DANDROID_NDK_VERSION_ROLL=r22_1",
-        "-DCR_CLANG_REVISION=\"llvmorg-13-init-15163-g98033fdc-1\"",
+        "-DCR_CLANG_REVISION=\"llvmorg-14-init-3191-g0e03450a-1\"",
         "-DCR_LIBCXX_REVISION=79a2e924d96e2fc1e4b937c42efd08898fa472d7",
         "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
         "-DHAVE_SYS_UIO_H",
@@ -3011,10 +2909,7 @@
         "-Oz",
         "-Wno-builtin-assume-aligned-alignment",
         "-Wno-builtin-macro-redefined",
-        "-Wno-deprecated-copy",
-        "-Wno-final-dtor-non-final-class",
         "-Wno-ignored-pragma-optimize",
-        "-Wno-implicit-fallthrough",
         "-Wno-missing-field-initializers",
         "-Wno-psabi",
         "-Wno-trigraphs",
@@ -3055,7 +2950,7 @@
     cflags: [
         "-DANDROID",
         "-DANDROID_NDK_VERSION_ROLL=r22_1",
-        "-DCR_CLANG_REVISION=\"llvmorg-13-init-15163-g98033fdc-1\"",
+        "-DCR_CLANG_REVISION=\"llvmorg-14-init-3191-g0e03450a-1\"",
         "-DCR_LIBCXX_REVISION=79a2e924d96e2fc1e4b937c42efd08898fa472d7",
         "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
         "-DHAVE_SYS_UIO_H",
@@ -3071,8 +2966,6 @@
         "-Oz",
         "-Wno-builtin-assume-aligned-alignment",
         "-Wno-builtin-macro-redefined",
-        "-Wno-deprecated-copy",
-        "-Wno-final-dtor-non-final-class",
         "-Wno-ignored-pragma-optimize",
         "-Wno-implicit-fallthrough",
         "-Wno-missing-field-initializers",
@@ -3087,14 +2980,18 @@
     ],
 }
 cc_defaults {
+    name: "third_party_abseil_cpp_absl_container_flat_hash_set",
     stl: "libc++_static",
+    local_include_dirs: [
+        "",
+        "third_party/abseil-cpp/",
+    ],
     sdk_version: "28",
-    name: "third_party_abseil_cpp_absl_container_have_sse",
     cflags: [
         "-DABSL_ALLOCATOR_NOTHROW=1",
         "-DANDROID",
         "-DANDROID_NDK_VERSION_ROLL=r22_1",
-        "-DCR_CLANG_REVISION=\"llvmorg-13-init-15163-g98033fdc-1\"",
+        "-DCR_CLANG_REVISION=\"llvmorg-14-init-3191-g0e03450a-1\"",
         "-DCR_LIBCXX_REVISION=79a2e924d96e2fc1e4b937c42efd08898fa472d7",
         "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
         "-DHAVE_SYS_UIO_H",
@@ -3108,10 +3005,52 @@
         "-Wno-builtin-assume-aligned-alignment",
         "-Wno-builtin-macro-redefined",
         "-Wno-c++11-narrowing",
-        "-Wno-deprecated-copy",
-        "-Wno-final-dtor-non-final-class",
         "-Wno-ignored-pragma-optimize",
-        "-Wno-implicit-fallthrough",
+        "-Wno-misleading-indentation",
+        "-Wno-missing-field-initializers",
+        "-Wno-psabi",
+        "-Wno-sign-conversion",
+        "-Wno-trigraphs",
+        "-Wno-unknown-warning-option",
+        "-Wno-unneeded-internal-declaration",
+        "-Wno-unused-but-set-parameter",
+        "-Wno-unused-but-set-variable",
+        "-Wno-unused-parameter",
+        "-Wno-unused-variable",
+        "-fno-unwind-tables",
+    ],
+    defaults: [
+        "third_party_abseil_cpp_absl_algorithm_container",
+        "third_party_abseil_cpp_absl_base_core_headers",
+        "third_party_abseil_cpp_absl_container_container_memory",
+        "third_party_abseil_cpp_absl_container_hash_function_defaults",
+        "third_party_abseil_cpp_absl_container_raw_hash_set",
+        "third_party_abseil_cpp_absl_memory_memory",
+    ],
+}
+cc_defaults {
+    stl: "libc++_static",
+    sdk_version: "28",
+    name: "third_party_abseil_cpp_absl_container_have_sse",
+    cflags: [
+        "-DABSL_ALLOCATOR_NOTHROW=1",
+        "-DANDROID",
+        "-DANDROID_NDK_VERSION_ROLL=r22_1",
+        "-DCR_CLANG_REVISION=\"llvmorg-14-init-3191-g0e03450a-1\"",
+        "-DCR_LIBCXX_REVISION=79a2e924d96e2fc1e4b937c42efd08898fa472d7",
+        "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
+        "-DHAVE_SYS_UIO_H",
+        "-DNDEBUG",
+        "-DNVALGRIND",
+        "-D_GNU_SOURCE",
+        "-D_LIBCPP_DISABLE_VISIBILITY_ANNOTATIONS",
+        "-D_LIBCPP_ENABLE_NODISCARD",
+        "-D_LIBCXXABI_DISABLE_VISIBILITY_ANNOTATIONS",
+        "-Oz",
+        "-Wno-builtin-assume-aligned-alignment",
+        "-Wno-builtin-macro-redefined",
+        "-Wno-c++11-narrowing",
+        "-Wno-ignored-pragma-optimize",
         "-Wno-misleading-indentation",
         "-Wno-missing-field-initializers",
         "-Wno-psabi",
@@ -3146,7 +3085,7 @@
         "-DABSL_ALLOCATOR_NOTHROW=1",
         "-DANDROID",
         "-DANDROID_NDK_VERSION_ROLL=r22_1",
-        "-DCR_CLANG_REVISION=\"llvmorg-13-init-15163-g98033fdc-1\"",
+        "-DCR_CLANG_REVISION=\"llvmorg-14-init-3191-g0e03450a-1\"",
         "-DCR_LIBCXX_REVISION=79a2e924d96e2fc1e4b937c42efd08898fa472d7",
         "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
         "-DHAVE_SYS_UIO_H",
@@ -3160,10 +3099,7 @@
         "-Wno-builtin-assume-aligned-alignment",
         "-Wno-builtin-macro-redefined",
         "-Wno-c++11-narrowing",
-        "-Wno-deprecated-copy",
-        "-Wno-final-dtor-non-final-class",
         "-Wno-ignored-pragma-optimize",
-        "-Wno-implicit-fallthrough",
         "-Wno-misleading-indentation",
         "-Wno-missing-field-initializers",
         "-Wno-psabi",
@@ -3200,7 +3136,7 @@
         "-DABSL_ALLOCATOR_NOTHROW=1",
         "-DANDROID",
         "-DANDROID_NDK_VERSION_ROLL=r22_1",
-        "-DCR_CLANG_REVISION=\"llvmorg-13-init-15163-g98033fdc-1\"",
+        "-DCR_CLANG_REVISION=\"llvmorg-14-init-3191-g0e03450a-1\"",
         "-DCR_LIBCXX_REVISION=79a2e924d96e2fc1e4b937c42efd08898fa472d7",
         "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
         "-DHAVE_SYS_UIO_H",
@@ -3214,10 +3150,7 @@
         "-Wno-builtin-assume-aligned-alignment",
         "-Wno-builtin-macro-redefined",
         "-Wno-c++11-narrowing",
-        "-Wno-deprecated-copy",
-        "-Wno-final-dtor-non-final-class",
         "-Wno-ignored-pragma-optimize",
-        "-Wno-implicit-fallthrough",
         "-Wno-misleading-indentation",
         "-Wno-missing-field-initializers",
         "-Wno-psabi",
@@ -3247,7 +3180,7 @@
         "-DABSL_ALLOCATOR_NOTHROW=1",
         "-DANDROID",
         "-DANDROID_NDK_VERSION_ROLL=r22_1",
-        "-DCR_CLANG_REVISION=\"llvmorg-13-init-15163-g98033fdc-1\"",
+        "-DCR_CLANG_REVISION=\"llvmorg-14-init-3191-g0e03450a-1\"",
         "-DCR_LIBCXX_REVISION=79a2e924d96e2fc1e4b937c42efd08898fa472d7",
         "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
         "-DHAVE_SYS_UIO_H",
@@ -3261,10 +3194,7 @@
         "-Wno-builtin-assume-aligned-alignment",
         "-Wno-builtin-macro-redefined",
         "-Wno-c++11-narrowing",
-        "-Wno-deprecated-copy",
-        "-Wno-final-dtor-non-final-class",
         "-Wno-ignored-pragma-optimize",
-        "-Wno-implicit-fallthrough",
         "-Wno-misleading-indentation",
         "-Wno-missing-field-initializers",
         "-Wno-psabi",
@@ -3294,7 +3224,7 @@
         "-DABSL_ALLOCATOR_NOTHROW=1",
         "-DANDROID",
         "-DANDROID_NDK_VERSION_ROLL=r22_1",
-        "-DCR_CLANG_REVISION=\"llvmorg-13-init-15163-g98033fdc-1\"",
+        "-DCR_CLANG_REVISION=\"llvmorg-14-init-3191-g0e03450a-1\"",
         "-DCR_LIBCXX_REVISION=79a2e924d96e2fc1e4b937c42efd08898fa472d7",
         "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
         "-DHAVE_SYS_UIO_H",
@@ -3308,10 +3238,7 @@
         "-Wno-builtin-assume-aligned-alignment",
         "-Wno-builtin-macro-redefined",
         "-Wno-c++11-narrowing",
-        "-Wno-deprecated-copy",
-        "-Wno-final-dtor-non-final-class",
         "-Wno-ignored-pragma-optimize",
-        "-Wno-implicit-fallthrough",
         "-Wno-misleading-indentation",
         "-Wno-missing-field-initializers",
         "-Wno-psabi",
@@ -3345,7 +3272,7 @@
         "-DABSL_ALLOCATOR_NOTHROW=1",
         "-DANDROID",
         "-DANDROID_NDK_VERSION_ROLL=r22_1",
-        "-DCR_CLANG_REVISION=\"llvmorg-13-init-15163-g98033fdc-1\"",
+        "-DCR_CLANG_REVISION=\"llvmorg-14-init-3191-g0e03450a-1\"",
         "-DCR_LIBCXX_REVISION=79a2e924d96e2fc1e4b937c42efd08898fa472d7",
         "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
         "-DHAVE_SYS_UIO_H",
@@ -3359,10 +3286,7 @@
         "-Wno-builtin-assume-aligned-alignment",
         "-Wno-builtin-macro-redefined",
         "-Wno-c++11-narrowing",
-        "-Wno-deprecated-copy",
-        "-Wno-final-dtor-non-final-class",
         "-Wno-ignored-pragma-optimize",
-        "-Wno-implicit-fallthrough",
         "-Wno-misleading-indentation",
         "-Wno-missing-field-initializers",
         "-Wno-psabi",
@@ -3387,7 +3311,6 @@
         "third_party_abseil_cpp_absl_container_hashtable_debug_hooks",
         "third_party_abseil_cpp_absl_container_hashtablez_sampler",
         "third_party_abseil_cpp_absl_container_have_sse",
-        "third_party_abseil_cpp_absl_container_layout",
         "third_party_abseil_cpp_absl_memory_memory",
         "third_party_abseil_cpp_absl_meta_type_traits",
         "third_party_abseil_cpp_absl_numeric_bits",
@@ -3406,7 +3329,7 @@
         "-DABSL_ALLOCATOR_NOTHROW=1",
         "-DANDROID",
         "-DANDROID_NDK_VERSION_ROLL=r22_1",
-        "-DCR_CLANG_REVISION=\"llvmorg-13-init-15163-g98033fdc-1\"",
+        "-DCR_CLANG_REVISION=\"llvmorg-14-init-3191-g0e03450a-1\"",
         "-DCR_LIBCXX_REVISION=79a2e924d96e2fc1e4b937c42efd08898fa472d7",
         "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
         "-DHAVE_SYS_UIO_H",
@@ -3420,10 +3343,7 @@
         "-Wno-builtin-assume-aligned-alignment",
         "-Wno-builtin-macro-redefined",
         "-Wno-c++11-narrowing",
-        "-Wno-deprecated-copy",
-        "-Wno-final-dtor-non-final-class",
         "-Wno-ignored-pragma-optimize",
-        "-Wno-implicit-fallthrough",
         "-Wno-misleading-indentation",
         "-Wno-missing-field-initializers",
         "-Wno-psabi",
@@ -3455,7 +3375,7 @@
         "-DABSL_ALLOCATOR_NOTHROW=1",
         "-DANDROID",
         "-DANDROID_NDK_VERSION_ROLL=r22_1",
-        "-DCR_CLANG_REVISION=\"llvmorg-13-init-15163-g98033fdc-1\"",
+        "-DCR_CLANG_REVISION=\"llvmorg-14-init-3191-g0e03450a-1\"",
         "-DCR_LIBCXX_REVISION=79a2e924d96e2fc1e4b937c42efd08898fa472d7",
         "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
         "-DHAVE_SYS_UIO_H",
@@ -3469,10 +3389,7 @@
         "-Wno-builtin-assume-aligned-alignment",
         "-Wno-builtin-macro-redefined",
         "-Wno-c++11-narrowing",
-        "-Wno-deprecated-copy",
-        "-Wno-final-dtor-non-final-class",
         "-Wno-ignored-pragma-optimize",
-        "-Wno-implicit-fallthrough",
         "-Wno-misleading-indentation",
         "-Wno-missing-field-initializers",
         "-Wno-psabi",
@@ -3510,7 +3427,7 @@
         "-DABSL_ALLOCATOR_NOTHROW=1",
         "-DANDROID",
         "-DANDROID_NDK_VERSION_ROLL=r22_1",
-        "-DCR_CLANG_REVISION=\"llvmorg-13-init-15163-g98033fdc-1\"",
+        "-DCR_CLANG_REVISION=\"llvmorg-14-init-3191-g0e03450a-1\"",
         "-DCR_LIBCXX_REVISION=79a2e924d96e2fc1e4b937c42efd08898fa472d7",
         "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
         "-DHAVE_SYS_UIO_H",
@@ -3524,10 +3441,7 @@
         "-Wno-builtin-assume-aligned-alignment",
         "-Wno-builtin-macro-redefined",
         "-Wno-c++11-narrowing",
-        "-Wno-deprecated-copy",
-        "-Wno-final-dtor-non-final-class",
         "-Wno-ignored-pragma-optimize",
-        "-Wno-implicit-fallthrough",
         "-Wno-misleading-indentation",
         "-Wno-missing-field-initializers",
         "-Wno-psabi",
@@ -3566,7 +3480,7 @@
         "-DABSL_ALLOCATOR_NOTHROW=1",
         "-DANDROID",
         "-DANDROID_NDK_VERSION_ROLL=r22_1",
-        "-DCR_CLANG_REVISION=\"llvmorg-13-init-15163-g98033fdc-1\"",
+        "-DCR_CLANG_REVISION=\"llvmorg-14-init-3191-g0e03450a-1\"",
         "-DCR_LIBCXX_REVISION=79a2e924d96e2fc1e4b937c42efd08898fa472d7",
         "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
         "-DHAVE_SYS_UIO_H",
@@ -3580,10 +3494,7 @@
         "-Wno-builtin-assume-aligned-alignment",
         "-Wno-builtin-macro-redefined",
         "-Wno-c++11-narrowing",
-        "-Wno-deprecated-copy",
-        "-Wno-final-dtor-non-final-class",
         "-Wno-ignored-pragma-optimize",
-        "-Wno-implicit-fallthrough",
         "-Wno-misleading-indentation",
         "-Wno-missing-field-initializers",
         "-Wno-psabi",
@@ -3613,7 +3524,7 @@
         "-DABSL_ALLOCATOR_NOTHROW=1",
         "-DANDROID",
         "-DANDROID_NDK_VERSION_ROLL=r22_1",
-        "-DCR_CLANG_REVISION=\"llvmorg-13-init-15163-g98033fdc-1\"",
+        "-DCR_CLANG_REVISION=\"llvmorg-14-init-3191-g0e03450a-1\"",
         "-DCR_LIBCXX_REVISION=79a2e924d96e2fc1e4b937c42efd08898fa472d7",
         "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
         "-DHAVE_SYS_UIO_H",
@@ -3627,10 +3538,7 @@
         "-Wno-builtin-assume-aligned-alignment",
         "-Wno-builtin-macro-redefined",
         "-Wno-c++11-narrowing",
-        "-Wno-deprecated-copy",
-        "-Wno-final-dtor-non-final-class",
         "-Wno-ignored-pragma-optimize",
-        "-Wno-implicit-fallthrough",
         "-Wno-misleading-indentation",
         "-Wno-missing-field-initializers",
         "-Wno-psabi",
@@ -3664,7 +3572,7 @@
         "-DABSL_ALLOCATOR_NOTHROW=1",
         "-DANDROID",
         "-DANDROID_NDK_VERSION_ROLL=r22_1",
-        "-DCR_CLANG_REVISION=\"llvmorg-13-init-15163-g98033fdc-1\"",
+        "-DCR_CLANG_REVISION=\"llvmorg-14-init-3191-g0e03450a-1\"",
         "-DCR_LIBCXX_REVISION=79a2e924d96e2fc1e4b937c42efd08898fa472d7",
         "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
         "-DHAVE_SYS_UIO_H",
@@ -3678,10 +3586,7 @@
         "-Wno-builtin-assume-aligned-alignment",
         "-Wno-builtin-macro-redefined",
         "-Wno-c++11-narrowing",
-        "-Wno-deprecated-copy",
-        "-Wno-final-dtor-non-final-class",
         "-Wno-ignored-pragma-optimize",
-        "-Wno-implicit-fallthrough",
         "-Wno-misleading-indentation",
         "-Wno-missing-field-initializers",
         "-Wno-psabi",
@@ -3711,7 +3616,7 @@
         "-DABSL_ALLOCATOR_NOTHROW=1",
         "-DANDROID",
         "-DANDROID_NDK_VERSION_ROLL=r22_1",
-        "-DCR_CLANG_REVISION=\"llvmorg-13-init-15163-g98033fdc-1\"",
+        "-DCR_CLANG_REVISION=\"llvmorg-14-init-3191-g0e03450a-1\"",
         "-DCR_LIBCXX_REVISION=79a2e924d96e2fc1e4b937c42efd08898fa472d7",
         "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
         "-DHAVE_SYS_UIO_H",
@@ -3725,10 +3630,7 @@
         "-Wno-builtin-assume-aligned-alignment",
         "-Wno-builtin-macro-redefined",
         "-Wno-c++11-narrowing",
-        "-Wno-deprecated-copy",
-        "-Wno-final-dtor-non-final-class",
         "-Wno-ignored-pragma-optimize",
-        "-Wno-implicit-fallthrough",
         "-Wno-misleading-indentation",
         "-Wno-missing-field-initializers",
         "-Wno-psabi",
@@ -3770,7 +3672,7 @@
         "-DABSL_ALLOCATOR_NOTHROW=1",
         "-DANDROID",
         "-DANDROID_NDK_VERSION_ROLL=r22_1",
-        "-DCR_CLANG_REVISION=\"llvmorg-13-init-15163-g98033fdc-1\"",
+        "-DCR_CLANG_REVISION=\"llvmorg-14-init-3191-g0e03450a-1\"",
         "-DCR_LIBCXX_REVISION=79a2e924d96e2fc1e4b937c42efd08898fa472d7",
         "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
         "-DHAVE_SYS_UIO_H",
@@ -3784,10 +3686,7 @@
         "-Wno-builtin-assume-aligned-alignment",
         "-Wno-builtin-macro-redefined",
         "-Wno-c++11-narrowing",
-        "-Wno-deprecated-copy",
-        "-Wno-final-dtor-non-final-class",
         "-Wno-ignored-pragma-optimize",
-        "-Wno-implicit-fallthrough",
         "-Wno-misleading-indentation",
         "-Wno-missing-field-initializers",
         "-Wno-psabi",
@@ -3821,7 +3720,7 @@
         "-DABSL_ALLOCATOR_NOTHROW=1",
         "-DANDROID",
         "-DANDROID_NDK_VERSION_ROLL=r22_1",
-        "-DCR_CLANG_REVISION=\"llvmorg-13-init-15163-g98033fdc-1\"",
+        "-DCR_CLANG_REVISION=\"llvmorg-14-init-3191-g0e03450a-1\"",
         "-DCR_LIBCXX_REVISION=79a2e924d96e2fc1e4b937c42efd08898fa472d7",
         "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
         "-DHAVE_SYS_UIO_H",
@@ -3835,10 +3734,7 @@
         "-Wno-builtin-assume-aligned-alignment",
         "-Wno-builtin-macro-redefined",
         "-Wno-c++11-narrowing",
-        "-Wno-deprecated-copy",
-        "-Wno-final-dtor-non-final-class",
         "-Wno-ignored-pragma-optimize",
-        "-Wno-implicit-fallthrough",
         "-Wno-misleading-indentation",
         "-Wno-missing-field-initializers",
         "-Wno-psabi",
@@ -3875,7 +3771,7 @@
         "-DABSL_ALLOCATOR_NOTHROW=1",
         "-DANDROID",
         "-DANDROID_NDK_VERSION_ROLL=r22_1",
-        "-DCR_CLANG_REVISION=\"llvmorg-13-init-15163-g98033fdc-1\"",
+        "-DCR_CLANG_REVISION=\"llvmorg-14-init-3191-g0e03450a-1\"",
         "-DCR_LIBCXX_REVISION=79a2e924d96e2fc1e4b937c42efd08898fa472d7",
         "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
         "-DHAVE_SYS_UIO_H",
@@ -3889,10 +3785,7 @@
         "-Wno-builtin-assume-aligned-alignment",
         "-Wno-builtin-macro-redefined",
         "-Wno-c++11-narrowing",
-        "-Wno-deprecated-copy",
-        "-Wno-final-dtor-non-final-class",
         "-Wno-ignored-pragma-optimize",
-        "-Wno-implicit-fallthrough",
         "-Wno-misleading-indentation",
         "-Wno-missing-field-initializers",
         "-Wno-psabi",
@@ -3928,7 +3821,7 @@
         "-DABSL_ALLOCATOR_NOTHROW=1",
         "-DANDROID",
         "-DANDROID_NDK_VERSION_ROLL=r22_1",
-        "-DCR_CLANG_REVISION=\"llvmorg-13-init-15163-g98033fdc-1\"",
+        "-DCR_CLANG_REVISION=\"llvmorg-14-init-3191-g0e03450a-1\"",
         "-DCR_LIBCXX_REVISION=79a2e924d96e2fc1e4b937c42efd08898fa472d7",
         "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
         "-DHAVE_SYS_UIO_H",
@@ -3942,10 +3835,7 @@
         "-Wno-builtin-assume-aligned-alignment",
         "-Wno-builtin-macro-redefined",
         "-Wno-c++11-narrowing",
-        "-Wno-deprecated-copy",
-        "-Wno-final-dtor-non-final-class",
         "-Wno-ignored-pragma-optimize",
-        "-Wno-implicit-fallthrough",
         "-Wno-misleading-indentation",
         "-Wno-missing-field-initializers",
         "-Wno-psabi",
@@ -3980,7 +3870,7 @@
         "-DABSL_ALLOCATOR_NOTHROW=1",
         "-DANDROID",
         "-DANDROID_NDK_VERSION_ROLL=r22_1",
-        "-DCR_CLANG_REVISION=\"llvmorg-13-init-15163-g98033fdc-1\"",
+        "-DCR_CLANG_REVISION=\"llvmorg-14-init-3191-g0e03450a-1\"",
         "-DCR_LIBCXX_REVISION=79a2e924d96e2fc1e4b937c42efd08898fa472d7",
         "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
         "-DHAVE_SYS_UIO_H",
@@ -3994,10 +3884,7 @@
         "-Wno-builtin-assume-aligned-alignment",
         "-Wno-builtin-macro-redefined",
         "-Wno-c++11-narrowing",
-        "-Wno-deprecated-copy",
-        "-Wno-final-dtor-non-final-class",
         "-Wno-ignored-pragma-optimize",
-        "-Wno-implicit-fallthrough",
         "-Wno-misleading-indentation",
         "-Wno-missing-field-initializers",
         "-Wno-psabi",
@@ -4035,7 +3922,7 @@
         "-DABSL_ALLOCATOR_NOTHROW=1",
         "-DANDROID",
         "-DANDROID_NDK_VERSION_ROLL=r22_1",
-        "-DCR_CLANG_REVISION=\"llvmorg-13-init-15163-g98033fdc-1\"",
+        "-DCR_CLANG_REVISION=\"llvmorg-14-init-3191-g0e03450a-1\"",
         "-DCR_LIBCXX_REVISION=79a2e924d96e2fc1e4b937c42efd08898fa472d7",
         "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
         "-DHAVE_SYS_UIO_H",
@@ -4049,10 +3936,7 @@
         "-Wno-builtin-assume-aligned-alignment",
         "-Wno-builtin-macro-redefined",
         "-Wno-c++11-narrowing",
-        "-Wno-deprecated-copy",
-        "-Wno-final-dtor-non-final-class",
         "-Wno-ignored-pragma-optimize",
-        "-Wno-implicit-fallthrough",
         "-Wno-misleading-indentation",
         "-Wno-missing-field-initializers",
         "-Wno-psabi",
@@ -4087,7 +3971,7 @@
         "-DABSL_ALLOCATOR_NOTHROW=1",
         "-DANDROID",
         "-DANDROID_NDK_VERSION_ROLL=r22_1",
-        "-DCR_CLANG_REVISION=\"llvmorg-13-init-15163-g98033fdc-1\"",
+        "-DCR_CLANG_REVISION=\"llvmorg-14-init-3191-g0e03450a-1\"",
         "-DCR_LIBCXX_REVISION=79a2e924d96e2fc1e4b937c42efd08898fa472d7",
         "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
         "-DHAVE_SYS_UIO_H",
@@ -4101,10 +3985,7 @@
         "-Wno-builtin-assume-aligned-alignment",
         "-Wno-builtin-macro-redefined",
         "-Wno-c++11-narrowing",
-        "-Wno-deprecated-copy",
-        "-Wno-final-dtor-non-final-class",
         "-Wno-ignored-pragma-optimize",
-        "-Wno-implicit-fallthrough",
         "-Wno-misleading-indentation",
         "-Wno-missing-field-initializers",
         "-Wno-psabi",
@@ -4145,7 +4026,7 @@
         "-DABSL_ALLOCATOR_NOTHROW=1",
         "-DANDROID",
         "-DANDROID_NDK_VERSION_ROLL=r22_1",
-        "-DCR_CLANG_REVISION=\"llvmorg-13-init-15163-g98033fdc-1\"",
+        "-DCR_CLANG_REVISION=\"llvmorg-14-init-3191-g0e03450a-1\"",
         "-DCR_LIBCXX_REVISION=79a2e924d96e2fc1e4b937c42efd08898fa472d7",
         "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
         "-DHAVE_SYS_UIO_H",
@@ -4159,10 +4040,7 @@
         "-Wno-builtin-assume-aligned-alignment",
         "-Wno-builtin-macro-redefined",
         "-Wno-c++11-narrowing",
-        "-Wno-deprecated-copy",
-        "-Wno-final-dtor-non-final-class",
         "-Wno-ignored-pragma-optimize",
-        "-Wno-implicit-fallthrough",
         "-Wno-misleading-indentation",
         "-Wno-missing-field-initializers",
         "-Wno-psabi",
@@ -4206,7 +4084,7 @@
         "-DABSL_ALLOCATOR_NOTHROW=1",
         "-DANDROID",
         "-DANDROID_NDK_VERSION_ROLL=r22_1",
-        "-DCR_CLANG_REVISION=\"llvmorg-13-init-15163-g98033fdc-1\"",
+        "-DCR_CLANG_REVISION=\"llvmorg-14-init-3191-g0e03450a-1\"",
         "-DCR_LIBCXX_REVISION=79a2e924d96e2fc1e4b937c42efd08898fa472d7",
         "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
         "-DHAVE_SYS_UIO_H",
@@ -4220,10 +4098,7 @@
         "-Wno-builtin-assume-aligned-alignment",
         "-Wno-builtin-macro-redefined",
         "-Wno-c++11-narrowing",
-        "-Wno-deprecated-copy",
-        "-Wno-final-dtor-non-final-class",
         "-Wno-ignored-pragma-optimize",
-        "-Wno-implicit-fallthrough",
         "-Wno-misleading-indentation",
         "-Wno-missing-field-initializers",
         "-Wno-psabi",
@@ -4268,7 +4143,7 @@
         "-DABSL_ALLOCATOR_NOTHROW=1",
         "-DANDROID",
         "-DANDROID_NDK_VERSION_ROLL=r22_1",
-        "-DCR_CLANG_REVISION=\"llvmorg-13-init-15163-g98033fdc-1\"",
+        "-DCR_CLANG_REVISION=\"llvmorg-14-init-3191-g0e03450a-1\"",
         "-DCR_LIBCXX_REVISION=79a2e924d96e2fc1e4b937c42efd08898fa472d7",
         "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
         "-DHAVE_SYS_UIO_H",
@@ -4282,10 +4157,7 @@
         "-Wno-builtin-assume-aligned-alignment",
         "-Wno-builtin-macro-redefined",
         "-Wno-c++11-narrowing",
-        "-Wno-deprecated-copy",
-        "-Wno-final-dtor-non-final-class",
         "-Wno-ignored-pragma-optimize",
-        "-Wno-implicit-fallthrough",
         "-Wno-misleading-indentation",
         "-Wno-missing-field-initializers",
         "-Wno-psabi",
@@ -4323,7 +4195,7 @@
         "-DABSL_ALLOCATOR_NOTHROW=1",
         "-DANDROID",
         "-DANDROID_NDK_VERSION_ROLL=r22_1",
-        "-DCR_CLANG_REVISION=\"llvmorg-13-init-15163-g98033fdc-1\"",
+        "-DCR_CLANG_REVISION=\"llvmorg-14-init-3191-g0e03450a-1\"",
         "-DCR_LIBCXX_REVISION=79a2e924d96e2fc1e4b937c42efd08898fa472d7",
         "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
         "-DHAVE_SYS_UIO_H",
@@ -4337,10 +4209,7 @@
         "-Wno-builtin-assume-aligned-alignment",
         "-Wno-builtin-macro-redefined",
         "-Wno-c++11-narrowing",
-        "-Wno-deprecated-copy",
-        "-Wno-final-dtor-non-final-class",
         "-Wno-ignored-pragma-optimize",
-        "-Wno-implicit-fallthrough",
         "-Wno-misleading-indentation",
         "-Wno-missing-field-initializers",
         "-Wno-psabi",
@@ -4377,7 +4246,7 @@
         "-DABSL_ALLOCATOR_NOTHROW=1",
         "-DANDROID",
         "-DANDROID_NDK_VERSION_ROLL=r22_1",
-        "-DCR_CLANG_REVISION=\"llvmorg-13-init-15163-g98033fdc-1\"",
+        "-DCR_CLANG_REVISION=\"llvmorg-14-init-3191-g0e03450a-1\"",
         "-DCR_LIBCXX_REVISION=79a2e924d96e2fc1e4b937c42efd08898fa472d7",
         "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
         "-DHAVE_SYS_UIO_H",
@@ -4391,10 +4260,7 @@
         "-Wno-builtin-assume-aligned-alignment",
         "-Wno-builtin-macro-redefined",
         "-Wno-c++11-narrowing",
-        "-Wno-deprecated-copy",
-        "-Wno-final-dtor-non-final-class",
         "-Wno-ignored-pragma-optimize",
-        "-Wno-implicit-fallthrough",
         "-Wno-misleading-indentation",
         "-Wno-missing-field-initializers",
         "-Wno-psabi",
@@ -4430,7 +4296,7 @@
         "-DABSL_ALLOCATOR_NOTHROW=1",
         "-DANDROID",
         "-DANDROID_NDK_VERSION_ROLL=r22_1",
-        "-DCR_CLANG_REVISION=\"llvmorg-13-init-15163-g98033fdc-1\"",
+        "-DCR_CLANG_REVISION=\"llvmorg-14-init-3191-g0e03450a-1\"",
         "-DCR_LIBCXX_REVISION=79a2e924d96e2fc1e4b937c42efd08898fa472d7",
         "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
         "-DHAVE_SYS_UIO_H",
@@ -4444,10 +4310,7 @@
         "-Wno-builtin-assume-aligned-alignment",
         "-Wno-builtin-macro-redefined",
         "-Wno-c++11-narrowing",
-        "-Wno-deprecated-copy",
-        "-Wno-final-dtor-non-final-class",
         "-Wno-ignored-pragma-optimize",
-        "-Wno-implicit-fallthrough",
         "-Wno-misleading-indentation",
         "-Wno-missing-field-initializers",
         "-Wno-psabi",
@@ -4492,7 +4355,7 @@
         "-DABSL_ALLOCATOR_NOTHROW=1",
         "-DANDROID",
         "-DANDROID_NDK_VERSION_ROLL=r22_1",
-        "-DCR_CLANG_REVISION=\"llvmorg-13-init-15163-g98033fdc-1\"",
+        "-DCR_CLANG_REVISION=\"llvmorg-14-init-3191-g0e03450a-1\"",
         "-DCR_LIBCXX_REVISION=79a2e924d96e2fc1e4b937c42efd08898fa472d7",
         "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
         "-DHAVE_SYS_UIO_H",
@@ -4506,10 +4369,7 @@
         "-Wno-builtin-assume-aligned-alignment",
         "-Wno-builtin-macro-redefined",
         "-Wno-c++11-narrowing",
-        "-Wno-deprecated-copy",
-        "-Wno-final-dtor-non-final-class",
         "-Wno-ignored-pragma-optimize",
-        "-Wno-implicit-fallthrough",
         "-Wno-misleading-indentation",
         "-Wno-missing-field-initializers",
         "-Wno-psabi",
@@ -4543,7 +4403,7 @@
         "-DABSL_ALLOCATOR_NOTHROW=1",
         "-DANDROID",
         "-DANDROID_NDK_VERSION_ROLL=r22_1",
-        "-DCR_CLANG_REVISION=\"llvmorg-13-init-15163-g98033fdc-1\"",
+        "-DCR_CLANG_REVISION=\"llvmorg-14-init-3191-g0e03450a-1\"",
         "-DCR_LIBCXX_REVISION=79a2e924d96e2fc1e4b937c42efd08898fa472d7",
         "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
         "-DHAVE_SYS_UIO_H",
@@ -4557,10 +4417,7 @@
         "-Wno-builtin-assume-aligned-alignment",
         "-Wno-builtin-macro-redefined",
         "-Wno-c++11-narrowing",
-        "-Wno-deprecated-copy",
-        "-Wno-final-dtor-non-final-class",
         "-Wno-ignored-pragma-optimize",
-        "-Wno-implicit-fallthrough",
         "-Wno-misleading-indentation",
         "-Wno-missing-field-initializers",
         "-Wno-psabi",
@@ -4593,7 +4450,7 @@
         "-DABSL_ALLOCATOR_NOTHROW=1",
         "-DANDROID",
         "-DANDROID_NDK_VERSION_ROLL=r22_1",
-        "-DCR_CLANG_REVISION=\"llvmorg-13-init-15163-g98033fdc-1\"",
+        "-DCR_CLANG_REVISION=\"llvmorg-14-init-3191-g0e03450a-1\"",
         "-DCR_LIBCXX_REVISION=79a2e924d96e2fc1e4b937c42efd08898fa472d7",
         "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
         "-DHAVE_SYS_UIO_H",
@@ -4607,10 +4464,7 @@
         "-Wno-builtin-assume-aligned-alignment",
         "-Wno-builtin-macro-redefined",
         "-Wno-c++11-narrowing",
-        "-Wno-deprecated-copy",
-        "-Wno-final-dtor-non-final-class",
         "-Wno-ignored-pragma-optimize",
-        "-Wno-implicit-fallthrough",
         "-Wno-misleading-indentation",
         "-Wno-missing-field-initializers",
         "-Wno-psabi",
@@ -4642,6 +4496,9 @@
     ],
     srcs: [
         "third_party/abseil-cpp/absl/strings/internal/cord_internal.cc",
+        "third_party/abseil-cpp/absl/strings/internal/cord_rep_btree.cc",
+        "third_party/abseil-cpp/absl/strings/internal/cord_rep_btree_navigator.cc",
+        "third_party/abseil-cpp/absl/strings/internal/cord_rep_btree_reader.cc",
         "third_party/abseil-cpp/absl/strings/internal/cord_rep_consume.cc",
         "third_party/abseil-cpp/absl/strings/internal/cord_rep_ring.cc",
     ],
@@ -4650,7 +4507,7 @@
         "-DABSL_ALLOCATOR_NOTHROW=1",
         "-DANDROID",
         "-DANDROID_NDK_VERSION_ROLL=r22_1",
-        "-DCR_CLANG_REVISION=\"llvmorg-13-init-15163-g98033fdc-1\"",
+        "-DCR_CLANG_REVISION=\"llvmorg-14-init-3191-g0e03450a-1\"",
         "-DCR_LIBCXX_REVISION=79a2e924d96e2fc1e4b937c42efd08898fa472d7",
         "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
         "-DHAVE_SYS_UIO_H",
@@ -4664,10 +4521,7 @@
         "-Wno-builtin-assume-aligned-alignment",
         "-Wno-builtin-macro-redefined",
         "-Wno-c++11-narrowing",
-        "-Wno-deprecated-copy",
-        "-Wno-final-dtor-non-final-class",
         "-Wno-ignored-pragma-optimize",
-        "-Wno-implicit-fallthrough",
         "-Wno-misleading-indentation",
         "-Wno-missing-field-initializers",
         "-Wno-psabi",
@@ -4694,6 +4548,7 @@
         "third_party_abseil_cpp_absl_functional_function_ref",
         "third_party_abseil_cpp_absl_meta_type_traits",
         "third_party_abseil_cpp_absl_strings_strings",
+        "third_party_abseil_cpp_absl_types_span",
     ],
 }
 cc_defaults {
@@ -4708,7 +4563,7 @@
         "-DABSL_ALLOCATOR_NOTHROW=1",
         "-DANDROID",
         "-DANDROID_NDK_VERSION_ROLL=r22_1",
-        "-DCR_CLANG_REVISION=\"llvmorg-13-init-15163-g98033fdc-1\"",
+        "-DCR_CLANG_REVISION=\"llvmorg-14-init-3191-g0e03450a-1\"",
         "-DCR_LIBCXX_REVISION=79a2e924d96e2fc1e4b937c42efd08898fa472d7",
         "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
         "-DHAVE_SYS_UIO_H",
@@ -4722,10 +4577,7 @@
         "-Wno-builtin-assume-aligned-alignment",
         "-Wno-builtin-macro-redefined",
         "-Wno-c++11-narrowing",
-        "-Wno-deprecated-copy",
-        "-Wno-final-dtor-non-final-class",
         "-Wno-ignored-pragma-optimize",
-        "-Wno-implicit-fallthrough",
         "-Wno-misleading-indentation",
         "-Wno-missing-field-initializers",
         "-Wno-psabi",
@@ -4741,6 +4593,7 @@
     ],
     defaults: [
         "third_party_abseil_cpp_absl_base_base_internal",
+        "third_party_abseil_cpp_absl_base_core_headers",
         "third_party_abseil_cpp_absl_meta_type_traits",
     ],
 }
@@ -4756,7 +4609,7 @@
         "-DABSL_ALLOCATOR_NOTHROW=1",
         "-DANDROID",
         "-DANDROID_NDK_VERSION_ROLL=r22_1",
-        "-DCR_CLANG_REVISION=\"llvmorg-13-init-15163-g98033fdc-1\"",
+        "-DCR_CLANG_REVISION=\"llvmorg-14-init-3191-g0e03450a-1\"",
         "-DCR_LIBCXX_REVISION=79a2e924d96e2fc1e4b937c42efd08898fa472d7",
         "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
         "-DHAVE_SYS_UIO_H",
@@ -4770,10 +4623,7 @@
         "-Wno-builtin-assume-aligned-alignment",
         "-Wno-builtin-macro-redefined",
         "-Wno-c++11-narrowing",
-        "-Wno-deprecated-copy",
-        "-Wno-final-dtor-non-final-class",
         "-Wno-ignored-pragma-optimize",
-        "-Wno-implicit-fallthrough",
         "-Wno-misleading-indentation",
         "-Wno-missing-field-initializers",
         "-Wno-psabi",
@@ -4806,7 +4656,7 @@
         "-DABSL_ALLOCATOR_NOTHROW=1",
         "-DANDROID",
         "-DANDROID_NDK_VERSION_ROLL=r22_1",
-        "-DCR_CLANG_REVISION=\"llvmorg-13-init-15163-g98033fdc-1\"",
+        "-DCR_CLANG_REVISION=\"llvmorg-14-init-3191-g0e03450a-1\"",
         "-DCR_LIBCXX_REVISION=79a2e924d96e2fc1e4b937c42efd08898fa472d7",
         "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
         "-DHAVE_SYS_UIO_H",
@@ -4820,10 +4670,7 @@
         "-Wno-builtin-assume-aligned-alignment",
         "-Wno-builtin-macro-redefined",
         "-Wno-c++11-narrowing",
-        "-Wno-deprecated-copy",
-        "-Wno-final-dtor-non-final-class",
         "-Wno-ignored-pragma-optimize",
-        "-Wno-implicit-fallthrough",
         "-Wno-misleading-indentation",
         "-Wno-missing-field-initializers",
         "-Wno-psabi",
@@ -4857,7 +4704,7 @@
         "-DABSL_ALLOCATOR_NOTHROW=1",
         "-DANDROID",
         "-DANDROID_NDK_VERSION_ROLL=r22_1",
-        "-DCR_CLANG_REVISION=\"llvmorg-13-init-15163-g98033fdc-1\"",
+        "-DCR_CLANG_REVISION=\"llvmorg-14-init-3191-g0e03450a-1\"",
         "-DCR_LIBCXX_REVISION=79a2e924d96e2fc1e4b937c42efd08898fa472d7",
         "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
         "-DHAVE_SYS_UIO_H",
@@ -4871,10 +4718,7 @@
         "-Wno-builtin-assume-aligned-alignment",
         "-Wno-builtin-macro-redefined",
         "-Wno-c++11-narrowing",
-        "-Wno-deprecated-copy",
-        "-Wno-final-dtor-non-final-class",
         "-Wno-ignored-pragma-optimize",
-        "-Wno-implicit-fallthrough",
         "-Wno-misleading-indentation",
         "-Wno-missing-field-initializers",
         "-Wno-psabi",
@@ -4911,7 +4755,7 @@
         "-DABSL_ALLOCATOR_NOTHROW=1",
         "-DANDROID",
         "-DANDROID_NDK_VERSION_ROLL=r22_1",
-        "-DCR_CLANG_REVISION=\"llvmorg-13-init-15163-g98033fdc-1\"",
+        "-DCR_CLANG_REVISION=\"llvmorg-14-init-3191-g0e03450a-1\"",
         "-DCR_LIBCXX_REVISION=79a2e924d96e2fc1e4b937c42efd08898fa472d7",
         "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
         "-DHAVE_SYS_UIO_H",
@@ -4925,10 +4769,7 @@
         "-Wno-builtin-assume-aligned-alignment",
         "-Wno-builtin-macro-redefined",
         "-Wno-c++11-narrowing",
-        "-Wno-deprecated-copy",
-        "-Wno-final-dtor-non-final-class",
         "-Wno-ignored-pragma-optimize",
-        "-Wno-implicit-fallthrough",
         "-Wno-misleading-indentation",
         "-Wno-missing-field-initializers",
         "-Wno-psabi",
@@ -4979,7 +4820,7 @@
         "-DABSL_ALLOCATOR_NOTHROW=1",
         "-DANDROID",
         "-DANDROID_NDK_VERSION_ROLL=r22_1",
-        "-DCR_CLANG_REVISION=\"llvmorg-13-init-15163-g98033fdc-1\"",
+        "-DCR_CLANG_REVISION=\"llvmorg-14-init-3191-g0e03450a-1\"",
         "-DCR_LIBCXX_REVISION=79a2e924d96e2fc1e4b937c42efd08898fa472d7",
         "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
         "-DHAVE_SYS_UIO_H",
@@ -4993,10 +4834,7 @@
         "-Wno-builtin-assume-aligned-alignment",
         "-Wno-builtin-macro-redefined",
         "-Wno-c++11-narrowing",
-        "-Wno-deprecated-copy",
-        "-Wno-final-dtor-non-final-class",
         "-Wno-ignored-pragma-optimize",
-        "-Wno-implicit-fallthrough",
         "-Wno-misleading-indentation",
         "-Wno-missing-field-initializers",
         "-Wno-psabi",
@@ -5027,7 +4865,7 @@
         "-DABSL_ALLOCATOR_NOTHROW=1",
         "-DANDROID",
         "-DANDROID_NDK_VERSION_ROLL=r22_1",
-        "-DCR_CLANG_REVISION=\"llvmorg-13-init-15163-g98033fdc-1\"",
+        "-DCR_CLANG_REVISION=\"llvmorg-14-init-3191-g0e03450a-1\"",
         "-DCR_LIBCXX_REVISION=79a2e924d96e2fc1e4b937c42efd08898fa472d7",
         "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
         "-DHAVE_SYS_UIO_H",
@@ -5041,10 +4879,7 @@
         "-Wno-builtin-assume-aligned-alignment",
         "-Wno-builtin-macro-redefined",
         "-Wno-c++11-narrowing",
-        "-Wno-deprecated-copy",
-        "-Wno-final-dtor-non-final-class",
         "-Wno-ignored-pragma-optimize",
-        "-Wno-implicit-fallthrough",
         "-Wno-misleading-indentation",
         "-Wno-missing-field-initializers",
         "-Wno-psabi",
@@ -5082,7 +4917,7 @@
         "-DABSL_ALLOCATOR_NOTHROW=1",
         "-DANDROID",
         "-DANDROID_NDK_VERSION_ROLL=r22_1",
-        "-DCR_CLANG_REVISION=\"llvmorg-13-init-15163-g98033fdc-1\"",
+        "-DCR_CLANG_REVISION=\"llvmorg-14-init-3191-g0e03450a-1\"",
         "-DCR_LIBCXX_REVISION=79a2e924d96e2fc1e4b937c42efd08898fa472d7",
         "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
         "-DHAVE_SYS_UIO_H",
@@ -5096,10 +4931,7 @@
         "-Wno-builtin-assume-aligned-alignment",
         "-Wno-builtin-macro-redefined",
         "-Wno-c++11-narrowing",
-        "-Wno-deprecated-copy",
-        "-Wno-final-dtor-non-final-class",
         "-Wno-ignored-pragma-optimize",
-        "-Wno-implicit-fallthrough",
         "-Wno-misleading-indentation",
         "-Wno-missing-field-initializers",
         "-Wno-psabi",
@@ -5130,7 +4962,7 @@
         "-DABSL_ALLOCATOR_NOTHROW=1",
         "-DANDROID",
         "-DANDROID_NDK_VERSION_ROLL=r22_1",
-        "-DCR_CLANG_REVISION=\"llvmorg-13-init-15163-g98033fdc-1\"",
+        "-DCR_CLANG_REVISION=\"llvmorg-14-init-3191-g0e03450a-1\"",
         "-DCR_LIBCXX_REVISION=79a2e924d96e2fc1e4b937c42efd08898fa472d7",
         "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
         "-DHAVE_SYS_UIO_H",
@@ -5144,10 +4976,7 @@
         "-Wno-builtin-assume-aligned-alignment",
         "-Wno-builtin-macro-redefined",
         "-Wno-c++11-narrowing",
-        "-Wno-deprecated-copy",
-        "-Wno-final-dtor-non-final-class",
         "-Wno-ignored-pragma-optimize",
-        "-Wno-implicit-fallthrough",
         "-Wno-misleading-indentation",
         "-Wno-missing-field-initializers",
         "-Wno-psabi",
@@ -5188,7 +5017,7 @@
         "-DABSL_ALLOCATOR_NOTHROW=1",
         "-DANDROID",
         "-DANDROID_NDK_VERSION_ROLL=r22_1",
-        "-DCR_CLANG_REVISION=\"llvmorg-13-init-15163-g98033fdc-1\"",
+        "-DCR_CLANG_REVISION=\"llvmorg-14-init-3191-g0e03450a-1\"",
         "-DCR_LIBCXX_REVISION=79a2e924d96e2fc1e4b937c42efd08898fa472d7",
         "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
         "-DHAVE_SYS_UIO_H",
@@ -5202,10 +5031,7 @@
         "-Wno-builtin-assume-aligned-alignment",
         "-Wno-builtin-macro-redefined",
         "-Wno-c++11-narrowing",
-        "-Wno-deprecated-copy",
-        "-Wno-final-dtor-non-final-class",
         "-Wno-ignored-pragma-optimize",
-        "-Wno-implicit-fallthrough",
         "-Wno-misleading-indentation",
         "-Wno-missing-field-initializers",
         "-Wno-psabi",
@@ -5254,7 +5080,7 @@
         "-DABSL_ALLOCATOR_NOTHROW=1",
         "-DANDROID",
         "-DANDROID_NDK_VERSION_ROLL=r22_1",
-        "-DCR_CLANG_REVISION=\"llvmorg-13-init-15163-g98033fdc-1\"",
+        "-DCR_CLANG_REVISION=\"llvmorg-14-init-3191-g0e03450a-1\"",
         "-DCR_LIBCXX_REVISION=79a2e924d96e2fc1e4b937c42efd08898fa472d7",
         "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
         "-DHAVE_SYS_UIO_H",
@@ -5268,10 +5094,7 @@
         "-Wno-builtin-assume-aligned-alignment",
         "-Wno-builtin-macro-redefined",
         "-Wno-c++11-narrowing",
-        "-Wno-deprecated-copy",
-        "-Wno-final-dtor-non-final-class",
         "-Wno-ignored-pragma-optimize",
-        "-Wno-implicit-fallthrough",
         "-Wno-misleading-indentation",
         "-Wno-missing-field-initializers",
         "-Wno-psabi",
@@ -5300,54 +5123,6 @@
     ],
 }
 cc_defaults {
-    name: "third_party_abseil_cpp_absl_numeric_bits",
-    stl: "libc++_static",
-    local_include_dirs: [
-        "",
-        "third_party/abseil-cpp/",
-    ],
-    sdk_version: "28",
-    cflags: [
-        "-DABSL_ALLOCATOR_NOTHROW=1",
-        "-DANDROID",
-        "-DANDROID_NDK_VERSION_ROLL=r22_1",
-        "-DCR_CLANG_REVISION=\"llvmorg-13-init-15163-g98033fdc-1\"",
-        "-DCR_LIBCXX_REVISION=79a2e924d96e2fc1e4b937c42efd08898fa472d7",
-        "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
-        "-DHAVE_SYS_UIO_H",
-        "-DNDEBUG",
-        "-DNVALGRIND",
-        "-D_GNU_SOURCE",
-        "-D_LIBCPP_DISABLE_VISIBILITY_ANNOTATIONS",
-        "-D_LIBCPP_ENABLE_NODISCARD",
-        "-D_LIBCXXABI_DISABLE_VISIBILITY_ANNOTATIONS",
-        "-Oz",
-        "-Wno-builtin-assume-aligned-alignment",
-        "-Wno-builtin-macro-redefined",
-        "-Wno-c++11-narrowing",
-        "-Wno-deprecated-copy",
-        "-Wno-final-dtor-non-final-class",
-        "-Wno-ignored-pragma-optimize",
-        "-Wno-implicit-fallthrough",
-        "-Wno-misleading-indentation",
-        "-Wno-missing-field-initializers",
-        "-Wno-psabi",
-        "-Wno-sign-conversion",
-        "-Wno-trigraphs",
-        "-Wno-unknown-warning-option",
-        "-Wno-unneeded-internal-declaration",
-        "-Wno-unused-but-set-parameter",
-        "-Wno-unused-but-set-variable",
-        "-Wno-unused-parameter",
-        "-Wno-unused-variable",
-        "-fno-unwind-tables",
-    ],
-    defaults: [
-        "third_party_abseil_cpp_absl_base_config",
-        "third_party_abseil_cpp_absl_base_core_headers",
-    ],
-}
-cc_defaults {
     name: "third_party_abseil_cpp_absl_numeric_int128",
     stl: "libc++_static",
     local_include_dirs: [
@@ -5362,7 +5137,7 @@
         "-DABSL_ALLOCATOR_NOTHROW=1",
         "-DANDROID",
         "-DANDROID_NDK_VERSION_ROLL=r22_1",
-        "-DCR_CLANG_REVISION=\"llvmorg-13-init-15163-g98033fdc-1\"",
+        "-DCR_CLANG_REVISION=\"llvmorg-14-init-3191-g0e03450a-1\"",
         "-DCR_LIBCXX_REVISION=79a2e924d96e2fc1e4b937c42efd08898fa472d7",
         "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
         "-DHAVE_SYS_UIO_H",
@@ -5376,10 +5151,7 @@
         "-Wno-builtin-assume-aligned-alignment",
         "-Wno-builtin-macro-redefined",
         "-Wno-c++11-narrowing",
-        "-Wno-deprecated-copy",
-        "-Wno-final-dtor-non-final-class",
         "-Wno-ignored-pragma-optimize",
-        "-Wno-implicit-fallthrough",
         "-Wno-misleading-indentation",
         "-Wno-missing-field-initializers",
         "-Wno-psabi",
@@ -5400,21 +5172,18 @@
     ],
 }
 cc_defaults {
-    name: "third_party_abseil_cpp_absl_hash_wyhash",
+    name: "third_party_abseil_cpp_absl_numeric_bits",
     stl: "libc++_static",
     local_include_dirs: [
         "",
         "third_party/abseil-cpp/",
     ],
-    srcs: [
-        "third_party/abseil-cpp/absl/hash/internal/wyhash.cc",
-    ],
     sdk_version: "28",
     cflags: [
         "-DABSL_ALLOCATOR_NOTHROW=1",
         "-DANDROID",
         "-DANDROID_NDK_VERSION_ROLL=r22_1",
-        "-DCR_CLANG_REVISION=\"llvmorg-13-init-15163-g98033fdc-1\"",
+        "-DCR_CLANG_REVISION=\"llvmorg-14-init-3191-g0e03450a-1\"",
         "-DCR_LIBCXX_REVISION=79a2e924d96e2fc1e4b937c42efd08898fa472d7",
         "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
         "-DHAVE_SYS_UIO_H",
@@ -5428,10 +5197,55 @@
         "-Wno-builtin-assume-aligned-alignment",
         "-Wno-builtin-macro-redefined",
         "-Wno-c++11-narrowing",
-        "-Wno-deprecated-copy",
-        "-Wno-final-dtor-non-final-class",
         "-Wno-ignored-pragma-optimize",
-        "-Wno-implicit-fallthrough",
+        "-Wno-misleading-indentation",
+        "-Wno-missing-field-initializers",
+        "-Wno-psabi",
+        "-Wno-sign-conversion",
+        "-Wno-trigraphs",
+        "-Wno-unknown-warning-option",
+        "-Wno-unneeded-internal-declaration",
+        "-Wno-unused-but-set-parameter",
+        "-Wno-unused-but-set-variable",
+        "-Wno-unused-parameter",
+        "-Wno-unused-variable",
+        "-fno-unwind-tables",
+    ],
+    defaults: [
+        "third_party_abseil_cpp_absl_base_config",
+        "third_party_abseil_cpp_absl_base_core_headers",
+    ],
+}
+cc_defaults {
+    name: "third_party_abseil_cpp_absl_hash_low_level_hash",
+    stl: "libc++_static",
+    local_include_dirs: [
+        "",
+        "third_party/abseil-cpp/",
+    ],
+    srcs: [
+        "third_party/abseil-cpp/absl/hash/internal/low_level_hash.cc",
+    ],
+    sdk_version: "28",
+    cflags: [
+        "-DABSL_ALLOCATOR_NOTHROW=1",
+        "-DANDROID",
+        "-DANDROID_NDK_VERSION_ROLL=r22_1",
+        "-DCR_CLANG_REVISION=\"llvmorg-14-init-3191-g0e03450a-1\"",
+        "-DCR_LIBCXX_REVISION=79a2e924d96e2fc1e4b937c42efd08898fa472d7",
+        "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
+        "-DHAVE_SYS_UIO_H",
+        "-DNDEBUG",
+        "-DNVALGRIND",
+        "-D_GNU_SOURCE",
+        "-D_LIBCPP_DISABLE_VISIBILITY_ANNOTATIONS",
+        "-D_LIBCPP_ENABLE_NODISCARD",
+        "-D_LIBCXXABI_DISABLE_VISIBILITY_ANNOTATIONS",
+        "-Oz",
+        "-Wno-builtin-assume-aligned-alignment",
+        "-Wno-builtin-macro-redefined",
+        "-Wno-c++11-narrowing",
+        "-Wno-ignored-pragma-optimize",
         "-Wno-misleading-indentation",
         "-Wno-missing-field-initializers",
         "-Wno-psabi",
@@ -5448,6 +5262,7 @@
     defaults: [
         "third_party_abseil_cpp_absl_base_config",
         "third_party_abseil_cpp_absl_base_endian",
+        "third_party_abseil_cpp_absl_numeric_bits",
         "third_party_abseil_cpp_absl_numeric_int128",
     ],
 }
@@ -5466,7 +5281,7 @@
         "-DABSL_ALLOCATOR_NOTHROW=1",
         "-DANDROID",
         "-DANDROID_NDK_VERSION_ROLL=r22_1",
-        "-DCR_CLANG_REVISION=\"llvmorg-13-init-15163-g98033fdc-1\"",
+        "-DCR_CLANG_REVISION=\"llvmorg-14-init-3191-g0e03450a-1\"",
         "-DCR_LIBCXX_REVISION=79a2e924d96e2fc1e4b937c42efd08898fa472d7",
         "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
         "-DHAVE_SYS_UIO_H",
@@ -5480,10 +5295,7 @@
         "-Wno-builtin-assume-aligned-alignment",
         "-Wno-builtin-macro-redefined",
         "-Wno-c++11-narrowing",
-        "-Wno-deprecated-copy",
-        "-Wno-final-dtor-non-final-class",
         "-Wno-ignored-pragma-optimize",
-        "-Wno-implicit-fallthrough",
         "-Wno-misleading-indentation",
         "-Wno-missing-field-initializers",
         "-Wno-psabi",
@@ -5515,7 +5327,7 @@
         "-DABSL_ALLOCATOR_NOTHROW=1",
         "-DANDROID",
         "-DANDROID_NDK_VERSION_ROLL=r22_1",
-        "-DCR_CLANG_REVISION=\"llvmorg-13-init-15163-g98033fdc-1\"",
+        "-DCR_CLANG_REVISION=\"llvmorg-14-init-3191-g0e03450a-1\"",
         "-DCR_LIBCXX_REVISION=79a2e924d96e2fc1e4b937c42efd08898fa472d7",
         "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
         "-DHAVE_SYS_UIO_H",
@@ -5529,10 +5341,7 @@
         "-Wno-builtin-assume-aligned-alignment",
         "-Wno-builtin-macro-redefined",
         "-Wno-c++11-narrowing",
-        "-Wno-deprecated-copy",
-        "-Wno-final-dtor-non-final-class",
         "-Wno-ignored-pragma-optimize",
-        "-Wno-implicit-fallthrough",
         "-Wno-misleading-indentation",
         "-Wno-missing-field-initializers",
         "-Wno-psabi",
@@ -5565,7 +5374,7 @@
         "-DABSL_ALLOCATOR_NOTHROW=1",
         "-DANDROID",
         "-DANDROID_NDK_VERSION_ROLL=r22_1",
-        "-DCR_CLANG_REVISION=\"llvmorg-13-init-15163-g98033fdc-1\"",
+        "-DCR_CLANG_REVISION=\"llvmorg-14-init-3191-g0e03450a-1\"",
         "-DCR_LIBCXX_REVISION=79a2e924d96e2fc1e4b937c42efd08898fa472d7",
         "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
         "-DHAVE_SYS_UIO_H",
@@ -5579,10 +5388,7 @@
         "-Wno-builtin-assume-aligned-alignment",
         "-Wno-builtin-macro-redefined",
         "-Wno-c++11-narrowing",
-        "-Wno-deprecated-copy",
-        "-Wno-final-dtor-non-final-class",
         "-Wno-ignored-pragma-optimize",
-        "-Wno-implicit-fallthrough",
         "-Wno-misleading-indentation",
         "-Wno-missing-field-initializers",
         "-Wno-psabi",
@@ -5613,7 +5419,7 @@
         "-DABSL_ALLOCATOR_NOTHROW=1",
         "-DANDROID",
         "-DANDROID_NDK_VERSION_ROLL=r22_1",
-        "-DCR_CLANG_REVISION=\"llvmorg-13-init-15163-g98033fdc-1\"",
+        "-DCR_CLANG_REVISION=\"llvmorg-14-init-3191-g0e03450a-1\"",
         "-DCR_LIBCXX_REVISION=79a2e924d96e2fc1e4b937c42efd08898fa472d7",
         "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
         "-DHAVE_SYS_UIO_H",
@@ -5627,10 +5433,7 @@
         "-Wno-builtin-assume-aligned-alignment",
         "-Wno-builtin-macro-redefined",
         "-Wno-c++11-narrowing",
-        "-Wno-deprecated-copy",
-        "-Wno-final-dtor-non-final-class",
         "-Wno-ignored-pragma-optimize",
-        "-Wno-implicit-fallthrough",
         "-Wno-misleading-indentation",
         "-Wno-missing-field-initializers",
         "-Wno-psabi",
@@ -5666,7 +5469,7 @@
         "-DABSL_ALLOCATOR_NOTHROW=1",
         "-DANDROID",
         "-DANDROID_NDK_VERSION_ROLL=r22_1",
-        "-DCR_CLANG_REVISION=\"llvmorg-13-init-15163-g98033fdc-1\"",
+        "-DCR_CLANG_REVISION=\"llvmorg-14-init-3191-g0e03450a-1\"",
         "-DCR_LIBCXX_REVISION=79a2e924d96e2fc1e4b937c42efd08898fa472d7",
         "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
         "-DHAVE_SYS_UIO_H",
@@ -5680,10 +5483,7 @@
         "-Wno-builtin-assume-aligned-alignment",
         "-Wno-builtin-macro-redefined",
         "-Wno-c++11-narrowing",
-        "-Wno-deprecated-copy",
-        "-Wno-final-dtor-non-final-class",
         "-Wno-ignored-pragma-optimize",
-        "-Wno-implicit-fallthrough",
         "-Wno-misleading-indentation",
         "-Wno-missing-field-initializers",
         "-Wno-psabi",
@@ -5716,7 +5516,7 @@
         "-DABSL_ALLOCATOR_NOTHROW=1",
         "-DANDROID",
         "-DANDROID_NDK_VERSION_ROLL=r22_1",
-        "-DCR_CLANG_REVISION=\"llvmorg-13-init-15163-g98033fdc-1\"",
+        "-DCR_CLANG_REVISION=\"llvmorg-14-init-3191-g0e03450a-1\"",
         "-DCR_LIBCXX_REVISION=79a2e924d96e2fc1e4b937c42efd08898fa472d7",
         "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
         "-DHAVE_SYS_UIO_H",
@@ -5730,10 +5530,7 @@
         "-Wno-builtin-assume-aligned-alignment",
         "-Wno-builtin-macro-redefined",
         "-Wno-c++11-narrowing",
-        "-Wno-deprecated-copy",
-        "-Wno-final-dtor-non-final-class",
         "-Wno-ignored-pragma-optimize",
-        "-Wno-implicit-fallthrough",
         "-Wno-misleading-indentation",
         "-Wno-missing-field-initializers",
         "-Wno-psabi",
@@ -5768,7 +5565,7 @@
         "-DABSL_ALLOCATOR_NOTHROW=1",
         "-DANDROID",
         "-DANDROID_NDK_VERSION_ROLL=r22_1",
-        "-DCR_CLANG_REVISION=\"llvmorg-13-init-15163-g98033fdc-1\"",
+        "-DCR_CLANG_REVISION=\"llvmorg-14-init-3191-g0e03450a-1\"",
         "-DCR_LIBCXX_REVISION=79a2e924d96e2fc1e4b937c42efd08898fa472d7",
         "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
         "-DHAVE_SYS_UIO_H",
@@ -5782,10 +5579,7 @@
         "-Wno-builtin-assume-aligned-alignment",
         "-Wno-builtin-macro-redefined",
         "-Wno-c++11-narrowing",
-        "-Wno-deprecated-copy",
-        "-Wno-final-dtor-non-final-class",
         "-Wno-ignored-pragma-optimize",
-        "-Wno-implicit-fallthrough",
         "-Wno-misleading-indentation",
         "-Wno-missing-field-initializers",
         "-Wno-psabi",
@@ -5821,7 +5615,7 @@
         "-DABSL_ALLOCATOR_NOTHROW=1",
         "-DANDROID",
         "-DANDROID_NDK_VERSION_ROLL=r22_1",
-        "-DCR_CLANG_REVISION=\"llvmorg-13-init-15163-g98033fdc-1\"",
+        "-DCR_CLANG_REVISION=\"llvmorg-14-init-3191-g0e03450a-1\"",
         "-DCR_LIBCXX_REVISION=79a2e924d96e2fc1e4b937c42efd08898fa472d7",
         "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
         "-DHAVE_SYS_UIO_H",
@@ -5835,10 +5629,7 @@
         "-Wno-builtin-assume-aligned-alignment",
         "-Wno-builtin-macro-redefined",
         "-Wno-c++11-narrowing",
-        "-Wno-deprecated-copy",
-        "-Wno-final-dtor-non-final-class",
         "-Wno-ignored-pragma-optimize",
-        "-Wno-implicit-fallthrough",
         "-Wno-misleading-indentation",
         "-Wno-missing-field-initializers",
         "-Wno-psabi",
@@ -5869,7 +5660,7 @@
         "-DABSL_ALLOCATOR_NOTHROW=1",
         "-DANDROID",
         "-DANDROID_NDK_VERSION_ROLL=r22_1",
-        "-DCR_CLANG_REVISION=\"llvmorg-13-init-15163-g98033fdc-1\"",
+        "-DCR_CLANG_REVISION=\"llvmorg-14-init-3191-g0e03450a-1\"",
         "-DCR_LIBCXX_REVISION=79a2e924d96e2fc1e4b937c42efd08898fa472d7",
         "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
         "-DHAVE_SYS_UIO_H",
@@ -5883,10 +5674,7 @@
         "-Wno-builtin-assume-aligned-alignment",
         "-Wno-builtin-macro-redefined",
         "-Wno-c++11-narrowing",
-        "-Wno-deprecated-copy",
-        "-Wno-final-dtor-non-final-class",
         "-Wno-ignored-pragma-optimize",
-        "-Wno-implicit-fallthrough",
         "-Wno-misleading-indentation",
         "-Wno-missing-field-initializers",
         "-Wno-psabi",
@@ -5917,7 +5705,7 @@
         "-DABSL_ALLOCATOR_NOTHROW=1",
         "-DANDROID",
         "-DANDROID_NDK_VERSION_ROLL=r22_1",
-        "-DCR_CLANG_REVISION=\"llvmorg-13-init-15163-g98033fdc-1\"",
+        "-DCR_CLANG_REVISION=\"llvmorg-14-init-3191-g0e03450a-1\"",
         "-DCR_LIBCXX_REVISION=79a2e924d96e2fc1e4b937c42efd08898fa472d7",
         "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
         "-DHAVE_SYS_UIO_H",
@@ -5931,10 +5719,7 @@
         "-Wno-builtin-assume-aligned-alignment",
         "-Wno-builtin-macro-redefined",
         "-Wno-c++11-narrowing",
-        "-Wno-deprecated-copy",
-        "-Wno-final-dtor-non-final-class",
         "-Wno-ignored-pragma-optimize",
-        "-Wno-implicit-fallthrough",
         "-Wno-misleading-indentation",
         "-Wno-missing-field-initializers",
         "-Wno-psabi",
@@ -5972,7 +5757,7 @@
         "-DABSL_ALLOCATOR_NOTHROW=1",
         "-DANDROID",
         "-DANDROID_NDK_VERSION_ROLL=r22_1",
-        "-DCR_CLANG_REVISION=\"llvmorg-13-init-15163-g98033fdc-1\"",
+        "-DCR_CLANG_REVISION=\"llvmorg-14-init-3191-g0e03450a-1\"",
         "-DCR_LIBCXX_REVISION=79a2e924d96e2fc1e4b937c42efd08898fa472d7",
         "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
         "-DHAVE_SYS_UIO_H",
@@ -5986,10 +5771,7 @@
         "-Wno-builtin-assume-aligned-alignment",
         "-Wno-builtin-macro-redefined",
         "-Wno-c++11-narrowing",
-        "-Wno-deprecated-copy",
-        "-Wno-final-dtor-non-final-class",
         "-Wno-ignored-pragma-optimize",
-        "-Wno-implicit-fallthrough",
         "-Wno-misleading-indentation",
         "-Wno-missing-field-initializers",
         "-Wno-psabi",
@@ -6027,7 +5809,7 @@
         "-DABSL_ALLOCATOR_NOTHROW=1",
         "-DANDROID",
         "-DANDROID_NDK_VERSION_ROLL=r22_1",
-        "-DCR_CLANG_REVISION=\"llvmorg-13-init-15163-g98033fdc-1\"",
+        "-DCR_CLANG_REVISION=\"llvmorg-14-init-3191-g0e03450a-1\"",
         "-DCR_LIBCXX_REVISION=79a2e924d96e2fc1e4b937c42efd08898fa472d7",
         "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
         "-DHAVE_SYS_UIO_H",
@@ -6041,10 +5823,7 @@
         "-Wno-builtin-assume-aligned-alignment",
         "-Wno-builtin-macro-redefined",
         "-Wno-c++11-narrowing",
-        "-Wno-deprecated-copy",
-        "-Wno-final-dtor-non-final-class",
         "-Wno-ignored-pragma-optimize",
-        "-Wno-implicit-fallthrough",
         "-Wno-misleading-indentation",
         "-Wno-missing-field-initializers",
         "-Wno-psabi",
@@ -6079,7 +5858,7 @@
         "-DABSL_ALLOCATOR_NOTHROW=1",
         "-DANDROID",
         "-DANDROID_NDK_VERSION_ROLL=r22_1",
-        "-DCR_CLANG_REVISION=\"llvmorg-13-init-15163-g98033fdc-1\"",
+        "-DCR_CLANG_REVISION=\"llvmorg-14-init-3191-g0e03450a-1\"",
         "-DCR_LIBCXX_REVISION=79a2e924d96e2fc1e4b937c42efd08898fa472d7",
         "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
         "-DHAVE_SYS_UIO_H",
@@ -6093,10 +5872,7 @@
         "-Wno-builtin-assume-aligned-alignment",
         "-Wno-builtin-macro-redefined",
         "-Wno-c++11-narrowing",
-        "-Wno-deprecated-copy",
-        "-Wno-final-dtor-non-final-class",
         "-Wno-ignored-pragma-optimize",
-        "-Wno-implicit-fallthrough",
         "-Wno-misleading-indentation",
         "-Wno-missing-field-initializers",
         "-Wno-psabi",
@@ -6116,7 +5892,7 @@
         "third_party_abseil_cpp_absl_base_endian",
         "third_party_abseil_cpp_absl_container_fixed_array",
         "third_party_abseil_cpp_absl_hash_city",
-        "third_party_abseil_cpp_absl_hash_wyhash",
+        "third_party_abseil_cpp_absl_hash_low_level_hash",
         "third_party_abseil_cpp_absl_meta_type_traits",
         "third_party_abseil_cpp_absl_numeric_int128",
         "third_party_abseil_cpp_absl_strings_strings",
@@ -6137,7 +5913,7 @@
         "-DABSL_ALLOCATOR_NOTHROW=1",
         "-DANDROID",
         "-DANDROID_NDK_VERSION_ROLL=r22_1",
-        "-DCR_CLANG_REVISION=\"llvmorg-13-init-15163-g98033fdc-1\"",
+        "-DCR_CLANG_REVISION=\"llvmorg-14-init-3191-g0e03450a-1\"",
         "-DCR_LIBCXX_REVISION=79a2e924d96e2fc1e4b937c42efd08898fa472d7",
         "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
         "-DHAVE_SYS_UIO_H",
@@ -6151,10 +5927,7 @@
         "-Wno-builtin-assume-aligned-alignment",
         "-Wno-builtin-macro-redefined",
         "-Wno-c++11-narrowing",
-        "-Wno-deprecated-copy",
-        "-Wno-final-dtor-non-final-class",
         "-Wno-ignored-pragma-optimize",
-        "-Wno-implicit-fallthrough",
         "-Wno-misleading-indentation",
         "-Wno-missing-field-initializers",
         "-Wno-psabi",
@@ -6187,7 +5960,7 @@
         "-DABSL_ALLOCATOR_NOTHROW=1",
         "-DANDROID",
         "-DANDROID_NDK_VERSION_ROLL=r22_1",
-        "-DCR_CLANG_REVISION=\"llvmorg-13-init-15163-g98033fdc-1\"",
+        "-DCR_CLANG_REVISION=\"llvmorg-14-init-3191-g0e03450a-1\"",
         "-DCR_LIBCXX_REVISION=79a2e924d96e2fc1e4b937c42efd08898fa472d7",
         "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
         "-DHAVE_SYS_UIO_H",
@@ -6201,10 +5974,7 @@
         "-Wno-builtin-assume-aligned-alignment",
         "-Wno-builtin-macro-redefined",
         "-Wno-c++11-narrowing",
-        "-Wno-deprecated-copy",
-        "-Wno-final-dtor-non-final-class",
         "-Wno-ignored-pragma-optimize",
-        "-Wno-implicit-fallthrough",
         "-Wno-misleading-indentation",
         "-Wno-missing-field-initializers",
         "-Wno-psabi",
@@ -6235,7 +6005,7 @@
         "-DABSL_ALLOCATOR_NOTHROW=1",
         "-DANDROID",
         "-DANDROID_NDK_VERSION_ROLL=r22_1",
-        "-DCR_CLANG_REVISION=\"llvmorg-13-init-15163-g98033fdc-1\"",
+        "-DCR_CLANG_REVISION=\"llvmorg-14-init-3191-g0e03450a-1\"",
         "-DCR_LIBCXX_REVISION=79a2e924d96e2fc1e4b937c42efd08898fa472d7",
         "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
         "-DHAVE_SYS_UIO_H",
@@ -6249,10 +6019,7 @@
         "-Wno-builtin-assume-aligned-alignment",
         "-Wno-builtin-macro-redefined",
         "-Wno-c++11-narrowing",
-        "-Wno-deprecated-copy",
-        "-Wno-final-dtor-non-final-class",
         "-Wno-ignored-pragma-optimize",
-        "-Wno-implicit-fallthrough",
         "-Wno-misleading-indentation",
         "-Wno-missing-field-initializers",
         "-Wno-psabi",
@@ -6284,7 +6051,7 @@
         "-DABSL_ALLOCATOR_NOTHROW=1",
         "-DANDROID",
         "-DANDROID_NDK_VERSION_ROLL=r22_1",
-        "-DCR_CLANG_REVISION=\"llvmorg-13-init-15163-g98033fdc-1\"",
+        "-DCR_CLANG_REVISION=\"llvmorg-14-init-3191-g0e03450a-1\"",
         "-DCR_LIBCXX_REVISION=79a2e924d96e2fc1e4b937c42efd08898fa472d7",
         "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
         "-DHAVE_SYS_UIO_H",
@@ -6298,10 +6065,7 @@
         "-Wno-builtin-assume-aligned-alignment",
         "-Wno-builtin-macro-redefined",
         "-Wno-c++11-narrowing",
-        "-Wno-deprecated-copy",
-        "-Wno-final-dtor-non-final-class",
         "-Wno-ignored-pragma-optimize",
-        "-Wno-implicit-fallthrough",
         "-Wno-misleading-indentation",
         "-Wno-missing-field-initializers",
         "-Wno-psabi",
@@ -6332,7 +6096,7 @@
         "-DABSL_ALLOCATOR_NOTHROW=1",
         "-DANDROID",
         "-DANDROID_NDK_VERSION_ROLL=r22_1",
-        "-DCR_CLANG_REVISION=\"llvmorg-13-init-15163-g98033fdc-1\"",
+        "-DCR_CLANG_REVISION=\"llvmorg-14-init-3191-g0e03450a-1\"",
         "-DCR_LIBCXX_REVISION=79a2e924d96e2fc1e4b937c42efd08898fa472d7",
         "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
         "-DHAVE_SYS_UIO_H",
@@ -6346,10 +6110,7 @@
         "-Wno-builtin-assume-aligned-alignment",
         "-Wno-builtin-macro-redefined",
         "-Wno-c++11-narrowing",
-        "-Wno-deprecated-copy",
-        "-Wno-final-dtor-non-final-class",
         "-Wno-ignored-pragma-optimize",
-        "-Wno-implicit-fallthrough",
         "-Wno-misleading-indentation",
         "-Wno-missing-field-initializers",
         "-Wno-psabi",
@@ -6382,7 +6143,7 @@
         "-DABSL_ALLOCATOR_NOTHROW=1",
         "-DANDROID",
         "-DANDROID_NDK_VERSION_ROLL=r22_1",
-        "-DCR_CLANG_REVISION=\"llvmorg-13-init-15163-g98033fdc-1\"",
+        "-DCR_CLANG_REVISION=\"llvmorg-14-init-3191-g0e03450a-1\"",
         "-DCR_LIBCXX_REVISION=79a2e924d96e2fc1e4b937c42efd08898fa472d7",
         "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
         "-DHAVE_SYS_UIO_H",
@@ -6396,10 +6157,7 @@
         "-Wno-builtin-assume-aligned-alignment",
         "-Wno-builtin-macro-redefined",
         "-Wno-c++11-narrowing",
-        "-Wno-deprecated-copy",
-        "-Wno-final-dtor-non-final-class",
         "-Wno-ignored-pragma-optimize",
-        "-Wno-implicit-fallthrough",
         "-Wno-misleading-indentation",
         "-Wno-missing-field-initializers",
         "-Wno-psabi",
@@ -6429,7 +6187,7 @@
         "-DABSL_ALLOCATOR_NOTHROW=1",
         "-DANDROID",
         "-DANDROID_NDK_VERSION_ROLL=r22_1",
-        "-DCR_CLANG_REVISION=\"llvmorg-13-init-15163-g98033fdc-1\"",
+        "-DCR_CLANG_REVISION=\"llvmorg-14-init-3191-g0e03450a-1\"",
         "-DCR_LIBCXX_REVISION=79a2e924d96e2fc1e4b937c42efd08898fa472d7",
         "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
         "-DHAVE_SYS_UIO_H",
@@ -6443,10 +6201,7 @@
         "-Wno-builtin-assume-aligned-alignment",
         "-Wno-builtin-macro-redefined",
         "-Wno-c++11-narrowing",
-        "-Wno-deprecated-copy",
-        "-Wno-final-dtor-non-final-class",
         "-Wno-ignored-pragma-optimize",
-        "-Wno-implicit-fallthrough",
         "-Wno-misleading-indentation",
         "-Wno-missing-field-initializers",
         "-Wno-psabi",
@@ -6472,7 +6227,7 @@
         "-DABSL_ALLOCATOR_NOTHROW=1",
         "-DANDROID",
         "-DANDROID_NDK_VERSION_ROLL=r22_1",
-        "-DCR_CLANG_REVISION=\"llvmorg-13-init-15163-g98033fdc-1\"",
+        "-DCR_CLANG_REVISION=\"llvmorg-14-init-3191-g0e03450a-1\"",
         "-DCR_LIBCXX_REVISION=79a2e924d96e2fc1e4b937c42efd08898fa472d7",
         "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
         "-DHAVE_SYS_UIO_H",
@@ -6486,10 +6241,7 @@
         "-Wno-builtin-assume-aligned-alignment",
         "-Wno-builtin-macro-redefined",
         "-Wno-c++11-narrowing",
-        "-Wno-deprecated-copy",
-        "-Wno-final-dtor-non-final-class",
         "-Wno-ignored-pragma-optimize",
-        "-Wno-implicit-fallthrough",
         "-Wno-misleading-indentation",
         "-Wno-missing-field-initializers",
         "-Wno-psabi",
@@ -6520,7 +6272,7 @@
         "-DABSL_ALLOCATOR_NOTHROW=1",
         "-DANDROID",
         "-DANDROID_NDK_VERSION_ROLL=r22_1",
-        "-DCR_CLANG_REVISION=\"llvmorg-13-init-15163-g98033fdc-1\"",
+        "-DCR_CLANG_REVISION=\"llvmorg-14-init-3191-g0e03450a-1\"",
         "-DCR_LIBCXX_REVISION=79a2e924d96e2fc1e4b937c42efd08898fa472d7",
         "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
         "-DHAVE_SYS_UIO_H",
@@ -6534,10 +6286,7 @@
         "-Wno-builtin-assume-aligned-alignment",
         "-Wno-builtin-macro-redefined",
         "-Wno-c++11-narrowing",
-        "-Wno-deprecated-copy",
-        "-Wno-final-dtor-non-final-class",
         "-Wno-ignored-pragma-optimize",
-        "-Wno-implicit-fallthrough",
         "-Wno-misleading-indentation",
         "-Wno-missing-field-initializers",
         "-Wno-psabi",
@@ -6567,7 +6316,7 @@
         "-DABSL_ALLOCATOR_NOTHROW=1",
         "-DANDROID",
         "-DANDROID_NDK_VERSION_ROLL=r22_1",
-        "-DCR_CLANG_REVISION=\"llvmorg-13-init-15163-g98033fdc-1\"",
+        "-DCR_CLANG_REVISION=\"llvmorg-14-init-3191-g0e03450a-1\"",
         "-DCR_LIBCXX_REVISION=79a2e924d96e2fc1e4b937c42efd08898fa472d7",
         "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
         "-DHAVE_SYS_UIO_H",
@@ -6581,10 +6330,7 @@
         "-Wno-builtin-assume-aligned-alignment",
         "-Wno-builtin-macro-redefined",
         "-Wno-c++11-narrowing",
-        "-Wno-deprecated-copy",
-        "-Wno-final-dtor-non-final-class",
         "-Wno-ignored-pragma-optimize",
-        "-Wno-implicit-fallthrough",
         "-Wno-misleading-indentation",
         "-Wno-missing-field-initializers",
         "-Wno-psabi",
@@ -6616,7 +6362,7 @@
         "-DABSL_ALLOCATOR_NOTHROW=1",
         "-DANDROID",
         "-DANDROID_NDK_VERSION_ROLL=r22_1",
-        "-DCR_CLANG_REVISION=\"llvmorg-13-init-15163-g98033fdc-1\"",
+        "-DCR_CLANG_REVISION=\"llvmorg-14-init-3191-g0e03450a-1\"",
         "-DCR_LIBCXX_REVISION=79a2e924d96e2fc1e4b937c42efd08898fa472d7",
         "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
         "-DHAVE_SYS_UIO_H",
@@ -6630,10 +6376,7 @@
         "-Wno-builtin-assume-aligned-alignment",
         "-Wno-builtin-macro-redefined",
         "-Wno-c++11-narrowing",
-        "-Wno-deprecated-copy",
-        "-Wno-final-dtor-non-final-class",
         "-Wno-ignored-pragma-optimize",
-        "-Wno-implicit-fallthrough",
         "-Wno-misleading-indentation",
         "-Wno-missing-field-initializers",
         "-Wno-psabi",
@@ -6660,6 +6403,7 @@
     sdk_version: "28",
     defaults: [
         "third_party_abseil_cpp_absl_container_flat_hash_map",
+        "third_party_abseil_cpp_absl_container_flat_hash_set",
     ],
     name: "angle_abseil",
     cflags: [
@@ -6716,7 +6460,7 @@
         "-DANDROID",
         "-DANDROID_NDK_VERSION_ROLL=r22_1",
         "-DANGLE_USE_ABSEIL",
-        "-DCR_CLANG_REVISION=\"llvmorg-13-init-15163-g98033fdc-1\"",
+        "-DCR_CLANG_REVISION=\"llvmorg-14-init-3191-g0e03450a-1\"",
         "-DCR_LIBCXX_REVISION=79a2e924d96e2fc1e4b937c42efd08898fa472d7",
         "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
         "-DHAVE_SYS_UIO_H",
@@ -6732,10 +6476,7 @@
         "-Oz",
         "-Wno-builtin-assume-aligned-alignment",
         "-Wno-builtin-macro-redefined",
-        "-Wno-deprecated-copy",
-        "-Wno-final-dtor-non-final-class",
         "-Wno-ignored-pragma-optimize",
-        "-Wno-implicit-fallthrough",
         "-Wno-missing-field-initializers",
         "-Wno-psabi",
         "-Wno-trigraphs",
@@ -6902,7 +6643,7 @@
         "-DANGLE_SHARED_LIBVULKAN=1",
         "-DANGLE_USE_ABSEIL",
         "-DANGLE_USE_CUSTOM_VULKAN_CMD_BUFFERS=1",
-        "-DCR_CLANG_REVISION=\"llvmorg-13-init-15163-g98033fdc-1\"",
+        "-DCR_CLANG_REVISION=\"llvmorg-14-init-3191-g0e03450a-1\"",
         "-DCR_LIBCXX_REVISION=79a2e924d96e2fc1e4b937c42efd08898fa472d7",
         "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
         "-DHAVE_SYS_UIO_H",
@@ -6920,10 +6661,7 @@
         "-Oz",
         "-Wno-builtin-assume-aligned-alignment",
         "-Wno-builtin-macro-redefined",
-        "-Wno-deprecated-copy",
-        "-Wno-final-dtor-non-final-class",
         "-Wno-ignored-pragma-optimize",
-        "-Wno-implicit-fallthrough",
         "-Wno-missing-field-initializers",
         "-Wno-psabi",
         "-Wno-trigraphs",
@@ -7004,7 +6742,7 @@
         "-DANGLE_SHARED_LIBVULKAN=1",
         "-DANGLE_USE_ABSEIL",
         "-DANGLE_USE_CUSTOM_VULKAN_CMD_BUFFERS=1",
-        "-DCR_CLANG_REVISION=\"llvmorg-13-init-15163-g98033fdc-1\"",
+        "-DCR_CLANG_REVISION=\"llvmorg-14-init-3191-g0e03450a-1\"",
         "-DCR_LIBCXX_REVISION=79a2e924d96e2fc1e4b937c42efd08898fa472d7",
         "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
         "-DHAVE_SYS_UIO_H",
@@ -7022,10 +6760,7 @@
         "-Oz",
         "-Wno-builtin-assume-aligned-alignment",
         "-Wno-builtin-macro-redefined",
-        "-Wno-deprecated-copy",
-        "-Wno-final-dtor-non-final-class",
         "-Wno-ignored-pragma-optimize",
-        "-Wno-implicit-fallthrough",
         "-Wno-missing-field-initializers",
         "-Wno-psabi",
         "-Wno-trigraphs",
@@ -7047,7 +6782,7 @@
     cflags: [
         "-DANDROID",
         "-DANDROID_NDK_VERSION_ROLL=r22_1",
-        "-DCR_CLANG_REVISION=\"llvmorg-13-init-15163-g98033fdc-1\"",
+        "-DCR_CLANG_REVISION=\"llvmorg-14-init-3191-g0e03450a-1\"",
         "-DCR_LIBCXX_REVISION=79a2e924d96e2fc1e4b937c42efd08898fa472d7",
         "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
         "-DHAVE_SYS_UIO_H",
@@ -7063,10 +6798,7 @@
         "-Oz",
         "-Wno-builtin-assume-aligned-alignment",
         "-Wno-builtin-macro-redefined",
-        "-Wno-deprecated-copy",
-        "-Wno-final-dtor-non-final-class",
         "-Wno-ignored-pragma-optimize",
-        "-Wno-implicit-fallthrough",
         "-Wno-missing-field-initializers",
         "-Wno-psabi",
         "-Wno-trigraphs",
@@ -7108,7 +6840,7 @@
     cflags: [
         "-DANDROID",
         "-DANDROID_NDK_VERSION_ROLL=r22_1",
-        "-DCR_CLANG_REVISION=\"llvmorg-13-init-15163-g98033fdc-1\"",
+        "-DCR_CLANG_REVISION=\"llvmorg-14-init-3191-g0e03450a-1\"",
         "-DCR_LIBCXX_REVISION=79a2e924d96e2fc1e4b937c42efd08898fa472d7",
         "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
         "-DHAVE_SYS_UIO_H",
@@ -7124,10 +6856,7 @@
         "-Oz",
         "-Wno-builtin-assume-aligned-alignment",
         "-Wno-builtin-macro-redefined",
-        "-Wno-deprecated-copy",
-        "-Wno-final-dtor-non-final-class",
         "-Wno-ignored-pragma-optimize",
-        "-Wno-implicit-fallthrough",
         "-Wno-missing-field-initializers",
         "-Wno-psabi",
         "-Wno-trigraphs",
@@ -7215,7 +6944,7 @@
         "-DANGLE_SHARED_LIBVULKAN=1",
         "-DANGLE_USE_ABSEIL",
         "-DANGLE_USE_CUSTOM_VULKAN_CMD_BUFFERS=1",
-        "-DCR_CLANG_REVISION=\"llvmorg-13-init-15163-g98033fdc-1\"",
+        "-DCR_CLANG_REVISION=\"llvmorg-14-init-3191-g0e03450a-1\"",
         "-DCR_LIBCXX_REVISION=79a2e924d96e2fc1e4b937c42efd08898fa472d7",
         "-DDYNAMIC_ANNOTATIONS_ENABLED=0",
         "-DEGL_EGLEXT_PROTOTYPES",
@@ -7240,10 +6969,7 @@
         "-Oz",
         "-Wno-builtin-assume-aligned-alignment",
         "-Wno-builtin-macro-redefined",
-        "-Wno-deprecated-copy",
-        "-Wno-final-dtor-non-final-class",
         "-Wno-ignored-pragma-optimize",
-        "-Wno-implicit-fallthrough",
         "-Wno-missing-field-initializers",
         "-Wno-psabi",
         "-Wno-trigraphs",
@@ -7300,10 +7026,28 @@
     ],
     license_text: [
         "LICENSE",
+        "src/common/third_party/smhasher/LICENSE",
+        "src/common/third_party/xxhash/LICENSE",
+        "src/libANGLE/renderer/vulkan/shaders/src/third_party/ffx_spd/LICENSE",
+        "src/tests/test_utils/third_party/LICENSE",
+        "src/third_party/libXNVCtrl/LICENSE",
+        "src/third_party/volk/LICENSE.md",
         "third_party/abseil-cpp/LICENSE",
         "third_party/vulkan-deps/LICENSE",
+        "third_party/vulkan-deps/glslang/LICENSE",
+        "third_party/vulkan-deps/glslang/src/LICENSE.txt",
+        "third_party/vulkan-deps/spirv-headers/LICENSE",
+        "third_party/vulkan-deps/spirv-headers/src/LICENSE",
+        "third_party/vulkan-deps/spirv-tools/LICENSE",
+        "third_party/vulkan-deps/spirv-tools/src/LICENSE",
+        "third_party/vulkan-deps/spirv-tools/src/utils/vscode/src/lsp/LICENSE",
+        "third_party/vulkan-deps/vulkan-headers/LICENSE.txt",
+        "third_party/vulkan-deps/vulkan-headers/src/LICENSE.txt",
         "third_party/vulkan_memory_allocator/LICENSE.txt",
         "third_party/zlib/LICENSE",
+        "tools/flex-bison/third_party/m4sugar/LICENSE",
+        "tools/flex-bison/third_party/skeletons/LICENSE",
+        "util/windows/third_party/StackWalker/LICENSE",
     ],
 }
 filegroup {
diff --git a/BUILD.gn b/BUILD.gn
index 51fc98a..c428510 100644
--- a/BUILD.gn
+++ b/BUILD.gn
@@ -23,6 +23,9 @@
       (is_linux || is_chromeos) && (!is_chromecast || is_cast_desktop_build) &&
       (angle_use_x11 || use_ozone) && angle_has_build
 
+  # Enable using Vulkan to collect system info as a fallback.
+  angle_enable_vulkan_system_info = false
+
   # Link in system libGL, to work with apitrace.  See doc/DebuggingTips.md.
   angle_link_glx = false
 
@@ -45,9 +48,6 @@
 
   # Optional feature that forces dirty state whenever we use a new context regardless of thread.
   angle_force_context_check_every_call = false
-
-  # Indicate if the rapidJSON library is available to build with in third_party/.
-  angle_has_rapidjson = angle_has_build
 }
 
 if (angle_build_all) {
@@ -135,10 +135,10 @@
   if (angle_use_vulkan_null_display) {
     defines += [ "ANGLE_USE_VULKAN_NULL_DISPLAY" ]
   } else if (angle_use_vulkan_display) {
-    defines += [
-      "ANGLE_USE_VULKAN_DISPLAY",
-      "EGL_NO_X11",
-    ]
+    defines += [ "ANGLE_USE_VULKAN_DISPLAY" ]
+    if (!angle_use_x11) {
+      defines += [ "EGL_NO_X11" ]
+    }
     if (angle_vulkan_display_mode == "simple") {
       defines += [ "ANGLE_VULKAN_DISPLAY_MODE_SIMPLE" ]
     } else if (angle_vulkan_display_mode == "headless") {
@@ -200,13 +200,14 @@
       "-Wundefined-reinterpret-cast",
       "-Wunneeded-internal-declaration",
       "-Wweak-template-vtables",
+      "-Wunused-but-set-variable",
 
       # The below warnings are used by WebKit. We enable them to make rolling
       # ANGLE in WebKit easier.
       "-Wparentheses",
       "-Wrange-loop-analysis",
       "-Wstrict-prototypes",
-      "-Wunreachable-code",
+      "-Wunreachable-code-aggressive",
       "-Wshorten-64-to-32",
     ]
     if (!use_xcode_clang) {
@@ -454,7 +455,9 @@
       "$angle_root/src/common/vulkan:angle_libvulkan_loader",
       "$angle_vulkan_headers_dir:vulkan_headers",
     ]
-    defines += [ "ANGLE_HAS_VULKAN_SYSTEM_INFO" ]
+    if (angle_enable_vulkan_system_info) {
+      defines += [ "ANGLE_HAS_VULKAN_SYSTEM_INFO" ]
+    }
   }
 
   if (is_android) {
@@ -529,6 +532,14 @@
     _needs_glsl_and_vulkan_base = false
     _uses_spirv = false
 
+    # Frontend support:
+    if (angle_enable_desktop_glsl) {
+      sources += angle_translator_glsl_symbol_table_sources
+    } else {
+      sources += angle_translator_essl_symbol_table_sources
+    }
+
+    # Backend support:
     if (angle_enable_essl || use_fuzzing_engine) {
       _needs_glsl_base = true
       sources += angle_translator_essl_sources
@@ -539,12 +550,14 @@
       _needs_glsl_base = true
       _needs_glsl_and_vulkan_base = true
       sources += angle_translator_glsl_sources
-      if (is_apple) {
-        sources += angle_translator_glsl_mac_sources
-      }
       defines += [ "ANGLE_ENABLE_GLSL" ]
     }
 
+    if (angle_enable_apple_translator_workarounds) {
+      sources += angle_translator_apple_sources
+      defines += [ "ANGLE_ENABLE_APPLE_WORKAROUNDS" ]
+    }
+
     if (angle_enable_hlsl || use_fuzzing_engine) {
       sources += angle_translator_hlsl_sources
       defines += [ "ANGLE_ENABLE_HLSL" ]
@@ -917,10 +930,6 @@
   defines = [ "ANGLE_CAPTURE_ENABLED=0" ]
 }
 
-config("angle_frame_capture_enabled") {
-  defines = [ "ANGLE_CAPTURE_ENABLED=1" ]
-}
-
 angle_source_set("libANGLE") {
   public_deps = [ ":libANGLE_base" ]
   public_configs = [ ":angle_frame_capture_disabled" ]
@@ -937,10 +946,12 @@
 }
 
 angle_source_set("angle_gl_enum_utils") {
-  public_deps = [ ":libANGLE_base" ]
+  deps = [ ":angle_common" ]
   sources = [
     "src/libANGLE/capture/gl_enum_utils.cpp",
+    "src/libANGLE/capture/gl_enum_utils.h",
     "src/libANGLE/capture/gl_enum_utils_autogen.cpp",
+    "src/libANGLE/capture/gl_enum_utils_autogen.h",
   ]
 }
 
@@ -966,7 +977,10 @@
     if (build_with_chromium || is_component_build) {
       public_deps = [ "$angle_abseil_cpp_dir:absl" ]
     } else {
-      public_deps = [ "$angle_abseil_cpp_dir/absl/container:flat_hash_map" ]
+      public_deps = [
+        "$angle_abseil_cpp_dir/absl/container:flat_hash_map",
+        "$angle_abseil_cpp_dir/absl/container:flat_hash_set",
+      ]
     }
 
     public_configs = [ ":angle_abseil_config" ]
@@ -1003,17 +1017,24 @@
   }
 }
 
-angle_source_set("libANGLE_with_capture") {
-  public_deps = [ ":libANGLE_base" ]
-  deps = [ ":angle_compression" ]
-  public_configs = [ ":angle_frame_capture_enabled" ]
-  sources = libangle_capture_sources
+assert(angle_has_frame_capture || !angle_with_capture_by_default)
+if (angle_has_frame_capture) {
+  config("angle_frame_capture_enabled") {
+    defines = [ "ANGLE_CAPTURE_ENABLED=1" ]
+  }
 
-  if (angle_has_rapidjson) {
-    public_deps += [ ":angle_json_serializer" ]
-    sources += [ "src/libANGLE/capture/frame_capture_utils.cpp" ]
-  } else {
-    sources += [ "src/libANGLE/capture/frame_capture_utils_mock.cpp" ]
+  angle_source_set("libANGLE_with_capture") {
+    public_deps = [ ":libANGLE_base" ]
+    deps = [ ":angle_compression" ]
+    public_configs = [ ":angle_frame_capture_enabled" ]
+    sources = libangle_capture_sources
+
+    if (angle_has_rapidjson) {
+      public_deps += [ ":angle_json_serializer" ]
+      sources += [ "src/libANGLE/capture/frame_capture_utils.cpp" ]
+    } else {
+      sources += [ "src/libANGLE/capture/frame_capture_utils_mock.cpp" ]
+    }
   }
 }
 
@@ -1115,13 +1136,15 @@
 }
 
 # Output capture lib when `angle_with_capture_by_default` disabled, vice versa.
-angle_libGLESv2("libGLESv2_capture_complement") {
-  if (angle_with_capture_by_default) {
-    deps = [ ":libANGLE" ]
-    output_name += "_no_capture"
-  } else {
-    deps = [ ":libANGLE_with_capture" ]
-    output_name += "_with_capture"
+if (angle_has_frame_capture) {
+  angle_libGLESv2("libGLESv2_capture_complement") {
+    if (angle_with_capture_by_default) {
+      deps = [ ":libANGLE" ]
+      output_name += "_no_capture"
+    } else {
+      deps = [ ":libANGLE_with_capture" ]
+      output_name += "_with_capture"
+    }
   }
 }
 
diff --git a/DEPS b/DEPS
index 7e55148..fab77c7 100644
--- a/DEPS
+++ b/DEPS
@@ -34,17 +34,17 @@
   'checkout_android_native_support': 'checkout_android or checkout_chromeos',
 
   # Version of Chromium our Chromium-based DEPS are mirrored from.
-  'chromium_revision': 'f8ef6fcfb849e4a5566b52971525168690aab27e',
+  'chromium_revision': '6aa22be0c26ffa7e5020998616629b830c0796b3',
   # We never want to checkout chromium,
   # but need a dummy DEPS entry for the autoroller
   'dummy_checkout_chromium': False,
 
   # Current revision of VK-GL-CTS (a.k.a dEQP).
-  'vk_gl_cts_revision': '571256871c2e2f03995373e1e4a02958d8cd8cf5',
+  'vk_gl_cts_revision': '7103920041db5dc58bf742de48156f208516dbdf',
 
   # Current revision of googletest.
   # Note: this dep cannot be auto-rolled b/c of nesting.
-  'googletest_revision': '4fe018038f87675c083d0cfb6a6b57c274fb1753',
+  'googletest_revision': '2d924d7a971e9667d76ad09727fb2402b4f8a1e3',
 
   # Current revision of Chrome's third_party googletest directory. This
   # repository is mirrored as a separate repository, with separate git hashes
@@ -54,8 +54,8 @@
   # mirror of third_party/googletest located here:
   # https://chromium.googlesource.com/chromium/src/third_party/googletest/
   # Then get the new hash for googletest_revision from the root Chrome DEPS
-  # file: https://source.chromium.org/chromium/chromium/src/+/master:DEPS
-  'chromium_googletest_revision': 'c20c5a3085ab4d90fdb403e3ac98e7991317dd27',
+  # file: https://source.chromium.org/chromium/chromium/src/+/main:DEPS
+  'chromium_googletest_revision': '17bbed2084d3127bd7bcd27283f18d7a5861bea8',
 
   # Current revision of jsoncpp.
   # Note: this dep cannot be auto-rolled b/c of nesting.
@@ -69,7 +69,7 @@
   # mirror of third_party/jsoncpp located here:
   # https://chromium.googlesource.com/chromium/src/third_party/jsoncpp/
   # Then get the new hash for jsoncpp_revision from the root Chrome DEPS file:
-  # https://source.chromium.org/chromium/chromium/src/+/master:DEPS
+  # https://source.chromium.org/chromium/chromium/src/+/main:DEPS
   'chromium_jsoncpp_revision': '30a6ac108e24dabac7c2e0df4d33d55032af4ee7',
 
   # Current revision of patched-yasm.
@@ -79,21 +79,21 @@
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling catapult
   # and whatever else without interference from each other.
-  'catapult_revision': '5cb305306ad74c3b68e432ee221a1943dd79b64d',
+  'catapult_revision': '8141144003019719d7aff618ecb8f3d3f3d6d36a',
 
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling luci-go
   # and whatever else without interference from each other.
-  'luci_go': 'git_revision:175b811c1eebfa8868ab96b58a4dc7b5bcabf756',
+  'luci_go': 'git_revision:7b62727dc713b47d7a7ce9bca27500cb8e82ebd7',
 
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling android_sdk_build-tools_version
   # and whatever else without interference from each other.
-  'android_sdk_build-tools_version': '8LZujEmLjSh0g3JciDA3cslSptxKs9HOa_iUPXkOeYQC',
+  'android_sdk_build-tools_version': 'tRoD45SCi7UleQqSV7MrMQO1_e5P8ysphkCcj6z_cCQC',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling android_sdk_emulator_version
   # and whatever else without interference from each other.
-  'android_sdk_emulator_version': 'A4EvXZUIuQho0QRDJopMUpgyp6NA3aiDQjGKPUKbowMC',
+  'android_sdk_emulator_version': 'gMHhUuoQRKfxr-MBn3fNNXZtkAVXtOwMwT7kfx8jkIgC',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling android_sdk_extras_version
   # and whatever else without interference from each other.
@@ -105,26 +105,26 @@
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling android_sdk_platform-tools_version
   # and whatever else without interference from each other.
-  'android_sdk_platform-tools_version': '8tF0AOj7Dwlv4j7_nfkhxWB0jzrvWWYjEIpirt8FIWYC',
+  'android_sdk_platform-tools_version': 'qi_k82nm6j9nz4dQosOoqXew4_TFAy8rcGOHDLptx1sC',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling android_sdk_platforms_version
   # and whatever else without interference from each other.
-  'android_sdk_platforms_version': 'YMUu9EHNZ__2Xcxl-KsaSf-dI5TMt_P62IseUVsxktMC',
+  'android_sdk_platforms_version': 'lL3IGexKjYlwjO_1Ga-xwxgwbE_w-lmi2Zi1uOlWUIAC',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling android_sdk_sources_version
   # and whatever else without interference from each other.
-  'android_sdk_sources_version': '4gxhM8E62bvZpQs7Q3d0DinQaW0RLCIefhXrQBFkNy8C',
+  'android_sdk_sources_version': 'n7svc8KYah-i4s8zwkVa85SI3_H0WFOniP0mpwNdFO0C',
 }
 
 deps = {
 
   'build': {
-    'url': '{chromium_git}/chromium/src/build.git@fd86d60f33cbc794537c4da2ef7e298d7f81138e',
+    'url': '{chromium_git}/chromium/src/build.git@0c04087fbf850f06f62336eeb5c355f857919e04',
     'condition': 'not build_with_chromium',
   },
 
   'buildtools': {
-    'url': '{chromium_git}/chromium/src/buildtools.git@37dc929ecb351687006a61744b116cda601753d7',
+    'url': '{chromium_git}/chromium/src/buildtools.git@7ea3a871db68ae2cbbeaf5433a3192a799ef3c11',
     'condition': 'not build_with_chromium',
   },
 
@@ -137,7 +137,7 @@
     'packages': [
       {
         'package': 'gn/gn/linux-amd64',
-        'version': 'git_revision:b2d77ab1373192d1532af94b68fb8bab727b0e5b',
+        'version': 'git_revision:69ec4fca1fa69ddadae13f9e6b7507efa0675263',
       }
     ],
     'dep_type': 'cipd',
@@ -148,7 +148,7 @@
     'packages': [
       {
         'package': 'gn/gn/mac-${{arch}}',
-        'version': 'git_revision:b2d77ab1373192d1532af94b68fb8bab727b0e5b',
+        'version': 'git_revision:69ec4fca1fa69ddadae13f9e6b7507efa0675263',
       }
     ],
     'dep_type': 'cipd',
@@ -161,7 +161,7 @@
   },
 
   'buildtools/third_party/libc++abi/trunk': {
-    'url': '{chromium_git}/external/github.com/llvm/llvm-project/libcxxabi.git@7d5c92f6cfb1ddb73158233a194bb568c5b13554',
+    'url': '{chromium_git}/external/github.com/llvm/llvm-project/libcxxabi.git@17de75220a90f23a16f9f87fbc5c00dce475b726',
     'condition': 'not build_with_chromium',
   },
 
@@ -169,7 +169,7 @@
     'packages': [
       {
         'package': 'gn/gn/windows-amd64',
-        'version': 'git_revision:b2d77ab1373192d1532af94b68fb8bab727b0e5b',
+        'version': 'git_revision:69ec4fca1fa69ddadae13f9e6b7507efa0675263',
       }
     ],
     'dep_type': 'cipd',
@@ -177,17 +177,17 @@
   },
 
   'testing': {
-    'url': '{chromium_git}/chromium/src/testing@f619f21d404a2d2c641782da7943714b56769f5c',
+    'url': '{chromium_git}/chromium/src/testing@2829dbd8e170a8968c63a00478c6ab7160665f82',
     'condition': 'not build_with_chromium',
   },
 
   'third_party/abseil-cpp': {
-    'url': '{chromium_git}/chromium/src/third_party/abseil-cpp@9211d9e376dc8e63e20922f8f0748f67db0a8ac7',
+    'url': '{chromium_git}/chromium/src/third_party/abseil-cpp@fec7b4e901bbb77d9af10db1c11cb9f6c2116b73',
     'condition': 'not build_with_chromium',
   },
 
   'third_party/android_build_tools': {
-    'url': '{chromium_git}/chromium/src/third_party/android_build_tools@c3565d6e1f8fdddf763498b0fb234f00097af6ac',
+    'url': '{chromium_git}/chromium/src/third_party/android_build_tools@2d100d89bb32f1d44dd03d9a8cb6dee966b6740a',
     'condition': 'checkout_android and not build_with_chromium',
   },
 
@@ -195,7 +195,7 @@
       'packages': [
           {
               'package': 'chromium/third_party/android_build_tools/aapt2',
-              'version': 'R2k5wwOlIaS6sjv2TIyHotiPJod-6KqnZO8NH-KFK8sC',
+              'version': 'O9eXFyC5ZkcYvDfHRLKPO1g1Xwf7M33wT3cuJtyfc0sC',
           },
       ],
       'condition': 'checkout_android and not build_with_chromium',
@@ -216,8 +216,8 @@
   'third_party/android_build_tools/bundletool': {
       'packages': [
           {
-               'package': 'chromium/third_party/android_tools_bundletool',
-               'version': 'FIj7ed-law2zMv41QhjEXabkaJ7aN2ztmE0Tv3Z_gFUC',
+               'package': 'chromium/third_party/android_build_tools/bundletool',
+               'version': 'nK0LSzIJHh_OqyIEMh3zye_Ad54jw57inqQF5jFJzdYC',
           },
       ],
       'condition': 'checkout_android and not build_with_chromium',
@@ -225,7 +225,7 @@
   },
 
   'third_party/android_deps': {
-    'url': '{chromium_git}/chromium/src/third_party/android_deps@8c49b419c21aee43b1d762e13e7b4a896022d6ba',
+    'url': '{chromium_git}/chromium/src/third_party/android_deps@bc688ce0a61a50fc6b7bbfdb198995c523b9720a',
     'condition': 'checkout_android and not build_with_chromium',
   },
 
@@ -235,12 +235,12 @@
   },
 
   'third_party/android_platform': {
-    'url': '{chromium_git}/chromium/src/third_party/android_platform@b291e88d8e3e6774d6d46151e11dc3189ddeeb09',
+    'url': '{chromium_git}/chromium/src/third_party/android_platform@6e5dc9acd241c308385f970c384d9e083b2b6e56',
     'condition': 'checkout_android and not build_with_chromium',
   },
 
   'third_party/android_sdk': {
-    'url': '{chromium_git}/chromium/src/third_party/android_sdk@76bd51b56b487cffe3876d8b3d1bb5e581e047fa',
+    'url': '{chromium_git}/chromium/src/third_party/android_sdk@37226d67bced87a166887cf83ae3f04a8428e4bc',
     'condition': 'checkout_android and not build_with_chromium',
   },
 
@@ -252,7 +252,7 @@
   'third_party/android_sdk/public': {
       'packages': [
           {
-              'package': 'chromium/third_party/android_sdk/public/build-tools/30.0.1',
+              'package': 'chromium/third_party/android_sdk/public/build-tools/31.0.0',
               'version': Var('android_sdk_build-tools_version'),
           },
           {
@@ -272,16 +272,16 @@
               'version': Var('android_sdk_platform-tools_version'),
           },
           {
-              'package': 'chromium/third_party/android_sdk/public/platforms/android-30',
+              'package': 'chromium/third_party/android_sdk/public/platforms/android-31',
               'version': Var('android_sdk_platforms_version'),
           },
           {
-              'package': 'chromium/third_party/android_sdk/public/sources/android-29',
+              'package': 'chromium/third_party/android_sdk/public/sources/android-30',
               'version': Var('android_sdk_sources_version'),
           },
           {
               'package': 'chromium/third_party/android_sdk/public/cmdline-tools',
-              'version': 'V__2Ycej-H2-6AcXX5A3gi7sIk74SuN44PBm2uC_N1sC',
+              'version': 'ZT3JmI6GMG4YVcZ1OtECRVMOLLJAWAdPbi-OclubJLMC',
           },
       ],
       'condition': 'checkout_android_native_support and not build_with_chromium',
@@ -291,8 +291,8 @@
   'third_party/android_system_sdk': {
       'packages': [
           {
-              'package': 'chromium/third_party/android_system_sdk',
-              'version': 'no8ss5nRg6uYDM08HboypuIQuix7bS1kVqRGyWmwP-YC',
+              'package': 'chromium/third_party/android_system_sdk/public',
+              'version': 'oSfDIvHlCa6W0gS79Q5OOfB9E4eBg3uAvi3BEDN21U0C',
           },
       ],
       'condition': 'checkout_android and not build_with_chromium',
@@ -327,7 +327,7 @@
   },
 
   'third_party/depot_tools': {
-    'url': '{chromium_git}/chromium/tools/depot_tools.git@a806594b95a39141fdbf1f359087a44ffb2deaaf',
+    'url': '{chromium_git}/chromium/tools/depot_tools.git@e1482c55484acb20a6383bd9e458a0e1574d0a10',
     'condition': 'not build_with_chromium',
   },
 
@@ -366,7 +366,7 @@
 
   # libjpeg_turbo is used by glmark2.
   'third_party/libjpeg_turbo': {
-    'url': '{chromium_git}/chromium/deps/libjpeg_turbo.git@ad8b3b0f84baf155f3bde5626c3bf9d20535bcae',
+    'url': '{chromium_git}/chromium/deps/libjpeg_turbo.git@ff19e5b2e176c61d552f68768e0e051867745321',
     'condition': 'not build_with_chromium',
   },
 
@@ -398,7 +398,7 @@
   },
 
   'third_party/jinja2': {
-    'url': '{chromium_git}/chromium/src/third_party/jinja2@7c54c1f227727e0c4c1d3dc19dd71cd601a2db95',
+    'url': '{chromium_git}/chromium/src/third_party/jinja2@6db8da1615a13fdfab925688bc4bf2eb394a73af',
     'condition': 'checkout_android and not build_with_chromium',
   },
 
@@ -413,7 +413,7 @@
   },
 
   'third_party/nasm': {
-    'url': '{chromium_git}/chromium/deps/nasm.git@e9be5fd6d723a435ca2da162f9e0ffcb688747c1',
+    'url': '{chromium_git}/chromium/deps/nasm.git@4e6fe9d1549e4ffb6c804494573e404849dfe7de',
     'condition': 'not build_with_chromium',
   },
 
@@ -434,7 +434,7 @@
   },
 
   'third_party/protobuf': {
-    'url': '{chromium_git}/chromium/src/third_party/protobuf@2229323ff76d68f835ef7141da7e1f10b8ba723d',
+    'url': '{chromium_git}/chromium/src/third_party/protobuf@add20af2323c47d2f6f6d93e0d2a1cff2f93c975',
     'condition': 'not build_with_chromium',
   },
 
@@ -469,7 +469,7 @@
       'packages': [
           {
               'package': 'chromium/third_party/r8',
-              'version': 'Nu_mvQJe34CotIXadFlA3w732CJ9EvQGuVs4udcZedAC',
+              'version': 'j4P6kTwiJeMkYRbaOqRCB-ZrYyISP0NrcyNNAd8MRM0C',
           },
       ],
       'condition': 'checkout_android and not build_with_chromium',
@@ -491,7 +491,7 @@
   },
 
   'third_party/SwiftShader': {
-    'url': '{swiftshader_git}/SwiftShader@7a7993b54e62b85ddabe8dfcf7788174bf36b80f',
+    'url': '{swiftshader_git}/SwiftShader@446e61c24b37e2d3cb1bd3334dd3854ec8f682bb',
     'condition': 'not build_with_chromium',
   },
 
@@ -511,17 +511,17 @@
   },
 
   'third_party/vulkan-deps': {
-    'url': '{chromium_git}/vulkan-deps@a42815069bade94a150ebdeb94efef38b8c6ae4d',
+    'url': '{chromium_git}/vulkan-deps@b1e5bf7dd9c3160d0d9a5f57726189e4b332520f',
     'condition': 'not build_with_chromium',
   },
 
   'third_party/vulkan_memory_allocator': {
-    'url': '{chromium_git}/external/github.com/GPUOpen-LibrariesAndSDKs/VulkanMemoryAllocator@732a76d9d3c70d6aa487216495eeb28518349c3a',
+    'url': '{chromium_git}/external/github.com/GPUOpen-LibrariesAndSDKs/VulkanMemoryAllocator@e0216a5484c8345f7d792fa16fad77ac63d89a70',
     'condition': 'not build_with_chromium',
   },
 
   'third_party/zlib': {
-    'url': '{chromium_git}/chromium/src/third_party/zlib@dfbc590f5855bc2765256a743cad0abc56330a30',
+    'url': '{chromium_git}/chromium/src/third_party/zlib@77c132322fe81a1f5518b326e18c99ebd3281627',
     'condition': 'not build_with_chromium',
   },
 
@@ -531,7 +531,7 @@
   },
 
   'tools/clang': {
-    'url': '{chromium_git}/chromium/src/tools/clang.git@c81b8b948f36d845d016281fa08e3745af102fa4',
+    'url': '{chromium_git}/chromium/src/tools/clang.git@664e4259b150e07f1a1e440459f59fbc68edb82f',
     'condition': 'not build_with_chromium',
   },
 
@@ -566,7 +566,7 @@
   },
 
   'tools/mb': {
-    'url': '{chromium_git}/chromium/src/tools/mb@df951e112ca036c6b1b6c83c4ec11afcf4228814',
+    'url': '{chromium_git}/chromium/src/tools/mb@c56679b89ffe059f1c5389b09c530cbe447de1f2',
     'condition': 'not build_with_chromium',
   },
 
@@ -576,17 +576,17 @@
   },
 
   'tools/memory': {
-    'url': '{chromium_git}/chromium/src/tools/memory@7235d59a2b9a370731802970c0ea3fa1a4933289',
+    'url': '{chromium_git}/chromium/src/tools/memory@ea8b20f92a00681af15675693f90aef06d35eb6a',
     'condition': 'not build_with_chromium',
   },
 
   'tools/perf': {
-    'url': '{chromium_git}/chromium/src/tools/perf@49df801dea4f6e30be49fb5ed694199e2fd5df6a',
+    'url': '{chromium_git}/chromium/src/tools/perf@184ebcc93f893895c8037c5fed1bcddbb37812df',
     'condition': 'not build_with_chromium',
   },
 
   'tools/protoc_wrapper': {
-    'url': '{chromium_git}/chromium/src/tools/protoc_wrapper@57697a9873d45b2d19117eb76fbf327ba2288095',
+    'url': '{chromium_git}/chromium/src/tools/protoc_wrapper@c16b0dc8db35e95a04eaef88079237634c7f20c2',
     'condition': 'not build_with_chromium',
   },
 
@@ -599,7 +599,7 @@
       'packages': [
         {
           'package': 'skia/tools/goldctl/linux-amd64',
-          'version': 'up6EUcZzuFZnm2JCEV1eW0TwCEAZjPcqtS2CsZN-3qAC',
+          'version': 'rnLFFuc3uwQMer-UqF4iPw87LYBXcTHecmsEr5XSsqEC',
         },
       ],
       'dep_type': 'cipd',
@@ -610,7 +610,7 @@
       'packages': [
         {
           'package': 'skia/tools/goldctl/windows-amd64',
-          'version': 'pLY1rCmGsL8vtV0wWxgqY3sOWkwIxuRh6PMIn_0BDcAC',
+          'version': '93HPekEUblvrn33MgtM_mPQjnsJ5_IqJUTt3XiUUloYC',
         },
       ],
       'dep_type': 'cipd',
@@ -621,18 +621,13 @@
       'packages': [
         {
           'package': 'skia/tools/goldctl/mac-amd64',
-          'version': 'eR_S1Urlw9be4WKiQcXwEcBn9KiDrWknodT82I6vw-kC',
+          'version': 'Js84h2dElAXI-6j3tIs5oGaaEymkLbyu50DlJXn6WJIC',
         },
       ],
       'dep_type': 'cipd',
       'condition': 'checkout_mac and not build_with_chromium',
   },
 
-  'tools/swarming_client': {
-    'url': '{chromium_git}/infra/luci/client-py.git@a32a1607f6093d338f756c7e7c7b4333b0c50c9c',
-    'condition': 'not build_with_chromium',
-  },
-
   # === ANGLE Restricted Trace Generated Code Start ===
   'src/tests/restricted_traces/aliexpress': {
       'packages': [
@@ -714,6 +709,16 @@
       'dep_type': 'cipd',
       'condition': 'checkout_angle_restricted_traces',
   },
+  'src/tests/restricted_traces/blockman_go': {
+      'packages': [
+        {
+            'package': 'angle/traces/blockman_go',
+            'version': 'version:1',
+        },
+      ],
+      'dep_type': 'cipd',
+      'condition': 'checkout_angle_restricted_traces',
+  },
   'src/tests/restricted_traces/brawl_stars': {
       'packages': [
         {
@@ -974,6 +979,16 @@
       'dep_type': 'cipd',
       'condition': 'checkout_angle_restricted_traces',
   },
+  'src/tests/restricted_traces/final_fantasy': {
+      'packages': [
+        {
+            'package': 'angle/traces/final_fantasy',
+            'version': 'version:1',
+        },
+      ],
+      'dep_type': 'cipd',
+      'condition': 'checkout_angle_restricted_traces',
+  },
   'src/tests/restricted_traces/free_fire': {
       'packages': [
         {
@@ -1284,6 +1299,16 @@
       'dep_type': 'cipd',
       'condition': 'checkout_angle_restricted_traces',
   },
+  'src/tests/restricted_traces/pubg_mobile_battle_royale': {
+      'packages': [
+        {
+            'package': 'angle/traces/pubg_mobile_battle_royale',
+            'version': 'version:1',
+        },
+      ],
+      'dep_type': 'cipd',
+      'condition': 'checkout_angle_restricted_traces',
+  },
   'src/tests/restricted_traces/pubg_mobile_lite': {
       'packages': [
         {
@@ -1294,6 +1319,16 @@
       'dep_type': 'cipd',
       'condition': 'checkout_angle_restricted_traces',
   },
+  'src/tests/restricted_traces/pubg_mobile_skydive': {
+      'packages': [
+        {
+            'package': 'angle/traces/pubg_mobile_skydive',
+            'version': 'version:1',
+        },
+      ],
+      'dep_type': 'cipd',
+      'condition': 'checkout_angle_restricted_traces',
+  },
   'src/tests/restricted_traces/ragnarok_m_eternal_love': {
       'packages': [
         {
@@ -1394,6 +1429,16 @@
       'dep_type': 'cipd',
       'condition': 'checkout_angle_restricted_traces',
   },
+  'src/tests/restricted_traces/scrabble_go': {
+      'packages': [
+        {
+            'package': 'angle/traces/scrabble_go',
+            'version': 'version:1',
+        },
+      ],
+      'dep_type': 'cipd',
+      'condition': 'checkout_angle_restricted_traces',
+  },
   'src/tests/restricted_traces/shadow_fight_2': {
       'packages': [
         {
@@ -1434,6 +1479,16 @@
       'dep_type': 'cipd',
       'condition': 'checkout_angle_restricted_traces',
   },
+  'src/tests/restricted_traces/sonic_the_hedgehog': {
+      'packages': [
+        {
+            'package': 'angle/traces/sonic_the_hedgehog',
+            'version': 'version:1',
+        },
+      ],
+      'dep_type': 'cipd',
+      'condition': 'checkout_angle_restricted_traces',
+  },
   'src/tests/restricted_traces/standoff_2': {
       'packages': [
         {
@@ -1544,6 +1599,36 @@
       'dep_type': 'cipd',
       'condition': 'checkout_angle_restricted_traces',
   },
+  'src/tests/restricted_traces/words_with_friends_2': {
+      'packages': [
+        {
+            'package': 'angle/traces/words_with_friends_2',
+            'version': 'version:1',
+        },
+      ],
+      'dep_type': 'cipd',
+      'condition': 'checkout_angle_restricted_traces',
+  },
+  'src/tests/restricted_traces/wordscapes': {
+      'packages': [
+        {
+            'package': 'angle/traces/wordscapes',
+            'version': 'version:1',
+        },
+      ],
+      'dep_type': 'cipd',
+      'condition': 'checkout_angle_restricted_traces',
+  },
+  'src/tests/restricted_traces/world_of_kings': {
+      'packages': [
+        {
+            'package': 'angle/traces/world_of_kings',
+            'version': 'version:1',
+        },
+      ],
+      'dep_type': 'cipd',
+      'condition': 'checkout_angle_restricted_traces',
+  },
   'src/tests/restricted_traces/world_of_tanks_blitz': {
       'packages': [
         {
@@ -2341,7 +2426,7 @@
       'packages': [
           {
               'package': 'chromium/third_party/android_deps/libs/com_google_android_material_material',
-              'version': 'version:2@1.4.0-rc01.cr0',
+              'version': 'version:2@1.5.0-alpha02.cr0',
           },
       ],
       'condition': 'checkout_android and not build_with_chromium',
@@ -3177,7 +3262,7 @@
       'packages': [
           {
               'package': 'chromium/third_party/android_deps/libs/org_jetbrains_kotlin_kotlin_stdlib',
-              'version': 'version:2@1.5.10.cr0',
+              'version': 'version:2@1.5.30.cr0',
           },
       ],
       'condition': 'checkout_android and not build_with_chromium',
@@ -3188,7 +3273,7 @@
       'packages': [
           {
               'package': 'chromium/third_party/android_deps/libs/org_jetbrains_kotlin_kotlin_stdlib_common',
-              'version': 'version:2@1.5.10.cr0',
+              'version': 'version:2@1.5.30.cr0',
           },
       ],
       'condition': 'checkout_android and not build_with_chromium',
diff --git a/OWNERS b/OWNERS
index a657ee6..c0cac39 100644
--- a/OWNERS
+++ b/OWNERS
@@ -1,14 +1,28 @@
-# See https://chromium.googlesource.com/angle/angle/+/master/doc/ContributingCode.md#selecting-reviewers for more info
+# See https://chromium.googlesource.com/angle/angle/+/main/doc/ContributingCode.md#selecting-reviewers for more info
+# Note: Owners must be split by domain to avoid git merge conflicts on platforms that cannot have
+# email addresses from all platforms.  Also, to avoid downstream git merge conflicts, all changes
+# to this file should be done in the upstream ANGLE repository's main branch.
+
+# @chromium.org email addresses:
+geofflang@chromium.org
+jmadill@chromium.org
+syoussefi@chromium.org
+ynovikov@chromium.org
+
+# @google.com email addresses:
+cclao@google.com
 cnorthrop@google.com
-courtneygo@google.com
 geofflang@google.com
 ianelliott@google.com
 jmadill@google.com
+jonahr@google.com
 syoussefi@google.com
 timvp@google.com
-tobine@google.com
 ynovikov@google.com
-timvp@google.com
+
+# The auto-roller can also modify autogenerated files, so we give it ownership
+# over all ANGLE files.
+angle-autoroll@skia-public.iam.gserviceaccount.com
 
 per-file AUTHORS=*
 per-file CONTRIBUTORS=*
diff --git a/OWNERS.android b/OWNERS.android
index aa33e01..9a022b4 100644
--- a/OWNERS.android
+++ b/OWNERS.android
@@ -1,4 +1,8 @@
+# To avoid downstream merge conflicts, this file should only be changed in the aosp/master branch
+cclao@google.com
+cnorthrop@google.com
 geofflang@google.com
+ianelliott@google.com
 jmadill@google.com
 jonahr@google.com
 natsu@google.com
diff --git a/doc/BranchingAndRolling.md b/doc/BranchingAndRolling.md
index 07374b4..90f9272 100644
--- a/doc/BranchingAndRolling.md
+++ b/doc/BranchingAndRolling.md
@@ -6,27 +6,40 @@
 describes how to update that dependency, and, if necessary, create an ANGLE
 branch to correspond to a branched release of Chrome.
 
-## Rolling DEPS
+ANGLE's commit queue also runs browser-level tests which are hosted in
+the Chromium repository. To reduce the chance of a Chromium-side
+change breaking ANGLE's CQ, the version of Chromium against which
+ANGLE changes is also snapshotted, and rolled forward into ANGLE with
+appropriate testing.
+
+## Autorollers
+
+At present, autorollers manage both the ANGLE roll into Chromium, and
+the Chromium roll into ANGLE. All of the ANGLE-related autorollers are
+documented in the [ANGLE Wrangling
+documentation](../infra/ANGLEWrangling.md#the-auto-rollers).
+
+## Manually rolling DEPS
 
 Chromium's dependency on third-party projects is tracked in [the Chromium
-repository's src/DEPS file]
-(http://src.chromium.org/viewvc/chrome/trunk/src/DEPS). To update the ANGLE
+repository's src/DEPS file](http://src.chromium.org/viewvc/chrome/trunk/src/DEPS). To update the ANGLE
 dependency:
 
  * Find the line in this file that defines "src/third\_party/angle"
 for deps (**not** deps\_os)
- * Change the [git SHA-1 revision number]
-(http://git-scm.com/book/ch6-1.html) to be that of the commit on which Chromium
-should depend. Please use the full SHA-1, not a shortened version.
- * You can
-find the SHA-1 for a particular commit with `git log` on the appropriate branch
-of the repository, or via [the public repository viewer]
-(https://chromium.googlesource.com/angle/angle).
- * If using the public repository viewer, you will need to select the branch whose log you wish to view
-from the list on the left-hand side, and then click on the "tree" link at the
-top of the resulting page. Alternatively, you can navigate to
-`https://chromium.googlesource.com/angle/angle/+/<branch name>/` -- including
-the terminating forward slash. (e.g.
+ * Change the [git SHA-1 revision
+number](http://git-scm.com/book/ch6-1.html) to be that of the commit
+on which Chromium should depend. Please use the full SHA-1, not a
+shortened version.
+ * You can find the SHA-1 for a particular commit with `git log` on the
+appropriate branch of the repository, or via [the public repository
+viewer](https://chromium.googlesource.com/angle/angle).
+ * If using the public repository viewer, you will need to select the
+branch whose log you wish to view from the list on the left-hand side,
+and then click on the "tree" link at the top of the resulting
+page. Alternatively, you can navigate to
+`https://chromium.googlesource.com/angle/angle/+/<branch name>/` --
+including the terminating forward slash. (e.g.
 `https://chromium.googlesource.com/angle/angle/+/main/`)
 
 ## Branching ANGLE
@@ -42,11 +55,12 @@
  * Determine what the ANGLE dependency is for the Chrome release
 by checking the DEPS file for that branch.
  * Check out this commit as a new branch in your local repository.
-    * e.g., for [the Chrome 34 release at chrome/branches/1847]
-(http://src.chromium.org/viewvc/chrome/branches/1847/src/DEPS), the ANGLE
-version is 4df02c1ed5e97dd54576b06964b1da67ea30238e. To check this commit out
-locally and create a new branch named 'mybranch' from this commit, use: ```git
-checkout -b mybranch 4df02c1ed5e97dd54576b06964b1da67ea30238e```
+   * e.g., for [the Chrome 34 release at
+chrome/branches/1847](http://src.chromium.org/viewvc/chrome/branches/1847/src/DEPS),
+the ANGLE version is 4df02c1ed5e97dd54576b06964b1da67ea30238e. To
+check this commit out locally and create a new branch named 'mybranch'
+from this commit, use: ```git checkout -b mybranch
+4df02c1ed5e97dd54576b06964b1da67ea30238e```
  * To create this new branch in the public repository, you'll need to push the
 branch to the special Gerrit reference location, 'refs/heads/<branch name>'. You
 must be an ANGLE administrator to be able to push this new branch.
diff --git a/doc/DevSetup.md b/doc/DevSetup.md
index 17c458b..3bb5839 100644
--- a/doc/DevSetup.md
+++ b/doc/DevSetup.md
@@ -56,6 +56,7 @@
 
 GN will generate ninja files. To change the default build options run `gn args out/Debug`.  Some commonly used options are:
 ```
+is_component_build = false      (links dependencies into the build targets)
 target_cpu = "x86"              (default is "x64")
 is_clang = false                (to use system default compiler instead of clang)
 is_debug = false                (for release builds. is_debug = true is the default)
@@ -65,6 +66,9 @@
 For a release build run `gn args out/Release` and set `is_debug = false`.
 
 On Windows, you can build for the Universal Windows Platform (UWP) by setting `target_os = "winuwp"` in the args.
+Setting `is_component_build = false` is highly recommended to support moving libEGL.dll and libGLESv2.dll to an
+application's directory and being self-contained, instead of depending on other DLLs (d3dcompiler_47.dll is still
+needed for the Direct3D backend).
 
 For more information on GN run `gn help`.
 
diff --git a/doc/Orientation.md b/doc/Orientation.md
index ecaf25d..47c8724 100644
--- a/doc/Orientation.md
+++ b/doc/Orientation.md
@@ -22,7 +22,7 @@
 - (recommended) Download and install [Git for Windows](http://gitforwindows.org/).
 
 - Open Git bash, head to C:/src and follow the steps on
-  [the ANGLE wiki](https://chromium.googlesource.com/angle/angle/+/master/doc/DevSetup.md#Development-setup-Getting-the-source)
+  [the ANGLE wiki](https://chromium.googlesource.com/angle/angle/+/main/doc/DevSetup.md#Development-setup-Getting-the-source)
   to set up the ANGLE solution for the first time.
 
 - The VS 2017 solution will be in `c:/src/angle/out/sln/ANGLE.sln`. Open and let the installation
@@ -47,7 +47,7 @@
 - Ensure you add `depot_tools` to your bashrc as in the wiki link above.
 
 - Follow the steps on
-  [the ANGLE wiki](https://chromium.googlesource.com/angle/angle/+/master/doc/DevSetup.md#Development-setup-Getting-the-source)
+  [the ANGLE wiki](https://chromium.googlesource.com/angle/angle/+/main/doc/DevSetup.md#Development-setup-Getting-the-source)
   to setup ANGLE's build.
 
 - Building should work at this point! Follow the steps on the Wiki.
@@ -60,11 +60,11 @@
   ANGLE checks out a copy in `<angledir>/third_party/cherry`.
 
 - Follow the instructions in the
-  [installation README](https://android.googlesource.com/platform/external/cherry/+/refs/heads/master/README)
+  [installation README](https://android.googlesource.com/platform/external/cherry/+/refs/heads/main/README)
   to get it running. On Windows, use 64-bit.
 
 - Read up on testing with
-  [dEQP on the ANGLE Wiki](https://chromium.googlesource.com/angle/angle/+/master/doc/dEQP.md).
+  [dEQP on the ANGLE Wiki](https://chromium.googlesource.com/angle/angle/+/main/doc/dEQP.md).
 
 - Try running `angle_deqp_gles2_tests_no_gtest` with the flag
   `--deqp-case=dEQP-GLES2.functional.negative_api.*` and load a test report in Cherry.
diff --git a/doc/dEQP.md b/doc/dEQP.md
index 05d5cb1..1b8f109 100644
--- a/doc/dEQP.md
+++ b/doc/dEQP.md
@@ -80,6 +80,6 @@
 ```
 After the tests finish, get the results with
 ```
-adb pull /sdcard/chromium_tests_root/third_party/angle/third_party/deqp/src/data/TestResults.qpa .
+adb pull /sdcard/chromium_tests_root/gen/vk_gl_cts_data/data/TestResults.qpa .
 ```
 Note: this location might change, one can double-check with `adb logcat -d | grep qpa`.
diff --git a/extensions/EGL_ANGLE_create_surface_swap_interval.txt b/extensions/EGL_ANGLE_create_surface_swap_interval.txt
new file mode 100644
index 0000000..f112af5
--- /dev/null
+++ b/extensions/EGL_ANGLE_create_surface_swap_interval.txt
@@ -0,0 +1,85 @@
+Name
+
+    ANGLE_create_surface_swap_interval
+
+Name Strings
+
+    EGL_ANGLE_create_surface_swap_interval
+
+Contributors
+
+    Jamie Madill
+
+Contacts
+
+    Jamie Madill (jmadill 'at' google.com)
+
+Status
+
+    Draft
+
+Version
+
+    Version 1, Aug 16, 2021
+
+Number
+
+    EGL Extension #??
+
+Dependencies
+
+    Requires EGL 1.5.
+
+    Written against the EGL 1.5 specification.
+
+Overview
+
+    This extension allows the user to create a surface with a specified
+    swap interval, instead of first creating the surface then using
+    eglSwapInterval to change the default. In some cases this can lead to
+    less reconfiguration during surface initialization.
+
+New Types
+
+    None
+
+New Procedures and Functions
+
+    None
+
+New Tokens
+
+    Accepted as an attribute name in the <*attrib_list> argument to
+    eglCreateWindowSurface:
+
+        EGL_SWAP_INTERVAL_ANGLE 0x322F
+
+Additions to the EGL 1.5 Specification
+
+    Append to section 3.5.1 "Creating On-Screen Rendering Surfaces"
+
+    EGL_SWAP_INTERVAL_ANGLE specifies the initial swap interval used when
+    that will elapse before a buffer swap takes place.
+    The default value of EGL_SWAP_INTERVAL_ANGLE is 1.
+
+Errors
+
+    None
+
+New State
+
+    None
+
+Conformance Tests
+
+    TBD
+
+Issues
+
+    None
+
+Revision History
+
+    Rev.    Date         Author     Changes
+    ----  -------------  ---------  ----------------------------------------
+      1   Aug 16, 2021   jmadill    Initial version
diff --git a/extensions/EGL_ANGLE_d3d_texture_client_buffer.txt b/extensions/EGL_ANGLE_d3d_texture_client_buffer.txt
index 8f3b615..b8bc29d 100644
--- a/extensions/EGL_ANGLE_d3d_texture_client_buffer.txt
+++ b/extensions/EGL_ANGLE_d3d_texture_client_buffer.txt
@@ -149,6 +149,10 @@
                        DXGI_FORMAT_R16G16B16A16_FLOAT,
                        DXGI_FORMAT_R32G32B32A32_FLOAT,
                        DXGI_FORMAT_R10G10B10A2_UNORM,
+                       DXGI_FORMAT_R8_UNORM,
+                       DXGI_FORMAT_R16_UNORM,
+                       DXGI_FORMAT_R8G8_UNORM,
+                       DXGI_FORMAT_R16G16_UNORM,
                        DXGI_FORMAT_NV12,
                        DXGI_FORMAT_P010, or
                        DXGI_FORMAT_P016.
@@ -158,14 +162,22 @@
                        DXGI_FORMAT_P016, and must be 0 or 1. It is ignored for
                        all non-YUV formats.
 
-                       EGL_TEXTURE_INTERNAL_FORMAT_ANGLE (if supported) must be
-                       GL_RGBA (supported for all non-YUV formats),
-                       GL_RGB (supported for all non-YUV formats except
+                       EGL_TEXTURE_INTERNAL_FORMAT_ANGLE (if specified) must be
+                       GL_RGBA (supported for all RGBA and BGRA formats),
+                       GL_RGB (supported for all RGBA and BGRA formats except
                                DXGI_FORMAT_R10G10B10A2_UNORM),
                        GL_BGRA_EXT (supported only for
                                     DXGI_FORMAT_B8G8R8A8_UNORM,
-                                    DXGI_FORMAT_B8G8R8A8_UNORM_SRGB, or
-                                    DXGI_FORMAT_B8G8R8A8_TYPELESS).
+                                    DXGI_FORMAT_B8G8R8A8_UNORM_SRGB, and
+                                    DXGI_FORMAT_B8G8R8A8_TYPELESS),
+                       GL_RGB10_A2_EXT (supported for
+                                        DXGI_FORMAT_R10G10B10A2_UNORM),
+                       GL_RED_EXT (supported for DXGI_FORMAT_R8_UNORM
+                                   and DXGI_FORMAT_R16_UNORM),
+                       GL_RG_EXT (supported for DXGI_FORMAT_R8G8_UNORM
+                                  and DXGI_FORMAT_R16G16_UNORM),
+                       GL_R16_EXT (supported for DXGI_FORMAT_R16_UNORM), or
+                       GL_RG16_EXT (supported for DXGI_FORMAT_R16G16_UNORM).
                        It is ignored for all YUV formats.
     --------------------------------------------------------------------------
     Table egl.restrictions - Restrictions on D3D resources that can be used
@@ -226,6 +238,8 @@
 
 Revision History
 
+    Version 9, 2021/09/07 - added support for R/RG formats and GL_RGB10_A2_EXT.
+
     Version 8, 2021/01/13 - added support for texture array.
 
     Version 7, 2021/01/12 - added support for NV12/P010/P016 planar formats.
diff --git a/gni/angle.gni b/gni/angle.gni
index ae27200..7470701 100644
--- a/gni/angle.gni
+++ b/gni/angle.gni
@@ -41,9 +41,7 @@
   }
 
   angle_use_x11 = use_x11 && !is_ggp
-  angle_use_vulkan_display =
-      is_linux && !use_x11 && !is_ggp &&
-      (!use_ozone || is_chromecast || ozone_platform_headless)
+  angle_use_vulkan_display = is_linux && !is_ggp
 } else {
   declare_args() {
     is_ubsan = false
@@ -62,7 +60,7 @@
   }
 
   declare_args() {
-    angle_use_vulkan_display = is_linux && !angle_use_x11 && !is_ggp
+    angle_use_vulkan_display = is_linux && !is_ggp
   }
 }
 
@@ -70,7 +68,7 @@
 angle_data_dir = "angledata"
 
 declare_args() {
-  angle_assert_always_on = build_with_chromium && dcheck_always_on
+  angle_assert_always_on = dcheck_always_on
 
   if (current_cpu == "arm64" || current_cpu == "x64" ||
       current_cpu == "mips64el" || current_cpu == "s390x" ||
@@ -83,6 +81,9 @@
   } else {
     assert(false, "Unknown current CPU: $current_cpu")
   }
+
+  # Indicate if the rapidJSON library is available to build with in third_party/.
+  angle_has_rapidjson = angle_has_build
 }
 
 declare_args() {
@@ -116,6 +117,9 @@
 
   # Currently Windows on Arm doesn't support OpenGL or Vulkan.
   is_win_arm64 = is_win && target_cpu == "arm64"
+
+  # Frame capture code is enabled by default if rapidjson is available.
+  angle_has_frame_capture = angle_has_rapidjson
 }
 
 declare_args() {
@@ -172,6 +176,10 @@
   angle_enable_swiftshader =
       angle_enable_vulkan && !is_android && !is_fuchsia && !is_ggp
 
+  # Translator frontend support:
+  angle_enable_desktop_glsl = angle_enable_gl_desktop
+
+  # Translator backend support:
   angle_enable_hlsl = angle_enable_d3d9 || angle_enable_d3d11
   angle_enable_essl = angle_enable_gl || use_ozone
   angle_enable_glsl = angle_enable_gl || use_ozone
@@ -179,13 +187,11 @@
   angle_enable_trace_android_logcat = false
 
   # Disable the layers in ubsan builds because of really slow builds.
-  # TODO(anglebug.com/4082) enable validation layers on mac for swiftshader
   # Vulkan Validation Layers require Android NDK API level 26, i.e. Oreo, due to
   # Vulkan Validation Layers compatibility issues, see http://crrev/c/1405714.
   angle_enable_vulkan_validation_layers =
       angle_enable_vulkan && !is_ubsan && !is_tsan && !is_asan &&
-      angle_debug_layers_enabled && !is_mac &&
-      (!is_android || ndk_api_level_at_least_26)
+      angle_debug_layers_enabled && (!is_android || ndk_api_level_at_least_26)
 
   # ISpriteVisual windows cannot be validated and can lead to crashes if an invalid window is
   # provided to ANGLE. Disable them for non-standalone ANGLE builds. crbug.com/1176118
@@ -217,6 +223,10 @@
   # TODO(jdarpinian): Support enabling CGL and EAGL at the same time using the soft linking code. Also support disabling both for Metal-only builds.
   angle_enable_cgl = angle_enable_gl && !angle_enable_eagl && is_apple
 
+  angle_enable_apple_translator_workarounds =
+      is_apple &&
+      (angle_enable_glsl || angle_enable_metal || use_fuzzing_engine)
+
   angle_has_histograms = angle_has_build
 }
 
@@ -536,8 +546,8 @@
                 "${_trace_prefix}.h",
               ] + invoker.sources
 
-    # TODO(http://anglebug.com/5878): Revert back to non-autogen'ed file names for the angledata.gz.
-    data = [ invoker.angledata ]
+    # TODO(http://anglebug.com/5133): Revert back to non-autogen'ed data.
+    data = invoker.data
     defines = [ "ANGLE_REPLAY_IMPLEMENTATION" ]
     suppressed_configs += [ "$angle_root:constructor_and_destructor_warnings" ]
 
diff --git a/include/EGL/eglext_angle.h b/include/EGL/eglext_angle.h
index 108bee1..43575a7 100644
--- a/include/EGL/eglext_angle.h
+++ b/include/EGL/eglext_angle.h
@@ -355,6 +355,11 @@
 #define EGL_EXTERNAL_CONTEXT_SAVE_STATE_ANGLE 0x3490
 #endif /* EGL_ANGLE_external_context_and_surface */
 
+#ifndef EGL_ANGLE_create_surface_swap_interval
+#define EGL_ANGLE_create_surface_swap_interval 1
+#define EGL_SWAP_INTERVAL_ANGLE 0x322F
+#endif /* EGL_ANGLE_create_surface_swap_interval */
+
 // clang-format on
 
 #endif  // INCLUDE_EGL_EGLEXT_ANGLE_
diff --git a/include/GLSLANG/ShaderLang.h b/include/GLSLANG/ShaderLang.h
index 18aa8c8..ad7fc29 100644
--- a/include/GLSLANG/ShaderLang.h
+++ b/include/GLSLANG/ShaderLang.h
@@ -26,7 +26,7 @@
 
 // Version number for shader translation API.
 // It is incremented every time the API changes.
-#define ANGLE_SH_VERSION 261
+#define ANGLE_SH_VERSION 266
 
 enum ShShaderSpec
 {
@@ -236,13 +236,7 @@
 // ShBuiltInResources in vertex shaders.
 const ShCompileOptions SH_CLAMP_POINT_SIZE = UINT64_C(1) << 32;
 
-// Turn some arithmetic operations that operate on a float vector-scalar pair into vector-vector
-// operations. This is done recursively. Some scalar binary operations inside vector constructors
-// are also turned into vector operations.
-//
-// This is targeted to work around a bug in NVIDIA OpenGL drivers that was reproducible on NVIDIA
-// driver version 387.92. It works around the most common occurrences of the bug.
-const ShCompileOptions SH_REWRITE_VECTOR_SCALAR_ARITHMETIC = UINT64_C(1) << 33;
+// Bit 33 is available.
 
 // Don't use loops to initialize uninitialized variables. Only has an effect if some kind of
 // variable initialization is turned on.
@@ -341,9 +335,6 @@
 // non-assert-enabled builds to avoid increasing ANGLE's binary size while both generators coexist.
 const ShCompileOptions SH_GENERATE_SPIRV_DIRECTLY = UINT64_C(1) << 58;
 
-// Generate workarounds in SPIR-V for buggy code.
-const ShCompileOptions SH_GENERATE_SPIRV_WORKAROUNDS = UINT64_C(1) << 59;
-
 // The 64 bits hash function. The first parameter is the input string; the
 // second parameter is the string length.
 using ShHashFunction64 = khronos_uint64_t (*)(const char *, size_t);
@@ -375,7 +366,6 @@
     int EXT_draw_buffers;
     int EXT_frag_depth;
     int EXT_shader_texture_lod;
-    int WEBGL_debug_shader_precision;
     int EXT_shader_framebuffer_fetch;
     int EXT_shader_framebuffer_fetch_non_coherent;
     int NV_shader_framebuffer_fetch;
@@ -409,6 +399,7 @@
     int EXT_texture_buffer;
     int OES_sample_variables;
     int EXT_clip_cull_distance;
+    int EXT_primitive_bounding_box;
 
     // Set to 1 to enable replacing GL_EXT_draw_buffers #extension directives
     // with GL_NV_draw_buffers in ESSL output. This flag can be used to emulate
diff --git a/include/GLSLANG/ShaderVars.h b/include/GLSLANG/ShaderVars.h
index 67a4039..2fecdd0 100644
--- a/include/GLSLANG/ShaderVars.h
+++ b/include/GLSLANG/ShaderVars.h
@@ -33,6 +33,8 @@
     INTERPOLATION_NOPERSPECTIVE
 };
 
+const char *InterpolationTypeToString(InterpolationType type);
+
 // Validate link & SSO consistency of interpolation qualifiers
 bool InterpolationTypesMatch(InterpolationType a, InterpolationType b);
 
@@ -46,6 +48,8 @@
     BLOCKLAYOUT_SHARED
 };
 
+const char *BlockLayoutTypeToString(BlockLayoutType type);
+
 // Interface Blocks, see section 4.3.9 of the ESSL 3.10 spec
 enum class BlockType
 {
@@ -53,6 +57,8 @@
     BLOCK_BUFFER,
 };
 
+const char *BlockTypeToString(BlockType type);
+
 // Base class for all variables defined in shaders, including Varyings, Uniforms, etc
 // Note: we must override the copy constructor and assignment operator so we can
 // work around excessive GCC binary bloating:
diff --git a/include/platform/FeaturesGL.h b/include/platform/FeaturesGL.h
index 97ce6a8..cf70217 100644
--- a/include/platform/FeaturesGL.h
+++ b/include/platform/FeaturesGL.h
@@ -205,15 +205,6 @@
         "The point size range reported from the API is inconsistent with the actual behavior",
         &members};
 
-    // On some NVIDIA drivers certain types of GLSL arithmetic ops mixing vectors and scalars may be
-    // executed incorrectly. Change them in the shader translator. Tracking bug:
-    // http://crbug.com/772651
-    Feature rewriteVectorScalarArithmetic = {"rewrite_vector_scalar_arithmetic",
-                                             FeatureCategory::OpenGLWorkarounds,
-                                             "Certain types of GLSL arithmetic ops mixing vectors "
-                                             "and scalars may be executed incorrectly",
-                                             &members, "http://crbug.com/772651"};
-
     // On some Android devices for loops used to initialize variables hit native GLSL compiler bugs.
     Feature dontUseLoopsToInitializeVariables = {
         "dont_use_loops_to_initialize_variables", FeatureCategory::OpenGLWorkarounds,
@@ -562,6 +553,13 @@
         "chunked_texture_upload", FeatureCategory::OpenGLWorkarounds,
         "Upload texture data in <120kb chunks to work around Mac driver hangs and crashes.",
         &members, "http://crbug.com/1181068"};
+
+    // Qualcomm drivers may sometimes reject immutable ASTC sliced 3D texture
+    // allocation. Instead, use non-immutable allocation internally.
+    Feature emulateImmutableCompressedTexture3D = {
+        "emulate_immutable_compressed_texture_3d", FeatureCategory::OpenGLWorkarounds,
+        "Use non-immutable texture allocation to work around a driver bug.", &members,
+        "https://crbug.com/1060012"};
 };
 
 inline FeaturesGL::FeaturesGL()  = default;
diff --git a/include/platform/FeaturesMtl.h b/include/platform/FeaturesMtl.h
index 40563dc..a38c611 100644
--- a/include/platform/FeaturesMtl.h
+++ b/include/platform/FeaturesMtl.h
@@ -109,6 +109,12 @@
                                      "Direct translation to SPIR-V.", &members,
                                      "http://anglebug.com/4889"};
 
+    // Generate Metal directly instead of generating SPIR-V and then using SPIR-V Cross.  Transitory
+    // feature until the work is complete.
+    Feature directMetalGeneration = {"directMetalGeneration", FeatureCategory::MetalFeatures,
+                                     "Direct translation to Metal.", &members,
+                                     "http://anglebug.com/5505"};
+
     Feature forceNonCSBaseMipmapGeneration = {
         "force_non_cs_mipmap_gen", FeatureCategory::MetalFeatures,
         "Turn this feature on to disallow Compute Shader based mipmap generation. Compute Shader "
diff --git a/include/platform/FeaturesVk.h b/include/platform/FeaturesVk.h
index e1a4e8f..45dd81d 100644
--- a/include/platform/FeaturesVk.h
+++ b/include/platform/FeaturesVk.h
@@ -90,14 +90,6 @@
         "supportsIncrementalPresent", FeatureCategory::VulkanFeatures,
         "VkDevice supports the VK_KHR_incremental_present extension", &members};
 
-    // Whether texture copies on cube map targets should be done on GPU.  This is a workaround for
-    // Intel drivers on windows that have an issue with creating single-layer views on cube map
-    // textures.
-    Feature forceCPUPathForCubeMapCopy = {
-        "forceCPUPathForCubeMapCopy", FeatureCategory::VulkanWorkarounds,
-        "Some drivers have an issue with creating single-layer views on cube map textures",
-        &members};
-
     // Whether the VkDevice supports the VK_ANDROID_external_memory_android_hardware_buffer
     // extension, on which the EGL_ANDROID_image_native_buffer extension can be layered.
     Feature supportsAndroidHardwareBuffer = {
@@ -199,6 +191,11 @@
         "Transform feedback uses the VK_EXT_transform_feedback extension.", &members,
         "http://anglebug.com/3206"};
 
+    Feature supportsGeometryStreamsCapability = {
+        "supportsGeometryStreamsCapability", FeatureCategory::VulkanFeatures,
+        "Implementation supports the GeometryStreams SPIR-V capability.", &members,
+        "http://anglebug.com/3206"};
+
     // Whether the VkDevice supports the VK_EXT_index_type_uint8 extension
     // http://anglebug.com/4405
     Feature supportsIndexTypeUint8 = {"supportsIndexTypeUint8", FeatureCategory::VulkanFeatures,
@@ -506,12 +503,6 @@
                                      "Direct translation to SPIR-V.", &members,
                                      "http://anglebug.com/4889"};
 
-    // Whether SPIR-V should be generated with workarounds for buggy drivers.
-    Feature directSPIRVGenerationWorkarounds = {
-        "directSPIRVGenerationWorkarounds", FeatureCategory::VulkanWorkarounds,
-        "Work around driver bugs when translating to SPIR-V.", &members,
-        "http://anglebug.com/6110"};
-
     // Whether we should use driver uniforms over specialization constants for some shader
     // modifications like yflip and rotation.
     Feature forceDriverUniformOverSpecConst = {
diff --git a/include/platform/FrontendFeatures.h b/include/platform/FrontendFeatures.h
index db63745..6b7e631 100644
--- a/include/platform/FrontendFeatures.h
+++ b/include/platform/FrontendFeatures.h
@@ -77,9 +77,21 @@
         "enableCompressingPipelineCacheInThreadPool", angle::FeatureCategory::FrontendWorkarounds,
         "Enable compressing pipeline cache in thread pool.", &members, "http://anglebug.com/4722"};
 
+    // Forces on robust resource init. Useful for some tests to avoid undefined values.
     angle::Feature forceRobustResourceInit = {
-        "forceRobustResourceInit", angle::FeatureCategory::FrontendWorkarounds,
+        "forceRobustResourceInit", angle::FeatureCategory::FrontendFeatures,
         "Force-enable robust resource init", &members, "http://anglebug.com/6041"};
+
+    // Forces on shader variable init to avoid undefined values in tests. This feature is enabled
+    // for WebGL and frame capture, which both require deterministic results.
+    angle::Feature forceInitShaderVariables = {
+        "forceInitShaderVariables", angle::FeatureCategory::FrontendFeatures,
+        "Force-enable shader variable initialization", &members};
+
+    angle::Feature enableProgramBinaryForCapture = {
+        "enableProgramBinaryForCapture", angle::FeatureCategory::FrontendFeatures,
+        "Even if FrameCapture is enabled, enable GL_OES_get_program_binary", &members,
+        "http://anglebug.com/5658"};
 };
 
 inline FrontendFeatures::FrontendFeatures()  = default;
diff --git a/infra/ANGLEWrangling.md b/infra/ANGLEWrangling.md
index 4b919cb..1395069 100644
--- a/infra/ANGLEWrangling.md
+++ b/infra/ANGLEWrangling.md
@@ -90,7 +90,7 @@
  1. Use this URL:
     `https://chromium.googlesource.com/angle/angle.git/+log/<last passing revision>..<first failing revision>`
 
-## Task 3: The Auto-Rollers
+## <a name="the-auto-rollers"></a>Task 3: The Auto-Rollers
 
 The [ANGLE auto-roller](https://autoroll.skia.org/r/angle-chromium-autoroll) automatically updates
 Chrome with the latest ANGLE changes.
@@ -100,16 +100,17 @@
  1. **Chrome Branching**: You are responsible for pausing the roller 24h before branch days, and resuming afterwards.
     See the [Chrome Release Schedule](https://chromiumdash.appspot.com/schedule).
 
-We also use additional auto-rollers to roll third party libraries into ANGLE once per day:
+We also use additional auto-rollers to roll third party libraries, and Chromium, into ANGLE once per day:
 
  * [SwiftShader into ANGLE](https://autoroll.skia.org/r/swiftshader-angle-autoroll)
  * [vulkan-deps into ANGLE](https://autoroll.skia.org/r/vulkan-deps-angle-autoroll)
  * [VK-GL-CTS into ANGLE](https://autoroll.skia.org/r/vk-gl-cts-angle-autoroll?tab=status)
+ * [Chromium into ANGLE](https://autoroll.skia.org/r/chromium-angle-autoroll)
 
 Please ensure these rollers are also healthy and unblocked. You can trigger manual rolls using the
-dashboards to land high-priority changes. When a roll fails, stop the roller, determine if the root
-cause is a problem with ANGLE or with the upstream repo, and file an issue with an appropriate next
-step.
+dashboards to land high-priority changes, for example Chromium-side test expectation updates or
+suppressions. When a roll fails, stop the roller, determine if the root cause is a problem with
+ANGLE or with the upstream repo, and file an issue with an appropriate next step.
 
 The autoroller configurations live in the [skia/buildbot repository](https://skia.googlesource.com/buildbot/)
 in the [autoroll/config](https://skia.googlesource.com/buildbot/+/main/autoroll/config) folder.
diff --git a/infra/README.md b/infra/README.md
index a9b54d2..f5b26c8 100644
--- a/infra/README.md
+++ b/infra/README.md
@@ -19,17 +19,17 @@
  * Windows 32-bit AMD and Windows 64-bit Intel and NVIDIA GPUs
  * Linux 64-bit NVIDIA and Intel GPUs
  * Mac NVIDIA, Intel and AMD GPUs
- * Pixel 2 and Nexus 5X
+ * Pixel 4 and Nexus 5X
  * Fuchsia testing in a VM
 
 Looking at an example build shows how tests are split up between machines. See for example:
 
-[`https://ci.chromium.org/ui/p/chromium/builders/try/mac-angle-try/454/overview`](https://ci.chromium.org/ui/p/chromium/builders/try/mac-angle-try/454/overview)
+[`https://ci.chromium.org/ui/p/angle/builders/ci/mac-rel/8123/overview`](https://ci.chromium.org/ui/p/angle/builders/ci/mac-rel/8123/overview)
 
-This build ran 81 test steps across 3 GPU families. In some cases (e.g.
+This build ran 68 test steps across 3 GPU families. In some cases (e.g.
 `angle_deqp_gles3_metal_tests`) the test is split up between multiple machines to
-run faster (in this case 4 different machines at once). This build took 15
-minutes to complete 1 hour of real automated testing.
+run faster (in this case 2 different machines at once). This build took 23
+minutes to complete 72 minutes of real automated testing.
 
 For more details on running and working with our test sets see the docs in [Contributing Code][Contrib].
 
diff --git a/infra/config/README.md b/infra/config/README.md
index 416da06..5e0347f 100644
--- a/infra/config/README.md
+++ b/infra/config/README.md
@@ -6,4 +6,4 @@
 Currently active version can be checked at
 https://luci-config.appspot.com/#/projects/angle .
 
-[docs]: https://chromium.googlesource.com/infra/luci/luci-go/+/refs/heads/master/lucicfg/doc/README.md
+[docs]: https://chromium.googlesource.com/infra/luci/luci-go/+/refs/heads/main/lucicfg/doc/README.md
diff --git a/infra/config/generated/cr-buildbucket.cfg b/infra/config/generated/cr-buildbucket.cfg
index cb9f45c..996f1bc 100644
--- a/infra/config/generated/cr-buildbucket.cfg
+++ b/infra/config/generated/cr-buildbucket.cfg
@@ -23,13 +23,27 @@
         cipd_version: "refs/heads/master"
         cmd: "recipes"
       }
-      properties: "{\"$build/goma\":{\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"},\"builder_group\":\"angle\",\"platform\":\"android\",\"recipe\":\"angle\",\"test_mode\":\"compile_only\",\"toolchain\":\"clang\"}"
+      properties:
+        '{'
+        '  "$build/goma": {'
+        '    "rpc_extra_params": "?prod",'
+        '    "server_host": "goma.chromium.org"'
+        '  },'
+        '  "builder_group": "angle",'
+        '  "platform": "android",'
+        '  "recipe": "angle",'
+        '  "test_mode": "compile_only",'
+        '  "toolchain": "clang"'
+        '}'
       build_numbers: YES
       service_account: "angle-ci-builder@chops-service-accounts.iam.gserviceaccount.com"
       experiments {
         key: "luci.use_realms"
         value: 100
       }
+      resultdb {
+        enable: true
+      }
     }
     builders {
       name: "android-arm-rel"
@@ -40,13 +54,27 @@
         cipd_version: "refs/heads/master"
         cmd: "recipes"
       }
-      properties: "{\"$build/goma\":{\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"},\"builder_group\":\"angle\",\"platform\":\"android\",\"recipe\":\"angle\",\"test_mode\":\"compile_only\",\"toolchain\":\"clang\"}"
+      properties:
+        '{'
+        '  "$build/goma": {'
+        '    "rpc_extra_params": "?prod",'
+        '    "server_host": "goma.chromium.org"'
+        '  },'
+        '  "builder_group": "angle",'
+        '  "platform": "android",'
+        '  "recipe": "angle",'
+        '  "test_mode": "compile_only",'
+        '  "toolchain": "clang"'
+        '}'
       build_numbers: YES
       service_account: "angle-ci-builder@chops-service-accounts.iam.gserviceaccount.com"
       experiments {
         key: "luci.use_realms"
         value: 100
       }
+      resultdb {
+        enable: true
+      }
     }
     builders {
       name: "android-arm64-dbg"
@@ -57,13 +85,27 @@
         cipd_version: "refs/heads/master"
         cmd: "recipes"
       }
-      properties: "{\"$build/goma\":{\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"},\"builder_group\":\"angle\",\"platform\":\"android\",\"recipe\":\"angle\",\"test_mode\":\"compile_only\",\"toolchain\":\"clang\"}"
+      properties:
+        '{'
+        '  "$build/goma": {'
+        '    "rpc_extra_params": "?prod",'
+        '    "server_host": "goma.chromium.org"'
+        '  },'
+        '  "builder_group": "angle",'
+        '  "platform": "android",'
+        '  "recipe": "angle",'
+        '  "test_mode": "compile_only",'
+        '  "toolchain": "clang"'
+        '}'
       build_numbers: YES
       service_account: "angle-ci-builder@chops-service-accounts.iam.gserviceaccount.com"
       experiments {
         key: "luci.use_realms"
         value: 100
       }
+      resultdb {
+        enable: true
+      }
     }
     builders {
       name: "android-arm64-rel"
@@ -74,16 +116,30 @@
         cipd_version: "refs/heads/master"
         cmd: "recipes"
       }
-      properties: "{\"$build/goma\":{\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"},\"builder_group\":\"angle\",\"platform\":\"android\",\"recipe\":\"angle\",\"test_mode\":\"compile_and_test\",\"toolchain\":\"clang\"}"
+      properties:
+        '{'
+        '  "$build/goma": {'
+        '    "rpc_extra_params": "?prod",'
+        '    "server_host": "goma.chromium.org"'
+        '  },'
+        '  "builder_group": "angle",'
+        '  "platform": "android",'
+        '  "recipe": "angle",'
+        '  "test_mode": "compile_and_test",'
+        '  "toolchain": "clang"'
+        '}'
       build_numbers: YES
       service_account: "angle-ci-builder@chops-service-accounts.iam.gserviceaccount.com"
       experiments {
         key: "luci.use_realms"
         value: 100
       }
+      resultdb {
+        enable: true
+      }
     }
     builders {
-      name: "android-perf"
+      name: "android-pixel4-perf"
       swarming_host: "chromium-swarm.appspot.com"
       dimensions: "os:Ubuntu"
       exe {
@@ -91,13 +147,27 @@
         cipd_version: "refs/heads/master"
         cmd: "recipes"
       }
-      properties: "{\"$build/goma\":{\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"},\"builder_group\":\"angle\",\"platform\":\"android\",\"recipe\":\"angle\",\"test_mode\":\"compile_and_test\",\"toolchain\":\"clang\"}"
+      properties:
+        '{'
+        '  "$build/goma": {'
+        '    "rpc_extra_params": "?prod",'
+        '    "server_host": "goma.chromium.org"'
+        '  },'
+        '  "builder_group": "angle",'
+        '  "platform": "android",'
+        '  "recipe": "angle",'
+        '  "test_mode": "compile_and_test",'
+        '  "toolchain": "clang"'
+        '}'
       build_numbers: YES
       service_account: "angle-ci-builder@chops-service-accounts.iam.gserviceaccount.com"
       experiments {
         key: "luci.use_realms"
         value: 100
       }
+      resultdb {
+        enable: true
+      }
     }
     builders {
       name: "linux-clang-dbg"
@@ -109,13 +179,28 @@
         cipd_version: "refs/heads/master"
         cmd: "recipes"
       }
-      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"},\"builder_group\":\"angle\",\"platform\":\"linux\",\"recipe\":\"angle\",\"test_mode\":\"compile_only\",\"toolchain\":\"clang\"}"
+      properties:
+        '{'
+        '  "$build/goma": {'
+        '    "enable_ats": true,'
+        '    "rpc_extra_params": "?prod",'
+        '    "server_host": "goma.chromium.org"'
+        '  },'
+        '  "builder_group": "angle",'
+        '  "platform": "linux",'
+        '  "recipe": "angle",'
+        '  "test_mode": "compile_only",'
+        '  "toolchain": "clang"'
+        '}'
       build_numbers: YES
       service_account: "angle-ci-builder@chops-service-accounts.iam.gserviceaccount.com"
       experiments {
         key: "luci.use_realms"
         value: 100
       }
+      resultdb {
+        enable: true
+      }
     }
     builders {
       name: "linux-clang-rel"
@@ -127,13 +212,28 @@
         cipd_version: "refs/heads/master"
         cmd: "recipes"
       }
-      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"},\"builder_group\":\"angle\",\"platform\":\"linux\",\"recipe\":\"angle\",\"test_mode\":\"compile_and_test\",\"toolchain\":\"clang\"}"
+      properties:
+        '{'
+        '  "$build/goma": {'
+        '    "enable_ats": true,'
+        '    "rpc_extra_params": "?prod",'
+        '    "server_host": "goma.chromium.org"'
+        '  },'
+        '  "builder_group": "angle",'
+        '  "platform": "linux",'
+        '  "recipe": "angle",'
+        '  "test_mode": "compile_and_test",'
+        '  "toolchain": "clang"'
+        '}'
       build_numbers: YES
       service_account: "angle-ci-builder@chops-service-accounts.iam.gserviceaccount.com"
       experiments {
         key: "luci.use_realms"
         value: 100
       }
+      resultdb {
+        enable: true
+      }
     }
     builders {
       name: "linux-gcc-dbg"
@@ -145,13 +245,28 @@
         cipd_version: "refs/heads/master"
         cmd: "recipes"
       }
-      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"},\"builder_group\":\"angle\",\"platform\":\"linux\",\"recipe\":\"angle\",\"test_mode\":\"checkout_only\",\"toolchain\":\"gcc\"}"
+      properties:
+        '{'
+        '  "$build/goma": {'
+        '    "enable_ats": true,'
+        '    "rpc_extra_params": "?prod",'
+        '    "server_host": "goma.chromium.org"'
+        '  },'
+        '  "builder_group": "angle",'
+        '  "platform": "linux",'
+        '  "recipe": "angle",'
+        '  "test_mode": "checkout_only",'
+        '  "toolchain": "gcc"'
+        '}'
       build_numbers: YES
       service_account: "angle-ci-builder@chops-service-accounts.iam.gserviceaccount.com"
       experiments {
         key: "luci.use_realms"
         value: 100
       }
+      resultdb {
+        enable: true
+      }
     }
     builders {
       name: "linux-gcc-rel"
@@ -163,16 +278,31 @@
         cipd_version: "refs/heads/master"
         cmd: "recipes"
       }
-      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"},\"builder_group\":\"angle\",\"platform\":\"linux\",\"recipe\":\"angle\",\"test_mode\":\"checkout_only\",\"toolchain\":\"gcc\"}"
+      properties:
+        '{'
+        '  "$build/goma": {'
+        '    "enable_ats": true,'
+        '    "rpc_extra_params": "?prod",'
+        '    "server_host": "goma.chromium.org"'
+        '  },'
+        '  "builder_group": "angle",'
+        '  "platform": "linux",'
+        '  "recipe": "angle",'
+        '  "test_mode": "checkout_only",'
+        '  "toolchain": "gcc"'
+        '}'
       build_numbers: YES
       service_account: "angle-ci-builder@chops-service-accounts.iam.gserviceaccount.com"
       experiments {
         key: "luci.use_realms"
         value: 100
       }
+      resultdb {
+        enable: true
+      }
     }
     builders {
-      name: "linux-perf"
+      name: "linux-intel-hd630-perf"
       swarming_host: "chromium-swarm.appspot.com"
       dimensions: "builderless:1"
       dimensions: "os:Ubuntu"
@@ -181,13 +311,61 @@
         cipd_version: "refs/heads/master"
         cmd: "recipes"
       }
-      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"},\"builder_group\":\"angle\",\"platform\":\"linux\",\"recipe\":\"angle\",\"test_mode\":\"compile_and_test\",\"toolchain\":\"clang\"}"
+      properties:
+        '{'
+        '  "$build/goma": {'
+        '    "enable_ats": true,'
+        '    "rpc_extra_params": "?prod",'
+        '    "server_host": "goma.chromium.org"'
+        '  },'
+        '  "builder_group": "angle",'
+        '  "platform": "linux",'
+        '  "recipe": "angle",'
+        '  "test_mode": "compile_and_test",'
+        '  "toolchain": "clang"'
+        '}'
       build_numbers: YES
       service_account: "angle-ci-builder@chops-service-accounts.iam.gserviceaccount.com"
       experiments {
         key: "luci.use_realms"
         value: 100
       }
+      resultdb {
+        enable: true
+      }
+    }
+    builders {
+      name: "linux-nvidia-p400-perf"
+      swarming_host: "chromium-swarm.appspot.com"
+      dimensions: "builderless:1"
+      dimensions: "os:Ubuntu"
+      exe {
+        cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build"
+        cipd_version: "refs/heads/master"
+        cmd: "recipes"
+      }
+      properties:
+        '{'
+        '  "$build/goma": {'
+        '    "enable_ats": true,'
+        '    "rpc_extra_params": "?prod",'
+        '    "server_host": "goma.chromium.org"'
+        '  },'
+        '  "builder_group": "angle",'
+        '  "platform": "linux",'
+        '  "recipe": "angle",'
+        '  "test_mode": "compile_and_test",'
+        '  "toolchain": "clang"'
+        '}'
+      build_numbers: YES
+      service_account: "angle-ci-builder@chops-service-accounts.iam.gserviceaccount.com"
+      experiments {
+        key: "luci.use_realms"
+        value: 100
+      }
+      resultdb {
+        enable: true
+      }
     }
     builders {
       name: "linux-trace-rel"
@@ -199,13 +377,28 @@
         cipd_version: "refs/heads/master"
         cmd: "recipes"
       }
-      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"},\"builder_group\":\"angle\",\"platform\":\"linux\",\"recipe\":\"angle\",\"test_mode\":\"trace_tests\",\"toolchain\":\"clang\"}"
+      properties:
+        '{'
+        '  "$build/goma": {'
+        '    "enable_ats": true,'
+        '    "rpc_extra_params": "?prod",'
+        '    "server_host": "goma.chromium.org"'
+        '  },'
+        '  "builder_group": "angle",'
+        '  "platform": "linux",'
+        '  "recipe": "angle",'
+        '  "test_mode": "trace_tests",'
+        '  "toolchain": "clang"'
+        '}'
       build_numbers: YES
       service_account: "angle-ci-builder@chops-service-accounts.iam.gserviceaccount.com"
       experiments {
         key: "luci.use_realms"
         value: 100
       }
+      resultdb {
+        enable: true
+      }
     }
     builders {
       name: "mac-dbg"
@@ -216,13 +409,58 @@
         cipd_version: "refs/heads/master"
         cmd: "recipes"
       }
-      properties: "{\"$build/goma\":{\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"},\"builder_group\":\"angle\",\"platform\":\"mac\",\"recipe\":\"angle\",\"test_mode\":\"compile_only\",\"toolchain\":\"clang\"}"
+      properties:
+        '{'
+        '  "$build/goma": {'
+        '    "rpc_extra_params": "?prod",'
+        '    "server_host": "goma.chromium.org"'
+        '  },'
+        '  "builder_group": "angle",'
+        '  "platform": "mac",'
+        '  "recipe": "angle",'
+        '  "test_mode": "compile_only",'
+        '  "toolchain": "clang"'
+        '}'
       build_numbers: YES
       service_account: "angle-ci-builder@chops-service-accounts.iam.gserviceaccount.com"
       experiments {
         key: "luci.use_realms"
         value: 100
       }
+      resultdb {
+        enable: true
+      }
+    }
+    builders {
+      name: "mac-exp"
+      swarming_host: "chromium-swarm.appspot.com"
+      dimensions: "os:Mac"
+      exe {
+        cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build"
+        cipd_version: "refs/heads/master"
+        cmd: "recipes"
+      }
+      properties:
+        '{'
+        '  "$build/goma": {'
+        '    "rpc_extra_params": "?prod",'
+        '    "server_host": "goma.chromium.org"'
+        '  },'
+        '  "builder_group": "angle",'
+        '  "platform": "mac",'
+        '  "recipe": "angle",'
+        '  "test_mode": "compile_and_test",'
+        '  "toolchain": "clang"'
+        '}'
+      build_numbers: YES
+      service_account: "angle-ci-builder@chops-service-accounts.iam.gserviceaccount.com"
+      experiments {
+        key: "luci.use_realms"
+        value: 100
+      }
+      resultdb {
+        enable: true
+      }
     }
     builders {
       name: "mac-rel"
@@ -233,13 +471,27 @@
         cipd_version: "refs/heads/master"
         cmd: "recipes"
       }
-      properties: "{\"$build/goma\":{\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"},\"builder_group\":\"angle\",\"platform\":\"mac\",\"recipe\":\"angle\",\"test_mode\":\"compile_and_test\",\"toolchain\":\"clang\"}"
+      properties:
+        '{'
+        '  "$build/goma": {'
+        '    "rpc_extra_params": "?prod",'
+        '    "server_host": "goma.chromium.org"'
+        '  },'
+        '  "builder_group": "angle",'
+        '  "platform": "mac",'
+        '  "recipe": "angle",'
+        '  "test_mode": "compile_and_test",'
+        '  "toolchain": "clang"'
+        '}'
       build_numbers: YES
       service_account: "angle-ci-builder@chops-service-accounts.iam.gserviceaccount.com"
       experiments {
         key: "luci.use_realms"
         value: 100
       }
+      resultdb {
+        enable: true
+      }
     }
     builders {
       name: "win-clang-x64-dbg"
@@ -251,13 +503,28 @@
         cipd_version: "refs/heads/master"
         cmd: "recipes"
       }
-      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"},\"builder_group\":\"angle\",\"platform\":\"win\",\"recipe\":\"angle\",\"test_mode\":\"compile_only\",\"toolchain\":\"clang\"}"
+      properties:
+        '{'
+        '  "$build/goma": {'
+        '    "enable_ats": true,'
+        '    "rpc_extra_params": "?prod",'
+        '    "server_host": "goma.chromium.org"'
+        '  },'
+        '  "builder_group": "angle",'
+        '  "platform": "win",'
+        '  "recipe": "angle",'
+        '  "test_mode": "compile_only",'
+        '  "toolchain": "clang"'
+        '}'
       build_numbers: YES
       service_account: "angle-ci-builder@chops-service-accounts.iam.gserviceaccount.com"
       experiments {
         key: "luci.use_realms"
         value: 100
       }
+      resultdb {
+        enable: true
+      }
     }
     builders {
       name: "win-clang-x64-rel"
@@ -269,13 +536,28 @@
         cipd_version: "refs/heads/master"
         cmd: "recipes"
       }
-      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"},\"builder_group\":\"angle\",\"platform\":\"win\",\"recipe\":\"angle\",\"test_mode\":\"compile_and_test\",\"toolchain\":\"clang\"}"
+      properties:
+        '{'
+        '  "$build/goma": {'
+        '    "enable_ats": true,'
+        '    "rpc_extra_params": "?prod",'
+        '    "server_host": "goma.chromium.org"'
+        '  },'
+        '  "builder_group": "angle",'
+        '  "platform": "win",'
+        '  "recipe": "angle",'
+        '  "test_mode": "compile_and_test",'
+        '  "toolchain": "clang"'
+        '}'
       build_numbers: YES
       service_account: "angle-ci-builder@chops-service-accounts.iam.gserviceaccount.com"
       experiments {
         key: "luci.use_realms"
         value: 100
       }
+      resultdb {
+        enable: true
+      }
     }
     builders {
       name: "win-clang-x86-dbg"
@@ -287,13 +569,28 @@
         cipd_version: "refs/heads/master"
         cmd: "recipes"
       }
-      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"},\"builder_group\":\"angle\",\"platform\":\"win\",\"recipe\":\"angle\",\"test_mode\":\"compile_only\",\"toolchain\":\"clang\"}"
+      properties:
+        '{'
+        '  "$build/goma": {'
+        '    "enable_ats": true,'
+        '    "rpc_extra_params": "?prod",'
+        '    "server_host": "goma.chromium.org"'
+        '  },'
+        '  "builder_group": "angle",'
+        '  "platform": "win",'
+        '  "recipe": "angle",'
+        '  "test_mode": "compile_only",'
+        '  "toolchain": "clang"'
+        '}'
       build_numbers: YES
       service_account: "angle-ci-builder@chops-service-accounts.iam.gserviceaccount.com"
       experiments {
         key: "luci.use_realms"
         value: 100
       }
+      resultdb {
+        enable: true
+      }
     }
     builders {
       name: "win-clang-x86-rel"
@@ -305,13 +602,28 @@
         cipd_version: "refs/heads/master"
         cmd: "recipes"
       }
-      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"},\"builder_group\":\"angle\",\"platform\":\"win\",\"recipe\":\"angle\",\"test_mode\":\"compile_and_test\",\"toolchain\":\"clang\"}"
+      properties:
+        '{'
+        '  "$build/goma": {'
+        '    "enable_ats": true,'
+        '    "rpc_extra_params": "?prod",'
+        '    "server_host": "goma.chromium.org"'
+        '  },'
+        '  "builder_group": "angle",'
+        '  "platform": "win",'
+        '  "recipe": "angle",'
+        '  "test_mode": "compile_and_test",'
+        '  "toolchain": "clang"'
+        '}'
       build_numbers: YES
       service_account: "angle-ci-builder@chops-service-accounts.iam.gserviceaccount.com"
       experiments {
         key: "luci.use_realms"
         value: 100
       }
+      resultdb {
+        enable: true
+      }
     }
     builders {
       name: "win-msvc-x64-dbg"
@@ -323,13 +635,28 @@
         cipd_version: "refs/heads/master"
         cmd: "recipes"
       }
-      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"},\"builder_group\":\"angle\",\"platform\":\"win\",\"recipe\":\"angle\",\"test_mode\":\"compile_only\",\"toolchain\":\"msvc\"}"
+      properties:
+        '{'
+        '  "$build/goma": {'
+        '    "enable_ats": true,'
+        '    "rpc_extra_params": "?prod",'
+        '    "server_host": "goma.chromium.org"'
+        '  },'
+        '  "builder_group": "angle",'
+        '  "platform": "win",'
+        '  "recipe": "angle",'
+        '  "test_mode": "compile_only",'
+        '  "toolchain": "msvc"'
+        '}'
       build_numbers: YES
       service_account: "angle-ci-builder@chops-service-accounts.iam.gserviceaccount.com"
       experiments {
         key: "luci.use_realms"
         value: 100
       }
+      resultdb {
+        enable: true
+      }
     }
     builders {
       name: "win-msvc-x64-rel"
@@ -341,13 +668,28 @@
         cipd_version: "refs/heads/master"
         cmd: "recipes"
       }
-      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"},\"builder_group\":\"angle\",\"platform\":\"win\",\"recipe\":\"angle\",\"test_mode\":\"compile_only\",\"toolchain\":\"msvc\"}"
+      properties:
+        '{'
+        '  "$build/goma": {'
+        '    "enable_ats": true,'
+        '    "rpc_extra_params": "?prod",'
+        '    "server_host": "goma.chromium.org"'
+        '  },'
+        '  "builder_group": "angle",'
+        '  "platform": "win",'
+        '  "recipe": "angle",'
+        '  "test_mode": "compile_only",'
+        '  "toolchain": "msvc"'
+        '}'
       build_numbers: YES
       service_account: "angle-ci-builder@chops-service-accounts.iam.gserviceaccount.com"
       experiments {
         key: "luci.use_realms"
         value: 100
       }
+      resultdb {
+        enable: true
+      }
     }
     builders {
       name: "win-msvc-x86-dbg"
@@ -359,13 +701,28 @@
         cipd_version: "refs/heads/master"
         cmd: "recipes"
       }
-      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"},\"builder_group\":\"angle\",\"platform\":\"win\",\"recipe\":\"angle\",\"test_mode\":\"compile_only\",\"toolchain\":\"msvc\"}"
+      properties:
+        '{'
+        '  "$build/goma": {'
+        '    "enable_ats": true,'
+        '    "rpc_extra_params": "?prod",'
+        '    "server_host": "goma.chromium.org"'
+        '  },'
+        '  "builder_group": "angle",'
+        '  "platform": "win",'
+        '  "recipe": "angle",'
+        '  "test_mode": "compile_only",'
+        '  "toolchain": "msvc"'
+        '}'
       build_numbers: YES
       service_account: "angle-ci-builder@chops-service-accounts.iam.gserviceaccount.com"
       experiments {
         key: "luci.use_realms"
         value: 100
       }
+      resultdb {
+        enable: true
+      }
     }
     builders {
       name: "win-msvc-x86-rel"
@@ -377,30 +734,27 @@
         cipd_version: "refs/heads/master"
         cmd: "recipes"
       }
-      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"},\"builder_group\":\"angle\",\"platform\":\"win\",\"recipe\":\"angle\",\"test_mode\":\"compile_only\",\"toolchain\":\"msvc\"}"
+      properties:
+        '{'
+        '  "$build/goma": {'
+        '    "enable_ats": true,'
+        '    "rpc_extra_params": "?prod",'
+        '    "server_host": "goma.chromium.org"'
+        '  },'
+        '  "builder_group": "angle",'
+        '  "platform": "win",'
+        '  "recipe": "angle",'
+        '  "test_mode": "compile_only",'
+        '  "toolchain": "msvc"'
+        '}'
       build_numbers: YES
       service_account: "angle-ci-builder@chops-service-accounts.iam.gserviceaccount.com"
       experiments {
         key: "luci.use_realms"
         value: 100
       }
-    }
-    builders {
-      name: "win-perf"
-      swarming_host: "chromium-swarm.appspot.com"
-      dimensions: "builderless:1"
-      dimensions: "os:Windows"
-      exe {
-        cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build"
-        cipd_version: "refs/heads/master"
-        cmd: "recipes"
-      }
-      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"},\"builder_group\":\"angle\",\"platform\":\"win\",\"recipe\":\"angle\",\"test_mode\":\"compile_and_test\",\"toolchain\":\"clang\"}"
-      build_numbers: YES
-      service_account: "angle-ci-builder@chops-service-accounts.iam.gserviceaccount.com"
-      experiments {
-        key: "luci.use_realms"
-        value: 100
+      resultdb {
+        enable: true
       }
     }
     builders {
@@ -413,13 +767,94 @@
         cipd_version: "refs/heads/master"
         cmd: "recipes"
       }
-      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"},\"builder_group\":\"angle\",\"platform\":\"win\",\"recipe\":\"angle\",\"test_mode\":\"trace_tests\",\"toolchain\":\"clang\"}"
+      properties:
+        '{'
+        '  "$build/goma": {'
+        '    "enable_ats": true,'
+        '    "rpc_extra_params": "?prod",'
+        '    "server_host": "goma.chromium.org"'
+        '  },'
+        '  "builder_group": "angle",'
+        '  "platform": "win",'
+        '  "recipe": "angle",'
+        '  "test_mode": "trace_tests",'
+        '  "toolchain": "clang"'
+        '}'
       build_numbers: YES
       service_account: "angle-ci-builder@chops-service-accounts.iam.gserviceaccount.com"
       experiments {
         key: "luci.use_realms"
         value: 100
       }
+      resultdb {
+        enable: true
+      }
+    }
+    builders {
+      name: "win10-intel-hd630-perf"
+      swarming_host: "chromium-swarm.appspot.com"
+      dimensions: "builderless:1"
+      dimensions: "os:Windows"
+      exe {
+        cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build"
+        cipd_version: "refs/heads/master"
+        cmd: "recipes"
+      }
+      properties:
+        '{'
+        '  "$build/goma": {'
+        '    "enable_ats": true,'
+        '    "rpc_extra_params": "?prod",'
+        '    "server_host": "goma.chromium.org"'
+        '  },'
+        '  "builder_group": "angle",'
+        '  "platform": "win",'
+        '  "recipe": "angle",'
+        '  "test_mode": "compile_and_test",'
+        '  "toolchain": "clang"'
+        '}'
+      build_numbers: YES
+      service_account: "angle-ci-builder@chops-service-accounts.iam.gserviceaccount.com"
+      experiments {
+        key: "luci.use_realms"
+        value: 100
+      }
+      resultdb {
+        enable: true
+      }
+    }
+    builders {
+      name: "win10-nvidia-p400-perf"
+      swarming_host: "chromium-swarm.appspot.com"
+      dimensions: "builderless:1"
+      dimensions: "os:Windows"
+      exe {
+        cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build"
+        cipd_version: "refs/heads/master"
+        cmd: "recipes"
+      }
+      properties:
+        '{'
+        '  "$build/goma": {'
+        '    "enable_ats": true,'
+        '    "rpc_extra_params": "?prod",'
+        '    "server_host": "goma.chromium.org"'
+        '  },'
+        '  "builder_group": "angle",'
+        '  "platform": "win",'
+        '  "recipe": "angle",'
+        '  "test_mode": "compile_and_test",'
+        '  "toolchain": "clang"'
+        '}'
+      build_numbers: YES
+      service_account: "angle-ci-builder@chops-service-accounts.iam.gserviceaccount.com"
+      experiments {
+        key: "luci.use_realms"
+        value: 100
+      }
+      resultdb {
+        enable: true
+      }
     }
     builders {
       name: "winuwp-x64-dbg"
@@ -431,13 +866,28 @@
         cipd_version: "refs/heads/master"
         cmd: "recipes"
       }
-      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"},\"builder_group\":\"angle\",\"platform\":\"win\",\"recipe\":\"angle\",\"test_mode\":\"compile_only\",\"toolchain\":\"msvc\"}"
+      properties:
+        '{'
+        '  "$build/goma": {'
+        '    "enable_ats": true,'
+        '    "rpc_extra_params": "?prod",'
+        '    "server_host": "goma.chromium.org"'
+        '  },'
+        '  "builder_group": "angle",'
+        '  "platform": "win",'
+        '  "recipe": "angle",'
+        '  "test_mode": "compile_only",'
+        '  "toolchain": "msvc"'
+        '}'
       build_numbers: YES
       service_account: "angle-ci-builder@chops-service-accounts.iam.gserviceaccount.com"
       experiments {
         key: "luci.use_realms"
         value: 100
       }
+      resultdb {
+        enable: true
+      }
     }
     builders {
       name: "winuwp-x64-rel"
@@ -449,13 +899,28 @@
         cipd_version: "refs/heads/master"
         cmd: "recipes"
       }
-      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"},\"builder_group\":\"angle\",\"platform\":\"win\",\"recipe\":\"angle\",\"test_mode\":\"compile_only\",\"toolchain\":\"msvc\"}"
+      properties:
+        '{'
+        '  "$build/goma": {'
+        '    "enable_ats": true,'
+        '    "rpc_extra_params": "?prod",'
+        '    "server_host": "goma.chromium.org"'
+        '  },'
+        '  "builder_group": "angle",'
+        '  "platform": "win",'
+        '  "recipe": "angle",'
+        '  "test_mode": "compile_only",'
+        '  "toolchain": "msvc"'
+        '}'
       build_numbers: YES
       service_account: "angle-ci-builder@chops-service-accounts.iam.gserviceaccount.com"
       experiments {
         key: "luci.use_realms"
         value: 100
       }
+      resultdb {
+        enable: true
+      }
     }
   }
 }
@@ -482,13 +947,27 @@
         cipd_version: "refs/heads/master"
         cmd: "recipes"
       }
-      properties: "{\"$build/goma\":{\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"},\"builder_group\":\"angle\",\"platform\":\"android\",\"recipe\":\"angle\",\"test_mode\":\"compile_only\",\"toolchain\":\"clang\"}"
+      properties:
+        '{'
+        '  "$build/goma": {'
+        '    "rpc_extra_params": "?prod",'
+        '    "server_host": "goma.chromium.org"'
+        '  },'
+        '  "builder_group": "angle",'
+        '  "platform": "android",'
+        '  "recipe": "angle",'
+        '  "test_mode": "compile_only",'
+        '  "toolchain": "clang"'
+        '}'
       build_numbers: YES
       service_account: "angle-try-builder@chops-service-accounts.iam.gserviceaccount.com"
       experiments {
         key: "luci.use_realms"
         value: 100
       }
+      resultdb {
+        enable: true
+      }
     }
     builders {
       name: "android-arm-rel"
@@ -499,13 +978,27 @@
         cipd_version: "refs/heads/master"
         cmd: "recipes"
       }
-      properties: "{\"$build/goma\":{\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"},\"builder_group\":\"angle\",\"platform\":\"android\",\"recipe\":\"angle\",\"test_mode\":\"compile_only\",\"toolchain\":\"clang\"}"
+      properties:
+        '{'
+        '  "$build/goma": {'
+        '    "rpc_extra_params": "?prod",'
+        '    "server_host": "goma.chromium.org"'
+        '  },'
+        '  "builder_group": "angle",'
+        '  "platform": "android",'
+        '  "recipe": "angle",'
+        '  "test_mode": "compile_only",'
+        '  "toolchain": "clang"'
+        '}'
       build_numbers: YES
       service_account: "angle-try-builder@chops-service-accounts.iam.gserviceaccount.com"
       experiments {
         key: "luci.use_realms"
         value: 100
       }
+      resultdb {
+        enable: true
+      }
     }
     builders {
       name: "android-arm64-dbg"
@@ -516,13 +1009,27 @@
         cipd_version: "refs/heads/master"
         cmd: "recipes"
       }
-      properties: "{\"$build/goma\":{\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"},\"builder_group\":\"angle\",\"platform\":\"android\",\"recipe\":\"angle\",\"test_mode\":\"compile_only\",\"toolchain\":\"clang\"}"
+      properties:
+        '{'
+        '  "$build/goma": {'
+        '    "rpc_extra_params": "?prod",'
+        '    "server_host": "goma.chromium.org"'
+        '  },'
+        '  "builder_group": "angle",'
+        '  "platform": "android",'
+        '  "recipe": "angle",'
+        '  "test_mode": "compile_only",'
+        '  "toolchain": "clang"'
+        '}'
       build_numbers: YES
       service_account: "angle-try-builder@chops-service-accounts.iam.gserviceaccount.com"
       experiments {
         key: "luci.use_realms"
         value: 100
       }
+      resultdb {
+        enable: true
+      }
     }
     builders {
       name: "android-arm64-rel"
@@ -533,13 +1040,27 @@
         cipd_version: "refs/heads/master"
         cmd: "recipes"
       }
-      properties: "{\"$build/goma\":{\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"},\"builder_group\":\"angle\",\"platform\":\"android\",\"recipe\":\"angle\",\"test_mode\":\"compile_and_test\",\"toolchain\":\"clang\"}"
+      properties:
+        '{'
+        '  "$build/goma": {'
+        '    "rpc_extra_params": "?prod",'
+        '    "server_host": "goma.chromium.org"'
+        '  },'
+        '  "builder_group": "angle",'
+        '  "platform": "android",'
+        '  "recipe": "angle",'
+        '  "test_mode": "compile_and_test",'
+        '  "toolchain": "clang"'
+        '}'
       build_numbers: YES
       service_account: "angle-try-builder@chops-service-accounts.iam.gserviceaccount.com"
       experiments {
         key: "luci.use_realms"
         value: 100
       }
+      resultdb {
+        enable: true
+      }
     }
     builders {
       name: "linux-clang-dbg"
@@ -551,13 +1072,28 @@
         cipd_version: "refs/heads/master"
         cmd: "recipes"
       }
-      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"},\"builder_group\":\"angle\",\"platform\":\"linux\",\"recipe\":\"angle\",\"test_mode\":\"compile_only\",\"toolchain\":\"clang\"}"
+      properties:
+        '{'
+        '  "$build/goma": {'
+        '    "enable_ats": true,'
+        '    "rpc_extra_params": "?prod",'
+        '    "server_host": "goma.chromium.org"'
+        '  },'
+        '  "builder_group": "angle",'
+        '  "platform": "linux",'
+        '  "recipe": "angle",'
+        '  "test_mode": "compile_only",'
+        '  "toolchain": "clang"'
+        '}'
       build_numbers: YES
       service_account: "angle-try-builder@chops-service-accounts.iam.gserviceaccount.com"
       experiments {
         key: "luci.use_realms"
         value: 100
       }
+      resultdb {
+        enable: true
+      }
     }
     builders {
       name: "linux-clang-rel"
@@ -569,13 +1105,28 @@
         cipd_version: "refs/heads/master"
         cmd: "recipes"
       }
-      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"},\"builder_group\":\"angle\",\"platform\":\"linux\",\"recipe\":\"angle\",\"test_mode\":\"compile_and_test\",\"toolchain\":\"clang\"}"
+      properties:
+        '{'
+        '  "$build/goma": {'
+        '    "enable_ats": true,'
+        '    "rpc_extra_params": "?prod",'
+        '    "server_host": "goma.chromium.org"'
+        '  },'
+        '  "builder_group": "angle",'
+        '  "platform": "linux",'
+        '  "recipe": "angle",'
+        '  "test_mode": "compile_and_test",'
+        '  "toolchain": "clang"'
+        '}'
       build_numbers: YES
       service_account: "angle-try-builder@chops-service-accounts.iam.gserviceaccount.com"
       experiments {
         key: "luci.use_realms"
         value: 100
       }
+      resultdb {
+        enable: true
+      }
     }
     builders {
       name: "linux-gcc-dbg"
@@ -587,13 +1138,28 @@
         cipd_version: "refs/heads/master"
         cmd: "recipes"
       }
-      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"},\"builder_group\":\"angle\",\"platform\":\"linux\",\"recipe\":\"angle\",\"test_mode\":\"checkout_only\",\"toolchain\":\"gcc\"}"
+      properties:
+        '{'
+        '  "$build/goma": {'
+        '    "enable_ats": true,'
+        '    "rpc_extra_params": "?prod",'
+        '    "server_host": "goma.chromium.org"'
+        '  },'
+        '  "builder_group": "angle",'
+        '  "platform": "linux",'
+        '  "recipe": "angle",'
+        '  "test_mode": "checkout_only",'
+        '  "toolchain": "gcc"'
+        '}'
       build_numbers: YES
       service_account: "angle-try-builder@chops-service-accounts.iam.gserviceaccount.com"
       experiments {
         key: "luci.use_realms"
         value: 100
       }
+      resultdb {
+        enable: true
+      }
     }
     builders {
       name: "linux-gcc-rel"
@@ -605,13 +1171,28 @@
         cipd_version: "refs/heads/master"
         cmd: "recipes"
       }
-      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"},\"builder_group\":\"angle\",\"platform\":\"linux\",\"recipe\":\"angle\",\"test_mode\":\"checkout_only\",\"toolchain\":\"gcc\"}"
+      properties:
+        '{'
+        '  "$build/goma": {'
+        '    "enable_ats": true,'
+        '    "rpc_extra_params": "?prod",'
+        '    "server_host": "goma.chromium.org"'
+        '  },'
+        '  "builder_group": "angle",'
+        '  "platform": "linux",'
+        '  "recipe": "angle",'
+        '  "test_mode": "checkout_only",'
+        '  "toolchain": "gcc"'
+        '}'
       build_numbers: YES
       service_account: "angle-try-builder@chops-service-accounts.iam.gserviceaccount.com"
       experiments {
         key: "luci.use_realms"
         value: 100
       }
+      resultdb {
+        enable: true
+      }
     }
     builders {
       name: "linux-trace-rel"
@@ -623,13 +1204,28 @@
         cipd_version: "refs/heads/master"
         cmd: "recipes"
       }
-      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"},\"builder_group\":\"angle\",\"platform\":\"linux\",\"recipe\":\"angle\",\"test_mode\":\"trace_tests\",\"toolchain\":\"clang\"}"
+      properties:
+        '{'
+        '  "$build/goma": {'
+        '    "enable_ats": true,'
+        '    "rpc_extra_params": "?prod",'
+        '    "server_host": "goma.chromium.org"'
+        '  },'
+        '  "builder_group": "angle",'
+        '  "platform": "linux",'
+        '  "recipe": "angle",'
+        '  "test_mode": "trace_tests",'
+        '  "toolchain": "clang"'
+        '}'
       build_numbers: YES
       service_account: "angle-try-builder@chops-service-accounts.iam.gserviceaccount.com"
       experiments {
         key: "luci.use_realms"
         value: 100
       }
+      resultdb {
+        enable: true
+      }
     }
     builders {
       name: "mac-dbg"
@@ -640,13 +1236,58 @@
         cipd_version: "refs/heads/master"
         cmd: "recipes"
       }
-      properties: "{\"$build/goma\":{\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"},\"builder_group\":\"angle\",\"platform\":\"mac\",\"recipe\":\"angle\",\"test_mode\":\"compile_only\",\"toolchain\":\"clang\"}"
+      properties:
+        '{'
+        '  "$build/goma": {'
+        '    "rpc_extra_params": "?prod",'
+        '    "server_host": "goma.chromium.org"'
+        '  },'
+        '  "builder_group": "angle",'
+        '  "platform": "mac",'
+        '  "recipe": "angle",'
+        '  "test_mode": "compile_only",'
+        '  "toolchain": "clang"'
+        '}'
       build_numbers: YES
       service_account: "angle-try-builder@chops-service-accounts.iam.gserviceaccount.com"
       experiments {
         key: "luci.use_realms"
         value: 100
       }
+      resultdb {
+        enable: true
+      }
+    }
+    builders {
+      name: "mac-exp"
+      swarming_host: "chromium-swarm.appspot.com"
+      dimensions: "os:Mac"
+      exe {
+        cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build"
+        cipd_version: "refs/heads/master"
+        cmd: "recipes"
+      }
+      properties:
+        '{'
+        '  "$build/goma": {'
+        '    "rpc_extra_params": "?prod",'
+        '    "server_host": "goma.chromium.org"'
+        '  },'
+        '  "builder_group": "angle",'
+        '  "platform": "mac",'
+        '  "recipe": "angle",'
+        '  "test_mode": "compile_and_test",'
+        '  "toolchain": "clang"'
+        '}'
+      build_numbers: YES
+      service_account: "angle-try-builder@chops-service-accounts.iam.gserviceaccount.com"
+      experiments {
+        key: "luci.use_realms"
+        value: 100
+      }
+      resultdb {
+        enable: true
+      }
     }
     builders {
       name: "mac-rel"
@@ -657,13 +1298,27 @@
         cipd_version: "refs/heads/master"
         cmd: "recipes"
       }
-      properties: "{\"$build/goma\":{\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"},\"builder_group\":\"angle\",\"platform\":\"mac\",\"recipe\":\"angle\",\"test_mode\":\"compile_and_test\",\"toolchain\":\"clang\"}"
+      properties:
+        '{'
+        '  "$build/goma": {'
+        '    "rpc_extra_params": "?prod",'
+        '    "server_host": "goma.chromium.org"'
+        '  },'
+        '  "builder_group": "angle",'
+        '  "platform": "mac",'
+        '  "recipe": "angle",'
+        '  "test_mode": "compile_and_test",'
+        '  "toolchain": "clang"'
+        '}'
       build_numbers: YES
       service_account: "angle-try-builder@chops-service-accounts.iam.gserviceaccount.com"
       experiments {
         key: "luci.use_realms"
         value: 100
       }
+      resultdb {
+        enable: true
+      }
     }
     builders {
       name: "presubmit"
@@ -674,13 +1329,21 @@
         cipd_version: "refs/heads/master"
         cmd: "recipes"
       }
-      properties: "{\"recipe\":\"run_presubmit\",\"repo_name\":\"angle\",\"runhooks\":true}"
+      properties:
+        '{'
+        '  "recipe": "run_presubmit",'
+        '  "repo_name": "angle",'
+        '  "runhooks": true'
+        '}'
       build_numbers: YES
       service_account: "angle-try-builder@chops-service-accounts.iam.gserviceaccount.com"
       experiments {
         key: "luci.use_realms"
         value: 100
       }
+      resultdb {
+        enable: true
+      }
     }
     builders {
       name: "win-clang-x64-dbg"
@@ -692,13 +1355,28 @@
         cipd_version: "refs/heads/master"
         cmd: "recipes"
       }
-      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"},\"builder_group\":\"angle\",\"platform\":\"win\",\"recipe\":\"angle\",\"test_mode\":\"compile_only\",\"toolchain\":\"clang\"}"
+      properties:
+        '{'
+        '  "$build/goma": {'
+        '    "enable_ats": true,'
+        '    "rpc_extra_params": "?prod",'
+        '    "server_host": "goma.chromium.org"'
+        '  },'
+        '  "builder_group": "angle",'
+        '  "platform": "win",'
+        '  "recipe": "angle",'
+        '  "test_mode": "compile_only",'
+        '  "toolchain": "clang"'
+        '}'
       build_numbers: YES
       service_account: "angle-try-builder@chops-service-accounts.iam.gserviceaccount.com"
       experiments {
         key: "luci.use_realms"
         value: 100
       }
+      resultdb {
+        enable: true
+      }
     }
     builders {
       name: "win-clang-x64-rel"
@@ -710,13 +1388,28 @@
         cipd_version: "refs/heads/master"
         cmd: "recipes"
       }
-      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"},\"builder_group\":\"angle\",\"platform\":\"win\",\"recipe\":\"angle\",\"test_mode\":\"compile_and_test\",\"toolchain\":\"clang\"}"
+      properties:
+        '{'
+        '  "$build/goma": {'
+        '    "enable_ats": true,'
+        '    "rpc_extra_params": "?prod",'
+        '    "server_host": "goma.chromium.org"'
+        '  },'
+        '  "builder_group": "angle",'
+        '  "platform": "win",'
+        '  "recipe": "angle",'
+        '  "test_mode": "compile_and_test",'
+        '  "toolchain": "clang"'
+        '}'
       build_numbers: YES
       service_account: "angle-try-builder@chops-service-accounts.iam.gserviceaccount.com"
       experiments {
         key: "luci.use_realms"
         value: 100
       }
+      resultdb {
+        enable: true
+      }
     }
     builders {
       name: "win-clang-x86-dbg"
@@ -728,13 +1421,28 @@
         cipd_version: "refs/heads/master"
         cmd: "recipes"
       }
-      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"},\"builder_group\":\"angle\",\"platform\":\"win\",\"recipe\":\"angle\",\"test_mode\":\"compile_only\",\"toolchain\":\"clang\"}"
+      properties:
+        '{'
+        '  "$build/goma": {'
+        '    "enable_ats": true,'
+        '    "rpc_extra_params": "?prod",'
+        '    "server_host": "goma.chromium.org"'
+        '  },'
+        '  "builder_group": "angle",'
+        '  "platform": "win",'
+        '  "recipe": "angle",'
+        '  "test_mode": "compile_only",'
+        '  "toolchain": "clang"'
+        '}'
       build_numbers: YES
       service_account: "angle-try-builder@chops-service-accounts.iam.gserviceaccount.com"
       experiments {
         key: "luci.use_realms"
         value: 100
       }
+      resultdb {
+        enable: true
+      }
     }
     builders {
       name: "win-clang-x86-rel"
@@ -746,13 +1454,28 @@
         cipd_version: "refs/heads/master"
         cmd: "recipes"
       }
-      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"},\"builder_group\":\"angle\",\"platform\":\"win\",\"recipe\":\"angle\",\"test_mode\":\"compile_and_test\",\"toolchain\":\"clang\"}"
+      properties:
+        '{'
+        '  "$build/goma": {'
+        '    "enable_ats": true,'
+        '    "rpc_extra_params": "?prod",'
+        '    "server_host": "goma.chromium.org"'
+        '  },'
+        '  "builder_group": "angle",'
+        '  "platform": "win",'
+        '  "recipe": "angle",'
+        '  "test_mode": "compile_and_test",'
+        '  "toolchain": "clang"'
+        '}'
       build_numbers: YES
       service_account: "angle-try-builder@chops-service-accounts.iam.gserviceaccount.com"
       experiments {
         key: "luci.use_realms"
         value: 100
       }
+      resultdb {
+        enable: true
+      }
     }
     builders {
       name: "win-msvc-x64-dbg"
@@ -764,13 +1487,28 @@
         cipd_version: "refs/heads/master"
         cmd: "recipes"
       }
-      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"},\"builder_group\":\"angle\",\"platform\":\"win\",\"recipe\":\"angle\",\"test_mode\":\"compile_only\",\"toolchain\":\"msvc\"}"
+      properties:
+        '{'
+        '  "$build/goma": {'
+        '    "enable_ats": true,'
+        '    "rpc_extra_params": "?prod",'
+        '    "server_host": "goma.chromium.org"'
+        '  },'
+        '  "builder_group": "angle",'
+        '  "platform": "win",'
+        '  "recipe": "angle",'
+        '  "test_mode": "compile_only",'
+        '  "toolchain": "msvc"'
+        '}'
       build_numbers: YES
       service_account: "angle-try-builder@chops-service-accounts.iam.gserviceaccount.com"
       experiments {
         key: "luci.use_realms"
         value: 100
       }
+      resultdb {
+        enable: true
+      }
     }
     builders {
       name: "win-msvc-x64-rel"
@@ -782,13 +1520,28 @@
         cipd_version: "refs/heads/master"
         cmd: "recipes"
       }
-      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"},\"builder_group\":\"angle\",\"platform\":\"win\",\"recipe\":\"angle\",\"test_mode\":\"compile_only\",\"toolchain\":\"msvc\"}"
+      properties:
+        '{'
+        '  "$build/goma": {'
+        '    "enable_ats": true,'
+        '    "rpc_extra_params": "?prod",'
+        '    "server_host": "goma.chromium.org"'
+        '  },'
+        '  "builder_group": "angle",'
+        '  "platform": "win",'
+        '  "recipe": "angle",'
+        '  "test_mode": "compile_only",'
+        '  "toolchain": "msvc"'
+        '}'
       build_numbers: YES
       service_account: "angle-try-builder@chops-service-accounts.iam.gserviceaccount.com"
       experiments {
         key: "luci.use_realms"
         value: 100
       }
+      resultdb {
+        enable: true
+      }
     }
     builders {
       name: "win-msvc-x86-dbg"
@@ -800,13 +1553,28 @@
         cipd_version: "refs/heads/master"
         cmd: "recipes"
       }
-      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"},\"builder_group\":\"angle\",\"platform\":\"win\",\"recipe\":\"angle\",\"test_mode\":\"compile_only\",\"toolchain\":\"msvc\"}"
+      properties:
+        '{'
+        '  "$build/goma": {'
+        '    "enable_ats": true,'
+        '    "rpc_extra_params": "?prod",'
+        '    "server_host": "goma.chromium.org"'
+        '  },'
+        '  "builder_group": "angle",'
+        '  "platform": "win",'
+        '  "recipe": "angle",'
+        '  "test_mode": "compile_only",'
+        '  "toolchain": "msvc"'
+        '}'
       build_numbers: YES
       service_account: "angle-try-builder@chops-service-accounts.iam.gserviceaccount.com"
       experiments {
         key: "luci.use_realms"
         value: 100
       }
+      resultdb {
+        enable: true
+      }
     }
     builders {
       name: "win-msvc-x86-rel"
@@ -818,13 +1586,28 @@
         cipd_version: "refs/heads/master"
         cmd: "recipes"
       }
-      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"},\"builder_group\":\"angle\",\"platform\":\"win\",\"recipe\":\"angle\",\"test_mode\":\"compile_only\",\"toolchain\":\"msvc\"}"
+      properties:
+        '{'
+        '  "$build/goma": {'
+        '    "enable_ats": true,'
+        '    "rpc_extra_params": "?prod",'
+        '    "server_host": "goma.chromium.org"'
+        '  },'
+        '  "builder_group": "angle",'
+        '  "platform": "win",'
+        '  "recipe": "angle",'
+        '  "test_mode": "compile_only",'
+        '  "toolchain": "msvc"'
+        '}'
       build_numbers: YES
       service_account: "angle-try-builder@chops-service-accounts.iam.gserviceaccount.com"
       experiments {
         key: "luci.use_realms"
         value: 100
       }
+      resultdb {
+        enable: true
+      }
     }
     builders {
       name: "win-trace-rel"
@@ -836,13 +1619,28 @@
         cipd_version: "refs/heads/master"
         cmd: "recipes"
       }
-      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"},\"builder_group\":\"angle\",\"platform\":\"win\",\"recipe\":\"angle\",\"test_mode\":\"trace_tests\",\"toolchain\":\"clang\"}"
+      properties:
+        '{'
+        '  "$build/goma": {'
+        '    "enable_ats": true,'
+        '    "rpc_extra_params": "?prod",'
+        '    "server_host": "goma.chromium.org"'
+        '  },'
+        '  "builder_group": "angle",'
+        '  "platform": "win",'
+        '  "recipe": "angle",'
+        '  "test_mode": "trace_tests",'
+        '  "toolchain": "clang"'
+        '}'
       build_numbers: YES
       service_account: "angle-try-builder@chops-service-accounts.iam.gserviceaccount.com"
       experiments {
         key: "luci.use_realms"
         value: 100
       }
+      resultdb {
+        enable: true
+      }
     }
     builders {
       name: "winuwp-x64-dbg"
@@ -854,13 +1652,28 @@
         cipd_version: "refs/heads/master"
         cmd: "recipes"
       }
-      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"},\"builder_group\":\"angle\",\"platform\":\"win\",\"recipe\":\"angle\",\"test_mode\":\"compile_only\",\"toolchain\":\"msvc\"}"
+      properties:
+        '{'
+        '  "$build/goma": {'
+        '    "enable_ats": true,'
+        '    "rpc_extra_params": "?prod",'
+        '    "server_host": "goma.chromium.org"'
+        '  },'
+        '  "builder_group": "angle",'
+        '  "platform": "win",'
+        '  "recipe": "angle",'
+        '  "test_mode": "compile_only",'
+        '  "toolchain": "msvc"'
+        '}'
       build_numbers: YES
       service_account: "angle-try-builder@chops-service-accounts.iam.gserviceaccount.com"
       experiments {
         key: "luci.use_realms"
         value: 100
       }
+      resultdb {
+        enable: true
+      }
     }
     builders {
       name: "winuwp-x64-rel"
@@ -872,13 +1685,28 @@
         cipd_version: "refs/heads/master"
         cmd: "recipes"
       }
-      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"},\"builder_group\":\"angle\",\"platform\":\"win\",\"recipe\":\"angle\",\"test_mode\":\"compile_only\",\"toolchain\":\"msvc\"}"
+      properties:
+        '{'
+        '  "$build/goma": {'
+        '    "enable_ats": true,'
+        '    "rpc_extra_params": "?prod",'
+        '    "server_host": "goma.chromium.org"'
+        '  },'
+        '  "builder_group": "angle",'
+        '  "platform": "win",'
+        '  "recipe": "angle",'
+        '  "test_mode": "compile_only",'
+        '  "toolchain": "msvc"'
+        '}'
       build_numbers: YES
       service_account: "angle-try-builder@chops-service-accounts.iam.gserviceaccount.com"
       experiments {
         key: "luci.use_realms"
         value: 100
       }
+      resultdb {
+        enable: true
+      }
     }
   }
 }
diff --git a/infra/config/generated/luci-milo.cfg b/infra/config/generated/luci-milo.cfg
index 9e38b1f..bce57a0 100644
--- a/infra/config/generated/luci-milo.cfg
+++ b/infra/config/generated/luci-milo.cfg
@@ -56,6 +56,11 @@
     short_name: "dbg"
   }
   builders {
+    name: "buildbucket/luci.angle.ci/mac-exp"
+    category: "angle|mac|clang|x64"
+    short_name: "exp"
+  }
+  builders {
     name: "buildbucket/luci.angle.ci/mac-rel"
     category: "angle|mac|clang|x64"
     short_name: "rel"
@@ -121,19 +126,29 @@
     short_name: "rel"
   }
   builders {
-    name: "buildbucket/luci.angle.ci/android-perf"
+    name: "buildbucket/luci.angle.ci/android-pixel4-perf"
     category: "perf|android|clang|arm64"
-    short_name: "rel"
+    short_name: "pixel4"
   }
   builders {
-    name: "buildbucket/luci.angle.ci/linux-perf"
+    name: "buildbucket/luci.angle.ci/linux-intel-hd630-perf"
     category: "perf|linux|clang|x64"
-    short_name: "rel"
+    short_name: "intel"
   }
   builders {
-    name: "buildbucket/luci.angle.ci/win-perf"
+    name: "buildbucket/luci.angle.ci/linux-nvidia-p400-perf"
+    category: "perf|linux|clang|x64"
+    short_name: "nvidia"
+  }
+  builders {
+    name: "buildbucket/luci.angle.ci/win10-intel-hd630-perf"
     category: "perf|win|clang|x64"
-    short_name: "rel"
+    short_name: "intel"
+  }
+  builders {
+    name: "buildbucket/luci.angle.ci/win10-nvidia-p400-perf"
+    category: "perf|win|clang|x64"
+    short_name: "nvidia"
   }
 }
 consoles {
@@ -167,6 +182,9 @@
     name: "buildbucket/luci.angle.try/mac-dbg"
   }
   builders {
+    name: "buildbucket/luci.angle.try/mac-exp"
+  }
+  builders {
     name: "buildbucket/luci.angle.try/mac-rel"
   }
   builders {
diff --git a/infra/config/generated/luci-scheduler.cfg b/infra/config/generated/luci-scheduler.cfg
index 5d8c9df..93cf572 100644
--- a/infra/config/generated/luci-scheduler.cfg
+++ b/infra/config/generated/luci-scheduler.cfg
@@ -45,13 +45,13 @@
   }
 }
 job {
-  id: "android-perf"
+  id: "android-pixel4-perf"
   realm: "ci"
   acl_sets: "ci"
   buildbucket {
     server: "cr-buildbucket.appspot.com"
     bucket: "luci.angle.ci"
-    builder: "android-perf"
+    builder: "android-pixel4-perf"
   }
 }
 job {
@@ -95,13 +95,23 @@
   }
 }
 job {
-  id: "linux-perf"
+  id: "linux-intel-hd630-perf"
   realm: "ci"
   acl_sets: "ci"
   buildbucket {
     server: "cr-buildbucket.appspot.com"
     bucket: "luci.angle.ci"
-    builder: "linux-perf"
+    builder: "linux-intel-hd630-perf"
+  }
+}
+job {
+  id: "linux-nvidia-p400-perf"
+  realm: "ci"
+  acl_sets: "ci"
+  buildbucket {
+    server: "cr-buildbucket.appspot.com"
+    bucket: "luci.angle.ci"
+    builder: "linux-nvidia-p400-perf"
   }
 }
 job {
@@ -125,6 +135,16 @@
   }
 }
 job {
+  id: "mac-exp"
+  realm: "ci"
+  acl_sets: "ci"
+  buildbucket {
+    server: "cr-buildbucket.appspot.com"
+    bucket: "luci.angle.ci"
+    builder: "mac-exp"
+  }
+}
+job {
   id: "mac-rel"
   realm: "ci"
   acl_sets: "ci"
@@ -215,16 +235,6 @@
   }
 }
 job {
-  id: "win-perf"
-  realm: "ci"
-  acl_sets: "ci"
-  buildbucket {
-    server: "cr-buildbucket.appspot.com"
-    bucket: "luci.angle.ci"
-    builder: "win-perf"
-  }
-}
-job {
   id: "win-trace-rel"
   realm: "ci"
   acl_sets: "ci"
@@ -235,6 +245,26 @@
   }
 }
 job {
+  id: "win10-intel-hd630-perf"
+  realm: "ci"
+  acl_sets: "ci"
+  buildbucket {
+    server: "cr-buildbucket.appspot.com"
+    bucket: "luci.angle.ci"
+    builder: "win10-intel-hd630-perf"
+  }
+}
+job {
+  id: "win10-nvidia-p400-perf"
+  realm: "ci"
+  acl_sets: "ci"
+  buildbucket {
+    server: "cr-buildbucket.appspot.com"
+    bucket: "luci.angle.ci"
+    builder: "win10-nvidia-p400-perf"
+  }
+}
+job {
   id: "winuwp-x64-dbg"
   realm: "ci"
   acl_sets: "ci"
@@ -263,14 +293,16 @@
   triggers: "android-arm-rel"
   triggers: "android-arm64-dbg"
   triggers: "android-arm64-rel"
-  triggers: "android-perf"
+  triggers: "android-pixel4-perf"
   triggers: "linux-clang-dbg"
   triggers: "linux-clang-rel"
   triggers: "linux-gcc-dbg"
   triggers: "linux-gcc-rel"
-  triggers: "linux-perf"
+  triggers: "linux-intel-hd630-perf"
+  triggers: "linux-nvidia-p400-perf"
   triggers: "linux-trace-rel"
   triggers: "mac-dbg"
+  triggers: "mac-exp"
   triggers: "mac-rel"
   triggers: "win-clang-x64-dbg"
   triggers: "win-clang-x64-rel"
@@ -280,8 +312,9 @@
   triggers: "win-msvc-x64-rel"
   triggers: "win-msvc-x86-dbg"
   triggers: "win-msvc-x86-rel"
-  triggers: "win-perf"
   triggers: "win-trace-rel"
+  triggers: "win10-intel-hd630-perf"
+  triggers: "win10-nvidia-p400-perf"
   triggers: "winuwp-x64-dbg"
   triggers: "winuwp-x64-rel"
   gitiles {
diff --git a/infra/config/main.star b/infra/config/main.star
index 8acbb8e..10a6fa3 100755
--- a/infra/config/main.star
+++ b/infra/config/main.star
@@ -187,6 +187,9 @@
         return os.MAC
     return os.MAC
 
+def get_gpu_type_from_builder_name(name):
+    return name.split("-")[1]
+
 # Adds both the CI and Try standalone builders.
 def angle_builder(name, debug, cpu, toolchain = "clang", uwp = False, test_mode = "compile_and_test"):
     properties = {
@@ -223,9 +226,11 @@
         properties = properties,
         dimensions = dimensions,
         build_numbers = True,
+        resultdb_settings = resultdb.settings(enable = True),
     )
 
     is_perf = "-perf" in name
+    is_experimental = "-exp" in name
 
     # Trace tests are only included automatically if files in the capture folder change.
     if test_mode == "trace_tests":
@@ -245,7 +250,14 @@
     else:
         os_name = config_os.console_name
 
-    short_name = "dbg" if debug else "rel"
+    if is_perf:
+        short_name = get_gpu_type_from_builder_name(name)
+    elif is_experimental:
+        short_name = "exp"
+    elif debug:
+        short_name = "dbg"
+    else:
+        short_name = "rel"
 
     luci.console_view_entry(
         console_view = "ci",
@@ -269,10 +281,12 @@
             properties = properties,
             dimensions = dimensions,
             build_numbers = True,
+            resultdb_settings = resultdb.settings(enable = True),
         )
 
         # Include all other bots in the CQ by default except the placeholder GCC configs.
-        if toolchain != "gcc":
+        # Also exclude experimental bots.
+        if toolchain != "gcc" and not is_experimental:
             luci.cq_tryjob_verifier(
                 cq_group = "master",
                 builder = "angle:try/" + name,
@@ -317,6 +331,7 @@
         "repo_name": "angle",
         "runhooks": True,
     },
+    resultdb_settings = resultdb.settings(enable = True),
 )
 
 luci.gitiles_poller(
@@ -339,6 +354,7 @@
 angle_builder("linux-gcc-dbg", debug = True, cpu = "x64", toolchain = "gcc")
 angle_builder("linux-gcc-rel", debug = False, cpu = "x64", toolchain = "gcc")
 angle_builder("mac-dbg", debug = True, cpu = "x64")
+angle_builder("mac-exp", debug = False, cpu = "x64")
 angle_builder("mac-rel", debug = False, cpu = "x64")
 angle_builder("win-clang-x86-dbg", debug = True, cpu = "x86")
 angle_builder("win-clang-x86-rel", debug = False, cpu = "x86")
@@ -354,9 +370,11 @@
 angle_builder("linux-trace-rel", debug = False, cpu = "x64", test_mode = "trace_tests")
 angle_builder("win-trace-rel", debug = False, cpu = "x64", test_mode = "trace_tests")
 
-angle_builder("android-perf", debug = False, cpu = "arm64")
-angle_builder("linux-perf", debug = False, cpu = "x64")
-angle_builder("win-perf", debug = False, cpu = "x64")
+angle_builder("android-pixel4-perf", debug = False, cpu = "arm64")
+angle_builder("linux-intel-hd630-perf", debug = False, cpu = "x64")
+angle_builder("linux-nvidia-p400-perf", debug = False, cpu = "x64")
+angle_builder("win10-intel-hd630-perf", debug = False, cpu = "x64")
+angle_builder("win10-nvidia-p400-perf", debug = False, cpu = "x64")
 
 # Views
 
diff --git a/infra/specs/angle.json b/infra/specs/angle.json
index 279b931..9f03116 100644
--- a/infra/specs/angle.json
+++ b/infra/specs/angle.json
@@ -44,6 +44,44 @@
         "args": [
           "angle_deqp_gles2_tests",
           "--use-angle=vulkan",
+          "--direct-spirv-gen",
+          "-v",
+          "--shard-timeout=500"
+        ],
+        "merge": {
+          "script": "//scripts/angle_deqp_test_merge.py"
+        },
+        "name": "angle_deqp_gles2_vulkan_spirvgen_tests",
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "cipd_packages": [
+            {
+              "cipd_package": "infra/tools/luci/logdog/butler/${platform}",
+              "location": "bin",
+              "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c"
+            }
+          ],
+          "containment_type": "AUTO",
+          "dimension_sets": [
+            {
+              "device_os": "R",
+              "device_os_type": "userdebug",
+              "device_type": "flame",
+              "os": "Android",
+              "pool": "chromium.tests.gpu"
+            }
+          ],
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
+          "shards": 4
+        },
+        "test": "angle_deqp_gles2_tests",
+        "test_id_prefix": "ninja://src/tests:angle_deqp_gles2_tests/",
+        "use_isolated_scripts_api": true
+      },
+      {
+        "args": [
+          "angle_deqp_gles2_tests",
+          "--use-angle=vulkan",
           "-v",
           "--shard-timeout=500"
         ],
@@ -81,6 +119,44 @@
         "args": [
           "angle_deqp_gles31_tests",
           "--use-angle=vulkan",
+          "--direct-spirv-gen",
+          "-v",
+          "--shard-timeout=500"
+        ],
+        "merge": {
+          "script": "//scripts/angle_deqp_test_merge.py"
+        },
+        "name": "angle_deqp_gles31_vulkan_spirvgen_tests",
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "cipd_packages": [
+            {
+              "cipd_package": "infra/tools/luci/logdog/butler/${platform}",
+              "location": "bin",
+              "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c"
+            }
+          ],
+          "containment_type": "AUTO",
+          "dimension_sets": [
+            {
+              "device_os": "R",
+              "device_os_type": "userdebug",
+              "device_type": "flame",
+              "os": "Android",
+              "pool": "chromium.tests.gpu"
+            }
+          ],
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
+          "shards": 20
+        },
+        "test": "angle_deqp_gles31_tests",
+        "test_id_prefix": "ninja://src/tests:angle_deqp_gles31_tests/",
+        "use_isolated_scripts_api": true
+      },
+      {
+        "args": [
+          "angle_deqp_gles31_tests",
+          "--use-angle=vulkan",
           "-v",
           "--shard-timeout=500"
         ],
@@ -118,6 +194,44 @@
         "args": [
           "angle_deqp_gles3_tests",
           "--use-angle=vulkan",
+          "--direct-spirv-gen",
+          "-v",
+          "--shard-timeout=500"
+        ],
+        "merge": {
+          "script": "//scripts/angle_deqp_test_merge.py"
+        },
+        "name": "angle_deqp_gles3_vulkan_spirvgen_tests",
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "cipd_packages": [
+            {
+              "cipd_package": "infra/tools/luci/logdog/butler/${platform}",
+              "location": "bin",
+              "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c"
+            }
+          ],
+          "containment_type": "AUTO",
+          "dimension_sets": [
+            {
+              "device_os": "R",
+              "device_os_type": "userdebug",
+              "device_type": "flame",
+              "os": "Android",
+              "pool": "chromium.tests.gpu"
+            }
+          ],
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
+          "shards": 12
+        },
+        "test": "angle_deqp_gles3_tests",
+        "test_id_prefix": "ninja://src/tests:angle_deqp_gles3_tests/",
+        "use_isolated_scripts_api": true
+      },
+      {
+        "args": [
+          "angle_deqp_gles3_tests",
+          "--use-angle=vulkan",
           "-v",
           "--shard-timeout=500"
         ],
@@ -191,6 +305,44 @@
         "args": [
           "angle_deqp_khr_gles31_tests",
           "--use-angle=vulkan",
+          "--direct-spirv-gen",
+          "-v",
+          "--shard-timeout=500"
+        ],
+        "merge": {
+          "script": "//scripts/angle_deqp_test_merge.py"
+        },
+        "name": "angle_deqp_khr_gles31_vulkan_spirvgen_tests",
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "cipd_packages": [
+            {
+              "cipd_package": "infra/tools/luci/logdog/butler/${platform}",
+              "location": "bin",
+              "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c"
+            }
+          ],
+          "containment_type": "AUTO",
+          "dimension_sets": [
+            {
+              "device_os": "R",
+              "device_os_type": "userdebug",
+              "device_type": "flame",
+              "os": "Android",
+              "pool": "chromium.tests.gpu"
+            }
+          ],
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
+          "shards": 2
+        },
+        "test": "angle_deqp_khr_gles31_tests",
+        "test_id_prefix": "ninja://src/tests:angle_deqp_khr_gles31_tests/",
+        "use_isolated_scripts_api": true
+      },
+      {
+        "args": [
+          "angle_deqp_khr_gles31_tests",
+          "--use-angle=vulkan",
           "-v",
           "--shard-timeout=500"
         ],
@@ -228,6 +380,43 @@
         "args": [
           "angle_deqp_khr_gles32_tests",
           "--use-angle=vulkan",
+          "--direct-spirv-gen",
+          "-v",
+          "--shard-timeout=500"
+        ],
+        "merge": {
+          "script": "//scripts/angle_deqp_test_merge.py"
+        },
+        "name": "angle_deqp_khr_gles32_vulkan_spirvgen_tests",
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "cipd_packages": [
+            {
+              "cipd_package": "infra/tools/luci/logdog/butler/${platform}",
+              "location": "bin",
+              "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c"
+            }
+          ],
+          "containment_type": "AUTO",
+          "dimension_sets": [
+            {
+              "device_os": "R",
+              "device_os_type": "userdebug",
+              "device_type": "flame",
+              "os": "Android",
+              "pool": "chromium.tests.gpu"
+            }
+          ],
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "angle_deqp_khr_gles32_tests",
+        "test_id_prefix": "ninja://src/tests:angle_deqp_khr_gles32_tests/",
+        "use_isolated_scripts_api": true
+      },
+      {
+        "args": [
+          "angle_deqp_khr_gles32_tests",
+          "--use-angle=vulkan",
           "-v",
           "--shard-timeout=500"
         ],
@@ -264,6 +453,44 @@
         "args": [
           "angle_deqp_khr_gles3_tests",
           "--use-angle=vulkan",
+          "--direct-spirv-gen",
+          "-v",
+          "--shard-timeout=500"
+        ],
+        "merge": {
+          "script": "//scripts/angle_deqp_test_merge.py"
+        },
+        "name": "angle_deqp_khr_gles3_vulkan_spirvgen_tests",
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "cipd_packages": [
+            {
+              "cipd_package": "infra/tools/luci/logdog/butler/${platform}",
+              "location": "bin",
+              "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c"
+            }
+          ],
+          "containment_type": "AUTO",
+          "dimension_sets": [
+            {
+              "device_os": "R",
+              "device_os_type": "userdebug",
+              "device_type": "flame",
+              "os": "Android",
+              "pool": "chromium.tests.gpu"
+            }
+          ],
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
+          "shards": 2
+        },
+        "test": "angle_deqp_khr_gles3_tests",
+        "test_id_prefix": "ninja://src/tests:angle_deqp_khr_gles3_tests/",
+        "use_isolated_scripts_api": true
+      },
+      {
+        "args": [
+          "angle_deqp_khr_gles3_tests",
+          "--use-angle=vulkan",
           "-v",
           "--shard-timeout=500"
         ],
@@ -372,21 +599,15 @@
     "isolated_scripts": [
       {
         "args": [
-          "angle_perftests",
-          "--non-telemetry=true",
-          "--gtest-benchmark-name=angle_perftests",
-          "-v",
-          "--one-frame-only",
-          "--test-timeout=100",
-          "--gtest_filter=-TracePerfTest.*",
-          "--test-launcher-batch-limit=1"
+          "--log=debug",
+          "--smoke-test-mode"
         ],
         "isolate_name": "angle_perftests",
         "merge": {
           "args": [
             "--smoke-test-mode"
           ],
-          "script": "//tools/perf/process_perf_results.py"
+          "script": "//scripts/process_angle_perf_results.py"
         },
         "name": "angle_perftests",
         "swarming": {
@@ -409,7 +630,7 @@
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
-          "shards": 6
+          "shards": 20
         },
         "test_id_prefix": "ninja://src/tests:angle_perftests/"
       },
@@ -461,16 +682,11 @@
     "isolated_scripts": [
       {
         "args": [
-          "angle_perftests",
-          "--non-telemetry=true",
-          "--gtest-benchmark-name=angle_perftests",
-          "-v",
-          "--test-timeout=100",
-          "--test-launcher-batch-limit=1"
+          "--log=debug"
         ],
         "isolate_name": "angle_perftests",
         "merge": {
-          "script": "//tools/perf/process_perf_results.py"
+          "script": "//scripts/process_angle_perf_results.py"
         },
         "name": "angle_perftests",
         "swarming": {
@@ -493,7 +709,7 @@
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
-          "shards": 12
+          "shards": 30
         },
         "test_id_prefix": "ninja://src/tests:angle_perftests/"
       }
@@ -610,24 +826,15 @@
     "isolated_scripts": [
       {
         "args": [
-          "angle_perftests",
-          "--non-telemetry=true",
-          "--gtest-benchmark-name=angle_perftests",
-          "-v",
-          "--one-frame-only",
-          "--test-timeout=100",
-          "--gtest_filter=-TracePerfTest.*",
-          "--batch-size=1",
-          "--bot-mode",
-          "--max-processes=1",
-          "--print-test-stdout"
+          "--log=debug",
+          "--smoke-test-mode"
         ],
         "isolate_name": "angle_perftests",
         "merge": {
           "args": [
             "--smoke-test-mode"
           ],
-          "script": "//tools/perf/process_perf_results.py"
+          "script": "//scripts/process_angle_perf_results.py"
         },
         "name": "angle_perftests",
         "swarming": {
@@ -683,19 +890,11 @@
     "isolated_scripts": [
       {
         "args": [
-          "angle_perftests",
-          "--non-telemetry=true",
-          "--gtest-benchmark-name=angle_perftests",
-          "-v",
-          "--test-timeout=100",
-          "--batch-size=1",
-          "--bot-mode",
-          "--max-processes=1",
-          "--print-test-stdout"
+          "--log=debug"
         ],
         "isolate_name": "angle_perftests",
         "merge": {
-          "script": "//tools/perf/process_perf_results.py"
+          "script": "//scripts/process_angle_perf_results.py"
         },
         "name": "angle_perftests",
         "swarming": {
@@ -709,7 +908,7 @@
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
-          "shards": 10
+          "shards": 20
         },
         "test_id_prefix": "ninja://src/tests:angle_perftests/"
       }
@@ -801,6 +1000,33 @@
         "args": [
           "angle_deqp_gles2_tests",
           "--use-angle=vulkan",
+          "--direct-spirv-gen",
+          "--bot-mode"
+        ],
+        "merge": {
+          "script": "//scripts/angle_deqp_test_merge.py"
+        },
+        "name": "angle_deqp_gles2_vulkan_spirvgen_tests",
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "containment_type": "AUTO",
+          "dimension_sets": [
+            {
+              "gpu": "10de:1cb3-418.56",
+              "os": "Ubuntu-19.04",
+              "pool": "chromium.tests.gpu"
+            }
+          ],
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "angle_deqp_gles2_tests",
+        "test_id_prefix": "ninja://src/tests:angle_deqp_gles2_tests/",
+        "use_isolated_scripts_api": true
+      },
+      {
+        "args": [
+          "angle_deqp_gles2_tests",
+          "--use-angle=vulkan",
           "--bot-mode"
         ],
         "merge": {
@@ -932,6 +1158,34 @@
         "args": [
           "angle_deqp_gles31_tests",
           "--use-angle=vulkan",
+          "--direct-spirv-gen",
+          "--bot-mode"
+        ],
+        "merge": {
+          "script": "//scripts/angle_deqp_test_merge.py"
+        },
+        "name": "angle_deqp_gles31_vulkan_spirvgen_tests",
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "containment_type": "AUTO",
+          "dimension_sets": [
+            {
+              "gpu": "10de:1cb3-418.56",
+              "os": "Ubuntu-19.04",
+              "pool": "chromium.tests.gpu"
+            }
+          ],
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
+          "shards": 2
+        },
+        "test": "angle_deqp_gles31_tests",
+        "test_id_prefix": "ninja://src/tests:angle_deqp_gles31_tests/",
+        "use_isolated_scripts_api": true
+      },
+      {
+        "args": [
+          "angle_deqp_gles31_tests",
+          "--use-angle=vulkan",
           "--bot-mode"
         ],
         "merge": {
@@ -1067,6 +1321,34 @@
         "args": [
           "angle_deqp_gles3_tests",
           "--use-angle=vulkan",
+          "--direct-spirv-gen",
+          "--bot-mode"
+        ],
+        "merge": {
+          "script": "//scripts/angle_deqp_test_merge.py"
+        },
+        "name": "angle_deqp_gles3_vulkan_spirvgen_tests",
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "containment_type": "AUTO",
+          "dimension_sets": [
+            {
+              "gpu": "10de:1cb3-418.56",
+              "os": "Ubuntu-19.04",
+              "pool": "chromium.tests.gpu"
+            }
+          ],
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
+          "shards": 4
+        },
+        "test": "angle_deqp_gles3_tests",
+        "test_id_prefix": "ninja://src/tests:angle_deqp_gles3_tests/",
+        "use_isolated_scripts_api": true
+      },
+      {
+        "args": [
+          "angle_deqp_gles3_tests",
+          "--use-angle=vulkan",
           "--bot-mode"
         ],
         "merge": {
@@ -1120,6 +1402,33 @@
         "args": [
           "angle_deqp_khr_gles31_tests",
           "--use-angle=vulkan",
+          "--direct-spirv-gen",
+          "--bot-mode"
+        ],
+        "merge": {
+          "script": "//scripts/angle_deqp_test_merge.py"
+        },
+        "name": "angle_deqp_khr_gles31_vulkan_spirvgen_tests",
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "containment_type": "AUTO",
+          "dimension_sets": [
+            {
+              "gpu": "10de:1cb3-418.56",
+              "os": "Ubuntu-19.04",
+              "pool": "chromium.tests.gpu"
+            }
+          ],
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "angle_deqp_khr_gles31_tests",
+        "test_id_prefix": "ninja://src/tests:angle_deqp_khr_gles31_tests/",
+        "use_isolated_scripts_api": true
+      },
+      {
+        "args": [
+          "angle_deqp_khr_gles31_tests",
+          "--use-angle=vulkan",
           "--bot-mode"
         ],
         "merge": {
@@ -1146,6 +1455,33 @@
         "args": [
           "angle_deqp_khr_gles32_tests",
           "--use-angle=vulkan",
+          "--direct-spirv-gen",
+          "--bot-mode"
+        ],
+        "merge": {
+          "script": "//scripts/angle_deqp_test_merge.py"
+        },
+        "name": "angle_deqp_khr_gles32_vulkan_spirvgen_tests",
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "containment_type": "AUTO",
+          "dimension_sets": [
+            {
+              "gpu": "10de:1cb3-418.56",
+              "os": "Ubuntu-19.04",
+              "pool": "chromium.tests.gpu"
+            }
+          ],
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "angle_deqp_khr_gles32_tests",
+        "test_id_prefix": "ninja://src/tests:angle_deqp_khr_gles32_tests/",
+        "use_isolated_scripts_api": true
+      },
+      {
+        "args": [
+          "angle_deqp_khr_gles32_tests",
+          "--use-angle=vulkan",
           "--bot-mode"
         ],
         "merge": {
@@ -1172,6 +1508,33 @@
         "args": [
           "angle_deqp_khr_gles3_tests",
           "--use-angle=vulkan",
+          "--direct-spirv-gen",
+          "--bot-mode"
+        ],
+        "merge": {
+          "script": "//scripts/angle_deqp_test_merge.py"
+        },
+        "name": "angle_deqp_khr_gles3_vulkan_spirvgen_tests",
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "containment_type": "AUTO",
+          "dimension_sets": [
+            {
+              "gpu": "10de:1cb3-418.56",
+              "os": "Ubuntu-19.04",
+              "pool": "chromium.tests.gpu"
+            }
+          ],
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "angle_deqp_khr_gles3_tests",
+        "test_id_prefix": "ninja://src/tests:angle_deqp_khr_gles3_tests/",
+        "use_isolated_scripts_api": true
+      },
+      {
+        "args": [
+          "angle_deqp_khr_gles3_tests",
+          "--use-angle=vulkan",
           "--bot-mode"
         ],
         "merge": {
@@ -1275,24 +1638,15 @@
     "isolated_scripts": [
       {
         "args": [
-          "angle_perftests",
-          "--non-telemetry=true",
-          "--gtest-benchmark-name=angle_perftests",
-          "-v",
-          "--one-frame-only",
-          "--test-timeout=100",
-          "--gtest_filter=-TracePerfTest.*",
-          "--batch-size=1",
-          "--bot-mode",
-          "--max-processes=1",
-          "--print-test-stdout"
+          "--log=debug",
+          "--smoke-test-mode"
         ],
         "isolate_name": "angle_perftests",
         "merge": {
           "args": [
             "--smoke-test-mode"
           ],
-          "script": "//tools/perf/process_perf_results.py"
+          "script": "//scripts/process_angle_perf_results.py"
         },
         "name": "angle_perftests",
         "swarming": {
@@ -1347,19 +1701,11 @@
     "isolated_scripts": [
       {
         "args": [
-          "angle_perftests",
-          "--non-telemetry=true",
-          "--gtest-benchmark-name=angle_perftests",
-          "-v",
-          "--test-timeout=100",
-          "--batch-size=1",
-          "--bot-mode",
-          "--max-processes=1",
-          "--print-test-stdout"
+          "--log=debug"
         ],
         "isolate_name": "angle_perftests",
         "merge": {
-          "script": "//tools/perf/process_perf_results.py"
+          "script": "//scripts/process_angle_perf_results.py"
         },
         "name": "angle_perftests",
         "swarming": {
@@ -1373,7 +1719,7 @@
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
-          "shards": 10
+          "shards": 20
         },
         "test_id_prefix": "ninja://src/tests:angle_perftests/"
       }
@@ -1401,7 +1747,7 @@
               "display_attached": "1",
               "gpu": "1002:6821",
               "hidpi": "1",
-              "os": "Mac-10.14.6",
+              "os": "Mac-10.14.6|Mac-11.4",
               "pool": "chromium.tests.gpu"
             }
           ],
@@ -1430,7 +1776,7 @@
               "display_attached": "1",
               "gpu": "1002:6821",
               "hidpi": "1",
-              "os": "Mac-10.14.6",
+              "os": "Mac-10.14.6|Mac-11.4",
               "pool": "chromium.tests.gpu"
             }
           ],
@@ -1459,7 +1805,7 @@
               "display_attached": "1",
               "gpu": "1002:6821",
               "hidpi": "1",
-              "os": "Mac-10.14.6",
+              "os": "Mac-10.14.6|Mac-11.4",
               "pool": "chromium.tests.gpu"
             }
           ],
@@ -1488,7 +1834,7 @@
               "display_attached": "1",
               "gpu": "1002:6821",
               "hidpi": "1",
-              "os": "Mac-10.14.6",
+              "os": "Mac-10.14.6|Mac-11.4",
               "pool": "chromium.tests.gpu"
             }
           ],
@@ -1517,7 +1863,7 @@
               "display_attached": "1",
               "gpu": "1002:6821",
               "hidpi": "1",
-              "os": "Mac-10.14.6",
+              "os": "Mac-10.14.6|Mac-11.4",
               "pool": "chromium.tests.gpu"
             }
           ],
@@ -1548,7 +1894,7 @@
               "display_attached": "1",
               "gpu": "1002:6821",
               "hidpi": "1",
-              "os": "Mac-10.14.6",
+              "os": "Mac-10.14.6|Mac-11.4",
               "pool": "chromium.tests.gpu"
             }
           ],
@@ -1578,7 +1924,7 @@
               "display_attached": "1",
               "gpu": "1002:6821",
               "hidpi": "1",
-              "os": "Mac-10.14.6",
+              "os": "Mac-10.14.6|Mac-11.4",
               "pool": "chromium.tests.gpu"
             }
           ],
@@ -1606,7 +1952,246 @@
               "display_attached": "1",
               "gpu": "1002:6821",
               "hidpi": "1",
-              "os": "Mac-10.14.6",
+              "os": "Mac-10.14.6|Mac-11.4",
+              "pool": "chromium.tests.gpu"
+            }
+          ],
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "angle_unittests",
+        "test_id_prefix": "ninja://src/tests:angle_unittests/",
+        "use_isolated_scripts_api": true
+      }
+    ]
+  },
+  "mac-amd-exp": {
+    "gtest_tests": [
+      {
+        "args": [
+          "angle_deqp_egl_tests",
+          "--use-angle=gl",
+          "--bot-mode",
+          "--max-processes=1"
+        ],
+        "merge": {
+          "script": "//scripts/angle_deqp_test_merge.py"
+        },
+        "name": "angle_deqp_egl_gl_tests",
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "containment_type": "AUTO",
+          "dimension_sets": [
+            {
+              "cpu": "x86-64",
+              "display_attached": "1",
+              "gpu": "1002:6821",
+              "hidpi": "1",
+              "os": "Mac-11.4",
+              "pool": "chromium.tests.gpu"
+            }
+          ],
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "angle_deqp_egl_tests",
+        "test_id_prefix": "ninja://src/tests:angle_deqp_egl_tests/",
+        "use_isolated_scripts_api": true
+      },
+      {
+        "args": [
+          "angle_deqp_egl_tests",
+          "--use-angle=metal",
+          "--bot-mode"
+        ],
+        "merge": {
+          "script": "//scripts/angle_deqp_test_merge.py"
+        },
+        "name": "angle_deqp_egl_metal_tests",
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "containment_type": "AUTO",
+          "dimension_sets": [
+            {
+              "cpu": "x86-64",
+              "display_attached": "1",
+              "gpu": "1002:6821",
+              "hidpi": "1",
+              "os": "Mac-11.4",
+              "pool": "chromium.tests.gpu"
+            }
+          ],
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "angle_deqp_egl_tests",
+        "test_id_prefix": "ninja://src/tests:angle_deqp_egl_tests/",
+        "use_isolated_scripts_api": true
+      },
+      {
+        "args": [
+          "angle_deqp_gles2_tests",
+          "--use-angle=gl",
+          "--bot-mode"
+        ],
+        "merge": {
+          "script": "//scripts/angle_deqp_test_merge.py"
+        },
+        "name": "angle_deqp_gles2_gl_tests",
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "containment_type": "AUTO",
+          "dimension_sets": [
+            {
+              "cpu": "x86-64",
+              "display_attached": "1",
+              "gpu": "1002:6821",
+              "hidpi": "1",
+              "os": "Mac-11.4",
+              "pool": "chromium.tests.gpu"
+            }
+          ],
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "angle_deqp_gles2_tests",
+        "test_id_prefix": "ninja://src/tests:angle_deqp_gles2_tests/",
+        "use_isolated_scripts_api": true
+      },
+      {
+        "args": [
+          "angle_deqp_gles2_tests",
+          "--use-angle=metal",
+          "--bot-mode"
+        ],
+        "merge": {
+          "script": "//scripts/angle_deqp_test_merge.py"
+        },
+        "name": "angle_deqp_gles2_metal_tests",
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "containment_type": "AUTO",
+          "dimension_sets": [
+            {
+              "cpu": "x86-64",
+              "display_attached": "1",
+              "gpu": "1002:6821",
+              "hidpi": "1",
+              "os": "Mac-11.4",
+              "pool": "chromium.tests.gpu"
+            }
+          ],
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "angle_deqp_gles2_tests",
+        "test_id_prefix": "ninja://src/tests:angle_deqp_gles2_tests/",
+        "use_isolated_scripts_api": true
+      },
+      {
+        "args": [
+          "angle_deqp_gles3_tests",
+          "--use-angle=gl",
+          "--bot-mode"
+        ],
+        "merge": {
+          "script": "//scripts/angle_deqp_test_merge.py"
+        },
+        "name": "angle_deqp_gles3_gl_tests",
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "containment_type": "AUTO",
+          "dimension_sets": [
+            {
+              "cpu": "x86-64",
+              "display_attached": "1",
+              "gpu": "1002:6821",
+              "hidpi": "1",
+              "os": "Mac-11.4",
+              "pool": "chromium.tests.gpu"
+            }
+          ],
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
+          "shards": 2
+        },
+        "test": "angle_deqp_gles3_tests",
+        "test_id_prefix": "ninja://src/tests:angle_deqp_gles3_tests/",
+        "use_isolated_scripts_api": true
+      },
+      {
+        "args": [
+          "angle_deqp_gles3_tests",
+          "--use-angle=metal",
+          "--flaky-retries=2",
+          "--bot-mode"
+        ],
+        "merge": {
+          "script": "//scripts/angle_deqp_test_merge.py"
+        },
+        "name": "angle_deqp_gles3_metal_tests",
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "containment_type": "AUTO",
+          "dimension_sets": [
+            {
+              "cpu": "x86-64",
+              "display_attached": "1",
+              "gpu": "1002:6821",
+              "hidpi": "1",
+              "os": "Mac-11.4",
+              "pool": "chromium.tests.gpu"
+            }
+          ],
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
+          "shards": 2
+        },
+        "test": "angle_deqp_gles3_tests",
+        "test_id_prefix": "ninja://src/tests:angle_deqp_gles3_tests/",
+        "use_isolated_scripts_api": true
+      },
+      {
+        "args": [
+          "angle_end2end_tests",
+          "--gtest_filter=-*Vulkan_SwiftShader*",
+          "--bot-mode"
+        ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
+        },
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "containment_type": "AUTO",
+          "dimension_sets": [
+            {
+              "cpu": "x86-64",
+              "display_attached": "1",
+              "gpu": "1002:6821",
+              "hidpi": "1",
+              "os": "Mac-11.4",
+              "pool": "chromium.tests.gpu"
+            }
+          ],
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
+          "shards": 2
+        },
+        "test": "angle_end2end_tests",
+        "test_id_prefix": "ninja://src/tests:angle_end2end_tests/",
+        "use_isolated_scripts_api": true
+      },
+      {
+        "args": [
+          "angle_unittests"
+        ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
+        },
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "containment_type": "AUTO",
+          "dimension_sets": [
+            {
+              "cpu": "x86-64",
+              "display_attached": "1",
+              "gpu": "1002:6821",
+              "hidpi": "1",
+              "os": "Mac-11.4",
               "pool": "chromium.tests.gpu"
             }
           ],
@@ -1841,6 +2426,229 @@
       }
     ]
   },
+  "mac-intel-exp": {
+    "gtest_tests": [
+      {
+        "args": [
+          "angle_deqp_egl_tests",
+          "--use-angle=gl",
+          "--bot-mode",
+          "--max-processes=1"
+        ],
+        "merge": {
+          "script": "//scripts/angle_deqp_test_merge.py"
+        },
+        "name": "angle_deqp_egl_gl_tests",
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "containment_type": "AUTO",
+          "dimension_sets": [
+            {
+              "cpu": "x86-64",
+              "display_attached": "1",
+              "gpu": "8086:3e9b",
+              "os": "Mac-11.5.2"
+            }
+          ],
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "angle_deqp_egl_tests",
+        "test_id_prefix": "ninja://src/tests:angle_deqp_egl_tests/",
+        "use_isolated_scripts_api": true
+      },
+      {
+        "args": [
+          "angle_deqp_egl_tests",
+          "--use-angle=metal",
+          "--bot-mode"
+        ],
+        "merge": {
+          "script": "//scripts/angle_deqp_test_merge.py"
+        },
+        "name": "angle_deqp_egl_metal_tests",
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "containment_type": "AUTO",
+          "dimension_sets": [
+            {
+              "cpu": "x86-64",
+              "display_attached": "1",
+              "gpu": "8086:3e9b",
+              "os": "Mac-11.5.2"
+            }
+          ],
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "angle_deqp_egl_tests",
+        "test_id_prefix": "ninja://src/tests:angle_deqp_egl_tests/",
+        "use_isolated_scripts_api": true
+      },
+      {
+        "args": [
+          "angle_deqp_gles2_tests",
+          "--use-angle=gl",
+          "--bot-mode"
+        ],
+        "merge": {
+          "script": "//scripts/angle_deqp_test_merge.py"
+        },
+        "name": "angle_deqp_gles2_gl_tests",
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "containment_type": "AUTO",
+          "dimension_sets": [
+            {
+              "cpu": "x86-64",
+              "display_attached": "1",
+              "gpu": "8086:3e9b",
+              "os": "Mac-11.5.2"
+            }
+          ],
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "angle_deqp_gles2_tests",
+        "test_id_prefix": "ninja://src/tests:angle_deqp_gles2_tests/",
+        "use_isolated_scripts_api": true
+      },
+      {
+        "args": [
+          "angle_deqp_gles2_tests",
+          "--use-angle=metal",
+          "--bot-mode"
+        ],
+        "merge": {
+          "script": "//scripts/angle_deqp_test_merge.py"
+        },
+        "name": "angle_deqp_gles2_metal_tests",
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "containment_type": "AUTO",
+          "dimension_sets": [
+            {
+              "cpu": "x86-64",
+              "display_attached": "1",
+              "gpu": "8086:3e9b",
+              "os": "Mac-11.5.2"
+            }
+          ],
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "angle_deqp_gles2_tests",
+        "test_id_prefix": "ninja://src/tests:angle_deqp_gles2_tests/",
+        "use_isolated_scripts_api": true
+      },
+      {
+        "args": [
+          "angle_deqp_gles3_tests",
+          "--use-angle=gl",
+          "--bot-mode"
+        ],
+        "merge": {
+          "script": "//scripts/angle_deqp_test_merge.py"
+        },
+        "name": "angle_deqp_gles3_gl_tests",
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "containment_type": "AUTO",
+          "dimension_sets": [
+            {
+              "cpu": "x86-64",
+              "display_attached": "1",
+              "gpu": "8086:3e9b",
+              "os": "Mac-11.5.2"
+            }
+          ],
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
+          "shards": 2
+        },
+        "test": "angle_deqp_gles3_tests",
+        "test_id_prefix": "ninja://src/tests:angle_deqp_gles3_tests/",
+        "use_isolated_scripts_api": true
+      },
+      {
+        "args": [
+          "angle_deqp_gles3_tests",
+          "--use-angle=metal",
+          "--flaky-retries=2",
+          "--bot-mode"
+        ],
+        "merge": {
+          "script": "//scripts/angle_deqp_test_merge.py"
+        },
+        "name": "angle_deqp_gles3_metal_tests",
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "containment_type": "AUTO",
+          "dimension_sets": [
+            {
+              "cpu": "x86-64",
+              "display_attached": "1",
+              "gpu": "8086:3e9b",
+              "os": "Mac-11.5.2"
+            }
+          ],
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
+          "shards": 2
+        },
+        "test": "angle_deqp_gles3_tests",
+        "test_id_prefix": "ninja://src/tests:angle_deqp_gles3_tests/",
+        "use_isolated_scripts_api": true
+      },
+      {
+        "args": [
+          "angle_end2end_tests",
+          "--gtest_filter=-*Vulkan_SwiftShader*",
+          "--bot-mode"
+        ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
+        },
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "containment_type": "AUTO",
+          "dimension_sets": [
+            {
+              "cpu": "x86-64",
+              "display_attached": "1",
+              "gpu": "8086:3e9b",
+              "os": "Mac-11.5.2"
+            }
+          ],
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
+          "shards": 2
+        },
+        "test": "angle_end2end_tests",
+        "test_id_prefix": "ninja://src/tests:angle_end2end_tests/",
+        "use_isolated_scripts_api": true
+      },
+      {
+        "args": [
+          "angle_unittests"
+        ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
+        },
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "containment_type": "AUTO",
+          "dimension_sets": [
+            {
+              "cpu": "x86-64",
+              "display_attached": "1",
+              "gpu": "8086:3e9b",
+              "os": "Mac-11.5.2"
+            }
+          ],
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "angle_unittests",
+        "test_id_prefix": "ninja://src/tests:angle_unittests/",
+        "use_isolated_scripts_api": true
+      }
+    ]
+  },
   "mac-nvidia": {
     "gtest_tests": [
       {
@@ -2038,24 +2846,15 @@
     "isolated_scripts": [
       {
         "args": [
-          "angle_perftests",
-          "--non-telemetry=true",
-          "--gtest-benchmark-name=angle_perftests",
-          "-v",
-          "--one-frame-only",
-          "--test-timeout=100",
-          "--gtest_filter=-TracePerfTest.*",
-          "--batch-size=1",
-          "--bot-mode",
-          "--max-processes=1",
-          "--print-test-stdout"
+          "--log=debug",
+          "--smoke-test-mode"
         ],
         "isolate_name": "angle_perftests",
         "merge": {
           "args": [
             "--smoke-test-mode"
           ],
-          "script": "//tools/perf/process_perf_results.py"
+          "script": "//scripts/process_angle_perf_results.py"
         },
         "name": "angle_perftests",
         "swarming": {
@@ -2107,42 +2906,7 @@
       }
     ]
   },
-  "win10-x64-intel-perf": {
-    "isolated_scripts": [
-      {
-        "args": [
-          "angle_perftests",
-          "--non-telemetry=true",
-          "--gtest-benchmark-name=angle_perftests",
-          "-v",
-          "--test-timeout=100",
-          "--batch-size=1",
-          "--bot-mode",
-          "--max-processes=1",
-          "--print-test-stdout"
-        ],
-        "isolate_name": "angle_perftests",
-        "merge": {
-          "script": "//tools/perf/process_perf_results.py"
-        },
-        "name": "angle_perftests",
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "containment_type": "AUTO",
-          "dimension_sets": [
-            {
-              "gpu": "8086:5912-26.20.100.8141|8086:3e92-26.20.100.8141",
-              "os": "Windows-10",
-              "pool": "chromium.tests.gpu"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
-          "shards": 10
-        },
-        "test_id_prefix": "ninja://src/tests:angle_perftests/"
-      }
-    ]
-  },
+  "win10-x64-intel-perf": {},
   "win10-x64-nvidia": {
     "gtest_tests": [
       {
@@ -2281,6 +3045,33 @@
         "args": [
           "angle_deqp_gles2_tests",
           "--use-angle=vulkan",
+          "--direct-spirv-gen",
+          "--bot-mode"
+        ],
+        "merge": {
+          "script": "//scripts/angle_deqp_test_merge.py"
+        },
+        "name": "angle_deqp_gles2_vulkan_spirvgen_tests",
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "containment_type": "AUTO",
+          "dimension_sets": [
+            {
+              "gpu": "10de:1cb3-27.21.14.5148",
+              "os": "Windows-10-18363",
+              "pool": "chromium.tests.gpu"
+            }
+          ],
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "angle_deqp_gles2_tests",
+        "test_id_prefix": "ninja://src/tests:angle_deqp_gles2_tests/",
+        "use_isolated_scripts_api": true
+      },
+      {
+        "args": [
+          "angle_deqp_gles2_tests",
+          "--use-angle=vulkan",
           "--bot-mode"
         ],
         "merge": {
@@ -2439,6 +3230,34 @@
         "args": [
           "angle_deqp_gles31_tests",
           "--use-angle=vulkan",
+          "--direct-spirv-gen",
+          "--bot-mode"
+        ],
+        "merge": {
+          "script": "//scripts/angle_deqp_test_merge.py"
+        },
+        "name": "angle_deqp_gles31_vulkan_spirvgen_tests",
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "containment_type": "AUTO",
+          "dimension_sets": [
+            {
+              "gpu": "10de:1cb3-27.21.14.5148",
+              "os": "Windows-10-18363",
+              "pool": "chromium.tests.gpu"
+            }
+          ],
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
+          "shards": 2
+        },
+        "test": "angle_deqp_gles31_tests",
+        "test_id_prefix": "ninja://src/tests:angle_deqp_gles31_tests/",
+        "use_isolated_scripts_api": true
+      },
+      {
+        "args": [
+          "angle_deqp_gles31_tests",
+          "--use-angle=vulkan",
           "--bot-mode"
         ],
         "merge": {
@@ -2601,6 +3420,34 @@
         "args": [
           "angle_deqp_gles3_tests",
           "--use-angle=vulkan",
+          "--direct-spirv-gen",
+          "--bot-mode"
+        ],
+        "merge": {
+          "script": "//scripts/angle_deqp_test_merge.py"
+        },
+        "name": "angle_deqp_gles3_vulkan_spirvgen_tests",
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "containment_type": "AUTO",
+          "dimension_sets": [
+            {
+              "gpu": "10de:1cb3-27.21.14.5148",
+              "os": "Windows-10-18363",
+              "pool": "chromium.tests.gpu"
+            }
+          ],
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
+          "shards": 4
+        },
+        "test": "angle_deqp_gles3_tests",
+        "test_id_prefix": "ninja://src/tests:angle_deqp_gles3_tests/",
+        "use_isolated_scripts_api": true
+      },
+      {
+        "args": [
+          "angle_deqp_gles3_tests",
+          "--use-angle=vulkan",
           "--bot-mode"
         ],
         "merge": {
@@ -2654,6 +3501,33 @@
         "args": [
           "angle_deqp_khr_gles31_tests",
           "--use-angle=vulkan",
+          "--direct-spirv-gen",
+          "--bot-mode"
+        ],
+        "merge": {
+          "script": "//scripts/angle_deqp_test_merge.py"
+        },
+        "name": "angle_deqp_khr_gles31_vulkan_spirvgen_tests",
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "containment_type": "AUTO",
+          "dimension_sets": [
+            {
+              "gpu": "10de:1cb3-27.21.14.5148",
+              "os": "Windows-10-18363",
+              "pool": "chromium.tests.gpu"
+            }
+          ],
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "angle_deqp_khr_gles31_tests",
+        "test_id_prefix": "ninja://src/tests:angle_deqp_khr_gles31_tests/",
+        "use_isolated_scripts_api": true
+      },
+      {
+        "args": [
+          "angle_deqp_khr_gles31_tests",
+          "--use-angle=vulkan",
           "--bot-mode"
         ],
         "merge": {
@@ -2680,6 +3554,33 @@
         "args": [
           "angle_deqp_khr_gles32_tests",
           "--use-angle=vulkan",
+          "--direct-spirv-gen",
+          "--bot-mode"
+        ],
+        "merge": {
+          "script": "//scripts/angle_deqp_test_merge.py"
+        },
+        "name": "angle_deqp_khr_gles32_vulkan_spirvgen_tests",
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "containment_type": "AUTO",
+          "dimension_sets": [
+            {
+              "gpu": "10de:1cb3-27.21.14.5148",
+              "os": "Windows-10-18363",
+              "pool": "chromium.tests.gpu"
+            }
+          ],
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "angle_deqp_khr_gles32_tests",
+        "test_id_prefix": "ninja://src/tests:angle_deqp_khr_gles32_tests/",
+        "use_isolated_scripts_api": true
+      },
+      {
+        "args": [
+          "angle_deqp_khr_gles32_tests",
+          "--use-angle=vulkan",
           "--bot-mode"
         ],
         "merge": {
@@ -2706,6 +3607,33 @@
         "args": [
           "angle_deqp_khr_gles3_tests",
           "--use-angle=vulkan",
+          "--direct-spirv-gen",
+          "--bot-mode"
+        ],
+        "merge": {
+          "script": "//scripts/angle_deqp_test_merge.py"
+        },
+        "name": "angle_deqp_khr_gles3_vulkan_spirvgen_tests",
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "containment_type": "AUTO",
+          "dimension_sets": [
+            {
+              "gpu": "10de:1cb3-27.21.14.5148",
+              "os": "Windows-10-18363",
+              "pool": "chromium.tests.gpu"
+            }
+          ],
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "angle_deqp_khr_gles3_tests",
+        "test_id_prefix": "ninja://src/tests:angle_deqp_khr_gles3_tests/",
+        "use_isolated_scripts_api": true
+      },
+      {
+        "args": [
+          "angle_deqp_khr_gles3_tests",
+          "--use-angle=vulkan",
           "--bot-mode"
         ],
         "merge": {
@@ -2834,24 +3762,15 @@
     "isolated_scripts": [
       {
         "args": [
-          "angle_perftests",
-          "--non-telemetry=true",
-          "--gtest-benchmark-name=angle_perftests",
-          "-v",
-          "--one-frame-only",
-          "--test-timeout=100",
-          "--gtest_filter=-TracePerfTest.*",
-          "--batch-size=1",
-          "--bot-mode",
-          "--max-processes=1",
-          "--print-test-stdout"
+          "--log=debug",
+          "--smoke-test-mode"
         ],
         "isolate_name": "angle_perftests",
         "merge": {
           "args": [
             "--smoke-test-mode"
           ],
-          "script": "//tools/perf/process_perf_results.py"
+          "script": "//scripts/process_angle_perf_results.py"
         },
         "name": "angle_perftests",
         "swarming": {
@@ -2906,19 +3825,11 @@
     "isolated_scripts": [
       {
         "args": [
-          "angle_perftests",
-          "--non-telemetry=true",
-          "--gtest-benchmark-name=angle_perftests",
-          "-v",
-          "--test-timeout=100",
-          "--batch-size=1",
-          "--bot-mode",
-          "--max-processes=1",
-          "--print-test-stdout"
+          "--log=debug"
         ],
         "isolate_name": "angle_perftests",
         "merge": {
-          "script": "//tools/perf/process_perf_results.py"
+          "script": "//scripts/process_angle_perf_results.py"
         },
         "name": "angle_perftests",
         "swarming": {
@@ -2932,7 +3843,7 @@
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
-          "shards": 10
+          "shards": 20
         },
         "test_id_prefix": "ninja://src/tests:angle_perftests/"
       }
diff --git a/infra/specs/angle_mb_config.pyl b/infra/specs/angle_mb_config.pyl
index 9ecbd08..d44056d 100644
--- a/infra/specs/angle_mb_config.pyl
+++ b/infra/specs/angle_mb_config.pyl
@@ -18,13 +18,15 @@
       'android-arm-rel': 'angle_goma_android_arm_release_bot',
       'android-arm64-dbg': 'angle_goma_android_arm64_debug_bot',
       'android-arm64-rel': 'angle_goma_android_arm64_release_bot',
-      'android-perf': 'angle_goma_android_perf_bot',
+      'android-pixel4-perf': 'angle_goma_android_perf_bot',
       'linux-clang-dbg': 'angle_goma_debug_bot',
       'linux-clang-rel': 'angle_goma_release_bot',
       'linux-gcc-dbg': 'angle_non_clang_debug_bot',
       'linux-gcc-rel': 'angle_non_clang_release_bot',
-      'linux-perf': 'angle_goma_perf_bot',
+      'linux-intel-hd630-perf': 'angle_goma_perf_bot',
+      'linux-nvidia-p400-perf': 'angle_goma_perf_bot',
       'mac-dbg': 'angle_goma_debug_bot',
+      'mac-exp': 'angle_goma_release_bot',
       'mac-rel': 'angle_goma_release_bot',
       'win-clang-x64-dbg': 'angle_goma_debug_bot',
       'win-clang-x64-rel': 'angle_goma_release_bot',
@@ -34,7 +36,8 @@
       'win-msvc-x64-rel': 'angle_non_clang_release_bot',
       'win-msvc-x86-dbg': 'angle_non_clang_x86_debug_bot',
       'win-msvc-x86-rel': 'angle_non_clang_x86_release_bot',
-      'win-perf': 'angle_goma_perf_bot',
+      'win10-intel-hd630-perf': 'angle_goma_perf_bot',
+      'win10-nvidia-p400-perf': 'angle_goma_perf_bot',
       'winuwp-x64-dbg': 'angle_winuwp_non_clang_debug_bot',
       'winuwp-x64-rel': 'angle_winuwp_non_clang_release_bot',
     },
@@ -92,10 +95,10 @@
       'gn_args': 'is_clang=false',
     },
     'perf': {
-      'gn_args': 'is_debug=false symbol_level=1',
+      'gn_args': 'is_debug=false dcheck_always_on=false symbol_level=1',
     },
     'release': {
-      'gn_args': 'is_debug=false angle_assert_always_on=true symbol_level=1',
+      'gn_args': 'is_debug=false dcheck_always_on=true symbol_level=1',
     },
     'traces': {
       'gn_args': 'build_angle_trace_perf_tests=true',
diff --git a/infra/specs/gn_isolate_map.pyl b/infra/specs/gn_isolate_map.pyl
index c212359..b600f84 100644
--- a/infra/specs/gn_isolate_map.pyl
+++ b/infra/specs/gn_isolate_map.pyl
@@ -19,7 +19,7 @@
 
 # TODO(crbug.com/816629): Remove the need for this file altogether :). Also,
 # see the canonical Chromium copy:
-# https://chromium.googlesource.com/chromium/src/+/refs/heads/master/testing/buildbot/gn_isolate_map.pyl
+# https://chromium.googlesource.com/chromium/src/+/refs/heads/main/testing/buildbot/gn_isolate_map.pyl
 
 {
   "angle_apks": {
@@ -107,21 +107,14 @@
     "type": "script",
   },
   "angle_perftests": {
-    "args": [
-      "angle_perftests",
-      "--non-telemetry=true",
-      "--test-launcher-print-test-stdio=always",
-      "--test-launcher-jobs=1",
-      "--test-launcher-retry-limit=0",
-    ],
     "label": "//src/tests:angle_perftests",
-    "script": "//testing/scripts/run_performance_tests.py",
+    "script": "//src/tests/run_perf_tests.py",
     "type": "script",
   },
   "angle_restricted_trace_gold_tests": {
-    "type": "script",
     "label": "//src/tests/restricted_traces:angle_restricted_trace_gold_tests",
     "script": "//src/tests/restricted_traces/restricted_trace_gold_tests.py",
+    "type": "script",
   },
   "angle_unittests": {
     "label": "//src/tests:angle_unittests",
@@ -130,7 +123,7 @@
   },
   "angle_white_box_perftests": {
     "label": "//src/tests:angle_white_box_tests",
-    "script": "//scripts/run_gtest_angle_test.py",
+    "script": "//src/tests/run_perf_tests.py",
     "type": "script",
   },
   "angle_white_box_tests": {
diff --git a/infra/specs/mixins.pyl b/infra/specs/mixins.pyl
index 5e57a4a..64dfd7e 100644
--- a/infra/specs/mixins.pyl
+++ b/infra/specs/mixins.pyl
@@ -33,11 +33,21 @@
                                                                'display_attached': '1',
                                                                'gpu': '8086:0a2e',
                                                                'os': 'Mac-10.15.7'}}},
+  'mac_mini_intel_uhd_630_gpu_stable': { 'swarming': { 'dimensions': { 'cpu': 'x86-64',
+                                                                       'display_attached': '1',
+                                                                       'gpu': '8086:3e9b',
+                                                                       'os': 'Mac-11.5.2'}}},
+  'mac_retina_amd_gpu_experimental': { 'swarming': { 'dimensions': { 'cpu': 'x86-64',
+                                                                     'display_attached': '1',
+                                                                     'gpu': '1002:6821',
+                                                                     'hidpi': '1',
+                                                                     'os': 'Mac-11.4',
+                                                                     'pool': 'chromium.tests.gpu'}}},
   'mac_retina_amd_gpu_stable': { 'swarming': { 'dimensions': { 'cpu': 'x86-64',
                                                                'display_attached': '1',
                                                                'gpu': '1002:6821',
                                                                'hidpi': '1',
-                                                               'os': 'Mac-10.14.6',
+                                                               'os': 'Mac-10.14.6|Mac-11.4',
                                                                'pool': 'chromium.tests.gpu'}}},
   'mac_retina_nvidia_gpu_stable': { 'swarming': { 'dimensions': { 'cpu': 'x86-64',
                                                                   'display_attached': '1',
diff --git a/infra/specs/test_suites.pyl b/infra/specs/test_suites.pyl
index 39f6dd7..d41b22d 100644
--- a/infra/specs/test_suites.pyl
+++ b/infra/specs/test_suites.pyl
@@ -204,6 +204,31 @@
       },
     },
 
+    'angle_deqp_gles2_vulkan_spirvgen_gtests': {
+      'angle_deqp_gles2_vulkan_spirvgen_tests': {
+        'args': [
+          'angle_deqp_gles2_tests',
+          '--use-angle=vulkan',
+          '--direct-spirv-gen',
+        ],
+        'android_args': [
+          '-v',
+          '--shard-timeout=500',
+        ],
+        'android_swarming': {
+          'shards': 4,
+        },
+        'desktop_args': [
+          '--bot-mode',
+        ],
+        'merge': {
+          'script': '//scripts/angle_deqp_test_merge.py',
+        },
+        'test': 'angle_deqp_gles2_tests',
+        'use_isolated_scripts_api': True,
+      },
+    },
+
     'angle_deqp_gles31_d3d11_gtests': {
       'angle_deqp_gles31_d3d11_tests': {
         'args': [
@@ -327,6 +352,34 @@
       },
     },
 
+    'angle_deqp_gles31_vulkan_spirvgen_gtests': {
+      'angle_deqp_gles31_vulkan_spirvgen_tests': {
+        'args': [
+          'angle_deqp_gles31_tests',
+          '--use-angle=vulkan',
+          '--direct-spirv-gen',
+        ],
+        'android_args': [
+          '-v',
+          '--shard-timeout=500',
+        ],
+        'android_swarming': {
+          'shards': 20,
+        },
+        'desktop_args': [
+          '--bot-mode',
+        ],
+        'merge': {
+          'script': '//scripts/angle_deqp_test_merge.py',
+        },
+        'swarming': {
+          'shards': 2,
+        },
+        'test': 'angle_deqp_gles31_tests',
+        'use_isolated_scripts_api': True,
+      },
+    },
+
     'angle_deqp_gles3_d3d11_gtests': {
       'angle_deqp_gles3_d3d11_tests': {
         'args': [
@@ -494,6 +547,34 @@
       },
     },
 
+    'angle_deqp_gles3_vulkan_spirvgen_gtests': {
+      'angle_deqp_gles3_vulkan_spirvgen_tests': {
+        'args': [
+          'angle_deqp_gles3_tests',
+          '--use-angle=vulkan',
+          '--direct-spirv-gen',
+        ],
+        'android_args': [
+          '-v',
+          '--shard-timeout=500',
+        ],
+        'android_swarming': {
+          'shards': 12,
+        },
+        'desktop_args': [
+          '--bot-mode',
+        ],
+        'merge': {
+          'script': '//scripts/angle_deqp_test_merge.py',
+        },
+        'swarming': {
+          'shards': 4,
+        },
+        'test': 'angle_deqp_gles3_tests',
+        'use_isolated_scripts_api': True,
+      },
+    },
+
     'angle_deqp_khr_gles2_vulkan_gtests': {
       'angle_deqp_khr_gles2_vulkan_tests': {
         'args': [
@@ -539,6 +620,31 @@
       },
     },
 
+    'angle_deqp_khr_gles31_vulkan_spirvgen_gtests': {
+      'angle_deqp_khr_gles31_vulkan_spirvgen_tests': {
+        'args': [
+          'angle_deqp_khr_gles31_tests',
+          '--use-angle=vulkan',
+          '--direct-spirv-gen',
+        ],
+        'android_args': [
+          '-v',
+          '--shard-timeout=500',
+        ],
+        'android_swarming': {
+          'shards': 2,
+        },
+        'desktop_args': [
+          '--bot-mode',
+        ],
+        'merge': {
+          'script': '//scripts/angle_deqp_test_merge.py',
+        },
+        'test': 'angle_deqp_khr_gles31_tests',
+        'use_isolated_scripts_api': True,
+      },
+    },
+
     'angle_deqp_khr_gles32_vulkan_gtests': {
       'angle_deqp_khr_gles32_vulkan_tests': {
         'args': [
@@ -560,6 +666,28 @@
       },
     },
 
+    'angle_deqp_khr_gles32_vulkan_spirvgen_gtests': {
+      'angle_deqp_khr_gles32_vulkan_spirvgen_tests': {
+        'args': [
+          'angle_deqp_khr_gles32_tests',
+          '--use-angle=vulkan',
+          '--direct-spirv-gen',
+        ],
+        'android_args': [
+          '-v',
+          '--shard-timeout=500',
+        ],
+        'desktop_args': [
+          '--bot-mode',
+        ],
+        'merge': {
+          'script': '//scripts/angle_deqp_test_merge.py',
+        },
+        'test': 'angle_deqp_khr_gles32_tests',
+        'use_isolated_scripts_api': True,
+      },
+    },
+
     'angle_deqp_khr_gles3_vulkan_gtests': {
       'angle_deqp_khr_gles3_vulkan_tests': {
         'args': [
@@ -584,6 +712,31 @@
       },
     },
 
+    'angle_deqp_khr_gles3_vulkan_spirvgen_gtests': {
+      'angle_deqp_khr_gles3_vulkan_spirvgen_tests': {
+        'args': [
+          'angle_deqp_khr_gles3_tests',
+          '--use-angle=vulkan',
+          '--direct-spirv-gen',
+        ],
+        'android_args': [
+          '-v',
+          '--shard-timeout=500',
+        ],
+        'android_swarming': {
+          'shards': 2,
+        },
+        'desktop_args': [
+          '--bot-mode',
+        ],
+        'merge': {
+          'script': '//scripts/angle_deqp_test_merge.py',
+        },
+        'test': 'angle_deqp_khr_gles3_tests',
+        'use_isolated_scripts_api': True,
+      },
+    },
+
     'angle_end2end_gtests': {
       'angle_end2end_tests': {
         'android_args': [
@@ -651,29 +804,16 @@
     'angle_perf_isolated_scripts': {
       'angle_perftests': {
         'args': [
-          'angle_perftests',
-          '--non-telemetry=true',
-          '--gtest-benchmark-name=angle_perftests',
-          '-v',
-          '--test-timeout=100',
-        ],
-        'android_args': [
-          '--test-launcher-batch-limit=1',
-        ],
-        'desktop_args': [
-          '--batch-size=1',
-          '--bot-mode',
-          '--max-processes=1',
-          '--print-test-stdout',
+          '--log=debug',
         ],
         'merge': {
-          'script': '//tools/perf/process_perf_results.py',
+          'script': '//scripts/process_angle_perf_results.py',
         },
         'android_swarming': {
-          'shards': 12,
+          'shards': 30,
         },
         'swarming': {
-          'shards': 10,
+          'shards': 20,
         },
       },
     },
@@ -683,27 +823,11 @@
     'angle_perf_smoke_isolated_scripts': {
       'angle_perftests': {
         'args': [
-          'angle_perftests',
-          '--non-telemetry=true',
-          '--gtest-benchmark-name=angle_perftests',
-          '-v',
-          # Tell the tests to exit after one frame for faster iteration.
-          '--one-frame-only',
-          '--test-timeout=100',
-          # Do not run trace tests because they're already run in Gold tests.
-          '--gtest_filter=-TracePerfTest.*',
-        ],
-        'android_args': [
-          '--test-launcher-batch-limit=1',
-        ],
-        'desktop_args': [
-          '--batch-size=1',
-          '--bot-mode',
-          '--max-processes=1',
-          '--print-test-stdout',
+          '--log=debug',
+          '--smoke-test-mode',
         ],
         'merge': {
-          'script': '//tools/perf/process_perf_results.py',
+          'script': '//scripts/process_angle_perf_results.py',
           # Does not upload to the perf dashboard
           'args': [
             '--smoke-test-mode',
@@ -713,7 +837,7 @@
           'shards': 2,
         },
         'android_swarming': {
-          'shards': 6,
+          'shards': 20,
         },
       },
     },
@@ -770,12 +894,18 @@
     'android_gtests': [
       'angle_deqp_egl_vulkan_gtests',
       'angle_deqp_gles2_vulkan_gtests',
+      'angle_deqp_gles2_vulkan_spirvgen_gtests',
       'angle_deqp_gles31_vulkan_gtests',
+      'angle_deqp_gles31_vulkan_spirvgen_gtests',
       'angle_deqp_gles3_vulkan_gtests',
+      'angle_deqp_gles3_vulkan_spirvgen_gtests',
       'angle_deqp_khr_gles2_vulkan_gtests',
       'angle_deqp_khr_gles31_vulkan_gtests',
+      'angle_deqp_khr_gles31_vulkan_spirvgen_gtests',
       'angle_deqp_khr_gles32_vulkan_gtests',
+      'angle_deqp_khr_gles32_vulkan_spirvgen_gtests',
       'angle_deqp_khr_gles3_vulkan_gtests',
+      'angle_deqp_khr_gles3_vulkan_spirvgen_gtests',
       'angle_end2end_gtests',
       'angle_unit_gtests',
     ],
@@ -797,20 +927,26 @@
       'angle_deqp_egl_vulkan_gtests',
       'angle_deqp_gles2_gl_gtests',
       'angle_deqp_gles2_vulkan_gtests',
+      'angle_deqp_gles2_vulkan_spirvgen_gtests',
       'angle_deqp_gles31_gl_gtests',
       'angle_deqp_gles31_vulkan_gtests',
       'angle_deqp_gles31_vulkan_rotate180_gtests',
       'angle_deqp_gles31_vulkan_rotate270_gtests',
       'angle_deqp_gles31_vulkan_rotate90_gtests',
+      'angle_deqp_gles31_vulkan_spirvgen_gtests',
       'angle_deqp_gles3_gl_gtests',
       'angle_deqp_gles3_vulkan_gtests',
       'angle_deqp_gles3_vulkan_rotate180_gtests',
       'angle_deqp_gles3_vulkan_rotate270_gtests',
       'angle_deqp_gles3_vulkan_rotate90_gtests',
+      'angle_deqp_gles3_vulkan_spirvgen_gtests',
       'angle_deqp_khr_gles2_vulkan_gtests',
       'angle_deqp_khr_gles31_vulkan_gtests',
+      'angle_deqp_khr_gles31_vulkan_spirvgen_gtests',
       'angle_deqp_khr_gles32_vulkan_gtests',
+      'angle_deqp_khr_gles32_vulkan_spirvgen_gtests',
       'angle_deqp_khr_gles3_vulkan_gtests',
+      'angle_deqp_khr_gles3_vulkan_spirvgen_gtests',
       'angle_end2end_gtests',
       'angle_unit_gtests',
       'angle_white_box_gtests',
@@ -847,22 +983,28 @@
       'angle_deqp_gles2_d3d11_gtests',
       'angle_deqp_gles2_gl_gtests',
       'angle_deqp_gles2_vulkan_gtests',
+      'angle_deqp_gles2_vulkan_spirvgen_gtests',
       'angle_deqp_gles31_d3d11_gtests',
       'angle_deqp_gles31_gl_gtests',
       'angle_deqp_gles31_vulkan_gtests',
       'angle_deqp_gles31_vulkan_rotate180_gtests',
       'angle_deqp_gles31_vulkan_rotate270_gtests',
       'angle_deqp_gles31_vulkan_rotate90_gtests',
+      'angle_deqp_gles31_vulkan_spirvgen_gtests',
       'angle_deqp_gles3_d3d11_gtests',
       'angle_deqp_gles3_gl_gtests',
       'angle_deqp_gles3_vulkan_gtests',
       'angle_deqp_gles3_vulkan_rotate180_gtests',
       'angle_deqp_gles3_vulkan_rotate270_gtests',
       'angle_deqp_gles3_vulkan_rotate90_gtests',
+      'angle_deqp_gles3_vulkan_spirvgen_gtests',
       'angle_deqp_khr_gles2_vulkan_gtests',
       'angle_deqp_khr_gles31_vulkan_gtests',
+      'angle_deqp_khr_gles31_vulkan_spirvgen_gtests',
       'angle_deqp_khr_gles32_vulkan_gtests',
+      'angle_deqp_khr_gles32_vulkan_spirvgen_gtests',
       'angle_deqp_khr_gles3_vulkan_gtests',
+      'angle_deqp_khr_gles3_vulkan_spirvgen_gtests',
       'angle_end2end_gtests',
       'angle_gles1_conformance_gtests',
       'angle_unit_gtests',
@@ -887,4 +1029,4 @@
       'angle_deqp_gles3_d3d11_gtests',
     ],
   },
-}
\ No newline at end of file
+}
diff --git a/infra/specs/trybot_analyze_config.json b/infra/specs/trybot_analyze_config.json
index f37cd17..57c6a28 100644
--- a/infra/specs/trybot_analyze_config.json
+++ b/infra/specs/trybot_analyze_config.json
@@ -2,7 +2,7 @@
     "angle": {
         "exclusions": [
             "DEPS",
-            "infra/specs/*"
+            "infra/specs/.*"
         ]
     }
 }
diff --git a/infra/specs/waterfalls.pyl b/infra/specs/waterfalls.pyl
index fa51e89..66cf7e3 100644
--- a/infra/specs/waterfalls.pyl
+++ b/infra/specs/waterfalls.pyl
@@ -89,6 +89,15 @@
           'gtest_tests': 'mac_amd_and_intel_gtests',
         },
       },
+      'mac-amd-exp': {
+        'os_type': 'mac',
+        'mixins': [
+          'mac_retina_amd_gpu_experimental',
+        ],
+        'test_suites': {
+          'gtest_tests': 'mac_amd_and_intel_gtests',
+        },
+      },
       'mac-intel': {
         'os_type': 'mac',
         'mixins': [
@@ -98,6 +107,15 @@
           'gtest_tests': 'mac_amd_and_intel_gtests',
         },
       },
+      'mac-intel-exp': {
+        'os_type': 'mac',
+        'mixins': [
+          'mac_mini_intel_uhd_630_gpu_stable',
+        ],
+        'test_suites': {
+          'gtest_tests': 'mac_amd_and_intel_gtests',
+        },
+      },
       'mac-nvidia': {
         'os_type': 'mac',
         'mixins': [
@@ -124,7 +142,6 @@
           'win10_intel_hd_630_stable',
         ],
         'test_suites': {
-          'isolated_scripts': 'angle_perf_isolated_scripts',
         },
       },
       'win10-x64-nvidia': {
diff --git a/samples/capture_replay/CaptureReplay.cpp b/samples/capture_replay/CaptureReplay.cpp
index 98e5e6c..fd4e2ca 100644
--- a/samples/capture_replay/CaptureReplay.cpp
+++ b/samples/capture_replay/CaptureReplay.cpp
@@ -9,7 +9,7 @@
 
 #include <functional>
 
-#include "util/frame_capture_test_utils.h"
+#include "util/capture/frame_capture_test_utils.h"
 
 // Build the right context header based on replay ID
 // This will expand to "angle_capture_context<#>.h"
diff --git a/samples/shader_translator/shader_translator.cpp b/samples/shader_translator/shader_translator.cpp
index e0de7fc..0a136aa 100644
--- a/samples/shader_translator/shader_translator.cpp
+++ b/samples/shader_translator/shader_translator.cpp
@@ -113,9 +113,6 @@
                 case 'u':
                     compileOptions |= SH_VARIABLES;
                     break;
-                case 'p':
-                    resources.WEBGL_debug_shader_precision = 1;
-                    break;
                 case 's':
                     if (argv[0][2] == '=')
                     {
@@ -403,12 +400,11 @@
 {
     // clang-format off
     printf(
-        "Usage: translate [-i -o -u -l -p -b=e -b=g -b=h9 -x=i -x=d] file1 file2 ...\n"
+        "Usage: translate [-i -o -u -l -b=e -b=g -b=h9 -x=i -x=d] file1 file2 ...\n"
         "Where: filename : filename ending in .frag or .vert\n"
         "       -i       : print intermediate tree\n"
         "       -o       : print translated code\n"
         "       -u       : print active attribs, uniforms, varyings and program outputs\n"
-        "       -p       : use precision emulation\n"
         "       -s=e2    : use GLES2 spec (this is by default)\n"
         "       -s=e3    : use GLES3 spec\n"
         "       -s=e31   : use GLES31 spec (in development)\n"
diff --git a/scripts/code_generation_hashes/ANGLE_shader_translator.json b/scripts/code_generation_hashes/ANGLE_shader_translator.json
index 3b1d71f..8d7dc8c 100644
--- a/scripts/code_generation_hashes/ANGLE_shader_translator.json
+++ b/scripts/code_generation_hashes/ANGLE_shader_translator.json
@@ -6,11 +6,11 @@
   "src/compiler/translator/glslang.l":
     "921021111f9906b6b4869375b152499b",
   "src/compiler/translator/glslang.y":
-    "e62dc0fb8bff06d53c4340f245851a75",
+    "b444927729273af902b2f3ae84f085cb",
   "src/compiler/translator/glslang_lex_autogen.cpp":
     "18f56a5303e6b7e061d8aadef69faf9b",
   "src/compiler/translator/glslang_tab_autogen.cpp":
-    "b2b895d098558537d9c4206cd5053f53",
+    "2ef3f677fae718997b8ad367a5d357aa",
   "src/compiler/translator/glslang_tab_autogen.h":
     "840c12db9f7824afd05b5306c8816d95",
   "tools/flex-bison/linux/bison.sha1":
diff --git "a/scripts/code_generation_hashes/GL_CTS_\050dEQP\051_build_files.json" "b/scripts/code_generation_hashes/GL_CTS_\050dEQP\051_build_files.json"
index 30ac497..8baa108 100644
--- "a/scripts/code_generation_hashes/GL_CTS_\050dEQP\051_build_files.json"
+++ "b/scripts/code_generation_hashes/GL_CTS_\050dEQP\051_build_files.json"
@@ -130,7 +130,7 @@
   "third_party/VK-GL-CTS/src/external/vulkancts/modules/vulkan/util/CMakeLists.txt":
     "2304ee1e79f5e37035308f14191153c3",
   "third_party/VK-GL-CTS/src/external/vulkancts/modules/vulkan/wsi/CMakeLists.txt":
-    "b1e33f9691258814d9a81dfd57faad13",
+    "defad1f0a461e13497df2f8640bd857f",
   "third_party/VK-GL-CTS/src/external/vulkancts/modules/vulkan/ycbcr/CMakeLists.txt":
     "44dbe345080578d6b4a227a392ccf69e",
   "third_party/VK-GL-CTS/src/external/zlib/CMakeLists.txt":
@@ -142,7 +142,7 @@
   "third_party/VK-GL-CTS/src/framework/delibs/debase/CMakeLists.txt":
     "136b8d2068c0920684582500843b3f88",
   "third_party/VK-GL-CTS/src/framework/delibs/decpp/CMakeLists.txt":
-    "02fe34c7d8bc83be50cef7ac27c0772b",
+    "dd524fb3f9d1eac4f2c429ce9e101a8f",
   "third_party/VK-GL-CTS/src/framework/delibs/deimage/CMakeLists.txt":
     "688f12f6431595fd7a23a58bafa86964",
   "third_party/VK-GL-CTS/src/framework/delibs/depool/CMakeLists.txt":
diff --git a/scripts/code_generation_hashes/GL_EGL_WGL_loader.json b/scripts/code_generation_hashes/GL_EGL_WGL_loader.json
index 15c5653..e6547fa 100644
--- a/scripts/code_generation_hashes/GL_EGL_WGL_loader.json
+++ b/scripts/code_generation_hashes/GL_EGL_WGL_loader.json
@@ -6,13 +6,13 @@
   "scripts/egl_angle_ext.xml":
     "5bcc01462b355d933cf3ada15198fb68",
   "scripts/generate_loader.py":
-    "22eee9c55261d30f7718123c89549c55",
+    "b95f0518351e08bf17240279b2681a6c",
   "scripts/gl.xml":
-    "4fcbd11300c8edcb3ed50826780cd57e",
+    "e99461f683ac14cbb1eac57ad73db0e8",
   "scripts/gl_angle_ext.xml":
     "08f74b35d908b7c02b45fdf45572c434",
   "scripts/registry_xml.py":
-    "3fc0ede1891f7de9338993dea77df9e8",
+    "9dafea2a646826c757d1d32711231e74",
   "scripts/wgl.xml":
     "c36001431919e1c435f1215a85f7e1db",
   "src/libEGL/egl_loader_autogen.cpp":
@@ -22,19 +22,19 @@
   "src/tests/restricted_traces/trace_egl_loader_autogen.cpp":
     "ab1ce9e72e1e248b13302349f2228a89",
   "src/tests/restricted_traces/trace_egl_loader_autogen.h":
-    "c912fbb18f691ab4b2694089cfd668d5",
+    "30b75afa44eb620baaf98c0fb1641634",
   "src/tests/restricted_traces/trace_gles_loader_autogen.cpp":
-    "a8629018bc1abd495c29bfcfdaec3a07",
+    "341aafc53150043b2c5b030a5d5faa67",
   "src/tests/restricted_traces/trace_gles_loader_autogen.h":
-    "3deef846019511bb5ad15c9d4e6c276f",
+    "2d80b7b2f315c9a6368a3346dd1db308",
   "util/egl_loader_autogen.cpp":
     "ad2bc908fbd69d8a1406320a4f5142c8",
   "util/egl_loader_autogen.h":
     "dd280caf858b39f1ef0c89d55bdcc559",
   "util/gles_loader_autogen.cpp":
-    "c146b62c70ebb217ee71bc730913a0aa",
+    "7706daccaf820c975e8a11115a9dc263",
   "util/gles_loader_autogen.h":
-    "69c808de46e7d68f1e9c978484532f86",
+    "60d59894399448d7172303eba72d1a6d",
   "util/windows/wgl_loader_autogen.cpp":
     "0e305ff76ce8e855022f92105362fcdb",
   "util/windows/wgl_loader_autogen.h":
diff --git a/scripts/code_generation_hashes/GL_EGL_entry_points.json b/scripts/code_generation_hashes/GL_EGL_entry_points.json
index b48e96b..91dca60 100644
--- a/scripts/code_generation_hashes/GL_EGL_entry_points.json
+++ b/scripts/code_generation_hashes/GL_EGL_entry_points.json
@@ -10,19 +10,19 @@
   "scripts/entry_point_packed_gl_enums.json":
     "4f7b43863a5e61991bba4010db463679",
   "scripts/generate_entry_points.py":
-    "a71f68ee1731102671aff4ef91a693df",
+    "b215414751c7c1b976482edc1a7ffc77",
   "scripts/gl.xml":
-    "4fcbd11300c8edcb3ed50826780cd57e",
+    "e99461f683ac14cbb1eac57ad73db0e8",
   "scripts/gl_angle_ext.xml":
     "08f74b35d908b7c02b45fdf45572c434",
   "scripts/registry_xml.py":
-    "3fc0ede1891f7de9338993dea77df9e8",
+    "9dafea2a646826c757d1d32711231e74",
   "scripts/wgl.xml":
     "c36001431919e1c435f1215a85f7e1db",
   "src/common/entry_points_enum_autogen.cpp":
-    "cb3cc3248112b367ea0745e3c5704ada",
+    "c67ad3c987ef29955c8a0467a80584e5",
   "src/common/entry_points_enum_autogen.h":
-    "507248f6c21e1d861049c26af1414ef4",
+    "8aadba9f81ae4ce54708b40c978ef2b2",
   "src/libANGLE/Context_gl_1_autogen.h":
     "6be1391ee21b3754d9e9c512255d4c5d",
   "src/libANGLE/Context_gl_2_autogen.h":
@@ -42,7 +42,7 @@
   "src/libANGLE/Context_gles_3_2_autogen.h":
     "48567dca16fd881dfe6d61fee0e3106f",
   "src/libANGLE/Context_gles_ext_autogen.h":
-    "dbf7c9716e46e29b44db01f215f0808a",
+    "eda3bb2e26a59f76eb3e897ea89b4999",
   "src/libANGLE/capture/capture_gles_1_0_autogen.cpp":
     "7ec7ef8f779b809a45d74b97502c419b",
   "src/libANGLE/capture/capture_gles_1_0_autogen.h":
@@ -64,15 +64,15 @@
   "src/libANGLE/capture/capture_gles_3_2_autogen.h":
     "74ed7366af3a46c0661397cfa29ec6fc",
   "src/libANGLE/capture/capture_gles_ext_autogen.cpp":
-    "b027d574c21f369aee0fb0117f453935",
+    "da3c5ba77334da863d267350091b13dd",
   "src/libANGLE/capture/capture_gles_ext_autogen.h":
-    "46440404fc9219fbe709e564f26d57a6",
+    "c668434d3c0f909e48bdcabfebd0b1a7",
   "src/libANGLE/capture/frame_capture_replay_autogen.cpp":
     "e0a3c284b986e2a712589b6f3523d79c",
   "src/libANGLE/capture/frame_capture_utils_autogen.cpp":
-    "dfad80f141010395be7d0ca59ef8ee7a",
+    "57a6782fdb6966a1ff08efa39b1f99df",
   "src/libANGLE/capture/frame_capture_utils_autogen.h":
-    "4405cac61b4f79b893bd40c7fc452397",
+    "b4950440946481455bd7862af34171a4",
   "src/libANGLE/validationCL_autogen.h":
     "0022d0cdb6a9e2ef4a59b71164f62333",
   "src/libANGLE/validationEGL_autogen.h":
@@ -88,7 +88,7 @@
   "src/libANGLE/validationES3_autogen.h":
     "7435b9caddf8787b937c71a54dda96e1",
   "src/libANGLE/validationESEXT_autogen.h":
-    "498a3fcf388dd8edbe38b25aaa1621cc",
+    "bc9f45eeb628722bd20ca826c96814eb",
   "src/libANGLE/validationGL1_autogen.h":
     "439f8ea26dc37ee6608100f4c6f9205c",
   "src/libANGLE/validationGL2_autogen.h":
@@ -162,17 +162,17 @@
   "src/libGLESv2/entry_points_gles_3_2_autogen.h":
     "647f932a299cdb4726b60bbba059f0d2",
   "src/libGLESv2/entry_points_gles_ext_autogen.cpp":
-    "dda68d8198adeb87c19f5fce8691a0b9",
+    "3baf7f6a6470248452230083a53ed016",
   "src/libGLESv2/entry_points_gles_ext_autogen.h":
-    "95374bec6b53708d019455309ea887ec",
+    "132b52b10e3076b6ea183a480709a154",
   "src/libGLESv2/libGLESv2_autogen.cpp":
-    "3805edff53f627f34ce6f55f064e473c",
+    "a63c3a32a98f1826a6a0e8c3c3dfcc8b",
   "src/libGLESv2/libGLESv2_autogen.def":
-    "b49ee14e4c440282d86e5ab4acbaaff5",
+    "fcac3c9129aa5a41546fbab3920ab419",
   "src/libGLESv2/libGLESv2_no_capture_autogen.def":
-    "2303964798f342d2858dc44ba9f02a2e",
+    "10406245739cb06a538e75eb8ffe905c",
   "src/libGLESv2/libGLESv2_with_capture_autogen.def":
-    "b74c9e193df59dc0f06ff45308f8fb51",
+    "a173df42f6845695c19873ffb470f58b",
   "src/libOpenCL/libOpenCL_autogen.cpp":
     "10849978c910dc1af5dd4f0c815d1581"
 }
\ No newline at end of file
diff --git a/scripts/code_generation_hashes/GLenum_value_to_string_map.json b/scripts/code_generation_hashes/GLenum_value_to_string_map.json
index 391746c..af47e97 100644
--- a/scripts/code_generation_hashes/GLenum_value_to_string_map.json
+++ b/scripts/code_generation_hashes/GLenum_value_to_string_map.json
@@ -2,13 +2,13 @@
   "scripts/gen_gl_enum_utils.py":
     "332cfb6f04242d18966445f70f0039b3",
   "scripts/gl.xml":
-    "4fcbd11300c8edcb3ed50826780cd57e",
+    "e99461f683ac14cbb1eac57ad73db0e8",
   "scripts/gl_angle_ext.xml":
     "08f74b35d908b7c02b45fdf45572c434",
   "scripts/registry_xml.py":
-    "3fc0ede1891f7de9338993dea77df9e8",
+    "9dafea2a646826c757d1d32711231e74",
   "src/libANGLE/capture/gl_enum_utils_autogen.cpp":
-    "335140f98374899f9e1303b23b4eddc1",
+    "96cc2400631cc3e7ab7aba104b8f23e9",
   "src/libANGLE/capture/gl_enum_utils_autogen.h":
     "fb0bb7f506f6082ea3b2c3fa384d2739"
 }
\ No newline at end of file
diff --git a/scripts/code_generation_hashes/OpenGL_dispatch_table.json b/scripts/code_generation_hashes/OpenGL_dispatch_table.json
index 378d206..8970131 100644
--- a/scripts/code_generation_hashes/OpenGL_dispatch_table.json
+++ b/scripts/code_generation_hashes/OpenGL_dispatch_table.json
@@ -1,6 +1,6 @@
 {
   "scripts/gl.xml":
-    "4fcbd11300c8edcb3ed50826780cd57e",
+    "e99461f683ac14cbb1eac57ad73db0e8",
   "src/libANGLE/renderer/angle_format.py":
     "74d6c9842128293118ccf128aeae896a",
   "src/libANGLE/renderer/gl/DispatchTableGL_autogen.cpp":
diff --git a/scripts/code_generation_hashes/Static_builtins.json b/scripts/code_generation_hashes/Static_builtins.json
index cf77b0d..d9c351b 100644
--- a/scripts/code_generation_hashes/Static_builtins.json
+++ b/scripts/code_generation_hashes/Static_builtins.json
@@ -1,28 +1,28 @@
 {
   "src/compiler/translator/ImmutableString_ESSL_autogen.cpp":
-    "e4e6db7835d2486d1a3348f801a3cb73",
+    "0c86a8e0710083e2eb3e8a563eb6d2b5",
   "src/compiler/translator/ImmutableString_autogen.cpp":
-    "7822fcba1f643962cdfc0d68378fa60d",
+    "0c6be16a3298353bede1478c9791a42d",
   "src/compiler/translator/Operator_autogen.h":
-    "340c7966d65f4f46858cc228e103cd86",
+    "cdaafd06e84ef6a8e4721678d622d844",
   "src/compiler/translator/SymbolTable_ESSL_autogen.cpp":
-    "51440ab0d03d93ad859d77ad57e51930",
+    "d5aee25a82129a6fc7ae042a85a3cfdf",
   "src/compiler/translator/SymbolTable_autogen.cpp":
-    "7b2cd78f88785f9733f7d8808ad3dc73",
+    "21d720b15db0dc774066d94da8635708",
   "src/compiler/translator/SymbolTable_autogen.h":
-    "d43593050c4d1b31b0be9cdd3a2d0ea5",
+    "291eba34a070f5fddbf2827a1577c598",
   "src/compiler/translator/builtin_function_declarations.txt":
-    "e1067f6d0c321cd49343df4f010e0b2b",
+    "cd5f022686be7e13174b672d6b32fc6d",
   "src/compiler/translator/builtin_variables.json":
-    "0663a24c595b9221f44e3776337dec56",
+    "c8024a2d16554f32a8bc9e3f096772f7",
   "src/compiler/translator/gen_builtin_symbols.py":
-    "3d3a0b581608d27c33c784531010d933",
+    "74ac1eb203c04abfbb81174c5fdb257d",
   "src/compiler/translator/tree_util/BuiltIn_ESSL_autogen.h":
-    "5791a9a7d5aa49b5183679c3eaf0d9e8",
+    "40adb165c1aee8c596aa8a77354da1d0",
   "src/compiler/translator/tree_util/BuiltIn_complete_autogen.h":
-    "a1ec3e9ef8cdd40d65169c0b27d9e947",
+    "1eb560d091163f776b743149c66ff045",
   "src/tests/compiler_tests/ImmutableString_test_ESSL_autogen.cpp":
-    "120aecb694023f6f36328507d1e62803",
+    "2fafd495642755521724ce7d40e4981f",
   "src/tests/compiler_tests/ImmutableString_test_autogen.cpp":
-    "cd59be7af0fabc1abcc4f9329bc2fcd9"
+    "227aac98de8bbe6e2347139800daed8c"
 }
\ No newline at end of file
diff --git a/scripts/code_generation_hashes/Test_spec_JSON.json b/scripts/code_generation_hashes/Test_spec_JSON.json
index a7cb83b..c46b5b2 100644
--- a/scripts/code_generation_hashes/Test_spec_JSON.json
+++ b/scripts/code_generation_hashes/Test_spec_JSON.json
@@ -1,20 +1,20 @@
 {
   "infra/specs/angle.json":
-    "2a0ffef327eb6ddca341cd52876085ba",
+    "afe18ee5bf271576b28369d8ecdb56cb",
   "infra/specs/generate_test_spec_json.py":
     "348921bf70270ec6ee51fbb7e97d6925",
   "infra/specs/mixins.pyl":
-    "e9bc0bea03226e238505276aa395728e",
+    "4c2309d7cebe8a1d43292c5c2012b1db",
   "infra/specs/test_suite_exceptions.pyl":
     "723460da84a90884a9668c07a0893390",
   "infra/specs/test_suites.pyl":
-    "bcd6464decf7be73472fa1837d6c2c96",
+    "f82c7a1b34ee773912d51018de703467",
   "infra/specs/variants.pyl":
     "8cfcaa99fa07ad2a2d5d14f220fd5037",
   "infra/specs/waterfalls.pyl":
-    "5cba5fb3a739bbc3f1710db863fde2a8",
+    "a196371a2661764b889ed75cb1e243f5",
   "testing/buildbot/generate_buildbot_json.py":
-    "2af7f226ac02d6deff3b4416031e94f1",
+    "3071268b1128295391f5b9b88cbb0253",
   "testing/buildbot/mixins.pyl":
-    "2f1df50f76543769b8f8134b2700f159"
+    "2f889f478c07a446d626bdcb47e1b39d"
 }
\ No newline at end of file
diff --git a/scripts/code_generation_hashes/Vulkan_format.json b/scripts/code_generation_hashes/Vulkan_format.json
index 8c4f23a..212f2b5 100644
--- a/scripts/code_generation_hashes/Vulkan_format.json
+++ b/scripts/code_generation_hashes/Vulkan_format.json
@@ -4,9 +4,9 @@
   "src/libANGLE/renderer/angle_format_map.json":
     "6606c1d7df94e6150ab51cfe96c6dcdc",
   "src/libANGLE/renderer/vulkan/gen_vk_format_table.py":
-    "ffeebc0e8ec8db860e472c7cf04cd880",
+    "d8e23d6ca2380a3471d85caffd765830",
   "src/libANGLE/renderer/vulkan/vk_format_map.json":
     "b5e35a7c708d764ae66ac39bf2beb054",
   "src/libANGLE/renderer/vulkan/vk_format_table_autogen.cpp":
-    "a116ed4afe6cbbf3f714f60ae255f584"
+    "d0479b2e58d2eb488247c7a0eab6e8c5"
 }
\ No newline at end of file
diff --git a/scripts/code_generation_hashes/Vulkan_mandatory_format_support_table.json b/scripts/code_generation_hashes/Vulkan_mandatory_format_support_table.json
index d0f1d96..ccdf1c9 100644
--- a/scripts/code_generation_hashes/Vulkan_mandatory_format_support_table.json
+++ b/scripts/code_generation_hashes/Vulkan_mandatory_format_support_table.json
@@ -10,5 +10,5 @@
   "src/libANGLE/renderer/vulkan/vk_mandatory_format_support_table_autogen.cpp":
     "5b3158f99d4e3f316d9bf89cca9174d6",
   "third_party/vulkan-deps/vulkan-headers/src/registry/vk.xml":
-    "1674bc199d09820048a97da16118fd2b"
+    "fa280447299280c2897c29672fd45abf"
 }
\ No newline at end of file
diff --git a/scripts/code_generation_hashes/packed_enum.json b/scripts/code_generation_hashes/packed_enum.json
index de994c4..86d1111 100644
--- a/scripts/code_generation_hashes/packed_enum.json
+++ b/scripts/code_generation_hashes/packed_enum.json
@@ -4,9 +4,9 @@
   "src/common/PackedCLEnums_autogen.h":
     "9c166aa124e697446b35c7eea8b9ff6c",
   "src/common/PackedEGLEnums_autogen.cpp":
-    "1e5cf84847c9880d32d1f638b366ed08",
+    "fa1a367e583643570cd058127ae67e33",
   "src/common/PackedEGLEnums_autogen.h":
-    "0574ea48b14b76dc13e654a11597bf1d",
+    "7d87e160a0c8ea26cb0c835729f7b586",
   "src/common/PackedGLEnums_autogen.cpp":
     "e2cb0a29dcd2bdbda338b82953c752ee",
   "src/common/PackedGLEnums_autogen.h":
@@ -16,7 +16,7 @@
   "src/common/packed_cl_enums.json":
     "65150f52de0ece8f4280bbe4db52bf6f",
   "src/common/packed_egl_enums.json":
-    "76e1b814421e121164d60a0d89cb16c1",
+    "5797db941e95e418d69527eb4e4af900",
   "src/common/packed_gl_enums.json":
     "5e9956ad129fc6f2ed4ce5b8a094f157"
 }
\ No newline at end of file
diff --git a/scripts/code_generation_hashes/proc_table.json b/scripts/code_generation_hashes/proc_table.json
index d3527fc..ed7dfac 100644
--- a/scripts/code_generation_hashes/proc_table.json
+++ b/scripts/code_generation_hashes/proc_table.json
@@ -8,11 +8,11 @@
   "scripts/gen_proc_table.py":
     "8336449da7e36f45dd6d70c44add2ebf",
   "scripts/gl.xml":
-    "4fcbd11300c8edcb3ed50826780cd57e",
+    "e99461f683ac14cbb1eac57ad73db0e8",
   "scripts/gl_angle_ext.xml":
     "08f74b35d908b7c02b45fdf45572c434",
   "scripts/registry_xml.py":
-    "3fc0ede1891f7de9338993dea77df9e8",
+    "9dafea2a646826c757d1d32711231e74",
   "scripts/wgl.xml":
     "c36001431919e1c435f1215a85f7e1db",
   "src/libGL/proc_table_wgl_autogen.cpp":
@@ -20,7 +20,7 @@
   "src/libGLESv2/proc_table_cl_autogen.cpp":
     "ed003b0f041aaaa35b67d3fe07e61f91",
   "src/libGLESv2/proc_table_egl_autogen.cpp":
-    "d6f15d2f739060d47ffbd3fd7d49e1bf",
+    "a0cefa273843854690e93fd7d3987da0",
   "src/libOpenCL/libOpenCL_autogen.map":
     "bc5f5cf48227149ed321258a16eff1d7"
 }
\ No newline at end of file
diff --git a/scripts/code_generation_hashes/restricted_traces.json b/scripts/code_generation_hashes/restricted_traces.json
index 734e2da..21c95ff 100644
--- a/scripts/code_generation_hashes/restricted_traces.json
+++ b/scripts/code_generation_hashes/restricted_traces.json
@@ -1,14 +1,14 @@
 {
   "src/tests/restricted_traces/.gitignore":
-    "b83bbab71fcc836556ce3aa7c992ca44",
+    "0df08b32b1950844c103ca9b5bf5493b",
   "src/tests/restricted_traces/gen_restricted_traces.py":
-    "67fa0418060411bae94c64b05b470952",
+    "47c2ec4e240ad36c7610d90a9a3f0b7b",
   "src/tests/restricted_traces/restricted_traces.json":
-    "0609bc8adca1e55fa78b71a1d07d44f9",
+    "6dfaf6c6950d6d985f9a1ad270b487cf",
   "src/tests/restricted_traces/restricted_traces_autogen.cpp":
-    "bdf25c3975dddd48624b258ae2894917",
+    "418bb3340f1060c193dfcf1a0c117a7f",
   "src/tests/restricted_traces/restricted_traces_autogen.gni":
-    "ad18230e0c38f650b2df15f1c1f0c53d",
+    "27cb9560a4eacfd79ae82c9ab4574afd",
   "src/tests/restricted_traces/restricted_traces_autogen.h":
-    "4b5b94d3dd946c72db59e2717ded7a41"
+    "77a97c4bb042e28be314bf45e915e013"
 }
\ No newline at end of file
diff --git a/scripts/export_targets.py b/scripts/export_targets.py
index 96cfd65..dacf45d 100755
--- a/scripts/export_targets.py
+++ b/scripts/export_targets.py
@@ -181,6 +181,7 @@
 # included, but not part of the source list.
 IGNORED_INCLUDES = {
     b'absl/container/flat_hash_map.h',
+    b'absl/container/flat_hash_set.h',
     b'compiler/translator/TranslatorESSL.h',
     b'compiler/translator/TranslatorGLSL.h',
     b'compiler/translator/TranslatorHLSL.h',
diff --git a/scripts/generate_android_bp.py b/scripts/generate_android_bp.py
index 8a01b32..ee046b4 100644
--- a/scripts/generate_android_bp.py
+++ b/scripts/generate_android_bp.py
@@ -556,8 +556,29 @@
             'legacy_unencumbered',
         ],
         'license_text': [
-            'LICENSE', 'third_party/abseil-cpp/LICENSE', 'third_party/vulkan-deps/LICENSE',
-            'third_party/vulkan_memory_allocator/LICENSE.txt', 'third_party/zlib/LICENSE'
+            'LICENSE',
+            'src/common/third_party/smhasher/LICENSE',
+            'src/common/third_party/xxhash/LICENSE',
+            'src/libANGLE/renderer/vulkan/shaders/src/third_party/ffx_spd/LICENSE',
+            'src/tests/test_utils/third_party/LICENSE',
+            'src/third_party/libXNVCtrl/LICENSE',
+            'src/third_party/volk/LICENSE.md',
+            'third_party/abseil-cpp/LICENSE',
+            'third_party/vulkan-deps/glslang/LICENSE',
+            'third_party/vulkan-deps/glslang/src/LICENSE.txt',
+            'third_party/vulkan-deps/LICENSE',
+            'third_party/vulkan-deps/spirv-headers/LICENSE',
+            'third_party/vulkan-deps/spirv-headers/src/LICENSE',
+            'third_party/vulkan-deps/spirv-tools/LICENSE',
+            'third_party/vulkan-deps/spirv-tools/src/LICENSE',
+            'third_party/vulkan-deps/spirv-tools/src/utils/vscode/src/lsp/LICENSE',
+            'third_party/vulkan-deps/vulkan-headers/LICENSE.txt',
+            'third_party/vulkan-deps/vulkan-headers/src/LICENSE.txt',
+            'third_party/vulkan_memory_allocator/LICENSE.txt',
+            'third_party/zlib/LICENSE',
+            'tools/flex-bison/third_party/m4sugar/LICENSE',
+            'tools/flex-bison/third_party/skeletons/LICENSE',
+            'util/windows/third_party/StackWalker/LICENSE',
         ],
     }))
 
diff --git a/scripts/generate_entry_points.py b/scripts/generate_entry_points.py
index d1a8f79..e69c59f 100755
--- a/scripts/generate_entry_points.py
+++ b/scripts/generate_entry_points.py
@@ -1082,6 +1082,11 @@
 
 ResourceIDType GetResourceIDTypeFromParamType(ParamType paramType);
 const char *GetResourceIDTypeName(ResourceIDType resourceIDType);
+
+template <typename ResourceType>
+struct GetResourceIDTypeFromType;
+
+{type_to_resource_id_type_structs}
 }}  // namespace angle
 
 #endif  // LIBANGLE_FRAME_CAPTURE_UTILS_AUTOGEN_H_
@@ -1564,17 +1569,25 @@
 
 
 def get_capture_param_type_name(param_type):
-
     pointer_count = param_type.count("*")
     is_const = "const" in param_type.split()
 
-    param_type = param_type.replace("*", "").strip()
-    param_type = " ".join([param for param in param_type.split() if param != "const"])
+    # EGL types are special
+    for egl_type, angle_type in EGL_PACKED_TYPES.items():
+        if angle_type == param_type:
+            return egl_type
 
-    if is_const:
-        param_type += "Const"
-    for x in range(pointer_count):
-        param_type += "Pointer"
+    param_type = param_type.replace("*", "")
+    param_type = param_type.replace("&", "")
+    param_type = param_type.replace("const", "")
+    param_type = param_type.replace("struct", "")
+    param_type = param_type.strip()
+
+    if "EGL" not in param_type:
+        if is_const and param_type != 'AttributeMap':
+            param_type += "Const"
+        for x in range(pointer_count):
+            param_type += "Pointer"
 
     return param_type
 
@@ -1597,6 +1610,12 @@
 
         param_name = just_the_name_packed(param, packed_gl_enums)
         param_type = just_the_type_packed(param, packed_gl_enums).strip()
+
+        # TODO(http://anglebug.com/4035: Add support for egl::AttributeMap.
+        if 'AttributeMap' in param_type:
+            # egl::AttributeMap is too complex for ParamCapture to handle it.
+            continue
+
         pointer_count = param_type.count("*")
         capture_param_type = get_capture_param_type_name(param_type)
 
@@ -2066,6 +2085,30 @@
     return param_type[0:2] != "GL" and "void" not in param_type
 
 
+def add_namespace(param_type):
+    param_type = param_type.strip()
+
+    if param_type == 'AHardwareBufferConstPointer' or param_type == 'charConstPointer':
+        return param_type
+
+    if param_type[0:2] == "GL" or param_type[0:3] == "EGL" or "void" in param_type:
+        return param_type
+
+    # ANGLE namespaced EGL types
+    egl_namespace = [
+        'CompositorTiming',
+        'DevicePointer',
+        'ObjectType',
+        'StreamPointer',
+        'Timestamp',
+    ]
+
+    if param_type in egl_namespace:
+        return "egl::" + param_type
+    else:
+        return "gl::" + param_type
+
+
 def get_gl_pointer_type(param_type):
 
     if "ConstPointerPointer" in param_type:
@@ -2084,10 +2127,7 @@
 
 
 def get_param_type_type(param_type):
-
-    if is_packed_enum_param_type(param_type):
-        param_type = "gl::" + param_type
-
+    param_type = add_namespace(param_type)
     return get_gl_pointer_type(param_type)
 
 
@@ -2142,7 +2182,10 @@
 
 
 def get_resource_id_types(all_param_types):
-    return [t[:-2] for t in filter(lambda t: t.endswith("ID"), all_param_types)]
+    return [
+        t[:-2]
+        for t in filter(lambda t: t.endswith("ID") and not t.endswith("ANDROID"), all_param_types)
+    ]
 
 
 def format_resource_id_types(all_param_types):
@@ -2152,6 +2195,19 @@
     return resource_id_types
 
 
+def format_resource_id_convert_structs(all_param_types):
+    templ = """\
+template <>
+struct GetResourceIDTypeFromType<gl::%sID>
+{
+    static constexpr ResourceIDType IDType = ResourceIDType::%s;
+};
+"""
+    resource_id_types = get_resource_id_types(all_param_types)
+    convert_struct_strings = [templ % (id, id) for id in resource_id_types]
+    return "\n".join(convert_struct_strings)
+
+
 def write_capture_helper_header(all_param_types):
 
     param_types = "\n    ".join(["T%s," % t for t in all_param_types])
@@ -2164,6 +2220,7 @@
         [format_set_param_val_specialization(t) for t in all_param_types])
     init_param_value_cases = "\n".join([format_init_param_value_case(t) for t in all_param_types])
     resource_id_types = format_resource_id_types(all_param_types)
+    convert_structs = format_resource_id_convert_structs(all_param_types)
 
     content = TEMPLATE_FRAME_CAPTURE_UTILS_HEADER.format(
         script_name=os.path.basename(sys.argv[0]),
@@ -2175,7 +2232,8 @@
         access_param_value_cases=access_param_value_cases,
         set_param_val_specializations=set_param_val_specializations,
         init_param_value_cases=init_param_value_cases,
-        resource_id_types=resource_id_types)
+        resource_id_types=resource_id_types,
+        type_to_resource_id_type_structs=convert_structs)
 
     path = path_to(os.path.join("libANGLE", "capture"), "frame_capture_utils_autogen.h")
 
@@ -2204,8 +2262,8 @@
 
 def format_param_type_resource_id_cases(all_param_types):
     id_types = filter(
-        lambda t: t.endswith("ID") or t.endswith("IDConstPointer") or t.endswith("IDPointer"),
-        all_param_types)
+        lambda t: (t.endswith("ID") and not t.endswith("ANDROID")) or t.endswith("IDConstPointer")
+        or t.endswith("IDPointer"), all_param_types)
     return "\n".join([format_param_type_to_resource_id_type_case(t) for t in id_types])
 
 
@@ -3044,8 +3102,11 @@
                            libegl_windows_def_exports)
 
     all_gles_param_types = sorted(GLEntryPoints.all_param_types)
-    write_capture_helper_header(all_gles_param_types)
-    write_capture_helper_source(all_gles_param_types)
+    all_egl_param_types = sorted(EGLEntryPoints.all_param_types)
+    # Get a sorted list of param types without duplicates
+    all_param_types = sorted(list(set(all_gles_param_types + all_egl_param_types)))
+    write_capture_helper_header(all_param_types)
+    write_capture_helper_source(all_param_types)
     write_capture_replay_source(apis.GLES, xml.all_commands, all_commands_no_suffix,
                                 GLEntryPoints.get_packed_enums(), [])
 
diff --git a/scripts/generate_loader.py b/scripts/generate_loader.py
index 42bdd33..5944782 100755
--- a/scripts/generate_loader.py
+++ b/scripts/generate_loader.py
@@ -319,13 +319,14 @@
 #endif  // defined(GL_GLES_PROTOTYPES)
 
 #include "angle_gl.h"
-#include "restricted_traces_autogen.h"
+#include "restricted_traces_export.h"
 """
 
-trace_egl_preamble = """#include "restricted_traces_autogen.h"
-
+trace_egl_preamble = """
 #include <EGL/egl.h>
 #include <EGL/eglext.h>
+
+#include "restricted_traces_export.h"
 """
 
 util_wgl_preamble = """
diff --git a/scripts/gl.xml b/scripts/gl.xml
index aa9e4ed..1e5359c 100644
--- a/scripts/gl.xml
+++ b/scripts/gl.xml
@@ -1877,6 +1877,38 @@
             <enum name="GL_COMPRESSED_SRGB_PVRTC_4BPPV1_EXT"/>
             <enum name="GL_COMPRESSED_RGBA_PVRTC_4BPPV1_IMG"/>
             <enum name="GL_COMPRESSED_SRGB_ALPHA_PVRTC_4BPPV1_EXT"/>
+            <enum name="GL_COMPRESSED_RGBA_PVRTC_2BPPV2_IMG"/>
+            <enum name="GL_COMPRESSED_RGBA_PVRTC_4BPPV2_IMG"/>
+            <enum name="GL_COMPRESSED_SRGB_ALPHA_PVRTC_2BPPV2_IMG"/>
+            <enum name="GL_COMPRESSED_SRGB_ALPHA_PVRTC_4BPPV2_IMG"/>
+            <enum name="GL_COMPRESSED_RGBA_ASTC_4x4_KHR"/>
+            <enum name="GL_COMPRESSED_RGBA_ASTC_5x4_KHR"/>
+            <enum name="GL_COMPRESSED_RGBA_ASTC_5x5_KHR"/>
+            <enum name="GL_COMPRESSED_RGBA_ASTC_6x5_KHR"/>
+            <enum name="GL_COMPRESSED_RGBA_ASTC_6x6_KHR"/>
+            <enum name="GL_COMPRESSED_RGBA_ASTC_8x5_KHR"/>
+            <enum name="GL_COMPRESSED_RGBA_ASTC_8x6_KHR"/>
+            <enum name="GL_COMPRESSED_RGBA_ASTC_8x8_KHR"/>
+            <enum name="GL_COMPRESSED_RGBA_ASTC_10x5_KHR"/>
+            <enum name="GL_COMPRESSED_RGBA_ASTC_10x6_KHR"/>
+            <enum name="GL_COMPRESSED_RGBA_ASTC_10x8_KHR"/>
+            <enum name="GL_COMPRESSED_RGBA_ASTC_10x10_KHR"/>
+            <enum name="GL_COMPRESSED_RGBA_ASTC_12x10_KHR"/>
+            <enum name="GL_COMPRESSED_RGBA_ASTC_12x12_KHR"/>
+            <enum name="GL_COMPRESSED_SRGB8_ALPHA8_ASTC_4x4_KHR"/>
+            <enum name="GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x4_KHR"/>
+            <enum name="GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x5_KHR"/>
+            <enum name="GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x5_KHR"/>
+            <enum name="GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x6_KHR"/>
+            <enum name="GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x5_KHR"/>
+            <enum name="GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x6_KHR"/>
+            <enum name="GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x8_KHR"/>
+            <enum name="GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x5_KHR"/>
+            <enum name="GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x6_KHR"/>
+            <enum name="GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x8_KHR"/>
+            <enum name="GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x10_KHR"/>
+            <enum name="GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x10_KHR"/>
+            <enum name="GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x12_KHR"/>
             <enum name="GL_COMPRESSED_RGBA_ASTC_3x3x3_OES"/>
             <enum name="GL_COMPRESSED_SRGB8_ALPHA8_ASTC_3x3x3_OES"/>
             <enum name="GL_COMPRESSED_RGBA_ASTC_4x3x3_OES"/>
diff --git a/scripts/process_angle_perf_results.py b/scripts/process_angle_perf_results.py
new file mode 100755
index 0000000..b49c8bb
--- /dev/null
+++ b/scripts/process_angle_perf_results.py
@@ -0,0 +1,728 @@
+#!/usr/bin/env vpython
+#
+# Copyright 2021 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.
+#
+# process_angle_perf_results.py:
+#   Perf result merging and upload. Adapted from the Chromium script:
+#   https://chromium.googlesource.com/chromium/src/+/main/tools/perf/process_perf_results.py
+
+from __future__ import print_function
+
+import argparse
+import collections
+import json
+import logging
+import multiprocessing
+import os
+import shutil
+import sys
+import tempfile
+import time
+import uuid
+
+logging.basicConfig(
+    level=logging.INFO,
+    format='(%(levelname)s) %(asctime)s pid=%(process)d'
+    '  %(module)s.%(funcName)s:%(lineno)d  %(message)s')
+
+d = os.path.dirname
+ANGLE_DIR = d(d(os.path.realpath(__file__)))
+sys.path.append(os.path.join(ANGLE_DIR, 'tools', 'perf'))
+import cross_device_test_config
+
+from core import path_util
+
+path_util.AddTelemetryToPath()
+from core import upload_results_to_perf_dashboard
+from core import bot_platforms
+from core import results_merger
+
+path_util.AddAndroidPylibToPath()
+try:
+    from pylib.utils import logdog_helper
+except ImportError:
+    pass
+
+path_util.AddTracingToPath()
+from tracing.value import histogram
+from tracing.value import histogram_set
+from tracing.value.diagnostics import generic_set
+from tracing.value.diagnostics import reserved_infos
+
+RESULTS_URL = 'https://chromeperf.appspot.com'
+JSON_CONTENT_TYPE = 'application/json'
+MACHINE_GROUP = 'ANGLE'
+BUILD_URL = 'https://ci.chromium.org/ui/p/angle/builders/ci/%s/%d'
+
+
+def _upload_perf_results(json_to_upload, name, configuration_name, build_properties,
+                         output_json_file):
+    """Upload the contents of result JSON(s) to the perf dashboard."""
+    args = [
+        '--buildername',
+        build_properties['buildername'],
+        '--buildnumber',
+        build_properties['buildnumber'],
+        '--name',
+        name,
+        '--configuration-name',
+        configuration_name,
+        '--results-file',
+        json_to_upload,
+        '--results-url',
+        RESULTS_URL,
+        '--output-json-file',
+        output_json_file,
+        '--perf-dashboard-machine-group',
+        MACHINE_GROUP,
+        '--got-angle-revision',
+        build_properties['got_angle_revision'],
+        '--send-as-histograms',
+        '--project',
+        'angle',
+    ]
+
+    if build_properties.get('git_revision'):
+        args.append('--git-revision')
+        args.append(build_properties['git_revision'])
+
+    #TODO(crbug.com/1072729): log this in top level
+    logging.info('upload_results_to_perf_dashboard: %s.' % args)
+
+    return upload_results_to_perf_dashboard.main(args)
+
+
+def _merge_json_output(output_json, jsons_to_merge, extra_links, test_cross_device=False):
+    """Merges the contents of one or more results JSONs.
+
+  Args:
+    output_json: A path to a JSON file to which the merged results should be
+      written.
+    jsons_to_merge: A list of JSON files that should be merged.
+    extra_links: a (key, value) map in which keys are the human-readable strings
+      which describe the data, and value is logdog url that contain the data.
+  """
+    begin_time = time.time()
+    merged_results = results_merger.merge_test_results(jsons_to_merge, test_cross_device)
+
+    # Only append the perf results links if present
+    if extra_links:
+        merged_results['links'] = extra_links
+
+    with open(output_json, 'w') as f:
+        json.dump(merged_results, f)
+
+    end_time = time.time()
+    print_duration('Merging json test results', begin_time, end_time)
+    return 0
+
+
+def _handle_perf_json_test_results(benchmark_directory_map, test_results_list):
+    """Checks the test_results.json under each folder:
+
+  1. mark the benchmark 'enabled' if tests results are found
+  2. add the json content to a list for non-ref.
+  """
+    begin_time = time.time()
+    benchmark_enabled_map = {}
+    for benchmark_name, directories in benchmark_directory_map.items():
+        for directory in directories:
+            # Obtain the test name we are running
+            is_ref = '.reference' in benchmark_name
+            enabled = True
+            try:
+                with open(os.path.join(directory, 'test_results.json')) as json_data:
+                    json_results = json.load(json_data)
+                    if not json_results:
+                        # Output is null meaning the test didn't produce any results.
+                        # Want to output an error and continue loading the rest of the
+                        # test results.
+                        logging.warning('No results produced for %s, skipping upload' % directory)
+                        continue
+                    if json_results.get('version') == 3:
+                        # Non-telemetry tests don't have written json results but
+                        # if they are executing then they are enabled and will generate
+                        # chartjson results.
+                        if not bool(json_results.get('tests')):
+                            enabled = False
+                    if not is_ref:
+                        # We don't need to upload reference build data to the
+                        # flakiness dashboard since we don't monitor the ref build
+                        test_results_list.append(json_results)
+            except IOError as e:
+                # TODO(crbug.com/936602): Figure out how to surface these errors. Should
+                # we have a non-zero exit code if we error out?
+                logging.error('Failed to obtain test results for %s: %s', benchmark_name, e)
+                continue
+            if not enabled:
+                # We don't upload disabled benchmarks or tests that are run
+                # as a smoke test
+                logging.info('Benchmark %s ran no tests on at least one shard' % benchmark_name)
+                continue
+            benchmark_enabled_map[benchmark_name] = True
+
+    end_time = time.time()
+    print_duration('Analyzing perf json test results', begin_time, end_time)
+    return benchmark_enabled_map
+
+
+def _generate_unique_logdog_filename(name_prefix):
+    return name_prefix + '_' + str(uuid.uuid4())
+
+
+def _handle_perf_logs(benchmark_directory_map, extra_links):
+    """ Upload benchmark logs to logdog and add a page entry for them. """
+    begin_time = time.time()
+    benchmark_logs_links = collections.defaultdict(list)
+
+    for benchmark_name, directories in benchmark_directory_map.items():
+        for directory in directories:
+            benchmark_log_file = os.path.join(directory, 'benchmark_log.txt')
+            if os.path.exists(benchmark_log_file):
+                with open(benchmark_log_file) as f:
+                    uploaded_link = logdog_helper.text(
+                        name=_generate_unique_logdog_filename(benchmark_name), data=f.read())
+                    benchmark_logs_links[benchmark_name].append(uploaded_link)
+
+    logdog_file_name = _generate_unique_logdog_filename('Benchmarks_Logs')
+    logdog_stream = logdog_helper.text(
+        logdog_file_name,
+        json.dumps(benchmark_logs_links, sort_keys=True, indent=4, separators=(',', ': ')),
+        content_type=JSON_CONTENT_TYPE)
+    extra_links['Benchmarks logs'] = logdog_stream
+    end_time = time.time()
+    print_duration('Generating perf log streams', begin_time, end_time)
+
+
+def _handle_benchmarks_shard_map(benchmarks_shard_map_file, extra_links):
+    begin_time = time.time()
+    with open(benchmarks_shard_map_file) as f:
+        benchmarks_shard_data = f.read()
+        logdog_file_name = _generate_unique_logdog_filename('Benchmarks_Shard_Map')
+        logdog_stream = logdog_helper.text(
+            logdog_file_name, benchmarks_shard_data, content_type=JSON_CONTENT_TYPE)
+        extra_links['Benchmarks shard map'] = logdog_stream
+    end_time = time.time()
+    print_duration('Generating benchmark shard map stream', begin_time, end_time)
+
+
+def _get_benchmark_name(directory):
+    return os.path.basename(directory).replace(" benchmark", "")
+
+
+def _scan_output_dir(task_output_dir):
+    benchmark_directory_map = {}
+    benchmarks_shard_map_file = None
+
+    directory_list = [
+        f for f in os.listdir(task_output_dir)
+        if not os.path.isfile(os.path.join(task_output_dir, f))
+    ]
+    benchmark_directory_list = []
+    for directory in directory_list:
+        for f in os.listdir(os.path.join(task_output_dir, directory)):
+            path = os.path.join(task_output_dir, directory, f)
+            if os.path.isdir(path):
+                benchmark_directory_list.append(path)
+            elif path.endswith('benchmarks_shard_map.json'):
+                benchmarks_shard_map_file = path
+    # Now create a map of benchmark name to the list of directories
+    # the lists were written to.
+    for directory in benchmark_directory_list:
+        benchmark_name = _get_benchmark_name(directory)
+        if benchmark_name in benchmark_directory_map.keys():
+            benchmark_directory_map[benchmark_name].append(directory)
+        else:
+            benchmark_directory_map[benchmark_name] = [directory]
+
+    return benchmark_directory_map, benchmarks_shard_map_file
+
+
+def process_perf_results(output_json,
+                         configuration_name,
+                         build_properties,
+                         task_output_dir,
+                         smoke_test_mode,
+                         output_results_dir,
+                         lightweight=False,
+                         skip_perf=False):
+    """Process perf results.
+
+  Consists of merging the json-test-format output, uploading the perf test
+  output (histogram), and store the benchmark logs in logdog.
+
+  Each directory in the task_output_dir represents one benchmark
+  that was run. Within this directory, there is a subdirectory with the name
+  of the benchmark that was run. In that subdirectory, there is a
+  perftest-output.json file containing the performance results in histogram
+  format and an output.json file containing the json test results for the
+  benchmark.
+
+  Returns:
+    (return_code, upload_results_map):
+      return_code is 0 if the whole operation is successful, non zero otherwise.
+      benchmark_upload_result_map: the dictionary that describe which benchmarks
+        were successfully uploaded.
+  """
+    handle_perf = not lightweight or not skip_perf
+    handle_non_perf = not lightweight or skip_perf
+    logging.info('lightweight mode: %r; handle_perf: %r; handle_non_perf: %r' %
+                 (lightweight, handle_perf, handle_non_perf))
+
+    begin_time = time.time()
+    return_code = 0
+    benchmark_upload_result_map = {}
+
+    benchmark_directory_map, benchmarks_shard_map_file = _scan_output_dir(task_output_dir)
+
+    test_results_list = []
+    extra_links = {}
+
+    if handle_non_perf:
+        # First, upload benchmarks shard map to logdog and add a page
+        # entry for it in extra_links.
+        if benchmarks_shard_map_file:
+            _handle_benchmarks_shard_map(benchmarks_shard_map_file, extra_links)
+
+        # Second, upload all the benchmark logs to logdog and add a page entry for
+        # those links in extra_links.
+        _handle_perf_logs(benchmark_directory_map, extra_links)
+
+    # Then try to obtain the list of json test results to merge
+    # and determine the status of each benchmark.
+    benchmark_enabled_map = _handle_perf_json_test_results(benchmark_directory_map,
+                                                           test_results_list)
+
+    build_properties_map = json.loads(build_properties)
+    if not configuration_name:
+        # we are deprecating perf-id crbug.com/817823
+        configuration_name = build_properties_map['buildername']
+
+    _update_perf_results_for_calibration(benchmarks_shard_map_file, benchmark_enabled_map,
+                                         benchmark_directory_map, configuration_name)
+    if not smoke_test_mode and handle_perf:
+        try:
+            return_code, benchmark_upload_result_map = _handle_perf_results(
+                benchmark_enabled_map, benchmark_directory_map, configuration_name,
+                build_properties_map, extra_links, output_results_dir)
+        except Exception:
+            logging.exception('Error handling perf results jsons')
+            return_code = 1
+
+    if handle_non_perf:
+        # Finally, merge all test results json, add the extra links and write out to
+        # output location
+        try:
+            _merge_json_output(output_json, test_results_list, extra_links,
+                               configuration_name in cross_device_test_config.TARGET_DEVICES)
+        except Exception:
+            logging.exception('Error handling test results jsons.')
+
+    end_time = time.time()
+    print_duration('Total process_perf_results', begin_time, end_time)
+    return return_code, benchmark_upload_result_map
+
+
+def _merge_histogram_results(histogram_lists):
+    merged_results = []
+    for histogram_list in histogram_lists:
+        merged_results += histogram_list
+
+    return merged_results
+
+
+def _load_histogram_set_from_dict(data):
+    histograms = histogram_set.HistogramSet()
+    histograms.ImportDicts(data)
+    return histograms
+
+
+def _add_build_info(results, benchmark_name, build_properties):
+    histograms = _load_histogram_set_from_dict(results)
+
+    common_diagnostics = {
+        reserved_infos.MASTERS:
+            build_properties['builder_group'],
+        reserved_infos.BOTS:
+            build_properties['buildername'],
+        reserved_infos.POINT_ID:
+            build_properties['angle_commit_pos'],
+        reserved_infos.BENCHMARKS:
+            benchmark_name,
+        reserved_infos.ANGLE_REVISIONS:
+            build_properties['got_angle_revision'],
+        reserved_infos.BUILD_URLS:
+            BUILD_URL % (build_properties['buildername'], build_properties['buildnumber']),
+    }
+
+    for k, v in common_diagnostics.items():
+        histograms.AddSharedDiagnosticToAllHistograms(k.name, generic_set.GenericSet([v]))
+
+    return histograms.AsDicts()
+
+
+def _merge_perf_results(benchmark_name, results_filename, directories, build_properties):
+    begin_time = time.time()
+    collected_results = []
+    for directory in directories:
+        filename = os.path.join(directory, 'perf_results.json')
+        try:
+            with open(filename) as pf:
+                collected_results.append(json.load(pf))
+        except IOError as e:
+            # TODO(crbug.com/936602): Figure out how to surface these errors. Should
+            # we have a non-zero exit code if we error out?
+            logging.error('Failed to obtain perf results from %s: %s', directory, e)
+    if not collected_results:
+        logging.error('Failed to obtain any perf results from %s.', benchmark_name)
+        return
+
+    # Assuming that multiple shards will be histogram set
+    # Non-telemetry benchmarks only ever run on one shard
+    merged_results = []
+    assert (isinstance(collected_results[0], list))
+    merged_results = _merge_histogram_results(collected_results)
+
+    # Write additional histogram build info.
+    merged_results = _add_build_info(merged_results, benchmark_name, build_properties)
+
+    with open(results_filename, 'w') as rf:
+        json.dump(merged_results, rf)
+
+    end_time = time.time()
+    print_duration(('%s results merging' % (benchmark_name)), begin_time, end_time)
+
+
+def _upload_individual(benchmark_name, directories, configuration_name, build_properties,
+                       output_json_file):
+    tmpfile_dir = tempfile.mkdtemp()
+    try:
+        upload_begin_time = time.time()
+        # There are potentially multiple directores with results, re-write and
+        # merge them if necessary
+        results_filename = None
+        if len(directories) > 1:
+            merge_perf_dir = os.path.join(os.path.abspath(tmpfile_dir), benchmark_name)
+            if not os.path.exists(merge_perf_dir):
+                os.makedirs(merge_perf_dir)
+            results_filename = os.path.join(merge_perf_dir, 'merged_perf_results.json')
+            _merge_perf_results(benchmark_name, results_filename, directories, build_properties)
+        else:
+            # It was only written to one shard, use that shards data
+            results_filename = os.path.join(directories[0], 'perf_results.json')
+
+        results_size_in_mib = os.path.getsize(results_filename) / (2**20)
+        logging.info('Uploading perf results from %s benchmark (size %s Mib)' %
+                     (benchmark_name, results_size_in_mib))
+        with open(output_json_file, 'w') as oj:
+            upload_return_code = _upload_perf_results(results_filename, benchmark_name,
+                                                      configuration_name, build_properties, oj)
+            upload_end_time = time.time()
+            print_duration(('%s upload time' % (benchmark_name)), upload_begin_time,
+                           upload_end_time)
+            return (benchmark_name, upload_return_code == 0)
+    finally:
+        shutil.rmtree(tmpfile_dir)
+
+
+def _upload_individual_benchmark(params):
+    try:
+        return _upload_individual(*params)
+    except Exception:
+        benchmark_name = params[0]
+        upload_succeed = False
+        logging.exception('Error uploading perf result of %s' % benchmark_name)
+        return benchmark_name, upload_succeed
+
+
+def _GetCpuCount(log=True):
+    try:
+        cpu_count = multiprocessing.cpu_count()
+        if sys.platform == 'win32':
+            # TODO(crbug.com/1190269) - we can't use more than 56
+            # cores on Windows or Python3 may hang.
+            cpu_count = min(cpu_count, 56)
+        return cpu_count
+    except NotImplementedError:
+        if log:
+            logging.warn('Failed to get a CPU count for this bot. See crbug.com/947035.')
+        # TODO(crbug.com/948281): This is currently set to 4 since the mac masters
+        # only have 4 cores. Once we move to all-linux, this can be increased or
+        # we can even delete this whole function and use multiprocessing.cpu_count()
+        # directly.
+        return 4
+
+
+def _load_shard_id_from_test_results(directory):
+    shard_id = None
+    test_json_path = os.path.join(directory, 'test_results.json')
+    try:
+        with open(test_json_path) as f:
+            test_json = json.load(f)
+            all_results = test_json['tests']
+            for _, benchmark_results in all_results.items():
+                for _, measurement_result in benchmark_results.items():
+                    shard_id = measurement_result['shard']
+                    break
+    except IOError as e:
+        logging.error('Failed to open test_results.json from %s: %s', test_json_path, e)
+    except KeyError as e:
+        logging.error('Failed to locate results in test_results.json: %s', e)
+    return shard_id
+
+
+def _find_device_id_by_shard_id(benchmarks_shard_map_file, shard_id):
+    try:
+        with open(benchmarks_shard_map_file) as f:
+            shard_map_json = json.load(f)
+            device_id = shard_map_json['extra_infos']['bot #%s' % shard_id]
+    except KeyError as e:
+        logging.error('Failed to locate device name in shard map: %s', e)
+    return device_id
+
+
+def _update_perf_json_with_summary_on_device_id(directory, device_id):
+    perf_json_path = os.path.join(directory, 'perf_results.json')
+    try:
+        with open(perf_json_path, 'r') as f:
+            perf_json = json.load(f)
+    except IOError as e:
+        logging.error('Failed to open perf_results.json from %s: %s', perf_json_path, e)
+    summary_key_guid = str(uuid.uuid4())
+    summary_key_generic_set = {
+        'values': ['device_id'],
+        'guid': summary_key_guid,
+        'type': 'GenericSet'
+    }
+    perf_json.insert(0, summary_key_generic_set)
+    logging.info('Inserted summary key generic set for perf result in %s: %s', directory,
+                 summary_key_generic_set)
+    stories_guids = set()
+    for entry in perf_json:
+        if 'diagnostics' in entry:
+            entry['diagnostics']['summaryKeys'] = summary_key_guid
+            stories_guids.add(entry['diagnostics']['stories'])
+    for entry in perf_json:
+        if 'guid' in entry and entry['guid'] in stories_guids:
+            entry['values'].append(device_id)
+    try:
+        with open(perf_json_path, 'w') as f:
+            json.dump(perf_json, f)
+    except IOError as e:
+        logging.error('Failed to writing perf_results.json to %s: %s', perf_json_path, e)
+    logging.info('Finished adding device id %s in perf result.', device_id)
+
+
+def _should_add_device_id_in_perf_result(builder_name):
+    # We should always add device id in calibration builders.
+    # For testing purpose, adding fyi as well for faster turnaround, because
+    # calibration builders run every 24 hours.
+    return any([builder_name == p.name for p in bot_platforms.CALIBRATION_PLATFORMS
+               ]) or (builder_name == 'android-pixel2-perf-fyi')
+
+
+def _update_perf_results_for_calibration(benchmarks_shard_map_file, benchmark_enabled_map,
+                                         benchmark_directory_map, configuration_name):
+    if not _should_add_device_id_in_perf_result(configuration_name):
+        return
+    logging.info('Updating perf results for %s.', configuration_name)
+    for benchmark_name, directories in benchmark_directory_map.items():
+        if not benchmark_enabled_map.get(benchmark_name, False):
+            continue
+        for directory in directories:
+            shard_id = _load_shard_id_from_test_results(directory)
+            device_id = _find_device_id_by_shard_id(benchmarks_shard_map_file, shard_id)
+            _update_perf_json_with_summary_on_device_id(directory, device_id)
+
+
+def _handle_perf_results(benchmark_enabled_map, benchmark_directory_map, configuration_name,
+                         build_properties, extra_links, output_results_dir):
+    """
+    Upload perf results to the perf dashboard.
+
+    This method also upload the perf results to logdog and augment it to
+    |extra_links|.
+
+    Returns:
+      (return_code, benchmark_upload_result_map)
+      return_code is 0 if this upload to perf dashboard successfully, 1
+        otherwise.
+       benchmark_upload_result_map is a dictionary describes which benchmark
+        was successfully uploaded.
+  """
+    begin_time = time.time()
+    # Upload all eligible benchmarks to the perf dashboard
+    results_dict = {}
+
+    invocations = []
+    for benchmark_name, directories in benchmark_directory_map.items():
+        if not benchmark_enabled_map.get(benchmark_name, False):
+            continue
+        # Create a place to write the perf results that you will write out to
+        # logdog.
+        output_json_file = os.path.join(output_results_dir, (str(uuid.uuid4()) + benchmark_name))
+        results_dict[benchmark_name] = output_json_file
+        #TODO(crbug.com/1072729): pass final arguments instead of build properties
+        # and configuration_name
+        invocations.append(
+            (benchmark_name, directories, configuration_name, build_properties, output_json_file))
+
+    # Kick off the uploads in multiple processes
+    # crbug.com/1035930: We are hitting HTTP Response 429. Limit ourselves
+    # to 2 processes to avoid this error. Uncomment the following code once
+    # the problem is fixed on the dashboard side.
+    # pool = multiprocessing.Pool(_GetCpuCount())
+    pool = multiprocessing.Pool(2)
+    upload_result_timeout = False
+    try:
+        async_result = pool.map_async(_upload_individual_benchmark, invocations)
+        # TODO(crbug.com/947035): What timeout is reasonable?
+        results = async_result.get(timeout=4000)
+    except multiprocessing.TimeoutError:
+        upload_result_timeout = True
+        logging.error('Timeout uploading benchmarks to perf dashboard in parallel')
+        results = []
+        for benchmark_name in benchmark_directory_map:
+            results.append((benchmark_name, False))
+    finally:
+        pool.terminate()
+
+    # Keep a mapping of benchmarks to their upload results
+    benchmark_upload_result_map = {}
+    for r in results:
+        benchmark_upload_result_map[r[0]] = r[1]
+
+    logdog_dict = {}
+    upload_failures_counter = 0
+    logdog_stream = None
+    logdog_label = 'Results Dashboard'
+    for benchmark_name, output_file in results_dict.items():
+        upload_succeed = benchmark_upload_result_map[benchmark_name]
+        if not upload_succeed:
+            upload_failures_counter += 1
+        is_reference = '.reference' in benchmark_name
+        _write_perf_data_to_logfile(
+            benchmark_name,
+            output_file,
+            configuration_name,
+            build_properties,
+            logdog_dict,
+            is_reference,
+            upload_failure=not upload_succeed)
+
+    logdog_file_name = _generate_unique_logdog_filename('Results_Dashboard_')
+    logdog_stream = logdog_helper.text(
+        logdog_file_name,
+        json.dumps(dict(logdog_dict), sort_keys=True, indent=4, separators=(',', ': ')),
+        content_type=JSON_CONTENT_TYPE)
+    if upload_failures_counter > 0:
+        logdog_label += (' %s merge script perf data upload failures' % upload_failures_counter)
+    extra_links[logdog_label] = logdog_stream
+    end_time = time.time()
+    print_duration('Uploading results to perf dashboard', begin_time, end_time)
+    if upload_result_timeout or upload_failures_counter > 0:
+        return 1, benchmark_upload_result_map
+    return 0, benchmark_upload_result_map
+
+
+def _write_perf_data_to_logfile(benchmark_name, output_file, configuration_name, build_properties,
+                                logdog_dict, is_ref, upload_failure):
+    viewer_url = None
+    # logdog file to write perf results to
+    if os.path.exists(output_file):
+        results = None
+        with open(output_file) as f:
+            try:
+                results = json.load(f)
+            except ValueError:
+                logging.error('Error parsing perf results JSON for benchmark  %s' % benchmark_name)
+        if results:
+            try:
+                json_fname = _generate_unique_logdog_filename(benchmark_name)
+                output_json_file = logdog_helper.open_text(json_fname)
+                json.dump(results, output_json_file, indent=4, separators=(',', ': '))
+            except ValueError as e:
+                logging.error('ValueError: "%s" while dumping output to logdog' % e)
+            finally:
+                output_json_file.close()
+            viewer_url = output_json_file.get_viewer_url()
+    else:
+        logging.warning("Perf results JSON file doesn't exist for benchmark %s" % benchmark_name)
+
+    base_benchmark_name = benchmark_name.replace('.reference', '')
+
+    if base_benchmark_name not in logdog_dict:
+        logdog_dict[base_benchmark_name] = {}
+
+    # add links for the perf results and the dashboard url to
+    # the logs section of buildbot
+    if is_ref:
+        if viewer_url:
+            logdog_dict[base_benchmark_name]['perf_results_ref'] = viewer_url
+        if upload_failure:
+            logdog_dict[base_benchmark_name]['ref_upload_failed'] = 'True'
+    else:
+        # TODO(jmadill): Figure out if we can get a dashboard URL here. http://anglebug.com/6090
+        # logdog_dict[base_benchmark_name]['dashboard_url'] = (
+        #     upload_results_to_perf_dashboard.GetDashboardUrl(benchmark_name, configuration_name,
+        #                                                      RESULTS_URL,
+        #                                                      build_properties['got_revision_cp'],
+        #                                                      _GetMachineGroup(build_properties)))
+        if viewer_url:
+            logdog_dict[base_benchmark_name]['perf_results'] = viewer_url
+        if upload_failure:
+            logdog_dict[base_benchmark_name]['upload_failed'] = 'True'
+
+
+def print_duration(step, start, end):
+    logging.info('Duration of %s: %d seconds' % (step, end - start))
+
+
+def main():
+    """ See collect_task.collect_task for more on the merge script API. """
+    logging.info(sys.argv)
+    parser = argparse.ArgumentParser()
+    # configuration-name (previously perf-id) is the name of bot the tests run on
+    # For example, buildbot-test is the name of the android-go-perf bot
+    # configuration-name and results-url are set in the json file which is going
+    # away tools/perf/core/chromium.perf.fyi.extras.json
+    parser.add_argument('--configuration-name', help=argparse.SUPPRESS)
+
+    parser.add_argument('--build-properties', help=argparse.SUPPRESS)
+    parser.add_argument('--summary-json', help=argparse.SUPPRESS)
+    parser.add_argument('--task-output-dir', help=argparse.SUPPRESS)
+    parser.add_argument('-o', '--output-json', required=True, help=argparse.SUPPRESS)
+    parser.add_argument(
+        '--skip-perf',
+        action='store_true',
+        help='In lightweight mode, using --skip-perf will skip the performance'
+        ' data handling.')
+    parser.add_argument(
+        '--lightweight',
+        action='store_true',
+        help='Choose the lightweight mode in which the perf result handling'
+        ' is performed on a separate VM.')
+    parser.add_argument('json_files', nargs='*', help=argparse.SUPPRESS)
+    parser.add_argument(
+        '--smoke-test-mode',
+        action='store_true',
+        help='This test should be run in smoke test mode'
+        ' meaning it does not upload to the perf dashboard')
+
+    args = parser.parse_args()
+
+    output_results_dir = tempfile.mkdtemp('outputresults')
+    try:
+        return_code, _ = process_perf_results(args.output_json, args.configuration_name,
+                                              args.build_properties, args.task_output_dir,
+                                              args.smoke_test_mode, output_results_dir,
+                                              args.lightweight, args.skip_perf)
+        return return_code
+    finally:
+        shutil.rmtree(output_results_dir)
+
+
+if __name__ == '__main__':
+    sys.exit(main())
diff --git a/scripts/registry_xml.py b/scripts/registry_xml.py
index 470a7bb..7831648 100644
--- a/scripts/registry_xml.py
+++ b/scripts/registry_xml.py
@@ -80,6 +80,7 @@
     "GL_EXT_draw_buffers_indexed",
     "GL_EXT_draw_elements_base_vertex",
     "GL_EXT_EGL_image_array",
+    "GL_EXT_EGL_image_storage",
     "GL_EXT_external_buffer",
     "GL_EXT_geometry_shader",
     "GL_EXT_instanced_arrays",
@@ -90,6 +91,8 @@
     "GL_EXT_multisampled_render_to_texture2",
     "GL_EXT_occlusion_query_boolean",
     "GL_EXT_primitive_bounding_box",
+    "GL_EXT_protected_textures",
+    "GL_EXT_pvrtc_sRGB",
     "GL_EXT_read_format_bgra",
     "GL_EXT_robustness",
     "GL_EXT_semaphore",
@@ -114,8 +117,13 @@
     "GL_EXT_texture_sRGB_R8",
     "GL_EXT_texture_sRGB_RG8",
     "GL_EXT_YUV_target",
+    "GL_IMG_texture_compression_pvrtc",
+    "GL_IMG_texture_compression_pvrtc2",
     "GL_KHR_debug",
     "GL_KHR_parallel_shader_compile",
+    "GL_KHR_texture_compression_astc_ldr",
+    "GL_KHR_texture_compression_astc_hdr",
+    "GL_KHR_texture_compression_astc_sliced_3d",
     "GL_NV_fence",
     "GL_NV_framebuffer_blit",
     "GL_OES_compressed_ETC1_RGB8_texture",
@@ -152,6 +160,7 @@
     "EGL_ANDROID_get_native_client_buffer",
     "EGL_ANDROID_native_fence_sync",
     "EGL_ANDROID_presentation_time",
+    "EGL_ANGLE_create_surface_swap_interval",
     "EGL_ANGLE_d3d_share_handle_client_buffer",
     "EGL_ANGLE_device_creation",
     "EGL_ANGLE_device_d3d",
diff --git a/scripts/roll_aosp.sh b/scripts/roll_aosp.sh
index 9a432cd..213f899 100755
--- a/scripts/roll_aosp.sh
+++ b/scripts/roll_aosp.sh
@@ -37,6 +37,7 @@
             "target_os = \"android\""
             "is_component_build = false"
             "is_debug = false"
+            "dcheck_always_on = false"
             "symbol_level = 0"
             "angle_standalone = false"
             "angle_build_all = false"
diff --git a/scripts/roll_chromium_deps.py b/scripts/roll_chromium_deps.py
index 44b2b27..7cabe3f 100755
--- a/scripts/roll_chromium_deps.py
+++ b/scripts/roll_chromium_deps.py
@@ -86,7 +86,6 @@
     'tools/skia_goldctl/linux',
     'tools/skia_goldctl/mac',
     'tools/skia_goldctl/win',
-    'tools/swarming_client',
 ]
 
 ANGLE_URL = 'https://chromium.googlesource.com/angle/angle'
@@ -314,7 +313,9 @@
 
 def _FindChangedCipdPackages(path, old_pkgs, new_pkgs):
     pkgs_equal = ({p['package'] for p in old_pkgs} == {p['package'] for p in new_pkgs})
-    assert pkgs_equal, 'Old: %s\n New: %s' % (old_pkgs, new_pkgs)
+    assert pkgs_equal, ('Old: %s\n New: %s.\nYou need to do a manual roll '
+                        'and remove/add entries in DEPS so the old and new '
+                        'list match.' % (old_pkgs, new_pkgs))
     for old_pkg in old_pkgs:
         for new_pkg in new_pkgs:
             old_version = old_pkg['version']
diff --git a/scripts/run_gtest_angle_test.py b/scripts/run_gtest_angle_test.py
index e334cdc..a69e359 100755
--- a/scripts/run_gtest_angle_test.py
+++ b/scripts/run_gtest_angle_test.py
@@ -8,7 +8,7 @@
 
   --isolated-script-test-output=[FILENAME]
 json is written to that file in the format:
-https://chromium.googlesource.com/chromium/src/+/master/docs/testing/json_test_results_format.md
+https://chromium.googlesource.com/chromium/src/+/main/docs/testing/json_test_results_format.md
 
 Optional argument:
 
diff --git a/src/common/PackedEGLEnums_autogen.cpp b/src/common/PackedEGLEnums_autogen.cpp
index f8c86b3..738254b 100644
--- a/src/common/PackedEGLEnums_autogen.cpp
+++ b/src/common/PackedEGLEnums_autogen.cpp
@@ -16,6 +16,51 @@
 {
 
 template <>
+ColorSpace FromEGLenum<ColorSpace>(EGLenum from)
+{
+    switch (from)
+    {
+        case EGL_COLORSPACE_sRGB:
+            return ColorSpace::sRGB;
+        case EGL_COLORSPACE_LINEAR:
+            return ColorSpace::Linear;
+        default:
+            return ColorSpace::InvalidEnum;
+    }
+}
+
+EGLenum ToEGLenum(ColorSpace from)
+{
+    switch (from)
+    {
+        case ColorSpace::sRGB:
+            return EGL_COLORSPACE_sRGB;
+        case ColorSpace::Linear:
+            return EGL_COLORSPACE_LINEAR;
+        default:
+            UNREACHABLE();
+            return 0;
+    }
+}
+
+std::ostream &operator<<(std::ostream &os, ColorSpace value)
+{
+    switch (value)
+    {
+        case ColorSpace::sRGB:
+            os << "EGL_COLORSPACE_sRGB";
+            break;
+        case ColorSpace::Linear:
+            os << "EGL_COLORSPACE_LINEAR";
+            break;
+        default:
+            os << "GL_INVALID_ENUM";
+            break;
+    }
+    return os;
+}
+
+template <>
 CompositorTiming FromEGLenum<CompositorTiming>(EGLenum from)
 {
     switch (from)
diff --git a/src/common/PackedEGLEnums_autogen.h b/src/common/PackedEGLEnums_autogen.h
index d0981e8..7794e85 100644
--- a/src/common/PackedEGLEnums_autogen.h
+++ b/src/common/PackedEGLEnums_autogen.h
@@ -24,6 +24,20 @@
 template <typename Enum>
 Enum FromEGLenum(EGLenum from);
 
+enum class ColorSpace : uint8_t
+{
+    sRGB   = 0,
+    Linear = 1,
+
+    InvalidEnum = 2,
+    EnumCount   = 2,
+};
+
+template <>
+ColorSpace FromEGLenum<ColorSpace>(EGLenum from);
+EGLenum ToEGLenum(ColorSpace from);
+std::ostream &operator<<(std::ostream &os, ColorSpace value);
+
 enum class CompositorTiming : uint8_t
 {
     CompositeDeadline        = 0,
diff --git a/src/common/android_util.cpp b/src/common/android_util.cpp
index 436b1b7..5b4f356 100644
--- a/src/common/android_util.cpp
+++ b/src/common/android_util.cpp
@@ -326,21 +326,24 @@
     }
 
     return AHardwareBufferToClientBuffer(aHardwareBuffer);
-#endif  // ANGLE_AHARDWARE_BUFFER_SUPPORT
+#else
     return nullptr;
+#endif  // ANGLE_AHARDWARE_BUFFER_SUPPORT
 }
 
 void GetANativeWindowBufferProperties(const ANativeWindowBuffer *buffer,
                                       int *width,
                                       int *height,
                                       int *depth,
-                                      int *pixelFormat)
+                                      int *pixelFormat,
+                                      uint64_t *usage)
 {
     *width       = buffer->width;
     *height      = buffer->height;
     *depth       = static_cast<int>(buffer->layerCount);
     *height      = buffer->height;
     *pixelFormat = buffer->format;
+    *usage       = buffer->usage;
 }
 
 GLenum NativePixelFormatToGLInternalFormat(int pixelFormat)
diff --git a/src/common/android_util.h b/src/common/android_util.h
index aed640a..eee60ba 100644
--- a/src/common/android_util.h
+++ b/src/common/android_util.h
@@ -42,7 +42,8 @@
                                       int *width,
                                       int *height,
                                       int *depth,
-                                      int *pixelFormat);
+                                      int *pixelFormat,
+                                      uint64_t *usage);
 GLenum NativePixelFormatToGLInternalFormat(int pixelFormat);
 int GLInternalFormatToNativePixelFormat(GLenum internalFormat);
 
diff --git a/src/common/angleutils.h b/src/common/angleutils.h
index a822fba..008b941 100644
--- a/src/common/angleutils.h
+++ b/src/common/angleutils.h
@@ -13,6 +13,7 @@
 
 #if defined(ANGLE_USE_ABSEIL)
 #    include "absl/container/flat_hash_map.h"
+#    include "absl/container/flat_hash_set.h"
 #endif  // defined(ANGLE_USE_ABSEIL)
 
 #if defined(ANGLE_WITH_LSAN)
@@ -26,6 +27,7 @@
 #include <sstream>
 #include <string>
 #include <unordered_map>
+#include <unordered_set>
 #include <vector>
 
 // A helper class to disallow copy and assignment operators
@@ -39,9 +41,13 @@
 #if defined(ANGLE_USE_ABSEIL)
 template <typename Key, typename T, class Hash = absl::container_internal::hash_default_hash<Key>>
 using HashMap = absl::flat_hash_map<Key, T, Hash>;
+template <typename Key, class Hash = absl::container_internal::hash_default_hash<Key>>
+using HashSet = absl::flat_hash_set<Key, Hash>;
 #else
 template <typename Key, typename T, class Hash = std::hash<Key>>
 using HashMap = std::unordered_map<Key, T, Hash>;
+template <typename Key, class Hash = std::hash<Key>>
+using HashSet = std::unordered_set<Key, Hash>;
 #endif  // defined(ANGLE_USE_ABSEIL)
 
 class NonCopyable
diff --git a/src/common/debug.cpp b/src/common/debug.cpp
index 0025048..6a98179 100644
--- a/src/common/debug.cpp
+++ b/src/common/debug.cpp
@@ -130,13 +130,15 @@
 }
 
 ScopedPerfEventHelper::ScopedPerfEventHelper(gl::Context *context, angle::EntryPoint entryPoint)
-    : mContext(context), mEntryPoint(entryPoint), mFunctionName(nullptr)
+    : mContext(context), mEntryPoint(entryPoint), mFunctionName(nullptr), mCalledBeginEvent(false)
 {}
 
 ScopedPerfEventHelper::~ScopedPerfEventHelper()
 {
-    // EGL_Terminate() can set g_debugAnnotator to nullptr; must call DebugAnnotationsActive() here
-    if (mFunctionName && DebugAnnotationsActive())
+    // EGL_Initialize() and EGL_Terminate() can change g_debugAnnotator.  Must check the value of
+    // g_debugAnnotator and whether ScopedPerfEventHelper::begin() initiated a begine that must be
+    // ended now.
+    if (DebugAnnotationsInitialized() && mCalledBeginEvent)
     {
         g_debugAnnotator->endEvent(mContext, mFunctionName, mEntryPoint);
     }
@@ -156,6 +158,7 @@
     ANGLE_LOG(EVENT) << std::string(&buffer[0], len);
     if (DebugAnnotationsInitialized())
     {
+        mCalledBeginEvent = true;
         g_debugAnnotator->beginEvent(mContext, mEntryPoint, mFunctionName, buffer.data());
     }
 }
diff --git a/src/common/debug.h b/src/common/debug.h
index 129d43e..6eba7a2 100644
--- a/src/common/debug.h
+++ b/src/common/debug.h
@@ -44,6 +44,7 @@
     gl::Context *mContext;
     const angle::EntryPoint mEntryPoint;
     const char *mFunctionName;
+    bool mCalledBeginEvent;
 };
 
 using LogSeverity = int;
diff --git a/src/common/entry_points_enum_autogen.cpp b/src/common/entry_points_enum_autogen.cpp
index 6b962ad..26a5fac 100644
--- a/src/common/entry_points_enum_autogen.cpp
+++ b/src/common/entry_points_enum_autogen.cpp
@@ -1034,8 +1034,12 @@
             return "glDrawTransformFeedbackStreamInstanced";
         case EntryPoint::GLEGLImageTargetRenderbufferStorageOES:
             return "glEGLImageTargetRenderbufferStorageOES";
+        case EntryPoint::GLEGLImageTargetTexStorageEXT:
+            return "glEGLImageTargetTexStorageEXT";
         case EntryPoint::GLEGLImageTargetTexture2DOES:
             return "glEGLImageTargetTexture2DOES";
+        case EntryPoint::GLEGLImageTargetTextureStorageEXT:
+            return "glEGLImageTargetTextureStorageEXT";
         case EntryPoint::GLEdgeFlag:
             return "glEdgeFlag";
         case EntryPoint::GLEdgeFlagPointer:
diff --git a/src/common/entry_points_enum_autogen.h b/src/common/entry_points_enum_autogen.h
index f5e32a6..411699c 100644
--- a/src/common/entry_points_enum_autogen.h
+++ b/src/common/entry_points_enum_autogen.h
@@ -523,7 +523,9 @@
     GLDrawTransformFeedbackStream,
     GLDrawTransformFeedbackStreamInstanced,
     GLEGLImageTargetRenderbufferStorageOES,
+    GLEGLImageTargetTexStorageEXT,
     GLEGLImageTargetTexture2DOES,
+    GLEGLImageTargetTextureStorageEXT,
     GLEdgeFlag,
     GLEdgeFlagPointer,
     GLEdgeFlagv,
diff --git a/src/common/packed_egl_enums.json b/src/common/packed_egl_enums.json
index f5f1697..24eebd0 100644
--- a/src/common/packed_egl_enums.json
+++ b/src/common/packed_egl_enums.json
@@ -39,5 +39,9 @@
         "Low": "EGL_CONTEXT_PRIORITY_LOW_IMG",
         "Medium": "EGL_CONTEXT_PRIORITY_MEDIUM_IMG",
         "High": "EGL_CONTEXT_PRIORITY_HIGH_IMG"
+    },
+    "ColorSpace": {
+        "sRGB": "EGL_COLORSPACE_sRGB",
+        "Linear": "EGL_COLORSPACE_LINEAR"
     }
 }
diff --git a/src/common/spirv/spirv_types.h b/src/common/spirv/spirv_types.h
index b8a6c65..8323e94 100644
--- a/src/common/spirv/spirv_types.h
+++ b/src/common/spirv/spirv_types.h
@@ -110,6 +110,18 @@
 // The SPIR-V blob is a sequence of uint32_t's
 using Blob = std::vector<uint32_t>;
 
+// Format of the SPIR-V header.
+// SPIR-V 1.0 Table 1: First Words of Physical Layout
+enum HeaderIndex
+{
+    kHeaderIndexMagic        = 0,
+    kHeaderIndexVersion      = 1,
+    kHeaderIndexGenerator    = 2,
+    kHeaderIndexIndexBound   = 3,
+    kHeaderIndexSchema       = 4,
+    kHeaderIndexInstructions = 5,
+};
+
 // Returns whether SPIR-V is valid.  Useful for ASSERTs.  Automatically generates a warning if
 // SPIR-V is not valid.
 bool Validate(const Blob &blob);
diff --git a/src/common/string_utils.cpp b/src/common/string_utils.cpp
index 9b75462..6956c23 100644
--- a/src/common/string_utils.cpp
+++ b/src/common/string_utils.cpp
@@ -260,6 +260,18 @@
     return true;
 }
 
+int ReplaceAllSubstrings(std::string *str,
+                         const std::string &substring,
+                         const std::string &replacement)
+{
+    int count = 0;
+    while (ReplaceSubstring(str, substring, replacement))
+    {
+        count++;
+    }
+    return count;
+}
+
 std::vector<std::string> GetStringsFromEnvironmentVarOrAndroidProperty(const char *varName,
                                                                        const char *propertyName,
                                                                        const char *separator)
diff --git a/src/common/string_utils.h b/src/common/string_utils.h
index 245a9c6..fadfe17 100644
--- a/src/common/string_utils.h
+++ b/src/common/string_utils.h
@@ -98,6 +98,11 @@
                       const std::string &substring,
                       const std::string &replacement);
 
+// Replaces all substrings 'substring' in 'str' with 'replacement'. Returns count of replacements.
+int ReplaceAllSubstrings(std::string *str,
+                         const std::string &substring,
+                         const std::string &replacement);
+
 // Split up a string parsed from an environment variable.
 std::vector<std::string> GetStringsFromEnvironmentVarOrAndroidProperty(const char *varName,
                                                                        const char *propertyName,
diff --git a/src/common/system_utils.cpp b/src/common/system_utils.cpp
index c141f57..b71115a 100644
--- a/src/common/system_utils.cpp
+++ b/src/common/system_utils.cpp
@@ -70,9 +70,10 @@
     // Set the environment variable with the value.
     SetEnvironmentVar(variableName, propertyValue.c_str());
     return propertyValue;
-#endif  // ANGLE_PLATFORM_ANDROID
+#else
     // Return the environment variable's value.
     return GetEnvironmentVar(variableName);
+#endif  // ANGLE_PLATFORM_ANDROID
 }
 
 bool GetBoolEnvironmentVar(const char *variableName)
diff --git a/src/common/third_party/base/README.angle b/src/common/third_party/base/README.angle
index ca0943b..b10d564 100644
--- a/src/common/third_party/base/README.angle
+++ b/src/common/third_party/base/README.angle
@@ -1,7 +1,7 @@
 Name: Chromium base:: helper Classes
 Short Name: base::numerics, base::MRUCachem, base::SHA1
 Version:
-URL: https://chromium.googlesource.com/chromium/src/base/+/master
+URL: https://chromium.googlesource.com/chromium/src/base/+/main
 SOURCE CODE: Copy the Chromium folder manually into this folder and run git cl format.
 Date: 24/05/2017
 Revision: 28b5bbb227d331c01e6ff9b2f8729732135aadc7 (Chromium)
diff --git a/src/common/utilities.cpp b/src/common/utilities.cpp
index 20fa539..bf15015 100644
--- a/src/common/utilities.cpp
+++ b/src/common/utilities.cpp
@@ -129,6 +129,7 @@
         case GL_SAMPLER_2D_RECT_ANGLE:
         case GL_SAMPLER_3D:
         case GL_SAMPLER_CUBE:
+        case GL_SAMPLER_CUBE_MAP_ARRAY:
         case GL_SAMPLER_2D_ARRAY:
         case GL_SAMPLER_EXTERNAL_OES:
         case GL_SAMPLER_2D_MULTISAMPLE:
@@ -136,16 +137,19 @@
         case GL_INT_SAMPLER_2D:
         case GL_INT_SAMPLER_3D:
         case GL_INT_SAMPLER_CUBE:
+        case GL_INT_SAMPLER_CUBE_MAP_ARRAY:
         case GL_INT_SAMPLER_2D_ARRAY:
         case GL_INT_SAMPLER_2D_MULTISAMPLE:
         case GL_INT_SAMPLER_2D_MULTISAMPLE_ARRAY:
         case GL_UNSIGNED_INT_SAMPLER_2D:
         case GL_UNSIGNED_INT_SAMPLER_3D:
         case GL_UNSIGNED_INT_SAMPLER_CUBE:
+        case GL_UNSIGNED_INT_SAMPLER_CUBE_MAP_ARRAY:
         case GL_UNSIGNED_INT_SAMPLER_2D_ARRAY:
         case GL_UNSIGNED_INT_SAMPLER_2D_MULTISAMPLE:
         case GL_UNSIGNED_INT_SAMPLER_2D_MULTISAMPLE_ARRAY:
         case GL_SAMPLER_2D_SHADOW:
+        case GL_SAMPLER_BUFFER:
         case GL_SAMPLER_CUBE_SHADOW:
         case GL_SAMPLER_2D_ARRAY_SHADOW:
         case GL_INT_VEC2:
diff --git a/src/compiler.gni b/src/compiler.gni
index 29bfe4d..ed9e07a 100644
--- a/src/compiler.gni
+++ b/src/compiler.gni
@@ -1,5 +1,5 @@
-# Copyright 2013 The ANGLE Project Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
+# Copyright 2013 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.
 
 angle_translator_exported_headers = [
@@ -127,6 +127,8 @@
   "src/compiler/translator/tree_ops/ClampIndirectIndices.h",
   "src/compiler/translator/tree_ops/ClampPointSize.cpp",
   "src/compiler/translator/tree_ops/ClampPointSize.h",
+  "src/compiler/translator/tree_ops/ConvertUnsupportedConstructorsToFunctionCalls.cpp",
+  "src/compiler/translator/tree_ops/ConvertUnsupportedConstructorsToFunctionCalls.h",
   "src/compiler/translator/tree_ops/DeclareAndInitBuiltinsForInstancedMultiview.cpp",
   "src/compiler/translator/tree_ops/DeclareAndInitBuiltinsForInstancedMultiview.h",
   "src/compiler/translator/tree_ops/DeferGlobalInitializers.cpp",
@@ -135,20 +137,22 @@
   "src/compiler/translator/tree_ops/EmulateGLFragColorBroadcast.h",
   "src/compiler/translator/tree_ops/EmulateMultiDrawShaderBuiltins.cpp",
   "src/compiler/translator/tree_ops/EmulateMultiDrawShaderBuiltins.h",
-  "src/compiler/translator/tree_ops/EmulatePrecision.cpp",
-  "src/compiler/translator/tree_ops/EmulatePrecision.h",
   "src/compiler/translator/tree_ops/FoldExpressions.cpp",
   "src/compiler/translator/tree_ops/FoldExpressions.h",
   "src/compiler/translator/tree_ops/ForcePrecisionQualifier.cpp",
   "src/compiler/translator/tree_ops/ForcePrecisionQualifier.h",
   "src/compiler/translator/tree_ops/InitializeVariables.cpp",
   "src/compiler/translator/tree_ops/InitializeVariables.h",
+  "src/compiler/translator/tree_ops/MonomorphizeUnsupportedFunctions.cpp",
+  "src/compiler/translator/tree_ops/MonomorphizeUnsupportedFunctions.h",
   "src/compiler/translator/tree_ops/NameNamelessUniformBuffers.cpp",
   "src/compiler/translator/tree_ops/NameNamelessUniformBuffers.h",
   "src/compiler/translator/tree_ops/PruneEmptyCases.cpp",
   "src/compiler/translator/tree_ops/PruneEmptyCases.h",
   "src/compiler/translator/tree_ops/PruneNoOps.cpp",
   "src/compiler/translator/tree_ops/PruneNoOps.h",
+  "src/compiler/translator/tree_ops/RecordConstantPrecision.cpp",
+  "src/compiler/translator/tree_ops/RecordConstantPrecision.h",
   "src/compiler/translator/tree_ops/RemoveArrayLengthMethod.cpp",
   "src/compiler/translator/tree_ops/RemoveArrayLengthMethod.h",
   "src/compiler/translator/tree_ops/RemoveAtomicCounterBuiltins.cpp",
@@ -161,14 +165,14 @@
   "src/compiler/translator/tree_ops/RemoveInvariantDeclaration.h",
   "src/compiler/translator/tree_ops/RemoveUnreferencedVariables.cpp",
   "src/compiler/translator/tree_ops/RemoveUnreferencedVariables.h",
+  "src/compiler/translator/tree_ops/RewriteArrayOfArrayOfOpaqueUniforms.cpp",
+  "src/compiler/translator/tree_ops/RewriteArrayOfArrayOfOpaqueUniforms.h",
   "src/compiler/translator/tree_ops/RewriteAtomicCounters.cpp",
   "src/compiler/translator/tree_ops/RewriteAtomicCounters.h",
   "src/compiler/translator/tree_ops/RewriteCubeMapSamplersAs2DArray.cpp",
   "src/compiler/translator/tree_ops/RewriteCubeMapSamplersAs2DArray.h",
   "src/compiler/translator/tree_ops/RewriteDfdy.cpp",
   "src/compiler/translator/tree_ops/RewriteDfdy.h",
-  "src/compiler/translator/tree_ops/RewriteRowMajorMatrices.cpp",
-  "src/compiler/translator/tree_ops/RewriteRowMajorMatrices.h",
   "src/compiler/translator/tree_ops/RewriteStructSamplers.cpp",
   "src/compiler/translator/tree_ops/RewriteStructSamplers.h",
   "src/compiler/translator/tree_ops/RewriteTexelFetchOffset.cpp",
@@ -177,18 +181,21 @@
   "src/compiler/translator/tree_ops/ScalarizeVecAndMatConstructorArgs.h",
   "src/compiler/translator/tree_ops/SeparateDeclarations.cpp",
   "src/compiler/translator/tree_ops/SeparateDeclarations.h",
+  "src/compiler/translator/tree_ops/SeparateStructFromUniformDeclarations.cpp",
+  "src/compiler/translator/tree_ops/SeparateStructFromUniformDeclarations.h",
   "src/compiler/translator/tree_ops/SimplifyLoopConditions.cpp",
   "src/compiler/translator/tree_ops/SimplifyLoopConditions.h",
   "src/compiler/translator/tree_ops/SplitSequenceOperator.cpp",
   "src/compiler/translator/tree_ops/SplitSequenceOperator.h",
+  "src/compiler/translator/tree_ops/apple/AddAndTrueToLoopCondition.h",
+  "src/compiler/translator/tree_ops/apple/RewriteDoWhile.h",
+  "src/compiler/translator/tree_ops/apple/RewriteRowMajorMatrices.h",
+  "src/compiler/translator/tree_ops/apple/RewriteUnaryMinusOperatorFloat.h",
+  "src/compiler/translator/tree_ops/apple/UnfoldShortCircuitAST.h",
   "src/compiler/translator/tree_ops/gl/ClampFragDepth.h",
   "src/compiler/translator/tree_ops/gl/RegenerateStructNames.h",
   "src/compiler/translator/tree_ops/gl/RewriteRepeatedAssignToSwizzled.h",
   "src/compiler/translator/tree_ops/gl/UseInterfaceBlockFields.h",
-  "src/compiler/translator/tree_ops/gl/VectorizeVectorScalarArithmetic.h",
-  "src/compiler/translator/tree_ops/gl/mac/AddAndTrueToLoopCondition.h",
-  "src/compiler/translator/tree_ops/gl/mac/RewriteDoWhile.h",
-  "src/compiler/translator/tree_ops/gl/mac/UnfoldShortCircuitAST.h",
   "src/compiler/translator/tree_ops/vulkan/EarlyFragmentTestsOptimization.h",
   "src/compiler/translator/tree_util/AsNode.h",
   "src/compiler/translator/tree_util/BuiltIn.h",
@@ -200,15 +207,20 @@
   "src/compiler/translator/tree_util/FindFunction.h",
   "src/compiler/translator/tree_util/FindMain.cpp",
   "src/compiler/translator/tree_util/FindMain.h",
+  "src/compiler/translator/tree_util/FindPreciseNodes.cpp",
+  "src/compiler/translator/tree_util/FindPreciseNodes.h",
   "src/compiler/translator/tree_util/FindSymbolNode.cpp",
   "src/compiler/translator/tree_util/FindSymbolNode.h",
   "src/compiler/translator/tree_util/IntermNodePatternMatcher.cpp",
   "src/compiler/translator/tree_util/IntermNodePatternMatcher.h",
   "src/compiler/translator/tree_util/IntermNode_util.cpp",
   "src/compiler/translator/tree_util/IntermNode_util.h",
+  "src/compiler/translator/tree_util/IntermRebuild.cpp",
+  "src/compiler/translator/tree_util/IntermRebuild.h",
   "src/compiler/translator/tree_util/IntermTraverse.cpp",
   "src/compiler/translator/tree_util/IntermTraverse.h",
   "src/compiler/translator/tree_util/NodeSearch.h",
+  "src/compiler/translator/tree_util/NodeType.h",
   "src/compiler/translator/tree_util/ReplaceArrayOfMatrixVarying.cpp",
   "src/compiler/translator/tree_util/ReplaceArrayOfMatrixVarying.h",
   "src/compiler/translator/tree_util/ReplaceClipCullDistanceVariable.cpp",
@@ -243,8 +255,6 @@
   "src/compiler/translator/OutputESSL.cpp",
   "src/compiler/translator/OutputESSL.h",
   "src/compiler/translator/TranslatorESSL.cpp",
-  "src/compiler/translator/tree_ops/gl/RecordConstantPrecision.cpp",
-  "src/compiler/translator/tree_ops/gl/RecordConstantPrecision.h",
 ]
 angle_translator_glsl_sources = [
   "src/compiler/translator/BuiltInFunctionEmulatorGLSL.cpp",
@@ -253,19 +263,17 @@
   "src/compiler/translator/ExtensionGLSL.h",
   "src/compiler/translator/TranslatorGLSL.cpp",
   "src/compiler/translator/VersionGLSL.cpp",
-  "src/compiler/translator/VersionGLSL.h",
   "src/compiler/translator/tree_ops/gl/ClampFragDepth.cpp",
   "src/compiler/translator/tree_ops/gl/RegenerateStructNames.cpp",
   "src/compiler/translator/tree_ops/gl/RewriteRepeatedAssignToSwizzled.cpp",
   "src/compiler/translator/tree_ops/gl/UseInterfaceBlockFields.cpp",
-  "src/compiler/translator/tree_ops/gl/VectorizeVectorScalarArithmetic.cpp",
-  "src/compiler/translator/tree_ops/gl/mac/RewriteUnaryMinusOperatorFloat.h",
 ]
-angle_translator_glsl_mac_sources = [
-  "src/compiler/translator/tree_ops/gl/mac/AddAndTrueToLoopCondition.cpp",
-  "src/compiler/translator/tree_ops/gl/mac/RewriteDoWhile.cpp",
-  "src/compiler/translator/tree_ops/gl/mac/RewriteUnaryMinusOperatorFloat.cpp",
-  "src/compiler/translator/tree_ops/gl/mac/UnfoldShortCircuitAST.cpp",
+angle_translator_apple_sources = [
+  "src/compiler/translator/tree_ops/apple/AddAndTrueToLoopCondition.cpp",
+  "src/compiler/translator/tree_ops/apple/RewriteDoWhile.cpp",
+  "src/compiler/translator/tree_ops/apple/RewriteRowMajorMatrices.cpp",
+  "src/compiler/translator/tree_ops/apple/RewriteUnaryMinusOperatorFloat.cpp",
+  "src/compiler/translator/tree_ops/apple/UnfoldShortCircuitAST.cpp",
 ]
 angle_translator_hlsl_sources = [
   "src/compiler/translator/ASTMetadataHLSL.cpp",
@@ -340,38 +348,26 @@
   "src/compiler/translator/tree_ops/vulkan/EmulateFragColorData.h",
   "src/compiler/translator/tree_ops/vulkan/FlagSamplersWithTexelFetch.cpp",
   "src/compiler/translator/tree_ops/vulkan/FlagSamplersWithTexelFetch.h",
-  "src/compiler/translator/tree_ops/vulkan/MonomorphizeUnsupportedFunctionsInVulkanGLSL.cpp",
-  "src/compiler/translator/tree_ops/vulkan/MonomorphizeUnsupportedFunctionsInVulkanGLSL.h",
   "src/compiler/translator/tree_ops/vulkan/ReplaceForShaderFramebufferFetch.cpp",
   "src/compiler/translator/tree_ops/vulkan/ReplaceForShaderFramebufferFetch.h",
-  "src/compiler/translator/tree_ops/vulkan/RewriteArrayOfArrayOfOpaqueUniforms.cpp",
-  "src/compiler/translator/tree_ops/vulkan/RewriteArrayOfArrayOfOpaqueUniforms.h",
   "src/compiler/translator/tree_ops/vulkan/RewriteInterpolateAtOffset.cpp",
   "src/compiler/translator/tree_ops/vulkan/RewriteInterpolateAtOffset.h",
   "src/compiler/translator/tree_ops/vulkan/RewriteR32fImages.cpp",
   "src/compiler/translator/tree_ops/vulkan/RewriteR32fImages.h",
-  "src/compiler/translator/tree_ops/vulkan/SeparateStructFromUniformDeclarations.cpp",
-  "src/compiler/translator/tree_ops/vulkan/SeparateStructFromUniformDeclarations.h",
 ]
-if (is_android) {
-  angle_translator_sources += [
-    "src/compiler/translator/ImmutableString_ESSL_autogen.cpp",
-    "src/compiler/translator/SymbolTable_ESSL_autogen.cpp",
-  ]
-} else {
-  angle_translator_sources += [
-    "src/compiler/translator/ImmutableString_autogen.cpp",
-    "src/compiler/translator/SymbolTable_autogen.cpp",
-  ]
-}
+
+angle_translator_essl_symbol_table_sources = [
+  "src/compiler/translator/ImmutableString_ESSL_autogen.cpp",
+  "src/compiler/translator/SymbolTable_ESSL_autogen.cpp",
+]
+angle_translator_glsl_symbol_table_sources = [
+  "src/compiler/translator/ImmutableString_autogen.cpp",
+  "src/compiler/translator/SymbolTable_autogen.cpp",
+]
 
 angle_translator_lib_metal_sources = [
-  "src/compiler/translator/OutputVulkanGLSLForMetal.h",
-  "src/compiler/translator/OutputVulkanGLSLForMetal.mm",
   "src/compiler/translator/TranslatorMetal.cpp",
   "src/compiler/translator/TranslatorMetalDirect.cpp",
-  "src/compiler/translator/TranslatorMetalDirect/AddExplicitTypeCasts.cpp",
-  "src/compiler/translator/TranslatorMetalDirect/AddExplicitTypeCasts.h",
   "src/compiler/translator/TranslatorMetalDirect/AstHelpers.cpp",
   "src/compiler/translator/TranslatorMetalDirect/AstHelpers.h",
   "src/compiler/translator/TranslatorMetalDirect/DebugSink.h",
@@ -387,8 +383,6 @@
   "src/compiler/translator/TranslatorMetalDirect/HoistConstants.h",
   "src/compiler/translator/TranslatorMetalDirect/IdGen.cpp",
   "src/compiler/translator/TranslatorMetalDirect/IdGen.h",
-  "src/compiler/translator/TranslatorMetalDirect/IntermRebuild.cpp",
-  "src/compiler/translator/TranslatorMetalDirect/IntermRebuild.h",
   "src/compiler/translator/TranslatorMetalDirect/IntroduceVertexIndexID.cpp",
   "src/compiler/translator/TranslatorMetalDirect/IntroduceVertexIndexID.h",
   "src/compiler/translator/TranslatorMetalDirect/Layout.cpp",
@@ -403,7 +397,6 @@
   "src/compiler/translator/TranslatorMetalDirect/Name.h",
   "src/compiler/translator/TranslatorMetalDirect/NameEmbeddedUniformStructsMetal.cpp",
   "src/compiler/translator/TranslatorMetalDirect/NameEmbeddedUniformStructsMetal.h",
-  "src/compiler/translator/TranslatorMetalDirect/NodeType.h",
   "src/compiler/translator/TranslatorMetalDirect/Pipeline.cpp",
   "src/compiler/translator/TranslatorMetalDirect/Pipeline.h",
   "src/compiler/translator/TranslatorMetalDirect/ProgramPrelude.cpp",
diff --git a/src/compiler/fuzz/translator_fuzzer.cpp b/src/compiler/fuzz/translator_fuzzer.cpp
index 7195d48..4b5681f 100644
--- a/src/compiler/fuzz/translator_fuzzer.cpp
+++ b/src/compiler/fuzz/translator_fuzzer.cpp
@@ -43,7 +43,7 @@
 constexpr ShCompileOptions kGLSLOrESSLOnlyOptions =
     SH_EMULATE_ATAN2_FLOAT_FUNCTION | SH_CLAMP_FRAG_DEPTH | SH_REGENERATE_STRUCT_NAMES |
     SH_REWRITE_REPEATED_ASSIGN_TO_SWIZZLED | SH_USE_UNUSED_STANDARD_SHARED_BLOCKS |
-    SH_REWRITE_VECTOR_SCALAR_ARITHMETIC | SH_SELECT_VIEW_IN_NV_GLSL_VERTEX_SHADER;
+    SH_SELECT_VIEW_IN_NV_GLSL_VERTEX_SHADER;
 
 #if defined(ANGLE_PLATFORM_APPLE)
 // Options supported by GLSL only on mac
@@ -220,7 +220,6 @@
         resources.EXT_draw_buffers                = 1;
         resources.EXT_frag_depth                  = 1;
         resources.EXT_shader_texture_lod          = 1;
-        resources.WEBGL_debug_shader_precision    = 1;
         resources.EXT_shader_framebuffer_fetch    = 1;
         resources.NV_shader_framebuffer_fetch     = 1;
         resources.ARM_shader_framebuffer_fetch    = 1;
@@ -231,6 +230,7 @@
         resources.MaxClipDistances                = 1;
         resources.EXT_shadow_samplers             = 1;
         resources.EXT_clip_cull_distance          = 1;
+        resources.EXT_primitive_bounding_box      = 1;
 
         if (!translator->Init(resources))
         {
diff --git a/src/compiler/translator/BaseTypes.h b/src/compiler/translator/BaseTypes.h
index 3c81d32..d1ac7bf 100644
--- a/src/compiler/translator/BaseTypes.h
+++ b/src/compiler/translator/BaseTypes.h
@@ -729,6 +729,19 @@
     return false;
 }
 
+inline bool IsSamplerBuffer(TBasicType type)
+{
+    switch (type)
+    {
+        case EbtSamplerBuffer:
+        case EbtISamplerBuffer:
+        case EbtUSamplerBuffer:
+            return true;
+        default:
+            return false;
+    }
+}
+
 inline bool IsShadowSampler(TBasicType type)
 {
     switch (type)
@@ -969,6 +982,19 @@
     return false;
 }
 
+inline bool IsImageBuffer(TBasicType type)
+{
+    switch (type)
+    {
+        case EbtImageBuffer:
+        case EbtIImageBuffer:
+        case EbtUImageBuffer:
+            return true;
+        default:
+            return false;
+    }
+}
+
 inline bool IsInteger(TBasicType type)
 {
     return type == EbtInt || type == EbtUInt;
@@ -989,7 +1015,7 @@
 {
     EvqTemporary,   // For temporaries (within a function), read/write
     EvqGlobal,      // For globals read/write
-    EvqConst,       // User defined constants and non-output parameters in functions
+    EvqConst,       // User defined constants
     EvqAttribute,   // Readonly
     EvqVaryingIn,   // readonly, fragment shaders only
     EvqVaryingOut,  // vertex shaders only  read/write
@@ -1005,10 +1031,10 @@
     EvqFragmentInOut,  // EXT_shader_framebuffer_fetch qualifier
 
     // parameters
-    EvqIn,
-    EvqOut,
-    EvqInOut,
-    EvqConstReadOnly,
+    EvqParamIn,
+    EvqParamOut,
+    EvqParamInOut,
+    EvqParamConst,
 
     // built-ins read by vertex shader
     EvqInstanceID,
@@ -1029,9 +1055,7 @@
     // built-ins written by fragment shader
     EvqFragColor,
     EvqFragData,
-
-    EvqFragDepth,     // gl_FragDepth for ESSL300.
-    EvqFragDepthEXT,  // gl_FragDepthEXT for ESSL100, EXT_frag_depth.
+    EvqFragDepth,  // gl_FragDepth for ESSL300, or gl_FragDepthEXT for ESSL100, EXT_frag_depth.
 
     EvqSecondaryFragColorEXT,  // EXT_blend_func_extended
     EvqSecondaryFragDataEXT,   // EXT_blend_func_extended
@@ -1110,6 +1134,9 @@
     EvqTessLevelOuter,
     EvqTessLevelInner,
 
+    // GLES ES 3.1 extension EXT_primitive_bounding_box
+    EvqBoundingBoxEXT,
+
     EvqTessEvaluationIn,
     EvqTessEvaluationOut,
     EvqTessCoord,
@@ -1175,11 +1202,6 @@
         case EvqSampleOut:
         case EvqPatchOut:
         case EvqFragmentInOut:
-        // Per-vertex built-ins when used without gl_in or gl_out are always output.
-        case EvqPosition:
-        case EvqPointSize:
-        case EvqClipDistance:
-        case EvqCullDistance:
             return true;
         default:
             return false;
@@ -1197,6 +1219,8 @@
         case EvqTessControlOut:
         case EvqTessEvaluationIn:
         case EvqTessEvaluationOut:
+        case EvqPatchIn:
+        case EvqPatchOut:
         case EvqGeometryIn:
         case EvqGeometryOut:
         case EvqFragmentIn:
@@ -1443,9 +1467,7 @@
     }
 }
 
-//
-// This is just for debug and error message print out, carried along with the definitions above.
-//
+// Used for GLSL generation, debugging and error messages.
 inline const char *getQualifierString(TQualifier q)
 {
     // clang-format off
@@ -1464,10 +1486,10 @@
     case EvqFragmentOut:            return "out";
     case EvqVertexOut:              return "out";
     case EvqFragmentIn:             return "in";
-    case EvqIn:                     return "in";
-    case EvqOut:                    return "out";
-    case EvqInOut:                  return "inout";
-    case EvqConstReadOnly:          return "const";
+    case EvqParamIn:                return "in";
+    case EvqParamOut:               return "out";
+    case EvqParamInOut:             return "inout";
+    case EvqParamConst:             return "const";
     case EvqInstanceID:             return "InstanceID";
     case EvqVertexID:               return "VertexID";
     case EvqPosition:               return "Position";
@@ -1479,7 +1501,6 @@
     case EvqPointCoord:             return "PointCoord";
     case EvqFragColor:              return "FragColor";
     case EvqFragData:               return "FragData";
-    case EvqFragDepthEXT:           return "FragDepth";
     case EvqFragDepth:              return "FragDepth";
     case EvqSecondaryFragColorEXT:  return "SecondaryFragColorEXT";
     case EvqSecondaryFragDataEXT:   return "SecondaryFragDataEXT";
@@ -1519,6 +1540,7 @@
     case EvqPrimitiveID:            return "gl_PrimitiveID";
     case EvqPrecise:                return "precise";
     case EvqClipDistance:           return "ClipDistance";
+    case EvqCullDistance:           return "CullDistance";
     case EvqSample:                 return "sample";
     case EvqSampleIn:               return "sample in";
     case EvqSampleOut:              return "sample out";
@@ -1535,6 +1557,7 @@
     case EvqPatchVerticesIn:        return "PatchVerticesIn";
     case EvqTessLevelOuter:         return "TessLevelOuter";
     case EvqTessLevelInner:         return "TessLevelInner";
+    case EvqBoundingBoxEXT:         return "BoundingBoxEXT";
     case EvqTessEvaluationIn:       return "in";
     case EvqTessEvaluationOut:      return "out";
     case EvqTessCoord:              return "TessCoord";
diff --git a/src/compiler/translator/BuildSPIRV.cpp b/src/compiler/translator/BuildSPIRV.cpp
index f0b5dda..aa52769 100644
--- a/src/compiler/translator/BuildSPIRV.cpp
+++ b/src/compiler/translator/BuildSPIRV.cpp
@@ -36,6 +36,7 @@
         return a.typeSpec.blockStorage == b.typeSpec.blockStorage &&
                a.typeSpec.isInvariantBlock == b.typeSpec.isInvariantBlock &&
                a.typeSpec.isRowMajorQualifiedBlock == b.typeSpec.isRowMajorQualifiedBlock &&
+               a.typeSpec.isPatchIOBlock == b.typeSpec.isPatchIOBlock &&
                a.typeSpec.isOrHasBoolInInterfaceBlock == b.typeSpec.isOrHasBoolInInterfaceBlock;
     }
 
@@ -49,24 +50,8 @@
            a.typeSpec.isOrHasBoolInInterfaceBlock == b.typeSpec.isOrHasBoolInInterfaceBlock;
 }
 
-uint32_t GetTotalArrayElements(const TSpan<const unsigned int> &arraySizes)
+namespace
 {
-    uint32_t arraySizeProduct = 1;
-    for (uint32_t arraySize : arraySizes)
-    {
-        // For runtime arrays, arraySize will be 0 and should be excluded.
-        arraySizeProduct *= arraySize > 0 ? arraySize : 1;
-    }
-
-    return arraySizeProduct;
-}
-
-uint32_t GetOutermostArraySize(const SpirvType &type)
-{
-    uint32_t size = type.arraySizes.back();
-    return size ? size : 1;
-}
-
 bool IsBlockFieldRowMajorQualified(const TType &fieldType, bool isParentBlockRowMajorQualified)
 {
     // If the field is specifically qualified as row-major, it will be row-major.  Otherwise unless
@@ -94,21 +79,18 @@
 
 TLayoutBlockStorage GetBlockStorage(const TType &type)
 {
-    // If the type specifies the layout, take it from that.
-    TLayoutBlockStorage blockStorage = type.getLayoutQualifier().blockStorage;
-
-    // For user-defined interface blocks, the block storage is specified on the symbol itself and
-    // not the type.
-    if (blockStorage == EbsUnspecified && type.getInterfaceBlock() != nullptr)
+    // For interface blocks, the block storage is specified on the symbol itself.
+    if (type.getInterfaceBlock() != nullptr)
     {
-        blockStorage = type.getInterfaceBlock()->blockStorage();
+        return type.getInterfaceBlock()->blockStorage();
     }
 
-    if (IsShaderIoBlock(type.getQualifier()) || blockStorage == EbsStd140 ||
-        blockStorage == EbsStd430)
-    {
-        return blockStorage;
-    }
+    // I/O blocks must have been handled above.
+    ASSERT(!IsShaderIoBlock(type.getQualifier()));
+
+    // Additionally, interface blocks are already handled, so it's not expected for the type to have
+    // a block storage specified.
+    ASSERT(type.getLayoutQualifier().blockStorage == EbsUnspecified);
 
     // Default to std140 for uniform and std430 for buffer blocks.
     return type.getQualifier() == EvqBuffer ? EbsStd430 : EbsStd140;
@@ -259,6 +241,116 @@
     return memberInfo.arrayStride * var.getInnerArraySizeProduct();
 }
 
+spv::ExecutionMode GetGeometryInputExecutionMode(TLayoutPrimitiveType primitiveType)
+{
+    // Default input primitive type for geometry shaders is points
+    if (primitiveType == EptUndefined)
+    {
+        primitiveType = EptPoints;
+    }
+
+    switch (primitiveType)
+    {
+        case EptPoints:
+            return spv::ExecutionModeInputPoints;
+        case EptLines:
+            return spv::ExecutionModeInputLines;
+        case EptLinesAdjacency:
+            return spv::ExecutionModeInputLinesAdjacency;
+        case EptTriangles:
+            return spv::ExecutionModeTriangles;
+        case EptTrianglesAdjacency:
+            return spv::ExecutionModeInputTrianglesAdjacency;
+        case EptLineStrip:
+        case EptTriangleStrip:
+        default:
+            UNREACHABLE();
+            return {};
+    }
+}
+
+spv::ExecutionMode GetGeometryOutputExecutionMode(TLayoutPrimitiveType primitiveType)
+{
+    // Default output primitive type for geometry shaders is points
+    if (primitiveType == EptUndefined)
+    {
+        primitiveType = EptPoints;
+    }
+
+    switch (primitiveType)
+    {
+        case EptPoints:
+            return spv::ExecutionModeOutputPoints;
+        case EptLineStrip:
+            return spv::ExecutionModeOutputLineStrip;
+        case EptTriangleStrip:
+            return spv::ExecutionModeOutputTriangleStrip;
+        case EptLines:
+        case EptLinesAdjacency:
+        case EptTriangles:
+        case EptTrianglesAdjacency:
+        default:
+            UNREACHABLE();
+            return {};
+    }
+}
+
+spv::ExecutionMode GetTessEvalInputExecutionMode(TLayoutTessEvaluationType inputType)
+{
+    // It's invalid for input type to not be specified, but that's a link-time error.  Default to
+    // anything.
+    if (inputType == EtetUndefined)
+    {
+        inputType = EtetTriangles;
+    }
+
+    switch (inputType)
+    {
+        case EtetTriangles:
+            return spv::ExecutionModeTriangles;
+        case EtetQuads:
+            return spv::ExecutionModeQuads;
+        case EtetIsolines:
+            return spv::ExecutionModeIsolines;
+        default:
+            UNREACHABLE();
+            return {};
+    }
+}
+
+spv::ExecutionMode GetTessEvalSpacingExecutionMode(TLayoutTessEvaluationType spacing)
+{
+    switch (spacing)
+    {
+        case EtetEqualSpacing:
+        case EtetUndefined:
+            return spv::ExecutionModeSpacingEqual;
+        case EtetFractionalEvenSpacing:
+            return spv::ExecutionModeSpacingFractionalEven;
+        case EtetFractionalOddSpacing:
+            return spv::ExecutionModeSpacingFractionalOdd;
+        default:
+            UNREACHABLE();
+            return {};
+    }
+}
+
+spv::ExecutionMode GetTessEvalOrderingExecutionMode(TLayoutTessEvaluationType ordering)
+{
+    switch (ordering)
+    {
+        case EtetCw:
+            return spv::ExecutionModeVertexOrderCw;
+        case EtetCcw:
+        case EtetUndefined:
+            return spv::ExecutionModeVertexOrderCcw;
+        default:
+            UNREACHABLE();
+            return {};
+    }
+}
+}  // anonymous namespace
+
 void SpirvTypeSpec::inferDefaults(const TType &type, TCompiler *compiler)
 {
     // Infer some defaults based on type.  If necessary, this overrides some fields (if not already
@@ -299,6 +391,12 @@
                                           type.isStructureContainingType(EbtBool) ||
                                           type.getBasicType() == EbtBool;
         }
+
+        if (!isPatchIOBlock && type.isInterfaceBlock())
+        {
+            isPatchIOBlock =
+                type.getQualifier() == EvqPatchIn || type.getQualifier() == EvqPatchOut;
+        }
     }
 
     // |invariant| is significant for structs as the fields of the type are decorated with Invariant
@@ -327,6 +425,9 @@
 
 void SpirvTypeSpec::onBlockFieldSelection(const TType &fieldType)
 {
+    // Patch is never recursively applied.
+    isPatchIOBlock = false;
+
     if (fieldType.getStruct() == nullptr)
     {
         // If the field is not a block, no difference if the parent block was invariant or
@@ -377,6 +478,35 @@
            blockStorage == EbsUnspecified);
 }
 
+SPIRVBuilder::SPIRVBuilder(TCompiler *compiler,
+                           ShCompileOptions compileOptions,
+                           ShHashFunction64 hashFunction,
+                           NameMap &nameMap)
+    : mCompiler(compiler),
+      mCompileOptions(compileOptions),
+      mShaderType(gl::FromGLenum<gl::ShaderType>(compiler->getShaderType())),
+      mNextAvailableId(1),
+      mHashFunction(hashFunction),
+      mNameMap(nameMap),
+      mNextUnusedBinding(0),
+      mNextUnusedInputLocation(0),
+      mNextUnusedOutputLocation(0)
+{
+    // The Shader capability is always defined.
+    addCapability(spv::CapabilityShader);
+
+    // Add Geometry or Tessellation capabilities based on shader type.
+    if (mCompiler->getShaderType() == GL_GEOMETRY_SHADER)
+    {
+        addCapability(spv::CapabilityGeometry);
+    }
+    else if (mCompiler->getShaderType() == GL_TESS_CONTROL_SHADER_EXT ||
+             mCompiler->getShaderType() == GL_TESS_EVALUATION_SHADER_EXT)
+    {
+        addCapability(spv::CapabilityTessellation);
+    }
+}
+
 spirv::IdRef SPIRVBuilder::getNewId(const SpirvDecorations &decorations)
 {
     spirv::IdRef newId = mNextAvailableId;
@@ -445,6 +575,17 @@
     return getSpirvTypeData(spirvType, block);
 }
 
+const SpirvTypeData &SPIRVBuilder::getTypeDataOverrideTypeSpec(const TType &type,
+                                                               const SpirvTypeSpec &typeSpec)
+{
+    // This is a variant of getTypeData() where type spec is not automatically derived.  It's useful
+    // in cast operations that specifically need to override the spec.
+    SpirvType spirvType = getSpirvType(type, typeSpec);
+    spirvType.typeSpec  = typeSpec;
+
+    return getSpirvTypeData(spirvType, nullptr);
+}
+
 const SpirvTypeData &SPIRVBuilder::getSpirvTypeData(const SpirvType &type, const TSymbol *block)
 {
     // Structs with bools generate a different type when used in an interface block (where the bool
@@ -526,13 +667,23 @@
     SpirvDecorations decorations;
 
     // Handle precision.
-    if (enablePrecision && !mDisableRelaxedPrecision &&
-        (precision == EbpMedium || precision == EbpLow))
+    if (enablePrecision && (precision == EbpMedium || precision == EbpLow))
     {
         decorations.push_back(spv::DecorationRelaxedPrecision);
     }
 
-    // TODO: Handle |precise|.  http://anglebug.com/4889.
+    return decorations;
+}
+
+SpirvDecorations SPIRVBuilder::getArithmeticDecorations(const TType &type, bool isPrecise)
+{
+    SpirvDecorations decorations = getDecorations(type);
+
+    // Handle |precise|.
+    if (isPrecise)
+    {
+        decorations.push_back(spv::DecorationNoContraction);
+    }
 
     return decorations;
 }
@@ -615,7 +766,7 @@
         typeId = getNewId({});
         spirv::WriteTypeSampledImage(&mSpirvTypeAndConstantDecls, typeId, nonSampledId);
     }
-    else if (IsImage(type.type) || type.isSamplerBaseImage)
+    else if (IsImage(type.type) || IsSubpassInputType(type.type) || type.isSamplerBaseImage)
     {
         // Declaring an image.
 
@@ -634,11 +785,6 @@
         spirv::WriteTypeImage(&mSpirvTypeAndConstantDecls, typeId, sampledType, dim, depth, arrayed,
                               multisampled, sampled, imageFormat, nullptr);
     }
-    else if (IsSubpassInputType(type.type))
-    {
-        // TODO: add support for framebuffer fetch. http://anglebug.com/4889
-        UNIMPLEMENTED();
-    }
     else if (type.secondarySize > 1)
     {
         // Declaring a matrix.  Declare the column type first, then create a matrix out of it.
@@ -765,7 +911,7 @@
                                           spirv::LiteralInteger *sampledOut)
 {
     TBasicType sampledType = EbtFloat;
-    *dimOut                = spv::Dim2D;
+    *dimOut                = IsSubpassInputType(type) ? spv::DimSubpassData : spv::Dim2D;
     bool isDepth           = false;
     bool isArrayed         = false;
     bool isMultisampled    = false;
@@ -776,6 +922,7 @@
         // Float 2D Images
         case EbtSampler2D:
         case EbtImage2D:
+        case EbtSubpassInput:
             break;
         case EbtSamplerExternalOES:
         case EbtSamplerExternal2DY2YEXT:
@@ -789,6 +936,7 @@
             break;
         case EbtSampler2DMS:
         case EbtImage2DMS:
+        case EbtSubpassInputMS:
             isMultisampled = true;
             break;
         case EbtSampler2DMSArray:
@@ -807,6 +955,7 @@
         // Integer 2D images
         case EbtISampler2D:
         case EbtIImage2D:
+        case EbtISubpassInput:
             sampledType = EbtInt;
             break;
         case EbtISampler2DArray:
@@ -816,6 +965,7 @@
             break;
         case EbtISampler2DMS:
         case EbtIImage2DMS:
+        case EbtISubpassInputMS:
             sampledType    = EbtInt;
             isMultisampled = true;
             break;
@@ -829,6 +979,7 @@
         // Unsinged integer 2D images
         case EbtUSampler2D:
         case EbtUImage2D:
+        case EbtUSubpassInput:
             sampledType = EbtUInt;
             break;
         case EbtUSampler2DArray:
@@ -838,6 +989,7 @@
             break;
         case EbtUSampler2DMS:
         case EbtUImage2DMS:
+        case EbtUSubpassInputMS:
             sampledType    = EbtUInt;
             isMultisampled = true;
             break;
@@ -992,7 +1144,6 @@
             *dimOut     = spv::DimBuffer;
             break;
         default:
-            // TODO: support framebuffer fetch.  http://anglebug.com/4889
             UNREACHABLE();
     }
 
@@ -1028,6 +1179,8 @@
     //     Rect         SampledRect     ImageRect
     //     Buffer       SampledBuffer   ImageBuffer
     //
+    // Additionally, the SubpassData Dim requires the InputAttachment capability.
+    //
     // Note that the Shader capability is always unconditionally added.
     //
     switch (*dimOut)
@@ -1044,7 +1197,7 @@
         case spv::Dim3D:
             break;
         case spv::DimCube:
-            if (!isSampledImage && isArrayed && isMultisampled)
+            if (!isSampledImage && isArrayed)
             {
                 addCapability(spv::CapabilityImageCubeArray);
             }
@@ -1056,8 +1209,10 @@
             addCapability(isSampledImage ? spv::CapabilitySampledBuffer
                                          : spv::CapabilityImageBuffer);
             break;
+        case spv::DimSubpassData:
+            addCapability(spv::CapabilityInputAttachment);
+            break;
         default:
-            // TODO: support framebuffer fetch.  http://anglebug.com/4889
             UNREACHABLE();
     }
 }
@@ -1317,8 +1472,8 @@
                                     ? &mSpirvCurrentFunctionBlocks.front().localVariables
                                     : &mSpirvVariableDecls;
 
-    const spirv::IdRef variableId    = getNewId(decorations);
     const spirv::IdRef typePointerId = getTypePointerId(typeId, storageClass);
+    const spirv::IdRef variableId    = getNewId(decorations);
 
     spirv::WriteVariable(spirvSection, typePointerId, variableId, storageClass, initializerId);
 
@@ -1487,6 +1642,17 @@
     mCapabilities.insert(capability);
 }
 
+void SPIRVBuilder::addExecutionMode(spv::ExecutionMode executionMode)
+{
+    ASSERT(static_cast<size_t>(executionMode) < mExecutionModes.size());
+    mExecutionModes.set(executionMode);
+}
+
+void SPIRVBuilder::addExtension(SPIRVExtensions extension)
+{
+    mExtensions.set(extension);
+}
+
 void SPIRVBuilder::setEntryPointId(spirv::IdRef id)
 {
     ASSERT(!mEntryPointId.valid());
@@ -1775,6 +1941,13 @@
         // Add interpolation and auxiliary decorations
         writeInterpolationDecoration(fieldType.getQualifier(), typeId, fieldIndex);
 
+        // Add patch decoration if any.
+        if (type.typeSpec.isPatchIOBlock)
+        {
+            spirv::WriteMemberDecorate(&mSpirvDecorations, typeId,
+                                       spirv::LiteralInteger(fieldIndex), spv::DecorationPatch, {});
+        }
+
         // Add other decorations.
         SpirvDecorations decorations = getDecorations(fieldType);
         for (const spv::Decoration decoration : decorations)
@@ -1896,14 +2069,14 @@
 
     // Generate metadata in the following order:
     //
-    // - OpCapability instructions.  The Shader capability is always defined.
-    spirv::WriteCapability(&result, spv::CapabilityShader);
+    // - OpCapability instructions.
     for (spv::Capability capability : mCapabilities)
     {
         spirv::WriteCapability(&result, capability);
     }
 
-    // - OpExtension instructions (TODO: http://anglebug.com/4889)
+    // - OpExtension instructions
+    writeExtensions(&result);
 
     // - OpExtInstImport
     if (mExtInstImportIdStd.valid())
@@ -1927,13 +2100,14 @@
                            mEntryPointInterfaceList);
 
     // - OpExecutionMode instructions
-    generateExecutionModes(&result);
+    writeExecutionModes(&result);
 
-    // - OpSource instruction.
+    // - OpSource and OpSourceExtension instructions.
     //
     // This is to support debuggers and capture/replay tools and isn't strictly necessary.
     spirv::WriteSource(&result, spv::SourceLanguageGLSL, spirv::LiteralInteger(450), nullptr,
                        nullptr);
+    writeSourceExtensions(&result);
 
     // Append the already generated sections in order
     result.insert(result.end(), mSpirvDebug.begin(), mSpirvDebug.end());
@@ -1949,7 +2123,7 @@
     return result;
 }
 
-void SPIRVBuilder::generateExecutionModes(spirv::Blob *blob)
+void SPIRVBuilder::writeExecutionModes(spirv::Blob *blob)
 {
     switch (mShaderType)
     {
@@ -1965,6 +2139,52 @@
 
             break;
 
+        case gl::ShaderType::TessControl:
+            spirv::WriteExecutionMode(
+                blob, mEntryPointId, spv::ExecutionModeOutputVertices,
+                {spirv::LiteralInteger(mCompiler->getTessControlShaderOutputVertices())});
+            break;
+
+        case gl::ShaderType::TessEvaluation:
+        {
+            const spv::ExecutionMode inputExecutionMode = GetTessEvalInputExecutionMode(
+                mCompiler->getTessEvaluationShaderInputPrimitiveType());
+            const spv::ExecutionMode spacingExecutionMode = GetTessEvalSpacingExecutionMode(
+                mCompiler->getTessEvaluationShaderInputVertexSpacingType());
+            const spv::ExecutionMode orderingExecutionMode = GetTessEvalOrderingExecutionMode(
+                mCompiler->getTessEvaluationShaderInputOrderingType());
+
+            spirv::WriteExecutionMode(blob, mEntryPointId, inputExecutionMode, {});
+            spirv::WriteExecutionMode(blob, mEntryPointId, spacingExecutionMode, {});
+            spirv::WriteExecutionMode(blob, mEntryPointId, orderingExecutionMode, {});
+            if (mCompiler->getTessEvaluationShaderInputPointType() == EtetPointMode)
+            {
+                spirv::WriteExecutionMode(blob, mEntryPointId, spv::ExecutionModePointMode, {});
+            }
+            break;
+        }
+
+        case gl::ShaderType::Geometry:
+        {
+            const spv::ExecutionMode inputExecutionMode =
+                GetGeometryInputExecutionMode(mCompiler->getGeometryShaderInputPrimitiveType());
+            const spv::ExecutionMode outputExecutionMode =
+                GetGeometryOutputExecutionMode(mCompiler->getGeometryShaderOutputPrimitiveType());
+
+            // max_vertices=0 is not valid in Vulkan
+            const int maxVertices = std::max(1, mCompiler->getGeometryShaderMaxVertices());
+
+            spirv::WriteExecutionMode(blob, mEntryPointId, inputExecutionMode, {});
+            spirv::WriteExecutionMode(blob, mEntryPointId, outputExecutionMode, {});
+            spirv::WriteExecutionMode(blob, mEntryPointId, spv::ExecutionModeOutputVertices,
+                                      {spirv::LiteralInteger(maxVertices)});
+            spirv::WriteExecutionMode(
+                blob, mEntryPointId, spv::ExecutionModeInvocations,
+                {spirv::LiteralInteger(mCompiler->getGeometryShaderInvocations())});
+
+            break;
+        }
+
         case gl::ShaderType::Compute:
         {
             const sh::WorkGroupSize &localSize = mCompiler->getComputeShaderLocalSize();
@@ -1974,10 +2194,47 @@
                  spirv::LiteralInteger(localSize[2])});
             break;
         }
+
         default:
-            // TODO: other shader types.  http://anglebug.com/4889
             break;
     }
+
+    // Add any execution modes that were added due to built-ins used in the shader.
+    for (uint32_t executionMode : mExecutionModes)
+    {
+        spirv::WriteExecutionMode(blob, mEntryPointId,
+                                  static_cast<spv::ExecutionMode>(executionMode), {});
+    }
+}
+
+void SPIRVBuilder::writeExtensions(spirv::Blob *blob)
+{
+    for (SPIRVExtensions extension : mExtensions)
+    {
+        switch (extension)
+        {
+            case SPIRVExtensions::MultiviewOVR:
+                spirv::WriteExtension(blob, "SPV_KHR_multiview");
+                break;
+            default:
+                UNREACHABLE();
+        }
+    }
+}
+
+void SPIRVBuilder::writeSourceExtensions(spirv::Blob *blob)
+{
+    for (SPIRVExtensions extension : mExtensions)
+    {
+        switch (extension)
+        {
+            case SPIRVExtensions::MultiviewOVR:
+                spirv::WriteSourceExtension(blob, "GL_OVR_multiview");
+                break;
+            default:
+                UNREACHABLE();
+        }
+    }
 }
 
 }  // namespace sh
diff --git a/src/compiler/translator/BuildSPIRV.h b/src/compiler/translator/BuildSPIRV.h
index 4d7bb56..c3be402 100644
--- a/src/compiler/translator/BuildSPIRV.h
+++ b/src/compiler/translator/BuildSPIRV.h
@@ -10,6 +10,8 @@
 #define COMPILER_TRANSLATOR_BUILDSPIRV_H_
 
 #include "common/FixedVector.h"
+#include "common/PackedEnums.h"
+#include "common/bitset_utils.h"
 #include "common/hash_utils.h"
 #include "common/spirv/spirv_instruction_builder_autogen.h"
 #include "compiler/translator/Compiler.h"
@@ -63,6 +65,11 @@
     // Bool is disallowed in interface blocks in SPIR-V.  This type is emulated with uint.  This
     // property applies to both blocks with bools in them and the bool type inside the block itself.
     bool isOrHasBoolInInterfaceBlock = false;
+
+    // When |patch| is specified on an I/O block, the members of the type itself are decorated with
+    // it.  This is not recursively applied, and since each I/O block has a unique type, this
+    // doesn't actually result in duplicated types even if it's specializing the type.
+    bool isPatchIOBlock = false;
 };
 
 struct SpirvType
@@ -139,6 +146,9 @@
         // Row-major block must only affect the type if it's a block type.
         ASSERT(!type.typeSpec.isRowMajorQualifiedBlock || type.block != nullptr);
 
+        // Patch must only affect the type if it's a block type.
+        ASSERT(!type.typeSpec.isPatchIOBlock || type.block != nullptr);
+
         // Row-major array must only affect the type if it's an array of non-square matrices in
         // an std140 or std430 block.
         ASSERT(!type.typeSpec.isRowMajorQualifiedArray ||
@@ -160,7 +170,8 @@
                    static_cast<size_t>(type.typeSpec.isInvariantBlock) ^
                    (static_cast<size_t>(type.typeSpec.isRowMajorQualifiedBlock) << 1) ^
                    (static_cast<size_t>(type.typeSpec.isRowMajorQualifiedArray) << 2) ^
-                   (type.typeSpec.blockStorage << 3);
+                   (static_cast<size_t>(type.typeSpec.isPatchIOBlock) << 3) ^
+                   (type.typeSpec.blockStorage << 4);
         }
 
         static_assert(sh::EbtLast < 256, "Basic type doesn't fit in uint8_t");
@@ -273,37 +284,39 @@
     bool isBreakable = false;
 };
 
+// List of known extensions
+enum class SPIRVExtensions
+{
+    // GL_OVR_multiview / SPV_KHR_multiview
+    MultiviewOVR = 0,
+
+    InvalidEnum = 1,
+    EnumCount   = 1,
+};
+
 // Helper class to construct SPIR-V
 class SPIRVBuilder : angle::NonCopyable
 {
   public:
     SPIRVBuilder(TCompiler *compiler,
                  ShCompileOptions compileOptions,
-                 bool forceHighp,
                  ShHashFunction64 hashFunction,
-                 NameMap &nameMap)
-        : mCompiler(compiler),
-          mCompileOptions(compileOptions),
-          mShaderType(gl::FromGLenum<gl::ShaderType>(compiler->getShaderType())),
-          mDisableRelaxedPrecision(forceHighp),
-          mNextAvailableId(1),
-          mHashFunction(hashFunction),
-          mNameMap(nameMap),
-          mNextUnusedBinding(0),
-          mNextUnusedInputLocation(0),
-          mNextUnusedOutputLocation(0)
-    {}
+                 NameMap &nameMap);
 
     spirv::IdRef getNewId(const SpirvDecorations &decorations);
     SpirvType getSpirvType(const TType &type, const SpirvTypeSpec &typeSpec) const;
     const SpirvTypeData &getTypeData(const TType &type, const SpirvTypeSpec &typeSpec);
+    const SpirvTypeData &getTypeDataOverrideTypeSpec(const TType &type,
+                                                     const SpirvTypeSpec &typeSpec);
     const SpirvTypeData &getSpirvTypeData(const SpirvType &type, const TSymbol *block);
     spirv::IdRef getBasicTypeId(TBasicType basicType, size_t size);
     spirv::IdRef getTypePointerId(spirv::IdRef typeId, spv::StorageClass storageClass);
     spirv::IdRef getFunctionTypeId(spirv::IdRef returnTypeId, const spirv::IdRefList &paramTypeIds);
 
     // Decorations that may apply to intermediate instructions (in addition to variables).
+    // |precise| is only applicable to arithmetic nodes.
     SpirvDecorations getDecorations(const TType &type);
+    SpirvDecorations getArithmeticDecorations(const TType &type, bool isPrecise);
 
     // Extended instructions
     spirv::IdRef getExtInstImportIdStd();
@@ -342,6 +355,8 @@
     bool isInvariantOutput(const TType &type) const;
 
     void addCapability(spv::Capability capability);
+    void addExecutionMode(spv::ExecutionMode executionMode);
+    void addExtension(SPIRVExtensions extension);
     void setEntryPointId(spirv::IdRef id);
     void addEntryPointInterfaceVariableId(spirv::IdRef id);
     void writePerVertexBuiltIns(const TType &type, spirv::IdRef typeId);
@@ -439,16 +454,23 @@
     uint32_t nextUnusedInputLocation(uint32_t consumedCount);
     uint32_t nextUnusedOutputLocation(uint32_t consumedCount);
 
-    void generateExecutionModes(spirv::Blob *blob);
+    void writeExecutionModes(spirv::Blob *blob);
+    void writeExtensions(spirv::Blob *blob);
+    void writeSourceExtensions(spirv::Blob *blob);
 
     ANGLE_MAYBE_UNUSED TCompiler *mCompiler;
     ShCompileOptions mCompileOptions;
     gl::ShaderType mShaderType;
-    const bool mDisableRelaxedPrecision;
 
     // Capabilities the shader is using.  Accumulated as the instructions are generated.  The Shader
     // capability is unconditionally generated, so it's not tracked.
     std::set<spv::Capability> mCapabilities;
+    // Execution modes the shader is using.  Most execution modes are automatically derived from
+    // shader metadata, but some are only discovered while traversing the tree.  Only the latter
+    // execution modes are stored here.
+    angle::BitSet<32> mExecutionModes;
+    // Extensions used by the shader.
+    angle::PackedEnumBitSet<SPIRVExtensions> mExtensions;
 
     // The list of interface variables and the id of main() populated as the instructions are
     // generated.  Used for the OpEntryPoint instruction.
diff --git a/src/compiler/translator/BuiltInFunctionEmulator.cpp b/src/compiler/translator/BuiltInFunctionEmulator.cpp
index 27550fd..34b4336 100644
--- a/src/compiler/translator/BuiltInFunctionEmulator.cpp
+++ b/src/compiler/translator/BuiltInFunctionEmulator.cpp
@@ -6,7 +6,6 @@
 
 #include "compiler/translator/BuiltInFunctionEmulator.h"
 #include "angle_gl.h"
-#include "compiler/translator/StaticType.h"
 #include "compiler/translator/Symbol.h"
 #include "compiler/translator/tree_util/IntermTraverse.h"
 
diff --git a/src/compiler/translator/BuiltinsWorkaroundGLSL.cpp b/src/compiler/translator/BuiltinsWorkaroundGLSL.cpp
index 7dff53d..6928903 100644
--- a/src/compiler/translator/BuiltinsWorkaroundGLSL.cpp
+++ b/src/compiler/translator/BuiltinsWorkaroundGLSL.cpp
@@ -7,7 +7,6 @@
 #include "compiler/translator/BuiltinsWorkaroundGLSL.h"
 
 #include "angle_gl.h"
-#include "compiler/translator/StaticType.h"
 #include "compiler/translator/Symbol.h"
 #include "compiler/translator/SymbolTable.h"
 #include "compiler/translator/tree_util/BuiltIn.h"
diff --git a/src/compiler/translator/CollectVariables.cpp b/src/compiler/translator/CollectVariables.cpp
index eeae3e2..f8d29d9 100644
--- a/src/compiler/translator/CollectVariables.cpp
+++ b/src/compiler/translator/CollectVariables.cpp
@@ -210,7 +210,6 @@
     bool mLastFragDataAdded;
     bool mFragColorAdded;
     bool mFragDataAdded;
-    bool mFragDepthEXTAdded;
     bool mFragDepthAdded;
     bool mSecondaryFragColorEXTAdded;
     bool mSecondaryFragDataEXTAdded;
@@ -238,6 +237,7 @@
     bool mPatchVerticesInAdded;
     bool mTessLevelOuterAdded;
     bool mTessLevelInnerAdded;
+    bool mBoundingBoxEXTAdded;
     bool mTessCoordAdded;
     const int mTessControlShaderOutputVertices;
 
@@ -293,7 +293,6 @@
       mLastFragDataAdded(false),
       mFragColorAdded(false),
       mFragDataAdded(false),
-      mFragDepthEXTAdded(false),
       mFragDepthAdded(false),
       mSecondaryFragColorEXTAdded(false),
       mSecondaryFragDataEXTAdded(false),
@@ -311,6 +310,7 @@
       mPatchVerticesInAdded(false),
       mTessLevelOuterAdded(false),
       mTessLevelInnerAdded(false),
+      mBoundingBoxEXTAdded(false),
       mTessCoordAdded(false),
       mTessControlShaderOutputVertices(tessControlShaderOutputVertices),
       mHashFunction(hashFunction),
@@ -334,8 +334,9 @@
 
     bool isShaderIOBlock =
         IsShaderIoBlock(type.getQualifier()) && type.getInterfaceBlock() != nullptr;
-    bool isPatch =
-        type.getQualifier() == EvqTessLevelInner || type.getQualifier() == EvqTessLevelOuter;
+    bool isPatch = type.getQualifier() == EvqTessLevelInner ||
+                   type.getQualifier() == EvqTessLevelOuter ||
+                   type.getQualifier() == EvqBoundingBoxEXT;
 
     setFieldOrVariableProperties(type, true, isShaderIOBlock, isPatch, info);
 }
@@ -508,29 +509,6 @@
             mNumSamplesAdded = true;
         }
     }
-    else if (symbolName == "gl_LastFragData" && qualifier == EvqGlobal)
-    {
-        // If gl_LastFragData is redeclared, the qualifier of redeclaration is EvqGlobal, and it
-        // makes "gl_LastFragData" can't be collected in this function. That's because
-        // "gl_LastFragData" is redeclared like below. E.g., "highp vec4
-        // gl_LastFragData[gl_MaxDrawBuffers];" So, if gl_LastFragData can be parsed with a correct
-        // qualifier in PasreContext.cpp, this code isn't needed.
-        if (!mLastFragDataAdded)
-        {
-            ShaderVariable info;
-
-            const TType &type = symbol->getType();
-
-            info.name       = symbolName.data();
-            info.mappedName = symbolName.data();
-            setFieldOrVariableProperties(type, true, false, false, &info);
-            info.active = true;
-
-            mInputVaryings->push_back(info);
-            mLastFragDataAdded = true;
-        }
-        return;
-    }
     else
     {
         switch (qualifier)
@@ -555,7 +533,7 @@
                 }
 
                 // It's an internal error to reference an undefined user uniform
-                ASSERT(!symbolName.beginsWith("gl_") || var);
+                ASSERT(!gl::IsBuiltInName(symbolName.data()) || var);
             }
             break;
             case EvqBuffer:
@@ -632,9 +610,6 @@
                     mFragDataAdded = true;
                 }
                 return;
-            case EvqFragDepthEXT:
-                recordBuiltInFragmentOutputUsed(symbol->variable(), &mFragDepthEXTAdded);
-                return;
             case EvqFragDepth:
                 recordBuiltInFragmentOutputUsed(symbol->variable(), &mFragDepthAdded);
                 return;
@@ -689,7 +664,14 @@
                 }
                 break;
             case EvqClipDistance:
-                recordBuiltInVaryingUsed(symbol->variable(), &mClipDistanceAdded, mOutputVaryings);
+                recordBuiltInVaryingUsed(
+                    symbol->variable(), &mClipDistanceAdded,
+                    mShaderType == GL_FRAGMENT_SHADER ? mInputVaryings : mOutputVaryings);
+                return;
+            case EvqCullDistance:
+                recordBuiltInVaryingUsed(
+                    symbol->variable(), &mCullDistanceAdded,
+                    mShaderType == GL_FRAGMENT_SHADER ? mInputVaryings : mOutputVaryings);
                 return;
             case EvqSampleID:
                 recordBuiltInVaryingUsed(symbol->variable(), &mSampleIDAdded, mInputVaryings);
@@ -703,9 +685,6 @@
             case EvqSampleMask:
                 recordBuiltInFragmentOutputUsed(symbol->variable(), &mSampleMaskAdded);
                 return;
-            case EvqCullDistance:
-                recordBuiltInVaryingUsed(symbol->variable(), &mCullDistanceAdded, mOutputVaryings);
-                return;
             case EvqPatchVerticesIn:
                 recordBuiltInVaryingUsed(symbol->variable(), &mPatchVerticesInAdded,
                                          mInputVaryings);
@@ -739,6 +718,10 @@
                                              mInputVaryings);
                 }
                 break;
+            case EvqBoundingBoxEXT:
+                recordBuiltInVaryingUsed(symbol->variable(), &mBoundingBoxEXTAdded,
+                                         mOutputVaryings);
+                break;
             default:
                 break;
         }
diff --git a/src/compiler/translator/Compiler.cpp b/src/compiler/translator/Compiler.cpp
index 1a43857..7333166 100644
--- a/src/compiler/translator/Compiler.cpp
+++ b/src/compiler/translator/Compiler.cpp
@@ -30,7 +30,6 @@
 #include "compiler/translator/tree_ops/DeferGlobalInitializers.h"
 #include "compiler/translator/tree_ops/EmulateGLFragColorBroadcast.h"
 #include "compiler/translator/tree_ops/EmulateMultiDrawShaderBuiltins.h"
-#include "compiler/translator/tree_ops/EmulatePrecision.h"
 #include "compiler/translator/tree_ops/FoldExpressions.h"
 #include "compiler/translator/tree_ops/ForcePrecisionQualifier.h"
 #include "compiler/translator/tree_ops/InitializeVariables.h"
@@ -44,14 +43,13 @@
 #include "compiler/translator/tree_ops/SeparateDeclarations.h"
 #include "compiler/translator/tree_ops/SimplifyLoopConditions.h"
 #include "compiler/translator/tree_ops/SplitSequenceOperator.h"
+#include "compiler/translator/tree_ops/apple/AddAndTrueToLoopCondition.h"
+#include "compiler/translator/tree_ops/apple/RewriteDoWhile.h"
+#include "compiler/translator/tree_ops/apple/UnfoldShortCircuitAST.h"
 #include "compiler/translator/tree_ops/gl/ClampFragDepth.h"
 #include "compiler/translator/tree_ops/gl/RegenerateStructNames.h"
 #include "compiler/translator/tree_ops/gl/RewriteRepeatedAssignToSwizzled.h"
 #include "compiler/translator/tree_ops/gl/UseInterfaceBlockFields.h"
-#include "compiler/translator/tree_ops/gl/VectorizeVectorScalarArithmetic.h"
-#include "compiler/translator/tree_ops/gl/mac/AddAndTrueToLoopCondition.h"
-#include "compiler/translator/tree_ops/gl/mac/RewriteDoWhile.h"
-#include "compiler/translator/tree_ops/gl/mac/UnfoldShortCircuitAST.h"
 #include "compiler/translator/tree_ops/vulkan/EarlyFragmentTestsOptimization.h"
 #include "compiler/translator/tree_util/BuiltIn.h"
 #include "compiler/translator/tree_util/IntermNodePatternMatcher.h"
@@ -311,11 +309,18 @@
       mTessEvaluationShaderInputVertexSpacingType(EtetUndefined),
       mTessEvaluationShaderInputOrderingType(EtetUndefined),
       mTessEvaluationShaderInputPointType(EtetUndefined),
+      mHasAnyPreciseType(false),
       mCompileOptions(0)
 {}
 
 TCompiler::~TCompiler() {}
 
+bool TCompiler::isHighPrecisionSupported() const
+{
+    return mShaderVersion > 100 || mShaderType != GL_FRAGMENT_SHADER ||
+           mResources.FragmentPrecisionHigh == 1;
+}
+
 bool TCompiler::shouldRunLoopAndIndexingValidation(ShCompileOptions compileOptions) const
 {
     // If compiling an ESSL 1.00 shader for WebGL, or if its been requested through the API,
@@ -516,6 +521,8 @@
 
     mNumViews = parseContext.getNumViews();
 
+    mHasAnyPreciseType = parseContext.hasAnyPreciseType();
+
     if (mShaderType == GL_GEOMETRY_SHADER_EXT)
     {
         mGeometryShaderInputPrimitiveType  = parseContext.getGeometryShaderInputPrimitiveType();
@@ -559,6 +566,7 @@
 #if defined(ANGLE_ENABLE_ASSERTS)
         if (!valid)
         {
+            OutputTree(root, mInfoSink.info);
             fprintf(stderr, "AST validation error(s):\n%s\n", mInfoSink.info.c_str());
         }
 #endif
@@ -571,11 +579,46 @@
     return true;
 }
 
+bool TCompiler::disableValidateFunctionCall()
+{
+    bool wasEnabled                          = mValidateASTOptions.validateFunctionCall;
+    mValidateASTOptions.validateFunctionCall = false;
+    return wasEnabled;
+}
+
+void TCompiler::restoreValidateFunctionCall(bool enable)
+{
+    ASSERT(!mValidateASTOptions.validateFunctionCall);
+    mValidateASTOptions.validateFunctionCall = enable;
+}
+
+bool TCompiler::disableValidateVariableReferences()
+{
+    bool wasEnabled                                = mValidateASTOptions.validateVariableReferences;
+    mValidateASTOptions.validateVariableReferences = false;
+    return wasEnabled;
+}
+
+void TCompiler::restoreValidateVariableReferences(bool enable)
+{
+    ASSERT(!mValidateASTOptions.validateVariableReferences);
+    mValidateASTOptions.validateVariableReferences = enable;
+}
+
+void TCompiler::enableValidateNoMoreTransformations()
+{
+    mValidateASTOptions.validateNoMoreTransformations = true;
+}
+
 bool TCompiler::checkAndSimplifyAST(TIntermBlock *root,
                                     const TParseContext &parseContext,
                                     ShCompileOptions compileOptions)
 {
     mValidateASTOptions = {};
+
+    // Desktop GLSL shaders don't have precision, so don't expect them to be specified.
+    mValidateASTOptions.validatePrecision = !IsDesktopGLSpec(mShaderSpec);
+
     if (!validateAST(root))
     {
         return false;
@@ -636,13 +679,27 @@
                                       !IsOutputHLSL(getOutputType());
     bool canUseLoopsToInitialize =
         (compileOptions & SH_DONT_USE_LOOPS_TO_INITIALIZE_VARIABLES) == 0;
-    bool highPrecisionSupported = mShaderVersion > 100 || mShaderType != GL_FRAGMENT_SHADER ||
-                                  mResources.FragmentPrecisionHigh == 1;
+    bool highPrecisionSupported        = isHighPrecisionSupported();
     bool enableNonConstantInitializers = IsExtensionEnabled(
         mExtensionBehavior, TExtension::EXT_shader_non_constant_global_initializers);
+    // forceDeferGlobalInitializers is needed for MSL
+    // to convert a non-const global. For example:
+    //
+    //    int someGlobal = 123;
+    //
+    // to
+    //
+    //    int someGlobal;
+    //    void main() {
+    //        someGlobal = 123;
+    //
+    // This is because MSL doesn't allow statically initialized globals.
+    bool forceDeferGlobalInitializers = getOutputType() == SH_MSL_METAL_OUTPUT;
+
     if (enableNonConstantInitializers &&
         !DeferGlobalInitializers(this, root, initializeLocalsAndGlobals, canUseLoopsToInitialize,
-                                 highPrecisionSupported, &mSymbolTable))
+                                 highPrecisionSupported, forceDeferGlobalInitializers,
+                                 &mSymbolTable))
     {
         return false;
     }
@@ -686,14 +743,6 @@
         return false;
     }
 
-    // Fail compilation if precision emulation not supported.
-    if (getResources().WEBGL_debug_shader_precision && getPragma().debugShaderPrecision &&
-        !EmulatePrecision::SupportedInLanguage(mOutputType))
-    {
-        mDiagnostics.globalError("Precision emulation not supported for this output type.");
-        return false;
-    }
-
     if (parseContext.isExtensionEnabled(TExtension::EXT_clip_cull_distance))
     {
         if (!ValidateClipCullDistance(root, &mDiagnostics,
@@ -813,7 +862,7 @@
 
     // Note that separate declarations need to be run before other AST transformations that
     // generate new statements from expressions.
-    if (!SeparateDeclarations(this, root))
+    if (!SeparateDeclarations(this, root, &getSymbolTable()))
     {
         return false;
     }
@@ -856,8 +905,7 @@
 
     if ((compileOptions & SH_SCALARIZE_VEC_AND_MAT_CONSTRUCTOR_ARGS) != 0)
     {
-        if (!ScalarizeVecAndMatConstructorArgs(this, root, mShaderType, highPrecisionSupported,
-                                               &mSymbolTable))
+        if (!ScalarizeVecAndMatConstructorArgs(this, root, &mSymbolTable))
         {
             return false;
         }
@@ -945,7 +993,8 @@
     // be optimized out
     if (!enableNonConstantInitializers &&
         !DeferGlobalInitializers(this, root, initializeLocalsAndGlobals, canUseLoopsToInitialize,
-                                 highPrecisionSupported, &mSymbolTable))
+                                 highPrecisionSupported, forceDeferGlobalInitializers,
+                                 &mSymbolTable))
     {
         return false;
     }
@@ -1002,14 +1051,6 @@
         }
     }
 
-    if ((compileOptions & SH_REWRITE_VECTOR_SCALAR_ARITHMETIC) != 0)
-    {
-        if (!VectorizeVectorScalarArithmetic(this, root, &getSymbolTable()))
-        {
-            return false;
-        }
-    }
-
     if ((compileOptions & SH_REMOVE_DYNAMIC_INDEXING_OF_SWIZZLED_VECTOR) != 0)
     {
         if (!sh::RemoveDynamicIndexingOfSwizzledVector(this, root, &getSymbolTable(), nullptr))
@@ -1153,6 +1194,7 @@
         << ":MaxFunctionParameters:" << mResources.MaxFunctionParameters
         << ":EXT_blend_func_extended:" << mResources.EXT_blend_func_extended
         << ":EXT_frag_depth:" << mResources.EXT_frag_depth
+        << ":EXT_primitive_bounding_box:" << mResources.EXT_primitive_bounding_box
         << ":EXT_shader_texture_lod:" << mResources.EXT_shader_texture_lod
         << ":EXT_shader_framebuffer_fetch:" << mResources.EXT_shader_framebuffer_fetch
         << ":EXT_shader_framebuffer_fetch_non_coherent:" << mResources.EXT_shader_framebuffer_fetch_non_coherent
@@ -1174,7 +1216,6 @@
         << ":MaxDualSourceDrawBuffers:" << mResources.MaxDualSourceDrawBuffers
         << ":MaxViewsOVR:" << mResources.MaxViewsOVR
         << ":NV_draw_buffers:" << mResources.NV_draw_buffers
-        << ":WEBGL_debug_shader_precision:" << mResources.WEBGL_debug_shader_precision
         << ":ANGLE_multi_draw:" << mResources.ANGLE_multi_draw
         << ":ANGLE_base_vertex_base_instance:" << mResources.ANGLE_base_vertex_base_instance
         << ":APPLE_clip_distance:" << mResources.APPLE_clip_distance
@@ -1262,26 +1303,6 @@
                             mShaderStorageBlocks.end());
 }
 
-bool TCompiler::emulatePrecisionIfNeeded(TIntermBlock *root,
-                                         TInfoSinkBase &sink,
-                                         bool *isNeeded,
-                                         const ShShaderOutput outputLanguage)
-{
-    *isNeeded = getResources().WEBGL_debug_shader_precision && getPragma().debugShaderPrecision;
-
-    if (*isNeeded)
-    {
-        EmulatePrecision emulatePrecision(&getSymbolTable());
-        root->traverse(&emulatePrecision);
-        if (!emulatePrecision.updateTree(this, root))
-        {
-            return false;
-        }
-        emulatePrecision.writeEmulationHelpers(sink, getShaderVersion(), outputLanguage);
-    }
-    return true;
-}
-
 void TCompiler::clearResults()
 {
     mInfoSink.info.erase();
diff --git a/src/compiler/translator/Compiler.h b/src/compiler/translator/Compiler.h
index 5802db5..e3082c8 100644
--- a/src/compiler/translator/Compiler.h
+++ b/src/compiler/translator/Compiler.h
@@ -136,6 +136,8 @@
     ShShaderOutput getOutputType() const { return mOutputType; }
     const std::string &getBuiltInResourcesString() const { return mBuiltInResourcesString; }
 
+    bool isHighPrecisionSupported() const;
+
     bool shouldRunLoopAndIndexingValidation(ShCompileOptions compileOptions) const;
     bool shouldLimitTypeSizes() const;
 
@@ -175,11 +177,23 @@
         return mTessEvaluationShaderInputPointType;
     }
 
+    bool hasAnyPreciseType() const { return mHasAnyPreciseType; }
+
     unsigned int getSharedMemorySize() const;
 
     sh::GLenum getShaderType() const { return mShaderType; }
 
+    // Validate the AST and produce errors if it is inconsistent.
     bool validateAST(TIntermNode *root);
+    // Some transformations may need to temporarily disable validation until they are complete.  A
+    // set of disable/enable helpers are used for this purpose.
+    bool disableValidateFunctionCall();
+    void restoreValidateFunctionCall(bool enable);
+    bool disableValidateVariableReferences();
+    void restoreValidateVariableReferences(bool enable);
+    // When the AST is post-processed (such as to determine precise-ness of intermediate nodes),
+    // it's expected to no longer transform.
+    void enableValidateNoMoreTransformations();
 
   protected:
     // Add emulated functions to the built-in function emulator.
@@ -200,12 +214,6 @@
 
     virtual bool shouldFlattenPragmaStdglInvariantAll() = 0;
     virtual bool shouldCollectVariables(ShCompileOptions compileOptions);
-    // If precision emulation needed, set isNeeded to true and emulate precision for given
-    //  outputLanguage, returning false if that fails, else returning true.
-    bool emulatePrecisionIfNeeded(TIntermBlock *root,
-                                  TInfoSinkBase &sink,
-                                  bool *isNeeded,
-                                  const ShShaderOutput outputLanguage);
 
     bool wereVariablesCollected() const;
     std::vector<sh::ShaderVariable> mAttributes;
@@ -331,6 +339,8 @@
     TLayoutTessEvaluationType mTessEvaluationShaderInputOrderingType;
     TLayoutTessEvaluationType mTessEvaluationShaderInputPointType;
 
+    bool mHasAnyPreciseType;
+
     // name hashing.
     NameMap mNameMap;
 
diff --git a/src/compiler/translator/DirectiveHandler.cpp b/src/compiler/translator/DirectiveHandler.cpp
index a3a6f63..e716a35 100644
--- a/src/compiler/translator/DirectiveHandler.cpp
+++ b/src/compiler/translator/DirectiveHandler.cpp
@@ -37,13 +37,11 @@
 TDirectiveHandler::TDirectiveHandler(TExtensionBehavior &extBehavior,
                                      TDiagnostics &diagnostics,
                                      int &shaderVersion,
-                                     sh::GLenum shaderType,
-                                     bool debugShaderPrecisionSupported)
+                                     sh::GLenum shaderType)
     : mExtensionBehavior(extBehavior),
       mDiagnostics(diagnostics),
       mShaderVersion(shaderVersion),
-      mShaderType(shaderType),
-      mDebugShaderPrecisionSupported(debugShaderPrecisionSupported)
+      mShaderType(shaderType)
 {}
 
 TDirectiveHandler::~TDirectiveHandler() {}
@@ -81,11 +79,10 @@
     }
     else
     {
-        const char kOptimize[]             = "optimize";
-        const char kDebug[]                = "debug";
-        const char kDebugShaderPrecision[] = "webgl_debug_shader_precision";
-        const char kOn[]                   = "on";
-        const char kOff[]                  = "off";
+        const char kOptimize[] = "optimize";
+        const char kDebug[]    = "debug";
+        const char kOn[]       = "on";
+        const char kOff[]      = "off";
 
         bool invalidValue = false;
         if (name == kOptimize)
@@ -106,15 +103,6 @@
             else
                 invalidValue = true;
         }
-        else if (name == kDebugShaderPrecision && mDebugShaderPrecisionSupported)
-        {
-            if (value == kOn)
-                mPragma.debugShaderPrecision = true;
-            else if (value == kOff)
-                mPragma.debugShaderPrecision = false;
-            else
-                invalidValue = true;
-        }
         else
         {
             mDiagnostics.report(angle::pp::Diagnostics::PP_UNRECOGNIZED_PRAGMA, loc, name);
diff --git a/src/compiler/translator/DirectiveHandler.h b/src/compiler/translator/DirectiveHandler.h
index 289e436..6fb5455 100644
--- a/src/compiler/translator/DirectiveHandler.h
+++ b/src/compiler/translator/DirectiveHandler.h
@@ -23,8 +23,7 @@
     TDirectiveHandler(TExtensionBehavior &extBehavior,
                       TDiagnostics &diagnostics,
                       int &shaderVersion,
-                      sh::GLenum shaderType,
-                      bool debugShaderPrecisionSupported);
+                      sh::GLenum shaderType);
     ~TDirectiveHandler() override;
 
     const TPragma &pragma() const { return mPragma; }
@@ -51,7 +50,6 @@
     TDiagnostics &mDiagnostics;
     int &mShaderVersion;
     sh::GLenum mShaderType;
-    bool mDebugShaderPrecisionSupported;
 };
 
 }  // namespace sh
diff --git a/src/compiler/translator/ExtensionBehavior.cpp b/src/compiler/translator/ExtensionBehavior.cpp
index 45fc662..4089aaa 100644
--- a/src/compiler/translator/ExtensionBehavior.cpp
+++ b/src/compiler/translator/ExtensionBehavior.cpp
@@ -28,6 +28,7 @@
     OP(OES_shader_io_blocks)                        \
     OP(EXT_shader_io_blocks)                        \
     OP(EXT_gpu_shader5)                             \
+    OP(EXT_primitive_bounding_box)                  \
     OP(EXT_shader_framebuffer_fetch)                \
     OP(EXT_shader_framebuffer_fetch_non_coherent)   \
     OP(EXT_shader_non_constant_global_initializers) \
diff --git a/src/compiler/translator/ExtensionBehavior.h b/src/compiler/translator/ExtensionBehavior.h
index 614cc37..2b2ad82 100644
--- a/src/compiler/translator/ExtensionBehavior.h
+++ b/src/compiler/translator/ExtensionBehavior.h
@@ -34,6 +34,7 @@
     OES_shader_io_blocks,
     EXT_shader_io_blocks,
     EXT_gpu_shader5,
+    EXT_primitive_bounding_box,
     EXT_shader_framebuffer_fetch,
     EXT_shader_framebuffer_fetch_non_coherent,
     EXT_shader_non_constant_global_initializers,
diff --git a/src/compiler/translator/HashNames.cpp b/src/compiler/translator/HashNames.cpp
index d57ec6b..fc188ff 100644
--- a/src/compiler/translator/HashNames.cpp
+++ b/src/compiler/translator/HashNames.cpp
@@ -69,37 +69,6 @@
             // have as long names and could conflict.
             return name;
         }
-        if (name == "gl_ClipDistance" || name == "gl_CullDistance" || name == "gl_LastFragData")
-        {
-            // NOTE(hqle): When gl_ClipDistance is re-declared, it will become an UserDefined
-            // symbol. Normally, UserDefined symbols will have "_u" prefix added to their names by
-            // ANGLE. However, gl_ClipDistance is an exception. If we add "_u" to its name, the
-            // backend won't be able to handle it properly. So for gl_ClipDistance, we won't add
-            // "_u" prefix, instead we return it original name.
-            //
-            // The other way is treating gl_ClipDistance as an AngleInternal symbol when a
-            // re-declaration occurs. AngleInternal symbols will have their name intact. However,
-            // the issue is that the current code put a lot of restrictions on AngleInternal
-            // symbols. For examples:
-            //  - CollectVariables.cpp will not consider AngleInternal as varying output variables.
-            //  - SymbolTable.cpp will throw an exception if AngleInternal symbols are declared by
-            //  users. In this case, it would be gl_ClipDistance. This is because
-            //  TSymbolTable::declare() only accepts an UserDefined symbol.
-            //  - And potentially many other places that have some assumptions that haven't been
-            //  discovered yet.
-            //
-            // If re-declared gl_ClipDistance was to be an AngleInternal symbol, a special "if (name
-            // == "gl_ClipDistance")" handling would have to be put into all the above mentioned
-            // cases. TParseContext::declareVariable() function would also have to be modified in
-            // order to assign AngleInternal symbol type to the re-declared gl_ClipDistance
-            // variable.
-            // Compare to only this place has to be handled if re-declared gl_ClipDistance is
-            // treated as an UserDefined symbol.
-            //
-            // Also, gl_LastFragData should be added.
-            //
-            return name;
-        }
         ImmutableStringBuilder prefixedName(kUnhashedNamePrefix.length() + name.length());
         prefixedName << kUnhashedNamePrefix << name;
         ImmutableString res = prefixedName;
diff --git a/src/compiler/translator/ImmutableString_ESSL_autogen.cpp b/src/compiler/translator/ImmutableString_ESSL_autogen.cpp
index 128d1ea..37d20a3 100644
--- a/src/compiler/translator/ImmutableString_ESSL_autogen.cpp
+++ b/src/compiler/translator/ImmutableString_ESSL_autogen.cpp
@@ -24,206 +24,198 @@
 namespace
 {
 
-constexpr int mangledkT1[] = {2945, 2683, 2770, 846,  391,  1674, 1234, 2709, 1724, 861,
-                              2597, 1086, 529,  604,  2702, 832,  1136, 208,  1157, 2304,
-                              1681, 2044, 1506, 2963, 1139, 2408, 670,  2371, 2597, 646,
-                              2268, 1625, 2720, 1706, 616,  2530, 2900, 2210, 2240, 2351};
-constexpr int mangledkT2[] = {113,  977,  384,  111,  2361, 1452, 1892, 2449, 771,  1341,
-                              46,   2394, 1170, 2798, 253,  1063, 312,  2391, 340,  1539,
-                              2210, 2423, 2955, 2877, 420,  2348, 1259, 2836, 33,   2167,
-                              970,  1742, 686,  486,  2352, 1814, 1442, 3024, 2595, 1244};
+constexpr int mangledkT1[] = {1527, 1943, 1880, 1243, 1509, 140,  1696, 103,  163,  2049,
+                              1333, 2689, 1246, 626,  562,  1634, 2548, 2195, 2149, 59,
+                              1179, 654,  587,  174,  1528, 1042, 266,  457,  140,  864,
+                              520,  913,  1647, 598,  1669, 154,  2071, 580,  1372, 2809};
+constexpr int mangledkT2[] = {890,  2242, 2689, 2094, 2746, 538,  1689, 1610, 625,  1617,
+                              2764, 775,  612,  2458, 797,  438,  1122, 1941, 1673, 2635,
+                              976,  2649, 2701, 1532, 1267, 49,   1285, 2806, 237,  342,
+                              1105, 2537, 2291, 870,  693,  1953, 6,    1401, 1788, 1352};
 constexpr int mangledkG[]  = {
-    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-    0,    0,    0,    0,    0,    0,    2031, 0,    0,    2399, 0,    0,    0,    0,    0,    1578,
-    0,    0,    0,    0,    2822, 0,    0,    0,    0,    0,    805,  941,  0,    0,    0,    0,
-    0,    0,    0,    2436, 480,  0,    1248, 0,    0,    0,    0,    657,  0,    0,    0,    0,
-    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    1755,
-    1756, 0,    491,  0,    0,    2602, 0,    0,    0,    0,    1895, 0,    0,    254,  0,    301,
-    1393, 0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    2136, 0,    511,  2570, 0,
-    92,   0,    0,    1618, 0,    0,    0,    0,    0,    0,    1510, 0,    0,    0,    1121, 0,
-    911,  0,    0,    0,    0,    0,    0,    2636, 0,    0,    0,    0,    0,    714,  0,    0,
-    625,  0,    0,    778,  0,    0,    0,    957,  0,    0,    0,    2193, 0,    2686, 0,    0,
-    0,    1011, 0,    0,    1062, 0,    0,    0,    0,    1456, 2402, 0,    0,    0,    0,    0,
-    0,    628,  0,    0,    0,    0,    0,    1297, 0,    0,    0,    0,    0,    1265, 0,    0,
-    158,  0,    0,    0,    0,    0,    225,  0,    0,    2221, 0,    0,    2676, 2773, 523,  0,
-    0,    0,    0,    0,    477,  1322, 1194, 0,    0,    0,    0,    993,  0,    0,    0,    0,
-    0,    0,    0,    56,   0,    1165, 0,    294,  0,    0,    0,    901,  0,    0,    0,    0,
-    2057, 0,    0,    125,  0,    0,    0,    0,    0,    0,    0,    0,    0,    1809, 0,    0,
-    0,    118,  236,  1269, 0,    0,    1933, 0,    123,  0,    0,    0,    1266, 2037, 0,    1807,
-    0,    2748, 0,    0,    609,  0,    0,    0,    0,    0,    0,    0,    659,  0,    0,    0,
-    0,    0,    0,    0,    216,  0,    0,    0,    388,  0,    0,    2231, 0,    461,  0,    0,
-    0,    0,    0,    0,    0,    0,    2944, 0,    1250, 0,    2904, 0,    0,    0,    331,  508,
-    0,    1496, 0,    0,    1621, 0,    0,    0,    0,    961,  0,    0,    783,  2515, 1474, 2001,
-    0,    0,    57,   0,    1084, 0,    0,    0,    0,    0,    0,    0,    0,    0,    2685, 0,
-    0,    113,  0,    0,    0,    2626, 0,    1318, 0,    491,  96,   0,    0,    0,    0,    2323,
-    0,    0,    0,    0,    2266, 1217, 0,    0,    0,    34,   0,    719,  0,    0,    2426, 0,
-    1270, 0,    0,    2730, 2483, 2269, 247,  746,  27,   0,    0,    0,    1110, 0,    0,    2069,
-    490,  0,    0,    0,    0,    0,    0,    0,    2245, 1178, 0,    0,    0,    0,    0,    0,
-    2386, 2805, 86,   0,    0,    1572, 410,  823,  0,    0,    962,  0,    0,    0,    888,  2881,
-    0,    1140, 0,    0,    0,    0,    0,    0,    0,    0,    1203, 174,  0,    0,    0,    0,
-    612,  0,    0,    0,    195,  0,    0,    475,  0,    0,    0,    0,    0,    2402, 2484, 0,
-    0,    0,    0,    0,    0,    0,    393,  2711, 0,    0,    0,    657,  0,    0,    0,    0,
-    684,  0,    0,    0,    0,    0,    0,    160,  0,    0,    0,    1753, 0,    385,  0,    0,
-    361,  1626, 0,    0,    2301, 0,    1717, 0,    0,    0,    0,    1195, 626,  0,    0,    520,
-    3006, 0,    0,    1216, 0,    321,  351,  23,   0,    0,    0,    0,    0,    1007, 0,    0,
-    2874, 2764, 0,    0,    0,    758,  16,   0,    0,    0,    1500, 0,    0,    0,    0,    0,
-    0,    0,    584,  1919, 2200, 550,  0,    2583, 630,  0,    0,    0,    0,    2027, 0,    2682,
-    0,    1186, 469,  0,    0,    0,    0,    2304, 713,  0,    0,    0,    0,    0,    0,    430,
-    0,    2752, 1644, 1539, 640,  513,  0,    0,    1592, 0,    2933, 104,  687,  2303, 703,  0,
-    1415, 0,    0,    154,  914,  669,  0,    886,  1744, 0,    537,  1147, 0,    859,  0,    0,
-    0,    0,    0,    0,    1151, 541,  0,    2918, 760,  1829, 1275, 1291, 0,    0,    0,    0,
-    2118, 0,    2486, 0,    0,    206,  186,  0,    0,    0,    0,    2178, 0,    0,    0,    2020,
-    0,    0,    0,    0,    2078, 0,    1860, 0,    1374, 0,    2975, 1552, 2133, 1602, 1398, 0,
-    0,    0,    699,  0,    2783, 0,    0,    803,  0,    211,  664,  0,    0,    216,  0,    0,
-    0,    0,    378,  0,    0,    1110, 0,    1345, 2991, 0,    0,    599,  0,    866,  803,  438,
-    0,    326,  432,  0,    0,    265,  0,    0,    0,    1448, 0,    1814, 0,    1088, 474,  0,
-    3052, 0,    1960, 0,    1240, 0,    0,    314,  1324, 0,    0,    1359, 390,  356,  0,    2153,
-    183,  2987, 0,    218,  2022, 0,    0,    0,    1574, 787,  0,    0,    0,    0,    0,    503,
-    983,  612,  0,    0,    422,  33,   2749, 959,  2692, 0,    0,    0,    1421, 0,    2784, 52,
-    2147, 0,    457,  0,    467,  0,    368,  512,  2458, 0,    0,    1639, 0,    0,    0,    2576,
-    0,    0,    525,  0,    0,    0,    2957, 0,    0,    1247, 2801, 11,   2678, 0,    0,    0,
-    1549, 0,    0,    2462, 428,  0,    0,    1184, 2278, 0,    444,  0,    0,    0,    3041, 717,
-    0,    2122, 1853, 1564, 0,    0,    0,    2355, 2702, 71,   0,    398,  1150, 1835, 114,  0,
-    2663, 2881, 2231, 0,    844,  0,    413,  0,    0,    0,    0,    0,    0,    0,    1134, 1001,
-    0,    0,    0,    0,    0,    0,    0,    1056, 2826, 732,  1221, 1208, 0,    2605, 0,    0,
-    130,  0,    1691, 736,  0,    1935, 1878, 2187, 0,    1927, 0,    0,    276,  0,    2750, 272,
-    0,    0,    2696, 0,    23,   0,    0,    643,  0,    2886, 0,    1820, 0,    509,  588,  0,
-    1549, 670,  0,    0,    1559, 699,  0,    2431, 0,    1675, 731,  0,    0,    0,    2860, 0,
-    0,    0,    0,    0,    2987, 2264, 1359, 0,    0,    78,   0,    0,    0,    469,  639,  2634,
-    3050, 0,    259,  802,  592,  1413, 313,  0,    0,    0,    0,    1146, 0,    0,    432,  183,
-    0,    2119, 0,    0,    244,  2253, 2172, 1417, 0,    0,    1745, 0,    92,   0,    0,    130,
-    1273, 1330, 0,    1678, 0,    0,    449,  2320, 2011, 0,    2830, 0,    2076, 2234, 0,    0,
-    0,    50,   387,  0,    1099, 0,    1188, 0,    0,    0,    0,    130,  0,    716,  187,  0,
-    2769, 187,  395,  0,    0,    925,  1280, 0,    0,    906,  0,    615,  1267, 0,    1026, 0,
-    0,    0,    0,    0,    0,    2063, 2206, 899,  0,    1618, 0,    316,  0,    1088, 0,    2899,
-    2937, 0,    264,  0,    0,    1508, 116,  0,    2426, 0,    99,   0,    0,    2013, 2075, 0,
-    0,    2149, 1755, 1427, 191,  1262, 246,  0,    645,  865,  0,    1586, 1436, 2555, 0,    2405,
-    559,  652,  140,  0,    351,  0,    0,    2923, 251,  840,  0,    875,  89,   0,    1961, 850,
-    0,    0,    0,    0,    2872, 234,  0,    1674, 2171, 0,    0,    1292, 2186, 947,  118,  0,
-    1004, 0,    302,  1313, 0,    809,  2557, 1034, 2674, 2630, 0,    861,  0,    2111, 543,  2748,
-    2403, 2529, 848,  0,    285,  0,    961,  0,    510,  902,  235,  0,    0,    0,    1479, 0,
-    2994, 2236, 2363, 362,  0,    965,  0,    0,    0,    2298, 490,  459,  0,    2889, 0,    0,
-    0,    0,    1809, 0,    0,    1333, 0,    1778, 255,  0,    0,    449,  0,    1497, 0,    1543,
-    953,  1029, 0,    1408, 0,    2330, 0,    0,    0,    0,    1986, 0,    0,    884,  2692, 2514,
-    2832, 0,    2619, 613,  0,    1136, 0,    0,    1061, 1493, 1677, 0,    0,    0,    161,  32,
-    0,    3021, 638,  1384, 0,    0,    976,  1426, 0,    0,    502,  1462, 0,    2197, 0,    0,
-    1117, 0,    0,    2753, 2069, 0,    2715, 2308, 2008, 0,    474,  54,   27,   1195, 583,  2325,
-    231,  0,    0,    1978, 0,    0,    1716, 2344, 1264, 0,    218,  0,    2932, 2885, 0,    389,
-    2814, 0,    778,  1885, 1625, 0,    0,    0,    0,    2393, 0,    0,    0,    2547, 1033, 0,
-    1057, 0,    0,    0,    452,  1524, 871,  0,    1251, 0,    0,    137,  0,    2868, 2373, 319,
-    519,  0,    0,    1090, 0,    1037, 1593, 1206, 2368, 0,    1855, 2580, 0,    0,    0,    0,
-    955,  0,    2217, 1762, 0,    0,    1585, 0,    0,    0,    2138, 0,    0,    823,  1381, 0,
-    13,   0,    0,    0,    0,    0,    0,    720,  2696, 1882, 0,    0,    2039, 0,    1957, 0,
-    336,  0,    0,    2768, 0,    0,    1015, 2066, 1349, 0,    728,  0,    2780, 0,    915,  0,
-    0,    1143, 2496, 2031, 577,  0,    1683, 235,  2977, 0,    903,  0,    0,    0,    0,    0,
-    2974, 1870, 1407, 240,  0,    2779, 1919, 0,    2016, 0,    0,    546,  362,  0,    2764, 74,
-    0,    2634, 631,  2883, 1167, 0,    0,    0,    2523, 1067, 0,    0,    173,  2454, 0,    314,
-    3008, 0,    39,   1311, 235,  1140, 2200, 0,    1695, 0,    0,    101,  0,    0,    0,    0,
-    0,    836,  0,    179,  2315, 0,    589,  2691, 3011, 968,  1223, 1290, 0,    695,  0,    161,
-    1927, 505,  186,  1048, 0,    2586, 0,    2028, 2249, 0,    0,    0,    0,    0,    2354, 1287,
-    0,    0,    0,    2392, 800,  187,  0,    308,  0,    0,    0,    1851, 312,  0,    0,    1544,
-    260,  0,    0,    697,  25,   0,    1986, 392,  0,    0,    0,    833,  2599, 0,    2258, 0,
-    2903, 0,    2232, 708,  0,    665,  0,    2702, 1143, 0,    515,  1294, 0,    0,    61,   0,
-    1012, 1102, 1173, 1316, 141,  1695, 0,    799,  0,    0,    0,    0,    3018, 515,  1954, 0,
-    1231, 1583, 484,  0,    0,    0,    2992, 2818, 0,    0,    1491, 1279, 1016, 2595, 2609, 0,
-    2261, 0,    0,    0,    1956, 0,    0,    0,    65,   0,    687,  2198, 0,    0,    0,    875,
-    0,    1499, 2608, 0,    0,    0,    0,    272,  976,  0,    317,  0,    0,    2653, 2426, 1592,
-    2787, 2911, 0,    0,    1465, 0,    0,    1231, 979,  0,    1323, 0,    2387, 2499, 469,  1355,
-    0,    1035, 0,    305,  0,    0,    0,    1778, 1109, 0,    1200, 78,   1724, 2839, 598,  0,
-    198,  0,    1571, 0,    0,    0,    1504, 693,  0,    524,  0,    2192, 0,    2548, 0,    2171,
-    0,    2087, 1093, 1507, 36,   442,  2872, 793,  68,   0,    0,    1240, 0,    0,    1190, 674,
-    1163, 0,    2152, 0,    0,    0,    1615, 2281, 1616, 2555, 31,   0,    0,    0,    306,  0,
-    738,  0,    1408, 0,    0,    2662, 0,    0,    751,  0,    0,    3000, 551,  2524, 0,    387,
-    2578, 0,    0,    0,    374,  84,   2116, 0,    1203, 0,    168,  617,  678,  612,  0,    705,
-    924,  825,  2828, 2532, 357,  2259, 0,    1540, 0,    0,    268,  0,    301,  1886, 0,    0,
-    2049, 444,  0,    749,  0,    0,    0,    281,  0,    0,    1103, 2860, 2910, 0,    0,    0,
-    2579, 28,   468,  2572, 1248, 0,    714,  0,    2957, 966,  2026, 0,    2312, 1009, 2841, 52,
-    2355, 0,    0,    2089, 2087, 0,    0,    1632, 2103, 0,    530,  0,    0,    0,    0,    448,
-    290,  1197, 467,  2878, 0,    0,    0,    731,  0,    0,    0,    0,    1942, 923,  1034, 287,
-    1272, 981,  2939, 0,    0,    2649, 0,    0,    925,  0,    1095, 0,    0,    0,    1093, 0,
-    0,    0,    0,    0,    851,  2667, 0,    2179, 497,  0,    0,    0,    1612, 723,  0,    0,
-    2842, 948,  1858, 91,   882,  0,    398,  0,    1072, 1165, 0,    1576, 1728, 2193, 1498, 0,
-    818,  0,    0,    2898, 730,  0,    644,  2832, 0,    2371, 0,    2114, 0,    15,   250,  2777,
-    1993, 0,    0,    0,    1588, 1704, 3000, 0,    0,    901,  1945, 809,  0,    1537, 1064, 0,
-    2106, 649,  2864, 751,  376,  1529, 319,  1878, 0,    2448, 1348, 0,    46,   821,  681,  533,
-    0,    0,    588,  92,   0,    1553, 0,    1150, 0,    0,    1324, 0,    0,    431,  0,    495,
-    0,    803,  0,    68,   0,    463,  746,  0,    0,    0,    178,  1976, 1171, 1550, 2790, 0,
-    0,    0,    1513, 25,   0,    0,    571,  0,    1263, 1861, 262,  0,    0,    1737, 0,    2758,
-    0,    0,    518,  224,  158,  171,  1672, 0,    516,  553,  1229, 1388, 0,    0,    0,    2427,
-    127,  0,    1347, 553,  423,  2851, 0,    2755, 0,    347,  0,    0,    0,    0,    0,    0,
-    0,    614,  1039, 2960, 526,  0,    2211, 913,  785,  2336, 0,    303,  3017, 0,    0,    1820,
-    0,    1003, 0,    0,    0,    2142, 0,    0,    310,  1216, 0,    2346, 1893, 1427, 2546, 0,
-    1095, 2210, 1882, 2899, 2069, 722,  474,  2010, 2298, 0,    0,    496,  0,    0,    0,    873,
-    426,  2698, 0,    2628, 0,    1732, 1731, 15,   0,    1274, 279,  0,    0,    479,  0,    0,
-    1087, 0,    0,    2826, 0,    2712, 1354, 0,    640,  2719, 0,    1641, 42,   2395, 0,    2690,
-    2161, 0,    0,    0,    938,  0,    0,    925,  570,  2489, 0,    0,    1341, 33,   0,    0,
-    432,  295,  1217, 1623, 2221, 0,    0,    1665, 1236, 2110, 1183, 2644, 0,    1309, 2416, 729,
-    0,    1141, 908,  770,  0,    0,    1607, 693,  492,  62,   0,    1489, 0,    1243, 1001, 3001,
-    0,    0,    0,    2514, 0,    0,    2011, 0,    1060, 1418, 0,    785,  2191, 0,    1566, 0,
-    1128, 160,  241,  0,    1066, 1898, 312,  0,    1332, 0,    2100, 0,    1603, 1120, 1052, 1869,
-    0,    2944, 0,    2474, 0,    483,  0,    1596, 2255, 0,    2349, 2821, 719,  0,    248,  417,
-    0,    571,  0,    220,  0,    0,    3004, 0,    200,  0,    2568, 24,   1197, 76,   0,    529,
-    453,  2330, 2500, 0,    1527, 1282, 631,  450,  1507, 515,  0,    0,    682,  387,  568,  576,
-    549,  0,    0,    687,  0,    0,    370,  2987, 0,    0,    1180, 622,  203,  0,    267,  0,
-    381,  0,    515,  670,  40,   581,  335,  789,  2257, 0,    780,  0,    2326, 664,  2972, 138,
-    2489, 0,    1349, 347,  503,  0,    0,    208,  2159, 0,    0,    1493, 517,  0,    0,    0,
-    0,    0,    1370, 1795, 2017, 2390, 1522, 2492, 0,    1133, 2233, 0,    0,    0,    0,    0,
-    1012, 149,  2696, 2988, 585,  0,    1857, 1863, 2621, 0,    0,    906,  0,    0,    1537, 2721,
-    2185, 0,    2264, 57,   0,    0,    959,  411,  252,  377,  1132, 1484, 0,    0,    0,    213,
-    1707, 454,  1444, 0,    0,    937,  0,    0,    1760, 0,    908,  1442, 2069, 0,    810,  0,
-    2908, 0,    1582, 0,    2092, 216,  0,    1115, 620,  0,    293,  1202, 145,  683,  951,  0,
-    862,  0,    0,    0,    1409, 928,  1353, 374,  0,    343,  91,   0,    0,    0,    0,    502,
-    1694, 2,    161,  496,  0,    114,  1554, 972,  0,    0,    989,  1296, 508,  144,  824,  1210,
-    1133, 0,    0,    787,  0,    0,    795,  2132, 0,    0,    1602, 333,  0,    2297, 2939, 609,
-    1355, 443,  85,   784,  679,  889,  866,  1433, 2624, 0,    0,    0,    0,    0,    0,    2387,
-    532,  0,    0,    1527, 0,    631,  0,    0,    607,  0,    1271, 263,  795,  619,  0,    1652,
-    0,    875,  0,    1340, 1486, 318,  1288, 2278, 852,  538,  1201, 0,    388,  881,  0,    1374,
-    667,  0,    0,    2518, 1781, 0,    1289, 3040, 768,  0,    2999, 173,  1575, 1149, 0,    389,
-    840,  12,   0,    335,  1774, 1469, 1025, 0,    1063, 547,  1372, 1927, 320,  660,  1342, 1983,
-    376,  2495, 1572, 0,    1243, 0,    2931, 2588, 1205, 725,  0,    1196, 80,   1511, 0,    0,
-    217,  0,    1070, 0,    1112, 0,    0,    621,  1748, 2599, 0,    0,    204,  1856, 1599, 0,
-    0,    2266, 0,    1624, 2162, 0,    0,    757,  1254, 2714, 2575, 951,  0,    0,    404,  1572,
-    1502, 0,    1425, 2244, 1553, 292,  730,  54,   0,    0,    622,  3012, 554,  0,    1790, 25,
-    3022, 0,    2862, 0,    1632, 409,  0,    630,  675,  307,  1589, 2191, 0,    715,  1377, 0,
-    62,   0,    859,  99,   1418, 0,    1245, 472,  2767, 1518, 0,    0,    0,    0,    646,  0,
-    0,    664,  2543, 762,  2268, 0,    0,    514,  1066, 0,    1225, 0,    0,    1238, 0,    1814,
-    2873, 2985, 647,  803,  2962, 1198, 0,    0,    724,  1579, 2570, 2211, 0,    867,  1759, 1009,
-    472,  607,  10,   1506, 0,    0,    2535, 2,    773,  1561, 3035, 0,    451,  1318, 600,  1697,
-    1084, 334,  446,  311,  0,    2760, 1385, 962,  0,    1846, 0,    0,    0,    0,    0,    478,
-    325,  0,    2538, 675,  130,  0,    60,   1463, 0,    2306, 616,  0,    0,    1156, 43,   2497,
-    0,    0,    1261, 0,    2885, 1154, 308,  123,  1159, 1232, 67,   0,    2881, 2869, 470,  0,
-    786,  0,    817,  0,    0,    0,    0,    935,  0,    843,  0,    0,    474,  2495, 2100, 1430,
-    261,  2582, 3053, 1174, 0,    394,  0,    0,    0,    2085, 0,    0,    0,    0,    2958, 0,
-    0,    332,  1299, 372,  1371, 2956, 939,  1701, 0,    929,  2899, 1055, 1561, 683,  1532, 0,
-    451,  869,  0,    2618, 0,    1477, 2869, 0,    0,    598,  934,  1696, 2696, 1012, 2089, 0,
-    850,  2627, 0,    0,    1604, 183,  0,    0,    447,  0,    1584, 0,    355,  2695, 1598, 66,
-    2586, 2365, 1187, 0,    562,  2576, 864,  547,  655,  0,    0,    1521, 182,  1832, 1283, 95,
-    933,  270,  0,    2662, 0,    2598, 0,    0,    798,  0,    0,    0,    0,    0,    0,    1015,
-    2669, 0,    576,  742,  0,    0,    1503, 301,  1255, 2523, 0,    381,  0,    1550, 0,    399,
-    1166, 2011, 0,    1268, 2788, 0,    0,    0,    402,  0,    1040, 0,    703,  0,    0,    2636,
-    0,    0,    1443, 854,  811,  1068, 963,  58,   978,  0,    344,  1565, 0,    0,    2654, 0,
-    0,    540,  0,    514,  640,  0,    1298, 338,  0,    2945, 0,    1192, 0,    0,    1788, 0,
-    2004, 0,    2857, 1088, 588,  863,  2021, 0,    389,  805,  0,    1274, 624,  475,  0,    541,
-    1226, 0,    0,    722,  915,  0,    0,    1794, 2724, 3037, 1218, 0,    0,    2047, 830,  1558,
-    1192, 229,  243,  2452, 1353, 2813, 1407, 1891, 602,  0,    0,    895,  849,  0,    0,    3029,
-    29,   0,    1393, 0,    834,  0,    1158, 528,  1860, 266,  2860, 1374, 358,  1822, 0,    2664,
-    1076, 3053, 0,    1052, 21,   2114, 3011, 2630, 0,    0,    211,  838,  1014, 0,    0,    0,
-    0,    0,    0,    0,    0,    606,  2016, 391,  0,    127,  6,    391,  2226, 1119, 3052, 66,
-    2709, 2563, 209,  0,    1131, 2681, 1545, 2003, 1491, 292,  2833, 0,    0,    0,    0,    2876,
-    0,    768,  630,  1755, 483,  2017, 0,    1035, 1365, 0,    0,    396,  1313, 0,    2026, 0,
-    3042, 0,    0,    1471, 651,  1372, 76,   208,  1173, 558,  2560, 391,  2001, 2571, 0,    0,
-    0,    639,  0,    0,    494,  1497, 17,   141,  0,    119,  647,  955,  377,  2305, 365,  0,
-    1380, 0,    313,  2898, 2369, 319,  150,  643,  0,    0,    772,  856,  1313, 0,    0,    0,
-    0,    218,  0,    2296, 0,    765,  0,    2233, 1556, 683,  0,    1009, 382,  364,  15,   0,
-    209,  1347, 2109, 1404, 120,  371,  77,   0,    192,  163,  811,  316,  0,    0,    558,  0,
-    1487, 1092, 0,    1600, 1224, 0,    278,  0,    2629, 0,    682,  1121, 2856, 1298, 327,  0,
-    397,  1447, 1083, 0,    0,    1012, 2232, 0,    921,  2397, 0,    1495, 428,  323,  0,    189,
-    453,  2986, 837,  0,    0,    0,    247,  0,    2881, 999,  610,  0,    0,    1319, 0,    606,
-    0,    1569, 163,  1039, 1919, 2256, 0,    2400, 2371, 421,  1127, 1236, 98,   644,  1242, 1730,
-    1581, 0,    168,  0,    516,  0,    543,  314,  1038, 286,  0,    1145, 2148, 0,    481,  2531,
-    842,  0,    0,    0,    3,    0,    1338, 517,  1276, 2788, 707,  1211, 1580, 1842, 1054, 0,
-    0,    2663, 0,    0,    454,  324,  0,    0,    0,    1452, 0,    0,    1386, 1118, 969,  569,
-    1990, 2874, 0,    831,  0,    0,    633,  1480, 0,    2163, 778,  389,  1709, 9,    0,    363};
+    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    2758, 0,    332,  0,    0,
+    0,    0,    949,  0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    1726, 0,    2569,
+    0,    0,    0,    0,    0,    0,    0,    0,    593,  0,    0,    1216, 0,    0,    222,  0,
+    0,    1645, 0,    0,    0,    0,    0,    0,    306,  27,   0,    0,    0,    2019, 0,    1761,
+    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    1160, 0,    0,    0,    1102, 0,
+    0,    0,    0,    0,    2775, 0,    0,    1256, 0,    0,    531,  0,    0,    0,    0,    668,
+    0,    0,    0,    2581, 0,    0,    0,    0,    0,    0,    0,    0,    0,    358,  2470, 0,
+    2361, 0,    0,    0,    0,    0,    1624, 390,  714,  0,    0,    2675, 0,    2669, 992,  0,
+    0,    0,    0,    0,    582,  930,  0,    1485, 0,    0,    0,    0,    0,    0,    96,   0,
+    36,   141,  0,    0,    0,    0,    0,    748,  0,    0,    0,    0,    308,  0,    327,  1950,
+    0,    92,   0,    606,  0,    0,    0,    0,    0,    0,    0,    1249, 0,    0,    1223, 0,
+    1011, 0,    1787, 261,  945,  1542, 329,  0,    0,    0,    0,    0,    0,    854,  0,    573,
+    99,   0,    0,    0,    948,  0,    163,  1271, 1567, 0,    2533, 688,  1223, 0,    0,    0,
+    0,    0,    0,    0,    0,    1111, 704,  693,  620,  1078, 0,    0,    0,    2539, 415,  1990,
+    0,    0,    2702, 0,    712,  0,    1829, 0,    0,    0,    2682, 0,    0,    2040, 1784, 0,
+    318,  0,    0,    0,    0,    0,    0,    0,    2243, 0,    0,    0,    2479, 0,    1494, 0,
+    0,    95,   406,  0,    126,  0,    0,    0,    0,    0,    0,    0,    0,    635,  2847, 2087,
+    0,    2798, 480,  1643, 0,    1670, 0,    1640, 303,  1196, 2443, 820,  133,  2201, 0,    0,
+    0,    0,    0,    1316, 746,  86,   0,    357,  375,  0,    0,    0,    0,    0,    0,    1901,
+    744,  0,    668,  2700, 1855, 0,    0,    0,    0,    0,    0,    0,    0,    875,  0,    679,
+    0,    0,    234,  1462, 0,    0,    0,    2409, 0,    1062, 2344, 0,    0,    0,    0,    0,
+    1350, 2254, 2320, 0,    0,    0,    0,    0,    1011, 0,    1010, 1068, 0,    0,    782,  848,
+    0,    1511, 0,    0,    0,    1452, 1417, 0,    0,    0,    0,    0,    959,  0,    0,    0,
+    0,    1250, 633,  696,  888,  1378, 1702, 1448, 1992, 348,  0,    0,    2513, 1441, 442,  0,
+    0,    849,  0,    0,    0,    0,    0,    1306, 0,    1080, 0,    2467, 0,    0,    1649, 0,
+    2363, 541,  0,    0,    0,    570,  0,    596,  298,  0,    1284, 0,    0,    0,    0,    0,
+    0,    0,    0,    0,    1016, 0,    0,    0,    1056, 0,    2233, 0,    2691, 1230, 0,    0,
+    0,    645,  972,  0,    0,    335,  480,  0,    356,  0,    1995, 0,    0,    0,    1999, 0,
+    778,  0,    0,    952,  1066, 0,    0,    0,    2574, 0,    2263, 1932, 0,    1404, 305,  0,
+    0,    1049, 0,    0,    2546, 1758, 0,    2549, 2895, 2636, 2355, 0,    0,    0,    0,    2903,
+    0,    356,  0,    1530, 1844, 0,    0,    2867, 2741, 624,  0,    0,    0,    0,    2064, 2462,
+    0,    2671, 165,  1638, 0,    0,    1433, 0,    1292, 0,    0,    0,    0,    2192, 2069, 1260,
+    892,  0,    465,  828,  456,  0,    0,    1799, 258,  912,  0,    2480, 637,  0,    0,    0,
+    0,    0,    0,    782,  393,  2356, 141,  0,    2538, 0,    0,    0,    0,    0,    0,    2769,
+    0,    0,    0,    0,    0,    0,    0,    906,  2070, 0,    0,    232,  0,    0,    1735, 2806,
+    2365, 0,    0,    539,  264,  0,    0,    0,    0,    1652, 2611, 995,  1348, 1809, 879,  0,
+    0,    985,  2178, 164,  0,    0,    0,    0,    399,  0,    1216, 0,    0,    259,  1515, 0,
+    0,    0,    1556, 563,  497,  0,    0,    0,    0,    2844, 0,    0,    2154, 0,    476,  0,
+    0,    1303, 2622, 1249, 2251, 0,    0,    499,  0,    2296, 0,    0,    0,    2480, 0,    0,
+    2118, 1962, 387,  0,    2289, 1968, 0,    0,    0,    0,    1850, 0,    1266, 0,    1697, 0,
+    0,    1230, 0,    0,    0,    417,  0,    1935, 1588, 391,  1671, 0,    0,    0,    2028, 1993,
+    0,    0,    854,  0,    0,    0,    864,  33,   1934, 1611, 564,  0,    0,    2491, 191,  408,
+    1484, 672,  0,    0,    2333, 0,    939,  268,  0,    2804, 2158, 0,    437,  323,  0,    1218,
+    0,    0,    0,    0,    0,    0,    2922, 0,    699,  543,  2629, 0,    0,    0,    0,    0,
+    2726, 311,  0,    0,    0,    0,    0,    0,    2445, 0,    0,    0,    540,  272,  0,    594,
+    0,    2332, 0,    1352, 1196, 0,    694,  1313, 0,    0,    0,    678,  0,    0,    88,   0,
+    604,  0,    1083, 577,  1102, 718,  1169, 0,    2356, 0,    0,    1936, 141,  791,  653,  408,
+    1212, 388,  0,    0,    0,    212,  0,    0,    2042, 0,    1962, 2110, 2853, 0,    0,    525,
+    0,    0,    2413, 2515, 0,    0,    109,  2477, 160,  1539, 513,  1587, 559,  1521, 0,    691,
+    0,    662,  333,  0,    0,    2784, 358,  0,    0,    0,    1425, 1269, 0,    0,    0,    1033,
+    0,    0,    0,    0,    0,    1459, 0,    838,  1463, 291,  0,    0,    0,    402,  0,    0,
+    886,  2775, 78,   2270, 1172, 2869, 0,    1455, 0,    2192, 0,    1322, 0,    1341, 1179, 0,
+    0,    501,  0,    0,    122,  1301, 0,    1596, 2269, 490,  0,    0,    2736, 0,    2042, 0,
+    204,  2861, 346,  1291, 0,    225,  0,    527,  0,    0,    2190, 0,    0,    0,    1171, 2123,
+    0,    0,    1581, 1705, 2667, 0,    1118, 1298, 2313, 0,    0,    0,    299,  1191, 479,  0,
+    0,    2308, 0,    1239, 2703, 1632, 0,    0,    0,    500,  179,  0,    1460, 709,  0,    0,
+    727,  2664, 2693, 1698, 0,    0,    0,    0,    1860, 0,    0,    671,  2609, 1730, 987,  1715,
+    0,    2163, 0,    1107, 638,  0,    2195, 0,    0,    278,  398,  0,    0,    367,  1469, 2459,
+    0,    0,    57,   1141, 2722, 0,    0,    2751, 1920, 2740, 0,    1945, 2526, 0,    1231, 0,
+    1095, 2340, 2116, 0,    1137, 0,    0,    0,    0,    0,    1883, 0,    1145, 1308, 0,    170,
+    756,  2911, 0,    663,  234,  0,    0,    1956, 0,    705,  2731, 758,  0,    0,    0,    1931,
+    0,    0,    704,  0,    0,    948,  579,  1393, 1873, 0,    2580, 832,  0,    2904, 2096, 0,
+    1964, 0,    2167, 0,    0,    553,  0,    0,    0,    768,  0,    2794, 0,    2678, 1810, 1988,
+    0,    1432, 0,    0,    0,    1943, 875,  0,    1138, 1735, 1336, 170,  1525, 1967, 0,    197,
+    0,    0,    0,    2398, 666,  0,    344,  0,    210,  0,    325,  2555, 2817, 1383, 2913, 0,
+    2746, 919,  1448, 0,    0,    0,    0,    2909, 0,    1095, 1199, 2451, 0,    1155, 439,  2734,
+    1479, 2512, 504,  1344, 0,    0,    2572, 684,  1039, 799,  2047, 0,    0,    871,  0,    0,
+    908,  0,    0,    0,    2069, 53,   376,  0,    566,  0,    920,  0,    2207, 0,    0,    0,
+    1353, 0,    0,    978,  0,    252,  656,  0,    1541, 1990, 0,    273,  140,  1670, 0,    762,
+    0,    0,    0,    0,    1913, 95,   0,    198,  1718, 175,  0,    0,    0,    0,    0,    0,
+    1447, 0,    1080, 2764, 0,    2471, 1574, 1091, 775,  0,    0,    1897, 2375, 2556, 1669, 0,
+    2710, 277,  193,  0,    0,    0,    0,    0,    0,    0,    1597, 0,    1757, 0,    2718, 0,
+    680,  0,    0,    0,    56,   0,    2217, 0,    872,  0,    0,    1106, 2099, 2778, 0,    0,
+    0,    0,    2297, 0,    2797, 0,    0,    1577, 590,  0,    996,  1982, 2886, 0,    0,    51,
+    0,    0,    0,    249,  424,  219,  0,    405,  1261, 0,    0,    1249, 420,  0,    0,    0,
+    1551, 884,  2340, 2855, 547,  0,    1203, 352,  0,    2001, 0,    340,  0,    1831, 425,  0,
+    1925, 0,    1074, 630,  1613, 522,  0,    0,    575,  2656, 0,    1096, 2744, 1804, 0,    0,
+    1182, 453,  1540, 889,  163,  0,    0,    0,    702,  999,  0,    1454, 0,    2587, 0,    483,
+    1358, 1722, 0,    277,  827,  2790, 0,    2170, 0,    0,    0,    1156, 63,   333,  803,  0,
+    757,  1835, 0,    2770, 2321, 0,    392,  1769, 0,    1071, 754,  0,    2677, 0,    426,  0,
+    0,    2795, 0,    512,  0,    2340, 883,  545,  457,  726,  2809, 1035, 0,    1104, 1921, 0,
+    0,    1854, 1942, 0,    0,    2526, 0,    460,  1225, 0,    1115, 2108, 0,    2746, 0,    0,
+    0,    0,    500,  0,    0,    0,    0,    172,  1682, 1542, 2730, 0,    1849, 0,    0,    0,
+    0,    1421, 0,    0,    0,    2806, 675,  63,   1402, 0,    314,  871,  0,    0,    1565, 2378,
+    0,    0,    0,    2897, 0,    924,  412,  0,    397,  0,    0,    1537, 0,    35,   2833, 0,
+    2207, 0,    0,    129,  2201, 2921, 0,    1522, 804,  0,    0,    1302, 1478, 0,    0,    747,
+    646,  0,    1823, 607,  0,    2459, 0,    2921, 8,    1218, 966,  265,  64,   2413, 2042, 0,
+    0,    1576, 1330, 698,  751,  0,    835,  1317, 0,    0,    1038, 196,  2462, 0,    1124, 2699,
+    1482, 0,    122,  0,    0,    0,    0,    1698, 0,    0,    0,    411,  1017, 50,   0,    0,
+    0,    0,    2033, 0,    0,    0,    0,    1822, 0,    1165, 1203, 548,  2831, 0,    728,  0,
+    1484, 0,    1137, 0,    1489, 0,    143,  427,  1833, 975,  0,    1014, 1928, 0,    1506, 2439,
+    0,    0,    2724, 0,    821,  0,    2276, 2551, 1368, 1395, 461,  1905, 551,  1095, 2202, 0,
+    534,  1064, 340,  951,  315,  625,  234,  1185, 2638, 1569, 666,  535,  0,    0,    2315, 2875,
+    1404, 0,    935,  2776, 335,  0,    0,    0,    637,  0,    0,    2481, 269,  777,  965,  268,
+    0,    1359, 853,  2228, 1171, 2266, 0,    24,   2586, 2732, 2589, 117,  0,    143,  0,    1565,
+    2144, 1580, 2899, 0,    745,  1194, 16,   1427, 1263, 2871, 2613, 1374, 0,    1036, 0,    505,
+    214,  1547, 1103, 0,    883,  0,    0,    0,    962,  0,    2431, 2798, 1569, 0,    1110, 0,
+    2650, 861,  926,  1741, 896,  251,  0,    2468, 2507, 7,    354,  2749, 0,    1325, 0,    0,
+    0,    1963, 0,    370,  0,    1193, 0,    0,    2922, 0,    2815, 0,    263,  1196, 350,  689,
+    1887, 0,    903,  0,    2145, 1585, 97,   2301, 0,    0,    1209, 1915, 0,    2604, 314,  1566,
+    142,  0,    0,    1492, 1730, 0,    2700, 887,  0,    1214, 1603, 966,  0,    1840, 0,    641,
+    1369, 0,    2415, 668,  2219, 0,    0,    1922, 0,    0,    2325, 2036, 1129, 462,  2343, 1591,
+    0,    407,  322,  2439, 0,    0,    2368, 0,    0,    290,  414,  1473, 2108, 393,  1972, 2534,
+    2217, 0,    2615, 1059, 1140, 0,    659,  1602, 0,    2509, 1857, 1062, 183,  1039, 1999, 0,
+    400,  2072, 0,    1807, 0,    129,  0,    0,    0,    0,    1402, 0,    83,   886,  2619, 2827,
+    75,   2462, 264,  474,  0,    1375, 339,  2698, 1397, 0,    900,  2035, 0,    2459, 2664, 0,
+    0,    2598, 1144, 1161, 0,    0,    294,  0,    521,  2269, 102,  2744, 0,    301,  385,  904,
+    0,    0,    0,    1903, 0,    0,    809,  553,  0,    1477, 344,  1286, 0,    2782, 0,    382,
+    1623, 0,    137,  0,    897,  0,    1133, 0,    2175, 1129, 0,    1866, 2482, 2876, 251,  31,
+    997,  1146, 2270, 893,  0,    0,    0,    0,    1610, 0,    1042, 2815, 2916, 0,    0,    1239,
+    0,    892,  2751, 1570, 2596, 97,   134,  418,  1188, 2752, 2491, 318,  0,    278,  1272, 743,
+    2595, 0,    1127, 289,  0,    2032, 2331, 0,    0,    2675, 2061, 1020, 0,    678,  2033, 2532,
+    440,  437,  685,  1009, 0,    416,  1264, 0,    0,    1023, 2891, 0,    0,    0,    0,    1493,
+    867,  182,  2205, 1668, 1359, 1593, 246,  0,    0,    2890, 91,   1019, 0,    0,    2085, 2212,
+    2722, 1629, 856,  2883, 389,  693,  0,    2230, 0,    1585, 371,  0,    823,  2216, 0,    0,
+    0,    0,    0,    1022, 0,    1833, 0,    0,    17,   0,    317,  343,  0,    1012, 2470, 2785,
+    0,    0,    122,  0,    1254, 0,    173,  351,  0,    0,    0,    0,    892,  1773, 1940, 295,
+    0,    2708, 2635, 1470, 1736, 466,  206,  631,  1194, 300,  28,   1109, 1694, 0,    0,    2859,
+    0,    1031, 0,    0,    1587, 629,  927,  2421, 0,    550,  0,    1896, 0,    2776, 0,    2560,
+    1240, 165,  383,  2745, 788,  0,    0,    1025, 158,  2406, 2662, 2611, 2316, 0,    0,    666,
+    2174, 0,    817,  1273, 0,    0,    843,  0,    2140, 0,    1598, 2696, 0,    0,    0,    1311,
+    563,  1708, 871,  0,    2088, 0,    979,  2752, 0,    2057, 39,   2081, 448,  0,    1167, 20,
+    1287, 0,    0,    1401, 453,  369,  2286, 515,  0,    1174, 0,    1410, 0,    0,    874,  0,
+    0,    585,  2689, 526,  1538, 0,    2265, 0,    955,  0,    2702, 0,    0,    0,    0,    0,
+    0,    193,  0,    473,  1156, 2427, 532,  403,  0,    0,    0,    0,    2843, 206,  2302, 208,
+    0,    1358, 642,  0,    0,    1064, 0,    1577, 0,    1069, 2021, 2745, 2333, 0,    239,  1178,
+    1486, 2029, 2248, 0,    0,    0,    2688, 0,    0,    2086, 1231, 0,    237,  0,    714,  1336,
+    2573, 0,    2730, 0,    2120, 12,   0,    2082, 769,  0,    125,  0,    207,  1333, 1127, 396,
+    0,    672,  0,    1251, 0,    0,    0,    2312, 829,  1007, 544,  2041, 1143, 1332, 889,  0,
+    0,    2898, 0,    1491, 0,    0,    0,    0,    0,    167,  2923, 750,  0,    0,    0,    829,
+    770,  244,  0,    584,  429,  755,  1302, 0,    0,    85,   157,  122,  1071, 0,    1601, 0,
+    0,    1820, 0,    0,    344,  0,    0,    453,  1879, 0,    0,    0,    604,  1446, 452,  2722,
+    2875, 286,  0,    1183, 428,  0,    0,    175,  0,    0,    0,    0,    950,  2134, 0,    0,
+    1077, 1623, 1400, 13,   541,  0,    0,    0,    0,    0,    0,    672,  2057, 23,   1157, 1920,
+    0,    403,  0,    1927, 0,    0,    1101, 0,    329,  93,   2765, 0,    1213, 1450, 0,    0,
+    53,   996,  0,    2402, 0,    228,  407,  2001, 0,    0,    0,    2684, 1051, 0,    1926, 0,
+    0,    0,    0,    0,    0,    0,    1753, 0,    973,  2392, 605,  0,    1731, 979,  2853, 0,
+    309,  0,    1658, 238,  153,  2396, 0,    0,    1176, 482,  210,  1013, 0,    0,    1166, 115,
+    161,  0,    509,  282,  0,    0,    0,    1085, 287,  74,   780,  2243, 0,    1401, 1227, 444,
+    0,    266,  0,    973,  16,   1516, 834,  0,    1212, 2585, 2432, 1312, 0,    0,    0,    1204,
+    1587, 2654, 0,    619,  487,  603,  1128, 367,  1088, 0,    0,    0,    1309, 1099, 2806, 0,
+    0,    353,  2005, 2469, 0,    0,    0,    0,    264,  553,  441,  2219, 442,  0,    1192, 0,
+    1246, 0,    220,  432,  0,    0,    816,  879,  1241, 0,    1338, 476,  1029, 0,    271,  355,
+    0,    0,    262,  1988, 963,  1220, 2479, 2542, 44,   0,    1197, 592,  2476, 1451, 2668, 1895,
+    2531, 746,  0,    1483, 1389, 912,  1056, 0,    56,   0,    2077, 0,    1977, 1253, 2890, 2559,
+    0,    1363, 915,  2090, 0,    77,   0,    2222, 0,    1399, 2628, 0,    922,  379,  351,  472,
+    2504, 0,    0,    0,    1034, 802,  0,    0,    2529, 2202, 1575, 1724, 0,    0,    0,    24,
+    0,    1506, 0,    1380, 0,    218,  0,    1148, 1114, 0,    0,    1788, 0,    1648, 1646, 2151,
+    547,  0,    2099, 0,    0,    0,    2035, 1628, 0,    1359, 183,  991,  1251, 1202, 0,    1131,
+    0,    0,    1,    880,  625,  0,    0,    1412, 2082, 697,  0,    836,  195,  2063, 1266, 220,
+    0,    1508, 1454, 2484, 854,  0,    481,  2595, 1171, 1435, 0,    882,  1083, 0,    2616, 777,
+    741,  0,    934,  279,  2059, 574,  1626, 0,    2055, 1643, 0,    1859, 0,    0,    0,    957,
+    528,  0,    1411, 1579, 0,    850,  1618, 393,  0,    1277, 454,  62,   1159, 406,  1517, 138,
+    1092, 237,  0,    0,    1162, 2741, 0,    0,    0,    1494, 1048, 2051, 0,    1755, 2110, 98,
+    844,  324,  1435, 0,    1578, 2746, 1217, 0,    0,    0,    292,  2713, 2882, 1464, 2010, 740,
+    1476, 0,    0,    0,    0,    0,    0,    1248, 0,    0,    0,    1,    951,  814,  900,  2869,
+    2488, 0,    2070, 0,    715,  905,  1075, 367,  571,  0,    1210, 583,  676,  0,    2493, 72,
+    0,    0,    835,  2637, 896,  792,  80,   0,    1992, 0,    0,    0,    0,    1588, 1398, 319,
+    174,  545,  838,  382,  0,    0,    0,    0,    461,  554,  0,    571,  2846, 674,  961,  691,
+    894,  1216, 0,    0,    1347, 2631, 1696, 1778, 468,  1276, 1539, 0,    1518, 724,  1083, 593,
+    0,    970,  2017, 1025, 1122, 867,  2172, 521,  1582, 0,    1097, 425,  0,    0,    0,    0,
+    0,    1077, 1027, 0,    0,    0,    1077, 2615, 51,   1130, 1030, 579,  1457, 1450, 0,    0,
+    2500, 0,    0,    1125, 2482, 0,    1334, 77,   0,    1180, 1373, 2724, 0,    79,   141,  0,
+    586,  1323, 1366, 1528, 1566, 1680, 1761, 0,    1489, 0,    0,    2100, 0,    0,    1664, 933,
+    523,  1303, 1398, 2476, 0,    1356, 0,    2278, 114,  1793, 2510, 0,    517,  1932, 1218, 0,
+    0,    0,    0,    1488, 0,    0,    2321, 0,    710,  0,    0,    843,  0,    59,   1134, 1938,
+    2545, 2272, 81,   2714, 2266, 614,  305,  0,    456,  1104, 1170, 0,    0,    0,    587,  1379,
+    2323, 1709, 1344, 843,  2346, 1464, 0,    0,    0,    2622, 0,    0,    211,  0,    2888, 0,
+    0,    0,    457,  0,    0,    91,   455,  62,   2755, 569,  2817, 0,    1104, 2520, 1583, 0,
+    2755, 973,  329,  1110, 0,    0,    1136, 641,  439,  651,  1152, 479,  1622, 2271, 452,  668,
+    255,  0,    0,    488,  0,    2711, 1974, 846,  0,    789,  0,    0,    0,    2136, 131,  0,
+    0,    233,  2553, 2431, 2528, 0,    395,  0,    0,    408,  0,    70,   0,    0,    0,    412,
+    893,  0,    1450, 0,    0,    1844, 0,    2620, 1507, 1234, 2137, 0,    888,  2693, 0,    0,
+    0,    0,    0,    2372, 2603, 1635, 0,    909,  1575, 762,  2041, 409,  0,    1512, 267,  0,
+    0,    935,  0,    0,    2867, 901,  144,  74,   0,    0,    2884, 2638, 0,    0,    2813, 363,
+    203,  1609, 0,    1216, 0,    297,  1274, 117,  366,  491,  317,  530,  1050, 868,  1236, 0,
+    2780, 0,    1312, 1223, 797,  603,  0,    0,    1203, 0,    2548, 0,    1538, 0,    1241, 0,
+    0,    2775, 1719, 1399, 97,   0,    1082, 1731, 3,    0,    0,    387,  0,    1090, 1910, 32,
+    162,  0,    2922, 0,    0,    608,  347,  510,  1465, 0,    675,  0,    0,    770,  971,  1673,
+    1159, 0,    0,    496,  939,  0,    269,  314,  2776, 0,    1721, 1563, 1557, 0,    0,    665,
+    1436, 2506, 1641, 601,  2171, 0,    914,  0,    784,  1072, 0,    0,    0,    740,  1147, 0,
+    0,    714,  682,  2427, 0,    1071, 2550, 2169, 1146, 61,   1232, 816,  10,   1453, 0,    1117,
+    278,  559,  584,  1605, 0,    0,    2887, 990,  1101, 2030, 0,    0};
 
 int MangledHashG(const char *key, const int *T)
 {
@@ -232,7 +224,7 @@
     for (int i = 0; key[i] != '\0'; i++)
     {
         sum += T[i] * key[i];
-        sum %= 3056;
+        sum %= 2924;
     }
     return mangledkG[sum];
 }
@@ -242,31 +234,28 @@
     if (strlen(key) > 40)
         return 0;
 
-    return (MangledHashG(key, mangledkT1) + MangledHashG(key, mangledkT2)) % 3056;
+    return (MangledHashG(key, mangledkT1) + MangledHashG(key, mangledkT2)) % 2924;
 }
 
-constexpr int unmangledkT1[] = {4,   292, 232, 232, 193, 181, 196, 165, 183, 130, 89,  218, 121,
-                                218, 281, 292, 91,  82,  127, 12,  101, 68,  202, 208, 9,   296};
-constexpr int unmangledkT2[] = {45,  96,  273, 31,  160, 43,  51,  33,  186, 19, 295, 90, 177,
-                                130, 293, 293, 260, 112, 117, 282, 224, 179, 56, 272, 36, 261};
+constexpr int unmangledkT1[] = {117, 100, 175, 73, 62,  169, 79,  220, 4,  91,  224, 166, 55,
+                                229, 227, 3,   24, 236, 181, 221, 15,  67, 197, 152, 35,  35};
+constexpr int unmangledkT2[] = {189, 204, 50, 180, 250, 9,  42, 246, 97,  141, 38,  136, 163,
+                                102, 48,  27, 254, 180, 50, 30, 105, 152, 194, 229, 33,  152};
 constexpr int unmangledkG[]  = {
-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   78,  96,  41,  0,   0,   268,
-    0,   0,   0,   24,  0,   0,   0,   45,  6,   55,  0,   0,   0,   0,   199, 30,  146, 209,
-    0,   299, 0,   212, 0,   300, 106, 0,   40,  0,   0,   114, 0,   0,   5,   0,   0,   0,
-    58,  241, 38,  0,   54,  68,  64,  90,  64,  0,   0,   0,   0,   0,   76,  0,   183, 303,
-    0,   0,   0,   0,   51,  0,   0,   152, 0,   0,   92,  153, 0,   93,  0,   255, 125, 0,
-    141, 171, 0,   87,  299, 86,  1,   0,   0,   87,  5,   0,   79,  0,   262, 0,   110, 0,
-    32,  267, 0,   0,   100, 2,   0,   0,   0,   229, 248, 0,   77,  0,   0,   11,  215, 110,
-    0,   0,   269, 22,  199, 0,   37,  0,   0,   0,   202, 126, 65,  9,   0,   97,  104, 0,
-    0,   0,   0,   203, 0,   227, 84,  0,   25,  76,  0,   89,  0,   0,   9,   149, 0,   72,
-    41,  0,   0,   0,   94,  0,   0,   0,   0,   59,  139, 10,  292, 102, 58,  0,   0,   280,
-    14,  43,  105, 123, 33,  114, 223, 82,  142, 0,   175, 0,   4,   113, 67,  116, 0,   0,
-    242, 0,   96,  0,   130, 245, 29,  66,  279, 0,   89,  0,   293, 4,   93,  0,   40,  62,
-    0,   0,   49,  0,   294, 42,  277, 275, 0,   75,  0,   135, 299, 0,   217, 58,  47,  0,
-    106, 0,   0,   0,   54,  0,   242, 0,   0,   0,   50,  80,  24,  40,  9,   0,   120, 276,
-    0,   0,   0,   157, 0,   0,   0,   121, 167, 0,   84,  0,   22,  71,  0,   0,   292, 134,
-    27,  0,   274, 0,   0,   0,   51,  0,   128, 0,   0,   276, 0,   0,   0,   86,  273, 143,
-    0,   87,  242, 121, 185, 65,  252, 90,  188, 144, 104, 0,   94,  64,  1,   2,   21,  68};
+    0,   0,   27,  0,   57,  0,   170, 30,  35,  81,  0,   0,   115, 112, 204, 0,   154, 52,  7,
+    17,  79,  19,  0,   79,  0,   130, 0,   0,   223, 81,  198, 121, 0,   63,  0,   220, 0,   68,
+    0,   197, 0,   0,   0,   189, 0,   0,   0,   240, 6,   0,   95,  0,   68,  0,   0,   195, 0,
+    0,   98,  0,   237, 0,   0,   229, 86,  110, 0,   53,  170, 223, 11,  0,   0,   166, 0,   0,
+    18,  48,  54,  0,   232, 113, 96,  58,  0,   208, 254, 172, 243, 119, 0,   0,   58,  81,  196,
+    131, 0,   0,   106, 81,  0,   198, 0,   218, 0,   160, 197, 123, 0,   180, 152, 177, 187, 0,
+    0,   0,   0,   175, 91,  0,   140, 215, 0,   89,  0,   245, 0,   26,  0,   104, 62,  0,   141,
+    235, 220, 193, 0,   0,   175, 29,  28,  137, 45,  217, 0,   0,   193, 191, 246, 201, 0,   0,
+    183, 165, 32,  60,  221, 156, 103, 38,  174, 223, 0,   0,   0,   44,  180, 194, 244, 58,  242,
+    88,  0,   30,  227, 200, 15,  0,   141, 0,   37,  93,  171, 42,  207, 7,   143, 0,   0,   187,
+    19,  243, 191, 0,   0,   0,   16,  0,   190, 112, 125, 71,  0,   126, 130, 105, 0,   0,   0,
+    217, 154, 0,   37,  203, 0,   234, 0,   222, 0,   42,  0,   54,  39,  251, 0,   124, 149, 132,
+    0,   66,  47,  69,  146, 0,   68,  247, 0,   32,  33,  62,  208, 96,  130, 227, 18,  20,  233,
+    107, 0,   191, 0,   217, 50,  52,  96};
 
 int UnmangledHashG(const char *key, const int *T)
 {
@@ -275,7 +264,7 @@
     for (int i = 0; key[i] != '\0'; i++)
     {
         sum += T[i] * key[i];
-        sum %= 306;
+        sum %= 255;
     }
     return unmangledkG[sum];
 }
@@ -285,7 +274,7 @@
     if (strlen(key) > 26)
         return 0;
 
-    return (UnmangledHashG(key, unmangledkT1) + UnmangledHashG(key, unmangledkT2)) % 306;
+    return (UnmangledHashG(key, unmangledkT1) + UnmangledHashG(key, unmangledkT2)) % 255;
 }
 
 }  // namespace
diff --git a/src/compiler/translator/ImmutableString_autogen.cpp b/src/compiler/translator/ImmutableString_autogen.cpp
index 60985b6..1a52fc2 100644
--- a/src/compiler/translator/ImmutableString_autogen.cpp
+++ b/src/compiler/translator/ImmutableString_autogen.cpp
@@ -24,285 +24,260 @@
 namespace
 {
 
-constexpr int mangledkT1[] = {2743, 4229, 3268, 910,  860,  1581, 1730, 2644, 3296, 1182,
-                              336,  1125, 2239, 1930, 1402, 1665, 93,   4278, 2298, 3429,
-                              2058, 1912, 4086, 886,  2174, 306,  818,  938,  2318, 2482,
-                              531,  792,  3207, 1068, 1949, 1129, 324,  3475, 1781, 797};
-constexpr int mangledkT2[] = {680,  267,  2903, 1702, 3372, 949,  3371, 1697, 2772, 741,
-                              844,  1764, 3151, 3565, 1630, 1762, 4174, 833,  2973, 2727,
-                              4172, 1737, 419,  3540, 831,  2685, 2708, 801,  1970, 3933,
-                              1222, 2659, 1843, 443,  3831, 3904, 1926, 2027, 2723, 1430};
+constexpr int mangledkT1[] = {2216, 3725, 127,  2318, 200,  1655, 3038, 1689, 2145, 1506,
+                              931,  595,  1212, 1467, 1988, 610,  3815, 2450, 2452, 3604,
+                              3552, 1371, 613,  1288, 2483, 418,  3009, 2301, 3782, 2798,
+                              1955, 2142, 2519, 1173, 1372, 3609, 2524, 3789, 1060, 2098};
+constexpr int mangledkT2[] = {3633, 3177, 1005, 667,  2676, 2669, 443,  3890, 477,  2192,
+                              2479, 2092, 1008, 1769, 3184, 765,  1399, 742,  3116, 2696,
+                              89,   421,  2102, 3651, 1015, 3051, 3653, 425,  3015, 2859,
+                              3777, 3823, 2021, 371,  855,  169,  2596, 1654, 2910, 1392};
 constexpr int mangledkG[]  = {
-    0,    0,    0,    0,    0,    0,    0,    2775, 0,    0,    0,    0,    0,    1401, 2314, 0,
-    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    3539, 0,    0,    4069, 0,    0,
-    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    4147, 0,    0,    1434, 0,
-    0,    0,    0,    0,    0,    2775, 0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-    1918, 0,    0,    0,    0,    228,  0,    0,    1334, 2967, 0,    0,    0,    0,    0,    0,
-    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-    0,    0,    0,    0,    0,    0,    1638, 1276, 0,    0,    0,    1307, 0,    1868, 0,    0,
-    0,    2373, 0,    0,    0,    0,    618,  0,    3041, 0,    0,    2542, 408,  0,    78,   3685,
-    0,    0,    0,    3895, 0,    0,    1445, 0,    0,    0,    0,    0,    0,    4125, 813,  0,
-    0,    410,  0,    367,  0,    0,    0,    0,    0,    0,    0,    4024, 0,    2429, 516,  0,
-    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    4221, 139,  0,    0,    0,    0,
-    0,    0,    2307, 802,  0,    0,    2413, 0,    0,    0,    0,    949,  0,    0,    0,    0,
-    0,    0,    0,    0,    0,    0,    0,    4092, 0,    0,    0,    2452, 2441, 0,    0,    1984,
-    0,    0,    1700, 2464, 0,    0,    0,    3230, 0,    0,    2423, 0,    496,  0,    0,    0,
-    0,    0,    2875, 0,    0,    0,    0,    0,    1056, 1356, 525,  1334, 0,    0,    0,    3367,
-    0,    0,    0,    0,    0,    0,    0,    0,    0,    2057, 0,    0,    0,    0,    0,    0,
-    0,    0,    702,  662,  0,    887,  0,    0,    1976, 1347, 0,    0,    0,    2653, 0,    0,
-    2986, 0,    0,    0,    0,    0,    0,    3259, 0,    0,    3127, 0,    0,    3966, 0,    223,
-    0,    0,    603,  1374, 712,  0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    2410,
-    0,    0,    389,  0,    0,    3676, 0,    0,    3460, 0,    0,    0,    0,    0,    1447, 0,
-    1441, 1653, 0,    0,    1112, 0,    0,    0,    0,    1091, 283,  0,    33,   0,    0,    0,
-    0,    0,    852,  0,    0,    0,    2908, 230,  0,    0,    0,    0,    2812, 0,    0,    0,
-    0,    0,    0,    4253, 0,    0,    0,    0,    626,  0,    1650, 0,    0,    1199, 0,    0,
-    0,    0,    0,    0,    3697, 3032, 0,    0,    0,    3754, 3747, 0,    0,    3586, 0,    968,
-    3907, 0,    0,    1607, 0,    0,    0,    0,    0,    3273, 0,    0,    3839, 0,    0,    0,
-    3159, 0,    504,  0,    0,    0,    0,    2337, 0,    430,  0,    0,    1902, 0,    0,    0,
-    0,    0,    2373, 0,    0,    546,  0,    0,    0,    0,    377,  0,    0,    0,    0,    0,
-    0,    538,  0,    0,    1078, 0,    695,  1910, 849,  208,  4063, 1145, 0,    0,    0,    0,
-    0,    2597, 0,    0,    0,    0,    0,    2164, 0,    0,    0,    3612, 0,    0,    0,    4103,
-    0,    0,    0,    0,    0,    1821, 766,  350,  400,  0,    0,    0,    0,    0,    0,    10,
-    3031, 2862, 2613, 0,    724,  0,    0,    0,    0,    0,    1006, 0,    3337, 0,    0,    0,
-    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    1296, 0,
-    0,    2420, 0,    4277, 3458, 0,    0,    0,    0,    0,    0,    462,  0,    1491, 1720, 0,
-    0,    1690, 0,    0,    0,    2786, 1590, 3852, 3726, 0,    361,  1563, 0,    0,    3371, 4259,
-    1235, 0,    0,    783,  0,    0,    141,  164,  55,   0,    0,    2042, 3049, 0,    0,    0,
-    1188, 0,    0,    1262, 0,    0,    0,    0,    0,    329,  0,    0,    0,    0,    1059, 0,
-    0,    3895, 0,    0,    0,    0,    0,    0,    0,    0,    0,    3802, 1272, 0,    0,    0,
-    0,    4279, 152,  0,    0,    1318, 0,    1103, 2001, 0,    2513, 0,    0,    0,    0,    524,
-    0,    0,    415,  0,    3081, 2569, 0,    0,    164,  0,    0,    0,    0,    0,    0,    3880,
-    0,    328,  0,    0,    0,    0,    0,    0,    0,    0,    1271, 0,    0,    0,    0,    0,
-    0,    2663, 0,    2951, 3334, 2832, 1054, 945,  0,    1175, 2669, 3868, 0,    0,    3873, 0,
-    2252, 4012, 3870, 0,    0,    0,    0,    162,  0,    0,    0,    0,    0,    0,    0,    0,
-    461,  0,    962,  3875, 0,    0,    0,    1762, 665,  3951, 0,    0,    0,    2007, 3731, 1986,
-    0,    0,    0,    1690, 0,    1597, 0,    1082, 4280, 0,    1531, 0,    0,    33,   0,    0,
-    0,    0,    0,    0,    1273, 0,    0,    952,  0,    0,    0,    0,    1025, 174,  0,    0,
-    0,    0,    0,    1511, 220,  0,    0,    0,    0,    0,    0,    772,  2603, 363,  0,    0,
-    0,    0,    0,    0,    0,    1457, 0,    0,    1492, 3298, 0,    1015, 0,    0,    2516, 39,
-    0,    1621, 282,  3845, 4229, 0,    1841, 0,    0,    0,    0,    854,  2217, 0,    0,    4222,
-    0,    928,  0,    0,    0,    1497, 0,    87,   0,    1814, 0,    2009, 0,    0,    0,    1943,
-    3767, 2080, 0,    0,    0,    0,    890,  3718, 0,    0,    0,    0,    0,    122,  0,    557,
-    3246, 3879, 726,  2140, 0,    0,    0,    0,    0,    1342, 0,    0,    640,  0,    0,    0,
-    0,    3488, 75,   455,  1633, 3886, 0,    0,    450,  276,  635,  4303, 0,    902,  0,    4224,
-    3563, 0,    0,    0,    167,  0,    0,    0,    618,  0,    0,    0,    2264, 0,    1840, 0,
-    0,    0,    79,   0,    0,    0,    0,    1911, 0,    0,    1985, 2542, 0,    0,    0,    0,
-    629,  0,    1060, 4165, 3516, 1371, 294,  0,    0,    0,    0,    0,    3197, 3505, 0,    0,
-    0,    2496, 0,    0,    0,    577,  0,    129,  4201, 0,    0,    3032, 0,    1191, 0,    3255,
-    0,    1822, 0,    1759, 0,    0,    704,  0,    0,    0,    2693, 3956, 0,    976,  0,    0,
-    3146, 0,    661,  467,  295,  0,    0,    3930, 2685, 0,    1443, 0,    0,    1064, 799,  0,
-    0,    0,    0,    0,    313,  271,  1814, 0,    264,  1578, 0,    0,    0,    119,  0,    2704,
-    0,    0,    3846, 513,  0,    0,    0,    0,    0,    0,    0,    0,    3986, 2208, 989,  0,
-    1208, 3028, 0,    0,    3738, 0,    3933, 0,    0,    0,    160,  1689, 0,    4258, 0,    2732,
-    531,  0,    0,    179,  0,    0,    0,    2896, 2326, 0,    1124, 0,    4216, 2033, 0,    0,
-    1979, 0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    943,  0,    0,    586,
-    0,    1069, 980,  3259, 0,    598,  0,    0,    606,  1847, 0,    420,  0,    0,    0,    0,
-    0,    0,    0,    0,    0,    0,    4289, 3572, 0,    669,  0,    0,    0,    2071, 0,    0,
-    0,    0,    1045, 2161, 0,    180,  0,    91,   0,    583,  0,    1210, 76,   0,    0,    0,
-    134,  0,    3808, 371,  0,    743,  0,    0,    0,    0,    0,    329,  1558, 0,    515,  0,
-    1897, 1517, 0,    0,    0,    4247, 1406, 3798, 2347, 1886, 1971, 0,    0,    0,    0,    0,
-    2150, 0,    357,  0,    0,    0,    127,  0,    0,    0,    889,  3318, 370,  0,    0,    4187,
-    0,    0,    311,  0,    0,    0,    0,    0,    3932, 0,    0,    3692, 0,    334,  0,    0,
-    0,    799,  0,    1774, 0,    3743, 3573, 0,    0,    0,    0,    0,    1790, 0,    4140, 0,
-    545,  0,    0,    683,  0,    649,  3684, 0,    0,    956,  0,    0,    0,    1454, 0,    0,
-    0,    0,    1294, 1350, 0,    1141, 0,    608,  0,    506,  0,    0,    1100, 879,  0,    0,
-    699,  459,  2256, 772,  690,  0,    0,    0,    2892, 0,    0,    1488, 219,  0,    848,  240,
-    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    833,  1555, 0,    3696, 0,
-    0,    572,  0,    279,  0,    0,    0,    2668, 0,    2117, 0,    0,    0,    0,    0,    3401,
-    3933, 0,    1969, 0,    0,    0,    0,    70,   0,    0,    917,  0,    0,    0,    1109, 0,
-    0,    1708, 1459, 0,    1742, 0,    0,    0,    1246, 0,    0,    0,    0,    1565, 0,    0,
-    0,    0,    3489, 1923, 1587, 0,    0,    374,  0,    3728, 0,    0,    0,    1444, 2351, 0,
-    550,  184,  0,    0,    0,    0,    3176, 0,    0,    0,    1055, 0,    1051, 0,    1559, 0,
-    464,  3426, 0,    0,    4281, 0,    0,    0,    0,    0,    0,    1393, 0,    124,  0,    190,
-    0,    0,    3772, 0,    0,    0,    0,    0,    0,    0,    0,    483,  0,    0,    578,  1203,
-    0,    0,    2191, 0,    1564, 0,    0,    0,    0,    0,    2662, 0,    724,  0,    6,    203,
-    0,    1985, 0,    1418, 500,  0,    2216, 556,  2144, 763,  0,    0,    469,  594,  1664, 0,
-    607,  0,    3288, 2626, 0,    2427, 0,    0,    152,  0,    0,    3655, 3588, 0,    0,    0,
-    0,    0,    0,    3966, 0,    2408, 4227, 1093, 0,    1838, 0,    0,    0,    1278, 0,    0,
-    2130, 3949, 3123, 3627, 0,    1421, 0,    1926, 0,    0,    0,    0,    0,    0,    2859, 2609,
-    2102, 3973, 1993, 460,  0,    0,    0,    1613, 0,    734,  1302, 0,    0,    3084, 0,    0,
-    0,    377,  341,  0,    0,    1560, 0,    1127, 0,    542,  248,  3643, 145,  0,    0,    235,
-    1788, 1508, 0,    0,    0,    3445, 0,    1150, 0,    2063, 0,    0,    386,  2022, 0,    0,
-    236,  752,  3339, 57,   2534, 28,   0,    36,   0,    2881, 80,   556,  0,    0,    0,    2502,
-    0,    3590, 0,    0,    630,  0,    0,    611,  3695, 0,    3922, 1224, 458,  0,    542,  0,
-    0,    0,    64,   1038, 0,    0,    2993, 0,    0,    0,    2592, 0,    0,    0,    1376, 0,
-    0,    3490, 1289, 0,    106,  615,  3616, 0,    3083, 0,    4040, 0,    0,    0,    0,    0,
-    0,    1958, 1634, 2040, 3673, 1421, 0,    452,  1457, 1612, 0,    0,    1268, 2391, 0,    0,
-    0,    1398, 421,  0,    0,    0,    0,    0,    859,  0,    0,    1028, 3496, 3479, 0,    0,
-    0,    284,  0,    1885, 1043, 3591, 0,    0,    0,    0,    569,  0,    3251, 3152, 471,  3576,
-    0,    1808, 948,  1966, 0,    0,    0,    0,    0,    2466, 598,  183,  0,    0,    0,    1139,
-    0,    0,    0,    0,    0,    661,  0,    2060, 386,  3989, 3792, 601,  496,  1777, 1477, 1345,
-    1886, 0,    0,    0,    0,    1151, 0,    149,  0,    2055, 3801, 0,    2042, 1782, 0,    2089,
-    0,    0,    1047, 1198, 1234, 0,    0,    1082, 1408, 1500, 0,    0,    234,  2332, 3403, 3837,
-    1597, 0,    0,    1270, 1229, 1541, 89,   1344, 0,    0,    0,    3828, 908,  0,    0,    2408,
-    1442, 853,  0,    4093, 0,    759,  0,    0,    1446, 3811, 989,  0,    4191, 1960, 0,    495,
-    891,  0,    741,  3641, 0,    3372, 1267, 1758, 0,    0,    3830, 4222, 0,    606,  0,    0,
-    0,    2442, 0,    894,  1310, 963,  0,    0,    0,    2927, 1919, 356,  0,    18,   0,    0,
-    4293, 4149, 2320, 3203, 0,    3160, 3911, 0,    3697, 2012, 2705, 0,    0,    0,    4011, 0,
-    0,    0,    4157, 1717, 0,    0,    1080, 1400, 388,  471,  2098, 0,    133,  1369, 0,    0,
-    446,  592,  0,    0,    1761, 575,  1889, 0,    0,    0,    1489, 3050, 0,    0,    73,   3729,
-    493,  34,   328,  2899, 207,  550,  2305, 579,  0,    0,    3208, 1335, 1370, 4187, 263,  799,
-    0,    0,    3807, 1527, 0,    3046, 0,    385,  0,    93,   0,    539,  2492, 314,  2134, 949,
-    2393, 3700, 885,  20,   0,    0,    2856, 1153, 0,    0,    0,    0,    1063, 0,    0,    0,
-    2434, 4294, 0,    1034, 0,    0,    0,    0,    0,    0,    678,  1342, 2931, 1261, 0,    0,
-    1916, 0,    0,    1588, 0,    736,  37,   808,  1062, 846,  264,  1242, 3458, 0,    355,  678,
-    767,  0,    3953, 3897, 0,    0,    0,    0,    1979, 0,    0,    399,  0,    0,    0,    1169,
-    946,  0,    0,    0,    2265, 1354, 1237, 0,    0,    0,    0,    0,    2775, 0,    254,  2877,
-    0,    3765, 0,    0,    466,  3396, 0,    0,    1460, 171,  3031, 1337, 1691, 0,    0,    3662,
-    1601, 0,    2852, 3592, 373,  1115, 0,    588,  0,    0,    0,    1468, 0,    3886, 3674, 173,
-    3592, 0,    0,    1819, 0,    3991, 3633, 0,    0,    4153, 2986, 0,    0,    105,  2659, 0,
-    0,    1694, 0,    900,  0,    1200, 0,    0,    952,  1731, 0,    2963, 0,    1811, 0,    619,
-    0,    3951, 0,    453,  0,    555,  639,  2060, 3284, 1334, 0,    381,  3300, 0,    0,    0,
-    618,  263,  3996, 1189, 0,    0,    2500, 0,    394,  0,    0,    1740, 0,    3158, 3281, 975,
-    0,    421,  3933, 909,  801,  0,    0,    321,  0,    1526, 0,    1389, 0,    2195, 0,    4296,
-    734,  0,    0,    3984, 536,  752,  4213, 156,  134,  0,    3669, 0,    0,    3061, 0,    0,
-    0,    2245, 0,    0,    564,  3225, 3181, 448,  0,    0,    2997, 0,    0,    0,    0,    3188,
-    0,    1834, 0,    0,    2372, 0,    26,   358,  582,  1401, 0,    0,    0,    1540, 1424, 1865,
-    0,    4269, 673,  2536, 576,  1287, 899,  1174, 0,    0,    909,  0,    694,  0,    0,    3271,
-    3350, 211,  0,    0,    1798, 993,  0,    3216, 3503, 0,    1879, 0,    0,    158,  1817, 0,
-    0,    0,    582,  94,   1265, 4250, 0,    2486, 3792, 0,    0,    0,    0,    3992, 0,    4028,
-    3379, 0,    0,    252,  3874, 2446, 2284, 3556, 0,    0,    0,    1338, 0,    266,  0,    0,
-    0,    0,    571,  3464, 0,    0,    168,  0,    0,    1687, 1135, 0,    0,    551,  0,    1383,
-    1303, 340,  0,    1898, 1092, 0,    204,  0,    2128, 0,    1428, 773,  4245, 94,   874,  1329,
-    1970, 2420, 0,    0,    0,    500,  1751, 1884, 1152, 543,  0,    1708, 121,  994,  12,   0,
-    0,    2293, 0,    0,    0,    0,    0,    0,    611,  2119, 0,    0,    116,  0,    518,  0,
-    3599, 855,  0,    781,  0,    2049, 3285, 586,  0,    1034, 419,  965,  3050, 901,  954,  1303,
-    0,    102,  1162, 1405, 456,  1791, 0,    3778, 0,    0,    1864, 1773, 0,    1120, 0,    0,
-    2244, 3393, 3098, 4259, 0,    246,  0,    0,    131,  0,    3154, 0,    814,  0,    0,    1976,
-    0,    558,  0,    256,  0,    1932, 4240, 0,    398,  0,    2703, 1657, 0,    1863, 1210, 0,
-    1563, 1503, 0,    0,    2719, 2435, 3696, 273,  0,    2068, 0,    4168, 3922, 1757, 1108, 0,
-    1773, 18,   0,    3625, 495,  786,  0,    0,    1765, 0,    0,    0,    1664, 0,    783,  2591,
-    0,    43,   0,    1426, 1129, 559,  0,    0,    1296, 929,  283,  0,    0,    1092, 967,  137,
-    3824, 3951, 2101, 0,    1002, 0,    687,  1752, 2506, 0,    97,   0,    0,    2138, 0,    2856,
-    1556, 0,    0,    36,   1283, 0,    1356, 0,    1116, 1706, 0,    0,    3266, 2724, 196,  3946,
-    0,    31,   3972, 0,    0,    399,  4195, 2626, 0,    390,  0,    100,  812,  0,    1834, 1514,
-    0,    1360, 0,    0,    0,    631,  1102, 0,    4190, 149,  0,    1717, 1445, 0,    215,  0,
-    41,   0,    0,    243,  0,    0,    0,    1712, 0,    3405, 0,    1255, 518,  3794, 4279, 464,
-    810,  2146, 4134, 1040, 0,    0,    2320, 0,    0,    0,    1024, 0,    1536, 0,    710,  0,
-    0,    904,  0,    0,    932,  0,    1385, 3806, 0,    1486, 2431, 0,    0,    153,  0,    575,
-    0,    2156, 4178, 0,    4107, 228,  3780, 3356, 0,    1895, 818,  0,    1454, 0,    3604, 697,
-    0,    0,    1116, 1327, 1792, 3695, 2368, 1472, 0,    2007, 0,    456,  1883, 1732, 0,    1151,
-    1571, 0,    0,    0,    964,  797,  0,    1239, 3425, 0,    0,    63,   1750, 0,    0,    0,
-    0,    0,    3923, 0,    1131, 403,  1575, 1081, 871,  1825, 3911, 0,    746,  424,  0,    1,
-    0,    949,  4056, 0,    0,    1214, 0,    2429, 0,    0,    0,    1536, 3298, 1155, 1851, 1312,
-    0,    1795, 1906, 0,    0,    2993, 0,    82,   0,    0,    1967, 0,    0,    0,    1233, 363,
-    832,  1676, 0,    0,    3653, 1931, 879,  1213, 2048, 1714, 0,    1568, 0,    0,    1062, 4059,
-    0,    2404, 3069, 0,    0,    0,    0,    0,    0,    365,  0,    0,    184,  2028, 1337, 0,
-    0,    0,    4091, 950,  2053, 2042, 541,  2938, 1603, 1725, 0,    0,    2573, 0,    1086, 550,
-    1206, 934,  0,    0,    1613, 3691, 2023, 1393, 828,  149,  0,    2069, 0,    1326, 2605, 0,
-    0,    0,    1575, 0,    1113, 0,    0,    1071, 0,    1943, 3820, 0,    130,  0,    0,    891,
-    0,    3988, 0,    3287, 0,    0,    570,  0,    0,    1332, 1056, 0,    0,    3315, 983,  404,
-    5,    451,  686,  0,    0,    3542, 0,    563,  0,    0,    817,  4134, 2845, 3460, 0,    224,
-    2173, 428,  392,  3334, 181,  0,    0,    1453, 0,    0,    1152, 1431, 2287, 347,  0,    3980,
-    1299, 0,    0,    2965, 0,    2019, 0,    1995, 121,  925,  0,    0,    0,    1062, 4220, 838,
-    3388, 809,  0,    0,    0,    0,    1208, 1826, 0,    0,    503,  530,  0,    0,    1309, 0,
-    0,    742,  4201, 0,    0,    0,    709,  2651, 0,    803,  96,   0,    1112, 2573, 0,    0,
-    0,    1745, 1120, 2844, 0,    0,    2871, 0,    123,  0,    2104, 721,  0,    0,    0,    1657,
-    0,    3350, 110,  0,    2909, 623,  205,  0,    2817, 1711, 1864, 2706, 0,    0,    0,    0,
-    0,    3637, 0,    0,    0,    0,    0,    155,  1420, 1464, 0,    152,  0,    0,    0,    533,
-    1907, 181,  0,    217,  2325, 0,    0,    11,   3800, 1753, 0,    1744, 0,    2810, 2021, 0,
-    1009, 0,    0,    0,    0,    112,  0,    3071, 0,    2592, 574,  0,    0,    0,    603,  1789,
-    3165, 0,    3402, 0,    0,    0,    0,    911,  1100, 0,    261,  1635, 2047, 1373, 2499, 0,
-    0,    0,    160,  0,    11,   0,    0,    1815, 0,    0,    54,   711,  0,    109,  0,    0,
-    1184, 1834, 3799, 1985, 0,    0,    0,    1436, 4134, 1355, 2681, 1825, 0,    0,    0,    0,
-    127,  341,  112,  1999, 3801, 3414, 1290, 0,    0,    1548, 0,    0,    1134, 0,    0,    4206,
-    0,    86,   1445, 0,    0,    76,   0,    1789, 0,    0,    1611, 4189, 1153, 77,   3174, 0,
-    0,    1912, 0,    1406, 0,    0,    683,  936,  0,    0,    0,    0,    600,  0,    48,   726,
-    0,    0,    1258, 2024, 2882, 0,    1248, 0,    1617, 1898, 4193, 0,    1580, 837,  0,    0,
-    2826, 1033, 2523, 4226, 212,  0,    0,    3920, 126,  984,  116,  0,    0,    4082, 0,    814,
-    4214, 2603, 1042, 0,    24,   0,    229,  1210, 0,    0,    913,  3566, 3809, 1214, 0,    1500,
-    821,  770,  0,    0,    0,    0,    2348, 1482, 0,    104,  2014, 508,  3207, 2668, 409,  0,
-    1581, 0,    3900, 0,    1865, 1379, 1458, 0,    0,    0,    3955, 1462, 652,  2444, 4230, 0,
-    327,  885,  0,    1873, 90,   1198, 0,    637,  1553, 1027, 0,    913,  297,  0,    1914, 695,
-    0,    0,    2435, 2135, 983,  0,    0,    0,    0,    0,    3472, 1022, 0,    1748, 0,    3195,
-    0,    0,    1477, 0,    482,  0,    0,    0,    0,    0,    1396, 0,    0,    0,    0,    1157,
-    1780, 0,    1220, 3381, 0,    1534, 1115, 642,  1579, 1333, 0,    0,    2555, 0,    800,  3846,
-    0,    0,    4065, 1107, 0,    0,    0,    695,  0,    3889, 1542, 3897, 0,    1582, 0,    146,
-    0,    1380, 0,    2558, 0,    0,    1513, 0,    1458, 1704, 1709, 0,    4308, 1256, 898,  0,
-    0,    1177, 159,  0,    1792, 1773, 2254, 0,    0,    0,    1314, 2788, 0,    0,    0,    1454,
-    1776, 2574, 2011, 2056, 1519, 3731, 693,  0,    0,    791,  0,    929,  556,  2867, 1315, 0,
-    0,    914,  2817, 0,    0,    0,    1977, 932,  0,    3231, 0,    0,    0,    202,  2547, 1852,
-    1348, 4286, 0,    402,  0,    1319, 0,    3102, 0,    481,  875,  0,    0,    1450, 3973, 1379,
-    0,    0,    0,    638,  0,    573,  0,    2417, 1543, 0,    0,    0,    115,  171,  0,    0,
-    1505, 1218, 3571, 1759, 0,    3450, 1038, 198,  439,  0,    6,    3697, 906,  3460, 0,    120,
-    2175, 1919, 1653, 0,    1736, 2116, 121,  4147, 1391, 0,    30,   101,  106,  3753, 3957, 0,
-    378,  2410, 0,    1582, 0,    0,    0,    0,    0,    733,  0,    3453, 2651, 0,    3976, 0,
-    1899, 0,    2425, 616,  4127, 0,    1728, 3580, 2415, 0,    0,    0,    0,    1447, 1797, 1750,
-    0,    0,    0,    0,    385,  0,    0,    725,  1698, 0,    708,  855,  54,   874,  1500, 923,
-    2067, 3403, 0,    0,    4264, 239,  712,  2639, 3843, 0,    0,    897,  1294, 1849, 978,  3470,
-    0,    0,    1029, 0,    1209, 895,  0,    475,  0,    0,    0,    0,    810,  0,    2388, 922,
-    3241, 1745, 0,    3957, 0,    0,    13,   0,    0,    1087, 1774, 0,    1320, 409,  1804, 2883,
-    0,    532,  0,    1987, 2166, 0,    1126, 0,    4078, 0,    4147, 354,  3332, 0,    4114, 0,
-    3557, 0,    0,    0,    0,    1767, 79,   1666, 288,  2059, 0,    857,  2460, 2065, 0,    953,
-    259,  0,    390,  572,  0,    0,    0,    671,  232,  589,  0,    3712, 726,  1927, 0,    0,
-    0,    0,    0,    418,  0,    3536, 1547, 566,  1552, 191,  3836, 0,    0,    3494, 717,  0,
-    0,    0,    269,  0,    847,  0,    3519, 0,    651,  2459, 2031, 0,    647,  0,    1113, 4298,
-    511,  485,  0,    903,  1679, 3829, 3731, 0,    0,    3049, 415,  0,    1313, 2005, 813,  0,
-    2235, 0,    1523, 0,    1204, 0,    0,    534,  1171, 1195, 3966, 0,    3143, 0,    1656, 3888,
-    0,    1216, 2066, 966,  1769, 0,    0,    1361, 0,    1869, 0,    2110, 0,    0,    1057, 2581,
-    1270, 1978, 0,    4180, 888,  0,    1075, 4051, 4222, 1612, 2011, 1562, 0,    0,    0,    2377,
-    1292, 0,    4106, 954,  498,  4189, 1321, 783,  583,  0,    281,  1050, 0,    165,  0,    1096,
-    733,  0,    0,    1930, 0,    0,    0,    171,  2114, 2421, 2800, 1958, 1649, 0,    0,    1220,
-    1561, 614,  0,    242,  0,    66,   0,    2131, 0,    3670, 1563, 0,    0,    41,   0,    0,
-    4132, 0,    0,    0,    0,    0,    1225, 0,    0,    852,  1661, 0,    83,   2101, 1652, 3259,
-    4187, 1778, 0,    0,    607,  0,    4202, 4255, 3933, 205,  0,    4282, 0,    885,  0,    0,
-    950,  149,  1345, 1011, 0,    731,  1016, 0,    3807, 3912, 3512, 4196, 0,    894,  0,    319,
-    0,    0,    2032, 0,    687,  1949, 1117, 60,   0,    0,    1322, 0,    620,  243,  3314, 0,
-    0,    0,    827,  657,  1374, 0,    0,    1956, 716,  3273, 0,    3442, 599,  0,    187,  0,
-    0,    1721, 933,  2038, 0,    3807, 1061, 653,  0,    2464, 1614, 0,    0,    0,    634,  4054,
-    582,  4259, 0,    656,  4084, 1953, 0,    0,    533,  0,    0,    0,    1652, 3693, 1341, 1266,
-    4279, 1599, 0,    3614, 0,    0,    0,    0,    1608, 4177, 0,    4120, 0,    771,  724,  1672,
-    0,    3890, 0,    0,    0,    2234, 161,  0,    0,    3658, 1041, 371,  218,  0,    2103, 0,
-    1259, 1303, 3940, 501,  2086, 785,  0,    990,  0,    2736, 121,  0,    0,    182,  0,    2486,
-    3502, 4141, 1675, 1520, 0,    961,  0,    0,    2172, 1603, 0,    0,    199,  333,  1642, 1700,
-    0,    1688, 2881, 600,  0,    1131, 4,    4227, 0,    0,    0,    0,    1116, 1659, 1152, 4190,
-    3952, 0,    3301, 2348, 4073, 0,    343,  4040, 0,    0,    2533, 2896, 1917, 1258, 0,    0,
-    0,    4297, 0,    0,    0,    3057, 1546, 0,    427,  0,    2129, 0,    0,    1525, 0,    0,
-    0,    2299, 0,    828,  3382, 2657, 15,   3142, 308,  1332, 0,    1699, 1377, 0,    515,  0,
-    0,    1807, 0,    4225, 1516, 3476, 1537, 2385, 1755, 477,  0,    0,    0,    654,  2377, 958,
-    0,    3739, 9,    63,   0,    1161, 1706, 0,    604,  3941, 0,    108,  0,    764,  364,  2120,
-    4217, 3155, 2010, 3249, 460,  584,  1516, 3527, 4191, 998,  626,  3063, 0,    0,    1110, 3608,
-    379,  0,    4058, 0,    1449, 1229, 1344, 3075, 3088, 3487, 1018, 3992, 886,  0,    532,  0,
-    0,    2232, 0,    0,    1510, 0,    252,  4262, 0,    3431, 1407, 1897, 640,  153,  0,    3758,
-    39,   4194, 0,    0,    3878, 0,    4143, 1937, 3329, 3528, 3566, 4074, 499,  332,  1497, 1674,
-    4135, 854,  397,  3371, 0,    0,    594,  0,    2994, 776,  0,    1114, 1336, 3259, 0,    1338,
-    0,    3262, 78,   4238, 328,  3357, 2085, 0,    364,  3639, 0,    0,    534,  0,    566,  0,
-    1023, 0,    2973, 0,    2157, 0,    1667, 0,    356,  0,    147,  1916, 4087, 4095, 33,   1871,
-    0,    1130, 3091, 919,  1168, 1403, 370,  779,  4026, 0,    3401, 649,  0,    3426, 0,    0,
-    0,    0,    2282, 1654, 3177, 253,  4125, 0,    717,  4235, 146,  0,    1397, 445,  3074, 0,
-    0,    3320, 0,    1974, 0,    3775, 0,    1523, 0,    1637, 973,  1159, 0,    0,    1948, 3690,
-    0,    749,  0,    3830, 756,  389,  1412, 0,    900,  0,    0,    0,    0,    0,    842,  58,
-    3903, 0,    1200, 0,    0,    1148, 970,  1224, 1720, 1547, 0,    567,  0,    1840, 2084, 850,
-    0,    0,    3261, 0,    1154, 357,  0,    0,    0,    0,    0,    0,    2988, 3614, 2065, 471,
-    0,    3102, 1794, 0,    0,    792,  0,    492,  1613, 0,    807,  0,    1133, 0,    1658, 395,
-    2100, 2022, 3419, 352,  1853, 2082, 4251, 487,  378,  0,    0,    2534, 3014, 1501, 578,  3413,
-    0,    1424, 413,  4140, 402,  1854, 0,    1649, 944,  0,    3748, 0,    4137, 3167, 362,  998,
-    969,  2267, 0,    0,    107,  0,    278,  3416, 2542, 2436, 623,  796,  0,    0,    0,    3734,
-    1068, 0,    0,    0,    2253, 0,    4161, 451,  4260, 2544, 4101, 1914, 536,  866,  0,    1290,
-    1111, 0,    3321, 1045, 0,    801,  1869, 895,  3277, 671,  0,    0,    2523, 4145, 1950, 0,
-    1837, 1,    0,    0,    634,  0,    0,    0,    0,    1215, 1613, 0,    0,    0,    36,   0,
-    2200, 0,    427,  0,    2771, 856,  3304, 0,    0,    1699, 450,  3592, 4245, 0,    52,   792,
-    1431, 0,    0,    897,  1405, 969,  201,  2992, 0,    935,  0,    0,    2083, 0,    4158, 291,
-    1013, 732,  0,    0,    93,   3753, 0,    0,    0,    1615, 3887, 3705, 2000, 0,    2646, 0,
-    1703, 4046, 0,    1965, 867,  100,  722,  1757, 2783, 4024, 0,    691,  0,    0,    2646, 359,
-    198,  760,  0,    3956, 0,    4295, 1754, 1531, 361,  0,    0,    0,    0,    491,  0,    3482,
-    1652, 0,    0,    0,    9,    262,  570,  230,  1682, 0,    1364, 1465, 1639, 0,    188,  0,
-    138,  0,    0,    1911, 3323, 639,  0,    0,    1022, 435,  444,  3813, 1589, 3636, 2140, 3106,
-    0,    1463, 0,    1868, 0,    4180, 2094, 982,  0,    2259, 0,    2813, 3142, 1178, 3427, 0,
-    0,    3932, 1618, 913,  0,    0,    1401, 0,    0,    4111, 0,    0,    0,    3392, 0,    2559,
-    0,    1306, 2081, 1328, 2272, 0,    0,    0,    1270, 1085, 642,  0,    3915, 616,  92,   391,
-    0,    218,  330,  500,  0,    374,  3505, 1118, 331,  0,    3211, 2384, 0,    0,    186,  4045,
-    0,    4288, 623,  735,  0,    483,  0,    1130, 0,    2617, 1606, 747,  269,  3098, 539,  0,
-    2762, 0,    3536, 4142, 2917, 1039, 2460, 1049, 760,  0,    0,    0,    0,    0,    1435, 1369,
-    3828, 0,    0,    0,    0,    283,  0,    2020, 2046, 0,    3519, 1499, 1583, 0,    943,  778,
-    2064, 0,    3318, 2677, 4269, 0,    1681, 644,  613,  1768, 2877, 1392, 3590, 0,    0,    2035,
-    754,  671,  0,    0,    0,    0,    0,    3230, 494,  1690, 1577, 3604, 0,    321,  940,  111,
-    585,  0,    0,    1882, 0,    0,    1360, 0,    2888, 0,    0,    0,    2036, 4296, 1173, 3597,
-    4069, 536,  1616, 1528, 0,    801,  0,    0,    0,    1951, 869,  431,  3921, 223,  3411, 0,
-    320,  0,    2409, 745,  696,  478,  763,  0,    98,   1530, 1279, 1059, 1195, 2054, 0,    540,
-    1096, 2508, 0,    219,  1619, 0,    0,    2443, 0,    0,    1714, 1016, 1393, 1735, 0,    777,
-    132,  0,    0,    3372, 514,  370};
+    0,    0,    0,    0,    3391, 1306, 0,    0,    0,    0,    0,    0,    0,    0,    0,    1177,
+    0,    0,    0,    0,    846,  0,    0,    0,    0,    0,    0,    0,    475,  0,    2916, 240,
+    0,    0,    0,    1114, 0,    2623, 0,    89,   0,    0,    0,    0,    0,    1865, 0,    0,
+    2128, 0,    0,    0,    2280, 0,    0,    0,    0,    0,    0,    1760, 0,    799,  1672, 0,
+    0,    0,    0,    550,  0,    2959, 0,    0,    0,    0,    0,    0,    3876, 3420, 0,    0,
+    0,    145,  0,    1504, 0,    0,    2322, 0,    0,    0,    0,    455,  806,  2991, 0,    0,
+    0,    0,    0,    0,    0,    0,    0,    3358, 1989, 0,    0,    1891, 0,    994,  384,  0,
+    0,    0,    0,    0,    0,    0,    0,    1165, 0,    0,    0,    3640, 2710, 337,  586,  0,
+    0,    0,    0,    0,    3856, 0,    0,    0,    0,    3471, 0,    0,    2587, 0,    0,    0,
+    3248, 0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    2587, 0,
+    0,    0,    0,    0,    0,    0,    0,    1107, 395,  0,    0,    0,    0,    0,    3487, 0,
+    0,    0,    171,  1248, 534,  0,    2322, 0,    0,    1219, 0,    0,    0,    374,  0,    0,
+    0,    400,  0,    0,    0,    0,    0,    0,    0,    0,    2028, 0,    0,    0,    2861, 0,
+    1246, 0,    0,    0,    1827, 785,  1515, 2529, 396,  3160, 0,    0,    1536, 0,    130,  3124,
+    0,    0,    2640, 0,    0,    0,    0,    1078, 0,    0,    0,    0,    0,    0,    523,  0,
+    0,    710,  0,    2429, 0,    0,    469,  125,  0,    0,    0,    0,    0,    2539, 2295, 0,
+    2953, 2045, 1567, 1549, 0,    0,    1182, 0,    0,    0,    1189, 12,   0,    0,    825,  1610,
+    0,    2809, 2576, 0,    915,  0,    0,    3590, 0,    0,    957,  0,    2404, 0,    1210, 933,
+    0,    1055, 3237, 0,    82,   967,  0,    0,    886,  0,    0,    0,    0,    2060, 0,    0,
+    0,    866,  0,    1383, 2956, 0,    1533, 1265, 0,    1962, 1846, 0,    0,    60,   0,    0,
+    0,    282,  849,  0,    0,    0,    0,    0,    0,    3429, 1138, 3410, 0,    0,    0,    0,
+    1145, 0,    0,    1716, 2442, 1154, 1486, 0,    0,    0,    0,    0,    0,    3894, 0,    0,
+    0,    0,    0,    0,    0,    0,    35,   0,    0,    42,   0,    3799, 0,    0,    0,    3845,
+    0,    3148, 1307, 0,    1396, 0,    0,    662,  0,    2662, 3657, 0,    0,    1966, 0,    0,
+    1090, 605,  2805, 0,    0,    3323, 0,    833,  0,    116,  0,    531,  0,    915,  0,    0,
+    0,    0,    2450, 0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    888,  0,    835,
+    0,    0,    0,    439,  0,    0,    0,    1884, 0,    0,    0,    3296, 0,    0,    0,    2078,
+    0,    3622, 0,    1602, 0,    0,    0,    0,    0,    1352, 0,    0,    0,    0,    0,    0,
+    0,    0,    2097, 0,    0,    0,    2158, 3419, 683,  0,    0,    0,    0,    0,    0,    0,
+    0,    0,    0,    1746, 0,    616,  0,    451,  3665, 263,  2364, 1155, 0,    2320, 3516, 1442,
+    1230, 0,    2014, 0,    826,  792,  2332, 332,  2014, 822,  0,    0,    0,    3218, 0,    1285,
+    0,    1851, 3068, 0,    0,    0,    0,    2129, 178,  0,    12,   0,    3552, 0,    0,    435,
+    0,    1344, 2182, 0,    444,  1831, 0,    0,    3666, 1940, 0,    0,    0,    0,    0,    2070,
+    1024, 0,    0,    0,    0,    1397, 2174, 0,    0,    0,    1576, 3367, 1033, 1737, 0,    1869,
+    1474, 0,    0,    2978, 1675, 2971, 0,    0,    0,    0,    3822, 0,    1263, 2920, 1016, 0,
+    2321, 0,    3848, 0,    0,    0,    3654, 0,    0,    649,  0,    0,    0,    2961, 2504, 0,
+    763,  1491, 0,    1783, 0,    150,  0,    0,    0,    0,    132,  347,  0,    0,    3648, 1517,
+    570,  1928, 0,    1416, 1535, 0,    1674, 1325, 1531, 0,    3879, 1953, 0,    2763, 519,  3641,
+    0,    373,  687,  0,    0,    1754, 3304, 0,    2312, 3641, 0,    1430, 0,    0,    0,    0,
+    0,    814,  0,    0,    560,  0,    0,    0,    0,    1673, 0,    2735, 3468, 837,  0,    744,
+    1919, 0,    0,    0,    0,    0,    0,    0,    237,  3688, 1482, 0,    0,    0,    2447, 0,
+    0,    1899, 358,  0,    0,    0,    0,    0,    1699, 0,    3384, 3335, 1950, 0,    0,    0,
+    1481, 0,    209,  0,    0,    0,    31,   2969, 0,    0,    0,    0,    0,    0,    0,    0,
+    2301, 918,  633,  1216, 0,    78,   1375, 0,    3529, 0,    0,    0,    0,    486,  2797, 0,
+    1316, 159,  2470, 0,    1846, 0,    0,    3034, 1322, 0,    150,  0,    0,    2897, 197,  0,
+    0,    1945, 3802, 300,  0,    0,    0,    0,    0,    1653, 88,   0,    988,  2114, 0,    1029,
+    1887, 0,    1233, 936,  0,    0,    0,    317,  0,    0,    0,    0,    3054, 0,    0,    0,
+    2943, 862,  30,   0,    0,    304,  3108, 1846, 0,    45,   686,  0,    3588, 944,  0,    502,
+    804,  142,  1547, 3388, 3702, 0,    0,    0,    2383, 3204, 0,    0,    2694, 133,  3604, 1876,
+    138,  2994, 3423, 0,    0,    0,    0,    3378, 1939, 1675, 3244, 1325, 0,    0,    0,    0,
+    0,    0,    1574, 0,    0,    0,    2233, 565,  0,    1094, 1720, 0,    0,    13,   0,    1073,
+    1806, 0,    831,  708,  0,    0,    0,    0,    0,    0,    446,  0,    1472, 640,  688,  924,
+    3875, 1366, 0,    1812, 0,    888,  0,    763,  669,  0,    0,    493,  0,    856,  0,    2300,
+    0,    0,    0,    0,    3483, 0,    1729, 0,    0,    3295, 492,  0,    3128, 0,    0,    0,
+    0,    0,    0,    1076, 0,    0,    502,  269,  0,    0,    1464, 3203, 0,    0,    0,    1865,
+    0,    57,   0,    0,    0,    0,    1817, 0,    3330, 1292, 494,  234,  0,    0,    1843, 3460,
+    2059, 671,  1457, 875,  2926, 0,    1768, 3532, 283,  0,    3700, 3830, 3641, 3582, 2675, 0,
+    1138, 1750, 0,    0,    0,    864,  0,    0,    0,    0,    1967, 2092, 2014, 615,  466,  0,
+    2963, 1133, 3580, 1119, 0,    0,    0,    0,    0,    0,    0,    176,  1562, 156,  367,  0,
+    431,  3316, 1537, 0,    1553, 0,    0,    820,  1215, 882,  2182, 0,    3873, 0,    1992, 100,
+    0,    0,    0,    0,    0,    0,    3268, 1496, 1317, 548,  2767, 172,  0,    0,    0,    0,
+    0,    1173, 319,  0,    89,   0,    0,    0,    2950, 2161, 3020, 0,    0,    3061, 0,    2093,
+    0,    0,    0,    2358, 0,    0,    2039, 0,    2214, 1555, 863,  0,    0,    0,    0,    0,
+    1553, 2749, 630,  2152, 1082, 0,    1582, 521,  279,  798,  1141, 918,  0,    0,    0,    0,
+    0,    1144, 1905, 0,    2374, 0,    0,    0,    0,    2942, 531,  2238, 354,  0,    1803, 2068,
+    0,    0,    0,    53,   0,    0,    0,    0,    0,    569,  898,  0,    133,  1881, 0,    0,
+    0,    0,    0,    0,    0,    0,    0,    0,    48,   3734, 0,    627,  2550, 0,    0,    3376,
+    2551, 0,    1529, 0,    0,    1591, 995,  0,    1519, 0,    0,    2050, 0,    3491, 0,    361,
+    372,  0,    609,  0,    0,    1369, 0,    0,    0,    1063, 0,    1528, 0,    0,    0,    2667,
+    0,    0,    0,    1650, 3655, 3302, 0,    0,    649,  1678, 0,    0,    0,    0,    0,    0,
+    0,    891,  0,    0,    0,    0,    0,    2550, 3579, 733,  730,  672,  1225, 0,    0,    3569,
+    0,    0,    0,    3534, 0,    2032, 0,    1025, 973,  0,    434,  1252, 1290, 0,    0,    0,
+    2243, 0,    0,    0,    1677, 0,    1659, 1203, 1764, 1843, 0,    737,  2377, 0,    2258, 0,
+    429,  1115, 0,    1813, 1582, 0,    0,    1125, 2136, 863,  275,  2434, 0,    3744, 0,    479,
+    2145, 0,    0,    1113, 2089, 0,    0,    929,  0,    0,    0,    0,    0,    701,  2469, 0,
+    0,    0,    648,  0,    0,    293,  501,  1667, 245,  0,    1600, 3431, 0,    0,    1356, 0,
+    2283, 2096, 2982, 0,    1189, 0,    0,    3484, 320,  0,    0,    666,  73,   692,  789,  2686,
+    0,    77,   1013, 2288, 3007, 0,    0,    0,    0,    1256, 3299, 0,    2504, 34,   1197, 0,
+    953,  0,    0,    1382, 0,    0,    0,    0,    3334, 404,  0,    1146, 1551, 1212, 334,  0,
+    0,    3375, 0,    748,  1483, 877,  0,    0,    3032, 3014, 0,    0,    2198, 2009, 0,    3597,
+    0,    453,  234,  882,  0,    3735, 0,    2022, 1329, 0,    0,    948,  1714, 759,  286,  0,
+    1268, 3284, 835,  857,  0,    248,  1125, 3626, 3055, 0,    0,    0,    570,  479,  3518, 0,
+    3526, 744,  1212, 0,    3426, 0,    0,    3612, 3703, 2133, 0,    0,    0,    1934, 288,  0,
+    1101, 0,    0,    1810, 0,    0,    2923, 0,    178,  0,    0,    1017, 234,  32,   0,    0,
+    3772, 369,  0,    1015, 1810, 1931, 0,    1187, 662,  0,    1441, 1282, 0,    0,    455,  3366,
+    620,  844,  0,    0,    1799, 0,    395,  0,    0,    3554, 0,    0,    3466, 0,    2691, 1933,
+    0,    0,    1117, 0,    0,    0,    0,    2473, 0,    0,    0,    0,    2173, 894,  0,    891,
+    0,    2982, 2134, 384,  899,  1011, 3139, 0,    0,    0,    0,    0,    0,    2962, 998,  958,
+    0,    3742, 1777, 1029, 87,   0,    2283, 728,  0,    1144, 0,    0,    1451, 1650, 0,    3404,
+    836,  198,  3684, 0,    0,    3483, 0,    0,    1318, 3051, 0,    112,  0,    3361, 3,    1446,
+    0,    0,    602,  987,  0,    0,    0,    0,    905,  0,    0,    0,    1326, 1508, 0,    1557,
+    1322, 0,    1261, 1495, 0,    337,  0,    939,  0,    1526, 1559, 181,  1783, 0,    0,    1639,
+    0,    1147, 0,    0,    0,    0,    0,    1167, 66,   904,  1856, 0,    454,  631,  3775, 1668,
+    94,   1757, 0,    689,  2982, 3466, 976,  1216, 3854, 0,    2377, 0,    0,    865,  0,    0,
+    0,    0,    1834, 1544, 0,    0,    523,  0,    1862, 2388, 0,    0,    444,  0,    0,    2131,
+    1766, 2611, 1968, 0,    676,  0,    0,    571,  3802, 0,    394,  0,    0,    395,  0,    1807,
+    206,  140,  467,  0,    1960, 0,    439,  0,    372,  1379, 0,    392,  614,  3228, 2190, 0,
+    1852, 790,  815,  295,  1100, 0,    0,    437,  0,    0,    2065, 0,    3110, 0,    1551, 240,
+    2833, 0,    0,    783,  219,  2919, 3659, 0,    1092, 370,  1740, 749,  0,    0,    0,    1186,
+    0,    2035, 0,    3129, 0,    0,    1125, 208,  643,  2802, 0,    1901, 2417, 1584, 3155, 0,
+    2143, 684,  1369, 2372, 0,    905,  1264, 694,  3693, 0,    0,    1647, 0,    2265, 0,    306,
+    403,  1095, 0,    556,  1057, 0,    0,    0,    0,    2737, 0,    294,  1681, 2958, 0,    0,
+    0,    659,  279,  0,    0,    0,    2303, 2042, 0,    0,    1338, 404,  814,  0,    2254, 735,
+    0,    2098, 0,    3055, 374,  0,    0,    0,    1879, 2332, 0,    1702, 0,    0,    1653, 3573,
+    0,    0,    1936, 2455, 3013, 0,    2443, 0,    0,    0,    0,    3457, 0,    3368, 3784, 2129,
+    3827, 534,  0,    3505, 2171, 464,  1698, 1015, 3634, 1350, 2007, 0,    1640, 0,    322,  0,
+    0,    2052, 3752, 2344, 0,    0,    2131, 0,    0,    0,    443,  2953, 1696, 124,  3021, 2295,
+    174,  1751, 0,    1432, 0,    0,    0,    2137, 1166, 0,    3334, 0,    3060, 0,    0,    2395,
+    1083, 2805, 0,    2161, 0,    984,  0,    24,   0,    798,  2121, 1488, 177,  0,    0,    0,
+    1740, 3843, 0,    1422, 0,    0,    160,  0,    3545, 3086, 2600, 0,    0,    1551, 1425, 0,
+    892,  1614, 0,    450,  3797, 0,    0,    0,    190,  1258, 0,    0,    923,  92,   0,    2608,
+    0,    1159, 0,    691,  0,    430,  447,  2959, 1019, 1392, 3731, 2892, 1246, 0,    14,   3426,
+    0,    0,    0,    0,    0,    0,    2445, 0,    3583, 0,    707,  228,  269,  1031, 0,    2077,
+    3006, 0,    0,    453,  1245, 1243, 0,    3677, 0,    0,    0,    0,    0,    0,    2332, 3703,
+    1757, 3669, 798,  37,   2389, 0,    1058, 293,  3167, 1460, 3552, 3717, 0,    0,    709,  341,
+    0,    416,  2469, 0,    0,    71,   0,    0,    1180, 1320, 1736, 3121, 0,    323,  0,    0,
+    531,  2456, 1489, 0,    0,    0,    0,    0,    3158, 559,  7,    1305, 1365, 159,  0,    0,
+    973,  0,    1790, 0,    0,    0,    0,    0,    930,  0,    1776, 199,  3698, 2103, 15,   0,
+    0,    3176, 580,  0,    0,    1924, 0,    0,    0,    0,    0,    322,  0,    0,    2656, 440,
+    194,  3668, 1921, 1746, 0,    0,    0,    0,    0,    1486, 1795, 1153, 0,    0,    0,    1605,
+    1321, 1098, 0,    3642, 0,    0,    86,   1292, 1062, 2897, 815,  0,    3606, 3230, 0,    0,
+    125,  0,    0,    2502, 0,    0,    0,    3641, 0,    11,   0,    80,   0,    987,  0,    0,
+    10,   0,    995,  3819, 850,  0,    912,  3273, 0,    0,    1834, 2063, 1701, 3169, 682,  0,
+    0,    1654, 2707, 3120, 13,   571,  0,    3219, 552,  0,    1384, 0,    3104, 0,    38,   0,
+    0,    0,    0,    44,   0,    2715, 0,    3863, 0,    1342, 0,    673,  0,    574,  1515, 429,
+    3140, 0,    3368, 2370, 218,  2676, 1996, 2804, 0,    1131, 3352, 738,  849,  372,  0,    194,
+    0,    0,    0,    0,    626,  0,    928,  0,    0,    0,    980,  3458, 3123, 333,  0,    0,
+    1090, 0,    0,    0,    1765, 749,  0,    0,    0,    0,    0,    2497, 1440, 3227, 689,  0,
+    533,  3786, 896,  3352, 1825, 3864, 3663, 1995, 0,    479,  0,    0,    2554, 967,  0,    200,
+    107,  0,    1362, 444,  3601, 2887, 754,  1526, 1267, 379,  0,    267,  2281, 2552, 0,    3877,
+    2682, 917,  0,    0,    0,    22,   0,    1580, 3833, 0,    2562, 767,  1254, 1523, 1861, 216,
+    2004, 0,    1687, 440,  1159, 897,  0,    0,    2839, 691,  0,    0,    817,  0,    938,  3690,
+    3454, 1735, 0,    0,    2229, 0,    212,  0,    1522, 0,    117,  0,    0,    0,    1354, 3818,
+    0,    66,   0,    0,    3581, 0,    1639, 1670, 1015, 0,    784,  0,    3650, 679,  603,  0,
+    0,    0,    0,    0,    250,  3845, 0,    3706, 1663, 0,    813,  1069, 3134, 18,   3433, 422,
+    1329, 0,    2484, 0,    0,    0,    157,  1976, 71,   3654, 944,  3742, 13,   3308, 2179, 0,
+    1399, 0,    0,    0,    643,  169,  0,    1390, 0,    79,   108,  0,    0,    1110, 0,    0,
+    2856, 0,    1756, 3388, 3890, 707,  2699, 0,    1293, 89,   0,    1686, 378,  0,    2559, 0,
+    2281, 0,    0,    3717, 0,    0,    0,    761,  731,  0,    0,    407,  0,    321,  2097, 0,
+    0,    3905, 0,    388,  0,    151,  3894, 0,    2739, 3375, 1036, 0,    2777, 0,    2457, 0,
+    2538, 1493, 3874, 4,    0,    0,    3853, 966,  1889, 554,  700,  1227, 975,  3594, 2959, 512,
+    0,    911,  3857, 354,  0,    605,  0,    3823, 460,  0,    2364, 0,    1587, 0,    623,  3520,
+    3137, 0,    0,    182,  488,  0,    0,    1325, 675,  3844, 0,    2975, 0,    798,  2109, 0,
+    1631, 952,  270,  1228, 1848, 0,    0,    2035, 0,    932,  247,  0,    1484, 291,  0,    146,
+    0,    1601, 922,  3217, 200,  2005, 1710, 680,  0,    2253, 1648, 0,    1310, 0,    0,    0,
+    1892, 0,    85,   2008, 661,  1972, 0,    2737, 1917, 0,    0,    974,  3607, 418,  3132, 0,
+    557,  1301, 3458, 3068, 0,    3143, 2785, 0,    0,    123,  720,  0,    0,    557,  0,    1980,
+    1639, 3075, 693,  1130, 911,  3673, 0,    0,    0,    2138, 0,    0,    0,    0,    0,    3190,
+    0,    0,    352,  0,    1032, 2589, 990,  22,   1028, 0,    199,  3867, 796,  692,  0,    794,
+    0,    0,    0,    1810, 0,    0,    3175, 0,    1271, 0,    0,    1528, 995,  525,  1926, 0,
+    3730, 830,  0,    400,  425,  387,  0,    2492, 0,    0,    2595, 1560, 1479, 2578, 0,    0,
+    0,    641,  0,    864,  2539, 1525, 0,    0,    0,    371,  0,    1205, 751,  2067, 1566, 0,
+    0,    3337, 1785, 0,    1949, 2144, 0,    493,  873,  0,    0,    0,    0,    1990, 2082, 2607,
+    0,    0,    1298, 0,    2159, 3583, 0,    1551, 1208, 0,    711,  0,    0,    576,  1511, 2719,
+    0,    3604, 668,  1071, 3841, 0,    702,  0,    2939, 0,    745,  1310, 0,    2292, 0,    1574,
+    2788, 321,  459,  0,    0,    1576, 0,    0,    983,  423,  0,    0,    1153, 1837, 0,    3788,
+    294,  0,    771,  0,    0,    764,  664,  332,  495,  0,    0,    0,    0,    2136, 1855, 285,
+    2979, 0,    126,  0,    617,  3189, 0,    877,  0,    0,    652,  896,  0,    0,    0,    646,
+    996,  2793, 0,    1034, 3862, 2814, 0,    0,    0,    0,    96,   461,  0,    3474, 432,  0,
+    1352, 902,  11,   0,    950,  551,  585,  2579, 158,  0,    1912, 1017, 1821, 0,    0,    0,
+    1799, 0,    0,    2467, 0,    1608, 0,    0,    3796, 0,    0,    3125, 0,    0,    126,  1028,
+    1669, 0,    1088, 769,  1048, 3307, 2537, 1315, 0,    0,    0,    0,    0,    0,    922,  1607,
+    128,  706,  1395, 0,    3108, 2853, 0,    0,    2915, 0,    597,  0,    1505, 3243, 0,    2860,
+    0,    0,    0,    1654, 0,    243,  1294, 0,    2489, 3349, 508,  3527, 6,    169,  347,  1959,
+    334,  0,    1347, 2786, 3,    3377, 0,    0,    79,   3860, 3442, 1789, 2940, 1737, 0,    336,
+    0,    446,  3849, 2011, 0,    0,    2973, 3676, 2196, 0,    0,    3291, 1007, 75,   0,    859,
+    0,    2101, 0,    0,    1625, 0,    3569, 317,  3582, 1168, 1593, 303,  0,    597,  286,  0,
+    583,  2809, 2137, 393,  3050, 2576, 0,    1691, 0,    1350, 3701, 794,  0,    2426, 811,  108,
+    1302, 826,  0,    660,  0,    0,    1659, 0,    0,    339,  0,    0,    2821, 0,    50,   2760,
+    0,    0,    0,    358,  3614, 131,  3073, 1083, 0,    748,  680,  3652, 153,  1584, 3340, 1111,
+    254,  656,  0,    0,    2256, 289,  171,  0,    1027, 0,    1377, 0,    0,    1490, 360,  1770,
+    1578, 839,  606,  0,    320,  2766, 36,   2745, 0,    3133, 1154, 3757, 492,  3404, 642,  0,
+    460,  723,  0,    0,    19,   1204, 893,  51,   0,    689,  0,    3374, 1826, 2646, 836,  2128,
+    2538, 0,    1319, 0,    0,    3070, 0,    1462, 1726, 3879, 0,    2913, 3324, 2851, 1708, 0,
+    3280, 1330, 1134, 0,    522,  989,  0,    3798, 0,    0,    1053, 1449, 3497, 0,    0,    3145,
+    1474, 1954, 1099, 0,    0,    3041, 3143, 0,    0,    3214, 1532, 0,    0,    0,    3519, 614,
+    3237, 951,  1988, 0,    563,  2058, 3426, 2867, 456,  2051, 93,   1073, 1450, 0,    2033, 158,
+    1270, 0,    237,  944,  1527, 3281, 0,    3313, 924,  1370, 1310, 1463, 761,  3886, 838,  0,
+    0,    1372, 0,    0,    2531, 0,    2864, 0,    527,  0,    0,    3261, 3329, 468,  190,  0,
+    769,  145,  0,    0,    0,    3230, 0,    1358, 3394, 2405, 805,  1132, 0,    0,    0,    0,
+    2009, 0,    1640, 1433, 3313, 3647, 0,    0,    1635, 0,    1499, 1873, 431,  301,  0,    2290,
+    0,    3550, 1788, 1125, 0,    0,    0,    403,  1488, 947,  2037, 0,    0,    0,    1472, 1415,
+    1235, 0,    0,    0,    3319, 3803, 461,  0,    746,  376,  1415, 2485, 0,    0,    572,  1259,
+    3748, 2452, 3305, 3544, 3370, 467,  1836, 1828, 0,    2322, 2149, 1070, 2067, 0,    2769, 3174,
+    0,    368,  536,  2620, 3887, 2104, 2837, 1482, 0,    3305, 2723, 446,  920,  0,    71,   1564,
+    3567, 83,   1342, 259,  0,    376,  0,    1410, 1078, 940,  35,   3291, 757,  0,    0,    3424,
+    2135, 1467, 946,  0,    0,    0,    0,    217,  0,    1943, 384,  1782, 2868, 0,    1266, 650,
+    0,    1640, 1926, 3332, 0,    1599, 1860, 0,    166,  2483, 1098, 0,    2708, 0,    3354, 1497,
+    0,    0,    1027, 1280, 3443, 0,    1224, 687,  32,   1668, 3768, 0,    3262, 0,    1649, 280,
+    1175, 2313, 0,    2155, 412,  1745, 1660, 308,  0,    371,  342,  1041, 0,    3862, 0,    0,
+    2988, 0,    0,    297,  0,    0,    3842, 0,    0,    206,  0,    1785, 1443, 0,    1753, 0,
+    0,    0,    2917, 0,    0,    366,  0,    523,  0,    0,    3554, 2061, 839,  269,  0,    160,
+    751,  0,    0,    3709, 1996, 1254, 0,    2189, 0,    28,   1046, 1002, 1481, 0,    483,  1364,
+    3192, 0,    0,    3279, 2812, 957,  0,    0,    0,    0,    0,    0,    0,    91,   45,   1186,
+    352,  2737, 0,    0,    0,    377,  1156, 2932, 264,  0,    967,  586,  2079, 1744, 1414, 0,
+    771,  1348, 3610, 14,   0,    2186, 2640, 1553, 2115, 0,    1213, 0,    304,  643,  0,    1284,
+    486,  0,    99,   3684, 0,    184,  2623, 1251, 0,    0,    1570, 2966, 1106, 3860, 0,    1221,
+    0,    2764, 1004, 206,  0,    1220, 79,   0,    0,    0,    0,    1166, 0,    24,   3827, 1690,
+    0,    3760, 938,  1291, 21,   1016, 3834, 0,    1281, 0,    0,    0,    3758, 3375, 1763, 0,
+    2543, 0,    0,    0,    2114, 1491, 0,    0,    105,  1234, 0,    2596, 1442, 2660, 0,    0,
+    521,  652,  1496, 743,  0,    0,    720,  0,    3809, 2064, 0,    3825, 0,    677,  1187, 607,
+    1060, 1102, 934,  718,  2076, 252,  0,    1707, 3220, 765,  396,  898,  1011, 3484, 3025, 3624,
+    2755, 2543, 188,  1468, 2213, 0,    3559, 1873, 0,    1515, 0,    0,    774,  1202, 0,    0,
+    3091, 29,   0,    0,    0,    1229, 1648, 1623, 606,  1621, 2589, 2061, 0,    0,    890,  2997,
+    3708, 0,    1662, 87,   0,    0,    1390, 1262, 1394, 0,    0,    2944, 2201, 579,  1073, 3890,
+    0,    0,    1816, 1140, 1939, 2173, 535,  1070, 0,    0,    1171, 2927, 1238, 2148, 3867, 3754,
+    3118, 697,  0,    1455, 649,  365,  1789, 0,    870,  2404, 543,  261,  0,    0,    111,  0,
+    0,    0,    217,  3663, 3677, 73,   1509, 614,  728,  969,  0,    1590, 0,    1410, 2526, 1478,
+    0,    4,    1543, 0,    233,  907,  0,    0,    0,    0,    593,  3806, 2697, 1130, 192,  3058,
+    0,    299,  2108, 117,  2001, 3883, 0,    0,    503,  1519, 0,    2387, 160,  486,  1665, 1754,
+    0,    2164, 0,    3345, 0,    1122, 0,    0,    0,    257,  812,  523,  66,   451,  1625, 0,
+    3235, 0,    718,  3372, 2427, 49,   3569, 2691, 1531, 1033, 244,  0,    1280, 641,  1502, 945,
+    1406, 2494, 3256, 315,  0,    90,   1054, 2028, 3693, 0,    799,  2365, 0,    121,  1915, 876,
+    0,    144,  834,  232,  2735, 1452, 1232, 519,  1506, 3456, 491,  0,    2711, 0,    0,    3152,
+    0,    3570, 698,  1904, 3864, 2356, 0,    3144, 0,    0,    2363, 614,  763,  482,  1885, 772,
+    0,    657,  0,    2827, 1391, 782,  0,    49,   800,  0,    667,  1419, 920,  0,    3185, 0,
+    832,  1628, 1649, 0,    0,    0,    0,    657,  0,    0,    1010, 332,  935,  0,    0,    720,
+    3754, 1881, 0,    1772, 1428, 1982, 0,    0,    871,  3167, 2168, 0,    3220, 622,  1635, 501,
+    0,    0,    3624, 3771, 1755, 0,    623,  1782, 1962, 0,    2629, 0,    295,  3201, 83,   295,
+    0,    1230, 0,    3167, 0,    0,    747,  1319, 600,  0,    0,    1055, 4,    1205, 0,    1948,
+    3363, 655,  0,    0,    3889, 0,    0,    0,    878,  0,    0,    480,  0,    0,    3440, 3360,
+    816,  39,   0,    0,    472,  1761, 350,  0,    0,    3439, 0,    493,  3901, 1129, 0,    0,
+    1578, 825,  0,    1773, 0,    0,    1082, 837,  0,    0,    0,    1379, 0,    2256, 3910, 0,
+    215,  814,  0,    0,    3282, 3014, 0,    141,  3481, 2554, 0,    0,    3818, 1851, 0,    1074,
+    2445, 2186, 683,  3714, 1357, 3871, 2758, 1624, 3480, 0,    0,    3654, 731,  1775, 0,    0,
+    0,    0,    0,    0,    0,    0,    821,  671,  0,    1527, 2020, 1556, 668,  0,    1121, 2127,
+    2878, 3777, 1337, 685,  3654, 1998, 218,  469,  1414, 1986, 2028, 0,    1096, 2937, 0,    3606,
+    0,    3548, 1330, 101,  618,  0,    3436, 526,  0,    0,    2079, 3220, 0,    3238, 0,    1439,
+    348,  651,  386,  1226, 706,  1945, 156,  509,  1161, 1501, 11,   0,    0,    2034, 818,  3836,
+    1679, 0,    0,    0,    0,    1801, 0,    0,    2720, 1320, 0,    3273, 867,  46,   0,    0,
+    530,  0,    0,    2276, 2329, 2849, 1027, 0,    0,    3231, 172,  3655, 3171, 413,  0,    434,
+    0,    1921, 687,  0,    0,    1067, 0,    0,    0,    2923, 489,  0,    0,    1886, 1816, 0,
+    0,    1127, 0,    0,    0,    0,    0,    0,    2741, 0,    0,    2025, 0,    1905, 0,    3489,
+    0,    1753, 0,    1240, 403,  1927, 1273, 2128, 1160, 3648, 524,  1467, 0,    3708, 0,    111,
+    0,    1058, 0,    693,  2454, 0,    0,    0,    1507, 2711, 0,    0,    3753, 1413, 3846, 3609,
+    552,  0,    1434, 1306, 0,    3063, 3646, 0,    0,    0,    2,    3399, 3173, 208,  0,    1868,
+    1225, 718,  1319, 0,    2118, 3026, 413,  1903, 84,   3709, 595,  155,  597,  3644, 1124, 0,
+    498,  0,    1177, 1289, 2100, 167,  3288, 3275, 3513, 0,    3695, 748,  316,  3462, 173,  0,
+    935,  0,    0,    113,  409,  433,  0,    3216, 2073, 2253, 0,    410,  0,    158,  0,    2633,
+    899,  769,  2622, 0,    3636, 1548, 678,  3406, 1585, 1941, 0,    1271, 356,  0,    1625, 0,
+    357,  0,    1522, 351,  0,    0,    0,    1856, 3435, 0,    1184, 203,  921,  2654, 0,    656,
+    285,  2574, 767,  0,    0,    2515, 0,    472,  0,    192,  0,    0,    0,    1529, 0,    0,
+    1881, 1638, 761,  1469, 2025, 0,    1175, 0,    2158, 2518, 0,    1151, 1336, 3649, 1907, 741,
+    1223, 0,    709,  0,    2711, 0,    2054, 661,  0,    2413, 0,    2409, 1814, 3709, 1891, 862,
+    0,    1229, 0,    1999, 149,  2623, 0,    0,    0};
 
 int MangledHashG(const char *key, const int *T)
 {
@@ -311,7 +286,7 @@
     for (int i = 0; key[i] != '\0'; i++)
     {
         sum += T[i] * key[i];
-        sum %= 4310;
+        sum %= 3913;
     }
     return mangledkG[sum];
 }
@@ -321,34 +296,35 @@
     if (strlen(key) > 40)
         return 0;
 
-    return (MangledHashG(key, mangledkT1) + MangledHashG(key, mangledkT2)) % 4310;
+    return (MangledHashG(key, mangledkT1) + MangledHashG(key, mangledkT2)) % 3913;
 }
 
-constexpr int unmangledkT1[] = {207, 155, 313, 341, 135, 9,   177, 167, 360, 307, 114, 9,   262,
-                                85,  106, 135, 125, 176, 277, 193, 223, 149, 331, 274, 358, 54};
-constexpr int unmangledkT2[] = {55,  288, 187, 350, 175, 265, 361, 369, 259, 121, 129, 161, 363,
-                                266, 318, 176, 200, 164, 169, 340, 207, 119, 142, 43,  174, 235};
+constexpr int unmangledkT1[] = {94, 139, 380, 124, 341, 44, 48,  261, 311, 16,  9,  43, 217,
+                                67, 311, 39,  117, 290, 46, 267, 80,  308, 127, 71, 57, 156};
+constexpr int unmangledkT2[] = {292, 97,  17,  155, 223, 131, 43,  377, 66,  341, 119, 361, 303,
+                                381, 179, 105, 242, 114, 260, 237, 234, 191, 248, 258, 340, 364};
 constexpr int unmangledkG[]  = {
-    0,   0,   0,   0,   0,   0,   0,   304, 0,   0,   0,   69,  0,   13,  0,   0,   0,   0,   0,
-    0,   0,   328, 0,   0,   134, 0,   122, 0,   161, 0,   332, 0,   0,   0,   0,   0,   0,   177,
-    0,   138, 0,   0,   198, 0,   42,  157, 0,   0,   332, 0,   229, 248, 76,  238, 111, 0,   0,
-    104, 0,   0,   164, 369, 0,   57,  0,   0,   112, 0,   146, 141, 0,   0,   342, 0,   0,   209,
-    0,   0,   0,   314, 0,   185, 0,   218, 232, 302, 213, 0,   316, 268, 362, 23,  201, 0,   0,
-    29,  0,   0,   0,   182, 0,   0,   206, 0,   221, 367, 0,   0,   0,   0,   268, 127, 90,  211,
-    0,   137, 0,   0,   0,   140, 0,   0,   172, 0,   294, 0,   28,  0,   73,  0,   36,  69,  315,
-    308, 209, 0,   0,   0,   0,   0,   23,  112, 0,   0,   0,   0,   5,   19,  306, 153, 0,   361,
-    0,   188, 0,   349, 0,   101, 181, 323, 125, 156, 71,  0,   242, 20,  0,   0,   356, 152, 147,
-    301, 348, 0,   53,  254, 103, 0,   0,   134, 38,  0,   182, 0,   0,   0,   166, 37,  115, 16,
-    0,   0,   47,  15,  0,   30,  0,   0,   0,   248, 244, 145, 0,   31,  0,   0,   0,   6,   69,
-    281, 58,  20,  12,  164, 131, 33,  0,   346, 164, 19,  11,  120, 197, 247, 30,  153, 84,  137,
-    75,  343, 137, 5,   167, 74,  0,   193, 0,   358, 0,   5,   0,   164, 209, 0,   0,   102, 117,
-    183, 0,   0,   0,   0,   0,   0,   94,  128, 0,   114, 31,  0,   0,   0,   106, 283, 151, 0,
-    224, 91,  0,   369, 168, 195, 105, 53,  0,   0,   57,  47,  17,  0,   0,   0,   17,  155, 133,
-    279, 0,   277, 0,   328, 344, 0,   109, 204, 0,   146, 241, 149, 290, 159, 87,  0,   0,   0,
-    361, 240, 14,  353, 169, 213, 0,   0,   363, 176, 251, 342, 0,   99,  258, 0,   208, 291, 1,
-    79,  0,   0,   0,   66,  32,  0,   266, 191, 116, 0,   0,   150, 21,  0,   240, 163, 46,  0,
-    74,  96,  208, 0,   179, 0,   309, 193, 53,  24,  0,   58,  146, 0,   317, 126, 119, 135, 0,
-    0,   21,  0,   263, 179, 62,  302, 138, 0};
+    0,   0,   0,   0,   0,   0,   0,   169, 0,   179, 0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   364, 0,   0,   0,   0,   0,   0,   243, 188, 316, 68,  0,   34,  187, 25,  11,  0,   0,
+    0,   31,  110, 0,   0,   378, 129, 0,   0,   0,   387, 0,   130, 19,  196, 0,   172, 0,   0,
+    155, 0,   107, 221, 0,   0,   39,  26,  0,   0,   0,   73,  176, 14,  0,   0,   0,   0,   0,
+    343, 0,   0,   0,   248, 101, 7,   0,   294, 225, 0,   0,   0,   0,   0,   0,   14,  0,   0,
+    0,   12,  0,   45,  0,   281, 0,   0,   0,   105, 324, 91,  308, 29,  118, 0,   0,   75,  0,
+    362, 0,   0,   254, 128, 317, 247, 0,   0,   337, 0,   0,   0,   348, 0,   100, 0,   184, 0,
+    343, 0,   0,   192, 95,  0,   333, 125, 203, 0,   93,  0,   369, 373, 29,  0,   0,   137, 372,
+    94,  0,   0,   0,   0,   204, 0,   0,   224, 248, 106, 342, 145, 344, 140, 325, 0,   0,   192,
+    0,   109, 357, 368, 0,   0,   363, 0,   0,   0,   0,   157, 154, 0,   0,   194, 352, 0,   369,
+    244, 0,   0,   192, 363, 0,   44,  365, 0,   0,   277, 52,  0,   97,  0,   0,   117, 158, 0,
+    7,   227, 0,   167, 26,  238, 69,  0,   0,   37,  0,   0,   125, 0,   171, 209, 353, 134, 299,
+    0,   149, 79,  179, 0,   49,  0,   181, 195, 159, 141, 289, 0,   363, 0,   58,  146, 141, 187,
+    0,   0,   260, 62,  0,   189, 134, 0,   0,   301, 0,   0,   191, 195, 0,   0,   0,   194, 24,
+    379, 31,  45,  0,   51,  0,   0,   50,  0,   0,   88,  292, 0,   0,   300, 0,   0,   161, 244,
+    0,   191, 29,  161, 134, 202, 0,   0,   387, 382, 43,  102, 0,   24,  139, 328, 12,  167, 127,
+    185, 129, 371, 326, 0,   0,   101, 242, 0,   177, 341, 148, 0,   0,   0,   328, 0,   196, 145,
+    52,  0,   83,  108, 54,  232, 154, 90,  109, 228, 253, 0,   0,   0,   117, 201, 341, 0,   305,
+    305, 84,  163, 170, 275, 0,   0,   264, 128, 116, 152, 36,  148, 70,  15,  0,   0,   80,  0,
+    98,  0,   0,   102, 0,   225, 141, 111, 0,   183, 0,   266, 0,   223, 260, 0,   0,   0,   222,
+    0,   0,   0,   64,  0,   0,   0,   387};
 
 int UnmangledHashG(const char *key, const int *T)
 {
@@ -357,7 +333,7 @@
     for (int i = 0; key[i] != '\0'; i++)
     {
         sum += T[i] * key[i];
-        sum %= 370;
+        sum %= 388;
     }
     return unmangledkG[sum];
 }
@@ -367,7 +343,7 @@
     if (strlen(key) > 26)
         return 0;
 
-    return (UnmangledHashG(key, unmangledkT1) + UnmangledHashG(key, unmangledkT2)) % 370;
+    return (UnmangledHashG(key, unmangledkT1) + UnmangledHashG(key, unmangledkT2)) % 388;
 }
 
 }  // namespace
diff --git a/src/compiler/translator/Initialize.cpp b/src/compiler/translator/Initialize.cpp
index b0ad245..37bbe89 100644
--- a/src/compiler/translator/Initialize.cpp
+++ b/src/compiler/translator/Initialize.cpp
@@ -45,6 +45,10 @@
     {
         extBehavior[TExtension::EXT_frag_depth] = EBhUndefined;
     }
+    if (resources.EXT_primitive_bounding_box)
+    {
+        extBehavior[TExtension::EXT_primitive_bounding_box] = EBhUndefined;
+    }
     if (resources.EXT_shader_texture_lod)
     {
         extBehavior[TExtension::EXT_shader_texture_lod] = EBhUndefined;
diff --git a/src/compiler/translator/IntermNode.cpp b/src/compiler/translator/IntermNode.cpp
index f09d7b9..55ff8bf 100644
--- a/src/compiler/translator/IntermNode.cpp
+++ b/src/compiler/translator/IntermNode.cpp
@@ -17,6 +17,7 @@
 
 #include "common/mathutil.h"
 #include "common/matrix_utils.h"
+#include "common/utilities.h"
 #include "compiler/translator/Diagnostics.h"
 #include "compiler/translator/ImmutableString.h"
 #include "compiler/translator/IntermNode.h"
@@ -179,6 +180,19 @@
     }
 }
 
+void PropagatePrecisionIfApplicable(TIntermTyped *node, TPrecision precision)
+{
+    if (precision == EbpUndefined || node->getPrecision() != EbpUndefined)
+    {
+        return;
+    }
+
+    if (IsPrecisionApplicableToType(node->getBasicType()))
+    {
+        node->propagatePrecision(precision);
+    }
+}
+
 }  // namespace
 
 ////////////////////////////////////////////////////////////////
@@ -575,6 +589,16 @@
     return mVariable->getType();
 }
 
+void TIntermSymbol::propagatePrecision(TPrecision precision)
+{
+    // Every declared variable should already have a precision.  Some built-ins don't have a defined
+    // precision.  This is not asserted however:
+    //
+    // - A shader with no precision specified either globally or on a variable will fail with a
+    //   compilation error later on.
+    // - Transformations declaring variables without precision will be caught by AST validation.
+}
+
 TIntermAggregate *TIntermAggregate::CreateFunctionCall(const TFunction &func,
                                                        TIntermSequence *arguments)
 {
@@ -604,10 +628,7 @@
                                    const TType &type,
                                    TOperator op,
                                    TIntermSequence *arguments)
-    : TIntermOperator(op, type),
-      mUseEmulatedFunction(false),
-      mGotPrecisionFromChildren(false),
-      mFunction(func)
+    : TIntermOperator(op, type), mUseEmulatedFunction(false), mFunction(func)
 {
     if (arguments != nullptr)
     {
@@ -620,35 +641,20 @@
 void TIntermAggregate::setPrecisionAndQualifier()
 {
     mType.setQualifier(EvqTemporary);
-    if (BuiltInGroup::IsBuiltIn(mOp) && !BuiltInGroup::IsMath(mOp))
+    if ((!BuiltInGroup::IsBuiltIn(mOp) && !isFunctionCall()) || BuiltInGroup::IsMath(mOp))
     {
-        setBuiltInFunctionPrecision();
-    }
-    else if (!isFunctionCall())
-    {
-        if (isConstructor())
-        {
-            // Structs should not be precision qualified, the individual members may be.
-            // Built-in types on the other hand should be precision qualified.
-            if (getBasicType() != EbtStruct)
-            {
-                setPrecisionFromChildren();
-            }
-        }
-        else
-        {
-            setPrecisionForMathBuiltInOp();
-        }
         if (areChildrenConstQualified())
         {
             mType.setQualifier(EvqConst);
         }
     }
+
+    propagatePrecision(derivePrecision());
 }
 
 bool TIntermAggregate::areChildrenConstQualified()
 {
-    for (TIntermNode *&arg : mArguments)
+    for (TIntermNode *arg : mArguments)
     {
         TIntermTyped *typedArg = arg->getAsTyped();
         if (typedArg && typedArg->getQualifier() != EvqConst)
@@ -659,81 +665,119 @@
     return true;
 }
 
-void TIntermAggregate::setPrecisionFromChildren()
+// Derive precision from children nodes
+TPrecision TIntermAggregate::derivePrecision() const
 {
-    mGotPrecisionFromChildren = true;
-    if (getBasicType() == EbtBool)
+    if (getBasicType() == EbtBool || getBasicType() == EbtVoid || getBasicType() == EbtStruct)
     {
-        mType.setPrecision(EbpUndefined);
-        return;
+        return EbpUndefined;
     }
 
-    TPrecision precision                = EbpUndefined;
-    TIntermSequence::iterator childIter = mArguments.begin();
-    while (childIter != mArguments.end())
+    // For AST function calls, take the qualifier from the declared one.
+    if (isFunctionCall())
     {
-        TIntermTyped *typed = (*childIter)->getAsTyped();
-        if (typed)
-            precision = GetHigherPrecision(typed->getPrecision(), precision);
-        ++childIter;
+        return mType.getPrecision();
     }
-    mType.setPrecision(precision);
-}
 
-void TIntermAggregate::setPrecisionForMathBuiltInOp()
-{
-    ASSERT(BuiltInGroup::IsMath(mOp));
-    if (!setPrecisionForSpecialBuiltInOp())
-    {
-        setPrecisionFromChildren();
-    }
-}
-
-bool TIntermAggregate::setPrecisionForSpecialBuiltInOp()
-{
+    // Some built-ins explicitly specify their precision.
     switch (mOp)
     {
         case EOpBitfieldExtract:
-            mType.setPrecision(mArguments[0]->getAsTyped()->getPrecision());
-            mGotPrecisionFromChildren = true;
-            return true;
+            return mArguments[0]->getAsTyped()->getPrecision();
         case EOpBitfieldInsert:
-            mType.setPrecision(GetHigherPrecision(mArguments[0]->getAsTyped()->getPrecision(),
-                                                  mArguments[1]->getAsTyped()->getPrecision()));
-            mGotPrecisionFromChildren = true;
-            return true;
+            return GetHigherPrecision(mArguments[0]->getAsTyped()->getPrecision(),
+                                      mArguments[1]->getAsTyped()->getPrecision());
+        case EOpTextureSize:
+        case EOpImageSize:
         case EOpUaddCarry:
         case EOpUsubBorrow:
-            mType.setPrecision(EbpHigh);
-            return true;
+        case EOpUmulExtended:
+        case EOpImulExtended:
+        case EOpFrexp:
+        case EOpLdexp:
+            return EbpHigh;
         default:
-            return false;
+            break;
     }
+
+    // The rest of the math operations and constructors get their precision from their arguments.
+    if (BuiltInGroup::IsMath(mOp) || mOp == EOpConstruct)
+    {
+        TPrecision precision = EbpUndefined;
+        for (TIntermNode *argument : mArguments)
+        {
+            precision = GetHigherPrecision(argument->getAsTyped()->getPrecision(), precision);
+        }
+        return precision;
+    }
+
+    // Atomic operations return highp.
+    if (BuiltInGroup::IsImageAtomic(mOp) || BuiltInGroup::IsAtomicCounter(mOp) ||
+        BuiltInGroup::IsAtomicMemory(mOp))
+    {
+        return EbpHigh;
+    }
+
+    // Texture functions return the same precision as that of the sampler (textureSize returns
+    // highp, but that's handled above).  imageLoad similar takes the precision of the image.  The
+    // same is true for dFd*, interpolateAt* and subpassLoad operations.
+    if (BuiltInGroup::IsTexture(mOp) || BuiltInGroup::IsImageLoad(mOp) ||
+        BuiltInGroup::IsDerivativesFS(mOp) || BuiltInGroup::IsInterpolationFS(mOp) ||
+        mOp == EOpSubpassLoad)
+    {
+        return mArguments[0]->getAsTyped()->getPrecision();
+    }
+
+    // Every possibility must be explicitly handled, except for desktop-GLSL-specific built-ins
+    // for which precision does't matter.
+    return EbpUndefined;
 }
 
-void TIntermAggregate::setBuiltInFunctionPrecision()
+// Propagate precision to children nodes that don't already have it defined.
+void TIntermAggregate::propagatePrecision(TPrecision precision)
 {
-    // All built-ins returning bool are math operations.
-    ASSERT(getBasicType() != EbtBool);
-    ASSERT(!isFunctionCall() && !isConstructor() && !BuiltInGroup::IsMath(mOp));
+    mType.setPrecision(precision);
 
-    TPrecision precision = EbpUndefined;
-    for (TIntermNode *arg : mArguments)
+    // For constructors, propagate precision to arguments.
+    if (isConstructor())
     {
-        TIntermTyped *typed = arg->getAsTyped();
-        // ESSL spec section 8: texture functions get their precision from the sampler.
-        if (typed && IsSampler(typed->getBasicType()))
+        for (TIntermNode *arg : mArguments)
         {
-            precision = typed->getPrecision();
-            break;
+            PropagatePrecisionIfApplicable(arg->getAsTyped(), precision);
         }
+        return;
     }
-    // ESSL 3.0 spec section 8: textureSize always gets highp precision.
-    // All other functions that take a sampler are assumed to be texture functions.
-    if (mOp == EOpTextureSize)
-        mType.setPrecision(EbpHigh);
-    else
-        mType.setPrecision(precision);
+
+    // For function calls, propagate precision of each parameter to its corresponding argument.
+    if (isFunctionCall())
+    {
+        for (size_t paramIndex = 0; paramIndex < mFunction->getParamCount(); ++paramIndex)
+        {
+            const TVariable *paramVariable = mFunction->getParam(paramIndex);
+            PropagatePrecisionIfApplicable(mArguments[paramIndex]->getAsTyped(),
+                                           paramVariable->getType().getPrecision());
+        }
+        return;
+    }
+
+    // Some built-ins explicitly specify the precision of their parameters.
+    switch (mOp)
+    {
+        case EOpUaddCarry:
+        case EOpUsubBorrow:
+        case EOpUmulExtended:
+        case EOpImulExtended:
+            PropagatePrecisionIfApplicable(mArguments[0]->getAsTyped(), EbpHigh);
+            PropagatePrecisionIfApplicable(mArguments[1]->getAsTyped(), EbpHigh);
+            break;
+        case EOpFindMSB:
+        case EOpFrexp:
+        case EOpLdexp:
+            PropagatePrecisionIfApplicable(mArguments[0]->getAsTyped(), EbpHigh);
+            break;
+        default:
+            break;
+    }
 }
 
 const char *TIntermAggregate::functionName() const
@@ -1061,12 +1105,16 @@
     return false;
 }
 
-TIntermTyped::TIntermTyped(const TIntermTyped &node) : TIntermNode()
+TIntermTyped::TIntermTyped() : mIsPrecise(false) {}
+TIntermTyped::TIntermTyped(const TIntermTyped &node) : TIntermTyped()
 {
     // Copy constructor is disallowed for TIntermNode in order to disallow it for subclasses that
     // don't explicitly allow it, so normal TIntermNode constructor is used to construct the copy.
     // We need to manually copy any fields of TIntermNode.
     mLine = node.mLine;
+
+    // Once deteremined, the tree is not expected to transform.
+    ASSERT(!mIsPrecise);
 }
 
 bool TIntermTyped::hasConstantValue() const
@@ -1084,6 +1132,17 @@
     return nullptr;
 }
 
+TPrecision TIntermTyped::derivePrecision() const
+{
+    UNREACHABLE();
+    return EbpUndefined;
+}
+
+void TIntermTyped::propagatePrecision(TPrecision precision)
+{
+    UNREACHABLE();
+}
+
 TIntermConstantUnion::TIntermConstantUnion(const TIntermConstantUnion &node)
     : TIntermExpression(node)
 {
@@ -1104,7 +1163,6 @@
 TIntermAggregate::TIntermAggregate(const TIntermAggregate &node)
     : TIntermOperator(node),
       mUseEmulatedFunction(node.mUseEmulatedFunction),
-      mGotPrecisionFromChildren(node.mGotPrecisionFromChildren),
       mFunction(node.mFunction)
 {
     for (TIntermNode *arg : node.mArguments)
@@ -1299,7 +1357,7 @@
     if (mOp == EOpArrayLength)
     {
         // Special case: the qualifier of .length() doesn't depend on the operand qualifier.
-        setType(TType(EbtInt, EbpUndefined, EvqConst));
+        setType(TType(EbtInt, EbpHigh, EvqConst));
         return;
     }
 
@@ -1307,74 +1365,153 @@
     if (mOperand->getQualifier() == EvqConst)
         resultQualifier = EvqConst;
 
-    unsigned char operandPrimarySize =
-        static_cast<unsigned char>(mOperand->getType().getNominalSize());
+    TType resultType = mOperand->getType();
+    resultType.setQualifier(resultQualifier);
+
+    // Result is an intermediate value, so make sure it's identified as such.
+    resultType.setInterfaceBlock(nullptr);
+
+    // Override type properties for special built-ins.  Precision is determined later by
+    // |derivePrecision|.
     switch (mOp)
     {
         case EOpFloatBitsToInt:
-            setType(TType(EbtInt, EbpHigh, resultQualifier, operandPrimarySize));
+            resultType.setBasicType(EbtInt);
             break;
         case EOpFloatBitsToUint:
-            setType(TType(EbtUInt, EbpHigh, resultQualifier, operandPrimarySize));
+            resultType.setBasicType(EbtUInt);
             break;
         case EOpIntBitsToFloat:
         case EOpUintBitsToFloat:
-            setType(TType(EbtFloat, EbpHigh, resultQualifier, operandPrimarySize));
+            resultType.setBasicType(EbtFloat);
             break;
         case EOpPackSnorm2x16:
         case EOpPackUnorm2x16:
         case EOpPackHalf2x16:
         case EOpPackUnorm4x8:
         case EOpPackSnorm4x8:
-            setType(TType(EbtUInt, EbpHigh, resultQualifier));
+            resultType.setBasicType(EbtUInt);
+            resultType.setPrimarySize(1);
             break;
         case EOpUnpackSnorm2x16:
         case EOpUnpackUnorm2x16:
-            setType(TType(EbtFloat, EbpHigh, resultQualifier, 2));
-            break;
         case EOpUnpackHalf2x16:
-            setType(TType(EbtFloat, EbpMedium, resultQualifier, 2));
+            resultType.setBasicType(EbtFloat);
+            resultType.setPrimarySize(2);
             break;
         case EOpUnpackUnorm4x8:
         case EOpUnpackSnorm4x8:
-            setType(TType(EbtFloat, EbpMedium, resultQualifier, 4));
+            resultType.setBasicType(EbtFloat);
+            resultType.setPrimarySize(4);
             break;
         case EOpAny:
         case EOpAll:
-            setType(TType(EbtBool, EbpUndefined, resultQualifier));
+            resultType.setBasicType(EbtBool);
+            resultType.setPrimarySize(1);
             break;
         case EOpLength:
         case EOpDeterminant:
-            setType(TType(EbtFloat, mOperand->getType().getPrecision(), resultQualifier));
+            resultType.setBasicType(EbtFloat);
+            resultType.setPrimarySize(1);
+            resultType.setSecondarySize(1);
             break;
         case EOpTranspose:
-            setType(TType(EbtFloat, mOperand->getType().getPrecision(), resultQualifier,
-                          static_cast<unsigned char>(mOperand->getType().getRows()),
-                          static_cast<unsigned char>(mOperand->getType().getCols())));
+            ASSERT(resultType.getBasicType() == EbtFloat);
+            resultType.setPrimarySize(static_cast<unsigned char>(mOperand->getType().getRows()));
+            resultType.setSecondarySize(static_cast<unsigned char>(mOperand->getType().getCols()));
             break;
         case EOpIsinf:
         case EOpIsnan:
-            setType(TType(EbtBool, EbpUndefined, resultQualifier, operandPrimarySize));
-            break;
-        case EOpBitfieldReverse:
-            setType(TType(mOperand->getBasicType(), EbpHigh, resultQualifier, operandPrimarySize));
+            resultType.setBasicType(EbtBool);
             break;
         case EOpBitCount:
-            setType(TType(EbtInt, EbpLow, resultQualifier, operandPrimarySize));
-            break;
         case EOpFindLSB:
-            setType(TType(EbtInt, EbpLow, resultQualifier, operandPrimarySize));
-            break;
         case EOpFindMSB:
-            setType(TType(EbtInt, EbpLow, resultQualifier, operandPrimarySize));
+            resultType.setBasicType(EbtInt);
             break;
         default:
-            setType(mOperand->getType());
-            mType.setQualifier(resultQualifier);
-            // Result is an intermediate value, so make sure it's identified as such.
-            mType.setInterfaceBlock(nullptr);
             break;
     }
+
+    setType(resultType);
+    propagatePrecision(derivePrecision());
+}
+
+// Derive precision from children nodes
+TPrecision TIntermUnary::derivePrecision() const
+{
+    // Unary operators generally derive their precision from their operand, except for a few
+    // built-ins where this is overriden.
+    switch (mOp)
+    {
+        case EOpArrayLength:
+        case EOpFloatBitsToInt:
+        case EOpFloatBitsToUint:
+        case EOpIntBitsToFloat:
+        case EOpUintBitsToFloat:
+        case EOpPackSnorm2x16:
+        case EOpPackUnorm2x16:
+        case EOpPackHalf2x16:
+        case EOpPackUnorm4x8:
+        case EOpPackSnorm4x8:
+        case EOpUnpackSnorm2x16:
+        case EOpUnpackUnorm2x16:
+        case EOpBitfieldReverse:
+            return EbpHigh;
+        case EOpUnpackHalf2x16:
+        case EOpUnpackUnorm4x8:
+        case EOpUnpackSnorm4x8:
+            return EbpMedium;
+        case EOpBitCount:
+        case EOpFindLSB:
+        case EOpFindMSB:
+            return EbpLow;
+        case EOpAny:
+        case EOpAll:
+        case EOpIsinf:
+        case EOpIsnan:
+            return EbpUndefined;
+        default:
+            return mOperand->getPrecision();
+    }
+}
+
+void TIntermUnary::propagatePrecision(TPrecision precision)
+{
+    mType.setPrecision(precision);
+
+    // Generally precision of the operand and the precision of the result match.  A few built-ins
+    // are exceptional.
+    switch (mOp)
+    {
+        case EOpArrayLength:
+        case EOpPackSnorm2x16:
+        case EOpPackUnorm2x16:
+        case EOpPackUnorm4x8:
+        case EOpPackSnorm4x8:
+        case EOpPackHalf2x16:
+        case EOpBitCount:
+        case EOpFindLSB:
+        case EOpFindMSB:
+        case EOpIsinf:
+        case EOpIsnan:
+            // Precision of result does not affect the operand in any way.
+            break;
+        case EOpFloatBitsToInt:
+        case EOpFloatBitsToUint:
+        case EOpIntBitsToFloat:
+        case EOpUintBitsToFloat:
+        case EOpUnpackSnorm2x16:
+        case EOpUnpackUnorm2x16:
+        case EOpUnpackUnorm4x8:
+        case EOpUnpackSnorm4x8:
+        case EOpUnpackHalf2x16:
+        case EOpBitfieldReverse:
+            PropagatePrecisionIfApplicable(mOperand, EbpHigh);
+            break;
+        default:
+            PropagatePrecisionIfApplicable(mOperand, precision);
+    }
 }
 
 TIntermSwizzle::TIntermSwizzle(TIntermTyped *operand, const TVector<int> &swizzleOffsets)
@@ -1442,6 +1579,8 @@
     ASSERT(mFalseExpression);
     getTypePointer()->setQualifier(
         TIntermTernary::DetermineQualifier(cond, trueExpression, falseExpression));
+
+    propagatePrecision(derivePrecision());
 }
 
 TIntermLoop::TIntermLoop(TLoopType type,
@@ -1515,6 +1654,20 @@
     return EvqTemporary;
 }
 
+// Derive precision from children nodes
+TPrecision TIntermTernary::derivePrecision() const
+{
+    return GetHigherPrecision(mTrueExpression->getPrecision(), mFalseExpression->getPrecision());
+}
+
+void TIntermTernary::propagatePrecision(TPrecision precision)
+{
+    mType.setPrecision(precision);
+
+    PropagatePrecisionIfApplicable(mTrueExpression, precision);
+    PropagatePrecisionIfApplicable(mFalseExpression, precision);
+}
+
 TIntermTyped *TIntermTernary::fold(TDiagnostics * /* diagnostics */)
 {
     if (mCondition->getAsConstantUnion())
@@ -1538,8 +1691,22 @@
         resultQualifier = EvqConst;
 
     auto numFields = mSwizzleOffsets.size();
-    setType(TType(mOperand->getBasicType(), mOperand->getPrecision(), resultQualifier,
+    setType(TType(mOperand->getBasicType(), EbpUndefined, resultQualifier,
                   static_cast<unsigned char>(numFields)));
+    propagatePrecision(derivePrecision());
+}
+
+// Derive precision from children nodes
+TPrecision TIntermSwizzle::derivePrecision() const
+{
+    return mOperand->getPrecision();
+}
+
+void TIntermSwizzle::propagatePrecision(TPrecision precision)
+{
+    mType.setPrecision(precision);
+
+    PropagatePrecisionIfApplicable(mOperand, precision);
 }
 
 bool TIntermSwizzle::hasDuplicateOffsets() const
@@ -1638,6 +1805,13 @@
         getTypePointer()->setQualifier(EvqTemporary);
     }
 
+    // Result is an intermediate value, so make sure it's identified as such.  That's not true for
+    // interface block arrays being indexed.
+    if (mOp != EOpIndexDirect && mOp != EOpIndexIndirect)
+    {
+        getTypePointer()->setInterfaceBlock(nullptr);
+    }
+
     // Handle indexing ops.
     switch (mOp)
     {
@@ -1649,12 +1823,11 @@
             }
             else if (mLeft->isMatrix())
             {
-                setType(TType(mLeft->getBasicType(), mLeft->getPrecision(), resultQualifier,
-                              static_cast<unsigned char>(mLeft->getRows())));
+                mType.toMatrixColumnType();
             }
             else if (mLeft->isVector())
             {
-                setType(TType(mLeft->getBasicType(), mLeft->getPrecision(), resultQualifier));
+                mType.toComponentType();
             }
             else
             {
@@ -1664,16 +1837,16 @@
         case EOpIndexDirectStruct:
         {
             const TFieldList &fields = mLeft->getType().getStruct()->fields();
-            const int i              = mRight->getAsConstantUnion()->getIConst(0);
-            setType(*fields[i]->type());
+            const int fieldIndex     = mRight->getAsConstantUnion()->getIConst(0);
+            setType(*fields[fieldIndex]->type());
             getTypePointer()->setQualifier(resultQualifier);
             return;
         }
         case EOpIndexDirectInterfaceBlock:
         {
             const TFieldList &fields = mLeft->getType().getInterfaceBlock()->fields();
-            const int i              = mRight->getAsConstantUnion()->getIConst(0);
-            setType(*fields[i]->type());
+            const int fieldIndex     = mRight->getAsConstantUnion()->getIConst(0);
+            setType(*fields[fieldIndex]->type());
             getTypePointer()->setQualifier(resultQualifier);
             return;
         }
@@ -1683,51 +1856,8 @@
 
     ASSERT(mLeft->isArray() == mRight->isArray());
 
-    // The result gets promoted to the highest precision.
-    TPrecision higherPrecision = GetHigherPrecision(mLeft->getPrecision(), mRight->getPrecision());
-    getTypePointer()->setPrecision(higherPrecision);
-
     const int nominalSize = std::max(mLeft->getNominalSize(), mRight->getNominalSize());
 
-    //
-    // All scalars or structs. Code after this test assumes this case is removed!
-    //
-    if (nominalSize == 1)
-    {
-        switch (mOp)
-        {
-            //
-            // Promote to conditional
-            //
-            case EOpEqual:
-            case EOpNotEqual:
-            case EOpLessThan:
-            case EOpGreaterThan:
-            case EOpLessThanEqual:
-            case EOpGreaterThanEqual:
-                setType(TType(EbtBool, EbpUndefined, resultQualifier));
-                break;
-
-            //
-            // And and Or operate on conditionals
-            //
-            case EOpLogicalAnd:
-            case EOpLogicalXor:
-            case EOpLogicalOr:
-                ASSERT(mLeft->getBasicType() == EbtBool && mRight->getBasicType() == EbtBool);
-                setType(TType(EbtBool, EbpUndefined, resultQualifier));
-                break;
-
-            default:
-                break;
-        }
-        return;
-    }
-
-    // If we reach here, at least one of the operands is vector or matrix.
-    // The other operand could be a scalar, vector, or matrix.
-    TBasicType basicType = mLeft->getBasicType();
-
     switch (mOp)
     {
         case EOpMul:
@@ -1735,27 +1865,24 @@
         case EOpMatrixTimesScalar:
             if (mRight->isMatrix())
             {
-                setType(TType(basicType, higherPrecision, resultQualifier,
-                              static_cast<unsigned char>(mRight->getCols()),
-                              static_cast<unsigned char>(mRight->getRows())));
+                getTypePointer()->setPrimarySize(static_cast<unsigned char>(mRight->getCols()));
+                getTypePointer()->setSecondarySize(static_cast<unsigned char>(mRight->getRows()));
             }
             break;
         case EOpMatrixTimesVector:
-            setType(TType(basicType, higherPrecision, resultQualifier,
-                          static_cast<unsigned char>(mLeft->getRows()), 1));
+            getTypePointer()->setPrimarySize(static_cast<unsigned char>(mLeft->getRows()));
+            getTypePointer()->setSecondarySize(1);
             break;
         case EOpMatrixTimesMatrix:
-            setType(TType(basicType, higherPrecision, resultQualifier,
-                          static_cast<unsigned char>(mRight->getCols()),
-                          static_cast<unsigned char>(mLeft->getRows())));
+            getTypePointer()->setPrimarySize(static_cast<unsigned char>(mRight->getCols()));
+            getTypePointer()->setSecondarySize(static_cast<unsigned char>(mLeft->getRows()));
             break;
         case EOpVectorTimesScalar:
-            setType(TType(basicType, higherPrecision, resultQualifier,
-                          static_cast<unsigned char>(nominalSize), 1));
+            getTypePointer()->setPrimarySize(static_cast<unsigned char>(nominalSize));
             break;
         case EOpVectorTimesMatrix:
-            setType(TType(basicType, higherPrecision, resultQualifier,
-                          static_cast<unsigned char>(mRight->getCols()), 1));
+            getTypePointer()->setPrimarySize(static_cast<unsigned char>(mRight->getCols()));
+            ASSERT(getType().getSecondarySize() == 1);
             break;
         case EOpMulAssign:
         case EOpVectorTimesScalarAssign:
@@ -1788,12 +1915,11 @@
         case EOpBitwiseXorAssign:
         case EOpBitwiseOrAssign:
         {
+            ASSERT(!mLeft->isArray() && !mRight->isArray());
             const int secondarySize =
                 std::max(mLeft->getSecondarySize(), mRight->getSecondarySize());
-            setType(TType(basicType, higherPrecision, resultQualifier,
-                          static_cast<unsigned char>(nominalSize),
-                          static_cast<unsigned char>(secondarySize)));
-            ASSERT(!mLeft->isArray() && !mRight->isArray());
+            getTypePointer()->setPrimarySize(static_cast<unsigned char>(nominalSize));
+            getTypePointer()->setSecondarySize(static_cast<unsigned char>(secondarySize));
             break;
         }
         case EOpEqual:
@@ -1807,6 +1933,15 @@
             setType(TType(EbtBool, EbpUndefined, resultQualifier));
             break;
 
+        //
+        // And and Or operate on conditionals
+        //
+        case EOpLogicalAnd:
+        case EOpLogicalXor:
+        case EOpLogicalOr:
+            ASSERT(mLeft->getBasicType() == EbtBool && mRight->getBasicType() == EbtBool);
+            break;
+
         case EOpIndexDirect:
         case EOpIndexIndirect:
         case EOpIndexDirectInterfaceBlock:
@@ -1818,6 +1953,84 @@
             UNREACHABLE();
             break;
     }
+
+    propagatePrecision(derivePrecision());
+}
+
+// Derive precision from children nodes
+TPrecision TIntermBinary::derivePrecision() const
+{
+    const TPrecision higherPrecision =
+        GetHigherPrecision(mLeft->getPrecision(), mRight->getPrecision());
+
+    switch (mOp)
+    {
+        case EOpComma:
+            // Comma takes the right node's value.
+            return mRight->getPrecision();
+
+        case EOpIndexDirect:
+        case EOpIndexIndirect:
+        case EOpBitShiftLeft:
+        case EOpBitShiftRight:
+            // When indexing an array, the precision of the array is preserved (which is the left
+            // node).
+            // For shift operations, the precision is derived from the expression being shifted
+            // (which is also the left node).
+            return mLeft->getPrecision();
+
+        case EOpIndexDirectStruct:
+        case EOpIndexDirectInterfaceBlock:
+        {
+            // When selecting the field of a block, the precision is taken from the field's
+            // declaration.
+            const TFieldList &fields = mOp == EOpIndexDirectStruct
+                                           ? mLeft->getType().getStruct()->fields()
+                                           : mLeft->getType().getInterfaceBlock()->fields();
+            const int fieldIndex = mRight->getAsConstantUnion()->getIConst(0);
+            return fields[fieldIndex]->type()->getPrecision();
+        }
+
+        case EOpEqual:
+        case EOpNotEqual:
+        case EOpLessThan:
+        case EOpGreaterThan:
+        case EOpLessThanEqual:
+        case EOpGreaterThanEqual:
+        case EOpLogicalAnd:
+        case EOpLogicalXor:
+        case EOpLogicalOr:
+            // No precision specified on bool results.
+            return EbpUndefined;
+
+        default:
+            // All other operations are evaluated at the higher of the two operands' precisions.
+            return higherPrecision;
+    }
+}
+
+void TIntermBinary::propagatePrecision(TPrecision precision)
+{
+    getTypePointer()->setPrecision(precision);
+
+    if (mOp != EOpComma)
+    {
+        PropagatePrecisionIfApplicable(mLeft, precision);
+    }
+
+    if (mOp != EOpIndexDirect && mOp != EOpIndexIndirect && mOp != EOpIndexDirectStruct &&
+        mOp != EOpIndexDirectInterfaceBlock)
+    {
+        PropagatePrecisionIfApplicable(mRight, precision);
+    }
+
+    // For indices, always apply highp.  This is purely for the purpose of making sure constant and
+    // constructor nodes are also given a precision, so if they are hoisted to a temp variable,
+    // there would be a precision to apply to that variable.
+    if (mOp == EOpIndexDirect || mOp == EOpIndexIndirect)
+    {
+        PropagatePrecisionIfApplicable(mRight, EbpHigh);
+    }
 }
 
 bool TIntermConstantUnion::hasConstantValue() const
@@ -3194,6 +3407,11 @@
     result->setFConst(builtinFunc(parameter.getFConst()));
 }
 
+void TIntermConstantUnion::propagatePrecision(TPrecision precision)
+{
+    mType.setPrecision(precision);
+}
+
 // static
 TConstantUnion *TIntermConstantUnion::FoldAggregateBuiltIn(TIntermAggregate *aggregate,
                                                            TDiagnostics *diagnostics)
diff --git a/src/compiler/translator/IntermNode.h b/src/compiler/translator/IntermNode.h
index 3328bbd..1a3bed8 100644
--- a/src/compiler/translator/IntermNode.h
+++ b/src/compiler/translator/IntermNode.h
@@ -134,7 +134,7 @@
 class TIntermTyped : public TIntermNode
 {
   public:
-    TIntermTyped() {}
+    TIntermTyped();
 
     virtual TIntermTyped *deepCopy() const override = 0;
 
@@ -156,6 +156,13 @@
 
     virtual const TType &getType() const = 0;
 
+    // Derive the precision of the node based on its children's.
+    virtual TPrecision derivePrecision() const;
+    // Set precision of the current node and propagate it to any child node that doesn't have
+    // precision.  This should be the case only for TIntermConstantUnion nodes as every other node
+    // would already need to have its precision specified or derived.
+    virtual void propagatePrecision(TPrecision precision);
+
     TBasicType getBasicType() const { return getType().getBasicType(); }
     TQualifier getQualifier() const { return getType().getQualifier(); }
     TPrecision getPrecision() const { return getType().getPrecision(); }
@@ -171,13 +178,23 @@
     bool isVector() const { return getType().isVector(); }
     bool isScalar() const { return getType().isScalar(); }
     bool isScalarInt() const { return getType().isScalarInt(); }
-    bool isPrecise() const { return getType().isPrecise(); }
     const char *getBasicString() const { return getType().getBasicString(); }
 
     unsigned int getOutermostArraySize() const { return getType().getOutermostArraySize(); }
 
+    // After every transformation is done and just before outputting the tree (i.e. when the tree
+    // nodes are no longer going to change), the tree is traversed to gather some information to be
+    // stored in the intermediate nodes:
+    //
+    // - Precise-ness, which is set for arithmetic nodes that are involved in the calculation of a
+    //   value assigned to a |precise| variable.
+    void setIsPrecise() { mIsPrecise = true; }
+    bool isPrecise() const { return mIsPrecise; }
+
   protected:
     TIntermTyped(const TIntermTyped &node);
+
+    bool mIsPrecise;
 };
 
 //
@@ -290,6 +307,7 @@
 
   private:
     TIntermSymbol(const TIntermSymbol &) = default;  // Note: not deleted, just private!
+    void propagatePrecision(TPrecision precision) override;
 
     const TVariable *const mVariable;  // Guaranteed to be non-null
 };
@@ -392,6 +410,7 @@
     void foldFloatTypeUnary(const TConstantUnion &parameter,
                             FloatTypeUnaryFunc builtinFunc,
                             TConstantUnion *result) const;
+    void propagatePrecision(TPrecision precision) override;
 
     TIntermConstantUnion(const TIntermConstantUnion &node);  // Note: not deleted, just private!
 };
@@ -458,6 +477,8 @@
 
   private:
     void promote();
+    TPrecision derivePrecision() const override;
+    void propagatePrecision(TPrecision precision) override;
 
     TIntermSwizzle(const TIntermSwizzle &node);  // Note: not deleted, just private!
 };
@@ -507,6 +528,8 @@
 
   private:
     void promote();
+    TPrecision derivePrecision() const override;
+    void propagatePrecision(TPrecision precision) override;
 
     static TQualifier GetCommaQualifier(int shaderVersion,
                                         const TIntermTyped *left,
@@ -554,6 +577,8 @@
 
   private:
     void promote();
+    TPrecision derivePrecision() const override;
+    void propagatePrecision(TPrecision precision) override;
 
     TIntermUnary(const TIntermUnary &node);  // note: not deleted, just private!
 };
@@ -590,7 +615,7 @@
     static TIntermAggregate *CreateRawFunctionCall(const TFunction &func,
                                                    TIntermSequence *arguments);
 
-    // This covers all built-in function calls - whether they are associated with an op or not.
+    // This covers all built-in function calls.
     static TIntermAggregate *CreateBuiltInFunctionCall(const TFunction &func,
                                                        TIntermSequence *arguments);
     static TIntermAggregate *CreateConstructor(const TType &type, TIntermSequence *arguments);
@@ -623,9 +648,6 @@
     void setUseEmulatedFunction() { mUseEmulatedFunction = true; }
     bool getUseEmulatedFunction() { return mUseEmulatedFunction; }
 
-    // Returns true if changing parameter precision may affect the return value.
-    bool gotPrecisionFromChildren() const { return mGotPrecisionFromChildren; }
-
     const TFunction *getFunction() const { return mFunction; }
 
     // Get the function name to display to the user in an error message.
@@ -638,8 +660,6 @@
     // to work around driver bugs. Only for calls mapped to ops other than EOpCall*.
     bool mUseEmulatedFunction;
 
-    bool mGotPrecisionFromChildren;
-
     const TFunction *const mFunction;
 
   private:
@@ -651,19 +671,10 @@
     TIntermAggregate(const TIntermAggregate &node);  // note: not deleted, just private!
 
     void setPrecisionAndQualifier();
+    TPrecision derivePrecision() const override;
+    void propagatePrecision(TPrecision precision) override;
 
     bool areChildrenConstQualified();
-
-    void setPrecisionFromChildren();
-
-    void setPrecisionForMathBuiltInOp();
-
-    // Returns true if precision was set according to special rules for this built-in.
-    bool setPrecisionForSpecialBuiltInOp();
-
-    // Used for non-math built-in functions. The function name in the symbol info needs to be set
-    // before calling this.
-    void setBuiltInFunctionPrecision();
 };
 
 // A list of statements. Either the root node which contains declarations and function definitions,
@@ -891,6 +902,8 @@
     static TQualifier DetermineQualifier(TIntermTyped *cond,
                                          TIntermTyped *trueExpression,
                                          TIntermTyped *falseExpression);
+    TPrecision derivePrecision() const override;
+    void propagatePrecision(TPrecision precision) override;
 
     TIntermTyped *mCondition;
     TIntermTyped *mTrueExpression;
diff --git a/src/compiler/translator/Operator_autogen.h b/src/compiler/translator/Operator_autogen.h
index c54ece4..add595f 100644
--- a/src/compiler/translator/Operator_autogen.h
+++ b/src/compiler/translator/Operator_autogen.h
@@ -29,7 +29,9 @@
     // with AST traversers:
     // * They should not return arrays.
     // * They should not have out parameters.
-    // TODO: remove this.  http://anglebug.com/6059
+    //
+    // DEPRECATED; DO NOT USE.  TODO: remove this.  http://anglebug.com/6059
+    //
     EOpCallInternalRawFunction,
 
     //
@@ -510,10 +512,18 @@
 {
     return op >= EOpTexture2D && op <= EOpTextureGatherOffsetsComp;
 }
+static inline bool IsDerivativesFS(TOperator op)
+{
+    return op >= EOpDFdx && op <= EOpFwidthCoarse;
+}
 static inline bool IsInterpolationFS(TOperator op)
 {
     return op >= EOpInterpolateAtCentroid && op <= EOpInterpolateAtOffset;
 }
+static inline bool IsAtomicCounter(TOperator op)
+{
+    return op >= EOpAtomicCounter && op <= EOpAtomicCounterCompSwap;
+}
 static inline bool IsAtomicMemory(TOperator op)
 {
     return op >= EOpAtomicAdd && op <= EOpAtomicCompSwap;
diff --git a/src/compiler/translator/OutputESSL.cpp b/src/compiler/translator/OutputESSL.cpp
index ac7a74e..e3924b2 100644
--- a/src/compiler/translator/OutputESSL.cpp
+++ b/src/compiler/translator/OutputESSL.cpp
@@ -9,23 +9,10 @@
 namespace sh
 {
 
-TOutputESSL::TOutputESSL(TInfoSinkBase &objSink,
-                         ShHashFunction64 hashFunction,
-                         NameMap &nameMap,
-                         TSymbolTable *symbolTable,
-                         sh::GLenum shaderType,
-                         int shaderVersion,
-                         bool forceHighp,
+TOutputESSL::TOutputESSL(TCompiler *compiler,
+                         TInfoSinkBase &objSink,
                          ShCompileOptions compileOptions)
-    : TOutputGLSLBase(objSink,
-                      hashFunction,
-                      nameMap,
-                      symbolTable,
-                      shaderType,
-                      shaderVersion,
-                      SH_ESSL_OUTPUT,
-                      compileOptions),
-      mForceHighp(forceHighp)
+    : TOutputGLSLBase(compiler, objSink, compileOptions)
 {}
 
 bool TOutputESSL::writeVariablePrecision(TPrecision precision)
@@ -33,11 +20,13 @@
     if (precision == EbpUndefined)
         return false;
 
+    if (precision == EbpHigh && !isHighPrecisionSupported())
+    {
+        precision = EbpMedium;
+    }
+
     TInfoSinkBase &out = objSink();
-    if (mForceHighp)
-        out << getPrecisionString(EbpHigh);
-    else
-        out << getPrecisionString(precision);
+    out << getPrecisionString(precision);
     return true;
 }
 
diff --git a/src/compiler/translator/OutputESSL.h b/src/compiler/translator/OutputESSL.h
index 64ec231..948536f 100644
--- a/src/compiler/translator/OutputESSL.h
+++ b/src/compiler/translator/OutputESSL.h
@@ -15,22 +15,12 @@
 class TOutputESSL : public TOutputGLSLBase
 {
   public:
-    TOutputESSL(TInfoSinkBase &objSink,
-                ShHashFunction64 hashFunction,
-                NameMap &nameMap,
-                TSymbolTable *symbolTable,
-                sh::GLenum shaderType,
-                int shaderVersion,
-                bool forceHighp,
-                ShCompileOptions compileOptions);
+    TOutputESSL(TCompiler *compiler, TInfoSinkBase &objSink, ShCompileOptions compileOptions);
 
   protected:
     bool writeVariablePrecision(TPrecision precision) override;
     ImmutableString translateTextureFunction(const ImmutableString &name,
                                              const ShCompileOptions &option) override;
-
-  private:
-    bool mForceHighp;
 };
 
 }  // namespace sh
diff --git a/src/compiler/translator/OutputGLSL.cpp b/src/compiler/translator/OutputGLSL.cpp
index 86b9cfe..4484008 100644
--- a/src/compiler/translator/OutputGLSL.cpp
+++ b/src/compiler/translator/OutputGLSL.cpp
@@ -11,22 +11,10 @@
 namespace sh
 {
 
-TOutputGLSL::TOutputGLSL(TInfoSinkBase &objSink,
-                         ShHashFunction64 hashFunction,
-                         NameMap &nameMap,
-                         TSymbolTable *symbolTable,
-                         sh::GLenum shaderType,
-                         int shaderVersion,
-                         ShShaderOutput output,
+TOutputGLSL::TOutputGLSL(TCompiler *compiler,
+                         TInfoSinkBase &objSink,
                          ShCompileOptions compileOptions)
-    : TOutputGLSLBase(objSink,
-                      hashFunction,
-                      nameMap,
-                      symbolTable,
-                      shaderType,
-                      shaderVersion,
-                      output,
-                      compileOptions)
+    : TOutputGLSLBase(compiler, objSink, compileOptions)
 {}
 
 bool TOutputGLSL::writeVariablePrecision(TPrecision)
diff --git a/src/compiler/translator/OutputGLSL.h b/src/compiler/translator/OutputGLSL.h
index a539737..1a77efd 100644
--- a/src/compiler/translator/OutputGLSL.h
+++ b/src/compiler/translator/OutputGLSL.h
@@ -15,14 +15,7 @@
 class TOutputGLSL : public TOutputGLSLBase
 {
   public:
-    TOutputGLSL(TInfoSinkBase &objSink,
-                ShHashFunction64 hashFunction,
-                NameMap &nameMap,
-                TSymbolTable *symbolTable,
-                sh::GLenum shaderType,
-                int shaderVersion,
-                ShShaderOutput output,
-                ShCompileOptions compileOptions);
+    TOutputGLSL(TCompiler *compiler, TInfoSinkBase &objSink, ShCompileOptions compileOptions);
 
   protected:
     bool writeVariablePrecision(TPrecision) override;
diff --git a/src/compiler/translator/OutputGLSLBase.cpp b/src/compiler/translator/OutputGLSLBase.cpp
index 2eb0c34..dea76b3 100644
--- a/src/compiler/translator/OutputGLSLBase.cpp
+++ b/src/compiler/translator/OutputGLSLBase.cpp
@@ -81,22 +81,18 @@
 
 }  // namespace
 
-TOutputGLSLBase::TOutputGLSLBase(TInfoSinkBase &objSink,
-                                 ShHashFunction64 hashFunction,
-                                 NameMap &nameMap,
-                                 TSymbolTable *symbolTable,
-                                 sh::GLenum shaderType,
-                                 int shaderVersion,
-                                 ShShaderOutput output,
+TOutputGLSLBase::TOutputGLSLBase(TCompiler *compiler,
+                                 TInfoSinkBase &objSink,
                                  ShCompileOptions compileOptions)
-    : TIntermTraverser(true, true, true, symbolTable),
+    : TIntermTraverser(true, true, true, &compiler->getSymbolTable()),
       mObjSink(objSink),
       mDeclaringVariable(false),
-      mHashFunction(hashFunction),
-      mNameMap(nameMap),
-      mShaderType(shaderType),
-      mShaderVersion(shaderVersion),
-      mOutput(output),
+      mHashFunction(compiler->getHashFunction()),
+      mNameMap(compiler->getNameMap()),
+      mShaderType(compiler->getShaderType()),
+      mShaderVersion(compiler->getShaderVersion()),
+      mOutput(compiler->getOutputType()),
+      mHighPrecisionSupported(compiler->isHighPrecisionSupported()),
       mCompileOptions(compileOptions)
 {}
 
@@ -364,6 +360,17 @@
                 break;
         }
     }
+
+    // Handle qualifiers that produce different output based on shader type.
+    switch (qualifier)
+    {
+        case EvqClipDistance:
+        case EvqCullDistance:
+            return mShaderType == GL_FRAGMENT_SHADER ? "in" : "out";
+        default:
+            break;
+    }
+
     return sh::getQualifierString(qualifier);
 }
 
@@ -422,9 +429,13 @@
         writeVariableType(type, param, true);
 
         if (param->symbolType() != SymbolType::Empty)
+        {
             out << " " << hashName(param);
+        }
         if (type.isArray())
+        {
             out << ArrayString(type);
+        }
 
         // Put a comma if this is not the last argument.
         if (i != paramCount - 1)
@@ -887,8 +898,10 @@
         ImmutableString functionName = node->getFunction()->name();
         if (visit == PreVisit)
         {
-            if (node->getOp() == EOpCallFunctionInAST ||
-                node->getOp() == EOpCallInternalRawFunction)
+            // No raw function is expected.
+            ASSERT(node->getOp() != EOpCallInternalRawFunction);
+
+            if (node->getOp() == EOpCallFunctionInAST)
             {
                 functionName = hashFunctionNameIfNeeded(node->getFunction());
             }
@@ -911,13 +924,12 @@
     if (visit == PreVisit)
     {
         const TIntermSequence &sequence = *(node->getSequence());
-        TIntermTyped *variable          = sequence.front()->getAsTyped();
-        TIntermSymbol *symbolNode       = variable->getAsSymbolNode();
+        TIntermTyped *decl              = sequence.front()->getAsTyped();
+        TIntermSymbol *symbolNode       = decl->getAsSymbolNode();
         if (symbolNode == nullptr)
         {
-            ASSERT(variable->getAsBinaryNode() &&
-                   variable->getAsBinaryNode()->getOp() == EOpInitialize);
-            symbolNode = variable->getAsBinaryNode()->getLeft()->getAsSymbolNode();
+            ASSERT(decl->getAsBinaryNode() && decl->getAsBinaryNode()->getOp() == EOpInitialize);
+            symbolNode = decl->getAsBinaryNode()->getLeft()->getAsSymbolNode();
         }
         ASSERT(symbolNode);
 
@@ -928,11 +940,7 @@
             writeLayoutQualifier(symbolNode);
         }
 
-        // Note: the TIntermDeclaration type is used for variable declaration instead of the
-        // TIntermSymbol one.  The TIntermDeclaration type includes precision promotions from the
-        // right hand side that the symbol may be missing.  This is an inconsistency in the tree
-        // that is too ingrained.
-        writeVariableType(variable->getType(), &symbolNode->variable(), false);
+        writeVariableType(symbolNode->getType(), &symbolNode->variable(), false);
         if (symbolNode->variable().symbolType() != SymbolType::Empty)
         {
             out << " ";
@@ -1128,12 +1136,21 @@
     const TFieldList &fields = structure->fields();
     for (size_t i = 0; i < fields.size(); ++i)
     {
-        const TField *field = fields[i];
-        if (writeVariablePrecision(field->type()->getPrecision()))
+        const TField *field    = fields[i];
+        const TType &fieldType = *field->type();
+        if (writeVariablePrecision(fieldType.getPrecision()))
+        {
             out << " ";
-        out << getTypeName(*field->type()) << " " << hashFieldName(field);
-        if (field->type()->isArray())
-            out << ArrayString(*field->type());
+        }
+        if (fieldType.isPrecise())
+        {
+            writePreciseQualifier(fieldType);
+        }
+        out << getTypeName(fieldType) << " " << hashFieldName(field);
+        if (fieldType.isArray())
+        {
+            out << ArrayString(fieldType);
+        }
         out << ";\n";
     }
     out << "}";
@@ -1238,6 +1255,10 @@
         {
             writeInvariantQualifier(fieldType);
         }
+        if (fieldType.isPrecise())
+        {
+            writePreciseQualifier(fieldType);
+        }
 
         const char *qualifier = getVariableInterpolation(fieldType.getQualifier());
         if (qualifier != nullptr)
diff --git a/src/compiler/translator/OutputGLSLBase.h b/src/compiler/translator/OutputGLSLBase.h
index be1c0e5..780c86c 100644
--- a/src/compiler/translator/OutputGLSLBase.h
+++ b/src/compiler/translator/OutputGLSLBase.h
@@ -17,18 +17,12 @@
 
 namespace sh
 {
+class TCompiler;
 
 class TOutputGLSLBase : public TIntermTraverser
 {
   public:
-    TOutputGLSLBase(TInfoSinkBase &objSink,
-                    ShHashFunction64 hashFunction,
-                    NameMap &nameMap,
-                    TSymbolTable *symbolTable,
-                    sh::GLenum shaderType,
-                    int shaderVersion,
-                    ShShaderOutput output,
-                    ShCompileOptions compileOptions);
+    TOutputGLSLBase(TCompiler *compiler, TInfoSinkBase &objSink, ShCompileOptions compileOptions);
 
     ShShaderOutput getShaderOutput() const { return mOutput; }
 
@@ -93,7 +87,8 @@
 
     const char *mapQualifierToString(TQualifier qualifier);
 
-    sh::GLenum getShaderType() { return mShaderType; }
+    sh::GLenum getShaderType() const { return mShaderType; }
+    bool isHighPrecisionSupported() const { return mHighPrecisionSupported; }
 
   private:
     void declareInterfaceBlockLayout(const TType &type);
@@ -108,15 +103,14 @@
 
     // name hashing.
     ShHashFunction64 mHashFunction;
-
     NameMap &mNameMap;
 
     sh::GLenum mShaderType;
-
     const int mShaderVersion;
-
     ShShaderOutput mOutput;
 
+    bool mHighPrecisionSupported;
+
     ShCompileOptions mCompileOptions;
 };
 
diff --git a/src/compiler/translator/OutputHLSL.cpp b/src/compiler/translator/OutputHLSL.cpp
index 0c84ce1..6b33229 100644
--- a/src/compiler/translator/OutputHLSL.cpp
+++ b/src/compiler/translator/OutputHLSL.cpp
@@ -2375,6 +2375,10 @@
 
             bool lod0 = (mInsideDiscontinuousLoop || mOutputLod0Function) &&
                         mShaderType == GL_FRAGMENT_SHADER;
+
+            // No raw function is expected.
+            ASSERT(node->getOp() != EOpCallInternalRawFunction);
+
             if (node->getOp() == EOpCallFunctionInAST)
             {
                 if (node->isArray())
@@ -2389,12 +2393,6 @@
                 out << DisambiguateFunctionName(node->getSequence());
                 out << (lod0 ? "Lod0(" : "(");
             }
-            else if (node->getOp() == EOpCallInternalRawFunction)
-            {
-                // This path is used for internal functions that don't have their definitions in the
-                // AST, such as precision emulation functions.
-                out << DecorateFunctionIfNeeded(node->getFunction()) << "(";
-            }
             else if (node->getFunction()->isImageFunction())
             {
                 const ImmutableString &name              = node->getFunction()->name();
@@ -3228,7 +3226,7 @@
         if (mOutputType == SH_HLSL_4_1_OUTPUT)
         {
             // Samplers are passed as indices to the sampler array.
-            ASSERT(qualifier != EvqOut && qualifier != EvqInOut);
+            ASSERT(qualifier != EvqParamOut && qualifier != EvqParamInOut);
             out << "const uint " << nameStr << ArrayString(type);
             return;
         }
@@ -3259,7 +3257,7 @@
     // separate parameters. HLSL doesn't natively support samplers in structs.
     if (type.isStructureContainingSamplers())
     {
-        ASSERT(qualifier != EvqOut && qualifier != EvqInOut);
+        ASSERT(qualifier != EvqParamOut && qualifier != EvqParamInOut);
         TVector<const TVariable *> samplerSymbols;
         std::string namePrefix = "angle";
         namePrefix += nameStr.c_str();
diff --git a/src/compiler/translator/OutputSPIRV.cpp b/src/compiler/translator/OutputSPIRV.cpp
index cd39789..c6a3233 100644
--- a/src/compiler/translator/OutputSPIRV.cpp
+++ b/src/compiler/translator/OutputSPIRV.cpp
@@ -14,6 +14,8 @@
 #include "common/spirv/spirv_instruction_builder_autogen.h"
 #include "compiler/translator/BuildSPIRV.h"
 #include "compiler/translator/Compiler.h"
+#include "compiler/translator/StaticType.h"
+#include "compiler/translator/tree_util/FindPreciseNodes.h"
 #include "compiler/translator/tree_util/IntermTraverse.h"
 
 #include <cfloat>
@@ -183,7 +185,7 @@
 class OutputSPIRVTraverser : public TIntermTraverser
 {
   public:
-    OutputSPIRVTraverser(TCompiler *compiler, ShCompileOptions compileOptions, bool forceHighp);
+    OutputSPIRVTraverser(TCompiler *compiler, ShCompileOptions compileOptions);
     ~OutputSPIRVTraverser() override;
 
     spirv::Blob getSpirv();
@@ -259,15 +261,19 @@
     spirv::IdRef createArrayOrStructConstructor(TIntermAggregate *node,
                                                 spirv::IdRef typeId,
                                                 const spirv::IdRefList &parameters);
-    spirv::IdRef createConstructorVectorFromScalar(const TType &type,
+    spirv::IdRef createConstructorScalarFromNonScalar(TIntermAggregate *node,
+                                                      spirv::IdRef typeId,
+                                                      const spirv::IdRefList &parameters);
+    spirv::IdRef createConstructorVectorFromScalar(const TType &parameterType,
+                                                   const TType &expectedType,
                                                    spirv::IdRef typeId,
                                                    const spirv::IdRefList &parameters);
     spirv::IdRef createConstructorVectorFromMatrix(TIntermAggregate *node,
                                                    spirv::IdRef typeId,
                                                    const spirv::IdRefList &parameters);
-    spirv::IdRef createConstructorVectorFromScalarsAndVectors(TIntermAggregate *node,
-                                                              spirv::IdRef typeId,
-                                                              const spirv::IdRefList &parameters);
+    spirv::IdRef createConstructorVectorFromMultiple(TIntermAggregate *node,
+                                                     spirv::IdRef typeId,
+                                                     const spirv::IdRefList &parameters);
     spirv::IdRef createConstructorMatrixFromScalar(TIntermAggregate *node,
                                                    spirv::IdRef typeId,
                                                    const spirv::IdRefList &parameters);
@@ -279,7 +285,9 @@
                                                    const spirv::IdRefList &parameters);
     // Load N values where N is the number of node's children.  In some cases, the last M values are
     // lvalues which should be skipped.
-    spirv::IdRefList loadAllParams(TIntermOperator *node, size_t skipCount);
+    spirv::IdRefList loadAllParams(TIntermOperator *node,
+                                   size_t skipCount,
+                                   spirv::IdRefList *paramTypeIds);
     void extractComponents(TIntermAggregate *node,
                            size_t componentCount,
                            const spirv::IdRefList &parameters,
@@ -289,14 +297,16 @@
     spirv::IdRef endShortCircuit(TIntermBinary *node, spirv::IdRef *typeId);
 
     spirv::IdRef visitOperator(TIntermOperator *node, spirv::IdRef resultTypeId);
-    spirv::IdRef createIncrementDecrement(TIntermOperator *node, spirv::IdRef resultTypeId);
     spirv::IdRef createCompare(TIntermOperator *node, spirv::IdRef resultTypeId);
     spirv::IdRef createAtomicBuiltIn(TIntermOperator *node, spirv::IdRef resultTypeId);
     spirv::IdRef createImageTextureBuiltIn(TIntermOperator *node, spirv::IdRef resultTypeId);
+    spirv::IdRef createSubpassLoadBuiltIn(TIntermOperator *node, spirv::IdRef resultTypeId);
     spirv::IdRef createInterpolate(TIntermOperator *node, spirv::IdRef resultTypeId);
 
     spirv::IdRef createFunctionCall(TIntermAggregate *node, spirv::IdRef resultTypeId);
 
+    void visitArrayLength(TIntermUnary *node);
+
     // Cast between types.  There are two kinds of casts:
     //
     // - A constructor can cast between basic types, for example vec4(someInt).
@@ -308,7 +318,7 @@
     //
     spirv::IdRef castBasicType(spirv::IdRef value,
                                const TType &valueType,
-                               TBasicType expectedBasicType,
+                               const TType &expectedType,
                                spirv::IdRef *resultTypeIdOut);
     spirv::IdRef cast(spirv::IdRef value,
                       const TType &valueType,
@@ -316,6 +326,13 @@
                       const SpirvTypeSpec &expectedTypeSpec,
                       spirv::IdRef *resultTypeIdOut);
 
+    // Given a list of parameters to an operator, extend the scalars to match the vectors.  GLSL
+    // frequently has operators that mix vectors and scalars, while SPIR-V usually applies the
+    // operations per component (requiring the scalars to turn into a vector).
+    void extendScalarParamsToVector(TIntermOperator *node,
+                                    spirv::IdRef resultTypeId,
+                                    spirv::IdRefList *parameters);
+
     // Helper to reduce vector == and != with OpAll and OpAny respectively.  If multiple ids are
     // given, either OpLogicalAnd or OpLogicalOr is used (if two operands) or a bool vector is
     // constructed and OpAll and OpAny used.
@@ -350,7 +367,7 @@
                                                uint32_t fieldIndex);
 
     TCompiler *mCompiler;
-    ShCompileOptions mCompileOptions;
+    ANGLE_MAYBE_UNUSED ShCompileOptions mCompileOptions;
 
     SPIRVBuilder mBuilder;
 
@@ -377,10 +394,10 @@
     bool mIsSymbolBeingDeclared = false;
 };
 
-spv::StorageClass GetStorageClass(const TType &type)
+spv::StorageClass GetStorageClass(const TType &type, GLenum shaderType)
 {
-    // Opaque uniforms (samplers and images) have the UniformConstant storage class
-    if (type.isSampler() || type.isImage())
+    // Opaque uniforms (samplers, images and subpass inputs) have the UniformConstant storage class
+    if (IsOpaqueType(type.getBasicType()))
     {
         return spv::StorageClassUniformConstant;
     }
@@ -399,15 +416,6 @@
         return spv::StorageClassOutput;
     }
 
-    // Uniform and storage buffers have the Uniform storage class.  Default uniforms are gathered in
-    // a uniform block as well.
-    if (type.getInterfaceBlock() != nullptr || qualifier == EvqUniform)
-    {
-        // I/O blocks must have already been classified as input or output above.
-        ASSERT(!IsShaderIoBlock(qualifier));
-        return spv::StorageClassUniform;
-    }
-
     switch (qualifier)
     {
         case EvqShared:
@@ -415,13 +423,15 @@
             return spv::StorageClassWorkgroup;
 
         case EvqGlobal:
-            // Global variables have the Private class.
+        case EvqConst:
+            // Global variables have the Private class.  Complex constant variables that are not
+            // folded are also defined globally.
             return spv::StorageClassPrivate;
 
         case EvqTemporary:
-        case EvqIn:
-        case EvqOut:
-        case EvqInOut:
+        case EvqParamIn:
+        case EvqParamOut:
+        case EvqParamInOut:
             // Function-local variables have the Function class
             return spv::StorageClassFunction;
 
@@ -430,37 +440,63 @@
         case EvqFragCoord:
         case EvqFrontFacing:
         case EvqPointCoord:
+        case EvqSampleID:
+        case EvqSamplePosition:
+        case EvqSampleMaskIn:
+        case EvqPatchVerticesIn:
+        case EvqTessCoord:
+        case EvqPrimitiveIDIn:
+        case EvqInvocationID:
         case EvqHelperInvocation:
         case EvqNumWorkGroups:
         case EvqWorkGroupID:
         case EvqLocalInvocationID:
         case EvqGlobalInvocationID:
         case EvqLocalInvocationIndex:
+        case EvqViewIDOVR:
             return spv::StorageClassInput;
 
+        case EvqPosition:
+        case EvqPointSize:
         case EvqFragDepth:
+        case EvqSampleMask:
             return spv::StorageClassOutput;
 
-        default:
-            // TODO: http://anglebug.com/4889
-            UNIMPLEMENTED();
-    }
+        case EvqClipDistance:
+        case EvqCullDistance:
+            // gl_Clip/CullDistance (not accessed through gl_in/gl_out) are inputs in FS and outputs
+            // otherwise.
+            return shaderType == GL_FRAGMENT_SHADER ? spv::StorageClassInput
+                                                    : spv::StorageClassOutput;
 
-    UNREACHABLE();
-    return spv::StorageClassPrivate;
+        case EvqTessLevelOuter:
+        case EvqTessLevelInner:
+            // gl_TessLevelOuter/Inner are outputs in TCS and inputs in TES.
+            return shaderType == GL_TESS_CONTROL_SHADER_EXT ? spv::StorageClassOutput
+                                                            : spv::StorageClassInput;
+
+        case EvqLayer:
+        case EvqPrimitiveID:
+            // gl_Layer is output in GS and input in FS.
+            // gl_PrimitiveID is output in GS and input in TCS, TES and FS.
+            return shaderType == GL_GEOMETRY_SHADER ? spv::StorageClassOutput
+                                                    : spv::StorageClassInput;
+
+        default:
+            // Uniform and storage buffers have the Uniform storage class.  Default uniforms are
+            // gathered in a uniform block as well.
+            ASSERT(type.getInterfaceBlock() != nullptr || qualifier == EvqUniform);
+            // I/O blocks must have already been classified as input or output above.
+            ASSERT(!IsShaderIoBlock(qualifier));
+            return spv::StorageClassUniform;
+    }
 }
 
-OutputSPIRVTraverser::OutputSPIRVTraverser(TCompiler *compiler,
-                                           ShCompileOptions compileOptions,
-                                           bool forceHighp)
+OutputSPIRVTraverser::OutputSPIRVTraverser(TCompiler *compiler, ShCompileOptions compileOptions)
     : TIntermTraverser(true, true, true, &compiler->getSymbolTable()),
       mCompiler(compiler),
       mCompileOptions(compileOptions),
-      mBuilder(compiler,
-               compileOptions,
-               forceHighp,
-               compiler->getHashFunction(),
-               compiler->getNameMap())
+      mBuilder(compiler, compileOptions, compiler->getHashFunction(), compiler->getNameMap())
 {}
 
 OutputSPIRVTraverser::~OutputSPIRVTraverser()
@@ -472,7 +508,7 @@
                                                               const TType &type,
                                                               spv::StorageClass *storageClass)
 {
-    *storageClass = GetStorageClass(type);
+    *storageClass = GetStorageClass(type, mCompiler->getShaderType());
     auto iter     = mSymbolIdMap.find(symbol);
     if (iter != mSymbolIdMap.end())
     {
@@ -485,6 +521,7 @@
 
     switch (type.getQualifier())
     {
+        // Vertex shader built-ins
         case EvqVertexID:
             name              = "gl_VertexIndex";
             builtInDecoration = spv::BuiltInVertexIndex;
@@ -510,12 +547,90 @@
         case EvqFragDepth:
             name              = "gl_FragDepth";
             builtInDecoration = spv::BuiltInFragDepth;
+            mBuilder.addExecutionMode(spv::ExecutionModeDepthReplacing);
+            break;
+        case EvqSampleMask:
+            name              = "gl_SampleMask";
+            builtInDecoration = spv::BuiltInSampleMask;
+            break;
+        case EvqSampleMaskIn:
+            name              = "gl_SampleMaskIn";
+            builtInDecoration = spv::BuiltInSampleMask;
+            break;
+        case EvqSampleID:
+            name              = "gl_SampleID";
+            builtInDecoration = spv::BuiltInSampleId;
+            mBuilder.addCapability(spv::CapabilitySampleRateShading);
+            break;
+        case EvqSamplePosition:
+            name              = "gl_SamplePosition";
+            builtInDecoration = spv::BuiltInSamplePosition;
+            mBuilder.addCapability(spv::CapabilitySampleRateShading);
+            break;
+        case EvqClipDistance:
+            name              = "gl_ClipDistance";
+            builtInDecoration = spv::BuiltInClipDistance;
+            mBuilder.addCapability(spv::CapabilityClipDistance);
+            break;
+        case EvqCullDistance:
+            name              = "gl_CullDistance";
+            builtInDecoration = spv::BuiltInCullDistance;
+            mBuilder.addCapability(spv::CapabilityCullDistance);
             break;
         case EvqHelperInvocation:
             name              = "gl_HelperInvocation";
             builtInDecoration = spv::BuiltInHelperInvocation;
             break;
 
+        // Tessellation built-ins
+        case EvqPatchVerticesIn:
+            name              = "gl_PatchVerticesIn";
+            builtInDecoration = spv::BuiltInPatchVertices;
+            break;
+        case EvqTessLevelOuter:
+            name              = "gl_TessLevelOuter";
+            builtInDecoration = spv::BuiltInTessLevelOuter;
+            break;
+        case EvqTessLevelInner:
+            name              = "gl_TessLevelInner";
+            builtInDecoration = spv::BuiltInTessLevelInner;
+            break;
+        case EvqTessCoord:
+            name              = "gl_TessCoord";
+            builtInDecoration = spv::BuiltInTessCoord;
+            break;
+
+        // Shared geometry and tessellation built-ins
+        case EvqInvocationID:
+            name              = "gl_InvocationID";
+            builtInDecoration = spv::BuiltInInvocationId;
+            break;
+        case EvqPrimitiveID:
+            name              = "gl_PrimitiveID";
+            builtInDecoration = spv::BuiltInPrimitiveId;
+
+            // In fragment shader, add the Geometry capability.
+            if (mCompiler->getShaderType() == GL_FRAGMENT_SHADER)
+            {
+                mBuilder.addCapability(spv::CapabilityGeometry);
+            }
+
+            break;
+
+        // Geometry shader built-ins
+        case EvqPrimitiveIDIn:
+            name              = "gl_PrimitiveIDIn";
+            builtInDecoration = spv::BuiltInPrimitiveId;
+            break;
+        case EvqLayer:
+            name              = "gl_Layer";
+            builtInDecoration = spv::BuiltInLayer;
+
+            // gl_Layer requires the Geometry capability, even in fragment shaders.
+            mBuilder.addCapability(spv::CapabilityGeometry);
+
+            break;
+
         // Compute shader built-ins
         case EvqNumWorkGroups:
             name              = "gl_NumWorkGroups";
@@ -537,9 +652,17 @@
             name              = "gl_LocalInvocationIndex";
             builtInDecoration = spv::BuiltInLocalInvocationIndex;
             break;
+
+        // Extensions
+        case EvqViewIDOVR:
+            name              = "gl_ViewID_OVR";
+            builtInDecoration = spv::BuiltInViewIndex;
+            mBuilder.addCapability(spv::CapabilityMultiView);
+            mBuilder.addExtension(SPIRVExtensions::MultiviewOVR);
+            break;
+
         default:
-            // TODO: more built-ins.  http://anglebug.com/4889
-            UNIMPLEMENTED();
+            UNREACHABLE();
     }
 
     const spirv::IdRef typeId = mBuilder.getTypeData(type, {}).id;
@@ -550,6 +673,12 @@
     spirv::WriteDecorate(mBuilder.getSpirvDecorations(), varId, spv::DecorationBuiltIn,
                          {spirv::LiteralInteger(builtInDecoration)});
 
+    // Additionally, decorate gl_TessLevel* with Patch.
+    if (type.getQualifier() == EvqTessLevelInner || type.getQualifier() == EvqTessLevelOuter)
+    {
+        spirv::WriteDecorate(mBuilder.getSpirvDecorations(), varId, spv::DecorationPatch, {});
+    }
+
     mSymbolIdMap.insert({symbol, varId});
     return varId;
 }
@@ -1139,12 +1268,14 @@
     }
 
     // Take each constructor argument that is visited and evaluate it as rvalue
-    spirv::IdRefList parameters = loadAllParams(node, 0);
+    spirv::IdRefList parameters = loadAllParams(node, 0, nullptr);
 
     // Constructors in GLSL can take various shapes, resulting in different translations to SPIR-V
     // (in each case, if the parameter doesn't match the type being constructed, it must be cast):
     //
     // - float(f): This should translate to just f
+    // - float(v): This should translate to OpCompositeExtract %scalar %v 0
+    // - float(m): This should translate to OpCompositeExtract %scalar %m 0 0
     // - vecN(f): This should translate to OpCompositeConstruct %vecN %f %f .. %f
     // - vecN(v1.zy, v2.x): This can technically translate to OpCompositeConstruct with two ids; the
     //   results of v1.zy and v2.x.  However, for simplicity it's easier to generate that
@@ -1190,36 +1321,44 @@
     // - matNxM(mNxM) (where the argument is a single matrix with the same dimensions).  Note that
     //   matrices are always float, so there's no actual cast and this would be a no-op.
     //
+    const bool isSingleScalarCast = arguments.size() == 1 && type.isScalar() && arg0Type.isScalar();
     const bool isSingleVectorCast = arguments.size() == 1 && type.isVector() &&
                                     arg0Type.isVector() &&
                                     type.getNominalSize() == arg0Type.getNominalSize();
     const bool isSingleMatrixCast = arguments.size() == 1 && type.isMatrix() &&
                                     arg0Type.isMatrix() && type.getCols() == arg0Type.getCols() &&
                                     type.getRows() == arg0Type.getRows();
-    if (type.isScalar() || isSingleVectorCast || isSingleMatrixCast)
+    if (isSingleScalarCast || isSingleVectorCast || isSingleMatrixCast)
     {
-        return castBasicType(parameters[0], arg0Type, type.getBasicType(), nullptr);
+        return castBasicType(parameters[0], arg0Type, type, nullptr);
+    }
+
+    if (type.isScalar())
+    {
+        ASSERT(arguments.size() == 1);
+        return createConstructorScalarFromNonScalar(node, typeId, parameters);
     }
 
     if (type.isVector())
     {
         if (arguments.size() == 1 && arg0Type.isScalar())
         {
-            parameters[0] = castBasicType(parameters[0], arg0Type, type.getBasicType(), nullptr);
-            return createConstructorVectorFromScalar(node->getType(), typeId, parameters);
+            return createConstructorVectorFromScalar(arg0Type, type, typeId, parameters);
         }
-        if (arguments.size() == 1 && arg0Type.isMatrix())
+        if (arg0Type.isMatrix())
         {
+            // If the first argument is a matrix, it will always have enough components to fill an
+            // entire vector, so it doesn't matter what's specified after it.
             return createConstructorVectorFromMatrix(node, typeId, parameters);
         }
-        return createConstructorVectorFromScalarsAndVectors(node, typeId, parameters);
+        return createConstructorVectorFromMultiple(node, typeId, parameters);
     }
 
     ASSERT(type.isMatrix());
 
-    if (arg0Type.isScalar())
+    if (arg0Type.isScalar() && arguments.size() == 1)
     {
-        parameters[0] = castBasicType(parameters[0], arg0Type, type.getBasicType(), nullptr);
+        parameters[0] = castBasicType(parameters[0], arg0Type, type, nullptr);
         return createConstructorMatrixFromScalar(node, typeId, parameters);
     }
     if (arg0Type.isMatrix())
@@ -1240,16 +1379,48 @@
     return result;
 }
 
+spirv::IdRef OutputSPIRVTraverser::createConstructorScalarFromNonScalar(
+    TIntermAggregate *node,
+    spirv::IdRef typeId,
+    const spirv::IdRefList &parameters)
+{
+    ASSERT(parameters.size() == 1);
+    const TType &type     = node->getType();
+    const TType &arg0Type = node->getChildNode(0)->getAsTyped()->getType();
+
+    const spirv::IdRef result = mBuilder.getNewId(mBuilder.getDecorations(type));
+
+    spirv::LiteralIntegerList indices = {spirv::LiteralInteger(0)};
+    if (arg0Type.isMatrix())
+    {
+        indices.push_back(spirv::LiteralInteger(0));
+    }
+
+    spirv::WriteCompositeExtract(mBuilder.getSpirvCurrentFunctionBlock(),
+                                 mBuilder.getBasicTypeId(arg0Type.getBasicType(), 1), result,
+                                 parameters[0], indices);
+
+    TType arg0TypeAsScalar(arg0Type);
+    arg0TypeAsScalar.toComponentType();
+
+    return castBasicType(result, arg0TypeAsScalar, type, nullptr);
+}
+
 spirv::IdRef OutputSPIRVTraverser::createConstructorVectorFromScalar(
-    const TType &type,
+    const TType &parameterType,
+    const TType &expectedType,
     spirv::IdRef typeId,
     const spirv::IdRefList &parameters)
 {
     // vecN(f) translates to OpCompositeConstruct %vecN %f ... %f
     ASSERT(parameters.size() == 1);
-    spirv::IdRefList replicatedParameter(type.getNominalSize(), parameters[0]);
 
-    const spirv::IdRef result = mBuilder.getNewId(mBuilder.getDecorations(type));
+    const spirv::IdRef castParameter =
+        castBasicType(parameters[0], parameterType, expectedType, nullptr);
+
+    spirv::IdRefList replicatedParameter(expectedType.getNominalSize(), castParameter);
+
+    const spirv::IdRef result = mBuilder.getNewId(mBuilder.getDecorations(parameterType));
     spirv::WriteCompositeConstruct(mBuilder.getSpirvCurrentFunctionBlock(), typeId, result,
                                    replicatedParameter);
     return result;
@@ -1266,15 +1437,15 @@
 
     // Construct the vector with the basic type of the argument, and cast it at end if needed.
     ASSERT(parameters.size() == 1);
-    const TType &arg0Type              = node->getChildNode(0)->getAsTyped()->getType();
-    const TBasicType expectedBasicType = node->getType().getBasicType();
+    const TType &arg0Type     = node->getChildNode(0)->getAsTyped()->getType();
+    const TType &expectedType = node->getType();
 
     spirv::IdRef argumentTypeId = typeId;
     TType arg0TypeAsVector(arg0Type);
     arg0TypeAsVector.setPrimarySize(static_cast<unsigned char>(node->getType().getNominalSize()));
     arg0TypeAsVector.setSecondarySize(1);
 
-    if (arg0Type.getBasicType() != expectedBasicType)
+    if (arg0Type.getBasicType() != expectedType.getBasicType())
     {
         argumentTypeId = mBuilder.getTypeData(arg0TypeAsVector, {}).id;
     }
@@ -1283,22 +1454,60 @@
     spirv::WriteCompositeConstruct(mBuilder.getSpirvCurrentFunctionBlock(), argumentTypeId, result,
                                    extractedComponents);
 
-    if (arg0Type.getBasicType() != expectedBasicType)
+    if (arg0Type.getBasicType() != expectedType.getBasicType())
     {
-        result = castBasicType(result, arg0TypeAsVector, expectedBasicType, nullptr);
+        result = castBasicType(result, arg0TypeAsVector, expectedType, nullptr);
     }
 
     return result;
 }
 
-spirv::IdRef OutputSPIRVTraverser::createConstructorVectorFromScalarsAndVectors(
+spirv::IdRef OutputSPIRVTraverser::createConstructorVectorFromMultiple(
     TIntermAggregate *node,
     spirv::IdRef typeId,
     const spirv::IdRefList &parameters)
 {
+    const TType &type = node->getType();
     // vecN(v1.zy, v2.x) translates to OpCompositeConstruct %vecN %v1.z %v1.y %v2.x
     spirv::IdRefList extractedComponents;
-    extractComponents(node, node->getType().getNominalSize(), parameters, &extractedComponents);
+    extractComponents(node, type.getNominalSize(), parameters, &extractedComponents);
+
+    // Handle the case where a matrix is used in the constructor anywhere but the first place.  In
+    // that case, the components extracted from the matrix might need casting to the right type.
+    const TIntermSequence &arguments = *node->getSequence();
+    for (size_t argumentIndex = 0, componentIndex = 0;
+         argumentIndex < arguments.size() && componentIndex < extractedComponents.size();
+         ++argumentIndex)
+    {
+        TIntermNode *argument     = arguments[argumentIndex];
+        const TType &argumentType = argument->getAsTyped()->getType();
+        if (argumentType.isScalar() || argumentType.isVector())
+        {
+            // extractComponents already casts scalar and vector components.
+            componentIndex += argumentType.getNominalSize();
+            continue;
+        }
+
+        TType componentType(argumentType);
+        componentType.toComponentType();
+
+        for (int columnIndex = 0;
+             columnIndex < argumentType.getCols() && componentIndex < extractedComponents.size();
+             ++columnIndex)
+        {
+            for (int rowIndex = 0;
+                 rowIndex < argumentType.getRows() && componentIndex < extractedComponents.size();
+                 ++rowIndex, ++componentIndex)
+            {
+                extractedComponents[componentIndex] = castBasicType(
+                    extractedComponents[componentIndex], componentType, type, nullptr);
+            }
+        }
+
+        // Matrices all have enough components to fill a vector, so it's impossible to need to visit
+        // any other arguments that may come after.
+        ASSERT(componentIndex == extractedComponents.size());
+    }
 
     const spirv::IdRef result = mBuilder.getNewId(mBuilder.getDecorations(node->getType()));
     spirv::WriteCompositeConstruct(mBuilder.getSpirvCurrentFunctionBlock(), typeId, result,
@@ -1454,10 +1663,9 @@
     {
         // If the parameter is a larger matrix than the constructor type, extract the columns
         // directly and potentially swizzle them.
-        SpirvType paramColumnType     = mBuilder.getSpirvType(parameterType, {});
-        paramColumnType.secondarySize = 1;
-        const spirv::IdRef paramColumnTypeId =
-            mBuilder.getSpirvTypeData(paramColumnType, nullptr).id;
+        TType paramColumnType(parameterType);
+        paramColumnType.toMatrixColumnType();
+        const spirv::IdRef paramColumnTypeId = mBuilder.getTypeData(paramColumnType, {}).id;
 
         const bool needsSwizzle           = parameterType.getRows() > type.getRows();
         spirv::LiteralIntegerList swizzle = {spirv::LiteralInteger(0), spirv::LiteralInteger(1),
@@ -1489,11 +1697,9 @@
     {
         // Otherwise create an identity matrix and fill in the components that can be taken from the
         // given parameter.
-        SpirvType paramComponentType     = mBuilder.getSpirvType(parameterType, {});
-        paramComponentType.primarySize   = 1;
-        paramComponentType.secondarySize = 1;
-        const spirv::IdRef paramComponentTypeId =
-            mBuilder.getSpirvTypeData(paramComponentType, nullptr).id;
+        TType paramComponentType(parameterType);
+        paramComponentType.toComponentType();
+        const spirv::IdRef paramComponentTypeId = mBuilder.getTypeData(paramComponentType, {}).id;
 
         for (int columnIndex = 0; columnIndex < type.getCols(); ++columnIndex)
         {
@@ -1503,7 +1709,8 @@
             {
                 // Take the component from the constructor parameter if possible.
                 spirv::IdRef componentId;
-                if (componentIndex < parameterType.getRows())
+                if (componentIndex < parameterType.getRows() &&
+                    columnIndex < parameterType.getCols())
                 {
                     componentId = mBuilder.getNewId(decorations);
                     spirv::WriteCompositeExtract(mBuilder.getSpirvCurrentFunctionBlock(),
@@ -1517,13 +1724,13 @@
                     switch (type.getBasicType())
                     {
                         case EbtFloat:
-                            componentId = mBuilder.getFloatConstant(isOnDiagonal ? 0.0f : 1.0f);
+                            componentId = mBuilder.getFloatConstant(isOnDiagonal ? 1.0f : 0.0f);
                             break;
                         case EbtInt:
-                            componentId = mBuilder.getIntConstant(isOnDiagonal ? 0 : 1);
+                            componentId = mBuilder.getIntConstant(isOnDiagonal ? 1 : 0);
                             break;
                         case EbtUInt:
-                            componentId = mBuilder.getUintConstant(isOnDiagonal ? 0 : 1);
+                            componentId = mBuilder.getUintConstant(isOnDiagonal ? 1 : 0);
                             break;
                         case EbtBool:
                             componentId = mBuilder.getBoolConstant(isOnDiagonal);
@@ -1549,7 +1756,9 @@
     return result;
 }
 
-spirv::IdRefList OutputSPIRVTraverser::loadAllParams(TIntermOperator *node, size_t skipCount)
+spirv::IdRefList OutputSPIRVTraverser::loadAllParams(TIntermOperator *node,
+                                                     size_t skipCount,
+                                                     spirv::IdRefList *paramTypeIds)
 {
     const size_t parameterCount = node->getChildCount();
     spirv::IdRefList parameters;
@@ -1559,10 +1768,15 @@
         // Take each parameter that is visited and evaluate it as rvalue
         NodeData &param = mNodeData[mNodeData.size() - parameterCount + paramIndex];
 
+        spirv::IdRef paramTypeId;
         const spirv::IdRef paramValue = accessChainLoad(
-            &param, node->getChildNode(paramIndex)->getAsTyped()->getType(), nullptr);
+            &param, node->getChildNode(paramIndex)->getAsTyped()->getType(), &paramTypeId);
 
         parameters.push_back(paramValue);
+        if (paramTypeIds)
+        {
+            paramTypeIds->push_back(paramTypeId);
+        }
     }
 
     return parameters;
@@ -1578,7 +1792,7 @@
     const TIntermSequence &arguments = *node->getSequence();
 
     const SpirvDecorations decorations = mBuilder.getDecorations(node->getType());
-    const TBasicType expectedBasicType = node->getType().getBasicType();
+    const TType &expectedType          = node->getType();
 
     ASSERT(arguments.size() == parameters.size());
 
@@ -1596,23 +1810,22 @@
             const spirv::IdRef castParameterId =
                 argument->getAsConstantUnion()
                     ? parameterId
-                    : castBasicType(parameterId, argumentType, expectedBasicType, nullptr);
+                    : castBasicType(parameterId, argumentType, expectedType, nullptr);
             extractedComponentsOut->push_back(castParameterId);
             continue;
         }
         if (argumentType.isVector())
         {
-            SpirvType componentType   = mBuilder.getSpirvType(argumentType, {});
-            componentType.type        = expectedBasicType;
-            componentType.primarySize = 1;
-            const spirv::IdRef componentTypeId =
-                mBuilder.getSpirvTypeData(componentType, nullptr).id;
+            TType componentType(argumentType);
+            componentType.toComponentType();
+            componentType.setBasicType(expectedType.getBasicType());
+            const spirv::IdRef componentTypeId = mBuilder.getTypeData(componentType, {}).id;
 
             // Cast the whole vector parameter in one go.
             const spirv::IdRef castParameterId =
                 argument->getAsConstantUnion()
                     ? parameterId
-                    : castBasicType(parameterId, argumentType, expectedBasicType, nullptr);
+                    : castBasicType(parameterId, argumentType, expectedType, nullptr);
 
             // For vector parameters, take components out of the vector one by one.
             for (int componentIndex = 0; componentIndex < argumentType.getNominalSize() &&
@@ -1631,10 +1844,9 @@
 
         ASSERT(argumentType.isMatrix());
 
-        SpirvType componentType            = mBuilder.getSpirvType(argumentType, {});
-        componentType.primarySize          = 1;
-        componentType.secondarySize        = 1;
-        const spirv::IdRef componentTypeId = mBuilder.getSpirvTypeData(componentType, nullptr).id;
+        TType componentType(argumentType);
+        componentType.toComponentType();
+        const spirv::IdRef componentTypeId = mBuilder.getTypeData(componentType, {}).id;
 
         // For matrix parameters, take components out of the matrix one by one in column-major
         // order.  No cast is done here; it would only be required for vector constructors with
@@ -1769,46 +1981,50 @@
     for (size_t paramIndex = 0; paramIndex < parameterCount; ++paramIndex)
     {
         const TType &paramType           = function->getParam(paramIndex)->getType();
+        const TType &argType             = node->getChildNode(paramIndex)->getAsTyped()->getType();
         const TQualifier &paramQualifier = paramType.getQualifier();
         NodeData &param = mNodeData[mNodeData.size() - parameterCount + paramIndex];
 
         spirv::IdRef paramValue;
 
-        if (paramQualifier == EvqConst)
+        if (paramQualifier == EvqParamConst)
         {
             // |const| parameters are passed as rvalue.
-            paramValue = accessChainLoad(&param, paramType, nullptr);
+            paramValue = accessChainLoad(&param, argType, nullptr);
         }
         else if (IsOpaqueType(paramType.getBasicType()))
         {
             // Opaque uniforms are passed by pointer.
             paramValue = accessChainCollapse(&param);
         }
-        else if (IsAccessChainUnindexedLValue(param) &&
-                 (param.accessChain.storageClass == spv::StorageClassFunction &&
-                  (mCompileOptions & SH_GENERATE_SPIRV_WORKAROUNDS) == 0))
+        else if (IsAccessChainUnindexedLValue(param) && paramQualifier == EvqParamOut &&
+                 param.accessChain.storageClass == spv::StorageClassFunction)
         {
-            // Unindexed lvalues are passed directly.
+            // Unindexed lvalues are passed directly, but only when they are an out/inout.  In GLSL,
+            // in parameters are considered "copied" to the function.  In SPIR-V, every parameter is
+            // implicitly inout.  If a function takes an in parameter and modifies it, the caller
+            // has to ensure that it calls the function with a copy.  Currently, the functions don't
+            // track whether an in parameter is modified, so we conservatively assume it is.
             //
             // This optimization is not applied on buggy drivers.  http://anglebug.com/6110.
             paramValue = param.baseId;
         }
         else
         {
-            ASSERT(paramQualifier == EvqIn || paramQualifier == EvqOut ||
-                   paramQualifier == EvqInOut);
+            ASSERT(paramQualifier == EvqParamIn || paramQualifier == EvqParamOut ||
+                   paramQualifier == EvqParamInOut);
 
             // Need to create a temp variable and pass that.
             tempVarTypeIds[paramIndex] = mBuilder.getTypeData(paramType, {}).id;
             tempVarIds[paramIndex] =
                 mBuilder.declareVariable(tempVarTypeIds[paramIndex], spv::StorageClassFunction,
-                                         mBuilder.getDecorations(paramType), nullptr, "param");
+                                         mBuilder.getDecorations(argType), nullptr, "param");
 
             // If it's an in or inout parameter, the temp variable needs to be initialized with the
             // value of the parameter first.
-            if (paramQualifier == EvqIn || paramQualifier == EvqInOut)
+            if (paramQualifier == EvqParamIn || paramQualifier == EvqParamInOut)
             {
-                paramValue = accessChainLoad(&param, paramType, nullptr);
+                paramValue = accessChainLoad(&param, argType, nullptr);
                 spirv::WriteStore(mBuilder.getSpirvCurrentFunctionBlock(), tempVarIds[paramIndex],
                                   paramValue, nullptr);
             }
@@ -1833,10 +2049,11 @@
         }
 
         const TType &paramType           = function->getParam(paramIndex)->getType();
+        const TType &argType             = node->getChildNode(paramIndex)->getAsTyped()->getType();
         const TQualifier &paramQualifier = paramType.getQualifier();
         NodeData &param = mNodeData[mNodeData.size() - parameterCount + paramIndex];
 
-        if (paramQualifier == EvqIn)
+        if (paramQualifier == EvqParamIn)
         {
             continue;
         }
@@ -1845,13 +2062,80 @@
         NodeData tempVarData;
         nodeDataInitLValue(&tempVarData, tempVarIds[paramIndex], tempVarTypeIds[paramIndex],
                            spv::StorageClassFunction, {});
-        const spirv::IdRef tempVarValue = accessChainLoad(&tempVarData, paramType, nullptr);
+        const spirv::IdRef tempVarValue = accessChainLoad(&tempVarData, argType, nullptr);
         accessChainStore(&param, tempVarValue, function->getParam(paramIndex)->getType());
     }
 
     return result;
 }
 
+void OutputSPIRVTraverser::visitArrayLength(TIntermUnary *node)
+{
+    // .length() on sized arrays is already constant folded, so this operation only applies to
+    // ssbo[N].last_member.length().  OpArrayLength takes the ssbo block *pointer* and the field
+    // index of last_member, so those need to be extracted from the access chain.  Additionally,
+    // OpArrayLength produces an unsigned int while GLSL produces an int, so a final cast is
+    // necessary.
+
+    // Inspect the children.  There are two possibilities:
+    //
+    // - last_member.length(): In this case, the id of the nameless ssbo is used.
+    // - ssbo.last_member.length(): In this case, the id of the variable |ssbo| itself is used.
+    // - ssbo[N][M].last_member.length(): In this case, the access chain |ssbo N M| is used.
+    //
+    // We can't visit the child in its entirety as it will create the access chain |ssbo N M field|
+    // which is not useful.
+
+    spirv::IdRef accessChainId;
+    spirv::LiteralInteger fieldIndex;
+
+    if (node->getOperand()->getAsSymbolNode())
+    {
+        // If the operand is a symbol referencing the last member of a nameless interface block,
+        // visit the symbol to get the id of the interface block.
+        node->getOperand()->getAsSymbolNode()->traverse(this);
+
+        // The access chain must only include the base id + one literal field index.
+        ASSERT(mNodeData.back().idList.size() == 1 && !mNodeData.back().idList.back().id.valid());
+
+        accessChainId = mNodeData.back().baseId;
+        fieldIndex    = mNodeData.back().idList.back().literal;
+    }
+    else
+    {
+        // Otherwise make sure not to traverse the field index selection node so that the access
+        // chain would not include it.
+        TIntermBinary *fieldSelectionNode = node->getOperand()->getAsBinaryNode();
+        ASSERT(fieldSelectionNode && fieldSelectionNode->getOp() == EOpIndexDirectInterfaceBlock);
+
+        TIntermTyped *interfaceBlockExpression = fieldSelectionNode->getLeft();
+        TIntermConstantUnion *indexNode = fieldSelectionNode->getRight()->getAsConstantUnion();
+        ASSERT(indexNode);
+
+        // Visit the expression.
+        interfaceBlockExpression->traverse(this);
+
+        accessChainId = accessChainCollapse(&mNodeData.back());
+        fieldIndex    = spirv::LiteralInteger(indexNode->getIConst(0));
+    }
+
+    // Get the int and uint type ids.
+    const spirv::IdRef intTypeId  = mBuilder.getBasicTypeId(EbtInt, 1);
+    const spirv::IdRef uintTypeId = mBuilder.getBasicTypeId(EbtUInt, 1);
+
+    // Generate the instruction.
+    const spirv::IdRef resultId = mBuilder.getNewId({});
+    spirv::WriteArrayLength(mBuilder.getSpirvCurrentFunctionBlock(), uintTypeId, resultId,
+                            accessChainId, fieldIndex);
+
+    // Cast to int.
+    const spirv::IdRef castResultId = mBuilder.getNewId({});
+    spirv::WriteBitcast(mBuilder.getSpirvCurrentFunctionBlock(), intTypeId, castResultId, resultId);
+
+    // Replace the access chain with an rvalue that's the result.
+    nodeDataInitRValue(&mNodeData.back(), castResultId, intTypeId);
+}
+
 bool IsShortCircuitNeeded(TIntermOperator *node)
 {
     TOperator op = node->getOp();
@@ -1906,11 +2190,6 @@
 {
     // Handle special groups.
     const TOperator op = node->getOp();
-    if (op == EOpPostIncrement || op == EOpPreIncrement || op == EOpPostDecrement ||
-        op == EOpPreDecrement)
-    {
-        return createIncrementDecrement(node, resultTypeId);
-    }
     if (op == EOpEqual || op == EOpNotEqual)
     {
         return createCompare(node, resultTypeId);
@@ -1923,28 +2202,36 @@
     {
         return createImageTextureBuiltIn(node, resultTypeId);
     }
+    if (op == EOpSubpassLoad)
+    {
+        return createSubpassLoadBuiltIn(node, resultTypeId);
+    }
     if (BuiltInGroup::IsInterpolationFS(op))
     {
         return createInterpolate(node, resultTypeId);
     }
 
-    const size_t childCount  = node->getChildCount();
-    TIntermTyped *firstChild = node->getChildNode(0)->getAsTyped();
+    const size_t childCount   = node->getChildCount();
+    TIntermTyped *firstChild  = node->getChildNode(0)->getAsTyped();
+    TIntermTyped *secondChild = childCount > 1 ? node->getChildNode(1)->getAsTyped() : nullptr;
 
     const TType &firstOperandType = firstChild->getType();
     const TBasicType basicType    = firstOperandType.getBasicType();
     const bool isFloat            = basicType == EbtFloat || basicType == EbtDouble;
     const bool isUnsigned         = basicType == EbtUInt;
     const bool isBool             = basicType == EbtBool;
+    // Whether this is a pre/post increment/decrement operator.
+    bool isIncrementOrDecrement = false;
     // Whether the operation needs to be applied column by column.
-    TIntermBinary *asBinary = node->getAsBinaryNode();
-    bool operateOnColumns   = asBinary && (asBinary->getLeft()->getType().isMatrix() ||
-                                         asBinary->getRight()->getType().isMatrix());
+    bool operateOnColumns =
+        childCount == 2 && (firstChild->getType().isMatrix() || secondChild->getType().isMatrix());
     // Whether the operands need to be swapped in the (binary) instruction
     bool binarySwapOperands = false;
+    // Whether the instruction is matrix/scalar.  This is implemented with matrix*(1/scalar).
+    bool binaryInvertSecondParameter = false;
     // Whether the scalar operand needs to be extended to match the other operand which is a vector
-    // (in a binary operation).
-    bool binaryExtendScalarToVector = true;
+    // (in a binary or extended operation).
+    bool extendScalarToVector = true;
     // Some built-ins have out parameters at the end of the list of parameters.
     size_t lvalueCount = 0;
 
@@ -1959,6 +2246,7 @@
     switch (op)
     {
         case EOpNegative:
+            operateOnColumns = firstOperandType.isMatrix();
             if (isFloat)
                 writeUnaryOp = spirv::WriteFNegate;
             else
@@ -1976,6 +2264,25 @@
             writeUnaryOp = spirv::WriteNot;
             break;
 
+        case EOpPostIncrement:
+        case EOpPreIncrement:
+            isIncrementOrDecrement = true;
+            operateOnColumns       = firstOperandType.isMatrix();
+            if (isFloat)
+                writeBinaryOp = spirv::WriteFAdd;
+            else
+                writeBinaryOp = spirv::WriteIAdd;
+            break;
+        case EOpPostDecrement:
+        case EOpPreDecrement:
+            isIncrementOrDecrement = true;
+            operateOnColumns       = firstOperandType.isMatrix();
+            if (isFloat)
+                writeBinaryOp = spirv::WriteFSub;
+            else
+                writeBinaryOp = spirv::WriteISub;
+            break;
+
         case EOpAdd:
         case EOpAddAssign:
             if (isFloat)
@@ -2001,7 +2308,19 @@
         case EOpDiv:
         case EOpDivAssign:
             if (isFloat)
-                writeBinaryOp = spirv::WriteFDiv;
+            {
+                if (firstOperandType.isMatrix() && secondChild->getType().isScalar())
+                {
+                    writeBinaryOp               = spirv::WriteMatrixTimesScalar;
+                    binaryInvertSecondParameter = true;
+                    operateOnColumns            = false;
+                    extendScalarToVector        = false;
+                }
+                else
+                {
+                    writeBinaryOp = spirv::WriteFDiv;
+                }
+            }
             else if (isUnsigned)
                 writeBinaryOp = spirv::WriteUDiv;
             else
@@ -2074,9 +2393,9 @@
         case EOpVectorTimesScalarAssign:
             if (isFloat)
             {
-                writeBinaryOp      = spirv::WriteVectorTimesScalar;
-                binarySwapOperands = node->getChildNode(1)->getAsTyped()->getType().isVector();
-                binaryExtendScalarToVector = false;
+                writeBinaryOp        = spirv::WriteVectorTimesScalar;
+                binarySwapOperands   = node->getChildNode(1)->getAsTyped()->getType().isVector();
+                extendScalarToVector = false;
             }
             else
                 writeBinaryOp = spirv::WriteIMul;
@@ -2092,9 +2411,10 @@
             break;
         case EOpMatrixTimesScalar:
         case EOpMatrixTimesScalarAssign:
-            writeBinaryOp      = spirv::WriteMatrixTimesScalar;
-            binarySwapOperands = asBinary->getRight()->getType().isMatrix();
-            operateOnColumns   = false;
+            writeBinaryOp        = spirv::WriteMatrixTimesScalar;
+            binarySwapOperands   = secondChild->getType().isMatrix();
+            operateOnColumns     = false;
+            extendScalarToVector = false;
             break;
         case EOpMatrixTimesMatrix:
         case EOpMatrixTimesMatrixAssign:
@@ -2104,17 +2424,17 @@
 
         case EOpLogicalOr:
             ASSERT(!IsShortCircuitNeeded(node));
-            binaryExtendScalarToVector = false;
-            writeBinaryOp              = spirv::WriteLogicalOr;
+            extendScalarToVector = false;
+            writeBinaryOp        = spirv::WriteLogicalOr;
             break;
         case EOpLogicalXor:
-            binaryExtendScalarToVector = false;
-            writeBinaryOp              = spirv::WriteLogicalNotEqual;
+            extendScalarToVector = false;
+            writeBinaryOp        = spirv::WriteLogicalNotEqual;
             break;
         case EOpLogicalAnd:
             ASSERT(!IsShortCircuitNeeded(node));
-            binaryExtendScalarToVector = false;
-            writeBinaryOp              = spirv::WriteLogicalAnd;
+            extendScalarToVector = false;
+            writeBinaryOp        = spirv::WriteLogicalAnd;
             break;
 
         case EOpBitShiftLeft:
@@ -2322,13 +2642,16 @@
             extendedInst = spv::GLSLstd450PackHalf2x16;
             break;
         case EOpUnpackSnorm2x16:
-            extendedInst = spv::GLSLstd450UnpackSnorm2x16;
+            extendedInst         = spv::GLSLstd450UnpackSnorm2x16;
+            extendScalarToVector = false;
             break;
         case EOpUnpackUnorm2x16:
-            extendedInst = spv::GLSLstd450UnpackUnorm2x16;
+            extendedInst         = spv::GLSLstd450UnpackUnorm2x16;
+            extendScalarToVector = false;
             break;
         case EOpUnpackHalf2x16:
-            extendedInst = spv::GLSLstd450UnpackHalf2x16;
+            extendedInst         = spv::GLSLstd450UnpackHalf2x16;
+            extendScalarToVector = false;
             break;
         case EOpPackUnorm4x8:
             extendedInst = spv::GLSLstd450PackUnorm4x8;
@@ -2337,15 +2660,22 @@
             extendedInst = spv::GLSLstd450PackSnorm4x8;
             break;
         case EOpUnpackUnorm4x8:
-            extendedInst = spv::GLSLstd450UnpackUnorm4x8;
+            extendedInst         = spv::GLSLstd450UnpackUnorm4x8;
+            extendScalarToVector = false;
             break;
         case EOpUnpackSnorm4x8:
-            extendedInst = spv::GLSLstd450UnpackSnorm4x8;
+            extendedInst         = spv::GLSLstd450UnpackSnorm4x8;
+            extendScalarToVector = false;
             break;
         case EOpPackDouble2x32:
+            // TODO: support desktop GLSL.  http://anglebug.com/6197
+            UNIMPLEMENTED();
+            break;
+
         case EOpUnpackDouble2x32:
             // TODO: support desktop GLSL.  http://anglebug.com/6197
             UNIMPLEMENTED();
+            extendScalarToVector = false;
             break;
 
         case EOpLength:
@@ -2381,7 +2711,8 @@
             extendedInst = spv::GLSLstd450Reflect;
             break;
         case EOpRefract:
-            extendedInst = spv::GLSLstd450Refract;
+            extendedInst         = spv::GLSLstd450Refract;
+            extendScalarToVector = false;
             break;
 
         case EOpFtransform:
@@ -2494,11 +2825,6 @@
             UNIMPLEMENTED();
             break;
 
-        case EOpSubpassLoad:
-            // TODO: support framebuffer fetch.  http://anglebug.com/4889
-            UNIMPLEMENTED();
-            break;
-
         case EOpAnyInvocation:
         case EOpAllInvocations:
         case EOpAllInvocationsEqual:
@@ -2510,9 +2836,22 @@
     }
 
     // Load the parameters.
-    spirv::IdRefList parameters = loadAllParams(node, lvalueCount);
+    spirv::IdRefList parameterTypeIds;
+    spirv::IdRefList parameters = loadAllParams(node, lvalueCount, &parameterTypeIds);
 
-    const SpirvDecorations decorations = mBuilder.getDecorations(node->getType());
+    if (isIncrementOrDecrement)
+    {
+        // ++ and -- are implemented with binary add and subtract, so add an implicit parameter with
+        // size vecN(1).
+        const int vecSize = firstOperandType.isMatrix() ? firstOperandType.getRows()
+                                                        : firstOperandType.getNominalSize();
+        const spirv::IdRef one =
+            isFloat ? mBuilder.getVecConstant(1, vecSize) : mBuilder.getIvecConstant(1, vecSize);
+        parameters.push_back(one);
+    }
+
+    const SpirvDecorations decorations =
+        mBuilder.getArithmeticDecorations(node->getType(), node->isPrecise());
     spirv::IdRef result;
     if (node->getType().getBasicType() != EbtVoid)
     {
@@ -2536,6 +2875,8 @@
     if (operateOnColumns)
     {
         // If negating a matrix, multiplying or comparing them, do that column by column.
+        // Matrix-scalar operations (add, sub, mod etc) turn the scalar into a vector before
+        // operating on the column.
         spirv::IdRefList columnIds;
 
         const SpirvDecorations operandDecorations = mBuilder.getDecorations(firstOperandType);
@@ -2548,13 +2889,22 @@
             std::swap(parameters[0], parameters[1]);
         }
 
+        if (extendScalarToVector)
+        {
+            extendScalarParamsToVector(node, columnTypeId, &parameters);
+        }
+
         // Extract and apply the operator to each column.
         for (int columnIndex = 0; columnIndex < firstOperandType.getCols(); ++columnIndex)
         {
-            const spirv::IdRef columnIdA = mBuilder.getNewId(operandDecorations);
-            spirv::WriteCompositeExtract(mBuilder.getSpirvCurrentFunctionBlock(), columnTypeId,
-                                         columnIdA, parameters[0],
-                                         {spirv::LiteralInteger(columnIndex)});
+            spirv::IdRef columnIdA = parameters[0];
+            if (firstOperandType.isMatrix())
+            {
+                columnIdA = mBuilder.getNewId(operandDecorations);
+                spirv::WriteCompositeExtract(mBuilder.getSpirvCurrentFunctionBlock(), columnTypeId,
+                                             columnIdA, parameters[0],
+                                             {spirv::LiteralInteger(columnIndex)});
+            }
 
             columnIds.push_back(mBuilder.getNewId(decorations));
 
@@ -2567,10 +2917,14 @@
             {
                 ASSERT(writeBinaryOp);
 
-                const spirv::IdRef columnIdB = mBuilder.getNewId(operandDecorations);
-                spirv::WriteCompositeExtract(mBuilder.getSpirvCurrentFunctionBlock(), columnTypeId,
-                                             columnIdB, parameters[1],
-                                             {spirv::LiteralInteger(columnIndex)});
+                spirv::IdRef columnIdB = parameters[1];
+                if (secondChild != nullptr && secondChild->getType().isMatrix())
+                {
+                    columnIdB = mBuilder.getNewId(operandDecorations);
+                    spirv::WriteCompositeExtract(mBuilder.getSpirvCurrentFunctionBlock(),
+                                                 columnTypeId, columnIdB, parameters[1],
+                                                 {spirv::LiteralInteger(columnIndex)});
+                }
 
                 writeBinaryOp(mBuilder.getSpirvCurrentFunctionBlock(), columnTypeId,
                               columnIds.back(), columnIdA, columnIdB);
@@ -2591,23 +2945,9 @@
     {
         ASSERT(parameters.size() == 2);
 
-        // For vector<op>scalar operations that require it, turn the scalar into a vector of the
-        // same size.
-        if (binaryExtendScalarToVector)
+        if (extendScalarToVector)
         {
-            const TType &leftType  = node->getChildNode(0)->getAsTyped()->getType();
-            const TType &rightType = node->getChildNode(1)->getAsTyped()->getType();
-
-            if (leftType.isScalar() && rightType.isVector())
-            {
-                parameters[0] = createConstructorVectorFromScalar(rightType, builtInResultTypeId,
-                                                                  {{parameters[0]}});
-            }
-            else if (rightType.isScalar() && leftType.isVector())
-            {
-                parameters[1] = createConstructorVectorFromScalar(leftType, builtInResultTypeId,
-                                                                  {{parameters[1]}});
-            }
+            extendScalarParamsToVector(node, builtInResultTypeId, &parameters);
         }
 
         if (binarySwapOperands)
@@ -2615,6 +2955,16 @@
             std::swap(parameters[0], parameters[1]);
         }
 
+        if (binaryInvertSecondParameter)
+        {
+            const spirv::IdRef one           = mBuilder.getFloatConstant(1);
+            const spirv::IdRef invertedParam = mBuilder.getNewId(
+                mBuilder.getArithmeticDecorations(secondChild->getType(), node->isPrecise()));
+            spirv::WriteFDiv(mBuilder.getSpirvCurrentFunctionBlock(), parameterTypeIds.back(),
+                             invertedParam, one, parameters[1]);
+            parameters[1] = invertedParam;
+        }
+
         // Write the operation that combines the left and right values.
         writeBinaryOp(mBuilder.getSpirvCurrentFunctionBlock(), builtInResultTypeId, builtInResult,
                       parameters[0], parameters[1]);
@@ -2645,6 +2995,11 @@
         // It's an extended instruction.
         ASSERT(extendedInst != spv::GLSLstd450Bad);
 
+        if (extendScalarToVector)
+        {
+            extendScalarParamsToVector(node, builtInResultTypeId, &parameters);
+        }
+
         spirv::WriteExtInst(mBuilder.getSpirvCurrentFunctionBlock(), builtInResultTypeId,
                             builtInResult, mBuilder.getExtInstImportIdStd(),
                             spirv::LiteralExtInstInteger(extendedInst), parameters);
@@ -2653,9 +3008,8 @@
     // If it's an assignment, store the calculated value.
     if (IsAssignment(node->getOp()))
     {
-        ASSERT(mNodeData.size() >= 2);
-        ASSERT(parameters.size() == 2);
-        accessChainStore(&mNodeData[mNodeData.size() - 2], builtInResult, firstOperandType);
+        accessChainStore(&mNodeData[mNodeData.size() - childCount], builtInResult,
+                         firstOperandType);
     }
 
     // If the operation returns a struct, load the lsb and msb and store them in result/out
@@ -2666,57 +3020,10 @@
                                                        resultTypeId);
     }
 
-    return result;
-}
-
-spirv::IdRef OutputSPIRVTraverser::createIncrementDecrement(TIntermOperator *node,
-                                                            spirv::IdRef resultTypeId)
-{
-    TIntermTyped *operand = node->getChildNode(0)->getAsTyped();
-
-    const TType &operandType   = operand->getType();
-    const TBasicType basicType = operandType.getBasicType();
-    const bool isFloat         = basicType == EbtFloat || basicType == EbtDouble;
-
-    // ++ and -- are implemented with binary SPIR-V ops.
-    WriteBinaryOp writeBinaryOp = nullptr;
-
-    switch (node->getOp())
+    // For post increment/decrement, return the value of the parameter itself as the result.
+    if (op == EOpPostIncrement || op == EOpPostDecrement)
     {
-        case EOpPostIncrement:
-        case EOpPreIncrement:
-            if (isFloat)
-                writeBinaryOp = spirv::WriteFAdd;
-            else
-                writeBinaryOp = spirv::WriteIAdd;
-            break;
-        case EOpPostDecrement:
-        case EOpPreDecrement:
-            if (isFloat)
-                writeBinaryOp = spirv::WriteFSub;
-            else
-                writeBinaryOp = spirv::WriteISub;
-            break;
-        default:
-            UNREACHABLE();
-    }
-
-    // Load the operand.
-    spirv::IdRef value = accessChainLoad(&mNodeData.back(), operandType, nullptr);
-
-    spirv::IdRef result    = mBuilder.getNewId(mBuilder.getDecorations(operandType));
-    const spirv::IdRef one = isFloat ? mBuilder.getFloatConstant(1) : mBuilder.getIntConstant(1);
-
-    writeBinaryOp(mBuilder.getSpirvCurrentFunctionBlock(), resultTypeId, result, value, one);
-
-    // The result is always written back.
-    accessChainStore(&mNodeData.back(), result, operandType);
-
-    // Initialize the access chain with either the result or the value based on whether pre or
-    // post increment/decrement was used.  The result is always an rvalue.
-    if (node->getOp() == EOpPostIncrement || node->getOp() == EOpPostDecrement)
-    {
-        result = value;
+        result = parameters[0];
     }
 
     return result;
@@ -2732,7 +3039,7 @@
     const SpirvDecorations operandDecorations = mBuilder.getDecorations(operandType);
 
     // Load the left and right values.
-    spirv::IdRefList parameters = loadAllParams(node, 0);
+    spirv::IdRefList parameters = loadAllParams(node, 0, nullptr);
     ASSERT(parameters.size() == 2);
 
     // In GLSL, operators == and != can operate on the following:
@@ -2947,7 +3254,7 @@
     const TBasicType samplerBasicType = samplerType.getBasicType();
 
     // Load the parameters.
-    spirv::IdRefList parameters = loadAllParams(node, 0);
+    spirv::IdRefList parameters = loadAllParams(node, 0, nullptr);
 
     // GLSL texture* and image* built-ins map to the following SPIR-V instructions.  Some of these
     // instructions take a "sampled image" while the others take the image itself.  In these
@@ -3329,6 +3636,8 @@
             }
             // No coordinates parameter.
             coordinatesIndex = 0;
+            // No dref parameter.
+            isDref = false;
             break;
 
         case EOpTextureSamples:
@@ -3337,6 +3646,8 @@
             spirvOp                      = spv::OpImageQuerySamples;
             // No coordinates parameter.
             coordinatesIndex = 0;
+            // No dref parameter.
+            isDref = false;
             break;
 
         case EOpTextureQueryLevels:
@@ -3344,10 +3655,14 @@
             spirvOp                      = spv::OpImageQueryLevels;
             // No coordinates parameter.
             coordinatesIndex = 0;
+            // No dref parameter.
+            isDref = false;
             break;
 
         case EOpTextureQueryLod:
             spirvOp = spv::OpImageQueryLod;
+            // No dref parameter.
+            isDref = false;
             break;
 
         default:
@@ -3356,9 +3671,12 @@
 
     // If an implicit-lod instruction is used outside a fragment shader, change that to an explicit
     // one as they are not allowed in SPIR-V outside fragment shaders.
-    bool makeLodExplicit =
-        mCompiler->getShaderType() != GL_FRAGMENT_SHADER && lodIndex == 0 &&
-        (spirvOp == spv::OpImageSampleImplicitLod || spirvOp == spv::OpImageFetch);
+    const bool noLodSupport = IsSamplerBuffer(samplerBasicType) ||
+                              IsImageBuffer(samplerBasicType) || IsSamplerMS(samplerBasicType) ||
+                              IsImageMS(samplerBasicType);
+    const bool makeLodExplicit =
+        mCompiler->getShaderType() != GL_FRAGMENT_SHADER && lodIndex == 0 && dPdxIndex == 0 &&
+        !noLodSupport && (spirvOp == spv::OpImageSampleImplicitLod || spirvOp == spv::OpImageFetch);
 
     // Apply any necessary fix up.
 
@@ -3386,7 +3704,7 @@
     if (coordinatesIndex > 0)
     {
         coordinatesId           = parameters[coordinatesIndex];
-        coordinatesType         = &function->getParam(coordinatesIndex)->getType();
+        coordinatesType         = &node->getChildNode(coordinatesIndex)->getAsTyped()->getType();
         coordinatesChannelCount = coordinatesType->getNominalSize();
     }
 
@@ -3559,7 +3877,7 @@
             const spirv::IdRef newCoordinatesId =
                 mBuilder.getNewId(mBuilder.getDecorations(*coordinatesType));
             spirv::WriteCompositeInsert(mBuilder.getSpirvCurrentFunctionBlock(), coordinatesTypeId,
-                                        newCoordinatesId, coordinatesId, projChannelId,
+                                        newCoordinatesId, projChannelId, coordinatesId,
                                         {spirv::LiteralInteger(requiredChannelCount - 1)});
             coordinatesId = newCoordinatesId;
         }
@@ -3568,6 +3886,7 @@
     // Select the correct sample Op based on whether the Proj, Dref or Explicit variants are used.
     if (spirvOp == spv::OpImageSampleImplicitLod)
     {
+        ASSERT(!noLodSupport);
         const bool isExplicitLod = lodIndex != 0 || makeLodExplicit || dPdxIndex != 0;
         if (isDref)
         {
@@ -3710,6 +4029,35 @@
     return result;
 }
 
+spirv::IdRef OutputSPIRVTraverser::createSubpassLoadBuiltIn(TIntermOperator *node,
+                                                            spirv::IdRef resultTypeId)
+{
+    // Load the parameters.
+    spirv::IdRefList parameters = loadAllParams(node, 0, nullptr);
+    const spirv::IdRef image    = parameters[0];
+
+    // If multisampled, an additional parameter specifies the sample.  This is passed through as an
+    // extra image operand.
+    const bool hasSampleParam = parameters.size() == 2;
+    const spv::ImageOperandsMask operandsMask =
+        hasSampleParam ? spv::ImageOperandsSampleMask : spv::ImageOperandsMaskNone;
+    spirv::IdRefList imageOperandsList;
+    if (hasSampleParam)
+    {
+        imageOperandsList.push_back(parameters[1]);
+    }
+
+    // |subpassLoad| is implemented with OpImageRead.  This OP takes a coordinate, which is unused
+    // and is set to (0, 0) here.
+    const spirv::IdRef coordId = mBuilder.getNullConstant(mBuilder.getBasicTypeId(EbtUInt, 2));
+
+    const spirv::IdRef result = mBuilder.getNewId(mBuilder.getDecorations(node->getType()));
+    spirv::WriteImageRead(mBuilder.getSpirvCurrentFunctionBlock(), resultTypeId, result, image,
+                          coordId, hasSampleParam ? &operandsMask : nullptr, imageOperandsList);
+
+    return result;
+}
+
 spirv::IdRef OutputSPIRVTraverser::createInterpolate(TIntermOperator *node,
                                                      spirv::IdRef resultTypeId)
 {
@@ -3756,20 +4104,24 @@
 
 spirv::IdRef OutputSPIRVTraverser::castBasicType(spirv::IdRef value,
                                                  const TType &valueType,
-                                                 TBasicType expectedBasicType,
+                                                 const TType &expectedType,
                                                  spirv::IdRef *resultTypeIdOut)
 {
+    const TBasicType expectedBasicType = expectedType.getBasicType();
     if (valueType.getBasicType() == expectedBasicType)
     {
         return value;
     }
 
+    // Make sure no attempt is made to cast a matrix to int/uint.
+    ASSERT(!valueType.isMatrix() || expectedBasicType == EbtFloat);
+
     SpirvType valueSpirvType                            = mBuilder.getSpirvType(valueType, {});
     valueSpirvType.type                                 = expectedBasicType;
     valueSpirvType.typeSpec.isOrHasBoolInInterfaceBlock = false;
     const spirv::IdRef castTypeId = mBuilder.getSpirvTypeData(valueSpirvType, nullptr).id;
 
-    const spirv::IdRef castValue = mBuilder.getNewId(mBuilder.getDecorations(valueType));
+    const spirv::IdRef castValue = mBuilder.getNewId(mBuilder.getDecorations(expectedType));
 
     // Write the instruction that casts between types.  Different instructions are used based on the
     // types being converted.
@@ -3888,7 +4240,8 @@
         valueTypeSpec.isInvariantBlock == expectedTypeSpec.isInvariantBlock &&
         valueTypeSpec.isRowMajorQualifiedBlock == expectedTypeSpec.isRowMajorQualifiedBlock &&
         valueTypeSpec.isRowMajorQualifiedArray == expectedTypeSpec.isRowMajorQualifiedArray &&
-        valueTypeSpec.isOrHasBoolInInterfaceBlock == expectedTypeSpec.isOrHasBoolInInterfaceBlock)
+        valueTypeSpec.isOrHasBoolInInterfaceBlock == expectedTypeSpec.isOrHasBoolInInterfaceBlock &&
+        valueTypeSpec.isPatchIOBlock == expectedTypeSpec.isPatchIOBlock)
     {
         return value;
     }
@@ -3924,7 +4277,7 @@
         elementType.toArrayElementType();
 
         const spirv::IdRef elementTypeId =
-            mBuilder.getTypeData(elementType, valueElementTypeSpec).id;
+            mBuilder.getTypeDataOverrideTypeSpec(elementType, valueElementTypeSpec).id;
 
         const SpirvDecorations elementDecorations = mBuilder.getDecorations(elementType);
 
@@ -3957,7 +4310,8 @@
             expectedFieldTypeSpec.onBlockFieldSelection(fieldType);
 
             // Get the field type id.
-            const spirv::IdRef fieldTypeId = mBuilder.getTypeData(fieldType, valueFieldTypeSpec).id;
+            const spirv::IdRef fieldTypeId =
+                mBuilder.getTypeDataOverrideTypeSpec(fieldType, valueFieldTypeSpec).id;
 
             // Extract the field.
             const spirv::IdRef fieldId = mBuilder.getNewId(mBuilder.getDecorations(fieldType));
@@ -3975,23 +4329,26 @@
         ASSERT(valueTypeSpec.isOrHasBoolInInterfaceBlock ||
                expectedTypeSpec.isOrHasBoolInInterfaceBlock);
 
+        TType emulatedValueType(valueType);
+        emulatedValueType.setBasicType(EbtUInt);
+        emulatedValueType.setPrecise(EbpLow);
+
         // If value is loaded as uint, it needs to change to bool.  If it's bool, it needs to change
         // to uint before storage.
         if (valueTypeSpec.isOrHasBoolInInterfaceBlock)
         {
-            TType emulatedValueType(valueType);
-            emulatedValueType.setBasicType(EbtUInt);
-            return castBasicType(value, emulatedValueType, EbtBool, resultTypeIdOut);
+            return castBasicType(value, emulatedValueType, valueType, resultTypeIdOut);
         }
         else
         {
-            return castBasicType(value, valueType, EbtUInt, resultTypeIdOut);
+            return castBasicType(value, valueType, emulatedValueType, resultTypeIdOut);
         }
     }
 
     // Construct the value with the expected type from its cast constituents.
-    const spirv::IdRef expectedTypeId = mBuilder.getTypeData(valueType, expectedTypeSpec).id;
-    const spirv::IdRef expectedId     = mBuilder.getNewId(mBuilder.getDecorations(valueType));
+    const spirv::IdRef expectedTypeId =
+        mBuilder.getTypeDataOverrideTypeSpec(valueType, expectedTypeSpec).id;
+    const spirv::IdRef expectedId = mBuilder.getNewId(mBuilder.getDecorations(valueType));
 
     spirv::WriteCompositeConstruct(mBuilder.getSpirvCurrentFunctionBlock(), expectedTypeId,
                                    expectedId, constituents);
@@ -4004,6 +4361,37 @@
     return expectedId;
 }
 
+void OutputSPIRVTraverser::extendScalarParamsToVector(TIntermOperator *node,
+                                                      spirv::IdRef resultTypeId,
+                                                      spirv::IdRefList *parameters)
+{
+    const TType &type = node->getType();
+    if (type.isScalar())
+    {
+        // Nothing to do if the operation is applied to scalars.
+        return;
+    }
+
+    const size_t childCount = node->getChildCount();
+
+    for (size_t childIndex = 0; childIndex < childCount; ++childIndex)
+    {
+        const TType &childType = node->getChildNode(childIndex)->getAsTyped()->getType();
+
+        // If the child is a scalar, replicate it to form a vector of the right size.
+        if (childType.isScalar())
+        {
+            TType vectorType(type);
+            if (vectorType.isMatrix())
+            {
+                vectorType.toMatrixColumnType();
+            }
+            (*parameters)[childIndex] = createConstructorVectorFromScalar(
+                childType, vectorType, resultTypeId, {{(*parameters)[childIndex]}});
+        }
+    }
+}
+
 spirv::IdRef OutputSPIRVTraverser::reduceBoolVector(TOperator op,
                                                     const spirv::IdRefList &valueIds,
                                                     spirv::IdRef typeId,
@@ -4299,9 +4687,6 @@
 
 void OutputSPIRVTraverser::visitSymbol(TIntermSymbol *node)
 {
-    // Constants are expected to be folded.
-    ASSERT(!node->hasConstantValue());
-
     // No-op visits to symbols that are being declared.  They are handled in visitDeclaration.
     if (mIsSymbolBeingDeclared)
     {
@@ -4340,7 +4725,7 @@
 
     // If the symbol is a const variable, such as a const function parameter or specialization
     // constant, create an rvalue.
-    if (type.getQualifier() == EvqConst || type.getQualifier() == EvqSpecConst)
+    if (type.getQualifier() == EvqParamConst || type.getQualifier() == EvqSpecConst)
     {
         ASSERT(interfaceBlock == nullptr);
         ASSERT(mSymbolIdMap.count(symbol) > 0);
@@ -4360,6 +4745,19 @@
         uint32_t fieldIndex = static_cast<uint32_t>(type.getInterfaceBlockFieldIndex());
         accessChainPushLiteral(&mNodeData.back(), spirv::LiteralInteger(fieldIndex), typeId);
     }
+
+    // Add gl_PerVertex capabilities only if the field is actually used.
+    switch (type.getQualifier())
+    {
+        case EvqClipDistance:
+            mBuilder.addCapability(spv::CapabilityClipDistance);
+            break;
+        case EvqCullDistance:
+            mBuilder.addCapability(spv::CapabilityCullDistance);
+            break;
+        default:
+            break;
+    }
 }
 
 void OutputSPIRVTraverser::visitConstantUnion(TIntermConstantUnion *node)
@@ -4599,6 +4997,15 @@
     // Constants are expected to be folded.
     ASSERT(!node->hasConstantValue());
 
+    // Special case EOpArrayLength.
+    if (node->getOp() == EOpArrayLength)
+    {
+        visitArrayLength(node);
+
+        // Children already visited.
+        return false;
+    }
+
     if (visit == PreVisit)
     {
         // Don't add an entry to the stack.  The child will create one, which we won't pop.
@@ -4611,38 +5018,6 @@
     // There is at least on entry for the child.
     ASSERT(mNodeData.size() >= 1);
 
-    // Special case EOpArrayLength.  .length() on sized arrays is already constant folded, so this
-    // operation only applies to ssbo.last_member.length().  OpArrayLength takes the ssbo block
-    // *type* and the field index of last_member, so those need to be extracted from the access
-    // chain.  Additionally, OpArrayLength produces an unsigned int while GLSL produces an int, so a
-    // final cast is necessary.
-    if (node->getOp() == EOpArrayLength)
-    {
-        // The access chain must only include the base ssbo + one literal field index.
-        ASSERT(mNodeData.back().idList.size() == 1 && !mNodeData.back().idList.back().id.valid());
-        const spirv::IdRef baseId              = mNodeData.back().baseId;
-        const spirv::LiteralInteger fieldIndex = mNodeData.back().idList.back().literal;
-
-        // Get the int and uint type ids.
-        const spirv::IdRef intTypeId  = mBuilder.getBasicTypeId(EbtInt, 1);
-        const spirv::IdRef uintTypeId = mBuilder.getBasicTypeId(EbtUInt, 1);
-
-        // Generate the instruction.
-        const spirv::IdRef resultId = mBuilder.getNewId({});
-        spirv::WriteArrayLength(mBuilder.getSpirvCurrentFunctionBlock(), uintTypeId, resultId,
-                                baseId, fieldIndex);
-
-        // Cast to int.
-        const spirv::IdRef castResultId = mBuilder.getNewId({});
-        spirv::WriteBitcast(mBuilder.getSpirvCurrentFunctionBlock(), intTypeId, castResultId,
-                            resultId);
-
-        // Replace the access chain with an rvalue that's the result.
-        nodeDataInitRValue(&mNodeData.back(), castResultId, intTypeId);
-
-        return true;
-    }
-
     const spirv::IdRef resultTypeId = mBuilder.getTypeData(node->getType(), {}).id;
     const spirv::IdRef result       = visitOperator(node, resultTypeId);
 
@@ -4672,9 +5047,10 @@
 
     if (lastChildIndex == 0)
     {
+        const TType &conditionType = node->getCondition()->getType();
+
         spirv::IdRef typeId;
-        spirv::IdRef conditionValue =
-            accessChainLoad(&mNodeData.back(), node->getCondition()->getType(), &typeId);
+        spirv::IdRef conditionValue = accessChainLoad(&mNodeData.back(), conditionType, &typeId);
 
         // If OpSelect can be used, keep the condition for later usage.
         if (canUseOpSelect)
@@ -4683,10 +5059,12 @@
             // So when selecting between vectors, we must replicate the condition scalar.
             if (type.isVector())
             {
-                typeId = mBuilder.getBasicTypeId(node->getCondition()->getType().getBasicType(),
-                                                 type.getNominalSize());
-                conditionValue =
-                    createConstructorVectorFromScalar(type, typeId, {{conditionValue}});
+                const TType &boolVectorType = *StaticType::GetForVec<EbtBool, EbpUndefined>(
+                    EvqGlobal, static_cast<unsigned char>(type.getNominalSize()));
+                typeId =
+                    mBuilder.getBasicTypeId(conditionType.getBasicType(), type.getNominalSize());
+                conditionValue = createConstructorVectorFromScalar(conditionType, boolVectorType,
+                                                                   typeId, {{conditionValue}});
             }
             nodeDataInitRValue(&mNodeData.back(), conditionValue, typeId);
             return true;
@@ -4716,6 +5094,9 @@
     mNodeData.pop_back();
     mNodeData.back().idList.push_back(value);
 
+    // Additionally store the id of block that has produced the result.
+    mNodeData.back().idList.push_back(mBuilder.getSpirvCurrentFunctionBlockId());
+
     if (!canUseOpSelect)
     {
         // Move on to the next block.
@@ -4727,9 +5108,11 @@
     {
         const spirv::IdRef result = mBuilder.getNewId(mBuilder.getDecorations(node->getType()));
 
-        ASSERT(mNodeData.back().idList.size() == 2);
-        const spirv::IdRef trueValue  = mNodeData.back().idList[0].id;
-        const spirv::IdRef falseValue = mNodeData.back().idList[1].id;
+        ASSERT(mNodeData.back().idList.size() == 4);
+        const spirv::IdRef trueValue    = mNodeData.back().idList[0].id;
+        const spirv::IdRef trueBlockId  = mNodeData.back().idList[1].id;
+        const spirv::IdRef falseValue   = mNodeData.back().idList[2].id;
+        const spirv::IdRef falseBlockId = mNodeData.back().idList[3].id;
 
         if (canUseOpSelect)
         {
@@ -4740,11 +5123,6 @@
         }
         else
         {
-            const SpirvConditional *conditional = mBuilder.getCurrentConditional();
-
-            const spirv::IdRef trueBlockId  = conditional->blockIds[0];
-            const spirv::IdRef falseBlockId = conditional->blockIds[1];
-
             spirv::WritePhi(mBuilder.getSpirvCurrentFunctionBlock(), typeId, result,
                             {spirv::PairIdRefIdRef{trueValue, trueBlockId},
                              spirv::PairIdRefIdRef{falseValue, falseBlockId}});
@@ -4761,57 +5139,88 @@
 
 bool OutputSPIRVTraverser::visitIfElse(Visit visit, TIntermIfElse *node)
 {
-    if (visit == PreVisit)
+    // An if condition may or may not have an else block.  When both blocks are present, the
+    // translation is as follows:
+    //
+    // if (cond) { trueBody } else { falseBody }
+    //
+    //               // pre-if block
+    //       %cond = ...
+    //               OpSelectionMerge %merge None
+    //               OpBranchConditional %cond %true %false
+    //
+    //       %true = OpLabel
+    //               trueBody
+    //               OpBranch %merge
+    //
+    //      %false = OpLabel
+    //               falseBody
+    //               OpBranch %merge
+    //
+    //               // post-if block
+    //       %merge = OpLabel
+    //
+    // If the else block is missing, OpBranchConditional will simply jump to %merge on the false
+    // condition and the %false block is removed.  Due to the way ParseContext prunes compile-time
+    // constant conditionals, the if block itself may also be missing, which is treated similarly.
+
+    // It's simpler if this function performs the traversal.
+    ASSERT(visit == PreVisit);
+
+    // Visit the condition.
+    node->getCondition()->traverse(this);
+    const spirv::IdRef conditionValue =
+        accessChainLoad(&mNodeData.back(), node->getCondition()->getType(), nullptr);
+
+    // If both true and false blocks are missing, there's nothing to do.
+    if (node->getTrueBlock() == nullptr && node->getFalseBlock() == nullptr)
     {
-        // Don't add an entry to the stack.  The condition will create one, which we won't pop.
-        return true;
+        return false;
     }
 
-    const size_t lastChildIndex = getLastTraversedChildIndex(visit);
+    // Create a conditional with maximum 3 blocks, one for the true block (if any), one for the
+    // else block (if any), and one for the merge block.  getChildCount() works here as it
+    // produces an identical count.
+    mBuilder.startConditional(node->getChildCount(), false, false);
 
-    // If the condition was just visited, evaluate it and create the branch instructions.
-    if (lastChildIndex == 0)
+    // Generate the branch instructions.
+    const SpirvConditional *conditional = mBuilder.getCurrentConditional();
+
+    const spirv::IdRef mergeBlock = conditional->blockIds.back();
+    spirv::IdRef trueBlock        = mergeBlock;
+    spirv::IdRef falseBlock       = mergeBlock;
+
+    size_t nextBlockIndex = 0;
+    if (node->getTrueBlock())
     {
-        const spirv::IdRef conditionValue =
-            accessChainLoad(&mNodeData.back(), node->getCondition()->getType(), nullptr);
-
-        // Create a conditional with maximum 3 blocks, one for the true block (if any), one for the
-        // else block (if any), and one for the merge block.  getChildCount() works here as it
-        // produces an identical count.
-        mBuilder.startConditional(node->getChildCount(), false, false);
-
-        // Generate the branch instructions.
-        const SpirvConditional *conditional = mBuilder.getCurrentConditional();
-
-        const spirv::IdRef mergeBlock = conditional->blockIds.back();
-        spirv::IdRef trueBlock        = mergeBlock;
-        spirv::IdRef falseBlock       = mergeBlock;
-
-        size_t nextBlockIndex = 0;
-        if (node->getTrueBlock())
-        {
-            trueBlock = conditional->blockIds[nextBlockIndex++];
-        }
-        if (node->getFalseBlock())
-        {
-            falseBlock = conditional->blockIds[nextBlockIndex++];
-        }
-
-        mBuilder.writeBranchConditional(conditionValue, trueBlock, falseBlock, mergeBlock);
-        return true;
+        trueBlock = conditional->blockIds[nextBlockIndex++];
+    }
+    if (node->getFalseBlock())
+    {
+        falseBlock = conditional->blockIds[nextBlockIndex++];
     }
 
-    // Otherwise move on to the next block, inserting a branch to the merge block at the end of each
-    // block.
-    mBuilder.writeBranchConditionalBlockEnd();
+    mBuilder.writeBranchConditional(conditionValue, trueBlock, falseBlock, mergeBlock);
+
+    // Visit the true block, if any.
+    if (node->getTrueBlock())
+    {
+        node->getTrueBlock()->traverse(this);
+        mBuilder.writeBranchConditionalBlockEnd();
+    }
+
+    // Visit the false block, if any.
+    if (node->getFalseBlock())
+    {
+        node->getFalseBlock()->traverse(this);
+        mBuilder.writeBranchConditionalBlockEnd();
+    }
 
     // Pop from the conditional stack when done.
-    if (visit == PostVisit)
-    {
-        mBuilder.endConditional();
-    }
+    mBuilder.endConditional();
 
-    return true;
+    // Don't traverse the children, that's done already.
+    return false;
 }
 
 bool OutputSPIRVTraverser::visitSwitch(Visit visit, TIntermSwitch *node)
@@ -4965,7 +5374,7 @@
         }
 
         const spirv::IdRef mergeBlock   = conditional->blockIds.back();
-        const spirv::IdRef defaultBlock = defaultBlockIndex < caseValues.size()
+        const spirv::IdRef defaultBlock = defaultBlockIndex <= caseValues.size()
                                               ? conditional->blockIds[defaultBlockIndex]
                                               : mergeBlock;
 
@@ -5145,8 +5554,7 @@
 {
     if (node->isPrecise())
     {
-        // TODO: handle precise.  http://anglebug.com/4889.
-        UNIMPLEMENTED();
+        // Nothing to do for |precise|.
         return false;
     }
 
@@ -5190,7 +5598,7 @@
 
         // const function parameters are intermediate values, while the rest are "variables"
         // with the Function storage class.
-        if (paramType.getQualifier() != EvqConst)
+        if (paramType.getQualifier() != EvqParamConst)
         {
             const spv::StorageClass storageClass = IsOpaqueType(paramType.getBasicType())
                                                        ? spv::StorageClassUniformConstant
@@ -5310,10 +5718,15 @@
             break;
 
         case EOpEmitVertex:
+            spirv::WriteEmitVertex(mBuilder.getSpirvCurrentFunctionBlock());
+            break;
         case EOpEndPrimitive:
+            spirv::WriteEndPrimitive(mBuilder.getSpirvCurrentFunctionBlock());
+            break;
+
         case EOpEmitStreamVertex:
         case EOpEndStreamPrimitive:
-            // TODO: support geometry shaders.  http://anglebug.com/4889
+            // TODO: support desktop GLSL.  http://anglebug.com/6197
             UNIMPLEMENTED();
             break;
 
@@ -5340,12 +5753,19 @@
 
     // Declare specialization constants especially; they don't require processing the left and right
     // nodes, and they are like constant declarations with special instructions and decorations.
-    if (sequence.front()->getAsTyped()->getType().getQualifier() == EvqSpecConst)
+    const TQualifier qualifier = sequence.front()->getAsTyped()->getType().getQualifier();
+    if (qualifier == EvqSpecConst)
     {
         declareSpecConst(node);
         return false;
     }
 
+    // Skip redeclaration of builtins.  They will correctly declare as built-in on first use.
+    if (mInGlobalScope && (qualifier == EvqClipDistance || qualifier == EvqCullDistance))
+    {
+        return false;
+    }
+
     if (!mInGlobalScope && visit == PreVisit)
     {
         mNodeData.emplace_back();
@@ -5429,7 +5849,7 @@
 
     const spirv::IdRef typeId = mBuilder.getTypeData(type, {}).id;
 
-    spv::StorageClass storageClass = GetStorageClass(type);
+    spv::StorageClass storageClass = GetStorageClass(type, mCompiler->getShaderType());
 
     SpirvDecorations decorations = mBuilder.getDecorations(type);
     if (mBuilder.isInvariantOutput(type))
@@ -5478,6 +5898,13 @@
             spirv::WriteDecorate(mBuilder.getSpirvDecorations(), nonArrayTypeId,
                                  spv::DecorationBlock, {});
         }
+        else if (type.getQualifier() == EvqPatchIn || type.getQualifier() == EvqPatchOut)
+        {
+            // Tessellation shaders can have their input or output qualified with |patch|.  For I/O
+            // blocks, the members are decorated instead.
+            spirv::WriteDecorate(mBuilder.getSpirvDecorations(), variableId, spv::DecorationPatch,
+                                 {});
+        }
     }
     else if (isInterfaceBlock)
     {
@@ -5814,13 +6241,16 @@
 }
 }  // anonymous namespace
 
-bool OutputSPIRV(TCompiler *compiler,
-                 TIntermBlock *root,
-                 ShCompileOptions compileOptions,
-                 bool forceHighp)
+bool OutputSPIRV(TCompiler *compiler, TIntermBlock *root, ShCompileOptions compileOptions)
 {
+    // Find the list of nodes that require NoContraction (as a result of |precise|).
+    if (compiler->hasAnyPreciseType())
+    {
+        FindPreciseNodes(compiler, root);
+    }
+
     // Traverse the tree and generate SPIR-V instructions
-    OutputSPIRVTraverser traverser(compiler, compileOptions, forceHighp);
+    OutputSPIRVTraverser traverser(compiler, compileOptions);
     root->traverse(&traverser);
 
     // Generate the final SPIR-V and store in the sink
diff --git a/src/compiler/translator/OutputSPIRV.h b/src/compiler/translator/OutputSPIRV.h
index 558e8ab..99c9dd0 100644
--- a/src/compiler/translator/OutputSPIRV.h
+++ b/src/compiler/translator/OutputSPIRV.h
@@ -13,10 +13,7 @@
 
 namespace sh
 {
-bool OutputSPIRV(TCompiler *compiler,
-                 TIntermBlock *root,
-                 ShCompileOptions compileOptions,
-                 bool forceHighp);
+bool OutputSPIRV(TCompiler *compiler, TIntermBlock *root, ShCompileOptions compileOptions);
 }  // namespace sh
 
 #endif  // COMPILER_TRANSLATOR_OUTPUTSPIRV_H_
diff --git a/src/compiler/translator/OutputVulkanGLSL.cpp b/src/compiler/translator/OutputVulkanGLSL.cpp
index 3fb890c..2a1ebc2 100644
--- a/src/compiler/translator/OutputVulkanGLSL.cpp
+++ b/src/compiler/translator/OutputVulkanGLSL.cpp
@@ -19,28 +19,14 @@
 namespace sh
 {
 
-TOutputVulkanGLSL::TOutputVulkanGLSL(TInfoSinkBase &objSink,
-                                     ShHashFunction64 hashFunction,
-                                     NameMap &nameMap,
-                                     TSymbolTable *symbolTable,
-                                     sh::GLenum shaderType,
-                                     int shaderVersion,
-                                     ShShaderOutput output,
-                                     bool forceHighp,
+TOutputVulkanGLSL::TOutputVulkanGLSL(TCompiler *compiler,
+                                     TInfoSinkBase &objSink,
                                      bool enablePrecision,
                                      ShCompileOptions compileOptions)
-    : TOutputGLSL(objSink,
-                  hashFunction,
-                  nameMap,
-                  symbolTable,
-                  shaderType,
-                  shaderVersion,
-                  output,
-                  compileOptions),
+    : TOutputGLSL(compiler, objSink, compileOptions),
       mNextUnusedBinding(0),
       mNextUnusedInputLocation(0),
       mNextUnusedOutputLocation(0),
-      mForceHighp(forceHighp),
       mEnablePrecision(enablePrecision)
 {}
 
@@ -185,10 +171,7 @@
         return false;
 
     TInfoSinkBase &out = objSink();
-    if (mForceHighp)
-        out << getPrecisionString(EbpHigh);
-    else
-        out << getPrecisionString(precision);
+    out << getPrecisionString(precision);
     return true;
 }
 
diff --git a/src/compiler/translator/OutputVulkanGLSL.h b/src/compiler/translator/OutputVulkanGLSL.h
index 6cb57a1..2d5dd5b 100644
--- a/src/compiler/translator/OutputVulkanGLSL.h
+++ b/src/compiler/translator/OutputVulkanGLSL.h
@@ -20,14 +20,8 @@
 class TOutputVulkanGLSL : public TOutputGLSL
 {
   public:
-    TOutputVulkanGLSL(TInfoSinkBase &objSink,
-                      ShHashFunction64 hashFunction,
-                      NameMap &nameMap,
-                      TSymbolTable *symbolTable,
-                      sh::GLenum shaderType,
-                      int shaderVersion,
-                      ShShaderOutput output,
-                      bool forceHighp,
+    TOutputVulkanGLSL(TCompiler *compiler,
+                      TInfoSinkBase &objSink,
                       bool enablePrecision,
                       ShCompileOptions compileOptions);
 
@@ -62,7 +56,6 @@
     uint32_t mNextUnusedOutputLocation;
 
   private:
-    bool mForceHighp;
     bool mEnablePrecision;
 };
 
diff --git a/src/compiler/translator/OutputVulkanGLSLForMetal.h b/src/compiler/translator/OutputVulkanGLSLForMetal.h
deleted file mode 100644
index 0e522da..0000000
--- a/src/compiler/translator/OutputVulkanGLSLForMetal.h
+++ /dev/null
@@ -1,43 +0,0 @@
-//
-// Copyright 2019 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-// TOutputVulkanGLSLForMetal:
-//    This is a special version Vulkan GLSL output that will make some special
-//    considerations for Metal backend limitations.
-//
-
-#ifndef COMPILER_TRANSLATOR_OUTPUTVULKANGLSLFORMETAL_H_
-#define COMPILER_TRANSLATOR_OUTPUTVULKANGLSLFORMETAL_H_
-
-#include "compiler/translator/OutputVulkanGLSL.h"
-
-namespace sh
-{
-
-class TOutputVulkanGLSLForMetal : public TOutputVulkanGLSL
-{
-  public:
-    TOutputVulkanGLSLForMetal(TInfoSinkBase &objSink,
-                              ShHashFunction64 hashFunction,
-                              NameMap &nameMap,
-                              TSymbolTable *symbolTable,
-                              sh::GLenum shaderType,
-                              int shaderVersion,
-                              ShShaderOutput output,
-                              ShCompileOptions compileOptions);
-
-    static void RemoveInvariantForTest(bool remove);
-
-  protected:
-    bool visitGlobalQualifierDeclaration(Visit visit,
-                                         TIntermGlobalQualifierDeclaration *node) override;
-    void writeVariableType(const TType &type,
-                           const TSymbol *symbol,
-                           bool isFunctionArgument) override;
-};
-
-}  // namespace sh
-
-#endif  // COMPILER_TRANSLATOR_OUTPUTVULKANGLSLFORMETAL_H_
diff --git a/src/compiler/translator/OutputVulkanGLSLForMetal.mm b/src/compiler/translator/OutputVulkanGLSLForMetal.mm
deleted file mode 100644
index c528ff2..0000000
--- a/src/compiler/translator/OutputVulkanGLSLForMetal.mm
+++ /dev/null
@@ -1,110 +0,0 @@
-//
-// Copyright 2019 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-// TOutputVulkanGLSLForMetal:
-//    This is a special version Vulkan GLSL output that will make some special
-//    considerations for Metal backend limitations.
-//
-
-#include "compiler/translator/OutputVulkanGLSLForMetal.h"
-
-#include "common/apple_platform_utils.h"
-#include "compiler/translator/BaseTypes.h"
-#include "compiler/translator/Symbol.h"
-#include "compiler/translator/util.h"
-
-namespace sh
-{
-
-namespace
-{
-bool gOverrideRemoveInvariant = false;
-
-bool ShoudRemoveInvariant(const TType &type)
-{
-    if (gOverrideRemoveInvariant)
-    {
-        return true;
-    }
-
-    if (type.getQualifier() != EvqPosition)
-    {
-        // Metal only supports invariant for gl_Position
-        return true;
-    }
-
-    if (ANGLE_APPLE_AVAILABLE_XCI(10.14, 13.0, 12))
-    {
-        return false;
-    }
-    else
-    {
-        // Metal 2.1 is not available, so we need to remove "invariant" keyword
-        return true;
-    }
-}
-
-}
-
-// static
-void TOutputVulkanGLSLForMetal::RemoveInvariantForTest(bool remove)
-{
-    gOverrideRemoveInvariant = remove;
-}
-
-TOutputVulkanGLSLForMetal::TOutputVulkanGLSLForMetal(TInfoSinkBase &objSink,
-                                                     ShHashFunction64 hashFunction,
-                                                     NameMap &nameMap,
-                                                     TSymbolTable *symbolTable,
-                                                     sh::GLenum shaderType,
-                                                     int shaderVersion,
-                                                     ShShaderOutput output,
-                                                     ShCompileOptions compileOptions)
-    : TOutputVulkanGLSL(objSink,
-                        hashFunction,
-                        nameMap,
-                        symbolTable,
-                        shaderType,
-                        shaderVersion,
-                        output,
-                        false,
-                        true,
-                        compileOptions)
-{}
-
-void TOutputVulkanGLSLForMetal::writeVariableType(const TType &type,
-                                                  const TSymbol *symbol,
-                                                  bool isFunctionArgument)
-{
-    TType overrideType(type);
-
-    // Remove invariant keyword if required.
-    if (type.isInvariant() && ShoudRemoveInvariant(type))
-    {
-        overrideType.setInvariant(false);
-    }
-
-    TOutputVulkanGLSL::writeVariableType(overrideType, symbol, isFunctionArgument);
-}
-
-bool TOutputVulkanGLSLForMetal::visitGlobalQualifierDeclaration(
-    Visit visit,
-    TIntermGlobalQualifierDeclaration *node)
-{
-    TInfoSinkBase &out = objSink();
-    ASSERT(visit == PreVisit);
-    const TIntermSymbol *symbol = node->getSymbol();
-
-    // No support for the |precise| keyword from EXT_gpu_shader5 (or ES3.2).
-    ASSERT(node->isInvariant());
-
-    if (!ShoudRemoveInvariant(symbol->getType()))
-    {
-        out << "invariant ";
-    }
-    out << hashName(&symbol->variable());
-    return false;
-}
-}  // namespace sh
diff --git a/src/compiler/translator/ParseContext.cpp b/src/compiler/translator/ParseContext.cpp
index 1763b1a..53f28be 100644
--- a/src/compiler/translator/ParseContext.cpp
+++ b/src/compiler/translator/ParseContext.cpp
@@ -10,6 +10,7 @@
 #include <stdio.h>
 
 #include "common/mathutil.h"
+#include "common/utilities.h"
 #include "compiler/preprocessor/SourceLocation.h"
 #include "compiler/translator/Declarator.h"
 #include "compiler/translator/StaticType.h"
@@ -210,11 +211,7 @@
       mDefaultBufferMatrixPacking(EmpColumnMajor),
       mDefaultBufferBlockStorage(sh::IsWebGLBasedSpec(spec) ? EbsStd140 : EbsShared),
       mDiagnostics(diagnostics),
-      mDirectiveHandler(ext,
-                        *mDiagnostics,
-                        mShaderVersion,
-                        mShaderType,
-                        resources.WEBGL_debug_shader_precision == 1),
+      mDirectiveHandler(ext, *mDiagnostics, mShaderVersion, mShaderType),
       mPreprocessor(mDiagnostics, &mDirectiveHandler, angle::pp::PreprocessorSettings(spec)),
       mScanner(nullptr),
       mMinProgramTexelOffset(resources.MinProgramTexelOffset),
@@ -246,6 +243,7 @@
       mTessEvaluationShaderInputVertexSpacingType(EtetUndefined),
       mTessEvaluationShaderInputOrderingType(EtetUndefined),
       mTessEvaluationShaderInputPointType(EtetUndefined),
+      mHasAnyPreciseType(false),
       mFunctionBodyNewScope(false),
       mOutputType(outputType)
 {}
@@ -553,7 +551,7 @@
         case EvqConst:
             message = "can't modify a const";
             break;
-        case EvqConstReadOnly:
+        case EvqParamConst:
             message = "can't modify a const";
             break;
         case EvqAttribute:
@@ -742,7 +740,7 @@
 bool TParseContext::checkIsNotReserved(const TSourceLoc &line, const ImmutableString &identifier)
 {
     static const char *reservedErrMsg = "reserved built-in name";
-    if (identifier.beginsWith("gl_"))
+    if (gl::IsBuiltInName(identifier.data()))
     {
         error(line, reservedErrMsg, "gl_");
         return false;
@@ -1031,7 +1029,7 @@
                                                      TQualifier qualifier,
                                                      const TType &type)
 {
-    ASSERT(qualifier == EvqOut || qualifier == EvqInOut);
+    ASSERT(qualifier == EvqParamOut || qualifier == EvqParamInOut);
     if (IsOpaqueType(type.getBasicType()))
     {
         error(line, "opaque types cannot be output parameters", type.getBasicString());
@@ -1246,7 +1244,19 @@
 {
     ASSERT((*variable) == nullptr);
 
-    (*variable) = new TVariable(&symbolTable, identifier, type, SymbolType::UserDefined);
+    SymbolType symbolType = SymbolType::UserDefined;
+    switch (type->getQualifier())
+    {
+        case EvqClipDistance:
+        case EvqCullDistance:
+        case EvqLastFragData:
+            symbolType = SymbolType::BuiltIn;
+            break;
+        default:
+            break;
+    }
+
+    (*variable) = new TVariable(&symbolTable, identifier, type, symbolType);
 
     ASSERT(type->getLayoutQualifier().index == -1 ||
            (isExtensionEnabled(TExtension::EXT_blend_func_extended) &&
@@ -1326,7 +1336,8 @@
         else if (static_cast<int>(type->getOutermostArraySize()) <=
                  maxClipDistances->getConstPointer()->getIConst())
         {
-            if (const TSymbol *builtInSymbol = symbolTable.findBuiltIn(identifier, mShaderVersion))
+            const TSymbol *builtInSymbol = symbolTable.findBuiltIn(identifier, mShaderVersion);
+            if (builtInSymbol)
             {
                 needsReservedCheck = !checkCanUseOneOfExtensions(line, builtInSymbol->extensions());
             }
@@ -1392,7 +1403,7 @@
     // The only parameter qualifiers a parameter can have are in, out, inout or const.
     TTypeQualifier typeQualifier = typeQualifierBuilder.getParameterTypeQualifier(mDiagnostics);
 
-    if (typeQualifier.qualifier == EvqOut || typeQualifier.qualifier == EvqInOut)
+    if (typeQualifier.qualifier == EvqParamOut || typeQualifier.qualifier == EvqParamInOut)
     {
         checkOutParameterIsNotOpaqueType(line, typeQualifier.qualifier, *type);
     }
@@ -1412,6 +1423,11 @@
     {
         type->setPrecision(typeQualifier.precision);
     }
+
+    if (typeQualifier.precise)
+    {
+        type->setPrecise(true);
+    }
 }
 
 template <size_t size>
@@ -2032,8 +2048,8 @@
     {
         TQualifier qual        = fnCandidate->getParam(i)->getType().getQualifier();
         TIntermTyped *argument = (*(fnCall->getSequence()))[i]->getAsTyped();
-        bool argumentIsRead = (IsQualifierUnspecified(qual) || qual == EvqIn || qual == EvqInOut ||
-                               qual == EvqConstReadOnly);
+        bool argumentIsRead    = (IsQualifierUnspecified(qual) || qual == EvqParamIn ||
+                               qual == EvqParamInOut || qual == EvqParamConst);
         if (argumentIsRead)
         {
             markStaticReadIfSymbol(argument);
@@ -2048,7 +2064,7 @@
                 }
             }
         }
-        if (qual == EvqOut || qual == EvqInOut)
+        if (qual == EvqParamOut || qual == EvqParamInOut)
         {
             if (!checkCanBeLValue(argument->getLine(), "assign", argument))
             {
@@ -2242,6 +2258,22 @@
     return node;
 }
 
+void TParseContext::adjustRedeclaredBuiltInType(const ImmutableString &identifier, TType *type)
+{
+    if (identifier == "gl_ClipDistance")
+    {
+        type->setQualifier(EvqClipDistance);
+    }
+    else if (identifier == "gl_CullDistance")
+    {
+        type->setQualifier(EvqCullDistance);
+    }
+    else if (identifier == "gl_LastFragData")
+    {
+        type->setQualifier(EvqLastFragData);
+    }
+}
+
 // Initializers show up in several places in the grammar.  Have one set of
 // code to handle them here.
 //
@@ -2806,43 +2838,47 @@
             case EvqSmoothOut:
             case EvqSampleOut:
                 // Declaring an array size is optional. If no size is specified, it will be taken
-                // from output patch size declared in the shader.
-                type->sizeOutermostUnsizedArray(mTessControlShaderOutputVertices);
+                // from output patch size declared in the shader.  If the patch size is not yet
+                // declared, this is deferred until such time as it does.
+                if (mTessControlShaderOutputVertices == 0)
+                {
+                    mTessControlDeferredArrayTypesToSize.push_back(type);
+                }
+                else
+                {
+                    type->sizeOutermostUnsizedArray(mTessControlShaderOutputVertices);
+                }
                 break;
             default:
                 UNREACHABLE();
                 break;
         }
-    }
-    else
-    {
-        if (IsTessellationControlShaderInput(mShaderType, qualifier) ||
-            IsTessellationEvaluationShaderInput(mShaderType, qualifier))
-        {
-            if (outermostSize != static_cast<unsigned int>(mMaxPatchVertices))
-            {
-                error(
-                    location,
-                    "If a size is specified for a tessellation control or evaluation user-defined "
-                    "input variable, it must match the maximum patch size (gl_MaxPatchVertices).",
-                    token);
-            }
-        }
-        else if (IsTessellationControlShaderOutput(mShaderType, qualifier))
-        {
-            if (outermostSize != static_cast<unsigned int>(mTessControlShaderOutputVertices) &&
-                mTessControlShaderOutputVertices != 0)
-            {
-                error(location,
-                      "If a size is specified for a tessellation control user-defined per-vertex "
-                      "output variable, it must match the the number of vertices in the output "
-                      "patch.",
-                      token);
-            }
-        }
-
         return;
     }
+
+    if (IsTessellationControlShaderInput(mShaderType, qualifier) ||
+        IsTessellationEvaluationShaderInput(mShaderType, qualifier))
+    {
+        if (outermostSize != static_cast<unsigned int>(mMaxPatchVertices))
+        {
+            error(location,
+                  "If a size is specified for a tessellation control or evaluation user-defined "
+                  "input variable, it must match the maximum patch size (gl_MaxPatchVertices).",
+                  token);
+        }
+    }
+    else if (IsTessellationControlShaderOutput(mShaderType, qualifier))
+    {
+        if (outermostSize != static_cast<unsigned int>(mTessControlShaderOutputVertices) &&
+            mTessControlShaderOutputVertices != 0)
+        {
+            error(location,
+                  "If a size is specified for a tessellation control user-defined per-vertex "
+                  "output variable, it must match the the number of vertices in the output "
+                  "patch.",
+                  token);
+        }
+    }
 }
 
 TIntermDeclaration *TParseContext::parseSingleDeclaration(
@@ -2963,6 +2999,8 @@
         checkAtomicCounterOffsetAlignment(identifierLocation, *arrayType);
     }
 
+    adjustRedeclaredBuiltInType(identifier, arrayType);
+
     TIntermDeclaration *declaration = new TIntermDeclaration();
     declaration->setLine(identifierLocation);
 
@@ -3137,6 +3175,8 @@
         checkAtomicCounterOffsetAlignment(identifierLocation, *type);
     }
 
+    adjustRedeclaredBuiltInType(identifier, type);
+
     TVariable *variable = nullptr;
     if (declareVariable(identifierLocation, identifier, type, &variable))
     {
@@ -3180,6 +3220,8 @@
             checkAtomicCounterOffsetAlignment(identifierLocation, *arrayType);
         }
 
+        adjustRedeclaredBuiltInType(identifier, arrayType);
+
         TVariable *variable = nullptr;
         if (declareVariable(identifierLocation, identifier, arrayType, &variable))
         {
@@ -3456,6 +3498,12 @@
     if (mTessControlShaderOutputVertices == 0)
     {
         mTessControlShaderOutputVertices = layoutQualifier.vertices;
+
+        // Size any implicitly sized arrays that have already been declared.
+        for (TType *type : mTessControlDeferredArrayTypesToSize)
+        {
+            type->sizeOutermostUnsizedArray(mTessControlShaderOutputVertices);
+        }
     }
     else
     {
@@ -4261,7 +4309,12 @@
                       getQualifierString(typeQualifier.qualifier));
             }
 
-            if (mShaderType == GL_TESS_CONTROL_SHADER && arraySizes == nullptr)
+            // Both inputs and outputs of tessellation control shaders must be arrays.
+            // For tessellation evaluation shaders, only inputs must necessarily be arrays.
+            const bool isTCS = mShaderType == GL_TESS_CONTROL_SHADER;
+            const bool isTESIn =
+                mShaderType == GL_TESS_EVALUATION_SHADER && IsShaderIn(typeQualifier.qualifier);
+            if (arraySizes == nullptr && (isTCS || isTESIn))
             {
                 error(typeQualifier.line, "type must be an array", blockName);
             }
@@ -4525,6 +4578,10 @@
     if (arraySizes)
     {
         interfaceBlockType->makeArrays(*arraySizes);
+
+        checkGeometryShaderInputAndSetArraySize(instanceLine, instanceName, interfaceBlockType);
+        checkTessellationShaderUnsizedArraysAndSetSize(instanceLine, instanceName,
+                                                       interfaceBlockType);
     }
 
     // The instance variable gets created to refer to the interface block type from the AST
@@ -4817,9 +4874,8 @@
             {
                 TConstantUnion *safeConstantUnion = new TConstantUnion();
                 safeConstantUnion->setIConst(safeIndex);
-                indexExpression = new TIntermConstantUnion(
-                    safeConstantUnion, TType(EbtInt, indexExpression->getPrecision(),
-                                             indexExpression->getQualifier()));
+                indexExpression =
+                    new TIntermConstantUnion(safeConstantUnion, TType(indexExpression->getType()));
             }
 
             TIntermBinary *node =
@@ -5446,7 +5502,7 @@
 {
     if (declaringFunction())
     {
-        return new TStorageQualifierWrapper(EvqIn, loc);
+        return new TStorageQualifierWrapper(EvqParamIn, loc);
     }
 
     switch (getShaderType())
@@ -5496,7 +5552,7 @@
 {
     if (declaringFunction())
     {
-        return new TStorageQualifierWrapper(EvqOut, loc);
+        return new TStorageQualifierWrapper(EvqParamOut, loc);
     }
     switch (getShaderType())
     {
@@ -5519,7 +5575,7 @@
         case GL_COMPUTE_SHADER:
         {
             error(loc, "storage qualifier isn't supported in compute shaders", "out");
-            return new TStorageQualifierWrapper(EvqOut, loc);
+            return new TStorageQualifierWrapper(EvqParamOut, loc);
         }
         case GL_GEOMETRY_SHADER_EXT:
         {
@@ -5556,7 +5612,7 @@
               "fetching input attachment data",
               "inout");
     }
-    return new TStorageQualifierWrapper(EvqInOut, loc);
+    return new TStorageQualifierWrapper(EvqParamInOut, loc);
 }
 
 TLayoutQualifier TParseContext::joinLayoutQualifiers(TLayoutQualifier leftQualifier,
diff --git a/src/compiler/translator/ParseContext.h b/src/compiler/translator/ParseContext.h
index 28f396d..354acc9 100644
--- a/src/compiler/translator/ParseContext.h
+++ b/src/compiler/translator/ParseContext.h
@@ -205,6 +205,10 @@
                                const char *value,
                                bool stdgl);
 
+    // For built-ins that can be redeclared, adjusts the type qualifier so transformations can
+    // identify them correctly.
+    void adjustRedeclaredBuiltInType(const ImmutableString &identifier, TType *type);
+
     // Returns true on success. *initNode may still be nullptr on success in case the initialization
     // is not needed in the AST.
     bool executeInitializer(const TSourceLoc &line,
@@ -489,6 +493,9 @@
         return mTessEvaluationShaderInputPointType;
     }
 
+    void markShaderHasPrecise() { mHasAnyPreciseType = true; }
+    bool hasAnyPreciseType() const { return mHasAnyPreciseType; }
+
     ShShaderOutput getOutputType() const { return mOutputType; }
 
     // TODO(jmadill): make this private
@@ -722,6 +729,11 @@
     TLayoutTessEvaluationType mTessEvaluationShaderInputVertexSpacingType;
     TLayoutTessEvaluationType mTessEvaluationShaderInputOrderingType;
     TLayoutTessEvaluationType mTessEvaluationShaderInputPointType;
+    // List of array declarations without an explicit size that have come before layout(vertices=N).
+    // Once the vertex count is specified, these arrays are sized.
+    TVector<TType *> mTessControlDeferredArrayTypesToSize;
+    // Whether the |precise| keyword has been seen in the shader.
+    bool mHasAnyPreciseType;
 
     // Track when we add new scope for func body in ESSL 1.00 spec
     bool mFunctionBodyNewScope;
diff --git a/src/compiler/translator/Pragma.h b/src/compiler/translator/Pragma.h
index 17b8b41..c3f5ca2 100644
--- a/src/compiler/translator/Pragma.h
+++ b/src/compiler/translator/Pragma.h
@@ -17,14 +17,11 @@
     };
 
     // By default optimization is turned on and debug is turned off.
-    // Precision emulation is turned on by default, but has no effect unless
-    // the extension is enabled.
-    TPragma() : optimize(true), debug(false), debugShaderPrecision(true) {}
-    TPragma(bool o, bool d) : optimize(o), debug(d), debugShaderPrecision(true) {}
+    TPragma() : optimize(true), debug(false) {}
+    TPragma(bool o, bool d) : optimize(o), debug(d) {}
 
     bool optimize;
     bool debug;
-    bool debugShaderPrecision;
     STDGL stdgl;
 };
 
diff --git a/src/compiler/translator/QualifierTypes.cpp b/src/compiler/translator/QualifierTypes.cpp
index a005248..0a928ba 100644
--- a/src/compiler/translator/QualifierTypes.cpp
+++ b/src/compiler/translator/QualifierTypes.cpp
@@ -511,8 +511,8 @@
         {
             switch (storageQualifier)
             {
-                case EvqIn:
-                    *joinedQualifier = EvqConstReadOnly;
+                case EvqParamIn:
+                    *joinedQualifier = EvqParamConst;
                     break;
                 default:
                     return false;
@@ -641,7 +641,6 @@
         switch (qualifier->getType())
         {
             case QtInvariant:
-            case QtPrecise:
             case QtInterpolation:
             case QtLayout:
                 break;
@@ -661,6 +660,10 @@
                     static_cast<const TPrecisionQualifierWrapper *>(qualifier)->getQualifier();
                 ASSERT(typeQualifier.precision != EbpUndefined);
                 break;
+            case QtPrecise:
+                isQualifierValid      = true;
+                typeQualifier.precise = true;
+                break;
             default:
                 UNREACHABLE();
         }
@@ -675,17 +678,17 @@
 
     switch (typeQualifier.qualifier)
     {
-        case EvqIn:
-        case EvqConstReadOnly:  // const in
-        case EvqOut:
-        case EvqInOut:
+        case EvqParamIn:
+        case EvqParamConst:  // const in
+        case EvqParamOut:
+        case EvqParamInOut:
             break;
         case EvqConst:
-            typeQualifier.qualifier = EvqConstReadOnly;
+            typeQualifier.qualifier = EvqParamConst;
             break;
         case EvqTemporary:
-            // no qualifier has been specified, set it to EvqIn which is the default
-            typeQualifier.qualifier = EvqIn;
+            // no qualifier has been specified, set it to EvqParamIn which is the default
+            typeQualifier.qualifier = EvqParamIn;
             break;
         default:
             diagnostics->error(sortedSequence[0]->getLine(), "Invalid parameter qualifier ",
diff --git a/src/compiler/translator/ShaderLang.cpp b/src/compiler/translator/ShaderLang.cpp
index 6a424cb..849f124 100644
--- a/src/compiler/translator/ShaderLang.cpp
+++ b/src/compiler/translator/ShaderLang.cpp
@@ -27,8 +27,18 @@
 namespace
 {
 
-bool isInitialized        = false;
-bool isGlslangInitialized = false;
+bool isInitialized = false;
+
+// glslang can only be initialized/finalized once per process. Otherwise, the following EGL commands
+// will call GlslangFinalize() without ever being able to GlslangInitialize() again, leading to
+// crashes since GlslangFinalize() cleans up glslang for the entire process.
+//   dpy1 = eglGetPlatformDisplay()   |
+//   eglInitialize(dpy1)              | GlslangInitialize()
+//   dpy2 = eglGetPlatformDisplay()   |
+//   eglInitialize(dpy2)              | GlslangInitialize()
+//   eglTerminate(dpy2)               | GlslangFinalize()
+//   eglInitialize(dpy1)              | Display::isInitialized() == true, no GlslangInitialize()
+int initializeGlslangRefCount = 0;
 
 //
 // This is the platform independent interface between an OGL driver
@@ -190,7 +200,6 @@
     resources->EXT_draw_buffers                            = 0;
     resources->EXT_frag_depth                              = 0;
     resources->EXT_shader_texture_lod                      = 0;
-    resources->WEBGL_debug_shader_precision                = 0;
     resources->EXT_shader_framebuffer_fetch                = 0;
     resources->EXT_shader_framebuffer_fetch_non_coherent   = 0;
     resources->NV_shader_framebuffer_fetch                 = 0;
@@ -917,20 +926,22 @@
 
 void InitializeGlslang()
 {
-    if (!isGlslangInitialized)
+    if (initializeGlslangRefCount == 0)
     {
         GlslangInitialize();
     }
-    isGlslangInitialized = true;
+    ++initializeGlslangRefCount;
+    ASSERT(initializeGlslangRefCount < std::numeric_limits<int>::max());
 }
 
 void FinalizeGlslang()
 {
-    if (isGlslangInitialized)
+    --initializeGlslangRefCount;
+    ASSERT(initializeGlslangRefCount >= 0);
+    if (initializeGlslangRefCount == 0)
     {
         GlslangFinalize();
     }
-    isGlslangInitialized = false;
 }
 
 // Can't prefix with just _ because then we might introduce a double underscore, which is not safe
@@ -970,4 +981,52 @@
 
 }  // namespace vk
 
+const char *BlockLayoutTypeToString(BlockLayoutType type)
+{
+    switch (type)
+    {
+        case BlockLayoutType::BLOCKLAYOUT_STD140:
+            return "std140";
+        case BlockLayoutType::BLOCKLAYOUT_STD430:
+            return "std430";
+        case BlockLayoutType::BLOCKLAYOUT_PACKED:
+            return "packed";
+        case BlockLayoutType::BLOCKLAYOUT_SHARED:
+            return "shared";
+        default:
+            return "invalid";
+    }
+}
+
+const char *BlockTypeToString(BlockType type)
+{
+    switch (type)
+    {
+        case BlockType::BLOCK_BUFFER:
+            return "buffer";
+        case BlockType::BLOCK_UNIFORM:
+            return "uniform";
+        default:
+            return "invalid";
+    }
+}
+
+const char *InterpolationTypeToString(InterpolationType type)
+{
+    switch (type)
+    {
+        case InterpolationType::INTERPOLATION_SMOOTH:
+            return "smooth";
+        case InterpolationType::INTERPOLATION_CENTROID:
+            return "centroid";
+        case InterpolationType::INTERPOLATION_SAMPLE:
+            return "sample";
+        case InterpolationType::INTERPOLATION_FLAT:
+            return "flat";
+        case InterpolationType::INTERPOLATION_NOPERSPECTIVE:
+            return "noperspective";
+        default:
+            return "invalid";
+    }
+}
 }  // namespace sh
diff --git a/src/compiler/translator/StaticType.h b/src/compiler/translator/StaticType.h
index 8b9f80d..9d3a058 100644
--- a/src/compiler/translator/StaticType.h
+++ b/src/compiler/translator/StaticType.h
@@ -194,25 +194,32 @@
 // Overloads
 //
 
-template <TBasicType basicType, unsigned char primarySize = 1, unsigned char secondarySize = 1>
+template <TBasicType basicType,
+          TPrecision precision,
+          unsigned char primarySize   = 1,
+          unsigned char secondarySize = 1>
 constexpr const TType *GetBasic()
 {
-    return Get<basicType, EbpUndefined, EvqGlobal, primarySize, secondarySize>();
-}
-
-template <TBasicType basicType, unsigned char primarySize = 1, unsigned char secondarySize = 1>
-constexpr const TType *GetTemporary()
-{
-    return Get<basicType, EbpUndefined, EvqTemporary, primarySize, secondarySize>();
+    return Get<basicType, precision, EvqGlobal, primarySize, secondarySize>();
 }
 
 template <TBasicType basicType,
+          TPrecision precision,
+          unsigned char primarySize   = 1,
+          unsigned char secondarySize = 1>
+constexpr const TType *GetTemporary()
+{
+    return Get<basicType, precision, EvqTemporary, primarySize, secondarySize>();
+}
+
+template <TBasicType basicType,
+          TPrecision precision,
           TQualifier qualifier,
           unsigned char primarySize   = 1,
           unsigned char secondarySize = 1>
 const TType *GetQualified()
 {
-    return Get<basicType, EbpUndefined, qualifier, primarySize, secondarySize>();
+    return Get<basicType, precision, qualifier, primarySize, secondarySize>();
 }
 
 // Dynamic lookup methods (convert runtime values to template args)
@@ -242,15 +249,13 @@
             return Get<basicType, precision, qualifier, 4, secondarySize>();
         default:
             UNREACHABLE();
-            return GetBasic<EbtVoid>();
+            return GetBasic<EbtVoid, EbpUndefined>();
     }
 }
 
 }  // namespace Helpers
 
-template <TBasicType basicType,
-          TPrecision precision = EbpUndefined,
-          TQualifier qualifier = EvqGlobal>
+template <TBasicType basicType, TPrecision precision, TQualifier qualifier = EvqGlobal>
 constexpr const TType *GetForVecMat(unsigned char primarySize, unsigned char secondarySize = 1)
 {
     static_assert(basicType == EbtFloat || basicType == EbtInt || basicType == EbtUInt ||
@@ -268,22 +273,22 @@
             return Helpers::GetForVecMatHelper<basicType, precision, qualifier, 4>(primarySize);
         default:
             UNREACHABLE();
-            return GetBasic<EbtVoid>();
+            return GetBasic<EbtVoid, EbpUndefined>();
     }
 }
 
-template <TBasicType basicType, TPrecision precision = EbpUndefined>
+template <TBasicType basicType, TPrecision precision>
 constexpr const TType *GetForVec(TQualifier qualifier, unsigned char size)
 {
     switch (qualifier)
     {
         case EvqGlobal:
             return Helpers::GetForVecMatHelper<basicType, precision, EvqGlobal, 1>(size);
-        case EvqOut:
-            return Helpers::GetForVecMatHelper<basicType, precision, EvqOut, 1>(size);
+        case EvqParamOut:
+            return Helpers::GetForVecMatHelper<basicType, precision, EvqParamOut, 1>(size);
         default:
             UNREACHABLE();
-            return GetBasic<EbtVoid>();
+            return GetBasic<EbtVoid, EbpUndefined>();
     }
 }
 
diff --git a/src/compiler/translator/SymbolTable.cpp b/src/compiler/translator/SymbolTable.cpp
index 9b46144..8424f47 100644
--- a/src/compiler/translator/SymbolTable.cpp
+++ b/src/compiler/translator/SymbolTable.cpp
@@ -316,7 +316,10 @@
 bool TSymbolTable::declare(TSymbol *symbol)
 {
     ASSERT(!mTable.empty());
-    ASSERT(symbol->symbolType() == SymbolType::UserDefined);
+    // The following built-ins may be redeclared by the shader: gl_ClipDistance, gl_CullDistance and
+    // gl_LastFragData.
+    ASSERT(symbol->symbolType() == SymbolType::UserDefined ||
+           (symbol->symbolType() == SymbolType::BuiltIn && IsRedeclarableBuiltIn(symbol->name())));
     ASSERT(!symbol->isFunction());
     return mTable.back()->insert(symbol);
 }
diff --git a/src/compiler/translator/SymbolTable.h b/src/compiler/translator/SymbolTable.h
index 7d1c7ce..f48409f 100644
--- a/src/compiler/translator/SymbolTable.h
+++ b/src/compiler/translator/SymbolTable.h
@@ -75,6 +75,13 @@
 };
 
 constexpr uint16_t kESSL1Only = 100;
+// Some built-ins from Vulkan GLSL are made available to ESSL for use in tree transformations.  This
+// (invalid) shader version is used to select those built-ins.  This value needs to be larger than
+// all other shader versions.
+constexpr uint16_t kESSLVulkanOnly = 0x3FFF;
+
+// The version assigned to |kESSLVulkanOnly| should be good until OpenGL 20.0!
+static_assert(kESSLVulkanOnly > 2000, "Accidentally exposing Vulkan built-ins in OpenGL");
 
 static_assert(offsetof(ShBuiltInResources, OES_standard_derivatives) != 0,
               "Update SymbolTable extension logic");
@@ -318,8 +325,8 @@
                             const ShBuiltInResources &resources);
     void clearCompilationResults();
 
-    int getDefaultUniformsBindingIndex() const { return mResources.DriverUniformsBindingIndex; }
-    int getDriverUniformsBindingIndex() const { return mResources.DefaultUniformsBindingIndex; }
+    int getDefaultUniformsBindingIndex() const { return mResources.DefaultUniformsBindingIndex; }
+    int getDriverUniformsBindingIndex() const { return mResources.DriverUniformsBindingIndex; }
     int getUBOArgumentBufferBindingIndex() const
     {
         return mResources.UBOArgumentBufferBindingIndex;
diff --git a/src/compiler/translator/SymbolTable_ESSL_autogen.cpp b/src/compiler/translator/SymbolTable_ESSL_autogen.cpp
index 5bc7239..073be4e 100644
--- a/src/compiler/translator/SymbolTable_ESSL_autogen.cpp
+++ b/src/compiler/translator/SymbolTable_ESSL_autogen.cpp
@@ -1657,11 +1657,18 @@
 constexpr const TSymbolUniqueId BuiltInId::barrier;
 constexpr const TSymbolUniqueId BuiltInId::memoryBarrierShared;
 constexpr const TSymbolUniqueId BuiltInId::groupMemoryBarrier;
-constexpr const TSymbolUniqueId BuiltInId::barrierES3_2;
+constexpr const TSymbolUniqueId BuiltInId::barrierTCS;
+constexpr const TSymbolUniqueId BuiltInId::barrierTCSES3_2;
 constexpr const TSymbolUniqueId BuiltInId::EmitVertex;
 constexpr const TSymbolUniqueId BuiltInId::EmitVertexES3_2;
 constexpr const TSymbolUniqueId BuiltInId::EndPrimitive;
 constexpr const TSymbolUniqueId BuiltInId::EndPrimitiveES3_2;
+constexpr const TSymbolUniqueId BuiltInId::subpassLoad_SubpassInput1;
+constexpr const TSymbolUniqueId BuiltInId::subpassLoad_ISubpassInput1;
+constexpr const TSymbolUniqueId BuiltInId::subpassLoad_USubpassInput1;
+constexpr const TSymbolUniqueId BuiltInId::subpassLoad_SubpassInputMS1_Int1;
+constexpr const TSymbolUniqueId BuiltInId::subpassLoad_ISubpassInputMS1_Int1;
+constexpr const TSymbolUniqueId BuiltInId::subpassLoad_USubpassInputMS1_Int1;
 constexpr const TSymbolUniqueId BuiltInId::gl_DepthRangeParameters;
 constexpr const TSymbolUniqueId BuiltInId::gl_DepthRange;
 constexpr const TSymbolUniqueId BuiltInId::gl_NumSamples;
@@ -1765,6 +1772,7 @@
 constexpr const TSymbolUniqueId BuiltInId::gl_FragData;
 constexpr const TSymbolUniqueId BuiltInId::gl_FragDepth;
 constexpr const TSymbolUniqueId BuiltInId::gl_HelperInvocation;
+constexpr const TSymbolUniqueId BuiltInId::gl_FragCoord300;
 constexpr const TSymbolUniqueId BuiltInId::gl_SecondaryFragColorEXT;
 constexpr const TSymbolUniqueId BuiltInId::gl_SecondaryFragDataEXT;
 constexpr const TSymbolUniqueId BuiltInId::gl_FragDepthEXT;
@@ -1795,6 +1803,7 @@
 constexpr const TSymbolUniqueId BuiltInId::gl_VertexIndex;
 constexpr const TSymbolUniqueId BuiltInId::gl_ViewportIndex;
 constexpr const TSymbolUniqueId BuiltInId::gl_LayerVS;
+constexpr const TSymbolUniqueId BuiltInId::gl_PointSize300;
 constexpr const TSymbolUniqueId BuiltInId::gl_DrawID;
 constexpr const TSymbolUniqueId BuiltInId::gl_BaseVertex;
 constexpr const TSymbolUniqueId BuiltInId::gl_BaseInstance;
@@ -1844,6 +1853,8 @@
 constexpr const TSymbolUniqueId BuiltInId::gl_PerVertexOutTcsBlockES3_2;
 constexpr const TSymbolUniqueId BuiltInId::gl_PositionTCS;
 constexpr const TSymbolUniqueId BuiltInId::gl_PositionTCSES3_2;
+constexpr const TSymbolUniqueId BuiltInId::gl_BoundingBoxEXTTCS;
+constexpr const TSymbolUniqueId BuiltInId::gl_BoundingBoxEXTTCSES3_2;
 constexpr const TSymbolUniqueId BuiltInId::gl_PatchVerticesInTES;
 constexpr const TSymbolUniqueId BuiltInId::gl_PatchVerticesInTESES3_2;
 constexpr const TSymbolUniqueId BuiltInId::gl_PrimitiveIDTES;
@@ -1865,7 +1876,7 @@
 constexpr const TSymbolUniqueId BuiltInId::gl_PositionTESES3_2;
 constexpr const TSymbolUniqueId BuiltInId::gl_ViewID_OVR;
 
-const int TSymbolTable::kLastBuiltInId = 4980;
+const int TSymbolTable::kLastBuiltInId = 5002;
 
 namespace BuiltInName
 {
@@ -1898,7 +1909,8 @@
 constexpr const ImmutableString atomicOr("atomicOr");
 constexpr const ImmutableString atomicXor("atomicXor");
 constexpr const ImmutableString barrier("barrier");
-constexpr const ImmutableString barrierES3_2("barrier");
+constexpr const ImmutableString barrierTCS("barrier");
+constexpr const ImmutableString barrierTCSES3_2("barrier");
 constexpr const ImmutableString bitCount("bitCount");
 constexpr const ImmutableString bitfieldExtract("bitfieldExtract");
 constexpr const ImmutableString bitfieldInsert("bitfieldInsert");
@@ -1935,6 +1947,7 @@
 constexpr const ImmutableString fwidthExt("fwidth");
 constexpr const ImmutableString gl_BaseInstance("gl_BaseInstance");
 constexpr const ImmutableString gl_BaseVertex("gl_BaseVertex");
+constexpr const ImmutableString gl_BoundingBoxEXT("gl_BoundingBoxEXT");
 constexpr const ImmutableString gl_ClipDistance("gl_ClipDistance");
 constexpr const ImmutableString gl_CullDistance("gl_CullDistance");
 constexpr const ImmutableString gl_DepthRange("gl_DepthRange");
@@ -2139,6 +2152,7 @@
 constexpr const ImmutableString smoothstep("smoothstep");
 constexpr const ImmutableString sqrt("sqrt");
 constexpr const ImmutableString step("step");
+constexpr const ImmutableString subpassLoad("subpassLoad");
 constexpr const ImmutableString tan("tan");
 constexpr const ImmutableString tanh("tanh");
 constexpr const ImmutableString texelFetch("texelFetch");
@@ -2247,6 +2261,12 @@
                                         SymbolType::BuiltIn,
                                         std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
                                         StaticType::Get<EbtFloat, EbpMedium, EvqFragCoord, 4, 1>());
+constexpr const TVariable kgl_FragCoord300(
+    BuiltInId::gl_FragCoord300,
+    BuiltInName::gl_FragCoord,
+    SymbolType::BuiltIn,
+    std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
+    StaticType::Get<EbtFloat, EbpHigh, EvqFragCoord, 4, 1>());
 constexpr const TVariable kgl_FragDepth(BuiltInId::gl_FragDepth,
                                         BuiltInName::gl_FragDepth,
                                         SymbolType::BuiltIn,
@@ -2408,6 +2428,12 @@
                                         SymbolType::BuiltIn,
                                         std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
                                         StaticType::Get<EbtFloat, EbpMedium, EvqPointSize, 1, 1>());
+constexpr const TVariable kgl_PointSize300(
+    BuiltInId::gl_PointSize300,
+    BuiltInName::gl_PointSize,
+    SymbolType::BuiltIn,
+    std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
+    StaticType::Get<EbtFloat, EbpHigh, EvqPointSize, 1, 1>());
 constexpr const TVariable kgl_Position(BuiltInId::gl_Position,
                                        BuiltInName::gl_Position,
                                        SymbolType::BuiltIn,
@@ -2506,7 +2532,7 @@
                                         BuiltInName::gl_TessCoord,
                                         SymbolType::BuiltIn,
                                         std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                        StaticType::Get<EbtFloat, EbpHigh, EvqGlobal, 3, 1>());
+                                        StaticType::Get<EbtFloat, EbpHigh, EvqTessCoord, 3, 1>());
 constexpr const TVariable kgl_VertexID(BuiltInId::gl_VertexID,
                                        BuiltInName::gl_VertexID,
                                        SymbolType::BuiltIn,
@@ -2927,6 +2953,41 @@
                                  SymbolType::BuiltIn,
                                  std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
                                  StaticType::Get<EbtUImageBuffer, EbpUndefined, EvqGlobal, 1, 1>());
+constexpr const TVariable kpt01g(BuiltInId::pt01g,
+                                 BuiltInName::_empty,
+                                 SymbolType::BuiltIn,
+                                 std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
+                                 StaticType::Get<EbtSubpassInput, EbpUndefined, EvqGlobal, 1, 1>());
+constexpr const TVariable kpt01h(
+    BuiltInId::pt01h,
+    BuiltInName::_empty,
+    SymbolType::BuiltIn,
+    std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
+    StaticType::Get<EbtISubpassInput, EbpUndefined, EvqGlobal, 1, 1>());
+constexpr const TVariable kpt01i(
+    BuiltInId::pt01i,
+    BuiltInName::_empty,
+    SymbolType::BuiltIn,
+    std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
+    StaticType::Get<EbtUSubpassInput, EbpUndefined, EvqGlobal, 1, 1>());
+constexpr const TVariable kpt01j(
+    BuiltInId::pt01j,
+    BuiltInName::_empty,
+    SymbolType::BuiltIn,
+    std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
+    StaticType::Get<EbtSubpassInputMS, EbpUndefined, EvqGlobal, 1, 1>());
+constexpr const TVariable kpt01k(
+    BuiltInId::pt01k,
+    BuiltInName::_empty,
+    SymbolType::BuiltIn,
+    std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
+    StaticType::Get<EbtISubpassInputMS, EbpUndefined, EvqGlobal, 1, 1>());
+constexpr const TVariable kpt01l(
+    BuiltInId::pt01l,
+    BuiltInName::_empty,
+    SymbolType::BuiltIn,
+    std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
+    StaticType::Get<EbtUSubpassInputMS, EbpUndefined, EvqGlobal, 1, 1>());
 constexpr const TVariable kpt10B(BuiltInId::pt10B,
                                  BuiltInName::_empty,
                                  SymbolType::BuiltIn,
@@ -3042,72 +3103,72 @@
                                      BuiltInName::_empty,
                                      SymbolType::BuiltIn,
                                      std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                     StaticType::Get<EbtInt, EbpUndefined, EvqInOut, 1, 1>());
+                                     StaticType::Get<EbtInt, EbpUndefined, EvqParamInOut, 1, 1>());
 constexpr const TVariable kpt_io_00E(BuiltInId::pt_io_00E,
                                      BuiltInName::_empty,
                                      SymbolType::BuiltIn,
                                      std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                     StaticType::Get<EbtUInt, EbpUndefined, EvqInOut, 1, 1>());
+                                     StaticType::Get<EbtUInt, EbpUndefined, EvqParamInOut, 1, 1>());
 constexpr const TVariable kpt_o_00B(BuiltInId::pt_o_00B,
                                     BuiltInName::_empty,
                                     SymbolType::BuiltIn,
                                     std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                    StaticType::Get<EbtFloat, EbpUndefined, EvqOut, 1, 1>());
+                                    StaticType::Get<EbtFloat, EbpUndefined, EvqParamOut, 1, 1>());
 constexpr const TVariable kpt_o_00D(BuiltInId::pt_o_00D,
                                     BuiltInName::_empty,
                                     SymbolType::BuiltIn,
                                     std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                    StaticType::Get<EbtInt, EbpUndefined, EvqOut, 1, 1>());
+                                    StaticType::Get<EbtInt, EbpUndefined, EvqParamOut, 1, 1>());
 constexpr const TVariable kpt_o_00E(BuiltInId::pt_o_00E,
                                     BuiltInName::_empty,
                                     SymbolType::BuiltIn,
                                     std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                    StaticType::Get<EbtUInt, EbpUndefined, EvqOut, 1, 1>());
+                                    StaticType::Get<EbtUInt, EbpUndefined, EvqParamOut, 1, 1>());
 constexpr const TVariable kpt_o_10B(BuiltInId::pt_o_10B,
                                     BuiltInName::_empty,
                                     SymbolType::BuiltIn,
                                     std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                    StaticType::Get<EbtFloat, EbpUndefined, EvqOut, 2, 1>());
+                                    StaticType::Get<EbtFloat, EbpUndefined, EvqParamOut, 2, 1>());
 constexpr const TVariable kpt_o_10D(BuiltInId::pt_o_10D,
                                     BuiltInName::_empty,
                                     SymbolType::BuiltIn,
                                     std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                    StaticType::Get<EbtInt, EbpUndefined, EvqOut, 2, 1>());
+                                    StaticType::Get<EbtInt, EbpUndefined, EvqParamOut, 2, 1>());
 constexpr const TVariable kpt_o_10E(BuiltInId::pt_o_10E,
                                     BuiltInName::_empty,
                                     SymbolType::BuiltIn,
                                     std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                    StaticType::Get<EbtUInt, EbpUndefined, EvqOut, 2, 1>());
+                                    StaticType::Get<EbtUInt, EbpUndefined, EvqParamOut, 2, 1>());
 constexpr const TVariable kpt_o_20B(BuiltInId::pt_o_20B,
                                     BuiltInName::_empty,
                                     SymbolType::BuiltIn,
                                     std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                    StaticType::Get<EbtFloat, EbpUndefined, EvqOut, 3, 1>());
+                                    StaticType::Get<EbtFloat, EbpUndefined, EvqParamOut, 3, 1>());
 constexpr const TVariable kpt_o_20D(BuiltInId::pt_o_20D,
                                     BuiltInName::_empty,
                                     SymbolType::BuiltIn,
                                     std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                    StaticType::Get<EbtInt, EbpUndefined, EvqOut, 3, 1>());
+                                    StaticType::Get<EbtInt, EbpUndefined, EvqParamOut, 3, 1>());
 constexpr const TVariable kpt_o_20E(BuiltInId::pt_o_20E,
                                     BuiltInName::_empty,
                                     SymbolType::BuiltIn,
                                     std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                    StaticType::Get<EbtUInt, EbpUndefined, EvqOut, 3, 1>());
+                                    StaticType::Get<EbtUInt, EbpUndefined, EvqParamOut, 3, 1>());
 constexpr const TVariable kpt_o_30B(BuiltInId::pt_o_30B,
                                     BuiltInName::_empty,
                                     SymbolType::BuiltIn,
                                     std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                    StaticType::Get<EbtFloat, EbpUndefined, EvqOut, 4, 1>());
+                                    StaticType::Get<EbtFloat, EbpUndefined, EvqParamOut, 4, 1>());
 constexpr const TVariable kpt_o_30D(BuiltInId::pt_o_30D,
                                     BuiltInName::_empty,
                                     SymbolType::BuiltIn,
                                     std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                    StaticType::Get<EbtInt, EbpUndefined, EvqOut, 4, 1>());
+                                    StaticType::Get<EbtInt, EbpUndefined, EvqParamOut, 4, 1>());
 constexpr const TVariable kpt_o_30E(BuiltInId::pt_o_30E,
                                     BuiltInName::_empty,
                                     SymbolType::BuiltIn,
                                     std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                    StaticType::Get<EbtUInt, EbpUndefined, EvqOut, 4, 1>());
+                                    StaticType::Get<EbtUInt, EbpUndefined, EvqParamOut, 4, 1>());
 
 const TVariable *angle_BaseInstance()
 {
@@ -3144,6 +3205,11 @@
     return &kgl_FragCoord;
 }
 
+const TVariable *gl_FragCoord300()
+{
+    return &kgl_FragCoord300;
+}
+
 const TVariable *gl_FragDepth()
 {
     return &kgl_FragDepth;
@@ -3284,6 +3350,11 @@
     return &kgl_PointSize;
 }
 
+const TVariable *gl_PointSize300()
+{
+    return &kgl_PointSize300;
+}
+
 const TVariable *gl_Position()
 {
     return &kgl_Position;
@@ -3997,6 +4068,12 @@
                                                &BuiltInVariable::kpt00E, &BuiltInVariable::kpt00E};
 constexpr const TVariable *p01f00D30E[3]    = {&BuiltInVariable::kpt01f, &BuiltInVariable::kpt00D,
                                             &BuiltInVariable::kpt30E};
+constexpr const TVariable *p01g[1]          = {&BuiltInVariable::kpt01g};
+constexpr const TVariable *p01h[1]          = {&BuiltInVariable::kpt01h};
+constexpr const TVariable *p01i[1]          = {&BuiltInVariable::kpt01i};
+constexpr const TVariable *p01j00D[2]       = {&BuiltInVariable::kpt01j, &BuiltInVariable::kpt00D};
+constexpr const TVariable *p01k00D[2]       = {&BuiltInVariable::kpt01k, &BuiltInVariable::kpt00D};
+constexpr const TVariable *p01l00D[2]       = {&BuiltInVariable::kpt01l, &BuiltInVariable::kpt00D};
 constexpr const TVariable *p10B00B00B[3]    = {&BuiltInVariable::kpt10B, &BuiltInVariable::kpt00B,
                                             &BuiltInVariable::kpt00B};
 constexpr const TVariable *p10B00D[2]       = {&BuiltInVariable::kpt10B, &BuiltInVariable::kpt00D};
@@ -4143,7 +4220,7 @@
 constexpr const TFunction radians_00B(BuiltInId::radians_Float1,
                                       BuiltInName::radians,
                                       std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                      BuiltInParameters::p00B30B,
+                                      BuiltInParameters::p00B00B00B,
                                       1,
                                       StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 1, 1>(),
                                       EOpRadians,
@@ -4151,7 +4228,7 @@
 constexpr const TFunction radians_10B(BuiltInId::radians_Float2,
                                       BuiltInName::radians,
                                       std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                      BuiltInParameters::p10B00D,
+                                      BuiltInParameters::p10B00B00B,
                                       1,
                                       StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 2, 1>(),
                                       EOpRadians,
@@ -4159,7 +4236,7 @@
 constexpr const TFunction radians_20B(BuiltInId::radians_Float3,
                                       BuiltInName::radians,
                                       std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                      BuiltInParameters::p20B20B00B,
+                                      BuiltInParameters::p20B00B00B,
                                       1,
                                       StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 3, 1>(),
                                       EOpRadians,
@@ -4167,7 +4244,7 @@
 constexpr const TFunction radians_30B(BuiltInId::radians_Float4,
                                       BuiltInName::radians,
                                       std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                      BuiltInParameters::p30B10B,
+                                      BuiltInParameters::p30B00B00B,
                                       1,
                                       StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 4, 1>(),
                                       EOpRadians,
@@ -4175,7 +4252,7 @@
 constexpr const TFunction degrees_00B(BuiltInId::degrees_Float1,
                                       BuiltInName::degrees,
                                       std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                      BuiltInParameters::p00B30B,
+                                      BuiltInParameters::p00B00B00B,
                                       1,
                                       StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 1, 1>(),
                                       EOpDegrees,
@@ -4183,7 +4260,7 @@
 constexpr const TFunction degrees_10B(BuiltInId::degrees_Float2,
                                       BuiltInName::degrees,
                                       std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                      BuiltInParameters::p10B00D,
+                                      BuiltInParameters::p10B00B00B,
                                       1,
                                       StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 2, 1>(),
                                       EOpDegrees,
@@ -4191,7 +4268,7 @@
 constexpr const TFunction degrees_20B(BuiltInId::degrees_Float3,
                                       BuiltInName::degrees,
                                       std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                      BuiltInParameters::p20B20B00B,
+                                      BuiltInParameters::p20B00B00B,
                                       1,
                                       StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 3, 1>(),
                                       EOpDegrees,
@@ -4199,7 +4276,7 @@
 constexpr const TFunction degrees_30B(BuiltInId::degrees_Float4,
                                       BuiltInName::degrees,
                                       std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                      BuiltInParameters::p30B10B,
+                                      BuiltInParameters::p30B00B00B,
                                       1,
                                       StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 4, 1>(),
                                       EOpDegrees,
@@ -4207,7 +4284,7 @@
 constexpr const TFunction sin_00B(BuiltInId::sin_Float1,
                                   BuiltInName::sin,
                                   std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                  BuiltInParameters::p00B30B,
+                                  BuiltInParameters::p00B00B00B,
                                   1,
                                   StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 1, 1>(),
                                   EOpSin,
@@ -4215,7 +4292,7 @@
 constexpr const TFunction sin_10B(BuiltInId::sin_Float2,
                                   BuiltInName::sin,
                                   std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                  BuiltInParameters::p10B00D,
+                                  BuiltInParameters::p10B00B00B,
                                   1,
                                   StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 2, 1>(),
                                   EOpSin,
@@ -4223,7 +4300,7 @@
 constexpr const TFunction sin_20B(BuiltInId::sin_Float3,
                                   BuiltInName::sin,
                                   std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                  BuiltInParameters::p20B20B00B,
+                                  BuiltInParameters::p20B00B00B,
                                   1,
                                   StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 3, 1>(),
                                   EOpSin,
@@ -4231,7 +4308,7 @@
 constexpr const TFunction sin_30B(BuiltInId::sin_Float4,
                                   BuiltInName::sin,
                                   std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                  BuiltInParameters::p30B10B,
+                                  BuiltInParameters::p30B00B00B,
                                   1,
                                   StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 4, 1>(),
                                   EOpSin,
@@ -4239,7 +4316,7 @@
 constexpr const TFunction cos_00B(BuiltInId::cos_Float1,
                                   BuiltInName::cos,
                                   std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                  BuiltInParameters::p00B30B,
+                                  BuiltInParameters::p00B00B00B,
                                   1,
                                   StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 1, 1>(),
                                   EOpCos,
@@ -4247,7 +4324,7 @@
 constexpr const TFunction cos_10B(BuiltInId::cos_Float2,
                                   BuiltInName::cos,
                                   std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                  BuiltInParameters::p10B00D,
+                                  BuiltInParameters::p10B00B00B,
                                   1,
                                   StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 2, 1>(),
                                   EOpCos,
@@ -4255,7 +4332,7 @@
 constexpr const TFunction cos_20B(BuiltInId::cos_Float3,
                                   BuiltInName::cos,
                                   std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                  BuiltInParameters::p20B20B00B,
+                                  BuiltInParameters::p20B00B00B,
                                   1,
                                   StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 3, 1>(),
                                   EOpCos,
@@ -4263,7 +4340,7 @@
 constexpr const TFunction cos_30B(BuiltInId::cos_Float4,
                                   BuiltInName::cos,
                                   std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                  BuiltInParameters::p30B10B,
+                                  BuiltInParameters::p30B00B00B,
                                   1,
                                   StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 4, 1>(),
                                   EOpCos,
@@ -4271,7 +4348,7 @@
 constexpr const TFunction tan_00B(BuiltInId::tan_Float1,
                                   BuiltInName::tan,
                                   std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                  BuiltInParameters::p00B30B,
+                                  BuiltInParameters::p00B00B00B,
                                   1,
                                   StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 1, 1>(),
                                   EOpTan,
@@ -4279,7 +4356,7 @@
 constexpr const TFunction tan_10B(BuiltInId::tan_Float2,
                                   BuiltInName::tan,
                                   std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                  BuiltInParameters::p10B00D,
+                                  BuiltInParameters::p10B00B00B,
                                   1,
                                   StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 2, 1>(),
                                   EOpTan,
@@ -4287,7 +4364,7 @@
 constexpr const TFunction tan_20B(BuiltInId::tan_Float3,
                                   BuiltInName::tan,
                                   std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                  BuiltInParameters::p20B20B00B,
+                                  BuiltInParameters::p20B00B00B,
                                   1,
                                   StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 3, 1>(),
                                   EOpTan,
@@ -4295,7 +4372,7 @@
 constexpr const TFunction tan_30B(BuiltInId::tan_Float4,
                                   BuiltInName::tan,
                                   std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                  BuiltInParameters::p30B10B,
+                                  BuiltInParameters::p30B00B00B,
                                   1,
                                   StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 4, 1>(),
                                   EOpTan,
@@ -4303,7 +4380,7 @@
 constexpr const TFunction asin_00B(BuiltInId::asin_Float1,
                                    BuiltInName::asin,
                                    std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                   BuiltInParameters::p00B30B,
+                                   BuiltInParameters::p00B00B00B,
                                    1,
                                    StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 1, 1>(),
                                    EOpAsin,
@@ -4311,7 +4388,7 @@
 constexpr const TFunction asin_10B(BuiltInId::asin_Float2,
                                    BuiltInName::asin,
                                    std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                   BuiltInParameters::p10B00D,
+                                   BuiltInParameters::p10B00B00B,
                                    1,
                                    StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 2, 1>(),
                                    EOpAsin,
@@ -4319,7 +4396,7 @@
 constexpr const TFunction asin_20B(BuiltInId::asin_Float3,
                                    BuiltInName::asin,
                                    std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                   BuiltInParameters::p20B20B00B,
+                                   BuiltInParameters::p20B00B00B,
                                    1,
                                    StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 3, 1>(),
                                    EOpAsin,
@@ -4327,7 +4404,7 @@
 constexpr const TFunction asin_30B(BuiltInId::asin_Float4,
                                    BuiltInName::asin,
                                    std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                   BuiltInParameters::p30B10B,
+                                   BuiltInParameters::p30B00B00B,
                                    1,
                                    StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 4, 1>(),
                                    EOpAsin,
@@ -4335,7 +4412,7 @@
 constexpr const TFunction acos_00B(BuiltInId::acos_Float1,
                                    BuiltInName::acos,
                                    std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                   BuiltInParameters::p00B30B,
+                                   BuiltInParameters::p00B00B00B,
                                    1,
                                    StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 1, 1>(),
                                    EOpAcos,
@@ -4343,7 +4420,7 @@
 constexpr const TFunction acos_10B(BuiltInId::acos_Float2,
                                    BuiltInName::acos,
                                    std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                   BuiltInParameters::p10B00D,
+                                   BuiltInParameters::p10B00B00B,
                                    1,
                                    StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 2, 1>(),
                                    EOpAcos,
@@ -4351,7 +4428,7 @@
 constexpr const TFunction acos_20B(BuiltInId::acos_Float3,
                                    BuiltInName::acos,
                                    std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                   BuiltInParameters::p20B20B00B,
+                                   BuiltInParameters::p20B00B00B,
                                    1,
                                    StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 3, 1>(),
                                    EOpAcos,
@@ -4359,7 +4436,7 @@
 constexpr const TFunction acos_30B(BuiltInId::acos_Float4,
                                    BuiltInName::acos,
                                    std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                   BuiltInParameters::p30B10B,
+                                   BuiltInParameters::p30B00B00B,
                                    1,
                                    StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 4, 1>(),
                                    EOpAcos,
@@ -4367,7 +4444,7 @@
 constexpr const TFunction atan_00B00B(BuiltInId::atan_Float1_Float1,
                                       BuiltInName::atan,
                                       std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                      BuiltInParameters::p00B00B20B,
+                                      BuiltInParameters::p00B00B00B,
                                       2,
                                       StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 1, 1>(),
                                       EOpAtan,
@@ -4399,7 +4476,7 @@
 constexpr const TFunction atan_00B(BuiltInId::atan_Float1,
                                    BuiltInName::atan,
                                    std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                   BuiltInParameters::p00B30B,
+                                   BuiltInParameters::p00B00B00B,
                                    1,
                                    StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 1, 1>(),
                                    EOpAtan,
@@ -4407,7 +4484,7 @@
 constexpr const TFunction atan_10B(BuiltInId::atan_Float2,
                                    BuiltInName::atan,
                                    std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                   BuiltInParameters::p10B00D,
+                                   BuiltInParameters::p10B00B00B,
                                    1,
                                    StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 2, 1>(),
                                    EOpAtan,
@@ -4415,7 +4492,7 @@
 constexpr const TFunction atan_20B(BuiltInId::atan_Float3,
                                    BuiltInName::atan,
                                    std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                   BuiltInParameters::p20B20B00B,
+                                   BuiltInParameters::p20B00B00B,
                                    1,
                                    StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 3, 1>(),
                                    EOpAtan,
@@ -4423,7 +4500,7 @@
 constexpr const TFunction atan_30B(BuiltInId::atan_Float4,
                                    BuiltInName::atan,
                                    std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                   BuiltInParameters::p30B10B,
+                                   BuiltInParameters::p30B00B00B,
                                    1,
                                    StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 4, 1>(),
                                    EOpAtan,
@@ -4431,7 +4508,7 @@
 constexpr const TFunction sinh_00B(BuiltInId::sinh_Float1,
                                    BuiltInName::sinh,
                                    std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                   BuiltInParameters::p00B30B,
+                                   BuiltInParameters::p00B00B00B,
                                    1,
                                    StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 1, 1>(),
                                    EOpSinh,
@@ -4439,7 +4516,7 @@
 constexpr const TFunction sinh_10B(BuiltInId::sinh_Float2,
                                    BuiltInName::sinh,
                                    std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                   BuiltInParameters::p10B00D,
+                                   BuiltInParameters::p10B00B00B,
                                    1,
                                    StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 2, 1>(),
                                    EOpSinh,
@@ -4447,7 +4524,7 @@
 constexpr const TFunction sinh_20B(BuiltInId::sinh_Float3,
                                    BuiltInName::sinh,
                                    std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                   BuiltInParameters::p20B20B00B,
+                                   BuiltInParameters::p20B00B00B,
                                    1,
                                    StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 3, 1>(),
                                    EOpSinh,
@@ -4455,7 +4532,7 @@
 constexpr const TFunction sinh_30B(BuiltInId::sinh_Float4,
                                    BuiltInName::sinh,
                                    std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                   BuiltInParameters::p30B10B,
+                                   BuiltInParameters::p30B00B00B,
                                    1,
                                    StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 4, 1>(),
                                    EOpSinh,
@@ -4463,7 +4540,7 @@
 constexpr const TFunction cosh_00B(BuiltInId::cosh_Float1,
                                    BuiltInName::cosh,
                                    std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                   BuiltInParameters::p00B30B,
+                                   BuiltInParameters::p00B00B00B,
                                    1,
                                    StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 1, 1>(),
                                    EOpCosh,
@@ -4471,7 +4548,7 @@
 constexpr const TFunction cosh_10B(BuiltInId::cosh_Float2,
                                    BuiltInName::cosh,
                                    std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                   BuiltInParameters::p10B00D,
+                                   BuiltInParameters::p10B00B00B,
                                    1,
                                    StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 2, 1>(),
                                    EOpCosh,
@@ -4479,7 +4556,7 @@
 constexpr const TFunction cosh_20B(BuiltInId::cosh_Float3,
                                    BuiltInName::cosh,
                                    std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                   BuiltInParameters::p20B20B00B,
+                                   BuiltInParameters::p20B00B00B,
                                    1,
                                    StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 3, 1>(),
                                    EOpCosh,
@@ -4487,7 +4564,7 @@
 constexpr const TFunction cosh_30B(BuiltInId::cosh_Float4,
                                    BuiltInName::cosh,
                                    std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                   BuiltInParameters::p30B10B,
+                                   BuiltInParameters::p30B00B00B,
                                    1,
                                    StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 4, 1>(),
                                    EOpCosh,
@@ -4495,7 +4572,7 @@
 constexpr const TFunction tanh_00B(BuiltInId::tanh_Float1,
                                    BuiltInName::tanh,
                                    std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                   BuiltInParameters::p00B30B,
+                                   BuiltInParameters::p00B00B00B,
                                    1,
                                    StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 1, 1>(),
                                    EOpTanh,
@@ -4503,7 +4580,7 @@
 constexpr const TFunction tanh_10B(BuiltInId::tanh_Float2,
                                    BuiltInName::tanh,
                                    std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                   BuiltInParameters::p10B00D,
+                                   BuiltInParameters::p10B00B00B,
                                    1,
                                    StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 2, 1>(),
                                    EOpTanh,
@@ -4511,7 +4588,7 @@
 constexpr const TFunction tanh_20B(BuiltInId::tanh_Float3,
                                    BuiltInName::tanh,
                                    std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                   BuiltInParameters::p20B20B00B,
+                                   BuiltInParameters::p20B00B00B,
                                    1,
                                    StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 3, 1>(),
                                    EOpTanh,
@@ -4519,7 +4596,7 @@
 constexpr const TFunction tanh_30B(BuiltInId::tanh_Float4,
                                    BuiltInName::tanh,
                                    std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                   BuiltInParameters::p30B10B,
+                                   BuiltInParameters::p30B00B00B,
                                    1,
                                    StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 4, 1>(),
                                    EOpTanh,
@@ -4527,7 +4604,7 @@
 constexpr const TFunction asinh_00B(BuiltInId::asinh_Float1,
                                     BuiltInName::asinh,
                                     std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                    BuiltInParameters::p00B30B,
+                                    BuiltInParameters::p00B00B00B,
                                     1,
                                     StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 1, 1>(),
                                     EOpAsinh,
@@ -4535,7 +4612,7 @@
 constexpr const TFunction asinh_10B(BuiltInId::asinh_Float2,
                                     BuiltInName::asinh,
                                     std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                    BuiltInParameters::p10B00D,
+                                    BuiltInParameters::p10B00B00B,
                                     1,
                                     StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 2, 1>(),
                                     EOpAsinh,
@@ -4543,7 +4620,7 @@
 constexpr const TFunction asinh_20B(BuiltInId::asinh_Float3,
                                     BuiltInName::asinh,
                                     std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                    BuiltInParameters::p20B20B00B,
+                                    BuiltInParameters::p20B00B00B,
                                     1,
                                     StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 3, 1>(),
                                     EOpAsinh,
@@ -4551,7 +4628,7 @@
 constexpr const TFunction asinh_30B(BuiltInId::asinh_Float4,
                                     BuiltInName::asinh,
                                     std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                    BuiltInParameters::p30B10B,
+                                    BuiltInParameters::p30B00B00B,
                                     1,
                                     StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 4, 1>(),
                                     EOpAsinh,
@@ -4559,7 +4636,7 @@
 constexpr const TFunction acosh_00B(BuiltInId::acosh_Float1,
                                     BuiltInName::acosh,
                                     std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                    BuiltInParameters::p00B30B,
+                                    BuiltInParameters::p00B00B00B,
                                     1,
                                     StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 1, 1>(),
                                     EOpAcosh,
@@ -4567,7 +4644,7 @@
 constexpr const TFunction acosh_10B(BuiltInId::acosh_Float2,
                                     BuiltInName::acosh,
                                     std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                    BuiltInParameters::p10B00D,
+                                    BuiltInParameters::p10B00B00B,
                                     1,
                                     StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 2, 1>(),
                                     EOpAcosh,
@@ -4575,7 +4652,7 @@
 constexpr const TFunction acosh_20B(BuiltInId::acosh_Float3,
                                     BuiltInName::acosh,
                                     std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                    BuiltInParameters::p20B20B00B,
+                                    BuiltInParameters::p20B00B00B,
                                     1,
                                     StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 3, 1>(),
                                     EOpAcosh,
@@ -4583,7 +4660,7 @@
 constexpr const TFunction acosh_30B(BuiltInId::acosh_Float4,
                                     BuiltInName::acosh,
                                     std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                    BuiltInParameters::p30B10B,
+                                    BuiltInParameters::p30B00B00B,
                                     1,
                                     StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 4, 1>(),
                                     EOpAcosh,
@@ -4591,7 +4668,7 @@
 constexpr const TFunction atanh_00B(BuiltInId::atanh_Float1,
                                     BuiltInName::atanh,
                                     std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                    BuiltInParameters::p00B30B,
+                                    BuiltInParameters::p00B00B00B,
                                     1,
                                     StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 1, 1>(),
                                     EOpAtanh,
@@ -4599,7 +4676,7 @@
 constexpr const TFunction atanh_10B(BuiltInId::atanh_Float2,
                                     BuiltInName::atanh,
                                     std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                    BuiltInParameters::p10B00D,
+                                    BuiltInParameters::p10B00B00B,
                                     1,
                                     StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 2, 1>(),
                                     EOpAtanh,
@@ -4607,7 +4684,7 @@
 constexpr const TFunction atanh_20B(BuiltInId::atanh_Float3,
                                     BuiltInName::atanh,
                                     std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                    BuiltInParameters::p20B20B00B,
+                                    BuiltInParameters::p20B00B00B,
                                     1,
                                     StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 3, 1>(),
                                     EOpAtanh,
@@ -4615,7 +4692,7 @@
 constexpr const TFunction atanh_30B(BuiltInId::atanh_Float4,
                                     BuiltInName::atanh,
                                     std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                    BuiltInParameters::p30B10B,
+                                    BuiltInParameters::p30B00B00B,
                                     1,
                                     StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 4, 1>(),
                                     EOpAtanh,
@@ -4623,7 +4700,7 @@
 constexpr const TFunction pow_00B00B(BuiltInId::pow_Float1_Float1,
                                      BuiltInName::pow,
                                      std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                     BuiltInParameters::p00B00B20B,
+                                     BuiltInParameters::p00B00B00B,
                                      2,
                                      StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 1, 1>(),
                                      EOpPow,
@@ -4655,7 +4732,7 @@
 constexpr const TFunction exp_00B(BuiltInId::exp_Float1,
                                   BuiltInName::exp,
                                   std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                  BuiltInParameters::p00B30B,
+                                  BuiltInParameters::p00B00B00B,
                                   1,
                                   StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 1, 1>(),
                                   EOpExp,
@@ -4663,7 +4740,7 @@
 constexpr const TFunction exp_10B(BuiltInId::exp_Float2,
                                   BuiltInName::exp,
                                   std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                  BuiltInParameters::p10B00D,
+                                  BuiltInParameters::p10B00B00B,
                                   1,
                                   StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 2, 1>(),
                                   EOpExp,
@@ -4671,7 +4748,7 @@
 constexpr const TFunction exp_20B(BuiltInId::exp_Float3,
                                   BuiltInName::exp,
                                   std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                  BuiltInParameters::p20B20B00B,
+                                  BuiltInParameters::p20B00B00B,
                                   1,
                                   StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 3, 1>(),
                                   EOpExp,
@@ -4679,7 +4756,7 @@
 constexpr const TFunction exp_30B(BuiltInId::exp_Float4,
                                   BuiltInName::exp,
                                   std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                  BuiltInParameters::p30B10B,
+                                  BuiltInParameters::p30B00B00B,
                                   1,
                                   StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 4, 1>(),
                                   EOpExp,
@@ -4687,7 +4764,7 @@
 constexpr const TFunction log_00B(BuiltInId::log_Float1,
                                   BuiltInName::log,
                                   std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                  BuiltInParameters::p00B30B,
+                                  BuiltInParameters::p00B00B00B,
                                   1,
                                   StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 1, 1>(),
                                   EOpLog,
@@ -4695,7 +4772,7 @@
 constexpr const TFunction log_10B(BuiltInId::log_Float2,
                                   BuiltInName::log,
                                   std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                  BuiltInParameters::p10B00D,
+                                  BuiltInParameters::p10B00B00B,
                                   1,
                                   StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 2, 1>(),
                                   EOpLog,
@@ -4703,7 +4780,7 @@
 constexpr const TFunction log_20B(BuiltInId::log_Float3,
                                   BuiltInName::log,
                                   std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                  BuiltInParameters::p20B20B00B,
+                                  BuiltInParameters::p20B00B00B,
                                   1,
                                   StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 3, 1>(),
                                   EOpLog,
@@ -4711,7 +4788,7 @@
 constexpr const TFunction log_30B(BuiltInId::log_Float4,
                                   BuiltInName::log,
                                   std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                  BuiltInParameters::p30B10B,
+                                  BuiltInParameters::p30B00B00B,
                                   1,
                                   StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 4, 1>(),
                                   EOpLog,
@@ -4719,7 +4796,7 @@
 constexpr const TFunction exp2_00B(BuiltInId::exp2_Float1,
                                    BuiltInName::exp2,
                                    std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                   BuiltInParameters::p00B30B,
+                                   BuiltInParameters::p00B00B00B,
                                    1,
                                    StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 1, 1>(),
                                    EOpExp2,
@@ -4727,7 +4804,7 @@
 constexpr const TFunction exp2_10B(BuiltInId::exp2_Float2,
                                    BuiltInName::exp2,
                                    std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                   BuiltInParameters::p10B00D,
+                                   BuiltInParameters::p10B00B00B,
                                    1,
                                    StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 2, 1>(),
                                    EOpExp2,
@@ -4735,7 +4812,7 @@
 constexpr const TFunction exp2_20B(BuiltInId::exp2_Float3,
                                    BuiltInName::exp2,
                                    std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                   BuiltInParameters::p20B20B00B,
+                                   BuiltInParameters::p20B00B00B,
                                    1,
                                    StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 3, 1>(),
                                    EOpExp2,
@@ -4743,7 +4820,7 @@
 constexpr const TFunction exp2_30B(BuiltInId::exp2_Float4,
                                    BuiltInName::exp2,
                                    std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                   BuiltInParameters::p30B10B,
+                                   BuiltInParameters::p30B00B00B,
                                    1,
                                    StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 4, 1>(),
                                    EOpExp2,
@@ -4751,7 +4828,7 @@
 constexpr const TFunction log2_00B(BuiltInId::log2_Float1,
                                    BuiltInName::log2,
                                    std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                   BuiltInParameters::p00B30B,
+                                   BuiltInParameters::p00B00B00B,
                                    1,
                                    StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 1, 1>(),
                                    EOpLog2,
@@ -4759,7 +4836,7 @@
 constexpr const TFunction log2_10B(BuiltInId::log2_Float2,
                                    BuiltInName::log2,
                                    std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                   BuiltInParameters::p10B00D,
+                                   BuiltInParameters::p10B00B00B,
                                    1,
                                    StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 2, 1>(),
                                    EOpLog2,
@@ -4767,7 +4844,7 @@
 constexpr const TFunction log2_20B(BuiltInId::log2_Float3,
                                    BuiltInName::log2,
                                    std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                   BuiltInParameters::p20B20B00B,
+                                   BuiltInParameters::p20B00B00B,
                                    1,
                                    StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 3, 1>(),
                                    EOpLog2,
@@ -4775,7 +4852,7 @@
 constexpr const TFunction log2_30B(BuiltInId::log2_Float4,
                                    BuiltInName::log2,
                                    std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                   BuiltInParameters::p30B10B,
+                                   BuiltInParameters::p30B00B00B,
                                    1,
                                    StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 4, 1>(),
                                    EOpLog2,
@@ -4783,7 +4860,7 @@
 constexpr const TFunction sqrt_00B(BuiltInId::sqrt_Float1,
                                    BuiltInName::sqrt,
                                    std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                   BuiltInParameters::p00B30B,
+                                   BuiltInParameters::p00B00B00B,
                                    1,
                                    StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 1, 1>(),
                                    EOpSqrt,
@@ -4791,7 +4868,7 @@
 constexpr const TFunction sqrt_10B(BuiltInId::sqrt_Float2,
                                    BuiltInName::sqrt,
                                    std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                   BuiltInParameters::p10B00D,
+                                   BuiltInParameters::p10B00B00B,
                                    1,
                                    StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 2, 1>(),
                                    EOpSqrt,
@@ -4799,7 +4876,7 @@
 constexpr const TFunction sqrt_20B(BuiltInId::sqrt_Float3,
                                    BuiltInName::sqrt,
                                    std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                   BuiltInParameters::p20B20B00B,
+                                   BuiltInParameters::p20B00B00B,
                                    1,
                                    StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 3, 1>(),
                                    EOpSqrt,
@@ -4807,7 +4884,7 @@
 constexpr const TFunction sqrt_30B(BuiltInId::sqrt_Float4,
                                    BuiltInName::sqrt,
                                    std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                   BuiltInParameters::p30B10B,
+                                   BuiltInParameters::p30B00B00B,
                                    1,
                                    StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 4, 1>(),
                                    EOpSqrt,
@@ -4816,7 +4893,7 @@
     BuiltInId::inversesqrt_Float1,
     BuiltInName::inversesqrt,
     std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-    BuiltInParameters::p00B30B,
+    BuiltInParameters::p00B00B00B,
     1,
     StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 1, 1>(),
     EOpInversesqrt,
@@ -4825,7 +4902,7 @@
     BuiltInId::inversesqrt_Float2,
     BuiltInName::inversesqrt,
     std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-    BuiltInParameters::p10B00D,
+    BuiltInParameters::p10B00B00B,
     1,
     StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 2, 1>(),
     EOpInversesqrt,
@@ -4834,7 +4911,7 @@
     BuiltInId::inversesqrt_Float3,
     BuiltInName::inversesqrt,
     std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-    BuiltInParameters::p20B20B00B,
+    BuiltInParameters::p20B00B00B,
     1,
     StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 3, 1>(),
     EOpInversesqrt,
@@ -4843,7 +4920,7 @@
     BuiltInId::inversesqrt_Float4,
     BuiltInName::inversesqrt,
     std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-    BuiltInParameters::p30B10B,
+    BuiltInParameters::p30B00B00B,
     1,
     StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 4, 1>(),
     EOpInversesqrt,
@@ -4851,7 +4928,7 @@
 constexpr const TFunction abs_00B(BuiltInId::abs_Float1,
                                   BuiltInName::abs,
                                   std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                  BuiltInParameters::p00B30B,
+                                  BuiltInParameters::p00B00B00B,
                                   1,
                                   StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 1, 1>(),
                                   EOpAbs,
@@ -4859,7 +4936,7 @@
 constexpr const TFunction abs_10B(BuiltInId::abs_Float2,
                                   BuiltInName::abs,
                                   std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                  BuiltInParameters::p10B00D,
+                                  BuiltInParameters::p10B00B00B,
                                   1,
                                   StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 2, 1>(),
                                   EOpAbs,
@@ -4867,7 +4944,7 @@
 constexpr const TFunction abs_20B(BuiltInId::abs_Float3,
                                   BuiltInName::abs,
                                   std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                  BuiltInParameters::p20B20B00B,
+                                  BuiltInParameters::p20B00B00B,
                                   1,
                                   StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 3, 1>(),
                                   EOpAbs,
@@ -4875,7 +4952,7 @@
 constexpr const TFunction abs_30B(BuiltInId::abs_Float4,
                                   BuiltInName::abs,
                                   std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                  BuiltInParameters::p30B10B,
+                                  BuiltInParameters::p30B00B00B,
                                   1,
                                   StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 4, 1>(),
                                   EOpAbs,
@@ -4883,7 +4960,7 @@
 constexpr const TFunction abs_00D(BuiltInId::abs_Int1,
                                   BuiltInName::abs,
                                   std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                  BuiltInParameters::p00D00D00F,
+                                  BuiltInParameters::p00D00D00D00D,
                                   1,
                                   StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 1, 1>(),
                                   EOpAbs,
@@ -4891,7 +4968,7 @@
 constexpr const TFunction abs_10D(BuiltInId::abs_Int2,
                                   BuiltInName::abs,
                                   std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                  BuiltInParameters::p10D10D00D00D,
+                                  BuiltInParameters::p10D00D00D,
                                   1,
                                   StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 2, 1>(),
                                   EOpAbs,
@@ -4899,7 +4976,7 @@
 constexpr const TFunction abs_20D(BuiltInId::abs_Int3,
                                   BuiltInName::abs,
                                   std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                  BuiltInParameters::p20D20D20F,
+                                  BuiltInParameters::p20D00D00D,
                                   1,
                                   StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 3, 1>(),
                                   EOpAbs,
@@ -4907,7 +4984,7 @@
 constexpr const TFunction abs_30D(BuiltInId::abs_Int4,
                                   BuiltInName::abs,
                                   std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                  BuiltInParameters::p30D30D30F,
+                                  BuiltInParameters::p30D00D00D,
                                   1,
                                   StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 4, 1>(),
                                   EOpAbs,
@@ -4915,7 +4992,7 @@
 constexpr const TFunction sign_00B(BuiltInId::sign_Float1,
                                    BuiltInName::sign,
                                    std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                   BuiltInParameters::p00B30B,
+                                   BuiltInParameters::p00B00B00B,
                                    1,
                                    StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 1, 1>(),
                                    EOpSign,
@@ -4923,7 +5000,7 @@
 constexpr const TFunction sign_10B(BuiltInId::sign_Float2,
                                    BuiltInName::sign,
                                    std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                   BuiltInParameters::p10B00D,
+                                   BuiltInParameters::p10B00B00B,
                                    1,
                                    StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 2, 1>(),
                                    EOpSign,
@@ -4931,7 +5008,7 @@
 constexpr const TFunction sign_20B(BuiltInId::sign_Float3,
                                    BuiltInName::sign,
                                    std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                   BuiltInParameters::p20B20B00B,
+                                   BuiltInParameters::p20B00B00B,
                                    1,
                                    StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 3, 1>(),
                                    EOpSign,
@@ -4939,7 +5016,7 @@
 constexpr const TFunction sign_30B(BuiltInId::sign_Float4,
                                    BuiltInName::sign,
                                    std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                   BuiltInParameters::p30B10B,
+                                   BuiltInParameters::p30B00B00B,
                                    1,
                                    StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 4, 1>(),
                                    EOpSign,
@@ -4947,7 +5024,7 @@
 constexpr const TFunction sign_00D(BuiltInId::sign_Int1,
                                    BuiltInName::sign,
                                    std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                   BuiltInParameters::p00D00D00F,
+                                   BuiltInParameters::p00D00D00D00D,
                                    1,
                                    StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 1, 1>(),
                                    EOpSign,
@@ -4955,7 +5032,7 @@
 constexpr const TFunction sign_10D(BuiltInId::sign_Int2,
                                    BuiltInName::sign,
                                    std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                   BuiltInParameters::p10D10D00D00D,
+                                   BuiltInParameters::p10D00D00D,
                                    1,
                                    StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 2, 1>(),
                                    EOpSign,
@@ -4963,7 +5040,7 @@
 constexpr const TFunction sign_20D(BuiltInId::sign_Int3,
                                    BuiltInName::sign,
                                    std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                   BuiltInParameters::p20D20D20F,
+                                   BuiltInParameters::p20D00D00D,
                                    1,
                                    StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 3, 1>(),
                                    EOpSign,
@@ -4971,7 +5048,7 @@
 constexpr const TFunction sign_30D(BuiltInId::sign_Int4,
                                    BuiltInName::sign,
                                    std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                   BuiltInParameters::p30D30D30F,
+                                   BuiltInParameters::p30D00D00D,
                                    1,
                                    StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 4, 1>(),
                                    EOpSign,
@@ -4979,7 +5056,7 @@
 constexpr const TFunction floor_00B(BuiltInId::floor_Float1,
                                     BuiltInName::floor,
                                     std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                    BuiltInParameters::p00B30B,
+                                    BuiltInParameters::p00B00B00B,
                                     1,
                                     StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 1, 1>(),
                                     EOpFloor,
@@ -4987,7 +5064,7 @@
 constexpr const TFunction floor_10B(BuiltInId::floor_Float2,
                                     BuiltInName::floor,
                                     std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                    BuiltInParameters::p10B00D,
+                                    BuiltInParameters::p10B00B00B,
                                     1,
                                     StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 2, 1>(),
                                     EOpFloor,
@@ -4995,7 +5072,7 @@
 constexpr const TFunction floor_20B(BuiltInId::floor_Float3,
                                     BuiltInName::floor,
                                     std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                    BuiltInParameters::p20B20B00B,
+                                    BuiltInParameters::p20B00B00B,
                                     1,
                                     StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 3, 1>(),
                                     EOpFloor,
@@ -5003,7 +5080,7 @@
 constexpr const TFunction floor_30B(BuiltInId::floor_Float4,
                                     BuiltInName::floor,
                                     std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                    BuiltInParameters::p30B10B,
+                                    BuiltInParameters::p30B00B00B,
                                     1,
                                     StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 4, 1>(),
                                     EOpFloor,
@@ -5011,7 +5088,7 @@
 constexpr const TFunction trunc_00B(BuiltInId::trunc_Float1,
                                     BuiltInName::trunc,
                                     std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                    BuiltInParameters::p00B30B,
+                                    BuiltInParameters::p00B00B00B,
                                     1,
                                     StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 1, 1>(),
                                     EOpTrunc,
@@ -5019,7 +5096,7 @@
 constexpr const TFunction trunc_10B(BuiltInId::trunc_Float2,
                                     BuiltInName::trunc,
                                     std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                    BuiltInParameters::p10B00D,
+                                    BuiltInParameters::p10B00B00B,
                                     1,
                                     StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 2, 1>(),
                                     EOpTrunc,
@@ -5027,7 +5104,7 @@
 constexpr const TFunction trunc_20B(BuiltInId::trunc_Float3,
                                     BuiltInName::trunc,
                                     std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                    BuiltInParameters::p20B20B00B,
+                                    BuiltInParameters::p20B00B00B,
                                     1,
                                     StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 3, 1>(),
                                     EOpTrunc,
@@ -5035,7 +5112,7 @@
 constexpr const TFunction trunc_30B(BuiltInId::trunc_Float4,
                                     BuiltInName::trunc,
                                     std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                    BuiltInParameters::p30B10B,
+                                    BuiltInParameters::p30B00B00B,
                                     1,
                                     StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 4, 1>(),
                                     EOpTrunc,
@@ -5043,7 +5120,7 @@
 constexpr const TFunction round_00B(BuiltInId::round_Float1,
                                     BuiltInName::round,
                                     std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                    BuiltInParameters::p00B30B,
+                                    BuiltInParameters::p00B00B00B,
                                     1,
                                     StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 1, 1>(),
                                     EOpRound,
@@ -5051,7 +5128,7 @@
 constexpr const TFunction round_10B(BuiltInId::round_Float2,
                                     BuiltInName::round,
                                     std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                    BuiltInParameters::p10B00D,
+                                    BuiltInParameters::p10B00B00B,
                                     1,
                                     StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 2, 1>(),
                                     EOpRound,
@@ -5059,7 +5136,7 @@
 constexpr const TFunction round_20B(BuiltInId::round_Float3,
                                     BuiltInName::round,
                                     std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                    BuiltInParameters::p20B20B00B,
+                                    BuiltInParameters::p20B00B00B,
                                     1,
                                     StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 3, 1>(),
                                     EOpRound,
@@ -5067,7 +5144,7 @@
 constexpr const TFunction round_30B(BuiltInId::round_Float4,
                                     BuiltInName::round,
                                     std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                    BuiltInParameters::p30B10B,
+                                    BuiltInParameters::p30B00B00B,
                                     1,
                                     StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 4, 1>(),
                                     EOpRound,
@@ -5075,7 +5152,7 @@
 constexpr const TFunction roundEven_00B(BuiltInId::roundEven_Float1,
                                         BuiltInName::roundEven,
                                         std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                        BuiltInParameters::p00B30B,
+                                        BuiltInParameters::p00B00B00B,
                                         1,
                                         StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 1, 1>(),
                                         EOpRoundEven,
@@ -5083,7 +5160,7 @@
 constexpr const TFunction roundEven_10B(BuiltInId::roundEven_Float2,
                                         BuiltInName::roundEven,
                                         std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                        BuiltInParameters::p10B00D,
+                                        BuiltInParameters::p10B00B00B,
                                         1,
                                         StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 2, 1>(),
                                         EOpRoundEven,
@@ -5091,7 +5168,7 @@
 constexpr const TFunction roundEven_20B(BuiltInId::roundEven_Float3,
                                         BuiltInName::roundEven,
                                         std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                        BuiltInParameters::p20B20B00B,
+                                        BuiltInParameters::p20B00B00B,
                                         1,
                                         StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 3, 1>(),
                                         EOpRoundEven,
@@ -5099,7 +5176,7 @@
 constexpr const TFunction roundEven_30B(BuiltInId::roundEven_Float4,
                                         BuiltInName::roundEven,
                                         std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                        BuiltInParameters::p30B10B,
+                                        BuiltInParameters::p30B00B00B,
                                         1,
                                         StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 4, 1>(),
                                         EOpRoundEven,
@@ -5107,7 +5184,7 @@
 constexpr const TFunction ceil_00B(BuiltInId::ceil_Float1,
                                    BuiltInName::ceil,
                                    std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                   BuiltInParameters::p00B30B,
+                                   BuiltInParameters::p00B00B00B,
                                    1,
                                    StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 1, 1>(),
                                    EOpCeil,
@@ -5115,7 +5192,7 @@
 constexpr const TFunction ceil_10B(BuiltInId::ceil_Float2,
                                    BuiltInName::ceil,
                                    std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                   BuiltInParameters::p10B00D,
+                                   BuiltInParameters::p10B00B00B,
                                    1,
                                    StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 2, 1>(),
                                    EOpCeil,
@@ -5123,7 +5200,7 @@
 constexpr const TFunction ceil_20B(BuiltInId::ceil_Float3,
                                    BuiltInName::ceil,
                                    std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                   BuiltInParameters::p20B20B00B,
+                                   BuiltInParameters::p20B00B00B,
                                    1,
                                    StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 3, 1>(),
                                    EOpCeil,
@@ -5131,7 +5208,7 @@
 constexpr const TFunction ceil_30B(BuiltInId::ceil_Float4,
                                    BuiltInName::ceil,
                                    std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                   BuiltInParameters::p30B10B,
+                                   BuiltInParameters::p30B00B00B,
                                    1,
                                    StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 4, 1>(),
                                    EOpCeil,
@@ -5139,7 +5216,7 @@
 constexpr const TFunction fract_00B(BuiltInId::fract_Float1,
                                     BuiltInName::fract,
                                     std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                    BuiltInParameters::p00B30B,
+                                    BuiltInParameters::p00B00B00B,
                                     1,
                                     StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 1, 1>(),
                                     EOpFract,
@@ -5147,7 +5224,7 @@
 constexpr const TFunction fract_10B(BuiltInId::fract_Float2,
                                     BuiltInName::fract,
                                     std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                    BuiltInParameters::p10B00D,
+                                    BuiltInParameters::p10B00B00B,
                                     1,
                                     StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 2, 1>(),
                                     EOpFract,
@@ -5155,7 +5232,7 @@
 constexpr const TFunction fract_20B(BuiltInId::fract_Float3,
                                     BuiltInName::fract,
                                     std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                    BuiltInParameters::p20B20B00B,
+                                    BuiltInParameters::p20B00B00B,
                                     1,
                                     StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 3, 1>(),
                                     EOpFract,
@@ -5163,7 +5240,7 @@
 constexpr const TFunction fract_30B(BuiltInId::fract_Float4,
                                     BuiltInName::fract,
                                     std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                    BuiltInParameters::p30B10B,
+                                    BuiltInParameters::p30B00B00B,
                                     1,
                                     StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 4, 1>(),
                                     EOpFract,
@@ -5171,7 +5248,7 @@
 constexpr const TFunction mod_00B00B(BuiltInId::mod_Float1_Float1,
                                      BuiltInName::mod,
                                      std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                     BuiltInParameters::p00B00B20B,
+                                     BuiltInParameters::p00B00B00B,
                                      2,
                                      StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 1, 1>(),
                                      EOpMod,
@@ -5227,7 +5304,7 @@
 constexpr const TFunction min_00B00B(BuiltInId::min_Float1_Float1,
                                      BuiltInName::min,
                                      std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                     BuiltInParameters::p00B00B20B,
+                                     BuiltInParameters::p00B00B00B,
                                      2,
                                      StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 1, 1>(),
                                      EOpMin,
@@ -5283,7 +5360,7 @@
 constexpr const TFunction min_00D00D(BuiltInId::min_Int1_Int1,
                                      BuiltInName::min,
                                      std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                     BuiltInParameters::p00D00D00F,
+                                     BuiltInParameters::p00D00D00D00D,
                                      2,
                                      StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 1, 1>(),
                                      EOpMin,
@@ -5299,7 +5376,7 @@
 constexpr const TFunction min_20D20D(BuiltInId::min_Int3_Int3,
                                      BuiltInName::min,
                                      std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                     BuiltInParameters::p20D20D20F,
+                                     BuiltInParameters::p20D20D00D00D,
                                      2,
                                      StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 3, 1>(),
                                      EOpMin,
@@ -5307,7 +5384,7 @@
 constexpr const TFunction min_30D30D(BuiltInId::min_Int4_Int4,
                                      BuiltInName::min,
                                      std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                     BuiltInParameters::p30D30D30F,
+                                     BuiltInParameters::p30D30D00D00D,
                                      2,
                                      StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 4, 1>(),
                                      EOpMin,
@@ -5347,7 +5424,7 @@
 constexpr const TFunction min_10E10E(BuiltInId::min_UInt2_UInt2,
                                      BuiltInName::min,
                                      std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                     BuiltInParameters::p10E10E_o_10E_o_10E,
+                                     BuiltInParameters::p10E10E00D00D,
                                      2,
                                      StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 2, 1>(),
                                      EOpMin,
@@ -5355,7 +5432,7 @@
 constexpr const TFunction min_20E20E(BuiltInId::min_UInt3_UInt3,
                                      BuiltInName::min,
                                      std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                     BuiltInParameters::p20E20E20E,
+                                     BuiltInParameters::p20E20E00D00D,
                                      2,
                                      StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 3, 1>(),
                                      EOpMin,
@@ -5363,7 +5440,7 @@
 constexpr const TFunction min_30E30E(BuiltInId::min_UInt4_UInt4,
                                      BuiltInName::min,
                                      std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                     BuiltInParameters::p30E30E_o_30E_o_30E,
+                                     BuiltInParameters::p30E30E00D00D,
                                      2,
                                      StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 4, 1>(),
                                      EOpMin,
@@ -5395,7 +5472,7 @@
 constexpr const TFunction max_00B00B(BuiltInId::max_Float1_Float1,
                                      BuiltInName::max,
                                      std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                     BuiltInParameters::p00B00B20B,
+                                     BuiltInParameters::p00B00B00B,
                                      2,
                                      StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 1, 1>(),
                                      EOpMax,
@@ -5451,7 +5528,7 @@
 constexpr const TFunction max_00D00D(BuiltInId::max_Int1_Int1,
                                      BuiltInName::max,
                                      std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                     BuiltInParameters::p00D00D00F,
+                                     BuiltInParameters::p00D00D00D00D,
                                      2,
                                      StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 1, 1>(),
                                      EOpMax,
@@ -5467,7 +5544,7 @@
 constexpr const TFunction max_20D20D(BuiltInId::max_Int3_Int3,
                                      BuiltInName::max,
                                      std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                     BuiltInParameters::p20D20D20F,
+                                     BuiltInParameters::p20D20D00D00D,
                                      2,
                                      StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 3, 1>(),
                                      EOpMax,
@@ -5475,7 +5552,7 @@
 constexpr const TFunction max_30D30D(BuiltInId::max_Int4_Int4,
                                      BuiltInName::max,
                                      std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                     BuiltInParameters::p30D30D30F,
+                                     BuiltInParameters::p30D30D00D00D,
                                      2,
                                      StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 4, 1>(),
                                      EOpMax,
@@ -5515,7 +5592,7 @@
 constexpr const TFunction max_10E10E(BuiltInId::max_UInt2_UInt2,
                                      BuiltInName::max,
                                      std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                     BuiltInParameters::p10E10E_o_10E_o_10E,
+                                     BuiltInParameters::p10E10E00D00D,
                                      2,
                                      StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 2, 1>(),
                                      EOpMax,
@@ -5523,7 +5600,7 @@
 constexpr const TFunction max_20E20E(BuiltInId::max_UInt3_UInt3,
                                      BuiltInName::max,
                                      std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                     BuiltInParameters::p20E20E20E,
+                                     BuiltInParameters::p20E20E00D00D,
                                      2,
                                      StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 3, 1>(),
                                      EOpMax,
@@ -5531,7 +5608,7 @@
 constexpr const TFunction max_30E30E(BuiltInId::max_UInt4_UInt4,
                                      BuiltInName::max,
                                      std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                     BuiltInParameters::p30E30E_o_30E_o_30E,
+                                     BuiltInParameters::p30E30E00D00D,
                                      2,
                                      StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 4, 1>(),
                                      EOpMax,
@@ -5922,7 +5999,7 @@
 constexpr const TFunction step_00B00B(BuiltInId::step_Float1_Float1,
                                       BuiltInName::step,
                                       std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                      BuiltInParameters::p00B00B20B,
+                                      BuiltInParameters::p00B00B00B,
                                       2,
                                       StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 1, 1>(),
                                       EOpStep,
@@ -6073,7 +6150,7 @@
 constexpr const TFunction isnan_00B(BuiltInId::isnan_Float1,
                                     BuiltInName::isnan,
                                     std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                    BuiltInParameters::p00B30B,
+                                    BuiltInParameters::p00B00B00B,
                                     1,
                                     StaticType::Get<EbtBool, EbpUndefined, EvqGlobal, 1, 1>(),
                                     EOpIsnan,
@@ -6081,7 +6158,7 @@
 constexpr const TFunction isnan_10B(BuiltInId::isnan_Float2,
                                     BuiltInName::isnan,
                                     std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                    BuiltInParameters::p10B00D,
+                                    BuiltInParameters::p10B00B00B,
                                     1,
                                     StaticType::Get<EbtBool, EbpUndefined, EvqGlobal, 2, 1>(),
                                     EOpIsnan,
@@ -6089,7 +6166,7 @@
 constexpr const TFunction isnan_20B(BuiltInId::isnan_Float3,
                                     BuiltInName::isnan,
                                     std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                    BuiltInParameters::p20B20B00B,
+                                    BuiltInParameters::p20B00B00B,
                                     1,
                                     StaticType::Get<EbtBool, EbpUndefined, EvqGlobal, 3, 1>(),
                                     EOpIsnan,
@@ -6097,7 +6174,7 @@
 constexpr const TFunction isnan_30B(BuiltInId::isnan_Float4,
                                     BuiltInName::isnan,
                                     std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                    BuiltInParameters::p30B10B,
+                                    BuiltInParameters::p30B00B00B,
                                     1,
                                     StaticType::Get<EbtBool, EbpUndefined, EvqGlobal, 4, 1>(),
                                     EOpIsnan,
@@ -6105,7 +6182,7 @@
 constexpr const TFunction isinf_00B(BuiltInId::isinf_Float1,
                                     BuiltInName::isinf,
                                     std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                    BuiltInParameters::p00B30B,
+                                    BuiltInParameters::p00B00B00B,
                                     1,
                                     StaticType::Get<EbtBool, EbpUndefined, EvqGlobal, 1, 1>(),
                                     EOpIsinf,
@@ -6113,7 +6190,7 @@
 constexpr const TFunction isinf_10B(BuiltInId::isinf_Float2,
                                     BuiltInName::isinf,
                                     std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                    BuiltInParameters::p10B00D,
+                                    BuiltInParameters::p10B00B00B,
                                     1,
                                     StaticType::Get<EbtBool, EbpUndefined, EvqGlobal, 2, 1>(),
                                     EOpIsinf,
@@ -6121,7 +6198,7 @@
 constexpr const TFunction isinf_20B(BuiltInId::isinf_Float3,
                                     BuiltInName::isinf,
                                     std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                    BuiltInParameters::p20B20B00B,
+                                    BuiltInParameters::p20B00B00B,
                                     1,
                                     StaticType::Get<EbtBool, EbpUndefined, EvqGlobal, 3, 1>(),
                                     EOpIsinf,
@@ -6129,7 +6206,7 @@
 constexpr const TFunction isinf_30B(BuiltInId::isinf_Float4,
                                     BuiltInName::isinf,
                                     std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                    BuiltInParameters::p30B10B,
+                                    BuiltInParameters::p30B00B00B,
                                     1,
                                     StaticType::Get<EbtBool, EbpUndefined, EvqGlobal, 4, 1>(),
                                     EOpIsinf,
@@ -6138,7 +6215,7 @@
     BuiltInId::floatBitsToInt_Float1,
     BuiltInName::floatBitsToInt,
     std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-    BuiltInParameters::p00B30B,
+    BuiltInParameters::p00B00B00B,
     1,
     StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 1, 1>(),
     EOpFloatBitsToInt,
@@ -6147,7 +6224,7 @@
     BuiltInId::floatBitsToInt_Float2,
     BuiltInName::floatBitsToInt,
     std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-    BuiltInParameters::p10B00D,
+    BuiltInParameters::p10B00B00B,
     1,
     StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 2, 1>(),
     EOpFloatBitsToInt,
@@ -6156,7 +6233,7 @@
     BuiltInId::floatBitsToInt_Float3,
     BuiltInName::floatBitsToInt,
     std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-    BuiltInParameters::p20B20B00B,
+    BuiltInParameters::p20B00B00B,
     1,
     StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 3, 1>(),
     EOpFloatBitsToInt,
@@ -6165,7 +6242,7 @@
     BuiltInId::floatBitsToInt_Float4,
     BuiltInName::floatBitsToInt,
     std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-    BuiltInParameters::p30B10B,
+    BuiltInParameters::p30B00B00B,
     1,
     StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 4, 1>(),
     EOpFloatBitsToInt,
@@ -6174,7 +6251,7 @@
     BuiltInId::floatBitsToUint_Float1,
     BuiltInName::floatBitsToUint,
     std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-    BuiltInParameters::p00B30B,
+    BuiltInParameters::p00B00B00B,
     1,
     StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 1, 1>(),
     EOpFloatBitsToUint,
@@ -6183,7 +6260,7 @@
     BuiltInId::floatBitsToUint_Float2,
     BuiltInName::floatBitsToUint,
     std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-    BuiltInParameters::p10B00D,
+    BuiltInParameters::p10B00B00B,
     1,
     StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 2, 1>(),
     EOpFloatBitsToUint,
@@ -6192,7 +6269,7 @@
     BuiltInId::floatBitsToUint_Float3,
     BuiltInName::floatBitsToUint,
     std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-    BuiltInParameters::p20B20B00B,
+    BuiltInParameters::p20B00B00B,
     1,
     StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 3, 1>(),
     EOpFloatBitsToUint,
@@ -6201,7 +6278,7 @@
     BuiltInId::floatBitsToUint_Float4,
     BuiltInName::floatBitsToUint,
     std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-    BuiltInParameters::p30B10B,
+    BuiltInParameters::p30B00B00B,
     1,
     StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 4, 1>(),
     EOpFloatBitsToUint,
@@ -6210,7 +6287,7 @@
     BuiltInId::intBitsToFloat_Int1,
     BuiltInName::intBitsToFloat,
     std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-    BuiltInParameters::p00D00D00F,
+    BuiltInParameters::p00D00D00D00D,
     1,
     StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 1, 1>(),
     EOpIntBitsToFloat,
@@ -6219,7 +6296,7 @@
     BuiltInId::intBitsToFloat_Int2,
     BuiltInName::intBitsToFloat,
     std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-    BuiltInParameters::p10D10D00D00D,
+    BuiltInParameters::p10D00D00D,
     1,
     StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 2, 1>(),
     EOpIntBitsToFloat,
@@ -6228,7 +6305,7 @@
     BuiltInId::intBitsToFloat_Int3,
     BuiltInName::intBitsToFloat,
     std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-    BuiltInParameters::p20D20D20F,
+    BuiltInParameters::p20D00D00D,
     1,
     StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 3, 1>(),
     EOpIntBitsToFloat,
@@ -6237,7 +6314,7 @@
     BuiltInId::intBitsToFloat_Int4,
     BuiltInName::intBitsToFloat,
     std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-    BuiltInParameters::p30D30D30F,
+    BuiltInParameters::p30D00D00D,
     1,
     StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 4, 1>(),
     EOpIntBitsToFloat,
@@ -6246,7 +6323,7 @@
     BuiltInId::uintBitsToFloat_UInt1,
     BuiltInName::uintBitsToFloat,
     std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-    BuiltInParameters::p00E00E00D00D,
+    BuiltInParameters::p00E00D00D,
     1,
     StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 1, 1>(),
     EOpUintBitsToFloat,
@@ -6255,7 +6332,7 @@
     BuiltInId::uintBitsToFloat_UInt2,
     BuiltInName::uintBitsToFloat,
     std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-    BuiltInParameters::p10E00E00E,
+    BuiltInParameters::p10E00D00D,
     1,
     StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 2, 1>(),
     EOpUintBitsToFloat,
@@ -6264,7 +6341,7 @@
     BuiltInId::uintBitsToFloat_UInt3,
     BuiltInName::uintBitsToFloat,
     std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-    BuiltInParameters::p20E20E20E,
+    BuiltInParameters::p20E00D00D,
     1,
     StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 3, 1>(),
     EOpUintBitsToFloat,
@@ -6273,7 +6350,7 @@
     BuiltInId::uintBitsToFloat_UInt4,
     BuiltInName::uintBitsToFloat,
     std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-    BuiltInParameters::p30E30E_o_30E_o_30E,
+    BuiltInParameters::p30E00D00D,
     1,
     StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 4, 1>(),
     EOpUintBitsToFloat,
@@ -6414,7 +6491,7 @@
     BuiltInId::packSnorm2x16_Float2,
     BuiltInName::packSnorm2x16,
     std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-    BuiltInParameters::p10B00D,
+    BuiltInParameters::p10B00B00B,
     1,
     StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 1, 1>(),
     EOpPackSnorm2x16,
@@ -6423,7 +6500,7 @@
     BuiltInId::packHalf2x16_Float2,
     BuiltInName::packHalf2x16,
     std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-    BuiltInParameters::p10B00D,
+    BuiltInParameters::p10B00B00B,
     1,
     StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 1, 1>(),
     EOpPackHalf2x16,
@@ -6432,7 +6509,7 @@
     BuiltInId::unpackSnorm2x16_UInt1,
     BuiltInName::unpackSnorm2x16,
     std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-    BuiltInParameters::p00E00E00D00D,
+    BuiltInParameters::p00E00D00D,
     1,
     StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 2, 1>(),
     EOpUnpackSnorm2x16,
@@ -6441,7 +6518,7 @@
     BuiltInId::unpackHalf2x16_UInt1,
     BuiltInName::unpackHalf2x16,
     std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-    BuiltInParameters::p00E00E00D00D,
+    BuiltInParameters::p00E00D00D,
     1,
     StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 2, 1>(),
     EOpUnpackHalf2x16,
@@ -6450,7 +6527,7 @@
     BuiltInId::packUnorm2x16_Float2,
     BuiltInName::packUnorm2x16,
     std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-    BuiltInParameters::p10B00D,
+    BuiltInParameters::p10B00B00B,
     1,
     StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 1, 1>(),
     EOpPackUnorm2x16,
@@ -6459,7 +6536,7 @@
     BuiltInId::unpackUnorm2x16_UInt1,
     BuiltInName::unpackUnorm2x16,
     std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-    BuiltInParameters::p00E00E00D00D,
+    BuiltInParameters::p00E00D00D,
     1,
     StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 2, 1>(),
     EOpUnpackUnorm2x16,
@@ -6468,7 +6545,7 @@
     BuiltInId::packUnorm4x8_Float4,
     BuiltInName::packUnorm4x8,
     std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-    BuiltInParameters::p30B10B,
+    BuiltInParameters::p30B00B00B,
     1,
     StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 1, 1>(),
     EOpPackUnorm4x8,
@@ -6477,7 +6554,7 @@
     BuiltInId::packSnorm4x8_Float4,
     BuiltInName::packSnorm4x8,
     std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-    BuiltInParameters::p30B10B,
+    BuiltInParameters::p30B00B00B,
     1,
     StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 1, 1>(),
     EOpPackSnorm4x8,
@@ -6486,7 +6563,7 @@
     BuiltInId::unpackUnorm4x8_UInt1,
     BuiltInName::unpackUnorm4x8,
     std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-    BuiltInParameters::p00E00E00D00D,
+    BuiltInParameters::p00E00D00D,
     1,
     StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 4, 1>(),
     EOpUnpackUnorm4x8,
@@ -6495,7 +6572,7 @@
     BuiltInId::unpackSnorm4x8_UInt1,
     BuiltInName::unpackSnorm4x8,
     std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-    BuiltInParameters::p00E00E00D00D,
+    BuiltInParameters::p00E00D00D,
     1,
     StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 4, 1>(),
     EOpUnpackSnorm4x8,
@@ -6503,7 +6580,7 @@
 constexpr const TFunction length_00B(BuiltInId::length_Float1,
                                      BuiltInName::length,
                                      std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                     BuiltInParameters::p00B30B,
+                                     BuiltInParameters::p00B00B00B,
                                      1,
                                      StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 1, 1>(),
                                      EOpLength,
@@ -6511,7 +6588,7 @@
 constexpr const TFunction length_10B(BuiltInId::length_Float2,
                                      BuiltInName::length,
                                      std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                     BuiltInParameters::p10B00D,
+                                     BuiltInParameters::p10B00B00B,
                                      1,
                                      StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 1, 1>(),
                                      EOpLength,
@@ -6519,7 +6596,7 @@
 constexpr const TFunction length_20B(BuiltInId::length_Float3,
                                      BuiltInName::length,
                                      std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                     BuiltInParameters::p20B20B00B,
+                                     BuiltInParameters::p20B00B00B,
                                      1,
                                      StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 1, 1>(),
                                      EOpLength,
@@ -6527,7 +6604,7 @@
 constexpr const TFunction length_30B(BuiltInId::length_Float4,
                                      BuiltInName::length,
                                      std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                     BuiltInParameters::p30B10B,
+                                     BuiltInParameters::p30B00B00B,
                                      1,
                                      StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 1, 1>(),
                                      EOpLength,
@@ -6536,7 +6613,7 @@
     BuiltInId::distance_Float1_Float1,
     BuiltInName::distance,
     std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-    BuiltInParameters::p00B00B20B,
+    BuiltInParameters::p00B00B00B,
     2,
     StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 1, 1>(),
     EOpDistance,
@@ -6571,7 +6648,7 @@
 constexpr const TFunction dot_00B00B(BuiltInId::dot_Float1_Float1,
                                      BuiltInName::dot,
                                      std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                     BuiltInParameters::p00B00B20B,
+                                     BuiltInParameters::p00B00B00B,
                                      2,
                                      StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 1, 1>(),
                                      EOpDot,
@@ -6611,7 +6688,7 @@
 constexpr const TFunction normalize_00B(BuiltInId::normalize_Float1,
                                         BuiltInName::normalize,
                                         std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                        BuiltInParameters::p00B30B,
+                                        BuiltInParameters::p00B00B00B,
                                         1,
                                         StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 1, 1>(),
                                         EOpNormalize,
@@ -6619,7 +6696,7 @@
 constexpr const TFunction normalize_10B(BuiltInId::normalize_Float2,
                                         BuiltInName::normalize,
                                         std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                        BuiltInParameters::p10B00D,
+                                        BuiltInParameters::p10B00B00B,
                                         1,
                                         StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 2, 1>(),
                                         EOpNormalize,
@@ -6627,7 +6704,7 @@
 constexpr const TFunction normalize_20B(BuiltInId::normalize_Float3,
                                         BuiltInName::normalize,
                                         std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                        BuiltInParameters::p20B20B00B,
+                                        BuiltInParameters::p20B00B00B,
                                         1,
                                         StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 3, 1>(),
                                         EOpNormalize,
@@ -6635,7 +6712,7 @@
 constexpr const TFunction normalize_30B(BuiltInId::normalize_Float4,
                                         BuiltInName::normalize,
                                         std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                        BuiltInParameters::p30B10B,
+                                        BuiltInParameters::p30B00B00B,
                                         1,
                                         StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 4, 1>(),
                                         EOpNormalize,
@@ -6679,7 +6756,7 @@
 constexpr const TFunction reflect_00B00B(BuiltInId::reflect_Float1_Float1,
                                          BuiltInName::reflect,
                                          std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                         BuiltInParameters::p00B00B20B,
+                                         BuiltInParameters::p00B00B00B,
                                          2,
                                          StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 1, 1>(),
                                          EOpReflect,
@@ -7064,7 +7141,7 @@
 constexpr const TFunction lessThan_20D20D(BuiltInId::lessThan_Int3_Int3,
                                           BuiltInName::lessThan,
                                           std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                          BuiltInParameters::p20D20D20F,
+                                          BuiltInParameters::p20D20D00D00D,
                                           2,
                                           StaticType::Get<EbtBool, EbpUndefined, EvqGlobal, 3, 1>(),
                                           EOpLessThanComponentWise,
@@ -7072,7 +7149,7 @@
 constexpr const TFunction lessThan_30D30D(BuiltInId::lessThan_Int4_Int4,
                                           BuiltInName::lessThan,
                                           std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                          BuiltInParameters::p30D30D30F,
+                                          BuiltInParameters::p30D30D00D00D,
                                           2,
                                           StaticType::Get<EbtBool, EbpUndefined, EvqGlobal, 4, 1>(),
                                           EOpLessThanComponentWise,
@@ -7080,7 +7157,7 @@
 constexpr const TFunction lessThan_10E10E(BuiltInId::lessThan_UInt2_UInt2,
                                           BuiltInName::lessThan,
                                           std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                          BuiltInParameters::p10E10E_o_10E_o_10E,
+                                          BuiltInParameters::p10E10E00D00D,
                                           2,
                                           StaticType::Get<EbtBool, EbpUndefined, EvqGlobal, 2, 1>(),
                                           EOpLessThanComponentWise,
@@ -7088,7 +7165,7 @@
 constexpr const TFunction lessThan_20E20E(BuiltInId::lessThan_UInt3_UInt3,
                                           BuiltInName::lessThan,
                                           std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                          BuiltInParameters::p20E20E20E,
+                                          BuiltInParameters::p20E20E00D00D,
                                           2,
                                           StaticType::Get<EbtBool, EbpUndefined, EvqGlobal, 3, 1>(),
                                           EOpLessThanComponentWise,
@@ -7096,7 +7173,7 @@
 constexpr const TFunction lessThan_30E30E(BuiltInId::lessThan_UInt4_UInt4,
                                           BuiltInName::lessThan,
                                           std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                          BuiltInParameters::p30E30E_o_30E_o_30E,
+                                          BuiltInParameters::p30E30E00D00D,
                                           2,
                                           StaticType::Get<EbtBool, EbpUndefined, EvqGlobal, 4, 1>(),
                                           EOpLessThanComponentWise,
@@ -7141,7 +7218,7 @@
     BuiltInId::lessThanEqual_Int3_Int3,
     BuiltInName::lessThanEqual,
     std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-    BuiltInParameters::p20D20D20F,
+    BuiltInParameters::p20D20D00D00D,
     2,
     StaticType::Get<EbtBool, EbpUndefined, EvqGlobal, 3, 1>(),
     EOpLessThanEqualComponentWise,
@@ -7150,7 +7227,7 @@
     BuiltInId::lessThanEqual_Int4_Int4,
     BuiltInName::lessThanEqual,
     std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-    BuiltInParameters::p30D30D30F,
+    BuiltInParameters::p30D30D00D00D,
     2,
     StaticType::Get<EbtBool, EbpUndefined, EvqGlobal, 4, 1>(),
     EOpLessThanEqualComponentWise,
@@ -7159,7 +7236,7 @@
     BuiltInId::lessThanEqual_UInt2_UInt2,
     BuiltInName::lessThanEqual,
     std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-    BuiltInParameters::p10E10E_o_10E_o_10E,
+    BuiltInParameters::p10E10E00D00D,
     2,
     StaticType::Get<EbtBool, EbpUndefined, EvqGlobal, 2, 1>(),
     EOpLessThanEqualComponentWise,
@@ -7168,7 +7245,7 @@
     BuiltInId::lessThanEqual_UInt3_UInt3,
     BuiltInName::lessThanEqual,
     std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-    BuiltInParameters::p20E20E20E,
+    BuiltInParameters::p20E20E00D00D,
     2,
     StaticType::Get<EbtBool, EbpUndefined, EvqGlobal, 3, 1>(),
     EOpLessThanEqualComponentWise,
@@ -7177,7 +7254,7 @@
     BuiltInId::lessThanEqual_UInt4_UInt4,
     BuiltInName::lessThanEqual,
     std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-    BuiltInParameters::p30E30E_o_30E_o_30E,
+    BuiltInParameters::p30E30E00D00D,
     2,
     StaticType::Get<EbtBool, EbpUndefined, EvqGlobal, 4, 1>(),
     EOpLessThanEqualComponentWise,
@@ -7222,7 +7299,7 @@
     BuiltInId::greaterThan_Int3_Int3,
     BuiltInName::greaterThan,
     std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-    BuiltInParameters::p20D20D20F,
+    BuiltInParameters::p20D20D00D00D,
     2,
     StaticType::Get<EbtBool, EbpUndefined, EvqGlobal, 3, 1>(),
     EOpGreaterThanComponentWise,
@@ -7231,7 +7308,7 @@
     BuiltInId::greaterThan_Int4_Int4,
     BuiltInName::greaterThan,
     std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-    BuiltInParameters::p30D30D30F,
+    BuiltInParameters::p30D30D00D00D,
     2,
     StaticType::Get<EbtBool, EbpUndefined, EvqGlobal, 4, 1>(),
     EOpGreaterThanComponentWise,
@@ -7240,7 +7317,7 @@
     BuiltInId::greaterThan_UInt2_UInt2,
     BuiltInName::greaterThan,
     std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-    BuiltInParameters::p10E10E_o_10E_o_10E,
+    BuiltInParameters::p10E10E00D00D,
     2,
     StaticType::Get<EbtBool, EbpUndefined, EvqGlobal, 2, 1>(),
     EOpGreaterThanComponentWise,
@@ -7249,7 +7326,7 @@
     BuiltInId::greaterThan_UInt3_UInt3,
     BuiltInName::greaterThan,
     std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-    BuiltInParameters::p20E20E20E,
+    BuiltInParameters::p20E20E00D00D,
     2,
     StaticType::Get<EbtBool, EbpUndefined, EvqGlobal, 3, 1>(),
     EOpGreaterThanComponentWise,
@@ -7258,7 +7335,7 @@
     BuiltInId::greaterThan_UInt4_UInt4,
     BuiltInName::greaterThan,
     std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-    BuiltInParameters::p30E30E_o_30E_o_30E,
+    BuiltInParameters::p30E30E00D00D,
     2,
     StaticType::Get<EbtBool, EbpUndefined, EvqGlobal, 4, 1>(),
     EOpGreaterThanComponentWise,
@@ -7303,7 +7380,7 @@
     BuiltInId::greaterThanEqual_Int3_Int3,
     BuiltInName::greaterThanEqual,
     std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-    BuiltInParameters::p20D20D20F,
+    BuiltInParameters::p20D20D00D00D,
     2,
     StaticType::Get<EbtBool, EbpUndefined, EvqGlobal, 3, 1>(),
     EOpGreaterThanEqualComponentWise,
@@ -7312,7 +7389,7 @@
     BuiltInId::greaterThanEqual_Int4_Int4,
     BuiltInName::greaterThanEqual,
     std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-    BuiltInParameters::p30D30D30F,
+    BuiltInParameters::p30D30D00D00D,
     2,
     StaticType::Get<EbtBool, EbpUndefined, EvqGlobal, 4, 1>(),
     EOpGreaterThanEqualComponentWise,
@@ -7321,7 +7398,7 @@
     BuiltInId::greaterThanEqual_UInt2_UInt2,
     BuiltInName::greaterThanEqual,
     std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-    BuiltInParameters::p10E10E_o_10E_o_10E,
+    BuiltInParameters::p10E10E00D00D,
     2,
     StaticType::Get<EbtBool, EbpUndefined, EvqGlobal, 2, 1>(),
     EOpGreaterThanEqualComponentWise,
@@ -7330,7 +7407,7 @@
     BuiltInId::greaterThanEqual_UInt3_UInt3,
     BuiltInName::greaterThanEqual,
     std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-    BuiltInParameters::p20E20E20E,
+    BuiltInParameters::p20E20E00D00D,
     2,
     StaticType::Get<EbtBool, EbpUndefined, EvqGlobal, 3, 1>(),
     EOpGreaterThanEqualComponentWise,
@@ -7339,7 +7416,7 @@
     BuiltInId::greaterThanEqual_UInt4_UInt4,
     BuiltInName::greaterThanEqual,
     std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-    BuiltInParameters::p30E30E_o_30E_o_30E,
+    BuiltInParameters::p30E30E00D00D,
     2,
     StaticType::Get<EbtBool, EbpUndefined, EvqGlobal, 4, 1>(),
     EOpGreaterThanEqualComponentWise,
@@ -7379,7 +7456,7 @@
 constexpr const TFunction equal_20D20D(BuiltInId::equal_Int3_Int3,
                                        BuiltInName::equal,
                                        std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                       BuiltInParameters::p20D20D20F,
+                                       BuiltInParameters::p20D20D00D00D,
                                        2,
                                        StaticType::Get<EbtBool, EbpUndefined, EvqGlobal, 3, 1>(),
                                        EOpEqualComponentWise,
@@ -7387,7 +7464,7 @@
 constexpr const TFunction equal_30D30D(BuiltInId::equal_Int4_Int4,
                                        BuiltInName::equal,
                                        std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                       BuiltInParameters::p30D30D30F,
+                                       BuiltInParameters::p30D30D00D00D,
                                        2,
                                        StaticType::Get<EbtBool, EbpUndefined, EvqGlobal, 4, 1>(),
                                        EOpEqualComponentWise,
@@ -7395,7 +7472,7 @@
 constexpr const TFunction equal_10E10E(BuiltInId::equal_UInt2_UInt2,
                                        BuiltInName::equal,
                                        std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                       BuiltInParameters::p10E10E_o_10E_o_10E,
+                                       BuiltInParameters::p10E10E00D00D,
                                        2,
                                        StaticType::Get<EbtBool, EbpUndefined, EvqGlobal, 2, 1>(),
                                        EOpEqualComponentWise,
@@ -7403,7 +7480,7 @@
 constexpr const TFunction equal_20E20E(BuiltInId::equal_UInt3_UInt3,
                                        BuiltInName::equal,
                                        std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                       BuiltInParameters::p20E20E20E,
+                                       BuiltInParameters::p20E20E00D00D,
                                        2,
                                        StaticType::Get<EbtBool, EbpUndefined, EvqGlobal, 3, 1>(),
                                        EOpEqualComponentWise,
@@ -7411,7 +7488,7 @@
 constexpr const TFunction equal_30E30E(BuiltInId::equal_UInt4_UInt4,
                                        BuiltInName::equal,
                                        std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                       BuiltInParameters::p30E30E_o_30E_o_30E,
+                                       BuiltInParameters::p30E30E00D00D,
                                        2,
                                        StaticType::Get<EbtBool, EbpUndefined, EvqGlobal, 4, 1>(),
                                        EOpEqualComponentWise,
@@ -7475,7 +7552,7 @@
 constexpr const TFunction notEqual_20D20D(BuiltInId::notEqual_Int3_Int3,
                                           BuiltInName::notEqual,
                                           std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                          BuiltInParameters::p20D20D20F,
+                                          BuiltInParameters::p20D20D00D00D,
                                           2,
                                           StaticType::Get<EbtBool, EbpUndefined, EvqGlobal, 3, 1>(),
                                           EOpNotEqualComponentWise,
@@ -7483,7 +7560,7 @@
 constexpr const TFunction notEqual_30D30D(BuiltInId::notEqual_Int4_Int4,
                                           BuiltInName::notEqual,
                                           std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                          BuiltInParameters::p30D30D30F,
+                                          BuiltInParameters::p30D30D00D00D,
                                           2,
                                           StaticType::Get<EbtBool, EbpUndefined, EvqGlobal, 4, 1>(),
                                           EOpNotEqualComponentWise,
@@ -7491,7 +7568,7 @@
 constexpr const TFunction notEqual_10E10E(BuiltInId::notEqual_UInt2_UInt2,
                                           BuiltInName::notEqual,
                                           std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                          BuiltInParameters::p10E10E_o_10E_o_10E,
+                                          BuiltInParameters::p10E10E00D00D,
                                           2,
                                           StaticType::Get<EbtBool, EbpUndefined, EvqGlobal, 2, 1>(),
                                           EOpNotEqualComponentWise,
@@ -7499,7 +7576,7 @@
 constexpr const TFunction notEqual_20E20E(BuiltInId::notEqual_UInt3_UInt3,
                                           BuiltInName::notEqual,
                                           std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                          BuiltInParameters::p20E20E20E,
+                                          BuiltInParameters::p20E20E00D00D,
                                           2,
                                           StaticType::Get<EbtBool, EbpUndefined, EvqGlobal, 3, 1>(),
                                           EOpNotEqualComponentWise,
@@ -7507,7 +7584,7 @@
 constexpr const TFunction notEqual_30E30E(BuiltInId::notEqual_UInt4_UInt4,
                                           BuiltInName::notEqual,
                                           std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                          BuiltInParameters::p30E30E_o_30E_o_30E,
+                                          BuiltInParameters::p30E30E00D00D,
                                           2,
                                           StaticType::Get<EbtBool, EbpUndefined, EvqGlobal, 4, 1>(),
                                           EOpNotEqualComponentWise,
@@ -7756,7 +7833,7 @@
     BuiltInId::bitfieldReverse_Int1,
     BuiltInName::bitfieldReverse,
     std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-    BuiltInParameters::p00D00D00F,
+    BuiltInParameters::p00D00D00D00D,
     1,
     StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 1, 1>(),
     EOpBitfieldReverse,
@@ -7765,7 +7842,7 @@
     BuiltInId::bitfieldReverse_Int2,
     BuiltInName::bitfieldReverse,
     std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-    BuiltInParameters::p10D10D00D00D,
+    BuiltInParameters::p10D00D00D,
     1,
     StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 2, 1>(),
     EOpBitfieldReverse,
@@ -7774,7 +7851,7 @@
     BuiltInId::bitfieldReverse_Int3,
     BuiltInName::bitfieldReverse,
     std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-    BuiltInParameters::p20D20D20F,
+    BuiltInParameters::p20D00D00D,
     1,
     StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 3, 1>(),
     EOpBitfieldReverse,
@@ -7783,7 +7860,7 @@
     BuiltInId::bitfieldReverse_Int4,
     BuiltInName::bitfieldReverse,
     std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-    BuiltInParameters::p30D30D30F,
+    BuiltInParameters::p30D00D00D,
     1,
     StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 4, 1>(),
     EOpBitfieldReverse,
@@ -7792,7 +7869,7 @@
     BuiltInId::bitfieldReverse_UInt1,
     BuiltInName::bitfieldReverse,
     std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-    BuiltInParameters::p00E00E00D00D,
+    BuiltInParameters::p00E00D00D,
     1,
     StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 1, 1>(),
     EOpBitfieldReverse,
@@ -7801,7 +7878,7 @@
     BuiltInId::bitfieldReverse_UInt2,
     BuiltInName::bitfieldReverse,
     std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-    BuiltInParameters::p10E00E00E,
+    BuiltInParameters::p10E00D00D,
     1,
     StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 2, 1>(),
     EOpBitfieldReverse,
@@ -7810,7 +7887,7 @@
     BuiltInId::bitfieldReverse_UInt3,
     BuiltInName::bitfieldReverse,
     std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-    BuiltInParameters::p20E20E20E,
+    BuiltInParameters::p20E00D00D,
     1,
     StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 3, 1>(),
     EOpBitfieldReverse,
@@ -7819,7 +7896,7 @@
     BuiltInId::bitfieldReverse_UInt4,
     BuiltInName::bitfieldReverse,
     std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-    BuiltInParameters::p30E30E_o_30E_o_30E,
+    BuiltInParameters::p30E00D00D,
     1,
     StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 4, 1>(),
     EOpBitfieldReverse,
@@ -7827,7 +7904,7 @@
 constexpr const TFunction bitCount_00D(BuiltInId::bitCount_Int1,
                                        BuiltInName::bitCount,
                                        std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                       BuiltInParameters::p00D00D00F,
+                                       BuiltInParameters::p00D00D00D00D,
                                        1,
                                        StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 1, 1>(),
                                        EOpBitCount,
@@ -7835,7 +7912,7 @@
 constexpr const TFunction bitCount_10D(BuiltInId::bitCount_Int2,
                                        BuiltInName::bitCount,
                                        std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                       BuiltInParameters::p10D10D00D00D,
+                                       BuiltInParameters::p10D00D00D,
                                        1,
                                        StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 2, 1>(),
                                        EOpBitCount,
@@ -7843,7 +7920,7 @@
 constexpr const TFunction bitCount_20D(BuiltInId::bitCount_Int3,
                                        BuiltInName::bitCount,
                                        std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                       BuiltInParameters::p20D20D20F,
+                                       BuiltInParameters::p20D00D00D,
                                        1,
                                        StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 3, 1>(),
                                        EOpBitCount,
@@ -7851,7 +7928,7 @@
 constexpr const TFunction bitCount_30D(BuiltInId::bitCount_Int4,
                                        BuiltInName::bitCount,
                                        std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                       BuiltInParameters::p30D30D30F,
+                                       BuiltInParameters::p30D00D00D,
                                        1,
                                        StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 4, 1>(),
                                        EOpBitCount,
@@ -7859,7 +7936,7 @@
 constexpr const TFunction bitCount_00E(BuiltInId::bitCount_UInt1,
                                        BuiltInName::bitCount,
                                        std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                       BuiltInParameters::p00E00E00D00D,
+                                       BuiltInParameters::p00E00D00D,
                                        1,
                                        StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 1, 1>(),
                                        EOpBitCount,
@@ -7867,7 +7944,7 @@
 constexpr const TFunction bitCount_10E(BuiltInId::bitCount_UInt2,
                                        BuiltInName::bitCount,
                                        std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                       BuiltInParameters::p10E00E00E,
+                                       BuiltInParameters::p10E00D00D,
                                        1,
                                        StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 2, 1>(),
                                        EOpBitCount,
@@ -7875,7 +7952,7 @@
 constexpr const TFunction bitCount_20E(BuiltInId::bitCount_UInt3,
                                        BuiltInName::bitCount,
                                        std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                       BuiltInParameters::p20E20E20E,
+                                       BuiltInParameters::p20E00D00D,
                                        1,
                                        StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 3, 1>(),
                                        EOpBitCount,
@@ -7883,7 +7960,7 @@
 constexpr const TFunction bitCount_30E(BuiltInId::bitCount_UInt4,
                                        BuiltInName::bitCount,
                                        std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                       BuiltInParameters::p30E30E_o_30E_o_30E,
+                                       BuiltInParameters::p30E00D00D,
                                        1,
                                        StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 4, 1>(),
                                        EOpBitCount,
@@ -7891,7 +7968,7 @@
 constexpr const TFunction findLSB_00D(BuiltInId::findLSB_Int1,
                                       BuiltInName::findLSB,
                                       std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                      BuiltInParameters::p00D00D00F,
+                                      BuiltInParameters::p00D00D00D00D,
                                       1,
                                       StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 1, 1>(),
                                       EOpFindLSB,
@@ -7899,7 +7976,7 @@
 constexpr const TFunction findLSB_10D(BuiltInId::findLSB_Int2,
                                       BuiltInName::findLSB,
                                       std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                      BuiltInParameters::p10D10D00D00D,
+                                      BuiltInParameters::p10D00D00D,
                                       1,
                                       StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 2, 1>(),
                                       EOpFindLSB,
@@ -7907,7 +7984,7 @@
 constexpr const TFunction findLSB_20D(BuiltInId::findLSB_Int3,
                                       BuiltInName::findLSB,
                                       std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                      BuiltInParameters::p20D20D20F,
+                                      BuiltInParameters::p20D00D00D,
                                       1,
                                       StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 3, 1>(),
                                       EOpFindLSB,
@@ -7915,7 +7992,7 @@
 constexpr const TFunction findLSB_30D(BuiltInId::findLSB_Int4,
                                       BuiltInName::findLSB,
                                       std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                      BuiltInParameters::p30D30D30F,
+                                      BuiltInParameters::p30D00D00D,
                                       1,
                                       StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 4, 1>(),
                                       EOpFindLSB,
@@ -7923,7 +8000,7 @@
 constexpr const TFunction findLSB_00E(BuiltInId::findLSB_UInt1,
                                       BuiltInName::findLSB,
                                       std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                      BuiltInParameters::p00E00E00D00D,
+                                      BuiltInParameters::p00E00D00D,
                                       1,
                                       StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 1, 1>(),
                                       EOpFindLSB,
@@ -7931,7 +8008,7 @@
 constexpr const TFunction findLSB_10E(BuiltInId::findLSB_UInt2,
                                       BuiltInName::findLSB,
                                       std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                      BuiltInParameters::p10E00E00E,
+                                      BuiltInParameters::p10E00D00D,
                                       1,
                                       StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 2, 1>(),
                                       EOpFindLSB,
@@ -7939,7 +8016,7 @@
 constexpr const TFunction findLSB_20E(BuiltInId::findLSB_UInt3,
                                       BuiltInName::findLSB,
                                       std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                      BuiltInParameters::p20E20E20E,
+                                      BuiltInParameters::p20E00D00D,
                                       1,
                                       StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 3, 1>(),
                                       EOpFindLSB,
@@ -7947,7 +8024,7 @@
 constexpr const TFunction findLSB_30E(BuiltInId::findLSB_UInt4,
                                       BuiltInName::findLSB,
                                       std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                      BuiltInParameters::p30E30E_o_30E_o_30E,
+                                      BuiltInParameters::p30E00D00D,
                                       1,
                                       StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 4, 1>(),
                                       EOpFindLSB,
@@ -7955,7 +8032,7 @@
 constexpr const TFunction findMSB_00D(BuiltInId::findMSB_Int1,
                                       BuiltInName::findMSB,
                                       std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                      BuiltInParameters::p00D00D00F,
+                                      BuiltInParameters::p00D00D00D00D,
                                       1,
                                       StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 1, 1>(),
                                       EOpFindMSB,
@@ -7963,7 +8040,7 @@
 constexpr const TFunction findMSB_10D(BuiltInId::findMSB_Int2,
                                       BuiltInName::findMSB,
                                       std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                      BuiltInParameters::p10D10D00D00D,
+                                      BuiltInParameters::p10D00D00D,
                                       1,
                                       StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 2, 1>(),
                                       EOpFindMSB,
@@ -7971,7 +8048,7 @@
 constexpr const TFunction findMSB_20D(BuiltInId::findMSB_Int3,
                                       BuiltInName::findMSB,
                                       std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                      BuiltInParameters::p20D20D20F,
+                                      BuiltInParameters::p20D00D00D,
                                       1,
                                       StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 3, 1>(),
                                       EOpFindMSB,
@@ -7979,7 +8056,7 @@
 constexpr const TFunction findMSB_30D(BuiltInId::findMSB_Int4,
                                       BuiltInName::findMSB,
                                       std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                      BuiltInParameters::p30D30D30F,
+                                      BuiltInParameters::p30D00D00D,
                                       1,
                                       StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 4, 1>(),
                                       EOpFindMSB,
@@ -7987,7 +8064,7 @@
 constexpr const TFunction findMSB_00E(BuiltInId::findMSB_UInt1,
                                       BuiltInName::findMSB,
                                       std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                      BuiltInParameters::p00E00E00D00D,
+                                      BuiltInParameters::p00E00D00D,
                                       1,
                                       StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 1, 1>(),
                                       EOpFindMSB,
@@ -7995,7 +8072,7 @@
 constexpr const TFunction findMSB_10E(BuiltInId::findMSB_UInt2,
                                       BuiltInName::findMSB,
                                       std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                      BuiltInParameters::p10E00E00E,
+                                      BuiltInParameters::p10E00D00D,
                                       1,
                                       StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 2, 1>(),
                                       EOpFindMSB,
@@ -8003,7 +8080,7 @@
 constexpr const TFunction findMSB_20E(BuiltInId::findMSB_UInt3,
                                       BuiltInName::findMSB,
                                       std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                      BuiltInParameters::p20E20E20E,
+                                      BuiltInParameters::p20E00D00D,
                                       1,
                                       StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 3, 1>(),
                                       EOpFindMSB,
@@ -8011,7 +8088,7 @@
 constexpr const TFunction findMSB_30E(BuiltInId::findMSB_UInt4,
                                       BuiltInName::findMSB,
                                       std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                      BuiltInParameters::p30E30E_o_30E_o_30E,
+                                      BuiltInParameters::p30E00D00D,
                                       1,
                                       StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 4, 1>(),
                                       EOpFindMSB,
@@ -8164,7 +8241,7 @@
     BuiltInId::texture2D_Sampler2D1_Float2,
     BuiltInName::texture2D,
     std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-    BuiltInParameters::p00I10B10Dx400D,
+    BuiltInParameters::p00I10B00B10D,
     2,
     StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 4, 1>(),
     EOpTexture2D,
@@ -8173,7 +8250,7 @@
     BuiltInId::texture2DProj_Sampler2D1_Float3,
     BuiltInName::texture2DProj,
     std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-    BuiltInParameters::p00I20B10B10B10D,
+    BuiltInParameters::p00I20B00B10D,
     2,
     StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 4, 1>(),
     EOpTexture2DProj,
@@ -8182,7 +8259,7 @@
     BuiltInId::texture2DProj_Sampler2D1_Float4,
     BuiltInName::texture2DProj,
     std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-    BuiltInParameters::p00I30B10D00B,
+    BuiltInParameters::p00I30B00B10D,
     2,
     StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 4, 1>(),
     EOpTexture2DProj,
@@ -8200,7 +8277,7 @@
     BuiltInId::texture3D_Sampler3D1_Float3,
     BuiltInName::texture3D,
     std::array<TExtension, 1u>{{TExtension::OES_texture_3D}},
-    BuiltInParameters::p00J20B20D00B,
+    BuiltInParameters::p00J20B00B20D,
     2,
     StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 4, 1>(),
     EOpTexture3D,
@@ -8209,7 +8286,7 @@
     BuiltInId::texture3DProj_Sampler3D1_Float4,
     BuiltInName::texture3DProj,
     std::array<TExtension, 1u>{{TExtension::OES_texture_3D}},
-    BuiltInParameters::p00J30B20D00B,
+    BuiltInParameters::p00J30B00B20D,
     2,
     StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 4, 1>(),
     EOpTexture3DProj,
@@ -8227,7 +8304,7 @@
     BuiltInId::shadow2DProjEXT_Sampler2DShadow1_Float4,
     BuiltInName::shadow2DProjEXT,
     std::array<TExtension, 1u>{{TExtension::EXT_shadow_samplers}},
-    BuiltInParameters::p00d30B10D00B,
+    BuiltInParameters::p00d30B00B10D,
     2,
     StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 1, 1>(),
     EOpShadow2DProjEXT,
@@ -8481,7 +8558,7 @@
 constexpr const TFunction texture_00I10B(BuiltInId::texture_Sampler2D1_Float2,
                                          BuiltInName::texture,
                                          std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                         BuiltInParameters::p00I10B10Dx400D,
+                                         BuiltInParameters::p00I10B00B10D,
                                          2,
                                          StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 4, 1>(),
                                          EOpTexture,
@@ -8489,7 +8566,7 @@
 constexpr const TFunction texture_00R10B(BuiltInId::texture_ISampler2D1_Float2,
                                          BuiltInName::texture,
                                          std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                         BuiltInParameters::p00R10B10D00D,
+                                         BuiltInParameters::p00R10B00B10D,
                                          2,
                                          StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 4, 1>(),
                                          EOpTexture,
@@ -8505,7 +8582,7 @@
 constexpr const TFunction texture_00J20B(BuiltInId::texture_Sampler3D1_Float3,
                                          BuiltInName::texture,
                                          std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                         BuiltInParameters::p00J20B20D00B,
+                                         BuiltInParameters::p00J20B00B20D,
                                          2,
                                          StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 4, 1>(),
                                          EOpTexture,
@@ -8513,7 +8590,7 @@
 constexpr const TFunction texture_00S20B(BuiltInId::texture_ISampler3D1_Float3,
                                          BuiltInName::texture,
                                          std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                         BuiltInParameters::p00S20B20B20B20D,
+                                         BuiltInParameters::p00S20B00B20D,
                                          2,
                                          StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 4, 1>(),
                                          EOpTexture,
@@ -8521,7 +8598,7 @@
 constexpr const TFunction texture_00Y20B(BuiltInId::texture_USampler3D1_Float3,
                                          BuiltInName::texture,
                                          std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                         BuiltInParameters::p00Y20B20B20B20D,
+                                         BuiltInParameters::p00Y20B00B20D,
                                          2,
                                          StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 4, 1>(),
                                          EOpTexture,
@@ -8537,7 +8614,7 @@
 constexpr const TFunction texture_00T20B(BuiltInId::texture_ISamplerCube1_Float3,
                                          BuiltInName::texture,
                                          std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                         BuiltInParameters::p00T20B20B20B,
+                                         BuiltInParameters::p00T20B00B,
                                          2,
                                          StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 4, 1>(),
                                          EOpTexture,
@@ -8561,7 +8638,7 @@
 constexpr const TFunction texture_00U20B(BuiltInId::texture_ISampler2DArray1_Float3,
                                          BuiltInName::texture,
                                          std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                         BuiltInParameters::p00U20B10B10B10D,
+                                         BuiltInParameters::p00U20B00B10D,
                                          2,
                                          StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 4, 1>(),
                                          EOpTexture,
@@ -8569,7 +8646,7 @@
 constexpr const TFunction texture_00a20B(BuiltInId::texture_USampler2DArray1_Float3,
                                          BuiltInName::texture,
                                          std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                         BuiltInParameters::p00a20B10B10B10D,
+                                         BuiltInParameters::p00a20B00B10D,
                                          2,
                                          StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 4, 1>(),
                                          EOpTexture,
@@ -8585,7 +8662,7 @@
 constexpr const TFunction texture_00e30B(BuiltInId::texture_SamplerCubeShadow1_Float4,
                                          BuiltInName::texture,
                                          std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                         BuiltInParameters::p00e30B20B20B,
+                                         BuiltInParameters::p00e30B00B,
                                          2,
                                          StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 1, 1>(),
                                          EOpTexture,
@@ -8601,7 +8678,7 @@
 constexpr const TFunction texture_00k30B(BuiltInId::texture_SamplerCubeArray1_Float4,
                                          BuiltInName::texture,
                                          std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                         BuiltInParameters::p00k30B20B20B,
+                                         BuiltInParameters::p00k30B00B,
                                          2,
                                          StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 4, 1>(),
                                          EOpTexture,
@@ -8617,7 +8694,7 @@
 constexpr const TFunction texture_00x30B(BuiltInId::texture_USamplerCubeArray1_Float4,
                                          BuiltInName::texture,
                                          std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                         BuiltInParameters::p00x30B00D,
+                                         BuiltInParameters::p00x30B00B,
                                          2,
                                          StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 4, 1>(),
                                          EOpTexture,
@@ -8636,7 +8713,7 @@
     BuiltInName::textureExt,
     std::array<TExtension, 2u>{
         {TExtension::OES_texture_cube_map_array, TExtension::EXT_texture_cube_map_array}},
-    BuiltInParameters::p00k30B20B20B,
+    BuiltInParameters::p00k30B00B,
     2,
     StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 4, 1>(),
     EOpTexture,
@@ -8656,7 +8733,7 @@
     BuiltInName::textureExt,
     std::array<TExtension, 2u>{
         {TExtension::OES_texture_cube_map_array, TExtension::EXT_texture_cube_map_array}},
-    BuiltInParameters::p00x30B00D,
+    BuiltInParameters::p00x30B00B,
     2,
     StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 4, 1>(),
     EOpTexture,
@@ -8709,7 +8786,7 @@
     BuiltInId::textureProj_Sampler2D1_Float3,
     BuiltInName::textureProj,
     std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-    BuiltInParameters::p00I20B10B10B10D,
+    BuiltInParameters::p00I20B00B10D,
     2,
     StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 4, 1>(),
     EOpTextureProj,
@@ -8718,7 +8795,7 @@
     BuiltInId::textureProj_ISampler2D1_Float3,
     BuiltInName::textureProj,
     std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-    BuiltInParameters::p00R20B10B10B10D,
+    BuiltInParameters::p00R20B00B10D,
     2,
     StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 4, 1>(),
     EOpTextureProj,
@@ -8727,7 +8804,7 @@
     BuiltInId::textureProj_USampler2D1_Float3,
     BuiltInName::textureProj,
     std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-    BuiltInParameters::p00X20B10D00B,
+    BuiltInParameters::p00X20B00B10D,
     2,
     StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 4, 1>(),
     EOpTextureProj,
@@ -8736,7 +8813,7 @@
     BuiltInId::textureProj_Sampler2D1_Float4,
     BuiltInName::textureProj,
     std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-    BuiltInParameters::p00I30B10D00B,
+    BuiltInParameters::p00I30B00B10D,
     2,
     StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 4, 1>(),
     EOpTextureProj,
@@ -8745,7 +8822,7 @@
     BuiltInId::textureProj_ISampler2D1_Float4,
     BuiltInName::textureProj,
     std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-    BuiltInParameters::p00R30B10B10B10D,
+    BuiltInParameters::p00R30B00B10D,
     2,
     StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 4, 1>(),
     EOpTextureProj,
@@ -8763,7 +8840,7 @@
     BuiltInId::textureProj_Sampler3D1_Float4,
     BuiltInName::textureProj,
     std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-    BuiltInParameters::p00J30B20D00B,
+    BuiltInParameters::p00J30B00B20D,
     2,
     StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 4, 1>(),
     EOpTextureProj,
@@ -8772,7 +8849,7 @@
     BuiltInId::textureProj_ISampler3D1_Float4,
     BuiltInName::textureProj,
     std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-    BuiltInParameters::p00S30B20B20B20D,
+    BuiltInParameters::p00S30B00B20D,
     2,
     StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 4, 1>(),
     EOpTextureProj,
@@ -8781,7 +8858,7 @@
     BuiltInId::textureProj_USampler3D1_Float4,
     BuiltInName::textureProj,
     std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-    BuiltInParameters::p00Y30B20D00B,
+    BuiltInParameters::p00Y30B00B20D,
     2,
     StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 4, 1>(),
     EOpTextureProj,
@@ -8790,7 +8867,7 @@
     BuiltInId::textureProj_Sampler2DShadow1_Float4,
     BuiltInName::textureProj,
     std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-    BuiltInParameters::p00d30B10D00B,
+    BuiltInParameters::p00d30B00B10D,
     2,
     StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 1, 1>(),
     EOpTextureProj,
@@ -10327,7 +10404,7 @@
     BuiltInId::textureOffset_ISampler2D1_Float2_Int2,
     BuiltInName::textureOffset,
     std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-    BuiltInParameters::p00R10B10D00D,
+    BuiltInParameters::p00R10B10D00B,
     3,
     StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 4, 1>(),
     EOpTextureOffset,
@@ -10381,7 +10458,7 @@
     BuiltInId::textureOffset_Sampler2DArray1_Float3_Int2,
     BuiltInName::textureOffset,
     std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-    BuiltInParameters::p00L20B10D00D,
+    BuiltInParameters::p00L20B10D00B,
     3,
     StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 4, 1>(),
     EOpTextureOffset,
@@ -10390,7 +10467,7 @@
     BuiltInId::textureOffset_ISampler2DArray1_Float3_Int2,
     BuiltInName::textureOffset,
     std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-    BuiltInParameters::p00U20B10Dx400D,
+    BuiltInParameters::p00U20B10D00B,
     3,
     StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 4, 1>(),
     EOpTextureOffset,
@@ -10399,7 +10476,7 @@
     BuiltInId::textureOffset_USampler2DArray1_Float3_Int2,
     BuiltInName::textureOffset,
     std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-    BuiltInParameters::p00a20B10D00D,
+    BuiltInParameters::p00a20B10D00B,
     3,
     StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 4, 1>(),
     EOpTextureOffset,
@@ -11128,7 +11205,7 @@
     BuiltInId::textureGather_Sampler2D1_Float2,
     BuiltInName::textureGather,
     std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-    BuiltInParameters::p00I10B10Dx400D,
+    BuiltInParameters::p00I10B00B10D,
     2,
     StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 4, 1>(),
     EOpTextureGather,
@@ -11137,7 +11214,7 @@
     BuiltInId::textureGather_ISampler2D1_Float2,
     BuiltInName::textureGather,
     std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-    BuiltInParameters::p00R10B10D00D,
+    BuiltInParameters::p00R10B00B10D,
     2,
     StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 4, 1>(),
     EOpTextureGather,
@@ -11191,7 +11268,7 @@
     BuiltInId::textureGather_ISampler2DArray1_Float3,
     BuiltInName::textureGather,
     std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-    BuiltInParameters::p00U20B10B10B10D,
+    BuiltInParameters::p00U20B00B10D,
     2,
     StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 4, 1>(),
     EOpTextureGather,
@@ -11200,7 +11277,7 @@
     BuiltInId::textureGather_USampler2DArray1_Float3,
     BuiltInName::textureGather,
     std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-    BuiltInParameters::p00a20B10B10B10D,
+    BuiltInParameters::p00a20B00B10D,
     2,
     StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 4, 1>(),
     EOpTextureGather,
@@ -11245,7 +11322,7 @@
     BuiltInId::textureGather_ISamplerCube1_Float3,
     BuiltInName::textureGather,
     std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-    BuiltInParameters::p00T20B20B20B,
+    BuiltInParameters::p00T20B00B,
     2,
     StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 4, 1>(),
     EOpTextureGather,
@@ -11290,7 +11367,7 @@
     BuiltInId::textureGather_SamplerCubeArray1_Float4,
     BuiltInName::textureGather,
     std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-    BuiltInParameters::p00k30B20B20B,
+    BuiltInParameters::p00k30B00B,
     2,
     StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 4, 1>(),
     EOpTextureGather,
@@ -11308,7 +11385,7 @@
     BuiltInId::textureGather_USamplerCubeArray1_Float4,
     BuiltInName::textureGather,
     std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-    BuiltInParameters::p00x30B00D,
+    BuiltInParameters::p00x30B00B,
     2,
     StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 4, 1>(),
     EOpTextureGather,
@@ -11354,7 +11431,7 @@
     BuiltInName::textureGatherExt,
     std::array<TExtension, 2u>{
         {TExtension::OES_texture_cube_map_array, TExtension::EXT_texture_cube_map_array}},
-    BuiltInParameters::p00k30B20B20B,
+    BuiltInParameters::p00k30B00B,
     2,
     StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 4, 1>(),
     EOpTextureGather,
@@ -11374,7 +11451,7 @@
     BuiltInName::textureGatherExt,
     std::array<TExtension, 2u>{
         {TExtension::OES_texture_cube_map_array, TExtension::EXT_texture_cube_map_array}},
-    BuiltInParameters::p00x30B00D,
+    BuiltInParameters::p00x30B00B,
     2,
     StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 4, 1>(),
     EOpTextureGather,
@@ -11486,7 +11563,7 @@
     BuiltInId::textureGatherOffset_ISampler2D1_Float2_Int2,
     BuiltInName::textureGatherOffset,
     std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-    BuiltInParameters::p00R10B10D00D,
+    BuiltInParameters::p00R10B10D00B,
     3,
     StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 4, 1>(),
     EOpTextureGatherOffset,
@@ -11504,7 +11581,7 @@
     BuiltInId::textureGatherOffset_Sampler2DArray1_Float3_Int2,
     BuiltInName::textureGatherOffset,
     std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-    BuiltInParameters::p00L20B10D00D,
+    BuiltInParameters::p00L20B10D00B,
     3,
     StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 4, 1>(),
     EOpTextureGatherOffset,
@@ -11513,7 +11590,7 @@
     BuiltInId::textureGatherOffset_ISampler2DArray1_Float3_Int2,
     BuiltInName::textureGatherOffset,
     std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-    BuiltInParameters::p00U20B10Dx400D,
+    BuiltInParameters::p00U20B10D00B,
     3,
     StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 4, 1>(),
     EOpTextureGatherOffset,
@@ -11522,7 +11599,7 @@
     BuiltInId::textureGatherOffset_USampler2DArray1_Float3_Int2,
     BuiltInName::textureGatherOffset,
     std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-    BuiltInParameters::p00a20B10D00D,
+    BuiltInParameters::p00a20B10D00B,
     3,
     StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 4, 1>(),
     EOpTextureGatherOffset,
@@ -11873,7 +11950,7 @@
                                       BuiltInName::dFdxExt,
                                       std::array<TExtension, 1u>{
                                           {TExtension::OES_standard_derivatives}},
-                                      BuiltInParameters::p00B30B,
+                                      BuiltInParameters::p00B00B00B,
                                       1,
                                       StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 1, 1>(),
                                       EOpDFdx,
@@ -11882,7 +11959,7 @@
                                       BuiltInName::dFdxExt,
                                       std::array<TExtension, 1u>{
                                           {TExtension::OES_standard_derivatives}},
-                                      BuiltInParameters::p10B00D,
+                                      BuiltInParameters::p10B00B00B,
                                       1,
                                       StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 2, 1>(),
                                       EOpDFdx,
@@ -11891,7 +11968,7 @@
                                       BuiltInName::dFdxExt,
                                       std::array<TExtension, 1u>{
                                           {TExtension::OES_standard_derivatives}},
-                                      BuiltInParameters::p20B20B00B,
+                                      BuiltInParameters::p20B00B00B,
                                       1,
                                       StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 3, 1>(),
                                       EOpDFdx,
@@ -11900,7 +11977,7 @@
                                       BuiltInName::dFdxExt,
                                       std::array<TExtension, 1u>{
                                           {TExtension::OES_standard_derivatives}},
-                                      BuiltInParameters::p30B10B,
+                                      BuiltInParameters::p30B00B00B,
                                       1,
                                       StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 4, 1>(),
                                       EOpDFdx,
@@ -11909,7 +11986,7 @@
                                       BuiltInName::dFdyExt,
                                       std::array<TExtension, 1u>{
                                           {TExtension::OES_standard_derivatives}},
-                                      BuiltInParameters::p00B30B,
+                                      BuiltInParameters::p00B00B00B,
                                       1,
                                       StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 1, 1>(),
                                       EOpDFdy,
@@ -11918,7 +11995,7 @@
                                       BuiltInName::dFdyExt,
                                       std::array<TExtension, 1u>{
                                           {TExtension::OES_standard_derivatives}},
-                                      BuiltInParameters::p10B00D,
+                                      BuiltInParameters::p10B00B00B,
                                       1,
                                       StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 2, 1>(),
                                       EOpDFdy,
@@ -11927,7 +12004,7 @@
                                       BuiltInName::dFdyExt,
                                       std::array<TExtension, 1u>{
                                           {TExtension::OES_standard_derivatives}},
-                                      BuiltInParameters::p20B20B00B,
+                                      BuiltInParameters::p20B00B00B,
                                       1,
                                       StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 3, 1>(),
                                       EOpDFdy,
@@ -11936,7 +12013,7 @@
                                       BuiltInName::dFdyExt,
                                       std::array<TExtension, 1u>{
                                           {TExtension::OES_standard_derivatives}},
-                                      BuiltInParameters::p30B10B,
+                                      BuiltInParameters::p30B00B00B,
                                       1,
                                       StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 4, 1>(),
                                       EOpDFdy,
@@ -11945,7 +12022,7 @@
                                         BuiltInName::fwidthExt,
                                         std::array<TExtension, 1u>{
                                             {TExtension::OES_standard_derivatives}},
-                                        BuiltInParameters::p00B30B,
+                                        BuiltInParameters::p00B00B00B,
                                         1,
                                         StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 1, 1>(),
                                         EOpFwidth,
@@ -11954,7 +12031,7 @@
                                         BuiltInName::fwidthExt,
                                         std::array<TExtension, 1u>{
                                             {TExtension::OES_standard_derivatives}},
-                                        BuiltInParameters::p10B00D,
+                                        BuiltInParameters::p10B00B00B,
                                         1,
                                         StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 2, 1>(),
                                         EOpFwidth,
@@ -11963,7 +12040,7 @@
                                         BuiltInName::fwidthExt,
                                         std::array<TExtension, 1u>{
                                             {TExtension::OES_standard_derivatives}},
-                                        BuiltInParameters::p20B20B00B,
+                                        BuiltInParameters::p20B00B00B,
                                         1,
                                         StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 3, 1>(),
                                         EOpFwidth,
@@ -11972,7 +12049,7 @@
                                         BuiltInName::fwidthExt,
                                         std::array<TExtension, 1u>{
                                             {TExtension::OES_standard_derivatives}},
-                                        BuiltInParameters::p30B10B,
+                                        BuiltInParameters::p30B00B00B,
                                         1,
                                         StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 4, 1>(),
                                         EOpFwidth,
@@ -11980,7 +12057,7 @@
 constexpr const TFunction dFdx_00B(BuiltInId::dFdx_Float1,
                                    BuiltInName::dFdx,
                                    std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                   BuiltInParameters::p00B30B,
+                                   BuiltInParameters::p00B00B00B,
                                    1,
                                    StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 1, 1>(),
                                    EOpDFdx,
@@ -11988,7 +12065,7 @@
 constexpr const TFunction dFdx_10B(BuiltInId::dFdx_Float2,
                                    BuiltInName::dFdx,
                                    std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                   BuiltInParameters::p10B00D,
+                                   BuiltInParameters::p10B00B00B,
                                    1,
                                    StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 2, 1>(),
                                    EOpDFdx,
@@ -11996,7 +12073,7 @@
 constexpr const TFunction dFdx_20B(BuiltInId::dFdx_Float3,
                                    BuiltInName::dFdx,
                                    std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                   BuiltInParameters::p20B20B00B,
+                                   BuiltInParameters::p20B00B00B,
                                    1,
                                    StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 3, 1>(),
                                    EOpDFdx,
@@ -12004,7 +12081,7 @@
 constexpr const TFunction dFdx_30B(BuiltInId::dFdx_Float4,
                                    BuiltInName::dFdx,
                                    std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                   BuiltInParameters::p30B10B,
+                                   BuiltInParameters::p30B00B00B,
                                    1,
                                    StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 4, 1>(),
                                    EOpDFdx,
@@ -12012,7 +12089,7 @@
 constexpr const TFunction dFdy_00B(BuiltInId::dFdy_Float1,
                                    BuiltInName::dFdy,
                                    std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                   BuiltInParameters::p00B30B,
+                                   BuiltInParameters::p00B00B00B,
                                    1,
                                    StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 1, 1>(),
                                    EOpDFdy,
@@ -12020,7 +12097,7 @@
 constexpr const TFunction dFdy_10B(BuiltInId::dFdy_Float2,
                                    BuiltInName::dFdy,
                                    std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                   BuiltInParameters::p10B00D,
+                                   BuiltInParameters::p10B00B00B,
                                    1,
                                    StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 2, 1>(),
                                    EOpDFdy,
@@ -12028,7 +12105,7 @@
 constexpr const TFunction dFdy_20B(BuiltInId::dFdy_Float3,
                                    BuiltInName::dFdy,
                                    std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                   BuiltInParameters::p20B20B00B,
+                                   BuiltInParameters::p20B00B00B,
                                    1,
                                    StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 3, 1>(),
                                    EOpDFdy,
@@ -12036,7 +12113,7 @@
 constexpr const TFunction dFdy_30B(BuiltInId::dFdy_Float4,
                                    BuiltInName::dFdy,
                                    std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                   BuiltInParameters::p30B10B,
+                                   BuiltInParameters::p30B00B00B,
                                    1,
                                    StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 4, 1>(),
                                    EOpDFdy,
@@ -12044,7 +12121,7 @@
 constexpr const TFunction fwidth_00B(BuiltInId::fwidth_Float1,
                                      BuiltInName::fwidth,
                                      std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                     BuiltInParameters::p00B30B,
+                                     BuiltInParameters::p00B00B00B,
                                      1,
                                      StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 1, 1>(),
                                      EOpFwidth,
@@ -12052,7 +12129,7 @@
 constexpr const TFunction fwidth_10B(BuiltInId::fwidth_Float2,
                                      BuiltInName::fwidth,
                                      std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                     BuiltInParameters::p10B00D,
+                                     BuiltInParameters::p10B00B00B,
                                      1,
                                      StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 2, 1>(),
                                      EOpFwidth,
@@ -12060,7 +12137,7 @@
 constexpr const TFunction fwidth_20B(BuiltInId::fwidth_Float3,
                                      BuiltInName::fwidth,
                                      std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                     BuiltInParameters::p20B20B00B,
+                                     BuiltInParameters::p20B00B00B,
                                      1,
                                      StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 3, 1>(),
                                      EOpFwidth,
@@ -12068,7 +12145,7 @@
 constexpr const TFunction fwidth_30B(BuiltInId::fwidth_Float4,
                                      BuiltInName::fwidth,
                                      std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                     BuiltInParameters::p30B10B,
+                                     BuiltInParameters::p30B00B00B,
                                      1,
                                      StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 4, 1>(),
                                      EOpFwidth,
@@ -12077,7 +12154,7 @@
     BuiltInId::interpolateAtCentroid_Float1,
     BuiltInName::interpolateAtCentroid,
     std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-    BuiltInParameters::p00B30B,
+    BuiltInParameters::p00B00B00B,
     1,
     StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 1, 1>(),
     EOpInterpolateAtCentroid,
@@ -12086,7 +12163,7 @@
     BuiltInId::interpolateAtCentroid_Float2,
     BuiltInName::interpolateAtCentroid,
     std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-    BuiltInParameters::p10B00D,
+    BuiltInParameters::p10B00B00B,
     1,
     StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 2, 1>(),
     EOpInterpolateAtCentroid,
@@ -12095,7 +12172,7 @@
     BuiltInId::interpolateAtCentroid_Float3,
     BuiltInName::interpolateAtCentroid,
     std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-    BuiltInParameters::p20B20B00B,
+    BuiltInParameters::p20B00B00B,
     1,
     StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 3, 1>(),
     EOpInterpolateAtCentroid,
@@ -12104,7 +12181,7 @@
     BuiltInId::interpolateAtCentroid_Float4,
     BuiltInName::interpolateAtCentroid,
     std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-    BuiltInParameters::p30B10B,
+    BuiltInParameters::p30B00B00B,
     1,
     StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 4, 1>(),
     EOpInterpolateAtCentroid,
@@ -12185,7 +12262,7 @@
     BuiltInId::interpolateAtCentroidExt_Float1,
     BuiltInName::interpolateAtCentroidExt,
     std::array<TExtension, 1u>{{TExtension::OES_shader_multisample_interpolation}},
-    BuiltInParameters::p00B30B,
+    BuiltInParameters::p00B00B00B,
     1,
     StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 1, 1>(),
     EOpInterpolateAtCentroid,
@@ -12194,7 +12271,7 @@
     BuiltInId::interpolateAtCentroidExt_Float2,
     BuiltInName::interpolateAtCentroidExt,
     std::array<TExtension, 1u>{{TExtension::OES_shader_multisample_interpolation}},
-    BuiltInParameters::p10B00D,
+    BuiltInParameters::p10B00B00B,
     1,
     StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 2, 1>(),
     EOpInterpolateAtCentroid,
@@ -12203,7 +12280,7 @@
     BuiltInId::interpolateAtCentroidExt_Float3,
     BuiltInName::interpolateAtCentroidExt,
     std::array<TExtension, 1u>{{TExtension::OES_shader_multisample_interpolation}},
-    BuiltInParameters::p20B20B00B,
+    BuiltInParameters::p20B00B00B,
     1,
     StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 3, 1>(),
     EOpInterpolateAtCentroid,
@@ -12212,7 +12289,7 @@
     BuiltInId::interpolateAtCentroidExt_Float4,
     BuiltInName::interpolateAtCentroidExt,
     std::array<TExtension, 1u>{{TExtension::OES_shader_multisample_interpolation}},
-    BuiltInParameters::p30B10B,
+    BuiltInParameters::p30B00B00B,
     1,
     StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 4, 1>(),
     EOpInterpolateAtCentroid,
@@ -12456,7 +12533,7 @@
 constexpr const TFunction imageSize_00z(BuiltInId::imageSize_Image2D1,
                                         BuiltInName::imageSize,
                                         std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                        BuiltInParameters::p00z10D00E00E,
+                                        BuiltInParameters::p00z10D00B,
                                         1,
                                         StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 2, 1>(),
                                         EOpImageSize,
@@ -12464,7 +12541,7 @@
 constexpr const TFunction imageSize_01K(BuiltInId::imageSize_IImage2D1,
                                         BuiltInName::imageSize,
                                         std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                        BuiltInParameters::p01K10D30D,
+                                        BuiltInParameters::p01K10D00B,
                                         1,
                                         StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 2, 1>(),
                                         EOpImageSize,
@@ -12472,7 +12549,7 @@
 constexpr const TFunction imageSize_01V(BuiltInId::imageSize_UImage2D1,
                                         BuiltInName::imageSize,
                                         std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                        BuiltInParameters::p01V10D00E00E,
+                                        BuiltInParameters::p01V10D00B,
                                         1,
                                         StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 2, 1>(),
                                         EOpImageSize,
@@ -12480,7 +12557,7 @@
 constexpr const TFunction imageSize_01A(BuiltInId::imageSize_Image3D1,
                                         BuiltInName::imageSize,
                                         std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                        BuiltInParameters::p01A20D00E00E,
+                                        BuiltInParameters::p01A20D00B,
                                         1,
                                         StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 3, 1>(),
                                         EOpImageSize,
@@ -12488,7 +12565,7 @@
 constexpr const TFunction imageSize_01L(BuiltInId::imageSize_IImage3D1,
                                         BuiltInName::imageSize,
                                         std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                        BuiltInParameters::p01L20D30D,
+                                        BuiltInParameters::p01L20D00B,
                                         1,
                                         StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 3, 1>(),
                                         EOpImageSize,
@@ -12496,7 +12573,7 @@
 constexpr const TFunction imageSize_01W(BuiltInId::imageSize_UImage3D1,
                                         BuiltInName::imageSize,
                                         std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                        BuiltInParameters::p01W20D30E,
+                                        BuiltInParameters::p01W20D00B,
                                         1,
                                         StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 3, 1>(),
                                         EOpImageSize,
@@ -12504,7 +12581,7 @@
 constexpr const TFunction imageSize_01B(BuiltInId::imageSize_Image2DArray1,
                                         BuiltInName::imageSize,
                                         std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                        BuiltInParameters::p01B20D00E00E,
+                                        BuiltInParameters::p01B20D00B,
                                         1,
                                         StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 3, 1>(),
                                         EOpImageSize,
@@ -12512,7 +12589,7 @@
 constexpr const TFunction imageSize_01M(BuiltInId::imageSize_IImage2DArray1,
                                         BuiltInName::imageSize,
                                         std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                        BuiltInParameters::p01M20D00E00E,
+                                        BuiltInParameters::p01M20D00B,
                                         1,
                                         StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 3, 1>(),
                                         EOpImageSize,
@@ -12520,7 +12597,7 @@
 constexpr const TFunction imageSize_01X(BuiltInId::imageSize_UImage2DArray1,
                                         BuiltInName::imageSize,
                                         std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                        BuiltInParameters::p01X20D00D00D,
+                                        BuiltInParameters::p01X20D00B,
                                         1,
                                         StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 3, 1>(),
                                         EOpImageSize,
@@ -12528,7 +12605,7 @@
 constexpr const TFunction imageSize_01C(BuiltInId::imageSize_ImageCube1,
                                         BuiltInName::imageSize,
                                         std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                        BuiltInParameters::p01C20D00D00D,
+                                        BuiltInParameters::p01C20D00B,
                                         1,
                                         StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 2, 1>(),
                                         EOpImageSize,
@@ -12536,7 +12613,7 @@
 constexpr const TFunction imageSize_01N(BuiltInId::imageSize_IImageCube1,
                                         BuiltInName::imageSize,
                                         std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                        BuiltInParameters::p01N20D00D00D,
+                                        BuiltInParameters::p01N20D00B,
                                         1,
                                         StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 2, 1>(),
                                         EOpImageSize,
@@ -12552,7 +12629,7 @@
 constexpr const TFunction imageSize_01H(BuiltInId::imageSize_ImageCubeArray1,
                                         BuiltInName::imageSize,
                                         std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                        BuiltInParameters::p01H20D30B,
+                                        BuiltInParameters::p01H20D00B,
                                         1,
                                         StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 3, 1>(),
                                         EOpImageSize,
@@ -12560,7 +12637,7 @@
 constexpr const TFunction imageSize_01S(BuiltInId::imageSize_IImageCubeArray1,
                                         BuiltInName::imageSize,
                                         std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                        BuiltInParameters::p01S20D00E00E,
+                                        BuiltInParameters::p01S20D00B,
                                         1,
                                         StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 3, 1>(),
                                         EOpImageSize,
@@ -12568,7 +12645,7 @@
 constexpr const TFunction imageSize_01d(BuiltInId::imageSize_UImageCubeArray1,
                                         BuiltInName::imageSize,
                                         std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                        BuiltInParameters::p01d20D00E00E,
+                                        BuiltInParameters::p01d20D00B,
                                         1,
                                         StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 3, 1>(),
                                         EOpImageSize,
@@ -12578,7 +12655,7 @@
                                            std::array<TExtension, 2u>{
                                                {TExtension::OES_texture_cube_map_array,
                                                 TExtension::EXT_texture_cube_map_array}},
-                                           BuiltInParameters::p01H20D30B,
+                                           BuiltInParameters::p01H20D00B,
                                            1,
                                            StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 3, 1>(),
                                            EOpImageSize,
@@ -12588,7 +12665,7 @@
                                            std::array<TExtension, 2u>{
                                                {TExtension::OES_texture_cube_map_array,
                                                 TExtension::EXT_texture_cube_map_array}},
-                                           BuiltInParameters::p01S20D00E00E,
+                                           BuiltInParameters::p01S20D00B,
                                            1,
                                            StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 3, 1>(),
                                            EOpImageSize,
@@ -12598,7 +12675,7 @@
                                            std::array<TExtension, 2u>{
                                                {TExtension::OES_texture_cube_map_array,
                                                 TExtension::EXT_texture_cube_map_array}},
-                                           BuiltInParameters::p01d20D00E00E,
+                                           BuiltInParameters::p01d20D00B,
                                            1,
                                            StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 3, 1>(),
                                            EOpImageSize,
@@ -12614,7 +12691,7 @@
 constexpr const TFunction imageSize_01U(BuiltInId::imageSize_IImageBuffer1,
                                         BuiltInName::imageSize,
                                         std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                        BuiltInParameters::p01U00D00D00D,
+                                        BuiltInParameters::p01U00D00B,
                                         1,
                                         StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 1, 1>(),
                                         EOpImageSize,
@@ -12622,7 +12699,7 @@
 constexpr const TFunction imageSize_01f(BuiltInId::imageSize_UImageBuffer1,
                                         BuiltInName::imageSize,
                                         std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                        BuiltInParameters::p01f00D00D00D,
+                                        BuiltInParameters::p01f00D00B,
                                         1,
                                         StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 1, 1>(),
                                         EOpImageSize,
@@ -12640,7 +12717,7 @@
     BuiltInId::imageSizeExt_IImageBuffer1,
     BuiltInName::imageSizeExt,
     std::array<TExtension, 2u>{{TExtension::OES_texture_buffer, TExtension::EXT_texture_buffer}},
-    BuiltInParameters::p01U00D00D00D,
+    BuiltInParameters::p01U00D00B,
     1,
     StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 1, 1>(),
     EOpImageSize,
@@ -12649,7 +12726,7 @@
     BuiltInId::imageSizeExt_UImageBuffer1,
     BuiltInName::imageSizeExt,
     std::array<TExtension, 2u>{{TExtension::OES_texture_buffer, TExtension::EXT_texture_buffer}},
-    BuiltInParameters::p01f00D00D00D,
+    BuiltInParameters::p01f00D00B,
     1,
     StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 1, 1>(),
     EOpImageSize,
@@ -12877,7 +12954,7 @@
     BuiltInId::imageLoad_Image2D1_Int2,
     BuiltInName::imageLoad,
     std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-    BuiltInParameters::p00z10D00E00E,
+    BuiltInParameters::p00z10D00B,
     2,
     StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 4, 1>(),
     EOpImageLoad,
@@ -12885,7 +12962,7 @@
 constexpr const TFunction imageLoad_01K10D(BuiltInId::imageLoad_IImage2D1_Int2,
                                            BuiltInName::imageLoad,
                                            std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                           BuiltInParameters::p01K10D30D,
+                                           BuiltInParameters::p01K10D00B,
                                            2,
                                            StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 4, 1>(),
                                            EOpImageLoad,
@@ -12894,7 +12971,7 @@
     BuiltInId::imageLoad_UImage2D1_Int2,
     BuiltInName::imageLoad,
     std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-    BuiltInParameters::p01V10D00E00E,
+    BuiltInParameters::p01V10D00B,
     2,
     StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 4, 1>(),
     EOpImageLoad,
@@ -12903,7 +12980,7 @@
     BuiltInId::imageLoad_Image3D1_Int3,
     BuiltInName::imageLoad,
     std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-    BuiltInParameters::p01A20D00E00E,
+    BuiltInParameters::p01A20D00B,
     2,
     StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 4, 1>(),
     EOpImageLoad,
@@ -12911,7 +12988,7 @@
 constexpr const TFunction imageLoad_01L20D(BuiltInId::imageLoad_IImage3D1_Int3,
                                            BuiltInName::imageLoad,
                                            std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                           BuiltInParameters::p01L20D30D,
+                                           BuiltInParameters::p01L20D00B,
                                            2,
                                            StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 4, 1>(),
                                            EOpImageLoad,
@@ -12920,7 +12997,7 @@
     BuiltInId::imageLoad_UImage3D1_Int3,
     BuiltInName::imageLoad,
     std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-    BuiltInParameters::p01W20D30E,
+    BuiltInParameters::p01W20D00B,
     2,
     StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 4, 1>(),
     EOpImageLoad,
@@ -12929,7 +13006,7 @@
     BuiltInId::imageLoad_Image2DArray1_Int3,
     BuiltInName::imageLoad,
     std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-    BuiltInParameters::p01B20D00E00E,
+    BuiltInParameters::p01B20D00B,
     2,
     StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 4, 1>(),
     EOpImageLoad,
@@ -12937,7 +13014,7 @@
 constexpr const TFunction imageLoad_01M20D(BuiltInId::imageLoad_IImage2DArray1_Int3,
                                            BuiltInName::imageLoad,
                                            std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                           BuiltInParameters::p01M20D00E00E,
+                                           BuiltInParameters::p01M20D00B,
                                            2,
                                            StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 4, 1>(),
                                            EOpImageLoad,
@@ -12946,7 +13023,7 @@
     BuiltInId::imageLoad_UImage2DArray1_Int3,
     BuiltInName::imageLoad,
     std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-    BuiltInParameters::p01X20D00D00D,
+    BuiltInParameters::p01X20D00B,
     2,
     StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 4, 1>(),
     EOpImageLoad,
@@ -12955,7 +13032,7 @@
     BuiltInId::imageLoad_ImageCube1_Int3,
     BuiltInName::imageLoad,
     std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-    BuiltInParameters::p01C20D00D00D,
+    BuiltInParameters::p01C20D00B,
     2,
     StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 4, 1>(),
     EOpImageLoad,
@@ -12963,7 +13040,7 @@
 constexpr const TFunction imageLoad_01N20D(BuiltInId::imageLoad_IImageCube1_Int3,
                                            BuiltInName::imageLoad,
                                            std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                           BuiltInParameters::p01N20D00D00D,
+                                           BuiltInParameters::p01N20D00B,
                                            2,
                                            StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 4, 1>(),
                                            EOpImageLoad,
@@ -12981,7 +13058,7 @@
     BuiltInId::imageLoad_ImageCubeArray1_Int3,
     BuiltInName::imageLoad,
     std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-    BuiltInParameters::p01H20D30B,
+    BuiltInParameters::p01H20D00B,
     2,
     StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 4, 1>(),
     EOpImageLoad,
@@ -12989,7 +13066,7 @@
 constexpr const TFunction imageLoad_01S20D(BuiltInId::imageLoad_IImageCubeArray1_Int3,
                                            BuiltInName::imageLoad,
                                            std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                           BuiltInParameters::p01S20D00E00E,
+                                           BuiltInParameters::p01S20D00B,
                                            2,
                                            StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 4, 1>(),
                                            EOpImageLoad,
@@ -12998,7 +13075,7 @@
     BuiltInId::imageLoad_UImageCubeArray1_Int3,
     BuiltInName::imageLoad,
     std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-    BuiltInParameters::p01d20D00E00E,
+    BuiltInParameters::p01d20D00B,
     2,
     StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 4, 1>(),
     EOpImageLoad,
@@ -13008,7 +13085,7 @@
     BuiltInName::imageLoadExt,
     std::array<TExtension, 2u>{
         {TExtension::OES_texture_cube_map_array, TExtension::EXT_texture_cube_map_array}},
-    BuiltInParameters::p01H20D30B,
+    BuiltInParameters::p01H20D00B,
     2,
     StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 4, 1>(),
     EOpImageLoad,
@@ -13018,7 +13095,7 @@
     BuiltInName::imageLoadExt,
     std::array<TExtension, 2u>{
         {TExtension::OES_texture_cube_map_array, TExtension::EXT_texture_cube_map_array}},
-    BuiltInParameters::p01S20D00E00E,
+    BuiltInParameters::p01S20D00B,
     2,
     StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 4, 1>(),
     EOpImageLoad,
@@ -13028,7 +13105,7 @@
     BuiltInName::imageLoadExt,
     std::array<TExtension, 2u>{
         {TExtension::OES_texture_cube_map_array, TExtension::EXT_texture_cube_map_array}},
-    BuiltInParameters::p01d20D00E00E,
+    BuiltInParameters::p01d20D00B,
     2,
     StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 4, 1>(),
     EOpImageLoad,
@@ -13045,7 +13122,7 @@
 constexpr const TFunction imageLoad_01U00D(BuiltInId::imageLoad_IImageBuffer1_Int1,
                                            BuiltInName::imageLoad,
                                            std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                           BuiltInParameters::p01U00D00D00D,
+                                           BuiltInParameters::p01U00D00B,
                                            2,
                                            StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 4, 1>(),
                                            EOpImageLoad,
@@ -13054,7 +13131,7 @@
     BuiltInId::imageLoad_UImageBuffer1_Int1,
     BuiltInName::imageLoad,
     std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-    BuiltInParameters::p01f00D00D00D,
+    BuiltInParameters::p01f00D00B,
     2,
     StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 4, 1>(),
     EOpImageLoad,
@@ -13072,7 +13149,7 @@
     BuiltInId::imageLoadExt_IImageBuffer1_Int1,
     BuiltInName::imageLoadExt,
     std::array<TExtension, 2u>{{TExtension::OES_texture_buffer, TExtension::EXT_texture_buffer}},
-    BuiltInParameters::p01U00D00D00D,
+    BuiltInParameters::p01U00D00B,
     2,
     StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 4, 1>(),
     EOpImageLoad,
@@ -13081,7 +13158,7 @@
     BuiltInId::imageLoadExt_UImageBuffer1_Int1,
     BuiltInName::imageLoadExt,
     std::array<TExtension, 2u>{{TExtension::OES_texture_buffer, TExtension::EXT_texture_buffer}},
-    BuiltInParameters::p01f00D00D00D,
+    BuiltInParameters::p01f00D00B,
     2,
     StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 4, 1>(),
     EOpImageLoad,
@@ -18196,14 +18273,24 @@
     StaticType::Get<EbtVoid, EbpUndefined, EvqGlobal, 1, 1>(),
     EOpGroupMemoryBarrier,
     false);
-constexpr const TFunction barrierES3_2_(BuiltInId::barrierES3_2,
-                                        BuiltInName::barrierES3_2,
-                                        std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                        BuiltInParameters::empty,
-                                        0,
-                                        StaticType::Get<EbtVoid, EbpUndefined, EvqGlobal, 1, 1>(),
-                                        EOpBarrierTCS,
-                                        false);
+constexpr const TFunction barrierTCS_(BuiltInId::barrierTCS,
+                                      BuiltInName::barrierTCS,
+                                      std::array<TExtension, 1u>{
+                                          {TExtension::EXT_tessellation_shader}},
+                                      BuiltInParameters::empty,
+                                      0,
+                                      StaticType::Get<EbtVoid, EbpUndefined, EvqGlobal, 1, 1>(),
+                                      EOpBarrierTCS,
+                                      false);
+constexpr const TFunction barrierTCSES3_2_(
+    BuiltInId::barrierTCSES3_2,
+    BuiltInName::barrierTCSES3_2,
+    std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
+    BuiltInParameters::empty,
+    0,
+    StaticType::Get<EbtVoid, EbpUndefined, EvqGlobal, 1, 1>(),
+    EOpBarrierTCS,
+    false);
 constexpr const TFunction EmitVertex_(BuiltInId::EmitVertex,
                                       BuiltInName::EmitVertex,
                                       std::array<TExtension, 2u>{{TExtension::EXT_geometry_shader,
@@ -18240,6 +18327,58 @@
     StaticType::Get<EbtVoid, EbpUndefined, EvqGlobal, 1, 1>(),
     EOpEndPrimitive,
     false);
+constexpr const TFunction subpassLoad_01g(
+    BuiltInId::subpassLoad_SubpassInput1,
+    BuiltInName::subpassLoad,
+    std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
+    BuiltInParameters::p01g,
+    1,
+    StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 4, 1>(),
+    EOpSubpassLoad,
+    false);
+constexpr const TFunction subpassLoad_01h(BuiltInId::subpassLoad_ISubpassInput1,
+                                          BuiltInName::subpassLoad,
+                                          std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
+                                          BuiltInParameters::p01h,
+                                          1,
+                                          StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 4, 1>(),
+                                          EOpSubpassLoad,
+                                          false);
+constexpr const TFunction subpassLoad_01i(BuiltInId::subpassLoad_USubpassInput1,
+                                          BuiltInName::subpassLoad,
+                                          std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
+                                          BuiltInParameters::p01i,
+                                          1,
+                                          StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 4, 1>(),
+                                          EOpSubpassLoad,
+                                          false);
+constexpr const TFunction subpassLoad_01j00D(
+    BuiltInId::subpassLoad_SubpassInputMS1_Int1,
+    BuiltInName::subpassLoad,
+    std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
+    BuiltInParameters::p01j00D,
+    2,
+    StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 4, 1>(),
+    EOpSubpassLoad,
+    false);
+constexpr const TFunction subpassLoad_01k00D(
+    BuiltInId::subpassLoad_ISubpassInputMS1_Int1,
+    BuiltInName::subpassLoad,
+    std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
+    BuiltInParameters::p01k00D,
+    2,
+    StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 4, 1>(),
+    EOpSubpassLoad,
+    false);
+constexpr const TFunction subpassLoad_01l00D(
+    BuiltInId::subpassLoad_USubpassInputMS1_Int1,
+    BuiltInName::subpassLoad,
+    std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
+    BuiltInParameters::p01l00D,
+    2,
+    StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 4, 1>(),
+    EOpSubpassLoad,
+    false);
 
 }  // namespace Func
 
@@ -18251,643 +18390,326 @@
 // Rules used to initialize the mangled name array.
 constexpr SymbolRule kRules[] = {
     Rule::Get<Spec::ESSL, 0, Shader::ALL, 0>(&radians_00B),
-    Rule::Get<Spec::GLSL, 0, Shader::ALL, 0>(&radians_00B),
     Rule::Get<Spec::ESSL, 0, Shader::ALL, 0>(&radians_10B),
-    Rule::Get<Spec::GLSL, 0, Shader::ALL, 0>(&radians_10B),
     Rule::Get<Spec::ESSL, 0, Shader::ALL, 0>(&radians_20B),
-    Rule::Get<Spec::GLSL, 0, Shader::ALL, 0>(&radians_20B),
     Rule::Get<Spec::ESSL, 0, Shader::ALL, 0>(&radians_30B),
-    Rule::Get<Spec::GLSL, 0, Shader::ALL, 0>(&radians_30B),
     Rule::Get<Spec::ESSL, 0, Shader::ALL, 0>(&degrees_00B),
-    Rule::Get<Spec::GLSL, 0, Shader::ALL, 0>(&degrees_00B),
     Rule::Get<Spec::ESSL, 0, Shader::ALL, 0>(&degrees_10B),
-    Rule::Get<Spec::GLSL, 0, Shader::ALL, 0>(&degrees_10B),
     Rule::Get<Spec::ESSL, 0, Shader::ALL, 0>(&degrees_20B),
-    Rule::Get<Spec::GLSL, 0, Shader::ALL, 0>(&degrees_20B),
     Rule::Get<Spec::ESSL, 0, Shader::ALL, 0>(&degrees_30B),
-    Rule::Get<Spec::GLSL, 0, Shader::ALL, 0>(&degrees_30B),
     Rule::Get<Spec::ESSL, 0, Shader::ALL, 0>(&sin_00B),
-    Rule::Get<Spec::GLSL, 0, Shader::ALL, 0>(&sin_00B),
     Rule::Get<Spec::ESSL, 0, Shader::ALL, 0>(&sin_10B),
-    Rule::Get<Spec::GLSL, 0, Shader::ALL, 0>(&sin_10B),
     Rule::Get<Spec::ESSL, 0, Shader::ALL, 0>(&sin_20B),
-    Rule::Get<Spec::GLSL, 0, Shader::ALL, 0>(&sin_20B),
     Rule::Get<Spec::ESSL, 0, Shader::ALL, 0>(&sin_30B),
-    Rule::Get<Spec::GLSL, 0, Shader::ALL, 0>(&sin_30B),
     Rule::Get<Spec::ESSL, 0, Shader::ALL, 0>(&cos_00B),
-    Rule::Get<Spec::GLSL, 0, Shader::ALL, 0>(&cos_00B),
     Rule::Get<Spec::ESSL, 0, Shader::ALL, 0>(&cos_10B),
-    Rule::Get<Spec::GLSL, 0, Shader::ALL, 0>(&cos_10B),
     Rule::Get<Spec::ESSL, 0, Shader::ALL, 0>(&cos_20B),
-    Rule::Get<Spec::GLSL, 0, Shader::ALL, 0>(&cos_20B),
     Rule::Get<Spec::ESSL, 0, Shader::ALL, 0>(&cos_30B),
-    Rule::Get<Spec::GLSL, 0, Shader::ALL, 0>(&cos_30B),
     Rule::Get<Spec::ESSL, 0, Shader::ALL, 0>(&tan_00B),
-    Rule::Get<Spec::GLSL, 0, Shader::ALL, 0>(&tan_00B),
     Rule::Get<Spec::ESSL, 0, Shader::ALL, 0>(&tan_10B),
-    Rule::Get<Spec::GLSL, 0, Shader::ALL, 0>(&tan_10B),
     Rule::Get<Spec::ESSL, 0, Shader::ALL, 0>(&tan_20B),
-    Rule::Get<Spec::GLSL, 0, Shader::ALL, 0>(&tan_20B),
     Rule::Get<Spec::ESSL, 0, Shader::ALL, 0>(&tan_30B),
-    Rule::Get<Spec::GLSL, 0, Shader::ALL, 0>(&tan_30B),
     Rule::Get<Spec::ESSL, 0, Shader::ALL, 0>(&asin_00B),
-    Rule::Get<Spec::GLSL, 0, Shader::ALL, 0>(&asin_00B),
     Rule::Get<Spec::ESSL, 0, Shader::ALL, 0>(&asin_10B),
-    Rule::Get<Spec::GLSL, 0, Shader::ALL, 0>(&asin_10B),
     Rule::Get<Spec::ESSL, 0, Shader::ALL, 0>(&asin_20B),
-    Rule::Get<Spec::GLSL, 0, Shader::ALL, 0>(&asin_20B),
     Rule::Get<Spec::ESSL, 0, Shader::ALL, 0>(&asin_30B),
-    Rule::Get<Spec::GLSL, 0, Shader::ALL, 0>(&asin_30B),
     Rule::Get<Spec::ESSL, 0, Shader::ALL, 0>(&acos_00B),
-    Rule::Get<Spec::GLSL, 0, Shader::ALL, 0>(&acos_00B),
     Rule::Get<Spec::ESSL, 0, Shader::ALL, 0>(&acos_10B),
-    Rule::Get<Spec::GLSL, 0, Shader::ALL, 0>(&acos_10B),
     Rule::Get<Spec::ESSL, 0, Shader::ALL, 0>(&acos_20B),
-    Rule::Get<Spec::GLSL, 0, Shader::ALL, 0>(&acos_20B),
     Rule::Get<Spec::ESSL, 0, Shader::ALL, 0>(&acos_30B),
-    Rule::Get<Spec::GLSL, 0, Shader::ALL, 0>(&acos_30B),
     Rule::Get<Spec::ESSL, 0, Shader::ALL, 0>(&atan_00B00B),
-    Rule::Get<Spec::GLSL, 0, Shader::ALL, 0>(&atan_00B00B),
     Rule::Get<Spec::ESSL, 0, Shader::ALL, 0>(&atan_10B10B),
-    Rule::Get<Spec::GLSL, 0, Shader::ALL, 0>(&atan_10B10B),
     Rule::Get<Spec::ESSL, 0, Shader::ALL, 0>(&atan_20B20B),
-    Rule::Get<Spec::GLSL, 0, Shader::ALL, 0>(&atan_20B20B),
     Rule::Get<Spec::ESSL, 0, Shader::ALL, 0>(&atan_30B30B),
-    Rule::Get<Spec::GLSL, 0, Shader::ALL, 0>(&atan_30B30B),
     Rule::Get<Spec::ESSL, 0, Shader::ALL, 0>(&atan_00B),
-    Rule::Get<Spec::GLSL, 0, Shader::ALL, 0>(&atan_00B),
     Rule::Get<Spec::ESSL, 0, Shader::ALL, 0>(&atan_10B),
-    Rule::Get<Spec::GLSL, 0, Shader::ALL, 0>(&atan_10B),
     Rule::Get<Spec::ESSL, 0, Shader::ALL, 0>(&atan_20B),
-    Rule::Get<Spec::GLSL, 0, Shader::ALL, 0>(&atan_20B),
     Rule::Get<Spec::ESSL, 0, Shader::ALL, 0>(&atan_30B),
-    Rule::Get<Spec::GLSL, 0, Shader::ALL, 0>(&atan_30B),
     Rule::Get<Spec::ESSL, 300, Shader::ALL, 0>(&sinh_00B),
-    Rule::Get<Spec::GLSL, 130, Shader::ALL, 0>(&sinh_00B),
     Rule::Get<Spec::ESSL, 300, Shader::ALL, 0>(&sinh_10B),
-    Rule::Get<Spec::GLSL, 130, Shader::ALL, 0>(&sinh_10B),
     Rule::Get<Spec::ESSL, 300, Shader::ALL, 0>(&sinh_20B),
-    Rule::Get<Spec::GLSL, 130, Shader::ALL, 0>(&sinh_20B),
     Rule::Get<Spec::ESSL, 300, Shader::ALL, 0>(&sinh_30B),
-    Rule::Get<Spec::GLSL, 130, Shader::ALL, 0>(&sinh_30B),
     Rule::Get<Spec::ESSL, 300, Shader::ALL, 0>(&cosh_00B),
-    Rule::Get<Spec::GLSL, 130, Shader::ALL, 0>(&cosh_00B),
     Rule::Get<Spec::ESSL, 300, Shader::ALL, 0>(&cosh_10B),
-    Rule::Get<Spec::GLSL, 130, Shader::ALL, 0>(&cosh_10B),
     Rule::Get<Spec::ESSL, 300, Shader::ALL, 0>(&cosh_20B),
-    Rule::Get<Spec::GLSL, 130, Shader::ALL, 0>(&cosh_20B),
     Rule::Get<Spec::ESSL, 300, Shader::ALL, 0>(&cosh_30B),
-    Rule::Get<Spec::GLSL, 130, Shader::ALL, 0>(&cosh_30B),
     Rule::Get<Spec::ESSL, 300, Shader::ALL, 0>(&tanh_00B),
-    Rule::Get<Spec::GLSL, 130, Shader::ALL, 0>(&tanh_00B),
     Rule::Get<Spec::ESSL, 300, Shader::ALL, 0>(&tanh_10B),
-    Rule::Get<Spec::GLSL, 130, Shader::ALL, 0>(&tanh_10B),
     Rule::Get<Spec::ESSL, 300, Shader::ALL, 0>(&tanh_20B),
-    Rule::Get<Spec::GLSL, 130, Shader::ALL, 0>(&tanh_20B),
     Rule::Get<Spec::ESSL, 300, Shader::ALL, 0>(&tanh_30B),
-    Rule::Get<Spec::GLSL, 130, Shader::ALL, 0>(&tanh_30B),
     Rule::Get<Spec::ESSL, 300, Shader::ALL, 0>(&asinh_00B),
-    Rule::Get<Spec::GLSL, 130, Shader::ALL, 0>(&asinh_00B),
     Rule::Get<Spec::ESSL, 300, Shader::ALL, 0>(&asinh_10B),
-    Rule::Get<Spec::GLSL, 130, Shader::ALL, 0>(&asinh_10B),
     Rule::Get<Spec::ESSL, 300, Shader::ALL, 0>(&asinh_20B),
-    Rule::Get<Spec::GLSL, 130, Shader::ALL, 0>(&asinh_20B),
     Rule::Get<Spec::ESSL, 300, Shader::ALL, 0>(&asinh_30B),
-    Rule::Get<Spec::GLSL, 130, Shader::ALL, 0>(&asinh_30B),
     Rule::Get<Spec::ESSL, 300, Shader::ALL, 0>(&acosh_00B),
-    Rule::Get<Spec::GLSL, 130, Shader::ALL, 0>(&acosh_00B),
     Rule::Get<Spec::ESSL, 300, Shader::ALL, 0>(&acosh_10B),
-    Rule::Get<Spec::GLSL, 130, Shader::ALL, 0>(&acosh_10B),
     Rule::Get<Spec::ESSL, 300, Shader::ALL, 0>(&acosh_20B),
-    Rule::Get<Spec::GLSL, 130, Shader::ALL, 0>(&acosh_20B),
     Rule::Get<Spec::ESSL, 300, Shader::ALL, 0>(&acosh_30B),
-    Rule::Get<Spec::GLSL, 130, Shader::ALL, 0>(&acosh_30B),
     Rule::Get<Spec::ESSL, 300, Shader::ALL, 0>(&atanh_00B),
-    Rule::Get<Spec::GLSL, 130, Shader::ALL, 0>(&atanh_00B),
     Rule::Get<Spec::ESSL, 300, Shader::ALL, 0>(&atanh_10B),
-    Rule::Get<Spec::GLSL, 130, Shader::ALL, 0>(&atanh_10B),
     Rule::Get<Spec::ESSL, 300, Shader::ALL, 0>(&atanh_20B),
-    Rule::Get<Spec::GLSL, 130, Shader::ALL, 0>(&atanh_20B),
     Rule::Get<Spec::ESSL, 300, Shader::ALL, 0>(&atanh_30B),
-    Rule::Get<Spec::GLSL, 130, Shader::ALL, 0>(&atanh_30B),
     Rule::Get<Spec::ESSL, 0, Shader::ALL, 0>(&pow_00B00B),
-    Rule::Get<Spec::GLSL, 0, Shader::ALL, 0>(&pow_00B00B),
     Rule::Get<Spec::ESSL, 0, Shader::ALL, 0>(&pow_10B10B),
-    Rule::Get<Spec::GLSL, 0, Shader::ALL, 0>(&pow_10B10B),
     Rule::Get<Spec::ESSL, 0, Shader::ALL, 0>(&pow_20B20B),
-    Rule::Get<Spec::GLSL, 0, Shader::ALL, 0>(&pow_20B20B),
     Rule::Get<Spec::ESSL, 0, Shader::ALL, 0>(&pow_30B30B),
-    Rule::Get<Spec::GLSL, 0, Shader::ALL, 0>(&pow_30B30B),
     Rule::Get<Spec::ESSL, 0, Shader::ALL, 0>(&exp_00B),
-    Rule::Get<Spec::GLSL, 0, Shader::ALL, 0>(&exp_00B),
     Rule::Get<Spec::ESSL, 0, Shader::ALL, 0>(&exp_10B),
-    Rule::Get<Spec::GLSL, 0, Shader::ALL, 0>(&exp_10B),
     Rule::Get<Spec::ESSL, 0, Shader::ALL, 0>(&exp_20B),
-    Rule::Get<Spec::GLSL, 0, Shader::ALL, 0>(&exp_20B),
     Rule::Get<Spec::ESSL, 0, Shader::ALL, 0>(&exp_30B),
-    Rule::Get<Spec::GLSL, 0, Shader::ALL, 0>(&exp_30B),
     Rule::Get<Spec::ESSL, 0, Shader::ALL, 0>(&log_00B),
-    Rule::Get<Spec::GLSL, 0, Shader::ALL, 0>(&log_00B),
     Rule::Get<Spec::ESSL, 0, Shader::ALL, 0>(&log_10B),
-    Rule::Get<Spec::GLSL, 0, Shader::ALL, 0>(&log_10B),
     Rule::Get<Spec::ESSL, 0, Shader::ALL, 0>(&log_20B),
-    Rule::Get<Spec::GLSL, 0, Shader::ALL, 0>(&log_20B),
     Rule::Get<Spec::ESSL, 0, Shader::ALL, 0>(&log_30B),
-    Rule::Get<Spec::GLSL, 0, Shader::ALL, 0>(&log_30B),
     Rule::Get<Spec::ESSL, 0, Shader::ALL, 0>(&exp2_00B),
-    Rule::Get<Spec::GLSL, 0, Shader::ALL, 0>(&exp2_00B),
     Rule::Get<Spec::ESSL, 0, Shader::ALL, 0>(&exp2_10B),
-    Rule::Get<Spec::GLSL, 0, Shader::ALL, 0>(&exp2_10B),
     Rule::Get<Spec::ESSL, 0, Shader::ALL, 0>(&exp2_20B),
-    Rule::Get<Spec::GLSL, 0, Shader::ALL, 0>(&exp2_20B),
     Rule::Get<Spec::ESSL, 0, Shader::ALL, 0>(&exp2_30B),
-    Rule::Get<Spec::GLSL, 0, Shader::ALL, 0>(&exp2_30B),
     Rule::Get<Spec::ESSL, 0, Shader::ALL, 0>(&log2_00B),
-    Rule::Get<Spec::GLSL, 0, Shader::ALL, 0>(&log2_00B),
     Rule::Get<Spec::ESSL, 0, Shader::ALL, 0>(&log2_10B),
-    Rule::Get<Spec::GLSL, 0, Shader::ALL, 0>(&log2_10B),
     Rule::Get<Spec::ESSL, 0, Shader::ALL, 0>(&log2_20B),
-    Rule::Get<Spec::GLSL, 0, Shader::ALL, 0>(&log2_20B),
     Rule::Get<Spec::ESSL, 0, Shader::ALL, 0>(&log2_30B),
-    Rule::Get<Spec::GLSL, 0, Shader::ALL, 0>(&log2_30B),
     Rule::Get<Spec::ESSL, 0, Shader::ALL, 0>(&sqrt_00B),
-    Rule::Get<Spec::GLSL, 0, Shader::ALL, 0>(&sqrt_00B),
     Rule::Get<Spec::ESSL, 0, Shader::ALL, 0>(&sqrt_10B),
-    Rule::Get<Spec::GLSL, 0, Shader::ALL, 0>(&sqrt_10B),
     Rule::Get<Spec::ESSL, 0, Shader::ALL, 0>(&sqrt_20B),
-    Rule::Get<Spec::GLSL, 0, Shader::ALL, 0>(&sqrt_20B),
     Rule::Get<Spec::ESSL, 0, Shader::ALL, 0>(&sqrt_30B),
-    Rule::Get<Spec::GLSL, 0, Shader::ALL, 0>(&sqrt_30B),
     Rule::Get<Spec::ESSL, 0, Shader::ALL, 0>(&inversesqrt_00B),
-    Rule::Get<Spec::GLSL, 0, Shader::ALL, 0>(&inversesqrt_00B),
     Rule::Get<Spec::ESSL, 0, Shader::ALL, 0>(&inversesqrt_10B),
-    Rule::Get<Spec::GLSL, 0, Shader::ALL, 0>(&inversesqrt_10B),
     Rule::Get<Spec::ESSL, 0, Shader::ALL, 0>(&inversesqrt_20B),
-    Rule::Get<Spec::GLSL, 0, Shader::ALL, 0>(&inversesqrt_20B),
     Rule::Get<Spec::ESSL, 0, Shader::ALL, 0>(&inversesqrt_30B),
-    Rule::Get<Spec::GLSL, 0, Shader::ALL, 0>(&inversesqrt_30B),
     Rule::Get<Spec::ESSL, 0, Shader::ALL, 0>(&abs_00B),
-    Rule::Get<Spec::GLSL, 0, Shader::ALL, 0>(&abs_00B),
     Rule::Get<Spec::ESSL, 0, Shader::ALL, 0>(&abs_10B),
-    Rule::Get<Spec::GLSL, 0, Shader::ALL, 0>(&abs_10B),
     Rule::Get<Spec::ESSL, 0, Shader::ALL, 0>(&abs_20B),
-    Rule::Get<Spec::GLSL, 0, Shader::ALL, 0>(&abs_20B),
     Rule::Get<Spec::ESSL, 0, Shader::ALL, 0>(&abs_30B),
-    Rule::Get<Spec::GLSL, 0, Shader::ALL, 0>(&abs_30B),
     Rule::Get<Spec::ESSL, 300, Shader::ALL, 0>(&abs_00D),
-    Rule::Get<Spec::GLSL, 130, Shader::ALL, 0>(&abs_00D),
     Rule::Get<Spec::ESSL, 300, Shader::ALL, 0>(&abs_10D),
-    Rule::Get<Spec::GLSL, 130, Shader::ALL, 0>(&abs_10D),
     Rule::Get<Spec::ESSL, 300, Shader::ALL, 0>(&abs_20D),
-    Rule::Get<Spec::GLSL, 130, Shader::ALL, 0>(&abs_20D),
     Rule::Get<Spec::ESSL, 300, Shader::ALL, 0>(&abs_30D),
-    Rule::Get<Spec::GLSL, 130, Shader::ALL, 0>(&abs_30D),
     Rule::Get<Spec::ESSL, 0, Shader::ALL, 0>(&sign_00B),
-    Rule::Get<Spec::GLSL, 0, Shader::ALL, 0>(&sign_00B),
     Rule::Get<Spec::ESSL, 0, Shader::ALL, 0>(&sign_10B),
-    Rule::Get<Spec::GLSL, 0, Shader::ALL, 0>(&sign_10B),
     Rule::Get<Spec::ESSL, 0, Shader::ALL, 0>(&sign_20B),
-    Rule::Get<Spec::GLSL, 0, Shader::ALL, 0>(&sign_20B),
     Rule::Get<Spec::ESSL, 0, Shader::ALL, 0>(&sign_30B),
-    Rule::Get<Spec::GLSL, 0, Shader::ALL, 0>(&sign_30B),
     Rule::Get<Spec::ESSL, 300, Shader::ALL, 0>(&sign_00D),
-    Rule::Get<Spec::GLSL, 130, Shader::ALL, 0>(&sign_00D),
     Rule::Get<Spec::ESSL, 300, Shader::ALL, 0>(&sign_10D),
-    Rule::Get<Spec::GLSL, 130, Shader::ALL, 0>(&sign_10D),
     Rule::Get<Spec::ESSL, 300, Shader::ALL, 0>(&sign_20D),
-    Rule::Get<Spec::GLSL, 130, Shader::ALL, 0>(&sign_20D),
     Rule::Get<Spec::ESSL, 300, Shader::ALL, 0>(&sign_30D),
-    Rule::Get<Spec::GLSL, 130, Shader::ALL, 0>(&sign_30D),
     Rule::Get<Spec::ESSL, 0, Shader::ALL, 0>(&floor_00B),
-    Rule::Get<Spec::GLSL, 0, Shader::ALL, 0>(&floor_00B),
     Rule::Get<Spec::ESSL, 0, Shader::ALL, 0>(&floor_10B),
-    Rule::Get<Spec::GLSL, 0, Shader::ALL, 0>(&floor_10B),
     Rule::Get<Spec::ESSL, 0, Shader::ALL, 0>(&floor_20B),
-    Rule::Get<Spec::GLSL, 0, Shader::ALL, 0>(&floor_20B),
     Rule::Get<Spec::ESSL, 0, Shader::ALL, 0>(&floor_30B),
-    Rule::Get<Spec::GLSL, 0, Shader::ALL, 0>(&floor_30B),
     Rule::Get<Spec::ESSL, 300, Shader::ALL, 0>(&trunc_00B),
-    Rule::Get<Spec::GLSL, 130, Shader::ALL, 0>(&trunc_00B),
     Rule::Get<Spec::ESSL, 300, Shader::ALL, 0>(&trunc_10B),
-    Rule::Get<Spec::GLSL, 130, Shader::ALL, 0>(&trunc_10B),
     Rule::Get<Spec::ESSL, 300, Shader::ALL, 0>(&trunc_20B),
-    Rule::Get<Spec::GLSL, 130, Shader::ALL, 0>(&trunc_20B),
     Rule::Get<Spec::ESSL, 300, Shader::ALL, 0>(&trunc_30B),
-    Rule::Get<Spec::GLSL, 130, Shader::ALL, 0>(&trunc_30B),
     Rule::Get<Spec::ESSL, 300, Shader::ALL, 0>(&round_00B),
-    Rule::Get<Spec::GLSL, 130, Shader::ALL, 0>(&round_00B),
     Rule::Get<Spec::ESSL, 300, Shader::ALL, 0>(&round_10B),
-    Rule::Get<Spec::GLSL, 130, Shader::ALL, 0>(&round_10B),
     Rule::Get<Spec::ESSL, 300, Shader::ALL, 0>(&round_20B),
-    Rule::Get<Spec::GLSL, 130, Shader::ALL, 0>(&round_20B),
     Rule::Get<Spec::ESSL, 300, Shader::ALL, 0>(&round_30B),
-    Rule::Get<Spec::GLSL, 130, Shader::ALL, 0>(&round_30B),
     Rule::Get<Spec::ESSL, 300, Shader::ALL, 0>(&roundEven_00B),
-    Rule::Get<Spec::GLSL, 130, Shader::ALL, 0>(&roundEven_00B),
     Rule::Get<Spec::ESSL, 300, Shader::ALL, 0>(&roundEven_10B),
-    Rule::Get<Spec::GLSL, 130, Shader::ALL, 0>(&roundEven_10B),
     Rule::Get<Spec::ESSL, 300, Shader::ALL, 0>(&roundEven_20B),
-    Rule::Get<Spec::GLSL, 130, Shader::ALL, 0>(&roundEven_20B),
     Rule::Get<Spec::ESSL, 300, Shader::ALL, 0>(&roundEven_30B),
-    Rule::Get<Spec::GLSL, 130, Shader::ALL, 0>(&roundEven_30B),
     Rule::Get<Spec::ESSL, 0, Shader::ALL, 0>(&ceil_00B),
-    Rule::Get<Spec::GLSL, 0, Shader::ALL, 0>(&ceil_00B),
     Rule::Get<Spec::ESSL, 0, Shader::ALL, 0>(&ceil_10B),
-    Rule::Get<Spec::GLSL, 0, Shader::ALL, 0>(&ceil_10B),
     Rule::Get<Spec::ESSL, 0, Shader::ALL, 0>(&ceil_20B),
-    Rule::Get<Spec::GLSL, 0, Shader::ALL, 0>(&ceil_20B),
     Rule::Get<Spec::ESSL, 0, Shader::ALL, 0>(&ceil_30B),
-    Rule::Get<Spec::GLSL, 0, Shader::ALL, 0>(&ceil_30B),
     Rule::Get<Spec::ESSL, 0, Shader::ALL, 0>(&fract_00B),
-    Rule::Get<Spec::GLSL, 0, Shader::ALL, 0>(&fract_00B),
     Rule::Get<Spec::ESSL, 0, Shader::ALL, 0>(&fract_10B),
-    Rule::Get<Spec::GLSL, 0, Shader::ALL, 0>(&fract_10B),
     Rule::Get<Spec::ESSL, 0, Shader::ALL, 0>(&fract_20B),
-    Rule::Get<Spec::GLSL, 0, Shader::ALL, 0>(&fract_20B),
     Rule::Get<Spec::ESSL, 0, Shader::ALL, 0>(&fract_30B),
-    Rule::Get<Spec::GLSL, 0, Shader::ALL, 0>(&fract_30B),
     Rule::Get<Spec::ESSL, 0, Shader::ALL, 0>(&mod_00B00B),
-    Rule::Get<Spec::GLSL, 0, Shader::ALL, 0>(&mod_00B00B),
     Rule::Get<Spec::ESSL, 0, Shader::ALL, 0>(&mod_10B00B),
-    Rule::Get<Spec::GLSL, 0, Shader::ALL, 0>(&mod_10B00B),
     Rule::Get<Spec::ESSL, 0, Shader::ALL, 0>(&mod_20B00B),
-    Rule::Get<Spec::GLSL, 0, Shader::ALL, 0>(&mod_20B00B),
     Rule::Get<Spec::ESSL, 0, Shader::ALL, 0>(&mod_30B00B),
-    Rule::Get<Spec::GLSL, 0, Shader::ALL, 0>(&mod_30B00B),
     Rule::Get<Spec::ESSL, 0, Shader::ALL, 0>(&mod_10B10B),
-    Rule::Get<Spec::GLSL, 0, Shader::ALL, 0>(&mod_10B10B),
     Rule::Get<Spec::ESSL, 0, Shader::ALL, 0>(&mod_20B20B),
-    Rule::Get<Spec::GLSL, 0, Shader::ALL, 0>(&mod_20B20B),
     Rule::Get<Spec::ESSL, 0, Shader::ALL, 0>(&mod_30B30B),
-    Rule::Get<Spec::GLSL, 0, Shader::ALL, 0>(&mod_30B30B),
     Rule::Get<Spec::ESSL, 0, Shader::ALL, 0>(&min_00B00B),
-    Rule::Get<Spec::GLSL, 0, Shader::ALL, 0>(&min_00B00B),
     Rule::Get<Spec::ESSL, 0, Shader::ALL, 0>(&min_10B00B),
-    Rule::Get<Spec::GLSL, 0, Shader::ALL, 0>(&min_10B00B),
     Rule::Get<Spec::ESSL, 0, Shader::ALL, 0>(&min_20B00B),
-    Rule::Get<Spec::GLSL, 0, Shader::ALL, 0>(&min_20B00B),
     Rule::Get<Spec::ESSL, 0, Shader::ALL, 0>(&min_30B00B),
-    Rule::Get<Spec::GLSL, 0, Shader::ALL, 0>(&min_30B00B),
     Rule::Get<Spec::ESSL, 0, Shader::ALL, 0>(&min_10B10B),
-    Rule::Get<Spec::GLSL, 0, Shader::ALL, 0>(&min_10B10B),
     Rule::Get<Spec::ESSL, 0, Shader::ALL, 0>(&min_20B20B),
-    Rule::Get<Spec::GLSL, 0, Shader::ALL, 0>(&min_20B20B),
     Rule::Get<Spec::ESSL, 0, Shader::ALL, 0>(&min_30B30B),
-    Rule::Get<Spec::GLSL, 0, Shader::ALL, 0>(&min_30B30B),
     Rule::Get<Spec::ESSL, 300, Shader::ALL, 0>(&min_00D00D),
-    Rule::Get<Spec::GLSL, 130, Shader::ALL, 0>(&min_00D00D),
     Rule::Get<Spec::ESSL, 300, Shader::ALL, 0>(&min_10D10D),
-    Rule::Get<Spec::GLSL, 130, Shader::ALL, 0>(&min_10D10D),
     Rule::Get<Spec::ESSL, 300, Shader::ALL, 0>(&min_20D20D),
-    Rule::Get<Spec::GLSL, 130, Shader::ALL, 0>(&min_20D20D),
     Rule::Get<Spec::ESSL, 300, Shader::ALL, 0>(&min_30D30D),
-    Rule::Get<Spec::GLSL, 130, Shader::ALL, 0>(&min_30D30D),
     Rule::Get<Spec::ESSL, 300, Shader::ALL, 0>(&min_10D00D),
-    Rule::Get<Spec::GLSL, 130, Shader::ALL, 0>(&min_10D00D),
     Rule::Get<Spec::ESSL, 300, Shader::ALL, 0>(&min_20D00D),
-    Rule::Get<Spec::GLSL, 130, Shader::ALL, 0>(&min_20D00D),
     Rule::Get<Spec::ESSL, 300, Shader::ALL, 0>(&min_30D00D),
-    Rule::Get<Spec::GLSL, 130, Shader::ALL, 0>(&min_30D00D),
     Rule::Get<Spec::ESSL, 300, Shader::ALL, 0>(&min_00E00E),
-    Rule::Get<Spec::GLSL, 130, Shader::ALL, 0>(&min_00E00E),
     Rule::Get<Spec::ESSL, 300, Shader::ALL, 0>(&min_10E10E),
-    Rule::Get<Spec::GLSL, 130, Shader::ALL, 0>(&min_10E10E),
     Rule::Get<Spec::ESSL, 300, Shader::ALL, 0>(&min_20E20E),
-    Rule::Get<Spec::GLSL, 130, Shader::ALL, 0>(&min_20E20E),
     Rule::Get<Spec::ESSL, 300, Shader::ALL, 0>(&min_30E30E),
-    Rule::Get<Spec::GLSL, 130, Shader::ALL, 0>(&min_30E30E),
     Rule::Get<Spec::ESSL, 300, Shader::ALL, 0>(&min_10E00E),
-    Rule::Get<Spec::GLSL, 130, Shader::ALL, 0>(&min_10E00E),
     Rule::Get<Spec::ESSL, 300, Shader::ALL, 0>(&min_20E00E),
-    Rule::Get<Spec::GLSL, 130, Shader::ALL, 0>(&min_20E00E),
     Rule::Get<Spec::ESSL, 300, Shader::ALL, 0>(&min_30E00E),
-    Rule::Get<Spec::GLSL, 130, Shader::ALL, 0>(&min_30E00E),
     Rule::Get<Spec::ESSL, 0, Shader::ALL, 0>(&max_00B00B),
-    Rule::Get<Spec::GLSL, 0, Shader::ALL, 0>(&max_00B00B),
     Rule::Get<Spec::ESSL, 0, Shader::ALL, 0>(&max_10B00B),
-    Rule::Get<Spec::GLSL, 0, Shader::ALL, 0>(&max_10B00B),
     Rule::Get<Spec::ESSL, 0, Shader::ALL, 0>(&max_20B00B),
-    Rule::Get<Spec::GLSL, 0, Shader::ALL, 0>(&max_20B00B),
     Rule::Get<Spec::ESSL, 0, Shader::ALL, 0>(&max_30B00B),
-    Rule::Get<Spec::GLSL, 0, Shader::ALL, 0>(&max_30B00B),
     Rule::Get<Spec::ESSL, 0, Shader::ALL, 0>(&max_10B10B),
-    Rule::Get<Spec::GLSL, 0, Shader::ALL, 0>(&max_10B10B),
     Rule::Get<Spec::ESSL, 0, Shader::ALL, 0>(&max_20B20B),
-    Rule::Get<Spec::GLSL, 0, Shader::ALL, 0>(&max_20B20B),
     Rule::Get<Spec::ESSL, 0, Shader::ALL, 0>(&max_30B30B),
-    Rule::Get<Spec::GLSL, 0, Shader::ALL, 0>(&max_30B30B),
     Rule::Get<Spec::ESSL, 300, Shader::ALL, 0>(&max_00D00D),
-    Rule::Get<Spec::GLSL, 130, Shader::ALL, 0>(&max_00D00D),
     Rule::Get<Spec::ESSL, 300, Shader::ALL, 0>(&max_10D10D),
-    Rule::Get<Spec::GLSL, 130, Shader::ALL, 0>(&max_10D10D),
     Rule::Get<Spec::ESSL, 300, Shader::ALL, 0>(&max_20D20D),
-    Rule::Get<Spec::GLSL, 130, Shader::ALL, 0>(&max_20D20D),
     Rule::Get<Spec::ESSL, 300, Shader::ALL, 0>(&max_30D30D),
-    Rule::Get<Spec::GLSL, 130, Shader::ALL, 0>(&max_30D30D),
     Rule::Get<Spec::ESSL, 300, Shader::ALL, 0>(&max_10D00D),
-    Rule::Get<Spec::GLSL, 130, Shader::ALL, 0>(&max_10D00D),
     Rule::Get<Spec::ESSL, 300, Shader::ALL, 0>(&max_20D00D),
-    Rule::Get<Spec::GLSL, 130, Shader::ALL, 0>(&max_20D00D),
     Rule::Get<Spec::ESSL, 300, Shader::ALL, 0>(&max_30D00D),
-    Rule::Get<Spec::GLSL, 130, Shader::ALL, 0>(&max_30D00D),
     Rule::Get<Spec::ESSL, 300, Shader::ALL, 0>(&max_00E00E),
-    Rule::Get<Spec::GLSL, 130, Shader::ALL, 0>(&max_00E00E),
     Rule::Get<Spec::ESSL, 300, Shader::ALL, 0>(&max_10E10E),
-    Rule::Get<Spec::GLSL, 130, Shader::ALL, 0>(&max_10E10E),
     Rule::Get<Spec::ESSL, 300, Shader::ALL, 0>(&max_20E20E),
-    Rule::Get<Spec::GLSL, 130, Shader::ALL, 0>(&max_20E20E),
     Rule::Get<Spec::ESSL, 300, Shader::ALL, 0>(&max_30E30E),
-    Rule::Get<Spec::GLSL, 130, Shader::ALL, 0>(&max_30E30E),
     Rule::Get<Spec::ESSL, 300, Shader::ALL, 0>(&max_10E00E),
-    Rule::Get<Spec::GLSL, 130, Shader::ALL, 0>(&max_10E00E),
     Rule::Get<Spec::ESSL, 300, Shader::ALL, 0>(&max_20E00E),
-    Rule::Get<Spec::GLSL, 130, Shader::ALL, 0>(&max_20E00E),
     Rule::Get<Spec::ESSL, 300, Shader::ALL, 0>(&max_30E00E),
-    Rule::Get<Spec::GLSL, 130, Shader::ALL, 0>(&max_30E00E),
     Rule::Get<Spec::ESSL, 0, Shader::ALL, 0>(&clamp_00B00B00B),
-    Rule::Get<Spec::GLSL, 0, Shader::ALL, 0>(&clamp_00B00B00B),
     Rule::Get<Spec::ESSL, 0, Shader::ALL, 0>(&clamp_10B00B00B),
-    Rule::Get<Spec::GLSL, 0, Shader::ALL, 0>(&clamp_10B00B00B),
     Rule::Get<Spec::ESSL, 0, Shader::ALL, 0>(&clamp_20B00B00B),
-    Rule::Get<Spec::GLSL, 0, Shader::ALL, 0>(&clamp_20B00B00B),
     Rule::Get<Spec::ESSL, 0, Shader::ALL, 0>(&clamp_30B00B00B),
-    Rule::Get<Spec::GLSL, 0, Shader::ALL, 0>(&clamp_30B00B00B),
     Rule::Get<Spec::ESSL, 0, Shader::ALL, 0>(&clamp_10B10B10B),
-    Rule::Get<Spec::GLSL, 0, Shader::ALL, 0>(&clamp_10B10B10B),
     Rule::Get<Spec::ESSL, 0, Shader::ALL, 0>(&clamp_20B20B20B),
-    Rule::Get<Spec::GLSL, 0, Shader::ALL, 0>(&clamp_20B20B20B),
     Rule::Get<Spec::ESSL, 0, Shader::ALL, 0>(&clamp_30B30B30B),
-    Rule::Get<Spec::GLSL, 0, Shader::ALL, 0>(&clamp_30B30B30B),
     Rule::Get<Spec::ESSL, 300, Shader::ALL, 0>(&clamp_00D00D00D),
-    Rule::Get<Spec::GLSL, 130, Shader::ALL, 0>(&clamp_00D00D00D),
     Rule::Get<Spec::ESSL, 300, Shader::ALL, 0>(&clamp_10D00D00D),
-    Rule::Get<Spec::GLSL, 130, Shader::ALL, 0>(&clamp_10D00D00D),
     Rule::Get<Spec::ESSL, 300, Shader::ALL, 0>(&clamp_20D00D00D),
-    Rule::Get<Spec::GLSL, 130, Shader::ALL, 0>(&clamp_20D00D00D),
     Rule::Get<Spec::ESSL, 300, Shader::ALL, 0>(&clamp_30D00D00D),
-    Rule::Get<Spec::GLSL, 130, Shader::ALL, 0>(&clamp_30D00D00D),
     Rule::Get<Spec::ESSL, 300, Shader::ALL, 0>(&clamp_10D10D10D),
-    Rule::Get<Spec::GLSL, 130, Shader::ALL, 0>(&clamp_10D10D10D),
     Rule::Get<Spec::ESSL, 300, Shader::ALL, 0>(&clamp_20D20D20D),
-    Rule::Get<Spec::GLSL, 130, Shader::ALL, 0>(&clamp_20D20D20D),
     Rule::Get<Spec::ESSL, 300, Shader::ALL, 0>(&clamp_30D30D30D),
-    Rule::Get<Spec::GLSL, 130, Shader::ALL, 0>(&clamp_30D30D30D),
     Rule::Get<Spec::ESSL, 300, Shader::ALL, 0>(&clamp_00E00E00E),
-    Rule::Get<Spec::GLSL, 130, Shader::ALL, 0>(&clamp_00E00E00E),
     Rule::Get<Spec::ESSL, 300, Shader::ALL, 0>(&clamp_10E00E00E),
-    Rule::Get<Spec::GLSL, 130, Shader::ALL, 0>(&clamp_10E00E00E),
     Rule::Get<Spec::ESSL, 300, Shader::ALL, 0>(&clamp_20E00E00E),
-    Rule::Get<Spec::GLSL, 130, Shader::ALL, 0>(&clamp_20E00E00E),
     Rule::Get<Spec::ESSL, 300, Shader::ALL, 0>(&clamp_30E00E00E),
-    Rule::Get<Spec::GLSL, 130, Shader::ALL, 0>(&clamp_30E00E00E),
     Rule::Get<Spec::ESSL, 300, Shader::ALL, 0>(&clamp_10E10E10E),
-    Rule::Get<Spec::GLSL, 130, Shader::ALL, 0>(&clamp_10E10E10E),
     Rule::Get<Spec::ESSL, 300, Shader::ALL, 0>(&clamp_20E20E20E),
-    Rule::Get<Spec::GLSL, 130, Shader::ALL, 0>(&clamp_20E20E20E),
     Rule::Get<Spec::ESSL, 300, Shader::ALL, 0>(&clamp_30E30E30E),
-    Rule::Get<Spec::GLSL, 130, Shader::ALL, 0>(&clamp_30E30E30E),
     Rule::Get<Spec::ESSL, 0, Shader::ALL, 0>(&mix_00B00B00B),
-    Rule::Get<Spec::GLSL, 0, Shader::ALL, 0>(&mix_00B00B00B),
     Rule::Get<Spec::ESSL, 0, Shader::ALL, 0>(&mix_10B10B00B),
-    Rule::Get<Spec::GLSL, 0, Shader::ALL, 0>(&mix_10B10B00B),
     Rule::Get<Spec::ESSL, 0, Shader::ALL, 0>(&mix_20B20B00B),
-    Rule::Get<Spec::GLSL, 0, Shader::ALL, 0>(&mix_20B20B00B),
     Rule::Get<Spec::ESSL, 0, Shader::ALL, 0>(&mix_30B30B00B),
-    Rule::Get<Spec::GLSL, 0, Shader::ALL, 0>(&mix_30B30B00B),
     Rule::Get<Spec::ESSL, 0, Shader::ALL, 0>(&mix_10B10B10B),
-    Rule::Get<Spec::GLSL, 0, Shader::ALL, 0>(&mix_10B10B10B),
     Rule::Get<Spec::ESSL, 0, Shader::ALL, 0>(&mix_20B20B20B),
-    Rule::Get<Spec::GLSL, 0, Shader::ALL, 0>(&mix_20B20B20B),
     Rule::Get<Spec::ESSL, 0, Shader::ALL, 0>(&mix_30B30B30B),
-    Rule::Get<Spec::GLSL, 0, Shader::ALL, 0>(&mix_30B30B30B),
     Rule::Get<Spec::ESSL, 300, Shader::ALL, 0>(&mix_00B00B00F),
-    Rule::Get<Spec::GLSL, 130, Shader::ALL, 0>(&mix_00B00B00F),
     Rule::Get<Spec::ESSL, 300, Shader::ALL, 0>(&mix_10B10B10F),
-    Rule::Get<Spec::GLSL, 130, Shader::ALL, 0>(&mix_10B10B10F),
     Rule::Get<Spec::ESSL, 300, Shader::ALL, 0>(&mix_20B20B20F),
-    Rule::Get<Spec::GLSL, 130, Shader::ALL, 0>(&mix_20B20B20F),
     Rule::Get<Spec::ESSL, 300, Shader::ALL, 0>(&mix_30B30B30F),
-    Rule::Get<Spec::GLSL, 130, Shader::ALL, 0>(&mix_30B30B30F),
     Rule::Get<Spec::ESSL, 310, Shader::ALL, 0>(&mix_00D00D00F),
-    Rule::Get<Spec::GLSL, 450, Shader::ALL, 0>(&mix_00D00D00F),
     Rule::Get<Spec::ESSL, 310, Shader::ALL, 0>(&mix_10D10D10F),
-    Rule::Get<Spec::GLSL, 450, Shader::ALL, 0>(&mix_10D10D10F),
     Rule::Get<Spec::ESSL, 310, Shader::ALL, 0>(&mix_20D20D20F),
-    Rule::Get<Spec::GLSL, 450, Shader::ALL, 0>(&mix_20D20D20F),
     Rule::Get<Spec::ESSL, 310, Shader::ALL, 0>(&mix_30D30D30F),
-    Rule::Get<Spec::GLSL, 450, Shader::ALL, 0>(&mix_30D30D30F),
     Rule::Get<Spec::ESSL, 310, Shader::ALL, 0>(&mix_00E00E00F),
-    Rule::Get<Spec::GLSL, 450, Shader::ALL, 0>(&mix_00E00E00F),
     Rule::Get<Spec::ESSL, 310, Shader::ALL, 0>(&mix_10E10E10F),
-    Rule::Get<Spec::GLSL, 450, Shader::ALL, 0>(&mix_10E10E10F),
     Rule::Get<Spec::ESSL, 310, Shader::ALL, 0>(&mix_20E20E20F),
-    Rule::Get<Spec::GLSL, 450, Shader::ALL, 0>(&mix_20E20E20F),
     Rule::Get<Spec::ESSL, 310, Shader::ALL, 0>(&mix_30E30E30F),
-    Rule::Get<Spec::GLSL, 450, Shader::ALL, 0>(&mix_30E30E30F),
     Rule::Get<Spec::ESSL, 310, Shader::ALL, 0>(&mix_00F00F00F),
-    Rule::Get<Spec::GLSL, 450, Shader::ALL, 0>(&mix_00F00F00F),
     Rule::Get<Spec::ESSL, 310, Shader::ALL, 0>(&mix_10F10F10F),
-    Rule::Get<Spec::GLSL, 450, Shader::ALL, 0>(&mix_10F10F10F),
     Rule::Get<Spec::ESSL, 310, Shader::ALL, 0>(&mix_20F20F20F),
-    Rule::Get<Spec::GLSL, 450, Shader::ALL, 0>(&mix_20F20F20F),
     Rule::Get<Spec::ESSL, 310, Shader::ALL, 0>(&mix_30F30F30F),
-    Rule::Get<Spec::GLSL, 450, Shader::ALL, 0>(&mix_30F30F30F),
     Rule::Get<Spec::ESSL, 0, Shader::ALL, 0>(&step_00B00B),
-    Rule::Get<Spec::GLSL, 0, Shader::ALL, 0>(&step_00B00B),
     Rule::Get<Spec::ESSL, 0, Shader::ALL, 0>(&step_10B10B),
-    Rule::Get<Spec::GLSL, 0, Shader::ALL, 0>(&step_10B10B),
     Rule::Get<Spec::ESSL, 0, Shader::ALL, 0>(&step_20B20B),
-    Rule::Get<Spec::GLSL, 0, Shader::ALL, 0>(&step_20B20B),
     Rule::Get<Spec::ESSL, 0, Shader::ALL, 0>(&step_30B30B),
-    Rule::Get<Spec::GLSL, 0, Shader::ALL, 0>(&step_30B30B),
     Rule::Get<Spec::ESSL, 0, Shader::ALL, 0>(&step_00B10B),
-    Rule::Get<Spec::GLSL, 0, Shader::ALL, 0>(&step_00B10B),
     Rule::Get<Spec::ESSL, 0, Shader::ALL, 0>(&step_00B20B),
-    Rule::Get<Spec::GLSL, 0, Shader::ALL, 0>(&step_00B20B),
     Rule::Get<Spec::ESSL, 0, Shader::ALL, 0>(&step_00B30B),
-    Rule::Get<Spec::GLSL, 0, Shader::ALL, 0>(&step_00B30B),
     Rule::Get<Spec::ESSL, 0, Shader::ALL, 0>(&smoothstep_00B00B00B),
-    Rule::Get<Spec::GLSL, 0, Shader::ALL, 0>(&smoothstep_00B00B00B),
     Rule::Get<Spec::ESSL, 0, Shader::ALL, 0>(&smoothstep_10B10B10B),
-    Rule::Get<Spec::GLSL, 0, Shader::ALL, 0>(&smoothstep_10B10B10B),
     Rule::Get<Spec::ESSL, 0, Shader::ALL, 0>(&smoothstep_20B20B20B),
-    Rule::Get<Spec::GLSL, 0, Shader::ALL, 0>(&smoothstep_20B20B20B),
     Rule::Get<Spec::ESSL, 0, Shader::ALL, 0>(&smoothstep_30B30B30B),
-    Rule::Get<Spec::GLSL, 0, Shader::ALL, 0>(&smoothstep_30B30B30B),
     Rule::Get<Spec::ESSL, 0, Shader::ALL, 0>(&smoothstep_00B00B10B),
-    Rule::Get<Spec::GLSL, 0, Shader::ALL, 0>(&smoothstep_00B00B10B),
     Rule::Get<Spec::ESSL, 0, Shader::ALL, 0>(&smoothstep_00B00B20B),
-    Rule::Get<Spec::GLSL, 0, Shader::ALL, 0>(&smoothstep_00B00B20B),
     Rule::Get<Spec::ESSL, 0, Shader::ALL, 0>(&smoothstep_00B00B30B),
-    Rule::Get<Spec::GLSL, 0, Shader::ALL, 0>(&smoothstep_00B00B30B),
     Rule::Get<Spec::ESSL, 300, Shader::ALL, 0>(&modf_00B00B),
-    Rule::Get<Spec::GLSL, 130, Shader::ALL, 0>(&modf_00B00B),
     Rule::Get<Spec::ESSL, 300, Shader::ALL, 0>(&modf_10B10B),
-    Rule::Get<Spec::GLSL, 130, Shader::ALL, 0>(&modf_10B10B),
     Rule::Get<Spec::ESSL, 300, Shader::ALL, 0>(&modf_20B20B),
-    Rule::Get<Spec::GLSL, 130, Shader::ALL, 0>(&modf_20B20B),
     Rule::Get<Spec::ESSL, 300, Shader::ALL, 0>(&modf_30B30B),
-    Rule::Get<Spec::GLSL, 130, Shader::ALL, 0>(&modf_30B30B),
     Rule::Get<Spec::ESSL, 300, Shader::ALL, 0>(&isnan_00B),
-    Rule::Get<Spec::GLSL, 130, Shader::ALL, 0>(&isnan_00B),
     Rule::Get<Spec::ESSL, 300, Shader::ALL, 0>(&isnan_10B),
-    Rule::Get<Spec::GLSL, 130, Shader::ALL, 0>(&isnan_10B),
     Rule::Get<Spec::ESSL, 300, Shader::ALL, 0>(&isnan_20B),
-    Rule::Get<Spec::GLSL, 130, Shader::ALL, 0>(&isnan_20B),
     Rule::Get<Spec::ESSL, 300, Shader::ALL, 0>(&isnan_30B),
-    Rule::Get<Spec::GLSL, 130, Shader::ALL, 0>(&isnan_30B),
     Rule::Get<Spec::ESSL, 300, Shader::ALL, 0>(&isinf_00B),
-    Rule::Get<Spec::GLSL, 130, Shader::ALL, 0>(&isinf_00B),
     Rule::Get<Spec::ESSL, 300, Shader::ALL, 0>(&isinf_10B),
-    Rule::Get<Spec::GLSL, 130, Shader::ALL, 0>(&isinf_10B),
     Rule::Get<Spec::ESSL, 300, Shader::ALL, 0>(&isinf_20B),
-    Rule::Get<Spec::GLSL, 130, Shader::ALL, 0>(&isinf_20B),
     Rule::Get<Spec::ESSL, 300, Shader::ALL, 0>(&isinf_30B),
-    Rule::Get<Spec::GLSL, 130, Shader::ALL, 0>(&isinf_30B),
     Rule::Get<Spec::ESSL, 300, Shader::ALL, 0>(&floatBitsToInt_00B),
-    Rule::Get<Spec::GLSL, 330, Shader::ALL, 0>(&floatBitsToInt_00B),
     Rule::Get<Spec::ESSL, 300, Shader::ALL, 0>(&floatBitsToInt_10B),
-    Rule::Get<Spec::GLSL, 330, Shader::ALL, 0>(&floatBitsToInt_10B),
     Rule::Get<Spec::ESSL, 300, Shader::ALL, 0>(&floatBitsToInt_20B),
-    Rule::Get<Spec::GLSL, 330, Shader::ALL, 0>(&floatBitsToInt_20B),
     Rule::Get<Spec::ESSL, 300, Shader::ALL, 0>(&floatBitsToInt_30B),
-    Rule::Get<Spec::GLSL, 330, Shader::ALL, 0>(&floatBitsToInt_30B),
     Rule::Get<Spec::ESSL, 300, Shader::ALL, 0>(&floatBitsToUint_00B),
-    Rule::Get<Spec::GLSL, 330, Shader::ALL, 0>(&floatBitsToUint_00B),
     Rule::Get<Spec::ESSL, 300, Shader::ALL, 0>(&floatBitsToUint_10B),
-    Rule::Get<Spec::GLSL, 330, Shader::ALL, 0>(&floatBitsToUint_10B),
     Rule::Get<Spec::ESSL, 300, Shader::ALL, 0>(&floatBitsToUint_20B),
-    Rule::Get<Spec::GLSL, 330, Shader::ALL, 0>(&floatBitsToUint_20B),
     Rule::Get<Spec::ESSL, 300, Shader::ALL, 0>(&floatBitsToUint_30B),
-    Rule::Get<Spec::GLSL, 330, Shader::ALL, 0>(&floatBitsToUint_30B),
     Rule::Get<Spec::ESSL, 300, Shader::ALL, 0>(&intBitsToFloat_00D),
-    Rule::Get<Spec::GLSL, 330, Shader::ALL, 0>(&intBitsToFloat_00D),
     Rule::Get<Spec::ESSL, 300, Shader::ALL, 0>(&intBitsToFloat_10D),
-    Rule::Get<Spec::GLSL, 330, Shader::ALL, 0>(&intBitsToFloat_10D),
     Rule::Get<Spec::ESSL, 300, Shader::ALL, 0>(&intBitsToFloat_20D),
-    Rule::Get<Spec::GLSL, 330, Shader::ALL, 0>(&intBitsToFloat_20D),
     Rule::Get<Spec::ESSL, 300, Shader::ALL, 0>(&intBitsToFloat_30D),
-    Rule::Get<Spec::GLSL, 330, Shader::ALL, 0>(&intBitsToFloat_30D),
     Rule::Get<Spec::ESSL, 300, Shader::ALL, 0>(&uintBitsToFloat_00E),
-    Rule::Get<Spec::GLSL, 330, Shader::ALL, 0>(&uintBitsToFloat_00E),
     Rule::Get<Spec::ESSL, 300, Shader::ALL, 0>(&uintBitsToFloat_10E),
-    Rule::Get<Spec::GLSL, 330, Shader::ALL, 0>(&uintBitsToFloat_10E),
     Rule::Get<Spec::ESSL, 300, Shader::ALL, 0>(&uintBitsToFloat_20E),
-    Rule::Get<Spec::GLSL, 330, Shader::ALL, 0>(&uintBitsToFloat_20E),
     Rule::Get<Spec::ESSL, 300, Shader::ALL, 0>(&uintBitsToFloat_30E),
-    Rule::Get<Spec::GLSL, 330, Shader::ALL, 0>(&uintBitsToFloat_30E),
     Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&fma_00B00B00B),
-    Rule::Get<Spec::GLSL, 400, Shader::ALL, 0>(&fma_00B00B00B),
     Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(EXT_gpu_shader5)>(&fmaExt_00B00B00B),
     Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&fma_10B10B10B),
-    Rule::Get<Spec::GLSL, 400, Shader::ALL, 0>(&fma_10B10B10B),
     Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(EXT_gpu_shader5)>(&fmaExt_10B10B10B),
     Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&fma_20B20B20B),
-    Rule::Get<Spec::GLSL, 400, Shader::ALL, 0>(&fma_20B20B20B),
     Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(EXT_gpu_shader5)>(&fmaExt_20B20B20B),
     Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&fma_30B30B30B),
-    Rule::Get<Spec::GLSL, 400, Shader::ALL, 0>(&fma_30B30B30B),
     Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(EXT_gpu_shader5)>(&fmaExt_30B30B30B),
     Rule::Get<Spec::ESSL, 310, Shader::ALL, 0>(&frexp_00B00D),
-    Rule::Get<Spec::GLSL, 400, Shader::ALL, 0>(&frexp_00B00D),
     Rule::Get<Spec::ESSL, 310, Shader::ALL, 0>(&frexp_10B10D),
-    Rule::Get<Spec::GLSL, 400, Shader::ALL, 0>(&frexp_10B10D),
     Rule::Get<Spec::ESSL, 310, Shader::ALL, 0>(&frexp_20B20D),
-    Rule::Get<Spec::GLSL, 400, Shader::ALL, 0>(&frexp_20B20D),
     Rule::Get<Spec::ESSL, 310, Shader::ALL, 0>(&frexp_30B30D),
-    Rule::Get<Spec::GLSL, 400, Shader::ALL, 0>(&frexp_30B30D),
     Rule::Get<Spec::ESSL, 310, Shader::ALL, 0>(&ldexp_00B00D),
-    Rule::Get<Spec::GLSL, 400, Shader::ALL, 0>(&ldexp_00B00D),
     Rule::Get<Spec::ESSL, 310, Shader::ALL, 0>(&ldexp_10B10D),
-    Rule::Get<Spec::GLSL, 400, Shader::ALL, 0>(&ldexp_10B10D),
     Rule::Get<Spec::ESSL, 310, Shader::ALL, 0>(&ldexp_20B20D),
-    Rule::Get<Spec::GLSL, 400, Shader::ALL, 0>(&ldexp_20B20D),
     Rule::Get<Spec::ESSL, 310, Shader::ALL, 0>(&ldexp_30B30D),
-    Rule::Get<Spec::GLSL, 400, Shader::ALL, 0>(&ldexp_30B30D),
     Rule::Get<Spec::ESSL, 300, Shader::ALL, 0>(&packSnorm2x16_10B),
-    Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&packSnorm2x16_10B),
     Rule::Get<Spec::ESSL, 300, Shader::ALL, 0>(&packHalf2x16_10B),
-    Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&packHalf2x16_10B),
     Rule::Get<Spec::ESSL, 300, Shader::ALL, 0>(&unpackSnorm2x16_00E),
-    Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&unpackSnorm2x16_00E),
     Rule::Get<Spec::ESSL, 300, Shader::ALL, 0>(&unpackHalf2x16_00E),
-    Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&unpackHalf2x16_00E),
     Rule::Get<Spec::ESSL, 300, Shader::ALL, 0>(&packUnorm2x16_10B),
-    Rule::Get<Spec::GLSL, 400, Shader::ALL, 0>(&packUnorm2x16_10B),
     Rule::Get<Spec::ESSL, 300, Shader::ALL, 0>(&unpackUnorm2x16_00E),
-    Rule::Get<Spec::GLSL, 400, Shader::ALL, 0>(&unpackUnorm2x16_00E),
     Rule::Get<Spec::ESSL, 310, Shader::ALL, 0>(&packUnorm4x8_30B),
-    Rule::Get<Spec::GLSL, 400, Shader::ALL, 0>(&packUnorm4x8_30B),
     Rule::Get<Spec::ESSL, 310, Shader::ALL, 0>(&packSnorm4x8_30B),
-    Rule::Get<Spec::GLSL, 400, Shader::ALL, 0>(&packSnorm4x8_30B),
     Rule::Get<Spec::ESSL, 310, Shader::ALL, 0>(&unpackUnorm4x8_00E),
-    Rule::Get<Spec::GLSL, 400, Shader::ALL, 0>(&unpackUnorm4x8_00E),
     Rule::Get<Spec::ESSL, 310, Shader::ALL, 0>(&unpackSnorm4x8_00E),
-    Rule::Get<Spec::GLSL, 400, Shader::ALL, 0>(&unpackSnorm4x8_00E),
     Rule::Get<Spec::ESSL, 0, Shader::ALL, 0>(&length_00B),
-    Rule::Get<Spec::GLSL, 0, Shader::ALL, 0>(&length_00B),
     Rule::Get<Spec::ESSL, 0, Shader::ALL, 0>(&length_10B),
-    Rule::Get<Spec::GLSL, 0, Shader::ALL, 0>(&length_10B),
     Rule::Get<Spec::ESSL, 0, Shader::ALL, 0>(&length_20B),
-    Rule::Get<Spec::GLSL, 0, Shader::ALL, 0>(&length_20B),
     Rule::Get<Spec::ESSL, 0, Shader::ALL, 0>(&length_30B),
-    Rule::Get<Spec::GLSL, 0, Shader::ALL, 0>(&length_30B),
     Rule::Get<Spec::ESSL, 0, Shader::ALL, 0>(&distance_00B00B),
-    Rule::Get<Spec::GLSL, 0, Shader::ALL, 0>(&distance_00B00B),
     Rule::Get<Spec::ESSL, 0, Shader::ALL, 0>(&distance_10B10B),
-    Rule::Get<Spec::GLSL, 0, Shader::ALL, 0>(&distance_10B10B),
     Rule::Get<Spec::ESSL, 0, Shader::ALL, 0>(&distance_20B20B),
-    Rule::Get<Spec::GLSL, 0, Shader::ALL, 0>(&distance_20B20B),
     Rule::Get<Spec::ESSL, 0, Shader::ALL, 0>(&distance_30B30B),
-    Rule::Get<Spec::GLSL, 0, Shader::ALL, 0>(&distance_30B30B),
     Rule::Get<Spec::ESSL, 0, Shader::ALL, 0>(&dot_00B00B),
-    Rule::Get<Spec::GLSL, 0, Shader::ALL, 0>(&dot_00B00B),
     Rule::Get<Spec::ESSL, 0, Shader::ALL, 0>(&dot_10B10B),
-    Rule::Get<Spec::GLSL, 0, Shader::ALL, 0>(&dot_10B10B),
     Rule::Get<Spec::ESSL, 0, Shader::ALL, 0>(&dot_20B20B),
-    Rule::Get<Spec::GLSL, 0, Shader::ALL, 0>(&dot_20B20B),
     Rule::Get<Spec::ESSL, 0, Shader::ALL, 0>(&dot_30B30B),
-    Rule::Get<Spec::GLSL, 0, Shader::ALL, 0>(&dot_30B30B),
     Rule::Get<Spec::ESSL, 0, Shader::ALL, 0>(&cross_20B20B),
-    Rule::Get<Spec::GLSL, 0, Shader::ALL, 0>(&cross_20B20B),
     Rule::Get<Spec::ESSL, 0, Shader::ALL, 0>(&normalize_00B),
-    Rule::Get<Spec::GLSL, 0, Shader::ALL, 0>(&normalize_00B),
     Rule::Get<Spec::ESSL, 0, Shader::ALL, 0>(&normalize_10B),
-    Rule::Get<Spec::GLSL, 0, Shader::ALL, 0>(&normalize_10B),
     Rule::Get<Spec::ESSL, 0, Shader::ALL, 0>(&normalize_20B),
-    Rule::Get<Spec::GLSL, 0, Shader::ALL, 0>(&normalize_20B),
     Rule::Get<Spec::ESSL, 0, Shader::ALL, 0>(&normalize_30B),
-    Rule::Get<Spec::GLSL, 0, Shader::ALL, 0>(&normalize_30B),
     Rule::Get<Spec::ESSL, 0, Shader::ALL, 0>(&faceforward_00B00B00B),
-    Rule::Get<Spec::GLSL, 0, Shader::ALL, 0>(&faceforward_00B00B00B),
     Rule::Get<Spec::ESSL, 0, Shader::ALL, 0>(&faceforward_10B10B10B),
-    Rule::Get<Spec::GLSL, 0, Shader::ALL, 0>(&faceforward_10B10B10B),
     Rule::Get<Spec::ESSL, 0, Shader::ALL, 0>(&faceforward_20B20B20B),
-    Rule::Get<Spec::GLSL, 0, Shader::ALL, 0>(&faceforward_20B20B20B),
     Rule::Get<Spec::ESSL, 0, Shader::ALL, 0>(&faceforward_30B30B30B),
-    Rule::Get<Spec::GLSL, 0, Shader::ALL, 0>(&faceforward_30B30B30B),
     Rule::Get<Spec::ESSL, 0, Shader::ALL, 0>(&reflect_00B00B),
-    Rule::Get<Spec::GLSL, 0, Shader::ALL, 0>(&reflect_00B00B),
     Rule::Get<Spec::ESSL, 0, Shader::ALL, 0>(&reflect_10B10B),
-    Rule::Get<Spec::GLSL, 0, Shader::ALL, 0>(&reflect_10B10B),
     Rule::Get<Spec::ESSL, 0, Shader::ALL, 0>(&reflect_20B20B),
-    Rule::Get<Spec::GLSL, 0, Shader::ALL, 0>(&reflect_20B20B),
     Rule::Get<Spec::ESSL, 0, Shader::ALL, 0>(&reflect_30B30B),
-    Rule::Get<Spec::GLSL, 0, Shader::ALL, 0>(&reflect_30B30B),
     Rule::Get<Spec::ESSL, 0, Shader::ALL, 0>(&refract_00B00B00B),
-    Rule::Get<Spec::GLSL, 0, Shader::ALL, 0>(&refract_00B00B00B),
     Rule::Get<Spec::ESSL, 0, Shader::ALL, 0>(&refract_10B10B00B),
-    Rule::Get<Spec::GLSL, 0, Shader::ALL, 0>(&refract_10B10B00B),
     Rule::Get<Spec::ESSL, 0, Shader::ALL, 0>(&refract_20B20B00B),
-    Rule::Get<Spec::GLSL, 0, Shader::ALL, 0>(&refract_20B20B00B),
     Rule::Get<Spec::ESSL, 0, Shader::ALL, 0>(&refract_30B30B00B),
-    Rule::Get<Spec::GLSL, 0, Shader::ALL, 0>(&refract_30B30B00B),
     Rule::Get<Spec::ESSL, 0, Shader::ALL, 0>(&matrixCompMult_50B50B),
-    Rule::Get<Spec::GLSL, 0, Shader::ALL, 0>(&matrixCompMult_50B50B),
     Rule::Get<Spec::ESSL, 0, Shader::ALL, 0>(&matrixCompMult_A0BA0B),
-    Rule::Get<Spec::GLSL, 0, Shader::ALL, 0>(&matrixCompMult_A0BA0B),
     Rule::Get<Spec::ESSL, 0, Shader::ALL, 0>(&matrixCompMult_F0BF0B),
-    Rule::Get<Spec::GLSL, 0, Shader::ALL, 0>(&matrixCompMult_F0BF0B),
     Rule::Get<Spec::ESSL, 300, Shader::ALL, 0>(&matrixCompMult_90B90B),
     Rule::Get<Spec::ESSL, 300, Shader::ALL, 0>(&matrixCompMult_60B60B),
     Rule::Get<Spec::ESSL, 300, Shader::ALL, 0>(&matrixCompMult_D0BD0B),
@@ -18895,324 +18717,166 @@
     Rule::Get<Spec::ESSL, 300, Shader::ALL, 0>(&matrixCompMult_E0BE0B),
     Rule::Get<Spec::ESSL, 300, Shader::ALL, 0>(&matrixCompMult_B0BB0B),
     Rule::Get<Spec::ESSL, 300, Shader::ALL, 0>(&outerProduct_10B10B),
-    Rule::Get<Spec::GLSL, 120, Shader::ALL, 0>(&outerProduct_10B10B),
     Rule::Get<Spec::ESSL, 300, Shader::ALL, 0>(&outerProduct_20B20B),
-    Rule::Get<Spec::GLSL, 120, Shader::ALL, 0>(&outerProduct_20B20B),
     Rule::Get<Spec::ESSL, 300, Shader::ALL, 0>(&outerProduct_30B30B),
-    Rule::Get<Spec::GLSL, 120, Shader::ALL, 0>(&outerProduct_30B30B),
     Rule::Get<Spec::ESSL, 300, Shader::ALL, 0>(&outerProduct_20B10B),
-    Rule::Get<Spec::GLSL, 120, Shader::ALL, 0>(&outerProduct_20B10B),
     Rule::Get<Spec::ESSL, 300, Shader::ALL, 0>(&outerProduct_10B20B),
-    Rule::Get<Spec::GLSL, 120, Shader::ALL, 0>(&outerProduct_10B20B),
     Rule::Get<Spec::ESSL, 300, Shader::ALL, 0>(&outerProduct_30B10B),
-    Rule::Get<Spec::GLSL, 120, Shader::ALL, 0>(&outerProduct_30B10B),
     Rule::Get<Spec::ESSL, 300, Shader::ALL, 0>(&outerProduct_10B30B),
-    Rule::Get<Spec::GLSL, 120, Shader::ALL, 0>(&outerProduct_10B30B),
     Rule::Get<Spec::ESSL, 300, Shader::ALL, 0>(&outerProduct_30B20B),
-    Rule::Get<Spec::GLSL, 120, Shader::ALL, 0>(&outerProduct_30B20B),
     Rule::Get<Spec::ESSL, 300, Shader::ALL, 0>(&outerProduct_20B30B),
-    Rule::Get<Spec::GLSL, 120, Shader::ALL, 0>(&outerProduct_20B30B),
     Rule::Get<Spec::ESSL, 300, Shader::ALL, 0>(&transpose_50B),
-    Rule::Get<Spec::GLSL, 120, Shader::ALL, 0>(&transpose_50B),
     Rule::Get<Spec::ESSL, 300, Shader::ALL, 0>(&transpose_A0B),
-    Rule::Get<Spec::GLSL, 120, Shader::ALL, 0>(&transpose_A0B),
     Rule::Get<Spec::ESSL, 300, Shader::ALL, 0>(&transpose_F0B),
-    Rule::Get<Spec::GLSL, 120, Shader::ALL, 0>(&transpose_F0B),
     Rule::Get<Spec::ESSL, 300, Shader::ALL, 0>(&transpose_60B),
-    Rule::Get<Spec::GLSL, 120, Shader::ALL, 0>(&transpose_60B),
     Rule::Get<Spec::ESSL, 300, Shader::ALL, 0>(&transpose_90B),
-    Rule::Get<Spec::GLSL, 120, Shader::ALL, 0>(&transpose_90B),
     Rule::Get<Spec::ESSL, 300, Shader::ALL, 0>(&transpose_70B),
-    Rule::Get<Spec::GLSL, 120, Shader::ALL, 0>(&transpose_70B),
     Rule::Get<Spec::ESSL, 300, Shader::ALL, 0>(&transpose_D0B),
-    Rule::Get<Spec::GLSL, 120, Shader::ALL, 0>(&transpose_D0B),
     Rule::Get<Spec::ESSL, 300, Shader::ALL, 0>(&transpose_B0B),
-    Rule::Get<Spec::GLSL, 120, Shader::ALL, 0>(&transpose_B0B),
     Rule::Get<Spec::ESSL, 300, Shader::ALL, 0>(&transpose_E0B),
-    Rule::Get<Spec::GLSL, 120, Shader::ALL, 0>(&transpose_E0B),
     Rule::Get<Spec::ESSL, 300, Shader::ALL, 0>(&determinant_50B),
     Rule::Get<Spec::ESSL, 300, Shader::ALL, 0>(&determinant_A0B),
     Rule::Get<Spec::ESSL, 300, Shader::ALL, 0>(&determinant_F0B),
     Rule::Get<Spec::ESSL, 300, Shader::ALL, 0>(&inverse_50B),
-    Rule::Get<Spec::GLSL, 140, Shader::ALL, 0>(&inverse_50B),
     Rule::Get<Spec::ESSL, 300, Shader::ALL, 0>(&inverse_A0B),
-    Rule::Get<Spec::GLSL, 140, Shader::ALL, 0>(&inverse_A0B),
     Rule::Get<Spec::ESSL, 300, Shader::ALL, 0>(&inverse_F0B),
-    Rule::Get<Spec::GLSL, 140, Shader::ALL, 0>(&inverse_F0B),
     Rule::Get<Spec::ESSL, 0, Shader::ALL, 0>(&lessThan_10B10B),
-    Rule::Get<Spec::GLSL, 0, Shader::ALL, 0>(&lessThan_10B10B),
     Rule::Get<Spec::ESSL, 0, Shader::ALL, 0>(&lessThan_20B20B),
-    Rule::Get<Spec::GLSL, 0, Shader::ALL, 0>(&lessThan_20B20B),
     Rule::Get<Spec::ESSL, 0, Shader::ALL, 0>(&lessThan_30B30B),
-    Rule::Get<Spec::GLSL, 0, Shader::ALL, 0>(&lessThan_30B30B),
     Rule::Get<Spec::ESSL, 0, Shader::ALL, 0>(&lessThan_10D10D),
-    Rule::Get<Spec::GLSL, 0, Shader::ALL, 0>(&lessThan_10D10D),
     Rule::Get<Spec::ESSL, 0, Shader::ALL, 0>(&lessThan_20D20D),
-    Rule::Get<Spec::GLSL, 0, Shader::ALL, 0>(&lessThan_20D20D),
     Rule::Get<Spec::ESSL, 0, Shader::ALL, 0>(&lessThan_30D30D),
-    Rule::Get<Spec::GLSL, 0, Shader::ALL, 0>(&lessThan_30D30D),
     Rule::Get<Spec::ESSL, 300, Shader::ALL, 0>(&lessThan_10E10E),
-    Rule::Get<Spec::GLSL, 130, Shader::ALL, 0>(&lessThan_10E10E),
     Rule::Get<Spec::ESSL, 300, Shader::ALL, 0>(&lessThan_20E20E),
-    Rule::Get<Spec::GLSL, 130, Shader::ALL, 0>(&lessThan_20E20E),
     Rule::Get<Spec::ESSL, 300, Shader::ALL, 0>(&lessThan_30E30E),
-    Rule::Get<Spec::GLSL, 130, Shader::ALL, 0>(&lessThan_30E30E),
     Rule::Get<Spec::ESSL, 0, Shader::ALL, 0>(&lessThanEqual_10B10B),
-    Rule::Get<Spec::GLSL, 0, Shader::ALL, 0>(&lessThanEqual_10B10B),
     Rule::Get<Spec::ESSL, 0, Shader::ALL, 0>(&lessThanEqual_20B20B),
-    Rule::Get<Spec::GLSL, 0, Shader::ALL, 0>(&lessThanEqual_20B20B),
     Rule::Get<Spec::ESSL, 0, Shader::ALL, 0>(&lessThanEqual_30B30B),
-    Rule::Get<Spec::GLSL, 0, Shader::ALL, 0>(&lessThanEqual_30B30B),
     Rule::Get<Spec::ESSL, 0, Shader::ALL, 0>(&lessThanEqual_10D10D),
-    Rule::Get<Spec::GLSL, 0, Shader::ALL, 0>(&lessThanEqual_10D10D),
     Rule::Get<Spec::ESSL, 0, Shader::ALL, 0>(&lessThanEqual_20D20D),
-    Rule::Get<Spec::GLSL, 0, Shader::ALL, 0>(&lessThanEqual_20D20D),
     Rule::Get<Spec::ESSL, 0, Shader::ALL, 0>(&lessThanEqual_30D30D),
-    Rule::Get<Spec::GLSL, 0, Shader::ALL, 0>(&lessThanEqual_30D30D),
     Rule::Get<Spec::ESSL, 300, Shader::ALL, 0>(&lessThanEqual_10E10E),
-    Rule::Get<Spec::GLSL, 130, Shader::ALL, 0>(&lessThanEqual_10E10E),
     Rule::Get<Spec::ESSL, 300, Shader::ALL, 0>(&lessThanEqual_20E20E),
-    Rule::Get<Spec::GLSL, 130, Shader::ALL, 0>(&lessThanEqual_20E20E),
     Rule::Get<Spec::ESSL, 300, Shader::ALL, 0>(&lessThanEqual_30E30E),
-    Rule::Get<Spec::GLSL, 130, Shader::ALL, 0>(&lessThanEqual_30E30E),
     Rule::Get<Spec::ESSL, 0, Shader::ALL, 0>(&greaterThan_10B10B),
-    Rule::Get<Spec::GLSL, 0, Shader::ALL, 0>(&greaterThan_10B10B),
     Rule::Get<Spec::ESSL, 0, Shader::ALL, 0>(&greaterThan_20B20B),
-    Rule::Get<Spec::GLSL, 0, Shader::ALL, 0>(&greaterThan_20B20B),
     Rule::Get<Spec::ESSL, 0, Shader::ALL, 0>(&greaterThan_30B30B),
-    Rule::Get<Spec::GLSL, 0, Shader::ALL, 0>(&greaterThan_30B30B),
     Rule::Get<Spec::ESSL, 0, Shader::ALL, 0>(&greaterThan_10D10D),
-    Rule::Get<Spec::GLSL, 0, Shader::ALL, 0>(&greaterThan_10D10D),
     Rule::Get<Spec::ESSL, 0, Shader::ALL, 0>(&greaterThan_20D20D),
-    Rule::Get<Spec::GLSL, 0, Shader::ALL, 0>(&greaterThan_20D20D),
     Rule::Get<Spec::ESSL, 0, Shader::ALL, 0>(&greaterThan_30D30D),
-    Rule::Get<Spec::GLSL, 0, Shader::ALL, 0>(&greaterThan_30D30D),
     Rule::Get<Spec::ESSL, 300, Shader::ALL, 0>(&greaterThan_10E10E),
-    Rule::Get<Spec::GLSL, 130, Shader::ALL, 0>(&greaterThan_10E10E),
     Rule::Get<Spec::ESSL, 300, Shader::ALL, 0>(&greaterThan_20E20E),
-    Rule::Get<Spec::GLSL, 130, Shader::ALL, 0>(&greaterThan_20E20E),
     Rule::Get<Spec::ESSL, 300, Shader::ALL, 0>(&greaterThan_30E30E),
-    Rule::Get<Spec::GLSL, 130, Shader::ALL, 0>(&greaterThan_30E30E),
     Rule::Get<Spec::ESSL, 0, Shader::ALL, 0>(&greaterThanEqual_10B10B),
-    Rule::Get<Spec::GLSL, 0, Shader::ALL, 0>(&greaterThanEqual_10B10B),
     Rule::Get<Spec::ESSL, 0, Shader::ALL, 0>(&greaterThanEqual_20B20B),
-    Rule::Get<Spec::GLSL, 0, Shader::ALL, 0>(&greaterThanEqual_20B20B),
     Rule::Get<Spec::ESSL, 0, Shader::ALL, 0>(&greaterThanEqual_30B30B),
-    Rule::Get<Spec::GLSL, 0, Shader::ALL, 0>(&greaterThanEqual_30B30B),
     Rule::Get<Spec::ESSL, 0, Shader::ALL, 0>(&greaterThanEqual_10D10D),
-    Rule::Get<Spec::GLSL, 0, Shader::ALL, 0>(&greaterThanEqual_10D10D),
     Rule::Get<Spec::ESSL, 0, Shader::ALL, 0>(&greaterThanEqual_20D20D),
-    Rule::Get<Spec::GLSL, 0, Shader::ALL, 0>(&greaterThanEqual_20D20D),
     Rule::Get<Spec::ESSL, 0, Shader::ALL, 0>(&greaterThanEqual_30D30D),
-    Rule::Get<Spec::GLSL, 0, Shader::ALL, 0>(&greaterThanEqual_30D30D),
     Rule::Get<Spec::ESSL, 300, Shader::ALL, 0>(&greaterThanEqual_10E10E),
-    Rule::Get<Spec::GLSL, 130, Shader::ALL, 0>(&greaterThanEqual_10E10E),
     Rule::Get<Spec::ESSL, 300, Shader::ALL, 0>(&greaterThanEqual_20E20E),
-    Rule::Get<Spec::GLSL, 130, Shader::ALL, 0>(&greaterThanEqual_20E20E),
     Rule::Get<Spec::ESSL, 300, Shader::ALL, 0>(&greaterThanEqual_30E30E),
-    Rule::Get<Spec::GLSL, 130, Shader::ALL, 0>(&greaterThanEqual_30E30E),
     Rule::Get<Spec::ESSL, 0, Shader::ALL, 0>(&equal_10B10B),
-    Rule::Get<Spec::GLSL, 0, Shader::ALL, 0>(&equal_10B10B),
     Rule::Get<Spec::ESSL, 0, Shader::ALL, 0>(&equal_20B20B),
-    Rule::Get<Spec::GLSL, 0, Shader::ALL, 0>(&equal_20B20B),
     Rule::Get<Spec::ESSL, 0, Shader::ALL, 0>(&equal_30B30B),
-    Rule::Get<Spec::GLSL, 0, Shader::ALL, 0>(&equal_30B30B),
     Rule::Get<Spec::ESSL, 0, Shader::ALL, 0>(&equal_10D10D),
-    Rule::Get<Spec::GLSL, 0, Shader::ALL, 0>(&equal_10D10D),
     Rule::Get<Spec::ESSL, 0, Shader::ALL, 0>(&equal_20D20D),
-    Rule::Get<Spec::GLSL, 0, Shader::ALL, 0>(&equal_20D20D),
     Rule::Get<Spec::ESSL, 0, Shader::ALL, 0>(&equal_30D30D),
-    Rule::Get<Spec::GLSL, 0, Shader::ALL, 0>(&equal_30D30D),
     Rule::Get<Spec::ESSL, 300, Shader::ALL, 0>(&equal_10E10E),
-    Rule::Get<Spec::GLSL, 130, Shader::ALL, 0>(&equal_10E10E),
     Rule::Get<Spec::ESSL, 300, Shader::ALL, 0>(&equal_20E20E),
-    Rule::Get<Spec::GLSL, 130, Shader::ALL, 0>(&equal_20E20E),
     Rule::Get<Spec::ESSL, 300, Shader::ALL, 0>(&equal_30E30E),
-    Rule::Get<Spec::GLSL, 130, Shader::ALL, 0>(&equal_30E30E),
     Rule::Get<Spec::ESSL, 0, Shader::ALL, 0>(&equal_10F10F),
-    Rule::Get<Spec::GLSL, 0, Shader::ALL, 0>(&equal_10F10F),
     Rule::Get<Spec::ESSL, 0, Shader::ALL, 0>(&equal_20F20F),
-    Rule::Get<Spec::GLSL, 0, Shader::ALL, 0>(&equal_20F20F),
     Rule::Get<Spec::ESSL, 0, Shader::ALL, 0>(&equal_30F30F),
-    Rule::Get<Spec::GLSL, 0, Shader::ALL, 0>(&equal_30F30F),
     Rule::Get<Spec::ESSL, 0, Shader::ALL, 0>(&notEqual_10B10B),
-    Rule::Get<Spec::GLSL, 0, Shader::ALL, 0>(&notEqual_10B10B),
     Rule::Get<Spec::ESSL, 0, Shader::ALL, 0>(&notEqual_20B20B),
-    Rule::Get<Spec::GLSL, 0, Shader::ALL, 0>(&notEqual_20B20B),
     Rule::Get<Spec::ESSL, 0, Shader::ALL, 0>(&notEqual_30B30B),
-    Rule::Get<Spec::GLSL, 0, Shader::ALL, 0>(&notEqual_30B30B),
     Rule::Get<Spec::ESSL, 0, Shader::ALL, 0>(&notEqual_10D10D),
-    Rule::Get<Spec::GLSL, 0, Shader::ALL, 0>(&notEqual_10D10D),
     Rule::Get<Spec::ESSL, 0, Shader::ALL, 0>(&notEqual_20D20D),
-    Rule::Get<Spec::GLSL, 0, Shader::ALL, 0>(&notEqual_20D20D),
     Rule::Get<Spec::ESSL, 0, Shader::ALL, 0>(&notEqual_30D30D),
-    Rule::Get<Spec::GLSL, 0, Shader::ALL, 0>(&notEqual_30D30D),
     Rule::Get<Spec::ESSL, 300, Shader::ALL, 0>(&notEqual_10E10E),
-    Rule::Get<Spec::GLSL, 130, Shader::ALL, 0>(&notEqual_10E10E),
     Rule::Get<Spec::ESSL, 300, Shader::ALL, 0>(&notEqual_20E20E),
-    Rule::Get<Spec::GLSL, 130, Shader::ALL, 0>(&notEqual_20E20E),
     Rule::Get<Spec::ESSL, 300, Shader::ALL, 0>(&notEqual_30E30E),
-    Rule::Get<Spec::GLSL, 130, Shader::ALL, 0>(&notEqual_30E30E),
     Rule::Get<Spec::ESSL, 0, Shader::ALL, 0>(&notEqual_10F10F),
-    Rule::Get<Spec::GLSL, 0, Shader::ALL, 0>(&notEqual_10F10F),
     Rule::Get<Spec::ESSL, 0, Shader::ALL, 0>(&notEqual_20F20F),
-    Rule::Get<Spec::GLSL, 0, Shader::ALL, 0>(&notEqual_20F20F),
     Rule::Get<Spec::ESSL, 0, Shader::ALL, 0>(&notEqual_30F30F),
-    Rule::Get<Spec::GLSL, 0, Shader::ALL, 0>(&notEqual_30F30F),
     Rule::Get<Spec::ESSL, 0, Shader::ALL, 0>(&any_10F),
-    Rule::Get<Spec::GLSL, 0, Shader::ALL, 0>(&any_10F),
     Rule::Get<Spec::ESSL, 0, Shader::ALL, 0>(&any_20F),
-    Rule::Get<Spec::GLSL, 0, Shader::ALL, 0>(&any_20F),
     Rule::Get<Spec::ESSL, 0, Shader::ALL, 0>(&any_30F),
-    Rule::Get<Spec::GLSL, 0, Shader::ALL, 0>(&any_30F),
     Rule::Get<Spec::ESSL, 0, Shader::ALL, 0>(&all_10F),
-    Rule::Get<Spec::GLSL, 0, Shader::ALL, 0>(&all_10F),
     Rule::Get<Spec::ESSL, 0, Shader::ALL, 0>(&all_20F),
-    Rule::Get<Spec::GLSL, 0, Shader::ALL, 0>(&all_20F),
     Rule::Get<Spec::ESSL, 0, Shader::ALL, 0>(&all_30F),
-    Rule::Get<Spec::GLSL, 0, Shader::ALL, 0>(&all_30F),
     Rule::Get<Spec::ESSL, 0, Shader::ALL, 0>(&notFunc_10F),
-    Rule::Get<Spec::GLSL, 0, Shader::ALL, 0>(&notFunc_10F),
     Rule::Get<Spec::ESSL, 0, Shader::ALL, 0>(&notFunc_20F),
-    Rule::Get<Spec::GLSL, 0, Shader::ALL, 0>(&notFunc_20F),
     Rule::Get<Spec::ESSL, 0, Shader::ALL, 0>(&notFunc_30F),
-    Rule::Get<Spec::GLSL, 0, Shader::ALL, 0>(&notFunc_30F),
     Rule::Get<Spec::ESSL, 310, Shader::ALL, 0>(&bitfieldExtract_00D00D00D),
-    Rule::Get<Spec::GLSL, 400, Shader::ALL, 0>(&bitfieldExtract_00D00D00D),
     Rule::Get<Spec::ESSL, 310, Shader::ALL, 0>(&bitfieldExtract_10D00D00D),
-    Rule::Get<Spec::GLSL, 400, Shader::ALL, 0>(&bitfieldExtract_10D00D00D),
     Rule::Get<Spec::ESSL, 310, Shader::ALL, 0>(&bitfieldExtract_20D00D00D),
-    Rule::Get<Spec::GLSL, 400, Shader::ALL, 0>(&bitfieldExtract_20D00D00D),
     Rule::Get<Spec::ESSL, 310, Shader::ALL, 0>(&bitfieldExtract_30D00D00D),
-    Rule::Get<Spec::GLSL, 400, Shader::ALL, 0>(&bitfieldExtract_30D00D00D),
     Rule::Get<Spec::ESSL, 310, Shader::ALL, 0>(&bitfieldExtract_00E00D00D),
-    Rule::Get<Spec::GLSL, 400, Shader::ALL, 0>(&bitfieldExtract_00E00D00D),
     Rule::Get<Spec::ESSL, 310, Shader::ALL, 0>(&bitfieldExtract_10E00D00D),
-    Rule::Get<Spec::GLSL, 400, Shader::ALL, 0>(&bitfieldExtract_10E00D00D),
     Rule::Get<Spec::ESSL, 310, Shader::ALL, 0>(&bitfieldExtract_20E00D00D),
-    Rule::Get<Spec::GLSL, 400, Shader::ALL, 0>(&bitfieldExtract_20E00D00D),
     Rule::Get<Spec::ESSL, 310, Shader::ALL, 0>(&bitfieldExtract_30E00D00D),
-    Rule::Get<Spec::GLSL, 400, Shader::ALL, 0>(&bitfieldExtract_30E00D00D),
     Rule::Get<Spec::ESSL, 310, Shader::ALL, 0>(&bitfieldInsert_00D00D00D00D),
-    Rule::Get<Spec::GLSL, 400, Shader::ALL, 0>(&bitfieldInsert_00D00D00D00D),
     Rule::Get<Spec::ESSL, 310, Shader::ALL, 0>(&bitfieldInsert_10D10D00D00D),
-    Rule::Get<Spec::GLSL, 400, Shader::ALL, 0>(&bitfieldInsert_10D10D00D00D),
     Rule::Get<Spec::ESSL, 310, Shader::ALL, 0>(&bitfieldInsert_20D20D00D00D),
-    Rule::Get<Spec::GLSL, 400, Shader::ALL, 0>(&bitfieldInsert_20D20D00D00D),
     Rule::Get<Spec::ESSL, 310, Shader::ALL, 0>(&bitfieldInsert_30D30D00D00D),
-    Rule::Get<Spec::GLSL, 400, Shader::ALL, 0>(&bitfieldInsert_30D30D00D00D),
     Rule::Get<Spec::ESSL, 310, Shader::ALL, 0>(&bitfieldInsert_00E00E00D00D),
-    Rule::Get<Spec::GLSL, 400, Shader::ALL, 0>(&bitfieldInsert_00E00E00D00D),
     Rule::Get<Spec::ESSL, 310, Shader::ALL, 0>(&bitfieldInsert_10E10E00D00D),
-    Rule::Get<Spec::GLSL, 400, Shader::ALL, 0>(&bitfieldInsert_10E10E00D00D),
     Rule::Get<Spec::ESSL, 310, Shader::ALL, 0>(&bitfieldInsert_20E20E00D00D),
-    Rule::Get<Spec::GLSL, 400, Shader::ALL, 0>(&bitfieldInsert_20E20E00D00D),
     Rule::Get<Spec::ESSL, 310, Shader::ALL, 0>(&bitfieldInsert_30E30E00D00D),
-    Rule::Get<Spec::GLSL, 400, Shader::ALL, 0>(&bitfieldInsert_30E30E00D00D),
     Rule::Get<Spec::ESSL, 310, Shader::ALL, 0>(&bitfieldReverse_00D),
-    Rule::Get<Spec::GLSL, 400, Shader::ALL, 0>(&bitfieldReverse_00D),
     Rule::Get<Spec::ESSL, 310, Shader::ALL, 0>(&bitfieldReverse_10D),
-    Rule::Get<Spec::GLSL, 400, Shader::ALL, 0>(&bitfieldReverse_10D),
     Rule::Get<Spec::ESSL, 310, Shader::ALL, 0>(&bitfieldReverse_20D),
-    Rule::Get<Spec::GLSL, 400, Shader::ALL, 0>(&bitfieldReverse_20D),
     Rule::Get<Spec::ESSL, 310, Shader::ALL, 0>(&bitfieldReverse_30D),
-    Rule::Get<Spec::GLSL, 400, Shader::ALL, 0>(&bitfieldReverse_30D),
     Rule::Get<Spec::ESSL, 310, Shader::ALL, 0>(&bitfieldReverse_00E),
-    Rule::Get<Spec::GLSL, 400, Shader::ALL, 0>(&bitfieldReverse_00E),
     Rule::Get<Spec::ESSL, 310, Shader::ALL, 0>(&bitfieldReverse_10E),
-    Rule::Get<Spec::GLSL, 400, Shader::ALL, 0>(&bitfieldReverse_10E),
     Rule::Get<Spec::ESSL, 310, Shader::ALL, 0>(&bitfieldReverse_20E),
-    Rule::Get<Spec::GLSL, 400, Shader::ALL, 0>(&bitfieldReverse_20E),
     Rule::Get<Spec::ESSL, 310, Shader::ALL, 0>(&bitfieldReverse_30E),
-    Rule::Get<Spec::GLSL, 400, Shader::ALL, 0>(&bitfieldReverse_30E),
     Rule::Get<Spec::ESSL, 310, Shader::ALL, 0>(&bitCount_00D),
-    Rule::Get<Spec::GLSL, 400, Shader::ALL, 0>(&bitCount_00D),
     Rule::Get<Spec::ESSL, 310, Shader::ALL, 0>(&bitCount_10D),
-    Rule::Get<Spec::GLSL, 400, Shader::ALL, 0>(&bitCount_10D),
     Rule::Get<Spec::ESSL, 310, Shader::ALL, 0>(&bitCount_20D),
-    Rule::Get<Spec::GLSL, 400, Shader::ALL, 0>(&bitCount_20D),
     Rule::Get<Spec::ESSL, 310, Shader::ALL, 0>(&bitCount_30D),
-    Rule::Get<Spec::GLSL, 400, Shader::ALL, 0>(&bitCount_30D),
     Rule::Get<Spec::ESSL, 310, Shader::ALL, 0>(&bitCount_00E),
-    Rule::Get<Spec::GLSL, 400, Shader::ALL, 0>(&bitCount_00E),
     Rule::Get<Spec::ESSL, 310, Shader::ALL, 0>(&bitCount_10E),
-    Rule::Get<Spec::GLSL, 400, Shader::ALL, 0>(&bitCount_10E),
     Rule::Get<Spec::ESSL, 310, Shader::ALL, 0>(&bitCount_20E),
-    Rule::Get<Spec::GLSL, 400, Shader::ALL, 0>(&bitCount_20E),
     Rule::Get<Spec::ESSL, 310, Shader::ALL, 0>(&bitCount_30E),
-    Rule::Get<Spec::GLSL, 400, Shader::ALL, 0>(&bitCount_30E),
     Rule::Get<Spec::ESSL, 310, Shader::ALL, 0>(&findLSB_00D),
-    Rule::Get<Spec::GLSL, 400, Shader::ALL, 0>(&findLSB_00D),
     Rule::Get<Spec::ESSL, 310, Shader::ALL, 0>(&findLSB_10D),
-    Rule::Get<Spec::GLSL, 400, Shader::ALL, 0>(&findLSB_10D),
     Rule::Get<Spec::ESSL, 310, Shader::ALL, 0>(&findLSB_20D),
-    Rule::Get<Spec::GLSL, 400, Shader::ALL, 0>(&findLSB_20D),
     Rule::Get<Spec::ESSL, 310, Shader::ALL, 0>(&findLSB_30D),
-    Rule::Get<Spec::GLSL, 400, Shader::ALL, 0>(&findLSB_30D),
     Rule::Get<Spec::ESSL, 310, Shader::ALL, 0>(&findLSB_00E),
-    Rule::Get<Spec::GLSL, 400, Shader::ALL, 0>(&findLSB_00E),
     Rule::Get<Spec::ESSL, 310, Shader::ALL, 0>(&findLSB_10E),
-    Rule::Get<Spec::GLSL, 400, Shader::ALL, 0>(&findLSB_10E),
     Rule::Get<Spec::ESSL, 310, Shader::ALL, 0>(&findLSB_20E),
-    Rule::Get<Spec::GLSL, 400, Shader::ALL, 0>(&findLSB_20E),
     Rule::Get<Spec::ESSL, 310, Shader::ALL, 0>(&findLSB_30E),
-    Rule::Get<Spec::GLSL, 400, Shader::ALL, 0>(&findLSB_30E),
     Rule::Get<Spec::ESSL, 310, Shader::ALL, 0>(&findMSB_00D),
-    Rule::Get<Spec::GLSL, 400, Shader::ALL, 0>(&findMSB_00D),
     Rule::Get<Spec::ESSL, 310, Shader::ALL, 0>(&findMSB_10D),
-    Rule::Get<Spec::GLSL, 400, Shader::ALL, 0>(&findMSB_10D),
     Rule::Get<Spec::ESSL, 310, Shader::ALL, 0>(&findMSB_20D),
-    Rule::Get<Spec::GLSL, 400, Shader::ALL, 0>(&findMSB_20D),
     Rule::Get<Spec::ESSL, 310, Shader::ALL, 0>(&findMSB_30D),
-    Rule::Get<Spec::GLSL, 400, Shader::ALL, 0>(&findMSB_30D),
     Rule::Get<Spec::ESSL, 310, Shader::ALL, 0>(&findMSB_00E),
-    Rule::Get<Spec::GLSL, 400, Shader::ALL, 0>(&findMSB_00E),
     Rule::Get<Spec::ESSL, 310, Shader::ALL, 0>(&findMSB_10E),
-    Rule::Get<Spec::GLSL, 400, Shader::ALL, 0>(&findMSB_10E),
     Rule::Get<Spec::ESSL, 310, Shader::ALL, 0>(&findMSB_20E),
-    Rule::Get<Spec::GLSL, 400, Shader::ALL, 0>(&findMSB_20E),
     Rule::Get<Spec::ESSL, 310, Shader::ALL, 0>(&findMSB_30E),
-    Rule::Get<Spec::GLSL, 400, Shader::ALL, 0>(&findMSB_30E),
     Rule::Get<Spec::ESSL, 310, Shader::ALL, 0>(&uaddCarry_00E00E00E),
-    Rule::Get<Spec::GLSL, 400, Shader::ALL, 0>(&uaddCarry_00E00E00E),
     Rule::Get<Spec::ESSL, 310, Shader::ALL, 0>(&uaddCarry_10E10E10E),
-    Rule::Get<Spec::GLSL, 400, Shader::ALL, 0>(&uaddCarry_10E10E10E),
     Rule::Get<Spec::ESSL, 310, Shader::ALL, 0>(&uaddCarry_20E20E20E),
-    Rule::Get<Spec::GLSL, 400, Shader::ALL, 0>(&uaddCarry_20E20E20E),
     Rule::Get<Spec::ESSL, 310, Shader::ALL, 0>(&uaddCarry_30E30E30E),
-    Rule::Get<Spec::GLSL, 400, Shader::ALL, 0>(&uaddCarry_30E30E30E),
     Rule::Get<Spec::ESSL, 310, Shader::ALL, 0>(&usubBorrow_00E00E00E),
-    Rule::Get<Spec::GLSL, 400, Shader::ALL, 0>(&usubBorrow_00E00E00E),
     Rule::Get<Spec::ESSL, 310, Shader::ALL, 0>(&usubBorrow_10E10E10E),
-    Rule::Get<Spec::GLSL, 400, Shader::ALL, 0>(&usubBorrow_10E10E10E),
     Rule::Get<Spec::ESSL, 310, Shader::ALL, 0>(&usubBorrow_20E20E20E),
-    Rule::Get<Spec::GLSL, 400, Shader::ALL, 0>(&usubBorrow_20E20E20E),
     Rule::Get<Spec::ESSL, 310, Shader::ALL, 0>(&usubBorrow_30E30E30E),
-    Rule::Get<Spec::GLSL, 400, Shader::ALL, 0>(&usubBorrow_30E30E30E),
     Rule::Get<Spec::ESSL, 310, Shader::ALL, 0>(&umulExtended_00E00E00E00E),
-    Rule::Get<Spec::GLSL, 400, Shader::ALL, 0>(&umulExtended_00E00E00E00E),
     Rule::Get<Spec::ESSL, 310, Shader::ALL, 0>(&umulExtended_10E10E10E10E),
-    Rule::Get<Spec::GLSL, 400, Shader::ALL, 0>(&umulExtended_10E10E10E10E),
     Rule::Get<Spec::ESSL, 310, Shader::ALL, 0>(&umulExtended_20E20E20E20E),
-    Rule::Get<Spec::GLSL, 400, Shader::ALL, 0>(&umulExtended_20E20E20E20E),
     Rule::Get<Spec::ESSL, 310, Shader::ALL, 0>(&umulExtended_30E30E30E30E),
-    Rule::Get<Spec::GLSL, 400, Shader::ALL, 0>(&umulExtended_30E30E30E30E),
     Rule::Get<Spec::ESSL, 310, Shader::ALL, 0>(&imulExtended_00D00D00D00D),
-    Rule::Get<Spec::GLSL, 400, Shader::ALL, 0>(&imulExtended_00D00D00D00D),
     Rule::Get<Spec::ESSL, 310, Shader::ALL, 0>(&imulExtended_10D10D10D10D),
-    Rule::Get<Spec::GLSL, 400, Shader::ALL, 0>(&imulExtended_10D10D10D10D),
     Rule::Get<Spec::ESSL, 310, Shader::ALL, 0>(&imulExtended_20D20D20D20D),
-    Rule::Get<Spec::GLSL, 400, Shader::ALL, 0>(&imulExtended_20D20D20D20D),
     Rule::Get<Spec::ESSL, 310, Shader::ALL, 0>(&imulExtended_30D30D30D30D),
-    Rule::Get<Spec::GLSL, 400, Shader::ALL, 0>(&imulExtended_30D30D30D30D),
     Rule::Get<Spec::ESSL, 100, Shader::ALL, 0>(&texture2D_00I10B),
-    Rule::Get<Spec::GLSL, 0, Shader::ALL, 0>(&texture2D_00I10B),
     Rule::Get<Spec::ESSL, 100, Shader::ALL, 0>(&texture2DProj_00I20B),
-    Rule::Get<Spec::GLSL, 0, Shader::ALL, 0>(&texture2DProj_00I20B),
     Rule::Get<Spec::ESSL, 100, Shader::ALL, 0>(&texture2DProj_00I30B),
-    Rule::Get<Spec::GLSL, 0, Shader::ALL, 0>(&texture2DProj_00I30B),
     Rule::Get<Spec::ESSL, 100, Shader::ALL, 0>(&textureCube_00K20B),
-    Rule::Get<Spec::GLSL, 0, Shader::ALL, 0>(&textureCube_00K20B),
     Rule::Get<Spec::ESSL, 100, Shader::ALL, EXT_INDEX(OES_texture_3D)>(&texture3D_00J20B),
     Rule::Get<Spec::ESSL, 100, Shader::ALL, EXT_INDEX(OES_texture_3D)>(&texture3DProj_00J30B),
     Rule::Get<Spec::ESSL, 100, Shader::ALL, EXT_INDEX(EXT_shadow_samplers)>(&shadow2DEXT_00d20B),
@@ -19244,15 +18908,10 @@
     Rule::Get<Spec::ESSL, 100, Shader::ALL, EXT_INDEX(EXT_shader_texture_lod)>(
         &textureCubeGradEXT_00K20B20B20B),
     Rule::Get<Spec::ESSL, 100, Shader::ALL, 0>(&textureVideoWEBGL_00y10B),
-    Rule::Get<Spec::GLSL, 0, Shader::ALL, 0>(&textureVideoWEBGL_00y10B),
     Rule::Get<Spec::ESSL, 100, Shader::FRAGMENT, 0>(&texture2D_00I10B00B),
-    Rule::Get<Spec::GLSL, 0, Shader::FRAGMENT, 0>(&texture2D_00I10B00B),
     Rule::Get<Spec::ESSL, 100, Shader::FRAGMENT, 0>(&texture2DProj_00I20B00B),
-    Rule::Get<Spec::GLSL, 0, Shader::FRAGMENT, 0>(&texture2DProj_00I20B00B),
     Rule::Get<Spec::ESSL, 100, Shader::FRAGMENT, 0>(&texture2DProj_00I30B00B),
-    Rule::Get<Spec::GLSL, 0, Shader::FRAGMENT, 0>(&texture2DProj_00I30B00B),
     Rule::Get<Spec::ESSL, 100, Shader::FRAGMENT, 0>(&textureCube_00K20B00B),
-    Rule::Get<Spec::GLSL, 0, Shader::FRAGMENT, 0>(&textureCube_00K20B00B),
     Rule::Get<Spec::ESSL, 100, Shader::FRAGMENT, EXT_INDEX(OES_texture_3D)>(&texture3D_00J20B00B),
     Rule::Get<Spec::ESSL, 100, Shader::FRAGMENT, EXT_INDEX(OES_texture_3D)>(
         &texture3DProj_00J30B00B),
@@ -19271,55 +18930,36 @@
     Rule::Get<Spec::ESSL, 100, Shader::FRAGMENT, EXT_INDEX(EXT_shader_texture_lod)>(
         &textureCubeLodEXT_00K20B00B),
     Rule::Get<Spec::ESSL, 300, Shader::ALL, 0>(&texture_00I10B),
-    Rule::Get<Spec::GLSL, 130, Shader::ALL, 0>(&texture_00I10B),
     Rule::Get<Spec::ESSL, 300, Shader::ALL, 0>(&texture_00R10B),
-    Rule::Get<Spec::GLSL, 130, Shader::ALL, 0>(&texture_00R10B),
     Rule::Get<Spec::ESSL, 300, Shader::ALL, 0>(&texture_00X10B),
-    Rule::Get<Spec::GLSL, 130, Shader::ALL, 0>(&texture_00X10B),
     Rule::Get<Spec::ESSL, 300, Shader::ALL, 0>(&texture_00J20B),
-    Rule::Get<Spec::GLSL, 130, Shader::ALL, 0>(&texture_00J20B),
     Rule::Get<Spec::ESSL, 300, Shader::ALL, 0>(&texture_00S20B),
-    Rule::Get<Spec::GLSL, 130, Shader::ALL, 0>(&texture_00S20B),
     Rule::Get<Spec::ESSL, 300, Shader::ALL, 0>(&texture_00Y20B),
-    Rule::Get<Spec::GLSL, 130, Shader::ALL, 0>(&texture_00Y20B),
     Rule::Get<Spec::ESSL, 300, Shader::ALL, 0>(&texture_00K20B),
-    Rule::Get<Spec::GLSL, 130, Shader::ALL, 0>(&texture_00K20B),
     Rule::Get<Spec::ESSL, 300, Shader::ALL, 0>(&texture_00T20B),
-    Rule::Get<Spec::GLSL, 130, Shader::ALL, 0>(&texture_00T20B),
     Rule::Get<Spec::ESSL, 300, Shader::ALL, 0>(&texture_00Z20B),
-    Rule::Get<Spec::GLSL, 130, Shader::ALL, 0>(&texture_00Z20B),
     Rule::Get<Spec::ESSL, 300, Shader::ALL, 0>(&texture_00L20B),
-    Rule::Get<Spec::GLSL, 130, Shader::ALL, 0>(&texture_00L20B),
     Rule::Get<Spec::ESSL, 300, Shader::ALL, 0>(&texture_00U20B),
-    Rule::Get<Spec::GLSL, 130, Shader::ALL, 0>(&texture_00U20B),
     Rule::Get<Spec::ESSL, 300, Shader::ALL, 0>(&texture_00a20B),
-    Rule::Get<Spec::GLSL, 130, Shader::ALL, 0>(&texture_00a20B),
     Rule::Get<Spec::ESSL, 300, Shader::ALL, 0>(&texture_00d20B),
-    Rule::Get<Spec::GLSL, 130, Shader::ALL, 0>(&texture_00d20B),
     Rule::Get<Spec::ESSL, 300, Shader::ALL, 0>(&texture_00e30B),
-    Rule::Get<Spec::GLSL, 130, Shader::ALL, 0>(&texture_00e30B),
     Rule::Get<Spec::ESSL, 300, Shader::ALL, 0>(&texture_00f30B),
-    Rule::Get<Spec::GLSL, 130, Shader::ALL, 0>(&texture_00f30B),
     Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&texture_00k30B),
-    Rule::Get<Spec::GLSL, 400, Shader::ALL, 0>(&texture_00k30B),
     Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_texture_cube_map_array)>(
         &textureExt_00k30B),
     Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(EXT_texture_cube_map_array)>(
         &textureExt_00k30B),
     Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&texture_00s30B),
-    Rule::Get<Spec::GLSL, 400, Shader::ALL, 0>(&texture_00s30B),
     Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_texture_cube_map_array)>(
         &textureExt_00s30B),
     Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(EXT_texture_cube_map_array)>(
         &textureExt_00s30B),
     Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&texture_00x30B),
-    Rule::Get<Spec::GLSL, 400, Shader::ALL, 0>(&texture_00x30B),
     Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_texture_cube_map_array)>(
         &textureExt_00x30B),
     Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(EXT_texture_cube_map_array)>(
         &textureExt_00x30B),
     Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&texture_00l30B00B),
-    Rule::Get<Spec::GLSL, 400, Shader::ALL, 0>(&texture_00l30B00B),
     Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_texture_cube_map_array)>(
         &textureExt_00l30B00B),
     Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(EXT_texture_cube_map_array)>(
@@ -19329,27 +18969,16 @@
     Rule::Get<Spec::ESSL, 300, Shader::ALL, EXT_INDEX(EXT_YUV_target)>(&texture_00N10B),
     Rule::Get<Spec::ESSL, 300, Shader::ALL, EXT_INDEX(ARB_texture_rectangle)>(&texture_00O10B),
     Rule::Get<Spec::ESSL, 300, Shader::ALL, 0>(&texture_00y10B),
-    Rule::Get<Spec::GLSL, 130, Shader::ALL, 0>(&texture_00y10B),
     Rule::Get<Spec::ESSL, 300, Shader::ALL, 0>(&textureProj_00I20B),
-    Rule::Get<Spec::GLSL, 130, Shader::ALL, 0>(&textureProj_00I20B),
     Rule::Get<Spec::ESSL, 300, Shader::ALL, 0>(&textureProj_00R20B),
-    Rule::Get<Spec::GLSL, 130, Shader::ALL, 0>(&textureProj_00R20B),
     Rule::Get<Spec::ESSL, 300, Shader::ALL, 0>(&textureProj_00X20B),
-    Rule::Get<Spec::GLSL, 130, Shader::ALL, 0>(&textureProj_00X20B),
     Rule::Get<Spec::ESSL, 300, Shader::ALL, 0>(&textureProj_00I30B),
-    Rule::Get<Spec::GLSL, 130, Shader::ALL, 0>(&textureProj_00I30B),
     Rule::Get<Spec::ESSL, 300, Shader::ALL, 0>(&textureProj_00R30B),
-    Rule::Get<Spec::GLSL, 130, Shader::ALL, 0>(&textureProj_00R30B),
     Rule::Get<Spec::ESSL, 300, Shader::ALL, 0>(&textureProj_00X30B),
-    Rule::Get<Spec::GLSL, 130, Shader::ALL, 0>(&textureProj_00X30B),
     Rule::Get<Spec::ESSL, 300, Shader::ALL, 0>(&textureProj_00J30B),
-    Rule::Get<Spec::GLSL, 130, Shader::ALL, 0>(&textureProj_00J30B),
     Rule::Get<Spec::ESSL, 300, Shader::ALL, 0>(&textureProj_00S30B),
-    Rule::Get<Spec::GLSL, 130, Shader::ALL, 0>(&textureProj_00S30B),
     Rule::Get<Spec::ESSL, 300, Shader::ALL, 0>(&textureProj_00Y30B),
-    Rule::Get<Spec::GLSL, 130, Shader::ALL, 0>(&textureProj_00Y30B),
     Rule::Get<Spec::ESSL, 300, Shader::ALL, 0>(&textureProj_00d30B),
-    Rule::Get<Spec::GLSL, 130, Shader::ALL, 0>(&textureProj_00d30B),
     Rule::Get<Spec::ESSL, 300, Shader::ALL, EXT_INDEX(OES_EGL_image_external_essl3)>(
         &textureProj_00M20B),
     Rule::Get<Spec::ESSL, 300, Shader::ALL, EXT_INDEX(OES_EGL_image_external_essl3)>(
@@ -19359,125 +18988,84 @@
     Rule::Get<Spec::ESSL, 300, Shader::ALL, EXT_INDEX(ARB_texture_rectangle)>(&textureProj_00O20B),
     Rule::Get<Spec::ESSL, 300, Shader::ALL, EXT_INDEX(ARB_texture_rectangle)>(&textureProj_00O30B),
     Rule::Get<Spec::ESSL, 300, Shader::ALL, 0>(&textureLod_00I10B00B),
-    Rule::Get<Spec::GLSL, 130, Shader::ALL, 0>(&textureLod_00I10B00B),
     Rule::Get<Spec::ESSL, 300, Shader::ALL, 0>(&textureLod_00R10B00B),
-    Rule::Get<Spec::GLSL, 130, Shader::ALL, 0>(&textureLod_00R10B00B),
     Rule::Get<Spec::ESSL, 300, Shader::ALL, 0>(&textureLod_00X10B00B),
-    Rule::Get<Spec::GLSL, 130, Shader::ALL, 0>(&textureLod_00X10B00B),
     Rule::Get<Spec::ESSL, 300, Shader::ALL, 0>(&textureLod_00J20B00B),
-    Rule::Get<Spec::GLSL, 130, Shader::ALL, 0>(&textureLod_00J20B00B),
     Rule::Get<Spec::ESSL, 300, Shader::ALL, 0>(&textureLod_00S20B00B),
-    Rule::Get<Spec::GLSL, 130, Shader::ALL, 0>(&textureLod_00S20B00B),
     Rule::Get<Spec::ESSL, 300, Shader::ALL, 0>(&textureLod_00Y20B00B),
-    Rule::Get<Spec::GLSL, 130, Shader::ALL, 0>(&textureLod_00Y20B00B),
     Rule::Get<Spec::ESSL, 300, Shader::ALL, 0>(&textureLod_00K20B00B),
-    Rule::Get<Spec::GLSL, 130, Shader::ALL, 0>(&textureLod_00K20B00B),
     Rule::Get<Spec::ESSL, 300, Shader::ALL, 0>(&textureLod_00T20B00B),
-    Rule::Get<Spec::GLSL, 130, Shader::ALL, 0>(&textureLod_00T20B00B),
     Rule::Get<Spec::ESSL, 300, Shader::ALL, 0>(&textureLod_00Z20B00B),
-    Rule::Get<Spec::GLSL, 130, Shader::ALL, 0>(&textureLod_00Z20B00B),
     Rule::Get<Spec::ESSL, 300, Shader::ALL, 0>(&textureLod_00L20B00B),
-    Rule::Get<Spec::GLSL, 130, Shader::ALL, 0>(&textureLod_00L20B00B),
     Rule::Get<Spec::ESSL, 300, Shader::ALL, 0>(&textureLod_00U20B00B),
-    Rule::Get<Spec::GLSL, 130, Shader::ALL, 0>(&textureLod_00U20B00B),
     Rule::Get<Spec::ESSL, 300, Shader::ALL, 0>(&textureLod_00a20B00B),
-    Rule::Get<Spec::GLSL, 130, Shader::ALL, 0>(&textureLod_00a20B00B),
     Rule::Get<Spec::ESSL, 300, Shader::ALL, 0>(&textureLod_00d20B00B),
-    Rule::Get<Spec::GLSL, 130, Shader::ALL, 0>(&textureLod_00d20B00B),
     Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&textureLod_00k30B00B),
-    Rule::Get<Spec::GLSL, 400, Shader::ALL, 0>(&textureLod_00k30B00B),
     Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_texture_cube_map_array)>(
         &textureLodExt_00k30B00B),
     Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(EXT_texture_cube_map_array)>(
         &textureLodExt_00k30B00B),
     Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&textureLod_00s30B00B),
-    Rule::Get<Spec::GLSL, 400, Shader::ALL, 0>(&textureLod_00s30B00B),
     Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_texture_cube_map_array)>(
         &textureLodExt_00s30B00B),
     Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(EXT_texture_cube_map_array)>(
         &textureLodExt_00s30B00B),
     Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&textureLod_00x30B00B),
-    Rule::Get<Spec::GLSL, 400, Shader::ALL, 0>(&textureLod_00x30B00B),
     Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_texture_cube_map_array)>(
         &textureLodExt_00x30B00B),
     Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(EXT_texture_cube_map_array)>(
         &textureLodExt_00x30B00B),
     Rule::Get<Spec::ESSL, 300, Shader::ALL, 0>(&textureSize_00I00D),
-    Rule::Get<Spec::GLSL, 130, Shader::ALL, 0>(&textureSize_00I00D),
     Rule::Get<Spec::ESSL, 300, Shader::ALL, 0>(&textureSize_00R00D),
-    Rule::Get<Spec::GLSL, 130, Shader::ALL, 0>(&textureSize_00R00D),
     Rule::Get<Spec::ESSL, 300, Shader::ALL, 0>(&textureSize_00X00D),
-    Rule::Get<Spec::GLSL, 130, Shader::ALL, 0>(&textureSize_00X00D),
     Rule::Get<Spec::ESSL, 300, Shader::ALL, 0>(&textureSize_00J00D),
-    Rule::Get<Spec::GLSL, 130, Shader::ALL, 0>(&textureSize_00J00D),
     Rule::Get<Spec::ESSL, 300, Shader::ALL, 0>(&textureSize_00S00D),
-    Rule::Get<Spec::GLSL, 130, Shader::ALL, 0>(&textureSize_00S00D),
     Rule::Get<Spec::ESSL, 300, Shader::ALL, 0>(&textureSize_00Y00D),
-    Rule::Get<Spec::GLSL, 130, Shader::ALL, 0>(&textureSize_00Y00D),
     Rule::Get<Spec::ESSL, 300, Shader::ALL, 0>(&textureSize_00K00D),
-    Rule::Get<Spec::GLSL, 130, Shader::ALL, 0>(&textureSize_00K00D),
     Rule::Get<Spec::ESSL, 300, Shader::ALL, 0>(&textureSize_00T00D),
-    Rule::Get<Spec::GLSL, 130, Shader::ALL, 0>(&textureSize_00T00D),
     Rule::Get<Spec::ESSL, 300, Shader::ALL, 0>(&textureSize_00Z00D),
-    Rule::Get<Spec::GLSL, 130, Shader::ALL, 0>(&textureSize_00Z00D),
     Rule::Get<Spec::ESSL, 300, Shader::ALL, 0>(&textureSize_00L00D),
-    Rule::Get<Spec::GLSL, 130, Shader::ALL, 0>(&textureSize_00L00D),
     Rule::Get<Spec::ESSL, 300, Shader::ALL, 0>(&textureSize_00U00D),
-    Rule::Get<Spec::GLSL, 130, Shader::ALL, 0>(&textureSize_00U00D),
     Rule::Get<Spec::ESSL, 300, Shader::ALL, 0>(&textureSize_00a00D),
-    Rule::Get<Spec::GLSL, 130, Shader::ALL, 0>(&textureSize_00a00D),
     Rule::Get<Spec::ESSL, 300, Shader::ALL, 0>(&textureSize_00d00D),
-    Rule::Get<Spec::GLSL, 130, Shader::ALL, 0>(&textureSize_00d00D),
     Rule::Get<Spec::ESSL, 300, Shader::ALL, 0>(&textureSize_00e00D),
-    Rule::Get<Spec::GLSL, 130, Shader::ALL, 0>(&textureSize_00e00D),
     Rule::Get<Spec::ESSL, 300, Shader::ALL, 0>(&textureSize_00f00D),
-    Rule::Get<Spec::GLSL, 130, Shader::ALL, 0>(&textureSize_00f00D),
     Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&textureSize_00k00D),
-    Rule::Get<Spec::GLSL, 400, Shader::ALL, 0>(&textureSize_00k00D),
     Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_texture_cube_map_array)>(
         &textureSizeExt_00k00D),
     Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(EXT_texture_cube_map_array)>(
         &textureSizeExt_00k00D),
     Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&textureSize_00s00D),
-    Rule::Get<Spec::GLSL, 400, Shader::ALL, 0>(&textureSize_00s00D),
     Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_texture_cube_map_array)>(
         &textureSizeExt_00s00D),
     Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(EXT_texture_cube_map_array)>(
         &textureSizeExt_00s00D),
     Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&textureSize_00x00D),
-    Rule::Get<Spec::GLSL, 400, Shader::ALL, 0>(&textureSize_00x00D),
     Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_texture_cube_map_array)>(
         &textureSizeExt_00x00D),
     Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(EXT_texture_cube_map_array)>(
         &textureSizeExt_00x00D),
     Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&textureSize_00l00D),
-    Rule::Get<Spec::GLSL, 400, Shader::ALL, 0>(&textureSize_00l00D),
     Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_texture_cube_map_array)>(
         &textureSizeExt_00l00D),
     Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(EXT_texture_cube_map_array)>(
         &textureSizeExt_00l00D),
     Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&textureSize_00j),
-    Rule::Get<Spec::GLSL, 140, Shader::ALL, 0>(&textureSize_00j),
     Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_texture_buffer)>(&textureSizeExt_00j),
     Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(EXT_texture_buffer)>(&textureSizeExt_00j),
     Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&textureSize_00r),
-    Rule::Get<Spec::GLSL, 140, Shader::ALL, 0>(&textureSize_00r),
     Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_texture_buffer)>(&textureSizeExt_00r),
     Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(EXT_texture_buffer)>(&textureSizeExt_00r),
     Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&textureSize_00w),
-    Rule::Get<Spec::GLSL, 140, Shader::ALL, 0>(&textureSize_00w),
     Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_texture_buffer)>(&textureSizeExt_00w),
     Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(EXT_texture_buffer)>(&textureSizeExt_00w),
     Rule::Get<Spec::ESSL, 310, Shader::ALL, 0>(&textureSize_00P),
-    Rule::Get<Spec::GLSL, 150, Shader::ALL, 0>(&textureSize_00P),
     Rule::Get<Spec::ESSL, 300, Shader::ALL, EXT_INDEX(ANGLE_texture_multisample)>(
         &textureSizeExt_00P),
     Rule::Get<Spec::ESSL, 310, Shader::ALL, 0>(&textureSize_00V),
-    Rule::Get<Spec::GLSL, 150, Shader::ALL, 0>(&textureSize_00V),
     Rule::Get<Spec::ESSL, 300, Shader::ALL, EXT_INDEX(ANGLE_texture_multisample)>(
         &textureSizeExt_00V),
     Rule::Get<Spec::ESSL, 310, Shader::ALL, 0>(&textureSize_00b),
-    Rule::Get<Spec::GLSL, 150, Shader::ALL, 0>(&textureSize_00b),
     Rule::Get<Spec::ESSL, 300, Shader::ALL, EXT_INDEX(ANGLE_texture_multisample)>(
         &textureSizeExt_00b),
     Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_texture_storage_multisample_2d_array)>(
@@ -19490,65 +19078,40 @@
         &textureSize_00M00D),
     Rule::Get<Spec::ESSL, 300, Shader::ALL, EXT_INDEX(EXT_YUV_target)>(&textureSize_00N00D),
     Rule::Get<Spec::ESSL, 300, Shader::ALL, 0>(&textureProjLod_00I20B00B),
-    Rule::Get<Spec::GLSL, 130, Shader::ALL, 0>(&textureProjLod_00I20B00B),
     Rule::Get<Spec::ESSL, 300, Shader::ALL, 0>(&textureProjLod_00R20B00B),
-    Rule::Get<Spec::GLSL, 130, Shader::ALL, 0>(&textureProjLod_00R20B00B),
     Rule::Get<Spec::ESSL, 300, Shader::ALL, 0>(&textureProjLod_00X20B00B),
-    Rule::Get<Spec::GLSL, 130, Shader::ALL, 0>(&textureProjLod_00X20B00B),
     Rule::Get<Spec::ESSL, 300, Shader::ALL, 0>(&textureProjLod_00I30B00B),
-    Rule::Get<Spec::GLSL, 130, Shader::ALL, 0>(&textureProjLod_00I30B00B),
     Rule::Get<Spec::ESSL, 300, Shader::ALL, 0>(&textureProjLod_00R30B00B),
-    Rule::Get<Spec::GLSL, 130, Shader::ALL, 0>(&textureProjLod_00R30B00B),
     Rule::Get<Spec::ESSL, 300, Shader::ALL, 0>(&textureProjLod_00X30B00B),
-    Rule::Get<Spec::GLSL, 130, Shader::ALL, 0>(&textureProjLod_00X30B00B),
     Rule::Get<Spec::ESSL, 300, Shader::ALL, 0>(&textureProjLod_00J30B00B),
-    Rule::Get<Spec::GLSL, 130, Shader::ALL, 0>(&textureProjLod_00J30B00B),
     Rule::Get<Spec::ESSL, 300, Shader::ALL, 0>(&textureProjLod_00S30B00B),
-    Rule::Get<Spec::GLSL, 130, Shader::ALL, 0>(&textureProjLod_00S30B00B),
     Rule::Get<Spec::ESSL, 300, Shader::ALL, 0>(&textureProjLod_00Y30B00B),
-    Rule::Get<Spec::GLSL, 130, Shader::ALL, 0>(&textureProjLod_00Y30B00B),
     Rule::Get<Spec::ESSL, 300, Shader::ALL, 0>(&textureProjLod_00d30B00B),
-    Rule::Get<Spec::GLSL, 130, Shader::ALL, 0>(&textureProjLod_00d30B00B),
     Rule::Get<Spec::ESSL, 300, Shader::ALL, 0>(&texelFetch_00I10D00D),
-    Rule::Get<Spec::GLSL, 130, Shader::ALL, 0>(&texelFetch_00I10D00D),
     Rule::Get<Spec::ESSL, 300, Shader::ALL, 0>(&texelFetch_00R10D00D),
-    Rule::Get<Spec::GLSL, 130, Shader::ALL, 0>(&texelFetch_00R10D00D),
     Rule::Get<Spec::ESSL, 300, Shader::ALL, 0>(&texelFetch_00X10D00D),
-    Rule::Get<Spec::GLSL, 130, Shader::ALL, 0>(&texelFetch_00X10D00D),
     Rule::Get<Spec::ESSL, 300, Shader::ALL, 0>(&texelFetch_00J20D00D),
-    Rule::Get<Spec::GLSL, 130, Shader::ALL, 0>(&texelFetch_00J20D00D),
     Rule::Get<Spec::ESSL, 300, Shader::ALL, 0>(&texelFetch_00S20D00D),
-    Rule::Get<Spec::GLSL, 130, Shader::ALL, 0>(&texelFetch_00S20D00D),
     Rule::Get<Spec::ESSL, 300, Shader::ALL, 0>(&texelFetch_00Y20D00D),
-    Rule::Get<Spec::GLSL, 130, Shader::ALL, 0>(&texelFetch_00Y20D00D),
     Rule::Get<Spec::ESSL, 300, Shader::ALL, 0>(&texelFetch_00L20D00D),
-    Rule::Get<Spec::GLSL, 130, Shader::ALL, 0>(&texelFetch_00L20D00D),
     Rule::Get<Spec::ESSL, 300, Shader::ALL, 0>(&texelFetch_00U20D00D),
-    Rule::Get<Spec::GLSL, 130, Shader::ALL, 0>(&texelFetch_00U20D00D),
     Rule::Get<Spec::ESSL, 300, Shader::ALL, 0>(&texelFetch_00a20D00D),
-    Rule::Get<Spec::GLSL, 130, Shader::ALL, 0>(&texelFetch_00a20D00D),
     Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&texelFetch_00j00D),
-    Rule::Get<Spec::GLSL, 140, Shader::ALL, 0>(&texelFetch_00j00D),
     Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_texture_buffer)>(&texelFetchExt_00j00D),
     Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(EXT_texture_buffer)>(&texelFetchExt_00j00D),
     Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&texelFetch_00r00D),
-    Rule::Get<Spec::GLSL, 140, Shader::ALL, 0>(&texelFetch_00r00D),
     Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_texture_buffer)>(&texelFetchExt_00r00D),
     Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(EXT_texture_buffer)>(&texelFetchExt_00r00D),
     Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&texelFetch_00w00D),
-    Rule::Get<Spec::GLSL, 140, Shader::ALL, 0>(&texelFetch_00w00D),
     Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_texture_buffer)>(&texelFetchExt_00w00D),
     Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(EXT_texture_buffer)>(&texelFetchExt_00w00D),
     Rule::Get<Spec::ESSL, 310, Shader::ALL, 0>(&texelFetch_00P10D00D),
-    Rule::Get<Spec::GLSL, 150, Shader::ALL, 0>(&texelFetch_00P10D00D),
     Rule::Get<Spec::ESSL, 300, Shader::ALL, EXT_INDEX(ANGLE_texture_multisample)>(
         &texelFetchExt_00P10D00D),
     Rule::Get<Spec::ESSL, 310, Shader::ALL, 0>(&texelFetch_00V10D00D),
-    Rule::Get<Spec::GLSL, 150, Shader::ALL, 0>(&texelFetch_00V10D00D),
     Rule::Get<Spec::ESSL, 300, Shader::ALL, EXT_INDEX(ANGLE_texture_multisample)>(
         &texelFetchExt_00V10D00D),
     Rule::Get<Spec::ESSL, 310, Shader::ALL, 0>(&texelFetch_00b10D00D),
-    Rule::Get<Spec::GLSL, 150, Shader::ALL, 0>(&texelFetch_00b10D00D),
     Rule::Get<Spec::ESSL, 300, Shader::ALL, EXT_INDEX(ANGLE_texture_multisample)>(
         &texelFetchExt_00b10D00D),
     Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_texture_storage_multisample_2d_array)>(
@@ -19561,135 +19124,80 @@
         &texelFetch_00M10D00D),
     Rule::Get<Spec::ESSL, 300, Shader::ALL, EXT_INDEX(EXT_YUV_target)>(&texelFetch_00N10D00D),
     Rule::Get<Spec::ESSL, 300, Shader::ALL, 0>(&textureGrad_00I10B10B10B),
-    Rule::Get<Spec::GLSL, 130, Shader::ALL, 0>(&textureGrad_00I10B10B10B),
     Rule::Get<Spec::ESSL, 300, Shader::ALL, 0>(&textureGrad_00R10B10B10B),
-    Rule::Get<Spec::GLSL, 130, Shader::ALL, 0>(&textureGrad_00R10B10B10B),
     Rule::Get<Spec::ESSL, 300, Shader::ALL, 0>(&textureGrad_00X10B10B10B),
-    Rule::Get<Spec::GLSL, 130, Shader::ALL, 0>(&textureGrad_00X10B10B10B),
     Rule::Get<Spec::ESSL, 300, Shader::ALL, 0>(&textureGrad_00J20B20B20B),
-    Rule::Get<Spec::GLSL, 130, Shader::ALL, 0>(&textureGrad_00J20B20B20B),
     Rule::Get<Spec::ESSL, 300, Shader::ALL, 0>(&textureGrad_00S20B20B20B),
-    Rule::Get<Spec::GLSL, 130, Shader::ALL, 0>(&textureGrad_00S20B20B20B),
     Rule::Get<Spec::ESSL, 300, Shader::ALL, 0>(&textureGrad_00Y20B20B20B),
-    Rule::Get<Spec::GLSL, 130, Shader::ALL, 0>(&textureGrad_00Y20B20B20B),
     Rule::Get<Spec::ESSL, 300, Shader::ALL, 0>(&textureGrad_00K20B20B20B),
-    Rule::Get<Spec::GLSL, 130, Shader::ALL, 0>(&textureGrad_00K20B20B20B),
     Rule::Get<Spec::ESSL, 300, Shader::ALL, 0>(&textureGrad_00T20B20B20B),
-    Rule::Get<Spec::GLSL, 130, Shader::ALL, 0>(&textureGrad_00T20B20B20B),
     Rule::Get<Spec::ESSL, 300, Shader::ALL, 0>(&textureGrad_00Z20B20B20B),
-    Rule::Get<Spec::GLSL, 130, Shader::ALL, 0>(&textureGrad_00Z20B20B20B),
     Rule::Get<Spec::ESSL, 300, Shader::ALL, 0>(&textureGrad_00d20B10B10B),
-    Rule::Get<Spec::GLSL, 130, Shader::ALL, 0>(&textureGrad_00d20B10B10B),
     Rule::Get<Spec::ESSL, 300, Shader::ALL, 0>(&textureGrad_00e30B20B20B),
-    Rule::Get<Spec::GLSL, 130, Shader::ALL, 0>(&textureGrad_00e30B20B20B),
     Rule::Get<Spec::ESSL, 300, Shader::ALL, 0>(&textureGrad_00L20B10B10B),
-    Rule::Get<Spec::GLSL, 130, Shader::ALL, 0>(&textureGrad_00L20B10B10B),
     Rule::Get<Spec::ESSL, 300, Shader::ALL, 0>(&textureGrad_00U20B10B10B),
-    Rule::Get<Spec::GLSL, 130, Shader::ALL, 0>(&textureGrad_00U20B10B10B),
     Rule::Get<Spec::ESSL, 300, Shader::ALL, 0>(&textureGrad_00a20B10B10B),
-    Rule::Get<Spec::GLSL, 130, Shader::ALL, 0>(&textureGrad_00a20B10B10B),
     Rule::Get<Spec::ESSL, 300, Shader::ALL, 0>(&textureGrad_00f30B10B10B),
-    Rule::Get<Spec::GLSL, 130, Shader::ALL, 0>(&textureGrad_00f30B10B10B),
     Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&textureGrad_00k30B20B20B),
-    Rule::Get<Spec::GLSL, 400, Shader::ALL, 0>(&textureGrad_00k30B20B20B),
     Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_texture_cube_map_array)>(
         &textureGradExt_00k30B20B20B),
     Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(EXT_texture_cube_map_array)>(
         &textureGradExt_00k30B20B20B),
     Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&textureGrad_00s30B20B20B),
-    Rule::Get<Spec::GLSL, 400, Shader::ALL, 0>(&textureGrad_00s30B20B20B),
     Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_texture_cube_map_array)>(
         &textureGradExt_00s30B20B20B),
     Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(EXT_texture_cube_map_array)>(
         &textureGradExt_00s30B20B20B),
     Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&textureGrad_00x30B20B20B),
-    Rule::Get<Spec::GLSL, 400, Shader::ALL, 0>(&textureGrad_00x30B20B20B),
     Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_texture_cube_map_array)>(
         &textureGradExt_00x30B20B20B),
     Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(EXT_texture_cube_map_array)>(
         &textureGradExt_00x30B20B20B),
     Rule::Get<Spec::ESSL, 300, Shader::ALL, 0>(&textureProjGrad_00I20B10B10B),
-    Rule::Get<Spec::GLSL, 130, Shader::ALL, 0>(&textureProjGrad_00I20B10B10B),
     Rule::Get<Spec::ESSL, 300, Shader::ALL, 0>(&textureProjGrad_00R20B10B10B),
-    Rule::Get<Spec::GLSL, 130, Shader::ALL, 0>(&textureProjGrad_00R20B10B10B),
     Rule::Get<Spec::ESSL, 300, Shader::ALL, 0>(&textureProjGrad_00X20B10B10B),
-    Rule::Get<Spec::GLSL, 130, Shader::ALL, 0>(&textureProjGrad_00X20B10B10B),
     Rule::Get<Spec::ESSL, 300, Shader::ALL, 0>(&textureProjGrad_00I30B10B10B),
-    Rule::Get<Spec::GLSL, 130, Shader::ALL, 0>(&textureProjGrad_00I30B10B10B),
     Rule::Get<Spec::ESSL, 300, Shader::ALL, 0>(&textureProjGrad_00R30B10B10B),
-    Rule::Get<Spec::GLSL, 130, Shader::ALL, 0>(&textureProjGrad_00R30B10B10B),
     Rule::Get<Spec::ESSL, 300, Shader::ALL, 0>(&textureProjGrad_00X30B10B10B),
-    Rule::Get<Spec::GLSL, 130, Shader::ALL, 0>(&textureProjGrad_00X30B10B10B),
     Rule::Get<Spec::ESSL, 300, Shader::ALL, 0>(&textureProjGrad_00J30B20B20B),
-    Rule::Get<Spec::GLSL, 130, Shader::ALL, 0>(&textureProjGrad_00J30B20B20B),
     Rule::Get<Spec::ESSL, 300, Shader::ALL, 0>(&textureProjGrad_00S30B20B20B),
-    Rule::Get<Spec::GLSL, 130, Shader::ALL, 0>(&textureProjGrad_00S30B20B20B),
     Rule::Get<Spec::ESSL, 300, Shader::ALL, 0>(&textureProjGrad_00Y30B20B20B),
-    Rule::Get<Spec::GLSL, 130, Shader::ALL, 0>(&textureProjGrad_00Y30B20B20B),
     Rule::Get<Spec::ESSL, 300, Shader::ALL, 0>(&textureProjGrad_00d30B10B10B),
-    Rule::Get<Spec::GLSL, 130, Shader::ALL, 0>(&textureProjGrad_00d30B10B10B),
     Rule::Get<Spec::ESSL, 300, Shader::FRAGMENT, 0>(&texture_00I10B00B),
-    Rule::Get<Spec::GLSL, 130, Shader::FRAGMENT, 0>(&texture_00I10B00B),
     Rule::Get<Spec::ESSL, 300, Shader::FRAGMENT, 0>(&texture_00R10B00B),
-    Rule::Get<Spec::GLSL, 130, Shader::FRAGMENT, 0>(&texture_00R10B00B),
     Rule::Get<Spec::ESSL, 300, Shader::FRAGMENT, 0>(&texture_00X10B00B),
-    Rule::Get<Spec::GLSL, 130, Shader::FRAGMENT, 0>(&texture_00X10B00B),
     Rule::Get<Spec::ESSL, 300, Shader::FRAGMENT, 0>(&texture_00J20B00B),
-    Rule::Get<Spec::GLSL, 130, Shader::FRAGMENT, 0>(&texture_00J20B00B),
     Rule::Get<Spec::ESSL, 300, Shader::FRAGMENT, 0>(&texture_00S20B00B),
-    Rule::Get<Spec::GLSL, 130, Shader::FRAGMENT, 0>(&texture_00S20B00B),
     Rule::Get<Spec::ESSL, 300, Shader::FRAGMENT, 0>(&texture_00Y20B00B),
-    Rule::Get<Spec::GLSL, 130, Shader::FRAGMENT, 0>(&texture_00Y20B00B),
     Rule::Get<Spec::ESSL, 300, Shader::FRAGMENT, 0>(&texture_00K20B00B),
-    Rule::Get<Spec::GLSL, 130, Shader::FRAGMENT, 0>(&texture_00K20B00B),
     Rule::Get<Spec::ESSL, 300, Shader::FRAGMENT, 0>(&texture_00T20B00B),
-    Rule::Get<Spec::GLSL, 130, Shader::FRAGMENT, 0>(&texture_00T20B00B),
     Rule::Get<Spec::ESSL, 300, Shader::FRAGMENT, 0>(&texture_00Z20B00B),
-    Rule::Get<Spec::GLSL, 130, Shader::FRAGMENT, 0>(&texture_00Z20B00B),
     Rule::Get<Spec::ESSL, 300, Shader::FRAGMENT, 0>(&texture_00L20B00B),
-    Rule::Get<Spec::GLSL, 130, Shader::FRAGMENT, 0>(&texture_00L20B00B),
     Rule::Get<Spec::ESSL, 300, Shader::FRAGMENT, 0>(&texture_00U20B00B),
-    Rule::Get<Spec::GLSL, 130, Shader::FRAGMENT, 0>(&texture_00U20B00B),
     Rule::Get<Spec::ESSL, 300, Shader::FRAGMENT, 0>(&texture_00a20B00B),
-    Rule::Get<Spec::GLSL, 130, Shader::FRAGMENT, 0>(&texture_00a20B00B),
     Rule::Get<Spec::ESSL, 300, Shader::FRAGMENT, 0>(&textureProj_00I20B00B),
-    Rule::Get<Spec::GLSL, 130, Shader::FRAGMENT, 0>(&textureProj_00I20B00B),
     Rule::Get<Spec::ESSL, 300, Shader::FRAGMENT, 0>(&textureProj_00R20B00B),
-    Rule::Get<Spec::GLSL, 130, Shader::FRAGMENT, 0>(&textureProj_00R20B00B),
     Rule::Get<Spec::ESSL, 300, Shader::FRAGMENT, 0>(&textureProj_00X20B00B),
-    Rule::Get<Spec::GLSL, 130, Shader::FRAGMENT, 0>(&textureProj_00X20B00B),
     Rule::Get<Spec::ESSL, 300, Shader::FRAGMENT, 0>(&textureProj_00I30B00B),
-    Rule::Get<Spec::GLSL, 130, Shader::FRAGMENT, 0>(&textureProj_00I30B00B),
     Rule::Get<Spec::ESSL, 300, Shader::FRAGMENT, 0>(&textureProj_00R30B00B),
-    Rule::Get<Spec::GLSL, 130, Shader::FRAGMENT, 0>(&textureProj_00R30B00B),
     Rule::Get<Spec::ESSL, 300, Shader::FRAGMENT, 0>(&textureProj_00X30B00B),
-    Rule::Get<Spec::GLSL, 130, Shader::FRAGMENT, 0>(&textureProj_00X30B00B),
     Rule::Get<Spec::ESSL, 300, Shader::FRAGMENT, 0>(&textureProj_00J30B00B),
-    Rule::Get<Spec::GLSL, 130, Shader::FRAGMENT, 0>(&textureProj_00J30B00B),
     Rule::Get<Spec::ESSL, 300, Shader::FRAGMENT, 0>(&textureProj_00S30B00B),
-    Rule::Get<Spec::GLSL, 130, Shader::FRAGMENT, 0>(&textureProj_00S30B00B),
     Rule::Get<Spec::ESSL, 300, Shader::FRAGMENT, 0>(&textureProj_00Y30B00B),
-    Rule::Get<Spec::GLSL, 130, Shader::FRAGMENT, 0>(&textureProj_00Y30B00B),
     Rule::Get<Spec::ESSL, 300, Shader::FRAGMENT, 0>(&texture_00d20B00B),
-    Rule::Get<Spec::GLSL, 130, Shader::FRAGMENT, 0>(&texture_00d20B00B),
     Rule::Get<Spec::ESSL, 300, Shader::FRAGMENT, 0>(&texture_00e30B00B),
-    Rule::Get<Spec::GLSL, 130, Shader::FRAGMENT, 0>(&texture_00e30B00B),
     Rule::Get<Spec::ESSL, 300, Shader::FRAGMENT, 0>(&textureProj_00d30B00B),
-    Rule::Get<Spec::GLSL, 130, Shader::FRAGMENT, 0>(&textureProj_00d30B00B),
     Rule::Get<Spec::ESSL, 320, Shader::FRAGMENT, 0>(&texture_00k30B00B),
-    Rule::Get<Spec::GLSL, 400, Shader::FRAGMENT, 0>(&texture_00k30B00B),
     Rule::Get<Spec::ESSL, 310, Shader::FRAGMENT, EXT_INDEX(OES_texture_cube_map_array)>(
         &textureExt_00k30B00B),
     Rule::Get<Spec::ESSL, 310, Shader::FRAGMENT, EXT_INDEX(EXT_texture_cube_map_array)>(
         &textureExt_00k30B00B),
     Rule::Get<Spec::ESSL, 320, Shader::FRAGMENT, 0>(&texture_00s30B00B),
-    Rule::Get<Spec::GLSL, 400, Shader::FRAGMENT, 0>(&texture_00s30B00B),
     Rule::Get<Spec::ESSL, 310, Shader::FRAGMENT, EXT_INDEX(OES_texture_cube_map_array)>(
         &textureExt_00s30B00B),
     Rule::Get<Spec::ESSL, 310, Shader::FRAGMENT, EXT_INDEX(EXT_texture_cube_map_array)>(
         &textureExt_00s30B00B),
     Rule::Get<Spec::ESSL, 320, Shader::FRAGMENT, 0>(&texture_00x30B00B),
-    Rule::Get<Spec::GLSL, 400, Shader::FRAGMENT, 0>(&texture_00x30B00B),
     Rule::Get<Spec::ESSL, 310, Shader::FRAGMENT, EXT_INDEX(OES_texture_cube_map_array)>(
         &textureExt_00x30B00B),
     Rule::Get<Spec::ESSL, 310, Shader::FRAGMENT, EXT_INDEX(EXT_texture_cube_map_array)>(
@@ -19704,484 +19212,295 @@
     Rule::Get<Spec::ESSL, 300, Shader::FRAGMENT, EXT_INDEX(EXT_YUV_target)>(&textureProj_00N20B00B),
     Rule::Get<Spec::ESSL, 300, Shader::FRAGMENT, EXT_INDEX(EXT_YUV_target)>(&textureProj_00N30B00B),
     Rule::Get<Spec::ESSL, 300, Shader::ALL, 0>(&textureOffset_00I10B10D),
-    Rule::Get<Spec::GLSL, 130, Shader::ALL, 0>(&textureOffset_00I10B10D),
     Rule::Get<Spec::ESSL, 300, Shader::ALL, 0>(&textureOffset_00R10B10D),
-    Rule::Get<Spec::GLSL, 130, Shader::ALL, 0>(&textureOffset_00R10B10D),
     Rule::Get<Spec::ESSL, 300, Shader::ALL, 0>(&textureOffset_00X10B10D),
-    Rule::Get<Spec::GLSL, 130, Shader::ALL, 0>(&textureOffset_00X10B10D),
     Rule::Get<Spec::ESSL, 300, Shader::ALL, 0>(&textureOffset_00J20B20D),
-    Rule::Get<Spec::GLSL, 130, Shader::ALL, 0>(&textureOffset_00J20B20D),
     Rule::Get<Spec::ESSL, 300, Shader::ALL, 0>(&textureOffset_00S20B20D),
-    Rule::Get<Spec::GLSL, 130, Shader::ALL, 0>(&textureOffset_00S20B20D),
     Rule::Get<Spec::ESSL, 300, Shader::ALL, 0>(&textureOffset_00Y20B20D),
-    Rule::Get<Spec::GLSL, 130, Shader::ALL, 0>(&textureOffset_00Y20B20D),
     Rule::Get<Spec::ESSL, 300, Shader::ALL, 0>(&textureOffset_00d20B10D),
-    Rule::Get<Spec::GLSL, 130, Shader::ALL, 0>(&textureOffset_00d20B10D),
     Rule::Get<Spec::ESSL, 300, Shader::ALL, 0>(&textureOffset_00L20B10D),
-    Rule::Get<Spec::GLSL, 130, Shader::ALL, 0>(&textureOffset_00L20B10D),
     Rule::Get<Spec::ESSL, 300, Shader::ALL, 0>(&textureOffset_00U20B10D),
-    Rule::Get<Spec::GLSL, 130, Shader::ALL, 0>(&textureOffset_00U20B10D),
     Rule::Get<Spec::ESSL, 300, Shader::ALL, 0>(&textureOffset_00a20B10D),
-    Rule::Get<Spec::GLSL, 130, Shader::ALL, 0>(&textureOffset_00a20B10D),
     Rule::Get<Spec::ESSL, 300, Shader::ALL, 0>(&textureProjOffset_00I20B10D),
-    Rule::Get<Spec::GLSL, 130, Shader::ALL, 0>(&textureProjOffset_00I20B10D),
     Rule::Get<Spec::ESSL, 300, Shader::ALL, 0>(&textureProjOffset_00R20B10D),
-    Rule::Get<Spec::GLSL, 130, Shader::ALL, 0>(&textureProjOffset_00R20B10D),
     Rule::Get<Spec::ESSL, 300, Shader::ALL, 0>(&textureProjOffset_00X20B10D),
-    Rule::Get<Spec::GLSL, 130, Shader::ALL, 0>(&textureProjOffset_00X20B10D),
     Rule::Get<Spec::ESSL, 300, Shader::ALL, 0>(&textureProjOffset_00I30B10D),
-    Rule::Get<Spec::GLSL, 130, Shader::ALL, 0>(&textureProjOffset_00I30B10D),
     Rule::Get<Spec::ESSL, 300, Shader::ALL, 0>(&textureProjOffset_00R30B10D),
-    Rule::Get<Spec::GLSL, 130, Shader::ALL, 0>(&textureProjOffset_00R30B10D),
     Rule::Get<Spec::ESSL, 300, Shader::ALL, 0>(&textureProjOffset_00X30B10D),
-    Rule::Get<Spec::GLSL, 130, Shader::ALL, 0>(&textureProjOffset_00X30B10D),
     Rule::Get<Spec::ESSL, 300, Shader::ALL, 0>(&textureProjOffset_00J30B20D),
-    Rule::Get<Spec::GLSL, 130, Shader::ALL, 0>(&textureProjOffset_00J30B20D),
     Rule::Get<Spec::ESSL, 300, Shader::ALL, 0>(&textureProjOffset_00S30B20D),
-    Rule::Get<Spec::GLSL, 130, Shader::ALL, 0>(&textureProjOffset_00S30B20D),
     Rule::Get<Spec::ESSL, 300, Shader::ALL, 0>(&textureProjOffset_00Y30B20D),
-    Rule::Get<Spec::GLSL, 130, Shader::ALL, 0>(&textureProjOffset_00Y30B20D),
     Rule::Get<Spec::ESSL, 300, Shader::ALL, 0>(&textureProjOffset_00d30B10D),
-    Rule::Get<Spec::GLSL, 130, Shader::ALL, 0>(&textureProjOffset_00d30B10D),
     Rule::Get<Spec::ESSL, 300, Shader::ALL, 0>(&textureLodOffset_00I10B00B10D),
-    Rule::Get<Spec::GLSL, 130, Shader::ALL, 0>(&textureLodOffset_00I10B00B10D),
     Rule::Get<Spec::ESSL, 300, Shader::ALL, 0>(&textureLodOffset_00R10B00B10D),
-    Rule::Get<Spec::GLSL, 130, Shader::ALL, 0>(&textureLodOffset_00R10B00B10D),
     Rule::Get<Spec::ESSL, 300, Shader::ALL, 0>(&textureLodOffset_00X10B00B10D),
-    Rule::Get<Spec::GLSL, 130, Shader::ALL, 0>(&textureLodOffset_00X10B00B10D),
     Rule::Get<Spec::ESSL, 300, Shader::ALL, 0>(&textureLodOffset_00J20B00B20D),
-    Rule::Get<Spec::GLSL, 130, Shader::ALL, 0>(&textureLodOffset_00J20B00B20D),
     Rule::Get<Spec::ESSL, 300, Shader::ALL, 0>(&textureLodOffset_00S20B00B20D),
-    Rule::Get<Spec::GLSL, 130, Shader::ALL, 0>(&textureLodOffset_00S20B00B20D),
     Rule::Get<Spec::ESSL, 300, Shader::ALL, 0>(&textureLodOffset_00Y20B00B20D),
-    Rule::Get<Spec::GLSL, 130, Shader::ALL, 0>(&textureLodOffset_00Y20B00B20D),
     Rule::Get<Spec::ESSL, 300, Shader::ALL, 0>(&textureLodOffset_00d20B00B10D),
-    Rule::Get<Spec::GLSL, 130, Shader::ALL, 0>(&textureLodOffset_00d20B00B10D),
     Rule::Get<Spec::ESSL, 300, Shader::ALL, 0>(&textureLodOffset_00L20B00B10D),
-    Rule::Get<Spec::GLSL, 130, Shader::ALL, 0>(&textureLodOffset_00L20B00B10D),
     Rule::Get<Spec::ESSL, 300, Shader::ALL, 0>(&textureLodOffset_00U20B00B10D),
-    Rule::Get<Spec::GLSL, 130, Shader::ALL, 0>(&textureLodOffset_00U20B00B10D),
     Rule::Get<Spec::ESSL, 300, Shader::ALL, 0>(&textureLodOffset_00a20B00B10D),
-    Rule::Get<Spec::GLSL, 130, Shader::ALL, 0>(&textureLodOffset_00a20B00B10D),
     Rule::Get<Spec::ESSL, 300, Shader::ALL, 0>(&textureProjLodOffset_00I20B00B10D),
-    Rule::Get<Spec::GLSL, 130, Shader::ALL, 0>(&textureProjLodOffset_00I20B00B10D),
     Rule::Get<Spec::ESSL, 300, Shader::ALL, 0>(&textureProjLodOffset_00R20B00B10D),
-    Rule::Get<Spec::GLSL, 130, Shader::ALL, 0>(&textureProjLodOffset_00R20B00B10D),
     Rule::Get<Spec::ESSL, 300, Shader::ALL, 0>(&textureProjLodOffset_00X20B00B10D),
-    Rule::Get<Spec::GLSL, 130, Shader::ALL, 0>(&textureProjLodOffset_00X20B00B10D),
     Rule::Get<Spec::ESSL, 300, Shader::ALL, 0>(&textureProjLodOffset_00I30B00B10D),
-    Rule::Get<Spec::GLSL, 130, Shader::ALL, 0>(&textureProjLodOffset_00I30B00B10D),
     Rule::Get<Spec::ESSL, 300, Shader::ALL, 0>(&textureProjLodOffset_00R30B00B10D),
-    Rule::Get<Spec::GLSL, 130, Shader::ALL, 0>(&textureProjLodOffset_00R30B00B10D),
     Rule::Get<Spec::ESSL, 300, Shader::ALL, 0>(&textureProjLodOffset_00X30B00B10D),
-    Rule::Get<Spec::GLSL, 130, Shader::ALL, 0>(&textureProjLodOffset_00X30B00B10D),
     Rule::Get<Spec::ESSL, 300, Shader::ALL, 0>(&textureProjLodOffset_00J30B00B20D),
-    Rule::Get<Spec::GLSL, 130, Shader::ALL, 0>(&textureProjLodOffset_00J30B00B20D),
     Rule::Get<Spec::ESSL, 300, Shader::ALL, 0>(&textureProjLodOffset_00S30B00B20D),
-    Rule::Get<Spec::GLSL, 130, Shader::ALL, 0>(&textureProjLodOffset_00S30B00B20D),
     Rule::Get<Spec::ESSL, 300, Shader::ALL, 0>(&textureProjLodOffset_00Y30B00B20D),
-    Rule::Get<Spec::GLSL, 130, Shader::ALL, 0>(&textureProjLodOffset_00Y30B00B20D),
     Rule::Get<Spec::ESSL, 300, Shader::ALL, 0>(&textureProjLodOffset_00d30B00B10D),
-    Rule::Get<Spec::GLSL, 130, Shader::ALL, 0>(&textureProjLodOffset_00d30B00B10D),
     Rule::Get<Spec::ESSL, 300, Shader::ALL, 0>(&texelFetchOffset_00I10D00D10D),
-    Rule::Get<Spec::GLSL, 130, Shader::ALL, 0>(&texelFetchOffset_00I10D00D10D),
     Rule::Get<Spec::ESSL, 300, Shader::ALL, 0>(&texelFetchOffset_00R10D00D10D),
-    Rule::Get<Spec::GLSL, 130, Shader::ALL, 0>(&texelFetchOffset_00R10D00D10D),
     Rule::Get<Spec::ESSL, 300, Shader::ALL, 0>(&texelFetchOffset_00X10D00D10D),
-    Rule::Get<Spec::GLSL, 130, Shader::ALL, 0>(&texelFetchOffset_00X10D00D10D),
     Rule::Get<Spec::ESSL, 300, Shader::ALL, 0>(&texelFetchOffset_00J20D00D20D),
-    Rule::Get<Spec::GLSL, 130, Shader::ALL, 0>(&texelFetchOffset_00J20D00D20D),
     Rule::Get<Spec::ESSL, 300, Shader::ALL, 0>(&texelFetchOffset_00S20D00D20D),
-    Rule::Get<Spec::GLSL, 130, Shader::ALL, 0>(&texelFetchOffset_00S20D00D20D),
     Rule::Get<Spec::ESSL, 300, Shader::ALL, 0>(&texelFetchOffset_00Y20D00D20D),
-    Rule::Get<Spec::GLSL, 130, Shader::ALL, 0>(&texelFetchOffset_00Y20D00D20D),
     Rule::Get<Spec::ESSL, 300, Shader::ALL, 0>(&texelFetchOffset_00L20D00D10D),
-    Rule::Get<Spec::GLSL, 130, Shader::ALL, 0>(&texelFetchOffset_00L20D00D10D),
     Rule::Get<Spec::ESSL, 300, Shader::ALL, 0>(&texelFetchOffset_00U20D00D10D),
-    Rule::Get<Spec::GLSL, 130, Shader::ALL, 0>(&texelFetchOffset_00U20D00D10D),
     Rule::Get<Spec::ESSL, 300, Shader::ALL, 0>(&texelFetchOffset_00a20D00D10D),
-    Rule::Get<Spec::GLSL, 130, Shader::ALL, 0>(&texelFetchOffset_00a20D00D10D),
     Rule::Get<Spec::ESSL, 300, Shader::ALL, 0>(&textureGradOffset_00I10B10B10B10D),
-    Rule::Get<Spec::GLSL, 130, Shader::ALL, 0>(&textureGradOffset_00I10B10B10B10D),
     Rule::Get<Spec::ESSL, 300, Shader::ALL, 0>(&textureGradOffset_00R10B10B10B10D),
-    Rule::Get<Spec::GLSL, 130, Shader::ALL, 0>(&textureGradOffset_00R10B10B10B10D),
     Rule::Get<Spec::ESSL, 300, Shader::ALL, 0>(&textureGradOffset_00X10B10B10B10D),
-    Rule::Get<Spec::GLSL, 130, Shader::ALL, 0>(&textureGradOffset_00X10B10B10B10D),
     Rule::Get<Spec::ESSL, 300, Shader::ALL, 0>(&textureGradOffset_00J20B20B20B20D),
-    Rule::Get<Spec::GLSL, 130, Shader::ALL, 0>(&textureGradOffset_00J20B20B20B20D),
     Rule::Get<Spec::ESSL, 300, Shader::ALL, 0>(&textureGradOffset_00S20B20B20B20D),
-    Rule::Get<Spec::GLSL, 130, Shader::ALL, 0>(&textureGradOffset_00S20B20B20B20D),
     Rule::Get<Spec::ESSL, 300, Shader::ALL, 0>(&textureGradOffset_00Y20B20B20B20D),
-    Rule::Get<Spec::GLSL, 130, Shader::ALL, 0>(&textureGradOffset_00Y20B20B20B20D),
     Rule::Get<Spec::ESSL, 300, Shader::ALL, 0>(&textureGradOffset_00d20B10B10B10D),
-    Rule::Get<Spec::GLSL, 130, Shader::ALL, 0>(&textureGradOffset_00d20B10B10B10D),
     Rule::Get<Spec::ESSL, 300, Shader::ALL, 0>(&textureGradOffset_00L20B10B10B10D),
-    Rule::Get<Spec::GLSL, 130, Shader::ALL, 0>(&textureGradOffset_00L20B10B10B10D),
     Rule::Get<Spec::ESSL, 300, Shader::ALL, 0>(&textureGradOffset_00U20B10B10B10D),
-    Rule::Get<Spec::GLSL, 130, Shader::ALL, 0>(&textureGradOffset_00U20B10B10B10D),
     Rule::Get<Spec::ESSL, 300, Shader::ALL, 0>(&textureGradOffset_00a20B10B10B10D),
-    Rule::Get<Spec::GLSL, 130, Shader::ALL, 0>(&textureGradOffset_00a20B10B10B10D),
     Rule::Get<Spec::ESSL, 300, Shader::ALL, 0>(&textureGradOffset_00f30B10B10B10D),
-    Rule::Get<Spec::GLSL, 130, Shader::ALL, 0>(&textureGradOffset_00f30B10B10B10D),
     Rule::Get<Spec::ESSL, 300, Shader::ALL, 0>(&textureProjGradOffset_00I20B10B10B10D),
-    Rule::Get<Spec::GLSL, 130, Shader::ALL, 0>(&textureProjGradOffset_00I20B10B10B10D),
     Rule::Get<Spec::ESSL, 300, Shader::ALL, 0>(&textureProjGradOffset_00R20B10B10B10D),
-    Rule::Get<Spec::GLSL, 130, Shader::ALL, 0>(&textureProjGradOffset_00R20B10B10B10D),
     Rule::Get<Spec::ESSL, 300, Shader::ALL, 0>(&textureProjGradOffset_00X20B10B10B10D),
-    Rule::Get<Spec::GLSL, 130, Shader::ALL, 0>(&textureProjGradOffset_00X20B10B10B10D),
     Rule::Get<Spec::ESSL, 300, Shader::ALL, 0>(&textureProjGradOffset_00I30B10B10B10D),
-    Rule::Get<Spec::GLSL, 130, Shader::ALL, 0>(&textureProjGradOffset_00I30B10B10B10D),
     Rule::Get<Spec::ESSL, 300, Shader::ALL, 0>(&textureProjGradOffset_00R30B10B10B10D),
-    Rule::Get<Spec::GLSL, 130, Shader::ALL, 0>(&textureProjGradOffset_00R30B10B10B10D),
     Rule::Get<Spec::ESSL, 300, Shader::ALL, 0>(&textureProjGradOffset_00X30B10B10B10D),
-    Rule::Get<Spec::GLSL, 130, Shader::ALL, 0>(&textureProjGradOffset_00X30B10B10B10D),
     Rule::Get<Spec::ESSL, 300, Shader::ALL, 0>(&textureProjGradOffset_00J30B20B20B20D),
-    Rule::Get<Spec::GLSL, 130, Shader::ALL, 0>(&textureProjGradOffset_00J30B20B20B20D),
     Rule::Get<Spec::ESSL, 300, Shader::ALL, 0>(&textureProjGradOffset_00S30B20B20B20D),
-    Rule::Get<Spec::GLSL, 130, Shader::ALL, 0>(&textureProjGradOffset_00S30B20B20B20D),
     Rule::Get<Spec::ESSL, 300, Shader::ALL, 0>(&textureProjGradOffset_00Y30B20B20B20D),
-    Rule::Get<Spec::GLSL, 130, Shader::ALL, 0>(&textureProjGradOffset_00Y30B20B20B20D),
     Rule::Get<Spec::ESSL, 300, Shader::ALL, 0>(&textureProjGradOffset_00d30B10B10B10D),
-    Rule::Get<Spec::GLSL, 130, Shader::ALL, 0>(&textureProjGradOffset_00d30B10B10B10D),
     Rule::Get<Spec::ESSL, 300, Shader::FRAGMENT, 0>(&textureOffset_00I10B10D00B),
-    Rule::Get<Spec::GLSL, 130, Shader::FRAGMENT, 0>(&textureOffset_00I10B10D00B),
     Rule::Get<Spec::ESSL, 300, Shader::FRAGMENT, 0>(&textureOffset_00R10B10D00B),
-    Rule::Get<Spec::GLSL, 130, Shader::FRAGMENT, 0>(&textureOffset_00R10B10D00B),
     Rule::Get<Spec::ESSL, 300, Shader::FRAGMENT, 0>(&textureOffset_00X10B10D00B),
-    Rule::Get<Spec::GLSL, 130, Shader::FRAGMENT, 0>(&textureOffset_00X10B10D00B),
     Rule::Get<Spec::ESSL, 300, Shader::FRAGMENT, 0>(&textureOffset_00J20B20D00B),
-    Rule::Get<Spec::GLSL, 130, Shader::FRAGMENT, 0>(&textureOffset_00J20B20D00B),
     Rule::Get<Spec::ESSL, 300, Shader::FRAGMENT, 0>(&textureOffset_00S20B20D00B),
-    Rule::Get<Spec::GLSL, 130, Shader::FRAGMENT, 0>(&textureOffset_00S20B20D00B),
     Rule::Get<Spec::ESSL, 300, Shader::FRAGMENT, 0>(&textureOffset_00Y20B20D00B),
-    Rule::Get<Spec::GLSL, 130, Shader::FRAGMENT, 0>(&textureOffset_00Y20B20D00B),
     Rule::Get<Spec::ESSL, 300, Shader::FRAGMENT, 0>(&textureOffset_00d20B10D00B),
-    Rule::Get<Spec::GLSL, 130, Shader::FRAGMENT, 0>(&textureOffset_00d20B10D00B),
     Rule::Get<Spec::ESSL, 300, Shader::FRAGMENT, 0>(&textureOffset_00L20B10D00B),
-    Rule::Get<Spec::GLSL, 130, Shader::FRAGMENT, 0>(&textureOffset_00L20B10D00B),
     Rule::Get<Spec::ESSL, 300, Shader::FRAGMENT, 0>(&textureOffset_00U20B10D00B),
-    Rule::Get<Spec::GLSL, 130, Shader::FRAGMENT, 0>(&textureOffset_00U20B10D00B),
     Rule::Get<Spec::ESSL, 300, Shader::FRAGMENT, 0>(&textureOffset_00a20B10D00B),
-    Rule::Get<Spec::GLSL, 130, Shader::FRAGMENT, 0>(&textureOffset_00a20B10D00B),
     Rule::Get<Spec::ESSL, 300, Shader::FRAGMENT, 0>(&textureProjOffset_00I20B10D00B),
-    Rule::Get<Spec::GLSL, 130, Shader::FRAGMENT, 0>(&textureProjOffset_00I20B10D00B),
     Rule::Get<Spec::ESSL, 300, Shader::FRAGMENT, 0>(&textureProjOffset_00R20B10D00B),
-    Rule::Get<Spec::GLSL, 130, Shader::FRAGMENT, 0>(&textureProjOffset_00R20B10D00B),
     Rule::Get<Spec::ESSL, 300, Shader::FRAGMENT, 0>(&textureProjOffset_00X20B10D00B),
-    Rule::Get<Spec::GLSL, 130, Shader::FRAGMENT, 0>(&textureProjOffset_00X20B10D00B),
     Rule::Get<Spec::ESSL, 300, Shader::FRAGMENT, 0>(&textureProjOffset_00I30B10D00B),
-    Rule::Get<Spec::GLSL, 130, Shader::FRAGMENT, 0>(&textureProjOffset_00I30B10D00B),
     Rule::Get<Spec::ESSL, 300, Shader::FRAGMENT, 0>(&textureProjOffset_00R30B10D00B),
-    Rule::Get<Spec::GLSL, 130, Shader::FRAGMENT, 0>(&textureProjOffset_00R30B10D00B),
     Rule::Get<Spec::ESSL, 300, Shader::FRAGMENT, 0>(&textureProjOffset_00X30B10D00B),
-    Rule::Get<Spec::GLSL, 130, Shader::FRAGMENT, 0>(&textureProjOffset_00X30B10D00B),
     Rule::Get<Spec::ESSL, 300, Shader::FRAGMENT, 0>(&textureProjOffset_00J30B20D00B),
-    Rule::Get<Spec::GLSL, 130, Shader::FRAGMENT, 0>(&textureProjOffset_00J30B20D00B),
     Rule::Get<Spec::ESSL, 300, Shader::FRAGMENT, 0>(&textureProjOffset_00S30B20D00B),
-    Rule::Get<Spec::GLSL, 130, Shader::FRAGMENT, 0>(&textureProjOffset_00S30B20D00B),
     Rule::Get<Spec::ESSL, 300, Shader::FRAGMENT, 0>(&textureProjOffset_00Y30B20D00B),
-    Rule::Get<Spec::GLSL, 130, Shader::FRAGMENT, 0>(&textureProjOffset_00Y30B20D00B),
     Rule::Get<Spec::ESSL, 300, Shader::FRAGMENT, 0>(&textureProjOffset_00d30B10D00B),
-    Rule::Get<Spec::GLSL, 130, Shader::FRAGMENT, 0>(&textureProjOffset_00d30B10D00B),
     Rule::Get<Spec::ESSL, 310, Shader::ALL, 0>(&textureGather_00I10B),
-    Rule::Get<Spec::GLSL, 400, Shader::ALL, 0>(&textureGather_00I10B),
     Rule::Get<Spec::ESSL, 310, Shader::ALL, 0>(&textureGather_00R10B),
-    Rule::Get<Spec::GLSL, 400, Shader::ALL, 0>(&textureGather_00R10B),
     Rule::Get<Spec::ESSL, 310, Shader::ALL, 0>(&textureGather_00X10B),
-    Rule::Get<Spec::GLSL, 400, Shader::ALL, 0>(&textureGather_00X10B),
     Rule::Get<Spec::ESSL, 310, Shader::ALL, 0>(&textureGather_00I10B00D),
-    Rule::Get<Spec::GLSL, 400, Shader::ALL, 0>(&textureGather_00I10B00D),
     Rule::Get<Spec::ESSL, 310, Shader::ALL, 0>(&textureGather_00R10B00D),
-    Rule::Get<Spec::GLSL, 400, Shader::ALL, 0>(&textureGather_00R10B00D),
     Rule::Get<Spec::ESSL, 310, Shader::ALL, 0>(&textureGather_00X10B00D),
-    Rule::Get<Spec::GLSL, 400, Shader::ALL, 0>(&textureGather_00X10B00D),
     Rule::Get<Spec::ESSL, 310, Shader::ALL, 0>(&textureGather_00L20B),
-    Rule::Get<Spec::GLSL, 400, Shader::ALL, 0>(&textureGather_00L20B),
     Rule::Get<Spec::ESSL, 310, Shader::ALL, 0>(&textureGather_00U20B),
-    Rule::Get<Spec::GLSL, 400, Shader::ALL, 0>(&textureGather_00U20B),
     Rule::Get<Spec::ESSL, 310, Shader::ALL, 0>(&textureGather_00a20B),
-    Rule::Get<Spec::GLSL, 400, Shader::ALL, 0>(&textureGather_00a20B),
     Rule::Get<Spec::ESSL, 310, Shader::ALL, 0>(&textureGather_00L20B00D),
-    Rule::Get<Spec::GLSL, 400, Shader::ALL, 0>(&textureGather_00L20B00D),
     Rule::Get<Spec::ESSL, 310, Shader::ALL, 0>(&textureGather_00U20B00D),
-    Rule::Get<Spec::GLSL, 400, Shader::ALL, 0>(&textureGather_00U20B00D),
     Rule::Get<Spec::ESSL, 310, Shader::ALL, 0>(&textureGather_00a20B00D),
-    Rule::Get<Spec::GLSL, 400, Shader::ALL, 0>(&textureGather_00a20B00D),
     Rule::Get<Spec::ESSL, 310, Shader::ALL, 0>(&textureGather_00K20B),
-    Rule::Get<Spec::GLSL, 400, Shader::ALL, 0>(&textureGather_00K20B),
     Rule::Get<Spec::ESSL, 310, Shader::ALL, 0>(&textureGather_00T20B),
-    Rule::Get<Spec::GLSL, 400, Shader::ALL, 0>(&textureGather_00T20B),
     Rule::Get<Spec::ESSL, 310, Shader::ALL, 0>(&textureGather_00Z20B),
-    Rule::Get<Spec::GLSL, 400, Shader::ALL, 0>(&textureGather_00Z20B),
     Rule::Get<Spec::ESSL, 310, Shader::ALL, 0>(&textureGather_00K20B00D),
-    Rule::Get<Spec::GLSL, 400, Shader::ALL, 0>(&textureGather_00K20B00D),
     Rule::Get<Spec::ESSL, 310, Shader::ALL, 0>(&textureGather_00T20B00D),
-    Rule::Get<Spec::GLSL, 400, Shader::ALL, 0>(&textureGather_00T20B00D),
     Rule::Get<Spec::ESSL, 310, Shader::ALL, 0>(&textureGather_00Z20B00D),
-    Rule::Get<Spec::GLSL, 400, Shader::ALL, 0>(&textureGather_00Z20B00D),
     Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&textureGather_00k30B),
-    Rule::Get<Spec::GLSL, 400, Shader::ALL, 0>(&textureGather_00k30B),
     Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_texture_cube_map_array)>(
         &textureGatherExt_00k30B),
     Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(EXT_texture_cube_map_array)>(
         &textureGatherExt_00k30B),
     Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&textureGather_00s30B),
-    Rule::Get<Spec::GLSL, 400, Shader::ALL, 0>(&textureGather_00s30B),
     Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_texture_cube_map_array)>(
         &textureGatherExt_00s30B),
     Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(EXT_texture_cube_map_array)>(
         &textureGatherExt_00s30B),
     Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&textureGather_00x30B),
-    Rule::Get<Spec::GLSL, 400, Shader::ALL, 0>(&textureGather_00x30B),
     Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_texture_cube_map_array)>(
         &textureGatherExt_00x30B),
     Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(EXT_texture_cube_map_array)>(
         &textureGatherExt_00x30B),
     Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&textureGather_00k30B00D),
-    Rule::Get<Spec::GLSL, 400, Shader::ALL, 0>(&textureGather_00k30B00D),
     Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_texture_cube_map_array)>(
         &textureGatherExt_00k30B00D),
     Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(EXT_texture_cube_map_array)>(
         &textureGatherExt_00k30B00D),
     Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&textureGather_00s30B00D),
-    Rule::Get<Spec::GLSL, 400, Shader::ALL, 0>(&textureGather_00s30B00D),
     Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_texture_cube_map_array)>(
         &textureGatherExt_00s30B00D),
     Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(EXT_texture_cube_map_array)>(
         &textureGatherExt_00s30B00D),
     Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&textureGather_00x30B00D),
-    Rule::Get<Spec::GLSL, 400, Shader::ALL, 0>(&textureGather_00x30B00D),
     Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_texture_cube_map_array)>(
         &textureGatherExt_00x30B00D),
     Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(EXT_texture_cube_map_array)>(
         &textureGatherExt_00x30B00D),
     Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&textureGather_00l30B00B),
-    Rule::Get<Spec::GLSL, 400, Shader::ALL, 0>(&textureGather_00l30B00B),
     Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_texture_cube_map_array)>(
         &textureGatherExt_00l30B00B),
     Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(EXT_texture_cube_map_array)>(
         &textureGatherExt_00l30B00B),
     Rule::Get<Spec::ESSL, 310, Shader::ALL, 0>(&textureGather_00d10B),
     Rule::Get<Spec::ESSL, 310, Shader::ALL, 0>(&textureGather_00d10B00B),
-    Rule::Get<Spec::GLSL, 400, Shader::ALL, 0>(&textureGather_00d10B00B),
     Rule::Get<Spec::ESSL, 310, Shader::ALL, 0>(&textureGather_00f20B),
     Rule::Get<Spec::ESSL, 310, Shader::ALL, 0>(&textureGather_00f20B00B),
-    Rule::Get<Spec::GLSL, 400, Shader::ALL, 0>(&textureGather_00f20B00B),
     Rule::Get<Spec::ESSL, 310, Shader::ALL, 0>(&textureGather_00e20B),
     Rule::Get<Spec::ESSL, 310, Shader::ALL, 0>(&textureGather_00e20B00B),
-    Rule::Get<Spec::GLSL, 400, Shader::ALL, 0>(&textureGather_00e20B00B),
     Rule::Get<Spec::ESSL, 310, Shader::ALL, 0>(&textureGatherOffset_00I10B10D),
-    Rule::Get<Spec::GLSL, 400, Shader::ALL, 0>(&textureGatherOffset_00I10B10D),
     Rule::Get<Spec::ESSL, 310, Shader::ALL, 0>(&textureGatherOffset_00R10B10D),
-    Rule::Get<Spec::GLSL, 400, Shader::ALL, 0>(&textureGatherOffset_00R10B10D),
     Rule::Get<Spec::ESSL, 310, Shader::ALL, 0>(&textureGatherOffset_00X10B10D),
-    Rule::Get<Spec::GLSL, 400, Shader::ALL, 0>(&textureGatherOffset_00X10B10D),
     Rule::Get<Spec::ESSL, 310, Shader::ALL, 0>(&textureGatherOffset_00L20B10D),
-    Rule::Get<Spec::GLSL, 400, Shader::ALL, 0>(&textureGatherOffset_00L20B10D),
     Rule::Get<Spec::ESSL, 310, Shader::ALL, 0>(&textureGatherOffset_00U20B10D),
-    Rule::Get<Spec::GLSL, 400, Shader::ALL, 0>(&textureGatherOffset_00U20B10D),
     Rule::Get<Spec::ESSL, 310, Shader::ALL, 0>(&textureGatherOffset_00a20B10D),
-    Rule::Get<Spec::GLSL, 400, Shader::ALL, 0>(&textureGatherOffset_00a20B10D),
     Rule::Get<Spec::ESSL, 310, Shader::ALL, 0>(&textureGatherOffset_00d10B00B10D),
-    Rule::Get<Spec::GLSL, 400, Shader::ALL, 0>(&textureGatherOffset_00d10B00B10D),
     Rule::Get<Spec::ESSL, 310, Shader::ALL, 0>(&textureGatherOffset_00f20B00B10D),
-    Rule::Get<Spec::GLSL, 400, Shader::ALL, 0>(&textureGatherOffset_00f20B00B10D),
     Rule::Get<Spec::ESSL, 310, Shader::ALL, 0>(&textureGatherOffset_00I10B10D00D),
-    Rule::Get<Spec::GLSL, 400, Shader::ALL, 0>(&textureGatherOffset_00I10B10D00D),
     Rule::Get<Spec::ESSL, 310, Shader::ALL, 0>(&textureGatherOffset_00R10B10D00D),
-    Rule::Get<Spec::GLSL, 400, Shader::ALL, 0>(&textureGatherOffset_00R10B10D00D),
     Rule::Get<Spec::ESSL, 310, Shader::ALL, 0>(&textureGatherOffset_00X10B10D00D),
-    Rule::Get<Spec::GLSL, 400, Shader::ALL, 0>(&textureGatherOffset_00X10B10D00D),
     Rule::Get<Spec::ESSL, 310, Shader::ALL, 0>(&textureGatherOffset_00L20B10D00D),
-    Rule::Get<Spec::GLSL, 400, Shader::ALL, 0>(&textureGatherOffset_00L20B10D00D),
     Rule::Get<Spec::ESSL, 310, Shader::ALL, 0>(&textureGatherOffset_00U20B10D00D),
-    Rule::Get<Spec::GLSL, 400, Shader::ALL, 0>(&textureGatherOffset_00U20B10D00D),
     Rule::Get<Spec::ESSL, 310, Shader::ALL, 0>(&textureGatherOffset_00a20B10D00D),
-    Rule::Get<Spec::GLSL, 400, Shader::ALL, 0>(&textureGatherOffset_00a20B10D00D),
     Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&textureGatherOffsets_00I10B10Dx4),
-    Rule::Get<Spec::GLSL, 400, Shader::ALL, 0>(&textureGatherOffsets_00I10B10Dx4),
     Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(EXT_gpu_shader5)>(
         &textureGatherOffsetsExt_00I10B10Dx4),
     Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&textureGatherOffsets_00R10B10Dx4),
-    Rule::Get<Spec::GLSL, 400, Shader::ALL, 0>(&textureGatherOffsets_00R10B10Dx4),
     Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(EXT_gpu_shader5)>(
         &textureGatherOffsetsExt_00R10B10Dx4),
     Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&textureGatherOffsets_00X10B10Dx4),
-    Rule::Get<Spec::GLSL, 400, Shader::ALL, 0>(&textureGatherOffsets_00X10B10Dx4),
     Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(EXT_gpu_shader5)>(
         &textureGatherOffsetsExt_00X10B10Dx4),
     Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&textureGatherOffsets_00L20B10Dx4),
-    Rule::Get<Spec::GLSL, 400, Shader::ALL, 0>(&textureGatherOffsets_00L20B10Dx4),
     Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(EXT_gpu_shader5)>(
         &textureGatherOffsetsExt_00L20B10Dx4),
     Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&textureGatherOffsets_00U20B10Dx4),
-    Rule::Get<Spec::GLSL, 400, Shader::ALL, 0>(&textureGatherOffsets_00U20B10Dx4),
     Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(EXT_gpu_shader5)>(
         &textureGatherOffsetsExt_00U20B10Dx4),
     Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&textureGatherOffsets_00a20B10Dx4),
-    Rule::Get<Spec::GLSL, 400, Shader::ALL, 0>(&textureGatherOffsets_00a20B10Dx4),
     Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(EXT_gpu_shader5)>(
         &textureGatherOffsetsExt_00a20B10Dx4),
     Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&textureGatherOffsets_00d10B00B10Dx4),
-    Rule::Get<Spec::GLSL, 400, Shader::ALL, 0>(&textureGatherOffsets_00d10B00B10Dx4),
     Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(EXT_gpu_shader5)>(
         &textureGatherOffsetsExt_00d10B00B10Dx4),
     Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&textureGatherOffsets_00f20B00B10Dx4),
-    Rule::Get<Spec::GLSL, 400, Shader::ALL, 0>(&textureGatherOffsets_00f20B00B10Dx4),
     Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(EXT_gpu_shader5)>(
         &textureGatherOffsetsExt_00f20B00B10Dx4),
     Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&textureGatherOffsets_00I10B10Dx400D),
-    Rule::Get<Spec::GLSL, 400, Shader::ALL, 0>(&textureGatherOffsets_00I10B10Dx400D),
     Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(EXT_gpu_shader5)>(
         &textureGatherOffsetsExt_00I10B10Dx400D),
     Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&textureGatherOffsets_00R10B10Dx400D),
-    Rule::Get<Spec::GLSL, 400, Shader::ALL, 0>(&textureGatherOffsets_00R10B10Dx400D),
     Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(EXT_gpu_shader5)>(
         &textureGatherOffsetsExt_00R10B10Dx400D),
     Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&textureGatherOffsets_00X10B10Dx400D),
-    Rule::Get<Spec::GLSL, 400, Shader::ALL, 0>(&textureGatherOffsets_00X10B10Dx400D),
     Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(EXT_gpu_shader5)>(
         &textureGatherOffsetsExt_00X10B10Dx400D),
     Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&textureGatherOffsets_00L20B10Dx400D),
-    Rule::Get<Spec::GLSL, 400, Shader::ALL, 0>(&textureGatherOffsets_00L20B10Dx400D),
     Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(EXT_gpu_shader5)>(
         &textureGatherOffsetsExt_00L20B10Dx400D),
     Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&textureGatherOffsets_00U20B10Dx400D),
-    Rule::Get<Spec::GLSL, 400, Shader::ALL, 0>(&textureGatherOffsets_00U20B10Dx400D),
     Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(EXT_gpu_shader5)>(
         &textureGatherOffsetsExt_00U20B10Dx400D),
     Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&textureGatherOffsets_00a20B10Dx400D),
-    Rule::Get<Spec::GLSL, 400, Shader::ALL, 0>(&textureGatherOffsets_00a20B10Dx400D),
     Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(EXT_gpu_shader5)>(
         &textureGatherOffsetsExt_00a20B10Dx400D),
     Rule::Get<Spec::ESSL, 300, Shader::ALL, EXT_INDEX(EXT_YUV_target)>(&rgb_2_yuv_20B00H),
     Rule::Get<Spec::ESSL, 300, Shader::ALL, EXT_INDEX(EXT_YUV_target)>(&yuv_2_rgb_20B00H),
     Rule::Get<Spec::ESSL, 300, Shader::FRAGMENT, 0>(&dFdx_00B),
-    Rule::Get<Spec::GLSL, 0, Shader::FRAGMENT, 0>(&dFdx_00B),
     Rule::Get<Spec::ESSL, 100, Shader::FRAGMENT, EXT_INDEX(OES_standard_derivatives)>(&dFdxExt_00B),
     Rule::Get<Spec::ESSL, 300, Shader::FRAGMENT, 0>(&dFdx_10B),
-    Rule::Get<Spec::GLSL, 0, Shader::FRAGMENT, 0>(&dFdx_10B),
     Rule::Get<Spec::ESSL, 100, Shader::FRAGMENT, EXT_INDEX(OES_standard_derivatives)>(&dFdxExt_10B),
     Rule::Get<Spec::ESSL, 300, Shader::FRAGMENT, 0>(&dFdx_20B),
-    Rule::Get<Spec::GLSL, 0, Shader::FRAGMENT, 0>(&dFdx_20B),
     Rule::Get<Spec::ESSL, 100, Shader::FRAGMENT, EXT_INDEX(OES_standard_derivatives)>(&dFdxExt_20B),
     Rule::Get<Spec::ESSL, 300, Shader::FRAGMENT, 0>(&dFdx_30B),
-    Rule::Get<Spec::GLSL, 0, Shader::FRAGMENT, 0>(&dFdx_30B),
     Rule::Get<Spec::ESSL, 100, Shader::FRAGMENT, EXT_INDEX(OES_standard_derivatives)>(&dFdxExt_30B),
     Rule::Get<Spec::ESSL, 300, Shader::FRAGMENT, 0>(&dFdy_00B),
-    Rule::Get<Spec::GLSL, 0, Shader::FRAGMENT, 0>(&dFdy_00B),
     Rule::Get<Spec::ESSL, 100, Shader::FRAGMENT, EXT_INDEX(OES_standard_derivatives)>(&dFdyExt_00B),
     Rule::Get<Spec::ESSL, 300, Shader::FRAGMENT, 0>(&dFdy_10B),
-    Rule::Get<Spec::GLSL, 0, Shader::FRAGMENT, 0>(&dFdy_10B),
     Rule::Get<Spec::ESSL, 100, Shader::FRAGMENT, EXT_INDEX(OES_standard_derivatives)>(&dFdyExt_10B),
     Rule::Get<Spec::ESSL, 300, Shader::FRAGMENT, 0>(&dFdy_20B),
-    Rule::Get<Spec::GLSL, 0, Shader::FRAGMENT, 0>(&dFdy_20B),
     Rule::Get<Spec::ESSL, 100, Shader::FRAGMENT, EXT_INDEX(OES_standard_derivatives)>(&dFdyExt_20B),
     Rule::Get<Spec::ESSL, 300, Shader::FRAGMENT, 0>(&dFdy_30B),
-    Rule::Get<Spec::GLSL, 0, Shader::FRAGMENT, 0>(&dFdy_30B),
     Rule::Get<Spec::ESSL, 100, Shader::FRAGMENT, EXT_INDEX(OES_standard_derivatives)>(&dFdyExt_30B),
     Rule::Get<Spec::ESSL, 300, Shader::FRAGMENT, 0>(&fwidth_00B),
-    Rule::Get<Spec::GLSL, 0, Shader::FRAGMENT, 0>(&fwidth_00B),
     Rule::Get<Spec::ESSL, 100, Shader::FRAGMENT, EXT_INDEX(OES_standard_derivatives)>(
         &fwidthExt_00B),
     Rule::Get<Spec::ESSL, 300, Shader::FRAGMENT, 0>(&fwidth_10B),
-    Rule::Get<Spec::GLSL, 0, Shader::FRAGMENT, 0>(&fwidth_10B),
     Rule::Get<Spec::ESSL, 100, Shader::FRAGMENT, EXT_INDEX(OES_standard_derivatives)>(
         &fwidthExt_10B),
     Rule::Get<Spec::ESSL, 300, Shader::FRAGMENT, 0>(&fwidth_20B),
-    Rule::Get<Spec::GLSL, 0, Shader::FRAGMENT, 0>(&fwidth_20B),
     Rule::Get<Spec::ESSL, 100, Shader::FRAGMENT, EXT_INDEX(OES_standard_derivatives)>(
         &fwidthExt_20B),
     Rule::Get<Spec::ESSL, 300, Shader::FRAGMENT, 0>(&fwidth_30B),
-    Rule::Get<Spec::GLSL, 0, Shader::FRAGMENT, 0>(&fwidth_30B),
     Rule::Get<Spec::ESSL, 100, Shader::FRAGMENT, EXT_INDEX(OES_standard_derivatives)>(
         &fwidthExt_30B),
     Rule::Get<Spec::ESSL, 320, Shader::FRAGMENT, 0>(&interpolateAtCentroid_00B),
-    Rule::Get<Spec::GLSL, 400, Shader::FRAGMENT, 0>(&interpolateAtCentroid_00B),
     Rule::Get<Spec::ESSL, 300, Shader::FRAGMENT, EXT_INDEX(OES_shader_multisample_interpolation)>(
         &interpolateAtCentroidExt_00B),
     Rule::Get<Spec::ESSL, 320, Shader::FRAGMENT, 0>(&interpolateAtCentroid_10B),
-    Rule::Get<Spec::GLSL, 400, Shader::FRAGMENT, 0>(&interpolateAtCentroid_10B),
     Rule::Get<Spec::ESSL, 300, Shader::FRAGMENT, EXT_INDEX(OES_shader_multisample_interpolation)>(
         &interpolateAtCentroidExt_10B),
     Rule::Get<Spec::ESSL, 320, Shader::FRAGMENT, 0>(&interpolateAtCentroid_20B),
-    Rule::Get<Spec::GLSL, 400, Shader::FRAGMENT, 0>(&interpolateAtCentroid_20B),
     Rule::Get<Spec::ESSL, 300, Shader::FRAGMENT, EXT_INDEX(OES_shader_multisample_interpolation)>(
         &interpolateAtCentroidExt_20B),
     Rule::Get<Spec::ESSL, 320, Shader::FRAGMENT, 0>(&interpolateAtCentroid_30B),
-    Rule::Get<Spec::GLSL, 400, Shader::FRAGMENT, 0>(&interpolateAtCentroid_30B),
     Rule::Get<Spec::ESSL, 300, Shader::FRAGMENT, EXT_INDEX(OES_shader_multisample_interpolation)>(
         &interpolateAtCentroidExt_30B),
     Rule::Get<Spec::ESSL, 320, Shader::FRAGMENT, 0>(&interpolateAtSample_00B00D),
-    Rule::Get<Spec::GLSL, 400, Shader::FRAGMENT, 0>(&interpolateAtSample_00B00D),
     Rule::Get<Spec::ESSL, 300, Shader::FRAGMENT, EXT_INDEX(OES_shader_multisample_interpolation)>(
         &interpolateAtSampleExt_00B00D),
     Rule::Get<Spec::ESSL, 320, Shader::FRAGMENT, 0>(&interpolateAtSample_10B00D),
-    Rule::Get<Spec::GLSL, 400, Shader::FRAGMENT, 0>(&interpolateAtSample_10B00D),
     Rule::Get<Spec::ESSL, 300, Shader::FRAGMENT, EXT_INDEX(OES_shader_multisample_interpolation)>(
         &interpolateAtSampleExt_10B00D),
     Rule::Get<Spec::ESSL, 320, Shader::FRAGMENT, 0>(&interpolateAtSample_20B00D),
-    Rule::Get<Spec::GLSL, 400, Shader::FRAGMENT, 0>(&interpolateAtSample_20B00D),
     Rule::Get<Spec::ESSL, 300, Shader::FRAGMENT, EXT_INDEX(OES_shader_multisample_interpolation)>(
         &interpolateAtSampleExt_20B00D),
     Rule::Get<Spec::ESSL, 320, Shader::FRAGMENT, 0>(&interpolateAtSample_30B00D),
-    Rule::Get<Spec::GLSL, 400, Shader::FRAGMENT, 0>(&interpolateAtSample_30B00D),
     Rule::Get<Spec::ESSL, 300, Shader::FRAGMENT, EXT_INDEX(OES_shader_multisample_interpolation)>(
         &interpolateAtSampleExt_30B00D),
     Rule::Get<Spec::ESSL, 320, Shader::FRAGMENT, 0>(&interpolateAtOffset_00B10B),
-    Rule::Get<Spec::GLSL, 400, Shader::FRAGMENT, 0>(&interpolateAtOffset_00B10B),
     Rule::Get<Spec::ESSL, 300, Shader::FRAGMENT, EXT_INDEX(OES_shader_multisample_interpolation)>(
         &interpolateAtOffsetExt_00B10B),
     Rule::Get<Spec::ESSL, 320, Shader::FRAGMENT, 0>(&interpolateAtOffset_10B10B),
-    Rule::Get<Spec::GLSL, 400, Shader::FRAGMENT, 0>(&interpolateAtOffset_10B10B),
     Rule::Get<Spec::ESSL, 300, Shader::FRAGMENT, EXT_INDEX(OES_shader_multisample_interpolation)>(
         &interpolateAtOffsetExt_10B10B),
     Rule::Get<Spec::ESSL, 320, Shader::FRAGMENT, 0>(&interpolateAtOffset_20B10B),
-    Rule::Get<Spec::GLSL, 400, Shader::FRAGMENT, 0>(&interpolateAtOffset_20B10B),
     Rule::Get<Spec::ESSL, 300, Shader::FRAGMENT, EXT_INDEX(OES_shader_multisample_interpolation)>(
         &interpolateAtOffsetExt_20B10B),
     Rule::Get<Spec::ESSL, 320, Shader::FRAGMENT, 0>(&interpolateAtOffset_30B10B),
-    Rule::Get<Spec::GLSL, 400, Shader::FRAGMENT, 0>(&interpolateAtOffset_30B10B),
     Rule::Get<Spec::ESSL, 300, Shader::FRAGMENT, EXT_INDEX(OES_shader_multisample_interpolation)>(
         &interpolateAtOffsetExt_30B10B),
     Rule::Get<Spec::ESSL, 310, Shader::ALL, 0>(&atomicCounter_00G),
-    Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&atomicCounter_00G),
     Rule::Get<Spec::ESSL, 310, Shader::ALL, 0>(&atomicCounterIncrement_00G),
-    Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&atomicCounterIncrement_00G),
     Rule::Get<Spec::ESSL, 310, Shader::ALL, 0>(&atomicCounterDecrement_00G),
-    Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&atomicCounterDecrement_00G),
     Rule::Get<Spec::ESSL, 310, Shader::ALL, 0>(&atomicAdd_00E00E),
-    Rule::Get<Spec::GLSL, 430, Shader::ALL, 0>(&atomicAdd_00E00E),
     Rule::Get<Spec::ESSL, 310, Shader::ALL, 0>(&atomicAdd_00D00D),
-    Rule::Get<Spec::GLSL, 430, Shader::ALL, 0>(&atomicAdd_00D00D),
     Rule::Get<Spec::ESSL, 310, Shader::ALL, 0>(&atomicMin_00E00E),
-    Rule::Get<Spec::GLSL, 430, Shader::ALL, 0>(&atomicMin_00E00E),
     Rule::Get<Spec::ESSL, 310, Shader::ALL, 0>(&atomicMin_00D00D),
-    Rule::Get<Spec::GLSL, 430, Shader::ALL, 0>(&atomicMin_00D00D),
     Rule::Get<Spec::ESSL, 310, Shader::ALL, 0>(&atomicMax_00E00E),
-    Rule::Get<Spec::GLSL, 430, Shader::ALL, 0>(&atomicMax_00E00E),
     Rule::Get<Spec::ESSL, 310, Shader::ALL, 0>(&atomicMax_00D00D),
-    Rule::Get<Spec::GLSL, 430, Shader::ALL, 0>(&atomicMax_00D00D),
     Rule::Get<Spec::ESSL, 310, Shader::ALL, 0>(&atomicAnd_00E00E),
-    Rule::Get<Spec::GLSL, 430, Shader::ALL, 0>(&atomicAnd_00E00E),
     Rule::Get<Spec::ESSL, 310, Shader::ALL, 0>(&atomicAnd_00D00D),
-    Rule::Get<Spec::GLSL, 430, Shader::ALL, 0>(&atomicAnd_00D00D),
     Rule::Get<Spec::ESSL, 310, Shader::ALL, 0>(&atomicOr_00E00E),
-    Rule::Get<Spec::GLSL, 430, Shader::ALL, 0>(&atomicOr_00E00E),
     Rule::Get<Spec::ESSL, 310, Shader::ALL, 0>(&atomicOr_00D00D),
-    Rule::Get<Spec::GLSL, 430, Shader::ALL, 0>(&atomicOr_00D00D),
     Rule::Get<Spec::ESSL, 310, Shader::ALL, 0>(&atomicXor_00E00E),
-    Rule::Get<Spec::GLSL, 430, Shader::ALL, 0>(&atomicXor_00E00E),
     Rule::Get<Spec::ESSL, 310, Shader::ALL, 0>(&atomicXor_00D00D),
-    Rule::Get<Spec::GLSL, 430, Shader::ALL, 0>(&atomicXor_00D00D),
     Rule::Get<Spec::ESSL, 310, Shader::ALL, 0>(&atomicExchange_00E00E),
-    Rule::Get<Spec::GLSL, 430, Shader::ALL, 0>(&atomicExchange_00E00E),
     Rule::Get<Spec::ESSL, 310, Shader::ALL, 0>(&atomicExchange_00D00D),
-    Rule::Get<Spec::GLSL, 430, Shader::ALL, 0>(&atomicExchange_00D00D),
     Rule::Get<Spec::ESSL, 310, Shader::ALL, 0>(&atomicCompSwap_00E00E00E),
-    Rule::Get<Spec::GLSL, 430, Shader::ALL, 0>(&atomicCompSwap_00E00E00E),
     Rule::Get<Spec::ESSL, 310, Shader::ALL, 0>(&atomicCompSwap_00D00D00D),
-    Rule::Get<Spec::GLSL, 430, Shader::ALL, 0>(&atomicCompSwap_00D00D00D),
     Rule::Get<Spec::ESSL, 310, Shader::ALL, 0>(&imageSize_00z),
     Rule::Get<Spec::ESSL, 310, Shader::ALL, 0>(&imageSize_01K),
     Rule::Get<Spec::ESSL, 310, Shader::ALL, 0>(&imageSize_01V),
@@ -21419,252 +20738,180 @@
     Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>(
         &imageAtomicCompSwapExt_01c20D00D00D00D),
     Rule::Get<Spec::ESSL, 310, Shader::ALL, 0>(&memoryBarrier_),
-    Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&memoryBarrier_),
     Rule::Get<Spec::ESSL, 310, Shader::ALL, 0>(&memoryBarrierAtomicCounter_),
-    Rule::Get<Spec::GLSL, 430, Shader::ALL, 0>(&memoryBarrierAtomicCounter_),
     Rule::Get<Spec::ESSL, 310, Shader::ALL, 0>(&memoryBarrierBuffer_),
-    Rule::Get<Spec::GLSL, 430, Shader::ALL, 0>(&memoryBarrierBuffer_),
     Rule::Get<Spec::ESSL, 310, Shader::ALL, 0>(&memoryBarrierImage_),
-    Rule::Get<Spec::GLSL, 430, Shader::ALL, 0>(&memoryBarrierImage_),
     Rule::Get<Spec::ESSL, 310, Shader::COMPUTE, 0>(&barrier_),
-    Rule::Get<Spec::GLSL, 400, Shader::COMPUTE, 0>(&barrier_),
-    Rule::Get<Spec::ESSL, 320, Shader::TESS_CONTROL_EXT, 0>(&barrierES3_2_),
+    Rule::Get<Spec::ESSL, 320, Shader::TESS_CONTROL_EXT, 0>(&barrierTCSES3_2_),
     Rule::Get<Spec::ESSL, 310, Shader::TESS_CONTROL_EXT, EXT_INDEX(EXT_tessellation_shader)>(
-        &barrier_),
+        &barrierTCS_),
     Rule::Get<Spec::ESSL, 310, Shader::COMPUTE, 0>(&memoryBarrierShared_),
-    Rule::Get<Spec::GLSL, 430, Shader::COMPUTE, 0>(&memoryBarrierShared_),
     Rule::Get<Spec::ESSL, 310, Shader::COMPUTE, 0>(&groupMemoryBarrier_),
-    Rule::Get<Spec::GLSL, 430, Shader::COMPUTE, 0>(&groupMemoryBarrier_),
     Rule::Get<Spec::ESSL, 320, Shader::GEOMETRY, 0>(&EmitVertexES3_2_),
     Rule::Get<Spec::ESSL, 310, Shader::GEOMETRY, EXT_INDEX(EXT_geometry_shader)>(&EmitVertex_),
     Rule::Get<Spec::ESSL, 310, Shader::GEOMETRY, EXT_INDEX(OES_geometry_shader)>(&EmitVertex_),
     Rule::Get<Spec::ESSL, 320, Shader::GEOMETRY, 0>(&EndPrimitiveES3_2_),
     Rule::Get<Spec::ESSL, 310, Shader::GEOMETRY, EXT_INDEX(EXT_geometry_shader)>(&EndPrimitive_),
     Rule::Get<Spec::ESSL, 310, Shader::GEOMETRY, EXT_INDEX(OES_geometry_shader)>(&EndPrimitive_),
+    Rule::Get<Spec::ESSL, kESSLVulkanOnly, Shader::ALL, 0>(&subpassLoad_01g),
+    Rule::Get<Spec::ESSL, kESSLVulkanOnly, Shader::ALL, 0>(&subpassLoad_01h),
+    Rule::Get<Spec::ESSL, kESSLVulkanOnly, Shader::ALL, 0>(&subpassLoad_01i),
+    Rule::Get<Spec::ESSL, kESSLVulkanOnly, Shader::ALL, 0>(&subpassLoad_01j00D),
+    Rule::Get<Spec::ESSL, kESSLVulkanOnly, Shader::ALL, 0>(&subpassLoad_01k00D),
+    Rule::Get<Spec::ESSL, kESSLVulkanOnly, Shader::ALL, 0>(&subpassLoad_01l00D),
     Rule::Get<Spec::ESSL, 0, Shader::ALL, 0>(&TableBase::m_gl_DepthRangeParameters),
-    Rule::Get<Spec::GLSL, 0, Shader::ALL, 0>(&TableBase::m_gl_DepthRangeParameters),
     Rule::Get<Spec::ESSL, 0, Shader::ALL, 0>(&TableBase::m_gl_DepthRange),
-    Rule::Get<Spec::GLSL, 0, Shader::ALL, 0>(&TableBase::m_gl_DepthRange),
     Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&BuiltInVariable::kgl_NumSamplesES3_2),
-    Rule::Get<Spec::GLSL, 0, Shader::ALL, 0>(&BuiltInVariable::kgl_NumSamplesES3_2),
     Rule::Get<Spec::ESSL, 300, Shader::ALL, EXT_INDEX(OES_sample_variables)>(
         &BuiltInVariable::kgl_NumSamples),
     Rule::Get<Spec::ESSL, 0, Shader::ALL, 0>(&TableBase::m_gl_MaxVertexAttribs),
-    Rule::Get<Spec::GLSL, 0, Shader::ALL, 0>(&TableBase::m_gl_MaxVertexAttribs),
     Rule::Get<Spec::ESSL, 0, Shader::ALL, 0>(&TableBase::m_gl_MaxVertexUniformVectors),
-    Rule::Get<Spec::GLSL, 0, Shader::ALL, 0>(&TableBase::m_gl_MaxVertexUniformVectors),
     Rule::Get<Spec::ESSL, 0, Shader::ALL, 0>(&TableBase::m_gl_MaxVertexTextureImageUnits),
-    Rule::Get<Spec::GLSL, 0, Shader::ALL, 0>(&TableBase::m_gl_MaxVertexTextureImageUnits),
     Rule::Get<Spec::ESSL, 0, Shader::ALL, 0>(&TableBase::m_gl_MaxCombinedTextureImageUnits),
-    Rule::Get<Spec::GLSL, 0, Shader::ALL, 0>(&TableBase::m_gl_MaxCombinedTextureImageUnits),
     Rule::Get<Spec::ESSL, 0, Shader::ALL, 0>(&TableBase::m_gl_MaxTextureImageUnits),
-    Rule::Get<Spec::GLSL, 0, Shader::ALL, 0>(&TableBase::m_gl_MaxTextureImageUnits),
     Rule::Get<Spec::ESSL, 0, Shader::ALL, 0>(&TableBase::m_gl_MaxFragmentUniformVectors),
-    Rule::Get<Spec::GLSL, 0, Shader::ALL, 0>(&TableBase::m_gl_MaxFragmentUniformVectors),
     Rule::Get<Spec::ESSL, 100, Shader::ALL, 0>(&TableBase::m_gl_MaxVaryingVectors),
-    Rule::Get<Spec::GLSL, 0, Shader::ALL, 0>(&TableBase::m_gl_MaxVaryingVectors),
     Rule::Get<Spec::ESSL, 0, Shader::ALL, 0>(&TableBase::m_gl_MaxDrawBuffers),
-    Rule::Get<Spec::GLSL, 0, Shader::ALL, 0>(&TableBase::m_gl_MaxDrawBuffers),
     Rule::Get<Spec::ESSL, 0, Shader::ALL, EXT_INDEX(EXT_blend_func_extended)>(
         &TableBase::m_gl_MaxDualSourceDrawBuffersEXT),
     Rule::Get<Spec::ESSL, 300, Shader::ALL, 0>(&TableBase::m_gl_MaxVertexOutputVectors),
-    Rule::Get<Spec::GLSL, 0, Shader::ALL, 0>(&TableBase::m_gl_MaxVertexOutputVectors),
     Rule::Get<Spec::ESSL, 300, Shader::ALL, 0>(&TableBase::m_gl_MaxFragmentInputVectors),
-    Rule::Get<Spec::GLSL, 0, Shader::ALL, 0>(&TableBase::m_gl_MaxFragmentInputVectors),
     Rule::Get<Spec::ESSL, 300, Shader::ALL, 0>(&TableBase::m_gl_MinProgramTexelOffset),
-    Rule::Get<Spec::GLSL, 0, Shader::ALL, 0>(&TableBase::m_gl_MinProgramTexelOffset),
     Rule::Get<Spec::ESSL, 300, Shader::ALL, 0>(&TableBase::m_gl_MaxProgramTexelOffset),
-    Rule::Get<Spec::GLSL, 0, Shader::ALL, 0>(&TableBase::m_gl_MaxProgramTexelOffset),
     Rule::Get<Spec::ESSL, 310, Shader::ALL, 0>(&TableBase::m_gl_MaxImageUnits),
-    Rule::Get<Spec::GLSL, 0, Shader::ALL, 0>(&TableBase::m_gl_MaxImageUnits),
     Rule::Get<Spec::ESSL, 310, Shader::ALL, 0>(&TableBase::m_gl_MaxVertexImageUniforms),
-    Rule::Get<Spec::GLSL, 0, Shader::ALL, 0>(&TableBase::m_gl_MaxVertexImageUniforms),
     Rule::Get<Spec::ESSL, 310, Shader::ALL, 0>(&TableBase::m_gl_MaxFragmentImageUniforms),
-    Rule::Get<Spec::GLSL, 0, Shader::ALL, 0>(&TableBase::m_gl_MaxFragmentImageUniforms),
     Rule::Get<Spec::ESSL, 310, Shader::ALL, 0>(&TableBase::m_gl_MaxComputeImageUniforms),
-    Rule::Get<Spec::GLSL, 0, Shader::ALL, 0>(&TableBase::m_gl_MaxComputeImageUniforms),
     Rule::Get<Spec::ESSL, 310, Shader::ALL, 0>(&TableBase::m_gl_MaxCombinedImageUniforms),
-    Rule::Get<Spec::GLSL, 0, Shader::ALL, 0>(&TableBase::m_gl_MaxCombinedImageUniforms),
     Rule::Get<Spec::ESSL, 310, Shader::ALL, 0>(&TableBase::m_gl_MaxCombinedShaderOutputResources),
-    Rule::Get<Spec::GLSL, 0, Shader::ALL, 0>(&TableBase::m_gl_MaxCombinedShaderOutputResources),
     Rule::Get<Spec::ESSL, 310, Shader::ALL, 0>(&TableBase::m_gl_MaxComputeWorkGroupCount),
-    Rule::Get<Spec::GLSL, 0, Shader::ALL, 0>(&TableBase::m_gl_MaxComputeWorkGroupCount),
     Rule::Get<Spec::ESSL, 310, Shader::ALL, 0>(&TableBase::m_gl_MaxComputeWorkGroupSize),
-    Rule::Get<Spec::GLSL, 0, Shader::ALL, 0>(&TableBase::m_gl_MaxComputeWorkGroupSize),
     Rule::Get<Spec::ESSL, 310, Shader::ALL, 0>(&TableBase::m_gl_MaxComputeUniformComponents),
-    Rule::Get<Spec::GLSL, 0, Shader::ALL, 0>(&TableBase::m_gl_MaxComputeUniformComponents),
     Rule::Get<Spec::ESSL, 310, Shader::ALL, 0>(&TableBase::m_gl_MaxComputeTextureImageUnits),
-    Rule::Get<Spec::GLSL, 0, Shader::ALL, 0>(&TableBase::m_gl_MaxComputeTextureImageUnits),
     Rule::Get<Spec::ESSL, 310, Shader::ALL, 0>(&TableBase::m_gl_MaxComputeAtomicCounters),
-    Rule::Get<Spec::GLSL, 0, Shader::ALL, 0>(&TableBase::m_gl_MaxComputeAtomicCounters),
     Rule::Get<Spec::ESSL, 310, Shader::ALL, 0>(&TableBase::m_gl_MaxComputeAtomicCounterBuffers),
-    Rule::Get<Spec::GLSL, 0, Shader::ALL, 0>(&TableBase::m_gl_MaxComputeAtomicCounterBuffers),
     Rule::Get<Spec::ESSL, 310, Shader::ALL, 0>(&TableBase::m_gl_MaxVertexAtomicCounters),
-    Rule::Get<Spec::GLSL, 0, Shader::ALL, 0>(&TableBase::m_gl_MaxVertexAtomicCounters),
     Rule::Get<Spec::ESSL, 310, Shader::ALL, 0>(&TableBase::m_gl_MaxFragmentAtomicCounters),
-    Rule::Get<Spec::GLSL, 0, Shader::ALL, 0>(&TableBase::m_gl_MaxFragmentAtomicCounters),
     Rule::Get<Spec::ESSL, 310, Shader::ALL, 0>(&TableBase::m_gl_MaxCombinedAtomicCounters),
-    Rule::Get<Spec::GLSL, 0, Shader::ALL, 0>(&TableBase::m_gl_MaxCombinedAtomicCounters),
     Rule::Get<Spec::ESSL, 310, Shader::ALL, 0>(&TableBase::m_gl_MaxAtomicCounterBindings),
-    Rule::Get<Spec::GLSL, 0, Shader::ALL, 0>(&TableBase::m_gl_MaxAtomicCounterBindings),
     Rule::Get<Spec::ESSL, 310, Shader::ALL, 0>(&TableBase::m_gl_MaxVertexAtomicCounterBuffers),
-    Rule::Get<Spec::GLSL, 0, Shader::ALL, 0>(&TableBase::m_gl_MaxVertexAtomicCounterBuffers),
     Rule::Get<Spec::ESSL, 310, Shader::ALL, 0>(&TableBase::m_gl_MaxFragmentAtomicCounterBuffers),
-    Rule::Get<Spec::GLSL, 0, Shader::ALL, 0>(&TableBase::m_gl_MaxFragmentAtomicCounterBuffers),
     Rule::Get<Spec::ESSL, 310, Shader::ALL, 0>(&TableBase::m_gl_MaxCombinedAtomicCounterBuffers),
-    Rule::Get<Spec::GLSL, 0, Shader::ALL, 0>(&TableBase::m_gl_MaxCombinedAtomicCounterBuffers),
     Rule::Get<Spec::ESSL, 310, Shader::ALL, 0>(&TableBase::m_gl_MaxAtomicCounterBufferSize),
-    Rule::Get<Spec::GLSL, 0, Shader::ALL, 0>(&TableBase::m_gl_MaxAtomicCounterBufferSize),
     Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&TableBase::m_gl_MaxGeometryInputComponentsES3_2),
-    Rule::Get<Spec::GLSL, 0, Shader::ALL, 0>(&TableBase::m_gl_MaxGeometryInputComponentsES3_2),
     Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(EXT_geometry_shader)>(
         &TableBase::m_gl_MaxGeometryInputComponents),
     Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_geometry_shader)>(
         &TableBase::m_gl_MaxGeometryInputComponents),
     Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&TableBase::m_gl_MaxGeometryOutputComponentsES3_2),
-    Rule::Get<Spec::GLSL, 0, Shader::ALL, 0>(&TableBase::m_gl_MaxGeometryOutputComponentsES3_2),
     Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(EXT_geometry_shader)>(
         &TableBase::m_gl_MaxGeometryOutputComponents),
     Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_geometry_shader)>(
         &TableBase::m_gl_MaxGeometryOutputComponents),
     Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&TableBase::m_gl_MaxGeometryImageUniformsES3_2),
-    Rule::Get<Spec::GLSL, 0, Shader::ALL, 0>(&TableBase::m_gl_MaxGeometryImageUniformsES3_2),
     Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(EXT_geometry_shader)>(
         &TableBase::m_gl_MaxGeometryImageUniforms),
     Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_geometry_shader)>(
         &TableBase::m_gl_MaxGeometryImageUniforms),
     Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&TableBase::m_gl_MaxGeometryTextureImageUnitsES3_2),
-    Rule::Get<Spec::GLSL, 0, Shader::ALL, 0>(&TableBase::m_gl_MaxGeometryTextureImageUnitsES3_2),
     Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(EXT_geometry_shader)>(
         &TableBase::m_gl_MaxGeometryTextureImageUnits),
     Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_geometry_shader)>(
         &TableBase::m_gl_MaxGeometryTextureImageUnits),
     Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&TableBase::m_gl_MaxGeometryOutputVerticesES3_2),
-    Rule::Get<Spec::GLSL, 0, Shader::ALL, 0>(&TableBase::m_gl_MaxGeometryOutputVerticesES3_2),
     Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(EXT_geometry_shader)>(
         &TableBase::m_gl_MaxGeometryOutputVertices),
     Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_geometry_shader)>(
         &TableBase::m_gl_MaxGeometryOutputVertices),
     Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(
         &TableBase::m_gl_MaxGeometryTotalOutputComponentsES3_2),
-    Rule::Get<Spec::GLSL, 0, Shader::ALL, 0>(
-        &TableBase::m_gl_MaxGeometryTotalOutputComponentsES3_2),
     Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(EXT_geometry_shader)>(
         &TableBase::m_gl_MaxGeometryTotalOutputComponents),
     Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_geometry_shader)>(
         &TableBase::m_gl_MaxGeometryTotalOutputComponents),
     Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&TableBase::m_gl_MaxGeometryUniformComponentsES3_2),
-    Rule::Get<Spec::GLSL, 0, Shader::ALL, 0>(&TableBase::m_gl_MaxGeometryUniformComponentsES3_2),
     Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(EXT_geometry_shader)>(
         &TableBase::m_gl_MaxGeometryUniformComponents),
     Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_geometry_shader)>(
         &TableBase::m_gl_MaxGeometryUniformComponents),
     Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&TableBase::m_gl_MaxGeometryAtomicCountersES3_2),
-    Rule::Get<Spec::GLSL, 0, Shader::ALL, 0>(&TableBase::m_gl_MaxGeometryAtomicCountersES3_2),
     Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(EXT_geometry_shader)>(
         &TableBase::m_gl_MaxGeometryAtomicCounters),
     Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_geometry_shader)>(
         &TableBase::m_gl_MaxGeometryAtomicCounters),
     Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(
         &TableBase::m_gl_MaxGeometryAtomicCounterBuffersES3_2),
-    Rule::Get<Spec::GLSL, 0, Shader::ALL, 0>(&TableBase::m_gl_MaxGeometryAtomicCounterBuffersES3_2),
     Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(EXT_geometry_shader)>(
         &TableBase::m_gl_MaxGeometryAtomicCounterBuffers),
     Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_geometry_shader)>(
         &TableBase::m_gl_MaxGeometryAtomicCounterBuffers),
     Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&TableBase::m_gl_MaxTessControlInputComponentsES3_2),
-    Rule::Get<Spec::GLSL, 0, Shader::ALL, 0>(&TableBase::m_gl_MaxTessControlInputComponentsES3_2),
     Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(EXT_tessellation_shader)>(
         &TableBase::m_gl_MaxTessControlInputComponents),
     Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(
         &TableBase::m_gl_MaxTessControlOutputComponentsES3_2),
-    Rule::Get<Spec::GLSL, 0, Shader::ALL, 0>(&TableBase::m_gl_MaxTessControlOutputComponentsES3_2),
     Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(EXT_tessellation_shader)>(
         &TableBase::m_gl_MaxTessControlOutputComponents),
     Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(
         &TableBase::m_gl_MaxTessControlTextureImageUnitsES3_2),
-    Rule::Get<Spec::GLSL, 0, Shader::ALL, 0>(&TableBase::m_gl_MaxTessControlTextureImageUnitsES3_2),
     Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(EXT_tessellation_shader)>(
         &TableBase::m_gl_MaxTessControlTextureImageUnits),
     Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(
         &TableBase::m_gl_MaxTessControlUniformComponentsES3_2),
-    Rule::Get<Spec::GLSL, 0, Shader::ALL, 0>(&TableBase::m_gl_MaxTessControlUniformComponentsES3_2),
     Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(EXT_tessellation_shader)>(
         &TableBase::m_gl_MaxTessControlUniformComponents),
     Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(
         &TableBase::m_gl_MaxTessControlTotalOutputComponentsES3_2),
-    Rule::Get<Spec::GLSL, 0, Shader::ALL, 0>(
-        &TableBase::m_gl_MaxTessControlTotalOutputComponentsES3_2),
     Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(EXT_tessellation_shader)>(
         &TableBase::m_gl_MaxTessControlTotalOutputComponents),
     Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&TableBase::m_gl_MaxTessControlImageUniformsES3_2),
-    Rule::Get<Spec::GLSL, 0, Shader::ALL, 0>(&TableBase::m_gl_MaxTessControlImageUniformsES3_2),
     Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(EXT_tessellation_shader)>(
         &TableBase::m_gl_MaxTessControlImageUniforms),
     Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&TableBase::m_gl_MaxTessControlAtomicCountersES3_2),
-    Rule::Get<Spec::GLSL, 0, Shader::ALL, 0>(&TableBase::m_gl_MaxTessControlAtomicCountersES3_2),
     Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(EXT_tessellation_shader)>(
         &TableBase::m_gl_MaxTessControlAtomicCounters),
     Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(
         &TableBase::m_gl_MaxTessControlAtomicCounterBuffersES3_2),
-    Rule::Get<Spec::GLSL, 0, Shader::ALL, 0>(
-        &TableBase::m_gl_MaxTessControlAtomicCounterBuffersES3_2),
     Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(EXT_tessellation_shader)>(
         &TableBase::m_gl_MaxTessControlAtomicCounterBuffers),
     Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&TableBase::m_gl_MaxTessPatchComponentsES3_2),
-    Rule::Get<Spec::GLSL, 0, Shader::ALL, 0>(&TableBase::m_gl_MaxTessPatchComponentsES3_2),
     Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(EXT_tessellation_shader)>(
         &TableBase::m_gl_MaxTessPatchComponents),
     Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&TableBase::m_gl_MaxPatchVerticesES3_2),
-    Rule::Get<Spec::GLSL, 0, Shader::ALL, 0>(&TableBase::m_gl_MaxPatchVerticesES3_2),
     Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(EXT_tessellation_shader)>(
         &TableBase::m_gl_MaxPatchVertices),
     Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&TableBase::m_gl_MaxTessGenLevelES3_2),
-    Rule::Get<Spec::GLSL, 0, Shader::ALL, 0>(&TableBase::m_gl_MaxTessGenLevelES3_2),
     Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(EXT_tessellation_shader)>(
         &TableBase::m_gl_MaxTessGenLevel),
     Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(
         &TableBase::m_gl_MaxTessEvaluationInputComponentsES3_2),
-    Rule::Get<Spec::GLSL, 0, Shader::ALL, 0>(
-        &TableBase::m_gl_MaxTessEvaluationInputComponentsES3_2),
     Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(EXT_tessellation_shader)>(
         &TableBase::m_gl_MaxTessEvaluationInputComponents),
     Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(
         &TableBase::m_gl_MaxTessEvaluationOutputComponentsES3_2),
-    Rule::Get<Spec::GLSL, 0, Shader::ALL, 0>(
-        &TableBase::m_gl_MaxTessEvaluationOutputComponentsES3_2),
     Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(EXT_tessellation_shader)>(
         &TableBase::m_gl_MaxTessEvaluationOutputComponents),
     Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(
         &TableBase::m_gl_MaxTessEvaluationTextureImageUnitsES3_2),
-    Rule::Get<Spec::GLSL, 0, Shader::ALL, 0>(
-        &TableBase::m_gl_MaxTessEvaluationTextureImageUnitsES3_2),
     Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(EXT_tessellation_shader)>(
         &TableBase::m_gl_MaxTessEvaluationTextureImageUnits),
     Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(
         &TableBase::m_gl_MaxTessEvaluationUniformComponentsES3_2),
-    Rule::Get<Spec::GLSL, 0, Shader::ALL, 0>(
-        &TableBase::m_gl_MaxTessEvaluationUniformComponentsES3_2),
     Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(EXT_tessellation_shader)>(
         &TableBase::m_gl_MaxTessEvaluationUniformComponents),
     Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(
         &TableBase::m_gl_MaxTessEvaluationImageUniformsES3_2),
-    Rule::Get<Spec::GLSL, 0, Shader::ALL, 0>(&TableBase::m_gl_MaxTessEvaluationImageUniformsES3_2),
     Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(EXT_tessellation_shader)>(
         &TableBase::m_gl_MaxTessEvaluationImageUniforms),
     Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(
         &TableBase::m_gl_MaxTessEvaluationAtomicCountersES3_2),
-    Rule::Get<Spec::GLSL, 0, Shader::ALL, 0>(&TableBase::m_gl_MaxTessEvaluationAtomicCountersES3_2),
     Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(EXT_tessellation_shader)>(
         &TableBase::m_gl_MaxTessEvaluationAtomicCounters),
     Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(
         &TableBase::m_gl_MaxTessEvaluationAtomicCounterBuffersES3_2),
-    Rule::Get<Spec::GLSL, 0, Shader::ALL, 0>(
-        &TableBase::m_gl_MaxTessEvaluationAtomicCounterBuffersES3_2),
     Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(EXT_tessellation_shader)>(
         &TableBase::m_gl_MaxTessEvaluationAtomicCounterBuffers),
     Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&TableBase::m_gl_MaxSamplesES3_2),
-    Rule::Get<Spec::GLSL, 0, Shader::ALL, 0>(&TableBase::m_gl_MaxSamplesES3_2),
     Rule::Get<Spec::ESSL, 300, Shader::ALL, EXT_INDEX(OES_sample_variables)>(
         &TableBase::m_gl_MaxSamples),
     Rule::Get<Spec::ESSL, 0, Shader::ALL, EXT_INDEX(APPLE_clip_distance)>(
@@ -21673,20 +20920,14 @@
         &TableBase::m_gl_MaxCullDistancesEXT),
     Rule::Get<Spec::ESSL, 300, Shader::ALL, EXT_INDEX(EXT_clip_cull_distance)>(
         &TableBase::m_gl_MaxCombinedClipAndCullDistancesEXT),
-    Rule::Get<Spec::ESSL, 0, Shader::FRAGMENT, 0>(&BuiltInVariable::kgl_FragCoord),
-    Rule::Get<Spec::GLSL, 0, Shader::FRAGMENT, 0>(&BuiltInVariable::kgl_FragCoord),
+    Rule::Get<Spec::ESSL, 100, Shader::FRAGMENT, 0>(&BuiltInVariable::kgl_FragCoord),
+    Rule::Get<Spec::ESSL, 300, Shader::FRAGMENT, 0>(&BuiltInVariable::kgl_FragCoord300),
     Rule::Get<Spec::ESSL, 0, Shader::FRAGMENT, 0>(&BuiltInVariable::kgl_FrontFacing),
-    Rule::Get<Spec::GLSL, 0, Shader::FRAGMENT, 0>(&BuiltInVariable::kgl_FrontFacing),
     Rule::Get<Spec::ESSL, 0, Shader::FRAGMENT, 0>(&BuiltInVariable::kgl_PointCoord),
-    Rule::Get<Spec::GLSL, 0, Shader::FRAGMENT, 0>(&BuiltInVariable::kgl_PointCoord),
     Rule::Get<Spec::ESSL, 100, Shader::FRAGMENT, 0>(&BuiltInVariable::kgl_FragColor),
-    Rule::Get<Spec::GLSL, 0, Shader::FRAGMENT, 0>(&BuiltInVariable::kgl_FragColor),
     Rule::Get<Spec::ESSL, 100, Shader::FRAGMENT, 0>(&TableBase::m_gl_FragData),
-    Rule::Get<Spec::GLSL, 0, Shader::FRAGMENT, 0>(&TableBase::m_gl_FragData),
     Rule::Get<Spec::ESSL, 300, Shader::FRAGMENT, 0>(&BuiltInVariable::kgl_FragDepth),
-    Rule::Get<Spec::GLSL, 0, Shader::FRAGMENT, 0>(&BuiltInVariable::kgl_FragDepth),
     Rule::Get<Spec::ESSL, 310, Shader::FRAGMENT, 0>(&BuiltInVariable::kgl_HelperInvocation),
-    Rule::Get<Spec::GLSL, 0, Shader::FRAGMENT, 0>(&BuiltInVariable::kgl_HelperInvocation),
     Rule::Get<Spec::ESSL, 100, Shader::FRAGMENT, EXT_INDEX(EXT_blend_func_extended)>(
         &BuiltInVariable::kgl_SecondaryFragColorEXT),
     Rule::Get<Spec::ESSL, 100, Shader::FRAGMENT, EXT_INDEX(EXT_blend_func_extended)>(
@@ -21707,17 +20948,11 @@
     Rule::Get<Spec::ESSL, 100, Shader::FRAGMENT, EXT_INDEX(ARM_shader_framebuffer_fetch)>(
         &BuiltInVariable::kgl_LastFragColorARM),
     Rule::Get<Spec::ESSL, 320, Shader::FRAGMENT, 0>(&BuiltInVariable::kgl_PrimitiveIDES3_2),
-    Rule::Get<Spec::GLSL, 0, Shader::FRAGMENT, 0>(&BuiltInVariable::kgl_PrimitiveIDES3_2),
     Rule::Get<Spec::ESSL, 320, Shader::GEOMETRY_EXT, 0>(&BuiltInVariable::kgl_PrimitiveIDGSES3_2),
-    Rule::Get<Spec::GLSL, 0, Shader::GEOMETRY_EXT, 0>(&BuiltInVariable::kgl_PrimitiveIDGSES3_2),
     Rule::Get<Spec::ESSL, 320, Shader::TESS_CONTROL_EXT, 0>(
         &BuiltInVariable::kgl_PrimitiveIDTCSES3_2),
-    Rule::Get<Spec::GLSL, 0, Shader::TESS_CONTROL_EXT, 0>(
-        &BuiltInVariable::kgl_PrimitiveIDTCSES3_2),
     Rule::Get<Spec::ESSL, 320, Shader::TESS_EVALUATION_EXT, 0>(
         &BuiltInVariable::kgl_PrimitiveIDTESES3_2),
-    Rule::Get<Spec::GLSL, 0, Shader::TESS_EVALUATION_EXT, 0>(
-        &BuiltInVariable::kgl_PrimitiveIDTESES3_2),
     Rule::Get<Spec::ESSL, 310, Shader::FRAGMENT, EXT_INDEX(EXT_geometry_shader)>(
         &BuiltInVariable::kgl_PrimitiveID),
     Rule::Get<Spec::ESSL, 310, Shader::FRAGMENT, EXT_INDEX(OES_geometry_shader)>(
@@ -21731,9 +20966,7 @@
     Rule::Get<Spec::ESSL, 310, Shader::TESS_EVALUATION_EXT, EXT_INDEX(EXT_tessellation_shader)>(
         &BuiltInVariable::kgl_PrimitiveIDTES),
     Rule::Get<Spec::ESSL, 320, Shader::FRAGMENT, 0>(&BuiltInVariable::kgl_LayerES3_2),
-    Rule::Get<Spec::GLSL, 0, Shader::FRAGMENT, 0>(&BuiltInVariable::kgl_LayerES3_2),
     Rule::Get<Spec::ESSL, 320, Shader::GEOMETRY_EXT, 0>(&BuiltInVariable::kgl_LayerGSES3_2),
-    Rule::Get<Spec::GLSL, 0, Shader::GEOMETRY_EXT, 0>(&BuiltInVariable::kgl_LayerGSES3_2),
     Rule::Get<Spec::ESSL, 310, Shader::FRAGMENT, EXT_INDEX(EXT_geometry_shader)>(
         &BuiltInVariable::kgl_Layer),
     Rule::Get<Spec::ESSL, 310, Shader::FRAGMENT, EXT_INDEX(OES_geometry_shader)>(
@@ -21743,19 +20976,15 @@
     Rule::Get<Spec::ESSL, 310, Shader::GEOMETRY_EXT, EXT_INDEX(OES_geometry_shader)>(
         &BuiltInVariable::kgl_LayerGS),
     Rule::Get<Spec::ESSL, 320, Shader::FRAGMENT, 0>(&BuiltInVariable::kgl_SampleIDES3_2),
-    Rule::Get<Spec::GLSL, 0, Shader::FRAGMENT, 0>(&BuiltInVariable::kgl_SampleIDES3_2),
     Rule::Get<Spec::ESSL, 300, Shader::FRAGMENT, EXT_INDEX(OES_sample_variables)>(
         &BuiltInVariable::kgl_SampleID),
     Rule::Get<Spec::ESSL, 320, Shader::FRAGMENT, 0>(&BuiltInVariable::kgl_SamplePositionES3_2),
-    Rule::Get<Spec::GLSL, 0, Shader::FRAGMENT, 0>(&BuiltInVariable::kgl_SamplePositionES3_2),
     Rule::Get<Spec::ESSL, 300, Shader::FRAGMENT, EXT_INDEX(OES_sample_variables)>(
         &BuiltInVariable::kgl_SamplePosition),
     Rule::Get<Spec::ESSL, 320, Shader::FRAGMENT, 0>(&TableBase::m_gl_SampleMaskInES3_2),
-    Rule::Get<Spec::GLSL, 0, Shader::FRAGMENT, 0>(&TableBase::m_gl_SampleMaskInES3_2),
     Rule::Get<Spec::ESSL, 300, Shader::FRAGMENT, EXT_INDEX(OES_sample_variables)>(
         &TableBase::m_gl_SampleMaskIn),
     Rule::Get<Spec::ESSL, 320, Shader::FRAGMENT, 0>(&TableBase::m_gl_SampleMaskES3_2),
-    Rule::Get<Spec::GLSL, 0, Shader::FRAGMENT, 0>(&TableBase::m_gl_SampleMaskES3_2),
     Rule::Get<Spec::ESSL, 300, Shader::FRAGMENT, EXT_INDEX(OES_sample_variables)>(
         &TableBase::m_gl_SampleMask),
     Rule::Get<Spec::ESSL, 300, Shader::FRAGMENT, EXT_INDEX(EXT_clip_cull_distance)>(
@@ -21767,13 +20996,9 @@
     Rule::Get<Spec::ESSL, 0, Shader::VERTEX, EXT_INDEX(APPLE_clip_distance)>(
         &TableBase::m_gl_ClipDistanceAPPLE),
     Rule::Get<Spec::ESSL, 0, Shader::VERTEX, 0>(&BuiltInVariable::kgl_Position),
-    Rule::Get<Spec::GLSL, 0, Shader::VERTEX, 0>(&BuiltInVariable::kgl_Position),
     Rule::Get<Spec::ESSL, 320, Shader::GEOMETRY_EXT, 0>(&TableBase::m_gl_PositionGSES3_2),
-    Rule::Get<Spec::GLSL, 0, Shader::GEOMETRY_EXT, 0>(&TableBase::m_gl_PositionGSES3_2),
     Rule::Get<Spec::ESSL, 320, Shader::TESS_CONTROL_EXT, 0>(&TableBase::m_gl_PositionTCSES3_2),
-    Rule::Get<Spec::GLSL, 0, Shader::TESS_CONTROL_EXT, 0>(&TableBase::m_gl_PositionTCSES3_2),
     Rule::Get<Spec::ESSL, 320, Shader::TESS_EVALUATION_EXT, 0>(&TableBase::m_gl_PositionTESES3_2),
-    Rule::Get<Spec::GLSL, 0, Shader::TESS_EVALUATION_EXT, 0>(&TableBase::m_gl_PositionTESES3_2),
     Rule::Get<Spec::ESSL, 310, Shader::GEOMETRY_EXT, EXT_INDEX(EXT_geometry_shader)>(
         &TableBase::m_gl_PositionGS),
     Rule::Get<Spec::ESSL, 310, Shader::GEOMETRY_EXT, EXT_INDEX(OES_geometry_shader)>(
@@ -21782,12 +21007,10 @@
         &TableBase::m_gl_PositionTCS),
     Rule::Get<Spec::ESSL, 310, Shader::TESS_EVALUATION_EXT, EXT_INDEX(EXT_tessellation_shader)>(
         &TableBase::m_gl_PositionTES),
-    Rule::Get<Spec::ESSL, 0, Shader::VERTEX, 0>(&BuiltInVariable::kgl_PointSize),
-    Rule::Get<Spec::GLSL, 0, Shader::VERTEX, 0>(&BuiltInVariable::kgl_PointSize),
+    Rule::Get<Spec::ESSL, 100, Shader::VERTEX, 0>(&BuiltInVariable::kgl_PointSize),
+    Rule::Get<Spec::ESSL, 300, Shader::VERTEX, 0>(&BuiltInVariable::kgl_PointSize300),
     Rule::Get<Spec::ESSL, 300, Shader::VERTEX, 0>(&BuiltInVariable::kgl_InstanceID),
-    Rule::Get<Spec::GLSL, 0, Shader::VERTEX, 0>(&BuiltInVariable::kgl_InstanceID),
     Rule::Get<Spec::ESSL, 300, Shader::VERTEX, 0>(&BuiltInVariable::kgl_VertexID),
-    Rule::Get<Spec::GLSL, 0, Shader::VERTEX, 0>(&BuiltInVariable::kgl_VertexID),
     Rule::Get<Spec::ESSL, 0, Shader::VERTEX, EXT_INDEX(ANGLE_multi_draw)>(
         &BuiltInVariable::kgl_DrawID),
     Rule::Get<Spec::ESSL, 300, Shader::VERTEX, EXT_INDEX(ANGLE_base_vertex_base_instance)>(
@@ -21799,29 +21022,19 @@
     Rule::Get<Spec::ESSL, 0, Shader::VERTEX, EXT_INDEX(ANGLE_base_vertex_base_instance)>(
         &BuiltInVariable::kangle_BaseInstance),
     Rule::Get<Spec::ESSL, 310, Shader::COMPUTE, 0>(&BuiltInVariable::kgl_NumWorkGroups),
-    Rule::Get<Spec::GLSL, 0, Shader::COMPUTE, 0>(&BuiltInVariable::kgl_NumWorkGroups),
     Rule::Get<Spec::ESSL, 310, Shader::COMPUTE, 0>(&BuiltInVariable::kgl_WorkGroupSize),
-    Rule::Get<Spec::GLSL, 0, Shader::COMPUTE, 0>(&BuiltInVariable::kgl_WorkGroupSize),
     Rule::Get<Spec::ESSL, 310, Shader::COMPUTE, 0>(&BuiltInVariable::kgl_WorkGroupID),
-    Rule::Get<Spec::GLSL, 0, Shader::COMPUTE, 0>(&BuiltInVariable::kgl_WorkGroupID),
     Rule::Get<Spec::ESSL, 310, Shader::COMPUTE, 0>(&BuiltInVariable::kgl_LocalInvocationID),
-    Rule::Get<Spec::GLSL, 0, Shader::COMPUTE, 0>(&BuiltInVariable::kgl_LocalInvocationID),
     Rule::Get<Spec::ESSL, 310, Shader::COMPUTE, 0>(&BuiltInVariable::kgl_GlobalInvocationID),
-    Rule::Get<Spec::GLSL, 0, Shader::COMPUTE, 0>(&BuiltInVariable::kgl_GlobalInvocationID),
     Rule::Get<Spec::ESSL, 310, Shader::COMPUTE, 0>(&BuiltInVariable::kgl_LocalInvocationIndex),
-    Rule::Get<Spec::GLSL, 0, Shader::COMPUTE, 0>(&BuiltInVariable::kgl_LocalInvocationIndex),
     Rule::Get<Spec::ESSL, 320, Shader::GEOMETRY_EXT, 0>(&BuiltInVariable::kgl_PrimitiveIDInES3_2),
-    Rule::Get<Spec::GLSL, 0, Shader::GEOMETRY_EXT, 0>(&BuiltInVariable::kgl_PrimitiveIDInES3_2),
     Rule::Get<Spec::ESSL, 310, Shader::GEOMETRY_EXT, EXT_INDEX(EXT_geometry_shader)>(
         &BuiltInVariable::kgl_PrimitiveIDIn),
     Rule::Get<Spec::ESSL, 310, Shader::GEOMETRY_EXT, EXT_INDEX(OES_geometry_shader)>(
         &BuiltInVariable::kgl_PrimitiveIDIn),
     Rule::Get<Spec::ESSL, 320, Shader::GEOMETRY_EXT, 0>(&BuiltInVariable::kgl_InvocationIDES3_2),
-    Rule::Get<Spec::GLSL, 0, Shader::GEOMETRY_EXT, 0>(&BuiltInVariable::kgl_InvocationIDES3_2),
     Rule::Get<Spec::ESSL, 320, Shader::TESS_CONTROL_EXT, 0>(
         &BuiltInVariable::kgl_InvocationIDTCSES3_2),
-    Rule::Get<Spec::GLSL, 0, Shader::TESS_CONTROL_EXT, 0>(
-        &BuiltInVariable::kgl_InvocationIDTCSES3_2),
     Rule::Get<Spec::ESSL, 310, Shader::GEOMETRY_EXT, EXT_INDEX(EXT_geometry_shader)>(
         &BuiltInVariable::kgl_InvocationID),
     Rule::Get<Spec::ESSL, 310, Shader::GEOMETRY_EXT, EXT_INDEX(OES_geometry_shader)>(
@@ -21829,11 +21042,8 @@
     Rule::Get<Spec::ESSL, 310, Shader::TESS_CONTROL_EXT, EXT_INDEX(EXT_tessellation_shader)>(
         &BuiltInVariable::kgl_InvocationIDTCS),
     Rule::Get<Spec::ESSL, 320, Shader::GEOMETRY_EXT, 0>(&TableBase::m_gl_PerVertexES3_2),
-    Rule::Get<Spec::GLSL, 0, Shader::GEOMETRY_EXT, 0>(&TableBase::m_gl_PerVertexES3_2),
     Rule::Get<Spec::ESSL, 320, Shader::TESS_CONTROL_EXT, 0>(&TableBase::m_gl_PerVertexTCSES3_2),
-    Rule::Get<Spec::GLSL, 0, Shader::TESS_CONTROL_EXT, 0>(&TableBase::m_gl_PerVertexTCSES3_2),
     Rule::Get<Spec::ESSL, 320, Shader::TESS_EVALUATION_EXT, 0>(&TableBase::m_gl_PerVertexTESES3_2),
-    Rule::Get<Spec::GLSL, 0, Shader::TESS_EVALUATION_EXT, 0>(&TableBase::m_gl_PerVertexTESES3_2),
     Rule::Get<Spec::ESSL, 310, Shader::GEOMETRY_EXT, EXT_INDEX(EXT_geometry_shader)>(
         &TableBase::m_gl_PerVertex),
     Rule::Get<Spec::ESSL, 310, Shader::GEOMETRY_EXT, EXT_INDEX(OES_geometry_shader)>(
@@ -21843,11 +21053,8 @@
     Rule::Get<Spec::ESSL, 310, Shader::TESS_EVALUATION_EXT, EXT_INDEX(EXT_tessellation_shader)>(
         &TableBase::m_gl_PerVertexTES),
     Rule::Get<Spec::ESSL, 320, Shader::GEOMETRY_EXT, 0>(&TableBase::m_gl_inES3_2),
-    Rule::Get<Spec::GLSL, 0, Shader::GEOMETRY_EXT, 0>(&TableBase::m_gl_inES3_2),
     Rule::Get<Spec::ESSL, 320, Shader::TESS_CONTROL_EXT, 0>(&TableBase::m_gl_inTCSES3_2),
-    Rule::Get<Spec::GLSL, 0, Shader::TESS_CONTROL_EXT, 0>(&TableBase::m_gl_inTCSES3_2),
     Rule::Get<Spec::ESSL, 320, Shader::TESS_EVALUATION_EXT, 0>(&TableBase::m_gl_inTESES3_2),
-    Rule::Get<Spec::GLSL, 0, Shader::TESS_EVALUATION_EXT, 0>(&TableBase::m_gl_inTESES3_2),
     Rule::Get<Spec::ESSL, 310, Shader::GEOMETRY_EXT, EXT_INDEX(EXT_geometry_shader)>(
         &TableBase::m_gl_in),
     Rule::Get<Spec::ESSL, 310, Shader::GEOMETRY_EXT, EXT_INDEX(OES_geometry_shader)>(
@@ -21858,48 +21065,39 @@
         &TableBase::m_gl_inTES),
     Rule::Get<Spec::ESSL, 320, Shader::TESS_CONTROL_EXT, 0>(
         &BuiltInVariable::kgl_PatchVerticesInTCSES3_2),
-    Rule::Get<Spec::GLSL, 0, Shader::TESS_CONTROL_EXT, 0>(
-        &BuiltInVariable::kgl_PatchVerticesInTCSES3_2),
     Rule::Get<Spec::ESSL, 320, Shader::TESS_EVALUATION_EXT, 0>(
         &BuiltInVariable::kgl_PatchVerticesInTESES3_2),
-    Rule::Get<Spec::GLSL, 0, Shader::TESS_EVALUATION_EXT, 0>(
-        &BuiltInVariable::kgl_PatchVerticesInTESES3_2),
     Rule::Get<Spec::ESSL, 310, Shader::TESS_CONTROL_EXT, EXT_INDEX(EXT_tessellation_shader)>(
         &BuiltInVariable::kgl_PatchVerticesInTCS),
     Rule::Get<Spec::ESSL, 310, Shader::TESS_EVALUATION_EXT, EXT_INDEX(EXT_tessellation_shader)>(
         &BuiltInVariable::kgl_PatchVerticesInTES),
     Rule::Get<Spec::ESSL, 320, Shader::TESS_CONTROL_EXT, 0>(
         &TableBase::m_gl_TessLevelOuterTCSES3_2),
-    Rule::Get<Spec::GLSL, 0, Shader::TESS_CONTROL_EXT, 0>(&TableBase::m_gl_TessLevelOuterTCSES3_2),
     Rule::Get<Spec::ESSL, 320, Shader::TESS_EVALUATION_EXT, 0>(
         &TableBase::m_gl_TessLevelOuterTESES3_2),
-    Rule::Get<Spec::GLSL, 0, Shader::TESS_EVALUATION_EXT, 0>(
-        &TableBase::m_gl_TessLevelOuterTESES3_2),
     Rule::Get<Spec::ESSL, 310, Shader::TESS_CONTROL_EXT, EXT_INDEX(EXT_tessellation_shader)>(
         &TableBase::m_gl_TessLevelOuterTCS),
     Rule::Get<Spec::ESSL, 310, Shader::TESS_EVALUATION_EXT, EXT_INDEX(EXT_tessellation_shader)>(
         &TableBase::m_gl_TessLevelOuterTES),
     Rule::Get<Spec::ESSL, 320, Shader::TESS_CONTROL_EXT, 0>(
         &TableBase::m_gl_TessLevelInnerTCSES3_2),
-    Rule::Get<Spec::GLSL, 0, Shader::TESS_CONTROL_EXT, 0>(&TableBase::m_gl_TessLevelInnerTCSES3_2),
     Rule::Get<Spec::ESSL, 320, Shader::TESS_EVALUATION_EXT, 0>(
         &TableBase::m_gl_TessLevelInnerTESES3_2),
-    Rule::Get<Spec::GLSL, 0, Shader::TESS_EVALUATION_EXT, 0>(
-        &TableBase::m_gl_TessLevelInnerTESES3_2),
     Rule::Get<Spec::ESSL, 310, Shader::TESS_CONTROL_EXT, EXT_INDEX(EXT_tessellation_shader)>(
         &TableBase::m_gl_TessLevelInnerTCS),
     Rule::Get<Spec::ESSL, 310, Shader::TESS_EVALUATION_EXT, EXT_INDEX(EXT_tessellation_shader)>(
         &TableBase::m_gl_TessLevelInnerTES),
     Rule::Get<Spec::ESSL, 320, Shader::TESS_CONTROL_EXT, 0>(&TableBase::m_gl_outTCSES3_2),
-    Rule::Get<Spec::GLSL, 0, Shader::TESS_CONTROL_EXT, 0>(&TableBase::m_gl_outTCSES3_2),
     Rule::Get<Spec::ESSL, 320, Shader::TESS_EVALUATION_EXT, 0>(&TableBase::m_gl_outTESES3_2),
-    Rule::Get<Spec::GLSL, 0, Shader::TESS_EVALUATION_EXT, 0>(&TableBase::m_gl_outTESES3_2),
     Rule::Get<Spec::ESSL, 310, Shader::TESS_CONTROL_EXT, EXT_INDEX(EXT_tessellation_shader)>(
         &TableBase::m_gl_outTCS),
     Rule::Get<Spec::ESSL, 310, Shader::TESS_EVALUATION_EXT, EXT_INDEX(EXT_tessellation_shader)>(
         &TableBase::m_gl_outTES),
+    Rule::Get<Spec::ESSL, 320, Shader::TESS_CONTROL_EXT, 0>(
+        &TableBase::m_gl_BoundingBoxEXTTCSES3_2),
+    Rule::Get<Spec::ESSL, 310, Shader::TESS_CONTROL_EXT, EXT_INDEX(EXT_tessellation_shader)>(
+        &TableBase::m_gl_BoundingBoxEXTTCS),
     Rule::Get<Spec::ESSL, 310, Shader::TESS_EVALUATION_EXT, 0>(&BuiltInVariable::kgl_TessCoord),
-    Rule::Get<Spec::GLSL, 0, Shader::TESS_EVALUATION_EXT, 0>(&BuiltInVariable::kgl_TessCoord),
     Rule::Get<Spec::ESSL, 300, Shader::NOT_COMPUTE, EXT_INDEX(OVR_multiview)>(
         &BuiltInVariable::kgl_ViewID_OVR)};
 
@@ -23413,6 +22611,12 @@
                                          "groupMemoryBarrier(",
                                          "EmitVertex(",
                                          "EndPrimitive(",
+                                         "subpassLoad(01g",
+                                         "subpassLoad(01h",
+                                         "subpassLoad(01i",
+                                         "subpassLoad(01j00D",
+                                         "subpassLoad(01k00D",
+                                         "subpassLoad(01l00D",
                                          "gl_DepthRangeParameters",
                                          "gl_DepthRange",
                                          "gl_NumSamples",
@@ -23527,1636 +22731,1644 @@
                                          "gl_TessLevelOuter",
                                          "gl_TessLevelInner",
                                          "gl_out",
+                                         "gl_BoundingBoxEXT",
                                          "gl_TessCoord",
                                          "gl_ViewID_OVR"};
 
 // Flat array of offsets from a symbol into the rules table.
 constexpr uint16_t kMangledOffsets[] = {
     0,     // radians_00B
-    2,     // radians_10B
-    4,     // radians_20B
-    6,     // radians_30B
-    8,     // degrees_00B
-    10,    // degrees_10B
-    12,    // degrees_20B
-    14,    // degrees_30B
-    16,    // sin_00B
-    18,    // sin_10B
-    20,    // sin_20B
-    22,    // sin_30B
-    24,    // cos_00B
-    26,    // cos_10B
-    28,    // cos_20B
-    30,    // cos_30B
-    32,    // tan_00B
-    34,    // tan_10B
-    36,    // tan_20B
-    38,    // tan_30B
-    40,    // asin_00B
-    42,    // asin_10B
-    44,    // asin_20B
-    46,    // asin_30B
-    48,    // acos_00B
-    50,    // acos_10B
-    52,    // acos_20B
-    54,    // acos_30B
-    56,    // atan_00B00B
-    58,    // atan_10B10B
-    60,    // atan_20B20B
-    62,    // atan_30B30B
-    64,    // atan_00B
-    66,    // atan_10B
-    68,    // atan_20B
-    70,    // atan_30B
-    72,    // sinh_00B
-    74,    // sinh_10B
-    76,    // sinh_20B
-    78,    // sinh_30B
-    80,    // cosh_00B
-    82,    // cosh_10B
-    84,    // cosh_20B
-    86,    // cosh_30B
-    88,    // tanh_00B
-    90,    // tanh_10B
-    92,    // tanh_20B
-    94,    // tanh_30B
-    96,    // asinh_00B
-    98,    // asinh_10B
-    100,   // asinh_20B
-    102,   // asinh_30B
-    104,   // acosh_00B
-    106,   // acosh_10B
-    108,   // acosh_20B
-    110,   // acosh_30B
-    112,   // atanh_00B
-    114,   // atanh_10B
-    116,   // atanh_20B
-    118,   // atanh_30B
-    120,   // pow_00B00B
-    122,   // pow_10B10B
-    124,   // pow_20B20B
-    126,   // pow_30B30B
-    128,   // exp_00B
-    130,   // exp_10B
-    132,   // exp_20B
-    134,   // exp_30B
-    136,   // log_00B
-    138,   // log_10B
-    140,   // log_20B
-    142,   // log_30B
-    144,   // exp2_00B
-    146,   // exp2_10B
-    148,   // exp2_20B
-    150,   // exp2_30B
-    152,   // log2_00B
-    154,   // log2_10B
-    156,   // log2_20B
-    158,   // log2_30B
-    160,   // sqrt_00B
-    162,   // sqrt_10B
-    164,   // sqrt_20B
-    166,   // sqrt_30B
-    168,   // inversesqrt_00B
-    170,   // inversesqrt_10B
-    172,   // inversesqrt_20B
-    174,   // inversesqrt_30B
-    176,   // abs_00B
-    178,   // abs_10B
-    180,   // abs_20B
-    182,   // abs_30B
-    184,   // abs_00D
-    186,   // abs_10D
-    188,   // abs_20D
-    190,   // abs_30D
-    192,   // sign_00B
-    194,   // sign_10B
-    196,   // sign_20B
-    198,   // sign_30B
-    200,   // sign_00D
-    202,   // sign_10D
-    204,   // sign_20D
-    206,   // sign_30D
-    208,   // floor_00B
-    210,   // floor_10B
-    212,   // floor_20B
-    214,   // floor_30B
-    216,   // trunc_00B
-    218,   // trunc_10B
-    220,   // trunc_20B
-    222,   // trunc_30B
-    224,   // round_00B
-    226,   // round_10B
-    228,   // round_20B
-    230,   // round_30B
-    232,   // roundEven_00B
-    234,   // roundEven_10B
-    236,   // roundEven_20B
-    238,   // roundEven_30B
-    240,   // ceil_00B
-    242,   // ceil_10B
-    244,   // ceil_20B
-    246,   // ceil_30B
-    248,   // fract_00B
-    250,   // fract_10B
-    252,   // fract_20B
-    254,   // fract_30B
-    256,   // mod_00B00B
-    258,   // mod_10B00B
-    260,   // mod_20B00B
-    262,   // mod_30B00B
-    264,   // mod_10B10B
-    266,   // mod_20B20B
-    268,   // mod_30B30B
-    270,   // min_00B00B
-    272,   // min_10B00B
-    274,   // min_20B00B
-    276,   // min_30B00B
-    278,   // min_10B10B
-    280,   // min_20B20B
-    282,   // min_30B30B
-    284,   // min_00D00D
-    286,   // min_10D10D
-    288,   // min_20D20D
-    290,   // min_30D30D
-    292,   // min_10D00D
-    294,   // min_20D00D
-    296,   // min_30D00D
-    298,   // min_00E00E
-    300,   // min_10E10E
-    302,   // min_20E20E
-    304,   // min_30E30E
-    306,   // min_10E00E
-    308,   // min_20E00E
-    310,   // min_30E00E
-    312,   // max_00B00B
-    314,   // max_10B00B
-    316,   // max_20B00B
-    318,   // max_30B00B
-    320,   // max_10B10B
-    322,   // max_20B20B
-    324,   // max_30B30B
-    326,   // max_00D00D
-    328,   // max_10D10D
-    330,   // max_20D20D
-    332,   // max_30D30D
-    334,   // max_10D00D
-    336,   // max_20D00D
-    338,   // max_30D00D
-    340,   // max_00E00E
-    342,   // max_10E10E
-    344,   // max_20E20E
-    346,   // max_30E30E
-    348,   // max_10E00E
-    350,   // max_20E00E
-    352,   // max_30E00E
-    354,   // clamp_00B00B00B
-    356,   // clamp_10B00B00B
-    358,   // clamp_20B00B00B
-    360,   // clamp_30B00B00B
-    362,   // clamp_10B10B10B
-    364,   // clamp_20B20B20B
-    366,   // clamp_30B30B30B
-    368,   // clamp_00D00D00D
-    370,   // clamp_10D00D00D
-    372,   // clamp_20D00D00D
-    374,   // clamp_30D00D00D
-    376,   // clamp_10D10D10D
-    378,   // clamp_20D20D20D
-    380,   // clamp_30D30D30D
-    382,   // clamp_00E00E00E
-    384,   // clamp_10E00E00E
-    386,   // clamp_20E00E00E
-    388,   // clamp_30E00E00E
-    390,   // clamp_10E10E10E
-    392,   // clamp_20E20E20E
-    394,   // clamp_30E30E30E
-    396,   // mix_00B00B00B
-    398,   // mix_10B10B00B
-    400,   // mix_20B20B00B
-    402,   // mix_30B30B00B
-    404,   // mix_10B10B10B
-    406,   // mix_20B20B20B
-    408,   // mix_30B30B30B
-    410,   // mix_00B00B00F
-    412,   // mix_10B10B10F
-    414,   // mix_20B20B20F
-    416,   // mix_30B30B30F
-    418,   // mix_00D00D00F
-    420,   // mix_10D10D10F
-    422,   // mix_20D20D20F
-    424,   // mix_30D30D30F
-    426,   // mix_00E00E00F
-    428,   // mix_10E10E10F
-    430,   // mix_20E20E20F
-    432,   // mix_30E30E30F
-    434,   // mix_00F00F00F
-    436,   // mix_10F10F10F
-    438,   // mix_20F20F20F
-    440,   // mix_30F30F30F
-    442,   // step_00B00B
-    444,   // step_10B10B
-    446,   // step_20B20B
-    448,   // step_30B30B
-    450,   // step_00B10B
-    452,   // step_00B20B
-    454,   // step_00B30B
-    456,   // smoothstep_00B00B00B
-    458,   // smoothstep_10B10B10B
-    460,   // smoothstep_20B20B20B
-    462,   // smoothstep_30B30B30B
-    464,   // smoothstep_00B00B10B
-    466,   // smoothstep_00B00B20B
-    468,   // smoothstep_00B00B30B
-    470,   // modf_00B00B
-    472,   // modf_10B10B
-    474,   // modf_20B20B
-    476,   // modf_30B30B
-    478,   // isnan_00B
-    480,   // isnan_10B
-    482,   // isnan_20B
-    484,   // isnan_30B
-    486,   // isinf_00B
-    488,   // isinf_10B
-    490,   // isinf_20B
-    492,   // isinf_30B
-    494,   // floatBitsToInt_00B
-    496,   // floatBitsToInt_10B
-    498,   // floatBitsToInt_20B
-    500,   // floatBitsToInt_30B
-    502,   // floatBitsToUint_00B
-    504,   // floatBitsToUint_10B
-    506,   // floatBitsToUint_20B
-    508,   // floatBitsToUint_30B
-    510,   // intBitsToFloat_00D
-    512,   // intBitsToFloat_10D
-    514,   // intBitsToFloat_20D
-    516,   // intBitsToFloat_30D
-    518,   // uintBitsToFloat_00E
-    520,   // uintBitsToFloat_10E
-    522,   // uintBitsToFloat_20E
-    524,   // uintBitsToFloat_30E
-    526,   // fma_00B00B00B
-    529,   // fma_10B10B10B
-    532,   // fma_20B20B20B
-    535,   // fma_30B30B30B
-    538,   // frexp_00B00D
-    540,   // frexp_10B10D
-    542,   // frexp_20B20D
-    544,   // frexp_30B30D
-    546,   // ldexp_00B00D
-    548,   // ldexp_10B10D
-    550,   // ldexp_20B20D
-    552,   // ldexp_30B30D
-    554,   // packSnorm2x16_10B
-    556,   // packHalf2x16_10B
-    558,   // unpackSnorm2x16_00E
-    560,   // unpackHalf2x16_00E
-    562,   // packUnorm2x16_10B
-    564,   // unpackUnorm2x16_00E
-    566,   // packUnorm4x8_30B
-    568,   // packSnorm4x8_30B
-    570,   // unpackUnorm4x8_00E
-    572,   // unpackSnorm4x8_00E
-    574,   // length_00B
-    576,   // length_10B
-    578,   // length_20B
-    580,   // length_30B
-    582,   // distance_00B00B
-    584,   // distance_10B10B
-    586,   // distance_20B20B
-    588,   // distance_30B30B
-    590,   // dot_00B00B
-    592,   // dot_10B10B
-    594,   // dot_20B20B
-    596,   // dot_30B30B
-    598,   // cross_20B20B
-    600,   // normalize_00B
-    602,   // normalize_10B
-    604,   // normalize_20B
-    606,   // normalize_30B
-    608,   // faceforward_00B00B00B
-    610,   // faceforward_10B10B10B
-    612,   // faceforward_20B20B20B
-    614,   // faceforward_30B30B30B
-    616,   // reflect_00B00B
-    618,   // reflect_10B10B
-    620,   // reflect_20B20B
-    622,   // reflect_30B30B
-    624,   // refract_00B00B00B
-    626,   // refract_10B10B00B
-    628,   // refract_20B20B00B
-    630,   // refract_30B30B00B
-    632,   // matrixCompMult_50B50B
-    634,   // matrixCompMult_A0BA0B
-    636,   // matrixCompMult_F0BF0B
-    638,   // matrixCompMult_90B90B
-    639,   // matrixCompMult_60B60B
-    640,   // matrixCompMult_D0BD0B
-    641,   // matrixCompMult_70B70B
-    642,   // matrixCompMult_E0BE0B
-    643,   // matrixCompMult_B0BB0B
-    644,   // outerProduct_10B10B
-    646,   // outerProduct_20B20B
-    648,   // outerProduct_30B30B
-    650,   // outerProduct_20B10B
-    652,   // outerProduct_10B20B
-    654,   // outerProduct_30B10B
-    656,   // outerProduct_10B30B
-    658,   // outerProduct_30B20B
-    660,   // outerProduct_20B30B
-    662,   // transpose_50B
-    664,   // transpose_A0B
-    666,   // transpose_F0B
-    668,   // transpose_60B
-    670,   // transpose_90B
-    672,   // transpose_70B
-    674,   // transpose_D0B
-    676,   // transpose_B0B
-    678,   // transpose_E0B
-    680,   // determinant_50B
-    681,   // determinant_A0B
-    682,   // determinant_F0B
-    683,   // inverse_50B
-    685,   // inverse_A0B
-    687,   // inverse_F0B
-    689,   // lessThan_10B10B
-    691,   // lessThan_20B20B
-    693,   // lessThan_30B30B
-    695,   // lessThan_10D10D
-    697,   // lessThan_20D20D
-    699,   // lessThan_30D30D
-    701,   // lessThan_10E10E
-    703,   // lessThan_20E20E
-    705,   // lessThan_30E30E
-    707,   // lessThanEqual_10B10B
-    709,   // lessThanEqual_20B20B
-    711,   // lessThanEqual_30B30B
-    713,   // lessThanEqual_10D10D
-    715,   // lessThanEqual_20D20D
-    717,   // lessThanEqual_30D30D
-    719,   // lessThanEqual_10E10E
-    721,   // lessThanEqual_20E20E
-    723,   // lessThanEqual_30E30E
-    725,   // greaterThan_10B10B
-    727,   // greaterThan_20B20B
-    729,   // greaterThan_30B30B
-    731,   // greaterThan_10D10D
-    733,   // greaterThan_20D20D
-    735,   // greaterThan_30D30D
-    737,   // greaterThan_10E10E
-    739,   // greaterThan_20E20E
-    741,   // greaterThan_30E30E
-    743,   // greaterThanEqual_10B10B
-    745,   // greaterThanEqual_20B20B
-    747,   // greaterThanEqual_30B30B
-    749,   // greaterThanEqual_10D10D
-    751,   // greaterThanEqual_20D20D
-    753,   // greaterThanEqual_30D30D
-    755,   // greaterThanEqual_10E10E
-    757,   // greaterThanEqual_20E20E
-    759,   // greaterThanEqual_30E30E
-    761,   // equal_10B10B
-    763,   // equal_20B20B
-    765,   // equal_30B30B
-    767,   // equal_10D10D
-    769,   // equal_20D20D
-    771,   // equal_30D30D
-    773,   // equal_10E10E
-    775,   // equal_20E20E
-    777,   // equal_30E30E
-    779,   // equal_10F10F
-    781,   // equal_20F20F
-    783,   // equal_30F30F
-    785,   // notEqual_10B10B
-    787,   // notEqual_20B20B
-    789,   // notEqual_30B30B
-    791,   // notEqual_10D10D
-    793,   // notEqual_20D20D
-    795,   // notEqual_30D30D
-    797,   // notEqual_10E10E
-    799,   // notEqual_20E20E
-    801,   // notEqual_30E30E
-    803,   // notEqual_10F10F
-    805,   // notEqual_20F20F
-    807,   // notEqual_30F30F
-    809,   // any_10F
-    811,   // any_20F
-    813,   // any_30F
-    815,   // all_10F
-    817,   // all_20F
-    819,   // all_30F
-    821,   // not_10F
-    823,   // not_20F
-    825,   // not_30F
-    827,   // bitfieldExtract_00D00D00D
-    829,   // bitfieldExtract_10D00D00D
-    831,   // bitfieldExtract_20D00D00D
-    833,   // bitfieldExtract_30D00D00D
-    835,   // bitfieldExtract_00E00D00D
-    837,   // bitfieldExtract_10E00D00D
-    839,   // bitfieldExtract_20E00D00D
-    841,   // bitfieldExtract_30E00D00D
-    843,   // bitfieldInsert_00D00D00D00D
-    845,   // bitfieldInsert_10D10D00D00D
-    847,   // bitfieldInsert_20D20D00D00D
-    849,   // bitfieldInsert_30D30D00D00D
-    851,   // bitfieldInsert_00E00E00D00D
-    853,   // bitfieldInsert_10E10E00D00D
-    855,   // bitfieldInsert_20E20E00D00D
-    857,   // bitfieldInsert_30E30E00D00D
-    859,   // bitfieldReverse_00D
-    861,   // bitfieldReverse_10D
-    863,   // bitfieldReverse_20D
-    865,   // bitfieldReverse_30D
-    867,   // bitfieldReverse_00E
-    869,   // bitfieldReverse_10E
-    871,   // bitfieldReverse_20E
-    873,   // bitfieldReverse_30E
-    875,   // bitCount_00D
-    877,   // bitCount_10D
-    879,   // bitCount_20D
-    881,   // bitCount_30D
-    883,   // bitCount_00E
-    885,   // bitCount_10E
-    887,   // bitCount_20E
-    889,   // bitCount_30E
-    891,   // findLSB_00D
-    893,   // findLSB_10D
-    895,   // findLSB_20D
-    897,   // findLSB_30D
-    899,   // findLSB_00E
-    901,   // findLSB_10E
-    903,   // findLSB_20E
-    905,   // findLSB_30E
-    907,   // findMSB_00D
-    909,   // findMSB_10D
-    911,   // findMSB_20D
-    913,   // findMSB_30D
-    915,   // findMSB_00E
-    917,   // findMSB_10E
-    919,   // findMSB_20E
-    921,   // findMSB_30E
-    923,   // uaddCarry_00E00E00E
-    925,   // uaddCarry_10E10E10E
-    927,   // uaddCarry_20E20E20E
-    929,   // uaddCarry_30E30E30E
-    931,   // usubBorrow_00E00E00E
-    933,   // usubBorrow_10E10E10E
-    935,   // usubBorrow_20E20E20E
-    937,   // usubBorrow_30E30E30E
-    939,   // umulExtended_00E00E00E00E
-    941,   // umulExtended_10E10E10E10E
-    943,   // umulExtended_20E20E20E20E
-    945,   // umulExtended_30E30E30E30E
-    947,   // imulExtended_00D00D00D00D
-    949,   // imulExtended_10D10D10D10D
-    951,   // imulExtended_20D20D20D20D
-    953,   // imulExtended_30D30D30D30D
-    955,   // texture2D_00I10B
-    957,   // texture2DProj_00I20B
-    959,   // texture2DProj_00I30B
-    961,   // textureCube_00K20B
-    963,   // texture3D_00J20B
-    964,   // texture3DProj_00J30B
-    965,   // shadow2DEXT_00d20B
-    966,   // shadow2DProjEXT_00d30B
-    967,   // texture2D_00M10B
-    969,   // texture2DProj_00M20B
-    971,   // texture2DProj_00M30B
-    973,   // texture2DRect_00O10B
-    974,   // texture2DRectProj_00O20B
-    975,   // texture2DRectProj_00O30B
-    976,   // texture2DGradEXT_00I10B10B10B
-    977,   // texture2DProjGradEXT_00I20B10B10B
-    978,   // texture2DProjGradEXT_00I30B10B10B
-    979,   // textureCubeGradEXT_00K20B20B20B
-    980,   // textureVideoWEBGL_00y10B
-    982,   // texture2D_00I10B00B
-    984,   // texture2DProj_00I20B00B
-    986,   // texture2DProj_00I30B00B
-    988,   // textureCube_00K20B00B
-    990,   // texture3D_00J20B00B
-    991,   // texture3DProj_00J30B00B
-    992,   // texture3DLod_00J20B00B
-    993,   // texture3DProjLod_00J30B00B
-    994,   // texture2DLod_00I10B00B
-    995,   // texture2DProjLod_00I20B00B
-    996,   // texture2DProjLod_00I30B00B
-    997,   // textureCubeLod_00K20B00B
-    998,   // texture2DLodEXT_00I10B00B
-    999,   // texture2DProjLodEXT_00I20B00B
-    1000,  // texture2DProjLodEXT_00I30B00B
-    1001,  // textureCubeLodEXT_00K20B00B
-    1002,  // texture_00I10B
-    1004,  // texture_00R10B
-    1006,  // texture_00X10B
-    1008,  // texture_00J20B
-    1010,  // texture_00S20B
-    1012,  // texture_00Y20B
-    1014,  // texture_00K20B
-    1016,  // texture_00T20B
-    1018,  // texture_00Z20B
-    1020,  // texture_00L20B
-    1022,  // texture_00U20B
-    1024,  // texture_00a20B
-    1026,  // texture_00d20B
-    1028,  // texture_00e30B
-    1030,  // texture_00f30B
-    1032,  // texture_00k30B
-    1036,  // texture_00s30B
-    1040,  // texture_00x30B
-    1044,  // texture_00l30B00B
-    1048,  // texture_00M10B
-    1049,  // texture_00N10B
-    1050,  // texture_00O10B
-    1051,  // texture_00y10B
-    1053,  // textureProj_00I20B
-    1055,  // textureProj_00R20B
-    1057,  // textureProj_00X20B
-    1059,  // textureProj_00I30B
-    1061,  // textureProj_00R30B
-    1063,  // textureProj_00X30B
-    1065,  // textureProj_00J30B
-    1067,  // textureProj_00S30B
-    1069,  // textureProj_00Y30B
-    1071,  // textureProj_00d30B
-    1073,  // textureProj_00M20B
-    1074,  // textureProj_00M30B
-    1075,  // textureProj_00N20B
-    1076,  // textureProj_00N30B
-    1077,  // textureProj_00O20B
-    1078,  // textureProj_00O30B
-    1079,  // textureLod_00I10B00B
-    1081,  // textureLod_00R10B00B
-    1083,  // textureLod_00X10B00B
-    1085,  // textureLod_00J20B00B
-    1087,  // textureLod_00S20B00B
-    1089,  // textureLod_00Y20B00B
-    1091,  // textureLod_00K20B00B
-    1093,  // textureLod_00T20B00B
-    1095,  // textureLod_00Z20B00B
-    1097,  // textureLod_00L20B00B
-    1099,  // textureLod_00U20B00B
-    1101,  // textureLod_00a20B00B
-    1103,  // textureLod_00d20B00B
-    1105,  // textureLod_00k30B00B
-    1109,  // textureLod_00s30B00B
-    1113,  // textureLod_00x30B00B
-    1117,  // textureSize_00I00D
-    1119,  // textureSize_00R00D
-    1121,  // textureSize_00X00D
-    1123,  // textureSize_00J00D
-    1125,  // textureSize_00S00D
-    1127,  // textureSize_00Y00D
-    1129,  // textureSize_00K00D
-    1131,  // textureSize_00T00D
-    1133,  // textureSize_00Z00D
-    1135,  // textureSize_00L00D
-    1137,  // textureSize_00U00D
-    1139,  // textureSize_00a00D
-    1141,  // textureSize_00d00D
-    1143,  // textureSize_00e00D
-    1145,  // textureSize_00f00D
-    1147,  // textureSize_00k00D
-    1151,  // textureSize_00s00D
-    1155,  // textureSize_00x00D
-    1159,  // textureSize_00l00D
-    1163,  // textureSize_00j
-    1167,  // textureSize_00r
-    1171,  // textureSize_00w
-    1175,  // textureSize_00P
-    1178,  // textureSize_00V
-    1181,  // textureSize_00b
-    1184,  // textureSize_00Q
-    1185,  // textureSize_00W
-    1186,  // textureSize_00c
-    1187,  // textureSize_00M00D
-    1188,  // textureSize_00N00D
-    1189,  // textureProjLod_00I20B00B
-    1191,  // textureProjLod_00R20B00B
-    1193,  // textureProjLod_00X20B00B
-    1195,  // textureProjLod_00I30B00B
-    1197,  // textureProjLod_00R30B00B
-    1199,  // textureProjLod_00X30B00B
-    1201,  // textureProjLod_00J30B00B
-    1203,  // textureProjLod_00S30B00B
-    1205,  // textureProjLod_00Y30B00B
-    1207,  // textureProjLod_00d30B00B
-    1209,  // texelFetch_00I10D00D
-    1211,  // texelFetch_00R10D00D
-    1213,  // texelFetch_00X10D00D
-    1215,  // texelFetch_00J20D00D
-    1217,  // texelFetch_00S20D00D
-    1219,  // texelFetch_00Y20D00D
-    1221,  // texelFetch_00L20D00D
-    1223,  // texelFetch_00U20D00D
-    1225,  // texelFetch_00a20D00D
-    1227,  // texelFetch_00j00D
-    1231,  // texelFetch_00r00D
-    1235,  // texelFetch_00w00D
-    1239,  // texelFetch_00P10D00D
-    1242,  // texelFetch_00V10D00D
-    1245,  // texelFetch_00b10D00D
-    1248,  // texelFetch_00Q20D00D
-    1249,  // texelFetch_00W20D00D
-    1250,  // texelFetch_00c20D00D
-    1251,  // texelFetch_00M10D00D
-    1252,  // texelFetch_00N10D00D
-    1253,  // textureGrad_00I10B10B10B
-    1255,  // textureGrad_00R10B10B10B
-    1257,  // textureGrad_00X10B10B10B
-    1259,  // textureGrad_00J20B20B20B
-    1261,  // textureGrad_00S20B20B20B
-    1263,  // textureGrad_00Y20B20B20B
-    1265,  // textureGrad_00K20B20B20B
-    1267,  // textureGrad_00T20B20B20B
-    1269,  // textureGrad_00Z20B20B20B
-    1271,  // textureGrad_00d20B10B10B
-    1273,  // textureGrad_00e30B20B20B
-    1275,  // textureGrad_00L20B10B10B
-    1277,  // textureGrad_00U20B10B10B
-    1279,  // textureGrad_00a20B10B10B
-    1281,  // textureGrad_00f30B10B10B
-    1283,  // textureGrad_00k30B20B20B
-    1287,  // textureGrad_00s30B20B20B
-    1291,  // textureGrad_00x30B20B20B
-    1295,  // textureProjGrad_00I20B10B10B
-    1297,  // textureProjGrad_00R20B10B10B
-    1299,  // textureProjGrad_00X20B10B10B
-    1301,  // textureProjGrad_00I30B10B10B
-    1303,  // textureProjGrad_00R30B10B10B
-    1305,  // textureProjGrad_00X30B10B10B
-    1307,  // textureProjGrad_00J30B20B20B
-    1309,  // textureProjGrad_00S30B20B20B
-    1311,  // textureProjGrad_00Y30B20B20B
-    1313,  // textureProjGrad_00d30B10B10B
-    1315,  // texture_00I10B00B
-    1317,  // texture_00R10B00B
-    1319,  // texture_00X10B00B
-    1321,  // texture_00J20B00B
-    1323,  // texture_00S20B00B
-    1325,  // texture_00Y20B00B
-    1327,  // texture_00K20B00B
-    1329,  // texture_00T20B00B
-    1331,  // texture_00Z20B00B
-    1333,  // texture_00L20B00B
-    1335,  // texture_00U20B00B
-    1337,  // texture_00a20B00B
-    1339,  // textureProj_00I20B00B
-    1341,  // textureProj_00R20B00B
-    1343,  // textureProj_00X20B00B
-    1345,  // textureProj_00I30B00B
-    1347,  // textureProj_00R30B00B
-    1349,  // textureProj_00X30B00B
-    1351,  // textureProj_00J30B00B
-    1353,  // textureProj_00S30B00B
-    1355,  // textureProj_00Y30B00B
-    1357,  // texture_00d20B00B
-    1359,  // texture_00e30B00B
-    1361,  // textureProj_00d30B00B
-    1363,  // texture_00k30B00B
-    1367,  // texture_00s30B00B
-    1371,  // texture_00x30B00B
-    1375,  // texture_00M10B00B
-    1376,  // textureProj_00M20B00B
-    1377,  // textureProj_00M30B00B
-    1378,  // texture_00N10B00B
-    1379,  // textureProj_00N20B00B
-    1380,  // textureProj_00N30B00B
-    1381,  // textureOffset_00I10B10D
-    1383,  // textureOffset_00R10B10D
-    1385,  // textureOffset_00X10B10D
-    1387,  // textureOffset_00J20B20D
-    1389,  // textureOffset_00S20B20D
-    1391,  // textureOffset_00Y20B20D
-    1393,  // textureOffset_00d20B10D
-    1395,  // textureOffset_00L20B10D
-    1397,  // textureOffset_00U20B10D
-    1399,  // textureOffset_00a20B10D
-    1401,  // textureProjOffset_00I20B10D
-    1403,  // textureProjOffset_00R20B10D
-    1405,  // textureProjOffset_00X20B10D
-    1407,  // textureProjOffset_00I30B10D
-    1409,  // textureProjOffset_00R30B10D
-    1411,  // textureProjOffset_00X30B10D
-    1413,  // textureProjOffset_00J30B20D
-    1415,  // textureProjOffset_00S30B20D
-    1417,  // textureProjOffset_00Y30B20D
-    1419,  // textureProjOffset_00d30B10D
-    1421,  // textureLodOffset_00I10B00B10D
-    1423,  // textureLodOffset_00R10B00B10D
-    1425,  // textureLodOffset_00X10B00B10D
-    1427,  // textureLodOffset_00J20B00B20D
-    1429,  // textureLodOffset_00S20B00B20D
-    1431,  // textureLodOffset_00Y20B00B20D
-    1433,  // textureLodOffset_00d20B00B10D
-    1435,  // textureLodOffset_00L20B00B10D
-    1437,  // textureLodOffset_00U20B00B10D
-    1439,  // textureLodOffset_00a20B00B10D
-    1441,  // textureProjLodOffset_00I20B00B10D
-    1443,  // textureProjLodOffset_00R20B00B10D
-    1445,  // textureProjLodOffset_00X20B00B10D
-    1447,  // textureProjLodOffset_00I30B00B10D
-    1449,  // textureProjLodOffset_00R30B00B10D
-    1451,  // textureProjLodOffset_00X30B00B10D
-    1453,  // textureProjLodOffset_00J30B00B20D
-    1455,  // textureProjLodOffset_00S30B00B20D
-    1457,  // textureProjLodOffset_00Y30B00B20D
-    1459,  // textureProjLodOffset_00d30B00B10D
-    1461,  // texelFetchOffset_00I10D00D10D
-    1463,  // texelFetchOffset_00R10D00D10D
-    1465,  // texelFetchOffset_00X10D00D10D
-    1467,  // texelFetchOffset_00J20D00D20D
-    1469,  // texelFetchOffset_00S20D00D20D
-    1471,  // texelFetchOffset_00Y20D00D20D
-    1473,  // texelFetchOffset_00L20D00D10D
-    1475,  // texelFetchOffset_00U20D00D10D
-    1477,  // texelFetchOffset_00a20D00D10D
-    1479,  // textureGradOffset_00I10B10B10B10D
-    1481,  // textureGradOffset_00R10B10B10B10D
-    1483,  // textureGradOffset_00X10B10B10B10D
-    1485,  // textureGradOffset_00J20B20B20B20D
-    1487,  // textureGradOffset_00S20B20B20B20D
-    1489,  // textureGradOffset_00Y20B20B20B20D
-    1491,  // textureGradOffset_00d20B10B10B10D
-    1493,  // textureGradOffset_00L20B10B10B10D
-    1495,  // textureGradOffset_00U20B10B10B10D
-    1497,  // textureGradOffset_00a20B10B10B10D
-    1499,  // textureGradOffset_00f30B10B10B10D
-    1501,  // textureProjGradOffset_00I20B10B10B10D
-    1503,  // textureProjGradOffset_00R20B10B10B10D
-    1505,  // textureProjGradOffset_00X20B10B10B10D
-    1507,  // textureProjGradOffset_00I30B10B10B10D
-    1509,  // textureProjGradOffset_00R30B10B10B10D
-    1511,  // textureProjGradOffset_00X30B10B10B10D
-    1513,  // textureProjGradOffset_00J30B20B20B20D
-    1515,  // textureProjGradOffset_00S30B20B20B20D
-    1517,  // textureProjGradOffset_00Y30B20B20B20D
-    1519,  // textureProjGradOffset_00d30B10B10B10D
-    1521,  // textureOffset_00I10B10D00B
-    1523,  // textureOffset_00R10B10D00B
-    1525,  // textureOffset_00X10B10D00B
-    1527,  // textureOffset_00J20B20D00B
-    1529,  // textureOffset_00S20B20D00B
-    1531,  // textureOffset_00Y20B20D00B
-    1533,  // textureOffset_00d20B10D00B
-    1535,  // textureOffset_00L20B10D00B
-    1537,  // textureOffset_00U20B10D00B
-    1539,  // textureOffset_00a20B10D00B
-    1541,  // textureProjOffset_00I20B10D00B
-    1543,  // textureProjOffset_00R20B10D00B
-    1545,  // textureProjOffset_00X20B10D00B
-    1547,  // textureProjOffset_00I30B10D00B
-    1549,  // textureProjOffset_00R30B10D00B
-    1551,  // textureProjOffset_00X30B10D00B
-    1553,  // textureProjOffset_00J30B20D00B
-    1555,  // textureProjOffset_00S30B20D00B
-    1557,  // textureProjOffset_00Y30B20D00B
-    1559,  // textureProjOffset_00d30B10D00B
-    1561,  // textureGather_00I10B
-    1563,  // textureGather_00R10B
-    1565,  // textureGather_00X10B
-    1567,  // textureGather_00I10B00D
-    1569,  // textureGather_00R10B00D
-    1571,  // textureGather_00X10B00D
-    1573,  // textureGather_00L20B
-    1575,  // textureGather_00U20B
-    1577,  // textureGather_00a20B
-    1579,  // textureGather_00L20B00D
-    1581,  // textureGather_00U20B00D
-    1583,  // textureGather_00a20B00D
-    1585,  // textureGather_00K20B
-    1587,  // textureGather_00T20B
-    1589,  // textureGather_00Z20B
-    1591,  // textureGather_00K20B00D
-    1593,  // textureGather_00T20B00D
-    1595,  // textureGather_00Z20B00D
-    1597,  // textureGather_00k30B
-    1601,  // textureGather_00s30B
-    1605,  // textureGather_00x30B
-    1609,  // textureGather_00k30B00D
-    1613,  // textureGather_00s30B00D
-    1617,  // textureGather_00x30B00D
-    1621,  // textureGather_00l30B00B
-    1625,  // textureGather_00d10B
-    1626,  // textureGather_00d10B00B
-    1628,  // textureGather_00f20B
-    1629,  // textureGather_00f20B00B
-    1631,  // textureGather_00e20B
-    1632,  // textureGather_00e20B00B
-    1634,  // textureGatherOffset_00I10B10D
-    1636,  // textureGatherOffset_00R10B10D
-    1638,  // textureGatherOffset_00X10B10D
-    1640,  // textureGatherOffset_00L20B10D
-    1642,  // textureGatherOffset_00U20B10D
-    1644,  // textureGatherOffset_00a20B10D
-    1646,  // textureGatherOffset_00d10B00B10D
-    1648,  // textureGatherOffset_00f20B00B10D
-    1650,  // textureGatherOffset_00I10B10D00D
-    1652,  // textureGatherOffset_00R10B10D00D
-    1654,  // textureGatherOffset_00X10B10D00D
-    1656,  // textureGatherOffset_00L20B10D00D
-    1658,  // textureGatherOffset_00U20B10D00D
-    1660,  // textureGatherOffset_00a20B10D00D
-    1662,  // textureGatherOffsets_00I10B10Dx4
-    1665,  // textureGatherOffsets_00R10B10Dx4
-    1668,  // textureGatherOffsets_00X10B10Dx4
-    1671,  // textureGatherOffsets_00L20B10Dx4
-    1674,  // textureGatherOffsets_00U20B10Dx4
-    1677,  // textureGatherOffsets_00a20B10Dx4
-    1680,  // textureGatherOffsets_00d10B00B10Dx4
-    1683,  // textureGatherOffsets_00f20B00B10Dx4
-    1686,  // textureGatherOffsets_00I10B10Dx400D
-    1689,  // textureGatherOffsets_00R10B10Dx400D
-    1692,  // textureGatherOffsets_00X10B10Dx400D
-    1695,  // textureGatherOffsets_00L20B10Dx400D
-    1698,  // textureGatherOffsets_00U20B10Dx400D
-    1701,  // textureGatherOffsets_00a20B10Dx400D
-    1704,  // rgb_2_yuv_20B00H
-    1705,  // yuv_2_rgb_20B00H
-    1706,  // dFdx_00B
-    1709,  // dFdx_10B
-    1712,  // dFdx_20B
-    1715,  // dFdx_30B
-    1718,  // dFdy_00B
-    1721,  // dFdy_10B
-    1724,  // dFdy_20B
-    1727,  // dFdy_30B
-    1730,  // fwidth_00B
-    1733,  // fwidth_10B
-    1736,  // fwidth_20B
-    1739,  // fwidth_30B
-    1742,  // interpolateAtCentroid_00B
-    1745,  // interpolateAtCentroid_10B
-    1748,  // interpolateAtCentroid_20B
-    1751,  // interpolateAtCentroid_30B
-    1754,  // interpolateAtSample_00B00D
-    1757,  // interpolateAtSample_10B00D
-    1760,  // interpolateAtSample_20B00D
-    1763,  // interpolateAtSample_30B00D
-    1766,  // interpolateAtOffset_00B10B
-    1769,  // interpolateAtOffset_10B10B
-    1772,  // interpolateAtOffset_20B10B
-    1775,  // interpolateAtOffset_30B10B
-    1778,  // atomicCounter_00G
-    1780,  // atomicCounterIncrement_00G
-    1782,  // atomicCounterDecrement_00G
-    1784,  // atomicAdd_00E00E
-    1786,  // atomicAdd_00D00D
-    1788,  // atomicMin_00E00E
-    1790,  // atomicMin_00D00D
-    1792,  // atomicMax_00E00E
-    1794,  // atomicMax_00D00D
-    1796,  // atomicAnd_00E00E
-    1798,  // atomicAnd_00D00D
-    1800,  // atomicOr_00E00E
-    1802,  // atomicOr_00D00D
-    1804,  // atomicXor_00E00E
-    1806,  // atomicXor_00D00D
-    1808,  // atomicExchange_00E00E
-    1810,  // atomicExchange_00D00D
-    1812,  // atomicCompSwap_00E00E00E
-    1814,  // atomicCompSwap_00D00D00D
-    1816,  // imageSize_00z
-    1817,  // imageSize_01K
-    1818,  // imageSize_01V
-    1819,  // imageSize_01A
-    1820,  // imageSize_01L
-    1821,  // imageSize_01W
-    1822,  // imageSize_01B
-    1823,  // imageSize_01M
-    1824,  // imageSize_01X
-    1825,  // imageSize_01C
-    1826,  // imageSize_01N
-    1827,  // imageSize_01Y
-    1828,  // imageSize_01H
-    1831,  // imageSize_01S
-    1834,  // imageSize_01d
-    1837,  // imageSize_01J
-    1840,  // imageSize_01U
-    1843,  // imageSize_01f
-    1846,  // imageStore_00z10D30B
-    1847,  // imageStore_01K10D30D
-    1848,  // imageStore_01V10D30E
-    1849,  // imageStore_01A20D30B
-    1850,  // imageStore_01L20D30D
-    1851,  // imageStore_01W20D30E
-    1852,  // imageStore_01B20D30B
-    1853,  // imageStore_01M20D30D
-    1854,  // imageStore_01X20D30E
-    1855,  // imageStore_01C20D30B
-    1856,  // imageStore_01N20D30D
-    1857,  // imageStore_01Y20D30E
-    1858,  // imageStore_01H20D30B
-    1861,  // imageStore_01S20D30D
-    1864,  // imageStore_01d20D30E
-    1867,  // imageStore_01J00D30B
-    1870,  // imageStore_01U00D30D
-    1873,  // imageStore_01f00D30E
-    1876,  // imageLoad_00z10D
-    1877,  // imageLoad_01K10D
-    1878,  // imageLoad_01V10D
-    1879,  // imageLoad_01A20D
-    1880,  // imageLoad_01L20D
-    1881,  // imageLoad_01W20D
-    1882,  // imageLoad_01B20D
-    1883,  // imageLoad_01M20D
-    1884,  // imageLoad_01X20D
-    1885,  // imageLoad_01C20D
-    1886,  // imageLoad_01N20D
-    1887,  // imageLoad_01Y20D
-    1888,  // imageLoad_01H20D
-    1891,  // imageLoad_01S20D
-    1894,  // imageLoad_01d20D
-    1897,  // imageLoad_01J00D
-    1900,  // imageLoad_01U00D
-    1903,  // imageLoad_01f00D
-    1906,  // imageAtomicAdd_00z10D00E
-    1907,  // imageAtomicAdd_01K10D00E
-    1908,  // imageAtomicAdd_01V10D00E
-    1909,  // imageAtomicAdd_01A20D00E
-    1910,  // imageAtomicAdd_01L20D00E
-    1911,  // imageAtomicAdd_01W20D00E
-    1912,  // imageAtomicAdd_01C20D00E
-    1913,  // imageAtomicAdd_01N20D00E
-    1914,  // imageAtomicAdd_01Y20D00E
-    1915,  // imageAtomicAdd_01J00D00E
-    1916,  // imageAtomicAdd_01U00D00E
-    1917,  // imageAtomicAdd_01f00D00E
-    1918,  // imageAtomicAdd_01B20D00E
-    1919,  // imageAtomicAdd_01M20D00E
-    1920,  // imageAtomicAdd_01X20D00E
-    1921,  // imageAtomicAdd_01H20D00E
-    1922,  // imageAtomicAdd_01S20D00E
-    1923,  // imageAtomicAdd_01d20D00E
-    1924,  // imageAtomicAdd_01D00D00E
-    1925,  // imageAtomicAdd_01O00D00E
-    1926,  // imageAtomicAdd_01Z00D00E
-    1927,  // imageAtomicAdd_01E10D00E
-    1928,  // imageAtomicAdd_01P10D00E
-    1929,  // imageAtomicAdd_01a10D00E
-    1930,  // imageAtomicAdd_01I10D00E
-    1931,  // imageAtomicAdd_01T10D00E
-    1932,  // imageAtomicAdd_01e10D00E
-    1933,  // imageAtomicAdd_01F10D00D00E
-    1934,  // imageAtomicAdd_01Q10D00D00E
-    1935,  // imageAtomicAdd_01b10D00D00E
-    1936,  // imageAtomicAdd_01G20D00D00E
-    1937,  // imageAtomicAdd_01R20D00D00E
-    1938,  // imageAtomicAdd_01c20D00D00E
-    1939,  // imageAtomicAdd_00z10D00D
-    1940,  // imageAtomicAdd_01K10D00D
-    1941,  // imageAtomicAdd_01V10D00D
-    1942,  // imageAtomicAdd_01A20D00D
-    1943,  // imageAtomicAdd_01L20D00D
-    1944,  // imageAtomicAdd_01W20D00D
-    1945,  // imageAtomicAdd_01C20D00D
-    1946,  // imageAtomicAdd_01N20D00D
-    1947,  // imageAtomicAdd_01Y20D00D
-    1948,  // imageAtomicAdd_01J00D00D
-    1949,  // imageAtomicAdd_01U00D00D
-    1950,  // imageAtomicAdd_01f00D00D
-    1951,  // imageAtomicAdd_01B20D00D
-    1952,  // imageAtomicAdd_01M20D00D
-    1953,  // imageAtomicAdd_01X20D00D
-    1954,  // imageAtomicAdd_01H20D00D
-    1955,  // imageAtomicAdd_01S20D00D
-    1956,  // imageAtomicAdd_01d20D00D
-    1957,  // imageAtomicAdd_01D00D00D
-    1958,  // imageAtomicAdd_01O00D00D
-    1959,  // imageAtomicAdd_01Z00D00D
-    1960,  // imageAtomicAdd_01E10D00D
-    1961,  // imageAtomicAdd_01P10D00D
-    1962,  // imageAtomicAdd_01a10D00D
-    1963,  // imageAtomicAdd_01I10D00D
-    1964,  // imageAtomicAdd_01T10D00D
-    1965,  // imageAtomicAdd_01e10D00D
-    1966,  // imageAtomicAdd_01F10D00D00D
-    1967,  // imageAtomicAdd_01Q10D00D00D
-    1968,  // imageAtomicAdd_01b10D00D00D
-    1969,  // imageAtomicAdd_01G20D00D00D
-    1970,  // imageAtomicAdd_01R20D00D00D
-    1971,  // imageAtomicAdd_01c20D00D00D
-    1972,  // imageAtomicMin_00z10D00E
-    1973,  // imageAtomicMin_01K10D00E
-    1974,  // imageAtomicMin_01V10D00E
-    1975,  // imageAtomicMin_01A20D00E
-    1976,  // imageAtomicMin_01L20D00E
-    1977,  // imageAtomicMin_01W20D00E
-    1978,  // imageAtomicMin_01C20D00E
-    1979,  // imageAtomicMin_01N20D00E
-    1980,  // imageAtomicMin_01Y20D00E
-    1981,  // imageAtomicMin_01J00D00E
-    1982,  // imageAtomicMin_01U00D00E
-    1983,  // imageAtomicMin_01f00D00E
-    1984,  // imageAtomicMin_01B20D00E
-    1985,  // imageAtomicMin_01M20D00E
-    1986,  // imageAtomicMin_01X20D00E
-    1987,  // imageAtomicMin_01H20D00E
-    1988,  // imageAtomicMin_01S20D00E
-    1989,  // imageAtomicMin_01d20D00E
-    1990,  // imageAtomicMin_01D00D00E
-    1991,  // imageAtomicMin_01O00D00E
-    1992,  // imageAtomicMin_01Z00D00E
-    1993,  // imageAtomicMin_01E10D00E
-    1994,  // imageAtomicMin_01P10D00E
-    1995,  // imageAtomicMin_01a10D00E
-    1996,  // imageAtomicMin_01I10D00E
-    1997,  // imageAtomicMin_01T10D00E
-    1998,  // imageAtomicMin_01e10D00E
-    1999,  // imageAtomicMin_01F10D00D00E
-    2000,  // imageAtomicMin_01Q10D00D00E
-    2001,  // imageAtomicMin_01b10D00D00E
-    2002,  // imageAtomicMin_01G20D00D00E
-    2003,  // imageAtomicMin_01R20D00D00E
-    2004,  // imageAtomicMin_01c20D00D00E
-    2005,  // imageAtomicMin_00z10D00D
-    2006,  // imageAtomicMin_01K10D00D
-    2007,  // imageAtomicMin_01V10D00D
-    2008,  // imageAtomicMin_01A20D00D
-    2009,  // imageAtomicMin_01L20D00D
-    2010,  // imageAtomicMin_01W20D00D
-    2011,  // imageAtomicMin_01C20D00D
-    2012,  // imageAtomicMin_01N20D00D
-    2013,  // imageAtomicMin_01Y20D00D
-    2014,  // imageAtomicMin_01J00D00D
-    2015,  // imageAtomicMin_01U00D00D
-    2016,  // imageAtomicMin_01f00D00D
-    2017,  // imageAtomicMin_01B20D00D
-    2018,  // imageAtomicMin_01M20D00D
-    2019,  // imageAtomicMin_01X20D00D
-    2020,  // imageAtomicMin_01H20D00D
-    2021,  // imageAtomicMin_01S20D00D
-    2022,  // imageAtomicMin_01d20D00D
-    2023,  // imageAtomicMin_01D00D00D
-    2024,  // imageAtomicMin_01O00D00D
-    2025,  // imageAtomicMin_01Z00D00D
-    2026,  // imageAtomicMin_01E10D00D
-    2027,  // imageAtomicMin_01P10D00D
-    2028,  // imageAtomicMin_01a10D00D
-    2029,  // imageAtomicMin_01I10D00D
-    2030,  // imageAtomicMin_01T10D00D
-    2031,  // imageAtomicMin_01e10D00D
-    2032,  // imageAtomicMin_01F10D00D00D
-    2033,  // imageAtomicMin_01Q10D00D00D
-    2034,  // imageAtomicMin_01b10D00D00D
-    2035,  // imageAtomicMin_01G20D00D00D
-    2036,  // imageAtomicMin_01R20D00D00D
-    2037,  // imageAtomicMin_01c20D00D00D
-    2038,  // imageAtomicMax_00z10D00E
-    2039,  // imageAtomicMax_01K10D00E
-    2040,  // imageAtomicMax_01V10D00E
-    2041,  // imageAtomicMax_01A20D00E
-    2042,  // imageAtomicMax_01L20D00E
-    2043,  // imageAtomicMax_01W20D00E
-    2044,  // imageAtomicMax_01C20D00E
-    2045,  // imageAtomicMax_01N20D00E
-    2046,  // imageAtomicMax_01Y20D00E
-    2047,  // imageAtomicMax_01J00D00E
-    2048,  // imageAtomicMax_01U00D00E
-    2049,  // imageAtomicMax_01f00D00E
-    2050,  // imageAtomicMax_01B20D00E
-    2051,  // imageAtomicMax_01M20D00E
-    2052,  // imageAtomicMax_01X20D00E
-    2053,  // imageAtomicMax_01H20D00E
-    2054,  // imageAtomicMax_01S20D00E
-    2055,  // imageAtomicMax_01d20D00E
-    2056,  // imageAtomicMax_01D00D00E
-    2057,  // imageAtomicMax_01O00D00E
-    2058,  // imageAtomicMax_01Z00D00E
-    2059,  // imageAtomicMax_01E10D00E
-    2060,  // imageAtomicMax_01P10D00E
-    2061,  // imageAtomicMax_01a10D00E
-    2062,  // imageAtomicMax_01I10D00E
-    2063,  // imageAtomicMax_01T10D00E
-    2064,  // imageAtomicMax_01e10D00E
-    2065,  // imageAtomicMax_01F10D00D00E
-    2066,  // imageAtomicMax_01Q10D00D00E
-    2067,  // imageAtomicMax_01b10D00D00E
-    2068,  // imageAtomicMax_01G20D00D00E
-    2069,  // imageAtomicMax_01R20D00D00E
-    2070,  // imageAtomicMax_01c20D00D00E
-    2071,  // imageAtomicMax_00z10D00D
-    2072,  // imageAtomicMax_01K10D00D
-    2073,  // imageAtomicMax_01V10D00D
-    2074,  // imageAtomicMax_01A20D00D
-    2075,  // imageAtomicMax_01L20D00D
-    2076,  // imageAtomicMax_01W20D00D
-    2077,  // imageAtomicMax_01C20D00D
-    2078,  // imageAtomicMax_01N20D00D
-    2079,  // imageAtomicMax_01Y20D00D
-    2080,  // imageAtomicMax_01J00D00D
-    2081,  // imageAtomicMax_01U00D00D
-    2082,  // imageAtomicMax_01f00D00D
-    2083,  // imageAtomicMax_01B20D00D
-    2084,  // imageAtomicMax_01M20D00D
-    2085,  // imageAtomicMax_01X20D00D
-    2086,  // imageAtomicMax_01H20D00D
-    2087,  // imageAtomicMax_01S20D00D
-    2088,  // imageAtomicMax_01d20D00D
-    2089,  // imageAtomicMax_01D00D00D
-    2090,  // imageAtomicMax_01O00D00D
-    2091,  // imageAtomicMax_01Z00D00D
-    2092,  // imageAtomicMax_01E10D00D
-    2093,  // imageAtomicMax_01P10D00D
-    2094,  // imageAtomicMax_01a10D00D
-    2095,  // imageAtomicMax_01I10D00D
-    2096,  // imageAtomicMax_01T10D00D
-    2097,  // imageAtomicMax_01e10D00D
-    2098,  // imageAtomicMax_01F10D00D00D
-    2099,  // imageAtomicMax_01Q10D00D00D
-    2100,  // imageAtomicMax_01b10D00D00D
-    2101,  // imageAtomicMax_01G20D00D00D
-    2102,  // imageAtomicMax_01R20D00D00D
-    2103,  // imageAtomicMax_01c20D00D00D
-    2104,  // imageAtomicAnd_00z10D00E
-    2105,  // imageAtomicAnd_01K10D00E
-    2106,  // imageAtomicAnd_01V10D00E
-    2107,  // imageAtomicAnd_01A20D00E
-    2108,  // imageAtomicAnd_01L20D00E
-    2109,  // imageAtomicAnd_01W20D00E
-    2110,  // imageAtomicAnd_01C20D00E
-    2111,  // imageAtomicAnd_01N20D00E
-    2112,  // imageAtomicAnd_01Y20D00E
-    2113,  // imageAtomicAnd_01J00D00E
-    2114,  // imageAtomicAnd_01U00D00E
-    2115,  // imageAtomicAnd_01f00D00E
-    2116,  // imageAtomicAnd_01B20D00E
-    2117,  // imageAtomicAnd_01M20D00E
-    2118,  // imageAtomicAnd_01X20D00E
-    2119,  // imageAtomicAnd_01H20D00E
-    2120,  // imageAtomicAnd_01S20D00E
-    2121,  // imageAtomicAnd_01d20D00E
-    2122,  // imageAtomicAnd_01D00D00E
-    2123,  // imageAtomicAnd_01O00D00E
-    2124,  // imageAtomicAnd_01Z00D00E
-    2125,  // imageAtomicAnd_01E10D00E
-    2126,  // imageAtomicAnd_01P10D00E
-    2127,  // imageAtomicAnd_01a10D00E
-    2128,  // imageAtomicAnd_01I10D00E
-    2129,  // imageAtomicAnd_01T10D00E
-    2130,  // imageAtomicAnd_01e10D00E
-    2131,  // imageAtomicAnd_01F10D00D00E
-    2132,  // imageAtomicAnd_01Q10D00D00E
-    2133,  // imageAtomicAnd_01b10D00D00E
-    2134,  // imageAtomicAnd_01G20D00D00E
-    2135,  // imageAtomicAnd_01R20D00D00E
-    2136,  // imageAtomicAnd_01c20D00D00E
-    2137,  // imageAtomicAnd_00z10D00D
-    2138,  // imageAtomicAnd_01K10D00D
-    2139,  // imageAtomicAnd_01V10D00D
-    2140,  // imageAtomicAnd_01A20D00D
-    2141,  // imageAtomicAnd_01L20D00D
-    2142,  // imageAtomicAnd_01W20D00D
-    2143,  // imageAtomicAnd_01C20D00D
-    2144,  // imageAtomicAnd_01N20D00D
-    2145,  // imageAtomicAnd_01Y20D00D
-    2146,  // imageAtomicAnd_01J00D00D
-    2147,  // imageAtomicAnd_01U00D00D
-    2148,  // imageAtomicAnd_01f00D00D
-    2149,  // imageAtomicAnd_01B20D00D
-    2150,  // imageAtomicAnd_01M20D00D
-    2151,  // imageAtomicAnd_01X20D00D
-    2152,  // imageAtomicAnd_01H20D00D
-    2153,  // imageAtomicAnd_01S20D00D
-    2154,  // imageAtomicAnd_01d20D00D
-    2155,  // imageAtomicAnd_01D00D00D
-    2156,  // imageAtomicAnd_01O00D00D
-    2157,  // imageAtomicAnd_01Z00D00D
-    2158,  // imageAtomicAnd_01E10D00D
-    2159,  // imageAtomicAnd_01P10D00D
-    2160,  // imageAtomicAnd_01a10D00D
-    2161,  // imageAtomicAnd_01I10D00D
-    2162,  // imageAtomicAnd_01T10D00D
-    2163,  // imageAtomicAnd_01e10D00D
-    2164,  // imageAtomicAnd_01F10D00D00D
-    2165,  // imageAtomicAnd_01Q10D00D00D
-    2166,  // imageAtomicAnd_01b10D00D00D
-    2167,  // imageAtomicAnd_01G20D00D00D
-    2168,  // imageAtomicAnd_01R20D00D00D
-    2169,  // imageAtomicAnd_01c20D00D00D
-    2170,  // imageAtomicOr_00z10D00E
-    2171,  // imageAtomicOr_01K10D00E
-    2172,  // imageAtomicOr_01V10D00E
-    2173,  // imageAtomicOr_01A20D00E
-    2174,  // imageAtomicOr_01L20D00E
-    2175,  // imageAtomicOr_01W20D00E
-    2176,  // imageAtomicOr_01C20D00E
-    2177,  // imageAtomicOr_01N20D00E
-    2178,  // imageAtomicOr_01Y20D00E
-    2179,  // imageAtomicOr_01J00D00E
-    2180,  // imageAtomicOr_01U00D00E
-    2181,  // imageAtomicOr_01f00D00E
-    2182,  // imageAtomicOr_01B20D00E
-    2183,  // imageAtomicOr_01M20D00E
-    2184,  // imageAtomicOr_01X20D00E
-    2185,  // imageAtomicOr_01H20D00E
-    2186,  // imageAtomicOr_01S20D00E
-    2187,  // imageAtomicOr_01d20D00E
-    2188,  // imageAtomicOr_01D00D00E
-    2189,  // imageAtomicOr_01O00D00E
-    2190,  // imageAtomicOr_01Z00D00E
-    2191,  // imageAtomicOr_01E10D00E
-    2192,  // imageAtomicOr_01P10D00E
-    2193,  // imageAtomicOr_01a10D00E
-    2194,  // imageAtomicOr_01I10D00E
-    2195,  // imageAtomicOr_01T10D00E
-    2196,  // imageAtomicOr_01e10D00E
-    2197,  // imageAtomicOr_01F10D00D00E
-    2198,  // imageAtomicOr_01Q10D00D00E
-    2199,  // imageAtomicOr_01b10D00D00E
-    2200,  // imageAtomicOr_01G20D00D00E
-    2201,  // imageAtomicOr_01R20D00D00E
-    2202,  // imageAtomicOr_01c20D00D00E
-    2203,  // imageAtomicOr_00z10D00D
-    2204,  // imageAtomicOr_01K10D00D
-    2205,  // imageAtomicOr_01V10D00D
-    2206,  // imageAtomicOr_01A20D00D
-    2207,  // imageAtomicOr_01L20D00D
-    2208,  // imageAtomicOr_01W20D00D
-    2209,  // imageAtomicOr_01C20D00D
-    2210,  // imageAtomicOr_01N20D00D
-    2211,  // imageAtomicOr_01Y20D00D
-    2212,  // imageAtomicOr_01J00D00D
-    2213,  // imageAtomicOr_01U00D00D
-    2214,  // imageAtomicOr_01f00D00D
-    2215,  // imageAtomicOr_01B20D00D
-    2216,  // imageAtomicOr_01M20D00D
-    2217,  // imageAtomicOr_01X20D00D
-    2218,  // imageAtomicOr_01H20D00D
-    2219,  // imageAtomicOr_01S20D00D
-    2220,  // imageAtomicOr_01d20D00D
-    2221,  // imageAtomicOr_01D00D00D
-    2222,  // imageAtomicOr_01O00D00D
-    2223,  // imageAtomicOr_01Z00D00D
-    2224,  // imageAtomicOr_01E10D00D
-    2225,  // imageAtomicOr_01P10D00D
-    2226,  // imageAtomicOr_01a10D00D
-    2227,  // imageAtomicOr_01I10D00D
-    2228,  // imageAtomicOr_01T10D00D
-    2229,  // imageAtomicOr_01e10D00D
-    2230,  // imageAtomicOr_01F10D00D00D
-    2231,  // imageAtomicOr_01Q10D00D00D
-    2232,  // imageAtomicOr_01b10D00D00D
-    2233,  // imageAtomicOr_01G20D00D00D
-    2234,  // imageAtomicOr_01R20D00D00D
-    2235,  // imageAtomicOr_01c20D00D00D
-    2236,  // imageAtomicXor_00z10D00E
-    2237,  // imageAtomicXor_01K10D00E
-    2238,  // imageAtomicXor_01V10D00E
-    2239,  // imageAtomicXor_01A20D00E
-    2240,  // imageAtomicXor_01L20D00E
-    2241,  // imageAtomicXor_01W20D00E
-    2242,  // imageAtomicXor_01C20D00E
-    2243,  // imageAtomicXor_01N20D00E
-    2244,  // imageAtomicXor_01Y20D00E
-    2245,  // imageAtomicXor_01J00D00E
-    2246,  // imageAtomicXor_01U00D00E
-    2247,  // imageAtomicXor_01f00D00E
-    2248,  // imageAtomicXor_01B20D00E
-    2249,  // imageAtomicXor_01M20D00E
-    2250,  // imageAtomicXor_01X20D00E
-    2251,  // imageAtomicXor_01H20D00E
-    2252,  // imageAtomicXor_01S20D00E
-    2253,  // imageAtomicXor_01d20D00E
-    2254,  // imageAtomicXor_01D00D00E
-    2255,  // imageAtomicXor_01O00D00E
-    2256,  // imageAtomicXor_01Z00D00E
-    2257,  // imageAtomicXor_01E10D00E
-    2258,  // imageAtomicXor_01P10D00E
-    2259,  // imageAtomicXor_01a10D00E
-    2260,  // imageAtomicXor_01I10D00E
-    2261,  // imageAtomicXor_01T10D00E
-    2262,  // imageAtomicXor_01e10D00E
-    2263,  // imageAtomicXor_01F10D00D00E
-    2264,  // imageAtomicXor_01Q10D00D00E
-    2265,  // imageAtomicXor_01b10D00D00E
-    2266,  // imageAtomicXor_01G20D00D00E
-    2267,  // imageAtomicXor_01R20D00D00E
-    2268,  // imageAtomicXor_01c20D00D00E
-    2269,  // imageAtomicXor_00z10D00D
-    2270,  // imageAtomicXor_01K10D00D
-    2271,  // imageAtomicXor_01V10D00D
-    2272,  // imageAtomicXor_01A20D00D
-    2273,  // imageAtomicXor_01L20D00D
-    2274,  // imageAtomicXor_01W20D00D
-    2275,  // imageAtomicXor_01C20D00D
-    2276,  // imageAtomicXor_01N20D00D
-    2277,  // imageAtomicXor_01Y20D00D
-    2278,  // imageAtomicXor_01J00D00D
-    2279,  // imageAtomicXor_01U00D00D
-    2280,  // imageAtomicXor_01f00D00D
-    2281,  // imageAtomicXor_01B20D00D
-    2282,  // imageAtomicXor_01M20D00D
-    2283,  // imageAtomicXor_01X20D00D
-    2284,  // imageAtomicXor_01H20D00D
-    2285,  // imageAtomicXor_01S20D00D
-    2286,  // imageAtomicXor_01d20D00D
-    2287,  // imageAtomicXor_01D00D00D
-    2288,  // imageAtomicXor_01O00D00D
-    2289,  // imageAtomicXor_01Z00D00D
-    2290,  // imageAtomicXor_01E10D00D
-    2291,  // imageAtomicXor_01P10D00D
-    2292,  // imageAtomicXor_01a10D00D
-    2293,  // imageAtomicXor_01I10D00D
-    2294,  // imageAtomicXor_01T10D00D
-    2295,  // imageAtomicXor_01e10D00D
-    2296,  // imageAtomicXor_01F10D00D00D
-    2297,  // imageAtomicXor_01Q10D00D00D
-    2298,  // imageAtomicXor_01b10D00D00D
-    2299,  // imageAtomicXor_01G20D00D00D
-    2300,  // imageAtomicXor_01R20D00D00D
-    2301,  // imageAtomicXor_01c20D00D00D
-    2302,  // imageAtomicExchange_00z10D00E
-    2303,  // imageAtomicExchange_01K10D00E
-    2304,  // imageAtomicExchange_01V10D00E
-    2305,  // imageAtomicExchange_01A20D00E
-    2306,  // imageAtomicExchange_01L20D00E
-    2307,  // imageAtomicExchange_01W20D00E
-    2308,  // imageAtomicExchange_01C20D00E
-    2309,  // imageAtomicExchange_01N20D00E
-    2310,  // imageAtomicExchange_01Y20D00E
-    2311,  // imageAtomicExchange_01J00D00E
-    2312,  // imageAtomicExchange_01U00D00E
-    2313,  // imageAtomicExchange_01f00D00E
-    2314,  // imageAtomicExchange_01B20D00E
-    2315,  // imageAtomicExchange_01M20D00E
-    2316,  // imageAtomicExchange_01X20D00E
-    2317,  // imageAtomicExchange_01H20D00E
-    2318,  // imageAtomicExchange_01S20D00E
-    2319,  // imageAtomicExchange_01d20D00E
-    2320,  // imageAtomicExchange_01D00D00E
-    2321,  // imageAtomicExchange_01O00D00E
-    2322,  // imageAtomicExchange_01Z00D00E
-    2323,  // imageAtomicExchange_01E10D00E
-    2324,  // imageAtomicExchange_01P10D00E
-    2325,  // imageAtomicExchange_01a10D00E
-    2326,  // imageAtomicExchange_01I10D00E
-    2327,  // imageAtomicExchange_01T10D00E
-    2328,  // imageAtomicExchange_01e10D00E
-    2329,  // imageAtomicExchange_01F10D00D00E
-    2330,  // imageAtomicExchange_01Q10D00D00E
-    2331,  // imageAtomicExchange_01b10D00D00E
-    2332,  // imageAtomicExchange_01G20D00D00E
-    2333,  // imageAtomicExchange_01R20D00D00E
-    2334,  // imageAtomicExchange_01c20D00D00E
-    2335,  // imageAtomicExchange_00z10D00D
-    2336,  // imageAtomicExchange_01K10D00D
-    2337,  // imageAtomicExchange_01V10D00D
-    2338,  // imageAtomicExchange_01A20D00D
-    2339,  // imageAtomicExchange_01L20D00D
-    2340,  // imageAtomicExchange_01W20D00D
-    2341,  // imageAtomicExchange_01C20D00D
-    2342,  // imageAtomicExchange_01N20D00D
-    2343,  // imageAtomicExchange_01Y20D00D
-    2344,  // imageAtomicExchange_01J00D00D
-    2345,  // imageAtomicExchange_01U00D00D
-    2346,  // imageAtomicExchange_01f00D00D
-    2347,  // imageAtomicExchange_01B20D00D
-    2348,  // imageAtomicExchange_01M20D00D
-    2349,  // imageAtomicExchange_01X20D00D
-    2350,  // imageAtomicExchange_01H20D00D
-    2351,  // imageAtomicExchange_01S20D00D
-    2352,  // imageAtomicExchange_01d20D00D
-    2353,  // imageAtomicExchange_01D00D00D
-    2354,  // imageAtomicExchange_01O00D00D
-    2355,  // imageAtomicExchange_01Z00D00D
-    2356,  // imageAtomicExchange_01E10D00D
-    2357,  // imageAtomicExchange_01P10D00D
-    2358,  // imageAtomicExchange_01a10D00D
-    2359,  // imageAtomicExchange_01I10D00D
-    2360,  // imageAtomicExchange_01T10D00D
-    2361,  // imageAtomicExchange_01e10D00D
-    2362,  // imageAtomicExchange_01F10D00D00D
-    2363,  // imageAtomicExchange_01Q10D00D00D
-    2364,  // imageAtomicExchange_01b10D00D00D
-    2365,  // imageAtomicExchange_01G20D00D00D
-    2366,  // imageAtomicExchange_01R20D00D00D
-    2367,  // imageAtomicExchange_01c20D00D00D
-    2368,  // imageAtomicExchange_00z10D00B
-    2369,  // imageAtomicExchange_01K10D00B
-    2370,  // imageAtomicExchange_01V10D00B
-    2371,  // imageAtomicExchange_01A20D00B
-    2372,  // imageAtomicExchange_01L20D00B
-    2373,  // imageAtomicExchange_01W20D00B
-    2374,  // imageAtomicExchange_01C20D00B
-    2375,  // imageAtomicExchange_01N20D00B
-    2376,  // imageAtomicExchange_01Y20D00B
-    2377,  // imageAtomicExchange_01J00D00B
-    2378,  // imageAtomicExchange_01U00D00B
-    2379,  // imageAtomicExchange_01f00D00B
-    2380,  // imageAtomicExchange_01B20D00B
-    2381,  // imageAtomicExchange_01M20D00B
-    2382,  // imageAtomicExchange_01X20D00B
-    2383,  // imageAtomicExchange_01H20D00B
-    2384,  // imageAtomicExchange_01S20D00B
-    2385,  // imageAtomicExchange_01d20D00B
-    2386,  // imageAtomicExchange_01D00D00B
-    2387,  // imageAtomicExchange_01O00D00B
-    2388,  // imageAtomicExchange_01Z00D00B
-    2389,  // imageAtomicExchange_01E10D00B
-    2390,  // imageAtomicExchange_01P10D00B
-    2391,  // imageAtomicExchange_01a10D00B
-    2392,  // imageAtomicExchange_01I10D00B
-    2393,  // imageAtomicExchange_01T10D00B
-    2394,  // imageAtomicExchange_01e10D00B
-    2395,  // imageAtomicExchange_01F10D00D00B
-    2396,  // imageAtomicExchange_01Q10D00D00B
-    2397,  // imageAtomicExchange_01b10D00D00B
-    2398,  // imageAtomicExchange_01G20D00D00B
-    2399,  // imageAtomicExchange_01R20D00D00B
-    2400,  // imageAtomicExchange_01c20D00D00B
-    2401,  // imageAtomicCompSwap_00z10D00E00E
-    2402,  // imageAtomicCompSwap_01K10D00E00E
-    2403,  // imageAtomicCompSwap_01V10D00E00E
-    2404,  // imageAtomicCompSwap_01A20D00E00E
-    2405,  // imageAtomicCompSwap_01L20D00E00E
-    2406,  // imageAtomicCompSwap_01W20D00E00E
-    2407,  // imageAtomicCompSwap_01C20D00E00E
-    2408,  // imageAtomicCompSwap_01N20D00E00E
-    2409,  // imageAtomicCompSwap_01Y20D00E00E
-    2410,  // imageAtomicCompSwap_01J00D00E00E
-    2411,  // imageAtomicCompSwap_01U00D00E00E
-    2412,  // imageAtomicCompSwap_01f00D00E00E
-    2413,  // imageAtomicCompSwap_01B20D00E00E
-    2414,  // imageAtomicCompSwap_01M20D00E00E
-    2415,  // imageAtomicCompSwap_01X20D00E00E
-    2416,  // imageAtomicCompSwap_01H20D00E00E
-    2417,  // imageAtomicCompSwap_01S20D00E00E
-    2418,  // imageAtomicCompSwap_01d20D00E00E
-    2419,  // imageAtomicCompSwap_01D00D00E00E
-    2420,  // imageAtomicCompSwap_01O00D00E00E
-    2421,  // imageAtomicCompSwap_01Z00D00E00E
-    2422,  // imageAtomicCompSwap_01E10D00E00E
-    2423,  // imageAtomicCompSwap_01P10D00E00E
-    2424,  // imageAtomicCompSwap_01a10D00E00E
-    2425,  // imageAtomicCompSwap_01I10D00E00E
-    2426,  // imageAtomicCompSwap_01T10D00E00E
-    2427,  // imageAtomicCompSwap_01e10D00E00E
-    2428,  // imageAtomicCompSwap_01F10D00D00E00E
-    2429,  // imageAtomicCompSwap_01Q10D00D00E00E
-    2430,  // imageAtomicCompSwap_01b10D00D00E00E
-    2431,  // imageAtomicCompSwap_01G20D00D00E00E
-    2432,  // imageAtomicCompSwap_01R20D00D00E00E
-    2433,  // imageAtomicCompSwap_01c20D00D00E00E
-    2434,  // imageAtomicCompSwap_00z10D00D00D
-    2435,  // imageAtomicCompSwap_01K10D00D00D
-    2436,  // imageAtomicCompSwap_01V10D00D00D
-    2437,  // imageAtomicCompSwap_01A20D00D00D
-    2438,  // imageAtomicCompSwap_01L20D00D00D
-    2439,  // imageAtomicCompSwap_01W20D00D00D
-    2440,  // imageAtomicCompSwap_01C20D00D00D
-    2441,  // imageAtomicCompSwap_01N20D00D00D
-    2442,  // imageAtomicCompSwap_01Y20D00D00D
-    2443,  // imageAtomicCompSwap_01J00D00D00D
-    2444,  // imageAtomicCompSwap_01U00D00D00D
-    2445,  // imageAtomicCompSwap_01f00D00D00D
-    2446,  // imageAtomicCompSwap_01B20D00D00D
-    2447,  // imageAtomicCompSwap_01M20D00D00D
-    2448,  // imageAtomicCompSwap_01X20D00D00D
-    2449,  // imageAtomicCompSwap_01H20D00D00D
-    2450,  // imageAtomicCompSwap_01S20D00D00D
-    2451,  // imageAtomicCompSwap_01d20D00D00D
-    2452,  // imageAtomicCompSwap_01D00D00D00D
-    2453,  // imageAtomicCompSwap_01O00D00D00D
-    2454,  // imageAtomicCompSwap_01Z00D00D00D
-    2455,  // imageAtomicCompSwap_01E10D00D00D
-    2456,  // imageAtomicCompSwap_01P10D00D00D
-    2457,  // imageAtomicCompSwap_01a10D00D00D
-    2458,  // imageAtomicCompSwap_01I10D00D00D
-    2459,  // imageAtomicCompSwap_01T10D00D00D
-    2460,  // imageAtomicCompSwap_01e10D00D00D
-    2461,  // imageAtomicCompSwap_01F10D00D00D00D
-    2462,  // imageAtomicCompSwap_01Q10D00D00D00D
-    2463,  // imageAtomicCompSwap_01b10D00D00D00D
-    2464,  // imageAtomicCompSwap_01G20D00D00D00D
-    2465,  // imageAtomicCompSwap_01R20D00D00D00D
-    2466,  // imageAtomicCompSwap_01c20D00D00D00D
-    2467,  // memoryBarrier_
-    2469,  // memoryBarrierAtomicCounter_
-    2471,  // memoryBarrierBuffer_
-    2473,  // memoryBarrierImage_
-    2475,  // barrier_
-    2479,  // memoryBarrierShared_
-    2481,  // groupMemoryBarrier_
-    2483,  // EmitVertex_
-    2486,  // EndPrimitive_
-    2489,  // gl_DepthRangeParameters
-    2491,  // gl_DepthRange
-    2493,  // gl_NumSamples
-    2496,  // gl_MaxVertexAttribs
-    2498,  // gl_MaxVertexUniformVectors
-    2500,  // gl_MaxVertexTextureImageUnits
-    2502,  // gl_MaxCombinedTextureImageUnits
-    2504,  // gl_MaxTextureImageUnits
-    2506,  // gl_MaxFragmentUniformVectors
-    2508,  // gl_MaxVaryingVectors
-    2510,  // gl_MaxDrawBuffers
-    2512,  // gl_MaxDualSourceDrawBuffersEXT
-    2513,  // gl_MaxVertexOutputVectors
-    2515,  // gl_MaxFragmentInputVectors
-    2517,  // gl_MinProgramTexelOffset
-    2519,  // gl_MaxProgramTexelOffset
-    2521,  // gl_MaxImageUnits
-    2523,  // gl_MaxVertexImageUniforms
-    2525,  // gl_MaxFragmentImageUniforms
-    2527,  // gl_MaxComputeImageUniforms
-    2529,  // gl_MaxCombinedImageUniforms
-    2531,  // gl_MaxCombinedShaderOutputResources
-    2533,  // gl_MaxComputeWorkGroupCount
-    2535,  // gl_MaxComputeWorkGroupSize
-    2537,  // gl_MaxComputeUniformComponents
-    2539,  // gl_MaxComputeTextureImageUnits
-    2541,  // gl_MaxComputeAtomicCounters
-    2543,  // gl_MaxComputeAtomicCounterBuffers
-    2545,  // gl_MaxVertexAtomicCounters
-    2547,  // gl_MaxFragmentAtomicCounters
-    2549,  // gl_MaxCombinedAtomicCounters
-    2551,  // gl_MaxAtomicCounterBindings
-    2553,  // gl_MaxVertexAtomicCounterBuffers
-    2555,  // gl_MaxFragmentAtomicCounterBuffers
-    2557,  // gl_MaxCombinedAtomicCounterBuffers
-    2559,  // gl_MaxAtomicCounterBufferSize
-    2561,  // gl_MaxGeometryInputComponents
-    2565,  // gl_MaxGeometryOutputComponents
-    2569,  // gl_MaxGeometryImageUniforms
-    2573,  // gl_MaxGeometryTextureImageUnits
-    2577,  // gl_MaxGeometryOutputVertices
-    2581,  // gl_MaxGeometryTotalOutputComponents
-    2585,  // gl_MaxGeometryUniformComponents
-    2589,  // gl_MaxGeometryAtomicCounters
-    2593,  // gl_MaxGeometryAtomicCounterBuffers
-    2597,  // gl_MaxTessControlInputComponents
-    2600,  // gl_MaxTessControlOutputComponents
-    2603,  // gl_MaxTessControlTextureImageUnits
-    2606,  // gl_MaxTessControlUniformComponents
-    2609,  // gl_MaxTessControlTotalOutputComponents
-    2612,  // gl_MaxTessControlImageUniforms
-    2615,  // gl_MaxTessControlAtomicCounters
-    2618,  // gl_MaxTessControlAtomicCounterBuffers
-    2621,  // gl_MaxTessPatchComponents
-    2624,  // gl_MaxPatchVertices
-    2627,  // gl_MaxTessGenLevel
-    2630,  // gl_MaxTessEvaluationInputComponents
-    2633,  // gl_MaxTessEvaluationOutputComponents
-    2636,  // gl_MaxTessEvaluationTextureImageUnits
-    2639,  // gl_MaxTessEvaluationUniformComponents
-    2642,  // gl_MaxTessEvaluationImageUniforms
-    2645,  // gl_MaxTessEvaluationAtomicCounters
-    2648,  // gl_MaxTessEvaluationAtomicCounterBuffers
-    2651,  // gl_MaxSamples
-    2654,  // gl_MaxClipDistances
-    2655,  // gl_MaxCullDistances
-    2656,  // gl_MaxCombinedClipAndCullDistances
-    2657,  // gl_FragCoord
-    2659,  // gl_FrontFacing
-    2661,  // gl_PointCoord
-    2663,  // gl_FragColor
-    2665,  // gl_FragData
-    2667,  // gl_FragDepth
-    2669,  // gl_HelperInvocation
-    2671,  // gl_SecondaryFragColorEXT
-    2672,  // gl_SecondaryFragDataEXT
-    2673,  // gl_FragDepthEXT
-    2674,  // gl_LastFragData
-    2677,  // gl_LastFragColor
-    2678,  // gl_LastFragColorARM
-    2679,  // gl_PrimitiveID
-    2693,  // gl_Layer
-    2701,  // gl_SampleID
-    2704,  // gl_SamplePosition
-    2707,  // gl_SampleMaskIn
-    2710,  // gl_SampleMask
-    2713,  // gl_CullDistance
-    2715,  // gl_ClipDistance
-    2717,  // gl_Position
-    2729,  // gl_PointSize
-    2731,  // gl_InstanceID
-    2733,  // Empty
-    2733,  // gl_VertexID
-    2735,  // Empty
-    2735,  // Empty
-    2735,  // gl_DrawID
-    2736,  // gl_BaseVertex
-    2737,  // gl_BaseInstance
-    2738,  // angle_BaseVertex
-    2739,  // angle_BaseInstance
-    2740,  // gl_NumWorkGroups
-    2742,  // gl_WorkGroupSize
-    2744,  // gl_WorkGroupID
-    2746,  // gl_LocalInvocationID
-    2748,  // gl_GlobalInvocationID
-    2750,  // gl_LocalInvocationIndex
-    2752,  // gl_PrimitiveIDIn
-    2756,  // gl_InvocationID
-    2763,  // gl_PerVertex
-    2773,  // gl_in
-    2783,  // gl_PatchVerticesIn
-    2789,  // gl_TessLevelOuter
-    2795,  // gl_TessLevelInner
-    2801,  // gl_out
-    2807,  // gl_TessCoord
-    2809,  // gl_ViewID_OVR
+    1,     // radians_10B
+    2,     // radians_20B
+    3,     // radians_30B
+    4,     // degrees_00B
+    5,     // degrees_10B
+    6,     // degrees_20B
+    7,     // degrees_30B
+    8,     // sin_00B
+    9,     // sin_10B
+    10,    // sin_20B
+    11,    // sin_30B
+    12,    // cos_00B
+    13,    // cos_10B
+    14,    // cos_20B
+    15,    // cos_30B
+    16,    // tan_00B
+    17,    // tan_10B
+    18,    // tan_20B
+    19,    // tan_30B
+    20,    // asin_00B
+    21,    // asin_10B
+    22,    // asin_20B
+    23,    // asin_30B
+    24,    // acos_00B
+    25,    // acos_10B
+    26,    // acos_20B
+    27,    // acos_30B
+    28,    // atan_00B00B
+    29,    // atan_10B10B
+    30,    // atan_20B20B
+    31,    // atan_30B30B
+    32,    // atan_00B
+    33,    // atan_10B
+    34,    // atan_20B
+    35,    // atan_30B
+    36,    // sinh_00B
+    37,    // sinh_10B
+    38,    // sinh_20B
+    39,    // sinh_30B
+    40,    // cosh_00B
+    41,    // cosh_10B
+    42,    // cosh_20B
+    43,    // cosh_30B
+    44,    // tanh_00B
+    45,    // tanh_10B
+    46,    // tanh_20B
+    47,    // tanh_30B
+    48,    // asinh_00B
+    49,    // asinh_10B
+    50,    // asinh_20B
+    51,    // asinh_30B
+    52,    // acosh_00B
+    53,    // acosh_10B
+    54,    // acosh_20B
+    55,    // acosh_30B
+    56,    // atanh_00B
+    57,    // atanh_10B
+    58,    // atanh_20B
+    59,    // atanh_30B
+    60,    // pow_00B00B
+    61,    // pow_10B10B
+    62,    // pow_20B20B
+    63,    // pow_30B30B
+    64,    // exp_00B
+    65,    // exp_10B
+    66,    // exp_20B
+    67,    // exp_30B
+    68,    // log_00B
+    69,    // log_10B
+    70,    // log_20B
+    71,    // log_30B
+    72,    // exp2_00B
+    73,    // exp2_10B
+    74,    // exp2_20B
+    75,    // exp2_30B
+    76,    // log2_00B
+    77,    // log2_10B
+    78,    // log2_20B
+    79,    // log2_30B
+    80,    // sqrt_00B
+    81,    // sqrt_10B
+    82,    // sqrt_20B
+    83,    // sqrt_30B
+    84,    // inversesqrt_00B
+    85,    // inversesqrt_10B
+    86,    // inversesqrt_20B
+    87,    // inversesqrt_30B
+    88,    // abs_00B
+    89,    // abs_10B
+    90,    // abs_20B
+    91,    // abs_30B
+    92,    // abs_00D
+    93,    // abs_10D
+    94,    // abs_20D
+    95,    // abs_30D
+    96,    // sign_00B
+    97,    // sign_10B
+    98,    // sign_20B
+    99,    // sign_30B
+    100,   // sign_00D
+    101,   // sign_10D
+    102,   // sign_20D
+    103,   // sign_30D
+    104,   // floor_00B
+    105,   // floor_10B
+    106,   // floor_20B
+    107,   // floor_30B
+    108,   // trunc_00B
+    109,   // trunc_10B
+    110,   // trunc_20B
+    111,   // trunc_30B
+    112,   // round_00B
+    113,   // round_10B
+    114,   // round_20B
+    115,   // round_30B
+    116,   // roundEven_00B
+    117,   // roundEven_10B
+    118,   // roundEven_20B
+    119,   // roundEven_30B
+    120,   // ceil_00B
+    121,   // ceil_10B
+    122,   // ceil_20B
+    123,   // ceil_30B
+    124,   // fract_00B
+    125,   // fract_10B
+    126,   // fract_20B
+    127,   // fract_30B
+    128,   // mod_00B00B
+    129,   // mod_10B00B
+    130,   // mod_20B00B
+    131,   // mod_30B00B
+    132,   // mod_10B10B
+    133,   // mod_20B20B
+    134,   // mod_30B30B
+    135,   // min_00B00B
+    136,   // min_10B00B
+    137,   // min_20B00B
+    138,   // min_30B00B
+    139,   // min_10B10B
+    140,   // min_20B20B
+    141,   // min_30B30B
+    142,   // min_00D00D
+    143,   // min_10D10D
+    144,   // min_20D20D
+    145,   // min_30D30D
+    146,   // min_10D00D
+    147,   // min_20D00D
+    148,   // min_30D00D
+    149,   // min_00E00E
+    150,   // min_10E10E
+    151,   // min_20E20E
+    152,   // min_30E30E
+    153,   // min_10E00E
+    154,   // min_20E00E
+    155,   // min_30E00E
+    156,   // max_00B00B
+    157,   // max_10B00B
+    158,   // max_20B00B
+    159,   // max_30B00B
+    160,   // max_10B10B
+    161,   // max_20B20B
+    162,   // max_30B30B
+    163,   // max_00D00D
+    164,   // max_10D10D
+    165,   // max_20D20D
+    166,   // max_30D30D
+    167,   // max_10D00D
+    168,   // max_20D00D
+    169,   // max_30D00D
+    170,   // max_00E00E
+    171,   // max_10E10E
+    172,   // max_20E20E
+    173,   // max_30E30E
+    174,   // max_10E00E
+    175,   // max_20E00E
+    176,   // max_30E00E
+    177,   // clamp_00B00B00B
+    178,   // clamp_10B00B00B
+    179,   // clamp_20B00B00B
+    180,   // clamp_30B00B00B
+    181,   // clamp_10B10B10B
+    182,   // clamp_20B20B20B
+    183,   // clamp_30B30B30B
+    184,   // clamp_00D00D00D
+    185,   // clamp_10D00D00D
+    186,   // clamp_20D00D00D
+    187,   // clamp_30D00D00D
+    188,   // clamp_10D10D10D
+    189,   // clamp_20D20D20D
+    190,   // clamp_30D30D30D
+    191,   // clamp_00E00E00E
+    192,   // clamp_10E00E00E
+    193,   // clamp_20E00E00E
+    194,   // clamp_30E00E00E
+    195,   // clamp_10E10E10E
+    196,   // clamp_20E20E20E
+    197,   // clamp_30E30E30E
+    198,   // mix_00B00B00B
+    199,   // mix_10B10B00B
+    200,   // mix_20B20B00B
+    201,   // mix_30B30B00B
+    202,   // mix_10B10B10B
+    203,   // mix_20B20B20B
+    204,   // mix_30B30B30B
+    205,   // mix_00B00B00F
+    206,   // mix_10B10B10F
+    207,   // mix_20B20B20F
+    208,   // mix_30B30B30F
+    209,   // mix_00D00D00F
+    210,   // mix_10D10D10F
+    211,   // mix_20D20D20F
+    212,   // mix_30D30D30F
+    213,   // mix_00E00E00F
+    214,   // mix_10E10E10F
+    215,   // mix_20E20E20F
+    216,   // mix_30E30E30F
+    217,   // mix_00F00F00F
+    218,   // mix_10F10F10F
+    219,   // mix_20F20F20F
+    220,   // mix_30F30F30F
+    221,   // step_00B00B
+    222,   // step_10B10B
+    223,   // step_20B20B
+    224,   // step_30B30B
+    225,   // step_00B10B
+    226,   // step_00B20B
+    227,   // step_00B30B
+    228,   // smoothstep_00B00B00B
+    229,   // smoothstep_10B10B10B
+    230,   // smoothstep_20B20B20B
+    231,   // smoothstep_30B30B30B
+    232,   // smoothstep_00B00B10B
+    233,   // smoothstep_00B00B20B
+    234,   // smoothstep_00B00B30B
+    235,   // modf_00B00B
+    236,   // modf_10B10B
+    237,   // modf_20B20B
+    238,   // modf_30B30B
+    239,   // isnan_00B
+    240,   // isnan_10B
+    241,   // isnan_20B
+    242,   // isnan_30B
+    243,   // isinf_00B
+    244,   // isinf_10B
+    245,   // isinf_20B
+    246,   // isinf_30B
+    247,   // floatBitsToInt_00B
+    248,   // floatBitsToInt_10B
+    249,   // floatBitsToInt_20B
+    250,   // floatBitsToInt_30B
+    251,   // floatBitsToUint_00B
+    252,   // floatBitsToUint_10B
+    253,   // floatBitsToUint_20B
+    254,   // floatBitsToUint_30B
+    255,   // intBitsToFloat_00D
+    256,   // intBitsToFloat_10D
+    257,   // intBitsToFloat_20D
+    258,   // intBitsToFloat_30D
+    259,   // uintBitsToFloat_00E
+    260,   // uintBitsToFloat_10E
+    261,   // uintBitsToFloat_20E
+    262,   // uintBitsToFloat_30E
+    263,   // fma_00B00B00B
+    265,   // fma_10B10B10B
+    267,   // fma_20B20B20B
+    269,   // fma_30B30B30B
+    271,   // frexp_00B00D
+    272,   // frexp_10B10D
+    273,   // frexp_20B20D
+    274,   // frexp_30B30D
+    275,   // ldexp_00B00D
+    276,   // ldexp_10B10D
+    277,   // ldexp_20B20D
+    278,   // ldexp_30B30D
+    279,   // packSnorm2x16_10B
+    280,   // packHalf2x16_10B
+    281,   // unpackSnorm2x16_00E
+    282,   // unpackHalf2x16_00E
+    283,   // packUnorm2x16_10B
+    284,   // unpackUnorm2x16_00E
+    285,   // packUnorm4x8_30B
+    286,   // packSnorm4x8_30B
+    287,   // unpackUnorm4x8_00E
+    288,   // unpackSnorm4x8_00E
+    289,   // length_00B
+    290,   // length_10B
+    291,   // length_20B
+    292,   // length_30B
+    293,   // distance_00B00B
+    294,   // distance_10B10B
+    295,   // distance_20B20B
+    296,   // distance_30B30B
+    297,   // dot_00B00B
+    298,   // dot_10B10B
+    299,   // dot_20B20B
+    300,   // dot_30B30B
+    301,   // cross_20B20B
+    302,   // normalize_00B
+    303,   // normalize_10B
+    304,   // normalize_20B
+    305,   // normalize_30B
+    306,   // faceforward_00B00B00B
+    307,   // faceforward_10B10B10B
+    308,   // faceforward_20B20B20B
+    309,   // faceforward_30B30B30B
+    310,   // reflect_00B00B
+    311,   // reflect_10B10B
+    312,   // reflect_20B20B
+    313,   // reflect_30B30B
+    314,   // refract_00B00B00B
+    315,   // refract_10B10B00B
+    316,   // refract_20B20B00B
+    317,   // refract_30B30B00B
+    318,   // matrixCompMult_50B50B
+    319,   // matrixCompMult_A0BA0B
+    320,   // matrixCompMult_F0BF0B
+    321,   // matrixCompMult_90B90B
+    322,   // matrixCompMult_60B60B
+    323,   // matrixCompMult_D0BD0B
+    324,   // matrixCompMult_70B70B
+    325,   // matrixCompMult_E0BE0B
+    326,   // matrixCompMult_B0BB0B
+    327,   // outerProduct_10B10B
+    328,   // outerProduct_20B20B
+    329,   // outerProduct_30B30B
+    330,   // outerProduct_20B10B
+    331,   // outerProduct_10B20B
+    332,   // outerProduct_30B10B
+    333,   // outerProduct_10B30B
+    334,   // outerProduct_30B20B
+    335,   // outerProduct_20B30B
+    336,   // transpose_50B
+    337,   // transpose_A0B
+    338,   // transpose_F0B
+    339,   // transpose_60B
+    340,   // transpose_90B
+    341,   // transpose_70B
+    342,   // transpose_D0B
+    343,   // transpose_B0B
+    344,   // transpose_E0B
+    345,   // determinant_50B
+    346,   // determinant_A0B
+    347,   // determinant_F0B
+    348,   // inverse_50B
+    349,   // inverse_A0B
+    350,   // inverse_F0B
+    351,   // lessThan_10B10B
+    352,   // lessThan_20B20B
+    353,   // lessThan_30B30B
+    354,   // lessThan_10D10D
+    355,   // lessThan_20D20D
+    356,   // lessThan_30D30D
+    357,   // lessThan_10E10E
+    358,   // lessThan_20E20E
+    359,   // lessThan_30E30E
+    360,   // lessThanEqual_10B10B
+    361,   // lessThanEqual_20B20B
+    362,   // lessThanEqual_30B30B
+    363,   // lessThanEqual_10D10D
+    364,   // lessThanEqual_20D20D
+    365,   // lessThanEqual_30D30D
+    366,   // lessThanEqual_10E10E
+    367,   // lessThanEqual_20E20E
+    368,   // lessThanEqual_30E30E
+    369,   // greaterThan_10B10B
+    370,   // greaterThan_20B20B
+    371,   // greaterThan_30B30B
+    372,   // greaterThan_10D10D
+    373,   // greaterThan_20D20D
+    374,   // greaterThan_30D30D
+    375,   // greaterThan_10E10E
+    376,   // greaterThan_20E20E
+    377,   // greaterThan_30E30E
+    378,   // greaterThanEqual_10B10B
+    379,   // greaterThanEqual_20B20B
+    380,   // greaterThanEqual_30B30B
+    381,   // greaterThanEqual_10D10D
+    382,   // greaterThanEqual_20D20D
+    383,   // greaterThanEqual_30D30D
+    384,   // greaterThanEqual_10E10E
+    385,   // greaterThanEqual_20E20E
+    386,   // greaterThanEqual_30E30E
+    387,   // equal_10B10B
+    388,   // equal_20B20B
+    389,   // equal_30B30B
+    390,   // equal_10D10D
+    391,   // equal_20D20D
+    392,   // equal_30D30D
+    393,   // equal_10E10E
+    394,   // equal_20E20E
+    395,   // equal_30E30E
+    396,   // equal_10F10F
+    397,   // equal_20F20F
+    398,   // equal_30F30F
+    399,   // notEqual_10B10B
+    400,   // notEqual_20B20B
+    401,   // notEqual_30B30B
+    402,   // notEqual_10D10D
+    403,   // notEqual_20D20D
+    404,   // notEqual_30D30D
+    405,   // notEqual_10E10E
+    406,   // notEqual_20E20E
+    407,   // notEqual_30E30E
+    408,   // notEqual_10F10F
+    409,   // notEqual_20F20F
+    410,   // notEqual_30F30F
+    411,   // any_10F
+    412,   // any_20F
+    413,   // any_30F
+    414,   // all_10F
+    415,   // all_20F
+    416,   // all_30F
+    417,   // not_10F
+    418,   // not_20F
+    419,   // not_30F
+    420,   // bitfieldExtract_00D00D00D
+    421,   // bitfieldExtract_10D00D00D
+    422,   // bitfieldExtract_20D00D00D
+    423,   // bitfieldExtract_30D00D00D
+    424,   // bitfieldExtract_00E00D00D
+    425,   // bitfieldExtract_10E00D00D
+    426,   // bitfieldExtract_20E00D00D
+    427,   // bitfieldExtract_30E00D00D
+    428,   // bitfieldInsert_00D00D00D00D
+    429,   // bitfieldInsert_10D10D00D00D
+    430,   // bitfieldInsert_20D20D00D00D
+    431,   // bitfieldInsert_30D30D00D00D
+    432,   // bitfieldInsert_00E00E00D00D
+    433,   // bitfieldInsert_10E10E00D00D
+    434,   // bitfieldInsert_20E20E00D00D
+    435,   // bitfieldInsert_30E30E00D00D
+    436,   // bitfieldReverse_00D
+    437,   // bitfieldReverse_10D
+    438,   // bitfieldReverse_20D
+    439,   // bitfieldReverse_30D
+    440,   // bitfieldReverse_00E
+    441,   // bitfieldReverse_10E
+    442,   // bitfieldReverse_20E
+    443,   // bitfieldReverse_30E
+    444,   // bitCount_00D
+    445,   // bitCount_10D
+    446,   // bitCount_20D
+    447,   // bitCount_30D
+    448,   // bitCount_00E
+    449,   // bitCount_10E
+    450,   // bitCount_20E
+    451,   // bitCount_30E
+    452,   // findLSB_00D
+    453,   // findLSB_10D
+    454,   // findLSB_20D
+    455,   // findLSB_30D
+    456,   // findLSB_00E
+    457,   // findLSB_10E
+    458,   // findLSB_20E
+    459,   // findLSB_30E
+    460,   // findMSB_00D
+    461,   // findMSB_10D
+    462,   // findMSB_20D
+    463,   // findMSB_30D
+    464,   // findMSB_00E
+    465,   // findMSB_10E
+    466,   // findMSB_20E
+    467,   // findMSB_30E
+    468,   // uaddCarry_00E00E00E
+    469,   // uaddCarry_10E10E10E
+    470,   // uaddCarry_20E20E20E
+    471,   // uaddCarry_30E30E30E
+    472,   // usubBorrow_00E00E00E
+    473,   // usubBorrow_10E10E10E
+    474,   // usubBorrow_20E20E20E
+    475,   // usubBorrow_30E30E30E
+    476,   // umulExtended_00E00E00E00E
+    477,   // umulExtended_10E10E10E10E
+    478,   // umulExtended_20E20E20E20E
+    479,   // umulExtended_30E30E30E30E
+    480,   // imulExtended_00D00D00D00D
+    481,   // imulExtended_10D10D10D10D
+    482,   // imulExtended_20D20D20D20D
+    483,   // imulExtended_30D30D30D30D
+    484,   // texture2D_00I10B
+    485,   // texture2DProj_00I20B
+    486,   // texture2DProj_00I30B
+    487,   // textureCube_00K20B
+    488,   // texture3D_00J20B
+    489,   // texture3DProj_00J30B
+    490,   // shadow2DEXT_00d20B
+    491,   // shadow2DProjEXT_00d30B
+    492,   // texture2D_00M10B
+    494,   // texture2DProj_00M20B
+    496,   // texture2DProj_00M30B
+    498,   // texture2DRect_00O10B
+    499,   // texture2DRectProj_00O20B
+    500,   // texture2DRectProj_00O30B
+    501,   // texture2DGradEXT_00I10B10B10B
+    502,   // texture2DProjGradEXT_00I20B10B10B
+    503,   // texture2DProjGradEXT_00I30B10B10B
+    504,   // textureCubeGradEXT_00K20B20B20B
+    505,   // textureVideoWEBGL_00y10B
+    506,   // texture2D_00I10B00B
+    507,   // texture2DProj_00I20B00B
+    508,   // texture2DProj_00I30B00B
+    509,   // textureCube_00K20B00B
+    510,   // texture3D_00J20B00B
+    511,   // texture3DProj_00J30B00B
+    512,   // texture3DLod_00J20B00B
+    513,   // texture3DProjLod_00J30B00B
+    514,   // texture2DLod_00I10B00B
+    515,   // texture2DProjLod_00I20B00B
+    516,   // texture2DProjLod_00I30B00B
+    517,   // textureCubeLod_00K20B00B
+    518,   // texture2DLodEXT_00I10B00B
+    519,   // texture2DProjLodEXT_00I20B00B
+    520,   // texture2DProjLodEXT_00I30B00B
+    521,   // textureCubeLodEXT_00K20B00B
+    522,   // texture_00I10B
+    523,   // texture_00R10B
+    524,   // texture_00X10B
+    525,   // texture_00J20B
+    526,   // texture_00S20B
+    527,   // texture_00Y20B
+    528,   // texture_00K20B
+    529,   // texture_00T20B
+    530,   // texture_00Z20B
+    531,   // texture_00L20B
+    532,   // texture_00U20B
+    533,   // texture_00a20B
+    534,   // texture_00d20B
+    535,   // texture_00e30B
+    536,   // texture_00f30B
+    537,   // texture_00k30B
+    540,   // texture_00s30B
+    543,   // texture_00x30B
+    546,   // texture_00l30B00B
+    549,   // texture_00M10B
+    550,   // texture_00N10B
+    551,   // texture_00O10B
+    552,   // texture_00y10B
+    553,   // textureProj_00I20B
+    554,   // textureProj_00R20B
+    555,   // textureProj_00X20B
+    556,   // textureProj_00I30B
+    557,   // textureProj_00R30B
+    558,   // textureProj_00X30B
+    559,   // textureProj_00J30B
+    560,   // textureProj_00S30B
+    561,   // textureProj_00Y30B
+    562,   // textureProj_00d30B
+    563,   // textureProj_00M20B
+    564,   // textureProj_00M30B
+    565,   // textureProj_00N20B
+    566,   // textureProj_00N30B
+    567,   // textureProj_00O20B
+    568,   // textureProj_00O30B
+    569,   // textureLod_00I10B00B
+    570,   // textureLod_00R10B00B
+    571,   // textureLod_00X10B00B
+    572,   // textureLod_00J20B00B
+    573,   // textureLod_00S20B00B
+    574,   // textureLod_00Y20B00B
+    575,   // textureLod_00K20B00B
+    576,   // textureLod_00T20B00B
+    577,   // textureLod_00Z20B00B
+    578,   // textureLod_00L20B00B
+    579,   // textureLod_00U20B00B
+    580,   // textureLod_00a20B00B
+    581,   // textureLod_00d20B00B
+    582,   // textureLod_00k30B00B
+    585,   // textureLod_00s30B00B
+    588,   // textureLod_00x30B00B
+    591,   // textureSize_00I00D
+    592,   // textureSize_00R00D
+    593,   // textureSize_00X00D
+    594,   // textureSize_00J00D
+    595,   // textureSize_00S00D
+    596,   // textureSize_00Y00D
+    597,   // textureSize_00K00D
+    598,   // textureSize_00T00D
+    599,   // textureSize_00Z00D
+    600,   // textureSize_00L00D
+    601,   // textureSize_00U00D
+    602,   // textureSize_00a00D
+    603,   // textureSize_00d00D
+    604,   // textureSize_00e00D
+    605,   // textureSize_00f00D
+    606,   // textureSize_00k00D
+    609,   // textureSize_00s00D
+    612,   // textureSize_00x00D
+    615,   // textureSize_00l00D
+    618,   // textureSize_00j
+    621,   // textureSize_00r
+    624,   // textureSize_00w
+    627,   // textureSize_00P
+    629,   // textureSize_00V
+    631,   // textureSize_00b
+    633,   // textureSize_00Q
+    634,   // textureSize_00W
+    635,   // textureSize_00c
+    636,   // textureSize_00M00D
+    637,   // textureSize_00N00D
+    638,   // textureProjLod_00I20B00B
+    639,   // textureProjLod_00R20B00B
+    640,   // textureProjLod_00X20B00B
+    641,   // textureProjLod_00I30B00B
+    642,   // textureProjLod_00R30B00B
+    643,   // textureProjLod_00X30B00B
+    644,   // textureProjLod_00J30B00B
+    645,   // textureProjLod_00S30B00B
+    646,   // textureProjLod_00Y30B00B
+    647,   // textureProjLod_00d30B00B
+    648,   // texelFetch_00I10D00D
+    649,   // texelFetch_00R10D00D
+    650,   // texelFetch_00X10D00D
+    651,   // texelFetch_00J20D00D
+    652,   // texelFetch_00S20D00D
+    653,   // texelFetch_00Y20D00D
+    654,   // texelFetch_00L20D00D
+    655,   // texelFetch_00U20D00D
+    656,   // texelFetch_00a20D00D
+    657,   // texelFetch_00j00D
+    660,   // texelFetch_00r00D
+    663,   // texelFetch_00w00D
+    666,   // texelFetch_00P10D00D
+    668,   // texelFetch_00V10D00D
+    670,   // texelFetch_00b10D00D
+    672,   // texelFetch_00Q20D00D
+    673,   // texelFetch_00W20D00D
+    674,   // texelFetch_00c20D00D
+    675,   // texelFetch_00M10D00D
+    676,   // texelFetch_00N10D00D
+    677,   // textureGrad_00I10B10B10B
+    678,   // textureGrad_00R10B10B10B
+    679,   // textureGrad_00X10B10B10B
+    680,   // textureGrad_00J20B20B20B
+    681,   // textureGrad_00S20B20B20B
+    682,   // textureGrad_00Y20B20B20B
+    683,   // textureGrad_00K20B20B20B
+    684,   // textureGrad_00T20B20B20B
+    685,   // textureGrad_00Z20B20B20B
+    686,   // textureGrad_00d20B10B10B
+    687,   // textureGrad_00e30B20B20B
+    688,   // textureGrad_00L20B10B10B
+    689,   // textureGrad_00U20B10B10B
+    690,   // textureGrad_00a20B10B10B
+    691,   // textureGrad_00f30B10B10B
+    692,   // textureGrad_00k30B20B20B
+    695,   // textureGrad_00s30B20B20B
+    698,   // textureGrad_00x30B20B20B
+    701,   // textureProjGrad_00I20B10B10B
+    702,   // textureProjGrad_00R20B10B10B
+    703,   // textureProjGrad_00X20B10B10B
+    704,   // textureProjGrad_00I30B10B10B
+    705,   // textureProjGrad_00R30B10B10B
+    706,   // textureProjGrad_00X30B10B10B
+    707,   // textureProjGrad_00J30B20B20B
+    708,   // textureProjGrad_00S30B20B20B
+    709,   // textureProjGrad_00Y30B20B20B
+    710,   // textureProjGrad_00d30B10B10B
+    711,   // texture_00I10B00B
+    712,   // texture_00R10B00B
+    713,   // texture_00X10B00B
+    714,   // texture_00J20B00B
+    715,   // texture_00S20B00B
+    716,   // texture_00Y20B00B
+    717,   // texture_00K20B00B
+    718,   // texture_00T20B00B
+    719,   // texture_00Z20B00B
+    720,   // texture_00L20B00B
+    721,   // texture_00U20B00B
+    722,   // texture_00a20B00B
+    723,   // textureProj_00I20B00B
+    724,   // textureProj_00R20B00B
+    725,   // textureProj_00X20B00B
+    726,   // textureProj_00I30B00B
+    727,   // textureProj_00R30B00B
+    728,   // textureProj_00X30B00B
+    729,   // textureProj_00J30B00B
+    730,   // textureProj_00S30B00B
+    731,   // textureProj_00Y30B00B
+    732,   // texture_00d20B00B
+    733,   // texture_00e30B00B
+    734,   // textureProj_00d30B00B
+    735,   // texture_00k30B00B
+    738,   // texture_00s30B00B
+    741,   // texture_00x30B00B
+    744,   // texture_00M10B00B
+    745,   // textureProj_00M20B00B
+    746,   // textureProj_00M30B00B
+    747,   // texture_00N10B00B
+    748,   // textureProj_00N20B00B
+    749,   // textureProj_00N30B00B
+    750,   // textureOffset_00I10B10D
+    751,   // textureOffset_00R10B10D
+    752,   // textureOffset_00X10B10D
+    753,   // textureOffset_00J20B20D
+    754,   // textureOffset_00S20B20D
+    755,   // textureOffset_00Y20B20D
+    756,   // textureOffset_00d20B10D
+    757,   // textureOffset_00L20B10D
+    758,   // textureOffset_00U20B10D
+    759,   // textureOffset_00a20B10D
+    760,   // textureProjOffset_00I20B10D
+    761,   // textureProjOffset_00R20B10D
+    762,   // textureProjOffset_00X20B10D
+    763,   // textureProjOffset_00I30B10D
+    764,   // textureProjOffset_00R30B10D
+    765,   // textureProjOffset_00X30B10D
+    766,   // textureProjOffset_00J30B20D
+    767,   // textureProjOffset_00S30B20D
+    768,   // textureProjOffset_00Y30B20D
+    769,   // textureProjOffset_00d30B10D
+    770,   // textureLodOffset_00I10B00B10D
+    771,   // textureLodOffset_00R10B00B10D
+    772,   // textureLodOffset_00X10B00B10D
+    773,   // textureLodOffset_00J20B00B20D
+    774,   // textureLodOffset_00S20B00B20D
+    775,   // textureLodOffset_00Y20B00B20D
+    776,   // textureLodOffset_00d20B00B10D
+    777,   // textureLodOffset_00L20B00B10D
+    778,   // textureLodOffset_00U20B00B10D
+    779,   // textureLodOffset_00a20B00B10D
+    780,   // textureProjLodOffset_00I20B00B10D
+    781,   // textureProjLodOffset_00R20B00B10D
+    782,   // textureProjLodOffset_00X20B00B10D
+    783,   // textureProjLodOffset_00I30B00B10D
+    784,   // textureProjLodOffset_00R30B00B10D
+    785,   // textureProjLodOffset_00X30B00B10D
+    786,   // textureProjLodOffset_00J30B00B20D
+    787,   // textureProjLodOffset_00S30B00B20D
+    788,   // textureProjLodOffset_00Y30B00B20D
+    789,   // textureProjLodOffset_00d30B00B10D
+    790,   // texelFetchOffset_00I10D00D10D
+    791,   // texelFetchOffset_00R10D00D10D
+    792,   // texelFetchOffset_00X10D00D10D
+    793,   // texelFetchOffset_00J20D00D20D
+    794,   // texelFetchOffset_00S20D00D20D
+    795,   // texelFetchOffset_00Y20D00D20D
+    796,   // texelFetchOffset_00L20D00D10D
+    797,   // texelFetchOffset_00U20D00D10D
+    798,   // texelFetchOffset_00a20D00D10D
+    799,   // textureGradOffset_00I10B10B10B10D
+    800,   // textureGradOffset_00R10B10B10B10D
+    801,   // textureGradOffset_00X10B10B10B10D
+    802,   // textureGradOffset_00J20B20B20B20D
+    803,   // textureGradOffset_00S20B20B20B20D
+    804,   // textureGradOffset_00Y20B20B20B20D
+    805,   // textureGradOffset_00d20B10B10B10D
+    806,   // textureGradOffset_00L20B10B10B10D
+    807,   // textureGradOffset_00U20B10B10B10D
+    808,   // textureGradOffset_00a20B10B10B10D
+    809,   // textureGradOffset_00f30B10B10B10D
+    810,   // textureProjGradOffset_00I20B10B10B10D
+    811,   // textureProjGradOffset_00R20B10B10B10D
+    812,   // textureProjGradOffset_00X20B10B10B10D
+    813,   // textureProjGradOffset_00I30B10B10B10D
+    814,   // textureProjGradOffset_00R30B10B10B10D
+    815,   // textureProjGradOffset_00X30B10B10B10D
+    816,   // textureProjGradOffset_00J30B20B20B20D
+    817,   // textureProjGradOffset_00S30B20B20B20D
+    818,   // textureProjGradOffset_00Y30B20B20B20D
+    819,   // textureProjGradOffset_00d30B10B10B10D
+    820,   // textureOffset_00I10B10D00B
+    821,   // textureOffset_00R10B10D00B
+    822,   // textureOffset_00X10B10D00B
+    823,   // textureOffset_00J20B20D00B
+    824,   // textureOffset_00S20B20D00B
+    825,   // textureOffset_00Y20B20D00B
+    826,   // textureOffset_00d20B10D00B
+    827,   // textureOffset_00L20B10D00B
+    828,   // textureOffset_00U20B10D00B
+    829,   // textureOffset_00a20B10D00B
+    830,   // textureProjOffset_00I20B10D00B
+    831,   // textureProjOffset_00R20B10D00B
+    832,   // textureProjOffset_00X20B10D00B
+    833,   // textureProjOffset_00I30B10D00B
+    834,   // textureProjOffset_00R30B10D00B
+    835,   // textureProjOffset_00X30B10D00B
+    836,   // textureProjOffset_00J30B20D00B
+    837,   // textureProjOffset_00S30B20D00B
+    838,   // textureProjOffset_00Y30B20D00B
+    839,   // textureProjOffset_00d30B10D00B
+    840,   // textureGather_00I10B
+    841,   // textureGather_00R10B
+    842,   // textureGather_00X10B
+    843,   // textureGather_00I10B00D
+    844,   // textureGather_00R10B00D
+    845,   // textureGather_00X10B00D
+    846,   // textureGather_00L20B
+    847,   // textureGather_00U20B
+    848,   // textureGather_00a20B
+    849,   // textureGather_00L20B00D
+    850,   // textureGather_00U20B00D
+    851,   // textureGather_00a20B00D
+    852,   // textureGather_00K20B
+    853,   // textureGather_00T20B
+    854,   // textureGather_00Z20B
+    855,   // textureGather_00K20B00D
+    856,   // textureGather_00T20B00D
+    857,   // textureGather_00Z20B00D
+    858,   // textureGather_00k30B
+    861,   // textureGather_00s30B
+    864,   // textureGather_00x30B
+    867,   // textureGather_00k30B00D
+    870,   // textureGather_00s30B00D
+    873,   // textureGather_00x30B00D
+    876,   // textureGather_00l30B00B
+    879,   // textureGather_00d10B
+    880,   // textureGather_00d10B00B
+    881,   // textureGather_00f20B
+    882,   // textureGather_00f20B00B
+    883,   // textureGather_00e20B
+    884,   // textureGather_00e20B00B
+    885,   // textureGatherOffset_00I10B10D
+    886,   // textureGatherOffset_00R10B10D
+    887,   // textureGatherOffset_00X10B10D
+    888,   // textureGatherOffset_00L20B10D
+    889,   // textureGatherOffset_00U20B10D
+    890,   // textureGatherOffset_00a20B10D
+    891,   // textureGatherOffset_00d10B00B10D
+    892,   // textureGatherOffset_00f20B00B10D
+    893,   // textureGatherOffset_00I10B10D00D
+    894,   // textureGatherOffset_00R10B10D00D
+    895,   // textureGatherOffset_00X10B10D00D
+    896,   // textureGatherOffset_00L20B10D00D
+    897,   // textureGatherOffset_00U20B10D00D
+    898,   // textureGatherOffset_00a20B10D00D
+    899,   // textureGatherOffsets_00I10B10Dx4
+    901,   // textureGatherOffsets_00R10B10Dx4
+    903,   // textureGatherOffsets_00X10B10Dx4
+    905,   // textureGatherOffsets_00L20B10Dx4
+    907,   // textureGatherOffsets_00U20B10Dx4
+    909,   // textureGatherOffsets_00a20B10Dx4
+    911,   // textureGatherOffsets_00d10B00B10Dx4
+    913,   // textureGatherOffsets_00f20B00B10Dx4
+    915,   // textureGatherOffsets_00I10B10Dx400D
+    917,   // textureGatherOffsets_00R10B10Dx400D
+    919,   // textureGatherOffsets_00X10B10Dx400D
+    921,   // textureGatherOffsets_00L20B10Dx400D
+    923,   // textureGatherOffsets_00U20B10Dx400D
+    925,   // textureGatherOffsets_00a20B10Dx400D
+    927,   // rgb_2_yuv_20B00H
+    928,   // yuv_2_rgb_20B00H
+    929,   // dFdx_00B
+    931,   // dFdx_10B
+    933,   // dFdx_20B
+    935,   // dFdx_30B
+    937,   // dFdy_00B
+    939,   // dFdy_10B
+    941,   // dFdy_20B
+    943,   // dFdy_30B
+    945,   // fwidth_00B
+    947,   // fwidth_10B
+    949,   // fwidth_20B
+    951,   // fwidth_30B
+    953,   // interpolateAtCentroid_00B
+    955,   // interpolateAtCentroid_10B
+    957,   // interpolateAtCentroid_20B
+    959,   // interpolateAtCentroid_30B
+    961,   // interpolateAtSample_00B00D
+    963,   // interpolateAtSample_10B00D
+    965,   // interpolateAtSample_20B00D
+    967,   // interpolateAtSample_30B00D
+    969,   // interpolateAtOffset_00B10B
+    971,   // interpolateAtOffset_10B10B
+    973,   // interpolateAtOffset_20B10B
+    975,   // interpolateAtOffset_30B10B
+    977,   // atomicCounter_00G
+    978,   // atomicCounterIncrement_00G
+    979,   // atomicCounterDecrement_00G
+    980,   // atomicAdd_00E00E
+    981,   // atomicAdd_00D00D
+    982,   // atomicMin_00E00E
+    983,   // atomicMin_00D00D
+    984,   // atomicMax_00E00E
+    985,   // atomicMax_00D00D
+    986,   // atomicAnd_00E00E
+    987,   // atomicAnd_00D00D
+    988,   // atomicOr_00E00E
+    989,   // atomicOr_00D00D
+    990,   // atomicXor_00E00E
+    991,   // atomicXor_00D00D
+    992,   // atomicExchange_00E00E
+    993,   // atomicExchange_00D00D
+    994,   // atomicCompSwap_00E00E00E
+    995,   // atomicCompSwap_00D00D00D
+    996,   // imageSize_00z
+    997,   // imageSize_01K
+    998,   // imageSize_01V
+    999,   // imageSize_01A
+    1000,  // imageSize_01L
+    1001,  // imageSize_01W
+    1002,  // imageSize_01B
+    1003,  // imageSize_01M
+    1004,  // imageSize_01X
+    1005,  // imageSize_01C
+    1006,  // imageSize_01N
+    1007,  // imageSize_01Y
+    1008,  // imageSize_01H
+    1011,  // imageSize_01S
+    1014,  // imageSize_01d
+    1017,  // imageSize_01J
+    1020,  // imageSize_01U
+    1023,  // imageSize_01f
+    1026,  // imageStore_00z10D30B
+    1027,  // imageStore_01K10D30D
+    1028,  // imageStore_01V10D30E
+    1029,  // imageStore_01A20D30B
+    1030,  // imageStore_01L20D30D
+    1031,  // imageStore_01W20D30E
+    1032,  // imageStore_01B20D30B
+    1033,  // imageStore_01M20D30D
+    1034,  // imageStore_01X20D30E
+    1035,  // imageStore_01C20D30B
+    1036,  // imageStore_01N20D30D
+    1037,  // imageStore_01Y20D30E
+    1038,  // imageStore_01H20D30B
+    1041,  // imageStore_01S20D30D
+    1044,  // imageStore_01d20D30E
+    1047,  // imageStore_01J00D30B
+    1050,  // imageStore_01U00D30D
+    1053,  // imageStore_01f00D30E
+    1056,  // imageLoad_00z10D
+    1057,  // imageLoad_01K10D
+    1058,  // imageLoad_01V10D
+    1059,  // imageLoad_01A20D
+    1060,  // imageLoad_01L20D
+    1061,  // imageLoad_01W20D
+    1062,  // imageLoad_01B20D
+    1063,  // imageLoad_01M20D
+    1064,  // imageLoad_01X20D
+    1065,  // imageLoad_01C20D
+    1066,  // imageLoad_01N20D
+    1067,  // imageLoad_01Y20D
+    1068,  // imageLoad_01H20D
+    1071,  // imageLoad_01S20D
+    1074,  // imageLoad_01d20D
+    1077,  // imageLoad_01J00D
+    1080,  // imageLoad_01U00D
+    1083,  // imageLoad_01f00D
+    1086,  // imageAtomicAdd_00z10D00E
+    1087,  // imageAtomicAdd_01K10D00E
+    1088,  // imageAtomicAdd_01V10D00E
+    1089,  // imageAtomicAdd_01A20D00E
+    1090,  // imageAtomicAdd_01L20D00E
+    1091,  // imageAtomicAdd_01W20D00E
+    1092,  // imageAtomicAdd_01C20D00E
+    1093,  // imageAtomicAdd_01N20D00E
+    1094,  // imageAtomicAdd_01Y20D00E
+    1095,  // imageAtomicAdd_01J00D00E
+    1096,  // imageAtomicAdd_01U00D00E
+    1097,  // imageAtomicAdd_01f00D00E
+    1098,  // imageAtomicAdd_01B20D00E
+    1099,  // imageAtomicAdd_01M20D00E
+    1100,  // imageAtomicAdd_01X20D00E
+    1101,  // imageAtomicAdd_01H20D00E
+    1102,  // imageAtomicAdd_01S20D00E
+    1103,  // imageAtomicAdd_01d20D00E
+    1104,  // imageAtomicAdd_01D00D00E
+    1105,  // imageAtomicAdd_01O00D00E
+    1106,  // imageAtomicAdd_01Z00D00E
+    1107,  // imageAtomicAdd_01E10D00E
+    1108,  // imageAtomicAdd_01P10D00E
+    1109,  // imageAtomicAdd_01a10D00E
+    1110,  // imageAtomicAdd_01I10D00E
+    1111,  // imageAtomicAdd_01T10D00E
+    1112,  // imageAtomicAdd_01e10D00E
+    1113,  // imageAtomicAdd_01F10D00D00E
+    1114,  // imageAtomicAdd_01Q10D00D00E
+    1115,  // imageAtomicAdd_01b10D00D00E
+    1116,  // imageAtomicAdd_01G20D00D00E
+    1117,  // imageAtomicAdd_01R20D00D00E
+    1118,  // imageAtomicAdd_01c20D00D00E
+    1119,  // imageAtomicAdd_00z10D00D
+    1120,  // imageAtomicAdd_01K10D00D
+    1121,  // imageAtomicAdd_01V10D00D
+    1122,  // imageAtomicAdd_01A20D00D
+    1123,  // imageAtomicAdd_01L20D00D
+    1124,  // imageAtomicAdd_01W20D00D
+    1125,  // imageAtomicAdd_01C20D00D
+    1126,  // imageAtomicAdd_01N20D00D
+    1127,  // imageAtomicAdd_01Y20D00D
+    1128,  // imageAtomicAdd_01J00D00D
+    1129,  // imageAtomicAdd_01U00D00D
+    1130,  // imageAtomicAdd_01f00D00D
+    1131,  // imageAtomicAdd_01B20D00D
+    1132,  // imageAtomicAdd_01M20D00D
+    1133,  // imageAtomicAdd_01X20D00D
+    1134,  // imageAtomicAdd_01H20D00D
+    1135,  // imageAtomicAdd_01S20D00D
+    1136,  // imageAtomicAdd_01d20D00D
+    1137,  // imageAtomicAdd_01D00D00D
+    1138,  // imageAtomicAdd_01O00D00D
+    1139,  // imageAtomicAdd_01Z00D00D
+    1140,  // imageAtomicAdd_01E10D00D
+    1141,  // imageAtomicAdd_01P10D00D
+    1142,  // imageAtomicAdd_01a10D00D
+    1143,  // imageAtomicAdd_01I10D00D
+    1144,  // imageAtomicAdd_01T10D00D
+    1145,  // imageAtomicAdd_01e10D00D
+    1146,  // imageAtomicAdd_01F10D00D00D
+    1147,  // imageAtomicAdd_01Q10D00D00D
+    1148,  // imageAtomicAdd_01b10D00D00D
+    1149,  // imageAtomicAdd_01G20D00D00D
+    1150,  // imageAtomicAdd_01R20D00D00D
+    1151,  // imageAtomicAdd_01c20D00D00D
+    1152,  // imageAtomicMin_00z10D00E
+    1153,  // imageAtomicMin_01K10D00E
+    1154,  // imageAtomicMin_01V10D00E
+    1155,  // imageAtomicMin_01A20D00E
+    1156,  // imageAtomicMin_01L20D00E
+    1157,  // imageAtomicMin_01W20D00E
+    1158,  // imageAtomicMin_01C20D00E
+    1159,  // imageAtomicMin_01N20D00E
+    1160,  // imageAtomicMin_01Y20D00E
+    1161,  // imageAtomicMin_01J00D00E
+    1162,  // imageAtomicMin_01U00D00E
+    1163,  // imageAtomicMin_01f00D00E
+    1164,  // imageAtomicMin_01B20D00E
+    1165,  // imageAtomicMin_01M20D00E
+    1166,  // imageAtomicMin_01X20D00E
+    1167,  // imageAtomicMin_01H20D00E
+    1168,  // imageAtomicMin_01S20D00E
+    1169,  // imageAtomicMin_01d20D00E
+    1170,  // imageAtomicMin_01D00D00E
+    1171,  // imageAtomicMin_01O00D00E
+    1172,  // imageAtomicMin_01Z00D00E
+    1173,  // imageAtomicMin_01E10D00E
+    1174,  // imageAtomicMin_01P10D00E
+    1175,  // imageAtomicMin_01a10D00E
+    1176,  // imageAtomicMin_01I10D00E
+    1177,  // imageAtomicMin_01T10D00E
+    1178,  // imageAtomicMin_01e10D00E
+    1179,  // imageAtomicMin_01F10D00D00E
+    1180,  // imageAtomicMin_01Q10D00D00E
+    1181,  // imageAtomicMin_01b10D00D00E
+    1182,  // imageAtomicMin_01G20D00D00E
+    1183,  // imageAtomicMin_01R20D00D00E
+    1184,  // imageAtomicMin_01c20D00D00E
+    1185,  // imageAtomicMin_00z10D00D
+    1186,  // imageAtomicMin_01K10D00D
+    1187,  // imageAtomicMin_01V10D00D
+    1188,  // imageAtomicMin_01A20D00D
+    1189,  // imageAtomicMin_01L20D00D
+    1190,  // imageAtomicMin_01W20D00D
+    1191,  // imageAtomicMin_01C20D00D
+    1192,  // imageAtomicMin_01N20D00D
+    1193,  // imageAtomicMin_01Y20D00D
+    1194,  // imageAtomicMin_01J00D00D
+    1195,  // imageAtomicMin_01U00D00D
+    1196,  // imageAtomicMin_01f00D00D
+    1197,  // imageAtomicMin_01B20D00D
+    1198,  // imageAtomicMin_01M20D00D
+    1199,  // imageAtomicMin_01X20D00D
+    1200,  // imageAtomicMin_01H20D00D
+    1201,  // imageAtomicMin_01S20D00D
+    1202,  // imageAtomicMin_01d20D00D
+    1203,  // imageAtomicMin_01D00D00D
+    1204,  // imageAtomicMin_01O00D00D
+    1205,  // imageAtomicMin_01Z00D00D
+    1206,  // imageAtomicMin_01E10D00D
+    1207,  // imageAtomicMin_01P10D00D
+    1208,  // imageAtomicMin_01a10D00D
+    1209,  // imageAtomicMin_01I10D00D
+    1210,  // imageAtomicMin_01T10D00D
+    1211,  // imageAtomicMin_01e10D00D
+    1212,  // imageAtomicMin_01F10D00D00D
+    1213,  // imageAtomicMin_01Q10D00D00D
+    1214,  // imageAtomicMin_01b10D00D00D
+    1215,  // imageAtomicMin_01G20D00D00D
+    1216,  // imageAtomicMin_01R20D00D00D
+    1217,  // imageAtomicMin_01c20D00D00D
+    1218,  // imageAtomicMax_00z10D00E
+    1219,  // imageAtomicMax_01K10D00E
+    1220,  // imageAtomicMax_01V10D00E
+    1221,  // imageAtomicMax_01A20D00E
+    1222,  // imageAtomicMax_01L20D00E
+    1223,  // imageAtomicMax_01W20D00E
+    1224,  // imageAtomicMax_01C20D00E
+    1225,  // imageAtomicMax_01N20D00E
+    1226,  // imageAtomicMax_01Y20D00E
+    1227,  // imageAtomicMax_01J00D00E
+    1228,  // imageAtomicMax_01U00D00E
+    1229,  // imageAtomicMax_01f00D00E
+    1230,  // imageAtomicMax_01B20D00E
+    1231,  // imageAtomicMax_01M20D00E
+    1232,  // imageAtomicMax_01X20D00E
+    1233,  // imageAtomicMax_01H20D00E
+    1234,  // imageAtomicMax_01S20D00E
+    1235,  // imageAtomicMax_01d20D00E
+    1236,  // imageAtomicMax_01D00D00E
+    1237,  // imageAtomicMax_01O00D00E
+    1238,  // imageAtomicMax_01Z00D00E
+    1239,  // imageAtomicMax_01E10D00E
+    1240,  // imageAtomicMax_01P10D00E
+    1241,  // imageAtomicMax_01a10D00E
+    1242,  // imageAtomicMax_01I10D00E
+    1243,  // imageAtomicMax_01T10D00E
+    1244,  // imageAtomicMax_01e10D00E
+    1245,  // imageAtomicMax_01F10D00D00E
+    1246,  // imageAtomicMax_01Q10D00D00E
+    1247,  // imageAtomicMax_01b10D00D00E
+    1248,  // imageAtomicMax_01G20D00D00E
+    1249,  // imageAtomicMax_01R20D00D00E
+    1250,  // imageAtomicMax_01c20D00D00E
+    1251,  // imageAtomicMax_00z10D00D
+    1252,  // imageAtomicMax_01K10D00D
+    1253,  // imageAtomicMax_01V10D00D
+    1254,  // imageAtomicMax_01A20D00D
+    1255,  // imageAtomicMax_01L20D00D
+    1256,  // imageAtomicMax_01W20D00D
+    1257,  // imageAtomicMax_01C20D00D
+    1258,  // imageAtomicMax_01N20D00D
+    1259,  // imageAtomicMax_01Y20D00D
+    1260,  // imageAtomicMax_01J00D00D
+    1261,  // imageAtomicMax_01U00D00D
+    1262,  // imageAtomicMax_01f00D00D
+    1263,  // imageAtomicMax_01B20D00D
+    1264,  // imageAtomicMax_01M20D00D
+    1265,  // imageAtomicMax_01X20D00D
+    1266,  // imageAtomicMax_01H20D00D
+    1267,  // imageAtomicMax_01S20D00D
+    1268,  // imageAtomicMax_01d20D00D
+    1269,  // imageAtomicMax_01D00D00D
+    1270,  // imageAtomicMax_01O00D00D
+    1271,  // imageAtomicMax_01Z00D00D
+    1272,  // imageAtomicMax_01E10D00D
+    1273,  // imageAtomicMax_01P10D00D
+    1274,  // imageAtomicMax_01a10D00D
+    1275,  // imageAtomicMax_01I10D00D
+    1276,  // imageAtomicMax_01T10D00D
+    1277,  // imageAtomicMax_01e10D00D
+    1278,  // imageAtomicMax_01F10D00D00D
+    1279,  // imageAtomicMax_01Q10D00D00D
+    1280,  // imageAtomicMax_01b10D00D00D
+    1281,  // imageAtomicMax_01G20D00D00D
+    1282,  // imageAtomicMax_01R20D00D00D
+    1283,  // imageAtomicMax_01c20D00D00D
+    1284,  // imageAtomicAnd_00z10D00E
+    1285,  // imageAtomicAnd_01K10D00E
+    1286,  // imageAtomicAnd_01V10D00E
+    1287,  // imageAtomicAnd_01A20D00E
+    1288,  // imageAtomicAnd_01L20D00E
+    1289,  // imageAtomicAnd_01W20D00E
+    1290,  // imageAtomicAnd_01C20D00E
+    1291,  // imageAtomicAnd_01N20D00E
+    1292,  // imageAtomicAnd_01Y20D00E
+    1293,  // imageAtomicAnd_01J00D00E
+    1294,  // imageAtomicAnd_01U00D00E
+    1295,  // imageAtomicAnd_01f00D00E
+    1296,  // imageAtomicAnd_01B20D00E
+    1297,  // imageAtomicAnd_01M20D00E
+    1298,  // imageAtomicAnd_01X20D00E
+    1299,  // imageAtomicAnd_01H20D00E
+    1300,  // imageAtomicAnd_01S20D00E
+    1301,  // imageAtomicAnd_01d20D00E
+    1302,  // imageAtomicAnd_01D00D00E
+    1303,  // imageAtomicAnd_01O00D00E
+    1304,  // imageAtomicAnd_01Z00D00E
+    1305,  // imageAtomicAnd_01E10D00E
+    1306,  // imageAtomicAnd_01P10D00E
+    1307,  // imageAtomicAnd_01a10D00E
+    1308,  // imageAtomicAnd_01I10D00E
+    1309,  // imageAtomicAnd_01T10D00E
+    1310,  // imageAtomicAnd_01e10D00E
+    1311,  // imageAtomicAnd_01F10D00D00E
+    1312,  // imageAtomicAnd_01Q10D00D00E
+    1313,  // imageAtomicAnd_01b10D00D00E
+    1314,  // imageAtomicAnd_01G20D00D00E
+    1315,  // imageAtomicAnd_01R20D00D00E
+    1316,  // imageAtomicAnd_01c20D00D00E
+    1317,  // imageAtomicAnd_00z10D00D
+    1318,  // imageAtomicAnd_01K10D00D
+    1319,  // imageAtomicAnd_01V10D00D
+    1320,  // imageAtomicAnd_01A20D00D
+    1321,  // imageAtomicAnd_01L20D00D
+    1322,  // imageAtomicAnd_01W20D00D
+    1323,  // imageAtomicAnd_01C20D00D
+    1324,  // imageAtomicAnd_01N20D00D
+    1325,  // imageAtomicAnd_01Y20D00D
+    1326,  // imageAtomicAnd_01J00D00D
+    1327,  // imageAtomicAnd_01U00D00D
+    1328,  // imageAtomicAnd_01f00D00D
+    1329,  // imageAtomicAnd_01B20D00D
+    1330,  // imageAtomicAnd_01M20D00D
+    1331,  // imageAtomicAnd_01X20D00D
+    1332,  // imageAtomicAnd_01H20D00D
+    1333,  // imageAtomicAnd_01S20D00D
+    1334,  // imageAtomicAnd_01d20D00D
+    1335,  // imageAtomicAnd_01D00D00D
+    1336,  // imageAtomicAnd_01O00D00D
+    1337,  // imageAtomicAnd_01Z00D00D
+    1338,  // imageAtomicAnd_01E10D00D
+    1339,  // imageAtomicAnd_01P10D00D
+    1340,  // imageAtomicAnd_01a10D00D
+    1341,  // imageAtomicAnd_01I10D00D
+    1342,  // imageAtomicAnd_01T10D00D
+    1343,  // imageAtomicAnd_01e10D00D
+    1344,  // imageAtomicAnd_01F10D00D00D
+    1345,  // imageAtomicAnd_01Q10D00D00D
+    1346,  // imageAtomicAnd_01b10D00D00D
+    1347,  // imageAtomicAnd_01G20D00D00D
+    1348,  // imageAtomicAnd_01R20D00D00D
+    1349,  // imageAtomicAnd_01c20D00D00D
+    1350,  // imageAtomicOr_00z10D00E
+    1351,  // imageAtomicOr_01K10D00E
+    1352,  // imageAtomicOr_01V10D00E
+    1353,  // imageAtomicOr_01A20D00E
+    1354,  // imageAtomicOr_01L20D00E
+    1355,  // imageAtomicOr_01W20D00E
+    1356,  // imageAtomicOr_01C20D00E
+    1357,  // imageAtomicOr_01N20D00E
+    1358,  // imageAtomicOr_01Y20D00E
+    1359,  // imageAtomicOr_01J00D00E
+    1360,  // imageAtomicOr_01U00D00E
+    1361,  // imageAtomicOr_01f00D00E
+    1362,  // imageAtomicOr_01B20D00E
+    1363,  // imageAtomicOr_01M20D00E
+    1364,  // imageAtomicOr_01X20D00E
+    1365,  // imageAtomicOr_01H20D00E
+    1366,  // imageAtomicOr_01S20D00E
+    1367,  // imageAtomicOr_01d20D00E
+    1368,  // imageAtomicOr_01D00D00E
+    1369,  // imageAtomicOr_01O00D00E
+    1370,  // imageAtomicOr_01Z00D00E
+    1371,  // imageAtomicOr_01E10D00E
+    1372,  // imageAtomicOr_01P10D00E
+    1373,  // imageAtomicOr_01a10D00E
+    1374,  // imageAtomicOr_01I10D00E
+    1375,  // imageAtomicOr_01T10D00E
+    1376,  // imageAtomicOr_01e10D00E
+    1377,  // imageAtomicOr_01F10D00D00E
+    1378,  // imageAtomicOr_01Q10D00D00E
+    1379,  // imageAtomicOr_01b10D00D00E
+    1380,  // imageAtomicOr_01G20D00D00E
+    1381,  // imageAtomicOr_01R20D00D00E
+    1382,  // imageAtomicOr_01c20D00D00E
+    1383,  // imageAtomicOr_00z10D00D
+    1384,  // imageAtomicOr_01K10D00D
+    1385,  // imageAtomicOr_01V10D00D
+    1386,  // imageAtomicOr_01A20D00D
+    1387,  // imageAtomicOr_01L20D00D
+    1388,  // imageAtomicOr_01W20D00D
+    1389,  // imageAtomicOr_01C20D00D
+    1390,  // imageAtomicOr_01N20D00D
+    1391,  // imageAtomicOr_01Y20D00D
+    1392,  // imageAtomicOr_01J00D00D
+    1393,  // imageAtomicOr_01U00D00D
+    1394,  // imageAtomicOr_01f00D00D
+    1395,  // imageAtomicOr_01B20D00D
+    1396,  // imageAtomicOr_01M20D00D
+    1397,  // imageAtomicOr_01X20D00D
+    1398,  // imageAtomicOr_01H20D00D
+    1399,  // imageAtomicOr_01S20D00D
+    1400,  // imageAtomicOr_01d20D00D
+    1401,  // imageAtomicOr_01D00D00D
+    1402,  // imageAtomicOr_01O00D00D
+    1403,  // imageAtomicOr_01Z00D00D
+    1404,  // imageAtomicOr_01E10D00D
+    1405,  // imageAtomicOr_01P10D00D
+    1406,  // imageAtomicOr_01a10D00D
+    1407,  // imageAtomicOr_01I10D00D
+    1408,  // imageAtomicOr_01T10D00D
+    1409,  // imageAtomicOr_01e10D00D
+    1410,  // imageAtomicOr_01F10D00D00D
+    1411,  // imageAtomicOr_01Q10D00D00D
+    1412,  // imageAtomicOr_01b10D00D00D
+    1413,  // imageAtomicOr_01G20D00D00D
+    1414,  // imageAtomicOr_01R20D00D00D
+    1415,  // imageAtomicOr_01c20D00D00D
+    1416,  // imageAtomicXor_00z10D00E
+    1417,  // imageAtomicXor_01K10D00E
+    1418,  // imageAtomicXor_01V10D00E
+    1419,  // imageAtomicXor_01A20D00E
+    1420,  // imageAtomicXor_01L20D00E
+    1421,  // imageAtomicXor_01W20D00E
+    1422,  // imageAtomicXor_01C20D00E
+    1423,  // imageAtomicXor_01N20D00E
+    1424,  // imageAtomicXor_01Y20D00E
+    1425,  // imageAtomicXor_01J00D00E
+    1426,  // imageAtomicXor_01U00D00E
+    1427,  // imageAtomicXor_01f00D00E
+    1428,  // imageAtomicXor_01B20D00E
+    1429,  // imageAtomicXor_01M20D00E
+    1430,  // imageAtomicXor_01X20D00E
+    1431,  // imageAtomicXor_01H20D00E
+    1432,  // imageAtomicXor_01S20D00E
+    1433,  // imageAtomicXor_01d20D00E
+    1434,  // imageAtomicXor_01D00D00E
+    1435,  // imageAtomicXor_01O00D00E
+    1436,  // imageAtomicXor_01Z00D00E
+    1437,  // imageAtomicXor_01E10D00E
+    1438,  // imageAtomicXor_01P10D00E
+    1439,  // imageAtomicXor_01a10D00E
+    1440,  // imageAtomicXor_01I10D00E
+    1441,  // imageAtomicXor_01T10D00E
+    1442,  // imageAtomicXor_01e10D00E
+    1443,  // imageAtomicXor_01F10D00D00E
+    1444,  // imageAtomicXor_01Q10D00D00E
+    1445,  // imageAtomicXor_01b10D00D00E
+    1446,  // imageAtomicXor_01G20D00D00E
+    1447,  // imageAtomicXor_01R20D00D00E
+    1448,  // imageAtomicXor_01c20D00D00E
+    1449,  // imageAtomicXor_00z10D00D
+    1450,  // imageAtomicXor_01K10D00D
+    1451,  // imageAtomicXor_01V10D00D
+    1452,  // imageAtomicXor_01A20D00D
+    1453,  // imageAtomicXor_01L20D00D
+    1454,  // imageAtomicXor_01W20D00D
+    1455,  // imageAtomicXor_01C20D00D
+    1456,  // imageAtomicXor_01N20D00D
+    1457,  // imageAtomicXor_01Y20D00D
+    1458,  // imageAtomicXor_01J00D00D
+    1459,  // imageAtomicXor_01U00D00D
+    1460,  // imageAtomicXor_01f00D00D
+    1461,  // imageAtomicXor_01B20D00D
+    1462,  // imageAtomicXor_01M20D00D
+    1463,  // imageAtomicXor_01X20D00D
+    1464,  // imageAtomicXor_01H20D00D
+    1465,  // imageAtomicXor_01S20D00D
+    1466,  // imageAtomicXor_01d20D00D
+    1467,  // imageAtomicXor_01D00D00D
+    1468,  // imageAtomicXor_01O00D00D
+    1469,  // imageAtomicXor_01Z00D00D
+    1470,  // imageAtomicXor_01E10D00D
+    1471,  // imageAtomicXor_01P10D00D
+    1472,  // imageAtomicXor_01a10D00D
+    1473,  // imageAtomicXor_01I10D00D
+    1474,  // imageAtomicXor_01T10D00D
+    1475,  // imageAtomicXor_01e10D00D
+    1476,  // imageAtomicXor_01F10D00D00D
+    1477,  // imageAtomicXor_01Q10D00D00D
+    1478,  // imageAtomicXor_01b10D00D00D
+    1479,  // imageAtomicXor_01G20D00D00D
+    1480,  // imageAtomicXor_01R20D00D00D
+    1481,  // imageAtomicXor_01c20D00D00D
+    1482,  // imageAtomicExchange_00z10D00E
+    1483,  // imageAtomicExchange_01K10D00E
+    1484,  // imageAtomicExchange_01V10D00E
+    1485,  // imageAtomicExchange_01A20D00E
+    1486,  // imageAtomicExchange_01L20D00E
+    1487,  // imageAtomicExchange_01W20D00E
+    1488,  // imageAtomicExchange_01C20D00E
+    1489,  // imageAtomicExchange_01N20D00E
+    1490,  // imageAtomicExchange_01Y20D00E
+    1491,  // imageAtomicExchange_01J00D00E
+    1492,  // imageAtomicExchange_01U00D00E
+    1493,  // imageAtomicExchange_01f00D00E
+    1494,  // imageAtomicExchange_01B20D00E
+    1495,  // imageAtomicExchange_01M20D00E
+    1496,  // imageAtomicExchange_01X20D00E
+    1497,  // imageAtomicExchange_01H20D00E
+    1498,  // imageAtomicExchange_01S20D00E
+    1499,  // imageAtomicExchange_01d20D00E
+    1500,  // imageAtomicExchange_01D00D00E
+    1501,  // imageAtomicExchange_01O00D00E
+    1502,  // imageAtomicExchange_01Z00D00E
+    1503,  // imageAtomicExchange_01E10D00E
+    1504,  // imageAtomicExchange_01P10D00E
+    1505,  // imageAtomicExchange_01a10D00E
+    1506,  // imageAtomicExchange_01I10D00E
+    1507,  // imageAtomicExchange_01T10D00E
+    1508,  // imageAtomicExchange_01e10D00E
+    1509,  // imageAtomicExchange_01F10D00D00E
+    1510,  // imageAtomicExchange_01Q10D00D00E
+    1511,  // imageAtomicExchange_01b10D00D00E
+    1512,  // imageAtomicExchange_01G20D00D00E
+    1513,  // imageAtomicExchange_01R20D00D00E
+    1514,  // imageAtomicExchange_01c20D00D00E
+    1515,  // imageAtomicExchange_00z10D00D
+    1516,  // imageAtomicExchange_01K10D00D
+    1517,  // imageAtomicExchange_01V10D00D
+    1518,  // imageAtomicExchange_01A20D00D
+    1519,  // imageAtomicExchange_01L20D00D
+    1520,  // imageAtomicExchange_01W20D00D
+    1521,  // imageAtomicExchange_01C20D00D
+    1522,  // imageAtomicExchange_01N20D00D
+    1523,  // imageAtomicExchange_01Y20D00D
+    1524,  // imageAtomicExchange_01J00D00D
+    1525,  // imageAtomicExchange_01U00D00D
+    1526,  // imageAtomicExchange_01f00D00D
+    1527,  // imageAtomicExchange_01B20D00D
+    1528,  // imageAtomicExchange_01M20D00D
+    1529,  // imageAtomicExchange_01X20D00D
+    1530,  // imageAtomicExchange_01H20D00D
+    1531,  // imageAtomicExchange_01S20D00D
+    1532,  // imageAtomicExchange_01d20D00D
+    1533,  // imageAtomicExchange_01D00D00D
+    1534,  // imageAtomicExchange_01O00D00D
+    1535,  // imageAtomicExchange_01Z00D00D
+    1536,  // imageAtomicExchange_01E10D00D
+    1537,  // imageAtomicExchange_01P10D00D
+    1538,  // imageAtomicExchange_01a10D00D
+    1539,  // imageAtomicExchange_01I10D00D
+    1540,  // imageAtomicExchange_01T10D00D
+    1541,  // imageAtomicExchange_01e10D00D
+    1542,  // imageAtomicExchange_01F10D00D00D
+    1543,  // imageAtomicExchange_01Q10D00D00D
+    1544,  // imageAtomicExchange_01b10D00D00D
+    1545,  // imageAtomicExchange_01G20D00D00D
+    1546,  // imageAtomicExchange_01R20D00D00D
+    1547,  // imageAtomicExchange_01c20D00D00D
+    1548,  // imageAtomicExchange_00z10D00B
+    1549,  // imageAtomicExchange_01K10D00B
+    1550,  // imageAtomicExchange_01V10D00B
+    1551,  // imageAtomicExchange_01A20D00B
+    1552,  // imageAtomicExchange_01L20D00B
+    1553,  // imageAtomicExchange_01W20D00B
+    1554,  // imageAtomicExchange_01C20D00B
+    1555,  // imageAtomicExchange_01N20D00B
+    1556,  // imageAtomicExchange_01Y20D00B
+    1557,  // imageAtomicExchange_01J00D00B
+    1558,  // imageAtomicExchange_01U00D00B
+    1559,  // imageAtomicExchange_01f00D00B
+    1560,  // imageAtomicExchange_01B20D00B
+    1561,  // imageAtomicExchange_01M20D00B
+    1562,  // imageAtomicExchange_01X20D00B
+    1563,  // imageAtomicExchange_01H20D00B
+    1564,  // imageAtomicExchange_01S20D00B
+    1565,  // imageAtomicExchange_01d20D00B
+    1566,  // imageAtomicExchange_01D00D00B
+    1567,  // imageAtomicExchange_01O00D00B
+    1568,  // imageAtomicExchange_01Z00D00B
+    1569,  // imageAtomicExchange_01E10D00B
+    1570,  // imageAtomicExchange_01P10D00B
+    1571,  // imageAtomicExchange_01a10D00B
+    1572,  // imageAtomicExchange_01I10D00B
+    1573,  // imageAtomicExchange_01T10D00B
+    1574,  // imageAtomicExchange_01e10D00B
+    1575,  // imageAtomicExchange_01F10D00D00B
+    1576,  // imageAtomicExchange_01Q10D00D00B
+    1577,  // imageAtomicExchange_01b10D00D00B
+    1578,  // imageAtomicExchange_01G20D00D00B
+    1579,  // imageAtomicExchange_01R20D00D00B
+    1580,  // imageAtomicExchange_01c20D00D00B
+    1581,  // imageAtomicCompSwap_00z10D00E00E
+    1582,  // imageAtomicCompSwap_01K10D00E00E
+    1583,  // imageAtomicCompSwap_01V10D00E00E
+    1584,  // imageAtomicCompSwap_01A20D00E00E
+    1585,  // imageAtomicCompSwap_01L20D00E00E
+    1586,  // imageAtomicCompSwap_01W20D00E00E
+    1587,  // imageAtomicCompSwap_01C20D00E00E
+    1588,  // imageAtomicCompSwap_01N20D00E00E
+    1589,  // imageAtomicCompSwap_01Y20D00E00E
+    1590,  // imageAtomicCompSwap_01J00D00E00E
+    1591,  // imageAtomicCompSwap_01U00D00E00E
+    1592,  // imageAtomicCompSwap_01f00D00E00E
+    1593,  // imageAtomicCompSwap_01B20D00E00E
+    1594,  // imageAtomicCompSwap_01M20D00E00E
+    1595,  // imageAtomicCompSwap_01X20D00E00E
+    1596,  // imageAtomicCompSwap_01H20D00E00E
+    1597,  // imageAtomicCompSwap_01S20D00E00E
+    1598,  // imageAtomicCompSwap_01d20D00E00E
+    1599,  // imageAtomicCompSwap_01D00D00E00E
+    1600,  // imageAtomicCompSwap_01O00D00E00E
+    1601,  // imageAtomicCompSwap_01Z00D00E00E
+    1602,  // imageAtomicCompSwap_01E10D00E00E
+    1603,  // imageAtomicCompSwap_01P10D00E00E
+    1604,  // imageAtomicCompSwap_01a10D00E00E
+    1605,  // imageAtomicCompSwap_01I10D00E00E
+    1606,  // imageAtomicCompSwap_01T10D00E00E
+    1607,  // imageAtomicCompSwap_01e10D00E00E
+    1608,  // imageAtomicCompSwap_01F10D00D00E00E
+    1609,  // imageAtomicCompSwap_01Q10D00D00E00E
+    1610,  // imageAtomicCompSwap_01b10D00D00E00E
+    1611,  // imageAtomicCompSwap_01G20D00D00E00E
+    1612,  // imageAtomicCompSwap_01R20D00D00E00E
+    1613,  // imageAtomicCompSwap_01c20D00D00E00E
+    1614,  // imageAtomicCompSwap_00z10D00D00D
+    1615,  // imageAtomicCompSwap_01K10D00D00D
+    1616,  // imageAtomicCompSwap_01V10D00D00D
+    1617,  // imageAtomicCompSwap_01A20D00D00D
+    1618,  // imageAtomicCompSwap_01L20D00D00D
+    1619,  // imageAtomicCompSwap_01W20D00D00D
+    1620,  // imageAtomicCompSwap_01C20D00D00D
+    1621,  // imageAtomicCompSwap_01N20D00D00D
+    1622,  // imageAtomicCompSwap_01Y20D00D00D
+    1623,  // imageAtomicCompSwap_01J00D00D00D
+    1624,  // imageAtomicCompSwap_01U00D00D00D
+    1625,  // imageAtomicCompSwap_01f00D00D00D
+    1626,  // imageAtomicCompSwap_01B20D00D00D
+    1627,  // imageAtomicCompSwap_01M20D00D00D
+    1628,  // imageAtomicCompSwap_01X20D00D00D
+    1629,  // imageAtomicCompSwap_01H20D00D00D
+    1630,  // imageAtomicCompSwap_01S20D00D00D
+    1631,  // imageAtomicCompSwap_01d20D00D00D
+    1632,  // imageAtomicCompSwap_01D00D00D00D
+    1633,  // imageAtomicCompSwap_01O00D00D00D
+    1634,  // imageAtomicCompSwap_01Z00D00D00D
+    1635,  // imageAtomicCompSwap_01E10D00D00D
+    1636,  // imageAtomicCompSwap_01P10D00D00D
+    1637,  // imageAtomicCompSwap_01a10D00D00D
+    1638,  // imageAtomicCompSwap_01I10D00D00D
+    1639,  // imageAtomicCompSwap_01T10D00D00D
+    1640,  // imageAtomicCompSwap_01e10D00D00D
+    1641,  // imageAtomicCompSwap_01F10D00D00D00D
+    1642,  // imageAtomicCompSwap_01Q10D00D00D00D
+    1643,  // imageAtomicCompSwap_01b10D00D00D00D
+    1644,  // imageAtomicCompSwap_01G20D00D00D00D
+    1645,  // imageAtomicCompSwap_01R20D00D00D00D
+    1646,  // imageAtomicCompSwap_01c20D00D00D00D
+    1647,  // memoryBarrier_
+    1648,  // memoryBarrierAtomicCounter_
+    1649,  // memoryBarrierBuffer_
+    1650,  // memoryBarrierImage_
+    1651,  // barrier_
+    1654,  // memoryBarrierShared_
+    1655,  // groupMemoryBarrier_
+    1656,  // EmitVertex_
+    1659,  // EndPrimitive_
+    1662,  // subpassLoad_01g
+    1663,  // subpassLoad_01h
+    1664,  // subpassLoad_01i
+    1665,  // subpassLoad_01j00D
+    1666,  // subpassLoad_01k00D
+    1667,  // subpassLoad_01l00D
+    1668,  // gl_DepthRangeParameters
+    1669,  // gl_DepthRange
+    1670,  // gl_NumSamples
+    1672,  // gl_MaxVertexAttribs
+    1673,  // gl_MaxVertexUniformVectors
+    1674,  // gl_MaxVertexTextureImageUnits
+    1675,  // gl_MaxCombinedTextureImageUnits
+    1676,  // gl_MaxTextureImageUnits
+    1677,  // gl_MaxFragmentUniformVectors
+    1678,  // gl_MaxVaryingVectors
+    1679,  // gl_MaxDrawBuffers
+    1680,  // gl_MaxDualSourceDrawBuffersEXT
+    1681,  // gl_MaxVertexOutputVectors
+    1682,  // gl_MaxFragmentInputVectors
+    1683,  // gl_MinProgramTexelOffset
+    1684,  // gl_MaxProgramTexelOffset
+    1685,  // gl_MaxImageUnits
+    1686,  // gl_MaxVertexImageUniforms
+    1687,  // gl_MaxFragmentImageUniforms
+    1688,  // gl_MaxComputeImageUniforms
+    1689,  // gl_MaxCombinedImageUniforms
+    1690,  // gl_MaxCombinedShaderOutputResources
+    1691,  // gl_MaxComputeWorkGroupCount
+    1692,  // gl_MaxComputeWorkGroupSize
+    1693,  // gl_MaxComputeUniformComponents
+    1694,  // gl_MaxComputeTextureImageUnits
+    1695,  // gl_MaxComputeAtomicCounters
+    1696,  // gl_MaxComputeAtomicCounterBuffers
+    1697,  // gl_MaxVertexAtomicCounters
+    1698,  // gl_MaxFragmentAtomicCounters
+    1699,  // gl_MaxCombinedAtomicCounters
+    1700,  // gl_MaxAtomicCounterBindings
+    1701,  // gl_MaxVertexAtomicCounterBuffers
+    1702,  // gl_MaxFragmentAtomicCounterBuffers
+    1703,  // gl_MaxCombinedAtomicCounterBuffers
+    1704,  // gl_MaxAtomicCounterBufferSize
+    1705,  // gl_MaxGeometryInputComponents
+    1708,  // gl_MaxGeometryOutputComponents
+    1711,  // gl_MaxGeometryImageUniforms
+    1714,  // gl_MaxGeometryTextureImageUnits
+    1717,  // gl_MaxGeometryOutputVertices
+    1720,  // gl_MaxGeometryTotalOutputComponents
+    1723,  // gl_MaxGeometryUniformComponents
+    1726,  // gl_MaxGeometryAtomicCounters
+    1729,  // gl_MaxGeometryAtomicCounterBuffers
+    1732,  // gl_MaxTessControlInputComponents
+    1734,  // gl_MaxTessControlOutputComponents
+    1736,  // gl_MaxTessControlTextureImageUnits
+    1738,  // gl_MaxTessControlUniformComponents
+    1740,  // gl_MaxTessControlTotalOutputComponents
+    1742,  // gl_MaxTessControlImageUniforms
+    1744,  // gl_MaxTessControlAtomicCounters
+    1746,  // gl_MaxTessControlAtomicCounterBuffers
+    1748,  // gl_MaxTessPatchComponents
+    1750,  // gl_MaxPatchVertices
+    1752,  // gl_MaxTessGenLevel
+    1754,  // gl_MaxTessEvaluationInputComponents
+    1756,  // gl_MaxTessEvaluationOutputComponents
+    1758,  // gl_MaxTessEvaluationTextureImageUnits
+    1760,  // gl_MaxTessEvaluationUniformComponents
+    1762,  // gl_MaxTessEvaluationImageUniforms
+    1764,  // gl_MaxTessEvaluationAtomicCounters
+    1766,  // gl_MaxTessEvaluationAtomicCounterBuffers
+    1768,  // gl_MaxSamples
+    1770,  // gl_MaxClipDistances
+    1771,  // gl_MaxCullDistances
+    1772,  // gl_MaxCombinedClipAndCullDistances
+    1773,  // gl_FragCoord
+    1775,  // gl_FrontFacing
+    1776,  // gl_PointCoord
+    1777,  // gl_FragColor
+    1778,  // gl_FragData
+    1779,  // gl_FragDepth
+    1780,  // gl_HelperInvocation
+    1781,  // gl_SecondaryFragColorEXT
+    1782,  // gl_SecondaryFragDataEXT
+    1783,  // gl_FragDepthEXT
+    1784,  // gl_LastFragData
+    1787,  // gl_LastFragColor
+    1788,  // gl_LastFragColorARM
+    1789,  // gl_PrimitiveID
+    1799,  // gl_Layer
+    1805,  // gl_SampleID
+    1807,  // gl_SamplePosition
+    1809,  // gl_SampleMaskIn
+    1811,  // gl_SampleMask
+    1813,  // gl_CullDistance
+    1815,  // gl_ClipDistance
+    1817,  // gl_Position
+    1825,  // gl_PointSize
+    1827,  // gl_InstanceID
+    1828,  // Empty
+    1828,  // gl_VertexID
+    1829,  // Empty
+    1829,  // Empty
+    1829,  // gl_DrawID
+    1830,  // gl_BaseVertex
+    1831,  // gl_BaseInstance
+    1832,  // angle_BaseVertex
+    1833,  // angle_BaseInstance
+    1834,  // gl_NumWorkGroups
+    1835,  // gl_WorkGroupSize
+    1836,  // gl_WorkGroupID
+    1837,  // gl_LocalInvocationID
+    1838,  // gl_GlobalInvocationID
+    1839,  // gl_LocalInvocationIndex
+    1840,  // gl_PrimitiveIDIn
+    1843,  // gl_InvocationID
+    1848,  // gl_PerVertex
+    1855,  // gl_in
+    1862,  // gl_PatchVerticesIn
+    1866,  // gl_TessLevelOuter
+    1870,  // gl_TessLevelInner
+    1874,  // gl_out
+    1878,  // gl_BoundingBoxEXT
+    1880,  // gl_TessCoord
+    1881,  // gl_ViewID_OVR
 };
 
 using Ext = TExtension;
@@ -25439,7 +24651,9 @@
     {"EmitVertex", std::array<TExtension, 1>{{Ext::UNDEFINED}}, Ext::UNDEFINED, 320, -1,
      Shader::GEOMETRY},
     {"EndPrimitive", std::array<TExtension, 1>{{Ext::UNDEFINED}}, Ext::UNDEFINED, 320, -1,
-     Shader::GEOMETRY}};
+     Shader::GEOMETRY},
+    {"subpassLoad", std::array<TExtension, 1>{{Ext::UNDEFINED}}, Ext::UNDEFINED, kESSLVulkanOnly,
+     460, Shader::ALL}};
 
 }  // namespace BuiltInArray
 
@@ -26418,8 +25632,8 @@
         BuiltInId::gl_SecondaryFragDataEXT, BuiltInName::gl_SecondaryFragDataEXT,
         SymbolType::BuiltIn, std::array<TExtension, 1u>{{TExtension::EXT_blend_func_extended}},
         type_gl_SecondaryFragDataEXT);
-    TType *type_gl_FragDepthEXT = new TType(
-        EbtFloat, resources.FragmentPrecisionHigh ? EbpHigh : EbpMedium, EvqFragDepthEXT, 1);
+    TType *type_gl_FragDepthEXT =
+        new TType(EbtFloat, resources.FragmentPrecisionHigh ? EbpHigh : EbpMedium, EvqFragDepth, 1);
     type_gl_FragDepthEXT->realize();
     m_gl_FragDepthEXT = new TVariable(
         BuiltInId::gl_FragDepthEXT, BuiltInName::gl_FragDepthEXT, SymbolType::BuiltIn,
@@ -26648,6 +25862,19 @@
     m_gl_PositionTCSES3_2 = new TVariable(
         BuiltInId::gl_PositionTCSES3_2, BuiltInName::gl_Position, SymbolType::BuiltIn,
         std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, type_gl_PositionTCSES3_2);
+    TType *type_gl_BoundingBoxEXTTCS = new TType(EbtFloat, EbpHigh, EvqBoundingBoxEXT, 4);
+    type_gl_BoundingBoxEXTTCS->makeArray(4u);
+    type_gl_BoundingBoxEXTTCS->realize();
+    m_gl_BoundingBoxEXTTCS = new TVariable(
+        BuiltInId::gl_BoundingBoxEXTTCS, BuiltInName::gl_BoundingBoxEXT, SymbolType::BuiltIn,
+        std::array<TExtension, 1u>{{TExtension::EXT_tessellation_shader}},
+        type_gl_BoundingBoxEXTTCS);
+    TType *type_gl_BoundingBoxEXTTCSES3_2 = new TType(EbtFloat, EbpHigh, EvqBoundingBoxEXT, 4);
+    type_gl_BoundingBoxEXTTCSES3_2->makeArray(4u);
+    type_gl_BoundingBoxEXTTCSES3_2->realize();
+    m_gl_BoundingBoxEXTTCSES3_2 = new TVariable(
+        BuiltInId::gl_BoundingBoxEXTTCSES3_2, BuiltInName::gl_BoundingBoxEXT, SymbolType::BuiltIn,
+        std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, type_gl_BoundingBoxEXTTCSES3_2);
     TType *type_gl_TessLevelOuterTES = new TType(EbtFloat, EbpHigh, EvqTessLevelOuter, 1);
     type_gl_TessLevelOuterTES->makeArray(4u);
     type_gl_TessLevelOuterTES->realize();
@@ -26748,7 +25975,7 @@
 {
 uint16_t GetNextRuleIndex(uint32_t nameHash)
 {
-    if (nameHash == 1625 - 1)
+    if (nameHash == 1632 - 1)
         return ArraySize(BuiltInArray::kRules);
     return BuiltInArray::kMangledOffsets[nameHash + 1];
 }
@@ -26760,7 +25987,7 @@
         return nullptr;
 
     uint32_t nameHash = name.mangledNameHash();
-    if (nameHash >= 1625)
+    if (nameHash >= 1632)
         return nullptr;
 
     const char *actualName = BuiltInArray::kMangledNames[nameHash];
@@ -26782,7 +26009,7 @@
         return false;
 
     uint32_t nameHash = name.unmangledNameHash();
-    if (nameHash >= 166)
+    if (nameHash >= 167)
         return false;
 
     return BuiltInArray::unmangled[nameHash].matches(name, mShaderSpec, shaderVersion, mShaderType,
diff --git a/src/compiler/translator/SymbolTable_autogen.cpp b/src/compiler/translator/SymbolTable_autogen.cpp
index 1040517..3575537 100644
--- a/src/compiler/translator/SymbolTable_autogen.cpp
+++ b/src/compiler/translator/SymbolTable_autogen.cpp
@@ -2798,7 +2798,8 @@
 constexpr const TSymbolUniqueId BuiltInId::barrier;
 constexpr const TSymbolUniqueId BuiltInId::memoryBarrierShared;
 constexpr const TSymbolUniqueId BuiltInId::groupMemoryBarrier;
-constexpr const TSymbolUniqueId BuiltInId::barrierES3_2;
+constexpr const TSymbolUniqueId BuiltInId::barrierTCS;
+constexpr const TSymbolUniqueId BuiltInId::barrierTCSES3_2;
 constexpr const TSymbolUniqueId BuiltInId::EmitVertex;
 constexpr const TSymbolUniqueId BuiltInId::EmitVertexES3_2;
 constexpr const TSymbolUniqueId BuiltInId::EndPrimitive;
@@ -2917,6 +2918,7 @@
 constexpr const TSymbolUniqueId BuiltInId::gl_FragData;
 constexpr const TSymbolUniqueId BuiltInId::gl_FragDepth;
 constexpr const TSymbolUniqueId BuiltInId::gl_HelperInvocation;
+constexpr const TSymbolUniqueId BuiltInId::gl_FragCoord300;
 constexpr const TSymbolUniqueId BuiltInId::gl_SecondaryFragColorEXT;
 constexpr const TSymbolUniqueId BuiltInId::gl_SecondaryFragDataEXT;
 constexpr const TSymbolUniqueId BuiltInId::gl_FragDepthEXT;
@@ -2947,6 +2949,7 @@
 constexpr const TSymbolUniqueId BuiltInId::gl_VertexIndex;
 constexpr const TSymbolUniqueId BuiltInId::gl_ViewportIndex;
 constexpr const TSymbolUniqueId BuiltInId::gl_LayerVS;
+constexpr const TSymbolUniqueId BuiltInId::gl_PointSize300;
 constexpr const TSymbolUniqueId BuiltInId::gl_DrawID;
 constexpr const TSymbolUniqueId BuiltInId::gl_BaseVertex;
 constexpr const TSymbolUniqueId BuiltInId::gl_BaseInstance;
@@ -2996,6 +2999,8 @@
 constexpr const TSymbolUniqueId BuiltInId::gl_PerVertexOutTcsBlockES3_2;
 constexpr const TSymbolUniqueId BuiltInId::gl_PositionTCS;
 constexpr const TSymbolUniqueId BuiltInId::gl_PositionTCSES3_2;
+constexpr const TSymbolUniqueId BuiltInId::gl_BoundingBoxEXTTCS;
+constexpr const TSymbolUniqueId BuiltInId::gl_BoundingBoxEXTTCSES3_2;
 constexpr const TSymbolUniqueId BuiltInId::gl_PatchVerticesInTES;
 constexpr const TSymbolUniqueId BuiltInId::gl_PatchVerticesInTESES3_2;
 constexpr const TSymbolUniqueId BuiltInId::gl_PrimitiveIDTES;
@@ -3017,7 +3022,7 @@
 constexpr const TSymbolUniqueId BuiltInId::gl_PositionTESES3_2;
 constexpr const TSymbolUniqueId BuiltInId::gl_ViewID_OVR;
 
-const int TSymbolTable::kLastBuiltInId = 3063;
+const int TSymbolTable::kLastBuiltInId = 3068;
 
 namespace BuiltInName
 {
@@ -3064,7 +3069,8 @@
 constexpr const ImmutableString atomicOr("atomicOr");
 constexpr const ImmutableString atomicXor("atomicXor");
 constexpr const ImmutableString barrier("barrier");
-constexpr const ImmutableString barrierES3_2("barrier");
+constexpr const ImmutableString barrierTCS("barrier");
+constexpr const ImmutableString barrierTCSES3_2("barrier");
 constexpr const ImmutableString bitCount("bitCount");
 constexpr const ImmutableString bitfieldExtract("bitfieldExtract");
 constexpr const ImmutableString bitfieldInsert("bitfieldInsert");
@@ -3108,6 +3114,7 @@
 constexpr const ImmutableString fwidthFine("fwidthFine");
 constexpr const ImmutableString gl_BaseInstance("gl_BaseInstance");
 constexpr const ImmutableString gl_BaseVertex("gl_BaseVertex");
+constexpr const ImmutableString gl_BoundingBoxEXT("gl_BoundingBoxEXT");
 constexpr const ImmutableString gl_ClipDistance("gl_ClipDistance");
 constexpr const ImmutableString gl_CullDistance("gl_CullDistance");
 constexpr const ImmutableString gl_DepthRange("gl_DepthRange");
@@ -3451,6 +3458,12 @@
                                         SymbolType::BuiltIn,
                                         std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
                                         StaticType::Get<EbtFloat, EbpMedium, EvqFragCoord, 4, 1>());
+constexpr const TVariable kgl_FragCoord300(
+    BuiltInId::gl_FragCoord300,
+    BuiltInName::gl_FragCoord,
+    SymbolType::BuiltIn,
+    std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
+    StaticType::Get<EbtFloat, EbpHigh, EvqFragCoord, 4, 1>());
 constexpr const TVariable kgl_FragDepth(BuiltInId::gl_FragDepth,
                                         BuiltInName::gl_FragDepth,
                                         SymbolType::BuiltIn,
@@ -3612,6 +3625,12 @@
                                         SymbolType::BuiltIn,
                                         std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
                                         StaticType::Get<EbtFloat, EbpMedium, EvqPointSize, 1, 1>());
+constexpr const TVariable kgl_PointSize300(
+    BuiltInId::gl_PointSize300,
+    BuiltInName::gl_PointSize,
+    SymbolType::BuiltIn,
+    std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
+    StaticType::Get<EbtFloat, EbpHigh, EvqPointSize, 1, 1>());
 constexpr const TVariable kgl_Position(BuiltInId::gl_Position,
                                        BuiltInName::gl_Position,
                                        SymbolType::BuiltIn,
@@ -3710,7 +3729,7 @@
                                         BuiltInName::gl_TessCoord,
                                         SymbolType::BuiltIn,
                                         std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                        StaticType::Get<EbtFloat, EbpHigh, EvqGlobal, 3, 1>());
+                                        StaticType::Get<EbtFloat, EbpHigh, EvqTessCoord, 3, 1>());
 constexpr const TVariable kgl_VertexID(BuiltInId::gl_VertexID,
                                        BuiltInName::gl_VertexID,
                                        SymbolType::BuiltIn,
@@ -4364,92 +4383,92 @@
                                      BuiltInName::_empty,
                                      SymbolType::BuiltIn,
                                      std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                     StaticType::Get<EbtInt, EbpUndefined, EvqInOut, 1, 1>());
+                                     StaticType::Get<EbtInt, EbpUndefined, EvqParamInOut, 1, 1>());
 constexpr const TVariable kpt_io_00E(BuiltInId::pt_io_00E,
                                      BuiltInName::_empty,
                                      SymbolType::BuiltIn,
                                      std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                     StaticType::Get<EbtUInt, EbpUndefined, EvqInOut, 1, 1>());
+                                     StaticType::Get<EbtUInt, EbpUndefined, EvqParamInOut, 1, 1>());
 constexpr const TVariable kpt_o_00B(BuiltInId::pt_o_00B,
                                     BuiltInName::_empty,
                                     SymbolType::BuiltIn,
                                     std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                    StaticType::Get<EbtFloat, EbpUndefined, EvqOut, 1, 1>());
+                                    StaticType::Get<EbtFloat, EbpUndefined, EvqParamOut, 1, 1>());
 constexpr const TVariable kpt_o_00C(BuiltInId::pt_o_00C,
                                     BuiltInName::_empty,
                                     SymbolType::BuiltIn,
                                     std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                    StaticType::Get<EbtDouble, EbpUndefined, EvqOut, 1, 1>());
+                                    StaticType::Get<EbtDouble, EbpUndefined, EvqParamOut, 1, 1>());
 constexpr const TVariable kpt_o_00D(BuiltInId::pt_o_00D,
                                     BuiltInName::_empty,
                                     SymbolType::BuiltIn,
                                     std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                    StaticType::Get<EbtInt, EbpUndefined, EvqOut, 1, 1>());
+                                    StaticType::Get<EbtInt, EbpUndefined, EvqParamOut, 1, 1>());
 constexpr const TVariable kpt_o_00E(BuiltInId::pt_o_00E,
                                     BuiltInName::_empty,
                                     SymbolType::BuiltIn,
                                     std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                    StaticType::Get<EbtUInt, EbpUndefined, EvqOut, 1, 1>());
+                                    StaticType::Get<EbtUInt, EbpUndefined, EvqParamOut, 1, 1>());
 constexpr const TVariable kpt_o_10B(BuiltInId::pt_o_10B,
                                     BuiltInName::_empty,
                                     SymbolType::BuiltIn,
                                     std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                    StaticType::Get<EbtFloat, EbpUndefined, EvqOut, 2, 1>());
+                                    StaticType::Get<EbtFloat, EbpUndefined, EvqParamOut, 2, 1>());
 constexpr const TVariable kpt_o_10C(BuiltInId::pt_o_10C,
                                     BuiltInName::_empty,
                                     SymbolType::BuiltIn,
                                     std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                    StaticType::Get<EbtDouble, EbpUndefined, EvqOut, 2, 1>());
+                                    StaticType::Get<EbtDouble, EbpUndefined, EvqParamOut, 2, 1>());
 constexpr const TVariable kpt_o_10D(BuiltInId::pt_o_10D,
                                     BuiltInName::_empty,
                                     SymbolType::BuiltIn,
                                     std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                    StaticType::Get<EbtInt, EbpUndefined, EvqOut, 2, 1>());
+                                    StaticType::Get<EbtInt, EbpUndefined, EvqParamOut, 2, 1>());
 constexpr const TVariable kpt_o_10E(BuiltInId::pt_o_10E,
                                     BuiltInName::_empty,
                                     SymbolType::BuiltIn,
                                     std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                    StaticType::Get<EbtUInt, EbpUndefined, EvqOut, 2, 1>());
+                                    StaticType::Get<EbtUInt, EbpUndefined, EvqParamOut, 2, 1>());
 constexpr const TVariable kpt_o_20B(BuiltInId::pt_o_20B,
                                     BuiltInName::_empty,
                                     SymbolType::BuiltIn,
                                     std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                    StaticType::Get<EbtFloat, EbpUndefined, EvqOut, 3, 1>());
+                                    StaticType::Get<EbtFloat, EbpUndefined, EvqParamOut, 3, 1>());
 constexpr const TVariable kpt_o_20C(BuiltInId::pt_o_20C,
                                     BuiltInName::_empty,
                                     SymbolType::BuiltIn,
                                     std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                    StaticType::Get<EbtDouble, EbpUndefined, EvqOut, 3, 1>());
+                                    StaticType::Get<EbtDouble, EbpUndefined, EvqParamOut, 3, 1>());
 constexpr const TVariable kpt_o_20D(BuiltInId::pt_o_20D,
                                     BuiltInName::_empty,
                                     SymbolType::BuiltIn,
                                     std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                    StaticType::Get<EbtInt, EbpUndefined, EvqOut, 3, 1>());
+                                    StaticType::Get<EbtInt, EbpUndefined, EvqParamOut, 3, 1>());
 constexpr const TVariable kpt_o_20E(BuiltInId::pt_o_20E,
                                     BuiltInName::_empty,
                                     SymbolType::BuiltIn,
                                     std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                    StaticType::Get<EbtUInt, EbpUndefined, EvqOut, 3, 1>());
+                                    StaticType::Get<EbtUInt, EbpUndefined, EvqParamOut, 3, 1>());
 constexpr const TVariable kpt_o_30B(BuiltInId::pt_o_30B,
                                     BuiltInName::_empty,
                                     SymbolType::BuiltIn,
                                     std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                    StaticType::Get<EbtFloat, EbpUndefined, EvqOut, 4, 1>());
+                                    StaticType::Get<EbtFloat, EbpUndefined, EvqParamOut, 4, 1>());
 constexpr const TVariable kpt_o_30C(BuiltInId::pt_o_30C,
                                     BuiltInName::_empty,
                                     SymbolType::BuiltIn,
                                     std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                    StaticType::Get<EbtDouble, EbpUndefined, EvqOut, 4, 1>());
+                                    StaticType::Get<EbtDouble, EbpUndefined, EvqParamOut, 4, 1>());
 constexpr const TVariable kpt_o_30D(BuiltInId::pt_o_30D,
                                     BuiltInName::_empty,
                                     SymbolType::BuiltIn,
                                     std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                    StaticType::Get<EbtInt, EbpUndefined, EvqOut, 4, 1>());
+                                    StaticType::Get<EbtInt, EbpUndefined, EvqParamOut, 4, 1>());
 constexpr const TVariable kpt_o_30E(BuiltInId::pt_o_30E,
                                     BuiltInName::_empty,
                                     SymbolType::BuiltIn,
                                     std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                    StaticType::Get<EbtUInt, EbpUndefined, EvqOut, 4, 1>());
+                                    StaticType::Get<EbtUInt, EbpUndefined, EvqParamOut, 4, 1>());
 
 const TVariable *angle_BaseInstance()
 {
@@ -4486,6 +4505,11 @@
     return &kgl_FragCoord;
 }
 
+const TVariable *gl_FragCoord300()
+{
+    return &kgl_FragCoord300;
+}
+
 const TVariable *gl_FragDepth()
 {
     return &kgl_FragDepth;
@@ -4626,6 +4650,11 @@
     return &kgl_PointSize;
 }
 
+const TVariable *gl_PointSize300()
+{
+    return &kgl_PointSize300;
+}
+
 const TVariable *gl_Position()
 {
     return &kgl_Position;
@@ -5806,7 +5835,7 @@
 constexpr const TFunction radians_00B(BuiltInId::radians_Float1,
                                       BuiltInName::radians,
                                       std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                      BuiltInParameters::p00B30B,
+                                      BuiltInParameters::p00B00B00B,
                                       1,
                                       StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 1, 1>(),
                                       EOpRadians,
@@ -5814,7 +5843,7 @@
 constexpr const TFunction radians_10B(BuiltInId::radians_Float2,
                                       BuiltInName::radians,
                                       std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                      BuiltInParameters::p10B00D,
+                                      BuiltInParameters::p10B00B00B,
                                       1,
                                       StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 2, 1>(),
                                       EOpRadians,
@@ -5822,7 +5851,7 @@
 constexpr const TFunction radians_20B(BuiltInId::radians_Float3,
                                       BuiltInName::radians,
                                       std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                      BuiltInParameters::p20B20B00B,
+                                      BuiltInParameters::p20B00B00B,
                                       1,
                                       StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 3, 1>(),
                                       EOpRadians,
@@ -5830,7 +5859,7 @@
 constexpr const TFunction radians_30B(BuiltInId::radians_Float4,
                                       BuiltInName::radians,
                                       std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                      BuiltInParameters::p30B10B,
+                                      BuiltInParameters::p30B00B00B,
                                       1,
                                       StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 4, 1>(),
                                       EOpRadians,
@@ -5838,7 +5867,7 @@
 constexpr const TFunction degrees_00B(BuiltInId::degrees_Float1,
                                       BuiltInName::degrees,
                                       std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                      BuiltInParameters::p00B30B,
+                                      BuiltInParameters::p00B00B00B,
                                       1,
                                       StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 1, 1>(),
                                       EOpDegrees,
@@ -5846,7 +5875,7 @@
 constexpr const TFunction degrees_10B(BuiltInId::degrees_Float2,
                                       BuiltInName::degrees,
                                       std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                      BuiltInParameters::p10B00D,
+                                      BuiltInParameters::p10B00B00B,
                                       1,
                                       StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 2, 1>(),
                                       EOpDegrees,
@@ -5854,7 +5883,7 @@
 constexpr const TFunction degrees_20B(BuiltInId::degrees_Float3,
                                       BuiltInName::degrees,
                                       std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                      BuiltInParameters::p20B20B00B,
+                                      BuiltInParameters::p20B00B00B,
                                       1,
                                       StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 3, 1>(),
                                       EOpDegrees,
@@ -5862,7 +5891,7 @@
 constexpr const TFunction degrees_30B(BuiltInId::degrees_Float4,
                                       BuiltInName::degrees,
                                       std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                      BuiltInParameters::p30B10B,
+                                      BuiltInParameters::p30B00B00B,
                                       1,
                                       StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 4, 1>(),
                                       EOpDegrees,
@@ -5870,7 +5899,7 @@
 constexpr const TFunction sin_00B(BuiltInId::sin_Float1,
                                   BuiltInName::sin,
                                   std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                  BuiltInParameters::p00B30B,
+                                  BuiltInParameters::p00B00B00B,
                                   1,
                                   StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 1, 1>(),
                                   EOpSin,
@@ -5878,7 +5907,7 @@
 constexpr const TFunction sin_10B(BuiltInId::sin_Float2,
                                   BuiltInName::sin,
                                   std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                  BuiltInParameters::p10B00D,
+                                  BuiltInParameters::p10B00B00B,
                                   1,
                                   StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 2, 1>(),
                                   EOpSin,
@@ -5886,7 +5915,7 @@
 constexpr const TFunction sin_20B(BuiltInId::sin_Float3,
                                   BuiltInName::sin,
                                   std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                  BuiltInParameters::p20B20B00B,
+                                  BuiltInParameters::p20B00B00B,
                                   1,
                                   StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 3, 1>(),
                                   EOpSin,
@@ -5894,7 +5923,7 @@
 constexpr const TFunction sin_30B(BuiltInId::sin_Float4,
                                   BuiltInName::sin,
                                   std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                  BuiltInParameters::p30B10B,
+                                  BuiltInParameters::p30B00B00B,
                                   1,
                                   StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 4, 1>(),
                                   EOpSin,
@@ -5902,7 +5931,7 @@
 constexpr const TFunction cos_00B(BuiltInId::cos_Float1,
                                   BuiltInName::cos,
                                   std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                  BuiltInParameters::p00B30B,
+                                  BuiltInParameters::p00B00B00B,
                                   1,
                                   StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 1, 1>(),
                                   EOpCos,
@@ -5910,7 +5939,7 @@
 constexpr const TFunction cos_10B(BuiltInId::cos_Float2,
                                   BuiltInName::cos,
                                   std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                  BuiltInParameters::p10B00D,
+                                  BuiltInParameters::p10B00B00B,
                                   1,
                                   StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 2, 1>(),
                                   EOpCos,
@@ -5918,7 +5947,7 @@
 constexpr const TFunction cos_20B(BuiltInId::cos_Float3,
                                   BuiltInName::cos,
                                   std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                  BuiltInParameters::p20B20B00B,
+                                  BuiltInParameters::p20B00B00B,
                                   1,
                                   StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 3, 1>(),
                                   EOpCos,
@@ -5926,7 +5955,7 @@
 constexpr const TFunction cos_30B(BuiltInId::cos_Float4,
                                   BuiltInName::cos,
                                   std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                  BuiltInParameters::p30B10B,
+                                  BuiltInParameters::p30B00B00B,
                                   1,
                                   StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 4, 1>(),
                                   EOpCos,
@@ -5934,7 +5963,7 @@
 constexpr const TFunction tan_00B(BuiltInId::tan_Float1,
                                   BuiltInName::tan,
                                   std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                  BuiltInParameters::p00B30B,
+                                  BuiltInParameters::p00B00B00B,
                                   1,
                                   StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 1, 1>(),
                                   EOpTan,
@@ -5942,7 +5971,7 @@
 constexpr const TFunction tan_10B(BuiltInId::tan_Float2,
                                   BuiltInName::tan,
                                   std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                  BuiltInParameters::p10B00D,
+                                  BuiltInParameters::p10B00B00B,
                                   1,
                                   StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 2, 1>(),
                                   EOpTan,
@@ -5950,7 +5979,7 @@
 constexpr const TFunction tan_20B(BuiltInId::tan_Float3,
                                   BuiltInName::tan,
                                   std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                  BuiltInParameters::p20B20B00B,
+                                  BuiltInParameters::p20B00B00B,
                                   1,
                                   StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 3, 1>(),
                                   EOpTan,
@@ -5958,7 +5987,7 @@
 constexpr const TFunction tan_30B(BuiltInId::tan_Float4,
                                   BuiltInName::tan,
                                   std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                  BuiltInParameters::p30B10B,
+                                  BuiltInParameters::p30B00B00B,
                                   1,
                                   StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 4, 1>(),
                                   EOpTan,
@@ -5966,7 +5995,7 @@
 constexpr const TFunction asin_00B(BuiltInId::asin_Float1,
                                    BuiltInName::asin,
                                    std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                   BuiltInParameters::p00B30B,
+                                   BuiltInParameters::p00B00B00B,
                                    1,
                                    StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 1, 1>(),
                                    EOpAsin,
@@ -5974,7 +6003,7 @@
 constexpr const TFunction asin_10B(BuiltInId::asin_Float2,
                                    BuiltInName::asin,
                                    std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                   BuiltInParameters::p10B00D,
+                                   BuiltInParameters::p10B00B00B,
                                    1,
                                    StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 2, 1>(),
                                    EOpAsin,
@@ -5982,7 +6011,7 @@
 constexpr const TFunction asin_20B(BuiltInId::asin_Float3,
                                    BuiltInName::asin,
                                    std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                   BuiltInParameters::p20B20B00B,
+                                   BuiltInParameters::p20B00B00B,
                                    1,
                                    StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 3, 1>(),
                                    EOpAsin,
@@ -5990,7 +6019,7 @@
 constexpr const TFunction asin_30B(BuiltInId::asin_Float4,
                                    BuiltInName::asin,
                                    std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                   BuiltInParameters::p30B10B,
+                                   BuiltInParameters::p30B00B00B,
                                    1,
                                    StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 4, 1>(),
                                    EOpAsin,
@@ -5998,7 +6027,7 @@
 constexpr const TFunction acos_00B(BuiltInId::acos_Float1,
                                    BuiltInName::acos,
                                    std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                   BuiltInParameters::p00B30B,
+                                   BuiltInParameters::p00B00B00B,
                                    1,
                                    StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 1, 1>(),
                                    EOpAcos,
@@ -6006,7 +6035,7 @@
 constexpr const TFunction acos_10B(BuiltInId::acos_Float2,
                                    BuiltInName::acos,
                                    std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                   BuiltInParameters::p10B00D,
+                                   BuiltInParameters::p10B00B00B,
                                    1,
                                    StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 2, 1>(),
                                    EOpAcos,
@@ -6014,7 +6043,7 @@
 constexpr const TFunction acos_20B(BuiltInId::acos_Float3,
                                    BuiltInName::acos,
                                    std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                   BuiltInParameters::p20B20B00B,
+                                   BuiltInParameters::p20B00B00B,
                                    1,
                                    StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 3, 1>(),
                                    EOpAcos,
@@ -6022,7 +6051,7 @@
 constexpr const TFunction acos_30B(BuiltInId::acos_Float4,
                                    BuiltInName::acos,
                                    std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                   BuiltInParameters::p30B10B,
+                                   BuiltInParameters::p30B00B00B,
                                    1,
                                    StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 4, 1>(),
                                    EOpAcos,
@@ -6030,7 +6059,7 @@
 constexpr const TFunction atan_00B00B(BuiltInId::atan_Float1_Float1,
                                       BuiltInName::atan,
                                       std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                      BuiltInParameters::p00B00B20B,
+                                      BuiltInParameters::p00B00B00B,
                                       2,
                                       StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 1, 1>(),
                                       EOpAtan,
@@ -6062,7 +6091,7 @@
 constexpr const TFunction atan_00B(BuiltInId::atan_Float1,
                                    BuiltInName::atan,
                                    std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                   BuiltInParameters::p00B30B,
+                                   BuiltInParameters::p00B00B00B,
                                    1,
                                    StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 1, 1>(),
                                    EOpAtan,
@@ -6070,7 +6099,7 @@
 constexpr const TFunction atan_10B(BuiltInId::atan_Float2,
                                    BuiltInName::atan,
                                    std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                   BuiltInParameters::p10B00D,
+                                   BuiltInParameters::p10B00B00B,
                                    1,
                                    StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 2, 1>(),
                                    EOpAtan,
@@ -6078,7 +6107,7 @@
 constexpr const TFunction atan_20B(BuiltInId::atan_Float3,
                                    BuiltInName::atan,
                                    std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                   BuiltInParameters::p20B20B00B,
+                                   BuiltInParameters::p20B00B00B,
                                    1,
                                    StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 3, 1>(),
                                    EOpAtan,
@@ -6086,7 +6115,7 @@
 constexpr const TFunction atan_30B(BuiltInId::atan_Float4,
                                    BuiltInName::atan,
                                    std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                   BuiltInParameters::p30B10B,
+                                   BuiltInParameters::p30B00B00B,
                                    1,
                                    StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 4, 1>(),
                                    EOpAtan,
@@ -6094,7 +6123,7 @@
 constexpr const TFunction sinh_00B(BuiltInId::sinh_Float1,
                                    BuiltInName::sinh,
                                    std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                   BuiltInParameters::p00B30B,
+                                   BuiltInParameters::p00B00B00B,
                                    1,
                                    StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 1, 1>(),
                                    EOpSinh,
@@ -6102,7 +6131,7 @@
 constexpr const TFunction sinh_10B(BuiltInId::sinh_Float2,
                                    BuiltInName::sinh,
                                    std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                   BuiltInParameters::p10B00D,
+                                   BuiltInParameters::p10B00B00B,
                                    1,
                                    StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 2, 1>(),
                                    EOpSinh,
@@ -6110,7 +6139,7 @@
 constexpr const TFunction sinh_20B(BuiltInId::sinh_Float3,
                                    BuiltInName::sinh,
                                    std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                   BuiltInParameters::p20B20B00B,
+                                   BuiltInParameters::p20B00B00B,
                                    1,
                                    StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 3, 1>(),
                                    EOpSinh,
@@ -6118,7 +6147,7 @@
 constexpr const TFunction sinh_30B(BuiltInId::sinh_Float4,
                                    BuiltInName::sinh,
                                    std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                   BuiltInParameters::p30B10B,
+                                   BuiltInParameters::p30B00B00B,
                                    1,
                                    StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 4, 1>(),
                                    EOpSinh,
@@ -6126,7 +6155,7 @@
 constexpr const TFunction cosh_00B(BuiltInId::cosh_Float1,
                                    BuiltInName::cosh,
                                    std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                   BuiltInParameters::p00B30B,
+                                   BuiltInParameters::p00B00B00B,
                                    1,
                                    StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 1, 1>(),
                                    EOpCosh,
@@ -6134,7 +6163,7 @@
 constexpr const TFunction cosh_10B(BuiltInId::cosh_Float2,
                                    BuiltInName::cosh,
                                    std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                   BuiltInParameters::p10B00D,
+                                   BuiltInParameters::p10B00B00B,
                                    1,
                                    StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 2, 1>(),
                                    EOpCosh,
@@ -6142,7 +6171,7 @@
 constexpr const TFunction cosh_20B(BuiltInId::cosh_Float3,
                                    BuiltInName::cosh,
                                    std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                   BuiltInParameters::p20B20B00B,
+                                   BuiltInParameters::p20B00B00B,
                                    1,
                                    StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 3, 1>(),
                                    EOpCosh,
@@ -6150,7 +6179,7 @@
 constexpr const TFunction cosh_30B(BuiltInId::cosh_Float4,
                                    BuiltInName::cosh,
                                    std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                   BuiltInParameters::p30B10B,
+                                   BuiltInParameters::p30B00B00B,
                                    1,
                                    StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 4, 1>(),
                                    EOpCosh,
@@ -6158,7 +6187,7 @@
 constexpr const TFunction tanh_00B(BuiltInId::tanh_Float1,
                                    BuiltInName::tanh,
                                    std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                   BuiltInParameters::p00B30B,
+                                   BuiltInParameters::p00B00B00B,
                                    1,
                                    StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 1, 1>(),
                                    EOpTanh,
@@ -6166,7 +6195,7 @@
 constexpr const TFunction tanh_10B(BuiltInId::tanh_Float2,
                                    BuiltInName::tanh,
                                    std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                   BuiltInParameters::p10B00D,
+                                   BuiltInParameters::p10B00B00B,
                                    1,
                                    StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 2, 1>(),
                                    EOpTanh,
@@ -6174,7 +6203,7 @@
 constexpr const TFunction tanh_20B(BuiltInId::tanh_Float3,
                                    BuiltInName::tanh,
                                    std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                   BuiltInParameters::p20B20B00B,
+                                   BuiltInParameters::p20B00B00B,
                                    1,
                                    StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 3, 1>(),
                                    EOpTanh,
@@ -6182,7 +6211,7 @@
 constexpr const TFunction tanh_30B(BuiltInId::tanh_Float4,
                                    BuiltInName::tanh,
                                    std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                   BuiltInParameters::p30B10B,
+                                   BuiltInParameters::p30B00B00B,
                                    1,
                                    StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 4, 1>(),
                                    EOpTanh,
@@ -6190,7 +6219,7 @@
 constexpr const TFunction asinh_00B(BuiltInId::asinh_Float1,
                                     BuiltInName::asinh,
                                     std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                    BuiltInParameters::p00B30B,
+                                    BuiltInParameters::p00B00B00B,
                                     1,
                                     StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 1, 1>(),
                                     EOpAsinh,
@@ -6198,7 +6227,7 @@
 constexpr const TFunction asinh_10B(BuiltInId::asinh_Float2,
                                     BuiltInName::asinh,
                                     std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                    BuiltInParameters::p10B00D,
+                                    BuiltInParameters::p10B00B00B,
                                     1,
                                     StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 2, 1>(),
                                     EOpAsinh,
@@ -6206,7 +6235,7 @@
 constexpr const TFunction asinh_20B(BuiltInId::asinh_Float3,
                                     BuiltInName::asinh,
                                     std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                    BuiltInParameters::p20B20B00B,
+                                    BuiltInParameters::p20B00B00B,
                                     1,
                                     StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 3, 1>(),
                                     EOpAsinh,
@@ -6214,7 +6243,7 @@
 constexpr const TFunction asinh_30B(BuiltInId::asinh_Float4,
                                     BuiltInName::asinh,
                                     std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                    BuiltInParameters::p30B10B,
+                                    BuiltInParameters::p30B00B00B,
                                     1,
                                     StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 4, 1>(),
                                     EOpAsinh,
@@ -6222,7 +6251,7 @@
 constexpr const TFunction acosh_00B(BuiltInId::acosh_Float1,
                                     BuiltInName::acosh,
                                     std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                    BuiltInParameters::p00B30B,
+                                    BuiltInParameters::p00B00B00B,
                                     1,
                                     StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 1, 1>(),
                                     EOpAcosh,
@@ -6230,7 +6259,7 @@
 constexpr const TFunction acosh_10B(BuiltInId::acosh_Float2,
                                     BuiltInName::acosh,
                                     std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                    BuiltInParameters::p10B00D,
+                                    BuiltInParameters::p10B00B00B,
                                     1,
                                     StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 2, 1>(),
                                     EOpAcosh,
@@ -6238,7 +6267,7 @@
 constexpr const TFunction acosh_20B(BuiltInId::acosh_Float3,
                                     BuiltInName::acosh,
                                     std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                    BuiltInParameters::p20B20B00B,
+                                    BuiltInParameters::p20B00B00B,
                                     1,
                                     StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 3, 1>(),
                                     EOpAcosh,
@@ -6246,7 +6275,7 @@
 constexpr const TFunction acosh_30B(BuiltInId::acosh_Float4,
                                     BuiltInName::acosh,
                                     std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                    BuiltInParameters::p30B10B,
+                                    BuiltInParameters::p30B00B00B,
                                     1,
                                     StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 4, 1>(),
                                     EOpAcosh,
@@ -6254,7 +6283,7 @@
 constexpr const TFunction atanh_00B(BuiltInId::atanh_Float1,
                                     BuiltInName::atanh,
                                     std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                    BuiltInParameters::p00B30B,
+                                    BuiltInParameters::p00B00B00B,
                                     1,
                                     StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 1, 1>(),
                                     EOpAtanh,
@@ -6262,7 +6291,7 @@
 constexpr const TFunction atanh_10B(BuiltInId::atanh_Float2,
                                     BuiltInName::atanh,
                                     std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                    BuiltInParameters::p10B00D,
+                                    BuiltInParameters::p10B00B00B,
                                     1,
                                     StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 2, 1>(),
                                     EOpAtanh,
@@ -6270,7 +6299,7 @@
 constexpr const TFunction atanh_20B(BuiltInId::atanh_Float3,
                                     BuiltInName::atanh,
                                     std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                    BuiltInParameters::p20B20B00B,
+                                    BuiltInParameters::p20B00B00B,
                                     1,
                                     StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 3, 1>(),
                                     EOpAtanh,
@@ -6278,7 +6307,7 @@
 constexpr const TFunction atanh_30B(BuiltInId::atanh_Float4,
                                     BuiltInName::atanh,
                                     std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                    BuiltInParameters::p30B10B,
+                                    BuiltInParameters::p30B00B00B,
                                     1,
                                     StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 4, 1>(),
                                     EOpAtanh,
@@ -6286,7 +6315,7 @@
 constexpr const TFunction pow_00B00B(BuiltInId::pow_Float1_Float1,
                                      BuiltInName::pow,
                                      std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                     BuiltInParameters::p00B00B20B,
+                                     BuiltInParameters::p00B00B00B,
                                      2,
                                      StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 1, 1>(),
                                      EOpPow,
@@ -6318,7 +6347,7 @@
 constexpr const TFunction exp_00B(BuiltInId::exp_Float1,
                                   BuiltInName::exp,
                                   std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                  BuiltInParameters::p00B30B,
+                                  BuiltInParameters::p00B00B00B,
                                   1,
                                   StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 1, 1>(),
                                   EOpExp,
@@ -6326,7 +6355,7 @@
 constexpr const TFunction exp_10B(BuiltInId::exp_Float2,
                                   BuiltInName::exp,
                                   std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                  BuiltInParameters::p10B00D,
+                                  BuiltInParameters::p10B00B00B,
                                   1,
                                   StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 2, 1>(),
                                   EOpExp,
@@ -6334,7 +6363,7 @@
 constexpr const TFunction exp_20B(BuiltInId::exp_Float3,
                                   BuiltInName::exp,
                                   std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                  BuiltInParameters::p20B20B00B,
+                                  BuiltInParameters::p20B00B00B,
                                   1,
                                   StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 3, 1>(),
                                   EOpExp,
@@ -6342,7 +6371,7 @@
 constexpr const TFunction exp_30B(BuiltInId::exp_Float4,
                                   BuiltInName::exp,
                                   std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                  BuiltInParameters::p30B10B,
+                                  BuiltInParameters::p30B00B00B,
                                   1,
                                   StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 4, 1>(),
                                   EOpExp,
@@ -6350,7 +6379,7 @@
 constexpr const TFunction log_00B(BuiltInId::log_Float1,
                                   BuiltInName::log,
                                   std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                  BuiltInParameters::p00B30B,
+                                  BuiltInParameters::p00B00B00B,
                                   1,
                                   StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 1, 1>(),
                                   EOpLog,
@@ -6358,7 +6387,7 @@
 constexpr const TFunction log_10B(BuiltInId::log_Float2,
                                   BuiltInName::log,
                                   std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                  BuiltInParameters::p10B00D,
+                                  BuiltInParameters::p10B00B00B,
                                   1,
                                   StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 2, 1>(),
                                   EOpLog,
@@ -6366,7 +6395,7 @@
 constexpr const TFunction log_20B(BuiltInId::log_Float3,
                                   BuiltInName::log,
                                   std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                  BuiltInParameters::p20B20B00B,
+                                  BuiltInParameters::p20B00B00B,
                                   1,
                                   StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 3, 1>(),
                                   EOpLog,
@@ -6374,7 +6403,7 @@
 constexpr const TFunction log_30B(BuiltInId::log_Float4,
                                   BuiltInName::log,
                                   std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                  BuiltInParameters::p30B10B,
+                                  BuiltInParameters::p30B00B00B,
                                   1,
                                   StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 4, 1>(),
                                   EOpLog,
@@ -6382,7 +6411,7 @@
 constexpr const TFunction exp2_00B(BuiltInId::exp2_Float1,
                                    BuiltInName::exp2,
                                    std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                   BuiltInParameters::p00B30B,
+                                   BuiltInParameters::p00B00B00B,
                                    1,
                                    StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 1, 1>(),
                                    EOpExp2,
@@ -6390,7 +6419,7 @@
 constexpr const TFunction exp2_10B(BuiltInId::exp2_Float2,
                                    BuiltInName::exp2,
                                    std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                   BuiltInParameters::p10B00D,
+                                   BuiltInParameters::p10B00B00B,
                                    1,
                                    StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 2, 1>(),
                                    EOpExp2,
@@ -6398,7 +6427,7 @@
 constexpr const TFunction exp2_20B(BuiltInId::exp2_Float3,
                                    BuiltInName::exp2,
                                    std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                   BuiltInParameters::p20B20B00B,
+                                   BuiltInParameters::p20B00B00B,
                                    1,
                                    StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 3, 1>(),
                                    EOpExp2,
@@ -6406,7 +6435,7 @@
 constexpr const TFunction exp2_30B(BuiltInId::exp2_Float4,
                                    BuiltInName::exp2,
                                    std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                   BuiltInParameters::p30B10B,
+                                   BuiltInParameters::p30B00B00B,
                                    1,
                                    StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 4, 1>(),
                                    EOpExp2,
@@ -6414,7 +6443,7 @@
 constexpr const TFunction log2_00B(BuiltInId::log2_Float1,
                                    BuiltInName::log2,
                                    std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                   BuiltInParameters::p00B30B,
+                                   BuiltInParameters::p00B00B00B,
                                    1,
                                    StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 1, 1>(),
                                    EOpLog2,
@@ -6422,7 +6451,7 @@
 constexpr const TFunction log2_10B(BuiltInId::log2_Float2,
                                    BuiltInName::log2,
                                    std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                   BuiltInParameters::p10B00D,
+                                   BuiltInParameters::p10B00B00B,
                                    1,
                                    StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 2, 1>(),
                                    EOpLog2,
@@ -6430,7 +6459,7 @@
 constexpr const TFunction log2_20B(BuiltInId::log2_Float3,
                                    BuiltInName::log2,
                                    std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                   BuiltInParameters::p20B20B00B,
+                                   BuiltInParameters::p20B00B00B,
                                    1,
                                    StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 3, 1>(),
                                    EOpLog2,
@@ -6438,7 +6467,7 @@
 constexpr const TFunction log2_30B(BuiltInId::log2_Float4,
                                    BuiltInName::log2,
                                    std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                   BuiltInParameters::p30B10B,
+                                   BuiltInParameters::p30B00B00B,
                                    1,
                                    StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 4, 1>(),
                                    EOpLog2,
@@ -6446,7 +6475,7 @@
 constexpr const TFunction sqrt_00B(BuiltInId::sqrt_Float1,
                                    BuiltInName::sqrt,
                                    std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                   BuiltInParameters::p00B30B,
+                                   BuiltInParameters::p00B00B00B,
                                    1,
                                    StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 1, 1>(),
                                    EOpSqrt,
@@ -6454,7 +6483,7 @@
 constexpr const TFunction sqrt_10B(BuiltInId::sqrt_Float2,
                                    BuiltInName::sqrt,
                                    std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                   BuiltInParameters::p10B00D,
+                                   BuiltInParameters::p10B00B00B,
                                    1,
                                    StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 2, 1>(),
                                    EOpSqrt,
@@ -6462,7 +6491,7 @@
 constexpr const TFunction sqrt_20B(BuiltInId::sqrt_Float3,
                                    BuiltInName::sqrt,
                                    std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                   BuiltInParameters::p20B20B00B,
+                                   BuiltInParameters::p20B00B00B,
                                    1,
                                    StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 3, 1>(),
                                    EOpSqrt,
@@ -6470,7 +6499,7 @@
 constexpr const TFunction sqrt_30B(BuiltInId::sqrt_Float4,
                                    BuiltInName::sqrt,
                                    std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                   BuiltInParameters::p30B10B,
+                                   BuiltInParameters::p30B00B00B,
                                    1,
                                    StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 4, 1>(),
                                    EOpSqrt,
@@ -6486,7 +6515,7 @@
 constexpr const TFunction sqrt_10C(BuiltInId::sqrt_Double2,
                                    BuiltInName::sqrt,
                                    std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                   BuiltInParameters::p10C10C00C,
+                                   BuiltInParameters::p10C00C00C,
                                    1,
                                    StaticType::Get<EbtDouble, EbpUndefined, EvqGlobal, 2, 1>(),
                                    EOpSqrt,
@@ -6494,7 +6523,7 @@
 constexpr const TFunction sqrt_20C(BuiltInId::sqrt_Double3,
                                    BuiltInName::sqrt,
                                    std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                   BuiltInParameters::p20C_o_20D,
+                                   BuiltInParameters::p20C00C00C,
                                    1,
                                    StaticType::Get<EbtDouble, EbpUndefined, EvqGlobal, 3, 1>(),
                                    EOpSqrt,
@@ -6511,7 +6540,7 @@
     BuiltInId::inversesqrt_Float1,
     BuiltInName::inversesqrt,
     std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-    BuiltInParameters::p00B30B,
+    BuiltInParameters::p00B00B00B,
     1,
     StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 1, 1>(),
     EOpInversesqrt,
@@ -6520,7 +6549,7 @@
     BuiltInId::inversesqrt_Float2,
     BuiltInName::inversesqrt,
     std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-    BuiltInParameters::p10B00D,
+    BuiltInParameters::p10B00B00B,
     1,
     StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 2, 1>(),
     EOpInversesqrt,
@@ -6529,7 +6558,7 @@
     BuiltInId::inversesqrt_Float3,
     BuiltInName::inversesqrt,
     std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-    BuiltInParameters::p20B20B00B,
+    BuiltInParameters::p20B00B00B,
     1,
     StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 3, 1>(),
     EOpInversesqrt,
@@ -6538,7 +6567,7 @@
     BuiltInId::inversesqrt_Float4,
     BuiltInName::inversesqrt,
     std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-    BuiltInParameters::p30B10B,
+    BuiltInParameters::p30B00B00B,
     1,
     StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 4, 1>(),
     EOpInversesqrt,
@@ -6556,7 +6585,7 @@
     BuiltInId::inversesqrt_Double2,
     BuiltInName::inversesqrt,
     std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-    BuiltInParameters::p10C10C00C,
+    BuiltInParameters::p10C00C00C,
     1,
     StaticType::Get<EbtDouble, EbpUndefined, EvqGlobal, 2, 1>(),
     EOpInversesqrt,
@@ -6565,7 +6594,7 @@
     BuiltInId::inversesqrt_Double3,
     BuiltInName::inversesqrt,
     std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-    BuiltInParameters::p20C_o_20D,
+    BuiltInParameters::p20C00C00C,
     1,
     StaticType::Get<EbtDouble, EbpUndefined, EvqGlobal, 3, 1>(),
     EOpInversesqrt,
@@ -6582,7 +6611,7 @@
 constexpr const TFunction abs_00B(BuiltInId::abs_Float1,
                                   BuiltInName::abs,
                                   std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                  BuiltInParameters::p00B30B,
+                                  BuiltInParameters::p00B00B00B,
                                   1,
                                   StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 1, 1>(),
                                   EOpAbs,
@@ -6590,7 +6619,7 @@
 constexpr const TFunction abs_10B(BuiltInId::abs_Float2,
                                   BuiltInName::abs,
                                   std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                  BuiltInParameters::p10B00D,
+                                  BuiltInParameters::p10B00B00B,
                                   1,
                                   StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 2, 1>(),
                                   EOpAbs,
@@ -6598,7 +6627,7 @@
 constexpr const TFunction abs_20B(BuiltInId::abs_Float3,
                                   BuiltInName::abs,
                                   std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                  BuiltInParameters::p20B20B00B,
+                                  BuiltInParameters::p20B00B00B,
                                   1,
                                   StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 3, 1>(),
                                   EOpAbs,
@@ -6606,7 +6635,7 @@
 constexpr const TFunction abs_30B(BuiltInId::abs_Float4,
                                   BuiltInName::abs,
                                   std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                  BuiltInParameters::p30B10B,
+                                  BuiltInParameters::p30B00B00B,
                                   1,
                                   StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 4, 1>(),
                                   EOpAbs,
@@ -6614,7 +6643,7 @@
 constexpr const TFunction abs_00D(BuiltInId::abs_Int1,
                                   BuiltInName::abs,
                                   std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                  BuiltInParameters::p00D00D00F,
+                                  BuiltInParameters::p00D00D00D00D,
                                   1,
                                   StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 1, 1>(),
                                   EOpAbs,
@@ -6622,7 +6651,7 @@
 constexpr const TFunction abs_10D(BuiltInId::abs_Int2,
                                   BuiltInName::abs,
                                   std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                  BuiltInParameters::p10D10D00D00D,
+                                  BuiltInParameters::p10D00D00D,
                                   1,
                                   StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 2, 1>(),
                                   EOpAbs,
@@ -6630,7 +6659,7 @@
 constexpr const TFunction abs_20D(BuiltInId::abs_Int3,
                                   BuiltInName::abs,
                                   std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                  BuiltInParameters::p20D20D20F,
+                                  BuiltInParameters::p20D00D00D,
                                   1,
                                   StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 3, 1>(),
                                   EOpAbs,
@@ -6638,7 +6667,7 @@
 constexpr const TFunction abs_30D(BuiltInId::abs_Int4,
                                   BuiltInName::abs,
                                   std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                  BuiltInParameters::p30D30D30F,
+                                  BuiltInParameters::p30D00D00D,
                                   1,
                                   StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 4, 1>(),
                                   EOpAbs,
@@ -6654,7 +6683,7 @@
 constexpr const TFunction abs_10C(BuiltInId::abs_Double2,
                                   BuiltInName::abs,
                                   std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                  BuiltInParameters::p10C10C00C,
+                                  BuiltInParameters::p10C00C00C,
                                   1,
                                   StaticType::Get<EbtDouble, EbpUndefined, EvqGlobal, 2, 1>(),
                                   EOpAbs,
@@ -6662,7 +6691,7 @@
 constexpr const TFunction abs_20C(BuiltInId::abs_Double3,
                                   BuiltInName::abs,
                                   std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                  BuiltInParameters::p20C_o_20D,
+                                  BuiltInParameters::p20C00C00C,
                                   1,
                                   StaticType::Get<EbtDouble, EbpUndefined, EvqGlobal, 3, 1>(),
                                   EOpAbs,
@@ -6678,7 +6707,7 @@
 constexpr const TFunction sign_00B(BuiltInId::sign_Float1,
                                    BuiltInName::sign,
                                    std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                   BuiltInParameters::p00B30B,
+                                   BuiltInParameters::p00B00B00B,
                                    1,
                                    StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 1, 1>(),
                                    EOpSign,
@@ -6686,7 +6715,7 @@
 constexpr const TFunction sign_10B(BuiltInId::sign_Float2,
                                    BuiltInName::sign,
                                    std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                   BuiltInParameters::p10B00D,
+                                   BuiltInParameters::p10B00B00B,
                                    1,
                                    StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 2, 1>(),
                                    EOpSign,
@@ -6694,7 +6723,7 @@
 constexpr const TFunction sign_20B(BuiltInId::sign_Float3,
                                    BuiltInName::sign,
                                    std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                   BuiltInParameters::p20B20B00B,
+                                   BuiltInParameters::p20B00B00B,
                                    1,
                                    StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 3, 1>(),
                                    EOpSign,
@@ -6702,7 +6731,7 @@
 constexpr const TFunction sign_30B(BuiltInId::sign_Float4,
                                    BuiltInName::sign,
                                    std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                   BuiltInParameters::p30B10B,
+                                   BuiltInParameters::p30B00B00B,
                                    1,
                                    StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 4, 1>(),
                                    EOpSign,
@@ -6710,7 +6739,7 @@
 constexpr const TFunction sign_00D(BuiltInId::sign_Int1,
                                    BuiltInName::sign,
                                    std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                   BuiltInParameters::p00D00D00F,
+                                   BuiltInParameters::p00D00D00D00D,
                                    1,
                                    StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 1, 1>(),
                                    EOpSign,
@@ -6718,7 +6747,7 @@
 constexpr const TFunction sign_10D(BuiltInId::sign_Int2,
                                    BuiltInName::sign,
                                    std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                   BuiltInParameters::p10D10D00D00D,
+                                   BuiltInParameters::p10D00D00D,
                                    1,
                                    StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 2, 1>(),
                                    EOpSign,
@@ -6726,7 +6755,7 @@
 constexpr const TFunction sign_20D(BuiltInId::sign_Int3,
                                    BuiltInName::sign,
                                    std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                   BuiltInParameters::p20D20D20F,
+                                   BuiltInParameters::p20D00D00D,
                                    1,
                                    StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 3, 1>(),
                                    EOpSign,
@@ -6734,7 +6763,7 @@
 constexpr const TFunction sign_30D(BuiltInId::sign_Int4,
                                    BuiltInName::sign,
                                    std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                   BuiltInParameters::p30D30D30F,
+                                   BuiltInParameters::p30D00D00D,
                                    1,
                                    StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 4, 1>(),
                                    EOpSign,
@@ -6750,7 +6779,7 @@
 constexpr const TFunction sign_10C(BuiltInId::sign_Double2,
                                    BuiltInName::sign,
                                    std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                   BuiltInParameters::p10C10C00C,
+                                   BuiltInParameters::p10C00C00C,
                                    1,
                                    StaticType::Get<EbtDouble, EbpUndefined, EvqGlobal, 2, 1>(),
                                    EOpSign,
@@ -6758,7 +6787,7 @@
 constexpr const TFunction sign_20C(BuiltInId::sign_Double3,
                                    BuiltInName::sign,
                                    std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                   BuiltInParameters::p20C_o_20D,
+                                   BuiltInParameters::p20C00C00C,
                                    1,
                                    StaticType::Get<EbtDouble, EbpUndefined, EvqGlobal, 3, 1>(),
                                    EOpSign,
@@ -6774,7 +6803,7 @@
 constexpr const TFunction floor_00B(BuiltInId::floor_Float1,
                                     BuiltInName::floor,
                                     std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                    BuiltInParameters::p00B30B,
+                                    BuiltInParameters::p00B00B00B,
                                     1,
                                     StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 1, 1>(),
                                     EOpFloor,
@@ -6782,7 +6811,7 @@
 constexpr const TFunction floor_10B(BuiltInId::floor_Float2,
                                     BuiltInName::floor,
                                     std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                    BuiltInParameters::p10B00D,
+                                    BuiltInParameters::p10B00B00B,
                                     1,
                                     StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 2, 1>(),
                                     EOpFloor,
@@ -6790,7 +6819,7 @@
 constexpr const TFunction floor_20B(BuiltInId::floor_Float3,
                                     BuiltInName::floor,
                                     std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                    BuiltInParameters::p20B20B00B,
+                                    BuiltInParameters::p20B00B00B,
                                     1,
                                     StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 3, 1>(),
                                     EOpFloor,
@@ -6798,7 +6827,7 @@
 constexpr const TFunction floor_30B(BuiltInId::floor_Float4,
                                     BuiltInName::floor,
                                     std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                    BuiltInParameters::p30B10B,
+                                    BuiltInParameters::p30B00B00B,
                                     1,
                                     StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 4, 1>(),
                                     EOpFloor,
@@ -6814,7 +6843,7 @@
 constexpr const TFunction floor_10C(BuiltInId::floor_Double2,
                                     BuiltInName::floor,
                                     std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                    BuiltInParameters::p10C10C00C,
+                                    BuiltInParameters::p10C00C00C,
                                     1,
                                     StaticType::Get<EbtDouble, EbpUndefined, EvqGlobal, 2, 1>(),
                                     EOpFloor,
@@ -6822,7 +6851,7 @@
 constexpr const TFunction floor_20C(BuiltInId::floor_Double3,
                                     BuiltInName::floor,
                                     std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                    BuiltInParameters::p20C_o_20D,
+                                    BuiltInParameters::p20C00C00C,
                                     1,
                                     StaticType::Get<EbtDouble, EbpUndefined, EvqGlobal, 3, 1>(),
                                     EOpFloor,
@@ -6838,7 +6867,7 @@
 constexpr const TFunction trunc_00B(BuiltInId::trunc_Float1,
                                     BuiltInName::trunc,
                                     std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                    BuiltInParameters::p00B30B,
+                                    BuiltInParameters::p00B00B00B,
                                     1,
                                     StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 1, 1>(),
                                     EOpTrunc,
@@ -6846,7 +6875,7 @@
 constexpr const TFunction trunc_10B(BuiltInId::trunc_Float2,
                                     BuiltInName::trunc,
                                     std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                    BuiltInParameters::p10B00D,
+                                    BuiltInParameters::p10B00B00B,
                                     1,
                                     StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 2, 1>(),
                                     EOpTrunc,
@@ -6854,7 +6883,7 @@
 constexpr const TFunction trunc_20B(BuiltInId::trunc_Float3,
                                     BuiltInName::trunc,
                                     std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                    BuiltInParameters::p20B20B00B,
+                                    BuiltInParameters::p20B00B00B,
                                     1,
                                     StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 3, 1>(),
                                     EOpTrunc,
@@ -6862,7 +6891,7 @@
 constexpr const TFunction trunc_30B(BuiltInId::trunc_Float4,
                                     BuiltInName::trunc,
                                     std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                    BuiltInParameters::p30B10B,
+                                    BuiltInParameters::p30B00B00B,
                                     1,
                                     StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 4, 1>(),
                                     EOpTrunc,
@@ -6878,7 +6907,7 @@
 constexpr const TFunction trunc_10C(BuiltInId::trunc_Double2,
                                     BuiltInName::trunc,
                                     std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                    BuiltInParameters::p10C10C00C,
+                                    BuiltInParameters::p10C00C00C,
                                     1,
                                     StaticType::Get<EbtDouble, EbpUndefined, EvqGlobal, 2, 1>(),
                                     EOpTrunc,
@@ -6886,7 +6915,7 @@
 constexpr const TFunction trunc_20C(BuiltInId::trunc_Double3,
                                     BuiltInName::trunc,
                                     std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                    BuiltInParameters::p20C_o_20D,
+                                    BuiltInParameters::p20C00C00C,
                                     1,
                                     StaticType::Get<EbtDouble, EbpUndefined, EvqGlobal, 3, 1>(),
                                     EOpTrunc,
@@ -6902,7 +6931,7 @@
 constexpr const TFunction round_00B(BuiltInId::round_Float1,
                                     BuiltInName::round,
                                     std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                    BuiltInParameters::p00B30B,
+                                    BuiltInParameters::p00B00B00B,
                                     1,
                                     StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 1, 1>(),
                                     EOpRound,
@@ -6910,7 +6939,7 @@
 constexpr const TFunction round_10B(BuiltInId::round_Float2,
                                     BuiltInName::round,
                                     std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                    BuiltInParameters::p10B00D,
+                                    BuiltInParameters::p10B00B00B,
                                     1,
                                     StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 2, 1>(),
                                     EOpRound,
@@ -6918,7 +6947,7 @@
 constexpr const TFunction round_20B(BuiltInId::round_Float3,
                                     BuiltInName::round,
                                     std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                    BuiltInParameters::p20B20B00B,
+                                    BuiltInParameters::p20B00B00B,
                                     1,
                                     StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 3, 1>(),
                                     EOpRound,
@@ -6926,7 +6955,7 @@
 constexpr const TFunction round_30B(BuiltInId::round_Float4,
                                     BuiltInName::round,
                                     std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                    BuiltInParameters::p30B10B,
+                                    BuiltInParameters::p30B00B00B,
                                     1,
                                     StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 4, 1>(),
                                     EOpRound,
@@ -6942,7 +6971,7 @@
 constexpr const TFunction round_10C(BuiltInId::round_Double2,
                                     BuiltInName::round,
                                     std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                    BuiltInParameters::p10C10C00C,
+                                    BuiltInParameters::p10C00C00C,
                                     1,
                                     StaticType::Get<EbtDouble, EbpUndefined, EvqGlobal, 2, 1>(),
                                     EOpRound,
@@ -6950,7 +6979,7 @@
 constexpr const TFunction round_20C(BuiltInId::round_Double3,
                                     BuiltInName::round,
                                     std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                    BuiltInParameters::p20C_o_20D,
+                                    BuiltInParameters::p20C00C00C,
                                     1,
                                     StaticType::Get<EbtDouble, EbpUndefined, EvqGlobal, 3, 1>(),
                                     EOpRound,
@@ -6966,7 +6995,7 @@
 constexpr const TFunction roundEven_00B(BuiltInId::roundEven_Float1,
                                         BuiltInName::roundEven,
                                         std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                        BuiltInParameters::p00B30B,
+                                        BuiltInParameters::p00B00B00B,
                                         1,
                                         StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 1, 1>(),
                                         EOpRoundEven,
@@ -6974,7 +7003,7 @@
 constexpr const TFunction roundEven_10B(BuiltInId::roundEven_Float2,
                                         BuiltInName::roundEven,
                                         std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                        BuiltInParameters::p10B00D,
+                                        BuiltInParameters::p10B00B00B,
                                         1,
                                         StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 2, 1>(),
                                         EOpRoundEven,
@@ -6982,7 +7011,7 @@
 constexpr const TFunction roundEven_20B(BuiltInId::roundEven_Float3,
                                         BuiltInName::roundEven,
                                         std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                        BuiltInParameters::p20B20B00B,
+                                        BuiltInParameters::p20B00B00B,
                                         1,
                                         StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 3, 1>(),
                                         EOpRoundEven,
@@ -6990,7 +7019,7 @@
 constexpr const TFunction roundEven_30B(BuiltInId::roundEven_Float4,
                                         BuiltInName::roundEven,
                                         std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                        BuiltInParameters::p30B10B,
+                                        BuiltInParameters::p30B00B00B,
                                         1,
                                         StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 4, 1>(),
                                         EOpRoundEven,
@@ -7006,7 +7035,7 @@
 constexpr const TFunction roundEven_10C(BuiltInId::roundEven_Double2,
                                         BuiltInName::roundEven,
                                         std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                        BuiltInParameters::p10C10C00C,
+                                        BuiltInParameters::p10C00C00C,
                                         1,
                                         StaticType::Get<EbtDouble, EbpUndefined, EvqGlobal, 2, 1>(),
                                         EOpRoundEven,
@@ -7014,7 +7043,7 @@
 constexpr const TFunction roundEven_20C(BuiltInId::roundEven_Double3,
                                         BuiltInName::roundEven,
                                         std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                        BuiltInParameters::p20C_o_20D,
+                                        BuiltInParameters::p20C00C00C,
                                         1,
                                         StaticType::Get<EbtDouble, EbpUndefined, EvqGlobal, 3, 1>(),
                                         EOpRoundEven,
@@ -7030,7 +7059,7 @@
 constexpr const TFunction ceil_00B(BuiltInId::ceil_Float1,
                                    BuiltInName::ceil,
                                    std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                   BuiltInParameters::p00B30B,
+                                   BuiltInParameters::p00B00B00B,
                                    1,
                                    StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 1, 1>(),
                                    EOpCeil,
@@ -7038,7 +7067,7 @@
 constexpr const TFunction ceil_10B(BuiltInId::ceil_Float2,
                                    BuiltInName::ceil,
                                    std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                   BuiltInParameters::p10B00D,
+                                   BuiltInParameters::p10B00B00B,
                                    1,
                                    StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 2, 1>(),
                                    EOpCeil,
@@ -7046,7 +7075,7 @@
 constexpr const TFunction ceil_20B(BuiltInId::ceil_Float3,
                                    BuiltInName::ceil,
                                    std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                   BuiltInParameters::p20B20B00B,
+                                   BuiltInParameters::p20B00B00B,
                                    1,
                                    StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 3, 1>(),
                                    EOpCeil,
@@ -7054,7 +7083,7 @@
 constexpr const TFunction ceil_30B(BuiltInId::ceil_Float4,
                                    BuiltInName::ceil,
                                    std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                   BuiltInParameters::p30B10B,
+                                   BuiltInParameters::p30B00B00B,
                                    1,
                                    StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 4, 1>(),
                                    EOpCeil,
@@ -7070,7 +7099,7 @@
 constexpr const TFunction ceil_10C(BuiltInId::ceil_Double2,
                                    BuiltInName::ceil,
                                    std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                   BuiltInParameters::p10C10C00C,
+                                   BuiltInParameters::p10C00C00C,
                                    1,
                                    StaticType::Get<EbtDouble, EbpUndefined, EvqGlobal, 2, 1>(),
                                    EOpCeil,
@@ -7078,7 +7107,7 @@
 constexpr const TFunction ceil_20C(BuiltInId::ceil_Double3,
                                    BuiltInName::ceil,
                                    std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                   BuiltInParameters::p20C_o_20D,
+                                   BuiltInParameters::p20C00C00C,
                                    1,
                                    StaticType::Get<EbtDouble, EbpUndefined, EvqGlobal, 3, 1>(),
                                    EOpCeil,
@@ -7094,7 +7123,7 @@
 constexpr const TFunction fract_00B(BuiltInId::fract_Float1,
                                     BuiltInName::fract,
                                     std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                    BuiltInParameters::p00B30B,
+                                    BuiltInParameters::p00B00B00B,
                                     1,
                                     StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 1, 1>(),
                                     EOpFract,
@@ -7102,7 +7131,7 @@
 constexpr const TFunction fract_10B(BuiltInId::fract_Float2,
                                     BuiltInName::fract,
                                     std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                    BuiltInParameters::p10B00D,
+                                    BuiltInParameters::p10B00B00B,
                                     1,
                                     StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 2, 1>(),
                                     EOpFract,
@@ -7110,7 +7139,7 @@
 constexpr const TFunction fract_20B(BuiltInId::fract_Float3,
                                     BuiltInName::fract,
                                     std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                    BuiltInParameters::p20B20B00B,
+                                    BuiltInParameters::p20B00B00B,
                                     1,
                                     StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 3, 1>(),
                                     EOpFract,
@@ -7118,7 +7147,7 @@
 constexpr const TFunction fract_30B(BuiltInId::fract_Float4,
                                     BuiltInName::fract,
                                     std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                    BuiltInParameters::p30B10B,
+                                    BuiltInParameters::p30B00B00B,
                                     1,
                                     StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 4, 1>(),
                                     EOpFract,
@@ -7134,7 +7163,7 @@
 constexpr const TFunction fract_10C(BuiltInId::fract_Double2,
                                     BuiltInName::fract,
                                     std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                    BuiltInParameters::p10C10C00C,
+                                    BuiltInParameters::p10C00C00C,
                                     1,
                                     StaticType::Get<EbtDouble, EbpUndefined, EvqGlobal, 2, 1>(),
                                     EOpFract,
@@ -7142,7 +7171,7 @@
 constexpr const TFunction fract_20C(BuiltInId::fract_Double3,
                                     BuiltInName::fract,
                                     std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                    BuiltInParameters::p20C_o_20D,
+                                    BuiltInParameters::p20C00C00C,
                                     1,
                                     StaticType::Get<EbtDouble, EbpUndefined, EvqGlobal, 3, 1>(),
                                     EOpFract,
@@ -7158,7 +7187,7 @@
 constexpr const TFunction mod_00B00B(BuiltInId::mod_Float1_Float1,
                                      BuiltInName::mod,
                                      std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                     BuiltInParameters::p00B00B20B,
+                                     BuiltInParameters::p00B00B00B,
                                      2,
                                      StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 1, 1>(),
                                      EOpMod,
@@ -7246,7 +7275,7 @@
 constexpr const TFunction mod_10C10C(BuiltInId::mod_Double2_Double2,
                                      BuiltInName::mod,
                                      std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                     BuiltInParameters::p10C10C00C,
+                                     BuiltInParameters::p10C10C00B,
                                      2,
                                      StaticType::Get<EbtDouble, EbpUndefined, EvqGlobal, 2, 1>(),
                                      EOpMod,
@@ -7254,7 +7283,7 @@
 constexpr const TFunction mod_20C20C(BuiltInId::mod_Double3_Double3,
                                      BuiltInName::mod,
                                      std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                     BuiltInParameters::p20C20C20C,
+                                     BuiltInParameters::p20C20C00B,
                                      2,
                                      StaticType::Get<EbtDouble, EbpUndefined, EvqGlobal, 3, 1>(),
                                      EOpMod,
@@ -7270,7 +7299,7 @@
 constexpr const TFunction min_00B00B(BuiltInId::min_Float1_Float1,
                                      BuiltInName::min,
                                      std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                     BuiltInParameters::p00B00B20B,
+                                     BuiltInParameters::p00B00B00B,
                                      2,
                                      StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 1, 1>(),
                                      EOpMin,
@@ -7334,7 +7363,7 @@
 constexpr const TFunction min_10C10C(BuiltInId::min_Double2_Double2,
                                      BuiltInName::min,
                                      std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                     BuiltInParameters::p10C10C00C,
+                                     BuiltInParameters::p10C10C00B,
                                      2,
                                      StaticType::Get<EbtDouble, EbpUndefined, EvqGlobal, 2, 1>(),
                                      EOpMin,
@@ -7342,7 +7371,7 @@
 constexpr const TFunction min_20C20C(BuiltInId::min_Double3_Double3,
                                      BuiltInName::min,
                                      std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                     BuiltInParameters::p20C20C20C,
+                                     BuiltInParameters::p20C20C00B,
                                      2,
                                      StaticType::Get<EbtDouble, EbpUndefined, EvqGlobal, 3, 1>(),
                                      EOpMin,
@@ -7382,7 +7411,7 @@
 constexpr const TFunction min_00D00D(BuiltInId::min_Int1_Int1,
                                      BuiltInName::min,
                                      std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                     BuiltInParameters::p00D00D00F,
+                                     BuiltInParameters::p00D00D00D00D,
                                      2,
                                      StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 1, 1>(),
                                      EOpMin,
@@ -7398,7 +7427,7 @@
 constexpr const TFunction min_20D20D(BuiltInId::min_Int3_Int3,
                                      BuiltInName::min,
                                      std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                     BuiltInParameters::p20D20D20F,
+                                     BuiltInParameters::p20D20D00D00D,
                                      2,
                                      StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 3, 1>(),
                                      EOpMin,
@@ -7406,7 +7435,7 @@
 constexpr const TFunction min_30D30D(BuiltInId::min_Int4_Int4,
                                      BuiltInName::min,
                                      std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                     BuiltInParameters::p30D30D30F,
+                                     BuiltInParameters::p30D30D00D00D,
                                      2,
                                      StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 4, 1>(),
                                      EOpMin,
@@ -7446,7 +7475,7 @@
 constexpr const TFunction min_10E10E(BuiltInId::min_UInt2_UInt2,
                                      BuiltInName::min,
                                      std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                     BuiltInParameters::p10E10E_o_10E_o_10E,
+                                     BuiltInParameters::p10E10E00D00D,
                                      2,
                                      StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 2, 1>(),
                                      EOpMin,
@@ -7454,7 +7483,7 @@
 constexpr const TFunction min_20E20E(BuiltInId::min_UInt3_UInt3,
                                      BuiltInName::min,
                                      std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                     BuiltInParameters::p20E20E20E,
+                                     BuiltInParameters::p20E20E00D00D,
                                      2,
                                      StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 3, 1>(),
                                      EOpMin,
@@ -7462,7 +7491,7 @@
 constexpr const TFunction min_30E30E(BuiltInId::min_UInt4_UInt4,
                                      BuiltInName::min,
                                      std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                     BuiltInParameters::p30E30E_o_30E_o_30E,
+                                     BuiltInParameters::p30E30E00D00D,
                                      2,
                                      StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 4, 1>(),
                                      EOpMin,
@@ -7494,7 +7523,7 @@
 constexpr const TFunction max_00B00B(BuiltInId::max_Float1_Float1,
                                      BuiltInName::max,
                                      std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                     BuiltInParameters::p00B00B20B,
+                                     BuiltInParameters::p00B00B00B,
                                      2,
                                      StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 1, 1>(),
                                      EOpMax,
@@ -7558,7 +7587,7 @@
 constexpr const TFunction max_10C10C(BuiltInId::max_Double2_Double2,
                                      BuiltInName::max,
                                      std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                     BuiltInParameters::p10C10C00C,
+                                     BuiltInParameters::p10C10C00B,
                                      2,
                                      StaticType::Get<EbtDouble, EbpUndefined, EvqGlobal, 2, 1>(),
                                      EOpMax,
@@ -7566,7 +7595,7 @@
 constexpr const TFunction max_20C20C(BuiltInId::max_Double3_Double3,
                                      BuiltInName::max,
                                      std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                     BuiltInParameters::p20C20C20C,
+                                     BuiltInParameters::p20C20C00B,
                                      2,
                                      StaticType::Get<EbtDouble, EbpUndefined, EvqGlobal, 3, 1>(),
                                      EOpMax,
@@ -7606,7 +7635,7 @@
 constexpr const TFunction max_00D00D(BuiltInId::max_Int1_Int1,
                                      BuiltInName::max,
                                      std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                     BuiltInParameters::p00D00D00F,
+                                     BuiltInParameters::p00D00D00D00D,
                                      2,
                                      StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 1, 1>(),
                                      EOpMax,
@@ -7622,7 +7651,7 @@
 constexpr const TFunction max_20D20D(BuiltInId::max_Int3_Int3,
                                      BuiltInName::max,
                                      std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                     BuiltInParameters::p20D20D20F,
+                                     BuiltInParameters::p20D20D00D00D,
                                      2,
                                      StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 3, 1>(),
                                      EOpMax,
@@ -7630,7 +7659,7 @@
 constexpr const TFunction max_30D30D(BuiltInId::max_Int4_Int4,
                                      BuiltInName::max,
                                      std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                     BuiltInParameters::p30D30D30F,
+                                     BuiltInParameters::p30D30D00D00D,
                                      2,
                                      StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 4, 1>(),
                                      EOpMax,
@@ -7670,7 +7699,7 @@
 constexpr const TFunction max_10E10E(BuiltInId::max_UInt2_UInt2,
                                      BuiltInName::max,
                                      std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                     BuiltInParameters::p10E10E_o_10E_o_10E,
+                                     BuiltInParameters::p10E10E00D00D,
                                      2,
                                      StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 2, 1>(),
                                      EOpMax,
@@ -7678,7 +7707,7 @@
 constexpr const TFunction max_20E20E(BuiltInId::max_UInt3_UInt3,
                                      BuiltInName::max,
                                      std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                     BuiltInParameters::p20E20E20E,
+                                     BuiltInParameters::p20E20E00D00D,
                                      2,
                                      StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 3, 1>(),
                                      EOpMax,
@@ -7686,7 +7715,7 @@
 constexpr const TFunction max_30E30E(BuiltInId::max_UInt4_UInt4,
                                      BuiltInName::max,
                                      std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                     BuiltInParameters::p30E30E_o_30E_o_30E,
+                                     BuiltInParameters::p30E30E00D00D,
                                      2,
                                      StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 4, 1>(),
                                      EOpMax,
@@ -8228,7 +8257,7 @@
 constexpr const TFunction step_00B00B(BuiltInId::step_Float1_Float1,
                                       BuiltInName::step,
                                       std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                      BuiltInParameters::p00B00B20B,
+                                      BuiltInParameters::p00B00B00B,
                                       2,
                                       StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 1, 1>(),
                                       EOpStep,
@@ -8292,7 +8321,7 @@
 constexpr const TFunction step_10C10C(BuiltInId::step_Double2_Double2,
                                       BuiltInName::step,
                                       std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                      BuiltInParameters::p10C10C00C,
+                                      BuiltInParameters::p10C10C00B,
                                       2,
                                       StaticType::Get<EbtDouble, EbpUndefined, EvqGlobal, 2, 1>(),
                                       EOpStep,
@@ -8300,7 +8329,7 @@
 constexpr const TFunction step_20C20C(BuiltInId::step_Double3_Double3,
                                       BuiltInName::step,
                                       std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                      BuiltInParameters::p20C20C20C,
+                                      BuiltInParameters::p20C20C00B,
                                       2,
                                       StaticType::Get<EbtDouble, EbpUndefined, EvqGlobal, 3, 1>(),
                                       EOpStep,
@@ -8530,7 +8559,7 @@
 constexpr const TFunction isnan_00B(BuiltInId::isnan_Float1,
                                     BuiltInName::isnan,
                                     std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                    BuiltInParameters::p00B30B,
+                                    BuiltInParameters::p00B00B00B,
                                     1,
                                     StaticType::Get<EbtBool, EbpUndefined, EvqGlobal, 1, 1>(),
                                     EOpIsnan,
@@ -8538,7 +8567,7 @@
 constexpr const TFunction isnan_10B(BuiltInId::isnan_Float2,
                                     BuiltInName::isnan,
                                     std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                    BuiltInParameters::p10B00D,
+                                    BuiltInParameters::p10B00B00B,
                                     1,
                                     StaticType::Get<EbtBool, EbpUndefined, EvqGlobal, 2, 1>(),
                                     EOpIsnan,
@@ -8546,7 +8575,7 @@
 constexpr const TFunction isnan_20B(BuiltInId::isnan_Float3,
                                     BuiltInName::isnan,
                                     std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                    BuiltInParameters::p20B20B00B,
+                                    BuiltInParameters::p20B00B00B,
                                     1,
                                     StaticType::Get<EbtBool, EbpUndefined, EvqGlobal, 3, 1>(),
                                     EOpIsnan,
@@ -8554,7 +8583,7 @@
 constexpr const TFunction isnan_30B(BuiltInId::isnan_Float4,
                                     BuiltInName::isnan,
                                     std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                    BuiltInParameters::p30B10B,
+                                    BuiltInParameters::p30B00B00B,
                                     1,
                                     StaticType::Get<EbtBool, EbpUndefined, EvqGlobal, 4, 1>(),
                                     EOpIsnan,
@@ -8570,7 +8599,7 @@
 constexpr const TFunction isnan_10C(BuiltInId::isnan_Double2,
                                     BuiltInName::isnan,
                                     std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                    BuiltInParameters::p10C10C00C,
+                                    BuiltInParameters::p10C00C00C,
                                     1,
                                     StaticType::Get<EbtBool, EbpUndefined, EvqGlobal, 2, 1>(),
                                     EOpIsnan,
@@ -8578,7 +8607,7 @@
 constexpr const TFunction isnan_20C(BuiltInId::isnan_Double3,
                                     BuiltInName::isnan,
                                     std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                    BuiltInParameters::p20C_o_20D,
+                                    BuiltInParameters::p20C00C00C,
                                     1,
                                     StaticType::Get<EbtBool, EbpUndefined, EvqGlobal, 3, 1>(),
                                     EOpIsnan,
@@ -8594,7 +8623,7 @@
 constexpr const TFunction isinf_00B(BuiltInId::isinf_Float1,
                                     BuiltInName::isinf,
                                     std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                    BuiltInParameters::p00B30B,
+                                    BuiltInParameters::p00B00B00B,
                                     1,
                                     StaticType::Get<EbtBool, EbpUndefined, EvqGlobal, 1, 1>(),
                                     EOpIsinf,
@@ -8602,7 +8631,7 @@
 constexpr const TFunction isinf_10B(BuiltInId::isinf_Float2,
                                     BuiltInName::isinf,
                                     std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                    BuiltInParameters::p10B00D,
+                                    BuiltInParameters::p10B00B00B,
                                     1,
                                     StaticType::Get<EbtBool, EbpUndefined, EvqGlobal, 2, 1>(),
                                     EOpIsinf,
@@ -8610,7 +8639,7 @@
 constexpr const TFunction isinf_20B(BuiltInId::isinf_Float3,
                                     BuiltInName::isinf,
                                     std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                    BuiltInParameters::p20B20B00B,
+                                    BuiltInParameters::p20B00B00B,
                                     1,
                                     StaticType::Get<EbtBool, EbpUndefined, EvqGlobal, 3, 1>(),
                                     EOpIsinf,
@@ -8618,7 +8647,7 @@
 constexpr const TFunction isinf_30B(BuiltInId::isinf_Float4,
                                     BuiltInName::isinf,
                                     std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                    BuiltInParameters::p30B10B,
+                                    BuiltInParameters::p30B00B00B,
                                     1,
                                     StaticType::Get<EbtBool, EbpUndefined, EvqGlobal, 4, 1>(),
                                     EOpIsinf,
@@ -8634,7 +8663,7 @@
 constexpr const TFunction isinf_10C(BuiltInId::isinf_Double2,
                                     BuiltInName::isinf,
                                     std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                    BuiltInParameters::p10C10C00C,
+                                    BuiltInParameters::p10C00C00C,
                                     1,
                                     StaticType::Get<EbtBool, EbpUndefined, EvqGlobal, 2, 1>(),
                                     EOpIsinf,
@@ -8642,7 +8671,7 @@
 constexpr const TFunction isinf_20C(BuiltInId::isinf_Double3,
                                     BuiltInName::isinf,
                                     std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                    BuiltInParameters::p20C_o_20D,
+                                    BuiltInParameters::p20C00C00C,
                                     1,
                                     StaticType::Get<EbtBool, EbpUndefined, EvqGlobal, 3, 1>(),
                                     EOpIsinf,
@@ -8659,7 +8688,7 @@
     BuiltInId::floatBitsToInt_Float1,
     BuiltInName::floatBitsToInt,
     std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-    BuiltInParameters::p00B30B,
+    BuiltInParameters::p00B00B00B,
     1,
     StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 1, 1>(),
     EOpFloatBitsToInt,
@@ -8668,7 +8697,7 @@
     BuiltInId::floatBitsToInt_Float2,
     BuiltInName::floatBitsToInt,
     std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-    BuiltInParameters::p10B00D,
+    BuiltInParameters::p10B00B00B,
     1,
     StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 2, 1>(),
     EOpFloatBitsToInt,
@@ -8677,7 +8706,7 @@
     BuiltInId::floatBitsToInt_Float3,
     BuiltInName::floatBitsToInt,
     std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-    BuiltInParameters::p20B20B00B,
+    BuiltInParameters::p20B00B00B,
     1,
     StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 3, 1>(),
     EOpFloatBitsToInt,
@@ -8686,7 +8715,7 @@
     BuiltInId::floatBitsToInt_Float4,
     BuiltInName::floatBitsToInt,
     std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-    BuiltInParameters::p30B10B,
+    BuiltInParameters::p30B00B00B,
     1,
     StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 4, 1>(),
     EOpFloatBitsToInt,
@@ -8695,7 +8724,7 @@
     BuiltInId::floatBitsToUint_Float1,
     BuiltInName::floatBitsToUint,
     std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-    BuiltInParameters::p00B30B,
+    BuiltInParameters::p00B00B00B,
     1,
     StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 1, 1>(),
     EOpFloatBitsToUint,
@@ -8704,7 +8733,7 @@
     BuiltInId::floatBitsToUint_Float2,
     BuiltInName::floatBitsToUint,
     std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-    BuiltInParameters::p10B00D,
+    BuiltInParameters::p10B00B00B,
     1,
     StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 2, 1>(),
     EOpFloatBitsToUint,
@@ -8713,7 +8742,7 @@
     BuiltInId::floatBitsToUint_Float3,
     BuiltInName::floatBitsToUint,
     std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-    BuiltInParameters::p20B20B00B,
+    BuiltInParameters::p20B00B00B,
     1,
     StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 3, 1>(),
     EOpFloatBitsToUint,
@@ -8722,7 +8751,7 @@
     BuiltInId::floatBitsToUint_Float4,
     BuiltInName::floatBitsToUint,
     std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-    BuiltInParameters::p30B10B,
+    BuiltInParameters::p30B00B00B,
     1,
     StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 4, 1>(),
     EOpFloatBitsToUint,
@@ -8731,7 +8760,7 @@
     BuiltInId::intBitsToFloat_Int1,
     BuiltInName::intBitsToFloat,
     std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-    BuiltInParameters::p00D00D00F,
+    BuiltInParameters::p00D00D00D00D,
     1,
     StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 1, 1>(),
     EOpIntBitsToFloat,
@@ -8740,7 +8769,7 @@
     BuiltInId::intBitsToFloat_Int2,
     BuiltInName::intBitsToFloat,
     std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-    BuiltInParameters::p10D10D00D00D,
+    BuiltInParameters::p10D00D00D,
     1,
     StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 2, 1>(),
     EOpIntBitsToFloat,
@@ -8749,7 +8778,7 @@
     BuiltInId::intBitsToFloat_Int3,
     BuiltInName::intBitsToFloat,
     std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-    BuiltInParameters::p20D20D20F,
+    BuiltInParameters::p20D00D00D,
     1,
     StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 3, 1>(),
     EOpIntBitsToFloat,
@@ -8758,7 +8787,7 @@
     BuiltInId::intBitsToFloat_Int4,
     BuiltInName::intBitsToFloat,
     std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-    BuiltInParameters::p30D30D30F,
+    BuiltInParameters::p30D00D00D,
     1,
     StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 4, 1>(),
     EOpIntBitsToFloat,
@@ -8767,7 +8796,7 @@
     BuiltInId::uintBitsToFloat_UInt1,
     BuiltInName::uintBitsToFloat,
     std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-    BuiltInParameters::p00E00E00D00D,
+    BuiltInParameters::p00E00D00D,
     1,
     StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 1, 1>(),
     EOpUintBitsToFloat,
@@ -8776,7 +8805,7 @@
     BuiltInId::uintBitsToFloat_UInt2,
     BuiltInName::uintBitsToFloat,
     std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-    BuiltInParameters::p10E00E00E,
+    BuiltInParameters::p10E00D00D,
     1,
     StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 2, 1>(),
     EOpUintBitsToFloat,
@@ -8785,7 +8814,7 @@
     BuiltInId::uintBitsToFloat_UInt3,
     BuiltInName::uintBitsToFloat,
     std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-    BuiltInParameters::p20E20E20E,
+    BuiltInParameters::p20E00D00D,
     1,
     StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 3, 1>(),
     EOpUintBitsToFloat,
@@ -8794,7 +8823,7 @@
     BuiltInId::uintBitsToFloat_UInt4,
     BuiltInName::uintBitsToFloat,
     std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-    BuiltInParameters::p30E30E_o_30E_o_30E,
+    BuiltInParameters::p30E00D00D,
     1,
     StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 4, 1>(),
     EOpUintBitsToFloat,
@@ -9031,7 +9060,7 @@
     BuiltInId::packSnorm2x16_Float2,
     BuiltInName::packSnorm2x16,
     std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-    BuiltInParameters::p10B00D,
+    BuiltInParameters::p10B00B00B,
     1,
     StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 1, 1>(),
     EOpPackSnorm2x16,
@@ -9040,7 +9069,7 @@
     BuiltInId::packHalf2x16_Float2,
     BuiltInName::packHalf2x16,
     std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-    BuiltInParameters::p10B00D,
+    BuiltInParameters::p10B00B00B,
     1,
     StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 1, 1>(),
     EOpPackHalf2x16,
@@ -9049,7 +9078,7 @@
     BuiltInId::unpackSnorm2x16_UInt1,
     BuiltInName::unpackSnorm2x16,
     std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-    BuiltInParameters::p00E00E00D00D,
+    BuiltInParameters::p00E00D00D,
     1,
     StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 2, 1>(),
     EOpUnpackSnorm2x16,
@@ -9058,7 +9087,7 @@
     BuiltInId::unpackHalf2x16_UInt1,
     BuiltInName::unpackHalf2x16,
     std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-    BuiltInParameters::p00E00E00D00D,
+    BuiltInParameters::p00E00D00D,
     1,
     StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 2, 1>(),
     EOpUnpackHalf2x16,
@@ -9067,7 +9096,7 @@
     BuiltInId::packUnorm2x16_Float2,
     BuiltInName::packUnorm2x16,
     std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-    BuiltInParameters::p10B00D,
+    BuiltInParameters::p10B00B00B,
     1,
     StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 1, 1>(),
     EOpPackUnorm2x16,
@@ -9076,7 +9105,7 @@
     BuiltInId::unpackUnorm2x16_UInt1,
     BuiltInName::unpackUnorm2x16,
     std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-    BuiltInParameters::p00E00E00D00D,
+    BuiltInParameters::p00E00D00D,
     1,
     StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 2, 1>(),
     EOpUnpackUnorm2x16,
@@ -9085,7 +9114,7 @@
     BuiltInId::packUnorm4x8_Float4,
     BuiltInName::packUnorm4x8,
     std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-    BuiltInParameters::p30B10B,
+    BuiltInParameters::p30B00B00B,
     1,
     StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 1, 1>(),
     EOpPackUnorm4x8,
@@ -9094,7 +9123,7 @@
     BuiltInId::packSnorm4x8_Float4,
     BuiltInName::packSnorm4x8,
     std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-    BuiltInParameters::p30B10B,
+    BuiltInParameters::p30B00B00B,
     1,
     StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 1, 1>(),
     EOpPackSnorm4x8,
@@ -9103,7 +9132,7 @@
     BuiltInId::unpackUnorm4x8_UInt1,
     BuiltInName::unpackUnorm4x8,
     std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-    BuiltInParameters::p00E00E00D00D,
+    BuiltInParameters::p00E00D00D,
     1,
     StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 4, 1>(),
     EOpUnpackUnorm4x8,
@@ -9112,7 +9141,7 @@
     BuiltInId::unpackSnorm4x8_UInt1,
     BuiltInName::unpackSnorm4x8,
     std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-    BuiltInParameters::p00E00E00D00D,
+    BuiltInParameters::p00E00D00D,
     1,
     StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 4, 1>(),
     EOpUnpackSnorm4x8,
@@ -9121,7 +9150,7 @@
     BuiltInId::packDouble2x32_UInt2,
     BuiltInName::packDouble2x32,
     std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-    BuiltInParameters::p10E00E00E,
+    BuiltInParameters::p10E00D00D,
     1,
     StaticType::Get<EbtDouble, EbpUndefined, EvqGlobal, 1, 1>(),
     EOpPackDouble2x32,
@@ -9138,7 +9167,7 @@
 constexpr const TFunction length_00B(BuiltInId::length_Float1,
                                      BuiltInName::length,
                                      std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                     BuiltInParameters::p00B30B,
+                                     BuiltInParameters::p00B00B00B,
                                      1,
                                      StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 1, 1>(),
                                      EOpLength,
@@ -9146,7 +9175,7 @@
 constexpr const TFunction length_10B(BuiltInId::length_Float2,
                                      BuiltInName::length,
                                      std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                     BuiltInParameters::p10B00D,
+                                     BuiltInParameters::p10B00B00B,
                                      1,
                                      StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 1, 1>(),
                                      EOpLength,
@@ -9154,7 +9183,7 @@
 constexpr const TFunction length_20B(BuiltInId::length_Float3,
                                      BuiltInName::length,
                                      std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                     BuiltInParameters::p20B20B00B,
+                                     BuiltInParameters::p20B00B00B,
                                      1,
                                      StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 1, 1>(),
                                      EOpLength,
@@ -9162,7 +9191,7 @@
 constexpr const TFunction length_30B(BuiltInId::length_Float4,
                                      BuiltInName::length,
                                      std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                     BuiltInParameters::p30B10B,
+                                     BuiltInParameters::p30B00B00B,
                                      1,
                                      StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 1, 1>(),
                                      EOpLength,
@@ -9178,7 +9207,7 @@
 constexpr const TFunction length_10C(BuiltInId::length_Double2,
                                      BuiltInName::length,
                                      std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                     BuiltInParameters::p10C10C00C,
+                                     BuiltInParameters::p10C00C00C,
                                      1,
                                      StaticType::Get<EbtDouble, EbpUndefined, EvqGlobal, 1, 1>(),
                                      EOpLength,
@@ -9186,7 +9215,7 @@
 constexpr const TFunction length_20C(BuiltInId::length_Double3,
                                      BuiltInName::length,
                                      std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                     BuiltInParameters::p20C_o_20D,
+                                     BuiltInParameters::p20C00C00C,
                                      1,
                                      StaticType::Get<EbtDouble, EbpUndefined, EvqGlobal, 1, 1>(),
                                      EOpLength,
@@ -9203,7 +9232,7 @@
     BuiltInId::distance_Float1_Float1,
     BuiltInName::distance,
     std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-    BuiltInParameters::p00B00B20B,
+    BuiltInParameters::p00B00B00B,
     2,
     StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 1, 1>(),
     EOpDistance,
@@ -9248,7 +9277,7 @@
     BuiltInId::distance_Double2_Double2,
     BuiltInName::distance,
     std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-    BuiltInParameters::p10C10C00C,
+    BuiltInParameters::p10C10C00B,
     2,
     StaticType::Get<EbtDouble, EbpUndefined, EvqGlobal, 1, 1>(),
     EOpDistance,
@@ -9257,7 +9286,7 @@
     BuiltInId::distance_Double3_Double3,
     BuiltInName::distance,
     std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-    BuiltInParameters::p20C20C20C,
+    BuiltInParameters::p20C20C00B,
     2,
     StaticType::Get<EbtDouble, EbpUndefined, EvqGlobal, 1, 1>(),
     EOpDistance,
@@ -9274,7 +9303,7 @@
 constexpr const TFunction dot_00B00B(BuiltInId::dot_Float1_Float1,
                                      BuiltInName::dot,
                                      std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                     BuiltInParameters::p00B00B20B,
+                                     BuiltInParameters::p00B00B00B,
                                      2,
                                      StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 1, 1>(),
                                      EOpDot,
@@ -9314,7 +9343,7 @@
 constexpr const TFunction dot_10C10C(BuiltInId::dot_Double2_Double2,
                                      BuiltInName::dot,
                                      std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                     BuiltInParameters::p10C10C00C,
+                                     BuiltInParameters::p10C10C00B,
                                      2,
                                      StaticType::Get<EbtDouble, EbpUndefined, EvqGlobal, 1, 1>(),
                                      EOpDot,
@@ -9322,7 +9351,7 @@
 constexpr const TFunction dot_20C20C(BuiltInId::dot_Double3_Double3,
                                      BuiltInName::dot,
                                      std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                     BuiltInParameters::p20C20C20C,
+                                     BuiltInParameters::p20C20C00B,
                                      2,
                                      StaticType::Get<EbtDouble, EbpUndefined, EvqGlobal, 1, 1>(),
                                      EOpDot,
@@ -9346,7 +9375,7 @@
 constexpr const TFunction cross_20C20C(BuiltInId::cross_Double3_Double3,
                                        BuiltInName::cross,
                                        std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                       BuiltInParameters::p20C20C20C,
+                                       BuiltInParameters::p20C20C00B,
                                        2,
                                        StaticType::Get<EbtDouble, EbpUndefined, EvqGlobal, 3, 1>(),
                                        EOpCross,
@@ -9354,7 +9383,7 @@
 constexpr const TFunction normalize_00B(BuiltInId::normalize_Float1,
                                         BuiltInName::normalize,
                                         std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                        BuiltInParameters::p00B30B,
+                                        BuiltInParameters::p00B00B00B,
                                         1,
                                         StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 1, 1>(),
                                         EOpNormalize,
@@ -9362,7 +9391,7 @@
 constexpr const TFunction normalize_10B(BuiltInId::normalize_Float2,
                                         BuiltInName::normalize,
                                         std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                        BuiltInParameters::p10B00D,
+                                        BuiltInParameters::p10B00B00B,
                                         1,
                                         StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 2, 1>(),
                                         EOpNormalize,
@@ -9370,7 +9399,7 @@
 constexpr const TFunction normalize_20B(BuiltInId::normalize_Float3,
                                         BuiltInName::normalize,
                                         std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                        BuiltInParameters::p20B20B00B,
+                                        BuiltInParameters::p20B00B00B,
                                         1,
                                         StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 3, 1>(),
                                         EOpNormalize,
@@ -9378,7 +9407,7 @@
 constexpr const TFunction normalize_30B(BuiltInId::normalize_Float4,
                                         BuiltInName::normalize,
                                         std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                        BuiltInParameters::p30B10B,
+                                        BuiltInParameters::p30B00B00B,
                                         1,
                                         StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 4, 1>(),
                                         EOpNormalize,
@@ -9394,7 +9423,7 @@
 constexpr const TFunction normalize_10C(BuiltInId::normalize_Double2,
                                         BuiltInName::normalize,
                                         std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                        BuiltInParameters::p10C10C00C,
+                                        BuiltInParameters::p10C00C00C,
                                         1,
                                         StaticType::Get<EbtDouble, EbpUndefined, EvqGlobal, 2, 1>(),
                                         EOpNormalize,
@@ -9402,7 +9431,7 @@
 constexpr const TFunction normalize_20C(BuiltInId::normalize_Double3,
                                         BuiltInName::normalize,
                                         std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                        BuiltInParameters::p20C_o_20D,
+                                        BuiltInParameters::p20C00C00C,
                                         1,
                                         StaticType::Get<EbtDouble, EbpUndefined, EvqGlobal, 3, 1>(),
                                         EOpNormalize,
@@ -9490,7 +9519,7 @@
 constexpr const TFunction reflect_00B00B(BuiltInId::reflect_Float1_Float1,
                                          BuiltInName::reflect,
                                          std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                         BuiltInParameters::p00B00B20B,
+                                         BuiltInParameters::p00B00B00B,
                                          2,
                                          StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 1, 1>(),
                                          EOpReflect,
@@ -9532,7 +9561,7 @@
     BuiltInId::reflect_Double2_Double2,
     BuiltInName::reflect,
     std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-    BuiltInParameters::p10C10C00C,
+    BuiltInParameters::p10C10C00B,
     2,
     StaticType::Get<EbtDouble, EbpUndefined, EvqGlobal, 2, 1>(),
     EOpReflect,
@@ -9541,7 +9570,7 @@
     BuiltInId::reflect_Double3_Double3,
     BuiltInName::reflect,
     std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-    BuiltInParameters::p20C20C20C,
+    BuiltInParameters::p20C20C00B,
     2,
     StaticType::Get<EbtDouble, EbpUndefined, EvqGlobal, 3, 1>(),
     EOpReflect,
@@ -9955,7 +9984,7 @@
 constexpr const TFunction lessThan_20D20D(BuiltInId::lessThan_Int3_Int3,
                                           BuiltInName::lessThan,
                                           std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                          BuiltInParameters::p20D20D20F,
+                                          BuiltInParameters::p20D20D00D00D,
                                           2,
                                           StaticType::Get<EbtBool, EbpUndefined, EvqGlobal, 3, 1>(),
                                           EOpLessThanComponentWise,
@@ -9963,7 +9992,7 @@
 constexpr const TFunction lessThan_30D30D(BuiltInId::lessThan_Int4_Int4,
                                           BuiltInName::lessThan,
                                           std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                          BuiltInParameters::p30D30D30F,
+                                          BuiltInParameters::p30D30D00D00D,
                                           2,
                                           StaticType::Get<EbtBool, EbpUndefined, EvqGlobal, 4, 1>(),
                                           EOpLessThanComponentWise,
@@ -9971,7 +10000,7 @@
 constexpr const TFunction lessThan_10E10E(BuiltInId::lessThan_UInt2_UInt2,
                                           BuiltInName::lessThan,
                                           std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                          BuiltInParameters::p10E10E_o_10E_o_10E,
+                                          BuiltInParameters::p10E10E00D00D,
                                           2,
                                           StaticType::Get<EbtBool, EbpUndefined, EvqGlobal, 2, 1>(),
                                           EOpLessThanComponentWise,
@@ -9979,7 +10008,7 @@
 constexpr const TFunction lessThan_20E20E(BuiltInId::lessThan_UInt3_UInt3,
                                           BuiltInName::lessThan,
                                           std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                          BuiltInParameters::p20E20E20E,
+                                          BuiltInParameters::p20E20E00D00D,
                                           2,
                                           StaticType::Get<EbtBool, EbpUndefined, EvqGlobal, 3, 1>(),
                                           EOpLessThanComponentWise,
@@ -9987,7 +10016,7 @@
 constexpr const TFunction lessThan_30E30E(BuiltInId::lessThan_UInt4_UInt4,
                                           BuiltInName::lessThan,
                                           std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                          BuiltInParameters::p30E30E_o_30E_o_30E,
+                                          BuiltInParameters::p30E30E00D00D,
                                           2,
                                           StaticType::Get<EbtBool, EbpUndefined, EvqGlobal, 4, 1>(),
                                           EOpLessThanComponentWise,
@@ -10032,7 +10061,7 @@
     BuiltInId::lessThanEqual_Int3_Int3,
     BuiltInName::lessThanEqual,
     std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-    BuiltInParameters::p20D20D20F,
+    BuiltInParameters::p20D20D00D00D,
     2,
     StaticType::Get<EbtBool, EbpUndefined, EvqGlobal, 3, 1>(),
     EOpLessThanEqualComponentWise,
@@ -10041,7 +10070,7 @@
     BuiltInId::lessThanEqual_Int4_Int4,
     BuiltInName::lessThanEqual,
     std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-    BuiltInParameters::p30D30D30F,
+    BuiltInParameters::p30D30D00D00D,
     2,
     StaticType::Get<EbtBool, EbpUndefined, EvqGlobal, 4, 1>(),
     EOpLessThanEqualComponentWise,
@@ -10050,7 +10079,7 @@
     BuiltInId::lessThanEqual_UInt2_UInt2,
     BuiltInName::lessThanEqual,
     std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-    BuiltInParameters::p10E10E_o_10E_o_10E,
+    BuiltInParameters::p10E10E00D00D,
     2,
     StaticType::Get<EbtBool, EbpUndefined, EvqGlobal, 2, 1>(),
     EOpLessThanEqualComponentWise,
@@ -10059,7 +10088,7 @@
     BuiltInId::lessThanEqual_UInt3_UInt3,
     BuiltInName::lessThanEqual,
     std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-    BuiltInParameters::p20E20E20E,
+    BuiltInParameters::p20E20E00D00D,
     2,
     StaticType::Get<EbtBool, EbpUndefined, EvqGlobal, 3, 1>(),
     EOpLessThanEqualComponentWise,
@@ -10068,7 +10097,7 @@
     BuiltInId::lessThanEqual_UInt4_UInt4,
     BuiltInName::lessThanEqual,
     std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-    BuiltInParameters::p30E30E_o_30E_o_30E,
+    BuiltInParameters::p30E30E00D00D,
     2,
     StaticType::Get<EbtBool, EbpUndefined, EvqGlobal, 4, 1>(),
     EOpLessThanEqualComponentWise,
@@ -10113,7 +10142,7 @@
     BuiltInId::greaterThan_Int3_Int3,
     BuiltInName::greaterThan,
     std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-    BuiltInParameters::p20D20D20F,
+    BuiltInParameters::p20D20D00D00D,
     2,
     StaticType::Get<EbtBool, EbpUndefined, EvqGlobal, 3, 1>(),
     EOpGreaterThanComponentWise,
@@ -10122,7 +10151,7 @@
     BuiltInId::greaterThan_Int4_Int4,
     BuiltInName::greaterThan,
     std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-    BuiltInParameters::p30D30D30F,
+    BuiltInParameters::p30D30D00D00D,
     2,
     StaticType::Get<EbtBool, EbpUndefined, EvqGlobal, 4, 1>(),
     EOpGreaterThanComponentWise,
@@ -10131,7 +10160,7 @@
     BuiltInId::greaterThan_UInt2_UInt2,
     BuiltInName::greaterThan,
     std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-    BuiltInParameters::p10E10E_o_10E_o_10E,
+    BuiltInParameters::p10E10E00D00D,
     2,
     StaticType::Get<EbtBool, EbpUndefined, EvqGlobal, 2, 1>(),
     EOpGreaterThanComponentWise,
@@ -10140,7 +10169,7 @@
     BuiltInId::greaterThan_UInt3_UInt3,
     BuiltInName::greaterThan,
     std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-    BuiltInParameters::p20E20E20E,
+    BuiltInParameters::p20E20E00D00D,
     2,
     StaticType::Get<EbtBool, EbpUndefined, EvqGlobal, 3, 1>(),
     EOpGreaterThanComponentWise,
@@ -10149,7 +10178,7 @@
     BuiltInId::greaterThan_UInt4_UInt4,
     BuiltInName::greaterThan,
     std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-    BuiltInParameters::p30E30E_o_30E_o_30E,
+    BuiltInParameters::p30E30E00D00D,
     2,
     StaticType::Get<EbtBool, EbpUndefined, EvqGlobal, 4, 1>(),
     EOpGreaterThanComponentWise,
@@ -10194,7 +10223,7 @@
     BuiltInId::greaterThanEqual_Int3_Int3,
     BuiltInName::greaterThanEqual,
     std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-    BuiltInParameters::p20D20D20F,
+    BuiltInParameters::p20D20D00D00D,
     2,
     StaticType::Get<EbtBool, EbpUndefined, EvqGlobal, 3, 1>(),
     EOpGreaterThanEqualComponentWise,
@@ -10203,7 +10232,7 @@
     BuiltInId::greaterThanEqual_Int4_Int4,
     BuiltInName::greaterThanEqual,
     std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-    BuiltInParameters::p30D30D30F,
+    BuiltInParameters::p30D30D00D00D,
     2,
     StaticType::Get<EbtBool, EbpUndefined, EvqGlobal, 4, 1>(),
     EOpGreaterThanEqualComponentWise,
@@ -10212,7 +10241,7 @@
     BuiltInId::greaterThanEqual_UInt2_UInt2,
     BuiltInName::greaterThanEqual,
     std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-    BuiltInParameters::p10E10E_o_10E_o_10E,
+    BuiltInParameters::p10E10E00D00D,
     2,
     StaticType::Get<EbtBool, EbpUndefined, EvqGlobal, 2, 1>(),
     EOpGreaterThanEqualComponentWise,
@@ -10221,7 +10250,7 @@
     BuiltInId::greaterThanEqual_UInt3_UInt3,
     BuiltInName::greaterThanEqual,
     std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-    BuiltInParameters::p20E20E20E,
+    BuiltInParameters::p20E20E00D00D,
     2,
     StaticType::Get<EbtBool, EbpUndefined, EvqGlobal, 3, 1>(),
     EOpGreaterThanEqualComponentWise,
@@ -10230,7 +10259,7 @@
     BuiltInId::greaterThanEqual_UInt4_UInt4,
     BuiltInName::greaterThanEqual,
     std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-    BuiltInParameters::p30E30E_o_30E_o_30E,
+    BuiltInParameters::p30E30E00D00D,
     2,
     StaticType::Get<EbtBool, EbpUndefined, EvqGlobal, 4, 1>(),
     EOpGreaterThanEqualComponentWise,
@@ -10270,7 +10299,7 @@
 constexpr const TFunction equal_20D20D(BuiltInId::equal_Int3_Int3,
                                        BuiltInName::equal,
                                        std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                       BuiltInParameters::p20D20D20F,
+                                       BuiltInParameters::p20D20D00D00D,
                                        2,
                                        StaticType::Get<EbtBool, EbpUndefined, EvqGlobal, 3, 1>(),
                                        EOpEqualComponentWise,
@@ -10278,7 +10307,7 @@
 constexpr const TFunction equal_30D30D(BuiltInId::equal_Int4_Int4,
                                        BuiltInName::equal,
                                        std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                       BuiltInParameters::p30D30D30F,
+                                       BuiltInParameters::p30D30D00D00D,
                                        2,
                                        StaticType::Get<EbtBool, EbpUndefined, EvqGlobal, 4, 1>(),
                                        EOpEqualComponentWise,
@@ -10286,7 +10315,7 @@
 constexpr const TFunction equal_10E10E(BuiltInId::equal_UInt2_UInt2,
                                        BuiltInName::equal,
                                        std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                       BuiltInParameters::p10E10E_o_10E_o_10E,
+                                       BuiltInParameters::p10E10E00D00D,
                                        2,
                                        StaticType::Get<EbtBool, EbpUndefined, EvqGlobal, 2, 1>(),
                                        EOpEqualComponentWise,
@@ -10294,7 +10323,7 @@
 constexpr const TFunction equal_20E20E(BuiltInId::equal_UInt3_UInt3,
                                        BuiltInName::equal,
                                        std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                       BuiltInParameters::p20E20E20E,
+                                       BuiltInParameters::p20E20E00D00D,
                                        2,
                                        StaticType::Get<EbtBool, EbpUndefined, EvqGlobal, 3, 1>(),
                                        EOpEqualComponentWise,
@@ -10302,7 +10331,7 @@
 constexpr const TFunction equal_30E30E(BuiltInId::equal_UInt4_UInt4,
                                        BuiltInName::equal,
                                        std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                       BuiltInParameters::p30E30E_o_30E_o_30E,
+                                       BuiltInParameters::p30E30E00D00D,
                                        2,
                                        StaticType::Get<EbtBool, EbpUndefined, EvqGlobal, 4, 1>(),
                                        EOpEqualComponentWise,
@@ -10366,7 +10395,7 @@
 constexpr const TFunction notEqual_20D20D(BuiltInId::notEqual_Int3_Int3,
                                           BuiltInName::notEqual,
                                           std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                          BuiltInParameters::p20D20D20F,
+                                          BuiltInParameters::p20D20D00D00D,
                                           2,
                                           StaticType::Get<EbtBool, EbpUndefined, EvqGlobal, 3, 1>(),
                                           EOpNotEqualComponentWise,
@@ -10374,7 +10403,7 @@
 constexpr const TFunction notEqual_30D30D(BuiltInId::notEqual_Int4_Int4,
                                           BuiltInName::notEqual,
                                           std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                          BuiltInParameters::p30D30D30F,
+                                          BuiltInParameters::p30D30D00D00D,
                                           2,
                                           StaticType::Get<EbtBool, EbpUndefined, EvqGlobal, 4, 1>(),
                                           EOpNotEqualComponentWise,
@@ -10382,7 +10411,7 @@
 constexpr const TFunction notEqual_10E10E(BuiltInId::notEqual_UInt2_UInt2,
                                           BuiltInName::notEqual,
                                           std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                          BuiltInParameters::p10E10E_o_10E_o_10E,
+                                          BuiltInParameters::p10E10E00D00D,
                                           2,
                                           StaticType::Get<EbtBool, EbpUndefined, EvqGlobal, 2, 1>(),
                                           EOpNotEqualComponentWise,
@@ -10390,7 +10419,7 @@
 constexpr const TFunction notEqual_20E20E(BuiltInId::notEqual_UInt3_UInt3,
                                           BuiltInName::notEqual,
                                           std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                          BuiltInParameters::p20E20E20E,
+                                          BuiltInParameters::p20E20E00D00D,
                                           2,
                                           StaticType::Get<EbtBool, EbpUndefined, EvqGlobal, 3, 1>(),
                                           EOpNotEqualComponentWise,
@@ -10398,7 +10427,7 @@
 constexpr const TFunction notEqual_30E30E(BuiltInId::notEqual_UInt4_UInt4,
                                           BuiltInName::notEqual,
                                           std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                          BuiltInParameters::p30E30E_o_30E_o_30E,
+                                          BuiltInParameters::p30E30E00D00D,
                                           2,
                                           StaticType::Get<EbtBool, EbpUndefined, EvqGlobal, 4, 1>(),
                                           EOpNotEqualComponentWise,
@@ -10647,7 +10676,7 @@
     BuiltInId::bitfieldReverse_Int1,
     BuiltInName::bitfieldReverse,
     std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-    BuiltInParameters::p00D00D00F,
+    BuiltInParameters::p00D00D00D00D,
     1,
     StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 1, 1>(),
     EOpBitfieldReverse,
@@ -10656,7 +10685,7 @@
     BuiltInId::bitfieldReverse_Int2,
     BuiltInName::bitfieldReverse,
     std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-    BuiltInParameters::p10D10D00D00D,
+    BuiltInParameters::p10D00D00D,
     1,
     StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 2, 1>(),
     EOpBitfieldReverse,
@@ -10665,7 +10694,7 @@
     BuiltInId::bitfieldReverse_Int3,
     BuiltInName::bitfieldReverse,
     std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-    BuiltInParameters::p20D20D20F,
+    BuiltInParameters::p20D00D00D,
     1,
     StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 3, 1>(),
     EOpBitfieldReverse,
@@ -10674,7 +10703,7 @@
     BuiltInId::bitfieldReverse_Int4,
     BuiltInName::bitfieldReverse,
     std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-    BuiltInParameters::p30D30D30F,
+    BuiltInParameters::p30D00D00D,
     1,
     StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 4, 1>(),
     EOpBitfieldReverse,
@@ -10683,7 +10712,7 @@
     BuiltInId::bitfieldReverse_UInt1,
     BuiltInName::bitfieldReverse,
     std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-    BuiltInParameters::p00E00E00D00D,
+    BuiltInParameters::p00E00D00D,
     1,
     StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 1, 1>(),
     EOpBitfieldReverse,
@@ -10692,7 +10721,7 @@
     BuiltInId::bitfieldReverse_UInt2,
     BuiltInName::bitfieldReverse,
     std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-    BuiltInParameters::p10E00E00E,
+    BuiltInParameters::p10E00D00D,
     1,
     StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 2, 1>(),
     EOpBitfieldReverse,
@@ -10701,7 +10730,7 @@
     BuiltInId::bitfieldReverse_UInt3,
     BuiltInName::bitfieldReverse,
     std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-    BuiltInParameters::p20E20E20E,
+    BuiltInParameters::p20E00D00D,
     1,
     StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 3, 1>(),
     EOpBitfieldReverse,
@@ -10710,7 +10739,7 @@
     BuiltInId::bitfieldReverse_UInt4,
     BuiltInName::bitfieldReverse,
     std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-    BuiltInParameters::p30E30E_o_30E_o_30E,
+    BuiltInParameters::p30E00D00D,
     1,
     StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 4, 1>(),
     EOpBitfieldReverse,
@@ -10718,7 +10747,7 @@
 constexpr const TFunction bitCount_00D(BuiltInId::bitCount_Int1,
                                        BuiltInName::bitCount,
                                        std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                       BuiltInParameters::p00D00D00F,
+                                       BuiltInParameters::p00D00D00D00D,
                                        1,
                                        StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 1, 1>(),
                                        EOpBitCount,
@@ -10726,7 +10755,7 @@
 constexpr const TFunction bitCount_10D(BuiltInId::bitCount_Int2,
                                        BuiltInName::bitCount,
                                        std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                       BuiltInParameters::p10D10D00D00D,
+                                       BuiltInParameters::p10D00D00D,
                                        1,
                                        StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 2, 1>(),
                                        EOpBitCount,
@@ -10734,7 +10763,7 @@
 constexpr const TFunction bitCount_20D(BuiltInId::bitCount_Int3,
                                        BuiltInName::bitCount,
                                        std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                       BuiltInParameters::p20D20D20F,
+                                       BuiltInParameters::p20D00D00D,
                                        1,
                                        StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 3, 1>(),
                                        EOpBitCount,
@@ -10742,7 +10771,7 @@
 constexpr const TFunction bitCount_30D(BuiltInId::bitCount_Int4,
                                        BuiltInName::bitCount,
                                        std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                       BuiltInParameters::p30D30D30F,
+                                       BuiltInParameters::p30D00D00D,
                                        1,
                                        StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 4, 1>(),
                                        EOpBitCount,
@@ -10750,7 +10779,7 @@
 constexpr const TFunction bitCount_00E(BuiltInId::bitCount_UInt1,
                                        BuiltInName::bitCount,
                                        std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                       BuiltInParameters::p00E00E00D00D,
+                                       BuiltInParameters::p00E00D00D,
                                        1,
                                        StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 1, 1>(),
                                        EOpBitCount,
@@ -10758,7 +10787,7 @@
 constexpr const TFunction bitCount_10E(BuiltInId::bitCount_UInt2,
                                        BuiltInName::bitCount,
                                        std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                       BuiltInParameters::p10E00E00E,
+                                       BuiltInParameters::p10E00D00D,
                                        1,
                                        StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 2, 1>(),
                                        EOpBitCount,
@@ -10766,7 +10795,7 @@
 constexpr const TFunction bitCount_20E(BuiltInId::bitCount_UInt3,
                                        BuiltInName::bitCount,
                                        std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                       BuiltInParameters::p20E20E20E,
+                                       BuiltInParameters::p20E00D00D,
                                        1,
                                        StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 3, 1>(),
                                        EOpBitCount,
@@ -10774,7 +10803,7 @@
 constexpr const TFunction bitCount_30E(BuiltInId::bitCount_UInt4,
                                        BuiltInName::bitCount,
                                        std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                       BuiltInParameters::p30E30E_o_30E_o_30E,
+                                       BuiltInParameters::p30E00D00D,
                                        1,
                                        StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 4, 1>(),
                                        EOpBitCount,
@@ -10782,7 +10811,7 @@
 constexpr const TFunction findLSB_00D(BuiltInId::findLSB_Int1,
                                       BuiltInName::findLSB,
                                       std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                      BuiltInParameters::p00D00D00F,
+                                      BuiltInParameters::p00D00D00D00D,
                                       1,
                                       StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 1, 1>(),
                                       EOpFindLSB,
@@ -10790,7 +10819,7 @@
 constexpr const TFunction findLSB_10D(BuiltInId::findLSB_Int2,
                                       BuiltInName::findLSB,
                                       std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                      BuiltInParameters::p10D10D00D00D,
+                                      BuiltInParameters::p10D00D00D,
                                       1,
                                       StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 2, 1>(),
                                       EOpFindLSB,
@@ -10798,7 +10827,7 @@
 constexpr const TFunction findLSB_20D(BuiltInId::findLSB_Int3,
                                       BuiltInName::findLSB,
                                       std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                      BuiltInParameters::p20D20D20F,
+                                      BuiltInParameters::p20D00D00D,
                                       1,
                                       StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 3, 1>(),
                                       EOpFindLSB,
@@ -10806,7 +10835,7 @@
 constexpr const TFunction findLSB_30D(BuiltInId::findLSB_Int4,
                                       BuiltInName::findLSB,
                                       std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                      BuiltInParameters::p30D30D30F,
+                                      BuiltInParameters::p30D00D00D,
                                       1,
                                       StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 4, 1>(),
                                       EOpFindLSB,
@@ -10814,7 +10843,7 @@
 constexpr const TFunction findLSB_00E(BuiltInId::findLSB_UInt1,
                                       BuiltInName::findLSB,
                                       std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                      BuiltInParameters::p00E00E00D00D,
+                                      BuiltInParameters::p00E00D00D,
                                       1,
                                       StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 1, 1>(),
                                       EOpFindLSB,
@@ -10822,7 +10851,7 @@
 constexpr const TFunction findLSB_10E(BuiltInId::findLSB_UInt2,
                                       BuiltInName::findLSB,
                                       std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                      BuiltInParameters::p10E00E00E,
+                                      BuiltInParameters::p10E00D00D,
                                       1,
                                       StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 2, 1>(),
                                       EOpFindLSB,
@@ -10830,7 +10859,7 @@
 constexpr const TFunction findLSB_20E(BuiltInId::findLSB_UInt3,
                                       BuiltInName::findLSB,
                                       std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                      BuiltInParameters::p20E20E20E,
+                                      BuiltInParameters::p20E00D00D,
                                       1,
                                       StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 3, 1>(),
                                       EOpFindLSB,
@@ -10838,7 +10867,7 @@
 constexpr const TFunction findLSB_30E(BuiltInId::findLSB_UInt4,
                                       BuiltInName::findLSB,
                                       std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                      BuiltInParameters::p30E30E_o_30E_o_30E,
+                                      BuiltInParameters::p30E00D00D,
                                       1,
                                       StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 4, 1>(),
                                       EOpFindLSB,
@@ -10846,7 +10875,7 @@
 constexpr const TFunction findMSB_00D(BuiltInId::findMSB_Int1,
                                       BuiltInName::findMSB,
                                       std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                      BuiltInParameters::p00D00D00F,
+                                      BuiltInParameters::p00D00D00D00D,
                                       1,
                                       StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 1, 1>(),
                                       EOpFindMSB,
@@ -10854,7 +10883,7 @@
 constexpr const TFunction findMSB_10D(BuiltInId::findMSB_Int2,
                                       BuiltInName::findMSB,
                                       std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                      BuiltInParameters::p10D10D00D00D,
+                                      BuiltInParameters::p10D00D00D,
                                       1,
                                       StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 2, 1>(),
                                       EOpFindMSB,
@@ -10862,7 +10891,7 @@
 constexpr const TFunction findMSB_20D(BuiltInId::findMSB_Int3,
                                       BuiltInName::findMSB,
                                       std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                      BuiltInParameters::p20D20D20F,
+                                      BuiltInParameters::p20D00D00D,
                                       1,
                                       StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 3, 1>(),
                                       EOpFindMSB,
@@ -10870,7 +10899,7 @@
 constexpr const TFunction findMSB_30D(BuiltInId::findMSB_Int4,
                                       BuiltInName::findMSB,
                                       std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                      BuiltInParameters::p30D30D30F,
+                                      BuiltInParameters::p30D00D00D,
                                       1,
                                       StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 4, 1>(),
                                       EOpFindMSB,
@@ -10878,7 +10907,7 @@
 constexpr const TFunction findMSB_00E(BuiltInId::findMSB_UInt1,
                                       BuiltInName::findMSB,
                                       std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                      BuiltInParameters::p00E00E00D00D,
+                                      BuiltInParameters::p00E00D00D,
                                       1,
                                       StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 1, 1>(),
                                       EOpFindMSB,
@@ -10886,7 +10915,7 @@
 constexpr const TFunction findMSB_10E(BuiltInId::findMSB_UInt2,
                                       BuiltInName::findMSB,
                                       std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                      BuiltInParameters::p10E00E00E,
+                                      BuiltInParameters::p10E00D00D,
                                       1,
                                       StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 2, 1>(),
                                       EOpFindMSB,
@@ -10894,7 +10923,7 @@
 constexpr const TFunction findMSB_20E(BuiltInId::findMSB_UInt3,
                                       BuiltInName::findMSB,
                                       std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                      BuiltInParameters::p20E20E20E,
+                                      BuiltInParameters::p20E00D00D,
                                       1,
                                       StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 3, 1>(),
                                       EOpFindMSB,
@@ -10902,7 +10931,7 @@
 constexpr const TFunction findMSB_30E(BuiltInId::findMSB_UInt4,
                                       BuiltInName::findMSB,
                                       std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                      BuiltInParameters::p30E30E_o_30E_o_30E,
+                                      BuiltInParameters::p30E00D00D,
                                       1,
                                       StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 4, 1>(),
                                       EOpFindMSB,
@@ -11055,7 +11084,7 @@
     BuiltInId::texture2D_Sampler2D1_Float2,
     BuiltInName::texture2D,
     std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-    BuiltInParameters::p00I10B10Dx400D,
+    BuiltInParameters::p00I10B00B10D,
     2,
     StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 4, 1>(),
     EOpTexture2D,
@@ -11064,7 +11093,7 @@
     BuiltInId::texture2DProj_Sampler2D1_Float3,
     BuiltInName::texture2DProj,
     std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-    BuiltInParameters::p00I20B10B10B10D,
+    BuiltInParameters::p00I20B00B10D,
     2,
     StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 4, 1>(),
     EOpTexture2DProj,
@@ -11073,7 +11102,7 @@
     BuiltInId::texture2DProj_Sampler2D1_Float4,
     BuiltInName::texture2DProj,
     std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-    BuiltInParameters::p00I30B10D00B,
+    BuiltInParameters::p00I30B00B10D,
     2,
     StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 4, 1>(),
     EOpTexture2DProj,
@@ -11091,7 +11120,7 @@
     BuiltInId::texture1D_Sampler1D1_Float1,
     BuiltInName::texture1D,
     std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-    BuiltInParameters::p00g00B00D00B,
+    BuiltInParameters::p00g00B00B00B00D,
     2,
     StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 4, 1>(),
     EOpTexture1D,
@@ -11100,7 +11129,7 @@
     BuiltInId::texture1DProj_Sampler1D1_Float2,
     BuiltInName::texture1DProj,
     std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-    BuiltInParameters::p00g10B00D00B,
+    BuiltInParameters::p00g10B00B00B00D,
     2,
     StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 4, 1>(),
     EOpTexture1DProj,
@@ -11109,7 +11138,7 @@
     BuiltInId::texture1DProj_Sampler1D1_Float4,
     BuiltInName::texture1DProj,
     std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-    BuiltInParameters::p00g30B00B00D,
+    BuiltInParameters::p00g30B00B00B00D,
     2,
     StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 4, 1>(),
     EOpTexture1DProj,
@@ -11118,7 +11147,7 @@
     BuiltInId::texture3D_Sampler3D1_Float3,
     BuiltInName::texture3D,
     std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-    BuiltInParameters::p00J20B20D00B,
+    BuiltInParameters::p00J20B00B20D,
     2,
     StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 4, 1>(),
     EOpTexture3D,
@@ -11127,7 +11156,7 @@
     BuiltInId::texture3DProj_Sampler3D1_Float4,
     BuiltInName::texture3DProj,
     std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-    BuiltInParameters::p00J30B20D00B,
+    BuiltInParameters::p00J30B00B20D,
     2,
     StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 4, 1>(),
     EOpTexture3DProj,
@@ -11136,7 +11165,7 @@
     BuiltInId::shadow1D_Sampler1DShadow1_Float3,
     BuiltInName::shadow1D,
     std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-    BuiltInParameters::p00m20B00D00B,
+    BuiltInParameters::p00m20B00B00B00D,
     2,
     StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 4, 1>(),
     EOpShadow1D,
@@ -11145,7 +11174,7 @@
     BuiltInId::shadow1DProj_Sampler1DShadow1_Float4,
     BuiltInName::shadow1DProj,
     std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-    BuiltInParameters::p00m30B00B00D,
+    BuiltInParameters::p00m30B00B00B00D,
     2,
     StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 4, 1>(),
     EOpShadow1DProj,
@@ -11163,7 +11192,7 @@
     BuiltInId::shadow2DProj_Sampler2DShadow1_Float4,
     BuiltInName::shadow2DProj,
     std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-    BuiltInParameters::p00d30B10D00B,
+    BuiltInParameters::p00d30B00B10D,
     2,
     StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 4, 1>(),
     EOpShadow2DProj,
@@ -11181,7 +11210,7 @@
     BuiltInId::shadow2DProjEXT_Sampler2DShadow1_Float4,
     BuiltInName::shadow2DProjEXT,
     std::array<TExtension, 1u>{{TExtension::EXT_shadow_samplers}},
-    BuiltInParameters::p00d30B10D00B,
+    BuiltInParameters::p00d30B00B10D,
     2,
     StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 1, 1>(),
     EOpShadow2DProjEXT,
@@ -11220,7 +11249,7 @@
     BuiltInId::texture2DRect_Sampler2DRect1_Float2,
     BuiltInName::texture2DRect,
     std::array<TExtension, 1u>{{TExtension::ARB_texture_rectangle}},
-    BuiltInParameters::p00O10B10Dx400D,
+    BuiltInParameters::p00O10B10B10B10D,
     2,
     StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 4, 1>(),
     EOpTexture2DRect,
@@ -11229,7 +11258,7 @@
     BuiltInId::texture2DRectProj_Sampler2DRect1_Float3,
     BuiltInName::texture2DRectProj,
     std::array<TExtension, 1u>{{TExtension::ARB_texture_rectangle}},
-    BuiltInParameters::p00O20B10D,
+    BuiltInParameters::p00O20B00D,
     2,
     StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 4, 1>(),
     EOpTexture2DRectProj,
@@ -11238,7 +11267,7 @@
     BuiltInId::texture2DRectProj_Sampler2DRect1_Float4,
     BuiltInName::texture2DRectProj,
     std::array<TExtension, 1u>{{TExtension::ARB_texture_rectangle}},
-    BuiltInParameters::p00O30B10D,
+    BuiltInParameters::p00O30B10B10B10D,
     2,
     StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 4, 1>(),
     EOpTexture2DRectProj,
@@ -11346,7 +11375,7 @@
     BuiltInId::texture1D_Sampler1D1_Float1_Float1,
     BuiltInName::texture1D,
     std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-    BuiltInParameters::p00g00B00B00D,
+    BuiltInParameters::p00g00B00B00B00D,
     3,
     StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 4, 1>(),
     EOpTexture1DBias,
@@ -11364,7 +11393,7 @@
     BuiltInId::texture1DProj_Sampler1D1_Float4_Float1,
     BuiltInName::texture1DProj,
     std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-    BuiltInParameters::p00g30B00B00D,
+    BuiltInParameters::p00g30B00B00B00D,
     3,
     StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 4, 1>(),
     EOpTexture1DProjBias,
@@ -11382,7 +11411,7 @@
     BuiltInId::shadow1DProj_Sampler1DShadow1_Float4_Float1,
     BuiltInName::shadow1DProj,
     std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-    BuiltInParameters::p00m30B00B00D,
+    BuiltInParameters::p00m30B00B00B00D,
     3,
     StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 4, 1>(),
     EOpShadow1DProjBias,
@@ -11445,7 +11474,7 @@
     BuiltInId::texture1DLod_Sampler1D1_Float1_Float1,
     BuiltInName::texture1DLod,
     std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-    BuiltInParameters::p00g00B00B00D,
+    BuiltInParameters::p00g00B00B00B00D,
     3,
     StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 4, 1>(),
     EOpTexture1DLod,
@@ -11463,7 +11492,7 @@
     BuiltInId::texture1DProjLod_Sampler1D1_Float4_Float1,
     BuiltInName::texture1DProjLod,
     std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-    BuiltInParameters::p00g30B00B00D,
+    BuiltInParameters::p00g30B00B00B00D,
     3,
     StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 4, 1>(),
     EOpTexture1DProjLod,
@@ -11481,7 +11510,7 @@
     BuiltInId::shadow1DProjLod_Sampler1DShadow1_Float4_Float1,
     BuiltInName::shadow1DProjLod,
     std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-    BuiltInParameters::p00m30B00B00D,
+    BuiltInParameters::p00m30B00B00B00D,
     3,
     StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 4, 1>(),
     EOpShadow1DProjLod,
@@ -11561,7 +11590,7 @@
 constexpr const TFunction texture_00I10B(BuiltInId::texture_Sampler2D1_Float2,
                                          BuiltInName::texture,
                                          std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                         BuiltInParameters::p00I10B10Dx400D,
+                                         BuiltInParameters::p00I10B00B10D,
                                          2,
                                          StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 4, 1>(),
                                          EOpTexture,
@@ -11569,7 +11598,7 @@
 constexpr const TFunction texture_00R10B(BuiltInId::texture_ISampler2D1_Float2,
                                          BuiltInName::texture,
                                          std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                         BuiltInParameters::p00R10B10D00D,
+                                         BuiltInParameters::p00R10B00B10D,
                                          2,
                                          StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 4, 1>(),
                                          EOpTexture,
@@ -11585,7 +11614,7 @@
 constexpr const TFunction texture_00J20B(BuiltInId::texture_Sampler3D1_Float3,
                                          BuiltInName::texture,
                                          std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                         BuiltInParameters::p00J20B20D00B,
+                                         BuiltInParameters::p00J20B00B20D,
                                          2,
                                          StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 4, 1>(),
                                          EOpTexture,
@@ -11593,7 +11622,7 @@
 constexpr const TFunction texture_00S20B(BuiltInId::texture_ISampler3D1_Float3,
                                          BuiltInName::texture,
                                          std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                         BuiltInParameters::p00S20B20B20B20D,
+                                         BuiltInParameters::p00S20B00B20D,
                                          2,
                                          StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 4, 1>(),
                                          EOpTexture,
@@ -11601,7 +11630,7 @@
 constexpr const TFunction texture_00Y20B(BuiltInId::texture_USampler3D1_Float3,
                                          BuiltInName::texture,
                                          std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                         BuiltInParameters::p00Y20B20B20B20D,
+                                         BuiltInParameters::p00Y20B00B20D,
                                          2,
                                          StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 4, 1>(),
                                          EOpTexture,
@@ -11617,7 +11646,7 @@
 constexpr const TFunction texture_00T20B(BuiltInId::texture_ISamplerCube1_Float3,
                                          BuiltInName::texture,
                                          std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                         BuiltInParameters::p00T20B20B20B,
+                                         BuiltInParameters::p00T20B00B,
                                          2,
                                          StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 4, 1>(),
                                          EOpTexture,
@@ -11641,7 +11670,7 @@
 constexpr const TFunction texture_00U20B(BuiltInId::texture_ISampler2DArray1_Float3,
                                          BuiltInName::texture,
                                          std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                         BuiltInParameters::p00U20B10B10B10D,
+                                         BuiltInParameters::p00U20B00B10D,
                                          2,
                                          StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 4, 1>(),
                                          EOpTexture,
@@ -11649,7 +11678,7 @@
 constexpr const TFunction texture_00a20B(BuiltInId::texture_USampler2DArray1_Float3,
                                          BuiltInName::texture,
                                          std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                         BuiltInParameters::p00a20B10B10B10D,
+                                         BuiltInParameters::p00a20B00B10D,
                                          2,
                                          StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 4, 1>(),
                                          EOpTexture,
@@ -11665,7 +11694,7 @@
 constexpr const TFunction texture_00e30B(BuiltInId::texture_SamplerCubeShadow1_Float4,
                                          BuiltInName::texture,
                                          std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                         BuiltInParameters::p00e30B20B20B,
+                                         BuiltInParameters::p00e30B00B,
                                          2,
                                          StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 1, 1>(),
                                          EOpTexture,
@@ -11673,7 +11702,7 @@
 constexpr const TFunction texture_00f30B(BuiltInId::texture_Sampler2DArrayShadow1_Float4,
                                          BuiltInName::texture,
                                          std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                         BuiltInParameters::p00f30B10B10B10D,
+                                         BuiltInParameters::p00f30B00B,
                                          2,
                                          StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 1, 1>(),
                                          EOpTexture,
@@ -11681,7 +11710,7 @@
 constexpr const TFunction texture_00g00B(BuiltInId::texture_Sampler1D1_Float1,
                                          BuiltInName::texture,
                                          std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                         BuiltInParameters::p00g00B00D00B,
+                                         BuiltInParameters::p00g00B00B00B00D,
                                          2,
                                          StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 4, 1>(),
                                          EOpTexture,
@@ -11697,7 +11726,7 @@
 constexpr const TFunction texture_00t00B(BuiltInId::texture_USampler1D1_Float1,
                                          BuiltInName::texture,
                                          std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                         BuiltInParameters::p00t00B00B00D,
+                                         BuiltInParameters::p00t00B00B00B00D,
                                          2,
                                          StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 4, 1>(),
                                          EOpTexture,
@@ -11705,7 +11734,7 @@
 constexpr const TFunction texture_00m20B(BuiltInId::texture_Sampler1DShadow1_Float3,
                                          BuiltInName::texture,
                                          std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                         BuiltInParameters::p00m20B00D00B,
+                                         BuiltInParameters::p00m20B00B00B00D,
                                          2,
                                          StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 1, 1>(),
                                          EOpTexture,
@@ -11745,7 +11774,7 @@
 constexpr const TFunction texture_00O10B(BuiltInId::texture_Sampler2DRect1_Float2,
                                          BuiltInName::texture,
                                          std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                         BuiltInParameters::p00O10B10Dx400D,
+                                         BuiltInParameters::p00O10B10B10B10D,
                                          2,
                                          StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 4, 1>(),
                                          EOpTexture,
@@ -11777,7 +11806,7 @@
 constexpr const TFunction texture_00k30B(BuiltInId::texture_SamplerCubeArray1_Float4,
                                          BuiltInName::texture,
                                          std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                         BuiltInParameters::p00k30B20B20B,
+                                         BuiltInParameters::p00k30B00B,
                                          2,
                                          StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 4, 1>(),
                                          EOpTexture,
@@ -11793,7 +11822,7 @@
 constexpr const TFunction texture_00x30B(BuiltInId::texture_USamplerCubeArray1_Float4,
                                          BuiltInName::texture,
                                          std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                         BuiltInParameters::p00x30B00D,
+                                         BuiltInParameters::p00x30B00B,
                                          2,
                                          StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 4, 1>(),
                                          EOpTexture,
@@ -11812,7 +11841,7 @@
     BuiltInName::textureExt,
     std::array<TExtension, 2u>{
         {TExtension::OES_texture_cube_map_array, TExtension::EXT_texture_cube_map_array}},
-    BuiltInParameters::p00k30B20B20B,
+    BuiltInParameters::p00k30B00B,
     2,
     StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 4, 1>(),
     EOpTexture,
@@ -11832,7 +11861,7 @@
     BuiltInName::textureExt,
     std::array<TExtension, 2u>{
         {TExtension::OES_texture_cube_map_array, TExtension::EXT_texture_cube_map_array}},
-    BuiltInParameters::p00x30B00D,
+    BuiltInParameters::p00x30B00B,
     2,
     StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 4, 1>(),
     EOpTexture,
@@ -11876,7 +11905,7 @@
     BuiltInId::textureProj_Sampler2D1_Float3,
     BuiltInName::textureProj,
     std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-    BuiltInParameters::p00I20B10B10B10D,
+    BuiltInParameters::p00I20B00B10D,
     2,
     StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 4, 1>(),
     EOpTextureProj,
@@ -11885,7 +11914,7 @@
     BuiltInId::textureProj_ISampler2D1_Float3,
     BuiltInName::textureProj,
     std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-    BuiltInParameters::p00R20B10B10B10D,
+    BuiltInParameters::p00R20B00B10D,
     2,
     StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 4, 1>(),
     EOpTextureProj,
@@ -11894,7 +11923,7 @@
     BuiltInId::textureProj_USampler2D1_Float3,
     BuiltInName::textureProj,
     std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-    BuiltInParameters::p00X20B10D00B,
+    BuiltInParameters::p00X20B00B10D,
     2,
     StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 4, 1>(),
     EOpTextureProj,
@@ -11903,7 +11932,7 @@
     BuiltInId::textureProj_Sampler2D1_Float4,
     BuiltInName::textureProj,
     std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-    BuiltInParameters::p00I30B10D00B,
+    BuiltInParameters::p00I30B00B10D,
     2,
     StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 4, 1>(),
     EOpTextureProj,
@@ -11912,7 +11941,7 @@
     BuiltInId::textureProj_ISampler2D1_Float4,
     BuiltInName::textureProj,
     std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-    BuiltInParameters::p00R30B10B10B10D,
+    BuiltInParameters::p00R30B00B10D,
     2,
     StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 4, 1>(),
     EOpTextureProj,
@@ -11930,7 +11959,7 @@
     BuiltInId::textureProj_Sampler3D1_Float4,
     BuiltInName::textureProj,
     std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-    BuiltInParameters::p00J30B20D00B,
+    BuiltInParameters::p00J30B00B20D,
     2,
     StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 4, 1>(),
     EOpTextureProj,
@@ -11939,7 +11968,7 @@
     BuiltInId::textureProj_ISampler3D1_Float4,
     BuiltInName::textureProj,
     std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-    BuiltInParameters::p00S30B20B20B20D,
+    BuiltInParameters::p00S30B00B20D,
     2,
     StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 4, 1>(),
     EOpTextureProj,
@@ -11948,7 +11977,7 @@
     BuiltInId::textureProj_USampler3D1_Float4,
     BuiltInName::textureProj,
     std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-    BuiltInParameters::p00Y30B20D00B,
+    BuiltInParameters::p00Y30B00B20D,
     2,
     StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 4, 1>(),
     EOpTextureProj,
@@ -11957,7 +11986,7 @@
     BuiltInId::textureProj_Sampler2DShadow1_Float4,
     BuiltInName::textureProj,
     std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-    BuiltInParameters::p00d30B10D00B,
+    BuiltInParameters::p00d30B00B10D,
     2,
     StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 1, 1>(),
     EOpTextureProj,
@@ -11966,7 +11995,7 @@
     BuiltInId::textureProj_Sampler1D1_Float2,
     BuiltInName::textureProj,
     std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-    BuiltInParameters::p00g10B00D00B,
+    BuiltInParameters::p00g10B00B00B00D,
     2,
     StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 4, 1>(),
     EOpTextureProj,
@@ -11984,7 +12013,7 @@
     BuiltInId::textureProj_USampler1D1_Float2,
     BuiltInName::textureProj,
     std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-    BuiltInParameters::p00t10B00D00B,
+    BuiltInParameters::p00t10B00B00B00D,
     2,
     StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 4, 1>(),
     EOpTextureProj,
@@ -11993,7 +12022,7 @@
     BuiltInId::textureProj_Sampler1D1_Float4,
     BuiltInName::textureProj,
     std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-    BuiltInParameters::p00g30B00B00D,
+    BuiltInParameters::p00g30B00B00B00D,
     2,
     StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 4, 1>(),
     EOpTextureProj,
@@ -12002,7 +12031,7 @@
     BuiltInId::textureProj_ISampler1D1_Float4,
     BuiltInName::textureProj,
     std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-    BuiltInParameters::p00o30B00D00B,
+    BuiltInParameters::p00o30B00B00B00D,
     2,
     StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 4, 1>(),
     EOpTextureProj,
@@ -12011,7 +12040,7 @@
     BuiltInId::textureProj_USampler1D1_Float4,
     BuiltInName::textureProj,
     std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-    BuiltInParameters::p00t30B00B00D,
+    BuiltInParameters::p00t30B00B00B00D,
     2,
     StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 4, 1>(),
     EOpTextureProj,
@@ -12020,7 +12049,7 @@
     BuiltInId::textureProj_Sampler1DShadow1_Float4,
     BuiltInName::textureProj,
     std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-    BuiltInParameters::p00m30B00B00D,
+    BuiltInParameters::p00m30B00B00B00D,
     2,
     StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 1, 1>(),
     EOpTextureProj,
@@ -12029,7 +12058,7 @@
     BuiltInId::textureProj_Sampler2DRect1_Float3,
     BuiltInName::textureProj,
     std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-    BuiltInParameters::p00O20B10D,
+    BuiltInParameters::p00O20B00D,
     2,
     StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 4, 1>(),
     EOpTextureProj,
@@ -12038,7 +12067,7 @@
     BuiltInId::textureProj_ISampler2DRect1_Float3,
     BuiltInName::textureProj,
     std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-    BuiltInParameters::p00q20B10B10B10D,
+    BuiltInParameters::p00q20B00D,
     2,
     StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 4, 1>(),
     EOpTextureProj,
@@ -12056,7 +12085,7 @@
     BuiltInId::textureProj_Sampler2DRect1_Float4,
     BuiltInName::textureProj,
     std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-    BuiltInParameters::p00O30B10D,
+    BuiltInParameters::p00O30B10B10B10D,
     2,
     StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 4, 1>(),
     EOpTextureProj,
@@ -12065,7 +12094,7 @@
     BuiltInId::textureProj_ISampler2DRect1_Float4,
     BuiltInName::textureProj,
     std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-    BuiltInParameters::p00q30B10D,
+    BuiltInParameters::p00q30B10B10B10D,
     2,
     StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 4, 1>(),
     EOpTextureProj,
@@ -12083,7 +12112,7 @@
     BuiltInId::textureProj_Sampler2DRectShadow1_Float4,
     BuiltInName::textureProj,
     std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-    BuiltInParameters::p00n30B10D,
+    BuiltInParameters::p00n30B10B10B10D,
     2,
     StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 1, 1>(),
     EOpTextureProj,
@@ -12245,7 +12274,7 @@
     BuiltInId::textureLod_Sampler1D1_Float1_Float1,
     BuiltInName::textureLod,
     std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-    BuiltInParameters::p00g00B00B00D,
+    BuiltInParameters::p00g00B00B00B00D,
     3,
     StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 4, 1>(),
     EOpTextureLod,
@@ -12263,7 +12292,7 @@
     BuiltInId::textureLod_USampler1D1_Float1_Float1,
     BuiltInName::textureLod,
     std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-    BuiltInParameters::p00t00B00B00D,
+    BuiltInParameters::p00t00B00B00B00D,
     3,
     StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 4, 1>(),
     EOpTextureLod,
@@ -12620,7 +12649,7 @@
 constexpr const TFunction textureSize_00O(BuiltInId::textureSize_Sampler2DRect1,
                                           BuiltInName::textureSize,
                                           std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                          BuiltInParameters::p00O20B10D,
+                                          BuiltInParameters::p00O10B10B10B10D,
                                           1,
                                           StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 2, 1>(),
                                           EOpTextureSize,
@@ -12636,7 +12665,7 @@
 constexpr const TFunction textureSize_00v(BuiltInId::textureSize_USampler2DRect1,
                                           BuiltInName::textureSize,
                                           std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                          BuiltInParameters::p00v30B10B10B10D,
+                                          BuiltInParameters::p00v10B10B10B10D,
                                           1,
                                           StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 2, 1>(),
                                           EOpTextureSize,
@@ -12644,7 +12673,7 @@
 constexpr const TFunction textureSize_00n(BuiltInId::textureSize_Sampler2DRectShadow1,
                                           BuiltInName::textureSize,
                                           std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                          BuiltInParameters::p00n20B10B10B10D,
+                                          BuiltInParameters::p00n10B00B10Dx4,
                                           1,
                                           StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 2, 1>(),
                                           EOpTextureSize,
@@ -12977,7 +13006,7 @@
     BuiltInId::textureProjLod_Sampler1D1_Float4_Float1,
     BuiltInName::textureProjLod,
     std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-    BuiltInParameters::p00g30B00B00D,
+    BuiltInParameters::p00g30B00B00B00D,
     3,
     StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 4, 1>(),
     EOpTextureProjLod,
@@ -12986,7 +13015,7 @@
     BuiltInId::textureProjLod_ISampler1D1_Float4_Float1,
     BuiltInName::textureProjLod,
     std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-    BuiltInParameters::p00o30B00B00D,
+    BuiltInParameters::p00o30B00B00B00D,
     3,
     StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 4, 1>(),
     EOpTextureProjLod,
@@ -12995,7 +13024,7 @@
     BuiltInId::textureProjLod_USampler1D1_Float4_Float1,
     BuiltInName::textureProjLod,
     std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-    BuiltInParameters::p00t30B00B00D,
+    BuiltInParameters::p00t30B00B00B00D,
     3,
     StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 4, 1>(),
     EOpTextureProjLod,
@@ -13004,7 +13033,7 @@
     BuiltInId::textureProjLod_Sampler1DShadow1_Float4_Float1,
     BuiltInName::textureProjLod,
     std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-    BuiltInParameters::p00m30B00B00D,
+    BuiltInParameters::p00m30B00B00B00D,
     3,
     StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 1, 1>(),
     EOpTextureProjLod,
@@ -13871,7 +13900,7 @@
     BuiltInId::textureQueryLevels_Sampler1D1,
     BuiltInName::textureQueryLevels,
     std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-    BuiltInParameters::p00g10B00D00B,
+    BuiltInParameters::p00g00B00B00B00D,
     1,
     StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 1, 1>(),
     EOpTextureQueryLevels,
@@ -13889,7 +13918,7 @@
     BuiltInId::textureQueryLevels_USampler1D1,
     BuiltInName::textureQueryLevels,
     std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-    BuiltInParameters::p00t30B00B00D,
+    BuiltInParameters::p00t00B00B00B00D,
     1,
     StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 1, 1>(),
     EOpTextureQueryLevels,
@@ -13898,7 +13927,7 @@
     BuiltInId::textureQueryLevels_Sampler2D1,
     BuiltInName::textureQueryLevels,
     std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-    BuiltInParameters::p00I10B10Dx400D,
+    BuiltInParameters::p00I00B00B00B,
     1,
     StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 1, 1>(),
     EOpTextureQueryLevels,
@@ -13907,7 +13936,7 @@
     BuiltInId::textureQueryLevels_ISampler2D1,
     BuiltInName::textureQueryLevels,
     std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-    BuiltInParameters::p00R30B10B10B10D,
+    BuiltInParameters::p00R00B00B00B,
     1,
     StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 1, 1>(),
     EOpTextureQueryLevels,
@@ -13916,7 +13945,7 @@
     BuiltInId::textureQueryLevels_USampler2D1,
     BuiltInName::textureQueryLevels,
     std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-    BuiltInParameters::p00X10B00B10D,
+    BuiltInParameters::p00X00B00B00B,
     1,
     StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 1, 1>(),
     EOpTextureQueryLevels,
@@ -13925,7 +13954,7 @@
     BuiltInId::textureQueryLevels_Sampler3D1,
     BuiltInName::textureQueryLevels,
     std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-    BuiltInParameters::p00J20B20D00B,
+    BuiltInParameters::p00J00D,
     1,
     StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 1, 1>(),
     EOpTextureQueryLevels,
@@ -13934,7 +13963,7 @@
     BuiltInId::textureQueryLevels_ISampler3D1,
     BuiltInName::textureQueryLevels,
     std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-    BuiltInParameters::p00S30B20B20B20D,
+    BuiltInParameters::p00S00D,
     1,
     StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 1, 1>(),
     EOpTextureQueryLevels,
@@ -13943,7 +13972,7 @@
     BuiltInId::textureQueryLevels_USampler3D1,
     BuiltInName::textureQueryLevels,
     std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-    BuiltInParameters::p00Y20B20B20B20D,
+    BuiltInParameters::p00Y00D,
     1,
     StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 1, 1>(),
     EOpTextureQueryLevels,
@@ -13952,7 +13981,7 @@
     BuiltInId::textureQueryLevels_SamplerCube1,
     BuiltInName::textureQueryLevels,
     std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-    BuiltInParameters::p00K20B00B,
+    BuiltInParameters::p00K00D,
     1,
     StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 1, 1>(),
     EOpTextureQueryLevels,
@@ -13979,7 +14008,7 @@
     BuiltInId::textureQueryLevels_Sampler1DArray1,
     BuiltInName::textureQueryLevels,
     std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-    BuiltInParameters::p00h00D,
+    BuiltInParameters::p00h00B,
     1,
     StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 1, 1>(),
     EOpTextureQueryLevels,
@@ -13988,7 +14017,7 @@
     BuiltInId::textureQueryLevels_ISampler1DArray1,
     BuiltInName::textureQueryLevels,
     std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-    BuiltInParameters::p00p10B00B00B00D,
+    BuiltInParameters::p00p00B,
     1,
     StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 1, 1>(),
     EOpTextureQueryLevels,
@@ -13997,7 +14026,7 @@
     BuiltInId::textureQueryLevels_USampler1DArray1,
     BuiltInName::textureQueryLevels,
     std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-    BuiltInParameters::p00u10B00B00B00D,
+    BuiltInParameters::p00u00B,
     1,
     StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 1, 1>(),
     EOpTextureQueryLevels,
@@ -14006,7 +14035,7 @@
     BuiltInId::textureQueryLevels_Sampler2DArray1,
     BuiltInName::textureQueryLevels,
     std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-    BuiltInParameters::p00L10B,
+    BuiltInParameters::p00L00D,
     1,
     StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 1, 1>(),
     EOpTextureQueryLevels,
@@ -14015,7 +14044,7 @@
     BuiltInId::textureQueryLevels_ISampler2DArray1,
     BuiltInName::textureQueryLevels,
     std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-    BuiltInParameters::p00U20D00D10D,
+    BuiltInParameters::p00U00D,
     1,
     StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 1, 1>(),
     EOpTextureQueryLevels,
@@ -14033,7 +14062,7 @@
     BuiltInId::textureQueryLevels_SamplerCubeArray1,
     BuiltInName::textureQueryLevels,
     std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-    BuiltInParameters::p00k30B20B20B,
+    BuiltInParameters::p00k00D,
     1,
     StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 1, 1>(),
     EOpTextureQueryLevels,
@@ -14042,7 +14071,7 @@
     BuiltInId::textureQueryLevels_ISamplerCubeArray1,
     BuiltInName::textureQueryLevels,
     std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-    BuiltInParameters::p00s30B00B,
+    BuiltInParameters::p00s00D,
     1,
     StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 1, 1>(),
     EOpTextureQueryLevels,
@@ -14060,7 +14089,7 @@
     BuiltInId::textureQueryLevels_Sampler1DShadow1,
     BuiltInName::textureQueryLevels,
     std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-    BuiltInParameters::p00m20B00D00B,
+    BuiltInParameters::p00m00B,
     1,
     StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 1, 1>(),
     EOpTextureQueryLevels,
@@ -14069,7 +14098,7 @@
     BuiltInId::textureQueryLevels_Sampler2DShadow1,
     BuiltInName::textureQueryLevels,
     std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-    BuiltInParameters::p00d20B00B10D,
+    BuiltInParameters::p00d00D,
     1,
     StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 1, 1>(),
     EOpTextureQueryLevels,
@@ -14078,7 +14107,7 @@
     BuiltInId::textureQueryLevels_SamplerCubeShadow1,
     BuiltInName::textureQueryLevels,
     std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-    BuiltInParameters::p00e30B20B20B,
+    BuiltInParameters::p00e00D,
     1,
     StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 1, 1>(),
     EOpTextureQueryLevels,
@@ -14087,7 +14116,7 @@
     BuiltInId::textureQueryLevels_Sampler1DArrayShadow1,
     BuiltInName::textureQueryLevels,
     std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-    BuiltInParameters::p00i20B00B00B00D,
+    BuiltInParameters::p00i00B,
     1,
     StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 1, 1>(),
     EOpTextureQueryLevels,
@@ -14096,7 +14125,7 @@
     BuiltInId::textureQueryLevels_Sampler2DArrayShadow1,
     BuiltInName::textureQueryLevels,
     std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-    BuiltInParameters::p00f30B10B10B10D,
+    BuiltInParameters::p00f00D,
     1,
     StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 1, 1>(),
     EOpTextureQueryLevels,
@@ -14105,7 +14134,7 @@
     BuiltInId::textureQueryLevels_SamplerCubeArrayShadow1,
     BuiltInName::textureQueryLevels,
     std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-    BuiltInParameters::p00l20B,
+    BuiltInParameters::p00l00D,
     1,
     StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 1, 1>(),
     EOpTextureQueryLevels,
@@ -14384,7 +14413,7 @@
     BuiltInId::texture_Sampler1D1_Float1_Float1,
     BuiltInName::texture,
     std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-    BuiltInParameters::p00g00B00B00D,
+    BuiltInParameters::p00g00B00B00B00D,
     3,
     StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 4, 1>(),
     EOpTextureBias,
@@ -14402,7 +14431,7 @@
     BuiltInId::texture_USampler1D1_Float1_Float1,
     BuiltInName::texture,
     std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-    BuiltInParameters::p00t00B00B00D,
+    BuiltInParameters::p00t00B00B00B00D,
     3,
     StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 4, 1>(),
     EOpTextureBias,
@@ -14492,7 +14521,7 @@
     BuiltInId::textureProj_Sampler1D1_Float4_Float1,
     BuiltInName::textureProj,
     std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-    BuiltInParameters::p00g30B00B00D,
+    BuiltInParameters::p00g30B00B00B00D,
     3,
     StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 4, 1>(),
     EOpTextureProjBias,
@@ -14501,7 +14530,7 @@
     BuiltInId::textureProj_ISampler1D1_Float4_Float1,
     BuiltInName::textureProj,
     std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-    BuiltInParameters::p00o30B00B00D,
+    BuiltInParameters::p00o30B00B00B00D,
     3,
     StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 4, 1>(),
     EOpTextureProjBias,
@@ -14510,7 +14539,7 @@
     BuiltInId::textureProj_USampler1D1_Float4_Float1,
     BuiltInName::textureProj,
     std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-    BuiltInParameters::p00t30B00B00D,
+    BuiltInParameters::p00t30B00B00B00D,
     3,
     StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 4, 1>(),
     EOpTextureProjBias,
@@ -14519,7 +14548,7 @@
     BuiltInId::textureProj_Sampler1DShadow1_Float4_Float1,
     BuiltInName::textureProj,
     std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-    BuiltInParameters::p00m30B00B00D,
+    BuiltInParameters::p00m30B00B00B00D,
     3,
     StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 1, 1>(),
     EOpTextureProjBias,
@@ -14639,7 +14668,7 @@
     BuiltInId::textureQueryLod_Sampler1D1_Float1,
     BuiltInName::textureQueryLod,
     std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-    BuiltInParameters::p00g00B00D00B,
+    BuiltInParameters::p00g00B00B00B00D,
     2,
     StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 2, 1>(),
     EOpTextureQueryLod,
@@ -14657,7 +14686,7 @@
     BuiltInId::textureQueryLod_USampler1D1_Float1,
     BuiltInName::textureQueryLod,
     std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-    BuiltInParameters::p00t00B00B00D,
+    BuiltInParameters::p00t00B00B00B00D,
     2,
     StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 2, 1>(),
     EOpTextureQueryLod,
@@ -14666,7 +14695,7 @@
     BuiltInId::textureQueryLod_Sampler2D1_Float2,
     BuiltInName::textureQueryLod,
     std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-    BuiltInParameters::p00I10B10Dx400D,
+    BuiltInParameters::p00I10B00B10D,
     2,
     StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 2, 1>(),
     EOpTextureQueryLod,
@@ -14675,7 +14704,7 @@
     BuiltInId::textureQueryLod_ISampler2D1_Float2,
     BuiltInName::textureQueryLod,
     std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-    BuiltInParameters::p00R10B10D00D,
+    BuiltInParameters::p00R10B00B10D,
     2,
     StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 2, 1>(),
     EOpTextureQueryLod,
@@ -14693,7 +14722,7 @@
     BuiltInId::textureQueryLod_Sampler3D1_Float3,
     BuiltInName::textureQueryLod,
     std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-    BuiltInParameters::p00J20B20D00B,
+    BuiltInParameters::p00J20B00B20D,
     2,
     StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 2, 1>(),
     EOpTextureQueryLod,
@@ -14702,7 +14731,7 @@
     BuiltInId::textureQueryLod_ISampler3D1_Float3,
     BuiltInName::textureQueryLod,
     std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-    BuiltInParameters::p00S20B20B20B20D,
+    BuiltInParameters::p00S20B00B20D,
     2,
     StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 2, 1>(),
     EOpTextureQueryLod,
@@ -14711,7 +14740,7 @@
     BuiltInId::textureQueryLod_USampler3D1_Float3,
     BuiltInName::textureQueryLod,
     std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-    BuiltInParameters::p00Y20B20B20B20D,
+    BuiltInParameters::p00Y20B00B20D,
     2,
     StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 2, 1>(),
     EOpTextureQueryLod,
@@ -14729,7 +14758,7 @@
     BuiltInId::textureQueryLod_ISamplerCube1_Float3,
     BuiltInName::textureQueryLod,
     std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-    BuiltInParameters::p00T20B20B20B,
+    BuiltInParameters::p00T20B00B,
     2,
     StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 2, 1>(),
     EOpTextureQueryLod,
@@ -14882,7 +14911,7 @@
     BuiltInId::textureOffset_Sampler2D1_Float2_Int2,
     BuiltInName::textureOffset,
     std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-    BuiltInParameters::p00I10B10Dx400D,
+    BuiltInParameters::p00I10B10D00B,
     3,
     StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 4, 1>(),
     EOpTextureOffset,
@@ -14891,7 +14920,7 @@
     BuiltInId::textureOffset_ISampler2D1_Float2_Int2,
     BuiltInName::textureOffset,
     std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-    BuiltInParameters::p00R10B10D00D,
+    BuiltInParameters::p00R10B10D00B,
     3,
     StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 4, 1>(),
     EOpTextureOffset,
@@ -14900,7 +14929,7 @@
     BuiltInId::textureOffset_USampler2D1_Float2_Int2,
     BuiltInName::textureOffset,
     std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-    BuiltInParameters::p00X10B10D00D,
+    BuiltInParameters::p00X10B10D00B,
     3,
     StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 4, 1>(),
     EOpTextureOffset,
@@ -14945,7 +14974,7 @@
     BuiltInId::textureOffset_Sampler2DArray1_Float3_Int2,
     BuiltInName::textureOffset,
     std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-    BuiltInParameters::p00L20B10D00D,
+    BuiltInParameters::p00L20B10D00B,
     3,
     StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 4, 1>(),
     EOpTextureOffset,
@@ -14954,7 +14983,7 @@
     BuiltInId::textureOffset_ISampler2DArray1_Float3_Int2,
     BuiltInName::textureOffset,
     std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-    BuiltInParameters::p00U20B10Dx400D,
+    BuiltInParameters::p00U20B10D00B,
     3,
     StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 4, 1>(),
     EOpTextureOffset,
@@ -14999,7 +15028,7 @@
     BuiltInId::textureOffset_Sampler2DRect1_Float2_Int2,
     BuiltInName::textureOffset,
     std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-    BuiltInParameters::p00O10B10Dx400D,
+    BuiltInParameters::p00O10B10D00D,
     3,
     StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 4, 1>(),
     EOpTextureOffset,
@@ -16520,7 +16549,7 @@
     BuiltInId::textureGather_Sampler2D1_Float2,
     BuiltInName::textureGather,
     std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-    BuiltInParameters::p00I10B10Dx400D,
+    BuiltInParameters::p00I10B00B10D,
     2,
     StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 4, 1>(),
     EOpTextureGather,
@@ -16529,7 +16558,7 @@
     BuiltInId::textureGather_ISampler2D1_Float2,
     BuiltInName::textureGather,
     std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-    BuiltInParameters::p00R10B10D00D,
+    BuiltInParameters::p00R10B00B10D,
     2,
     StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 4, 1>(),
     EOpTextureGather,
@@ -16583,7 +16612,7 @@
     BuiltInId::textureGather_ISampler2DArray1_Float3,
     BuiltInName::textureGather,
     std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-    BuiltInParameters::p00U20B10B10B10D,
+    BuiltInParameters::p00U20B00B10D,
     2,
     StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 4, 1>(),
     EOpTextureGather,
@@ -16592,7 +16621,7 @@
     BuiltInId::textureGather_USampler2DArray1_Float3,
     BuiltInName::textureGather,
     std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-    BuiltInParameters::p00a20B10B10B10D,
+    BuiltInParameters::p00a20B00B10D,
     2,
     StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 4, 1>(),
     EOpTextureGather,
@@ -16637,7 +16666,7 @@
     BuiltInId::textureGather_ISamplerCube1_Float3,
     BuiltInName::textureGather,
     std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-    BuiltInParameters::p00T20B20B20B,
+    BuiltInParameters::p00T20B00B,
     2,
     StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 4, 1>(),
     EOpTextureGather,
@@ -16682,7 +16711,7 @@
     BuiltInId::textureGather_SamplerCubeArray1_Float4,
     BuiltInName::textureGather,
     std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-    BuiltInParameters::p00k30B20B20B,
+    BuiltInParameters::p00k30B00B,
     2,
     StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 4, 1>(),
     EOpTextureGather,
@@ -16700,7 +16729,7 @@
     BuiltInId::textureGather_USamplerCubeArray1_Float4,
     BuiltInName::textureGather,
     std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-    BuiltInParameters::p00x30B00D,
+    BuiltInParameters::p00x30B00B,
     2,
     StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 4, 1>(),
     EOpTextureGather,
@@ -16746,7 +16775,7 @@
     BuiltInName::textureGatherExt,
     std::array<TExtension, 2u>{
         {TExtension::OES_texture_cube_map_array, TExtension::EXT_texture_cube_map_array}},
-    BuiltInParameters::p00k30B20B20B,
+    BuiltInParameters::p00k30B00B,
     2,
     StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 4, 1>(),
     EOpTextureGather,
@@ -16766,7 +16795,7 @@
     BuiltInName::textureGatherExt,
     std::array<TExtension, 2u>{
         {TExtension::OES_texture_cube_map_array, TExtension::EXT_texture_cube_map_array}},
-    BuiltInParameters::p00x30B00D,
+    BuiltInParameters::p00x30B00B,
     2,
     StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 4, 1>(),
     EOpTextureGather,
@@ -16815,7 +16844,7 @@
     BuiltInId::textureGather_Sampler2DRect1_Float3,
     BuiltInName::textureGather,
     std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-    BuiltInParameters::p00O20B10D,
+    BuiltInParameters::p00O20B00D,
     2,
     StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 4, 1>(),
     EOpTextureGather,
@@ -16824,7 +16853,7 @@
     BuiltInId::textureGather_ISampler2DRect1_Float3,
     BuiltInName::textureGather,
     std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-    BuiltInParameters::p00q20B10B10B10D,
+    BuiltInParameters::p00q20B00D,
     2,
     StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 4, 1>(),
     EOpTextureGather,
@@ -16932,7 +16961,7 @@
     BuiltInId::textureGatherOffset_Sampler2D1_Float2_Int2,
     BuiltInName::textureGatherOffset,
     std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-    BuiltInParameters::p00I10B10Dx400D,
+    BuiltInParameters::p00I10B10D00B,
     3,
     StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 4, 1>(),
     EOpTextureGatherOffset,
@@ -16941,7 +16970,7 @@
     BuiltInId::textureGatherOffset_ISampler2D1_Float2_Int2,
     BuiltInName::textureGatherOffset,
     std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-    BuiltInParameters::p00R10B10D00D,
+    BuiltInParameters::p00R10B10D00B,
     3,
     StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 4, 1>(),
     EOpTextureGatherOffset,
@@ -16950,7 +16979,7 @@
     BuiltInId::textureGatherOffset_USampler2D1_Float2_Int2,
     BuiltInName::textureGatherOffset,
     std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-    BuiltInParameters::p00X10B10D00D,
+    BuiltInParameters::p00X10B10D00B,
     3,
     StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 4, 1>(),
     EOpTextureGatherOffset,
@@ -16959,7 +16988,7 @@
     BuiltInId::textureGatherOffset_Sampler2DArray1_Float3_Int2,
     BuiltInName::textureGatherOffset,
     std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-    BuiltInParameters::p00L20B10D00D,
+    BuiltInParameters::p00L20B10D00B,
     3,
     StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 4, 1>(),
     EOpTextureGatherOffset,
@@ -16968,7 +16997,7 @@
     BuiltInId::textureGatherOffset_ISampler2DArray1_Float3_Int2,
     BuiltInName::textureGatherOffset,
     std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-    BuiltInParameters::p00U20B10Dx400D,
+    BuiltInParameters::p00U20B10D00B,
     3,
     StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 4, 1>(),
     EOpTextureGatherOffset,
@@ -17004,7 +17033,7 @@
     BuiltInId::textureGatherOffset_Sampler2DRect1_Float2_Int2,
     BuiltInName::textureGatherOffset,
     std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-    BuiltInParameters::p00O10B10Dx400D,
+    BuiltInParameters::p00O10B10D00D,
     3,
     StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 4, 1>(),
     EOpTextureGatherOffset,
@@ -17454,7 +17483,7 @@
                                       BuiltInName::dFdxExt,
                                       std::array<TExtension, 1u>{
                                           {TExtension::OES_standard_derivatives}},
-                                      BuiltInParameters::p00B30B,
+                                      BuiltInParameters::p00B00B00B,
                                       1,
                                       StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 1, 1>(),
                                       EOpDFdx,
@@ -17463,7 +17492,7 @@
                                       BuiltInName::dFdxExt,
                                       std::array<TExtension, 1u>{
                                           {TExtension::OES_standard_derivatives}},
-                                      BuiltInParameters::p10B00D,
+                                      BuiltInParameters::p10B00B00B,
                                       1,
                                       StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 2, 1>(),
                                       EOpDFdx,
@@ -17472,7 +17501,7 @@
                                       BuiltInName::dFdxExt,
                                       std::array<TExtension, 1u>{
                                           {TExtension::OES_standard_derivatives}},
-                                      BuiltInParameters::p20B20B00B,
+                                      BuiltInParameters::p20B00B00B,
                                       1,
                                       StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 3, 1>(),
                                       EOpDFdx,
@@ -17481,7 +17510,7 @@
                                       BuiltInName::dFdxExt,
                                       std::array<TExtension, 1u>{
                                           {TExtension::OES_standard_derivatives}},
-                                      BuiltInParameters::p30B10B,
+                                      BuiltInParameters::p30B00B00B,
                                       1,
                                       StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 4, 1>(),
                                       EOpDFdx,
@@ -17490,7 +17519,7 @@
                                       BuiltInName::dFdyExt,
                                       std::array<TExtension, 1u>{
                                           {TExtension::OES_standard_derivatives}},
-                                      BuiltInParameters::p00B30B,
+                                      BuiltInParameters::p00B00B00B,
                                       1,
                                       StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 1, 1>(),
                                       EOpDFdy,
@@ -17499,7 +17528,7 @@
                                       BuiltInName::dFdyExt,
                                       std::array<TExtension, 1u>{
                                           {TExtension::OES_standard_derivatives}},
-                                      BuiltInParameters::p10B00D,
+                                      BuiltInParameters::p10B00B00B,
                                       1,
                                       StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 2, 1>(),
                                       EOpDFdy,
@@ -17508,7 +17537,7 @@
                                       BuiltInName::dFdyExt,
                                       std::array<TExtension, 1u>{
                                           {TExtension::OES_standard_derivatives}},
-                                      BuiltInParameters::p20B20B00B,
+                                      BuiltInParameters::p20B00B00B,
                                       1,
                                       StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 3, 1>(),
                                       EOpDFdy,
@@ -17517,7 +17546,7 @@
                                       BuiltInName::dFdyExt,
                                       std::array<TExtension, 1u>{
                                           {TExtension::OES_standard_derivatives}},
-                                      BuiltInParameters::p30B10B,
+                                      BuiltInParameters::p30B00B00B,
                                       1,
                                       StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 4, 1>(),
                                       EOpDFdy,
@@ -17526,7 +17555,7 @@
                                         BuiltInName::fwidthExt,
                                         std::array<TExtension, 1u>{
                                             {TExtension::OES_standard_derivatives}},
-                                        BuiltInParameters::p00B30B,
+                                        BuiltInParameters::p00B00B00B,
                                         1,
                                         StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 1, 1>(),
                                         EOpFwidth,
@@ -17535,7 +17564,7 @@
                                         BuiltInName::fwidthExt,
                                         std::array<TExtension, 1u>{
                                             {TExtension::OES_standard_derivatives}},
-                                        BuiltInParameters::p10B00D,
+                                        BuiltInParameters::p10B00B00B,
                                         1,
                                         StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 2, 1>(),
                                         EOpFwidth,
@@ -17544,7 +17573,7 @@
                                         BuiltInName::fwidthExt,
                                         std::array<TExtension, 1u>{
                                             {TExtension::OES_standard_derivatives}},
-                                        BuiltInParameters::p20B20B00B,
+                                        BuiltInParameters::p20B00B00B,
                                         1,
                                         StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 3, 1>(),
                                         EOpFwidth,
@@ -17553,7 +17582,7 @@
                                         BuiltInName::fwidthExt,
                                         std::array<TExtension, 1u>{
                                             {TExtension::OES_standard_derivatives}},
-                                        BuiltInParameters::p30B10B,
+                                        BuiltInParameters::p30B00B00B,
                                         1,
                                         StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 4, 1>(),
                                         EOpFwidth,
@@ -17561,7 +17590,7 @@
 constexpr const TFunction dFdx_00B(BuiltInId::dFdx_Float1,
                                    BuiltInName::dFdx,
                                    std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                   BuiltInParameters::p00B30B,
+                                   BuiltInParameters::p00B00B00B,
                                    1,
                                    StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 1, 1>(),
                                    EOpDFdx,
@@ -17569,7 +17598,7 @@
 constexpr const TFunction dFdx_10B(BuiltInId::dFdx_Float2,
                                    BuiltInName::dFdx,
                                    std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                   BuiltInParameters::p10B00D,
+                                   BuiltInParameters::p10B00B00B,
                                    1,
                                    StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 2, 1>(),
                                    EOpDFdx,
@@ -17577,7 +17606,7 @@
 constexpr const TFunction dFdx_20B(BuiltInId::dFdx_Float3,
                                    BuiltInName::dFdx,
                                    std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                   BuiltInParameters::p20B20B00B,
+                                   BuiltInParameters::p20B00B00B,
                                    1,
                                    StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 3, 1>(),
                                    EOpDFdx,
@@ -17585,7 +17614,7 @@
 constexpr const TFunction dFdx_30B(BuiltInId::dFdx_Float4,
                                    BuiltInName::dFdx,
                                    std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                   BuiltInParameters::p30B10B,
+                                   BuiltInParameters::p30B00B00B,
                                    1,
                                    StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 4, 1>(),
                                    EOpDFdx,
@@ -17593,7 +17622,7 @@
 constexpr const TFunction dFdy_00B(BuiltInId::dFdy_Float1,
                                    BuiltInName::dFdy,
                                    std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                   BuiltInParameters::p00B30B,
+                                   BuiltInParameters::p00B00B00B,
                                    1,
                                    StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 1, 1>(),
                                    EOpDFdy,
@@ -17601,7 +17630,7 @@
 constexpr const TFunction dFdy_10B(BuiltInId::dFdy_Float2,
                                    BuiltInName::dFdy,
                                    std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                   BuiltInParameters::p10B00D,
+                                   BuiltInParameters::p10B00B00B,
                                    1,
                                    StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 2, 1>(),
                                    EOpDFdy,
@@ -17609,7 +17638,7 @@
 constexpr const TFunction dFdy_20B(BuiltInId::dFdy_Float3,
                                    BuiltInName::dFdy,
                                    std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                   BuiltInParameters::p20B20B00B,
+                                   BuiltInParameters::p20B00B00B,
                                    1,
                                    StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 3, 1>(),
                                    EOpDFdy,
@@ -17617,7 +17646,7 @@
 constexpr const TFunction dFdy_30B(BuiltInId::dFdy_Float4,
                                    BuiltInName::dFdy,
                                    std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                   BuiltInParameters::p30B10B,
+                                   BuiltInParameters::p30B00B00B,
                                    1,
                                    StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 4, 1>(),
                                    EOpDFdy,
@@ -17625,7 +17654,7 @@
 constexpr const TFunction fwidth_00B(BuiltInId::fwidth_Float1,
                                      BuiltInName::fwidth,
                                      std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                     BuiltInParameters::p00B30B,
+                                     BuiltInParameters::p00B00B00B,
                                      1,
                                      StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 1, 1>(),
                                      EOpFwidth,
@@ -17633,7 +17662,7 @@
 constexpr const TFunction fwidth_10B(BuiltInId::fwidth_Float2,
                                      BuiltInName::fwidth,
                                      std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                     BuiltInParameters::p10B00D,
+                                     BuiltInParameters::p10B00B00B,
                                      1,
                                      StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 2, 1>(),
                                      EOpFwidth,
@@ -17641,7 +17670,7 @@
 constexpr const TFunction fwidth_20B(BuiltInId::fwidth_Float3,
                                      BuiltInName::fwidth,
                                      std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                     BuiltInParameters::p20B20B00B,
+                                     BuiltInParameters::p20B00B00B,
                                      1,
                                      StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 3, 1>(),
                                      EOpFwidth,
@@ -17649,7 +17678,7 @@
 constexpr const TFunction fwidth_30B(BuiltInId::fwidth_Float4,
                                      BuiltInName::fwidth,
                                      std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                     BuiltInParameters::p30B10B,
+                                     BuiltInParameters::p30B00B00B,
                                      1,
                                      StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 4, 1>(),
                                      EOpFwidth,
@@ -17657,7 +17686,7 @@
 constexpr const TFunction dFdxFine_00B(BuiltInId::dFdxFine_Float1,
                                        BuiltInName::dFdxFine,
                                        std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                       BuiltInParameters::p00B30B,
+                                       BuiltInParameters::p00B00B00B,
                                        1,
                                        StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 1, 1>(),
                                        EOpDFdxFine,
@@ -17665,7 +17694,7 @@
 constexpr const TFunction dFdxFine_10B(BuiltInId::dFdxFine_Float2,
                                        BuiltInName::dFdxFine,
                                        std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                       BuiltInParameters::p10B00D,
+                                       BuiltInParameters::p10B00B00B,
                                        1,
                                        StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 2, 1>(),
                                        EOpDFdxFine,
@@ -17673,7 +17702,7 @@
 constexpr const TFunction dFdxFine_20B(BuiltInId::dFdxFine_Float3,
                                        BuiltInName::dFdxFine,
                                        std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                       BuiltInParameters::p20B20B00B,
+                                       BuiltInParameters::p20B00B00B,
                                        1,
                                        StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 3, 1>(),
                                        EOpDFdxFine,
@@ -17681,7 +17710,7 @@
 constexpr const TFunction dFdxFine_30B(BuiltInId::dFdxFine_Float4,
                                        BuiltInName::dFdxFine,
                                        std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                       BuiltInParameters::p30B10B,
+                                       BuiltInParameters::p30B00B00B,
                                        1,
                                        StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 4, 1>(),
                                        EOpDFdxFine,
@@ -17689,7 +17718,7 @@
 constexpr const TFunction dFdyFine_00B(BuiltInId::dFdyFine_Float1,
                                        BuiltInName::dFdyFine,
                                        std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                       BuiltInParameters::p00B30B,
+                                       BuiltInParameters::p00B00B00B,
                                        1,
                                        StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 1, 1>(),
                                        EOpDFdyFine,
@@ -17697,7 +17726,7 @@
 constexpr const TFunction dFdyFine_10B(BuiltInId::dFdyFine_Float2,
                                        BuiltInName::dFdyFine,
                                        std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                       BuiltInParameters::p10B00D,
+                                       BuiltInParameters::p10B00B00B,
                                        1,
                                        StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 2, 1>(),
                                        EOpDFdyFine,
@@ -17705,7 +17734,7 @@
 constexpr const TFunction dFdyFine_20B(BuiltInId::dFdyFine_Float3,
                                        BuiltInName::dFdyFine,
                                        std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                       BuiltInParameters::p20B20B00B,
+                                       BuiltInParameters::p20B00B00B,
                                        1,
                                        StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 3, 1>(),
                                        EOpDFdyFine,
@@ -17713,7 +17742,7 @@
 constexpr const TFunction dFdyFine_30B(BuiltInId::dFdyFine_Float4,
                                        BuiltInName::dFdyFine,
                                        std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                       BuiltInParameters::p30B10B,
+                                       BuiltInParameters::p30B00B00B,
                                        1,
                                        StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 4, 1>(),
                                        EOpDFdyFine,
@@ -17721,7 +17750,7 @@
 constexpr const TFunction dFdxCoarse_00B(BuiltInId::dFdxCoarse_Float1,
                                          BuiltInName::dFdxCoarse,
                                          std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                         BuiltInParameters::p00B30B,
+                                         BuiltInParameters::p00B00B00B,
                                          1,
                                          StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 1, 1>(),
                                          EOpDFdxCoarse,
@@ -17729,7 +17758,7 @@
 constexpr const TFunction dFdxCoarse_10B(BuiltInId::dFdxCoarse_Float2,
                                          BuiltInName::dFdxCoarse,
                                          std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                         BuiltInParameters::p10B00D,
+                                         BuiltInParameters::p10B00B00B,
                                          1,
                                          StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 2, 1>(),
                                          EOpDFdxCoarse,
@@ -17737,7 +17766,7 @@
 constexpr const TFunction dFdxCoarse_20B(BuiltInId::dFdxCoarse_Float3,
                                          BuiltInName::dFdxCoarse,
                                          std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                         BuiltInParameters::p20B20B00B,
+                                         BuiltInParameters::p20B00B00B,
                                          1,
                                          StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 3, 1>(),
                                          EOpDFdxCoarse,
@@ -17745,7 +17774,7 @@
 constexpr const TFunction dFdxCoarse_30B(BuiltInId::dFdxCoarse_Float4,
                                          BuiltInName::dFdxCoarse,
                                          std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                         BuiltInParameters::p30B10B,
+                                         BuiltInParameters::p30B00B00B,
                                          1,
                                          StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 4, 1>(),
                                          EOpDFdxCoarse,
@@ -17753,7 +17782,7 @@
 constexpr const TFunction dFdyCoarse_00B(BuiltInId::dFdyCoarse_Float1,
                                          BuiltInName::dFdyCoarse,
                                          std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                         BuiltInParameters::p00B30B,
+                                         BuiltInParameters::p00B00B00B,
                                          1,
                                          StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 1, 1>(),
                                          EOpDFdyCoarse,
@@ -17761,7 +17790,7 @@
 constexpr const TFunction dFdyCoarse_10B(BuiltInId::dFdyCoarse_Float2,
                                          BuiltInName::dFdyCoarse,
                                          std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                         BuiltInParameters::p10B00D,
+                                         BuiltInParameters::p10B00B00B,
                                          1,
                                          StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 2, 1>(),
                                          EOpDFdyCoarse,
@@ -17769,7 +17798,7 @@
 constexpr const TFunction dFdyCoarse_20B(BuiltInId::dFdyCoarse_Float3,
                                          BuiltInName::dFdyCoarse,
                                          std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                         BuiltInParameters::p20B20B00B,
+                                         BuiltInParameters::p20B00B00B,
                                          1,
                                          StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 3, 1>(),
                                          EOpDFdyCoarse,
@@ -17777,7 +17806,7 @@
 constexpr const TFunction dFdyCoarse_30B(BuiltInId::dFdyCoarse_Float4,
                                          BuiltInName::dFdyCoarse,
                                          std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                         BuiltInParameters::p30B10B,
+                                         BuiltInParameters::p30B00B00B,
                                          1,
                                          StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 4, 1>(),
                                          EOpDFdyCoarse,
@@ -17785,7 +17814,7 @@
 constexpr const TFunction fwidthFine_00B(BuiltInId::fwidthFine_Float1,
                                          BuiltInName::fwidthFine,
                                          std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                         BuiltInParameters::p00B30B,
+                                         BuiltInParameters::p00B00B00B,
                                          1,
                                          StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 1, 1>(),
                                          EOpFwidthFine,
@@ -17793,7 +17822,7 @@
 constexpr const TFunction fwidthFine_10B(BuiltInId::fwidthFine_Float2,
                                          BuiltInName::fwidthFine,
                                          std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                         BuiltInParameters::p10B00D,
+                                         BuiltInParameters::p10B00B00B,
                                          1,
                                          StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 2, 1>(),
                                          EOpFwidthFine,
@@ -17801,7 +17830,7 @@
 constexpr const TFunction fwidthFine_20B(BuiltInId::fwidthFine_Float3,
                                          BuiltInName::fwidthFine,
                                          std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                         BuiltInParameters::p20B20B00B,
+                                         BuiltInParameters::p20B00B00B,
                                          1,
                                          StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 3, 1>(),
                                          EOpFwidthFine,
@@ -17809,7 +17838,7 @@
 constexpr const TFunction fwidthFine_30B(BuiltInId::fwidthFine_Float4,
                                          BuiltInName::fwidthFine,
                                          std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                         BuiltInParameters::p30B10B,
+                                         BuiltInParameters::p30B00B00B,
                                          1,
                                          StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 4, 1>(),
                                          EOpFwidthFine,
@@ -17818,7 +17847,7 @@
     BuiltInId::fwidthCoarse_Float1,
     BuiltInName::fwidthCoarse,
     std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-    BuiltInParameters::p00B30B,
+    BuiltInParameters::p00B00B00B,
     1,
     StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 1, 1>(),
     EOpFwidthCoarse,
@@ -17827,7 +17856,7 @@
     BuiltInId::fwidthCoarse_Float2,
     BuiltInName::fwidthCoarse,
     std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-    BuiltInParameters::p10B00D,
+    BuiltInParameters::p10B00B00B,
     1,
     StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 2, 1>(),
     EOpFwidthCoarse,
@@ -17836,7 +17865,7 @@
     BuiltInId::fwidthCoarse_Float3,
     BuiltInName::fwidthCoarse,
     std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-    BuiltInParameters::p20B20B00B,
+    BuiltInParameters::p20B00B00B,
     1,
     StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 3, 1>(),
     EOpFwidthCoarse,
@@ -17845,7 +17874,7 @@
     BuiltInId::fwidthCoarse_Float4,
     BuiltInName::fwidthCoarse,
     std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-    BuiltInParameters::p30B10B,
+    BuiltInParameters::p30B00B00B,
     1,
     StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 4, 1>(),
     EOpFwidthCoarse,
@@ -17854,7 +17883,7 @@
     BuiltInId::interpolateAtCentroid_Float1,
     BuiltInName::interpolateAtCentroid,
     std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-    BuiltInParameters::p00B30B,
+    BuiltInParameters::p00B00B00B,
     1,
     StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 1, 1>(),
     EOpInterpolateAtCentroid,
@@ -17863,7 +17892,7 @@
     BuiltInId::interpolateAtCentroid_Float2,
     BuiltInName::interpolateAtCentroid,
     std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-    BuiltInParameters::p10B00D,
+    BuiltInParameters::p10B00B00B,
     1,
     StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 2, 1>(),
     EOpInterpolateAtCentroid,
@@ -17872,7 +17901,7 @@
     BuiltInId::interpolateAtCentroid_Float3,
     BuiltInName::interpolateAtCentroid,
     std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-    BuiltInParameters::p20B20B00B,
+    BuiltInParameters::p20B00B00B,
     1,
     StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 3, 1>(),
     EOpInterpolateAtCentroid,
@@ -17881,7 +17910,7 @@
     BuiltInId::interpolateAtCentroid_Float4,
     BuiltInName::interpolateAtCentroid,
     std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-    BuiltInParameters::p30B10B,
+    BuiltInParameters::p30B00B00B,
     1,
     StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 4, 1>(),
     EOpInterpolateAtCentroid,
@@ -17962,7 +17991,7 @@
     BuiltInId::interpolateAtCentroidExt_Float1,
     BuiltInName::interpolateAtCentroidExt,
     std::array<TExtension, 1u>{{TExtension::OES_shader_multisample_interpolation}},
-    BuiltInParameters::p00B30B,
+    BuiltInParameters::p00B00B00B,
     1,
     StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 1, 1>(),
     EOpInterpolateAtCentroid,
@@ -17971,7 +18000,7 @@
     BuiltInId::interpolateAtCentroidExt_Float2,
     BuiltInName::interpolateAtCentroidExt,
     std::array<TExtension, 1u>{{TExtension::OES_shader_multisample_interpolation}},
-    BuiltInParameters::p10B00D,
+    BuiltInParameters::p10B00B00B,
     1,
     StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 2, 1>(),
     EOpInterpolateAtCentroid,
@@ -17980,7 +18009,7 @@
     BuiltInId::interpolateAtCentroidExt_Float3,
     BuiltInName::interpolateAtCentroidExt,
     std::array<TExtension, 1u>{{TExtension::OES_shader_multisample_interpolation}},
-    BuiltInParameters::p20B20B00B,
+    BuiltInParameters::p20B00B00B,
     1,
     StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 3, 1>(),
     EOpInterpolateAtCentroid,
@@ -17989,7 +18018,7 @@
     BuiltInId::interpolateAtCentroidExt_Float4,
     BuiltInName::interpolateAtCentroidExt,
     std::array<TExtension, 1u>{{TExtension::OES_shader_multisample_interpolation}},
-    BuiltInParameters::p30B10B,
+    BuiltInParameters::p30B00B00B,
     1,
     StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 4, 1>(),
     EOpInterpolateAtCentroid,
@@ -18314,7 +18343,7 @@
 constexpr const TFunction imageSize_00z(BuiltInId::imageSize_Image2D1,
                                         BuiltInName::imageSize,
                                         std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                        BuiltInParameters::p00z10D00E00E,
+                                        BuiltInParameters::p00z10D00B,
                                         1,
                                         StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 2, 1>(),
                                         EOpImageSize,
@@ -18322,7 +18351,7 @@
 constexpr const TFunction imageSize_01K(BuiltInId::imageSize_IImage2D1,
                                         BuiltInName::imageSize,
                                         std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                        BuiltInParameters::p01K10D30D,
+                                        BuiltInParameters::p01K10D00B,
                                         1,
                                         StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 2, 1>(),
                                         EOpImageSize,
@@ -18330,7 +18359,7 @@
 constexpr const TFunction imageSize_01V(BuiltInId::imageSize_UImage2D1,
                                         BuiltInName::imageSize,
                                         std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                        BuiltInParameters::p01V10D00E00E,
+                                        BuiltInParameters::p01V10D00B,
                                         1,
                                         StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 2, 1>(),
                                         EOpImageSize,
@@ -18338,7 +18367,7 @@
 constexpr const TFunction imageSize_01A(BuiltInId::imageSize_Image3D1,
                                         BuiltInName::imageSize,
                                         std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                        BuiltInParameters::p01A20D00E00E,
+                                        BuiltInParameters::p01A20D00B,
                                         1,
                                         StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 3, 1>(),
                                         EOpImageSize,
@@ -18346,7 +18375,7 @@
 constexpr const TFunction imageSize_01L(BuiltInId::imageSize_IImage3D1,
                                         BuiltInName::imageSize,
                                         std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                        BuiltInParameters::p01L20D30D,
+                                        BuiltInParameters::p01L20D00B,
                                         1,
                                         StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 3, 1>(),
                                         EOpImageSize,
@@ -18354,7 +18383,7 @@
 constexpr const TFunction imageSize_01W(BuiltInId::imageSize_UImage3D1,
                                         BuiltInName::imageSize,
                                         std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                        BuiltInParameters::p01W20D30E,
+                                        BuiltInParameters::p01W20D00B,
                                         1,
                                         StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 3, 1>(),
                                         EOpImageSize,
@@ -18362,7 +18391,7 @@
 constexpr const TFunction imageSize_01B(BuiltInId::imageSize_Image2DArray1,
                                         BuiltInName::imageSize,
                                         std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                        BuiltInParameters::p01B20D00E00E,
+                                        BuiltInParameters::p01B20D00B,
                                         1,
                                         StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 3, 1>(),
                                         EOpImageSize,
@@ -18370,7 +18399,7 @@
 constexpr const TFunction imageSize_01M(BuiltInId::imageSize_IImage2DArray1,
                                         BuiltInName::imageSize,
                                         std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                        BuiltInParameters::p01M20D00E00E,
+                                        BuiltInParameters::p01M20D00B,
                                         1,
                                         StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 3, 1>(),
                                         EOpImageSize,
@@ -18378,7 +18407,7 @@
 constexpr const TFunction imageSize_01X(BuiltInId::imageSize_UImage2DArray1,
                                         BuiltInName::imageSize,
                                         std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                        BuiltInParameters::p01X20D00D00D,
+                                        BuiltInParameters::p01X20D00B,
                                         1,
                                         StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 3, 1>(),
                                         EOpImageSize,
@@ -18386,7 +18415,7 @@
 constexpr const TFunction imageSize_01C(BuiltInId::imageSize_ImageCube1,
                                         BuiltInName::imageSize,
                                         std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                        BuiltInParameters::p01C20D00D00D,
+                                        BuiltInParameters::p01C20D00B,
                                         1,
                                         StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 2, 1>(),
                                         EOpImageSize,
@@ -18394,7 +18423,7 @@
 constexpr const TFunction imageSize_01N(BuiltInId::imageSize_IImageCube1,
                                         BuiltInName::imageSize,
                                         std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                        BuiltInParameters::p01N20D00D00D,
+                                        BuiltInParameters::p01N20D00B,
                                         1,
                                         StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 2, 1>(),
                                         EOpImageSize,
@@ -18410,7 +18439,7 @@
 constexpr const TFunction imageSize_01H(BuiltInId::imageSize_ImageCubeArray1,
                                         BuiltInName::imageSize,
                                         std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                        BuiltInParameters::p01H20D30B,
+                                        BuiltInParameters::p01H20D00B,
                                         1,
                                         StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 3, 1>(),
                                         EOpImageSize,
@@ -18418,7 +18447,7 @@
 constexpr const TFunction imageSize_01S(BuiltInId::imageSize_IImageCubeArray1,
                                         BuiltInName::imageSize,
                                         std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                        BuiltInParameters::p01S20D00E00E,
+                                        BuiltInParameters::p01S20D00B,
                                         1,
                                         StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 3, 1>(),
                                         EOpImageSize,
@@ -18426,7 +18455,7 @@
 constexpr const TFunction imageSize_01d(BuiltInId::imageSize_UImageCubeArray1,
                                         BuiltInName::imageSize,
                                         std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                        BuiltInParameters::p01d20D00E00E,
+                                        BuiltInParameters::p01d20D00B,
                                         1,
                                         StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 3, 1>(),
                                         EOpImageSize,
@@ -18436,7 +18465,7 @@
                                            std::array<TExtension, 2u>{
                                                {TExtension::OES_texture_cube_map_array,
                                                 TExtension::EXT_texture_cube_map_array}},
-                                           BuiltInParameters::p01H20D30B,
+                                           BuiltInParameters::p01H20D00B,
                                            1,
                                            StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 3, 1>(),
                                            EOpImageSize,
@@ -18446,7 +18475,7 @@
                                            std::array<TExtension, 2u>{
                                                {TExtension::OES_texture_cube_map_array,
                                                 TExtension::EXT_texture_cube_map_array}},
-                                           BuiltInParameters::p01S20D00E00E,
+                                           BuiltInParameters::p01S20D00B,
                                            1,
                                            StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 3, 1>(),
                                            EOpImageSize,
@@ -18456,7 +18485,7 @@
                                            std::array<TExtension, 2u>{
                                                {TExtension::OES_texture_cube_map_array,
                                                 TExtension::EXT_texture_cube_map_array}},
-                                           BuiltInParameters::p01d20D00E00E,
+                                           BuiltInParameters::p01d20D00B,
                                            1,
                                            StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 3, 1>(),
                                            EOpImageSize,
@@ -18472,7 +18501,7 @@
 constexpr const TFunction imageSize_01U(BuiltInId::imageSize_IImageBuffer1,
                                         BuiltInName::imageSize,
                                         std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                        BuiltInParameters::p01U00D00D00D,
+                                        BuiltInParameters::p01U00D00B,
                                         1,
                                         StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 1, 1>(),
                                         EOpImageSize,
@@ -18480,7 +18509,7 @@
 constexpr const TFunction imageSize_01f(BuiltInId::imageSize_UImageBuffer1,
                                         BuiltInName::imageSize,
                                         std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                        BuiltInParameters::p01f00D00D00D,
+                                        BuiltInParameters::p01f00D00B,
                                         1,
                                         StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 1, 1>(),
                                         EOpImageSize,
@@ -18498,7 +18527,7 @@
     BuiltInId::imageSizeExt_IImageBuffer1,
     BuiltInName::imageSizeExt,
     std::array<TExtension, 2u>{{TExtension::OES_texture_buffer, TExtension::EXT_texture_buffer}},
-    BuiltInParameters::p01U00D00D00D,
+    BuiltInParameters::p01U00D00B,
     1,
     StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 1, 1>(),
     EOpImageSize,
@@ -18507,7 +18536,7 @@
     BuiltInId::imageSizeExt_UImageBuffer1,
     BuiltInName::imageSizeExt,
     std::array<TExtension, 2u>{{TExtension::OES_texture_buffer, TExtension::EXT_texture_buffer}},
-    BuiltInParameters::p01f00D00D00D,
+    BuiltInParameters::p01f00D00B,
     1,
     StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 1, 1>(),
     EOpImageSize,
@@ -18515,7 +18544,7 @@
 constexpr const TFunction imageSize_01D(BuiltInId::imageSize_Image1D1,
                                         BuiltInName::imageSize,
                                         std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                        BuiltInParameters::p01D00D30B,
+                                        BuiltInParameters::p01D00D00B,
                                         1,
                                         StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 1, 1>(),
                                         EOpImageSize,
@@ -18539,7 +18568,7 @@
 constexpr const TFunction imageSize_01I(BuiltInId::imageSize_ImageRect1,
                                         BuiltInName::imageSize,
                                         std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                        BuiltInParameters::p01I10D30B,
+                                        BuiltInParameters::p01I10D00B,
                                         1,
                                         StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 2, 1>(),
                                         EOpImageSize,
@@ -18555,7 +18584,7 @@
 constexpr const TFunction imageSize_01e(BuiltInId::imageSize_UImageRect1,
                                         BuiltInName::imageSize,
                                         std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                        BuiltInParameters::p01e10D00E00E,
+                                        BuiltInParameters::p01e10D00B,
                                         1,
                                         StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 2, 1>(),
                                         EOpImageSize,
@@ -18563,7 +18592,7 @@
 constexpr const TFunction imageSize_01E(BuiltInId::imageSize_Image1DArray1,
                                         BuiltInName::imageSize,
                                         std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                        BuiltInParameters::p01E10D00D00D,
+                                        BuiltInParameters::p01E10D00B,
                                         1,
                                         StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 2, 1>(),
                                         EOpImageSize,
@@ -18571,7 +18600,7 @@
 constexpr const TFunction imageSize_01P(BuiltInId::imageSize_IImage1DArray1,
                                         BuiltInName::imageSize,
                                         std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                        BuiltInParameters::p01P10D00E00E,
+                                        BuiltInParameters::p01P10D00B,
                                         1,
                                         StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 2, 1>(),
                                         EOpImageSize,
@@ -18579,7 +18608,7 @@
 constexpr const TFunction imageSize_01a(BuiltInId::imageSize_UImage1DArray1,
                                         BuiltInName::imageSize,
                                         std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                        BuiltInParameters::p01a10D00D00D,
+                                        BuiltInParameters::p01a10D00B,
                                         1,
                                         StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 2, 1>(),
                                         EOpImageSize,
@@ -18587,7 +18616,7 @@
 constexpr const TFunction imageSize_01F(BuiltInId::imageSize_Image2DMS1,
                                         BuiltInName::imageSize,
                                         std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                        BuiltInParameters::p01F10D00D00D00D,
+                                        BuiltInParameters::p01F10D00D00B,
                                         1,
                                         StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 2, 1>(),
                                         EOpImageSize,
@@ -18595,7 +18624,7 @@
 constexpr const TFunction imageSize_01Q(BuiltInId::imageSize_IImage2DMS1,
                                         BuiltInName::imageSize,
                                         std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                        BuiltInParameters::p01Q10D00D30D,
+                                        BuiltInParameters::p01Q10D00D00B,
                                         1,
                                         StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 2, 1>(),
                                         EOpImageSize,
@@ -18603,7 +18632,7 @@
 constexpr const TFunction imageSize_01b(BuiltInId::imageSize_UImage2DMS1,
                                         BuiltInName::imageSize,
                                         std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                        BuiltInParameters::p01b10D00D30E,
+                                        BuiltInParameters::p01b10D00D00B,
                                         1,
                                         StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 2, 1>(),
                                         EOpImageSize,
@@ -18611,7 +18640,7 @@
 constexpr const TFunction imageSize_01G(BuiltInId::imageSize_Image2DMSArray1,
                                         BuiltInName::imageSize,
                                         std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                        BuiltInParameters::p01G20D00D30B,
+                                        BuiltInParameters::p01G20D00D00B,
                                         1,
                                         StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 3, 1>(),
                                         EOpImageSize,
@@ -18635,7 +18664,7 @@
 constexpr const TFunction imageSamples_01F(BuiltInId::imageSamples_Image2DMS1,
                                            BuiltInName::imageSamples,
                                            std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                           BuiltInParameters::p01F10D00D00D00D,
+                                           BuiltInParameters::p01F10D00D00B,
                                            1,
                                            StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 1, 1>(),
                                            EOpImageSamples,
@@ -18643,7 +18672,7 @@
 constexpr const TFunction imageSamples_01Q(BuiltInId::imageSamples_IImage2DMS1,
                                            BuiltInName::imageSamples,
                                            std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                           BuiltInParameters::p01Q10D00D30D,
+                                           BuiltInParameters::p01Q10D00D00B,
                                            1,
                                            StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 1, 1>(),
                                            EOpImageSamples,
@@ -18651,7 +18680,7 @@
 constexpr const TFunction imageSamples_01b(BuiltInId::imageSamples_UImage2DMS1,
                                            BuiltInName::imageSamples,
                                            std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                           BuiltInParameters::p01b10D00D30E,
+                                           BuiltInParameters::p01b10D00D00B,
                                            1,
                                            StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 1, 1>(),
                                            EOpImageSamples,
@@ -18659,7 +18688,7 @@
 constexpr const TFunction imageSamples_01G(BuiltInId::imageSamples_Image2DMSArray1,
                                            BuiltInName::imageSamples,
                                            std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                           BuiltInParameters::p01G20D00D30B,
+                                           BuiltInParameters::p01G20D00D00B,
                                            1,
                                            StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 1, 1>(),
                                            EOpImageSamples,
@@ -19038,7 +19067,7 @@
     BuiltInId::imageLoad_Image2D1_Int2,
     BuiltInName::imageLoad,
     std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-    BuiltInParameters::p00z10D00E00E,
+    BuiltInParameters::p00z10D00B,
     2,
     StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 4, 1>(),
     EOpImageLoad,
@@ -19046,7 +19075,7 @@
 constexpr const TFunction imageLoad_01K10D(BuiltInId::imageLoad_IImage2D1_Int2,
                                            BuiltInName::imageLoad,
                                            std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                           BuiltInParameters::p01K10D30D,
+                                           BuiltInParameters::p01K10D00B,
                                            2,
                                            StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 4, 1>(),
                                            EOpImageLoad,
@@ -19055,7 +19084,7 @@
     BuiltInId::imageLoad_UImage2D1_Int2,
     BuiltInName::imageLoad,
     std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-    BuiltInParameters::p01V10D00E00E,
+    BuiltInParameters::p01V10D00B,
     2,
     StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 4, 1>(),
     EOpImageLoad,
@@ -19064,7 +19093,7 @@
     BuiltInId::imageLoad_Image3D1_Int3,
     BuiltInName::imageLoad,
     std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-    BuiltInParameters::p01A20D00E00E,
+    BuiltInParameters::p01A20D00B,
     2,
     StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 4, 1>(),
     EOpImageLoad,
@@ -19072,7 +19101,7 @@
 constexpr const TFunction imageLoad_01L20D(BuiltInId::imageLoad_IImage3D1_Int3,
                                            BuiltInName::imageLoad,
                                            std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                           BuiltInParameters::p01L20D30D,
+                                           BuiltInParameters::p01L20D00B,
                                            2,
                                            StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 4, 1>(),
                                            EOpImageLoad,
@@ -19081,7 +19110,7 @@
     BuiltInId::imageLoad_UImage3D1_Int3,
     BuiltInName::imageLoad,
     std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-    BuiltInParameters::p01W20D30E,
+    BuiltInParameters::p01W20D00B,
     2,
     StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 4, 1>(),
     EOpImageLoad,
@@ -19090,7 +19119,7 @@
     BuiltInId::imageLoad_Image2DArray1_Int3,
     BuiltInName::imageLoad,
     std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-    BuiltInParameters::p01B20D00E00E,
+    BuiltInParameters::p01B20D00B,
     2,
     StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 4, 1>(),
     EOpImageLoad,
@@ -19098,7 +19127,7 @@
 constexpr const TFunction imageLoad_01M20D(BuiltInId::imageLoad_IImage2DArray1_Int3,
                                            BuiltInName::imageLoad,
                                            std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                           BuiltInParameters::p01M20D00E00E,
+                                           BuiltInParameters::p01M20D00B,
                                            2,
                                            StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 4, 1>(),
                                            EOpImageLoad,
@@ -19107,7 +19136,7 @@
     BuiltInId::imageLoad_UImage2DArray1_Int3,
     BuiltInName::imageLoad,
     std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-    BuiltInParameters::p01X20D00D00D,
+    BuiltInParameters::p01X20D00B,
     2,
     StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 4, 1>(),
     EOpImageLoad,
@@ -19116,7 +19145,7 @@
     BuiltInId::imageLoad_ImageCube1_Int3,
     BuiltInName::imageLoad,
     std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-    BuiltInParameters::p01C20D00D00D,
+    BuiltInParameters::p01C20D00B,
     2,
     StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 4, 1>(),
     EOpImageLoad,
@@ -19124,7 +19153,7 @@
 constexpr const TFunction imageLoad_01N20D(BuiltInId::imageLoad_IImageCube1_Int3,
                                            BuiltInName::imageLoad,
                                            std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                           BuiltInParameters::p01N20D00D00D,
+                                           BuiltInParameters::p01N20D00B,
                                            2,
                                            StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 4, 1>(),
                                            EOpImageLoad,
@@ -19142,7 +19171,7 @@
     BuiltInId::imageLoad_ImageCubeArray1_Int3,
     BuiltInName::imageLoad,
     std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-    BuiltInParameters::p01H20D30B,
+    BuiltInParameters::p01H20D00B,
     2,
     StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 4, 1>(),
     EOpImageLoad,
@@ -19150,7 +19179,7 @@
 constexpr const TFunction imageLoad_01S20D(BuiltInId::imageLoad_IImageCubeArray1_Int3,
                                            BuiltInName::imageLoad,
                                            std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                           BuiltInParameters::p01S20D00E00E,
+                                           BuiltInParameters::p01S20D00B,
                                            2,
                                            StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 4, 1>(),
                                            EOpImageLoad,
@@ -19159,7 +19188,7 @@
     BuiltInId::imageLoad_UImageCubeArray1_Int3,
     BuiltInName::imageLoad,
     std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-    BuiltInParameters::p01d20D00E00E,
+    BuiltInParameters::p01d20D00B,
     2,
     StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 4, 1>(),
     EOpImageLoad,
@@ -19169,7 +19198,7 @@
     BuiltInName::imageLoadExt,
     std::array<TExtension, 2u>{
         {TExtension::OES_texture_cube_map_array, TExtension::EXT_texture_cube_map_array}},
-    BuiltInParameters::p01H20D30B,
+    BuiltInParameters::p01H20D00B,
     2,
     StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 4, 1>(),
     EOpImageLoad,
@@ -19179,7 +19208,7 @@
     BuiltInName::imageLoadExt,
     std::array<TExtension, 2u>{
         {TExtension::OES_texture_cube_map_array, TExtension::EXT_texture_cube_map_array}},
-    BuiltInParameters::p01S20D00E00E,
+    BuiltInParameters::p01S20D00B,
     2,
     StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 4, 1>(),
     EOpImageLoad,
@@ -19189,7 +19218,7 @@
     BuiltInName::imageLoadExt,
     std::array<TExtension, 2u>{
         {TExtension::OES_texture_cube_map_array, TExtension::EXT_texture_cube_map_array}},
-    BuiltInParameters::p01d20D00E00E,
+    BuiltInParameters::p01d20D00B,
     2,
     StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 4, 1>(),
     EOpImageLoad,
@@ -19206,7 +19235,7 @@
 constexpr const TFunction imageLoad_01U00D(BuiltInId::imageLoad_IImageBuffer1_Int1,
                                            BuiltInName::imageLoad,
                                            std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                           BuiltInParameters::p01U00D00D00D,
+                                           BuiltInParameters::p01U00D00B,
                                            2,
                                            StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 4, 1>(),
                                            EOpImageLoad,
@@ -19215,7 +19244,7 @@
     BuiltInId::imageLoad_UImageBuffer1_Int1,
     BuiltInName::imageLoad,
     std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-    BuiltInParameters::p01f00D00D00D,
+    BuiltInParameters::p01f00D00B,
     2,
     StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 4, 1>(),
     EOpImageLoad,
@@ -19233,7 +19262,7 @@
     BuiltInId::imageLoadExt_IImageBuffer1_Int1,
     BuiltInName::imageLoadExt,
     std::array<TExtension, 2u>{{TExtension::OES_texture_buffer, TExtension::EXT_texture_buffer}},
-    BuiltInParameters::p01U00D00D00D,
+    BuiltInParameters::p01U00D00B,
     2,
     StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 4, 1>(),
     EOpImageLoad,
@@ -19242,7 +19271,7 @@
     BuiltInId::imageLoadExt_UImageBuffer1_Int1,
     BuiltInName::imageLoadExt,
     std::array<TExtension, 2u>{{TExtension::OES_texture_buffer, TExtension::EXT_texture_buffer}},
-    BuiltInParameters::p01f00D00D00D,
+    BuiltInParameters::p01f00D00B,
     2,
     StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 4, 1>(),
     EOpImageLoad,
@@ -19251,7 +19280,7 @@
     BuiltInId::imageLoad_Image1D1_Int1,
     BuiltInName::imageLoad,
     std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-    BuiltInParameters::p01D00D30B,
+    BuiltInParameters::p01D00D00B,
     2,
     StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 4, 1>(),
     EOpImageLoad,
@@ -19277,7 +19306,7 @@
     BuiltInId::imageLoad_Image1DArray1_Int2,
     BuiltInName::imageLoad,
     std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-    BuiltInParameters::p01E10D00D00D,
+    BuiltInParameters::p01E10D00B,
     2,
     StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 4, 1>(),
     EOpImageLoad,
@@ -19285,7 +19314,7 @@
 constexpr const TFunction imageLoad_01P10D(BuiltInId::imageLoad_IImage1DArray1_Int2,
                                            BuiltInName::imageLoad,
                                            std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                           BuiltInParameters::p01P10D00E00E,
+                                           BuiltInParameters::p01P10D00B,
                                            2,
                                            StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 4, 1>(),
                                            EOpImageLoad,
@@ -19294,7 +19323,7 @@
     BuiltInId::imageLoad_UImage1DArray1_Int2,
     BuiltInName::imageLoad,
     std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-    BuiltInParameters::p01a10D00D00D,
+    BuiltInParameters::p01a10D00B,
     2,
     StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 4, 1>(),
     EOpImageLoad,
@@ -19303,7 +19332,7 @@
     BuiltInId::imageLoad_ImageRect1_Int2,
     BuiltInName::imageLoad,
     std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-    BuiltInParameters::p01I10D30B,
+    BuiltInParameters::p01I10D00B,
     2,
     StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 4, 1>(),
     EOpImageLoad,
@@ -19320,7 +19349,7 @@
     BuiltInId::imageLoad_UImageRect1_Int2,
     BuiltInName::imageLoad,
     std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-    BuiltInParameters::p01e10D00E00E,
+    BuiltInParameters::p01e10D00B,
     2,
     StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 4, 1>(),
     EOpImageLoad,
@@ -19329,7 +19358,7 @@
     BuiltInId::imageLoad_Image2DMS1_Int2_Int1,
     BuiltInName::imageLoad,
     std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-    BuiltInParameters::p01F10D00D00D00D,
+    BuiltInParameters::p01F10D00D00B,
     3,
     StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 4, 1>(),
     EOpImageLoad,
@@ -19338,7 +19367,7 @@
     BuiltInId::imageLoad_IImage2DMS1_Int2_Int1,
     BuiltInName::imageLoad,
     std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-    BuiltInParameters::p01Q10D00D30D,
+    BuiltInParameters::p01Q10D00D00B,
     3,
     StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 4, 1>(),
     EOpImageLoad,
@@ -19347,7 +19376,7 @@
     BuiltInId::imageLoad_UImage2DMS1_Int2_Int1,
     BuiltInName::imageLoad,
     std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-    BuiltInParameters::p01b10D00D30E,
+    BuiltInParameters::p01b10D00D00B,
     3,
     StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 4, 1>(),
     EOpImageLoad,
@@ -19356,7 +19385,7 @@
     BuiltInId::imageLoad_Image2DMSArray1_Int3_Int1,
     BuiltInName::imageLoad,
     std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-    BuiltInParameters::p01G20D00D30B,
+    BuiltInParameters::p01G20D00D00B,
     3,
     StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 4, 1>(),
     EOpImageLoad,
@@ -29480,7 +29509,7 @@
 constexpr const TFunction noise1_00B(BuiltInId::noise1_Float1,
                                      BuiltInName::noise1,
                                      std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                     BuiltInParameters::p00B30B,
+                                     BuiltInParameters::p00B00B00B,
                                      1,
                                      StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 1, 1>(),
                                      EOpNoise1,
@@ -29488,7 +29517,7 @@
 constexpr const TFunction noise1_10B(BuiltInId::noise1_Float2,
                                      BuiltInName::noise1,
                                      std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                     BuiltInParameters::p10B00D,
+                                     BuiltInParameters::p10B00B00B,
                                      1,
                                      StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 1, 1>(),
                                      EOpNoise1,
@@ -29496,7 +29525,7 @@
 constexpr const TFunction noise1_20B(BuiltInId::noise1_Float3,
                                      BuiltInName::noise1,
                                      std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                     BuiltInParameters::p20B20B00B,
+                                     BuiltInParameters::p20B00B00B,
                                      1,
                                      StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 1, 1>(),
                                      EOpNoise1,
@@ -29504,7 +29533,7 @@
 constexpr const TFunction noise1_30B(BuiltInId::noise1_Float4,
                                      BuiltInName::noise1,
                                      std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                     BuiltInParameters::p30B10B,
+                                     BuiltInParameters::p30B00B00B,
                                      1,
                                      StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 1, 1>(),
                                      EOpNoise1,
@@ -29512,7 +29541,7 @@
 constexpr const TFunction noise2_00B(BuiltInId::noise2_Float1,
                                      BuiltInName::noise2,
                                      std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                     BuiltInParameters::p00B30B,
+                                     BuiltInParameters::p00B00B00B,
                                      1,
                                      StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 2, 1>(),
                                      EOpNoise2,
@@ -29520,7 +29549,7 @@
 constexpr const TFunction noise2_10B(BuiltInId::noise2_Float2,
                                      BuiltInName::noise2,
                                      std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                     BuiltInParameters::p10B00D,
+                                     BuiltInParameters::p10B00B00B,
                                      1,
                                      StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 2, 1>(),
                                      EOpNoise2,
@@ -29528,7 +29557,7 @@
 constexpr const TFunction noise2_20B(BuiltInId::noise2_Float3,
                                      BuiltInName::noise2,
                                      std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                     BuiltInParameters::p20B20B00B,
+                                     BuiltInParameters::p20B00B00B,
                                      1,
                                      StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 2, 1>(),
                                      EOpNoise2,
@@ -29536,7 +29565,7 @@
 constexpr const TFunction noise2_30B(BuiltInId::noise2_Float4,
                                      BuiltInName::noise2,
                                      std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                     BuiltInParameters::p30B10B,
+                                     BuiltInParameters::p30B00B00B,
                                      1,
                                      StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 2, 1>(),
                                      EOpNoise2,
@@ -29544,7 +29573,7 @@
 constexpr const TFunction noise3_00B(BuiltInId::noise3_Float1,
                                      BuiltInName::noise3,
                                      std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                     BuiltInParameters::p00B30B,
+                                     BuiltInParameters::p00B00B00B,
                                      1,
                                      StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 3, 1>(),
                                      EOpNoise3,
@@ -29552,7 +29581,7 @@
 constexpr const TFunction noise3_10B(BuiltInId::noise3_Float2,
                                      BuiltInName::noise3,
                                      std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                     BuiltInParameters::p10B00D,
+                                     BuiltInParameters::p10B00B00B,
                                      1,
                                      StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 3, 1>(),
                                      EOpNoise3,
@@ -29560,7 +29589,7 @@
 constexpr const TFunction noise3_20B(BuiltInId::noise3_Float3,
                                      BuiltInName::noise3,
                                      std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                     BuiltInParameters::p20B20B00B,
+                                     BuiltInParameters::p20B00B00B,
                                      1,
                                      StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 3, 1>(),
                                      EOpNoise3,
@@ -29568,7 +29597,7 @@
 constexpr const TFunction noise3_30B(BuiltInId::noise3_Float4,
                                      BuiltInName::noise3,
                                      std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                     BuiltInParameters::p30B10B,
+                                     BuiltInParameters::p30B00B00B,
                                      1,
                                      StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 3, 1>(),
                                      EOpNoise3,
@@ -29576,7 +29605,7 @@
 constexpr const TFunction noise4_00B(BuiltInId::noise4_Float1,
                                      BuiltInName::noise4,
                                      std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                     BuiltInParameters::p00B30B,
+                                     BuiltInParameters::p00B00B00B,
                                      1,
                                      StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 4, 1>(),
                                      EOpNoise4,
@@ -29584,7 +29613,7 @@
 constexpr const TFunction noise4_10B(BuiltInId::noise4_Float2,
                                      BuiltInName::noise4,
                                      std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                     BuiltInParameters::p10B00D,
+                                     BuiltInParameters::p10B00B00B,
                                      1,
                                      StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 4, 1>(),
                                      EOpNoise4,
@@ -29592,7 +29621,7 @@
 constexpr const TFunction noise4_20B(BuiltInId::noise4_Float3,
                                      BuiltInName::noise4,
                                      std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                     BuiltInParameters::p20B20B00B,
+                                     BuiltInParameters::p20B00B00B,
                                      1,
                                      StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 4, 1>(),
                                      EOpNoise4,
@@ -29600,7 +29629,7 @@
 constexpr const TFunction noise4_30B(BuiltInId::noise4_Float4,
                                      BuiltInName::noise4,
                                      std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                     BuiltInParameters::p30B10B,
+                                     BuiltInParameters::p30B00B00B,
                                      1,
                                      StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 4, 1>(),
                                      EOpNoise4,
@@ -29666,14 +29695,24 @@
     StaticType::Get<EbtVoid, EbpUndefined, EvqGlobal, 1, 1>(),
     EOpGroupMemoryBarrier,
     false);
-constexpr const TFunction barrierES3_2_(BuiltInId::barrierES3_2,
-                                        BuiltInName::barrierES3_2,
-                                        std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-                                        BuiltInParameters::empty,
-                                        0,
-                                        StaticType::Get<EbtVoid, EbpUndefined, EvqGlobal, 1, 1>(),
-                                        EOpBarrierTCS,
-                                        false);
+constexpr const TFunction barrierTCS_(BuiltInId::barrierTCS,
+                                      BuiltInName::barrierTCS,
+                                      std::array<TExtension, 1u>{
+                                          {TExtension::EXT_tessellation_shader}},
+                                      BuiltInParameters::empty,
+                                      0,
+                                      StaticType::Get<EbtVoid, EbpUndefined, EvqGlobal, 1, 1>(),
+                                      EOpBarrierTCS,
+                                      false);
+constexpr const TFunction barrierTCSES3_2_(
+    BuiltInId::barrierTCSES3_2,
+    BuiltInName::barrierTCSES3_2,
+    std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
+    BuiltInParameters::empty,
+    0,
+    StaticType::Get<EbtVoid, EbpUndefined, EvqGlobal, 1, 1>(),
+    EOpBarrierTCS,
+    false);
 constexpr const TFunction EmitVertex_(BuiltInId::EmitVertex,
                                       BuiltInName::EmitVertex,
                                       std::array<TExtension, 2u>{{TExtension::EXT_geometry_shader,
@@ -29714,7 +29753,7 @@
     BuiltInId::EmitStreamVertex_Int1,
     BuiltInName::EmitStreamVertex,
     std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-    BuiltInParameters::p00D00D00F,
+    BuiltInParameters::p00D00D00D00D,
     1,
     StaticType::Get<EbtVoid, EbpUndefined, EvqGlobal, 1, 1>(),
     EOpEmitStreamVertex,
@@ -29723,7 +29762,7 @@
     BuiltInId::EndStreamPrimitive_Int1,
     BuiltInName::EndStreamPrimitive,
     std::array<TExtension, 1u>{{TExtension::UNDEFINED}},
-    BuiltInParameters::p00D00D00F,
+    BuiltInParameters::p00D00D00D00D,
     1,
     StaticType::Get<EbtVoid, EbpUndefined, EvqGlobal, 1, 1>(),
     EOpEndStreamPrimitive,
@@ -34173,9 +34212,9 @@
     Rule::Get<Spec::GLSL, 430, Shader::ALL, 0>(&memoryBarrierImage_),
     Rule::Get<Spec::ESSL, 310, Shader::COMPUTE, 0>(&barrier_),
     Rule::Get<Spec::GLSL, 400, Shader::COMPUTE, 0>(&barrier_),
-    Rule::Get<Spec::ESSL, 320, Shader::TESS_CONTROL_EXT, 0>(&barrierES3_2_),
+    Rule::Get<Spec::ESSL, 320, Shader::TESS_CONTROL_EXT, 0>(&barrierTCSES3_2_),
     Rule::Get<Spec::ESSL, 310, Shader::TESS_CONTROL_EXT, EXT_INDEX(EXT_tessellation_shader)>(
-        &barrier_),
+        &barrierTCS_),
     Rule::Get<Spec::ESSL, 310, Shader::COMPUTE, 0>(&memoryBarrierShared_),
     Rule::Get<Spec::GLSL, 430, Shader::COMPUTE, 0>(&memoryBarrierShared_),
     Rule::Get<Spec::ESSL, 310, Shader::COMPUTE, 0>(&groupMemoryBarrier_),
@@ -34190,11 +34229,17 @@
     Rule::Get<Spec::ESSL, 310, Shader::GEOMETRY, EXT_INDEX(OES_geometry_shader)>(&EndPrimitive_),
     Rule::Get<Spec::GLSL, 400, Shader::GEOMETRY, 0>(&EmitStreamVertex_00D),
     Rule::Get<Spec::GLSL, 400, Shader::GEOMETRY, 0>(&EndStreamPrimitive_00D),
+    Rule::Get<Spec::ESSL, kESSLVulkanOnly, Shader::ALL, 0>(&subpassLoad_01g),
     Rule::Get<Spec::GLSL, 460, Shader::ALL, 0>(&subpassLoad_01g),
+    Rule::Get<Spec::ESSL, kESSLVulkanOnly, Shader::ALL, 0>(&subpassLoad_01h),
     Rule::Get<Spec::GLSL, 460, Shader::ALL, 0>(&subpassLoad_01h),
+    Rule::Get<Spec::ESSL, kESSLVulkanOnly, Shader::ALL, 0>(&subpassLoad_01i),
     Rule::Get<Spec::GLSL, 460, Shader::ALL, 0>(&subpassLoad_01i),
+    Rule::Get<Spec::ESSL, kESSLVulkanOnly, Shader::ALL, 0>(&subpassLoad_01j00D),
     Rule::Get<Spec::GLSL, 460, Shader::ALL, 0>(&subpassLoad_01j00D),
+    Rule::Get<Spec::ESSL, kESSLVulkanOnly, Shader::ALL, 0>(&subpassLoad_01k00D),
     Rule::Get<Spec::GLSL, 460, Shader::ALL, 0>(&subpassLoad_01k00D),
+    Rule::Get<Spec::ESSL, kESSLVulkanOnly, Shader::ALL, 0>(&subpassLoad_01l00D),
     Rule::Get<Spec::GLSL, 460, Shader::ALL, 0>(&subpassLoad_01l00D),
     Rule::Get<Spec::GLSL, 460, Shader::ALL, 0>(&anyInvocation_00F),
     Rule::Get<Spec::GLSL, 460, Shader::ALL, 0>(&allInvocations_00F),
@@ -34431,8 +34476,10 @@
         &TableBase::m_gl_MaxCullDistancesEXT),
     Rule::Get<Spec::ESSL, 300, Shader::ALL, EXT_INDEX(EXT_clip_cull_distance)>(
         &TableBase::m_gl_MaxCombinedClipAndCullDistancesEXT),
-    Rule::Get<Spec::ESSL, 0, Shader::FRAGMENT, 0>(&BuiltInVariable::kgl_FragCoord),
+    Rule::Get<Spec::ESSL, 100, Shader::FRAGMENT, 0>(&BuiltInVariable::kgl_FragCoord),
     Rule::Get<Spec::GLSL, 0, Shader::FRAGMENT, 0>(&BuiltInVariable::kgl_FragCoord),
+    Rule::Get<Spec::ESSL, 300, Shader::FRAGMENT, 0>(&BuiltInVariable::kgl_FragCoord300),
+    Rule::Get<Spec::GLSL, 0, Shader::FRAGMENT, 0>(&BuiltInVariable::kgl_FragCoord300),
     Rule::Get<Spec::ESSL, 0, Shader::FRAGMENT, 0>(&BuiltInVariable::kgl_FrontFacing),
     Rule::Get<Spec::GLSL, 0, Shader::FRAGMENT, 0>(&BuiltInVariable::kgl_FrontFacing),
     Rule::Get<Spec::ESSL, 0, Shader::FRAGMENT, 0>(&BuiltInVariable::kgl_PointCoord),
@@ -34540,8 +34587,10 @@
         &TableBase::m_gl_PositionTCS),
     Rule::Get<Spec::ESSL, 310, Shader::TESS_EVALUATION_EXT, EXT_INDEX(EXT_tessellation_shader)>(
         &TableBase::m_gl_PositionTES),
-    Rule::Get<Spec::ESSL, 0, Shader::VERTEX, 0>(&BuiltInVariable::kgl_PointSize),
+    Rule::Get<Spec::ESSL, 100, Shader::VERTEX, 0>(&BuiltInVariable::kgl_PointSize),
     Rule::Get<Spec::GLSL, 0, Shader::VERTEX, 0>(&BuiltInVariable::kgl_PointSize),
+    Rule::Get<Spec::ESSL, 300, Shader::VERTEX, 0>(&BuiltInVariable::kgl_PointSize300),
+    Rule::Get<Spec::GLSL, 0, Shader::VERTEX, 0>(&BuiltInVariable::kgl_PointSize300),
     Rule::Get<Spec::ESSL, 300, Shader::VERTEX, 0>(&BuiltInVariable::kgl_InstanceID),
     Rule::Get<Spec::GLSL, 0, Shader::VERTEX, 0>(&BuiltInVariable::kgl_InstanceID),
     Rule::Get<Spec::ESSL, 300, Shader::VERTEX, 0>(&BuiltInVariable::kgl_VertexID),
@@ -34656,6 +34705,11 @@
         &TableBase::m_gl_outTCS),
     Rule::Get<Spec::ESSL, 310, Shader::TESS_EVALUATION_EXT, EXT_INDEX(EXT_tessellation_shader)>(
         &TableBase::m_gl_outTES),
+    Rule::Get<Spec::ESSL, 320, Shader::TESS_CONTROL_EXT, 0>(
+        &TableBase::m_gl_BoundingBoxEXTTCSES3_2),
+    Rule::Get<Spec::GLSL, 0, Shader::TESS_CONTROL_EXT, 0>(&TableBase::m_gl_BoundingBoxEXTTCSES3_2),
+    Rule::Get<Spec::ESSL, 310, Shader::TESS_CONTROL_EXT, EXT_INDEX(EXT_tessellation_shader)>(
+        &TableBase::m_gl_BoundingBoxEXTTCS),
     Rule::Get<Spec::ESSL, 310, Shader::TESS_EVALUATION_EXT, 0>(&BuiltInVariable::kgl_TessCoord),
     Rule::Get<Spec::GLSL, 0, Shader::TESS_EVALUATION_EXT, 0>(&BuiltInVariable::kgl_TessCoord),
     Rule::Get<Spec::ESSL, 300, Shader::NOT_COMPUTE, EXT_INDEX(OVR_multiview)>(
@@ -36840,6 +36894,7 @@
                                          "gl_TessLevelOuter",
                                          "gl_TessLevelInner",
                                          "gl_out",
+                                         "gl_BoundingBoxEXT",
                                          "gl_TessCoord",
                                          "gl_ViewID_OVR"};
 
@@ -38901,130 +38956,131 @@
     3669,  // EmitStreamVertex_00D
     3670,  // EndStreamPrimitive_00D
     3671,  // subpassLoad_01g
-    3672,  // subpassLoad_01h
-    3673,  // subpassLoad_01i
-    3674,  // subpassLoad_01j00D
-    3675,  // subpassLoad_01k00D
-    3676,  // subpassLoad_01l00D
-    3677,  // anyInvocation_00F
-    3678,  // allInvocations_00F
-    3679,  // allInvocationsEqual_00F
-    3680,  // gl_DepthRangeParameters
-    3682,  // gl_DepthRange
-    3684,  // gl_NumSamples
-    3687,  // gl_MaxVertexAttribs
-    3689,  // gl_MaxVertexUniformVectors
-    3691,  // gl_MaxVertexTextureImageUnits
-    3693,  // gl_MaxCombinedTextureImageUnits
-    3695,  // gl_MaxTextureImageUnits
-    3697,  // gl_MaxFragmentUniformVectors
-    3699,  // gl_MaxVaryingVectors
-    3701,  // gl_MaxDrawBuffers
-    3703,  // gl_MaxDualSourceDrawBuffersEXT
-    3704,  // gl_MaxVertexOutputVectors
-    3706,  // gl_MaxFragmentInputVectors
-    3708,  // gl_MinProgramTexelOffset
-    3710,  // gl_MaxProgramTexelOffset
-    3712,  // gl_MaxImageUnits
-    3714,  // gl_MaxVertexImageUniforms
-    3716,  // gl_MaxFragmentImageUniforms
-    3718,  // gl_MaxComputeImageUniforms
-    3720,  // gl_MaxCombinedImageUniforms
-    3722,  // gl_MaxCombinedShaderOutputResources
-    3724,  // gl_MaxComputeWorkGroupCount
-    3726,  // gl_MaxComputeWorkGroupSize
-    3728,  // gl_MaxComputeUniformComponents
-    3730,  // gl_MaxComputeTextureImageUnits
-    3732,  // gl_MaxComputeAtomicCounters
-    3734,  // gl_MaxComputeAtomicCounterBuffers
-    3736,  // gl_MaxVertexAtomicCounters
-    3738,  // gl_MaxFragmentAtomicCounters
-    3740,  // gl_MaxCombinedAtomicCounters
-    3742,  // gl_MaxAtomicCounterBindings
-    3744,  // gl_MaxVertexAtomicCounterBuffers
-    3746,  // gl_MaxFragmentAtomicCounterBuffers
-    3748,  // gl_MaxCombinedAtomicCounterBuffers
-    3750,  // gl_MaxAtomicCounterBufferSize
-    3752,  // gl_MaxGeometryInputComponents
-    3756,  // gl_MaxGeometryOutputComponents
-    3760,  // gl_MaxGeometryImageUniforms
-    3764,  // gl_MaxGeometryTextureImageUnits
-    3768,  // gl_MaxGeometryOutputVertices
-    3772,  // gl_MaxGeometryTotalOutputComponents
-    3776,  // gl_MaxGeometryUniformComponents
-    3780,  // gl_MaxGeometryAtomicCounters
-    3784,  // gl_MaxGeometryAtomicCounterBuffers
-    3788,  // gl_MaxTessControlInputComponents
-    3791,  // gl_MaxTessControlOutputComponents
-    3794,  // gl_MaxTessControlTextureImageUnits
-    3797,  // gl_MaxTessControlUniformComponents
-    3800,  // gl_MaxTessControlTotalOutputComponents
-    3803,  // gl_MaxTessControlImageUniforms
-    3806,  // gl_MaxTessControlAtomicCounters
-    3809,  // gl_MaxTessControlAtomicCounterBuffers
-    3812,  // gl_MaxTessPatchComponents
-    3815,  // gl_MaxPatchVertices
-    3818,  // gl_MaxTessGenLevel
-    3821,  // gl_MaxTessEvaluationInputComponents
-    3824,  // gl_MaxTessEvaluationOutputComponents
-    3827,  // gl_MaxTessEvaluationTextureImageUnits
-    3830,  // gl_MaxTessEvaluationUniformComponents
-    3833,  // gl_MaxTessEvaluationImageUniforms
-    3836,  // gl_MaxTessEvaluationAtomicCounters
-    3839,  // gl_MaxTessEvaluationAtomicCounterBuffers
-    3842,  // gl_MaxSamples
-    3845,  // gl_MaxClipDistances
-    3846,  // gl_MaxCullDistances
-    3847,  // gl_MaxCombinedClipAndCullDistances
-    3848,  // gl_FragCoord
-    3850,  // gl_FrontFacing
-    3852,  // gl_PointCoord
-    3854,  // gl_FragColor
-    3856,  // gl_FragData
-    3858,  // gl_FragDepth
-    3860,  // gl_HelperInvocation
-    3862,  // gl_SecondaryFragColorEXT
-    3863,  // gl_SecondaryFragDataEXT
-    3864,  // gl_FragDepthEXT
-    3865,  // gl_LastFragData
-    3868,  // gl_LastFragColor
-    3869,  // gl_LastFragColorARM
-    3870,  // gl_PrimitiveID
-    3884,  // gl_Layer
-    3892,  // gl_SampleID
-    3895,  // gl_SamplePosition
-    3898,  // gl_SampleMaskIn
-    3901,  // gl_SampleMask
-    3904,  // gl_CullDistance
-    3906,  // gl_ClipDistance
-    3908,  // gl_Position
-    3920,  // gl_PointSize
-    3922,  // gl_InstanceID
-    3924,  // Empty
-    3924,  // gl_VertexID
-    3926,  // Empty
-    3926,  // Empty
-    3926,  // gl_DrawID
-    3927,  // gl_BaseVertex
-    3928,  // gl_BaseInstance
-    3929,  // angle_BaseVertex
-    3930,  // angle_BaseInstance
-    3931,  // gl_NumWorkGroups
-    3933,  // gl_WorkGroupSize
-    3935,  // gl_WorkGroupID
-    3937,  // gl_LocalInvocationID
-    3939,  // gl_GlobalInvocationID
-    3941,  // gl_LocalInvocationIndex
-    3943,  // gl_PrimitiveIDIn
-    3947,  // gl_InvocationID
-    3954,  // gl_PerVertex
-    3964,  // gl_in
-    3974,  // gl_PatchVerticesIn
-    3980,  // gl_TessLevelOuter
-    3986,  // gl_TessLevelInner
-    3992,  // gl_out
-    3998,  // gl_TessCoord
-    4000,  // gl_ViewID_OVR
+    3673,  // subpassLoad_01h
+    3675,  // subpassLoad_01i
+    3677,  // subpassLoad_01j00D
+    3679,  // subpassLoad_01k00D
+    3681,  // subpassLoad_01l00D
+    3683,  // anyInvocation_00F
+    3684,  // allInvocations_00F
+    3685,  // allInvocationsEqual_00F
+    3686,  // gl_DepthRangeParameters
+    3688,  // gl_DepthRange
+    3690,  // gl_NumSamples
+    3693,  // gl_MaxVertexAttribs
+    3695,  // gl_MaxVertexUniformVectors
+    3697,  // gl_MaxVertexTextureImageUnits
+    3699,  // gl_MaxCombinedTextureImageUnits
+    3701,  // gl_MaxTextureImageUnits
+    3703,  // gl_MaxFragmentUniformVectors
+    3705,  // gl_MaxVaryingVectors
+    3707,  // gl_MaxDrawBuffers
+    3709,  // gl_MaxDualSourceDrawBuffersEXT
+    3710,  // gl_MaxVertexOutputVectors
+    3712,  // gl_MaxFragmentInputVectors
+    3714,  // gl_MinProgramTexelOffset
+    3716,  // gl_MaxProgramTexelOffset
+    3718,  // gl_MaxImageUnits
+    3720,  // gl_MaxVertexImageUniforms
+    3722,  // gl_MaxFragmentImageUniforms
+    3724,  // gl_MaxComputeImageUniforms
+    3726,  // gl_MaxCombinedImageUniforms
+    3728,  // gl_MaxCombinedShaderOutputResources
+    3730,  // gl_MaxComputeWorkGroupCount
+    3732,  // gl_MaxComputeWorkGroupSize
+    3734,  // gl_MaxComputeUniformComponents
+    3736,  // gl_MaxComputeTextureImageUnits
+    3738,  // gl_MaxComputeAtomicCounters
+    3740,  // gl_MaxComputeAtomicCounterBuffers
+    3742,  // gl_MaxVertexAtomicCounters
+    3744,  // gl_MaxFragmentAtomicCounters
+    3746,  // gl_MaxCombinedAtomicCounters
+    3748,  // gl_MaxAtomicCounterBindings
+    3750,  // gl_MaxVertexAtomicCounterBuffers
+    3752,  // gl_MaxFragmentAtomicCounterBuffers
+    3754,  // gl_MaxCombinedAtomicCounterBuffers
+    3756,  // gl_MaxAtomicCounterBufferSize
+    3758,  // gl_MaxGeometryInputComponents
+    3762,  // gl_MaxGeometryOutputComponents
+    3766,  // gl_MaxGeometryImageUniforms
+    3770,  // gl_MaxGeometryTextureImageUnits
+    3774,  // gl_MaxGeometryOutputVertices
+    3778,  // gl_MaxGeometryTotalOutputComponents
+    3782,  // gl_MaxGeometryUniformComponents
+    3786,  // gl_MaxGeometryAtomicCounters
+    3790,  // gl_MaxGeometryAtomicCounterBuffers
+    3794,  // gl_MaxTessControlInputComponents
+    3797,  // gl_MaxTessControlOutputComponents
+    3800,  // gl_MaxTessControlTextureImageUnits
+    3803,  // gl_MaxTessControlUniformComponents
+    3806,  // gl_MaxTessControlTotalOutputComponents
+    3809,  // gl_MaxTessControlImageUniforms
+    3812,  // gl_MaxTessControlAtomicCounters
+    3815,  // gl_MaxTessControlAtomicCounterBuffers
+    3818,  // gl_MaxTessPatchComponents
+    3821,  // gl_MaxPatchVertices
+    3824,  // gl_MaxTessGenLevel
+    3827,  // gl_MaxTessEvaluationInputComponents
+    3830,  // gl_MaxTessEvaluationOutputComponents
+    3833,  // gl_MaxTessEvaluationTextureImageUnits
+    3836,  // gl_MaxTessEvaluationUniformComponents
+    3839,  // gl_MaxTessEvaluationImageUniforms
+    3842,  // gl_MaxTessEvaluationAtomicCounters
+    3845,  // gl_MaxTessEvaluationAtomicCounterBuffers
+    3848,  // gl_MaxSamples
+    3851,  // gl_MaxClipDistances
+    3852,  // gl_MaxCullDistances
+    3853,  // gl_MaxCombinedClipAndCullDistances
+    3854,  // gl_FragCoord
+    3858,  // gl_FrontFacing
+    3860,  // gl_PointCoord
+    3862,  // gl_FragColor
+    3864,  // gl_FragData
+    3866,  // gl_FragDepth
+    3868,  // gl_HelperInvocation
+    3870,  // gl_SecondaryFragColorEXT
+    3871,  // gl_SecondaryFragDataEXT
+    3872,  // gl_FragDepthEXT
+    3873,  // gl_LastFragData
+    3876,  // gl_LastFragColor
+    3877,  // gl_LastFragColorARM
+    3878,  // gl_PrimitiveID
+    3892,  // gl_Layer
+    3900,  // gl_SampleID
+    3903,  // gl_SamplePosition
+    3906,  // gl_SampleMaskIn
+    3909,  // gl_SampleMask
+    3912,  // gl_CullDistance
+    3914,  // gl_ClipDistance
+    3916,  // gl_Position
+    3928,  // gl_PointSize
+    3932,  // gl_InstanceID
+    3934,  // Empty
+    3934,  // gl_VertexID
+    3936,  // Empty
+    3936,  // Empty
+    3936,  // gl_DrawID
+    3937,  // gl_BaseVertex
+    3938,  // gl_BaseInstance
+    3939,  // angle_BaseVertex
+    3940,  // angle_BaseInstance
+    3941,  // gl_NumWorkGroups
+    3943,  // gl_WorkGroupSize
+    3945,  // gl_WorkGroupID
+    3947,  // gl_LocalInvocationID
+    3949,  // gl_GlobalInvocationID
+    3951,  // gl_LocalInvocationIndex
+    3953,  // gl_PrimitiveIDIn
+    3957,  // gl_InvocationID
+    3964,  // gl_PerVertex
+    3974,  // gl_in
+    3984,  // gl_PatchVerticesIn
+    3990,  // gl_TessLevelOuter
+    3996,  // gl_TessLevelInner
+    4002,  // gl_out
+    4008,  // gl_BoundingBoxEXT
+    4011,  // gl_TessCoord
+    4013,  // gl_ViewID_OVR
 };
 
 using Ext = TExtension;
@@ -39383,8 +39439,8 @@
      Shader::GEOMETRY},
     {"EndStreamPrimitive", std::array<TExtension, 1>{{Ext::UNDEFINED}}, Ext::UNDEFINED, -1, 400,
      Shader::GEOMETRY},
-    {"subpassLoad", std::array<TExtension, 1>{{Ext::UNDEFINED}}, Ext::UNDEFINED, -1, 460,
-     Shader::ALL},
+    {"subpassLoad", std::array<TExtension, 1>{{Ext::UNDEFINED}}, Ext::UNDEFINED, kESSLVulkanOnly,
+     460, Shader::ALL},
     {"anyInvocation", std::array<TExtension, 1>{{Ext::UNDEFINED}}, Ext::UNDEFINED, -1, 460,
      Shader::ALL},
     {"allInvocations", std::array<TExtension, 1>{{Ext::UNDEFINED}}, Ext::UNDEFINED, -1, 460,
@@ -40369,8 +40425,8 @@
         BuiltInId::gl_SecondaryFragDataEXT, BuiltInName::gl_SecondaryFragDataEXT,
         SymbolType::BuiltIn, std::array<TExtension, 1u>{{TExtension::EXT_blend_func_extended}},
         type_gl_SecondaryFragDataEXT);
-    TType *type_gl_FragDepthEXT = new TType(
-        EbtFloat, resources.FragmentPrecisionHigh ? EbpHigh : EbpMedium, EvqFragDepthEXT, 1);
+    TType *type_gl_FragDepthEXT =
+        new TType(EbtFloat, resources.FragmentPrecisionHigh ? EbpHigh : EbpMedium, EvqFragDepth, 1);
     type_gl_FragDepthEXT->realize();
     m_gl_FragDepthEXT = new TVariable(
         BuiltInId::gl_FragDepthEXT, BuiltInName::gl_FragDepthEXT, SymbolType::BuiltIn,
@@ -40599,6 +40655,19 @@
     m_gl_PositionTCSES3_2 = new TVariable(
         BuiltInId::gl_PositionTCSES3_2, BuiltInName::gl_Position, SymbolType::BuiltIn,
         std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, type_gl_PositionTCSES3_2);
+    TType *type_gl_BoundingBoxEXTTCS = new TType(EbtFloat, EbpHigh, EvqBoundingBoxEXT, 4);
+    type_gl_BoundingBoxEXTTCS->makeArray(4u);
+    type_gl_BoundingBoxEXTTCS->realize();
+    m_gl_BoundingBoxEXTTCS = new TVariable(
+        BuiltInId::gl_BoundingBoxEXTTCS, BuiltInName::gl_BoundingBoxEXT, SymbolType::BuiltIn,
+        std::array<TExtension, 1u>{{TExtension::EXT_tessellation_shader}},
+        type_gl_BoundingBoxEXTTCS);
+    TType *type_gl_BoundingBoxEXTTCSES3_2 = new TType(EbtFloat, EbpHigh, EvqBoundingBoxEXT, 4);
+    type_gl_BoundingBoxEXTTCSES3_2->makeArray(4u);
+    type_gl_BoundingBoxEXTTCSES3_2->realize();
+    m_gl_BoundingBoxEXTTCSES3_2 = new TVariable(
+        BuiltInId::gl_BoundingBoxEXTTCSES3_2, BuiltInName::gl_BoundingBoxEXT, SymbolType::BuiltIn,
+        std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, type_gl_BoundingBoxEXTTCSES3_2);
     TType *type_gl_TessLevelOuterTES = new TType(EbtFloat, EbpHigh, EvqTessLevelOuter, 1);
     type_gl_TessLevelOuterTES->makeArray(4u);
     type_gl_TessLevelOuterTES->realize();
@@ -40699,7 +40768,7 @@
 {
 uint16_t GetNextRuleIndex(uint32_t nameHash)
 {
-    if (nameHash == 2180 - 1)
+    if (nameHash == 2181 - 1)
         return ArraySize(BuiltInArray::kRules);
     return BuiltInArray::kMangledOffsets[nameHash + 1];
 }
@@ -40711,7 +40780,7 @@
         return nullptr;
 
     uint32_t nameHash = name.mangledNameHash();
-    if (nameHash >= 2180)
+    if (nameHash >= 2181)
         return nullptr;
 
     const char *actualName = BuiltInArray::kMangledNames[nameHash];
diff --git a/src/compiler/translator/SymbolTable_autogen.h b/src/compiler/translator/SymbolTable_autogen.h
index c123948..3a5fbb9 100644
--- a/src/compiler/translator/SymbolTable_autogen.h
+++ b/src/compiler/translator/SymbolTable_autogen.h
@@ -145,6 +145,8 @@
     TSymbol *m_gl_outTCSES3_2                                = nullptr;
     TSymbol *m_gl_PositionTCS                                = nullptr;
     TSymbol *m_gl_PositionTCSES3_2                           = nullptr;
+    TSymbol *m_gl_BoundingBoxEXTTCS                          = nullptr;
+    TSymbol *m_gl_BoundingBoxEXTTCSES3_2                     = nullptr;
     TSymbol *m_gl_TessLevelOuterTES                          = nullptr;
     TSymbol *m_gl_TessLevelOuterTESES3_2                     = nullptr;
     TSymbol *m_gl_TessLevelInnerTES                          = nullptr;
diff --git a/src/compiler/translator/TranslatorESSL.cpp b/src/compiler/translator/TranslatorESSL.cpp
index 3f5179e..f315233 100644
--- a/src/compiler/translator/TranslatorESSL.cpp
+++ b/src/compiler/translator/TranslatorESSL.cpp
@@ -9,7 +9,7 @@
 #include "angle_gl.h"
 #include "compiler/translator/BuiltInFunctionEmulatorGLSL.h"
 #include "compiler/translator/OutputESSL.h"
-#include "compiler/translator/tree_ops/gl/RecordConstantPrecision.h"
+#include "compiler/translator/tree_ops/RecordConstantPrecision.h"
 
 namespace sh
 {
@@ -46,10 +46,6 @@
     // like non-preprocessor tokens.
     WritePragma(sink, compileOptions, getPragma());
 
-    bool precisionEmulation = false;
-    if (!emulatePrecisionIfNeeded(root, sink, &precisionEmulation, SH_ESSL_OUTPUT))
-        return false;
-
     if (!RecordConstantPrecision(this, root, &getSymbolTable()))
     {
         return false;
@@ -94,8 +90,7 @@
     }
 
     // Write translated shader.
-    TOutputESSL outputESSL(sink, getHashFunction(), getNameMap(), &getSymbolTable(),
-                           getShaderType(), shaderVer, precisionEmulation, compileOptions);
+    TOutputESSL outputESSL(this, sink, compileOptions);
 
     root->traverse(&outputESSL);
 
diff --git a/src/compiler/translator/TranslatorGLSL.cpp b/src/compiler/translator/TranslatorGLSL.cpp
index 9dff0db..475924a 100644
--- a/src/compiler/translator/TranslatorGLSL.cpp
+++ b/src/compiler/translator/TranslatorGLSL.cpp
@@ -11,9 +11,9 @@
 #include "compiler/translator/ExtensionGLSL.h"
 #include "compiler/translator/OutputGLSL.h"
 #include "compiler/translator/VersionGLSL.h"
-#include "compiler/translator/tree_ops/RewriteRowMajorMatrices.h"
 #include "compiler/translator/tree_ops/RewriteTexelFetchOffset.h"
-#include "compiler/translator/tree_ops/gl/mac/RewriteUnaryMinusOperatorFloat.h"
+#include "compiler/translator/tree_ops/apple/RewriteRowMajorMatrices.h"
+#include "compiler/translator/tree_ops/apple/RewriteUnaryMinusOperatorFloat.h"
 
 namespace sh
 {
@@ -117,10 +117,6 @@
         }
     }
 
-    bool precisionEmulation = false;
-    if (!emulatePrecisionIfNeeded(root, sink, &precisionEmulation, getOutputType()))
-        return false;
-
     // Write emulated built-in functions if needed.
     if (!getBuiltInFunctionEmulator().isOutputEmpty())
     {
@@ -213,8 +209,7 @@
     }
 
     // Write translated shader.
-    TOutputGLSL outputGLSL(sink, getHashFunction(), getNameMap(), &getSymbolTable(),
-                           getShaderType(), getShaderVersion(), getOutputType(), compileOptions);
+    TOutputGLSL outputGLSL(this, sink, compileOptions);
 
     root->traverse(&outputGLSL);
 
diff --git a/src/compiler/translator/TranslatorHLSL.cpp b/src/compiler/translator/TranslatorHLSL.cpp
index 067d0c0..871cad7 100644
--- a/src/compiler/translator/TranslatorHLSL.cpp
+++ b/src/compiler/translator/TranslatorHLSL.cpp
@@ -38,6 +38,22 @@
                                ShCompileOptions compileOptions,
                                PerformanceDiagnostics *perfDiagnostics)
 {
+    // A few transformations leave the tree in an inconsistent state.  For example, when unfolding
+    // the short-circuit in the following function:
+    //
+    //     mediump float f(float a) { return a > 0 ? 0.0 : 1.0; }
+    //
+    // a temp variable is created to hold the result of the expression.  Currently the precision of
+    // the return value of the function is not propagated to its return expressions.  Additionally,
+    // an expression such as
+    //
+    //     cond ? gl_NumWorkGroups.x : gl_NumWorkGroups.y
+    //
+    // does not have a precision as the built-in does not specify a precision.
+    //
+    // Precision is not applicable to HLSL so fixing these issues are deferred.
+    mValidateASTOptions.validatePrecision = false;
+
     const ShBuiltInResources &resources = getResources();
     int numRenderTargets                = resources.EXT_draw_buffers ? resources.MaxDrawBuffers : 1;
     int maxDualSourceDrawBuffers =
@@ -138,10 +154,6 @@
         return false;
     }
 
-    bool precisionEmulation = false;
-    if (!emulatePrecisionIfNeeded(root, getInfoSink().obj, &precisionEmulation, getOutputType()))
-        return false;
-
     if ((compileOptions & SH_EXPAND_SELECT_HLSL_INTEGER_POW_EXPRESSIONS) != 0)
     {
         if (!sh::ExpandIntegerPowExpressions(this, root, &getSymbolTable()))
diff --git a/src/compiler/translator/TranslatorMetal.cpp b/src/compiler/translator/TranslatorMetal.cpp
index 8e90a4f..f6f2116 100644
--- a/src/compiler/translator/TranslatorMetal.cpp
+++ b/src/compiler/translator/TranslatorMetal.cpp
@@ -16,7 +16,7 @@
 
 #include "angle_gl.h"
 #include "common/utilities.h"
-#include "compiler/translator/OutputVulkanGLSLForMetal.h"
+#include "compiler/translator/OutputVulkanGLSL.h"
 #include "compiler/translator/StaticType.h"
 #include "compiler/translator/tree_ops/InitializeVariables.h"
 #include "compiler/translator/tree_util/BuiltIn.h"
@@ -42,10 +42,11 @@
 namespace
 {
 // Metal specific driver uniforms
-constexpr const char kHalfRenderArea[] = "halfRenderArea";
-constexpr const char kFlipXY[]         = "flipXY";
-constexpr const char kNegFlipXY[]      = "negFlipXY";
-constexpr const char kCoverageMask[]   = "coverageMask";
+constexpr const char kHalfRenderArea[]     = "halfRenderArea";
+constexpr const char kFlipXY[]             = "flipXY";
+constexpr const char kNegFlipXY[]          = "negFlipXY";
+constexpr const char kEmulatedInstanceID[] = "emulatedInstanceID";
+constexpr const char kCoverageMask[]       = "coverageMask";
 
 constexpr ImmutableString kSampleMaskWriteFuncName = ImmutableString("ANGLEWriteSampleMask");
 
@@ -116,19 +117,23 @@
 }  // anonymous namespace
 
 // class DriverUniformMetal
+// The fields here must match the DriverUniforms structure defined in ContextMtl.h.
 TFieldList *DriverUniformMetal::createUniformFields(TSymbolTable *symbolTable)
 {
     TFieldList *driverFieldList = DriverUniform::createUniformFields(symbolTable);
 
-    constexpr size_t kNumGraphicsDriverUniformsMetal = 4;
+    constexpr size_t kNumGraphicsDriverUniformsMetal = 5;
     constexpr std::array<const char *, kNumGraphicsDriverUniformsMetal>
-        kGraphicsDriverUniformNamesMetal = {{kHalfRenderArea, kFlipXY, kNegFlipXY, kCoverageMask}};
+        kGraphicsDriverUniformNamesMetal = {
+            {kHalfRenderArea, kFlipXY, kNegFlipXY, kEmulatedInstanceID, kCoverageMask}};
 
     const std::array<TType *, kNumGraphicsDriverUniformsMetal> kDriverUniformTypesMetal = {{
-        new TType(EbtFloat, 2),  // halfRenderArea
-        new TType(EbtFloat, 2),  // flipXY
-        new TType(EbtFloat, 2),  // negFlipXY
-        new TType(EbtUInt),      // kCoverageMask
+        new TType(EbtFloat, EbpHigh, EvqGlobal, 2),  // halfRenderArea
+        new TType(EbtFloat, EbpLow, EvqGlobal, 2),   // flipXY
+        new TType(EbtFloat, EbpLow, EvqGlobal, 2),   // negFlipXY
+        new TType(EbtUInt, EbpHigh,
+                  EvqGlobal),  // kEmulatedInstanceID - unused in SPIR-V Metal compiler
+        new TType(EbtUInt, EbpHigh, EvqGlobal),  // kCoverageMask
     }};
 
     for (size_t uniformIndex = 0; uniformIndex < kNumGraphicsDriverUniformsMetal; ++uniformIndex)
@@ -240,9 +245,7 @@
     }
 
     // Write translated shader.
-    TOutputVulkanGLSL outputGLSL(sink, getHashFunction(), getNameMap(), &getSymbolTable(),
-                                 getShaderType(), getShaderVersion(), getOutputType(), false, true,
-                                 compileOptions);
+    TOutputVulkanGLSL outputGLSL(this, sink, true, compileOptions);
     root->traverse(&outputGLSL);
 
     return compileToSpirv(sink);
@@ -284,8 +287,10 @@
     const DriverUniformMetal *driverUniforms)
 {
     // This transformation leaves the tree in an inconsistent state by using a variable that's
-    // defined in text, outside of the knowledge of the AST.
+    // defined in text, outside of the knowledge of the AST.  Same with defining the function in
+    // text.
     mValidateASTOptions.validateVariableReferences = false;
+    mValidateASTOptions.validateFunctionCall       = false;
 
     TSymbolTable *symbolTable = &getSymbolTable();
 
@@ -309,7 +314,7 @@
 
     TFunction *sampleMaskWriteFunc =
         new TFunction(symbolTable, kSampleMaskWriteFuncName, SymbolType::AngleInternal,
-                      StaticType::GetBasic<EbtVoid>(), false);
+                      StaticType::GetBasic<EbtVoid, EbpUndefined>(), false);
 
     TType *uintType = new TType(EbtUInt);
     TVariable *maskArg =
@@ -369,10 +374,10 @@
     // Create vec4(-3, -3, -3, 1):
     auto vec4Type = new TType(EbtFloat, 4);
     TIntermSequence vec4Args;
-    vec4Args.push_back(CreateFloatNode(-3.0f));
-    vec4Args.push_back(CreateFloatNode(-3.0f));
-    vec4Args.push_back(CreateFloatNode(-3.0f));
-    vec4Args.push_back(CreateFloatNode(1.0f));
+    vec4Args.push_back(CreateFloatNode(-3.0f, EbpMedium));
+    vec4Args.push_back(CreateFloatNode(-3.0f, EbpMedium));
+    vec4Args.push_back(CreateFloatNode(-3.0f, EbpMedium));
+    vec4Args.push_back(CreateFloatNode(1.0f, EbpMedium));
     TIntermAggregate *constVarConstructor =
         TIntermAggregate::CreateConstructor(*vec4Type, &vec4Args);
 
diff --git a/src/compiler/translator/TranslatorMetalDirect.cpp b/src/compiler/translator/TranslatorMetalDirect.cpp
index 48c6fc6..afa8348 100644
--- a/src/compiler/translator/TranslatorMetalDirect.cpp
+++ b/src/compiler/translator/TranslatorMetalDirect.cpp
@@ -10,9 +10,8 @@
 #include "common/utilities.h"
 #include "compiler/translator/BuiltinsWorkaroundGLSL.h"
 #include "compiler/translator/ImmutableStringBuilder.h"
-#include "compiler/translator/OutputVulkanGLSL.h"
+#include "compiler/translator/OutputGLSLBase.h"
 #include "compiler/translator/StaticType.h"
-#include "compiler/translator/TranslatorMetalDirect/AddExplicitTypeCasts.h"
 #include "compiler/translator/TranslatorMetalDirect/AstHelpers.h"
 #include "compiler/translator/TranslatorMetalDirect/EmitMetal.h"
 #include "compiler/translator/TranslatorMetalDirect/FixTypeConstructors.h"
@@ -33,15 +32,19 @@
 #include "compiler/translator/TranslatorMetalDirect/ToposortStructs.h"
 #include "compiler/translator/TranslatorMetalDirect/TranslatorMetalUtils.h"
 #include "compiler/translator/TranslatorMetalDirect/WrapMain.h"
+#include "compiler/translator/tree_ops/ConvertUnsupportedConstructorsToFunctionCalls.h"
 #include "compiler/translator/tree_ops/InitializeVariables.h"
+#include "compiler/translator/tree_ops/MonomorphizeUnsupportedFunctions.h"
 #include "compiler/translator/tree_ops/NameNamelessUniformBuffers.h"
 #include "compiler/translator/tree_ops/RemoveAtomicCounterBuiltins.h"
 #include "compiler/translator/tree_ops/RemoveInactiveInterfaceVariables.h"
+#include "compiler/translator/tree_ops/RewriteArrayOfArrayOfOpaqueUniforms.h"
 #include "compiler/translator/tree_ops/RewriteAtomicCounters.h"
 #include "compiler/translator/tree_ops/RewriteCubeMapSamplersAs2DArray.h"
 #include "compiler/translator/tree_ops/RewriteDfdy.h"
-#include "compiler/translator/tree_ops/RewriteRowMajorMatrices.h"
 #include "compiler/translator/tree_ops/RewriteStructSamplers.h"
+#include "compiler/translator/tree_ops/SeparateStructFromUniformDeclarations.h"
+#include "compiler/translator/tree_ops/apple/RewriteRowMajorMatrices.h"
 #include "compiler/translator/tree_util/BuiltIn.h"
 #include "compiler/translator/tree_util/DriverUniform.h"
 #include "compiler/translator/tree_util/FindFunction.h"
@@ -175,7 +178,7 @@
         if (mInDefaultUniform)
         {
             const ImmutableString &name = symbol->variable().name();
-            ASSERT(!name.beginsWith("gl_"));
+            ASSERT(!gl::IsBuiltInName(name.data()));
             (*mSink) << HashName(&symbol->variable(), mHashFunction, mNameMap)
                      << ArrayString(symbol->getType());
         }
@@ -263,7 +266,7 @@
     TIntermSwizzle *builtinXY    = new TIntermSwizzle(builtinRef, swizzleOffsetXY);
 
     // Create a symbol reference to our new variable that will hold the modified builtin.
-    const TType *type = StaticType::GetForVec<EbtFloat>(
+    const TType *type = StaticType::GetForVec<EbtFloat, EbpHigh>(
         EvqGlobal, static_cast<unsigned char>(builtin->getType().getNominalSize()));
     TVariable *replacementVar =
         new TVariable(symbolTable, flippedVariableName.rawName(), type, SymbolType::AngleInternal);
@@ -341,9 +344,11 @@
             fragRotation = driverUniforms->getFragRotationMatrixRef();
         }
     }
+
+    const TVariable *fragCoord = static_cast<const TVariable *>(
+        symbolTable->findBuiltIn(ImmutableString("gl_FragCoord"), compiler->getShaderVersion()));
     return RotateAndFlipBuiltinVariable(compiler, root, insertSequence, flipXY, symbolTable,
-                                        BuiltInVariable::gl_FragCoord(), kFlippedFragCoordName,
-                                        pivot, fragRotation);
+                                        fragCoord, kFlippedFragCoordName, pivot, fragRotation);
 }
 
 void DeclareRightBeforeMain(TIntermBlock &root, const TVariable &var)
@@ -491,6 +496,8 @@
     // This transformation leaves the tree in an inconsistent state by using a variable that's
     // defined in text, outside of the knowledge of the AST.
     mValidateASTOptions.validateVariableReferences = false;
+    // It also uses a function call (ANGLE_writeSampleMask) that's unknown to the AST.
+    mValidateASTOptions.validateFunctionCall = false;
 
     TSymbolTable *symbolTable = &getSymbolTable();
 
@@ -501,9 +508,9 @@
         new TVariable(symbolTable, sh::ImmutableString(sh::mtl::kCoverageMaskEnabledConstName),
                       boolType, SymbolType::AngleInternal);
 
-    TFunction *sampleMaskWriteFunc = new TFunction(symbolTable, kSampleMaskWriteFuncName.rawName(),
-                                                   kSampleMaskWriteFuncName.symbolType(),
-                                                   StaticType::GetBasic<EbtVoid>(), false);
+    TFunction *sampleMaskWriteFunc = new TFunction(
+        symbolTable, kSampleMaskWriteFuncName.rawName(), kSampleMaskWriteFuncName.symbolType(),
+        StaticType::GetBasic<EbtVoid, EbpUndefined>(), false);
 
     TType *uintType = new TType(EbtUInt);
     TVariable *maskArg =
@@ -556,10 +563,10 @@
     // Create vec4(-3, -3, -3, 1):
     auto vec4Type             = new TType(EbtFloat, 4);
     TIntermSequence *vec4Args = new TIntermSequence();
-    vec4Args->push_back(CreateFloatNode(-3.0f));
-    vec4Args->push_back(CreateFloatNode(-3.0f));
-    vec4Args->push_back(CreateFloatNode(-3.0f));
-    vec4Args->push_back(CreateFloatNode(1.0f));
+    vec4Args->push_back(CreateFloatNode(-3.0f, EbpMedium));
+    vec4Args->push_back(CreateFloatNode(-3.0f, EbpMedium));
+    vec4Args->push_back(CreateFloatNode(-3.0f, EbpMedium));
+    vec4Args->push_back(CreateFloatNode(1.0f, EbpMedium));
     TIntermAggregate *constVarConstructor =
         TIntermAggregate::CreateConstructor(*vec4Type, vec4Args);
 
@@ -604,6 +611,38 @@
     return RunAtTheEndOfShader(this, root, assignment, &getSymbolTable());
 }
 
+// This operation performs the viewport depth translation needed by Metal. GL uses a
+// clip space z range of -1 to +1 where as Metal uses 0 to 1. The translation becomes
+// this expression
+//
+//     z_metal = 0.5 * (w_gl + z_gl)
+//
+// where z_metal is the depth output of a Metal vertex shader and z_gl is the same for GL.
+bool TranslatorMetalDirect::appendVertexShaderDepthCorrectionToMain(TIntermBlock *root)
+{
+    const TVariable *position  = BuiltInVariable::gl_Position();
+    TIntermSymbol *positionRef = new TIntermSymbol(position);
+
+    TVector<int> swizzleOffsetZ = {2};
+    TIntermSwizzle *positionZ   = new TIntermSwizzle(positionRef, swizzleOffsetZ);
+
+    TIntermConstantUnion *oneHalf = CreateFloatNode(0.5f, EbpMedium);
+
+    TVector<int> swizzleOffsetW = {3};
+    TIntermSwizzle *positionW   = new TIntermSwizzle(positionRef->deepCopy(), swizzleOffsetW);
+
+    // Create the expression "(gl_Position.z + gl_Position.w) * 0.5".
+    TIntermBinary *zPlusW = new TIntermBinary(EOpAdd, positionZ->deepCopy(), positionW->deepCopy());
+    TIntermBinary *halfZPlusW = new TIntermBinary(EOpMul, zPlusW, oneHalf->deepCopy());
+
+    // Create the assignment "gl_Position.z = (gl_Position.z + gl_Position.w) * 0.5"
+    TIntermTyped *positionZLHS = positionZ->deepCopy();
+    TIntermBinary *assignment  = new TIntermBinary(TOperator::EOpAssign, positionZLHS, halfZPlusW);
+
+    // Append the assignment as a statement at the end of the shader.
+    return RunAtTheEndOfShader(this, root, assignment, &getSymbolTable());
+}
+
 static std::set<ImmutableString> GetMslKeywords()
 {
     std::set<ImmutableString> keywords;
@@ -756,6 +795,21 @@
         }
     }
 
+    // If there are any function calls that take array-of-array of opaque uniform parameters, or
+    // other opaque uniforms that need special handling in Vulkan, such as atomic counters,
+    // monomorphize the functions by removing said parameters and replacing them in the function
+    // body with the call arguments.
+    //
+    // This has a few benefits:
+    //
+    // - It dramatically simplifies future transformations w.r.t to samplers in structs, array of
+    //   arrays of opaque types, atomic counters etc.
+    // - Avoids the need for shader*ArrayDynamicIndexing Vulkan features.
+    if (!MonomorphizeUnsupportedFunctions(this, root, &getSymbolTable(), compileOptions))
+    {
+        return false;
+    }
+
     if (aggregateTypesUsedForUniforms > 0)
     {
         if (!NameEmbeddedStructUniformsMetal(this, root, &symbolTable))
@@ -763,17 +817,28 @@
             return false;
         }
 
-        int removedUniformsCount;
-        bool rewriteStructSamplersResult =
-            RewriteStructSamplers(this, root, &symbolTable, &removedUniformsCount);
+        if (!SeparateStructFromUniformDeclarations(this, root, &getSymbolTable()))
+        {
+            return false;
+        }
 
-        if (!rewriteStructSamplersResult)
+        int removedUniformsCount;
+
+        if (!RewriteStructSamplers(this, root, &getSymbolTable(), &removedUniformsCount))
         {
             return false;
         }
         defaultUniformCount -= removedUniformsCount;
     }
 
+    // Replace array of array of opaque uniforms with a flattened array.  This is run after
+    // MonomorphizeUnsupportedFunctions and RewriteStructSamplers so that it's not possible for an
+    // array of array of opaque type to be partially subscripted and passed to a function.
+    if (!RewriteArrayOfArrayOfOpaqueUniforms(this, root, &getSymbolTable()))
+    {
+        return false;
+    }
+
     if (compileOptions & SH_EMULATE_SEAMFUL_CUBE_MAP_SAMPLING)
     {
         if (!RewriteCubeMapSamplersAs2DArray(this, root, &symbolTable,
@@ -948,7 +1013,7 @@
             {
                 flipNegXY = driverUniforms->getNegFlipXYRef();
             }
-            TIntermConstantUnion *pivot = CreateFloatNode(0.5f);
+            TIntermConstantUnion *pivot = CreateFloatNode(0.5f, EbpMedium);
             TIntermTyped *fragRotation  = nullptr;
             if (usePreRotation)
             {
@@ -974,7 +1039,9 @@
             {
                 return false;
             }
-            DeclareRightBeforeMain(*root, *BuiltInVariable::gl_FragCoord());
+            const TVariable *fragCoord = static_cast<const TVariable *>(
+                getSymbolTable().findBuiltIn(ImmutableString("gl_FragCoord"), getShaderVersion()));
+            DeclareRightBeforeMain(*root, *fragCoord);
         }
 
         if (!RewriteDfdy(this, compileOptions, root, getSymbolTable(), getShaderVersion(),
@@ -996,7 +1063,9 @@
 
         if (FindSymbolNode(root, BuiltInVariable::gl_PointSize()->name()))
         {
-            DeclareRightBeforeMain(*root, *BuiltInVariable::gl_PointSize());
+            const TVariable *pointSize = static_cast<const TVariable *>(
+                getSymbolTable().findBuiltIn(ImmutableString("gl_PointSize"), getShaderVersion()));
+            DeclareRightBeforeMain(*root, *pointSize);
         }
 
         if (FindSymbolNode(root, BuiltInVariable::gl_VertexIndex()->name()))
@@ -1031,6 +1100,11 @@
             return false;
         }
 
+        if (!appendVertexShaderDepthCorrectionToMain(root))
+        {
+            return false;
+        }
+
         if ((compileOptions & SH_ADD_PRE_ROTATION) != 0 &&
             !AppendPreRotation(this, root, &getSymbolTable(), specConst, driverUniforms))
         {
@@ -1089,12 +1163,12 @@
         return false;
     }
 
-    if (!ReduceInterfaceBlocks(*this, *root, idGen))
+    if (!ReduceInterfaceBlocks(*this, *root, idGen, &getSymbolTable()))
     {
         return false;
     }
 
-    if (!SeparateCompoundStructDeclarations(*this, idGen, *root))
+    if (!SeparateCompoundStructDeclarations(*this, idGen, *root, &getSymbolTable()))
     {
         return false;
     }
@@ -1113,7 +1187,7 @@
         return false;
     }
 
-    if (!AddExplicitTypeCasts(*this, *root, symbolEnv))
+    if (!ConvertUnsupportedConstructorsToFunctionCalls(*this, *root))
     {
         return false;
     }
@@ -1122,6 +1196,10 @@
     // references to structures like "ANGLE_TextureEnv<metal::texture2d<float>>" which are
     // defined in text (in ProgramPrelude), outside of the knowledge of the AST.
     mValidateASTOptions.validateStructUsage = false;
+    // The RewritePipelines phase also generates incoming arguments to synthesized
+    // functions that use are missing qualifiers - for example, angleUniforms isn't marked
+    // as an incoming argument.
+    mValidateASTOptions.validateQualifiers = false;
 
     PipelineStructs pipelineStructs;
     if (!RewritePipelines(*this, *root, idGen, *driverUniforms, symbolEnv, invariants,
@@ -1183,6 +1261,12 @@
         return false;
     }
 
+    // TODO: refactor the code in TranslatorMetalDirect to not issue raw function calls.
+    // http://anglebug.com/6059#c2
+    mValidateASTOptions.validateNoRawFunctionCalls = false;
+    // A validation error is generated in this backend due to bool uniforms.
+    mValidateASTOptions.validatePrecision = false;
+
     TInfoSinkBase &sink = getInfoSink().obj;
 
     if ((compileOptions & SH_REWRITE_ROW_MAJOR_MATRICES) != 0 && getShaderVersion() >= 300)
@@ -1202,12 +1286,6 @@
         }
     }
 
-    bool precisionEmulation = false;
-    if (!emulatePrecisionIfNeeded(root, sink, &precisionEmulation, SH_SPIRV_VULKAN_OUTPUT))
-    {
-        return false;
-    }
-
     SpecConst specConst(&getSymbolTable(), compileOptions, getShaderType());
     DriverUniformExtended driverUniforms(DriverUniformMode::Structure);
     if (!translateImpl(sink, root, compileOptions, perfDiagnostics, &specConst, &driverUniforms))
diff --git a/src/compiler/translator/TranslatorMetalDirect.h b/src/compiler/translator/TranslatorMetalDirect.h
index d69b06f..6a1cf04 100644
--- a/src/compiler/translator/TranslatorMetalDirect.h
+++ b/src/compiler/translator/TranslatorMetalDirect.h
@@ -177,6 +177,8 @@
     ANGLE_NO_DISCARD bool transformDepthBeforeCorrection(TIntermBlock *root,
                                                          const DriverUniform *driverUniforms);
 
+    ANGLE_NO_DISCARD bool appendVertexShaderDepthCorrectionToMain(TIntermBlock *root);
+
     ANGLE_NO_DISCARD bool insertSampleMaskWritingLogic(TIntermBlock &root,
                                                        DriverUniform &driverUniforms);
     ANGLE_NO_DISCARD bool insertRasterizationDiscardLogic(TIntermBlock &root);
diff --git a/src/compiler/translator/TranslatorMetalDirect/AddExplicitTypeCasts.cpp b/src/compiler/translator/TranslatorMetalDirect/AddExplicitTypeCasts.cpp
deleted file mode 100644
index cfa8123..0000000
--- a/src/compiler/translator/TranslatorMetalDirect/AddExplicitTypeCasts.cpp
+++ /dev/null
@@ -1,95 +0,0 @@
-//
-// Copyright 2020 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-
-#include "compiler/translator/TranslatorMetalDirect/AddExplicitTypeCasts.h"
-#include "compiler/translator/TranslatorMetalDirect/AstHelpers.h"
-#include "compiler/translator/TranslatorMetalDirect/IntermRebuild.h"
-
-using namespace sh;
-
-namespace
-{
-
-class Rewriter : public TIntermRebuild
-{
-    SymbolEnv &mSymbolEnv;
-
-  public:
-    Rewriter(TCompiler &compiler, SymbolEnv &symbolEnv)
-        : TIntermRebuild(compiler, false, true), mSymbolEnv(symbolEnv)
-    {}
-
-    PostResult visitAggregatePost(TIntermAggregate &callNode) override
-    {
-        const size_t argCount = callNode.getChildCount();
-        const TType &retType  = callNode.getType();
-
-        if (callNode.isConstructor())
-        {
-            if (IsScalarBasicType(retType))
-            {
-                if (argCount == 1)
-                {
-                    TIntermTyped &arg   = GetArg(callNode, 0);
-                    const TType argType = arg.getType();
-                    if (argType.isVector())
-                    {
-                        return CoerceSimple(retType, SubVector(arg, 0, 1));
-                    }
-                }
-            }
-            else if (retType.isVector())
-            {
-                if (argCount == 1)
-                {
-                    TIntermTyped &arg   = GetArg(callNode, 0);
-                    const TType argType = arg.getType();
-                    if (argType.isVector())
-                    {
-                        return CoerceSimple(retType, SubVector(arg, 0, retType.getNominalSize()));
-                    }
-                }
-                for (size_t i = 0; i < argCount; ++i)
-                {
-                    TIntermTyped &arg = GetArg(callNode, i);
-                    SetArg(callNode, i, CoerceSimple(retType.getBasicType(), arg));
-                }
-            }
-            else if (retType.isMatrix())
-            {
-                if (argCount == 1)
-                {
-                    TIntermTyped &arg   = GetArg(callNode, 0);
-                    const TType argType = arg.getType();
-                    if (argType.isMatrix())
-                    {
-                        if (retType.getCols() != argType.getCols() ||
-                            retType.getRows() != argType.getRows())
-                        {
-                            TemplateArg templateArgs[] = {retType.getCols(), retType.getRows()};
-                            return mSymbolEnv.callFunctionOverload(
-                                Name("cast"), retType, *new TIntermSequence{&arg}, 2, templateArgs);
-                        }
-                    }
-                }
-            }
-        }
-
-        return callNode;
-    }
-};
-
-}  // anonymous namespace
-
-bool sh::AddExplicitTypeCasts(TCompiler &compiler, TIntermBlock &root, SymbolEnv &symbolEnv)
-{
-    Rewriter rewriter(compiler, symbolEnv);
-    if (!rewriter.rebuildRoot(root))
-    {
-        return false;
-    }
-    return true;
-}
diff --git a/src/compiler/translator/TranslatorMetalDirect/AddExplicitTypeCasts.h b/src/compiler/translator/TranslatorMetalDirect/AddExplicitTypeCasts.h
deleted file mode 100644
index 5034288..0000000
--- a/src/compiler/translator/TranslatorMetalDirect/AddExplicitTypeCasts.h
+++ /dev/null
@@ -1,24 +0,0 @@
-//
-// Copyright 2020 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-
-#ifndef COMPILER_TRANSLATOR_TRANSLATORMETALDIRECT_ADDEXPLICITTYPECASTS_H_
-#define COMPILER_TRANSLATOR_TRANSLATORMETALDIRECT_ADDEXPLICITTYPECASTS_H_
-
-#include "compiler/translator/Compiler.h"
-#include "compiler/translator/TranslatorMetalDirect/ProgramPrelude.h"
-#include "compiler/translator/TranslatorMetalDirect/SymbolEnv.h"
-
-namespace sh
-{
-
-// Adds explicit type casts into the AST where casting is done implicitly.
-ANGLE_NO_DISCARD bool AddExplicitTypeCasts(TCompiler &compiler,
-                                           TIntermBlock &root,
-                                           SymbolEnv &symbolEnv);
-
-}  // namespace sh
-
-#endif  // COMPILER_TRANSLATOR_TRANSLATORMETALDIRECT_ADDEXPLICITTYPECASTS_H_
diff --git a/src/compiler/translator/TranslatorMetalDirect/AstHelpers.cpp b/src/compiler/translator/TranslatorMetalDirect/AstHelpers.cpp
index 4ba4ec7..950079a 100644
--- a/src/compiler/translator/TranslatorMetalDirect/AstHelpers.cpp
+++ b/src/compiler/translator/TranslatorMetalDirect/AstHelpers.cpp
@@ -39,8 +39,8 @@
 const TVariable &sh::CreateStructTypeVariable(TSymbolTable &symbolTable,
                                               const TStructure &structure)
 {
-    auto *type = new TType(&structure, true);
-    auto *var  = new TVariable(&symbolTable, ImmutableString(""), type, SymbolType::Empty);
+    TType *type    = new TType(&structure, true);
+    TVariable *var = new TVariable(&symbolTable, ImmutableString(""), type, SymbolType::Empty);
     return *var;
 }
 
@@ -50,13 +50,13 @@
                                             TQualifier qualifier,
                                             const TSpan<const unsigned int> *arraySizes)
 {
-    auto *type = new TType(&structure, false);
+    TType *type = new TType(&structure, false);
     type->setQualifier(qualifier);
     if (arraySizes)
     {
         type->makeArrays(*arraySizes);
     }
-    auto *var = new TVariable(&symbolTable, name.rawName(), type, name.symbolType());
+    TVariable *var = new TVariable(&symbolTable, name.rawName(), type, name.symbolType());
     return *var;
 }
 
@@ -75,7 +75,7 @@
 
 TIntermSequence &sh::CloneSequenceAndPrepend(const TIntermSequence &seq, TIntermNode &node)
 {
-    auto *newSeq = new TIntermSequence();
+    TIntermSequence *newSeq = new TIntermSequence();
     newSeq->push_back(&node);
 
     for (TIntermNode *oldNode : seq)
@@ -104,8 +104,9 @@
 
     Name newName = idGen.createNewName(Name(oldFunc));
 
-    auto &newFunc = *new TFunction(&symbolTable, newName.rawName(), newName.symbolType(),
-                                   &oldFunc.getReturnType(), oldFunc.isKnownToNotHaveSideEffects());
+    TFunction &newFunc =
+        *new TFunction(&symbolTable, newName.rawName(), newName.symbolType(),
+                       &oldFunc.getReturnType(), oldFunc.isKnownToNotHaveSideEffects());
 
     AcquireFunctionExtras(newFunc, oldFunc);
     AddParametersFrom(newFunc, oldFunc);
@@ -123,8 +124,9 @@
 
     Name newName = idGen ? idGen->createNewName(Name(oldFunc)) : Name(oldFunc);
 
-    auto &newFunc = *new TFunction(&symbolTable, newName.rawName(), newName.symbolType(),
-                                   &oldFunc.getReturnType(), oldFunc.isKnownToNotHaveSideEffects());
+    TFunction &newFunc =
+        *new TFunction(&symbolTable, newName.rawName(), newName.symbolType(),
+                       &oldFunc.getReturnType(), oldFunc.isKnownToNotHaveSideEffects());
 
     AcquireFunctionExtras(newFunc, oldFunc);
     newFunc.addParameter(&newParam);
@@ -143,12 +145,13 @@
 
     Name newName = idGen ? idGen->createNewName(Name(oldFunc)) : Name(oldFunc);
 
-    auto &newFunc = *new TFunction(&symbolTable, newName.rawName(), newName.symbolType(),
-                                   &oldFunc.getReturnType(), oldFunc.isKnownToNotHaveSideEffects());
+    TFunction &newFunc =
+        *new TFunction(&symbolTable, newName.rawName(), newName.symbolType(),
+                       &oldFunc.getReturnType(), oldFunc.isKnownToNotHaveSideEffects());
 
     AcquireFunctionExtras(newFunc, oldFunc);
     AddParametersFrom(newFunc, oldFunc);
-    for (auto *param : newParams)
+    for (const TVariable *param : newParams)
     {
         newFunc.addParameter(param);
     }
@@ -165,9 +168,9 @@
 
     Name newName = idGen ? idGen->createNewName(Name(oldFunc)) : Name(oldFunc);
 
-    auto *newReturnType = new TType(&newReturn, true);
-    auto &newFunc       = *new TFunction(&symbolTable, newName.rawName(), newName.symbolType(),
-                                   newReturnType, oldFunc.isKnownToNotHaveSideEffects());
+    TType *newReturnType = new TType(&newReturn, true);
+    TFunction &newFunc   = *new TFunction(&symbolTable, newName.rawName(), newName.symbolType(),
+                                        newReturnType, oldFunc.isKnownToNotHaveSideEffects());
 
     AcquireFunctionExtras(newFunc, oldFunc);
     AddParametersFrom(newFunc, oldFunc);
@@ -178,9 +181,9 @@
 TIntermTyped &sh::GetArg(const TIntermAggregate &call, size_t index)
 {
     ASSERT(index < call.getChildCount());
-    auto *arg = call.getChildNode(index);
+    TIntermNode *arg = call.getChildNode(index);
     ASSERT(arg);
-    auto *targ = arg->getAsTyped();
+    TIntermTyped *targ = arg->getAsTyped();
     ASSERT(targ);
     return *targ;
 }
@@ -246,7 +249,7 @@
     ASSERT(type.isArray() || type.isVector() || type.isMatrix());
 #endif
 
-    auto *accessNode = new TIntermBinary(
+    TIntermBinary *accessNode = new TIntermBinary(
         TOperator::EOpIndexDirect, &indexableNode,
         new TIntermConstantUnion(new TConstantUnion(index), *new TType(TBasicType::EbtInt)));
     return *accessNode;
@@ -273,7 +276,7 @@
     }
     TVector<int> offsets(static_cast<size_t>(end - begin));
     std::iota(offsets.begin(), offsets.end(), begin);
-    auto *swizzle = new TIntermSwizzle(&vectorNode, offsets);
+    TIntermSwizzle *swizzle = new TIntermSwizzle(&vectorNode, offsets);
     return *swizzle;
 }
 
@@ -316,28 +319,16 @@
     return HasScalarBasicType(type.getBasicType());
 }
 
-static void InitType(TType &type)
-{
-    if (type.isArray())
-    {
-        auto sizes = type.getArraySizes();
-        type.toArrayBaseType();
-        type.makeArrays(sizes);
-    }
-}
-
 TType &sh::CloneType(const TType &type)
 {
-    auto &clone = *new TType(type);
-    InitType(clone);
+    TType &clone = *new TType(type);
     return clone;
 }
 
 TType &sh::InnermostType(const TType &type)
 {
-    auto &inner = *new TType(type);
+    TType &inner = *new TType(type);
     inner.toArrayBaseType();
-    InitType(inner);
     return inner;
 }
 
@@ -345,26 +336,18 @@
 {
     ASSERT(matrixType.isMatrix());
     ASSERT(HasScalarBasicType(matrixType));
-    const char *mangledName = nullptr;
 
-    auto &vectorType =
-        *new TType(matrixType.getBasicType(), matrixType.getPrecision(), matrixType.getQualifier(),
-                   matrixType.getRows(), 1, matrixType.getArraySizes(), mangledName);
-    InitType(vectorType);
+    TType &vectorType = *new TType(matrixType);
+    vectorType.toMatrixColumnType();
     return vectorType;
 }
 
 TType &sh::DropOuterDimension(const TType &arrayType)
 {
     ASSERT(arrayType.isArray());
-    const char *mangledName = nullptr;
-    const auto &arraySizes  = arrayType.getArraySizes();
 
-    auto &innerType =
-        *new TType(arrayType.getBasicType(), arrayType.getPrecision(), arrayType.getQualifier(),
-                   arrayType.getNominalSize(), arrayType.getSecondarySize(),
-                   arraySizes.subspan(0, arraySizes.size() - 1), mangledName);
-    InitType(innerType);
+    TType &innerType = *new TType(arrayType);
+    innerType.toArrayElementType();
     return innerType;
 }
 
@@ -373,11 +356,10 @@
     ASSERT(1 < primary && primary <= 4);
     ASSERT(1 <= secondary && secondary <= 4);
     ASSERT(HasScalarBasicType(type));
-    const char *mangledName = nullptr;
 
-    auto &newType = *new TType(type.getBasicType(), type.getPrecision(), type.getQualifier(),
-                               primary, secondary, type.getArraySizes(), mangledName);
-    InitType(newType);
+    TType &newType = *new TType(type);
+    newType.setPrimarySize(primary);
+    newType.setSecondarySize(secondary);
     return newType;
 }
 
diff --git a/src/compiler/translator/TranslatorMetalDirect/EmitMetal.cpp b/src/compiler/translator/TranslatorMetalDirect/EmitMetal.cpp
index 5ee7782..3889a06 100644
--- a/src/compiler/translator/TranslatorMetalDirect/EmitMetal.cpp
+++ b/src/compiler/translator/TranslatorMetalDirect/EmitMetal.cpp
@@ -8,6 +8,7 @@
 #include <map>
 
 #include "common/system_utils.h"
+#include "compiler/translator/BaseTypes.h"
 #include "compiler/translator/ImmutableStringBuilder.h"
 #include "compiler/translator/SymbolTable.h"
 #include "compiler/translator/TranslatorMetalDirect.h"
@@ -1043,12 +1044,14 @@
                       basic == TBasicType::EbtFloat)) ||
                     type.getQualifier() == EvqFragData)
                 {
-                    // TODO:
-                    // This is not correct in general and needs a reimplementation.
-                    // In GLSL 3.0, We can't always assume this is going to be a safe index.
-                    // See 4.3.8.2
-                    // https://www.khronos.org/registry/OpenGL/specs/es/3.0/GLSL_ES_Specification_3.00.pdf
-                    size_t index = annotationIndices.color++;
+                    // The OpenGL ES 3.0 spec says locations must be specified
+                    // unless there is only a single output, in which case the
+                    // location is 0. So, when we get to this point the shader
+                    // will have been rejected if locations are not specified
+                    // and there is more than one output.
+                    const TLayoutQualifier &layoutQualifier = type.getLayoutQualifier();
+                    size_t index = layoutQualifier.locationsSpecified ? layoutQualifier.location
+                                                                      : annotationIndices.color++;
                     mOut << " [[color(" << index << ")]]";
                 }
             }
@@ -1336,7 +1339,23 @@
 
         case TBasicType::EbtFloat:
         {
-            mOut << constUnion->getFConst() << "f";
+            float value = constUnion->getFConst();
+            if (std::isnan(value))
+            {
+                mOut << "NAN";
+            }
+            else if (std::isinf(value))
+            {
+                if (value < 0)
+                {
+                    mOut << "-";
+                }
+                mOut << "INFINITY";
+            }
+            else
+            {
+                mOut << value << "f";
+            }
         }
         break;
 
@@ -2013,16 +2032,14 @@
                             {
                                 mOut << opName;
                                 groupedTraverse(operandNode);
-                                return false;
                             }
                             else
                             {
                                 groupedTraverse(operandNode);
                                 mOut << opName;
-                                return false;
                             }
+                            return false;
                         }
-                        break;
 
                         case 2:
                         {
@@ -2033,7 +2050,6 @@
                             groupedTraverse(rightNode);
                             return false;
                         }
-                        break;
 
                         default:
                             UNREACHABLE();
diff --git a/src/compiler/translator/TranslatorMetalDirect/FixTypeConstructors.cpp b/src/compiler/translator/TranslatorMetalDirect/FixTypeConstructors.cpp
index 58f0c23..f76db46 100644
--- a/src/compiler/translator/TranslatorMetalDirect/FixTypeConstructors.cpp
+++ b/src/compiler/translator/TranslatorMetalDirect/FixTypeConstructors.cpp
@@ -7,8 +7,8 @@
 #include "compiler/translator/TranslatorMetalDirect/FixTypeConstructors.h"
 #include <unordered_map>
 #include "compiler/translator/TranslatorMetalDirect/AstHelpers.h"
-#include "compiler/translator/TranslatorMetalDirect/IntermRebuild.h"
 #include "compiler/translator/tree_ops/SimplifyLoopConditions.h"
+#include "compiler/translator/tree_util/IntermRebuild.h"
 using namespace sh;
 ////////////////////////////////////////////////////////////////////////////////
 namespace
diff --git a/src/compiler/translator/TranslatorMetalDirect/HoistConstants.cpp b/src/compiler/translator/TranslatorMetalDirect/HoistConstants.cpp
index eaea469..ce9c03e 100644
--- a/src/compiler/translator/TranslatorMetalDirect/HoistConstants.cpp
+++ b/src/compiler/translator/TranslatorMetalDirect/HoistConstants.cpp
@@ -6,9 +6,9 @@
 
 #include "compiler/translator/TranslatorMetalDirect/HoistConstants.h"
 #include "compiler/translator/TranslatorMetalDirect/AstHelpers.h"
-#include "compiler/translator/TranslatorMetalDirect/IntermRebuild.h"
 #include "compiler/translator/TranslatorMetalDirect/Layout.h"
 #include "compiler/translator/tree_util/FindFunction.h"
+#include "compiler/translator/tree_util/IntermRebuild.h"
 #include "compiler/translator/tree_util/ReplaceVariable.h"
 
 using namespace sh;
diff --git a/src/compiler/translator/TranslatorMetalDirect/IdGen.cpp b/src/compiler/translator/TranslatorMetalDirect/IdGen.cpp
index 84aed6b..8710c42 100644
--- a/src/compiler/translator/TranslatorMetalDirect/IdGen.cpp
+++ b/src/compiler/translator/TranslatorMetalDirect/IdGen.cpp
@@ -95,3 +95,9 @@
     return createNewName(baseNames.size(), baseNames.begin(),
                          [](const char *s) { return ImmutableString(s); });
 }
+
+Name IdGen::createNewName()
+{
+    // TODO(anglebug.com/5505): refactor this later.
+    return createNewName<int>(0, nullptr, [](int) { return kEmptyImmutableString; });
+}
diff --git a/src/compiler/translator/TranslatorMetalDirect/IdGen.h b/src/compiler/translator/TranslatorMetalDirect/IdGen.h
index 582089f..6523859 100644
--- a/src/compiler/translator/TranslatorMetalDirect/IdGen.h
+++ b/src/compiler/translator/TranslatorMetalDirect/IdGen.h
@@ -26,6 +26,7 @@
     Name createNewName(std::initializer_list<ImmutableString> baseNames);
     Name createNewName(std::initializer_list<Name> baseNames);
     Name createNewName(std::initializer_list<const char *> baseNames);
+    Name createNewName();
 
   private:
     template <typename String, typename StringToImmutable>
diff --git a/src/compiler/translator/TranslatorMetalDirect/IntermRebuild.h b/src/compiler/translator/TranslatorMetalDirect/IntermRebuild.h
index 22ad92c..675d747 100644
--- a/src/compiler/translator/TranslatorMetalDirect/IntermRebuild.h
+++ b/src/compiler/translator/TranslatorMetalDirect/IntermRebuild.h
@@ -7,8 +7,8 @@
 #ifndef COMPILER_TRANSLATOR_TRANSLATORMETALDIRECT_INTERMREBUILD_H_
 #define COMPILER_TRANSLATOR_TRANSLATORMETALDIRECT_INTERMREBUILD_H_
 
-#include "compiler/translator/TranslatorMetalDirect/NodeType.h"
 #include "compiler/translator/tree_util/IntermTraverse.h"
+#include "compiler/translator/tree_util/NodeType.h"
 
 namespace sh
 {
diff --git a/src/compiler/translator/TranslatorMetalDirect/IntroduceVertexIndexID.cpp b/src/compiler/translator/TranslatorMetalDirect/IntroduceVertexIndexID.cpp
index 2eb9353..efb3c12 100644
--- a/src/compiler/translator/TranslatorMetalDirect/IntroduceVertexIndexID.cpp
+++ b/src/compiler/translator/TranslatorMetalDirect/IntroduceVertexIndexID.cpp
@@ -7,8 +7,8 @@
 #include "compiler/translator/TranslatorMetalDirect/IntroduceVertexIndexID.h"
 #include "compiler/translator/StaticType.h"
 #include "compiler/translator/TranslatorMetalDirect/AstHelpers.h"
-#include "compiler/translator/TranslatorMetalDirect/IntermRebuild.h"
 #include "compiler/translator/tree_util/BuiltIn.h"
+#include "compiler/translator/tree_util/IntermRebuild.h"
 using namespace sh;
 
 ////////////////////////////////////////////////////////////////////////////////
diff --git a/src/compiler/translator/TranslatorMetalDirect/MapSymbols.cpp b/src/compiler/translator/TranslatorMetalDirect/MapSymbols.cpp
index 5631be6..035c930 100644
--- a/src/compiler/translator/TranslatorMetalDirect/MapSymbols.cpp
+++ b/src/compiler/translator/TranslatorMetalDirect/MapSymbols.cpp
@@ -5,7 +5,7 @@
 //
 
 #include "compiler/translator/TranslatorMetalDirect/MapSymbols.h"
-#include "compiler/translator/TranslatorMetalDirect/IntermRebuild.h"
+#include "compiler/translator/tree_util/IntermRebuild.h"
 
 using namespace sh;
 
diff --git a/src/compiler/translator/TranslatorMetalDirect/ModifyStruct.cpp b/src/compiler/translator/TranslatorMetalDirect/ModifyStruct.cpp
index d330bcb..32fcbea 100644
--- a/src/compiler/translator/TranslatorMetalDirect/ModifyStruct.cpp
+++ b/src/compiler/translator/TranslatorMetalDirect/ModifyStruct.cpp
@@ -422,6 +422,11 @@
                 padType = new TType(TBasicType::EbtBool);
             }
 
+            if (padType->getBasicType() != EbtBool)
+            {
+                padType->setPrecision(EbpLow);
+            }
+
             if (updateLayout)
             {
                 metalLayoutTotal += MetalLayoutOf(*padType);
diff --git a/src/compiler/translator/TranslatorMetalDirect/ProgramPrelude.cpp b/src/compiler/translator/TranslatorMetalDirect/ProgramPrelude.cpp
index a97f8db..217524c 100644
--- a/src/compiler/translator/TranslatorMetalDirect/ProgramPrelude.cpp
+++ b/src/compiler/translator/TranslatorMetalDirect/ProgramPrelude.cpp
@@ -145,6 +145,7 @@
     void inverse2();
     void inverse3();
     void inverse4();
+    void equalScalar();
     void equalVector();
     void equalMatrix();
     void notEqualVector();
@@ -1052,10 +1053,13 @@
 ANGLE_ALWAYS_INLINE bool ANGLE_equal(metal::array<T, N> u, metal::array<T, N> v)
 {
     for(size_t i = 0; i < N; i++)
-        if (u[i] != v[i]) return false;
+        if (!ANGLE_equal(u[i], v[i])) return false;
     return true;
 }
-)")
+)",
+                        equalScalar(),
+                        equalVector(),
+                        equalMatrix())
 
 PROGRAM_PRELUDE_DECLARE(equalStructArray,
                         R"(
@@ -1081,6 +1085,16 @@
 )",
                         equalArray())
 
+PROGRAM_PRELUDE_DECLARE(equalScalar,
+                        R"(
+template <typename T>
+ANGLE_ALWAYS_INLINE bool ANGLE_equal(T u, T v)
+{
+    return u == v;
+}
+)",
+                        include_metal_math())
+
 PROGRAM_PRELUDE_DECLARE(equalVector,
                         R"(
 template <typename T, int N>
@@ -3640,8 +3654,6 @@
             }
             break;
 
-            break;
-
         case TOperator::EOpNegative:
             if (argType0->isMatrix())
             {
diff --git a/src/compiler/translator/TranslatorMetalDirect/ReduceInterfaceBlocks.cpp b/src/compiler/translator/TranslatorMetalDirect/ReduceInterfaceBlocks.cpp
index e121d39..45053e2 100644
--- a/src/compiler/translator/TranslatorMetalDirect/ReduceInterfaceBlocks.cpp
+++ b/src/compiler/translator/TranslatorMetalDirect/ReduceInterfaceBlocks.cpp
@@ -7,11 +7,12 @@
 #include <algorithm>
 #include <unordered_map>
 
+#include "compiler/translator/SymbolTable.h"
 #include "compiler/translator/TranslatorMetalDirect.h"
 #include "compiler/translator/TranslatorMetalDirect/AstHelpers.h"
-#include "compiler/translator/TranslatorMetalDirect/IntermRebuild.h"
 #include "compiler/translator/TranslatorMetalDirect/ReduceInterfaceBlocks.h"
 #include "compiler/translator/tree_ops/SeparateDeclarations.h"
+#include "compiler/translator/tree_util/IntermRebuild.h"
 
 using namespace sh;
 
@@ -112,7 +113,10 @@
 
 ////////////////////////////////////////////////////////////////////////////////
 
-bool sh::ReduceInterfaceBlocks(TCompiler &compiler, TIntermBlock &root, IdGen &idGen)
+bool sh::ReduceInterfaceBlocks(TCompiler &compiler,
+                               TIntermBlock &root,
+                               IdGen &idGen,
+                               TSymbolTable *symbolTable)
 {
     Reducer reducer(compiler, idGen);
     if (!reducer.rebuildRoot(root))
@@ -120,7 +124,7 @@
         return false;
     }
 
-    if (!SeparateDeclarations(&compiler, &root))
+    if (!SeparateDeclarations(&compiler, &root, symbolTable))
     {
         return false;
     }
diff --git a/src/compiler/translator/TranslatorMetalDirect/ReduceInterfaceBlocks.h b/src/compiler/translator/TranslatorMetalDirect/ReduceInterfaceBlocks.h
index a17c22f..7cf19b6 100644
--- a/src/compiler/translator/TranslatorMetalDirect/ReduceInterfaceBlocks.h
+++ b/src/compiler/translator/TranslatorMetalDirect/ReduceInterfaceBlocks.h
@@ -12,6 +12,7 @@
 
 namespace sh
 {
+class TSymbolTable;
 
 // This rewrites interface block declarations only.
 //
@@ -28,7 +29,11 @@
 // Becomes:
 //  struct Foo { int x; }; uniform Foo x;
 //
-ANGLE_NO_DISCARD bool ReduceInterfaceBlocks(TCompiler &compiler, TIntermBlock &root, IdGen &idGen);
+
+ANGLE_NO_DISCARD bool ReduceInterfaceBlocks(TCompiler &compiler,
+                                            TIntermBlock &root,
+                                            IdGen &idGen,
+                                            TSymbolTable *symbolTable);
 
 }  // namespace sh
 
diff --git a/src/compiler/translator/TranslatorMetalDirect/RewriteCaseDeclarations.cpp b/src/compiler/translator/TranslatorMetalDirect/RewriteCaseDeclarations.cpp
index 1272acb..c778177 100644
--- a/src/compiler/translator/TranslatorMetalDirect/RewriteCaseDeclarations.cpp
+++ b/src/compiler/translator/TranslatorMetalDirect/RewriteCaseDeclarations.cpp
@@ -6,7 +6,7 @@
 
 #include "compiler/translator/TranslatorMetalDirect/RewriteCaseDeclarations.h"
 #include "compiler/translator/TranslatorMetalDirect/AstHelpers.h"
-#include "compiler/translator/TranslatorMetalDirect/IntermRebuild.h"
+#include "compiler/translator/tree_util/IntermRebuild.h"
 
 using namespace sh;
 
diff --git a/src/compiler/translator/TranslatorMetalDirect/RewriteGlobalQualifierDecls.cpp b/src/compiler/translator/TranslatorMetalDirect/RewriteGlobalQualifierDecls.cpp
index 9c3f82c..20d9f2a 100644
--- a/src/compiler/translator/TranslatorMetalDirect/RewriteGlobalQualifierDecls.cpp
+++ b/src/compiler/translator/TranslatorMetalDirect/RewriteGlobalQualifierDecls.cpp
@@ -5,7 +5,7 @@
 //
 
 #include "compiler/translator/TranslatorMetalDirect/RewriteGlobalQualifierDecls.h"
-#include "compiler/translator/TranslatorMetalDirect/IntermRebuild.h"
+#include "compiler/translator/tree_util/IntermRebuild.h"
 
 using namespace sh;
 
diff --git a/src/compiler/translator/TranslatorMetalDirect/RewriteKeywords.cpp b/src/compiler/translator/TranslatorMetalDirect/RewriteKeywords.cpp
index e1e2278..0cfc045 100644
--- a/src/compiler/translator/TranslatorMetalDirect/RewriteKeywords.cpp
+++ b/src/compiler/translator/TranslatorMetalDirect/RewriteKeywords.cpp
@@ -12,8 +12,8 @@
 #include <unordered_set>
 
 #include "compiler/translator/TranslatorMetalDirect/AstHelpers.h"
-#include "compiler/translator/TranslatorMetalDirect/IntermRebuild.h"
 #include "compiler/translator/TranslatorMetalDirect/RewriteKeywords.h"
+#include "compiler/translator/tree_util/IntermRebuild.h"
 
 using namespace sh;
 
diff --git a/src/compiler/translator/TranslatorMetalDirect/RewriteOutArgs.cpp b/src/compiler/translator/TranslatorMetalDirect/RewriteOutArgs.cpp
index 47fb54b..55b71b9 100644
--- a/src/compiler/translator/TranslatorMetalDirect/RewriteOutArgs.cpp
+++ b/src/compiler/translator/TranslatorMetalDirect/RewriteOutArgs.cpp
@@ -5,7 +5,7 @@
 //
 
 #include "compiler/translator/TranslatorMetalDirect/RewriteOutArgs.h"
-#include "compiler/translator/TranslatorMetalDirect/IntermRebuild.h"
+#include "compiler/translator/tree_util/IntermRebuild.h"
 
 using namespace sh;
 
@@ -124,8 +124,8 @@
             const TQualifier paramQual = paramType.getQualifier();
             switch (paramQual)
             {
-                case TQualifier::EvqOut:
-                case TQualifier::EvqInOut:
+                case TQualifier::EvqParamOut:
+                case TQualifier::EvqParamInOut:
                     if (!mSymbolEnv.isReference(param))
                     {
                         mSymbolEnv.markAsReference(param, AddressSpace::Thread);
@@ -145,8 +145,8 @@
 
             switch (paramQual)
             {
-                case TQualifier::EvqOut:
-                case TQualifier::EvqInOut:
+                case TQualifier::EvqParamOut:
+                case TQualifier::EvqParamInOut:
                 {
                     const TVariable *var = GetVariable(*args[i]);
                     if (mVarBuffer.insert(var).count > 1)
@@ -184,12 +184,12 @@
                     {
                         switch (paramQual)
                         {
-                            case TQualifier::EvqOut:
+                            case TQualifier::EvqParamOut:
                                 args[i] = &mSymbolEnv.callFunctionOverload(
                                     Name("out"), arg->getType(), *new TIntermSequence{arg});
                                 break;
 
-                            case TQualifier::EvqInOut:
+                            case TQualifier::EvqParamInOut:
                                 args[i] = &mSymbolEnv.callFunctionOverload(
                                     Name("inout"), arg->getType(), *new TIntermSequence{arg});
                                 break;
diff --git a/src/compiler/translator/TranslatorMetalDirect/RewritePipelines.cpp b/src/compiler/translator/TranslatorMetalDirect/RewritePipelines.cpp
index 2e9bf4b..c487048 100644
--- a/src/compiler/translator/TranslatorMetalDirect/RewritePipelines.cpp
+++ b/src/compiler/translator/TranslatorMetalDirect/RewritePipelines.cpp
@@ -12,7 +12,6 @@
 #include "compiler/translator/TranslatorMetalDirect/AstHelpers.h"
 #include "compiler/translator/TranslatorMetalDirect/DiscoverDependentFunctions.h"
 #include "compiler/translator/TranslatorMetalDirect/IdGen.h"
-#include "compiler/translator/TranslatorMetalDirect/IntermRebuild.h"
 #include "compiler/translator/TranslatorMetalDirect/MapSymbols.h"
 #include "compiler/translator/TranslatorMetalDirect/Pipeline.h"
 #include "compiler/translator/TranslatorMetalDirect/RewritePipelines.h"
@@ -20,6 +19,7 @@
 #include "compiler/translator/tree_ops/PruneNoOps.h"
 #include "compiler/translator/tree_util/DriverUniform.h"
 #include "compiler/translator/tree_util/FindMain.h"
+#include "compiler/translator/tree_util/IntermRebuild.h"
 #include "compiler/translator/tree_util/IntermTraverse.h"
 using namespace sh;
 
diff --git a/src/compiler/translator/TranslatorMetalDirect/RewriteUnaddressableReferences.cpp b/src/compiler/translator/TranslatorMetalDirect/RewriteUnaddressableReferences.cpp
index 6bbf725..7721350 100644
--- a/src/compiler/translator/TranslatorMetalDirect/RewriteUnaddressableReferences.cpp
+++ b/src/compiler/translator/TranslatorMetalDirect/RewriteUnaddressableReferences.cpp
@@ -6,8 +6,8 @@
 
 #include "compiler/translator/TranslatorMetalDirect/RewriteUnaddressableReferences.h"
 #include "compiler/translator/TranslatorMetalDirect/AstHelpers.h"
-#include "compiler/translator/TranslatorMetalDirect/IntermRebuild.h"
 #include "compiler/translator/tree_util/AsNode.h"
+#include "compiler/translator/tree_util/IntermRebuild.h"
 
 using namespace sh;
 
@@ -19,8 +19,8 @@
     const TQualifier qual = paramType.getQualifier();
     switch (qual)
     {
-        case TQualifier::EvqInOut:
-        case TQualifier::EvqOut:
+        case TQualifier::EvqParamInOut:
+        case TQualifier::EvqParamOut:
             return true;
 
         default:
diff --git a/src/compiler/translator/TranslatorMetalDirect/SeparateCompoundExpressions.cpp b/src/compiler/translator/TranslatorMetalDirect/SeparateCompoundExpressions.cpp
index 840213e..41897a0 100644
--- a/src/compiler/translator/TranslatorMetalDirect/SeparateCompoundExpressions.cpp
+++ b/src/compiler/translator/TranslatorMetalDirect/SeparateCompoundExpressions.cpp
@@ -8,9 +8,9 @@
 
 #include "common/system_utils.h"
 #include "compiler/translator/TranslatorMetalDirect/AstHelpers.h"
-#include "compiler/translator/TranslatorMetalDirect/IntermRebuild.h"
 #include "compiler/translator/TranslatorMetalDirect/SeparateCompoundExpressions.h"
 #include "compiler/translator/tree_ops/SimplifyLoopConditions.h"
+#include "compiler/translator/tree_util/IntermRebuild.h"
 
 using namespace sh;
 
@@ -233,7 +233,7 @@
             return;
         }
         auto &bindingMap = getCurrBindingMap();
-        const Name name  = mIdGen.createNewName("");
+        const Name name  = mIdGen.createNewName();
         auto *var =
             new TVariable(&mSymbolTable, name.rawName(), &newExpr.getType(), name.symbolType());
         auto *decl = new TIntermDeclaration(var, &newExpr);
@@ -397,7 +397,7 @@
 
         if (op == TOperator::EOpLogicalAnd || op == TOperator::EOpLogicalOr)
         {
-            const Name name = mIdGen.createNewName("");
+            const Name name = mIdGen.createNewName();
             auto *var = new TVariable(&mSymbolTable, name.rawName(), new TType(TBasicType::EbtBool),
                                       name.symbolType());
 
@@ -468,7 +468,7 @@
         TIntermTyped *then  = node.getTrueExpression();
         TIntermTyped *else_ = node.getFalseExpression();
 
-        const Name name = mIdGen.createNewName("");
+        const Name name = mIdGen.createNewName();
         auto *var =
             new TVariable(&mSymbolTable, name.rawName(), &node.getType(), name.symbolType());
 
diff --git a/src/compiler/translator/TranslatorMetalDirect/SeparateCompoundStructDeclarations.cpp b/src/compiler/translator/TranslatorMetalDirect/SeparateCompoundStructDeclarations.cpp
index 5d2d9ac..3b7f41a 100644
--- a/src/compiler/translator/TranslatorMetalDirect/SeparateCompoundStructDeclarations.cpp
+++ b/src/compiler/translator/TranslatorMetalDirect/SeparateCompoundStructDeclarations.cpp
@@ -43,8 +43,8 @@
             if (structure->symbolType() == SymbolType::Empty)
             {
                 const TStructure *structDefn =
-                    new TStructure(mSymbolTable, mIdGen.createNewName("__unnamed").rawName(),
-                                   &(structure->fields()), SymbolType::AngleInternal);
+                    new TStructure(mSymbolTable, mIdGen.createNewName().rawName(),
+                                   &structure->fields(), SymbolType::AngleInternal);
                 structVar    = new TVariable(mSymbolTable, ImmutableString(""),
                                           new TType(structDefn, true), SymbolType::Empty);
                 instanceType = new TType(structDefn, false);
@@ -55,25 +55,35 @@
                                           new TType(structure, true), SymbolType::Empty);
                 instanceType = new TType(structure, false);
             }
+            if (type.isArray())
+            {
+                instanceType->makeArrays(type.getArraySizes());
+            }
             instanceType->setQualifier(type.getQualifier());
             auto *instanceVar =
                 new TVariable(mSymbolTable, var.name(), instanceType, symbolType, var.extensions());
 
             TIntermSequence replacements;
-            replacements.push_back(new TIntermSymbol(structVar));
+            replacements.push_back(new TIntermDeclaration({structVar}));
 
             TIntermSymbol *instanceSymbol    = new TIntermSymbol(instanceVar);
-            TIntermNode *instanceReplacement = instanceSymbol;
+            TIntermDeclaration *instanceDecl = new TIntermDeclaration;
             if (declaration.initExpr)
             {
-                instanceReplacement =
-                    new TIntermBinary(EOpInitialize, instanceSymbol, declaration.initExpr);
+                instanceDecl->appendDeclarator(new TIntermBinary(
+                    TOperator::EOpInitialize, instanceSymbol, declaration.initExpr));
             }
-            replacements.push_back(instanceReplacement);
+            else
+            {
+                instanceDecl->appendDeclarator(instanceSymbol);
+            }
+            replacements.push_back(instanceDecl);
 
             replacementMap[declaration.symbol.uniqueId().get()] = instanceSymbol;
+            ASSERT(getParentNode() != nullptr);
+            ASSERT(getParentNode()->getAsBlock() != nullptr);
             mMultiReplacements.push_back(NodeReplaceWithMultipleEntry(
-                declNode, declNode->getChildNode(0), std::move(replacements)));
+                getParentNode()->getAsBlock(), declNode, std::move(replacements)));
         }
 
         return false;
@@ -93,7 +103,10 @@
 
 ////////////////////////////////////////////////////////////////////////////////
 
-bool sh::SeparateCompoundStructDeclarations(TCompiler &compiler, IdGen &idGen, TIntermBlock &root)
+bool sh::SeparateCompoundStructDeclarations(TCompiler &compiler,
+                                            IdGen &idGen,
+                                            TIntermBlock &root,
+                                            TSymbolTable *symbolTable)
 {
     Separator separator(compiler.getSymbolTable(), idGen);
     root.traverse(&separator);
@@ -102,7 +115,7 @@
         return false;
     }
 
-    if (!SeparateDeclarations(&compiler, &root))
+    if (!SeparateDeclarations(&compiler, &root, symbolTable))
     {
         return false;
     }
diff --git a/src/compiler/translator/TranslatorMetalDirect/SeparateCompoundStructDeclarations.h b/src/compiler/translator/TranslatorMetalDirect/SeparateCompoundStructDeclarations.h
index 1538084..0868844 100644
--- a/src/compiler/translator/TranslatorMetalDirect/SeparateCompoundStructDeclarations.h
+++ b/src/compiler/translator/TranslatorMetalDirect/SeparateCompoundStructDeclarations.h
@@ -12,6 +12,7 @@
 #include "compiler/translator/TranslatorMetalDirect/IdGen.h"
 namespace sh
 {
+class TSymbolTable;
 
 // Example:
 //  struct Foo { int x; } foo;
@@ -19,7 +20,8 @@
 //  struct Foo {int x; }; Foo foo;
 ANGLE_NO_DISCARD bool SeparateCompoundStructDeclarations(TCompiler &compiler,
                                                          IdGen &idGen,
-                                                         TIntermBlock &root);
+                                                         TIntermBlock &root,
+                                                         TSymbolTable *symbolTable);
 
 }  // namespace sh
 
diff --git a/src/compiler/translator/TranslatorMetalDirect/SymbolEnv.cpp b/src/compiler/translator/TranslatorMetalDirect/SymbolEnv.cpp
index ce3633e..220c1a5 100644
--- a/src/compiler/translator/TranslatorMetalDirect/SymbolEnv.cpp
+++ b/src/compiler/translator/TranslatorMetalDirect/SymbolEnv.cpp
@@ -9,8 +9,8 @@
 
 #include "compiler/translator/ImmutableStringBuilder.h"
 #include "compiler/translator/TranslatorMetalDirect/AstHelpers.h"
-#include "compiler/translator/TranslatorMetalDirect/IntermRebuild.h"
 #include "compiler/translator/TranslatorMetalDirect/SymbolEnv.h"
+#include "compiler/translator/tree_util/IntermRebuild.h"
 
 using namespace sh;
 
diff --git a/src/compiler/translator/TranslatorMetalDirect/TransposeRowMajorMatrices.cpp b/src/compiler/translator/TranslatorMetalDirect/TransposeRowMajorMatrices.cpp
index 7929528..0db66cd 100644
--- a/src/compiler/translator/TranslatorMetalDirect/TransposeRowMajorMatrices.cpp
+++ b/src/compiler/translator/TranslatorMetalDirect/TransposeRowMajorMatrices.cpp
@@ -8,9 +8,8 @@
 #include <unordered_map>
 
 #include "compiler/translator/TranslatorMetalDirect/AstHelpers.h"
-#include "compiler/translator/TranslatorMetalDirect/IntermRebuild.h"
 #include "compiler/translator/TranslatorMetalDirect/TransposeRowMajorMatrices.h"
-#include "compiler/translator/tree_ops/SeparateDeclarations.h"
+#include "compiler/translator/tree_util/IntermRebuild.h"
 
 using namespace sh;
 
diff --git a/src/compiler/translator/TranslatorVulkan.cpp b/src/compiler/translator/TranslatorVulkan.cpp
index c5df76b..d5d55b2 100644
--- a/src/compiler/translator/TranslatorVulkan.cpp
+++ b/src/compiler/translator/TranslatorVulkan.cpp
@@ -21,21 +21,22 @@
 #include "compiler/translator/OutputVulkanGLSL.h"
 #include "compiler/translator/StaticType.h"
 #include "compiler/translator/glslang_wrapper.h"
+#include "compiler/translator/tree_ops/MonomorphizeUnsupportedFunctions.h"
+#include "compiler/translator/tree_ops/RecordConstantPrecision.h"
 #include "compiler/translator/tree_ops/RemoveAtomicCounterBuiltins.h"
 #include "compiler/translator/tree_ops/RemoveInactiveInterfaceVariables.h"
+#include "compiler/translator/tree_ops/RewriteArrayOfArrayOfOpaqueUniforms.h"
 #include "compiler/translator/tree_ops/RewriteAtomicCounters.h"
 #include "compiler/translator/tree_ops/RewriteCubeMapSamplersAs2DArray.h"
 #include "compiler/translator/tree_ops/RewriteDfdy.h"
 #include "compiler/translator/tree_ops/RewriteStructSamplers.h"
+#include "compiler/translator/tree_ops/SeparateStructFromUniformDeclarations.h"
 #include "compiler/translator/tree_ops/vulkan/DeclarePerVertexBlocks.h"
 #include "compiler/translator/tree_ops/vulkan/EmulateFragColorData.h"
 #include "compiler/translator/tree_ops/vulkan/FlagSamplersWithTexelFetch.h"
-#include "compiler/translator/tree_ops/vulkan/MonomorphizeUnsupportedFunctionsInVulkanGLSL.h"
 #include "compiler/translator/tree_ops/vulkan/ReplaceForShaderFramebufferFetch.h"
-#include "compiler/translator/tree_ops/vulkan/RewriteArrayOfArrayOfOpaqueUniforms.h"
 #include "compiler/translator/tree_ops/vulkan/RewriteInterpolateAtOffset.h"
 #include "compiler/translator/tree_ops/vulkan/RewriteR32fImages.h"
-#include "compiler/translator/tree_ops/vulkan/SeparateStructFromUniformDeclarations.h"
 #include "compiler/translator/tree_util/BuiltIn.h"
 #include "compiler/translator/tree_util/DriverUniform.h"
 #include "compiler/translator/tree_util/FindFunction.h"
@@ -103,7 +104,7 @@
         const TVariable &variable = symbol->variable();
         const TType &type         = variable.getType();
 
-        if (!IsDefaultUniform(type) || variable.name().beginsWith("gl_"))
+        if (!IsDefaultUniform(type) || gl::IsBuiltInName(variable.name().data()))
         {
             return;
         }
@@ -146,7 +147,6 @@
         if (IsDefaultUniform(type))
         {
             TType *fieldType = new TType(type);
-            fieldType->setPrecision(EbpUndefined);
 
             uniformList->push_back(new TField(fieldType, symbol->getName(), symbol->getLine(),
                                               symbol->variable().symbolType()));
@@ -168,7 +168,6 @@
         const TVariable *variable = uniformVars[fieldIndex];
 
         TType *replacementType = new TType(variable->getType());
-        replacementType->setPrecision(EbpUndefined);
         replacementType->setInterfaceBlockField(uniformBlock->getType().getInterfaceBlock(),
                                                 fieldIndex);
 
@@ -204,8 +203,9 @@
     TIntermSwizzle *builtinXY    = new TIntermSwizzle(builtinRef, swizzleOffsetXY);
 
     // Create a symbol reference to our new variable that will hold the modified builtin.
-    const TType *type = StaticType::GetForVec<EbtFloat>(
-        EvqGlobal, static_cast<unsigned char>(builtin->getType().getNominalSize()));
+    TType *type = new TType(builtin->getType());
+    type->setQualifier(EvqGlobal);
+    type->setPrimarySize(static_cast<unsigned char>(builtin->getType().getNominalSize()));
     TVariable *replacementVar =
         new TVariable(symbolTable, flippedVariableName, type, SymbolType::AngleInternal);
     DeclareGlobalVariable(root, replacementVar);
@@ -273,6 +273,36 @@
     return ReplaceVariableWithTyped(compiler, root, depthRangeVar, angleEmulatedDepthRangeRef);
 }
 
+// Declares a new variable to replace gl_BoundingBoxEXT, its values are fed from a global temporary
+// variable.
+ANGLE_NO_DISCARD bool ReplaceGLBoundingBoxWithGlobal(TCompiler *compiler,
+                                                     TIntermBlock *root,
+                                                     TSymbolTable *symbolTable)
+{
+    // Create a symbol reference to "gl_BoundingBoxEXT"
+    const TVariable *builtinBoundingBoxVar = static_cast<const TVariable *>(
+        symbolTable->findBuiltIn(ImmutableString("gl_BoundingBoxEXT"), 310));
+
+    if (builtinBoundingBoxVar != nullptr)
+    {
+        // Declare the replacement bounding box variable type
+        TType *emulatedBoundingBoxDeclType = new TType(builtinBoundingBoxVar->getType());
+        emulatedBoundingBoxDeclType->setQualifier(EvqGlobal);
+
+        TVariable *ANGLEBoundingBoxVar =
+            new TVariable(symbolTable->nextUniqueId(), ImmutableString("ANGLEBoundingBox"),
+                          SymbolType::AngleInternal, TExtension::EXT_primitive_bounding_box,
+                          emulatedBoundingBoxDeclType);
+
+        DeclareGlobalVariable(root, ANGLEBoundingBoxVar);
+
+        // Use the replacement variable instead of builtin gl_BoundingBoxEXT everywhere.
+        return ReplaceVariable(compiler, root, builtinBoundingBoxVar, ANGLEBoundingBoxVar);
+    }
+
+    return true;
+}
+
 TVariable *AddANGLEPositionVaryingDeclaration(TIntermBlock *root,
                                               TSymbolTable *symbolTable,
                                               TQualifier qualifier)
@@ -307,7 +337,7 @@
     // Clamp position to subpixel grid.
     // Do perspective divide (get normalized device coords)
     // "vec2 ndc = gl_Position.xy / gl_Position.w"
-    const TType *vec2Type        = StaticType::GetTemporary<EbtFloat, 2>();
+    const TType *vec2Type        = StaticType::GetTemporary<EbtFloat, EbpHigh, 2>();
     TIntermBinary *viewportRef   = driverUniforms->getViewportRef();
     TIntermSymbol *glPos         = new TIntermSymbol(BuiltInVariable::gl_Position());
     TIntermSwizzle *glPosXY      = CreateSwizzle(glPos, 0, 1);
@@ -319,11 +349,11 @@
     // Convert NDC to window coordinates. According to Vulkan spec.
     // "vec2 window = 0.5 * viewport.wh * (ndc + 1) + viewport.xy"
     TIntermBinary *ndcPlusOne =
-        new TIntermBinary(EOpAdd, CreateTempSymbolNode(ndc), CreateFloatNode(1.0f));
+        new TIntermBinary(EOpAdd, CreateTempSymbolNode(ndc), CreateFloatNode(1.0f, EbpMedium));
     TIntermSwizzle *viewportZW = CreateSwizzle(viewportRef, 2, 3);
     TIntermBinary *ndcViewport = new TIntermBinary(EOpMul, viewportZW, ndcPlusOne);
     TIntermBinary *ndcViewportHalf =
-        new TIntermBinary(EOpVectorTimesScalar, ndcViewport, CreateFloatNode(0.5f));
+        new TIntermBinary(EOpVectorTimesScalar, ndcViewport, CreateFloatNode(0.5f, EbpMedium));
     TIntermSwizzle *viewportXY     = CreateSwizzle(viewportRef->deepCopy(), 0, 1);
     TIntermBinary *ndcToWindow     = new TIntermBinary(EOpAdd, ndcViewportHalf, viewportXY);
     TVariable *windowCoords        = CreateTempVariable(symbolTable, vec2Type);
@@ -331,8 +361,9 @@
 
     // Clamp to subpixel grid.
     // "vec2 clamped = round(window * 2^{subpixelBits}) / 2^{subpixelBits}"
-    int subpixelBits                    = compiler->getResources().SubPixelBits;
-    TIntermConstantUnion *scaleConstant = CreateFloatNode(static_cast<float>(1 << subpixelBits));
+    int subpixelBits = compiler->getResources().SubPixelBits;
+    TIntermConstantUnion *scaleConstant =
+        CreateFloatNode(static_cast<float>(1 << subpixelBits), EbpHigh);
     TIntermBinary *windowScaled =
         new TIntermBinary(EOpVectorTimesScalar, CreateTempSymbolNode(windowCoords), scaleConstant);
     TIntermTyped *windowRounded =
@@ -348,9 +379,10 @@
     TIntermBinary *clampedOffset = new TIntermBinary(
         EOpSub, CreateTempSymbolNode(clampedWindowCoords), viewportXY->deepCopy());
     TIntermBinary *clampedOff2x =
-        new TIntermBinary(EOpVectorTimesScalar, clampedOffset, CreateFloatNode(2.0f));
+        new TIntermBinary(EOpVectorTimesScalar, clampedOffset, CreateFloatNode(2.0f, EbpMedium));
     TIntermBinary *clampedDivided = new TIntermBinary(EOpDiv, clampedOff2x, viewportZW->deepCopy());
-    TIntermBinary *clampedNDC    = new TIntermBinary(EOpSub, clampedDivided, CreateFloatNode(1.0f));
+    TIntermBinary *clampedNDC =
+        new TIntermBinary(EOpSub, clampedDivided, CreateFloatNode(1.0f, EbpMedium));
     TIntermSymbol *varyingRef    = new TIntermSymbol(anglePosition);
     TIntermBinary *varyingAssign = new TIntermBinary(EOpAssign, varyingRef, clampedNDC);
 
@@ -363,10 +395,7 @@
         new TIntermIfElse(specConst->getLineRasterEmulation(), emulationBlock, nullptr);
 
     // Ensure the statements run at the end of the main() function.
-    TIntermFunctionDefinition *main = FindMain(root);
-    TIntermBlock *mainBody          = main->getBody();
-    mainBody->appendStatement(ifEmulation);
-    return compiler->validateAST(root);
+    return RunAtTheEndOfShader(compiler, root, ifEmulation, symbolTable);
 }
 
 ANGLE_NO_DISCARD bool AddXfbEmulationSupport(TCompiler *compiler,
@@ -388,9 +417,9 @@
 
     constexpr uint32_t kMaxXfbBuffers = 4;
 
-    const TType *ivec4Type = StaticType::GetBasic<EbtInt, kMaxXfbBuffers>();
+    const TType *ivec4Type = StaticType::GetBasic<EbtInt, EbpHigh, kMaxXfbBuffers>();
     TType *stridesType     = new TType(*ivec4Type);
-    stridesType->setQualifier(EvqConst);
+    stridesType->setQualifier(EvqParamConst);
 
     // Create the parameter variable.
     TVariable *stridesVar = new TVariable(symbolTable, ImmutableString("strides"), stridesType,
@@ -442,7 +471,7 @@
     //     void ANGLECaptureXfb()
     //     {
     //     }
-    const TType *voidType = StaticType::GetBasic<EbtVoid>();
+    const TType *voidType = StaticType::GetBasic<EbtVoid, EbpUndefined>();
 
     // Create the function body, which is empty.
     body = new TIntermBlock;
@@ -511,7 +540,7 @@
     for (uint32_t bufferIndex = 0; bufferIndex < kMaxXfbBuffers; ++bufferIndex)
     {
         TFieldList *fieldList = new TFieldList;
-        TType *xfbOutType     = new TType(EbtFloat);
+        TType *xfbOutType     = new TType(EbtFloat, EbpHigh, EvqGlobal);
         xfbOutType->makeArray(0);
 
         TField *field = new TField(xfbOutType, ImmutableString(vk::kXfbEmulationBufferFieldName),
@@ -531,7 +560,10 @@
         varName << vk::kXfbEmulationBufferName;
         varName.appendDecimal(bufferIndex);
 
-        DeclareInterfaceBlock(root, symbolTable, fieldList, EvqBuffer, TLayoutQualifier::Create(),
+        TLayoutQualifier layoutQualifier = TLayoutQualifier::Create();
+        layoutQualifier.blockStorage     = EbsStd430;
+
+        DeclareInterfaceBlock(root, symbolTable, fieldList, EvqBuffer, layoutQualifier,
                               TMemoryQualifier::Create(), 0, blockName, varName);
     }
 
@@ -609,9 +641,10 @@
             fragRotation = driverUniforms->getFragRotationMatrixRef();
         }
     }
+    const TVariable *fragCoord = static_cast<const TVariable *>(
+        symbolTable->findBuiltIn(ImmutableString("gl_FragCoord"), compiler->getShaderVersion()));
     return RotateAndFlipBuiltinVariable(compiler, root, insertSequence, flipXY, symbolTable,
-                                        BuiltInVariable::gl_FragCoord(), kFlippedFragCoordName,
-                                        pivot, fragRotation);
+                                        fragCoord, kFlippedFragCoordName, pivot, fragRotation);
 }
 
 // This block adds OpenGL line segment rasterization emulation behind a specialization constant
@@ -656,7 +689,7 @@
                                               bool usesFragCoord)
 {
     TVariable *anglePosition = AddANGLEPositionVaryingDeclaration(root, symbolTable, EvqVaryingIn);
-    const TType *vec2Type    = StaticType::GetTemporary<EbtFloat, 2>();
+    const TType *vec2Type    = StaticType::GetTemporary<EbtFloat, EbpHigh, 2>();
 
     TIntermBinary *viewportRef = driverUniforms->getViewportRef();
 
@@ -664,7 +697,7 @@
     TIntermSwizzle *viewportXY    = CreateSwizzle(viewportRef->deepCopy(), 0, 1);
     TIntermSwizzle *viewportZW    = CreateSwizzle(viewportRef, 2, 3);
     TIntermSymbol *position       = new TIntermSymbol(anglePosition);
-    TIntermConstantUnion *oneHalf = CreateFloatNode(0.5f);
+    TIntermConstantUnion *oneHalf = CreateFloatNode(0.5f, EbpMedium);
     TIntermBinary *halfPosition   = new TIntermBinary(EOpVectorTimesScalar, position, oneHalf);
     TIntermBinary *offsetHalfPosition =
         new TIntermBinary(EOpAdd, halfPosition, oneHalf->deepCopy());
@@ -683,7 +716,8 @@
     TIntermDeclaration *dDecl = CreateTempInitDeclarationNode(d, dfsum);
 
     // vec2 f = gl_FragCoord.xy
-    const TVariable *fragCoord  = BuiltInVariable::gl_FragCoord();
+    const TVariable *fragCoord = static_cast<const TVariable *>(
+        symbolTable->findBuiltIn(ImmutableString("gl_FragCoord"), compiler->getShaderVersion()));
     TIntermSwizzle *fragCoordXY = CreateSwizzle(new TIntermSymbol(fragCoord), 0, 1);
     TVariable *f                = CreateTempVariable(symbolTable, vec2Type);
     TIntermDeclaration *fDecl   = CreateTempInitDeclarationNode(f, fragCoordXY);
@@ -718,7 +752,7 @@
     // lines are exactly vertical or horizontal.
     static constexpr float kEpsilon   = 0.0001f;
     static constexpr float kThreshold = 0.5 + kEpsilon;
-    TIntermConstantUnion *threshold   = CreateFloatNode(kThreshold);
+    TIntermConstantUnion *threshold   = CreateFloatNode(kThreshold, EbpHigh);
 
     // if (i.x > (0.5 + e) && i.y > (0.5 + e))
     TIntermSwizzle *ix     = CreateSwizzle(new TIntermSymbol(i), 0);
@@ -837,8 +871,7 @@
     // - It dramatically simplifies future transformations w.r.t to samplers in structs, array of
     //   arrays of opaque types, atomic counters etc.
     // - Avoids the need for shader*ArrayDynamicIndexing Vulkan features.
-    if (!MonomorphizeUnsupportedFunctionsInVulkanGLSL(this, root, &getSymbolTable(),
-                                                      compileOptions))
+    if (!MonomorphizeUnsupportedFunctions(this, root, &getSymbolTable(), compileOptions))
     {
         return false;
     }
@@ -860,9 +893,8 @@
     }
 
     // Replace array of array of opaque uniforms with a flattened array.  This is run after
-    // MonomorphizeUnsupportedFunctionsInVulkanGLSL and RewriteStructSamplers so that it's not
-    // possible for an array of array of opaque type to be partially subscripted and passed to a
-    // function.
+    // MonomorphizeUnsupportedFunctions and RewriteStructSamplers so that it's not possible for an
+    // array of array of opaque type to be partially subscripted and passed to a function.
     if (!RewriteArrayOfArrayOfOpaqueUniforms(this, root, &getSymbolTable()))
     {
         return false;
@@ -947,12 +979,10 @@
             if (outputVarying.name == "gl_ClipDistance")
             {
                 useClipDistance = true;
-                break;
             }
-            if (outputVarying.name == "gl_CullDistance")
+            else if (outputVarying.name == "gl_CullDistance")
             {
                 useCullDistance = true;
-                break;
             }
         }
         for (const ShaderVariable &inputVarying : mInputVaryings)
@@ -960,12 +990,10 @@
             if (inputVarying.name == "gl_ClipDistance")
             {
                 useClipDistance = true;
-                break;
             }
-            if (inputVarying.name == "gl_CullDistance")
+            else if (inputVarying.name == "gl_CullDistance")
             {
                 useCullDistance = true;
-                break;
             }
         }
 
@@ -1066,7 +1094,6 @@
             }
 
             // Emulate gl_FragColor and gl_FragData with normal output variables.
-            mValidateASTOptions.validateVariableReferences = false;
             if (!EmulateFragColorData(this, root, &getSymbolTable()))
             {
                 return false;
@@ -1079,7 +1106,7 @@
                 {
                     flipNegXY = driverUniforms->getNegFlipXYRef();
                 }
-                TIntermConstantUnion *pivot = CreateFloatNode(0.5f);
+                TIntermConstantUnion *pivot = CreateFloatNode(0.5f, EbpMedium);
                 TIntermTyped *fragRotation  = nullptr;
                 if (usePreRotation)
                 {
@@ -1105,7 +1132,7 @@
                 {
                     flipXY = driverUniforms->getFlipXYRef();
                 }
-                TIntermConstantUnion *pivot = CreateFloatNode(0.5f);
+                TIntermConstantUnion *pivot = CreateFloatNode(0.5f, EbpMedium);
                 TIntermTyped *fragRotation  = nullptr;
                 if (usePreRotation)
                 {
@@ -1230,6 +1257,10 @@
 
         case gl::ShaderType::TessControl:
         {
+            if (!ReplaceGLBoundingBoxWithGlobal(this, root, &getSymbolTable()))
+            {
+                return false;
+            }
             WriteTessControlShaderLayoutQualifiers(sink, getTessControlShaderOutputVertices());
             break;
         }
@@ -1266,6 +1297,10 @@
         return false;
     }
 
+    // Make sure function call validation is not accidentally left off anywhere.
+    ASSERT(mValidateASTOptions.validateFunctionCall);
+    ASSERT(mValidateASTOptions.validateNoRawFunctionCalls);
+
     return true;
 }
 
@@ -1314,10 +1349,6 @@
 {
     TInfoSinkBase sink;
 
-    bool precisionEmulation = false;
-    if (!emulatePrecisionIfNeeded(root, sink, &precisionEmulation, SH_SPIRV_VULKAN_OUTPUT))
-        return false;
-
     bool enablePrecision = (compileOptions & SH_IGNORE_PRECISION_QUALIFIERS) == 0;
 
     SpecConst specConst(&getSymbolTable(), compileOptions, getShaderType());
@@ -1342,9 +1373,7 @@
     }
 
 #if defined(ANGLE_ENABLE_DIRECT_SPIRV_GENERATION)
-    if ((compileOptions & SH_GENERATE_SPIRV_DIRECTLY) != 0 &&
-        (getShaderType() == GL_VERTEX_SHADER || getShaderType() == GL_FRAGMENT_SHADER ||
-         getShaderType() == GL_COMPUTE_SHADER))
+    if ((compileOptions & SH_GENERATE_SPIRV_DIRECTLY) != 0)
     {
         // Declare the implicitly defined gl_PerVertex I/O blocks if not already.  This will help
         // SPIR-V generation treat them mostly like usual I/O blocks.
@@ -1353,14 +1382,21 @@
             return false;
         }
 
-        return OutputSPIRV(this, root, compileOptions, precisionEmulation);
+        return OutputSPIRV(this, root, compileOptions);
     }
 #endif
 
+    // When generating text, glslang cannot know the precision of folded constants so it may infer
+    // the wrong precisions.  The following transformation gives constants names with precision to
+    // guide glslang.  This is not an issue for SPIR-V generation because the precision information
+    // is present in the tree already.
+    if (!RecordConstantPrecision(this, root, &getSymbolTable()))
+    {
+        return false;
+    }
+
     // Write translated shader.
-    TOutputVulkanGLSL outputGLSL(sink, getHashFunction(), getNameMap(), &getSymbolTable(),
-                                 getShaderType(), getShaderVersion(), getOutputType(),
-                                 precisionEmulation, enablePrecision, compileOptions);
+    TOutputVulkanGLSL outputGLSL(this, sink, enablePrecision, compileOptions);
     root->traverse(&outputGLSL);
 
     return compileToSpirv(sink);
diff --git a/src/compiler/translator/Types.cpp b/src/compiler/translator/Types.cpp
index 68a6969..1f6e8e0 100644
--- a/src/compiler/translator/Types.cpp
+++ b/src/compiler/translator/Types.cpp
@@ -713,6 +713,13 @@
     invalidateMangledName();
 }
 
+void TType::toComponentType()
+{
+    primarySize   = 1;
+    secondarySize = 1;
+    invalidateMangledName();
+}
+
 void TType::setInterfaceBlock(const TInterfaceBlock *interfaceBlockIn)
 {
     if (mInterfaceBlock != interfaceBlockIn)
diff --git a/src/compiler/translator/Types.h b/src/compiler/translator/Types.h
index 3bd8f55..55a4f71 100644
--- a/src/compiler/translator/Types.h
+++ b/src/compiler/translator/Types.h
@@ -229,6 +229,8 @@
     void toArrayBaseType();
     // Turns a matrix into a column of it.
     void toMatrixColumnType();
+    // Turns a matrix or vector into a component of it.
+    void toComponentType();
 
     const TInterfaceBlock *getInterfaceBlock() const { return mInterfaceBlock; }
     void setInterfaceBlock(const TInterfaceBlock *interfaceBlockIn);
diff --git a/src/compiler/translator/UtilsHLSL.cpp b/src/compiler/translator/UtilsHLSL.cpp
index a6ce0bf..80315f8 100644
--- a/src/compiler/translator/UtilsHLSL.cpp
+++ b/src/compiler/translator/UtilsHLSL.cpp
@@ -8,6 +8,8 @@
 //
 
 #include "compiler/translator/UtilsHLSL.h"
+
+#include "common/utilities.h"
 #include "compiler/translator/IntermNode.h"
 #include "compiler/translator/StructureHLSL.h"
 #include "compiler/translator/SymbolTable.h"
@@ -839,7 +841,7 @@
 
 TString Decorate(const ImmutableString &string)
 {
-    if (!string.beginsWith("gl_"))
+    if (!gl::IsBuiltInName(string.data()))
     {
         return "_" + TString(string.data());
     }
@@ -881,7 +883,7 @@
         ASSERT(!func->name().beginsWith("_"));
         return TString(func->name().data());
     }
-    ASSERT(!func->name().beginsWith("gl_"));
+    ASSERT(!gl::IsBuiltInName(func->name().data()));
     // Add an additional f prefix to functions so that they're always disambiguated from variables.
     // This is necessary in the corner case where a variable declaration hides a function that it
     // uses in its initializer.
@@ -1076,14 +1078,14 @@
 {
     switch (qualifier)
     {
-        case EvqIn:
+        case EvqParamIn:
             return "in";
-        case EvqOut:
+        case EvqParamOut:
             return "inout";  // 'out' results in an HLSL error if not all fields are written, for
                              // GLSL it's undefined
-        case EvqInOut:
+        case EvqParamInOut:
             return "inout";
-        case EvqConstReadOnly:
+        case EvqParamConst:
             return "const";
         case EvqSampleOut:
             return "sample";
diff --git a/src/compiler/translator/ValidateAST.cpp b/src/compiler/translator/ValidateAST.cpp
index e2dfba3..4aefb5a 100644
--- a/src/compiler/translator/ValidateAST.cpp
+++ b/src/compiler/translator/ValidateAST.cpp
@@ -6,11 +6,13 @@
 
 #include "compiler/translator/ValidateAST.h"
 
+#include "common/utilities.h"
 #include "compiler/translator/Diagnostics.h"
 #include "compiler/translator/ImmutableStringBuilder.h"
 #include "compiler/translator/Symbol.h"
 #include "compiler/translator/tree_util/IntermTraverse.h"
 #include "compiler/translator/tree_util/SpecializationConstant.h"
+#include "compiler/translator/util.h"
 
 namespace sh
 {
@@ -53,8 +55,16 @@
     // Visit a structure or interface block, and recursively visit its fields of structure type.
     void visitStructOrInterfaceBlockDeclaration(const TType &type, const TSourceLoc &location);
     void visitStructInDeclarationUsage(const TType &type, const TSourceLoc &location);
-    // Visit a unary or aggregate node and validate it's built-in op against it's built-in function.
-    void visitBuiltIn(TIntermOperator *op, const TFunction *function);
+    // Visit a unary or aggregate node and validate its built-in op against its built-in function.
+    void visitBuiltInFunction(TIntermOperator *op, const TFunction *function);
+    // Visit an aggregate node and validate its function call is to one that's already defined.
+    void visitFunctionCall(TIntermAggregate *node);
+    // Visit a binary node and validate its type against its operands.
+    void validateExpressionTypeBinary(TIntermBinary *node);
+    // Visit a symbol node and validate it's declared previously.
+    void visitVariableNeedingDeclaration(TIntermSymbol *node);
+    // Visit a built-in symbol node and validate it's consistently used across the tree.
+    void visitBuiltInVariable(TIntermSymbol *node);
 
     void scope(Visit visit);
     bool isVariableDeclared(const TVariable *variable);
@@ -76,22 +86,47 @@
     // For validateVariableReferences:
     std::vector<std::set<const TVariable *>> mDeclaredVariables;
     std::set<const TInterfaceBlock *> mNamelessInterfaceBlocks;
+    std::map<ImmutableString, const TVariable *> mReferencedBuiltIns;
     bool mVariableReferencesFailed = false;
 
     // For validateBuiltInOps:
     bool mBuiltInOpsFailed = false;
 
+    // For validateFunctionCall:
+    std::set<const TFunction *> mDeclaredFunctions;
+    bool mFunctionCallFailed = false;
+
+    // For validateNoRawFunctionCalls:
+    bool mNoRawFunctionCallsFailed = false;
+
     // For validateNullNodes:
     bool mNullNodesFailed = false;
 
+    // For validateQualifiers:
+    bool mQualifiersFailed = false;
+
+    // For validatePrecision:
+    bool mPrecisionFailed = false;
+
     // For validateStructUsage:
     std::vector<std::map<ImmutableString, const TFieldListCollection *>> mStructsAndBlocksByName;
     bool mStructUsageFailed = false;
 
+    // For validateExpressionTypes:
+    bool mExpressionTypesFailed = false;
+
     // For validateMultiDeclarations:
     bool mMultiDeclarationsFailed = false;
 };
 
+bool IsSameType(const TType &a, const TType &b)
+{
+    return a.getBasicType() == b.getBasicType() && a.getNominalSize() == b.getNominalSize() &&
+           a.getSecondarySize() == b.getSecondarySize() && a.getArraySizes() == b.getArraySizes() &&
+           a.getStruct() == b.getStruct() &&
+           (!a.isInterfaceBlock() || a.getInterfaceBlock() == b.getInterfaceBlock());
+}
+
 bool ValidateAST::validate(TIntermNode *root,
                            TDiagnostics *diagnostics,
                            const ValidateASTOptions &options)
@@ -112,6 +147,7 @@
     if (!isTreeRoot)
     {
         mOptions.validateVariableReferences = false;
+        mOptions.validateFunctionCall       = false;
     }
 
     if (mOptions.validateSingleParent)
@@ -161,6 +197,20 @@
     {
         ASSERT(!typeName.empty());
 
+        // Allow gl_PerVertex to be doubly-defined.
+        if (typeName == "gl_PerVertex")
+        {
+            if (IsShaderIn(type.getQualifier()))
+            {
+                typeName = ImmutableString("gl_PerVertex<input>");
+            }
+            else
+            {
+                ASSERT(IsShaderOut(type.getQualifier()));
+                typeName = ImmutableString("gl_PerVertex<output>");
+            }
+        }
+
         if (mStructsAndBlocksByName.back().find(typeName) != mStructsAndBlocksByName.back().end())
         {
             mDiagnostics->error(location,
@@ -235,7 +285,7 @@
     }
 }
 
-void ValidateAST::visitBuiltIn(TIntermOperator *node, const TFunction *function)
+void ValidateAST::visitBuiltInFunction(TIntermOperator *node, const TFunction *function)
 {
     const TOperator op = node->getOp();
     if (!BuiltInGroup::IsBuiltIn(op))
@@ -267,6 +317,175 @@
     }
 }
 
+void ValidateAST::visitFunctionCall(TIntermAggregate *node)
+{
+    if (node->getOp() != EOpCallFunctionInAST)
+    {
+        return;
+    }
+
+    const TFunction *function = node->getFunction();
+
+    if (function == nullptr)
+    {
+        mDiagnostics->error(node->getLine(),
+                            "Found node calling function without a reference to it",
+                            "<validateFunctionCall>");
+        mFunctionCallFailed = true;
+    }
+    else if (mDeclaredFunctions.find(function) == mDeclaredFunctions.end())
+    {
+        mDiagnostics->error(node->getLine(),
+                            "Found node calling previously undeclared function "
+                            "<validateFunctionCall>",
+                            function->name().data());
+        mFunctionCallFailed = true;
+    }
+}
+
+void ValidateAST::validateExpressionTypeBinary(TIntermBinary *node)
+{
+    switch (node->getOp())
+    {
+        case EOpIndexDirect:
+        case EOpIndexIndirect:
+        {
+            TType expectedType(node->getLeft()->getType());
+            if (!expectedType.isArray())
+            {
+                // TODO: Validate matrix column selection and vector component selection.
+                // http://anglebug.com/2733
+                break;
+            }
+
+            expectedType.toArrayElementType();
+
+            if (!IsSameType(node->getType(), expectedType))
+            {
+                const TSymbol *symbol = expectedType.getStruct();
+                if (symbol == nullptr)
+                {
+                    symbol = expectedType.getInterfaceBlock();
+                }
+                const char *name = nullptr;
+                if (symbol)
+                {
+                    name = symbol->name().data();
+                }
+                else if (expectedType.isScalar())
+                {
+                    name = "<scalar array>";
+                }
+                else if (expectedType.isVector())
+                {
+                    name = "<vector array>";
+                }
+                else
+                {
+                    ASSERT(expectedType.isMatrix());
+                    name = "<matrix array>";
+                }
+
+                mDiagnostics->error(
+                    node->getLine(),
+                    "Found index node with type that is inconsistent with the array being indexed "
+                    "<validateExpressionTypes>",
+                    name);
+                mExpressionTypesFailed = true;
+            }
+        }
+        break;
+        default:
+            // TODO: Validate other expressions. http://anglebug.com/2733
+            break;
+    }
+}
+
+void ValidateAST::visitVariableNeedingDeclaration(TIntermSymbol *node)
+{
+    const TVariable *variable = &node->variable();
+    const TType &type         = node->getType();
+
+    // If it's a reference to a field of a nameless interface block, match it by index and name.
+    if (type.getInterfaceBlock() && !type.isInterfaceBlock())
+    {
+        const TInterfaceBlock *interfaceBlock = type.getInterfaceBlock();
+        const TFieldList &fieldList           = interfaceBlock->fields();
+        const size_t fieldIndex               = type.getInterfaceBlockFieldIndex();
+
+        if (mNamelessInterfaceBlocks.count(interfaceBlock) == 0)
+        {
+            mDiagnostics->error(node->getLine(),
+                                "Found reference to undeclared or inconsistenly transformed "
+                                "nameless interface block <validateVariableReferences>",
+                                node->getName().data());
+            mVariableReferencesFailed = true;
+        }
+        else if (fieldIndex >= fieldList.size() || node->getName() != fieldList[fieldIndex]->name())
+        {
+            mDiagnostics->error(node->getLine(),
+                                "Found reference to inconsistenly transformed nameless "
+                                "interface block field <validateVariableReferences>",
+                                node->getName().data());
+            mVariableReferencesFailed = true;
+        }
+        return;
+    }
+
+    const bool isStructDeclaration =
+        type.isStructSpecifier() && variable->symbolType() == SymbolType::Empty;
+
+    if (!isStructDeclaration && !isVariableDeclared(variable))
+    {
+        mDiagnostics->error(node->getLine(),
+                            "Found reference to undeclared or inconsistently transformed "
+                            "variable <validateVariableReferences>",
+                            node->getName().data());
+        mVariableReferencesFailed = true;
+    }
+}
+
+void ValidateAST::visitBuiltInVariable(TIntermSymbol *node)
+{
+    const TVariable *variable = &node->variable();
+    ImmutableString name      = variable->name();
+
+    if (mOptions.validateVariableReferences)
+    {
+        auto iter = mReferencedBuiltIns.find(name);
+        if (iter == mReferencedBuiltIns.end())
+        {
+            mReferencedBuiltIns[name] = variable;
+            return;
+        }
+
+        if (variable != iter->second)
+        {
+            mDiagnostics->error(
+                node->getLine(),
+                "Found inconsistent references to built-in variable <validateVariableReferences>",
+                name.data());
+            mVariableReferencesFailed = true;
+        }
+    }
+
+    if (mOptions.validateQualifiers)
+    {
+        TQualifier qualifier = variable->getType().getQualifier();
+
+        if ((name == "gl_ClipDistance" && qualifier != EvqClipDistance) ||
+            (name == "gl_CullDistance" && qualifier != EvqCullDistance) ||
+            (name == "gl_LastFragData" && qualifier != EvqLastFragData))
+        {
+            mDiagnostics->error(
+                node->getLine(),
+                "Incorrect qualifier applied to redeclared built-in <validateQualifiers>",
+                name.data());
+            mQualifiersFailed = true;
+        }
+    }
+}
+
 void ValidateAST::scope(Visit visit)
 {
     if (mOptions.validateVariableReferences)
@@ -312,7 +531,7 @@
 bool ValidateAST::variableNeedsDeclaration(const TVariable *variable)
 {
     // Don't expect declaration for built-in variables.
-    if (variable->name().beginsWith("gl_"))
+    if (gl::IsBuiltInName(variable->name().data()))
     {
         return false;
     }
@@ -378,48 +597,31 @@
     visitNode(PreVisit, node);
 
     const TVariable *variable = &node->variable();
-    const TType &type         = node->getType();
 
-    if (mOptions.validateVariableReferences && variableNeedsDeclaration(variable))
+    if (mOptions.validateVariableReferences)
     {
-        // If it's a reference to a field of a nameless interface block, match it by index and name.
-        if (type.getInterfaceBlock() && !type.isInterfaceBlock())
+        if (variableNeedsDeclaration(variable))
         {
-            const TInterfaceBlock *interfaceBlock = type.getInterfaceBlock();
-            const TFieldList &fieldList           = interfaceBlock->fields();
-            const size_t fieldIndex               = type.getInterfaceBlockFieldIndex();
-
-            if (mNamelessInterfaceBlocks.count(interfaceBlock) == 0)
-            {
-                mDiagnostics->error(node->getLine(),
-                                    "Found reference to undeclared or inconsistenly transformed "
-                                    "nameless interface block <validateVariableReferences>",
-                                    node->getName().data());
-                mVariableReferencesFailed = true;
-            }
-            else if (fieldIndex >= fieldList.size() ||
-                     node->getName() != fieldList[fieldIndex]->name())
-            {
-                mDiagnostics->error(node->getLine(),
-                                    "Found reference to inconsistenly transformed nameless "
-                                    "interface block field <validateVariableReferences>",
-                                    node->getName().data());
-                mVariableReferencesFailed = true;
-            }
+            visitVariableNeedingDeclaration(node);
         }
-        else
-        {
-            const bool isStructDeclaration =
-                type.isStructSpecifier() && variable->symbolType() == SymbolType::Empty;
+    }
 
-            if (!isStructDeclaration && !isVariableDeclared(variable))
-            {
-                mDiagnostics->error(node->getLine(),
-                                    "Found reference to undeclared or inconsistently transformed "
-                                    "variable <validateVariableReferences>",
-                                    node->getName().data());
-                mVariableReferencesFailed = true;
-            }
+    const bool isBuiltIn = gl::IsBuiltInName(variable->name().data());
+    if (isBuiltIn)
+    {
+        visitBuiltInVariable(node);
+    }
+
+    if (mOptions.validatePrecision)
+    {
+        if (!isBuiltIn && IsPrecisionApplicableToType(node->getBasicType()) &&
+            node->getType().getPrecision() == EbpUndefined)
+        {
+            // Note that some built-ins don't have a precision.
+            mDiagnostics->error(node->getLine(),
+                                "Found symbol with undefined precision <validatePrecision>",
+                                variable->name().data());
+            mPrecisionFailed = true;
         }
     }
 }
@@ -438,6 +640,12 @@
 bool ValidateAST::visitBinary(Visit visit, TIntermBinary *node)
 {
     visitNode(visit, node);
+
+    if (mOptions.validateExpressionTypes && visit == PreVisit)
+    {
+        validateExpressionTypeBinary(node);
+    }
+
     return true;
 }
 
@@ -447,7 +655,7 @@
 
     if (visit == PreVisit && mOptions.validateBuiltInOps)
     {
-        visitBuiltIn(node, node->getFunction());
+        visitBuiltInFunction(node, node->getFunction());
     }
 
     return true;
@@ -480,6 +688,54 @@
 void ValidateAST::visitFunctionPrototype(TIntermFunctionPrototype *node)
 {
     visitNode(PreVisit, node);
+
+    if (mOptions.validateFunctionCall)
+    {
+        const TFunction *function = node->getFunction();
+        mDeclaredFunctions.insert(function);
+    }
+
+    const TFunction *function = node->getFunction();
+    for (size_t paramIndex = 0; paramIndex < function->getParamCount(); ++paramIndex)
+    {
+        const TVariable *param = function->getParam(paramIndex);
+        const TType &paramType = param->getType();
+
+        if (mOptions.validateQualifiers)
+        {
+            TQualifier qualifier = paramType.getQualifier();
+            if (qualifier != EvqParamIn && qualifier != EvqParamOut && qualifier != EvqParamInOut &&
+                qualifier != EvqParamConst)
+            {
+                mDiagnostics->error(node->getLine(),
+                                    "Found function prototype with an invalid qualifier "
+                                    "<validateQualifiers>",
+                                    param->name().data());
+                mQualifiersFailed = true;
+            }
+        }
+
+        if (mOptions.validatePrecision && IsPrecisionApplicableToType(paramType.getBasicType()) &&
+            paramType.getPrecision() == EbpUndefined)
+        {
+            mDiagnostics->error(
+                node->getLine(),
+                "Found function parameter with undefined precision <validatePrecision>",
+                param->name().data());
+            mPrecisionFailed = true;
+        }
+    }
+
+    const TType &returnType = function->getReturnType();
+    if (mOptions.validatePrecision && IsPrecisionApplicableToType(returnType.getBasicType()) &&
+        returnType.getPrecision() == EbpUndefined)
+    {
+        mDiagnostics->error(
+            node->getLine(),
+            "Found function with undefined precision on return value <validatePrecision>",
+            function->name().data());
+        mPrecisionFailed = true;
+    }
 }
 
 bool ValidateAST::visitFunctionDefinition(Visit visit, TIntermFunctionDefinition *node)
@@ -520,7 +776,24 @@
 
     if (visit == PreVisit && mOptions.validateBuiltInOps)
     {
-        visitBuiltIn(node, node->getFunction());
+        visitBuiltInFunction(node, node->getFunction());
+    }
+
+    if (visit == PreVisit && mOptions.validateFunctionCall)
+    {
+        visitFunctionCall(node);
+    }
+
+    if (visit == PreVisit && mOptions.validateNoRawFunctionCalls)
+    {
+        if (node->getOp() == EOpCallInternalRawFunction)
+        {
+            mDiagnostics->error(node->getLine(),
+                                "Found node calling a raw function (deprecated) "
+                                "<validateNoRawFunctionCalls>",
+                                node->getFunction()->name().data());
+            mNoRawFunctionCallsFailed = true;
+        }
     }
 
     return true;
@@ -564,6 +837,19 @@
 
     if (mOptions.validateMultiDeclarations && sequence.size() > 1)
     {
+        TIntermSymbol *symbol = sequence[1]->getAsSymbolNode();
+        if (symbol == nullptr)
+        {
+            TIntermBinary *init = sequence[1]->getAsBinaryNode();
+            ASSERT(init && init->getOp() == EOpInitialize);
+            symbol = init->getLeft()->getAsSymbolNode();
+        }
+        ASSERT(symbol);
+
+        mDiagnostics->error(node->getLine(),
+                            "Found multiple declarations where SeparateDeclarations should have "
+                            "separated them <validateMultiDeclarations>",
+                            symbol->variable().name().data());
         mMultiDeclarationsFailed = true;
     }
 
@@ -583,6 +869,7 @@
             ASSERT(symbol);
 
             const TVariable *variable = &symbol->variable();
+            const TType &type         = variable->getType();
 
             if (mOptions.validateVariableReferences)
             {
@@ -617,10 +904,37 @@
                 // Only declare the struct once.
                 validateStructUsage = false;
 
-                const TType &type = variable->getType();
                 if (type.isStructSpecifier() || type.isInterfaceBlock())
                     visitStructOrInterfaceBlockDeclaration(type, node->getLine());
             }
+
+            if (gl::IsBuiltInName(variable->name().data()))
+            {
+                visitBuiltInVariable(symbol);
+            }
+
+            if (mOptions.validatePrecision && (type.isStructSpecifier() || type.isInterfaceBlock()))
+            {
+                const TFieldListCollection *structOrBlock = type.getStruct();
+                if (structOrBlock == nullptr)
+                {
+                    structOrBlock = type.getInterfaceBlock();
+                }
+
+                for (const TField *field : structOrBlock->fields())
+                {
+                    const TType *fieldType = field->type();
+                    if (IsPrecisionApplicableToType(fieldType->getBasicType()) &&
+                        fieldType->getPrecision() == EbpUndefined)
+                    {
+                        mDiagnostics->error(
+                            node->getLine(),
+                            "Found block field with undefined precision <validatePrecision>",
+                            field->name().data());
+                        mPrecisionFailed = true;
+                    }
+                }
+            }
         }
     }
 
@@ -647,13 +961,24 @@
 bool ValidateAST::validateInternal()
 {
     return !mSingleParentFailed && !mVariableReferencesFailed && !mBuiltInOpsFailed &&
-           !mNullNodesFailed && !mStructUsageFailed && !mMultiDeclarationsFailed;
+           !mFunctionCallFailed && !mNoRawFunctionCallsFailed && !mNullNodesFailed &&
+           !mQualifiersFailed && !mPrecisionFailed && !mStructUsageFailed &&
+           !mExpressionTypesFailed && !mMultiDeclarationsFailed;
 }
 
 }  // anonymous namespace
 
 bool ValidateAST(TIntermNode *root, TDiagnostics *diagnostics, const ValidateASTOptions &options)
 {
+    // ValidateAST is called after transformations, so if |validateNoMoreTransformations| is set,
+    // it's immediately an error.
+    if (options.validateNoMoreTransformations)
+    {
+        diagnostics->error(kNoSourceLoc, "Unexpected transformation after AST post-processing",
+                           "<validateNoMoreTransformations>");
+        return false;
+    }
+
     return ValidateAST::validate(root, diagnostics, options);
 }
 
diff --git a/src/compiler/translator/ValidateAST.h b/src/compiler/translator/ValidateAST.h
index 719bdb3..887367d 100644
--- a/src/compiler/translator/ValidateAST.h
+++ b/src/compiler/translator/ValidateAST.h
@@ -23,7 +23,8 @@
 
     // Check that every node always has only one parent,
     bool validateSingleParent = true;
-    // Check that all symbols reference TVariables that have been declared.
+    // Check that all symbols reference TVariables that have been declared.  For built-ins, this
+    // makes sure that the same GLSL built-in uses the same TVariable consistently.
     bool validateVariableReferences = true;
     // Whether validateVariableReferences should also include specialization constants.  Their
     // declaration is output after their usage is discovered, so this is disabled until then.
@@ -34,14 +35,30 @@
     // Check that all EOpCallFunctionInAST have their corresponding function definitions in the AST,
     // with matching symbol ids. There should also be at least a prototype declaration before the
     // function is called.
-    bool validateFunctionCall = true;  // TODO
+    bool validateFunctionCall = true;
+    // Check that EOpCallInternalRawFunction is not used.  This OP is deprecated and needs to be
+    // removed.  http://anglebug.com/6059
+    bool validateNoRawFunctionCalls = true;
     // Check that there are no null nodes where they are not allowed, for example as children of
     // TIntermDeclaration or TIntermBlock.
     bool validateNullNodes = true;
     // Check that symbols that reference variables have consistent qualifiers and symbol ids with
-    // the variable declaration. For example, references to function out parameters should be
-    // EvqOut.
-    bool validateQualifiers = true;  // TODO
+    // the variable declaration.  The following needs to be validated:
+    //
+    // Implemented:
+    //
+    //  - Function parameters having one of EvqParam* qualifiers.
+    //  - gl_ClipDistance, gl_CullDistance and gl_LastFragData are correctly qualified even when
+    //    redeclared in the shader.
+    //
+    // TODO:
+    //
+    //  - Function-local variables must have the EvqTemporary qualifier.
+    //  - Symbol references and declarations have identical qualifiers.
+    bool validateQualifiers = true;
+    // Check that every symbol has its precision specified.  That includes variables, block members,
+    // function parameters and return values.
+    bool validatePrecision = true;
     // Check that variable declarations that can't have initializers don't have initializers
     // (varyings, uniforms for example).
     bool validateInitializers = true;  // TODO
@@ -53,10 +70,26 @@
     // as validateVariableReferences already ensures other references to the struct match the
     // declaration.
     bool validateStructUsage = true;
-    // Check that expression nodes have the correct type considering their operand(s).
-    bool validateExpressionTypes = true;  // TODO
+    // Check that expression nodes have the correct type considering their operand(s).  The
+    // following validation is possible:
+    //
+    // Implemented:
+    //
+    //  - Binary node that indexes T[] should have type T
+    //
+    // TODO:
+    //
+    //  - Function calls (including built-ins) have the same return type in the node and function.
+    //  - Unary and binary operators have the correct type based on operands
+    //  - Swizzle result has same type as the operand except for vector size
+    //  - Ternary operator has the same type as the operands
+    bool validateExpressionTypes = true;
     // If SeparateDeclarations has been run, check for the absence of multi declarations as well.
     bool validateMultiDeclarations = false;
+
+    // Once set, disallows any further transformations on the tree.  Used before AST post-processing
+    // which requires that the tree remains unmodified.
+    bool validateNoMoreTransformations = false;
 };
 
 // Check for errors and output error messages on the context.
diff --git a/src/compiler/translator/ValidateBarrierFunctionCall.cpp b/src/compiler/translator/ValidateBarrierFunctionCall.cpp
index 2347990..c36406e 100644
--- a/src/compiler/translator/ValidateBarrierFunctionCall.cpp
+++ b/src/compiler/translator/ValidateBarrierFunctionCall.cpp
@@ -46,7 +46,7 @@
 
     bool visitAggregate(Visit visit, TIntermAggregate *node) override
     {
-        if (node->getOp() != EOpBarrier)
+        if (node->getOp() != EOpBarrierTCS)
         {
             return true;
         }
diff --git a/src/compiler/translator/ValidateOutputs.cpp b/src/compiler/translator/ValidateOutputs.cpp
index c92f054..5ba70c4 100644
--- a/src/compiler/translator/ValidateOutputs.cpp
+++ b/src/compiler/translator/ValidateOutputs.cpp
@@ -82,7 +82,7 @@
             mUnspecifiedLocationOutputs.push_back(symbol);
         }
     }
-    else if (qualifier == EvqFragDepth || qualifier == EvqFragDepthEXT)
+    else if (qualifier == EvqFragDepth)
     {
         mUsesFragDepth = true;
     }
diff --git a/src/compiler/translator/VersionGLSL.cpp b/src/compiler/translator/VersionGLSL.cpp
index 87ada98..3ff4216 100644
--- a/src/compiler/translator/VersionGLSL.cpp
+++ b/src/compiler/translator/VersionGLSL.cpp
@@ -122,7 +122,7 @@
         if (type.isArray())
         {
             TQualifier qualifier = type.getQualifier();
-            if ((qualifier == EvqOut) || (qualifier == EvqInOut))
+            if ((qualifier == EvqParamOut) || (qualifier == EvqParamInOut))
             {
                 ensureVersionIsAtLeast(GLSL_VERSION_120);
                 break;
diff --git a/src/compiler/translator/builtin_function_declarations.txt b/src/compiler/translator/builtin_function_declarations.txt
index 51e727e..7dceeeb 100644
--- a/src/compiler/translator/builtin_function_declarations.txt
+++ b/src/compiler/translator/builtin_function_declarations.txt
@@ -946,7 +946,7 @@
     vec3 yuv_2_rgb(vec3, yuvCscStandardEXT);
 GROUP END EXT_YUV_target
 
-GROUP BEGIN DerivativesFS {"shader_type": "FRAGMENT"}
+GROUP BEGIN DerivativesFS {"queryFunction": true, "shader_type": "FRAGMENT"}
   DEFAULT METADATA {"essl_level": "ESSL1_BUILTINS", "essl_extension": "OES_standard_derivatives", "hasSideEffects": "true", "suffix": "Ext"}
     genType dFdx(genType);
     genType dFdy(genType);
@@ -993,7 +993,7 @@
     vec4 interpolateAtOffset(vec4, vec2);
 GROUP END InterpolationFS
 
-GROUP BEGIN AtomicCounter
+GROUP BEGIN AtomicCounter {"queryFunction": true}
   DEFAULT METADATA {"essl_level": "ESSL3_1_BUILTINS", "glsl_level": "GLSL4_2_BUILTINS", "hasSideEffects": "true"}
     uint atomicCounter(atomic_uint);
     uint atomicCounterIncrement(atomic_uint);
@@ -1171,7 +1171,7 @@
 GROUP END ESSL310CS
 
 GROUP BEGIN ESSL310TCS {"shader_type": "TESS_CONTROL_EXT"}
-  DEFAULT METADATA {"essl_level": "ESSL3_1_BUILTINS", "essl_extension": "EXT_tessellation_shader", "essl_extension_becomes_core_in": "ESSL3_2_BUILTINS", "opSuffix": "TCS", "hasSideEffects": true}
+  DEFAULT METADATA {"essl_level": "ESSL3_1_BUILTINS", "essl_extension": "EXT_tessellation_shader", "essl_extension_becomes_core_in": "ESSL3_2_BUILTINS", "opSuffix": "TCS", "hasSideEffects": true, "suffix": "TCS"}
     void barrier();
 GROUP END ESSL310TCS
 
@@ -1188,7 +1188,7 @@
 GROUP END GS
 
 GROUP BEGIN SubpassInput
-  DEFAULT METADATA {"glsl_level": "GLSL4_6_BUILTINS", "hasSideEffects": "true"}
+  DEFAULT METADATA {"glsl_level": "GLSL4_6_BUILTINS", "essl_level": "ESSL_VULKAN_BUILTINS", "hasSideEffects": "true"}
     gvec4 subpassLoad(gsubpassInput);
     gvec4 subpassLoad(gsubpassInputMS, int);
 GROUP END SubpassInput
diff --git a/src/compiler/translator/builtin_variables.json b/src/compiler/translator/builtin_variables.json
index 8c6f29a..b357ab2 100644
--- a/src/compiler/translator/builtin_variables.json
+++ b/src/compiler/translator/builtin_variables.json
@@ -754,7 +754,7 @@
         "shader_type": "FRAGMENT",
         "variables":{
             "gl_FragCoord":{
-                "essl_level":"COMMON_BUILTINS",
+                "essl_level":"ESSL1_BUILTINS",
                 "type":{
                     "basic":"Float",
                     "precision":"Medium",
@@ -808,6 +808,20 @@
             }
         },
         "subgroups":{
+            "ES300":{
+                "variables":{
+                    "gl_FragCoord":{
+                        "essl_level":"ESSL3_BUILTINS",
+                        "suffix":"300",
+                        "type":{
+                            "basic":"Float",
+                            "precision":"High",
+                            "qualifier":"FragCoord",
+                            "primarySize":4
+                        }
+                    }
+                }
+            },
             "EXTBlendFuncExtended":{
                 "variables":{
                     "gl_SecondaryFragColorEXT":{
@@ -832,7 +846,7 @@
                     "gl_FragDepthEXT":{
                         "essl_level":"ESSL1_BUILTINS",
                         "essl_extension":"EXT_frag_depth",
-                        "initDynamicType":"TType *{type_name} = new TType(EbtFloat, resources.FragmentPrecisionHigh ? EbpHigh : EbpMedium, EvqFragDepthEXT, 1);"
+                        "initDynamicType":"TType *{type_name} = new TType(EbtFloat, resources.FragmentPrecisionHigh ? EbpHigh : EbpMedium, EvqFragDepth, 1);"
                     }
                 }
             },
@@ -979,7 +993,7 @@
                 }
             },
             "gl_PointSize":{
-                "essl_level":"COMMON_BUILTINS",
+                "essl_level":"ESSL1_BUILTINS",
                 "type":{
                     "basic":"Float",
                     "precision":"Medium",
@@ -1041,6 +1055,19 @@
             }
         },
         "subgroups":{
+            "ES300":{
+                "variables":{
+                    "gl_PointSize":{
+                        "essl_level":"ESSL3_BUILTINS",
+                        "suffix":"300",
+                        "type":{
+                            "basic":"Float",
+                            "precision":"High",
+                            "qualifier":"PointSize"
+                        }
+                    }
+                }
+            },
             "ANGLEMultiDraw":{
                 "subgroups":{
                   "ESSL3":{
@@ -1386,6 +1413,17 @@
                         "initDynamicType":"TType *{type_name} = new TType(EbtFloat, EbpHigh, EvqPosition, 4); {type_name}->setInterfaceBlock(gl_PerVertexOutTcsBlock{ext_or_core_suffix});"
                     }
                 }
+            },
+            "EXTPrimitiveBoundingBox":{
+                "variables":{
+                    "gl_BoundingBoxEXT":{
+                        "suffix":"TCS",
+                        "essl_level":"ESSL3_1_BUILTINS",
+                        "essl_extension":"EXT_tessellation_shader",
+                        "essl_extension_becomes_core_in":"ESSL3_2_BUILTINS",
+                        "initDynamicType":"TType *{type_name} = new TType(EbtFloat, EbpHigh, EvqBoundingBoxEXT, 4); {type_name}->makeArray(4u);"
+                    }
+                }
             }
         }
     },
@@ -1419,7 +1457,8 @@
                 "type":{
                     "basic":"Float",
                     "precision":"High",
-                    "primarySize":3
+                    "primarySize":3,
+                    "qualifier":"TessCoord"
                 }
             },
             "gl_TessLevelOuter":{
diff --git a/src/compiler/translator/gen_builtin_symbols.py b/src/compiler/translator/gen_builtin_symbols.py
index d2a4dbb..7006fbc 100755
--- a/src/compiler/translator/gen_builtin_symbols.py
+++ b/src/compiler/translator/gen_builtin_symbols.py
@@ -415,7 +415,9 @@
     // with AST traversers:
     // * They should not return arrays.
     // * They should not have out parameters.
-    // TODO: remove this.  http://anglebug.com/6059
+    //
+    // DEPRECATED; DO NOT USE.  TODO: remove this.  http://anglebug.com/6059
+    //
     EOpCallInternalRawFunction,
 
     //
@@ -660,7 +662,8 @@
 
 
 essl_levels = [
-    'ESSL3_2_BUILTINS', 'ESSL3_1_BUILTINS', 'ESSL3_BUILTINS', 'ESSL1_BUILTINS', 'COMMON_BUILTINS'
+    'ESSL3_2_BUILTINS', 'ESSL3_1_BUILTINS', 'ESSL3_BUILTINS', 'ESSL1_BUILTINS', 'COMMON_BUILTINS',
+    'ESSL_VULKAN_BUILTINS'
 ]
 
 glsl_levels = [
@@ -682,6 +685,8 @@
 def get_essl_shader_version_for_level(level):
     if level == None:
         return '-1'
+    elif level == 'ESSL_VULKAN_BUILTINS':
+        return 'kESSLVulkanOnly'
     elif level == 'ESSL3_2_BUILTINS':
         return '320'
     elif level == 'ESSL3_1_BUILTINS':
@@ -852,7 +857,7 @@
     def get_offsets(self):
         return self.offsets
 
-    def update_arrays(self):
+    def update_arrays(self, essl_only):
 
         def add_rule(rules, spec, level, shaders, extension, symbol):
             var = ("&TableBase::%s" % symbol) if symbol.startswith("m_gl") else None
@@ -894,7 +899,7 @@
                     add_rule(rules, "ESSL", data['essl_level'], data['shader_type'], None,
                              data["symbol"])
 
-                if "symbol" in data and "glsl_level" in data:
+                if "symbol" in data and "glsl_level" in data and not essl_only:
                     add_rule(rules, "GLSL", data['glsl_level'], data['shader_type'], None,
                              data["symbol"])
 
@@ -902,7 +907,7 @@
                     add_rule(rules, "ESSL", data['essl_level2'], data['shader_type2'], None,
                              data["symbol2"])
 
-                if "symbol2" in data and "glsl_level2" in data:
+                if "symbol2" in data and "glsl_level2" in data and not essl_only:
                     add_rule(rules, "GLSL", data['glsl_level2'], data['shader_type2'], None,
                              data["symbol2"])
 
@@ -910,7 +915,7 @@
                     add_rule(rules, "ESSL", data['essl_level3'], data['shader_type3'], None,
                              data["symbol3"])
 
-                if "symbol3" in data and "glsl_level3" in data:
+                if "symbol3" in data and "glsl_level3" in data and not essl_only:
                     add_rule(rules, "GLSL", data['glsl_level3'], data['shader_type3'], None,
                              data["symbol3"])
 
@@ -918,7 +923,7 @@
                     add_rule(rules, "ESSL", data['essl_level4'], data['shader_type4'], None,
                              data["symbol4"])
 
-                if "symbol4" in data and "glsl_level4" in data:
+                if "symbol4" in data and "glsl_level4" in data and not essl_only:
                     add_rule(rules, "GLSL", data['glsl_level4'], data['shader_type4'], None,
                              data["symbol4"])
 
@@ -926,7 +931,7 @@
                     add_rule(rules, "ESSL", data["essl_ext_level"], data["essl_ext_shader_type"],
                              data["essl_extension"], data["essl_ext_symbol"])
 
-                if "glsl_ext_symbol" in data:
+                if "glsl_ext_symbol" in data and not essl_only:
                     add_rule(rules, "GLSL", data["glsl_ext_level"], data["glsl_ext_shader_type"],
                              data["glsl_extension"], data["glsl_ext_symbol"])
 
@@ -1143,11 +1148,11 @@
             return type_obj
         if glsl_header_type.startswith('out '):
             type_obj = self.parse_type(glsl_header_type[4:])
-            type_obj['qualifier'] = 'Out'
+            type_obj['qualifier'] = 'ParamOut'
             return type_obj
         if glsl_header_type.startswith('inout '):
             type_obj = self.parse_type(glsl_header_type[6:])
-            type_obj['qualifier'] = 'InOut'
+            type_obj['qualifier'] = 'ParamInOut'
             return type_obj
 
         basic_type_map = {
@@ -1456,8 +1461,8 @@
         return 'false'
     else:
         for param in get_parameters(function_props):
-            if 'qualifier' in param.data and (param.data['qualifier'] == 'Out' or
-                                              param.data['qualifier'] == 'InOut'):
+            if 'qualifier' in param.data and (param.data['qualifier'] == 'ParamOut' or
+                                              param.data['qualifier'] == 'ParamInOut'):
                 return 'false'
         return 'true'
 
@@ -1492,9 +1497,9 @@
 def get_variable_name_to_store_parameter(param):
     unique_name = 'pt'
     if 'qualifier' in param.data:
-        if param.data['qualifier'] == 'Out':
+        if param.data['qualifier'] == 'ParamOut':
             unique_name += '_o_'
-        if param.data['qualifier'] == 'InOut':
+        if param.data['qualifier'] == 'ParamInOut':
             unique_name += '_io_'
     unique_name += param.get_mangled_name()
     return unique_name
@@ -1506,9 +1511,9 @@
     unique_name = 'p'
     for param in parameters:
         if 'qualifier' in param.data:
-            if param.data['qualifier'] == 'Out':
+            if param.data['qualifier'] == 'ParamOut':
                 unique_name += '_o_'
-            if param.data['qualifier'] == 'InOut':
+            if param.data['qualifier'] == 'ParamInOut':
                 unique_name += '_io_'
         unique_name += param.get_mangled_name()
     return unique_name
@@ -1834,7 +1839,7 @@
     for param_variable_name, param_declaration in sorted(
             parameter_declarations.items(), key=lambda item: -len(item[0])):
         replaced = False
-        for used in used_param_variable_names:
+        for used in sorted(used_param_variable_names):
             if used.startswith(param_variable_name):
                 parameter_variable_name_replacements[param_variable_name] = used
                 replaced = True
@@ -2116,7 +2121,7 @@
     for group_name, group in parsed_variables.items():
         process_variable_group('NONE', group_name, group, symbols, variables, mangled_builtins)
 
-    mangled_builtins.update_arrays()
+    mangled_builtins.update_arrays(essl_only)
 
     output_strings = {
         'script_name':
diff --git a/src/compiler/translator/glslang.y b/src/compiler/translator/glslang.y
index 983fe47..972ef94 100644
--- a/src/compiler/translator/glslang.y
+++ b/src/compiler/translator/glslang.y
@@ -700,7 +700,7 @@
     }
     | parameter_declarator {
         $$ = $1;
-        $$.type->setQualifier(EvqIn);
+        $$.type->setQualifier(EvqParamIn);
     }
     | type_qualifier parameter_type_specifier {
         $$ = $2;
@@ -708,7 +708,7 @@
     }
     | parameter_type_specifier {
         $$ = $1;
-        $$.type->setQualifier(EvqIn);
+        $$.type->setQualifier(EvqParamIn);
     }
     ;
 
@@ -811,7 +811,7 @@
 
 precise_qualifier
     : PRECISE {
-        // empty
+        context->markShaderHasPrecise();
     }
     ;
 
diff --git a/src/compiler/translator/glslang_tab_autogen.cpp b/src/compiler/translator/glslang_tab_autogen.cpp
index f6c2ef6..c4ff877 100644
--- a/src/compiler/translator/glslang_tab_autogen.cpp
+++ b/src/compiler/translator/glslang_tab_autogen.cpp
@@ -3327,7 +3327,7 @@
 
         {
             (yyval.interm.param) = (yyvsp[0].interm.param);
-            (yyval.interm.param).type->setQualifier(EvqIn);
+            (yyval.interm.param).type->setQualifier(EvqParamIn);
         }
 
         break;
@@ -3346,7 +3346,7 @@
 
         {
             (yyval.interm.param) = (yyvsp[0].interm.param);
-            (yyval.interm.param).type->setQualifier(EvqIn);
+            (yyval.interm.param).type->setQualifier(EvqParamIn);
         }
 
         break;
@@ -3547,7 +3547,7 @@
         case 128:
 
         {
-            // empty
+            context->markShaderHasPrecise();
         }
 
         break;
diff --git a/src/compiler/translator/glslang_wrapper.cpp b/src/compiler/translator/glslang_wrapper.cpp
index 3c75b7e..187f350 100644
--- a/src/compiler/translator/glslang_wrapper.cpp
+++ b/src/compiler/translator/glslang_wrapper.cpp
@@ -151,6 +151,10 @@
     shader.setStringsWithLengths(&shaderString, &shaderLength, 1);
     shader.setEntryPoint("main");
 
+#if ANGLE_DEBUG_SPIRV_GENERATION
+    fprintf(stderr, "%s\n", shaderString);
+#endif  // ANGLE_DEBUG_SPIRV_GENERATION
+
     bool result = shader.parse(&builtInResources, 450, ECoreProfile, false, false, messages);
     if (!result)
     {
@@ -175,7 +179,7 @@
     spvtools::SpirvTools spirvTools(SPV_ENV_VULKAN_1_1);
     std::string readableSpirv;
     spirvTools.Disassemble(*spirvBlobOut, &readableSpirv, 0);
-    fprintf(stderr, "%s\n%s\n", shaderString, readableSpirv.c_str());
+    fprintf(stderr, "%s\n", readableSpirv.c_str());
 #endif  // ANGLE_DEBUG_SPIRV_GENERATION
 
     return true;
diff --git a/src/compiler/translator/tree_ops/ClampIndirectIndices.cpp b/src/compiler/translator/tree_ops/ClampIndirectIndices.cpp
index 21b11a5..90935d7 100644
--- a/src/compiler/translator/tree_ops/ClampIndirectIndices.cpp
+++ b/src/compiler/translator/tree_ops/ClampIndirectIndices.cpp
@@ -67,8 +67,8 @@
             if (useFloatClamp)
             {
                 TIntermSequence constructorArgs = {max};
-                max = TIntermAggregate::CreateConstructor(*StaticType::GetBasic<EbtFloat>(),
-                                                          &constructorArgs);
+                max                             = TIntermAggregate::CreateConstructor(
+                    *StaticType::GetBasic<EbtFloat, EbpHigh>(), &constructorArgs);
             }
         }
         else if (leftType.isArray())
@@ -88,8 +88,8 @@
         const TBasicType requiredBasicType = useFloatClamp ? EbtFloat : EbtInt;
         if (rightType.getBasicType() != requiredBasicType)
         {
-            const TType *clampType =
-                useFloatClamp ? StaticType::GetBasic<EbtFloat>() : StaticType::GetBasic<EbtInt>();
+            const TType *clampType = useFloatClamp ? StaticType::GetBasic<EbtFloat, EbpHigh>()
+                                                   : StaticType::GetBasic<EbtInt, EbpHigh>();
             TIntermSequence constructorArgs = {index};
             index = TIntermAggregate::CreateConstructor(*clampType, &constructorArgs);
         }
@@ -106,7 +106,7 @@
         if (useFloatClamp)
         {
             TIntermSequence constructorArgs = {clamped};
-            clamped = TIntermAggregate::CreateConstructor(*StaticType::GetBasic<EbtInt>(),
+            clamped = TIntermAggregate::CreateConstructor(*StaticType::GetBasic<EbtInt, EbpHigh>(),
                                                           &constructorArgs);
         }
 
@@ -122,7 +122,7 @@
     {
         if (useFloat)
         {
-            return CreateFloatNode(static_cast<float>(value));
+            return CreateFloatNode(static_cast<float>(value), EbpHigh);
         }
         return CreateIndexNode(value);
     }
diff --git a/src/compiler/translator/tree_ops/ClampPointSize.cpp b/src/compiler/translator/tree_ops/ClampPointSize.cpp
index 36e5de8..db00698 100644
--- a/src/compiler/translator/tree_ops/ClampPointSize.cpp
+++ b/src/compiler/translator/tree_ops/ClampPointSize.cpp
@@ -23,12 +23,13 @@
                     TSymbolTable *symbolTable)
 {
     // Only clamp gl_PointSize if it's used in the shader.
-    if (!FindSymbolNode(root, ImmutableString("gl_PointSize")))
+    const TIntermSymbol *glPointSize = FindSymbolNode(root, ImmutableString("gl_PointSize"));
+    if (glPointSize == nullptr)
     {
         return true;
     }
 
-    TIntermSymbol *pointSizeNode = new TIntermSymbol(BuiltInVariable::gl_PointSize());
+    TIntermTyped *pointSizeNode = glPointSize->deepCopy();
 
     TConstantUnion *maxPointSizeConstant = new TConstantUnion();
     maxPointSizeConstant->setFConst(maxPointSize);
diff --git a/src/compiler/translator/tree_ops/ConvertUnsupportedConstructorsToFunctionCalls.cpp b/src/compiler/translator/tree_ops/ConvertUnsupportedConstructorsToFunctionCalls.cpp
new file mode 100644
index 0000000..6d3a1e4
--- /dev/null
+++ b/src/compiler/translator/tree_ops/ConvertUnsupportedConstructorsToFunctionCalls.cpp
@@ -0,0 +1,336 @@
+//
+// Copyright 2020 The ANGLE Project Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+//
+
+#include "compiler/translator/tree_ops/ConvertUnsupportedConstructorsToFunctionCalls.h"
+#include "compiler/translator/ImmutableString.h"
+#include "compiler/translator/Symbol.h"
+#include "compiler/translator/tree_util/FindFunction.h"
+#include "compiler/translator/tree_util/IntermNode_util.h"
+#include "compiler/translator/tree_util/IntermRebuild.h"
+
+using namespace sh;
+
+namespace
+{
+
+void AppendMatrixElementArgument(TIntermSymbol *parameter,
+                                 int colIndex,
+                                 int rowIndex,
+                                 TIntermSequence *returnCtorArgs)
+{
+    TIntermBinary *matColN =
+        new TIntermBinary(EOpIndexDirect, parameter->deepCopy(), CreateIndexNode(colIndex));
+    TIntermSwizzle *matElem = new TIntermSwizzle(matColN, {rowIndex});
+    returnCtorArgs->push_back(matElem);
+}
+
+// Adds the argument to sequence for a scalar constructor.
+// Given scalar(scalarA) appends scalarA
+// Given scalar(vecA) appends vecA.x
+// Given scalar(matA) appends matA[0].x
+void AppendScalarFromNonScalarArguments(TFunction &function, TIntermSequence *returnCtorArgs)
+{
+    const TVariable *var = function.getParam(0);
+    TIntermSymbol *arg0  = new TIntermSymbol(var);
+
+    const TType &type = arg0->getType();
+
+    if (type.isScalar())
+    {
+        returnCtorArgs->push_back(arg0);
+    }
+    else if (type.isVector())
+    {
+        TIntermSwizzle *vecX = new TIntermSwizzle(arg0, {0});
+        returnCtorArgs->push_back(vecX);
+    }
+    else if (type.isMatrix())
+    {
+        AppendMatrixElementArgument(arg0, 0, 0, returnCtorArgs);
+    }
+}
+
+// Adds the arguments to sequence for a vector constructor from a scalar.
+// Given vecN(scalarA) appends scalarA, scalarA, ... n times
+void AppendVectorFromScalarArgument(const TType &type,
+                                    TFunction &function,
+                                    TIntermSequence *returnCtorArgs)
+{
+    const int vectorSize = type.getNominalSize();
+    const TVariable *var = function.getParam(0);
+    TIntermSymbol *v     = new TIntermSymbol(var);
+    for (int i = 0; i < vectorSize; ++i)
+    {
+        returnCtorArgs->push_back(v->deepCopy());
+    }
+}
+
+// Adds the arguments to sequence for a vector or matrix constructor from the available arguments
+// applying arguments in order until the requested number of values have been extracted from the
+// given arguments or until there are no more arguments.
+void AppendValuesFromMultipleArguments(int numValuesNeeded,
+                                       TFunction &function,
+                                       TIntermSequence *returnCtorArgs)
+{
+    size_t numParameters = function.getParamCount();
+    size_t paramIndex    = 0;
+    int colIndex         = 0;
+    int rowIndex         = 0;
+
+    for (int i = 0; i < numValuesNeeded && paramIndex < numParameters; ++i)
+    {
+        const TVariable *p       = function.getParam(paramIndex);
+        TIntermSymbol *parameter = new TIntermSymbol(p);
+        if (parameter->isScalar())
+        {
+            returnCtorArgs->push_back(parameter);
+            ++paramIndex;
+        }
+        else if (parameter->isVector())
+        {
+            TIntermSwizzle *vecS = new TIntermSwizzle(parameter->deepCopy(), {rowIndex++});
+            returnCtorArgs->push_back(vecS);
+            if (rowIndex == parameter->getNominalSize())
+            {
+                ++paramIndex;
+                rowIndex = 0;
+            }
+        }
+        else if (parameter->isMatrix())
+        {
+            AppendMatrixElementArgument(parameter, colIndex, rowIndex++, returnCtorArgs);
+            if (rowIndex == parameter->getSecondarySize())
+            {
+                rowIndex = 0;
+                ++colIndex;
+                if (colIndex == parameter->getNominalSize())
+                {
+                    colIndex = 0;
+                    ++paramIndex;
+                }
+            }
+        }
+    }
+}
+
+// Adds the arguments for a matrix constructor from a scalar
+// putting the scalar along the diagonal and 0 everywhere else.
+void AppendMatrixFromScalarArgument(const TType &type,
+                                    TFunction &function,
+                                    TIntermSequence *returnCtorArgs)
+{
+    const TVariable *var = function.getParam(0);
+    TIntermSymbol *v     = new TIntermSymbol(var);
+    const int numCols    = type.getNominalSize();
+    const int numRows    = type.getSecondarySize();
+    for (int col = 0; col < numCols; ++col)
+    {
+        for (int row = 0; row < numRows; ++row)
+        {
+            if (col == row)
+            {
+                returnCtorArgs->push_back(v->deepCopy());
+            }
+            else
+            {
+                returnCtorArgs->push_back(CreateFloatNode(0.0f, sh::EbpUndefined));
+            }
+        }
+    }
+}
+
+// Add the argument for a matrix constructor from a matrix
+// copying elements from the same column/row and otherwise
+// initialize to the identity matrix.
+void AppendMatrixFromMatrixArgument(const TType &type,
+                                    TFunction &function,
+                                    TIntermSequence *returnCtorArgs)
+{
+    const TVariable *var = function.getParam(0);
+    TIntermSymbol *v     = new TIntermSymbol(var);
+    const int dstCols    = type.getNominalSize();
+    const int dstRows    = type.getSecondarySize();
+    const int srcCols    = v->getNominalSize();
+    const int srcRows    = v->getSecondarySize();
+    for (int dstCol = 0; dstCol < dstCols; ++dstCol)
+    {
+        for (int dstRow = 0; dstRow < dstRows; ++dstRow)
+        {
+            if (dstRow < srcRows && dstCol < srcCols)
+            {
+                AppendMatrixElementArgument(v, dstCol, dstRow, returnCtorArgs);
+            }
+            else
+            {
+                returnCtorArgs->push_back(
+                    CreateFloatNode(dstRow == dstCol ? 1.0f : 0.0f, sh::EbpUndefined));
+            }
+        }
+    }
+}
+
+class Rebuild : public TIntermRebuild
+{
+  public:
+    explicit Rebuild(TCompiler &compiler) : TIntermRebuild(compiler, false, true) {}
+    PostResult visitAggregatePost(TIntermAggregate &node) override
+    {
+        if (!node.isConstructor())
+        {
+            return node;
+        }
+
+        TIntermSequence &arguments = *node.getSequence();
+        if (arguments.empty())
+        {
+            return node;
+        }
+
+        const TType &type     = node.getType();
+        const TType &arg0Type = arguments[0]->getAsTyped()->getType();
+
+        if (!type.isScalar() && !type.isVector() && !type.isMatrix())
+        {
+            return node;
+        }
+
+        if (type.isArray())
+        {
+            return node;
+        }
+
+        // check for type_ctor(sameType)
+        // scalar(scalar) -> passthrough
+        // vecN(vecN) -> passthrough
+        // matN(matN) -> passthrough
+        if (arguments.size() == 1 && arg0Type == type)
+        {
+            return node;
+        }
+
+        // The following are simple casts:
+        //
+        // - basic(s) (where basic is int, uint, float or bool, and s is scalar).
+        // - gvecN(vN) (where the argument is a single vector with the same number of components).
+        // - matNxM(mNxM) (where the argument is a single matrix with the same dimensions).  Note
+        // that
+        //   matrices are always float, so there's no actual cast and this would be a no-op.
+        //
+        const bool isSingleScalarCast =
+            arguments.size() == 1 && type.isScalar() && arg0Type.isScalar();
+        const bool isSingleVectorCast = arguments.size() == 1 && type.isVector() &&
+                                        arg0Type.isVector() &&
+                                        type.getNominalSize() == arg0Type.getNominalSize();
+        const bool isSingleMatrixCast =
+            arguments.size() == 1 && type.isMatrix() && arg0Type.isMatrix() &&
+            type.getCols() == arg0Type.getCols() && type.getRows() == arg0Type.getRows();
+        if (isSingleScalarCast || isSingleVectorCast || isSingleMatrixCast)
+        {
+            return node;
+        }
+
+        // Cases we need to handle:
+        // scalar(vec)
+        // scalar(mat)
+        // vecN(scalar)
+        // vecN(vecM)
+        // vecN(a,...)
+        // matN(scalar) -> diag
+        // matN(vec) -> fail!
+        // manN(matM) -> corner + ident
+        // matN(a, ...)
+
+        // Build a function and pass all the constructor's arguments to it.
+        TIntermBlock *body  = new TIntermBlock;
+        TFunction *function = new TFunction(&mSymbolTable, ImmutableString(""),
+                                            SymbolType::AngleInternal, &type, true);
+
+        for (size_t i = 0; i < arguments.size(); ++i)
+        {
+            TIntermTyped &arg = *arguments[i]->getAsTyped();
+            TType *argType    = new TType(arg.getBasicType(), arg.getPrecision(), EvqParamIn,
+                                       static_cast<unsigned char>(arg.getNominalSize()),
+                                       static_cast<unsigned char>(arg.getSecondarySize()));
+            TVariable *var    = CreateTempVariable(&mSymbolTable, argType);
+            function->addParameter(var);
+        }
+
+        // Build a return statement for the function that
+        // converts the arguments into the required type.
+        TIntermSequence *returnCtorArgs = new TIntermSequence();
+
+        if (type.isScalar())
+        {
+            AppendScalarFromNonScalarArguments(*function, returnCtorArgs);
+        }
+        else if (type.isVector())
+        {
+            if (arguments.size() == 1 && arg0Type.isScalar())
+            {
+                AppendVectorFromScalarArgument(type, *function, returnCtorArgs);
+            }
+            else
+            {
+                AppendValuesFromMultipleArguments(type.getNominalSize(), *function, returnCtorArgs);
+            }
+        }
+        else if (type.isMatrix())
+        {
+            if (arguments.size() == 1 && arg0Type.isScalar())
+            {
+                // MSL already handles this case
+                AppendMatrixFromScalarArgument(type, *function, returnCtorArgs);
+            }
+            else if (arg0Type.isMatrix())
+            {
+                AppendMatrixFromMatrixArgument(type, *function, returnCtorArgs);
+            }
+            else
+            {
+                AppendValuesFromMultipleArguments(type.getNominalSize() * type.getSecondarySize(),
+                                                  *function, returnCtorArgs);
+            }
+        }
+
+        TIntermBranch *returnStatement =
+            new TIntermBranch(EOpReturn, TIntermAggregate::CreateConstructor(type, returnCtorArgs));
+        body->appendStatement(returnStatement);
+
+        TIntermFunctionDefinition *functionDefinition =
+            CreateInternalFunctionDefinitionNode(*function, body);
+        mFunctionDefs.push_back(functionDefinition);
+
+        TIntermTyped *functionCall = TIntermAggregate::CreateFunctionCall(*function, &arguments);
+
+        return *functionCall;
+    }
+
+    bool rewrite(TIntermBlock &root)
+    {
+        if (!rebuildInPlace(root))
+        {
+            return true;
+        }
+
+        size_t firstFunctionIndex = FindFirstFunctionDefinitionIndex(&root);
+        for (TIntermFunctionDefinition *functionDefinition : mFunctionDefs)
+        {
+            root.insertChildNodes(firstFunctionIndex, TIntermSequence({functionDefinition}));
+        }
+
+        return mCompiler.validateAST(&root);
+    }
+
+  private:
+    TVector<TIntermFunctionDefinition *> mFunctionDefs;
+};
+
+}  // anonymous namespace
+
+bool sh::ConvertUnsupportedConstructorsToFunctionCalls(TCompiler &compiler, TIntermBlock &root)
+{
+    return Rebuild(compiler).rewrite(root);
+}
diff --git a/src/compiler/translator/tree_ops/ConvertUnsupportedConstructorsToFunctionCalls.h b/src/compiler/translator/tree_ops/ConvertUnsupportedConstructorsToFunctionCalls.h
new file mode 100644
index 0000000..8e59214
--- /dev/null
+++ b/src/compiler/translator/tree_ops/ConvertUnsupportedConstructorsToFunctionCalls.h
@@ -0,0 +1,25 @@
+//
+// Copyright 2020 The ANGLE Project Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+//
+
+#ifndef COMPILER_TRANSLATOR_TREE_OPS_CONVERTUNSUPPORTEDCONSTRUCTORSTOFUNCTIONCALLS_H_
+#define COMPILER_TRANSLATOR_TREE_OPS_CONVERTUNSUPPORTEDCONSTRUCTORSTOFUNCTIONCALLS_H_
+
+#include "compiler/translator/Compiler.h"
+
+namespace sh
+{
+
+class TCompiler;
+class TInterBlock;
+class SymbolEnv;
+
+// Adds explicit type casts into the AST where casting is done implicitly.
+ANGLE_NO_DISCARD bool ConvertUnsupportedConstructorsToFunctionCalls(TCompiler &compiler,
+                                                                    TIntermBlock &root);
+
+}  // namespace sh
+
+#endif  // COMPILER_TRANSLATOR_TREE_OPS_CONVERTUNSUPPORTEDCONSTRUCTORSTOFUNCTIONCALLS_H_
diff --git a/src/compiler/translator/tree_ops/DeclareAndInitBuiltinsForInstancedMultiview.cpp b/src/compiler/translator/tree_ops/DeclareAndInitBuiltinsForInstancedMultiview.cpp
index 1a141b9..efa22d2 100644
--- a/src/compiler/translator/tree_ops/DeclareAndInitBuiltinsForInstancedMultiview.cpp
+++ b/src/compiler/translator/tree_ops/DeclareAndInitBuiltinsForInstancedMultiview.cpp
@@ -42,7 +42,7 @@
     TConstantUnion *numberOfViewsUnsignedConstant = new TConstantUnion();
     numberOfViewsUnsignedConstant->setUConst(numberOfViews);
     TIntermConstantUnion *numberOfViewsUint =
-        new TIntermConstantUnion(numberOfViewsUnsignedConstant, TType(EbtUInt, EbpHigh, EvqConst));
+        new TIntermConstantUnion(numberOfViewsUnsignedConstant, TType(EbtUInt, EbpLow, EvqConst));
 
     // Create a uint(gl_InstanceID) node.
     TIntermSequence glInstanceIDSymbolCastArguments;
diff --git a/src/compiler/translator/tree_ops/DeferGlobalInitializers.cpp b/src/compiler/translator/tree_ops/DeferGlobalInitializers.cpp
index 0a34bf8..035de73 100644
--- a/src/compiler/translator/tree_ops/DeferGlobalInitializers.cpp
+++ b/src/compiler/translator/tree_ops/DeferGlobalInitializers.cpp
@@ -38,6 +38,7 @@
                              bool initializeUninitializedGlobals,
                              bool canUseLoopsToInitialize,
                              bool highPrecisionSupported,
+                             bool forceDeferGlobalInitializers,
                              TIntermSequence *deferredInitializersOut,
                              std::vector<const TVariable *> *variablesToReplaceOut,
                              TSymbolTable *symbolTable)
@@ -53,7 +54,8 @@
         ASSERT(symbolNode);
         TIntermTyped *expression = init->getRight();
 
-        if (expression->getQualifier() != EvqConst || !expression->hasConstantValue())
+        if (expression->getQualifier() != EvqConst || !expression->hasConstantValue() ||
+            forceDeferGlobalInitializers)
         {
             // For variables which are not constant, defer their real initialization until
             // after we initialize uniforms.
@@ -109,7 +111,7 @@
 
     TFunction *initGlobalsFunction =
         new TFunction(symbolTable, kInitGlobalsString, SymbolType::AngleInternal,
-                      StaticType::GetBasic<EbtVoid>(), false);
+                      StaticType::GetBasic<EbtVoid, EbpUndefined>(), false);
 
     TIntermFunctionPrototype *initGlobalsFunctionPrototype =
         CreateInternalFunctionPrototypeNode(*initGlobalsFunction);
@@ -133,6 +135,7 @@
                              bool initializeUninitializedGlobals,
                              bool canUseLoopsToInitialize,
                              bool highPrecisionSupported,
+                             bool forceDeferGlobalInitializers,
                              TSymbolTable *symbolTable)
 {
     TIntermSequence deferredInitializers;
@@ -147,7 +150,8 @@
         {
             GetDeferredInitializers(declaration, initializeUninitializedGlobals,
                                     canUseLoopsToInitialize, highPrecisionSupported,
-                                    &deferredInitializers, &variablesToReplace, symbolTable);
+                                    forceDeferGlobalInitializers, &deferredInitializers,
+                                    &variablesToReplace, symbolTable);
         }
     }
 
diff --git a/src/compiler/translator/tree_ops/DeferGlobalInitializers.h b/src/compiler/translator/tree_ops/DeferGlobalInitializers.h
index a89a2e5..09136ca 100644
--- a/src/compiler/translator/tree_ops/DeferGlobalInitializers.h
+++ b/src/compiler/translator/tree_ops/DeferGlobalInitializers.h
@@ -30,6 +30,7 @@
                                               bool initializeUninitializedGlobals,
                                               bool canUseLoopsToInitialize,
                                               bool highPrecisionSupported,
+                                              bool forceDeferGlobalInitializers,
                                               TSymbolTable *symbolTable);
 
 }  // namespace sh
diff --git a/src/compiler/translator/tree_ops/EmulatePrecision.cpp b/src/compiler/translator/tree_ops/EmulatePrecision.cpp
deleted file mode 100644
index ea96eb2..0000000
--- a/src/compiler/translator/tree_ops/EmulatePrecision.cpp
+++ /dev/null
@@ -1,777 +0,0 @@
-//
-// Copyright 2002 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.
-//
-
-#include "compiler/translator/tree_ops/EmulatePrecision.h"
-
-#include "compiler/translator/FunctionLookup.h"
-
-#include <memory>
-
-namespace sh
-{
-
-namespace
-{
-
-constexpr const ImmutableString kParamXName("x");
-constexpr const ImmutableString kParamYName("y");
-constexpr const ImmutableString kAngleFrmString("angle_frm");
-constexpr const ImmutableString kAngleFrlString("angle_frl");
-
-class RoundingHelperWriter : angle::NonCopyable
-{
-  public:
-    static RoundingHelperWriter *createHelperWriter(const ShShaderOutput outputLanguage);
-
-    void writeCommonRoundingHelpers(TInfoSinkBase &sink, const int shaderVersion);
-    void writeCompoundAssignmentHelper(TInfoSinkBase &sink,
-                                       const char *lType,
-                                       const char *rType,
-                                       const char *opStr,
-                                       const char *opNameStr);
-
-    virtual ~RoundingHelperWriter() {}
-
-  protected:
-    RoundingHelperWriter(const ShShaderOutput outputLanguage) : mOutputLanguage(outputLanguage) {}
-    RoundingHelperWriter() = delete;
-
-    const ShShaderOutput mOutputLanguage;
-
-  private:
-    virtual std::string getTypeString(const char *glslType)                               = 0;
-    virtual void writeFloatRoundingHelpers(TInfoSinkBase &sink)                           = 0;
-    virtual void writeVectorRoundingHelpers(TInfoSinkBase &sink, const unsigned int size) = 0;
-    virtual void writeMatrixRoundingHelper(TInfoSinkBase &sink,
-                                           const unsigned int columns,
-                                           const unsigned int rows,
-                                           const char *functionName)                      = 0;
-};
-
-class RoundingHelperWriterGLSL : public RoundingHelperWriter
-{
-  public:
-    RoundingHelperWriterGLSL(const ShShaderOutput outputLanguage)
-        : RoundingHelperWriter(outputLanguage)
-    {}
-
-  private:
-    std::string getTypeString(const char *glslType) override;
-    void writeFloatRoundingHelpers(TInfoSinkBase &sink) override;
-    void writeVectorRoundingHelpers(TInfoSinkBase &sink, const unsigned int size) override;
-    void writeMatrixRoundingHelper(TInfoSinkBase &sink,
-                                   const unsigned int columns,
-                                   const unsigned int rows,
-                                   const char *functionName) override;
-};
-
-class RoundingHelperWriterESSL : public RoundingHelperWriterGLSL
-{
-  public:
-    RoundingHelperWriterESSL(const ShShaderOutput outputLanguage)
-        : RoundingHelperWriterGLSL(outputLanguage)
-    {}
-
-  private:
-    std::string getTypeString(const char *glslType) override;
-};
-
-class RoundingHelperWriterHLSL : public RoundingHelperWriter
-{
-  public:
-    RoundingHelperWriterHLSL(const ShShaderOutput outputLanguage)
-        : RoundingHelperWriter(outputLanguage)
-    {}
-
-  private:
-    std::string getTypeString(const char *glslType) override;
-    void writeFloatRoundingHelpers(TInfoSinkBase &sink) override;
-    void writeVectorRoundingHelpers(TInfoSinkBase &sink, const unsigned int size) override;
-    void writeMatrixRoundingHelper(TInfoSinkBase &sink,
-                                   const unsigned int columns,
-                                   const unsigned int rows,
-                                   const char *functionName) override;
-};
-
-RoundingHelperWriter *RoundingHelperWriter::createHelperWriter(const ShShaderOutput outputLanguage)
-{
-    ASSERT(EmulatePrecision::SupportedInLanguage(outputLanguage));
-    switch (outputLanguage)
-    {
-        case SH_HLSL_4_1_OUTPUT:
-            return new RoundingHelperWriterHLSL(outputLanguage);
-        case SH_ESSL_OUTPUT:
-            return new RoundingHelperWriterESSL(outputLanguage);
-        default:
-            return new RoundingHelperWriterGLSL(outputLanguage);
-    }
-}
-
-void RoundingHelperWriter::writeCommonRoundingHelpers(TInfoSinkBase &sink, const int shaderVersion)
-{
-    // Write the angle_frm functions that round floating point numbers to
-    // half precision, and angle_frl functions that round them to minimum lowp
-    // precision.
-
-    writeFloatRoundingHelpers(sink);
-    writeVectorRoundingHelpers(sink, 2);
-    writeVectorRoundingHelpers(sink, 3);
-    writeVectorRoundingHelpers(sink, 4);
-    if (shaderVersion > 100)
-    {
-        for (unsigned int columns = 2; columns <= 4; ++columns)
-        {
-            for (unsigned int rows = 2; rows <= 4; ++rows)
-            {
-                writeMatrixRoundingHelper(sink, columns, rows, "angle_frm");
-                writeMatrixRoundingHelper(sink, columns, rows, "angle_frl");
-            }
-        }
-    }
-    else
-    {
-        for (unsigned int size = 2; size <= 4; ++size)
-        {
-            writeMatrixRoundingHelper(sink, size, size, "angle_frm");
-            writeMatrixRoundingHelper(sink, size, size, "angle_frl");
-        }
-    }
-}
-
-void RoundingHelperWriter::writeCompoundAssignmentHelper(TInfoSinkBase &sink,
-                                                         const char *lType,
-                                                         const char *rType,
-                                                         const char *opStr,
-                                                         const char *opNameStr)
-{
-    std::string lTypeStr = getTypeString(lType);
-    std::string rTypeStr = getTypeString(rType);
-
-    // Note that y should be passed through angle_frm at the function call site,
-    // but x can't be passed through angle_frm there since it is an inout parameter.
-    // So only pass x and the result through angle_frm here.
-    // clang-format off
-    sink <<
-        lTypeStr << " angle_compound_" << opNameStr << "_frm(inout " << lTypeStr << " x, in " << rTypeStr << " y) {\n"
-        "    x = angle_frm(angle_frm(x) " << opStr << " y);\n"
-        "    return x;\n"
-        "}\n";
-    sink <<
-        lTypeStr << " angle_compound_" << opNameStr << "_frl(inout " << lTypeStr << " x, in " << rTypeStr << " y) {\n"
-        "    x = angle_frl(angle_frl(x) " << opStr << " y);\n"
-        "    return x;\n"
-        "}\n";
-    // clang-format on
-}
-
-std::string RoundingHelperWriterGLSL::getTypeString(const char *glslType)
-{
-    return glslType;
-}
-
-std::string RoundingHelperWriterESSL::getTypeString(const char *glslType)
-{
-    std::stringstream typeStrStr = sh::InitializeStream<std::stringstream>();
-    typeStrStr << "highp " << glslType;
-    return typeStrStr.str();
-}
-
-void RoundingHelperWriterGLSL::writeFloatRoundingHelpers(TInfoSinkBase &sink)
-{
-    // Unoptimized version of angle_frm for single floats:
-    //
-    // int webgl_maxNormalExponent(in int exponentBits)
-    // {
-    //     int possibleExponents = int(exp2(float(exponentBits)));
-    //     int exponentBias = possibleExponents / 2 - 1;
-    //     int allExponentBitsOne = possibleExponents - 1;
-    //     return (allExponentBitsOne - 1) - exponentBias;
-    // }
-    //
-    // float angle_frm(in float x)
-    // {
-    //     int mantissaBits = 10;
-    //     int exponentBits = 5;
-    //     float possibleMantissas = exp2(float(mantissaBits));
-    //     float mantissaMax = 2.0 - 1.0 / possibleMantissas;
-    //     int maxNE = webgl_maxNormalExponent(exponentBits);
-    //     float max = exp2(float(maxNE)) * mantissaMax;
-    //     if (x > max)
-    //     {
-    //         return max;
-    //     }
-    //     if (x < -max)
-    //     {
-    //         return -max;
-    //     }
-    //     float exponent = floor(log2(abs(x)));
-    //     if (abs(x) == 0.0 || exponent < -float(maxNE))
-    //     {
-    //         return 0.0 * sign(x)
-    //     }
-    //     x = x * exp2(-(exponent - float(mantissaBits)));
-    //     x = sign(x) * floor(abs(x));
-    //     return x * exp2(exponent - float(mantissaBits));
-    // }
-
-    // All numbers with a magnitude less than 2^-15 are subnormal, and are
-    // flushed to zero.
-
-    // Note the constant numbers below:
-    // a) 65504 is the maximum possible mantissa (1.1111111111 in binary) times
-    //    2^15, the maximum normal exponent.
-    // b) 10.0 is the number of mantissa bits.
-    // c) -25.0 is the minimum normal half-float exponent -15.0 minus the number
-    //    of mantissa bits.
-    // d) + 1e-30 is to make sure the argument of log2() won't be zero. It can
-    //    only affect the result of log2 on x where abs(x) < 1e-22. Since these
-    //    numbers will be flushed to zero either way (2^-15 is the smallest
-    //    normal positive number), this does not introduce any error.
-
-    std::string floatType = getTypeString("float");
-
-    // clang-format off
-    sink <<
-        floatType << " angle_frm(in " << floatType << " x) {\n"
-        "    x = clamp(x, -65504.0, 65504.0);\n"
-        "    " << floatType << " exponent = floor(log2(abs(x) + 1e-30)) - 10.0;\n"
-        "    bool isNonZero = (exponent >= -25.0);\n"
-        "    x = x * exp2(-exponent);\n"
-        "    x = sign(x) * floor(abs(x));\n"
-        "    return x * exp2(exponent) * float(isNonZero);\n"
-        "}\n";
-
-    sink <<
-        floatType << " angle_frl(in " << floatType << " x) {\n"
-        "    x = clamp(x, -2.0, 2.0);\n"
-        "    x = x * 256.0;\n"
-        "    x = sign(x) * floor(abs(x));\n"
-        "    return x * 0.00390625;\n"
-        "}\n";
-    // clang-format on
-}
-
-void RoundingHelperWriterGLSL::writeVectorRoundingHelpers(TInfoSinkBase &sink,
-                                                          const unsigned int size)
-{
-    std::stringstream vecTypeStrStr = sh::InitializeStream<std::stringstream>();
-    vecTypeStrStr << "vec" << size;
-    std::string vecType = getTypeString(vecTypeStrStr.str().c_str());
-
-    // clang-format off
-    sink <<
-        vecType << " angle_frm(in " << vecType << " v) {\n"
-        "    v = clamp(v, -65504.0, 65504.0);\n"
-        "    " << vecType << " exponent = floor(log2(abs(v) + 1e-30)) - 10.0;\n"
-        "    bvec" << size << " isNonZero = greaterThanEqual(exponent, vec" << size << "(-25.0));\n"
-        "    v = v * exp2(-exponent);\n"
-        "    v = sign(v) * floor(abs(v));\n"
-        "    return v * exp2(exponent) * vec" << size << "(isNonZero);\n"
-        "}\n";
-
-    sink <<
-        vecType << " angle_frl(in " << vecType << " v) {\n"
-        "    v = clamp(v, -2.0, 2.0);\n"
-        "    v = v * 256.0;\n"
-        "    v = sign(v) * floor(abs(v));\n"
-        "    return v * 0.00390625;\n"
-        "}\n";
-    // clang-format on
-}
-
-void RoundingHelperWriterGLSL::writeMatrixRoundingHelper(TInfoSinkBase &sink,
-                                                         const unsigned int columns,
-                                                         const unsigned int rows,
-                                                         const char *functionName)
-{
-    std::stringstream matTypeStrStr = sh::InitializeStream<std::stringstream>();
-    matTypeStrStr << "mat" << columns;
-    if (rows != columns)
-    {
-        matTypeStrStr << "x" << rows;
-    }
-    std::string matType = getTypeString(matTypeStrStr.str().c_str());
-
-    sink << matType << " " << functionName << "(in " << matType << " m) {\n"
-         << "    " << matType << " rounded;\n";
-
-    for (unsigned int i = 0; i < columns; ++i)
-    {
-        sink << "    rounded[" << i << "] = " << functionName << "(m[" << i << "]);\n";
-    }
-
-    sink << "    return rounded;\n"
-            "}\n";
-}
-
-static const char *GetHLSLTypeStr(const char *floatTypeStr)
-{
-    if (strcmp(floatTypeStr, "float") == 0)
-    {
-        return "float";
-    }
-    if (strcmp(floatTypeStr, "vec2") == 0)
-    {
-        return "float2";
-    }
-    if (strcmp(floatTypeStr, "vec3") == 0)
-    {
-        return "float3";
-    }
-    if (strcmp(floatTypeStr, "vec4") == 0)
-    {
-        return "float4";
-    }
-    if (strcmp(floatTypeStr, "mat2") == 0)
-    {
-        return "float2x2";
-    }
-    if (strcmp(floatTypeStr, "mat3") == 0)
-    {
-        return "float3x3";
-    }
-    if (strcmp(floatTypeStr, "mat4") == 0)
-    {
-        return "float4x4";
-    }
-    if (strcmp(floatTypeStr, "mat2x3") == 0)
-    {
-        return "float2x3";
-    }
-    if (strcmp(floatTypeStr, "mat2x4") == 0)
-    {
-        return "float2x4";
-    }
-    if (strcmp(floatTypeStr, "mat3x2") == 0)
-    {
-        return "float3x2";
-    }
-    if (strcmp(floatTypeStr, "mat3x4") == 0)
-    {
-        return "float3x4";
-    }
-    if (strcmp(floatTypeStr, "mat4x2") == 0)
-    {
-        return "float4x2";
-    }
-    if (strcmp(floatTypeStr, "mat4x3") == 0)
-    {
-        return "float4x3";
-    }
-    UNREACHABLE();
-    return nullptr;
-}
-
-std::string RoundingHelperWriterHLSL::getTypeString(const char *glslType)
-{
-    return GetHLSLTypeStr(glslType);
-}
-
-void RoundingHelperWriterHLSL::writeFloatRoundingHelpers(TInfoSinkBase &sink)
-{
-    // In HLSL scalars are the same as 1-vectors.
-    writeVectorRoundingHelpers(sink, 1);
-}
-
-void RoundingHelperWriterHLSL::writeVectorRoundingHelpers(TInfoSinkBase &sink,
-                                                          const unsigned int size)
-{
-    std::stringstream vecTypeStrStr = sh::InitializeStream<std::stringstream>();
-    vecTypeStrStr << "float" << size;
-    std::string vecType = vecTypeStrStr.str();
-
-    // clang-format off
-    sink <<
-        vecType << " angle_frm(" << vecType << " v) {\n"
-        "    v = clamp(v, -65504.0, 65504.0);\n"
-        "    " << vecType << " exponent = floor(log2(abs(v) + 1e-30)) - 10.0;\n"
-        "    bool" << size << " isNonZero = exponent < -25.0;\n"
-        "    v = v * exp2(-exponent);\n"
-        "    v = sign(v) * floor(abs(v));\n"
-        "    return v * exp2(exponent) * (float" << size << ")(isNonZero);\n"
-        "}\n";
-
-    sink <<
-        vecType << " angle_frl(" << vecType << " v) {\n"
-        "    v = clamp(v, -2.0, 2.0);\n"
-        "    v = v * 256.0;\n"
-        "    v = sign(v) * floor(abs(v));\n"
-        "    return v * 0.00390625;\n"
-        "}\n";
-    // clang-format on
-}
-
-void RoundingHelperWriterHLSL::writeMatrixRoundingHelper(TInfoSinkBase &sink,
-                                                         const unsigned int columns,
-                                                         const unsigned int rows,
-                                                         const char *functionName)
-{
-    std::stringstream matTypeStrStr = sh::InitializeStream<std::stringstream>();
-    matTypeStrStr << "float" << columns << "x" << rows;
-    std::string matType = matTypeStrStr.str();
-
-    sink << matType << " " << functionName << "(" << matType << " m) {\n"
-         << "    " << matType << " rounded;\n";
-
-    for (unsigned int i = 0; i < columns; ++i)
-    {
-        sink << "    rounded[" << i << "] = " << functionName << "(m[" << i << "]);\n";
-    }
-
-    sink << "    return rounded;\n"
-            "}\n";
-}
-
-bool canRoundFloat(const TType &type)
-{
-    return type.getBasicType() == EbtFloat && !type.isArray() &&
-           (type.getPrecision() == EbpLow || type.getPrecision() == EbpMedium);
-}
-
-bool ParentUsesResult(TIntermNode *parent, TIntermTyped *node)
-{
-    if (!parent)
-    {
-        return false;
-    }
-
-    TIntermBlock *blockParent = parent->getAsBlock();
-    // If the parent is a block, the result is not assigned anywhere,
-    // so rounding it is not needed. In particular, this can avoid a lot of
-    // unnecessary rounding of unused return values of assignment.
-    if (blockParent)
-    {
-        return false;
-    }
-    TIntermBinary *binaryParent = parent->getAsBinaryNode();
-    if (binaryParent && binaryParent->getOp() == EOpComma && (binaryParent->getRight() != node))
-    {
-        return false;
-    }
-    return true;
-}
-
-bool ParentConstructorTakesCareOfRounding(TIntermNode *parent, TIntermTyped *node)
-{
-    if (!parent)
-    {
-        return false;
-    }
-    TIntermAggregate *parentConstructor = parent->getAsAggregate();
-    if (!parentConstructor || parentConstructor->getOp() != EOpConstruct)
-    {
-        return false;
-    }
-    if (parentConstructor->getPrecision() != node->getPrecision())
-    {
-        return false;
-    }
-    return canRoundFloat(parentConstructor->getType());
-}
-
-}  // namespace
-
-EmulatePrecision::EmulatePrecision(TSymbolTable *symbolTable)
-    : TLValueTrackingTraverser(true, true, true, symbolTable), mDeclaringVariables(false)
-{}
-
-void EmulatePrecision::visitSymbol(TIntermSymbol *node)
-{
-    TIntermNode *parent = getParentNode();
-    if (canRoundFloat(node->getType()) && ParentUsesResult(parent, node) &&
-        !ParentConstructorTakesCareOfRounding(parent, node) && !mDeclaringVariables &&
-        !isLValueRequiredHere())
-    {
-        TIntermNode *replacement = createRoundingFunctionCallNode(node);
-        queueReplacement(replacement, OriginalNode::BECOMES_CHILD);
-    }
-}
-
-bool EmulatePrecision::visitBinary(Visit visit, TIntermBinary *node)
-{
-    bool visitChildren = true;
-
-    TOperator op = node->getOp();
-
-    // RHS of initialize is not being declared.
-    if (op == EOpInitialize && visit == InVisit)
-        mDeclaringVariables = false;
-
-    if ((op == EOpIndexDirectStruct) && visit == InVisit)
-        visitChildren = false;
-
-    if (visit != PreVisit)
-        return visitChildren;
-
-    const TType &type = node->getType();
-    bool roundFloat   = canRoundFloat(type);
-
-    if (roundFloat)
-    {
-        switch (op)
-        {
-            // Math operators that can result in a float may need to apply rounding to the return
-            // value. Note that in the case of assignment, the rounding is applied to its return
-            // value here, not the value being assigned.
-            case EOpAssign:
-            case EOpAdd:
-            case EOpSub:
-            case EOpMul:
-            case EOpDiv:
-            case EOpVectorTimesScalar:
-            case EOpVectorTimesMatrix:
-            case EOpMatrixTimesVector:
-            case EOpMatrixTimesScalar:
-            case EOpMatrixTimesMatrix:
-            {
-                TIntermNode *parent = getParentNode();
-                if (!ParentUsesResult(parent, node) ||
-                    ParentConstructorTakesCareOfRounding(parent, node))
-                {
-                    break;
-                }
-                TIntermNode *replacement = createRoundingFunctionCallNode(node);
-                queueReplacement(replacement, OriginalNode::BECOMES_CHILD);
-                break;
-            }
-
-            // Compound assignment cases need to replace the operator with a function call.
-            case EOpAddAssign:
-            {
-                mEmulateCompoundAdd.insert(
-                    TypePair(type.getBuiltInTypeNameString(),
-                             node->getRight()->getType().getBuiltInTypeNameString()));
-                TIntermNode *replacement = createCompoundAssignmentFunctionCallNode(
-                    node->getLeft(), node->getRight(), "add");
-                queueReplacement(replacement, OriginalNode::IS_DROPPED);
-                break;
-            }
-            case EOpSubAssign:
-            {
-                mEmulateCompoundSub.insert(
-                    TypePair(type.getBuiltInTypeNameString(),
-                             node->getRight()->getType().getBuiltInTypeNameString()));
-                TIntermNode *replacement = createCompoundAssignmentFunctionCallNode(
-                    node->getLeft(), node->getRight(), "sub");
-                queueReplacement(replacement, OriginalNode::IS_DROPPED);
-                break;
-            }
-            case EOpMulAssign:
-            case EOpVectorTimesMatrixAssign:
-            case EOpVectorTimesScalarAssign:
-            case EOpMatrixTimesScalarAssign:
-            case EOpMatrixTimesMatrixAssign:
-            {
-                mEmulateCompoundMul.insert(
-                    TypePair(type.getBuiltInTypeNameString(),
-                             node->getRight()->getType().getBuiltInTypeNameString()));
-                TIntermNode *replacement = createCompoundAssignmentFunctionCallNode(
-                    node->getLeft(), node->getRight(), "mul");
-                queueReplacement(replacement, OriginalNode::IS_DROPPED);
-                break;
-            }
-            case EOpDivAssign:
-            {
-                mEmulateCompoundDiv.insert(
-                    TypePair(type.getBuiltInTypeNameString(),
-                             node->getRight()->getType().getBuiltInTypeNameString()));
-                TIntermNode *replacement = createCompoundAssignmentFunctionCallNode(
-                    node->getLeft(), node->getRight(), "div");
-                queueReplacement(replacement, OriginalNode::IS_DROPPED);
-                break;
-            }
-            default:
-                // The rest of the binary operations should not need precision emulation.
-                break;
-        }
-    }
-    return visitChildren;
-}
-
-bool EmulatePrecision::visitDeclaration(Visit visit, TIntermDeclaration *node)
-{
-    // Variable or interface block declaration.
-    if (visit == PreVisit)
-    {
-        mDeclaringVariables = true;
-    }
-    else if (visit == InVisit)
-    {
-        mDeclaringVariables = true;
-    }
-    else
-    {
-        mDeclaringVariables = false;
-    }
-    return true;
-}
-
-bool EmulatePrecision::visitGlobalQualifierDeclaration(Visit visit,
-                                                       TIntermGlobalQualifierDeclaration *node)
-{
-    return false;
-}
-
-bool EmulatePrecision::visitAggregate(Visit visit, TIntermAggregate *node)
-{
-    if (visit != PreVisit)
-        return true;
-
-    // User-defined function return values are not rounded. The calculations that produced
-    // the value inside the function definition should have been rounded.
-    TOperator op = node->getOp();
-    if (op == EOpCallInternalRawFunction || op == EOpCallFunctionInAST ||
-        (op == EOpConstruct && node->getBasicType() == EbtStruct))
-    {
-        return true;
-    }
-
-    TIntermNode *parent = getParentNode();
-    if (canRoundFloat(node->getType()) && ParentUsesResult(parent, node) &&
-        !ParentConstructorTakesCareOfRounding(parent, node))
-    {
-        TIntermNode *replacement = createRoundingFunctionCallNode(node);
-        queueReplacement(replacement, OriginalNode::BECOMES_CHILD);
-    }
-    return true;
-}
-
-bool EmulatePrecision::visitUnary(Visit visit, TIntermUnary *node)
-{
-    switch (node->getOp())
-    {
-        case EOpNegative:
-        case EOpLogicalNot:
-        case EOpPostIncrement:
-        case EOpPostDecrement:
-        case EOpPreIncrement:
-        case EOpPreDecrement:
-        case EOpNotComponentWise:
-            break;
-        default:
-            if (canRoundFloat(node->getType()) && visit == PreVisit)
-            {
-                TIntermNode *replacement = createRoundingFunctionCallNode(node);
-                queueReplacement(replacement, OriginalNode::BECOMES_CHILD);
-            }
-            break;
-    }
-
-    return true;
-}
-
-void EmulatePrecision::writeEmulationHelpers(TInfoSinkBase &sink,
-                                             const int shaderVersion,
-                                             const ShShaderOutput outputLanguage)
-{
-    std::unique_ptr<RoundingHelperWriter> roundingHelperWriter(
-        RoundingHelperWriter::createHelperWriter(outputLanguage));
-
-    roundingHelperWriter->writeCommonRoundingHelpers(sink, shaderVersion);
-
-    EmulationSet::const_iterator it;
-    for (it = mEmulateCompoundAdd.begin(); it != mEmulateCompoundAdd.end(); it++)
-        roundingHelperWriter->writeCompoundAssignmentHelper(sink, it->lType, it->rType, "+", "add");
-    for (it = mEmulateCompoundSub.begin(); it != mEmulateCompoundSub.end(); it++)
-        roundingHelperWriter->writeCompoundAssignmentHelper(sink, it->lType, it->rType, "-", "sub");
-    for (it = mEmulateCompoundDiv.begin(); it != mEmulateCompoundDiv.end(); it++)
-        roundingHelperWriter->writeCompoundAssignmentHelper(sink, it->lType, it->rType, "/", "div");
-    for (it = mEmulateCompoundMul.begin(); it != mEmulateCompoundMul.end(); it++)
-        roundingHelperWriter->writeCompoundAssignmentHelper(sink, it->lType, it->rType, "*", "mul");
-}
-
-// static
-bool EmulatePrecision::SupportedInLanguage(const ShShaderOutput outputLanguage)
-{
-    switch (outputLanguage)
-    {
-        case SH_HLSL_4_1_OUTPUT:
-        case SH_ESSL_OUTPUT:
-            return true;
-        default:
-            // Other languages not yet supported
-            return (outputLanguage == SH_GLSL_COMPATIBILITY_OUTPUT ||
-                    sh::IsGLSL130OrNewer(outputLanguage));
-    }
-}
-
-const TFunction *EmulatePrecision::getInternalFunction(const ImmutableString &functionName,
-                                                       const TType &returnType,
-                                                       TIntermSequence *arguments,
-                                                       const TVector<const TVariable *> &parameters,
-                                                       bool knownToNotHaveSideEffects)
-{
-    ImmutableString mangledName = TFunctionLookup::GetMangledName(functionName.data(), *arguments);
-    if (mInternalFunctions.find(mangledName) == mInternalFunctions.end())
-    {
-        TFunction *func = new TFunction(mSymbolTable, functionName, SymbolType::AngleInternal,
-                                        new TType(returnType), knownToNotHaveSideEffects);
-        ASSERT(parameters.size() == arguments->size());
-        for (size_t i = 0; i < parameters.size(); ++i)
-        {
-            func->addParameter(parameters[i]);
-        }
-        mInternalFunctions[mangledName] = func;
-    }
-    return mInternalFunctions[mangledName];
-}
-
-TIntermAggregate *EmulatePrecision::createRoundingFunctionCallNode(TIntermTyped *roundedChild)
-{
-    const ImmutableString *roundFunctionName = &kAngleFrmString;
-    if (roundedChild->getPrecision() == EbpLow)
-        roundFunctionName = &kAngleFrlString;
-    TIntermSequence arguments;
-    arguments.push_back(roundedChild);
-
-    TVector<const TVariable *> parameters;
-    TType *paramType = new TType(roundedChild->getType());
-    paramType->setPrecision(EbpHigh);
-    paramType->setQualifier(EvqIn);
-    parameters.push_back(new TVariable(mSymbolTable, kParamXName,
-                                       static_cast<const TType *>(paramType),
-                                       SymbolType::AngleInternal));
-
-    return TIntermAggregate::CreateRawFunctionCall(
-        *getInternalFunction(*roundFunctionName, roundedChild->getType(), &arguments, parameters,
-                             true),
-        &arguments);
-}
-
-TIntermAggregate *EmulatePrecision::createCompoundAssignmentFunctionCallNode(TIntermTyped *left,
-                                                                             TIntermTyped *right,
-                                                                             const char *opNameStr)
-{
-    std::stringstream strstr = sh::InitializeStream<std::stringstream>();
-    if (left->getPrecision() == EbpMedium)
-        strstr << "angle_compound_" << opNameStr << "_frm";
-    else
-        strstr << "angle_compound_" << opNameStr << "_frl";
-    ImmutableString functionName = ImmutableString(strstr.str());
-    TIntermSequence arguments;
-    arguments.push_back(left);
-    arguments.push_back(right);
-
-    TVector<const TVariable *> parameters;
-    TType *leftParamType = new TType(left->getType());
-    leftParamType->setPrecision(EbpHigh);
-    leftParamType->setQualifier(EvqOut);
-    parameters.push_back(new TVariable(mSymbolTable, kParamXName,
-                                       static_cast<const TType *>(leftParamType),
-                                       SymbolType::AngleInternal));
-    TType *rightParamType = new TType(right->getType());
-    rightParamType->setPrecision(EbpHigh);
-    rightParamType->setQualifier(EvqIn);
-    parameters.push_back(new TVariable(mSymbolTable, kParamYName,
-                                       static_cast<const TType *>(rightParamType),
-                                       SymbolType::AngleInternal));
-
-    return TIntermAggregate::CreateRawFunctionCall(
-        *getInternalFunction(functionName, left->getType(), &arguments, parameters, false),
-        &arguments);
-}
-
-}  // namespace sh
diff --git a/src/compiler/translator/tree_ops/EmulatePrecision.h b/src/compiler/translator/tree_ops/EmulatePrecision.h
deleted file mode 100644
index 81e1e6f..0000000
--- a/src/compiler/translator/tree_ops/EmulatePrecision.h
+++ /dev/null
@@ -1,86 +0,0 @@
-//
-// Copyright 2002 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.
-//
-
-#ifndef COMPILER_TRANSLATOR_TREEOPS_EMULATE_PRECISION_H_
-#define COMPILER_TRANSLATOR_TREEOPS_EMULATE_PRECISION_H_
-
-#include "GLSLANG/ShaderLang.h"
-#include "common/angleutils.h"
-#include "compiler/translator/Compiler.h"
-#include "compiler/translator/InfoSink.h"
-#include "compiler/translator/tree_util/IntermTraverse.h"
-
-// This class gathers all compound assignments from the AST and can then write
-// the functions required for their precision emulation. This way there is no
-// need to write a huge number of variations of the emulated compound assignment
-// to every translated shader with emulation enabled.
-
-namespace sh
-{
-
-class EmulatePrecision : public TLValueTrackingTraverser
-{
-  public:
-    EmulatePrecision(TSymbolTable *symbolTable);
-
-    void visitSymbol(TIntermSymbol *node) override;
-    bool visitBinary(Visit visit, TIntermBinary *node) override;
-    bool visitUnary(Visit visit, TIntermUnary *node) override;
-    bool visitAggregate(Visit visit, TIntermAggregate *node) override;
-    bool visitGlobalQualifierDeclaration(Visit visit,
-                                         TIntermGlobalQualifierDeclaration *node) override;
-    bool visitDeclaration(Visit visit, TIntermDeclaration *node) override;
-
-    void writeEmulationHelpers(TInfoSinkBase &sink,
-                               const int shaderVersion,
-                               const ShShaderOutput outputLanguage);
-
-    static bool SupportedInLanguage(const ShShaderOutput outputLanguage);
-
-  private:
-    struct TypePair
-    {
-        TypePair(const char *l, const char *r) : lType(l), rType(r) {}
-
-        const char *lType;
-        const char *rType;
-    };
-
-    struct TypePairComparator
-    {
-        bool operator()(const TypePair &l, const TypePair &r) const
-        {
-            if (l.lType == r.lType)
-                return l.rType < r.rType;
-            return l.lType < r.lType;
-        }
-    };
-
-    const TFunction *getInternalFunction(const ImmutableString &functionName,
-                                         const TType &returnType,
-                                         TIntermSequence *arguments,
-                                         const TVector<const TVariable *> &parameters,
-                                         bool knownToNotHaveSideEffects);
-    TIntermAggregate *createRoundingFunctionCallNode(TIntermTyped *roundedChild);
-    TIntermAggregate *createCompoundAssignmentFunctionCallNode(TIntermTyped *left,
-                                                               TIntermTyped *right,
-                                                               const char *opNameStr);
-
-    typedef std::set<TypePair, TypePairComparator> EmulationSet;
-    EmulationSet mEmulateCompoundAdd;
-    EmulationSet mEmulateCompoundSub;
-    EmulationSet mEmulateCompoundMul;
-    EmulationSet mEmulateCompoundDiv;
-
-    // Map from mangled name to function.
-    TMap<ImmutableString, const TFunction *> mInternalFunctions;
-
-    bool mDeclaringVariables;
-};
-
-}  // namespace sh
-
-#endif  // COMPILER_TRANSLATOR_TREEOPS_EMULATE_PRECISION_H_
diff --git a/src/compiler/translator/tree_ops/InitializeVariables.cpp b/src/compiler/translator/tree_ops/InitializeVariables.cpp
index f13213a..5e1a581 100644
--- a/src/compiler/translator/tree_ops/InitializeVariables.cpp
+++ b/src/compiler/translator/tree_ops/InitializeVariables.cpp
@@ -57,6 +57,26 @@
         AddStructZeroInitSequence(initializedNode, canUseLoopsToInitialize, highPrecisionSupported,
                                   initSequenceOut, symbolTable);
     }
+    else if (initializedNode->getType().isInterfaceBlock())
+    {
+        const ImmutableString &name =
+            static_cast<const TIntermSymbol *>(initializedNode)->getName();
+        const TType &type                     = initializedNode->getType();
+        const TInterfaceBlock &interfaceBlock = *type.getInterfaceBlock();
+        const TFieldList &fieldList           = interfaceBlock.fields();
+        for (size_t fieldIndex = 0; fieldIndex < fieldList.size(); ++fieldIndex)
+        {
+            const TField &field          = *fieldList[fieldIndex];
+            TIntermTyped *blockReference = ReferenceGlobalVariable(name, *symbolTable);
+            TIntermTyped *fieldIndexRef  = CreateIndexNode(static_cast<int>(fieldIndex));
+            TIntermTyped *fieldReference = new TIntermBinary(
+                TOperator::EOpIndexDirectInterfaceBlock, blockReference, fieldIndexRef);
+            TIntermTyped *fieldZero = CreateZeroNode(*field.type());
+            TIntermTyped *assignment =
+                new TIntermBinary(TOperator::EOpAssign, fieldReference, fieldZero);
+            initSequenceOut->push_back(assignment);
+        }
+    }
     else
     {
         initSequenceOut->push_back(CreateZeroInitAssignment(initializedNode));
@@ -169,14 +189,14 @@
                     bool canUseLoopsToInitialize,
                     bool highPrecisionSupported)
 {
-    for (const auto &var : variables)
+    for (const ShaderVariable &var : variables)
     {
         // Note that tempVariableName will reference a short-lived char array here - that's fine
         // since we're only using it to find symbols.
         ImmutableString tempVariableName(var.name.c_str(), var.name.length());
 
         TIntermTyped *initializedSymbol = nullptr;
-        if (var.isBuiltIn())
+        if (var.isBuiltIn() && !symbolTable->findUserDefined(tempVariableName))
         {
             initializedSymbol =
                 ReferenceBuiltInVariable(tempVariableName, *symbolTable, shaderVersion);
diff --git a/src/compiler/translator/tree_ops/vulkan/MonomorphizeUnsupportedFunctionsInVulkanGLSL.cpp b/src/compiler/translator/tree_ops/MonomorphizeUnsupportedFunctions.cpp
similarity index 93%
rename from src/compiler/translator/tree_ops/vulkan/MonomorphizeUnsupportedFunctionsInVulkanGLSL.cpp
rename to src/compiler/translator/tree_ops/MonomorphizeUnsupportedFunctions.cpp
index 8690789..f7c5b4f 100644
--- a/src/compiler/translator/tree_ops/vulkan/MonomorphizeUnsupportedFunctionsInVulkanGLSL.cpp
+++ b/src/compiler/translator/tree_ops/MonomorphizeUnsupportedFunctions.cpp
@@ -3,14 +3,13 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 //
-// MonomorphizeUnsupportedFunctionsInVulkanGLSL: Monomorphize functions that are called with
-// parameters that are not compatible with Vulkan GLSL.
+// MonomorphizeUnsupportedFunctions: Monomorphize functions that are called with
+// parameters that are incompatible with both Vulkan GLSL and Metal.
 //
 
-#include "compiler/translator/tree_ops/vulkan/MonomorphizeUnsupportedFunctionsInVulkanGLSL.h"
+#include "compiler/translator/tree_ops/MonomorphizeUnsupportedFunctions.h"
 
 #include "compiler/translator/ImmutableStringBuilder.h"
-#include "compiler/translator/StaticType.h"
 #include "compiler/translator/SymbolTable.h"
 #include "compiler/translator/tree_util/IntermNode_util.h"
 #include "compiler/translator/tree_util/IntermTraverse.h"
@@ -219,7 +218,7 @@
                 {
                     TIntermTyped *index = asBinary->getRight();
                     TType *indexType    = new TType(index->getType());
-                    indexType->setQualifier(EvqIn);
+                    indexType->setQualifier(EvqParamIn);
 
                     TVariable *param = new TVariable(symbolTable, kEmptyImmutableString, indexType,
                                                      SymbolType::AngleInternal);
@@ -503,12 +502,11 @@
     // Replace root's sequence with |replacement|.
     root->replaceAllChildren(replacement);
 }
-}  // anonymous namespace
 
-bool MonomorphizeUnsupportedFunctionsInVulkanGLSL(TCompiler *compiler,
-                                                  TIntermBlock *root,
-                                                  TSymbolTable *symbolTable,
-                                                  ShCompileOptions compileOptions)
+bool MonomorphizeUnsupportedFunctionsImpl(TCompiler *compiler,
+                                          TIntermBlock *root,
+                                          TSymbolTable *symbolTable,
+                                          ShCompileOptions compileOptions)
 {
     // First, sort out the declarations such that all non-function declarations are placed before
     // function definitions.  This way when the function is replaced with one that references said
@@ -544,4 +542,20 @@
 
     return true;
 }
+}  // anonymous namespace
+
+bool MonomorphizeUnsupportedFunctions(TCompiler *compiler,
+                                      TIntermBlock *root,
+                                      TSymbolTable *symbolTable,
+                                      ShCompileOptions compileOptions)
+{
+    // This function actually applies multiple transformation, and the AST may not be valid until
+    // the transformations are entirely done.  Some validation is momentarily disabled.
+    bool enableValidateFunctionCall = compiler->disableValidateFunctionCall();
+
+    bool result = MonomorphizeUnsupportedFunctionsImpl(compiler, root, symbolTable, compileOptions);
+
+    compiler->restoreValidateFunctionCall(enableValidateFunctionCall);
+    return result && compiler->validateAST(root);
+}
 }  // namespace sh
diff --git a/src/compiler/translator/tree_ops/vulkan/MonomorphizeUnsupportedFunctionsInVulkanGLSL.h b/src/compiler/translator/tree_ops/MonomorphizeUnsupportedFunctions.h
similarity index 62%
rename from src/compiler/translator/tree_ops/vulkan/MonomorphizeUnsupportedFunctionsInVulkanGLSL.h
rename to src/compiler/translator/tree_ops/MonomorphizeUnsupportedFunctions.h
index be8be5a..94a2f1d 100644
--- a/src/compiler/translator/tree_ops/vulkan/MonomorphizeUnsupportedFunctionsInVulkanGLSL.h
+++ b/src/compiler/translator/tree_ops/MonomorphizeUnsupportedFunctions.h
@@ -3,8 +3,8 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 //
-// MonomorphizeUnsupportedFunctionsInVulkanGLSL: Monomorphize functions that are called with
-// parameters that are not compatible with Vulkan GLSL:
+// MonomorphizeUnsupportedFunctions: Monomorphize functions that are called with
+// parameters that are incompatible with both Vulkan GLSL and Metal:
 //
 // - Samplers in structs
 // - Structs that have samplers
@@ -17,8 +17,8 @@
 // This transformation basically duplicates such functions, removes the
 // sampler/image/atomic_counter parameters and uses the opaque uniforms used by the caller.
 
-#ifndef COMPILER_TRANSLATOR_TREEOPS_VULKAN_MONOMORPHIZEUNSUPPORTEDFUNCTIONSINVULKANGLSL_H_
-#define COMPILER_TRANSLATOR_TREEOPS_VULKAN_MONOMORPHIZEUNSUPPORTEDFUNCTIONSINVULKANGLSL_H_
+#ifndef COMPILER_TRANSLATOR_TREEOPS_VULKAN_MONOMORPHIZEUNSUPPORTEDFUNCTIONS_H_
+#define COMPILER_TRANSLATOR_TREEOPS_VULKAN_MONOMORPHIZEUNSUPPORTEDFUNCTIONS_H_
 
 #include "common/angleutils.h"
 #include "compiler/translator/Compiler.h"
@@ -28,10 +28,10 @@
 class TIntermBlock;
 class TSymbolTable;
 
-ANGLE_NO_DISCARD bool MonomorphizeUnsupportedFunctionsInVulkanGLSL(TCompiler *compiler,
-                                                                   TIntermBlock *root,
-                                                                   TSymbolTable *symbolTable,
-                                                                   ShCompileOptions compileOptions);
+ANGLE_NO_DISCARD bool MonomorphizeUnsupportedFunctions(TCompiler *compiler,
+                                                       TIntermBlock *root,
+                                                       TSymbolTable *symbolTable,
+                                                       ShCompileOptions compileOptions);
 }  // namespace sh
 
-#endif  // COMPILER_TRANSLATOR_TREEOPS_VULKAN_MONOMORPHIZEUNSUPPORTEDFUNCTIONSINVULKANGLSL_H_
+#endif  // COMPILER_TRANSLATOR_TREEOPS_VULKAN_MONOMORPHIZEUNSUPPORTEDFUNCTIONS_H_
diff --git a/src/compiler/translator/tree_ops/PruneNoOps.cpp b/src/compiler/translator/tree_ops/PruneNoOps.cpp
index 15ce791..a10a84c 100644
--- a/src/compiler/translator/tree_ops/PruneNoOps.cpp
+++ b/src/compiler/translator/tree_ops/PruneNoOps.cpp
@@ -136,57 +136,43 @@
 
 bool PruneNoOpsTraverser::visitBlock(Visit visit, TIntermBlock *node)
 {
-    if (visit == PreVisit)
-    {
-        return true;
-    }
+    ASSERT(visit == PreVisit);
 
-    TIntermSequence *statements = node->getSequence();
-    const size_t lastChildIndex = getLastTraversedChildIndex(visit);
+    TIntermSequence &statements = *node->getSequence();
     TIntermSequence emptyReplacement;
 
-    // If a branch is visited, prune the rest of the statements.
-    if (mIsBranchVisited)
+    // Visit each statement in the block one by one.  Once a branch is visited (break, continue,
+    // return or discard), drop the rest of the statements.
+    for (size_t statementIndex = 0; statementIndex < statements.size(); ++statementIndex)
     {
-        for (size_t removeIndex = lastChildIndex + 1; removeIndex < statements->size();
-             ++removeIndex)
-        {
-            TIntermNode *statement = (*statements)[removeIndex];
+        TIntermNode *statement = statements[statementIndex];
 
-            // If the statement is a switch case label, stop pruning and continue visiting the
-            // children.
-            if (statement->getAsCaseNode() != nullptr)
-            {
-                mIsBranchVisited = false;
-                return true;
-            }
-
-            mMultiReplacements.emplace_back(node, statement, std::move(emptyReplacement));
-        }
-
-        // If the parent is a block, this is a nested block without any condition (like if, loop or
-        // switch), so the rest of the parent block should also be pruned.  Otherwise the parent
-        // block should be unaffected.
-        if (getParentNode()->getAsBlock() == nullptr)
+        // If the statement is a switch case label, stop pruning and continue visiting the children.
+        if (statement->getAsCaseNode() != nullptr)
         {
             mIsBranchVisited = false;
         }
 
-        // Don't visit the pruned children.
-        return false;
-    }
-
-    // If the statement is a noop, prune it.
-    if (!statements->empty())
-    {
-        TIntermNode *statement = (*statements)[lastChildIndex];
-        if (IsNoOp(statement))
+        // If a branch is visited, prune the statement.  If the statement is a no-op, also prune it.
+        if (mIsBranchVisited || IsNoOp(statement))
         {
             mMultiReplacements.emplace_back(node, statement, std::move(emptyReplacement));
+            continue;
         }
+
+        // Visit the statement if not pruned.
+        statement->traverse(this);
     }
 
-    return true;
+    // If the parent is a block and mIsBranchVisited is set, this is a nested block without any
+    // condition (like if, loop or switch), so the rest of the parent block should also be pruned.
+    // Otherwise the parent block should be unaffected.
+    if (mIsBranchVisited && getParentNode()->getAsBlock() == nullptr)
+    {
+        mIsBranchVisited = false;
+    }
+
+    return false;
 }
 
 bool PruneNoOpsTraverser::visitLoop(Visit visit, TIntermLoop *loop)
diff --git a/src/compiler/translator/tree_ops/RecordConstantPrecision.cpp b/src/compiler/translator/tree_ops/RecordConstantPrecision.cpp
new file mode 100644
index 0000000..ea15ab7
--- /dev/null
+++ b/src/compiler/translator/tree_ops/RecordConstantPrecision.cpp
@@ -0,0 +1,119 @@
+//
+// Copyright 2002 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.
+//
+// During parsing, all constant expressions are folded to constant union nodes. The expressions that
+// have been folded may have had precision qualifiers, which should affect the precision of the
+// consuming operation. If the folded constant union nodes are written to output as such they won't
+// have any precision qualifiers, and their effect on the precision of the consuming operation is
+// lost.
+//
+// RecordConstantPrecision is an AST traverser that inspects the precision qualifiers of constants
+// and hoists the constants outside the containing expression as precision qualified named variables
+// in case that is required for correct precision propagation.
+//
+
+#include "compiler/translator/tree_ops/RecordConstantPrecision.h"
+
+#include "compiler/translator/InfoSink.h"
+#include "compiler/translator/tree_util/IntermNode_util.h"
+#include "compiler/translator/tree_util/IntermTraverse.h"
+
+namespace sh
+{
+
+namespace
+{
+
+class RecordConstantPrecisionTraverser : public TIntermTraverser
+{
+  public:
+    RecordConstantPrecisionTraverser(TSymbolTable *symbolTable);
+
+    void visitConstantUnion(TIntermConstantUnion *node) override;
+
+  protected:
+    bool operandAffectsParentOperationPrecision(TIntermTyped *operand);
+};
+
+RecordConstantPrecisionTraverser::RecordConstantPrecisionTraverser(TSymbolTable *symbolTable)
+    : TIntermTraverser(true, false, true, symbolTable)
+{}
+
+bool RecordConstantPrecisionTraverser::operandAffectsParentOperationPrecision(TIntermTyped *operand)
+{
+    if (getParentNode()->getAsCaseNode() || getParentNode()->getAsBlock())
+    {
+        return false;
+    }
+
+    if (operand->getBasicType() == EbtBool || operand->getBasicType() == EbtStruct)
+    {
+        return false;
+    }
+
+    const TIntermBinary *parentAsBinary = getParentNode()->getAsBinaryNode();
+    if (parentAsBinary != nullptr)
+    {
+        // If the constant is assigned or is used to initialize a variable, or if it's an index,
+        // its precision has no effect.
+        switch (parentAsBinary->getOp())
+        {
+            case EOpInitialize:
+            case EOpAssign:
+            case EOpIndexDirect:
+            case EOpIndexDirectStruct:
+            case EOpIndexDirectInterfaceBlock:
+            case EOpIndexIndirect:
+                return false;
+            default:
+                return true;
+        }
+    }
+
+    TIntermAggregate *parentAsAggregate = getParentNode()->getAsAggregate();
+    if (parentAsAggregate != nullptr)
+    {
+        // The precision of an aggregate is derived from children only in the following conditions:
+        //
+        // - Built-in math operations
+        // - Constructors
+        //
+        return parentAsAggregate->isConstructor() ||
+               BuiltInGroup::IsMath(parentAsAggregate->getOp());
+    }
+
+    return true;
+}
+
+void RecordConstantPrecisionTraverser::visitConstantUnion(TIntermConstantUnion *node)
+{
+    // If the constant has lowp or undefined precision, it can't increase the precision of consuming
+    // operations.
+    if (node->getPrecision() < EbpMedium)
+        return;
+
+    // It's possible the node has no effect on the precision of the consuming expression, depending
+    // on the consuming expression, and the precision of the other parameters of the expression.
+    if (!operandAffectsParentOperationPrecision(node))
+        return;
+
+    // Make the constant a precision-qualified named variable to make sure it affects the precision
+    // of the consuming expression.
+    TIntermDeclaration *variableDeclaration = nullptr;
+    TVariable *variable = DeclareTempVariable(mSymbolTable, node, EvqConst, &variableDeclaration);
+    insertStatementInParentBlock(variableDeclaration);
+    queueReplacement(CreateTempSymbolNode(variable), OriginalNode::IS_DROPPED);
+}
+
+}  // namespace
+
+bool RecordConstantPrecision(TCompiler *compiler, TIntermNode *root, TSymbolTable *symbolTable)
+{
+    RecordConstantPrecisionTraverser traverser(symbolTable);
+    root->traverse(&traverser);
+    return traverser.updateTree(compiler, root);
+}
+
+}  // namespace sh
diff --git a/src/compiler/translator/tree_ops/gl/RecordConstantPrecision.h b/src/compiler/translator/tree_ops/RecordConstantPrecision.h
similarity index 85%
rename from src/compiler/translator/tree_ops/gl/RecordConstantPrecision.h
rename to src/compiler/translator/tree_ops/RecordConstantPrecision.h
index bf37100..b3ebb8c 100644
--- a/src/compiler/translator/tree_ops/gl/RecordConstantPrecision.h
+++ b/src/compiler/translator/tree_ops/RecordConstantPrecision.h
@@ -14,8 +14,8 @@
 // in case that is required for correct precision propagation.
 //
 
-#ifndef COMPILER_TRANSLATOR_TREEOPS_GL_RECORDCONSTANTPRECISION_H_
-#define COMPILER_TRANSLATOR_TREEOPS_GL_RECORDCONSTANTPRECISION_H_
+#ifndef COMPILER_TRANSLATOR_TREEOPS_RECORDCONSTANTPRECISION_H_
+#define COMPILER_TRANSLATOR_TREEOPS_RECORDCONSTANTPRECISION_H_
 
 #include "common/angleutils.h"
 
@@ -30,4 +30,4 @@
                                               TSymbolTable *symbolTable);
 }  // namespace sh
 
-#endif  // COMPILER_TRANSLATOR_TREEOPS_GL_RECORDCONSTANTPRECISION_H_
+#endif  // COMPILER_TRANSLATOR_TREEOPS_RECORDCONSTANTPRECISION_H_
diff --git a/src/compiler/translator/tree_ops/RemoveDynamicIndexing.cpp b/src/compiler/translator/tree_ops/RemoveDynamicIndexing.cpp
index 7c69044..39fdc20 100644
--- a/src/compiler/translator/tree_ops/RemoveDynamicIndexing.cpp
+++ b/src/compiler/translator/tree_ops/RemoveDynamicIndexing.cpp
@@ -28,7 +28,7 @@
 
 using DynamicIndexingNodeMatcher = std::function<bool(TIntermBinary *)>;
 
-const TType *kIndexType = StaticType::Get<EbtInt, EbpHigh, EvqIn, 1, 1>();
+const TType *kIndexType = StaticType::Get<EbtInt, EbpHigh, EvqParamIn, 1, 1>();
 
 constexpr const ImmutableString kBaseName("base");
 constexpr const ImmutableString kIndexName("index");
@@ -89,16 +89,17 @@
 
 TType *GetFieldType(const TType &indexedType)
 {
+    TType *fieldType = new TType(indexedType);
     if (indexedType.isMatrix())
     {
-        TType *fieldType = new TType(indexedType.getBasicType(), indexedType.getPrecision());
-        fieldType->setPrimarySize(static_cast<unsigned char>(indexedType.getRows()));
-        return fieldType;
+        fieldType->toMatrixColumnType();
     }
     else
     {
-        return new TType(indexedType.getBasicType(), indexedType.getPrecision());
+        ASSERT(indexedType.isVector());
+        fieldType->toComponentType();
     }
+    return fieldType;
 }
 
 const TType *GetBaseType(const TType &type, bool write)
@@ -109,9 +110,9 @@
     // highp values are being indexed in the shader. For HLSL precision doesn't matter, but in
     // principle this code could be used with multiple backends.
     baseType->setPrecision(EbpHigh);
-    baseType->setQualifier(EvqInOut);
+    baseType->setQualifier(EvqParamInOut);
     if (!write)
-        baseType->setQualifier(EvqIn);
+        baseType->setQualifier(EvqParamIn);
     return baseType;
 }
 
@@ -458,14 +459,14 @@
                         GetIndexFunctionName(node->getLeft()->getType(), true));
                     indexedWriteFunction =
                         new TFunction(mSymbolTable, functionName, SymbolType::AngleInternal,
-                                      StaticType::GetBasic<EbtVoid>(), false);
+                                      StaticType::GetBasic<EbtVoid, EbpUndefined>(), false);
                     indexedWriteFunction->addParameter(new TVariable(mSymbolTable, kBaseName,
                                                                      GetBaseType(type, true),
                                                                      SymbolType::AngleInternal));
                     indexedWriteFunction->addParameter(new TVariable(
                         mSymbolTable, kIndexName, kIndexType, SymbolType::AngleInternal));
                     TType *valueType = GetFieldType(type);
-                    valueType->setQualifier(EvqIn);
+                    valueType->setQualifier(EvqParamIn);
                     indexedWriteFunction->addParameter(new TVariable(
                         mSymbolTable, kValueName, static_cast<const TType *>(valueType),
                         SymbolType::AngleInternal));
@@ -534,6 +535,10 @@
                              TSymbolTable *symbolTable,
                              PerformanceDiagnostics *perfDiagnostics)
 {
+    // This transformation adds function declarations after the fact and so some validation is
+    // momentarily disabled.
+    bool enableValidateFunctionCall = compiler->disableValidateFunctionCall();
+
     RemoveDynamicIndexingTraverser traverser(std::move(matcher), symbolTable, perfDiagnostics);
     do
     {
@@ -550,6 +555,8 @@
     // TIntermLValueTrackingTraverser, and creates intricacies that are not easily apparent from a
     // superficial reading of the code.
     traverser.insertHelperDefinitions(root);
+
+    compiler->restoreValidateFunctionCall(enableValidateFunctionCall);
     return compiler->validateAST(root);
 }
 
diff --git a/src/compiler/translator/tree_ops/vulkan/RewriteArrayOfArrayOfOpaqueUniforms.cpp b/src/compiler/translator/tree_ops/RewriteArrayOfArrayOfOpaqueUniforms.cpp
similarity index 97%
rename from src/compiler/translator/tree_ops/vulkan/RewriteArrayOfArrayOfOpaqueUniforms.cpp
rename to src/compiler/translator/tree_ops/RewriteArrayOfArrayOfOpaqueUniforms.cpp
index 91a01f4..bd12cd1 100644
--- a/src/compiler/translator/tree_ops/vulkan/RewriteArrayOfArrayOfOpaqueUniforms.cpp
+++ b/src/compiler/translator/tree_ops/RewriteArrayOfArrayOfOpaqueUniforms.cpp
@@ -6,11 +6,10 @@
 // RewriteAtomicCounters: Emulate atomic counter buffers with storage buffers.
 //
 
-#include "compiler/translator/tree_ops/vulkan/RewriteArrayOfArrayOfOpaqueUniforms.h"
+#include "compiler/translator/tree_ops/RewriteArrayOfArrayOfOpaqueUniforms.h"
 
 #include "compiler/translator/Compiler.h"
 #include "compiler/translator/ImmutableStringBuilder.h"
-#include "compiler/translator/StaticType.h"
 #include "compiler/translator/SymbolTable.h"
 #include "compiler/translator/tree_util/IntermNode_util.h"
 #include "compiler/translator/tree_util/IntermTraverse.h"
@@ -236,7 +235,7 @@
 //
 //     uniform sampler/image/atomic_uint u[N * M * ..]
 //
-// MonomorphizeUnsupportedFunctionsInVulkanGLSL makes it impossible for this array to be partially
+// MonomorphizeUnsupportedFunctions makes it impossible for this array to be partially
 // subscripted, or passed as argument to a function unsubscripted.  This means that every encounter
 // of this uniform can be expected to be fully subscripted.
 //
diff --git a/src/compiler/translator/tree_ops/vulkan/RewriteArrayOfArrayOfOpaqueUniforms.h b/src/compiler/translator/tree_ops/RewriteArrayOfArrayOfOpaqueUniforms.h
similarity index 65%
rename from src/compiler/translator/tree_ops/vulkan/RewriteArrayOfArrayOfOpaqueUniforms.h
rename to src/compiler/translator/tree_ops/RewriteArrayOfArrayOfOpaqueUniforms.h
index 3214d43..de255a7 100644
--- a/src/compiler/translator/tree_ops/vulkan/RewriteArrayOfArrayOfOpaqueUniforms.h
+++ b/src/compiler/translator/tree_ops/RewriteArrayOfArrayOfOpaqueUniforms.h
@@ -4,10 +4,10 @@
 // found in the LICENSE file.
 //
 // RewriteArrayOfArrayOfOpaqueUniforms: Flatten array of array of opaque uniforms.  Requires
-// MonomorphizeUnsupportedFunctionsInVulkanGLSL and RewriteStructSamplers to have been run.
+// MonomorphizeUnsupportedFunctions and RewriteStructSamplers to have been run.
 
-#ifndef COMPILER_TRANSLATOR_TREEOPS_VULKAN_REWRITEARRAYOFARRAYOFOPAQUEUNIFORMS_H_
-#define COMPILER_TRANSLATOR_TREEOPS_VULKAN_REWRITEARRAYOFARRAYOFOPAQUEUNIFORMS_H_
+#ifndef COMPILER_TRANSLATOR_TREEOPS_REWRITEARRAYOFARRAYOFOPAQUEUNIFORMS_H_
+#define COMPILER_TRANSLATOR_TREEOPS_REWRITEARRAYOFARRAYOFOPAQUEUNIFORMS_H_
 
 #include "common/angleutils.h"
 
@@ -22,4 +22,4 @@
                                                           TSymbolTable *symbolTable);
 }  // namespace sh
 
-#endif  // COMPILER_TRANSLATOR_TREEOPS_VULKAN_REWRITEARRAYOFARRAYOFOPAQUEUNIFORMS_H_
+#endif  // COMPILER_TRANSLATOR_TREEOPS_REWRITEARRAYOFARRAYOFOPAQUEUNIFORMS_H_
diff --git a/src/compiler/translator/tree_ops/RewriteAtomicCounters.cpp b/src/compiler/translator/tree_ops/RewriteAtomicCounters.cpp
index 57ae339..defc59b 100644
--- a/src/compiler/translator/tree_ops/RewriteAtomicCounters.cpp
+++ b/src/compiler/translator/tree_ops/RewriteAtomicCounters.cpp
@@ -10,7 +10,6 @@
 
 #include "compiler/translator/Compiler.h"
 #include "compiler/translator/ImmutableStringBuilder.h"
-#include "compiler/translator/StaticType.h"
 #include "compiler/translator/SymbolTable.h"
 #include "compiler/translator/tree_util/IntermNode_util.h"
 #include "compiler/translator/tree_util/IntermTraverse.h"
@@ -28,7 +27,7 @@
 {
     // Define `uint counters[];` as the only field in the interface block.
     TFieldList *fieldList = new TFieldList;
-    TType *counterType    = new TType(EbtUInt);
+    TType *counterType    = new TType(EbtUInt, EbpHigh, EvqGlobal);
     counterType->makeArray(0);
 
     TField *countersField =
@@ -44,10 +43,13 @@
     constexpr uint32_t kMaxAtomicCounterBuffers = 8;
 
     // Define a storage block "ANGLEAtomicCounters" with instance name "atomicCounters".
-    return DeclareInterfaceBlock(
-        root, symbolTable, fieldList, EvqBuffer, TLayoutQualifier::Create(), coherentMemory,
-        kMaxAtomicCounterBuffers, ImmutableString(vk::kAtomicCountersBlockName),
-        kAtomicCountersVarName);
+    TLayoutQualifier layoutQualifier = TLayoutQualifier::Create();
+    layoutQualifier.blockStorage     = EbsStd430;
+
+    return DeclareInterfaceBlock(root, symbolTable, fieldList, EvqBuffer, layoutQualifier,
+                                 coherentMemory, kMaxAtomicCounterBuffers,
+                                 ImmutableString(vk::kAtomicCountersBlockName),
+                                 kAtomicCountersVarName);
 }
 
 TIntermTyped *CreateUniformBufferOffset(const TIntermTyped *uniformBufferOffsets, int binding)
@@ -103,7 +105,7 @@
     //     atomicCounters[binding].counters[offset + index]
     //
     // In either case, an offset given through uniforms is also added to |offset|.  The binding is
-    // necessarily a constant thanks to MonomorphizeUnsupportedFunctionsInVulkanGLSL.
+    // necessarily a constant thanks to MonomorphizeUnsupportedFunctions.
 
     // First determine if there's an index, and extract the atomic counter symbol out of the
     // expression.
@@ -221,7 +223,7 @@
         }
 
         // AST functions don't require modification as atomic counter function parameters are
-        // removed by MonomorphizeUnsupportedFunctionsInVulkanGLSL.
+        // removed by MonomorphizeUnsupportedFunctions.
         return true;
     }
 
diff --git a/src/compiler/translator/tree_ops/RewriteCubeMapSamplersAs2DArray.cpp b/src/compiler/translator/tree_ops/RewriteCubeMapSamplersAs2DArray.cpp
index 48a843f..4eded5f 100644
--- a/src/compiler/translator/tree_ops/RewriteCubeMapSamplersAs2DArray.cpp
+++ b/src/compiler/translator/tree_ops/RewriteCubeMapSamplersAs2DArray.cpp
@@ -6,7 +6,7 @@
 // RewriteCubeMapSamplersAs2DArray: Change samplerCube samplers to sampler2DArray for seamful cube
 // map emulation.
 //
-// Relies on MonomorphizeUnsupportedFunctionsInVulkanGLSL to ensure samplerCube variables are not
+// Relies on MonomorphizeUnsupportedFunctions to ensure samplerCube variables are not
 // passed to functions (for simplicity).
 //
 
@@ -90,8 +90,8 @@
     // and the negations.
     TIntermTyped *duValue = DerivativeQuotient(z, dz, x, dx, xRecip);
     TIntermTyped *dvValue = DerivativeQuotient(y, dy, x, dx, xRecip);
-    duValue               = new TIntermBinary(EOpMul, duValue, CreateFloatNode(0.5f));
-    dvValue               = new TIntermBinary(EOpMul, dvValue, CreateFloatNode(0.5f));
+    duValue               = new TIntermBinary(EOpMul, duValue, CreateFloatNode(0.5f, EbpMedium));
+    dvValue               = new TIntermBinary(EOpMul, dvValue, CreateFloatNode(0.5f, EbpMedium));
     block->appendStatement(new TIntermBinary(EOpAssign, du->deepCopy(), duValue));
     block->appendStatement(new TIntermBinary(EOpAssign, dv->deepCopy(), dvValue));
 }
@@ -143,8 +143,8 @@
     // and the negations.
     TIntermTyped *duValue = DerivativeQuotient(x, dx, y, dy, yRecip);
     TIntermTyped *dvValue = DerivativeQuotient(z, dz, y, dy, yRecip);
-    duValue               = new TIntermBinary(EOpMul, duValue, CreateFloatNode(0.5f));
-    dvValue               = new TIntermBinary(EOpMul, dvValue, CreateFloatNode(0.5f));
+    duValue               = new TIntermBinary(EOpMul, duValue, CreateFloatNode(0.5f, EbpMedium));
+    dvValue               = new TIntermBinary(EOpMul, dvValue, CreateFloatNode(0.5f, EbpMedium));
     block->appendStatement(new TIntermBinary(EOpAssign, du->deepCopy(), duValue));
     block->appendStatement(new TIntermBinary(EOpAssign, dv->deepCopy(), dvValue));
 }
@@ -196,8 +196,8 @@
     // and the negations.
     TIntermTyped *duValue = DerivativeQuotient(x, dx, z, dz, zRecip);
     TIntermTyped *dvValue = DerivativeQuotient(y, dy, z, dz, zRecip);
-    duValue               = new TIntermBinary(EOpMul, duValue, CreateFloatNode(0.5f));
-    dvValue               = new TIntermBinary(EOpMul, dvValue, CreateFloatNode(0.5f));
+    duValue               = new TIntermBinary(EOpMul, duValue, CreateFloatNode(0.5f, EbpMedium));
+    dvValue               = new TIntermBinary(EOpMul, dvValue, CreateFloatNode(0.5f, EbpMedium));
     block->appendStatement(new TIntermBinary(EOpAssign, du->deepCopy(), duValue));
     block->appendStatement(new TIntermBinary(EOpAssign, dv->deepCopy(), dvValue));
 }
@@ -255,7 +255,7 @@
         }
 
         // AST functions don't require modification as samplerCube function parameters are removed
-        // by MonomorphizeUnsupportedFunctionsInVulkanGLSL.
+        // by MonomorphizeUnsupportedFunctions.
         return true;
     }
 
@@ -394,9 +394,9 @@
 
         // Create the function parameters: vec3 P, vec3 dPdx, vec3 dPdy,
         //                                 out vec2 dUVdx, out vec2 dUVdy
-        const TType *vec3Type = StaticType::GetBasic<EbtFloat, 3>();
+        const TType *vec3Type = StaticType::GetBasic<EbtFloat, EbpHigh, 3>();
         TType *inVec3Type     = new TType(*vec3Type);
-        inVec3Type->setQualifier(EvqIn);
+        inVec3Type->setQualifier(EvqParamIn);
 
         TVariable *pVar    = new TVariable(mSymbolTable, ImmutableString("P"), inVec3Type,
                                         SymbolType::AngleInternal);
@@ -405,9 +405,9 @@
         TVariable *dPdyVar = new TVariable(mSymbolTable, ImmutableString("dPdy"), inVec3Type,
                                            SymbolType::AngleInternal);
 
-        const TType *vec2Type = StaticType::GetBasic<EbtFloat, 2>();
+        const TType *vec2Type = StaticType::GetBasic<EbtFloat, EbpHigh, 2>();
         TType *outVec2Type    = new TType(*vec2Type);
-        outVec2Type->setQualifier(EvqOut);
+        outVec2Type->setQualifier(EvqParamOut);
 
         TVariable *dUVdxVar = new TVariable(mSymbolTable, ImmutableString("dUVdx"), outVec2Type,
                                             SymbolType::AngleInternal);
@@ -429,7 +429,7 @@
         TIntermSwizzle *z = new TIntermSwizzle(p->deepCopy(), {2});
 
         // Create abs and "< 0" expressions from the channels.
-        const TType *floatType = StaticType::GetBasic<EbtFloat>();
+        const TType *floatType = StaticType::GetBasic<EbtFloat, EbpHigh>();
 
         TIntermTyped *isNegX = new TIntermBinary(EOpLessThan, x, CreateZeroNode(*floatType));
         TIntermTyped *isNegY = new TIntermBinary(EOpLessThan, y, CreateZeroNode(*floatType));
@@ -456,17 +456,18 @@
         // Create temporary variable for division outer product matrix and its
         // derivatives.
         // recipOuter[i][j] = 0.5 * P[j] / P[i]
-        const TType *mat3Type     = StaticType::GetBasic<EbtFloat, 3, 3>();
+        const TType *mat3Type     = StaticType::GetBasic<EbtFloat, EbpHigh, 3, 3>();
         TIntermSymbol *recipOuter = new TIntermSymbol(CreateTempVariable(mSymbolTable, mat3Type));
 
-        TIntermTyped *pRecip     = new TIntermBinary(EOpDiv, CreateFloatNode(1.0), p->deepCopy());
+        TIntermTyped *pRecip =
+            new TIntermBinary(EOpDiv, CreateFloatNode(1.0, EbpMedium), p->deepCopy());
         TIntermSymbol *pRecipVar = new TIntermSymbol(CreateTempVariable(mSymbolTable, vec3Type));
 
         body->appendStatement(CreateTempInitDeclarationNode(&pRecipVar->variable(), pRecip));
 
         TIntermSequence args = {
-            p->deepCopy(),
-            new TIntermBinary(EOpVectorTimesScalar, CreateFloatNode(0.5), pRecipVar->deepCopy())};
+            p->deepCopy(), new TIntermBinary(EOpVectorTimesScalar, CreateFloatNode(0.5, EbpMedium),
+                                             pRecipVar->deepCopy())};
         TIntermDeclaration *recipOuterDecl = CreateTempInitDeclarationNode(
             &recipOuter->variable(),
             CreateBuiltInFunctionCallNode("outerProduct", &args, *mSymbolTable, 300));
@@ -566,7 +567,7 @@
         //     layer = 2 + float(y < 0)
         TIntermSequence argsNegY = {isNegY};
         TIntermTyped *yl =
-            new TIntermBinary(EOpAdd, CreateFloatNode(2.0f),
+            new TIntermBinary(EOpAdd, CreateFloatNode(2.0f, EbpMedium),
                               TIntermAggregate::CreateConstructor(*floatType, &argsNegY));
 
         TIntermBlock *calculateYL = new TIntermBlock;
@@ -576,7 +577,7 @@
         //     layer = 4 + float(z < 0)
         TIntermSequence argsNegZ = {isNegZ};
         TIntermTyped *zl =
-            new TIntermBinary(EOpAdd, CreateFloatNode(4.0f),
+            new TIntermBinary(EOpAdd, CreateFloatNode(4.0f, EbpMedium),
                               TIntermAggregate::CreateConstructor(*floatType, &argsNegZ));
 
         TIntermBlock *calculateZL = new TIntermBlock;
@@ -594,8 +595,8 @@
         // of the three transformations to apply.  Previously, ma == |X| and ma == |Y| was used,
         // which is no longer correct for helper invocations.  The value of ma is updated in each
         // case for these invocations.
-        isXMajor = new TIntermBinary(EOpLessThan, l->deepCopy(), CreateFloatNode(1.5f));
-        isYMajor = new TIntermBinary(EOpLessThan, l->deepCopy(), CreateFloatNode(3.5f));
+        isXMajor = new TIntermBinary(EOpLessThan, l->deepCopy(), CreateFloatNode(1.5f, EbpMedium));
+        isYMajor = new TIntermBinary(EOpLessThan, l->deepCopy(), CreateFloatNode(3.5f, EbpMedium));
 
         TIntermSwizzle *dPdxX = new TIntermSwizzle(dPdx->deepCopy(), {0});
         TIntermSwizzle *dPdxY = new TIntermSwizzle(dPdx->deepCopy(), {1});
@@ -657,15 +658,17 @@
 
         // u = (1 + uc/|ma|) / 2
         // v = (1 + vc/|ma|) / 2
-        TIntermTyped *maTimesTwoRecip =
-            new TIntermBinary(EOpAssign, ma->deepCopy(),
-                              new TIntermBinary(EOpDiv, CreateFloatNode(0.5f), ma->deepCopy()));
+        TIntermTyped *maTimesTwoRecip = new TIntermBinary(
+            EOpAssign, ma->deepCopy(),
+            new TIntermBinary(EOpDiv, CreateFloatNode(0.5f, EbpMedium), ma->deepCopy()));
         body->appendStatement(maTimesTwoRecip);
 
-        TIntermTyped *ucDivMa     = new TIntermBinary(EOpMul, uc, ma->deepCopy());
-        TIntermTyped *vcDivMa     = new TIntermBinary(EOpMul, vc, ma->deepCopy());
-        TIntermTyped *uNormalized = new TIntermBinary(EOpAdd, CreateFloatNode(0.5f), ucDivMa);
-        TIntermTyped *vNormalized = new TIntermBinary(EOpAdd, CreateFloatNode(0.5f), vcDivMa);
+        TIntermTyped *ucDivMa = new TIntermBinary(EOpMul, uc, ma->deepCopy());
+        TIntermTyped *vcDivMa = new TIntermBinary(EOpMul, vc, ma->deepCopy());
+        TIntermTyped *uNormalized =
+            new TIntermBinary(EOpAdd, CreateFloatNode(0.5f, EbpMedium), ucDivMa);
+        TIntermTyped *vNormalized =
+            new TIntermBinary(EOpAdd, CreateFloatNode(0.5f, EbpMedium), vcDivMa);
 
         body->appendStatement(new TIntermBinary(EOpAssign, uc->deepCopy(), uNormalized));
         body->appendStatement(new TIntermBinary(EOpAssign, vc->deepCopy(), vNormalized));
@@ -712,7 +715,7 @@
                                                         TIntermTyped *dUVdx,
                                                         TIntermTyped *dUVdy)
     {
-        const TType *vec3Type = StaticType::GetBasic<EbtFloat, 3>();
+        const TType *vec3Type = StaticType::GetBasic<EbtFloat, EbpHigh, 3>();
         TIntermTyped *dPdx    = CreateZeroNode(*vec3Type);
         TIntermTyped *dPdy    = CreateZeroNode(*vec3Type);
         TIntermSequence args  = {P, dPdx, dPdy, dUVdx, dUVdy};
@@ -840,8 +843,8 @@
         TIntermSequence *arguments = node->getSequence();
         ASSERT(arguments->size() >= 2);
 
-        const TType *vec2Type = StaticType::GetBasic<EbtFloat, 2>();
-        const TType *vec3Type = StaticType::GetBasic<EbtFloat, 3>();
+        const TType *vec2Type = StaticType::GetBasic<EbtFloat, EbpHigh, 2>();
+        const TType *vec3Type = StaticType::GetBasic<EbtFloat, EbpHigh, 3>();
         TIntermSymbol *uvl    = new TIntermSymbol(CreateTempVariable(mSymbolTable, vec3Type));
         TIntermSymbol *dUVdx  = new TIntermSymbol(CreateTempVariable(mSymbolTable, vec2Type));
         TIntermSymbol *dUVdy  = new TIntermSymbol(CreateTempVariable(mSymbolTable, vec2Type));
@@ -893,7 +896,7 @@
         TIntermTyped *dUVdyArg = dUVdy;
         if (hasBias)
         {
-            const TType *floatType   = StaticType::GetBasic<EbtFloat>();
+            const TType *floatType   = StaticType::GetBasic<EbtFloat, EbpHigh>();
             TIntermTyped *bias       = (*arguments)[2]->getAsTyped()->deepCopy();
             TIntermSequence exp2Args = {bias};
             TIntermTyped *exp2Call =
@@ -951,12 +954,10 @@
     TIntermFunctionDefinition *mCoordTranslationFunctionImplicitDecl;
 };
 
-}  // anonymous namespace
-
-bool RewriteCubeMapSamplersAs2DArray(TCompiler *compiler,
-                                     TIntermBlock *root,
-                                     TSymbolTable *symbolTable,
-                                     bool isFragmentShader)
+bool RewriteCubeMapSamplersAs2DArrayImpl(TCompiler *compiler,
+                                         TIntermBlock *root,
+                                         TSymbolTable *symbolTable,
+                                         bool isFragmentShader)
 {
     RewriteCubeMapSamplersAs2DArrayTraverser traverser(symbolTable, isFragmentShader);
     root->traverse(&traverser);
@@ -979,8 +980,24 @@
         root->insertChildNodes(firstFunctionIndex,
                                TIntermSequence({coordTranslationFunctionDeclImplicit}));
     }
+    return true;
+}
+}  // anonymous namespace
 
-    return compiler->validateAST(root);
+bool RewriteCubeMapSamplersAs2DArray(TCompiler *compiler,
+                                     TIntermBlock *root,
+                                     TSymbolTable *symbolTable,
+                                     bool isFragmentShader)
+{
+    // This transformation adds function declarations after the fact and so some validation is
+    // momentarily disabled.
+    bool enableValidateFunctionCall = compiler->disableValidateFunctionCall();
+
+    bool result =
+        RewriteCubeMapSamplersAs2DArrayImpl(compiler, root, symbolTable, isFragmentShader);
+
+    compiler->restoreValidateFunctionCall(enableValidateFunctionCall);
+    return result && compiler->validateAST(root);
 }
 
 }  // namespace sh
diff --git a/src/compiler/translator/tree_ops/RewriteDfdy.cpp b/src/compiler/translator/tree_ops/RewriteDfdy.cpp
index fbecd2f..108e246 100644
--- a/src/compiler/translator/tree_ops/RewriteDfdy.cpp
+++ b/src/compiler/translator/tree_ops/RewriteDfdy.cpp
@@ -9,7 +9,6 @@
 #include "compiler/translator/tree_ops/RewriteDfdy.h"
 
 #include "common/angleutils.h"
-#include "compiler/translator/StaticType.h"
 #include "compiler/translator/SymbolTable.h"
 #include "compiler/translator/TranslatorVulkan.h"
 #include "compiler/translator/tree_util/DriverUniform.h"
@@ -148,7 +147,7 @@
 
         // Multiply halfRotationMat by ANGLEUniforms.flipXY and store in a temporary variable
         TIntermBinary *rotatedFlipXY = new TIntermBinary(EOpMul, flipXY, halfRotationMat);
-        const TType *vec2Type        = StaticType::GetTemporary<EbtFloat, 2>();
+        const TType *vec2Type        = &rotatedFlipXY->getType();
         TIntermSymbol *tmpRotFlipXY = new TIntermSymbol(CreateTempVariable(mSymbolTable, vec2Type));
         TIntermSequence tmpDecl;
         tmpDecl.push_back(CreateTempInitDeclarationNode(&tmpRotFlipXY->variable(), rotatedFlipXY));
diff --git a/src/compiler/translator/tree_ops/RewriteRowMajorMatrices.h b/src/compiler/translator/tree_ops/RewriteRowMajorMatrices.h
deleted file mode 100644
index 9988da4..0000000
--- a/src/compiler/translator/tree_ops/RewriteRowMajorMatrices.h
+++ /dev/null
@@ -1,26 +0,0 @@
-//
-// Copyright 2019 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-// RewriteRowMajorMatrices: Change row-major matrices to column-major in uniform and storage
-// buffers.
-
-#ifndef COMPILER_TRANSLATOR_TREEOPS_REWRITEROWMAJORMATRICES_H_
-#define COMPILER_TRANSLATOR_TREEOPS_REWRITEROWMAJORMATRICES_H_
-
-#include "common/angleutils.h"
-
-namespace sh
-{
-class TCompiler;
-class TIntermBlock;
-class TSymbolTable;
-
-ANGLE_NO_DISCARD bool RewriteRowMajorMatrices(TCompiler *compiler,
-                                              TIntermBlock *root,
-                                              TSymbolTable *symbolTable);
-
-}  // namespace sh
-
-#endif  // COMPILER_TRANSLATOR_TREEOPS_REWRITEROWMAJORMATRICES_H_
diff --git a/src/compiler/translator/tree_ops/RewriteStructSamplers.cpp b/src/compiler/translator/tree_ops/RewriteStructSamplers.cpp
index 970778c..219a6b3 100644
--- a/src/compiler/translator/tree_ops/RewriteStructSamplers.cpp
+++ b/src/compiler/translator/tree_ops/RewriteStructSamplers.cpp
@@ -133,7 +133,7 @@
     void visitSymbol(TIntermSymbol *node) override
     {
         // It's impossible to reach here with a symbol that needs replacement.
-        // MonomorphizeUnsupportedFunctionsInVulkanGLSL makes sure that whole structs containing
+        // MonomorphizeUnsupportedFunctions makes sure that whole structs containing
         // samplers are not passed to functions, so any instance of the struct uniform is
         // necessarily indexed right away.  visitBinary should have already taken care of it.
         ASSERT(mStructureUniformMap.find(&node->variable()) == mStructureUniformMap.end());
diff --git a/src/compiler/translator/tree_ops/RewriteStructSamplers.h b/src/compiler/translator/tree_ops/RewriteStructSamplers.h
index 00b8b6d..703145c 100644
--- a/src/compiler/translator/tree_ops/RewriteStructSamplers.h
+++ b/src/compiler/translator/tree_ops/RewriteStructSamplers.h
@@ -7,7 +7,7 @@
 //
 // This traverser is designed to strip out samplers from structs. It moves them into separate
 // uniform sampler declarations. This allows the struct to be stored in the default uniform block.
-// This transformation requires MonomorphizeUnsupportedFunctionsInVulkanGLSL to have been run so it
+// This transformation requires MonomorphizeUnsupportedFunctions to have been run so it
 // wouldn't need to deal with functions that are passed such structs.
 //
 // For example:
diff --git a/src/compiler/translator/tree_ops/ScalarizeVecAndMatConstructorArgs.cpp b/src/compiler/translator/tree_ops/ScalarizeVecAndMatConstructorArgs.cpp
index fa923c7..195ca53 100644
--- a/src/compiler/translator/tree_ops/ScalarizeVecAndMatConstructorArgs.cpp
+++ b/src/compiler/translator/tree_ops/ScalarizeVecAndMatConstructorArgs.cpp
@@ -19,6 +19,7 @@
 #include "compiler/translator/tree_util/IntermNodePatternMatcher.h"
 #include "compiler/translator/tree_util/IntermNode_util.h"
 #include "compiler/translator/tree_util/IntermTraverse.h"
+#include "compiler/translator/util.h"
 
 namespace sh
 {
@@ -26,12 +27,12 @@
 namespace
 {
 
-TIntermBinary *ConstructVectorIndexBinaryNode(TIntermSymbol *symbolNode, int index)
+TIntermBinary *ConstructVectorIndexBinaryNode(TIntermTyped *symbolNode, int index)
 {
     return new TIntermBinary(EOpIndexDirect, symbolNode, CreateIndexNode(index));
 }
 
-TIntermBinary *ConstructMatrixIndexBinaryNode(TIntermSymbol *symbolNode, int colIndex, int rowIndex)
+TIntermBinary *ConstructMatrixIndexBinaryNode(TIntermTyped *symbolNode, int colIndex, int rowIndex)
 {
     TIntermBinary *colVectorNode = ConstructVectorIndexBinaryNode(symbolNode, colIndex);
 
@@ -41,12 +42,8 @@
 class ScalarizeArgsTraverser : public TIntermTraverser
 {
   public:
-    ScalarizeArgsTraverser(sh::GLenum shaderType,
-                           bool fragmentPrecisionHigh,
-                           TSymbolTable *symbolTable)
+    ScalarizeArgsTraverser(TSymbolTable *symbolTable)
         : TIntermTraverser(true, false, false, symbolTable),
-          mShaderType(shaderType),
-          mFragmentPrecisionHigh(fragmentPrecisionHigh),
           mNodesToScalarize(IntermNodePatternMatcher::kScalarizedVecOrMatConstructor)
     {}
 
@@ -66,13 +63,10 @@
     //   vec4 v(1, s0[0][0], s0[0][1], s0[0][2]);
     // This function is to create nodes for "mat4 s0 = m;" and insert it to the code sequence. This
     // way the possible side effects of the constructor argument will only be evaluated once.
-    TVariable *createTempVariable(TIntermTyped *original);
+    TIntermTyped *createTempVariable(TIntermTyped *original);
 
     std::vector<TIntermSequence> mBlockStack;
 
-    sh::GLenum mShaderType;
-    bool mFragmentPrecisionHigh;
-
     IntermNodePatternMatcher mNodesToScalarize;
 };
 
@@ -129,10 +123,10 @@
         ASSERT(size > 0);
         TIntermTyped *originalArg = originalArgNode->getAsTyped();
         ASSERT(originalArg);
-        TVariable *argVariable = createTempVariable(originalArg);
+        TIntermTyped *argVariable = createTempVariable(originalArg);
         if (originalArg->isScalar())
         {
-            sequence->push_back(CreateTempSymbolNode(argVariable));
+            sequence->push_back(argVariable);
             size--;
         }
         else if (originalArg->isVector())
@@ -143,15 +137,14 @@
                 size -= repeat;
                 for (int index = 0; index < repeat; ++index)
                 {
-                    TIntermSymbol *symbolNode = CreateTempSymbolNode(argVariable);
-                    TIntermBinary *newNode    = ConstructVectorIndexBinaryNode(symbolNode, index);
+                    TIntermBinary *newNode =
+                        ConstructVectorIndexBinaryNode(argVariable->deepCopy(), index);
                     sequence->push_back(newNode);
                 }
             }
             else
             {
-                TIntermSymbol *symbolNode = CreateTempSymbolNode(argVariable);
-                sequence->push_back(symbolNode);
+                sequence->push_back(argVariable);
                 size -= originalArg->getNominalSize();
             }
         }
@@ -165,9 +158,8 @@
                 size -= repeat;
                 while (repeat > 0)
                 {
-                    TIntermSymbol *symbolNode = CreateTempSymbolNode(argVariable);
                     TIntermBinary *newNode =
-                        ConstructMatrixIndexBinaryNode(symbolNode, colIndex, rowIndex);
+                        ConstructMatrixIndexBinaryNode(argVariable->deepCopy(), colIndex, rowIndex);
                     sequence->push_back(newNode);
                     rowIndex++;
                     if (rowIndex >= originalArg->getRows())
@@ -180,27 +172,30 @@
             }
             else
             {
-                TIntermSymbol *symbolNode = CreateTempSymbolNode(argVariable);
-                sequence->push_back(symbolNode);
+                sequence->push_back(argVariable);
                 size -= originalArg->getCols() * originalArg->getRows();
             }
         }
     }
 }
 
-TVariable *ScalarizeArgsTraverser::createTempVariable(TIntermTyped *original)
+TIntermTyped *ScalarizeArgsTraverser::createTempVariable(TIntermTyped *original)
 {
     ASSERT(original);
 
     TType *type = new TType(original->getType());
     type->setQualifier(EvqTemporary);
-    if (mShaderType == GL_FRAGMENT_SHADER && type->getBasicType() == EbtFloat &&
-        type->getPrecision() == EbpUndefined)
+
+    // The precision of the constant must have been retained (or derived), which will now apply to
+    // the temp variable.  In some cases, the precision cannot be derived, so use the constant as
+    // is.  For example, in the following standalone statement, the precision of the constant 0
+    // cannot be determined:
+    //
+    //      mat2(0, bvec3(m));
+    //
+    if (IsPrecisionApplicableToType(type->getBasicType()) && type->getPrecision() == EbpUndefined)
     {
-        // We use the highest available precision for the temporary variable
-        // to avoid computing the actual precision using the rules defined
-        // in GLSL ES 1.0 Section 4.5.2.
-        type->setPrecision(mFragmentPrecisionHigh ? EbpHigh : EbpMedium);
+        return original;
     }
 
     TVariable *variable = CreateTempVariable(mSymbolTable, type);
@@ -210,18 +205,16 @@
     TIntermDeclaration *declaration = CreateTempInitDeclarationNode(variable, original);
     sequence.push_back(declaration);
 
-    return variable;
+    return CreateTempSymbolNode(variable);
 }
 
 }  // namespace
 
 bool ScalarizeVecAndMatConstructorArgs(TCompiler *compiler,
                                        TIntermBlock *root,
-                                       sh::GLenum shaderType,
-                                       bool fragmentPrecisionHigh,
                                        TSymbolTable *symbolTable)
 {
-    ScalarizeArgsTraverser scalarizer(shaderType, fragmentPrecisionHigh, symbolTable);
+    ScalarizeArgsTraverser scalarizer(symbolTable);
     root->traverse(&scalarizer);
 
     return compiler->validateAST(root);
diff --git a/src/compiler/translator/tree_ops/ScalarizeVecAndMatConstructorArgs.h b/src/compiler/translator/tree_ops/ScalarizeVecAndMatConstructorArgs.h
index 79495dd..0921218 100644
--- a/src/compiler/translator/tree_ops/ScalarizeVecAndMatConstructorArgs.h
+++ b/src/compiler/translator/tree_ops/ScalarizeVecAndMatConstructorArgs.h
@@ -22,8 +22,6 @@
 
 ANGLE_NO_DISCARD bool ScalarizeVecAndMatConstructorArgs(TCompiler *compiler,
                                                         TIntermBlock *root,
-                                                        sh::GLenum shaderType,
-                                                        bool fragmentPrecisionHigh,
                                                         TSymbolTable *symbolTable);
 }  // namespace sh
 
diff --git a/src/compiler/translator/tree_ops/SeparateDeclarations.cpp b/src/compiler/translator/tree_ops/SeparateDeclarations.cpp
index 0d7c80d..23e21c9 100644
--- a/src/compiler/translator/tree_ops/SeparateDeclarations.cpp
+++ b/src/compiler/translator/tree_ops/SeparateDeclarations.cpp
@@ -15,7 +15,9 @@
 
 #include "compiler/translator/tree_ops/SeparateDeclarations.h"
 
+#include "compiler/translator/SymbolTable.h"
 #include "compiler/translator/tree_util/IntermTraverse.h"
+#include "compiler/translator/tree_util/ReplaceVariable.h"
 
 namespace sh
 {
@@ -26,52 +28,172 @@
 class SeparateDeclarationsTraverser : private TIntermTraverser
 {
   public:
-    ANGLE_NO_DISCARD static bool apply(TCompiler *compiler, TIntermNode *root);
+    ANGLE_NO_DISCARD static bool apply(TCompiler *compiler,
+                                       TIntermNode *root,
+                                       TSymbolTable *symbolTable);
 
   private:
-    SeparateDeclarationsTraverser();
+    SeparateDeclarationsTraverser(TSymbolTable *symbolTable);
     bool visitDeclaration(Visit, TIntermDeclaration *node) override;
+    void visitSymbol(TIntermSymbol *symbol) override;
+
+    void separateDeclarator(TIntermSequence *sequence,
+                            size_t index,
+                            TIntermSequence *replacementDeclarations,
+                            const TStructure **replacementStructure);
+
+    VariableReplacementMap mVariableMap;
 };
 
-bool SeparateDeclarationsTraverser::apply(TCompiler *compiler, TIntermNode *root)
+bool SeparateDeclarationsTraverser::apply(TCompiler *compiler,
+                                          TIntermNode *root,
+                                          TSymbolTable *symbolTable)
 {
-    SeparateDeclarationsTraverser separateDecl;
+    SeparateDeclarationsTraverser separateDecl(symbolTable);
     root->traverse(&separateDecl);
     return separateDecl.updateTree(compiler, root);
 }
 
-SeparateDeclarationsTraverser::SeparateDeclarationsTraverser()
-    : TIntermTraverser(true, false, false)
+SeparateDeclarationsTraverser::SeparateDeclarationsTraverser(TSymbolTable *symbolTable)
+    : TIntermTraverser(true, false, false, symbolTable)
 {}
 
 bool SeparateDeclarationsTraverser::visitDeclaration(Visit, TIntermDeclaration *node)
 {
     TIntermSequence *sequence = node->getSequence();
-    if (sequence->size() > 1)
+    if (sequence->size() <= 1)
     {
-        TIntermBlock *parentBlock = getParentNode()->getAsBlock();
-        ASSERT(parentBlock != nullptr);
-
-        TIntermSequence replacementDeclarations;
-        for (size_t ii = 0; ii < sequence->size(); ++ii)
-        {
-            TIntermDeclaration *replacementDeclaration = new TIntermDeclaration();
-
-            replacementDeclaration->appendDeclarator(sequence->at(ii)->getAsTyped());
-            replacementDeclaration->setLine(sequence->at(ii)->getLine());
-            replacementDeclarations.push_back(replacementDeclaration);
-        }
-
-        mMultiReplacements.emplace_back(parentBlock, node, std::move(replacementDeclarations));
+        return true;
     }
+
+    TIntermBlock *parentBlock = getParentNode()->getAsBlock();
+    ASSERT(parentBlock != nullptr);
+
+    TIntermSequence replacementDeclarations;
+    const TStructure *replacementStructure = nullptr;
+    for (size_t ii = 0; ii < sequence->size(); ++ii)
+    {
+        separateDeclarator(sequence, ii, &replacementDeclarations, &replacementStructure);
+    }
+
+    mMultiReplacements.emplace_back(parentBlock, node, std::move(replacementDeclarations));
     return false;
 }
 
+void SeparateDeclarationsTraverser::visitSymbol(TIntermSymbol *symbol)
+{
+    const TVariable *variable = &symbol->variable();
+    if (mVariableMap.count(variable) > 0)
+    {
+        queueAccessChainReplacement(mVariableMap[variable]->deepCopy());
+    }
+}
+
+void SeparateDeclarationsTraverser::separateDeclarator(TIntermSequence *sequence,
+                                                       size_t index,
+                                                       TIntermSequence *replacementDeclarations,
+                                                       const TStructure **replacementStructure)
+{
+    TIntermTyped *declarator    = sequence->at(index)->getAsTyped();
+    const TType &declaratorType = declarator->getType();
+
+    // If the declaration is not simultaneously declaring a struct, can use the same declarator.
+    // Otherwise, the first declarator is taken as-is if the struct has a name.
+    const TStructure *structure  = declaratorType.getStruct();
+    const bool isStructSpecifier = declaratorType.isStructSpecifier();
+    if (!isStructSpecifier || (index == 0 && structure->symbolType() != SymbolType::Empty))
+    {
+        TIntermDeclaration *replacementDeclaration = new TIntermDeclaration;
+
+        // Make sure to update the declarator's initializers if any.
+        declarator->traverse(this);
+
+        replacementDeclaration->appendDeclarator(declarator);
+        replacementDeclaration->setLine(declarator->getLine());
+        replacementDeclarations->push_back(replacementDeclaration);
+        return;
+    }
+
+    // If the struct is nameless, split it out first.
+    if (structure->symbolType() == SymbolType::Empty)
+    {
+        if (*replacementStructure == nullptr)
+        {
+            TStructure *newStructure =
+                new TStructure(mSymbolTable, kEmptyImmutableString, &structure->fields(),
+                               SymbolType::AngleInternal);
+            newStructure->setAtGlobalScope(structure->atGlobalScope());
+            *replacementStructure = structure = newStructure;
+
+            TType *namedType = new TType(structure, true);
+            namedType->setQualifier(EvqGlobal);
+
+            TVariable *structVariable =
+                new TVariable(mSymbolTable, kEmptyImmutableString, namedType, SymbolType::Empty);
+
+            TIntermDeclaration *structDeclaration = new TIntermDeclaration;
+            structDeclaration->appendDeclarator(new TIntermSymbol(structVariable));
+            structDeclaration->setLine(declarator->getLine());
+            replacementDeclarations->push_back(structDeclaration);
+        }
+        else
+        {
+            structure = *replacementStructure;
+        }
+    }
+
+    // Redeclare the declarator but not as a struct specifier.
+    TIntermSymbol *asSymbol   = declarator->getAsSymbolNode();
+    TIntermTyped *initializer = nullptr;
+    if (asSymbol == nullptr)
+    {
+        TIntermBinary *asBinary = declarator->getAsBinaryNode();
+        ASSERT(asBinary->getOp() == EOpInitialize);
+        asSymbol    = asBinary->getLeft()->getAsSymbolNode();
+        initializer = asBinary->getRight();
+
+        // Make sure the initializer itself has its variables replaced if necessary.
+        if (initializer->getAsSymbolNode())
+        {
+            const TVariable *initializerVariable = &initializer->getAsSymbolNode()->variable();
+            if (mVariableMap.count(initializerVariable) > 0)
+            {
+                initializer = mVariableMap[initializerVariable]->deepCopy();
+            }
+        }
+        else
+        {
+            initializer->traverse(this);
+        }
+    }
+
+    ASSERT(asSymbol && asSymbol->variable().symbolType() != SymbolType::Empty);
+
+    TType *newType = new TType(structure, false);
+    newType->setQualifier(asSymbol->getType().getQualifier());
+    newType->makeArrays(asSymbol->getType().getArraySizes());
+
+    TVariable *replacementVar        = new TVariable(mSymbolTable, asSymbol->getName(), newType,
+                                              asSymbol->variable().symbolType());
+    TIntermSymbol *replacementSymbol = new TIntermSymbol(replacementVar);
+    TIntermTyped *replacement        = replacementSymbol;
+    if (initializer)
+    {
+        replacement = new TIntermBinary(EOpInitialize, replacement, initializer);
+    }
+
+    TIntermDeclaration *replacementDeclaration = new TIntermDeclaration;
+    replacementDeclaration->appendDeclarator(replacement);
+    replacementDeclaration->setLine(declarator->getLine());
+    replacementDeclarations->push_back(replacementDeclaration);
+
+    mVariableMap[&asSymbol->variable()] = replacementSymbol;
+}
 }  // namespace
 
-bool SeparateDeclarations(TCompiler *compiler, TIntermNode *root)
+bool SeparateDeclarations(TCompiler *compiler, TIntermNode *root, TSymbolTable *symbolTable)
 {
-    return SeparateDeclarationsTraverser::apply(compiler, root);
+    return SeparateDeclarationsTraverser::apply(compiler, root, symbolTable);
 }
 
 }  // namespace sh
diff --git a/src/compiler/translator/tree_ops/SeparateDeclarations.h b/src/compiler/translator/tree_ops/SeparateDeclarations.h
index 5376525..659ebbf 100644
--- a/src/compiler/translator/tree_ops/SeparateDeclarations.h
+++ b/src/compiler/translator/tree_ops/SeparateDeclarations.h
@@ -22,8 +22,11 @@
 {
 class TCompiler;
 class TIntermNode;
+class TSymbolTable;
 
-ANGLE_NO_DISCARD bool SeparateDeclarations(TCompiler *compiler, TIntermNode *root);
+ANGLE_NO_DISCARD bool SeparateDeclarations(TCompiler *compiler,
+                                           TIntermNode *root,
+                                           TSymbolTable *symbolTable);
 }  // namespace sh
 
 #endif  // COMPILER_TRANSLATOR_TREEOPS_SEPARATEDECLARATIONS_H_
diff --git a/src/compiler/translator/tree_ops/vulkan/SeparateStructFromUniformDeclarations.cpp b/src/compiler/translator/tree_ops/SeparateStructFromUniformDeclarations.cpp
similarity index 97%
rename from src/compiler/translator/tree_ops/vulkan/SeparateStructFromUniformDeclarations.cpp
rename to src/compiler/translator/tree_ops/SeparateStructFromUniformDeclarations.cpp
index 1f95a9b..50e1f84 100644
--- a/src/compiler/translator/tree_ops/vulkan/SeparateStructFromUniformDeclarations.cpp
+++ b/src/compiler/translator/tree_ops/SeparateStructFromUniformDeclarations.cpp
@@ -6,7 +6,7 @@
 // SeparateStructFromUniformDeclarations: Separate struct declarations from uniform declarations.
 //
 
-#include "compiler/translator/tree_ops/vulkan/SeparateStructFromUniformDeclarations.h"
+#include "compiler/translator/tree_ops/SeparateStructFromUniformDeclarations.h"
 
 #include "compiler/translator/SymbolTable.h"
 #include "compiler/translator/tree_util/IntermTraverse.h"
diff --git a/src/compiler/translator/tree_ops/vulkan/SeparateStructFromUniformDeclarations.h b/src/compiler/translator/tree_ops/SeparateStructFromUniformDeclarations.h
similarity index 78%
rename from src/compiler/translator/tree_ops/vulkan/SeparateStructFromUniformDeclarations.h
rename to src/compiler/translator/tree_ops/SeparateStructFromUniformDeclarations.h
index f4a6276..e6e76e3 100644
--- a/src/compiler/translator/tree_ops/vulkan/SeparateStructFromUniformDeclarations.h
+++ b/src/compiler/translator/tree_ops/SeparateStructFromUniformDeclarations.h
@@ -20,8 +20,8 @@
 //
 //
 
-#ifndef COMPILER_TRANSLATOR_TREEOPS_VULKAN_SEPARATESTRUCTFROMUNIFORMDECLARATIONS_H_
-#define COMPILER_TRANSLATOR_TREEOPS_VULKAN_SEPARATESTRUCTFROMUNIFORMDECLARATIONS_H_
+#ifndef COMPILER_TRANSLATOR_TREEOPS_SEPARATESTRUCTFROMUNIFORMDECLARATIONS_H_
+#define COMPILER_TRANSLATOR_TREEOPS_SEPARATESTRUCTFROMUNIFORMDECLARATIONS_H_
 
 #include "common/angleutils.h"
 
@@ -36,4 +36,4 @@
                                                             TSymbolTable *symbolTable);
 }  // namespace sh
 
-#endif  // COMPILER_TRANSLATOR_TREEOPS_VULKAN_SEPARATESTRUCTFROMUNIFORMDECLARATIONS_H_
+#endif  // COMPILER_TRANSLATOR_TREEOPS_SEPARATESTRUCTFROMUNIFORMDECLARATIONS_H_
diff --git a/src/compiler/translator/tree_ops/gl/mac/AddAndTrueToLoopCondition.cpp b/src/compiler/translator/tree_ops/apple/AddAndTrueToLoopCondition.cpp
similarity index 95%
rename from src/compiler/translator/tree_ops/gl/mac/AddAndTrueToLoopCondition.cpp
rename to src/compiler/translator/tree_ops/apple/AddAndTrueToLoopCondition.cpp
index c3a81d0..36e426f 100644
--- a/src/compiler/translator/tree_ops/gl/mac/AddAndTrueToLoopCondition.cpp
+++ b/src/compiler/translator/tree_ops/apple/AddAndTrueToLoopCondition.cpp
@@ -4,7 +4,7 @@
 // found in the LICENSE file.
 //
 
-#include "compiler/translator/tree_ops/gl/mac/AddAndTrueToLoopCondition.h"
+#include "compiler/translator/tree_ops/apple/AddAndTrueToLoopCondition.h"
 
 #include "compiler/translator/Compiler.h"
 #include "compiler/translator/tree_util/IntermNode_util.h"
diff --git a/src/compiler/translator/tree_ops/gl/mac/AddAndTrueToLoopCondition.h b/src/compiler/translator/tree_ops/apple/AddAndTrueToLoopCondition.h
similarity index 67%
rename from src/compiler/translator/tree_ops/gl/mac/AddAndTrueToLoopCondition.h
rename to src/compiler/translator/tree_ops/apple/AddAndTrueToLoopCondition.h
index a932c4b..4a48c89 100644
--- a/src/compiler/translator/tree_ops/gl/mac/AddAndTrueToLoopCondition.h
+++ b/src/compiler/translator/tree_ops/apple/AddAndTrueToLoopCondition.h
@@ -6,8 +6,8 @@
 
 // Rewrite condition in for and while loops to work around driver bug on Intel Mac.
 
-#ifndef COMPILER_TRANSLATOR_TREEOPS_GL_MAC_ADDANDTRUETOLOOPCONDITION_H_
-#define COMPILER_TRANSLATOR_TREEOPS_GL_MAC_ADDANDTRUETOLOOPCONDITION_H_
+#ifndef COMPILER_TRANSLATOR_TREEOPS_APPLE_ADDANDTRUETOLOOPCONDITION_H_
+#define COMPILER_TRANSLATOR_TREEOPS_APPLE_ADDANDTRUETOLOOPCONDITION_H_
 
 #include "common/angleutils.h"
 
@@ -16,7 +16,7 @@
 class TCompiler;
 class TIntermNode;
 
-#if defined(ANGLE_ENABLE_GLSL) && defined(ANGLE_PLATFORM_APPLE)
+#if defined(ANGLE_ENABLE_GLSL) && defined(ANGLE_ENABLE_APPLE_WORKAROUNDS)
 ANGLE_NO_DISCARD bool AddAndTrueToLoopCondition(TCompiler *compiler, TIntermNode *root);
 #else
 ANGLE_NO_DISCARD ANGLE_INLINE bool AddAndTrueToLoopCondition(TCompiler *compiler, TIntermNode *root)
@@ -28,4 +28,4 @@
 
 }  // namespace sh
 
-#endif  // COMPILER_TRANSLATOR_TREEOPS_GL_MAC_ADDANDTRUETOLOOPCONDITION_H_
+#endif  // COMPILER_TRANSLATOR_TREEOPS_APPLE_ADDANDTRUETOLOOPCONDITION_H_
diff --git a/src/compiler/translator/tree_ops/gl/mac/RewriteDoWhile.cpp b/src/compiler/translator/tree_ops/apple/RewriteDoWhile.cpp
similarity index 98%
rename from src/compiler/translator/tree_ops/gl/mac/RewriteDoWhile.cpp
rename to src/compiler/translator/tree_ops/apple/RewriteDoWhile.cpp
index 79d045c..de322aa 100644
--- a/src/compiler/translator/tree_ops/gl/mac/RewriteDoWhile.cpp
+++ b/src/compiler/translator/tree_ops/apple/RewriteDoWhile.cpp
@@ -7,7 +7,7 @@
 // RewriteDoWhile.cpp: rewrites do-while loops using another equivalent
 // construct.
 
-#include "compiler/translator/tree_ops/gl/mac/RewriteDoWhile.h"
+#include "compiler/translator/tree_ops/apple/RewriteDoWhile.h"
 
 #include "compiler/translator/Compiler.h"
 #include "compiler/translator/StaticType.h"
diff --git a/src/compiler/translator/tree_ops/gl/mac/RewriteDoWhile.h b/src/compiler/translator/tree_ops/apple/RewriteDoWhile.h
similarity index 76%
rename from src/compiler/translator/tree_ops/gl/mac/RewriteDoWhile.h
rename to src/compiler/translator/tree_ops/apple/RewriteDoWhile.h
index a5641b5..356cc8c 100644
--- a/src/compiler/translator/tree_ops/gl/mac/RewriteDoWhile.h
+++ b/src/compiler/translator/tree_ops/apple/RewriteDoWhile.h
@@ -7,8 +7,8 @@
 // RewriteDoWhile.h: rewrite do-while loops as while loops to work around
 // driver bugs
 
-#ifndef COMPILER_TRANSLATOR_TREEOPS_GL_MAC_REWRITEDOWHILE_H_
-#define COMPILER_TRANSLATOR_TREEOPS_GL_MAC_REWRITEDOWHILE_H_
+#ifndef COMPILER_TRANSLATOR_TREEOPS_APPLE_REWRITEDOWHILE_H_
+#define COMPILER_TRANSLATOR_TREEOPS_APPLE_REWRITEDOWHILE_H_
 
 #include "common/angleutils.h"
 
@@ -19,7 +19,7 @@
 class TIntermNode;
 class TSymbolTable;
 
-#if defined(ANGLE_ENABLE_GLSL) && defined(ANGLE_PLATFORM_APPLE)
+#if defined(ANGLE_ENABLE_GLSL) && defined(ANGLE_ENABLE_APPLE_WORKAROUNDS)
 ANGLE_NO_DISCARD bool RewriteDoWhile(TCompiler *compiler,
                                      TIntermNode *root,
                                      TSymbolTable *symbolTable);
@@ -35,4 +35,4 @@
 
 }  // namespace sh
 
-#endif  // COMPILER_TRANSLATOR_TREEOPS_GL_MAC_REWRITEDOWHILE_H_
+#endif  // COMPILER_TRANSLATOR_TREEOPS_APPLE_REWRITEDOWHILE_H_
diff --git a/src/compiler/translator/tree_ops/RewriteRowMajorMatrices.cpp b/src/compiler/translator/tree_ops/apple/RewriteRowMajorMatrices.cpp
similarity index 99%
rename from src/compiler/translator/tree_ops/RewriteRowMajorMatrices.cpp
rename to src/compiler/translator/tree_ops/apple/RewriteRowMajorMatrices.cpp
index 046cd67..466753e 100644
--- a/src/compiler/translator/tree_ops/RewriteRowMajorMatrices.cpp
+++ b/src/compiler/translator/tree_ops/apple/RewriteRowMajorMatrices.cpp
@@ -6,7 +6,7 @@
 // RewriteRowMajorMatrices: Rewrite row-major matrices as column-major.
 //
 
-#include "compiler/translator/tree_ops/RewriteRowMajorMatrices.h"
+#include "compiler/translator/tree_ops/apple/RewriteRowMajorMatrices.h"
 
 #include "compiler/translator/Compiler.h"
 #include "compiler/translator/ImmutableStringBuilder.h"
@@ -713,8 +713,8 @@
         // a name autogenerated similar to temp variables, as nameless structs exist.  A fake
         // variable is created for the sole purpose of generating a temp name.
         TVariable *newStructTypeName =
-            new TVariable(mSymbolTable, kEmptyImmutableString, StaticType::GetBasic<EbtUInt>(),
-                          SymbolType::Empty);
+            new TVariable(mSymbolTable, kEmptyImmutableString,
+                          StaticType::GetBasic<EbtUInt, EbpUndefined>(), SymbolType::Empty);
 
         TStructure *newStruct = new TStructure(mSymbolTable, newStructTypeName->name(), newFields,
                                                SymbolType::AngleInternal);
@@ -785,7 +785,7 @@
             {
                 if ((*arguments)[argIndex] == expression)
                 {
-                    TQualifier qualifier = EvqIn;
+                    TQualifier qualifier = EvqParamIn;
 
                     // If the aggregate is not a function call, it's a constructor, and so every
                     // argument is an input.
@@ -796,8 +796,8 @@
                         qualifier              = param->getType().getQualifier();
                     }
 
-                    *isReadOut  = qualifier != EvqOut;
-                    *isWriteOut = qualifier == EvqOut || qualifier == EvqInOut;
+                    *isReadOut  = qualifier != EvqParamOut;
+                    *isWriteOut = qualifier == EvqParamOut || qualifier == EvqParamInOut;
                     break;
                 }
             }
diff --git a/src/compiler/translator/tree_ops/apple/RewriteRowMajorMatrices.h b/src/compiler/translator/tree_ops/apple/RewriteRowMajorMatrices.h
new file mode 100644
index 0000000..02f8784
--- /dev/null
+++ b/src/compiler/translator/tree_ops/apple/RewriteRowMajorMatrices.h
@@ -0,0 +1,37 @@
+//
+// 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.
+//
+// RewriteRowMajorMatrices: Change row-major matrices to column-major in uniform and storage
+// buffers.
+
+#ifndef COMPILER_TRANSLATOR_TREEOPS_APPLE_REWRITEROWMAJORMATRICES_H_
+#define COMPILER_TRANSLATOR_TREEOPS_APPLE_REWRITEROWMAJORMATRICES_H_
+
+#include "common/angleutils.h"
+
+namespace sh
+{
+class TCompiler;
+class TIntermBlock;
+class TSymbolTable;
+
+#if (defined(ANGLE_ENABLE_GLSL) || defined(ANGLE_ENABLE_METAL)) && \
+    defined(ANGLE_ENABLE_APPLE_WORKAROUNDS)
+ANGLE_NO_DISCARD bool RewriteRowMajorMatrices(TCompiler *compiler,
+                                              TIntermBlock *root,
+                                              TSymbolTable *symbolTable);
+#else
+ANGLE_NO_DISCARD ANGLE_INLINE bool RewriteRowMajorMatrices(TCompiler *compiler,
+                                                           TIntermBlock *root,
+                                                           TSymbolTable *symbolTable)
+{
+    UNREACHABLE();
+    return false;
+}
+#endif
+
+}  // namespace sh
+
+#endif  // COMPILER_TRANSLATOR_TREEOPS_APPLE_REWRITEROWMAJORMATRICES_H_
diff --git a/src/compiler/translator/tree_ops/gl/mac/RewriteUnaryMinusOperatorFloat.cpp b/src/compiler/translator/tree_ops/apple/RewriteUnaryMinusOperatorFloat.cpp
similarity index 95%
rename from src/compiler/translator/tree_ops/gl/mac/RewriteUnaryMinusOperatorFloat.cpp
rename to src/compiler/translator/tree_ops/apple/RewriteUnaryMinusOperatorFloat.cpp
index ce1cc73..2847fce 100644
--- a/src/compiler/translator/tree_ops/gl/mac/RewriteUnaryMinusOperatorFloat.cpp
+++ b/src/compiler/translator/tree_ops/apple/RewriteUnaryMinusOperatorFloat.cpp
@@ -4,7 +4,7 @@
 // found in the LICENSE file.
 //
 
-#include "compiler/translator/tree_ops/gl/mac/RewriteUnaryMinusOperatorFloat.h"
+#include "compiler/translator/tree_ops/apple/RewriteUnaryMinusOperatorFloat.h"
 
 #include "compiler/translator/tree_util/IntermNode_util.h"
 #include "compiler/translator/tree_util/IntermTraverse.h"
diff --git a/src/compiler/translator/tree_ops/gl/mac/RewriteUnaryMinusOperatorFloat.h b/src/compiler/translator/tree_ops/apple/RewriteUnaryMinusOperatorFloat.h
similarity index 70%
rename from src/compiler/translator/tree_ops/gl/mac/RewriteUnaryMinusOperatorFloat.h
rename to src/compiler/translator/tree_ops/apple/RewriteUnaryMinusOperatorFloat.h
index 5a34b52..6d70d46 100644
--- a/src/compiler/translator/tree_ops/gl/mac/RewriteUnaryMinusOperatorFloat.h
+++ b/src/compiler/translator/tree_ops/apple/RewriteUnaryMinusOperatorFloat.h
@@ -5,8 +5,8 @@
 // Rewrite "-float" to "0.0 - float" to work around unary minus operator on float issue on Intel Mac
 // OSX 10.11.
 
-#ifndef COMPILER_TRANSLATOR_TREEOPS_GL_MAC_REWRITEUNARYMINUSOPERATORFLOAT_H_
-#define COMPILER_TRANSLATOR_TREEOPS_GL_MAC_REWRITEUNARYMINUSOPERATORFLOAT_H_
+#ifndef COMPILER_TRANSLATOR_TREEOPS_APPLE_REWRITEUNARYMINUSOPERATORFLOAT_H_
+#define COMPILER_TRANSLATOR_TREEOPS_APPLE_REWRITEUNARYMINUSOPERATORFLOAT_H_
 
 #include "common/angleutils.h"
 
@@ -15,7 +15,7 @@
 class TCompiler;
 class TIntermNode;
 
-#if defined(ANGLE_ENABLE_GLSL) && defined(ANGLE_PLATFORM_APPLE)
+#if defined(ANGLE_ENABLE_GLSL) && defined(ANGLE_ENABLE_APPLE_WORKAROUNDS)
 ANGLE_NO_DISCARD bool RewriteUnaryMinusOperatorFloat(TCompiler *compiler, TIntermNode *root);
 #else
 ANGLE_NO_DISCARD ANGLE_INLINE bool RewriteUnaryMinusOperatorFloat(TCompiler *compiler,
@@ -28,4 +28,4 @@
 
 }  // namespace sh
 
-#endif  // COMPILER_TRANSLATOR_TREEOPS_GL_MAC_REWRITEUNARYMINUSOPERATORFLOAT_H_
+#endif  // COMPILER_TRANSLATOR_TREEOPS_APPLE_REWRITEUNARYMINUSOPERATORFLOAT_H_
diff --git a/src/compiler/translator/tree_ops/gl/mac/UnfoldShortCircuitAST.cpp b/src/compiler/translator/tree_ops/apple/UnfoldShortCircuitAST.cpp
similarity index 96%
rename from src/compiler/translator/tree_ops/gl/mac/UnfoldShortCircuitAST.cpp
rename to src/compiler/translator/tree_ops/apple/UnfoldShortCircuitAST.cpp
index a0d5556..55e2f8b 100644
--- a/src/compiler/translator/tree_ops/gl/mac/UnfoldShortCircuitAST.cpp
+++ b/src/compiler/translator/tree_ops/apple/UnfoldShortCircuitAST.cpp
@@ -4,7 +4,7 @@
 // found in the LICENSE file.
 //
 
-#include "compiler/translator/tree_ops/gl/mac/UnfoldShortCircuitAST.h"
+#include "compiler/translator/tree_ops/apple/UnfoldShortCircuitAST.h"
 
 #include "compiler/translator/IntermNode.h"
 #include "compiler/translator/tree_util/IntermNode_util.h"
diff --git a/src/compiler/translator/tree_ops/gl/mac/UnfoldShortCircuitAST.h b/src/compiler/translator/tree_ops/apple/UnfoldShortCircuitAST.h
similarity index 69%
rename from src/compiler/translator/tree_ops/gl/mac/UnfoldShortCircuitAST.h
rename to src/compiler/translator/tree_ops/apple/UnfoldShortCircuitAST.h
index c458f1a..ad3cc08 100644
--- a/src/compiler/translator/tree_ops/gl/mac/UnfoldShortCircuitAST.h
+++ b/src/compiler/translator/tree_ops/apple/UnfoldShortCircuitAST.h
@@ -7,8 +7,8 @@
 // operations with ternary operations.
 //
 
-#ifndef COMPILER_TRANSLATOR_TREEOPS_GL_MAC_UNFOLDSHORTCIRCUITAST_H_
-#define COMPILER_TRANSLATOR_TREEOPS_GL_MAC_UNFOLDSHORTCIRCUITAST_H_
+#ifndef COMPILER_TRANSLATOR_TREEOPS_APPLE_UNFOLDSHORTCIRCUITAST_H_
+#define COMPILER_TRANSLATOR_TREEOPS_APPLE_UNFOLDSHORTCIRCUITAST_H_
 
 #include "common/angleutils.h"
 
@@ -18,7 +18,7 @@
 class TCompiler;
 class TIntermBlock;
 
-#if defined(ANGLE_ENABLE_GLSL) && defined(ANGLE_PLATFORM_APPLE)
+#if defined(ANGLE_ENABLE_GLSL) && defined(ANGLE_ENABLE_APPLE_WORKAROUNDS)
 ANGLE_NO_DISCARD bool UnfoldShortCircuitAST(TCompiler *compiler, TIntermBlock *root);
 #else
 ANGLE_NO_DISCARD ANGLE_INLINE bool UnfoldShortCircuitAST(TCompiler *compiler, TIntermBlock *root)
@@ -30,4 +30,4 @@
 
 }  // namespace sh
 
-#endif  // COMPILER_TRANSLATOR_TREEOPS_GL_MAC_UNFOLDSHORTCIRCUITAST_H_
+#endif  // COMPILER_TRANSLATOR_TREEOPS_APPLE_UNFOLDSHORTCIRCUITAST_H_
diff --git a/src/compiler/translator/tree_ops/d3d/ArrayReturnValueToOutParameter.cpp b/src/compiler/translator/tree_ops/d3d/ArrayReturnValueToOutParameter.cpp
index a8e6300..a5e0b62 100644
--- a/src/compiler/translator/tree_ops/d3d/ArrayReturnValueToOutParameter.cpp
+++ b/src/compiler/translator/tree_ops/d3d/ArrayReturnValueToOutParameter.cpp
@@ -114,14 +114,14 @@
         if (mChangedFunctions.find(functionId.get()) == mChangedFunctions.end())
         {
             TType *returnValueVariableType = new TType(node->getType());
-            returnValueVariableType->setQualifier(EvqOut);
+            returnValueVariableType->setQualifier(EvqParamOut);
             ChangedFunction changedFunction;
             changedFunction.returnValueVariable =
                 new TVariable(mSymbolTable, kReturnValueVariableName, returnValueVariableType,
                               SymbolType::AngleInternal);
             TFunction *func = new TFunction(mSymbolTable, node->getFunction()->name(),
                                             node->getFunction()->symbolType(),
-                                            StaticType::GetBasic<EbtVoid>(), false);
+                                            StaticType::GetBasic<EbtVoid, EbpUndefined>(), false);
             for (size_t i = 0; i < node->getFunction()->getParamCount(); ++i)
             {
                 func->addParameter(node->getFunction()->getParam(i));
diff --git a/src/compiler/translator/tree_ops/d3d/RewriteExpressionsWithShaderStorageBlock.cpp b/src/compiler/translator/tree_ops/d3d/RewriteExpressionsWithShaderStorageBlock.cpp
index 4a7bc5f..709f394 100644
--- a/src/compiler/translator/tree_ops/d3d/RewriteExpressionsWithShaderStorageBlock.cpp
+++ b/src/compiler/translator/tree_ops/d3d/RewriteExpressionsWithShaderStorageBlock.cpp
@@ -295,7 +295,7 @@
             if (node->getFunction() != nullptr)
             {
                 TQualifier qual = node->getFunction()->getParam(i)->getType().getQualifier();
-                if (qual == EvqInOut || qual == EvqOut)
+                if (qual == EvqParamInOut || qual == EvqParamOut)
                 {
                     TIntermBinary *readBackToSSBO = new TIntermBinary(
                         EOpAssign, ssboArgument->deepCopy(), argumentCopy->deepCopy());
diff --git a/src/compiler/translator/tree_ops/d3d/RewriteUnaryMinusOperatorInt.cpp b/src/compiler/translator/tree_ops/d3d/RewriteUnaryMinusOperatorInt.cpp
index 1b122bb..ef45d9c 100644
--- a/src/compiler/translator/tree_ops/d3d/RewriteUnaryMinusOperatorInt.cpp
+++ b/src/compiler/translator/tree_ops/d3d/RewriteUnaryMinusOperatorInt.cpp
@@ -91,8 +91,10 @@
     {
         one->setUConst(1u);
     }
-    TIntermConstantUnion *oneNode =
-        new TIntermConstantUnion(one, TType(opr->getBasicType(), opr->getPrecision(), EvqConst));
+    TType *oneType = new TType(opr->getType());
+    oneType->setQualifier(EvqConst);
+
+    TIntermConstantUnion *oneNode = new TIntermConstantUnion(one, *oneType);
     oneNode->setLine(opr->getLine());
 
     // ~(int) + 1
diff --git a/src/compiler/translator/tree_ops/gl/RecordConstantPrecision.cpp b/src/compiler/translator/tree_ops/gl/RecordConstantPrecision.cpp
deleted file mode 100644
index 434fc0e..0000000
--- a/src/compiler/translator/tree_ops/gl/RecordConstantPrecision.cpp
+++ /dev/null
@@ -1,174 +0,0 @@
-//
-// Copyright 2002 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.
-//
-// During parsing, all constant expressions are folded to constant union nodes. The expressions that
-// have been folded may have had precision qualifiers, which should affect the precision of the
-// consuming operation. If the folded constant union nodes are written to output as such they won't
-// have any precision qualifiers, and their effect on the precision of the consuming operation is
-// lost.
-//
-// RecordConstantPrecision is an AST traverser that inspects the precision qualifiers of constants
-// and hoists the constants outside the containing expression as precision qualified named variables
-// in case that is required for correct precision propagation.
-//
-
-#include "compiler/translator/tree_ops/gl/RecordConstantPrecision.h"
-
-#include "compiler/translator/InfoSink.h"
-#include "compiler/translator/tree_util/IntermNode_util.h"
-#include "compiler/translator/tree_util/IntermTraverse.h"
-
-namespace sh
-{
-
-namespace
-{
-
-class RecordConstantPrecisionTraverser : public TIntermTraverser
-{
-  public:
-    RecordConstantPrecisionTraverser(TSymbolTable *symbolTable);
-
-    void visitConstantUnion(TIntermConstantUnion *node) override;
-
-    void nextIteration();
-
-    bool foundHigherPrecisionConstant() const { return mFoundHigherPrecisionConstant; }
-
-  protected:
-    bool operandAffectsParentOperationPrecision(TIntermTyped *operand);
-
-    bool mFoundHigherPrecisionConstant;
-};
-
-RecordConstantPrecisionTraverser::RecordConstantPrecisionTraverser(TSymbolTable *symbolTable)
-    : TIntermTraverser(true, false, true, symbolTable), mFoundHigherPrecisionConstant(false)
-{}
-
-bool RecordConstantPrecisionTraverser::operandAffectsParentOperationPrecision(TIntermTyped *operand)
-{
-    if (getParentNode()->getAsCaseNode() || getParentNode()->getAsBlock())
-    {
-        return false;
-    }
-
-    const TIntermBinary *parentAsBinary = getParentNode()->getAsBinaryNode();
-    if (parentAsBinary != nullptr)
-    {
-        // If the constant is assigned or is used to initialize a variable, or if it's an index,
-        // its precision has no effect.
-        switch (parentAsBinary->getOp())
-        {
-            case EOpInitialize:
-            case EOpAssign:
-            case EOpIndexDirect:
-            case EOpIndexDirectStruct:
-            case EOpIndexDirectInterfaceBlock:
-            case EOpIndexIndirect:
-                return false;
-            default:
-                break;
-        }
-
-        TIntermTyped *otherOperand = parentAsBinary->getRight();
-        if (otherOperand == operand)
-        {
-            otherOperand = parentAsBinary->getLeft();
-        }
-        // If the precision of the other child is at least as high as the precision of the constant,
-        // the precision of the constant has no effect.
-        if (otherOperand->getAsConstantUnion() == nullptr &&
-            otherOperand->getPrecision() >= operand->getPrecision())
-        {
-            return false;
-        }
-    }
-
-    TIntermAggregate *parentAsAggregate = getParentNode()->getAsAggregate();
-    if (parentAsAggregate != nullptr)
-    {
-        if (!parentAsAggregate->gotPrecisionFromChildren())
-        {
-            // This can be either:
-            // * a call to an user-defined function
-            // * a call to a texture function
-            // * some other kind of aggregate
-            // In any of these cases the constant precision has no effect.
-            return false;
-        }
-        if (parentAsAggregate->isConstructor() && parentAsAggregate->getBasicType() == EbtBool)
-        {
-            return false;
-        }
-        // If the precision of operands does affect the result, but the precision of any of the
-        // other children has a precision that's at least as high as the precision of the constant,
-        // the precision of the constant has no effect.
-        TIntermSequence *parameters = parentAsAggregate->getSequence();
-        for (TIntermNode *parameter : *parameters)
-        {
-            const TIntermTyped *typedParameter = parameter->getAsTyped();
-            if (parameter != operand && typedParameter != nullptr &&
-                parameter->getAsConstantUnion() == nullptr &&
-                typedParameter->getPrecision() >= operand->getPrecision())
-            {
-                return false;
-            }
-        }
-    }
-    return true;
-}
-
-void RecordConstantPrecisionTraverser::visitConstantUnion(TIntermConstantUnion *node)
-{
-    if (mFoundHigherPrecisionConstant)
-        return;
-
-    // If the constant has lowp or undefined precision, it can't increase the precision of consuming
-    // operations.
-    if (node->getPrecision() < EbpMedium)
-        return;
-
-    // It's possible the node has no effect on the precision of the consuming expression, depending
-    // on the consuming expression, and the precision of the other parameters of the expression.
-    if (!operandAffectsParentOperationPrecision(node))
-        return;
-
-    // Make the constant a precision-qualified named variable to make sure it affects the precision
-    // of the consuming expression.
-    TIntermDeclaration *variableDeclaration = nullptr;
-    TVariable *variable = DeclareTempVariable(mSymbolTable, node, EvqConst, &variableDeclaration);
-    insertStatementInParentBlock(variableDeclaration);
-    queueReplacement(CreateTempSymbolNode(variable), OriginalNode::IS_DROPPED);
-    mFoundHigherPrecisionConstant = true;
-}
-
-void RecordConstantPrecisionTraverser::nextIteration()
-{
-    mFoundHigherPrecisionConstant = false;
-}
-
-}  // namespace
-
-bool RecordConstantPrecision(TCompiler *compiler, TIntermNode *root, TSymbolTable *symbolTable)
-{
-    RecordConstantPrecisionTraverser traverser(symbolTable);
-    // Iterate as necessary, and reset the traverser between iterations.
-    do
-    {
-        traverser.nextIteration();
-        root->traverse(&traverser);
-        if (traverser.foundHigherPrecisionConstant())
-        {
-            if (!traverser.updateTree(compiler, root))
-            {
-                return false;
-            }
-        }
-    } while (traverser.foundHigherPrecisionConstant());
-
-    return true;
-}
-
-}  // namespace sh
diff --git a/src/compiler/translator/tree_ops/gl/VectorizeVectorScalarArithmetic.cpp b/src/compiler/translator/tree_ops/gl/VectorizeVectorScalarArithmetic.cpp
deleted file mode 100644
index 7a19c98..0000000
--- a/src/compiler/translator/tree_ops/gl/VectorizeVectorScalarArithmetic.cpp
+++ /dev/null
@@ -1,294 +0,0 @@
-// Copyright 2017 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.
-//
-// VectorizeVectorScalarArithmetic.cpp: Turn some arithmetic operations that operate on a float
-// vector-scalar pair into vector-vector operations. This is done recursively. Some scalar binary
-// operations inside vector constructors are also turned into vector operations.
-//
-// This is targeted to work around a bug in NVIDIA OpenGL drivers that was reproducible on NVIDIA
-// driver version 387.92. It works around the most common occurrences of the bug.
-
-#include "compiler/translator/tree_ops/gl/VectorizeVectorScalarArithmetic.h"
-
-#include <set>
-
-#include "compiler/translator/IntermNode.h"
-#include "compiler/translator/tree_util/IntermNode_util.h"
-#include "compiler/translator/tree_util/IntermTraverse.h"
-
-namespace sh
-{
-
-namespace
-{
-
-class VectorizeVectorScalarArithmeticTraverser : public TIntermTraverser
-{
-  public:
-    VectorizeVectorScalarArithmeticTraverser(TSymbolTable *symbolTable)
-        : TIntermTraverser(true, false, false, symbolTable), mReplaced(false)
-    {}
-
-    bool didReplaceScalarsWithVectors() { return mReplaced; }
-    void nextIteration()
-    {
-        mReplaced = false;
-        mModifiedBlocks.clear();
-    }
-
-  protected:
-    bool visitBinary(Visit visit, TIntermBinary *node) override;
-    bool visitAggregate(Visit visit, TIntermAggregate *node) override;
-
-  private:
-    // These helpers should only be called from visitAggregate when visiting a constructor.
-    // argBinary is the only argument of the constructor.
-    void replaceMathInsideConstructor(TIntermAggregate *node, TIntermBinary *argBinary);
-    void replaceAssignInsideConstructor(const TIntermAggregate *node,
-                                        const TIntermBinary *argBinary);
-
-    static TIntermTyped *Vectorize(TIntermTyped *node,
-                                   TType vectorType,
-                                   TIntermTraverser::OriginalNode *originalNodeFate);
-
-    bool mReplaced;
-    std::set<const TIntermBlock *> mModifiedBlocks;
-};
-
-TIntermTyped *VectorizeVectorScalarArithmeticTraverser::Vectorize(
-    TIntermTyped *node,
-    TType vectorType,
-    TIntermTraverser::OriginalNode *originalNodeFate)
-{
-    ASSERT(node->isScalar());
-    vectorType.setQualifier(EvqTemporary);
-    TIntermSequence vectorConstructorArgs;
-    vectorConstructorArgs.push_back(node);
-    TIntermAggregate *vectorized =
-        TIntermAggregate::CreateConstructor(vectorType, &vectorConstructorArgs);
-    TIntermTyped *vectorizedFolded = vectorized->fold(nullptr);
-    if (originalNodeFate != nullptr)
-    {
-        if (vectorizedFolded != vectorized)
-        {
-            *originalNodeFate = OriginalNode::IS_DROPPED;
-        }
-        else
-        {
-            *originalNodeFate = OriginalNode::BECOMES_CHILD;
-        }
-    }
-    return vectorizedFolded;
-}
-
-bool VectorizeVectorScalarArithmeticTraverser::visitBinary(Visit /*visit*/, TIntermBinary *node)
-{
-    TIntermTyped *left  = node->getLeft();
-    TIntermTyped *right = node->getRight();
-    ASSERT(left);
-    ASSERT(right);
-    switch (node->getOp())
-    {
-        case EOpAdd:
-        case EOpAddAssign:
-            // Only these specific ops are necessary to turn into vector ops.
-            break;
-        default:
-            return true;
-    }
-    if (node->getBasicType() != EbtFloat)
-    {
-        // Only float ops have reproduced the bug.
-        return true;
-    }
-    if (left->isScalar() && right->isVector())
-    {
-        ASSERT(!node->isAssignment());
-        ASSERT(!right->isArray());
-        OriginalNode originalNodeFate;
-        TIntermTyped *leftVectorized = Vectorize(left, right->getType(), &originalNodeFate);
-        queueReplacementWithParent(node, left, leftVectorized, originalNodeFate);
-        mReplaced = true;
-        // Don't replace more nodes in the same subtree on this traversal. However, nodes elsewhere
-        // in the tree may still be replaced.
-        return false;
-    }
-    else if (left->isVector() && right->isScalar())
-    {
-        OriginalNode originalNodeFate;
-        TIntermTyped *rightVectorized = Vectorize(right, left->getType(), &originalNodeFate);
-        queueReplacementWithParent(node, right, rightVectorized, originalNodeFate);
-        mReplaced = true;
-        // Don't replace more nodes in the same subtree on this traversal. However, nodes elsewhere
-        // in the tree may still be replaced.
-        return false;
-    }
-    return true;
-}
-
-void VectorizeVectorScalarArithmeticTraverser::replaceMathInsideConstructor(
-    TIntermAggregate *node,
-    TIntermBinary *argBinary)
-{
-    // Turn:
-    //   a * b
-    // into:
-    //   gvec(a) * gvec(b)
-
-    TIntermTyped *left  = argBinary->getLeft();
-    TIntermTyped *right = argBinary->getRight();
-    ASSERT(left->isScalar() && right->isScalar());
-
-    TType leftVectorizedType = left->getType();
-    leftVectorizedType.setPrimarySize(static_cast<unsigned char>(node->getType().getNominalSize()));
-    TIntermTyped *leftVectorized = Vectorize(left, leftVectorizedType, nullptr);
-    TType rightVectorizedType    = right->getType();
-    rightVectorizedType.setPrimarySize(
-        static_cast<unsigned char>(node->getType().getNominalSize()));
-    TIntermTyped *rightVectorized = Vectorize(right, rightVectorizedType, nullptr);
-
-    TIntermBinary *newArg = new TIntermBinary(argBinary->getOp(), leftVectorized, rightVectorized);
-    queueReplacementWithParent(node, argBinary, newArg, OriginalNode::IS_DROPPED);
-}
-
-void VectorizeVectorScalarArithmeticTraverser::replaceAssignInsideConstructor(
-    const TIntermAggregate *node,
-    const TIntermBinary *argBinary)
-{
-    // Turn:
-    //   gvec(a *= b);
-    // into:
-    //   // This is inserted into the parent block:
-    //   gvec s0 = gvec(a);
-    //
-    //   // This goes where the gvec constructor used to be:
-    //   ((s0 *= b, a = s0.x), s0);
-
-    TIntermTyped *left  = argBinary->getLeft();
-    TIntermTyped *right = argBinary->getRight();
-    ASSERT(left->isScalar() && right->isScalar());
-    ASSERT(!left->hasSideEffects());
-
-    TType vecType = node->getType();
-    vecType.setQualifier(EvqTemporary);
-
-    // gvec s0 = gvec(a);
-    // s0 is called "tempAssignmentTarget" below.
-    TIntermTyped *tempAssignmentTargetInitializer = Vectorize(left->deepCopy(), vecType, nullptr);
-    TIntermDeclaration *tempAssignmentTargetDeclaration = nullptr;
-    TVariable *tempAssignmentTarget =
-        DeclareTempVariable(mSymbolTable, tempAssignmentTargetInitializer, EvqTemporary,
-                            &tempAssignmentTargetDeclaration);
-
-    // s0 *= b
-    TOperator compoundAssignmentOp = argBinary->getOp();
-    if (compoundAssignmentOp == EOpMulAssign)
-    {
-        compoundAssignmentOp = EOpVectorTimesScalarAssign;
-    }
-    TIntermBinary *replacementCompoundAssignment = new TIntermBinary(
-        compoundAssignmentOp, CreateTempSymbolNode(tempAssignmentTarget), right->deepCopy());
-
-    // s0.x
-    TVector<int> swizzleXOffset;
-    swizzleXOffset.push_back(0);
-    TIntermSwizzle *tempAssignmentTargetX =
-        new TIntermSwizzle(CreateTempSymbolNode(tempAssignmentTarget), swizzleXOffset);
-    // a = s0.x
-    TIntermBinary *replacementAssignBackToTarget =
-        new TIntermBinary(EOpAssign, left->deepCopy(), tempAssignmentTargetX);
-
-    // s0 *= b, a = s0.x
-    TIntermBinary *replacementSequenceLeft =
-        new TIntermBinary(EOpComma, replacementCompoundAssignment, replacementAssignBackToTarget);
-    // (s0 *= b, a = s0.x), s0
-    // Note that the created comma node is not const qualified in any case, so we can always pass
-    // shader version 300 here.
-    TIntermBinary *replacementSequence = TIntermBinary::CreateComma(
-        replacementSequenceLeft, CreateTempSymbolNode(tempAssignmentTarget), 300);
-
-    insertStatementInParentBlock(tempAssignmentTargetDeclaration);
-    queueReplacement(replacementSequence, OriginalNode::IS_DROPPED);
-}
-
-bool VectorizeVectorScalarArithmeticTraverser::visitAggregate(Visit /*visit*/,
-                                                              TIntermAggregate *node)
-{
-    // Transform scalar binary expressions inside vector constructors.
-    if (!node->isConstructor() || !node->isVector() || node->getSequence()->size() != 1)
-    {
-        return true;
-    }
-    TIntermTyped *argument = node->getSequence()->back()->getAsTyped();
-    ASSERT(argument);
-    if (!argument->isScalar() || argument->getBasicType() != EbtFloat)
-    {
-        return true;
-    }
-    TIntermBinary *argBinary = argument->getAsBinaryNode();
-    if (!argBinary)
-    {
-        return true;
-    }
-
-    // Only specific ops are necessary to change.
-    switch (argBinary->getOp())
-    {
-        case EOpMul:
-        case EOpDiv:
-        {
-            replaceMathInsideConstructor(node, argBinary);
-            mReplaced = true;
-            // Don't replace more nodes in the same subtree on this traversal. However, nodes
-            // elsewhere in the tree may still be replaced.
-            return false;
-        }
-        case EOpMulAssign:
-        case EOpDivAssign:
-        {
-            // The case where the left side has side effects is too complicated to deal with, so we
-            // leave that be.
-            if (!argBinary->getLeft()->hasSideEffects())
-            {
-                const TIntermBlock *parentBlock = getParentBlock();
-                // We can't do more than one insertion to the same block on the same traversal.
-                if (mModifiedBlocks.find(parentBlock) == mModifiedBlocks.end())
-                {
-                    replaceAssignInsideConstructor(node, argBinary);
-                    mModifiedBlocks.insert(parentBlock);
-                    mReplaced = true;
-                    // Don't replace more nodes in the same subtree on this traversal.
-                    // However, nodes elsewhere in the tree may still be replaced.
-                    return false;
-                }
-            }
-            break;
-        }
-        default:
-            return true;
-    }
-    return true;
-}
-
-}  // anonymous namespace
-
-bool VectorizeVectorScalarArithmetic(TCompiler *compiler,
-                                     TIntermBlock *root,
-                                     TSymbolTable *symbolTable)
-{
-    VectorizeVectorScalarArithmeticTraverser traverser(symbolTable);
-    do
-    {
-        traverser.nextIteration();
-        root->traverse(&traverser);
-        if (!traverser.updateTree(compiler, root))
-        {
-            return false;
-        }
-    } while (traverser.didReplaceScalarsWithVectors());
-
-    return true;
-}
-
-}  // namespace sh
diff --git a/src/compiler/translator/tree_ops/gl/VectorizeVectorScalarArithmetic.h b/src/compiler/translator/tree_ops/gl/VectorizeVectorScalarArithmetic.h
deleted file mode 100644
index deb5a5f..0000000
--- a/src/compiler/translator/tree_ops/gl/VectorizeVectorScalarArithmetic.h
+++ /dev/null
@@ -1,40 +0,0 @@
-// Copyright 2017 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.
-//
-// VectorizeVectorScalarArithmetic.h: Turn some arithmetic operations that operate on a float
-// vector-scalar pair into vector-vector operations. This is done recursively. Some scalar binary
-// operations inside vector constructors are also turned into vector operations.
-//
-// This is targeted to work around a bug in NVIDIA OpenGL drivers that was reproducible on NVIDIA
-// driver version 387.92. It works around the most common occurrences of the bug.
-
-#ifndef COMPILER_TRANSLATOR_TREEOPS_GL_VECTORIZEVECTORSCALARARITHMETIC_H_
-#define COMPILER_TRANSLATOR_TREEOPS_GL_VECTORIZEVECTORSCALARARITHMETIC_H_
-
-#include "common/angleutils.h"
-
-namespace sh
-{
-
-class TCompiler;
-class TIntermBlock;
-class TSymbolTable;
-
-#ifdef ANGLE_ENABLE_GLSL
-ANGLE_NO_DISCARD bool VectorizeVectorScalarArithmetic(TCompiler *compiler,
-                                                      TIntermBlock *root,
-                                                      TSymbolTable *symbolTable);
-#else
-ANGLE_NO_DISCARD ANGLE_INLINE bool VectorizeVectorScalarArithmetic(TCompiler *compiler,
-                                                                   TIntermBlock *root,
-                                                                   TSymbolTable *symbolTable)
-{
-    UNREACHABLE();
-    return false;
-}
-#endif
-
-}  // namespace sh
-
-#endif  // COMPILER_TRANSLATOR_TREEOPS_GL_VECTORIZEVECTORSCALARARITHMETIC_H_
diff --git a/src/compiler/translator/tree_ops/vulkan/DeclarePerVertexBlocks.cpp b/src/compiler/translator/tree_ops/vulkan/DeclarePerVertexBlocks.cpp
index fda9fa9..bc4e940 100644
--- a/src/compiler/translator/tree_ops/vulkan/DeclarePerVertexBlocks.cpp
+++ b/src/compiler/translator/tree_ops/vulkan/DeclarePerVertexBlocks.cpp
@@ -45,6 +45,76 @@
 
 // Traverser that:
 //
+// 1. Inspects global qualifier declarations and extracts whether any of the gl_PerVertex built-ins
+//    are invariant or precise.  These declarations are then dropped.
+// 2. Finds the array size of gl_ClipDistance and gl_CullDistance built-in, if any.
+class InspectPerVertexBuiltInsTraverser : public TIntermTraverser
+{
+  public:
+    InspectPerVertexBuiltInsTraverser(TCompiler *compiler,
+                                      TSymbolTable *symbolTable,
+                                      PerVertexMemberFlags *invariantFlagsOut,
+                                      PerVertexMemberFlags *preciseFlagsOut,
+                                      uint32_t *clipDistanceArraySizeOut,
+                                      uint32_t *cullDistanceArraySizeOut)
+        : TIntermTraverser(true, false, false, symbolTable),
+          mInvariantFlagsOut(invariantFlagsOut),
+          mPreciseFlagsOut(preciseFlagsOut),
+          mClipDistanceArraySizeOut(clipDistanceArraySizeOut),
+          mCullDistanceArraySizeOut(cullDistanceArraySizeOut)
+    {}
+
+    bool visitGlobalQualifierDeclaration(Visit visit,
+                                         TIntermGlobalQualifierDeclaration *node) override
+    {
+        TIntermSymbol *symbol = node->getSymbol();
+
+        const int fieldIndex =
+            GetPerVertexFieldIndex(symbol->getType().getQualifier(), symbol->getName());
+        if (fieldIndex < 0)
+        {
+            return false;
+        }
+
+        if (node->isInvariant())
+        {
+            (*mInvariantFlagsOut)[fieldIndex] = true;
+        }
+        else if (node->isPrecise())
+        {
+            (*mPreciseFlagsOut)[fieldIndex] = true;
+        }
+
+        mMultiReplacements.emplace_back(getParentNode()->getAsBlock(), node, TIntermSequence());
+
+        return false;
+    }
+
+    void visitSymbol(TIntermSymbol *symbol) override
+    {
+        const TType &type = symbol->getType();
+        switch (type.getQualifier())
+        {
+            case EvqClipDistance:
+                *mClipDistanceArraySizeOut = type.getOutermostArraySize();
+                break;
+            case EvqCullDistance:
+                *mCullDistanceArraySizeOut = type.getOutermostArraySize();
+                break;
+            default:
+                break;
+        }
+    }
+
+  private:
+    PerVertexMemberFlags *mInvariantFlagsOut;
+    PerVertexMemberFlags *mPreciseFlagsOut;
+    uint32_t *mClipDistanceArraySizeOut;
+    uint32_t *mCullDistanceArraySizeOut;
+};
+
+// Traverser that:
+//
 // 1. Declares the input and output gl_PerVertex types and variables if not already (based on shader
 //    type).
 // 2. Turns built-in references into indexes into these variables.
@@ -54,10 +124,15 @@
     DeclarePerVertexBlocksTraverser(TCompiler *compiler,
                                     TSymbolTable *symbolTable,
                                     const PerVertexMemberFlags &invariantFlags,
-                                    const PerVertexMemberFlags &preciseFlags)
+                                    const PerVertexMemberFlags &preciseFlags,
+                                    uint32_t clipDistanceArraySize,
+                                    uint32_t cullDistanceArraySize)
         : TIntermTraverser(true, false, false, symbolTable),
           mShaderType(compiler->getShaderType()),
+          mShaderVersion(compiler->getShaderVersion()),
           mResources(compiler->getResources()),
+          mClipDistanceArraySize(clipDistanceArraySize),
+          mCullDistanceArraySize(cullDistanceArraySize),
           mPerVertexInVar(nullptr),
           mPerVertexOutVar(nullptr),
           mPerVertexInVarRedeclared(false),
@@ -103,7 +178,9 @@
 
             if (mPerVertexOutVarRedeclared)
             {
-                queueReplacement(new TIntermSymbol(mPerVertexOutVar), OriginalNode::IS_DROPPED);
+                // Traverse the parents and promote the new type.  Replace the root of
+                // EOpIndex[In]Direct chain.
+                queueAccessChainReplacement(new TIntermSymbol(mPerVertexOutVar));
             }
 
             return;
@@ -124,7 +201,9 @@
 
             if (mPerVertexInVarRedeclared)
             {
-                queueReplacement(new TIntermSymbol(mPerVertexInVar), OriginalNode::IS_DROPPED);
+                // Traverse the parents and promote the new type.  Replace the root of
+                // EOpIndex[In]Direct chain.
+                queueAccessChainReplacement(new TIntermSymbol(mPerVertexInVar));
             }
 
             return;
@@ -145,7 +224,8 @@
         if (variable->symbolType() != SymbolType::BuiltIn)
         {
             ASSERT(variable->name() != "gl_Position" && variable->name() != "gl_PointSize" &&
-                   variable->name() != "gl_ClipDistance" && variable->name() != "gl_CullDistance");
+                   variable->name() != "gl_ClipDistance" && variable->name() != "gl_CullDistance" &&
+                   variable->name() != "gl_in" && variable->name() != "gl_out");
 
             return;
         }
@@ -202,8 +282,8 @@
     {
         TFieldList *fields = new TFieldList;
 
-        const TType *vec4Type  = StaticType::GetBasic<EbtFloat, 4>();
-        const TType *floatType = StaticType::GetBasic<EbtFloat, 1>();
+        const TType *vec4Type  = StaticType::GetBasic<EbtFloat, EbpHigh, 4>();
+        const TType *floatType = StaticType::GetBasic<EbtFloat, EbpHigh, 1>();
 
         TType *positionType     = new TType(*vec4Type);
         TType *pointSizeType    = new TType(*floatType);
@@ -215,8 +295,23 @@
         clipDistanceType->setQualifier(EvqClipDistance);
         cullDistanceType->setQualifier(EvqCullDistance);
 
-        clipDistanceType->makeArray(mResources.MaxClipDistances);
-        cullDistanceType->makeArray(mResources.MaxCullDistances);
+        TPrecision pointSizePrecision = EbpHigh;
+        if (mShaderType == GL_VERTEX_SHADER)
+        {
+            // gl_PointSize is mediump in ES100 and highp in ES300+.
+            const TVariable *glPointSize = static_cast<const TVariable *>(
+                mSymbolTable->findBuiltIn(ImmutableString("gl_PointSize"), mShaderVersion));
+            ASSERT(glPointSize);
+
+            pointSizePrecision = glPointSize->getType().getPrecision();
+        }
+        pointSizeType->setPrecision(pointSizePrecision);
+
+        // TODO: handle interaction with GS and T*S where the two can have different sizes.  These
+        // values are valid for EvqPerVertexOut only.  For EvqPerVertexIn, the size should come from
+        // the declaration of gl_in.  http://anglebug.com/5466.
+        clipDistanceType->makeArray(std::max(mClipDistanceArraySize, 1u));
+        cullDistanceType->makeArray(std::max(mCullDistanceArraySize, 1u));
 
         if (qualifier == EvqPerVertexOut)
         {
@@ -297,7 +392,10 @@
     }
 
     GLenum mShaderType;
+    int mShaderVersion;
     const ShBuiltInResources &mResources;
+    uint32_t mClipDistanceArraySize;
+    uint32_t mCullDistanceArraySize;
 
     const TVariable *mPerVertexInVar;
     const TVariable *mPerVertexOutVar;
@@ -339,44 +437,29 @@
     }
 
     // First, visit all global qualifier declarations and find which built-ins are invariant or
-    // precise.
+    // precise.  At the same time, find out the size of gl_ClipDistance and gl_CullDistance arrays.
     PerVertexMemberFlags invariantFlags = {};
     PerVertexMemberFlags preciseFlags   = {};
+    uint32_t clipDistanceArraySize = 0, cullDistanceArraySize = 0;
 
-    TIntermSequence withoutPerVertexGlobalQualifierDeclarations;
-
-    for (TIntermNode *node : *root->getSequence())
+    InspectPerVertexBuiltInsTraverser infoTraverser(compiler, symbolTable, &invariantFlags,
+                                                    &preciseFlags, &clipDistanceArraySize,
+                                                    &cullDistanceArraySize);
+    root->traverse(&infoTraverser);
+    if (!infoTraverser.updateTree(compiler, root))
     {
-        TIntermGlobalQualifierDeclaration *asGlobalQualifierDecl =
-            node->getAsGlobalQualifierDeclarationNode();
-        if (asGlobalQualifierDecl == nullptr)
-        {
-            withoutPerVertexGlobalQualifierDeclarations.push_back(node);
-            continue;
-        }
-
-        TIntermSymbol *symbol = asGlobalQualifierDecl->getSymbol();
-
-        const int fieldIndex =
-            GetPerVertexFieldIndex(symbol->getType().getQualifier(), symbol->getName());
-        if (fieldIndex < 0)
-        {
-            withoutPerVertexGlobalQualifierDeclarations.push_back(node);
-            continue;
-        }
-
-        if (asGlobalQualifierDecl->isInvariant())
-        {
-            invariantFlags[fieldIndex] = true;
-        }
-        else if (asGlobalQualifierDecl->isPrecise())
-        {
-            preciseFlags[fieldIndex] = true;
-        }
+        return false;
     }
 
-    // Remove the global qualifier declarations for the gl_PerVertex members.
-    root->replaceAllChildren(withoutPerVertexGlobalQualifierDeclarations);
+    // If not specified, take the clip/cull distance size from the resources.
+    if (clipDistanceArraySize == 0)
+    {
+        clipDistanceArraySize = compiler->getResources().MaxClipDistances;
+    }
+    if (cullDistanceArraySize == 0)
+    {
+        cullDistanceArraySize = compiler->getResources().MaxCullDistances;
+    }
 
     // If #pragma STDGL invariant(all) is specified, make all outputs invariant.
     if (compiler->getPragma().stdgl.invariantAll)
@@ -385,7 +468,8 @@
     }
 
     // Then declare the in and out gl_PerVertex I/O blocks.
-    DeclarePerVertexBlocksTraverser traverser(compiler, symbolTable, invariantFlags, preciseFlags);
+    DeclarePerVertexBlocksTraverser traverser(compiler, symbolTable, invariantFlags, preciseFlags,
+                                              clipDistanceArraySize, cullDistanceArraySize);
     root->traverse(&traverser);
     if (!traverser.updateTree(compiler, root))
     {
diff --git a/src/compiler/translator/tree_ops/vulkan/EarlyFragmentTestsOptimization.cpp b/src/compiler/translator/tree_ops/vulkan/EarlyFragmentTestsOptimization.cpp
index 1319e1f..485f182 100644
--- a/src/compiler/translator/tree_ops/vulkan/EarlyFragmentTestsOptimization.cpp
+++ b/src/compiler/translator/tree_ops/vulkan/EarlyFragmentTestsOptimization.cpp
@@ -47,7 +47,7 @@
     // different qualifier if it's the result of a folded ternary node.
     TQualifier qualifier = node->variable().getType().getQualifier();
 
-    if (qualifier == EvqFragDepth || qualifier == EvqFragDepthEXT)
+    if (qualifier == EvqFragDepth)
     {
         mFragDepthUsed = true;
     }
diff --git a/src/compiler/translator/tree_ops/vulkan/EmulateFragColorData.cpp b/src/compiler/translator/tree_ops/vulkan/EmulateFragColorData.cpp
index 6fc91f0..201d98a 100644
--- a/src/compiler/translator/tree_ops/vulkan/EmulateFragColorData.cpp
+++ b/src/compiler/translator/tree_ops/vulkan/EmulateFragColorData.cpp
@@ -10,7 +10,6 @@
 
 #include "compiler/translator/Compiler.h"
 #include "compiler/translator/ImmutableStringBuilder.h"
-#include "compiler/translator/StaticType.h"
 #include "compiler/translator/SymbolTable.h"
 #include "compiler/translator/tree_util/IntermNode_util.h"
 #include "compiler/translator/tree_util/IntermTraverse.h"
@@ -45,9 +44,8 @@
             return;
         }
 
-        unsigned int arraySize = 0;
-        int index              = 0;
-        const char *name       = "";
+        int index        = 0;
+        const char *name = "";
 
         // Replace the built-ins being emulated with a variable of the appropriate type.
         switch (type.getQualifier())
@@ -56,28 +54,23 @@
                 name = "webgl_FragColor";
                 break;
             case EvqFragData:
-                name      = "webgl_FragData";
-                arraySize = mResources.MaxDrawBuffers;
+                name = "webgl_FragData";
                 break;
             case EvqSecondaryFragColorEXT:
                 name  = "webgl_SecondaryFragColor";
                 index = 1;
                 break;
             case EvqSecondaryFragDataEXT:
-                name      = "webgl_SecondaryFragData";
-                index     = 1;
-                arraySize = mResources.MaxDualSourceDrawBuffers;
+                name  = "webgl_SecondaryFragData";
+                index = 1;
                 break;
             default:
                 // Not the built-in we are looking for.
                 return;
         }
 
-        TType *outputType = new TType(*StaticType::GetQualified<EbtFloat, EvqFragmentOut, 4, 1>());
-        if (arraySize > 0)
-        {
-            outputType->makeArray(arraySize);
-        }
+        TType *outputType = new TType(type);
+        outputType->setQualifier(EvqFragmentOut);
         if (index > 0)
         {
             TLayoutQualifier layoutQualifier = outputType->getLayoutQualifier();
@@ -117,6 +110,19 @@
     // A map of already replaced built-in variables.
     VariableReplacementMap mVariableMap;
 };
+
+bool EmulateFragColorDataImpl(TCompiler *compiler, TIntermBlock *root, TSymbolTable *symbolTable)
+{
+    EmulateFragColorDataTraverser traverser(compiler, symbolTable);
+    root->traverse(&traverser);
+    if (!traverser.updateTree(compiler, root))
+    {
+        return false;
+    }
+
+    traverser.addDeclarations(root);
+    return true;
+}
 }  // anonymous namespace
 
 bool EmulateFragColorData(TCompiler *compiler, TIntermBlock *root, TSymbolTable *symbolTable)
@@ -126,14 +132,13 @@
         return true;
     }
 
-    EmulateFragColorDataTraverser traverser(compiler, symbolTable);
-    root->traverse(&traverser);
-    if (!traverser.updateTree(compiler, root))
-    {
-        return false;
-    }
+    // This transformation adds variable declarations after the fact and so some validation is
+    // momentarily disabled.
+    bool enableValidateVariableReferences = compiler->disableValidateVariableReferences();
 
-    traverser.addDeclarations(root);
-    return compiler->validateAST(root);
+    bool result = EmulateFragColorDataImpl(compiler, root, symbolTable);
+
+    compiler->restoreValidateVariableReferences(enableValidateVariableReferences);
+    return result && compiler->validateAST(root);
 }
 }  // namespace sh
diff --git a/src/compiler/translator/tree_ops/vulkan/ReplaceForShaderFramebufferFetch.cpp b/src/compiler/translator/tree_ops/vulkan/ReplaceForShaderFramebufferFetch.cpp
index 55e3f5e..001eece 100644
--- a/src/compiler/translator/tree_ops/vulkan/ReplaceForShaderFramebufferFetch.cpp
+++ b/src/compiler/translator/tree_ops/vulkan/ReplaceForShaderFramebufferFetch.cpp
@@ -11,7 +11,6 @@
 
 #include "common/bitset_utils.h"
 #include "compiler/translator/ImmutableStringBuilder.h"
-#include "compiler/translator/StaticType.h"
 #include "compiler/translator/SymbolTable.h"
 #include "compiler/translator/tree_util/BuiltIn.h"
 #include "compiler/translator/tree_util/IntermNode_util.h"
@@ -26,24 +25,10 @@
 {
 
 using InputAttachmentIdxSet = angle::BitSet<32>;
-using MapForReplacement     = const std::map<const TVariable *, const TIntermTyped *>;
 
 constexpr unsigned int kInputAttachmentZero = 0;
 constexpr unsigned int kArraySizeZero       = 0;
 
-enum class InputType
-{
-    SubpassInput = 0,
-    SubpassInputMS,
-    ISubpassInput,
-    ISubpassInputMS,
-    USubpassInput,
-    USubpassInputMS,
-
-    InvalidEnum,
-    EnumCount = InvalidEnum,
-};
-
 class InputAttachmentReferenceTraverser : public TIntermTraverser
 {
   public:
@@ -103,15 +88,10 @@
 
 bool InputAttachmentReferenceTraverser::visitDeclaration(Visit visit, TIntermDeclaration *node)
 {
-    const TIntermSequence &sequence = *(node->getSequence());
+    const TIntermSequence &sequence = *node->getSequence();
+    ASSERT(sequence.size() == 1);
 
-    if (sequence.size() != 1)
-    {
-        return true;
-    }
-
-    TIntermTyped *variable = sequence.front()->getAsTyped();
-    TIntermSymbol *symbol  = variable->getAsSymbolNode();
+    TIntermSymbol *symbol = sequence.front()->getAsSymbolNode();
     if (symbol == nullptr)
     {
         return true;
@@ -238,51 +218,7 @@
     }
 }
 
-InputType GetInputTypeOfSubpassInput(const TBasicType &basicType)
-{
-    switch (basicType)
-    {
-        case TBasicType::EbtSubpassInput:
-            return InputType::SubpassInput;
-        case TBasicType::EbtSubpassInputMS:
-            return InputType::SubpassInputMS;
-        case TBasicType::EbtISubpassInput:
-            return InputType::ISubpassInput;
-        case TBasicType::EbtISubpassInputMS:
-            return InputType::ISubpassInputMS;
-        case TBasicType::EbtUSubpassInput:
-            return InputType::USubpassInput;
-        case TBasicType::EbtUSubpassInputMS:
-            return InputType::USubpassInputMS;
-        default:
-            UNREACHABLE();
-            return InputType::InvalidEnum;
-    }
-}
-
-TBasicType GetBasicTypeOfSubpassInput(const InputType &inputType)
-{
-    switch (inputType)
-    {
-        case InputType::SubpassInput:
-            return EbtSubpassInput;
-        case InputType::SubpassInputMS:
-            return EbtSubpassInputMS;
-        case InputType::ISubpassInput:
-            return EbtISubpassInput;
-        case InputType::ISubpassInputMS:
-            return EbtISubpassInputMS;
-        case InputType::USubpassInput:
-            return EbtUSubpassInput;
-        case InputType::USubpassInputMS:
-            return EbtUSubpassInputMS;
-        default:
-            UNREACHABLE();
-            return TBasicType::EbtVoid;
-    }
-}
-
-TBasicType GetBasicTypeForSubpassInput(const TBasicType &inputType)
+TBasicType GetBasicTypeForSubpassInput(TBasicType inputType)
 {
     switch (inputType)
     {
@@ -308,67 +244,11 @@
     return GetBasicTypeForSubpassInput(originSymbol->getBasicType());
 }
 
-ImmutableString GetTypeNameOfSubpassInput(const InputType &inputType)
+TIntermTyped *CreateSubpassLoadFuncCall(TSymbolTable *symbolTable,
+                                        TBasicType inputType,
+                                        TIntermSequence *arguments)
 {
-    switch (inputType)
-    {
-        case InputType::SubpassInput:
-            return ImmutableString("subpassInput");
-        case InputType::SubpassInputMS:
-            return ImmutableString("subpassInputMS");
-        case InputType::ISubpassInput:
-            return ImmutableString("isubpassInput");
-        case InputType::ISubpassInputMS:
-            return ImmutableString("isubpassInputMS");
-        case InputType::USubpassInput:
-            return ImmutableString("usubpassInput");
-        case InputType::USubpassInputMS:
-            return ImmutableString("usubpassInputMS");
-        default:
-            UNREACHABLE();
-            return kEmptyImmutableString;
-    }
-}
-
-ImmutableString GetFunctionNameOfSubpassLoad(const InputType &inputType)
-{
-    switch (inputType)
-    {
-        case InputType::SubpassInput:
-        case InputType::ISubpassInput:
-        case InputType::USubpassInput:
-            return ImmutableString("subpassLoad");
-        case InputType::SubpassInputMS:
-        case InputType::ISubpassInputMS:
-        case InputType::USubpassInputMS:
-            return ImmutableString("subpassLoadMS");
-        default:
-            UNREACHABLE();
-            return kEmptyImmutableString;
-    }
-}
-
-TIntermAggregate *CreateSubpassLoadFuncCall(TSymbolTable *symbolTable,
-                                            std::map<InputType, TFunction *> *functionMap,
-                                            const InputType &inputType,
-                                            TIntermSequence *arguments)
-{
-    TBasicType subpassInputType = GetBasicTypeOfSubpassInput(inputType);
-    ASSERT(subpassInputType != TBasicType::EbtVoid);
-
-    TFunction **currentFunc = &(*functionMap)[inputType];
-    if (*currentFunc == nullptr)
-    {
-        TType *inputAttachmentType = new TType(subpassInputType, EbpUndefined, EvqUniform, 1);
-        *currentFunc = new TFunction(symbolTable, GetFunctionNameOfSubpassLoad(inputType),
-                                     SymbolType::AngleInternal,
-                                     new TType(EbtFloat, EbpUndefined, EvqGlobal, 4, 1), true);
-        (*currentFunc)
-            ->addParameter(new TVariable(symbolTable, GetTypeNameOfSubpassInput(inputType),
-                                         inputAttachmentType, SymbolType::AngleInternal));
-    }
-
-    return TIntermAggregate::CreateFunctionCall(**currentFunc, arguments);
+    return CreateBuiltInFunctionCallNode("subpassLoad", arguments, *symbolTable, kESSLVulkanOnly);
 }
 
 class ReplaceSubpassInputUtils
@@ -393,7 +273,6 @@
         mInputAttachmentArrayIdSeq = 0;
         mInputAttachmentVarList.clear();
         mDataLoadVarList.clear();
-        mFunctionMap.clear();
     }
     virtual ~ReplaceSubpassInputUtils() = default;
 
@@ -447,7 +326,6 @@
 
     TIntermSequence mDeclareVariables;
     unsigned int mInputAttachmentArrayIdSeq;
-    std::map<InputType, TFunction *> mFunctionMap;
     std::map<unsigned int, TVariable *> mInputAttachmentVarList;
     std::map<unsigned int, const TVariable *> mDataLoadVarList;
 };
@@ -519,19 +397,25 @@
     TIntermSequence *subpassArguments = new TIntermSequence();
     subpassArguments->push_back(inputAttachmentSymbol);
 
-    TIntermAggregate *subpassLoadFuncCall = CreateSubpassLoadFuncCall(
-        mSymbolTable, &mFunctionMap,
-        GetInputTypeOfSubpassInput(inputAttachmentSymbol->getBasicType()), subpassArguments);
+    // TODO: support interaction with multisampled framebuffers.  For example, the sample ID needs
+    // to be provided to the built-in call here.  http://anglebug.com/6195
 
-    TVector<int> fieldOffsets(targetVecSize);
-    for (int i = 0; i < targetVecSize; i++)
+    TIntermTyped *subpassLoadFuncCall = CreateSubpassLoadFuncCall(
+        mSymbolTable, inputAttachmentSymbol->getBasicType(), subpassArguments);
+
+    TIntermTyped *result = subpassLoadFuncCall;
+    if (targetVecSize < 4)
     {
-        fieldOffsets[i] = i;
+        TVector<int> fieldOffsets(targetVecSize);
+        for (int i = 0; i < targetVecSize; i++)
+        {
+            fieldOffsets[i] = i;
+        }
+
+        result = new TIntermSwizzle(subpassLoadFuncCall, fieldOffsets);
     }
 
-    TIntermTyped *right = new TIntermSwizzle(subpassLoadFuncCall, fieldOffsets);
-
-    return new TIntermBinary(EOpAssign, resultVar, right);
+    return new TIntermBinary(EOpAssign, resultVar, result);
 }
 
 TIntermNode *ReplaceSubpassInputUtils::loadInputAttachmentDataImpl(
@@ -765,15 +649,9 @@
         return false;
     }
 
-    const TBasicType loadVarBasicType = glLastFragDataVar->getType().getBasicType();
-    const TPrecision loadVarPrecision = glLastFragDataVar->getType().getPrecision();
-    const unsigned int loadVarVecSize = glLastFragDataVar->getType().getNominalSize();
-    const int loadVarArraySize        = glLastFragDataVar->getType().getOutermostArraySize();
-
     ImmutableString loadVarName("ANGLELastFragData");
-    TType *loadVarType = new TType(loadVarBasicType, loadVarPrecision, EvqGlobal,
-                                   static_cast<unsigned char>(loadVarVecSize));
-    loadVarType->makeArray(loadVarArraySize);
+    TType *loadVarType = new TType(glLastFragDataVar->getType());
+    loadVarType->setQualifier(EvqGlobal);
 
     TVariable *loadVar =
         new TVariable(symbolTable, loadVarName, loadVarType, SymbolType::AngleInternal);
@@ -835,23 +713,11 @@
         const unsigned int inputAttachmentIndex = originInOutVarIter.first;
         const TIntermSymbol *originInOutVar     = originInOutVarIter.second;
 
-        const TBasicType loadVarBasicType = originInOutVar->getType().getBasicType();
-        const TPrecision loadVarPrecision = originInOutVar->getType().getPrecision();
-        const unsigned int loadVarVecSize = originInOutVar->getType().getNominalSize();
-        const unsigned int loadVarArraySize =
-            (originInOutVar->isArray() ? originInOutVar->getOutermostArraySize() : 0);
-
-        TType *newOutVarType = new TType(loadVarBasicType, loadVarPrecision, EvqGlobal,
-                                         static_cast<unsigned char>(loadVarVecSize));
+        TType *newOutVarType = new TType(originInOutVar->getType());
 
         // We just want to use the original variable decorated with a inout qualifier, except
         // the qualifier itself. The qualifier will be changed from inout to out.
-        newOutVarType->setQualifier(TQualifier::EvqFragmentOut);
-
-        if (loadVarArraySize > 0)
-        {
-            newOutVarType->makeArray(loadVarArraySize);
-        }
+        newOutVarType->setQualifier(EvqFragmentOut);
 
         TVariable *newOutVar = new TVariable(symbolTable, originInOutVar->getName(), newOutVarType,
                                              SymbolType::UserDefined);
diff --git a/src/compiler/translator/tree_ops/vulkan/RewriteInterpolateAtOffset.cpp b/src/compiler/translator/tree_ops/vulkan/RewriteInterpolateAtOffset.cpp
index 6fa03a6..fe7e274 100644
--- a/src/compiler/translator/tree_ops/vulkan/RewriteInterpolateAtOffset.cpp
+++ b/src/compiler/translator/tree_ops/vulkan/RewriteInterpolateAtOffset.cpp
@@ -9,7 +9,6 @@
 #include "compiler/translator/tree_ops/vulkan/RewriteInterpolateAtOffset.h"
 
 #include "common/angleutils.h"
-#include "compiler/translator/StaticType.h"
 #include "compiler/translator/SymbolTable.h"
 #include "compiler/translator/TranslatorVulkan.h"
 #include "compiler/translator/tree_util/DriverUniform.h"
@@ -99,7 +98,8 @@
     interpolateAtOffsetArguments.push_back(sequence->at(0));
     // offset
     TIntermTyped *offsetNode = sequence->at(1)->getAsTyped();
-    ASSERT(offsetNode->getType() == *(StaticType::GetBasic<EbtFloat, 2>()));
+    ASSERT(offsetNode->getType().getBasicType() == EbtFloat &&
+           offsetNode->getType().getNominalSize() == 2);
 
     // If pre-rotation is enabled apply the transformation else just flip the Y-coordinate
     TIntermTyped *rotatedXY;
diff --git a/src/compiler/translator/tree_ops/vulkan/RewriteR32fImages.cpp b/src/compiler/translator/tree_ops/vulkan/RewriteR32fImages.cpp
index 7d10afb..9c3f539 100644
--- a/src/compiler/translator/tree_ops/vulkan/RewriteR32fImages.cpp
+++ b/src/compiler/translator/tree_ops/vulkan/RewriteR32fImages.cpp
@@ -118,7 +118,7 @@
     if (!BuiltInGroup::IsBuiltIn(node->getOp()))
     {
         // AST functions don't require modification as r32f image function parameters are removed by
-        // MonomorphizeUnsupportedFunctionsInVulkanGLSL.
+        // MonomorphizeUnsupportedFunctions.
         return nullptr;
     }
 
@@ -237,8 +237,8 @@
         if (isImageLoad)
         {
             // vec4(uintBitsToFloat(imageLoad().rgb), 1.0)
-            const TType &vec4Type           = *StaticType::GetBasic<EbtFloat, 4>();
-            TIntermSequence constructorArgs = {replacementCall, CreateFloatNode(1.0f)};
+            const TType &vec4Type           = *StaticType::GetBasic<EbtFloat, EbpHigh, 4>();
+            TIntermSequence constructorArgs = {replacementCall, CreateFloatNode(1.0f, EbpMedium)};
             replacementCall = TIntermAggregate::CreateConstructor(vec4Type, &constructorArgs);
         }
     }
diff --git a/src/compiler/translator/tree_util/BuiltIn_ESSL_autogen.h b/src/compiler/translator/tree_util/BuiltIn_ESSL_autogen.h
index a7a6057..f08682d 100644
--- a/src/compiler/translator/tree_util/BuiltIn_ESSL_autogen.h
+++ b/src/compiler/translator/tree_util/BuiltIn_ESSL_autogen.h
@@ -22,2917 +22,2936 @@
 class BuiltInId
 {
   public:
-    static constexpr const TSymbolUniqueId radians_Float1                   = TSymbolUniqueId(3064);
-    static constexpr const TSymbolUniqueId pt00B                            = TSymbolUniqueId(3065);
-    static constexpr const TSymbolUniqueId radians_Float2                   = TSymbolUniqueId(3066);
-    static constexpr const TSymbolUniqueId pt10B                            = TSymbolUniqueId(3067);
-    static constexpr const TSymbolUniqueId radians_Float3                   = TSymbolUniqueId(3068);
-    static constexpr const TSymbolUniqueId pt20B                            = TSymbolUniqueId(3069);
-    static constexpr const TSymbolUniqueId radians_Float4                   = TSymbolUniqueId(3070);
-    static constexpr const TSymbolUniqueId pt30B                            = TSymbolUniqueId(3071);
-    static constexpr const TSymbolUniqueId degrees_Float1                   = TSymbolUniqueId(3072);
-    static constexpr const TSymbolUniqueId degrees_Float2                   = TSymbolUniqueId(3073);
-    static constexpr const TSymbolUniqueId degrees_Float3                   = TSymbolUniqueId(3074);
-    static constexpr const TSymbolUniqueId degrees_Float4                   = TSymbolUniqueId(3075);
-    static constexpr const TSymbolUniqueId sin_Float1                       = TSymbolUniqueId(3076);
-    static constexpr const TSymbolUniqueId sin_Float2                       = TSymbolUniqueId(3077);
-    static constexpr const TSymbolUniqueId sin_Float3                       = TSymbolUniqueId(3078);
-    static constexpr const TSymbolUniqueId sin_Float4                       = TSymbolUniqueId(3079);
-    static constexpr const TSymbolUniqueId cos_Float1                       = TSymbolUniqueId(3080);
-    static constexpr const TSymbolUniqueId cos_Float2                       = TSymbolUniqueId(3081);
-    static constexpr const TSymbolUniqueId cos_Float3                       = TSymbolUniqueId(3082);
-    static constexpr const TSymbolUniqueId cos_Float4                       = TSymbolUniqueId(3083);
-    static constexpr const TSymbolUniqueId tan_Float1                       = TSymbolUniqueId(3084);
-    static constexpr const TSymbolUniqueId tan_Float2                       = TSymbolUniqueId(3085);
-    static constexpr const TSymbolUniqueId tan_Float3                       = TSymbolUniqueId(3086);
-    static constexpr const TSymbolUniqueId tan_Float4                       = TSymbolUniqueId(3087);
-    static constexpr const TSymbolUniqueId asin_Float1                      = TSymbolUniqueId(3088);
-    static constexpr const TSymbolUniqueId asin_Float2                      = TSymbolUniqueId(3089);
-    static constexpr const TSymbolUniqueId asin_Float3                      = TSymbolUniqueId(3090);
-    static constexpr const TSymbolUniqueId asin_Float4                      = TSymbolUniqueId(3091);
-    static constexpr const TSymbolUniqueId acos_Float1                      = TSymbolUniqueId(3092);
-    static constexpr const TSymbolUniqueId acos_Float2                      = TSymbolUniqueId(3093);
-    static constexpr const TSymbolUniqueId acos_Float3                      = TSymbolUniqueId(3094);
-    static constexpr const TSymbolUniqueId acos_Float4                      = TSymbolUniqueId(3095);
-    static constexpr const TSymbolUniqueId atan_Float1_Float1               = TSymbolUniqueId(3096);
-    static constexpr const TSymbolUniqueId atan_Float2_Float2               = TSymbolUniqueId(3097);
-    static constexpr const TSymbolUniqueId atan_Float3_Float3               = TSymbolUniqueId(3098);
-    static constexpr const TSymbolUniqueId atan_Float4_Float4               = TSymbolUniqueId(3099);
-    static constexpr const TSymbolUniqueId atan_Float1                      = TSymbolUniqueId(3100);
-    static constexpr const TSymbolUniqueId atan_Float2                      = TSymbolUniqueId(3101);
-    static constexpr const TSymbolUniqueId atan_Float3                      = TSymbolUniqueId(3102);
-    static constexpr const TSymbolUniqueId atan_Float4                      = TSymbolUniqueId(3103);
-    static constexpr const TSymbolUniqueId sinh_Float1                      = TSymbolUniqueId(3104);
-    static constexpr const TSymbolUniqueId sinh_Float2                      = TSymbolUniqueId(3105);
-    static constexpr const TSymbolUniqueId sinh_Float3                      = TSymbolUniqueId(3106);
-    static constexpr const TSymbolUniqueId sinh_Float4                      = TSymbolUniqueId(3107);
-    static constexpr const TSymbolUniqueId cosh_Float1                      = TSymbolUniqueId(3108);
-    static constexpr const TSymbolUniqueId cosh_Float2                      = TSymbolUniqueId(3109);
-    static constexpr const TSymbolUniqueId cosh_Float3                      = TSymbolUniqueId(3110);
-    static constexpr const TSymbolUniqueId cosh_Float4                      = TSymbolUniqueId(3111);
-    static constexpr const TSymbolUniqueId tanh_Float1                      = TSymbolUniqueId(3112);
-    static constexpr const TSymbolUniqueId tanh_Float2                      = TSymbolUniqueId(3113);
-    static constexpr const TSymbolUniqueId tanh_Float3                      = TSymbolUniqueId(3114);
-    static constexpr const TSymbolUniqueId tanh_Float4                      = TSymbolUniqueId(3115);
-    static constexpr const TSymbolUniqueId asinh_Float1                     = TSymbolUniqueId(3116);
-    static constexpr const TSymbolUniqueId asinh_Float2                     = TSymbolUniqueId(3117);
-    static constexpr const TSymbolUniqueId asinh_Float3                     = TSymbolUniqueId(3118);
-    static constexpr const TSymbolUniqueId asinh_Float4                     = TSymbolUniqueId(3119);
-    static constexpr const TSymbolUniqueId acosh_Float1                     = TSymbolUniqueId(3120);
-    static constexpr const TSymbolUniqueId acosh_Float2                     = TSymbolUniqueId(3121);
-    static constexpr const TSymbolUniqueId acosh_Float3                     = TSymbolUniqueId(3122);
-    static constexpr const TSymbolUniqueId acosh_Float4                     = TSymbolUniqueId(3123);
-    static constexpr const TSymbolUniqueId atanh_Float1                     = TSymbolUniqueId(3124);
-    static constexpr const TSymbolUniqueId atanh_Float2                     = TSymbolUniqueId(3125);
-    static constexpr const TSymbolUniqueId atanh_Float3                     = TSymbolUniqueId(3126);
-    static constexpr const TSymbolUniqueId atanh_Float4                     = TSymbolUniqueId(3127);
-    static constexpr const TSymbolUniqueId pow_Float1_Float1                = TSymbolUniqueId(3128);
-    static constexpr const TSymbolUniqueId pow_Float2_Float2                = TSymbolUniqueId(3129);
-    static constexpr const TSymbolUniqueId pow_Float3_Float3                = TSymbolUniqueId(3130);
-    static constexpr const TSymbolUniqueId pow_Float4_Float4                = TSymbolUniqueId(3131);
-    static constexpr const TSymbolUniqueId exp_Float1                       = TSymbolUniqueId(3132);
-    static constexpr const TSymbolUniqueId exp_Float2                       = TSymbolUniqueId(3133);
-    static constexpr const TSymbolUniqueId exp_Float3                       = TSymbolUniqueId(3134);
-    static constexpr const TSymbolUniqueId exp_Float4                       = TSymbolUniqueId(3135);
-    static constexpr const TSymbolUniqueId log_Float1                       = TSymbolUniqueId(3136);
-    static constexpr const TSymbolUniqueId log_Float2                       = TSymbolUniqueId(3137);
-    static constexpr const TSymbolUniqueId log_Float3                       = TSymbolUniqueId(3138);
-    static constexpr const TSymbolUniqueId log_Float4                       = TSymbolUniqueId(3139);
-    static constexpr const TSymbolUniqueId exp2_Float1                      = TSymbolUniqueId(3140);
-    static constexpr const TSymbolUniqueId exp2_Float2                      = TSymbolUniqueId(3141);
-    static constexpr const TSymbolUniqueId exp2_Float3                      = TSymbolUniqueId(3142);
-    static constexpr const TSymbolUniqueId exp2_Float4                      = TSymbolUniqueId(3143);
-    static constexpr const TSymbolUniqueId log2_Float1                      = TSymbolUniqueId(3144);
-    static constexpr const TSymbolUniqueId log2_Float2                      = TSymbolUniqueId(3145);
-    static constexpr const TSymbolUniqueId log2_Float3                      = TSymbolUniqueId(3146);
-    static constexpr const TSymbolUniqueId log2_Float4                      = TSymbolUniqueId(3147);
-    static constexpr const TSymbolUniqueId sqrt_Float1                      = TSymbolUniqueId(3148);
-    static constexpr const TSymbolUniqueId sqrt_Float2                      = TSymbolUniqueId(3149);
-    static constexpr const TSymbolUniqueId sqrt_Float3                      = TSymbolUniqueId(3150);
-    static constexpr const TSymbolUniqueId sqrt_Float4                      = TSymbolUniqueId(3151);
-    static constexpr const TSymbolUniqueId inversesqrt_Float1               = TSymbolUniqueId(3152);
-    static constexpr const TSymbolUniqueId inversesqrt_Float2               = TSymbolUniqueId(3153);
-    static constexpr const TSymbolUniqueId inversesqrt_Float3               = TSymbolUniqueId(3154);
-    static constexpr const TSymbolUniqueId inversesqrt_Float4               = TSymbolUniqueId(3155);
-    static constexpr const TSymbolUniqueId abs_Float1                       = TSymbolUniqueId(3156);
-    static constexpr const TSymbolUniqueId abs_Float2                       = TSymbolUniqueId(3157);
-    static constexpr const TSymbolUniqueId abs_Float3                       = TSymbolUniqueId(3158);
-    static constexpr const TSymbolUniqueId abs_Float4                       = TSymbolUniqueId(3159);
-    static constexpr const TSymbolUniqueId abs_Int1                         = TSymbolUniqueId(3160);
-    static constexpr const TSymbolUniqueId pt00D                            = TSymbolUniqueId(3161);
-    static constexpr const TSymbolUniqueId abs_Int2                         = TSymbolUniqueId(3162);
-    static constexpr const TSymbolUniqueId pt10D                            = TSymbolUniqueId(3163);
-    static constexpr const TSymbolUniqueId abs_Int3                         = TSymbolUniqueId(3164);
-    static constexpr const TSymbolUniqueId pt20D                            = TSymbolUniqueId(3165);
-    static constexpr const TSymbolUniqueId abs_Int4                         = TSymbolUniqueId(3166);
-    static constexpr const TSymbolUniqueId pt30D                            = TSymbolUniqueId(3167);
-    static constexpr const TSymbolUniqueId sign_Float1                      = TSymbolUniqueId(3168);
-    static constexpr const TSymbolUniqueId sign_Float2                      = TSymbolUniqueId(3169);
-    static constexpr const TSymbolUniqueId sign_Float3                      = TSymbolUniqueId(3170);
-    static constexpr const TSymbolUniqueId sign_Float4                      = TSymbolUniqueId(3171);
-    static constexpr const TSymbolUniqueId sign_Int1                        = TSymbolUniqueId(3172);
-    static constexpr const TSymbolUniqueId sign_Int2                        = TSymbolUniqueId(3173);
-    static constexpr const TSymbolUniqueId sign_Int3                        = TSymbolUniqueId(3174);
-    static constexpr const TSymbolUniqueId sign_Int4                        = TSymbolUniqueId(3175);
-    static constexpr const TSymbolUniqueId floor_Float1                     = TSymbolUniqueId(3176);
-    static constexpr const TSymbolUniqueId floor_Float2                     = TSymbolUniqueId(3177);
-    static constexpr const TSymbolUniqueId floor_Float3                     = TSymbolUniqueId(3178);
-    static constexpr const TSymbolUniqueId floor_Float4                     = TSymbolUniqueId(3179);
-    static constexpr const TSymbolUniqueId trunc_Float1                     = TSymbolUniqueId(3180);
-    static constexpr const TSymbolUniqueId trunc_Float2                     = TSymbolUniqueId(3181);
-    static constexpr const TSymbolUniqueId trunc_Float3                     = TSymbolUniqueId(3182);
-    static constexpr const TSymbolUniqueId trunc_Float4                     = TSymbolUniqueId(3183);
-    static constexpr const TSymbolUniqueId round_Float1                     = TSymbolUniqueId(3184);
-    static constexpr const TSymbolUniqueId round_Float2                     = TSymbolUniqueId(3185);
-    static constexpr const TSymbolUniqueId round_Float3                     = TSymbolUniqueId(3186);
-    static constexpr const TSymbolUniqueId round_Float4                     = TSymbolUniqueId(3187);
-    static constexpr const TSymbolUniqueId roundEven_Float1                 = TSymbolUniqueId(3188);
-    static constexpr const TSymbolUniqueId roundEven_Float2                 = TSymbolUniqueId(3189);
-    static constexpr const TSymbolUniqueId roundEven_Float3                 = TSymbolUniqueId(3190);
-    static constexpr const TSymbolUniqueId roundEven_Float4                 = TSymbolUniqueId(3191);
-    static constexpr const TSymbolUniqueId ceil_Float1                      = TSymbolUniqueId(3192);
-    static constexpr const TSymbolUniqueId ceil_Float2                      = TSymbolUniqueId(3193);
-    static constexpr const TSymbolUniqueId ceil_Float3                      = TSymbolUniqueId(3194);
-    static constexpr const TSymbolUniqueId ceil_Float4                      = TSymbolUniqueId(3195);
-    static constexpr const TSymbolUniqueId fract_Float1                     = TSymbolUniqueId(3196);
-    static constexpr const TSymbolUniqueId fract_Float2                     = TSymbolUniqueId(3197);
-    static constexpr const TSymbolUniqueId fract_Float3                     = TSymbolUniqueId(3198);
-    static constexpr const TSymbolUniqueId fract_Float4                     = TSymbolUniqueId(3199);
-    static constexpr const TSymbolUniqueId mod_Float1_Float1                = TSymbolUniqueId(3200);
-    static constexpr const TSymbolUniqueId mod_Float2_Float1                = TSymbolUniqueId(3201);
-    static constexpr const TSymbolUniqueId mod_Float3_Float1                = TSymbolUniqueId(3202);
-    static constexpr const TSymbolUniqueId mod_Float4_Float1                = TSymbolUniqueId(3203);
-    static constexpr const TSymbolUniqueId mod_Float2_Float2                = TSymbolUniqueId(3204);
-    static constexpr const TSymbolUniqueId mod_Float3_Float3                = TSymbolUniqueId(3205);
-    static constexpr const TSymbolUniqueId mod_Float4_Float4                = TSymbolUniqueId(3206);
-    static constexpr const TSymbolUniqueId min_Float1_Float1                = TSymbolUniqueId(3207);
-    static constexpr const TSymbolUniqueId min_Float2_Float1                = TSymbolUniqueId(3208);
-    static constexpr const TSymbolUniqueId min_Float3_Float1                = TSymbolUniqueId(3209);
-    static constexpr const TSymbolUniqueId min_Float4_Float1                = TSymbolUniqueId(3210);
-    static constexpr const TSymbolUniqueId min_Float2_Float2                = TSymbolUniqueId(3211);
-    static constexpr const TSymbolUniqueId min_Float3_Float3                = TSymbolUniqueId(3212);
-    static constexpr const TSymbolUniqueId min_Float4_Float4                = TSymbolUniqueId(3213);
-    static constexpr const TSymbolUniqueId min_Int1_Int1                    = TSymbolUniqueId(3214);
-    static constexpr const TSymbolUniqueId min_Int2_Int2                    = TSymbolUniqueId(3215);
-    static constexpr const TSymbolUniqueId min_Int3_Int3                    = TSymbolUniqueId(3216);
-    static constexpr const TSymbolUniqueId min_Int4_Int4                    = TSymbolUniqueId(3217);
-    static constexpr const TSymbolUniqueId min_Int2_Int1                    = TSymbolUniqueId(3218);
-    static constexpr const TSymbolUniqueId min_Int3_Int1                    = TSymbolUniqueId(3219);
-    static constexpr const TSymbolUniqueId min_Int4_Int1                    = TSymbolUniqueId(3220);
-    static constexpr const TSymbolUniqueId min_UInt1_UInt1                  = TSymbolUniqueId(3221);
-    static constexpr const TSymbolUniqueId pt00E                            = TSymbolUniqueId(3222);
-    static constexpr const TSymbolUniqueId min_UInt2_UInt2                  = TSymbolUniqueId(3223);
-    static constexpr const TSymbolUniqueId pt10E                            = TSymbolUniqueId(3224);
-    static constexpr const TSymbolUniqueId min_UInt3_UInt3                  = TSymbolUniqueId(3225);
-    static constexpr const TSymbolUniqueId pt20E                            = TSymbolUniqueId(3226);
-    static constexpr const TSymbolUniqueId min_UInt4_UInt4                  = TSymbolUniqueId(3227);
-    static constexpr const TSymbolUniqueId pt30E                            = TSymbolUniqueId(3228);
-    static constexpr const TSymbolUniqueId min_UInt2_UInt1                  = TSymbolUniqueId(3229);
-    static constexpr const TSymbolUniqueId min_UInt3_UInt1                  = TSymbolUniqueId(3230);
-    static constexpr const TSymbolUniqueId min_UInt4_UInt1                  = TSymbolUniqueId(3231);
-    static constexpr const TSymbolUniqueId max_Float1_Float1                = TSymbolUniqueId(3232);
-    static constexpr const TSymbolUniqueId max_Float2_Float1                = TSymbolUniqueId(3233);
-    static constexpr const TSymbolUniqueId max_Float3_Float1                = TSymbolUniqueId(3234);
-    static constexpr const TSymbolUniqueId max_Float4_Float1                = TSymbolUniqueId(3235);
-    static constexpr const TSymbolUniqueId max_Float2_Float2                = TSymbolUniqueId(3236);
-    static constexpr const TSymbolUniqueId max_Float3_Float3                = TSymbolUniqueId(3237);
-    static constexpr const TSymbolUniqueId max_Float4_Float4                = TSymbolUniqueId(3238);
-    static constexpr const TSymbolUniqueId max_Int1_Int1                    = TSymbolUniqueId(3239);
-    static constexpr const TSymbolUniqueId max_Int2_Int2                    = TSymbolUniqueId(3240);
-    static constexpr const TSymbolUniqueId max_Int3_Int3                    = TSymbolUniqueId(3241);
-    static constexpr const TSymbolUniqueId max_Int4_Int4                    = TSymbolUniqueId(3242);
-    static constexpr const TSymbolUniqueId max_Int2_Int1                    = TSymbolUniqueId(3243);
-    static constexpr const TSymbolUniqueId max_Int3_Int1                    = TSymbolUniqueId(3244);
-    static constexpr const TSymbolUniqueId max_Int4_Int1                    = TSymbolUniqueId(3245);
-    static constexpr const TSymbolUniqueId max_UInt1_UInt1                  = TSymbolUniqueId(3246);
-    static constexpr const TSymbolUniqueId max_UInt2_UInt2                  = TSymbolUniqueId(3247);
-    static constexpr const TSymbolUniqueId max_UInt3_UInt3                  = TSymbolUniqueId(3248);
-    static constexpr const TSymbolUniqueId max_UInt4_UInt4                  = TSymbolUniqueId(3249);
-    static constexpr const TSymbolUniqueId max_UInt2_UInt1                  = TSymbolUniqueId(3250);
-    static constexpr const TSymbolUniqueId max_UInt3_UInt1                  = TSymbolUniqueId(3251);
-    static constexpr const TSymbolUniqueId max_UInt4_UInt1                  = TSymbolUniqueId(3252);
-    static constexpr const TSymbolUniqueId clamp_Float1_Float1_Float1       = TSymbolUniqueId(3253);
-    static constexpr const TSymbolUniqueId clamp_Float2_Float1_Float1       = TSymbolUniqueId(3254);
-    static constexpr const TSymbolUniqueId clamp_Float3_Float1_Float1       = TSymbolUniqueId(3255);
-    static constexpr const TSymbolUniqueId clamp_Float4_Float1_Float1       = TSymbolUniqueId(3256);
-    static constexpr const TSymbolUniqueId clamp_Float2_Float2_Float2       = TSymbolUniqueId(3257);
-    static constexpr const TSymbolUniqueId clamp_Float3_Float3_Float3       = TSymbolUniqueId(3258);
-    static constexpr const TSymbolUniqueId clamp_Float4_Float4_Float4       = TSymbolUniqueId(3259);
-    static constexpr const TSymbolUniqueId clamp_Int1_Int1_Int1             = TSymbolUniqueId(3260);
-    static constexpr const TSymbolUniqueId clamp_Int2_Int1_Int1             = TSymbolUniqueId(3261);
-    static constexpr const TSymbolUniqueId clamp_Int3_Int1_Int1             = TSymbolUniqueId(3262);
-    static constexpr const TSymbolUniqueId clamp_Int4_Int1_Int1             = TSymbolUniqueId(3263);
-    static constexpr const TSymbolUniqueId clamp_Int2_Int2_Int2             = TSymbolUniqueId(3264);
-    static constexpr const TSymbolUniqueId clamp_Int3_Int3_Int3             = TSymbolUniqueId(3265);
-    static constexpr const TSymbolUniqueId clamp_Int4_Int4_Int4             = TSymbolUniqueId(3266);
-    static constexpr const TSymbolUniqueId clamp_UInt1_UInt1_UInt1          = TSymbolUniqueId(3267);
-    static constexpr const TSymbolUniqueId clamp_UInt2_UInt1_UInt1          = TSymbolUniqueId(3268);
-    static constexpr const TSymbolUniqueId clamp_UInt3_UInt1_UInt1          = TSymbolUniqueId(3269);
-    static constexpr const TSymbolUniqueId clamp_UInt4_UInt1_UInt1          = TSymbolUniqueId(3270);
-    static constexpr const TSymbolUniqueId clamp_UInt2_UInt2_UInt2          = TSymbolUniqueId(3271);
-    static constexpr const TSymbolUniqueId clamp_UInt3_UInt3_UInt3          = TSymbolUniqueId(3272);
-    static constexpr const TSymbolUniqueId clamp_UInt4_UInt4_UInt4          = TSymbolUniqueId(3273);
-    static constexpr const TSymbolUniqueId mix_Float1_Float1_Float1         = TSymbolUniqueId(3274);
-    static constexpr const TSymbolUniqueId mix_Float2_Float2_Float1         = TSymbolUniqueId(3275);
-    static constexpr const TSymbolUniqueId mix_Float3_Float3_Float1         = TSymbolUniqueId(3276);
-    static constexpr const TSymbolUniqueId mix_Float4_Float4_Float1         = TSymbolUniqueId(3277);
-    static constexpr const TSymbolUniqueId mix_Float2_Float2_Float2         = TSymbolUniqueId(3278);
-    static constexpr const TSymbolUniqueId mix_Float3_Float3_Float3         = TSymbolUniqueId(3279);
-    static constexpr const TSymbolUniqueId mix_Float4_Float4_Float4         = TSymbolUniqueId(3280);
-    static constexpr const TSymbolUniqueId mix_Float1_Float1_Bool1          = TSymbolUniqueId(3281);
-    static constexpr const TSymbolUniqueId pt00F                            = TSymbolUniqueId(3282);
-    static constexpr const TSymbolUniqueId mix_Float2_Float2_Bool2          = TSymbolUniqueId(3283);
-    static constexpr const TSymbolUniqueId pt10F                            = TSymbolUniqueId(3284);
-    static constexpr const TSymbolUniqueId mix_Float3_Float3_Bool3          = TSymbolUniqueId(3285);
-    static constexpr const TSymbolUniqueId pt20F                            = TSymbolUniqueId(3286);
-    static constexpr const TSymbolUniqueId mix_Float4_Float4_Bool4          = TSymbolUniqueId(3287);
-    static constexpr const TSymbolUniqueId pt30F                            = TSymbolUniqueId(3288);
-    static constexpr const TSymbolUniqueId mix_Int1_Int1_Bool1              = TSymbolUniqueId(3289);
-    static constexpr const TSymbolUniqueId mix_Int2_Int2_Bool2              = TSymbolUniqueId(3290);
-    static constexpr const TSymbolUniqueId mix_Int3_Int3_Bool3              = TSymbolUniqueId(3291);
-    static constexpr const TSymbolUniqueId mix_Int4_Int4_Bool4              = TSymbolUniqueId(3292);
-    static constexpr const TSymbolUniqueId mix_UInt1_UInt1_Bool1            = TSymbolUniqueId(3293);
-    static constexpr const TSymbolUniqueId mix_UInt2_UInt2_Bool2            = TSymbolUniqueId(3294);
-    static constexpr const TSymbolUniqueId mix_UInt3_UInt3_Bool3            = TSymbolUniqueId(3295);
-    static constexpr const TSymbolUniqueId mix_UInt4_UInt4_Bool4            = TSymbolUniqueId(3296);
-    static constexpr const TSymbolUniqueId mix_Bool1_Bool1_Bool1            = TSymbolUniqueId(3297);
-    static constexpr const TSymbolUniqueId mix_Bool2_Bool2_Bool2            = TSymbolUniqueId(3298);
-    static constexpr const TSymbolUniqueId mix_Bool3_Bool3_Bool3            = TSymbolUniqueId(3299);
-    static constexpr const TSymbolUniqueId mix_Bool4_Bool4_Bool4            = TSymbolUniqueId(3300);
-    static constexpr const TSymbolUniqueId step_Float1_Float1               = TSymbolUniqueId(3301);
-    static constexpr const TSymbolUniqueId step_Float2_Float2               = TSymbolUniqueId(3302);
-    static constexpr const TSymbolUniqueId step_Float3_Float3               = TSymbolUniqueId(3303);
-    static constexpr const TSymbolUniqueId step_Float4_Float4               = TSymbolUniqueId(3304);
-    static constexpr const TSymbolUniqueId step_Float1_Float2               = TSymbolUniqueId(3305);
-    static constexpr const TSymbolUniqueId step_Float1_Float3               = TSymbolUniqueId(3306);
-    static constexpr const TSymbolUniqueId step_Float1_Float4               = TSymbolUniqueId(3307);
-    static constexpr const TSymbolUniqueId smoothstep_Float1_Float1_Float1  = TSymbolUniqueId(3308);
-    static constexpr const TSymbolUniqueId smoothstep_Float2_Float2_Float2  = TSymbolUniqueId(3309);
-    static constexpr const TSymbolUniqueId smoothstep_Float3_Float3_Float3  = TSymbolUniqueId(3310);
-    static constexpr const TSymbolUniqueId smoothstep_Float4_Float4_Float4  = TSymbolUniqueId(3311);
-    static constexpr const TSymbolUniqueId smoothstep_Float1_Float1_Float2  = TSymbolUniqueId(3312);
-    static constexpr const TSymbolUniqueId smoothstep_Float1_Float1_Float3  = TSymbolUniqueId(3313);
-    static constexpr const TSymbolUniqueId smoothstep_Float1_Float1_Float4  = TSymbolUniqueId(3314);
-    static constexpr const TSymbolUniqueId modf_Float1_Float1               = TSymbolUniqueId(3315);
-    static constexpr const TSymbolUniqueId pt_o_00B                         = TSymbolUniqueId(3316);
-    static constexpr const TSymbolUniqueId modf_Float2_Float2               = TSymbolUniqueId(3317);
-    static constexpr const TSymbolUniqueId pt_o_10B                         = TSymbolUniqueId(3318);
-    static constexpr const TSymbolUniqueId modf_Float3_Float3               = TSymbolUniqueId(3319);
-    static constexpr const TSymbolUniqueId pt_o_20B                         = TSymbolUniqueId(3320);
-    static constexpr const TSymbolUniqueId modf_Float4_Float4               = TSymbolUniqueId(3321);
-    static constexpr const TSymbolUniqueId pt_o_30B                         = TSymbolUniqueId(3322);
-    static constexpr const TSymbolUniqueId isnan_Float1                     = TSymbolUniqueId(3323);
-    static constexpr const TSymbolUniqueId isnan_Float2                     = TSymbolUniqueId(3324);
-    static constexpr const TSymbolUniqueId isnan_Float3                     = TSymbolUniqueId(3325);
-    static constexpr const TSymbolUniqueId isnan_Float4                     = TSymbolUniqueId(3326);
-    static constexpr const TSymbolUniqueId isinf_Float1                     = TSymbolUniqueId(3327);
-    static constexpr const TSymbolUniqueId isinf_Float2                     = TSymbolUniqueId(3328);
-    static constexpr const TSymbolUniqueId isinf_Float3                     = TSymbolUniqueId(3329);
-    static constexpr const TSymbolUniqueId isinf_Float4                     = TSymbolUniqueId(3330);
-    static constexpr const TSymbolUniqueId floatBitsToInt_Float1            = TSymbolUniqueId(3331);
-    static constexpr const TSymbolUniqueId floatBitsToInt_Float2            = TSymbolUniqueId(3332);
-    static constexpr const TSymbolUniqueId floatBitsToInt_Float3            = TSymbolUniqueId(3333);
-    static constexpr const TSymbolUniqueId floatBitsToInt_Float4            = TSymbolUniqueId(3334);
-    static constexpr const TSymbolUniqueId floatBitsToUint_Float1           = TSymbolUniqueId(3335);
-    static constexpr const TSymbolUniqueId floatBitsToUint_Float2           = TSymbolUniqueId(3336);
-    static constexpr const TSymbolUniqueId floatBitsToUint_Float3           = TSymbolUniqueId(3337);
-    static constexpr const TSymbolUniqueId floatBitsToUint_Float4           = TSymbolUniqueId(3338);
-    static constexpr const TSymbolUniqueId intBitsToFloat_Int1              = TSymbolUniqueId(3339);
-    static constexpr const TSymbolUniqueId intBitsToFloat_Int2              = TSymbolUniqueId(3340);
-    static constexpr const TSymbolUniqueId intBitsToFloat_Int3              = TSymbolUniqueId(3341);
-    static constexpr const TSymbolUniqueId intBitsToFloat_Int4              = TSymbolUniqueId(3342);
-    static constexpr const TSymbolUniqueId uintBitsToFloat_UInt1            = TSymbolUniqueId(3343);
-    static constexpr const TSymbolUniqueId uintBitsToFloat_UInt2            = TSymbolUniqueId(3344);
-    static constexpr const TSymbolUniqueId uintBitsToFloat_UInt3            = TSymbolUniqueId(3345);
-    static constexpr const TSymbolUniqueId uintBitsToFloat_UInt4            = TSymbolUniqueId(3346);
-    static constexpr const TSymbolUniqueId fma_Float1_Float1_Float1         = TSymbolUniqueId(3347);
-    static constexpr const TSymbolUniqueId fma_Float2_Float2_Float2         = TSymbolUniqueId(3348);
-    static constexpr const TSymbolUniqueId fma_Float3_Float3_Float3         = TSymbolUniqueId(3349);
-    static constexpr const TSymbolUniqueId fma_Float4_Float4_Float4         = TSymbolUniqueId(3350);
-    static constexpr const TSymbolUniqueId fmaExt_Float1_Float1_Float1      = TSymbolUniqueId(3351);
-    static constexpr const TSymbolUniqueId fmaExt_Float2_Float2_Float2      = TSymbolUniqueId(3352);
-    static constexpr const TSymbolUniqueId fmaExt_Float3_Float3_Float3      = TSymbolUniqueId(3353);
-    static constexpr const TSymbolUniqueId fmaExt_Float4_Float4_Float4      = TSymbolUniqueId(3354);
-    static constexpr const TSymbolUniqueId frexp_Float1_Int1                = TSymbolUniqueId(3355);
-    static constexpr const TSymbolUniqueId pt_o_00D                         = TSymbolUniqueId(3356);
-    static constexpr const TSymbolUniqueId frexp_Float2_Int2                = TSymbolUniqueId(3357);
-    static constexpr const TSymbolUniqueId pt_o_10D                         = TSymbolUniqueId(3358);
-    static constexpr const TSymbolUniqueId frexp_Float3_Int3                = TSymbolUniqueId(3359);
-    static constexpr const TSymbolUniqueId pt_o_20D                         = TSymbolUniqueId(3360);
-    static constexpr const TSymbolUniqueId frexp_Float4_Int4                = TSymbolUniqueId(3361);
-    static constexpr const TSymbolUniqueId pt_o_30D                         = TSymbolUniqueId(3362);
-    static constexpr const TSymbolUniqueId ldexp_Float1_Int1                = TSymbolUniqueId(3363);
-    static constexpr const TSymbolUniqueId ldexp_Float2_Int2                = TSymbolUniqueId(3364);
-    static constexpr const TSymbolUniqueId ldexp_Float3_Int3                = TSymbolUniqueId(3365);
-    static constexpr const TSymbolUniqueId ldexp_Float4_Int4                = TSymbolUniqueId(3366);
-    static constexpr const TSymbolUniqueId packSnorm2x16_Float2             = TSymbolUniqueId(3367);
-    static constexpr const TSymbolUniqueId packHalf2x16_Float2              = TSymbolUniqueId(3368);
-    static constexpr const TSymbolUniqueId unpackSnorm2x16_UInt1            = TSymbolUniqueId(3369);
-    static constexpr const TSymbolUniqueId unpackHalf2x16_UInt1             = TSymbolUniqueId(3370);
-    static constexpr const TSymbolUniqueId packUnorm2x16_Float2             = TSymbolUniqueId(3371);
-    static constexpr const TSymbolUniqueId unpackUnorm2x16_UInt1            = TSymbolUniqueId(3372);
-    static constexpr const TSymbolUniqueId packUnorm4x8_Float4              = TSymbolUniqueId(3373);
-    static constexpr const TSymbolUniqueId packSnorm4x8_Float4              = TSymbolUniqueId(3374);
-    static constexpr const TSymbolUniqueId unpackUnorm4x8_UInt1             = TSymbolUniqueId(3375);
-    static constexpr const TSymbolUniqueId unpackSnorm4x8_UInt1             = TSymbolUniqueId(3376);
-    static constexpr const TSymbolUniqueId length_Float1                    = TSymbolUniqueId(3377);
-    static constexpr const TSymbolUniqueId length_Float2                    = TSymbolUniqueId(3378);
-    static constexpr const TSymbolUniqueId length_Float3                    = TSymbolUniqueId(3379);
-    static constexpr const TSymbolUniqueId length_Float4                    = TSymbolUniqueId(3380);
-    static constexpr const TSymbolUniqueId distance_Float1_Float1           = TSymbolUniqueId(3381);
-    static constexpr const TSymbolUniqueId distance_Float2_Float2           = TSymbolUniqueId(3382);
-    static constexpr const TSymbolUniqueId distance_Float3_Float3           = TSymbolUniqueId(3383);
-    static constexpr const TSymbolUniqueId distance_Float4_Float4           = TSymbolUniqueId(3384);
-    static constexpr const TSymbolUniqueId dot_Float1_Float1                = TSymbolUniqueId(3385);
-    static constexpr const TSymbolUniqueId dot_Float2_Float2                = TSymbolUniqueId(3386);
-    static constexpr const TSymbolUniqueId dot_Float3_Float3                = TSymbolUniqueId(3387);
-    static constexpr const TSymbolUniqueId dot_Float4_Float4                = TSymbolUniqueId(3388);
-    static constexpr const TSymbolUniqueId cross_Float3_Float3              = TSymbolUniqueId(3389);
-    static constexpr const TSymbolUniqueId normalize_Float1                 = TSymbolUniqueId(3390);
-    static constexpr const TSymbolUniqueId normalize_Float2                 = TSymbolUniqueId(3391);
-    static constexpr const TSymbolUniqueId normalize_Float3                 = TSymbolUniqueId(3392);
-    static constexpr const TSymbolUniqueId normalize_Float4                 = TSymbolUniqueId(3393);
-    static constexpr const TSymbolUniqueId faceforward_Float1_Float1_Float1 = TSymbolUniqueId(3394);
-    static constexpr const TSymbolUniqueId faceforward_Float2_Float2_Float2 = TSymbolUniqueId(3395);
-    static constexpr const TSymbolUniqueId faceforward_Float3_Float3_Float3 = TSymbolUniqueId(3396);
-    static constexpr const TSymbolUniqueId faceforward_Float4_Float4_Float4 = TSymbolUniqueId(3397);
-    static constexpr const TSymbolUniqueId reflect_Float1_Float1            = TSymbolUniqueId(3398);
-    static constexpr const TSymbolUniqueId reflect_Float2_Float2            = TSymbolUniqueId(3399);
-    static constexpr const TSymbolUniqueId reflect_Float3_Float3            = TSymbolUniqueId(3400);
-    static constexpr const TSymbolUniqueId reflect_Float4_Float4            = TSymbolUniqueId(3401);
-    static constexpr const TSymbolUniqueId refract_Float1_Float1_Float1     = TSymbolUniqueId(3402);
-    static constexpr const TSymbolUniqueId refract_Float2_Float2_Float1     = TSymbolUniqueId(3403);
-    static constexpr const TSymbolUniqueId refract_Float3_Float3_Float1     = TSymbolUniqueId(3404);
-    static constexpr const TSymbolUniqueId refract_Float4_Float4_Float1     = TSymbolUniqueId(3405);
-    static constexpr const TSymbolUniqueId matrixCompMult_Float2x2_Float2x2 = TSymbolUniqueId(3406);
-    static constexpr const TSymbolUniqueId pt50B                            = TSymbolUniqueId(3407);
-    static constexpr const TSymbolUniqueId matrixCompMult_Float3x3_Float3x3 = TSymbolUniqueId(3408);
-    static constexpr const TSymbolUniqueId ptA0B                            = TSymbolUniqueId(3409);
-    static constexpr const TSymbolUniqueId matrixCompMult_Float4x4_Float4x4 = TSymbolUniqueId(3410);
-    static constexpr const TSymbolUniqueId ptF0B                            = TSymbolUniqueId(3411);
-    static constexpr const TSymbolUniqueId matrixCompMult_Float2x3_Float2x3 = TSymbolUniqueId(3412);
-    static constexpr const TSymbolUniqueId pt90B                            = TSymbolUniqueId(3413);
-    static constexpr const TSymbolUniqueId matrixCompMult_Float3x2_Float3x2 = TSymbolUniqueId(3414);
-    static constexpr const TSymbolUniqueId pt60B                            = TSymbolUniqueId(3415);
-    static constexpr const TSymbolUniqueId matrixCompMult_Float2x4_Float2x4 = TSymbolUniqueId(3416);
-    static constexpr const TSymbolUniqueId ptD0B                            = TSymbolUniqueId(3417);
-    static constexpr const TSymbolUniqueId matrixCompMult_Float4x2_Float4x2 = TSymbolUniqueId(3418);
-    static constexpr const TSymbolUniqueId pt70B                            = TSymbolUniqueId(3419);
-    static constexpr const TSymbolUniqueId matrixCompMult_Float3x4_Float3x4 = TSymbolUniqueId(3420);
-    static constexpr const TSymbolUniqueId ptE0B                            = TSymbolUniqueId(3421);
-    static constexpr const TSymbolUniqueId matrixCompMult_Float4x3_Float4x3 = TSymbolUniqueId(3422);
-    static constexpr const TSymbolUniqueId ptB0B                            = TSymbolUniqueId(3423);
-    static constexpr const TSymbolUniqueId outerProduct_Float2_Float2       = TSymbolUniqueId(3424);
-    static constexpr const TSymbolUniqueId outerProduct_Float3_Float3       = TSymbolUniqueId(3425);
-    static constexpr const TSymbolUniqueId outerProduct_Float4_Float4       = TSymbolUniqueId(3426);
-    static constexpr const TSymbolUniqueId outerProduct_Float3_Float2       = TSymbolUniqueId(3427);
-    static constexpr const TSymbolUniqueId outerProduct_Float2_Float3       = TSymbolUniqueId(3428);
-    static constexpr const TSymbolUniqueId outerProduct_Float4_Float2       = TSymbolUniqueId(3429);
-    static constexpr const TSymbolUniqueId outerProduct_Float2_Float4       = TSymbolUniqueId(3430);
-    static constexpr const TSymbolUniqueId outerProduct_Float4_Float3       = TSymbolUniqueId(3431);
-    static constexpr const TSymbolUniqueId outerProduct_Float3_Float4       = TSymbolUniqueId(3432);
-    static constexpr const TSymbolUniqueId transpose_Float2x2               = TSymbolUniqueId(3433);
-    static constexpr const TSymbolUniqueId transpose_Float3x3               = TSymbolUniqueId(3434);
-    static constexpr const TSymbolUniqueId transpose_Float4x4               = TSymbolUniqueId(3435);
-    static constexpr const TSymbolUniqueId transpose_Float3x2               = TSymbolUniqueId(3436);
-    static constexpr const TSymbolUniqueId transpose_Float2x3               = TSymbolUniqueId(3437);
-    static constexpr const TSymbolUniqueId transpose_Float4x2               = TSymbolUniqueId(3438);
-    static constexpr const TSymbolUniqueId transpose_Float2x4               = TSymbolUniqueId(3439);
-    static constexpr const TSymbolUniqueId transpose_Float4x3               = TSymbolUniqueId(3440);
-    static constexpr const TSymbolUniqueId transpose_Float3x4               = TSymbolUniqueId(3441);
-    static constexpr const TSymbolUniqueId determinant_Float2x2             = TSymbolUniqueId(3442);
-    static constexpr const TSymbolUniqueId determinant_Float3x3             = TSymbolUniqueId(3443);
-    static constexpr const TSymbolUniqueId determinant_Float4x4             = TSymbolUniqueId(3444);
-    static constexpr const TSymbolUniqueId inverse_Float2x2                 = TSymbolUniqueId(3445);
-    static constexpr const TSymbolUniqueId inverse_Float3x3                 = TSymbolUniqueId(3446);
-    static constexpr const TSymbolUniqueId inverse_Float4x4                 = TSymbolUniqueId(3447);
-    static constexpr const TSymbolUniqueId lessThan_Float2_Float2           = TSymbolUniqueId(3448);
-    static constexpr const TSymbolUniqueId lessThan_Float3_Float3           = TSymbolUniqueId(3449);
-    static constexpr const TSymbolUniqueId lessThan_Float4_Float4           = TSymbolUniqueId(3450);
-    static constexpr const TSymbolUniqueId lessThan_Int2_Int2               = TSymbolUniqueId(3451);
-    static constexpr const TSymbolUniqueId lessThan_Int3_Int3               = TSymbolUniqueId(3452);
-    static constexpr const TSymbolUniqueId lessThan_Int4_Int4               = TSymbolUniqueId(3453);
-    static constexpr const TSymbolUniqueId lessThan_UInt2_UInt2             = TSymbolUniqueId(3454);
-    static constexpr const TSymbolUniqueId lessThan_UInt3_UInt3             = TSymbolUniqueId(3455);
-    static constexpr const TSymbolUniqueId lessThan_UInt4_UInt4             = TSymbolUniqueId(3456);
-    static constexpr const TSymbolUniqueId lessThanEqual_Float2_Float2      = TSymbolUniqueId(3457);
-    static constexpr const TSymbolUniqueId lessThanEqual_Float3_Float3      = TSymbolUniqueId(3458);
-    static constexpr const TSymbolUniqueId lessThanEqual_Float4_Float4      = TSymbolUniqueId(3459);
-    static constexpr const TSymbolUniqueId lessThanEqual_Int2_Int2          = TSymbolUniqueId(3460);
-    static constexpr const TSymbolUniqueId lessThanEqual_Int3_Int3          = TSymbolUniqueId(3461);
-    static constexpr const TSymbolUniqueId lessThanEqual_Int4_Int4          = TSymbolUniqueId(3462);
-    static constexpr const TSymbolUniqueId lessThanEqual_UInt2_UInt2        = TSymbolUniqueId(3463);
-    static constexpr const TSymbolUniqueId lessThanEqual_UInt3_UInt3        = TSymbolUniqueId(3464);
-    static constexpr const TSymbolUniqueId lessThanEqual_UInt4_UInt4        = TSymbolUniqueId(3465);
-    static constexpr const TSymbolUniqueId greaterThan_Float2_Float2        = TSymbolUniqueId(3466);
-    static constexpr const TSymbolUniqueId greaterThan_Float3_Float3        = TSymbolUniqueId(3467);
-    static constexpr const TSymbolUniqueId greaterThan_Float4_Float4        = TSymbolUniqueId(3468);
-    static constexpr const TSymbolUniqueId greaterThan_Int2_Int2            = TSymbolUniqueId(3469);
-    static constexpr const TSymbolUniqueId greaterThan_Int3_Int3            = TSymbolUniqueId(3470);
-    static constexpr const TSymbolUniqueId greaterThan_Int4_Int4            = TSymbolUniqueId(3471);
-    static constexpr const TSymbolUniqueId greaterThan_UInt2_UInt2          = TSymbolUniqueId(3472);
-    static constexpr const TSymbolUniqueId greaterThan_UInt3_UInt3          = TSymbolUniqueId(3473);
-    static constexpr const TSymbolUniqueId greaterThan_UInt4_UInt4          = TSymbolUniqueId(3474);
-    static constexpr const TSymbolUniqueId greaterThanEqual_Float2_Float2   = TSymbolUniqueId(3475);
-    static constexpr const TSymbolUniqueId greaterThanEqual_Float3_Float3   = TSymbolUniqueId(3476);
-    static constexpr const TSymbolUniqueId greaterThanEqual_Float4_Float4   = TSymbolUniqueId(3477);
-    static constexpr const TSymbolUniqueId greaterThanEqual_Int2_Int2       = TSymbolUniqueId(3478);
-    static constexpr const TSymbolUniqueId greaterThanEqual_Int3_Int3       = TSymbolUniqueId(3479);
-    static constexpr const TSymbolUniqueId greaterThanEqual_Int4_Int4       = TSymbolUniqueId(3480);
-    static constexpr const TSymbolUniqueId greaterThanEqual_UInt2_UInt2     = TSymbolUniqueId(3481);
-    static constexpr const TSymbolUniqueId greaterThanEqual_UInt3_UInt3     = TSymbolUniqueId(3482);
-    static constexpr const TSymbolUniqueId greaterThanEqual_UInt4_UInt4     = TSymbolUniqueId(3483);
-    static constexpr const TSymbolUniqueId equal_Float2_Float2              = TSymbolUniqueId(3484);
-    static constexpr const TSymbolUniqueId equal_Float3_Float3              = TSymbolUniqueId(3485);
-    static constexpr const TSymbolUniqueId equal_Float4_Float4              = TSymbolUniqueId(3486);
-    static constexpr const TSymbolUniqueId equal_Int2_Int2                  = TSymbolUniqueId(3487);
-    static constexpr const TSymbolUniqueId equal_Int3_Int3                  = TSymbolUniqueId(3488);
-    static constexpr const TSymbolUniqueId equal_Int4_Int4                  = TSymbolUniqueId(3489);
-    static constexpr const TSymbolUniqueId equal_UInt2_UInt2                = TSymbolUniqueId(3490);
-    static constexpr const TSymbolUniqueId equal_UInt3_UInt3                = TSymbolUniqueId(3491);
-    static constexpr const TSymbolUniqueId equal_UInt4_UInt4                = TSymbolUniqueId(3492);
-    static constexpr const TSymbolUniqueId equal_Bool2_Bool2                = TSymbolUniqueId(3493);
-    static constexpr const TSymbolUniqueId equal_Bool3_Bool3                = TSymbolUniqueId(3494);
-    static constexpr const TSymbolUniqueId equal_Bool4_Bool4                = TSymbolUniqueId(3495);
-    static constexpr const TSymbolUniqueId notEqual_Float2_Float2           = TSymbolUniqueId(3496);
-    static constexpr const TSymbolUniqueId notEqual_Float3_Float3           = TSymbolUniqueId(3497);
-    static constexpr const TSymbolUniqueId notEqual_Float4_Float4           = TSymbolUniqueId(3498);
-    static constexpr const TSymbolUniqueId notEqual_Int2_Int2               = TSymbolUniqueId(3499);
-    static constexpr const TSymbolUniqueId notEqual_Int3_Int3               = TSymbolUniqueId(3500);
-    static constexpr const TSymbolUniqueId notEqual_Int4_Int4               = TSymbolUniqueId(3501);
-    static constexpr const TSymbolUniqueId notEqual_UInt2_UInt2             = TSymbolUniqueId(3502);
-    static constexpr const TSymbolUniqueId notEqual_UInt3_UInt3             = TSymbolUniqueId(3503);
-    static constexpr const TSymbolUniqueId notEqual_UInt4_UInt4             = TSymbolUniqueId(3504);
-    static constexpr const TSymbolUniqueId notEqual_Bool2_Bool2             = TSymbolUniqueId(3505);
-    static constexpr const TSymbolUniqueId notEqual_Bool3_Bool3             = TSymbolUniqueId(3506);
-    static constexpr const TSymbolUniqueId notEqual_Bool4_Bool4             = TSymbolUniqueId(3507);
-    static constexpr const TSymbolUniqueId any_Bool2                        = TSymbolUniqueId(3508);
-    static constexpr const TSymbolUniqueId any_Bool3                        = TSymbolUniqueId(3509);
-    static constexpr const TSymbolUniqueId any_Bool4                        = TSymbolUniqueId(3510);
-    static constexpr const TSymbolUniqueId all_Bool2                        = TSymbolUniqueId(3511);
-    static constexpr const TSymbolUniqueId all_Bool3                        = TSymbolUniqueId(3512);
-    static constexpr const TSymbolUniqueId all_Bool4                        = TSymbolUniqueId(3513);
-    static constexpr const TSymbolUniqueId notFunc_Bool2                    = TSymbolUniqueId(3514);
-    static constexpr const TSymbolUniqueId notFunc_Bool3                    = TSymbolUniqueId(3515);
-    static constexpr const TSymbolUniqueId notFunc_Bool4                    = TSymbolUniqueId(3516);
-    static constexpr const TSymbolUniqueId bitfieldExtract_Int1_Int1_Int1   = TSymbolUniqueId(3517);
-    static constexpr const TSymbolUniqueId bitfieldExtract_Int2_Int1_Int1   = TSymbolUniqueId(3518);
-    static constexpr const TSymbolUniqueId bitfieldExtract_Int3_Int1_Int1   = TSymbolUniqueId(3519);
-    static constexpr const TSymbolUniqueId bitfieldExtract_Int4_Int1_Int1   = TSymbolUniqueId(3520);
-    static constexpr const TSymbolUniqueId bitfieldExtract_UInt1_Int1_Int1  = TSymbolUniqueId(3521);
-    static constexpr const TSymbolUniqueId bitfieldExtract_UInt2_Int1_Int1  = TSymbolUniqueId(3522);
-    static constexpr const TSymbolUniqueId bitfieldExtract_UInt3_Int1_Int1  = TSymbolUniqueId(3523);
-    static constexpr const TSymbolUniqueId bitfieldExtract_UInt4_Int1_Int1  = TSymbolUniqueId(3524);
+    static constexpr const TSymbolUniqueId radians_Float1                   = TSymbolUniqueId(3069);
+    static constexpr const TSymbolUniqueId pt00B                            = TSymbolUniqueId(3070);
+    static constexpr const TSymbolUniqueId radians_Float2                   = TSymbolUniqueId(3071);
+    static constexpr const TSymbolUniqueId pt10B                            = TSymbolUniqueId(3072);
+    static constexpr const TSymbolUniqueId radians_Float3                   = TSymbolUniqueId(3073);
+    static constexpr const TSymbolUniqueId pt20B                            = TSymbolUniqueId(3074);
+    static constexpr const TSymbolUniqueId radians_Float4                   = TSymbolUniqueId(3075);
+    static constexpr const TSymbolUniqueId pt30B                            = TSymbolUniqueId(3076);
+    static constexpr const TSymbolUniqueId degrees_Float1                   = TSymbolUniqueId(3077);
+    static constexpr const TSymbolUniqueId degrees_Float2                   = TSymbolUniqueId(3078);
+    static constexpr const TSymbolUniqueId degrees_Float3                   = TSymbolUniqueId(3079);
+    static constexpr const TSymbolUniqueId degrees_Float4                   = TSymbolUniqueId(3080);
+    static constexpr const TSymbolUniqueId sin_Float1                       = TSymbolUniqueId(3081);
+    static constexpr const TSymbolUniqueId sin_Float2                       = TSymbolUniqueId(3082);
+    static constexpr const TSymbolUniqueId sin_Float3                       = TSymbolUniqueId(3083);
+    static constexpr const TSymbolUniqueId sin_Float4                       = TSymbolUniqueId(3084);
+    static constexpr const TSymbolUniqueId cos_Float1                       = TSymbolUniqueId(3085);
+    static constexpr const TSymbolUniqueId cos_Float2                       = TSymbolUniqueId(3086);
+    static constexpr const TSymbolUniqueId cos_Float3                       = TSymbolUniqueId(3087);
+    static constexpr const TSymbolUniqueId cos_Float4                       = TSymbolUniqueId(3088);
+    static constexpr const TSymbolUniqueId tan_Float1                       = TSymbolUniqueId(3089);
+    static constexpr const TSymbolUniqueId tan_Float2                       = TSymbolUniqueId(3090);
+    static constexpr const TSymbolUniqueId tan_Float3                       = TSymbolUniqueId(3091);
+    static constexpr const TSymbolUniqueId tan_Float4                       = TSymbolUniqueId(3092);
+    static constexpr const TSymbolUniqueId asin_Float1                      = TSymbolUniqueId(3093);
+    static constexpr const TSymbolUniqueId asin_Float2                      = TSymbolUniqueId(3094);
+    static constexpr const TSymbolUniqueId asin_Float3                      = TSymbolUniqueId(3095);
+    static constexpr const TSymbolUniqueId asin_Float4                      = TSymbolUniqueId(3096);
+    static constexpr const TSymbolUniqueId acos_Float1                      = TSymbolUniqueId(3097);
+    static constexpr const TSymbolUniqueId acos_Float2                      = TSymbolUniqueId(3098);
+    static constexpr const TSymbolUniqueId acos_Float3                      = TSymbolUniqueId(3099);
+    static constexpr const TSymbolUniqueId acos_Float4                      = TSymbolUniqueId(3100);
+    static constexpr const TSymbolUniqueId atan_Float1_Float1               = TSymbolUniqueId(3101);
+    static constexpr const TSymbolUniqueId atan_Float2_Float2               = TSymbolUniqueId(3102);
+    static constexpr const TSymbolUniqueId atan_Float3_Float3               = TSymbolUniqueId(3103);
+    static constexpr const TSymbolUniqueId atan_Float4_Float4               = TSymbolUniqueId(3104);
+    static constexpr const TSymbolUniqueId atan_Float1                      = TSymbolUniqueId(3105);
+    static constexpr const TSymbolUniqueId atan_Float2                      = TSymbolUniqueId(3106);
+    static constexpr const TSymbolUniqueId atan_Float3                      = TSymbolUniqueId(3107);
+    static constexpr const TSymbolUniqueId atan_Float4                      = TSymbolUniqueId(3108);
+    static constexpr const TSymbolUniqueId sinh_Float1                      = TSymbolUniqueId(3109);
+    static constexpr const TSymbolUniqueId sinh_Float2                      = TSymbolUniqueId(3110);
+    static constexpr const TSymbolUniqueId sinh_Float3                      = TSymbolUniqueId(3111);
+    static constexpr const TSymbolUniqueId sinh_Float4                      = TSymbolUniqueId(3112);
+    static constexpr const TSymbolUniqueId cosh_Float1                      = TSymbolUniqueId(3113);
+    static constexpr const TSymbolUniqueId cosh_Float2                      = TSymbolUniqueId(3114);
+    static constexpr const TSymbolUniqueId cosh_Float3                      = TSymbolUniqueId(3115);
+    static constexpr const TSymbolUniqueId cosh_Float4                      = TSymbolUniqueId(3116);
+    static constexpr const TSymbolUniqueId tanh_Float1                      = TSymbolUniqueId(3117);
+    static constexpr const TSymbolUniqueId tanh_Float2                      = TSymbolUniqueId(3118);
+    static constexpr const TSymbolUniqueId tanh_Float3                      = TSymbolUniqueId(3119);
+    static constexpr const TSymbolUniqueId tanh_Float4                      = TSymbolUniqueId(3120);
+    static constexpr const TSymbolUniqueId asinh_Float1                     = TSymbolUniqueId(3121);
+    static constexpr const TSymbolUniqueId asinh_Float2                     = TSymbolUniqueId(3122);
+    static constexpr const TSymbolUniqueId asinh_Float3                     = TSymbolUniqueId(3123);
+    static constexpr const TSymbolUniqueId asinh_Float4                     = TSymbolUniqueId(3124);
+    static constexpr const TSymbolUniqueId acosh_Float1                     = TSymbolUniqueId(3125);
+    static constexpr const TSymbolUniqueId acosh_Float2                     = TSymbolUniqueId(3126);
+    static constexpr const TSymbolUniqueId acosh_Float3                     = TSymbolUniqueId(3127);
+    static constexpr const TSymbolUniqueId acosh_Float4                     = TSymbolUniqueId(3128);
+    static constexpr const TSymbolUniqueId atanh_Float1                     = TSymbolUniqueId(3129);
+    static constexpr const TSymbolUniqueId atanh_Float2                     = TSymbolUniqueId(3130);
+    static constexpr const TSymbolUniqueId atanh_Float3                     = TSymbolUniqueId(3131);
+    static constexpr const TSymbolUniqueId atanh_Float4                     = TSymbolUniqueId(3132);
+    static constexpr const TSymbolUniqueId pow_Float1_Float1                = TSymbolUniqueId(3133);
+    static constexpr const TSymbolUniqueId pow_Float2_Float2                = TSymbolUniqueId(3134);
+    static constexpr const TSymbolUniqueId pow_Float3_Float3                = TSymbolUniqueId(3135);
+    static constexpr const TSymbolUniqueId pow_Float4_Float4                = TSymbolUniqueId(3136);
+    static constexpr const TSymbolUniqueId exp_Float1                       = TSymbolUniqueId(3137);
+    static constexpr const TSymbolUniqueId exp_Float2                       = TSymbolUniqueId(3138);
+    static constexpr const TSymbolUniqueId exp_Float3                       = TSymbolUniqueId(3139);
+    static constexpr const TSymbolUniqueId exp_Float4                       = TSymbolUniqueId(3140);
+    static constexpr const TSymbolUniqueId log_Float1                       = TSymbolUniqueId(3141);
+    static constexpr const TSymbolUniqueId log_Float2                       = TSymbolUniqueId(3142);
+    static constexpr const TSymbolUniqueId log_Float3                       = TSymbolUniqueId(3143);
+    static constexpr const TSymbolUniqueId log_Float4                       = TSymbolUniqueId(3144);
+    static constexpr const TSymbolUniqueId exp2_Float1                      = TSymbolUniqueId(3145);
+    static constexpr const TSymbolUniqueId exp2_Float2                      = TSymbolUniqueId(3146);
+    static constexpr const TSymbolUniqueId exp2_Float3                      = TSymbolUniqueId(3147);
+    static constexpr const TSymbolUniqueId exp2_Float4                      = TSymbolUniqueId(3148);
+    static constexpr const TSymbolUniqueId log2_Float1                      = TSymbolUniqueId(3149);
+    static constexpr const TSymbolUniqueId log2_Float2                      = TSymbolUniqueId(3150);
+    static constexpr const TSymbolUniqueId log2_Float3                      = TSymbolUniqueId(3151);
+    static constexpr const TSymbolUniqueId log2_Float4                      = TSymbolUniqueId(3152);
+    static constexpr const TSymbolUniqueId sqrt_Float1                      = TSymbolUniqueId(3153);
+    static constexpr const TSymbolUniqueId sqrt_Float2                      = TSymbolUniqueId(3154);
+    static constexpr const TSymbolUniqueId sqrt_Float3                      = TSymbolUniqueId(3155);
+    static constexpr const TSymbolUniqueId sqrt_Float4                      = TSymbolUniqueId(3156);
+    static constexpr const TSymbolUniqueId inversesqrt_Float1               = TSymbolUniqueId(3157);
+    static constexpr const TSymbolUniqueId inversesqrt_Float2               = TSymbolUniqueId(3158);
+    static constexpr const TSymbolUniqueId inversesqrt_Float3               = TSymbolUniqueId(3159);
+    static constexpr const TSymbolUniqueId inversesqrt_Float4               = TSymbolUniqueId(3160);
+    static constexpr const TSymbolUniqueId abs_Float1                       = TSymbolUniqueId(3161);
+    static constexpr const TSymbolUniqueId abs_Float2                       = TSymbolUniqueId(3162);
+    static constexpr const TSymbolUniqueId abs_Float3                       = TSymbolUniqueId(3163);
+    static constexpr const TSymbolUniqueId abs_Float4                       = TSymbolUniqueId(3164);
+    static constexpr const TSymbolUniqueId abs_Int1                         = TSymbolUniqueId(3165);
+    static constexpr const TSymbolUniqueId pt00D                            = TSymbolUniqueId(3166);
+    static constexpr const TSymbolUniqueId abs_Int2                         = TSymbolUniqueId(3167);
+    static constexpr const TSymbolUniqueId pt10D                            = TSymbolUniqueId(3168);
+    static constexpr const TSymbolUniqueId abs_Int3                         = TSymbolUniqueId(3169);
+    static constexpr const TSymbolUniqueId pt20D                            = TSymbolUniqueId(3170);
+    static constexpr const TSymbolUniqueId abs_Int4                         = TSymbolUniqueId(3171);
+    static constexpr const TSymbolUniqueId pt30D                            = TSymbolUniqueId(3172);
+    static constexpr const TSymbolUniqueId sign_Float1                      = TSymbolUniqueId(3173);
+    static constexpr const TSymbolUniqueId sign_Float2                      = TSymbolUniqueId(3174);
+    static constexpr const TSymbolUniqueId sign_Float3                      = TSymbolUniqueId(3175);
+    static constexpr const TSymbolUniqueId sign_Float4                      = TSymbolUniqueId(3176);
+    static constexpr const TSymbolUniqueId sign_Int1                        = TSymbolUniqueId(3177);
+    static constexpr const TSymbolUniqueId sign_Int2                        = TSymbolUniqueId(3178);
+    static constexpr const TSymbolUniqueId sign_Int3                        = TSymbolUniqueId(3179);
+    static constexpr const TSymbolUniqueId sign_Int4                        = TSymbolUniqueId(3180);
+    static constexpr const TSymbolUniqueId floor_Float1                     = TSymbolUniqueId(3181);
+    static constexpr const TSymbolUniqueId floor_Float2                     = TSymbolUniqueId(3182);
+    static constexpr const TSymbolUniqueId floor_Float3                     = TSymbolUniqueId(3183);
+    static constexpr const TSymbolUniqueId floor_Float4                     = TSymbolUniqueId(3184);
+    static constexpr const TSymbolUniqueId trunc_Float1                     = TSymbolUniqueId(3185);
+    static constexpr const TSymbolUniqueId trunc_Float2                     = TSymbolUniqueId(3186);
+    static constexpr const TSymbolUniqueId trunc_Float3                     = TSymbolUniqueId(3187);
+    static constexpr const TSymbolUniqueId trunc_Float4                     = TSymbolUniqueId(3188);
+    static constexpr const TSymbolUniqueId round_Float1                     = TSymbolUniqueId(3189);
+    static constexpr const TSymbolUniqueId round_Float2                     = TSymbolUniqueId(3190);
+    static constexpr const TSymbolUniqueId round_Float3                     = TSymbolUniqueId(3191);
+    static constexpr const TSymbolUniqueId round_Float4                     = TSymbolUniqueId(3192);
+    static constexpr const TSymbolUniqueId roundEven_Float1                 = TSymbolUniqueId(3193);
+    static constexpr const TSymbolUniqueId roundEven_Float2                 = TSymbolUniqueId(3194);
+    static constexpr const TSymbolUniqueId roundEven_Float3                 = TSymbolUniqueId(3195);
+    static constexpr const TSymbolUniqueId roundEven_Float4                 = TSymbolUniqueId(3196);
+    static constexpr const TSymbolUniqueId ceil_Float1                      = TSymbolUniqueId(3197);
+    static constexpr const TSymbolUniqueId ceil_Float2                      = TSymbolUniqueId(3198);
+    static constexpr const TSymbolUniqueId ceil_Float3                      = TSymbolUniqueId(3199);
+    static constexpr const TSymbolUniqueId ceil_Float4                      = TSymbolUniqueId(3200);
+    static constexpr const TSymbolUniqueId fract_Float1                     = TSymbolUniqueId(3201);
+    static constexpr const TSymbolUniqueId fract_Float2                     = TSymbolUniqueId(3202);
+    static constexpr const TSymbolUniqueId fract_Float3                     = TSymbolUniqueId(3203);
+    static constexpr const TSymbolUniqueId fract_Float4                     = TSymbolUniqueId(3204);
+    static constexpr const TSymbolUniqueId mod_Float1_Float1                = TSymbolUniqueId(3205);
+    static constexpr const TSymbolUniqueId mod_Float2_Float1                = TSymbolUniqueId(3206);
+    static constexpr const TSymbolUniqueId mod_Float3_Float1                = TSymbolUniqueId(3207);
+    static constexpr const TSymbolUniqueId mod_Float4_Float1                = TSymbolUniqueId(3208);
+    static constexpr const TSymbolUniqueId mod_Float2_Float2                = TSymbolUniqueId(3209);
+    static constexpr const TSymbolUniqueId mod_Float3_Float3                = TSymbolUniqueId(3210);
+    static constexpr const TSymbolUniqueId mod_Float4_Float4                = TSymbolUniqueId(3211);
+    static constexpr const TSymbolUniqueId min_Float1_Float1                = TSymbolUniqueId(3212);
+    static constexpr const TSymbolUniqueId min_Float2_Float1                = TSymbolUniqueId(3213);
+    static constexpr const TSymbolUniqueId min_Float3_Float1                = TSymbolUniqueId(3214);
+    static constexpr const TSymbolUniqueId min_Float4_Float1                = TSymbolUniqueId(3215);
+    static constexpr const TSymbolUniqueId min_Float2_Float2                = TSymbolUniqueId(3216);
+    static constexpr const TSymbolUniqueId min_Float3_Float3                = TSymbolUniqueId(3217);
+    static constexpr const TSymbolUniqueId min_Float4_Float4                = TSymbolUniqueId(3218);
+    static constexpr const TSymbolUniqueId min_Int1_Int1                    = TSymbolUniqueId(3219);
+    static constexpr const TSymbolUniqueId min_Int2_Int2                    = TSymbolUniqueId(3220);
+    static constexpr const TSymbolUniqueId min_Int3_Int3                    = TSymbolUniqueId(3221);
+    static constexpr const TSymbolUniqueId min_Int4_Int4                    = TSymbolUniqueId(3222);
+    static constexpr const TSymbolUniqueId min_Int2_Int1                    = TSymbolUniqueId(3223);
+    static constexpr const TSymbolUniqueId min_Int3_Int1                    = TSymbolUniqueId(3224);
+    static constexpr const TSymbolUniqueId min_Int4_Int1                    = TSymbolUniqueId(3225);
+    static constexpr const TSymbolUniqueId min_UInt1_UInt1                  = TSymbolUniqueId(3226);
+    static constexpr const TSymbolUniqueId pt00E                            = TSymbolUniqueId(3227);
+    static constexpr const TSymbolUniqueId min_UInt2_UInt2                  = TSymbolUniqueId(3228);
+    static constexpr const TSymbolUniqueId pt10E                            = TSymbolUniqueId(3229);
+    static constexpr const TSymbolUniqueId min_UInt3_UInt3                  = TSymbolUniqueId(3230);
+    static constexpr const TSymbolUniqueId pt20E                            = TSymbolUniqueId(3231);
+    static constexpr const TSymbolUniqueId min_UInt4_UInt4                  = TSymbolUniqueId(3232);
+    static constexpr const TSymbolUniqueId pt30E                            = TSymbolUniqueId(3233);
+    static constexpr const TSymbolUniqueId min_UInt2_UInt1                  = TSymbolUniqueId(3234);
+    static constexpr const TSymbolUniqueId min_UInt3_UInt1                  = TSymbolUniqueId(3235);
+    static constexpr const TSymbolUniqueId min_UInt4_UInt1                  = TSymbolUniqueId(3236);
+    static constexpr const TSymbolUniqueId max_Float1_Float1                = TSymbolUniqueId(3237);
+    static constexpr const TSymbolUniqueId max_Float2_Float1                = TSymbolUniqueId(3238);
+    static constexpr const TSymbolUniqueId max_Float3_Float1                = TSymbolUniqueId(3239);
+    static constexpr const TSymbolUniqueId max_Float4_Float1                = TSymbolUniqueId(3240);
+    static constexpr const TSymbolUniqueId max_Float2_Float2                = TSymbolUniqueId(3241);
+    static constexpr const TSymbolUniqueId max_Float3_Float3                = TSymbolUniqueId(3242);
+    static constexpr const TSymbolUniqueId max_Float4_Float4                = TSymbolUniqueId(3243);
+    static constexpr const TSymbolUniqueId max_Int1_Int1                    = TSymbolUniqueId(3244);
+    static constexpr const TSymbolUniqueId max_Int2_Int2                    = TSymbolUniqueId(3245);
+    static constexpr const TSymbolUniqueId max_Int3_Int3                    = TSymbolUniqueId(3246);
+    static constexpr const TSymbolUniqueId max_Int4_Int4                    = TSymbolUniqueId(3247);
+    static constexpr const TSymbolUniqueId max_Int2_Int1                    = TSymbolUniqueId(3248);
+    static constexpr const TSymbolUniqueId max_Int3_Int1                    = TSymbolUniqueId(3249);
+    static constexpr const TSymbolUniqueId max_Int4_Int1                    = TSymbolUniqueId(3250);
+    static constexpr const TSymbolUniqueId max_UInt1_UInt1                  = TSymbolUniqueId(3251);
+    static constexpr const TSymbolUniqueId max_UInt2_UInt2                  = TSymbolUniqueId(3252);
+    static constexpr const TSymbolUniqueId max_UInt3_UInt3                  = TSymbolUniqueId(3253);
+    static constexpr const TSymbolUniqueId max_UInt4_UInt4                  = TSymbolUniqueId(3254);
+    static constexpr const TSymbolUniqueId max_UInt2_UInt1                  = TSymbolUniqueId(3255);
+    static constexpr const TSymbolUniqueId max_UInt3_UInt1                  = TSymbolUniqueId(3256);
+    static constexpr const TSymbolUniqueId max_UInt4_UInt1                  = TSymbolUniqueId(3257);
+    static constexpr const TSymbolUniqueId clamp_Float1_Float1_Float1       = TSymbolUniqueId(3258);
+    static constexpr const TSymbolUniqueId clamp_Float2_Float1_Float1       = TSymbolUniqueId(3259);
+    static constexpr const TSymbolUniqueId clamp_Float3_Float1_Float1       = TSymbolUniqueId(3260);
+    static constexpr const TSymbolUniqueId clamp_Float4_Float1_Float1       = TSymbolUniqueId(3261);
+    static constexpr const TSymbolUniqueId clamp_Float2_Float2_Float2       = TSymbolUniqueId(3262);
+    static constexpr const TSymbolUniqueId clamp_Float3_Float3_Float3       = TSymbolUniqueId(3263);
+    static constexpr const TSymbolUniqueId clamp_Float4_Float4_Float4       = TSymbolUniqueId(3264);
+    static constexpr const TSymbolUniqueId clamp_Int1_Int1_Int1             = TSymbolUniqueId(3265);
+    static constexpr const TSymbolUniqueId clamp_Int2_Int1_Int1             = TSymbolUniqueId(3266);
+    static constexpr const TSymbolUniqueId clamp_Int3_Int1_Int1             = TSymbolUniqueId(3267);
+    static constexpr const TSymbolUniqueId clamp_Int4_Int1_Int1             = TSymbolUniqueId(3268);
+    static constexpr const TSymbolUniqueId clamp_Int2_Int2_Int2             = TSymbolUniqueId(3269);
+    static constexpr const TSymbolUniqueId clamp_Int3_Int3_Int3             = TSymbolUniqueId(3270);
+    static constexpr const TSymbolUniqueId clamp_Int4_Int4_Int4             = TSymbolUniqueId(3271);
+    static constexpr const TSymbolUniqueId clamp_UInt1_UInt1_UInt1          = TSymbolUniqueId(3272);
+    static constexpr const TSymbolUniqueId clamp_UInt2_UInt1_UInt1          = TSymbolUniqueId(3273);
+    static constexpr const TSymbolUniqueId clamp_UInt3_UInt1_UInt1          = TSymbolUniqueId(3274);
+    static constexpr const TSymbolUniqueId clamp_UInt4_UInt1_UInt1          = TSymbolUniqueId(3275);
+    static constexpr const TSymbolUniqueId clamp_UInt2_UInt2_UInt2          = TSymbolUniqueId(3276);
+    static constexpr const TSymbolUniqueId clamp_UInt3_UInt3_UInt3          = TSymbolUniqueId(3277);
+    static constexpr const TSymbolUniqueId clamp_UInt4_UInt4_UInt4          = TSymbolUniqueId(3278);
+    static constexpr const TSymbolUniqueId mix_Float1_Float1_Float1         = TSymbolUniqueId(3279);
+    static constexpr const TSymbolUniqueId mix_Float2_Float2_Float1         = TSymbolUniqueId(3280);
+    static constexpr const TSymbolUniqueId mix_Float3_Float3_Float1         = TSymbolUniqueId(3281);
+    static constexpr const TSymbolUniqueId mix_Float4_Float4_Float1         = TSymbolUniqueId(3282);
+    static constexpr const TSymbolUniqueId mix_Float2_Float2_Float2         = TSymbolUniqueId(3283);
+    static constexpr const TSymbolUniqueId mix_Float3_Float3_Float3         = TSymbolUniqueId(3284);
+    static constexpr const TSymbolUniqueId mix_Float4_Float4_Float4         = TSymbolUniqueId(3285);
+    static constexpr const TSymbolUniqueId mix_Float1_Float1_Bool1          = TSymbolUniqueId(3286);
+    static constexpr const TSymbolUniqueId pt00F                            = TSymbolUniqueId(3287);
+    static constexpr const TSymbolUniqueId mix_Float2_Float2_Bool2          = TSymbolUniqueId(3288);
+    static constexpr const TSymbolUniqueId pt10F                            = TSymbolUniqueId(3289);
+    static constexpr const TSymbolUniqueId mix_Float3_Float3_Bool3          = TSymbolUniqueId(3290);
+    static constexpr const TSymbolUniqueId pt20F                            = TSymbolUniqueId(3291);
+    static constexpr const TSymbolUniqueId mix_Float4_Float4_Bool4          = TSymbolUniqueId(3292);
+    static constexpr const TSymbolUniqueId pt30F                            = TSymbolUniqueId(3293);
+    static constexpr const TSymbolUniqueId mix_Int1_Int1_Bool1              = TSymbolUniqueId(3294);
+    static constexpr const TSymbolUniqueId mix_Int2_Int2_Bool2              = TSymbolUniqueId(3295);
+    static constexpr const TSymbolUniqueId mix_Int3_Int3_Bool3              = TSymbolUniqueId(3296);
+    static constexpr const TSymbolUniqueId mix_Int4_Int4_Bool4              = TSymbolUniqueId(3297);
+    static constexpr const TSymbolUniqueId mix_UInt1_UInt1_Bool1            = TSymbolUniqueId(3298);
+    static constexpr const TSymbolUniqueId mix_UInt2_UInt2_Bool2            = TSymbolUniqueId(3299);
+    static constexpr const TSymbolUniqueId mix_UInt3_UInt3_Bool3            = TSymbolUniqueId(3300);
+    static constexpr const TSymbolUniqueId mix_UInt4_UInt4_Bool4            = TSymbolUniqueId(3301);
+    static constexpr const TSymbolUniqueId mix_Bool1_Bool1_Bool1            = TSymbolUniqueId(3302);
+    static constexpr const TSymbolUniqueId mix_Bool2_Bool2_Bool2            = TSymbolUniqueId(3303);
+    static constexpr const TSymbolUniqueId mix_Bool3_Bool3_Bool3            = TSymbolUniqueId(3304);
+    static constexpr const TSymbolUniqueId mix_Bool4_Bool4_Bool4            = TSymbolUniqueId(3305);
+    static constexpr const TSymbolUniqueId step_Float1_Float1               = TSymbolUniqueId(3306);
+    static constexpr const TSymbolUniqueId step_Float2_Float2               = TSymbolUniqueId(3307);
+    static constexpr const TSymbolUniqueId step_Float3_Float3               = TSymbolUniqueId(3308);
+    static constexpr const TSymbolUniqueId step_Float4_Float4               = TSymbolUniqueId(3309);
+    static constexpr const TSymbolUniqueId step_Float1_Float2               = TSymbolUniqueId(3310);
+    static constexpr const TSymbolUniqueId step_Float1_Float3               = TSymbolUniqueId(3311);
+    static constexpr const TSymbolUniqueId step_Float1_Float4               = TSymbolUniqueId(3312);
+    static constexpr const TSymbolUniqueId smoothstep_Float1_Float1_Float1  = TSymbolUniqueId(3313);
+    static constexpr const TSymbolUniqueId smoothstep_Float2_Float2_Float2  = TSymbolUniqueId(3314);
+    static constexpr const TSymbolUniqueId smoothstep_Float3_Float3_Float3  = TSymbolUniqueId(3315);
+    static constexpr const TSymbolUniqueId smoothstep_Float4_Float4_Float4  = TSymbolUniqueId(3316);
+    static constexpr const TSymbolUniqueId smoothstep_Float1_Float1_Float2  = TSymbolUniqueId(3317);
+    static constexpr const TSymbolUniqueId smoothstep_Float1_Float1_Float3  = TSymbolUniqueId(3318);
+    static constexpr const TSymbolUniqueId smoothstep_Float1_Float1_Float4  = TSymbolUniqueId(3319);
+    static constexpr const TSymbolUniqueId modf_Float1_Float1               = TSymbolUniqueId(3320);
+    static constexpr const TSymbolUniqueId pt_o_00B                         = TSymbolUniqueId(3321);
+    static constexpr const TSymbolUniqueId modf_Float2_Float2               = TSymbolUniqueId(3322);
+    static constexpr const TSymbolUniqueId pt_o_10B                         = TSymbolUniqueId(3323);
+    static constexpr const TSymbolUniqueId modf_Float3_Float3               = TSymbolUniqueId(3324);
+    static constexpr const TSymbolUniqueId pt_o_20B                         = TSymbolUniqueId(3325);
+    static constexpr const TSymbolUniqueId modf_Float4_Float4               = TSymbolUniqueId(3326);
+    static constexpr const TSymbolUniqueId pt_o_30B                         = TSymbolUniqueId(3327);
+    static constexpr const TSymbolUniqueId isnan_Float1                     = TSymbolUniqueId(3328);
+    static constexpr const TSymbolUniqueId isnan_Float2                     = TSymbolUniqueId(3329);
+    static constexpr const TSymbolUniqueId isnan_Float3                     = TSymbolUniqueId(3330);
+    static constexpr const TSymbolUniqueId isnan_Float4                     = TSymbolUniqueId(3331);
+    static constexpr const TSymbolUniqueId isinf_Float1                     = TSymbolUniqueId(3332);
+    static constexpr const TSymbolUniqueId isinf_Float2                     = TSymbolUniqueId(3333);
+    static constexpr const TSymbolUniqueId isinf_Float3                     = TSymbolUniqueId(3334);
+    static constexpr const TSymbolUniqueId isinf_Float4                     = TSymbolUniqueId(3335);
+    static constexpr const TSymbolUniqueId floatBitsToInt_Float1            = TSymbolUniqueId(3336);
+    static constexpr const TSymbolUniqueId floatBitsToInt_Float2            = TSymbolUniqueId(3337);
+    static constexpr const TSymbolUniqueId floatBitsToInt_Float3            = TSymbolUniqueId(3338);
+    static constexpr const TSymbolUniqueId floatBitsToInt_Float4            = TSymbolUniqueId(3339);
+    static constexpr const TSymbolUniqueId floatBitsToUint_Float1           = TSymbolUniqueId(3340);
+    static constexpr const TSymbolUniqueId floatBitsToUint_Float2           = TSymbolUniqueId(3341);
+    static constexpr const TSymbolUniqueId floatBitsToUint_Float3           = TSymbolUniqueId(3342);
+    static constexpr const TSymbolUniqueId floatBitsToUint_Float4           = TSymbolUniqueId(3343);
+    static constexpr const TSymbolUniqueId intBitsToFloat_Int1              = TSymbolUniqueId(3344);
+    static constexpr const TSymbolUniqueId intBitsToFloat_Int2              = TSymbolUniqueId(3345);
+    static constexpr const TSymbolUniqueId intBitsToFloat_Int3              = TSymbolUniqueId(3346);
+    static constexpr const TSymbolUniqueId intBitsToFloat_Int4              = TSymbolUniqueId(3347);
+    static constexpr const TSymbolUniqueId uintBitsToFloat_UInt1            = TSymbolUniqueId(3348);
+    static constexpr const TSymbolUniqueId uintBitsToFloat_UInt2            = TSymbolUniqueId(3349);
+    static constexpr const TSymbolUniqueId uintBitsToFloat_UInt3            = TSymbolUniqueId(3350);
+    static constexpr const TSymbolUniqueId uintBitsToFloat_UInt4            = TSymbolUniqueId(3351);
+    static constexpr const TSymbolUniqueId fma_Float1_Float1_Float1         = TSymbolUniqueId(3352);
+    static constexpr const TSymbolUniqueId fma_Float2_Float2_Float2         = TSymbolUniqueId(3353);
+    static constexpr const TSymbolUniqueId fma_Float3_Float3_Float3         = TSymbolUniqueId(3354);
+    static constexpr const TSymbolUniqueId fma_Float4_Float4_Float4         = TSymbolUniqueId(3355);
+    static constexpr const TSymbolUniqueId fmaExt_Float1_Float1_Float1      = TSymbolUniqueId(3356);
+    static constexpr const TSymbolUniqueId fmaExt_Float2_Float2_Float2      = TSymbolUniqueId(3357);
+    static constexpr const TSymbolUniqueId fmaExt_Float3_Float3_Float3      = TSymbolUniqueId(3358);
+    static constexpr const TSymbolUniqueId fmaExt_Float4_Float4_Float4      = TSymbolUniqueId(3359);
+    static constexpr const TSymbolUniqueId frexp_Float1_Int1                = TSymbolUniqueId(3360);
+    static constexpr const TSymbolUniqueId pt_o_00D                         = TSymbolUniqueId(3361);
+    static constexpr const TSymbolUniqueId frexp_Float2_Int2                = TSymbolUniqueId(3362);
+    static constexpr const TSymbolUniqueId pt_o_10D                         = TSymbolUniqueId(3363);
+    static constexpr const TSymbolUniqueId frexp_Float3_Int3                = TSymbolUniqueId(3364);
+    static constexpr const TSymbolUniqueId pt_o_20D                         = TSymbolUniqueId(3365);
+    static constexpr const TSymbolUniqueId frexp_Float4_Int4                = TSymbolUniqueId(3366);
+    static constexpr const TSymbolUniqueId pt_o_30D                         = TSymbolUniqueId(3367);
+    static constexpr const TSymbolUniqueId ldexp_Float1_Int1                = TSymbolUniqueId(3368);
+    static constexpr const TSymbolUniqueId ldexp_Float2_Int2                = TSymbolUniqueId(3369);
+    static constexpr const TSymbolUniqueId ldexp_Float3_Int3                = TSymbolUniqueId(3370);
+    static constexpr const TSymbolUniqueId ldexp_Float4_Int4                = TSymbolUniqueId(3371);
+    static constexpr const TSymbolUniqueId packSnorm2x16_Float2             = TSymbolUniqueId(3372);
+    static constexpr const TSymbolUniqueId packHalf2x16_Float2              = TSymbolUniqueId(3373);
+    static constexpr const TSymbolUniqueId unpackSnorm2x16_UInt1            = TSymbolUniqueId(3374);
+    static constexpr const TSymbolUniqueId unpackHalf2x16_UInt1             = TSymbolUniqueId(3375);
+    static constexpr const TSymbolUniqueId packUnorm2x16_Float2             = TSymbolUniqueId(3376);
+    static constexpr const TSymbolUniqueId unpackUnorm2x16_UInt1            = TSymbolUniqueId(3377);
+    static constexpr const TSymbolUniqueId packUnorm4x8_Float4              = TSymbolUniqueId(3378);
+    static constexpr const TSymbolUniqueId packSnorm4x8_Float4              = TSymbolUniqueId(3379);
+    static constexpr const TSymbolUniqueId unpackUnorm4x8_UInt1             = TSymbolUniqueId(3380);
+    static constexpr const TSymbolUniqueId unpackSnorm4x8_UInt1             = TSymbolUniqueId(3381);
+    static constexpr const TSymbolUniqueId length_Float1                    = TSymbolUniqueId(3382);
+    static constexpr const TSymbolUniqueId length_Float2                    = TSymbolUniqueId(3383);
+    static constexpr const TSymbolUniqueId length_Float3                    = TSymbolUniqueId(3384);
+    static constexpr const TSymbolUniqueId length_Float4                    = TSymbolUniqueId(3385);
+    static constexpr const TSymbolUniqueId distance_Float1_Float1           = TSymbolUniqueId(3386);
+    static constexpr const TSymbolUniqueId distance_Float2_Float2           = TSymbolUniqueId(3387);
+    static constexpr const TSymbolUniqueId distance_Float3_Float3           = TSymbolUniqueId(3388);
+    static constexpr const TSymbolUniqueId distance_Float4_Float4           = TSymbolUniqueId(3389);
+    static constexpr const TSymbolUniqueId dot_Float1_Float1                = TSymbolUniqueId(3390);
+    static constexpr const TSymbolUniqueId dot_Float2_Float2                = TSymbolUniqueId(3391);
+    static constexpr const TSymbolUniqueId dot_Float3_Float3                = TSymbolUniqueId(3392);
+    static constexpr const TSymbolUniqueId dot_Float4_Float4                = TSymbolUniqueId(3393);
+    static constexpr const TSymbolUniqueId cross_Float3_Float3              = TSymbolUniqueId(3394);
+    static constexpr const TSymbolUniqueId normalize_Float1                 = TSymbolUniqueId(3395);
+    static constexpr const TSymbolUniqueId normalize_Float2                 = TSymbolUniqueId(3396);
+    static constexpr const TSymbolUniqueId normalize_Float3                 = TSymbolUniqueId(3397);
+    static constexpr const TSymbolUniqueId normalize_Float4                 = TSymbolUniqueId(3398);
+    static constexpr const TSymbolUniqueId faceforward_Float1_Float1_Float1 = TSymbolUniqueId(3399);
+    static constexpr const TSymbolUniqueId faceforward_Float2_Float2_Float2 = TSymbolUniqueId(3400);
+    static constexpr const TSymbolUniqueId faceforward_Float3_Float3_Float3 = TSymbolUniqueId(3401);
+    static constexpr const TSymbolUniqueId faceforward_Float4_Float4_Float4 = TSymbolUniqueId(3402);
+    static constexpr const TSymbolUniqueId reflect_Float1_Float1            = TSymbolUniqueId(3403);
+    static constexpr const TSymbolUniqueId reflect_Float2_Float2            = TSymbolUniqueId(3404);
+    static constexpr const TSymbolUniqueId reflect_Float3_Float3            = TSymbolUniqueId(3405);
+    static constexpr const TSymbolUniqueId reflect_Float4_Float4            = TSymbolUniqueId(3406);
+    static constexpr const TSymbolUniqueId refract_Float1_Float1_Float1     = TSymbolUniqueId(3407);
+    static constexpr const TSymbolUniqueId refract_Float2_Float2_Float1     = TSymbolUniqueId(3408);
+    static constexpr const TSymbolUniqueId refract_Float3_Float3_Float1     = TSymbolUniqueId(3409);
+    static constexpr const TSymbolUniqueId refract_Float4_Float4_Float1     = TSymbolUniqueId(3410);
+    static constexpr const TSymbolUniqueId matrixCompMult_Float2x2_Float2x2 = TSymbolUniqueId(3411);
+    static constexpr const TSymbolUniqueId pt50B                            = TSymbolUniqueId(3412);
+    static constexpr const TSymbolUniqueId matrixCompMult_Float3x3_Float3x3 = TSymbolUniqueId(3413);
+    static constexpr const TSymbolUniqueId ptA0B                            = TSymbolUniqueId(3414);
+    static constexpr const TSymbolUniqueId matrixCompMult_Float4x4_Float4x4 = TSymbolUniqueId(3415);
+    static constexpr const TSymbolUniqueId ptF0B                            = TSymbolUniqueId(3416);
+    static constexpr const TSymbolUniqueId matrixCompMult_Float2x3_Float2x3 = TSymbolUniqueId(3417);
+    static constexpr const TSymbolUniqueId pt90B                            = TSymbolUniqueId(3418);
+    static constexpr const TSymbolUniqueId matrixCompMult_Float3x2_Float3x2 = TSymbolUniqueId(3419);
+    static constexpr const TSymbolUniqueId pt60B                            = TSymbolUniqueId(3420);
+    static constexpr const TSymbolUniqueId matrixCompMult_Float2x4_Float2x4 = TSymbolUniqueId(3421);
+    static constexpr const TSymbolUniqueId ptD0B                            = TSymbolUniqueId(3422);
+    static constexpr const TSymbolUniqueId matrixCompMult_Float4x2_Float4x2 = TSymbolUniqueId(3423);
+    static constexpr const TSymbolUniqueId pt70B                            = TSymbolUniqueId(3424);
+    static constexpr const TSymbolUniqueId matrixCompMult_Float3x4_Float3x4 = TSymbolUniqueId(3425);
+    static constexpr const TSymbolUniqueId ptE0B                            = TSymbolUniqueId(3426);
+    static constexpr const TSymbolUniqueId matrixCompMult_Float4x3_Float4x3 = TSymbolUniqueId(3427);
+    static constexpr const TSymbolUniqueId ptB0B                            = TSymbolUniqueId(3428);
+    static constexpr const TSymbolUniqueId outerProduct_Float2_Float2       = TSymbolUniqueId(3429);
+    static constexpr const TSymbolUniqueId outerProduct_Float3_Float3       = TSymbolUniqueId(3430);
+    static constexpr const TSymbolUniqueId outerProduct_Float4_Float4       = TSymbolUniqueId(3431);
+    static constexpr const TSymbolUniqueId outerProduct_Float3_Float2       = TSymbolUniqueId(3432);
+    static constexpr const TSymbolUniqueId outerProduct_Float2_Float3       = TSymbolUniqueId(3433);
+    static constexpr const TSymbolUniqueId outerProduct_Float4_Float2       = TSymbolUniqueId(3434);
+    static constexpr const TSymbolUniqueId outerProduct_Float2_Float4       = TSymbolUniqueId(3435);
+    static constexpr const TSymbolUniqueId outerProduct_Float4_Float3       = TSymbolUniqueId(3436);
+    static constexpr const TSymbolUniqueId outerProduct_Float3_Float4       = TSymbolUniqueId(3437);
+    static constexpr const TSymbolUniqueId transpose_Float2x2               = TSymbolUniqueId(3438);
+    static constexpr const TSymbolUniqueId transpose_Float3x3               = TSymbolUniqueId(3439);
+    static constexpr const TSymbolUniqueId transpose_Float4x4               = TSymbolUniqueId(3440);
+    static constexpr const TSymbolUniqueId transpose_Float3x2               = TSymbolUniqueId(3441);
+    static constexpr const TSymbolUniqueId transpose_Float2x3               = TSymbolUniqueId(3442);
+    static constexpr const TSymbolUniqueId transpose_Float4x2               = TSymbolUniqueId(3443);
+    static constexpr const TSymbolUniqueId transpose_Float2x4               = TSymbolUniqueId(3444);
+    static constexpr const TSymbolUniqueId transpose_Float4x3               = TSymbolUniqueId(3445);
+    static constexpr const TSymbolUniqueId transpose_Float3x4               = TSymbolUniqueId(3446);
+    static constexpr const TSymbolUniqueId determinant_Float2x2             = TSymbolUniqueId(3447);
+    static constexpr const TSymbolUniqueId determinant_Float3x3             = TSymbolUniqueId(3448);
+    static constexpr const TSymbolUniqueId determinant_Float4x4             = TSymbolUniqueId(3449);
+    static constexpr const TSymbolUniqueId inverse_Float2x2                 = TSymbolUniqueId(3450);
+    static constexpr const TSymbolUniqueId inverse_Float3x3                 = TSymbolUniqueId(3451);
+    static constexpr const TSymbolUniqueId inverse_Float4x4                 = TSymbolUniqueId(3452);
+    static constexpr const TSymbolUniqueId lessThan_Float2_Float2           = TSymbolUniqueId(3453);
+    static constexpr const TSymbolUniqueId lessThan_Float3_Float3           = TSymbolUniqueId(3454);
+    static constexpr const TSymbolUniqueId lessThan_Float4_Float4           = TSymbolUniqueId(3455);
+    static constexpr const TSymbolUniqueId lessThan_Int2_Int2               = TSymbolUniqueId(3456);
+    static constexpr const TSymbolUniqueId lessThan_Int3_Int3               = TSymbolUniqueId(3457);
+    static constexpr const TSymbolUniqueId lessThan_Int4_Int4               = TSymbolUniqueId(3458);
+    static constexpr const TSymbolUniqueId lessThan_UInt2_UInt2             = TSymbolUniqueId(3459);
+    static constexpr const TSymbolUniqueId lessThan_UInt3_UInt3             = TSymbolUniqueId(3460);
+    static constexpr const TSymbolUniqueId lessThan_UInt4_UInt4             = TSymbolUniqueId(3461);
+    static constexpr const TSymbolUniqueId lessThanEqual_Float2_Float2      = TSymbolUniqueId(3462);
+    static constexpr const TSymbolUniqueId lessThanEqual_Float3_Float3      = TSymbolUniqueId(3463);
+    static constexpr const TSymbolUniqueId lessThanEqual_Float4_Float4      = TSymbolUniqueId(3464);
+    static constexpr const TSymbolUniqueId lessThanEqual_Int2_Int2          = TSymbolUniqueId(3465);
+    static constexpr const TSymbolUniqueId lessThanEqual_Int3_Int3          = TSymbolUniqueId(3466);
+    static constexpr const TSymbolUniqueId lessThanEqual_Int4_Int4          = TSymbolUniqueId(3467);
+    static constexpr const TSymbolUniqueId lessThanEqual_UInt2_UInt2        = TSymbolUniqueId(3468);
+    static constexpr const TSymbolUniqueId lessThanEqual_UInt3_UInt3        = TSymbolUniqueId(3469);
+    static constexpr const TSymbolUniqueId lessThanEqual_UInt4_UInt4        = TSymbolUniqueId(3470);
+    static constexpr const TSymbolUniqueId greaterThan_Float2_Float2        = TSymbolUniqueId(3471);
+    static constexpr const TSymbolUniqueId greaterThan_Float3_Float3        = TSymbolUniqueId(3472);
+    static constexpr const TSymbolUniqueId greaterThan_Float4_Float4        = TSymbolUniqueId(3473);
+    static constexpr const TSymbolUniqueId greaterThan_Int2_Int2            = TSymbolUniqueId(3474);
+    static constexpr const TSymbolUniqueId greaterThan_Int3_Int3            = TSymbolUniqueId(3475);
+    static constexpr const TSymbolUniqueId greaterThan_Int4_Int4            = TSymbolUniqueId(3476);
+    static constexpr const TSymbolUniqueId greaterThan_UInt2_UInt2          = TSymbolUniqueId(3477);
+    static constexpr const TSymbolUniqueId greaterThan_UInt3_UInt3          = TSymbolUniqueId(3478);
+    static constexpr const TSymbolUniqueId greaterThan_UInt4_UInt4          = TSymbolUniqueId(3479);
+    static constexpr const TSymbolUniqueId greaterThanEqual_Float2_Float2   = TSymbolUniqueId(3480);
+    static constexpr const TSymbolUniqueId greaterThanEqual_Float3_Float3   = TSymbolUniqueId(3481);
+    static constexpr const TSymbolUniqueId greaterThanEqual_Float4_Float4   = TSymbolUniqueId(3482);
+    static constexpr const TSymbolUniqueId greaterThanEqual_Int2_Int2       = TSymbolUniqueId(3483);
+    static constexpr const TSymbolUniqueId greaterThanEqual_Int3_Int3       = TSymbolUniqueId(3484);
+    static constexpr const TSymbolUniqueId greaterThanEqual_Int4_Int4       = TSymbolUniqueId(3485);
+    static constexpr const TSymbolUniqueId greaterThanEqual_UInt2_UInt2     = TSymbolUniqueId(3486);
+    static constexpr const TSymbolUniqueId greaterThanEqual_UInt3_UInt3     = TSymbolUniqueId(3487);
+    static constexpr const TSymbolUniqueId greaterThanEqual_UInt4_UInt4     = TSymbolUniqueId(3488);
+    static constexpr const TSymbolUniqueId equal_Float2_Float2              = TSymbolUniqueId(3489);
+    static constexpr const TSymbolUniqueId equal_Float3_Float3              = TSymbolUniqueId(3490);
+    static constexpr const TSymbolUniqueId equal_Float4_Float4              = TSymbolUniqueId(3491);
+    static constexpr const TSymbolUniqueId equal_Int2_Int2                  = TSymbolUniqueId(3492);
+    static constexpr const TSymbolUniqueId equal_Int3_Int3                  = TSymbolUniqueId(3493);
+    static constexpr const TSymbolUniqueId equal_Int4_Int4                  = TSymbolUniqueId(3494);
+    static constexpr const TSymbolUniqueId equal_UInt2_UInt2                = TSymbolUniqueId(3495);
+    static constexpr const TSymbolUniqueId equal_UInt3_UInt3                = TSymbolUniqueId(3496);
+    static constexpr const TSymbolUniqueId equal_UInt4_UInt4                = TSymbolUniqueId(3497);
+    static constexpr const TSymbolUniqueId equal_Bool2_Bool2                = TSymbolUniqueId(3498);
+    static constexpr const TSymbolUniqueId equal_Bool3_Bool3                = TSymbolUniqueId(3499);
+    static constexpr const TSymbolUniqueId equal_Bool4_Bool4                = TSymbolUniqueId(3500);
+    static constexpr const TSymbolUniqueId notEqual_Float2_Float2           = TSymbolUniqueId(3501);
+    static constexpr const TSymbolUniqueId notEqual_Float3_Float3           = TSymbolUniqueId(3502);
+    static constexpr const TSymbolUniqueId notEqual_Float4_Float4           = TSymbolUniqueId(3503);
+    static constexpr const TSymbolUniqueId notEqual_Int2_Int2               = TSymbolUniqueId(3504);
+    static constexpr const TSymbolUniqueId notEqual_Int3_Int3               = TSymbolUniqueId(3505);
+    static constexpr const TSymbolUniqueId notEqual_Int4_Int4               = TSymbolUniqueId(3506);
+    static constexpr const TSymbolUniqueId notEqual_UInt2_UInt2             = TSymbolUniqueId(3507);
+    static constexpr const TSymbolUniqueId notEqual_UInt3_UInt3             = TSymbolUniqueId(3508);
+    static constexpr const TSymbolUniqueId notEqual_UInt4_UInt4             = TSymbolUniqueId(3509);
+    static constexpr const TSymbolUniqueId notEqual_Bool2_Bool2             = TSymbolUniqueId(3510);
+    static constexpr const TSymbolUniqueId notEqual_Bool3_Bool3             = TSymbolUniqueId(3511);
+    static constexpr const TSymbolUniqueId notEqual_Bool4_Bool4             = TSymbolUniqueId(3512);
+    static constexpr const TSymbolUniqueId any_Bool2                        = TSymbolUniqueId(3513);
+    static constexpr const TSymbolUniqueId any_Bool3                        = TSymbolUniqueId(3514);
+    static constexpr const TSymbolUniqueId any_Bool4                        = TSymbolUniqueId(3515);
+    static constexpr const TSymbolUniqueId all_Bool2                        = TSymbolUniqueId(3516);
+    static constexpr const TSymbolUniqueId all_Bool3                        = TSymbolUniqueId(3517);
+    static constexpr const TSymbolUniqueId all_Bool4                        = TSymbolUniqueId(3518);
+    static constexpr const TSymbolUniqueId notFunc_Bool2                    = TSymbolUniqueId(3519);
+    static constexpr const TSymbolUniqueId notFunc_Bool3                    = TSymbolUniqueId(3520);
+    static constexpr const TSymbolUniqueId notFunc_Bool4                    = TSymbolUniqueId(3521);
+    static constexpr const TSymbolUniqueId bitfieldExtract_Int1_Int1_Int1   = TSymbolUniqueId(3522);
+    static constexpr const TSymbolUniqueId bitfieldExtract_Int2_Int1_Int1   = TSymbolUniqueId(3523);
+    static constexpr const TSymbolUniqueId bitfieldExtract_Int3_Int1_Int1   = TSymbolUniqueId(3524);
+    static constexpr const TSymbolUniqueId bitfieldExtract_Int4_Int1_Int1   = TSymbolUniqueId(3525);
+    static constexpr const TSymbolUniqueId bitfieldExtract_UInt1_Int1_Int1  = TSymbolUniqueId(3526);
+    static constexpr const TSymbolUniqueId bitfieldExtract_UInt2_Int1_Int1  = TSymbolUniqueId(3527);
+    static constexpr const TSymbolUniqueId bitfieldExtract_UInt3_Int1_Int1  = TSymbolUniqueId(3528);
+    static constexpr const TSymbolUniqueId bitfieldExtract_UInt4_Int1_Int1  = TSymbolUniqueId(3529);
     static constexpr const TSymbolUniqueId bitfieldInsert_Int1_Int1_Int1_Int1 =
-        TSymbolUniqueId(3525);
-    static constexpr const TSymbolUniqueId bitfieldInsert_Int2_Int2_Int1_Int1 =
-        TSymbolUniqueId(3526);
-    static constexpr const TSymbolUniqueId bitfieldInsert_Int3_Int3_Int1_Int1 =
-        TSymbolUniqueId(3527);
-    static constexpr const TSymbolUniqueId bitfieldInsert_Int4_Int4_Int1_Int1 =
-        TSymbolUniqueId(3528);
-    static constexpr const TSymbolUniqueId bitfieldInsert_UInt1_UInt1_Int1_Int1 =
-        TSymbolUniqueId(3529);
-    static constexpr const TSymbolUniqueId bitfieldInsert_UInt2_UInt2_Int1_Int1 =
         TSymbolUniqueId(3530);
-    static constexpr const TSymbolUniqueId bitfieldInsert_UInt3_UInt3_Int1_Int1 =
+    static constexpr const TSymbolUniqueId bitfieldInsert_Int2_Int2_Int1_Int1 =
         TSymbolUniqueId(3531);
-    static constexpr const TSymbolUniqueId bitfieldInsert_UInt4_UInt4_Int1_Int1 =
+    static constexpr const TSymbolUniqueId bitfieldInsert_Int3_Int3_Int1_Int1 =
         TSymbolUniqueId(3532);
-    static constexpr const TSymbolUniqueId bitfieldReverse_Int1         = TSymbolUniqueId(3533);
-    static constexpr const TSymbolUniqueId bitfieldReverse_Int2         = TSymbolUniqueId(3534);
-    static constexpr const TSymbolUniqueId bitfieldReverse_Int3         = TSymbolUniqueId(3535);
-    static constexpr const TSymbolUniqueId bitfieldReverse_Int4         = TSymbolUniqueId(3536);
-    static constexpr const TSymbolUniqueId bitfieldReverse_UInt1        = TSymbolUniqueId(3537);
-    static constexpr const TSymbolUniqueId bitfieldReverse_UInt2        = TSymbolUniqueId(3538);
-    static constexpr const TSymbolUniqueId bitfieldReverse_UInt3        = TSymbolUniqueId(3539);
-    static constexpr const TSymbolUniqueId bitfieldReverse_UInt4        = TSymbolUniqueId(3540);
-    static constexpr const TSymbolUniqueId bitCount_Int1                = TSymbolUniqueId(3541);
-    static constexpr const TSymbolUniqueId bitCount_Int2                = TSymbolUniqueId(3542);
-    static constexpr const TSymbolUniqueId bitCount_Int3                = TSymbolUniqueId(3543);
-    static constexpr const TSymbolUniqueId bitCount_Int4                = TSymbolUniqueId(3544);
-    static constexpr const TSymbolUniqueId bitCount_UInt1               = TSymbolUniqueId(3545);
-    static constexpr const TSymbolUniqueId bitCount_UInt2               = TSymbolUniqueId(3546);
-    static constexpr const TSymbolUniqueId bitCount_UInt3               = TSymbolUniqueId(3547);
-    static constexpr const TSymbolUniqueId bitCount_UInt4               = TSymbolUniqueId(3548);
-    static constexpr const TSymbolUniqueId findLSB_Int1                 = TSymbolUniqueId(3549);
-    static constexpr const TSymbolUniqueId findLSB_Int2                 = TSymbolUniqueId(3550);
-    static constexpr const TSymbolUniqueId findLSB_Int3                 = TSymbolUniqueId(3551);
-    static constexpr const TSymbolUniqueId findLSB_Int4                 = TSymbolUniqueId(3552);
-    static constexpr const TSymbolUniqueId findLSB_UInt1                = TSymbolUniqueId(3553);
-    static constexpr const TSymbolUniqueId findLSB_UInt2                = TSymbolUniqueId(3554);
-    static constexpr const TSymbolUniqueId findLSB_UInt3                = TSymbolUniqueId(3555);
-    static constexpr const TSymbolUniqueId findLSB_UInt4                = TSymbolUniqueId(3556);
-    static constexpr const TSymbolUniqueId findMSB_Int1                 = TSymbolUniqueId(3557);
-    static constexpr const TSymbolUniqueId findMSB_Int2                 = TSymbolUniqueId(3558);
-    static constexpr const TSymbolUniqueId findMSB_Int3                 = TSymbolUniqueId(3559);
-    static constexpr const TSymbolUniqueId findMSB_Int4                 = TSymbolUniqueId(3560);
-    static constexpr const TSymbolUniqueId findMSB_UInt1                = TSymbolUniqueId(3561);
-    static constexpr const TSymbolUniqueId findMSB_UInt2                = TSymbolUniqueId(3562);
-    static constexpr const TSymbolUniqueId findMSB_UInt3                = TSymbolUniqueId(3563);
-    static constexpr const TSymbolUniqueId findMSB_UInt4                = TSymbolUniqueId(3564);
-    static constexpr const TSymbolUniqueId uaddCarry_UInt1_UInt1_UInt1  = TSymbolUniqueId(3565);
-    static constexpr const TSymbolUniqueId pt_o_00E                     = TSymbolUniqueId(3566);
-    static constexpr const TSymbolUniqueId uaddCarry_UInt2_UInt2_UInt2  = TSymbolUniqueId(3567);
-    static constexpr const TSymbolUniqueId pt_o_10E                     = TSymbolUniqueId(3568);
-    static constexpr const TSymbolUniqueId uaddCarry_UInt3_UInt3_UInt3  = TSymbolUniqueId(3569);
-    static constexpr const TSymbolUniqueId pt_o_20E                     = TSymbolUniqueId(3570);
-    static constexpr const TSymbolUniqueId uaddCarry_UInt4_UInt4_UInt4  = TSymbolUniqueId(3571);
-    static constexpr const TSymbolUniqueId pt_o_30E                     = TSymbolUniqueId(3572);
-    static constexpr const TSymbolUniqueId usubBorrow_UInt1_UInt1_UInt1 = TSymbolUniqueId(3573);
-    static constexpr const TSymbolUniqueId usubBorrow_UInt2_UInt2_UInt2 = TSymbolUniqueId(3574);
-    static constexpr const TSymbolUniqueId usubBorrow_UInt3_UInt3_UInt3 = TSymbolUniqueId(3575);
-    static constexpr const TSymbolUniqueId usubBorrow_UInt4_UInt4_UInt4 = TSymbolUniqueId(3576);
+    static constexpr const TSymbolUniqueId bitfieldInsert_Int4_Int4_Int1_Int1 =
+        TSymbolUniqueId(3533);
+    static constexpr const TSymbolUniqueId bitfieldInsert_UInt1_UInt1_Int1_Int1 =
+        TSymbolUniqueId(3534);
+    static constexpr const TSymbolUniqueId bitfieldInsert_UInt2_UInt2_Int1_Int1 =
+        TSymbolUniqueId(3535);
+    static constexpr const TSymbolUniqueId bitfieldInsert_UInt3_UInt3_Int1_Int1 =
+        TSymbolUniqueId(3536);
+    static constexpr const TSymbolUniqueId bitfieldInsert_UInt4_UInt4_Int1_Int1 =
+        TSymbolUniqueId(3537);
+    static constexpr const TSymbolUniqueId bitfieldReverse_Int1         = TSymbolUniqueId(3538);
+    static constexpr const TSymbolUniqueId bitfieldReverse_Int2         = TSymbolUniqueId(3539);
+    static constexpr const TSymbolUniqueId bitfieldReverse_Int3         = TSymbolUniqueId(3540);
+    static constexpr const TSymbolUniqueId bitfieldReverse_Int4         = TSymbolUniqueId(3541);
+    static constexpr const TSymbolUniqueId bitfieldReverse_UInt1        = TSymbolUniqueId(3542);
+    static constexpr const TSymbolUniqueId bitfieldReverse_UInt2        = TSymbolUniqueId(3543);
+    static constexpr const TSymbolUniqueId bitfieldReverse_UInt3        = TSymbolUniqueId(3544);
+    static constexpr const TSymbolUniqueId bitfieldReverse_UInt4        = TSymbolUniqueId(3545);
+    static constexpr const TSymbolUniqueId bitCount_Int1                = TSymbolUniqueId(3546);
+    static constexpr const TSymbolUniqueId bitCount_Int2                = TSymbolUniqueId(3547);
+    static constexpr const TSymbolUniqueId bitCount_Int3                = TSymbolUniqueId(3548);
+    static constexpr const TSymbolUniqueId bitCount_Int4                = TSymbolUniqueId(3549);
+    static constexpr const TSymbolUniqueId bitCount_UInt1               = TSymbolUniqueId(3550);
+    static constexpr const TSymbolUniqueId bitCount_UInt2               = TSymbolUniqueId(3551);
+    static constexpr const TSymbolUniqueId bitCount_UInt3               = TSymbolUniqueId(3552);
+    static constexpr const TSymbolUniqueId bitCount_UInt4               = TSymbolUniqueId(3553);
+    static constexpr const TSymbolUniqueId findLSB_Int1                 = TSymbolUniqueId(3554);
+    static constexpr const TSymbolUniqueId findLSB_Int2                 = TSymbolUniqueId(3555);
+    static constexpr const TSymbolUniqueId findLSB_Int3                 = TSymbolUniqueId(3556);
+    static constexpr const TSymbolUniqueId findLSB_Int4                 = TSymbolUniqueId(3557);
+    static constexpr const TSymbolUniqueId findLSB_UInt1                = TSymbolUniqueId(3558);
+    static constexpr const TSymbolUniqueId findLSB_UInt2                = TSymbolUniqueId(3559);
+    static constexpr const TSymbolUniqueId findLSB_UInt3                = TSymbolUniqueId(3560);
+    static constexpr const TSymbolUniqueId findLSB_UInt4                = TSymbolUniqueId(3561);
+    static constexpr const TSymbolUniqueId findMSB_Int1                 = TSymbolUniqueId(3562);
+    static constexpr const TSymbolUniqueId findMSB_Int2                 = TSymbolUniqueId(3563);
+    static constexpr const TSymbolUniqueId findMSB_Int3                 = TSymbolUniqueId(3564);
+    static constexpr const TSymbolUniqueId findMSB_Int4                 = TSymbolUniqueId(3565);
+    static constexpr const TSymbolUniqueId findMSB_UInt1                = TSymbolUniqueId(3566);
+    static constexpr const TSymbolUniqueId findMSB_UInt2                = TSymbolUniqueId(3567);
+    static constexpr const TSymbolUniqueId findMSB_UInt3                = TSymbolUniqueId(3568);
+    static constexpr const TSymbolUniqueId findMSB_UInt4                = TSymbolUniqueId(3569);
+    static constexpr const TSymbolUniqueId uaddCarry_UInt1_UInt1_UInt1  = TSymbolUniqueId(3570);
+    static constexpr const TSymbolUniqueId pt_o_00E                     = TSymbolUniqueId(3571);
+    static constexpr const TSymbolUniqueId uaddCarry_UInt2_UInt2_UInt2  = TSymbolUniqueId(3572);
+    static constexpr const TSymbolUniqueId pt_o_10E                     = TSymbolUniqueId(3573);
+    static constexpr const TSymbolUniqueId uaddCarry_UInt3_UInt3_UInt3  = TSymbolUniqueId(3574);
+    static constexpr const TSymbolUniqueId pt_o_20E                     = TSymbolUniqueId(3575);
+    static constexpr const TSymbolUniqueId uaddCarry_UInt4_UInt4_UInt4  = TSymbolUniqueId(3576);
+    static constexpr const TSymbolUniqueId pt_o_30E                     = TSymbolUniqueId(3577);
+    static constexpr const TSymbolUniqueId usubBorrow_UInt1_UInt1_UInt1 = TSymbolUniqueId(3578);
+    static constexpr const TSymbolUniqueId usubBorrow_UInt2_UInt2_UInt2 = TSymbolUniqueId(3579);
+    static constexpr const TSymbolUniqueId usubBorrow_UInt3_UInt3_UInt3 = TSymbolUniqueId(3580);
+    static constexpr const TSymbolUniqueId usubBorrow_UInt4_UInt4_UInt4 = TSymbolUniqueId(3581);
     static constexpr const TSymbolUniqueId umulExtended_UInt1_UInt1_UInt1_UInt1 =
-        TSymbolUniqueId(3577);
+        TSymbolUniqueId(3582);
     static constexpr const TSymbolUniqueId umulExtended_UInt2_UInt2_UInt2_UInt2 =
-        TSymbolUniqueId(3578);
+        TSymbolUniqueId(3583);
     static constexpr const TSymbolUniqueId umulExtended_UInt3_UInt3_UInt3_UInt3 =
-        TSymbolUniqueId(3579);
+        TSymbolUniqueId(3584);
     static constexpr const TSymbolUniqueId umulExtended_UInt4_UInt4_UInt4_UInt4 =
-        TSymbolUniqueId(3580);
-    static constexpr const TSymbolUniqueId imulExtended_Int1_Int1_Int1_Int1 = TSymbolUniqueId(3581);
-    static constexpr const TSymbolUniqueId imulExtended_Int2_Int2_Int2_Int2 = TSymbolUniqueId(3582);
-    static constexpr const TSymbolUniqueId imulExtended_Int3_Int3_Int3_Int3 = TSymbolUniqueId(3583);
-    static constexpr const TSymbolUniqueId imulExtended_Int4_Int4_Int4_Int4 = TSymbolUniqueId(3584);
-    static constexpr const TSymbolUniqueId texture2D_Sampler2D1_Float2      = TSymbolUniqueId(3585);
-    static constexpr const TSymbolUniqueId pt00I                            = TSymbolUniqueId(3586);
-    static constexpr const TSymbolUniqueId texture2DProj_Sampler2D1_Float3  = TSymbolUniqueId(3587);
-    static constexpr const TSymbolUniqueId texture2DProj_Sampler2D1_Float4  = TSymbolUniqueId(3588);
-    static constexpr const TSymbolUniqueId textureCube_SamplerCube1_Float3  = TSymbolUniqueId(3589);
-    static constexpr const TSymbolUniqueId pt00K                            = TSymbolUniqueId(3590);
-    static constexpr const TSymbolUniqueId texture3D_Sampler3D1_Float3      = TSymbolUniqueId(3591);
-    static constexpr const TSymbolUniqueId pt00J                            = TSymbolUniqueId(3592);
-    static constexpr const TSymbolUniqueId texture3DProj_Sampler3D1_Float4  = TSymbolUniqueId(3593);
+        TSymbolUniqueId(3585);
+    static constexpr const TSymbolUniqueId imulExtended_Int1_Int1_Int1_Int1 = TSymbolUniqueId(3586);
+    static constexpr const TSymbolUniqueId imulExtended_Int2_Int2_Int2_Int2 = TSymbolUniqueId(3587);
+    static constexpr const TSymbolUniqueId imulExtended_Int3_Int3_Int3_Int3 = TSymbolUniqueId(3588);
+    static constexpr const TSymbolUniqueId imulExtended_Int4_Int4_Int4_Int4 = TSymbolUniqueId(3589);
+    static constexpr const TSymbolUniqueId texture2D_Sampler2D1_Float2      = TSymbolUniqueId(3590);
+    static constexpr const TSymbolUniqueId pt00I                            = TSymbolUniqueId(3591);
+    static constexpr const TSymbolUniqueId texture2DProj_Sampler2D1_Float3  = TSymbolUniqueId(3592);
+    static constexpr const TSymbolUniqueId texture2DProj_Sampler2D1_Float4  = TSymbolUniqueId(3593);
+    static constexpr const TSymbolUniqueId textureCube_SamplerCube1_Float3  = TSymbolUniqueId(3594);
+    static constexpr const TSymbolUniqueId pt00K                            = TSymbolUniqueId(3595);
+    static constexpr const TSymbolUniqueId texture3D_Sampler3D1_Float3      = TSymbolUniqueId(3596);
+    static constexpr const TSymbolUniqueId pt00J                            = TSymbolUniqueId(3597);
+    static constexpr const TSymbolUniqueId texture3DProj_Sampler3D1_Float4  = TSymbolUniqueId(3598);
     static constexpr const TSymbolUniqueId shadow2DEXT_Sampler2DShadow1_Float3 =
-        TSymbolUniqueId(3594);
-    static constexpr const TSymbolUniqueId pt00d = TSymbolUniqueId(3595);
-    static constexpr const TSymbolUniqueId shadow2DProjEXT_Sampler2DShadow1_Float4 =
-        TSymbolUniqueId(3596);
-    static constexpr const TSymbolUniqueId texture2D_SamplerExternalOES1_Float2 =
-        TSymbolUniqueId(3597);
-    static constexpr const TSymbolUniqueId pt00M = TSymbolUniqueId(3598);
-    static constexpr const TSymbolUniqueId texture2DProj_SamplerExternalOES1_Float3 =
         TSymbolUniqueId(3599);
-    static constexpr const TSymbolUniqueId texture2DProj_SamplerExternalOES1_Float4 =
-        TSymbolUniqueId(3600);
-    static constexpr const TSymbolUniqueId texture2DRect_Sampler2DRect1_Float2 =
+    static constexpr const TSymbolUniqueId pt00d = TSymbolUniqueId(3600);
+    static constexpr const TSymbolUniqueId shadow2DProjEXT_Sampler2DShadow1_Float4 =
         TSymbolUniqueId(3601);
-    static constexpr const TSymbolUniqueId pt00O = TSymbolUniqueId(3602);
-    static constexpr const TSymbolUniqueId texture2DRectProj_Sampler2DRect1_Float3 =
-        TSymbolUniqueId(3603);
-    static constexpr const TSymbolUniqueId texture2DRectProj_Sampler2DRect1_Float4 =
+    static constexpr const TSymbolUniqueId texture2D_SamplerExternalOES1_Float2 =
+        TSymbolUniqueId(3602);
+    static constexpr const TSymbolUniqueId pt00M = TSymbolUniqueId(3603);
+    static constexpr const TSymbolUniqueId texture2DProj_SamplerExternalOES1_Float3 =
         TSymbolUniqueId(3604);
-    static constexpr const TSymbolUniqueId texture2DGradEXT_Sampler2D1_Float2_Float2_Float2 =
+    static constexpr const TSymbolUniqueId texture2DProj_SamplerExternalOES1_Float4 =
         TSymbolUniqueId(3605);
-    static constexpr const TSymbolUniqueId texture2DProjGradEXT_Sampler2D1_Float3_Float2_Float2 =
+    static constexpr const TSymbolUniqueId texture2DRect_Sampler2DRect1_Float2 =
         TSymbolUniqueId(3606);
-    static constexpr const TSymbolUniqueId texture2DProjGradEXT_Sampler2D1_Float4_Float2_Float2 =
-        TSymbolUniqueId(3607);
-    static constexpr const TSymbolUniqueId textureCubeGradEXT_SamplerCube1_Float3_Float3_Float3 =
+    static constexpr const TSymbolUniqueId pt00O = TSymbolUniqueId(3607);
+    static constexpr const TSymbolUniqueId texture2DRectProj_Sampler2DRect1_Float3 =
         TSymbolUniqueId(3608);
-    static constexpr const TSymbolUniqueId textureVideoWEBGL_SamplerVideoWEBGL1_Float2 =
+    static constexpr const TSymbolUniqueId texture2DRectProj_Sampler2DRect1_Float4 =
         TSymbolUniqueId(3609);
-    static constexpr const TSymbolUniqueId pt00y = TSymbolUniqueId(3610);
-    static constexpr const TSymbolUniqueId texture2D_Sampler2D1_Float2_Float1 =
+    static constexpr const TSymbolUniqueId texture2DGradEXT_Sampler2D1_Float2_Float2_Float2 =
+        TSymbolUniqueId(3610);
+    static constexpr const TSymbolUniqueId texture2DProjGradEXT_Sampler2D1_Float3_Float2_Float2 =
         TSymbolUniqueId(3611);
-    static constexpr const TSymbolUniqueId texture2DProj_Sampler2D1_Float3_Float1 =
+    static constexpr const TSymbolUniqueId texture2DProjGradEXT_Sampler2D1_Float4_Float2_Float2 =
         TSymbolUniqueId(3612);
-    static constexpr const TSymbolUniqueId texture2DProj_Sampler2D1_Float4_Float1 =
+    static constexpr const TSymbolUniqueId textureCubeGradEXT_SamplerCube1_Float3_Float3_Float3 =
         TSymbolUniqueId(3613);
-    static constexpr const TSymbolUniqueId textureCube_SamplerCube1_Float3_Float1 =
+    static constexpr const TSymbolUniqueId textureVideoWEBGL_SamplerVideoWEBGL1_Float2 =
         TSymbolUniqueId(3614);
-    static constexpr const TSymbolUniqueId texture3D_Sampler3D1_Float3_Float1 =
-        TSymbolUniqueId(3615);
-    static constexpr const TSymbolUniqueId texture3DProj_Sampler3D1_Float4_Float1 =
+    static constexpr const TSymbolUniqueId pt00y = TSymbolUniqueId(3615);
+    static constexpr const TSymbolUniqueId texture2D_Sampler2D1_Float2_Float1 =
         TSymbolUniqueId(3616);
-    static constexpr const TSymbolUniqueId texture3DLod_Sampler3D1_Float3_Float1 =
+    static constexpr const TSymbolUniqueId texture2DProj_Sampler2D1_Float3_Float1 =
         TSymbolUniqueId(3617);
-    static constexpr const TSymbolUniqueId texture3DProjLod_Sampler3D1_Float4_Float1 =
+    static constexpr const TSymbolUniqueId texture2DProj_Sampler2D1_Float4_Float1 =
         TSymbolUniqueId(3618);
-    static constexpr const TSymbolUniqueId texture2DLod_Sampler2D1_Float2_Float1 =
+    static constexpr const TSymbolUniqueId textureCube_SamplerCube1_Float3_Float1 =
         TSymbolUniqueId(3619);
-    static constexpr const TSymbolUniqueId texture2DProjLod_Sampler2D1_Float3_Float1 =
+    static constexpr const TSymbolUniqueId texture3D_Sampler3D1_Float3_Float1 =
         TSymbolUniqueId(3620);
-    static constexpr const TSymbolUniqueId texture2DProjLod_Sampler2D1_Float4_Float1 =
+    static constexpr const TSymbolUniqueId texture3DProj_Sampler3D1_Float4_Float1 =
         TSymbolUniqueId(3621);
-    static constexpr const TSymbolUniqueId textureCubeLod_SamplerCube1_Float3_Float1 =
+    static constexpr const TSymbolUniqueId texture3DLod_Sampler3D1_Float3_Float1 =
         TSymbolUniqueId(3622);
-    static constexpr const TSymbolUniqueId texture2DLodEXT_Sampler2D1_Float2_Float1 =
+    static constexpr const TSymbolUniqueId texture3DProjLod_Sampler3D1_Float4_Float1 =
         TSymbolUniqueId(3623);
-    static constexpr const TSymbolUniqueId texture2DProjLodEXT_Sampler2D1_Float3_Float1 =
+    static constexpr const TSymbolUniqueId texture2DLod_Sampler2D1_Float2_Float1 =
         TSymbolUniqueId(3624);
-    static constexpr const TSymbolUniqueId texture2DProjLodEXT_Sampler2D1_Float4_Float1 =
+    static constexpr const TSymbolUniqueId texture2DProjLod_Sampler2D1_Float3_Float1 =
         TSymbolUniqueId(3625);
-    static constexpr const TSymbolUniqueId textureCubeLodEXT_SamplerCube1_Float3_Float1 =
+    static constexpr const TSymbolUniqueId texture2DProjLod_Sampler2D1_Float4_Float1 =
         TSymbolUniqueId(3626);
-    static constexpr const TSymbolUniqueId texture_Sampler2D1_Float2       = TSymbolUniqueId(3627);
-    static constexpr const TSymbolUniqueId texture_ISampler2D1_Float2      = TSymbolUniqueId(3628);
-    static constexpr const TSymbolUniqueId pt00R                           = TSymbolUniqueId(3629);
-    static constexpr const TSymbolUniqueId texture_USampler2D1_Float2      = TSymbolUniqueId(3630);
-    static constexpr const TSymbolUniqueId pt00X                           = TSymbolUniqueId(3631);
-    static constexpr const TSymbolUniqueId texture_Sampler3D1_Float3       = TSymbolUniqueId(3632);
-    static constexpr const TSymbolUniqueId texture_ISampler3D1_Float3      = TSymbolUniqueId(3633);
-    static constexpr const TSymbolUniqueId pt00S                           = TSymbolUniqueId(3634);
-    static constexpr const TSymbolUniqueId texture_USampler3D1_Float3      = TSymbolUniqueId(3635);
-    static constexpr const TSymbolUniqueId pt00Y                           = TSymbolUniqueId(3636);
-    static constexpr const TSymbolUniqueId texture_SamplerCube1_Float3     = TSymbolUniqueId(3637);
-    static constexpr const TSymbolUniqueId texture_ISamplerCube1_Float3    = TSymbolUniqueId(3638);
-    static constexpr const TSymbolUniqueId pt00T                           = TSymbolUniqueId(3639);
-    static constexpr const TSymbolUniqueId texture_USamplerCube1_Float3    = TSymbolUniqueId(3640);
-    static constexpr const TSymbolUniqueId pt00Z                           = TSymbolUniqueId(3641);
-    static constexpr const TSymbolUniqueId texture_Sampler2DArray1_Float3  = TSymbolUniqueId(3642);
-    static constexpr const TSymbolUniqueId pt00L                           = TSymbolUniqueId(3643);
-    static constexpr const TSymbolUniqueId texture_ISampler2DArray1_Float3 = TSymbolUniqueId(3644);
-    static constexpr const TSymbolUniqueId pt00U                           = TSymbolUniqueId(3645);
-    static constexpr const TSymbolUniqueId texture_USampler2DArray1_Float3 = TSymbolUniqueId(3646);
-    static constexpr const TSymbolUniqueId pt00a                           = TSymbolUniqueId(3647);
-    static constexpr const TSymbolUniqueId texture_Sampler2DShadow1_Float3 = TSymbolUniqueId(3648);
+    static constexpr const TSymbolUniqueId textureCubeLod_SamplerCube1_Float3_Float1 =
+        TSymbolUniqueId(3627);
+    static constexpr const TSymbolUniqueId texture2DLodEXT_Sampler2D1_Float2_Float1 =
+        TSymbolUniqueId(3628);
+    static constexpr const TSymbolUniqueId texture2DProjLodEXT_Sampler2D1_Float3_Float1 =
+        TSymbolUniqueId(3629);
+    static constexpr const TSymbolUniqueId texture2DProjLodEXT_Sampler2D1_Float4_Float1 =
+        TSymbolUniqueId(3630);
+    static constexpr const TSymbolUniqueId textureCubeLodEXT_SamplerCube1_Float3_Float1 =
+        TSymbolUniqueId(3631);
+    static constexpr const TSymbolUniqueId texture_Sampler2D1_Float2       = TSymbolUniqueId(3632);
+    static constexpr const TSymbolUniqueId texture_ISampler2D1_Float2      = TSymbolUniqueId(3633);
+    static constexpr const TSymbolUniqueId pt00R                           = TSymbolUniqueId(3634);
+    static constexpr const TSymbolUniqueId texture_USampler2D1_Float2      = TSymbolUniqueId(3635);
+    static constexpr const TSymbolUniqueId pt00X                           = TSymbolUniqueId(3636);
+    static constexpr const TSymbolUniqueId texture_Sampler3D1_Float3       = TSymbolUniqueId(3637);
+    static constexpr const TSymbolUniqueId texture_ISampler3D1_Float3      = TSymbolUniqueId(3638);
+    static constexpr const TSymbolUniqueId pt00S                           = TSymbolUniqueId(3639);
+    static constexpr const TSymbolUniqueId texture_USampler3D1_Float3      = TSymbolUniqueId(3640);
+    static constexpr const TSymbolUniqueId pt00Y                           = TSymbolUniqueId(3641);
+    static constexpr const TSymbolUniqueId texture_SamplerCube1_Float3     = TSymbolUniqueId(3642);
+    static constexpr const TSymbolUniqueId texture_ISamplerCube1_Float3    = TSymbolUniqueId(3643);
+    static constexpr const TSymbolUniqueId pt00T                           = TSymbolUniqueId(3644);
+    static constexpr const TSymbolUniqueId texture_USamplerCube1_Float3    = TSymbolUniqueId(3645);
+    static constexpr const TSymbolUniqueId pt00Z                           = TSymbolUniqueId(3646);
+    static constexpr const TSymbolUniqueId texture_Sampler2DArray1_Float3  = TSymbolUniqueId(3647);
+    static constexpr const TSymbolUniqueId pt00L                           = TSymbolUniqueId(3648);
+    static constexpr const TSymbolUniqueId texture_ISampler2DArray1_Float3 = TSymbolUniqueId(3649);
+    static constexpr const TSymbolUniqueId pt00U                           = TSymbolUniqueId(3650);
+    static constexpr const TSymbolUniqueId texture_USampler2DArray1_Float3 = TSymbolUniqueId(3651);
+    static constexpr const TSymbolUniqueId pt00a                           = TSymbolUniqueId(3652);
+    static constexpr const TSymbolUniqueId texture_Sampler2DShadow1_Float3 = TSymbolUniqueId(3653);
     static constexpr const TSymbolUniqueId texture_SamplerCubeShadow1_Float4 =
-        TSymbolUniqueId(3649);
-    static constexpr const TSymbolUniqueId pt00e = TSymbolUniqueId(3650);
+        TSymbolUniqueId(3654);
+    static constexpr const TSymbolUniqueId pt00e = TSymbolUniqueId(3655);
     static constexpr const TSymbolUniqueId texture_Sampler2DArrayShadow1_Float4 =
-        TSymbolUniqueId(3651);
-    static constexpr const TSymbolUniqueId pt00f                            = TSymbolUniqueId(3652);
-    static constexpr const TSymbolUniqueId texture_SamplerCubeArray1_Float4 = TSymbolUniqueId(3653);
-    static constexpr const TSymbolUniqueId pt00k                            = TSymbolUniqueId(3654);
+        TSymbolUniqueId(3656);
+    static constexpr const TSymbolUniqueId pt00f                            = TSymbolUniqueId(3657);
+    static constexpr const TSymbolUniqueId texture_SamplerCubeArray1_Float4 = TSymbolUniqueId(3658);
+    static constexpr const TSymbolUniqueId pt00k                            = TSymbolUniqueId(3659);
     static constexpr const TSymbolUniqueId texture_ISamplerCubeArray1_Float4 =
-        TSymbolUniqueId(3655);
-    static constexpr const TSymbolUniqueId pt00s = TSymbolUniqueId(3656);
+        TSymbolUniqueId(3660);
+    static constexpr const TSymbolUniqueId pt00s = TSymbolUniqueId(3661);
     static constexpr const TSymbolUniqueId texture_USamplerCubeArray1_Float4 =
-        TSymbolUniqueId(3657);
-    static constexpr const TSymbolUniqueId pt00x = TSymbolUniqueId(3658);
-    static constexpr const TSymbolUniqueId texture_SamplerCubeArrayShadow1_Float4_Float1 =
-        TSymbolUniqueId(3659);
-    static constexpr const TSymbolUniqueId pt00l = TSymbolUniqueId(3660);
-    static constexpr const TSymbolUniqueId textureExt_SamplerCubeArray1_Float4 =
-        TSymbolUniqueId(3661);
-    static constexpr const TSymbolUniqueId textureExt_ISamplerCubeArray1_Float4 =
         TSymbolUniqueId(3662);
-    static constexpr const TSymbolUniqueId textureExt_USamplerCubeArray1_Float4 =
-        TSymbolUniqueId(3663);
-    static constexpr const TSymbolUniqueId textureExt_SamplerCubeArrayShadow1_Float4_Float1 =
+    static constexpr const TSymbolUniqueId pt00x = TSymbolUniqueId(3663);
+    static constexpr const TSymbolUniqueId texture_SamplerCubeArrayShadow1_Float4_Float1 =
         TSymbolUniqueId(3664);
-    static constexpr const TSymbolUniqueId texture_SamplerExternalOES1_Float2 =
-        TSymbolUniqueId(3665);
-    static constexpr const TSymbolUniqueId texture_SamplerExternal2DY2YEXT1_Float2 =
+    static constexpr const TSymbolUniqueId pt00l = TSymbolUniqueId(3665);
+    static constexpr const TSymbolUniqueId textureExt_SamplerCubeArray1_Float4 =
         TSymbolUniqueId(3666);
-    static constexpr const TSymbolUniqueId pt00N                         = TSymbolUniqueId(3667);
-    static constexpr const TSymbolUniqueId texture_Sampler2DRect1_Float2 = TSymbolUniqueId(3668);
-    static constexpr const TSymbolUniqueId texture_SamplerVideoWEBGL1_Float2 =
+    static constexpr const TSymbolUniqueId textureExt_ISamplerCubeArray1_Float4 =
+        TSymbolUniqueId(3667);
+    static constexpr const TSymbolUniqueId textureExt_USamplerCubeArray1_Float4 =
+        TSymbolUniqueId(3668);
+    static constexpr const TSymbolUniqueId textureExt_SamplerCubeArrayShadow1_Float4_Float1 =
         TSymbolUniqueId(3669);
-    static constexpr const TSymbolUniqueId textureProj_Sampler2D1_Float3  = TSymbolUniqueId(3670);
-    static constexpr const TSymbolUniqueId textureProj_ISampler2D1_Float3 = TSymbolUniqueId(3671);
-    static constexpr const TSymbolUniqueId textureProj_USampler2D1_Float3 = TSymbolUniqueId(3672);
-    static constexpr const TSymbolUniqueId textureProj_Sampler2D1_Float4  = TSymbolUniqueId(3673);
-    static constexpr const TSymbolUniqueId textureProj_ISampler2D1_Float4 = TSymbolUniqueId(3674);
-    static constexpr const TSymbolUniqueId textureProj_USampler2D1_Float4 = TSymbolUniqueId(3675);
-    static constexpr const TSymbolUniqueId textureProj_Sampler3D1_Float4  = TSymbolUniqueId(3676);
-    static constexpr const TSymbolUniqueId textureProj_ISampler3D1_Float4 = TSymbolUniqueId(3677);
-    static constexpr const TSymbolUniqueId textureProj_USampler3D1_Float4 = TSymbolUniqueId(3678);
+    static constexpr const TSymbolUniqueId texture_SamplerExternalOES1_Float2 =
+        TSymbolUniqueId(3670);
+    static constexpr const TSymbolUniqueId texture_SamplerExternal2DY2YEXT1_Float2 =
+        TSymbolUniqueId(3671);
+    static constexpr const TSymbolUniqueId pt00N                         = TSymbolUniqueId(3672);
+    static constexpr const TSymbolUniqueId texture_Sampler2DRect1_Float2 = TSymbolUniqueId(3673);
+    static constexpr const TSymbolUniqueId texture_SamplerVideoWEBGL1_Float2 =
+        TSymbolUniqueId(3674);
+    static constexpr const TSymbolUniqueId textureProj_Sampler2D1_Float3  = TSymbolUniqueId(3675);
+    static constexpr const TSymbolUniqueId textureProj_ISampler2D1_Float3 = TSymbolUniqueId(3676);
+    static constexpr const TSymbolUniqueId textureProj_USampler2D1_Float3 = TSymbolUniqueId(3677);
+    static constexpr const TSymbolUniqueId textureProj_Sampler2D1_Float4  = TSymbolUniqueId(3678);
+    static constexpr const TSymbolUniqueId textureProj_ISampler2D1_Float4 = TSymbolUniqueId(3679);
+    static constexpr const TSymbolUniqueId textureProj_USampler2D1_Float4 = TSymbolUniqueId(3680);
+    static constexpr const TSymbolUniqueId textureProj_Sampler3D1_Float4  = TSymbolUniqueId(3681);
+    static constexpr const TSymbolUniqueId textureProj_ISampler3D1_Float4 = TSymbolUniqueId(3682);
+    static constexpr const TSymbolUniqueId textureProj_USampler3D1_Float4 = TSymbolUniqueId(3683);
     static constexpr const TSymbolUniqueId textureProj_Sampler2DShadow1_Float4 =
-        TSymbolUniqueId(3679);
-    static constexpr const TSymbolUniqueId textureProj_SamplerExternalOES1_Float3 =
-        TSymbolUniqueId(3680);
-    static constexpr const TSymbolUniqueId textureProj_SamplerExternalOES1_Float4 =
-        TSymbolUniqueId(3681);
-    static constexpr const TSymbolUniqueId textureProj_SamplerExternal2DY2YEXT1_Float3 =
-        TSymbolUniqueId(3682);
-    static constexpr const TSymbolUniqueId textureProj_SamplerExternal2DY2YEXT1_Float4 =
-        TSymbolUniqueId(3683);
-    static constexpr const TSymbolUniqueId textureProj_Sampler2DRect1_Float3 =
         TSymbolUniqueId(3684);
-    static constexpr const TSymbolUniqueId textureProj_Sampler2DRect1_Float4 =
+    static constexpr const TSymbolUniqueId textureProj_SamplerExternalOES1_Float3 =
         TSymbolUniqueId(3685);
-    static constexpr const TSymbolUniqueId textureLod_Sampler2D1_Float2_Float1 =
+    static constexpr const TSymbolUniqueId textureProj_SamplerExternalOES1_Float4 =
         TSymbolUniqueId(3686);
-    static constexpr const TSymbolUniqueId textureLod_ISampler2D1_Float2_Float1 =
+    static constexpr const TSymbolUniqueId textureProj_SamplerExternal2DY2YEXT1_Float3 =
         TSymbolUniqueId(3687);
-    static constexpr const TSymbolUniqueId textureLod_USampler2D1_Float2_Float1 =
+    static constexpr const TSymbolUniqueId textureProj_SamplerExternal2DY2YEXT1_Float4 =
         TSymbolUniqueId(3688);
-    static constexpr const TSymbolUniqueId textureLod_Sampler3D1_Float3_Float1 =
+    static constexpr const TSymbolUniqueId textureProj_Sampler2DRect1_Float3 =
         TSymbolUniqueId(3689);
-    static constexpr const TSymbolUniqueId textureLod_ISampler3D1_Float3_Float1 =
+    static constexpr const TSymbolUniqueId textureProj_Sampler2DRect1_Float4 =
         TSymbolUniqueId(3690);
-    static constexpr const TSymbolUniqueId textureLod_USampler3D1_Float3_Float1 =
+    static constexpr const TSymbolUniqueId textureLod_Sampler2D1_Float2_Float1 =
         TSymbolUniqueId(3691);
-    static constexpr const TSymbolUniqueId textureLod_SamplerCube1_Float3_Float1 =
+    static constexpr const TSymbolUniqueId textureLod_ISampler2D1_Float2_Float1 =
         TSymbolUniqueId(3692);
-    static constexpr const TSymbolUniqueId textureLod_ISamplerCube1_Float3_Float1 =
+    static constexpr const TSymbolUniqueId textureLod_USampler2D1_Float2_Float1 =
         TSymbolUniqueId(3693);
-    static constexpr const TSymbolUniqueId textureLod_USamplerCube1_Float3_Float1 =
+    static constexpr const TSymbolUniqueId textureLod_Sampler3D1_Float3_Float1 =
         TSymbolUniqueId(3694);
-    static constexpr const TSymbolUniqueId textureLod_Sampler2DArray1_Float3_Float1 =
+    static constexpr const TSymbolUniqueId textureLod_ISampler3D1_Float3_Float1 =
         TSymbolUniqueId(3695);
-    static constexpr const TSymbolUniqueId textureLod_ISampler2DArray1_Float3_Float1 =
+    static constexpr const TSymbolUniqueId textureLod_USampler3D1_Float3_Float1 =
         TSymbolUniqueId(3696);
-    static constexpr const TSymbolUniqueId textureLod_USampler2DArray1_Float3_Float1 =
+    static constexpr const TSymbolUniqueId textureLod_SamplerCube1_Float3_Float1 =
         TSymbolUniqueId(3697);
-    static constexpr const TSymbolUniqueId textureLod_Sampler2DShadow1_Float3_Float1 =
+    static constexpr const TSymbolUniqueId textureLod_ISamplerCube1_Float3_Float1 =
         TSymbolUniqueId(3698);
-    static constexpr const TSymbolUniqueId textureLod_SamplerCubeArray1_Float4_Float1 =
+    static constexpr const TSymbolUniqueId textureLod_USamplerCube1_Float3_Float1 =
         TSymbolUniqueId(3699);
-    static constexpr const TSymbolUniqueId textureLod_ISamplerCubeArray1_Float4_Float1 =
+    static constexpr const TSymbolUniqueId textureLod_Sampler2DArray1_Float3_Float1 =
         TSymbolUniqueId(3700);
-    static constexpr const TSymbolUniqueId textureLod_USamplerCubeArray1_Float4_Float1 =
+    static constexpr const TSymbolUniqueId textureLod_ISampler2DArray1_Float3_Float1 =
         TSymbolUniqueId(3701);
-    static constexpr const TSymbolUniqueId textureLodExt_SamplerCubeArray1_Float4_Float1 =
+    static constexpr const TSymbolUniqueId textureLod_USampler2DArray1_Float3_Float1 =
         TSymbolUniqueId(3702);
-    static constexpr const TSymbolUniqueId textureLodExt_ISamplerCubeArray1_Float4_Float1 =
+    static constexpr const TSymbolUniqueId textureLod_Sampler2DShadow1_Float3_Float1 =
         TSymbolUniqueId(3703);
-    static constexpr const TSymbolUniqueId textureLodExt_USamplerCubeArray1_Float4_Float1 =
+    static constexpr const TSymbolUniqueId textureLod_SamplerCubeArray1_Float4_Float1 =
         TSymbolUniqueId(3704);
-    static constexpr const TSymbolUniqueId textureSize_Sampler2D1_Int1      = TSymbolUniqueId(3705);
-    static constexpr const TSymbolUniqueId textureSize_ISampler2D1_Int1     = TSymbolUniqueId(3706);
-    static constexpr const TSymbolUniqueId textureSize_USampler2D1_Int1     = TSymbolUniqueId(3707);
-    static constexpr const TSymbolUniqueId textureSize_Sampler3D1_Int1      = TSymbolUniqueId(3708);
-    static constexpr const TSymbolUniqueId textureSize_ISampler3D1_Int1     = TSymbolUniqueId(3709);
-    static constexpr const TSymbolUniqueId textureSize_USampler3D1_Int1     = TSymbolUniqueId(3710);
-    static constexpr const TSymbolUniqueId textureSize_SamplerCube1_Int1    = TSymbolUniqueId(3711);
-    static constexpr const TSymbolUniqueId textureSize_ISamplerCube1_Int1   = TSymbolUniqueId(3712);
-    static constexpr const TSymbolUniqueId textureSize_USamplerCube1_Int1   = TSymbolUniqueId(3713);
-    static constexpr const TSymbolUniqueId textureSize_Sampler2DArray1_Int1 = TSymbolUniqueId(3714);
+    static constexpr const TSymbolUniqueId textureLod_ISamplerCubeArray1_Float4_Float1 =
+        TSymbolUniqueId(3705);
+    static constexpr const TSymbolUniqueId textureLod_USamplerCubeArray1_Float4_Float1 =
+        TSymbolUniqueId(3706);
+    static constexpr const TSymbolUniqueId textureLodExt_SamplerCubeArray1_Float4_Float1 =
+        TSymbolUniqueId(3707);
+    static constexpr const TSymbolUniqueId textureLodExt_ISamplerCubeArray1_Float4_Float1 =
+        TSymbolUniqueId(3708);
+    static constexpr const TSymbolUniqueId textureLodExt_USamplerCubeArray1_Float4_Float1 =
+        TSymbolUniqueId(3709);
+    static constexpr const TSymbolUniqueId textureSize_Sampler2D1_Int1      = TSymbolUniqueId(3710);
+    static constexpr const TSymbolUniqueId textureSize_ISampler2D1_Int1     = TSymbolUniqueId(3711);
+    static constexpr const TSymbolUniqueId textureSize_USampler2D1_Int1     = TSymbolUniqueId(3712);
+    static constexpr const TSymbolUniqueId textureSize_Sampler3D1_Int1      = TSymbolUniqueId(3713);
+    static constexpr const TSymbolUniqueId textureSize_ISampler3D1_Int1     = TSymbolUniqueId(3714);
+    static constexpr const TSymbolUniqueId textureSize_USampler3D1_Int1     = TSymbolUniqueId(3715);
+    static constexpr const TSymbolUniqueId textureSize_SamplerCube1_Int1    = TSymbolUniqueId(3716);
+    static constexpr const TSymbolUniqueId textureSize_ISamplerCube1_Int1   = TSymbolUniqueId(3717);
+    static constexpr const TSymbolUniqueId textureSize_USamplerCube1_Int1   = TSymbolUniqueId(3718);
+    static constexpr const TSymbolUniqueId textureSize_Sampler2DArray1_Int1 = TSymbolUniqueId(3719);
     static constexpr const TSymbolUniqueId textureSize_ISampler2DArray1_Int1 =
-        TSymbolUniqueId(3715);
-    static constexpr const TSymbolUniqueId textureSize_USampler2DArray1_Int1 =
-        TSymbolUniqueId(3716);
-    static constexpr const TSymbolUniqueId textureSize_Sampler2DShadow1_Int1 =
-        TSymbolUniqueId(3717);
-    static constexpr const TSymbolUniqueId textureSize_SamplerCubeShadow1_Int1 =
-        TSymbolUniqueId(3718);
-    static constexpr const TSymbolUniqueId textureSize_Sampler2DArrayShadow1_Int1 =
-        TSymbolUniqueId(3719);
-    static constexpr const TSymbolUniqueId textureSize_SamplerCubeArray1_Int1 =
         TSymbolUniqueId(3720);
-    static constexpr const TSymbolUniqueId textureSize_ISamplerCubeArray1_Int1 =
+    static constexpr const TSymbolUniqueId textureSize_USampler2DArray1_Int1 =
         TSymbolUniqueId(3721);
-    static constexpr const TSymbolUniqueId textureSize_USamplerCubeArray1_Int1 =
+    static constexpr const TSymbolUniqueId textureSize_Sampler2DShadow1_Int1 =
         TSymbolUniqueId(3722);
-    static constexpr const TSymbolUniqueId textureSize_SamplerCubeArrayShadow1_Int1 =
+    static constexpr const TSymbolUniqueId textureSize_SamplerCubeShadow1_Int1 =
         TSymbolUniqueId(3723);
-    static constexpr const TSymbolUniqueId textureSizeExt_SamplerCubeArray1_Int1 =
+    static constexpr const TSymbolUniqueId textureSize_Sampler2DArrayShadow1_Int1 =
         TSymbolUniqueId(3724);
-    static constexpr const TSymbolUniqueId textureSizeExt_ISamplerCubeArray1_Int1 =
+    static constexpr const TSymbolUniqueId textureSize_SamplerCubeArray1_Int1 =
         TSymbolUniqueId(3725);
-    static constexpr const TSymbolUniqueId textureSizeExt_USamplerCubeArray1_Int1 =
+    static constexpr const TSymbolUniqueId textureSize_ISamplerCubeArray1_Int1 =
         TSymbolUniqueId(3726);
-    static constexpr const TSymbolUniqueId textureSizeExt_SamplerCubeArrayShadow1_Int1 =
+    static constexpr const TSymbolUniqueId textureSize_USamplerCubeArray1_Int1 =
         TSymbolUniqueId(3727);
-    static constexpr const TSymbolUniqueId textureSize_SamplerBuffer1       = TSymbolUniqueId(3728);
-    static constexpr const TSymbolUniqueId pt00j                            = TSymbolUniqueId(3729);
-    static constexpr const TSymbolUniqueId textureSize_ISamplerBuffer1      = TSymbolUniqueId(3730);
-    static constexpr const TSymbolUniqueId pt00r                            = TSymbolUniqueId(3731);
-    static constexpr const TSymbolUniqueId textureSize_USamplerBuffer1      = TSymbolUniqueId(3732);
-    static constexpr const TSymbolUniqueId pt00w                            = TSymbolUniqueId(3733);
-    static constexpr const TSymbolUniqueId textureSizeExt_SamplerBuffer1    = TSymbolUniqueId(3734);
-    static constexpr const TSymbolUniqueId textureSizeExt_ISamplerBuffer1   = TSymbolUniqueId(3735);
-    static constexpr const TSymbolUniqueId textureSizeExt_USamplerBuffer1   = TSymbolUniqueId(3736);
-    static constexpr const TSymbolUniqueId textureSize_Sampler2DMS1         = TSymbolUniqueId(3737);
-    static constexpr const TSymbolUniqueId pt00P                            = TSymbolUniqueId(3738);
-    static constexpr const TSymbolUniqueId textureSize_ISampler2DMS1        = TSymbolUniqueId(3739);
-    static constexpr const TSymbolUniqueId pt00V                            = TSymbolUniqueId(3740);
-    static constexpr const TSymbolUniqueId textureSize_USampler2DMS1        = TSymbolUniqueId(3741);
-    static constexpr const TSymbolUniqueId pt00b                            = TSymbolUniqueId(3742);
-    static constexpr const TSymbolUniqueId textureSizeExt_Sampler2DMS1      = TSymbolUniqueId(3743);
-    static constexpr const TSymbolUniqueId textureSizeExt_ISampler2DMS1     = TSymbolUniqueId(3744);
-    static constexpr const TSymbolUniqueId textureSizeExt_USampler2DMS1     = TSymbolUniqueId(3745);
-    static constexpr const TSymbolUniqueId textureSizeExt_Sampler2DMSArray1 = TSymbolUniqueId(3746);
-    static constexpr const TSymbolUniqueId pt00Q                            = TSymbolUniqueId(3747);
+    static constexpr const TSymbolUniqueId textureSize_SamplerCubeArrayShadow1_Int1 =
+        TSymbolUniqueId(3728);
+    static constexpr const TSymbolUniqueId textureSizeExt_SamplerCubeArray1_Int1 =
+        TSymbolUniqueId(3729);
+    static constexpr const TSymbolUniqueId textureSizeExt_ISamplerCubeArray1_Int1 =
+        TSymbolUniqueId(3730);
+    static constexpr const TSymbolUniqueId textureSizeExt_USamplerCubeArray1_Int1 =
+        TSymbolUniqueId(3731);
+    static constexpr const TSymbolUniqueId textureSizeExt_SamplerCubeArrayShadow1_Int1 =
+        TSymbolUniqueId(3732);
+    static constexpr const TSymbolUniqueId textureSize_SamplerBuffer1       = TSymbolUniqueId(3733);
+    static constexpr const TSymbolUniqueId pt00j                            = TSymbolUniqueId(3734);
+    static constexpr const TSymbolUniqueId textureSize_ISamplerBuffer1      = TSymbolUniqueId(3735);
+    static constexpr const TSymbolUniqueId pt00r                            = TSymbolUniqueId(3736);
+    static constexpr const TSymbolUniqueId textureSize_USamplerBuffer1      = TSymbolUniqueId(3737);
+    static constexpr const TSymbolUniqueId pt00w                            = TSymbolUniqueId(3738);
+    static constexpr const TSymbolUniqueId textureSizeExt_SamplerBuffer1    = TSymbolUniqueId(3739);
+    static constexpr const TSymbolUniqueId textureSizeExt_ISamplerBuffer1   = TSymbolUniqueId(3740);
+    static constexpr const TSymbolUniqueId textureSizeExt_USamplerBuffer1   = TSymbolUniqueId(3741);
+    static constexpr const TSymbolUniqueId textureSize_Sampler2DMS1         = TSymbolUniqueId(3742);
+    static constexpr const TSymbolUniqueId pt00P                            = TSymbolUniqueId(3743);
+    static constexpr const TSymbolUniqueId textureSize_ISampler2DMS1        = TSymbolUniqueId(3744);
+    static constexpr const TSymbolUniqueId pt00V                            = TSymbolUniqueId(3745);
+    static constexpr const TSymbolUniqueId textureSize_USampler2DMS1        = TSymbolUniqueId(3746);
+    static constexpr const TSymbolUniqueId pt00b                            = TSymbolUniqueId(3747);
+    static constexpr const TSymbolUniqueId textureSizeExt_Sampler2DMS1      = TSymbolUniqueId(3748);
+    static constexpr const TSymbolUniqueId textureSizeExt_ISampler2DMS1     = TSymbolUniqueId(3749);
+    static constexpr const TSymbolUniqueId textureSizeExt_USampler2DMS1     = TSymbolUniqueId(3750);
+    static constexpr const TSymbolUniqueId textureSizeExt_Sampler2DMSArray1 = TSymbolUniqueId(3751);
+    static constexpr const TSymbolUniqueId pt00Q                            = TSymbolUniqueId(3752);
     static constexpr const TSymbolUniqueId textureSizeExt_ISampler2DMSArray1 =
-        TSymbolUniqueId(3748);
-    static constexpr const TSymbolUniqueId pt00W = TSymbolUniqueId(3749);
-    static constexpr const TSymbolUniqueId textureSizeExt_USampler2DMSArray1 =
-        TSymbolUniqueId(3750);
-    static constexpr const TSymbolUniqueId pt00c = TSymbolUniqueId(3751);
-    static constexpr const TSymbolUniqueId textureSize_SamplerExternalOES1_Int1 =
-        TSymbolUniqueId(3752);
-    static constexpr const TSymbolUniqueId textureSize_SamplerExternal2DY2YEXT1_Int1 =
         TSymbolUniqueId(3753);
-    static constexpr const TSymbolUniqueId textureProjLod_Sampler2D1_Float3_Float1 =
-        TSymbolUniqueId(3754);
-    static constexpr const TSymbolUniqueId textureProjLod_ISampler2D1_Float3_Float1 =
+    static constexpr const TSymbolUniqueId pt00W = TSymbolUniqueId(3754);
+    static constexpr const TSymbolUniqueId textureSizeExt_USampler2DMSArray1 =
         TSymbolUniqueId(3755);
-    static constexpr const TSymbolUniqueId textureProjLod_USampler2D1_Float3_Float1 =
-        TSymbolUniqueId(3756);
-    static constexpr const TSymbolUniqueId textureProjLod_Sampler2D1_Float4_Float1 =
+    static constexpr const TSymbolUniqueId pt00c = TSymbolUniqueId(3756);
+    static constexpr const TSymbolUniqueId textureSize_SamplerExternalOES1_Int1 =
         TSymbolUniqueId(3757);
-    static constexpr const TSymbolUniqueId textureProjLod_ISampler2D1_Float4_Float1 =
+    static constexpr const TSymbolUniqueId textureSize_SamplerExternal2DY2YEXT1_Int1 =
         TSymbolUniqueId(3758);
-    static constexpr const TSymbolUniqueId textureProjLod_USampler2D1_Float4_Float1 =
+    static constexpr const TSymbolUniqueId textureProjLod_Sampler2D1_Float3_Float1 =
         TSymbolUniqueId(3759);
-    static constexpr const TSymbolUniqueId textureProjLod_Sampler3D1_Float4_Float1 =
+    static constexpr const TSymbolUniqueId textureProjLod_ISampler2D1_Float3_Float1 =
         TSymbolUniqueId(3760);
-    static constexpr const TSymbolUniqueId textureProjLod_ISampler3D1_Float4_Float1 =
+    static constexpr const TSymbolUniqueId textureProjLod_USampler2D1_Float3_Float1 =
         TSymbolUniqueId(3761);
-    static constexpr const TSymbolUniqueId textureProjLod_USampler3D1_Float4_Float1 =
+    static constexpr const TSymbolUniqueId textureProjLod_Sampler2D1_Float4_Float1 =
         TSymbolUniqueId(3762);
-    static constexpr const TSymbolUniqueId textureProjLod_Sampler2DShadow1_Float4_Float1 =
+    static constexpr const TSymbolUniqueId textureProjLod_ISampler2D1_Float4_Float1 =
         TSymbolUniqueId(3763);
-    static constexpr const TSymbolUniqueId texelFetch_Sampler2D1_Int2_Int1  = TSymbolUniqueId(3764);
-    static constexpr const TSymbolUniqueId texelFetch_ISampler2D1_Int2_Int1 = TSymbolUniqueId(3765);
-    static constexpr const TSymbolUniqueId texelFetch_USampler2D1_Int2_Int1 = TSymbolUniqueId(3766);
-    static constexpr const TSymbolUniqueId texelFetch_Sampler3D1_Int3_Int1  = TSymbolUniqueId(3767);
-    static constexpr const TSymbolUniqueId texelFetch_ISampler3D1_Int3_Int1 = TSymbolUniqueId(3768);
-    static constexpr const TSymbolUniqueId texelFetch_USampler3D1_Int3_Int1 = TSymbolUniqueId(3769);
+    static constexpr const TSymbolUniqueId textureProjLod_USampler2D1_Float4_Float1 =
+        TSymbolUniqueId(3764);
+    static constexpr const TSymbolUniqueId textureProjLod_Sampler3D1_Float4_Float1 =
+        TSymbolUniqueId(3765);
+    static constexpr const TSymbolUniqueId textureProjLod_ISampler3D1_Float4_Float1 =
+        TSymbolUniqueId(3766);
+    static constexpr const TSymbolUniqueId textureProjLod_USampler3D1_Float4_Float1 =
+        TSymbolUniqueId(3767);
+    static constexpr const TSymbolUniqueId textureProjLod_Sampler2DShadow1_Float4_Float1 =
+        TSymbolUniqueId(3768);
+    static constexpr const TSymbolUniqueId texelFetch_Sampler2D1_Int2_Int1  = TSymbolUniqueId(3769);
+    static constexpr const TSymbolUniqueId texelFetch_ISampler2D1_Int2_Int1 = TSymbolUniqueId(3770);
+    static constexpr const TSymbolUniqueId texelFetch_USampler2D1_Int2_Int1 = TSymbolUniqueId(3771);
+    static constexpr const TSymbolUniqueId texelFetch_Sampler3D1_Int3_Int1  = TSymbolUniqueId(3772);
+    static constexpr const TSymbolUniqueId texelFetch_ISampler3D1_Int3_Int1 = TSymbolUniqueId(3773);
+    static constexpr const TSymbolUniqueId texelFetch_USampler3D1_Int3_Int1 = TSymbolUniqueId(3774);
     static constexpr const TSymbolUniqueId texelFetch_Sampler2DArray1_Int3_Int1 =
-        TSymbolUniqueId(3770);
+        TSymbolUniqueId(3775);
     static constexpr const TSymbolUniqueId texelFetch_ISampler2DArray1_Int3_Int1 =
-        TSymbolUniqueId(3771);
-    static constexpr const TSymbolUniqueId texelFetch_USampler2DArray1_Int3_Int1 =
-        TSymbolUniqueId(3772);
-    static constexpr const TSymbolUniqueId texelFetch_SamplerBuffer1_Int1  = TSymbolUniqueId(3773);
-    static constexpr const TSymbolUniqueId texelFetch_ISamplerBuffer1_Int1 = TSymbolUniqueId(3774);
-    static constexpr const TSymbolUniqueId texelFetch_USamplerBuffer1_Int1 = TSymbolUniqueId(3775);
-    static constexpr const TSymbolUniqueId texelFetchExt_SamplerBuffer1_Int1 =
         TSymbolUniqueId(3776);
-    static constexpr const TSymbolUniqueId texelFetchExt_ISamplerBuffer1_Int1 =
+    static constexpr const TSymbolUniqueId texelFetch_USampler2DArray1_Int3_Int1 =
         TSymbolUniqueId(3777);
-    static constexpr const TSymbolUniqueId texelFetchExt_USamplerBuffer1_Int1 =
-        TSymbolUniqueId(3778);
-    static constexpr const TSymbolUniqueId texelFetch_Sampler2DMS1_Int2_Int1 =
-        TSymbolUniqueId(3779);
-    static constexpr const TSymbolUniqueId texelFetch_ISampler2DMS1_Int2_Int1 =
-        TSymbolUniqueId(3780);
-    static constexpr const TSymbolUniqueId texelFetch_USampler2DMS1_Int2_Int1 =
+    static constexpr const TSymbolUniqueId texelFetch_SamplerBuffer1_Int1  = TSymbolUniqueId(3778);
+    static constexpr const TSymbolUniqueId texelFetch_ISamplerBuffer1_Int1 = TSymbolUniqueId(3779);
+    static constexpr const TSymbolUniqueId texelFetch_USamplerBuffer1_Int1 = TSymbolUniqueId(3780);
+    static constexpr const TSymbolUniqueId texelFetchExt_SamplerBuffer1_Int1 =
         TSymbolUniqueId(3781);
-    static constexpr const TSymbolUniqueId texelFetchExt_Sampler2DMS1_Int2_Int1 =
+    static constexpr const TSymbolUniqueId texelFetchExt_ISamplerBuffer1_Int1 =
         TSymbolUniqueId(3782);
-    static constexpr const TSymbolUniqueId texelFetchExt_ISampler2DMS1_Int2_Int1 =
+    static constexpr const TSymbolUniqueId texelFetchExt_USamplerBuffer1_Int1 =
         TSymbolUniqueId(3783);
-    static constexpr const TSymbolUniqueId texelFetchExt_USampler2DMS1_Int2_Int1 =
+    static constexpr const TSymbolUniqueId texelFetch_Sampler2DMS1_Int2_Int1 =
         TSymbolUniqueId(3784);
-    static constexpr const TSymbolUniqueId texelFetchExt_Sampler2DMSArray1_Int3_Int1 =
+    static constexpr const TSymbolUniqueId texelFetch_ISampler2DMS1_Int2_Int1 =
         TSymbolUniqueId(3785);
-    static constexpr const TSymbolUniqueId texelFetchExt_ISampler2DMSArray1_Int3_Int1 =
+    static constexpr const TSymbolUniqueId texelFetch_USampler2DMS1_Int2_Int1 =
         TSymbolUniqueId(3786);
-    static constexpr const TSymbolUniqueId texelFetchExt_USampler2DMSArray1_Int3_Int1 =
+    static constexpr const TSymbolUniqueId texelFetchExt_Sampler2DMS1_Int2_Int1 =
         TSymbolUniqueId(3787);
-    static constexpr const TSymbolUniqueId texelFetch_SamplerExternalOES1_Int2_Int1 =
+    static constexpr const TSymbolUniqueId texelFetchExt_ISampler2DMS1_Int2_Int1 =
         TSymbolUniqueId(3788);
-    static constexpr const TSymbolUniqueId texelFetch_SamplerExternal2DY2YEXT1_Int2_Int1 =
+    static constexpr const TSymbolUniqueId texelFetchExt_USampler2DMS1_Int2_Int1 =
         TSymbolUniqueId(3789);
-    static constexpr const TSymbolUniqueId textureGrad_Sampler2D1_Float2_Float2_Float2 =
+    static constexpr const TSymbolUniqueId texelFetchExt_Sampler2DMSArray1_Int3_Int1 =
         TSymbolUniqueId(3790);
-    static constexpr const TSymbolUniqueId textureGrad_ISampler2D1_Float2_Float2_Float2 =
+    static constexpr const TSymbolUniqueId texelFetchExt_ISampler2DMSArray1_Int3_Int1 =
         TSymbolUniqueId(3791);
-    static constexpr const TSymbolUniqueId textureGrad_USampler2D1_Float2_Float2_Float2 =
+    static constexpr const TSymbolUniqueId texelFetchExt_USampler2DMSArray1_Int3_Int1 =
         TSymbolUniqueId(3792);
-    static constexpr const TSymbolUniqueId textureGrad_Sampler3D1_Float3_Float3_Float3 =
+    static constexpr const TSymbolUniqueId texelFetch_SamplerExternalOES1_Int2_Int1 =
         TSymbolUniqueId(3793);
-    static constexpr const TSymbolUniqueId textureGrad_ISampler3D1_Float3_Float3_Float3 =
+    static constexpr const TSymbolUniqueId texelFetch_SamplerExternal2DY2YEXT1_Int2_Int1 =
         TSymbolUniqueId(3794);
-    static constexpr const TSymbolUniqueId textureGrad_USampler3D1_Float3_Float3_Float3 =
+    static constexpr const TSymbolUniqueId textureGrad_Sampler2D1_Float2_Float2_Float2 =
         TSymbolUniqueId(3795);
-    static constexpr const TSymbolUniqueId textureGrad_SamplerCube1_Float3_Float3_Float3 =
+    static constexpr const TSymbolUniqueId textureGrad_ISampler2D1_Float2_Float2_Float2 =
         TSymbolUniqueId(3796);
-    static constexpr const TSymbolUniqueId textureGrad_ISamplerCube1_Float3_Float3_Float3 =
+    static constexpr const TSymbolUniqueId textureGrad_USampler2D1_Float2_Float2_Float2 =
         TSymbolUniqueId(3797);
-    static constexpr const TSymbolUniqueId textureGrad_USamplerCube1_Float3_Float3_Float3 =
+    static constexpr const TSymbolUniqueId textureGrad_Sampler3D1_Float3_Float3_Float3 =
         TSymbolUniqueId(3798);
-    static constexpr const TSymbolUniqueId textureGrad_Sampler2DShadow1_Float3_Float2_Float2 =
+    static constexpr const TSymbolUniqueId textureGrad_ISampler3D1_Float3_Float3_Float3 =
         TSymbolUniqueId(3799);
-    static constexpr const TSymbolUniqueId textureGrad_SamplerCubeShadow1_Float4_Float3_Float3 =
+    static constexpr const TSymbolUniqueId textureGrad_USampler3D1_Float3_Float3_Float3 =
         TSymbolUniqueId(3800);
-    static constexpr const TSymbolUniqueId textureGrad_Sampler2DArray1_Float3_Float2_Float2 =
+    static constexpr const TSymbolUniqueId textureGrad_SamplerCube1_Float3_Float3_Float3 =
         TSymbolUniqueId(3801);
-    static constexpr const TSymbolUniqueId textureGrad_ISampler2DArray1_Float3_Float2_Float2 =
+    static constexpr const TSymbolUniqueId textureGrad_ISamplerCube1_Float3_Float3_Float3 =
         TSymbolUniqueId(3802);
-    static constexpr const TSymbolUniqueId textureGrad_USampler2DArray1_Float3_Float2_Float2 =
+    static constexpr const TSymbolUniqueId textureGrad_USamplerCube1_Float3_Float3_Float3 =
         TSymbolUniqueId(3803);
-    static constexpr const TSymbolUniqueId textureGrad_Sampler2DArrayShadow1_Float4_Float2_Float2 =
+    static constexpr const TSymbolUniqueId textureGrad_Sampler2DShadow1_Float3_Float2_Float2 =
         TSymbolUniqueId(3804);
-    static constexpr const TSymbolUniqueId textureGrad_SamplerCubeArray1_Float4_Float3_Float3 =
+    static constexpr const TSymbolUniqueId textureGrad_SamplerCubeShadow1_Float4_Float3_Float3 =
         TSymbolUniqueId(3805);
-    static constexpr const TSymbolUniqueId textureGrad_ISamplerCubeArray1_Float4_Float3_Float3 =
+    static constexpr const TSymbolUniqueId textureGrad_Sampler2DArray1_Float3_Float2_Float2 =
         TSymbolUniqueId(3806);
-    static constexpr const TSymbolUniqueId textureGrad_USamplerCubeArray1_Float4_Float3_Float3 =
+    static constexpr const TSymbolUniqueId textureGrad_ISampler2DArray1_Float3_Float2_Float2 =
         TSymbolUniqueId(3807);
-    static constexpr const TSymbolUniqueId textureGradExt_SamplerCubeArray1_Float4_Float3_Float3 =
+    static constexpr const TSymbolUniqueId textureGrad_USampler2DArray1_Float3_Float2_Float2 =
         TSymbolUniqueId(3808);
-    static constexpr const TSymbolUniqueId textureGradExt_ISamplerCubeArray1_Float4_Float3_Float3 =
+    static constexpr const TSymbolUniqueId textureGrad_Sampler2DArrayShadow1_Float4_Float2_Float2 =
         TSymbolUniqueId(3809);
-    static constexpr const TSymbolUniqueId textureGradExt_USamplerCubeArray1_Float4_Float3_Float3 =
+    static constexpr const TSymbolUniqueId textureGrad_SamplerCubeArray1_Float4_Float3_Float3 =
         TSymbolUniqueId(3810);
-    static constexpr const TSymbolUniqueId textureProjGrad_Sampler2D1_Float3_Float2_Float2 =
+    static constexpr const TSymbolUniqueId textureGrad_ISamplerCubeArray1_Float4_Float3_Float3 =
         TSymbolUniqueId(3811);
-    static constexpr const TSymbolUniqueId textureProjGrad_ISampler2D1_Float3_Float2_Float2 =
+    static constexpr const TSymbolUniqueId textureGrad_USamplerCubeArray1_Float4_Float3_Float3 =
         TSymbolUniqueId(3812);
-    static constexpr const TSymbolUniqueId textureProjGrad_USampler2D1_Float3_Float2_Float2 =
+    static constexpr const TSymbolUniqueId textureGradExt_SamplerCubeArray1_Float4_Float3_Float3 =
         TSymbolUniqueId(3813);
-    static constexpr const TSymbolUniqueId textureProjGrad_Sampler2D1_Float4_Float2_Float2 =
+    static constexpr const TSymbolUniqueId textureGradExt_ISamplerCubeArray1_Float4_Float3_Float3 =
         TSymbolUniqueId(3814);
-    static constexpr const TSymbolUniqueId textureProjGrad_ISampler2D1_Float4_Float2_Float2 =
+    static constexpr const TSymbolUniqueId textureGradExt_USamplerCubeArray1_Float4_Float3_Float3 =
         TSymbolUniqueId(3815);
-    static constexpr const TSymbolUniqueId textureProjGrad_USampler2D1_Float4_Float2_Float2 =
+    static constexpr const TSymbolUniqueId textureProjGrad_Sampler2D1_Float3_Float2_Float2 =
         TSymbolUniqueId(3816);
-    static constexpr const TSymbolUniqueId textureProjGrad_Sampler3D1_Float4_Float3_Float3 =
+    static constexpr const TSymbolUniqueId textureProjGrad_ISampler2D1_Float3_Float2_Float2 =
         TSymbolUniqueId(3817);
-    static constexpr const TSymbolUniqueId textureProjGrad_ISampler3D1_Float4_Float3_Float3 =
+    static constexpr const TSymbolUniqueId textureProjGrad_USampler2D1_Float3_Float2_Float2 =
         TSymbolUniqueId(3818);
-    static constexpr const TSymbolUniqueId textureProjGrad_USampler3D1_Float4_Float3_Float3 =
+    static constexpr const TSymbolUniqueId textureProjGrad_Sampler2D1_Float4_Float2_Float2 =
         TSymbolUniqueId(3819);
-    static constexpr const TSymbolUniqueId textureProjGrad_Sampler2DShadow1_Float4_Float2_Float2 =
+    static constexpr const TSymbolUniqueId textureProjGrad_ISampler2D1_Float4_Float2_Float2 =
         TSymbolUniqueId(3820);
-    static constexpr const TSymbolUniqueId texture_Sampler2D1_Float2_Float1 = TSymbolUniqueId(3821);
-    static constexpr const TSymbolUniqueId texture_ISampler2D1_Float2_Float1 =
+    static constexpr const TSymbolUniqueId textureProjGrad_USampler2D1_Float4_Float2_Float2 =
+        TSymbolUniqueId(3821);
+    static constexpr const TSymbolUniqueId textureProjGrad_Sampler3D1_Float4_Float3_Float3 =
         TSymbolUniqueId(3822);
-    static constexpr const TSymbolUniqueId texture_USampler2D1_Float2_Float1 =
+    static constexpr const TSymbolUniqueId textureProjGrad_ISampler3D1_Float4_Float3_Float3 =
         TSymbolUniqueId(3823);
-    static constexpr const TSymbolUniqueId texture_Sampler3D1_Float3_Float1 = TSymbolUniqueId(3824);
-    static constexpr const TSymbolUniqueId texture_ISampler3D1_Float3_Float1 =
+    static constexpr const TSymbolUniqueId textureProjGrad_USampler3D1_Float4_Float3_Float3 =
+        TSymbolUniqueId(3824);
+    static constexpr const TSymbolUniqueId textureProjGrad_Sampler2DShadow1_Float4_Float2_Float2 =
         TSymbolUniqueId(3825);
-    static constexpr const TSymbolUniqueId texture_USampler3D1_Float3_Float1 =
-        TSymbolUniqueId(3826);
-    static constexpr const TSymbolUniqueId texture_SamplerCube1_Float3_Float1 =
+    static constexpr const TSymbolUniqueId texture_Sampler2D1_Float2_Float1 = TSymbolUniqueId(3826);
+    static constexpr const TSymbolUniqueId texture_ISampler2D1_Float2_Float1 =
         TSymbolUniqueId(3827);
-    static constexpr const TSymbolUniqueId texture_ISamplerCube1_Float3_Float1 =
+    static constexpr const TSymbolUniqueId texture_USampler2D1_Float2_Float1 =
         TSymbolUniqueId(3828);
-    static constexpr const TSymbolUniqueId texture_USamplerCube1_Float3_Float1 =
-        TSymbolUniqueId(3829);
-    static constexpr const TSymbolUniqueId texture_Sampler2DArray1_Float3_Float1 =
+    static constexpr const TSymbolUniqueId texture_Sampler3D1_Float3_Float1 = TSymbolUniqueId(3829);
+    static constexpr const TSymbolUniqueId texture_ISampler3D1_Float3_Float1 =
         TSymbolUniqueId(3830);
-    static constexpr const TSymbolUniqueId texture_ISampler2DArray1_Float3_Float1 =
+    static constexpr const TSymbolUniqueId texture_USampler3D1_Float3_Float1 =
         TSymbolUniqueId(3831);
-    static constexpr const TSymbolUniqueId texture_USampler2DArray1_Float3_Float1 =
+    static constexpr const TSymbolUniqueId texture_SamplerCube1_Float3_Float1 =
         TSymbolUniqueId(3832);
-    static constexpr const TSymbolUniqueId textureProj_Sampler2D1_Float3_Float1 =
+    static constexpr const TSymbolUniqueId texture_ISamplerCube1_Float3_Float1 =
         TSymbolUniqueId(3833);
-    static constexpr const TSymbolUniqueId textureProj_ISampler2D1_Float3_Float1 =
+    static constexpr const TSymbolUniqueId texture_USamplerCube1_Float3_Float1 =
         TSymbolUniqueId(3834);
-    static constexpr const TSymbolUniqueId textureProj_USampler2D1_Float3_Float1 =
+    static constexpr const TSymbolUniqueId texture_Sampler2DArray1_Float3_Float1 =
         TSymbolUniqueId(3835);
-    static constexpr const TSymbolUniqueId textureProj_Sampler2D1_Float4_Float1 =
+    static constexpr const TSymbolUniqueId texture_ISampler2DArray1_Float3_Float1 =
         TSymbolUniqueId(3836);
-    static constexpr const TSymbolUniqueId textureProj_ISampler2D1_Float4_Float1 =
+    static constexpr const TSymbolUniqueId texture_USampler2DArray1_Float3_Float1 =
         TSymbolUniqueId(3837);
-    static constexpr const TSymbolUniqueId textureProj_USampler2D1_Float4_Float1 =
+    static constexpr const TSymbolUniqueId textureProj_Sampler2D1_Float3_Float1 =
         TSymbolUniqueId(3838);
-    static constexpr const TSymbolUniqueId textureProj_Sampler3D1_Float4_Float1 =
+    static constexpr const TSymbolUniqueId textureProj_ISampler2D1_Float3_Float1 =
         TSymbolUniqueId(3839);
-    static constexpr const TSymbolUniqueId textureProj_ISampler3D1_Float4_Float1 =
+    static constexpr const TSymbolUniqueId textureProj_USampler2D1_Float3_Float1 =
         TSymbolUniqueId(3840);
-    static constexpr const TSymbolUniqueId textureProj_USampler3D1_Float4_Float1 =
+    static constexpr const TSymbolUniqueId textureProj_Sampler2D1_Float4_Float1 =
         TSymbolUniqueId(3841);
-    static constexpr const TSymbolUniqueId texture_Sampler2DShadow1_Float3_Float1 =
+    static constexpr const TSymbolUniqueId textureProj_ISampler2D1_Float4_Float1 =
         TSymbolUniqueId(3842);
-    static constexpr const TSymbolUniqueId texture_SamplerCubeShadow1_Float4_Float1 =
+    static constexpr const TSymbolUniqueId textureProj_USampler2D1_Float4_Float1 =
         TSymbolUniqueId(3843);
-    static constexpr const TSymbolUniqueId textureProj_Sampler2DShadow1_Float4_Float1 =
+    static constexpr const TSymbolUniqueId textureProj_Sampler3D1_Float4_Float1 =
         TSymbolUniqueId(3844);
-    static constexpr const TSymbolUniqueId texture_SamplerCubeArray1_Float4_Float1 =
+    static constexpr const TSymbolUniqueId textureProj_ISampler3D1_Float4_Float1 =
         TSymbolUniqueId(3845);
-    static constexpr const TSymbolUniqueId texture_ISamplerCubeArray1_Float4_Float1 =
+    static constexpr const TSymbolUniqueId textureProj_USampler3D1_Float4_Float1 =
         TSymbolUniqueId(3846);
-    static constexpr const TSymbolUniqueId texture_USamplerCubeArray1_Float4_Float1 =
+    static constexpr const TSymbolUniqueId texture_Sampler2DShadow1_Float3_Float1 =
         TSymbolUniqueId(3847);
-    static constexpr const TSymbolUniqueId textureExt_SamplerCubeArray1_Float4_Float1 =
+    static constexpr const TSymbolUniqueId texture_SamplerCubeShadow1_Float4_Float1 =
         TSymbolUniqueId(3848);
-    static constexpr const TSymbolUniqueId textureExt_ISamplerCubeArray1_Float4_Float1 =
+    static constexpr const TSymbolUniqueId textureProj_Sampler2DShadow1_Float4_Float1 =
         TSymbolUniqueId(3849);
-    static constexpr const TSymbolUniqueId textureExt_USamplerCubeArray1_Float4_Float1 =
+    static constexpr const TSymbolUniqueId texture_SamplerCubeArray1_Float4_Float1 =
         TSymbolUniqueId(3850);
-    static constexpr const TSymbolUniqueId texture_SamplerExternalOES1_Float2_Float1 =
+    static constexpr const TSymbolUniqueId texture_ISamplerCubeArray1_Float4_Float1 =
         TSymbolUniqueId(3851);
-    static constexpr const TSymbolUniqueId textureProj_SamplerExternalOES1_Float3_Float1 =
+    static constexpr const TSymbolUniqueId texture_USamplerCubeArray1_Float4_Float1 =
         TSymbolUniqueId(3852);
-    static constexpr const TSymbolUniqueId textureProj_SamplerExternalOES1_Float4_Float1 =
+    static constexpr const TSymbolUniqueId textureExt_SamplerCubeArray1_Float4_Float1 =
         TSymbolUniqueId(3853);
-    static constexpr const TSymbolUniqueId texture_SamplerExternal2DY2YEXT1_Float2_Float1 =
+    static constexpr const TSymbolUniqueId textureExt_ISamplerCubeArray1_Float4_Float1 =
         TSymbolUniqueId(3854);
-    static constexpr const TSymbolUniqueId textureProj_SamplerExternal2DY2YEXT1_Float3_Float1 =
+    static constexpr const TSymbolUniqueId textureExt_USamplerCubeArray1_Float4_Float1 =
         TSymbolUniqueId(3855);
-    static constexpr const TSymbolUniqueId textureProj_SamplerExternal2DY2YEXT1_Float4_Float1 =
+    static constexpr const TSymbolUniqueId texture_SamplerExternalOES1_Float2_Float1 =
         TSymbolUniqueId(3856);
-    static constexpr const TSymbolUniqueId textureOffset_Sampler2D1_Float2_Int2 =
+    static constexpr const TSymbolUniqueId textureProj_SamplerExternalOES1_Float3_Float1 =
         TSymbolUniqueId(3857);
-    static constexpr const TSymbolUniqueId textureOffset_ISampler2D1_Float2_Int2 =
+    static constexpr const TSymbolUniqueId textureProj_SamplerExternalOES1_Float4_Float1 =
         TSymbolUniqueId(3858);
-    static constexpr const TSymbolUniqueId textureOffset_USampler2D1_Float2_Int2 =
+    static constexpr const TSymbolUniqueId texture_SamplerExternal2DY2YEXT1_Float2_Float1 =
         TSymbolUniqueId(3859);
-    static constexpr const TSymbolUniqueId textureOffset_Sampler3D1_Float3_Int3 =
+    static constexpr const TSymbolUniqueId textureProj_SamplerExternal2DY2YEXT1_Float3_Float1 =
         TSymbolUniqueId(3860);
-    static constexpr const TSymbolUniqueId textureOffset_ISampler3D1_Float3_Int3 =
+    static constexpr const TSymbolUniqueId textureProj_SamplerExternal2DY2YEXT1_Float4_Float1 =
         TSymbolUniqueId(3861);
-    static constexpr const TSymbolUniqueId textureOffset_USampler3D1_Float3_Int3 =
+    static constexpr const TSymbolUniqueId textureOffset_Sampler2D1_Float2_Int2 =
         TSymbolUniqueId(3862);
-    static constexpr const TSymbolUniqueId textureOffset_Sampler2DShadow1_Float3_Int2 =
+    static constexpr const TSymbolUniqueId textureOffset_ISampler2D1_Float2_Int2 =
         TSymbolUniqueId(3863);
-    static constexpr const TSymbolUniqueId textureOffset_Sampler2DArray1_Float3_Int2 =
+    static constexpr const TSymbolUniqueId textureOffset_USampler2D1_Float2_Int2 =
         TSymbolUniqueId(3864);
-    static constexpr const TSymbolUniqueId textureOffset_ISampler2DArray1_Float3_Int2 =
+    static constexpr const TSymbolUniqueId textureOffset_Sampler3D1_Float3_Int3 =
         TSymbolUniqueId(3865);
-    static constexpr const TSymbolUniqueId textureOffset_USampler2DArray1_Float3_Int2 =
+    static constexpr const TSymbolUniqueId textureOffset_ISampler3D1_Float3_Int3 =
         TSymbolUniqueId(3866);
-    static constexpr const TSymbolUniqueId textureProjOffset_Sampler2D1_Float3_Int2 =
+    static constexpr const TSymbolUniqueId textureOffset_USampler3D1_Float3_Int3 =
         TSymbolUniqueId(3867);
-    static constexpr const TSymbolUniqueId textureProjOffset_ISampler2D1_Float3_Int2 =
+    static constexpr const TSymbolUniqueId textureOffset_Sampler2DShadow1_Float3_Int2 =
         TSymbolUniqueId(3868);
-    static constexpr const TSymbolUniqueId textureProjOffset_USampler2D1_Float3_Int2 =
+    static constexpr const TSymbolUniqueId textureOffset_Sampler2DArray1_Float3_Int2 =
         TSymbolUniqueId(3869);
-    static constexpr const TSymbolUniqueId textureProjOffset_Sampler2D1_Float4_Int2 =
+    static constexpr const TSymbolUniqueId textureOffset_ISampler2DArray1_Float3_Int2 =
         TSymbolUniqueId(3870);
-    static constexpr const TSymbolUniqueId textureProjOffset_ISampler2D1_Float4_Int2 =
+    static constexpr const TSymbolUniqueId textureOffset_USampler2DArray1_Float3_Int2 =
         TSymbolUniqueId(3871);
-    static constexpr const TSymbolUniqueId textureProjOffset_USampler2D1_Float4_Int2 =
+    static constexpr const TSymbolUniqueId textureProjOffset_Sampler2D1_Float3_Int2 =
         TSymbolUniqueId(3872);
-    static constexpr const TSymbolUniqueId textureProjOffset_Sampler3D1_Float4_Int3 =
+    static constexpr const TSymbolUniqueId textureProjOffset_ISampler2D1_Float3_Int2 =
         TSymbolUniqueId(3873);
-    static constexpr const TSymbolUniqueId textureProjOffset_ISampler3D1_Float4_Int3 =
+    static constexpr const TSymbolUniqueId textureProjOffset_USampler2D1_Float3_Int2 =
         TSymbolUniqueId(3874);
-    static constexpr const TSymbolUniqueId textureProjOffset_USampler3D1_Float4_Int3 =
+    static constexpr const TSymbolUniqueId textureProjOffset_Sampler2D1_Float4_Int2 =
         TSymbolUniqueId(3875);
-    static constexpr const TSymbolUniqueId textureProjOffset_Sampler2DShadow1_Float4_Int2 =
+    static constexpr const TSymbolUniqueId textureProjOffset_ISampler2D1_Float4_Int2 =
         TSymbolUniqueId(3876);
-    static constexpr const TSymbolUniqueId textureLodOffset_Sampler2D1_Float2_Float1_Int2 =
+    static constexpr const TSymbolUniqueId textureProjOffset_USampler2D1_Float4_Int2 =
         TSymbolUniqueId(3877);
-    static constexpr const TSymbolUniqueId textureLodOffset_ISampler2D1_Float2_Float1_Int2 =
+    static constexpr const TSymbolUniqueId textureProjOffset_Sampler3D1_Float4_Int3 =
         TSymbolUniqueId(3878);
-    static constexpr const TSymbolUniqueId textureLodOffset_USampler2D1_Float2_Float1_Int2 =
+    static constexpr const TSymbolUniqueId textureProjOffset_ISampler3D1_Float4_Int3 =
         TSymbolUniqueId(3879);
-    static constexpr const TSymbolUniqueId textureLodOffset_Sampler3D1_Float3_Float1_Int3 =
+    static constexpr const TSymbolUniqueId textureProjOffset_USampler3D1_Float4_Int3 =
         TSymbolUniqueId(3880);
-    static constexpr const TSymbolUniqueId textureLodOffset_ISampler3D1_Float3_Float1_Int3 =
+    static constexpr const TSymbolUniqueId textureProjOffset_Sampler2DShadow1_Float4_Int2 =
         TSymbolUniqueId(3881);
-    static constexpr const TSymbolUniqueId textureLodOffset_USampler3D1_Float3_Float1_Int3 =
+    static constexpr const TSymbolUniqueId textureLodOffset_Sampler2D1_Float2_Float1_Int2 =
         TSymbolUniqueId(3882);
-    static constexpr const TSymbolUniqueId textureLodOffset_Sampler2DShadow1_Float3_Float1_Int2 =
+    static constexpr const TSymbolUniqueId textureLodOffset_ISampler2D1_Float2_Float1_Int2 =
         TSymbolUniqueId(3883);
-    static constexpr const TSymbolUniqueId textureLodOffset_Sampler2DArray1_Float3_Float1_Int2 =
+    static constexpr const TSymbolUniqueId textureLodOffset_USampler2D1_Float2_Float1_Int2 =
         TSymbolUniqueId(3884);
-    static constexpr const TSymbolUniqueId textureLodOffset_ISampler2DArray1_Float3_Float1_Int2 =
+    static constexpr const TSymbolUniqueId textureLodOffset_Sampler3D1_Float3_Float1_Int3 =
         TSymbolUniqueId(3885);
-    static constexpr const TSymbolUniqueId textureLodOffset_USampler2DArray1_Float3_Float1_Int2 =
+    static constexpr const TSymbolUniqueId textureLodOffset_ISampler3D1_Float3_Float1_Int3 =
         TSymbolUniqueId(3886);
-    static constexpr const TSymbolUniqueId textureProjLodOffset_Sampler2D1_Float3_Float1_Int2 =
+    static constexpr const TSymbolUniqueId textureLodOffset_USampler3D1_Float3_Float1_Int3 =
         TSymbolUniqueId(3887);
-    static constexpr const TSymbolUniqueId textureProjLodOffset_ISampler2D1_Float3_Float1_Int2 =
+    static constexpr const TSymbolUniqueId textureLodOffset_Sampler2DShadow1_Float3_Float1_Int2 =
         TSymbolUniqueId(3888);
-    static constexpr const TSymbolUniqueId textureProjLodOffset_USampler2D1_Float3_Float1_Int2 =
+    static constexpr const TSymbolUniqueId textureLodOffset_Sampler2DArray1_Float3_Float1_Int2 =
         TSymbolUniqueId(3889);
-    static constexpr const TSymbolUniqueId textureProjLodOffset_Sampler2D1_Float4_Float1_Int2 =
+    static constexpr const TSymbolUniqueId textureLodOffset_ISampler2DArray1_Float3_Float1_Int2 =
         TSymbolUniqueId(3890);
-    static constexpr const TSymbolUniqueId textureProjLodOffset_ISampler2D1_Float4_Float1_Int2 =
+    static constexpr const TSymbolUniqueId textureLodOffset_USampler2DArray1_Float3_Float1_Int2 =
         TSymbolUniqueId(3891);
-    static constexpr const TSymbolUniqueId textureProjLodOffset_USampler2D1_Float4_Float1_Int2 =
+    static constexpr const TSymbolUniqueId textureProjLodOffset_Sampler2D1_Float3_Float1_Int2 =
         TSymbolUniqueId(3892);
-    static constexpr const TSymbolUniqueId textureProjLodOffset_Sampler3D1_Float4_Float1_Int3 =
+    static constexpr const TSymbolUniqueId textureProjLodOffset_ISampler2D1_Float3_Float1_Int2 =
         TSymbolUniqueId(3893);
-    static constexpr const TSymbolUniqueId textureProjLodOffset_ISampler3D1_Float4_Float1_Int3 =
+    static constexpr const TSymbolUniqueId textureProjLodOffset_USampler2D1_Float3_Float1_Int2 =
         TSymbolUniqueId(3894);
-    static constexpr const TSymbolUniqueId textureProjLodOffset_USampler3D1_Float4_Float1_Int3 =
+    static constexpr const TSymbolUniqueId textureProjLodOffset_Sampler2D1_Float4_Float1_Int2 =
         TSymbolUniqueId(3895);
-    static constexpr const TSymbolUniqueId
-        textureProjLodOffset_Sampler2DShadow1_Float4_Float1_Int2 = TSymbolUniqueId(3896);
-    static constexpr const TSymbolUniqueId texelFetchOffset_Sampler2D1_Int2_Int1_Int2 =
+    static constexpr const TSymbolUniqueId textureProjLodOffset_ISampler2D1_Float4_Float1_Int2 =
+        TSymbolUniqueId(3896);
+    static constexpr const TSymbolUniqueId textureProjLodOffset_USampler2D1_Float4_Float1_Int2 =
         TSymbolUniqueId(3897);
-    static constexpr const TSymbolUniqueId texelFetchOffset_ISampler2D1_Int2_Int1_Int2 =
+    static constexpr const TSymbolUniqueId textureProjLodOffset_Sampler3D1_Float4_Float1_Int3 =
         TSymbolUniqueId(3898);
-    static constexpr const TSymbolUniqueId texelFetchOffset_USampler2D1_Int2_Int1_Int2 =
+    static constexpr const TSymbolUniqueId textureProjLodOffset_ISampler3D1_Float4_Float1_Int3 =
         TSymbolUniqueId(3899);
-    static constexpr const TSymbolUniqueId texelFetchOffset_Sampler3D1_Int3_Int1_Int3 =
+    static constexpr const TSymbolUniqueId textureProjLodOffset_USampler3D1_Float4_Float1_Int3 =
         TSymbolUniqueId(3900);
-    static constexpr const TSymbolUniqueId texelFetchOffset_ISampler3D1_Int3_Int1_Int3 =
-        TSymbolUniqueId(3901);
-    static constexpr const TSymbolUniqueId texelFetchOffset_USampler3D1_Int3_Int1_Int3 =
+    static constexpr const TSymbolUniqueId
+        textureProjLodOffset_Sampler2DShadow1_Float4_Float1_Int2 = TSymbolUniqueId(3901);
+    static constexpr const TSymbolUniqueId texelFetchOffset_Sampler2D1_Int2_Int1_Int2 =
         TSymbolUniqueId(3902);
-    static constexpr const TSymbolUniqueId texelFetchOffset_Sampler2DArray1_Int3_Int1_Int2 =
+    static constexpr const TSymbolUniqueId texelFetchOffset_ISampler2D1_Int2_Int1_Int2 =
         TSymbolUniqueId(3903);
-    static constexpr const TSymbolUniqueId texelFetchOffset_ISampler2DArray1_Int3_Int1_Int2 =
+    static constexpr const TSymbolUniqueId texelFetchOffset_USampler2D1_Int2_Int1_Int2 =
         TSymbolUniqueId(3904);
-    static constexpr const TSymbolUniqueId texelFetchOffset_USampler2DArray1_Int3_Int1_Int2 =
+    static constexpr const TSymbolUniqueId texelFetchOffset_Sampler3D1_Int3_Int1_Int3 =
         TSymbolUniqueId(3905);
-    static constexpr const TSymbolUniqueId textureGradOffset_Sampler2D1_Float2_Float2_Float2_Int2 =
+    static constexpr const TSymbolUniqueId texelFetchOffset_ISampler3D1_Int3_Int1_Int3 =
         TSymbolUniqueId(3906);
-    static constexpr const TSymbolUniqueId textureGradOffset_ISampler2D1_Float2_Float2_Float2_Int2 =
+    static constexpr const TSymbolUniqueId texelFetchOffset_USampler3D1_Int3_Int1_Int3 =
         TSymbolUniqueId(3907);
-    static constexpr const TSymbolUniqueId textureGradOffset_USampler2D1_Float2_Float2_Float2_Int2 =
+    static constexpr const TSymbolUniqueId texelFetchOffset_Sampler2DArray1_Int3_Int1_Int2 =
         TSymbolUniqueId(3908);
-    static constexpr const TSymbolUniqueId textureGradOffset_Sampler3D1_Float3_Float3_Float3_Int3 =
+    static constexpr const TSymbolUniqueId texelFetchOffset_ISampler2DArray1_Int3_Int1_Int2 =
         TSymbolUniqueId(3909);
-    static constexpr const TSymbolUniqueId textureGradOffset_ISampler3D1_Float3_Float3_Float3_Int3 =
+    static constexpr const TSymbolUniqueId texelFetchOffset_USampler2DArray1_Int3_Int1_Int2 =
         TSymbolUniqueId(3910);
-    static constexpr const TSymbolUniqueId textureGradOffset_USampler3D1_Float3_Float3_Float3_Int3 =
+    static constexpr const TSymbolUniqueId textureGradOffset_Sampler2D1_Float2_Float2_Float2_Int2 =
         TSymbolUniqueId(3911);
+    static constexpr const TSymbolUniqueId textureGradOffset_ISampler2D1_Float2_Float2_Float2_Int2 =
+        TSymbolUniqueId(3912);
+    static constexpr const TSymbolUniqueId textureGradOffset_USampler2D1_Float2_Float2_Float2_Int2 =
+        TSymbolUniqueId(3913);
+    static constexpr const TSymbolUniqueId textureGradOffset_Sampler3D1_Float3_Float3_Float3_Int3 =
+        TSymbolUniqueId(3914);
+    static constexpr const TSymbolUniqueId textureGradOffset_ISampler3D1_Float3_Float3_Float3_Int3 =
+        TSymbolUniqueId(3915);
+    static constexpr const TSymbolUniqueId textureGradOffset_USampler3D1_Float3_Float3_Float3_Int3 =
+        TSymbolUniqueId(3916);
     static constexpr const TSymbolUniqueId
-        textureGradOffset_Sampler2DShadow1_Float3_Float2_Float2_Int2 = TSymbolUniqueId(3912);
+        textureGradOffset_Sampler2DShadow1_Float3_Float2_Float2_Int2 = TSymbolUniqueId(3917);
     static constexpr const TSymbolUniqueId
-        textureGradOffset_Sampler2DArray1_Float3_Float2_Float2_Int2 = TSymbolUniqueId(3913);
+        textureGradOffset_Sampler2DArray1_Float3_Float2_Float2_Int2 = TSymbolUniqueId(3918);
     static constexpr const TSymbolUniqueId
-        textureGradOffset_ISampler2DArray1_Float3_Float2_Float2_Int2 = TSymbolUniqueId(3914);
+        textureGradOffset_ISampler2DArray1_Float3_Float2_Float2_Int2 = TSymbolUniqueId(3919);
     static constexpr const TSymbolUniqueId
-        textureGradOffset_USampler2DArray1_Float3_Float2_Float2_Int2 = TSymbolUniqueId(3915);
+        textureGradOffset_USampler2DArray1_Float3_Float2_Float2_Int2 = TSymbolUniqueId(3920);
     static constexpr const TSymbolUniqueId
-        textureGradOffset_Sampler2DArrayShadow1_Float4_Float2_Float2_Int2 = TSymbolUniqueId(3916);
+        textureGradOffset_Sampler2DArrayShadow1_Float4_Float2_Float2_Int2 = TSymbolUniqueId(3921);
     static constexpr const TSymbolUniqueId
-        textureProjGradOffset_Sampler2D1_Float3_Float2_Float2_Int2 = TSymbolUniqueId(3917);
+        textureProjGradOffset_Sampler2D1_Float3_Float2_Float2_Int2 = TSymbolUniqueId(3922);
     static constexpr const TSymbolUniqueId
-        textureProjGradOffset_ISampler2D1_Float3_Float2_Float2_Int2 = TSymbolUniqueId(3918);
+        textureProjGradOffset_ISampler2D1_Float3_Float2_Float2_Int2 = TSymbolUniqueId(3923);
     static constexpr const TSymbolUniqueId
-        textureProjGradOffset_USampler2D1_Float3_Float2_Float2_Int2 = TSymbolUniqueId(3919);
+        textureProjGradOffset_USampler2D1_Float3_Float2_Float2_Int2 = TSymbolUniqueId(3924);
     static constexpr const TSymbolUniqueId
-        textureProjGradOffset_Sampler2D1_Float4_Float2_Float2_Int2 = TSymbolUniqueId(3920);
+        textureProjGradOffset_Sampler2D1_Float4_Float2_Float2_Int2 = TSymbolUniqueId(3925);
     static constexpr const TSymbolUniqueId
-        textureProjGradOffset_ISampler2D1_Float4_Float2_Float2_Int2 = TSymbolUniqueId(3921);
+        textureProjGradOffset_ISampler2D1_Float4_Float2_Float2_Int2 = TSymbolUniqueId(3926);
     static constexpr const TSymbolUniqueId
-        textureProjGradOffset_USampler2D1_Float4_Float2_Float2_Int2 = TSymbolUniqueId(3922);
+        textureProjGradOffset_USampler2D1_Float4_Float2_Float2_Int2 = TSymbolUniqueId(3927);
     static constexpr const TSymbolUniqueId
-        textureProjGradOffset_Sampler3D1_Float4_Float3_Float3_Int3 = TSymbolUniqueId(3923);
+        textureProjGradOffset_Sampler3D1_Float4_Float3_Float3_Int3 = TSymbolUniqueId(3928);
     static constexpr const TSymbolUniqueId
-        textureProjGradOffset_ISampler3D1_Float4_Float3_Float3_Int3 = TSymbolUniqueId(3924);
+        textureProjGradOffset_ISampler3D1_Float4_Float3_Float3_Int3 = TSymbolUniqueId(3929);
     static constexpr const TSymbolUniqueId
-        textureProjGradOffset_USampler3D1_Float4_Float3_Float3_Int3 = TSymbolUniqueId(3925);
+        textureProjGradOffset_USampler3D1_Float4_Float3_Float3_Int3 = TSymbolUniqueId(3930);
     static constexpr const TSymbolUniqueId
-        textureProjGradOffset_Sampler2DShadow1_Float4_Float2_Float2_Int2 = TSymbolUniqueId(3926);
+        textureProjGradOffset_Sampler2DShadow1_Float4_Float2_Float2_Int2 = TSymbolUniqueId(3931);
     static constexpr const TSymbolUniqueId textureOffset_Sampler2D1_Float2_Int2_Float1 =
-        TSymbolUniqueId(3927);
-    static constexpr const TSymbolUniqueId textureOffset_ISampler2D1_Float2_Int2_Float1 =
-        TSymbolUniqueId(3928);
-    static constexpr const TSymbolUniqueId textureOffset_USampler2D1_Float2_Int2_Float1 =
-        TSymbolUniqueId(3929);
-    static constexpr const TSymbolUniqueId textureOffset_Sampler3D1_Float3_Int3_Float1 =
-        TSymbolUniqueId(3930);
-    static constexpr const TSymbolUniqueId textureOffset_ISampler3D1_Float3_Int3_Float1 =
-        TSymbolUniqueId(3931);
-    static constexpr const TSymbolUniqueId textureOffset_USampler3D1_Float3_Int3_Float1 =
         TSymbolUniqueId(3932);
-    static constexpr const TSymbolUniqueId textureOffset_Sampler2DShadow1_Float3_Int2_Float1 =
+    static constexpr const TSymbolUniqueId textureOffset_ISampler2D1_Float2_Int2_Float1 =
         TSymbolUniqueId(3933);
-    static constexpr const TSymbolUniqueId textureOffset_Sampler2DArray1_Float3_Int2_Float1 =
+    static constexpr const TSymbolUniqueId textureOffset_USampler2D1_Float2_Int2_Float1 =
         TSymbolUniqueId(3934);
-    static constexpr const TSymbolUniqueId textureOffset_ISampler2DArray1_Float3_Int2_Float1 =
+    static constexpr const TSymbolUniqueId textureOffset_Sampler3D1_Float3_Int3_Float1 =
         TSymbolUniqueId(3935);
-    static constexpr const TSymbolUniqueId textureOffset_USampler2DArray1_Float3_Int2_Float1 =
+    static constexpr const TSymbolUniqueId textureOffset_ISampler3D1_Float3_Int3_Float1 =
         TSymbolUniqueId(3936);
-    static constexpr const TSymbolUniqueId textureProjOffset_Sampler2D1_Float3_Int2_Float1 =
+    static constexpr const TSymbolUniqueId textureOffset_USampler3D1_Float3_Int3_Float1 =
         TSymbolUniqueId(3937);
-    static constexpr const TSymbolUniqueId textureProjOffset_ISampler2D1_Float3_Int2_Float1 =
+    static constexpr const TSymbolUniqueId textureOffset_Sampler2DShadow1_Float3_Int2_Float1 =
         TSymbolUniqueId(3938);
-    static constexpr const TSymbolUniqueId textureProjOffset_USampler2D1_Float3_Int2_Float1 =
+    static constexpr const TSymbolUniqueId textureOffset_Sampler2DArray1_Float3_Int2_Float1 =
         TSymbolUniqueId(3939);
-    static constexpr const TSymbolUniqueId textureProjOffset_Sampler2D1_Float4_Int2_Float1 =
+    static constexpr const TSymbolUniqueId textureOffset_ISampler2DArray1_Float3_Int2_Float1 =
         TSymbolUniqueId(3940);
-    static constexpr const TSymbolUniqueId textureProjOffset_ISampler2D1_Float4_Int2_Float1 =
+    static constexpr const TSymbolUniqueId textureOffset_USampler2DArray1_Float3_Int2_Float1 =
         TSymbolUniqueId(3941);
-    static constexpr const TSymbolUniqueId textureProjOffset_USampler2D1_Float4_Int2_Float1 =
+    static constexpr const TSymbolUniqueId textureProjOffset_Sampler2D1_Float3_Int2_Float1 =
         TSymbolUniqueId(3942);
-    static constexpr const TSymbolUniqueId textureProjOffset_Sampler3D1_Float4_Int3_Float1 =
+    static constexpr const TSymbolUniqueId textureProjOffset_ISampler2D1_Float3_Int2_Float1 =
         TSymbolUniqueId(3943);
-    static constexpr const TSymbolUniqueId textureProjOffset_ISampler3D1_Float4_Int3_Float1 =
+    static constexpr const TSymbolUniqueId textureProjOffset_USampler2D1_Float3_Int2_Float1 =
         TSymbolUniqueId(3944);
-    static constexpr const TSymbolUniqueId textureProjOffset_USampler3D1_Float4_Int3_Float1 =
+    static constexpr const TSymbolUniqueId textureProjOffset_Sampler2D1_Float4_Int2_Float1 =
         TSymbolUniqueId(3945);
-    static constexpr const TSymbolUniqueId textureProjOffset_Sampler2DShadow1_Float4_Int2_Float1 =
+    static constexpr const TSymbolUniqueId textureProjOffset_ISampler2D1_Float4_Int2_Float1 =
         TSymbolUniqueId(3946);
-    static constexpr const TSymbolUniqueId textureGather_Sampler2D1_Float2  = TSymbolUniqueId(3947);
-    static constexpr const TSymbolUniqueId textureGather_ISampler2D1_Float2 = TSymbolUniqueId(3948);
-    static constexpr const TSymbolUniqueId textureGather_USampler2D1_Float2 = TSymbolUniqueId(3949);
-    static constexpr const TSymbolUniqueId textureGather_Sampler2D1_Float2_Int1 =
+    static constexpr const TSymbolUniqueId textureProjOffset_USampler2D1_Float4_Int2_Float1 =
+        TSymbolUniqueId(3947);
+    static constexpr const TSymbolUniqueId textureProjOffset_Sampler3D1_Float4_Int3_Float1 =
+        TSymbolUniqueId(3948);
+    static constexpr const TSymbolUniqueId textureProjOffset_ISampler3D1_Float4_Int3_Float1 =
+        TSymbolUniqueId(3949);
+    static constexpr const TSymbolUniqueId textureProjOffset_USampler3D1_Float4_Int3_Float1 =
         TSymbolUniqueId(3950);
-    static constexpr const TSymbolUniqueId textureGather_ISampler2D1_Float2_Int1 =
+    static constexpr const TSymbolUniqueId textureProjOffset_Sampler2DShadow1_Float4_Int2_Float1 =
         TSymbolUniqueId(3951);
-    static constexpr const TSymbolUniqueId textureGather_USampler2D1_Float2_Int1 =
-        TSymbolUniqueId(3952);
-    static constexpr const TSymbolUniqueId textureGather_Sampler2DArray1_Float3 =
-        TSymbolUniqueId(3953);
-    static constexpr const TSymbolUniqueId textureGather_ISampler2DArray1_Float3 =
-        TSymbolUniqueId(3954);
-    static constexpr const TSymbolUniqueId textureGather_USampler2DArray1_Float3 =
+    static constexpr const TSymbolUniqueId textureGather_Sampler2D1_Float2  = TSymbolUniqueId(3952);
+    static constexpr const TSymbolUniqueId textureGather_ISampler2D1_Float2 = TSymbolUniqueId(3953);
+    static constexpr const TSymbolUniqueId textureGather_USampler2D1_Float2 = TSymbolUniqueId(3954);
+    static constexpr const TSymbolUniqueId textureGather_Sampler2D1_Float2_Int1 =
         TSymbolUniqueId(3955);
-    static constexpr const TSymbolUniqueId textureGather_Sampler2DArray1_Float3_Int1 =
+    static constexpr const TSymbolUniqueId textureGather_ISampler2D1_Float2_Int1 =
         TSymbolUniqueId(3956);
-    static constexpr const TSymbolUniqueId textureGather_ISampler2DArray1_Float3_Int1 =
+    static constexpr const TSymbolUniqueId textureGather_USampler2D1_Float2_Int1 =
         TSymbolUniqueId(3957);
-    static constexpr const TSymbolUniqueId textureGather_USampler2DArray1_Float3_Int1 =
+    static constexpr const TSymbolUniqueId textureGather_Sampler2DArray1_Float3 =
         TSymbolUniqueId(3958);
-    static constexpr const TSymbolUniqueId textureGather_SamplerCube1_Float3 =
+    static constexpr const TSymbolUniqueId textureGather_ISampler2DArray1_Float3 =
         TSymbolUniqueId(3959);
-    static constexpr const TSymbolUniqueId textureGather_ISamplerCube1_Float3 =
+    static constexpr const TSymbolUniqueId textureGather_USampler2DArray1_Float3 =
         TSymbolUniqueId(3960);
-    static constexpr const TSymbolUniqueId textureGather_USamplerCube1_Float3 =
+    static constexpr const TSymbolUniqueId textureGather_Sampler2DArray1_Float3_Int1 =
         TSymbolUniqueId(3961);
-    static constexpr const TSymbolUniqueId textureGather_SamplerCube1_Float3_Int1 =
+    static constexpr const TSymbolUniqueId textureGather_ISampler2DArray1_Float3_Int1 =
         TSymbolUniqueId(3962);
-    static constexpr const TSymbolUniqueId textureGather_ISamplerCube1_Float3_Int1 =
+    static constexpr const TSymbolUniqueId textureGather_USampler2DArray1_Float3_Int1 =
         TSymbolUniqueId(3963);
-    static constexpr const TSymbolUniqueId textureGather_USamplerCube1_Float3_Int1 =
+    static constexpr const TSymbolUniqueId textureGather_SamplerCube1_Float3 =
         TSymbolUniqueId(3964);
-    static constexpr const TSymbolUniqueId textureGather_SamplerCubeArray1_Float4 =
+    static constexpr const TSymbolUniqueId textureGather_ISamplerCube1_Float3 =
         TSymbolUniqueId(3965);
-    static constexpr const TSymbolUniqueId textureGather_ISamplerCubeArray1_Float4 =
+    static constexpr const TSymbolUniqueId textureGather_USamplerCube1_Float3 =
         TSymbolUniqueId(3966);
-    static constexpr const TSymbolUniqueId textureGather_USamplerCubeArray1_Float4 =
+    static constexpr const TSymbolUniqueId textureGather_SamplerCube1_Float3_Int1 =
         TSymbolUniqueId(3967);
-    static constexpr const TSymbolUniqueId textureGather_SamplerCubeArray1_Float4_Int1 =
+    static constexpr const TSymbolUniqueId textureGather_ISamplerCube1_Float3_Int1 =
         TSymbolUniqueId(3968);
-    static constexpr const TSymbolUniqueId textureGather_ISamplerCubeArray1_Float4_Int1 =
+    static constexpr const TSymbolUniqueId textureGather_USamplerCube1_Float3_Int1 =
         TSymbolUniqueId(3969);
-    static constexpr const TSymbolUniqueId textureGather_USamplerCubeArray1_Float4_Int1 =
+    static constexpr const TSymbolUniqueId textureGather_SamplerCubeArray1_Float4 =
         TSymbolUniqueId(3970);
-    static constexpr const TSymbolUniqueId textureGather_SamplerCubeArrayShadow1_Float4_Float1 =
+    static constexpr const TSymbolUniqueId textureGather_ISamplerCubeArray1_Float4 =
         TSymbolUniqueId(3971);
-    static constexpr const TSymbolUniqueId textureGatherExt_SamplerCubeArray1_Float4 =
+    static constexpr const TSymbolUniqueId textureGather_USamplerCubeArray1_Float4 =
         TSymbolUniqueId(3972);
-    static constexpr const TSymbolUniqueId textureGatherExt_ISamplerCubeArray1_Float4 =
+    static constexpr const TSymbolUniqueId textureGather_SamplerCubeArray1_Float4_Int1 =
         TSymbolUniqueId(3973);
-    static constexpr const TSymbolUniqueId textureGatherExt_USamplerCubeArray1_Float4 =
+    static constexpr const TSymbolUniqueId textureGather_ISamplerCubeArray1_Float4_Int1 =
         TSymbolUniqueId(3974);
-    static constexpr const TSymbolUniqueId textureGatherExt_SamplerCubeArray1_Float4_Int1 =
+    static constexpr const TSymbolUniqueId textureGather_USamplerCubeArray1_Float4_Int1 =
         TSymbolUniqueId(3975);
-    static constexpr const TSymbolUniqueId textureGatherExt_ISamplerCubeArray1_Float4_Int1 =
+    static constexpr const TSymbolUniqueId textureGather_SamplerCubeArrayShadow1_Float4_Float1 =
         TSymbolUniqueId(3976);
-    static constexpr const TSymbolUniqueId textureGatherExt_USamplerCubeArray1_Float4_Int1 =
+    static constexpr const TSymbolUniqueId textureGatherExt_SamplerCubeArray1_Float4 =
         TSymbolUniqueId(3977);
-    static constexpr const TSymbolUniqueId textureGatherExt_SamplerCubeArrayShadow1_Float4_Float1 =
+    static constexpr const TSymbolUniqueId textureGatherExt_ISamplerCubeArray1_Float4 =
         TSymbolUniqueId(3978);
-    static constexpr const TSymbolUniqueId textureGather_Sampler2DShadow1_Float2 =
+    static constexpr const TSymbolUniqueId textureGatherExt_USamplerCubeArray1_Float4 =
         TSymbolUniqueId(3979);
-    static constexpr const TSymbolUniqueId textureGather_Sampler2DShadow1_Float2_Float1 =
+    static constexpr const TSymbolUniqueId textureGatherExt_SamplerCubeArray1_Float4_Int1 =
         TSymbolUniqueId(3980);
-    static constexpr const TSymbolUniqueId textureGather_Sampler2DArrayShadow1_Float3 =
+    static constexpr const TSymbolUniqueId textureGatherExt_ISamplerCubeArray1_Float4_Int1 =
         TSymbolUniqueId(3981);
-    static constexpr const TSymbolUniqueId textureGather_Sampler2DArrayShadow1_Float3_Float1 =
+    static constexpr const TSymbolUniqueId textureGatherExt_USamplerCubeArray1_Float4_Int1 =
         TSymbolUniqueId(3982);
-    static constexpr const TSymbolUniqueId textureGather_SamplerCubeShadow1_Float3 =
+    static constexpr const TSymbolUniqueId textureGatherExt_SamplerCubeArrayShadow1_Float4_Float1 =
         TSymbolUniqueId(3983);
-    static constexpr const TSymbolUniqueId textureGather_SamplerCubeShadow1_Float3_Float1 =
+    static constexpr const TSymbolUniqueId textureGather_Sampler2DShadow1_Float2 =
         TSymbolUniqueId(3984);
-    static constexpr const TSymbolUniqueId textureGatherOffset_Sampler2D1_Float2_Int2 =
+    static constexpr const TSymbolUniqueId textureGather_Sampler2DShadow1_Float2_Float1 =
         TSymbolUniqueId(3985);
-    static constexpr const TSymbolUniqueId textureGatherOffset_ISampler2D1_Float2_Int2 =
+    static constexpr const TSymbolUniqueId textureGather_Sampler2DArrayShadow1_Float3 =
         TSymbolUniqueId(3986);
-    static constexpr const TSymbolUniqueId textureGatherOffset_USampler2D1_Float2_Int2 =
+    static constexpr const TSymbolUniqueId textureGather_Sampler2DArrayShadow1_Float3_Float1 =
         TSymbolUniqueId(3987);
-    static constexpr const TSymbolUniqueId textureGatherOffset_Sampler2DArray1_Float3_Int2 =
+    static constexpr const TSymbolUniqueId textureGather_SamplerCubeShadow1_Float3 =
         TSymbolUniqueId(3988);
-    static constexpr const TSymbolUniqueId textureGatherOffset_ISampler2DArray1_Float3_Int2 =
+    static constexpr const TSymbolUniqueId textureGather_SamplerCubeShadow1_Float3_Float1 =
         TSymbolUniqueId(3989);
-    static constexpr const TSymbolUniqueId textureGatherOffset_USampler2DArray1_Float3_Int2 =
+    static constexpr const TSymbolUniqueId textureGatherOffset_Sampler2D1_Float2_Int2 =
         TSymbolUniqueId(3990);
-    static constexpr const TSymbolUniqueId textureGatherOffset_Sampler2DShadow1_Float2_Float1_Int2 =
+    static constexpr const TSymbolUniqueId textureGatherOffset_ISampler2D1_Float2_Int2 =
         TSymbolUniqueId(3991);
-    static constexpr const TSymbolUniqueId
-        textureGatherOffset_Sampler2DArrayShadow1_Float3_Float1_Int2 = TSymbolUniqueId(3992);
-    static constexpr const TSymbolUniqueId textureGatherOffset_Sampler2D1_Float2_Int2_Int1 =
+    static constexpr const TSymbolUniqueId textureGatherOffset_USampler2D1_Float2_Int2 =
+        TSymbolUniqueId(3992);
+    static constexpr const TSymbolUniqueId textureGatherOffset_Sampler2DArray1_Float3_Int2 =
         TSymbolUniqueId(3993);
-    static constexpr const TSymbolUniqueId textureGatherOffset_ISampler2D1_Float2_Int2_Int1 =
+    static constexpr const TSymbolUniqueId textureGatherOffset_ISampler2DArray1_Float3_Int2 =
         TSymbolUniqueId(3994);
-    static constexpr const TSymbolUniqueId textureGatherOffset_USampler2D1_Float2_Int2_Int1 =
+    static constexpr const TSymbolUniqueId textureGatherOffset_USampler2DArray1_Float3_Int2 =
         TSymbolUniqueId(3995);
-    static constexpr const TSymbolUniqueId textureGatherOffset_Sampler2DArray1_Float3_Int2_Int1 =
+    static constexpr const TSymbolUniqueId textureGatherOffset_Sampler2DShadow1_Float2_Float1_Int2 =
         TSymbolUniqueId(3996);
-    static constexpr const TSymbolUniqueId textureGatherOffset_ISampler2DArray1_Float3_Int2_Int1 =
-        TSymbolUniqueId(3997);
-    static constexpr const TSymbolUniqueId textureGatherOffset_USampler2DArray1_Float3_Int2_Int1 =
+    static constexpr const TSymbolUniqueId
+        textureGatherOffset_Sampler2DArrayShadow1_Float3_Float1_Int2 = TSymbolUniqueId(3997);
+    static constexpr const TSymbolUniqueId textureGatherOffset_Sampler2D1_Float2_Int2_Int1 =
         TSymbolUniqueId(3998);
-    static constexpr const TSymbolUniqueId textureGatherOffsets_Sampler2D1_Float2_4xInt2 =
+    static constexpr const TSymbolUniqueId textureGatherOffset_ISampler2D1_Float2_Int2_Int1 =
         TSymbolUniqueId(3999);
-    static constexpr const TSymbolUniqueId pt10Dx4 = TSymbolUniqueId(4000);
-    static constexpr const TSymbolUniqueId textureGatherOffsets_ISampler2D1_Float2_4xInt2 =
+    static constexpr const TSymbolUniqueId textureGatherOffset_USampler2D1_Float2_Int2_Int1 =
+        TSymbolUniqueId(4000);
+    static constexpr const TSymbolUniqueId textureGatherOffset_Sampler2DArray1_Float3_Int2_Int1 =
         TSymbolUniqueId(4001);
-    static constexpr const TSymbolUniqueId textureGatherOffsets_USampler2D1_Float2_4xInt2 =
+    static constexpr const TSymbolUniqueId textureGatherOffset_ISampler2DArray1_Float3_Int2_Int1 =
         TSymbolUniqueId(4002);
-    static constexpr const TSymbolUniqueId textureGatherOffsets_Sampler2DArray1_Float3_4xInt2 =
+    static constexpr const TSymbolUniqueId textureGatherOffset_USampler2DArray1_Float3_Int2_Int1 =
         TSymbolUniqueId(4003);
-    static constexpr const TSymbolUniqueId textureGatherOffsets_ISampler2DArray1_Float3_4xInt2 =
+    static constexpr const TSymbolUniqueId textureGatherOffsets_Sampler2D1_Float2_4xInt2 =
         TSymbolUniqueId(4004);
-    static constexpr const TSymbolUniqueId textureGatherOffsets_USampler2DArray1_Float3_4xInt2 =
-        TSymbolUniqueId(4005);
-    static constexpr const TSymbolUniqueId
-        textureGatherOffsets_Sampler2DShadow1_Float2_Float1_4xInt2 = TSymbolUniqueId(4006);
-    static constexpr const TSymbolUniqueId
-        textureGatherOffsets_Sampler2DArrayShadow1_Float3_Float1_4xInt2 = TSymbolUniqueId(4007);
-    static constexpr const TSymbolUniqueId textureGatherOffsetsExt_Sampler2D1_Float2_4xInt2 =
+    static constexpr const TSymbolUniqueId pt10Dx4 = TSymbolUniqueId(4005);
+    static constexpr const TSymbolUniqueId textureGatherOffsets_ISampler2D1_Float2_4xInt2 =
+        TSymbolUniqueId(4006);
+    static constexpr const TSymbolUniqueId textureGatherOffsets_USampler2D1_Float2_4xInt2 =
+        TSymbolUniqueId(4007);
+    static constexpr const TSymbolUniqueId textureGatherOffsets_Sampler2DArray1_Float3_4xInt2 =
         TSymbolUniqueId(4008);
-    static constexpr const TSymbolUniqueId textureGatherOffsetsExt_ISampler2D1_Float2_4xInt2 =
+    static constexpr const TSymbolUniqueId textureGatherOffsets_ISampler2DArray1_Float3_4xInt2 =
         TSymbolUniqueId(4009);
-    static constexpr const TSymbolUniqueId textureGatherOffsetsExt_USampler2D1_Float2_4xInt2 =
+    static constexpr const TSymbolUniqueId textureGatherOffsets_USampler2DArray1_Float3_4xInt2 =
         TSymbolUniqueId(4010);
-    static constexpr const TSymbolUniqueId textureGatherOffsetsExt_Sampler2DArray1_Float3_4xInt2 =
-        TSymbolUniqueId(4011);
-    static constexpr const TSymbolUniqueId textureGatherOffsetsExt_ISampler2DArray1_Float3_4xInt2 =
-        TSymbolUniqueId(4012);
-    static constexpr const TSymbolUniqueId textureGatherOffsetsExt_USampler2DArray1_Float3_4xInt2 =
+    static constexpr const TSymbolUniqueId
+        textureGatherOffsets_Sampler2DShadow1_Float2_Float1_4xInt2 = TSymbolUniqueId(4011);
+    static constexpr const TSymbolUniqueId
+        textureGatherOffsets_Sampler2DArrayShadow1_Float3_Float1_4xInt2 = TSymbolUniqueId(4012);
+    static constexpr const TSymbolUniqueId textureGatherOffsetsExt_Sampler2D1_Float2_4xInt2 =
         TSymbolUniqueId(4013);
-    static constexpr const TSymbolUniqueId
-        textureGatherOffsetsExt_Sampler2DShadow1_Float2_Float1_4xInt2 = TSymbolUniqueId(4014);
-    static constexpr const TSymbolUniqueId
-        textureGatherOffsetsExt_Sampler2DArrayShadow1_Float3_Float1_4xInt2 = TSymbolUniqueId(4015);
-    static constexpr const TSymbolUniqueId textureGatherOffsets_Sampler2D1_Float2_4xInt2_Int1 =
+    static constexpr const TSymbolUniqueId textureGatherOffsetsExt_ISampler2D1_Float2_4xInt2 =
+        TSymbolUniqueId(4014);
+    static constexpr const TSymbolUniqueId textureGatherOffsetsExt_USampler2D1_Float2_4xInt2 =
+        TSymbolUniqueId(4015);
+    static constexpr const TSymbolUniqueId textureGatherOffsetsExt_Sampler2DArray1_Float3_4xInt2 =
         TSymbolUniqueId(4016);
-    static constexpr const TSymbolUniqueId textureGatherOffsets_ISampler2D1_Float2_4xInt2_Int1 =
+    static constexpr const TSymbolUniqueId textureGatherOffsetsExt_ISampler2DArray1_Float3_4xInt2 =
         TSymbolUniqueId(4017);
-    static constexpr const TSymbolUniqueId textureGatherOffsets_USampler2D1_Float2_4xInt2_Int1 =
+    static constexpr const TSymbolUniqueId textureGatherOffsetsExt_USampler2DArray1_Float3_4xInt2 =
         TSymbolUniqueId(4018);
-    static constexpr const TSymbolUniqueId textureGatherOffsets_Sampler2DArray1_Float3_4xInt2_Int1 =
-        TSymbolUniqueId(4019);
     static constexpr const TSymbolUniqueId
-        textureGatherOffsets_ISampler2DArray1_Float3_4xInt2_Int1 = TSymbolUniqueId(4020);
+        textureGatherOffsetsExt_Sampler2DShadow1_Float2_Float1_4xInt2 = TSymbolUniqueId(4019);
     static constexpr const TSymbolUniqueId
-        textureGatherOffsets_USampler2DArray1_Float3_4xInt2_Int1 = TSymbolUniqueId(4021);
-    static constexpr const TSymbolUniqueId textureGatherOffsetsExt_Sampler2D1_Float2_4xInt2_Int1 =
+        textureGatherOffsetsExt_Sampler2DArrayShadow1_Float3_Float1_4xInt2 = TSymbolUniqueId(4020);
+    static constexpr const TSymbolUniqueId textureGatherOffsets_Sampler2D1_Float2_4xInt2_Int1 =
+        TSymbolUniqueId(4021);
+    static constexpr const TSymbolUniqueId textureGatherOffsets_ISampler2D1_Float2_4xInt2_Int1 =
         TSymbolUniqueId(4022);
-    static constexpr const TSymbolUniqueId textureGatherOffsetsExt_ISampler2D1_Float2_4xInt2_Int1 =
+    static constexpr const TSymbolUniqueId textureGatherOffsets_USampler2D1_Float2_4xInt2_Int1 =
         TSymbolUniqueId(4023);
-    static constexpr const TSymbolUniqueId textureGatherOffsetsExt_USampler2D1_Float2_4xInt2_Int1 =
+    static constexpr const TSymbolUniqueId textureGatherOffsets_Sampler2DArray1_Float3_4xInt2_Int1 =
         TSymbolUniqueId(4024);
     static constexpr const TSymbolUniqueId
-        textureGatherOffsetsExt_Sampler2DArray1_Float3_4xInt2_Int1 = TSymbolUniqueId(4025);
+        textureGatherOffsets_ISampler2DArray1_Float3_4xInt2_Int1 = TSymbolUniqueId(4025);
     static constexpr const TSymbolUniqueId
-        textureGatherOffsetsExt_ISampler2DArray1_Float3_4xInt2_Int1 = TSymbolUniqueId(4026);
-    static constexpr const TSymbolUniqueId
-        textureGatherOffsetsExt_USampler2DArray1_Float3_4xInt2_Int1 = TSymbolUniqueId(4027);
-    static constexpr const TSymbolUniqueId rgb_2_yuv_Float3_YuvCscStandardEXT1 =
+        textureGatherOffsets_USampler2DArray1_Float3_4xInt2_Int1 = TSymbolUniqueId(4026);
+    static constexpr const TSymbolUniqueId textureGatherOffsetsExt_Sampler2D1_Float2_4xInt2_Int1 =
+        TSymbolUniqueId(4027);
+    static constexpr const TSymbolUniqueId textureGatherOffsetsExt_ISampler2D1_Float2_4xInt2_Int1 =
         TSymbolUniqueId(4028);
-    static constexpr const TSymbolUniqueId pt00H = TSymbolUniqueId(4029);
+    static constexpr const TSymbolUniqueId textureGatherOffsetsExt_USampler2D1_Float2_4xInt2_Int1 =
+        TSymbolUniqueId(4029);
+    static constexpr const TSymbolUniqueId
+        textureGatherOffsetsExt_Sampler2DArray1_Float3_4xInt2_Int1 = TSymbolUniqueId(4030);
+    static constexpr const TSymbolUniqueId
+        textureGatherOffsetsExt_ISampler2DArray1_Float3_4xInt2_Int1 = TSymbolUniqueId(4031);
+    static constexpr const TSymbolUniqueId
+        textureGatherOffsetsExt_USampler2DArray1_Float3_4xInt2_Int1 = TSymbolUniqueId(4032);
+    static constexpr const TSymbolUniqueId rgb_2_yuv_Float3_YuvCscStandardEXT1 =
+        TSymbolUniqueId(4033);
+    static constexpr const TSymbolUniqueId pt00H = TSymbolUniqueId(4034);
     static constexpr const TSymbolUniqueId yuv_2_rgb_Float3_YuvCscStandardEXT1 =
-        TSymbolUniqueId(4030);
-    static constexpr const TSymbolUniqueId dFdxExt_Float1                  = TSymbolUniqueId(4031);
-    static constexpr const TSymbolUniqueId dFdxExt_Float2                  = TSymbolUniqueId(4032);
-    static constexpr const TSymbolUniqueId dFdxExt_Float3                  = TSymbolUniqueId(4033);
-    static constexpr const TSymbolUniqueId dFdxExt_Float4                  = TSymbolUniqueId(4034);
-    static constexpr const TSymbolUniqueId dFdyExt_Float1                  = TSymbolUniqueId(4035);
-    static constexpr const TSymbolUniqueId dFdyExt_Float2                  = TSymbolUniqueId(4036);
-    static constexpr const TSymbolUniqueId dFdyExt_Float3                  = TSymbolUniqueId(4037);
-    static constexpr const TSymbolUniqueId dFdyExt_Float4                  = TSymbolUniqueId(4038);
-    static constexpr const TSymbolUniqueId fwidthExt_Float1                = TSymbolUniqueId(4039);
-    static constexpr const TSymbolUniqueId fwidthExt_Float2                = TSymbolUniqueId(4040);
-    static constexpr const TSymbolUniqueId fwidthExt_Float3                = TSymbolUniqueId(4041);
-    static constexpr const TSymbolUniqueId fwidthExt_Float4                = TSymbolUniqueId(4042);
-    static constexpr const TSymbolUniqueId dFdx_Float1                     = TSymbolUniqueId(4043);
-    static constexpr const TSymbolUniqueId dFdx_Float2                     = TSymbolUniqueId(4044);
-    static constexpr const TSymbolUniqueId dFdx_Float3                     = TSymbolUniqueId(4045);
-    static constexpr const TSymbolUniqueId dFdx_Float4                     = TSymbolUniqueId(4046);
-    static constexpr const TSymbolUniqueId dFdy_Float1                     = TSymbolUniqueId(4047);
-    static constexpr const TSymbolUniqueId dFdy_Float2                     = TSymbolUniqueId(4048);
-    static constexpr const TSymbolUniqueId dFdy_Float3                     = TSymbolUniqueId(4049);
-    static constexpr const TSymbolUniqueId dFdy_Float4                     = TSymbolUniqueId(4050);
-    static constexpr const TSymbolUniqueId fwidth_Float1                   = TSymbolUniqueId(4051);
-    static constexpr const TSymbolUniqueId fwidth_Float2                   = TSymbolUniqueId(4052);
-    static constexpr const TSymbolUniqueId fwidth_Float3                   = TSymbolUniqueId(4053);
-    static constexpr const TSymbolUniqueId fwidth_Float4                   = TSymbolUniqueId(4054);
-    static constexpr const TSymbolUniqueId interpolateAtCentroid_Float1    = TSymbolUniqueId(4055);
-    static constexpr const TSymbolUniqueId interpolateAtCentroid_Float2    = TSymbolUniqueId(4056);
-    static constexpr const TSymbolUniqueId interpolateAtCentroid_Float3    = TSymbolUniqueId(4057);
-    static constexpr const TSymbolUniqueId interpolateAtCentroid_Float4    = TSymbolUniqueId(4058);
-    static constexpr const TSymbolUniqueId interpolateAtSample_Float1_Int1 = TSymbolUniqueId(4059);
-    static constexpr const TSymbolUniqueId interpolateAtSample_Float2_Int1 = TSymbolUniqueId(4060);
-    static constexpr const TSymbolUniqueId interpolateAtSample_Float3_Int1 = TSymbolUniqueId(4061);
-    static constexpr const TSymbolUniqueId interpolateAtSample_Float4_Int1 = TSymbolUniqueId(4062);
+        TSymbolUniqueId(4035);
+    static constexpr const TSymbolUniqueId dFdxExt_Float1                  = TSymbolUniqueId(4036);
+    static constexpr const TSymbolUniqueId dFdxExt_Float2                  = TSymbolUniqueId(4037);
+    static constexpr const TSymbolUniqueId dFdxExt_Float3                  = TSymbolUniqueId(4038);
+    static constexpr const TSymbolUniqueId dFdxExt_Float4                  = TSymbolUniqueId(4039);
+    static constexpr const TSymbolUniqueId dFdyExt_Float1                  = TSymbolUniqueId(4040);
+    static constexpr const TSymbolUniqueId dFdyExt_Float2                  = TSymbolUniqueId(4041);
+    static constexpr const TSymbolUniqueId dFdyExt_Float3                  = TSymbolUniqueId(4042);
+    static constexpr const TSymbolUniqueId dFdyExt_Float4                  = TSymbolUniqueId(4043);
+    static constexpr const TSymbolUniqueId fwidthExt_Float1                = TSymbolUniqueId(4044);
+    static constexpr const TSymbolUniqueId fwidthExt_Float2                = TSymbolUniqueId(4045);
+    static constexpr const TSymbolUniqueId fwidthExt_Float3                = TSymbolUniqueId(4046);
+    static constexpr const TSymbolUniqueId fwidthExt_Float4                = TSymbolUniqueId(4047);
+    static constexpr const TSymbolUniqueId dFdx_Float1                     = TSymbolUniqueId(4048);
+    static constexpr const TSymbolUniqueId dFdx_Float2                     = TSymbolUniqueId(4049);
+    static constexpr const TSymbolUniqueId dFdx_Float3                     = TSymbolUniqueId(4050);
+    static constexpr const TSymbolUniqueId dFdx_Float4                     = TSymbolUniqueId(4051);
+    static constexpr const TSymbolUniqueId dFdy_Float1                     = TSymbolUniqueId(4052);
+    static constexpr const TSymbolUniqueId dFdy_Float2                     = TSymbolUniqueId(4053);
+    static constexpr const TSymbolUniqueId dFdy_Float3                     = TSymbolUniqueId(4054);
+    static constexpr const TSymbolUniqueId dFdy_Float4                     = TSymbolUniqueId(4055);
+    static constexpr const TSymbolUniqueId fwidth_Float1                   = TSymbolUniqueId(4056);
+    static constexpr const TSymbolUniqueId fwidth_Float2                   = TSymbolUniqueId(4057);
+    static constexpr const TSymbolUniqueId fwidth_Float3                   = TSymbolUniqueId(4058);
+    static constexpr const TSymbolUniqueId fwidth_Float4                   = TSymbolUniqueId(4059);
+    static constexpr const TSymbolUniqueId interpolateAtCentroid_Float1    = TSymbolUniqueId(4060);
+    static constexpr const TSymbolUniqueId interpolateAtCentroid_Float2    = TSymbolUniqueId(4061);
+    static constexpr const TSymbolUniqueId interpolateAtCentroid_Float3    = TSymbolUniqueId(4062);
+    static constexpr const TSymbolUniqueId interpolateAtCentroid_Float4    = TSymbolUniqueId(4063);
+    static constexpr const TSymbolUniqueId interpolateAtSample_Float1_Int1 = TSymbolUniqueId(4064);
+    static constexpr const TSymbolUniqueId interpolateAtSample_Float2_Int1 = TSymbolUniqueId(4065);
+    static constexpr const TSymbolUniqueId interpolateAtSample_Float3_Int1 = TSymbolUniqueId(4066);
+    static constexpr const TSymbolUniqueId interpolateAtSample_Float4_Int1 = TSymbolUniqueId(4067);
     static constexpr const TSymbolUniqueId interpolateAtOffset_Float1_Float2 =
-        TSymbolUniqueId(4063);
+        TSymbolUniqueId(4068);
     static constexpr const TSymbolUniqueId interpolateAtOffset_Float2_Float2 =
-        TSymbolUniqueId(4064);
+        TSymbolUniqueId(4069);
     static constexpr const TSymbolUniqueId interpolateAtOffset_Float3_Float2 =
-        TSymbolUniqueId(4065);
+        TSymbolUniqueId(4070);
     static constexpr const TSymbolUniqueId interpolateAtOffset_Float4_Float2 =
-        TSymbolUniqueId(4066);
-    static constexpr const TSymbolUniqueId interpolateAtCentroidExt_Float1 = TSymbolUniqueId(4067);
-    static constexpr const TSymbolUniqueId interpolateAtCentroidExt_Float2 = TSymbolUniqueId(4068);
-    static constexpr const TSymbolUniqueId interpolateAtCentroidExt_Float3 = TSymbolUniqueId(4069);
-    static constexpr const TSymbolUniqueId interpolateAtCentroidExt_Float4 = TSymbolUniqueId(4070);
-    static constexpr const TSymbolUniqueId interpolateAtSampleExt_Float1_Int1 =
         TSymbolUniqueId(4071);
-    static constexpr const TSymbolUniqueId interpolateAtSampleExt_Float2_Int1 =
-        TSymbolUniqueId(4072);
-    static constexpr const TSymbolUniqueId interpolateAtSampleExt_Float3_Int1 =
-        TSymbolUniqueId(4073);
-    static constexpr const TSymbolUniqueId interpolateAtSampleExt_Float4_Int1 =
-        TSymbolUniqueId(4074);
-    static constexpr const TSymbolUniqueId interpolateAtOffsetExt_Float1_Float2 =
-        TSymbolUniqueId(4075);
-    static constexpr const TSymbolUniqueId interpolateAtOffsetExt_Float2_Float2 =
+    static constexpr const TSymbolUniqueId interpolateAtCentroidExt_Float1 = TSymbolUniqueId(4072);
+    static constexpr const TSymbolUniqueId interpolateAtCentroidExt_Float2 = TSymbolUniqueId(4073);
+    static constexpr const TSymbolUniqueId interpolateAtCentroidExt_Float3 = TSymbolUniqueId(4074);
+    static constexpr const TSymbolUniqueId interpolateAtCentroidExt_Float4 = TSymbolUniqueId(4075);
+    static constexpr const TSymbolUniqueId interpolateAtSampleExt_Float1_Int1 =
         TSymbolUniqueId(4076);
-    static constexpr const TSymbolUniqueId interpolateAtOffsetExt_Float3_Float2 =
+    static constexpr const TSymbolUniqueId interpolateAtSampleExt_Float2_Int1 =
         TSymbolUniqueId(4077);
-    static constexpr const TSymbolUniqueId interpolateAtOffsetExt_Float4_Float2 =
+    static constexpr const TSymbolUniqueId interpolateAtSampleExt_Float3_Int1 =
         TSymbolUniqueId(4078);
-    static constexpr const TSymbolUniqueId atomicCounter_AtomicCounter1 = TSymbolUniqueId(4079);
-    static constexpr const TSymbolUniqueId pt00G                        = TSymbolUniqueId(4080);
-    static constexpr const TSymbolUniqueId atomicCounterIncrement_AtomicCounter1 =
+    static constexpr const TSymbolUniqueId interpolateAtSampleExt_Float4_Int1 =
+        TSymbolUniqueId(4079);
+    static constexpr const TSymbolUniqueId interpolateAtOffsetExt_Float1_Float2 =
+        TSymbolUniqueId(4080);
+    static constexpr const TSymbolUniqueId interpolateAtOffsetExt_Float2_Float2 =
         TSymbolUniqueId(4081);
-    static constexpr const TSymbolUniqueId atomicCounterDecrement_AtomicCounter1 =
+    static constexpr const TSymbolUniqueId interpolateAtOffsetExt_Float3_Float2 =
         TSymbolUniqueId(4082);
-    static constexpr const TSymbolUniqueId atomicAdd_UInt1_UInt1            = TSymbolUniqueId(4083);
-    static constexpr const TSymbolUniqueId pt_io_00E                        = TSymbolUniqueId(4084);
-    static constexpr const TSymbolUniqueId atomicAdd_Int1_Int1              = TSymbolUniqueId(4085);
-    static constexpr const TSymbolUniqueId pt_io_00D                        = TSymbolUniqueId(4086);
-    static constexpr const TSymbolUniqueId atomicMin_UInt1_UInt1            = TSymbolUniqueId(4087);
-    static constexpr const TSymbolUniqueId atomicMin_Int1_Int1              = TSymbolUniqueId(4088);
-    static constexpr const TSymbolUniqueId atomicMax_UInt1_UInt1            = TSymbolUniqueId(4089);
-    static constexpr const TSymbolUniqueId atomicMax_Int1_Int1              = TSymbolUniqueId(4090);
-    static constexpr const TSymbolUniqueId atomicAnd_UInt1_UInt1            = TSymbolUniqueId(4091);
-    static constexpr const TSymbolUniqueId atomicAnd_Int1_Int1              = TSymbolUniqueId(4092);
-    static constexpr const TSymbolUniqueId atomicOr_UInt1_UInt1             = TSymbolUniqueId(4093);
-    static constexpr const TSymbolUniqueId atomicOr_Int1_Int1               = TSymbolUniqueId(4094);
-    static constexpr const TSymbolUniqueId atomicXor_UInt1_UInt1            = TSymbolUniqueId(4095);
-    static constexpr const TSymbolUniqueId atomicXor_Int1_Int1              = TSymbolUniqueId(4096);
-    static constexpr const TSymbolUniqueId atomicExchange_UInt1_UInt1       = TSymbolUniqueId(4097);
-    static constexpr const TSymbolUniqueId atomicExchange_Int1_Int1         = TSymbolUniqueId(4098);
-    static constexpr const TSymbolUniqueId atomicCompSwap_UInt1_UInt1_UInt1 = TSymbolUniqueId(4099);
-    static constexpr const TSymbolUniqueId atomicCompSwap_Int1_Int1_Int1    = TSymbolUniqueId(4100);
-    static constexpr const TSymbolUniqueId imageSize_Image2D1               = TSymbolUniqueId(4101);
-    static constexpr const TSymbolUniqueId pt00z                            = TSymbolUniqueId(4102);
-    static constexpr const TSymbolUniqueId imageSize_IImage2D1              = TSymbolUniqueId(4103);
-    static constexpr const TSymbolUniqueId pt01K                            = TSymbolUniqueId(4104);
-    static constexpr const TSymbolUniqueId imageSize_UImage2D1              = TSymbolUniqueId(4105);
-    static constexpr const TSymbolUniqueId pt01V                            = TSymbolUniqueId(4106);
-    static constexpr const TSymbolUniqueId imageSize_Image3D1               = TSymbolUniqueId(4107);
-    static constexpr const TSymbolUniqueId pt01A                            = TSymbolUniqueId(4108);
-    static constexpr const TSymbolUniqueId imageSize_IImage3D1              = TSymbolUniqueId(4109);
-    static constexpr const TSymbolUniqueId pt01L                            = TSymbolUniqueId(4110);
-    static constexpr const TSymbolUniqueId imageSize_UImage3D1              = TSymbolUniqueId(4111);
-    static constexpr const TSymbolUniqueId pt01W                            = TSymbolUniqueId(4112);
-    static constexpr const TSymbolUniqueId imageSize_Image2DArray1          = TSymbolUniqueId(4113);
-    static constexpr const TSymbolUniqueId pt01B                            = TSymbolUniqueId(4114);
-    static constexpr const TSymbolUniqueId imageSize_IImage2DArray1         = TSymbolUniqueId(4115);
-    static constexpr const TSymbolUniqueId pt01M                            = TSymbolUniqueId(4116);
-    static constexpr const TSymbolUniqueId imageSize_UImage2DArray1         = TSymbolUniqueId(4117);
-    static constexpr const TSymbolUniqueId pt01X                            = TSymbolUniqueId(4118);
-    static constexpr const TSymbolUniqueId imageSize_ImageCube1             = TSymbolUniqueId(4119);
-    static constexpr const TSymbolUniqueId pt01C                            = TSymbolUniqueId(4120);
-    static constexpr const TSymbolUniqueId imageSize_IImageCube1            = TSymbolUniqueId(4121);
-    static constexpr const TSymbolUniqueId pt01N                            = TSymbolUniqueId(4122);
-    static constexpr const TSymbolUniqueId imageSize_UImageCube1            = TSymbolUniqueId(4123);
-    static constexpr const TSymbolUniqueId pt01Y                            = TSymbolUniqueId(4124);
-    static constexpr const TSymbolUniqueId imageSize_ImageCubeArray1        = TSymbolUniqueId(4125);
-    static constexpr const TSymbolUniqueId pt01H                            = TSymbolUniqueId(4126);
-    static constexpr const TSymbolUniqueId imageSize_IImageCubeArray1       = TSymbolUniqueId(4127);
-    static constexpr const TSymbolUniqueId pt01S                            = TSymbolUniqueId(4128);
-    static constexpr const TSymbolUniqueId imageSize_UImageCubeArray1       = TSymbolUniqueId(4129);
-    static constexpr const TSymbolUniqueId pt01d                            = TSymbolUniqueId(4130);
-    static constexpr const TSymbolUniqueId imageSizeExt_ImageCubeArray1     = TSymbolUniqueId(4131);
-    static constexpr const TSymbolUniqueId imageSizeExt_IImageCubeArray1    = TSymbolUniqueId(4132);
-    static constexpr const TSymbolUniqueId imageSizeExt_UImageCubeArray1    = TSymbolUniqueId(4133);
-    static constexpr const TSymbolUniqueId imageSize_ImageBuffer1           = TSymbolUniqueId(4134);
-    static constexpr const TSymbolUniqueId pt01J                            = TSymbolUniqueId(4135);
-    static constexpr const TSymbolUniqueId imageSize_IImageBuffer1          = TSymbolUniqueId(4136);
-    static constexpr const TSymbolUniqueId pt01U                            = TSymbolUniqueId(4137);
-    static constexpr const TSymbolUniqueId imageSize_UImageBuffer1          = TSymbolUniqueId(4138);
-    static constexpr const TSymbolUniqueId pt01f                            = TSymbolUniqueId(4139);
-    static constexpr const TSymbolUniqueId imageSizeExt_ImageBuffer1        = TSymbolUniqueId(4140);
-    static constexpr const TSymbolUniqueId imageSizeExt_IImageBuffer1       = TSymbolUniqueId(4141);
-    static constexpr const TSymbolUniqueId imageSizeExt_UImageBuffer1       = TSymbolUniqueId(4142);
-    static constexpr const TSymbolUniqueId imageStore_Image2D1_Int2_Float4  = TSymbolUniqueId(4143);
-    static constexpr const TSymbolUniqueId imageStore_IImage2D1_Int2_Int4   = TSymbolUniqueId(4144);
-    static constexpr const TSymbolUniqueId imageStore_UImage2D1_Int2_UInt4  = TSymbolUniqueId(4145);
-    static constexpr const TSymbolUniqueId imageStore_Image3D1_Int3_Float4  = TSymbolUniqueId(4146);
-    static constexpr const TSymbolUniqueId imageStore_IImage3D1_Int3_Int4   = TSymbolUniqueId(4147);
-    static constexpr const TSymbolUniqueId imageStore_UImage3D1_Int3_UInt4  = TSymbolUniqueId(4148);
+    static constexpr const TSymbolUniqueId interpolateAtOffsetExt_Float4_Float2 =
+        TSymbolUniqueId(4083);
+    static constexpr const TSymbolUniqueId atomicCounter_AtomicCounter1 = TSymbolUniqueId(4084);
+    static constexpr const TSymbolUniqueId pt00G                        = TSymbolUniqueId(4085);
+    static constexpr const TSymbolUniqueId atomicCounterIncrement_AtomicCounter1 =
+        TSymbolUniqueId(4086);
+    static constexpr const TSymbolUniqueId atomicCounterDecrement_AtomicCounter1 =
+        TSymbolUniqueId(4087);
+    static constexpr const TSymbolUniqueId atomicAdd_UInt1_UInt1            = TSymbolUniqueId(4088);
+    static constexpr const TSymbolUniqueId pt_io_00E                        = TSymbolUniqueId(4089);
+    static constexpr const TSymbolUniqueId atomicAdd_Int1_Int1              = TSymbolUniqueId(4090);
+    static constexpr const TSymbolUniqueId pt_io_00D                        = TSymbolUniqueId(4091);
+    static constexpr const TSymbolUniqueId atomicMin_UInt1_UInt1            = TSymbolUniqueId(4092);
+    static constexpr const TSymbolUniqueId atomicMin_Int1_Int1              = TSymbolUniqueId(4093);
+    static constexpr const TSymbolUniqueId atomicMax_UInt1_UInt1            = TSymbolUniqueId(4094);
+    static constexpr const TSymbolUniqueId atomicMax_Int1_Int1              = TSymbolUniqueId(4095);
+    static constexpr const TSymbolUniqueId atomicAnd_UInt1_UInt1            = TSymbolUniqueId(4096);
+    static constexpr const TSymbolUniqueId atomicAnd_Int1_Int1              = TSymbolUniqueId(4097);
+    static constexpr const TSymbolUniqueId atomicOr_UInt1_UInt1             = TSymbolUniqueId(4098);
+    static constexpr const TSymbolUniqueId atomicOr_Int1_Int1               = TSymbolUniqueId(4099);
+    static constexpr const TSymbolUniqueId atomicXor_UInt1_UInt1            = TSymbolUniqueId(4100);
+    static constexpr const TSymbolUniqueId atomicXor_Int1_Int1              = TSymbolUniqueId(4101);
+    static constexpr const TSymbolUniqueId atomicExchange_UInt1_UInt1       = TSymbolUniqueId(4102);
+    static constexpr const TSymbolUniqueId atomicExchange_Int1_Int1         = TSymbolUniqueId(4103);
+    static constexpr const TSymbolUniqueId atomicCompSwap_UInt1_UInt1_UInt1 = TSymbolUniqueId(4104);
+    static constexpr const TSymbolUniqueId atomicCompSwap_Int1_Int1_Int1    = TSymbolUniqueId(4105);
+    static constexpr const TSymbolUniqueId imageSize_Image2D1               = TSymbolUniqueId(4106);
+    static constexpr const TSymbolUniqueId pt00z                            = TSymbolUniqueId(4107);
+    static constexpr const TSymbolUniqueId imageSize_IImage2D1              = TSymbolUniqueId(4108);
+    static constexpr const TSymbolUniqueId pt01K                            = TSymbolUniqueId(4109);
+    static constexpr const TSymbolUniqueId imageSize_UImage2D1              = TSymbolUniqueId(4110);
+    static constexpr const TSymbolUniqueId pt01V                            = TSymbolUniqueId(4111);
+    static constexpr const TSymbolUniqueId imageSize_Image3D1               = TSymbolUniqueId(4112);
+    static constexpr const TSymbolUniqueId pt01A                            = TSymbolUniqueId(4113);
+    static constexpr const TSymbolUniqueId imageSize_IImage3D1              = TSymbolUniqueId(4114);
+    static constexpr const TSymbolUniqueId pt01L                            = TSymbolUniqueId(4115);
+    static constexpr const TSymbolUniqueId imageSize_UImage3D1              = TSymbolUniqueId(4116);
+    static constexpr const TSymbolUniqueId pt01W                            = TSymbolUniqueId(4117);
+    static constexpr const TSymbolUniqueId imageSize_Image2DArray1          = TSymbolUniqueId(4118);
+    static constexpr const TSymbolUniqueId pt01B                            = TSymbolUniqueId(4119);
+    static constexpr const TSymbolUniqueId imageSize_IImage2DArray1         = TSymbolUniqueId(4120);
+    static constexpr const TSymbolUniqueId pt01M                            = TSymbolUniqueId(4121);
+    static constexpr const TSymbolUniqueId imageSize_UImage2DArray1         = TSymbolUniqueId(4122);
+    static constexpr const TSymbolUniqueId pt01X                            = TSymbolUniqueId(4123);
+    static constexpr const TSymbolUniqueId imageSize_ImageCube1             = TSymbolUniqueId(4124);
+    static constexpr const TSymbolUniqueId pt01C                            = TSymbolUniqueId(4125);
+    static constexpr const TSymbolUniqueId imageSize_IImageCube1            = TSymbolUniqueId(4126);
+    static constexpr const TSymbolUniqueId pt01N                            = TSymbolUniqueId(4127);
+    static constexpr const TSymbolUniqueId imageSize_UImageCube1            = TSymbolUniqueId(4128);
+    static constexpr const TSymbolUniqueId pt01Y                            = TSymbolUniqueId(4129);
+    static constexpr const TSymbolUniqueId imageSize_ImageCubeArray1        = TSymbolUniqueId(4130);
+    static constexpr const TSymbolUniqueId pt01H                            = TSymbolUniqueId(4131);
+    static constexpr const TSymbolUniqueId imageSize_IImageCubeArray1       = TSymbolUniqueId(4132);
+    static constexpr const TSymbolUniqueId pt01S                            = TSymbolUniqueId(4133);
+    static constexpr const TSymbolUniqueId imageSize_UImageCubeArray1       = TSymbolUniqueId(4134);
+    static constexpr const TSymbolUniqueId pt01d                            = TSymbolUniqueId(4135);
+    static constexpr const TSymbolUniqueId imageSizeExt_ImageCubeArray1     = TSymbolUniqueId(4136);
+    static constexpr const TSymbolUniqueId imageSizeExt_IImageCubeArray1    = TSymbolUniqueId(4137);
+    static constexpr const TSymbolUniqueId imageSizeExt_UImageCubeArray1    = TSymbolUniqueId(4138);
+    static constexpr const TSymbolUniqueId imageSize_ImageBuffer1           = TSymbolUniqueId(4139);
+    static constexpr const TSymbolUniqueId pt01J                            = TSymbolUniqueId(4140);
+    static constexpr const TSymbolUniqueId imageSize_IImageBuffer1          = TSymbolUniqueId(4141);
+    static constexpr const TSymbolUniqueId pt01U                            = TSymbolUniqueId(4142);
+    static constexpr const TSymbolUniqueId imageSize_UImageBuffer1          = TSymbolUniqueId(4143);
+    static constexpr const TSymbolUniqueId pt01f                            = TSymbolUniqueId(4144);
+    static constexpr const TSymbolUniqueId imageSizeExt_ImageBuffer1        = TSymbolUniqueId(4145);
+    static constexpr const TSymbolUniqueId imageSizeExt_IImageBuffer1       = TSymbolUniqueId(4146);
+    static constexpr const TSymbolUniqueId imageSizeExt_UImageBuffer1       = TSymbolUniqueId(4147);
+    static constexpr const TSymbolUniqueId imageStore_Image2D1_Int2_Float4  = TSymbolUniqueId(4148);
+    static constexpr const TSymbolUniqueId imageStore_IImage2D1_Int2_Int4   = TSymbolUniqueId(4149);
+    static constexpr const TSymbolUniqueId imageStore_UImage2D1_Int2_UInt4  = TSymbolUniqueId(4150);
+    static constexpr const TSymbolUniqueId imageStore_Image3D1_Int3_Float4  = TSymbolUniqueId(4151);
+    static constexpr const TSymbolUniqueId imageStore_IImage3D1_Int3_Int4   = TSymbolUniqueId(4152);
+    static constexpr const TSymbolUniqueId imageStore_UImage3D1_Int3_UInt4  = TSymbolUniqueId(4153);
     static constexpr const TSymbolUniqueId imageStore_Image2DArray1_Int3_Float4 =
-        TSymbolUniqueId(4149);
-    static constexpr const TSymbolUniqueId imageStore_IImage2DArray1_Int3_Int4 =
-        TSymbolUniqueId(4150);
-    static constexpr const TSymbolUniqueId imageStore_UImage2DArray1_Int3_UInt4 =
-        TSymbolUniqueId(4151);
-    static constexpr const TSymbolUniqueId imageStore_ImageCube1_Int3_Float4 =
-        TSymbolUniqueId(4152);
-    static constexpr const TSymbolUniqueId imageStore_IImageCube1_Int3_Int4 = TSymbolUniqueId(4153);
-    static constexpr const TSymbolUniqueId imageStore_UImageCube1_Int3_UInt4 =
         TSymbolUniqueId(4154);
-    static constexpr const TSymbolUniqueId imageStore_ImageCubeArray1_Int3_Float4 =
+    static constexpr const TSymbolUniqueId imageStore_IImage2DArray1_Int3_Int4 =
         TSymbolUniqueId(4155);
-    static constexpr const TSymbolUniqueId imageStore_IImageCubeArray1_Int3_Int4 =
+    static constexpr const TSymbolUniqueId imageStore_UImage2DArray1_Int3_UInt4 =
         TSymbolUniqueId(4156);
-    static constexpr const TSymbolUniqueId imageStore_UImageCubeArray1_Int3_UInt4 =
+    static constexpr const TSymbolUniqueId imageStore_ImageCube1_Int3_Float4 =
         TSymbolUniqueId(4157);
-    static constexpr const TSymbolUniqueId imageStoreExt_ImageCubeArray1_Int3_Float4 =
-        TSymbolUniqueId(4158);
-    static constexpr const TSymbolUniqueId imageStoreExt_IImageCubeArray1_Int3_Int4 =
+    static constexpr const TSymbolUniqueId imageStore_IImageCube1_Int3_Int4 = TSymbolUniqueId(4158);
+    static constexpr const TSymbolUniqueId imageStore_UImageCube1_Int3_UInt4 =
         TSymbolUniqueId(4159);
-    static constexpr const TSymbolUniqueId imageStoreExt_UImageCubeArray1_Int3_UInt4 =
+    static constexpr const TSymbolUniqueId imageStore_ImageCubeArray1_Int3_Float4 =
         TSymbolUniqueId(4160);
-    static constexpr const TSymbolUniqueId imageStore_ImageBuffer1_Int1_Float4 =
+    static constexpr const TSymbolUniqueId imageStore_IImageCubeArray1_Int3_Int4 =
         TSymbolUniqueId(4161);
-    static constexpr const TSymbolUniqueId imageStore_IImageBuffer1_Int1_Int4 =
+    static constexpr const TSymbolUniqueId imageStore_UImageCubeArray1_Int3_UInt4 =
         TSymbolUniqueId(4162);
-    static constexpr const TSymbolUniqueId imageStore_UImageBuffer1_Int1_UInt4 =
+    static constexpr const TSymbolUniqueId imageStoreExt_ImageCubeArray1_Int3_Float4 =
         TSymbolUniqueId(4163);
-    static constexpr const TSymbolUniqueId imageStoreExt_ImageBuffer1_Int1_Float4 =
+    static constexpr const TSymbolUniqueId imageStoreExt_IImageCubeArray1_Int3_Int4 =
         TSymbolUniqueId(4164);
-    static constexpr const TSymbolUniqueId imageStoreExt_IImageBuffer1_Int1_Int4 =
+    static constexpr const TSymbolUniqueId imageStoreExt_UImageCubeArray1_Int3_UInt4 =
         TSymbolUniqueId(4165);
-    static constexpr const TSymbolUniqueId imageStoreExt_UImageBuffer1_Int1_UInt4 =
+    static constexpr const TSymbolUniqueId imageStore_ImageBuffer1_Int1_Float4 =
         TSymbolUniqueId(4166);
-    static constexpr const TSymbolUniqueId imageLoad_Image2D1_Int2         = TSymbolUniqueId(4167);
-    static constexpr const TSymbolUniqueId imageLoad_IImage2D1_Int2        = TSymbolUniqueId(4168);
-    static constexpr const TSymbolUniqueId imageLoad_UImage2D1_Int2        = TSymbolUniqueId(4169);
-    static constexpr const TSymbolUniqueId imageLoad_Image3D1_Int3         = TSymbolUniqueId(4170);
-    static constexpr const TSymbolUniqueId imageLoad_IImage3D1_Int3        = TSymbolUniqueId(4171);
-    static constexpr const TSymbolUniqueId imageLoad_UImage3D1_Int3        = TSymbolUniqueId(4172);
-    static constexpr const TSymbolUniqueId imageLoad_Image2DArray1_Int3    = TSymbolUniqueId(4173);
-    static constexpr const TSymbolUniqueId imageLoad_IImage2DArray1_Int3   = TSymbolUniqueId(4174);
-    static constexpr const TSymbolUniqueId imageLoad_UImage2DArray1_Int3   = TSymbolUniqueId(4175);
-    static constexpr const TSymbolUniqueId imageLoad_ImageCube1_Int3       = TSymbolUniqueId(4176);
-    static constexpr const TSymbolUniqueId imageLoad_IImageCube1_Int3      = TSymbolUniqueId(4177);
-    static constexpr const TSymbolUniqueId imageLoad_UImageCube1_Int3      = TSymbolUniqueId(4178);
-    static constexpr const TSymbolUniqueId imageLoad_ImageCubeArray1_Int3  = TSymbolUniqueId(4179);
-    static constexpr const TSymbolUniqueId imageLoad_IImageCubeArray1_Int3 = TSymbolUniqueId(4180);
-    static constexpr const TSymbolUniqueId imageLoad_UImageCubeArray1_Int3 = TSymbolUniqueId(4181);
+    static constexpr const TSymbolUniqueId imageStore_IImageBuffer1_Int1_Int4 =
+        TSymbolUniqueId(4167);
+    static constexpr const TSymbolUniqueId imageStore_UImageBuffer1_Int1_UInt4 =
+        TSymbolUniqueId(4168);
+    static constexpr const TSymbolUniqueId imageStoreExt_ImageBuffer1_Int1_Float4 =
+        TSymbolUniqueId(4169);
+    static constexpr const TSymbolUniqueId imageStoreExt_IImageBuffer1_Int1_Int4 =
+        TSymbolUniqueId(4170);
+    static constexpr const TSymbolUniqueId imageStoreExt_UImageBuffer1_Int1_UInt4 =
+        TSymbolUniqueId(4171);
+    static constexpr const TSymbolUniqueId imageLoad_Image2D1_Int2         = TSymbolUniqueId(4172);
+    static constexpr const TSymbolUniqueId imageLoad_IImage2D1_Int2        = TSymbolUniqueId(4173);
+    static constexpr const TSymbolUniqueId imageLoad_UImage2D1_Int2        = TSymbolUniqueId(4174);
+    static constexpr const TSymbolUniqueId imageLoad_Image3D1_Int3         = TSymbolUniqueId(4175);
+    static constexpr const TSymbolUniqueId imageLoad_IImage3D1_Int3        = TSymbolUniqueId(4176);
+    static constexpr const TSymbolUniqueId imageLoad_UImage3D1_Int3        = TSymbolUniqueId(4177);
+    static constexpr const TSymbolUniqueId imageLoad_Image2DArray1_Int3    = TSymbolUniqueId(4178);
+    static constexpr const TSymbolUniqueId imageLoad_IImage2DArray1_Int3   = TSymbolUniqueId(4179);
+    static constexpr const TSymbolUniqueId imageLoad_UImage2DArray1_Int3   = TSymbolUniqueId(4180);
+    static constexpr const TSymbolUniqueId imageLoad_ImageCube1_Int3       = TSymbolUniqueId(4181);
+    static constexpr const TSymbolUniqueId imageLoad_IImageCube1_Int3      = TSymbolUniqueId(4182);
+    static constexpr const TSymbolUniqueId imageLoad_UImageCube1_Int3      = TSymbolUniqueId(4183);
+    static constexpr const TSymbolUniqueId imageLoad_ImageCubeArray1_Int3  = TSymbolUniqueId(4184);
+    static constexpr const TSymbolUniqueId imageLoad_IImageCubeArray1_Int3 = TSymbolUniqueId(4185);
+    static constexpr const TSymbolUniqueId imageLoad_UImageCubeArray1_Int3 = TSymbolUniqueId(4186);
     static constexpr const TSymbolUniqueId imageLoadExt_ImageCubeArray1_Int3 =
-        TSymbolUniqueId(4182);
+        TSymbolUniqueId(4187);
     static constexpr const TSymbolUniqueId imageLoadExt_IImageCubeArray1_Int3 =
-        TSymbolUniqueId(4183);
+        TSymbolUniqueId(4188);
     static constexpr const TSymbolUniqueId imageLoadExt_UImageCubeArray1_Int3 =
-        TSymbolUniqueId(4184);
-    static constexpr const TSymbolUniqueId imageLoad_ImageBuffer1_Int1     = TSymbolUniqueId(4185);
-    static constexpr const TSymbolUniqueId imageLoad_IImageBuffer1_Int1    = TSymbolUniqueId(4186);
-    static constexpr const TSymbolUniqueId imageLoad_UImageBuffer1_Int1    = TSymbolUniqueId(4187);
-    static constexpr const TSymbolUniqueId imageLoadExt_ImageBuffer1_Int1  = TSymbolUniqueId(4188);
-    static constexpr const TSymbolUniqueId imageLoadExt_IImageBuffer1_Int1 = TSymbolUniqueId(4189);
-    static constexpr const TSymbolUniqueId imageLoadExt_UImageBuffer1_Int1 = TSymbolUniqueId(4190);
+        TSymbolUniqueId(4189);
+    static constexpr const TSymbolUniqueId imageLoad_ImageBuffer1_Int1     = TSymbolUniqueId(4190);
+    static constexpr const TSymbolUniqueId imageLoad_IImageBuffer1_Int1    = TSymbolUniqueId(4191);
+    static constexpr const TSymbolUniqueId imageLoad_UImageBuffer1_Int1    = TSymbolUniqueId(4192);
+    static constexpr const TSymbolUniqueId imageLoadExt_ImageBuffer1_Int1  = TSymbolUniqueId(4193);
+    static constexpr const TSymbolUniqueId imageLoadExt_IImageBuffer1_Int1 = TSymbolUniqueId(4194);
+    static constexpr const TSymbolUniqueId imageLoadExt_UImageBuffer1_Int1 = TSymbolUniqueId(4195);
     static constexpr const TSymbolUniqueId imageAtomicAddExt_Image2D1_Int2_UInt1 =
-        TSymbolUniqueId(4191);
-    static constexpr const TSymbolUniqueId imageAtomicAddExt_IImage2D1_Int2_UInt1 =
-        TSymbolUniqueId(4192);
-    static constexpr const TSymbolUniqueId imageAtomicAddExt_UImage2D1_Int2_UInt1 =
-        TSymbolUniqueId(4193);
-    static constexpr const TSymbolUniqueId imageAtomicAddExt_Image3D1_Int3_UInt1 =
-        TSymbolUniqueId(4194);
-    static constexpr const TSymbolUniqueId imageAtomicAddExt_IImage3D1_Int3_UInt1 =
-        TSymbolUniqueId(4195);
-    static constexpr const TSymbolUniqueId imageAtomicAddExt_UImage3D1_Int3_UInt1 =
         TSymbolUniqueId(4196);
-    static constexpr const TSymbolUniqueId imageAtomicAddExt_ImageCube1_Int3_UInt1 =
+    static constexpr const TSymbolUniqueId imageAtomicAddExt_IImage2D1_Int2_UInt1 =
         TSymbolUniqueId(4197);
-    static constexpr const TSymbolUniqueId imageAtomicAddExt_IImageCube1_Int3_UInt1 =
+    static constexpr const TSymbolUniqueId imageAtomicAddExt_UImage2D1_Int2_UInt1 =
         TSymbolUniqueId(4198);
-    static constexpr const TSymbolUniqueId imageAtomicAddExt_UImageCube1_Int3_UInt1 =
+    static constexpr const TSymbolUniqueId imageAtomicAddExt_Image3D1_Int3_UInt1 =
         TSymbolUniqueId(4199);
-    static constexpr const TSymbolUniqueId imageAtomicAddExt_ImageBuffer1_Int1_UInt1 =
+    static constexpr const TSymbolUniqueId imageAtomicAddExt_IImage3D1_Int3_UInt1 =
         TSymbolUniqueId(4200);
-    static constexpr const TSymbolUniqueId imageAtomicAddExt_IImageBuffer1_Int1_UInt1 =
+    static constexpr const TSymbolUniqueId imageAtomicAddExt_UImage3D1_Int3_UInt1 =
         TSymbolUniqueId(4201);
-    static constexpr const TSymbolUniqueId imageAtomicAddExt_UImageBuffer1_Int1_UInt1 =
+    static constexpr const TSymbolUniqueId imageAtomicAddExt_ImageCube1_Int3_UInt1 =
         TSymbolUniqueId(4202);
-    static constexpr const TSymbolUniqueId imageAtomicAddExt_Image2DArray1_Int3_UInt1 =
+    static constexpr const TSymbolUniqueId imageAtomicAddExt_IImageCube1_Int3_UInt1 =
         TSymbolUniqueId(4203);
-    static constexpr const TSymbolUniqueId imageAtomicAddExt_IImage2DArray1_Int3_UInt1 =
+    static constexpr const TSymbolUniqueId imageAtomicAddExt_UImageCube1_Int3_UInt1 =
         TSymbolUniqueId(4204);
-    static constexpr const TSymbolUniqueId imageAtomicAddExt_UImage2DArray1_Int3_UInt1 =
+    static constexpr const TSymbolUniqueId imageAtomicAddExt_ImageBuffer1_Int1_UInt1 =
         TSymbolUniqueId(4205);
-    static constexpr const TSymbolUniqueId imageAtomicAddExt_ImageCubeArray1_Int3_UInt1 =
+    static constexpr const TSymbolUniqueId imageAtomicAddExt_IImageBuffer1_Int1_UInt1 =
         TSymbolUniqueId(4206);
-    static constexpr const TSymbolUniqueId imageAtomicAddExt_IImageCubeArray1_Int3_UInt1 =
+    static constexpr const TSymbolUniqueId imageAtomicAddExt_UImageBuffer1_Int1_UInt1 =
         TSymbolUniqueId(4207);
-    static constexpr const TSymbolUniqueId imageAtomicAddExt_UImageCubeArray1_Int3_UInt1 =
+    static constexpr const TSymbolUniqueId imageAtomicAddExt_Image2DArray1_Int3_UInt1 =
         TSymbolUniqueId(4208);
-    static constexpr const TSymbolUniqueId imageAtomicAddExt_Image1D1_Int1_UInt1 =
+    static constexpr const TSymbolUniqueId imageAtomicAddExt_IImage2DArray1_Int3_UInt1 =
         TSymbolUniqueId(4209);
-    static constexpr const TSymbolUniqueId pt01D = TSymbolUniqueId(4210);
-    static constexpr const TSymbolUniqueId imageAtomicAddExt_IImage1D1_Int1_UInt1 =
+    static constexpr const TSymbolUniqueId imageAtomicAddExt_UImage2DArray1_Int3_UInt1 =
+        TSymbolUniqueId(4210);
+    static constexpr const TSymbolUniqueId imageAtomicAddExt_ImageCubeArray1_Int3_UInt1 =
         TSymbolUniqueId(4211);
-    static constexpr const TSymbolUniqueId pt01O = TSymbolUniqueId(4212);
-    static constexpr const TSymbolUniqueId imageAtomicAddExt_UImage1D1_Int1_UInt1 =
+    static constexpr const TSymbolUniqueId imageAtomicAddExt_IImageCubeArray1_Int3_UInt1 =
+        TSymbolUniqueId(4212);
+    static constexpr const TSymbolUniqueId imageAtomicAddExt_UImageCubeArray1_Int3_UInt1 =
         TSymbolUniqueId(4213);
-    static constexpr const TSymbolUniqueId pt01Z = TSymbolUniqueId(4214);
+    static constexpr const TSymbolUniqueId imageAtomicAddExt_Image1D1_Int1_UInt1 =
+        TSymbolUniqueId(4214);
+    static constexpr const TSymbolUniqueId pt01D = TSymbolUniqueId(4215);
+    static constexpr const TSymbolUniqueId imageAtomicAddExt_IImage1D1_Int1_UInt1 =
+        TSymbolUniqueId(4216);
+    static constexpr const TSymbolUniqueId pt01O = TSymbolUniqueId(4217);
+    static constexpr const TSymbolUniqueId imageAtomicAddExt_UImage1D1_Int1_UInt1 =
+        TSymbolUniqueId(4218);
+    static constexpr const TSymbolUniqueId pt01Z = TSymbolUniqueId(4219);
     static constexpr const TSymbolUniqueId imageAtomicAddExt_Image1DArray1_Int2_UInt1 =
-        TSymbolUniqueId(4215);
-    static constexpr const TSymbolUniqueId pt01E = TSymbolUniqueId(4216);
+        TSymbolUniqueId(4220);
+    static constexpr const TSymbolUniqueId pt01E = TSymbolUniqueId(4221);
     static constexpr const TSymbolUniqueId imageAtomicAddExt_IImage1DArray1_Int2_UInt1 =
-        TSymbolUniqueId(4217);
-    static constexpr const TSymbolUniqueId pt01P = TSymbolUniqueId(4218);
+        TSymbolUniqueId(4222);
+    static constexpr const TSymbolUniqueId pt01P = TSymbolUniqueId(4223);
     static constexpr const TSymbolUniqueId imageAtomicAddExt_UImage1DArray1_Int2_UInt1 =
-        TSymbolUniqueId(4219);
-    static constexpr const TSymbolUniqueId pt01a = TSymbolUniqueId(4220);
+        TSymbolUniqueId(4224);
+    static constexpr const TSymbolUniqueId pt01a = TSymbolUniqueId(4225);
     static constexpr const TSymbolUniqueId imageAtomicAddExt_ImageRect1_Int2_UInt1 =
-        TSymbolUniqueId(4221);
-    static constexpr const TSymbolUniqueId pt01I = TSymbolUniqueId(4222);
+        TSymbolUniqueId(4226);
+    static constexpr const TSymbolUniqueId pt01I = TSymbolUniqueId(4227);
     static constexpr const TSymbolUniqueId imageAtomicAddExt_IImageRect1_Int2_UInt1 =
-        TSymbolUniqueId(4223);
-    static constexpr const TSymbolUniqueId pt01T = TSymbolUniqueId(4224);
+        TSymbolUniqueId(4228);
+    static constexpr const TSymbolUniqueId pt01T = TSymbolUniqueId(4229);
     static constexpr const TSymbolUniqueId imageAtomicAddExt_UImageRect1_Int2_UInt1 =
-        TSymbolUniqueId(4225);
-    static constexpr const TSymbolUniqueId pt01e = TSymbolUniqueId(4226);
+        TSymbolUniqueId(4230);
+    static constexpr const TSymbolUniqueId pt01e = TSymbolUniqueId(4231);
     static constexpr const TSymbolUniqueId imageAtomicAddExt_Image2DMS1_Int2_Int1_UInt1 =
-        TSymbolUniqueId(4227);
-    static constexpr const TSymbolUniqueId pt01F = TSymbolUniqueId(4228);
+        TSymbolUniqueId(4232);
+    static constexpr const TSymbolUniqueId pt01F = TSymbolUniqueId(4233);
     static constexpr const TSymbolUniqueId imageAtomicAddExt_IImage2DMS1_Int2_Int1_UInt1 =
-        TSymbolUniqueId(4229);
-    static constexpr const TSymbolUniqueId pt01Q = TSymbolUniqueId(4230);
+        TSymbolUniqueId(4234);
+    static constexpr const TSymbolUniqueId pt01Q = TSymbolUniqueId(4235);
     static constexpr const TSymbolUniqueId imageAtomicAddExt_UImage2DMS1_Int2_Int1_UInt1 =
-        TSymbolUniqueId(4231);
-    static constexpr const TSymbolUniqueId pt01b = TSymbolUniqueId(4232);
+        TSymbolUniqueId(4236);
+    static constexpr const TSymbolUniqueId pt01b = TSymbolUniqueId(4237);
     static constexpr const TSymbolUniqueId imageAtomicAddExt_Image2DMSArray1_Int3_Int1_UInt1 =
-        TSymbolUniqueId(4233);
-    static constexpr const TSymbolUniqueId pt01G = TSymbolUniqueId(4234);
+        TSymbolUniqueId(4238);
+    static constexpr const TSymbolUniqueId pt01G = TSymbolUniqueId(4239);
     static constexpr const TSymbolUniqueId imageAtomicAddExt_IImage2DMSArray1_Int3_Int1_UInt1 =
-        TSymbolUniqueId(4235);
-    static constexpr const TSymbolUniqueId pt01R = TSymbolUniqueId(4236);
-    static constexpr const TSymbolUniqueId imageAtomicAddExt_UImage2DMSArray1_Int3_Int1_UInt1 =
-        TSymbolUniqueId(4237);
-    static constexpr const TSymbolUniqueId pt01c = TSymbolUniqueId(4238);
-    static constexpr const TSymbolUniqueId imageAtomicAddExt_Image2D1_Int2_Int1 =
-        TSymbolUniqueId(4239);
-    static constexpr const TSymbolUniqueId imageAtomicAddExt_IImage2D1_Int2_Int1 =
         TSymbolUniqueId(4240);
-    static constexpr const TSymbolUniqueId imageAtomicAddExt_UImage2D1_Int2_Int1 =
-        TSymbolUniqueId(4241);
-    static constexpr const TSymbolUniqueId imageAtomicAddExt_Image3D1_Int3_Int1 =
+    static constexpr const TSymbolUniqueId pt01R = TSymbolUniqueId(4241);
+    static constexpr const TSymbolUniqueId imageAtomicAddExt_UImage2DMSArray1_Int3_Int1_UInt1 =
         TSymbolUniqueId(4242);
-    static constexpr const TSymbolUniqueId imageAtomicAddExt_IImage3D1_Int3_Int1 =
-        TSymbolUniqueId(4243);
-    static constexpr const TSymbolUniqueId imageAtomicAddExt_UImage3D1_Int3_Int1 =
+    static constexpr const TSymbolUniqueId pt01c = TSymbolUniqueId(4243);
+    static constexpr const TSymbolUniqueId imageAtomicAddExt_Image2D1_Int2_Int1 =
         TSymbolUniqueId(4244);
-    static constexpr const TSymbolUniqueId imageAtomicAddExt_ImageCube1_Int3_Int1 =
+    static constexpr const TSymbolUniqueId imageAtomicAddExt_IImage2D1_Int2_Int1 =
         TSymbolUniqueId(4245);
-    static constexpr const TSymbolUniqueId imageAtomicAddExt_IImageCube1_Int3_Int1 =
+    static constexpr const TSymbolUniqueId imageAtomicAddExt_UImage2D1_Int2_Int1 =
         TSymbolUniqueId(4246);
-    static constexpr const TSymbolUniqueId imageAtomicAddExt_UImageCube1_Int3_Int1 =
+    static constexpr const TSymbolUniqueId imageAtomicAddExt_Image3D1_Int3_Int1 =
         TSymbolUniqueId(4247);
-    static constexpr const TSymbolUniqueId imageAtomicAddExt_ImageBuffer1_Int1_Int1 =
+    static constexpr const TSymbolUniqueId imageAtomicAddExt_IImage3D1_Int3_Int1 =
         TSymbolUniqueId(4248);
-    static constexpr const TSymbolUniqueId imageAtomicAddExt_IImageBuffer1_Int1_Int1 =
+    static constexpr const TSymbolUniqueId imageAtomicAddExt_UImage3D1_Int3_Int1 =
         TSymbolUniqueId(4249);
-    static constexpr const TSymbolUniqueId imageAtomicAddExt_UImageBuffer1_Int1_Int1 =
+    static constexpr const TSymbolUniqueId imageAtomicAddExt_ImageCube1_Int3_Int1 =
         TSymbolUniqueId(4250);
-    static constexpr const TSymbolUniqueId imageAtomicAddExt_Image2DArray1_Int3_Int1 =
+    static constexpr const TSymbolUniqueId imageAtomicAddExt_IImageCube1_Int3_Int1 =
         TSymbolUniqueId(4251);
-    static constexpr const TSymbolUniqueId imageAtomicAddExt_IImage2DArray1_Int3_Int1 =
+    static constexpr const TSymbolUniqueId imageAtomicAddExt_UImageCube1_Int3_Int1 =
         TSymbolUniqueId(4252);
-    static constexpr const TSymbolUniqueId imageAtomicAddExt_UImage2DArray1_Int3_Int1 =
+    static constexpr const TSymbolUniqueId imageAtomicAddExt_ImageBuffer1_Int1_Int1 =
         TSymbolUniqueId(4253);
-    static constexpr const TSymbolUniqueId imageAtomicAddExt_ImageCubeArray1_Int3_Int1 =
+    static constexpr const TSymbolUniqueId imageAtomicAddExt_IImageBuffer1_Int1_Int1 =
         TSymbolUniqueId(4254);
-    static constexpr const TSymbolUniqueId imageAtomicAddExt_IImageCubeArray1_Int3_Int1 =
+    static constexpr const TSymbolUniqueId imageAtomicAddExt_UImageBuffer1_Int1_Int1 =
         TSymbolUniqueId(4255);
-    static constexpr const TSymbolUniqueId imageAtomicAddExt_UImageCubeArray1_Int3_Int1 =
+    static constexpr const TSymbolUniqueId imageAtomicAddExt_Image2DArray1_Int3_Int1 =
         TSymbolUniqueId(4256);
-    static constexpr const TSymbolUniqueId imageAtomicAddExt_Image1D1_Int1_Int1 =
+    static constexpr const TSymbolUniqueId imageAtomicAddExt_IImage2DArray1_Int3_Int1 =
         TSymbolUniqueId(4257);
-    static constexpr const TSymbolUniqueId imageAtomicAddExt_IImage1D1_Int1_Int1 =
+    static constexpr const TSymbolUniqueId imageAtomicAddExt_UImage2DArray1_Int3_Int1 =
         TSymbolUniqueId(4258);
-    static constexpr const TSymbolUniqueId imageAtomicAddExt_UImage1D1_Int1_Int1 =
+    static constexpr const TSymbolUniqueId imageAtomicAddExt_ImageCubeArray1_Int3_Int1 =
         TSymbolUniqueId(4259);
-    static constexpr const TSymbolUniqueId imageAtomicAddExt_Image1DArray1_Int2_Int1 =
+    static constexpr const TSymbolUniqueId imageAtomicAddExt_IImageCubeArray1_Int3_Int1 =
         TSymbolUniqueId(4260);
-    static constexpr const TSymbolUniqueId imageAtomicAddExt_IImage1DArray1_Int2_Int1 =
+    static constexpr const TSymbolUniqueId imageAtomicAddExt_UImageCubeArray1_Int3_Int1 =
         TSymbolUniqueId(4261);
-    static constexpr const TSymbolUniqueId imageAtomicAddExt_UImage1DArray1_Int2_Int1 =
+    static constexpr const TSymbolUniqueId imageAtomicAddExt_Image1D1_Int1_Int1 =
         TSymbolUniqueId(4262);
-    static constexpr const TSymbolUniqueId imageAtomicAddExt_ImageRect1_Int2_Int1 =
+    static constexpr const TSymbolUniqueId imageAtomicAddExt_IImage1D1_Int1_Int1 =
         TSymbolUniqueId(4263);
-    static constexpr const TSymbolUniqueId imageAtomicAddExt_IImageRect1_Int2_Int1 =
+    static constexpr const TSymbolUniqueId imageAtomicAddExt_UImage1D1_Int1_Int1 =
         TSymbolUniqueId(4264);
-    static constexpr const TSymbolUniqueId imageAtomicAddExt_UImageRect1_Int2_Int1 =
+    static constexpr const TSymbolUniqueId imageAtomicAddExt_Image1DArray1_Int2_Int1 =
         TSymbolUniqueId(4265);
-    static constexpr const TSymbolUniqueId imageAtomicAddExt_Image2DMS1_Int2_Int1_Int1 =
+    static constexpr const TSymbolUniqueId imageAtomicAddExt_IImage1DArray1_Int2_Int1 =
         TSymbolUniqueId(4266);
-    static constexpr const TSymbolUniqueId imageAtomicAddExt_IImage2DMS1_Int2_Int1_Int1 =
+    static constexpr const TSymbolUniqueId imageAtomicAddExt_UImage1DArray1_Int2_Int1 =
         TSymbolUniqueId(4267);
-    static constexpr const TSymbolUniqueId imageAtomicAddExt_UImage2DMS1_Int2_Int1_Int1 =
+    static constexpr const TSymbolUniqueId imageAtomicAddExt_ImageRect1_Int2_Int1 =
         TSymbolUniqueId(4268);
-    static constexpr const TSymbolUniqueId imageAtomicAddExt_Image2DMSArray1_Int3_Int1_Int1 =
+    static constexpr const TSymbolUniqueId imageAtomicAddExt_IImageRect1_Int2_Int1 =
         TSymbolUniqueId(4269);
-    static constexpr const TSymbolUniqueId imageAtomicAddExt_IImage2DMSArray1_Int3_Int1_Int1 =
+    static constexpr const TSymbolUniqueId imageAtomicAddExt_UImageRect1_Int2_Int1 =
         TSymbolUniqueId(4270);
-    static constexpr const TSymbolUniqueId imageAtomicAddExt_UImage2DMSArray1_Int3_Int1_Int1 =
+    static constexpr const TSymbolUniqueId imageAtomicAddExt_Image2DMS1_Int2_Int1_Int1 =
         TSymbolUniqueId(4271);
-    static constexpr const TSymbolUniqueId imageAtomicMinExt_Image2D1_Int2_UInt1 =
+    static constexpr const TSymbolUniqueId imageAtomicAddExt_IImage2DMS1_Int2_Int1_Int1 =
         TSymbolUniqueId(4272);
-    static constexpr const TSymbolUniqueId imageAtomicMinExt_IImage2D1_Int2_UInt1 =
+    static constexpr const TSymbolUniqueId imageAtomicAddExt_UImage2DMS1_Int2_Int1_Int1 =
         TSymbolUniqueId(4273);
-    static constexpr const TSymbolUniqueId imageAtomicMinExt_UImage2D1_Int2_UInt1 =
+    static constexpr const TSymbolUniqueId imageAtomicAddExt_Image2DMSArray1_Int3_Int1_Int1 =
         TSymbolUniqueId(4274);
-    static constexpr const TSymbolUniqueId imageAtomicMinExt_Image3D1_Int3_UInt1 =
+    static constexpr const TSymbolUniqueId imageAtomicAddExt_IImage2DMSArray1_Int3_Int1_Int1 =
         TSymbolUniqueId(4275);
-    static constexpr const TSymbolUniqueId imageAtomicMinExt_IImage3D1_Int3_UInt1 =
+    static constexpr const TSymbolUniqueId imageAtomicAddExt_UImage2DMSArray1_Int3_Int1_Int1 =
         TSymbolUniqueId(4276);
-    static constexpr const TSymbolUniqueId imageAtomicMinExt_UImage3D1_Int3_UInt1 =
+    static constexpr const TSymbolUniqueId imageAtomicMinExt_Image2D1_Int2_UInt1 =
         TSymbolUniqueId(4277);
-    static constexpr const TSymbolUniqueId imageAtomicMinExt_ImageCube1_Int3_UInt1 =
+    static constexpr const TSymbolUniqueId imageAtomicMinExt_IImage2D1_Int2_UInt1 =
         TSymbolUniqueId(4278);
-    static constexpr const TSymbolUniqueId imageAtomicMinExt_IImageCube1_Int3_UInt1 =
+    static constexpr const TSymbolUniqueId imageAtomicMinExt_UImage2D1_Int2_UInt1 =
         TSymbolUniqueId(4279);
-    static constexpr const TSymbolUniqueId imageAtomicMinExt_UImageCube1_Int3_UInt1 =
+    static constexpr const TSymbolUniqueId imageAtomicMinExt_Image3D1_Int3_UInt1 =
         TSymbolUniqueId(4280);
-    static constexpr const TSymbolUniqueId imageAtomicMinExt_ImageBuffer1_Int1_UInt1 =
+    static constexpr const TSymbolUniqueId imageAtomicMinExt_IImage3D1_Int3_UInt1 =
         TSymbolUniqueId(4281);
-    static constexpr const TSymbolUniqueId imageAtomicMinExt_IImageBuffer1_Int1_UInt1 =
+    static constexpr const TSymbolUniqueId imageAtomicMinExt_UImage3D1_Int3_UInt1 =
         TSymbolUniqueId(4282);
-    static constexpr const TSymbolUniqueId imageAtomicMinExt_UImageBuffer1_Int1_UInt1 =
+    static constexpr const TSymbolUniqueId imageAtomicMinExt_ImageCube1_Int3_UInt1 =
         TSymbolUniqueId(4283);
-    static constexpr const TSymbolUniqueId imageAtomicMinExt_Image2DArray1_Int3_UInt1 =
+    static constexpr const TSymbolUniqueId imageAtomicMinExt_IImageCube1_Int3_UInt1 =
         TSymbolUniqueId(4284);
-    static constexpr const TSymbolUniqueId imageAtomicMinExt_IImage2DArray1_Int3_UInt1 =
+    static constexpr const TSymbolUniqueId imageAtomicMinExt_UImageCube1_Int3_UInt1 =
         TSymbolUniqueId(4285);
-    static constexpr const TSymbolUniqueId imageAtomicMinExt_UImage2DArray1_Int3_UInt1 =
+    static constexpr const TSymbolUniqueId imageAtomicMinExt_ImageBuffer1_Int1_UInt1 =
         TSymbolUniqueId(4286);
-    static constexpr const TSymbolUniqueId imageAtomicMinExt_ImageCubeArray1_Int3_UInt1 =
+    static constexpr const TSymbolUniqueId imageAtomicMinExt_IImageBuffer1_Int1_UInt1 =
         TSymbolUniqueId(4287);
-    static constexpr const TSymbolUniqueId imageAtomicMinExt_IImageCubeArray1_Int3_UInt1 =
+    static constexpr const TSymbolUniqueId imageAtomicMinExt_UImageBuffer1_Int1_UInt1 =
         TSymbolUniqueId(4288);
-    static constexpr const TSymbolUniqueId imageAtomicMinExt_UImageCubeArray1_Int3_UInt1 =
+    static constexpr const TSymbolUniqueId imageAtomicMinExt_Image2DArray1_Int3_UInt1 =
         TSymbolUniqueId(4289);
-    static constexpr const TSymbolUniqueId imageAtomicMinExt_Image1D1_Int1_UInt1 =
+    static constexpr const TSymbolUniqueId imageAtomicMinExt_IImage2DArray1_Int3_UInt1 =
         TSymbolUniqueId(4290);
-    static constexpr const TSymbolUniqueId imageAtomicMinExt_IImage1D1_Int1_UInt1 =
+    static constexpr const TSymbolUniqueId imageAtomicMinExt_UImage2DArray1_Int3_UInt1 =
         TSymbolUniqueId(4291);
-    static constexpr const TSymbolUniqueId imageAtomicMinExt_UImage1D1_Int1_UInt1 =
+    static constexpr const TSymbolUniqueId imageAtomicMinExt_ImageCubeArray1_Int3_UInt1 =
         TSymbolUniqueId(4292);
-    static constexpr const TSymbolUniqueId imageAtomicMinExt_Image1DArray1_Int2_UInt1 =
+    static constexpr const TSymbolUniqueId imageAtomicMinExt_IImageCubeArray1_Int3_UInt1 =
         TSymbolUniqueId(4293);
-    static constexpr const TSymbolUniqueId imageAtomicMinExt_IImage1DArray1_Int2_UInt1 =
+    static constexpr const TSymbolUniqueId imageAtomicMinExt_UImageCubeArray1_Int3_UInt1 =
         TSymbolUniqueId(4294);
-    static constexpr const TSymbolUniqueId imageAtomicMinExt_UImage1DArray1_Int2_UInt1 =
+    static constexpr const TSymbolUniqueId imageAtomicMinExt_Image1D1_Int1_UInt1 =
         TSymbolUniqueId(4295);
-    static constexpr const TSymbolUniqueId imageAtomicMinExt_ImageRect1_Int2_UInt1 =
+    static constexpr const TSymbolUniqueId imageAtomicMinExt_IImage1D1_Int1_UInt1 =
         TSymbolUniqueId(4296);
-    static constexpr const TSymbolUniqueId imageAtomicMinExt_IImageRect1_Int2_UInt1 =
+    static constexpr const TSymbolUniqueId imageAtomicMinExt_UImage1D1_Int1_UInt1 =
         TSymbolUniqueId(4297);
-    static constexpr const TSymbolUniqueId imageAtomicMinExt_UImageRect1_Int2_UInt1 =
+    static constexpr const TSymbolUniqueId imageAtomicMinExt_Image1DArray1_Int2_UInt1 =
         TSymbolUniqueId(4298);
-    static constexpr const TSymbolUniqueId imageAtomicMinExt_Image2DMS1_Int2_Int1_UInt1 =
+    static constexpr const TSymbolUniqueId imageAtomicMinExt_IImage1DArray1_Int2_UInt1 =
         TSymbolUniqueId(4299);
-    static constexpr const TSymbolUniqueId imageAtomicMinExt_IImage2DMS1_Int2_Int1_UInt1 =
+    static constexpr const TSymbolUniqueId imageAtomicMinExt_UImage1DArray1_Int2_UInt1 =
         TSymbolUniqueId(4300);
-    static constexpr const TSymbolUniqueId imageAtomicMinExt_UImage2DMS1_Int2_Int1_UInt1 =
+    static constexpr const TSymbolUniqueId imageAtomicMinExt_ImageRect1_Int2_UInt1 =
         TSymbolUniqueId(4301);
-    static constexpr const TSymbolUniqueId imageAtomicMinExt_Image2DMSArray1_Int3_Int1_UInt1 =
+    static constexpr const TSymbolUniqueId imageAtomicMinExt_IImageRect1_Int2_UInt1 =
         TSymbolUniqueId(4302);
-    static constexpr const TSymbolUniqueId imageAtomicMinExt_IImage2DMSArray1_Int3_Int1_UInt1 =
+    static constexpr const TSymbolUniqueId imageAtomicMinExt_UImageRect1_Int2_UInt1 =
         TSymbolUniqueId(4303);
-    static constexpr const TSymbolUniqueId imageAtomicMinExt_UImage2DMSArray1_Int3_Int1_UInt1 =
+    static constexpr const TSymbolUniqueId imageAtomicMinExt_Image2DMS1_Int2_Int1_UInt1 =
         TSymbolUniqueId(4304);
-    static constexpr const TSymbolUniqueId imageAtomicMinExt_Image2D1_Int2_Int1 =
+    static constexpr const TSymbolUniqueId imageAtomicMinExt_IImage2DMS1_Int2_Int1_UInt1 =
         TSymbolUniqueId(4305);
-    static constexpr const TSymbolUniqueId imageAtomicMinExt_IImage2D1_Int2_Int1 =
+    static constexpr const TSymbolUniqueId imageAtomicMinExt_UImage2DMS1_Int2_Int1_UInt1 =
         TSymbolUniqueId(4306);
-    static constexpr const TSymbolUniqueId imageAtomicMinExt_UImage2D1_Int2_Int1 =
+    static constexpr const TSymbolUniqueId imageAtomicMinExt_Image2DMSArray1_Int3_Int1_UInt1 =
         TSymbolUniqueId(4307);
-    static constexpr const TSymbolUniqueId imageAtomicMinExt_Image3D1_Int3_Int1 =
+    static constexpr const TSymbolUniqueId imageAtomicMinExt_IImage2DMSArray1_Int3_Int1_UInt1 =
         TSymbolUniqueId(4308);
-    static constexpr const TSymbolUniqueId imageAtomicMinExt_IImage3D1_Int3_Int1 =
+    static constexpr const TSymbolUniqueId imageAtomicMinExt_UImage2DMSArray1_Int3_Int1_UInt1 =
         TSymbolUniqueId(4309);
-    static constexpr const TSymbolUniqueId imageAtomicMinExt_UImage3D1_Int3_Int1 =
+    static constexpr const TSymbolUniqueId imageAtomicMinExt_Image2D1_Int2_Int1 =
         TSymbolUniqueId(4310);
-    static constexpr const TSymbolUniqueId imageAtomicMinExt_ImageCube1_Int3_Int1 =
+    static constexpr const TSymbolUniqueId imageAtomicMinExt_IImage2D1_Int2_Int1 =
         TSymbolUniqueId(4311);
-    static constexpr const TSymbolUniqueId imageAtomicMinExt_IImageCube1_Int3_Int1 =
+    static constexpr const TSymbolUniqueId imageAtomicMinExt_UImage2D1_Int2_Int1 =
         TSymbolUniqueId(4312);
-    static constexpr const TSymbolUniqueId imageAtomicMinExt_UImageCube1_Int3_Int1 =
+    static constexpr const TSymbolUniqueId imageAtomicMinExt_Image3D1_Int3_Int1 =
         TSymbolUniqueId(4313);
-    static constexpr const TSymbolUniqueId imageAtomicMinExt_ImageBuffer1_Int1_Int1 =
+    static constexpr const TSymbolUniqueId imageAtomicMinExt_IImage3D1_Int3_Int1 =
         TSymbolUniqueId(4314);
-    static constexpr const TSymbolUniqueId imageAtomicMinExt_IImageBuffer1_Int1_Int1 =
+    static constexpr const TSymbolUniqueId imageAtomicMinExt_UImage3D1_Int3_Int1 =
         TSymbolUniqueId(4315);
-    static constexpr const TSymbolUniqueId imageAtomicMinExt_UImageBuffer1_Int1_Int1 =
+    static constexpr const TSymbolUniqueId imageAtomicMinExt_ImageCube1_Int3_Int1 =
         TSymbolUniqueId(4316);
-    static constexpr const TSymbolUniqueId imageAtomicMinExt_Image2DArray1_Int3_Int1 =
+    static constexpr const TSymbolUniqueId imageAtomicMinExt_IImageCube1_Int3_Int1 =
         TSymbolUniqueId(4317);
-    static constexpr const TSymbolUniqueId imageAtomicMinExt_IImage2DArray1_Int3_Int1 =
+    static constexpr const TSymbolUniqueId imageAtomicMinExt_UImageCube1_Int3_Int1 =
         TSymbolUniqueId(4318);
-    static constexpr const TSymbolUniqueId imageAtomicMinExt_UImage2DArray1_Int3_Int1 =
+    static constexpr const TSymbolUniqueId imageAtomicMinExt_ImageBuffer1_Int1_Int1 =
         TSymbolUniqueId(4319);
-    static constexpr const TSymbolUniqueId imageAtomicMinExt_ImageCubeArray1_Int3_Int1 =
+    static constexpr const TSymbolUniqueId imageAtomicMinExt_IImageBuffer1_Int1_Int1 =
         TSymbolUniqueId(4320);
-    static constexpr const TSymbolUniqueId imageAtomicMinExt_IImageCubeArray1_Int3_Int1 =
+    static constexpr const TSymbolUniqueId imageAtomicMinExt_UImageBuffer1_Int1_Int1 =
         TSymbolUniqueId(4321);
-    static constexpr const TSymbolUniqueId imageAtomicMinExt_UImageCubeArray1_Int3_Int1 =
+    static constexpr const TSymbolUniqueId imageAtomicMinExt_Image2DArray1_Int3_Int1 =
         TSymbolUniqueId(4322);
-    static constexpr const TSymbolUniqueId imageAtomicMinExt_Image1D1_Int1_Int1 =
+    static constexpr const TSymbolUniqueId imageAtomicMinExt_IImage2DArray1_Int3_Int1 =
         TSymbolUniqueId(4323);
-    static constexpr const TSymbolUniqueId imageAtomicMinExt_IImage1D1_Int1_Int1 =
+    static constexpr const TSymbolUniqueId imageAtomicMinExt_UImage2DArray1_Int3_Int1 =
         TSymbolUniqueId(4324);
-    static constexpr const TSymbolUniqueId imageAtomicMinExt_UImage1D1_Int1_Int1 =
+    static constexpr const TSymbolUniqueId imageAtomicMinExt_ImageCubeArray1_Int3_Int1 =
         TSymbolUniqueId(4325);
-    static constexpr const TSymbolUniqueId imageAtomicMinExt_Image1DArray1_Int2_Int1 =
+    static constexpr const TSymbolUniqueId imageAtomicMinExt_IImageCubeArray1_Int3_Int1 =
         TSymbolUniqueId(4326);
-    static constexpr const TSymbolUniqueId imageAtomicMinExt_IImage1DArray1_Int2_Int1 =
+    static constexpr const TSymbolUniqueId imageAtomicMinExt_UImageCubeArray1_Int3_Int1 =
         TSymbolUniqueId(4327);
-    static constexpr const TSymbolUniqueId imageAtomicMinExt_UImage1DArray1_Int2_Int1 =
+    static constexpr const TSymbolUniqueId imageAtomicMinExt_Image1D1_Int1_Int1 =
         TSymbolUniqueId(4328);
-    static constexpr const TSymbolUniqueId imageAtomicMinExt_ImageRect1_Int2_Int1 =
+    static constexpr const TSymbolUniqueId imageAtomicMinExt_IImage1D1_Int1_Int1 =
         TSymbolUniqueId(4329);
-    static constexpr const TSymbolUniqueId imageAtomicMinExt_IImageRect1_Int2_Int1 =
+    static constexpr const TSymbolUniqueId imageAtomicMinExt_UImage1D1_Int1_Int1 =
         TSymbolUniqueId(4330);
-    static constexpr const TSymbolUniqueId imageAtomicMinExt_UImageRect1_Int2_Int1 =
+    static constexpr const TSymbolUniqueId imageAtomicMinExt_Image1DArray1_Int2_Int1 =
         TSymbolUniqueId(4331);
-    static constexpr const TSymbolUniqueId imageAtomicMinExt_Image2DMS1_Int2_Int1_Int1 =
+    static constexpr const TSymbolUniqueId imageAtomicMinExt_IImage1DArray1_Int2_Int1 =
         TSymbolUniqueId(4332);
-    static constexpr const TSymbolUniqueId imageAtomicMinExt_IImage2DMS1_Int2_Int1_Int1 =
+    static constexpr const TSymbolUniqueId imageAtomicMinExt_UImage1DArray1_Int2_Int1 =
         TSymbolUniqueId(4333);
-    static constexpr const TSymbolUniqueId imageAtomicMinExt_UImage2DMS1_Int2_Int1_Int1 =
+    static constexpr const TSymbolUniqueId imageAtomicMinExt_ImageRect1_Int2_Int1 =
         TSymbolUniqueId(4334);
-    static constexpr const TSymbolUniqueId imageAtomicMinExt_Image2DMSArray1_Int3_Int1_Int1 =
+    static constexpr const TSymbolUniqueId imageAtomicMinExt_IImageRect1_Int2_Int1 =
         TSymbolUniqueId(4335);
-    static constexpr const TSymbolUniqueId imageAtomicMinExt_IImage2DMSArray1_Int3_Int1_Int1 =
+    static constexpr const TSymbolUniqueId imageAtomicMinExt_UImageRect1_Int2_Int1 =
         TSymbolUniqueId(4336);
-    static constexpr const TSymbolUniqueId imageAtomicMinExt_UImage2DMSArray1_Int3_Int1_Int1 =
+    static constexpr const TSymbolUniqueId imageAtomicMinExt_Image2DMS1_Int2_Int1_Int1 =
         TSymbolUniqueId(4337);
-    static constexpr const TSymbolUniqueId imageAtomicMaxExt_Image2D1_Int2_UInt1 =
+    static constexpr const TSymbolUniqueId imageAtomicMinExt_IImage2DMS1_Int2_Int1_Int1 =
         TSymbolUniqueId(4338);
-    static constexpr const TSymbolUniqueId imageAtomicMaxExt_IImage2D1_Int2_UInt1 =
+    static constexpr const TSymbolUniqueId imageAtomicMinExt_UImage2DMS1_Int2_Int1_Int1 =
         TSymbolUniqueId(4339);
-    static constexpr const TSymbolUniqueId imageAtomicMaxExt_UImage2D1_Int2_UInt1 =
+    static constexpr const TSymbolUniqueId imageAtomicMinExt_Image2DMSArray1_Int3_Int1_Int1 =
         TSymbolUniqueId(4340);
-    static constexpr const TSymbolUniqueId imageAtomicMaxExt_Image3D1_Int3_UInt1 =
+    static constexpr const TSymbolUniqueId imageAtomicMinExt_IImage2DMSArray1_Int3_Int1_Int1 =
         TSymbolUniqueId(4341);
-    static constexpr const TSymbolUniqueId imageAtomicMaxExt_IImage3D1_Int3_UInt1 =
+    static constexpr const TSymbolUniqueId imageAtomicMinExt_UImage2DMSArray1_Int3_Int1_Int1 =
         TSymbolUniqueId(4342);
-    static constexpr const TSymbolUniqueId imageAtomicMaxExt_UImage3D1_Int3_UInt1 =
+    static constexpr const TSymbolUniqueId imageAtomicMaxExt_Image2D1_Int2_UInt1 =
         TSymbolUniqueId(4343);
-    static constexpr const TSymbolUniqueId imageAtomicMaxExt_ImageCube1_Int3_UInt1 =
+    static constexpr const TSymbolUniqueId imageAtomicMaxExt_IImage2D1_Int2_UInt1 =
         TSymbolUniqueId(4344);
-    static constexpr const TSymbolUniqueId imageAtomicMaxExt_IImageCube1_Int3_UInt1 =
+    static constexpr const TSymbolUniqueId imageAtomicMaxExt_UImage2D1_Int2_UInt1 =
         TSymbolUniqueId(4345);
-    static constexpr const TSymbolUniqueId imageAtomicMaxExt_UImageCube1_Int3_UInt1 =
+    static constexpr const TSymbolUniqueId imageAtomicMaxExt_Image3D1_Int3_UInt1 =
         TSymbolUniqueId(4346);
-    static constexpr const TSymbolUniqueId imageAtomicMaxExt_ImageBuffer1_Int1_UInt1 =
+    static constexpr const TSymbolUniqueId imageAtomicMaxExt_IImage3D1_Int3_UInt1 =
         TSymbolUniqueId(4347);
-    static constexpr const TSymbolUniqueId imageAtomicMaxExt_IImageBuffer1_Int1_UInt1 =
+    static constexpr const TSymbolUniqueId imageAtomicMaxExt_UImage3D1_Int3_UInt1 =
         TSymbolUniqueId(4348);
-    static constexpr const TSymbolUniqueId imageAtomicMaxExt_UImageBuffer1_Int1_UInt1 =
+    static constexpr const TSymbolUniqueId imageAtomicMaxExt_ImageCube1_Int3_UInt1 =
         TSymbolUniqueId(4349);
-    static constexpr const TSymbolUniqueId imageAtomicMaxExt_Image2DArray1_Int3_UInt1 =
+    static constexpr const TSymbolUniqueId imageAtomicMaxExt_IImageCube1_Int3_UInt1 =
         TSymbolUniqueId(4350);
-    static constexpr const TSymbolUniqueId imageAtomicMaxExt_IImage2DArray1_Int3_UInt1 =
+    static constexpr const TSymbolUniqueId imageAtomicMaxExt_UImageCube1_Int3_UInt1 =
         TSymbolUniqueId(4351);
-    static constexpr const TSymbolUniqueId imageAtomicMaxExt_UImage2DArray1_Int3_UInt1 =
+    static constexpr const TSymbolUniqueId imageAtomicMaxExt_ImageBuffer1_Int1_UInt1 =
         TSymbolUniqueId(4352);
-    static constexpr const TSymbolUniqueId imageAtomicMaxExt_ImageCubeArray1_Int3_UInt1 =
+    static constexpr const TSymbolUniqueId imageAtomicMaxExt_IImageBuffer1_Int1_UInt1 =
         TSymbolUniqueId(4353);
-    static constexpr const TSymbolUniqueId imageAtomicMaxExt_IImageCubeArray1_Int3_UInt1 =
+    static constexpr const TSymbolUniqueId imageAtomicMaxExt_UImageBuffer1_Int1_UInt1 =
         TSymbolUniqueId(4354);
-    static constexpr const TSymbolUniqueId imageAtomicMaxExt_UImageCubeArray1_Int3_UInt1 =
+    static constexpr const TSymbolUniqueId imageAtomicMaxExt_Image2DArray1_Int3_UInt1 =
         TSymbolUniqueId(4355);
-    static constexpr const TSymbolUniqueId imageAtomicMaxExt_Image1D1_Int1_UInt1 =
+    static constexpr const TSymbolUniqueId imageAtomicMaxExt_IImage2DArray1_Int3_UInt1 =
         TSymbolUniqueId(4356);
-    static constexpr const TSymbolUniqueId imageAtomicMaxExt_IImage1D1_Int1_UInt1 =
+    static constexpr const TSymbolUniqueId imageAtomicMaxExt_UImage2DArray1_Int3_UInt1 =
         TSymbolUniqueId(4357);
-    static constexpr const TSymbolUniqueId imageAtomicMaxExt_UImage1D1_Int1_UInt1 =
+    static constexpr const TSymbolUniqueId imageAtomicMaxExt_ImageCubeArray1_Int3_UInt1 =
         TSymbolUniqueId(4358);
-    static constexpr const TSymbolUniqueId imageAtomicMaxExt_Image1DArray1_Int2_UInt1 =
+    static constexpr const TSymbolUniqueId imageAtomicMaxExt_IImageCubeArray1_Int3_UInt1 =
         TSymbolUniqueId(4359);
-    static constexpr const TSymbolUniqueId imageAtomicMaxExt_IImage1DArray1_Int2_UInt1 =
+    static constexpr const TSymbolUniqueId imageAtomicMaxExt_UImageCubeArray1_Int3_UInt1 =
         TSymbolUniqueId(4360);
-    static constexpr const TSymbolUniqueId imageAtomicMaxExt_UImage1DArray1_Int2_UInt1 =
+    static constexpr const TSymbolUniqueId imageAtomicMaxExt_Image1D1_Int1_UInt1 =
         TSymbolUniqueId(4361);
-    static constexpr const TSymbolUniqueId imageAtomicMaxExt_ImageRect1_Int2_UInt1 =
+    static constexpr const TSymbolUniqueId imageAtomicMaxExt_IImage1D1_Int1_UInt1 =
         TSymbolUniqueId(4362);
-    static constexpr const TSymbolUniqueId imageAtomicMaxExt_IImageRect1_Int2_UInt1 =
+    static constexpr const TSymbolUniqueId imageAtomicMaxExt_UImage1D1_Int1_UInt1 =
         TSymbolUniqueId(4363);
-    static constexpr const TSymbolUniqueId imageAtomicMaxExt_UImageRect1_Int2_UInt1 =
+    static constexpr const TSymbolUniqueId imageAtomicMaxExt_Image1DArray1_Int2_UInt1 =
         TSymbolUniqueId(4364);
-    static constexpr const TSymbolUniqueId imageAtomicMaxExt_Image2DMS1_Int2_Int1_UInt1 =
+    static constexpr const TSymbolUniqueId imageAtomicMaxExt_IImage1DArray1_Int2_UInt1 =
         TSymbolUniqueId(4365);
-    static constexpr const TSymbolUniqueId imageAtomicMaxExt_IImage2DMS1_Int2_Int1_UInt1 =
+    static constexpr const TSymbolUniqueId imageAtomicMaxExt_UImage1DArray1_Int2_UInt1 =
         TSymbolUniqueId(4366);
-    static constexpr const TSymbolUniqueId imageAtomicMaxExt_UImage2DMS1_Int2_Int1_UInt1 =
+    static constexpr const TSymbolUniqueId imageAtomicMaxExt_ImageRect1_Int2_UInt1 =
         TSymbolUniqueId(4367);
-    static constexpr const TSymbolUniqueId imageAtomicMaxExt_Image2DMSArray1_Int3_Int1_UInt1 =
+    static constexpr const TSymbolUniqueId imageAtomicMaxExt_IImageRect1_Int2_UInt1 =
         TSymbolUniqueId(4368);
-    static constexpr const TSymbolUniqueId imageAtomicMaxExt_IImage2DMSArray1_Int3_Int1_UInt1 =
+    static constexpr const TSymbolUniqueId imageAtomicMaxExt_UImageRect1_Int2_UInt1 =
         TSymbolUniqueId(4369);
-    static constexpr const TSymbolUniqueId imageAtomicMaxExt_UImage2DMSArray1_Int3_Int1_UInt1 =
+    static constexpr const TSymbolUniqueId imageAtomicMaxExt_Image2DMS1_Int2_Int1_UInt1 =
         TSymbolUniqueId(4370);
-    static constexpr const TSymbolUniqueId imageAtomicMaxExt_Image2D1_Int2_Int1 =
+    static constexpr const TSymbolUniqueId imageAtomicMaxExt_IImage2DMS1_Int2_Int1_UInt1 =
         TSymbolUniqueId(4371);
-    static constexpr const TSymbolUniqueId imageAtomicMaxExt_IImage2D1_Int2_Int1 =
+    static constexpr const TSymbolUniqueId imageAtomicMaxExt_UImage2DMS1_Int2_Int1_UInt1 =
         TSymbolUniqueId(4372);
-    static constexpr const TSymbolUniqueId imageAtomicMaxExt_UImage2D1_Int2_Int1 =
+    static constexpr const TSymbolUniqueId imageAtomicMaxExt_Image2DMSArray1_Int3_Int1_UInt1 =
         TSymbolUniqueId(4373);
-    static constexpr const TSymbolUniqueId imageAtomicMaxExt_Image3D1_Int3_Int1 =
+    static constexpr const TSymbolUniqueId imageAtomicMaxExt_IImage2DMSArray1_Int3_Int1_UInt1 =
         TSymbolUniqueId(4374);
-    static constexpr const TSymbolUniqueId imageAtomicMaxExt_IImage3D1_Int3_Int1 =
+    static constexpr const TSymbolUniqueId imageAtomicMaxExt_UImage2DMSArray1_Int3_Int1_UInt1 =
         TSymbolUniqueId(4375);
-    static constexpr const TSymbolUniqueId imageAtomicMaxExt_UImage3D1_Int3_Int1 =
+    static constexpr const TSymbolUniqueId imageAtomicMaxExt_Image2D1_Int2_Int1 =
         TSymbolUniqueId(4376);
-    static constexpr const TSymbolUniqueId imageAtomicMaxExt_ImageCube1_Int3_Int1 =
+    static constexpr const TSymbolUniqueId imageAtomicMaxExt_IImage2D1_Int2_Int1 =
         TSymbolUniqueId(4377);
-    static constexpr const TSymbolUniqueId imageAtomicMaxExt_IImageCube1_Int3_Int1 =
+    static constexpr const TSymbolUniqueId imageAtomicMaxExt_UImage2D1_Int2_Int1 =
         TSymbolUniqueId(4378);
-    static constexpr const TSymbolUniqueId imageAtomicMaxExt_UImageCube1_Int3_Int1 =
+    static constexpr const TSymbolUniqueId imageAtomicMaxExt_Image3D1_Int3_Int1 =
         TSymbolUniqueId(4379);
-    static constexpr const TSymbolUniqueId imageAtomicMaxExt_ImageBuffer1_Int1_Int1 =
+    static constexpr const TSymbolUniqueId imageAtomicMaxExt_IImage3D1_Int3_Int1 =
         TSymbolUniqueId(4380);
-    static constexpr const TSymbolUniqueId imageAtomicMaxExt_IImageBuffer1_Int1_Int1 =
+    static constexpr const TSymbolUniqueId imageAtomicMaxExt_UImage3D1_Int3_Int1 =
         TSymbolUniqueId(4381);
-    static constexpr const TSymbolUniqueId imageAtomicMaxExt_UImageBuffer1_Int1_Int1 =
+    static constexpr const TSymbolUniqueId imageAtomicMaxExt_ImageCube1_Int3_Int1 =
         TSymbolUniqueId(4382);
-    static constexpr const TSymbolUniqueId imageAtomicMaxExt_Image2DArray1_Int3_Int1 =
+    static constexpr const TSymbolUniqueId imageAtomicMaxExt_IImageCube1_Int3_Int1 =
         TSymbolUniqueId(4383);
-    static constexpr const TSymbolUniqueId imageAtomicMaxExt_IImage2DArray1_Int3_Int1 =
+    static constexpr const TSymbolUniqueId imageAtomicMaxExt_UImageCube1_Int3_Int1 =
         TSymbolUniqueId(4384);
-    static constexpr const TSymbolUniqueId imageAtomicMaxExt_UImage2DArray1_Int3_Int1 =
+    static constexpr const TSymbolUniqueId imageAtomicMaxExt_ImageBuffer1_Int1_Int1 =
         TSymbolUniqueId(4385);
-    static constexpr const TSymbolUniqueId imageAtomicMaxExt_ImageCubeArray1_Int3_Int1 =
+    static constexpr const TSymbolUniqueId imageAtomicMaxExt_IImageBuffer1_Int1_Int1 =
         TSymbolUniqueId(4386);
-    static constexpr const TSymbolUniqueId imageAtomicMaxExt_IImageCubeArray1_Int3_Int1 =
+    static constexpr const TSymbolUniqueId imageAtomicMaxExt_UImageBuffer1_Int1_Int1 =
         TSymbolUniqueId(4387);
-    static constexpr const TSymbolUniqueId imageAtomicMaxExt_UImageCubeArray1_Int3_Int1 =
+    static constexpr const TSymbolUniqueId imageAtomicMaxExt_Image2DArray1_Int3_Int1 =
         TSymbolUniqueId(4388);
-    static constexpr const TSymbolUniqueId imageAtomicMaxExt_Image1D1_Int1_Int1 =
+    static constexpr const TSymbolUniqueId imageAtomicMaxExt_IImage2DArray1_Int3_Int1 =
         TSymbolUniqueId(4389);
-    static constexpr const TSymbolUniqueId imageAtomicMaxExt_IImage1D1_Int1_Int1 =
+    static constexpr const TSymbolUniqueId imageAtomicMaxExt_UImage2DArray1_Int3_Int1 =
         TSymbolUniqueId(4390);
-    static constexpr const TSymbolUniqueId imageAtomicMaxExt_UImage1D1_Int1_Int1 =
+    static constexpr const TSymbolUniqueId imageAtomicMaxExt_ImageCubeArray1_Int3_Int1 =
         TSymbolUniqueId(4391);
-    static constexpr const TSymbolUniqueId imageAtomicMaxExt_Image1DArray1_Int2_Int1 =
+    static constexpr const TSymbolUniqueId imageAtomicMaxExt_IImageCubeArray1_Int3_Int1 =
         TSymbolUniqueId(4392);
-    static constexpr const TSymbolUniqueId imageAtomicMaxExt_IImage1DArray1_Int2_Int1 =
+    static constexpr const TSymbolUniqueId imageAtomicMaxExt_UImageCubeArray1_Int3_Int1 =
         TSymbolUniqueId(4393);
-    static constexpr const TSymbolUniqueId imageAtomicMaxExt_UImage1DArray1_Int2_Int1 =
+    static constexpr const TSymbolUniqueId imageAtomicMaxExt_Image1D1_Int1_Int1 =
         TSymbolUniqueId(4394);
-    static constexpr const TSymbolUniqueId imageAtomicMaxExt_ImageRect1_Int2_Int1 =
+    static constexpr const TSymbolUniqueId imageAtomicMaxExt_IImage1D1_Int1_Int1 =
         TSymbolUniqueId(4395);
-    static constexpr const TSymbolUniqueId imageAtomicMaxExt_IImageRect1_Int2_Int1 =
+    static constexpr const TSymbolUniqueId imageAtomicMaxExt_UImage1D1_Int1_Int1 =
         TSymbolUniqueId(4396);
-    static constexpr const TSymbolUniqueId imageAtomicMaxExt_UImageRect1_Int2_Int1 =
+    static constexpr const TSymbolUniqueId imageAtomicMaxExt_Image1DArray1_Int2_Int1 =
         TSymbolUniqueId(4397);
-    static constexpr const TSymbolUniqueId imageAtomicMaxExt_Image2DMS1_Int2_Int1_Int1 =
+    static constexpr const TSymbolUniqueId imageAtomicMaxExt_IImage1DArray1_Int2_Int1 =
         TSymbolUniqueId(4398);
-    static constexpr const TSymbolUniqueId imageAtomicMaxExt_IImage2DMS1_Int2_Int1_Int1 =
+    static constexpr const TSymbolUniqueId imageAtomicMaxExt_UImage1DArray1_Int2_Int1 =
         TSymbolUniqueId(4399);
-    static constexpr const TSymbolUniqueId imageAtomicMaxExt_UImage2DMS1_Int2_Int1_Int1 =
+    static constexpr const TSymbolUniqueId imageAtomicMaxExt_ImageRect1_Int2_Int1 =
         TSymbolUniqueId(4400);
-    static constexpr const TSymbolUniqueId imageAtomicMaxExt_Image2DMSArray1_Int3_Int1_Int1 =
+    static constexpr const TSymbolUniqueId imageAtomicMaxExt_IImageRect1_Int2_Int1 =
         TSymbolUniqueId(4401);
-    static constexpr const TSymbolUniqueId imageAtomicMaxExt_IImage2DMSArray1_Int3_Int1_Int1 =
+    static constexpr const TSymbolUniqueId imageAtomicMaxExt_UImageRect1_Int2_Int1 =
         TSymbolUniqueId(4402);
-    static constexpr const TSymbolUniqueId imageAtomicMaxExt_UImage2DMSArray1_Int3_Int1_Int1 =
+    static constexpr const TSymbolUniqueId imageAtomicMaxExt_Image2DMS1_Int2_Int1_Int1 =
         TSymbolUniqueId(4403);
-    static constexpr const TSymbolUniqueId imageAtomicAndExt_Image2D1_Int2_UInt1 =
+    static constexpr const TSymbolUniqueId imageAtomicMaxExt_IImage2DMS1_Int2_Int1_Int1 =
         TSymbolUniqueId(4404);
-    static constexpr const TSymbolUniqueId imageAtomicAndExt_IImage2D1_Int2_UInt1 =
+    static constexpr const TSymbolUniqueId imageAtomicMaxExt_UImage2DMS1_Int2_Int1_Int1 =
         TSymbolUniqueId(4405);
-    static constexpr const TSymbolUniqueId imageAtomicAndExt_UImage2D1_Int2_UInt1 =
+    static constexpr const TSymbolUniqueId imageAtomicMaxExt_Image2DMSArray1_Int3_Int1_Int1 =
         TSymbolUniqueId(4406);
-    static constexpr const TSymbolUniqueId imageAtomicAndExt_Image3D1_Int3_UInt1 =
+    static constexpr const TSymbolUniqueId imageAtomicMaxExt_IImage2DMSArray1_Int3_Int1_Int1 =
         TSymbolUniqueId(4407);
-    static constexpr const TSymbolUniqueId imageAtomicAndExt_IImage3D1_Int3_UInt1 =
+    static constexpr const TSymbolUniqueId imageAtomicMaxExt_UImage2DMSArray1_Int3_Int1_Int1 =
         TSymbolUniqueId(4408);
-    static constexpr const TSymbolUniqueId imageAtomicAndExt_UImage3D1_Int3_UInt1 =
+    static constexpr const TSymbolUniqueId imageAtomicAndExt_Image2D1_Int2_UInt1 =
         TSymbolUniqueId(4409);
-    static constexpr const TSymbolUniqueId imageAtomicAndExt_ImageCube1_Int3_UInt1 =
+    static constexpr const TSymbolUniqueId imageAtomicAndExt_IImage2D1_Int2_UInt1 =
         TSymbolUniqueId(4410);
-    static constexpr const TSymbolUniqueId imageAtomicAndExt_IImageCube1_Int3_UInt1 =
+    static constexpr const TSymbolUniqueId imageAtomicAndExt_UImage2D1_Int2_UInt1 =
         TSymbolUniqueId(4411);
-    static constexpr const TSymbolUniqueId imageAtomicAndExt_UImageCube1_Int3_UInt1 =
+    static constexpr const TSymbolUniqueId imageAtomicAndExt_Image3D1_Int3_UInt1 =
         TSymbolUniqueId(4412);
-    static constexpr const TSymbolUniqueId imageAtomicAndExt_ImageBuffer1_Int1_UInt1 =
+    static constexpr const TSymbolUniqueId imageAtomicAndExt_IImage3D1_Int3_UInt1 =
         TSymbolUniqueId(4413);
-    static constexpr const TSymbolUniqueId imageAtomicAndExt_IImageBuffer1_Int1_UInt1 =
+    static constexpr const TSymbolUniqueId imageAtomicAndExt_UImage3D1_Int3_UInt1 =
         TSymbolUniqueId(4414);
-    static constexpr const TSymbolUniqueId imageAtomicAndExt_UImageBuffer1_Int1_UInt1 =
+    static constexpr const TSymbolUniqueId imageAtomicAndExt_ImageCube1_Int3_UInt1 =
         TSymbolUniqueId(4415);
-    static constexpr const TSymbolUniqueId imageAtomicAndExt_Image2DArray1_Int3_UInt1 =
+    static constexpr const TSymbolUniqueId imageAtomicAndExt_IImageCube1_Int3_UInt1 =
         TSymbolUniqueId(4416);
-    static constexpr const TSymbolUniqueId imageAtomicAndExt_IImage2DArray1_Int3_UInt1 =
+    static constexpr const TSymbolUniqueId imageAtomicAndExt_UImageCube1_Int3_UInt1 =
         TSymbolUniqueId(4417);
-    static constexpr const TSymbolUniqueId imageAtomicAndExt_UImage2DArray1_Int3_UInt1 =
+    static constexpr const TSymbolUniqueId imageAtomicAndExt_ImageBuffer1_Int1_UInt1 =
         TSymbolUniqueId(4418);
-    static constexpr const TSymbolUniqueId imageAtomicAndExt_ImageCubeArray1_Int3_UInt1 =
+    static constexpr const TSymbolUniqueId imageAtomicAndExt_IImageBuffer1_Int1_UInt1 =
         TSymbolUniqueId(4419);
-    static constexpr const TSymbolUniqueId imageAtomicAndExt_IImageCubeArray1_Int3_UInt1 =
+    static constexpr const TSymbolUniqueId imageAtomicAndExt_UImageBuffer1_Int1_UInt1 =
         TSymbolUniqueId(4420);
-    static constexpr const TSymbolUniqueId imageAtomicAndExt_UImageCubeArray1_Int3_UInt1 =
+    static constexpr const TSymbolUniqueId imageAtomicAndExt_Image2DArray1_Int3_UInt1 =
         TSymbolUniqueId(4421);
-    static constexpr const TSymbolUniqueId imageAtomicAndExt_Image1D1_Int1_UInt1 =
+    static constexpr const TSymbolUniqueId imageAtomicAndExt_IImage2DArray1_Int3_UInt1 =
         TSymbolUniqueId(4422);
-    static constexpr const TSymbolUniqueId imageAtomicAndExt_IImage1D1_Int1_UInt1 =
+    static constexpr const TSymbolUniqueId imageAtomicAndExt_UImage2DArray1_Int3_UInt1 =
         TSymbolUniqueId(4423);
-    static constexpr const TSymbolUniqueId imageAtomicAndExt_UImage1D1_Int1_UInt1 =
+    static constexpr const TSymbolUniqueId imageAtomicAndExt_ImageCubeArray1_Int3_UInt1 =
         TSymbolUniqueId(4424);
-    static constexpr const TSymbolUniqueId imageAtomicAndExt_Image1DArray1_Int2_UInt1 =
+    static constexpr const TSymbolUniqueId imageAtomicAndExt_IImageCubeArray1_Int3_UInt1 =
         TSymbolUniqueId(4425);
-    static constexpr const TSymbolUniqueId imageAtomicAndExt_IImage1DArray1_Int2_UInt1 =
+    static constexpr const TSymbolUniqueId imageAtomicAndExt_UImageCubeArray1_Int3_UInt1 =
         TSymbolUniqueId(4426);
-    static constexpr const TSymbolUniqueId imageAtomicAndExt_UImage1DArray1_Int2_UInt1 =
+    static constexpr const TSymbolUniqueId imageAtomicAndExt_Image1D1_Int1_UInt1 =
         TSymbolUniqueId(4427);
-    static constexpr const TSymbolUniqueId imageAtomicAndExt_ImageRect1_Int2_UInt1 =
+    static constexpr const TSymbolUniqueId imageAtomicAndExt_IImage1D1_Int1_UInt1 =
         TSymbolUniqueId(4428);
-    static constexpr const TSymbolUniqueId imageAtomicAndExt_IImageRect1_Int2_UInt1 =
+    static constexpr const TSymbolUniqueId imageAtomicAndExt_UImage1D1_Int1_UInt1 =
         TSymbolUniqueId(4429);
-    static constexpr const TSymbolUniqueId imageAtomicAndExt_UImageRect1_Int2_UInt1 =
+    static constexpr const TSymbolUniqueId imageAtomicAndExt_Image1DArray1_Int2_UInt1 =
         TSymbolUniqueId(4430);
-    static constexpr const TSymbolUniqueId imageAtomicAndExt_Image2DMS1_Int2_Int1_UInt1 =
+    static constexpr const TSymbolUniqueId imageAtomicAndExt_IImage1DArray1_Int2_UInt1 =
         TSymbolUniqueId(4431);
-    static constexpr const TSymbolUniqueId imageAtomicAndExt_IImage2DMS1_Int2_Int1_UInt1 =
+    static constexpr const TSymbolUniqueId imageAtomicAndExt_UImage1DArray1_Int2_UInt1 =
         TSymbolUniqueId(4432);
-    static constexpr const TSymbolUniqueId imageAtomicAndExt_UImage2DMS1_Int2_Int1_UInt1 =
+    static constexpr const TSymbolUniqueId imageAtomicAndExt_ImageRect1_Int2_UInt1 =
         TSymbolUniqueId(4433);
-    static constexpr const TSymbolUniqueId imageAtomicAndExt_Image2DMSArray1_Int3_Int1_UInt1 =
+    static constexpr const TSymbolUniqueId imageAtomicAndExt_IImageRect1_Int2_UInt1 =
         TSymbolUniqueId(4434);
-    static constexpr const TSymbolUniqueId imageAtomicAndExt_IImage2DMSArray1_Int3_Int1_UInt1 =
+    static constexpr const TSymbolUniqueId imageAtomicAndExt_UImageRect1_Int2_UInt1 =
         TSymbolUniqueId(4435);
-    static constexpr const TSymbolUniqueId imageAtomicAndExt_UImage2DMSArray1_Int3_Int1_UInt1 =
+    static constexpr const TSymbolUniqueId imageAtomicAndExt_Image2DMS1_Int2_Int1_UInt1 =
         TSymbolUniqueId(4436);
-    static constexpr const TSymbolUniqueId imageAtomicAndExt_Image2D1_Int2_Int1 =
+    static constexpr const TSymbolUniqueId imageAtomicAndExt_IImage2DMS1_Int2_Int1_UInt1 =
         TSymbolUniqueId(4437);
-    static constexpr const TSymbolUniqueId imageAtomicAndExt_IImage2D1_Int2_Int1 =
+    static constexpr const TSymbolUniqueId imageAtomicAndExt_UImage2DMS1_Int2_Int1_UInt1 =
         TSymbolUniqueId(4438);
-    static constexpr const TSymbolUniqueId imageAtomicAndExt_UImage2D1_Int2_Int1 =
+    static constexpr const TSymbolUniqueId imageAtomicAndExt_Image2DMSArray1_Int3_Int1_UInt1 =
         TSymbolUniqueId(4439);
-    static constexpr const TSymbolUniqueId imageAtomicAndExt_Image3D1_Int3_Int1 =
+    static constexpr const TSymbolUniqueId imageAtomicAndExt_IImage2DMSArray1_Int3_Int1_UInt1 =
         TSymbolUniqueId(4440);
-    static constexpr const TSymbolUniqueId imageAtomicAndExt_IImage3D1_Int3_Int1 =
+    static constexpr const TSymbolUniqueId imageAtomicAndExt_UImage2DMSArray1_Int3_Int1_UInt1 =
         TSymbolUniqueId(4441);
-    static constexpr const TSymbolUniqueId imageAtomicAndExt_UImage3D1_Int3_Int1 =
+    static constexpr const TSymbolUniqueId imageAtomicAndExt_Image2D1_Int2_Int1 =
         TSymbolUniqueId(4442);
-    static constexpr const TSymbolUniqueId imageAtomicAndExt_ImageCube1_Int3_Int1 =
+    static constexpr const TSymbolUniqueId imageAtomicAndExt_IImage2D1_Int2_Int1 =
         TSymbolUniqueId(4443);
-    static constexpr const TSymbolUniqueId imageAtomicAndExt_IImageCube1_Int3_Int1 =
+    static constexpr const TSymbolUniqueId imageAtomicAndExt_UImage2D1_Int2_Int1 =
         TSymbolUniqueId(4444);
-    static constexpr const TSymbolUniqueId imageAtomicAndExt_UImageCube1_Int3_Int1 =
+    static constexpr const TSymbolUniqueId imageAtomicAndExt_Image3D1_Int3_Int1 =
         TSymbolUniqueId(4445);
-    static constexpr const TSymbolUniqueId imageAtomicAndExt_ImageBuffer1_Int1_Int1 =
+    static constexpr const TSymbolUniqueId imageAtomicAndExt_IImage3D1_Int3_Int1 =
         TSymbolUniqueId(4446);
-    static constexpr const TSymbolUniqueId imageAtomicAndExt_IImageBuffer1_Int1_Int1 =
+    static constexpr const TSymbolUniqueId imageAtomicAndExt_UImage3D1_Int3_Int1 =
         TSymbolUniqueId(4447);
-    static constexpr const TSymbolUniqueId imageAtomicAndExt_UImageBuffer1_Int1_Int1 =
+    static constexpr const TSymbolUniqueId imageAtomicAndExt_ImageCube1_Int3_Int1 =
         TSymbolUniqueId(4448);
-    static constexpr const TSymbolUniqueId imageAtomicAndExt_Image2DArray1_Int3_Int1 =
+    static constexpr const TSymbolUniqueId imageAtomicAndExt_IImageCube1_Int3_Int1 =
         TSymbolUniqueId(4449);
-    static constexpr const TSymbolUniqueId imageAtomicAndExt_IImage2DArray1_Int3_Int1 =
+    static constexpr const TSymbolUniqueId imageAtomicAndExt_UImageCube1_Int3_Int1 =
         TSymbolUniqueId(4450);
-    static constexpr const TSymbolUniqueId imageAtomicAndExt_UImage2DArray1_Int3_Int1 =
+    static constexpr const TSymbolUniqueId imageAtomicAndExt_ImageBuffer1_Int1_Int1 =
         TSymbolUniqueId(4451);
-    static constexpr const TSymbolUniqueId imageAtomicAndExt_ImageCubeArray1_Int3_Int1 =
+    static constexpr const TSymbolUniqueId imageAtomicAndExt_IImageBuffer1_Int1_Int1 =
         TSymbolUniqueId(4452);
-    static constexpr const TSymbolUniqueId imageAtomicAndExt_IImageCubeArray1_Int3_Int1 =
+    static constexpr const TSymbolUniqueId imageAtomicAndExt_UImageBuffer1_Int1_Int1 =
         TSymbolUniqueId(4453);
-    static constexpr const TSymbolUniqueId imageAtomicAndExt_UImageCubeArray1_Int3_Int1 =
+    static constexpr const TSymbolUniqueId imageAtomicAndExt_Image2DArray1_Int3_Int1 =
         TSymbolUniqueId(4454);
-    static constexpr const TSymbolUniqueId imageAtomicAndExt_Image1D1_Int1_Int1 =
+    static constexpr const TSymbolUniqueId imageAtomicAndExt_IImage2DArray1_Int3_Int1 =
         TSymbolUniqueId(4455);
-    static constexpr const TSymbolUniqueId imageAtomicAndExt_IImage1D1_Int1_Int1 =
+    static constexpr const TSymbolUniqueId imageAtomicAndExt_UImage2DArray1_Int3_Int1 =
         TSymbolUniqueId(4456);
-    static constexpr const TSymbolUniqueId imageAtomicAndExt_UImage1D1_Int1_Int1 =
+    static constexpr const TSymbolUniqueId imageAtomicAndExt_ImageCubeArray1_Int3_Int1 =
         TSymbolUniqueId(4457);
-    static constexpr const TSymbolUniqueId imageAtomicAndExt_Image1DArray1_Int2_Int1 =
+    static constexpr const TSymbolUniqueId imageAtomicAndExt_IImageCubeArray1_Int3_Int1 =
         TSymbolUniqueId(4458);
-    static constexpr const TSymbolUniqueId imageAtomicAndExt_IImage1DArray1_Int2_Int1 =
+    static constexpr const TSymbolUniqueId imageAtomicAndExt_UImageCubeArray1_Int3_Int1 =
         TSymbolUniqueId(4459);
-    static constexpr const TSymbolUniqueId imageAtomicAndExt_UImage1DArray1_Int2_Int1 =
+    static constexpr const TSymbolUniqueId imageAtomicAndExt_Image1D1_Int1_Int1 =
         TSymbolUniqueId(4460);
-    static constexpr const TSymbolUniqueId imageAtomicAndExt_ImageRect1_Int2_Int1 =
+    static constexpr const TSymbolUniqueId imageAtomicAndExt_IImage1D1_Int1_Int1 =
         TSymbolUniqueId(4461);
-    static constexpr const TSymbolUniqueId imageAtomicAndExt_IImageRect1_Int2_Int1 =
+    static constexpr const TSymbolUniqueId imageAtomicAndExt_UImage1D1_Int1_Int1 =
         TSymbolUniqueId(4462);
-    static constexpr const TSymbolUniqueId imageAtomicAndExt_UImageRect1_Int2_Int1 =
+    static constexpr const TSymbolUniqueId imageAtomicAndExt_Image1DArray1_Int2_Int1 =
         TSymbolUniqueId(4463);
-    static constexpr const TSymbolUniqueId imageAtomicAndExt_Image2DMS1_Int2_Int1_Int1 =
+    static constexpr const TSymbolUniqueId imageAtomicAndExt_IImage1DArray1_Int2_Int1 =
         TSymbolUniqueId(4464);
-    static constexpr const TSymbolUniqueId imageAtomicAndExt_IImage2DMS1_Int2_Int1_Int1 =
+    static constexpr const TSymbolUniqueId imageAtomicAndExt_UImage1DArray1_Int2_Int1 =
         TSymbolUniqueId(4465);
-    static constexpr const TSymbolUniqueId imageAtomicAndExt_UImage2DMS1_Int2_Int1_Int1 =
+    static constexpr const TSymbolUniqueId imageAtomicAndExt_ImageRect1_Int2_Int1 =
         TSymbolUniqueId(4466);
-    static constexpr const TSymbolUniqueId imageAtomicAndExt_Image2DMSArray1_Int3_Int1_Int1 =
+    static constexpr const TSymbolUniqueId imageAtomicAndExt_IImageRect1_Int2_Int1 =
         TSymbolUniqueId(4467);
-    static constexpr const TSymbolUniqueId imageAtomicAndExt_IImage2DMSArray1_Int3_Int1_Int1 =
+    static constexpr const TSymbolUniqueId imageAtomicAndExt_UImageRect1_Int2_Int1 =
         TSymbolUniqueId(4468);
-    static constexpr const TSymbolUniqueId imageAtomicAndExt_UImage2DMSArray1_Int3_Int1_Int1 =
+    static constexpr const TSymbolUniqueId imageAtomicAndExt_Image2DMS1_Int2_Int1_Int1 =
         TSymbolUniqueId(4469);
-    static constexpr const TSymbolUniqueId imageAtomicOrExt_Image2D1_Int2_UInt1 =
+    static constexpr const TSymbolUniqueId imageAtomicAndExt_IImage2DMS1_Int2_Int1_Int1 =
         TSymbolUniqueId(4470);
-    static constexpr const TSymbolUniqueId imageAtomicOrExt_IImage2D1_Int2_UInt1 =
+    static constexpr const TSymbolUniqueId imageAtomicAndExt_UImage2DMS1_Int2_Int1_Int1 =
         TSymbolUniqueId(4471);
-    static constexpr const TSymbolUniqueId imageAtomicOrExt_UImage2D1_Int2_UInt1 =
+    static constexpr const TSymbolUniqueId imageAtomicAndExt_Image2DMSArray1_Int3_Int1_Int1 =
         TSymbolUniqueId(4472);
-    static constexpr const TSymbolUniqueId imageAtomicOrExt_Image3D1_Int3_UInt1 =
+    static constexpr const TSymbolUniqueId imageAtomicAndExt_IImage2DMSArray1_Int3_Int1_Int1 =
         TSymbolUniqueId(4473);
-    static constexpr const TSymbolUniqueId imageAtomicOrExt_IImage3D1_Int3_UInt1 =
+    static constexpr const TSymbolUniqueId imageAtomicAndExt_UImage2DMSArray1_Int3_Int1_Int1 =
         TSymbolUniqueId(4474);
-    static constexpr const TSymbolUniqueId imageAtomicOrExt_UImage3D1_Int3_UInt1 =
+    static constexpr const TSymbolUniqueId imageAtomicOrExt_Image2D1_Int2_UInt1 =
         TSymbolUniqueId(4475);
-    static constexpr const TSymbolUniqueId imageAtomicOrExt_ImageCube1_Int3_UInt1 =
+    static constexpr const TSymbolUniqueId imageAtomicOrExt_IImage2D1_Int2_UInt1 =
         TSymbolUniqueId(4476);
-    static constexpr const TSymbolUniqueId imageAtomicOrExt_IImageCube1_Int3_UInt1 =
+    static constexpr const TSymbolUniqueId imageAtomicOrExt_UImage2D1_Int2_UInt1 =
         TSymbolUniqueId(4477);
-    static constexpr const TSymbolUniqueId imageAtomicOrExt_UImageCube1_Int3_UInt1 =
+    static constexpr const TSymbolUniqueId imageAtomicOrExt_Image3D1_Int3_UInt1 =
         TSymbolUniqueId(4478);
-    static constexpr const TSymbolUniqueId imageAtomicOrExt_ImageBuffer1_Int1_UInt1 =
+    static constexpr const TSymbolUniqueId imageAtomicOrExt_IImage3D1_Int3_UInt1 =
         TSymbolUniqueId(4479);
-    static constexpr const TSymbolUniqueId imageAtomicOrExt_IImageBuffer1_Int1_UInt1 =
+    static constexpr const TSymbolUniqueId imageAtomicOrExt_UImage3D1_Int3_UInt1 =
         TSymbolUniqueId(4480);
-    static constexpr const TSymbolUniqueId imageAtomicOrExt_UImageBuffer1_Int1_UInt1 =
+    static constexpr const TSymbolUniqueId imageAtomicOrExt_ImageCube1_Int3_UInt1 =
         TSymbolUniqueId(4481);
-    static constexpr const TSymbolUniqueId imageAtomicOrExt_Image2DArray1_Int3_UInt1 =
+    static constexpr const TSymbolUniqueId imageAtomicOrExt_IImageCube1_Int3_UInt1 =
         TSymbolUniqueId(4482);
-    static constexpr const TSymbolUniqueId imageAtomicOrExt_IImage2DArray1_Int3_UInt1 =
+    static constexpr const TSymbolUniqueId imageAtomicOrExt_UImageCube1_Int3_UInt1 =
         TSymbolUniqueId(4483);
-    static constexpr const TSymbolUniqueId imageAtomicOrExt_UImage2DArray1_Int3_UInt1 =
+    static constexpr const TSymbolUniqueId imageAtomicOrExt_ImageBuffer1_Int1_UInt1 =
         TSymbolUniqueId(4484);
-    static constexpr const TSymbolUniqueId imageAtomicOrExt_ImageCubeArray1_Int3_UInt1 =
+    static constexpr const TSymbolUniqueId imageAtomicOrExt_IImageBuffer1_Int1_UInt1 =
         TSymbolUniqueId(4485);
-    static constexpr const TSymbolUniqueId imageAtomicOrExt_IImageCubeArray1_Int3_UInt1 =
+    static constexpr const TSymbolUniqueId imageAtomicOrExt_UImageBuffer1_Int1_UInt1 =
         TSymbolUniqueId(4486);
-    static constexpr const TSymbolUniqueId imageAtomicOrExt_UImageCubeArray1_Int3_UInt1 =
+    static constexpr const TSymbolUniqueId imageAtomicOrExt_Image2DArray1_Int3_UInt1 =
         TSymbolUniqueId(4487);
-    static constexpr const TSymbolUniqueId imageAtomicOrExt_Image1D1_Int1_UInt1 =
+    static constexpr const TSymbolUniqueId imageAtomicOrExt_IImage2DArray1_Int3_UInt1 =
         TSymbolUniqueId(4488);
-    static constexpr const TSymbolUniqueId imageAtomicOrExt_IImage1D1_Int1_UInt1 =
+    static constexpr const TSymbolUniqueId imageAtomicOrExt_UImage2DArray1_Int3_UInt1 =
         TSymbolUniqueId(4489);
-    static constexpr const TSymbolUniqueId imageAtomicOrExt_UImage1D1_Int1_UInt1 =
+    static constexpr const TSymbolUniqueId imageAtomicOrExt_ImageCubeArray1_Int3_UInt1 =
         TSymbolUniqueId(4490);
-    static constexpr const TSymbolUniqueId imageAtomicOrExt_Image1DArray1_Int2_UInt1 =
+    static constexpr const TSymbolUniqueId imageAtomicOrExt_IImageCubeArray1_Int3_UInt1 =
         TSymbolUniqueId(4491);
-    static constexpr const TSymbolUniqueId imageAtomicOrExt_IImage1DArray1_Int2_UInt1 =
+    static constexpr const TSymbolUniqueId imageAtomicOrExt_UImageCubeArray1_Int3_UInt1 =
         TSymbolUniqueId(4492);
-    static constexpr const TSymbolUniqueId imageAtomicOrExt_UImage1DArray1_Int2_UInt1 =
+    static constexpr const TSymbolUniqueId imageAtomicOrExt_Image1D1_Int1_UInt1 =
         TSymbolUniqueId(4493);
-    static constexpr const TSymbolUniqueId imageAtomicOrExt_ImageRect1_Int2_UInt1 =
+    static constexpr const TSymbolUniqueId imageAtomicOrExt_IImage1D1_Int1_UInt1 =
         TSymbolUniqueId(4494);
-    static constexpr const TSymbolUniqueId imageAtomicOrExt_IImageRect1_Int2_UInt1 =
+    static constexpr const TSymbolUniqueId imageAtomicOrExt_UImage1D1_Int1_UInt1 =
         TSymbolUniqueId(4495);
-    static constexpr const TSymbolUniqueId imageAtomicOrExt_UImageRect1_Int2_UInt1 =
+    static constexpr const TSymbolUniqueId imageAtomicOrExt_Image1DArray1_Int2_UInt1 =
         TSymbolUniqueId(4496);
-    static constexpr const TSymbolUniqueId imageAtomicOrExt_Image2DMS1_Int2_Int1_UInt1 =
+    static constexpr const TSymbolUniqueId imageAtomicOrExt_IImage1DArray1_Int2_UInt1 =
         TSymbolUniqueId(4497);
-    static constexpr const TSymbolUniqueId imageAtomicOrExt_IImage2DMS1_Int2_Int1_UInt1 =
+    static constexpr const TSymbolUniqueId imageAtomicOrExt_UImage1DArray1_Int2_UInt1 =
         TSymbolUniqueId(4498);
-    static constexpr const TSymbolUniqueId imageAtomicOrExt_UImage2DMS1_Int2_Int1_UInt1 =
+    static constexpr const TSymbolUniqueId imageAtomicOrExt_ImageRect1_Int2_UInt1 =
         TSymbolUniqueId(4499);
-    static constexpr const TSymbolUniqueId imageAtomicOrExt_Image2DMSArray1_Int3_Int1_UInt1 =
+    static constexpr const TSymbolUniqueId imageAtomicOrExt_IImageRect1_Int2_UInt1 =
         TSymbolUniqueId(4500);
-    static constexpr const TSymbolUniqueId imageAtomicOrExt_IImage2DMSArray1_Int3_Int1_UInt1 =
+    static constexpr const TSymbolUniqueId imageAtomicOrExt_UImageRect1_Int2_UInt1 =
         TSymbolUniqueId(4501);
-    static constexpr const TSymbolUniqueId imageAtomicOrExt_UImage2DMSArray1_Int3_Int1_UInt1 =
+    static constexpr const TSymbolUniqueId imageAtomicOrExt_Image2DMS1_Int2_Int1_UInt1 =
         TSymbolUniqueId(4502);
-    static constexpr const TSymbolUniqueId imageAtomicOrExt_Image2D1_Int2_Int1 =
+    static constexpr const TSymbolUniqueId imageAtomicOrExt_IImage2DMS1_Int2_Int1_UInt1 =
         TSymbolUniqueId(4503);
-    static constexpr const TSymbolUniqueId imageAtomicOrExt_IImage2D1_Int2_Int1 =
+    static constexpr const TSymbolUniqueId imageAtomicOrExt_UImage2DMS1_Int2_Int1_UInt1 =
         TSymbolUniqueId(4504);
-    static constexpr const TSymbolUniqueId imageAtomicOrExt_UImage2D1_Int2_Int1 =
+    static constexpr const TSymbolUniqueId imageAtomicOrExt_Image2DMSArray1_Int3_Int1_UInt1 =
         TSymbolUniqueId(4505);
-    static constexpr const TSymbolUniqueId imageAtomicOrExt_Image3D1_Int3_Int1 =
+    static constexpr const TSymbolUniqueId imageAtomicOrExt_IImage2DMSArray1_Int3_Int1_UInt1 =
         TSymbolUniqueId(4506);
-    static constexpr const TSymbolUniqueId imageAtomicOrExt_IImage3D1_Int3_Int1 =
+    static constexpr const TSymbolUniqueId imageAtomicOrExt_UImage2DMSArray1_Int3_Int1_UInt1 =
         TSymbolUniqueId(4507);
-    static constexpr const TSymbolUniqueId imageAtomicOrExt_UImage3D1_Int3_Int1 =
+    static constexpr const TSymbolUniqueId imageAtomicOrExt_Image2D1_Int2_Int1 =
         TSymbolUniqueId(4508);
-    static constexpr const TSymbolUniqueId imageAtomicOrExt_ImageCube1_Int3_Int1 =
+    static constexpr const TSymbolUniqueId imageAtomicOrExt_IImage2D1_Int2_Int1 =
         TSymbolUniqueId(4509);
-    static constexpr const TSymbolUniqueId imageAtomicOrExt_IImageCube1_Int3_Int1 =
+    static constexpr const TSymbolUniqueId imageAtomicOrExt_UImage2D1_Int2_Int1 =
         TSymbolUniqueId(4510);
-    static constexpr const TSymbolUniqueId imageAtomicOrExt_UImageCube1_Int3_Int1 =
+    static constexpr const TSymbolUniqueId imageAtomicOrExt_Image3D1_Int3_Int1 =
         TSymbolUniqueId(4511);
-    static constexpr const TSymbolUniqueId imageAtomicOrExt_ImageBuffer1_Int1_Int1 =
+    static constexpr const TSymbolUniqueId imageAtomicOrExt_IImage3D1_Int3_Int1 =
         TSymbolUniqueId(4512);
-    static constexpr const TSymbolUniqueId imageAtomicOrExt_IImageBuffer1_Int1_Int1 =
+    static constexpr const TSymbolUniqueId imageAtomicOrExt_UImage3D1_Int3_Int1 =
         TSymbolUniqueId(4513);
-    static constexpr const TSymbolUniqueId imageAtomicOrExt_UImageBuffer1_Int1_Int1 =
+    static constexpr const TSymbolUniqueId imageAtomicOrExt_ImageCube1_Int3_Int1 =
         TSymbolUniqueId(4514);
-    static constexpr const TSymbolUniqueId imageAtomicOrExt_Image2DArray1_Int3_Int1 =
+    static constexpr const TSymbolUniqueId imageAtomicOrExt_IImageCube1_Int3_Int1 =
         TSymbolUniqueId(4515);
-    static constexpr const TSymbolUniqueId imageAtomicOrExt_IImage2DArray1_Int3_Int1 =
+    static constexpr const TSymbolUniqueId imageAtomicOrExt_UImageCube1_Int3_Int1 =
         TSymbolUniqueId(4516);
-    static constexpr const TSymbolUniqueId imageAtomicOrExt_UImage2DArray1_Int3_Int1 =
+    static constexpr const TSymbolUniqueId imageAtomicOrExt_ImageBuffer1_Int1_Int1 =
         TSymbolUniqueId(4517);
-    static constexpr const TSymbolUniqueId imageAtomicOrExt_ImageCubeArray1_Int3_Int1 =
+    static constexpr const TSymbolUniqueId imageAtomicOrExt_IImageBuffer1_Int1_Int1 =
         TSymbolUniqueId(4518);
-    static constexpr const TSymbolUniqueId imageAtomicOrExt_IImageCubeArray1_Int3_Int1 =
+    static constexpr const TSymbolUniqueId imageAtomicOrExt_UImageBuffer1_Int1_Int1 =
         TSymbolUniqueId(4519);
-    static constexpr const TSymbolUniqueId imageAtomicOrExt_UImageCubeArray1_Int3_Int1 =
+    static constexpr const TSymbolUniqueId imageAtomicOrExt_Image2DArray1_Int3_Int1 =
         TSymbolUniqueId(4520);
-    static constexpr const TSymbolUniqueId imageAtomicOrExt_Image1D1_Int1_Int1 =
+    static constexpr const TSymbolUniqueId imageAtomicOrExt_IImage2DArray1_Int3_Int1 =
         TSymbolUniqueId(4521);
-    static constexpr const TSymbolUniqueId imageAtomicOrExt_IImage1D1_Int1_Int1 =
+    static constexpr const TSymbolUniqueId imageAtomicOrExt_UImage2DArray1_Int3_Int1 =
         TSymbolUniqueId(4522);
-    static constexpr const TSymbolUniqueId imageAtomicOrExt_UImage1D1_Int1_Int1 =
+    static constexpr const TSymbolUniqueId imageAtomicOrExt_ImageCubeArray1_Int3_Int1 =
         TSymbolUniqueId(4523);
-    static constexpr const TSymbolUniqueId imageAtomicOrExt_Image1DArray1_Int2_Int1 =
+    static constexpr const TSymbolUniqueId imageAtomicOrExt_IImageCubeArray1_Int3_Int1 =
         TSymbolUniqueId(4524);
-    static constexpr const TSymbolUniqueId imageAtomicOrExt_IImage1DArray1_Int2_Int1 =
+    static constexpr const TSymbolUniqueId imageAtomicOrExt_UImageCubeArray1_Int3_Int1 =
         TSymbolUniqueId(4525);
-    static constexpr const TSymbolUniqueId imageAtomicOrExt_UImage1DArray1_Int2_Int1 =
+    static constexpr const TSymbolUniqueId imageAtomicOrExt_Image1D1_Int1_Int1 =
         TSymbolUniqueId(4526);
-    static constexpr const TSymbolUniqueId imageAtomicOrExt_ImageRect1_Int2_Int1 =
+    static constexpr const TSymbolUniqueId imageAtomicOrExt_IImage1D1_Int1_Int1 =
         TSymbolUniqueId(4527);
-    static constexpr const TSymbolUniqueId imageAtomicOrExt_IImageRect1_Int2_Int1 =
+    static constexpr const TSymbolUniqueId imageAtomicOrExt_UImage1D1_Int1_Int1 =
         TSymbolUniqueId(4528);
-    static constexpr const TSymbolUniqueId imageAtomicOrExt_UImageRect1_Int2_Int1 =
+    static constexpr const TSymbolUniqueId imageAtomicOrExt_Image1DArray1_Int2_Int1 =
         TSymbolUniqueId(4529);
-    static constexpr const TSymbolUniqueId imageAtomicOrExt_Image2DMS1_Int2_Int1_Int1 =
+    static constexpr const TSymbolUniqueId imageAtomicOrExt_IImage1DArray1_Int2_Int1 =
         TSymbolUniqueId(4530);
-    static constexpr const TSymbolUniqueId imageAtomicOrExt_IImage2DMS1_Int2_Int1_Int1 =
+    static constexpr const TSymbolUniqueId imageAtomicOrExt_UImage1DArray1_Int2_Int1 =
         TSymbolUniqueId(4531);
-    static constexpr const TSymbolUniqueId imageAtomicOrExt_UImage2DMS1_Int2_Int1_Int1 =
+    static constexpr const TSymbolUniqueId imageAtomicOrExt_ImageRect1_Int2_Int1 =
         TSymbolUniqueId(4532);
-    static constexpr const TSymbolUniqueId imageAtomicOrExt_Image2DMSArray1_Int3_Int1_Int1 =
+    static constexpr const TSymbolUniqueId imageAtomicOrExt_IImageRect1_Int2_Int1 =
         TSymbolUniqueId(4533);
-    static constexpr const TSymbolUniqueId imageAtomicOrExt_IImage2DMSArray1_Int3_Int1_Int1 =
+    static constexpr const TSymbolUniqueId imageAtomicOrExt_UImageRect1_Int2_Int1 =
         TSymbolUniqueId(4534);
-    static constexpr const TSymbolUniqueId imageAtomicOrExt_UImage2DMSArray1_Int3_Int1_Int1 =
+    static constexpr const TSymbolUniqueId imageAtomicOrExt_Image2DMS1_Int2_Int1_Int1 =
         TSymbolUniqueId(4535);
-    static constexpr const TSymbolUniqueId imageAtomicXorExt_Image2D1_Int2_UInt1 =
+    static constexpr const TSymbolUniqueId imageAtomicOrExt_IImage2DMS1_Int2_Int1_Int1 =
         TSymbolUniqueId(4536);
-    static constexpr const TSymbolUniqueId imageAtomicXorExt_IImage2D1_Int2_UInt1 =
+    static constexpr const TSymbolUniqueId imageAtomicOrExt_UImage2DMS1_Int2_Int1_Int1 =
         TSymbolUniqueId(4537);
-    static constexpr const TSymbolUniqueId imageAtomicXorExt_UImage2D1_Int2_UInt1 =
+    static constexpr const TSymbolUniqueId imageAtomicOrExt_Image2DMSArray1_Int3_Int1_Int1 =
         TSymbolUniqueId(4538);
-    static constexpr const TSymbolUniqueId imageAtomicXorExt_Image3D1_Int3_UInt1 =
+    static constexpr const TSymbolUniqueId imageAtomicOrExt_IImage2DMSArray1_Int3_Int1_Int1 =
         TSymbolUniqueId(4539);
-    static constexpr const TSymbolUniqueId imageAtomicXorExt_IImage3D1_Int3_UInt1 =
+    static constexpr const TSymbolUniqueId imageAtomicOrExt_UImage2DMSArray1_Int3_Int1_Int1 =
         TSymbolUniqueId(4540);
-    static constexpr const TSymbolUniqueId imageAtomicXorExt_UImage3D1_Int3_UInt1 =
+    static constexpr const TSymbolUniqueId imageAtomicXorExt_Image2D1_Int2_UInt1 =
         TSymbolUniqueId(4541);
-    static constexpr const TSymbolUniqueId imageAtomicXorExt_ImageCube1_Int3_UInt1 =
+    static constexpr const TSymbolUniqueId imageAtomicXorExt_IImage2D1_Int2_UInt1 =
         TSymbolUniqueId(4542);
-    static constexpr const TSymbolUniqueId imageAtomicXorExt_IImageCube1_Int3_UInt1 =
+    static constexpr const TSymbolUniqueId imageAtomicXorExt_UImage2D1_Int2_UInt1 =
         TSymbolUniqueId(4543);
-    static constexpr const TSymbolUniqueId imageAtomicXorExt_UImageCube1_Int3_UInt1 =
+    static constexpr const TSymbolUniqueId imageAtomicXorExt_Image3D1_Int3_UInt1 =
         TSymbolUniqueId(4544);
-    static constexpr const TSymbolUniqueId imageAtomicXorExt_ImageBuffer1_Int1_UInt1 =
+    static constexpr const TSymbolUniqueId imageAtomicXorExt_IImage3D1_Int3_UInt1 =
         TSymbolUniqueId(4545);
-    static constexpr const TSymbolUniqueId imageAtomicXorExt_IImageBuffer1_Int1_UInt1 =
+    static constexpr const TSymbolUniqueId imageAtomicXorExt_UImage3D1_Int3_UInt1 =
         TSymbolUniqueId(4546);
-    static constexpr const TSymbolUniqueId imageAtomicXorExt_UImageBuffer1_Int1_UInt1 =
+    static constexpr const TSymbolUniqueId imageAtomicXorExt_ImageCube1_Int3_UInt1 =
         TSymbolUniqueId(4547);
-    static constexpr const TSymbolUniqueId imageAtomicXorExt_Image2DArray1_Int3_UInt1 =
+    static constexpr const TSymbolUniqueId imageAtomicXorExt_IImageCube1_Int3_UInt1 =
         TSymbolUniqueId(4548);
-    static constexpr const TSymbolUniqueId imageAtomicXorExt_IImage2DArray1_Int3_UInt1 =
+    static constexpr const TSymbolUniqueId imageAtomicXorExt_UImageCube1_Int3_UInt1 =
         TSymbolUniqueId(4549);
-    static constexpr const TSymbolUniqueId imageAtomicXorExt_UImage2DArray1_Int3_UInt1 =
+    static constexpr const TSymbolUniqueId imageAtomicXorExt_ImageBuffer1_Int1_UInt1 =
         TSymbolUniqueId(4550);
-    static constexpr const TSymbolUniqueId imageAtomicXorExt_ImageCubeArray1_Int3_UInt1 =
+    static constexpr const TSymbolUniqueId imageAtomicXorExt_IImageBuffer1_Int1_UInt1 =
         TSymbolUniqueId(4551);
-    static constexpr const TSymbolUniqueId imageAtomicXorExt_IImageCubeArray1_Int3_UInt1 =
+    static constexpr const TSymbolUniqueId imageAtomicXorExt_UImageBuffer1_Int1_UInt1 =
         TSymbolUniqueId(4552);
-    static constexpr const TSymbolUniqueId imageAtomicXorExt_UImageCubeArray1_Int3_UInt1 =
+    static constexpr const TSymbolUniqueId imageAtomicXorExt_Image2DArray1_Int3_UInt1 =
         TSymbolUniqueId(4553);
-    static constexpr const TSymbolUniqueId imageAtomicXorExt_Image1D1_Int1_UInt1 =
+    static constexpr const TSymbolUniqueId imageAtomicXorExt_IImage2DArray1_Int3_UInt1 =
         TSymbolUniqueId(4554);
-    static constexpr const TSymbolUniqueId imageAtomicXorExt_IImage1D1_Int1_UInt1 =
+    static constexpr const TSymbolUniqueId imageAtomicXorExt_UImage2DArray1_Int3_UInt1 =
         TSymbolUniqueId(4555);
-    static constexpr const TSymbolUniqueId imageAtomicXorExt_UImage1D1_Int1_UInt1 =
+    static constexpr const TSymbolUniqueId imageAtomicXorExt_ImageCubeArray1_Int3_UInt1 =
         TSymbolUniqueId(4556);
-    static constexpr const TSymbolUniqueId imageAtomicXorExt_Image1DArray1_Int2_UInt1 =
+    static constexpr const TSymbolUniqueId imageAtomicXorExt_IImageCubeArray1_Int3_UInt1 =
         TSymbolUniqueId(4557);
-    static constexpr const TSymbolUniqueId imageAtomicXorExt_IImage1DArray1_Int2_UInt1 =
+    static constexpr const TSymbolUniqueId imageAtomicXorExt_UImageCubeArray1_Int3_UInt1 =
         TSymbolUniqueId(4558);
-    static constexpr const TSymbolUniqueId imageAtomicXorExt_UImage1DArray1_Int2_UInt1 =
+    static constexpr const TSymbolUniqueId imageAtomicXorExt_Image1D1_Int1_UInt1 =
         TSymbolUniqueId(4559);
-    static constexpr const TSymbolUniqueId imageAtomicXorExt_ImageRect1_Int2_UInt1 =
+    static constexpr const TSymbolUniqueId imageAtomicXorExt_IImage1D1_Int1_UInt1 =
         TSymbolUniqueId(4560);
-    static constexpr const TSymbolUniqueId imageAtomicXorExt_IImageRect1_Int2_UInt1 =
+    static constexpr const TSymbolUniqueId imageAtomicXorExt_UImage1D1_Int1_UInt1 =
         TSymbolUniqueId(4561);
-    static constexpr const TSymbolUniqueId imageAtomicXorExt_UImageRect1_Int2_UInt1 =
+    static constexpr const TSymbolUniqueId imageAtomicXorExt_Image1DArray1_Int2_UInt1 =
         TSymbolUniqueId(4562);
-    static constexpr const TSymbolUniqueId imageAtomicXorExt_Image2DMS1_Int2_Int1_UInt1 =
+    static constexpr const TSymbolUniqueId imageAtomicXorExt_IImage1DArray1_Int2_UInt1 =
         TSymbolUniqueId(4563);
-    static constexpr const TSymbolUniqueId imageAtomicXorExt_IImage2DMS1_Int2_Int1_UInt1 =
+    static constexpr const TSymbolUniqueId imageAtomicXorExt_UImage1DArray1_Int2_UInt1 =
         TSymbolUniqueId(4564);
-    static constexpr const TSymbolUniqueId imageAtomicXorExt_UImage2DMS1_Int2_Int1_UInt1 =
+    static constexpr const TSymbolUniqueId imageAtomicXorExt_ImageRect1_Int2_UInt1 =
         TSymbolUniqueId(4565);
-    static constexpr const TSymbolUniqueId imageAtomicXorExt_Image2DMSArray1_Int3_Int1_UInt1 =
+    static constexpr const TSymbolUniqueId imageAtomicXorExt_IImageRect1_Int2_UInt1 =
         TSymbolUniqueId(4566);
-    static constexpr const TSymbolUniqueId imageAtomicXorExt_IImage2DMSArray1_Int3_Int1_UInt1 =
+    static constexpr const TSymbolUniqueId imageAtomicXorExt_UImageRect1_Int2_UInt1 =
         TSymbolUniqueId(4567);
-    static constexpr const TSymbolUniqueId imageAtomicXorExt_UImage2DMSArray1_Int3_Int1_UInt1 =
+    static constexpr const TSymbolUniqueId imageAtomicXorExt_Image2DMS1_Int2_Int1_UInt1 =
         TSymbolUniqueId(4568);
-    static constexpr const TSymbolUniqueId imageAtomicXorExt_Image2D1_Int2_Int1 =
+    static constexpr const TSymbolUniqueId imageAtomicXorExt_IImage2DMS1_Int2_Int1_UInt1 =
         TSymbolUniqueId(4569);
-    static constexpr const TSymbolUniqueId imageAtomicXorExt_IImage2D1_Int2_Int1 =
+    static constexpr const TSymbolUniqueId imageAtomicXorExt_UImage2DMS1_Int2_Int1_UInt1 =
         TSymbolUniqueId(4570);
-    static constexpr const TSymbolUniqueId imageAtomicXorExt_UImage2D1_Int2_Int1 =
+    static constexpr const TSymbolUniqueId imageAtomicXorExt_Image2DMSArray1_Int3_Int1_UInt1 =
         TSymbolUniqueId(4571);
-    static constexpr const TSymbolUniqueId imageAtomicXorExt_Image3D1_Int3_Int1 =
+    static constexpr const TSymbolUniqueId imageAtomicXorExt_IImage2DMSArray1_Int3_Int1_UInt1 =
         TSymbolUniqueId(4572);
-    static constexpr const TSymbolUniqueId imageAtomicXorExt_IImage3D1_Int3_Int1 =
+    static constexpr const TSymbolUniqueId imageAtomicXorExt_UImage2DMSArray1_Int3_Int1_UInt1 =
         TSymbolUniqueId(4573);
-    static constexpr const TSymbolUniqueId imageAtomicXorExt_UImage3D1_Int3_Int1 =
+    static constexpr const TSymbolUniqueId imageAtomicXorExt_Image2D1_Int2_Int1 =
         TSymbolUniqueId(4574);
-    static constexpr const TSymbolUniqueId imageAtomicXorExt_ImageCube1_Int3_Int1 =
+    static constexpr const TSymbolUniqueId imageAtomicXorExt_IImage2D1_Int2_Int1 =
         TSymbolUniqueId(4575);
-    static constexpr const TSymbolUniqueId imageAtomicXorExt_IImageCube1_Int3_Int1 =
+    static constexpr const TSymbolUniqueId imageAtomicXorExt_UImage2D1_Int2_Int1 =
         TSymbolUniqueId(4576);
-    static constexpr const TSymbolUniqueId imageAtomicXorExt_UImageCube1_Int3_Int1 =
+    static constexpr const TSymbolUniqueId imageAtomicXorExt_Image3D1_Int3_Int1 =
         TSymbolUniqueId(4577);
-    static constexpr const TSymbolUniqueId imageAtomicXorExt_ImageBuffer1_Int1_Int1 =
+    static constexpr const TSymbolUniqueId imageAtomicXorExt_IImage3D1_Int3_Int1 =
         TSymbolUniqueId(4578);
-    static constexpr const TSymbolUniqueId imageAtomicXorExt_IImageBuffer1_Int1_Int1 =
+    static constexpr const TSymbolUniqueId imageAtomicXorExt_UImage3D1_Int3_Int1 =
         TSymbolUniqueId(4579);
-    static constexpr const TSymbolUniqueId imageAtomicXorExt_UImageBuffer1_Int1_Int1 =
+    static constexpr const TSymbolUniqueId imageAtomicXorExt_ImageCube1_Int3_Int1 =
         TSymbolUniqueId(4580);
-    static constexpr const TSymbolUniqueId imageAtomicXorExt_Image2DArray1_Int3_Int1 =
+    static constexpr const TSymbolUniqueId imageAtomicXorExt_IImageCube1_Int3_Int1 =
         TSymbolUniqueId(4581);
-    static constexpr const TSymbolUniqueId imageAtomicXorExt_IImage2DArray1_Int3_Int1 =
+    static constexpr const TSymbolUniqueId imageAtomicXorExt_UImageCube1_Int3_Int1 =
         TSymbolUniqueId(4582);
-    static constexpr const TSymbolUniqueId imageAtomicXorExt_UImage2DArray1_Int3_Int1 =
+    static constexpr const TSymbolUniqueId imageAtomicXorExt_ImageBuffer1_Int1_Int1 =
         TSymbolUniqueId(4583);
-    static constexpr const TSymbolUniqueId imageAtomicXorExt_ImageCubeArray1_Int3_Int1 =
+    static constexpr const TSymbolUniqueId imageAtomicXorExt_IImageBuffer1_Int1_Int1 =
         TSymbolUniqueId(4584);
-    static constexpr const TSymbolUniqueId imageAtomicXorExt_IImageCubeArray1_Int3_Int1 =
+    static constexpr const TSymbolUniqueId imageAtomicXorExt_UImageBuffer1_Int1_Int1 =
         TSymbolUniqueId(4585);
-    static constexpr const TSymbolUniqueId imageAtomicXorExt_UImageCubeArray1_Int3_Int1 =
+    static constexpr const TSymbolUniqueId imageAtomicXorExt_Image2DArray1_Int3_Int1 =
         TSymbolUniqueId(4586);
-    static constexpr const TSymbolUniqueId imageAtomicXorExt_Image1D1_Int1_Int1 =
+    static constexpr const TSymbolUniqueId imageAtomicXorExt_IImage2DArray1_Int3_Int1 =
         TSymbolUniqueId(4587);
-    static constexpr const TSymbolUniqueId imageAtomicXorExt_IImage1D1_Int1_Int1 =
+    static constexpr const TSymbolUniqueId imageAtomicXorExt_UImage2DArray1_Int3_Int1 =
         TSymbolUniqueId(4588);
-    static constexpr const TSymbolUniqueId imageAtomicXorExt_UImage1D1_Int1_Int1 =
+    static constexpr const TSymbolUniqueId imageAtomicXorExt_ImageCubeArray1_Int3_Int1 =
         TSymbolUniqueId(4589);
-    static constexpr const TSymbolUniqueId imageAtomicXorExt_Image1DArray1_Int2_Int1 =
+    static constexpr const TSymbolUniqueId imageAtomicXorExt_IImageCubeArray1_Int3_Int1 =
         TSymbolUniqueId(4590);
-    static constexpr const TSymbolUniqueId imageAtomicXorExt_IImage1DArray1_Int2_Int1 =
+    static constexpr const TSymbolUniqueId imageAtomicXorExt_UImageCubeArray1_Int3_Int1 =
         TSymbolUniqueId(4591);
-    static constexpr const TSymbolUniqueId imageAtomicXorExt_UImage1DArray1_Int2_Int1 =
+    static constexpr const TSymbolUniqueId imageAtomicXorExt_Image1D1_Int1_Int1 =
         TSymbolUniqueId(4592);
-    static constexpr const TSymbolUniqueId imageAtomicXorExt_ImageRect1_Int2_Int1 =
+    static constexpr const TSymbolUniqueId imageAtomicXorExt_IImage1D1_Int1_Int1 =
         TSymbolUniqueId(4593);
-    static constexpr const TSymbolUniqueId imageAtomicXorExt_IImageRect1_Int2_Int1 =
+    static constexpr const TSymbolUniqueId imageAtomicXorExt_UImage1D1_Int1_Int1 =
         TSymbolUniqueId(4594);
-    static constexpr const TSymbolUniqueId imageAtomicXorExt_UImageRect1_Int2_Int1 =
+    static constexpr const TSymbolUniqueId imageAtomicXorExt_Image1DArray1_Int2_Int1 =
         TSymbolUniqueId(4595);
-    static constexpr const TSymbolUniqueId imageAtomicXorExt_Image2DMS1_Int2_Int1_Int1 =
+    static constexpr const TSymbolUniqueId imageAtomicXorExt_IImage1DArray1_Int2_Int1 =
         TSymbolUniqueId(4596);
-    static constexpr const TSymbolUniqueId imageAtomicXorExt_IImage2DMS1_Int2_Int1_Int1 =
+    static constexpr const TSymbolUniqueId imageAtomicXorExt_UImage1DArray1_Int2_Int1 =
         TSymbolUniqueId(4597);
-    static constexpr const TSymbolUniqueId imageAtomicXorExt_UImage2DMS1_Int2_Int1_Int1 =
+    static constexpr const TSymbolUniqueId imageAtomicXorExt_ImageRect1_Int2_Int1 =
         TSymbolUniqueId(4598);
-    static constexpr const TSymbolUniqueId imageAtomicXorExt_Image2DMSArray1_Int3_Int1_Int1 =
+    static constexpr const TSymbolUniqueId imageAtomicXorExt_IImageRect1_Int2_Int1 =
         TSymbolUniqueId(4599);
-    static constexpr const TSymbolUniqueId imageAtomicXorExt_IImage2DMSArray1_Int3_Int1_Int1 =
+    static constexpr const TSymbolUniqueId imageAtomicXorExt_UImageRect1_Int2_Int1 =
         TSymbolUniqueId(4600);
-    static constexpr const TSymbolUniqueId imageAtomicXorExt_UImage2DMSArray1_Int3_Int1_Int1 =
+    static constexpr const TSymbolUniqueId imageAtomicXorExt_Image2DMS1_Int2_Int1_Int1 =
         TSymbolUniqueId(4601);
-    static constexpr const TSymbolUniqueId imageAtomicExchangeExt_Image2D1_Int2_UInt1 =
+    static constexpr const TSymbolUniqueId imageAtomicXorExt_IImage2DMS1_Int2_Int1_Int1 =
         TSymbolUniqueId(4602);
-    static constexpr const TSymbolUniqueId imageAtomicExchangeExt_IImage2D1_Int2_UInt1 =
+    static constexpr const TSymbolUniqueId imageAtomicXorExt_UImage2DMS1_Int2_Int1_Int1 =
         TSymbolUniqueId(4603);
-    static constexpr const TSymbolUniqueId imageAtomicExchangeExt_UImage2D1_Int2_UInt1 =
+    static constexpr const TSymbolUniqueId imageAtomicXorExt_Image2DMSArray1_Int3_Int1_Int1 =
         TSymbolUniqueId(4604);
-    static constexpr const TSymbolUniqueId imageAtomicExchangeExt_Image3D1_Int3_UInt1 =
+    static constexpr const TSymbolUniqueId imageAtomicXorExt_IImage2DMSArray1_Int3_Int1_Int1 =
         TSymbolUniqueId(4605);
-    static constexpr const TSymbolUniqueId imageAtomicExchangeExt_IImage3D1_Int3_UInt1 =
+    static constexpr const TSymbolUniqueId imageAtomicXorExt_UImage2DMSArray1_Int3_Int1_Int1 =
         TSymbolUniqueId(4606);
-    static constexpr const TSymbolUniqueId imageAtomicExchangeExt_UImage3D1_Int3_UInt1 =
+    static constexpr const TSymbolUniqueId imageAtomicExchangeExt_Image2D1_Int2_UInt1 =
         TSymbolUniqueId(4607);
-    static constexpr const TSymbolUniqueId imageAtomicExchangeExt_ImageCube1_Int3_UInt1 =
+    static constexpr const TSymbolUniqueId imageAtomicExchangeExt_IImage2D1_Int2_UInt1 =
         TSymbolUniqueId(4608);
-    static constexpr const TSymbolUniqueId imageAtomicExchangeExt_IImageCube1_Int3_UInt1 =
+    static constexpr const TSymbolUniqueId imageAtomicExchangeExt_UImage2D1_Int2_UInt1 =
         TSymbolUniqueId(4609);
-    static constexpr const TSymbolUniqueId imageAtomicExchangeExt_UImageCube1_Int3_UInt1 =
+    static constexpr const TSymbolUniqueId imageAtomicExchangeExt_Image3D1_Int3_UInt1 =
         TSymbolUniqueId(4610);
-    static constexpr const TSymbolUniqueId imageAtomicExchangeExt_ImageBuffer1_Int1_UInt1 =
+    static constexpr const TSymbolUniqueId imageAtomicExchangeExt_IImage3D1_Int3_UInt1 =
         TSymbolUniqueId(4611);
-    static constexpr const TSymbolUniqueId imageAtomicExchangeExt_IImageBuffer1_Int1_UInt1 =
+    static constexpr const TSymbolUniqueId imageAtomicExchangeExt_UImage3D1_Int3_UInt1 =
         TSymbolUniqueId(4612);
-    static constexpr const TSymbolUniqueId imageAtomicExchangeExt_UImageBuffer1_Int1_UInt1 =
+    static constexpr const TSymbolUniqueId imageAtomicExchangeExt_ImageCube1_Int3_UInt1 =
         TSymbolUniqueId(4613);
-    static constexpr const TSymbolUniqueId imageAtomicExchangeExt_Image2DArray1_Int3_UInt1 =
+    static constexpr const TSymbolUniqueId imageAtomicExchangeExt_IImageCube1_Int3_UInt1 =
         TSymbolUniqueId(4614);
-    static constexpr const TSymbolUniqueId imageAtomicExchangeExt_IImage2DArray1_Int3_UInt1 =
+    static constexpr const TSymbolUniqueId imageAtomicExchangeExt_UImageCube1_Int3_UInt1 =
         TSymbolUniqueId(4615);
-    static constexpr const TSymbolUniqueId imageAtomicExchangeExt_UImage2DArray1_Int3_UInt1 =
+    static constexpr const TSymbolUniqueId imageAtomicExchangeExt_ImageBuffer1_Int1_UInt1 =
         TSymbolUniqueId(4616);
-    static constexpr const TSymbolUniqueId imageAtomicExchangeExt_ImageCubeArray1_Int3_UInt1 =
+    static constexpr const TSymbolUniqueId imageAtomicExchangeExt_IImageBuffer1_Int1_UInt1 =
         TSymbolUniqueId(4617);
-    static constexpr const TSymbolUniqueId imageAtomicExchangeExt_IImageCubeArray1_Int3_UInt1 =
+    static constexpr const TSymbolUniqueId imageAtomicExchangeExt_UImageBuffer1_Int1_UInt1 =
         TSymbolUniqueId(4618);
-    static constexpr const TSymbolUniqueId imageAtomicExchangeExt_UImageCubeArray1_Int3_UInt1 =
+    static constexpr const TSymbolUniqueId imageAtomicExchangeExt_Image2DArray1_Int3_UInt1 =
         TSymbolUniqueId(4619);
-    static constexpr const TSymbolUniqueId imageAtomicExchangeExt_Image1D1_Int1_UInt1 =
+    static constexpr const TSymbolUniqueId imageAtomicExchangeExt_IImage2DArray1_Int3_UInt1 =
         TSymbolUniqueId(4620);
-    static constexpr const TSymbolUniqueId imageAtomicExchangeExt_IImage1D1_Int1_UInt1 =
+    static constexpr const TSymbolUniqueId imageAtomicExchangeExt_UImage2DArray1_Int3_UInt1 =
         TSymbolUniqueId(4621);
-    static constexpr const TSymbolUniqueId imageAtomicExchangeExt_UImage1D1_Int1_UInt1 =
+    static constexpr const TSymbolUniqueId imageAtomicExchangeExt_ImageCubeArray1_Int3_UInt1 =
         TSymbolUniqueId(4622);
-    static constexpr const TSymbolUniqueId imageAtomicExchangeExt_Image1DArray1_Int2_UInt1 =
+    static constexpr const TSymbolUniqueId imageAtomicExchangeExt_IImageCubeArray1_Int3_UInt1 =
         TSymbolUniqueId(4623);
-    static constexpr const TSymbolUniqueId imageAtomicExchangeExt_IImage1DArray1_Int2_UInt1 =
+    static constexpr const TSymbolUniqueId imageAtomicExchangeExt_UImageCubeArray1_Int3_UInt1 =
         TSymbolUniqueId(4624);
-    static constexpr const TSymbolUniqueId imageAtomicExchangeExt_UImage1DArray1_Int2_UInt1 =
+    static constexpr const TSymbolUniqueId imageAtomicExchangeExt_Image1D1_Int1_UInt1 =
         TSymbolUniqueId(4625);
-    static constexpr const TSymbolUniqueId imageAtomicExchangeExt_ImageRect1_Int2_UInt1 =
+    static constexpr const TSymbolUniqueId imageAtomicExchangeExt_IImage1D1_Int1_UInt1 =
         TSymbolUniqueId(4626);
-    static constexpr const TSymbolUniqueId imageAtomicExchangeExt_IImageRect1_Int2_UInt1 =
+    static constexpr const TSymbolUniqueId imageAtomicExchangeExt_UImage1D1_Int1_UInt1 =
         TSymbolUniqueId(4627);
-    static constexpr const TSymbolUniqueId imageAtomicExchangeExt_UImageRect1_Int2_UInt1 =
+    static constexpr const TSymbolUniqueId imageAtomicExchangeExt_Image1DArray1_Int2_UInt1 =
         TSymbolUniqueId(4628);
-    static constexpr const TSymbolUniqueId imageAtomicExchangeExt_Image2DMS1_Int2_Int1_UInt1 =
+    static constexpr const TSymbolUniqueId imageAtomicExchangeExt_IImage1DArray1_Int2_UInt1 =
         TSymbolUniqueId(4629);
-    static constexpr const TSymbolUniqueId imageAtomicExchangeExt_IImage2DMS1_Int2_Int1_UInt1 =
+    static constexpr const TSymbolUniqueId imageAtomicExchangeExt_UImage1DArray1_Int2_UInt1 =
         TSymbolUniqueId(4630);
-    static constexpr const TSymbolUniqueId imageAtomicExchangeExt_UImage2DMS1_Int2_Int1_UInt1 =
+    static constexpr const TSymbolUniqueId imageAtomicExchangeExt_ImageRect1_Int2_UInt1 =
         TSymbolUniqueId(4631);
-    static constexpr const TSymbolUniqueId imageAtomicExchangeExt_Image2DMSArray1_Int3_Int1_UInt1 =
+    static constexpr const TSymbolUniqueId imageAtomicExchangeExt_IImageRect1_Int2_UInt1 =
         TSymbolUniqueId(4632);
-    static constexpr const TSymbolUniqueId imageAtomicExchangeExt_IImage2DMSArray1_Int3_Int1_UInt1 =
+    static constexpr const TSymbolUniqueId imageAtomicExchangeExt_UImageRect1_Int2_UInt1 =
         TSymbolUniqueId(4633);
-    static constexpr const TSymbolUniqueId imageAtomicExchangeExt_UImage2DMSArray1_Int3_Int1_UInt1 =
+    static constexpr const TSymbolUniqueId imageAtomicExchangeExt_Image2DMS1_Int2_Int1_UInt1 =
         TSymbolUniqueId(4634);
-    static constexpr const TSymbolUniqueId imageAtomicExchangeExt_Image2D1_Int2_Int1 =
+    static constexpr const TSymbolUniqueId imageAtomicExchangeExt_IImage2DMS1_Int2_Int1_UInt1 =
         TSymbolUniqueId(4635);
-    static constexpr const TSymbolUniqueId imageAtomicExchangeExt_IImage2D1_Int2_Int1 =
+    static constexpr const TSymbolUniqueId imageAtomicExchangeExt_UImage2DMS1_Int2_Int1_UInt1 =
         TSymbolUniqueId(4636);
-    static constexpr const TSymbolUniqueId imageAtomicExchangeExt_UImage2D1_Int2_Int1 =
+    static constexpr const TSymbolUniqueId imageAtomicExchangeExt_Image2DMSArray1_Int3_Int1_UInt1 =
         TSymbolUniqueId(4637);
-    static constexpr const TSymbolUniqueId imageAtomicExchangeExt_Image3D1_Int3_Int1 =
+    static constexpr const TSymbolUniqueId imageAtomicExchangeExt_IImage2DMSArray1_Int3_Int1_UInt1 =
         TSymbolUniqueId(4638);
-    static constexpr const TSymbolUniqueId imageAtomicExchangeExt_IImage3D1_Int3_Int1 =
+    static constexpr const TSymbolUniqueId imageAtomicExchangeExt_UImage2DMSArray1_Int3_Int1_UInt1 =
         TSymbolUniqueId(4639);
-    static constexpr const TSymbolUniqueId imageAtomicExchangeExt_UImage3D1_Int3_Int1 =
+    static constexpr const TSymbolUniqueId imageAtomicExchangeExt_Image2D1_Int2_Int1 =
         TSymbolUniqueId(4640);
-    static constexpr const TSymbolUniqueId imageAtomicExchangeExt_ImageCube1_Int3_Int1 =
+    static constexpr const TSymbolUniqueId imageAtomicExchangeExt_IImage2D1_Int2_Int1 =
         TSymbolUniqueId(4641);
-    static constexpr const TSymbolUniqueId imageAtomicExchangeExt_IImageCube1_Int3_Int1 =
+    static constexpr const TSymbolUniqueId imageAtomicExchangeExt_UImage2D1_Int2_Int1 =
         TSymbolUniqueId(4642);
-    static constexpr const TSymbolUniqueId imageAtomicExchangeExt_UImageCube1_Int3_Int1 =
+    static constexpr const TSymbolUniqueId imageAtomicExchangeExt_Image3D1_Int3_Int1 =
         TSymbolUniqueId(4643);
-    static constexpr const TSymbolUniqueId imageAtomicExchangeExt_ImageBuffer1_Int1_Int1 =
+    static constexpr const TSymbolUniqueId imageAtomicExchangeExt_IImage3D1_Int3_Int1 =
         TSymbolUniqueId(4644);
-    static constexpr const TSymbolUniqueId imageAtomicExchangeExt_IImageBuffer1_Int1_Int1 =
+    static constexpr const TSymbolUniqueId imageAtomicExchangeExt_UImage3D1_Int3_Int1 =
         TSymbolUniqueId(4645);
-    static constexpr const TSymbolUniqueId imageAtomicExchangeExt_UImageBuffer1_Int1_Int1 =
+    static constexpr const TSymbolUniqueId imageAtomicExchangeExt_ImageCube1_Int3_Int1 =
         TSymbolUniqueId(4646);
-    static constexpr const TSymbolUniqueId imageAtomicExchangeExt_Image2DArray1_Int3_Int1 =
+    static constexpr const TSymbolUniqueId imageAtomicExchangeExt_IImageCube1_Int3_Int1 =
         TSymbolUniqueId(4647);
-    static constexpr const TSymbolUniqueId imageAtomicExchangeExt_IImage2DArray1_Int3_Int1 =
+    static constexpr const TSymbolUniqueId imageAtomicExchangeExt_UImageCube1_Int3_Int1 =
         TSymbolUniqueId(4648);
-    static constexpr const TSymbolUniqueId imageAtomicExchangeExt_UImage2DArray1_Int3_Int1 =
+    static constexpr const TSymbolUniqueId imageAtomicExchangeExt_ImageBuffer1_Int1_Int1 =
         TSymbolUniqueId(4649);
-    static constexpr const TSymbolUniqueId imageAtomicExchangeExt_ImageCubeArray1_Int3_Int1 =
+    static constexpr const TSymbolUniqueId imageAtomicExchangeExt_IImageBuffer1_Int1_Int1 =
         TSymbolUniqueId(4650);
-    static constexpr const TSymbolUniqueId imageAtomicExchangeExt_IImageCubeArray1_Int3_Int1 =
+    static constexpr const TSymbolUniqueId imageAtomicExchangeExt_UImageBuffer1_Int1_Int1 =
         TSymbolUniqueId(4651);
-    static constexpr const TSymbolUniqueId imageAtomicExchangeExt_UImageCubeArray1_Int3_Int1 =
+    static constexpr const TSymbolUniqueId imageAtomicExchangeExt_Image2DArray1_Int3_Int1 =
         TSymbolUniqueId(4652);
-    static constexpr const TSymbolUniqueId imageAtomicExchangeExt_Image1D1_Int1_Int1 =
+    static constexpr const TSymbolUniqueId imageAtomicExchangeExt_IImage2DArray1_Int3_Int1 =
         TSymbolUniqueId(4653);
-    static constexpr const TSymbolUniqueId imageAtomicExchangeExt_IImage1D1_Int1_Int1 =
+    static constexpr const TSymbolUniqueId imageAtomicExchangeExt_UImage2DArray1_Int3_Int1 =
         TSymbolUniqueId(4654);
-    static constexpr const TSymbolUniqueId imageAtomicExchangeExt_UImage1D1_Int1_Int1 =
+    static constexpr const TSymbolUniqueId imageAtomicExchangeExt_ImageCubeArray1_Int3_Int1 =
         TSymbolUniqueId(4655);
-    static constexpr const TSymbolUniqueId imageAtomicExchangeExt_Image1DArray1_Int2_Int1 =
+    static constexpr const TSymbolUniqueId imageAtomicExchangeExt_IImageCubeArray1_Int3_Int1 =
         TSymbolUniqueId(4656);
-    static constexpr const TSymbolUniqueId imageAtomicExchangeExt_IImage1DArray1_Int2_Int1 =
+    static constexpr const TSymbolUniqueId imageAtomicExchangeExt_UImageCubeArray1_Int3_Int1 =
         TSymbolUniqueId(4657);
-    static constexpr const TSymbolUniqueId imageAtomicExchangeExt_UImage1DArray1_Int2_Int1 =
+    static constexpr const TSymbolUniqueId imageAtomicExchangeExt_Image1D1_Int1_Int1 =
         TSymbolUniqueId(4658);
-    static constexpr const TSymbolUniqueId imageAtomicExchangeExt_ImageRect1_Int2_Int1 =
+    static constexpr const TSymbolUniqueId imageAtomicExchangeExt_IImage1D1_Int1_Int1 =
         TSymbolUniqueId(4659);
-    static constexpr const TSymbolUniqueId imageAtomicExchangeExt_IImageRect1_Int2_Int1 =
+    static constexpr const TSymbolUniqueId imageAtomicExchangeExt_UImage1D1_Int1_Int1 =
         TSymbolUniqueId(4660);
-    static constexpr const TSymbolUniqueId imageAtomicExchangeExt_UImageRect1_Int2_Int1 =
+    static constexpr const TSymbolUniqueId imageAtomicExchangeExt_Image1DArray1_Int2_Int1 =
         TSymbolUniqueId(4661);
-    static constexpr const TSymbolUniqueId imageAtomicExchangeExt_Image2DMS1_Int2_Int1_Int1 =
+    static constexpr const TSymbolUniqueId imageAtomicExchangeExt_IImage1DArray1_Int2_Int1 =
         TSymbolUniqueId(4662);
-    static constexpr const TSymbolUniqueId imageAtomicExchangeExt_IImage2DMS1_Int2_Int1_Int1 =
+    static constexpr const TSymbolUniqueId imageAtomicExchangeExt_UImage1DArray1_Int2_Int1 =
         TSymbolUniqueId(4663);
-    static constexpr const TSymbolUniqueId imageAtomicExchangeExt_UImage2DMS1_Int2_Int1_Int1 =
+    static constexpr const TSymbolUniqueId imageAtomicExchangeExt_ImageRect1_Int2_Int1 =
         TSymbolUniqueId(4664);
-    static constexpr const TSymbolUniqueId imageAtomicExchangeExt_Image2DMSArray1_Int3_Int1_Int1 =
+    static constexpr const TSymbolUniqueId imageAtomicExchangeExt_IImageRect1_Int2_Int1 =
         TSymbolUniqueId(4665);
-    static constexpr const TSymbolUniqueId imageAtomicExchangeExt_IImage2DMSArray1_Int3_Int1_Int1 =
+    static constexpr const TSymbolUniqueId imageAtomicExchangeExt_UImageRect1_Int2_Int1 =
         TSymbolUniqueId(4666);
-    static constexpr const TSymbolUniqueId imageAtomicExchangeExt_UImage2DMSArray1_Int3_Int1_Int1 =
+    static constexpr const TSymbolUniqueId imageAtomicExchangeExt_Image2DMS1_Int2_Int1_Int1 =
         TSymbolUniqueId(4667);
-    static constexpr const TSymbolUniqueId imageAtomicExchangeExt_Image2D1_Int2_Float1 =
+    static constexpr const TSymbolUniqueId imageAtomicExchangeExt_IImage2DMS1_Int2_Int1_Int1 =
         TSymbolUniqueId(4668);
-    static constexpr const TSymbolUniqueId imageAtomicExchangeExt_IImage2D1_Int2_Float1 =
+    static constexpr const TSymbolUniqueId imageAtomicExchangeExt_UImage2DMS1_Int2_Int1_Int1 =
         TSymbolUniqueId(4669);
-    static constexpr const TSymbolUniqueId imageAtomicExchangeExt_UImage2D1_Int2_Float1 =
+    static constexpr const TSymbolUniqueId imageAtomicExchangeExt_Image2DMSArray1_Int3_Int1_Int1 =
         TSymbolUniqueId(4670);
-    static constexpr const TSymbolUniqueId imageAtomicExchangeExt_Image3D1_Int3_Float1 =
+    static constexpr const TSymbolUniqueId imageAtomicExchangeExt_IImage2DMSArray1_Int3_Int1_Int1 =
         TSymbolUniqueId(4671);
-    static constexpr const TSymbolUniqueId imageAtomicExchangeExt_IImage3D1_Int3_Float1 =
+    static constexpr const TSymbolUniqueId imageAtomicExchangeExt_UImage2DMSArray1_Int3_Int1_Int1 =
         TSymbolUniqueId(4672);
-    static constexpr const TSymbolUniqueId imageAtomicExchangeExt_UImage3D1_Int3_Float1 =
+    static constexpr const TSymbolUniqueId imageAtomicExchangeExt_Image2D1_Int2_Float1 =
         TSymbolUniqueId(4673);
-    static constexpr const TSymbolUniqueId imageAtomicExchangeExt_ImageCube1_Int3_Float1 =
+    static constexpr const TSymbolUniqueId imageAtomicExchangeExt_IImage2D1_Int2_Float1 =
         TSymbolUniqueId(4674);
-    static constexpr const TSymbolUniqueId imageAtomicExchangeExt_IImageCube1_Int3_Float1 =
+    static constexpr const TSymbolUniqueId imageAtomicExchangeExt_UImage2D1_Int2_Float1 =
         TSymbolUniqueId(4675);
-    static constexpr const TSymbolUniqueId imageAtomicExchangeExt_UImageCube1_Int3_Float1 =
+    static constexpr const TSymbolUniqueId imageAtomicExchangeExt_Image3D1_Int3_Float1 =
         TSymbolUniqueId(4676);
-    static constexpr const TSymbolUniqueId imageAtomicExchangeExt_ImageBuffer1_Int1_Float1 =
+    static constexpr const TSymbolUniqueId imageAtomicExchangeExt_IImage3D1_Int3_Float1 =
         TSymbolUniqueId(4677);
-    static constexpr const TSymbolUniqueId imageAtomicExchangeExt_IImageBuffer1_Int1_Float1 =
+    static constexpr const TSymbolUniqueId imageAtomicExchangeExt_UImage3D1_Int3_Float1 =
         TSymbolUniqueId(4678);
-    static constexpr const TSymbolUniqueId imageAtomicExchangeExt_UImageBuffer1_Int1_Float1 =
+    static constexpr const TSymbolUniqueId imageAtomicExchangeExt_ImageCube1_Int3_Float1 =
         TSymbolUniqueId(4679);
-    static constexpr const TSymbolUniqueId imageAtomicExchangeExt_Image2DArray1_Int3_Float1 =
+    static constexpr const TSymbolUniqueId imageAtomicExchangeExt_IImageCube1_Int3_Float1 =
         TSymbolUniqueId(4680);
-    static constexpr const TSymbolUniqueId imageAtomicExchangeExt_IImage2DArray1_Int3_Float1 =
+    static constexpr const TSymbolUniqueId imageAtomicExchangeExt_UImageCube1_Int3_Float1 =
         TSymbolUniqueId(4681);
-    static constexpr const TSymbolUniqueId imageAtomicExchangeExt_UImage2DArray1_Int3_Float1 =
+    static constexpr const TSymbolUniqueId imageAtomicExchangeExt_ImageBuffer1_Int1_Float1 =
         TSymbolUniqueId(4682);
-    static constexpr const TSymbolUniqueId imageAtomicExchangeExt_ImageCubeArray1_Int3_Float1 =
+    static constexpr const TSymbolUniqueId imageAtomicExchangeExt_IImageBuffer1_Int1_Float1 =
         TSymbolUniqueId(4683);
-    static constexpr const TSymbolUniqueId imageAtomicExchangeExt_IImageCubeArray1_Int3_Float1 =
+    static constexpr const TSymbolUniqueId imageAtomicExchangeExt_UImageBuffer1_Int1_Float1 =
         TSymbolUniqueId(4684);
-    static constexpr const TSymbolUniqueId imageAtomicExchangeExt_UImageCubeArray1_Int3_Float1 =
+    static constexpr const TSymbolUniqueId imageAtomicExchangeExt_Image2DArray1_Int3_Float1 =
         TSymbolUniqueId(4685);
-    static constexpr const TSymbolUniqueId imageAtomicExchangeExt_Image1D1_Int1_Float1 =
+    static constexpr const TSymbolUniqueId imageAtomicExchangeExt_IImage2DArray1_Int3_Float1 =
         TSymbolUniqueId(4686);
-    static constexpr const TSymbolUniqueId imageAtomicExchangeExt_IImage1D1_Int1_Float1 =
+    static constexpr const TSymbolUniqueId imageAtomicExchangeExt_UImage2DArray1_Int3_Float1 =
         TSymbolUniqueId(4687);
-    static constexpr const TSymbolUniqueId imageAtomicExchangeExt_UImage1D1_Int1_Float1 =
+    static constexpr const TSymbolUniqueId imageAtomicExchangeExt_ImageCubeArray1_Int3_Float1 =
         TSymbolUniqueId(4688);
-    static constexpr const TSymbolUniqueId imageAtomicExchangeExt_Image1DArray1_Int2_Float1 =
+    static constexpr const TSymbolUniqueId imageAtomicExchangeExt_IImageCubeArray1_Int3_Float1 =
         TSymbolUniqueId(4689);
-    static constexpr const TSymbolUniqueId imageAtomicExchangeExt_IImage1DArray1_Int2_Float1 =
+    static constexpr const TSymbolUniqueId imageAtomicExchangeExt_UImageCubeArray1_Int3_Float1 =
         TSymbolUniqueId(4690);
-    static constexpr const TSymbolUniqueId imageAtomicExchangeExt_UImage1DArray1_Int2_Float1 =
+    static constexpr const TSymbolUniqueId imageAtomicExchangeExt_Image1D1_Int1_Float1 =
         TSymbolUniqueId(4691);
-    static constexpr const TSymbolUniqueId imageAtomicExchangeExt_ImageRect1_Int2_Float1 =
+    static constexpr const TSymbolUniqueId imageAtomicExchangeExt_IImage1D1_Int1_Float1 =
         TSymbolUniqueId(4692);
-    static constexpr const TSymbolUniqueId imageAtomicExchangeExt_IImageRect1_Int2_Float1 =
+    static constexpr const TSymbolUniqueId imageAtomicExchangeExt_UImage1D1_Int1_Float1 =
         TSymbolUniqueId(4693);
-    static constexpr const TSymbolUniqueId imageAtomicExchangeExt_UImageRect1_Int2_Float1 =
+    static constexpr const TSymbolUniqueId imageAtomicExchangeExt_Image1DArray1_Int2_Float1 =
         TSymbolUniqueId(4694);
-    static constexpr const TSymbolUniqueId imageAtomicExchangeExt_Image2DMS1_Int2_Int1_Float1 =
+    static constexpr const TSymbolUniqueId imageAtomicExchangeExt_IImage1DArray1_Int2_Float1 =
         TSymbolUniqueId(4695);
-    static constexpr const TSymbolUniqueId imageAtomicExchangeExt_IImage2DMS1_Int2_Int1_Float1 =
+    static constexpr const TSymbolUniqueId imageAtomicExchangeExt_UImage1DArray1_Int2_Float1 =
         TSymbolUniqueId(4696);
-    static constexpr const TSymbolUniqueId imageAtomicExchangeExt_UImage2DMS1_Int2_Int1_Float1 =
+    static constexpr const TSymbolUniqueId imageAtomicExchangeExt_ImageRect1_Int2_Float1 =
         TSymbolUniqueId(4697);
-    static constexpr const TSymbolUniqueId imageAtomicExchangeExt_Image2DMSArray1_Int3_Int1_Float1 =
+    static constexpr const TSymbolUniqueId imageAtomicExchangeExt_IImageRect1_Int2_Float1 =
         TSymbolUniqueId(4698);
-    static constexpr const TSymbolUniqueId
-        imageAtomicExchangeExt_IImage2DMSArray1_Int3_Int1_Float1 = TSymbolUniqueId(4699);
-    static constexpr const TSymbolUniqueId
-        imageAtomicExchangeExt_UImage2DMSArray1_Int3_Int1_Float1 = TSymbolUniqueId(4700);
-    static constexpr const TSymbolUniqueId imageAtomicCompSwapExt_Image2D1_Int2_UInt1_UInt1 =
+    static constexpr const TSymbolUniqueId imageAtomicExchangeExt_UImageRect1_Int2_Float1 =
+        TSymbolUniqueId(4699);
+    static constexpr const TSymbolUniqueId imageAtomicExchangeExt_Image2DMS1_Int2_Int1_Float1 =
+        TSymbolUniqueId(4700);
+    static constexpr const TSymbolUniqueId imageAtomicExchangeExt_IImage2DMS1_Int2_Int1_Float1 =
         TSymbolUniqueId(4701);
-    static constexpr const TSymbolUniqueId imageAtomicCompSwapExt_IImage2D1_Int2_UInt1_UInt1 =
+    static constexpr const TSymbolUniqueId imageAtomicExchangeExt_UImage2DMS1_Int2_Int1_Float1 =
         TSymbolUniqueId(4702);
-    static constexpr const TSymbolUniqueId imageAtomicCompSwapExt_UImage2D1_Int2_UInt1_UInt1 =
+    static constexpr const TSymbolUniqueId imageAtomicExchangeExt_Image2DMSArray1_Int3_Int1_Float1 =
         TSymbolUniqueId(4703);
-    static constexpr const TSymbolUniqueId imageAtomicCompSwapExt_Image3D1_Int3_UInt1_UInt1 =
-        TSymbolUniqueId(4704);
-    static constexpr const TSymbolUniqueId imageAtomicCompSwapExt_IImage3D1_Int3_UInt1_UInt1 =
-        TSymbolUniqueId(4705);
-    static constexpr const TSymbolUniqueId imageAtomicCompSwapExt_UImage3D1_Int3_UInt1_UInt1 =
+    static constexpr const TSymbolUniqueId
+        imageAtomicExchangeExt_IImage2DMSArray1_Int3_Int1_Float1 = TSymbolUniqueId(4704);
+    static constexpr const TSymbolUniqueId
+        imageAtomicExchangeExt_UImage2DMSArray1_Int3_Int1_Float1 = TSymbolUniqueId(4705);
+    static constexpr const TSymbolUniqueId imageAtomicCompSwapExt_Image2D1_Int2_UInt1_UInt1 =
         TSymbolUniqueId(4706);
-    static constexpr const TSymbolUniqueId imageAtomicCompSwapExt_ImageCube1_Int3_UInt1_UInt1 =
+    static constexpr const TSymbolUniqueId imageAtomicCompSwapExt_IImage2D1_Int2_UInt1_UInt1 =
         TSymbolUniqueId(4707);
-    static constexpr const TSymbolUniqueId imageAtomicCompSwapExt_IImageCube1_Int3_UInt1_UInt1 =
+    static constexpr const TSymbolUniqueId imageAtomicCompSwapExt_UImage2D1_Int2_UInt1_UInt1 =
         TSymbolUniqueId(4708);
-    static constexpr const TSymbolUniqueId imageAtomicCompSwapExt_UImageCube1_Int3_UInt1_UInt1 =
+    static constexpr const TSymbolUniqueId imageAtomicCompSwapExt_Image3D1_Int3_UInt1_UInt1 =
         TSymbolUniqueId(4709);
-    static constexpr const TSymbolUniqueId imageAtomicCompSwapExt_ImageBuffer1_Int1_UInt1_UInt1 =
+    static constexpr const TSymbolUniqueId imageAtomicCompSwapExt_IImage3D1_Int3_UInt1_UInt1 =
         TSymbolUniqueId(4710);
-    static constexpr const TSymbolUniqueId imageAtomicCompSwapExt_IImageBuffer1_Int1_UInt1_UInt1 =
+    static constexpr const TSymbolUniqueId imageAtomicCompSwapExt_UImage3D1_Int3_UInt1_UInt1 =
         TSymbolUniqueId(4711);
-    static constexpr const TSymbolUniqueId imageAtomicCompSwapExt_UImageBuffer1_Int1_UInt1_UInt1 =
+    static constexpr const TSymbolUniqueId imageAtomicCompSwapExt_ImageCube1_Int3_UInt1_UInt1 =
         TSymbolUniqueId(4712);
-    static constexpr const TSymbolUniqueId imageAtomicCompSwapExt_Image2DArray1_Int3_UInt1_UInt1 =
+    static constexpr const TSymbolUniqueId imageAtomicCompSwapExt_IImageCube1_Int3_UInt1_UInt1 =
         TSymbolUniqueId(4713);
-    static constexpr const TSymbolUniqueId imageAtomicCompSwapExt_IImage2DArray1_Int3_UInt1_UInt1 =
+    static constexpr const TSymbolUniqueId imageAtomicCompSwapExt_UImageCube1_Int3_UInt1_UInt1 =
         TSymbolUniqueId(4714);
-    static constexpr const TSymbolUniqueId imageAtomicCompSwapExt_UImage2DArray1_Int3_UInt1_UInt1 =
+    static constexpr const TSymbolUniqueId imageAtomicCompSwapExt_ImageBuffer1_Int1_UInt1_UInt1 =
         TSymbolUniqueId(4715);
-    static constexpr const TSymbolUniqueId imageAtomicCompSwapExt_ImageCubeArray1_Int3_UInt1_UInt1 =
+    static constexpr const TSymbolUniqueId imageAtomicCompSwapExt_IImageBuffer1_Int1_UInt1_UInt1 =
         TSymbolUniqueId(4716);
-    static constexpr const TSymbolUniqueId
-        imageAtomicCompSwapExt_IImageCubeArray1_Int3_UInt1_UInt1 = TSymbolUniqueId(4717);
-    static constexpr const TSymbolUniqueId
-        imageAtomicCompSwapExt_UImageCubeArray1_Int3_UInt1_UInt1 = TSymbolUniqueId(4718);
-    static constexpr const TSymbolUniqueId imageAtomicCompSwapExt_Image1D1_Int1_UInt1_UInt1 =
+    static constexpr const TSymbolUniqueId imageAtomicCompSwapExt_UImageBuffer1_Int1_UInt1_UInt1 =
+        TSymbolUniqueId(4717);
+    static constexpr const TSymbolUniqueId imageAtomicCompSwapExt_Image2DArray1_Int3_UInt1_UInt1 =
+        TSymbolUniqueId(4718);
+    static constexpr const TSymbolUniqueId imageAtomicCompSwapExt_IImage2DArray1_Int3_UInt1_UInt1 =
         TSymbolUniqueId(4719);
-    static constexpr const TSymbolUniqueId imageAtomicCompSwapExt_IImage1D1_Int1_UInt1_UInt1 =
+    static constexpr const TSymbolUniqueId imageAtomicCompSwapExt_UImage2DArray1_Int3_UInt1_UInt1 =
         TSymbolUniqueId(4720);
-    static constexpr const TSymbolUniqueId imageAtomicCompSwapExt_UImage1D1_Int1_UInt1_UInt1 =
+    static constexpr const TSymbolUniqueId imageAtomicCompSwapExt_ImageCubeArray1_Int3_UInt1_UInt1 =
         TSymbolUniqueId(4721);
-    static constexpr const TSymbolUniqueId imageAtomicCompSwapExt_Image1DArray1_Int2_UInt1_UInt1 =
-        TSymbolUniqueId(4722);
-    static constexpr const TSymbolUniqueId imageAtomicCompSwapExt_IImage1DArray1_Int2_UInt1_UInt1 =
-        TSymbolUniqueId(4723);
-    static constexpr const TSymbolUniqueId imageAtomicCompSwapExt_UImage1DArray1_Int2_UInt1_UInt1 =
+    static constexpr const TSymbolUniqueId
+        imageAtomicCompSwapExt_IImageCubeArray1_Int3_UInt1_UInt1 = TSymbolUniqueId(4722);
+    static constexpr const TSymbolUniqueId
+        imageAtomicCompSwapExt_UImageCubeArray1_Int3_UInt1_UInt1 = TSymbolUniqueId(4723);
+    static constexpr const TSymbolUniqueId imageAtomicCompSwapExt_Image1D1_Int1_UInt1_UInt1 =
         TSymbolUniqueId(4724);
-    static constexpr const TSymbolUniqueId imageAtomicCompSwapExt_ImageRect1_Int2_UInt1_UInt1 =
+    static constexpr const TSymbolUniqueId imageAtomicCompSwapExt_IImage1D1_Int1_UInt1_UInt1 =
         TSymbolUniqueId(4725);
-    static constexpr const TSymbolUniqueId imageAtomicCompSwapExt_IImageRect1_Int2_UInt1_UInt1 =
+    static constexpr const TSymbolUniqueId imageAtomicCompSwapExt_UImage1D1_Int1_UInt1_UInt1 =
         TSymbolUniqueId(4726);
-    static constexpr const TSymbolUniqueId imageAtomicCompSwapExt_UImageRect1_Int2_UInt1_UInt1 =
+    static constexpr const TSymbolUniqueId imageAtomicCompSwapExt_Image1DArray1_Int2_UInt1_UInt1 =
         TSymbolUniqueId(4727);
-    static constexpr const TSymbolUniqueId imageAtomicCompSwapExt_Image2DMS1_Int2_Int1_UInt1_UInt1 =
+    static constexpr const TSymbolUniqueId imageAtomicCompSwapExt_IImage1DArray1_Int2_UInt1_UInt1 =
         TSymbolUniqueId(4728);
+    static constexpr const TSymbolUniqueId imageAtomicCompSwapExt_UImage1DArray1_Int2_UInt1_UInt1 =
+        TSymbolUniqueId(4729);
+    static constexpr const TSymbolUniqueId imageAtomicCompSwapExt_ImageRect1_Int2_UInt1_UInt1 =
+        TSymbolUniqueId(4730);
+    static constexpr const TSymbolUniqueId imageAtomicCompSwapExt_IImageRect1_Int2_UInt1_UInt1 =
+        TSymbolUniqueId(4731);
+    static constexpr const TSymbolUniqueId imageAtomicCompSwapExt_UImageRect1_Int2_UInt1_UInt1 =
+        TSymbolUniqueId(4732);
+    static constexpr const TSymbolUniqueId imageAtomicCompSwapExt_Image2DMS1_Int2_Int1_UInt1_UInt1 =
+        TSymbolUniqueId(4733);
     static constexpr const TSymbolUniqueId
-        imageAtomicCompSwapExt_IImage2DMS1_Int2_Int1_UInt1_UInt1 = TSymbolUniqueId(4729);
+        imageAtomicCompSwapExt_IImage2DMS1_Int2_Int1_UInt1_UInt1 = TSymbolUniqueId(4734);
     static constexpr const TSymbolUniqueId
-        imageAtomicCompSwapExt_UImage2DMS1_Int2_Int1_UInt1_UInt1 = TSymbolUniqueId(4730);
+        imageAtomicCompSwapExt_UImage2DMS1_Int2_Int1_UInt1_UInt1 = TSymbolUniqueId(4735);
     static constexpr const TSymbolUniqueId
-        imageAtomicCompSwapExt_Image2DMSArray1_Int3_Int1_UInt1_UInt1 = TSymbolUniqueId(4731);
+        imageAtomicCompSwapExt_Image2DMSArray1_Int3_Int1_UInt1_UInt1 = TSymbolUniqueId(4736);
     static constexpr const TSymbolUniqueId
-        imageAtomicCompSwapExt_IImage2DMSArray1_Int3_Int1_UInt1_UInt1 = TSymbolUniqueId(4732);
+        imageAtomicCompSwapExt_IImage2DMSArray1_Int3_Int1_UInt1_UInt1 = TSymbolUniqueId(4737);
     static constexpr const TSymbolUniqueId
-        imageAtomicCompSwapExt_UImage2DMSArray1_Int3_Int1_UInt1_UInt1 = TSymbolUniqueId(4733);
+        imageAtomicCompSwapExt_UImage2DMSArray1_Int3_Int1_UInt1_UInt1 = TSymbolUniqueId(4738);
     static constexpr const TSymbolUniqueId imageAtomicCompSwapExt_Image2D1_Int2_Int1_Int1 =
-        TSymbolUniqueId(4734);
-    static constexpr const TSymbolUniqueId imageAtomicCompSwapExt_IImage2D1_Int2_Int1_Int1 =
-        TSymbolUniqueId(4735);
-    static constexpr const TSymbolUniqueId imageAtomicCompSwapExt_UImage2D1_Int2_Int1_Int1 =
-        TSymbolUniqueId(4736);
-    static constexpr const TSymbolUniqueId imageAtomicCompSwapExt_Image3D1_Int3_Int1_Int1 =
-        TSymbolUniqueId(4737);
-    static constexpr const TSymbolUniqueId imageAtomicCompSwapExt_IImage3D1_Int3_Int1_Int1 =
-        TSymbolUniqueId(4738);
-    static constexpr const TSymbolUniqueId imageAtomicCompSwapExt_UImage3D1_Int3_Int1_Int1 =
         TSymbolUniqueId(4739);
-    static constexpr const TSymbolUniqueId imageAtomicCompSwapExt_ImageCube1_Int3_Int1_Int1 =
+    static constexpr const TSymbolUniqueId imageAtomicCompSwapExt_IImage2D1_Int2_Int1_Int1 =
         TSymbolUniqueId(4740);
-    static constexpr const TSymbolUniqueId imageAtomicCompSwapExt_IImageCube1_Int3_Int1_Int1 =
+    static constexpr const TSymbolUniqueId imageAtomicCompSwapExt_UImage2D1_Int2_Int1_Int1 =
         TSymbolUniqueId(4741);
-    static constexpr const TSymbolUniqueId imageAtomicCompSwapExt_UImageCube1_Int3_Int1_Int1 =
+    static constexpr const TSymbolUniqueId imageAtomicCompSwapExt_Image3D1_Int3_Int1_Int1 =
         TSymbolUniqueId(4742);
-    static constexpr const TSymbolUniqueId imageAtomicCompSwapExt_ImageBuffer1_Int1_Int1_Int1 =
+    static constexpr const TSymbolUniqueId imageAtomicCompSwapExt_IImage3D1_Int3_Int1_Int1 =
         TSymbolUniqueId(4743);
-    static constexpr const TSymbolUniqueId imageAtomicCompSwapExt_IImageBuffer1_Int1_Int1_Int1 =
+    static constexpr const TSymbolUniqueId imageAtomicCompSwapExt_UImage3D1_Int3_Int1_Int1 =
         TSymbolUniqueId(4744);
-    static constexpr const TSymbolUniqueId imageAtomicCompSwapExt_UImageBuffer1_Int1_Int1_Int1 =
+    static constexpr const TSymbolUniqueId imageAtomicCompSwapExt_ImageCube1_Int3_Int1_Int1 =
         TSymbolUniqueId(4745);
-    static constexpr const TSymbolUniqueId imageAtomicCompSwapExt_Image2DArray1_Int3_Int1_Int1 =
+    static constexpr const TSymbolUniqueId imageAtomicCompSwapExt_IImageCube1_Int3_Int1_Int1 =
         TSymbolUniqueId(4746);
-    static constexpr const TSymbolUniqueId imageAtomicCompSwapExt_IImage2DArray1_Int3_Int1_Int1 =
+    static constexpr const TSymbolUniqueId imageAtomicCompSwapExt_UImageCube1_Int3_Int1_Int1 =
         TSymbolUniqueId(4747);
-    static constexpr const TSymbolUniqueId imageAtomicCompSwapExt_UImage2DArray1_Int3_Int1_Int1 =
+    static constexpr const TSymbolUniqueId imageAtomicCompSwapExt_ImageBuffer1_Int1_Int1_Int1 =
         TSymbolUniqueId(4748);
-    static constexpr const TSymbolUniqueId imageAtomicCompSwapExt_ImageCubeArray1_Int3_Int1_Int1 =
+    static constexpr const TSymbolUniqueId imageAtomicCompSwapExt_IImageBuffer1_Int1_Int1_Int1 =
         TSymbolUniqueId(4749);
-    static constexpr const TSymbolUniqueId imageAtomicCompSwapExt_IImageCubeArray1_Int3_Int1_Int1 =
+    static constexpr const TSymbolUniqueId imageAtomicCompSwapExt_UImageBuffer1_Int1_Int1_Int1 =
         TSymbolUniqueId(4750);
-    static constexpr const TSymbolUniqueId imageAtomicCompSwapExt_UImageCubeArray1_Int3_Int1_Int1 =
+    static constexpr const TSymbolUniqueId imageAtomicCompSwapExt_Image2DArray1_Int3_Int1_Int1 =
         TSymbolUniqueId(4751);
-    static constexpr const TSymbolUniqueId imageAtomicCompSwapExt_Image1D1_Int1_Int1_Int1 =
+    static constexpr const TSymbolUniqueId imageAtomicCompSwapExt_IImage2DArray1_Int3_Int1_Int1 =
         TSymbolUniqueId(4752);
-    static constexpr const TSymbolUniqueId imageAtomicCompSwapExt_IImage1D1_Int1_Int1_Int1 =
+    static constexpr const TSymbolUniqueId imageAtomicCompSwapExt_UImage2DArray1_Int3_Int1_Int1 =
         TSymbolUniqueId(4753);
-    static constexpr const TSymbolUniqueId imageAtomicCompSwapExt_UImage1D1_Int1_Int1_Int1 =
+    static constexpr const TSymbolUniqueId imageAtomicCompSwapExt_ImageCubeArray1_Int3_Int1_Int1 =
         TSymbolUniqueId(4754);
-    static constexpr const TSymbolUniqueId imageAtomicCompSwapExt_Image1DArray1_Int2_Int1_Int1 =
+    static constexpr const TSymbolUniqueId imageAtomicCompSwapExt_IImageCubeArray1_Int3_Int1_Int1 =
         TSymbolUniqueId(4755);
-    static constexpr const TSymbolUniqueId imageAtomicCompSwapExt_IImage1DArray1_Int2_Int1_Int1 =
+    static constexpr const TSymbolUniqueId imageAtomicCompSwapExt_UImageCubeArray1_Int3_Int1_Int1 =
         TSymbolUniqueId(4756);
-    static constexpr const TSymbolUniqueId imageAtomicCompSwapExt_UImage1DArray1_Int2_Int1_Int1 =
+    static constexpr const TSymbolUniqueId imageAtomicCompSwapExt_Image1D1_Int1_Int1_Int1 =
         TSymbolUniqueId(4757);
-    static constexpr const TSymbolUniqueId imageAtomicCompSwapExt_ImageRect1_Int2_Int1_Int1 =
+    static constexpr const TSymbolUniqueId imageAtomicCompSwapExt_IImage1D1_Int1_Int1_Int1 =
         TSymbolUniqueId(4758);
-    static constexpr const TSymbolUniqueId imageAtomicCompSwapExt_IImageRect1_Int2_Int1_Int1 =
+    static constexpr const TSymbolUniqueId imageAtomicCompSwapExt_UImage1D1_Int1_Int1_Int1 =
         TSymbolUniqueId(4759);
-    static constexpr const TSymbolUniqueId imageAtomicCompSwapExt_UImageRect1_Int2_Int1_Int1 =
+    static constexpr const TSymbolUniqueId imageAtomicCompSwapExt_Image1DArray1_Int2_Int1_Int1 =
         TSymbolUniqueId(4760);
-    static constexpr const TSymbolUniqueId imageAtomicCompSwapExt_Image2DMS1_Int2_Int1_Int1_Int1 =
+    static constexpr const TSymbolUniqueId imageAtomicCompSwapExt_IImage1DArray1_Int2_Int1_Int1 =
         TSymbolUniqueId(4761);
-    static constexpr const TSymbolUniqueId imageAtomicCompSwapExt_IImage2DMS1_Int2_Int1_Int1_Int1 =
+    static constexpr const TSymbolUniqueId imageAtomicCompSwapExt_UImage1DArray1_Int2_Int1_Int1 =
         TSymbolUniqueId(4762);
-    static constexpr const TSymbolUniqueId imageAtomicCompSwapExt_UImage2DMS1_Int2_Int1_Int1_Int1 =
+    static constexpr const TSymbolUniqueId imageAtomicCompSwapExt_ImageRect1_Int2_Int1_Int1 =
         TSymbolUniqueId(4763);
+    static constexpr const TSymbolUniqueId imageAtomicCompSwapExt_IImageRect1_Int2_Int1_Int1 =
+        TSymbolUniqueId(4764);
+    static constexpr const TSymbolUniqueId imageAtomicCompSwapExt_UImageRect1_Int2_Int1_Int1 =
+        TSymbolUniqueId(4765);
+    static constexpr const TSymbolUniqueId imageAtomicCompSwapExt_Image2DMS1_Int2_Int1_Int1_Int1 =
+        TSymbolUniqueId(4766);
+    static constexpr const TSymbolUniqueId imageAtomicCompSwapExt_IImage2DMS1_Int2_Int1_Int1_Int1 =
+        TSymbolUniqueId(4767);
+    static constexpr const TSymbolUniqueId imageAtomicCompSwapExt_UImage2DMS1_Int2_Int1_Int1_Int1 =
+        TSymbolUniqueId(4768);
     static constexpr const TSymbolUniqueId
-        imageAtomicCompSwapExt_Image2DMSArray1_Int3_Int1_Int1_Int1 = TSymbolUniqueId(4764);
+        imageAtomicCompSwapExt_Image2DMSArray1_Int3_Int1_Int1_Int1 = TSymbolUniqueId(4769);
     static constexpr const TSymbolUniqueId
-        imageAtomicCompSwapExt_IImage2DMSArray1_Int3_Int1_Int1_Int1 = TSymbolUniqueId(4765);
+        imageAtomicCompSwapExt_IImage2DMSArray1_Int3_Int1_Int1_Int1 = TSymbolUniqueId(4770);
     static constexpr const TSymbolUniqueId
-        imageAtomicCompSwapExt_UImage2DMSArray1_Int3_Int1_Int1_Int1        = TSymbolUniqueId(4766);
-    static constexpr const TSymbolUniqueId memoryBarrier                   = TSymbolUniqueId(4767);
-    static constexpr const TSymbolUniqueId memoryBarrierAtomicCounter      = TSymbolUniqueId(4768);
-    static constexpr const TSymbolUniqueId memoryBarrierBuffer             = TSymbolUniqueId(4769);
-    static constexpr const TSymbolUniqueId memoryBarrierImage              = TSymbolUniqueId(4770);
-    static constexpr const TSymbolUniqueId barrier                         = TSymbolUniqueId(4771);
-    static constexpr const TSymbolUniqueId memoryBarrierShared             = TSymbolUniqueId(4772);
-    static constexpr const TSymbolUniqueId groupMemoryBarrier              = TSymbolUniqueId(4773);
-    static constexpr const TSymbolUniqueId barrierES3_2                    = TSymbolUniqueId(4774);
-    static constexpr const TSymbolUniqueId EmitVertex                      = TSymbolUniqueId(4775);
-    static constexpr const TSymbolUniqueId EmitVertexES3_2                 = TSymbolUniqueId(4776);
-    static constexpr const TSymbolUniqueId EndPrimitive                    = TSymbolUniqueId(4777);
-    static constexpr const TSymbolUniqueId EndPrimitiveES3_2               = TSymbolUniqueId(4778);
-    static constexpr const TSymbolUniqueId gl_DepthRangeParameters         = TSymbolUniqueId(4779);
-    static constexpr const TSymbolUniqueId gl_DepthRange                   = TSymbolUniqueId(4780);
-    static constexpr const TSymbolUniqueId gl_NumSamples                   = TSymbolUniqueId(4781);
-    static constexpr const TSymbolUniqueId gl_NumSamplesES3_2              = TSymbolUniqueId(4782);
-    static constexpr const TSymbolUniqueId gl_MaxVertexAttribs             = TSymbolUniqueId(4783);
-    static constexpr const TSymbolUniqueId gl_MaxVertexUniformVectors      = TSymbolUniqueId(4784);
-    static constexpr const TSymbolUniqueId gl_MaxVertexTextureImageUnits   = TSymbolUniqueId(4785);
-    static constexpr const TSymbolUniqueId gl_MaxCombinedTextureImageUnits = TSymbolUniqueId(4786);
-    static constexpr const TSymbolUniqueId gl_MaxTextureImageUnits         = TSymbolUniqueId(4787);
-    static constexpr const TSymbolUniqueId gl_MaxFragmentUniformVectors    = TSymbolUniqueId(4788);
-    static constexpr const TSymbolUniqueId gl_MaxVaryingVectors            = TSymbolUniqueId(4789);
-    static constexpr const TSymbolUniqueId gl_MaxDrawBuffers               = TSymbolUniqueId(4790);
-    static constexpr const TSymbolUniqueId gl_MaxDualSourceDrawBuffersEXT  = TSymbolUniqueId(4791);
-    static constexpr const TSymbolUniqueId gl_MaxVertexOutputVectors       = TSymbolUniqueId(4792);
-    static constexpr const TSymbolUniqueId gl_MaxFragmentInputVectors      = TSymbolUniqueId(4793);
-    static constexpr const TSymbolUniqueId gl_MinProgramTexelOffset        = TSymbolUniqueId(4794);
-    static constexpr const TSymbolUniqueId gl_MaxProgramTexelOffset        = TSymbolUniqueId(4795);
-    static constexpr const TSymbolUniqueId gl_MaxImageUnits                = TSymbolUniqueId(4796);
-    static constexpr const TSymbolUniqueId gl_MaxVertexImageUniforms       = TSymbolUniqueId(4797);
-    static constexpr const TSymbolUniqueId gl_MaxFragmentImageUniforms     = TSymbolUniqueId(4798);
-    static constexpr const TSymbolUniqueId gl_MaxComputeImageUniforms      = TSymbolUniqueId(4799);
-    static constexpr const TSymbolUniqueId gl_MaxCombinedImageUniforms     = TSymbolUniqueId(4800);
+        imageAtomicCompSwapExt_UImage2DMSArray1_Int3_Int1_Int1_Int1         = TSymbolUniqueId(4771);
+    static constexpr const TSymbolUniqueId memoryBarrier                    = TSymbolUniqueId(4772);
+    static constexpr const TSymbolUniqueId memoryBarrierAtomicCounter       = TSymbolUniqueId(4773);
+    static constexpr const TSymbolUniqueId memoryBarrierBuffer              = TSymbolUniqueId(4774);
+    static constexpr const TSymbolUniqueId memoryBarrierImage               = TSymbolUniqueId(4775);
+    static constexpr const TSymbolUniqueId barrier                          = TSymbolUniqueId(4776);
+    static constexpr const TSymbolUniqueId memoryBarrierShared              = TSymbolUniqueId(4777);
+    static constexpr const TSymbolUniqueId groupMemoryBarrier               = TSymbolUniqueId(4778);
+    static constexpr const TSymbolUniqueId barrierTCS                       = TSymbolUniqueId(4779);
+    static constexpr const TSymbolUniqueId barrierTCSES3_2                  = TSymbolUniqueId(4780);
+    static constexpr const TSymbolUniqueId EmitVertex                       = TSymbolUniqueId(4781);
+    static constexpr const TSymbolUniqueId EmitVertexES3_2                  = TSymbolUniqueId(4782);
+    static constexpr const TSymbolUniqueId EndPrimitive                     = TSymbolUniqueId(4783);
+    static constexpr const TSymbolUniqueId EndPrimitiveES3_2                = TSymbolUniqueId(4784);
+    static constexpr const TSymbolUniqueId subpassLoad_SubpassInput1        = TSymbolUniqueId(4785);
+    static constexpr const TSymbolUniqueId pt01g                            = TSymbolUniqueId(4786);
+    static constexpr const TSymbolUniqueId subpassLoad_ISubpassInput1       = TSymbolUniqueId(4787);
+    static constexpr const TSymbolUniqueId pt01h                            = TSymbolUniqueId(4788);
+    static constexpr const TSymbolUniqueId subpassLoad_USubpassInput1       = TSymbolUniqueId(4789);
+    static constexpr const TSymbolUniqueId pt01i                            = TSymbolUniqueId(4790);
+    static constexpr const TSymbolUniqueId subpassLoad_SubpassInputMS1_Int1 = TSymbolUniqueId(4791);
+    static constexpr const TSymbolUniqueId pt01j                            = TSymbolUniqueId(4792);
+    static constexpr const TSymbolUniqueId subpassLoad_ISubpassInputMS1_Int1 =
+        TSymbolUniqueId(4793);
+    static constexpr const TSymbolUniqueId pt01k = TSymbolUniqueId(4794);
+    static constexpr const TSymbolUniqueId subpassLoad_USubpassInputMS1_Int1 =
+        TSymbolUniqueId(4795);
+    static constexpr const TSymbolUniqueId pt01l                           = TSymbolUniqueId(4796);
+    static constexpr const TSymbolUniqueId gl_DepthRangeParameters         = TSymbolUniqueId(4797);
+    static constexpr const TSymbolUniqueId gl_DepthRange                   = TSymbolUniqueId(4798);
+    static constexpr const TSymbolUniqueId gl_NumSamples                   = TSymbolUniqueId(4799);
+    static constexpr const TSymbolUniqueId gl_NumSamplesES3_2              = TSymbolUniqueId(4800);
+    static constexpr const TSymbolUniqueId gl_MaxVertexAttribs             = TSymbolUniqueId(4801);
+    static constexpr const TSymbolUniqueId gl_MaxVertexUniformVectors      = TSymbolUniqueId(4802);
+    static constexpr const TSymbolUniqueId gl_MaxVertexTextureImageUnits   = TSymbolUniqueId(4803);
+    static constexpr const TSymbolUniqueId gl_MaxCombinedTextureImageUnits = TSymbolUniqueId(4804);
+    static constexpr const TSymbolUniqueId gl_MaxTextureImageUnits         = TSymbolUniqueId(4805);
+    static constexpr const TSymbolUniqueId gl_MaxFragmentUniformVectors    = TSymbolUniqueId(4806);
+    static constexpr const TSymbolUniqueId gl_MaxVaryingVectors            = TSymbolUniqueId(4807);
+    static constexpr const TSymbolUniqueId gl_MaxDrawBuffers               = TSymbolUniqueId(4808);
+    static constexpr const TSymbolUniqueId gl_MaxDualSourceDrawBuffersEXT  = TSymbolUniqueId(4809);
+    static constexpr const TSymbolUniqueId gl_MaxVertexOutputVectors       = TSymbolUniqueId(4810);
+    static constexpr const TSymbolUniqueId gl_MaxFragmentInputVectors      = TSymbolUniqueId(4811);
+    static constexpr const TSymbolUniqueId gl_MinProgramTexelOffset        = TSymbolUniqueId(4812);
+    static constexpr const TSymbolUniqueId gl_MaxProgramTexelOffset        = TSymbolUniqueId(4813);
+    static constexpr const TSymbolUniqueId gl_MaxImageUnits                = TSymbolUniqueId(4814);
+    static constexpr const TSymbolUniqueId gl_MaxVertexImageUniforms       = TSymbolUniqueId(4815);
+    static constexpr const TSymbolUniqueId gl_MaxFragmentImageUniforms     = TSymbolUniqueId(4816);
+    static constexpr const TSymbolUniqueId gl_MaxComputeImageUniforms      = TSymbolUniqueId(4817);
+    static constexpr const TSymbolUniqueId gl_MaxCombinedImageUniforms     = TSymbolUniqueId(4818);
     static constexpr const TSymbolUniqueId gl_MaxCombinedShaderOutputResources =
-        TSymbolUniqueId(4801);
-    static constexpr const TSymbolUniqueId gl_MaxComputeWorkGroupCount    = TSymbolUniqueId(4802);
-    static constexpr const TSymbolUniqueId gl_MaxComputeWorkGroupSize     = TSymbolUniqueId(4803);
-    static constexpr const TSymbolUniqueId gl_MaxComputeUniformComponents = TSymbolUniqueId(4804);
-    static constexpr const TSymbolUniqueId gl_MaxComputeTextureImageUnits = TSymbolUniqueId(4805);
-    static constexpr const TSymbolUniqueId gl_MaxComputeAtomicCounters    = TSymbolUniqueId(4806);
-    static constexpr const TSymbolUniqueId gl_MaxComputeAtomicCounterBuffers =
-        TSymbolUniqueId(4807);
-    static constexpr const TSymbolUniqueId gl_MaxVertexAtomicCounters       = TSymbolUniqueId(4808);
-    static constexpr const TSymbolUniqueId gl_MaxFragmentAtomicCounters     = TSymbolUniqueId(4809);
-    static constexpr const TSymbolUniqueId gl_MaxCombinedAtomicCounters     = TSymbolUniqueId(4810);
-    static constexpr const TSymbolUniqueId gl_MaxAtomicCounterBindings      = TSymbolUniqueId(4811);
-    static constexpr const TSymbolUniqueId gl_MaxVertexAtomicCounterBuffers = TSymbolUniqueId(4812);
-    static constexpr const TSymbolUniqueId gl_MaxFragmentAtomicCounterBuffers =
-        TSymbolUniqueId(4813);
-    static constexpr const TSymbolUniqueId gl_MaxCombinedAtomicCounterBuffers =
-        TSymbolUniqueId(4814);
-    static constexpr const TSymbolUniqueId gl_MaxAtomicCounterBufferSize = TSymbolUniqueId(4815);
-    static constexpr const TSymbolUniqueId gl_MaxGeometryInputComponents = TSymbolUniqueId(4816);
-    static constexpr const TSymbolUniqueId gl_MaxGeometryInputComponentsES3_2 =
-        TSymbolUniqueId(4817);
-    static constexpr const TSymbolUniqueId gl_MaxGeometryOutputComponents = TSymbolUniqueId(4818);
-    static constexpr const TSymbolUniqueId gl_MaxGeometryOutputComponentsES3_2 =
         TSymbolUniqueId(4819);
-    static constexpr const TSymbolUniqueId gl_MaxGeometryImageUniforms      = TSymbolUniqueId(4820);
-    static constexpr const TSymbolUniqueId gl_MaxGeometryImageUniformsES3_2 = TSymbolUniqueId(4821);
-    static constexpr const TSymbolUniqueId gl_MaxGeometryTextureImageUnits  = TSymbolUniqueId(4822);
-    static constexpr const TSymbolUniqueId gl_MaxGeometryTextureImageUnitsES3_2 =
-        TSymbolUniqueId(4823);
-    static constexpr const TSymbolUniqueId gl_MaxGeometryOutputVertices = TSymbolUniqueId(4824);
-    static constexpr const TSymbolUniqueId gl_MaxGeometryOutputVerticesES3_2 =
+    static constexpr const TSymbolUniqueId gl_MaxComputeWorkGroupCount    = TSymbolUniqueId(4820);
+    static constexpr const TSymbolUniqueId gl_MaxComputeWorkGroupSize     = TSymbolUniqueId(4821);
+    static constexpr const TSymbolUniqueId gl_MaxComputeUniformComponents = TSymbolUniqueId(4822);
+    static constexpr const TSymbolUniqueId gl_MaxComputeTextureImageUnits = TSymbolUniqueId(4823);
+    static constexpr const TSymbolUniqueId gl_MaxComputeAtomicCounters    = TSymbolUniqueId(4824);
+    static constexpr const TSymbolUniqueId gl_MaxComputeAtomicCounterBuffers =
         TSymbolUniqueId(4825);
-    static constexpr const TSymbolUniqueId gl_MaxGeometryTotalOutputComponents =
-        TSymbolUniqueId(4826);
-    static constexpr const TSymbolUniqueId gl_MaxGeometryTotalOutputComponentsES3_2 =
-        TSymbolUniqueId(4827);
-    static constexpr const TSymbolUniqueId gl_MaxGeometryUniformComponents = TSymbolUniqueId(4828);
-    static constexpr const TSymbolUniqueId gl_MaxGeometryUniformComponentsES3_2 =
-        TSymbolUniqueId(4829);
-    static constexpr const TSymbolUniqueId gl_MaxGeometryAtomicCounters = TSymbolUniqueId(4830);
-    static constexpr const TSymbolUniqueId gl_MaxGeometryAtomicCountersES3_2 =
+    static constexpr const TSymbolUniqueId gl_MaxVertexAtomicCounters       = TSymbolUniqueId(4826);
+    static constexpr const TSymbolUniqueId gl_MaxFragmentAtomicCounters     = TSymbolUniqueId(4827);
+    static constexpr const TSymbolUniqueId gl_MaxCombinedAtomicCounters     = TSymbolUniqueId(4828);
+    static constexpr const TSymbolUniqueId gl_MaxAtomicCounterBindings      = TSymbolUniqueId(4829);
+    static constexpr const TSymbolUniqueId gl_MaxVertexAtomicCounterBuffers = TSymbolUniqueId(4830);
+    static constexpr const TSymbolUniqueId gl_MaxFragmentAtomicCounterBuffers =
         TSymbolUniqueId(4831);
-    static constexpr const TSymbolUniqueId gl_MaxGeometryAtomicCounterBuffers =
+    static constexpr const TSymbolUniqueId gl_MaxCombinedAtomicCounterBuffers =
         TSymbolUniqueId(4832);
-    static constexpr const TSymbolUniqueId gl_MaxGeometryAtomicCounterBuffersES3_2 =
-        TSymbolUniqueId(4833);
-    static constexpr const TSymbolUniqueId gl_MaxTessControlInputComponents = TSymbolUniqueId(4834);
-    static constexpr const TSymbolUniqueId gl_MaxTessControlInputComponentsES3_2 =
+    static constexpr const TSymbolUniqueId gl_MaxAtomicCounterBufferSize = TSymbolUniqueId(4833);
+    static constexpr const TSymbolUniqueId gl_MaxGeometryInputComponents = TSymbolUniqueId(4834);
+    static constexpr const TSymbolUniqueId gl_MaxGeometryInputComponentsES3_2 =
         TSymbolUniqueId(4835);
-    static constexpr const TSymbolUniqueId gl_MaxTessControlOutputComponents =
-        TSymbolUniqueId(4836);
-    static constexpr const TSymbolUniqueId gl_MaxTessControlOutputComponentsES3_2 =
+    static constexpr const TSymbolUniqueId gl_MaxGeometryOutputComponents = TSymbolUniqueId(4836);
+    static constexpr const TSymbolUniqueId gl_MaxGeometryOutputComponentsES3_2 =
         TSymbolUniqueId(4837);
-    static constexpr const TSymbolUniqueId gl_MaxTessControlTextureImageUnits =
-        TSymbolUniqueId(4838);
-    static constexpr const TSymbolUniqueId gl_MaxTessControlTextureImageUnitsES3_2 =
-        TSymbolUniqueId(4839);
-    static constexpr const TSymbolUniqueId gl_MaxTessControlUniformComponents =
-        TSymbolUniqueId(4840);
-    static constexpr const TSymbolUniqueId gl_MaxTessControlUniformComponentsES3_2 =
+    static constexpr const TSymbolUniqueId gl_MaxGeometryImageUniforms      = TSymbolUniqueId(4838);
+    static constexpr const TSymbolUniqueId gl_MaxGeometryImageUniformsES3_2 = TSymbolUniqueId(4839);
+    static constexpr const TSymbolUniqueId gl_MaxGeometryTextureImageUnits  = TSymbolUniqueId(4840);
+    static constexpr const TSymbolUniqueId gl_MaxGeometryTextureImageUnitsES3_2 =
         TSymbolUniqueId(4841);
-    static constexpr const TSymbolUniqueId gl_MaxTessControlTotalOutputComponents =
-        TSymbolUniqueId(4842);
-    static constexpr const TSymbolUniqueId gl_MaxTessControlTotalOutputComponentsES3_2 =
+    static constexpr const TSymbolUniqueId gl_MaxGeometryOutputVertices = TSymbolUniqueId(4842);
+    static constexpr const TSymbolUniqueId gl_MaxGeometryOutputVerticesES3_2 =
         TSymbolUniqueId(4843);
-    static constexpr const TSymbolUniqueId gl_MaxTessControlImageUniforms = TSymbolUniqueId(4844);
-    static constexpr const TSymbolUniqueId gl_MaxTessControlImageUniformsES3_2 =
+    static constexpr const TSymbolUniqueId gl_MaxGeometryTotalOutputComponents =
+        TSymbolUniqueId(4844);
+    static constexpr const TSymbolUniqueId gl_MaxGeometryTotalOutputComponentsES3_2 =
         TSymbolUniqueId(4845);
-    static constexpr const TSymbolUniqueId gl_MaxTessControlAtomicCounters = TSymbolUniqueId(4846);
-    static constexpr const TSymbolUniqueId gl_MaxTessControlAtomicCountersES3_2 =
+    static constexpr const TSymbolUniqueId gl_MaxGeometryUniformComponents = TSymbolUniqueId(4846);
+    static constexpr const TSymbolUniqueId gl_MaxGeometryUniformComponentsES3_2 =
         TSymbolUniqueId(4847);
-    static constexpr const TSymbolUniqueId gl_MaxTessControlAtomicCounterBuffers =
-        TSymbolUniqueId(4848);
-    static constexpr const TSymbolUniqueId gl_MaxTessControlAtomicCounterBuffersES3_2 =
+    static constexpr const TSymbolUniqueId gl_MaxGeometryAtomicCounters = TSymbolUniqueId(4848);
+    static constexpr const TSymbolUniqueId gl_MaxGeometryAtomicCountersES3_2 =
         TSymbolUniqueId(4849);
-    static constexpr const TSymbolUniqueId gl_MaxTessPatchComponents      = TSymbolUniqueId(4850);
-    static constexpr const TSymbolUniqueId gl_MaxTessPatchComponentsES3_2 = TSymbolUniqueId(4851);
-    static constexpr const TSymbolUniqueId gl_MaxPatchVertices            = TSymbolUniqueId(4852);
-    static constexpr const TSymbolUniqueId gl_MaxPatchVerticesES3_2       = TSymbolUniqueId(4853);
-    static constexpr const TSymbolUniqueId gl_MaxTessGenLevel             = TSymbolUniqueId(4854);
-    static constexpr const TSymbolUniqueId gl_MaxTessGenLevelES3_2        = TSymbolUniqueId(4855);
-    static constexpr const TSymbolUniqueId gl_MaxTessEvaluationInputComponents =
+    static constexpr const TSymbolUniqueId gl_MaxGeometryAtomicCounterBuffers =
+        TSymbolUniqueId(4850);
+    static constexpr const TSymbolUniqueId gl_MaxGeometryAtomicCounterBuffersES3_2 =
+        TSymbolUniqueId(4851);
+    static constexpr const TSymbolUniqueId gl_MaxTessControlInputComponents = TSymbolUniqueId(4852);
+    static constexpr const TSymbolUniqueId gl_MaxTessControlInputComponentsES3_2 =
+        TSymbolUniqueId(4853);
+    static constexpr const TSymbolUniqueId gl_MaxTessControlOutputComponents =
+        TSymbolUniqueId(4854);
+    static constexpr const TSymbolUniqueId gl_MaxTessControlOutputComponentsES3_2 =
+        TSymbolUniqueId(4855);
+    static constexpr const TSymbolUniqueId gl_MaxTessControlTextureImageUnits =
         TSymbolUniqueId(4856);
-    static constexpr const TSymbolUniqueId gl_MaxTessEvaluationInputComponentsES3_2 =
+    static constexpr const TSymbolUniqueId gl_MaxTessControlTextureImageUnitsES3_2 =
         TSymbolUniqueId(4857);
-    static constexpr const TSymbolUniqueId gl_MaxTessEvaluationOutputComponents =
+    static constexpr const TSymbolUniqueId gl_MaxTessControlUniformComponents =
         TSymbolUniqueId(4858);
-    static constexpr const TSymbolUniqueId gl_MaxTessEvaluationOutputComponentsES3_2 =
+    static constexpr const TSymbolUniqueId gl_MaxTessControlUniformComponentsES3_2 =
         TSymbolUniqueId(4859);
-    static constexpr const TSymbolUniqueId gl_MaxTessEvaluationTextureImageUnits =
+    static constexpr const TSymbolUniqueId gl_MaxTessControlTotalOutputComponents =
         TSymbolUniqueId(4860);
-    static constexpr const TSymbolUniqueId gl_MaxTessEvaluationTextureImageUnitsES3_2 =
+    static constexpr const TSymbolUniqueId gl_MaxTessControlTotalOutputComponentsES3_2 =
         TSymbolUniqueId(4861);
-    static constexpr const TSymbolUniqueId gl_MaxTessEvaluationUniformComponents =
-        TSymbolUniqueId(4862);
-    static constexpr const TSymbolUniqueId gl_MaxTessEvaluationUniformComponentsES3_2 =
+    static constexpr const TSymbolUniqueId gl_MaxTessControlImageUniforms = TSymbolUniqueId(4862);
+    static constexpr const TSymbolUniqueId gl_MaxTessControlImageUniformsES3_2 =
         TSymbolUniqueId(4863);
-    static constexpr const TSymbolUniqueId gl_MaxTessEvaluationImageUniforms =
-        TSymbolUniqueId(4864);
-    static constexpr const TSymbolUniqueId gl_MaxTessEvaluationImageUniformsES3_2 =
+    static constexpr const TSymbolUniqueId gl_MaxTessControlAtomicCounters = TSymbolUniqueId(4864);
+    static constexpr const TSymbolUniqueId gl_MaxTessControlAtomicCountersES3_2 =
         TSymbolUniqueId(4865);
-    static constexpr const TSymbolUniqueId gl_MaxTessEvaluationAtomicCounters =
+    static constexpr const TSymbolUniqueId gl_MaxTessControlAtomicCounterBuffers =
         TSymbolUniqueId(4866);
-    static constexpr const TSymbolUniqueId gl_MaxTessEvaluationAtomicCountersES3_2 =
+    static constexpr const TSymbolUniqueId gl_MaxTessControlAtomicCounterBuffersES3_2 =
         TSymbolUniqueId(4867);
-    static constexpr const TSymbolUniqueId gl_MaxTessEvaluationAtomicCounterBuffers =
-        TSymbolUniqueId(4868);
-    static constexpr const TSymbolUniqueId gl_MaxTessEvaluationAtomicCounterBuffersES3_2 =
-        TSymbolUniqueId(4869);
-    static constexpr const TSymbolUniqueId gl_MaxSamples            = TSymbolUniqueId(4870);
-    static constexpr const TSymbolUniqueId gl_MaxSamplesES3_2       = TSymbolUniqueId(4871);
-    static constexpr const TSymbolUniqueId gl_MaxClipDistancesAPPLE = TSymbolUniqueId(4872);
-    static constexpr const TSymbolUniqueId gl_MaxCullDistancesEXT   = TSymbolUniqueId(4873);
-    static constexpr const TSymbolUniqueId gl_MaxCombinedClipAndCullDistancesEXT =
+    static constexpr const TSymbolUniqueId gl_MaxTessPatchComponents      = TSymbolUniqueId(4868);
+    static constexpr const TSymbolUniqueId gl_MaxTessPatchComponentsES3_2 = TSymbolUniqueId(4869);
+    static constexpr const TSymbolUniqueId gl_MaxPatchVertices            = TSymbolUniqueId(4870);
+    static constexpr const TSymbolUniqueId gl_MaxPatchVerticesES3_2       = TSymbolUniqueId(4871);
+    static constexpr const TSymbolUniqueId gl_MaxTessGenLevel             = TSymbolUniqueId(4872);
+    static constexpr const TSymbolUniqueId gl_MaxTessGenLevelES3_2        = TSymbolUniqueId(4873);
+    static constexpr const TSymbolUniqueId gl_MaxTessEvaluationInputComponents =
         TSymbolUniqueId(4874);
-    static constexpr const TSymbolUniqueId gl_FragCoord                 = TSymbolUniqueId(4875);
-    static constexpr const TSymbolUniqueId gl_FrontFacing               = TSymbolUniqueId(4876);
-    static constexpr const TSymbolUniqueId gl_PointCoord                = TSymbolUniqueId(4877);
-    static constexpr const TSymbolUniqueId gl_FragColor                 = TSymbolUniqueId(4878);
-    static constexpr const TSymbolUniqueId gl_FragData                  = TSymbolUniqueId(4879);
-    static constexpr const TSymbolUniqueId gl_FragDepth                 = TSymbolUniqueId(4880);
-    static constexpr const TSymbolUniqueId gl_HelperInvocation          = TSymbolUniqueId(4881);
-    static constexpr const TSymbolUniqueId gl_SecondaryFragColorEXT     = TSymbolUniqueId(4882);
-    static constexpr const TSymbolUniqueId gl_SecondaryFragDataEXT      = TSymbolUniqueId(4883);
-    static constexpr const TSymbolUniqueId gl_FragDepthEXT              = TSymbolUniqueId(4884);
-    static constexpr const TSymbolUniqueId gl_LastFragData              = TSymbolUniqueId(4885);
-    static constexpr const TSymbolUniqueId gl_LastFragDataNonCoherent   = TSymbolUniqueId(4886);
-    static constexpr const TSymbolUniqueId gl_LastFragColor             = TSymbolUniqueId(4887);
-    static constexpr const TSymbolUniqueId gl_LastFragDataNV            = TSymbolUniqueId(4888);
-    static constexpr const TSymbolUniqueId gl_LastFragColorARM          = TSymbolUniqueId(4889);
-    static constexpr const TSymbolUniqueId gl_PrimitiveID               = TSymbolUniqueId(4890);
-    static constexpr const TSymbolUniqueId gl_PrimitiveIDES3_2          = TSymbolUniqueId(4891);
-    static constexpr const TSymbolUniqueId gl_Layer                     = TSymbolUniqueId(4892);
-    static constexpr const TSymbolUniqueId gl_LayerES3_2                = TSymbolUniqueId(4893);
-    static constexpr const TSymbolUniqueId gl_SampleID                  = TSymbolUniqueId(4894);
-    static constexpr const TSymbolUniqueId gl_SampleIDES3_2             = TSymbolUniqueId(4895);
-    static constexpr const TSymbolUniqueId gl_SamplePosition            = TSymbolUniqueId(4896);
-    static constexpr const TSymbolUniqueId gl_SamplePositionES3_2       = TSymbolUniqueId(4897);
-    static constexpr const TSymbolUniqueId gl_SampleMaskIn              = TSymbolUniqueId(4898);
-    static constexpr const TSymbolUniqueId gl_SampleMaskInES3_2         = TSymbolUniqueId(4899);
-    static constexpr const TSymbolUniqueId gl_SampleMask                = TSymbolUniqueId(4900);
-    static constexpr const TSymbolUniqueId gl_SampleMaskES3_2           = TSymbolUniqueId(4901);
-    static constexpr const TSymbolUniqueId gl_CullDistance              = TSymbolUniqueId(4902);
-    static constexpr const TSymbolUniqueId gl_ClipDistance              = TSymbolUniqueId(4903);
-    static constexpr const TSymbolUniqueId gl_Position                  = TSymbolUniqueId(4904);
-    static constexpr const TSymbolUniqueId gl_PointSize                 = TSymbolUniqueId(4905);
-    static constexpr const TSymbolUniqueId gl_InstanceID                = TSymbolUniqueId(4906);
-    static constexpr const TSymbolUniqueId gl_InstanceIndex             = TSymbolUniqueId(4907);
-    static constexpr const TSymbolUniqueId gl_VertexID                  = TSymbolUniqueId(4908);
-    static constexpr const TSymbolUniqueId gl_VertexIndex               = TSymbolUniqueId(4909);
-    static constexpr const TSymbolUniqueId gl_ViewportIndex             = TSymbolUniqueId(4910);
-    static constexpr const TSymbolUniqueId gl_LayerVS                   = TSymbolUniqueId(4911);
-    static constexpr const TSymbolUniqueId gl_DrawID                    = TSymbolUniqueId(4912);
-    static constexpr const TSymbolUniqueId gl_BaseVertex                = TSymbolUniqueId(4913);
-    static constexpr const TSymbolUniqueId gl_BaseInstance              = TSymbolUniqueId(4914);
-    static constexpr const TSymbolUniqueId angle_BaseVertex             = TSymbolUniqueId(4915);
-    static constexpr const TSymbolUniqueId angle_BaseInstance           = TSymbolUniqueId(4916);
-    static constexpr const TSymbolUniqueId gl_ClipDistanceAPPLE         = TSymbolUniqueId(4917);
-    static constexpr const TSymbolUniqueId gl_CullDistanceEXT           = TSymbolUniqueId(4918);
-    static constexpr const TSymbolUniqueId gl_NumWorkGroups             = TSymbolUniqueId(4919);
-    static constexpr const TSymbolUniqueId gl_WorkGroupSize             = TSymbolUniqueId(4920);
-    static constexpr const TSymbolUniqueId gl_WorkGroupID               = TSymbolUniqueId(4921);
-    static constexpr const TSymbolUniqueId gl_LocalInvocationID         = TSymbolUniqueId(4922);
-    static constexpr const TSymbolUniqueId gl_GlobalInvocationID        = TSymbolUniqueId(4923);
-    static constexpr const TSymbolUniqueId gl_LocalInvocationIndex      = TSymbolUniqueId(4924);
-    static constexpr const TSymbolUniqueId gl_PrimitiveIDIn             = TSymbolUniqueId(4925);
-    static constexpr const TSymbolUniqueId gl_PrimitiveIDInES3_2        = TSymbolUniqueId(4926);
-    static constexpr const TSymbolUniqueId gl_InvocationID              = TSymbolUniqueId(4927);
-    static constexpr const TSymbolUniqueId gl_InvocationIDES3_2         = TSymbolUniqueId(4928);
-    static constexpr const TSymbolUniqueId gl_PrimitiveIDGS             = TSymbolUniqueId(4929);
-    static constexpr const TSymbolUniqueId gl_PrimitiveIDGSES3_2        = TSymbolUniqueId(4930);
-    static constexpr const TSymbolUniqueId gl_LayerGS                   = TSymbolUniqueId(4931);
-    static constexpr const TSymbolUniqueId gl_LayerGSES3_2              = TSymbolUniqueId(4932);
-    static constexpr const TSymbolUniqueId gl_PerVertex                 = TSymbolUniqueId(4933);
-    static constexpr const TSymbolUniqueId gl_PerVertexES3_2            = TSymbolUniqueId(4934);
-    static constexpr const TSymbolUniqueId gl_in                        = TSymbolUniqueId(4935);
-    static constexpr const TSymbolUniqueId gl_inES3_2                   = TSymbolUniqueId(4936);
-    static constexpr const TSymbolUniqueId gl_PerVertexOutBlock         = TSymbolUniqueId(4937);
-    static constexpr const TSymbolUniqueId gl_PerVertexOutBlockES3_2    = TSymbolUniqueId(4938);
-    static constexpr const TSymbolUniqueId gl_PositionGS                = TSymbolUniqueId(4939);
-    static constexpr const TSymbolUniqueId gl_PositionGSES3_2           = TSymbolUniqueId(4940);
-    static constexpr const TSymbolUniqueId gl_PatchVerticesInTCS        = TSymbolUniqueId(4941);
-    static constexpr const TSymbolUniqueId gl_PatchVerticesInTCSES3_2   = TSymbolUniqueId(4942);
-    static constexpr const TSymbolUniqueId gl_InvocationIDTCS           = TSymbolUniqueId(4943);
-    static constexpr const TSymbolUniqueId gl_InvocationIDTCSES3_2      = TSymbolUniqueId(4944);
-    static constexpr const TSymbolUniqueId gl_PrimitiveIDTCS            = TSymbolUniqueId(4945);
-    static constexpr const TSymbolUniqueId gl_PrimitiveIDTCSES3_2       = TSymbolUniqueId(4946);
-    static constexpr const TSymbolUniqueId gl_TessLevelOuterTCS         = TSymbolUniqueId(4947);
-    static constexpr const TSymbolUniqueId gl_TessLevelOuterTCSES3_2    = TSymbolUniqueId(4948);
-    static constexpr const TSymbolUniqueId gl_TessLevelInnerTCS         = TSymbolUniqueId(4949);
-    static constexpr const TSymbolUniqueId gl_TessLevelInnerTCSES3_2    = TSymbolUniqueId(4950);
-    static constexpr const TSymbolUniqueId gl_PerVertexTCS              = TSymbolUniqueId(4951);
-    static constexpr const TSymbolUniqueId gl_PerVertexTCSES3_2         = TSymbolUniqueId(4952);
-    static constexpr const TSymbolUniqueId gl_inTCS                     = TSymbolUniqueId(4953);
-    static constexpr const TSymbolUniqueId gl_inTCSES3_2                = TSymbolUniqueId(4954);
-    static constexpr const TSymbolUniqueId gl_outTCS                    = TSymbolUniqueId(4955);
-    static constexpr const TSymbolUniqueId gl_outTCSES3_2               = TSymbolUniqueId(4956);
-    static constexpr const TSymbolUniqueId gl_PerVertexOutTcsBlock      = TSymbolUniqueId(4957);
-    static constexpr const TSymbolUniqueId gl_PerVertexOutTcsBlockES3_2 = TSymbolUniqueId(4958);
-    static constexpr const TSymbolUniqueId gl_PositionTCS               = TSymbolUniqueId(4959);
-    static constexpr const TSymbolUniqueId gl_PositionTCSES3_2          = TSymbolUniqueId(4960);
-    static constexpr const TSymbolUniqueId gl_PatchVerticesInTES        = TSymbolUniqueId(4961);
-    static constexpr const TSymbolUniqueId gl_PatchVerticesInTESES3_2   = TSymbolUniqueId(4962);
-    static constexpr const TSymbolUniqueId gl_PrimitiveIDTES            = TSymbolUniqueId(4963);
-    static constexpr const TSymbolUniqueId gl_PrimitiveIDTESES3_2       = TSymbolUniqueId(4964);
-    static constexpr const TSymbolUniqueId gl_TessCoord                 = TSymbolUniqueId(4965);
-    static constexpr const TSymbolUniqueId gl_TessLevelOuterTES         = TSymbolUniqueId(4966);
-    static constexpr const TSymbolUniqueId gl_TessLevelOuterTESES3_2    = TSymbolUniqueId(4967);
-    static constexpr const TSymbolUniqueId gl_TessLevelInnerTES         = TSymbolUniqueId(4968);
-    static constexpr const TSymbolUniqueId gl_TessLevelInnerTESES3_2    = TSymbolUniqueId(4969);
-    static constexpr const TSymbolUniqueId gl_PerVertexTES              = TSymbolUniqueId(4970);
-    static constexpr const TSymbolUniqueId gl_PerVertexTESES3_2         = TSymbolUniqueId(4971);
-    static constexpr const TSymbolUniqueId gl_inTES                     = TSymbolUniqueId(4972);
-    static constexpr const TSymbolUniqueId gl_inTESES3_2                = TSymbolUniqueId(4973);
-    static constexpr const TSymbolUniqueId gl_outTES                    = TSymbolUniqueId(4974);
-    static constexpr const TSymbolUniqueId gl_outTESES3_2               = TSymbolUniqueId(4975);
-    static constexpr const TSymbolUniqueId gl_PerVertexOutTesBlock      = TSymbolUniqueId(4976);
-    static constexpr const TSymbolUniqueId gl_PerVertexOutTesBlockES3_2 = TSymbolUniqueId(4977);
-    static constexpr const TSymbolUniqueId gl_PositionTES               = TSymbolUniqueId(4978);
-    static constexpr const TSymbolUniqueId gl_PositionTESES3_2          = TSymbolUniqueId(4979);
-    static constexpr const TSymbolUniqueId gl_ViewID_OVR                = TSymbolUniqueId(4980);
+    static constexpr const TSymbolUniqueId gl_MaxTessEvaluationInputComponentsES3_2 =
+        TSymbolUniqueId(4875);
+    static constexpr const TSymbolUniqueId gl_MaxTessEvaluationOutputComponents =
+        TSymbolUniqueId(4876);
+    static constexpr const TSymbolUniqueId gl_MaxTessEvaluationOutputComponentsES3_2 =
+        TSymbolUniqueId(4877);
+    static constexpr const TSymbolUniqueId gl_MaxTessEvaluationTextureImageUnits =
+        TSymbolUniqueId(4878);
+    static constexpr const TSymbolUniqueId gl_MaxTessEvaluationTextureImageUnitsES3_2 =
+        TSymbolUniqueId(4879);
+    static constexpr const TSymbolUniqueId gl_MaxTessEvaluationUniformComponents =
+        TSymbolUniqueId(4880);
+    static constexpr const TSymbolUniqueId gl_MaxTessEvaluationUniformComponentsES3_2 =
+        TSymbolUniqueId(4881);
+    static constexpr const TSymbolUniqueId gl_MaxTessEvaluationImageUniforms =
+        TSymbolUniqueId(4882);
+    static constexpr const TSymbolUniqueId gl_MaxTessEvaluationImageUniformsES3_2 =
+        TSymbolUniqueId(4883);
+    static constexpr const TSymbolUniqueId gl_MaxTessEvaluationAtomicCounters =
+        TSymbolUniqueId(4884);
+    static constexpr const TSymbolUniqueId gl_MaxTessEvaluationAtomicCountersES3_2 =
+        TSymbolUniqueId(4885);
+    static constexpr const TSymbolUniqueId gl_MaxTessEvaluationAtomicCounterBuffers =
+        TSymbolUniqueId(4886);
+    static constexpr const TSymbolUniqueId gl_MaxTessEvaluationAtomicCounterBuffersES3_2 =
+        TSymbolUniqueId(4887);
+    static constexpr const TSymbolUniqueId gl_MaxSamples            = TSymbolUniqueId(4888);
+    static constexpr const TSymbolUniqueId gl_MaxSamplesES3_2       = TSymbolUniqueId(4889);
+    static constexpr const TSymbolUniqueId gl_MaxClipDistancesAPPLE = TSymbolUniqueId(4890);
+    static constexpr const TSymbolUniqueId gl_MaxCullDistancesEXT   = TSymbolUniqueId(4891);
+    static constexpr const TSymbolUniqueId gl_MaxCombinedClipAndCullDistancesEXT =
+        TSymbolUniqueId(4892);
+    static constexpr const TSymbolUniqueId gl_FragCoord                 = TSymbolUniqueId(4893);
+    static constexpr const TSymbolUniqueId gl_FrontFacing               = TSymbolUniqueId(4894);
+    static constexpr const TSymbolUniqueId gl_PointCoord                = TSymbolUniqueId(4895);
+    static constexpr const TSymbolUniqueId gl_FragColor                 = TSymbolUniqueId(4896);
+    static constexpr const TSymbolUniqueId gl_FragData                  = TSymbolUniqueId(4897);
+    static constexpr const TSymbolUniqueId gl_FragDepth                 = TSymbolUniqueId(4898);
+    static constexpr const TSymbolUniqueId gl_HelperInvocation          = TSymbolUniqueId(4899);
+    static constexpr const TSymbolUniqueId gl_FragCoord300              = TSymbolUniqueId(4900);
+    static constexpr const TSymbolUniqueId gl_SecondaryFragColorEXT     = TSymbolUniqueId(4901);
+    static constexpr const TSymbolUniqueId gl_SecondaryFragDataEXT      = TSymbolUniqueId(4902);
+    static constexpr const TSymbolUniqueId gl_FragDepthEXT              = TSymbolUniqueId(4903);
+    static constexpr const TSymbolUniqueId gl_LastFragData              = TSymbolUniqueId(4904);
+    static constexpr const TSymbolUniqueId gl_LastFragDataNonCoherent   = TSymbolUniqueId(4905);
+    static constexpr const TSymbolUniqueId gl_LastFragColor             = TSymbolUniqueId(4906);
+    static constexpr const TSymbolUniqueId gl_LastFragDataNV            = TSymbolUniqueId(4907);
+    static constexpr const TSymbolUniqueId gl_LastFragColorARM          = TSymbolUniqueId(4908);
+    static constexpr const TSymbolUniqueId gl_PrimitiveID               = TSymbolUniqueId(4909);
+    static constexpr const TSymbolUniqueId gl_PrimitiveIDES3_2          = TSymbolUniqueId(4910);
+    static constexpr const TSymbolUniqueId gl_Layer                     = TSymbolUniqueId(4911);
+    static constexpr const TSymbolUniqueId gl_LayerES3_2                = TSymbolUniqueId(4912);
+    static constexpr const TSymbolUniqueId gl_SampleID                  = TSymbolUniqueId(4913);
+    static constexpr const TSymbolUniqueId gl_SampleIDES3_2             = TSymbolUniqueId(4914);
+    static constexpr const TSymbolUniqueId gl_SamplePosition            = TSymbolUniqueId(4915);
+    static constexpr const TSymbolUniqueId gl_SamplePositionES3_2       = TSymbolUniqueId(4916);
+    static constexpr const TSymbolUniqueId gl_SampleMaskIn              = TSymbolUniqueId(4917);
+    static constexpr const TSymbolUniqueId gl_SampleMaskInES3_2         = TSymbolUniqueId(4918);
+    static constexpr const TSymbolUniqueId gl_SampleMask                = TSymbolUniqueId(4919);
+    static constexpr const TSymbolUniqueId gl_SampleMaskES3_2           = TSymbolUniqueId(4920);
+    static constexpr const TSymbolUniqueId gl_CullDistance              = TSymbolUniqueId(4921);
+    static constexpr const TSymbolUniqueId gl_ClipDistance              = TSymbolUniqueId(4922);
+    static constexpr const TSymbolUniqueId gl_Position                  = TSymbolUniqueId(4923);
+    static constexpr const TSymbolUniqueId gl_PointSize                 = TSymbolUniqueId(4924);
+    static constexpr const TSymbolUniqueId gl_InstanceID                = TSymbolUniqueId(4925);
+    static constexpr const TSymbolUniqueId gl_InstanceIndex             = TSymbolUniqueId(4926);
+    static constexpr const TSymbolUniqueId gl_VertexID                  = TSymbolUniqueId(4927);
+    static constexpr const TSymbolUniqueId gl_VertexIndex               = TSymbolUniqueId(4928);
+    static constexpr const TSymbolUniqueId gl_ViewportIndex             = TSymbolUniqueId(4929);
+    static constexpr const TSymbolUniqueId gl_LayerVS                   = TSymbolUniqueId(4930);
+    static constexpr const TSymbolUniqueId gl_PointSize300              = TSymbolUniqueId(4931);
+    static constexpr const TSymbolUniqueId gl_DrawID                    = TSymbolUniqueId(4932);
+    static constexpr const TSymbolUniqueId gl_BaseVertex                = TSymbolUniqueId(4933);
+    static constexpr const TSymbolUniqueId gl_BaseInstance              = TSymbolUniqueId(4934);
+    static constexpr const TSymbolUniqueId angle_BaseVertex             = TSymbolUniqueId(4935);
+    static constexpr const TSymbolUniqueId angle_BaseInstance           = TSymbolUniqueId(4936);
+    static constexpr const TSymbolUniqueId gl_ClipDistanceAPPLE         = TSymbolUniqueId(4937);
+    static constexpr const TSymbolUniqueId gl_CullDistanceEXT           = TSymbolUniqueId(4938);
+    static constexpr const TSymbolUniqueId gl_NumWorkGroups             = TSymbolUniqueId(4939);
+    static constexpr const TSymbolUniqueId gl_WorkGroupSize             = TSymbolUniqueId(4940);
+    static constexpr const TSymbolUniqueId gl_WorkGroupID               = TSymbolUniqueId(4941);
+    static constexpr const TSymbolUniqueId gl_LocalInvocationID         = TSymbolUniqueId(4942);
+    static constexpr const TSymbolUniqueId gl_GlobalInvocationID        = TSymbolUniqueId(4943);
+    static constexpr const TSymbolUniqueId gl_LocalInvocationIndex      = TSymbolUniqueId(4944);
+    static constexpr const TSymbolUniqueId gl_PrimitiveIDIn             = TSymbolUniqueId(4945);
+    static constexpr const TSymbolUniqueId gl_PrimitiveIDInES3_2        = TSymbolUniqueId(4946);
+    static constexpr const TSymbolUniqueId gl_InvocationID              = TSymbolUniqueId(4947);
+    static constexpr const TSymbolUniqueId gl_InvocationIDES3_2         = TSymbolUniqueId(4948);
+    static constexpr const TSymbolUniqueId gl_PrimitiveIDGS             = TSymbolUniqueId(4949);
+    static constexpr const TSymbolUniqueId gl_PrimitiveIDGSES3_2        = TSymbolUniqueId(4950);
+    static constexpr const TSymbolUniqueId gl_LayerGS                   = TSymbolUniqueId(4951);
+    static constexpr const TSymbolUniqueId gl_LayerGSES3_2              = TSymbolUniqueId(4952);
+    static constexpr const TSymbolUniqueId gl_PerVertex                 = TSymbolUniqueId(4953);
+    static constexpr const TSymbolUniqueId gl_PerVertexES3_2            = TSymbolUniqueId(4954);
+    static constexpr const TSymbolUniqueId gl_in                        = TSymbolUniqueId(4955);
+    static constexpr const TSymbolUniqueId gl_inES3_2                   = TSymbolUniqueId(4956);
+    static constexpr const TSymbolUniqueId gl_PerVertexOutBlock         = TSymbolUniqueId(4957);
+    static constexpr const TSymbolUniqueId gl_PerVertexOutBlockES3_2    = TSymbolUniqueId(4958);
+    static constexpr const TSymbolUniqueId gl_PositionGS                = TSymbolUniqueId(4959);
+    static constexpr const TSymbolUniqueId gl_PositionGSES3_2           = TSymbolUniqueId(4960);
+    static constexpr const TSymbolUniqueId gl_PatchVerticesInTCS        = TSymbolUniqueId(4961);
+    static constexpr const TSymbolUniqueId gl_PatchVerticesInTCSES3_2   = TSymbolUniqueId(4962);
+    static constexpr const TSymbolUniqueId gl_InvocationIDTCS           = TSymbolUniqueId(4963);
+    static constexpr const TSymbolUniqueId gl_InvocationIDTCSES3_2      = TSymbolUniqueId(4964);
+    static constexpr const TSymbolUniqueId gl_PrimitiveIDTCS            = TSymbolUniqueId(4965);
+    static constexpr const TSymbolUniqueId gl_PrimitiveIDTCSES3_2       = TSymbolUniqueId(4966);
+    static constexpr const TSymbolUniqueId gl_TessLevelOuterTCS         = TSymbolUniqueId(4967);
+    static constexpr const TSymbolUniqueId gl_TessLevelOuterTCSES3_2    = TSymbolUniqueId(4968);
+    static constexpr const TSymbolUniqueId gl_TessLevelInnerTCS         = TSymbolUniqueId(4969);
+    static constexpr const TSymbolUniqueId gl_TessLevelInnerTCSES3_2    = TSymbolUniqueId(4970);
+    static constexpr const TSymbolUniqueId gl_PerVertexTCS              = TSymbolUniqueId(4971);
+    static constexpr const TSymbolUniqueId gl_PerVertexTCSES3_2         = TSymbolUniqueId(4972);
+    static constexpr const TSymbolUniqueId gl_inTCS                     = TSymbolUniqueId(4973);
+    static constexpr const TSymbolUniqueId gl_inTCSES3_2                = TSymbolUniqueId(4974);
+    static constexpr const TSymbolUniqueId gl_outTCS                    = TSymbolUniqueId(4975);
+    static constexpr const TSymbolUniqueId gl_outTCSES3_2               = TSymbolUniqueId(4976);
+    static constexpr const TSymbolUniqueId gl_PerVertexOutTcsBlock      = TSymbolUniqueId(4977);
+    static constexpr const TSymbolUniqueId gl_PerVertexOutTcsBlockES3_2 = TSymbolUniqueId(4978);
+    static constexpr const TSymbolUniqueId gl_PositionTCS               = TSymbolUniqueId(4979);
+    static constexpr const TSymbolUniqueId gl_PositionTCSES3_2          = TSymbolUniqueId(4980);
+    static constexpr const TSymbolUniqueId gl_BoundingBoxEXTTCS         = TSymbolUniqueId(4981);
+    static constexpr const TSymbolUniqueId gl_BoundingBoxEXTTCSES3_2    = TSymbolUniqueId(4982);
+    static constexpr const TSymbolUniqueId gl_PatchVerticesInTES        = TSymbolUniqueId(4983);
+    static constexpr const TSymbolUniqueId gl_PatchVerticesInTESES3_2   = TSymbolUniqueId(4984);
+    static constexpr const TSymbolUniqueId gl_PrimitiveIDTES            = TSymbolUniqueId(4985);
+    static constexpr const TSymbolUniqueId gl_PrimitiveIDTESES3_2       = TSymbolUniqueId(4986);
+    static constexpr const TSymbolUniqueId gl_TessCoord                 = TSymbolUniqueId(4987);
+    static constexpr const TSymbolUniqueId gl_TessLevelOuterTES         = TSymbolUniqueId(4988);
+    static constexpr const TSymbolUniqueId gl_TessLevelOuterTESES3_2    = TSymbolUniqueId(4989);
+    static constexpr const TSymbolUniqueId gl_TessLevelInnerTES         = TSymbolUniqueId(4990);
+    static constexpr const TSymbolUniqueId gl_TessLevelInnerTESES3_2    = TSymbolUniqueId(4991);
+    static constexpr const TSymbolUniqueId gl_PerVertexTES              = TSymbolUniqueId(4992);
+    static constexpr const TSymbolUniqueId gl_PerVertexTESES3_2         = TSymbolUniqueId(4993);
+    static constexpr const TSymbolUniqueId gl_inTES                     = TSymbolUniqueId(4994);
+    static constexpr const TSymbolUniqueId gl_inTESES3_2                = TSymbolUniqueId(4995);
+    static constexpr const TSymbolUniqueId gl_outTES                    = TSymbolUniqueId(4996);
+    static constexpr const TSymbolUniqueId gl_outTESES3_2               = TSymbolUniqueId(4997);
+    static constexpr const TSymbolUniqueId gl_PerVertexOutTesBlock      = TSymbolUniqueId(4998);
+    static constexpr const TSymbolUniqueId gl_PerVertexOutTesBlockES3_2 = TSymbolUniqueId(4999);
+    static constexpr const TSymbolUniqueId gl_PositionTES               = TSymbolUniqueId(5000);
+    static constexpr const TSymbolUniqueId gl_PositionTESES3_2          = TSymbolUniqueId(5001);
+    static constexpr const TSymbolUniqueId gl_ViewID_OVR                = TSymbolUniqueId(5002);
 
 };  // class BuiltInId
 
@@ -2946,6 +2965,7 @@
 const TVariable *gl_DrawID();
 const TVariable *gl_FragColor();
 const TVariable *gl_FragCoord();
+const TVariable *gl_FragCoord300();
 const TVariable *gl_FragDepth();
 const TVariable *gl_FrontFacing();
 const TVariable *gl_GlobalInvocationID();
@@ -2974,6 +2994,7 @@
 const TVariable *gl_PatchVerticesInTESES3_2();
 const TVariable *gl_PointCoord();
 const TVariable *gl_PointSize();
+const TVariable *gl_PointSize300();
 const TVariable *gl_Position();
 const TVariable *gl_PrimitiveID();
 const TVariable *gl_PrimitiveIDES3_2();
diff --git a/src/compiler/translator/tree_util/BuiltIn_complete_autogen.h b/src/compiler/translator/tree_util/BuiltIn_complete_autogen.h
index f718196..5c2a83b 100644
--- a/src/compiler/translator/tree_util/BuiltIn_complete_autogen.h
+++ b/src/compiler/translator/tree_util/BuiltIn_complete_autogen.h
@@ -4638,274 +4638,279 @@
     static constexpr const TSymbolUniqueId barrier                          = TSymbolUniqueId(2837);
     static constexpr const TSymbolUniqueId memoryBarrierShared              = TSymbolUniqueId(2838);
     static constexpr const TSymbolUniqueId groupMemoryBarrier               = TSymbolUniqueId(2839);
-    static constexpr const TSymbolUniqueId barrierES3_2                     = TSymbolUniqueId(2840);
-    static constexpr const TSymbolUniqueId EmitVertex                       = TSymbolUniqueId(2841);
-    static constexpr const TSymbolUniqueId EmitVertexES3_2                  = TSymbolUniqueId(2842);
-    static constexpr const TSymbolUniqueId EndPrimitive                     = TSymbolUniqueId(2843);
-    static constexpr const TSymbolUniqueId EndPrimitiveES3_2                = TSymbolUniqueId(2844);
-    static constexpr const TSymbolUniqueId EmitStreamVertex_Int1            = TSymbolUniqueId(2845);
-    static constexpr const TSymbolUniqueId EndStreamPrimitive_Int1          = TSymbolUniqueId(2846);
-    static constexpr const TSymbolUniqueId subpassLoad_SubpassInput1        = TSymbolUniqueId(2847);
-    static constexpr const TSymbolUniqueId pt01g                            = TSymbolUniqueId(2848);
-    static constexpr const TSymbolUniqueId subpassLoad_ISubpassInput1       = TSymbolUniqueId(2849);
-    static constexpr const TSymbolUniqueId pt01h                            = TSymbolUniqueId(2850);
-    static constexpr const TSymbolUniqueId subpassLoad_USubpassInput1       = TSymbolUniqueId(2851);
-    static constexpr const TSymbolUniqueId pt01i                            = TSymbolUniqueId(2852);
-    static constexpr const TSymbolUniqueId subpassLoad_SubpassInputMS1_Int1 = TSymbolUniqueId(2853);
-    static constexpr const TSymbolUniqueId pt01j                            = TSymbolUniqueId(2854);
+    static constexpr const TSymbolUniqueId barrierTCS                       = TSymbolUniqueId(2840);
+    static constexpr const TSymbolUniqueId barrierTCSES3_2                  = TSymbolUniqueId(2841);
+    static constexpr const TSymbolUniqueId EmitVertex                       = TSymbolUniqueId(2842);
+    static constexpr const TSymbolUniqueId EmitVertexES3_2                  = TSymbolUniqueId(2843);
+    static constexpr const TSymbolUniqueId EndPrimitive                     = TSymbolUniqueId(2844);
+    static constexpr const TSymbolUniqueId EndPrimitiveES3_2                = TSymbolUniqueId(2845);
+    static constexpr const TSymbolUniqueId EmitStreamVertex_Int1            = TSymbolUniqueId(2846);
+    static constexpr const TSymbolUniqueId EndStreamPrimitive_Int1          = TSymbolUniqueId(2847);
+    static constexpr const TSymbolUniqueId subpassLoad_SubpassInput1        = TSymbolUniqueId(2848);
+    static constexpr const TSymbolUniqueId pt01g                            = TSymbolUniqueId(2849);
+    static constexpr const TSymbolUniqueId subpassLoad_ISubpassInput1       = TSymbolUniqueId(2850);
+    static constexpr const TSymbolUniqueId pt01h                            = TSymbolUniqueId(2851);
+    static constexpr const TSymbolUniqueId subpassLoad_USubpassInput1       = TSymbolUniqueId(2852);
+    static constexpr const TSymbolUniqueId pt01i                            = TSymbolUniqueId(2853);
+    static constexpr const TSymbolUniqueId subpassLoad_SubpassInputMS1_Int1 = TSymbolUniqueId(2854);
+    static constexpr const TSymbolUniqueId pt01j                            = TSymbolUniqueId(2855);
     static constexpr const TSymbolUniqueId subpassLoad_ISubpassInputMS1_Int1 =
-        TSymbolUniqueId(2855);
-    static constexpr const TSymbolUniqueId pt01k = TSymbolUniqueId(2856);
+        TSymbolUniqueId(2856);
+    static constexpr const TSymbolUniqueId pt01k = TSymbolUniqueId(2857);
     static constexpr const TSymbolUniqueId subpassLoad_USubpassInputMS1_Int1 =
-        TSymbolUniqueId(2857);
-    static constexpr const TSymbolUniqueId pt01l                           = TSymbolUniqueId(2858);
-    static constexpr const TSymbolUniqueId anyInvocation_Bool1             = TSymbolUniqueId(2859);
-    static constexpr const TSymbolUniqueId allInvocations_Bool1            = TSymbolUniqueId(2860);
-    static constexpr const TSymbolUniqueId allInvocationsEqual_Bool1       = TSymbolUniqueId(2861);
-    static constexpr const TSymbolUniqueId gl_DepthRangeParameters         = TSymbolUniqueId(2862);
-    static constexpr const TSymbolUniqueId gl_DepthRange                   = TSymbolUniqueId(2863);
-    static constexpr const TSymbolUniqueId gl_NumSamples                   = TSymbolUniqueId(2864);
-    static constexpr const TSymbolUniqueId gl_NumSamplesES3_2              = TSymbolUniqueId(2865);
-    static constexpr const TSymbolUniqueId gl_MaxVertexAttribs             = TSymbolUniqueId(2866);
-    static constexpr const TSymbolUniqueId gl_MaxVertexUniformVectors      = TSymbolUniqueId(2867);
-    static constexpr const TSymbolUniqueId gl_MaxVertexTextureImageUnits   = TSymbolUniqueId(2868);
-    static constexpr const TSymbolUniqueId gl_MaxCombinedTextureImageUnits = TSymbolUniqueId(2869);
-    static constexpr const TSymbolUniqueId gl_MaxTextureImageUnits         = TSymbolUniqueId(2870);
-    static constexpr const TSymbolUniqueId gl_MaxFragmentUniformVectors    = TSymbolUniqueId(2871);
-    static constexpr const TSymbolUniqueId gl_MaxVaryingVectors            = TSymbolUniqueId(2872);
-    static constexpr const TSymbolUniqueId gl_MaxDrawBuffers               = TSymbolUniqueId(2873);
-    static constexpr const TSymbolUniqueId gl_MaxDualSourceDrawBuffersEXT  = TSymbolUniqueId(2874);
-    static constexpr const TSymbolUniqueId gl_MaxVertexOutputVectors       = TSymbolUniqueId(2875);
-    static constexpr const TSymbolUniqueId gl_MaxFragmentInputVectors      = TSymbolUniqueId(2876);
-    static constexpr const TSymbolUniqueId gl_MinProgramTexelOffset        = TSymbolUniqueId(2877);
-    static constexpr const TSymbolUniqueId gl_MaxProgramTexelOffset        = TSymbolUniqueId(2878);
-    static constexpr const TSymbolUniqueId gl_MaxImageUnits                = TSymbolUniqueId(2879);
-    static constexpr const TSymbolUniqueId gl_MaxVertexImageUniforms       = TSymbolUniqueId(2880);
-    static constexpr const TSymbolUniqueId gl_MaxFragmentImageUniforms     = TSymbolUniqueId(2881);
-    static constexpr const TSymbolUniqueId gl_MaxComputeImageUniforms      = TSymbolUniqueId(2882);
-    static constexpr const TSymbolUniqueId gl_MaxCombinedImageUniforms     = TSymbolUniqueId(2883);
+        TSymbolUniqueId(2858);
+    static constexpr const TSymbolUniqueId pt01l                           = TSymbolUniqueId(2859);
+    static constexpr const TSymbolUniqueId anyInvocation_Bool1             = TSymbolUniqueId(2860);
+    static constexpr const TSymbolUniqueId allInvocations_Bool1            = TSymbolUniqueId(2861);
+    static constexpr const TSymbolUniqueId allInvocationsEqual_Bool1       = TSymbolUniqueId(2862);
+    static constexpr const TSymbolUniqueId gl_DepthRangeParameters         = TSymbolUniqueId(2863);
+    static constexpr const TSymbolUniqueId gl_DepthRange                   = TSymbolUniqueId(2864);
+    static constexpr const TSymbolUniqueId gl_NumSamples                   = TSymbolUniqueId(2865);
+    static constexpr const TSymbolUniqueId gl_NumSamplesES3_2              = TSymbolUniqueId(2866);
+    static constexpr const TSymbolUniqueId gl_MaxVertexAttribs             = TSymbolUniqueId(2867);
+    static constexpr const TSymbolUniqueId gl_MaxVertexUniformVectors      = TSymbolUniqueId(2868);
+    static constexpr const TSymbolUniqueId gl_MaxVertexTextureImageUnits   = TSymbolUniqueId(2869);
+    static constexpr const TSymbolUniqueId gl_MaxCombinedTextureImageUnits = TSymbolUniqueId(2870);
+    static constexpr const TSymbolUniqueId gl_MaxTextureImageUnits         = TSymbolUniqueId(2871);
+    static constexpr const TSymbolUniqueId gl_MaxFragmentUniformVectors    = TSymbolUniqueId(2872);
+    static constexpr const TSymbolUniqueId gl_MaxVaryingVectors            = TSymbolUniqueId(2873);
+    static constexpr const TSymbolUniqueId gl_MaxDrawBuffers               = TSymbolUniqueId(2874);
+    static constexpr const TSymbolUniqueId gl_MaxDualSourceDrawBuffersEXT  = TSymbolUniqueId(2875);
+    static constexpr const TSymbolUniqueId gl_MaxVertexOutputVectors       = TSymbolUniqueId(2876);
+    static constexpr const TSymbolUniqueId gl_MaxFragmentInputVectors      = TSymbolUniqueId(2877);
+    static constexpr const TSymbolUniqueId gl_MinProgramTexelOffset        = TSymbolUniqueId(2878);
+    static constexpr const TSymbolUniqueId gl_MaxProgramTexelOffset        = TSymbolUniqueId(2879);
+    static constexpr const TSymbolUniqueId gl_MaxImageUnits                = TSymbolUniqueId(2880);
+    static constexpr const TSymbolUniqueId gl_MaxVertexImageUniforms       = TSymbolUniqueId(2881);
+    static constexpr const TSymbolUniqueId gl_MaxFragmentImageUniforms     = TSymbolUniqueId(2882);
+    static constexpr const TSymbolUniqueId gl_MaxComputeImageUniforms      = TSymbolUniqueId(2883);
+    static constexpr const TSymbolUniqueId gl_MaxCombinedImageUniforms     = TSymbolUniqueId(2884);
     static constexpr const TSymbolUniqueId gl_MaxCombinedShaderOutputResources =
-        TSymbolUniqueId(2884);
-    static constexpr const TSymbolUniqueId gl_MaxComputeWorkGroupCount    = TSymbolUniqueId(2885);
-    static constexpr const TSymbolUniqueId gl_MaxComputeWorkGroupSize     = TSymbolUniqueId(2886);
-    static constexpr const TSymbolUniqueId gl_MaxComputeUniformComponents = TSymbolUniqueId(2887);
-    static constexpr const TSymbolUniqueId gl_MaxComputeTextureImageUnits = TSymbolUniqueId(2888);
-    static constexpr const TSymbolUniqueId gl_MaxComputeAtomicCounters    = TSymbolUniqueId(2889);
+        TSymbolUniqueId(2885);
+    static constexpr const TSymbolUniqueId gl_MaxComputeWorkGroupCount    = TSymbolUniqueId(2886);
+    static constexpr const TSymbolUniqueId gl_MaxComputeWorkGroupSize     = TSymbolUniqueId(2887);
+    static constexpr const TSymbolUniqueId gl_MaxComputeUniformComponents = TSymbolUniqueId(2888);
+    static constexpr const TSymbolUniqueId gl_MaxComputeTextureImageUnits = TSymbolUniqueId(2889);
+    static constexpr const TSymbolUniqueId gl_MaxComputeAtomicCounters    = TSymbolUniqueId(2890);
     static constexpr const TSymbolUniqueId gl_MaxComputeAtomicCounterBuffers =
-        TSymbolUniqueId(2890);
-    static constexpr const TSymbolUniqueId gl_MaxVertexAtomicCounters       = TSymbolUniqueId(2891);
-    static constexpr const TSymbolUniqueId gl_MaxFragmentAtomicCounters     = TSymbolUniqueId(2892);
-    static constexpr const TSymbolUniqueId gl_MaxCombinedAtomicCounters     = TSymbolUniqueId(2893);
-    static constexpr const TSymbolUniqueId gl_MaxAtomicCounterBindings      = TSymbolUniqueId(2894);
-    static constexpr const TSymbolUniqueId gl_MaxVertexAtomicCounterBuffers = TSymbolUniqueId(2895);
+        TSymbolUniqueId(2891);
+    static constexpr const TSymbolUniqueId gl_MaxVertexAtomicCounters       = TSymbolUniqueId(2892);
+    static constexpr const TSymbolUniqueId gl_MaxFragmentAtomicCounters     = TSymbolUniqueId(2893);
+    static constexpr const TSymbolUniqueId gl_MaxCombinedAtomicCounters     = TSymbolUniqueId(2894);
+    static constexpr const TSymbolUniqueId gl_MaxAtomicCounterBindings      = TSymbolUniqueId(2895);
+    static constexpr const TSymbolUniqueId gl_MaxVertexAtomicCounterBuffers = TSymbolUniqueId(2896);
     static constexpr const TSymbolUniqueId gl_MaxFragmentAtomicCounterBuffers =
-        TSymbolUniqueId(2896);
-    static constexpr const TSymbolUniqueId gl_MaxCombinedAtomicCounterBuffers =
         TSymbolUniqueId(2897);
-    static constexpr const TSymbolUniqueId gl_MaxAtomicCounterBufferSize = TSymbolUniqueId(2898);
-    static constexpr const TSymbolUniqueId gl_MaxGeometryInputComponents = TSymbolUniqueId(2899);
+    static constexpr const TSymbolUniqueId gl_MaxCombinedAtomicCounterBuffers =
+        TSymbolUniqueId(2898);
+    static constexpr const TSymbolUniqueId gl_MaxAtomicCounterBufferSize = TSymbolUniqueId(2899);
+    static constexpr const TSymbolUniqueId gl_MaxGeometryInputComponents = TSymbolUniqueId(2900);
     static constexpr const TSymbolUniqueId gl_MaxGeometryInputComponentsES3_2 =
-        TSymbolUniqueId(2900);
-    static constexpr const TSymbolUniqueId gl_MaxGeometryOutputComponents = TSymbolUniqueId(2901);
+        TSymbolUniqueId(2901);
+    static constexpr const TSymbolUniqueId gl_MaxGeometryOutputComponents = TSymbolUniqueId(2902);
     static constexpr const TSymbolUniqueId gl_MaxGeometryOutputComponentsES3_2 =
-        TSymbolUniqueId(2902);
-    static constexpr const TSymbolUniqueId gl_MaxGeometryImageUniforms      = TSymbolUniqueId(2903);
-    static constexpr const TSymbolUniqueId gl_MaxGeometryImageUniformsES3_2 = TSymbolUniqueId(2904);
-    static constexpr const TSymbolUniqueId gl_MaxGeometryTextureImageUnits  = TSymbolUniqueId(2905);
+        TSymbolUniqueId(2903);
+    static constexpr const TSymbolUniqueId gl_MaxGeometryImageUniforms      = TSymbolUniqueId(2904);
+    static constexpr const TSymbolUniqueId gl_MaxGeometryImageUniformsES3_2 = TSymbolUniqueId(2905);
+    static constexpr const TSymbolUniqueId gl_MaxGeometryTextureImageUnits  = TSymbolUniqueId(2906);
     static constexpr const TSymbolUniqueId gl_MaxGeometryTextureImageUnitsES3_2 =
-        TSymbolUniqueId(2906);
-    static constexpr const TSymbolUniqueId gl_MaxGeometryOutputVertices = TSymbolUniqueId(2907);
+        TSymbolUniqueId(2907);
+    static constexpr const TSymbolUniqueId gl_MaxGeometryOutputVertices = TSymbolUniqueId(2908);
     static constexpr const TSymbolUniqueId gl_MaxGeometryOutputVerticesES3_2 =
-        TSymbolUniqueId(2908);
-    static constexpr const TSymbolUniqueId gl_MaxGeometryTotalOutputComponents =
         TSymbolUniqueId(2909);
-    static constexpr const TSymbolUniqueId gl_MaxGeometryTotalOutputComponentsES3_2 =
+    static constexpr const TSymbolUniqueId gl_MaxGeometryTotalOutputComponents =
         TSymbolUniqueId(2910);
-    static constexpr const TSymbolUniqueId gl_MaxGeometryUniformComponents = TSymbolUniqueId(2911);
+    static constexpr const TSymbolUniqueId gl_MaxGeometryTotalOutputComponentsES3_2 =
+        TSymbolUniqueId(2911);
+    static constexpr const TSymbolUniqueId gl_MaxGeometryUniformComponents = TSymbolUniqueId(2912);
     static constexpr const TSymbolUniqueId gl_MaxGeometryUniformComponentsES3_2 =
-        TSymbolUniqueId(2912);
-    static constexpr const TSymbolUniqueId gl_MaxGeometryAtomicCounters = TSymbolUniqueId(2913);
+        TSymbolUniqueId(2913);
+    static constexpr const TSymbolUniqueId gl_MaxGeometryAtomicCounters = TSymbolUniqueId(2914);
     static constexpr const TSymbolUniqueId gl_MaxGeometryAtomicCountersES3_2 =
-        TSymbolUniqueId(2914);
-    static constexpr const TSymbolUniqueId gl_MaxGeometryAtomicCounterBuffers =
         TSymbolUniqueId(2915);
-    static constexpr const TSymbolUniqueId gl_MaxGeometryAtomicCounterBuffersES3_2 =
+    static constexpr const TSymbolUniqueId gl_MaxGeometryAtomicCounterBuffers =
         TSymbolUniqueId(2916);
-    static constexpr const TSymbolUniqueId gl_MaxTessControlInputComponents = TSymbolUniqueId(2917);
+    static constexpr const TSymbolUniqueId gl_MaxGeometryAtomicCounterBuffersES3_2 =
+        TSymbolUniqueId(2917);
+    static constexpr const TSymbolUniqueId gl_MaxTessControlInputComponents = TSymbolUniqueId(2918);
     static constexpr const TSymbolUniqueId gl_MaxTessControlInputComponentsES3_2 =
-        TSymbolUniqueId(2918);
-    static constexpr const TSymbolUniqueId gl_MaxTessControlOutputComponents =
         TSymbolUniqueId(2919);
-    static constexpr const TSymbolUniqueId gl_MaxTessControlOutputComponentsES3_2 =
+    static constexpr const TSymbolUniqueId gl_MaxTessControlOutputComponents =
         TSymbolUniqueId(2920);
-    static constexpr const TSymbolUniqueId gl_MaxTessControlTextureImageUnits =
+    static constexpr const TSymbolUniqueId gl_MaxTessControlOutputComponentsES3_2 =
         TSymbolUniqueId(2921);
-    static constexpr const TSymbolUniqueId gl_MaxTessControlTextureImageUnitsES3_2 =
+    static constexpr const TSymbolUniqueId gl_MaxTessControlTextureImageUnits =
         TSymbolUniqueId(2922);
-    static constexpr const TSymbolUniqueId gl_MaxTessControlUniformComponents =
+    static constexpr const TSymbolUniqueId gl_MaxTessControlTextureImageUnitsES3_2 =
         TSymbolUniqueId(2923);
-    static constexpr const TSymbolUniqueId gl_MaxTessControlUniformComponentsES3_2 =
+    static constexpr const TSymbolUniqueId gl_MaxTessControlUniformComponents =
         TSymbolUniqueId(2924);
-    static constexpr const TSymbolUniqueId gl_MaxTessControlTotalOutputComponents =
+    static constexpr const TSymbolUniqueId gl_MaxTessControlUniformComponentsES3_2 =
         TSymbolUniqueId(2925);
-    static constexpr const TSymbolUniqueId gl_MaxTessControlTotalOutputComponentsES3_2 =
+    static constexpr const TSymbolUniqueId gl_MaxTessControlTotalOutputComponents =
         TSymbolUniqueId(2926);
-    static constexpr const TSymbolUniqueId gl_MaxTessControlImageUniforms = TSymbolUniqueId(2927);
+    static constexpr const TSymbolUniqueId gl_MaxTessControlTotalOutputComponentsES3_2 =
+        TSymbolUniqueId(2927);
+    static constexpr const TSymbolUniqueId gl_MaxTessControlImageUniforms = TSymbolUniqueId(2928);
     static constexpr const TSymbolUniqueId gl_MaxTessControlImageUniformsES3_2 =
-        TSymbolUniqueId(2928);
-    static constexpr const TSymbolUniqueId gl_MaxTessControlAtomicCounters = TSymbolUniqueId(2929);
+        TSymbolUniqueId(2929);
+    static constexpr const TSymbolUniqueId gl_MaxTessControlAtomicCounters = TSymbolUniqueId(2930);
     static constexpr const TSymbolUniqueId gl_MaxTessControlAtomicCountersES3_2 =
-        TSymbolUniqueId(2930);
-    static constexpr const TSymbolUniqueId gl_MaxTessControlAtomicCounterBuffers =
         TSymbolUniqueId(2931);
-    static constexpr const TSymbolUniqueId gl_MaxTessControlAtomicCounterBuffersES3_2 =
+    static constexpr const TSymbolUniqueId gl_MaxTessControlAtomicCounterBuffers =
         TSymbolUniqueId(2932);
-    static constexpr const TSymbolUniqueId gl_MaxTessPatchComponents      = TSymbolUniqueId(2933);
-    static constexpr const TSymbolUniqueId gl_MaxTessPatchComponentsES3_2 = TSymbolUniqueId(2934);
-    static constexpr const TSymbolUniqueId gl_MaxPatchVertices            = TSymbolUniqueId(2935);
-    static constexpr const TSymbolUniqueId gl_MaxPatchVerticesES3_2       = TSymbolUniqueId(2936);
-    static constexpr const TSymbolUniqueId gl_MaxTessGenLevel             = TSymbolUniqueId(2937);
-    static constexpr const TSymbolUniqueId gl_MaxTessGenLevelES3_2        = TSymbolUniqueId(2938);
+    static constexpr const TSymbolUniqueId gl_MaxTessControlAtomicCounterBuffersES3_2 =
+        TSymbolUniqueId(2933);
+    static constexpr const TSymbolUniqueId gl_MaxTessPatchComponents      = TSymbolUniqueId(2934);
+    static constexpr const TSymbolUniqueId gl_MaxTessPatchComponentsES3_2 = TSymbolUniqueId(2935);
+    static constexpr const TSymbolUniqueId gl_MaxPatchVertices            = TSymbolUniqueId(2936);
+    static constexpr const TSymbolUniqueId gl_MaxPatchVerticesES3_2       = TSymbolUniqueId(2937);
+    static constexpr const TSymbolUniqueId gl_MaxTessGenLevel             = TSymbolUniqueId(2938);
+    static constexpr const TSymbolUniqueId gl_MaxTessGenLevelES3_2        = TSymbolUniqueId(2939);
     static constexpr const TSymbolUniqueId gl_MaxTessEvaluationInputComponents =
-        TSymbolUniqueId(2939);
-    static constexpr const TSymbolUniqueId gl_MaxTessEvaluationInputComponentsES3_2 =
         TSymbolUniqueId(2940);
-    static constexpr const TSymbolUniqueId gl_MaxTessEvaluationOutputComponents =
+    static constexpr const TSymbolUniqueId gl_MaxTessEvaluationInputComponentsES3_2 =
         TSymbolUniqueId(2941);
-    static constexpr const TSymbolUniqueId gl_MaxTessEvaluationOutputComponentsES3_2 =
+    static constexpr const TSymbolUniqueId gl_MaxTessEvaluationOutputComponents =
         TSymbolUniqueId(2942);
-    static constexpr const TSymbolUniqueId gl_MaxTessEvaluationTextureImageUnits =
+    static constexpr const TSymbolUniqueId gl_MaxTessEvaluationOutputComponentsES3_2 =
         TSymbolUniqueId(2943);
-    static constexpr const TSymbolUniqueId gl_MaxTessEvaluationTextureImageUnitsES3_2 =
+    static constexpr const TSymbolUniqueId gl_MaxTessEvaluationTextureImageUnits =
         TSymbolUniqueId(2944);
-    static constexpr const TSymbolUniqueId gl_MaxTessEvaluationUniformComponents =
+    static constexpr const TSymbolUniqueId gl_MaxTessEvaluationTextureImageUnitsES3_2 =
         TSymbolUniqueId(2945);
-    static constexpr const TSymbolUniqueId gl_MaxTessEvaluationUniformComponentsES3_2 =
+    static constexpr const TSymbolUniqueId gl_MaxTessEvaluationUniformComponents =
         TSymbolUniqueId(2946);
-    static constexpr const TSymbolUniqueId gl_MaxTessEvaluationImageUniforms =
+    static constexpr const TSymbolUniqueId gl_MaxTessEvaluationUniformComponentsES3_2 =
         TSymbolUniqueId(2947);
-    static constexpr const TSymbolUniqueId gl_MaxTessEvaluationImageUniformsES3_2 =
+    static constexpr const TSymbolUniqueId gl_MaxTessEvaluationImageUniforms =
         TSymbolUniqueId(2948);
-    static constexpr const TSymbolUniqueId gl_MaxTessEvaluationAtomicCounters =
+    static constexpr const TSymbolUniqueId gl_MaxTessEvaluationImageUniformsES3_2 =
         TSymbolUniqueId(2949);
-    static constexpr const TSymbolUniqueId gl_MaxTessEvaluationAtomicCountersES3_2 =
+    static constexpr const TSymbolUniqueId gl_MaxTessEvaluationAtomicCounters =
         TSymbolUniqueId(2950);
-    static constexpr const TSymbolUniqueId gl_MaxTessEvaluationAtomicCounterBuffers =
+    static constexpr const TSymbolUniqueId gl_MaxTessEvaluationAtomicCountersES3_2 =
         TSymbolUniqueId(2951);
-    static constexpr const TSymbolUniqueId gl_MaxTessEvaluationAtomicCounterBuffersES3_2 =
+    static constexpr const TSymbolUniqueId gl_MaxTessEvaluationAtomicCounterBuffers =
         TSymbolUniqueId(2952);
-    static constexpr const TSymbolUniqueId gl_MaxSamples            = TSymbolUniqueId(2953);
-    static constexpr const TSymbolUniqueId gl_MaxSamplesES3_2       = TSymbolUniqueId(2954);
-    static constexpr const TSymbolUniqueId gl_MaxClipDistancesAPPLE = TSymbolUniqueId(2955);
-    static constexpr const TSymbolUniqueId gl_MaxCullDistancesEXT   = TSymbolUniqueId(2956);
+    static constexpr const TSymbolUniqueId gl_MaxTessEvaluationAtomicCounterBuffersES3_2 =
+        TSymbolUniqueId(2953);
+    static constexpr const TSymbolUniqueId gl_MaxSamples            = TSymbolUniqueId(2954);
+    static constexpr const TSymbolUniqueId gl_MaxSamplesES3_2       = TSymbolUniqueId(2955);
+    static constexpr const TSymbolUniqueId gl_MaxClipDistancesAPPLE = TSymbolUniqueId(2956);
+    static constexpr const TSymbolUniqueId gl_MaxCullDistancesEXT   = TSymbolUniqueId(2957);
     static constexpr const TSymbolUniqueId gl_MaxCombinedClipAndCullDistancesEXT =
-        TSymbolUniqueId(2957);
-    static constexpr const TSymbolUniqueId gl_FragCoord                 = TSymbolUniqueId(2958);
-    static constexpr const TSymbolUniqueId gl_FrontFacing               = TSymbolUniqueId(2959);
-    static constexpr const TSymbolUniqueId gl_PointCoord                = TSymbolUniqueId(2960);
-    static constexpr const TSymbolUniqueId gl_FragColor                 = TSymbolUniqueId(2961);
-    static constexpr const TSymbolUniqueId gl_FragData                  = TSymbolUniqueId(2962);
-    static constexpr const TSymbolUniqueId gl_FragDepth                 = TSymbolUniqueId(2963);
-    static constexpr const TSymbolUniqueId gl_HelperInvocation          = TSymbolUniqueId(2964);
-    static constexpr const TSymbolUniqueId gl_SecondaryFragColorEXT     = TSymbolUniqueId(2965);
-    static constexpr const TSymbolUniqueId gl_SecondaryFragDataEXT      = TSymbolUniqueId(2966);
-    static constexpr const TSymbolUniqueId gl_FragDepthEXT              = TSymbolUniqueId(2967);
-    static constexpr const TSymbolUniqueId gl_LastFragData              = TSymbolUniqueId(2968);
-    static constexpr const TSymbolUniqueId gl_LastFragDataNonCoherent   = TSymbolUniqueId(2969);
-    static constexpr const TSymbolUniqueId gl_LastFragColor             = TSymbolUniqueId(2970);
-    static constexpr const TSymbolUniqueId gl_LastFragDataNV            = TSymbolUniqueId(2971);
-    static constexpr const TSymbolUniqueId gl_LastFragColorARM          = TSymbolUniqueId(2972);
-    static constexpr const TSymbolUniqueId gl_PrimitiveID               = TSymbolUniqueId(2973);
-    static constexpr const TSymbolUniqueId gl_PrimitiveIDES3_2          = TSymbolUniqueId(2974);
-    static constexpr const TSymbolUniqueId gl_Layer                     = TSymbolUniqueId(2975);
-    static constexpr const TSymbolUniqueId gl_LayerES3_2                = TSymbolUniqueId(2976);
-    static constexpr const TSymbolUniqueId gl_SampleID                  = TSymbolUniqueId(2977);
-    static constexpr const TSymbolUniqueId gl_SampleIDES3_2             = TSymbolUniqueId(2978);
-    static constexpr const TSymbolUniqueId gl_SamplePosition            = TSymbolUniqueId(2979);
-    static constexpr const TSymbolUniqueId gl_SamplePositionES3_2       = TSymbolUniqueId(2980);
-    static constexpr const TSymbolUniqueId gl_SampleMaskIn              = TSymbolUniqueId(2981);
-    static constexpr const TSymbolUniqueId gl_SampleMaskInES3_2         = TSymbolUniqueId(2982);
-    static constexpr const TSymbolUniqueId gl_SampleMask                = TSymbolUniqueId(2983);
-    static constexpr const TSymbolUniqueId gl_SampleMaskES3_2           = TSymbolUniqueId(2984);
-    static constexpr const TSymbolUniqueId gl_CullDistance              = TSymbolUniqueId(2985);
-    static constexpr const TSymbolUniqueId gl_ClipDistance              = TSymbolUniqueId(2986);
-    static constexpr const TSymbolUniqueId gl_Position                  = TSymbolUniqueId(2987);
-    static constexpr const TSymbolUniqueId gl_PointSize                 = TSymbolUniqueId(2988);
-    static constexpr const TSymbolUniqueId gl_InstanceID                = TSymbolUniqueId(2989);
-    static constexpr const TSymbolUniqueId gl_InstanceIndex             = TSymbolUniqueId(2990);
-    static constexpr const TSymbolUniqueId gl_VertexID                  = TSymbolUniqueId(2991);
-    static constexpr const TSymbolUniqueId gl_VertexIndex               = TSymbolUniqueId(2992);
-    static constexpr const TSymbolUniqueId gl_ViewportIndex             = TSymbolUniqueId(2993);
-    static constexpr const TSymbolUniqueId gl_LayerVS                   = TSymbolUniqueId(2994);
-    static constexpr const TSymbolUniqueId gl_DrawID                    = TSymbolUniqueId(2995);
-    static constexpr const TSymbolUniqueId gl_BaseVertex                = TSymbolUniqueId(2996);
-    static constexpr const TSymbolUniqueId gl_BaseInstance              = TSymbolUniqueId(2997);
-    static constexpr const TSymbolUniqueId angle_BaseVertex             = TSymbolUniqueId(2998);
-    static constexpr const TSymbolUniqueId angle_BaseInstance           = TSymbolUniqueId(2999);
-    static constexpr const TSymbolUniqueId gl_ClipDistanceAPPLE         = TSymbolUniqueId(3000);
-    static constexpr const TSymbolUniqueId gl_CullDistanceEXT           = TSymbolUniqueId(3001);
-    static constexpr const TSymbolUniqueId gl_NumWorkGroups             = TSymbolUniqueId(3002);
-    static constexpr const TSymbolUniqueId gl_WorkGroupSize             = TSymbolUniqueId(3003);
-    static constexpr const TSymbolUniqueId gl_WorkGroupID               = TSymbolUniqueId(3004);
-    static constexpr const TSymbolUniqueId gl_LocalInvocationID         = TSymbolUniqueId(3005);
-    static constexpr const TSymbolUniqueId gl_GlobalInvocationID        = TSymbolUniqueId(3006);
-    static constexpr const TSymbolUniqueId gl_LocalInvocationIndex      = TSymbolUniqueId(3007);
-    static constexpr const TSymbolUniqueId gl_PrimitiveIDIn             = TSymbolUniqueId(3008);
-    static constexpr const TSymbolUniqueId gl_PrimitiveIDInES3_2        = TSymbolUniqueId(3009);
-    static constexpr const TSymbolUniqueId gl_InvocationID              = TSymbolUniqueId(3010);
-    static constexpr const TSymbolUniqueId gl_InvocationIDES3_2         = TSymbolUniqueId(3011);
-    static constexpr const TSymbolUniqueId gl_PrimitiveIDGS             = TSymbolUniqueId(3012);
-    static constexpr const TSymbolUniqueId gl_PrimitiveIDGSES3_2        = TSymbolUniqueId(3013);
-    static constexpr const TSymbolUniqueId gl_LayerGS                   = TSymbolUniqueId(3014);
-    static constexpr const TSymbolUniqueId gl_LayerGSES3_2              = TSymbolUniqueId(3015);
-    static constexpr const TSymbolUniqueId gl_PerVertex                 = TSymbolUniqueId(3016);
-    static constexpr const TSymbolUniqueId gl_PerVertexES3_2            = TSymbolUniqueId(3017);
-    static constexpr const TSymbolUniqueId gl_in                        = TSymbolUniqueId(3018);
-    static constexpr const TSymbolUniqueId gl_inES3_2                   = TSymbolUniqueId(3019);
-    static constexpr const TSymbolUniqueId gl_PerVertexOutBlock         = TSymbolUniqueId(3020);
-    static constexpr const TSymbolUniqueId gl_PerVertexOutBlockES3_2    = TSymbolUniqueId(3021);
-    static constexpr const TSymbolUniqueId gl_PositionGS                = TSymbolUniqueId(3022);
-    static constexpr const TSymbolUniqueId gl_PositionGSES3_2           = TSymbolUniqueId(3023);
-    static constexpr const TSymbolUniqueId gl_PatchVerticesInTCS        = TSymbolUniqueId(3024);
-    static constexpr const TSymbolUniqueId gl_PatchVerticesInTCSES3_2   = TSymbolUniqueId(3025);
-    static constexpr const TSymbolUniqueId gl_InvocationIDTCS           = TSymbolUniqueId(3026);
-    static constexpr const TSymbolUniqueId gl_InvocationIDTCSES3_2      = TSymbolUniqueId(3027);
-    static constexpr const TSymbolUniqueId gl_PrimitiveIDTCS            = TSymbolUniqueId(3028);
-    static constexpr const TSymbolUniqueId gl_PrimitiveIDTCSES3_2       = TSymbolUniqueId(3029);
-    static constexpr const TSymbolUniqueId gl_TessLevelOuterTCS         = TSymbolUniqueId(3030);
-    static constexpr const TSymbolUniqueId gl_TessLevelOuterTCSES3_2    = TSymbolUniqueId(3031);
-    static constexpr const TSymbolUniqueId gl_TessLevelInnerTCS         = TSymbolUniqueId(3032);
-    static constexpr const TSymbolUniqueId gl_TessLevelInnerTCSES3_2    = TSymbolUniqueId(3033);
-    static constexpr const TSymbolUniqueId gl_PerVertexTCS              = TSymbolUniqueId(3034);
-    static constexpr const TSymbolUniqueId gl_PerVertexTCSES3_2         = TSymbolUniqueId(3035);
-    static constexpr const TSymbolUniqueId gl_inTCS                     = TSymbolUniqueId(3036);
-    static constexpr const TSymbolUniqueId gl_inTCSES3_2                = TSymbolUniqueId(3037);
-    static constexpr const TSymbolUniqueId gl_outTCS                    = TSymbolUniqueId(3038);
-    static constexpr const TSymbolUniqueId gl_outTCSES3_2               = TSymbolUniqueId(3039);
-    static constexpr const TSymbolUniqueId gl_PerVertexOutTcsBlock      = TSymbolUniqueId(3040);
-    static constexpr const TSymbolUniqueId gl_PerVertexOutTcsBlockES3_2 = TSymbolUniqueId(3041);
-    static constexpr const TSymbolUniqueId gl_PositionTCS               = TSymbolUniqueId(3042);
-    static constexpr const TSymbolUniqueId gl_PositionTCSES3_2          = TSymbolUniqueId(3043);
-    static constexpr const TSymbolUniqueId gl_PatchVerticesInTES        = TSymbolUniqueId(3044);
-    static constexpr const TSymbolUniqueId gl_PatchVerticesInTESES3_2   = TSymbolUniqueId(3045);
-    static constexpr const TSymbolUniqueId gl_PrimitiveIDTES            = TSymbolUniqueId(3046);
-    static constexpr const TSymbolUniqueId gl_PrimitiveIDTESES3_2       = TSymbolUniqueId(3047);
-    static constexpr const TSymbolUniqueId gl_TessCoord                 = TSymbolUniqueId(3048);
-    static constexpr const TSymbolUniqueId gl_TessLevelOuterTES         = TSymbolUniqueId(3049);
-    static constexpr const TSymbolUniqueId gl_TessLevelOuterTESES3_2    = TSymbolUniqueId(3050);
-    static constexpr const TSymbolUniqueId gl_TessLevelInnerTES         = TSymbolUniqueId(3051);
-    static constexpr const TSymbolUniqueId gl_TessLevelInnerTESES3_2    = TSymbolUniqueId(3052);
-    static constexpr const TSymbolUniqueId gl_PerVertexTES              = TSymbolUniqueId(3053);
-    static constexpr const TSymbolUniqueId gl_PerVertexTESES3_2         = TSymbolUniqueId(3054);
-    static constexpr const TSymbolUniqueId gl_inTES                     = TSymbolUniqueId(3055);
-    static constexpr const TSymbolUniqueId gl_inTESES3_2                = TSymbolUniqueId(3056);
-    static constexpr const TSymbolUniqueId gl_outTES                    = TSymbolUniqueId(3057);
-    static constexpr const TSymbolUniqueId gl_outTESES3_2               = TSymbolUniqueId(3058);
-    static constexpr const TSymbolUniqueId gl_PerVertexOutTesBlock      = TSymbolUniqueId(3059);
-    static constexpr const TSymbolUniqueId gl_PerVertexOutTesBlockES3_2 = TSymbolUniqueId(3060);
-    static constexpr const TSymbolUniqueId gl_PositionTES               = TSymbolUniqueId(3061);
-    static constexpr const TSymbolUniqueId gl_PositionTESES3_2          = TSymbolUniqueId(3062);
-    static constexpr const TSymbolUniqueId gl_ViewID_OVR                = TSymbolUniqueId(3063);
+        TSymbolUniqueId(2958);
+    static constexpr const TSymbolUniqueId gl_FragCoord                 = TSymbolUniqueId(2959);
+    static constexpr const TSymbolUniqueId gl_FrontFacing               = TSymbolUniqueId(2960);
+    static constexpr const TSymbolUniqueId gl_PointCoord                = TSymbolUniqueId(2961);
+    static constexpr const TSymbolUniqueId gl_FragColor                 = TSymbolUniqueId(2962);
+    static constexpr const TSymbolUniqueId gl_FragData                  = TSymbolUniqueId(2963);
+    static constexpr const TSymbolUniqueId gl_FragDepth                 = TSymbolUniqueId(2964);
+    static constexpr const TSymbolUniqueId gl_HelperInvocation          = TSymbolUniqueId(2965);
+    static constexpr const TSymbolUniqueId gl_FragCoord300              = TSymbolUniqueId(2966);
+    static constexpr const TSymbolUniqueId gl_SecondaryFragColorEXT     = TSymbolUniqueId(2967);
+    static constexpr const TSymbolUniqueId gl_SecondaryFragDataEXT      = TSymbolUniqueId(2968);
+    static constexpr const TSymbolUniqueId gl_FragDepthEXT              = TSymbolUniqueId(2969);
+    static constexpr const TSymbolUniqueId gl_LastFragData              = TSymbolUniqueId(2970);
+    static constexpr const TSymbolUniqueId gl_LastFragDataNonCoherent   = TSymbolUniqueId(2971);
+    static constexpr const TSymbolUniqueId gl_LastFragColor             = TSymbolUniqueId(2972);
+    static constexpr const TSymbolUniqueId gl_LastFragDataNV            = TSymbolUniqueId(2973);
+    static constexpr const TSymbolUniqueId gl_LastFragColorARM          = TSymbolUniqueId(2974);
+    static constexpr const TSymbolUniqueId gl_PrimitiveID               = TSymbolUniqueId(2975);
+    static constexpr const TSymbolUniqueId gl_PrimitiveIDES3_2          = TSymbolUniqueId(2976);
+    static constexpr const TSymbolUniqueId gl_Layer                     = TSymbolUniqueId(2977);
+    static constexpr const TSymbolUniqueId gl_LayerES3_2                = TSymbolUniqueId(2978);
+    static constexpr const TSymbolUniqueId gl_SampleID                  = TSymbolUniqueId(2979);
+    static constexpr const TSymbolUniqueId gl_SampleIDES3_2             = TSymbolUniqueId(2980);
+    static constexpr const TSymbolUniqueId gl_SamplePosition            = TSymbolUniqueId(2981);
+    static constexpr const TSymbolUniqueId gl_SamplePositionES3_2       = TSymbolUniqueId(2982);
+    static constexpr const TSymbolUniqueId gl_SampleMaskIn              = TSymbolUniqueId(2983);
+    static constexpr const TSymbolUniqueId gl_SampleMaskInES3_2         = TSymbolUniqueId(2984);
+    static constexpr const TSymbolUniqueId gl_SampleMask                = TSymbolUniqueId(2985);
+    static constexpr const TSymbolUniqueId gl_SampleMaskES3_2           = TSymbolUniqueId(2986);
+    static constexpr const TSymbolUniqueId gl_CullDistance              = TSymbolUniqueId(2987);
+    static constexpr const TSymbolUniqueId gl_ClipDistance              = TSymbolUniqueId(2988);
+    static constexpr const TSymbolUniqueId gl_Position                  = TSymbolUniqueId(2989);
+    static constexpr const TSymbolUniqueId gl_PointSize                 = TSymbolUniqueId(2990);
+    static constexpr const TSymbolUniqueId gl_InstanceID                = TSymbolUniqueId(2991);
+    static constexpr const TSymbolUniqueId gl_InstanceIndex             = TSymbolUniqueId(2992);
+    static constexpr const TSymbolUniqueId gl_VertexID                  = TSymbolUniqueId(2993);
+    static constexpr const TSymbolUniqueId gl_VertexIndex               = TSymbolUniqueId(2994);
+    static constexpr const TSymbolUniqueId gl_ViewportIndex             = TSymbolUniqueId(2995);
+    static constexpr const TSymbolUniqueId gl_LayerVS                   = TSymbolUniqueId(2996);
+    static constexpr const TSymbolUniqueId gl_PointSize300              = TSymbolUniqueId(2997);
+    static constexpr const TSymbolUniqueId gl_DrawID                    = TSymbolUniqueId(2998);
+    static constexpr const TSymbolUniqueId gl_BaseVertex                = TSymbolUniqueId(2999);
+    static constexpr const TSymbolUniqueId gl_BaseInstance              = TSymbolUniqueId(3000);
+    static constexpr const TSymbolUniqueId angle_BaseVertex             = TSymbolUniqueId(3001);
+    static constexpr const TSymbolUniqueId angle_BaseInstance           = TSymbolUniqueId(3002);
+    static constexpr const TSymbolUniqueId gl_ClipDistanceAPPLE         = TSymbolUniqueId(3003);
+    static constexpr const TSymbolUniqueId gl_CullDistanceEXT           = TSymbolUniqueId(3004);
+    static constexpr const TSymbolUniqueId gl_NumWorkGroups             = TSymbolUniqueId(3005);
+    static constexpr const TSymbolUniqueId gl_WorkGroupSize             = TSymbolUniqueId(3006);
+    static constexpr const TSymbolUniqueId gl_WorkGroupID               = TSymbolUniqueId(3007);
+    static constexpr const TSymbolUniqueId gl_LocalInvocationID         = TSymbolUniqueId(3008);
+    static constexpr const TSymbolUniqueId gl_GlobalInvocationID        = TSymbolUniqueId(3009);
+    static constexpr const TSymbolUniqueId gl_LocalInvocationIndex      = TSymbolUniqueId(3010);
+    static constexpr const TSymbolUniqueId gl_PrimitiveIDIn             = TSymbolUniqueId(3011);
+    static constexpr const TSymbolUniqueId gl_PrimitiveIDInES3_2        = TSymbolUniqueId(3012);
+    static constexpr const TSymbolUniqueId gl_InvocationID              = TSymbolUniqueId(3013);
+    static constexpr const TSymbolUniqueId gl_InvocationIDES3_2         = TSymbolUniqueId(3014);
+    static constexpr const TSymbolUniqueId gl_PrimitiveIDGS             = TSymbolUniqueId(3015);
+    static constexpr const TSymbolUniqueId gl_PrimitiveIDGSES3_2        = TSymbolUniqueId(3016);
+    static constexpr const TSymbolUniqueId gl_LayerGS                   = TSymbolUniqueId(3017);
+    static constexpr const TSymbolUniqueId gl_LayerGSES3_2              = TSymbolUniqueId(3018);
+    static constexpr const TSymbolUniqueId gl_PerVertex                 = TSymbolUniqueId(3019);
+    static constexpr const TSymbolUniqueId gl_PerVertexES3_2            = TSymbolUniqueId(3020);
+    static constexpr const TSymbolUniqueId gl_in                        = TSymbolUniqueId(3021);
+    static constexpr const TSymbolUniqueId gl_inES3_2                   = TSymbolUniqueId(3022);
+    static constexpr const TSymbolUniqueId gl_PerVertexOutBlock         = TSymbolUniqueId(3023);
+    static constexpr const TSymbolUniqueId gl_PerVertexOutBlockES3_2    = TSymbolUniqueId(3024);
+    static constexpr const TSymbolUniqueId gl_PositionGS                = TSymbolUniqueId(3025);
+    static constexpr const TSymbolUniqueId gl_PositionGSES3_2           = TSymbolUniqueId(3026);
+    static constexpr const TSymbolUniqueId gl_PatchVerticesInTCS        = TSymbolUniqueId(3027);
+    static constexpr const TSymbolUniqueId gl_PatchVerticesInTCSES3_2   = TSymbolUniqueId(3028);
+    static constexpr const TSymbolUniqueId gl_InvocationIDTCS           = TSymbolUniqueId(3029);
+    static constexpr const TSymbolUniqueId gl_InvocationIDTCSES3_2      = TSymbolUniqueId(3030);
+    static constexpr const TSymbolUniqueId gl_PrimitiveIDTCS            = TSymbolUniqueId(3031);
+    static constexpr const TSymbolUniqueId gl_PrimitiveIDTCSES3_2       = TSymbolUniqueId(3032);
+    static constexpr const TSymbolUniqueId gl_TessLevelOuterTCS         = TSymbolUniqueId(3033);
+    static constexpr const TSymbolUniqueId gl_TessLevelOuterTCSES3_2    = TSymbolUniqueId(3034);
+    static constexpr const TSymbolUniqueId gl_TessLevelInnerTCS         = TSymbolUniqueId(3035);
+    static constexpr const TSymbolUniqueId gl_TessLevelInnerTCSES3_2    = TSymbolUniqueId(3036);
+    static constexpr const TSymbolUniqueId gl_PerVertexTCS              = TSymbolUniqueId(3037);
+    static constexpr const TSymbolUniqueId gl_PerVertexTCSES3_2         = TSymbolUniqueId(3038);
+    static constexpr const TSymbolUniqueId gl_inTCS                     = TSymbolUniqueId(3039);
+    static constexpr const TSymbolUniqueId gl_inTCSES3_2                = TSymbolUniqueId(3040);
+    static constexpr const TSymbolUniqueId gl_outTCS                    = TSymbolUniqueId(3041);
+    static constexpr const TSymbolUniqueId gl_outTCSES3_2               = TSymbolUniqueId(3042);
+    static constexpr const TSymbolUniqueId gl_PerVertexOutTcsBlock      = TSymbolUniqueId(3043);
+    static constexpr const TSymbolUniqueId gl_PerVertexOutTcsBlockES3_2 = TSymbolUniqueId(3044);
+    static constexpr const TSymbolUniqueId gl_PositionTCS               = TSymbolUniqueId(3045);
+    static constexpr const TSymbolUniqueId gl_PositionTCSES3_2          = TSymbolUniqueId(3046);
+    static constexpr const TSymbolUniqueId gl_BoundingBoxEXTTCS         = TSymbolUniqueId(3047);
+    static constexpr const TSymbolUniqueId gl_BoundingBoxEXTTCSES3_2    = TSymbolUniqueId(3048);
+    static constexpr const TSymbolUniqueId gl_PatchVerticesInTES        = TSymbolUniqueId(3049);
+    static constexpr const TSymbolUniqueId gl_PatchVerticesInTESES3_2   = TSymbolUniqueId(3050);
+    static constexpr const TSymbolUniqueId gl_PrimitiveIDTES            = TSymbolUniqueId(3051);
+    static constexpr const TSymbolUniqueId gl_PrimitiveIDTESES3_2       = TSymbolUniqueId(3052);
+    static constexpr const TSymbolUniqueId gl_TessCoord                 = TSymbolUniqueId(3053);
+    static constexpr const TSymbolUniqueId gl_TessLevelOuterTES         = TSymbolUniqueId(3054);
+    static constexpr const TSymbolUniqueId gl_TessLevelOuterTESES3_2    = TSymbolUniqueId(3055);
+    static constexpr const TSymbolUniqueId gl_TessLevelInnerTES         = TSymbolUniqueId(3056);
+    static constexpr const TSymbolUniqueId gl_TessLevelInnerTESES3_2    = TSymbolUniqueId(3057);
+    static constexpr const TSymbolUniqueId gl_PerVertexTES              = TSymbolUniqueId(3058);
+    static constexpr const TSymbolUniqueId gl_PerVertexTESES3_2         = TSymbolUniqueId(3059);
+    static constexpr const TSymbolUniqueId gl_inTES                     = TSymbolUniqueId(3060);
+    static constexpr const TSymbolUniqueId gl_inTESES3_2                = TSymbolUniqueId(3061);
+    static constexpr const TSymbolUniqueId gl_outTES                    = TSymbolUniqueId(3062);
+    static constexpr const TSymbolUniqueId gl_outTESES3_2               = TSymbolUniqueId(3063);
+    static constexpr const TSymbolUniqueId gl_PerVertexOutTesBlock      = TSymbolUniqueId(3064);
+    static constexpr const TSymbolUniqueId gl_PerVertexOutTesBlockES3_2 = TSymbolUniqueId(3065);
+    static constexpr const TSymbolUniqueId gl_PositionTES               = TSymbolUniqueId(3066);
+    static constexpr const TSymbolUniqueId gl_PositionTESES3_2          = TSymbolUniqueId(3067);
+    static constexpr const TSymbolUniqueId gl_ViewID_OVR                = TSymbolUniqueId(3068);
 
 };  // class BuiltInId
 
@@ -4919,6 +4924,7 @@
 const TVariable *gl_DrawID();
 const TVariable *gl_FragColor();
 const TVariable *gl_FragCoord();
+const TVariable *gl_FragCoord300();
 const TVariable *gl_FragDepth();
 const TVariable *gl_FrontFacing();
 const TVariable *gl_GlobalInvocationID();
@@ -4947,6 +4953,7 @@
 const TVariable *gl_PatchVerticesInTESES3_2();
 const TVariable *gl_PointCoord();
 const TVariable *gl_PointSize();
+const TVariable *gl_PointSize300();
 const TVariable *gl_Position();
 const TVariable *gl_PrimitiveID();
 const TVariable *gl_PrimitiveIDES3_2();
diff --git a/src/compiler/translator/tree_util/DriverUniform.cpp b/src/compiler/translator/tree_util/DriverUniform.cpp
index eb2694e..bb963a5 100644
--- a/src/compiler/translator/tree_util/DriverUniform.cpp
+++ b/src/compiler/translator/tree_util/DriverUniform.cpp
@@ -54,7 +54,7 @@
     TFieldList *driverFieldList = new TFieldList;
 
     const std::array<TType *, kNumComputeDriverUniforms> kDriverUniformTypes = {{
-        new TType(EbtUInt, 4),
+        new TType(EbtUInt, EbpHigh, EvqGlobal, 4),
     }};
 
     for (size_t uniformIndex = 0; uniformIndex < kNumComputeDriverUniforms; ++uniformIndex)
@@ -67,9 +67,12 @@
     }
 
     // Define a driver uniform block "ANGLEUniformBlock" with instance name "ANGLEUniforms".
+    TLayoutQualifier layoutQualifier = TLayoutQualifier::Create();
+    layoutQualifier.blockStorage     = EbsStd140;
+
     mDriverUniforms = DeclareInterfaceBlock(root, symbolTable, driverFieldList, EvqUniform,
-                                            TLayoutQualifier::Create(), TMemoryQualifier::Create(),
-                                            0, ImmutableString(vk::kDriverUniformsBlockName),
+                                            layoutQualifier, TMemoryQualifier::Create(), 0,
+                                            ImmutableString(vk::kDriverUniformsBlockName),
                                             ImmutableString(vk::kDriverUniformsVarName));
     return mDriverUniforms != nullptr;
 }
@@ -85,13 +88,14 @@
     TFieldList *driverFieldList = new TFieldList;
 
     const std::array<TType *, kNumGraphicsDriverUniforms> kDriverUniformTypes = {{
-        new TType(EbtFloat, 4),
-        new TType(EbtUInt),  // uint clipDistancesEnabled;  // 32 bits for 32 clip distances max
-        new TType(EbtUInt),
-        new TType(EbtInt),
-        new TType(EbtInt),
-        new TType(EbtInt, 4),
-        new TType(EbtUInt, 4),
+        new TType(EbtFloat, EbpHigh, EvqGlobal, 4),
+        new TType(EbtUInt, EbpHigh,
+                  EvqGlobal),  // uint clipDistancesEnabled;  // 32 bits for 32 clip distances max
+        new TType(EbtUInt, EbpLow, EvqGlobal),  // uint xfbActiveUnpaused;  // 1 bit
+        new TType(EbtInt, EbpHigh, EvqGlobal),
+        new TType(EbtInt, EbpLow, EvqGlobal),  // uint numSamples;         // Up to 16
+        new TType(EbtInt, EbpHigh, EvqGlobal, 4),
+        new TType(EbtUInt, EbpHigh, EvqGlobal, 4),
         createEmulatedDepthRangeType(symbolTable),
     }};
 
@@ -117,19 +121,16 @@
 
     // Create the depth range type.
     TFieldList *depthRangeParamsFields = new TFieldList();
-    depthRangeParamsFields->push_back(new TField(new TType(EbtFloat, EbpHigh, EvqGlobal, 1, 1),
-                                                 ImmutableString("near"), TSourceLoc(),
-                                                 SymbolType::AngleInternal));
-    depthRangeParamsFields->push_back(new TField(new TType(EbtFloat, EbpHigh, EvqGlobal, 1, 1),
-                                                 ImmutableString("far"), TSourceLoc(),
-                                                 SymbolType::AngleInternal));
-    depthRangeParamsFields->push_back(new TField(new TType(EbtFloat, EbpHigh, EvqGlobal, 1, 1),
-                                                 ImmutableString("diff"), TSourceLoc(),
-                                                 SymbolType::AngleInternal));
+    TType *floatType                   = new TType(EbtFloat, EbpHigh, EvqGlobal, 1, 1);
+    depthRangeParamsFields->push_back(
+        new TField(floatType, ImmutableString("near"), TSourceLoc(), SymbolType::AngleInternal));
+    depthRangeParamsFields->push_back(
+        new TField(floatType, ImmutableString("far"), TSourceLoc(), SymbolType::AngleInternal));
+    depthRangeParamsFields->push_back(
+        new TField(floatType, ImmutableString("diff"), TSourceLoc(), SymbolType::AngleInternal));
     // This additional field might be used by subclass such as TranslatorMetal.
-    depthRangeParamsFields->push_back(new TField(new TType(EbtFloat, EbpHigh, EvqGlobal, 1, 1),
-                                                 ImmutableString("reserved"), TSourceLoc(),
-                                                 SymbolType::AngleInternal));
+    depthRangeParamsFields->push_back(new TField(floatType, ImmutableString("reserved"),
+                                                 TSourceLoc(), SymbolType::AngleInternal));
 
     TStructure *emulatedDepthRangeParams = new TStructure(
         symbolTable, kEmulatedDepthRangeParams, depthRangeParamsFields, SymbolType::AngleInternal);
@@ -164,10 +165,13 @@
     if (mMode == DriverUniformMode::InterfaceBlock)
     {
         // Define a driver uniform block "ANGLEUniformBlock" with instance name "ANGLEUniforms".
-        mDriverUniforms = DeclareInterfaceBlock(
-            root, symbolTable, driverFieldList, EvqUniform, TLayoutQualifier::Create(),
-            TMemoryQualifier::Create(), 0, ImmutableString(vk::kDriverUniformsBlockName),
-            ImmutableString(vk::kDriverUniformsVarName));
+        TLayoutQualifier layoutQualifier = TLayoutQualifier::Create();
+        layoutQualifier.blockStorage     = EbsStd140;
+
+        mDriverUniforms = DeclareInterfaceBlock(root, symbolTable, driverFieldList, EvqUniform,
+                                                layoutQualifier, TMemoryQualifier::Create(), 0,
+                                                ImmutableString(vk::kDriverUniformsBlockName),
+                                                ImmutableString(vk::kDriverUniformsVarName));
     }
     else
     {
@@ -202,7 +206,7 @@
     TConstantUnion *uniformIndex    = new TConstantUnion;
     uniformIndex->setIConst(static_cast<int>(fieldIndex));
     TIntermConstantUnion *indexRef =
-        new TIntermConstantUnion(uniformIndex, *StaticType::GetBasic<EbtInt>());
+        new TIntermConstantUnion(uniformIndex, *StaticType::GetBasic<EbtInt, EbpLow>());
     if (mMode == DriverUniformMode::InterfaceBlock)
     {
         return new TIntermBinary(EOpIndexDirectInterfaceBlock, angleUniformsRef, indexRef);
@@ -271,13 +275,13 @@
                                            kPreRotation}};
 
     const std::array<TType *, kNumGraphicsDriverUniformsExt> kDriverUniformTypesExt = {{
-        new TType(EbtFloat, 2),
-        new TType(EbtFloat, 2),
-        new TType(EbtFloat, 2),
-        new TType(EbtUInt),
-        new TType(EbtUInt),
-        new TType(EbtFloat, 2, 2),
-        new TType(EbtFloat, 2, 2),
+        new TType(EbtFloat, EbpHigh, EvqGlobal, 2),
+        new TType(EbtFloat, EbpLow, EvqGlobal, 2),
+        new TType(EbtFloat, EbpLow, EvqGlobal, 2),
+        new TType(EbtUInt, EbpHigh, EvqGlobal),
+        new TType(EbtUInt, EbpHigh, EvqGlobal),
+        new TType(EbtFloat, EbpLow, EvqGlobal, 2, 2),
+        new TType(EbtFloat, EbpLow, EvqGlobal, 2, 2),
     }};
 
     for (size_t uniformIndex = 0; uniformIndex < kNumGraphicsDriverUniformsExt; ++uniformIndex)
diff --git a/src/compiler/translator/tree_util/FindPreciseNodes.cpp b/src/compiler/translator/tree_util/FindPreciseNodes.cpp
new file mode 100644
index 0000000..2943117
--- /dev/null
+++ b/src/compiler/translator/tree_util/FindPreciseNodes.cpp
@@ -0,0 +1,703 @@
+//
+// Copyright 2021 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.
+//
+// FindPreciseNodes.cpp: Propagates |precise| to AST nodes.
+//
+// The high level algorithm is as follows.  For every node that "assigns" to a precise object,
+// subobject (a precise struct whose field is being assigned) or superobject (a struct with a
+// precise field), two things happen:
+//
+// - The operation is marked precise if it's an arithmetic operation
+// - The right hand side of the assignment is made precise.  If only a subobject is precise, only
+//   the corresponding subobject of the right hand side is made precise.
+//
+
+#include "compiler/translator/tree_util/FindPreciseNodes.h"
+
+#include "common/hash_utils.h"
+#include "compiler/translator/Compiler.h"
+#include "compiler/translator/IntermNode.h"
+#include "compiler/translator/Symbol.h"
+#include "compiler/translator/tree_util/IntermTraverse.h"
+
+namespace sh
+{
+
+namespace
+{
+
+// An access chain applied to a variable.  The |precise|-ness of a node does not change when
+// indexing arrays, selecting matrix columns or swizzle vectors.  This access chain thus only
+// includes block field selections.  The access chain is used to identify the part of an object
+// that is or should be |precise|.  If both a.b.c and a.b are precise, only a.b is every considered.
+class AccessChain
+{
+  public:
+    AccessChain() = default;
+
+    bool operator==(const AccessChain &other) const { return mChain == other.mChain; }
+
+    const TVariable *build(TIntermTyped *lvalue);
+
+    const TVector<size_t> &getChain() const { return mChain; }
+
+    void reduceChain(size_t newSize)
+    {
+        ASSERT(newSize <= mChain.size());
+        mChain.resize(newSize);
+    }
+    void clear() { reduceChain(0); }
+    void push_back(size_t index) { mChain.push_back(index); }
+    void pop_front(size_t n);
+    void append(const AccessChain &other)
+    {
+        mChain.insert(mChain.end(), other.mChain.begin(), other.mChain.end());
+    }
+    bool removePrefix(const AccessChain &other);
+
+  private:
+    TVector<size_t> mChain;
+};
+
+bool IsIndexOp(TOperator op)
+{
+    switch (op)
+    {
+        case EOpIndexDirect:
+        case EOpIndexDirectStruct:
+        case EOpIndexDirectInterfaceBlock:
+        case EOpIndexIndirect:
+            return true;
+        default:
+            return false;
+    }
+}
+
+const TVariable *AccessChain::build(TIntermTyped *lvalue)
+{
+    if (lvalue->getAsSwizzleNode())
+    {
+        return build(lvalue->getAsSwizzleNode()->getOperand());
+    }
+    if (lvalue->getAsSymbolNode())
+    {
+        const TVariable *var = &lvalue->getAsSymbolNode()->variable();
+
+        // For fields of nameless interface blocks, add the field index too.
+        if (var->getType().getInterfaceBlock() != nullptr)
+        {
+            mChain.push_back(var->getType().getInterfaceBlockFieldIndex());
+        }
+
+        return var;
+    }
+    TIntermBinary *binary = lvalue->getAsBinaryNode();
+    ASSERT(binary);
+
+    TOperator op = binary->getOp();
+    ASSERT(IsIndexOp(op));
+
+    const TVariable *var = build(binary->getLeft());
+
+    if (op == EOpIndexDirectStruct || op == EOpIndexDirectInterfaceBlock)
+    {
+        int fieldIndex = binary->getRight()->getAsConstantUnion()->getIConst(0);
+        mChain.push_back(fieldIndex);
+    }
+
+    return var;
+}
+
+void AccessChain::pop_front(size_t n)
+{
+    std::rotate(mChain.begin(), mChain.begin() + n, mChain.end());
+    reduceChain(mChain.size() - n);
+}
+
+bool AccessChain::removePrefix(const AccessChain &other)
+{
+    // First, make sure the common part of the two access chains match.
+    size_t commonSize = std::min(mChain.size(), other.mChain.size());
+
+    for (size_t index = 0; index < commonSize; ++index)
+    {
+        if (mChain[index] != other.mChain[index])
+        {
+            return false;
+        }
+    }
+
+    // Remove the common part from the access chain.  If other is a deeper access chain, this access
+    // chain will become empty.
+    pop_front(commonSize);
+
+    return true;
+}
+
+AccessChain GetAssignmentAccessChain(TIntermOperator *node)
+{
+    // The assignment is either a unary or a binary node, and the lvalue is always the first child.
+    AccessChain lvalueAccessChain;
+    lvalueAccessChain.build(node->getChildNode(0)->getAsTyped());
+    return lvalueAccessChain;
+}
+
+template <typename Traverser>
+void TraverseIndexNodesOnly(TIntermNode *node, Traverser *traverser)
+{
+    if (node->getAsSwizzleNode())
+    {
+        node = node->getAsSwizzleNode()->getOperand();
+    }
+
+    if (node->getAsSymbolNode())
+    {
+        return;
+    }
+
+    TIntermBinary *binary = node->getAsBinaryNode();
+    ASSERT(binary);
+
+    TOperator op = binary->getOp();
+    ASSERT(IsIndexOp(op));
+
+    if (op == EOpIndexIndirect)
+    {
+        binary->getRight()->traverse(traverser);
+    }
+
+    TraverseIndexNodesOnly(binary->getLeft(), traverser);
+}
+
+// An object, which could be a sub-object of a variable.
+struct ObjectAndAccessChain
+{
+    const TVariable *variable;
+    AccessChain accessChain;
+};
+
+bool operator==(const ObjectAndAccessChain &a, const ObjectAndAccessChain &b)
+{
+    return a.variable == b.variable && a.accessChain == b.accessChain;
+}
+
+struct ObjectAndAccessChainHash
+{
+    size_t operator()(const ObjectAndAccessChain &object) const
+    {
+        size_t result = angle::ComputeGenericHash(&object.variable, sizeof(object.variable));
+        if (!object.accessChain.getChain().empty())
+        {
+            result =
+                result ^ angle::ComputeGenericHash(object.accessChain.getChain().data(),
+                                                   object.accessChain.getChain().size() *
+                                                       sizeof(object.accessChain.getChain()[0]));
+        }
+        return result;
+    }
+};
+
+// A map from variables to AST nodes that modify them (i.e. nodes where IsAssignment(op)).
+using VariableToAssignmentNodeMap = angle::HashMap<const TVariable *, TVector<TIntermOperator *>>;
+// A set of |return| nodes from functions with a |precise| return value.
+using PreciseReturnNodes = angle::HashSet<TIntermBranch *>;
+// A set of precise objects that need processing, or have been processed.
+using PreciseObjectSet = angle::HashSet<ObjectAndAccessChain, ObjectAndAccessChainHash>;
+
+struct ASTInfo
+{
+    // Generic information about the tree:
+    VariableToAssignmentNodeMap variableAssignmentNodeMap;
+    // Information pertaining to |precise| expressions:
+    PreciseReturnNodes preciseReturnNodes;
+    PreciseObjectSet preciseObjectsToProcess;
+    PreciseObjectSet preciseObjectsVisited;
+};
+
+int GetObjectPreciseSubChainLength(const ObjectAndAccessChain &object)
+{
+    const TType &type = object.variable->getType();
+
+    if (type.isPrecise())
+    {
+        return 0;
+    }
+
+    const TFieldListCollection *block = type.getInterfaceBlock();
+    if (block == nullptr)
+    {
+        block = type.getStruct();
+    }
+    const TVector<size_t> &accessChain = object.accessChain.getChain();
+
+    for (size_t length = 0; length < accessChain.size(); ++length)
+    {
+        ASSERT(block != nullptr);
+
+        const TField *field = block->fields()[accessChain[length]];
+        if (field->type()->isPrecise())
+        {
+            return static_cast<int>(length + 1);
+        }
+
+        block = field->type()->getStruct();
+    }
+
+    return -1;
+}
+
+void AddPreciseObject(ASTInfo *info, const ObjectAndAccessChain &object)
+{
+    if (info->preciseObjectsVisited.count(object) > 0)
+    {
+        return;
+    }
+
+    info->preciseObjectsToProcess.insert(object);
+    info->preciseObjectsVisited.insert(object);
+}
+
+void AddPreciseSubObjects(ASTInfo *info, const ObjectAndAccessChain &object);
+
+void AddObjectIfPrecise(ASTInfo *info, const ObjectAndAccessChain &object)
+{
+    // See if the access chain is already precise, and if so add the minimum access chain that is
+    // precise.
+    int preciseSubChainLength = GetObjectPreciseSubChainLength(object);
+    if (preciseSubChainLength == -1)
+    {
+        // If the access chain is not precise, see if there are any fields of it that are precise,
+        // and add those individually.
+        AddPreciseSubObjects(info, object);
+        return;
+    }
+
+    ObjectAndAccessChain preciseObject = object;
+    preciseObject.accessChain.reduceChain(preciseSubChainLength);
+
+    AddPreciseObject(info, preciseObject);
+}
+
+void AddPreciseSubObjects(ASTInfo *info, const ObjectAndAccessChain &object)
+{
+    const TFieldListCollection *block = object.variable->getType().getInterfaceBlock();
+    if (block == nullptr)
+    {
+        block = object.variable->getType().getStruct();
+    }
+    const TVector<size_t> &accessChain = object.accessChain.getChain();
+
+    for (size_t length = 0; length < accessChain.size(); ++length)
+    {
+        block = block->fields()[accessChain[length]]->type()->getStruct();
+    }
+
+    if (block == nullptr)
+    {
+        return;
+    }
+
+    for (size_t fieldIndex = 0; fieldIndex < block->fields().size(); ++fieldIndex)
+    {
+        ObjectAndAccessChain subObject = object;
+        subObject.accessChain.push_back(fieldIndex);
+
+        // If the field is precise, add it as a precise subobject.  Otherwise recurse.
+        if (block->fields()[fieldIndex]->type()->isPrecise())
+        {
+            AddPreciseObject(info, subObject);
+        }
+        else
+        {
+            AddPreciseSubObjects(info, subObject);
+        }
+    }
+}
+
+bool IsArithmeticOp(TOperator op)
+{
+    switch (op)
+    {
+        case EOpNegative:
+
+        case EOpPostIncrement:
+        case EOpPostDecrement:
+        case EOpPreIncrement:
+        case EOpPreDecrement:
+
+        case EOpAdd:
+        case EOpSub:
+        case EOpMul:
+        case EOpDiv:
+        case EOpIMod:
+
+        case EOpVectorTimesScalar:
+        case EOpVectorTimesMatrix:
+        case EOpMatrixTimesVector:
+        case EOpMatrixTimesScalar:
+        case EOpMatrixTimesMatrix:
+
+        case EOpAddAssign:
+        case EOpSubAssign:
+
+        case EOpMulAssign:
+        case EOpVectorTimesMatrixAssign:
+        case EOpVectorTimesScalarAssign:
+        case EOpMatrixTimesScalarAssign:
+        case EOpMatrixTimesMatrixAssign:
+
+        case EOpDivAssign:
+        case EOpIModAssign:
+
+        case EOpDot:
+            return true;
+        default:
+            return false;
+    }
+}
+
+// A traverser that gathers the following information, used to kick off processing:
+//
+// - For each variable, the AST nodes that modify it.
+// - The set of |precise| return AST node.
+// - The set of |precise| access chains assigned to.
+//
+class InfoGatherTraverser : public TIntermTraverser
+{
+  public:
+    InfoGatherTraverser(ASTInfo *info) : TIntermTraverser(true, false, false), mInfo(info) {}
+
+    bool visitUnary(Visit visit, TIntermUnary *node) override
+    {
+        // If the node is an assignment (i.e. ++ and --), store the relevant information.
+        if (!IsAssignment(node->getOp()))
+        {
+            return true;
+        }
+
+        visitLvalue(node, node->getOperand());
+        return false;
+    }
+
+    bool visitBinary(Visit visit, TIntermBinary *node) override
+    {
+        if (IsAssignment(node->getOp()))
+        {
+            visitLvalue(node, node->getLeft());
+
+            node->getRight()->traverse(this);
+
+            return false;
+        }
+
+        return true;
+    }
+
+    bool visitDeclaration(Visit visit, TIntermDeclaration *node) override
+    {
+        const TIntermSequence &sequence = *(node->getSequence());
+        TIntermSymbol *symbol           = sequence.front()->getAsSymbolNode();
+        TIntermBinary *initNode         = sequence.front()->getAsBinaryNode();
+        TIntermTyped *initExpression    = nullptr;
+
+        if (symbol == nullptr)
+        {
+            ASSERT(initNode->getOp() == EOpInitialize);
+
+            symbol         = initNode->getLeft()->getAsSymbolNode();
+            initExpression = initNode->getRight();
+        }
+
+        ASSERT(symbol);
+        ObjectAndAccessChain object = {&symbol->variable(), {}};
+        AddObjectIfPrecise(mInfo, object);
+
+        if (initExpression)
+        {
+            mInfo->variableAssignmentNodeMap[object.variable].push_back(initNode);
+
+            // Visit the init expression, which may itself have assignments.
+            initExpression->traverse(this);
+        }
+
+        return false;
+    }
+
+    bool visitFunctionDefinition(Visit visit, TIntermFunctionDefinition *node) override
+    {
+        mCurrentFunction = node->getFunction();
+
+        for (size_t paramIndex = 0; paramIndex < mCurrentFunction->getParamCount(); ++paramIndex)
+        {
+            ObjectAndAccessChain param = {mCurrentFunction->getParam(paramIndex), {}};
+            AddObjectIfPrecise(mInfo, param);
+        }
+
+        return true;
+    }
+
+    bool visitBranch(Visit visit, TIntermBranch *node) override
+    {
+        if (node->getFlowOp() == EOpReturn && node->getChildCount() == 1 &&
+            mCurrentFunction->getReturnType().isPrecise())
+        {
+            mInfo->preciseReturnNodes.insert(node);
+        }
+
+        return true;
+    }
+
+    bool visitGlobalQualifierDeclaration(Visit visit,
+                                         TIntermGlobalQualifierDeclaration *node) override
+    {
+        if (node->isPrecise())
+        {
+            ObjectAndAccessChain preciseObject = {&node->getSymbol()->variable(), {}};
+            AddPreciseObject(mInfo, preciseObject);
+        }
+
+        return false;
+    }
+
+  private:
+    void visitLvalue(TIntermOperator *assignmentNode, TIntermTyped *lvalueNode)
+    {
+        AccessChain lvalueChain;
+        const TVariable *lvalueBase = lvalueChain.build(lvalueNode);
+        mInfo->variableAssignmentNodeMap[lvalueBase].push_back(assignmentNode);
+
+        ObjectAndAccessChain lvalue = {lvalueBase, lvalueChain};
+        AddObjectIfPrecise(mInfo, lvalue);
+
+        TraverseIndexNodesOnly(lvalueNode, this);
+    }
+
+    ASTInfo *mInfo                    = nullptr;
+    const TFunction *mCurrentFunction = nullptr;
+};
+
+// A traverser that, given an access chain, traverses an expression and marks parts of it |precise|.
+// For example, in the expression |Struct1(a, Struct2(b, c), d)|:
+//
+// - Given access chain [1], both |b| and |c| are marked precise.
+// - Given access chain [1, 0], only |b| is marked precise.
+//
+// When access chain is empty, arithmetic nodes are marked |precise| and any access chains found in
+// their children is recursively added for processing.
+//
+// The access chain given to the traverser is derived from the left hand side of an assignment,
+// while the traverser is run on the right hand side.
+class PropagatePreciseTraverser : public TIntermTraverser
+{
+  public:
+    PropagatePreciseTraverser(ASTInfo *info) : TIntermTraverser(true, false, false), mInfo(info) {}
+
+    void propagatePrecise(TIntermNode *expression, const AccessChain &accessChain)
+    {
+        mCurrentAccessChain = accessChain;
+        expression->traverse(this);
+    }
+
+    bool visitUnary(Visit visit, TIntermUnary *node) override
+    {
+        // Unary operations cannot be applied to structures.
+        ASSERT(mCurrentAccessChain.getChain().empty());
+
+        // Mark arithmetic nodes as |precise|.
+        if (IsArithmeticOp(node->getOp()))
+        {
+            node->setIsPrecise();
+        }
+
+        // Mark the operand itself |precise| too.
+        return true;
+    }
+
+    bool visitBinary(Visit visit, TIntermBinary *node) override
+    {
+        if (IsIndexOp(node->getOp()))
+        {
+            // Append the remaining access chain with that of the node, and mark that as |precise|.
+            // For example, if we are evaluating an expression and expecting to mark the access
+            // chain [1, 3] as |precise|, and the node itself has access chain [0, 2] applied to
+            // variable V, then what ends up being |precise| is V with access chain [0, 2, 1, 3].
+            AccessChain nodeAccessChain;
+            const TVariable *baseVariable = nodeAccessChain.build(node);
+            nodeAccessChain.append(mCurrentAccessChain);
+
+            ObjectAndAccessChain preciseObject = {baseVariable, nodeAccessChain};
+            AddPreciseObject(mInfo, preciseObject);
+
+            // Visit index nodes, each of which should be considered |precise| in its entirety.
+            mCurrentAccessChain.clear();
+            TraverseIndexNodesOnly(node, this);
+
+            return false;
+        }
+
+        if (node->getOp() == EOpComma)
+        {
+            // For expr1,expr2, consider only expr2 as that's the one whose calculation is relevant.
+            node->getRight()->traverse(this);
+            return false;
+        }
+
+        // Mark arithmetic nodes as |precise|.
+        if (IsArithmeticOp(node->getOp()))
+        {
+            node->setIsPrecise();
+        }
+
+        if (IsAssignment(node->getOp()) || node->getOp() == EOpInitialize)
+        {
+            // If the node itself is a[...] op= expr, consider only expr as |precise|, as that's the
+            // one whose calculation is significant.
+            node->getRight()->traverse(this);
+
+            // The indices used on the left hand side are also significant in their entirety.
+            mCurrentAccessChain.clear();
+            TraverseIndexNodesOnly(node->getLeft(), this);
+
+            return false;
+        }
+
+        // Binary operations cannot be applied to structures.
+        ASSERT(mCurrentAccessChain.getChain().empty());
+
+        // Mark the operands themselves |precise| too.
+        return true;
+    }
+
+    void visitSymbol(TIntermSymbol *symbol) override
+    {
+        // Mark the symbol together with the current access chain as |precise|.
+        ObjectAndAccessChain preciseObject = {&symbol->variable(), mCurrentAccessChain};
+        AddPreciseObject(mInfo, preciseObject);
+    }
+
+    bool visitAggregate(Visit visit, TIntermAggregate *node) override
+    {
+        // If this is a struct constructor and the access chain is not empty, only apply |precise|
+        // to the field selected by the access chain.
+        const TType &type = node->getType();
+        const bool isStructConstructor =
+            node->getOp() == EOpConstruct && type.getStruct() != nullptr && !type.isArray();
+
+        if (!mCurrentAccessChain.getChain().empty() && isStructConstructor)
+        {
+            size_t selectedFieldIndex = mCurrentAccessChain.getChain().front();
+            mCurrentAccessChain.pop_front(1);
+
+            ASSERT(selectedFieldIndex < node->getChildCount());
+
+            // Visit only said field.
+            node->getChildNode(selectedFieldIndex)->traverse(this);
+            return false;
+        }
+
+        // If this is an array constructor, each element is equally |precise| with the same access
+        // chain.  Otherwise there cannot be any access chain for constructors.
+        if (node->getOp() == EOpConstruct)
+        {
+            ASSERT(type.isArray() || mCurrentAccessChain.getChain().empty());
+            return true;
+        }
+
+        // Otherwise this is a function call.  The access chain is irrelevant and every (non-out)
+        // parameter of the function call should be considered |precise|.
+        mCurrentAccessChain.clear();
+
+        const TFunction *function = node->getFunction();
+        ASSERT(function);
+
+        for (size_t paramIndex = 0; paramIndex < function->getParamCount(); ++paramIndex)
+        {
+            if (function->getParam(paramIndex)->getType().getQualifier() != EvqParamOut)
+            {
+                node->getChildNode(paramIndex)->traverse(this);
+            }
+        }
+
+        // Mark arithmetic nodes as |precise|.
+        if (IsArithmeticOp(node->getOp()))
+        {
+            node->setIsPrecise();
+        }
+
+        return false;
+    }
+
+  private:
+    ASTInfo *mInfo = nullptr;
+    AccessChain mCurrentAccessChain;
+};
+}  // anonymous namespace
+
+void FindPreciseNodes(TCompiler *compiler, TIntermBlock *root)
+{
+    ASTInfo info;
+
+    InfoGatherTraverser infoGather(&info);
+    root->traverse(&infoGather);
+
+    PropagatePreciseTraverser propagator(&info);
+
+    // First, get return expressions out of the way by propagating |precise|.
+    for (TIntermBranch *returnNode : info.preciseReturnNodes)
+    {
+        ASSERT(returnNode->getChildCount() == 1);
+        propagator.propagatePrecise(returnNode->getChildNode(0), {});
+    }
+
+    // Now take |precise| access chains one by one, and propagate their |precise|-ness to the right
+    // hand side of all assignments in which they are on the left hand side, as well as the
+    // arithmetic expression that assigns to them.
+
+    while (!info.preciseObjectsToProcess.empty())
+    {
+        // Get one |precise| object to process.
+        auto first                           = info.preciseObjectsToProcess.begin();
+        const ObjectAndAccessChain toProcess = *first;
+        info.preciseObjectsToProcess.erase(first);
+
+        // Propagate |precise| to every node where it's assigned to.
+        const TVector<TIntermOperator *> &assignmentNodes =
+            info.variableAssignmentNodeMap[toProcess.variable];
+        for (TIntermOperator *assignmentNode : assignmentNodes)
+        {
+            AccessChain assignmentAccessChain = GetAssignmentAccessChain(assignmentNode);
+
+            // There are two possibilities:
+            //
+            // - The assignment is to a bigger access chain than that which is being processed, in
+            //   which case the entire right hand side is marked |precise|,
+            // - The assignment is to a smaller access chain, in which case only the subobject of
+            //   the right hand side that corresponds to the remaining part of the access chain must
+            //   be marked |precise|.
+            //
+            // For example, if processing |a.b.c| as a |precise| access chain:
+            //
+            // - If the assignment is to |a.b.c.d|, then the entire right hand side must be
+            //   |precise|.
+            // - If the assignment is to |a.b|, only the |.c| part of the right hand side expression
+            //   must be |precise|.
+            // - If the assignment is to |a.e|, there is nothing to do.
+            //
+            AccessChain remainingAccessChain = toProcess.accessChain;
+            if (!remainingAccessChain.removePrefix(assignmentAccessChain))
+            {
+                continue;
+            }
+
+            propagator.propagatePrecise(assignmentNode, remainingAccessChain);
+        }
+    }
+
+    // The AST nodes now contain information gathered by this post-processing step, and so the tree
+    // must no longer be transformed.
+    compiler->enableValidateNoMoreTransformations();
+}
+
+}  // namespace sh
diff --git a/src/compiler/translator/tree_util/FindPreciseNodes.h b/src/compiler/translator/tree_util/FindPreciseNodes.h
new file mode 100644
index 0000000..1992ff1
--- /dev/null
+++ b/src/compiler/translator/tree_util/FindPreciseNodes.h
@@ -0,0 +1,25 @@
+//
+// Copyright 2021 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.
+//
+// FindPreciseNodes.h: Propagates |precise| to AST nodes.  In SPIR-V, the corresponding decoration
+// (NoContraction) is applied on the intermediate result of operations that affect the |precise|
+// variables, not the variables themselves.
+
+#ifndef COMPILER_TRANSLATOR_TREEUTIL_FINDPRECISENODES_H_
+#define COMPILER_TRANSLATOR_TREEUTIL_FINDPRECISENODES_H_
+
+#include "common/angleutils.h"
+
+namespace sh
+{
+
+class TCompiler;
+class TIntermBlock;
+
+void FindPreciseNodes(TCompiler *compiler, TIntermBlock *root);
+
+}  // namespace sh
+
+#endif  // COMPILER_TRANSLATOR_TREEUTIL_FINDPRECISENODES_H_
diff --git a/src/compiler/translator/tree_util/IntermNode_util.cpp b/src/compiler/translator/tree_util/IntermNode_util.cpp
index 0bdc93f..4ee2a40 100644
--- a/src/compiler/translator/tree_util/IntermNode_util.cpp
+++ b/src/compiler/translator/tree_util/IntermNode_util.cpp
@@ -74,7 +74,7 @@
                     // CreateZeroNode is called by ParseContext that keeps parsing even when an
                     // error occurs, so it is possible for CreateZeroNode to be called with
                     // non-basic types. This happens only on error condition but CreateZeroNode
-                    // needs to return a value with the correct type to continue the typecheck.
+                    // needs to return a value with the correct type to continue the type check.
                     // That's why we handle non-basic type by setting whatever value, we just need
                     // the type to be right.
                     u[i].setIConst(42);
@@ -113,12 +113,12 @@
     return TIntermAggregate::CreateConstructor(constType, &arguments);
 }
 
-TIntermConstantUnion *CreateFloatNode(float value)
+TIntermConstantUnion *CreateFloatNode(float value, TPrecision precision)
 {
     TConstantUnion *u = new TConstantUnion[1];
     u[0].setFConst(value);
 
-    TType type(EbtFloat, EbpUndefined, EvqConst, 1);
+    TType type(EbtFloat, precision, EvqConst, 1);
     return new TIntermConstantUnion(u, type);
 }
 
@@ -127,7 +127,7 @@
     TConstantUnion *u = new TConstantUnion[1];
     u[0].setIConst(index);
 
-    TType type(EbtInt, EbpUndefined, EvqConst, 1);
+    TType type(EbtInt, EbpHigh, EvqConst, 1);
     return new TIntermConstantUnion(u, type);
 }
 
@@ -136,7 +136,7 @@
     TConstantUnion *u = new TConstantUnion[1];
     u[0].setUConst(value);
 
-    TType type(EbtUInt, EbpUndefined, EvqConst, 1);
+    TType type(EbtUInt, EbpHigh, EvqConst, 1);
     return new TIntermConstantUnion(u, type);
 }
 
@@ -323,9 +323,9 @@
 
 TIntermSymbol *ReferenceGlobalVariable(const ImmutableString &name, const TSymbolTable &symbolTable)
 {
-    const TVariable *var = static_cast<const TVariable *>(symbolTable.findGlobal(name));
-    ASSERT(var);
-    return new TIntermSymbol(var);
+    const TSymbol *symbol = symbolTable.findGlobal(name);
+    ASSERT(symbol && symbol->isVariable());
+    return new TIntermSymbol(static_cast<const TVariable *>(symbol));
 }
 
 TIntermSymbol *ReferenceBuiltInVariable(const ImmutableString &name,
diff --git a/src/compiler/translator/tree_util/IntermNode_util.h b/src/compiler/translator/tree_util/IntermNode_util.h
index 165dcf6..4fe6ad9 100644
--- a/src/compiler/translator/tree_util/IntermNode_util.h
+++ b/src/compiler/translator/tree_util/IntermNode_util.h
@@ -23,7 +23,7 @@
                                                                 TIntermBlock *functionBody);
 
 TIntermTyped *CreateZeroNode(const TType &type);
-TIntermConstantUnion *CreateFloatNode(float value);
+TIntermConstantUnion *CreateFloatNode(float value, TPrecision precision);
 TIntermConstantUnion *CreateIndexNode(int index);
 TIntermConstantUnion *CreateUIntNode(unsigned int value);
 TIntermConstantUnion *CreateBoolNode(bool value);
diff --git a/src/compiler/translator/TranslatorMetalDirect/IntermRebuild.cpp b/src/compiler/translator/tree_util/IntermRebuild.cpp
similarity index 97%
rename from src/compiler/translator/TranslatorMetalDirect/IntermRebuild.cpp
rename to src/compiler/translator/tree_util/IntermRebuild.cpp
index bc49927..4661571 100644
--- a/src/compiler/translator/TranslatorMetalDirect/IntermRebuild.cpp
+++ b/src/compiler/translator/tree_util/IntermRebuild.cpp
@@ -8,8 +8,8 @@
 
 #include "compiler/translator/Compiler.h"
 #include "compiler/translator/SymbolTable.h"
-#include "compiler/translator/TranslatorMetalDirect/IntermRebuild.h"
 #include "compiler/translator/tree_util/AsNode.h"
+#include "compiler/translator/tree_util/IntermRebuild.h"
 
 #define GUARD2(cond, failVal) \
     do                        \
@@ -251,7 +251,7 @@
         return true;
     }
     out = asNode<Node>(result.mSingle);
-    return out;
+    return out != nullptr;
 }
 
 bool TIntermRebuild::traverseAggregateBaseChildren(TIntermAggregateBase &node)
@@ -286,6 +286,10 @@
 
             case Action::Fail:
                 return false;
+
+            default:
+                ASSERT(false);
+                return false;
         }
     }
 
@@ -382,6 +386,9 @@
             return visitLoopPre(*originalNode.getAsLoopNode());
         case NodeType::Branch:
             return visitBranchPre(*originalNode.getAsBranchNode());
+        default:
+            ASSERT(false);
+            return Fail();
     }
 }
 
@@ -445,6 +452,9 @@
             return traverseLoopChildren(*currNode.getAsLoopNode());
         case NodeType::Branch:
             return traverseBranchChildren(*currNode.getAsBranchNode());
+        default:
+            ASSERT(false);
+            return nullptr;
     }
 }
 
@@ -513,6 +523,9 @@
             return visitLoopPost(*currNode.getAsLoopNode());
         case NodeType::Branch:
             return visitBranchPost(*currNode.getAsBranchNode());
+        default:
+            ASSERT(false);
+            return Fail();
     }
 }
 
@@ -781,6 +794,9 @@
             ASSERT(cond);
             ASSERT(!init && !expr);
             break;
+        default:
+            ASSERT(false);
+            break;
     }
 #endif
 
@@ -814,6 +830,9 @@
                 GUARD(newCond && newBody);
                 GUARD(!newInit && !newExpr);
                 break;
+            default:
+                ASSERT(false);
+                break;
         }
         return new TIntermLoop(loopType, newInit, newCond, newExpr, newBody);
     }
diff --git a/src/compiler/translator/tree_util/IntermRebuild.h b/src/compiler/translator/tree_util/IntermRebuild.h
new file mode 100644
index 0000000..675d747
--- /dev/null
+++ b/src/compiler/translator/tree_util/IntermRebuild.h
@@ -0,0 +1,328 @@
+//
+// Copyright 2020 The ANGLE Project Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+//
+
+#ifndef COMPILER_TRANSLATOR_TRANSLATORMETALDIRECT_INTERMREBUILD_H_
+#define COMPILER_TRANSLATOR_TRANSLATORMETALDIRECT_INTERMREBUILD_H_
+
+#include "compiler/translator/tree_util/IntermTraverse.h"
+#include "compiler/translator/tree_util/NodeType.h"
+
+namespace sh
+{
+
+// Walks the tree to rebuild nodes.
+// This class is intended to be derived with overridden visitXXX functions.
+//
+// Each visitXXX function that does not have a Visit parameter simply has the visitor called
+// exactly once, regardless of (preVisit) or (postVisit) values.
+
+// Each visitXXX function that has a Visit parameter behaves as follows:
+//    * If (preVisit):
+//      - The node is visited before children are traversed.
+//      - The returned value is used to replace the visited node. The returned value may be the same
+//        as the original node.
+//      - If multiple nodes are returned, children and post visits of the returned nodes are not
+//        preformed, even if it is a singleton collection.
+//    * If (childVisit)
+//      - If any new children are returned, the node is automatically rebuilt with the new children
+//        before post visit.
+//      - Depending on the type of the node, null children may be discarded.
+//      - Ill-typed children cause rebuild errors. Ill-typed means the node to automatically rebuild
+//        cannot accept a child of a certain type as input to its constructor.
+//      - Only instances of TIntermAggregateBase can accept Multi results for any of its children.
+//        If supplied, the nodes are spliced children at the spot of the original child.
+//    * If (postVisit)
+//      - The node is visited after any children are traversed.
+//      - Only after such a rebuild (or lack thereof), the post-visit is performed.
+//
+// Nodes in visit functions are allowed to be modified in place, including TIntermAggregateBase
+// child sequences.
+//
+// The default implementations of all the visitXXX functions support full pre and post traversal
+// without modifying the visited nodes.
+//
+class TIntermRebuild : angle::NonCopyable
+{
+
+    enum class Action
+    {
+        ReplaceSingle,
+        ReplaceMulti,
+        Drop,
+        Fail,
+    };
+
+  public:
+    struct Fail
+    {};
+
+    enum VisitBits : size_t
+    {
+        // No bits are set.
+        Empty = 0u,
+
+        // Allow visit of returned node's children.
+        Children = 1u << 0u,
+
+        // Allow post visit of returned node.
+        Post = 1u << 1u,
+
+        // If (Children) bit, only visit if the returned node is the same as the original node.
+        ChildrenRequiresSame = 1u << 2u,
+
+        // If (Post) bit, only visit if the returned node is the same as the original node.
+        PostRequiresSame = 1u << 3u,
+
+        RequireSame  = ChildrenRequiresSame | PostRequiresSame,
+        Neither      = Empty,
+        Both         = Children | Post,
+        BothWhenSame = Both | RequireSame,
+    };
+
+  private:
+    struct NodeStackGuard;
+
+    template <typename T>
+    struct ConsList
+    {
+        T value;
+        ConsList<T> *tail;
+    };
+
+    class BaseResult
+    {
+        BaseResult(const BaseResult &) = delete;
+        BaseResult &operator=(const BaseResult &) = delete;
+
+      public:
+        BaseResult(BaseResult &&other) = default;
+        BaseResult(BaseResult &other);  // For subclass move constructor impls
+        BaseResult(TIntermNode &node, VisitBits visit);
+        BaseResult(TIntermNode *node, VisitBits visit);
+        BaseResult(nullptr_t);
+        BaseResult(Fail);
+        BaseResult(std::vector<TIntermNode *> &&nodes);
+
+        void moveAssignImpl(BaseResult &other);  // For subclass move assign impls
+
+        static BaseResult Multi(std::vector<TIntermNode *> &&nodes);
+
+        template <typename Iter>
+        static BaseResult Multi(Iter nodesBegin, Iter nodesEnd)
+        {
+            std::vector<TIntermNode *> nodes;
+            for (Iter nodesCurr = nodesBegin; nodesCurr != nodesEnd; ++nodesCurr)
+            {
+                nodes.push_back(*nodesCurr);
+            }
+            return std::move(nodes);
+        }
+
+        bool isFail() const;
+        bool isDrop() const;
+        TIntermNode *single() const;
+        const std::vector<TIntermNode *> *multi() const;
+
+      public:
+        Action mAction;
+        VisitBits mVisit;
+        TIntermNode *mSingle;
+        std::vector<TIntermNode *> mMulti;
+    };
+
+  public:
+    class PreResult : private BaseResult
+    {
+        friend class TIntermRebuild;
+
+      public:
+        PreResult(PreResult &&other);
+        PreResult(TIntermNode &node, VisitBits visit = VisitBits::BothWhenSame);
+        PreResult(TIntermNode *node, VisitBits visit = VisitBits::BothWhenSame);
+        PreResult(nullptr_t);  // Used to drop a node.
+        PreResult(Fail);       // Used to signal failure.
+
+        void operator=(PreResult &&other);
+
+        static PreResult Multi(std::vector<TIntermNode *> &&nodes)
+        {
+            return BaseResult::Multi(std::move(nodes));
+        }
+
+        template <typename Iter>
+        static PreResult Multi(Iter nodesBegin, Iter nodesEnd)
+        {
+            return BaseResult::Multi(nodesBegin, nodesEnd);
+        }
+
+        using BaseResult::isDrop;
+        using BaseResult::isFail;
+        using BaseResult::multi;
+        using BaseResult::single;
+
+      private:
+        PreResult(BaseResult &&other);
+    };
+
+    class PostResult : private BaseResult
+    {
+        friend class TIntermRebuild;
+
+      public:
+        PostResult(PostResult &&other);
+        PostResult(TIntermNode &node);
+        PostResult(TIntermNode *node);
+        PostResult(nullptr_t);  // Used to drop a node
+        PostResult(Fail);       // Used to signal failure.
+
+        void operator=(PostResult &&other);
+
+        static PostResult Multi(std::vector<TIntermNode *> &&nodes)
+        {
+            return BaseResult::Multi(std::move(nodes));
+        }
+
+        template <typename Iter>
+        static PostResult Multi(Iter nodesBegin, Iter nodesEnd)
+        {
+            return BaseResult::Multi(nodesBegin, nodesEnd);
+        }
+
+        using BaseResult::isDrop;
+        using BaseResult::isFail;
+        using BaseResult::multi;
+        using BaseResult::single;
+
+      private:
+        PostResult(BaseResult &&other);
+    };
+
+  public:
+    TIntermRebuild(TCompiler &compiler, bool preVisit, bool postVisit);
+
+    virtual ~TIntermRebuild();
+
+    // Rebuilds the tree starting at the provided root. If a new node would be returned for the
+    // root, the root node's children become that of the new node instead. Returns false if failure
+    // occurred.
+    ANGLE_NO_DISCARD bool rebuildRoot(TIntermBlock &root);
+
+  protected:
+    virtual PreResult visitSymbolPre(TIntermSymbol &node);
+    virtual PreResult visitConstantUnionPre(TIntermConstantUnion &node);
+    virtual PreResult visitFunctionPrototypePre(TIntermFunctionPrototype &node);
+    virtual PreResult visitPreprocessorDirectivePre(TIntermPreprocessorDirective &node);
+    virtual PreResult visitUnaryPre(TIntermUnary &node);
+    virtual PreResult visitBinaryPre(TIntermBinary &node);
+    virtual PreResult visitTernaryPre(TIntermTernary &node);
+    virtual PreResult visitSwizzlePre(TIntermSwizzle &node);
+    virtual PreResult visitIfElsePre(TIntermIfElse &node);
+    virtual PreResult visitSwitchPre(TIntermSwitch &node);
+    virtual PreResult visitCasePre(TIntermCase &node);
+    virtual PreResult visitLoopPre(TIntermLoop &node);
+    virtual PreResult visitBranchPre(TIntermBranch &node);
+    virtual PreResult visitDeclarationPre(TIntermDeclaration &node);
+    virtual PreResult visitBlockPre(TIntermBlock &node);
+    virtual PreResult visitAggregatePre(TIntermAggregate &node);
+    virtual PreResult visitFunctionDefinitionPre(TIntermFunctionDefinition &node);
+    virtual PreResult visitGlobalQualifierDeclarationPre(TIntermGlobalQualifierDeclaration &node);
+
+    virtual PostResult visitSymbolPost(TIntermSymbol &node);
+    virtual PostResult visitConstantUnionPost(TIntermConstantUnion &node);
+    virtual PostResult visitFunctionPrototypePost(TIntermFunctionPrototype &node);
+    virtual PostResult visitPreprocessorDirectivePost(TIntermPreprocessorDirective &node);
+    virtual PostResult visitUnaryPost(TIntermUnary &node);
+    virtual PostResult visitBinaryPost(TIntermBinary &node);
+    virtual PostResult visitTernaryPost(TIntermTernary &node);
+    virtual PostResult visitSwizzlePost(TIntermSwizzle &node);
+    virtual PostResult visitIfElsePost(TIntermIfElse &node);
+    virtual PostResult visitSwitchPost(TIntermSwitch &node);
+    virtual PostResult visitCasePost(TIntermCase &node);
+    virtual PostResult visitLoopPost(TIntermLoop &node);
+    virtual PostResult visitBranchPost(TIntermBranch &node);
+    virtual PostResult visitDeclarationPost(TIntermDeclaration &node);
+    virtual PostResult visitBlockPost(TIntermBlock &node);
+    virtual PostResult visitAggregatePost(TIntermAggregate &node);
+    virtual PostResult visitFunctionDefinitionPost(TIntermFunctionDefinition &node);
+    virtual PostResult visitGlobalQualifierDeclarationPost(TIntermGlobalQualifierDeclaration &node);
+
+    // Can be used to rebuild a specific node during a traversal. Useful for fine control of
+    // rebuilding a node's children.
+    ANGLE_NO_DISCARD PostResult rebuild(TIntermNode &node);
+
+    // Rebuilds the provided node in place. If a new node would be returned, the old node's children
+    // become that of the new node instead. Returns false if failure occurred.
+    ANGLE_NO_DISCARD bool rebuildInPlace(TIntermAggregate &node);
+
+    // Rebuilds the provided node in place. If a new node would be returned, the old node's children
+    // become that of the new node instead. Returns false if failure occurred.
+    ANGLE_NO_DISCARD bool rebuildInPlace(TIntermBlock &node);
+
+    // Rebuilds the provided node in place. If a new node would be returned, the old node's children
+    // become that of the new node instead. Returns false if failure occurred.
+    ANGLE_NO_DISCARD bool rebuildInPlace(TIntermDeclaration &node);
+
+    // If currently at or below a function declaration body, this returns the function that encloses
+    // the currently visited node. (This returns null if at a function declaration node.)
+    const TFunction *getParentFunction() const;
+
+    TIntermNode *getParentNode(size_t offset = 0) const;
+
+  private:
+    template <typename Node>
+    ANGLE_NO_DISCARD bool rebuildInPlaceImpl(Node &node);
+
+    PostResult traverseAny(TIntermNode &node);
+
+    template <typename Node>
+    Node *traverseAnyAs(TIntermNode &node);
+
+    template <typename Node>
+    bool traverseAnyAs(TIntermNode &node, Node *&out);
+
+    PreResult traversePre(TIntermNode &originalNode);
+    TIntermNode *traverseChildren(NodeType currNodeType,
+                                  const TIntermNode &originalNode,
+                                  TIntermNode &currNode,
+                                  VisitBits visit);
+    PostResult traversePost(NodeType nodeType,
+                            const TIntermNode &originalNode,
+                            TIntermNode &currNode,
+                            VisitBits visit);
+
+    bool traverseAggregateBaseChildren(TIntermAggregateBase &node);
+
+    TIntermNode *traverseUnaryChildren(TIntermUnary &node);
+    TIntermNode *traverseBinaryChildren(TIntermBinary &node);
+    TIntermNode *traverseTernaryChildren(TIntermTernary &node);
+    TIntermNode *traverseSwizzleChildren(TIntermSwizzle &node);
+    TIntermNode *traverseIfElseChildren(TIntermIfElse &node);
+    TIntermNode *traverseSwitchChildren(TIntermSwitch &node);
+    TIntermNode *traverseCaseChildren(TIntermCase &node);
+    TIntermNode *traverseLoopChildren(TIntermLoop &node);
+    TIntermNode *traverseBranchChildren(TIntermBranch &node);
+    TIntermNode *traverseDeclarationChildren(TIntermDeclaration &node);
+    TIntermNode *traverseBlockChildren(TIntermBlock &node);
+    TIntermNode *traverseAggregateChildren(TIntermAggregate &node);
+    TIntermNode *traverseFunctionDefinitionChildren(TIntermFunctionDefinition &node);
+    TIntermNode *traverseGlobalQualifierDeclarationChildren(
+        TIntermGlobalQualifierDeclaration &node);
+
+  protected:
+    TCompiler &mCompiler;
+    TSymbolTable &mSymbolTable;
+    const TFunction *mParentFunc = nullptr;
+    GetNodeType getNodeType;
+
+  private:
+    ConsList<TIntermNode *> mNodeStack{nullptr, nullptr};
+    bool mPreVisit;
+    bool mPostVisit;
+};
+
+}  // namespace sh
+
+#endif  // COMPILER_TRANSLATOR_TRANSLATORMETALDIRECT_INTERMREBUILD_H_
diff --git a/src/compiler/translator/tree_util/IntermTraverse.cpp b/src/compiler/translator/tree_util/IntermTraverse.cpp
index 4a0fffa..c4bbe1f 100644
--- a/src/compiler/translator/tree_util/IntermTraverse.cpp
+++ b/src/compiler/translator/tree_util/IntermTraverse.cpp
@@ -10,6 +10,7 @@
 #include "compiler/translator/InfoSink.h"
 #include "compiler/translator/SymbolTable.h"
 #include "compiler/translator/tree_util/IntermNode_util.h"
+#include "compiler/translator/util.h"
 
 namespace sh
 {
@@ -541,6 +542,22 @@
             replacement.parent->replaceChildNode(replacement.original, replacement.replacement);
         ASSERT(replaced);
 
+        // Make sure the precision is not accidentally dropped.  It's ok if the precision is not the
+        // same, as the transformations are allowed to replace an expression with one that is
+        // temporarily evaluated at a different (likely higher) precision.
+        TIntermTyped *originalAsTyped = replacement.original->getAsTyped();
+        TIntermTyped *replacementAsTyped =
+            replacement.replacement ? replacement.replacement->getAsTyped() : nullptr;
+        if (originalAsTyped != nullptr && replacementAsTyped != nullptr)
+        {
+            const TType &originalType    = originalAsTyped->getType();
+            const TType &replacementType = replacementAsTyped->getType();
+            ASSERT(!IsPrecisionApplicableToType(originalType.getBasicType()) ||
+                   !IsPrecisionApplicableToType(replacementType.getBasicType()) ||
+                   originalType.getPrecision() == EbpUndefined ||
+                   replacementType.getPrecision() != EbpUndefined);
+        }
+
         if (!replacement.originalBecomesChildOfReplacement)
         {
             // In AST traversing, a parent is visited before its children.
@@ -590,6 +607,39 @@
     mReplacements.push_back(NodeUpdateEntry(parent, original, replacement, originalBecomesChild));
 }
 
+void TIntermTraverser::queueAccessChainReplacement(TIntermTyped *replacement)
+{
+    uint32_t ancestorIndex  = 0;
+    TIntermTyped *toReplace = nullptr;
+    while (true)
+    {
+        TIntermNode *ancestor = getAncestorNode(ancestorIndex);
+        ASSERT(ancestor != nullptr);
+
+        TIntermBinary *asBinary = ancestor->getAsBinaryNode();
+        if (asBinary == nullptr ||
+            (asBinary->getOp() != EOpIndexDirect && asBinary->getOp() != EOpIndexIndirect))
+        {
+            break;
+        }
+
+        replacement = new TIntermBinary(asBinary->getOp(), replacement, asBinary->getRight());
+        toReplace   = asBinary;
+
+        ++ancestorIndex;
+    }
+
+    if (toReplace == nullptr)
+    {
+        queueReplacement(replacement, OriginalNode::IS_DROPPED);
+    }
+    else
+    {
+        queueReplacementWithParent(getAncestorNode(ancestorIndex), toReplace, replacement,
+                                   OriginalNode::IS_DROPPED);
+    }
+}
+
 TLValueTrackingTraverser::TLValueTrackingTraverser(bool preVisitIn,
                                                    bool inVisitIn,
                                                    bool postVisitIn,
@@ -628,7 +678,8 @@
                     ASSERT(paramIndex < node->getFunction()->getParamCount());
                     TQualifier qualifier =
                         node->getFunction()->getParam(paramIndex)->getType().getQualifier();
-                    setInFunctionCallOutParameter(qualifier == EvqOut || qualifier == EvqInOut);
+                    setInFunctionCallOutParameter(qualifier == EvqParamOut ||
+                                                  qualifier == EvqParamInOut);
                     ++paramIndex;
                 }
                 else
diff --git a/src/compiler/translator/tree_util/IntermTraverse.h b/src/compiler/translator/tree_util/IntermTraverse.h
index 2fcdab6..09437eb 100644
--- a/src/compiler/translator/tree_util/IntermTraverse.h
+++ b/src/compiler/translator/tree_util/IntermTraverse.h
@@ -229,6 +229,30 @@
                                     TIntermNode *original,
                                     TIntermNode *replacement,
                                     OriginalNode originalStatus);
+    // Walk the ancestors and replace the access chain that leads to this symbol.  This fixes up the
+    // types of the intermediate nodes, so it should be used when the type of the symbol changes.
+    // The AST transformation must still visit the (indirect) index nodes to transform the
+    // expression inside those nodes.  Note that due to the way these replacements work, the AST
+    // transformation should not attempt to replace the actual index node itself, but only a subnode
+    // of that.
+    //
+    //                    Node 1                                                Node 6
+    //                 EOpIndexDirect                                        EOpIndexDirect
+    //                /          \                                              /       \
+    //           Node 2        Node 3                                   Node 7        Node 3
+    //       EOpIndexIndirect     N     --> replaced with -->       EOpIndexIndirect     N
+    //         /        \                                            /        \
+    //      Node 4    Node 5                                      Node 8      Node 5
+    //      symbol   expression                                replacement   expression
+    //        ^                                                                 ^
+    //        |                                                                 |
+    //    This symbol is being replaced,                        This node is directly placed in the
+    //    and the replacement is given                          new access chain, and its parent is
+    //    to this function.                                     is changed.  This is why a
+    //                                                          replacment attempt for this node
+    //                                                          itself will not work.
+    //
+    void queueAccessChainReplacement(TIntermTyped *replacement);
 
     const bool preVisit;
     const bool inVisit;
diff --git a/src/compiler/translator/TranslatorMetalDirect/NodeType.h b/src/compiler/translator/tree_util/NodeType.h
similarity index 100%
rename from src/compiler/translator/TranslatorMetalDirect/NodeType.h
rename to src/compiler/translator/tree_util/NodeType.h
diff --git a/src/compiler/translator/tree_util/ReplaceArrayOfMatrixVarying.cpp b/src/compiler/translator/tree_util/ReplaceArrayOfMatrixVarying.cpp
index 025fd5d..b082dd7 100644
--- a/src/compiler/translator/tree_util/ReplaceArrayOfMatrixVarying.cpp
+++ b/src/compiler/translator/tree_util/ReplaceArrayOfMatrixVarying.cpp
@@ -86,7 +86,6 @@
     // arithmetic, assignments an so on.
     TType *tmpReplacementType = new TType(type);
     tmpReplacementType->setQualifier(EvqGlobal);
-    tmpReplacementType->realize();
 
     TVariable *tempReplaceVar = new TVariable(
         symbolTable, ImmutableString(std::string("ANGLE_AOM_Temp_") + varying->name().data()),
@@ -98,14 +97,10 @@
     }
 
     // Create array of vectors type
-    TType *varyingReplaceType =
-        new TType(type.getBasicType(), type.getPrecision(), type.getQualifier(),
-                  static_cast<unsigned char>(type.getRows()), 1);
-    varyingReplaceType->setInvariant(type.isInvariant());
-    varyingReplaceType->setMemoryQualifier(type.getMemoryQualifier());
-    varyingReplaceType->setLayoutQualifier(type.getLayoutQualifier());
+    TType *varyingReplaceType = new TType(type);
+    varyingReplaceType->toMatrixColumnType();
+    varyingReplaceType->toArrayElementType();
     varyingReplaceType->makeArray(type.getCols() * type.getOutermostArraySize());
-    varyingReplaceType->realize();
 
     TVariable *varyingReplaceVar =
         new TVariable(symbolTable, varying->name(), varyingReplaceType, SymbolType::UserDefined);
diff --git a/src/compiler/translator/tree_util/ReplaceClipCullDistanceVariable.cpp b/src/compiler/translator/tree_util/ReplaceClipCullDistanceVariable.cpp
index 24876ee..25df3b7 100644
--- a/src/compiler/translator/tree_util/ReplaceClipCullDistanceVariable.cpp
+++ b/src/compiler/translator/tree_util/ReplaceClipCullDistanceVariable.cpp
@@ -12,10 +12,12 @@
 #include "common/bitset_utils.h"
 #include "common/debug.h"
 #include "common/utilities.h"
+#include "compiler/translator/Compiler.h"
 #include "compiler/translator/SymbolTable.h"
 #include "compiler/translator/tree_util/BuiltIn.h"
 #include "compiler/translator/tree_util/IntermNode_util.h"
 #include "compiler/translator/tree_util/IntermTraverse.h"
+#include "compiler/translator/tree_util/ReplaceVariable.h"
 #include "compiler/translator/tree_util/RunAtTheBeginningOfShader.h"
 #include "compiler/translator/tree_util/RunAtTheEndOfShader.h"
 
@@ -54,13 +56,13 @@
                                          bool *nonConstIdxUsedOut,
                                          unsigned int *maxConstIdxOut,
                                          ClipCullDistanceIdxSet *constIndicesOut,
-                                         const ImmutableString &targetStr)
+                                         TQualifier targetQualifier)
         : TIntermTraverser(true, false, false),
           mRedeclaredSym(redeclaredSymOut),
           mUseNonConstClipCullDistanceIndex(nonConstIdxUsedOut),
           mMaxConstClipCullDistanceIndex(maxConstIdxOut),
           mConstClipCullDistanceIndices(constIndicesOut),
-          mTargetStr(targetStr)
+          mTargetQualifier(targetQualifier)
     {
         *mRedeclaredSym                    = nullptr;
         *mUseNonConstClipCullDistanceIndex = false;
@@ -78,8 +80,8 @@
             return true;
         }
 
-        TIntermTyped *variable = sequence.front()->getAsTyped();
-        if (!variable->getAsSymbolNode() || variable->getAsSymbolNode()->getName() != mTargetStr)
+        TIntermSymbol *variable = sequence.front()->getAsSymbolNode();
+        if (variable == nullptr || variable->getType().getQualifier() != mTargetQualifier)
         {
             return true;
         }
@@ -111,7 +113,7 @@
         {
             return true;
         }
-        if (clipCullDistance->getName() != mTargetStr)
+        if (clipCullDistance->getType().getQualifier() != mTargetQualifier)
         {
             return true;
         }
@@ -160,8 +162,8 @@
     unsigned int *mMaxConstClipCullDistanceIndex;
     // List of constant index reference of gl_ClipDistance
     ClipCullDistanceIdxSet *mConstClipCullDistanceIndices;
-    // String for gl_ClipDistance/gl_CullDistance
-    const ImmutableString mTargetStr;
+    // Qualifier for gl_ClipDistance/gl_CullDistance
+    const TQualifier mTargetQualifier;
 };
 
 // Replace all symbolic occurrences of given variables except one symbol.
@@ -206,7 +208,7 @@
     return new TIntermBinary(EOpAssign, left, right);
 }
 
-// This is only used for gl_Clipdistance
+// This is only used for gl_ClipDistance
 TIntermNode *assignFuncWithEnableFlags(const unsigned int index,
                                        TIntermSymbol *leftSymbol,
                                        TIntermSymbol *rightSymbol,
@@ -229,7 +231,7 @@
     trueBlock->appendStatement(assignment);
 
     TIntermBinary *zeroAssignment =
-        new TIntermBinary(EOpAssign, left->deepCopy(), CreateFloatNode(0));
+        new TIntermBinary(EOpAssign, left->deepCopy(), CreateFloatNode(0, EbpMedium));
     TIntermBlock *falseBlock = new TIntermBlock();
     falseBlock->appendStatement(zeroAssignment);
 
@@ -257,13 +259,12 @@
 
     unsigned int getEnabledClipCullDistance(const bool useNonConstIndex,
                                             const unsigned int maxConstIndex);
-    const TVariable *declareANGLEVariable();
+    const TVariable *declareANGLEVariable(const TVariable *originalVariable);
     bool assignOriginalValueToANGLEVariable(const GLenum shaderType);
     bool assignANGLEValueToOriginalVariable(const GLenum shaderType,
                                             const bool isRedeclared,
                                             const TIntermTyped *enableFlags,
-                                            const ClipCullDistanceIdxSet *constIndices,
-                                            AssignFunc assignFunc);
+                                            const ClipCullDistanceIdxSet *constIndices);
 
   private:
     bool assignOriginalValueToANGLEVariableImpl();
@@ -304,11 +305,14 @@
     return mEnabledDistances;
 }
 
-const TVariable *ReplaceClipCullDistanceAssignments::declareANGLEVariable()
+const TVariable *ReplaceClipCullDistanceAssignments::declareANGLEVariable(
+    const TVariable *originalVariable)
 {
     ASSERT(mEnabledDistances > 0);
 
-    TType *clipCullDistanceType = new TType(EbtFloat, EbpMedium, EvqGlobal, 1);
+    TType *clipCullDistanceType = new TType(originalVariable->getType());
+    clipCullDistanceType->setQualifier(EvqGlobal);
+    clipCullDistanceType->toArrayBaseType();
     clipCullDistanceType->makeArray(mEnabledDistances);
 
     mANGLEVar =
@@ -336,7 +340,7 @@
     for (unsigned int i = 0; i < mEnabledDistances; i++)
     {
         readBlock->appendStatement(
-            simpleAssignFunc(i, glClipCullDistanceSymbol, clipCullDistanceSymbol, nullptr));
+            simpleAssignFunc(i, clipCullDistanceSymbol, glClipCullDistanceSymbol, nullptr));
     }
 
     return RunAtTheBeginningOfShader(mCompiler, mRoot, readBlock);
@@ -384,7 +388,7 @@
                 TIntermBinary *left = new TIntermBinary(
                     EOpIndexDirect, glClipCullDistanceSymbol->deepCopy(), CreateIndexNode(i));
                 TIntermBinary *zeroAssignment =
-                    new TIntermBinary(EOpAssign, left, CreateFloatNode(0));
+                    new TIntermBinary(EOpAssign, left, CreateFloatNode(0, EbpMedium));
                 assignBlock->appendStatement(zeroAssignment);
             }
         }
@@ -424,8 +428,7 @@
     const GLenum shaderType,
     const bool isRedeclared,
     const TIntermTyped *enableFlags,
-    const ClipCullDistanceIdxSet *constIndices,
-    AssignFunc assignFunc)
+    const ClipCullDistanceIdxSet *constIndices)
 {
     switch (shaderType)
     {
@@ -440,8 +443,9 @@
             // ...
             // Shaders writing gl_CullDistance must write all enabled distances, or culling results
             // are undefined.
-            if (!assignANGLEValueToOriginalVariableImpl(isRedeclared, enableFlags, constIndices,
-                                                        assignFuncWithEnableFlags))
+            if (!assignANGLEValueToOriginalVariableImpl(
+                    isRedeclared, enableFlags, constIndices,
+                    enableFlags ? assignFuncWithEnableFlags : simpleAssignFunc))
             {
                 return false;
             }
@@ -460,23 +464,26 @@
     return true;
 }
 
-}  // anonymous namespace
-
-ANGLE_NO_DISCARD bool ReplaceClipDistanceAssignments(TCompiler *compiler,
-                                                     TIntermBlock *root,
-                                                     TSymbolTable *symbolTable,
-                                                     const GLenum shaderType,
-                                                     const TIntermTyped *clipDistanceEnableFlags)
+// Common code to transform gl_ClipDistance and gl_CullDistance.  Comments reference
+// gl_ClipDistance, but are also applicable to gl_CullDistance.
+ANGLE_NO_DISCARD bool ReplaceClipCullDistanceAssignmentsImpl(
+    TCompiler *compiler,
+    TIntermBlock *root,
+    TSymbolTable *symbolTable,
+    const GLenum shaderType,
+    const TIntermTyped *clipDistanceEnableFlags,
+    const char *builtInName,
+    const char *replacementName,
+    TQualifier builtInQualifier)
 {
     // Collect all constant index references of gl_ClipDistance
-    ImmutableString glClipDistanceName("gl_ClipDistance");
+    ImmutableString name(builtInName);
     ClipCullDistanceIdxSet constIndices;
-    bool useNonConstIndex                         = false;
-    const TIntermSymbol *redeclaredGlClipDistance = nullptr;
-    unsigned int maxConstIndex                    = 0;
-    GLClipCullDistanceReferenceTraverser indexTraverser(&redeclaredGlClipDistance,
-                                                        &useNonConstIndex, &maxConstIndex,
-                                                        &constIndices, glClipDistanceName);
+    bool useNonConstIndex                  = false;
+    const TIntermSymbol *redeclaredBuiltIn = nullptr;
+    unsigned int maxConstIndex             = 0;
+    GLClipCullDistanceReferenceTraverser indexTraverser(
+        &redeclaredBuiltIn, &useNonConstIndex, &maxConstIndex, &constIndices, builtInQualifier);
     root->traverse(&indexTraverser);
     if (!useNonConstIndex && constIndices.none())
     {
@@ -486,25 +493,25 @@
 
     // Retrieve gl_ClipDistance variable reference
     // Search user redeclared gl_ClipDistance first
-    const TVariable *glClipDistanceVar = nullptr;
-    if (redeclaredGlClipDistance)
+    const TVariable *builtInVar = nullptr;
+    if (redeclaredBuiltIn)
     {
-        glClipDistanceVar = &redeclaredGlClipDistance->variable();
+        builtInVar = &redeclaredBuiltIn->variable();
     }
     else
     {
         // User defined not found, find in built-in table
-        glClipDistanceVar =
-            static_cast<const TVariable *>(symbolTable->findBuiltIn(glClipDistanceName, 300));
+        builtInVar = static_cast<const TVariable *>(
+            symbolTable->findBuiltIn(name, compiler->getShaderVersion()));
     }
-    if (!glClipDistanceVar)
+    if (!builtInVar)
     {
         return false;
     }
 
-    ReplaceClipCullDistanceAssignments replacementUtils(compiler, root, symbolTable,
-                                                        glClipDistanceVar, redeclaredGlClipDistance,
-                                                        ImmutableString("ANGLEClipDistance"));
+    ReplaceClipCullDistanceAssignments replacementUtils(compiler, root, symbolTable, builtInVar,
+                                                        redeclaredBuiltIn,
+                                                        ImmutableString(replacementName));
 
     // Declare a global variable substituting gl_ClipDistance
     unsigned int enabledClipDistances =
@@ -518,12 +525,12 @@
         return false;
     }
 
-    const TVariable *clipDistanceVar = replacementUtils.declareANGLEVariable();
+    const TVariable *replacementVar = replacementUtils.declareANGLEVariable(builtInVar);
 
     // Replace gl_ClipDistance reference with ANGLEClipDistance, except the declaration
-    ReplaceVariableExceptOneTraverser replaceTraverser(glClipDistanceVar,
-                                                       new TIntermSymbol(clipDistanceVar),
-                                                       /** exception */ redeclaredGlClipDistance);
+    ReplaceVariableExceptOneTraverser replaceTraverser(builtInVar,
+                                                       new TIntermSymbol(replacementVar),
+                                                       /** exception */ redeclaredBuiltIn);
     root->traverse(&replaceTraverser);
     if (!replaceTraverser.updateTree(compiler, root))
     {
@@ -537,98 +544,48 @@
     }
 
     // Reassign ANGLEClipDistance to gl_ClipDistance but ignore those that are disabled
-    const bool isRedeclared = (redeclaredGlClipDistance != nullptr);
-    if (!replacementUtils.assignANGLEValueToOriginalVariable(shaderType, isRedeclared,
-                                                             clipDistanceEnableFlags, &constIndices,
-                                                             assignFuncWithEnableFlags))
+    const bool isRedeclared = redeclaredBuiltIn != nullptr;
+    if (!replacementUtils.assignANGLEValueToOriginalVariable(
+            shaderType, isRedeclared, clipDistanceEnableFlags, &constIndices))
     {
         return false;
     }
 
+    // If not redeclared, replace the built-in with one that is appropriately sized
+    if (!isRedeclared)
+    {
+        TType *resizedType = new TType(builtInVar->getType());
+        resizedType->setArraySize(0, enabledClipDistances);
+
+        TVariable *resizedVar = new TVariable(symbolTable, name, resizedType, SymbolType::BuiltIn);
+
+        return ReplaceVariable(compiler, root, builtInVar, resizedVar);
+    }
+
     return true;
 }
 
+}  // anonymous namespace
+
+ANGLE_NO_DISCARD bool ReplaceClipDistanceAssignments(TCompiler *compiler,
+                                                     TIntermBlock *root,
+                                                     TSymbolTable *symbolTable,
+                                                     const GLenum shaderType,
+                                                     const TIntermTyped *clipDistanceEnableFlags)
+{
+    return ReplaceClipCullDistanceAssignmentsImpl(compiler, root, symbolTable, shaderType,
+                                                  clipDistanceEnableFlags, "gl_ClipDistance",
+                                                  "ANGLEClipDistance", EvqClipDistance);
+}
+
 ANGLE_NO_DISCARD bool ReplaceCullDistanceAssignments(TCompiler *compiler,
                                                      TIntermBlock *root,
                                                      TSymbolTable *symbolTable,
                                                      const GLenum shaderType)
 {
-    // Collect all constant index references of gl_CullDistance
-    ImmutableString glCullDistanceName("gl_CullDistance");
-    ClipCullDistanceIdxSet constIndices;
-    bool useNonConstIndex                         = false;
-    const TIntermSymbol *redeclaredGLCullDistance = nullptr;
-    unsigned int maxConstIndex                    = 0;
-    GLClipCullDistanceReferenceTraverser indexTraverser(&redeclaredGLCullDistance,
-                                                        &useNonConstIndex, &maxConstIndex,
-                                                        &constIndices, glCullDistanceName);
-    root->traverse(&indexTraverser);
-    if (!useNonConstIndex)
-    {
-        // Nothing to do
-        return true;
-    }
-
-    // Retrieve gl_CullDistance variable reference
-    // Search user redeclared gl_CullDistance first
-    const TVariable *glCullDistanceVar = nullptr;
-    if (redeclaredGLCullDistance)
-    {
-        glCullDistanceVar = &redeclaredGLCullDistance->variable();
-    }
-    else
-    {
-        // User defined not found, find in built-in table
-        glCullDistanceVar =
-            static_cast<const TVariable *>(symbolTable->findBuiltIn(glCullDistanceName, 300));
-    }
-    if (!glCullDistanceVar)
-    {
-        return false;
-    }
-
-    ReplaceClipCullDistanceAssignments replacementUtils(compiler, root, symbolTable,
-                                                        glCullDistanceVar, redeclaredGLCullDistance,
-                                                        ImmutableString("ANGLECullDistance"));
-
-    // Declare a global variable substituting gl_CullDistance
-    unsigned int enabledCullDistances =
-        replacementUtils.getEnabledClipCullDistance(useNonConstIndex, maxConstIndex);
-    if (!enabledCullDistances)
-    {
-        // Spec :
-        // The gl_CullDistance array is predeclared as unsized and must be sized by the shader
-        // either redeclaring it with a size or indexing it only with integral constant expressions.
-        return false;
-    }
-
-    const TVariable *cullDistanceVar = replacementUtils.declareANGLEVariable();
-
-    // Replace gl_CullDistance reference with ANGLECullDistance, except the declaration
-    ReplaceVariableExceptOneTraverser replaceTraverser(glCullDistanceVar,
-                                                       new TIntermSymbol(cullDistanceVar),
-                                                       /** exception */ redeclaredGLCullDistance);
-    root->traverse(&replaceTraverser);
-    if (!replaceTraverser.updateTree(compiler, root))
-    {
-        return false;
-    }
-
-    // Read gl_CullDistance to ANGLECullDistance for getting a original data
-    if (!replacementUtils.assignOriginalValueToANGLEVariable(shaderType))
-    {
-        return false;
-    }
-
-    // Reassign ANGLECullDistance to gl_CullDistance but ignore those that are disabled
-    const bool isRedeclared = (redeclaredGLCullDistance != nullptr);
-    if (!replacementUtils.assignANGLEValueToOriginalVariable(shaderType, isRedeclared, nullptr,
-                                                             &constIndices, simpleAssignFunc))
-    {
-        return false;
-    }
-
-    return true;
+    return ReplaceClipCullDistanceAssignmentsImpl(compiler, root, symbolTable, shaderType, nullptr,
+                                                  "gl_CullDistance", "ANGLECullDistance",
+                                                  EvqCullDistance);
 }
 
 }  // namespace sh
diff --git a/src/compiler/translator/tree_util/ReplaceVariable.h b/src/compiler/translator/tree_util/ReplaceVariable.h
index bb48625..b99b4bd 100644
--- a/src/compiler/translator/tree_util/ReplaceVariable.h
+++ b/src/compiler/translator/tree_util/ReplaceVariable.h
@@ -9,20 +9,13 @@
 #ifndef COMPILER_TRANSLATOR_TREEUTIL_REPLACEVARIABLE_H_
 #define COMPILER_TRANSLATOR_TREEUTIL_REPLACEVARIABLE_H_
 
-#include "common/debug.h"
-
-#include <stack>
-#include <unordered_map>
+#include "common/angleutils.h"
 
 namespace sh
 {
 
 class TCompiler;
-class TFunction;
-class TIntermAggregate;
 class TIntermBlock;
-class TIntermFunctionPrototype;
-class TIntermNode;
 class TIntermTyped;
 class TSymbolTable;
 class TVariable;
diff --git a/src/compiler/translator/tree_util/RewriteSampleMaskVariable.cpp b/src/compiler/translator/tree_util/RewriteSampleMaskVariable.cpp
index 98e0f5e..f2a4600 100644
--- a/src/compiler/translator/tree_util/RewriteSampleMaskVariable.cpp
+++ b/src/compiler/translator/tree_util/RewriteSampleMaskVariable.cpp
@@ -12,6 +12,7 @@
 #include "common/bitset_utils.h"
 #include "common/debug.h"
 #include "common/utilities.h"
+#include "compiler/translator/Compiler.h"
 #include "compiler/translator/SymbolTable.h"
 #include "compiler/translator/tree_util/BuiltIn.h"
 #include "compiler/translator/tree_util/IntermNode_util.h"
@@ -126,8 +127,8 @@
     else
     {
         // User defined not found, find in built-in table
-        glSampleMaskVar = static_cast<const TVariable *>(
-            symbolTable->findBuiltIn(ImmutableString("gl_SampleMask"), 320));
+        glSampleMaskVar = static_cast<const TVariable *>(symbolTable->findBuiltIn(
+            ImmutableString("gl_SampleMask"), compiler->getShaderVersion()));
     }
     if (!glSampleMaskVar)
     {
@@ -180,7 +181,7 @@
     // Retrieve gl_SampleMaskIn variable reference
     const TVariable *glSampleMaskInVar = nullptr;
     glSampleMaskInVar                  = static_cast<const TVariable *>(
-        symbolTable->findBuiltIn(ImmutableString("gl_SampleMaskIn"), 320));
+        symbolTable->findBuiltIn(ImmutableString("gl_SampleMaskIn"), compiler->getShaderVersion()));
     if (!glSampleMaskInVar)
     {
         return false;
diff --git a/src/compiler/translator/tree_util/RunAtTheBeginningOfShader.cpp b/src/compiler/translator/tree_util/RunAtTheBeginningOfShader.cpp
index cd9ffea..99be6ad 100644
--- a/src/compiler/translator/tree_util/RunAtTheBeginningOfShader.cpp
+++ b/src/compiler/translator/tree_util/RunAtTheBeginningOfShader.cpp
@@ -17,7 +17,6 @@
 
 #include "compiler/translator/Compiler.h"
 #include "compiler/translator/IntermNode.h"
-#include "compiler/translator/StaticType.h"
 #include "compiler/translator/SymbolTable.h"
 #include "compiler/translator/tree_util/FindMain.h"
 #include "compiler/translator/tree_util/IntermNode_util.h"
diff --git a/src/compiler/translator/tree_util/RunAtTheEndOfShader.cpp b/src/compiler/translator/tree_util/RunAtTheEndOfShader.cpp
index 68723ee..2996ef8 100644
--- a/src/compiler/translator/tree_util/RunAtTheEndOfShader.cpp
+++ b/src/compiler/translator/tree_util/RunAtTheEndOfShader.cpp
@@ -72,7 +72,7 @@
     // Replace main() with main0() with the same body.
     TFunction *oldMain =
         new TFunction(symbolTable, kEmptyImmutableString, SymbolType::AngleInternal,
-                      StaticType::GetBasic<EbtVoid>(), false);
+                      StaticType::GetBasic<EbtVoid, EbpUndefined>(), false);
     TIntermFunctionDefinition *oldMainDefinition =
         CreateInternalFunctionDefinitionNode(*oldMain, main->getBody());
 
@@ -81,7 +81,7 @@
 
     // void main()
     TFunction *newMain = new TFunction(symbolTable, kMainString, SymbolType::UserDefined,
-                                       StaticType::GetBasic<EbtVoid>(), false);
+                                       StaticType::GetBasic<EbtVoid, EbpUndefined>(), false);
     TIntermFunctionPrototype *newMainProto = new TIntermFunctionPrototype(newMain);
 
     // {
diff --git a/src/compiler/translator/tree_util/SpecializationConstant.cpp b/src/compiler/translator/tree_util/SpecializationConstant.cpp
index a23aa98..2b5b6f2 100644
--- a/src/compiler/translator/tree_util/SpecializationConstant.cpp
+++ b/src/compiler/translator/tree_util/SpecializationConstant.cpp
@@ -73,10 +73,10 @@
 {
     auto mat2Type = new TType(EbtFloat, 2, 2);
     TIntermSequence mat2Args;
-    mat2Args.push_back(CreateFloatNode(matrix[rotation][0]));
-    mat2Args.push_back(CreateFloatNode(matrix[rotation][1]));
-    mat2Args.push_back(CreateFloatNode(matrix[rotation][2]));
-    mat2Args.push_back(CreateFloatNode(matrix[rotation][3]));
+    mat2Args.push_back(CreateFloatNode(matrix[rotation][0], EbpLow));
+    mat2Args.push_back(CreateFloatNode(matrix[rotation][1], EbpLow));
+    mat2Args.push_back(CreateFloatNode(matrix[rotation][2], EbpLow));
+    mat2Args.push_back(CreateFloatNode(matrix[rotation][3], EbpLow));
     TIntermAggregate *constVarConstructor =
         TIntermAggregate::CreateConstructor(*mat2Type, &mat2Args);
     return constVarConstructor;
@@ -130,8 +130,8 @@
 {
     auto vec2Type = new TType(EbtFloat, 2);
     TIntermSequence vec2Args;
-    vec2Args.push_back(CreateFloatNode(vec2Values[rotation][0]));
-    vec2Args.push_back(CreateFloatNode(vec2Values[rotation][1] * yscale));
+    vec2Args.push_back(CreateFloatNode(vec2Values[rotation][0], EbpLow));
+    vec2Args.push_back(CreateFloatNode(vec2Values[rotation][1] * yscale, EbpLow));
     TIntermAggregate *constVarConstructor =
         TIntermAggregate::CreateConstructor(*vec2Type, &vec2Args);
     return constVarConstructor;
@@ -211,22 +211,28 @@
                                                 float scale,
                                                 TIntermSymbol *rotation)
 {
-    const TType *floatType = StaticType::GetBasic<EbtFloat>();
+    const TType *floatType = StaticType::GetBasic<EbtFloat, EbpHigh>();
     TType *typeFloat8      = new TType(*floatType);
     typeFloat8->makeArray(static_cast<unsigned int>(vk::SurfaceRotation::EnumCount));
 
     TIntermSequence sequences = {
-        CreateFloatNode(valuesEnumMap[vk::SurfaceRotation::Identity][subscript] * scale),
-        CreateFloatNode(valuesEnumMap[vk::SurfaceRotation::Rotated90Degrees][subscript] * scale),
-        CreateFloatNode(valuesEnumMap[vk::SurfaceRotation::Rotated180Degrees][subscript] * scale),
-        CreateFloatNode(valuesEnumMap[vk::SurfaceRotation::Rotated270Degrees][subscript] * scale),
-        CreateFloatNode(valuesEnumMap[vk::SurfaceRotation::FlippedIdentity][subscript] * scale),
-        CreateFloatNode(valuesEnumMap[vk::SurfaceRotation::FlippedRotated90Degrees][subscript] *
-                        scale),
-        CreateFloatNode(valuesEnumMap[vk::SurfaceRotation::FlippedRotated180Degrees][subscript] *
-                        scale),
-        CreateFloatNode(valuesEnumMap[vk::SurfaceRotation::FlippedRotated270Degrees][subscript] *
-                        scale)};
+        CreateFloatNode(valuesEnumMap[vk::SurfaceRotation::Identity][subscript] * scale, EbpLow),
+        CreateFloatNode(valuesEnumMap[vk::SurfaceRotation::Rotated90Degrees][subscript] * scale,
+                        EbpLow),
+        CreateFloatNode(valuesEnumMap[vk::SurfaceRotation::Rotated180Degrees][subscript] * scale,
+                        EbpLow),
+        CreateFloatNode(valuesEnumMap[vk::SurfaceRotation::Rotated270Degrees][subscript] * scale,
+                        EbpLow),
+        CreateFloatNode(valuesEnumMap[vk::SurfaceRotation::FlippedIdentity][subscript] * scale,
+                        EbpLow),
+        CreateFloatNode(
+            valuesEnumMap[vk::SurfaceRotation::FlippedRotated90Degrees][subscript] * scale, EbpLow),
+        CreateFloatNode(
+            valuesEnumMap[vk::SurfaceRotation::FlippedRotated180Degrees][subscript] * scale,
+            EbpLow),
+        CreateFloatNode(
+            valuesEnumMap[vk::SurfaceRotation::FlippedRotated270Degrees][subscript] * scale,
+            EbpLow)};
     TIntermTyped *array = TIntermAggregate::CreateConstructor(*typeFloat8, &sequences);
 
     return new TIntermBinary(EOpIndexIndirect, array, rotation);
@@ -297,7 +303,7 @@
     {
         TIntermDeclaration *decl = new TIntermDeclaration();
         decl->appendDeclarator(
-            new TIntermBinary(EOpInitialize, getDrawableWidth(), CreateFloatNode(0)));
+            new TIntermBinary(EOpInitialize, getDrawableWidth(), CreateFloatNode(0, EbpMedium)));
         root->insertStatement(0, decl);
     }
 
@@ -305,7 +311,7 @@
     {
         TIntermDeclaration *decl = new TIntermDeclaration();
         decl->appendDeclarator(
-            new TIntermBinary(EOpInitialize, getDrawableHeight(), CreateFloatNode(0)));
+            new TIntermBinary(EOpInitialize, getDrawableHeight(), CreateFloatNode(0, EbpMedium)));
         root->insertStatement(1, decl);
     }
 }
@@ -318,7 +324,7 @@
     }
     if (mLineRasterEmulationVar == nullptr)
     {
-        const TType *type = MakeSpecConst(*StaticType::GetBasic<EbtBool>(),
+        const TType *type = MakeSpecConst(*StaticType::GetBasic<EbtBool, EbpUndefined>(),
                                           vk::SpecializationConstantId::LineRasterEmulation);
 
         mLineRasterEmulationVar = new TVariable(mSymbolTable, kLineRasterEmulationSpecConstVarName,
@@ -332,7 +338,7 @@
 {
     if (mSurfaceRotationVar == nullptr)
     {
-        const TType *type = MakeSpecConst(*StaticType::GetBasic<EbtUInt>(),
+        const TType *type = MakeSpecConst(*StaticType::GetBasic<EbtUInt, EbpHigh>(),
                                           vk::SpecializationConstantId::SurfaceRotation);
 
         mSurfaceRotationVar = new TVariable(mSymbolTable, kSurfaceRotationSpecConstVarName, type,
@@ -489,7 +495,7 @@
 {
     if (mDrawableWidthVar == nullptr)
     {
-        const TType *type = MakeSpecConst(*StaticType::GetBasic<EbtFloat>(),
+        const TType *type = MakeSpecConst(*StaticType::GetBasic<EbtFloat, EbpHigh>(),
                                           vk::SpecializationConstantId::DrawableWidth);
 
         mDrawableWidthVar = new TVariable(mSymbolTable, kDrawableWidthSpecConstVarName, type,
@@ -502,7 +508,7 @@
 {
     if (mDrawableHeightVar == nullptr)
     {
-        const TType *type = MakeSpecConst(*StaticType::GetBasic<EbtFloat>(),
+        const TType *type = MakeSpecConst(*StaticType::GetBasic<EbtFloat, EbpHigh>(),
                                           vk::SpecializationConstantId::DrawableHeight);
 
         mDrawableHeightVar = new TVariable(mSymbolTable, kDrawableHeightSpecConstVarName, type,
@@ -528,7 +534,7 @@
 
     // drawableSize * 0.5f
     TIntermBinary *halfRenderArea =
-        new TIntermBinary(EOpVectorTimesScalar, drawableSize, CreateFloatNode(0.5));
+        new TIntermBinary(EOpVectorTimesScalar, drawableSize, CreateFloatNode(0.5, EbpMedium));
     mUsageBits.set(vk::SpecConstUsage::DrawableSize);
 
     // drawableSize * 0.5f * halfRenderAreaRotationMatrix (See comment in
diff --git a/src/compiler/translator/util.cpp b/src/compiler/translator/util.cpp
index 2d6718d..674689c 100644
--- a/src/compiler/translator/util.cpp
+++ b/src/compiler/translator/util.cpp
@@ -710,12 +710,12 @@
         case EvqPosition:
         case EvqPointSize:
         case EvqFragDepth:
-        case EvqFragDepthEXT:
         case EvqFragColor:
         case EvqSecondaryFragColorEXT:
         case EvqFragData:
         case EvqSecondaryFragDataEXT:
         case EvqClipDistance:
+        case EvqCullDistance:
         case EvqLastFragData:
         case EvqSampleMask:
             return true;
@@ -973,6 +973,26 @@
     return false;
 }
 
+bool IsPrecisionApplicableToType(TBasicType type)
+{
+    switch (type)
+    {
+        case EbtInt:
+        case EbtUInt:
+        case EbtFloat:
+            // TODO: find all types where precision is applicable; for example samplers.
+            // http://anglebug.com/6132
+            return true;
+        default:
+            return false;
+    }
+}
+
+bool IsRedeclarableBuiltIn(const ImmutableString &name)
+{
+    return name == "gl_ClipDistance" || name == "gl_CullDistance" || name == "gl_LastFragData";
+}
+
 size_t FindFieldIndex(const TFieldList &fieldList, const char *fieldName)
 {
     for (size_t fieldIndex = 0; fieldIndex < fieldList.size(); ++fieldIndex)
diff --git a/src/compiler/translator/util.h b/src/compiler/translator/util.h
index c7468a0..a8eecb2 100644
--- a/src/compiler/translator/util.h
+++ b/src/compiler/translator/util.h
@@ -95,6 +95,12 @@
 
 bool IsValidImplicitConversion(ImplicitTypeConversion conversion, TOperator op);
 
+// Whether the given basic type requires precision.
+bool IsPrecisionApplicableToType(TBasicType type);
+
+// Whether this is the name of a built-in that can be redeclared by the shader.
+bool IsRedeclarableBuiltIn(const ImmutableString &name);
+
 size_t FindFieldIndex(const TFieldList &fieldList, const char *fieldName);
 }  // namespace sh
 
diff --git a/src/gpu_info_util/SystemInfo.cpp b/src/gpu_info_util/SystemInfo.cpp
index 54c3db5..e050a56 100644
--- a/src/gpu_info_util/SystemInfo.cpp
+++ b/src/gpu_info_util/SystemInfo.cpp
@@ -266,6 +266,11 @@
     ASSERT(!info->gpus.empty());
 
     // On dual-GPU systems we assume the non-Intel GPU is the graphics one.
+    // TODO: this is incorrect and problematic.  activeGPUIndex must be removed if it cannot be
+    // determined correctly.  A potential solution is to create an OpenGL context and parse
+    // GL_VENDOR.  Currently, our test infrastructure is relying on this information and incorrectly
+    // applies test expectations on dual-GPU systems when the Intel GPU is active.
+    // http://anglebug.com/6174.
     int active    = 0;
     bool hasIntel = false;
     for (size_t i = 0; i < info->gpus.size(); ++i)
diff --git a/src/libANGLE/Caps.cpp b/src/libANGLE/Caps.cpp
index 5ee0d94..dd505f6 100644
--- a/src/libANGLE/Caps.cpp
+++ b/src/libANGLE/Caps.cpp
@@ -1076,6 +1076,7 @@
         map["GL_APPLE_clip_distance"] = enableableExtension(&Extensions::clipDistanceAPPLE);
         map["GL_EXT_clip_control"] = enableableExtension(&Extensions::clipControlEXT);
         map["GL_EXT_EGL_image_array"] = enableableExtension(&Extensions::eglImageArray);
+        map["GL_EXT_EGL_image_storage"] = enableableExtension(&Extensions::eglImageStorageEXT);
         map["GL_EXT_buffer_storage"] = enableableExtension(&Extensions::bufferStorageEXT);
         map["GL_EXT_external_buffer"] = enableableExtension(&Extensions::externalBufferEXT);
         map["GL_OES_texture_stencil8"] = enableableExtension(&Extensions::stencilIndex8);
@@ -1097,6 +1098,7 @@
         map["GL_EXT_primitive_bounding_box"] = esOnlyExtension(&Extensions::primitiveBoundingBoxEXT);
         map["GL_ANGLE_relaxed_vertex_attribute_type"] = esOnlyExtension(&Extensions::relaxedVertexAttributeTypeANGLE);
         map["GL_ANGLE_yuv_internal_format"] = enableableExtension(&Extensions::yuvInternalFormatANGLE);
+        map["GL_EXT_protected_textures"] = enableableExtension(&Extensions::protectedTexturesEXT);
         // GLES1 extensions
         map["GL_OES_point_size_array"] = enableableExtension(&Extensions::pointSizeArrayOES);
         map["GL_OES_texture_cube_map"] = enableableExtension(&Extensions::textureCubeMapOES);
@@ -1519,6 +1521,7 @@
     InsertExtensionString("EGL_EXT_buffer_age",                                  bufferAgeEXT,                       &extensionStrings);
     InsertExtensionString("EGL_KHR_mutable_render_buffer",                       mutableRenderBufferKHR,             &extensionStrings);
     InsertExtensionString("EGL_EXT_protected_content",                           protectedContentEXT,                &extensionStrings);
+    InsertExtensionString("EGL_ANGLE_create_surface_swap_interval",              createSurfaceSwapIntervalANGLE,     &extensionStrings);
     // clang-format on
 
     return extensionStrings;
diff --git a/src/libANGLE/Caps.h b/src/libANGLE/Caps.h
index aeb7c34..a453610 100644
--- a/src/libANGLE/Caps.h
+++ b/src/libANGLE/Caps.h
@@ -741,6 +741,12 @@
 
     // GL_ANGLE_yuv_internal_format
     bool yuvInternalFormatANGLE = false;
+
+    // GL_EXT_protected_textures
+    bool protectedTexturesEXT = false;
+
+    // GL_EXT_EGL_image_storage
+    bool eglImageStorageEXT = false;
 };
 
 // Pointer to a boolean memeber of the Extensions struct
@@ -804,6 +810,9 @@
 
     // ETC1 texture support is emulated.
     bool emulatedEtc1 = false;
+
+    // No compressed TEXTURE_3D support.
+    bool noCompressedTexture3D = false;
 };
 
 struct TypePrecision
@@ -1264,6 +1273,9 @@
 
     // EGL_EXT_protected_content
     bool protectedContentEXT = false;
+
+    // EGL_ANGLE_create_surface_swap_interval
+    bool createSurfaceSwapIntervalANGLE = false;
 };
 
 struct DeviceExtensions
diff --git a/src/libANGLE/Compiler.cpp b/src/libANGLE/Compiler.cpp
index be63ee4..ac1970f 100644
--- a/src/libANGLE/Compiler.cpp
+++ b/src/libANGLE/Compiler.cpp
@@ -157,6 +157,9 @@
     // GL_EXT_clip_cull_distance
     mResources.EXT_clip_cull_distance = extensions.clipCullDistanceEXT;
 
+    // GL_EXT_primitive_bounding_box
+    mResources.EXT_primitive_bounding_box = extensions.primitiveBoundingBoxEXT;
+
     // GLSL ES 3.0 constants
     mResources.MaxVertexOutputVectors  = caps.maxVertexOutputComponents / 4;
     mResources.MaxFragmentInputVectors = caps.maxFragmentInputComponents / 4;
diff --git a/src/libANGLE/Constants.h b/src/libANGLE/Constants.h
index 6459465..871b269 100644
--- a/src/libANGLE/Constants.h
+++ b/src/libANGLE/Constants.h
@@ -107,6 +107,11 @@
 constexpr uint32_t kMinimumShaderUniformBlocks = 12;
 // Table 6.31 MAX_VERTEX_OUTPUT_COMPONENTS minimum value = 64
 constexpr uint32_t kMinimumVertexOutputComponents = 64;
+
+// OpenGL ES 3.2+ Minimum Values
+// Table 21.42 TEXTURE_BUFFER_OFFSET_ALIGNMENT minimum value = 256
+constexpr uint32_t kMinTextureBufferOffsetAlignment = 256;
+
 }  // namespace limits
 
 }  // namespace gl
diff --git a/src/libANGLE/Context.cpp b/src/libANGLE/Context.cpp
index 45e8dac..4ab53b3 100644
--- a/src/libANGLE/Context.cpp
+++ b/src/libANGLE/Context.cpp
@@ -6,7 +6,6 @@
 
 // Context.cpp: Implements the gl::Context class, managing all GL state and performing
 // rendering operations. It is the GLES2 specific implementation of EGLContext.
-
 #include "libANGLE/Context.h"
 #include "libANGLE/Context.inl.h"
 
@@ -268,7 +267,13 @@
     kUniformBuffer0SubjectIndex = kImageMaxSubjectIndex,
     kUniformBufferMaxSubjectIndex =
         kUniformBuffer0SubjectIndex + IMPLEMENTATION_MAX_UNIFORM_BUFFER_BINDINGS,
-    kSampler0SubjectIndex    = kUniformBufferMaxSubjectIndex,
+    kAtomicCounterBuffer0SubjectIndex = kUniformBufferMaxSubjectIndex,
+    kAtomicCounterBufferMaxSubjectIndex =
+        kAtomicCounterBuffer0SubjectIndex + IMPLEMENTATION_MAX_ATOMIC_COUNTER_BUFFER_BINDINGS,
+    kShaderStorageBuffer0SubjectIndex = kAtomicCounterBufferMaxSubjectIndex,
+    kShaderStorageBufferMaxSubjectIndex =
+        kShaderStorageBuffer0SubjectIndex + IMPLEMENTATION_MAX_SHADER_STORAGE_BUFFER_BINDINGS,
+    kSampler0SubjectIndex    = kShaderStorageBufferMaxSubjectIndex,
     kSamplerMaxSubjectIndex  = kSampler0SubjectIndex + IMPLEMENTATION_MAX_ACTIVE_TEXTURES,
     kVertexArraySubjectIndex = kSamplerMaxSubjectIndex,
     kReadFramebufferSubjectIndex,
@@ -369,7 +374,7 @@
       mOverlay(mImplementation.get()),
       mIsExternal(GetIsExternal(attribs)),
       mSaveAndRestoreState(GetSaveAndRestoreState(attribs)),
-      mIsCurrent(false)
+      mIsDestroyed(false)
 {
     for (angle::SubjectIndex uboIndex = kUniformBuffer0SubjectIndex;
          uboIndex < kUniformBufferMaxSubjectIndex; ++uboIndex)
@@ -377,6 +382,18 @@
         mUniformBufferObserverBindings.emplace_back(this, uboIndex);
     }
 
+    for (angle::SubjectIndex acbIndex = kAtomicCounterBuffer0SubjectIndex;
+         acbIndex < kAtomicCounterBufferMaxSubjectIndex; ++acbIndex)
+    {
+        mAtomicCounterBufferObserverBindings.emplace_back(this, acbIndex);
+    }
+
+    for (angle::SubjectIndex ssboIndex = kShaderStorageBuffer0SubjectIndex;
+         ssboIndex < kShaderStorageBufferMaxSubjectIndex; ++ssboIndex)
+    {
+        mShaderStorageBufferObserverBindings.emplace_back(this, ssboIndex);
+    }
+
     for (angle::SubjectIndex samplerIndex = kSampler0SubjectIndex;
          samplerIndex < kSamplerMaxSubjectIndex; ++samplerIndex)
     {
@@ -505,7 +522,7 @@
     ANGLE_CONTEXT_TRY(mImplementation->initialize());
 
     // Add context into the share group
-    mState.getShareGroup()->getContexts()->insert(this);
+    mState.getShareGroup()->addSharedContext(this);
 
     bindVertexArray({0});
 
@@ -613,6 +630,10 @@
         return egl::NoError();
     }
 
+    // eglDestoryContext() must have been called for this Context and there must not be any Threads
+    // that still have it current.
+    ASSERT(mIsDestroyed == true && mRefCount == 0);
+
     // Dump frame capture if enabled.
     getShareGroup()->getFrameCaptureShared()->onDestroyContext(this);
 
@@ -621,10 +642,7 @@
         mGLES1Renderer->onDestroy(this, &mState);
     }
 
-    if (mIsCurrent)
-    {
-        ANGLE_TRY(unMakeCurrent(display));
-    }
+    ANGLE_TRY(unMakeCurrent(display));
 
     for (auto fence : mFenceNVMap)
     {
@@ -721,8 +739,6 @@
 
     if (!mHasBeenCurrent)
     {
-        ASSERT(!mIsCurrent);
-
         initializeDefaultResources();
         initRendererString();
         initVersionStrings();
@@ -742,10 +758,7 @@
         mHasBeenCurrent = true;
     }
 
-    if (mIsCurrent)
-    {
-        ANGLE_TRY(unsetDefaultFramebuffer());
-    }
+    ANGLE_TRY(unsetDefaultFramebuffer());
 
     getShareGroup()->getFrameCaptureShared()->onMakeCurrent(this, drawSurface);
 
@@ -765,16 +778,11 @@
         return angle::ResultToEGL(implResult);
     }
 
-    mIsCurrent = true;
-
     return egl::NoError();
 }
 
 egl::Error Context::unMakeCurrent(const egl::Display *display)
 {
-    ASSERT(mIsCurrent);
-    mIsCurrent = false;
-
     ANGLE_TRY(angle::ResultToEGL(mImplementation->onUnMakeCurrent(this)));
 
     ANGLE_TRY(unsetDefaultFramebuffer());
@@ -1528,6 +1536,16 @@
         case GL_MAX_FRAGMENT_INTERPOLATION_OFFSET:
             *params = mState.mCaps.maxInterpolationOffset;
             break;
+        case GL_PRIMITIVE_BOUNDING_BOX:
+            params[0] = mState.mBoundingBoxMinX;
+            params[1] = mState.mBoundingBoxMinY;
+            params[2] = mState.mBoundingBoxMinZ;
+            params[3] = mState.mBoundingBoxMinW;
+            params[4] = mState.mBoundingBoxMaxX;
+            params[5] = mState.mBoundingBoxMaxY;
+            params[6] = mState.mBoundingBoxMaxZ;
+            params[7] = mState.mBoundingBoxMaxW;
+            break;
         default:
             mState.getFloatv(pname, params);
             break;
@@ -3559,6 +3577,14 @@
         ASSERT(supportedExtensions.textureCompressionASTCHDRKHR);
     }
 
+    // GL_KHR_protected_textures
+    // If EGL_KHR_protected_content is not supported then GL_EXT_protected_texture
+    // can not be supported.
+    if (!mDisplay->getExtensions().protectedContentEXT)
+    {
+        supportedExtensions.protectedTexturesEXT = false;
+    }
+
     // GL_ANGLE_get_tex_level_parameter is implemented in the frontend
     supportedExtensions.getTexLevelParameterANGLE = true;
 
@@ -3768,8 +3794,8 @@
         mSupportedExtensions.compressedETC1RGB8TextureOES = false;
     }
 
-    // If we're capturing application calls for replay, don't expose any binary formats to prevent
-    // traces from trying to use cached results
+    // If we're capturing application calls for replay, apply some feature limits to increase
+    // portability of the trace.
     if (getShareGroup()->getFrameCaptureShared()->enabled() ||
         getFrontendFeatures().captureLimits.enabled)
     {
@@ -3779,8 +3805,13 @@
                        : "FrameCapture limits were forced")
                << std::endl;
 
-        INFO() << "Limiting binary format support count to zero";
-        mDisplay->overrideFrontendFeatures({"disable_program_binary"}, true);
+        if (!getFrontendFeatures().enableProgramBinaryForCapture.enabled)
+        {
+            // Some apps insist on being able to use glProgramBinary. For those, we'll allow the
+            // extension to remain on. Otherwise, force the extension off.
+            INFO() << "Disabling GL_OES_get_program_binary for trace portability";
+            mDisplay->overrideFrontendFeatures({"disable_program_binary"}, true);
+        }
 
         // Set to the most common limit per gpuinfo.org. Required for several platforms we test.
         constexpr GLint maxImageUnits = 8;
@@ -3795,6 +3826,16 @@
         INFO() << "Setting uniform buffer offset alignment to " << uniformBufferOffsetAlignment;
         mState.mCaps.uniformBufferOffsetAlignment = uniformBufferOffsetAlignment;
 
+        // Also limit texture buffer offset alignment, if enabled
+        if (mState.mExtensions.textureBufferAny())
+        {
+            constexpr GLint textureBufferOffsetAlignment =
+                gl::limits::kMinTextureBufferOffsetAlignment;
+            ASSERT(textureBufferOffsetAlignment % mState.mCaps.textureBufferOffsetAlignment == 0);
+            INFO() << "Setting texture buffer offset alignment to " << textureBufferOffsetAlignment;
+            mState.mCaps.textureBufferOffsetAlignment = textureBufferOffsetAlignment;
+        }
+
         INFO() << "Disabling GL_EXT_map_buffer_range and GL_OES_mapbuffer during capture, which "
                   "are not supported on some native drivers";
         mState.mExtensions.mapBufferRange = false;
@@ -5915,7 +5956,14 @@
                                    GLfloat maxZ,
                                    GLfloat maxW)
 {
-    UNIMPLEMENTED();
+    mState.mBoundingBoxMinX = minX;
+    mState.mBoundingBoxMinY = minY;
+    mState.mBoundingBoxMinZ = minZ;
+    mState.mBoundingBoxMinW = minW;
+    mState.mBoundingBoxMaxX = maxX;
+    mState.mBoundingBoxMaxY = maxY;
+    mState.mBoundingBoxMaxZ = maxZ;
+    mState.mBoundingBoxMaxW = maxW;
 }
 
 void Context::bufferStorage(BufferBinding target,
@@ -6025,6 +6073,16 @@
         mUniformBufferObserverBindings[index].bind(object);
         mStateCache.onUniformBufferStateChange(this);
     }
+    else if (target == BufferBinding::AtomicCounter)
+    {
+        mAtomicCounterBufferObserverBindings[index].bind(object);
+        mStateCache.onAtomicCounterBufferStateChange(this);
+    }
+    else if (target == BufferBinding::ShaderStorage)
+    {
+        mShaderStorageBufferObserverBindings[index].bind(object);
+        mStateCache.onShaderStorageBufferStateChange(this);
+    }
     else
     {
         mStateCache.onBufferBindingChange(this);
@@ -7245,6 +7303,24 @@
 
 void Context::validateProgramPipeline(ProgramPipelineID pipeline)
 {
+    // GLES spec 3.2, Section 7.4 "Program Pipeline Objects"
+    // If pipeline is a name that has been generated (without subsequent deletion) by
+    // GenProgramPipelines, but refers to a program pipeline object that has not been
+    // previously bound, the GL first creates a new state vector in the same manner as
+    // when BindProgramPipeline creates a new program pipeline object.
+    //
+    // void BindProgramPipeline( uint pipeline );
+    // pipeline is the program pipeline object name. The resulting program pipeline
+    // object is a new state vector, comprising all the state and with the same initial values
+    // listed in table 21.20.
+    //
+    // If we do not have a pipeline object that's been created with glBindProgramPipeline, we leave
+    // VALIDATE_STATUS at it's default false value without generating a pipeline object.
+    if (!getProgramPipeline(pipeline))
+    {
+        return;
+    }
+
     ProgramPipeline *programPipeline =
         mState.mProgramPipelineManager->checkProgramPipelineAllocation(mImplementation.get(),
                                                                        pipeline);
@@ -8578,6 +8654,18 @@
     ANGLE_CONTEXT_TRY(semaphoreObject->importZirconHandle(this, handleType, handle));
 }
 
+void Context::eGLImageTargetTexStorage(GLenum target, GLeglImageOES image, const GLint *attrib_list)
+{
+    return;
+}
+
+void Context::eGLImageTargetTextureStorage(GLuint texture,
+                                           GLeglImageOES image,
+                                           const GLint *attrib_list)
+{
+    return;
+}
+
 void Context::eGLImageTargetTexture2D(TextureType target, GLeglImageOES image)
 {
     Texture *texture        = getTextureByType(target);
@@ -8721,12 +8809,6 @@
     return mDisplay->getFrontendFeatures();
 }
 
-angle::ResourceTracker &Context::getFrameCaptureSharedResourceTracker() const
-{
-    angle::FrameCaptureShared *frameCaptureShared = getShareGroup()->getFrameCaptureShared();
-    return frameCaptureShared->getResourceTracker();
-}
-
 bool Context::isRenderbufferGenerated(RenderbufferID renderbuffer) const
 {
     return mState.mRenderbufferManager->isHandleGenerated(renderbuffer);
@@ -8859,6 +8941,16 @@
                 mState.onUniformBufferStateChange(index - kUniformBuffer0SubjectIndex);
                 mStateCache.onUniformBufferStateChange(this);
             }
+            else if (index < kAtomicCounterBufferMaxSubjectIndex)
+            {
+                mState.onAtomicCounterBufferStateChange(index - kAtomicCounterBuffer0SubjectIndex);
+                mStateCache.onAtomicCounterBufferStateChange(this);
+            }
+            else if (index < kShaderStorageBufferMaxSubjectIndex)
+            {
+                mState.onShaderStorageBufferStateChange(index - kShaderStorageBuffer0SubjectIndex);
+                mStateCache.onShaderStorageBufferStateChange(this);
+            }
             else
             {
                 ASSERT(index < kSamplerMaxSubjectIndex);
@@ -9037,6 +9129,11 @@
     mState.gles1().setAllDirty();
 }
 
+void Context::finishImmutable() const
+{
+    ANGLE_CONTEXT_TRY(mImplementation->finish(this));
+}
+
 // ErrorSet implementation.
 ErrorSet::ErrorSet(Context *context) : mContext(context) {}
 
@@ -9314,6 +9411,16 @@
     updateBasicDrawStatesError();
 }
 
+void StateCache::onAtomicCounterBufferStateChange(Context *context)
+{
+    updateBasicDrawStatesError();
+}
+
+void StateCache::onShaderStorageBufferStateChange(Context *context)
+{
+    updateBasicDrawStatesError();
+}
+
 void StateCache::onColorMaskChange(Context *context)
 {
     updateBasicDrawStatesError();
@@ -9520,8 +9627,8 @@
 
 void StateCache::updateCanDraw(Context *context)
 {
-    mCachedCanDraw = (context->isGLES1() ||
-                      (context->getState().getProgramExecutable() &&
-                       context->getState().getProgramExecutable()->hasVertexAndFragmentShader()));
+    mCachedCanDraw =
+        (context->isGLES1() || (context->getState().getProgramExecutable() &&
+                                context->getState().getProgramExecutable()->hasVertexShader()));
 }
 }  // namespace gl
diff --git a/src/libANGLE/Context.h b/src/libANGLE/Context.h
index 77f776a..696f71b 100644
--- a/src/libANGLE/Context.h
+++ b/src/libANGLE/Context.h
@@ -44,7 +44,6 @@
 {
 class FrameCapture;
 class FrameCaptureShared;
-class ResourceTracker;
 struct FrontendFeatures;
 }  // namespace angle
 
@@ -271,6 +270,8 @@
     void onQueryChange(Context *context);
     void onActiveTransformFeedbackChange(Context *context);
     void onUniformBufferStateChange(Context *context);
+    void onAtomicCounterBufferStateChange(Context *context);
+    void onShaderStorageBufferStateChange(Context *context);
     void onColorMaskChange(Context *context);
     void onBufferBindingChange(Context *context);
     void onBlendFuncIndexedChange(Context *context);
@@ -417,7 +418,6 @@
 
     bool isExternal() const { return mIsExternal; }
     bool saveAndRestoreState() const { return mSaveAndRestoreState; }
-    bool isCurrent() const { return mIsCurrent; }
 
     void getBooleanvImpl(GLenum pname, GLboolean *params) const;
     void getFloatvImpl(GLenum pname, GLfloat *params) const;
@@ -593,7 +593,6 @@
     const angle::FrontendFeatures &getFrontendFeatures() const;
 
     angle::FrameCapture *getFrameCapture() const { return mFrameCapture.get(); }
-    angle::ResourceTracker &getFrameCaptureSharedResourceTracker() const;
 
     const VertexArrayMap &getVertexArraysForCapture() const { return mVertexArrayMap; }
     const QueryMap &getQueriesForCapture() const { return mQueryMap; }
@@ -626,6 +625,12 @@
     bool supportsGeometryOrTesselation() const;
     void dirtyAllState();
 
+    bool isDestroyed() const { return mIsDestroyed; }
+    void setIsDestroyed() { mIsDestroyed = true; }
+
+    // Needed by capture serialization logic that works with a "const" Context pointer.
+    void finishImmutable() const;
+
   private:
     void initializeDefaultResources();
 
@@ -774,6 +779,8 @@
     angle::ObserverBinding mDrawFramebufferObserverBinding;
     angle::ObserverBinding mReadFramebufferObserverBinding;
     std::vector<angle::ObserverBinding> mUniformBufferObserverBindings;
+    std::vector<angle::ObserverBinding> mAtomicCounterBufferObserverBindings;
+    std::vector<angle::ObserverBinding> mShaderStorageBufferObserverBindings;
     std::vector<angle::ObserverBinding> mSamplerObserverBindings;
     std::vector<angle::ObserverBinding> mImageObserverBindings;
 
@@ -796,7 +803,7 @@
     const bool mIsExternal;
     const bool mSaveAndRestoreState;
 
-    bool mIsCurrent;
+    bool mIsDestroyed;
 };
 
 class ScopedContextRef
diff --git a/src/libANGLE/Context_gles_ext_autogen.h b/src/libANGLE/Context_gles_ext_autogen.h
index c7c3a83..cfc9020 100644
--- a/src/libANGLE/Context_gles_ext_autogen.h
+++ b/src/libANGLE/Context_gles_ext_autogen.h
@@ -104,6 +104,10 @@
     void getTranslatedShaderSource(ShaderProgramID shaderPacked, GLsizei bufsize, GLsizei *length, \
                                    GLchar *source);                                                \
     /* GL_EXT_EGL_image_array */                                                                   \
+    /* GL_EXT_EGL_image_storage */                                                                 \
+    void eGLImageTargetTexStorage(GLenum target, GLeglImageOES image, const GLint *attrib_list);   \
+    void eGLImageTargetTextureStorage(GLuint texture, GLeglImageOES image,                         \
+                                      const GLint *attrib_list);                                   \
     /* GL_EXT_YUV_target */                                                                        \
     /* GL_EXT_blend_func_extended */                                                               \
     void bindFragDataLocation(ShaderProgramID programPacked, GLuint color, const GLchar *name);    \
@@ -184,6 +188,8 @@
     /* GL_EXT_multisampled_render_to_texture2 */                                                   \
     /* GL_EXT_occlusion_query_boolean */                                                           \
     /* GL_EXT_primitive_bounding_box */                                                            \
+    /* GL_EXT_protected_textures */                                                                \
+    /* GL_EXT_pvrtc_sRGB */                                                                        \
     /* GL_EXT_read_format_bgra */                                                                  \
     /* GL_EXT_robustness */                                                                        \
     /* GL_EXT_sRGB */                                                                              \
@@ -222,10 +228,15 @@
     /* GL_EXT_texture_sRGB_RG8 */                                                                  \
     /* GL_EXT_texture_storage */                                                                   \
     void texStorage1D(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width);        \
+    /* GL_IMG_texture_compression_pvrtc */                                                         \
+    /* GL_IMG_texture_compression_pvrtc2 */                                                        \
     /* GL_KHR_blend_equation_advanced */                                                           \
     /* GL_KHR_debug */                                                                             \
     /* GL_KHR_parallel_shader_compile */                                                           \
     void maxShaderCompilerThreads(GLuint count);                                                   \
+    /* GL_KHR_texture_compression_astc_hdr */                                                      \
+    /* GL_KHR_texture_compression_astc_ldr */                                                      \
+    /* GL_KHR_texture_compression_astc_sliced_3d */                                                \
     /* GL_NV_fence */                                                                              \
     void deleteFencesNV(GLsizei n, const FenceNVID *fencesPacked);                                 \
     void finishFenceNV(FenceNVID fencePacked);                                                     \
diff --git a/src/libANGLE/Display.cpp b/src/libANGLE/Display.cpp
index 5bb886c..ea9e0a4 100644
--- a/src/libANGLE/Display.cpp
+++ b/src/libANGLE/Display.cpp
@@ -390,8 +390,8 @@
                 impl = rx::CreateVulkanXcbDisplay(state);
                 break;
             }
-            break;
-#        elif defined(ANGLE_USE_VULKAN_DISPLAY)
+#        endif
+#        if defined(ANGLE_USE_VULKAN_DISPLAY)
             if (platformType == EGL_PLATFORM_VULKAN_DISPLAY_MODE_SIMPLE_ANGLE &&
                 rx::IsVulkanSimpleDisplayAvailable())
             {
@@ -407,8 +407,8 @@
                 // Not supported creation type on vulkan display, fail display creation.
                 impl = nullptr;
             }
-            break;
 #        endif
+            break;
 #    elif defined(ANGLE_PLATFORM_ANDROID)
             if (rx::IsVulkanAndroidDisplayAvailable())
             {
@@ -532,6 +532,22 @@
       mFrameCaptureShared(new angle::FrameCaptureShared)
 {}
 
+void ShareGroup::finishAllContexts()
+{
+    for (gl::Context *shareContext : mContexts)
+    {
+        if (shareContext->hasBeenCurrent())
+        {
+            shareContext->finish();
+        }
+    }
+}
+
+void ShareGroup::addSharedContext(gl::Context *context)
+{
+    mContexts.insert(context);
+}
+
 ShareGroup::~ShareGroup()
 {
     SafeDelete(mImplementation);
@@ -736,14 +752,12 @@
       mBlobCache(gl::kDefaultMaxProgramCacheMemoryBytes),
       mMemoryProgramCache(mBlobCache),
       mGlobalTextureShareGroupUsers(0),
-      mGlobalSemaphoreShareGroupUsers(0)
+      mGlobalSemaphoreShareGroupUsers(0),
+      mIsTerminated(false)
 {}
 
 Display::~Display()
 {
-    // TODO(jmadill): When is this called?
-    // terminate();
-
     if (mPlatform == EGL_PLATFORM_ANGLE_ANGLE)
     {
         ANGLEPlatformDisplayMap *displays      = GetANGLEPlatformDisplayMap();
@@ -848,6 +862,8 @@
 
 Error Display::initialize()
 {
+    mIsTerminated = false;
+
     ASSERT(mImplementation != nullptr);
     mImplementation->setBlobCache(&mBlobCache);
 
@@ -929,6 +945,8 @@
             mImplementation->terminate();
             return error;
         }
+        // Don't leak Device memory.
+        ASSERT(mDevice == nullptr);
         mDevice = new Device(this, impl.release());
     }
     else
@@ -943,47 +961,30 @@
 
 Error Display::terminate(Thread *thread)
 {
+    mIsTerminated = true;
+
     if (!mInitialized)
     {
         return NoError();
     }
 
+    // EGL 1.5 Specification
+    // 3.2 Initialization
+    // If contexts or surfaces, created with respect to dpy are current (see section 3.7.3) to any
+    // thread, then they are not actually destroyed while they remain current. If other resources
+    // created with respect to dpy are in use by any current context or surface, then they are also
+    // not destroyed until the corresponding context or surface is no longer current.
+    for (const gl::Context *context : mContextSet)
+    {
+        if (context->getRefCount() > 0)
+        {
+            return NoError();
+        }
+    }
+
     mMemoryProgramCache.clear();
     mBlobCache.setBlobCacheFuncs(nullptr, nullptr);
 
-    if (auto *context = thread->getContext())
-    {
-        auto refCount = context->getRefCount();
-        ASSERT(refCount <= 2);
-        // If eglDestroyContext is not called for the current context, we destroy the context.
-        if (context->getRefCount() == 2)
-        {
-            ANGLE_TRY(destroyContext(thread, context));
-        }
-        // unMakeCurrent the context, so it will be released.
-        ANGLE_TRY(makeCurrent(thread, thread->getContext(), nullptr, nullptr, nullptr));
-        ASSERT(!thread->getContext());
-    }
-
-    while (!mContextSet.empty())
-    {
-        auto *context = *mContextSet.begin();
-        // If the context is never be current, so context resources are not allocated,
-        // and we don't need to make the context current for releasing resources.
-        if (!context->isExternal() && context->hasBeenCurrent())
-        {
-            ANGLE_TRY(mImplementation->makeCurrent(this, nullptr, nullptr, context));
-        }
-
-        // Force to release all refs, since the context could be current on other threads.
-        while (context->getRefCount())
-        {
-            context->release();
-        }
-
-        ANGLE_TRY(releaseContext(context));
-    }
-
     // The global texture and semaphore managers should be deleted with the last context that uses
     // it.
     ASSERT(mGlobalTextureShareGroupUsers == 0 && mTextureManager == nullptr);
@@ -1244,6 +1245,7 @@
                              const AttributeMap &attribs,
                              gl::Context **outContext)
 {
+    ASSERT(!mIsTerminated);
     ASSERT(isInitialized());
 
     if (mImplementation->testDeviceLost())
@@ -1320,7 +1322,6 @@
     }
 
     ASSERT(context != nullptr);
-    context->addRef();
     mContextSet.insert(context);
 
     ASSERT(outContext != nullptr);
@@ -1365,9 +1366,6 @@
         return NoError();
     }
 
-    // If the context is changing we need to update the reference counts. If it's not, e.g. just
-    // changing the surfaces leave the reference count alone. Otherwise the reference count might go
-    // to zero even though we know we are not done with the context.
     bool contextChanged = context != previousContext;
     if (previousContext != nullptr && contextChanged)
     {
@@ -1375,24 +1373,26 @@
         thread->setCurrent(nullptr);
 
         auto error = previousContext->unMakeCurrent(this);
-        if (previousContext->getRefCount() == 0)
+        if (previousContext->getRefCount() == 0 && previousContext->isDestroyed())
         {
-            ANGLE_TRY(releaseContext(previousContext));
+            // The previous Context may have been created with a different Display.
+            Display *previousDisplay = previousContext->getDisplay();
+            ANGLE_TRY(previousDisplay->releaseContext(previousContext, thread));
         }
         ANGLE_TRY(error);
     }
 
+    thread->setCurrent(context);
+
     ANGLE_TRY(mImplementation->makeCurrent(this, drawSurface, readSurface, context));
 
     if (context != nullptr)
     {
         ANGLE_TRY(context->makeCurrent(this, drawSurface, readSurface));
-        thread->setCurrent(context);
-    }
-
-    if (context != nullptr && contextChanged)
-    {
-        context->addRef();
+        if (contextChanged)
+        {
+            context->addRef();
+        }
     }
 
     // Tick all the scratch buffers to make sure they get cleaned up eventually if they stop being
@@ -1473,7 +1473,7 @@
 // To do that we can only call this in two places, Display::makeCurrent at the point where this
 // context is being made uncurrent and in Display::destroyContext where we make the context current
 // as part of destruction.
-Error Display::releaseContext(gl::Context *context)
+Error Display::releaseContext(gl::Context *context, Thread *thread)
 {
     ASSERT(context->getRefCount() == 0);
 
@@ -1512,32 +1512,43 @@
 
     ANGLE_TRY(context->onDestroy(this));
 
+    // If eglTerminate() has previously been called and this is the last Context the Display owns,
+    // we can now fully terminate the display and release all of its resources.
+    for (const gl::Context *ctx : mContextSet)
+    {
+        if (ctx->getRefCount() > 0)
+        {
+            return NoError();
+        }
+    }
+    if (mIsTerminated)
+    {
+        return terminate(thread);
+    }
+
     return NoError();
 }
 
 Error Display::destroyContext(Thread *thread, gl::Context *context)
 {
-    context->release();
-
     auto *currentContext     = thread->getContext();
     auto *currentDrawSurface = thread->getCurrentDrawSurface();
     auto *currentReadSurface = thread->getCurrentReadSurface();
 
-    if (context->isCurrent())
+    context->setIsDestroyed();
+
+    // If the context is still current on at least 1 thread, just return since it'll be released
+    // once no threads have it current anymore.
+    if (context->getRefCount() > 0)
     {
-        ASSERT(context->getRefCount() == 1);
-        // If the context is current, we just return, since the context has been marked destroyed,
-        // so the context will be destroyed when the context is released from the current.
         return NoError();
     }
 
-    ASSERT(context->getRefCount() == 0);
-
     // For external context, we cannot change the current native context, and the API user should
     // make sure the native context is current.
     if (context->isExternal())
     {
-        ANGLE_TRY(releaseContext(context));
+        ANGLE_TRY(releaseContext(context, thread));
     }
     else
     {
@@ -1546,6 +1557,8 @@
 
         // Make the context current, so we can release resources belong to the context, and then
         // when context is released from the current, it will be destroyed.
+        // TODO(http://www.anglebug.com/6322): Don't require a Context to be current in order to
+        // destroy it.
         ANGLE_TRY(makeCurrent(thread, currentContext, nullptr, nullptr, context));
         ANGLE_TRY(
             makeCurrent(thread, context, currentDrawSurface, currentReadSurface, currentContext));
diff --git a/src/libANGLE/Display.h b/src/libANGLE/Display.h
index f0c0910..d4615c7 100644
--- a/src/libANGLE/Display.h
+++ b/src/libANGLE/Display.h
@@ -89,7 +89,12 @@
 
     angle::FrameCaptureShared *getFrameCaptureShared() { return mFrameCaptureShared.get(); }
 
-    ContextSet *getContexts() { return &mContexts; }
+    void finishAllContexts();
+
+    const ContextSet &getContexts() const { return mContexts; }
+    void addSharedContext(gl::Context *context);
+
+    size_t getShareGroupContextCount() const { return mContexts.size(); }
 
   protected:
     ~ShareGroup();
@@ -267,8 +272,6 @@
 
     const DisplayState &getState() const { return mState; }
 
-    const ContextSet &getContextSet() { return mContextSet; }
-
     const angle::FrontendFeatures &getFrontendFeatures() { return mFrontendFeatures; }
     void overrideFrontendFeatures(const std::vector<std::string> &featureNames, bool enabled);
 
@@ -303,7 +306,7 @@
     void updateAttribsFromEnvironment(const AttributeMap &attribMap);
 
     Error restoreLostDevice();
-    Error releaseContext(gl::Context *context);
+    Error releaseContext(gl::Context *context, Thread *thread);
 
     void initDisplayExtensions();
     void initVendorString();
@@ -366,6 +369,8 @@
 
     std::mutex mDisplayGlobalMutex;
     std::mutex mProgramCacheMutex;
+
+    bool mIsTerminated;
 };
 
 }  // namespace egl
diff --git a/src/libANGLE/ErrorStrings.h b/src/libANGLE/ErrorStrings.h
index 8356518..e66ce6e 100644
--- a/src/libANGLE/ErrorStrings.h
+++ b/src/libANGLE/ErrorStrings.h
@@ -209,9 +209,11 @@
 MSG kInsufficientParams = "More parameters are required than were provided.";
 MSG kInsufficientVertexBufferSize = "Vertex buffer is not big enough for the draw call";
 MSG kIntegerOverflow = "Integer overflow.";
+MSG kInternalFormatRequiresTexture2D = "internalformat is an ETC1 or PVRTC1 format.";
 MSG kInternalFormatRequiresTexture2DArray = "internalformat is an ETC2/EAC format and target is not GL_TEXTURE_2D_ARRAY.";
 MSG kInternalFormatRequiresTexture2DArrayS3TC = "internalformat is an S3TC format and target is not GL_TEXTURE_2D_ARRAY.";
 MSG kInternalFormatRequiresTexture2DArrayRGTC = "internalformat is an RGTC format and target is not GL_TEXTURE_2D_ARRAY.";
+MSG kInternalFormatRequiresTexture2DArrayBPTC = "internalformat is a BPTC format and target is not GL_TEXTURE_2D_ARRAY.";
 MSG kInternalFormatRequiresTexture2DArrayASTC = "internalformat is an ASTC format and target is not GL_TEXTURE_2D_ARRAY.";
 MSG kInvalidAccessBits = "Invalid access bits.";
 MSG kInvalidAccessBitsFlush = "The explicit flushing bit may only be set if the buffer is mapped for writing.";
@@ -566,7 +568,9 @@
 MSG kProgramNotSeparable = "Program object was not linked with its PROGRAM_SEPARABLE status set.";
 MSG kProgramPipelineDoesNotExist = "Program pipeline does not exist.";
 MSG kNotAllStagesOfSeparableProgramUsed = "A program object is active for at least one, but not all of the shader stages that were present when the program was linked.";
+MSG kNoExecutableCodeInstalled = "There is no current program object specified by UseProgram, there is a current program pipeline object, and that object is empty (no executable code is installed for any stage).";
 MSG kProgramPipelineLinkFailed = "Program pipeline link failed";
+MSG kProtectedTexturesExtensionRequired = "GL_EXT_protected_textures not enabled.";
 
 // clang-format on
 
diff --git a/src/libANGLE/Framebuffer.cpp b/src/libANGLE/Framebuffer.cpp
index d28bbc8..207e683 100644
--- a/src/libANGLE/Framebuffer.cpp
+++ b/src/libANGLE/Framebuffer.cpp
@@ -2076,6 +2076,14 @@
             return;
         }
 
+        // This can be triggered by freeing TextureStorage in D3D back-end.
+        if (message == angle::SubjectMessage::StorageReleased)
+        {
+            mDirtyBits.set(index);
+            invalidateCompletenessCache();
+            return;
+        }
+
         // This can be triggered by the GL back-end TextureGL class.
         ASSERT(message == angle::SubjectMessage::DirtyBitsFlagged);
         return;
diff --git a/src/libANGLE/FramebufferAttachment.h b/src/libANGLE/FramebufferAttachment.h
index 013a1e0..7ebf5f5 100644
--- a/src/libANGLE/FramebufferAttachment.h
+++ b/src/libANGLE/FramebufferAttachment.h
@@ -212,6 +212,7 @@
                               GLenum binding,
                               const ImageIndex &imageIndex) const                          = 0;
     virtual bool isYUV() const                                                             = 0;
+    virtual bool hasProtectedContent() const                                               = 0;
 
     virtual void onAttach(const Context *context, rx::Serial framebufferSerial) = 0;
     virtual void onDetach(const Context *context, rx::Serial framebufferSerial) = 0;
diff --git a/src/libANGLE/GLES1State.cpp b/src/libANGLE/GLES1State.cpp
index ace3d59..93434d4 100644
--- a/src/libANGLE/GLES1State.cpp
+++ b/src/libANGLE/GLES1State.cpp
@@ -300,9 +300,9 @@
     return mModelviewMatrices.back();
 }
 
-const GLES1State::MatrixStack &GLES1State::currentMatrixStack() const
+const GLES1State::MatrixStack &GLES1State::getMatrixStack(MatrixType mode) const
 {
-    switch (mMatrixMode)
+    switch (mode)
     {
         case MatrixType::Modelview:
             return mModelviewMatrices;
@@ -316,6 +316,11 @@
     }
 }
 
+const GLES1State::MatrixStack &GLES1State::currentMatrixStack() const
+{
+    return getMatrixStack(mMatrixMode);
+}
+
 void GLES1State::loadMatrix(const angle::Mat4 &m)
 {
     setDirty(DIRTY_GLES1_MATRICES);
diff --git a/src/libANGLE/GLES1State.h b/src/libANGLE/GLES1State.h
index 5819fe6..fa994a3 100644
--- a/src/libANGLE/GLES1State.h
+++ b/src/libANGLE/GLES1State.h
@@ -177,6 +177,7 @@
     using MatrixStack = angle::FixedVector<angle::Mat4, Caps::GlobalMatrixStackDepth>;
     MatrixStack &currentMatrixStack();
     const MatrixStack &currentMatrixStack() const;
+    const MatrixStack &getMatrixStack(MatrixType mode) const;
 
     const angle::Mat4 &getModelviewMatrix() const;
 
diff --git a/src/libANGLE/Image.cpp b/src/libANGLE/Image.cpp
index d741286..3bf8fdd 100644
--- a/src/libANGLE/Image.cpp
+++ b/src/libANGLE/Image.cpp
@@ -135,6 +135,11 @@
     return mTargetOf.get() && mTargetOf->isYUV();
 }
 
+bool ImageSibling::hasProtectedContent() const
+{
+    return mTargetOf.get() && mTargetOf->hasProtectedContent();
+}
+
 void ImageSibling::notifySiblings(angle::SubjectMessage message)
 {
     if (mTargetOf.get())
@@ -203,6 +208,11 @@
     return mImplementation->isYUV();
 }
 
+bool ExternalImageSibling::hasProtectedContent() const
+{
+    return mImplementation->hasProtectedContent();
+}
+
 void ExternalImageSibling::onAttach(const gl::Context *context, rx::Serial framebufferSerial) {}
 
 void ExternalImageSibling::onDetach(const gl::Context *context, rx::Serial framebufferSerial) {}
@@ -249,7 +259,8 @@
       samples(),
       sourceType(target),
       colorspace(
-          static_cast<EGLenum>(attribs.get(EGL_GL_COLORSPACE, EGL_GL_COLORSPACE_DEFAULT_EXT)))
+          static_cast<EGLenum>(attribs.get(EGL_GL_COLORSPACE, EGL_GL_COLORSPACE_DEFAULT_EXT))),
+      hasProtectedContent(static_cast<bool>(attribs.get(EGL_PROTECTED_CONTENT_EXT, EGL_FALSE)))
 {}
 
 ImageState::~ImageState() {}
@@ -414,6 +425,11 @@
     return mState.samples;
 }
 
+bool Image::hasProtectedContent() const
+{
+    return mState.hasProtectedContent;
+}
+
 rx::ImageImpl *Image::getImplementation() const
 {
     return mImplementation;
@@ -426,6 +442,8 @@
         ExternalImageSibling *externalSibling = rx::GetAs<ExternalImageSibling>(mState.source);
         ANGLE_TRY(externalSibling->initialize(display));
 
+        mState.hasProtectedContent = externalSibling->hasProtectedContent();
+
         // Only external siblings can be YUV
         mState.yuv = externalSibling->isYUV();
     }
diff --git a/src/libANGLE/Image.h b/src/libANGLE/Image.h
index 9924ebe..c61f183 100644
--- a/src/libANGLE/Image.h
+++ b/src/libANGLE/Image.h
@@ -52,6 +52,7 @@
                       GLenum binding,
                       const gl::ImageIndex &imageIndex) const override;
     bool isYUV() const override;
+    bool hasProtectedContent() const override;
 
   protected:
     // Set the image target of this sibling
@@ -99,6 +100,7 @@
                       const gl::ImageIndex &imageIndex) const override;
     bool isTextureable(const gl::Context *context) const;
     bool isYUV() const override;
+    bool hasProtectedContent() const override;
 
     void onAttach(const gl::Context *context, rx::Serial framebufferSerial) override;
     void onDetach(const gl::Context *context, rx::Serial framebufferSerial) override;
@@ -137,6 +139,7 @@
     size_t samples;
     EGLenum sourceType;
     EGLenum colorspace;
+    bool hasProtectedContent;
 };
 
 class Image final : public RefCountObject, public LabeledObject
@@ -162,6 +165,7 @@
     size_t getHeight() const;
     bool isLayered() const;
     size_t getSamples() const;
+    bool hasProtectedContent() const;
 
     Error initialize(const Display *display);
 
diff --git a/src/libANGLE/MemoryObject.cpp b/src/libANGLE/MemoryObject.cpp
index c854faf..a137f26 100644
--- a/src/libANGLE/MemoryObject.cpp
+++ b/src/libANGLE/MemoryObject.cpp
@@ -18,7 +18,8 @@
     : RefCountObject(factory->generateSerial(), id),
       mImplementation(factory->createMemoryObject()),
       mImmutable(false),
-      mDedicatedMemory(false)
+      mDedicatedMemory(false),
+      mProtectedMemory(false)
 {}
 
 MemoryObject::~MemoryObject() {}
@@ -35,6 +36,13 @@
     return angle::Result::Continue;
 }
 
+angle::Result MemoryObject::setProtectedMemory(const Context *context, bool protectedMemory)
+{
+    ANGLE_TRY(mImplementation->setProtectedMemory(context, protectedMemory));
+    mProtectedMemory = protectedMemory;
+    return angle::Result::Continue;
+}
+
 angle::Result MemoryObject::importFd(Context *context,
                                      GLuint64 size,
                                      HandleType handleType,
diff --git a/src/libANGLE/MemoryObject.h b/src/libANGLE/MemoryObject.h
index 3e36262..0507f7e 100644
--- a/src/libANGLE/MemoryObject.h
+++ b/src/libANGLE/MemoryObject.h
@@ -38,6 +38,8 @@
 
     angle::Result setDedicatedMemory(const Context *context, bool dedicatedMemory);
     bool isDedicatedMemory() const { return mDedicatedMemory; }
+    angle::Result setProtectedMemory(const Context *context, bool protectedMemory);
+    bool isProtectedMemory() const { return mProtectedMemory; }
 
     angle::Result importFd(Context *context, GLuint64 size, HandleType handleType, GLint fd);
     angle::Result importZirconHandle(Context *context,
@@ -50,6 +52,7 @@
 
     bool mImmutable;
     bool mDedicatedMemory;
+    bool mProtectedMemory;
 };
 
 }  // namespace gl
diff --git a/src/libANGLE/MemoryProgramCache.cpp b/src/libANGLE/MemoryProgramCache.cpp
index 76a0ca6..6cabc4d 100644
--- a/src/libANGLE/MemoryProgramCache.cpp
+++ b/src/libANGLE/MemoryProgramCache.cpp
@@ -21,6 +21,7 @@
 #include "libANGLE/BinaryStream.h"
 #include "libANGLE/Context.h"
 #include "libANGLE/Uniform.h"
+#include "libANGLE/capture/FrameCapture.h"
 #include "libANGLE/histogram_macros.h"
 #include "libANGLE/renderer/ProgramImpl.h"
 #include "platform/PlatformMethods.h"
@@ -126,6 +127,9 @@
                << program->getState().getOutputLocations()
                << program->getState().getSecondaryOutputLocations();
 
+    // Include the status of FrameCapture, which adds source strings to the binary
+    hashStream << context->getShareGroup()->getFrameCaptureShared()->enabled();
+
     // Call the secure SHA hashing function.
     const std::string &programKey = hashStream.str();
     angle::base::SHA1HashBytes(reinterpret_cast<const unsigned char *>(programKey.c_str()),
diff --git a/src/libANGLE/Observer.h b/src/libANGLE/Observer.h
index 35b462a..2f48092 100644
--- a/src/libANGLE/Observer.h
+++ b/src/libANGLE/Observer.h
@@ -61,6 +61,12 @@
     ProgramRelinked,
     // Indicates a separable program's sampler uniforms were updated.
     SamplerUniformsUpdated,
+
+    // Indicates a Storage of back-end in gl::Texture has been released.
+    StorageReleased,
+
+    // Indicates that all pending updates are complete in the subject.
+    InitializationComplete,
 };
 
 // The observing class inherits from this interface class.
diff --git a/src/libANGLE/Program.cpp b/src/libANGLE/Program.cpp
index d20d95e..3ed7190 100644
--- a/src/libANGLE/Program.cpp
+++ b/src/libANGLE/Program.cpp
@@ -27,6 +27,7 @@
 #include "libANGLE/Uniform.h"
 #include "libANGLE/VaryingPacking.h"
 #include "libANGLE/Version.h"
+#include "libANGLE/capture/FrameCapture.h"
 #include "libANGLE/features.h"
 #include "libANGLE/histogram_macros.h"
 #include "libANGLE/queryconversions.h"
@@ -788,6 +789,46 @@
     LoadShaderVariableBuffer(stream, block);
 }
 
+void WriteShInterfaceBlock(BinaryOutputStream *stream, const sh::InterfaceBlock &block)
+{
+    stream->writeString(block.name);
+    stream->writeString(block.mappedName);
+    stream->writeString(block.instanceName);
+    stream->writeInt(block.arraySize);
+    stream->writeEnum(block.layout);
+    stream->writeBool(block.isRowMajorLayout);
+    stream->writeInt(block.binding);
+    stream->writeBool(block.staticUse);
+    stream->writeBool(block.active);
+    stream->writeEnum(block.blockType);
+
+    stream->writeInt<size_t>(block.fields.size());
+    for (const sh::ShaderVariable &shaderVariable : block.fields)
+    {
+        WriteShaderVar(stream, shaderVariable);
+    }
+}
+
+void LoadShInterfaceBlock(BinaryInputStream *stream, sh::InterfaceBlock *block)
+{
+    block->name             = stream->readString();
+    block->mappedName       = stream->readString();
+    block->instanceName     = stream->readString();
+    block->arraySize        = stream->readInt<unsigned int>();
+    block->layout           = stream->readEnum<sh::BlockLayoutType>();
+    block->isRowMajorLayout = stream->readBool();
+    block->binding          = stream->readInt<int>();
+    block->staticUse        = stream->readBool();
+    block->active           = stream->readBool();
+    block->blockType        = stream->readEnum<sh::BlockType>();
+
+    block->fields.resize(stream->readInt<size_t>());
+    for (sh::ShaderVariable &variable : block->fields)
+    {
+        LoadShaderVar(stream, &variable);
+    }
+}
+
 // Saves the linking context for later use in resolveLink().
 struct Program::LinkingState
 {
@@ -1515,6 +1556,7 @@
 
     std::unique_ptr<LinkingState> linkingState(new LinkingState());
     ProgramMergedVaryings mergedVaryings;
+    LinkingVariables linkingVariables(mState);
     ProgramLinkedResources &resources = linkingState->resources;
 
     if (mState.mAttachedShaders[ShaderType::Compute])
@@ -1590,7 +1632,7 @@
             return angle::Result::Continue;
         }
 
-        if (!LinkValidateProgramGlobalNames(infoLog, *this))
+        if (!LinkValidateProgramGlobalNames(infoLog, getExecutable(), linkingVariables))
         {
             return angle::Result::Continue;
         }
@@ -1620,10 +1662,10 @@
         InitUniformBlockLinker(mState, &resources.uniformBlockLinker);
         InitShaderStorageBlockLinker(mState, &resources.shaderStorageBlockLinker);
 
-        mergedVaryings = GetMergedVaryingsFromShaders(*this, getExecutable());
-        if (!mState.mExecutable->linkMergedVaryings(context, *this, mergedVaryings,
-                                                    mState.mTransformFeedbackVaryingNames,
-                                                    isSeparable(), &resources.varyingPacking))
+        mergedVaryings = GetMergedVaryingsFromLinkingVariables(linkingVariables);
+        if (!mState.mExecutable->linkMergedVaryings(
+                context, mergedVaryings, mState.mTransformFeedbackVaryingNames, linkingVariables,
+                isSeparable(), &resources.varyingPacking))
         {
             return angle::Result::Continue;
         }
@@ -1857,7 +1899,6 @@
 
     BinaryInputStream stream(binary, length);
     ANGLE_TRY(deserialize(context, stream, infoLog));
-
     // Currently we require the full shader text to compute the program hash.
     // We could also store the binary in the internal program cache.
 
@@ -4665,6 +4706,29 @@
     stream.writeInt(mState.getAtomicCounterUniformRange().low());
     stream.writeInt(mState.getAtomicCounterUniformRange().high());
 
+    if (context->getShareGroup()->getFrameCaptureShared()->enabled())
+    {
+        // Serialize the source for each stage for re-use during capture
+        for (ShaderType shaderType : mState.mExecutable->getLinkedShaderStages())
+        {
+            gl::Shader *shader = getAttachedShader(shaderType);
+            if (shader)
+            {
+                stream.writeString(shader->getSourceString());
+            }
+            else
+            {
+                // If we dont have an attached shader, which would occur if this program was
+                // created via glProgramBinary, pull from our cached copy
+                const angle::ProgramSources &cachedLinkedSources =
+                    context->getShareGroup()->getFrameCaptureShared()->getProgramSources(id());
+                const std::string &cachedSourceString = cachedLinkedSources[shaderType];
+                ASSERT(!cachedSourceString.empty());
+                stream.writeString(cachedSourceString.c_str());
+            }
+        }
+    }
+
     mProgram->save(context, &stream);
 
     ASSERT(binaryOut);
@@ -4772,6 +4836,23 @@
     postResolveLink(context);
     mState.mExecutable->updateCanDrawWith();
 
+    if (context->getShareGroup()->getFrameCaptureShared()->enabled())
+    {
+        // Extract the source for each stage from the program binary
+        angle::ProgramSources sources;
+
+        for (ShaderType shaderType : mState.mExecutable->getLinkedShaderStages())
+        {
+            std::string shaderSource = stream.readString();
+            ASSERT(shaderSource.length() > 0);
+            sources[shaderType] = std::move(shaderSource);
+        }
+
+        // Store it for use during mid-execution capture
+        context->getShareGroup()->getFrameCaptureShared()->setProgramSources(id(),
+                                                                             std::move(sources));
+    }
+
     return angle::Result::Continue;
 }
 
@@ -4794,18 +4875,4 @@
         mState.mBaseInstanceLocation = getUniformLocation("gl_BaseInstance").value;
     }
 }
-
-// HasAttachedShaders implementation.
-ShaderType HasAttachedShaders::getTransformFeedbackStage() const
-{
-    if (getAttachedShader(ShaderType::Geometry))
-    {
-        return ShaderType::Geometry;
-    }
-    if (getAttachedShader(ShaderType::TessEvaluation))
-    {
-        return ShaderType::TessEvaluation;
-    }
-    return ShaderType::Vertex;
-}
 }  // namespace gl
diff --git a/src/libANGLE/Program.h b/src/libANGLE/Program.h
index e18bafd..0b51ad7 100644
--- a/src/libANGLE/Program.h
+++ b/src/libANGLE/Program.h
@@ -111,6 +111,9 @@
 void WriteInterfaceBlock(BinaryOutputStream *stream, const InterfaceBlock &block);
 void LoadInterfaceBlock(BinaryInputStream *stream, InterfaceBlock *block);
 
+void WriteShInterfaceBlock(BinaryOutputStream *stream, const sh::InterfaceBlock &block);
+void LoadShInterfaceBlock(BinaryInputStream *stream, sh::InterfaceBlock *block);
+
 void WriteShaderVariableBuffer(BinaryOutputStream *stream, const ShaderVariableBuffer &var);
 void LoadShaderVariableBuffer(BinaryInputStream *stream, ShaderVariableBuffer *var);
 
@@ -445,19 +448,7 @@
 
 using ProgramMergedVaryings = std::vector<ProgramVaryingRef>;
 
-// TODO: Copy necessary shader state into Program. http://anglebug.com/5506
-class HasAttachedShaders
-{
-  public:
-    virtual Shader *getAttachedShader(ShaderType shaderType) const = 0;
-
-    ShaderType getTransformFeedbackStage() const;
-
-  protected:
-    virtual ~HasAttachedShaders() {}
-};
-
-class Program final : public LabeledObject, public angle::Subject, public HasAttachedShaders
+class Program final : public LabeledObject, public angle::Subject
 {
   public:
     Program(rx::GLImplFactory *factory, ShaderProgramManager *manager, ShaderProgramID handle);
@@ -478,8 +469,7 @@
     void detachShader(const Context *context, Shader *shader);
     int getAttachedShadersCount() const;
 
-    // HasAttachedShaders implementation
-    Shader *getAttachedShader(ShaderType shaderType) const override;
+    Shader *getAttachedShader(ShaderType shaderType) const;
 
     void bindAttributeLocation(GLuint index, const char *name);
     void bindUniformLocation(UniformLocation location, const char *name);
diff --git a/src/libANGLE/ProgramExecutable.cpp b/src/libANGLE/ProgramExecutable.cpp
index e71abc1..c69a021 100644
--- a/src/libANGLE/ProgramExecutable.cpp
+++ b/src/libANGLE/ProgramExecutable.cpp
@@ -431,6 +431,16 @@
             {
                 LoadShaderVar(stream, &variable);
             }
+            mLinkedUniforms[shaderType].resize(stream->readInt<size_t>());
+            for (sh::ShaderVariable &variable : mLinkedUniforms[shaderType])
+            {
+                LoadShaderVar(stream, &variable);
+            }
+            mLinkedUniformBlocks[shaderType].resize(stream->readInt<size_t>());
+            for (sh::InterfaceBlock &shaderStorageBlock : mLinkedUniformBlocks[shaderType])
+            {
+                LoadShInterfaceBlock(stream, &shaderStorageBlock);
+            }
             mLinkedShaderVersions[shaderType] = stream->readInt<int>();
         }
         for (ShaderType shaderType : mLinkedComputeShaderStages)
@@ -445,6 +455,16 @@
             {
                 LoadShaderVar(stream, &variable);
             }
+            mLinkedUniforms[shaderType].resize(stream->readInt<size_t>());
+            for (sh::ShaderVariable &variable : mLinkedUniforms[shaderType])
+            {
+                LoadShaderVar(stream, &variable);
+            }
+            mLinkedUniformBlocks[shaderType].resize(stream->readInt<size_t>());
+            for (sh::InterfaceBlock &shaderStorageBlock : mLinkedUniformBlocks[shaderType])
+            {
+                LoadShInterfaceBlock(stream, &shaderStorageBlock);
+            }
             mLinkedShaderVersions[shaderType] = stream->readInt<int>();
         }
     }
@@ -612,6 +632,16 @@
             {
                 WriteShaderVar(stream, shaderVariable);
             }
+            stream->writeInt(mLinkedUniforms[shaderType].size());
+            for (const sh::ShaderVariable &shaderVariable : mLinkedUniforms[shaderType])
+            {
+                WriteShaderVar(stream, shaderVariable);
+            }
+            stream->writeInt(mLinkedUniformBlocks[shaderType].size());
+            for (const sh::InterfaceBlock &shaderStorageBlock : mLinkedUniformBlocks[shaderType])
+            {
+                WriteShInterfaceBlock(stream, shaderStorageBlock);
+            }
             stream->writeInt(mLinkedShaderVersions[shaderType]);
         }
         for (ShaderType shaderType : mLinkedComputeShaderStages)
@@ -626,6 +656,16 @@
             {
                 WriteShaderVar(stream, shaderVariable);
             }
+            stream->writeInt(mLinkedUniforms[shaderType].size());
+            for (const sh::ShaderVariable &shaderVariable : mLinkedUniforms[shaderType])
+            {
+                WriteShaderVar(stream, shaderVariable);
+            }
+            stream->writeInt(mLinkedUniformBlocks[shaderType].size());
+            for (const sh::InterfaceBlock &shaderStorageBlock : mLinkedUniformBlocks[shaderType])
+            {
+                WriteShInterfaceBlock(stream, shaderStorageBlock);
+            }
             stream->writeInt(mLinkedShaderVersions[shaderType]);
         }
     }
@@ -772,10 +812,10 @@
 
 void ProgramExecutable::updateActiveImages(const ProgramExecutable &executable)
 {
-    const std::vector<ImageBinding> *imageBindings = getImageBindings();
-    for (uint32_t imageIndex = 0; imageIndex < imageBindings->size(); ++imageIndex)
+    const std::vector<ImageBinding> &imageBindings = executable.getImageBindings();
+    for (uint32_t imageIndex = 0; imageIndex < imageBindings.size(); ++imageIndex)
     {
-        const gl::ImageBinding &imageBinding = imageBindings->at(imageIndex);
+        const gl::ImageBinding &imageBinding = imageBindings.at(imageIndex);
 
         uint32_t uniformIndex = executable.getUniformIndexFromImageIndex(imageIndex);
         const gl::LinkedUniform &imageUniform = executable.getUniforms()[uniformIndex];
@@ -845,8 +885,7 @@
 
 void ProgramExecutable::updateCanDrawWith()
 {
-    mCanDrawWith =
-        (hasLinkedShaderStage(ShaderType::Vertex) && hasLinkedShaderStage(ShaderType::Fragment));
+    mCanDrawWith = hasLinkedShaderStage(ShaderType::Vertex);
 }
 
 void ProgramExecutable::saveLinkedStateInfo(const ProgramState &state)
@@ -858,6 +897,8 @@
         mLinkedOutputVaryings[shaderType] = shader->getOutputVaryings();
         mLinkedInputVaryings[shaderType]  = shader->getInputVaryings();
         mLinkedShaderVersions[shaderType] = shader->getShaderVersion();
+        mLinkedUniforms[shaderType]       = shader->getUniforms();
+        mLinkedUniformBlocks[shaderType]  = shader->getUniformBlocks();
     }
 }
 
@@ -873,13 +914,13 @@
 
 bool ProgramExecutable::linkMergedVaryings(
     const Context *context,
-    const HasAttachedShaders &programOrPipeline,
     const ProgramMergedVaryings &mergedVaryings,
     const std::vector<std::string> &transformFeedbackVaryingNames,
+    const LinkingVariables &linkingVariables,
     bool isSeparable,
     ProgramVaryingPacking *varyingPacking)
 {
-    ShaderType tfStage = programOrPipeline.getTransformFeedbackStage();
+    ShaderType tfStage = GetLastPreFragmentStage(linkingVariables.isShaderStageUsedBitset);
 
     if (!linkValidateTransformFeedback(context, mergedVaryings, tfStage,
                                        transformFeedbackVaryingNames))
@@ -908,7 +949,7 @@
         // attached shaders.
         // - Check for linked shaders to handle the case of a PPO linking separable programs before
         // drawing.
-        if (programOrPipeline.getAttachedShader(shaderType) ||
+        if (linkingVariables.isShaderStageUsedBitset[shaderType] ||
             getLinkedShaderStages().test(shaderType))
         {
             activeShadersMask[shaderType] = true;
diff --git a/src/libANGLE/ProgramExecutable.h b/src/libANGLE/ProgramExecutable.h
index 3e2f7d4..3099403 100644
--- a/src/libANGLE/ProgramExecutable.h
+++ b/src/libANGLE/ProgramExecutable.h
@@ -163,8 +163,6 @@
                mLinkedGraphicsShaderStages[ShaderType::TessEvaluation];
     }
 
-    ShaderType getTransformFeedbackStage() const;
-
     ShaderType getLinkedTransformFeedbackStage() const;
 
     // A PPO can have both graphics and compute programs attached, so
@@ -229,7 +227,7 @@
     size_t getTransformFeedbackBufferCount() const { return mTransformFeedbackStrides.size(); }
 
     void updateCanDrawWith();
-    bool hasVertexAndFragmentShader() const { return mCanDrawWith; }
+    bool hasVertexShader() const { return mCanDrawWith; }
 
     const std::vector<sh::ShaderVariable> &getProgramInputs() const { return mProgramInputs; }
     const std::vector<sh::ShaderVariable> &getOutputVariables() const { return mOutputVariables; }
@@ -321,6 +319,16 @@
         return mLinkedInputVaryings[shaderType];
     }
 
+    const std::vector<sh::ShaderVariable> &getLinkedUniforms(ShaderType shaderType) const
+    {
+        return mLinkedUniforms[shaderType];
+    }
+
+    const std::vector<sh::InterfaceBlock> &getLinkedUniformBlocks(ShaderType shaderType) const
+    {
+        return mLinkedUniformBlocks[shaderType];
+    }
+
     int getLinkedShaderVersion(ShaderType shaderType) const
     {
         return mLinkedShaderVersions[shaderType];
@@ -372,9 +380,9 @@
                                                std::vector<SamplerBinding> &samplerBindings);
 
     bool linkMergedVaryings(const Context *context,
-                            const HasAttachedShaders &programOrPipeline,
                             const ProgramMergedVaryings &mergedVaryings,
                             const std::vector<std::string> &transformFeedbackVaryingNames,
+                            const LinkingVariables &linkingVariables,
                             bool isSeparable,
                             ProgramVaryingPacking *varyingPacking);
 
@@ -483,6 +491,9 @@
 
     ShaderMap<std::vector<sh::ShaderVariable>> mLinkedOutputVaryings;
     ShaderMap<std::vector<sh::ShaderVariable>> mLinkedInputVaryings;
+    ShaderMap<std::vector<sh::ShaderVariable>> mLinkedUniforms;
+    ShaderMap<std::vector<sh::InterfaceBlock>> mLinkedUniformBlocks;
+
     ShaderMap<int> mLinkedShaderVersions;
 
     // GL_EXT_geometry_shader.
diff --git a/src/libANGLE/ProgramLinkedResources.cpp b/src/libANGLE/ProgramLinkedResources.cpp
index 9e12b0f..121991f 100644
--- a/src/libANGLE/ProgramLinkedResources.cpp
+++ b/src/libANGLE/ProgramLinkedResources.cpp
@@ -1405,6 +1405,39 @@
 
 ProgramLinkedResources::~ProgramLinkedResources() = default;
 
+LinkingVariables::LinkingVariables(const ProgramState &state)
+{
+    for (ShaderType shaderType : kAllGraphicsShaderTypes)
+    {
+        Shader *shader = state.getAttachedShader(shaderType);
+        if (shader)
+        {
+            outputVaryings[shaderType] = shader->getOutputVaryings();
+            inputVaryings[shaderType]  = shader->getInputVaryings();
+            uniforms[shaderType]       = shader->getUniforms();
+            uniformBlocks[shaderType]  = shader->getUniformBlocks();
+            isShaderStageUsedBitset.set(shaderType);
+        }
+    }
+}
+
+LinkingVariables::LinkingVariables(const ProgramPipelineState &state)
+{
+    for (ShaderType shaderType : state.getProgramExecutable().getLinkedShaderStages())
+    {
+        const Program *program = state.getShaderProgram(shaderType);
+        ASSERT(program);
+        outputVaryings[shaderType] = program->getExecutable().getLinkedOutputVaryings(shaderType);
+        inputVaryings[shaderType]  = program->getExecutable().getLinkedInputVaryings(shaderType);
+        uniforms[shaderType] = program->getState().getExecutable().getLinkedUniforms(shaderType);
+        uniformBlocks[shaderType] =
+            program->getState().getExecutable().getLinkedUniformBlocks(shaderType);
+        isShaderStageUsedBitset.set(shaderType);
+    }
+}
+
+LinkingVariables::~LinkingVariables() = default;
+
 void ProgramLinkedResources::init(std::vector<InterfaceBlock> *uniformBlocksOut,
                                   std::vector<LinkedUniform> *uniformsOut,
                                   std::vector<InterfaceBlock> *shaderStorageBlocksOut,
@@ -1501,8 +1534,9 @@
     }
 }
 
-// Note: this is broken for pipelines with modified/discarded shaders. http://anglebug.com/5506
-bool LinkValidateProgramGlobalNames(InfoLog &infoLog, const HasAttachedShaders &programOrPipeline)
+bool LinkValidateProgramGlobalNames(InfoLog &infoLog,
+                                    const ProgramExecutable &executable,
+                                    const LinkingVariables &linkingVariables)
 {
     angle::HashMap<std::string, const sh::ShaderVariable *> uniformMap;
     using BlockAndFieldPair = std::pair<const sh::InterfaceBlock *, const sh::ShaderVariable *>;
@@ -1510,14 +1544,13 @@
 
     for (ShaderType shaderType : kAllGraphicsShaderTypes)
     {
-        Shader *shader = programOrPipeline.getAttachedShader(shaderType);
-        if (!shader)
+        if (!linkingVariables.isShaderStageUsedBitset[shaderType])
         {
             continue;
         }
 
         // Build a map of Uniforms
-        const std::vector<sh::ShaderVariable> uniforms = shader->getUniforms();
+        const std::vector<sh::ShaderVariable> &uniforms = linkingVariables.uniforms[shaderType];
         for (const auto &uniform : uniforms)
         {
             uniformMap[uniform.name] = &uniform;
@@ -1526,7 +1559,9 @@
         // Build a map of Uniform Blocks
         // This will also detect any field name conflicts between Uniform Blocks without instance
         // names
-        const std::vector<sh::InterfaceBlock> &uniformBlocks = shader->getUniformBlocks();
+        const std::vector<sh::InterfaceBlock> &uniformBlocks =
+            linkingVariables.uniformBlocks[shaderType];
+
         for (const auto &uniformBlock : uniformBlocks)
         {
             // Only uniform blocks without an instance name can create a conflict with their field
@@ -1585,19 +1620,18 @@
     }
 
     // Validate no uniform names conflict with attribute names
-    Shader *vertexShader = programOrPipeline.getAttachedShader(ShaderType::Vertex);
-    if (vertexShader)
+    if (linkingVariables.isShaderStageUsedBitset[ShaderType::Vertex])
     {
         // ESSL 3.00.6 section 4.3.5:
         // If a uniform variable name is declared in one stage (e.g., a vertex shader)
         // but not in another (e.g., a fragment shader), then that name is still
         // available in the other stage for a different use.
         std::unordered_set<std::string> uniforms;
-        for (const sh::ShaderVariable &uniform : vertexShader->getUniforms())
+        for (const sh::ShaderVariable &uniform : linkingVariables.uniforms[ShaderType::Vertex])
         {
             uniforms.insert(uniform.name);
         }
-        for (const auto &attrib : vertexShader->getActiveAttributes())
+        for (const auto &attrib : executable.getProgramInputs())
         {
             if (uniforms.count(attrib.name))
             {
diff --git a/src/libANGLE/ProgramLinkedResources.h b/src/libANGLE/ProgramLinkedResources.h
index e51e504..b3b7c46 100644
--- a/src/libANGLE/ProgramLinkedResources.h
+++ b/src/libANGLE/ProgramLinkedResources.h
@@ -39,6 +39,7 @@
 enum class LinkMismatchError;
 struct LinkedUniform;
 class ProgramState;
+class ProgramPipelineState;
 class ProgramBindings;
 class ProgramAliasedBindings;
 class Shader;
@@ -236,6 +237,19 @@
     std::vector<std::string> unusedInterfaceBlocks;
 };
 
+struct LinkingVariables final : private angle::NonCopyable
+{
+    LinkingVariables(const ProgramState &state);
+    LinkingVariables(const ProgramPipelineState &state);
+    ~LinkingVariables();
+
+    ShaderMap<std::vector<sh::ShaderVariable>> outputVaryings;
+    ShaderMap<std::vector<sh::ShaderVariable>> inputVaryings;
+    ShaderMap<std::vector<sh::ShaderVariable>> uniforms;
+    ShaderMap<std::vector<sh::InterfaceBlock>> uniformBlocks;
+    ShaderBitSet isShaderStageUsedBitset;
+};
+
 class CustomBlockLayoutEncoderFactory : angle::NonCopyable
 {
   public:
@@ -263,7 +277,9 @@
     CustomBlockLayoutEncoderFactory *mCustomEncoderFactory;
 };
 
-bool LinkValidateProgramGlobalNames(InfoLog &infoLog, const HasAttachedShaders &programOrPipeline);
+bool LinkValidateProgramGlobalNames(InfoLog &infoLog,
+                                    const ProgramExecutable &executable,
+                                    const LinkingVariables &linkingVariables);
 bool LinkValidateShaderInterfaceMatching(const std::vector<sh::ShaderVariable> &outputVaryings,
                                          const std::vector<sh::ShaderVariable> &inputVaryings,
                                          ShaderType frontShaderType,
diff --git a/src/libANGLE/ProgramPipeline.cpp b/src/libANGLE/ProgramPipeline.cpp
index 5fe22e9..8644171 100644
--- a/src/libANGLE/ProgramPipeline.cpp
+++ b/src/libANGLE/ProgramPipeline.cpp
@@ -125,7 +125,8 @@
         const Program *program = getShaderProgram(shaderType);
         ASSERT(program);
         mExecutable->setActiveTextureMask(program->getExecutable().getActiveSamplersMask());
-        mExecutable->setActiveImagesMask(program->getExecutable().getActiveImagesMask());
+        mExecutable->setActiveImagesMask(mExecutable->getActiveImagesMask() |
+                                         program->getExecutable().getActiveImagesMask());
         // Updates mActiveSamplerRefCounts, mActiveSamplerTypes, and mActiveSamplerFormats
         mExecutable->updateActiveSamplers(program->getState());
     }
@@ -237,6 +238,7 @@
     mState.mExecutable->mMaxActiveAttribLocation   = vertexExecutable.mMaxActiveAttribLocation;
     mState.mExecutable->mAttributesTypeMask        = vertexExecutable.mAttributesTypeMask;
     mState.mExecutable->mAttributesMask            = vertexExecutable.mAttributesMask;
+    mState.mExecutable->mProgramInputs             = vertexExecutable.mProgramInputs;
 }
 
 void ProgramPipeline::updateTransformFeedbackMembers()
@@ -522,6 +524,7 @@
 
     ProgramMergedVaryings mergedVaryings;
     ProgramVaryingPacking varyingPacking;
+    LinkingVariables linkingVariables(mState);
 
     if (!getExecutable().isCompute())
     {
@@ -533,19 +536,22 @@
             return angle::Result::Stop;
         }
 
-        if (!LinkValidateProgramGlobalNames(infoLog, *this))
+        if (!LinkValidateProgramGlobalNames(infoLog, getExecutable(), linkingVariables))
         {
             return angle::Result::Stop;
         }
 
-        mergedVaryings = GetMergedVaryingsFromShaders(*this, getExecutable());
+        mergedVaryings = GetMergedVaryingsFromLinkingVariables(linkingVariables);
         // If separable program objects are in use, the set of attributes captured is taken
         // from the program object active on the last vertex processing stage.
         ShaderType lastVertexProcessingStage =
             gl::GetLastPreFragmentStage(getExecutable().getLinkedShaderStages());
         if (lastVertexProcessingStage == ShaderType::InvalidEnum)
         {
-            return angle::Result::Stop;
+            //  If there is no active program for the vertex or fragment shader stages, the results
+            //  of vertex and fragment shader execution will respectively be undefined. However,
+            //  this is not an error.
+            return angle::Result::Continue;
         }
 
         Program *tfProgram = getShaderProgram(lastVertexProcessingStage);
@@ -559,9 +565,9 @@
         const std::vector<std::string> &transformFeedbackVaryingNames =
             tfProgram->getState().getTransformFeedbackVaryingNames();
 
-        if (!mState.mExecutable->linkMergedVaryings(context, *this, mergedVaryings,
-                                                    transformFeedbackVaryingNames, false,
-                                                    &varyingPacking))
+        if (!mState.mExecutable->linkMergedVaryings(context, mergedVaryings,
+                                                    transformFeedbackVaryingNames, linkingVariables,
+                                                    false, &varyingPacking))
         {
             return angle::Result::Stop;
         }
@@ -609,7 +615,7 @@
     Program *fragmentProgram = mState.mPrograms[ShaderType::Fragment];
     if (!vertexProgram || !fragmentProgram)
     {
-        return false;
+        return true;
     }
     ProgramExecutable &vertexExecutable   = vertexProgram->getExecutable();
     ProgramExecutable &fragmentExecutable = fragmentProgram->getExecutable();
@@ -651,6 +657,15 @@
         }
     }
 
+    intptr_t drawStatesError = context->getStateCache().getBasicDrawStatesError(context);
+    if (drawStatesError)
+    {
+        mState.mValid            = false;
+        const char *errorMessage = reinterpret_cast<const char *>(drawStatesError);
+        infoLog << errorMessage << "\n";
+        return;
+    }
+
     if (!linkVaryings(infoLog))
     {
         mState.mValid = false;
@@ -690,10 +705,4 @@
             break;
     }
 }
-
-Shader *ProgramPipeline::getAttachedShader(ShaderType shaderType) const
-{
-    const Program *program = mState.mPrograms[shaderType];
-    return program ? program->getAttachedShader(shaderType) : nullptr;
-}
 }  // namespace gl
diff --git a/src/libANGLE/ProgramPipeline.h b/src/libANGLE/ProgramPipeline.h
index e951a8e..691c9ee 100644
--- a/src/libANGLE/ProgramPipeline.h
+++ b/src/libANGLE/ProgramPipeline.h
@@ -91,8 +91,7 @@
 
 class ProgramPipeline final : public RefCountObject<ProgramPipelineID>,
                               public LabeledObject,
-                              public angle::ObserverInterface,
-                              public HasAttachedShaders
+                              public angle::ObserverInterface
 {
   public:
     ProgramPipeline(rx::GLImplFactory *factory, ProgramPipelineID handle);
@@ -136,9 +135,6 @@
     // ObserverInterface implementation.
     void onSubjectStateChange(angle::SubjectIndex index, angle::SubjectMessage message) override;
 
-    // HasAttachedShaders implementation
-    Shader *getAttachedShader(ShaderType shaderType) const override;
-
   private:
     void updateLinkedShaderStages();
     void updateExecutableAttributes();
diff --git a/src/libANGLE/Renderbuffer.cpp b/src/libANGLE/Renderbuffer.cpp
index 946f4d8..93f86bc 100644
--- a/src/libANGLE/Renderbuffer.cpp
+++ b/src/libANGLE/Renderbuffer.cpp
@@ -34,6 +34,7 @@
       mFormat(GL_RGBA4),
       mSamples(0),
       mMultisamplingMode(MultisamplingMode::Regular),
+      mHasProtectedContent(false),
       mInitState(InitState::Initialized)
 {}
 
@@ -76,12 +77,18 @@
                                MultisamplingMode multisamplingMode,
                                InitState initState)
 {
-    mWidth             = width;
-    mHeight            = height;
-    mFormat            = format;
-    mSamples           = samples;
-    mMultisamplingMode = multisamplingMode;
-    mInitState         = InitState::MayNeedInit;
+    mWidth               = width;
+    mHeight              = height;
+    mFormat              = format;
+    mSamples             = samples;
+    mMultisamplingMode   = multisamplingMode;
+    mInitState           = InitState::MayNeedInit;
+    mHasProtectedContent = false;
+}
+
+void RenderbufferState::setProtectedContent(bool hasProtectedContent)
+{
+    mHasProtectedContent = hasProtectedContent;
 }
 
 // Renderbuffer implementation.
@@ -164,6 +171,8 @@
     mState.update(static_cast<GLsizei>(image->getWidth()), static_cast<GLsizei>(image->getHeight()),
                   Format(image->getFormat()), 0, MultisamplingMode::Regular,
                   image->sourceInitState());
+    mState.setProtectedContent(image->hasProtectedContent());
+
     onStateChange(angle::SubjectMessage::SubjectChanged);
 
     return angle::Result::Continue;
diff --git a/src/libANGLE/Renderbuffer.h b/src/libANGLE/Renderbuffer.h
index 8e6e612..4380a71 100644
--- a/src/libANGLE/Renderbuffer.h
+++ b/src/libANGLE/Renderbuffer.h
@@ -44,6 +44,7 @@
     GLsizei getSamples() const;
     MultisamplingMode getMultisamplingMode() const;
     InitState getInitState() const;
+    void setProtectedContent(bool hasProtectedContent);
 
   private:
     friend class Renderbuffer;
@@ -60,6 +61,7 @@
     Format mFormat;
     GLsizei mSamples;
     MultisamplingMode mMultisamplingMode;
+    bool mHasProtectedContent;
 
     // For robust resource init.
     InitState mInitState;
diff --git a/src/libANGLE/Shader.cpp b/src/libANGLE/Shader.cpp
index bbda668..39b670e 100644
--- a/src/libANGLE/Shader.cpp
+++ b/src/libANGLE/Shader.cpp
@@ -356,7 +356,7 @@
         options |= SH_INIT_SHARED_VARIABLES;
     }
 
-    // Some targets (eg D3D11 Feature Level 9_3 and below) do not support non-constant loop
+    // Some targets (e.g. D3D11 Feature Level 9_3 and below) do not support non-constant loop
     // indexes in fragment shaders. Shader compilation will fail. To provide a better error
     // message we can instruct the compiler to pre-validate.
     if (mRendererLimitations.shadersRequireIndexedLoopValidation)
@@ -369,6 +369,12 @@
         options |= SH_SCALARIZE_VEC_AND_MAT_CONSTRUCTOR_ARGS;
     }
 
+    if (context->getFrontendFeatures().forceInitShaderVariables.enabled)
+    {
+        options |= SH_INIT_OUTPUT_VARIABLES;
+        options |= SH_INITIALIZE_UNINITIALIZED_LOCALS;
+    }
+
     mCurrentMaxComputeWorkGroupInvocations =
         static_cast<GLuint>(context->getCaps().maxComputeWorkGroupInvocations);
 
diff --git a/src/libANGLE/Shader.h b/src/libANGLE/Shader.h
index 5b1bb6c..37d824e 100644
--- a/src/libANGLE/Shader.h
+++ b/src/libANGLE/Shader.h
@@ -247,6 +247,8 @@
     unsigned int getMaxComputeSharedMemory() const { return mMaxComputeSharedMemory; }
     bool hasBeenDeleted() const { return mDeleteStatus; }
 
+    void resolveCompile();
+
   private:
     struct CompilingState;
 
@@ -256,8 +258,6 @@
                               GLsizei *length,
                               char *buffer);
 
-    void resolveCompile();
-
     ShaderState mState;
     std::unique_ptr<rx::ShaderImpl> mImplementation;
     const gl::Limitations mRendererLimitations;
diff --git a/src/libANGLE/State.cpp b/src/libANGLE/State.cpp
index a8c9cda..50c8a4c 100644
--- a/src/libANGLE/State.cpp
+++ b/src/libANGLE/State.cpp
@@ -319,8 +319,6 @@
       mSemaphoreManager(AllocateOrGetSharedResourceManager(shareContextState,
                                                            &State::mSemaphoreManager,
                                                            shareSemaphores)),
-      mMaxDrawBuffers(0),
-      mMaxCombinedTextureImageUnits(0),
       mDepthClearValue(0),
       mStencilClearValue(0),
       mScissorTest(false),
@@ -360,21 +358,28 @@
       mMaxShaderCompilerThreads(std::numeric_limits<GLuint>::max()),
       mPatchVertices(3),
       mOverlay(overlay),
-      mNoSimultaneousConstantColorAndAlphaBlendFunc(false)
+      mNoSimultaneousConstantColorAndAlphaBlendFunc(false),
+      mSetBlendIndexedInvoked(false),
+      mSetBlendFactorsIndexedInvoked(false),
+      mSetBlendEquationsIndexedInvoked(false),
+      mBoundingBoxMinX(-1.0f),
+      mBoundingBoxMinY(-1.0f),
+      mBoundingBoxMinZ(-1.0f),
+      mBoundingBoxMinW(1.0f),
+      mBoundingBoxMaxX(1.0f),
+      mBoundingBoxMaxY(1.0f),
+      mBoundingBoxMaxZ(1.0f),
+      mBoundingBoxMaxW(1.0f)
 {}
 
 State::~State() {}
 
 void State::initialize(Context *context)
 {
-    const Caps &caps                   = context->getCaps();
-    const Extensions &extensions       = context->getExtensions();
     const Extensions &nativeExtensions = context->getImplementation()->getNativeExtensions();
     const Version &clientVersion       = context->getClientVersion();
 
-    mMaxDrawBuffers               = static_cast<GLuint>(caps.maxDrawBuffers);
-    mBlendStateExt                = BlendStateExt(mMaxDrawBuffers);
-    mMaxCombinedTextureImageUnits = static_cast<GLuint>(caps.maxCombinedTextureImageUnits);
+    mBlendStateExt = BlendStateExt(mCaps.maxDrawBuffers);
 
     setColorClearValue(0.0f, 0.0f, 0.0f, 0.0f);
 
@@ -399,7 +404,7 @@
     mSampleCoverageValue  = 1.0f;
     mSampleCoverageInvert = false;
 
-    mMaxSampleMaskWords = static_cast<GLuint>(caps.maxSampleMaskWords);
+    mMaxSampleMaskWords = static_cast<GLuint>(mCaps.maxSampleMaskWords);
     mSampleMask         = false;
     mSampleMaskValues.fill(~GLbitfield(0));
 
@@ -421,7 +426,7 @@
 
     mActiveSampler = 0;
 
-    mVertexAttribCurrentValues.resize(caps.maxVertexAttributes);
+    mVertexAttribCurrentValues.resize(mCaps.maxVertexAttributes);
 
     // Set all indexes in state attributes type mask to float (default)
     for (int i = 0; i < MAX_VERTEX_ATTRIBS; i++)
@@ -429,58 +434,59 @@
         SetComponentTypeMask(ComponentType::Float, i, &mCurrentValuesTypeMask);
     }
 
-    mUniformBuffers.resize(caps.maxUniformBufferBindings);
+    mUniformBuffers.resize(mCaps.maxUniformBufferBindings);
 
-    mSamplerTextures[TextureType::_2D].resize(caps.maxCombinedTextureImageUnits);
-    mSamplerTextures[TextureType::CubeMap].resize(caps.maxCombinedTextureImageUnits);
+    mSamplerTextures[TextureType::_2D].resize(mCaps.maxCombinedTextureImageUnits);
+    mSamplerTextures[TextureType::CubeMap].resize(mCaps.maxCombinedTextureImageUnits);
     if (clientVersion >= Version(3, 0) || nativeExtensions.texture3DOES)
     {
-        mSamplerTextures[TextureType::_3D].resize(caps.maxCombinedTextureImageUnits);
+        mSamplerTextures[TextureType::_3D].resize(mCaps.maxCombinedTextureImageUnits);
     }
     if (clientVersion >= Version(3, 0))
     {
-        mSamplerTextures[TextureType::_2DArray].resize(caps.maxCombinedTextureImageUnits);
+        mSamplerTextures[TextureType::_2DArray].resize(mCaps.maxCombinedTextureImageUnits);
     }
     if (clientVersion >= Version(3, 1) || nativeExtensions.textureMultisample)
     {
-        mSamplerTextures[TextureType::_2DMultisample].resize(caps.maxCombinedTextureImageUnits);
+        mSamplerTextures[TextureType::_2DMultisample].resize(mCaps.maxCombinedTextureImageUnits);
     }
     if (clientVersion >= Version(3, 1))
     {
         mSamplerTextures[TextureType::_2DMultisampleArray].resize(
-            caps.maxCombinedTextureImageUnits);
+            mCaps.maxCombinedTextureImageUnits);
 
-        mAtomicCounterBuffers.resize(caps.maxAtomicCounterBufferBindings);
-        mShaderStorageBuffers.resize(caps.maxShaderStorageBufferBindings);
-        mImageUnits.resize(caps.maxImageUnits);
+        mAtomicCounterBuffers.resize(mCaps.maxAtomicCounterBufferBindings);
+        mShaderStorageBuffers.resize(mCaps.maxShaderStorageBufferBindings);
+        mImageUnits.resize(mCaps.maxImageUnits);
     }
-    if (clientVersion >= Version(3, 2) || extensions.textureCubeMapArrayAny())
+    if (clientVersion >= Version(3, 2) || mExtensions.textureCubeMapArrayAny())
     {
-        mSamplerTextures[TextureType::CubeMapArray].resize(caps.maxCombinedTextureImageUnits);
+        mSamplerTextures[TextureType::CubeMapArray].resize(mCaps.maxCombinedTextureImageUnits);
     }
-    if (clientVersion >= Version(3, 2) || extensions.textureBufferAny())
+    if (clientVersion >= Version(3, 2) || mExtensions.textureBufferAny())
     {
-        mSamplerTextures[TextureType::Buffer].resize(caps.maxCombinedTextureImageUnits);
+        mSamplerTextures[TextureType::Buffer].resize(mCaps.maxCombinedTextureImageUnits);
     }
     if (nativeExtensions.textureRectangle)
     {
-        mSamplerTextures[TextureType::Rectangle].resize(caps.maxCombinedTextureImageUnits);
+        mSamplerTextures[TextureType::Rectangle].resize(mCaps.maxCombinedTextureImageUnits);
     }
     if (nativeExtensions.eglImageExternalOES || nativeExtensions.eglStreamConsumerExternalNV)
     {
-        mSamplerTextures[TextureType::External].resize(caps.maxCombinedTextureImageUnits);
+        mSamplerTextures[TextureType::External].resize(mCaps.maxCombinedTextureImageUnits);
     }
     if (nativeExtensions.webglVideoTexture)
     {
-        mSamplerTextures[TextureType::VideoImage].resize(caps.maxCombinedTextureImageUnits);
+        mSamplerTextures[TextureType::VideoImage].resize(mCaps.maxCombinedTextureImageUnits);
     }
-    mCompleteTextureBindings.reserve(caps.maxCombinedTextureImageUnits);
-    for (int32_t textureIndex = 0; textureIndex < caps.maxCombinedTextureImageUnits; ++textureIndex)
+    mCompleteTextureBindings.reserve(mCaps.maxCombinedTextureImageUnits);
+    for (int32_t textureIndex = 0; textureIndex < mCaps.maxCombinedTextureImageUnits;
+         ++textureIndex)
     {
         mCompleteTextureBindings.emplace_back(context, textureIndex);
     }
 
-    mSamplers.resize(caps.maxCombinedTextureImageUnits);
+    mSamplers.resize(mCaps.maxCombinedTextureImageUnits);
 
     for (QueryType type : angle::AllEnums<QueryType>())
     {
@@ -495,7 +501,7 @@
 
     mPrimitiveRestart = false;
 
-    mDebug.setMaxLoggedMessages(extensions.maxDebugLoggedMessages);
+    mDebug.setMaxLoggedMessages(mExtensions.maxDebugLoggedMessages);
 
     mMultiSampling    = true;
     mSampleAlphaToOne = false;
@@ -846,20 +852,31 @@
 
 void State::setBlend(bool enabled)
 {
-    mBlendState.blend = enabled;
+    if (mSetBlendIndexedInvoked || mBlendState.blend != enabled)
+    {
+        mBlendState.blend = enabled;
 
-    mBlendStateExt.setEnabled(enabled);
-    mDirtyBits.set(DIRTY_BIT_BLEND_ENABLED);
+        mSetBlendIndexedInvoked = false;
+        mBlendStateExt.setEnabled(enabled);
+        mDirtyBits.set(DIRTY_BIT_BLEND_ENABLED);
+    }
 }
 
 void State::setBlendIndexed(bool enabled, GLuint index)
 {
+    mSetBlendIndexedInvoked = true;
     mBlendStateExt.setEnabledIndexed(index, enabled);
     mDirtyBits.set(DIRTY_BIT_BLEND_ENABLED);
 }
 
 void State::setBlendFactors(GLenum sourceRGB, GLenum destRGB, GLenum sourceAlpha, GLenum destAlpha)
 {
+    if (!mSetBlendFactorsIndexedInvoked && mBlendState.sourceBlendRGB == sourceRGB &&
+        mBlendState.destBlendRGB == destRGB && mBlendState.sourceBlendAlpha == sourceAlpha &&
+        mBlendState.destBlendAlpha == destAlpha)
+    {
+        return;
+    }
 
     mBlendState.sourceBlendRGB   = sourceRGB;
     mBlendState.destBlendRGB     = destRGB;
@@ -887,6 +904,7 @@
         }
     }
 
+    mSetBlendFactorsIndexedInvoked = false;
     mBlendStateExt.setFactors(sourceRGB, destRGB, sourceAlpha, destAlpha);
     mDirtyBits.set(DIRTY_BIT_BLEND_FUNCS);
 }
@@ -903,6 +921,7 @@
         mBlendFuncConstantAlphaDrawBuffers.set(index, hasConstantAlpha(sourceRGB, destRGB));
     }
 
+    mSetBlendFactorsIndexedInvoked = true;
     mBlendStateExt.setFactorsIndexed(index, sourceRGB, destRGB, sourceAlpha, destAlpha);
     mDirtyBits.set(DIRTY_BIT_BLEND_FUNCS);
 }
@@ -923,24 +942,34 @@
         alpha = clamp01(alpha);
     }
 
-    mBlendColor.red   = red;
-    mBlendColor.green = green;
-    mBlendColor.blue  = blue;
-    mBlendColor.alpha = alpha;
-    mDirtyBits.set(DIRTY_BIT_BLEND_COLOR);
+    if (mBlendColor.red != red || mBlendColor.green != green || mBlendColor.blue != blue ||
+        mBlendColor.alpha != alpha)
+    {
+        mBlendColor.red   = red;
+        mBlendColor.green = green;
+        mBlendColor.blue  = blue;
+        mBlendColor.alpha = alpha;
+        mDirtyBits.set(DIRTY_BIT_BLEND_COLOR);
+    }
 }
 
 void State::setBlendEquation(GLenum rgbEquation, GLenum alphaEquation)
 {
-    mBlendState.blendEquationRGB   = rgbEquation;
-    mBlendState.blendEquationAlpha = alphaEquation;
+    if (mSetBlendEquationsIndexedInvoked || mBlendState.blendEquationRGB != rgbEquation ||
+        mBlendState.blendEquationAlpha != alphaEquation)
+    {
+        mBlendState.blendEquationRGB   = rgbEquation;
+        mBlendState.blendEquationAlpha = alphaEquation;
 
-    mBlendStateExt.setEquations(rgbEquation, alphaEquation);
-    mDirtyBits.set(DIRTY_BIT_BLEND_EQUATIONS);
+        mSetBlendEquationsIndexedInvoked = false;
+        mBlendStateExt.setEquations(rgbEquation, alphaEquation);
+        mDirtyBits.set(DIRTY_BIT_BLEND_EQUATIONS);
+    }
 }
 
 void State::setBlendEquationIndexed(GLenum rgbEquation, GLenum alphaEquation, GLuint index)
 {
+    mSetBlendEquationsIndexedInvoked = true;
     mBlendStateExt.setEquationsIndexed(index, rgbEquation, alphaEquation);
     mDirtyBits.set(DIRTY_BIT_BLEND_EQUATIONS);
 }
@@ -2545,7 +2574,7 @@
     if (pname >= GL_DRAW_BUFFER0_EXT && pname <= GL_DRAW_BUFFER15_EXT)
     {
         size_t drawBuffer = (pname - GL_DRAW_BUFFER0_EXT);
-        ASSERT(drawBuffer < mMaxDrawBuffers);
+        ASSERT(drawBuffer < static_cast<size_t>(mCaps.maxDrawBuffers));
         Framebuffer *framebuffer = mDrawFramebuffer;
         // The default framebuffer may have fewer draw buffer states than a user-created one. The
         // user is always allowed to query up to GL_MAX_DRAWBUFFERS so just return GL_NONE here if
@@ -2823,55 +2852,55 @@
         }
         break;
         case GL_TEXTURE_BINDING_2D:
-            ASSERT(mActiveSampler < mMaxCombinedTextureImageUnits);
+            ASSERT(mActiveSampler < mCaps.maxCombinedTextureImageUnits);
             *params =
                 getSamplerTextureId(static_cast<unsigned int>(mActiveSampler), TextureType::_2D)
                     .value;
             break;
         case GL_TEXTURE_BINDING_RECTANGLE_ANGLE:
-            ASSERT(mActiveSampler < mMaxCombinedTextureImageUnits);
+            ASSERT(mActiveSampler < mCaps.maxCombinedTextureImageUnits);
             *params = getSamplerTextureId(static_cast<unsigned int>(mActiveSampler),
                                           TextureType::Rectangle)
                           .value;
             break;
         case GL_TEXTURE_BINDING_CUBE_MAP:
-            ASSERT(mActiveSampler < mMaxCombinedTextureImageUnits);
+            ASSERT(mActiveSampler < mCaps.maxCombinedTextureImageUnits);
             *params =
                 getSamplerTextureId(static_cast<unsigned int>(mActiveSampler), TextureType::CubeMap)
                     .value;
             break;
         case GL_TEXTURE_BINDING_3D:
-            ASSERT(mActiveSampler < mMaxCombinedTextureImageUnits);
+            ASSERT(mActiveSampler < mCaps.maxCombinedTextureImageUnits);
             *params =
                 getSamplerTextureId(static_cast<unsigned int>(mActiveSampler), TextureType::_3D)
                     .value;
             break;
         case GL_TEXTURE_BINDING_2D_ARRAY:
-            ASSERT(mActiveSampler < mMaxCombinedTextureImageUnits);
+            ASSERT(mActiveSampler < mCaps.maxCombinedTextureImageUnits);
             *params = getSamplerTextureId(static_cast<unsigned int>(mActiveSampler),
                                           TextureType::_2DArray)
                           .value;
             break;
         case GL_TEXTURE_BINDING_2D_MULTISAMPLE:
-            ASSERT(mActiveSampler < mMaxCombinedTextureImageUnits);
+            ASSERT(mActiveSampler < mCaps.maxCombinedTextureImageUnits);
             *params = getSamplerTextureId(static_cast<unsigned int>(mActiveSampler),
                                           TextureType::_2DMultisample)
                           .value;
             break;
         case GL_TEXTURE_BINDING_2D_MULTISAMPLE_ARRAY:
-            ASSERT(mActiveSampler < mMaxCombinedTextureImageUnits);
+            ASSERT(mActiveSampler < mCaps.maxCombinedTextureImageUnits);
             *params = getSamplerTextureId(static_cast<unsigned int>(mActiveSampler),
                                           TextureType::_2DMultisampleArray)
                           .value;
             break;
         case GL_TEXTURE_BINDING_CUBE_MAP_ARRAY:
-            ASSERT(mActiveSampler < mMaxCombinedTextureImageUnits);
+            ASSERT(mActiveSampler < mCaps.maxCombinedTextureImageUnits);
             *params = getSamplerTextureId(static_cast<unsigned int>(mActiveSampler),
                                           TextureType::CubeMapArray)
                           .value;
             break;
         case GL_TEXTURE_BINDING_EXTERNAL_OES:
-            ASSERT(mActiveSampler < mMaxCombinedTextureImageUnits);
+            ASSERT(mActiveSampler < mCaps.maxCombinedTextureImageUnits);
             *params = getSamplerTextureId(static_cast<unsigned int>(mActiveSampler),
                                           TextureType::External)
                           .value;
@@ -2879,7 +2908,7 @@
 
         // GL_OES_texture_buffer
         case GL_TEXTURE_BINDING_BUFFER:
-            ASSERT(mActiveSampler < mMaxCombinedTextureImageUnits);
+            ASSERT(mActiveSampler < mCaps.maxCombinedTextureImageUnits);
             *params =
                 getSamplerTextureId(static_cast<unsigned int>(mActiveSampler), TextureType::Buffer)
                     .value;
@@ -2914,7 +2943,7 @@
             *params = mReadFramebuffer->getReadBufferState();
             break;
         case GL_SAMPLER_BINDING:
-            ASSERT(mActiveSampler < mMaxCombinedTextureImageUnits);
+            ASSERT(mActiveSampler < mCaps.maxCombinedTextureImageUnits);
             *params = getSamplerId(static_cast<GLuint>(mActiveSampler)).value;
             break;
         case GL_DEBUG_LOGGED_MESSAGES:
@@ -3630,6 +3659,16 @@
     mDirtyBits.set(DIRTY_BIT_UNIFORM_BUFFER_BINDINGS);
 }
 
+void State::onAtomicCounterBufferStateChange(size_t atomicCounterBufferIndex)
+{
+    mDirtyBits.set(DIRTY_BIT_ATOMIC_COUNTER_BUFFER_BINDING);
+}
+
+void State::onShaderStorageBufferStateChange(size_t shaderStorageBufferIndex)
+{
+    mDirtyBits.set(DIRTY_BIT_SHADER_STORAGE_BUFFER_BINDING);
+}
+
 AttributesMask State::getAndResetDirtyCurrentValues() const
 {
     AttributesMask retVal = mDirtyCurrentValues;
@@ -3644,6 +3683,17 @@
     return retVal;
 }
 
+void State::initializeForCapture(const Context *context)
+{
+    mCaps       = context->getCaps();
+    mExtensions = context->getExtensions();
+
+    // This little kludge gets around the frame capture "constness". It should be safe because
+    // nothing in the context is modified in a non-compatible way during capture.
+    Context *mutableContext = const_cast<Context *>(context);
+    initialize(mutableContext);
+}
+
 constexpr State::DirtyObjectHandler State::kDirtyObjectHandlers[DIRTY_OBJECT_MAX];
 
 }  // namespace gl
diff --git a/src/libANGLE/State.h b/src/libANGLE/State.h
index a1e4743..4b41b57 100644
--- a/src/libANGLE/State.h
+++ b/src/libANGLE/State.h
@@ -782,6 +782,8 @@
     void onImageStateChange(const Context *context, size_t unit);
 
     void onUniformBufferStateChange(size_t uniformBufferIndex);
+    void onAtomicCounterBufferStateChange(size_t atomicCounterBufferIndex);
+    void onShaderStorageBufferStateChange(size_t shaderStorageBufferIndex);
 
     bool isCurrentTransformFeedback(const TransformFeedback *tf) const
     {
@@ -850,9 +852,13 @@
     }
     const SyncManager &getSyncManagerForCapture() const { return *mSyncManager; }
     const SamplerManager &getSamplerManagerForCapture() const { return *mSamplerManager; }
+    const ProgramPipelineManager *getProgramPipelineManagerForCapture() const
+    {
+        return mProgramPipelineManager;
+    }
     const SamplerBindingVector &getSamplerBindingsForCapture() const { return mSamplers; }
-
     const ActiveQueryMap &getActiveQueriesForCapture() const { return mActiveQueries; }
+    void initializeForCapture(const Context *context);
 
     bool hasConstantAlphaBlendFunc() const
     {
@@ -908,11 +914,6 @@
 
     const std::vector<ImageUnit> &getImageUnits() const { return mImageUnits; }
 
-    const ProgramPipelineManager *getProgramPipelineManagerForCapture() const
-    {
-        return mProgramPipelineManager;
-    }
-
   private:
     friend class Context;
 
@@ -1006,10 +1007,6 @@
     MemoryObjectManager *mMemoryObjectManager;
     SemaphoreManager *mSemaphoreManager;
 
-    // Cached values from Context's caps
-    GLuint mMaxDrawBuffers;
-    GLuint mMaxCombinedTextureImageUnits;
-
     ColorF mColorClearValue;
     GLfloat mDepthClearValue;
     int mStencilClearValue;
@@ -1067,7 +1064,7 @@
     ComponentTypeMask mCurrentValuesTypeMask;
 
     // Texture and sampler bindings
-    size_t mActiveSampler;  // Active texture unit selector - GL_TEXTURE0
+    GLint mActiveSampler;  // Active texture unit selector - GL_TEXTURE0
 
     TextureBindingMap mSamplerTextures;
 
@@ -1161,6 +1158,21 @@
     DrawBufferMask mBlendFuncConstantAlphaDrawBuffers;
     DrawBufferMask mBlendFuncConstantColorDrawBuffers;
     bool mNoSimultaneousConstantColorAndAlphaBlendFunc;
+    // Whether the indexed variants of setBlend* have been called.  If so, the call to the
+    // non-indexed variants are not no-oped.
+    bool mSetBlendIndexedInvoked;
+    bool mSetBlendFactorsIndexedInvoked;
+    bool mSetBlendEquationsIndexedInvoked;
+
+    // GL_EXT_primitive_bounding_box
+    GLfloat mBoundingBoxMinX;
+    GLfloat mBoundingBoxMinY;
+    GLfloat mBoundingBoxMinZ;
+    GLfloat mBoundingBoxMinW;
+    GLfloat mBoundingBoxMaxX;
+    GLfloat mBoundingBoxMaxY;
+    GLfloat mBoundingBoxMaxZ;
+    GLfloat mBoundingBoxMaxW;
 };
 
 ANGLE_INLINE angle::Result State::syncDirtyObjects(const Context *context,
diff --git a/src/libANGLE/Surface.cpp b/src/libANGLE/Surface.cpp
index 9dc449e..3650bb2 100644
--- a/src/libANGLE/Surface.cpp
+++ b/src/libANGLE/Surface.cpp
@@ -53,6 +53,11 @@
     return attributes.get(EGL_PROTECTED_CONTENT_EXT, EGL_FALSE) == EGL_TRUE;
 }
 
+EGLint SurfaceState::getPreferredSwapInterval() const
+{
+    return attributes.getAsInt(EGL_SWAP_INTERVAL_ANGLE, 1);
+}
+
 Surface::Surface(EGLint surfaceType,
                  const egl::Config *config,
                  const AttributeMap &attributes,
diff --git a/src/libANGLE/Surface.h b/src/libANGLE/Surface.h
index 5ccf9e6..82d4f28 100644
--- a/src/libANGLE/Surface.h
+++ b/src/libANGLE/Surface.h
@@ -50,6 +50,7 @@
 
     bool isRobustResourceInitEnabled() const;
     bool hasProtectedContent() const;
+    EGLint getPreferredSwapInterval() const;
 
     EGLLabelKHR label;
     const egl::Config *config;
@@ -133,7 +134,7 @@
     EGLint getHorizontalResolution() const;
     EGLint getVerticalResolution() const;
     EGLenum getMultisampleResolve() const;
-    bool hasProtectedContent() const;
+    bool hasProtectedContent() const override;
 
     gl::Texture *getBoundTexture() const { return mTexture; }
 
diff --git a/src/libANGLE/Texture.cpp b/src/libANGLE/Texture.cpp
index 7843abb..d5798f2 100644
--- a/src/libANGLE/Texture.cpp
+++ b/src/libANGLE/Texture.cpp
@@ -141,9 +141,11 @@
       mMaxLevel(kInitialMaxLevel),
       mDepthStencilTextureMode(GL_DEPTH_COMPONENT),
       mHasBeenBoundAsImage(false),
+      mHasBeenBoundAsAttachment(false),
       mImmutableFormat(false),
       mImmutableLevels(0),
       mUsage(GL_NONE),
+      mHasProtectedContent(false),
       mImageDescs((IMPLEMENTATION_MAX_TEXTURE_LEVELS + 1) * (type == TextureType::CubeMap ? 6 : 1)),
       mCropRect(0, 0, 0, 0),
       mGenerateMipmapHint(GL_FALSE),
@@ -784,7 +786,11 @@
 void Texture::setLabel(const Context *context, const std::string &label)
 {
     mState.mLabel = label;
-    signalDirtyState(DIRTY_BIT_LABEL);
+
+    if (mTexture)
+    {
+        mTexture->onLabelUpdate();
+    }
 }
 
 const std::string &Texture::getLabel() const
@@ -1065,6 +1071,16 @@
     return mState.mUsage;
 }
 
+void Texture::setProtectedContent(Context *context, bool hasProtectedContent)
+{
+    mState.mHasProtectedContent = hasProtectedContent;
+}
+
+bool Texture::hasProtectedContent() const
+{
+    return mState.mHasProtectedContent;
+}
+
 const TextureState &Texture::getTextureState() const
 {
     return mState;
@@ -1686,8 +1702,6 @@
         return angle::Result::Continue;
     }
 
-    ANGLE_TRY(syncState(context, Command::GenerateMipmap));
-
     // Clear the base image(s) immediately if needed
     if (context->isRobustResourceInitEnabled())
     {
@@ -1706,6 +1720,7 @@
         }
     }
 
+    ANGLE_TRY(syncState(context, Command::GenerateMipmap));
     ANGLE_TRY(mTexture->generateMipmap(context));
 
     // Propagate the format and size of the base mip to the smaller ones. Cube maps are guaranteed
@@ -1735,6 +1750,7 @@
     Extents size(surface->getWidth(), surface->getHeight(), 1);
     ImageDesc desc(size, surface->getBindTexImageFormat(), InitState::Initialized);
     mState.setImageDesc(NonCubeTextureTypeToTarget(mState.mType), 0, desc);
+    mState.mHasProtectedContent = surface->hasProtectedContent();
     signalDirtyStorage(InitState::Initialized);
     return angle::Result::Continue;
 }
@@ -1748,6 +1764,7 @@
     // Erase the image info for level 0
     ASSERT(mState.mType == TextureType::_2D || mState.mType == TextureType::Rectangle);
     mState.clearImageDesc(NonCubeTextureTypeToTarget(mState.mType), 0);
+    mState.mHasProtectedContent = false;
     signalDirtyStorage(InitState::Initialized);
     return angle::Result::Continue;
 }
@@ -1838,6 +1855,7 @@
     mState.clearImageDescs();
     mState.setImageDesc(NonCubeTextureTypeToTarget(type), 0,
                         ImageDesc(size, imageTarget->getFormat(), initState));
+    mState.mHasProtectedContent = imageTarget->hasProtectedContent();
     signalDirtyStorage(initState);
 
     return angle::Result::Continue;
@@ -2022,6 +2040,12 @@
 
     // Duplicates allowed for multiple attachment points. See the comment in the header.
     mBoundFramebufferSerials.push_back(framebufferSerial);
+
+    if (!mState.mHasBeenBoundAsAttachment)
+    {
+        mDirtyBits.set(DIRTY_BIT_BOUND_AS_ATTACHMENT);
+        mState.mHasBeenBoundAsAttachment = true;
+    }
 }
 
 void Texture::onDetach(const Context *context, rx::Serial framebufferSerial)
@@ -2048,6 +2072,7 @@
     ASSERT(hasAnyDirtyBit() || source == Command::GenerateMipmap);
     ANGLE_TRY(mTexture->syncState(context, mDirtyBits, source));
     mDirtyBits.reset();
+    mState.mInitState = InitState::Initialized;
     return angle::Result::Continue;
 }
 
@@ -2161,7 +2186,7 @@
 {
     for (ImageDesc &imageDesc : mState.mImageDescs)
     {
-        // Only modifiy defined images, undefined images will remain in the initialized state
+        // Only modify defined images, undefined images will remain in the initialized state
         if (!imageDesc.size.empty())
         {
             imageDesc.initState = initState;
@@ -2269,11 +2294,26 @@
                 mState.setImageDesc(TextureTarget::Buffer, 0, desc);
             }
             break;
+        case angle::SubjectMessage::StorageReleased:
+            // When the TextureStorage is released, it needs to update the
+            // RenderTargetCache of the Framebuffer attaching this Texture.
+            // This is currently only for D3D back-end. See http://crbug.com/1234829
+            if (index == rx::kTextureImageImplObserverMessageIndex)
+            {
+                onStateChange(angle::SubjectMessage::StorageReleased);
+            }
+            break;
         case angle::SubjectMessage::SubjectMapped:
         case angle::SubjectMessage::SubjectUnmapped:
         case angle::SubjectMessage::BindingChanged:
             ASSERT(index == kBufferSubjectIndex);
             break;
+
+        case angle::SubjectMessage::InitializationComplete:
+            ASSERT(index == rx::kTextureImageImplObserverMessageIndex);
+            setInitState(InitState::Initialized);
+            break;
+
         default:
             UNREACHABLE();
             break;
@@ -2299,9 +2339,10 @@
                                    GLenum type,
                                    void *pixels)
 {
-    if (hasAnyDirtyBit())
+    // No-op if the image level is empty.
+    if (getExtents(target, level).empty())
     {
-        ANGLE_TRY(syncState(context, Command::Other));
+        return angle::Result::Continue;
     }
 
     return mTexture->getTexImage(context, packState, packBuffer, target, level, format, type,
diff --git a/src/libANGLE/Texture.h b/src/libANGLE/Texture.h
index e563127..4a48877 100644
--- a/src/libANGLE/Texture.h
+++ b/src/libANGLE/Texture.h
@@ -143,10 +143,12 @@
     const SwizzleState &getSwizzleState() const { return mSwizzleState; }
     const SamplerState &getSamplerState() const { return mSamplerState; }
     GLenum getUsage() const { return mUsage; }
+    bool hasProtectedContent() const { return mHasProtectedContent; }
     GLenum getDepthStencilTextureMode() const { return mDepthStencilTextureMode; }
     bool isStencilMode() const { return mDepthStencilTextureMode == GL_STENCIL_INDEX; }
 
     bool hasBeenBoundAsImage() const { return mHasBeenBoundAsImage; }
+    bool hasBeenBoundAsAttachment() const { return mHasBeenBoundAsAttachment; }
 
     gl::SrgbOverride getSRGBOverride() const { return mSrgbOverride; }
 
@@ -217,6 +219,7 @@
     GLenum mDepthStencilTextureMode;
 
     bool mHasBeenBoundAsImage;
+    bool mHasBeenBoundAsAttachment;
 
     bool mImmutableFormat;
     GLuint mImmutableLevels;
@@ -224,6 +227,9 @@
     // From GL_ANGLE_texture_usage
     GLenum mUsage;
 
+    // GL_EXT_protected_textures
+    bool mHasProtectedContent;
+
     std::vector<ImageDesc> mImageDescs;
 
     // GLES1 emulation: Texture crop rectangle
@@ -328,6 +334,9 @@
     void setUsage(const Context *context, GLenum usage);
     GLenum getUsage() const;
 
+    void setProtectedContent(Context *context, bool hasProtectedContent);
+    bool hasProtectedContent() const override;
+
     const TextureState &getState() const { return mState; }
 
     void setBorderColor(const Context *context, const ColorGeneric &color);
@@ -594,9 +603,9 @@
 
         // Image state
         DIRTY_BIT_BOUND_AS_IMAGE,
+        DIRTY_BIT_BOUND_AS_ATTACHMENT,
 
         // Misc
-        DIRTY_BIT_LABEL,
         DIRTY_BIT_USAGE,
         DIRTY_BIT_IMPLEMENTATION,
 
diff --git a/src/libANGLE/VaryingPacking.cpp b/src/libANGLE/VaryingPacking.cpp
index 827b873..7dbb0cc 100644
--- a/src/libANGLE/VaryingPacking.cpp
+++ b/src/libANGLE/VaryingPacking.cpp
@@ -1016,8 +1016,6 @@
     // Special case for start-after-vertex.
     if (frontShaderStage != ShaderType::Vertex)
     {
-        ASSERT(isSeparableProgram);
-
         ShaderType emulatedFrontShaderStage = ShaderType::Vertex;
         ShaderType backShaderStage          = frontShaderStage;
 
@@ -1062,8 +1060,6 @@
     // Special case for stop-before-fragment.
     if (frontShaderStage != ShaderType::Fragment)
     {
-        ASSERT(isSeparableProgram);
-
         if (!mVaryingPackings[frontShaderStage].collectAndPackUserVaryings(
                 infoLog, GetMaxShaderOutputVectors(caps, frontShaderStage), packMode,
                 frontShaderStage, ShaderType::InvalidEnum, mergedVaryings, tfVaryings,
@@ -1079,27 +1075,22 @@
     return true;
 }
 
-ProgramMergedVaryings GetMergedVaryingsFromShaders(const HasAttachedShaders &programOrPipeline,
-                                                   const ProgramExecutable &programExecutable)
+ProgramMergedVaryings GetMergedVaryingsFromLinkingVariables(
+    const LinkingVariables &linkingVariables)
 {
     ShaderType frontShaderType = ShaderType::InvalidEnum;
     ProgramMergedVaryings merged;
 
     for (ShaderType backShaderType : kAllGraphicsShaderTypes)
     {
-        Shader *backShader = programOrPipeline.getAttachedShader(backShaderType);
-
-        if (!backShader && !programExecutable.hasLinkedShaderStage(backShaderType))
+        if (!linkingVariables.isShaderStageUsedBitset[backShaderType])
         {
             continue;
         }
-
         const std::vector<sh::ShaderVariable> &backShaderOutputVaryings =
-            backShader ? backShader->getOutputVaryings()
-                       : programExecutable.getLinkedOutputVaryings(backShaderType);
+            linkingVariables.outputVaryings[backShaderType];
         const std::vector<sh::ShaderVariable> &backShaderInputVaryings =
-            backShader ? backShader->getInputVaryings()
-                       : programExecutable.getLinkedInputVaryings(backShaderType);
+            linkingVariables.inputVaryings[backShaderType];
 
         // Add outputs. These are always unmatched since we walk shader stages sequentially.
         for (const sh::ShaderVariable &frontVarying : backShaderOutputVaryings)
diff --git a/src/libANGLE/VaryingPacking.h b/src/libANGLE/VaryingPacking.h
index 202cc21..ebb0f3b 100644
--- a/src/libANGLE/VaryingPacking.h
+++ b/src/libANGLE/VaryingPacking.h
@@ -22,10 +22,10 @@
 
 namespace gl
 {
-class HasAttachedShaders;
 class InfoLog;
 class ProgramExecutable;
 struct Caps;
+struct LinkingVariables;
 struct ProgramVaryingRef;
 
 using ProgramMergedVaryings = std::vector<ProgramVaryingRef>;
@@ -322,9 +322,8 @@
     ShaderMap<ShaderType> mBackToFrontStageMap;
 };
 
-// Takes an abstract handle to a program or pipeline.
-ProgramMergedVaryings GetMergedVaryingsFromShaders(const HasAttachedShaders &programOrPipeline,
-                                                   const ProgramExecutable &programExecutable);
+ProgramMergedVaryings GetMergedVaryingsFromLinkingVariables(
+    const LinkingVariables &linkingVariables);
 }  // namespace gl
 
 #endif  // LIBANGLE_VARYINGPACKING_H_
diff --git a/src/libANGLE/VertexArray.cpp b/src/libANGLE/VertexArray.cpp
index 281f3ad..d96c67a 100644
--- a/src/libANGLE/VertexArray.cpp
+++ b/src/libANGLE/VertexArray.cpp
@@ -506,7 +506,7 @@
     }
 
     GLsizei effectiveStride =
-        stride != 0 ? stride : static_cast<GLsizei>(ComputeVertexAttributeTypeSize(attrib));
+        stride == 0 ? static_cast<GLsizei>(ComputeVertexAttributeTypeSize(attrib)) : stride;
 
     if (attrib.vertexAttribArrayStride != static_cast<GLuint>(stride))
     {
diff --git a/src/libANGLE/capture/FrameCapture.cpp b/src/libANGLE/capture/FrameCapture.cpp
index 9827fd6..beaca4a 100644
--- a/src/libANGLE/capture/FrameCapture.cpp
+++ b/src/libANGLE/capture/FrameCapture.cpp
@@ -39,8 +39,11 @@
 #include "libANGLE/capture/capture_gles_ext_autogen.h"
 #include "libANGLE/capture/frame_capture_utils.h"
 #include "libANGLE/capture/gl_enum_utils.h"
+#include "libANGLE/entry_points_utils.h"
 #include "libANGLE/queryconversions.h"
 #include "libANGLE/queryutils.h"
+#include "libANGLE/serializer/JsonSerializer.h"
+#include "third_party/ceval/ceval.h"
 
 #define USE_SYSTEM_ZLIB
 #include "compression_utils_portable.h"
@@ -54,14 +57,16 @@
 namespace
 {
 
-constexpr char kEnabledVarName[]               = "ANGLE_CAPTURE_ENABLED";
-constexpr char kOutDirectoryVarName[]          = "ANGLE_CAPTURE_OUT_DIR";
-constexpr char kFrameStartVarName[]            = "ANGLE_CAPTURE_FRAME_START";
-constexpr char kFrameEndVarName[]              = "ANGLE_CAPTURE_FRAME_END";
-constexpr char kCaptureTriggerVarName[]        = "ANGLE_CAPTURE_TRIGGER";
-constexpr char kCaptureLabel[]                 = "ANGLE_CAPTURE_LABEL";
-constexpr char kCompression[]                  = "ANGLE_CAPTURE_COMPRESSION";
-constexpr char kSerializeStateEnabledVarName[] = "ANGLE_CAPTURE_SERIALIZE_STATE";
+constexpr char kEnabledVarName[]        = "ANGLE_CAPTURE_ENABLED";
+constexpr char kOutDirectoryVarName[]   = "ANGLE_CAPTURE_OUT_DIR";
+constexpr char kFrameStartVarName[]     = "ANGLE_CAPTURE_FRAME_START";
+constexpr char kFrameEndVarName[]       = "ANGLE_CAPTURE_FRAME_END";
+constexpr char kCaptureTriggerVarName[] = "ANGLE_CAPTURE_TRIGGER";
+constexpr char kCaptureLabelVarName[]   = "ANGLE_CAPTURE_LABEL";
+constexpr char kCompressionVarName[]    = "ANGLE_CAPTURE_COMPRESSION";
+constexpr char kSerializeStateVarName[] = "ANGLE_CAPTURE_SERIALIZE_STATE";
+constexpr char kValidationVarName[]     = "ANGLE_CAPTURE_VALIDATION";
+constexpr char kValidationExprVarName[] = "ANGLE_CAPTURE_VALIDATION_EXPR";
 
 constexpr size_t kBinaryAlignment   = 16;
 constexpr size_t kFunctionSizeLimit = 5000;
@@ -77,6 +82,43 @@
 constexpr char kAndroidCaptureTrigger[] = "debug.angle.capture.trigger";
 constexpr char kAndroidCaptureLabel[]   = "debug.angle.capture.label";
 constexpr char kAndroidCompression[]    = "debug.angle.capture.compression";
+constexpr char kAndroidValidation[]     = "debug.angle.capture.validation";
+constexpr char kAndroidValidationExpr[] = "debug.angle.capture.validation_expr";
+
+struct FramebufferCaptureFuncs
+{
+    FramebufferCaptureFuncs(bool isGLES1)
+    {
+        if (isGLES1)
+        {
+            framebufferTexture2D    = &gl::CaptureFramebufferTexture2DOES;
+            framebufferRenderbuffer = &gl::CaptureFramebufferRenderbufferOES;
+            bindFramebuffer         = &gl::CaptureBindFramebufferOES;
+            genFramebuffers         = &gl::CaptureGenFramebuffersOES;
+            bindRenderbuffer        = &gl::CaptureBindRenderbufferOES;
+            genRenderbuffers        = &gl::CaptureGenRenderbuffersOES;
+            renderbufferStorage     = &gl::CaptureRenderbufferStorageOES;
+        }
+        else
+        {
+            framebufferTexture2D    = &gl::CaptureFramebufferTexture2D;
+            framebufferRenderbuffer = &gl::CaptureFramebufferRenderbuffer;
+            bindFramebuffer         = &gl::CaptureBindFramebuffer;
+            genFramebuffers         = &gl::CaptureGenFramebuffers;
+            bindRenderbuffer        = &gl::CaptureBindRenderbuffer;
+            genRenderbuffers        = &gl::CaptureGenRenderbuffers;
+            renderbufferStorage     = &gl::CaptureRenderbufferStorage;
+        }
+    }
+
+    decltype(&gl::CaptureFramebufferTexture2D) framebufferTexture2D;
+    decltype(&gl::CaptureFramebufferRenderbuffer) framebufferRenderbuffer;
+    decltype(&gl::CaptureBindFramebuffer) bindFramebuffer;
+    decltype(&gl::CaptureGenFramebuffers) genFramebuffers;
+    decltype(&gl::CaptureBindRenderbuffer) bindRenderbuffer;
+    decltype(&gl::CaptureGenRenderbuffers) genRenderbuffers;
+    decltype(&gl::CaptureRenderbufferStorage) renderbufferStorage;
+};
 
 std::string GetDefaultOutDirectory()
 {
@@ -132,7 +174,10 @@
     return os;
 }
 
-constexpr static gl::ContextID kSharedContextId = {0};
+// Used to indicate that "shared" should be used to identify the files.
+constexpr gl::ContextID kSharedContextId = {0};
+// Used to indicate no context ID should be output.
+constexpr gl::ContextID kNoContextId = {std::numeric_limits<uint32_t>::max()};
 
 struct FmtCapturePrefix
 {
@@ -154,7 +199,15 @@
         os << fmt.captureLabel;
     }
 
-    if (fmt.contextId != kSharedContextId)
+    if (fmt.contextId == kNoContextId)
+    {
+        // Do nothing
+    }
+    else if (fmt.contextId == kSharedContextId)
+    {
+        os << "_capture_shared";
+    }
+    else
     {
         os << "_capture_context" << fmt.contextId;
     }
@@ -308,8 +361,17 @@
                                const char *suffix)
 {
     std::stringstream fnameStream;
-    fnameStream << FmtCapturePrefix(contextId, captureLabel) << "_frame" << std::setfill('0')
-                << std::setw(3) << frameIndex << suffix;
+
+    if (contextId == kSharedContextId)
+    {
+        fnameStream << FmtCapturePrefix(contextId, captureLabel) << suffix;
+    }
+    else
+    {
+        fnameStream << FmtCapturePrefix(contextId, captureLabel) << "_frame" << std::setfill('0')
+                    << std::setw(3) << frameIndex << suffix;
+    }
+
     return fnameStream.str();
 }
 
@@ -399,13 +461,43 @@
     out << "\"";
 }
 
-void WriteStringParamReplay(std::ostream &out, const ParamCapture &param)
+void WriteStringParamReplay(DataTracker *dataTracker,
+                            std::ostream &out,
+                            std::ostream &header,
+                            const CallCapture &call,
+                            const ParamCapture &param,
+                            std::vector<uint8_t> *binaryData)
 {
     const std::vector<uint8_t> &data = param.data[0];
     // null terminate C style string
     ASSERT(data.size() > 0 && data.back() == '\0');
     std::string str(data.begin(), data.end() - 1);
-    out << "\"" << str << "\"";
+
+    constexpr size_t kMaxInlineStringLength = 20000;
+    if (str.size() > kMaxInlineStringLength)
+    {
+        // Store in binary file if the string is too long.
+        // Round up to 16-byte boundary for cross ABI safety.
+        size_t offset = rx::roundUpPow2(binaryData->size(), kBinaryAlignment);
+        binaryData->resize(offset + str.size() + 1);
+        memcpy(binaryData->data() + offset, str.data(), str.size() + 1);
+        out << "reinterpret_cast<const char *>(&gBinaryData[" << offset << "])";
+    }
+    else if (str.find('\n') != std::string::npos)
+    {
+        // Move multi-line strings into the header.
+        int counter = dataTracker->getCounters().getAndIncrement(call.entryPoint, param.name);
+
+        header << "const char ";
+        WriteParamStaticVarName(call, param, counter, header);
+        header << "[] = R\"(" << str << ")\";\n";
+
+        WriteParamStaticVarName(call, param, counter, out);
+    }
+    else
+    {
+        out << "\"" << str << "\"";
+    }
 }
 
 void WriteStringPointerParamReplay(DataTracker *dataTracker,
@@ -491,7 +583,7 @@
         {
             header << ", ";
         }
-        header << "g" << name << "Map[" << id.value << "]";
+        header << "g" << name << "Map2[" << id.value << "]";
     }
 
     header << " };\n    ";
@@ -565,7 +657,7 @@
         call.entryPoint == EntryPoint::GLCreateShaderProgramv)
     {
         GLuint id = call.params.getReturnValue().value.GLuintVal;
-        callOut << "gShaderProgramMap[" << id << "] = ";
+        callOut << "gShaderProgramMap2[" << id << "] = ";
     }
 
     if (call.entryPoint == EntryPoint::GLFenceSync)
@@ -660,7 +752,7 @@
             switch (param.type)
             {
                 case ParamType::TGLcharConstPointer:
-                    WriteStringParamReplay(callOut, param);
+                    WriteStringParamReplay(dataTracker, callOut, header, call, param, binaryData);
                     break;
                 case ParamType::TGLcharConstPointerPointer:
                     WriteStringPointerParamReplay(dataTracker, callOut, header, call, param);
@@ -741,6 +833,20 @@
     return found;
 }
 
+CallCapture CaptureMakeCurrent(EGLDisplay display,
+                               EGLSurface draw,
+                               EGLSurface read,
+                               EGLContext context)
+{
+    ParamBuffer paramBuffer;
+    paramBuffer.addValueParam("display", ParamType::TEGLDisplay, display);
+    paramBuffer.addValueParam("draw", ParamType::TEGLSurface, draw);
+    paramBuffer.addValueParam("read", ParamType::TEGLSurface, read);
+    paramBuffer.addValueParam("context", ParamType::TEGLContext, context);
+
+    return CallCapture(angle::EntryPoint::EGLMakeCurrent, std::move(paramBuffer));
+}
+
 struct SaveFileHelper
 {
   public:
@@ -777,12 +883,10 @@
     std::string mFilePath;
 };
 
-std::string GetBinaryDataFilePath(bool compression,
-                                  gl::ContextID contextId,
-                                  const std::string &captureLabel)
+std::string GetBinaryDataFilePath(bool compression, const std::string &captureLabel)
 {
     std::stringstream fnameStream;
-    fnameStream << FmtCapturePrefix(contextId, captureLabel) << ".angledata";
+    fnameStream << FmtCapturePrefix(kNoContextId, captureLabel) << ".angledata";
     if (compression)
     {
         fnameStream << ".gz";
@@ -796,7 +900,7 @@
                     const std::string &captureLabel,
                     const std::vector<uint8_t> &binaryData)
 {
-    std::string binaryDataFileName = GetBinaryDataFilePath(compression, contextId, captureLabel);
+    std::string binaryDataFileName = GetBinaryDataFilePath(compression, captureLabel);
     std::string dataFilepath       = outDir + binaryDataFileName;
 
     SaveFileHelper saveData(dataFilepath);
@@ -832,11 +936,25 @@
                          gl::ContextID contextId,
                          const std::string &captureLabel,
                          size_t maxClientArraySize,
-                         size_t readBufferSize)
+                         size_t readBufferSize,
+                         const PackedEnumMap<ResourceIDType, uint32_t> &maxIDs)
 {
-    std::string binaryDataFileName = GetBinaryDataFilePath(compression, contextId, captureLabel);
-    out << "    InitializeReplay(\"" << binaryDataFileName << "\", " << maxClientArraySize << ", "
-        << readBufferSize << ");\n";
+    for (ResourceIDType resourceID : AllEnums<ResourceIDType>())
+    {
+        const char *name = GetResourceIDTypeName(resourceID);
+        out << "    uint32_t kMax" << name << " = " << maxIDs[resourceID] << ";\n";
+    }
+
+    std::string binaryDataFileName = GetBinaryDataFilePath(compression, captureLabel);
+    out << "    InitializeReplay2(\"" << binaryDataFileName << "\", " << maxClientArraySize << ", "
+        << readBufferSize;
+
+    for (ResourceIDType resourceID : AllEnums<ResourceIDType>())
+    {
+        out << ", kMax" << GetResourceIDTypeName(resourceID);
+    }
+
+    out << ");\n";
 }
 
 // TODO (http://anglebug.com/4599): Reset more state on frame loop
@@ -851,17 +969,20 @@
     {
         case ResourceIDType::Buffer:
         {
-            BufferSet &newBuffers           = resourceTracker->getNewBuffers();
-            BufferCalls &bufferRegenCalls   = resourceTracker->getBufferRegenCalls();
-            BufferCalls &bufferRestoreCalls = resourceTracker->getBufferRestoreCalls();
-            BufferCalls &bufferMapCalls     = resourceTracker->getBufferMapCalls();
-            BufferCalls &bufferUnmapCalls   = resourceTracker->getBufferUnmapCalls();
+            TrackedResource &trackedBuffers =
+                resourceTracker->getTrackedResource(ResourceIDType::Buffer);
+            ResourceSet &newBuffers           = trackedBuffers.getNewResources();
+            ResourceCalls &bufferRegenCalls   = trackedBuffers.getResourceRegenCalls();
+            ResourceCalls &bufferRestoreCalls = trackedBuffers.getResourceRestoreCalls();
+
+            BufferCalls &bufferMapCalls   = resourceTracker->getBufferMapCalls();
+            BufferCalls &bufferUnmapCalls = resourceTracker->getBufferUnmapCalls();
 
             // If we have any new buffers generated and not deleted during the run, delete them now
             if (!newBuffers.empty())
             {
                 out << "    const GLuint deleteBuffers[] = {";
-                BufferSet::iterator bufferIter = newBuffers.begin();
+                ResourceSet::iterator bufferIter = newBuffers.begin();
                 for (size_t i = 0; bufferIter != newBuffers.end(); ++i, ++bufferIter)
                 {
                     if (i > 0)
@@ -872,15 +993,15 @@
                     {
                         out << "\n        ";
                     }
-                    out << "gBufferMap[" << (*bufferIter).value << "]";
+                    out << "gBufferMap[" << *bufferIter << "]";
                 }
                 out << "};\n";
                 out << "    glDeleteBuffers(" << newBuffers.size() << ", deleteBuffers);\n";
             }
 
             // If any of our starting buffers were deleted during the run, recreate them
-            BufferSet &buffersToRegen = resourceTracker->getBuffersToRegen();
-            for (const gl::BufferID id : buffersToRegen)
+            ResourceSet &buffersToRegen = trackedBuffers.getResourcesToRegen();
+            for (GLuint id : buffersToRegen)
             {
                 // Emit their regen calls
                 for (CallCapture &call : bufferRegenCalls[id])
@@ -892,8 +1013,8 @@
             }
 
             // If any of our starting buffers were modified during the run, restore their contents
-            BufferSet &buffersToRestore = resourceTracker->getBuffersToRestore();
-            for (const gl::BufferID id : buffersToRestore)
+            ResourceSet &buffersToRestore = trackedBuffers.getResourcesToRestore();
+            for (GLuint id : buffersToRestore)
             {
                 if (resourceTracker->getStartingBuffersMappedCurrent(id))
                 {
@@ -920,8 +1041,8 @@
             }
 
             // Update the map/unmap of buffers to match the starting state
-            BufferSet startingBuffers = resourceTracker->getStartingBuffers();
-            for (const gl::BufferID id : startingBuffers)
+            ResourceSet startingBuffers = trackedBuffers.getStartingResources();
+            for (GLuint id : startingBuffers)
             {
                 // If the buffer was mapped at the start, but is not mapped now, we need to map
                 if (resourceTracker->getStartingBuffersMappedInitial(id) &&
@@ -962,17 +1083,77 @@
         }
         case ResourceIDType::ShaderProgram:
         {
-            ProgramSet &newPrograms = resourceTracker->getNewPrograms();
+            ResourceSet &newPrograms =
+                resourceTracker->getTrackedResource(ResourceIDType::ShaderProgram)
+                    .getNewResources();
 
             // If we have any new programs created and not deleted during the run, delete them now
             for (const auto &newProgram : newPrograms)
             {
-                out << "    glDeleteProgram(gShaderProgramMap[" << newProgram.value << "]);\n";
+                out << "    glDeleteProgram(gShaderProgramMap2[" << newProgram << "]);\n";
             }
 
             // TODO (http://anglebug.com/5968): Handle programs that need regen
             // This would only happen if a starting program was deleted during the run
-            ASSERT(resourceTracker->getProgramsToRegen().empty());
+            ASSERT(resourceTracker->getTrackedResource(ResourceIDType::ShaderProgram)
+                       .getResourcesToRegen()
+                       .empty());
+            break;
+        }
+        case ResourceIDType::Texture:
+        {
+            TrackedResource &trackedTextures =
+                resourceTracker->getTrackedResource(ResourceIDType::Texture);
+            ResourceSet &newTextures           = trackedTextures.getNewResources();
+            ResourceCalls &textureRegenCalls   = trackedTextures.getResourceRegenCalls();
+            ResourceCalls &textureRestoreCalls = trackedTextures.getResourceRestoreCalls();
+
+            // If we have any new textures generated and not deleted during the run, delete them now
+            if (!newTextures.empty())
+            {
+                out << "    const GLuint deleteTextures[] = {";
+                ResourceSet::iterator textureIter = newTextures.begin();
+                for (size_t i = 0; textureIter != newTextures.end(); ++i, ++textureIter)
+                {
+                    if (i > 0)
+                    {
+                        out << ", ";
+                    }
+                    if ((i % 4) == 0)
+                    {
+                        out << "\n        ";
+                    }
+                    out << "gTextureMap[" << *textureIter << "]";
+                }
+                out << "};\n";
+                out << "    glDeleteTextures(" << newTextures.size() << ", deleteTextures);\n";
+            }
+
+            // If any of our starting textures were deleted during the run, regen them
+            ResourceSet &texturesToRegen = trackedTextures.getResourcesToRegen();
+            for (GLuint id : texturesToRegen)
+            {
+                // Emit their regen calls
+                for (CallCapture &call : textureRegenCalls[id])
+                {
+                    out << "    ";
+                    WriteCppReplayForCall(call, dataTracker, out, header, binaryData);
+                    out << ";\n";
+                }
+            }
+
+            // If any of our starting textures were modified during the run, restore their contents
+            ResourceSet &texturesToRestore = trackedTextures.getResourcesToRestore();
+            for (GLuint id : texturesToRestore)
+            {
+                // Emit their restore calls
+                for (CallCapture &call : textureRestoreCalls[id])
+                {
+                    out << "    ";
+                    WriteCppReplayForCall(call, dataTracker, out, header, binaryData);
+                    out << ";\n";
+                }
+            }
             break;
         }
         default:
@@ -1093,7 +1274,9 @@
     std::stringstream include;
     std::stringstream header;
 
-    include << "#include \"" << FmtCapturePrefix(context->id(), captureLabel) << ".h\"\n";
+    include << "#include \""
+            << FmtCapturePrefix(frameCaptureShared.getWindowSurfaceContextID(), captureLabel)
+            << ".h\"\n";
     include << "#include \"angle_trace_gl.h\"\n";
     include << "";
     include << "\n";
@@ -1154,191 +1337,35 @@
     }
 }
 
-void WriteWindowSurfaceContextCppReplay(bool compression,
-                                        const std::string &outDir,
-                                        const gl::Context *context,
-                                        const std::string &captureLabel,
-                                        uint32_t frameIndex,
-                                        uint32_t frameCount,
-                                        const std::vector<CallCapture> &frameCalls,
-                                        const std::vector<CallCapture> &setupCalls,
-                                        ResourceTracker *resourceTracker,
-                                        std::vector<uint8_t> *binaryData,
-                                        bool serializeStateEnabled,
-                                        const FrameCaptureShared &frameCaptureShared)
-{
-    ASSERT(frameCaptureShared.getWindowSurfaceContextID() == context->id());
-
-    DataTracker dataTracker;
-
-    std::stringstream out;
-    std::stringstream header;
-
-    egl::ShareGroup *shareGroup      = context->getShareGroup();
-    egl::ContextSet *shareContextSet = shareGroup->getContexts();
-
-    header << "#include \"" << FmtCapturePrefix(kSharedContextId, captureLabel) << ".h\"\n";
-    for (gl::Context *shareContext : *shareContextSet)
-    {
-        header << "#include \"" << FmtCapturePrefix(shareContext->id(), captureLabel) << ".h\"\n";
-    }
-
-    header << "#include \"angle_trace_gl.h\"\n";
-    header << "";
-    header << "\n";
-    header << "namespace\n";
-    header << "{\n";
-
-    if (frameIndex == 1 || frameIndex == frameCount)
-    {
-        out << "extern \"C\" {\n";
-    }
-
-    if (frameIndex == 1)
-    {
-        std::stringstream setupCallStream;
-
-        setupCallStream << "void " << FmtSetupFunction(kNoPartId, context->id()) << "\n";
-        setupCallStream << "{\n";
-
-        WriteCppReplayFunctionWithParts(context->id(), ReplayFunc::Setup, &dataTracker, frameIndex,
-                                        binaryData, setupCalls, header, setupCallStream, out);
-
-        out << setupCallStream.str();
-        out << "}\n";
-        out << "\n";
-        out << "void SetupReplay()\n";
-        out << "{\n";
-        out << "    " << captureLabel << "::InitReplay();\n";
-
-        // Setup all of the shared objects.
-        out << "    " << captureLabel << "::" << FmtSetupFunction(kNoPartId, kSharedContextId)
-            << ";\n";
-
-        // Setup the presentation (this) context before any other contexts in the share group.
-        out << "    " << FmtSetupFunction(kNoPartId, context->id()) << ";\n";
-        out << "}\n";
-        out << "\n";
-    }
-
-    if (frameIndex == frameCount)
-    {
-        // Emit code to reset back to starting state
-        out << "void " << FmtResetFunction() << "\n";
-        out << "{\n";
-
-        // TODO(http://anglebug.com/5878): Look at moving this into the shared context file since
-        // it's resetting shared objects.
-        std::stringstream restoreCallStream;
-        for (ResourceIDType resourceType : AllEnums<ResourceIDType>())
-        {
-            MaybeResetResources(restoreCallStream, resourceType, &dataTracker, header,
-                                resourceTracker, binaryData);
-        }
-
-        // Reset opaque type objects that don't have IDs, so are not ResourceIDTypes.
-        MaybeResetOpaqueTypeObjects(restoreCallStream, &dataTracker, header, resourceTracker,
-                                    binaryData);
-
-        out << restoreCallStream.str();
-        out << "}\n";
-    }
-
-    if (frameIndex == 1 || frameIndex == frameCount)
-    {
-        out << "}  // extern \"C\"\n";
-        out << "\n";
-    }
-
-    if (!captureLabel.empty())
-    {
-        out << "namespace " << captureLabel << "\n";
-        out << "{\n";
-    }
-
-    if (!frameCalls.empty())
-    {
-        std::stringstream callStream;
-
-        callStream << "void " << FmtReplayFunction(context->id(), frameIndex) << "\n";
-        callStream << "{\n";
-
-        WriteCppReplayFunctionWithParts(context->id(), ReplayFunc::Replay, &dataTracker, frameIndex,
-                                        binaryData, frameCalls, header, callStream, out);
-
-        out << callStream.str();
-        out << "}\n";
-    }
-
-    if (serializeStateEnabled)
-    {
-        std::string serializedContextString;
-        if (SerializeContextToString(const_cast<gl::Context *>(context),
-                                     &serializedContextString) == Result::Continue)
-        {
-            out << "const char *" << FmtGetSerializedContextStateFunction(context->id(), frameIndex)
-                << "\n";
-            out << "{\n";
-            out << "    return R\"(" << serializedContextString << ")\";\n";
-            out << "}\n";
-            out << "\n";
-        }
-    }
-
-    if (!captureLabel.empty())
-    {
-        out << "} // namespace " << captureLabel << "\n";
-    }
-
-    header << "}  // namespace\n";
-
-    {
-        std::string outString    = out.str();
-        std::string headerString = header.str();
-
-        std::string cppFilePath =
-            GetCaptureFilePath(outDir, context->id(), captureLabel, frameIndex, ".cpp");
-
-        SaveFileHelper saveCpp(cppFilePath);
-        saveCpp << headerString << "\n" << outString;
-    }
-}
-
-void WriteSharedContextCppReplay(bool compression,
-                                 const std::string &outDir,
-                                 const std::string &captureLabel,
-                                 uint32_t frameIndex,
-                                 uint32_t frameCount,
-                                 const std::vector<CallCapture> &setupCalls,
-                                 ResourceTracker *resourceTracker,
-                                 std::vector<uint8_t> *binaryData,
-                                 bool serializeStateEnabled,
-                                 const FrameCaptureShared &frameCaptureShared)
+void WriteShareGroupCppSetupReplay(bool compression,
+                                   const std::string &outDir,
+                                   const std::string &captureLabel,
+                                   uint32_t frameIndex,
+                                   uint32_t frameCount,
+                                   const std::vector<CallCapture> &setupCalls,
+                                   ResourceTracker *resourceTracker,
+                                   std::vector<uint8_t> *binaryData,
+                                   bool serializeStateEnabled,
+                                   const FrameCaptureShared &frameCaptureShared)
 {
     DataTracker dataTracker;
 
     std::stringstream out;
     std::stringstream include;
-    std::stringstream header;
 
-    include << "#include \"" << FmtCapturePrefix(kSharedContextId, captureLabel) << ".h\"\n";
     include << "#include \"angle_trace_gl.h\"\n";
-    include << "";
     include << "\n";
     include << "namespace\n";
     include << "{\n";
 
     if (!captureLabel.empty())
     {
-        header << "namespace " << captureLabel << "\n";
-        header << "{\n";
         out << "namespace " << captureLabel << "\n";
         out << "{\n";
     }
 
     std::stringstream setupCallStream;
 
-    header << "void " << FmtSetupFunction(kNoPartId, kSharedContextId) << ";\n";
     setupCallStream << "void " << FmtSetupFunction(kNoPartId, kSharedContextId) << "\n";
     setupCallStream << "{\n";
 
@@ -1351,7 +1378,6 @@
 
     if (!captureLabel.empty())
     {
-        header << "} // namespace " << captureLabel << "\n";
         out << "} // namespace " << captureLabel << "\n";
     }
 
@@ -1368,18 +1394,6 @@
         SaveFileHelper saveCpp(cppFilePath);
         saveCpp << headerString << "\n" << outString;
     }
-
-    // Write out the header file.
-    {
-        std::string headerContents = header.str();
-
-        std::stringstream headerPathStream;
-        headerPathStream << outDir << FmtCapturePrefix(kSharedContextId, captureLabel) << ".h";
-        std::string headerPath = headerPathStream.str();
-
-        SaveFileHelper saveHeader(headerPath);
-        saveHeader << headerContents;
-    }
 }
 
 ProgramSources GetAttachedProgramSources(const gl::Program *program)
@@ -1408,7 +1422,7 @@
     const char *resourceName = GetResourceIDTypeName(resourceIDType);
 
     std::stringstream updateFuncNameStr;
-    updateFuncNameStr << "Update" << resourceName << "ID";
+    updateFuncNameStr << "Update" << resourceName << "ID2";
     std::string updateFuncName = updateFuncNameStr.str();
 
     const IDType *returnedIDs = reinterpret_cast<const IDType *>(param.data[0].data());
@@ -1438,6 +1452,7 @@
         // application attempts to call a glUniform* call. To do this we'll pass in a blank name to
         // force glGetUniformLocation to return -1.
         std::string name;
+        int count = 1;
         ParamBuffer params;
         params.addValueParam("program", ParamType::TShaderProgramID, program->id());
 
@@ -1467,19 +1482,42 @@
                     UNIMPLEMENTED();
                 }
 
-                name = gl::StripLastArrayIndex(name);
+                name  = gl::StripLastArrayIndex(name);
+                count = uniform.arraySizes[0];
             }
         }
 
         ParamCapture nameParam("name", ParamType::TGLcharConstPointer);
         CaptureString(name.c_str(), &nameParam);
         params.addParam(std::move(nameParam));
-
         params.addValueParam("location", ParamType::TGLint, location);
-        callsOut->emplace_back("UpdateUniformLocation", std::move(params));
+        params.addValueParam("count", ParamType::TGLint, static_cast<GLint>(count));
+        callsOut->emplace_back("UpdateUniformLocation2", std::move(params));
     }
 }
 
+void CaptureValidateSerializedState(const gl::Context *context, std::vector<CallCapture> *callsOut)
+{
+    INFO() << "Capturing validation checkpoint at position " << callsOut->size();
+
+    context->finishImmutable();
+
+    std::string serializedState;
+    angle::Result result = angle::SerializeContextToString(context, &serializedState);
+    if (result != angle::Result::Continue)
+    {
+        ERR() << "Internal error serializing context state.";
+        return;
+    }
+    ParamCapture serializedStateParam("serializedState", ParamType::TGLcharConstPointer);
+    CaptureString(serializedState.c_str(), &serializedStateParam);
+
+    ParamBuffer params;
+    params.addParam(std::move(serializedStateParam));
+
+    callsOut->emplace_back("VALIDATE_CHECKPOINT", std::move(params));
+}
+
 void CaptureUpdateUniformBlockIndexes(const gl::Program *program,
                                       std::vector<CallCapture> *callsOut)
 {
@@ -1505,7 +1543,7 @@
 {
     ParamBuffer params;
     params.addValueParam("program", ParamType::TShaderProgramID, program);
-    callsOut->emplace_back("DeleteUniformLocations", std::move(params));
+    callsOut->emplace_back("DeleteUniformLocations2", std::move(params));
 }
 
 void MaybeCaptureUpdateResourceIDs(std::vector<CallCapture> *callsOut)
@@ -1656,6 +1694,68 @@
     return false;
 }
 
+bool IsTextureUpdate(CallCapture &call)
+{
+    switch (call.entryPoint)
+    {
+        case EntryPoint::GLCompressedCopyTextureCHROMIUM:
+        case EntryPoint::GLCompressedTexImage1D:
+        case EntryPoint::GLCompressedTexImage2D:
+        case EntryPoint::GLCompressedTexImage2DRobustANGLE:
+        case EntryPoint::GLCompressedTexImage3D:
+        case EntryPoint::GLCompressedTexImage3DOES:
+        case EntryPoint::GLCompressedTexImage3DRobustANGLE:
+        case EntryPoint::GLCompressedTexSubImage1D:
+        case EntryPoint::GLCompressedTexSubImage2D:
+        case EntryPoint::GLCompressedTexSubImage2DRobustANGLE:
+        case EntryPoint::GLCompressedTexSubImage3D:
+        case EntryPoint::GLCompressedTexSubImage3DOES:
+        case EntryPoint::GLCompressedTexSubImage3DRobustANGLE:
+        case EntryPoint::GLCompressedTextureSubImage1D:
+        case EntryPoint::GLCompressedTextureSubImage2D:
+        case EntryPoint::GLCompressedTextureSubImage3D:
+        case EntryPoint::GLCopyTexImage1D:
+        case EntryPoint::GLCopyTexImage2D:
+        case EntryPoint::GLCopyTexSubImage1D:
+        case EntryPoint::GLCopyTexSubImage2D:
+        case EntryPoint::GLCopyTexSubImage3D:
+        case EntryPoint::GLCopyTexSubImage3DOES:
+        case EntryPoint::GLCopyTexture3DANGLE:
+        case EntryPoint::GLCopyTextureCHROMIUM:
+        case EntryPoint::GLCopyTextureSubImage1D:
+        case EntryPoint::GLCopyTextureSubImage2D:
+        case EntryPoint::GLCopyTextureSubImage3D:
+        case EntryPoint::GLTexImage1D:
+        case EntryPoint::GLTexImage2D:
+        case EntryPoint::GLTexImage2DExternalANGLE:
+        case EntryPoint::GLTexImage2DMultisample:
+        case EntryPoint::GLTexImage2DRobustANGLE:
+        case EntryPoint::GLTexImage3D:
+        case EntryPoint::GLTexImage3DMultisample:
+        case EntryPoint::GLTexImage3DOES:
+        case EntryPoint::GLTexImage3DRobustANGLE:
+        case EntryPoint::GLTexSubImage1D:
+        case EntryPoint::GLTexSubImage2D:
+        case EntryPoint::GLTexSubImage2DRobustANGLE:
+        case EntryPoint::GLTexSubImage3D:
+        case EntryPoint::GLTexSubImage3DOES:
+        case EntryPoint::GLTexSubImage3DRobustANGLE:
+        case EntryPoint::GLTextureSubImage1D:
+        case EntryPoint::GLTextureSubImage2D:
+        case EntryPoint::GLTextureSubImage3D:
+            return true;
+
+        // Note: CopyImageSubData is handled specially in copyCompressedTextureData
+        case EntryPoint::GLCopyImageSubData:
+        case EntryPoint::GLCopyImageSubDataEXT:
+        case EntryPoint::GLCopyImageSubDataOES:
+            return false;
+
+        default:
+            return false;
+    }
+}
+
 void Capture(std::vector<CallCapture> *setupCalls, CallCapture &&call)
 {
     setupCalls->emplace_back(std::move(call));
@@ -1663,6 +1763,7 @@
 
 void CaptureFramebufferAttachment(std::vector<CallCapture> *setupCalls,
                                   const gl::State &replayState,
+                                  const FramebufferCaptureFuncs &framebufferFuncs,
                                   const gl::FramebufferAttachment &attachment)
 {
     GLuint resourceID = attachment.getResource()->getId();
@@ -1672,22 +1773,22 @@
     {
         gl::ImageIndex index = attachment.getTextureImageIndex();
 
-        Capture(setupCalls, CaptureFramebufferTexture2D(replayState, true, GL_FRAMEBUFFER,
-                                                        attachment.getBinding(), index.getTarget(),
-                                                        {resourceID}, index.getLevelIndex()));
+        Capture(setupCalls, framebufferFuncs.framebufferTexture2D(
+                                replayState, true, GL_FRAMEBUFFER, attachment.getBinding(),
+                                index.getTarget(), {resourceID}, index.getLevelIndex()));
     }
     else
     {
         ASSERT(attachment.type() == GL_RENDERBUFFER);
-        Capture(setupCalls, CaptureFramebufferRenderbuffer(replayState, true, GL_FRAMEBUFFER,
-                                                           attachment.getBinding(), GL_RENDERBUFFER,
-                                                           {resourceID}));
+        Capture(setupCalls, framebufferFuncs.framebufferRenderbuffer(
+                                replayState, true, GL_FRAMEBUFFER, attachment.getBinding(),
+                                GL_RENDERBUFFER, {resourceID}));
     }
 }
 
 void CaptureUpdateUniformValues(const gl::State &replayState,
                                 const gl::Context *context,
-                                const gl::Program *program,
+                                gl::Program *program,
                                 std::vector<CallCapture> *callsOut)
 {
     if (!program->isLinked())
@@ -1697,9 +1798,11 @@
     }
 
     // We need to bind the program and update its uniforms
-    // TODO (http://anglebug.com/3662): Only bind if different from currently bound
-    Capture(callsOut, CaptureUseProgram(replayState, true, program->id()));
-    CaptureUpdateCurrentProgram(callsOut->back(), callsOut);
+    if (!replayState.getProgram() || replayState.getProgram()->id() != program->id())
+    {
+        Capture(callsOut, CaptureUseProgram(replayState, true, program->id()));
+        CaptureUpdateCurrentProgram(callsOut->back(), callsOut);
+    }
 
     const std::vector<gl::LinkedUniform> &uniforms = program->getState().getUniforms();
 
@@ -1948,10 +2051,22 @@
     }
 }
 
-void CaptureVertexArrayData(std::vector<CallCapture> *setupCalls,
-                            const gl::Context *context,
-                            const gl::VertexArray *vertexArray,
-                            gl::State *replayState)
+bool VertexBindingMatchesAttribStride(const gl::VertexAttribute &attrib,
+                                      const gl::VertexBinding &binding)
+{
+    if (attrib.vertexAttribArrayStride == 0 &&
+        binding.getStride() == ComputeVertexAttributeTypeSize(attrib))
+    {
+        return true;
+    }
+
+    return attrib.vertexAttribArrayStride == binding.getStride();
+}
+
+void CaptureVertexArrayState(std::vector<CallCapture> *setupCalls,
+                             const gl::Context *context,
+                             const gl::VertexArray *vertexArray,
+                             gl::State *replayState)
 {
     const std::vector<gl::VertexAttribute> &vertexAttribs = vertexArray->getVertexAttributes();
     const std::vector<gl::VertexBinding> &vertexBindings  = vertexArray->getVertexBindings();
@@ -1998,13 +2113,21 @@
             {
                 CaptureVertexPointerES1(setupCalls, replayState, attribIndex, attrib, binding);
             }
-            else
+            else if (attrib.bindingIndex == attribIndex &&
+                     VertexBindingMatchesAttribStride(attrib, binding) &&
+                     (!buffer || binding.getOffset() == reinterpret_cast<GLintptr>(attrib.pointer)))
             {
+                // Check if we can use strictly ES2 semantics.
                 Capture(setupCalls,
                         CaptureVertexAttribPointer(
                             *replayState, true, attribIndex, attrib.format->channelCount,
                             attrib.format->vertexAttribType, attrib.format->isNorm(),
-                            binding.getStride(), attrib.pointer));
+                            attrib.vertexAttribArrayStride, attrib.pointer));
+            }
+            else
+            {
+                // TOOD: http://anglebug.com/6274. ES 3.1 vertex array state is not yet implemented.
+                UNIMPLEMENTED();
             }
         }
 
@@ -2180,6 +2303,113 @@
     }
 }
 
+void GenerateLinkedProgram(const gl::Context *context,
+                           const gl::State &replayState,
+                           ResourceTracker *resourceTracker,
+                           std::vector<CallCapture> *setupCalls,
+                           gl::Program *program,
+                           gl::ShaderProgramID id,
+                           const ProgramSources &linkedSources)
+{
+    // Bump up our max program ID before creating temp shaders
+    resourceTracker->onShaderProgramAccess(id);
+
+    // Use max ID as a temporary shader ID.
+    // Note this isn't the real ID of the shader, just a lookup into the gShaderProgram map.
+    gl::ShaderProgramID tempShaderID = {resourceTracker->getMaxShaderPrograms()};
+
+    // Compile with last linked sources.
+    for (gl::ShaderType shaderType : program->getExecutable().getLinkedShaderStages())
+    {
+        const std::string &sourceString = linkedSources[shaderType];
+        const char *sourcePointer       = sourceString.c_str();
+
+        if (sourceString.empty())
+        {
+            // If we don't have source for this shader, that means it was populated by the app
+            // using glProgramBinary.  We need to look it up from our cached copy.
+            const ProgramSources &cachedLinkedSources =
+                context->getShareGroup()->getFrameCaptureShared()->getProgramSources(id);
+
+            const std::string &cachedSourceString = cachedLinkedSources[shaderType];
+            sourcePointer                         = cachedSourceString.c_str();
+            ASSERT(!cachedSourceString.empty());
+        }
+
+        // Compile and attach the temporary shader. Then free it immediately.
+        Capture(setupCalls, CaptureCreateShader(replayState, true, shaderType, tempShaderID.value));
+        Capture(setupCalls,
+                CaptureShaderSource(replayState, true, tempShaderID, 1, &sourcePointer, nullptr));
+        Capture(setupCalls, CaptureCompileShader(replayState, true, tempShaderID));
+        Capture(setupCalls, CaptureAttachShader(replayState, true, id, tempShaderID));
+        Capture(setupCalls, CaptureDeleteShader(replayState, true, tempShaderID));
+    }
+
+    // Gather XFB varyings
+    std::vector<std::string> xfbVaryings;
+    for (const gl::TransformFeedbackVarying &xfbVarying :
+         program->getState().getLinkedTransformFeedbackVaryings())
+    {
+        xfbVaryings.push_back(xfbVarying.nameWithArrayIndex());
+    }
+
+    if (!xfbVaryings.empty())
+    {
+        std::vector<const char *> varyingsStrings;
+        for (const std::string &varyingString : xfbVaryings)
+        {
+            varyingsStrings.push_back(varyingString.data());
+        }
+
+        GLenum xfbMode = program->getState().getTransformFeedbackBufferMode();
+        Capture(setupCalls, CaptureTransformFeedbackVaryings(replayState, true, id,
+                                                             static_cast<GLint>(xfbVaryings.size()),
+                                                             varyingsStrings.data(), xfbMode));
+    }
+
+    // Force the attributes to be bound the same way as in the existing program.
+    // This can affect attributes that are optimized out in some implementations.
+    for (const sh::ShaderVariable &attrib : program->getState().getProgramInputs())
+    {
+        if (gl::IsBuiltInName(attrib.name))
+        {
+            // Don't try to bind built-in attributes
+            continue;
+        }
+
+        // Separable programs may not have a VS, meaning it may not have attributes.
+        if (program->getExecutable().hasLinkedShaderStage(gl::ShaderType::Vertex))
+        {
+            ASSERT(attrib.location != -1);
+            Capture(setupCalls, CaptureBindAttribLocation(replayState, true, id,
+                                                          static_cast<GLuint>(attrib.location),
+                                                          attrib.name.c_str()));
+        }
+    }
+
+    if (program->isSeparable())
+    {
+        // MEC manually recreates separable programs, rather than attempting to recreate a call
+        // to glCreateShaderProgramv(), so insert a call to mark it separable.
+        Capture(setupCalls,
+                CaptureProgramParameteri(replayState, true, id, GL_PROGRAM_SEPARABLE, GL_TRUE));
+    }
+
+    Capture(setupCalls, CaptureLinkProgram(replayState, true, id));
+    CaptureUpdateUniformLocations(program, setupCalls);
+    CaptureUpdateUniformValues(replayState, context, program, setupCalls);
+    CaptureUpdateUniformBlockIndexes(program, setupCalls);
+
+    // Capture uniform block bindings for each program
+    for (unsigned int uniformBlockIndex = 0;
+         uniformBlockIndex < program->getActiveUniformBlockCount(); uniformBlockIndex++)
+    {
+        GLuint blockBinding = program->getUniformBlockBinding(uniformBlockIndex);
+        Capture(setupCalls, CaptureUniformBlockBinding(replayState, true, id, {uniformBlockIndex},
+                                                       blockBinding));
+    }
+}
+
 // TODO(http://anglebug.com/4599): Improve reset/restore call generation
 // There are multiple ways to track reset calls for individual resources. For now, we are tracking
 // separate lists of instructions that mirror the calls created during mid-execution setup. Other
@@ -2190,21 +2420,24 @@
                              gl::BufferID *id,
                              const gl::Buffer *buffer)
 {
+    GLuint bufferID = (*id).value;
+
     // Track this as a starting resource that may need to be restored.
-    BufferSet &startingBuffers = resourceTracker->getStartingBuffers();
-    startingBuffers.insert(*id);
+    TrackedResource &trackedBuffers = resourceTracker->getTrackedResource(ResourceIDType::Buffer);
+    ResourceSet &startingBuffers    = trackedBuffers.getStartingResources();
+    startingBuffers.insert(bufferID);
 
     // Track calls to regenerate a given buffer
-    BufferCalls &bufferRegenCalls = resourceTracker->getBufferRegenCalls();
-    Capture(&bufferRegenCalls[*id], CaptureDeleteBuffers(replayState, true, 1, id));
-    Capture(&bufferRegenCalls[*id], CaptureGenBuffers(replayState, true, 1, id));
-    MaybeCaptureUpdateResourceIDs(&bufferRegenCalls[*id]);
+    ResourceCalls &bufferRegenCalls = trackedBuffers.getResourceRegenCalls();
+    Capture(&bufferRegenCalls[bufferID], CaptureDeleteBuffers(replayState, true, 1, id));
+    Capture(&bufferRegenCalls[bufferID], CaptureGenBuffers(replayState, true, 1, id));
+    MaybeCaptureUpdateResourceIDs(&bufferRegenCalls[bufferID]);
 
     // Track calls to restore a given buffer's contents
-    BufferCalls &bufferRestoreCalls = resourceTracker->getBufferRestoreCalls();
-    Capture(&bufferRestoreCalls[*id],
+    ResourceCalls &bufferRestoreCalls = trackedBuffers.getResourceRestoreCalls();
+    Capture(&bufferRestoreCalls[bufferID],
             CaptureBindBuffer(replayState, true, gl::BufferBinding::Array, *id));
-    Capture(&bufferRestoreCalls[*id],
+    Capture(&bufferRestoreCalls[bufferID],
             CaptureBufferData(replayState, true, gl::BufferBinding::Array,
                               static_cast<GLsizeiptr>(buffer->getSize()), buffer->getMapPointer(),
                               buffer->getUsage()));
@@ -2214,25 +2447,25 @@
         // Track calls to remap a buffer that started as mapped
         BufferCalls &bufferMapCalls = resourceTracker->getBufferMapCalls();
 
-        Capture(&bufferMapCalls[*id],
+        Capture(&bufferMapCalls[bufferID],
                 CaptureBindBuffer(replayState, true, gl::BufferBinding::Array, *id));
 
         void *dontCare = nullptr;
-        Capture(&bufferMapCalls[*id],
+        Capture(&bufferMapCalls[bufferID],
                 CaptureMapBufferRange(replayState, true, gl::BufferBinding::Array,
                                       static_cast<GLsizeiptr>(buffer->getMapOffset()),
                                       static_cast<GLsizeiptr>(buffer->getMapLength()),
                                       buffer->getAccessFlags(), dontCare));
 
         // Track the bufferID that was just mapped
-        bufferMapCalls[*id].back().params.setMappedBufferID(buffer->id());
+        bufferMapCalls[bufferID].back().params.setMappedBufferID(buffer->id());
     }
 
     // Track calls unmap a buffer that started as unmapped
     BufferCalls &bufferUnmapCalls = resourceTracker->getBufferUnmapCalls();
-    Capture(&bufferUnmapCalls[*id],
+    Capture(&bufferUnmapCalls[bufferID],
             CaptureBindBuffer(replayState, true, gl::BufferBinding::Array, *id));
-    Capture(&bufferUnmapCalls[*id],
+    Capture(&bufferUnmapCalls[bufferID],
             CaptureUnmapBuffer(replayState, true, gl::BufferBinding::Array, GL_TRUE));
 }
 
@@ -2315,16 +2548,14 @@
 //     Objects which contain references to other objects include framebuffer, program
 //   pipeline, transform feedback, and vertex array objects. Such objects are called
 //   container objects and are not shared.
-void CaptureSharedContextMidExecutionSetup(const gl::Context *context,
-                                           std::vector<CallCapture> *setupCalls,
-                                           ResourceTracker *resourceTracker)
+void CaptureShareGroupMidExecutionSetup(const gl::Context *context,
+                                        std::vector<CallCapture> *setupCalls,
+                                        ResourceTracker *resourceTracker,
+                                        gl::State &replayState)
 {
 
     FrameCaptureShared *frameCaptureShared = context->getShareGroup()->getFrameCaptureShared();
     const gl::State &apiState              = context->getState();
-    gl::State replayState(nullptr, nullptr, nullptr, nullptr, nullptr, EGL_OPENGL_ES_API,
-                          apiState.getClientVersion(), false, true, true, true, false,
-                          EGL_CONTEXT_PRIORITY_MEDIUM_IMG, apiState.hasProtectedContent());
 
     // Small helper function to make the code more readable.
     auto cap = [frameCaptureShared, setupCalls](CallCapture &&call) {
@@ -2395,7 +2626,7 @@
                                           static_cast<GLsizeiptr>(buffer->getMapLength()),
                                           buffer->getAccessFlags(), dontCare));
 
-            resourceTracker->setStartingBufferMapped(buffer->id(), true);
+            resourceTracker->setStartingBufferMapped(buffer->id().value, true);
 
             frameCaptureShared->trackBufferMapping(
                 &setupCalls->back(), buffer->id(), static_cast<GLsizeiptr>(buffer->getMapOffset()),
@@ -2404,7 +2635,7 @@
         }
         else
         {
-            resourceTracker->setStartingBufferMapped(buffer->id(), false);
+            resourceTracker->setStartingBufferMapped(buffer->id().value, false);
         }
 
         // Generate the calls needed to restore this buffer to original state for frame looping
@@ -2418,6 +2649,15 @@
         }
     }
 
+    // Set a unpack alignment of 1. Otherwise, computeRowPitch() will compute the wrong value,
+    // leading to a crash in memcpy() when capturing the texture contents.
+    gl::PixelUnpackState &currentUnpackState = replayState.getUnpackState();
+    if (currentUnpackState.alignment != 1)
+    {
+        cap(CapturePixelStorei(replayState, true, GL_UNPACK_ALIGNMENT, 1));
+        currentUnpackState.alignment = 1;
+    }
+
     // Capture Texture setup and data.
     const gl::TextureManager &textures = apiState.getTextureManagerForCapture();
 
@@ -2431,11 +2671,35 @@
             continue;
         }
 
-        // Gen the Texture.
-        cap(CaptureGenTextures(replayState, true, 1, &id));
-        MaybeCaptureUpdateResourceIDs(setupCalls);
+        // Track this as a starting resource that may need to be restored.
+        TrackedResource &trackedTextures =
+            resourceTracker->getTrackedResource(ResourceIDType::Texture);
+        ResourceSet &startingTextures = trackedTextures.getStartingResources();
+        startingTextures.insert(id.value);
 
-        cap(CaptureBindTexture(replayState, true, texture->getType(), id));
+        // For the initial texture creation calls, track in the generate list
+        ResourceCalls &textureRegenCalls = trackedTextures.getResourceRegenCalls();
+        CallVector texGenCalls({setupCalls, &textureRegenCalls[id.value]});
+
+        // For reset only, delete the texture before genning
+        Capture(&textureRegenCalls[id.value], CaptureDeleteTextures(replayState, true, 1, &id));
+
+        // Gen the Texture.
+        for (std::vector<CallCapture> *calls : texGenCalls)
+        {
+            Capture(calls, CaptureGenTextures(replayState, true, 1, &id));
+            MaybeCaptureUpdateResourceIDs(calls);
+        }
+
+        // For the remaining texture setup calls, track in the restore list
+        ResourceCalls &textureRestoreCalls = trackedTextures.getResourceRestoreCalls();
+        CallVector texSetupCalls({setupCalls, &textureRestoreCalls[id.value]});
+
+        for (std::vector<CallCapture> *calls : texSetupCalls)
+        {
+            Capture(calls, CaptureBindTexture(replayState, true, texture->getType(), id));
+        }
+        replayState.setSamplerTexture(context, texture->getType(), texture);
 
         // Capture sampler parameter states.
         // TODO(jmadill): More sampler / texture states. http://anglebug.com/3662
@@ -2443,12 +2707,20 @@
             gl::SamplerState::CreateDefaultForTarget(texture->getType());
         const gl::SamplerState &textureSamplerState = texture->getSamplerState();
 
-        auto capTexParam = [cap, &replayState, texture](GLenum pname, GLint param) {
-            cap(CaptureTexParameteri(replayState, true, texture->getType(), pname, param));
+        auto capTexParam = [&replayState, texture, &texSetupCalls](GLenum pname, GLint param) {
+            for (std::vector<CallCapture> *calls : texSetupCalls)
+            {
+                Capture(calls,
+                        CaptureTexParameteri(replayState, true, texture->getType(), pname, param));
+            }
         };
 
-        auto capTexParamf = [cap, &replayState, texture](GLenum pname, GLfloat param) {
-            cap(CaptureTexParameterf(replayState, true, texture->getType(), pname, param));
+        auto capTexParamf = [&replayState, texture, &texSetupCalls](GLenum pname, GLfloat param) {
+            for (std::vector<CallCapture> *calls : texSetupCalls)
+            {
+                Capture(calls,
+                        CaptureTexParameterf(replayState, true, texture->getType(), pname, param));
+            }
         };
 
         if (textureSamplerState.getMinFilter() != defaultSamplerState.getMinFilter())
@@ -2530,7 +2802,26 @@
         // If the texture is immutable, initialize it with TexStorage
         if (texture->getImmutableFormat())
         {
-            CaptureTextureStorage(setupCalls, &replayState, texture);
+            // We can only call TexStorage *once* on an immutable texture, so it needs special
+            // handling. To solve this, immutable textures will have a BindTexture and TexStorage as
+            // part of their textureRegenCalls. The resulting regen sequence will be:
+            //
+            //    const GLuint glDeleteTextures_texturesPacked_0[] = { gTextureMap[52] };
+            //    glDeleteTextures(1, glDeleteTextures_texturesPacked_0);
+            //    glGenTextures(1, reinterpret_cast<GLuint *>(gReadBuffer));
+            //    UpdateTextureID(52, 0);
+            //    glBindTexture(GL_TEXTURE_2D, gTextureMap[52]);
+            //    glTexStorage2D(GL_TEXTURE_2D, 1, GL_R8, 256, 512);
+
+            // Bind the texture first just for textureRegenCalls
+            Capture(&textureRegenCalls[id.value],
+                    CaptureBindTexture(replayState, true, texture->getType(), id));
+
+            // Then add TexStorage to texGenCalls instead of texSetupCalls
+            for (std::vector<CallCapture> *calls : texGenCalls)
+            {
+                CaptureTextureStorage(calls, &replayState, texture);
+            }
         }
 
         // Iterate texture levels and layers.
@@ -2550,20 +2841,28 @@
 
             const gl::InternalFormat &format = *desc.format.info;
 
+            bool supportedType = (index.getType() == gl::TextureType::_2D ||
+                                  index.getType() == gl::TextureType::_3D ||
+                                  index.getType() == gl::TextureType::_2DArray ||
+                                  index.getType() == gl::TextureType::Buffer ||
+                                  index.getType() == gl::TextureType::CubeMap ||
+                                  index.getType() == gl::TextureType::CubeMapArray);
+
             // Check for supported textures
-            ASSERT(index.getType() == gl::TextureType::_2D ||
-                   index.getType() == gl::TextureType::_3D ||
-                   index.getType() == gl::TextureType::_2DArray ||
-                   index.getType() == gl::TextureType::Buffer ||
-                   index.getType() == gl::TextureType::CubeMap ||
-                   index.getType() == gl::TextureType::CubeMapArray);
+            if (!supportedType)
+            {
+                ERR() << "Unsupported texture type: " << index.getType();
+                UNREACHABLE();
+            }
 
             if (index.getType() == gl::TextureType::Buffer)
             {
                 // The buffer contents are already backed up, but we need to emit the TexBuffer
                 // binding calls
-                CaptureTextureContents(setupCalls, &replayState, texture, index, desc, 0, 0);
-
+                for (std::vector<CallCapture> *calls : texSetupCalls)
+                {
+                    CaptureTextureContents(calls, &replayState, texture, index, desc, 0, 0);
+                }
                 continue;
             }
 
@@ -2576,9 +2875,12 @@
                         texture->id(), index.getTarget(), index.getLevelIndex());
 
                 // Use the shadow copy of the data to populate the call
-                CaptureTextureContents(setupCalls, &replayState, texture, index, desc,
-                                       static_cast<GLuint>(capturedTextureLevel.size()),
-                                       capturedTextureLevel.data());
+                for (std::vector<CallCapture> *calls : texSetupCalls)
+                {
+                    CaptureTextureContents(calls, &replayState, texture, index, desc,
+                                           static_cast<GLuint>(capturedTextureLevel.size()),
+                                           capturedTextureLevel.data());
+                }
             }
             else
             {
@@ -2608,13 +2910,19 @@
                                                index.getLevelIndex(), getFormat, getType,
                                                data.data());
 
-                    CaptureTextureContents(setupCalls, &replayState, texture, index, desc,
-                                           static_cast<GLuint>(data.size()), data.data());
+                    for (std::vector<CallCapture> *calls : texSetupCalls)
+                    {
+                        CaptureTextureContents(calls, &replayState, texture, index, desc,
+                                               static_cast<GLuint>(data.size()), data.data());
+                    }
                 }
                 else
                 {
-                    CaptureTextureContents(setupCalls, &replayState, texture, index, desc, 0,
-                                           nullptr);
+                    for (std::vector<CallCapture> *calls : texSetupCalls)
+                    {
+                        CaptureTextureContents(calls, &replayState, texture, index, desc, 0,
+                                               nullptr);
+                    }
                 }
             }
         }
@@ -2622,6 +2930,7 @@
 
     // Capture Renderbuffers.
     const gl::RenderbufferManager &renderbuffers = apiState.getRenderbufferManagerForCapture();
+    FramebufferCaptureFuncs framebufferFuncs(context->isGLES1());
 
     for (const auto &renderbufIter : renderbuffers)
     {
@@ -2629,9 +2938,9 @@
         const gl::Renderbuffer *renderbuffer = renderbufIter.second;
 
         // Generate renderbuffer id.
-        cap(CaptureGenRenderbuffers(replayState, true, 1, &id));
+        cap(framebufferFuncs.genRenderbuffers(replayState, true, 1, &id));
         MaybeCaptureUpdateResourceIDs(setupCalls);
-        cap(CaptureBindRenderbuffer(replayState, true, GL_RENDERBUFFER, id));
+        cap(framebufferFuncs.bindRenderbuffer(replayState, true, GL_RENDERBUFFER, id));
 
         GLenum internalformat = renderbuffer->getFormat().info->internalFormat;
 
@@ -2644,8 +2953,9 @@
         }
         else
         {
-            cap(CaptureRenderbufferStorage(replayState, true, GL_RENDERBUFFER, internalformat,
-                                           renderbuffer->getWidth(), renderbuffer->getHeight()));
+            cap(framebufferFuncs.renderbufferStorage(replayState, true, GL_RENDERBUFFER,
+                                                     internalformat, renderbuffer->getWidth(),
+                                                     renderbuffer->getHeight()));
         }
 
         // TODO(jmadill): Capture renderbuffer contents. http://anglebug.com/3662
@@ -2659,12 +2969,11 @@
     const gl::ResourceMap<gl::Program, gl::ShaderProgramID> &programs =
         shadersAndPrograms.getProgramsForCaptureAndPerf();
 
-    // Capture Program binary state. Use max ID as a temporary shader ID.
-    gl::ShaderProgramID tempShaderID = {resourceTracker->getMaxShaderPrograms()};
+    // Capture Program binary state.
     for (const auto &programIter : programs)
     {
-        gl::ShaderProgramID id     = {programIter.first};
-        const gl::Program *program = programIter.second;
+        gl::ShaderProgramID id = {programIter.first};
+        gl::Program *program   = programIter.second;
 
         // Unlinked programs don't have an executable. Thus they don't need to be captured.
         // Programs are shared by contexts in the share group and only need to be captured once.
@@ -2679,85 +2988,19 @@
 
         cap(CaptureCreateProgram(replayState, true, id.value));
 
-        // Compile with last linked sources.
-        for (gl::ShaderType shaderType : program->getExecutable().getLinkedShaderStages())
-        {
-            const std::string &sourceString = linkedSources[shaderType];
-            const char *sourcePointer       = sourceString.c_str();
+        GenerateLinkedProgram(context, replayState, resourceTracker, setupCalls, program, id,
+                              linkedSources);
 
-            // Compile and attach the temporary shader. Then free it immediately.
-            cap(CaptureCreateShader(replayState, true, shaderType, tempShaderID.value));
-            cap(CaptureShaderSource(replayState, true, tempShaderID, 1, &sourcePointer, nullptr));
-            cap(CaptureCompileShader(replayState, true, tempShaderID));
-            cap(CaptureAttachShader(replayState, true, id, tempShaderID));
-            cap(CaptureDeleteShader(replayState, true, tempShaderID));
+        // Update the program in replayState
+        if (!replayState.getProgram() || replayState.getProgram()->id() != program->id())
+        {
+            // Note: We don't do this in GenerateLinkedProgram because it can't modify state
+            (void)replayState.setProgram(context, program);
         }
 
-        // Gather XFB varyings
-        std::vector<std::string> xfbVaryings;
-        for (const gl::TransformFeedbackVarying &xfbVarying :
-             program->getState().getLinkedTransformFeedbackVaryings())
-        {
-            xfbVaryings.push_back(xfbVarying.nameWithArrayIndex());
-        }
-
-        if (!xfbVaryings.empty())
-        {
-            std::vector<const char *> varyingsStrings;
-            for (const std::string &varyingString : xfbVaryings)
-            {
-                varyingsStrings.push_back(varyingString.data());
-            }
-
-            GLenum xfbMode = program->getState().getTransformFeedbackBufferMode();
-            cap(CaptureTransformFeedbackVaryings(replayState, true, id,
-                                                 static_cast<GLint>(xfbVaryings.size()),
-                                                 varyingsStrings.data(), xfbMode));
-        }
-
-        // Force the attributes to be bound the same way as in the existing program.
-        // This can affect attributes that are optimized out in some implementations.
-        for (const sh::ShaderVariable &attrib : program->getState().getProgramInputs())
-        {
-            if (gl::IsBuiltInName(attrib.name))
-            {
-                // Don't try to bind built-in attributes
-                continue;
-            }
-
-            // Separable programs may not have a VS, meaning it may not have attributes.
-            if (program->getExecutable().hasLinkedShaderStage(gl::ShaderType::Vertex))
-            {
-                ASSERT(attrib.location != -1);
-                cap(CaptureBindAttribLocation(replayState, true, id,
-                                              static_cast<GLuint>(attrib.location),
-                                              attrib.name.c_str()));
-            }
-        }
-
-        if (program->isSeparable())
-        {
-            // MEC manually recreates separable programs, rather than attempting to recreate a call
-            // to glCreateShaderProgramv(), so insert a call to mark it separable.
-            cap(CaptureProgramParameteri(replayState, true, id, GL_PROGRAM_SEPARABLE, GL_TRUE));
-        }
-
-        cap(CaptureLinkProgram(replayState, true, id));
-        CaptureUpdateUniformLocations(program, setupCalls);
-        CaptureUpdateUniformValues(replayState, context, program, setupCalls);
-        CaptureUpdateUniformBlockIndexes(program, setupCalls);
-
-        // Capture uniform block bindings for each program
-        for (unsigned int uniformBlockIndex = 0;
-             uniformBlockIndex < program->getActiveUniformBlockCount(); uniformBlockIndex++)
-        {
-            GLuint blockBinding = program->getUniformBlockBinding(uniformBlockIndex);
-            cap(CaptureUniformBlockBinding(replayState, true, id, {uniformBlockIndex},
-                                           blockBinding));
-        }
-
-        resourceTracker->onShaderProgramAccess(id);
-        resourceTracker->getStartingPrograms().insert(id);
+        resourceTracker->getTrackedResource(ResourceIDType::ShaderProgram)
+            .getStartingResources()
+            .insert(id.value);
     }
 
     // Handle shaders.
@@ -2888,24 +3131,24 @@
 
 void CaptureMidExecutionSetup(const gl::Context *context,
                               std::vector<CallCapture> *setupCalls,
-                              ResourceTracker *resourceTracker)
+                              ResourceTracker *resourceTracker,
+                              gl::State &replayState,
+                              bool validationEnabled)
 {
     const gl::State &apiState = context->getState();
-    gl::State replayState(nullptr, nullptr, nullptr, nullptr, nullptr, EGL_OPENGL_ES_API,
-                          context->getState().getClientVersion(), false, true, true, true, false,
-                          EGL_CONTEXT_PRIORITY_MEDIUM_IMG, apiState.hasProtectedContent());
 
     // Small helper function to make the code more readable.
     auto cap = [setupCalls](CallCapture &&call) { setupCalls->emplace_back(std::move(call)); };
 
-    // Currently this code assumes we can use create-on-bind. It does not support 'Gen' usage.
-    // TODO(jmadill): Use handle mapping for captured objects. http://anglebug.com/3662
+    // Need to go from uint32 -> uint64 -> EGLContext (void*) to handle MSVC compiler
+    // warning on 64b systems:
+    //   error C4312: 'reinterpret_cast': conversion from 'uint32_t' to 'EGLContext' of
+    //   greater size
+    uint64_t contextID    = static_cast<uint64_t>(context->id().value);
+    EGLContext eglContext = reinterpret_cast<EGLContext>(contextID);
+    cap(CaptureMakeCurrent(EGL_NO_DISPLAY, EGL_NO_SURFACE, EGL_NO_SURFACE, eglContext));
 
-    // Vertex input states. Only handles GLES 2.0 states right now.
-    // Must happen after buffer data initialization.
-    // TODO(http://anglebug.com/3662): Complete state capture.
-
-    // Capture default vertex attribs. Do not capture on GLES1.
+    // Vertex input states. Must happen after buffer data initialization. Do not capture on GLES1.
     if (!context->isGLES1())
     {
         CaptureDefaultVertexAttribs(replayState, apiState, setupCalls);
@@ -2933,7 +3176,7 @@
                 cap(CaptureBindVertexArray(replayState, true, vertexArrayID));
                 boundVertexArrayID = vertexArrayID;
             }
-            CaptureVertexArrayData(setupCalls, context, vertexArray, &replayState);
+            CaptureVertexArrayState(setupCalls, context, vertexArray, &replayState);
         }
     }
 
@@ -2982,7 +3225,8 @@
         }
     }
 
-    // Set a unpack alignment of 1.
+    // Set a unpack alignment of 1. Otherwise, computeRowPitch() will compute the wrong value,
+    // leading to a crash in memcpy() when capturing the texture contents.
     gl::PixelUnpackState &currentUnpackState = replayState.getUnpackState();
     if (currentUnpackState.alignment != 1)
     {
@@ -2991,42 +3235,42 @@
     }
 
     // Capture Texture setup and data.
-    const gl::TextureBindingMap &boundTextures = apiState.getBoundTexturesForCapture();
+    const gl::TextureBindingMap &apiBoundTextures = apiState.getBoundTexturesForCapture();
 
     // Set Texture bindings.
-    size_t currentActiveTexture = 0;
-    gl::TextureTypeMap<gl::TextureID> currentTextureBindings;
     for (gl::TextureType textureType : angle::AllEnums<gl::TextureType>())
     {
-        const gl::TextureBindingVector &bindings = boundTextures[textureType];
-        for (size_t bindingIndex = 0; bindingIndex < bindings.size(); ++bindingIndex)
+        const gl::TextureBindingVector &apiBindings = apiBoundTextures[textureType];
+        const gl::TextureBindingVector &replayBindings =
+            replayState.getBoundTexturesForCapture()[textureType];
+        ASSERT(apiBindings.size() == replayBindings.size());
+        for (size_t bindingIndex = 0; bindingIndex < apiBindings.size(); ++bindingIndex)
         {
-            gl::TextureID textureID = bindings[bindingIndex].id();
+            gl::TextureID apiTextureID    = apiBindings[bindingIndex].id();
+            gl::TextureID replayTextureID = replayBindings[bindingIndex].id();
 
-            if (textureID.value != 0)
+            if (apiTextureID != replayTextureID)
             {
-                if (currentActiveTexture != bindingIndex)
+                if (replayState.getActiveSampler() != bindingIndex)
                 {
                     cap(CaptureActiveTexture(replayState, true,
                                              GL_TEXTURE0 + static_cast<GLenum>(bindingIndex)));
-                    currentActiveTexture = bindingIndex;
+                    replayState.setActiveSampler(static_cast<unsigned int>(bindingIndex));
                 }
 
-                if (currentTextureBindings[textureType] != textureID)
-                {
-                    cap(CaptureBindTexture(replayState, true, textureType, textureID));
-                    currentTextureBindings[textureType] = textureID;
-                }
+                cap(CaptureBindTexture(replayState, true, textureType, apiTextureID));
+                replayState.setSamplerTexture(context, textureType,
+                                              apiBindings[bindingIndex].get());
             }
         }
     }
 
     // Set active Texture.
-    size_t stateActiveTexture = apiState.getActiveSampler();
-    if (currentActiveTexture != stateActiveTexture)
+    if (replayState.getActiveSampler() != apiState.getActiveSampler())
     {
         cap(CaptureActiveTexture(replayState, true,
-                                 GL_TEXTURE0 + static_cast<GLenum>(stateActiveTexture)));
+                                 GL_TEXTURE0 + static_cast<GLenum>(apiState.getActiveSampler())));
+        replayState.setActiveSampler(apiState.getActiveSampler());
     }
 
     // Set Renderbuffer binding.
@@ -3045,6 +3289,7 @@
 
     // Capture Framebuffers.
     const gl::FramebufferManager &framebuffers = apiState.getFramebufferManagerForCapture();
+    FramebufferCaptureFuncs framebufferFuncs(context->isGLES1());
 
     gl::FramebufferID currentDrawFramebuffer = {0};
     gl::FramebufferID currentReadFramebuffer = {0};
@@ -3060,9 +3305,9 @@
             continue;
         }
 
-        cap(CaptureGenFramebuffers(replayState, true, 1, &id));
+        cap(framebufferFuncs.genFramebuffers(replayState, true, 1, &id));
         MaybeCaptureUpdateResourceIDs(setupCalls);
-        cap(CaptureBindFramebuffer(replayState, true, GL_FRAMEBUFFER, id));
+        cap(framebufferFuncs.bindFramebuffer(replayState, true, GL_FRAMEBUFFER, id));
         currentDrawFramebuffer = currentReadFramebuffer = id;
 
         // Color Attachments.
@@ -3073,7 +3318,8 @@
                 continue;
             }
 
-            CaptureFramebufferAttachment(setupCalls, replayState, colorAttachment);
+            CaptureFramebufferAttachment(setupCalls, replayState, framebufferFuncs,
+                                         colorAttachment);
         }
 
         const gl::FramebufferAttachment *depthAttachment = framebuffer->getDepthAttachment();
@@ -3081,7 +3327,8 @@
         {
             ASSERT(depthAttachment->getBinding() == GL_DEPTH_ATTACHMENT ||
                    depthAttachment->getBinding() == GL_DEPTH_STENCIL_ATTACHMENT);
-            CaptureFramebufferAttachment(setupCalls, replayState, *depthAttachment);
+            CaptureFramebufferAttachment(setupCalls, replayState, framebufferFuncs,
+                                         *depthAttachment);
         }
 
         const gl::FramebufferAttachment *stencilAttachment = framebuffer->getStencilAttachment();
@@ -3089,12 +3336,22 @@
         {
             ASSERT(stencilAttachment->getBinding() == GL_STENCIL_ATTACHMENT ||
                    depthAttachment->getBinding() == GL_DEPTH_STENCIL_ATTACHMENT);
-            CaptureFramebufferAttachment(setupCalls, replayState, *stencilAttachment);
+            CaptureFramebufferAttachment(setupCalls, replayState, framebufferFuncs,
+                                         *stencilAttachment);
         }
 
+        gl::FramebufferState defaultFramebufferState(
+            context->getCaps(), framebuffer->getState().id(),
+            framebuffer->getState().getFramebufferSerial());
+        const std::vector<GLenum> &defaultDrawBufferStates =
+            defaultFramebufferState.getDrawBufferStates();
         const std::vector<GLenum> &drawBufferStates = framebuffer->getDrawBufferStates();
-        cap(CaptureDrawBuffers(replayState, true, static_cast<GLsizei>(drawBufferStates.size()),
-                               drawBufferStates.data()));
+
+        if (drawBufferStates != defaultDrawBufferStates)
+        {
+            cap(CaptureDrawBuffers(replayState, true, static_cast<GLsizei>(drawBufferStates.size()),
+                                   drawBufferStates.data()));
+        }
     }
 
     // Capture framebuffer bindings.
@@ -3105,7 +3362,8 @@
         if (currentDrawFramebuffer != stateDrawFramebuffer ||
             currentReadFramebuffer != stateReadFramebuffer)
         {
-            cap(CaptureBindFramebuffer(replayState, true, GL_FRAMEBUFFER, stateDrawFramebuffer));
+            cap(framebufferFuncs.bindFramebuffer(replayState, true, GL_FRAMEBUFFER,
+                                                 stateDrawFramebuffer));
             currentDrawFramebuffer = currentReadFramebuffer = stateDrawFramebuffer;
         }
     }
@@ -3113,15 +3371,15 @@
     {
         if (currentDrawFramebuffer != stateDrawFramebuffer)
         {
-            cap(CaptureBindFramebuffer(replayState, true, GL_DRAW_FRAMEBUFFER,
-                                       currentDrawFramebuffer));
+            cap(framebufferFuncs.bindFramebuffer(replayState, true, GL_DRAW_FRAMEBUFFER,
+                                                 currentDrawFramebuffer));
             currentDrawFramebuffer = stateDrawFramebuffer;
         }
 
         if (currentReadFramebuffer != stateReadFramebuffer)
         {
-            cap(CaptureBindFramebuffer(replayState, true, GL_READ_FRAMEBUFFER,
-                                       replayState.getReadFramebuffer()->id()));
+            cap(framebufferFuncs.bindFramebuffer(replayState, true, GL_READ_FRAMEBUFFER,
+                                                 replayState.getReadFramebuffer()->id()));
             currentReadFramebuffer = stateReadFramebuffer;
         }
     }
@@ -3162,27 +3420,34 @@
 
     // For now we assume the installed program executable is the same as the current program.
     // TODO(jmadill): Handle installed program executable. http://anglebug.com/3662
-    if (apiState.getProgram() && !context->isGLES1())
+    if (!context->isGLES1())
     {
-        cap(CaptureUseProgram(replayState, true, apiState.getProgram()->id()));
-        CaptureUpdateCurrentProgram(setupCalls->back(), setupCalls);
-    }
-    else if (apiState.getProgramPipeline())
-    {
-        // glUseProgram() is called above to update the necessary uniform values for each program
-        // that's being recreated. If there is no program currently bound, then we need to unbind
-        // the last bound program so the PPO will be used instead:
-        // 7.4 Program Pipeline Objects
-        // If no current program object has been established by UseProgram, the program objects used
-        // for each shader stage and for uniform updates are taken from the bound program pipeline
-        // object, if any. If there is a current program object established by UseProgram, the bound
-        // program pipeline object has no effect on rendering or uniform updates.
-        cap(CaptureUseProgram(replayState, true, {0}));
-        CaptureUpdateCurrentProgram(setupCalls->back(), setupCalls);
-        cap(CaptureBindProgramPipeline(replayState, true, apiState.getProgramPipeline()->id()));
-    }
+        // If we have a program bound in the API, or if there is no program bound to the API at
+        // time of capture and we bound a program for uniform updates during MEC, we must add
+        // a set program call to replay the correct states.
+        if (apiState.getProgram())
+        {
+            cap(CaptureUseProgram(replayState, true, apiState.getProgram()->id()));
+            CaptureUpdateCurrentProgram(setupCalls->back(), setupCalls);
+            (void)replayState.setProgram(context, apiState.getProgram());
+        }
+        else if (replayState.getProgram())
+        {
+            cap(CaptureUseProgram(replayState, true, {0}));
+            CaptureUpdateCurrentProgram(setupCalls->back(), setupCalls);
+            (void)replayState.setProgram(context, nullptr);
+        }
 
-    // TODO(http://anglebug.com/3662): ES 3.x objects.
+        // Same for program pipelines as for programs, see comment above.
+        if (apiState.getProgramPipeline())
+        {
+            cap(CaptureBindProgramPipeline(replayState, true, apiState.getProgramPipeline()->id()));
+        }
+        else if (replayState.getProgramPipeline())
+        {
+            cap(CaptureBindProgramPipeline(replayState, true, {0}));
+        }
+    }
 
     // Create existing queries. Note that queries may be genned and not yet started. In that
     // case the queries will exist in the query map as nullptr entries.
@@ -3292,7 +3557,6 @@
     }
 
     // Capture GL Context states.
-    // TODO(http://anglebug.com/3662): Complete state capture.
     auto capCap = [cap, &replayState](GLenum capEnum, bool capValue) {
         if (capValue)
         {
@@ -3313,6 +3577,28 @@
         {
             capCap(GL_TEXTURE_2D, currentTextureState);
         }
+
+        cap(CaptureMatrixMode(replayState, true, gl::MatrixType::Projection));
+        for (angle::Mat4 projectionMatrix :
+             apiState.gles1().getMatrixStack(gl::MatrixType::Projection))
+        {
+            cap(CapturePushMatrix(replayState, true));
+            cap(CaptureLoadMatrixf(replayState, true, projectionMatrix.elements().data()));
+        }
+
+        cap(CaptureMatrixMode(replayState, true, gl::MatrixType::Modelview));
+        for (angle::Mat4 modelViewMatrix :
+             apiState.gles1().getMatrixStack(gl::MatrixType::Modelview))
+        {
+            cap(CapturePushMatrix(replayState, true));
+            cap(CaptureLoadMatrixf(replayState, true, modelViewMatrix.elements().data()));
+        }
+
+        gl::MatrixType currentMatrixMode = apiState.gles1().getMatrixMode();
+        if (currentMatrixMode != gl::MatrixType::Modelview)
+        {
+            cap(CaptureMatrixMode(replayState, true, currentMatrixMode));
+        }
     }
 
     // Rasterizer state. Missing ES 3.x features.
@@ -3639,6 +3925,14 @@
 
     // Allow the replayState object to be destroyed conveniently.
     replayState.setBufferBinding(context, gl::BufferBinding::Array, nullptr);
+
+    // Clean up the replay state.
+    replayState.reset(context);
+
+    if (validationEnabled)
+    {
+        CaptureValidateSerializedState(context, setupCalls);
+    }
 }
 
 bool SkipCall(EntryPoint entryPoint)
@@ -3877,7 +4171,8 @@
 }
 
 FrameCaptureShared::FrameCaptureShared()
-    : mEnabled(true),
+    : mLastContextId{0},
+      mEnabled(true),
       mSerializeStateEnabled(false),
       mCompression(true),
       mClientVertexArrayMap{},
@@ -3887,7 +4182,9 @@
       mClientArraySizes{},
       mReadBufferSize(0),
       mHasResourceType{},
+      mMaxAccessedResourceIDs{},
       mCaptureTrigger(0),
+      mCaptureActive(false),
       mWindowSurfaceContextID({0})
 {
     reset();
@@ -3922,6 +4219,11 @@
     {
         mCaptureStartFrame = atoi(startFromEnv.c_str());
     }
+    if (mCaptureStartFrame < 1)
+    {
+        WARN() << "Cannot use a capture start frame less than 1.";
+        mCaptureStartFrame = 1;
+    }
 
     std::string endFromEnv =
         GetEnvironmentVarOrUnCachedAndroidProperty(kFrameEndVarName, kAndroidFrameEnd);
@@ -3943,7 +4245,7 @@
     }
 
     std::string labelFromEnv =
-        GetEnvironmentVarOrUnCachedAndroidProperty(kCaptureLabel, kAndroidCaptureLabel);
+        GetEnvironmentVarOrUnCachedAndroidProperty(kCaptureLabelVarName, kAndroidCaptureLabel);
     if (!labelFromEnv.empty())
     {
         // Optional label to provide unique file names and namespaces
@@ -3951,17 +4253,39 @@
     }
 
     std::string compressionFromEnv =
-        GetEnvironmentVarOrUnCachedAndroidProperty(kCompression, kAndroidCompression);
+        GetEnvironmentVarOrUnCachedAndroidProperty(kCompressionVarName, kAndroidCompression);
     if (compressionFromEnv == "0")
     {
         mCompression = false;
     }
-    std::string serializeStateEnabledFromEnv =
-        angle::GetEnvironmentVar(kSerializeStateEnabledVarName);
-    if (serializeStateEnabledFromEnv == "1")
+    std::string serializeStateFromEnv = angle::GetEnvironmentVar(kSerializeStateVarName);
+    if (serializeStateFromEnv == "1")
     {
         mSerializeStateEnabled = true;
     }
+
+    std::string validateSerialiedStateFromEnv =
+        GetEnvironmentVarOrUnCachedAndroidProperty(kValidationVarName, kAndroidValidation);
+    if (validateSerialiedStateFromEnv == "1")
+    {
+        mValidateSerializedState = true;
+    }
+
+    mValidationExpression =
+        GetEnvironmentVarOrUnCachedAndroidProperty(kValidationExprVarName, kAndroidValidationExpr);
+
+    if (!mValidationExpression.empty())
+    {
+        INFO() << "Validation expression is " << kValidationExprVarName;
+    }
+
+    if (mFrameIndex == mCaptureStartFrame)
+    {
+        // Capture is starting from the first frame, so set the capture active to ensure all GLES
+        // commands issued are handled correctly by maybeCapturePreCallUpdates() and
+        // maybeCapturePostCallUpdates().
+        setCaptureActive();
+    }
 }
 
 FrameCaptureShared::~FrameCaptureShared() = default;
@@ -3991,21 +4315,24 @@
         call.params.getParam("dstName", ParamType::TTextureID, 6).value.TextureIDVal;
     GLint dstLevel = call.params.getParam("dstLevel", ParamType::TGLint, 8).value.GLintVal;
 
-    // Look up the texture type
-    gl::TextureTarget dstTargetPacked = gl::PackParam<gl::TextureTarget>(dstTarget);
-    gl::TextureType dstTextureType    = gl::TextureTargetToType(dstTargetPacked);
-
-    // Look up the currently bound texture
-    gl::Texture *dstTexture = context->getState().getTargetTexture(dstTextureType);
+    // Inspect the dest texture to see if this is compressed in case we need to back it up
+    gl::Texture *dstTexture = context->getTexture(dstName);
     ASSERT(dstTexture);
 
-    const gl::InternalFormat &dstFormat = *dstTexture->getFormat(dstTargetPacked, dstLevel).info;
+    // Look up its target using dstZ as the slice in case of 3D/Cube/Array
+    GLint dstZ = call.params.getParam("dstZ", ParamType::TGLint, 11).value.GLintVal;
+    gl::TextureTarget dstTargetPacked = gl::TextureTypeToTarget(dstTexture->getType(), dstZ);
 
+    // Pull the info and check
+    const gl::InternalFormat &dstFormat = *dstTexture->getFormat(dstTargetPacked, dstLevel).info;
     if (dstFormat.compressed)
     {
         context->getShareGroup()->getFrameCaptureShared()->copyCachedTextureLevel(
             context, srcName, srcLevel, dstName, dstLevel, call);
     }
+
+    // Also track that the destination texture has been updated
+    mResourceTracker.getTrackedResource(ResourceIDType::Texture).setModifiedResource(dstName.value);
 }
 
 void FrameCaptureShared::captureCompressedTextureData(const gl::Context *context,
@@ -4207,7 +4534,7 @@
                                             bool writable)
 {
     // Track that the buffer was mapped
-    mResourceTracker.setBufferMapped(id);
+    mResourceTracker.setBufferMapped(id.value);
 
     if (writable)
     {
@@ -4217,13 +4544,58 @@
         mBufferDataMap[id] = std::make_pair(offset, length);
 
         // Track that this buffer was potentially modified
-        mResourceTracker.setBufferModified(id);
+        mResourceTracker.getTrackedResource(ResourceIDType::Buffer).setModifiedResource(id.value);
 
         // Track the bufferID that was just mapped for use when writing return value
         call->params.setMappedBufferID(id);
     }
 }
 
+void FrameCaptureShared::trackTextureUpdate(const gl::Context *context, const CallCapture &call)
+{
+    int index             = 0;
+    std::string paramName = "targetPacked";
+
+    // Some calls provide the textureID directly
+    switch (call.entryPoint)
+    {
+        case EntryPoint::GLCompressedCopyTextureCHROMIUM:
+            index     = 1;
+            paramName = "destIdPacked";
+            break;
+        case EntryPoint::GLCopyTextureCHROMIUM:
+        case EntryPoint::GLCopySubTextureCHROMIUM:
+        case EntryPoint::GLCopyTexture3DANGLE:
+            index     = 3;
+            paramName = "destIdPacked";
+            break;
+        default:
+            break;
+    }
+
+    // For the rest, look it up based on the currently bound texture
+    GLuint id = 0;
+    if (index == 0)
+    {
+        gl::TextureTarget targetPacked =
+            call.params.getParam(paramName.c_str(), ParamType::TTextureTarget, index)
+                .value.TextureTargetVal;
+        gl::TextureType textureType = gl::TextureTargetToType(targetPacked);
+        gl::Texture *texture        = context->getState().getTargetTexture(textureType);
+        id                          = texture->id().value;
+    }
+    else
+    {
+        gl::TextureID destIDPacked =
+            call.params.getParam(paramName.c_str(), ParamType::TTextureID, index)
+                .value.TextureIDVal;
+        id = destIDPacked.value;
+    }
+
+    // Mark it as modified
+    mResourceTracker.getTrackedResource(ResourceIDType::Texture).setModifiedResource(id);
+}
+
 void FrameCaptureShared::updateCopyImageSubData(CallCapture &call)
 {
     // This call modifies srcName and dstName to no longer be object IDs (GLuint), but actual
@@ -4287,17 +4659,76 @@
     }
 }
 
-void FrameCaptureShared::maybeOverrideEntryPoint(const gl::Context *context, CallCapture &call)
+void FrameCaptureShared::overrideProgramBinary(const gl::Context *context,
+                                               CallCapture &inCall,
+                                               std::vector<CallCapture> &outCalls)
 {
-    switch (call.entryPoint)
+    // Program binaries are inherently non-portable, even between two ANGLE builds.
+    // If an application is using glProgramBinary in the middle of a trace, we need to replace
+    // those calls with an equivalent sequence of portable calls.
+    //
+    // For example, here is a sequence an app could use for glProgramBinary:
+    //
+    //   gShaderProgramMap[42] = glCreateProgram();
+    //   glProgramBinary(gShaderProgramMap[42], GL_PROGRAM_BINARY_ANGLE, gBinaryData[x], 1000);
+    //   glGetProgramiv(gShaderProgramMap[42], GL_LINK_STATUS, gReadBuffer);
+    //   glGetProgramiv(gShaderProgramMap[42], GL_PROGRAM_BINARY_LENGTH, gReadBuffer);
+    //
+    // With this override, the glProgramBinary call will be replaced like so:
+    //
+    //   gShaderProgramMap[42] = glCreateProgram();
+    //   === Begin override ===
+    //   gShaderProgramMap[43] = glCreateShader(GL_VERTEX_SHADER);
+    //   glShaderSource(gShaderProgramMap[43], 1, string_0, &gBinaryData[100]);
+    //   glCompileShader(gShaderProgramMap[43]);
+    //   glAttachShader(gShaderProgramMap[42], gShaderProgramMap[43]);
+    //   glDeleteShader(gShaderProgramMap[43]);
+    //   gShaderProgramMap[43] = glCreateShader(GL_FRAGMENT_SHADER);
+    //   glShaderSource(gShaderProgramMap[43], 1, string_1, &gBinaryData[200]);
+    //   glCompileShader(gShaderProgramMap[43]);
+    //   glAttachShader(gShaderProgramMap[42], gShaderProgramMap[43]);
+    //   glDeleteShader(gShaderProgramMap[43]);
+    //   glBindAttribLocation(gShaderProgramMap[42], 0, "attrib1");
+    //   glBindAttribLocation(gShaderProgramMap[42], 1, "attrib2");
+    //   glLinkProgram(gShaderProgramMap[42]);
+    //   UpdateUniformLocation(gShaderProgramMap[42], "foo", 0, 20);
+    //   UpdateUniformLocation(gShaderProgramMap[42], "bar", 72, 1);
+    //   glUseProgram(gShaderProgramMap[42]);
+    //   UpdateCurrentProgram(gShaderProgramMap[42]);
+    //   glUniform4fv(gUniformLocations[gCurrentProgram][0], 20, &gBinaryData[300]);
+    //   glUniform1iv(gUniformLocations[gCurrentProgram][72], 1, &gBinaryData[400]);
+    //   === End override ===
+    //   glGetProgramiv(gShaderProgramMap[42], GL_LINK_STATUS, gReadBuffer);
+    //   glGetProgramiv(gShaderProgramMap[42], GL_PROGRAM_BINARY_LENGTH, gReadBuffer);
+    //
+    // To facilitate this override, we are serializing each shader stage source into the binary
+    // itself.  See Program::serialize and Program::deserialize.  Once extracted from the binary,
+    // they will be available via getProgramSources.
+
+    gl::ShaderProgramID id = inCall.params.getParam("programPacked", ParamType::TShaderProgramID, 0)
+                                 .value.ShaderProgramIDVal;
+
+    gl::Program *program = context->getProgramResolveLink(id);
+    ASSERT(program);
+
+    GenerateLinkedProgram(context, context->getState(), &mResourceTracker, &outCalls, program, id,
+                          getProgramSources(id));
+}
+
+void FrameCaptureShared::maybeOverrideEntryPoint(const gl::Context *context,
+                                                 CallCapture &inCall,
+                                                 std::vector<CallCapture> &outCalls)
+{
+    switch (inCall.entryPoint)
     {
         case EntryPoint::GLEGLImageTargetTexture2DOES:
         {
             // We don't support reading EGLImages. Instead, just pull from a tiny null texture.
             // TODO (anglebug.com/4964): Read back the image data and populate the texture.
             std::vector<uint8_t> pixelData = {0, 0, 0, 0};
-            call = CaptureTexSubImage2D(context->getState(), true, gl::TextureTarget::_2D, 0, 0, 0,
-                                        1, 1, GL_RGBA, GL_UNSIGNED_BYTE, pixelData.data());
+            outCalls.emplace_back(
+                CaptureTexSubImage2D(context->getState(), true, gl::TextureTarget::_2D, 0, 0, 0, 1,
+                                     1, GL_RGBA, GL_UNSIGNED_BYTE, pixelData.data()));
             break;
         }
         case EntryPoint::GLEGLImageTargetRenderbufferStorageOES:
@@ -4310,11 +4741,24 @@
         case EntryPoint::GLCopyImageSubDataOES:
         {
             // We must look at the src and dst target types to determine which remap table to use
-            updateCopyImageSubData(call);
+            updateCopyImageSubData(inCall);
+            outCalls.emplace_back(std::move(inCall));
+            break;
+        }
+        case EntryPoint::GLProgramBinary:
+        case EntryPoint::GLProgramBinaryOES:
+        {
+            // Binary formats are not portable at all, so replace the calls with full linking
+            // sequence
+            overrideProgramBinary(context, inCall, outCalls);
             break;
         }
         default:
+        {
+            // Pass the single call through
+            outCalls.emplace_back(std::move(inCall));
             break;
+        }
     }
 }
 
@@ -4433,15 +4877,26 @@
             break;
         }
 
+        case EntryPoint::GLGenTextures:
+        {
+            GLsizei count = call.params.getParam("n", ParamType::TGLsizei, 0).value.GLsizeiVal;
+            const gl::TextureID *textureIDs =
+                call.params.getParam("texturesPacked", ParamType::TTextureIDPointer, 1)
+                    .value.TextureIDPointerVal;
+            for (GLsizei i = 0; i < count; i++)
+            {
+                // If we're capturing, track what new textures have been genned
+                handleGennedResource(textureIDs[i]);
+            }
+            break;
+        }
+
         case EntryPoint::GLDeleteBuffers:
         {
             GLsizei count = call.params.getParam("n", ParamType::TGLsizei, 0).value.GLsizeiVal;
             const gl::BufferID *bufferIDs =
                 call.params.getParam("buffersPacked", ParamType::TBufferIDConstPointer, 1)
                     .value.BufferIDConstPointerVal;
-            FrameCaptureShared *frameCaptureShared =
-                context->getShareGroup()->getFrameCaptureShared();
-            ResourceTracker &resourceTracker = context->getFrameCaptureSharedResourceTracker();
             for (GLsizei i = 0; i < count; i++)
             {
                 // For each buffer being deleted, check our backup of data and remove it
@@ -4451,10 +4906,7 @@
                     mBufferDataMap.erase(bufferDataInfo);
                 }
                 // If we're capturing, track what buffers have been deleted
-                if (frameCaptureShared->isCaptureActive())
-                {
-                    resourceTracker.setDeletedBuffer(bufferIDs[i]);
-                }
+                handleDeletedResource(bufferIDs[i]);
             }
             break;
         }
@@ -4465,16 +4917,38 @@
             const gl::BufferID *bufferIDs =
                 call.params.getParam("buffersPacked", ParamType::TBufferIDPointer, 1)
                     .value.BufferIDPointerVal;
-            FrameCaptureShared *frameCaptureShared =
-                context->getShareGroup()->getFrameCaptureShared();
-            ResourceTracker &resourceTracker = context->getFrameCaptureSharedResourceTracker();
             for (GLsizei i = 0; i < count; i++)
             {
-                // If we're capturing, track what new buffers have been genned
-                if (frameCaptureShared->isCaptureActive())
-                {
-                    resourceTracker.setGennedBuffer(bufferIDs[i]);
-                }
+                handleGennedResource(bufferIDs[i]);
+            }
+            break;
+        }
+
+        case EntryPoint::GLDeleteProgramPipelines:
+        case EntryPoint::GLDeleteProgramPipelinesEXT:
+        {
+            GLsizei count = call.params.getParam("n", ParamType::TGLsizei, 0).value.GLsizeiVal;
+            const gl::ProgramPipelineID *pipelineIDs =
+                call.params
+                    .getParam("pipelinesPacked", ParamType::TProgramPipelineIDConstPointer, 1)
+                    .value.ProgramPipelineIDPointerVal;
+            for (GLsizei i = 0; i < count; i++)
+            {
+                handleDeletedResource(pipelineIDs[i]);
+            }
+            break;
+        }
+
+        case EntryPoint::GLGenProgramPipelines:
+        case EntryPoint::GLGenProgramPipelinesEXT:
+        {
+            GLsizei count = call.params.getParam("n", ParamType::TGLsizei, 0).value.GLsizeiVal;
+            const gl::ProgramPipelineID *pipelineIDs =
+                call.params.getParam("pipelinesPacked", ParamType::TProgramPipelineIDPointer, 1)
+                    .value.ProgramPipelineIDPointerVal;
+            for (GLsizei i = 0; i < count; i++)
+            {
+                handleGennedResource(pipelineIDs[i]);
             }
             break;
         }
@@ -4484,11 +4958,10 @@
             GLsync sync = call.params.getParam("sync", ParamType::TGLsync, 0).value.GLsyncVal;
             FrameCaptureShared *frameCaptureShared =
                 context->getShareGroup()->getFrameCaptureShared();
-            ResourceTracker &resourceTracker = context->getFrameCaptureSharedResourceTracker();
             // If we're capturing, track which fence sync has been deleted
             if (frameCaptureShared->isCaptureActive())
             {
-                resourceTracker.setDeletedFenceSync(sync);
+                mResourceTracker.setDeletedFenceSync(sync);
             }
             break;
         }
@@ -4541,39 +5014,26 @@
             ASSERT(program);
             const gl::Shader *shader = program->getAttachedShader(shaderType);
             ASSERT(shader);
-            FrameCaptureShared *frameCaptureShared =
-                context->getShareGroup()->getFrameCaptureShared();
-            frameCaptureShared->setShaderSource(shader->getHandle(), shader->getSourceString());
-            frameCaptureShared->setProgramSources(programID, GetAttachedProgramSources(program));
-
-            if (isCaptureActive())
-            {
-                mResourceTracker.setCreatedProgram(programID);
-            }
+            setShaderSource(shader->getHandle(), shader->getSourceString());
+            setProgramSources(programID, GetAttachedProgramSources(program));
+            handleGennedResource(programID);
             break;
         }
 
         case EntryPoint::GLCreateProgram:
         {
             // If we're capturing, track which programs have been created
-            if (isCaptureActive())
-            {
-                gl::ShaderProgramID programID = {call.params.getReturnValue().value.GLuintVal};
-                mResourceTracker.setCreatedProgram(programID);
-            }
+            gl::ShaderProgramID programID = {call.params.getReturnValue().value.GLuintVal};
+            handleGennedResource(programID);
             break;
         }
 
         case EntryPoint::GLDeleteProgram:
         {
             // If we're capturing, track which programs have been deleted
-            if (isCaptureActive())
-            {
-                const ParamCapture &param =
-                    call.params.getParam("programPacked", ParamType::TShaderProgramID, 0);
-
-                mResourceTracker.setDeletedProgram(param.value.ShaderProgramIDVal);
-            }
+            const ParamCapture &param =
+                call.params.getParam("programPacked", ParamType::TShaderProgramID, 0);
+            handleDeletedResource(param.value.ShaderProgramIDVal);
             break;
         }
 
@@ -4584,8 +5044,11 @@
                 call.params.getParam("shaderPacked", ParamType::TShaderProgramID, 0)
                     .value.ShaderProgramIDVal;
             const gl::Shader *shader = context->getShader(shaderID);
-            context->getShareGroup()->getFrameCaptureShared()->setShaderSource(
-                shaderID, shader->getSourceString());
+            // Shaders compiled for ProgramBinary will not have a shader created
+            if (shader)
+            {
+                setShaderSource(shaderID, shader->getSourceString());
+            }
             break;
         }
 
@@ -4596,8 +5059,11 @@
                 call.params.getParam("programPacked", ParamType::TShaderProgramID, 0)
                     .value.ShaderProgramIDVal;
             const gl::Program *program = context->getProgramResolveLink(programID);
-            context->getShareGroup()->getFrameCaptureShared()->setProgramSources(
-                programID, GetAttachedProgramSources(program));
+            // Programs linked in support of ProgramBinary will not have attached shaders
+            if (program->getState().hasAttachedShader())
+            {
+                setProgramSources(programID, GetAttachedProgramSources(program));
+            }
             break;
         }
 
@@ -4644,8 +5110,10 @@
             for (int32_t i = 0; i < n; ++i)
             {
                 // Look it up in the cache, and delete it if found
-                context->getShareGroup()->getFrameCaptureShared()->deleteCachedTextureLevelData(
-                    textureIDs[i]);
+                deleteCachedTextureLevelData(textureIDs[i]);
+
+                // If we're capturing, track what textures have been deleted
+                handleDeletedResource(textureIDs[i]);
             }
             break;
         }
@@ -4709,12 +5177,11 @@
             captureMappedBufferSnapshot(context, call);
 
             // Track that the buffer was unmapped, for use during state reset
-            ResourceTracker &resourceTracker = context->getFrameCaptureSharedResourceTracker();
             gl::BufferBinding target =
                 call.params.getParam("targetPacked", ParamType::TBufferBinding, 0)
                     .value.BufferBindingVal;
             gl::Buffer *buffer = context->getState().getTargetBuffer(target);
-            resourceTracker.setBufferUnmapped(buffer->id());
+            mResourceTracker.setBufferUnmapped(buffer->id().value);
             break;
         }
 
@@ -4728,8 +5195,8 @@
             gl::Buffer *buffer = context->getState().getTargetBuffer(target);
 
             // Track that this buffer's contents have been modified
-            ResourceTracker &resourceTracker = context->getFrameCaptureSharedResourceTracker();
-            resourceTracker.setBufferModified(buffer->id());
+            mResourceTracker.getTrackedResource(ResourceIDType::Buffer)
+                .setModifiedResource(buffer->id().value);
 
             // BufferData is equivalent to UnmapBuffer, for what we're tracking.
             // From the ES 3.1 spec in BufferData section:
@@ -4738,7 +5205,7 @@
             //     6.3.1) is executed in each such context prior to deleting the existing data
             //     store.
             // Track that the buffer was unmapped, for use during state reset
-            resourceTracker.setBufferUnmapped(buffer->id());
+            mResourceTracker.setBufferUnmapped(buffer->id().value);
 
             break;
         }
@@ -4746,40 +5213,126 @@
             break;
     }
 
+    if (IsTextureUpdate(call))
+    {
+        // If this call modified texture contents, track it for possible reset
+        trackTextureUpdate(context, call);
+    }
+
     updateReadBufferSize(call.params.getReadBufferSize());
 
     gl::ShaderProgramID shaderProgramID;
     if (FindShaderProgramIDInCall(call, &shaderProgramID))
     {
-        ResourceTracker &resourceTracker = context->getFrameCaptureSharedResourceTracker();
-        resourceTracker.onShaderProgramAccess(shaderProgramID);
+        mResourceTracker.onShaderProgramAccess(shaderProgramID);
+    }
+
+    updatePreCallResourceCounts(call);
+}
+
+void FrameCaptureShared::updatePreCallResourceCounts(const CallCapture &call)
+{
+    for (const ParamCapture &param : call.params.getParamCaptures())
+    {
+        ResourceIDType idType = GetResourceIDTypeFromParamType(param.type);
+        if (idType != ResourceIDType::InvalidEnum)
+        {
+            mHasResourceType.set(idType);
+
+            // Capture resource IDs for non-pointer types.
+            if (strcmp(ParamTypeToString(param.type), "GLuint") == 0)
+            {
+                mMaxAccessedResourceIDs[idType] =
+                    std::max(mMaxAccessedResourceIDs[idType], param.value.GLuintVal);
+            }
+            // Capture resource IDs for pointer types.
+            if (strstr(ParamTypeToString(param.type), "GLuint *") != nullptr)
+            {
+                if (param.data.size() == 1u)
+                {
+                    const GLuint *dataPtr = reinterpret_cast<const GLuint *>(param.data[0].data());
+                    size_t numHandles     = param.data[0].size() / sizeof(GLuint);
+                    for (size_t handleIndex = 0; handleIndex < numHandles; ++handleIndex)
+                    {
+                        mMaxAccessedResourceIDs[idType] =
+                            std::max(mMaxAccessedResourceIDs[idType], dataPtr[handleIndex]);
+                    }
+                }
+            }
+        }
     }
 }
 
 void FrameCaptureShared::captureCall(const gl::Context *context,
-                                     CallCapture &&call,
+                                     CallCapture &&inCall,
                                      bool isCallValid)
 {
-    if (SkipCall(call.entryPoint))
+    if (SkipCall(inCall.entryPoint))
     {
         return;
     }
 
-    maybeOverrideEntryPoint(context, call);
-
-    maybeCapturePreCallUpdates(context, call);
-
     if (isCallValid)
     {
-        mFrameCalls.emplace_back(std::move(call));
+        // If the context ID has changed, then we need to inject an eglMakeCurrent() call. Only do
+        // this if there is more than 1 context in the share group to avoid unnecessary
+        // eglMakeCurrent() calls.
+        size_t contextCount = context->getShareGroup()->getShareGroupContextCount();
+        if (contextCount > 1 && mLastContextId != context->id())
+        {
+            // Inject the eglMakeCurrent() call.
+            // The EGLDisplay and EGLSurface values can't be known here, since we may not even be
+            // running the trace with ANGLE.
+            // The EGLContext value is actually the context ID, so we can look it up in
+            // 'gContextMap'.
+            // Need to go from uint32 -> uint64 -> EGLContext (void*) to handle MSVC compiler
+            // warning on 64b systems:
+            //   error C4312: 'reinterpret_cast': conversion from 'uint32_t' to 'EGLContext' of
+            //   greater size
+            uint64_t contextID    = static_cast<uint64_t>(context->id().value);
+            EGLContext eglContext = reinterpret_cast<EGLContext>(contextID);
+            CallCapture makeCurrentCall =
+                CaptureMakeCurrent(EGL_NO_DISPLAY, EGL_NO_SURFACE, EGL_NO_SURFACE, eglContext);
+            mFrameCalls.emplace_back(std::move(makeCurrentCall));
+            mLastContextId = context->id();
+        }
+
+        std::vector<CallCapture> outCalls;
+        maybeOverrideEntryPoint(context, inCall, outCalls);
+
+        // Need to loop on any new calls we added during override
+        for (CallCapture &call : outCalls)
+        {
+            maybeCapturePreCallUpdates(context, call);
+            mFrameCalls.emplace_back(std::move(call));
+            maybeCapturePostCallUpdates(context);
+        }
+
+        // Evaluate the validation expression to determine if we insert a validation checkpoint.
+        // This lets the user pick a subset of calls to check instead of checking every call.
+        if (mValidateSerializedState && !mValidationExpression.empty())
+        {
+            // Example substitution for frame #2, call #110:
+            // Before: (call == 2) && (frame >= 100) && (frame <= 120) && ((frame % 10) == 0)
+            // After:  (2 == 2) && (110 >= 100) && (110 <= 120) && ((110 % 10) == 0)
+            // Evaluates to 1.0.
+            std::string expression = mValidationExpression;
+
+            angle::ReplaceAllSubstrings(&expression, "frame", std::to_string(mFrameIndex));
+            angle::ReplaceAllSubstrings(&expression, "call", std::to_string(mFrameCalls.size()));
+
+            double result = ceval_result(expression);
+            if (result > 0)
+            {
+                CaptureValidateSerializedState(context, &mFrameCalls);
+            }
+        }
     }
     else
     {
         INFO() << "FrameCapture: Not capturing invalid call to "
-               << GetEntryPointName(call.entryPoint);
+               << GetEntryPointName(inCall.entryPoint);
     }
-
-    maybeCapturePostCallUpdates(context);
 }
 
 void FrameCaptureShared::maybeCapturePostCallUpdates(const gl::Context *context)
@@ -4787,7 +5340,7 @@
     // Process resource ID updates.
     MaybeCaptureUpdateResourceIDs(&mFrameCalls);
 
-    const CallCapture &lastCall = mFrameCalls.back();
+    CallCapture &lastCall = mFrameCalls.back();
     switch (lastCall.entryPoint)
     {
         case EntryPoint::GLCreateShaderProgramv:
@@ -4819,6 +5372,19 @@
             CaptureDeleteUniformLocations(param.value.ShaderProgramIDVal, &mFrameCalls);
             break;
         }
+        case EntryPoint::GLShaderSource:
+        {
+            lastCall.params.setValueParamAtIndex("count", ParamType::TGLsizei, 1, 1);
+
+            ParamCapture &paramLength =
+                lastCall.params.getParam("length", ParamType::TGLintConstPointer, 3);
+            paramLength.data.resize(1);
+            // Set the length parameter to {-1} to signal that the actual string length
+            // is to be used. Since we store the parameter blob as an array of four uint8_t
+            // values, we have to pass the binary equivalent of -1.
+            paramLength.data[0] = {0xff, 0xff, 0xff, 0xff};
+            break;
+        }
         default:
             break;
     }
@@ -4876,8 +5442,8 @@
 void FrameCaptureShared::captureMappedBufferSnapshot(const gl::Context *context,
                                                      const CallCapture &call)
 {
-    // If the buffer was mapped writable, we need to restore its data, since we have no visibility
-    // into what the client did to the buffer while mapped
+    // If the buffer was mapped writable, we need to restore its data, since we have no
+    // visibility into what the client did to the buffer while mapped.
     // This sequence will result in replay calls like this:
     //   ...
     //   gMappedBufferData[gBufferMap[42]] = glMapBufferRange(GL_PIXEL_UNPACK_BUFFER, 0, 65536,
@@ -4928,7 +5494,7 @@
     dataParamBuffer.addValueParam<GLsizeiptr>("size", ParamType::TGLsizeiptr, length);
 
     // Call the helper that populates the buffer with captured data
-    mFrameCalls.emplace_back("UpdateClientBufferData", std::move(dataParamBuffer));
+    mFrameCalls.emplace_back("UpdateClientBufferData2", std::move(dataParamBuffer));
 
     // Unmap the buffer and move on
     GLboolean dontCare;
@@ -4957,11 +5523,11 @@
     uint32_t captureTrigger = atoi(captureTriggerStr.c_str());
     if (captureTrigger != mCaptureTrigger)
     {
-        // Start mid-execution capture for the next frame
+        // Start mid-execution capture for the current frame
         mCaptureStartFrame = mFrameIndex + 1;
 
         // Use the original trigger value as the frame count
-        mCaptureEndFrame = mCaptureStartFrame + (mCaptureTrigger - 1);
+        mCaptureEndFrame = mCaptureStartFrame + mCaptureTrigger - 1;
 
         INFO() << "Capture triggered after frame " << mFrameIndex << " for " << mCaptureTrigger
                << " frames";
@@ -4971,42 +5537,51 @@
     }
 }
 
-void FrameCaptureShared::setupSharedAndAuxReplay(const gl::Context *context,
-                                                 bool isMidExecutionCapture)
+void FrameCaptureShared::runMidExecutionCapture(const gl::Context *mainContext)
 {
     // Make sure all pending work for every Context in the share group has completed so all data
     // (buffers, textures, etc.) has been updated and no resources are in use.
-    egl::ShareGroup *shareGroup            = context->getShareGroup();
-    const egl::ContextSet *shareContextSet = shareGroup->getContexts();
-    for (gl::Context *shareContext : *shareContextSet)
-    {
-        shareContext->finish();
-    }
+    egl::ShareGroup *shareGroup = mainContext->getShareGroup();
+    shareGroup->finishAllContexts();
 
-    clearSetupCalls();
-    if (isMidExecutionCapture)
-    {
-        CaptureSharedContextMidExecutionSetup(context, &mSetupCalls, &mResourceTracker);
-    }
+    const gl::State &contextState = mainContext->getState();
+    gl::State mainContextReplayState(nullptr, nullptr, nullptr, nullptr, nullptr, EGL_OPENGL_ES_API,
+                                     contextState.getClientVersion(), false, true, true, true,
+                                     false, EGL_CONTEXT_PRIORITY_MEDIUM_IMG,
+                                     contextState.hasProtectedContent());
+    mainContextReplayState.initializeForCapture(mainContext);
 
-    WriteSharedContextCppReplay(mCompression, mOutDirectory, mCaptureLabel, 1, 1, mSetupCalls,
-                                &mResourceTracker, &mBinaryData, mSerializeStateEnabled, *this);
+    std::vector<CallCapture> shareGroupSetupCalls;
+    CaptureShareGroupMidExecutionSetup(mainContext, &shareGroupSetupCalls, &mResourceTracker,
+                                       mainContextReplayState);
 
-    for (const gl::Context *shareContext : *shareContextSet)
+    WriteShareGroupCppSetupReplay(mCompression, mOutDirectory, mCaptureLabel, 1, 1,
+                                  shareGroupSetupCalls, &mResourceTracker, &mBinaryData,
+                                  mSerializeStateEnabled, *this);
+
+    for (const gl::Context *shareContext : shareGroup->getContexts())
     {
         FrameCapture *frameCapture = shareContext->getFrameCapture();
-        frameCapture->clearSetupCalls();
+        ASSERT(frameCapture->getSetupCalls().empty());
 
-        if (isMidExecutionCapture)
+        if (shareContext->id() == mainContext->id())
         {
             CaptureMidExecutionSetup(shareContext, &frameCapture->getSetupCalls(),
-                                     &mResourceTracker);
+                                     &mResourceTracker, mainContextReplayState,
+                                     mValidateSerializedState);
         }
-
-        if (!frameCapture->getSetupCalls().empty() && shareContext->id() != context->id())
+        else
         {
-            // The presentation context's setup functions will be written later as part of the
-            // WriteWindowSurfaceContextCppReplay() output.
+            gl::State auxContextReplayState(
+                nullptr, nullptr, nullptr, nullptr, nullptr, EGL_OPENGL_ES_API,
+                shareContext->getState().getClientVersion(), false, true, true, true, false,
+                EGL_CONTEXT_PRIORITY_MEDIUM_IMG, shareContext->getState().hasProtectedContent());
+            auxContextReplayState.initializeForCapture(shareContext);
+
+            CaptureMidExecutionSetup(shareContext, &frameCapture->getSetupCalls(),
+                                     &mResourceTracker, auxContextReplayState,
+                                     mValidateSerializedState);
+
             WriteAuxiliaryContextCppSetupReplay(mCompression, mOutDirectory, shareContext,
                                                 mCaptureLabel, 1, frameCapture->getSetupCalls(),
                                                 &mBinaryData, mSerializeStateEnabled, *this);
@@ -5038,65 +5613,48 @@
         }
     }
 
+    // Assume that the context performing the swap is the "main" context.
+    ASSERT(mWindowSurfaceContextID.value == 0 || mWindowSurfaceContextID == context->id());
+    mWindowSurfaceContextID = context->id();
+
     // On Android, we can trigger a capture during the run
     checkForCaptureTrigger();
-    // Done after checkForCaptureTrigger(), since that can modify mCaptureStartFrame.
-    if (mFrameIndex >= mCaptureStartFrame)
-    {
-        setCaptureActive();
-        // Assume that the context performing the swap is the "main" context.
-        mWindowSurfaceContextID = context->id();
-    }
-    else
-    {
-        reset();
-        mFrameIndex++;
 
-        // When performing a mid-execution capture, setup the replay before capturing calls for the
-        // first frame.
-        if (mFrameIndex == mCaptureStartFrame)
+    // Check for MEC. Done after checkForCaptureTrigger(), since that can modify mCaptureStartFrame.
+    if (mFrameIndex < mCaptureStartFrame)
+    {
+        if (mFrameIndex == mCaptureStartFrame - 1)
         {
-            setupSharedAndAuxReplay(context, true);
-        }
+            runMidExecutionCapture(context);
 
-        // Not capturing yet, so return.
+            // Set the capture active to ensure all GLES commands issued by the next frame are
+            // handled correctly by maybeCapturePreCallUpdates() and maybeCapturePostCallUpdates().
+            setCaptureActive();
+        }
+        mFrameIndex++;
+        reset();
         return;
     }
 
-    if (mIsFirstFrame)
-    {
-        mCaptureStartFrame = mFrameIndex;
-
-        // When *not* performing a mid-execution capture, setup the replay with the first frame.
-        if (mCaptureStartFrame == 1)
-        {
-            setupSharedAndAuxReplay(context, false);
-        }
-    }
+    ASSERT(isCaptureActive());
 
     if (!mFrameCalls.empty())
     {
         mActiveFrameIndices.push_back(getReplayFrameIndex());
     }
 
-    // Note that we currently capture before the start frame to collect shader and program sources.
-    // For simplicity, it's currently a requirement that the same context is used to perform the
-    // swap every frame.
-    ASSERT(mWindowSurfaceContextID == context->id());
-
     // Make sure all pending work for every Context in the share group has completed so all data
     // (buffers, textures, etc.) has been updated and no resources are in use.
-    egl::ShareGroup *shareGroup            = context->getShareGroup();
-    const egl::ContextSet *shareContextSet = shareGroup->getContexts();
-    for (gl::Context *shareContext : *shareContextSet)
+    egl::ShareGroup *shareGroup = context->getShareGroup();
+    shareGroup->finishAllContexts();
+
+    // Only validate the first frame for now to save on retracing time.
+    if (mValidateSerializedState && mFrameIndex == mCaptureStartFrame)
     {
-        shareContext->finish();
+        CaptureValidateSerializedState(context, &mFrameCalls);
     }
 
-    WriteWindowSurfaceContextCppReplay(mCompression, mOutDirectory, context, mCaptureLabel,
-                                       getReplayFrameIndex(), getFrameCount(), mFrameCalls,
-                                       frameCapture->getSetupCalls(), &mResourceTracker,
-                                       &mBinaryData, mSerializeStateEnabled, *this);
+    writeMainContextCppReplay(context, frameCapture->getSetupCalls());
 
     if (mFrameIndex == mCaptureEndFrame)
     {
@@ -5109,7 +5667,6 @@
 
     reset();
     mFrameIndex++;
-    mIsFirstFrame = false;
 }
 
 void FrameCaptureShared::onDestroyContext(const gl::Context *context)
@@ -5122,7 +5679,7 @@
     {
         // If context is destroyed before end frame is reached and at least
         // 1 frame has been recorded, then write the index files.
-        // It doesnt make sense to write the index files when no frame has been recorded
+        // It doesn't make sense to write the index files when no frame has been recorded
         mFrameIndex -= 1;
         mCaptureEndFrame = mFrameIndex;
         writeCppReplayIndexFiles(context, true);
@@ -5139,9 +5696,10 @@
         return;
     }
 
-    // Track the width and height of the draw surface as provided to makeCurrent
-    mDrawSurfaceDimensions[context->id()] =
-        gl::Extents(drawSurface->getWidth(), drawSurface->getHeight(), 1);
+    // Track the width, height and color space of the draw surface as provided to makeCurrent
+    SurfaceParams &params = mDrawSurfaceParams[context->id()];
+    params.extents        = gl::Extents(drawSurface->getWidth(), drawSurface->getHeight(), 1);
+    params.colorSpace     = egl::FromEGLenum<egl::ColorSpace>(drawSurface->getGLColorspace());
 }
 
 DataCounters::DataCounters() = default;
@@ -5181,38 +5739,14 @@
     mStringCounterMap[strings] = counter;
 }
 
+TrackedResource::TrackedResource() = default;
+
+TrackedResource::~TrackedResource() = default;
+
 ResourceTracker::ResourceTracker() = default;
 
 ResourceTracker::~ResourceTracker() = default;
 
-void ResourceTracker::setDeletedBuffer(gl::BufferID id)
-{
-    if (id.value == 0)
-    {
-        // Ignore buffer ID 0
-        return;
-    }
-
-    if (mNewBuffers.find(id) != mNewBuffers.end())
-    {
-        // This is a buffer genned after MEC was initialized, just clear it, since there will be no
-        // actions required for it to return to starting state.
-        mNewBuffers.erase(id);
-        return;
-    }
-
-    if (mStartingBuffers.find(id) != mStartingBuffers.end())
-    {
-        // The app is deleting a buffer we started with, we need to regen on loop
-        mBuffersToRegen.insert(id);
-        mBuffersToRestore.insert(id);
-    }
-
-    // If none of the above is true, the app is deleting a buffer that was never genned.
-    // This is allowed by the spec for DeleteBuffers:
-    //    Unused names in buffers are silently ignored, as is the value zero.
-}
-
 void ResourceTracker::setDeletedFenceSync(GLsync sync)
 {
     ASSERT(sync != nullptr);
@@ -5226,79 +5760,91 @@
     mFenceSyncsToRegen.insert(sync);
 }
 
-void ResourceTracker::setCreatedProgram(gl::ShaderProgramID id)
+void TrackedResource::setGennedResource(GLuint id)
 {
-    if (mStartingPrograms.find(id) == mStartingPrograms.end())
+    if (mStartingResources.find(id) == mStartingResources.end())
     {
-        // This is a program created after MEC was initialized, track it
-        mNewPrograms.insert(id);
+        // This is a resource created after MEC was initialized, track it
+        mNewResources.insert(id);
         return;
     }
 }
 
-void ResourceTracker::setDeletedProgram(gl::ShaderProgramID id)
+void TrackedResource::setDeletedResource(GLuint id)
 {
-    if (id.value == 0)
+    if (id == 0)
     {
-        // Ignore program ID 0
+        // Ignore ID 0
         return;
     }
 
-    if (mNewPrograms.find(id) != mNewPrograms.end())
+    if (mNewResources.find(id) != mNewResources.end())
     {
-        // This is a program created after MEC was initialized, just clear it, since there will be
+        // This is a resource created after MEC was initialized, just clear it, since there will be
         // no actions required for it to return to starting state.
-        mNewPrograms.erase(id);
+        mNewResources.erase(id);
         return;
     }
 
-    // Ensure this program was in our starting set
-    // It's possible this could fire if the app deletes programs that were never generated
-    ASSERT(mStartingPrograms.empty() || (mStartingPrograms.find(id) != mStartingPrograms.end()));
+    if (mStartingResources.find(id) != mStartingResources.end())
+    {
+        // In this case, the app is deleting a resource we started with, we need to regen on loop
+        mResourcesToRegen.insert(id);
 
-    // In this case, the app is deleting a program we started with, we need to regen on loop
-    mProgramsToRegen.insert(id);
+        // Also restore its contents
+        mResourcesToRestore.insert(id);
+    }
+
+    // If none of the above is true, the app is deleting a resource that was never genned.
 }
 
-void ResourceTracker::setGennedBuffer(gl::BufferID id)
+void TrackedResource::setModifiedResource(GLuint id)
 {
-    if (mStartingBuffers.find(id) == mStartingBuffers.end())
+    // If this was a starting resource, we need to track it for restore
+    if (mStartingResources.find(id) != mStartingResources.end())
     {
-        // This is a buffer genned after MEC was initialized, track it
-        mNewBuffers.insert(id);
-        return;
+        mResourcesToRestore.insert(id);
     }
 }
 
-void ResourceTracker::setBufferModified(gl::BufferID id)
-{
-    // If this was a starting buffer, we need to track it for restore
-    if (mStartingBuffers.find(id) != mStartingBuffers.end())
-    {
-        mBuffersToRestore.insert(id);
-    }
-}
-
-void ResourceTracker::setBufferMapped(gl::BufferID id)
+void ResourceTracker::setBufferMapped(GLuint id)
 {
     // If this was a starting buffer, we may need to restore it to original state during Reset
-    if (mStartingBuffers.find(id) != mStartingBuffers.end())
+    TrackedResource &trackedBuffers = getTrackedResource(ResourceIDType::Buffer);
+    if (trackedBuffers.getStartingResources().find(id) !=
+        trackedBuffers.getStartingResources().end())
     {
         // Track that its current state is mapped (true)
         mStartingBuffersMappedCurrent[id] = true;
     }
 }
 
-void ResourceTracker::setBufferUnmapped(gl::BufferID id)
+void ResourceTracker::setBufferUnmapped(GLuint id)
 {
     // If this was a starting buffer, we may need to restore it to original state during Reset
-    if (mStartingBuffers.find(id) != mStartingBuffers.end())
+    TrackedResource &trackedBuffers = getTrackedResource(ResourceIDType::Buffer);
+    if (trackedBuffers.getStartingResources().find(id) !=
+        trackedBuffers.getStartingResources().end())
     {
         // Track that its current state is unmapped (false)
         mStartingBuffersMappedCurrent[id] = false;
     }
 }
 
+bool ResourceTracker::getStartingBuffersMappedCurrent(GLuint id) const
+{
+    const auto &foundBool = mStartingBuffersMappedCurrent.find(id);
+    ASSERT(foundBool != mStartingBuffersMappedCurrent.end());
+    return foundBool->second;
+}
+
+bool ResourceTracker::getStartingBuffersMappedInitial(GLuint id) const
+{
+    const auto &foundBool = mStartingBuffersMappedInitial.find(id);
+    ASSERT(foundBool != mStartingBuffersMappedInitial.end());
+    return foundBool->second;
+}
+
 void ResourceTracker::onShaderProgramAccess(gl::ShaderProgramID shaderProgramID)
 {
     mMaxShaderPrograms = std::max(mMaxShaderPrograms, shaderProgramID.value + 1);
@@ -5360,12 +5906,74 @@
 void FrameCaptureShared::writeCppReplayIndexFiles(const gl::Context *context,
                                                   bool writeResetContextCall)
 {
-    const gl::ContextID contextId       = context->id();
-    const egl::Config *config           = context->getConfig();
-    const egl::AttributeMap &attributes = context->getDisplay()->getAttributeMap();
+    const gl::ContextID contextId           = context->id();
+    const egl::Config *config               = context->getConfig();
+    const egl::AttributeMap &displayAttribs = context->getDisplay()->getAttributeMap();
+    const egl::ShareGroup *shareGroup       = context->getShareGroup();
 
     unsigned frameCount = getFrameCount();
 
+    const SurfaceParams &surfaceParams = mDrawSurfaceParams.at(contextId);
+    const gl::State &glState           = context->getState();
+
+    // Serialize trace metadata into a JSON file. The JSON file will be named "trace_prefix.json".
+    //
+    // As of writing, it will have the format like so:
+    // {
+    //     "TraceMetadata":
+    //     {
+    //         "AreClientArraysEnabled" : 1, "CaptureRevision" : 16631, "ConfigAlphaBits" : 8,
+    //             "ConfigBlueBits" : 8, "ConfigDepthBits" : 24, "ConfigGreenBits" : 8,
+    // ... etc ...
+
+    JsonSerializer json;
+    json.startGroup("TraceMetadata");
+    json.addScalar("CaptureRevision", ANGLE_REVISION);
+    json.addScalar("ContextClientMajorVersion", context->getClientMajorVersion());
+    json.addScalar("ContextClientMinorVersion", context->getClientMinorVersion());
+    json.addScalar("DisplayPlatformType", displayAttribs.getAsInt(EGL_PLATFORM_ANGLE_TYPE_ANGLE));
+    json.addScalar("DisplayDeviceType",
+                   displayAttribs.getAsInt(EGL_PLATFORM_ANGLE_DEVICE_TYPE_ANGLE));
+    json.addScalar("FrameStart", 1);
+    json.addScalar("FrameEnd", frameCount);
+    json.addScalar("DrawSurfaceWidth", surfaceParams.extents.width);
+    json.addScalar("DrawSurfaceHeight", surfaceParams.extents.height);
+    json.addScalar("DrawSurfaceColorSpace", ToEGLenum(surfaceParams.colorSpace));
+    if (config)
+    {
+        json.addScalar("ConfigRedBits", config->redSize);
+        json.addScalar("ConfigGreenBits", config->greenSize);
+        json.addScalar("ConfigBlueBits", config->blueSize);
+        json.addScalar("ConfigAlphaBits", config->alphaSize);
+        json.addScalar("ConfigDepthBits", config->depthSize);
+        json.addScalar("ConfigStencilBits", config->stencilSize);
+    }
+    else
+    {
+        json.addScalar("ConfigRedBits", EGL_DONT_CARE);
+        json.addScalar("ConfigGreenBits", EGL_DONT_CARE);
+        json.addScalar("ConfigBlueBits", EGL_DONT_CARE);
+        json.addScalar("ConfigAlphaBits", EGL_DONT_CARE);
+        json.addScalar("ConfigDepthBits", EGL_DONT_CARE);
+        json.addScalar("ConfigStencilBits", EGL_DONT_CARE);
+    }
+    json.addBool("IsBinaryDataCompressed", mCompression);
+    json.addBool("AreClientArraysEnabled", glState.areClientArraysEnabled());
+    json.addBool("IsBindGeneratesResourcesEnabled", glState.isBindGeneratesResourceEnabled());
+    json.addBool("IsWebGLCompatibilityEnabled", glState.isWebGL());
+    json.addBool("IsRobustResourceInitEnabled", glState.isRobustResourceInitEnabled());
+    json.endGroup();
+
+    {
+        std::stringstream jsonFileNameStream;
+        jsonFileNameStream << mOutDirectory << FmtCapturePrefix(kNoContextId, mCaptureLabel)
+                           << ".json";
+        std::string jsonFileName = jsonFileNameStream.str();
+
+        SaveFileHelper saveData(jsonFileName);
+        saveData.write(reinterpret_cast<const uint8_t *>(json.data()), json.length());
+    }
+
     std::stringstream header;
     std::stringstream source;
 
@@ -5380,54 +5988,6 @@
         header << "namespace " << mCaptureLabel << "\n";
         header << "{\n";
     }
-    header << "// Begin Trace Metadata\n";
-    header << "#define ANGLE_REPLAY_VERSION";
-    if (!mCaptureLabel.empty())
-    {
-        std::string captureLabelUpper = mCaptureLabel;
-        angle::ToUpper(&captureLabelUpper);
-        header << "_" << captureLabelUpper;
-    }
-    header << " " << ANGLE_REVISION << "\n";
-    header << "constexpr uint32_t kReplayContextClientMajorVersion = "
-           << context->getClientMajorVersion() << ";\n";
-    header << "constexpr uint32_t kReplayContextClientMinorVersion = "
-           << context->getClientMinorVersion() << ";\n";
-    header << "constexpr EGLint kReplayPlatformType = "
-           << attributes.getAsInt(EGL_PLATFORM_ANGLE_TYPE_ANGLE) << ";\n";
-    header << "constexpr EGLint kReplayDeviceType = "
-           << attributes.getAsInt(EGL_PLATFORM_ANGLE_DEVICE_TYPE_ANGLE) << ";\n";
-    header << "constexpr uint32_t kReplayFrameStart = 1;\n";
-    header << "constexpr uint32_t kReplayFrameEnd = " << frameCount << ";\n";
-    header << "constexpr EGLint kReplayDrawSurfaceWidth = "
-           << mDrawSurfaceDimensions.at(contextId).width << ";\n";
-    header << "constexpr EGLint kReplayDrawSurfaceHeight = "
-           << mDrawSurfaceDimensions.at(contextId).height << ";\n";
-    header << "constexpr EGLint kDefaultFramebufferRedBits = "
-           << (config ? std::to_string(config->redSize) : "EGL_DONT_CARE") << ";\n";
-    header << "constexpr EGLint kDefaultFramebufferGreenBits = "
-           << (config ? std::to_string(config->greenSize) : "EGL_DONT_CARE") << ";\n";
-    header << "constexpr EGLint kDefaultFramebufferBlueBits = "
-           << (config ? std::to_string(config->blueSize) : "EGL_DONT_CARE") << ";\n";
-    header << "constexpr EGLint kDefaultFramebufferAlphaBits = "
-           << (config ? std::to_string(config->alphaSize) : "EGL_DONT_CARE") << ";\n";
-    header << "constexpr EGLint kDefaultFramebufferDepthBits = "
-           << (config ? std::to_string(config->depthSize) : "EGL_DONT_CARE") << ";\n";
-    header << "constexpr EGLint kDefaultFramebufferStencilBits = "
-           << (config ? std::to_string(config->stencilSize) : "EGL_DONT_CARE") << ";\n";
-    header << "constexpr bool kIsBinaryDataCompressed = " << (mCompression ? "true" : "false")
-           << ";\n";
-    header << "constexpr bool kAreClientArraysEnabled = "
-           << (context->getState().areClientArraysEnabled() ? "true" : "false") << ";\n";
-    header << "constexpr bool kbindGeneratesResources = "
-           << (context->getState().isBindGeneratesResourceEnabled() ? "true" : "false") << ";\n";
-    header << "constexpr bool kWebGLCompatibility = "
-           << (context->getState().getExtensions().webglCompatibility ? "true" : "false") << ";\n";
-    header << "constexpr bool kRobustResourceInit = "
-           << (context->getState().isRobustResourceInitEnabled() ? "true" : "false") << ";\n";
-
-    header << "// End Trace Metadata\n";
-    header << "\n";
     for (uint32_t frameIndex = 1; frameIndex <= frameCount; ++frameIndex)
     {
         header << "void " << FmtReplayFunction(contextId, frameIndex) << ";\n";
@@ -5444,6 +6004,15 @@
     }
 
     header << "void InitReplay();\n";
+    if (mCaptureStartFrame != 1)
+    {
+        header << "void SetupReplayContextShared();\n";
+    }
+
+    for (const gl::Context *shareContext : shareGroup->getContexts())
+    {
+        header << "void " << FmtSetupFunction(kNoPartId, shareContext->id()) << ";\n";
+    }
 
     source << "#include \"" << FmtCapturePrefix(contextId, mCaptureLabel) << ".h\"\n";
     source << "#include \"trace_fixture.h\"\n";
@@ -5459,7 +6028,8 @@
     source << "void " << mCaptureLabel << "::InitReplay()\n";
     source << "{\n";
     WriteInitReplayCall(mCompression, source, kSharedContextId, mCaptureLabel,
-                        MaxClientArraySize(mClientArraySizes), mReadBufferSize);
+                        MaxClientArraySize(mClientArraySizes), mReadBufferSize,
+                        mMaxAccessedResourceIDs);
     source << "}\n";
 
     source << "extern \"C\" {\n";
@@ -5502,7 +6072,7 @@
                    << FmtGetSerializedContextStateFunction(contextId, frameIndex) << ";\n";
         }
         source << "        default:\n";
-        source << "            return \"\";\n";
+        source << "            return nullptr;\n";
         source << "    }\n";
         source << "}\n";
         source << "\n";
@@ -5549,9 +6119,7 @@
             saveIndex << GetCaptureFileName(contextId, mCaptureLabel, frameIndex, ".cpp") << "\n";
         }
 
-        egl::ShareGroup *shareGroup      = context->getShareGroup();
-        egl::ContextSet *shareContextSet = shareGroup->getContexts();
-        for (gl::Context *shareContext : *shareContextSet)
+        for (gl::Context *shareContext : shareGroup->getContexts())
         {
             if (shareContext->id() == contextId)
             {
@@ -5560,7 +6128,190 @@
             }
             saveIndex << GetCaptureFileName(shareContext->id(), mCaptureLabel, 1, ".cpp") << "\n";
         }
-        saveIndex << GetCaptureFileName(kSharedContextId, mCaptureLabel, 1, ".cpp") << "\n";
+
+        // Only save the MEC setup if we are using MEC.
+        if (mCaptureStartFrame != 1)
+        {
+            saveIndex << GetCaptureFileName(kSharedContextId, mCaptureLabel, 1, ".cpp") << "\n";
+        }
+    }
+}
+
+void FrameCaptureShared::writeMainContextCppReplay(const gl::Context *context,
+                                                   const std::vector<CallCapture> &setupCalls)
+{
+    ASSERT(mWindowSurfaceContextID == context->id());
+
+    DataTracker dataTracker;
+
+    std::stringstream out;
+    std::stringstream header;
+
+    header << "#include \"" << FmtCapturePrefix(context->id(), mCaptureLabel) << ".h\"\n";
+    header << "#include \"angle_trace_gl.h\"\n";
+    header << "";
+    header << "\n";
+    header << "namespace\n";
+    header << "{\n";
+
+    uint32_t frameCount = getFrameCount();
+    uint32_t frameIndex = getReplayFrameIndex();
+
+    if (frameIndex == 1 || frameIndex == frameCount)
+    {
+        out << "extern \"C\" {\n";
+    }
+
+    if (frameIndex == 1)
+    {
+        std::stringstream setupCallStream;
+
+        setupCallStream << "void " << FmtSetupFunction(kNoPartId, context->id()) << "\n";
+        setupCallStream << "{\n";
+
+        WriteCppReplayFunctionWithParts(context->id(), ReplayFunc::Setup, &dataTracker, frameIndex,
+                                        &mBinaryData, setupCalls, header, setupCallStream, out);
+
+        out << setupCallStream.str();
+        out << "}\n";
+        out << "\n";
+        out << "void SetupReplay()\n";
+        out << "{\n";
+        out << "    EGLContext context = eglGetCurrentContext();\n";
+        out << "    gContextMap[" << context->id().value << "] = context;\n";
+        out << "\n";
+
+        // Setup all of the shared objects.
+        out << "    " << mCaptureLabel << "::InitReplay();\n";
+        if (usesMidExecutionCapture())
+        {
+            out << "    " << mCaptureLabel << "::" << FmtSetupFunction(kNoPartId, kSharedContextId)
+                << ";\n";
+        }
+
+        // Setup the presentation (this) context first.
+        out << "    " << FmtSetupFunction(kNoPartId, context->id()) << ";\n";
+        out << "\n";
+
+        // Setup each of the auxiliary contexts.
+        egl::ShareGroup *shareGroup            = context->getShareGroup();
+        const egl::ContextSet &shareContextSet = shareGroup->getContexts();
+        for (gl::Context *shareContext : shareContextSet)
+        {
+            // Skip the presentation context, since that context was created by the test framework.
+            if (shareContext->id() == context->id())
+            {
+                continue;
+            }
+
+            // TODO(http://www.anglebug.com/5878): Support capture/replay of eglCreateContext() so
+            // this block can be moved into SetupReplayContextXX() by injecting them into the
+            // beginning of the setup call stream.
+            out << "    EGLContext context" << shareContext->id()
+                << " = eglCreateContext(nullptr, nullptr, context, nullptr);\n";
+            out << "    gContextMap[" << shareContext->id().value << "] = context"
+                << shareContext->id() << ";\n";
+            // The SetupReplayContextXX() calls only exist if this is a mid-execution capture and
+            // we can only call them if they exist, so only output the calls if this is a MEC.
+            if (usesMidExecutionCapture())
+            {
+                out << "    " << mCaptureLabel
+                    << "::" << FmtSetupFunction(kNoPartId, shareContext->id()) << ";\n";
+            }
+        }
+
+        // If there are other contexts that were initialized, we need to make the main context
+        // current again.
+        if (shareContextSet.size() > 1)
+        {
+            out << "\n";
+            out << "    eglMakeCurrent(EGL_NO_DISPLAY, EGL_NO_SURFACE, EGL_NO_SURFACE, context);\n";
+        }
+
+        out << "}\n";
+        out << "\n";
+    }
+
+    if (frameIndex == frameCount)
+    {
+        // Emit code to reset back to starting state
+        out << "void " << FmtResetFunction() << "\n";
+        out << "{\n";
+
+        // TODO(http://anglebug.com/5878): Look at moving this into the shared context file since
+        // it's resetting shared objects.
+        std::stringstream restoreCallStream;
+        for (ResourceIDType resourceType : AllEnums<ResourceIDType>())
+        {
+            MaybeResetResources(restoreCallStream, resourceType, &dataTracker, header,
+                                &mResourceTracker, &mBinaryData);
+        }
+
+        // Reset opaque type objects that don't have IDs, so are not ResourceIDTypes.
+        MaybeResetOpaqueTypeObjects(restoreCallStream, &dataTracker, header, &mResourceTracker,
+                                    &mBinaryData);
+
+        out << restoreCallStream.str();
+        out << "}\n";
+    }
+
+    if (frameIndex == 1 || frameIndex == frameCount)
+    {
+        out << "}  // extern \"C\"\n";
+        out << "\n";
+    }
+
+    if (!mCaptureLabel.empty())
+    {
+        out << "namespace " << mCaptureLabel << "\n";
+        out << "{\n";
+    }
+
+    if (!mFrameCalls.empty())
+    {
+        std::stringstream callStream;
+
+        callStream << "void " << FmtReplayFunction(context->id(), frameIndex) << "\n";
+        callStream << "{\n";
+
+        WriteCppReplayFunctionWithParts(context->id(), ReplayFunc::Replay, &dataTracker, frameIndex,
+                                        &mBinaryData, mFrameCalls, header, callStream, out);
+
+        out << callStream.str();
+        out << "}\n";
+    }
+
+    if (mSerializeStateEnabled)
+    {
+        std::string serializedContextString;
+        if (SerializeContextToString(const_cast<gl::Context *>(context),
+                                     &serializedContextString) == Result::Continue)
+        {
+            out << "const char *" << FmtGetSerializedContextStateFunction(context->id(), frameIndex)
+                << "\n";
+            out << "{\n";
+            out << "    return R\"(" << serializedContextString << ")\";\n";
+            out << "}\n";
+            out << "\n";
+        }
+    }
+
+    if (!mCaptureLabel.empty())
+    {
+        out << "} // namespace " << mCaptureLabel << "\n";
+    }
+
+    header << "}  // namespace\n";
+
+    {
+        std::string outString    = out.str();
+        std::string headerString = header.str();
+
+        std::string cppFilePath =
+            GetCaptureFilePath(mOutDirectory, context->id(), mCaptureLabel, frameIndex, ".cpp");
+
+        SaveFileHelper saveCpp(cppFilePath);
+        saveCpp << headerString << "\n" << outString;
     }
 }
 
@@ -5604,12 +6355,22 @@
 {
     // Look up the data for the requested texture
     const auto &foundTextureLevels = mCachedTextureLevelData.find(id);
-    ASSERT(foundTextureLevels != mCachedTextureLevelData.end());
+    if (foundTextureLevels == mCachedTextureLevelData.end())
+    {
+        ERR() << "Cached texture level not found for id=" << id.value << " target=" << target
+              << " level=" << level;
+        UNREACHABLE();
+    }
 
     GLint adjustedLevel = GetAdjustedTextureCacheLevel(target, level);
 
     const auto &foundTextureLevel = foundTextureLevels->second.find(adjustedLevel);
-    ASSERT(foundTextureLevel != foundTextureLevels->second.end());
+    if (foundTextureLevel == foundTextureLevels->second.end())
+    {
+        ERR() << "Cached texture level not found for id=" << id.value << " target=" << target
+              << " level=" << level << " adjustedLevel=" << adjustedLevel;
+        UNREACHABLE();
+    }
     const std::vector<uint8_t> &capturedTextureLevel = foundTextureLevel->second;
 
     return capturedTextureLevel;
@@ -5841,14 +6602,22 @@
                           const GLint *length,
                           ParamCapture *paramCapture)
 {
+    // Concat the array elements of the string into one data vector,
+    // append the terminating zero and use this as the captured shader
+    // string. The string count and the length array are adjusted
+    // accordingly in the capture post-processing
+
+    std::vector<uint8_t> data;
+    size_t offset = 0;
     for (GLsizei index = 0; index < count; ++index)
     {
         size_t len = ((length && length[index] >= 0) ? length[index] : strlen(strings[index]));
-        // includes the '\0' suffix
-        std::vector<uint8_t> data(len + 1, 0);
-        memcpy(data.data(), strings[index], len);
-        paramCapture->data.emplace_back(std::move(data));
+        data.resize(offset + len);
+        std::copy(strings[index], strings[index] + len, data.begin() + offset);
+        offset += len;
     }
+    data.push_back(0);
+    paramCapture->data.emplace_back(std::move(data));
 }
 
 template <>
@@ -5870,6 +6639,22 @@
 }
 
 template <>
+void WriteParamValueReplay<ParamType::TGLbooleanPointer>(std::ostream &os,
+                                                         const CallCapture &call,
+                                                         GLboolean *value)
+{
+    if (value == 0)
+    {
+        os << "nullptr";
+    }
+    else
+    {
+        os << "reinterpret_cast<GLboolean *>("
+           << static_cast<int>(reinterpret_cast<uintptr_t>(value)) << ")";
+    }
+}
+
+template <>
 void WriteParamValueReplay<ParamType::TvoidConstPointer>(std::ostream &os,
                                                          const CallCapture &call,
                                                          const void *value)
@@ -5934,7 +6719,7 @@
                                                  const CallCapture &call,
                                                  gl::BufferID value)
 {
-    os << "gBufferMap[" << value.value << "]";
+    os << "gBufferMap2[" << value.value << "]";
 }
 
 template <>
@@ -5942,7 +6727,7 @@
                                                   const CallCapture &call,
                                                   gl::FenceNVID value)
 {
-    os << "gFenceNVMap[" << value.value << "]";
+    os << "gFenceNVMap2[" << value.value << "]";
 }
 
 template <>
@@ -5950,7 +6735,7 @@
                                                       const CallCapture &call,
                                                       gl::FramebufferID value)
 {
-    os << "gFramebufferMap[" << value.value << "]";
+    os << "gFramebufferMap2[" << value.value << "]";
 }
 
 template <>
@@ -5958,7 +6743,7 @@
                                                        const CallCapture &call,
                                                        gl::MemoryObjectID value)
 {
-    os << "gMemoryObjectMap[" << value.value << "]";
+    os << "gMemoryObjectMap2[" << value.value << "]";
 }
 
 template <>
@@ -5966,7 +6751,7 @@
                                                           const CallCapture &call,
                                                           gl::ProgramPipelineID value)
 {
-    os << "gProgramPipelineMap[" << value.value << "]";
+    os << "gProgramPipelineMap2[" << value.value << "]";
 }
 
 template <>
@@ -5974,7 +6759,7 @@
                                                 const CallCapture &call,
                                                 gl::QueryID value)
 {
-    os << "gQueryMap[" << value.value << "]";
+    os << "gQueryMap2[" << value.value << "]";
 }
 
 template <>
@@ -5982,7 +6767,7 @@
                                                        const CallCapture &call,
                                                        gl::RenderbufferID value)
 {
-    os << "gRenderbufferMap[" << value.value << "]";
+    os << "gRenderbufferMap2[" << value.value << "]";
 }
 
 template <>
@@ -5990,7 +6775,7 @@
                                                   const CallCapture &call,
                                                   gl::SamplerID value)
 {
-    os << "gSamplerMap[" << value.value << "]";
+    os << "gSamplerMap2[" << value.value << "]";
 }
 
 template <>
@@ -5998,7 +6783,7 @@
                                                     const CallCapture &call,
                                                     gl::SemaphoreID value)
 {
-    os << "gSemaphoreMap[" << value.value << "]";
+    os << "gSemaphoreMap2[" << value.value << "]";
 }
 
 template <>
@@ -6006,7 +6791,7 @@
                                                         const CallCapture &call,
                                                         gl::ShaderProgramID value)
 {
-    os << "gShaderProgramMap[" << value.value << "]";
+    os << "gShaderProgramMap2[" << value.value << "]";
 }
 
 template <>
@@ -6022,7 +6807,7 @@
                                                   const CallCapture &call,
                                                   gl::TextureID value)
 {
-    os << "gTextureMap[" << value.value << "]";
+    os << "gTextureMap2[" << value.value << "]";
 }
 
 template <>
@@ -6030,7 +6815,7 @@
                                                             const CallCapture &call,
                                                             gl::TransformFeedbackID value)
 {
-    os << "gTransformFeedbackMap[" << value.value << "]";
+    os << "gTransformFeedbackMap2[" << value.value << "]";
 }
 
 template <>
@@ -6038,7 +6823,7 @@
                                                       const CallCapture &call,
                                                       gl::VertexArrayID value)
 {
-    os << "gVertexArrayMap[" << value.value << "]";
+    os << "gVertexArrayMap2[" << value.value << "]";
 }
 
 template <>
@@ -6052,13 +6837,13 @@
         return;
     }
 
-    os << "gUniformLocations[";
+    os << "gUniformLocations2[";
 
     // Find the program from the call parameters.
     gl::ShaderProgramID programID;
     if (FindShaderProgramIDInCall(call, &programID))
     {
-        os << "gShaderProgramMap[" << programID.value << "]";
+        os << "gShaderProgramMap2[" << programID.value << "]";
     }
     else
     {
@@ -6078,7 +6863,7 @@
     bool foundProgram = FindShaderProgramIDInCall(call, &programID);
     ASSERT(foundProgram);
 
-    os << "gUniformBlockIndexes[gShaderProgramMap[" << programID.value << "]][" << value.value
+    os << "gUniformBlockIndexes[gShaderProgramMap2[" << programID.value << "]][" << value.value
        << "]";
 }
 
@@ -6100,4 +6885,75 @@
     os << v;
 }
 
+template <>
+void WriteParamValueReplay<ParamType::TEGLContext>(std::ostream &os,
+                                                   const CallCapture &call,
+                                                   EGLContext value)
+{
+    os << "gContextMap[" << reinterpret_cast<size_t>(value) << "]";
+}
+
+template <>
+void WriteParamValueReplay<ParamType::TEGLDisplay>(std::ostream &os,
+                                                   const CallCapture &call,
+                                                   EGLDisplay value)
+{
+    if (value == EGL_NO_DISPLAY)
+    {
+        os << "EGL_NO_DISPLAY";
+        return;
+    }
+
+    // We don't support capturing real EGL calls.
+    UNREACHABLE();
+}
+
+template <>
+void WriteParamValueReplay<ParamType::TEGLSurface>(std::ostream &os,
+                                                   const CallCapture &call,
+                                                   EGLSurface value)
+{
+    if (value == EGL_NO_SURFACE)
+    {
+        os << "EGL_NO_SURFACE";
+        return;
+    }
+
+    // We don't support capturing real EGL calls.
+    UNREACHABLE();
+}
+
+template <>
+void WriteParamValueReplay<ParamType::TEGLDEBUGPROCKHR>(std::ostream &os,
+                                                        const CallCapture &call,
+                                                        EGLDEBUGPROCKHR value)
+{
+    // The value isn't actually useful, but this fixes MSVC compile errors:
+    // error: implicit conversion between pointer-to-function and pointer-to-object is a Microsoft
+    // extension [-Werror,-Wmicrosoft-cast]
+    os << reinterpret_cast<void *>(value);
+}
+
+template <>
+void WriteParamValueReplay<ParamType::TEGLGetBlobFuncANDROID>(std::ostream &os,
+                                                              const CallCapture &call,
+                                                              EGLGetBlobFuncANDROID value)
+{
+    // The value isn't actually useful, but this fixes MSVC compile errors:
+    // error: implicit conversion between pointer-to-function and pointer-to-object is a Microsoft
+    // extension [-Werror,-Wmicrosoft-cast]
+    os << reinterpret_cast<void *>(value);
+}
+
+template <>
+void WriteParamValueReplay<ParamType::TEGLSetBlobFuncANDROID>(std::ostream &os,
+                                                              const CallCapture &call,
+                                                              EGLSetBlobFuncANDROID value)
+{
+    // The value isn't actually useful, but this fixes MSVC compile errors:
+    // error: implicit conversion between pointer-to-function and pointer-to-object is a Microsoft
+    // extension [-Werror,-Wmicrosoft-cast]
+    os << reinterpret_cast<void *>(value);
+}
+
 }  // namespace angle
diff --git a/src/libANGLE/capture/FrameCapture.h b/src/libANGLE/capture/FrameCapture.h
index c764d97..e588df1 100644
--- a/src/libANGLE/capture/FrameCapture.h
+++ b/src/libANGLE/capture/FrameCapture.h
@@ -210,16 +210,54 @@
     StringCounters mStringCounters;
 };
 
-using BufferSet   = std::set<gl::BufferID>;
-using BufferCalls = std::map<gl::BufferID, std::vector<CallCapture>>;
+using BufferCalls = std::map<GLuint, std::vector<CallCapture>>;
 
 // true means mapped, false means unmapped
-using BufferMapStatusMap = std::map<gl::BufferID, bool>;
+using BufferMapStatusMap = std::map<GLuint, bool>;
 
 using FenceSyncSet   = std::set<GLsync>;
 using FenceSyncCalls = std::map<GLsync, std::vector<CallCapture>>;
 
-using ProgramSet = std::set<gl::ShaderProgramID>;
+using ResourceSet   = std::set<GLuint>;
+using ResourceCalls = std::map<GLuint, std::vector<CallCapture>>;
+
+class TrackedResource final : angle::NonCopyable
+{
+  public:
+    TrackedResource();
+    ~TrackedResource();
+
+    ResourceSet &getStartingResources() { return mStartingResources; }
+    ResourceSet &getNewResources() { return mNewResources; }
+    ResourceSet &getResourcesToRegen() { return mResourcesToRegen; }
+    ResourceSet &getResourcesToRestore() { return mResourcesToRestore; }
+
+    void setGennedResource(GLuint id);
+    void setDeletedResource(GLuint id);
+    void setModifiedResource(GLuint id);
+
+    ResourceCalls &getResourceRegenCalls() { return mResourceRegenCalls; }
+    ResourceCalls &getResourceRestoreCalls() { return mResourceRestoreCalls; }
+
+  private:
+    // Resource regen calls will delete and gen a resource
+    ResourceCalls mResourceRegenCalls;
+    // Resource restore calls will restore the contents of a resource
+    ResourceCalls mResourceRestoreCalls;
+
+    // Resources created during startup
+    ResourceSet mStartingResources;
+
+    // Resources created during the run that need to be deleted
+    ResourceSet mNewResources;
+    // Resources deleted during the run that need to be recreated
+    ResourceSet mResourcesToRegen;
+    // Resources modified during the run that need to be restored
+    ResourceSet mResourcesToRestore;
+};
+
+using TrackedResourceArray =
+    std::array<TrackedResource, static_cast<uint32_t>(ResourceIDType::EnumCount)>;
 
 // Helper to track resource changes during the capture
 class ResourceTracker final : angle::NonCopyable
@@ -228,33 +266,18 @@
     ResourceTracker();
     ~ResourceTracker();
 
-    BufferCalls &getBufferRegenCalls() { return mBufferRegenCalls; }
-    BufferCalls &getBufferRestoreCalls() { return mBufferRestoreCalls; }
     BufferCalls &getBufferMapCalls() { return mBufferMapCalls; }
     BufferCalls &getBufferUnmapCalls() { return mBufferUnmapCalls; }
 
     std::vector<CallCapture> &getBufferBindingCalls() { return mBufferBindingCalls; }
 
-    BufferSet &getStartingBuffers() { return mStartingBuffers; }
-    BufferSet &getNewBuffers() { return mNewBuffers; }
-    BufferSet &getBuffersToRegen() { return mBuffersToRegen; }
-    BufferSet &getBuffersToRestore() { return mBuffersToRestore; }
+    void setBufferMapped(GLuint id);
+    void setBufferUnmapped(GLuint id);
 
-    void setGennedBuffer(gl::BufferID id);
-    void setDeletedBuffer(gl::BufferID id);
-    void setBufferModified(gl::BufferID id);
-    void setBufferMapped(gl::BufferID id);
-    void setBufferUnmapped(gl::BufferID id);
+    bool getStartingBuffersMappedCurrent(GLuint id) const;
+    bool getStartingBuffersMappedInitial(GLuint id) const;
 
-    const bool &getStartingBuffersMappedCurrent(gl::BufferID id)
-    {
-        return mStartingBuffersMappedCurrent[id];
-    }
-    const bool &getStartingBuffersMappedInitial(gl::BufferID id)
-    {
-        return mStartingBuffersMappedInitial[id];
-    }
-    void setStartingBufferMapped(gl::BufferID id, bool mapped)
+    void setStartingBufferMapped(GLuint id, bool mapped)
     {
         // Track the current state (which will change throughout the trace)
         mStartingBuffersMappedCurrent[id] = mapped;
@@ -271,18 +294,12 @@
     FenceSyncSet &getFenceSyncsToRegen() { return mFenceSyncsToRegen; }
     void setDeletedFenceSync(GLsync sync);
 
-    ProgramSet &getStartingPrograms() { return mStartingPrograms; }
-    ProgramSet &getNewPrograms() { return mNewPrograms; }
-    ProgramSet &getProgramsToRegen() { return mProgramsToRegen; }
-
-    void setCreatedProgram(gl::ShaderProgramID id);
-    void setDeletedProgram(gl::ShaderProgramID id);
+    TrackedResource &getTrackedResource(ResourceIDType type)
+    {
+        return mTrackedResources[static_cast<uint32_t>(type)];
+    }
 
   private:
-    // Buffer regen calls will delete and gen a buffer
-    BufferCalls mBufferRegenCalls;
-    // Buffer restore calls will restore the contents of a buffer
-    BufferCalls mBufferRestoreCalls;
     // Buffer map calls will map a buffer with correct offset, length, and access flags
     BufferCalls mBufferMapCalls;
     // Buffer unmap calls will bind and unmap a given buffer
@@ -291,15 +308,6 @@
     // Buffer binding calls to restore bindings recorded during MEC
     std::vector<CallCapture> mBufferBindingCalls;
 
-    // Starting buffers include all the buffers created during setup for MEC
-    BufferSet mStartingBuffers;
-    // New buffers are those generated while capturing
-    BufferSet mNewBuffers;
-    // Buffers to regen are a list of starting buffers that need to be deleted and genned
-    BufferSet mBuffersToRegen;
-    // Buffers to restore include any starting buffers with contents modified during the run
-    BufferSet mBuffersToRestore;
-
     // Whether a given buffer was mapped at the start of the trace
     BufferMapStatusMap mStartingBuffersMappedInitial;
     // The status of buffer mapping throughout the trace, modified with each Map/Unmap call
@@ -308,13 +316,6 @@
     // Maximum accessed shader program ID.
     uint32_t mMaxShaderPrograms = 0;
 
-    // Programs created during startup
-    ProgramSet mStartingPrograms;
-    // Programs created during the run that need to be deleted
-    ProgramSet mNewPrograms;
-    // Programs deleted during the run that need to be recreated
-    ProgramSet mProgramsToRegen;
-
     // Fence sync objects created during MEC setup
     FenceSyncSet mStartingFenceSyncs;
     // Fence sync regen calls will create a fence sync objects
@@ -322,6 +323,8 @@
     // Fence syncs to regen are a list of starting fence sync objects that were deleted and need to
     // be regen'ed.
     FenceSyncSet mFenceSyncsToRegen;
+
+    TrackedResourceArray mTrackedResources;
 };
 
 // Used by the CPP replay to filter out unnecessary code.
@@ -341,8 +344,16 @@
 using TextureLevels       = std::map<GLint, std::vector<uint8_t>>;
 using TextureLevelDataMap = std::map<gl::TextureID, TextureLevels>;
 
-// Map from ContextID to surface dimensions
-using SurfaceDimensions = std::map<gl::ContextID, gl::Extents>;
+struct SurfaceParams
+{
+    gl::Extents extents;
+    egl::ColorSpace colorSpace;
+};
+
+// Map from ContextID to SurfaceParams
+using SurfaceParamsMap = std::map<gl::ContextID, SurfaceParams>;
+
+using CallVector = std::vector<std::vector<CallCapture> *>;
 
 class FrameCapture final : angle::NonCopyable
 {
@@ -368,7 +379,6 @@
 
     void captureCall(const gl::Context *context, CallCapture &&call, bool isCallValid);
     void checkForCaptureTrigger();
-    void setupSharedAndAuxReplay(const gl::Context *context, bool isMidExecutionCapture);
     void onEndFrame(const gl::Context *context);
     void onDestroyContext(const gl::Context *context);
     void onMakeCurrent(const gl::Context *context, const egl::Surface *drawSurface);
@@ -381,14 +391,14 @@
     // Returns a frame index starting from "1" as the first frame.
     uint32_t getReplayFrameIndex() const;
 
-    ResourceTracker &getResourceTracker() { return mResourceTracker; }
-
     void trackBufferMapping(CallCapture *call,
                             gl::BufferID id,
                             GLintptr offset,
                             GLsizeiptr length,
                             bool writable);
 
+    void trackTextureUpdate(const gl::Context *context, const CallCapture &call);
+
     const std::string &getShaderSource(gl::ShaderProgramID id) const;
     void setShaderSource(gl::ShaderProgramID id, std::string sources);
 
@@ -446,6 +456,7 @@
     void setCaptureActive() { mCaptureActive = true; }
     void setCaptureInactive() { mCaptureActive = false; }
     bool isCaptureActive() { return mCaptureActive; }
+    bool usesMidExecutionCapture() { return mCaptureStartFrame > 1; }
 
     gl::ContextID getWindowSurfaceContextID() const { return mWindowSurfaceContextID; }
 
@@ -454,8 +465,32 @@
         mReadBufferSize = std::max(mReadBufferSize, readBufferSize);
     }
 
+    template <typename ResourceType>
+    void handleGennedResource(ResourceType resourceID)
+    {
+        if (isCaptureActive())
+        {
+            ResourceIDType idType    = GetResourceIDTypeFromType<ResourceType>::IDType;
+            TrackedResource &tracker = mResourceTracker.getTrackedResource(idType);
+            tracker.setGennedResource(resourceID.value);
+        }
+    }
+
+    template <typename ResourceType>
+    void handleDeletedResource(ResourceType resourceID)
+    {
+        if (isCaptureActive())
+        {
+            ResourceIDType idType    = GetResourceIDTypeFromType<ResourceType>::IDType;
+            TrackedResource &tracker = mResourceTracker.getTrackedResource(idType);
+            tracker.setDeletedResource(resourceID.value);
+        }
+    }
+
   private:
     void writeCppReplayIndexFiles(const gl::Context *, bool writeResetContextCall);
+    void writeMainContextCppReplay(const gl::Context *context,
+                                   const std::vector<CallCapture> &setupCalls);
 
     void captureClientArraySnapshot(const gl::Context *context,
                                     size_t vertexCount,
@@ -466,7 +501,9 @@
     void captureCompressedTextureData(const gl::Context *context, const CallCapture &call);
 
     void reset();
-    void maybeOverrideEntryPoint(const gl::Context *context, CallCapture &call);
+    void maybeOverrideEntryPoint(const gl::Context *context,
+                                 CallCapture &call,
+                                 std::vector<CallCapture> &newCalls);
     void maybeCapturePreCallUpdates(const gl::Context *context, CallCapture &call);
     void maybeCapturePostCallUpdates(const gl::Context *context);
     void maybeCaptureDrawArraysClientData(const gl::Context *context,
@@ -476,22 +513,25 @@
                                             CallCapture &call,
                                             size_t instanceCount);
     void updateCopyImageSubData(CallCapture &call);
+    void overrideProgramBinary(const gl::Context *context,
+                               CallCapture &call,
+                               std::vector<CallCapture> &outCalls);
+    void updatePreCallResourceCounts(const CallCapture &call);
+
+    void runMidExecutionCapture(const gl::Context *context);
 
     static void ReplayCall(gl::Context *context,
                            ReplayContext *replayContext,
                            const CallCapture &call);
 
-    std::vector<CallCapture> &getSetupCalls() { return mSetupCalls; }
-    void clearSetupCalls() { mSetupCalls.clear(); }
-
-    std::vector<CallCapture> mSetupCalls;
     std::vector<CallCapture> mFrameCalls;
+    gl::ContextID mLastContextId;
 
     // We save one large buffer of binary data for the whole CPP replay.
     // This simplifies a lot of file management.
     std::vector<uint8_t> mBinaryData;
 
-    bool mEnabled = false;
+    bool mEnabled;
     bool mSerializeStateEnabled;
     std::string mOutDirectory;
     std::string mCaptureLabel;
@@ -502,11 +542,14 @@
     uint32_t mCaptureEndFrame;
     bool mIsFirstFrame   = true;
     bool mWroteIndexFile = false;
-    SurfaceDimensions mDrawSurfaceDimensions;
+    SurfaceParamsMap mDrawSurfaceParams;
     gl::AttribArray<size_t> mClientArraySizes;
     size_t mReadBufferSize;
     HasResourceTypeMap mHasResourceType;
     BufferDataMap mBufferDataMap;
+    bool mValidateSerializedState = false;
+    std::string mValidationExpression;
+    PackedEnumMap<ResourceIDType, uint32_t> mMaxAccessedResourceIDs;
 
     ResourceTracker mResourceTracker;
 
@@ -515,7 +558,7 @@
     // you reach the content you want to capture. Currently only available on Android.
     uint32_t mCaptureTrigger;
 
-    bool mCaptureActive = false;
+    bool mCaptureActive;
     std::vector<uint32_t> mActiveFrameIndices;
 
     // Cache most recently compiled and linked sources.
@@ -523,7 +566,6 @@
     ProgramSourceMap mCachedProgramSources;
 
     // Cache a shadow copy of texture level data
-    TextureLevels mCachedTextureLevels;
     TextureLevelDataMap mCachedTextureLevelData;
 
     gl::ContextID mWindowSurfaceContextID;
@@ -579,8 +621,6 @@
     mParamCaptures.emplace_back(std::move(capture));
 }
 
-std::ostream &operator<<(std::ostream &os, const ParamCapture &capture);
-
 // Pointer capture helpers.
 void CaptureMemory(const void *source, size_t size, ParamCapture *paramCapture);
 void CaptureString(const GLchar *str, ParamCapture *paramCapture);
@@ -642,6 +682,11 @@
                                                   GLboolean value);
 
 template <>
+void WriteParamValueReplay<ParamType::TGLbooleanPointer>(std::ostream &os,
+                                                         const CallCapture &call,
+                                                         GLboolean *value);
+
+template <>
 void WriteParamValueReplay<ParamType::TvoidConstPointer>(std::ostream &os,
                                                          const CallCapture &call,
                                                          const void *value);
@@ -756,6 +801,36 @@
                                                 const CallCapture &call,
                                                 GLubyte value);
 
+template <>
+void WriteParamValueReplay<ParamType::TEGLContext>(std::ostream &os,
+                                                   const CallCapture &call,
+                                                   EGLContext value);
+
+template <>
+void WriteParamValueReplay<ParamType::TEGLDisplay>(std::ostream &os,
+                                                   const CallCapture &call,
+                                                   EGLContext value);
+
+template <>
+void WriteParamValueReplay<ParamType::TEGLSurface>(std::ostream &os,
+                                                   const CallCapture &call,
+                                                   EGLContext value);
+
+template <>
+void WriteParamValueReplay<ParamType::TEGLDEBUGPROCKHR>(std::ostream &os,
+                                                        const CallCapture &call,
+                                                        EGLDEBUGPROCKHR value);
+
+template <>
+void WriteParamValueReplay<ParamType::TEGLGetBlobFuncANDROID>(std::ostream &os,
+                                                              const CallCapture &call,
+                                                              EGLGetBlobFuncANDROID value);
+
+template <>
+void WriteParamValueReplay<ParamType::TEGLSetBlobFuncANDROID>(std::ostream &os,
+                                                              const CallCapture &call,
+                                                              EGLSetBlobFuncANDROID value);
+
 // General fallback for any unspecific type.
 template <ParamType ParamT, typename T>
 void WriteParamValueReplay(std::ostream &os, const CallCapture &call, T value)
diff --git a/src/libANGLE/capture/FrameCapture_mock.cpp b/src/libANGLE/capture/FrameCapture_mock.cpp
index 0332004..1c1b822 100644
--- a/src/libANGLE/capture/FrameCapture_mock.cpp
+++ b/src/libANGLE/capture/FrameCapture_mock.cpp
@@ -20,15 +20,23 @@
 ParamCapture::~ParamCapture() {}
 ResourceTracker::ResourceTracker() {}
 ResourceTracker::~ResourceTracker() {}
+TrackedResource::TrackedResource() {}
+TrackedResource::~TrackedResource() {}
 
 FrameCapture::FrameCapture() {}
 FrameCapture::~FrameCapture() {}
 
-FrameCaptureShared::FrameCaptureShared() {}
+FrameCaptureShared::FrameCaptureShared() : mEnabled(false) {}
 FrameCaptureShared::~FrameCaptureShared() {}
 void FrameCaptureShared::onEndFrame(const gl::Context *context) {}
 void FrameCaptureShared::onMakeCurrent(const gl::Context *context, const egl::Surface *drawSurface)
 {}
 void FrameCaptureShared::onDestroyContext(const gl::Context *context) {}
 void FrameCaptureShared::replay(gl::Context *context) {}
+const ProgramSources &FrameCaptureShared::getProgramSources(gl::ShaderProgramID id) const
+{
+    const auto &foundSources = mCachedProgramSources.find(id);
+    return foundSources->second;
+}
+void FrameCaptureShared::setProgramSources(gl::ShaderProgramID id, ProgramSources sources) {}
 }  // namespace angle
diff --git a/src/libANGLE/capture/capture_gles_2_0_params.cpp b/src/libANGLE/capture/capture_gles_2_0_params.cpp
index b657f61..c1a4acb 100644
--- a/src/libANGLE/capture/capture_gles_2_0_params.cpp
+++ b/src/libANGLE/capture/capture_gles_2_0_params.cpp
@@ -704,8 +704,16 @@
     (void)internalFormatInfo.computeSkipBytes(type, srcRowPitch, srcDepthPitch, unpack, false,
                                               &srcSkipBytes);
 
-    size_t captureSize = srcRowPitch * height + srcSkipBytes;
-    CaptureMemory(pixels, captureSize, paramCapture);
+    // For the last row of pixels, we don't round up to the unpack alignment. This often affects
+    // 1x1 sized textures because they may be 1 or 2 bytes wide with an alignment of 4 bytes.
+    size_t allRowSizeMinusLastRowSize = height == 0 ? 0 : (srcRowPitch * (height - 1));
+    size_t lastRowSize                = width * internalFormatInfo.pixelBytes;
+    size_t captureSize                = allRowSizeMinusLastRowSize + lastRowSize + srcSkipBytes;
+
+    if (captureSize > 0)
+    {
+        CaptureMemory(pixels, captureSize, paramCapture);
+    }
 }
 
 void CaptureTexParameterfv_params(const State &glState,
diff --git a/src/libANGLE/capture/capture_gles_3_0_params.cpp b/src/libANGLE/capture/capture_gles_3_0_params.cpp
index 79ced76..a13278b 100644
--- a/src/libANGLE/capture/capture_gles_3_0_params.cpp
+++ b/src/libANGLE/capture/capture_gles_3_0_params.cpp
@@ -299,7 +299,7 @@
                                      const GLchar *name,
                                      ParamCapture *paramCapture)
 {
-    UNIMPLEMENTED();
+    CaptureString(name, paramCapture);
 }
 
 void CaptureGetInteger64i_v_data(const State &glState,
@@ -645,7 +645,7 @@
                                                  GLsizei height,
                                                  ParamCapture *paramCapture)
 {
-    UNIMPLEMENTED();
+    CaptureMemory(attachments, sizeof(GLenum) * numAttachments, paramCapture);
 }
 
 void CaptureProgramBinary_binary(const State &glState,
@@ -656,7 +656,7 @@
                                  GLsizei length,
                                  ParamCapture *paramCapture)
 {
-    UNIMPLEMENTED();
+    // Do nothing. glProgramBinary will be overridden in GenerateLinkedProgram.
 }
 
 void CaptureSamplerParameterfv_param(const State &glState,
diff --git a/src/libANGLE/capture/capture_gles_3_1_params.cpp b/src/libANGLE/capture/capture_gles_3_1_params.cpp
index e79c17b..f2768ef 100644
--- a/src/libANGLE/capture/capture_gles_3_1_params.cpp
+++ b/src/libANGLE/capture/capture_gles_3_1_params.cpp
@@ -75,7 +75,7 @@
                                GLboolean *data,
                                ParamCapture *paramCapture)
 {
-    UNIMPLEMENTED();
+    CaptureMemory(data, sizeof(GLboolean), paramCapture);
 }
 
 void CaptureGetFramebufferParameteriv_params(const State &glState,
diff --git a/src/libANGLE/capture/capture_gles_ext_autogen.cpp b/src/libANGLE/capture/capture_gles_ext_autogen.cpp
index e021b24..2f949a3 100644
--- a/src/libANGLE/capture/capture_gles_ext_autogen.cpp
+++ b/src/libANGLE/capture/capture_gles_ext_autogen.cpp
@@ -4413,6 +4413,67 @@
     return CallCapture(angle::EntryPoint::GLLoseContextCHROMIUM, std::move(paramBuffer));
 }
 
+CallCapture CaptureEGLImageTargetTexStorageEXT(const State &glState,
+                                               bool isCallValid,
+                                               GLenum target,
+                                               GLeglImageOES image,
+                                               const GLint *attrib_list)
+{
+    ParamBuffer paramBuffer;
+
+    paramBuffer.addEnumParam("target", GLenumGroup::DefaultGroup, ParamType::TGLenum, target);
+    paramBuffer.addValueParam("image", ParamType::TGLeglImageOES, image);
+
+    if (isCallValid)
+    {
+        ParamCapture attrib_listParam("attrib_list", ParamType::TGLintConstPointer);
+        InitParamValue(ParamType::TGLintConstPointer, attrib_list, &attrib_listParam.value);
+        CaptureEGLImageTargetTexStorageEXT_attrib_list(glState, isCallValid, target, image,
+                                                       attrib_list, &attrib_listParam);
+        paramBuffer.addParam(std::move(attrib_listParam));
+    }
+    else
+    {
+        ParamCapture attrib_listParam("attrib_list", ParamType::TGLintConstPointer);
+        InitParamValue(ParamType::TGLintConstPointer, static_cast<const GLint *>(nullptr),
+                       &attrib_listParam.value);
+        paramBuffer.addParam(std::move(attrib_listParam));
+    }
+
+    return CallCapture(angle::EntryPoint::GLEGLImageTargetTexStorageEXT, std::move(paramBuffer));
+}
+
+CallCapture CaptureEGLImageTargetTextureStorageEXT(const State &glState,
+                                                   bool isCallValid,
+                                                   GLuint texture,
+                                                   GLeglImageOES image,
+                                                   const GLint *attrib_list)
+{
+    ParamBuffer paramBuffer;
+
+    paramBuffer.addValueParam("texture", ParamType::TGLuint, texture);
+    paramBuffer.addValueParam("image", ParamType::TGLeglImageOES, image);
+
+    if (isCallValid)
+    {
+        ParamCapture attrib_listParam("attrib_list", ParamType::TGLintConstPointer);
+        InitParamValue(ParamType::TGLintConstPointer, attrib_list, &attrib_listParam.value);
+        CaptureEGLImageTargetTextureStorageEXT_attrib_list(glState, isCallValid, texture, image,
+                                                           attrib_list, &attrib_listParam);
+        paramBuffer.addParam(std::move(attrib_listParam));
+    }
+    else
+    {
+        ParamCapture attrib_listParam("attrib_list", ParamType::TGLintConstPointer);
+        InitParamValue(ParamType::TGLintConstPointer, static_cast<const GLint *>(nullptr),
+                       &attrib_listParam.value);
+        paramBuffer.addParam(std::move(attrib_listParam));
+    }
+
+    return CallCapture(angle::EntryPoint::GLEGLImageTargetTextureStorageEXT,
+                       std::move(paramBuffer));
+}
+
 CallCapture CaptureBindFragDataLocationEXT(const State &glState,
                                            bool isCallValid,
                                            ShaderProgramID programPacked,
diff --git a/src/libANGLE/capture/capture_gles_ext_autogen.h b/src/libANGLE/capture/capture_gles_ext_autogen.h
index 346d18d..858aabd 100644
--- a/src/libANGLE/capture/capture_gles_ext_autogen.h
+++ b/src/libANGLE/capture/capture_gles_ext_autogen.h
@@ -869,6 +869,18 @@
 
 // GL_EXT_EGL_image_array
 
+// GL_EXT_EGL_image_storage
+angle::CallCapture CaptureEGLImageTargetTexStorageEXT(const State &glState,
+                                                      bool isCallValid,
+                                                      GLenum target,
+                                                      GLeglImageOES image,
+                                                      const GLint *attrib_list);
+angle::CallCapture CaptureEGLImageTargetTextureStorageEXT(const State &glState,
+                                                          bool isCallValid,
+                                                          GLuint texture,
+                                                          GLeglImageOES image,
+                                                          const GLint *attrib_list);
+
 // GL_EXT_YUV_target
 
 // GL_EXT_blend_func_extended
@@ -1273,6 +1285,10 @@
                                                   GLfloat maxZ,
                                                   GLfloat maxW);
 
+// GL_EXT_protected_textures
+
+// GL_EXT_pvrtc_sRGB
+
 // GL_EXT_read_format_bgra
 
 // GL_EXT_robustness
@@ -1727,6 +1743,10 @@
                                           GLsizei height,
                                           GLsizei depth);
 
+// GL_IMG_texture_compression_pvrtc
+
+// GL_IMG_texture_compression_pvrtc2
+
 // GL_KHR_blend_equation_advanced
 angle::CallCapture CaptureBlendBarrierKHR(const State &glState, bool isCallValid);
 
@@ -1803,6 +1823,12 @@
                                                       bool isCallValid,
                                                       GLuint count);
 
+// GL_KHR_texture_compression_astc_hdr
+
+// GL_KHR_texture_compression_astc_ldr
+
+// GL_KHR_texture_compression_astc_sliced_3d
+
 // GL_NV_fence
 angle::CallCapture CaptureDeleteFencesNV(const State &glState,
                                          bool isCallValid,
@@ -3636,6 +3662,18 @@
                                              UniformLocation locationPacked,
                                              const GLchar *name,
                                              angle::ParamCapture *paramCapture);
+void CaptureEGLImageTargetTexStorageEXT_attrib_list(const State &glState,
+                                                    bool isCallValid,
+                                                    GLenum target,
+                                                    GLeglImageOES image,
+                                                    const GLint *attrib_list,
+                                                    angle::ParamCapture *paramCapture);
+void CaptureEGLImageTargetTextureStorageEXT_attrib_list(const State &glState,
+                                                        bool isCallValid,
+                                                        GLuint texture,
+                                                        GLeglImageOES image,
+                                                        const GLint *attrib_list,
+                                                        angle::ParamCapture *paramCapture);
 void CaptureBindFragDataLocationEXT_name(const State &glState,
                                          bool isCallValid,
                                          ShaderProgramID programPacked,
diff --git a/src/libANGLE/capture/capture_gles_ext_params.cpp b/src/libANGLE/capture/capture_gles_ext_params.cpp
index 2b65095..de8e843 100644
--- a/src/libANGLE/capture/capture_gles_ext_params.cpp
+++ b/src/libANGLE/capture/capture_gles_ext_params.cpp
@@ -3567,7 +3567,7 @@
                                                       const ProgramPipelineID *pipelinesPacked,
                                                       angle::ParamCapture *paramCapture)
 {
-    UNIMPLEMENTED();
+    CaptureArray(pipelinesPacked, n, paramCapture);
 }
 
 void CaptureGenProgramPipelinesEXT_pipelinesPacked(const State &glState,
@@ -3576,7 +3576,7 @@
                                                    ProgramPipelineID *pipelinesPacked,
                                                    angle::ParamCapture *paramCapture)
 {
-    UNIMPLEMENTED();
+    CaptureGenHandles(n, pipelinesPacked, paramCapture);
 }
 
 void CaptureGetProgramPipelineInfoLogEXT_length(const State &glState,
@@ -3850,4 +3850,24 @@
 {
     UNIMPLEMENTED();
 }
+
+void CaptureEGLImageTargetTexStorageEXT_attrib_list(const State &glState,
+                                                    bool isCallValid,
+                                                    GLenum target,
+                                                    GLeglImageOES image,
+                                                    const GLint *attrib_list,
+                                                    angle::ParamCapture *paramCapture)
+{
+    UNIMPLEMENTED();
+}
+
+void CaptureEGLImageTargetTextureStorageEXT_attrib_list(const State &glState,
+                                                        bool isCallValid,
+                                                        GLuint texture,
+                                                        GLeglImageOES image,
+                                                        const GLint *attrib_list,
+                                                        angle::ParamCapture *paramCapture)
+{
+    UNIMPLEMENTED();
+}
 }  // namespace gl
diff --git a/src/libANGLE/capture/frame_capture_utils.cpp b/src/libANGLE/capture/frame_capture_utils.cpp
index 90d0701..eeac792 100644
--- a/src/libANGLE/capture/frame_capture_utils.cpp
+++ b/src/libANGLE/capture/frame_capture_utils.cpp
@@ -45,162 +45,32 @@
 
 namespace angle
 {
-
 namespace
 {
-
-static const char *TextureTypeToString(gl::TextureType type)
+template <typename ArgT>
+std::string ToString(const ArgT &arg)
 {
-    switch (type)
-    {
-        case gl::TextureType::_2D:
-            return "TEXTURE_2D";
-        case gl::TextureType::_2DArray:
-            return "TEXTURE_2D_ARRAY";
-        case gl::TextureType::_2DMultisample:
-            return "TEXTURE_2DMS";
-        case gl::TextureType::_2DMultisampleArray:
-            return "TEXTURE_2DMS_ARRAY";
-        case gl::TextureType::_3D:
-            return "TEXTURE_3D";
-        case gl::TextureType::External:
-            return "TEXTURE_EXTERNAL";
-        case gl::TextureType::Rectangle:
-            return "TEXTURE_RECT";
-        case gl::TextureType::CubeMap:
-            return "TEXTURE_CUBE_MAP";
-        case gl::TextureType::CubeMapArray:
-            return "TEXTURE_CUBE_MAP_ARRAY";
-        case gl::TextureType::VideoImage:
-            return "TEXTURE_VIDEO_IMAGE";
-        case gl::TextureType::Buffer:
-            return "TEXTURE_BUFFER";
-        default:
-            return "invalid";
-    }
-}
-
-static const char *CullFaceModeToString(gl::CullFaceMode mode)
-{
-    switch (mode)
-    {
-        case gl::CullFaceMode::Back:
-            return "CULL_BACK";
-        case gl::CullFaceMode::Front:
-            return "CULL_FRONT";
-        case gl::CullFaceMode::FrontAndBack:
-            return "CULL_FRONT_AND_BACK";
-        default:
-            return "invalid";
-    }
-}
-
-static const char *ProvokingVertexConventionToString(gl::ProvokingVertexConvention mode)
-{
-    switch (mode)
-    {
-        case gl::ProvokingVertexConvention::FirstVertexConvention:
-            return "First";
-        case gl::ProvokingVertexConvention::LastVertexConvention:
-            return "Last";
-        default:
-            return "invalid";
-    }
-}
-
-static const char *InitStateToString(gl::InitState state)
-{
-    return state == gl::InitState::Initialized ? "Initialized" : "MayNeedInit";
-}
-
-static const char *BlockLayoutTypeToString(sh::BlockLayoutType type)
-{
-    switch (type)
-    {
-        case sh::BlockLayoutType::BLOCKLAYOUT_STD140:
-            return "std140";
-        case sh::BlockLayoutType::BLOCKLAYOUT_STD430:
-            return "std430";
-        case sh::BlockLayoutType::BLOCKLAYOUT_PACKED:
-            return "packed";
-        case sh::BlockLayoutType::BLOCKLAYOUT_SHARED:
-            return "shared";
-        default:
-            return "invalid";
-    }
-}
-
-static const char *BlockTypeToString(sh::BlockType type)
-{
-    return type == sh::BlockType::BLOCK_BUFFER ? "buffer" : "uniform";
-}
-
-static const char *InterpolationTypeToString(sh::InterpolationType type)
-{
-    switch (type)
-    {
-        case sh::InterpolationType::INTERPOLATION_SMOOTH:
-            return "smooth";
-        case sh::InterpolationType::INTERPOLATION_CENTROID:
-            return "centroid";
-        case sh::InterpolationType::INTERPOLATION_SAMPLE:
-            return "sample";
-        case sh::InterpolationType::INTERPOLATION_FLAT:
-            return "flat";
-        case sh::InterpolationType::INTERPOLATION_NOPERSPECTIVE:
-            return "noperspective";
-        default:
-            return "invalid";
-    }
+    std::ostringstream strstr;
+    strstr << arg;
+    return strstr.str();
 }
 
 #define ENUM_TO_STRING(C, M) \
     case C ::M:              \
         return #M
 
-static const char *PrimitiveModeToString(gl::PrimitiveMode mode)
+const char *InitStateToString(gl::InitState state)
 {
-    switch (mode)
+    switch (state)
     {
-        ENUM_TO_STRING(gl::PrimitiveMode, Points);
-        ENUM_TO_STRING(gl::PrimitiveMode, Lines);
-        ENUM_TO_STRING(gl::PrimitiveMode, LineLoop);
-        ENUM_TO_STRING(gl::PrimitiveMode, LineStrip);
-        ENUM_TO_STRING(gl::PrimitiveMode, Triangles);
-        ENUM_TO_STRING(gl::PrimitiveMode, TriangleStrip);
-        ENUM_TO_STRING(gl::PrimitiveMode, TriangleFan);
-        ENUM_TO_STRING(gl::PrimitiveMode, Unused1);
-        ENUM_TO_STRING(gl::PrimitiveMode, Unused2);
-        ENUM_TO_STRING(gl::PrimitiveMode, Unused3);
-        ENUM_TO_STRING(gl::PrimitiveMode, LinesAdjacency);
-        ENUM_TO_STRING(gl::PrimitiveMode, LineStripAdjacency);
-        ENUM_TO_STRING(gl::PrimitiveMode, TrianglesAdjacency);
-        ENUM_TO_STRING(gl::PrimitiveMode, TriangleStripAdjacency);
-        ENUM_TO_STRING(gl::PrimitiveMode, Patches);
+        ENUM_TO_STRING(gl::InitState, Initialized);
+        ENUM_TO_STRING(gl::InitState, MayNeedInit);
         default:
             return "invalid";
     }
 }
 
-static const char *BufferUsageToString(gl::BufferUsage usage)
-{
-    switch (usage)
-    {
-        ENUM_TO_STRING(gl::BufferUsage, DynamicCopy);
-        ENUM_TO_STRING(gl::BufferUsage, DynamicDraw);
-        ENUM_TO_STRING(gl::BufferUsage, DynamicRead);
-        ENUM_TO_STRING(gl::BufferUsage, StaticCopy);
-        ENUM_TO_STRING(gl::BufferUsage, StaticDraw);
-        ENUM_TO_STRING(gl::BufferUsage, StaticRead);
-        ENUM_TO_STRING(gl::BufferUsage, StreamCopy);
-        ENUM_TO_STRING(gl::BufferUsage, StreamDraw);
-        ENUM_TO_STRING(gl::BufferUsage, StreamRead);
-        default:
-            return "invalid";
-    }
-}
-
-static const char *SrgbOverrideToString(gl::SrgbOverride value)
+const char *SrgbOverrideToString(gl::SrgbOverride value)
 {
     switch (value)
     {
@@ -212,7 +82,7 @@
     }
 }
 
-static const char *ColorGenericTypeToString(gl::ColorGeneric::Type type)
+const char *ColorGenericTypeToString(gl::ColorGeneric::Type type)
 {
     switch (type)
     {
@@ -224,7 +94,7 @@
     }
 }
 
-static const char *CompileStatusToString(gl::CompileStatus status)
+const char *CompileStatusToString(gl::CompileStatus status)
 {
     switch (status)
     {
@@ -250,7 +120,7 @@
     {
         constexpr size_t kBufSize = 255;
         char buf[kBufSize + 1]    = {};
-        snprintf(buf, kBufSize, "%s%s%02d", name.c_str(), name.empty() ? "" : " ", index);
+        snprintf(buf, kBufSize, "%s%s%03d", name.c_str(), name.empty() ? "" : " ", index);
         mJson->startGroup(buf);
     }
 
@@ -323,12 +193,14 @@
 {
     for (size_t i = 0; i < bindingPointerVector.size(); i++)
     {
+        const gl::BindingPointer<ObjectType> &obj = bindingPointerVector[i];
+
         // Do not serialize zero bindings, as this will create unwanted diffs
-        if (bindingPointerVector[i].id().value != 0)
+        if (obj.id().value != 0)
         {
             std::ostringstream s;
-            s << i;
-            json->addScalar(s.str().c_str(), bindingPointerVector[i].id().value);
+            s << std::setfill('0') << std::setw(3) << i;
+            json->addScalar(s.str().c_str(), obj.id().value);
         }
     }
 }
@@ -347,6 +219,27 @@
                                   (binding - GL_COLOR_ATTACHMENT0) < colorAttachmentsCount);
 }
 
+void SerializeFormat(JsonSerializer *json, GLenum glFormat)
+{
+    json->addCString("InternalFormat",
+                     gl::GLenumToString(gl::GLenumGroup::InternalFormat, glFormat));
+}
+
+void SerializeInternalFormat(JsonSerializer *json, const gl::InternalFormat *internalFormat)
+{
+    SerializeFormat(json, internalFormat->internalFormat);
+}
+
+void SerializeANGLEFormat(JsonSerializer *json, const angle::Format *format)
+{
+    SerializeFormat(json, format->glInternalFormat);
+}
+
+void SerializeGLFormat(JsonSerializer *json, const gl::Format &format)
+{
+    SerializeInternalFormat(json, format.info);
+}
+
 Result ReadPixelsFromAttachment(const gl::Context *context,
                                 gl::Framebuffer *framebuffer,
                                 const gl::FramebufferAttachment &framebufferAttachment,
@@ -372,7 +265,7 @@
 void SerializeImageIndex(JsonSerializer *json, const gl::ImageIndex &imageIndex)
 {
     GroupScope group(json, "Image");
-    json->addCString("ImageType", TextureTypeToString(imageIndex.getType()));
+    json->addString("ImageType", ToString(imageIndex.getType()));
     json->addScalar("LevelIndex", imageIndex.getLevelIndex());
     json->addScalar("LayerIndex", imageIndex.getLayerIndex());
     json->addScalar("LayerCount", imageIndex.getLayerCount());
@@ -388,9 +281,10 @@
     if (framebufferAttachment.type() == GL_TEXTURE ||
         framebufferAttachment.type() == GL_RENDERBUFFER)
     {
-        json->addScalar("ID", framebufferAttachment.id());
+        json->addScalar("AttachedResourceID", framebufferAttachment.id());
     }
-    json->addScalar("Type", framebufferAttachment.type());
+    json->addCString("Type", gl::GLenumToString(gl::GLenumGroup::ObjectIdentifier,
+                                                framebufferAttachment.type()));
     // serialize target variable
     json->addString("Binding", gl::GLenumToString(enumGroup, framebufferAttachment.getBinding()));
     if (framebufferAttachment.type() == GL_TEXTURE)
@@ -454,41 +348,47 @@
                     framebufferState.getDefaultFixedSampleLocations());
     json->addScalar("DefaultLayers", framebufferState.getDefaultLayers());
 
-    const std::vector<gl::FramebufferAttachment> &colorAttachments =
-        framebufferState.getColorAttachments();
-    for (const gl::FramebufferAttachment &colorAttachment : colorAttachments)
     {
-        if (colorAttachment.isAttached())
+        GroupScope attachmentsGroup(json, "Attachments");
+        const std::vector<gl::FramebufferAttachment> &colorAttachments =
+            framebufferState.getColorAttachments();
+        for (size_t attachmentIndex = 0; attachmentIndex < colorAttachments.size();
+             ++attachmentIndex)
         {
-            GroupScope colorAttachmentgroup(json, "ColorAttachment");
-            ANGLE_TRY(SerializeFramebufferAttachment(context, json, scratchBuffer, framebuffer,
-                                                     colorAttachment,
-                                                     gl::GLenumGroup::ColorBuffer));
+            const gl::FramebufferAttachment &colorAttachment = colorAttachments[attachmentIndex];
+            if (colorAttachment.isAttached())
+            {
+                GroupScope colorAttachmentgroup(json, "ColorAttachment",
+                                                static_cast<int>(attachmentIndex));
+                ANGLE_TRY(SerializeFramebufferAttachment(context, json, scratchBuffer, framebuffer,
+                                                         colorAttachment,
+                                                         gl::GLenumGroup::ColorBuffer));
+            }
         }
-    }
-    if (framebuffer->getDepthStencilAttachment())
-    {
-        GroupScope dsAttachmentgroup(json, "DepthStencilAttachment");
-        ANGLE_TRY(SerializeFramebufferAttachment(context, json, scratchBuffer, framebuffer,
-                                                 *framebuffer->getDepthStencilAttachment(),
-                                                 gl::GLenumGroup::DefaultGroup));
-    }
-    else
-    {
-        if (framebuffer->getDepthAttachment())
+        if (framebuffer->getDepthStencilAttachment())
         {
-            GroupScope depthAttachmentgroup(json, "DepthAttachment");
+            GroupScope dsAttachmentgroup(json, "DepthStencilAttachment");
             ANGLE_TRY(SerializeFramebufferAttachment(context, json, scratchBuffer, framebuffer,
-                                                     *framebuffer->getDepthAttachment(),
-                                                     gl::GLenumGroup::FramebufferAttachment));
-        }
-        if (framebuffer->getStencilAttachment())
-        {
-            GroupScope stencilAttachmengroup(json, "StencilAttachment");
-            ANGLE_TRY(SerializeFramebufferAttachment(context, json, scratchBuffer, framebuffer,
-                                                     *framebuffer->getStencilAttachment(),
+                                                     *framebuffer->getDepthStencilAttachment(),
                                                      gl::GLenumGroup::DefaultGroup));
         }
+        else
+        {
+            if (framebuffer->getDepthAttachment())
+            {
+                GroupScope depthAttachmentgroup(json, "DepthAttachment");
+                ANGLE_TRY(SerializeFramebufferAttachment(context, json, scratchBuffer, framebuffer,
+                                                         *framebuffer->getDepthAttachment(),
+                                                         gl::GLenumGroup::FramebufferAttachment));
+            }
+            if (framebuffer->getStencilAttachment())
+            {
+                GroupScope stencilAttachmengroup(json, "StencilAttachment");
+                ANGLE_TRY(SerializeFramebufferAttachment(context, json, scratchBuffer, framebuffer,
+                                                         *framebuffer->getStencilAttachment(),
+                                                         gl::GLenumGroup::DefaultGroup));
+            }
+        }
     }
     return Result::Continue;
 }
@@ -506,7 +406,7 @@
 {
     GroupScope group(json, "Rasterizer");
     json->addScalar("CullFace", rasterizerState.cullFace);
-    json->addCString("CullMode", CullFaceModeToString(rasterizerState.cullMode));
+    json->addString("CullMode", ToString(rasterizerState.cullMode));
     json->addScalar("FrontFace", rasterizerState.frontFace);
     json->addScalar("PolygonOffsetFill", rasterizerState.polygonOffsetFill);
     json->addScalar("PolygonOffsetFactor", rasterizerState.polygonOffsetFactor);
@@ -617,15 +517,21 @@
     json->addScalar("SkipImages", pixelUnpackState.skipImages);
 }
 
-void SerializeImageUnit(JsonSerializer *json, const gl::ImageUnit &imageUnit)
+void SerializeImageUnit(JsonSerializer *json, const gl::ImageUnit &imageUnit, int imageUnitIndex)
 {
-    GroupScope group(json, "ImageUnit");
+    GroupScope group(json, "ImageUnit", imageUnitIndex);
     json->addScalar("Level", imageUnit.level);
     json->addScalar("Layered", imageUnit.layered);
     json->addScalar("Layer", imageUnit.layer);
     json->addScalar("Access", imageUnit.access);
-    json->addScalar("Format", imageUnit.format);
-    json->addScalar("Texid", imageUnit.texture.id().value);
+    json->addCString("Format", gl::GLinternalFormatToString(imageUnit.format));
+    json->addScalar("TextureID", imageUnit.texture.id().value);
+}
+
+template <typename ResourceType>
+void SerializeResourceID(JsonSerializer *json, const char *name, const ResourceType *resource)
+{
+    json->addScalar(name, resource ? resource->id().value : 0);
 }
 
 void SerializeContextState(JsonSerializer *json, const gl::State &state)
@@ -671,25 +577,12 @@
     SerializeRectangle(json, "Viewport", state.getViewport());
     json->addScalar("Near", state.getNearPlane());
     json->addScalar("Far", state.getFarPlane());
-    if (state.getReadFramebuffer())
-    {
-        json->addScalar("Framebuffer ID", state.getReadFramebuffer()->id().value);
-    }
-    if (state.getDrawFramebuffer())
-    {
-        json->addScalar("Draw Framebuffer ID", state.getDrawFramebuffer()->id().value);
-    }
-    json->addScalar("Renderbuffer ID", state.getRenderbufferId().value);
-    if (state.getProgram())
-    {
-        json->addScalar("ProgramID", state.getProgram()->id().value);
-    }
-    if (state.getProgramPipeline())
-    {
-        json->addScalar("ProgramPipelineID", state.getProgramPipeline()->id().value);
-    }
-    json->addCString("ProvokingVertex",
-                     ProvokingVertexConventionToString(state.getProvokingVertex()));
+    SerializeResourceID(json, "ReadFramebufferID", state.getReadFramebuffer());
+    SerializeResourceID(json, "DrawFramebufferID", state.getDrawFramebuffer());
+    json->addScalar("RenderbufferID", state.getRenderbufferId().value);
+    SerializeResourceID(json, "CurrentProgramID", state.getProgram());
+    SerializeResourceID(json, "CurrentProgramPipelineID", state.getProgramPipeline());
+    json->addString("ProvokingVertex", ToString(state.getProvokingVertex()));
     const std::vector<gl::VertexAttribCurrentValueData> &vertexAttribCurrentValues =
         state.getVertexAttribCurrentValues();
     for (size_t i = 0; i < vertexAttribCurrentValues.size(); i++)
@@ -697,16 +590,17 @@
         GroupScope vagroup(json, "VertexAttribCurrentValue", static_cast<int>(i));
         SerializeVertexAttribCurrentValueData(json, vertexAttribCurrentValues[i]);
     }
-    if (state.getVertexArray())
-    {
-        json->addScalar("VertexArrayID", state.getVertexArray()->id().value);
-    }
+    ASSERT(state.getVertexArray());
+    json->addScalar("VertexArrayID", state.getVertexArray()->id().value);
     json->addScalar("CurrentValuesTypeMask", state.getCurrentValuesTypeMask().to_ulong());
     json->addScalar("ActiveSampler", state.getActiveSampler());
     {
         GroupScope boundTexturesGroup(json, "BoundTextures");
-        for (const auto &textures : state.getBoundTexturesForCapture())
+        const gl::TextureBindingMap &boundTexturesMap = state.getBoundTexturesForCapture();
+        for (gl::TextureType textureType : AllEnums<gl::TextureType>())
         {
+            const gl::TextureBindingVector &textures = boundTexturesMap[textureType];
+            GroupScope texturesGroup(json, ToString(textureType));
             SerializeBindingPointerVector<gl::Texture>(json, textures);
         }
     }
@@ -716,9 +610,12 @@
 
     {
         GroupScope imageUnitsGroup(json, "BoundImageUnits");
-        for (const gl::ImageUnit &imageUnit : state.getImageUnits())
+
+        const std::vector<gl::ImageUnit> &imageUnits = state.getImageUnits();
+        for (size_t imageUnitIndex = 0; imageUnitIndex < imageUnits.size(); ++imageUnitIndex)
         {
-            SerializeImageUnit(json, imageUnit);
+            const gl::ImageUnit &imageUnit = imageUnits[imageUnitIndex];
+            SerializeImageUnit(json, imageUnit, static_cast<int>(imageUnitIndex));
         }
     }
 
@@ -780,7 +677,7 @@
 void SerializeBufferState(JsonSerializer *json, const gl::BufferState &bufferState)
 {
     json->addString("Label", bufferState.getLabel());
-    json->addCString("Usage", BufferUsageToString(bufferState.getUsage()));
+    json->addString("Usage", ToString(bufferState.getUsage()));
     json->addScalar("Size", bufferState.getSize());
     json->addScalar("AccessFlags", bufferState.getAccessFlags());
     json->addScalar("Access", bufferState.getAccess());
@@ -811,6 +708,7 @@
     }
     return Result::Continue;
 }
+
 void SerializeColorGeneric(JsonSerializer *json,
                            const std::string &name,
                            const ColorGeneric &colorGeneric)
@@ -865,23 +763,13 @@
     json->addScalar("SwizzleAlpha", swizzleState.swizzleAlpha);
 }
 
-void SerializeInternalFormat(JsonSerializer *json, const gl::InternalFormat *internalFormat)
-{
-    json->addScalar("InternalFormat", internalFormat->internalFormat);
-}
-
-void SerializeFormat(JsonSerializer *json, const gl::Format &format)
-{
-    SerializeInternalFormat(json, format.info);
-}
-
 void SerializeRenderbufferState(JsonSerializer *json,
                                 const gl::RenderbufferState &renderbufferState)
 {
     GroupScope wg(json, "State");
     json->addScalar("Width", renderbufferState.getWidth());
     json->addScalar("Height", renderbufferState.getHeight());
-    SerializeFormat(json, renderbufferState.getFormat());
+    SerializeGLFormat(json, renderbufferState.getFormat());
     json->addScalar("Samples", renderbufferState.getSamples());
     json->addCString("InitState", InitStateToString(renderbufferState.getInitState()));
 }
@@ -894,23 +782,33 @@
     GroupScope wg(json, "Renderbuffer", renderbuffer->id().value);
     SerializeRenderbufferState(json, renderbuffer->getState());
     json->addString("Label", renderbuffer->getLabel());
-    MemoryBuffer *pixelsPtr = nullptr;
-    ANGLE_CHECK_GL_ALLOC(
-        const_cast<gl::Context *>(context),
-        scratchBuffer->getInitialized(renderbuffer->getMemorySize(), &pixelsPtr, 0));
 
     if (renderbuffer->initState(gl::ImageIndex()) == gl::InitState::Initialized)
     {
+        const gl::InternalFormat &format = *renderbuffer->getFormat().info;
+
+        const gl::Extents size(renderbuffer->getWidth(), renderbuffer->getHeight(), 1);
         gl::PixelPackState packState;
         packState.alignment = 1;
+
+        GLenum readFormat = renderbuffer->getImplementationColorReadFormat(context);
+        GLenum readType   = renderbuffer->getImplementationColorReadType(context);
+
+        GLuint bytes   = 0;
+        bool computeOK = format.computePackUnpackEndByte(readType, size, packState, false, &bytes);
+        ASSERT(computeOK);
+
+        MemoryBuffer *pixelsPtr = nullptr;
+        ANGLE_CHECK_GL_ALLOC(const_cast<gl::Context *>(context),
+                             scratchBuffer->getInitialized(bytes, &pixelsPtr, 0));
+
         ANGLE_TRY(renderbuffer->getImplementation()->getRenderbufferImage(
-            context, packState, nullptr, renderbuffer->getImplementationColorReadFormat(context),
-            renderbuffer->getImplementationColorReadType(context), pixelsPtr->data()));
-        json->addBlob("pixel", pixelsPtr->data(), pixelsPtr->size());
+            context, packState, nullptr, readFormat, readType, pixelsPtr->data()));
+        json->addBlob("Pixels", pixelsPtr->data(), pixelsPtr->size());
     }
     else
     {
-        json->addCString("pixel", "Not initialized");
+        json->addCString("Pixels", "Not initialized");
     }
     return Result::Continue;
 }
@@ -1005,15 +903,13 @@
     json->addScalar("SpecConstUsageBits", shaderState.getSpecConstUsageBits().bits());
     if (shaderState.getGeometryShaderInputPrimitiveType().valid())
     {
-        json->addCString(
-            "GeometryShaderInputPrimitiveType",
-            PrimitiveModeToString(shaderState.getGeometryShaderInputPrimitiveType().value()));
+        json->addString("GeometryShaderInputPrimitiveType",
+                        ToString(shaderState.getGeometryShaderInputPrimitiveType().value()));
     }
     if (shaderState.getGeometryShaderOutputPrimitiveType().valid())
     {
-        json->addCString(
-            "GeometryShaderOutputPrimitiveType",
-            PrimitiveModeToString(shaderState.getGeometryShaderOutputPrimitiveType().value()));
+        json->addString("GeometryShaderOutputPrimitiveType",
+                        ToString(shaderState.getGeometryShaderOutputPrimitiveType().value()));
     }
     if (shaderState.getGeometryShaderInvocations().valid())
     {
@@ -1025,6 +921,9 @@
 
 void SerializeShader(JsonSerializer *json, GLuint id, gl::Shader *shader)
 {
+    // Ensure deterministic compilation.
+    shader->resolveCompile();
+
     GroupScope group(json, "Shader", id);
     SerializeShaderState(json, shader->getState());
     json->addScalar("Handle", shader->getHandle().value);
@@ -1043,9 +942,10 @@
                                       const std::vector<gl::VariableLocation> &variableLocations)
 {
     GroupScope group(json, group_name);
-    for (const gl::VariableLocation &variableLocation : variableLocations)
+    for (size_t locIndex = 0; locIndex < variableLocations.size(); ++locIndex)
     {
-        GroupScope vargroup(json, "Variable");
+        const gl::VariableLocation &variableLocation = variableLocations[locIndex];
+        GroupScope vargroup(json, "Location", static_cast<int>(locIndex));
         json->addScalar("ArrayIndex", variableLocation.arrayIndex);
         json->addScalar("Index", variableLocation.index);
         json->addScalar("Ignored", variableLocation.ignored);
@@ -1135,8 +1035,30 @@
     }
 }
 
-void SerializeProgram(JsonSerializer *json, GLuint id, gl::Program *program)
+template <typename T>
+void SerializeUniformData(JsonSerializer *json,
+                          const gl::Context *context,
+                          gl::Program *program,
+                          gl::UniformLocation loc,
+                          GLenum type,
+                          GLint size,
+                          void (gl::Program::*getFunc)(const gl::Context *,
+                                                       gl::UniformLocation,
+                                                       T *) const)
 {
+    std::vector<T> uniformData(gl::VariableComponentCount(type) * size, 0);
+    (program->*getFunc)(context, loc, uniformData.data());
+    json->addVector("Data", uniformData);
+}
+
+void SerializeProgram(JsonSerializer *json,
+                      const gl::Context *context,
+                      GLuint id,
+                      gl::Program *program)
+{
+    // Ensure deterministic link.
+    program->resolveLink(context);
+
     GroupScope group(json, "Program", id);
     SerializeProgramState(json, program->getState());
     json->addScalar("IsValidated", program->isValidated());
@@ -1147,13 +1069,73 @@
     json->addScalar("IsFlaggedForDeletion", program->isFlaggedForDeletion());
     json->addScalar("RefCount", program->getRefCount());
     json->addScalar("ID", program->id().value);
+
+    // Serialize uniforms.
+    {
+        GroupScope uniformsGroup(json, "Uniforms");
+        GLint uniformCount = program->getActiveUniformCount();
+        for (int uniformIndex = 0; uniformIndex < uniformCount; ++uniformIndex)
+        {
+            GroupScope uniformGroup(json, "Uniform", uniformIndex);
+
+            constexpr GLsizei kMaxUniformNameLen = 1024;
+            char uniformName[kMaxUniformNameLen] = {};
+            GLint size                           = 0;
+            GLenum type                          = GL_NONE;
+            program->getActiveUniform(uniformIndex, kMaxUniformNameLen, nullptr, &size, &type,
+                                      uniformName);
+
+            json->addCString("Name", uniformName);
+            json->addScalar("Size", size);
+            json->addCString("Type", gl::GLenumToString(gl::GLenumGroup::AttributeType, type));
+
+            const gl::UniformLocation loc = program->getUniformLocation(uniformName);
+
+            if (loc.value == -1)
+            {
+                continue;
+            }
+
+            switch (gl::VariableComponentType(type))
+            {
+                case GL_FLOAT:
+                {
+                    SerializeUniformData<GLfloat>(json, context, program, loc, type, size,
+                                                  &gl::Program::getUniformfv);
+                    break;
+                }
+                case GL_BOOL:
+                case GL_INT:
+                {
+                    SerializeUniformData<GLint>(json, context, program, loc, type, size,
+                                                &gl::Program::getUniformiv);
+                    break;
+                }
+                case GL_UNSIGNED_INT:
+                {
+                    SerializeUniformData<GLuint>(json, context, program, loc, type, size,
+                                                 &gl::Program::getUniformuiv);
+                    break;
+                }
+                default:
+                    UNREACHABLE();
+                    break;
+            }
+        }
+    }
 }
 
-void SerializeImageDesc(JsonSerializer *json, const gl::ImageDesc &imageDesc)
+void SerializeImageDesc(JsonSerializer *json, size_t descIndex, const gl::ImageDesc &imageDesc)
 {
-    GroupScope group(json, "ImageDesc");
+    // Skip serializing unspecified image levels.
+    if (imageDesc.size.empty())
+    {
+        return;
+    }
+
+    GroupScope group(json, "ImageDesc", static_cast<int>(descIndex));
     SerializeExtents(json, imageDesc.size);
-    SerializeFormat(json, imageDesc.format);
+    SerializeGLFormat(json, imageDesc.format);
     json->addScalar("Samples", imageDesc.samples);
     json->addScalar("FixesSampleLocations", imageDesc.fixedSampleLocations);
     json->addCString("InitState", InitStateToString(imageDesc.initState));
@@ -1161,7 +1143,7 @@
 
 void SerializeTextureState(JsonSerializer *json, const gl::TextureState &textureState)
 {
-    json->addCString("Type", TextureTypeToString(textureState.getType()));
+    json->addString("Type", ToString(textureState.getType()));
     SerializeSwizzleState(json, textureState.getSwizzleState());
     {
         GroupScope samplerStateGroup(json, "SamplerState");
@@ -1175,15 +1157,19 @@
     json->addScalar("ImmutableFormat", textureState.getImmutableFormat());
     json->addScalar("ImmutableLevels", textureState.getImmutableLevels());
     json->addScalar("Usage", textureState.getUsage());
-    const std::vector<gl::ImageDesc> &imageDescs = textureState.getImageDescs();
-    for (const gl::ImageDesc &imageDesc : imageDescs)
-    {
-        SerializeImageDesc(json, imageDesc);
-    }
     SerializeRectangle(json, "Crop", textureState.getCrop());
-
     json->addScalar("GenerateMipmapHint", textureState.getGenerateMipmapHint());
     json->addCString("InitState", InitStateToString(textureState.getInitState()));
+    json->addScalar("BoundBufferID", textureState.getBuffer().id().value);
+
+    {
+        GroupScope descGroup(json, "ImageDescs");
+        const std::vector<gl::ImageDesc> &imageDescs = textureState.getImageDescs();
+        for (size_t descIndex = 0; descIndex < imageDescs.size(); ++descIndex)
+        {
+            SerializeImageDesc(json, descIndex, imageDescs[descIndex]);
+        }
+    }
 }
 
 Result SerializeTextureData(JsonSerializer *json,
@@ -1192,8 +1178,8 @@
                             ScratchBuffer *scratchBuffer)
 {
     gl::ImageIndexIterator imageIter = gl::ImageIndexIterator::MakeGeneric(
-        texture->getType(), 0, texture->getMipmapMaxLevel() + 1, gl::ImageIndex::kEntireLevel,
-        gl::ImageIndex::kEntireLevel);
+        texture->getType(), texture->getBaseLevel(), texture->getMipmapMaxLevel() + 1,
+        gl::ImageIndex::kEntireLevel, gl::ImageIndex::kEntireLevel);
     while (imageIter.hasNext())
     {
         gl::ImageIndex index = imageIter.next();
@@ -1208,42 +1194,49 @@
         // Check for supported textures
         ASSERT(index.getType() == gl::TextureType::_2D || index.getType() == gl::TextureType::_3D ||
                index.getType() == gl::TextureType::_2DArray ||
-               index.getType() == gl::TextureType::CubeMap);
+               index.getType() == gl::TextureType::CubeMap ||
+               index.getType() == gl::TextureType::CubeMapArray);
 
-        GLenum getFormat = format.format;
-        GLenum getType   = format.type;
+        GLenum glFormat = format.format;
+        GLenum glType   = format.type;
 
         const gl::Extents size(desc.size.width, desc.size.height, desc.size.depth);
-        const gl::PixelUnpackState &unpack = context->getState().getUnpackState();
+        gl::PixelPackState packState;
+        packState.alignment = 1;
 
         GLuint endByte  = 0;
-        bool unpackSize = format.computePackUnpackEndByte(getType, size, unpack, true, &endByte);
+        bool unpackSize = format.computePackUnpackEndByte(glType, size, packState, true, &endByte);
         ASSERT(unpackSize);
         MemoryBuffer *texelsPtr = nullptr;
         ANGLE_CHECK_GL_ALLOC(const_cast<gl::Context *>(context),
                              scratchBuffer->getInitialized(endByte, &texelsPtr, 0));
 
-        gl::PixelPackState packState;
-        packState.alignment = 1;
+        std::stringstream label;
+
+        label << "Texels-Level" << index.getLevelIndex();
+        if (imageIter.current().hasLayer())
+        {
+            label << "-Layer" << imageIter.current().getLayerIndex();
+        }
 
         if (texture->getState().getInitState() == gl::InitState::Initialized)
         {
             if (format.compressed)
             {
                 // TODO: Read back compressed data. http://anglebug.com/6177
-                json->addCString("Texels", "compressed texel data");
+                json->addCString(label.str(), "compressed texel data");
             }
             else
             {
                 ANGLE_TRY(texture->getTexImage(context, packState, nullptr, index.getTarget(),
-                                               index.getLevelIndex(), getFormat, getType,
+                                               index.getLevelIndex(), glFormat, glType,
                                                texelsPtr->data()));
-                json->addBlob("Texels", texelsPtr->data(), texelsPtr->size());
+                json->addBlob(label.str(), texelsPtr->data(), texelsPtr->size());
             }
         }
         else
         {
-            json->addCString("Texels", "not initialized");
+            json->addCString(label.str(), "not initialized");
         }
     }
     return Result::Continue;
@@ -1255,28 +1248,31 @@
                         gl::Texture *texture)
 {
     GroupScope group(json, "Texture", texture->getId());
+
+    // We serialize texture data first, to force the texture state to be initialized.
+    if (texture->getType() != gl::TextureType::Buffer)
+    {
+        ANGLE_TRY(SerializeTextureData(json, context, texture, scratchBuffer));
+    }
+
     SerializeTextureState(json, texture->getState());
     json->addString("Label", texture->getLabel());
     // FrameCapture can not serialize mBoundSurface and mBoundStream
     // because they are likely to change with each run
-    ANGLE_TRY(SerializeTextureData(json, context, texture, scratchBuffer));
     return Result::Continue;
 }
 
-void SerializeFormat(JsonSerializer *json, const angle::Format *format)
-{
-    json->addScalar("InternalFormat", format->glInternalFormat);
-}
-
 void SerializeVertexAttributeVector(JsonSerializer *json,
                                     const std::vector<gl::VertexAttribute> &vertexAttributes)
 {
-    for (const gl::VertexAttribute &vertexAttribute : vertexAttributes)
+    for (size_t attribIndex = 0; attribIndex < vertexAttributes.size(); ++attribIndex)
     {
-        GroupScope group(json, "VertexAttribute@BindingIndex", vertexAttribute.bindingIndex);
+        GroupScope group(json, "VertexAttribute", static_cast<int>(attribIndex));
+        const gl::VertexAttribute &vertexAttribute = vertexAttributes[attribIndex];
+        json->addScalar("BindingIndex", vertexAttribute.bindingIndex);
         json->addScalar("Enabled", vertexAttribute.enabled);
         ASSERT(vertexAttribute.format);
-        SerializeFormat(json, vertexAttribute.format);
+        SerializeANGLEFormat(json, vertexAttribute.format);
         json->addScalar("RelativeOffset", vertexAttribute.relativeOffset);
         json->addScalar("VertexAttribArrayStride", vertexAttribute.vertexAttribArrayStride);
     }
@@ -1285,9 +1281,10 @@
 void SerializeVertexBindingsVector(JsonSerializer *json,
                                    const std::vector<gl::VertexBinding> &vertexBindings)
 {
-    for (const gl::VertexBinding &vertexBinding : vertexBindings)
+    for (size_t bindingIndex = 0; bindingIndex < vertexBindings.size(); ++bindingIndex)
     {
-        GroupScope group(json, "VertexBinding");
+        GroupScope group(json, "VertexBinding", static_cast<int>(bindingIndex));
+        const gl::VertexBinding &vertexBinding = vertexBindings[bindingIndex];
         json->addScalar("Stride", vertexBinding.getStride());
         json->addScalar("Divisor", vertexBinding.getDivisor());
         json->addScalar("Offset", vertexBinding.getOffset());
@@ -1333,7 +1330,7 @@
 Result SerializeContextToString(const gl::Context *context, std::string *stringOut)
 {
     JsonSerializer json;
-    json.startDocument("Context");
+    json.startGroup("Context");
 
     SerializeContextState(&json, context->getState());
     ScratchBuffer scratchBuffer(1);
@@ -1397,7 +1394,7 @@
         {
             GLuint id               = program.first;
             gl::Program *programPtr = program.second;
-            SerializeProgram(&json, id, programPtr);
+            SerializeProgram(&json, context, id, programPtr);
         }
     }
     {
@@ -1419,7 +1416,7 @@
             SerializeVertexArray(&json, vertexArrayPtr);
         }
     }
-    json.endDocument();
+    json.endGroup();
 
     *stringOut = json.data();
 
diff --git a/src/libANGLE/capture/frame_capture_utils_autogen.cpp b/src/libANGLE/capture/frame_capture_utils_autogen.cpp
index a83b4d4..56eeaf1 100644
--- a/src/libANGLE/capture/frame_capture_utils_autogen.cpp
+++ b/src/libANGLE/capture/frame_capture_utils_autogen.cpp
@@ -18,6 +18,10 @@
 {
     switch (param.type)
     {
+        case ParamType::TAHardwareBufferConstPointer:
+            WriteParamValueReplay<ParamType::TvoidConstPointer>(os, call,
+                                                                param.value.voidConstPointerVal);
+            break;
         case ParamType::TAlphaTestFunc:
             WriteParamValueReplay<ParamType::TAlphaTestFunc>(os, call,
                                                              param.value.AlphaTestFuncVal);
@@ -44,6 +48,10 @@
             WriteParamValueReplay<ParamType::TClientVertexArrayType>(
                 os, call, param.value.ClientVertexArrayTypeVal);
             break;
+        case ParamType::TCompositorTiming:
+            WriteParamValueReplay<ParamType::TCompositorTiming>(os, call,
+                                                                param.value.CompositorTimingVal);
+            break;
         case ParamType::TCullFaceMode:
             WriteParamValueReplay<ParamType::TCullFaceMode>(os, call, param.value.CullFaceModeVal);
             break;
@@ -51,6 +59,90 @@
             WriteParamValueReplay<ParamType::TDrawElementsType>(os, call,
                                                                 param.value.DrawElementsTypeVal);
             break;
+        case ParamType::TEGLAttrib:
+            WriteParamValueReplay<ParamType::TEGLAttrib>(os, call, param.value.EGLAttribVal);
+            break;
+        case ParamType::TEGLClientBuffer:
+            WriteParamValueReplay<ParamType::TEGLClientBuffer>(os, call,
+                                                               param.value.EGLClientBufferVal);
+            break;
+        case ParamType::TEGLConfig:
+            WriteParamValueReplay<ParamType::TEGLConfig>(os, call, param.value.EGLConfigVal);
+            break;
+        case ParamType::TEGLContext:
+            WriteParamValueReplay<ParamType::TEGLContext>(os, call, param.value.EGLContextVal);
+            break;
+        case ParamType::TEGLDEBUGPROCKHR:
+            WriteParamValueReplay<ParamType::TEGLDEBUGPROCKHR>(os, call,
+                                                               param.value.EGLDEBUGPROCKHRVal);
+            break;
+        case ParamType::TEGLDeviceEXT:
+            WriteParamValueReplay<ParamType::TEGLDeviceEXT>(os, call, param.value.EGLDeviceEXTVal);
+            break;
+        case ParamType::TEGLDisplay:
+            WriteParamValueReplay<ParamType::TEGLDisplay>(os, call, param.value.EGLDisplayVal);
+            break;
+        case ParamType::TEGLFrameTokenANGLE:
+            WriteParamValueReplay<ParamType::TEGLFrameTokenANGLE>(
+                os, call, param.value.EGLFrameTokenANGLEVal);
+            break;
+        case ParamType::TEGLGetBlobFuncANDROID:
+            WriteParamValueReplay<ParamType::TEGLGetBlobFuncANDROID>(
+                os, call, param.value.EGLGetBlobFuncANDROIDVal);
+            break;
+        case ParamType::TEGLImage:
+            WriteParamValueReplay<ParamType::TEGLImage>(os, call, param.value.EGLImageVal);
+            break;
+        case ParamType::TEGLLabelKHR:
+            WriteParamValueReplay<ParamType::TEGLLabelKHR>(os, call, param.value.EGLLabelKHRVal);
+            break;
+        case ParamType::TEGLNativeDisplayType:
+            WriteParamValueReplay<ParamType::TEGLNativeDisplayType>(
+                os, call, param.value.EGLNativeDisplayTypeVal);
+            break;
+        case ParamType::TEGLNativePixmapType:
+            WriteParamValueReplay<ParamType::TEGLNativePixmapType>(
+                os, call, param.value.EGLNativePixmapTypeVal);
+            break;
+        case ParamType::TEGLNativeWindowType:
+            WriteParamValueReplay<ParamType::TEGLNativeWindowType>(
+                os, call, param.value.EGLNativeWindowTypeVal);
+            break;
+        case ParamType::TEGLObjectKHR:
+            WriteParamValueReplay<ParamType::TEGLObjectKHR>(os, call, param.value.EGLObjectKHRVal);
+            break;
+        case ParamType::TEGLSetBlobFuncANDROID:
+            WriteParamValueReplay<ParamType::TEGLSetBlobFuncANDROID>(
+                os, call, param.value.EGLSetBlobFuncANDROIDVal);
+            break;
+        case ParamType::TEGLStreamKHR:
+            WriteParamValueReplay<ParamType::TEGLStreamKHR>(os, call, param.value.EGLStreamKHRVal);
+            break;
+        case ParamType::TEGLSurface:
+            WriteParamValueReplay<ParamType::TEGLSurface>(os, call, param.value.EGLSurfaceVal);
+            break;
+        case ParamType::TEGLSync:
+            WriteParamValueReplay<ParamType::TEGLSync>(os, call, param.value.EGLSyncVal);
+            break;
+        case ParamType::TEGLTime:
+            WriteParamValueReplay<ParamType::TEGLTime>(os, call, param.value.EGLTimeVal);
+            break;
+        case ParamType::TEGLTimeKHR:
+            WriteParamValueReplay<ParamType::TEGLTimeKHR>(os, call, param.value.EGLTimeKHRVal);
+            break;
+        case ParamType::TEGLenum:
+            WriteParamValueReplay<ParamType::TEGLenum>(os, call, param.value.EGLenumVal);
+            break;
+        case ParamType::TEGLint:
+            WriteParamValueReplay<ParamType::TEGLint>(os, call, param.value.EGLintVal);
+            break;
+        case ParamType::TEGLnsecsANDROID:
+            WriteParamValueReplay<ParamType::TEGLnsecsANDROID>(os, call,
+                                                               param.value.EGLnsecsANDROIDVal);
+            break;
+        case ParamType::TEGLuint64KHR:
+            WriteParamValueReplay<ParamType::TEGLuint64KHR>(os, call, param.value.EGLuint64KHRVal);
+            break;
         case ParamType::TFenceNVID:
             WriteParamValueReplay<ParamType::TFenceNVID>(os, call, param.value.FenceNVIDVal);
             break;
@@ -305,6 +397,9 @@
             WriteParamValueReplay<ParamType::TvoidConstPointer>(os, call,
                                                                 param.value.voidConstPointerVal);
             break;
+        case ParamType::TObjectType:
+            WriteParamValueReplay<ParamType::TObjectType>(os, call, param.value.ObjectTypeVal);
+            break;
         case ParamType::TPointParameter:
             WriteParamValueReplay<ParamType::TPointParameter>(os, call,
                                                               param.value.PointParameterVal);
@@ -421,6 +516,9 @@
         case ParamType::TTextureType:
             WriteParamValueReplay<ParamType::TTextureType>(os, call, param.value.TextureTypeVal);
             break;
+        case ParamType::TTimestamp:
+            WriteParamValueReplay<ParamType::TTimestamp>(os, call, param.value.TimestampVal);
+            break;
         case ParamType::TTransformFeedbackID:
             WriteParamValueReplay<ParamType::TTransformFeedbackID>(
                 os, call, param.value.TransformFeedbackIDVal);
@@ -457,6 +555,10 @@
             WriteParamValueReplay<ParamType::TVertexAttribType>(os, call,
                                                                 param.value.VertexAttribTypeVal);
             break;
+        case ParamType::TcharConstPointer:
+            WriteParamValueReplay<ParamType::TvoidConstPointer>(os, call,
+                                                                param.value.voidConstPointerVal);
+            break;
         case ParamType::TvoidConstPointer:
             WriteParamValueReplay<ParamType::TvoidConstPointer>(os, call,
                                                                 param.value.voidConstPointerVal);
@@ -483,6 +585,8 @@
 {
     switch (paramType)
     {
+        case ParamType::TAHardwareBufferConstPointer:
+            return "const GLenum *";
         case ParamType::TAlphaTestFunc:
             return "GLenum";
         case ParamType::TBufferBinding:
@@ -497,10 +601,62 @@
             return "GLenum";
         case ParamType::TClientVertexArrayType:
             return "GLenum";
+        case ParamType::TCompositorTiming:
+            return "GLenum";
         case ParamType::TCullFaceMode:
             return "GLenum";
         case ParamType::TDrawElementsType:
             return "GLenum";
+        case ParamType::TEGLAttrib:
+            return "GLenum";
+        case ParamType::TEGLClientBuffer:
+            return "GLenum";
+        case ParamType::TEGLConfig:
+            return "GLenum";
+        case ParamType::TEGLContext:
+            return "GLenum";
+        case ParamType::TEGLDEBUGPROCKHR:
+            return "GLenum";
+        case ParamType::TEGLDeviceEXT:
+            return "GLenum";
+        case ParamType::TEGLDisplay:
+            return "GLenum";
+        case ParamType::TEGLFrameTokenANGLE:
+            return "GLenum";
+        case ParamType::TEGLGetBlobFuncANDROID:
+            return "GLuint";
+        case ParamType::TEGLImage:
+            return "GLenum";
+        case ParamType::TEGLLabelKHR:
+            return "GLenum";
+        case ParamType::TEGLNativeDisplayType:
+            return "GLenum";
+        case ParamType::TEGLNativePixmapType:
+            return "GLenum";
+        case ParamType::TEGLNativeWindowType:
+            return "GLenum";
+        case ParamType::TEGLObjectKHR:
+            return "GLenum";
+        case ParamType::TEGLSetBlobFuncANDROID:
+            return "GLuint";
+        case ParamType::TEGLStreamKHR:
+            return "GLenum";
+        case ParamType::TEGLSurface:
+            return "GLenum";
+        case ParamType::TEGLSync:
+            return "GLenum";
+        case ParamType::TEGLTime:
+            return "GLenum";
+        case ParamType::TEGLTimeKHR:
+            return "GLenum";
+        case ParamType::TEGLenum:
+            return "GLenum";
+        case ParamType::TEGLint:
+            return "GLenum";
+        case ParamType::TEGLnsecsANDROID:
+            return "GLuint";
+        case ParamType::TEGLuint64KHR:
+            return "GLenum";
         case ParamType::TFenceNVID:
             return "GLuint";
         case ParamType::TFenceNVIDConstPointer:
@@ -639,6 +795,8 @@
             return "const GLuint *";
         case ParamType::TMemoryObjectIDPointer:
             return "GLuint *";
+        case ParamType::TObjectType:
+            return "GLenum";
         case ParamType::TPointParameter:
             return "GLenum";
         case ParamType::TPrimitiveMode:
@@ -701,6 +859,8 @@
             return "GLenum";
         case ParamType::TTextureType:
             return "GLenum";
+        case ParamType::TTimestamp:
+            return "GLenum";
         case ParamType::TTransformFeedbackID:
             return "GLuint";
         case ParamType::TTransformFeedbackIDConstPointer:
@@ -719,6 +879,8 @@
             return "GLuint *";
         case ParamType::TVertexAttribType:
             return "GLenum";
+        case ParamType::TcharConstPointer:
+            return "const GLenum *";
         case ParamType::TvoidConstPointer:
             return "const void *";
         case ParamType::TvoidConstPointerPointer:
diff --git a/src/libANGLE/capture/frame_capture_utils_autogen.h b/src/libANGLE/capture/frame_capture_utils_autogen.h
index dfbf991..a1199fe 100644
--- a/src/libANGLE/capture/frame_capture_utils_autogen.h
+++ b/src/libANGLE/capture/frame_capture_utils_autogen.h
@@ -17,6 +17,7 @@
 {
 enum class ParamType
 {
+    TAHardwareBufferConstPointer,
     TAlphaTestFunc,
     TBufferBinding,
     TBufferID,
@@ -24,8 +25,34 @@
     TBufferIDPointer,
     TBufferUsage,
     TClientVertexArrayType,
+    TCompositorTiming,
     TCullFaceMode,
     TDrawElementsType,
+    TEGLAttrib,
+    TEGLClientBuffer,
+    TEGLConfig,
+    TEGLContext,
+    TEGLDEBUGPROCKHR,
+    TEGLDeviceEXT,
+    TEGLDisplay,
+    TEGLFrameTokenANGLE,
+    TEGLGetBlobFuncANDROID,
+    TEGLImage,
+    TEGLLabelKHR,
+    TEGLNativeDisplayType,
+    TEGLNativePixmapType,
+    TEGLNativeWindowType,
+    TEGLObjectKHR,
+    TEGLSetBlobFuncANDROID,
+    TEGLStreamKHR,
+    TEGLSurface,
+    TEGLSync,
+    TEGLTime,
+    TEGLTimeKHR,
+    TEGLenum,
+    TEGLint,
+    TEGLnsecsANDROID,
+    TEGLuint64KHR,
     TFenceNVID,
     TFenceNVIDConstPointer,
     TFenceNVIDPointer,
@@ -95,6 +122,7 @@
     TMemoryObjectID,
     TMemoryObjectIDConstPointer,
     TMemoryObjectIDPointer,
+    TObjectType,
     TPointParameter,
     TPrimitiveMode,
     TProgramPipelineID,
@@ -126,6 +154,7 @@
     TTextureIDPointer,
     TTextureTarget,
     TTextureType,
+    TTimestamp,
     TTransformFeedbackID,
     TTransformFeedbackIDConstPointer,
     TTransformFeedbackIDPointer,
@@ -135,16 +164,18 @@
     TVertexArrayIDConstPointer,
     TVertexArrayIDPointer,
     TVertexAttribType,
+    TcharConstPointer,
     TvoidConstPointer,
     TvoidConstPointerPointer,
     TvoidPointer,
     TvoidPointerPointer,
 };
 
-constexpr uint32_t kParamTypeCount = 122;
+constexpr uint32_t kParamTypeCount = 152;
 
 union ParamValue
 {
+    const AHardwareBuffer *AHardwareBufferConstPointerVal;
     gl::AlphaTestFunc AlphaTestFuncVal;
     gl::BufferBinding BufferBindingVal;
     gl::BufferID BufferIDVal;
@@ -152,8 +183,34 @@
     gl::BufferID *BufferIDPointerVal;
     gl::BufferUsage BufferUsageVal;
     gl::ClientVertexArrayType ClientVertexArrayTypeVal;
+    egl::CompositorTiming CompositorTimingVal;
     gl::CullFaceMode CullFaceModeVal;
     gl::DrawElementsType DrawElementsTypeVal;
+    EGLAttrib EGLAttribVal;
+    EGLClientBuffer EGLClientBufferVal;
+    EGLConfig EGLConfigVal;
+    EGLContext EGLContextVal;
+    EGLDEBUGPROCKHR EGLDEBUGPROCKHRVal;
+    EGLDeviceEXT EGLDeviceEXTVal;
+    EGLDisplay EGLDisplayVal;
+    EGLFrameTokenANGLE EGLFrameTokenANGLEVal;
+    EGLGetBlobFuncANDROID EGLGetBlobFuncANDROIDVal;
+    EGLImage EGLImageVal;
+    EGLLabelKHR EGLLabelKHRVal;
+    EGLNativeDisplayType EGLNativeDisplayTypeVal;
+    EGLNativePixmapType EGLNativePixmapTypeVal;
+    EGLNativeWindowType EGLNativeWindowTypeVal;
+    EGLObjectKHR EGLObjectKHRVal;
+    EGLSetBlobFuncANDROID EGLSetBlobFuncANDROIDVal;
+    EGLStreamKHR EGLStreamKHRVal;
+    EGLSurface EGLSurfaceVal;
+    EGLSync EGLSyncVal;
+    EGLTime EGLTimeVal;
+    EGLTimeKHR EGLTimeKHRVal;
+    EGLenum EGLenumVal;
+    EGLint EGLintVal;
+    EGLnsecsANDROID EGLnsecsANDROIDVal;
+    EGLuint64KHR EGLuint64KHRVal;
     gl::FenceNVID FenceNVIDVal;
     const gl::FenceNVID *FenceNVIDConstPointerVal;
     gl::FenceNVID *FenceNVIDPointerVal;
@@ -223,6 +280,7 @@
     gl::MemoryObjectID MemoryObjectIDVal;
     const gl::MemoryObjectID *MemoryObjectIDConstPointerVal;
     gl::MemoryObjectID *MemoryObjectIDPointerVal;
+    egl::ObjectType ObjectTypeVal;
     gl::PointParameter PointParameterVal;
     gl::PrimitiveMode PrimitiveModeVal;
     gl::ProgramPipelineID ProgramPipelineIDVal;
@@ -254,6 +312,7 @@
     gl::TextureID *TextureIDPointerVal;
     gl::TextureTarget TextureTargetVal;
     gl::TextureType TextureTypeVal;
+    egl::Timestamp TimestampVal;
     gl::TransformFeedbackID TransformFeedbackIDVal;
     const gl::TransformFeedbackID *TransformFeedbackIDConstPointerVal;
     gl::TransformFeedbackID *TransformFeedbackIDPointerVal;
@@ -263,6 +322,7 @@
     const gl::VertexArrayID *VertexArrayIDConstPointerVal;
     gl::VertexArrayID *VertexArrayIDPointerVal;
     gl::VertexAttribType VertexAttribTypeVal;
+    const char *charConstPointerVal;
     const void *voidConstPointerVal;
     const void *const *voidConstPointerPointerVal;
     void *voidPointerVal;
@@ -273,6 +333,13 @@
 T GetParamVal(const ParamValue &value);
 
 template <>
+inline const AHardwareBuffer *GetParamVal<ParamType::TAHardwareBufferConstPointer,
+                                          const AHardwareBuffer *>(const ParamValue &value)
+{
+    return value.AHardwareBufferConstPointerVal;
+}
+
+template <>
 inline gl::AlphaTestFunc GetParamVal<ParamType::TAlphaTestFunc, gl::AlphaTestFunc>(
     const ParamValue &value)
 {
@@ -321,6 +388,13 @@
 }
 
 template <>
+inline egl::CompositorTiming GetParamVal<ParamType::TCompositorTiming, egl::CompositorTiming>(
+    const ParamValue &value)
+{
+    return value.CompositorTimingVal;
+}
+
+template <>
 inline gl::CullFaceMode GetParamVal<ParamType::TCullFaceMode, gl::CullFaceMode>(
     const ParamValue &value)
 {
@@ -335,6 +409,165 @@
 }
 
 template <>
+inline EGLAttrib GetParamVal<ParamType::TEGLAttrib, EGLAttrib>(const ParamValue &value)
+{
+    return value.EGLAttribVal;
+}
+
+template <>
+inline EGLClientBuffer GetParamVal<ParamType::TEGLClientBuffer, EGLClientBuffer>(
+    const ParamValue &value)
+{
+    return value.EGLClientBufferVal;
+}
+
+template <>
+inline EGLConfig GetParamVal<ParamType::TEGLConfig, EGLConfig>(const ParamValue &value)
+{
+    return value.EGLConfigVal;
+}
+
+template <>
+inline EGLContext GetParamVal<ParamType::TEGLContext, EGLContext>(const ParamValue &value)
+{
+    return value.EGLContextVal;
+}
+
+template <>
+inline EGLDEBUGPROCKHR GetParamVal<ParamType::TEGLDEBUGPROCKHR, EGLDEBUGPROCKHR>(
+    const ParamValue &value)
+{
+    return value.EGLDEBUGPROCKHRVal;
+}
+
+template <>
+inline EGLDeviceEXT GetParamVal<ParamType::TEGLDeviceEXT, EGLDeviceEXT>(const ParamValue &value)
+{
+    return value.EGLDeviceEXTVal;
+}
+
+template <>
+inline EGLDisplay GetParamVal<ParamType::TEGLDisplay, EGLDisplay>(const ParamValue &value)
+{
+    return value.EGLDisplayVal;
+}
+
+template <>
+inline EGLFrameTokenANGLE GetParamVal<ParamType::TEGLFrameTokenANGLE, EGLFrameTokenANGLE>(
+    const ParamValue &value)
+{
+    return value.EGLFrameTokenANGLEVal;
+}
+
+template <>
+inline EGLGetBlobFuncANDROID GetParamVal<ParamType::TEGLGetBlobFuncANDROID, EGLGetBlobFuncANDROID>(
+    const ParamValue &value)
+{
+    return value.EGLGetBlobFuncANDROIDVal;
+}
+
+template <>
+inline EGLImage GetParamVal<ParamType::TEGLImage, EGLImage>(const ParamValue &value)
+{
+    return value.EGLImageVal;
+}
+
+template <>
+inline EGLLabelKHR GetParamVal<ParamType::TEGLLabelKHR, EGLLabelKHR>(const ParamValue &value)
+{
+    return value.EGLLabelKHRVal;
+}
+
+template <>
+inline EGLNativeDisplayType GetParamVal<ParamType::TEGLNativeDisplayType, EGLNativeDisplayType>(
+    const ParamValue &value)
+{
+    return value.EGLNativeDisplayTypeVal;
+}
+
+template <>
+inline EGLNativePixmapType GetParamVal<ParamType::TEGLNativePixmapType, EGLNativePixmapType>(
+    const ParamValue &value)
+{
+    return value.EGLNativePixmapTypeVal;
+}
+
+template <>
+inline EGLNativeWindowType GetParamVal<ParamType::TEGLNativeWindowType, EGLNativeWindowType>(
+    const ParamValue &value)
+{
+    return value.EGLNativeWindowTypeVal;
+}
+
+template <>
+inline EGLObjectKHR GetParamVal<ParamType::TEGLObjectKHR, EGLObjectKHR>(const ParamValue &value)
+{
+    return value.EGLObjectKHRVal;
+}
+
+template <>
+inline EGLSetBlobFuncANDROID GetParamVal<ParamType::TEGLSetBlobFuncANDROID, EGLSetBlobFuncANDROID>(
+    const ParamValue &value)
+{
+    return value.EGLSetBlobFuncANDROIDVal;
+}
+
+template <>
+inline EGLStreamKHR GetParamVal<ParamType::TEGLStreamKHR, EGLStreamKHR>(const ParamValue &value)
+{
+    return value.EGLStreamKHRVal;
+}
+
+template <>
+inline EGLSurface GetParamVal<ParamType::TEGLSurface, EGLSurface>(const ParamValue &value)
+{
+    return value.EGLSurfaceVal;
+}
+
+template <>
+inline EGLSync GetParamVal<ParamType::TEGLSync, EGLSync>(const ParamValue &value)
+{
+    return value.EGLSyncVal;
+}
+
+template <>
+inline EGLTime GetParamVal<ParamType::TEGLTime, EGLTime>(const ParamValue &value)
+{
+    return value.EGLTimeVal;
+}
+
+template <>
+inline EGLTimeKHR GetParamVal<ParamType::TEGLTimeKHR, EGLTimeKHR>(const ParamValue &value)
+{
+    return value.EGLTimeKHRVal;
+}
+
+template <>
+inline EGLenum GetParamVal<ParamType::TEGLenum, EGLenum>(const ParamValue &value)
+{
+    return value.EGLenumVal;
+}
+
+template <>
+inline EGLint GetParamVal<ParamType::TEGLint, EGLint>(const ParamValue &value)
+{
+    return value.EGLintVal;
+}
+
+template <>
+inline EGLnsecsANDROID GetParamVal<ParamType::TEGLnsecsANDROID, EGLnsecsANDROID>(
+    const ParamValue &value)
+{
+    return value.EGLnsecsANDROIDVal;
+}
+
+template <>
+inline EGLuint64KHR GetParamVal<ParamType::TEGLuint64KHR, EGLuint64KHR>(const ParamValue &value)
+{
+    return value.EGLuint64KHRVal;
+}
+
+template <>
 inline gl::FenceNVID GetParamVal<ParamType::TFenceNVID, gl::FenceNVID>(const ParamValue &value)
 {
     return value.FenceNVIDVal;
@@ -782,6 +1015,12 @@
 }
 
 template <>
+inline egl::ObjectType GetParamVal<ParamType::TObjectType, egl::ObjectType>(const ParamValue &value)
+{
+    return value.ObjectTypeVal;
+}
+
+template <>
 inline gl::PointParameter GetParamVal<ParamType::TPointParameter, gl::PointParameter>(
     const ParamValue &value)
 {
@@ -995,6 +1234,12 @@
 }
 
 template <>
+inline egl::Timestamp GetParamVal<ParamType::TTimestamp, egl::Timestamp>(const ParamValue &value)
+{
+    return value.TimestampVal;
+}
+
+template <>
 inline gl::TransformFeedbackID
 GetParamVal<ParamType::TTransformFeedbackID, gl::TransformFeedbackID>(const ParamValue &value)
 {
@@ -1059,6 +1304,12 @@
 }
 
 template <>
+inline const char *GetParamVal<ParamType::TcharConstPointer, const char *>(const ParamValue &value)
+{
+    return value.charConstPointerVal;
+}
+
+template <>
 inline const void *GetParamVal<ParamType::TvoidConstPointer, const void *>(const ParamValue &value)
 {
     return value.voidConstPointerVal;
@@ -1095,6 +1346,8 @@
 {
     switch (paramType)
     {
+        case ParamType::TAHardwareBufferConstPointer:
+            return GetParamVal<ParamType::TAHardwareBufferConstPointer, T>(value);
         case ParamType::TAlphaTestFunc:
             return GetParamVal<ParamType::TAlphaTestFunc, T>(value);
         case ParamType::TBufferBinding:
@@ -1109,10 +1362,62 @@
             return GetParamVal<ParamType::TBufferUsage, T>(value);
         case ParamType::TClientVertexArrayType:
             return GetParamVal<ParamType::TClientVertexArrayType, T>(value);
+        case ParamType::TCompositorTiming:
+            return GetParamVal<ParamType::TCompositorTiming, T>(value);
         case ParamType::TCullFaceMode:
             return GetParamVal<ParamType::TCullFaceMode, T>(value);
         case ParamType::TDrawElementsType:
             return GetParamVal<ParamType::TDrawElementsType, T>(value);
+        case ParamType::TEGLAttrib:
+            return GetParamVal<ParamType::TEGLAttrib, T>(value);
+        case ParamType::TEGLClientBuffer:
+            return GetParamVal<ParamType::TEGLClientBuffer, T>(value);
+        case ParamType::TEGLConfig:
+            return GetParamVal<ParamType::TEGLConfig, T>(value);
+        case ParamType::TEGLContext:
+            return GetParamVal<ParamType::TEGLContext, T>(value);
+        case ParamType::TEGLDEBUGPROCKHR:
+            return GetParamVal<ParamType::TEGLDEBUGPROCKHR, T>(value);
+        case ParamType::TEGLDeviceEXT:
+            return GetParamVal<ParamType::TEGLDeviceEXT, T>(value);
+        case ParamType::TEGLDisplay:
+            return GetParamVal<ParamType::TEGLDisplay, T>(value);
+        case ParamType::TEGLFrameTokenANGLE:
+            return GetParamVal<ParamType::TEGLFrameTokenANGLE, T>(value);
+        case ParamType::TEGLGetBlobFuncANDROID:
+            return GetParamVal<ParamType::TEGLGetBlobFuncANDROID, T>(value);
+        case ParamType::TEGLImage:
+            return GetParamVal<ParamType::TEGLImage, T>(value);
+        case ParamType::TEGLLabelKHR:
+            return GetParamVal<ParamType::TEGLLabelKHR, T>(value);
+        case ParamType::TEGLNativeDisplayType:
+            return GetParamVal<ParamType::TEGLNativeDisplayType, T>(value);
+        case ParamType::TEGLNativePixmapType:
+            return GetParamVal<ParamType::TEGLNativePixmapType, T>(value);
+        case ParamType::TEGLNativeWindowType:
+            return GetParamVal<ParamType::TEGLNativeWindowType, T>(value);
+        case ParamType::TEGLObjectKHR:
+            return GetParamVal<ParamType::TEGLObjectKHR, T>(value);
+        case ParamType::TEGLSetBlobFuncANDROID:
+            return GetParamVal<ParamType::TEGLSetBlobFuncANDROID, T>(value);
+        case ParamType::TEGLStreamKHR:
+            return GetParamVal<ParamType::TEGLStreamKHR, T>(value);
+        case ParamType::TEGLSurface:
+            return GetParamVal<ParamType::TEGLSurface, T>(value);
+        case ParamType::TEGLSync:
+            return GetParamVal<ParamType::TEGLSync, T>(value);
+        case ParamType::TEGLTime:
+            return GetParamVal<ParamType::TEGLTime, T>(value);
+        case ParamType::TEGLTimeKHR:
+            return GetParamVal<ParamType::TEGLTimeKHR, T>(value);
+        case ParamType::TEGLenum:
+            return GetParamVal<ParamType::TEGLenum, T>(value);
+        case ParamType::TEGLint:
+            return GetParamVal<ParamType::TEGLint, T>(value);
+        case ParamType::TEGLnsecsANDROID:
+            return GetParamVal<ParamType::TEGLnsecsANDROID, T>(value);
+        case ParamType::TEGLuint64KHR:
+            return GetParamVal<ParamType::TEGLuint64KHR, T>(value);
         case ParamType::TFenceNVID:
             return GetParamVal<ParamType::TFenceNVID, T>(value);
         case ParamType::TFenceNVIDConstPointer:
@@ -1251,6 +1556,8 @@
             return GetParamVal<ParamType::TMemoryObjectIDConstPointer, T>(value);
         case ParamType::TMemoryObjectIDPointer:
             return GetParamVal<ParamType::TMemoryObjectIDPointer, T>(value);
+        case ParamType::TObjectType:
+            return GetParamVal<ParamType::TObjectType, T>(value);
         case ParamType::TPointParameter:
             return GetParamVal<ParamType::TPointParameter, T>(value);
         case ParamType::TPrimitiveMode:
@@ -1313,6 +1620,8 @@
             return GetParamVal<ParamType::TTextureTarget, T>(value);
         case ParamType::TTextureType:
             return GetParamVal<ParamType::TTextureType, T>(value);
+        case ParamType::TTimestamp:
+            return GetParamVal<ParamType::TTimestamp, T>(value);
         case ParamType::TTransformFeedbackID:
             return GetParamVal<ParamType::TTransformFeedbackID, T>(value);
         case ParamType::TTransformFeedbackIDConstPointer:
@@ -1331,6 +1640,8 @@
             return GetParamVal<ParamType::TVertexArrayIDPointer, T>(value);
         case ParamType::TVertexAttribType:
             return GetParamVal<ParamType::TVertexAttribType, T>(value);
+        case ParamType::TcharConstPointer:
+            return GetParamVal<ParamType::TcharConstPointer, T>(value);
         case ParamType::TvoidConstPointer:
             return GetParamVal<ParamType::TvoidConstPointer, T>(value);
         case ParamType::TvoidConstPointerPointer:
@@ -1346,6 +1657,13 @@
 void SetParamVal(T valueIn, ParamValue *valueOut);
 
 template <>
+inline void SetParamVal<ParamType::TAHardwareBufferConstPointer>(const AHardwareBuffer *valueIn,
+                                                                 ParamValue *valueOut)
+{
+    valueOut->AHardwareBufferConstPointerVal = valueIn;
+}
+
+template <>
 inline void SetParamVal<ParamType::TAlphaTestFunc>(gl::AlphaTestFunc valueIn, ParamValue *valueOut)
 {
     valueOut->AlphaTestFuncVal = valueIn;
@@ -1390,6 +1708,13 @@
 }
 
 template <>
+inline void SetParamVal<ParamType::TCompositorTiming>(egl::CompositorTiming valueIn,
+                                                      ParamValue *valueOut)
+{
+    valueOut->CompositorTimingVal = valueIn;
+}
+
+template <>
 inline void SetParamVal<ParamType::TCullFaceMode>(gl::CullFaceMode valueIn, ParamValue *valueOut)
 {
     valueOut->CullFaceModeVal = valueIn;
@@ -1403,6 +1728,162 @@
 }
 
 template <>
+inline void SetParamVal<ParamType::TEGLAttrib>(EGLAttrib valueIn, ParamValue *valueOut)
+{
+    valueOut->EGLAttribVal = valueIn;
+}
+
+template <>
+inline void SetParamVal<ParamType::TEGLClientBuffer>(EGLClientBuffer valueIn, ParamValue *valueOut)
+{
+    valueOut->EGLClientBufferVal = valueIn;
+}
+
+template <>
+inline void SetParamVal<ParamType::TEGLConfig>(EGLConfig valueIn, ParamValue *valueOut)
+{
+    valueOut->EGLConfigVal = valueIn;
+}
+
+template <>
+inline void SetParamVal<ParamType::TEGLContext>(EGLContext valueIn, ParamValue *valueOut)
+{
+    valueOut->EGLContextVal = valueIn;
+}
+
+template <>
+inline void SetParamVal<ParamType::TEGLDEBUGPROCKHR>(EGLDEBUGPROCKHR valueIn, ParamValue *valueOut)
+{
+    valueOut->EGLDEBUGPROCKHRVal = valueIn;
+}
+
+template <>
+inline void SetParamVal<ParamType::TEGLDeviceEXT>(EGLDeviceEXT valueIn, ParamValue *valueOut)
+{
+    valueOut->EGLDeviceEXTVal = valueIn;
+}
+
+template <>
+inline void SetParamVal<ParamType::TEGLDisplay>(EGLDisplay valueIn, ParamValue *valueOut)
+{
+    valueOut->EGLDisplayVal = valueIn;
+}
+
+template <>
+inline void SetParamVal<ParamType::TEGLFrameTokenANGLE>(EGLFrameTokenANGLE valueIn,
+                                                        ParamValue *valueOut)
+{
+    valueOut->EGLFrameTokenANGLEVal = valueIn;
+}
+
+template <>
+inline void SetParamVal<ParamType::TEGLGetBlobFuncANDROID>(EGLGetBlobFuncANDROID valueIn,
+                                                           ParamValue *valueOut)
+{
+    valueOut->EGLGetBlobFuncANDROIDVal = valueIn;
+}
+
+template <>
+inline void SetParamVal<ParamType::TEGLImage>(EGLImage valueIn, ParamValue *valueOut)
+{
+    valueOut->EGLImageVal = valueIn;
+}
+
+template <>
+inline void SetParamVal<ParamType::TEGLLabelKHR>(EGLLabelKHR valueIn, ParamValue *valueOut)
+{
+    valueOut->EGLLabelKHRVal = valueIn;
+}
+
+template <>
+inline void SetParamVal<ParamType::TEGLNativeDisplayType>(EGLNativeDisplayType valueIn,
+                                                          ParamValue *valueOut)
+{
+    valueOut->EGLNativeDisplayTypeVal = valueIn;
+}
+
+template <>
+inline void SetParamVal<ParamType::TEGLNativePixmapType>(EGLNativePixmapType valueIn,
+                                                         ParamValue *valueOut)
+{
+    valueOut->EGLNativePixmapTypeVal = valueIn;
+}
+
+template <>
+inline void SetParamVal<ParamType::TEGLNativeWindowType>(EGLNativeWindowType valueIn,
+                                                         ParamValue *valueOut)
+{
+    valueOut->EGLNativeWindowTypeVal = valueIn;
+}
+
+template <>
+inline void SetParamVal<ParamType::TEGLObjectKHR>(EGLObjectKHR valueIn, ParamValue *valueOut)
+{
+    valueOut->EGLObjectKHRVal = valueIn;
+}
+
+template <>
+inline void SetParamVal<ParamType::TEGLSetBlobFuncANDROID>(EGLSetBlobFuncANDROID valueIn,
+                                                           ParamValue *valueOut)
+{
+    valueOut->EGLSetBlobFuncANDROIDVal = valueIn;
+}
+
+template <>
+inline void SetParamVal<ParamType::TEGLStreamKHR>(EGLStreamKHR valueIn, ParamValue *valueOut)
+{
+    valueOut->EGLStreamKHRVal = valueIn;
+}
+
+template <>
+inline void SetParamVal<ParamType::TEGLSurface>(EGLSurface valueIn, ParamValue *valueOut)
+{
+    valueOut->EGLSurfaceVal = valueIn;
+}
+
+template <>
+inline void SetParamVal<ParamType::TEGLSync>(EGLSync valueIn, ParamValue *valueOut)
+{
+    valueOut->EGLSyncVal = valueIn;
+}
+
+template <>
+inline void SetParamVal<ParamType::TEGLTime>(EGLTime valueIn, ParamValue *valueOut)
+{
+    valueOut->EGLTimeVal = valueIn;
+}
+
+template <>
+inline void SetParamVal<ParamType::TEGLTimeKHR>(EGLTimeKHR valueIn, ParamValue *valueOut)
+{
+    valueOut->EGLTimeKHRVal = valueIn;
+}
+
+template <>
+inline void SetParamVal<ParamType::TEGLenum>(EGLenum valueIn, ParamValue *valueOut)
+{
+    valueOut->EGLenumVal = valueIn;
+}
+
+template <>
+inline void SetParamVal<ParamType::TEGLint>(EGLint valueIn, ParamValue *valueOut)
+{
+    valueOut->EGLintVal = valueIn;
+}
+
+template <>
+inline void SetParamVal<ParamType::TEGLnsecsANDROID>(EGLnsecsANDROID valueIn, ParamValue *valueOut)
+{
+    valueOut->EGLnsecsANDROIDVal = valueIn;
+}
+
+template <>
+inline void SetParamVal<ParamType::TEGLuint64KHR>(EGLuint64KHR valueIn, ParamValue *valueOut)
+{
+    valueOut->EGLuint64KHRVal = valueIn;
+}
+
+template <>
 inline void SetParamVal<ParamType::TFenceNVID>(gl::FenceNVID valueIn, ParamValue *valueOut)
 {
     valueOut->FenceNVIDVal = valueIn;
@@ -1841,6 +2322,12 @@
 }
 
 template <>
+inline void SetParamVal<ParamType::TObjectType>(egl::ObjectType valueIn, ParamValue *valueOut)
+{
+    valueOut->ObjectTypeVal = valueIn;
+}
+
+template <>
 inline void SetParamVal<ParamType::TPointParameter>(gl::PointParameter valueIn,
                                                     ParamValue *valueOut)
 {
@@ -2047,6 +2534,12 @@
 }
 
 template <>
+inline void SetParamVal<ParamType::TTimestamp>(egl::Timestamp valueIn, ParamValue *valueOut)
+{
+    valueOut->TimestampVal = valueIn;
+}
+
+template <>
 inline void SetParamVal<ParamType::TTransformFeedbackID>(gl::TransformFeedbackID valueIn,
                                                          ParamValue *valueOut)
 {
@@ -2110,6 +2603,12 @@
 }
 
 template <>
+inline void SetParamVal<ParamType::TcharConstPointer>(const char *valueIn, ParamValue *valueOut)
+{
+    valueOut->charConstPointerVal = valueIn;
+}
+
+template <>
 inline void SetParamVal<ParamType::TvoidConstPointer>(const void *valueIn, ParamValue *valueOut)
 {
     valueOut->voidConstPointerVal = valueIn;
@@ -2145,6 +2644,9 @@
 {
     switch (paramType)
     {
+        case ParamType::TAHardwareBufferConstPointer:
+            SetParamVal<ParamType::TAHardwareBufferConstPointer>(valueIn, valueOut);
+            break;
         case ParamType::TAlphaTestFunc:
             SetParamVal<ParamType::TAlphaTestFunc>(valueIn, valueOut);
             break;
@@ -2166,12 +2668,90 @@
         case ParamType::TClientVertexArrayType:
             SetParamVal<ParamType::TClientVertexArrayType>(valueIn, valueOut);
             break;
+        case ParamType::TCompositorTiming:
+            SetParamVal<ParamType::TCompositorTiming>(valueIn, valueOut);
+            break;
         case ParamType::TCullFaceMode:
             SetParamVal<ParamType::TCullFaceMode>(valueIn, valueOut);
             break;
         case ParamType::TDrawElementsType:
             SetParamVal<ParamType::TDrawElementsType>(valueIn, valueOut);
             break;
+        case ParamType::TEGLAttrib:
+            SetParamVal<ParamType::TEGLAttrib>(valueIn, valueOut);
+            break;
+        case ParamType::TEGLClientBuffer:
+            SetParamVal<ParamType::TEGLClientBuffer>(valueIn, valueOut);
+            break;
+        case ParamType::TEGLConfig:
+            SetParamVal<ParamType::TEGLConfig>(valueIn, valueOut);
+            break;
+        case ParamType::TEGLContext:
+            SetParamVal<ParamType::TEGLContext>(valueIn, valueOut);
+            break;
+        case ParamType::TEGLDEBUGPROCKHR:
+            SetParamVal<ParamType::TEGLDEBUGPROCKHR>(valueIn, valueOut);
+            break;
+        case ParamType::TEGLDeviceEXT:
+            SetParamVal<ParamType::TEGLDeviceEXT>(valueIn, valueOut);
+            break;
+        case ParamType::TEGLDisplay:
+            SetParamVal<ParamType::TEGLDisplay>(valueIn, valueOut);
+            break;
+        case ParamType::TEGLFrameTokenANGLE:
+            SetParamVal<ParamType::TEGLFrameTokenANGLE>(valueIn, valueOut);
+            break;
+        case ParamType::TEGLGetBlobFuncANDROID:
+            SetParamVal<ParamType::TEGLGetBlobFuncANDROID>(valueIn, valueOut);
+            break;
+        case ParamType::TEGLImage:
+            SetParamVal<ParamType::TEGLImage>(valueIn, valueOut);
+            break;
+        case ParamType::TEGLLabelKHR:
+            SetParamVal<ParamType::TEGLLabelKHR>(valueIn, valueOut);
+            break;
+        case ParamType::TEGLNativeDisplayType:
+            SetParamVal<ParamType::TEGLNativeDisplayType>(valueIn, valueOut);
+            break;
+        case ParamType::TEGLNativePixmapType:
+            SetParamVal<ParamType::TEGLNativePixmapType>(valueIn, valueOut);
+            break;
+        case ParamType::TEGLNativeWindowType:
+            SetParamVal<ParamType::TEGLNativeWindowType>(valueIn, valueOut);
+            break;
+        case ParamType::TEGLObjectKHR:
+            SetParamVal<ParamType::TEGLObjectKHR>(valueIn, valueOut);
+            break;
+        case ParamType::TEGLSetBlobFuncANDROID:
+            SetParamVal<ParamType::TEGLSetBlobFuncANDROID>(valueIn, valueOut);
+            break;
+        case ParamType::TEGLStreamKHR:
+            SetParamVal<ParamType::TEGLStreamKHR>(valueIn, valueOut);
+            break;
+        case ParamType::TEGLSurface:
+            SetParamVal<ParamType::TEGLSurface>(valueIn, valueOut);
+            break;
+        case ParamType::TEGLSync:
+            SetParamVal<ParamType::TEGLSync>(valueIn, valueOut);
+            break;
+        case ParamType::TEGLTime:
+            SetParamVal<ParamType::TEGLTime>(valueIn, valueOut);
+            break;
+        case ParamType::TEGLTimeKHR:
+            SetParamVal<ParamType::TEGLTimeKHR>(valueIn, valueOut);
+            break;
+        case ParamType::TEGLenum:
+            SetParamVal<ParamType::TEGLenum>(valueIn, valueOut);
+            break;
+        case ParamType::TEGLint:
+            SetParamVal<ParamType::TEGLint>(valueIn, valueOut);
+            break;
+        case ParamType::TEGLnsecsANDROID:
+            SetParamVal<ParamType::TEGLnsecsANDROID>(valueIn, valueOut);
+            break;
+        case ParamType::TEGLuint64KHR:
+            SetParamVal<ParamType::TEGLuint64KHR>(valueIn, valueOut);
+            break;
         case ParamType::TFenceNVID:
             SetParamVal<ParamType::TFenceNVID>(valueIn, valueOut);
             break;
@@ -2379,6 +2959,9 @@
         case ParamType::TMemoryObjectIDPointer:
             SetParamVal<ParamType::TMemoryObjectIDPointer>(valueIn, valueOut);
             break;
+        case ParamType::TObjectType:
+            SetParamVal<ParamType::TObjectType>(valueIn, valueOut);
+            break;
         case ParamType::TPointParameter:
             SetParamVal<ParamType::TPointParameter>(valueIn, valueOut);
             break;
@@ -2472,6 +3055,9 @@
         case ParamType::TTextureType:
             SetParamVal<ParamType::TTextureType>(valueIn, valueOut);
             break;
+        case ParamType::TTimestamp:
+            SetParamVal<ParamType::TTimestamp>(valueIn, valueOut);
+            break;
         case ParamType::TTransformFeedbackID:
             SetParamVal<ParamType::TTransformFeedbackID>(valueIn, valueOut);
             break;
@@ -2499,6 +3085,9 @@
         case ParamType::TVertexAttribType:
             SetParamVal<ParamType::TVertexAttribType>(valueIn, valueOut);
             break;
+        case ParamType::TcharConstPointer:
+            SetParamVal<ParamType::TcharConstPointer>(valueIn, valueOut);
+            break;
         case ParamType::TvoidConstPointer:
             SetParamVal<ParamType::TvoidConstPointer>(valueIn, valueOut);
             break;
@@ -2541,6 +3130,88 @@
 
 ResourceIDType GetResourceIDTypeFromParamType(ParamType paramType);
 const char *GetResourceIDTypeName(ResourceIDType resourceIDType);
+
+template <typename ResourceType>
+struct GetResourceIDTypeFromType;
+
+template <>
+struct GetResourceIDTypeFromType<gl::BufferID>
+{
+    static constexpr ResourceIDType IDType = ResourceIDType::Buffer;
+};
+
+template <>
+struct GetResourceIDTypeFromType<gl::FenceNVID>
+{
+    static constexpr ResourceIDType IDType = ResourceIDType::FenceNV;
+};
+
+template <>
+struct GetResourceIDTypeFromType<gl::FramebufferID>
+{
+    static constexpr ResourceIDType IDType = ResourceIDType::Framebuffer;
+};
+
+template <>
+struct GetResourceIDTypeFromType<gl::MemoryObjectID>
+{
+    static constexpr ResourceIDType IDType = ResourceIDType::MemoryObject;
+};
+
+template <>
+struct GetResourceIDTypeFromType<gl::ProgramPipelineID>
+{
+    static constexpr ResourceIDType IDType = ResourceIDType::ProgramPipeline;
+};
+
+template <>
+struct GetResourceIDTypeFromType<gl::QueryID>
+{
+    static constexpr ResourceIDType IDType = ResourceIDType::Query;
+};
+
+template <>
+struct GetResourceIDTypeFromType<gl::RenderbufferID>
+{
+    static constexpr ResourceIDType IDType = ResourceIDType::Renderbuffer;
+};
+
+template <>
+struct GetResourceIDTypeFromType<gl::SamplerID>
+{
+    static constexpr ResourceIDType IDType = ResourceIDType::Sampler;
+};
+
+template <>
+struct GetResourceIDTypeFromType<gl::SemaphoreID>
+{
+    static constexpr ResourceIDType IDType = ResourceIDType::Semaphore;
+};
+
+template <>
+struct GetResourceIDTypeFromType<gl::ShaderProgramID>
+{
+    static constexpr ResourceIDType IDType = ResourceIDType::ShaderProgram;
+};
+
+template <>
+struct GetResourceIDTypeFromType<gl::TextureID>
+{
+    static constexpr ResourceIDType IDType = ResourceIDType::Texture;
+};
+
+template <>
+struct GetResourceIDTypeFromType<gl::TransformFeedbackID>
+{
+    static constexpr ResourceIDType IDType = ResourceIDType::TransformFeedback;
+};
+
+template <>
+struct GetResourceIDTypeFromType<gl::VertexArrayID>
+{
+    static constexpr ResourceIDType IDType = ResourceIDType::VertexArray;
+};
+
 }  // namespace angle
 
 #endif  // LIBANGLE_FRAME_CAPTURE_UTILS_AUTOGEN_H_
diff --git a/src/libANGLE/capture/gl_enum_utils.cpp b/src/libANGLE/capture/gl_enum_utils.cpp
index 3e03997..8f3011e 100644
--- a/src/libANGLE/capture/gl_enum_utils.cpp
+++ b/src/libANGLE/capture/gl_enum_utils.cpp
@@ -90,4 +90,9 @@
 
     return st.str();
 }
+
+const char *GLinternalFormatToString(unsigned int format)
+{
+    return GLenumToString(gl::GLenumGroup::InternalFormat, format);
+}
 }  // namespace gl
diff --git a/src/libANGLE/capture/gl_enum_utils.h b/src/libANGLE/capture/gl_enum_utils.h
index 08e4f17..39ec037 100644
--- a/src/libANGLE/capture/gl_enum_utils.h
+++ b/src/libANGLE/capture/gl_enum_utils.h
@@ -21,6 +21,7 @@
 std::string GLbitfieldToString(GLenumGroup enumGroup, unsigned int value);
 void OutputGLenumString(std::ostream &out, GLenumGroup enumGroup, unsigned int value);
 void OutputGLbitfieldString(std::ostream &out, GLenumGroup enumGroup, unsigned int value);
+const char *GLinternalFormatToString(unsigned int format);
 
 extern const char kUnknownGLenumString[];
 }  // namespace gl
diff --git a/src/libANGLE/capture/gl_enum_utils_autogen.cpp b/src/libANGLE/capture/gl_enum_utils_autogen.cpp
index 77168cb..633905e 100644
--- a/src/libANGLE/capture/gl_enum_utils_autogen.cpp
+++ b/src/libANGLE/capture/gl_enum_utils_autogen.cpp
@@ -535,6 +535,8 @@
                     return "GL_CONTEXT_FLAG_DEBUG_BIT";
                 case 0x4:
                     return "GL_CONTEXT_FLAG_ROBUST_ACCESS_BIT";
+                case 0x10:
+                    return "GL_CONTEXT_FLAG_PROTECTED_CONTENT_BIT_EXT";
                 default:
                     return UnknownGLenumToString(value);
             }
@@ -1173,6 +1175,8 @@
                     return "GL_POINT_SIZE_ARRAY_BUFFER_BINDING_OES";
                 case 0x8BE7:
                     return "GL_SAMPLER_EXTERNAL_2D_Y2Y_EXT";
+                case 0x8BFA:
+                    return "GL_TEXTURE_PROTECTED_EXT";
                 case 0x8C10:
                     return "GL_TEXTURE_RED_TYPE";
                 case 0x8C11:
@@ -2586,6 +2590,22 @@
                     return "GL_RGB16F";
                 case 0x88F0:
                     return "GL_DEPTH24_STENCIL8";
+                case 0x8A54:
+                    return "GL_COMPRESSED_SRGB_PVRTC_2BPPV1_EXT";
+                case 0x8A55:
+                    return "GL_COMPRESSED_SRGB_PVRTC_4BPPV1_EXT";
+                case 0x8A56:
+                    return "GL_COMPRESSED_SRGB_ALPHA_PVRTC_2BPPV1_EXT";
+                case 0x8A57:
+                    return "GL_COMPRESSED_SRGB_ALPHA_PVRTC_4BPPV1_EXT";
+                case 0x8C00:
+                    return "GL_COMPRESSED_RGB_PVRTC_4BPPV1_IMG";
+                case 0x8C01:
+                    return "GL_COMPRESSED_RGB_PVRTC_2BPPV1_IMG";
+                case 0x8C02:
+                    return "GL_COMPRESSED_RGBA_PVRTC_4BPPV1_IMG";
+                case 0x8C03:
+                    return "GL_COMPRESSED_RGBA_PVRTC_2BPPV1_IMG";
                 case 0x8C3A:
                     return "GL_R11F_G11F_B10F";
                 case 0x8C3D:
@@ -2662,6 +2682,10 @@
                     return "GL_RGBA8_SNORM";
                 case 0x906F:
                     return "GL_RGB10_A2UI";
+                case 0x9137:
+                    return "GL_COMPRESSED_RGBA_PVRTC_2BPPV2_IMG";
+                case 0x9138:
+                    return "GL_COMPRESSED_RGBA_PVRTC_4BPPV2_IMG";
                 case 0x9270:
                     return "GL_COMPRESSED_R11_EAC";
                 case 0x9271:
@@ -2682,6 +2706,66 @@
                     return "GL_COMPRESSED_RGBA8_ETC2_EAC";
                 case 0x9279:
                     return "GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC";
+                case 0x93B0:
+                    return "GL_COMPRESSED_RGBA_ASTC_4x4_KHR";
+                case 0x93B1:
+                    return "GL_COMPRESSED_RGBA_ASTC_5x4_KHR";
+                case 0x93B2:
+                    return "GL_COMPRESSED_RGBA_ASTC_5x5_KHR";
+                case 0x93B3:
+                    return "GL_COMPRESSED_RGBA_ASTC_6x5_KHR";
+                case 0x93B4:
+                    return "GL_COMPRESSED_RGBA_ASTC_6x6_KHR";
+                case 0x93B5:
+                    return "GL_COMPRESSED_RGBA_ASTC_8x5_KHR";
+                case 0x93B6:
+                    return "GL_COMPRESSED_RGBA_ASTC_8x6_KHR";
+                case 0x93B7:
+                    return "GL_COMPRESSED_RGBA_ASTC_8x8_KHR";
+                case 0x93B8:
+                    return "GL_COMPRESSED_RGBA_ASTC_10x5_KHR";
+                case 0x93B9:
+                    return "GL_COMPRESSED_RGBA_ASTC_10x6_KHR";
+                case 0x93BA:
+                    return "GL_COMPRESSED_RGBA_ASTC_10x8_KHR";
+                case 0x93BB:
+                    return "GL_COMPRESSED_RGBA_ASTC_10x10_KHR";
+                case 0x93BC:
+                    return "GL_COMPRESSED_RGBA_ASTC_12x10_KHR";
+                case 0x93BD:
+                    return "GL_COMPRESSED_RGBA_ASTC_12x12_KHR";
+                case 0x93D0:
+                    return "GL_COMPRESSED_SRGB8_ALPHA8_ASTC_4x4_KHR";
+                case 0x93D1:
+                    return "GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x4_KHR";
+                case 0x93D2:
+                    return "GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x5_KHR";
+                case 0x93D3:
+                    return "GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x5_KHR";
+                case 0x93D4:
+                    return "GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x6_KHR";
+                case 0x93D5:
+                    return "GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x5_KHR";
+                case 0x93D6:
+                    return "GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x6_KHR";
+                case 0x93D7:
+                    return "GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x8_KHR";
+                case 0x93D8:
+                    return "GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x5_KHR";
+                case 0x93D9:
+                    return "GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x6_KHR";
+                case 0x93DA:
+                    return "GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x8_KHR";
+                case 0x93DB:
+                    return "GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x10_KHR";
+                case 0x93DC:
+                    return "GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x10_KHR";
+                case 0x93DD:
+                    return "GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x12_KHR";
+                case 0x93F0:
+                    return "GL_COMPRESSED_SRGB_ALPHA_PVRTC_2BPPV2_IMG";
+                case 0x93F1:
+                    return "GL_COMPRESSED_SRGB_ALPHA_PVRTC_4BPPV2_IMG";
                 default:
                     return UnknownGLenumToString(value);
             }
diff --git a/src/libANGLE/capture/trace_fixture.cpp b/src/libANGLE/capture/trace_fixture.cpp
index 3ecb0e3..6196544 100644
--- a/src/libANGLE/capture/trace_fixture.cpp
+++ b/src/libANGLE/capture/trace_fixture.cpp
@@ -20,6 +20,13 @@
     (*resourceMap)[id] = returnedID;
 }
 
+void UpdateResourceMap2(GLuint *resourceMap, GLuint id, GLsizei readBufferOffset)
+{
+    GLuint returnedID;
+    memcpy(&returnedID, &gReadBuffer[readBufferOffset], sizeof(GLuint));
+    resourceMap[id] = returnedID;
+}
+
 DecompressCallback gDecompressCallback;
 const char *gBinaryDataDir = ".";
 
@@ -64,20 +71,54 @@
     }
     fclose(fp);
 }
+
+ValidateSerializedStateCallback gValidateSerializedStateCallback;
+std::unordered_map<GLuint, std::vector<GLint>> gInternalUniformLocationsMap;
 }  // namespace
 
 LocationsMap gUniformLocations;
+GLint **gUniformLocations2;
 BlockIndexesMap gUniformBlockIndexes;
 GLuint gCurrentProgram = 0;
 
+// TODO (http://anglebug.com/6234): Remove three parameter UpdateUniformLocation on next retrace
 void UpdateUniformLocation(GLuint program, const char *name, GLint location)
 {
     gUniformLocations[program][location] = glGetUniformLocation(program, name);
 }
+
+void UpdateUniformLocation(GLuint program, const char *name, GLint location, GLint count)
+{
+    for (GLint i = 0; i < count; i++)
+    {
+        gUniformLocations[program][location + i] = glGetUniformLocation(program, name) + i;
+    }
+}
+
+void UpdateUniformLocation2(GLuint program, const char *name, GLint location, GLint count)
+{
+    std::vector<GLint> &programLocations = gInternalUniformLocationsMap[program];
+    if (static_cast<GLint>(programLocations.size()) < location + count)
+    {
+        programLocations.resize(location + count, 0);
+    }
+    for (GLint arrayIndex = 0; arrayIndex < count; ++arrayIndex)
+    {
+        programLocations[location + arrayIndex] = glGetUniformLocation(program, name) + arrayIndex;
+    }
+    gUniformLocations2[program] = programLocations.data();
+}
+
 void DeleteUniformLocations(GLuint program)
 {
     gUniformLocations.erase(program);
 }
+
+void DeleteUniformLocations2(GLuint program)
+{
+    // No-op. We leave uniform locations around so deleted current programs can still use them.
+}
+
 void UpdateUniformBlockIndex(GLuint program, const char *name, GLuint index)
 {
     gUniformBlockIndexes[program][index] = glGetUniformBlockIndex(program, name);
@@ -104,6 +145,21 @@
 ResourceMap gTransformFeedbackMap;
 ResourceMap gVertexArrayMap;
 SyncResourceMap gSyncMap;
+ContextMap gContextMap;
+
+GLuint *gBufferMap2;
+GLuint *gFenceNVMap2;
+GLuint *gFramebufferMap2;
+GLuint *gMemoryObjectMap2;
+GLuint *gProgramPipelineMap2;
+GLuint *gQueryMap2;
+GLuint *gRenderbufferMap2;
+GLuint *gSamplerMap2;
+GLuint *gSemaphoreMap2;
+GLuint *gShaderProgramMap2;
+GLuint *gTextureMap2;
+GLuint *gTransformFeedbackMap2;
+GLuint *gVertexArrayMap2;
 
 void SetBinaryDataDecompressCallback(DecompressCallback callback)
 {
@@ -129,6 +185,50 @@
     gReadBuffer = new uint8_t[readBufferSize];
 }
 
+GLuint *AllocateZeroedUints(size_t count)
+{
+    GLuint *mem = new GLuint[count + 1];
+    memset(mem, 0, sizeof(GLuint) * (count + 1));
+    return mem;
+}
+
+void InitializeReplay2(const char *binaryDataFileName,
+                       size_t maxClientArraySize,
+                       size_t readBufferSize,
+                       uint32_t maxBuffer,
+                       uint32_t maxFenceNV,
+                       uint32_t maxFramebuffer,
+                       uint32_t maxMemoryObject,
+                       uint32_t maxProgramPipeline,
+                       uint32_t maxQuery,
+                       uint32_t maxRenderbuffer,
+                       uint32_t maxSampler,
+                       uint32_t maxSemaphore,
+                       uint32_t maxShaderProgram,
+                       uint32_t maxTexture,
+                       uint32_t maxTransformFeedback,
+                       uint32_t maxVertexArray)
+{
+    InitializeReplay(binaryDataFileName, maxClientArraySize, readBufferSize);
+
+    gBufferMap2            = AllocateZeroedUints(maxBuffer);
+    gFenceNVMap2           = AllocateZeroedUints(maxFenceNV);
+    gFramebufferMap2       = AllocateZeroedUints(maxFramebuffer);
+    gMemoryObjectMap2      = AllocateZeroedUints(maxMemoryObject);
+    gProgramPipelineMap2   = AllocateZeroedUints(maxProgramPipeline);
+    gQueryMap2             = AllocateZeroedUints(maxQuery);
+    gRenderbufferMap2      = AllocateZeroedUints(maxRenderbuffer);
+    gSamplerMap2           = AllocateZeroedUints(maxSampler);
+    gSemaphoreMap2         = AllocateZeroedUints(maxSemaphore);
+    gShaderProgramMap2     = AllocateZeroedUints(maxShaderProgram);
+    gTextureMap2           = AllocateZeroedUints(maxTexture);
+    gTransformFeedbackMap2 = AllocateZeroedUints(maxTransformFeedback);
+    gVertexArrayMap2       = AllocateZeroedUints(maxVertexArray);
+
+    gUniformLocations2 = new GLint *[maxShaderProgram + 1];
+    memset(gUniformLocations2, 0, sizeof(GLint *) * (maxShaderProgram + 1));
+}
+
 void FinishReplay()
 {
     for (uint8_t *&clientArray : gClientArrays)
@@ -136,6 +236,25 @@
         delete[] clientArray;
     }
     delete[] gReadBuffer;
+
+    delete[] gBufferMap2;
+    delete[] gRenderbufferMap2;
+    delete[] gTextureMap2;
+    delete[] gFramebufferMap2;
+    delete[] gShaderProgramMap2;
+    delete[] gFenceNVMap2;
+    delete[] gMemoryObjectMap2;
+    delete[] gProgramPipelineMap2;
+    delete[] gQueryMap2;
+    delete[] gSamplerMap2;
+    delete[] gSemaphoreMap2;
+    delete[] gTransformFeedbackMap2;
+    delete[] gVertexArrayMap2;
+}
+
+void SetValidateSerializedStateCallback(ValidateSerializedStateCallback callback)
+{
+    gValidateSerializedStateCallback = callback;
 }
 
 void UpdateClientArrayPointer(int arrayIndex, const void *data, uint64_t size)
@@ -149,6 +268,11 @@
     memcpy(gMappedBufferData[gBufferMap[bufferID]], source, size);
 }
 
+void UpdateClientBufferData2(GLuint bufferID, const void *source, GLsizei size)
+{
+    memcpy(gMappedBufferData[gBufferMap2[bufferID]], source, size);
+}
+
 void UpdateBufferID(GLuint id, GLsizei readBufferOffset)
 {
     UpdateResourceMap(&gBufferMap, id, readBufferOffset);
@@ -213,3 +337,76 @@
 {
     UpdateResourceMap(&gVertexArrayMap, id, readBufferOffset);
 }
+
+void UpdateBufferID2(GLuint id, GLsizei readBufferOffset)
+{
+    UpdateResourceMap2(gBufferMap2, id, readBufferOffset);
+}
+
+void UpdateFenceNVID2(GLuint id, GLsizei readBufferOffset)
+{
+    UpdateResourceMap2(gFenceNVMap2, id, readBufferOffset);
+}
+
+void UpdateFramebufferID2(GLuint id, GLsizei readBufferOffset)
+{
+    UpdateResourceMap2(gFramebufferMap2, id, readBufferOffset);
+}
+
+void UpdateMemoryObjectID2(GLuint id, GLsizei readBufferOffset)
+{
+    UpdateResourceMap2(gMemoryObjectMap2, id, readBufferOffset);
+}
+
+void UpdateProgramPipelineID2(GLuint id, GLsizei readBufferOffset)
+{
+    UpdateResourceMap2(gProgramPipelineMap2, id, readBufferOffset);
+}
+
+void UpdateQueryID2(GLuint id, GLsizei readBufferOffset)
+{
+    UpdateResourceMap2(gQueryMap2, id, readBufferOffset);
+}
+
+void UpdateRenderbufferID2(GLuint id, GLsizei readBufferOffset)
+{
+    UpdateResourceMap2(gRenderbufferMap2, id, readBufferOffset);
+}
+
+void UpdateSamplerID2(GLuint id, GLsizei readBufferOffset)
+{
+    UpdateResourceMap2(gSamplerMap2, id, readBufferOffset);
+}
+
+void UpdateSemaphoreID2(GLuint id, GLsizei readBufferOffset)
+{
+    UpdateResourceMap2(gSemaphoreMap2, id, readBufferOffset);
+}
+
+void UpdateShaderProgramID2(GLuint id, GLsizei readBufferOffset)
+{
+    UpdateResourceMap2(gShaderProgramMap2, id, readBufferOffset);
+}
+
+void UpdateTextureID2(GLuint id, GLsizei readBufferOffset)
+{
+    UpdateResourceMap2(gTextureMap2, id, readBufferOffset);
+}
+
+void UpdateTransformFeedbackID2(GLuint id, GLsizei readBufferOffset)
+{
+    UpdateResourceMap2(gTransformFeedbackMap2, id, readBufferOffset);
+}
+
+void UpdateVertexArrayID2(GLuint id, GLsizei readBufferOffset)
+{
+    UpdateResourceMap2(gVertexArrayMap2, id, readBufferOffset);
+}
+
+void ValidateSerializedState(const char *serializedState, const char *fileName, uint32_t line)
+{
+    if (gValidateSerializedStateCallback)
+    {
+        gValidateSerializedStateCallback(serializedState, fileName, line);
+    }
+}
diff --git a/src/libANGLE/capture/trace_fixture.h b/src/libANGLE/capture/trace_fixture.h
index cff4f0e..edb84f6 100644
--- a/src/libANGLE/capture/trace_fixture.h
+++ b/src/libANGLE/capture/trace_fixture.h
@@ -34,7 +34,8 @@
 #    endif
 #endif  // !defined(ANGLE_REPLAY_EXPORT)
 
-using DecompressCallback = uint8_t *(*)(const std::vector<uint8_t> &);
+using DecompressCallback              = uint8_t *(*)(const std::vector<uint8_t> &);
+using ValidateSerializedStateCallback = void (*)(const char *, const char *, uint32_t);
 
 extern "C" {
 ANGLE_REPLAY_EXPORT void SetBinaryDataDecompressCallback(DecompressCallback callback);
@@ -43,6 +44,8 @@
 ANGLE_REPLAY_EXPORT void ReplayFrame(uint32_t frameIndex);
 ANGLE_REPLAY_EXPORT void ResetReplay();
 ANGLE_REPLAY_EXPORT void FinishReplay();
+ANGLE_REPLAY_EXPORT void SetValidateSerializedStateCallback(
+    ValidateSerializedStateCallback callback);
 
 // Only defined if serialization is enabled.
 ANGLE_REPLAY_EXPORT const char *GetSerializedContextState(uint32_t frameIndex);
@@ -51,11 +54,15 @@
 // Maps from <captured Program ID, captured location> to run-time location.
 using LocationsMap = std::unordered_map<GLuint, std::unordered_map<GLint, GLint>>;
 extern LocationsMap gUniformLocations;
+extern GLint **gUniformLocations2;
 using BlockIndexesMap = std::unordered_map<GLuint, std::unordered_map<GLuint, GLuint>>;
 extern BlockIndexesMap gUniformBlockIndexes;
 extern GLuint gCurrentProgram;
 void UpdateUniformLocation(GLuint program, const char *name, GLint location);
+void UpdateUniformLocation(GLuint program, const char *name, GLint location, GLint count);
+void UpdateUniformLocation2(GLuint program, const char *name, GLint location, GLint count);
 void DeleteUniformLocations(GLuint program);
+void DeleteUniformLocations2(GLuint program);
 void UpdateUniformBlockIndex(GLuint program, const char *name, GLuint index);
 void UpdateCurrentProgram(GLuint program);
 
@@ -79,6 +86,23 @@
                       size_t maxClientArraySize,
                       size_t readBufferSize);
 
+void InitializeReplay2(const char *binaryDataFileName,
+                       size_t maxClientArraySize,
+                       size_t readBufferSize,
+                       uint32_t maxBuffer,
+                       uint32_t maxFenceNV,
+                       uint32_t maxFramebuffer,
+                       uint32_t maxMemoryObject,
+                       uint32_t maxProgramPipeline,
+                       uint32_t maxQuery,
+                       uint32_t maxRenderbuffer,
+                       uint32_t maxSampler,
+                       uint32_t maxSemaphore,
+                       uint32_t maxShaderProgram,
+                       uint32_t maxTexture,
+                       uint32_t maxTransformFeedback,
+                       uint32_t maxVertexArray);
+
 // Global state
 
 constexpr size_t kMaxClientArrays = 16;
@@ -99,13 +123,32 @@
 extern ResourceMap gTextureMap;
 extern ResourceMap gTransformFeedbackMap;
 extern ResourceMap gVertexArrayMap;
+
+extern GLuint *gBufferMap2;
+extern GLuint *gFenceNVMap2;
+extern GLuint *gFramebufferMap2;
+extern GLuint *gMemoryObjectMap2;
+extern GLuint *gProgramPipelineMap2;
+extern GLuint *gQueryMap2;
+extern GLuint *gRenderbufferMap2;
+extern GLuint *gSamplerMap2;
+extern GLuint *gSemaphoreMap2;
+extern GLuint *gShaderProgramMap2;
+extern GLuint *gTextureMap2;
+extern GLuint *gTransformFeedbackMap2;
+extern GLuint *gVertexArrayMap2;
+
+// TODO(http://www.anglebug.com/5878): avoid std::unordered_map, it's slow
 using SyncResourceMap = std::unordered_map<uintptr_t, GLsync>;
 extern SyncResourceMap gSyncMap;
+using ContextMap = std::unordered_map<uint32_t, EGLContext>;
+extern ContextMap gContextMap;
 
 void UpdateClientArrayPointer(int arrayIndex, const void *data, uint64_t size);
 using BufferHandleMap = std::unordered_map<GLuint, void *>;
 extern BufferHandleMap gMappedBufferData;
 void UpdateClientBufferData(GLuint bufferID, const void *source, GLsizei size);
+void UpdateClientBufferData2(GLuint bufferID, const void *source, GLsizei size);
 void UpdateBufferID(GLuint id, GLsizei readBufferOffset);
 void UpdateFenceNVID(GLuint id, GLsizei readBufferOffset);
 void UpdateFramebufferID(GLuint id, GLsizei readBufferOffset);
@@ -119,5 +162,21 @@
 void UpdateTextureID(GLuint id, GLsizei readBufferOffset);
 void UpdateTransformFeedbackID(GLuint id, GLsizei readBufferOffset);
 void UpdateVertexArrayID(GLuint id, GLsizei readBufferOffset);
+void UpdateBufferID2(GLuint id, GLsizei readBufferOffset);
+void UpdateFenceNVID2(GLuint id, GLsizei readBufferOffset);
+void UpdateFramebufferID2(GLuint id, GLsizei readBufferOffset);
+void UpdateMemoryObjectID2(GLuint id, GLsizei readBufferOffset);
+void UpdateProgramPipelineID2(GLuint id, GLsizei readBufferOffset);
+void UpdateQueryID2(GLuint id, GLsizei readBufferOffset);
+void UpdateRenderbufferID2(GLuint id, GLsizei readBufferOffset);
+void UpdateSamplerID2(GLuint id, GLsizei readBufferOffset);
+void UpdateSemaphoreID2(GLuint id, GLsizei readBufferOffset);
+void UpdateShaderProgramID2(GLuint id, GLsizei readBufferOffset);
+void UpdateTextureID2(GLuint id, GLsizei readBufferOffset);
+void UpdateTransformFeedbackID2(GLuint id, GLsizei readBufferOffset);
+void UpdateVertexArrayID2(GLuint id, GLsizei readBufferOffset);
+
+void ValidateSerializedState(const char *serializedState, const char *fileName, uint32_t line);
+#define VALIDATE_CHECKPOINT(STATE) ValidateSerializedState(STATE, __FILE__, __LINE__)
 
 #endif  // ANGLE_TRACE_FIXTURE_H_
diff --git a/src/libANGLE/formatutils.cpp b/src/libANGLE/formatutils.cpp
index dd27559..038558d 100644
--- a/src/libANGLE/formatutils.cpp
+++ b/src/libANGLE/formatutils.cpp
@@ -743,6 +743,79 @@
     }
 }
 
+struct FormatBits
+{
+    constexpr GLuint pixelBytes() const
+    {
+        return (red + green + blue + alpha + shared + unused) / 8;
+    }
+    constexpr GLuint componentCount() const
+    {
+        return ((red > 0) ? 1 : 0) + ((green > 0) ? 1 : 0) + ((blue > 0) ? 1 : 0) +
+               ((alpha > 0) ? 1 : 0);
+    }
+    constexpr bool valid() const
+    {
+        return ((red + green + blue + alpha + shared + unused) % 8) == 0;
+    }
+
+    GLuint red;
+    GLuint green;
+    GLuint blue;
+    GLuint alpha;
+    GLuint unused;
+    GLuint shared;
+};
+
+template <GLuint red, GLuint green, GLuint blue, GLuint alpha, GLuint unused, GLuint shared>
+constexpr FormatBits FB()
+{
+    constexpr FormatBits formatBits = {red, green, blue, alpha, unused, shared};
+    static_assert(formatBits.valid(), "Invalid FormatBits");
+    return formatBits;
+}
+
+void AddRGBAXFormat(InternalFormatInfoMap *map,
+                    GLenum internalFormat,
+                    bool sized,
+                    const FormatBits &formatBits,
+                    GLenum format,
+                    GLenum type,
+                    GLenum componentType,
+                    bool srgb,
+                    InternalFormat::SupportCheckFunction textureSupport,
+                    InternalFormat::SupportCheckFunction filterSupport,
+                    InternalFormat::SupportCheckFunction textureAttachmentSupport,
+                    InternalFormat::SupportCheckFunction renderbufferSupport,
+                    InternalFormat::SupportCheckFunction blendSupport)
+{
+    ASSERT(formatBits.valid());
+
+    InternalFormat formatInfo;
+    formatInfo.internalFormat = internalFormat;
+    formatInfo.sized          = sized;
+    formatInfo.sizedInternalFormat =
+        sized ? internalFormat : GetSizedFormatInternal(internalFormat, type);
+    formatInfo.redBits                  = formatBits.red;
+    formatInfo.greenBits                = formatBits.green;
+    formatInfo.blueBits                 = formatBits.blue;
+    formatInfo.alphaBits                = formatBits.alpha;
+    formatInfo.sharedBits               = formatBits.shared;
+    formatInfo.pixelBytes               = formatBits.pixelBytes();
+    formatInfo.componentCount           = formatBits.componentCount();
+    formatInfo.format                   = format;
+    formatInfo.type                     = type;
+    formatInfo.componentType            = componentType;
+    formatInfo.colorEncoding            = (srgb ? GL_SRGB : GL_LINEAR);
+    formatInfo.textureSupport           = textureSupport;
+    formatInfo.filterSupport            = filterSupport;
+    formatInfo.textureAttachmentSupport = textureAttachmentSupport;
+    formatInfo.renderbufferSupport      = renderbufferSupport;
+    formatInfo.blendSupport             = blendSupport;
+
+    InsertFormatInfo(map, formatInfo);
+}
+
 void AddRGBAFormat(InternalFormatInfoMap *map,
                    GLenum internalFormat,
                    bool sized,
@@ -761,30 +834,9 @@
                    InternalFormat::SupportCheckFunction renderbufferSupport,
                    InternalFormat::SupportCheckFunction blendSupport)
 {
-    InternalFormat formatInfo;
-    formatInfo.internalFormat = internalFormat;
-    formatInfo.sized          = sized;
-    formatInfo.sizedInternalFormat =
-        sized ? internalFormat : GetSizedFormatInternal(internalFormat, type);
-    formatInfo.redBits    = red;
-    formatInfo.greenBits  = green;
-    formatInfo.blueBits   = blue;
-    formatInfo.alphaBits  = alpha;
-    formatInfo.sharedBits = shared;
-    formatInfo.pixelBytes = (red + green + blue + alpha + shared) / 8;
-    formatInfo.componentCount =
-        ((red > 0) ? 1 : 0) + ((green > 0) ? 1 : 0) + ((blue > 0) ? 1 : 0) + ((alpha > 0) ? 1 : 0);
-    formatInfo.format                   = format;
-    formatInfo.type                     = type;
-    formatInfo.componentType            = componentType;
-    formatInfo.colorEncoding            = (srgb ? GL_SRGB : GL_LINEAR);
-    formatInfo.textureSupport           = textureSupport;
-    formatInfo.filterSupport            = filterSupport;
-    formatInfo.textureAttachmentSupport = textureAttachmentSupport;
-    formatInfo.renderbufferSupport      = renderbufferSupport;
-    formatInfo.blendSupport             = blendSupport;
-
-    InsertFormatInfo(map, formatInfo);
+    return AddRGBAXFormat(map, internalFormat, sized, {red, green, blue, alpha, 0, shared}, format,
+                          type, componentType, srgb, textureSupport, filterSupport,
+                          textureAttachmentSupport, renderbufferSupport, blendSupport);
 }
 
 static void AddLUMAFormat(InternalFormatInfoMap *map,
@@ -973,7 +1025,6 @@
     AddRGBAFormat(&map, GL_RGB5_A1,           true,  5,  5,  5,  1, 0, GL_RGBA,         GL_UNSIGNED_SHORT_5_5_5_1,         GL_UNSIGNED_NORMALIZED, false, RequireESOrExt<3, 0, &Extensions::textureStorage>, AlwaysSupported, RequireESOrExt<3, 0, &Extensions::textureStorage>, RequireES<2, 0>,                                 RequireES<2, 0>);
     AddRGBAFormat(&map, GL_RGBA8,             true,  8,  8,  8,  8, 0, GL_RGBA,         GL_UNSIGNED_BYTE,                  GL_UNSIGNED_NORMALIZED, false, RequireESOrExt<3, 0, &Extensions::textureStorage>, AlwaysSupported, RequireESOrExt<3, 0, &Extensions::textureStorage>, RequireESOrExt<3, 0, &Extensions::rgb8rgba8OES>, RequireESOrExt<3, 0, &Extensions::rgb8rgba8OES>);
     AddRGBAFormat(&map, GL_RGBA8_SNORM,       true,  8,  8,  8,  8, 0, GL_RGBA,         GL_BYTE,                           GL_SIGNED_NORMALIZED,   false, RequireES<3, 0>,                                   AlwaysSupported, NeverSupported,                                    NeverSupported,                                  NeverSupported);
-    AddRGBAFormat(&map, GL_RGB10_A2,          true, 10, 10, 10,  2, 0, GL_RGBA,         GL_UNSIGNED_INT_2_10_10_10_REV,    GL_UNSIGNED_NORMALIZED, false, RequireES<3, 0>,                                   AlwaysSupported, RequireES<3, 0>,                                   RequireES<3, 0>,                                 RequireES<3, 0>);
     AddRGBAFormat(&map, GL_RGB10_A2UI,        true, 10, 10, 10,  2, 0, GL_RGBA_INTEGER, GL_UNSIGNED_INT_2_10_10_10_REV,    GL_UNSIGNED_INT,        false, RequireES<3, 0>,                                   NeverSupported,  RequireES<3, 0>,                                   RequireES<3, 0>,                                 NeverSupported);
     AddRGBAFormat(&map, GL_SRGB8,             true,  8,  8,  8,  0, 0, GL_RGB,          GL_UNSIGNED_BYTE,                  GL_UNSIGNED_NORMALIZED, true,  RequireES<3, 0>,                                   AlwaysSupported, NeverSupported,                                    NeverSupported,                                  NeverSupported);
     AddRGBAFormat(&map, GL_SRGB8_ALPHA8,      true,  8,  8,  8,  8, 0, GL_RGBA,         GL_UNSIGNED_BYTE,                  GL_UNSIGNED_NORMALIZED, true,  RequireESOrExt<3, 0, &Extensions::sRGB>,           AlwaysSupported, RequireES<3, 0>,                                   RequireESOrExt<3, 0, &Extensions::sRGB>,         RequireESOrExt<3, 0, &Extensions::sRGB>);
@@ -1016,9 +1067,13 @@
 
     // Special format which is not really supported, so always false for all supports.
     AddRGBAFormat(&map, GL_BGRX8_ANGLEX,      true,  8,  8,  8,  0, 0, GL_BGRA_EXT,     GL_UNSIGNED_BYTE,                  GL_UNSIGNED_NORMALIZED, false, NeverSupported,                                    NeverSupported,  NeverSupported,                                    NeverSupported,                                NeverSupported);
-    AddRGBAFormat(&map, GL_BGR565_ANGLEX,     true,  5,  6,  5,  1, 0, GL_BGRA_EXT,     GL_UNSIGNED_SHORT_5_6_5,           GL_UNSIGNED_NORMALIZED, false, NeverSupported,                                    NeverSupported,  NeverSupported,                                    NeverSupported,                                NeverSupported);
+    AddRGBAFormat(&map, GL_BGR565_ANGLEX,     true,  5,  6,  5,  0, 0, GL_BGRA_EXT,     GL_UNSIGNED_SHORT_5_6_5,           GL_UNSIGNED_NORMALIZED, false, NeverSupported,                                    NeverSupported,  NeverSupported,                                    NeverSupported,                                NeverSupported);
     AddRGBAFormat(&map, GL_BGR10_A2_ANGLEX,   true, 10, 10, 10,  2, 0, GL_BGRA_EXT,     GL_UNSIGNED_INT_2_10_10_10_REV,    GL_UNSIGNED_NORMALIZED, false, NeverSupported,                                    NeverSupported,  NeverSupported,                                    NeverSupported,                                NeverSupported);
 
+    // This format is supported on ES 2.0 with two extensions, so keep it out-of-line to not widen the table above even more.
+    //                 | Internal format     |sized| R | G | B | A |S | Format         | Type                             | Component type        | SRGB | Texture supported                                                                            | Filterable     | Texture attachment                               | Renderbuffer                                   | Blend
+    AddRGBAFormat(&map, GL_RGB10_A2,          true, 10, 10, 10,  2, 0, GL_RGBA,         GL_UNSIGNED_INT_2_10_10_10_REV,    GL_UNSIGNED_NORMALIZED, false, RequireESOrExtAndExt<3, 0, &Extensions::textureStorage, &Extensions::textureFormat2101010REV>,  AlwaysSupported, RequireES<3, 0>,                                   RequireES<3, 0>,                                 RequireES<3, 0>);
+
     // Floating point formats
     //                 | Internal format |sized| R | G | B | A |S | Format | Type             | Component type | SRGB | Texture supported         | Filterable                                    | Texture attachment                          | Renderbuffer                            | Blend
     // It's not possible to have two entries per sized format.
@@ -1034,13 +1089,13 @@
     AddRGBAFormat(&map, GL_RGBA32F,       true, 32, 32, 32, 32, 0, GL_RGBA, GL_FLOAT,          GL_FLOAT,        false, SizedFloatRGBASupport,      RequireExt<&Extensions::textureFloatLinearOES>, SizedFloatRGBARenderableSupport,              SizedFloatRGBARenderableSupport,           Float32BlendableSupport);
 
     // ANGLE Depth stencil formats
-    //                         | Internal format         |sized| D |S | X | Format            | Type                             | Component type        | Texture supported                                                            | Filterable                                                                             | Texture attachment                                                                           | Renderbuffer                                                                                              | Blend
-    AddDepthStencilFormat(&map, GL_DEPTH_COMPONENT16,     true, 16, 0,  0, GL_DEPTH_COMPONENT, GL_UNSIGNED_SHORT,                 GL_UNSIGNED_NORMALIZED, RequireES<1, 0>,                                                               RequireESOrExtOrExt<3, 0, &Extensions::depthTextureANGLE, &Extensions::depthTextureOES>, RequireES<1, 0>,                                                                               RequireES<1, 0>,                                                                                             RequireES<1, 0>);
-    AddDepthStencilFormat(&map, GL_DEPTH_COMPONENT24,     true, 24, 0,  8, GL_DEPTH_COMPONENT, GL_UNSIGNED_INT,                   GL_UNSIGNED_NORMALIZED, RequireES<3, 0>,                                                               RequireESOrExt<3, 0, &Extensions::depthTextureANGLE>,                                    RequireES<3, 0>,                                                                               RequireESOrExt<3, 0, &Extensions::depth24OES>,                                                               RequireESOrExt<3, 0, &Extensions::depth24OES>);
-    AddDepthStencilFormat(&map, GL_DEPTH_COMPONENT32F,    true, 32, 0,  0, GL_DEPTH_COMPONENT, GL_FLOAT,                          GL_FLOAT,               RequireES<3, 0>,                                                               RequireESOrExt<3, 0, &Extensions::depthTextureANGLE>,                                    RequireES<3, 0>,                                                                               RequireES<3, 0>,                                                                                             RequireES<3, 0>);
-    AddDepthStencilFormat(&map, GL_DEPTH_COMPONENT32_OES, true, 32, 0,  0, GL_DEPTH_COMPONENT, GL_UNSIGNED_INT,                   GL_UNSIGNED_NORMALIZED, RequireExtOrExt<&Extensions::depthTextureANGLE, &Extensions::depthTextureOES>, AlwaysSupported,                                                                         RequireExtOrExt<&Extensions::depthTextureANGLE, &Extensions::depthTextureOES>,                 RequireExtOrExtOrExt<&Extensions::depthTextureANGLE, &Extensions::depthTextureOES, &Extensions::depth32OES>, RequireExtOrExtOrExt<&Extensions::depthTextureANGLE, &Extensions::depthTextureOES, &Extensions::depth32OES>);
-    AddDepthStencilFormat(&map, GL_DEPTH24_STENCIL8,      true, 24, 8,  0, GL_DEPTH_STENCIL,   GL_UNSIGNED_INT_24_8,              GL_UNSIGNED_NORMALIZED, RequireESOrExt<3, 0, &Extensions::depthTextureANGLE>,                          AlwaysSupported,                                                                         RequireESOrExtOrExt<3, 0, &Extensions::depthTextureANGLE, &Extensions::packedDepthStencilOES>, RequireESOrExtOrExt<3, 0, &Extensions::depthTextureANGLE, &Extensions::packedDepthStencilOES>,               RequireESOrExtOrExt<3, 0, &Extensions::depthTextureANGLE, &Extensions::packedDepthStencilOES>);
-    AddDepthStencilFormat(&map, GL_DEPTH32F_STENCIL8,     true, 32, 8, 24, GL_DEPTH_STENCIL,   GL_FLOAT_32_UNSIGNED_INT_24_8_REV, GL_FLOAT,               RequireESOrExt<3, 0, &Extensions::depthBufferFloat2NV>,                        AlwaysSupported,                                                                         RequireESOrExt<3, 0, &Extensions::depthBufferFloat2NV>,                                        RequireESOrExt<3, 0, &Extensions::depthBufferFloat2NV>,                                                      RequireESOrExt<3, 0, &Extensions::depthBufferFloat2NV>);
+    //                         | Internal format         |sized| D |S | X | Format            | Type                             | Component type        | Texture supported                                                                            | Filterable                                                                             | Texture attachment                                                                           | Renderbuffer                                                                                              | Blend
+    AddDepthStencilFormat(&map, GL_DEPTH_COMPONENT16,     true, 16, 0,  0, GL_DEPTH_COMPONENT, GL_UNSIGNED_SHORT,                 GL_UNSIGNED_NORMALIZED, RequireESOrExtOrExt<3, 0, &Extensions::depthTextureANGLE, &Extensions::depthTextureOES>,       RequireESOrExtOrExt<3, 0, &Extensions::depthTextureANGLE, &Extensions::depthTextureOES>, RequireES<1, 0>,                                                                               RequireES<1, 0>,                                                                                             RequireES<1, 0>);
+    AddDepthStencilFormat(&map, GL_DEPTH_COMPONENT24,     true, 24, 0,  8, GL_DEPTH_COMPONENT, GL_UNSIGNED_INT,                   GL_UNSIGNED_NORMALIZED, RequireES<3, 0>,                                                                               RequireESOrExt<3, 0, &Extensions::depthTextureANGLE>,                                    RequireES<3, 0>,                                                                               RequireESOrExt<3, 0, &Extensions::depth24OES>,                                                               RequireESOrExt<3, 0, &Extensions::depth24OES>);
+    AddDepthStencilFormat(&map, GL_DEPTH_COMPONENT32F,    true, 32, 0,  0, GL_DEPTH_COMPONENT, GL_FLOAT,                          GL_FLOAT,               RequireES<3, 0>,                                                                               RequireESOrExt<3, 0, &Extensions::depthTextureANGLE>,                                    RequireES<3, 0>,                                                                               RequireES<3, 0>,                                                                                             RequireES<3, 0>);
+    AddDepthStencilFormat(&map, GL_DEPTH_COMPONENT32_OES, true, 32, 0,  0, GL_DEPTH_COMPONENT, GL_UNSIGNED_INT,                   GL_UNSIGNED_NORMALIZED, RequireExtOrExt<&Extensions::depthTextureANGLE, &Extensions::depthTextureOES>,                 AlwaysSupported,                                                                         RequireExtOrExt<&Extensions::depthTextureANGLE, &Extensions::depthTextureOES>,                 RequireExtOrExtOrExt<&Extensions::depthTextureANGLE, &Extensions::depthTextureOES, &Extensions::depth32OES>, RequireExtOrExtOrExt<&Extensions::depthTextureANGLE, &Extensions::depthTextureOES, &Extensions::depth32OES>);
+    AddDepthStencilFormat(&map, GL_DEPTH24_STENCIL8,      true, 24, 8,  0, GL_DEPTH_STENCIL,   GL_UNSIGNED_INT_24_8,              GL_UNSIGNED_NORMALIZED, RequireESOrExtOrExt<3, 0, &Extensions::depthTextureANGLE, &Extensions::packedDepthStencilOES>, AlwaysSupported,                                                                         RequireESOrExtOrExt<3, 0, &Extensions::depthTextureANGLE, &Extensions::packedDepthStencilOES>, RequireESOrExtOrExt<3, 0, &Extensions::depthTextureANGLE, &Extensions::packedDepthStencilOES>,               RequireESOrExtOrExt<3, 0, &Extensions::depthTextureANGLE, &Extensions::packedDepthStencilOES>);
+    AddDepthStencilFormat(&map, GL_DEPTH32F_STENCIL8,     true, 32, 8, 24, GL_DEPTH_STENCIL,   GL_FLOAT_32_UNSIGNED_INT_24_8_REV, GL_FLOAT,               RequireESOrExt<3, 0, &Extensions::depthBufferFloat2NV>,                                        AlwaysSupported,                                                                         RequireESOrExt<3, 0, &Extensions::depthBufferFloat2NV>,                                        RequireESOrExt<3, 0, &Extensions::depthBufferFloat2NV>,                                                      RequireESOrExt<3, 0, &Extensions::depthBufferFloat2NV>);
     // STENCIL_INDEX8 is special-cased, see around the bottom of the list.
 
     // Luminance alpha formats
@@ -1165,11 +1220,11 @@
     AddCompressedFormat(&map, GL_COMPRESSED_RGBA_PVRTC_2BPPV1_IMG,     8,  4,  1,  64,  4, false, RequireExt<&Extensions::compressedTexturePVRTC>,    AlwaysSupported, NeverSupported,      NeverSupported, NeverSupported);
 
     // From GL_EXT_pvrtc_sRGB
-    //                       | Internal format                             | W | H | D | BS |CC| SRGB | Texture supported                                     | Filterable     | Texture attachment | Renderbuffer  | Blend
-    AddCompressedFormat(&map, GL_COMPRESSED_SRGB_PVRTC_2BPPV1_EXT,           8,  4,  1,  64,  3, true, RequireExt<&Extensions::compressedTexturePVRTCsRGB>,    AlwaysSupported, NeverSupported,      NeverSupported, NeverSupported);
-    AddCompressedFormat(&map, GL_COMPRESSED_SRGB_PVRTC_4BPPV1_EXT,           4,  4,  1,  64,  3, true, RequireExt<&Extensions::compressedTexturePVRTCsRGB>,    AlwaysSupported, NeverSupported,      NeverSupported, NeverSupported);
-    AddCompressedFormat(&map, GL_COMPRESSED_SRGB_ALPHA_PVRTC_2BPPV1_EXT,     8,  4,  1,  64,  4, true, RequireExt<&Extensions::compressedTexturePVRTCsRGB>,    AlwaysSupported, NeverSupported,      NeverSupported, NeverSupported);
-    AddCompressedFormat(&map, GL_COMPRESSED_SRGB_ALPHA_PVRTC_4BPPV1_EXT,     4,  4,  1,  64,  4, true, RequireExt<&Extensions::compressedTexturePVRTCsRGB>,    AlwaysSupported, NeverSupported,      NeverSupported, NeverSupported);
+    //                       | Internal format                             | W | H | D | BS |CC| SRGB | Texture supported                                                                               | Filterable     | Texture attachment | Renderbuffer  | Blend
+    AddCompressedFormat(&map, GL_COMPRESSED_SRGB_PVRTC_2BPPV1_EXT,           8,  4,  1,  64,  3, true, RequireExtAndExt<&Extensions::compressedTexturePVRTC, &Extensions::compressedTexturePVRTCsRGB>,    AlwaysSupported, NeverSupported,      NeverSupported, NeverSupported);
+    AddCompressedFormat(&map, GL_COMPRESSED_SRGB_PVRTC_4BPPV1_EXT,           4,  4,  1,  64,  3, true, RequireExtAndExt<&Extensions::compressedTexturePVRTC, &Extensions::compressedTexturePVRTCsRGB>,    AlwaysSupported, NeverSupported,      NeverSupported, NeverSupported);
+    AddCompressedFormat(&map, GL_COMPRESSED_SRGB_ALPHA_PVRTC_2BPPV1_EXT,     8,  4,  1,  64,  4, true, RequireExtAndExt<&Extensions::compressedTexturePVRTC, &Extensions::compressedTexturePVRTCsRGB>,    AlwaysSupported, NeverSupported,      NeverSupported, NeverSupported);
+    AddCompressedFormat(&map, GL_COMPRESSED_SRGB_ALPHA_PVRTC_4BPPV1_EXT,     4,  4,  1,  64,  4, true, RequireExtAndExt<&Extensions::compressedTexturePVRTC, &Extensions::compressedTexturePVRTCsRGB>,    AlwaysSupported, NeverSupported,      NeverSupported, NeverSupported);
 
     // For STENCIL_INDEX8 we chose a normalized component type for the following reasons:
     // - Multisampled buffer are disallowed for non-normalized integer component types and we want to support it for STENCIL_INDEX8
@@ -1206,25 +1261,25 @@
     AddRGBAFormat(&map, GL_SRG8_EXT,         true,  8,  8,  0,  0, 0, GL_RG,   GL_UNSIGNED_BYTE,  GL_UNSIGNED_NORMALIZED, true,  RequireExt<&Extensions::sRGBRG8EXT>,    AlwaysSupported, NeverSupported,                         NeverSupported,                         NeverSupported);
 
     // Unsized formats
-    //                 | Internal format  |sized | R | G | B | A |S | Format           | Type                          | Component type        | SRGB | Texture supported                               | Filterable     | Texture attachment                            | Renderbuffer  | Blend
-    AddRGBAFormat(&map, GL_RED,            false,  8,  0,  0,  0, 0, GL_RED,            GL_UNSIGNED_BYTE,               GL_UNSIGNED_NORMALIZED, false, RequireExt<&Extensions::textureRG>,               AlwaysSupported, RequireExt<&Extensions::textureRG>,             NeverSupported, NeverSupported);
-    AddRGBAFormat(&map, GL_RED,            false,  8,  0,  0,  0, 0, GL_RED,            GL_BYTE,                        GL_SIGNED_NORMALIZED,   false, NeverSupported,                                   NeverSupported,  NeverSupported,                                 NeverSupported, NeverSupported);
-    AddRGBAFormat(&map, GL_RED,            false, 16,  0,  0,  0, 0, GL_RED,            GL_UNSIGNED_SHORT,              GL_UNSIGNED_NORMALIZED, false, RequireExt<&Extensions::textureNorm16>,           AlwaysSupported, RequireExt<&Extensions::textureNorm16>,         NeverSupported, NeverSupported);
-    AddRGBAFormat(&map, GL_RG,             false,  8,  8,  0,  0, 0, GL_RG,             GL_UNSIGNED_BYTE,               GL_UNSIGNED_NORMALIZED, false, RequireExt<&Extensions::textureRG>,               AlwaysSupported, RequireExt<&Extensions::textureRG>,             NeverSupported, NeverSupported);
-    AddRGBAFormat(&map, GL_RG,             false,  8,  8,  0,  0, 0, GL_RG,             GL_BYTE,                        GL_SIGNED_NORMALIZED,   false, NeverSupported,                                   NeverSupported,  NeverSupported,                                 NeverSupported, NeverSupported);
-    AddRGBAFormat(&map, GL_RG,             false, 16, 16,  0,  0, 0, GL_RG,             GL_UNSIGNED_SHORT,              GL_UNSIGNED_NORMALIZED, false, RequireExt<&Extensions::textureNorm16>,           AlwaysSupported, RequireExt<&Extensions::textureNorm16>,         NeverSupported, NeverSupported);
-    AddRGBAFormat(&map, GL_RGB,            false,  8,  8,  8,  0, 0, GL_RGB,            GL_UNSIGNED_BYTE,               GL_UNSIGNED_NORMALIZED, false, AlwaysSupported,                                  AlwaysSupported, RequireESOrExt<2, 0, &Extensions::framebufferObjectOES>,                                NeverSupported, NeverSupported);
-    AddRGBAFormat(&map, GL_RGB,            false,  5,  6,  5,  0, 0, GL_RGB,            GL_UNSIGNED_SHORT_5_6_5,        GL_UNSIGNED_NORMALIZED, false, AlwaysSupported,                                  AlwaysSupported, RequireESOrExt<2, 0, &Extensions::framebufferObjectOES>,                                NeverSupported, NeverSupported);
-    AddRGBAFormat(&map, GL_RGB,            false,  8,  8,  8,  0, 0, GL_RGB,            GL_BYTE,                        GL_SIGNED_NORMALIZED,   false, NeverSupported,                                   NeverSupported,  NeverSupported,                                 NeverSupported, NeverSupported);
-    AddRGBAFormat(&map, GL_RGB,            false, 10, 10, 10,  0, 0, GL_RGB,            GL_UNSIGNED_INT_2_10_10_10_REV, GL_UNSIGNED_NORMALIZED, false, RequireExt<&Extensions::textureFormat2101010REV>, AlwaysSupported, NeverSupported,                                 NeverSupported, NeverSupported);
-    AddRGBAFormat(&map, GL_RGBA,           false,  4,  4,  4,  4, 0, GL_RGBA,           GL_UNSIGNED_SHORT_4_4_4_4,      GL_UNSIGNED_NORMALIZED, false, AlwaysSupported,                                  AlwaysSupported, RequireESOrExt<2, 0, &Extensions::framebufferObjectOES>,                                NeverSupported, NeverSupported);
-    AddRGBAFormat(&map, GL_RGBA,           false,  5,  5,  5,  1, 0, GL_RGBA,           GL_UNSIGNED_SHORT_5_5_5_1,      GL_UNSIGNED_NORMALIZED, false, AlwaysSupported,                                  AlwaysSupported, RequireESOrExt<2, 0, &Extensions::framebufferObjectOES>,                                NeverSupported, NeverSupported);
-    AddRGBAFormat(&map, GL_RGBA,           false,  8,  8,  8,  8, 0, GL_RGBA,           GL_UNSIGNED_BYTE,               GL_UNSIGNED_NORMALIZED, false, AlwaysSupported,                                  AlwaysSupported, RequireESOrExt<2, 0, &Extensions::framebufferObjectOES>,                                NeverSupported, NeverSupported);
-    AddRGBAFormat(&map, GL_RGBA,           false, 16, 16, 16, 16, 0, GL_RGBA,           GL_UNSIGNED_SHORT,              GL_UNSIGNED_NORMALIZED, false, RequireExt<&Extensions::textureNorm16>,           AlwaysSupported, RequireExt<&Extensions::textureNorm16>,         NeverSupported, NeverSupported);
-    AddRGBAFormat(&map, GL_RGBA,           false, 10, 10, 10,  2, 0, GL_RGBA,           GL_UNSIGNED_INT_2_10_10_10_REV, GL_UNSIGNED_NORMALIZED, false, RequireExt<&Extensions::textureFormat2101010REV>, AlwaysSupported, NeverSupported,                                 NeverSupported, NeverSupported);
-    AddRGBAFormat(&map, GL_RGBA,           false,  8,  8,  8,  8, 0, GL_RGBA,           GL_BYTE,                        GL_SIGNED_NORMALIZED,   false, NeverSupported,                                   NeverSupported,  NeverSupported,                                 NeverSupported, NeverSupported);
-    AddRGBAFormat(&map, GL_SRGB,           false,  8,  8,  8,  0, 0, GL_SRGB,           GL_UNSIGNED_BYTE,               GL_UNSIGNED_NORMALIZED, true,  RequireExt<&Extensions::sRGB>,                    AlwaysSupported, NeverSupported,                                 NeverSupported, NeverSupported);
-    AddRGBAFormat(&map, GL_SRGB_ALPHA_EXT, false,  8,  8,  8,  8, 0, GL_SRGB_ALPHA_EXT, GL_UNSIGNED_BYTE,               GL_UNSIGNED_NORMALIZED, true,  RequireExt<&Extensions::sRGB>,                    AlwaysSupported, RequireExt<&Extensions::sRGB>,                  NeverSupported, NeverSupported);
+    //                  | Internal format  |sized |    R | G | B | A |S |X   | Format           | Type                          | Component type        | SRGB | Texture supported                               | Filterable     | Texture attachment                            | Renderbuffer  | Blend
+    AddRGBAXFormat(&map, GL_RED,            false, FB< 8,  0,  0,  0, 0, 0>(), GL_RED,            GL_UNSIGNED_BYTE,               GL_UNSIGNED_NORMALIZED, false, RequireExt<&Extensions::textureRG>,               AlwaysSupported, RequireExt<&Extensions::textureRG>,             NeverSupported, NeverSupported);
+    AddRGBAXFormat(&map, GL_RED,            false, FB< 8,  0,  0,  0, 0, 0>(), GL_RED,            GL_BYTE,                        GL_SIGNED_NORMALIZED,   false, NeverSupported,                                   NeverSupported,  NeverSupported,                                 NeverSupported, NeverSupported);
+    AddRGBAXFormat(&map, GL_RED,            false, FB<16,  0,  0,  0, 0, 0>(), GL_RED,            GL_UNSIGNED_SHORT,              GL_UNSIGNED_NORMALIZED, false, RequireExt<&Extensions::textureNorm16>,           AlwaysSupported, RequireExt<&Extensions::textureNorm16>,         NeverSupported, NeverSupported);
+    AddRGBAXFormat(&map, GL_RG,             false, FB< 8,  8,  0,  0, 0, 0>(), GL_RG,             GL_UNSIGNED_BYTE,               GL_UNSIGNED_NORMALIZED, false, RequireExt<&Extensions::textureRG>,               AlwaysSupported, RequireExt<&Extensions::textureRG>,             NeverSupported, NeverSupported);
+    AddRGBAXFormat(&map, GL_RG,             false, FB< 8,  8,  0,  0, 0, 0>(), GL_RG,             GL_BYTE,                        GL_SIGNED_NORMALIZED,   false, NeverSupported,                                   NeverSupported,  NeverSupported,                                 NeverSupported, NeverSupported);
+    AddRGBAXFormat(&map, GL_RG,             false, FB<16, 16,  0,  0, 0, 0>(), GL_RG,             GL_UNSIGNED_SHORT,              GL_UNSIGNED_NORMALIZED, false, RequireExt<&Extensions::textureNorm16>,           AlwaysSupported, RequireExt<&Extensions::textureNorm16>,         NeverSupported, NeverSupported);
+    AddRGBAXFormat(&map, GL_RGB,            false, FB< 8,  8,  8,  0, 0, 0>(), GL_RGB,            GL_UNSIGNED_BYTE,               GL_UNSIGNED_NORMALIZED, false, AlwaysSupported,                                  AlwaysSupported, RequireESOrExt<2, 0, &Extensions::framebufferObjectOES>,                                NeverSupported, NeverSupported);
+    AddRGBAXFormat(&map, GL_RGB,            false, FB< 5,  6,  5,  0, 0, 0>(), GL_RGB,            GL_UNSIGNED_SHORT_5_6_5,        GL_UNSIGNED_NORMALIZED, false, AlwaysSupported,                                  AlwaysSupported, RequireESOrExt<2, 0, &Extensions::framebufferObjectOES>,                                NeverSupported, NeverSupported);
+    AddRGBAXFormat(&map, GL_RGB,            false, FB< 8,  8,  8,  0, 0, 0>(), GL_RGB,            GL_BYTE,                        GL_SIGNED_NORMALIZED,   false, NeverSupported,                                   NeverSupported,  NeverSupported,                                 NeverSupported, NeverSupported);
+    AddRGBAXFormat(&map, GL_RGB,            false, FB<10, 10, 10,  0, 0, 2>(), GL_RGB,            GL_UNSIGNED_INT_2_10_10_10_REV, GL_UNSIGNED_NORMALIZED, false, RequireExt<&Extensions::textureFormat2101010REV>, AlwaysSupported, NeverSupported,                                 NeverSupported, NeverSupported);
+    AddRGBAXFormat(&map, GL_RGBA,           false, FB< 4,  4,  4,  4, 0, 0>(), GL_RGBA,           GL_UNSIGNED_SHORT_4_4_4_4,      GL_UNSIGNED_NORMALIZED, false, AlwaysSupported,                                  AlwaysSupported, RequireESOrExt<2, 0, &Extensions::framebufferObjectOES>,                                NeverSupported, NeverSupported);
+    AddRGBAXFormat(&map, GL_RGBA,           false, FB< 5,  5,  5,  1, 0, 0>(), GL_RGBA,           GL_UNSIGNED_SHORT_5_5_5_1,      GL_UNSIGNED_NORMALIZED, false, AlwaysSupported,                                  AlwaysSupported, RequireESOrExt<2, 0, &Extensions::framebufferObjectOES>,                                NeverSupported, NeverSupported);
+    AddRGBAXFormat(&map, GL_RGBA,           false, FB< 8,  8,  8,  8, 0, 0>(), GL_RGBA,           GL_UNSIGNED_BYTE,               GL_UNSIGNED_NORMALIZED, false, AlwaysSupported,                                  AlwaysSupported, RequireESOrExt<2, 0, &Extensions::framebufferObjectOES>,                                NeverSupported, NeverSupported);
+    AddRGBAXFormat(&map, GL_RGBA,           false, FB<16, 16, 16, 16, 0, 0>(), GL_RGBA,           GL_UNSIGNED_SHORT,              GL_UNSIGNED_NORMALIZED, false, RequireExt<&Extensions::textureNorm16>,           AlwaysSupported, RequireExt<&Extensions::textureNorm16>,         NeverSupported, NeverSupported);
+    AddRGBAXFormat(&map, GL_RGBA,           false, FB<10, 10, 10,  2, 0, 0>(), GL_RGBA,           GL_UNSIGNED_INT_2_10_10_10_REV, GL_UNSIGNED_NORMALIZED, false, RequireExt<&Extensions::textureFormat2101010REV>, AlwaysSupported, NeverSupported,                                 NeverSupported, NeverSupported);
+    AddRGBAXFormat(&map, GL_RGBA,           false, FB< 8,  8,  8,  8, 0, 0>(), GL_RGBA,           GL_BYTE,                        GL_SIGNED_NORMALIZED,   false, NeverSupported,                                   NeverSupported,  NeverSupported,                                 NeverSupported, NeverSupported);
+    AddRGBAXFormat(&map, GL_SRGB,           false, FB< 8,  8,  8,  0, 0, 0>(), GL_SRGB,           GL_UNSIGNED_BYTE,               GL_UNSIGNED_NORMALIZED, true,  RequireExt<&Extensions::sRGB>,                    AlwaysSupported, NeverSupported,                                 NeverSupported, NeverSupported);
+    AddRGBAXFormat(&map, GL_SRGB_ALPHA_EXT, false, FB< 8,  8,  8,  8, 0, 0>(), GL_SRGB_ALPHA_EXT, GL_UNSIGNED_BYTE,               GL_UNSIGNED_NORMALIZED, true,  RequireExt<&Extensions::sRGB>,                    AlwaysSupported, RequireExt<&Extensions::sRGB>,                  NeverSupported, NeverSupported);
 #if (defined(ANGLE_PLATFORM_IOS) && !defined(ANGLE_PLATFORM_MACCATALYST)) || (defined(ANGLE_PLATFORM_MACCATALYST) && defined(ANGLE_CPU_ARM64))
     angle::SystemInfo info;
     if (angle::GetSystemInfo(&info))
@@ -1524,7 +1579,6 @@
     // Compressed images do not use pack/unpack parameters.
     if (compressed)
     {
-        ASSERT(rowLength == 0);
         return computeCompressedImageSize(Extents(width, 1, 1), resultOut);
     }
 
diff --git a/src/libANGLE/formatutils.h b/src/libANGLE/formatutils.h
index 21c9e98..77d3632 100644
--- a/src/libANGLE/formatutils.h
+++ b/src/libANGLE/formatutils.h
@@ -390,6 +390,21 @@
     }
 }
 
+ANGLE_INLINE bool IsBPTCFormat(const GLenum format)
+{
+    switch (format)
+    {
+        case GL_COMPRESSED_RGBA_BPTC_UNORM_EXT:
+        case GL_COMPRESSED_SRGB_ALPHA_BPTC_UNORM_EXT:
+        case GL_COMPRESSED_RGB_BPTC_SIGNED_FLOAT_EXT:
+        case GL_COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT_EXT:
+            return true;
+
+        default:
+            return false;
+    }
+}
+
 ANGLE_INLINE bool IsASTC2DFormat(const GLenum format)
 {
     if ((format >= GL_COMPRESSED_RGBA_ASTC_4x4_KHR &&
@@ -402,6 +417,19 @@
     return false;
 }
 
+ANGLE_INLINE bool IsETC1Format(const GLenum format)
+{
+    switch (format)
+    {
+        case GL_ETC1_RGB8_OES:
+        case GL_ETC1_SRGB8_NV:
+            return true;
+
+        default:
+            return false;
+    }
+}
+
 ANGLE_INLINE bool IsETC2EACFormat(const GLenum format)
 {
     // ES 3.1, Table 8.19
diff --git a/src/libANGLE/queryutils.cpp b/src/libANGLE/queryutils.cpp
index 020779b..24106a6 100644
--- a/src/libANGLE/queryutils.cpp
+++ b/src/libANGLE/queryutils.cpp
@@ -369,6 +369,9 @@
             *params = CastFromGLintStateValue<ParamType>(
                 pname, texture->getRequiredTextureImageUnits(context));
             break;
+        case GL_TEXTURE_PROTECTED_EXT:
+            *params = CastFromGLintStateValue<ParamType>(pname, texture->hasProtectedContent());
+            break;
         default:
             UNREACHABLE();
             break;
@@ -479,6 +482,9 @@
             texture->setInitState(ConvertToBool(params[0]) ? InitState::Initialized
                                                            : InitState::MayNeedInit);
             break;
+        case GL_TEXTURE_PROTECTED_EXT:
+            texture->setProtectedContent(context, (params[0] == GL_TRUE));
+            break;
         default:
             UNREACHABLE();
             break;
@@ -2193,6 +2199,10 @@
             ANGLE_TRY(memoryObject->setDedicatedMemory(context, ConvertToBool(params[0])));
             break;
 
+        case GL_PROTECTED_MEMORY_OBJECT_EXT:
+            ANGLE_TRY(memoryObject->setProtectedMemory(context, ConvertToBool(params[0])));
+            break;
+
         default:
             UNREACHABLE();
     }
@@ -2208,6 +2218,10 @@
             *params = memoryObject->isDedicatedMemory();
             break;
 
+        case GL_PROTECTED_MEMORY_OBJECT_EXT:
+            *params = memoryObject->isProtectedMemory();
+            break;
+
         default:
             UNREACHABLE();
     }
@@ -3292,6 +3306,14 @@
             *type      = GL_INT;
             *numParams = 1;
             return true;
+        case GL_PRIMITIVE_BOUNDING_BOX:
+            if (!extensions.primitiveBoundingBoxEXT)
+            {
+                return false;
+            }
+            *type      = GL_FLOAT;
+            *numParams = 8;
+            return true;
     }
 
     if (glState.getClientType() == EGL_OPENGL_API)
diff --git a/src/libANGLE/renderer/ImageImpl.h b/src/libANGLE/renderer/ImageImpl.h
index f5dbcad..44eb007 100644
--- a/src/libANGLE/renderer/ImageImpl.h
+++ b/src/libANGLE/renderer/ImageImpl.h
@@ -40,6 +40,7 @@
     virtual bool isRenderable(const gl::Context *context) const = 0;
     virtual bool isTexturable(const gl::Context *context) const = 0;
     virtual bool isYUV() const                                  = 0;
+    virtual bool hasProtectedContent() const                    = 0;
     virtual gl::Extents getSize() const                         = 0;
     virtual size_t getSamples() const                           = 0;
 };
diff --git a/src/libANGLE/renderer/MemoryObjectImpl.h b/src/libANGLE/renderer/MemoryObjectImpl.h
index 9bb4154..ce37dd3 100644
--- a/src/libANGLE/renderer/MemoryObjectImpl.h
+++ b/src/libANGLE/renderer/MemoryObjectImpl.h
@@ -30,6 +30,7 @@
     virtual void onDestroy(const gl::Context *context) = 0;
 
     virtual angle::Result setDedicatedMemory(const gl::Context *context, bool dedicatedMemory) = 0;
+    virtual angle::Result setProtectedMemory(const gl::Context *context, bool protectedMemory) = 0;
 
     virtual angle::Result importFd(gl::Context *context,
                                    GLuint64 size,
diff --git a/src/libANGLE/renderer/TextureImpl.h b/src/libANGLE/renderer/TextureImpl.h
index 832b6bf..d94991b 100644
--- a/src/libANGLE/renderer/TextureImpl.h
+++ b/src/libANGLE/renderer/TextureImpl.h
@@ -212,6 +212,8 @@
     virtual angle::Result bindTexImage(const gl::Context *context, egl::Surface *surface) = 0;
     virtual angle::Result releaseTexImage(const gl::Context *context)                     = 0;
 
+    virtual void onLabelUpdate() {}
+
     // Override if accurate native memory size information is available
     virtual GLint getMemorySize() const;
     virtual GLint getLevelMemorySize(gl::TextureTarget target, GLint level);
diff --git a/src/libANGLE/renderer/d3d/ProgramD3D.cpp b/src/libANGLE/renderer/d3d/ProgramD3D.cpp
index b6dc067..59fe34f 100644
--- a/src/libANGLE/renderer/d3d/ProgramD3D.cpp
+++ b/src/libANGLE/renderer/d3d/ProgramD3D.cpp
@@ -2093,7 +2093,7 @@
                     stream << "]\nin the " << gl::GetShaderTypeString(shaderType) << " shader.\n";
 
                     stream << "You could get more details from "
-                              "https://chromium.googlesource.com/angle/angle/+/refs/heads/master/"
+                              "https://chromium.googlesource.com/angle/angle/+/refs/heads/main/"
                               "src/libANGLE/renderer/d3d/d3d11/"
                               "UniformBlockToStructuredBufferTranslation.md\n";
                     ANGLE_PERF_WARNING(context->getState().getDebug(), GL_DEBUG_SEVERITY_MEDIUM,
diff --git a/src/libANGLE/renderer/d3d/TextureD3D.cpp b/src/libANGLE/renderer/d3d/TextureD3D.cpp
index b23e511..d5a73f7 100644
--- a/src/libANGLE/renderer/d3d/TextureD3D.cpp
+++ b/src/libANGLE/renderer/d3d/TextureD3D.cpp
@@ -695,14 +695,18 @@
     return angle::Result::Continue;
 }
 
+void TextureD3D::onLabelUpdate()
+{
+    if (mTexStorage)
+    {
+        mTexStorage->onLabelUpdate();
+    }
+}
+
 angle::Result TextureD3D::syncState(const gl::Context *context,
                                     const gl::Texture::DirtyBits &dirtyBits,
                                     gl::Command source)
 {
-    if (dirtyBits.test(gl::Texture::DirtyBitType::DIRTY_BIT_LABEL))
-    {
-        mTexStorage->onLabelUpdate();
-    }
     // This could be improved using dirty bits.
     return angle::Result::Continue;
 }
@@ -714,6 +718,8 @@
         return angle::Result::Continue;
     }
 
+    onStateChange(angle::SubjectMessage::StorageReleased);
+
     auto err = mTexStorage->onDestroy(context);
     SafeDelete(mTexStorage);
     return err;
diff --git a/src/libANGLE/renderer/d3d/TextureD3D.h b/src/libANGLE/renderer/d3d/TextureD3D.h
index 037c669..74f2e94 100644
--- a/src/libANGLE/renderer/d3d/TextureD3D.h
+++ b/src/libANGLE/renderer/d3d/TextureD3D.h
@@ -117,6 +117,8 @@
 
     GLsizei getRenderToTextureSamples();
 
+    void onLabelUpdate() override;
+
     // ObserverInterface implementation.
     void onSubjectStateChange(angle::SubjectIndex index, angle::SubjectMessage message) override;
 
diff --git a/src/libANGLE/renderer/d3d/d3d11/Blit11.cpp b/src/libANGLE/renderer/d3d/d3d11/Blit11.cpp
index e54166f..0832bdd 100644
--- a/src/libANGLE/renderer/d3d/d3d11/Blit11.cpp
+++ b/src/libANGLE/renderer/d3d/d3d11/Blit11.cpp
@@ -596,7 +596,7 @@
     Context11 *context11 = GetImplAs<Context11>(context);
 
     ANGLE_TRY(mRenderer->allocateResource(context11, vbDesc, &mVertexBuffer));
-    mVertexBuffer.setDebugName("Blit11 vertex buffer");
+    mVertexBuffer.setInternalName("Blit11VertexBuffer");
 
     D3D11_SAMPLER_DESC pointSamplerDesc;
     pointSamplerDesc.Filter         = D3D11_FILTER_MIN_MAG_POINT_MIP_LINEAR;
@@ -614,7 +614,7 @@
     pointSamplerDesc.MaxLOD         = FLT_MAX;
 
     ANGLE_TRY(mRenderer->allocateResource(context11, pointSamplerDesc, &mPointSampler));
-    mPointSampler.setDebugName("Blit11 point sampler");
+    mPointSampler.setInternalName("Blit11PointSampler");
 
     D3D11_SAMPLER_DESC linearSamplerDesc;
     linearSamplerDesc.Filter         = D3D11_FILTER_MIN_MAG_MIP_LINEAR;
@@ -632,7 +632,7 @@
     linearSamplerDesc.MaxLOD         = FLT_MAX;
 
     ANGLE_TRY(mRenderer->allocateResource(context11, linearSamplerDesc, &mLinearSampler));
-    mLinearSampler.setDebugName("Blit11 linear sampler");
+    mLinearSampler.setInternalName("Blit11LinearSampler");
 
     // Use a rasterizer state that will not cull so that inverted quads will not be culled
     D3D11_RASTERIZER_DESC rasterDesc;
@@ -648,11 +648,11 @@
 
     rasterDesc.ScissorEnable = TRUE;
     ANGLE_TRY(mRenderer->allocateResource(context11, rasterDesc, &mScissorEnabledRasterizerState));
-    mScissorEnabledRasterizerState.setDebugName("Blit11 scissoring rasterizer state");
+    mScissorEnabledRasterizerState.setInternalName("Blit11ScissoringRasterizerState");
 
     rasterDesc.ScissorEnable = FALSE;
     ANGLE_TRY(mRenderer->allocateResource(context11, rasterDesc, &mScissorDisabledRasterizerState));
-    mScissorDisabledRasterizerState.setDebugName("Blit11 no scissoring rasterizer state");
+    mScissorDisabledRasterizerState.setInternalName("Blit11NoScissoringRasterizerState");
 
     D3D11_DEPTH_STENCIL_DESC depthStencilDesc;
     depthStencilDesc.DepthEnable                  = TRUE;
@@ -671,7 +671,7 @@
     depthStencilDesc.BackFace.StencilFunc         = D3D11_COMPARISON_ALWAYS;
 
     ANGLE_TRY(mRenderer->allocateResource(context11, depthStencilDesc, &mDepthStencilState));
-    mDepthStencilState.setDebugName("Blit11 depth stencil state");
+    mDepthStencilState.setInternalName("Blit11DepthStencilState");
 
     D3D11_BUFFER_DESC swizzleBufferDesc;
     swizzleBufferDesc.ByteWidth           = sizeof(unsigned int) * 4;
@@ -682,7 +682,7 @@
     swizzleBufferDesc.StructureByteStride = 0;
 
     ANGLE_TRY(mRenderer->allocateResource(context11, swizzleBufferDesc, &mSwizzleCB));
-    mSwizzleCB.setDebugName("Blit11 swizzle constant buffer");
+    mSwizzleCB.setInternalName("Blit11SwizzleConstantBuffer");
 
     mResourcesInitialized = true;
 
@@ -1342,7 +1342,7 @@
 
     d3d11::PixelShader ps;
     ANGLE_TRY(mRenderer->allocateResource(GetImplAs<Context11>(context), shaderData, &ps));
-    ps.setDebugName(name);
+    ps.setInternalName(name);
 
     Shader shader;
     shader.dimension   = dimension;
@@ -1362,7 +1362,7 @@
 
     d3d11::PixelShader ps;
     ANGLE_TRY(mRenderer->allocateResource(GetImplAs<Context11>(context), shaderData, &ps));
-    ps.setDebugName(name);
+    ps.setInternalName(name);
 
     Shader shader;
     shader.dimension   = dimension;
@@ -1770,7 +1770,7 @@
     Context11 *context11 = GetImplAs<Context11>(context);
 
     ANGLE_TRY(mRenderer->allocateTexture(context11, textureDesc, format, &mResolvedDepth));
-    mResolvedDepth.setDebugName("Blit11::mResolvedDepth");
+    mResolvedDepth.setInternalName("Blit11::mResolvedDepth");
 
     D3D11_DEPTH_STENCIL_VIEW_DESC dsvDesc;
     dsvDesc.Flags              = 0;
@@ -1780,7 +1780,7 @@
 
     ANGLE_TRY(mRenderer->allocateResource(context11, dsvDesc, mResolvedDepth.get(),
                                           &mResolvedDepthDSView));
-    mResolvedDepthDSView.setDebugName("Blit11::mResolvedDepthDSView");
+    mResolvedDepthDSView.setInternalName("Blit11::mResolvedDepthDSView");
 
     // Possibly D3D11 bug or undefined behaviour: Clear the DSV so that our first render
     // works as expected. Otherwise the results of the first use seem to be incorrect.
@@ -1824,11 +1824,11 @@
 
     ANGLE_TRY(
         mRenderer->allocateTexture(context11, textureDesc, formatSet, &mResolvedDepthStencil));
-    mResolvedDepthStencil.setDebugName("Blit11::mResolvedDepthStencil");
+    mResolvedDepthStencil.setInternalName("Blit11::mResolvedDepthStencil");
 
     ANGLE_TRY(mRenderer->allocateResourceNoDesc(context11, mResolvedDepthStencil.get(),
                                                 &mResolvedDepthStencilRTView));
-    mResolvedDepthStencilRTView.setDebugName("Blit11::mResolvedDepthStencilRTView");
+    mResolvedDepthStencilRTView.setInternalName("Blit11::mResolvedDepthStencilRTView");
 
     return angle::Result::Continue;
 }
@@ -1875,7 +1875,7 @@
 
         ANGLE_TRY(
             mRenderer->allocateResource(context11, srViewDesc, stencilResource, &mStencilSRV));
-        mStencilSRV.setDebugName("Blit11::mStencilSRV");
+        mStencilSRV.setInternalName("Blit11::mStencilSRV");
     }
 
     // Notify the Renderer that all state should be invalidated.
diff --git a/src/libANGLE/renderer/d3d/d3d11/Buffer11.cpp b/src/libANGLE/renderer/d3d/d3d11/Buffer11.cpp
index 1e8f82b..b69794f 100644
--- a/src/libANGLE/renderer/d3d/d3d11/Buffer11.cpp
+++ b/src/libANGLE/renderer/d3d/d3d11/Buffer11.cpp
@@ -999,6 +999,11 @@
         return angle::Result::Continue;
     }
 
+    if (latestBuffer->getSize() == 0 || storage->getSize() == 0)
+    {
+        return angle::Result::Continue;
+    }
+
     // Copy through a staging buffer if we're copying from or to a non-staging, mappable
     // buffer storage. This is because we can't map a GPU buffer, and copy CPU
     // data directly. If we're already using a staging buffer we're fine.
@@ -1230,7 +1235,7 @@
     d3d11::Buffer newBuffer;
     ANGLE_TRY(
         mRenderer->allocateResource(SafeGetImplAs<Context11>(context), bufferDesc, &newBuffer));
-    newBuffer.setDebugName("Buffer11::NativeStorage");
+    newBuffer.setInternalName("Buffer11::NativeStorage");
 
     if (mBuffer.valid() && preserveData)
     {
@@ -1478,7 +1483,7 @@
     d3d11::Buffer newBuffer;
     ANGLE_TRY(
         mRenderer->allocateResource(SafeGetImplAs<Context11>(context), bufferDesc, &newBuffer));
-    newBuffer.setDebugName("Buffer11::StructuredBufferStorage");
+    newBuffer.setInternalName("Buffer11::StructuredBufferStorage");
 
     // No longer need the old buffer
     mBuffer = std::move(newBuffer);
@@ -1632,7 +1637,7 @@
 
         ANGLE_TRY(mRenderer->allocateResource(GetImplAs<Context11>(context), bufferDesc,
                                               &subResourceData, &mBuffer));
-        mBuffer.setDebugName("Buffer11::EmulatedIndexedStorage");
+        mBuffer.setInternalName("Buffer11::EmulatedIndexedStorage");
     }
 
     *bufferOut = &mBuffer;
diff --git a/src/libANGLE/renderer/d3d/d3d11/Clear11.cpp b/src/libANGLE/renderer/d3d/d3d11/Clear11.cpp
index 0573970..ace4d66 100644
--- a/src/libANGLE/renderer/d3d/d3d11/Clear11.cpp
+++ b/src/libANGLE/renderer/d3d/d3d11/Clear11.cpp
@@ -262,11 +262,11 @@
     Context11 *context11 = GetImplAs<Context11>(context);
 
     ANGLE_TRY(mRenderer->allocateResource(context11, rsDesc, &mScissorDisabledRasterizerState));
-    mScissorDisabledRasterizerState.setDebugName("Clear11 Rasterizer State with scissor disabled");
+    mScissorDisabledRasterizerState.setInternalName("Clear11RasterizerStateWithScissorDisabled");
 
     rsDesc.ScissorEnable = TRUE;
     ANGLE_TRY(mRenderer->allocateResource(context11, rsDesc, &mScissorEnabledRasterizerState));
-    mScissorEnabledRasterizerState.setDebugName("Clear11 Rasterizer State with scissor enabled");
+    mScissorEnabledRasterizerState.setInternalName("Clear11RasterizerStateWithScissorEnabled");
 
     // Initialize Depthstencil state with defaults
     mDepthStencilStateKey.depthTest                = false;
@@ -322,7 +322,7 @@
 
     ANGLE_TRY(mRenderer->allocateResource(GetImplAs<Context11>(context), bufferDesc, &initialData,
                                           &mConstantBuffer));
-    mConstantBuffer.setDebugName("Clear11 Constant Buffer");
+    mConstantBuffer.setInternalName("Clear11ConstantBuffer");
     return angle::Result::Continue;
 }
 
@@ -360,7 +360,7 @@
 
     ANGLE_TRY(mRenderer->allocateResource(GetImplAs<Context11>(context), bufferDesc, &initialData,
                                           &mVertexBuffer));
-    mVertexBuffer.setDebugName("Clear11 Vertex Buffer");
+    mVertexBuffer.setInternalName("Clear11VertexBuffer");
     return angle::Result::Continue;
 }
 
diff --git a/src/libANGLE/renderer/d3d/d3d11/Context11.cpp b/src/libANGLE/renderer/d3d/d3d11/Context11.cpp
index 84d3762..282fd77 100644
--- a/src/libANGLE/renderer/d3d/d3d11/Context11.cpp
+++ b/src/libANGLE/renderer/d3d/d3d11/Context11.cpp
@@ -785,6 +785,12 @@
 
 angle::Result Context11::onMakeCurrent(const gl::Context *context)
 {
+    // Immediately return if the device has been lost.
+    if (!mRenderer->getDevice())
+    {
+        return angle::Result::Continue;
+    }
+
     return mRenderer->getStateManager()->onMakeCurrent(context);
 }
 
diff --git a/src/libANGLE/renderer/d3d/d3d11/ExternalImageSiblingImpl11.cpp b/src/libANGLE/renderer/d3d/d3d11/ExternalImageSiblingImpl11.cpp
index c0481f8..8329cbd 100644
--- a/src/libANGLE/renderer/d3d/d3d11/ExternalImageSiblingImpl11.cpp
+++ b/src/libANGLE/renderer/d3d/d3d11/ExternalImageSiblingImpl11.cpp
@@ -81,6 +81,11 @@
     return mYUV;
 }
 
+bool ExternalImageSiblingImpl11::hasProtectedContent() const
+{
+    return mHasProtectedContent;
+}
+
 gl::Extents ExternalImageSiblingImpl11::getSize() const
 {
     return gl::Extents(mWidth, mHeight, 1);
@@ -153,7 +158,7 @@
         }
 
         ANGLE_TRY(mRenderer->allocateResource(context11, rtvDesc, mTexture.get(), &rtv));
-        rtv.setDebugName("getAttachmentRenderTarget.RTV");
+        rtv.setInternalName("getAttachmentRenderTarget.RTV");
     }
 
     d3d11::SharedSRV srv;
@@ -193,7 +198,7 @@
         }
 
         ANGLE_TRY(mRenderer->allocateResource(context11, srvDesc, mTexture.get(), &srv));
-        srv.setDebugName("getAttachmentRenderTarget.SRV");
+        srv.setInternalName("getAttachmentRenderTarget.SRV");
     }
     d3d11::SharedSRV blitSrv = srv.makeCopy();
 
diff --git a/src/libANGLE/renderer/d3d/d3d11/ExternalImageSiblingImpl11.h b/src/libANGLE/renderer/d3d/d3d11/ExternalImageSiblingImpl11.h
index a163bca..45dd42c 100644
--- a/src/libANGLE/renderer/d3d/d3d11/ExternalImageSiblingImpl11.h
+++ b/src/libANGLE/renderer/d3d/d3d11/ExternalImageSiblingImpl11.h
@@ -30,6 +30,7 @@
     bool isRenderable(const gl::Context *context) const override;
     bool isTexturable(const gl::Context *context) const override;
     bool isYUV() const override;
+    bool hasProtectedContent() const override;
     gl::Extents getSize() const override;
     size_t getSamples() const override;
 
@@ -51,15 +52,16 @@
 
     TextureHelper11 mTexture;
 
-    gl::Format mFormat   = gl::Format::Invalid();
-    bool mIsRenderable   = false;
-    bool mIsTexturable   = false;
-    bool mIsTextureArray = false;
-    bool mYUV            = false;
-    EGLint mWidth        = 0;
-    EGLint mHeight       = 0;
-    GLsizei mSamples     = 0;
-    UINT mArraySlice     = 0;
+    gl::Format mFormat        = gl::Format::Invalid();
+    bool mIsRenderable        = false;
+    bool mIsTexturable        = false;
+    bool mIsTextureArray      = false;
+    bool mYUV                 = false;
+    bool mHasProtectedContent = false;
+    EGLint mWidth             = 0;
+    EGLint mHeight            = 0;
+    GLsizei mSamples          = 0;
+    UINT mArraySlice          = 0;
 
     std::unique_ptr<RenderTargetD3D> mRenderTarget;
 };
diff --git a/src/libANGLE/renderer/d3d/d3d11/Image11.cpp b/src/libANGLE/renderer/d3d/d3d11/Image11.cpp
index cb5563e..cc5c520 100644
--- a/src/libANGLE/renderer/d3d/d3d11/Image11.cpp
+++ b/src/libANGLE/renderer/d3d/d3d11/Image11.cpp
@@ -578,7 +578,7 @@
                     mRenderer->allocateTexture(context11, desc, formatInfo, &mStagingTexture));
             }
 
-            mStagingTexture.setDebugName("Image11::StagingTexture3D");
+            mStagingTexture.setInternalName("Image11::StagingTexture3D");
             mStagingSubresource = D3D11CalcSubresource(lodOffset, 0, lodOffset + 1);
             mStagingTextureSubresourceVerifier.setDesc(desc);
         }
@@ -617,7 +617,7 @@
                     mRenderer->allocateTexture(context11, desc, formatInfo, &mStagingTexture));
             }
 
-            mStagingTexture.setDebugName("Image11::StagingTexture2D");
+            mStagingTexture.setInternalName("Image11::StagingTexture2D");
             mStagingSubresource = D3D11CalcSubresource(lodOffset, 0, lodOffset + 1);
             mStagingTextureSubresourceVerifier.setDesc(desc);
         }
diff --git a/src/libANGLE/renderer/d3d/d3d11/IndexBuffer11.cpp b/src/libANGLE/renderer/d3d/d3d11/IndexBuffer11.cpp
index 6124d6b..7630b34 100644
--- a/src/libANGLE/renderer/d3d/d3d11/IndexBuffer11.cpp
+++ b/src/libANGLE/renderer/d3d/d3d11/IndexBuffer11.cpp
@@ -49,11 +49,11 @@
 
         if (dynamic)
         {
-            mBuffer.setDebugName("IndexBuffer11 (dynamic)");
+            mBuffer.setInternalName("IndexBuffer11(dynamic)");
         }
         else
         {
-            mBuffer.setDebugName("IndexBuffer11 (static)");
+            mBuffer.setInternalName("IndexBuffer11(static)");
         }
     }
 
diff --git a/src/libANGLE/renderer/d3d/d3d11/PixelTransfer11.cpp b/src/libANGLE/renderer/d3d/d3d11/PixelTransfer11.cpp
index dd71e13..2d15bf3 100644
--- a/src/libANGLE/renderer/d3d/d3d11/PixelTransfer11.cpp
+++ b/src/libANGLE/renderer/d3d/d3d11/PixelTransfer11.cpp
@@ -97,16 +97,16 @@
     constantBufferDesc.StructureByteStride = 0;
 
     ANGLE_TRY(mRenderer->allocateResource(context11, constantBufferDesc, &mParamsConstantBuffer));
-    mParamsConstantBuffer.setDebugName("PixelTransfer11 constant buffer");
+    mParamsConstantBuffer.setInternalName("PixelTransfer11ConstantBuffer");
 
     // init shaders
     ANGLE_TRY(mRenderer->allocateResource(context11, ShaderData(g_VS_BufferToTexture),
                                           &mBufferToTextureVS));
-    mBufferToTextureVS.setDebugName("BufferToTexture VS");
+    mBufferToTextureVS.setInternalName("BufferToTextureVS");
 
     ANGLE_TRY(mRenderer->allocateResource(context11, ShaderData(g_GS_BufferToTexture),
                                           &mBufferToTextureGS));
-    mBufferToTextureGS.setDebugName("BufferToTexture GS");
+    mBufferToTextureGS.setInternalName("BufferToTextureGS");
 
     ANGLE_TRY(buildShaderMap(context));
 
@@ -245,9 +245,9 @@
     ANGLE_TRY(mRenderer->allocateResource(context11, ShaderData(g_PS_BufferToTexture_4UI),
                                           &bufferToTextureUint));
 
-    bufferToTextureFloat.setDebugName("BufferToTexture RGBA ps");
-    bufferToTextureInt.setDebugName("BufferToTexture RGBA-I ps");
-    bufferToTextureUint.setDebugName("BufferToTexture RGBA-UI ps");
+    bufferToTextureFloat.setInternalName("BufferToTextureRGBA.ps");
+    bufferToTextureInt.setInternalName("BufferToTextureRGBA-I.ps");
+    bufferToTextureUint.setInternalName("BufferToTextureRGBA-UI.ps");
 
     mBufferToTexturePSMap[GL_FLOAT]        = std::move(bufferToTextureFloat);
     mBufferToTexturePSMap[GL_INT]          = std::move(bufferToTextureInt);
diff --git a/src/libANGLE/renderer/d3d/d3d11/Renderer11.cpp b/src/libANGLE/renderer/d3d/d3d11/Renderer11.cpp
index 64a62c7..d6a4c1a 100644
--- a/src/libANGLE/renderer/d3d/d3d11/Renderer11.cpp
+++ b/src/libANGLE/renderer/d3d/d3d11/Renderer11.cpp
@@ -954,7 +954,7 @@
 
     mResourceManager11.setAllocationsInitialized(mCreateDebugDevice);
 
-    d3d11::SetDebugName(mDeviceContext, "DeviceContext");
+    d3d11::SetDebugName(mDeviceContext, "DeviceContext", nullptr);
 
     mAnnotator.initialize(mDeviceContext);
     gl::InitializeDebugAnnotations(&mAnnotator);
@@ -1532,6 +1532,10 @@
             case DXGI_FORMAT_R16G16B16A16_FLOAT:
             case DXGI_FORMAT_R32G32B32A32_FLOAT:
             case DXGI_FORMAT_R10G10B10A2_UNORM:
+            case DXGI_FORMAT_R8_UNORM:
+            case DXGI_FORMAT_R8G8_UNORM:
+            case DXGI_FORMAT_R16_UNORM:
+            case DXGI_FORMAT_R16G16_UNORM:
                 break;
 
             default:
@@ -1553,6 +1557,11 @@
                 case GL_RGBA:
                 case GL_BGRA_EXT:
                 case GL_RGB:
+                case GL_RED_EXT:
+                case GL_RG_EXT:
+                case GL_RGB10_A2_EXT:
+                case GL_R16_EXT:
+                case GL_RG16_EXT:
                     break;
                 default:
                     return egl::EglBadParameter()
@@ -2867,7 +2876,7 @@
 
         TextureHelper11 texture;
         ANGLE_TRY(allocateTexture(context11, desc, formatInfo, &texture));
-        texture.setDebugName("createRenderTarget.Texture");
+        texture.setInternalName("createRenderTarget.Texture");
 
         d3d11::SharedSRV srv;
         d3d11::SharedSRV blitSRV;
@@ -2881,7 +2890,7 @@
             srvDesc.Texture2D.MipLevels       = 1;
 
             ANGLE_TRY(allocateResource(context11, srvDesc, texture.get(), &srv));
-            srv.setDebugName("createRenderTarget.SRV");
+            srv.setInternalName("createRenderTarget.SRV");
 
             if (formatInfo.blitSRVFormat != formatInfo.srvFormat)
             {
@@ -2894,7 +2903,7 @@
                 blitSRVDesc.Texture2D.MipLevels       = 1;
 
                 ANGLE_TRY(allocateResource(context11, blitSRVDesc, texture.get(), &blitSRV));
-                blitSRV.setDebugName("createRenderTarget.BlitSRV");
+                blitSRV.setInternalName("createRenderTarget.BlitSRV");
             }
             else
             {
@@ -2913,7 +2922,7 @@
 
             d3d11::DepthStencilView dsv;
             ANGLE_TRY(allocateResource(context11, dsvDesc, texture.get(), &dsv));
-            dsv.setDebugName("createRenderTarget.DSV");
+            dsv.setInternalName("createRenderTarget.DSV");
 
             *outRT = new TextureRenderTarget11(std::move(dsv), texture, srv, format, formatInfo,
                                                width, height, 1, supportedSamples);
@@ -2928,7 +2937,7 @@
 
             d3d11::RenderTargetView rtv;
             ANGLE_TRY(allocateResource(context11, rtvDesc, texture.get(), &rtv));
-            rtv.setDebugName("createRenderTarget.RTV");
+            rtv.setInternalName("createRenderTarget.RTV");
 
             if (formatInfo.dataInitializerFunction != nullptr)
             {
@@ -3444,7 +3453,7 @@
     ANGLE_TRY(createStagingTexture(context, textureHelper.getTextureType(),
                                    textureHelper.getFormatSet(), safeSize, StagingAccess::READ,
                                    &stagingHelper));
-    stagingHelper.setDebugName("readFromAttachment::stagingHelper");
+    stagingHelper.setInternalName("readFromAttachment::stagingHelper");
 
     TextureHelper11 resolvedTextureHelper;
 
@@ -3469,7 +3478,7 @@
 
         ANGLE_TRY(allocateTexture(GetImplAs<Context11>(context), resolveDesc,
                                   textureHelper.getFormatSet(), &resolvedTextureHelper));
-        resolvedTextureHelper.setDebugName("readFromAttachment::resolvedTextureHelper");
+        resolvedTextureHelper.setInternalName("readFromAttachment::resolvedTextureHelper");
 
         mDeviceContext->ResolveSubresource(resolvedTextureHelper.get(), 0, textureHelper.get(),
                                            sourceSubResource, textureHelper.getFormat());
diff --git a/src/libANGLE/renderer/d3d/d3d11/ResourceManager11.h b/src/libANGLE/renderer/d3d/d3d11/ResourceManager11.h
index 66f5e16..178c343 100644
--- a/src/libANGLE/renderer/d3d/d3d11/ResourceManager11.h
+++ b/src/libANGLE/renderer/d3d/d3d11/ResourceManager11.h
@@ -24,12 +24,16 @@
 // These two methods are declared here to prevent circular includes.
 namespace d3d11
 {
-HRESULT SetDebugName(ID3D11DeviceChild *resource, const char *name);
+HRESULT SetDebugName(ID3D11DeviceChild *resource,
+                     const char *internalName,
+                     const std::string *khrDebugName);
 
 template <typename T>
-HRESULT SetDebugName(angle::ComPtr<T> &resource, const char *name)
+HRESULT SetDebugName(angle::ComPtr<T> &resource,
+                     const char *internalName,
+                     const std::string *khrDebugName)
 {
-    return SetDebugName(resource.Get(), name);
+    return SetDebugName(resource.Get(), internalName, khrDebugName);
 }
 }  // namespace d3d11
 
@@ -191,7 +195,17 @@
     T *get() const { return mData->object; }
     T *const *getPointer() const { return &mData->object; }
 
-    void setDebugName(const char *name) { d3d11::SetDebugName(mData->object, name); }
+    void setInternalName(const char *name)
+    {
+        internalDebugName = name;
+        UpdateDebugNameWithD3D();
+    }
+
+    void setKHRDebugLabel(const std::string *label)
+    {
+        khrDebugName = label;
+        UpdateDebugNameWithD3D();
+    }
 
     void set(T *object)
     {
@@ -231,6 +245,15 @@
     }
 
     Pointer<DataT> mData;
+
+  private:
+    void UpdateDebugNameWithD3D()
+    {
+        d3d11::SetDebugName(mData->object, internalDebugName, khrDebugName);
+    }
+
+    const std::string *khrDebugName = nullptr;
+    const char *internalDebugName   = nullptr;
 };
 
 template <typename T>
diff --git a/src/libANGLE/renderer/d3d/d3d11/SwapChain11.cpp b/src/libANGLE/renderer/d3d/d3d11/SwapChain11.cpp
index 23fe302..b020268 100644
--- a/src/libANGLE/renderer/d3d/d3d11/SwapChain11.cpp
+++ b/src/libANGLE/renderer/d3d/d3d11/SwapChain11.cpp
@@ -272,7 +272,7 @@
             return EGL_BAD_ALLOC;
         }
 
-        mOffscreenTexture.setDebugName("OffscreenBackBufferTexture");
+        mOffscreenTexture.setInternalName("OffscreenBackBufferTexture");
 
         // EGL_ANGLE_surface_d3d_texture_2d_share_handle requires that we store a share handle for
         // the client
@@ -319,7 +319,7 @@
         release();
         return EGL_BAD_ALLOC;
     }
-    mOffscreenRTView.setDebugName("OffscreenBackBufferRenderTarget");
+    mOffscreenRTView.setInternalName("OffscreenBackBufferRenderTarget");
 
     D3D11_SHADER_RESOURCE_VIEW_DESC offscreenSRVDesc;
     offscreenSRVDesc.Format = backbufferFormatInfo.srvFormat;
@@ -339,7 +339,7 @@
             release();
             return EGL_BAD_ALLOC;
         }
-        mOffscreenSRView.setDebugName("OffscreenBackBufferShaderResource");
+        mOffscreenSRView.setInternalName("OffscreenBackBufferShaderResource");
     }
     else
     {
@@ -428,7 +428,7 @@
             release();
             return EGL_BAD_ALLOC;
         }
-        mDepthStencilTexture.setDebugName("OffscreenDepthStencilTexture");
+        mDepthStencilTexture.setInternalName("OffscreenDepthStencilTexture");
 
         D3D11_DEPTH_STENCIL_VIEW_DESC depthStencilDesc;
         depthStencilDesc.Format = depthBufferFormatInfo.dsvFormat;
@@ -440,7 +440,7 @@
         result = mRenderer->allocateResource(displayD3D, depthStencilDesc,
                                              mDepthStencilTexture.get(), &mDepthStencilDSView);
         ASSERT(result != angle::Result::Stop);
-        mDepthStencilDSView.setDebugName("OffscreenDSV");
+        mDepthStencilDSView.setInternalName("OffscreenDSV");
 
         if (depthStencilSRV)
         {
@@ -455,7 +455,7 @@
             result = mRenderer->allocateResource(displayD3D, depthStencilSRVDesc,
                                                  mDepthStencilTexture.get(), &mDepthStencilSRView);
             ASSERT(result != angle::Result::Stop);
-            mDepthStencilSRView.setDebugName("OffscreenDepthStencilSRV");
+            mDepthStencilSRView.setInternalName("OffscreenDepthStencilSRV");
         }
     }
 
@@ -532,17 +532,17 @@
         const auto &format =
             d3d11::Format::Get(mOffscreenRenderTargetFormat, mRenderer->getRenderer11DeviceCaps());
         mBackBufferTexture.set(backbufferTexture, format);
-        mBackBufferTexture.setDebugName("BackBufferTexture");
+        mBackBufferTexture.setInternalName("BackBufferTexture");
 
         angle::Result result = mRenderer->allocateResourceNoDesc(
             displayD3D, mBackBufferTexture.get(), &mBackBufferRTView);
         ASSERT(result != angle::Result::Stop);
-        mBackBufferRTView.setDebugName("BackBufferRTV");
+        mBackBufferRTView.setInternalName("BackBufferRTV");
 
         result = mRenderer->allocateResourceNoDesc(displayD3D, mBackBufferTexture.get(),
                                                    &mBackBufferSRView);
         ASSERT(result != angle::Result::Stop);
-        mBackBufferSRView.setDebugName("BackBufferSRV");
+        mBackBufferSRView.setInternalName("BackBufferSRV");
     }
 
     mFirstSwap = true;
@@ -656,17 +656,17 @@
         const auto &format =
             d3d11::Format::Get(mOffscreenRenderTargetFormat, mRenderer->getRenderer11DeviceCaps());
         mBackBufferTexture.set(backbufferTex, format);
-        mBackBufferTexture.setDebugName("BackBufferTexture");
+        mBackBufferTexture.setInternalName("BackBufferTexture");
 
         angle::Result result = mRenderer->allocateResourceNoDesc(
             displayD3D, mBackBufferTexture.get(), &mBackBufferRTView);
         ASSERT(result != angle::Result::Stop);
-        mBackBufferRTView.setDebugName("BackBufferRTV");
+        mBackBufferRTView.setInternalName("BackBufferRTV");
 
         result = mRenderer->allocateResourceNoDesc(displayD3D, mBackBufferTexture.get(),
                                                    &mBackBufferSRView);
         ASSERT(result != angle::Result::Stop);
-        mBackBufferSRView.setDebugName("BackBufferSRV");
+        mBackBufferSRView.setInternalName("BackBufferSRV");
     }
 
     mFirstSwap = true;
@@ -699,7 +699,7 @@
     vbDesc.StructureByteStride = 0;
 
     ANGLE_TRY(mRenderer->allocateResource(displayD3D, vbDesc, &mQuadVB));
-    mQuadVB.setDebugName("SwapChainQuadVB");
+    mQuadVB.setInternalName("SwapChainQuadVB");
 
     D3D11_SAMPLER_DESC samplerDesc;
     samplerDesc.Filter         = D3D11_FILTER_MIN_MAG_MIP_POINT;
@@ -717,7 +717,7 @@
     samplerDesc.MaxLOD         = D3D11_FLOAT32_MAX;
 
     ANGLE_TRY(mRenderer->allocateResource(displayD3D, samplerDesc, &mPassThroughSampler));
-    mPassThroughSampler.setDebugName("SwapChainPassThroughSampler");
+    mPassThroughSampler.setInternalName("SwapChainPassThroughSampler");
 
     D3D11_INPUT_ELEMENT_DESC quadLayout[] = {
         {"POSITION", 0, DXGI_FORMAT_R32G32_FLOAT, 0, 0, D3D11_INPUT_PER_VERTEX_DATA, 0},
@@ -729,10 +729,10 @@
 
     ANGLE_TRY(
         mRenderer->allocateResource(displayD3D, quadElements, &vertexShaderData, &mPassThroughIL));
-    mPassThroughIL.setDebugName("SwapChainPassThroughIL");
+    mPassThroughIL.setInternalName("SwapChainPassThroughIL");
 
     ANGLE_TRY(mRenderer->allocateResource(displayD3D, vertexShaderData, &mPassThroughVS));
-    mPassThroughVS.setDebugName("SwapChainPassThroughVS");
+    mPassThroughVS.setInternalName("SwapChainPassThroughVS");
 
     if (mEGLSamples <= 1)
     {
@@ -756,7 +756,7 @@
         }
     }
 
-    mPassThroughOrResolvePS.setDebugName("SwapChainPassThroughPS");
+    mPassThroughOrResolvePS.setInternalName("SwapChainPassThroughPS");
 
     // Use the default rasterizer state but without culling
     D3D11_RASTERIZER_DESC rasterizerDesc;
@@ -772,7 +772,7 @@
     rasterizerDesc.AntialiasedLineEnable = FALSE;
 
     ANGLE_TRY(mRenderer->allocateResource(displayD3D, rasterizerDesc, &mPassThroughRS));
-    mPassThroughRS.setDebugName("Swap chain pass through rasterizer state");
+    mPassThroughRS.setInternalName("SwapChainPassThroughRasterizerState");
 
     mPassThroughResourcesInit = true;
     return angle::Result::Continue;
@@ -995,7 +995,7 @@
         angle::Result result             = mRenderer->allocateTexture(
             context, offscreenCopyDesc, backbufferFormatInfo, &mOffscreenTextureCopyForSRV);
         ASSERT(result != angle::Result::Stop);
-        mOffscreenTextureCopyForSRV.setDebugName("OffscreenBackBufferCopyForSRV");
+        mOffscreenTextureCopyForSRV.setInternalName("OffscreenBackBufferCopyForSRV");
 
         D3D11_SHADER_RESOURCE_VIEW_DESC offscreenSRVDesc;
         offscreenSRVDesc.Format = backbufferFormatInfo.srvFormat;
@@ -1007,7 +1007,7 @@
         result = mRenderer->allocateResource(context, offscreenSRVDesc,
                                              mOffscreenTextureCopyForSRV.get(), &mOffscreenSRView);
         ASSERT(result != angle::Result::Stop);
-        mOffscreenSRView.setDebugName("OffscreenBackBufferSRV");
+        mOffscreenSRView.setInternalName("OffscreenBackBufferSRV");
     }
 
     // Need to copy the offscreen texture into the shader-readable copy, since it's external and
diff --git a/src/libANGLE/renderer/d3d/d3d11/TextureStorage11.cpp b/src/libANGLE/renderer/d3d/d3d11/TextureStorage11.cpp
index 68a9851..e6fa68b 100644
--- a/src/libANGLE/renderer/d3d/d3d11/TextureStorage11.cpp
+++ b/src/libANGLE/renderer/d3d/d3d11/TextureStorage11.cpp
@@ -1039,6 +1039,22 @@
     ASSERT(!mUseLevelZeroTexture || mRenderer->getFeatures().zeroMaxLodWorkaround.enabled);
 }
 
+void TextureStorage11_2D::onLabelUpdate()
+{
+    if (mTexture.valid())
+    {
+        mTexture.setKHRDebugLabel(&mTextureLabel);
+    }
+    if (mLevelZeroTexture.valid())
+    {
+        mLevelZeroTexture.setKHRDebugLabel(&mTextureLabel);
+    }
+    if (mSwizzleTexture.valid())
+    {
+        mSwizzleTexture.setKHRDebugLabel(&mTextureLabel);
+    }
+}
+
 angle::Result TextureStorage11_2D::onDestroy(const gl::Context *context)
 {
     for (unsigned i = 0; i < gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS; i++)
@@ -1270,11 +1286,11 @@
 
         if (useLevelZeroTexture)
         {
-            outputTexture->setDebugName("TexStorage2D.Level0Texture");
+            outputTexture->setInternalName("TexStorage2D.Level0Texture");
         }
         else
         {
-            outputTexture->setDebugName("TexStorage2D.Texture");
+            outputTexture->setInternalName("TexStorage2D.Texture");
         }
     }
 
@@ -1380,7 +1396,7 @@
             d3d11::RenderTargetView rtv;
             ANGLE_TRY(
                 mRenderer->allocateResource(context11, rtvDesc, mLevelZeroTexture.get(), &rtv));
-            rtv.setDebugName("TexStorage2D.Level0RTV");
+            rtv.setInternalName("TexStorage2D.Level0RTV");
 
             mLevelZeroRenderTarget.reset(new TextureRenderTarget11(
                 std::move(rtv), mLevelZeroTexture, d3d11::SharedSRV(), d3d11::SharedSRV(),
@@ -1401,7 +1417,7 @@
 
         d3d11::RenderTargetView rtv;
         ANGLE_TRY(mRenderer->allocateResource(context11, rtvDesc, texture->get(), &rtv));
-        rtv.setDebugName("TexStorage2D.RTV");
+        rtv.setInternalName("TexStorage2D.RTV");
 
         mRenderTarget[level].reset(new TextureRenderTarget11(
             std::move(rtv), *texture, *srv, *blitSRV, mFormatInfo.internalFormat, getFormatSet(),
@@ -1421,7 +1437,7 @@
 
     d3d11::DepthStencilView dsv;
     ANGLE_TRY(mRenderer->allocateResource(context11, dsvDesc, texture->get(), &dsv));
-    dsv.setDebugName("TexStorage2D.DSV");
+    dsv.setInternalName("TexStorage2D.DSV");
 
     mRenderTarget[level].reset(new TextureRenderTarget11(
         std::move(dsv), *texture, *srv, mFormatInfo.internalFormat, getFormatSet(),
@@ -1471,7 +1487,7 @@
 
     ANGLE_TRY(mRenderer->allocateResource(GetImplAs<Context11>(context), srvDesc, srvTexture->get(),
                                           outSRV));
-    outSRV->setDebugName("TexStorage2D.SRV");
+    outSRV->setInternalName("TexStorage2D.SRV");
 
     return angle::Result::Continue;
 }
@@ -1490,7 +1506,7 @@
     srvDesc.Texture2D.MipLevels       = 1;
     ANGLE_TRY(
         mRenderer->allocateResource(GetImplAs<Context11>(context), srvDesc, texture.get(), outSRV));
-    outSRV->setDebugName("TexStorage2D.SRVForImage");
+    outSRV->setInternalName("TexStorage2D.SRVForImage");
     return angle::Result::Continue;
 }
 
@@ -1507,7 +1523,7 @@
     uavDesc.Texture2D.MipSlice = mTopLevel + level;
     ANGLE_TRY(
         mRenderer->allocateResource(GetImplAs<Context11>(context), uavDesc, texture.get(), outUAV));
-    outUAV->setDebugName("TexStorage2D.UAVForImage");
+    outUAV->setInternalName("TexStorage2D.UAVForImage");
     return angle::Result::Continue;
 }
 
@@ -1535,7 +1551,7 @@
 
         ANGLE_TRY(mRenderer->allocateTexture(GetImplAs<Context11>(context), desc, format,
                                              &mSwizzleTexture));
-        mSwizzleTexture.setDebugName("TexStorage2D.SwizzleTexture");
+        mSwizzleTexture.setInternalName("TexStorage2D.SwizzleTexture");
     }
 
     *outTexture = &mSwizzleTexture;
@@ -1595,7 +1611,7 @@
         d3d11::Format::Get(GL_DEPTH_COMPONENT32F, mRenderer->getRenderer11DeviceCaps());
     ANGLE_TRY(mRenderer->allocateTexture(GetImplAs<Context11>(context), dropDesc, format,
                                          &mDropStencilTexture));
-    mDropStencilTexture.setDebugName("TexStorage2D.DropStencil");
+    mDropStencilTexture.setInternalName("TexStorage2D.DropStencil");
 
     ANGLE_TRY(initDropStencilTexture(context, gl::ImageIndexIterator::Make2D(0, mMipLevels)));
 
@@ -1749,7 +1765,7 @@
 
     ANGLE_TRY(
         mRenderer->allocateResource(GetImplAs<Context11>(context), srvDesc, texture.get(), outSRV));
-    outSRV->setDebugName("TexStorage2D.SRV");
+    outSRV->setInternalName("TexStorage2D.SRV");
 
     return angle::Result::Continue;
 }
@@ -1790,6 +1806,14 @@
     return angle::Result::Stop;
 }
 
+void TextureStorage11_External::onLabelUpdate()
+{
+    if (mTexture.valid())
+    {
+        mTexture.setKHRDebugLabel(&mTextureLabel);
+    }
+}
+
 TextureStorage11ImmutableBase::TextureStorage11ImmutableBase(Renderer11 *renderer,
                                                              UINT bindFlags,
                                                              UINT miscFlags,
@@ -1971,7 +1995,7 @@
 
         ANGLE_TRY(mRenderer->allocateTexture(GetImplAs<Context11>(context), desc, format,
                                              &mSwizzleTexture));
-        mSwizzleTexture.setDebugName("TexStorageEGLImage.SwizzleTexture");
+        mSwizzleTexture.setInternalName("TexStorageEGLImage.SwizzleTexture");
     }
 
     *outTexture = &mSwizzleTexture;
@@ -2043,7 +2067,7 @@
 
         ANGLE_TRY(mRenderer->allocateResource(GetImplAs<Context11>(context), srvDesc, texture.get(),
                                               outSRV));
-        outSRV->setDebugName("TexStorageEGLImage.SRV");
+        outSRV->setInternalName("TexStorageEGLImage.SRV");
     }
     else
     {
@@ -2067,6 +2091,14 @@
     return angle::Result::Continue;
 }
 
+void TextureStorage11_EGLImage::onLabelUpdate()
+{
+    if (mSwizzleTexture.valid())
+    {
+        mSwizzleTexture.setKHRDebugLabel(&mTextureLabel);
+    }
+}
+
 TextureStorage11_Cube::TextureStorage11_Cube(Renderer11 *renderer,
                                              GLenum internalformat,
                                              bool renderTarget,
@@ -2389,7 +2421,7 @@
 
         ANGLE_TRY(mRenderer->allocateTexture(GetImplAs<Context11>(context), desc, mFormatInfo,
                                              outputTexture));
-        outputTexture->setDebugName("TexStorageCube.Texture");
+        outputTexture->setInternalName("TexStorageCube.Texture");
     }
 
     return angle::Result::Continue;
@@ -2529,7 +2561,7 @@
             blitSRV = srv.makeCopy();
         }
 
-        srv.setDebugName("TexStorageCube.RenderTargetSRV");
+        srv.setInternalName("TexStorageCube.RenderTargetSRV");
 
         if (mFormatInfo.rtvFormat != DXGI_FORMAT_UNKNOWN)
         {
@@ -2542,7 +2574,7 @@
 
             d3d11::RenderTargetView rtv;
             ANGLE_TRY(mRenderer->allocateResource(context11, rtvDesc, texture->get(), &rtv));
-            rtv.setDebugName("TexStorageCube.RenderTargetRTV");
+            rtv.setInternalName("TexStorageCube.RenderTargetRTV");
 
             mRenderTarget[faceIndex][level].reset(new TextureRenderTarget11(
                 std::move(rtv), *texture, srv, blitSRV, mFormatInfo.internalFormat, getFormatSet(),
@@ -2560,7 +2592,7 @@
 
             d3d11::DepthStencilView dsv;
             ANGLE_TRY(mRenderer->allocateResource(context11, dsvDesc, texture->get(), &dsv));
-            dsv.setDebugName("TexStorageCube.RenderTargetDSV");
+            dsv.setInternalName("TexStorageCube.RenderTargetDSV");
 
             mRenderTarget[faceIndex][level].reset(new TextureRenderTarget11(
                 std::move(dsv), *texture, srv, mFormatInfo.internalFormat, getFormatSet(),
@@ -2632,7 +2664,7 @@
 
     ANGLE_TRY(mRenderer->allocateResource(GetImplAs<Context11>(context), srvDesc, srvTexture->get(),
                                           outSRV));
-    outSRV->setDebugName("TexStorageCube.SRV");
+    outSRV->setInternalName("TexStorageCube.SRV");
 
     return angle::Result::Continue;
 }
@@ -2653,7 +2685,7 @@
     srvDesc.Texture2DArray.ArraySize       = gl::kCubeFaceCount;
     ANGLE_TRY(
         mRenderer->allocateResource(GetImplAs<Context11>(context), srvDesc, texture.get(), outSRV));
-    outSRV->setDebugName("TexStorageCube.SRVForImage");
+    outSRV->setInternalName("TexStorageCube.SRVForImage");
     return angle::Result::Continue;
 }
 
@@ -2672,7 +2704,7 @@
     uavDesc.Texture2DArray.ArraySize       = gl::kCubeFaceCount;
     ANGLE_TRY(
         mRenderer->allocateResource(GetImplAs<Context11>(context), uavDesc, texture.get(), outUAV));
-    outUAV->setDebugName("TexStorageCube.UAVForImage");
+    outUAV->setInternalName("TexStorageCube.UAVForImage");
     return angle::Result::Continue;
 }
 
@@ -2700,7 +2732,7 @@
 
         ANGLE_TRY(mRenderer->allocateTexture(GetImplAs<Context11>(context), desc, format,
                                              &mSwizzleTexture));
-        mSwizzleTexture.setDebugName("TexStorageCube.SwizzleTexture");
+        mSwizzleTexture.setInternalName("TexStorageCube.SwizzleTexture");
     }
 
     *outTexture = &mSwizzleTexture;
@@ -2762,7 +2794,7 @@
         d3d11::Format::Get(GL_DEPTH_COMPONENT32F, mRenderer->getRenderer11DeviceCaps());
     ANGLE_TRY(mRenderer->allocateTexture(GetImplAs<Context11>(context), dropDesc, format,
                                          &mDropStencilTexture));
-    mDropStencilTexture.setDebugName("TexStorageCube.DropStencil");
+    mDropStencilTexture.setInternalName("TexStorageCube.DropStencil");
 
     ANGLE_TRY(initDropStencilTexture(context, gl::ImageIndexIterator::MakeCube(0, mMipLevels)));
 
@@ -2780,6 +2812,22 @@
     return angle::Result::Continue;
 }
 
+void TextureStorage11_Cube::onLabelUpdate()
+{
+    if (mTexture.valid())
+    {
+        mTexture.setKHRDebugLabel(&mTextureLabel);
+    }
+    if (mLevelZeroTexture.valid())
+    {
+        mLevelZeroTexture.setKHRDebugLabel(&mTextureLabel);
+    }
+    if (mSwizzleTexture.valid())
+    {
+        mSwizzleTexture.setKHRDebugLabel(&mTextureLabel);
+    }
+}
+
 TextureStorage11_3D::TextureStorage11_3D(Renderer11 *renderer,
                                          GLenum internalformat,
                                          bool renderTarget,
@@ -2914,7 +2962,7 @@
 
         ANGLE_TRY(mRenderer->allocateTexture(GetImplAs<Context11>(context), desc, mFormatInfo,
                                              &mTexture));
-        mTexture.setDebugName("TexStorage3D.Texture");
+        mTexture.setInternalName("TexStorage3D.Texture");
     }
 
     *outResource = &mTexture;
@@ -2938,7 +2986,7 @@
 
     ANGLE_TRY(
         mRenderer->allocateResource(GetImplAs<Context11>(context), srvDesc, texture.get(), outSRV));
-    outSRV->setDebugName("TexStorage3D.SRV");
+    outSRV->setInternalName("TexStorage3D.SRV");
 
     return angle::Result::Continue;
 }
@@ -2957,7 +3005,7 @@
     srvDesc.Texture3D.MipLevels       = 1;
     ANGLE_TRY(
         mRenderer->allocateResource(GetImplAs<Context11>(context), srvDesc, texture.get(), outSRV));
-    outSRV->setDebugName("TexStorage3D.SRVForImage");
+    outSRV->setInternalName("TexStorage3D.SRVForImage");
     return angle::Result::Continue;
 }
 
@@ -2976,7 +3024,7 @@
     uavDesc.Texture3D.WSize       = mTextureDepth;
     ANGLE_TRY(
         mRenderer->allocateResource(GetImplAs<Context11>(context), uavDesc, texture.get(), outUAV));
-    outUAV->setDebugName("TexStorage3D.UAVForImage");
+    outUAV->setInternalName("TexStorage3D.UAVForImage");
     return angle::Result::Continue;
 }
 
@@ -3044,7 +3092,7 @@
 
             d3d11::RenderTargetView rtv;
             ANGLE_TRY(mRenderer->allocateResource(context11, rtvDesc, texture->get(), &rtv));
-            rtv.setDebugName("TexStorage3D.RTV");
+            rtv.setInternalName("TexStorage3D.RTV");
 
             mLevelRenderTargets[mipLevel].reset(new TextureRenderTarget11(
                 std::move(rtv), *texture, *srv, *blitSRV, mFormatInfo.internalFormat,
@@ -3078,7 +3126,7 @@
 
         d3d11::RenderTargetView rtv;
         ANGLE_TRY(mRenderer->allocateResource(context11, rtvDesc, texture->get(), &rtv));
-        rtv.setDebugName("TexStorage3D.LayerRTV");
+        rtv.setInternalName("TexStorage3D.LayerRTV");
 
         mLevelLayerRenderTargets[key].reset(new TextureRenderTarget11(
             std::move(rtv), *texture, srv, blitSRV, mFormatInfo.internalFormat, getFormatSet(),
@@ -3112,7 +3160,7 @@
 
         ANGLE_TRY(mRenderer->allocateTexture(GetImplAs<Context11>(context), desc, format,
                                              &mSwizzleTexture));
-        mSwizzleTexture.setDebugName("TexStorage3D.SwizzleTexture");
+        mSwizzleTexture.setInternalName("TexStorage3D.SwizzleTexture");
     }
 
     *outTexture = &mSwizzleTexture;
@@ -3142,13 +3190,25 @@
         ANGLE_TRY(mRenderer->allocateResource(GetImplAs<Context11>(context), rtvDesc,
                                               mSwizzleTexture.get(),
                                               &mSwizzleRenderTargets[mipLevel]));
-        mSwizzleRenderTargets[mipLevel].setDebugName("TexStorage3D.SwizzleRTV");
+        mSwizzleRenderTargets[mipLevel].setInternalName("TexStorage3D.SwizzleRTV");
     }
 
     *outRTV = &mSwizzleRenderTargets[mipLevel];
     return angle::Result::Continue;
 }
 
+void TextureStorage11_3D::onLabelUpdate()
+{
+    if (mTexture.valid())
+    {
+        mTexture.setKHRDebugLabel(&mTextureLabel);
+    }
+    if (mSwizzleTexture.valid())
+    {
+        mSwizzleTexture.setKHRDebugLabel(&mTextureLabel);
+    }
+}
+
 TextureStorage11_2DArray::TextureStorage11_2DArray(Renderer11 *renderer,
                                                    GLenum internalformat,
                                                    bool renderTarget,
@@ -3295,7 +3355,7 @@
 
         ANGLE_TRY(mRenderer->allocateTexture(GetImplAs<Context11>(context), desc, mFormatInfo,
                                              &mTexture));
-        mTexture.setDebugName("TexStorage2DArray.Texture");
+        mTexture.setInternalName("TexStorage2DArray.Texture");
     }
 
     *outResource = &mTexture;
@@ -3319,7 +3379,7 @@
 
     ANGLE_TRY(
         mRenderer->allocateResource(GetImplAs<Context11>(context), srvDesc, texture.get(), outSRV));
-    outSRV->setDebugName("TexStorage2DArray.SRV");
+    outSRV->setInternalName("TexStorage2DArray.SRV");
 
     return angle::Result::Continue;
 }
@@ -3340,7 +3400,7 @@
     srvDesc.Texture2DArray.ArraySize       = mTextureDepth;
     ANGLE_TRY(
         mRenderer->allocateResource(GetImplAs<Context11>(context), srvDesc, texture.get(), outSRV));
-    outSRV->setDebugName("TexStorage2DArray.SRVForImage");
+    outSRV->setInternalName("TexStorage2DArray.SRVForImage");
     return angle::Result::Continue;
 }
 
@@ -3359,7 +3419,7 @@
     uavDesc.Texture2DArray.ArraySize       = mTextureDepth;
     ANGLE_TRY(
         mRenderer->allocateResource(GetImplAs<Context11>(context), uavDesc, texture.get(), outUAV));
-    outUAV->setDebugName("TexStorage2DArray.UAVForImage");
+    outUAV->setInternalName("TexStorage2DArray.UAVForImage");
     return angle::Result::Continue;
 }
 
@@ -3440,7 +3500,7 @@
             blitSRV = srv.makeCopy();
         }
 
-        srv.setDebugName("TexStorage2DArray.RenderTargetSRV");
+        srv.setInternalName("TexStorage2DArray.RenderTargetSRV");
 
         if (mFormatInfo.rtvFormat != DXGI_FORMAT_UNKNOWN)
         {
@@ -3454,7 +3514,7 @@
             d3d11::RenderTargetView rtv;
             ANGLE_TRY(mRenderer->allocateResource(GetImplAs<Context11>(context), rtvDesc,
                                                   texture->get(), &rtv));
-            rtv.setDebugName("TexStorage2DArray.RenderTargetRTV");
+            rtv.setInternalName("TexStorage2DArray.RenderTargetRTV");
 
             mRenderTargets[key].reset(new TextureRenderTarget11(
                 std::move(rtv), *texture, srv, blitSRV, mFormatInfo.internalFormat, getFormatSet(),
@@ -3475,7 +3535,7 @@
             d3d11::DepthStencilView dsv;
             ANGLE_TRY(mRenderer->allocateResource(GetImplAs<Context11>(context), dsvDesc,
                                                   texture->get(), &dsv));
-            dsv.setDebugName("TexStorage2DArray.RenderTargetDSV");
+            dsv.setInternalName("TexStorage2DArray.RenderTargetDSV");
 
             mRenderTargets[key].reset(new TextureRenderTarget11(
                 std::move(dsv), *texture, srv, mFormatInfo.internalFormat, getFormatSet(),
@@ -3510,7 +3570,7 @@
 
         ANGLE_TRY(mRenderer->allocateTexture(GetImplAs<Context11>(context), desc, format,
                                              &mSwizzleTexture));
-        mSwizzleTexture.setDebugName("TexStorage2DArray.SwizzleTexture");
+        mSwizzleTexture.setInternalName("TexStorage2DArray.SwizzleTexture");
     }
 
     *outTexture = &mSwizzleTexture;
@@ -3573,7 +3633,7 @@
         d3d11::Format::Get(GL_DEPTH_COMPONENT32F, mRenderer->getRenderer11DeviceCaps());
     ANGLE_TRY(mRenderer->allocateTexture(GetImplAs<Context11>(context), dropDesc, format,
                                          &mDropStencilTexture));
-    mDropStencilTexture.setDebugName("TexStorage2DArray.DropStencil");
+    mDropStencilTexture.setInternalName("TexStorage2DArray.DropStencil");
 
     std::vector<GLsizei> layerCounts(mMipLevels, mTextureDepth);
 
@@ -3584,6 +3644,18 @@
     return angle::Result::Continue;
 }
 
+void TextureStorage11_2DArray::onLabelUpdate()
+{
+    if (mTexture.valid())
+    {
+        mTexture.setKHRDebugLabel(&mTextureLabel);
+    }
+    if (mSwizzleTexture.valid())
+    {
+        mSwizzleTexture.setKHRDebugLabel(&mTextureLabel);
+    }
+}
+
 TextureStorage11_2DMultisample::TextureStorage11_2DMultisample(Renderer11 *renderer,
                                                                GLenum internalformat,
                                                                GLsizei width,
@@ -3668,7 +3740,7 @@
 
         ANGLE_TRY(mRenderer->allocateTexture(GetImplAs<Context11>(context), desc, mFormatInfo,
                                              &mTexture));
-        mTexture.setDebugName("TexStorage2DMS.Texture");
+        mTexture.setInternalName("TexStorage2DMS.Texture");
     }
 
     return angle::Result::Continue;
@@ -3767,7 +3839,7 @@
 
     ANGLE_TRY(
         mRenderer->allocateResource(GetImplAs<Context11>(context), srvDesc, texture.get(), outSRV));
-    outSRV->setDebugName("TexStorage2DMS.SRV");
+    outSRV->setInternalName("TexStorage2DMS.SRV");
     return angle::Result::Continue;
 }
 
@@ -3794,6 +3866,14 @@
     return angle::Result::Stop;
 }
 
+void TextureStorage11_2DMultisample::onLabelUpdate()
+{
+    if (mTexture.valid())
+    {
+        mTexture.setKHRDebugLabel(&mTextureLabel);
+    }
+}
+
 TextureStorage11_2DMultisampleArray::TextureStorage11_2DMultisampleArray(Renderer11 *renderer,
                                                                          GLenum internalformat,
                                                                          GLsizei width,
@@ -3877,7 +3957,7 @@
 
         ANGLE_TRY(mRenderer->allocateTexture(GetImplAs<Context11>(context), desc, mFormatInfo,
                                              &mTexture));
-        mTexture.setDebugName("TexStorage2DMSArray.Texture");
+        mTexture.setInternalName("TexStorage2DMSArray.Texture");
     }
 
     return angle::Result::Continue;
@@ -3961,7 +4041,7 @@
             blitSRV = srv.makeCopy();
         }
 
-        srv.setDebugName("TexStorage2DMSArray.RenderTargetSRV");
+        srv.setInternalName("TexStorage2DMSArray.RenderTargetSRV");
 
         if (mFormatInfo.rtvFormat != DXGI_FORMAT_UNKNOWN)
         {
@@ -3974,7 +4054,7 @@
             d3d11::RenderTargetView rtv;
             ANGLE_TRY(mRenderer->allocateResource(GetImplAs<Context11>(context), rtvDesc,
                                                   texture->get(), &rtv));
-            rtv.setDebugName("TexStorage2DMSArray.RenderTargetRTV");
+            rtv.setInternalName("TexStorage2DMSArray.RenderTargetRTV");
 
             mRenderTargets[key].reset(new TextureRenderTarget11(
                 std::move(rtv), *texture, srv, blitSRV, mFormatInfo.internalFormat, getFormatSet(),
@@ -3994,7 +4074,7 @@
             d3d11::DepthStencilView dsv;
             ANGLE_TRY(mRenderer->allocateResource(GetImplAs<Context11>(context), dsvDesc,
                                                   texture->get(), &dsv));
-            dsv.setDebugName("TexStorage2DMSArray.RenderTargetDSV");
+            dsv.setInternalName("TexStorage2DMSArray.RenderTargetDSV");
 
             mRenderTargets[key].reset(new TextureRenderTarget11(
                 std::move(dsv), *texture, srv, mFormatInfo.internalFormat, getFormatSet(),
@@ -4025,7 +4105,7 @@
 
     ANGLE_TRY(
         mRenderer->allocateResource(GetImplAs<Context11>(context), srvDesc, texture.get(), outSRV));
-    outSRV->setDebugName("TexStorage2DMSArray.SRV");
+    outSRV->setInternalName("TexStorage2DMSArray.SRV");
     return angle::Result::Continue;
 }
 
@@ -4054,4 +4134,12 @@
     return angle::Result::Stop;
 }
 
+void TextureStorage11_2DMultisampleArray::onLabelUpdate()
+{
+    if (mTexture.valid())
+    {
+        mTexture.setKHRDebugLabel(&mTextureLabel);
+    }
+}
+
 }  // namespace rx
diff --git a/src/libANGLE/renderer/d3d/d3d11/TextureStorage11.h b/src/libANGLE/renderer/d3d/d3d11/TextureStorage11.h
index 6dbf927..aee7c43 100644
--- a/src/libANGLE/renderer/d3d/d3d11/TextureStorage11.h
+++ b/src/libANGLE/renderer/d3d/d3d11/TextureStorage11.h
@@ -318,6 +318,7 @@
 
     angle::Result useLevelZeroWorkaroundTexture(const gl::Context *context,
                                                 bool useLevelZeroTexture) override;
+    void onLabelUpdate() override;
 
   protected:
     angle::Result getSwizzleTexture(const gl::Context *context,
@@ -409,6 +410,7 @@
     angle::Result releaseAssociatedImage(const gl::Context *context,
                                          const gl::ImageIndex &index,
                                          Image11 *incomingImage) override;
+    void onLabelUpdate() override;
 
   protected:
     angle::Result getSwizzleTexture(const gl::Context *context,
@@ -505,6 +507,7 @@
 
     angle::Result useLevelZeroWorkaroundTexture(const gl::Context *context,
                                                 bool useLevelZeroTexture) override;
+    void onLabelUpdate() override;
 
   protected:
     angle::Result getSwizzleTexture(const gl::Context *context,
@@ -577,6 +580,7 @@
 
     angle::Result useLevelZeroWorkaroundTexture(const gl::Context *context,
                                                 bool useLevelZeroTexture) override;
+    void onLabelUpdate() override;
 
   protected:
     angle::Result getSwizzleTexture(const gl::Context *context,
@@ -664,6 +668,7 @@
     angle::Result releaseAssociatedImage(const gl::Context *context,
                                          const gl::ImageIndex &index,
                                          Image11 *incomingImage) override;
+    void onLabelUpdate() override;
 
   protected:
     angle::Result getSwizzleTexture(const gl::Context *context,
@@ -734,6 +739,7 @@
     angle::Result releaseAssociatedImage(const gl::Context *context,
                                          const gl::ImageIndex &index,
                                          Image11 *incomingImage) override;
+    void onLabelUpdate() override;
 
     struct LevelLayerRangeKey
     {
@@ -828,6 +834,7 @@
                                   RenderTargetD3D **outRT) override;
 
     angle::Result copyToStorage(const gl::Context *context, TextureStorage *destStorage) override;
+    void onLabelUpdate() override;
 
   protected:
     angle::Result getSwizzleTexture(const gl::Context *context,
@@ -884,6 +891,7 @@
                                   RenderTargetD3D **outRT) override;
 
     angle::Result copyToStorage(const gl::Context *context, TextureStorage *destStorage) override;
+    void onLabelUpdate() override;
 
   protected:
     angle::Result getSwizzleTexture(const gl::Context *context,
diff --git a/src/libANGLE/renderer/d3d/d3d11/VertexBuffer11.cpp b/src/libANGLE/renderer/d3d/d3d11/VertexBuffer11.cpp
index 6609f92..9daa8f8 100644
--- a/src/libANGLE/renderer/d3d/d3d11/VertexBuffer11.cpp
+++ b/src/libANGLE/renderer/d3d/d3d11/VertexBuffer11.cpp
@@ -55,11 +55,11 @@
 
         if (dynamicUsage)
         {
-            mBuffer.setDebugName("VertexBuffer11 (dynamic)");
+            mBuffer.setInternalName("VertexBuffer11(dynamic)");
         }
         else
         {
-            mBuffer.setDebugName("VertexBuffer11 (static)");
+            mBuffer.setInternalName("VertexBuffer11(static)");
         }
     }
 
diff --git a/src/libANGLE/renderer/d3d/d3d11/renderer11_utils.cpp b/src/libANGLE/renderer/d3d/d3d11/renderer11_utils.cpp
index 1d2a66e..7286912 100644
--- a/src/libANGLE/renderer/d3d/d3d11/renderer11_utils.cpp
+++ b/src/libANGLE/renderer/d3d/d3d11/renderer11_utils.cpp
@@ -1605,6 +1605,7 @@
     // https://docs.microsoft.com/en-us/windows/desktop/direct3ddxgi/format-support-for-direct3d-11-0-feature-level-hardware
     extensions->floatBlend             = true;
     extensions->framebufferBlitANGLE   = GetFramebufferBlitSupport(featureLevel);
+    extensions->framebufferBlitNV      = extensions->framebufferBlitANGLE;
     extensions->framebufferMultisample = GetFramebufferMultisampleSupport(featureLevel);
     extensions->instancedArraysANGLE   = GetInstancingSupport(featureLevel);
     extensions->instancedArraysEXT     = GetInstancingSupport(featureLevel);
@@ -2184,28 +2185,35 @@
     const d3d11::DXGIFormatSize &dxgiFormatInfo =
         d3d11::GetDXGIFormatSizeInfo(d3dFormatInfo.texFormat);
 
-    unsigned int rowPitch     = dxgiFormatInfo.pixelBytes * width;
-    unsigned int depthPitch   = rowPitch * height;
-    unsigned int maxImageSize = depthPitch * depth;
+    using CheckedSize        = angle::CheckedNumeric<size_t>;
+    CheckedSize rowPitch     = CheckedSize(dxgiFormatInfo.pixelBytes) * CheckedSize(width);
+    CheckedSize depthPitch   = rowPitch * CheckedSize(height);
+    CheckedSize maxImageSize = depthPitch * CheckedSize(depth);
+
+    Context11 *context11 = GetImplAs<Context11>(context);
+    ANGLE_CHECK_GL_ALLOC(context11, maxImageSize.IsValid());
 
     angle::MemoryBuffer *scratchBuffer = nullptr;
-    ANGLE_CHECK_GL_ALLOC(GetImplAs<Context11>(context),
-                         context->getScratchBuffer(maxImageSize, &scratchBuffer));
+    ANGLE_CHECK_GL_ALLOC(context11,
+                         context->getScratchBuffer(maxImageSize.ValueOrDie(), &scratchBuffer));
 
-    d3dFormatInfo.dataInitializerFunction(width, height, depth, scratchBuffer->data(), rowPitch,
-                                          depthPitch);
+    d3dFormatInfo.dataInitializerFunction(width, height, depth, scratchBuffer->data(),
+                                          rowPitch.ValueOrDie(), depthPitch.ValueOrDie());
 
     for (unsigned int i = 0; i < mipLevels; i++)
     {
         unsigned int mipWidth  = std::max(width >> i, 1U);
         unsigned int mipHeight = std::max(height >> i, 1U);
 
-        unsigned int mipRowPitch   = dxgiFormatInfo.pixelBytes * mipWidth;
-        unsigned int mipDepthPitch = mipRowPitch * mipHeight;
+        using CheckedUINT         = angle::CheckedNumeric<UINT>;
+        CheckedUINT mipRowPitch   = CheckedUINT(dxgiFormatInfo.pixelBytes) * CheckedUINT(mipWidth);
+        CheckedUINT mipDepthPitch = mipRowPitch * CheckedUINT(mipHeight);
+
+        ANGLE_CHECK_GL_ALLOC(context11, mipRowPitch.IsValid() && mipDepthPitch.IsValid());
 
         outSubresourceData->at(i).pSysMem          = scratchBuffer->data();
-        outSubresourceData->at(i).SysMemPitch      = mipRowPitch;
-        outSubresourceData->at(i).SysMemSlicePitch = mipDepthPitch;
+        outSubresourceData->at(i).SysMemPitch      = mipRowPitch.ValueOrDie();
+        outSubresourceData->at(i).SysMemSlicePitch = mipDepthPitch.ValueOrDie();
     }
 
     return angle::Result::Continue;
@@ -2276,33 +2284,16 @@
     return !(a == b);
 }
 
-HRESULT SetDebugName(ID3D11DeviceChild *resource, const char *name)
+HRESULT SetDebugName(ID3D11DeviceChild *resource,
+                     const char *internalName,
+                     const std::string *khrDebugName)
 {
-    UINT existingDataSize = 0;
-    resource->GetPrivateData(WKPDID_D3DDebugObjectName, &existingDataSize, nullptr);
-    // Don't check the HRESULT- if it failed then that probably just means that no private data
-    // exists yet
-
-    if (existingDataSize > 0)
-    {
-        // In some cases, ANGLE will try to apply two names to one object, which causes
-        // a D3D SDK Layers warning. This can occur if, for example, you 'create' two objects
-        // (e.g.Rasterizer States) with identical DESCs on the same device. D3D11 will optimize
-        // these calls and return the same object both times.
-        static const char *multipleNamesUsed = "MultipleNamesSetByANGLE";
-
-        // Remove the existing name
-        const HRESULT hr = resource->SetPrivateData(WKPDID_D3DDebugObjectName, 0, nullptr);
-        if (FAILED(hr))
-        {
-            return hr;
-        }
-
-        name = multipleNamesUsed;
-    }
-
-    // Prepend ANGLE_ to separate names from other components in the same process.
-    const std::string d3dName = std::string("ANGLE_") + name;
+    // Prepend ANGLE to separate names from other components in the same process.
+    std::string d3dName = "ANGLE";
+    if (internalName)
+        d3dName += std::string("_") + internalName;
+    if (khrDebugName)
+        d3dName += std::string("_") + *khrDebugName;
     return resource->SetPrivateData(WKPDID_D3DDebugObjectName, static_cast<UINT>(d3dName.size()),
                                     d3dName.c_str());
 }
@@ -2320,7 +2311,7 @@
     if (!mResource.valid())
     {
         ANGLE_TRY(renderer->allocateResource(context, desc, initData, &mResource));
-        mResource.setDebugName(name);
+        mResource.setInternalName(name);
     }
     return angle::Result::Continue;
 }
diff --git a/src/libANGLE/renderer/d3d/d3d9/Blit9.cpp b/src/libANGLE/renderer/d3d/d3d9/Blit9.cpp
index 66bb8b1..429159b 100644
--- a/src/libANGLE/renderer/d3d/d3d9/Blit9.cpp
+++ b/src/libANGLE/renderer/d3d/d3d9/Blit9.cpp
@@ -681,11 +681,11 @@
 {
     IDirect3DDevice9 *device = mRenderer->getDevice();
 
-    HRESULT hr = device->SetStreamSource(0, mQuadVertexBuffer, 0, 2 * sizeof(float));
-    hr         = device->SetVertexDeclaration(mQuadVertexDeclaration);
+    device->SetStreamSource(0, mQuadVertexBuffer, 0, 2 * sizeof(float));
+    device->SetVertexDeclaration(mQuadVertexDeclaration);
 
     mRenderer->startScene();
-    hr = device->DrawPrimitive(D3DPT_TRIANGLESTRIP, 0, 2);
+    device->DrawPrimitive(D3DPT_TRIANGLESTRIP, 0, 2);
 }
 
 void Blit9::saveState()
diff --git a/src/libANGLE/renderer/d3d/d3d9/Image9.cpp b/src/libANGLE/renderer/d3d/d3d9/Image9.cpp
index 7b6da2c..826d1cc 100644
--- a/src/libANGLE/renderer/d3d/d3d9/Image9.cpp
+++ b/src/libANGLE/renderer/d3d/d3d9/Image9.cpp
@@ -211,6 +211,8 @@
                       destD3DFormatInfo.info().componentType, sourceRect.width, sourceRect.height,
                       1, unpackFlipY, unpackPremultiplyAlpha, unpackUnmultiplyAlpha);
 
+    dest->markDirty();
+
     destSurface->UnlockRect();
     sourceSurface->UnlockRect();
 
diff --git a/src/libANGLE/renderer/d3d/d3d9/Renderer9.cpp b/src/libANGLE/renderer/d3d/d3d9/Renderer9.cpp
index 0d58c01..068d06f 100644
--- a/src/libANGLE/renderer/d3d/d3d9/Renderer9.cpp
+++ b/src/libANGLE/renderer/d3d/d3d9/Renderer9.cpp
@@ -1026,6 +1026,10 @@
             mDevice->SetSamplerState(d3dSampler, D3DSAMP_MAXANISOTROPY, maxAnisotropy);
         }
 
+        const bool isSrgb = gl::GetSizedInternalFormatInfo(textureD3D->getBaseLevelInternalFormat())
+                                .colorEncoding == GL_SRGB;
+        mDevice->SetSamplerState(d3dSampler, D3DSAMP_SRGBTEXTURE, isSrgb);
+
         ASSERT(texture->getBorderColor().type == angle::ColorGeneric::Type::Float);
         mDevice->SetSamplerState(d3dSampler, D3DSAMP_BORDERCOLOR,
                                  gl_d3d9::ConvertColor(texture->getBorderColor().colorF));
@@ -1116,6 +1120,9 @@
         ANGLE_TRY(firstColorAttachment->getRenderTarget(context, firstColorAttachment->getSamples(),
                                                         &renderTarget));
         samples = renderTarget->getSamples();
+
+        mDevice->SetRenderState(D3DRS_SRGBWRITEENABLE,
+                                renderTarget->getInternalFormat() == GL_SRGB8_ALPHA8);
     }
     gl::RasterizerState rasterizer = glState.getRasterizerState();
     rasterizer.pointDrawMode       = (drawMode == gl::PrimitiveMode::Points);
@@ -1270,9 +1277,8 @@
     }
     ASSERT(colorRenderTarget != nullptr);
 
-    size_t renderTargetWidth     = 0;
-    size_t renderTargetHeight    = 0;
-    D3DFORMAT renderTargetFormat = D3DFMT_UNKNOWN;
+    size_t renderTargetWidth  = 0;
+    size_t renderTargetHeight = 0;
 
     bool renderTargetChanged        = false;
     unsigned int renderTargetSerial = colorRenderTarget->getSerial();
@@ -1287,7 +1293,6 @@
 
         renderTargetWidth  = colorRenderTarget->getWidth();
         renderTargetHeight = colorRenderTarget->getHeight();
-        renderTargetFormat = colorRenderTarget->getD3DFormat();
 
         mAppliedRenderTargetSerial = renderTargetSerial;
         renderTargetChanged        = true;
diff --git a/src/libANGLE/renderer/d3d/d3d9/formatutils9.cpp b/src/libANGLE/renderer/d3d/d3d9/formatutils9.cpp
index 4cfa031..19a10b9 100644
--- a/src/libANGLE/renderer/d3d/d3d9/formatutils9.cpp
+++ b/src/libANGLE/renderer/d3d/d3d9/formatutils9.cpp
@@ -144,6 +144,9 @@
     InsertD3D9FormatInfo(&map, GL_R8_EXT,                           D3DFMT_X8R8G8B8,      D3DFMT_X8R8G8B8,       LoadR8ToBGRX8                             );
     InsertD3D9FormatInfo(&map, GL_RG8_EXT,                          D3DFMT_X8R8G8B8,      D3DFMT_X8R8G8B8,       LoadRG8ToBGRX8                            );
 
+    InsertD3D9FormatInfo(&map, GL_SRGB8,                            D3DFMT_X8R8G8B8,      D3DFMT_UNKNOWN,        LoadRGB8ToBGRX8                           );
+    InsertD3D9FormatInfo(&map, GL_SRGB8_ALPHA8_EXT,                 D3DFMT_A8R8G8B8,      D3DFMT_A8R8G8B8,       LoadRGBA8ToBGRA8                          );
+
     InsertD3D9FormatInfo(&map, GL_BGRA8_EXT,                        D3DFMT_A8R8G8B8,      D3DFMT_A8R8G8B8,       LoadToNative<GLubyte, 4>                  );
     InsertD3D9FormatInfo(&map, GL_BGRA4_ANGLEX,                     D3DFMT_A8R8G8B8,      D3DFMT_A8R8G8B8,       LoadBGRA4ToBGRA8                          );
     InsertD3D9FormatInfo(&map, GL_BGR5_A1_ANGLEX,                   D3DFMT_A8R8G8B8,      D3DFMT_A8R8G8B8,       LoadBGR5A1ToBGRA8                         );
@@ -153,6 +156,11 @@
     InsertD3D9FormatInfo(&map, GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE,  D3DFMT_DXT3,          D3DFMT_UNKNOWN,        LoadCompressedToNative<4, 4, 1, 16>       );
     InsertD3D9FormatInfo(&map, GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE,  D3DFMT_DXT5,          D3DFMT_UNKNOWN,        LoadCompressedToNative<4, 4, 1, 16>       );
 
+    InsertD3D9FormatInfo(&map, GL_COMPRESSED_SRGB_S3TC_DXT1_EXT,        D3DFMT_DXT1,      D3DFMT_UNKNOWN,        LoadCompressedToNative<4, 4, 1,  8>       );
+    InsertD3D9FormatInfo(&map, GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT,  D3DFMT_DXT1,      D3DFMT_UNKNOWN,        LoadCompressedToNative<4, 4, 1,  8>       );
+    InsertD3D9FormatInfo(&map, GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT,  D3DFMT_DXT3,      D3DFMT_UNKNOWN,        LoadCompressedToNative<4, 4, 1, 16>       );
+    InsertD3D9FormatInfo(&map, GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT,  D3DFMT_DXT5,      D3DFMT_UNKNOWN,        LoadCompressedToNative<4, 4, 1, 16>       );
+
     // These formats require checking if the renderer supports D3DFMT_L8 or D3DFMT_A8L8 and
     // then changing the format and loading function appropriately.
     InsertD3D9FormatInfo(&map, GL_LUMINANCE8_EXT,                   D3DFMT_L8,            D3DFMT_UNKNOWN,        LoadToNative<GLubyte, 1>                  );
@@ -645,7 +653,6 @@
 
 const VertexFormat &GetVertexFormatInfo(DWORD supportedDeclTypes, angle::FormatID vertexFormatID)
 {
-    static bool initialized           = false;
     static DWORD initializedDeclTypes = 0;
     static VertexFormat formatConverters[NUM_GL_VERTEX_ATTRIB_TYPES][2][4];
     if (initializedDeclTypes != supportedDeclTypes)
@@ -674,7 +681,6 @@
                 }
             }
         }
-        initialized          = true;
         initializedDeclTypes = supportedDeclTypes;
     }
 
diff --git a/src/libANGLE/renderer/d3d/d3d9/renderer9_utils.cpp b/src/libANGLE/renderer/d3d/d3d9/renderer9_utils.cpp
index 420eb32..f0aeb38 100644
--- a/src/libANGLE/renderer/d3d/d3d9/renderer9_utils.cpp
+++ b/src/libANGLE/renderer/d3d/d3d9/renderer9_utils.cpp
@@ -438,6 +438,16 @@
                                                   D3DRTYPE_TEXTURE, d3dFormatInfo.texFormat)) &&
                 SUCCEEDED(d3d9->CheckDeviceFormat(adapter, deviceType, adapterFormat, 0,
                                                   D3DRTYPE_CUBETEXTURE, d3dFormatInfo.texFormat));
+            if (textureCaps.texturable && (formatInfo.colorEncoding == GL_SRGB))
+            {
+                textureCaps.texturable =
+                    SUCCEEDED(d3d9->CheckDeviceFormat(adapter, deviceType, adapterFormat,
+                                                      D3DUSAGE_QUERY_SRGBREAD, D3DRTYPE_TEXTURE,
+                                                      d3dFormatInfo.texFormat)) &&
+                    SUCCEEDED(d3d9->CheckDeviceFormat(adapter, deviceType, adapterFormat,
+                                                      D3DUSAGE_QUERY_SRGBREAD, D3DRTYPE_CUBETEXTURE,
+                                                      d3dFormatInfo.texFormat));
+            }
         }
 
         textureCaps.filterable = SUCCEEDED(
@@ -450,6 +460,12 @@
         textureCaps.textureAttachment = SUCCEEDED(
             d3d9->CheckDeviceFormat(adapter, deviceType, adapterFormat, D3DUSAGE_RENDERTARGET,
                                     D3DRTYPE_TEXTURE, d3dFormatInfo.renderFormat));
+        if (textureCaps.textureAttachment && (formatInfo.colorEncoding == GL_SRGB))
+        {
+            textureCaps.textureAttachment = SUCCEEDED(d3d9->CheckDeviceFormat(
+                adapter, deviceType, adapterFormat, D3DUSAGE_QUERY_SRGBWRITE, D3DRTYPE_TEXTURE,
+                d3dFormatInfo.renderFormat));
+        }
 
         if ((formatInfo.depthBits > 0 || formatInfo.stencilBits > 0) &&
             !textureCaps.textureAttachment)
diff --git a/src/libANGLE/renderer/gl/ContextGL.cpp b/src/libANGLE/renderer/gl/ContextGL.cpp
index 3751002..81b0f90 100644
--- a/src/libANGLE/renderer/gl/ContextGL.cpp
+++ b/src/libANGLE/renderer/gl/ContextGL.cpp
@@ -234,7 +234,7 @@
                                             first, count, instanceCount));
 
 #if defined(ANGLE_STATE_VALIDATION_ENABLED)
-        vaoGL->validateState(context);
+        ANGLE_TRY(vaoGL->validateState(context));
 #endif  // ANGLE_STATE_VALIDATION_ENABLED
     }
     else if (features.shiftInstancedArrayDataWithExtraOffset.enabled && first == 0)
@@ -244,7 +244,7 @@
         const gl::State &glState   = context->getState();
         const gl::VertexArray *vao = glState.getVertexArray();
         const VertexArrayGL *vaoGL = GetImplAs<VertexArrayGL>(vao);
-        vaoGL->recoverForcedStreamingAttributesForDrawArraysInstanced(context);
+        ANGLE_TRY(vaoGL->recoverForcedStreamingAttributesForDrawArraysInstanced(context));
     }
 
     if (features.setPrimitiveRestartFixedIndexForDrawArrays.enabled)
@@ -275,7 +275,7 @@
         // There might be instanced arrays that are forced streaming for drawArraysInstanced
         // They cannot be ELEMENT_ARRAY_BUFFER
         const VertexArrayGL *vaoGL = GetImplAs<VertexArrayGL>(vao);
-        vaoGL->recoverForcedStreamingAttributesForDrawArraysInstanced(context);
+        ANGLE_TRY(vaoGL->recoverForcedStreamingAttributesForDrawArraysInstanced(context));
     }
 
     if (stateCache.hasAnyActiveClientAttrib() || vao->getElementArrayBuffer() == nullptr)
@@ -300,7 +300,7 @@
 
 #if defined(ANGLE_STATE_VALIDATION_ENABLED)
     const VertexArrayGL *vaoGL = GetImplAs<VertexArrayGL>(vao);
-    vaoGL->validateState(context);
+    ANGLE_TRY(vaoGL->validateState(context));
 #endif  // ANGLE_STATE_VALIDATION_ENABLED
 
     return angle::Result::Continue;
@@ -879,6 +879,7 @@
 
 angle::Result ContextGL::onUnMakeCurrent(const gl::Context *context)
 {
+    ANGLE_TRY(flush(context));
     if (getFeaturesGL().unbindFBOOnContextSwitch.enabled)
     {
         mRenderer->getStateManager()->bindFramebuffer(GL_FRAMEBUFFER, 0);
diff --git a/src/libANGLE/renderer/gl/MemoryObjectGL.cpp b/src/libANGLE/renderer/gl/MemoryObjectGL.cpp
index 7807860..e203320 100644
--- a/src/libANGLE/renderer/gl/MemoryObjectGL.cpp
+++ b/src/libANGLE/renderer/gl/MemoryObjectGL.cpp
@@ -40,6 +40,13 @@
     return angle::Result::Continue;
 }
 
+angle::Result MemoryObjectGL::setProtectedMemory(const gl::Context *context, bool protectedMemory)
+{
+    ANGLE_UNUSED_VARIABLE(context);
+    ANGLE_UNUSED_VARIABLE(protectedMemory);
+    return angle::Result::Continue;
+}
+
 angle::Result MemoryObjectGL::importFd(gl::Context *context,
                                        GLuint64 size,
                                        gl::HandleType handleType,
diff --git a/src/libANGLE/renderer/gl/MemoryObjectGL.h b/src/libANGLE/renderer/gl/MemoryObjectGL.h
index 5c36478..cfcb7d5 100644
--- a/src/libANGLE/renderer/gl/MemoryObjectGL.h
+++ b/src/libANGLE/renderer/gl/MemoryObjectGL.h
@@ -22,6 +22,7 @@
     void onDestroy(const gl::Context *context) override;
 
     angle::Result setDedicatedMemory(const gl::Context *context, bool dedicatedMemory) override;
+    angle::Result setProtectedMemory(const gl::Context *context, bool protectedMemory) override;
 
     angle::Result importFd(gl::Context *context,
                            GLuint64 size,
diff --git a/src/libANGLE/renderer/gl/ShaderGL.cpp b/src/libANGLE/renderer/gl/ShaderGL.cpp
index b4d2b74..4d2b43d 100644
--- a/src/libANGLE/renderer/gl/ShaderGL.cpp
+++ b/src/libANGLE/renderer/gl/ShaderGL.cpp
@@ -314,11 +314,6 @@
         additionalOptions |= SH_CLAMP_POINT_SIZE;
     }
 
-    if (features.rewriteVectorScalarArithmetic.enabled)
-    {
-        additionalOptions |= SH_REWRITE_VECTOR_SCALAR_ARITHMETIC;
-    }
-
     if (features.dontUseLoopsToInitializeVariables.enabled)
     {
         additionalOptions |= SH_DONT_USE_LOOPS_TO_INITIALIZE_VARIABLES;
diff --git a/src/libANGLE/renderer/gl/StateManagerGL.cpp b/src/libANGLE/renderer/gl/StateManagerGL.cpp
index 83df1e5..9c19540 100644
--- a/src/libANGLE/renderer/gl/StateManagerGL.cpp
+++ b/src/libANGLE/renderer/gl/StateManagerGL.cpp
@@ -2020,8 +2020,8 @@
                 VertexArrayGL *vaoGL = GetImplAs<VertexArrayGL>(state.getVertexArray());
                 bindVertexArray(vaoGL->getVertexArrayID(), vaoGL->getNativeState());
 
-                propagateProgramToVAO(context, state.getProgram(),
-                                      GetImplAs<VertexArrayGL>(state.getVertexArray()));
+                ANGLE_TRY(propagateProgramToVAO(context, state.getProgram(),
+                                                GetImplAs<VertexArrayGL>(state.getVertexArray())));
 
                 if (mFeatures.syncVertexArraysToDefault.enabled)
                 {
@@ -2104,8 +2104,8 @@
                 if (!program ||
                     !program->getExecutable().hasLinkedShaderStage(gl::ShaderType::Compute))
                 {
-                    propagateProgramToVAO(context, program,
-                                          GetImplAs<VertexArrayGL>(state.getVertexArray()));
+                    ANGLE_TRY(propagateProgramToVAO(
+                        context, program, GetImplAs<VertexArrayGL>(state.getVertexArray())));
                 }
                 break;
             }
@@ -2427,13 +2427,13 @@
     }
 }
 
-void StateManagerGL::propagateProgramToVAO(const gl::Context *context,
-                                           const gl::Program *program,
-                                           VertexArrayGL *vao)
+angle::Result StateManagerGL::propagateProgramToVAO(const gl::Context *context,
+                                                    const gl::Program *program,
+                                                    VertexArrayGL *vao)
 {
     if (vao == nullptr)
     {
-        return;
+        return angle::Result::Continue;
     }
 
     // Number of views:
@@ -2444,15 +2444,17 @@
         {
             programNumViews = program->getNumViews();
         }
-        vao->applyNumViewsToDivisor(context, programNumViews);
+        ANGLE_TRY(vao->applyNumViewsToDivisor(context, programNumViews));
     }
 
     // Attribute enabled mask:
     if (program)
     {
-        vao->applyActiveAttribLocationsMask(
-            context, program->getExecutable().getActiveAttribLocationsMask());
+        ANGLE_TRY(vao->applyActiveAttribLocationsMask(
+            context, program->getExecutable().getActiveAttribLocationsMask()));
     }
+
+    return angle::Result::Continue;
 }
 
 void StateManagerGL::updateMultiviewBaseViewLayerIndexUniformImpl(
diff --git a/src/libANGLE/renderer/gl/StateManagerGL.h b/src/libANGLE/renderer/gl/StateManagerGL.h
index 47433fe..a1cb786 100644
--- a/src/libANGLE/renderer/gl/StateManagerGL.h
+++ b/src/libANGLE/renderer/gl/StateManagerGL.h
@@ -304,9 +304,9 @@
   private:
     void setTextureCubemapSeamlessEnabled(bool enabled);
 
-    void propagateProgramToVAO(const gl::Context *context,
-                               const gl::Program *program,
-                               VertexArrayGL *vao);
+    angle::Result propagateProgramToVAO(const gl::Context *context,
+                                        const gl::Program *program,
+                                        VertexArrayGL *vao);
 
     void updateProgramTextureBindings(const gl::Context *context);
     void updateProgramStorageBufferBindings(const gl::Context *context);
diff --git a/src/libANGLE/renderer/gl/TextureGL.cpp b/src/libANGLE/renderer/gl/TextureGL.cpp
index edb86b8..b7b7409 100644
--- a/src/libANGLE/renderer/gl/TextureGL.cpp
+++ b/src/libANGLE/renderer/gl/TextureGL.cpp
@@ -1127,7 +1127,12 @@
     else
     {
         ASSERT(nativegl::UseTexImage3D(getType()));
-        if (functions->texStorage3D)
+        const gl::InternalFormat &internalFormatInfo =
+            gl::GetSizedInternalFormatInfo(internalFormat);
+        const bool bypassTexStorage3D = type == gl::TextureType::_3D &&
+                                        internalFormatInfo.compressed &&
+                                        features.emulateImmutableCompressedTexture3D.enabled;
+        if (functions->texStorage3D && !bypassTexStorage3D)
         {
             ANGLE_GL_TRY_ALWAYS_CHECK(
                 context, functions->texStorage3D(ToGLenum(type), static_cast<GLsizei>(levels),
@@ -1139,9 +1144,6 @@
             // Make sure no pixel unpack buffer is bound
             stateManager->bindBuffer(gl::BufferBinding::PixelUnpack, 0);
 
-            const gl::InternalFormat &internalFormatInfo =
-                gl::GetSizedInternalFormatInfo(internalFormat);
-
             // Internal format must be sized
             ASSERT(internalFormatInfo.sized);
 
@@ -1593,14 +1595,13 @@
             }
             case gl::Texture::DIRTY_BIT_USAGE:
                 break;
-            case gl::Texture::DIRTY_BIT_LABEL:
-                break;
 
             case gl::Texture::DIRTY_BIT_IMPLEMENTATION:
                 // This special dirty bit is used to signal the front-end that the implementation
                 // has local dirty bits. The real dirty bits are in mLocalDirty bits.
                 break;
             case gl::Texture::DIRTY_BIT_BOUND_AS_IMAGE:
+            case gl::Texture::DIRTY_BIT_BOUND_AS_ATTACHMENT:
                 // Only used for Vulkan.
                 break;
 
diff --git a/src/libANGLE/renderer/gl/VertexArrayGL.cpp b/src/libANGLE/renderer/gl/VertexArrayGL.cpp
index 454d2ad..459bf08 100644
--- a/src/libANGLE/renderer/gl/VertexArrayGL.cpp
+++ b/src/libANGLE/renderer/gl/VertexArrayGL.cpp
@@ -60,14 +60,16 @@
     return numViews * divisor;
 }
 
-static void ValidateStateHelperGetIntegerv(const FunctionsGL *functions,
-                                           const GLuint localValue,
-                                           const GLenum pname,
-                                           const char *localName,
-                                           const char *driverName)
+static angle::Result ValidateStateHelperGetIntegerv(const gl::Context *context,
+                                                    const GLuint localValue,
+                                                    const GLenum pname,
+                                                    const char *localName,
+                                                    const char *driverName)
 {
+    const FunctionsGL *functions = GetFunctionsGL(context);
+
     GLint queryValue;
-    functions->getIntegerv(pname, &queryValue);
+    ANGLE_GL_TRY(context, functions->getIntegerv(pname, &queryValue));
     if (localValue != static_cast<GLuint>(queryValue))
     {
         WARN() << localName << " (" << localValue << ") != " << driverName << " (" << queryValue
@@ -75,17 +77,21 @@
         // Re-add ASSERT: http://anglebug.com/3900
         // ASSERT(false);
     }
+
+    return angle::Result::Continue;
 }
 
-static void ValidateStateHelperGetVertexAttribiv(const FunctionsGL *functions,
-                                                 const GLint index,
-                                                 const GLuint localValue,
-                                                 const GLenum pname,
-                                                 const char *localName,
-                                                 const char *driverName)
+static angle::Result ValidateStateHelperGetVertexAttribiv(const gl::Context *context,
+                                                          const GLint index,
+                                                          const GLuint localValue,
+                                                          const GLenum pname,
+                                                          const char *localName,
+                                                          const char *driverName)
 {
+    const FunctionsGL *functions = GetFunctionsGL(context);
+
     GLint queryValue;
-    functions->getVertexAttribiv(index, pname, &queryValue);
+    ANGLE_GL_TRY(context, functions->getVertexAttribiv(index, pname, &queryValue));
     if (localValue != static_cast<GLuint>(queryValue))
     {
         WARN() << localName << "[" << index << "] (" << localValue << ") != " << driverName << "["
@@ -93,6 +99,8 @@
         // Re-add ASSERT: http://anglebug.com/3900
         // ASSERT(false);
     }
+
+    return angle::Result::Continue;
 }
 }  // anonymous namespace
 
@@ -158,7 +166,7 @@
                          gl::DrawElementsType::InvalidEnum, nullptr, instanceCount, false, nullptr);
 }
 
-void VertexArrayGL::updateElementArrayBufferBinding(const gl::Context *context) const
+angle::Result VertexArrayGL::updateElementArrayBufferBinding(const gl::Context *context) const
 {
     gl::Buffer *elementArrayBuffer = mState.getElementArrayBuffer();
     if (!SameIndexBuffer(mNativeState, elementArrayBuffer))
@@ -170,6 +178,8 @@
         mElementArrayBuffer.set(context, elementArrayBuffer);
         mNativeState->elementArrayBuffer = elementArrayBufferId;
     }
+
+    return angle::Result::Continue;
 }
 
 angle::Result VertexArrayGL::syncDrawState(const gl::Context *context,
@@ -224,8 +234,8 @@
                 candidateAttributesMask ^ mForcedStreamingAttributesForDrawArraysInstancedMask;
             if (forcedStreamingAttributesNeedRecoverMask.any())
             {
-                recoverForcedStreamingAttributesForDrawArraysInstanced(
-                    context, &forcedStreamingAttributesNeedRecoverMask);
+                ANGLE_TRY(recoverForcedStreamingAttributesForDrawArraysInstanced(
+                    context, &forcedStreamingAttributesNeedRecoverMask));
                 mForcedStreamingAttributesForDrawArraysInstancedMask = candidateAttributesMask;
             }
 
@@ -294,7 +304,7 @@
         // Allocate the streaming element array buffer
         if (mStreamingElementArrayBuffer == 0)
         {
-            functions->genBuffers(1, &mStreamingElementArrayBuffer);
+            ANGLE_GL_TRY(context, functions->genBuffers(1, &mStreamingElementArrayBuffer));
             mStreamingElementArrayBufferSize = 0;
         }
 
@@ -310,15 +320,16 @@
         if (requiredStreamingBufferSize > mStreamingElementArrayBufferSize)
         {
             // Copy the indices in while resizing the buffer
-            functions->bufferData(GL_ELEMENT_ARRAY_BUFFER, requiredStreamingBufferSize, indices,
-                                  GL_DYNAMIC_DRAW);
+            ANGLE_GL_TRY(context,
+                         functions->bufferData(GL_ELEMENT_ARRAY_BUFFER, requiredStreamingBufferSize,
+                                               indices, GL_DYNAMIC_DRAW));
             mStreamingElementArrayBufferSize = requiredStreamingBufferSize;
         }
         else
         {
             // Put the indices at the beginning of the buffer
-            functions->bufferSubData(GL_ELEMENT_ARRAY_BUFFER, 0, requiredStreamingBufferSize,
-                                     indices);
+            ANGLE_GL_TRY(context, functions->bufferSubData(GL_ELEMENT_ARRAY_BUFFER, 0,
+                                                           requiredStreamingBufferSize, indices));
         }
 
         // Set the index offset for the draw call to zero since the supplied index pointer is to
@@ -384,7 +395,7 @@
 
     if (mStreamingArrayBuffer == 0)
     {
-        functions->genBuffers(1, &mStreamingArrayBuffer);
+        ANGLE_GL_TRY(context, functions->genBuffers(1, &mStreamingArrayBuffer));
         mStreamingArrayBufferSize = 0;
     }
 
@@ -397,7 +408,8 @@
     stateManager->bindBuffer(gl::BufferBinding::Array, mStreamingArrayBuffer);
     if (requiredBufferSize > mStreamingArrayBufferSize)
     {
-        functions->bufferData(GL_ARRAY_BUFFER, requiredBufferSize, nullptr, GL_DYNAMIC_DRAW);
+        ANGLE_GL_TRY(context, functions->bufferData(GL_ARRAY_BUFFER, requiredBufferSize, nullptr,
+                                                    GL_DYNAMIC_DRAW));
         mStreamingArrayBufferSize = requiredBufferSize;
     }
 
@@ -515,9 +527,9 @@
             // Compute where the 0-index vertex would be.
             const size_t vertexStartOffset = curBufferOffset - (firstIndex * destStride);
 
-            callVertexAttribPointer(context, static_cast<GLuint>(idx), attrib,
-                                    static_cast<GLsizei>(destStride),
-                                    static_cast<GLintptr>(vertexStartOffset));
+            ANGLE_TRY(callVertexAttribPointer(context, static_cast<GLuint>(idx), attrib,
+                                              static_cast<GLsizei>(destStride),
+                                              static_cast<GLintptr>(vertexStartOffset)));
 
             // Update the state to track the streamed attribute
             mNativeState->attributes[idx].format = attrib.format;
@@ -536,7 +548,7 @@
                 destStride * streamedVertexCount + maxAttributeDataSize * indexRange.start;
         }
 
-        unmapResult = functions->unmapBuffer(GL_ARRAY_BUFFER);
+        unmapResult = ANGLE_GL_TRY(context, functions->unmapBuffer(GL_ARRAY_BUFFER));
     }
 
     ANGLE_CHECK(GetImplAs<ContextGL>(context), unmapResult == GL_TRUE,
@@ -544,20 +556,20 @@
     return angle::Result::Continue;
 }
 
-void VertexArrayGL::recoverForcedStreamingAttributesForDrawArraysInstanced(
+angle::Result VertexArrayGL::recoverForcedStreamingAttributesForDrawArraysInstanced(
     const gl::Context *context) const
 {
-    recoverForcedStreamingAttributesForDrawArraysInstanced(
+    return recoverForcedStreamingAttributesForDrawArraysInstanced(
         context, &mForcedStreamingAttributesForDrawArraysInstancedMask);
 }
 
-void VertexArrayGL::recoverForcedStreamingAttributesForDrawArraysInstanced(
+angle::Result VertexArrayGL::recoverForcedStreamingAttributesForDrawArraysInstanced(
     const gl::Context *context,
     gl::AttributesMask *attributeMask) const
 {
     if (attributeMask->none())
     {
-        return;
+        return angle::Result::Continue;
     }
 
     StateManagerGL *stateManager = GetStateManagerGL(context);
@@ -575,9 +587,9 @@
         const auto buffer   = GetImplAs<BufferGL>(binding.getBuffer().get());
         stateManager->bindBuffer(gl::BufferBinding::Array, buffer->getBufferID());
 
-        callVertexAttribPointer(context, static_cast<GLuint>(idx), attrib,
-                                static_cast<GLsizei>(binding.getStride()),
-                                static_cast<GLintptr>(binding.getOffset()));
+        ANGLE_TRY(callVertexAttribPointer(context, static_cast<GLuint>(idx), attrib,
+                                          static_cast<GLsizei>(binding.getStride()),
+                                          static_cast<GLintptr>(binding.getOffset())));
 
         // Restore the state to track their original buffers
         mNativeState->attributes[idx].format = attrib.format;
@@ -593,6 +605,8 @@
 
     attributeMask->reset();
     mForcedStreamingAttributesFirstOffsets.fill(0);
+
+    return angle::Result::Continue;
 }
 
 GLuint VertexArrayGL::getVertexArrayID() const
@@ -605,30 +619,32 @@
     return mNativeState;
 }
 
-void VertexArrayGL::updateAttribEnabled(const gl::Context *context, size_t attribIndex)
+angle::Result VertexArrayGL::updateAttribEnabled(const gl::Context *context, size_t attribIndex)
 {
     const bool enabled = mState.getVertexAttribute(attribIndex).enabled &
                          mProgramActiveAttribLocationsMask.test(attribIndex);
     if (mNativeState->attributes[attribIndex].enabled == enabled)
     {
-        return;
+        return angle::Result::Continue;
     }
 
     const FunctionsGL *functions = GetFunctionsGL(context);
 
     if (enabled)
     {
-        functions->enableVertexAttribArray(static_cast<GLuint>(attribIndex));
+        ANGLE_GL_TRY(context, functions->enableVertexAttribArray(static_cast<GLuint>(attribIndex)));
     }
     else
     {
-        functions->disableVertexAttribArray(static_cast<GLuint>(attribIndex));
+        ANGLE_GL_TRY(context,
+                     functions->disableVertexAttribArray(static_cast<GLuint>(attribIndex)));
     }
 
     mNativeState->attributes[attribIndex].enabled = enabled;
+    return angle::Result::Continue;
 }
 
-void VertexArrayGL::updateAttribPointer(const gl::Context *context, size_t attribIndex)
+angle::Result VertexArrayGL::updateAttribPointer(const gl::Context *context, size_t attribIndex)
 {
 
     const VertexAttribute &attrib = mState.getVertexAttribute(attribIndex);
@@ -651,7 +667,7 @@
 
         mArrayBuffers[attribIndex].set(context, nullptr);
         mNativeState->bindings[attribIndex].buffer = 0;
-        return;
+        return angle::Result::Continue;
     }
 
     // We do not need to compare attrib.pointer because when we use a different client memory
@@ -661,7 +677,7 @@
         (mNativeState->attributes[attribIndex].bindingIndex == attrib.bindingIndex) &&
         (SameVertexBuffer(mNativeState->bindings[attribIndex], binding)))
     {
-        return;
+        return angle::Result::Continue;
     }
 
     // Since ANGLE always uses a non-zero VAO, we cannot use a client memory pointer on it:
@@ -673,8 +689,8 @@
     StateManagerGL *stateManager = GetStateManagerGL(context);
     GLuint bufferId              = GetNativeBufferID(arrayBuffer);
     stateManager->bindBuffer(gl::BufferBinding::Array, bufferId);
-    callVertexAttribPointer(context, static_cast<GLuint>(attribIndex), attrib, binding.getStride(),
-                            binding.getOffset());
+    ANGLE_TRY(callVertexAttribPointer(context, static_cast<GLuint>(attribIndex), attrib,
+                                      binding.getStride(), binding.getOffset()));
 
     mNativeState->attributes[attribIndex].format = attrib.format;
 
@@ -689,13 +705,15 @@
     mNativeState->bindings[attribIndex].offset = binding.getOffset();
     mArrayBuffers[attribIndex].set(context, arrayBuffer);
     mNativeState->bindings[attribIndex].buffer = bufferId;
+
+    return angle::Result::Continue;
 }
 
-void VertexArrayGL::callVertexAttribPointer(const gl::Context *context,
-                                            GLuint attribIndex,
-                                            const VertexAttribute &attrib,
-                                            GLsizei stride,
-                                            GLintptr offset) const
+angle::Result VertexArrayGL::callVertexAttribPointer(const gl::Context *context,
+                                                     GLuint attribIndex,
+                                                     const VertexAttribute &attrib,
+                                                     GLsizei stride,
+                                                     GLintptr offset) const
 {
     const FunctionsGL *functions = GetFunctionsGL(context);
     const GLvoid *pointer        = reinterpret_cast<const GLvoid *>(offset);
@@ -703,15 +721,18 @@
     if (format.isPureInt())
     {
         ASSERT(!format.isNorm());
-        functions->vertexAttribIPointer(attribIndex, format.channelCount,
-                                        gl::ToGLenum(format.vertexAttribType), stride, pointer);
+        ANGLE_GL_TRY(context, functions->vertexAttribIPointer(attribIndex, format.channelCount,
+                                                              gl::ToGLenum(format.vertexAttribType),
+                                                              stride, pointer));
     }
     else
     {
-        functions->vertexAttribPointer(attribIndex, format.channelCount,
-                                       gl::ToGLenum(format.vertexAttribType), format.isNorm(),
-                                       stride, pointer);
+        ANGLE_GL_TRY(context, functions->vertexAttribPointer(attribIndex, format.channelCount,
+                                                             gl::ToGLenum(format.vertexAttribType),
+                                                             format.isNorm(), stride, pointer));
     }
+
+    return angle::Result::Continue;
 }
 
 bool VertexArrayGL::supportVertexAttribBinding(const gl::Context *context) const
@@ -725,14 +746,14 @@
            !features.syncVertexArraysToDefault.enabled;
 }
 
-void VertexArrayGL::updateAttribFormat(const gl::Context *context, size_t attribIndex)
+angle::Result VertexArrayGL::updateAttribFormat(const gl::Context *context, size_t attribIndex)
 {
     ASSERT(supportVertexAttribBinding(context));
 
     const VertexAttribute &attrib = mState.getVertexAttribute(attribIndex);
     if (SameVertexAttribFormat(mNativeState->attributes[attribIndex], attrib))
     {
-        return;
+        return angle::Result::Continue;
     }
 
     const FunctionsGL *functions = GetFunctionsGL(context);
@@ -741,79 +762,88 @@
     if (format.isPureInt())
     {
         ASSERT(!format.isNorm());
-        functions->vertexAttribIFormat(static_cast<GLuint>(attribIndex), format.channelCount,
-                                       gl::ToGLenum(format.vertexAttribType),
-                                       attrib.relativeOffset);
+        ANGLE_GL_TRY(context, functions->vertexAttribIFormat(
+                                  static_cast<GLuint>(attribIndex), format.channelCount,
+                                  gl::ToGLenum(format.vertexAttribType), attrib.relativeOffset));
     }
     else
     {
-        functions->vertexAttribFormat(static_cast<GLuint>(attribIndex), format.channelCount,
-                                      gl::ToGLenum(format.vertexAttribType), format.isNorm(),
-                                      attrib.relativeOffset);
+        ANGLE_GL_TRY(context, functions->vertexAttribFormat(
+                                  static_cast<GLuint>(attribIndex), format.channelCount,
+                                  gl::ToGLenum(format.vertexAttribType), format.isNorm(),
+                                  attrib.relativeOffset));
     }
 
     mNativeState->attributes[attribIndex].format         = attrib.format;
     mNativeState->attributes[attribIndex].relativeOffset = attrib.relativeOffset;
+    return angle::Result::Continue;
 }
 
-void VertexArrayGL::updateAttribBinding(const gl::Context *context, size_t attribIndex)
+angle::Result VertexArrayGL::updateAttribBinding(const gl::Context *context, size_t attribIndex)
 {
     ASSERT(supportVertexAttribBinding(context));
 
     GLuint bindingIndex = mState.getVertexAttribute(attribIndex).bindingIndex;
     if (mNativeState->attributes[attribIndex].bindingIndex == bindingIndex)
     {
-        return;
+        return angle::Result::Continue;
     }
 
     const FunctionsGL *functions = GetFunctionsGL(context);
-    functions->vertexAttribBinding(static_cast<GLuint>(attribIndex), bindingIndex);
+    ANGLE_GL_TRY(context,
+                 functions->vertexAttribBinding(static_cast<GLuint>(attribIndex), bindingIndex));
 
     mNativeState->attributes[attribIndex].bindingIndex = bindingIndex;
+
+    return angle::Result::Continue;
 }
 
-void VertexArrayGL::updateBindingBuffer(const gl::Context *context, size_t bindingIndex)
+angle::Result VertexArrayGL::updateBindingBuffer(const gl::Context *context, size_t bindingIndex)
 {
     ASSERT(supportVertexAttribBinding(context));
 
     const VertexBinding &binding = mState.getVertexBinding(bindingIndex);
     if (SameVertexBuffer(mNativeState->bindings[bindingIndex], binding))
     {
-        return;
+        return angle::Result::Continue;
     }
 
     gl::Buffer *arrayBuffer = binding.getBuffer().get();
     GLuint bufferId         = GetNativeBufferID(arrayBuffer);
 
     const FunctionsGL *functions = GetFunctionsGL(context);
-    functions->bindVertexBuffer(static_cast<GLuint>(bindingIndex), bufferId, binding.getOffset(),
-                                binding.getStride());
+    ANGLE_GL_TRY(context, functions->bindVertexBuffer(static_cast<GLuint>(bindingIndex), bufferId,
+                                                      binding.getOffset(), binding.getStride()));
 
     mNativeState->bindings[bindingIndex].stride = binding.getStride();
     mNativeState->bindings[bindingIndex].offset = binding.getOffset();
     mArrayBuffers[bindingIndex].set(context, arrayBuffer);
     mNativeState->bindings[bindingIndex].buffer = bufferId;
+
+    return angle::Result::Continue;
 }
 
-void VertexArrayGL::updateBindingDivisor(const gl::Context *context, size_t bindingIndex)
+angle::Result VertexArrayGL::updateBindingDivisor(const gl::Context *context, size_t bindingIndex)
 {
     GLuint adjustedDivisor =
         GetAdjustedDivisor(mAppliedNumViews, mState.getVertexBinding(bindingIndex).getDivisor());
     if (mNativeState->bindings[bindingIndex].divisor == adjustedDivisor)
     {
-        return;
+        return angle::Result::Continue;
     }
 
     const FunctionsGL *functions = GetFunctionsGL(context);
     if (supportVertexAttribBinding(context))
     {
-        functions->vertexBindingDivisor(static_cast<GLuint>(bindingIndex), adjustedDivisor);
+        ANGLE_GL_TRY(context, functions->vertexBindingDivisor(static_cast<GLuint>(bindingIndex),
+                                                              adjustedDivisor));
     }
     else
     {
         // We can only use VertexAttribDivisor on platforms that don't support Vertex Attrib
         // Binding.
-        functions->vertexAttribDivisor(static_cast<GLuint>(bindingIndex), adjustedDivisor);
+        ANGLE_GL_TRY(context, functions->vertexAttribDivisor(static_cast<GLuint>(bindingIndex),
+                                                             adjustedDivisor));
     }
 
     if (adjustedDivisor > 0)
@@ -827,11 +857,14 @@
     }
 
     mNativeState->bindings[bindingIndex].divisor = adjustedDivisor;
+
+    return angle::Result::Continue;
 }
 
-void VertexArrayGL::syncDirtyAttrib(const gl::Context *context,
-                                    size_t attribIndex,
-                                    const gl::VertexArray::DirtyAttribBits &dirtyAttribBits)
+angle::Result VertexArrayGL::syncDirtyAttrib(
+    const gl::Context *context,
+    size_t attribIndex,
+    const gl::VertexArray::DirtyAttribBits &dirtyAttribBits)
 {
     ASSERT(dirtyAttribBits.any());
 
@@ -840,22 +873,22 @@
         switch (dirtyBit)
         {
             case VertexArray::DIRTY_ATTRIB_ENABLED:
-                updateAttribEnabled(context, attribIndex);
+                ANGLE_TRY(updateAttribEnabled(context, attribIndex));
                 break;
 
             case VertexArray::DIRTY_ATTRIB_POINTER_BUFFER:
             case VertexArray::DIRTY_ATTRIB_POINTER:
-                updateAttribPointer(context, attribIndex);
+                ANGLE_TRY(updateAttribPointer(context, attribIndex));
                 break;
 
             case VertexArray::DIRTY_ATTRIB_FORMAT:
                 ASSERT(supportVertexAttribBinding(context));
-                updateAttribFormat(context, attribIndex);
+                ANGLE_TRY(updateAttribFormat(context, attribIndex));
                 break;
 
             case VertexArray::DIRTY_ATTRIB_BINDING:
                 ASSERT(supportVertexAttribBinding(context));
-                updateAttribBinding(context, attribIndex);
+                ANGLE_TRY(updateAttribBinding(context, attribIndex));
                 break;
 
             default:
@@ -863,11 +896,13 @@
                 break;
         }
     }
+    return angle::Result::Continue;
 }
 
-void VertexArrayGL::syncDirtyBinding(const gl::Context *context,
-                                     size_t bindingIndex,
-                                     const gl::VertexArray::DirtyBindingBits &dirtyBindingBits)
+angle::Result VertexArrayGL::syncDirtyBinding(
+    const gl::Context *context,
+    size_t bindingIndex,
+    const gl::VertexArray::DirtyBindingBits &dirtyBindingBits)
 {
     // Dependent state changes in buffers can trigger updates with no dirty bits set.
 
@@ -877,11 +912,11 @@
         {
             case VertexArray::DIRTY_BINDING_BUFFER:
                 ASSERT(supportVertexAttribBinding(context));
-                updateBindingBuffer(context, bindingIndex);
+                ANGLE_TRY(updateBindingBuffer(context, bindingIndex));
                 break;
 
             case VertexArray::DIRTY_BINDING_DIVISOR:
-                updateBindingDivisor(context, bindingIndex);
+                ANGLE_TRY(updateBindingDivisor(context, bindingIndex));
                 break;
 
             default:
@@ -889,18 +924,19 @@
                 break;
         }
     }
+    return angle::Result::Continue;
 }
 
-#define ANGLE_DIRTY_ATTRIB_FUNC(INDEX)                         \
-    case VertexArray::DIRTY_BIT_ATTRIB_0 + INDEX:              \
-        syncDirtyAttrib(context, INDEX, (*attribBits)[INDEX]); \
-        (*attribBits)[INDEX].reset();                          \
+#define ANGLE_DIRTY_ATTRIB_FUNC(INDEX)                                    \
+    case VertexArray::DIRTY_BIT_ATTRIB_0 + INDEX:                         \
+        ANGLE_TRY(syncDirtyAttrib(context, INDEX, (*attribBits)[INDEX])); \
+        (*attribBits)[INDEX].reset();                                     \
         break;
 
-#define ANGLE_DIRTY_BINDING_FUNC(INDEX)                          \
-    case VertexArray::DIRTY_BIT_BINDING_0 + INDEX:               \
-        syncDirtyBinding(context, INDEX, (*bindingBits)[INDEX]); \
-        (*bindingBits)[INDEX].reset();                           \
+#define ANGLE_DIRTY_BINDING_FUNC(INDEX)                                     \
+    case VertexArray::DIRTY_BIT_BINDING_0 + INDEX:                          \
+        ANGLE_TRY(syncDirtyBinding(context, INDEX, (*bindingBits)[INDEX])); \
+        (*bindingBits)[INDEX].reset();                                      \
         break;
 
 #define ANGLE_DIRTY_BUFFER_DATA_FUNC(INDEX)            \
@@ -920,7 +956,7 @@
         switch (dirtyBit)
         {
             case VertexArray::DIRTY_BIT_ELEMENT_ARRAY_BUFFER:
-                updateElementArrayBufferBinding(context);
+                ANGLE_TRY(updateElementArrayBufferBinding(context));
                 break;
 
             case VertexArray::DIRTY_BIT_ELEMENT_ARRAY_BUFFER_DATA:
@@ -939,7 +975,7 @@
     return angle::Result::Continue;
 }
 
-void VertexArrayGL::applyNumViewsToDivisor(const gl::Context *context, int numViews)
+angle::Result VertexArrayGL::applyNumViewsToDivisor(const gl::Context *context, int numViews)
 {
     if (numViews != mAppliedNumViews)
     {
@@ -948,18 +984,20 @@
         mAppliedNumViews = numViews;
         for (size_t index = 0u; index < mNativeState->bindings.size(); ++index)
         {
-            updateBindingDivisor(context, index);
+            ANGLE_TRY(updateBindingDivisor(context, index));
         }
     }
+
+    return angle::Result::Continue;
 }
 
-void VertexArrayGL::applyActiveAttribLocationsMask(const gl::Context *context,
-                                                   const gl::AttributesMask &activeMask)
+angle::Result VertexArrayGL::applyActiveAttribLocationsMask(const gl::Context *context,
+                                                            const gl::AttributesMask &activeMask)
 {
     gl::AttributesMask updateMask = mProgramActiveAttribLocationsMask ^ activeMask;
     if (!updateMask.any())
     {
-        return;
+        return angle::Result::Continue;
     }
 
     ASSERT(mVertexArrayID == GetStateManagerGL(context)->getVertexArrayID());
@@ -967,26 +1005,28 @@
 
     for (size_t attribIndex : updateMask)
     {
-        updateAttribEnabled(context, attribIndex);
+        ANGLE_TRY(updateAttribEnabled(context, attribIndex));
     }
+
+    return angle::Result::Continue;
 }
 
-void VertexArrayGL::validateState(const gl::Context *context) const
+angle::Result VertexArrayGL::validateState(const gl::Context *context) const
 {
     const FunctionsGL *functions = GetFunctionsGL(context);
 
     // Ensure this vao is currently bound
-    ValidateStateHelperGetIntegerv(functions, mVertexArrayID, GL_VERTEX_ARRAY_BINDING,
-                                   "mVertexArrayID", "GL_VERTEX_ARRAY_BINDING");
+    ANGLE_TRY(ValidateStateHelperGetIntegerv(context, mVertexArrayID, GL_VERTEX_ARRAY_BINDING,
+                                             "mVertexArrayID", "GL_VERTEX_ARRAY_BINDING"));
 
     // Element array buffer
-    ValidateStateHelperGetIntegerv(
-        functions, mNativeState->elementArrayBuffer, GL_ELEMENT_ARRAY_BUFFER_BINDING,
-        "mNativeState->elementArrayBuffer", "GL_ELEMENT_ARRAY_BUFFER_BINDING");
+    ANGLE_TRY(ValidateStateHelperGetIntegerv(
+        context, mNativeState->elementArrayBuffer, GL_ELEMENT_ARRAY_BUFFER_BINDING,
+        "mNativeState->elementArrayBuffer", "GL_ELEMENT_ARRAY_BUFFER_BINDING"));
 
     // ValidateStateHelperGetIntegerv but with > comparison instead of !=
     GLint queryValue;
-    functions->getIntegerv(GL_MAX_VERTEX_ATTRIBS, &queryValue);
+    ANGLE_GL_TRY(context, functions->getIntegerv(GL_MAX_VERTEX_ATTRIBS, &queryValue));
     if (mNativeState->attributes.size() > static_cast<GLuint>(queryValue))
     {
         WARN() << "mNativeState->attributes.size() (" << mNativeState->attributes.size()
@@ -1002,52 +1042,53 @@
         ASSERT(attribute.bindingIndex < mNativeState->bindings.size());
         VertexBindingGL &binding = mNativeState->bindings[attribute.bindingIndex];
 
-        ValidateStateHelperGetVertexAttribiv(
-            functions, index, attribute.enabled, GL_VERTEX_ATTRIB_ARRAY_ENABLED,
-            "mNativeState->attributes.enabled", "GL_VERTEX_ATTRIB_ARRAY_ENABLED");
+        ANGLE_TRY(ValidateStateHelperGetVertexAttribiv(
+            context, index, attribute.enabled, GL_VERTEX_ATTRIB_ARRAY_ENABLED,
+            "mNativeState->attributes.enabled", "GL_VERTEX_ATTRIB_ARRAY_ENABLED"));
 
         if (attribute.enabled)
         {
             // Applied attributes
             ASSERT(attribute.format);
-            ValidateStateHelperGetVertexAttribiv(
-                functions, index, ToGLenum(attribute.format->vertexAttribType),
+            ANGLE_TRY(ValidateStateHelperGetVertexAttribiv(
+                context, index, ToGLenum(attribute.format->vertexAttribType),
                 GL_VERTEX_ATTRIB_ARRAY_TYPE, "mNativeState->attributes.format->vertexAttribType",
-                "GL_VERTEX_ATTRIB_ARRAY_TYPE");
-            ValidateStateHelperGetVertexAttribiv(
-                functions, index, attribute.format->channelCount, GL_VERTEX_ATTRIB_ARRAY_SIZE,
-                "attribute.format->channelCount", "GL_VERTEX_ATTRIB_ARRAY_SIZE");
-            ValidateStateHelperGetVertexAttribiv(
-                functions, index, attribute.format->isNorm(), GL_VERTEX_ATTRIB_ARRAY_NORMALIZED,
-                "attribute.format->isNorm()", "GL_VERTEX_ATTRIB_ARRAY_NORMALIZED");
-            ValidateStateHelperGetVertexAttribiv(
-                functions, index, attribute.format->isPureInt(), GL_VERTEX_ATTRIB_ARRAY_INTEGER,
-                "attribute.format->isPureInt()", "GL_VERTEX_ATTRIB_ARRAY_INTEGER");
+                "GL_VERTEX_ATTRIB_ARRAY_TYPE"));
+            ANGLE_TRY(ValidateStateHelperGetVertexAttribiv(
+                context, index, attribute.format->channelCount, GL_VERTEX_ATTRIB_ARRAY_SIZE,
+                "attribute.format->channelCount", "GL_VERTEX_ATTRIB_ARRAY_SIZE"));
+            ANGLE_TRY(ValidateStateHelperGetVertexAttribiv(
+                context, index, attribute.format->isNorm(), GL_VERTEX_ATTRIB_ARRAY_NORMALIZED,
+                "attribute.format->isNorm()", "GL_VERTEX_ATTRIB_ARRAY_NORMALIZED"));
+            ANGLE_TRY(ValidateStateHelperGetVertexAttribiv(
+                context, index, attribute.format->isPureInt(), GL_VERTEX_ATTRIB_ARRAY_INTEGER,
+                "attribute.format->isPureInt()", "GL_VERTEX_ATTRIB_ARRAY_INTEGER"));
             if (supportVertexAttribBinding(context))
             {
-                ValidateStateHelperGetVertexAttribiv(
-                    functions, index, attribute.relativeOffset, GL_VERTEX_ATTRIB_RELATIVE_OFFSET,
-                    "attribute.relativeOffset", "GL_VERTEX_ATTRIB_RELATIVE_OFFSET");
-                ValidateStateHelperGetVertexAttribiv(
-                    functions, index, attribute.bindingIndex, GL_VERTEX_ATTRIB_BINDING,
-                    "attribute.bindingIndex", "GL_VERTEX_ATTRIB_BINDING");
+                ANGLE_TRY(ValidateStateHelperGetVertexAttribiv(
+                    context, index, attribute.relativeOffset, GL_VERTEX_ATTRIB_RELATIVE_OFFSET,
+                    "attribute.relativeOffset", "GL_VERTEX_ATTRIB_RELATIVE_OFFSET"));
+                ANGLE_TRY(ValidateStateHelperGetVertexAttribiv(
+                    context, index, attribute.bindingIndex, GL_VERTEX_ATTRIB_BINDING,
+                    "attribute.bindingIndex", "GL_VERTEX_ATTRIB_BINDING"));
             }
 
             // Applied bindings
-            ValidateStateHelperGetVertexAttribiv(
-                functions, index, binding.buffer, GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING,
-                "binding.buffer", "GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING");
+            ANGLE_TRY(ValidateStateHelperGetVertexAttribiv(
+                context, index, binding.buffer, GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING,
+                "binding.buffer", "GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING"));
             if (binding.buffer != 0)
             {
-                ValidateStateHelperGetVertexAttribiv(
-                    functions, index, binding.stride, GL_VERTEX_ATTRIB_ARRAY_STRIDE,
-                    "binding.stride", "GL_VERTEX_ATTRIB_ARRAY_STRIDE");
-                ValidateStateHelperGetVertexAttribiv(
-                    functions, index, binding.divisor, GL_VERTEX_ATTRIB_ARRAY_DIVISOR,
-                    "binding.divisor", "GL_VERTEX_ATTRIB_ARRAY_DIVISOR");
+                ANGLE_TRY(ValidateStateHelperGetVertexAttribiv(
+                    context, index, binding.stride, GL_VERTEX_ATTRIB_ARRAY_STRIDE, "binding.stride",
+                    "GL_VERTEX_ATTRIB_ARRAY_STRIDE"));
+                ANGLE_TRY(ValidateStateHelperGetVertexAttribiv(
+                    context, index, binding.divisor, GL_VERTEX_ATTRIB_ARRAY_DIVISOR,
+                    "binding.divisor", "GL_VERTEX_ATTRIB_ARRAY_DIVISOR"));
             }
         }
     }
+    return angle::Result::Continue;
 }
 
 }  // namespace rx
diff --git a/src/libANGLE/renderer/gl/VertexArrayGL.h b/src/libANGLE/renderer/gl/VertexArrayGL.h
index 26792ba..e1c5d70 100644
--- a/src/libANGLE/renderer/gl/VertexArrayGL.h
+++ b/src/libANGLE/renderer/gl/VertexArrayGL.h
@@ -53,13 +53,14 @@
                             gl::VertexArray::DirtyAttribBitsArray *attribBits,
                             gl::VertexArray::DirtyBindingBitsArray *bindingBits) override;
 
-    void applyNumViewsToDivisor(const gl::Context *context, int numViews);
-    void applyActiveAttribLocationsMask(const gl::Context *context,
-                                        const gl::AttributesMask &activeMask);
+    angle::Result applyNumViewsToDivisor(const gl::Context *context, int numViews);
+    angle::Result applyActiveAttribLocationsMask(const gl::Context *context,
+                                                 const gl::AttributesMask &activeMask);
 
-    void validateState(const gl::Context *context) const;
+    angle::Result validateState(const gl::Context *context) const;
 
-    void recoverForcedStreamingAttributesForDrawArraysInstanced(const gl::Context *context) const;
+    angle::Result recoverForcedStreamingAttributesForDrawArraysInstanced(
+        const gl::Context *context) const;
 
   private:
     angle::Result syncDrawState(const gl::Context *context,
@@ -96,32 +97,32 @@
                                    GLsizei instanceCount,
                                    const gl::IndexRange &indexRange,
                                    bool applyExtraOffsetWorkaroundForInstancedAttributes) const;
-    void syncDirtyAttrib(const gl::Context *context,
-                         size_t attribIndex,
-                         const gl::VertexArray::DirtyAttribBits &dirtyAttribBits);
-    void syncDirtyBinding(const gl::Context *context,
-                          size_t bindingIndex,
-                          const gl::VertexArray::DirtyBindingBits &dirtyBindingBits);
+    angle::Result syncDirtyAttrib(const gl::Context *context,
+                                  size_t attribIndex,
+                                  const gl::VertexArray::DirtyAttribBits &dirtyAttribBits);
+    angle::Result syncDirtyBinding(const gl::Context *context,
+                                   size_t bindingIndex,
+                                   const gl::VertexArray::DirtyBindingBits &dirtyBindingBits);
 
-    void updateAttribEnabled(const gl::Context *context, size_t attribIndex);
-    void updateAttribPointer(const gl::Context *context, size_t attribIndex);
+    angle::Result updateAttribEnabled(const gl::Context *context, size_t attribIndex);
+    angle::Result updateAttribPointer(const gl::Context *context, size_t attribIndex);
 
     bool supportVertexAttribBinding(const gl::Context *context) const;
 
-    void updateAttribFormat(const gl::Context *context, size_t attribIndex);
-    void updateAttribBinding(const gl::Context *context, size_t attribIndex);
-    void updateBindingBuffer(const gl::Context *context, size_t bindingIndex);
-    void updateBindingDivisor(const gl::Context *context, size_t bindingIndex);
+    angle::Result updateAttribFormat(const gl::Context *context, size_t attribIndex);
+    angle::Result updateAttribBinding(const gl::Context *context, size_t attribIndex);
+    angle::Result updateBindingBuffer(const gl::Context *context, size_t bindingIndex);
+    angle::Result updateBindingDivisor(const gl::Context *context, size_t bindingIndex);
 
-    void updateElementArrayBufferBinding(const gl::Context *context) const;
+    angle::Result updateElementArrayBufferBinding(const gl::Context *context) const;
 
-    void callVertexAttribPointer(const gl::Context *context,
-                                 GLuint attribIndex,
-                                 const gl::VertexAttribute &attrib,
-                                 GLsizei stride,
-                                 GLintptr offset) const;
+    angle::Result callVertexAttribPointer(const gl::Context *context,
+                                          GLuint attribIndex,
+                                          const gl::VertexAttribute &attrib,
+                                          GLsizei stride,
+                                          GLintptr offset) const;
 
-    void recoverForcedStreamingAttributesForDrawArraysInstanced(
+    angle::Result recoverForcedStreamingAttributesForDrawArraysInstanced(
         const gl::Context *context,
         gl::AttributesMask *attributeMask) const;
 
diff --git a/src/libANGLE/renderer/gl/cgl/WindowSurfaceCGL.h b/src/libANGLE/renderer/gl/cgl/WindowSurfaceCGL.h
index d8baabf..783a3df 100644
--- a/src/libANGLE/renderer/gl/cgl/WindowSurfaceCGL.h
+++ b/src/libANGLE/renderer/gl/cgl/WindowSurfaceCGL.h
@@ -18,7 +18,7 @@
 typedef __IOSurface *IOSurfaceRef;
 
 // WebKit's build process requires that every Objective-C class name has the prefix "Web".
-@class WebSwapLayerCGL;
+@class WebSwapCGLLayer;
 
 namespace rx
 {
@@ -87,7 +87,7 @@
                                               const gl::FramebufferState &state) override;
 
   private:
-    WebSwapLayerCGL *mSwapLayer;
+    WebSwapCGLLayer *mSwapLayer;
     SharedSwapState mSwapState;
     uint64_t mCurrentSwapId;
 
diff --git a/src/libANGLE/renderer/gl/cgl/WindowSurfaceCGL.mm b/src/libANGLE/renderer/gl/cgl/WindowSurfaceCGL.mm
index 4cb065c..2189468 100644
--- a/src/libANGLE/renderer/gl/cgl/WindowSurfaceCGL.mm
+++ b/src/libANGLE/renderer/gl/cgl/WindowSurfaceCGL.mm
@@ -24,7 +24,7 @@
 #    include "libANGLE/renderer/gl/StateManagerGL.h"
 #    include "libANGLE/renderer/gl/cgl/DisplayCGL.h"
 
-@interface WebSwapLayerCGL : CAOpenGLLayer {
+@interface WebSwapCGLLayer : CAOpenGLLayer {
     CGLContextObj mDisplayContext;
 
     bool initialized;
@@ -38,7 +38,7 @@
             withFunctions:(const rx::FunctionsGL *)functions;
 @end
 
-@implementation WebSwapLayerCGL
+@implementation WebSwapCGLLayer
 - (id)initWithSharedState:(rx::SharedSwapState *)swapState
               withContext:(CGLContextObj)displayContext
             withFunctions:(const rx::FunctionsGL *)functions
@@ -213,7 +213,7 @@
     mSwapState.lastRendered   = &mSwapState.textures[1];
     mSwapState.beingPresented = &mSwapState.textures[2];
 
-    mSwapLayer = [[WebSwapLayerCGL alloc] initWithSharedState:&mSwapState
+    mSwapLayer = [[WebSwapCGLLayer alloc] initWithSharedState:&mSwapState
                                                   withContext:mContext
                                                 withFunctions:mFunctions];
     [mLayer addSublayer:mSwapLayer];
diff --git a/src/libANGLE/renderer/gl/egl/ContextEGL.cpp b/src/libANGLE/renderer/gl/egl/ContextEGL.cpp
index 1e6b01d..0f6b16e 100644
--- a/src/libANGLE/renderer/gl/egl/ContextEGL.cpp
+++ b/src/libANGLE/renderer/gl/egl/ContextEGL.cpp
@@ -23,7 +23,7 @@
 
 angle::Result ContextEGL::onMakeCurrent(const gl::Context *context)
 {
-    if (!context->isCurrent() && context->isExternal())
+    if (context->isExternal())
     {
         if (!mExtState)
         {
diff --git a/src/libANGLE/renderer/gl/egl/DmaBufImageSiblingEGL.cpp b/src/libANGLE/renderer/gl/egl/DmaBufImageSiblingEGL.cpp
index 476035e..9610923 100644
--- a/src/libANGLE/renderer/gl/egl/DmaBufImageSiblingEGL.cpp
+++ b/src/libANGLE/renderer/gl/egl/DmaBufImageSiblingEGL.cpp
@@ -13,7 +13,7 @@
 {
 
 // Refer to the following link
-// https://source.chromium.org/chromium/chromium/src/+/master:ui/gl/gl_image_native_pixmap.cc;l=24
+// https://source.chromium.org/chromium/chromium/src/+/main:ui/gl/gl_image_native_pixmap.cc;l=24
 #define FOURCC(a, b, c, d)                                          \
     ((static_cast<uint32_t>(a)) | (static_cast<uint32_t>(b) << 8) | \
      (static_cast<uint32_t>(c) << 16) | (static_cast<uint32_t>(d) << 24))
@@ -74,13 +74,14 @@
 namespace rx
 {
 DmaBufImageSiblingEGL::DmaBufImageSiblingEGL(const egl::AttributeMap &attribs)
-    : mAttribs(attribs), mFormat(GL_NONE), mYUV(false)
+    : mAttribs(attribs), mFormat(GL_NONE), mYUV(false), mHasProtectedContent(false)
 {
     ASSERT(mAttribs.contains(EGL_WIDTH));
     mSize.width = mAttribs.getAsInt(EGL_WIDTH);
     ASSERT(mAttribs.contains(EGL_HEIGHT));
-    mSize.height = mAttribs.getAsInt(EGL_HEIGHT);
-    mSize.depth  = 1;
+    mSize.height         = mAttribs.getAsInt(EGL_HEIGHT);
+    mSize.depth          = 1;
+    mHasProtectedContent = false;
 
     int fourCCFormat = mAttribs.getAsInt(EGL_LINUX_DRM_FOURCC_EXT);
     mFormat          = gl::Format(FourCCFormatToGLInternalFormat(fourCCFormat, &mYUV));
@@ -113,6 +114,11 @@
     return mYUV;
 }
 
+bool DmaBufImageSiblingEGL::hasProtectedContent() const
+{
+    return mHasProtectedContent;
+}
+
 gl::Extents DmaBufImageSiblingEGL::getSize() const
 {
     return mSize;
@@ -132,6 +138,7 @@
 {
     EGLenum kForwardedAttribs[] = {EGL_WIDTH,
                                    EGL_HEIGHT,
+                                   EGL_PROTECTED_CONTENT_EXT,
                                    EGL_LINUX_DRM_FOURCC_EXT,
                                    EGL_DMA_BUF_PLANE0_FD_EXT,
                                    EGL_DMA_BUF_PLANE0_OFFSET_EXT,
diff --git a/src/libANGLE/renderer/gl/egl/DmaBufImageSiblingEGL.h b/src/libANGLE/renderer/gl/egl/DmaBufImageSiblingEGL.h
index 033ec5c..f367f6b 100644
--- a/src/libANGLE/renderer/gl/egl/DmaBufImageSiblingEGL.h
+++ b/src/libANGLE/renderer/gl/egl/DmaBufImageSiblingEGL.h
@@ -28,6 +28,7 @@
     bool isRenderable(const gl::Context *context) const override;
     bool isTexturable(const gl::Context *context) const override;
     bool isYUV() const override;
+    bool hasProtectedContent() const override;
     gl::Extents getSize() const override;
     size_t getSamples() const override;
 
@@ -40,6 +41,7 @@
     gl::Extents mSize;
     gl::Format mFormat;
     bool mYUV;
+    bool mHasProtectedContent;
 };
 
 }  // namespace rx
diff --git a/src/libANGLE/renderer/gl/egl/android/NativeBufferImageSiblingAndroid.cpp b/src/libANGLE/renderer/gl/egl/android/NativeBufferImageSiblingAndroid.cpp
index fac8e83..3ab8f9e 100644
--- a/src/libANGLE/renderer/gl/egl/android/NativeBufferImageSiblingAndroid.cpp
+++ b/src/libANGLE/renderer/gl/egl/android/NativeBufferImageSiblingAndroid.cpp
@@ -21,11 +21,13 @@
 egl::Error NativeBufferImageSiblingAndroid::initialize(const egl::Display *display)
 {
     int pixelFormat = 0;
+    uint64_t usage  = 0;
     angle::android::GetANativeWindowBufferProperties(
         angle::android::ClientBufferToANativeWindowBuffer(mBuffer), &mSize.width, &mSize.height,
-        &mSize.depth, &pixelFormat);
+        &mSize.depth, &pixelFormat, &usage);
     mFormat = gl::Format(angle::android::NativePixelFormatToGLInternalFormat(pixelFormat));
     mYUV    = angle::android::NativePixelFormatIsYUV(pixelFormat);
+    mHasProtectedContent = false;
 
     return egl::NoError();
 }
@@ -50,6 +52,11 @@
     return mYUV;
 }
 
+bool NativeBufferImageSiblingAndroid::hasProtectedContent() const
+{
+    return mHasProtectedContent;
+}
+
 gl::Extents NativeBufferImageSiblingAndroid::getSize() const
 {
     return mSize;
diff --git a/src/libANGLE/renderer/gl/egl/android/NativeBufferImageSiblingAndroid.h b/src/libANGLE/renderer/gl/egl/android/NativeBufferImageSiblingAndroid.h
index 5c5fda2..d549411 100644
--- a/src/libANGLE/renderer/gl/egl/android/NativeBufferImageSiblingAndroid.h
+++ b/src/libANGLE/renderer/gl/egl/android/NativeBufferImageSiblingAndroid.h
@@ -28,6 +28,7 @@
     bool isRenderable(const gl::Context *context) const override;
     bool isTexturable(const gl::Context *context) const override;
     bool isYUV() const override;
+    bool hasProtectedContent() const override;
     gl::Extents getSize() const override;
     size_t getSamples() const override;
 
@@ -39,6 +40,7 @@
     gl::Extents mSize;
     gl::Format mFormat;
     bool mYUV;
+    bool mHasProtectedContent;
 };
 
 }  // namespace rx
diff --git a/src/libANGLE/renderer/gl/formatutilsgl.cpp b/src/libANGLE/renderer/gl/formatutilsgl.cpp
index ec526d6..a1356b0 100644
--- a/src/libANGLE/renderer/gl/formatutilsgl.cpp
+++ b/src/libANGLE/renderer/gl/formatutilsgl.cpp
@@ -415,11 +415,11 @@
     InsertFormatMapping(&map, GL_COMPRESSED_RGBA_PVRTC_2BPPV1_IMG,   ExtsOnly("GL_IMG_texture_compression_pvrtc"),     AlwaysSupported(), NeverSupported(), ExtsOnly("GL_IMG_texture_compression_pvrtc"),   AlwaysSupported(), NeverSupported(),                      NeverSupported()                );
 
     // From GL_EXT_pvrtc_sRGB
-    //                       | Format                                      | OpenGL texture support  | Filter          | Render          | OpenGL ES texture support      | Filter           | OpenGL ES texture attachment support | OpenGL ES renderbuffer support |
-    InsertFormatMapping(&map, GL_COMPRESSED_SRGB_PVRTC_2BPPV1_EXT,          NeverSupported(),         NeverSupported(), NeverSupported(), ExtsOnly("GL_EXT_pvrtc_sRGB"),   AlwaysSupported(), NeverSupported(),                      NeverSupported()                );
-    InsertFormatMapping(&map, GL_COMPRESSED_SRGB_PVRTC_4BPPV1_EXT,          NeverSupported(),         NeverSupported(), NeverSupported(), ExtsOnly("GL_EXT_pvrtc_sRGB"),   AlwaysSupported(), NeverSupported(),                      NeverSupported()                );
-    InsertFormatMapping(&map, GL_COMPRESSED_SRGB_ALPHA_PVRTC_2BPPV1_EXT,    NeverSupported(),         NeverSupported(), NeverSupported(), ExtsOnly("GL_EXT_pvrtc_sRGB"),   AlwaysSupported(), NeverSupported(),                      NeverSupported()                );
-    InsertFormatMapping(&map, GL_COMPRESSED_SRGB_ALPHA_PVRTC_4BPPV1_EXT,    NeverSupported(),         NeverSupported(), NeverSupported(), ExtsOnly("GL_EXT_pvrtc_sRGB"),   AlwaysSupported(), NeverSupported(),                      NeverSupported()                );
+    //                       | Format                                      | OpenGL texture support  | Filter          | Render          | OpenGL ES texture support                                      | Filter           | OpenGL ES texture attachment support | OpenGL ES renderbuffer support |
+    InsertFormatMapping(&map, GL_COMPRESSED_SRGB_PVRTC_2BPPV1_EXT,          NeverSupported(),         NeverSupported(), NeverSupported(), ExtsOnly("GL_IMG_texture_compression_pvrtc GL_EXT_pvrtc_sRGB"),   AlwaysSupported(), NeverSupported(),                      NeverSupported()                );
+    InsertFormatMapping(&map, GL_COMPRESSED_SRGB_PVRTC_4BPPV1_EXT,          NeverSupported(),         NeverSupported(), NeverSupported(), ExtsOnly("GL_IMG_texture_compression_pvrtc GL_EXT_pvrtc_sRGB"),   AlwaysSupported(), NeverSupported(),                      NeverSupported()                );
+    InsertFormatMapping(&map, GL_COMPRESSED_SRGB_ALPHA_PVRTC_2BPPV1_EXT,    NeverSupported(),         NeverSupported(), NeverSupported(), ExtsOnly("GL_IMG_texture_compression_pvrtc GL_EXT_pvrtc_sRGB"),   AlwaysSupported(), NeverSupported(),                      NeverSupported()                );
+    InsertFormatMapping(&map, GL_COMPRESSED_SRGB_ALPHA_PVRTC_4BPPV1_EXT,    NeverSupported(),         NeverSupported(), NeverSupported(), ExtsOnly("GL_IMG_texture_compression_pvrtc GL_EXT_pvrtc_sRGB"),   AlwaysSupported(), NeverSupported(),                      NeverSupported()                );
 
     // clang-format on
 
diff --git a/src/libANGLE/renderer/gl/renderergl_utils.cpp b/src/libANGLE/renderer/gl/renderergl_utils.cpp
index 49962d0..a70f6e8 100644
--- a/src/libANGLE/renderer/gl/renderergl_utils.cpp
+++ b/src/libANGLE/renderer/gl/renderergl_utils.cpp
@@ -1815,17 +1815,42 @@
                                       angle::VendorID *outVendor,
                                       angle::DeviceID *outDevice)
 {
+    // Get vendor from GL itself, so on multi-GPU systems the correct GPU is selected.
+    *outVendor = GetVendorID(functions);
+    *outDevice = 0;
+
+    // Gather additional information from the system to detect multi-GPU scenarios.
     bool isGetSystemInfoSuccess = angle::GetSystemInfo(outSystemInfo);
+
+    // Get the device id from system info, corresponding to the vendor of the active GPU.
     if (isGetSystemInfoSuccess && !outSystemInfo->gpus.empty())
     {
-        *outVendor = outSystemInfo->gpus[outSystemInfo->activeGPUIndex].vendorId;
-        *outDevice = outSystemInfo->gpus[outSystemInfo->activeGPUIndex].deviceId;
+        if (*outVendor == VENDOR_ID_UNKNOWN)
+        {
+            // If vendor ID is unknown, take the best estimate of the active GPU.  Chances are there
+            // is only one GPU anyway.
+            *outVendor = outSystemInfo->gpus[outSystemInfo->activeGPUIndex].vendorId;
+            *outDevice = outSystemInfo->gpus[outSystemInfo->activeGPUIndex].deviceId;
+        }
+        else
+        {
+            for (const angle::GPUDeviceInfo &gpu : outSystemInfo->gpus)
+            {
+                if (*outVendor == gpu.vendorId)
+                {
+                    // Note that deviceId may not necessarily have been possible to retrieve.
+                    *outDevice = gpu.deviceId;
+                    break;
+                }
+            }
+        }
     }
     else
     {
-        *outVendor = GetVendorID(functions);
+        // If system info is not available, attempt to deduce the device from GL itself.
         *outDevice = GetDeviceID(functions);
     }
+
     return isGetSystemInfoSuccess;
 }
 
@@ -1935,8 +1960,6 @@
     ANGLE_FEATURE_CONDITION(features, reapplyUBOBindingsAfterUsingBinaryProgram,
                             isAMD || IsAndroid());
 
-    ANGLE_FEATURE_CONDITION(features, rewriteVectorScalarArithmetic, isNvidia);
-
     // TODO(oetuaho): Make this specific to the affected driver versions. Versions at least up to
     // 390 are known to be affected. Versions after that are expected not to be affected.
     ANGLE_FEATURE_CONDITION(features, clampFragDepth, isNvidia);
@@ -2110,8 +2133,10 @@
     // http://crbug.com/1137851
     // Speculative fix for above issue, users can enable it via flags.
     // http://crbug.com/1187475
-    // Disable on Intel due to crashes in Mesa
-    ANGLE_FEATURE_CONDITION(features, disableSyncControlSupport, IsLinux() && isIntel);
+    // Disable on Intel due to crashes in Mesa.
+    // http://anglebug.com/6174
+    // Disabled everywhere due to a bug in detecting Intel platforms on dual-GPU systems.
+    ANGLE_FEATURE_CONDITION(features, disableSyncControlSupport, IsLinux());
 
     ANGLE_FEATURE_CONDITION(features, keepBufferShadowCopy, !CanMapBufferForRead(functions));
 
@@ -2166,13 +2191,17 @@
     // http://crbug.com/594016
     bool isLinuxVivante = IsLinux() && IsVivante(device);
 
+    // Temporarily disable on all of Android. http://crbug.com/1238327
     ANGLE_FEATURE_CONDITION(features, disableMultisampledRenderToTexture,
-                            isAdreno4xxOnAndroidLessThan51 || isAdreno4xxOnAndroid70 ||
-                                isAdreno5xxOnAndroidLessThan70 || isAdreno5xxOnAndroid71 ||
-                                isLinuxVivante);
+                            IsAndroid() || isAdreno4xxOnAndroidLessThan51 ||
+                                isAdreno4xxOnAndroid70 || isAdreno5xxOnAndroidLessThan70 ||
+                                isAdreno5xxOnAndroid71 || isLinuxVivante);
 
     // http://crbug.com/1181068
     ANGLE_FEATURE_CONDITION(features, uploadTextureDataInChunks, IsApple());
+
+    // https://crbug.com/1060012
+    ANGLE_FEATURE_CONDITION(features, emulateImmutableCompressedTexture3D, isQualcomm);
 }
 
 void InitializeFrontendFeatures(const FunctionsGL *functions, angle::FrontendFeatures *features)
diff --git a/src/libANGLE/renderer/glslang_wrapper_utils.cpp b/src/libANGLE/renderer/glslang_wrapper_utils.cpp
index dde356d..8a49f0a 100644
--- a/src/libANGLE/renderer/glslang_wrapper_utils.cpp
+++ b/src/libANGLE/renderer/glslang_wrapper_utils.cpp
@@ -106,14 +106,12 @@
 }
 
 ShaderInterfaceVariableInfo *AddResourceInfo(ShaderInterfaceVariableInfoMap *infoMap,
+                                             gl::ShaderBitSet stages,
                                              gl::ShaderType shaderType,
                                              const std::string &varName,
                                              uint32_t descriptorSet,
                                              uint32_t binding)
 {
-    gl::ShaderBitSet stages;
-    stages.set(shaderType);
-
     ShaderInterfaceVariableInfo &info = infoMap->add(shaderType, varName);
     info.descriptorSet                = descriptorSet;
     info.binding                      = binding;
@@ -226,7 +224,8 @@
     // set/binding.
     for (uint32_t bufferIndex = 0; bufferIndex < bufferCount; ++bufferIndex)
     {
-        AddResourceInfo(variableInfoMapOut, shaderType, GetXfbBufferName(bufferIndex),
+        AddResourceInfo(variableInfoMapOut, gl::ShaderBitSet().set(shaderType), shaderType,
+                        GetXfbBufferName(bufferIndex),
                         programInterfaceInfo->uniformsAndXfbDescriptorSetIndex,
                         programInterfaceInfo->currentUniformBindingIndex);
         ++programInterfaceInfo->currentUniformBindingIndex;
@@ -672,7 +671,8 @@
 {
     if (programExecutable.hasLinkedShaderStage(shaderType))
     {
-        AddResourceInfo(variableInfoMapOut, shaderType, kDefaultUniformNames[shaderType],
+        AddResourceInfo(variableInfoMapOut, gl::ShaderBitSet().set(shaderType), shaderType,
+                        kDefaultUniformNames[shaderType],
                         programInterfaceInfo->uniformsAndXfbDescriptorSetIndex,
                         programInterfaceInfo->currentUniformBindingIndex);
         ++programInterfaceInfo->currentUniformBindingIndex;
@@ -683,14 +683,62 @@
     }
 }
 
-// TODO: http://anglebug.com/4512: Need to combine descriptor set bindings across
-// shader stages.
+bool InsertIfAbsent(UniformBindingIndexMap *uniformBindingIndexMapOut,
+                    const std::string &name,
+                    const uint32_t bindingIndex,
+                    const gl::ShaderType shaderType)
+{
+    if (uniformBindingIndexMapOut->count(name) == 0)
+    {
+        (*uniformBindingIndexMapOut)[name] =
+            UniformBindingInfo(bindingIndex, gl::ShaderBitSet(), shaderType);
+        return true;
+    }
+    return false;
+}
+
+void AddAndUpdateResourceMaps(const gl::ShaderType shaderType,
+                              std::string name,
+                              uint32_t *binding,
+                              bool updateBinding,
+                              bool updateFrontShaderType,
+                              const uint32_t descriptorSetIndex,
+                              UniformBindingIndexMap *uniformBindingIndexMapOut,
+                              ShaderInterfaceVariableInfoMap *variableInfoMapOut)
+{
+    ASSERT(binding);
+    bool isUniqueName = InsertIfAbsent(uniformBindingIndexMapOut, name, *binding, shaderType);
+    if (updateBinding && isUniqueName)
+    {
+        ++(*binding);
+    }
+    UniformBindingInfo &uniformBindingInfo = (*uniformBindingIndexMapOut)[name];
+    uniformBindingInfo.shaderBitSet.set(shaderType);
+    AddResourceInfo(variableInfoMapOut, uniformBindingInfo.shaderBitSet, shaderType, name,
+                    descriptorSetIndex, uniformBindingInfo.bindingIndex);
+    if (!isUniqueName)
+    {
+        if (updateFrontShaderType)
+        {
+            uniformBindingInfo.frontShaderType = shaderType;
+        }
+        else
+        {
+            variableInfoMapOut->markAsDuplicate(shaderType, name);
+        }
+    }
+    ShaderInterfaceVariableInfo &info =
+        variableInfoMapOut->get(uniformBindingInfo.frontShaderType, name);
+    info.activeStages = uniformBindingInfo.shaderBitSet;
+}
+
 void AssignInputAttachmentBindings(const GlslangSourceOptions &options,
                                    const gl::ProgramExecutable &programExecutable,
                                    const std::vector<gl::LinkedUniform> &uniforms,
                                    const gl::RangeUI &inputAttachmentUniformRange,
                                    const gl::ShaderType shaderType,
                                    GlslangProgramInterfaceInfo *programInterfaceInfo,
+                                   UniformBindingIndexMap *uniformBindingIndexMapOut,
                                    ShaderInterfaceVariableInfoMap *variableInfoMapOut)
 {
     const uint32_t baseInputAttachmentBindingIndex =
@@ -707,13 +755,12 @@
         if (programExecutable.hasLinkedShaderStage(shaderType) &&
             inputAttachmentUniform.isActive(shaderType))
         {
-            const uint32_t inputAttachmentBindingIndex =
+            uint32_t inputAttachmentBindingIndex =
                 baseInputAttachmentBindingIndex + inputAttachmentUniform.location;
-
-            AddResourceInfo(variableInfoMapOut, shaderType, mappedInputAttachmentName,
-                            programInterfaceInfo->shaderResourceDescriptorSetIndex,
-                            inputAttachmentBindingIndex);
-
+            AddAndUpdateResourceMaps(shaderType, mappedInputAttachmentName,
+                                     &(inputAttachmentBindingIndex), false, false,
+                                     programInterfaceInfo->shaderResourceDescriptorSetIndex,
+                                     uniformBindingIndexMapOut, variableInfoMapOut);
             hasFragmentInOutVars = true;
         }
     }
@@ -727,13 +774,12 @@
     }
 }
 
-// TODO: http://anglebug.com/4512: Need to combine descriptor set bindings across
-// shader stages.
 void AssignInterfaceBlockBindings(const GlslangSourceOptions &options,
                                   const gl::ProgramExecutable &programExecutable,
                                   const std::vector<gl::InterfaceBlock> &blocks,
                                   const gl::ShaderType shaderType,
                                   GlslangProgramInterfaceInfo *programInterfaceInfo,
+                                  UniformBindingIndexMap *uniformBindingIndexMapOut,
                                   ShaderInterfaceVariableInfoMap *variableInfoMapOut)
 {
     for (const gl::InterfaceBlock &block : blocks)
@@ -743,22 +789,22 @@
             // TODO: http://anglebug.com/4523: All blocks should be active
             if (programExecutable.hasLinkedShaderStage(shaderType) && block.isActive(shaderType))
             {
-                AddResourceInfo(variableInfoMapOut, shaderType, block.mappedName,
-                                programInterfaceInfo->shaderResourceDescriptorSetIndex,
-                                programInterfaceInfo->currentShaderResourceBindingIndex);
-                ++programInterfaceInfo->currentShaderResourceBindingIndex;
+                AddAndUpdateResourceMaps(shaderType, block.mappedName,
+                                         &(programInterfaceInfo->currentShaderResourceBindingIndex),
+                                         true, false,
+                                         programInterfaceInfo->shaderResourceDescriptorSetIndex,
+                                         uniformBindingIndexMapOut, variableInfoMapOut);
             }
         }
     }
 }
 
-// TODO: http://anglebug.com/4512: Need to combine descriptor set bindings across
-// shader stages.
 void AssignAtomicCounterBufferBindings(const GlslangSourceOptions &options,
                                        const gl::ProgramExecutable &programExecutable,
                                        const std::vector<gl::AtomicCounterBuffer> &buffers,
                                        const gl::ShaderType shaderType,
                                        GlslangProgramInterfaceInfo *programInterfaceInfo,
+                                       UniformBindingIndexMap *uniformBindingIndexMapOut,
                                        ShaderInterfaceVariableInfoMap *variableInfoMapOut)
 {
     if (buffers.size() == 0)
@@ -768,21 +814,20 @@
 
     if (programExecutable.hasLinkedShaderStage(shaderType))
     {
-        AddResourceInfo(variableInfoMapOut, shaderType, sh::vk::kAtomicCountersBlockName,
-                        programInterfaceInfo->shaderResourceDescriptorSetIndex,
-                        programInterfaceInfo->currentShaderResourceBindingIndex);
-        ++programInterfaceInfo->currentShaderResourceBindingIndex;
+        AddAndUpdateResourceMaps(shaderType, sh::vk::kAtomicCountersBlockName,
+                                 &(programInterfaceInfo->currentShaderResourceBindingIndex), true,
+                                 false, programInterfaceInfo->shaderResourceDescriptorSetIndex,
+                                 uniformBindingIndexMapOut, variableInfoMapOut);
     }
 }
 
-// TODO: http://anglebug.com/4512: Need to combine descriptor set bindings across
-// shader stages.
 void AssignImageBindings(const GlslangSourceOptions &options,
                          const gl::ProgramExecutable &programExecutable,
                          const std::vector<gl::LinkedUniform> &uniforms,
                          const gl::RangeUI &imageUniformRange,
                          const gl::ShaderType shaderType,
                          GlslangProgramInterfaceInfo *programInterfaceInfo,
+                         UniformBindingIndexMap *uniformBindingIndexMapOut,
                          ShaderInterfaceVariableInfoMap *variableInfoMapOut)
 {
     for (unsigned int uniformIndex : imageUniformRange)
@@ -794,10 +839,18 @@
         {
             if (programExecutable.hasLinkedShaderStage(shaderType))
             {
-                AddResourceInfo(variableInfoMapOut, shaderType, name,
-                                programInterfaceInfo->shaderResourceDescriptorSetIndex,
-                                programInterfaceInfo->currentShaderResourceBindingIndex);
-                ++programInterfaceInfo->currentShaderResourceBindingIndex;
+                bool updateFrontShaderType = false;
+                if ((*uniformBindingIndexMapOut).count(name) > 0)
+                {
+                    UniformBindingInfo &uniformBindingInfo = (*uniformBindingIndexMapOut)[name];
+                    updateFrontShaderType =
+                        !imageUniform.isActive(uniformBindingInfo.frontShaderType);
+                }
+                AddAndUpdateResourceMaps(shaderType, name,
+                                         &(programInterfaceInfo->currentShaderResourceBindingIndex),
+                                         true, updateFrontShaderType,
+                                         programInterfaceInfo->shaderResourceDescriptorSetIndex,
+                                         uniformBindingIndexMapOut, variableInfoMapOut);
             }
         }
     }
@@ -807,38 +860,42 @@
                               const gl::ProgramExecutable &programExecutable,
                               const gl::ShaderType shaderType,
                               GlslangProgramInterfaceInfo *programInterfaceInfo,
+                              UniformBindingIndexMap *uniformBindingIndexMapOut,
                               ShaderInterfaceVariableInfoMap *variableInfoMapOut)
 {
     const std::vector<gl::LinkedUniform> &uniforms = programExecutable.getUniforms();
     const gl::RangeUI &inputAttachmentUniformRange = programExecutable.getFragmentInoutRange();
     AssignInputAttachmentBindings(options, programExecutable, uniforms, inputAttachmentUniformRange,
-                                  shaderType, programInterfaceInfo, variableInfoMapOut);
+                                  shaderType, programInterfaceInfo, uniformBindingIndexMapOut,
+                                  variableInfoMapOut);
 
     const std::vector<gl::InterfaceBlock> &uniformBlocks = programExecutable.getUniformBlocks();
     AssignInterfaceBlockBindings(options, programExecutable, uniformBlocks, shaderType,
-                                 programInterfaceInfo, variableInfoMapOut);
+                                 programInterfaceInfo, uniformBindingIndexMapOut,
+                                 variableInfoMapOut);
 
     const std::vector<gl::InterfaceBlock> &storageBlocks =
         programExecutable.getShaderStorageBlocks();
     AssignInterfaceBlockBindings(options, programExecutable, storageBlocks, shaderType,
-                                 programInterfaceInfo, variableInfoMapOut);
+                                 programInterfaceInfo, uniformBindingIndexMapOut,
+                                 variableInfoMapOut);
 
     const std::vector<gl::AtomicCounterBuffer> &atomicCounterBuffers =
         programExecutable.getAtomicCounterBuffers();
     AssignAtomicCounterBufferBindings(options, programExecutable, atomicCounterBuffers, shaderType,
-                                      programInterfaceInfo, variableInfoMapOut);
+                                      programInterfaceInfo, uniformBindingIndexMapOut,
+                                      variableInfoMapOut);
 
     const gl::RangeUI &imageUniformRange = programExecutable.getImageUniformRange();
     AssignImageBindings(options, programExecutable, uniforms, imageUniformRange, shaderType,
-                        programInterfaceInfo, variableInfoMapOut);
+                        programInterfaceInfo, uniformBindingIndexMapOut, variableInfoMapOut);
 }
 
-// TODO: http://anglebug.com/4512: Need to combine descriptor set bindings across
-// shader stages.
 void AssignTextureBindings(const GlslangSourceOptions &options,
                            const gl::ProgramExecutable &programExecutable,
                            const gl::ShaderType shaderType,
                            GlslangProgramInterfaceInfo *programInterfaceInfo,
+                           UniformBindingIndexMap *uniformBindingIndexMapOut,
                            ShaderInterfaceVariableInfoMap *variableInfoMapOut)
 {
     // Assign textures to a descriptor set and binding.
@@ -862,10 +919,10 @@
             if (programExecutable.hasLinkedShaderStage(shaderType) &&
                 samplerUniform.isActive(shaderType))
             {
-                AddResourceInfo(variableInfoMapOut, shaderType, samplerName,
-                                programInterfaceInfo->textureDescriptorSetIndex,
-                                programInterfaceInfo->currentTextureBindingIndex);
-                ++programInterfaceInfo->currentTextureBindingIndex;
+                AddAndUpdateResourceMaps(shaderType, samplerName,
+                                         &(programInterfaceInfo->currentTextureBindingIndex), true,
+                                         false, programInterfaceInfo->textureDescriptorSetIndex,
+                                         uniformBindingIndexMapOut, variableInfoMapOut);
             }
         }
     }
@@ -894,17 +951,6 @@
     spirv::IdRef getNewId();
 
   protected:
-    // SPIR-V 1.0 Table 1: First Words of Physical Layout
-    enum HeaderIndex
-    {
-        kHeaderIndexMagic        = 0,
-        kHeaderIndexVersion      = 1,
-        kHeaderIndexGenerator    = 2,
-        kHeaderIndexIndexBound   = 3,
-        kHeaderIndexSchema       = 4,
-        kHeaderIndexInstructions = 5,
-    };
-
     // Common utilities
     void onTransformBegin();
     const uint32_t *getCurrentInstruction(spv::Op *opCodeOut, uint32_t *wordCountOut) const;
@@ -933,10 +979,10 @@
 void SpirvTransformerBase::onTransformBegin()
 {
     // Glslang succeeded in outputting SPIR-V, so we assume it's valid.
-    ASSERT(mSpirvBlobIn.size() >= kHeaderIndexInstructions);
+    ASSERT(mSpirvBlobIn.size() >= spirv::kHeaderIndexInstructions);
     // Since SPIR-V comes from a local call to glslang, it necessarily has the same endianness as
     // the running architecture, so no byte-swapping is necessary.
-    ASSERT(mSpirvBlobIn[kHeaderIndexMagic] == spv::MagicNumber);
+    ASSERT(mSpirvBlobIn[spirv::kHeaderIndexMagic] == spv::MagicNumber);
 
     // Make sure the transformer is not reused to avoid having to reinitialize it here.
     ASSERT(mCurrentWord == 0);
@@ -947,9 +993,10 @@
 
     // Copy the header to SPIR-V blob, we need that to be defined for SpirvTransformerBase::getNewId
     // to work.
-    mSpirvBlobOut->assign(mSpirvBlobIn.begin(), mSpirvBlobIn.begin() + kHeaderIndexInstructions);
+    mSpirvBlobOut->assign(mSpirvBlobIn.begin(),
+                          mSpirvBlobIn.begin() + spirv::kHeaderIndexInstructions);
 
-    mCurrentWord = kHeaderIndexInstructions;
+    mCurrentWord = spirv::kHeaderIndexInstructions;
 }
 
 const uint32_t *SpirvTransformerBase::getCurrentInstruction(spv::Op *opCodeOut,
@@ -973,7 +1020,7 @@
 
 spirv::IdRef SpirvTransformerBase::GetNewId(spirv::Blob *blob)
 {
-    return spirv::IdRef((*blob)[kHeaderIndexIndexBound]++);
+    return spirv::IdRef((*blob)[spirv::kHeaderIndexIndexBound]++);
 }
 
 spirv::IdRef SpirvTransformerBase::getNewId()
@@ -1405,8 +1452,10 @@
     //
     // - OpMemberDecorate %gl_PerVertex N BuiltIn B
     // - OpMemberDecorate %gl_PerVertex N Invariant
+    // - OpMemberDecorate %gl_PerVertex N RelaxedPrecision
     if (!ids.isPerVertex(typeId) ||
-        (decoration != spv::DecorationBuiltIn && decoration != spv::DecorationInvariant))
+        (decoration != spv::DecorationBuiltIn && decoration != spv::DecorationInvariant &&
+         decoration != spv::DecorationRelaxedPrecision))
     {
         return TransformationState::Unchanged;
     }
@@ -2902,7 +2951,7 @@
 
 void SpirvTransformer::resolveVariableIds()
 {
-    const size_t indexBound = mSpirvBlobIn[kHeaderIndexIndexBound];
+    const size_t indexBound = mSpirvBlobIn[spirv::kHeaderIndexIndexBound];
 
     mIds.init(indexBound);
     mInactiveVaryingRemover.init(indexBound);
@@ -2913,7 +2962,7 @@
     // that name in mVariableInfoMap.
     mVariableInfoById.resize(indexBound, nullptr);
 
-    size_t currentWord = kHeaderIndexInstructions;
+    size_t currentWord = spirv::kHeaderIndexInstructions;
 
     while (currentWord < mSpirvBlobIn.size())
     {
@@ -3780,7 +3829,7 @@
 
 void SpirvVertexAttributeAliasingTransformer::preprocessAliasingAttributes()
 {
-    const uint32_t indexBound = mSpirvBlobIn[kHeaderIndexIndexBound];
+    const uint32_t indexBound = mSpirvBlobIn[spirv::kHeaderIndexIndexBound];
 
     mVariableInfoById.resize(indexBound, nullptr);
     mIsAliasingAttributeById.resize(indexBound, false);
@@ -4623,6 +4672,14 @@
 }
 }  // anonymous namespace
 
+UniformBindingInfo::UniformBindingInfo(uint32_t bindingIndex,
+                                       gl::ShaderBitSet shaderBitSet,
+                                       gl::ShaderType frontShaderType)
+    : bindingIndex(bindingIndex), shaderBitSet(shaderBitSet), frontShaderType(frontShaderType)
+{}
+
+UniformBindingInfo::UniformBindingInfo() {}
+
 // ShaderInterfaceVariableInfo implementation.
 const uint32_t ShaderInterfaceVariableInfo::kInvalid;
 
@@ -4664,6 +4721,13 @@
     return it->second;
 }
 
+void ShaderInterfaceVariableInfoMap::markAsDuplicate(gl::ShaderType shaderType,
+                                                     const std::string &variableName)
+{
+    ASSERT(contains(shaderType, variableName));
+    mData[shaderType][variableName].isDuplicate = true;
+}
+
 ShaderInterfaceVariableInfo &ShaderInterfaceVariableInfoMap::add(gl::ShaderType shaderType,
                                                                  const std::string &variableName)
 {
@@ -4750,6 +4814,7 @@
                             const gl::ShaderType frontShaderType,
                             bool isTransformFeedbackStage,
                             GlslangProgramInterfaceInfo *programInterfaceInfo,
+                            UniformBindingIndexMap *uniformBindingIndexMapOut,
                             ShaderInterfaceVariableInfoMap *variableInfoMapOut)
 {
     const gl::ProgramExecutable &programExecutable = programState.getExecutable();
@@ -4798,9 +4863,9 @@
     AssignUniformBindings(options, programExecutable, shaderType, programInterfaceInfo,
                           variableInfoMapOut);
     AssignTextureBindings(options, programExecutable, shaderType, programInterfaceInfo,
-                          variableInfoMapOut);
+                          uniformBindingIndexMapOut, variableInfoMapOut);
     AssignNonTextureBindings(options, programExecutable, shaderType, programInterfaceInfo,
-                             variableInfoMapOut);
+                             uniformBindingIndexMapOut, variableInfoMapOut);
 
     if (options.supportsTransformFeedbackEmulation &&
         gl::ShaderTypeSupportsTransformFeedback(shaderType))
@@ -4889,14 +4954,14 @@
                                                     programInterfaceInfo, variableInfoMapOut);
         }
     }
-
+    UniformBindingIndexMap uniformBindingIndexMap;
     for (const gl::ShaderType shaderType : programState.getExecutable().getLinkedShaderStages())
     {
         const bool isXfbStage =
             shaderType == xfbStage && !programState.getLinkedTransformFeedbackVaryings().empty();
         GlslangAssignLocations(options, programState, resources.varyingPacking, shaderType,
                                frontShaderType, isXfbStage, programInterfaceInfo,
-                               variableInfoMapOut);
+                               &uniformBindingIndexMap, variableInfoMapOut);
 
         frontShaderType = shaderType;
     }
diff --git a/src/libANGLE/renderer/glslang_wrapper_utils.h b/src/libANGLE/renderer/glslang_wrapper_utils.h
index 9e0b2ff..787193c 100644
--- a/src/libANGLE/renderer/glslang_wrapper_utils.h
+++ b/src/libANGLE/renderer/glslang_wrapper_utils.h
@@ -63,6 +63,19 @@
     bool isTransformFeedbackEmulated          = false;
 };
 
+struct UniformBindingInfo final
+{
+    UniformBindingInfo();
+    UniformBindingInfo(uint32_t bindingIndex,
+                       gl::ShaderBitSet shaderBitSet,
+                       gl::ShaderType frontShaderType);
+    uint32_t bindingIndex          = 0;
+    gl::ShaderBitSet shaderBitSet  = gl::ShaderBitSet();
+    gl::ShaderType frontShaderType = gl::ShaderType::InvalidEnum;
+};
+
+using UniformBindingIndexMap = angle::HashMap<std::string, UniformBindingInfo>;
+
 struct ShaderInterfaceVariableXfbInfo
 {
     static constexpr uint32_t kInvalid = std::numeric_limits<uint32_t>::max();
@@ -119,6 +132,8 @@
     // vertex attribute aliasing transformation only.
     uint8_t attributeComponentCount = 0;
     uint8_t attributeLocationCount  = 0;
+    // Indicate if this variable has been deduplicated.
+    bool isDuplicate = false;
 };
 
 // TODO: http://anglebug.com/4524: Need a different hash key than a string, since that's slow to
@@ -135,6 +150,7 @@
                                            const std::string &variableName) const;
     ShaderInterfaceVariableInfo &get(gl::ShaderType shaderType, const std::string &variableName);
     ShaderInterfaceVariableInfo &add(gl::ShaderType shaderType, const std::string &variableName);
+    void markAsDuplicate(gl::ShaderType shaderType, const std::string &variableName);
     ShaderInterfaceVariableInfo &addOrGet(gl::ShaderType shaderType,
                                           const std::string &variableName);
     size_t variableCount(gl::ShaderType shaderType) const { return mData[shaderType].size(); }
@@ -175,6 +191,7 @@
                             const gl::ShaderType frontShaderType,
                             bool isTransformFeedbackStage,
                             GlslangProgramInterfaceInfo *programInterfaceInfo,
+                            UniformBindingIndexMap *uniformBindingIndexMapOut,
                             ShaderInterfaceVariableInfoMap *variableInfoMapOut);
 
 void GlslangAssignTransformFeedbackLocations(gl::ShaderType shaderType,
diff --git a/src/libANGLE/renderer/metal/BufferMtl.mm b/src/libANGLE/renderer/metal/BufferMtl.mm
index d163652..ffad19e 100644
--- a/src/libANGLE/renderer/metal/BufferMtl.mm
+++ b/src/libANGLE/renderer/metal/BufferMtl.mm
@@ -279,8 +279,6 @@
             UNREACHABLE();
             return angle::Result::Stop;
     }
-
-    return angle::Result::Continue;
 }
 
 void BufferMtl::onDataChanged()
diff --git a/src/libANGLE/renderer/metal/CompilerMtl.h b/src/libANGLE/renderer/metal/CompilerMtl.h
index f98e615..a95d1ec 100644
--- a/src/libANGLE/renderer/metal/CompilerMtl.h
+++ b/src/libANGLE/renderer/metal/CompilerMtl.h
@@ -18,12 +18,13 @@
 class CompilerMtl : public CompilerImpl
 {
   public:
-    CompilerMtl();
+    CompilerMtl(ShShaderOutput translatorOutputType);
     ~CompilerMtl() override;
 
     ShShaderOutput getTranslatorOutputType() const override;
 
-    static bool useDirectToMSLCompiler();
+  private:
+    ShShaderOutput mTranslatorOutputType;
 };
 
 }  // namespace rx
diff --git a/src/libANGLE/renderer/metal/CompilerMtl.mm b/src/libANGLE/renderer/metal/CompilerMtl.mm
index 36f4e23..853c5f5 100644
--- a/src/libANGLE/renderer/metal/CompilerMtl.mm
+++ b/src/libANGLE/renderer/metal/CompilerMtl.mm
@@ -9,35 +9,22 @@
 
 #include "libANGLE/renderer/metal/CompilerMtl.h"
 
+#include <stdio.h>
+
 #include "common/debug.h"
-#include "common/system_utils.h"
 
 namespace rx
 {
 
-CompilerMtl::CompilerMtl() : CompilerImpl() {}
+CompilerMtl::CompilerMtl(ShShaderOutput translatorOutputType)
+    : CompilerImpl(), mTranslatorOutputType(translatorOutputType)
+{}
 
 CompilerMtl::~CompilerMtl() {}
 
 ShShaderOutput CompilerMtl::getTranslatorOutputType() const
 {
-#if ANGLE_ENABLE_METAL_SPIRV
-    if (useDirectToMSLCompiler())
-    {
-        return SH_MSL_METAL_OUTPUT;
-    }
-    else
-    {
-        return SH_SPIRV_METAL_OUTPUT;
-    }
-#else
-    return SH_MSL_METAL_OUTPUT;
-#endif
-}
-
-bool CompilerMtl::useDirectToMSLCompiler()
-{
-    return false;
+    return mTranslatorOutputType;
 }
 
 }  // namespace rx
diff --git a/src/libANGLE/renderer/metal/ContextMtl.h b/src/libANGLE/renderer/metal/ContextMtl.h
index d2a10b0..7f24c6c 100644
--- a/src/libANGLE/renderer/metal/ContextMtl.h
+++ b/src/libANGLE/renderer/metal/ContextMtl.h
@@ -480,7 +480,8 @@
         DIRTY_BIT_MAX = DIRTY_BIT_INVALID,
     };
 
-    // See compiler/translator/TranslatorVulkan.cpp: AddDriverUniformsToShader()
+    // Must keep this in sync with DriverUniformExtended::createUniformFields in:
+    // src/compiler/translator/tree_util/DriverUniform.h
     struct DriverUniforms
     {
         float viewport[4];
@@ -503,6 +504,7 @@
         float halfRenderArea[2];
         float flipXY[2];
         float negFlipXY[2];
+        uint32_t emulatedInstanceID;
         uint32_t coverageMask;
         uint32_t padding;
     };
diff --git a/src/libANGLE/renderer/metal/ContextMtl.mm b/src/libANGLE/renderer/metal/ContextMtl.mm
index 020bc75..722e01e 100644
--- a/src/libANGLE/renderer/metal/ContextMtl.mm
+++ b/src/libANGLE/renderer/metal/ContextMtl.mm
@@ -11,6 +11,7 @@
 
 #include <TargetConditionals.h>
 
+#include "GLSLANG/ShaderLang.h"
 #include "common/debug.h"
 #include "libANGLE/TransformFeedback.h"
 #include "libANGLE/renderer/metal/BufferMtl.h"
@@ -1121,7 +1122,9 @@
 // Shader creation
 CompilerImpl *ContextMtl::createCompiler()
 {
-    return new CompilerMtl();
+    ShShaderOutput outputType =
+        getDisplay()->useDirectToMetalCompiler() ? SH_MSL_METAL_OUTPUT : SH_SPIRV_METAL_OUTPUT;
+    return new CompilerMtl(outputType);
 }
 ShaderImpl *ContextMtl::createShader(const gl::ShaderState &state)
 {
@@ -2177,6 +2180,11 @@
 
     // NOTE(hqle): preRotation & fragRotation are unused.
 
+    // Emulated gl_InstanceID
+    // TODO(anglebug.com/5505): these code paths differ significantly from
+    // Apple's fork; there is no place currently to set the emulatedInstanceID.
+    mDriverUniforms.emulatedInstanceID = 0;
+
     // Sample coverage mask
     uint32_t sampleBitCount = mDrawFramebuffer->getSamples();
     uint32_t coverageSampleBitCount =
diff --git a/src/libANGLE/renderer/metal/DisplayMtl.h b/src/libANGLE/renderer/metal/DisplayMtl.h
index 390dc3e..d3451f0 100644
--- a/src/libANGLE/renderer/metal/DisplayMtl.h
+++ b/src/libANGLE/renderer/metal/DisplayMtl.h
@@ -164,6 +164,9 @@
 #if ANGLE_MTL_EVENT_AVAILABLE
     mtl::AutoObjCObj<MTLSharedEventListener> getOrCreateSharedEventListener();
 #endif
+
+    bool useDirectToMetalCompiler();
+
   protected:
     void generateExtensions(egl::DisplayExtensions *outExtensions) const override;
     void generateCaps(egl::Caps *outCaps) const override;
diff --git a/src/libANGLE/renderer/metal/DisplayMtl.mm b/src/libANGLE/renderer/metal/DisplayMtl.mm
index 991c479..9acc4f8 100644
--- a/src/libANGLE/renderer/metal/DisplayMtl.mm
+++ b/src/libANGLE/renderer/metal/DisplayMtl.mm
@@ -243,7 +243,6 @@
             {
                 NSLog(@"Using Metal Device: %@", [device name]);
                 return device;
-                break;
             }
         }
     }
@@ -299,7 +298,6 @@
     {
         case EGL_IOSURFACE_ANGLE:
             return new IOSurfaceSurfaceMtl(this, state, clientBuffer, attribs);
-            break;
         default:
             UNREACHABLE();
     }
@@ -752,7 +750,7 @@
     mNativeCaps.programBinaryFormats.push_back(GL_PROGRAM_BINARY_ANGLE);
 
     // GL_APPLE_clip_distance
-    mNativeCaps.maxClipDistances = 8;
+    mNativeCaps.maxClipDistances = mFeatures.directMetalGeneration.enabled ? 0 : 8;
 
     // Metal doesn't support GL_TEXTURE_COMPARE_MODE=GL_NONE for shadow samplers
     mNativeLimitations.noShadowSamplerCompareModeNone = true;
@@ -760,6 +758,16 @@
     // Apple platforms require PVRTC1 textures to be squares.
     mNativeLimitations.squarePvrtc1 = true;
 
+    // Older Metal does not support compressed formats for TEXTURE_3D target.
+    if (ANGLE_APPLE_AVAILABLE_XCI(10.15, 13.0, 13.0))
+    {
+        mNativeLimitations.noCompressedTexture3D = !supportsEitherGPUFamily(3, 1);
+    }
+    else
+    {
+        mNativeLimitations.noCompressedTexture3D = true;
+    }
+
     // Direct-to-metal constants:
     mNativeCaps.driverUniformsBindingIndex    = mtl::kDriverUniformsBindingIndex;
     mNativeCaps.defaultUniformsBindingIndex   = mtl::kDefaultUniformsBindingIndex;
@@ -781,6 +789,7 @@
     mNativeExtensions.drawBuffersIndexedOES  = true;
     mNativeExtensions.fragDepth              = true;
     mNativeExtensions.framebufferBlitANGLE   = true;
+    mNativeExtensions.framebufferBlitNV      = true;
     mNativeExtensions.framebufferMultisample = true;
     mNativeExtensions.copyTexture            = true;
     mNativeExtensions.copyCompressedTexture  = false;
@@ -848,7 +857,7 @@
     mNativeExtensions.getProgramBinaryOES = true;
 
     // GL_APPLE_clip_distance
-    mNativeExtensions.clipDistanceAPPLE = true;
+    mNativeExtensions.clipDistanceAPPLE = !mFeatures.directMetalGeneration.enabled;
 
     // GL_NV_pixel_buffer_object
     mNativeExtensions.pixelBufferObjectNV = true;
@@ -980,10 +989,20 @@
 
     ANGLE_FEATURE_CONDITION((&mFeatures), forceNonCSBaseMipmapGeneration, isIntel());
 
+    bool defaultDirectToMetal = true;
+#if ANGLE_ENABLE_METAL_SPIRV
+    defaultDirectToMetal = false;
+#endif
+    ANGLE_FEATURE_CONDITION((&mFeatures), directMetalGeneration, defaultDirectToMetal);
+
     angle::PlatformMethods *platform = ANGLEPlatformCurrent();
     platform->overrideFeaturesMtl(platform, &mFeatures);
 
     ApplyFeatureOverrides(&mFeatures, getState());
+#ifdef ANGLE_ENABLE_ASSERTS
+    fprintf(stderr, "Shader compiler output: %s\n",
+            mFeatures.directMetalGeneration.enabled ? "Metal" : "SPIR-V");
+#endif
 }
 
 angle::Result DisplayMtl::initializeShaderLibrary()
@@ -1115,7 +1134,9 @@
 
     // If device doesn't support [MTLDevice supportsFamily:], then use
     // [MTLDevice supportsFeatureSet:].
+#    if TARGET_OS_IOS || TARGET_OS_TV
     MTLFeatureSet featureSet;
+#    endif
     switch (iOSFamily)
     {
 #    if TARGET_OS_IOS
@@ -1149,8 +1170,10 @@
             return false;
     }
 
+#    if TARGET_OS_IOS || TARGET_OS_TV
     return [getMetalDevice() supportsFeatureSet:featureSet];
-#endif      // TARGET_OS_IOS || TARGET_OS_TV
+#    endif
+#endif  // TARGET_OS_MACCATALYST
 }
 
 bool DisplayMtl::supportsMacGPUFamily(uint8_t macFamily) const
@@ -1250,4 +1273,9 @@
 }
 #endif
 
+bool DisplayMtl::useDirectToMetalCompiler()
+{
+    return mFeatures.directMetalGeneration.enabled;
+}
+
 }  // namespace rx
diff --git a/src/libANGLE/renderer/metal/ImageMtl.h b/src/libANGLE/renderer/metal/ImageMtl.h
index 5d61518..7772966 100644
--- a/src/libANGLE/renderer/metal/ImageMtl.h
+++ b/src/libANGLE/renderer/metal/ImageMtl.h
@@ -37,6 +37,7 @@
     size_t getSamples() const override;
 
     bool isYUV() const override;
+    bool hasProtectedContent() const override;
 
     const mtl::TextureRef &getTexture() const { return mNativeTexture; }
     const mtl::Format &getFormatMtl() const { return mFormat; }
diff --git a/src/libANGLE/renderer/metal/ImageMtl.mm b/src/libANGLE/renderer/metal/ImageMtl.mm
index 73738d5..2090ac7 100644
--- a/src/libANGLE/renderer/metal/ImageMtl.mm
+++ b/src/libANGLE/renderer/metal/ImageMtl.mm
@@ -118,6 +118,11 @@
     return false;
 }
 
+bool TextureImageSiblingMtl::hasProtectedContent() const
+{
+    return false;
+}
+
 // ImageMtl implementation
 ImageMtl::ImageMtl(const egl::ImageState &state, const gl::Context *context) : ImageImpl(state) {}
 
diff --git a/src/libANGLE/renderer/metal/ProgramMtl.mm b/src/libANGLE/renderer/metal/ProgramMtl.mm
index 2080247..707a3af 100644
--- a/src/libANGLE/renderer/metal/ProgramMtl.mm
+++ b/src/libANGLE/renderer/metal/ProgramMtl.mm
@@ -444,7 +444,8 @@
                                    gl::InfoLog &infoLog)
 {
 #if ANGLE_ENABLE_METAL_SPIRV
-    if (CompilerMtl::useDirectToMSLCompiler())
+    ContextMtl *contextMtl = mtl::GetImpl(glContext);
+    if (contextMtl->getDisplay()->useDirectToMetalCompiler())
     {
         return linkImplDirect(glContext, resources, infoLog);
     }
@@ -595,7 +596,7 @@
 {
     static_assert(YES == 1, "YES should have value of 1");
 #if ANGLE_ENABLE_METAL_SPIRV
-    static const bool useSpirv = !CompilerMtl::useDirectToMSLCompiler();
+    static const bool useSpirv = !context->getDisplay()->useDirectToMetalCompiler();
 #endif
 
     mtl::TranslatedShaderInfo *translatedMslInfo = &mMslShaderTranslateInfo[shaderType];
diff --git a/src/libANGLE/renderer/metal/QueryMtl.mm b/src/libANGLE/renderer/metal/QueryMtl.mm
index 68bddf9..17fe825 100644
--- a/src/libANGLE/renderer/metal/QueryMtl.mm
+++ b/src/libANGLE/renderer/metal/QueryMtl.mm
@@ -71,7 +71,6 @@
         case gl::QueryType::TransformFeedbackPrimitivesWritten:
             onTransformFeedbackEnd(context);
             break;
-            break;
         default:
             UNIMPLEMENTED();
             break;
diff --git a/src/libANGLE/renderer/metal/mtl_glslang_mtl_utils.mm b/src/libANGLE/renderer/metal/mtl_glslang_mtl_utils.mm
index 230fab9..e3c3a29 100644
--- a/src/libANGLE/renderer/metal/mtl_glslang_mtl_utils.mm
+++ b/src/libANGLE/renderer/metal/mtl_glslang_mtl_utils.mm
@@ -172,7 +172,7 @@
             for (int i = 0; i < regs; i++)
             {
                 stream.str("");
-                stream << attribute.name << "_" << std::to_string(i)
+                stream << " " << attribute.name << "_" << std::to_string(i)
                        << sh::kUnassignedAttributeString;
                 attributeBindings.insert({std::string(stream.str()), i + attribute.location});
             }
@@ -180,7 +180,7 @@
         else
         {
             stream.str("");
-            stream << attribute.name << sh::kUnassignedAttributeString;
+            stream << " " << attribute.name << sh::kUnassignedAttributeString;
             attributeBindings.insert({std::string(stream.str()), attribute.location});
         }
     }
diff --git a/src/libANGLE/renderer/metal/mtl_glslang_utils.mm b/src/libANGLE/renderer/metal/mtl_glslang_utils.mm
index 3a37cd4..a11ce9b 100644
--- a/src/libANGLE/renderer/metal/mtl_glslang_utils.mm
+++ b/src/libANGLE/renderer/metal/mtl_glslang_utils.mm
@@ -399,10 +399,11 @@
         ResetGlslangProgramInterfaceInfo(&xfbOnlyInterfaceInfo);
 
         options.enableTransformFeedbackEmulation = true;
-
+        UniformBindingIndexMap uniformBindingIndexMap;
         GlslangAssignLocations(options, programState, resources.varyingPacking,
                                gl::ShaderType::Vertex, gl::ShaderType::InvalidEnum, true,
-                               &xfbOnlyInterfaceInfo, xfbOnlyVSVariableInfoMapOut);
+                               &xfbOnlyInterfaceInfo, &uniformBindingIndexMap,
+                               xfbOnlyVSVariableInfoMapOut);
     }
 }
 
diff --git a/src/libANGLE/renderer/vulkan/ContextVk.cpp b/src/libANGLE/renderer/vulkan/ContextVk.cpp
index 68eabf9..b779d3a 100644
--- a/src/libANGLE/renderer/vulkan/ContextVk.cpp
+++ b/src/libANGLE/renderer/vulkan/ContextVk.cpp
@@ -4261,6 +4261,11 @@
         return angle::Result::Continue;
     }
 
+    // Always consider the render pass finished.  FramebufferVk::syncState (caller of this function)
+    // normally closes the render pass, except for blit to allow an optimization.  The following
+    // code nevertheless must treat the render pass closed.
+    onRenderPassFinished();
+
     // Ensure that the pipeline description is updated.
     if (mGraphicsPipelineDesc->getRasterizationSamples() !=
         static_cast<uint32_t>(framebufferVk->getSamples()))
@@ -5081,6 +5086,17 @@
             ANGLE_TRY(textureVk->ensureMutable(this));
         }
 
+        if (textureVk->getImage().hasEmulatedImageFormat())
+        {
+            char stringBuffer[100];
+            snprintf(
+                stringBuffer, sizeof(stringBuffer),
+                "The Vulkan driver does not support texture format 0x%04X, emulating with 0x%04X",
+                textureVk->getImage().getIntendedFormat().glInternalFormat,
+                textureVk->getImage().getActualFormat().glInternalFormat);
+            ANGLE_PERF_WARNING(getDebug(), GL_DEBUG_SEVERITY_LOW, stringBuffer);
+        }
+
         vk::ImageOrBufferViewSubresourceSerial imageViewSerial =
             textureVk->getImageViewSubresourceSerial(samplerState);
         mActiveTexturesDesc.update(textureUnit, imageViewSerial, samplerHelper.getSamplerSerial());
@@ -5088,7 +5104,7 @@
         if (textureVk->getImage().hasImmutableSampler())
         {
             uint64_t externalFormat = textureVk->getImage().getExternalFormat();
-            VkFormat vkFormat       = textureVk->getImage().getFormat().actualImageVkFormat();
+            VkFormat vkFormat       = textureVk->getImage().getActualVkFormat();
             if (externalFormat != 0)
             {
                 externalFormatIndexMap[externalFormat] = static_cast<uint32_t>(textureUnit);
diff --git a/src/libANGLE/renderer/vulkan/DisplayVk.cpp b/src/libANGLE/renderer/vulkan/DisplayVk.cpp
index 6e530b3..c252993 100644
--- a/src/libANGLE/renderer/vulkan/DisplayVk.cpp
+++ b/src/libANGLE/renderer/vulkan/DisplayVk.cpp
@@ -249,6 +249,8 @@
     outExtensions->protectedContentEXT =
         (getRenderer()->getFeatures().supportsProtectedMemory.enabled &&
          getRenderer()->getFeatures().supportsSurfaceProtectedSwapchains.enabled);
+
+    outExtensions->createSurfaceSwapIntervalANGLE = true;
 }
 
 void DisplayVk::generateCaps(egl::Caps *outCaps) const
diff --git a/src/libANGLE/renderer/vulkan/FramebufferVk.cpp b/src/libANGLE/renderer/vulkan/FramebufferVk.cpp
index 7d088be..b746bc5 100644
--- a/src/libANGLE/renderer/vulkan/FramebufferVk.cpp
+++ b/src/libANGLE/renderer/vulkan/FramebufferVk.cpp
@@ -50,14 +50,14 @@
 
 bool HasSrcBlitFeature(RendererVk *renderer, RenderTargetVk *srcRenderTarget)
 {
-    angle::FormatID srcFormat = srcRenderTarget->getImageFormat().actualImageFormatID;
-    return renderer->hasImageFormatFeatureBits(srcFormat, VK_FORMAT_FEATURE_BLIT_SRC_BIT);
+    angle::FormatID srcFormatID = srcRenderTarget->getImageActualFormatID();
+    return renderer->hasImageFormatFeatureBits(srcFormatID, VK_FORMAT_FEATURE_BLIT_SRC_BIT);
 }
 
 bool HasDstBlitFeature(RendererVk *renderer, RenderTargetVk *dstRenderTarget)
 {
-    angle::FormatID dstFormat = dstRenderTarget->getImageFormat().actualImageFormatID;
-    return renderer->hasImageFormatFeatureBits(dstFormat, VK_FORMAT_FEATURE_BLIT_DST_BIT);
+    angle::FormatID dstFormatID = dstRenderTarget->getImageActualFormatID();
+    return renderer->hasImageFormatFeatureBits(dstFormatID, VK_FORMAT_FEATURE_BLIT_DST_BIT);
 }
 
 // Returns false if destination has any channel the source doesn't.  This means that channel was
@@ -65,8 +65,8 @@
 bool AreSrcAndDstColorChannelsBlitCompatible(RenderTargetVk *srcRenderTarget,
                                              RenderTargetVk *dstRenderTarget)
 {
-    const angle::Format &srcFormat = srcRenderTarget->getImageFormat().intendedFormat();
-    const angle::Format &dstFormat = dstRenderTarget->getImageFormat().intendedFormat();
+    const angle::Format &srcFormat = srcRenderTarget->getImageIntendedFormat();
+    const angle::Format &dstFormat = dstRenderTarget->getImageIntendedFormat();
 
     // Luminance/alpha formats are not renderable, so they can't have ended up in a framebuffer to
     // participate in a blit.
@@ -85,17 +85,17 @@
 // the same for depth/stencil formats.
 bool AreSrcAndDstFormatsIdentical(RenderTargetVk *srcRenderTarget, RenderTargetVk *dstRenderTarget)
 {
-    const vk::Format &srcFormat = srcRenderTarget->getImageFormat();
-    const vk::Format &dstFormat = dstRenderTarget->getImageFormat();
+    angle::FormatID srcFormatID = srcRenderTarget->getImageActualFormatID();
+    angle::FormatID dstFormatID = dstRenderTarget->getImageActualFormatID();
 
-    return srcFormat.actualImageFormatID == dstFormat.actualImageFormatID;
+    return srcFormatID == dstFormatID;
 }
 
 bool AreSrcAndDstDepthStencilChannelsBlitCompatible(RenderTargetVk *srcRenderTarget,
                                                     RenderTargetVk *dstRenderTarget)
 {
-    const angle::Format &srcFormat = srcRenderTarget->getImageFormat().intendedFormat();
-    const angle::Format &dstFormat = dstRenderTarget->getImageFormat().intendedFormat();
+    const angle::Format &srcFormat = srcRenderTarget->getImageIntendedFormat();
+    const angle::Format &dstFormat = dstRenderTarget->getImageIntendedFormat();
 
     return (dstFormat.depthBits > 0 || srcFormat.depthBits == 0) &&
            (dstFormat.stencilBits > 0 || srcFormat.stencilBits == 0);
@@ -712,7 +712,7 @@
     ContextVk *contextVk       = vk::GetImpl(context);
     GLenum sizedFormat         = mState.getReadAttachment()->getFormat().info->sizedInternalFormat;
     const vk::Format &vkFormat = contextVk->getRenderer()->getFormat(sizedFormat);
-    GLenum implFormat          = vkFormat.actualImageFormat().fboImplementationInternalFormat;
+    GLenum implFormat = vkFormat.getActualRenderableImageFormat().fboImplementationInternalFormat;
     return gl::GetSizedInternalFormatInfo(implFormat);
 }
 
@@ -1653,11 +1653,11 @@
     RenderTargetVk *renderTarget = mRenderTargetCache.getColors()[colorIndexGL];
     if (renderTarget)
     {
-        const angle::Format &actualFormat = renderTarget->getImageFormat().actualImageFormat();
+        const angle::Format &actualFormat = renderTarget->getImageActualFormat();
         updateActiveColorMasks(colorIndexGL, actualFormat.redBits > 0, actualFormat.greenBits > 0,
                                actualFormat.blueBits > 0, actualFormat.alphaBits > 0);
 
-        const angle::Format &intendedFormat = renderTarget->getImageFormat().intendedFormat();
+        const angle::Format &intendedFormat = renderTarget->getImageIntendedFormat();
         mEmulatedAlphaAttachmentMask.set(
             colorIndexGL, intendedFormat.alphaBits == 0 && actualFormat.alphaBits > 0);
 
@@ -1735,22 +1735,45 @@
                                                          bool deferClears,
                                                          uint32_t colorIndexGL)
 {
-    ContextVk *contextVk = vk::GetImpl(context);
+    ContextVk *contextVk             = vk::GetImpl(context);
+    RenderTargetVk *readRenderTarget = nullptr;
+    RenderTargetVk *drawRenderTarget = nullptr;
 
-    RenderTargetVk *renderTarget = mRenderTargetCache.getColors()[colorIndexGL];
-    if (renderTarget == nullptr)
+    // It's possible for the read and draw color attachments to be different if different surfaces
+    // are bound, so we need to flush any staged updates to both.
+
+    // Draw
+    drawRenderTarget = mRenderTargetCache.getColorDraw(mState, colorIndexGL);
+    if (drawRenderTarget)
     {
-        return angle::Result::Continue;
+        if (deferClears && mState.getEnabledDrawBuffers().test(colorIndexGL))
+        {
+            ANGLE_TRY(
+                drawRenderTarget->flushStagedUpdates(contextVk, &mDeferredClears, colorIndexGL,
+                                                     mCurrentFramebufferDesc.getLayerCount()));
+        }
+        else
+        {
+            ANGLE_TRY(drawRenderTarget->flushStagedUpdates(
+                contextVk, nullptr, 0, mCurrentFramebufferDesc.getLayerCount()));
+        }
     }
 
-    if (deferClears && mState.getEnabledDrawBuffers().test(colorIndexGL))
+    // Read
+    if (mState.getReadBufferState() != GL_NONE && mState.getReadIndex() == colorIndexGL)
     {
-        return renderTarget->flushStagedUpdates(contextVk, &mDeferredClears, colorIndexGL,
-                                                mCurrentFramebufferDesc.getLayerCount());
+        // Flush staged updates to the read render target as well, but only if it's not the same as
+        // the draw render target.  This can happen when the read render target is bound to another
+        // surface.
+        readRenderTarget = mRenderTargetCache.getColorRead(mState);
+        if (readRenderTarget && readRenderTarget != drawRenderTarget)
+        {
+            ANGLE_TRY(readRenderTarget->flushStagedUpdates(
+                contextVk, nullptr, 0, mCurrentFramebufferDesc.getLayerCount()));
+        }
     }
 
-    return renderTarget->flushStagedUpdates(contextVk, nullptr, 0,
-                                            mCurrentFramebufferDesc.getLayerCount());
+    return angle::Result::Continue;
 }
 
 angle::Result FramebufferVk::flushDepthStencilAttachmentUpdates(const gl::Context *context,
@@ -1860,14 +1883,10 @@
     if (shouldUpdateSrgbWriteControlMode)
     {
         // Framebuffer colorspace state has been modified, so refresh the current framebuffer
-        // descriptor to reflect the new state, and notify the context of the state change.
+        // descriptor to reflect the new state.
         gl::SrgbWriteControlMode newSrgbWriteControlMode = mState.getWriteControlMode();
         mCurrentFramebufferDesc.setWriteControlMode(newSrgbWriteControlMode);
         mRenderPassDesc.setWriteControlMode(newSrgbWriteControlMode);
-        mFramebuffer = nullptr;
-
-        angle::Result result = contextVk->onFramebufferChange(this);
-        ANGLE_UNUSED_VARIABLE(result);
     }
 
     if (shouldUpdateColorMask)
@@ -1943,8 +1962,7 @@
             RenderTargetVk *colorRenderTarget = colorRenderTargets[colorIndexGL];
             ASSERT(colorRenderTarget);
             mRenderPassDesc.packColorAttachment(
-                colorIndexGL,
-                colorRenderTarget->getImageForRenderPass().getFormat().intendedFormatID);
+                colorIndexGL, colorRenderTarget->getImageForRenderPass().getActualFormatID());
 
             // Add the resolve attachment, if any.
             if (colorRenderTarget->hasResolveAttachment())
@@ -1963,7 +1981,7 @@
     if (depthStencilRenderTarget)
     {
         mRenderPassDesc.packDepthStencilAttachment(
-            depthStencilRenderTarget->getImageForRenderPass().getFormat().intendedFormatID);
+            depthStencilRenderTarget->getImageForRenderPass().getActualFormatID());
 
         // Add the resolve attachment, if any.
         if (depthStencilRenderTarget->hasResolveAttachment())
@@ -2204,8 +2222,7 @@
         const RenderTargetVk *colorRenderTarget = colorRenderTargets[colorIndexGL];
         ASSERT(colorRenderTarget);
 
-        params.colorFormat =
-            &colorRenderTarget->getImageForRenderPass().getFormat().actualImageFormat();
+        params.colorFormat = &colorRenderTarget->getImageForRenderPass().getActualFormat();
         params.colorAttachmentIndexGL = static_cast<uint32_t>(colorIndexGL);
         params.colorMaskFlags =
             gl::BlendStateExt::ColorMaskStorage::GetValueIndexed(colorIndexGL, colorMasks);
@@ -2251,17 +2268,15 @@
     // If the render target doesn't have alpha, but its emulated format has it, clear the alpha
     // to 1.
     RenderTargetVk *renderTarget = getColorDrawRenderTarget(colorIndexGL);
-    const vk::Format &format     = renderTarget->getImageFormat();
-    if (format.vkFormatIsInt)
+    const angle::Format &format  = renderTarget->getImageActualFormat();
+
+    if (format.isUint())
     {
-        if (format.vkFormatIsUnsigned)
-        {
-            clearValue.color.uint32[3] = kEmulatedAlphaValue;
-        }
-        else
-        {
-            clearValue.color.int32[3] = kEmulatedAlphaValue;
-        }
+        clearValue.color.uint32[3] = kEmulatedAlphaValue;
+    }
+    else if (format.isSint())
+    {
+        clearValue.color.int32[3] = kEmulatedAlphaValue;
     }
     else
     {
@@ -2562,15 +2577,15 @@
                                     kUninitializedClearValue);
         }
 
-        const vk::Format &format = depthStencilRenderTarget->getImageFormat();
+        const angle::Format &format = depthStencilRenderTarget->getImageIntendedFormat();
         // If the format we picked has stencil but user did not ask for it due to hardware
         // limitations, use DONT_CARE for load/store. The same logic for depth follows.
-        if (format.intendedFormat().stencilBits == 0)
+        if (format.stencilBits == 0)
         {
             stencilLoadOp  = VK_ATTACHMENT_LOAD_OP_DONT_CARE;
             stencilStoreOp = vk::RenderPassStoreOp::DontCare;
         }
-        if (format.intendedFormat().depthBits == 0)
+        if (format.depthBits == 0)
         {
             depthLoadOp  = VK_ATTACHMENT_LOAD_OP_DONT_CARE;
             depthStoreOp = vk::RenderPassStoreOp::DontCare;
diff --git a/src/libANGLE/renderer/vulkan/ImageVk.cpp b/src/libANGLE/renderer/vulkan/ImageVk.cpp
index 9334489..74df824 100644
--- a/src/libANGLE/renderer/vulkan/ImageVk.cpp
+++ b/src/libANGLE/renderer/vulkan/ImageVk.cpp
@@ -59,11 +59,14 @@
 {
     if (egl::IsTextureTarget(mState.target))
     {
-        TextureVk *textureVk = GetImplAs<TextureVk>(GetAs<gl::Texture>(mState.source));
-
-        // Make sure the texture has created its backing storage
         ASSERT(mContext != nullptr);
         ContextVk *contextVk = vk::GetImpl(mContext);
+        TextureVk *textureVk = GetImplAs<TextureVk>(GetAs<gl::Texture>(mState.source));
+
+        // Make sure the texture uses renderable format
+        ANGLE_TRY(ResultToEGL(textureVk->ensureRenderable(contextVk)));
+
+        // Make sure the texture has created its backing storage
         ANGLE_TRY(ResultToEGL(
             textureVk->ensureImageInitialized(contextVk, ImageMipLevels::EnabledLevels)));
 
@@ -106,7 +109,8 @@
 
         // start with some reasonable alignment that's safe for the case where intendedFormatID is
         // FormatID::NONE
-        size_t alignment = mImage->getFormat().getValidImageCopyBufferAlignment();
+        size_t alignment = vk::GetValidImageCopyBufferAlignment(mImage->getIntendedFormatID(),
+                                                                mImage->getActualFormatID());
 
         // Make sure a staging buffer is ready to use to upload data
         mImage->initStagingBuffer(renderer, alignment, vk::kStagingBufferFlags,
diff --git a/src/libANGLE/renderer/vulkan/MemoryObjectVk.cpp b/src/libANGLE/renderer/vulkan/MemoryObjectVk.cpp
index b4ccca9..001ebcd 100644
--- a/src/libANGLE/renderer/vulkan/MemoryObjectVk.cpp
+++ b/src/libANGLE/renderer/vulkan/MemoryObjectVk.cpp
@@ -101,6 +101,12 @@
     return angle::Result::Continue;
 }
 
+angle::Result MemoryObjectVk::setProtectedMemory(const gl::Context *context, bool protectedMemory)
+{
+    mProtectedMemory = protectedMemory;
+    return angle::Result::Continue;
+}
+
 angle::Result MemoryObjectVk::importFd(gl::Context *context,
                                        GLuint64 size,
                                        gl::HandleType handleType,
@@ -171,14 +177,15 @@
 {
     RendererVk *renderer = contextVk->getRenderer();
 
-    const vk::Format &vkFormat = renderer->getFormat(internalFormat);
+    const vk::Format &vkFormat     = renderer->getFormat(internalFormat);
+    angle::FormatID actualFormatID = vkFormat.getActualRenderableImageFormatID();
 
     // EXT_external_objects issue 13 says that all supported usage flags must be specified.
     // However, ANGLE_external_objects_flags allows these flags to be masked.  Note that the GL enum
     // values constituting the bits of |usageFlags| are identical to their corresponding Vulkan
     // value.
     const VkImageUsageFlags imageUsageFlags =
-        vk::GetMaximalImageUsageFlags(renderer, vkFormat.actualImageFormatID) & usageFlags;
+        vk::GetMaximalImageUsageFlags(renderer, actualFormatID) & usageFlags;
 
     VkExternalMemoryImageCreateInfo externalMemoryImageCreateInfo = {};
     externalMemoryImageCreateInfo.sType       = VK_STRUCTURE_TYPE_EXTERNAL_MEMORY_IMAGE_CREATE_INFO;
@@ -204,11 +211,12 @@
     // ANGLE_external_objects_flags allows create flags to be specified by the application instead
     // of getting defaulted to zero.  Note that the GL enum values constituting the bits of
     // |createFlags| are identical to their corresponding Vulkan value.
-    ANGLE_TRY(image->initExternal(contextVk, type, vkExtents, vkFormat, 1, imageUsageFlags,
-                                  createFlags, vk::ImageLayout::Undefined,
-                                  &externalMemoryImageCreateInfo, gl::LevelIndex(0),
-                                  static_cast<uint32_t>(levels), layerCount,
-                                  contextVk->isRobustResourceInitEnabled(), nullptr, false));
+    bool hasProtectedContent = mProtectedMemory;
+    ANGLE_TRY(image->initExternal(
+        contextVk, type, vkExtents, vkFormat.getIntendedFormatID(), actualFormatID, 1,
+        imageUsageFlags, createFlags, vk::ImageLayout::Undefined, &externalMemoryImageCreateInfo,
+        gl::LevelIndex(0), static_cast<uint32_t>(levels), layerCount,
+        contextVk->isRobustResourceInitEnabled(), nullptr, hasProtectedContent));
 
     VkMemoryRequirements externalMemoryRequirements;
     image->getImage().getMemoryRequirements(renderer->getDevice(), &externalMemoryRequirements);
@@ -252,7 +260,7 @@
     ASSERT(offset == 0);
     ASSERT(externalMemoryRequirements.size == mSize);
 
-    VkMemoryPropertyFlags flags = 0;
+    VkMemoryPropertyFlags flags = hasProtectedContent ? VK_MEMORY_PROPERTY_PROTECTED_BIT : 0;
     ANGLE_TRY(image->initExternalMemory(contextVk, renderer->getMemoryProperties(),
                                         externalMemoryRequirements, nullptr, importMemoryInfo,
                                         renderer->getQueueFamilyIndex(), flags));
diff --git a/src/libANGLE/renderer/vulkan/MemoryObjectVk.h b/src/libANGLE/renderer/vulkan/MemoryObjectVk.h
index cf5d65a..d94fbb2 100644
--- a/src/libANGLE/renderer/vulkan/MemoryObjectVk.h
+++ b/src/libANGLE/renderer/vulkan/MemoryObjectVk.h
@@ -24,6 +24,7 @@
     void onDestroy(const gl::Context *context) override;
 
     angle::Result setDedicatedMemory(const gl::Context *context, bool dedicatedMemory) override;
+    angle::Result setProtectedMemory(const gl::Context *context, bool protectedMemory) override;
 
     angle::Result importFd(gl::Context *context,
                            GLuint64 size,
@@ -52,6 +53,7 @@
 
     // Imported memory object was a dedicated allocation.
     bool mDedicatedMemory = false;
+    bool mProtectedMemory = false;
 
     GLuint64 mSize             = 0;
     gl::HandleType mHandleType = gl::HandleType::InvalidEnum;
diff --git a/src/libANGLE/renderer/vulkan/OverlayVk.cpp b/src/libANGLE/renderer/vulkan/OverlayVk.cpp
index 6dbffc3..64465a9 100644
--- a/src/libANGLE/renderer/vulkan/OverlayVk.cpp
+++ b/src/libANGLE/renderer/vulkan/OverlayVk.cpp
@@ -224,7 +224,7 @@
 
     // If the swapchain image doesn't support storage image, we can't output to it.
     VkFormatFeatureFlags featureBits = renderer->getImageFormatFeatureBits(
-        imageToPresent->getFormat().actualImageFormatID, VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT);
+        imageToPresent->getActualFormatID(), VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT);
     if ((featureBits & VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT) == 0)
     {
         return angle::Result::Continue;
diff --git a/src/libANGLE/renderer/vulkan/ProgramExecutableVk.cpp b/src/libANGLE/renderer/vulkan/ProgramExecutableVk.cpp
index c187f54..4425935 100644
--- a/src/libANGLE/renderer/vulkan/ProgramExecutableVk.cpp
+++ b/src/libANGLE/renderer/vulkan/ProgramExecutableVk.cpp
@@ -336,6 +336,7 @@
             info.varyingIsOutput         = stream->readBool();
             info.attributeComponentCount = stream->readInt<uint8_t>();
             info.attributeLocationCount  = stream->readInt<uint8_t>();
+            info.isDuplicate             = stream->readBool();
         }
     }
 
@@ -371,6 +372,7 @@
             stream->writeBool(info.varyingIsOutput);
             stream->writeInt(info.attributeComponentCount);
             stream->writeInt(info.attributeLocationCount);
+            stream->writeBool(info.isDuplicate);
         }
     }
 }
@@ -539,11 +541,17 @@
             continue;
         }
 
-        const std::string blockName             = block.mappedName;
-        const ShaderInterfaceVariableInfo &info = mVariableInfoMap.get(shaderType, blockName);
+        const std::string blockName = block.mappedName;
 
-        descOut->update(info.binding, descType, arraySize, gl_vk::kShaderStageMap[shaderType],
-                        nullptr);
+        const ShaderInterfaceVariableInfo &info = mVariableInfoMap.get(shaderType, blockName);
+        if (info.isDuplicate)
+        {
+            continue;
+        }
+
+        VkShaderStageFlags activeStages = gl_vk::GetShaderStageFlags(info.activeStages);
+
+        descOut->update(info.binding, descType, arraySize, activeStages, nullptr);
     }
 }
 
@@ -558,17 +566,18 @@
     }
 
     std::string blockName(sh::vk::kAtomicCountersBlockName);
-    const ShaderInterfaceVariableInfo &info = mVariableInfoMap.get(shaderType, blockName);
 
-    if (!info.activeStages[shaderType])
+    const ShaderInterfaceVariableInfo &info = mVariableInfoMap.get(shaderType, blockName);
+    if (info.isDuplicate || !info.activeStages[shaderType])
     {
         return;
     }
 
+    VkShaderStageFlags activeStages = gl_vk::GetShaderStageFlags(info.activeStages);
+
     // A single storage buffer array is used for all stages for simplicity.
     descOut->update(info.binding, kStorageBufferDescriptorType,
-                    gl::IMPLEMENTATION_MAX_ATOMIC_COUNTER_BUFFER_BINDINGS,
-                    gl_vk::kShaderStageMap[shaderType], nullptr);
+                    gl::IMPLEMENTATION_MAX_ATOMIC_COUNTER_BUFFER_BINDINGS, activeStages, nullptr);
 }
 
 void ProgramExecutableVk::addImageDescriptorSetDesc(const gl::ProgramExecutable &executable,
@@ -610,7 +619,12 @@
 
             GetImageNameWithoutIndices(&imageName);
             const ShaderInterfaceVariableInfo &info = mVariableInfoMap.get(shaderType, imageName);
-            VkShaderStageFlags activeStages         = gl_vk::kShaderStageMap[shaderType];
+            if (info.isDuplicate)
+            {
+                continue;
+            }
+
+            VkShaderStageFlags activeStages = gl_vk::GetShaderStageFlags(info.activeStages);
 
             const VkDescriptorType descType = imageBinding.textureType == gl::TextureType::Buffer
                                                   ? VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER
@@ -641,7 +655,13 @@
     const gl::LinkedUniform &baseInputAttachment = uniforms.at(baseUniformIndex);
     std::string baseMappedName                   = baseInputAttachment.mappedName;
     ShaderInterfaceVariableInfo &baseInfo        = mVariableInfoMap.get(shaderType, baseMappedName);
-    uint32_t baseBinding                         = baseInfo.binding - baseInputAttachment.location;
+
+    if (baseInfo.isDuplicate)
+    {
+        return;
+    }
+
+    uint32_t baseBinding = baseInfo.binding - baseInputAttachment.location;
 
     for (uint32_t colorIndex = 0; colorIndex < gl::IMPLEMENTATION_MAX_DRAW_BUFFERS; ++colorIndex)
     {
@@ -693,7 +713,12 @@
             }
 
             const ShaderInterfaceVariableInfo &info = mVariableInfoMap.get(shaderType, samplerName);
-            VkShaderStageFlags activeStages         = gl_vk::kShaderStageMap[shaderType];
+            if (info.isDuplicate)
+            {
+                continue;
+            }
+
+            VkShaderStageFlags activeStages = gl_vk::GetShaderStageFlags(info.activeStages);
 
             // TODO: https://issuetracker.google.com/issues/158215272: how do we handle array of
             // immutable samplers?
@@ -712,8 +737,8 @@
                 // All descriptors in a binding use the same maximum
                 // combinedImageSamplerDescriptorCount descriptors to allow implementations to use a
                 // uniform stride for dynamic indexing of the descriptors in the binding.
-                uint64_t externalFormat = textureVk->getImage().getExternalFormat();
-                VkFormat vkFormat       = textureVk->getImage().getFormat().actualImageVkFormat();
+                uint64_t externalFormat        = textureVk->getImage().getExternalFormat();
+                VkFormat vkFormat              = textureVk->getImage().getActualVkFormat();
                 uint32_t formatDescriptorCount = 0;
                 angle::Result result           = angle::Result::Stop;
 
@@ -953,7 +978,7 @@
         const std::string uniformBlockName = kDefaultUniformNames[shaderType];
         const ShaderInterfaceVariableInfo &info =
             mVariableInfoMap.get(shaderType, uniformBlockName);
-        if (!info.activeStages[shaderType])
+        if (info.isDuplicate || !info.activeStages[shaderType])
         {
             continue;
         }
@@ -1118,6 +1143,7 @@
 
         ASSERT(frontPrecision >= GL_LOW_FLOAT && frontPrecision <= GL_HIGH_INT);
         ASSERT(backPrecision >= GL_LOW_FLOAT && backPrecision <= GL_HIGH_INT);
+
         if (frontPrecision > backPrecision)
         {
             // The output is higher precision than the input
@@ -1144,9 +1170,10 @@
     vk::BufferHelper *defaultUniformBuffer,
     ContextVk *contextVk)
 {
-    const std::string uniformBlockName      = kDefaultUniformNames[shaderType];
+    const std::string uniformBlockName = kDefaultUniformNames[shaderType];
+
     const ShaderInterfaceVariableInfo &info = mVariableInfoMap.get(shaderType, uniformBlockName);
-    if (!info.activeStages[shaderType])
+    if (info.isDuplicate || !info.activeStages[shaderType])
     {
         return;
     }
@@ -1238,6 +1265,11 @@
 
         const ShaderInterfaceVariableInfo &info =
             mVariableInfoMap.get(shaderType, block.mappedName);
+        if (info.isDuplicate)
+        {
+            continue;
+        }
+
         uint32_t binding      = info.binding;
         uint32_t arrayElement = block.isArray ? block.arrayElement : 0;
 
@@ -1302,8 +1334,7 @@
 
     std::string blockName(sh::vk::kAtomicCountersBlockName);
     const ShaderInterfaceVariableInfo &info = mVariableInfoMap.get(shaderType, blockName);
-
-    if (!info.activeStages[shaderType])
+    if (info.isDuplicate || !info.activeStages[shaderType])
     {
         return angle::Result::Continue;
     }
@@ -1416,8 +1447,6 @@
         // time we process a nested array.
         mappedImageNameToArrayOffset[mappedImageName] += arraySize;
 
-        VkWriteDescriptorSet *writeInfos = contextVk->allocWriteDescriptorSets(arraySize);
-
         // Texture buffers use buffer views, so they are especially handled.
         if (imageBinding.textureType == gl::TextureType::Buffer)
         {
@@ -1429,6 +1458,15 @@
                 format = &renderer->getFormat(imageUniform.imageUnitFormat);
             }
 
+            const ShaderInterfaceVariableInfo &info =
+                mVariableInfoMap.get(shaderType, mappedImageName);
+            if (info.isDuplicate)
+            {
+                continue;
+            }
+
+            VkWriteDescriptorSet *writeInfos = contextVk->allocWriteDescriptorSets(arraySize);
+
             for (uint32_t arrayElement = 0; arrayElement < arraySize; ++arrayElement)
             {
                 GLuint imageUnit     = imageBinding.boundImageUnits[arrayElement];
@@ -1437,9 +1475,6 @@
                 const vk::BufferView *view = nullptr;
                 ANGLE_TRY(textureVk->getBufferViewAndRecordUse(contextVk, format, true, &view));
 
-                const ShaderInterfaceVariableInfo &info =
-                    mVariableInfoMap.get(shaderType, mappedImageName);
-
                 writeInfos[arrayElement].sType            = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
                 writeInfos[arrayElement].pNext            = nullptr;
                 writeInfos[arrayElement].dstSet           = descriptorSet;
@@ -1454,6 +1489,14 @@
             continue;
         }
 
+        const std::string imageName             = GlslangGetMappedSamplerName(imageUniform.name);
+        const ShaderInterfaceVariableInfo &info = mVariableInfoMap.get(shaderType, imageName);
+        if (info.isDuplicate)
+        {
+            continue;
+        }
+
+        VkWriteDescriptorSet *writeInfos  = contextVk->allocWriteDescriptorSets(arraySize);
         VkDescriptorImageInfo *imageInfos = contextVk->allocDescriptorImageInfos(arraySize);
         for (uint32_t arrayElement = 0; arrayElement < arraySize; ++arrayElement)
         {
@@ -1472,9 +1515,6 @@
             imageInfos[arrayElement].imageView   = imageView->getHandle();
             imageInfos[arrayElement].imageLayout = image->getCurrentLayout();
 
-            const std::string imageName = GlslangGetMappedSamplerName(imageUniform.name);
-            const ShaderInterfaceVariableInfo &info = mVariableInfoMap.get(shaderType, imageName);
-
             writeInfos[arrayElement].sType            = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
             writeInfos[arrayElement].pNext            = nullptr;
             writeInfos[arrayElement].dstSet           = descriptorSet;
@@ -1565,8 +1605,14 @@
     const uint32_t baseUniformIndex              = executable.getFragmentInoutRange().low();
     const gl::LinkedUniform &baseInputAttachment = uniforms.at(baseUniformIndex);
     std::string baseMappedName                   = baseInputAttachment.mappedName;
-    ShaderInterfaceVariableInfo &baseInfo        = mVariableInfoMap.get(shaderType, baseMappedName);
-    uint32_t baseBinding                         = baseInfo.binding - baseInputAttachment.location;
+
+    ShaderInterfaceVariableInfo &baseInfo = mVariableInfoMap.get(shaderType, baseMappedName);
+    if (baseInfo.isDuplicate)
+    {
+        return angle::Result::Continue;
+    }
+
+    uint32_t baseBinding = baseInfo.binding - baseInputAttachment.location;
 
     for (size_t colorIndex : framebufferVk->getState().getColorAttachmentsMask())
     {
@@ -1707,6 +1753,14 @@
                 continue;
             }
 
+            const std::string samplerName = GlslangGetMappedSamplerName(samplerUniform.name);
+
+            const ShaderInterfaceVariableInfo &info = mVariableInfoMap.get(shaderType, samplerName);
+            if (info.isDuplicate)
+            {
+                continue;
+            }
+
             // Lazily allocate the descriptor set, since we may not need one if all of the
             // sampler uniforms are inactive.
             if (descriptorSet == VK_NULL_HANDLE)
@@ -1747,11 +1801,6 @@
                     ANGLE_TRY(
                         textureVk->getBufferViewAndRecordUse(contextVk, nullptr, false, &view));
 
-                    const std::string samplerName =
-                        GlslangGetMappedSamplerName(samplerUniform.name);
-                    const ShaderInterfaceVariableInfo &info =
-                        mVariableInfoMap.get(shaderType, samplerName);
-
                     writeInfos[arrayElement].sType      = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
                     writeInfos[arrayElement].pNext      = nullptr;
                     writeInfos[arrayElement].dstSet     = descriptorSet;
@@ -1800,9 +1849,6 @@
                 {
                     imageInfos[arrayElement].sampler = textureVk->getSampler().get().getHandle();
                 }
-                const std::string samplerName = GlslangGetMappedSamplerName(samplerUniform.name);
-                const ShaderInterfaceVariableInfo &info =
-                    mVariableInfoMap.get(shaderType, samplerName);
 
                 writeInfos[arrayElement].sType           = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
                 writeInfos[arrayElement].pNext           = nullptr;
diff --git a/src/libANGLE/renderer/vulkan/ProgramPipelineVk.cpp b/src/libANGLE/renderer/vulkan/ProgramPipelineVk.cpp
index 6f2b241..e69be70 100644
--- a/src/libANGLE/renderer/vulkan/ProgramPipelineVk.cpp
+++ b/src/libANGLE/renderer/vulkan/ProgramPipelineVk.cpp
@@ -94,6 +94,7 @@
     }
 
     gl::ShaderType frontShaderType = gl::ShaderType::InvalidEnum;
+    UniformBindingIndexMap uniformBindingIndexMap;
     for (const gl::ShaderType shaderType : glExecutable.getLinkedShaderStages())
     {
         gl::Program *glProgram =
@@ -106,7 +107,8 @@
 
             GlslangAssignLocations(options, glProgram->getState(), varyingPacking, shaderType,
                                    frontShaderType, isTransformFeedbackStage,
-                                   &glslangProgramInterfaceInfo, &mExecutable.mVariableInfoMap);
+                                   &glslangProgramInterfaceInfo, &uniformBindingIndexMap,
+                                   &mExecutable.mVariableInfoMap);
             frontShaderType = shaderType;
         }
     }
diff --git a/src/libANGLE/renderer/vulkan/RenderTargetVk.cpp b/src/libANGLE/renderer/vulkan/RenderTargetVk.cpp
index 9ec5045..176bdc1 100644
--- a/src/libANGLE/renderer/vulkan/RenderTargetVk.cpp
+++ b/src/libANGLE/renderer/vulkan/RenderTargetVk.cpp
@@ -95,7 +95,7 @@
                                  uint32_t framebufferLayerCount,
                                  vk::PackedAttachmentIndex packedAttachmentIndex)
 {
-    ASSERT(!mImage->getFormat().actualImageFormat().hasDepthOrStencilBits());
+    ASSERT(!mImage->getActualFormat().hasDepthOrStencilBits());
     ASSERT(framebufferLayerCount <= mLayerCount);
 
     contextVk->onColorDraw(mImage, mResolveImage, packedAttachmentIndex);
@@ -113,7 +113,7 @@
 
 void RenderTargetVk::onColorResolve(ContextVk *contextVk, uint32_t framebufferLayerCount)
 {
-    ASSERT(!mImage->getFormat().actualImageFormat().hasDepthOrStencilBits());
+    ASSERT(!mImage->getActualFormat().hasDepthOrStencilBits());
     ASSERT(framebufferLayerCount <= mLayerCount);
     ASSERT(mResolveImage == nullptr);
 
@@ -125,7 +125,7 @@
 
 void RenderTargetVk::onDepthStencilDraw(ContextVk *contextVk, uint32_t framebufferLayerCount)
 {
-    const angle::Format &format = mImage->getFormat().actualImageFormat();
+    const angle::Format &format = mImage->getActualFormat();
     ASSERT(format.hasDepthOrStencilBits());
     ASSERT(framebufferLayerCount <= mLayerCount);
 
@@ -237,10 +237,28 @@
                                        : getImageView(contextVk, imageViewOut);
 }
 
-const vk::Format &RenderTargetVk::getImageFormat() const
+angle::FormatID RenderTargetVk::getImageActualFormatID() const
 {
     ASSERT(mImage && mImage->valid());
-    return mImage->getFormat();
+    return mImage->getActualFormatID();
+}
+
+angle::FormatID RenderTargetVk::getImageIntendedFormatID() const
+{
+    ASSERT(mImage && mImage->valid());
+    return mImage->getIntendedFormatID();
+}
+
+const angle::Format &RenderTargetVk::getImageActualFormat() const
+{
+    ASSERT(mImage && mImage->valid());
+    return mImage->getActualFormat();
+}
+
+const angle::Format &RenderTargetVk::getImageIntendedFormat() const
+{
+    ASSERT(mImage && mImage->valid());
+    return mImage->getIntendedFormat();
 }
 
 gl::Extents RenderTargetVk::getExtents() const
diff --git a/src/libANGLE/renderer/vulkan/RenderTargetVk.h b/src/libANGLE/renderer/vulkan/RenderTargetVk.h
index 186093d..7b8b976 100644
--- a/src/libANGLE/renderer/vulkan/RenderTargetVk.h
+++ b/src/libANGLE/renderer/vulkan/RenderTargetVk.h
@@ -19,7 +19,6 @@
 {
 namespace vk
 {
-struct Format;
 class FramebufferHelper;
 class ImageHelper;
 class ImageView;
@@ -95,7 +94,11 @@
     angle::Result getAndRetainCopyImageView(ContextVk *contextVk,
                                             const vk::ImageView **imageViewOut) const;
 
-    const vk::Format &getImageFormat() const;
+    angle::FormatID getImageActualFormatID() const;
+    const angle::Format &getImageActualFormat() const;
+    angle::FormatID getImageIntendedFormatID() const;
+    const angle::Format &getImageIntendedFormat() const;
+
     gl::Extents getExtents() const;
     gl::Extents getRotatedExtents() const;
     gl::LevelIndex getLevelIndex() const { return mLevelIndexGL; }
diff --git a/src/libANGLE/renderer/vulkan/RenderbufferVk.cpp b/src/libANGLE/renderer/vulkan/RenderbufferVk.cpp
index 8f750ac..4650413 100644
--- a/src/libANGLE/renderer/vulkan/RenderbufferVk.cpp
+++ b/src/libANGLE/renderer/vulkan/RenderbufferVk.cpp
@@ -45,9 +45,10 @@
                                              GLsizei height,
                                              gl::MultisamplingMode mode)
 {
-    ContextVk *contextVk     = vk::GetImpl(context);
-    RendererVk *renderer     = contextVk->getRenderer();
-    const vk::Format &format = renderer->getFormat(internalformat);
+    ContextVk *contextVk            = vk::GetImpl(context);
+    RendererVk *renderer            = contextVk->getRenderer();
+    const vk::Format &format        = renderer->getFormat(internalformat);
+    angle::FormatID textureFormatID = format.getActualRenderableImageFormatID();
 
     if (!mOwnsImage)
     {
@@ -78,7 +79,7 @@
         mImageViews.init(renderer);
     }
 
-    const angle::Format &textureFormat = format.actualImageFormat();
+    const angle::Format &textureFormat = format.getActualRenderableImageFormat();
     const bool isDepthStencilFormat    = textureFormat.hasDepthOrStencilBits();
     ASSERT(textureFormat.redBits > 0 || isDepthStencilFormat);
 
@@ -103,7 +104,8 @@
     bool robustInit = contextVk->isRobustResourceInitEnabled();
 
     VkExtent3D extents = {static_cast<uint32_t>(width), static_cast<uint32_t>(height), 1u};
-    ANGLE_TRY(mImage->initExternal(contextVk, gl::TextureType::_2D, extents, format, imageSamples,
+    ANGLE_TRY(mImage->initExternal(contextVk, gl::TextureType::_2D, extents,
+                                   format.getIntendedFormatID(), textureFormatID, imageSamples,
                                    usage, vk::kVkImageCreateFlagsNone, vk::ImageLayout::Undefined,
                                    nullptr, gl::LevelIndex(0), 1, 1, robustInit, nullptr, false));
 
@@ -169,7 +171,7 @@
     mImageViews.init(renderer);
 
     const vk::Format &vkFormat = renderer->getFormat(image->getFormat().info->sizedInternalFormat);
-    const angle::Format &textureFormat = vkFormat.actualImageFormat();
+    const angle::Format &textureFormat = vkFormat.getActualRenderableImageFormat();
 
     VkImageAspectFlags aspect = vk::GetFormatAspectFlags(textureFormat);
 
@@ -183,14 +185,6 @@
                                      rendererQueueFamilyIndex, commandBuffer);
     }
 
-    gl::TextureType viewType = imageVk->getImageTextureType();
-
-    if (imageVk->getImageTextureType() == gl::TextureType::CubeMap)
-    {
-        viewType = vk::Get2DTextureType(imageVk->getImage()->getLayerCount(),
-                                        imageVk->getImage()->getSamples());
-    }
-
     mRenderTarget.init(mImage, &mImageViews, nullptr, nullptr, imageVk->getImageLevel(),
                        imageVk->getImageLayer(), 1, RenderTargetTransience::Default);
 
@@ -308,7 +302,7 @@
 
 const gl::InternalFormat &RenderbufferVk::getImplementationSizedFormat() const
 {
-    GLenum internalFormat = mImage->getFormat().actualImageFormat().glInternalFormat;
+    GLenum internalFormat = mImage->getActualFormat().glInternalFormat;
     return gl::GetSizedInternalFormatInfo(internalFormat);
 }
 
@@ -343,7 +337,7 @@
     gl::MaybeOverrideLuminance(format, type, getColorReadFormat(context),
                                getColorReadType(context));
 
-    return mImage->readPixelsForGetImage(contextVk, packState, packBuffer, gl::LevelIndex(0), 0,
+    return mImage->readPixelsForGetImage(contextVk, packState, packBuffer, gl::LevelIndex(0), 0, 0,
                                          format, type, pixels);
 }
 
@@ -358,9 +352,13 @@
 void RenderbufferVk::onSubjectStateChange(angle::SubjectIndex index, angle::SubjectMessage message)
 {
     ASSERT(index == kRenderbufferImageSubjectIndex &&
-           message == angle::SubjectMessage::SubjectChanged);
+           (message == angle::SubjectMessage::SubjectChanged ||
+            message == angle::SubjectMessage::InitializationComplete));
 
     // Forward the notification to the parent class that the staging buffer changed.
-    onStateChange(angle::SubjectMessage::SubjectChanged);
+    if (message == angle::SubjectMessage::SubjectChanged)
+    {
+        onStateChange(angle::SubjectMessage::SubjectChanged);
+    }
 }
 }  // namespace rx
diff --git a/src/libANGLE/renderer/vulkan/RendererVk.cpp b/src/libANGLE/renderer/vulkan/RendererVk.cpp
index 14b4cfb..e7cb95a 100644
--- a/src/libANGLE/renderer/vulkan/RendererVk.cpp
+++ b/src/libANGLE/renderer/vulkan/RendererVk.cpp
@@ -181,10 +181,10 @@
     "VUID-vkCmdDrawIndexedIndirectCount-None-04584",
     // https://anglebug.com/5912
     "VUID-VkImageViewCreateInfo-pNext-01585",
-    // http://anglebug.com/6155
-    "VUID-vkCmdDraw-None-02699",
-    // http://anglebug.com/6168
-    "VUID-VkImageViewCreateInfo-None-02273",
+    // https://anglebug.com/6262
+    "VUID-vkCmdClearAttachments-baseArrayLayer-00018",
+    // http://anglebug.com/6355
+    "VUID-vkCmdDraw-blendEnable-04727",
 };
 
 // Suppress validation errors that are known
@@ -850,7 +850,7 @@
     mLibVulkanLibrary->getAs("vkGetInstanceProcAddr", &vulkanLoaderGetInstanceProcAddr);
 
     // Set all vk* function ptrs
-    ANGLE_VK_TRY(displayVk, volkInitialize());
+    volkInitializeCustom(vulkanLoaderGetInstanceProcAddr);
 
     uint32_t ver = volkGetInstanceVersion();
     if (!IsAndroid() && VK_API_VERSION_MAJOR(ver) == 1 &&
@@ -1894,7 +1894,11 @@
         ANGLE_TRY(mCommandQueue.init(displayVk, graphicsQueueMap));
     }
 
-#if !defined(ANGLE_SHARED_LIBVULKAN)
+#if defined(ANGLE_SHARED_LIBVULKAN)
+    // Avoid compiler warnings on unused-but-set variables.
+    ANGLE_UNUSED_VARIABLE(hasGetMemoryRequirements2KHR);
+    ANGLE_UNUSED_VARIABLE(hasBindMemory2KHR);
+#else
     if (hasGetMemoryRequirements2KHR)
     {
         InitGetMemoryRequirements2KHRFunctions(mDevice);
@@ -2135,12 +2139,6 @@
         maxVersion = LimitVersionTo(maxVersion, {2, 0});
     }
 
-    // If the command buffer doesn't support queries, we can't support ES3.
-    if (!vk::CommandBuffer::SupportsQueries(mPhysicalDeviceFeatures))
-    {
-        maxVersion = LimitVersionTo(maxVersion, {2, 0});
-    }
-
     // If independentBlend is not supported, we can't have a mix of has-alpha and emulated-alpha
     // render targets in a framebuffer.  We also cannot perform masked clears of multiple render
     // targets.
@@ -2247,8 +2245,6 @@
     // http://anglebug.com/2838
     ANGLE_FEATURE_CONDITION(&mFeatures, extraCopyBufferRegion, IsWindows() && isIntel);
 
-    ANGLE_FEATURE_CONDITION(&mFeatures, forceCPUPathForCubeMapCopy, false);
-
     // Work around incorrect NVIDIA point size range clamping.
     // http://anglebug.com/2970#c10
     // Clamp if driver version is:
@@ -2364,6 +2360,9 @@
     ANGLE_FEATURE_CONDITION(&mFeatures, supportsTransformFeedbackExtension,
                             mTransformFeedbackFeatures.transformFeedback == VK_TRUE);
 
+    ANGLE_FEATURE_CONDITION(&mFeatures, supportsGeometryStreamsCapability,
+                            mTransformFeedbackFeatures.geometryStreams == VK_TRUE);
+
     ANGLE_FEATURE_CONDITION(&mFeatures, supportsIndexTypeUint8,
                             mIndexTypeUint8Features.indexTypeUint8 == VK_TRUE);
 
@@ -2384,9 +2383,11 @@
                              mPhysicalDeviceFeatures.vertexPipelineStoresAndAtomics == VK_TRUE));
 
     // TODO: http://anglebug.com/5927 - drop dependency on customBorderColorWithoutFormat.
-    ANGLE_FEATURE_CONDITION(&mFeatures, supportsCustomBorderColorEXT,
-                            (mCustomBorderColorFeatures.customBorderColors == VK_TRUE &&
-                             mCustomBorderColorFeatures.customBorderColorWithoutFormat == VK_TRUE));
+    // TODO: http://anglebug.com/6200 - re-enable on SwS when possible
+    ANGLE_FEATURE_CONDITION(
+        &mFeatures, supportsCustomBorderColorEXT,
+        mCustomBorderColorFeatures.customBorderColors == VK_TRUE &&
+            mCustomBorderColorFeatures.customBorderColorWithoutFormat == VK_TRUE && !isSwiftShader);
 
     ANGLE_FEATURE_CONDITION(&mFeatures, disableFifoPresentMode, IsLinux() && isIntel);
 
@@ -2473,7 +2474,7 @@
     ANGLE_FEATURE_CONDITION(
         &mFeatures, supportsImageFormatList,
         (ExtensionFound(VK_KHR_IMAGE_FORMAT_LIST_EXTENSION_NAME, deviceExtensionNames)) &&
-            (isAMD || isARM));
+            !isSwiftShader);
 
     // Feature disabled due to driver bugs:
     //
@@ -2542,14 +2543,6 @@
     // descriptor counts for such immutable samplers
     ANGLE_FEATURE_CONDITION(&mFeatures, useMultipleDescriptorsForExternalFormats, true);
 
-    // When generating SPIR-V, the following workarounds are applied on buggy drivers:
-    //
-    // - AMD/Windows: Function parameters are passed in temporary variables even if they are already
-    //   variables.
-    //
-    // http://anglebug.com/6110
-    ANGLE_FEATURE_CONDITION(&mFeatures, directSPIRVGenerationWorkarounds, IsWindows() && isAMD);
-
     angle::PlatformMethods *platform = ANGLEPlatformCurrent();
     platform->overrideFeaturesVk(platform, &mFeatures);
 
diff --git a/src/libANGLE/renderer/vulkan/RendererVk.h b/src/libANGLE/renderer/vulkan/RendererVk.h
index a56cdc7..82db17c 100644
--- a/src/libANGLE/renderer/vulkan/RendererVk.h
+++ b/src/libANGLE/renderer/vulkan/RendererVk.h
@@ -53,7 +53,7 @@
 
 namespace vk
 {
-struct Format;
+class Format;
 
 static constexpr size_t kMaxExtensionNames = 400;
 using ExtensionNameList                    = angle::FixedVector<const char *, kMaxExtensionNames>;
diff --git a/src/libANGLE/renderer/vulkan/SemaphoreVk.cpp b/src/libANGLE/renderer/vulkan/SemaphoreVk.cpp
index 9af5b8e..e511ac1 100644
--- a/src/libANGLE/renderer/vulkan/SemaphoreVk.cpp
+++ b/src/libANGLE/renderer/vulkan/SemaphoreVk.cpp
@@ -143,8 +143,7 @@
 
             // Image should not be accessed while unowned. Emulated formats may have staged updates
             // to clear the image after initialization.
-            ASSERT(!image.hasStagedUpdatesInAllocatedLevels() ||
-                   image.getFormat().hasEmulatedImageChannels());
+            ASSERT(!image.hasStagedUpdatesInAllocatedLevels() || image.hasEmulatedImageChannels());
 
             // Queue ownership transfer and layout transition.
             image.acquireFromExternal(contextVk, VK_QUEUE_FAMILY_EXTERNAL, rendererQueueFamilyIndex,
diff --git a/src/libANGLE/renderer/vulkan/ShaderVk.cpp b/src/libANGLE/renderer/vulkan/ShaderVk.cpp
index ac189d7..ad59aae 100644
--- a/src/libANGLE/renderer/vulkan/ShaderVk.cpp
+++ b/src/libANGLE/renderer/vulkan/ShaderVk.cpp
@@ -104,11 +104,6 @@
     if (contextVk->getFeatures().directSPIRVGeneration.enabled)
     {
         compileOptions |= SH_GENERATE_SPIRV_DIRECTLY;
-
-        if (contextVk->getFeatures().directSPIRVGenerationWorkarounds.enabled)
-        {
-            compileOptions |= SH_GENERATE_SPIRV_WORKAROUNDS;
-        }
     }
 
     return compileImpl(context, compilerInstance, mState.getSource(), compileOptions | options);
diff --git a/src/libANGLE/renderer/vulkan/SurfaceVk.cpp b/src/libANGLE/renderer/vulkan/SurfaceVk.cpp
index 96b513f..eb1a226 100644
--- a/src/libANGLE/renderer/vulkan/SurfaceVk.cpp
+++ b/src/libANGLE/renderer/vulkan/SurfaceVk.cpp
@@ -124,7 +124,7 @@
                               bool hasProtectedContent,
                               vk::ImageHelper *imageHelper)
 {
-    const angle::Format &textureFormat = vkFormat.actualImageFormat();
+    const angle::Format &textureFormat = vkFormat.getActualRenderableImageFormat();
     bool isDepthOrStencilFormat   = textureFormat.depthBits > 0 || textureFormat.stencilBits > 0;
     const VkImageUsageFlags usage = isDepthOrStencilFormat ? kSurfaceVkDepthStencilImageUsageFlags
                                                            : kSurfaceVkColorImageUsageFlags;
@@ -134,10 +134,11 @@
 
     VkImageCreateFlags imageCreateFlags =
         hasProtectedContent ? VK_IMAGE_CREATE_PROTECTED_BIT : vk::kVkImageCreateFlagsNone;
-    ANGLE_TRY(imageHelper->initExternal(displayVk, gl::TextureType::_2D, extents, vkFormat, samples,
-                                        usage, imageCreateFlags, vk::ImageLayout::Undefined,
-                                        nullptr, gl::LevelIndex(0), 1, 1,
-                                        isRobustResourceInitEnabled, nullptr, hasProtectedContent));
+    ANGLE_TRY(imageHelper->initExternal(
+        displayVk, gl::TextureType::_2D, extents, vkFormat.getIntendedFormatID(),
+        vkFormat.getActualRenderableImageFormatID(), samples, usage, imageCreateFlags,
+        vk::ImageLayout::Undefined, nullptr, gl::LevelIndex(0), 1, 1, isRobustResourceInitEnabled,
+        nullptr, hasProtectedContent));
 
     return angle::Result::Continue;
 }
@@ -740,9 +741,14 @@
     ANGLE_VK_TRY(displayVk, vkGetPhysicalDeviceSurfacePresentModesKHR(
                                 physicalDevice, mSurface, &presentModeCount, mPresentModes.data()));
 
-    // Select appropriate present mode based on vsync parameter.  Default to 1 (FIFO), though it
+    // Select appropriate present mode based on vsync parameter. Default to 1 (FIFO), though it
     // will get clamped to the min/max values specified at display creation time.
-    setSwapInterval(renderer->getFeatures().disableFifoPresentMode.enabled ? 0 : 1);
+    EGLint preferredSwapInterval = mState.getPreferredSwapInterval();
+    if (renderer->getFeatures().disableFifoPresentMode.enabled)
+    {
+        preferredSwapInterval = 0;
+    }
+    setSwapInterval(preferredSwapInterval);
 
     uint32_t surfaceFormatCount = 0;
     ANGLE_VK_TRY(displayVk, vkGetPhysicalDeviceSurfaceFormatsKHR(physicalDevice, mSurface,
@@ -754,7 +760,7 @@
                                                       surfaceFormats.data()));
 
     const vk::Format &format = renderer->getFormat(mState.config->renderTargetFormat);
-    VkFormat nativeFormat    = format.actualImageVkFormat();
+    VkFormat nativeFormat    = format.getActualRenderableImageVkFormat();
 
     if (surfaceFormatCount == 1u && surfaceFormats[0].format == VK_FORMAT_UNDEFINED)
     {
@@ -1004,7 +1010,7 @@
     VkDevice device      = renderer->getDevice();
 
     const vk::Format &format = renderer->getFormat(mState.config->renderTargetFormat);
-    VkFormat nativeFormat    = format.actualImageVkFormat();
+    VkFormat nativeFormat    = format.getActualRenderableImageVkFormat();
 
     gl::Extents rotatedExtents = extents;
     if (Is90DegreeRotation(getPreTransform()))
@@ -1026,7 +1032,7 @@
     if (kEnableOverlay)
     {
         VkFormatFeatureFlags featureBits = renderer->getImageFormatFeatureBits(
-            format.actualImageFormatID, VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT);
+            format.getActualRenderableImageFormatID(), VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT);
         if ((featureBits & VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT) != 0)
         {
             imageUsageFlags |= VK_IMAGE_USAGE_STORAGE_BIT;
@@ -1069,7 +1075,7 @@
     mSwapchain            = newSwapChain;
     mSwapchainPresentMode = mDesiredSwapchainPresentMode;
 
-    // Intialize the swapchain image views.
+    // Initialize the swapchain image views.
     uint32_t imageCount = 0;
     ANGLE_VK_TRY(context, vkGetSwapchainImagesKHR(device, mSwapchain, &imageCount, nullptr));
 
@@ -1581,6 +1587,7 @@
         // Get the next available swapchain image.
 
         VkResult result = acquireNextSwapchainImage(contextVk);
+
         // If SUBOPTIMAL/OUT_OF_DATE is returned, it's ok, we just need to recreate the swapchain
         // before continuing.
         if (ANGLE_UNLIKELY((result == VK_ERROR_OUT_OF_DATE_KHR) || (result == VK_SUBOPTIMAL_KHR)))
diff --git a/src/libANGLE/renderer/vulkan/TextureVk.cpp b/src/libANGLE/renderer/vulkan/TextureVk.cpp
index 6cf6ba1..9df14e4 100644
--- a/src/libANGLE/renderer/vulkan/TextureVk.cpp
+++ b/src/libANGLE/renderer/vulkan/TextureVk.cpp
@@ -74,54 +74,68 @@
 bool IsTextureLevelDefinitionCompatibleWithImage(const vk::ImageHelper &image,
                                                  gl::LevelIndex textureLevelIndexGL,
                                                  const gl::Extents &size,
-                                                 const vk::Format &format)
+                                                 angle::FormatID intendedFormatID,
+                                                 angle::FormatID actualFormatID)
 {
     ASSERT(IsTextureLevelInAllocatedImage(image, textureLevelIndexGL));
 
     vk::LevelIndex imageLevelIndexVk = image.toVkLevel(textureLevelIndexGL);
-    return size == image.getLevelExtents(imageLevelIndexVk) && format == image.getFormat();
+    return size == image.getLevelExtents(imageLevelIndexVk) &&
+           intendedFormatID == image.getIntendedFormatID() &&
+           actualFormatID == image.getActualFormatID();
 }
 
 bool CanCopyWithTransferForTexImage(RendererVk *renderer,
-                                    const vk::Format &srcFormat,
+                                    angle::FormatID srcIntendedFormatID,
+                                    angle::FormatID srcActualFormatID,
                                     VkImageTiling srcTilingMode,
-                                    const vk::Format &destFormat,
+                                    angle::FormatID destIntendedFormatID,
+                                    angle::FormatID destActualFormatID,
                                     VkImageTiling destTilingMode)
 {
     // For glTex[Sub]Image, only accept same-format transfers.
-    bool isFormatCompatible = srcFormat.intendedFormatID == destFormat.intendedFormatID;
+    // There are cases that two images' actual format is the same, but intended formats are
+    // different due to one is using the fallback format (for example, RGB fallback to RGBA). In
+    // these situations CanCopyWithTransfer will say yes. But if we use transfer to do copy, the
+    // alpha channel will be also be copied with source data which is wrong.
+    bool isFormatCompatible =
+        srcIntendedFormatID == destIntendedFormatID && srcActualFormatID == destActualFormatID;
 
-    return isFormatCompatible &&
-           vk::CanCopyWithTransfer(renderer, srcFormat, srcTilingMode, destFormat, destTilingMode);
+    return isFormatCompatible && vk::CanCopyWithTransfer(renderer, srcActualFormatID, srcTilingMode,
+                                                         destActualFormatID, destTilingMode);
 }
 
 bool CanCopyWithTransferForCopyTexture(RendererVk *renderer,
-                                       const vk::Format &srcFormat,
+                                       const vk::ImageHelper &srcImage,
                                        VkImageTiling srcTilingMode,
-                                       const vk::Format &destFormat,
+                                       angle::FormatID destIntendedFormatID,
+                                       angle::FormatID destActualFormatID,
                                        VkImageTiling destTilingMode)
 {
-    if (!vk::CanCopyWithTransfer(renderer, srcFormat, srcTilingMode, destFormat, destTilingMode))
+    if (!vk::CanCopyWithTransfer(renderer, srcImage.getActualFormatID(), srcTilingMode,
+                                 destActualFormatID, destTilingMode))
     {
         return false;
     }
 
     // If the formats are identical, we can always transfer between them.
-    if (srcFormat.intendedFormatID == destFormat.intendedFormatID)
+    if (srcImage.getIntendedFormatID() == destIntendedFormatID &&
+        srcImage.getActualFormatID() == destActualFormatID)
     {
         return true;
     }
 
     // If either format is emulated, cannot transfer.
-    if (srcFormat.hasEmulatedImageFormat() || destFormat.hasEmulatedImageFormat())
+    if (srcImage.hasEmulatedImageFormat() ||
+        vk::HasEmulatedImageFormat(destIntendedFormatID, destActualFormatID))
     {
         return false;
     }
 
     // Otherwise, allow transfer between compatible formats.  This is derived from the specification
     // of CHROMIUM_copy_texture.
-    const angle::Format &srcAngleFormat  = srcFormat.actualImageFormat();
-    const angle::Format &destAngleFormat = destFormat.actualImageFormat();
+    const angle::Format &srcAngleFormat  = srcImage.getActualFormat();
+    const angle::Format &destAngleFormat = angle::Format::Get(destActualFormatID);
 
     const bool srcIsBGRA   = srcAngleFormat.isBGRA();
     const bool srcHasR8    = srcAngleFormat.redBits == 8;
@@ -145,33 +159,26 @@
 }
 
 bool CanCopyWithDraw(RendererVk *renderer,
-                     const vk::Format &srcFormat,
+                     const angle::FormatID srcFormatID,
                      VkImageTiling srcTilingMode,
-                     const vk::Format &destFormat,
+                     const angle::FormatID destFormatID,
                      VkImageTiling destTilingMode)
 {
     // Checks that the formats in copy by drawing have the appropriate feature bits
-    bool srcFormatHasNecessaryFeature =
-        vk::FormatHasNecessaryFeature(renderer, srcFormat.actualImageFormatID, srcTilingMode,
-                                      VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT);
-    bool dstFormatHasNecessaryFeature =
-        vk::FormatHasNecessaryFeature(renderer, destFormat.actualImageFormatID, destTilingMode,
-                                      VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT);
+    bool srcFormatHasNecessaryFeature = vk::FormatHasNecessaryFeature(
+        renderer, srcFormatID, srcTilingMode, VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT);
+    bool dstFormatHasNecessaryFeature = vk::FormatHasNecessaryFeature(
+        renderer, destFormatID, destTilingMode, VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT);
 
     return srcFormatHasNecessaryFeature && dstFormatHasNecessaryFeature;
 }
 
-bool ForceCPUPathForCopy(RendererVk *renderer, const vk::ImageHelper &image)
-{
-    return image.getLayerCount() > 1 && renderer->getFeatures().forceCPUPathForCubeMapCopy.enabled;
-}
-
 bool CanGenerateMipmapWithCompute(RendererVk *renderer,
                                   VkImageType imageType,
-                                  const vk::Format &format,
+                                  angle::FormatID formatID,
                                   GLint samples)
 {
-    const angle::Format &angleFormat = format.actualImageFormat();
+    const angle::Format &angleFormat = angle::Format::Get(formatID);
 
     if (!renderer->getFeatures().allowGenerateMipmapWithCompute.enabled)
     {
@@ -179,8 +186,8 @@
     }
 
     // Format must have STORAGE support.
-    const bool hasStorageSupport = renderer->hasImageFormatFeatureBits(
-        format.actualImageFormatID, VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT);
+    const bool hasStorageSupport =
+        renderer->hasImageFormatFeatureBits(formatID, VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT);
 
     // No support for sRGB formats yet.
     const bool isSRGB = angleFormat.isSRGB;
@@ -258,11 +265,12 @@
 }
 
 const vk::Format *AdjustStorageViewFormatPerWorkarounds(ContextVk *contextVk,
-                                                        const vk::Format *intended)
+                                                        const vk::Format *intended,
+                                                        vk::ImageAccess access)
 {
     // r32f images are emulated with r32ui.
     if (contextVk->getFeatures().emulateR32fImageAtomicExchange.enabled &&
-        intended->actualImageFormatID == angle::FormatID::R32_FLOAT)
+        intended->getActualImageFormatID(access) == angle::FormatID::R32_FLOAT)
     {
         return &contextVk->getRenderer()->getFormat(angle::FormatID::R32_UINT);
     }
@@ -276,6 +284,7 @@
     : TextureImpl(state),
       mOwnsImage(false),
       mRequiresMutableStorage(false),
+      mRequiredImageAccess(vk::ImageAccess::SampleOnly),
       mImmutableSamplerDirty(false),
       mImageNativeType(gl::TextureType::InvalidEnum),
       mImageLayerOffset(0),
@@ -406,18 +415,20 @@
     // 2. Can't perform a fast copy for emulated formats, except from non-emulated depth or stencil
     //    to emulated depth/stencil.
     // 3. vkCmdCopyBufferToImage requires byte offset to be a multiple of 4
-    const angle::Format &bufferFormat = vkFormat.actualBufferFormat(false);
+    const angle::Format &bufferFormat = vkFormat.getActualBufferFormat(false);
     const bool isCombinedDepthStencil = bufferFormat.depthBits > 0 && bufferFormat.stencilBits > 0;
     const bool isDepthXorStencil = (bufferFormat.depthBits > 0 && bufferFormat.stencilBits == 0) ||
                                    (bufferFormat.depthBits == 0 && bufferFormat.stencilBits > 0);
-    const bool isCompatibleDepth = vkFormat.intendedFormat().depthBits == bufferFormat.depthBits;
+    const bool isCompatibleDepth = vkFormat.getIntendedFormat().depthBits == bufferFormat.depthBits;
     return mImage->valid() && !isCombinedDepthStencil &&
-           (vkFormat.intendedFormatID == vkFormat.actualImageFormatID ||
+           (vkFormat.getIntendedFormatID() ==
+                vkFormat.getActualImageFormatID(getRequiredImageAccess()) ||
             (isDepthXorStencil && isCompatibleDepth)) &&
            (offset & (kBufferOffsetMultiple - 1)) == 0;
 }
 
-bool TextureVk::shouldUpdateBeStaged(gl::LevelIndex textureLevelIndexGL) const
+bool TextureVk::shouldUpdateBeStaged(gl::LevelIndex textureLevelIndexGL,
+                                     angle::FormatID dstImageFormatID) const
 {
     ASSERT(mImage);
 
@@ -427,6 +438,14 @@
         return true;
     }
 
+    // During the process of format change, mImage's format may become stale. In that case, we
+    // should always stage the update and let caller properly release mImage and initExternal and
+    // flush the update.
+    if (imageHasActualImageFormat(dstImageFormatID))
+    {
+        return true;
+    }
+
     vk::LevelIndex imageLevelIndexVk = mImage->toVkLevel(textureLevelIndexGL);
 
     // Can't have more than 32 mips for the foreseeable future.
@@ -453,7 +472,9 @@
     // immediately.
     vk::DynamicBuffer *stagingBuffer = nullptr;
     if (!mOwnsImage || mState.getImmutableFormat() ||
-        (mImage->valid() && !shouldUpdateBeStaged(gl::LevelIndex(index.getLevelIndex()))))
+        (mImage->valid() &&
+         !shouldUpdateBeStaged(gl::LevelIndex(index.getLevelIndex()),
+                               vkFormat.getActualImageFormatID(getRequiredImageAccess()))))
     {
         stagingBuffer = contextVk->getStagingBuffer();
     }
@@ -476,9 +497,11 @@
 
         // Note: cannot directly copy from a depth/stencil PBO.  GL requires depth and stencil data
         // to be packed, while Vulkan requires them to be separate.
-        const VkImageAspectFlags aspectFlags = vk::GetFormatAspectFlags(vkFormat.intendedFormat());
+        const VkImageAspectFlags aspectFlags =
+            vk::GetFormatAspectFlags(vkFormat.getIntendedFormat());
 
-        if (!shouldUpdateBeStaged(gl::LevelIndex(index.getLevelIndex())) &&
+        if (!shouldUpdateBeStaged(gl::LevelIndex(index.getLevelIndex()),
+                                  vkFormat.getActualImageFormatID(getRequiredImageAccess())) &&
             isFastUnpackPossible(vkFormat, offsetBytes))
         {
             GLuint pixelSize   = formatInfo.pixelBytes;
@@ -515,17 +538,18 @@
                 contextVk, getNativeImageIndex(index),
                 gl::Extents(area.width, area.height, area.depth),
                 gl::Offset(area.x, area.y, area.z), formatInfo, unpack, stagingBuffer, type, source,
-                vkFormat, inputRowPitch, inputDepthPitch, inputSkipBytes));
+                vkFormat, getRequiredImageAccess(), inputRowPitch, inputDepthPitch,
+                inputSkipBytes));
 
             ANGLE_TRY(unpackBufferVk->unmapImpl(contextVk));
         }
     }
     else if (pixels)
     {
-        ANGLE_TRY(mImage->stageSubresourceUpdate(contextVk, getNativeImageIndex(index),
-                                                 gl::Extents(area.width, area.height, area.depth),
-                                                 gl::Offset(area.x, area.y, area.z), formatInfo,
-                                                 unpack, stagingBuffer, type, pixels, vkFormat));
+        ANGLE_TRY(mImage->stageSubresourceUpdate(
+            contextVk, getNativeImageIndex(index), gl::Extents(area.width, area.height, area.depth),
+            gl::Offset(area.x, area.y, area.z), formatInfo, unpack, stagingBuffer, type, pixels,
+            vkFormat, getRequiredImageAccess()));
     }
 
     // If we used context's staging buffer, flush out the updates
@@ -722,9 +746,13 @@
 
     RenderTargetVk *colorReadRT = framebufferVk->getColorReadRenderTarget();
 
-    const vk::Format &srcFormat  = colorReadRT->getImageFormat();
-    VkImageTiling srcTilingMode  = colorReadRT->getImageForCopy().getTilingMode();
-    const vk::Format &destFormat = renderer->getFormat(internalFormat.sizedInternalFormat);
+    angle::FormatID srcIntendedFormatID  = colorReadRT->getImageIntendedFormatID();
+    angle::FormatID srcActualFormatID    = colorReadRT->getImageActualFormatID();
+    VkImageTiling srcTilingMode          = colorReadRT->getImageForCopy().getTilingMode();
+    const vk::Format &destFormat         = renderer->getFormat(internalFormat.sizedInternalFormat);
+    angle::FormatID destIntendedFormatID = destFormat.getIntendedFormatID();
+    angle::FormatID destActualFormatID =
+        destFormat.getActualImageFormatID(getRequiredImageAccess());
     VkImageTiling destTilingMode = getTilingMode();
 
     bool isViewportFlipY = contextVk->isViewportFlipEnabledForReadFBO();
@@ -733,8 +761,9 @@
                              clippedSourceArea.width, clippedSourceArea.height, 1);
 
     // If it's possible to perform the copy with a transfer, that's the best option.
-    if (!isViewportFlipY && CanCopyWithTransferForTexImage(renderer, srcFormat, srcTilingMode,
-                                                           destFormat, destTilingMode))
+    if (!isViewportFlipY && CanCopyWithTransferForTexImage(
+                                renderer, srcIntendedFormatID, srcActualFormatID, srcTilingMode,
+                                destIntendedFormatID, destActualFormatID, destTilingMode))
     {
         return copySubImageImplWithTransfer(contextVk, offsetImageIndex, modifiedDestOffset,
                                             destFormat, colorReadRT->getLevelIndex(),
@@ -742,11 +771,9 @@
                                             &colorReadRT->getImageForCopy());
     }
 
-    bool forceCPUPath = ForceCPUPathForCopy(renderer, *mImage);
-
     // If it's possible to perform the copy with a draw call, do that.
-    if (CanCopyWithDraw(renderer, srcFormat, srcTilingMode, destFormat, destTilingMode) &&
-        !forceCPUPath)
+    if (CanCopyWithDraw(renderer, srcActualFormatID, srcTilingMode, destActualFormatID,
+                        destTilingMode))
     {
         // Layer count can only be 1 as the source is a framebuffer.
         ASSERT(offsetImageIndex.getLayerCount() == 1);
@@ -766,7 +793,8 @@
 
     // Use context's staging buffer if possible
     vk::DynamicBuffer *contextStagingBuffer = nullptr;
-    if (mImage->valid() && !shouldUpdateBeStaged(gl::LevelIndex(index.getLevelIndex())))
+    if (mImage->valid() &&
+        !shouldUpdateBeStaged(gl::LevelIndex(index.getLevelIndex()), destActualFormatID))
     {
         contextStagingBuffer = contextVk->getStagingBuffer();
     }
@@ -775,7 +803,7 @@
     ANGLE_TRY(mImage->stageSubresourceUpdateFromFramebuffer(
         context, offsetImageIndex, clippedSourceArea, modifiedDestOffset,
         gl::Extents(clippedSourceArea.width, clippedSourceArea.height, 1), internalFormat,
-        framebufferVk, contextStagingBuffer));
+        getRequiredImageAccess(), framebufferVk, contextStagingBuffer));
 
     if (contextStagingBuffer)
     {
@@ -800,16 +828,19 @@
 
     ANGLE_TRY(source->ensureImageInitialized(contextVk, ImageMipLevels::EnabledLevels));
 
-    const vk::Format &sourceVkFormat = source->getImage().getFormat();
-    VkImageTiling srcTilingMode      = source->getImage().getTilingMode();
-    const vk::Format &destVkFormat   = renderer->getFormat(destFormat.sizedInternalFormat);
-    VkImageTiling destTilingMode     = getTilingMode();
+    const angle::Format &sourceIntendedFormat = source->getImage().getIntendedFormat();
+    angle::FormatID sourceFormatID            = source->getImage().getActualFormatID();
+    VkImageTiling srcTilingMode               = source->getImage().getTilingMode();
+    const vk::Format &destVkFormat            = renderer->getFormat(destFormat.sizedInternalFormat);
+    angle::FormatID destFormatID = destVkFormat.getActualImageFormatID(getRequiredImageAccess());
+    VkImageTiling destTilingMode = getTilingMode();
 
     const gl::ImageIndex offsetImageIndex = getNativeImageIndex(index);
 
     // If it's possible to perform the copy with a transfer, that's the best option.
     if (!unpackFlipY && !unpackPremultiplyAlpha && !unpackUnmultiplyAlpha &&
-        CanCopyWithTransferForCopyTexture(renderer, sourceVkFormat, srcTilingMode, destVkFormat,
+        CanCopyWithTransferForCopyTexture(renderer, source->getImage(), srcTilingMode,
+                                          destVkFormat.getIntendedFormatID(), destFormatID,
                                           destTilingMode))
     {
         return copySubImageImplWithTransfer(contextVk, offsetImageIndex, destOffset, destVkFormat,
@@ -817,11 +848,8 @@
                                             &source->getImage());
     }
 
-    bool forceCPUPath = ForceCPUPathForCopy(renderer, *mImage);
-
     // If it's possible to perform the copy with a draw call, do that.
-    if (CanCopyWithDraw(renderer, sourceVkFormat, srcTilingMode, destVkFormat, destTilingMode) &&
-        !forceCPUPath)
+    if (CanCopyWithDraw(renderer, sourceFormatID, srcTilingMode, destFormatID, destTilingMode))
     {
         return copySubImageImplWithDraw(
             contextVk, offsetImageIndex, destOffset, destVkFormat, sourceLevelGL, sourceBox, false,
@@ -832,19 +860,14 @@
     ANGLE_PERF_WARNING(contextVk->getDebug(), GL_DEBUG_SEVERITY_HIGH,
                        "Texture copied on CPU due to format restrictions");
 
-    if (sourceLevelGL != gl::LevelIndex(0))
-    {
-        WARN() << "glCopyTextureCHROMIUM with sourceLevel != 0 not implemented.";
-        return angle::Result::Stop;
-    }
-
     // Read back the requested region of the source texture
     uint8_t *sourceData = nullptr;
     ANGLE_TRY(source->copyImageDataToBufferAndGetData(contextVk, sourceLevelGL, sourceBox.depth,
                                                       sourceBox, &sourceData));
 
-    const angle::Format &sourceTextureFormat = sourceVkFormat.actualImageFormat();
-    const angle::Format &destTextureFormat   = destVkFormat.actualImageFormat();
+    const angle::Format &sourceTextureFormat = source->getImage().getActualFormat();
+    const angle::Format &destTextureFormat =
+        destVkFormat.getActualImageFormat(getRequiredImageAccess());
     size_t destinationAllocationSize =
         sourceBox.width * sourceBox.height * sourceBox.depth * destTextureFormat.pixelBytes;
 
@@ -872,15 +895,16 @@
 
     // Use context's staging buffer if possible
     vk::DynamicBuffer *contextStagingBuffer = nullptr;
-    if (mImage->valid() && !shouldUpdateBeStaged(gl::LevelIndex(index.getLevelIndex())))
+    if (mImage->valid() &&
+        !shouldUpdateBeStaged(gl::LevelIndex(index.getLevelIndex()), destFormatID))
     {
         contextStagingBuffer = contextVk->getStagingBuffer();
     }
 
     uint8_t *destData = nullptr;
-    ANGLE_TRY(mImage->stageSubresourceUpdateAndGetData(contextVk, destinationAllocationSize,
-                                                       stagingIndex, stagingExtents, stagingOffset,
-                                                       &destData, contextStagingBuffer));
+    ANGLE_TRY(mImage->stageSubresourceUpdateAndGetData(
+        contextVk, destinationAllocationSize, stagingIndex, stagingExtents, stagingOffset,
+        &destData, contextStagingBuffer, destFormatID));
 
     // Source and dest data is tightly packed
     GLuint sourceDataRowPitch = sourceBox.width * sourceTextureFormat.pixelBytes;
@@ -895,13 +919,13 @@
     // Fix up the read/write functions for the sake of luminance/alpha that are emulated with
     // formats whose channels don't correspond to the original format (alpha is emulated with red,
     // and luminance/alpha is emulated with red/green).
-    if (sourceVkFormat.intendedFormat().isLUMA())
+    if (sourceIntendedFormat.isLUMA())
     {
-        pixelReadFunction = sourceVkFormat.intendedFormat().pixelReadFunction;
+        pixelReadFunction = sourceIntendedFormat.pixelReadFunction;
     }
-    if (destVkFormat.intendedFormat().isLUMA())
+    if (destVkFormat.getIntendedFormat().isLUMA())
     {
-        pixelWriteFunction = destVkFormat.intendedFormat().pixelWriteFunction;
+        pixelWriteFunction = destVkFormat.getIntendedFormat().pixelWriteFunction;
     }
 
     CopyImageCHROMIUM(sourceData, sourceDataRowPitch, sourceTextureFormat.pixelBytes,
@@ -972,7 +996,9 @@
     bool isSelfCopy = mImage == srcImage;
 
     // If destination is valid, copy the source directly into it.
-    if (mImage->valid() && !shouldUpdateBeStaged(level) && !isSelfCopy)
+    if (mImage->valid() &&
+        !shouldUpdateBeStaged(level, destFormat.getActualImageFormatID(getRequiredImageAccess())) &&
+        !isSelfCopy)
     {
         // Make sure any updates to the image are already flushed.
         ANGLE_TRY(ensureImageInitialized(contextVk, ImageMipLevels::EnabledLevels));
@@ -1008,10 +1034,11 @@
         std::unique_ptr<vk::RefCounted<vk::ImageHelper>> stagingImage;
         stagingImage = std::make_unique<vk::RefCounted<vk::ImageHelper>>();
 
-        ANGLE_TRY(
-            stagingImage->get().init2DStaging(contextVk, false, renderer->getMemoryProperties(),
-                                              gl::Extents(sourceBox.width, sourceBox.height, 1),
-                                              destFormat, kTransferStagingImageFlags, layerCount));
+        ANGLE_TRY(stagingImage->get().init2DStaging(
+            contextVk, mState.hasProtectedContent(), renderer->getMemoryProperties(),
+            gl::Extents(sourceBox.width, sourceBox.height, 1), destFormat.getIntendedFormatID(),
+            destFormat.getActualImageFormatID(getRequiredImageAccess()), kTransferStagingImageFlags,
+            layerCount));
 
         access.onImageTransferWrite(gl::LevelIndex(0), 1, 0, layerCount, VK_IMAGE_ASPECT_COLOR_BIT,
                                     &stagingImage->get());
@@ -1063,7 +1090,7 @@
     RendererVk *renderer = contextVk->getRenderer();
     UtilsVk &utilsVk     = contextVk->getUtils();
 
-    // Potentially make adjustments for pre-rotatation.
+    // Potentially make adjustments for pre-rotation.
     gl::Box rotatedSourceBox = sourceBox;
     gl::Extents srcExtents   = srcImage->getLevelExtents2D(vk::LevelIndex(0));
     switch (srcFramebufferRotation)
@@ -1132,9 +1159,17 @@
     // Perform self-copies through a staging buffer.
     // TODO: optimize to copy directly if possible.  http://anglebug.com/4719
     bool isSelfCopy = mImage == srcImage;
+    params.srcColorEncoding =
+        gl::GetSizedInternalFormatInfo(srcImage->getIntendedFormat().glInternalFormat)
+            .colorEncoding;
+    params.destColorEncoding =
+        gl::GetSizedInternalFormatInfo(destFormat.getIntendedFormat().glInternalFormat)
+            .colorEncoding;
 
     // If destination is valid, copy the source directly into it.
-    if (mImage->valid() && !shouldUpdateBeStaged(level) && !isSelfCopy)
+    if (mImage->valid() &&
+        !shouldUpdateBeStaged(level, destFormat.getActualImageFormatID(getRequiredImageAccess())) &&
+        !isSelfCopy)
     {
         // Make sure any updates to the image are already flushed.
         ANGLE_TRY(ensureImageInitialized(contextVk, ImageMipLevels::EnabledLevels));
@@ -1159,10 +1194,11 @@
         std::unique_ptr<vk::RefCounted<vk::ImageHelper>> stagingImage;
         stagingImage = std::make_unique<vk::RefCounted<vk::ImageHelper>>();
 
-        ANGLE_TRY(
-            stagingImage->get().init2DStaging(contextVk, false, renderer->getMemoryProperties(),
-                                              gl::Extents(sourceBox.width, sourceBox.height, 1),
-                                              destFormat, kDrawStagingImageFlags, layerCount));
+        ANGLE_TRY(stagingImage->get().init2DStaging(
+            contextVk, mState.hasProtectedContent(), renderer->getMemoryProperties(),
+            gl::Extents(sourceBox.width, sourceBox.height, 1), destFormat.getIntendedFormatID(),
+            destFormat.getActualImageFormatID(getRequiredImageAccess()), kDrawStagingImageFlags,
+            layerCount));
 
         params.destOffset[0] = 0;
         params.destOffset[1] = 0;
@@ -1247,15 +1283,9 @@
 
     ASSERT(mState.getImmutableFormat());
     ASSERT(!mRedefinedLevels.any());
-
-    // For immutable texture, we always allocate the full immutable levels specified by texStorage
-    // call.
-    const gl::ImageDesc &Level0Desc  = mState.getLevelZeroDesc();
-    const gl::Extents &Level0Extents = Level0Desc.size;
-    const uint32_t levelCount        = mState.getImmutableLevels();
-
-    ANGLE_TRY(
-        initImage(contextVk, format, Level0Desc.format.info->sized, Level0Extents, 0, levelCount));
+    ANGLE_TRY(initImage(contextVk, format.getIntendedFormatID(),
+                        format.getActualImageFormatID(getRequiredImageAccess()),
+                        ImageMipLevels::FullMipChain));
 
     return angle::Result::Continue;
 }
@@ -1283,9 +1313,12 @@
 
     ANGLE_TRY(memoryObjectVk->createImage(contextVk, type, levels, internalFormat, size, offset,
                                           mImage, createFlags, usageFlags));
+    mImageUsageFlags  = usageFlags;
+    mImageCreateFlags = createFlags;
 
     gl::Format glFormat(internalFormat);
-    ANGLE_TRY(initImageViews(contextVk, format, glFormat.info->sized, static_cast<uint32_t>(levels),
+    ANGLE_TRY(initImageViews(contextVk, format.getActualImageFormat(getRequiredImageAccess()),
+                             glFormat.info->sized, static_cast<uint32_t>(levels),
                              mImage->getLayerCount()));
 
     return angle::Result::Continue;
@@ -1340,7 +1373,8 @@
                    gl::LevelIndex(mState.getEffectiveBaseLevel()), false);
 
     ASSERT(type != gl::TextureType::CubeMap);
-    ANGLE_TRY(initImageViews(contextVk, format, image->getFormat().info->sized, 1, 1));
+    ANGLE_TRY(initImageViews(contextVk, format.getActualImageFormat(getRequiredImageAccess()),
+                             image->getFormat().info->sized, 1, 1));
 
     // Transfer the image to this queue if needed
     uint32_t rendererQueueFamilyIndex = renderer->getQueueFamilyIndex();
@@ -1428,6 +1462,7 @@
         releaseStagingBuffer(contextVk);
         mImageObserverBinding.bind(nullptr);
         mRequiresMutableStorage = false;
+        mRequiredImageAccess    = vk::ImageAccess::SampleOnly;
         mImageCreateFlags       = 0;
         SafeDelete(mImage);
     }
@@ -1435,24 +1470,24 @@
     mRedefinedLevels.reset();
 }
 
-void TextureVk::initImageUsageFlags(ContextVk *contextVk, const vk::Format &format)
+void TextureVk::initImageUsageFlags(ContextVk *contextVk, angle::FormatID actualFormatID)
 {
     mImageUsageFlags = VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT |
                        VK_IMAGE_USAGE_SAMPLED_BIT;
 
     // If the image has depth/stencil support, add those as possible usage.
     RendererVk *renderer = contextVk->getRenderer();
-    if (format.actualImageFormat().hasDepthOrStencilBits())
+    if (angle::Format::Get(actualFormatID).hasDepthOrStencilBits())
     {
         // Work around a bug in the Mock ICD:
         // https://github.com/KhronosGroup/Vulkan-Tools/issues/445
-        if (renderer->hasImageFormatFeatureBits(format.actualImageFormatID,
+        if (renderer->hasImageFormatFeatureBits(actualFormatID,
                                                 VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT))
         {
             mImageUsageFlags |= VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT;
         }
     }
-    else if (renderer->hasImageFormatFeatureBits(format.actualImageFormatID,
+    else if (renderer->hasImageFormatFeatureBits(actualFormatID,
                                                  VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT))
     {
         mImageUsageFlags |=
@@ -1474,10 +1509,11 @@
         // the format should not affect the currently allocated image.  The following function only
         // takes the alignment requirement to make sure the format is not accidentally used for any
         // other purpose.
-        updateImageHelper(contextVk, format.getImageCopyBufferAlignment());
+        updateImageHelper(contextVk, vk::GetImageCopyBufferAlignment(
+                                         format.getActualImageFormatID(getRequiredImageAccess())));
     }
 
-    initImageUsageFlags(contextVk, format);
+    initImageUsageFlags(contextVk, format.getActualImageFormatID(getRequiredImageAccess()));
 
     return angle::Result::Continue;
 }
@@ -1495,12 +1531,19 @@
 
     mImageObserverBinding.bind(imageHelper);
 
-    mOwnsImage        = selfOwned;
+    mOwnsImage = selfOwned;
+    // If image is shared between other container objects, force it to renderable format since we
+    // don't know if other container object will render or not.
+    if (!mOwnsImage)
+    {
+        mRequiredImageAccess = vk::ImageAccess::Renderable;
+    }
     mImageNativeType  = imageType;
     mImageLevelOffset = imageLevelOffset;
     mImageLayerOffset = imageLayerOffset;
     mImage            = imageHelper;
-    updateImageHelper(contextVk, format.getImageCopyBufferAlignment());
+    updateImageHelper(contextVk, vk::GetImageCopyBufferAlignment(
+                                     format.getActualImageFormatID(getRequiredImageAccess())));
 
     // Force re-creation of render targets next time they are needed
     for (auto &renderTargets : mSingleLayerRenderTargets)
@@ -1581,8 +1624,9 @@
             //   make sure any updates to this level are staged.
             bool isInAllocatedImage = IsTextureLevelInAllocatedImage(*mImage, levelIndexGL);
             bool isCompatibleRedefinition =
-                isInAllocatedImage &&
-                IsTextureLevelDefinitionCompatibleWithImage(*mImage, levelIndexGL, size, format);
+                isInAllocatedImage && IsTextureLevelDefinitionCompatibleWithImage(
+                                          *mImage, levelIndexGL, size, format.getIntendedFormatID(),
+                                          format.getActualImageFormatID(getRequiredImageAccess()));
 
             // Mark the level as incompatibly redefined if that's the case.  Note that if the level
             // was previously incompatibly defined, then later redefined to be compatible, the
@@ -1723,14 +1767,14 @@
     //
     // Support for the first two can be added easily.  Supporting 3D textures, MSAA and
     // depth/stencil would be more involved.
-    ASSERT(!mImage->getFormat().actualImageFormat().isSRGB);
-    ASSERT(!mImage->getFormat().actualImageFormat().isInt());
+    ASSERT(!mImage->getActualFormat().isSRGB);
+    ASSERT(!mImage->getActualFormat().isInt());
     ASSERT(mImage->getType() == VK_IMAGE_TYPE_2D);
     ASSERT(mImage->getSamples() == 1);
     ASSERT(mImage->getAspectFlags() == VK_IMAGE_ASPECT_COLOR_BIT);
 
     // Create the appropriate sampler.
-    GLenum filter = CalculateGenerateMipmapFilter(contextVk, mImage->getFormat());
+    GLenum filter = CalculateGenerateMipmapFilter(contextVk, mImage->getActualFormatID());
 
     gl::SamplerState samplerState;
     samplerState.setMinFilter(filter);
@@ -1828,7 +1872,7 @@
     ANGLE_TRY(copyImageDataToBufferAndGetData(contextVk, baseLevelGL, imageLayerCount, imageArea,
                                               &imageData));
 
-    const angle::Format &angleFormat = mImage->getFormat().actualImageFormat();
+    const angle::Format &angleFormat = mImage->getActualFormat();
     GLuint sourceRowPitch            = baseLevelExtents.width * angleFormat.pixelBytes;
     GLuint sourceDepthPitch          = sourceRowPitch * baseLevelExtents.height;
     size_t baseLevelAllocationSize   = sourceDepthPitch * baseLevelExtents.depth;
@@ -1872,7 +1916,7 @@
 
     // If it's possible to generate mipmap in compute, that would give the best possible
     // performance on some hardware.
-    if (CanGenerateMipmapWithCompute(renderer, mImage->getType(), mImage->getFormat(),
+    if (CanGenerateMipmapWithCompute(renderer, mImage->getType(), mImage->getActualFormatID(),
                                      mImage->getSamples()))
     {
         ASSERT((mImageUsageFlags & VK_IMAGE_USAGE_STORAGE_BIT) != 0);
@@ -1882,8 +1926,7 @@
 
         return generateMipmapsWithCompute(contextVk);
     }
-    else if (renderer->hasImageFormatFeatureBits(mImage->getFormat().actualImageFormatID,
-                                                 kBlitFeatureFlags))
+    else if (renderer->hasImageFormatFeatureBits(mImage->getActualFormatID(), kBlitFeatureFlags))
     {
         // Otherwise, use blit if possible.
         return mImage->generateMipmapsWithBlit(contextVk, baseLevel, maxLevel);
@@ -1959,8 +2002,9 @@
         // looking at one layer of a cube or 2D array texture.
         uint32_t layerCount =
             mState.getType() == gl::TextureType::_2D ? 1 : mImage->getLayerCount();
-        return initImageViews(contextVk, mImage->getFormat(), baseLevelDesc.format.info->sized,
-                              maxLevel - baseLevel + 1, layerCount);
+        return initImageViews(contextVk, mImage->getActualFormat(),
+                              baseLevelDesc.format.info->sized, maxLevel - baseLevel + 1,
+                              layerCount);
     }
 
     return respecifyImageStorageAndLevels(contextVk, mImage->getFirstAllocatedLevel(), baseLevel,
@@ -1987,10 +2031,11 @@
     const uint32_t levelCount = srcImage->getLevelCount();
     const uint32_t layerCount = srcImage->getLayerCount();
 
-    ANGLE_TRY(stagingImage->get().initStaging(contextVk, false, renderer->getMemoryProperties(),
-                                              srcImage->getType(), srcImage->getExtents(),
-                                              srcImage->getFormat(), srcImage->getSamples(),
-                                              kTransferStagingImageFlags, levelCount, layerCount));
+    ANGLE_TRY(stagingImage->get().initStaging(
+        contextVk, mState.hasProtectedContent(), renderer->getMemoryProperties(),
+        srcImage->getType(), srcImage->getExtents(), srcImage->getIntendedFormatID(),
+        srcImage->getActualFormatID(), srcImage->getSamples(), kTransferStagingImageFlags,
+        levelCount, layerCount));
 
     // Copy the src image wholly into the staging image
     const VkImageAspectFlags aspectFlags = srcImage->getAspectFlags();
@@ -2028,6 +2073,123 @@
     return angle::Result::Continue;
 }
 
+angle::Result TextureVk::reinitImageAsRenderable(ContextVk *contextVk,
+                                                 const vk::Format &format,
+                                                 gl::TexLevelMask skipLevelsMask)
+{
+    RendererVk *renderer = contextVk->getRenderer();
+
+    const uint32_t levelCount = mImage->getLevelCount();
+    const uint32_t layerCount = mImage->getLayerCount();
+
+    // Nothing to do if every level must be skipped
+    if ((~skipLevelsMask & gl::TexLevelMask(angle::BitMask<uint32_t>(levelCount))).none())
+    {
+        return angle::Result::Continue;
+    }
+
+    ANGLE_PERF_WARNING(contextVk->getDebug(), GL_DEBUG_SEVERITY_LOW,
+                       "Copying data due to texture format fallback");
+
+    // Make sure the source is initialized and it's staged updates are flushed.
+    ASSERT(mImage->valid());
+    ANGLE_TRY(flushImageStagedUpdates(contextVk));
+
+    const angle::Format &srcFormat = mImage->getActualFormat();
+    const angle::Format &dstFormat = format.getActualImageFormat(getRequiredImageAccess());
+
+    // If layerCount or levelCount is bigger than 1, we go for the slow path for now. The problem
+    // with draw path is that in the multiple level/layer case, we have to do copy in a loop.
+    // Currently copySubImageImplWithDraw() calls ensureImageInitalized which forces flush out
+    // staged updates that we just staged inside the loop which is wrong.
+    if (levelCount == 1 && layerCount == 1)
+    {
+        ASSERT(CanCopyWithDraw(renderer, mImage->getActualFormatID(), mImage->getTilingMode(),
+                               format.getActualImageFormatID(getRequiredImageAccess()),
+                               getTilingMode()));
+        vk::LevelIndex levelVk(0);
+        gl::LevelIndex sourceLevelGL = mImage->toGLLevel(levelVk);
+        gl::Box sourceBox(gl::kOffsetZero, mImage->getLevelExtents(levelVk));
+        const gl::ImageIndex index =
+            gl::ImageIndex::MakeFromType(mState.getType(), sourceLevelGL.get());
+        return copySubImageImplWithDraw(contextVk, index, gl::kOffsetZero, format, sourceLevelGL,
+                                        sourceBox, false, false, false, false, mImage,
+                                        &getCopyImageViewAndRecordUse(contextVk),
+                                        SurfaceRotation::Identity);
+    }
+
+    for (vk::LevelIndex levelVk(0); levelVk < vk::LevelIndex(levelCount); ++levelVk)
+    {
+        if (skipLevelsMask.test(levelVk.get()))
+        {
+            continue;
+        }
+
+        gl::LevelIndex sourceLevelGL = mImage->toGLLevel(levelVk);
+        gl::Box sourceBox(gl::kOffsetZero, mImage->getLevelExtents(levelVk));
+        // copy and stage entire layer
+        const gl::ImageIndex index =
+            gl::ImageIndex::MakeFromType(mState.getType(), sourceLevelGL.get(), 0, layerCount);
+
+        // Read back the requested region of the source texture
+        uint8_t *srcData                               = nullptr;
+        vk::BufferHelper *srcBuffer                    = nullptr;
+        size_t srcBufferSize                           = 0;
+        vk::StagingBufferOffsetArray sourceCopyOffsets = {0, 0};
+        ANGLE_TRY(mImage->copyImageDataToBuffer(contextVk, sourceLevelGL, layerCount, 0, sourceBox,
+                                                &srcBuffer, &srcBufferSize, &sourceCopyOffsets,
+                                                &srcData));
+
+        // Explicitly finish. If new use cases arise where we don't want to block we can change
+        // this.
+        ANGLE_TRY(contextVk->finishImpl());
+
+        size_t dstBufferSize = sourceBox.width * sourceBox.height * sourceBox.depth *
+                               dstFormat.pixelBytes * layerCount;
+
+        // Allocate memory in the destination texture for the copy/conversion
+        uint8_t *dstData = nullptr;
+        ANGLE_TRY(mImage->stageSubresourceUpdateAndGetData(
+            contextVk, dstBufferSize, index, mImage->getLevelExtents(levelVk), gl::kOffsetZero,
+            &dstData, nullptr, dstFormat.id));
+
+        // Source and dest data is tightly packed
+        GLuint srcDataRowPitch = sourceBox.width * srcFormat.pixelBytes;
+        GLuint dstDataRowPitch = sourceBox.width * dstFormat.pixelBytes;
+
+        GLuint srcDataDepthPitch = srcDataRowPitch * sourceBox.height;
+        GLuint dstDataDepthPitch = dstDataRowPitch * sourceBox.height;
+
+        GLuint srcDataLayerPitch = srcDataDepthPitch * sourceBox.depth;
+        GLuint dstDataLayerPitch = dstDataDepthPitch * sourceBox.depth;
+
+        rx::PixelReadFunction pixelReadFunction   = srcFormat.pixelReadFunction;
+        rx::PixelWriteFunction pixelWriteFunction = dstFormat.pixelWriteFunction;
+
+        // Fix up the read/write functions for the sake of luminance/alpha that are emulated with
+        // formats whose channels don't correspond to the original format (alpha is emulated with
+        // red, and luminance/alpha is emulated with red/green).
+        if (format.getIntendedFormat().isLUMA())
+        {
+            pixelReadFunction  = format.getIntendedFormat().pixelReadFunction;
+            pixelWriteFunction = format.getIntendedFormat().pixelWriteFunction;
+        }
+
+        const gl::InternalFormat &destFormatInfo = *mState.getImageDesc(index).format.info;
+        for (uint32_t layer = 0; layer < layerCount; layer++)
+        {
+            CopyImageCHROMIUM(srcData + layer * srcDataLayerPitch, srcDataRowPitch,
+                              srcFormat.pixelBytes, srcDataDepthPitch, pixelReadFunction,
+                              dstData + layer * dstDataLayerPitch, dstDataRowPitch,
+                              dstFormat.pixelBytes, dstDataDepthPitch, pixelWriteFunction,
+                              destFormatInfo.format, destFormatInfo.componentType, sourceBox.width,
+                              sourceBox.height, sourceBox.depth, false, false, false);
+        }
+    }
+
+    return angle::Result::Continue;
+}
+
 angle::Result TextureVk::respecifyImageStorage(ContextVk *contextVk)
 {
     return respecifyImageStorageAndLevels(contextVk, mImage->getFirstAllocatedLevel(),
@@ -2044,7 +2206,6 @@
     {
         ASSERT((mImage->getFirstAllocatedLevel() == gl::LevelIndex(0)) ||
                (mImage->getFirstAllocatedLevel() == baseLevel));
-        ASSERT(!mState.getImmutableFormat());
         releaseImage(contextVk);
         return angle::Result::Continue;
     }
@@ -2060,7 +2221,7 @@
     {
         // Cache values needed for copy and stage operations
         vk::ImageHelper *srcImage = mImage;
-        const vk::Format &format  = mImage->getFormat();
+        const vk::Format &format  = getBaseLevelFormat(contextVk->getRenderer());
 
         // If any level was redefined but the image was not owned by the Texture, it's already
         // released and deleted by TextureVk::redefineLevel().
@@ -2071,27 +2232,10 @@
 
         // Create the image helper
         ANGLE_TRY(ensureImageAllocated(contextVk, format));
-
-        // Create the image. For immutable texture, we always allocate the full immutable levels
-        // specified by texStorage call. Otherwise we only try to allocate from base to max levels.
-        if (mState.getImmutableFormat())
-        {
-            const gl::ImageDesc &Level0Desc  = mState.getLevelZeroDesc();
-            const gl::Extents &Level0Extents = Level0Desc.size;
-            const uint32_t levelCount        = mState.getImmutableLevels();
-
-            ANGLE_TRY(initImage(contextVk, format, Level0Desc.format.info->sized, Level0Extents, 0,
-                                levelCount));
-        }
-        else
-        {
-            const gl::ImageDesc &baseLevelDesc  = mState.getBaseLevelDesc();
-            const gl::Extents &baseLevelExtents = baseLevelDesc.size;
-            const uint32_t levelCount           = getMipLevelCount(ImageMipLevels::EnabledLevels);
-
-            ANGLE_TRY(initImage(contextVk, format, baseLevelDesc.format.info->sized,
-                                baseLevelExtents, mState.getEffectiveBaseLevel(), levelCount));
-        }
+        ANGLE_TRY(initImage(contextVk, format.getIntendedFormatID(),
+                            format.getActualImageFormatID(getRequiredImageAccess()),
+                            mState.getImmutableFormat() ? ImageMipLevels::FullMipChain
+                                                        : ImageMipLevels::EnabledLevels));
 
         // Make a copy of the old image (that's being released) and stage that as an update to the
         // new image.
@@ -2099,8 +2243,17 @@
     }
     else
     {
-        // Make the image stage itself as updates to its levels.
-        mImage->stageSelfAsSubresourceUpdates(contextVk, mImage->getLevelCount(), mRedefinedLevels);
+        const vk::Format &format = getBaseLevelFormat(contextVk->getRenderer());
+        if (mImage->getActualFormatID() != format.getActualImageFormatID(getRequiredImageAccess()))
+        {
+            ANGLE_TRY(reinitImageAsRenderable(contextVk, format, mRedefinedLevels));
+        }
+        else
+        {
+            // Make the image stage itself as updates to its levels.
+            mImage->stageSelfAsSubresourceUpdates(contextVk, mImage->getLevelCount(),
+                                                  mRedefinedLevels);
+        }
 
         // Release the current image so that it will be recreated with the correct number of mip
         // levels, base level, and max level.
@@ -2135,7 +2288,8 @@
 
     ASSERT(mImage->getLayerCount() == 1);
     gl::Format glFormat(internalFormat);
-    return initImageViews(contextVk, format, glFormat.info->sized, 1, 1);
+    return initImageViews(contextVk, format.getActualImageFormat(getRequiredImageAccess()),
+                          glFormat.info->sized, 1, 1);
 }
 
 angle::Result TextureVk::releaseTexImage(const gl::Context *context)
@@ -2157,18 +2311,17 @@
 
     ContextVk *contextVk = vk::GetImpl(context);
 
+    ASSERT(mState.hasBeenBoundAsAttachment());
+    ANGLE_TRY(ensureRenderable(contextVk));
+
     if (!mImage->valid())
     {
         // Immutable texture must already have a valid image
         ASSERT(!mState.getImmutableFormat());
-
-        const gl::ImageDesc &baseLevelDesc  = mState.getBaseLevelDesc();
-        const gl::Extents &baseLevelExtents = baseLevelDesc.size;
-        const uint32_t levelCount           = getMipLevelCount(ImageMipLevels::EnabledLevels);
-        const vk::Format &format            = getBaseLevelFormat(contextVk->getRenderer());
-
-        ANGLE_TRY(initImage(contextVk, format, baseLevelDesc.format.info->sized, baseLevelExtents,
-                            mState.getEffectiveBaseLevel(), levelCount));
+        const vk::Format &format = getBaseLevelFormat(contextVk->getRenderer());
+        ANGLE_TRY(initImage(contextVk, format.getIntendedFormatID(),
+                            format.getActualImageFormatID(getRequiredImageAccess()),
+                            ImageMipLevels::EnabledLevels));
     }
 
     const bool hasRenderToTextureEXT =
@@ -2196,8 +2349,8 @@
 
         // Create the implicit multisampled image.
         ANGLE_TRY(multisampledImage->initImplicitMultisampledRenderToTexture(
-            contextVk, false, renderer->getMemoryProperties(), mState.getType(), samples, *mImage,
-            useRobustInit));
+            contextVk, mState.hasProtectedContent(), renderer->getMemoryProperties(),
+            mState.getType(), samples, *mImage, useRobustInit));
     }
 
     // Don't flush staged updates here. We'll handle that in FramebufferVk so it can defer clears.
@@ -2239,27 +2392,8 @@
         ASSERT(!mRedefinedLevels.any());
 
         const vk::Format &format = getBaseLevelFormat(contextVk->getRenderer());
-
-        // For immutable texture, we always allocate the full immutable levels specified by
-        // texStorage call. Otherwise we only try to allocate from base to max levels.
-        if (mState.getImmutableFormat())
-        {
-            const gl::ImageDesc &Level0Desc  = mState.getLevelZeroDesc();
-            const gl::Extents &Level0Extents = Level0Desc.size;
-            const uint32_t levelCount        = mState.getImmutableLevels();
-
-            ANGLE_TRY(initImage(contextVk, format, Level0Desc.format.info->sized, Level0Extents, 0,
-                                levelCount));
-        }
-        else
-        {
-            const gl::ImageDesc &baseLevelDesc  = mState.getBaseLevelDesc();
-            const gl::Extents &baseLevelExtents = baseLevelDesc.size;
-            const uint32_t levelCount           = getMipLevelCount(mipLevels);
-
-            ANGLE_TRY(initImage(contextVk, format, baseLevelDesc.format.info->sized,
-                                baseLevelExtents, mState.getEffectiveBaseLevel(), levelCount));
-        }
+        ANGLE_TRY(initImage(contextVk, format.getIntendedFormatID(),
+                            format.getActualImageFormatID(getRequiredImageAccess()), mipLevels));
 
         if (mipLevels == ImageMipLevels::FullMipChain)
         {
@@ -2420,7 +2554,9 @@
     const GLint samples                = baseLevelDesc.samples ? baseLevelDesc.samples : 1;
 
     // If the compute path is to be used to generate mipmaps, add the STORAGE usage.
-    if (CanGenerateMipmapWithCompute(contextVk->getRenderer(), imageType, format, samples))
+    if (CanGenerateMipmapWithCompute(contextVk->getRenderer(), imageType,
+                                     format.getActualImageFormatID(getRequiredImageAccess()),
+                                     samples))
     {
         mImageUsageFlags |= VK_IMAGE_USAGE_STORAGE_BIT;
     }
@@ -2459,6 +2595,12 @@
         mRequiresMutableStorage = true;
     }
 
+    // Create a new image if used as attachment for the first time.
+    if (mState.hasBeenBoundAsAttachment())
+    {
+        ANGLE_TRY(ensureRenderable(contextVk));
+    }
+
     // If we're handling dirty srgb decode/override state, we may have to reallocate the image with
     // VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT. Vulkan requires this bit to be set in order to use
     // imageviews with a format that does not match the texture's internal format.
@@ -2474,7 +2616,7 @@
 
     // Before redefining the image for any reason, check to see if it's about to go through mipmap
     // generation.  In that case, drop every staged change for the subsequent mips after base, and
-    // make sure the image is created with the complete mipchain.
+    // make sure the image is created with the complete mip chain.
     bool isGenerateMipmap = source == gl::Command::GenerateMipmap;
     if (isGenerateMipmap)
     {
@@ -2509,7 +2651,8 @@
     // then have more levels defined in it and mipmapping enabled.  In that case, the image needs
     // to be recreated.
     bool isMipmapEnabledByMinFilter = false;
-    if (!isGenerateMipmap && mImage->valid() && dirtyBits.test(gl::Texture::DIRTY_BIT_MIN_FILTER))
+    if (!isGenerateMipmap && mImage && mImage->valid() &&
+        dirtyBits.test(gl::Texture::DIRTY_BIT_MIN_FILTER))
     {
         isMipmapEnabledByMinFilter =
             mImage->getLevelCount() < getMipLevelCount(ImageMipLevels::EnabledLevels);
@@ -2517,7 +2660,7 @@
 
     // If generating mipmaps and the image needs to be recreated (not full-mip already, or changed
     // usage flags), make sure it's recreated.
-    if (isGenerateMipmap && mImage->valid() &&
+    if (isGenerateMipmap && mImage && mImage->valid() &&
         (oldUsageFlags != mImageUsageFlags ||
          (!mState.getImmutableFormat() &&
           mImage->getLevelCount() != getMipLevelCount(ImageMipLevels::FullMipChain))))
@@ -2540,7 +2683,7 @@
     // Respecify the image if it's changed in usage, or if any of its levels are redefined and no
     // update to base/max levels were done (otherwise the above call would have already taken care
     // of this).  Note that if both base/max and image usage are changed, the image is recreated
-    // twice, which incurs unncessary copies.  This is not expected to be happening in real
+    // twice, which incurs unnecessary copies.  This is not expected to be happening in real
     // applications.
     if (oldUsageFlags != mImageUsageFlags || oldCreateFlags != mImageCreateFlags ||
         mRedefinedLevels.any() || isMipmapEnabledByMinFilter)
@@ -2584,7 +2727,7 @@
     }
 
     vk::SamplerDesc samplerDesc(contextVk, mState.getSamplerState(), mState.isStencilMode(),
-                                mImage->getExternalFormat(), mImage->getFormat().intendedFormatID);
+                                mImage->getExternalFormat(), mImage->getIntendedFormatID());
     ANGLE_TRY(renderer->getSamplerCache().getSampler(contextVk, samplerDesc, &mSampler));
 
     return angle::Result::Continue;
@@ -2601,7 +2744,9 @@
     ASSERT(mImage);
     // Note that we cannot ensure the image is initialized because we might be calling subImage
     // on a non-complete cube map.
-    return mImage->stageRobustResourceClearWithFormat(contextVk, imageIndex, desc.size, format);
+    return mImage->stageRobustResourceClearWithFormat(
+        contextVk, imageIndex, desc.size, format.getIntendedFormat(),
+        format.getActualImageFormat(getRequiredImageAccess()));
 }
 
 void TextureVk::releaseOwnershipOfImage(const gl::Context *context)
@@ -2618,10 +2763,11 @@
 {
     // By default, we decode SRGB images.
     const vk::Format &format = getBaseLevelFormat(contextVk->getRenderer());
-    bool decodeSRGB          = format.actualImageFormat().isSRGB;
+    bool decodeSRGB          = format.getActualImageFormat(getRequiredImageAccess()).isSRGB;
 
     // If the SRGB override is enabled, we also decode SRGB.
-    if (isSRGBOverrideEnabled() && IsOverridableLinearFormat(format.actualImageFormatID))
+    if (isSRGBOverrideEnabled() &&
+        IsOverridableLinearFormat(format.getActualImageFormatID(getRequiredImageAccess())))
     {
         decodeSRGB = true;
     }
@@ -2694,9 +2840,10 @@
     const vk::ImageViewHelper &imageViews = getImageViews();
     imageViews.retain(&contextVk->getResourceUseList());
 
-    ASSERT(mImage->getFormat().actualImageFormat().isSRGB ==
-           (ConvertToLinear(mImage->getFormat().actualImageFormatID) != angle::FormatID::NONE));
-    if (mImage->getFormat().actualImageFormat().isSRGB)
+    const angle::Format &angleFormat = mImage->getActualFormat();
+    ASSERT(angleFormat.isSRGB ==
+           (ConvertToLinear(mImage->getActualFormatID()) != angle::FormatID::NONE));
+    if (angleFormat.isSRGB)
     {
         return imageViews.getSRGBCopyImageView();
     }
@@ -2725,7 +2872,7 @@
     angle::FormatID formatID = angle::Format::InternalFormatToID(binding.format);
     const vk::Format *format = &contextVk->getRenderer()->getFormat(formatID);
 
-    format = AdjustStorageViewFormatPerWorkarounds(contextVk, format);
+    format = AdjustStorageViewFormatPerWorkarounds(contextVk, format, getRequiredImageAccess());
 
     gl::LevelIndex nativeLevelGL =
         getNativeImageLevel(gl::LevelIndex(static_cast<uint32_t>(binding.level)));
@@ -2737,16 +2884,16 @@
 
         return getImageViews().getLevelLayerStorageImageView(
             contextVk, *mImage, nativeLevelVk, nativeLayer,
-            VK_IMAGE_USAGE_SAMPLED_BIT | VK_IMAGE_USAGE_STORAGE_BIT, format->actualImageFormatID,
-            imageViewOut);
+            VK_IMAGE_USAGE_SAMPLED_BIT | VK_IMAGE_USAGE_STORAGE_BIT,
+            format->getActualImageFormatID(getRequiredImageAccess()), imageViewOut);
     }
 
     uint32_t nativeLayer = getNativeImageLayer(0);
 
     return getImageViews().getLevelStorageImageView(
         contextVk, mState.getType(), *mImage, nativeLevelVk, nativeLayer,
-        VK_IMAGE_USAGE_SAMPLED_BIT | VK_IMAGE_USAGE_STORAGE_BIT, format->actualImageFormatID,
-        imageViewOut);
+        VK_IMAGE_USAGE_SAMPLED_BIT | VK_IMAGE_USAGE_STORAGE_BIT,
+        format->getActualImageFormatID(getRequiredImageAccess()), imageViewOut);
 }
 
 angle::Result TextureVk::getBufferViewAndRecordUse(ContextVk *contextVk,
@@ -2767,7 +2914,8 @@
 
     if (isImage)
     {
-        imageUniformFormat = AdjustStorageViewFormatPerWorkarounds(contextVk, imageUniformFormat);
+        imageUniformFormat = AdjustStorageViewFormatPerWorkarounds(contextVk, imageUniformFormat,
+                                                                   getRequiredImageAccess());
     }
 
     // Create a view for the required format.
@@ -2780,40 +2928,70 @@
 }
 
 angle::Result TextureVk::initImage(ContextVk *contextVk,
-                                   const vk::Format &format,
-                                   const bool sized,
-                                   const gl::Extents &firstLevelExtents,
-                                   const uint32_t firstLevel,
-                                   const uint32_t levelCount)
+                                   angle::FormatID intendedImageFormatID,
+                                   angle::FormatID actualImageFormatID,
+                                   ImageMipLevels mipLevels)
 {
     RendererVk *renderer = contextVk->getRenderer();
 
+    // Create the image. For immutable texture, we always allocate the full immutable levels
+    // specified by texStorage call. Otherwise we only try to allocate from base to max levels.
+    const gl::ImageDesc *firstLevelDesc;
+    uint32_t firstLevel, levelCount;
+    if (mState.getImmutableFormat())
+    {
+        firstLevelDesc = &mState.getLevelZeroDesc();
+        firstLevel     = 0;
+        levelCount     = mState.getImmutableLevels();
+    }
+    else
+    {
+        firstLevelDesc = &mState.getBaseLevelDesc();
+        firstLevel     = mState.getEffectiveBaseLevel();
+        levelCount     = getMipLevelCount(mipLevels);
+    }
+    const bool sized                     = firstLevelDesc->format.info->sized;
+    const gl::Extents &firstLevelExtents = firstLevelDesc->size;
+
     VkExtent3D vkExtent;
     uint32_t layerCount;
     gl_vk::GetExtentsAndLayerCount(mState.getType(), firstLevelExtents, &vkExtent, &layerCount);
     GLint samples = mState.getBaseLevelDesc().samples ? mState.getBaseLevelDesc().samples : 1;
 
+    if (mState.hasProtectedContent())
+    {
+        mImageCreateFlags |= VK_IMAGE_CREATE_PROTECTED_BIT;
+    }
+
     bool imageFormatListEnabled = false;
-    ANGLE_TRY(mImage->initExternal(
-        contextVk, mState.getType(), vkExtent, format, samples, mImageUsageFlags, mImageCreateFlags,
-        vk::ImageLayout::Undefined, nullptr, gl::LevelIndex(firstLevel), levelCount, layerCount,
-        contextVk->isRobustResourceInitEnabled(), &imageFormatListEnabled, false));
+    ANGLE_TRY(mImage->initExternal(contextVk, mState.getType(), vkExtent, intendedImageFormatID,
+                                   actualImageFormatID, samples, mImageUsageFlags,
+                                   mImageCreateFlags, vk::ImageLayout::Undefined, nullptr,
+                                   gl::LevelIndex(firstLevel), levelCount, layerCount,
+                                   contextVk->isRobustResourceInitEnabled(),
+                                   &imageFormatListEnabled, mState.hasProtectedContent()));
 
     mRequiresMutableStorage = (mImageCreateFlags & VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT) != 0;
 
-    const VkMemoryPropertyFlags flags = VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT;
+    VkMemoryPropertyFlags flags = VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT;
+    if (mState.hasProtectedContent())
+    {
+        flags |= VK_MEMORY_PROPERTY_PROTECTED_BIT;
+    }
 
-    ANGLE_TRY(mImage->initMemory(contextVk, false, renderer->getMemoryProperties(), flags));
+    ANGLE_TRY(mImage->initMemory(contextVk, mState.hasProtectedContent(),
+                                 renderer->getMemoryProperties(), flags));
 
     const uint32_t viewLevelCount =
         mState.getImmutableFormat() ? getMipLevelCount(ImageMipLevels::EnabledLevels) : levelCount;
-    ANGLE_TRY(initImageViews(contextVk, format, sized, viewLevelCount, layerCount));
+    ANGLE_TRY(initImageViews(contextVk, angle::Format::Get(actualImageFormatID), sized,
+                             viewLevelCount, layerCount));
 
     return angle::Result::Continue;
 }
 
 angle::Result TextureVk::initImageViews(ContextVk *contextVk,
-                                        const vk::Format &format,
+                                        const angle::Format &format,
                                         const bool sized,
                                         uint32_t levelCount,
                                         uint32_t layerCount)
@@ -2825,8 +3003,9 @@
     vk::LevelIndex baseLevelVk = mImage->toVkLevel(baseLevelGL);
     uint32_t baseLayer         = getNativeImageLayer(0);
 
-    gl::SwizzleState formatSwizzle = GetFormatSwizzle(contextVk, format, sized);
-    gl::SwizzleState readSwizzle   = ApplySwizzle(formatSwizzle, mState.getSwizzleState());
+    const angle::Format &intendedFormat = mImage->getIntendedFormat();
+    gl::SwizzleState formatSwizzle      = GetFormatSwizzle(contextVk, intendedFormat, sized);
+    gl::SwizzleState readSwizzle        = ApplySwizzle(formatSwizzle, mState.getSwizzleState());
 
     // Use this as a proxy for the SRGB override & skip decode settings.
     bool createExtraSRGBViews = mRequiresMutableStorage;
@@ -2956,7 +3135,8 @@
         ANGLE_TRY(mImage->stageSubresourceUpdateAndGetData(
             contextVk, mipAllocationSize,
             gl::ImageIndex::MakeFromType(mState.getType(), currentMipLevel.get(), layer),
-            mipLevelExtents, gl::Offset(), &destData, contextVk->getStagingBuffer()));
+            mipLevelExtents, gl::Offset(), &destData, contextVk->getStagingBuffer(),
+            sourceFormat.id));
 
         // Generate the mipmap into that new buffer
         sourceFormat.mipGenerationFunction(
@@ -2981,13 +3161,13 @@
 
     if (mImage && mImage->valid())
     {
-        sizedFormat = mImage->getFormat().actualImageFormat().glInternalFormat;
+        sizedFormat = mImage->getActualFormat().glInternalFormat;
     }
     else
     {
         ContextVk *contextVk     = vk::GetImpl(context);
         const vk::Format &format = getBaseLevelFormat(contextVk->getRenderer());
-        sizedFormat              = format.actualImageFormat().glInternalFormat;
+        sizedFormat = format.getActualImageFormat(getRequiredImageAccess()).glInternalFormat;
     }
 
     return gl::GetSizedInternalFormatInfo(sizedFormat);
@@ -3015,22 +3195,39 @@
                                      void *pixels)
 {
     ContextVk *contextVk = vk::GetImpl(context);
+    ANGLE_TRY(ensureImageInitialized(contextVk, ImageMipLevels::EnabledLevels));
 
-    // Assumes Texture is consistent.
-    // TODO(http://anglebug.com/4058): Handle incomplete textures.
-    if (!mImage || !mImage->valid())
+    GLint baseLevel = static_cast<int>(mState.getBaseLevel());
+    if (level < baseLevel || level >= baseLevel + static_cast<int>(mState.getEnabledLevelCount()))
     {
-        ANGLE_TRY(ensureImageInitialized(contextVk, ImageMipLevels::EnabledLevels));
+        // TODO(http://anglebug.com/6336): Handle inconsistent textures.
+        WARN() << "GetTexImage for inconsistent texture levels is not implemented.";
+        UNIMPLEMENTED();
+        return angle::Result::Continue;
     }
 
-    size_t layer =
-        gl::IsCubeMapFaceTarget(target) ? gl::CubeMapTextureTargetToFaceIndex(target) : 0;
-
     gl::MaybeOverrideLuminance(format, type, getColorReadFormat(context),
                                getColorReadType(context));
 
+    uint32_t layer      = 0;
+    uint32_t layerCount = 1;
+
+    switch (target)
+    {
+        case gl::TextureTarget::CubeMapArray:
+        case gl::TextureTarget::_2DArray:
+            layerCount = mImage->getLayerCount();
+            break;
+        default:
+            if (gl::IsCubeMapFaceTarget(target))
+            {
+                layer = static_cast<uint32_t>(gl::CubeMapTextureTargetToFaceIndex(target));
+            }
+            break;
+    }
+
     return mImage->readPixelsForGetImage(contextVk, packState, packBuffer, gl::LevelIndex(level),
-                                         static_cast<uint32_t>(layer), format, type, pixels);
+                                         layer, layerCount, format, type, pixels);
 }
 
 const vk::Format &TextureVk::getBaseLevelFormat(RendererVk *renderer) const
@@ -3041,10 +3238,12 @@
 
 void TextureVk::onSubjectStateChange(angle::SubjectIndex index, angle::SubjectMessage message)
 {
-    ASSERT(index == kTextureImageSubjectIndex && message == angle::SubjectMessage::SubjectChanged);
+    ASSERT(index == kTextureImageSubjectIndex &&
+           (message == angle::SubjectMessage::SubjectChanged ||
+            message == angle::SubjectMessage::InitializationComplete));
 
     // Forward the notification to the parent that the staging buffer changed.
-    onStateChange(angle::SubjectMessage::SubjectChanged);
+    onStateChange(message);
 }
 
 vk::ImageOrBufferViewSubresourceSerial TextureVk::getImageViewSubresourceSerial(
@@ -3052,15 +3251,17 @@
 {
     gl::LevelIndex baseLevel(mState.getEffectiveBaseLevel());
     // getMipmapMaxLevel will clamp to the max level if it is smaller than the number of mips.
-    uint32_t levelCount               = gl::LevelIndex(mState.getMipmapMaxLevel()) - baseLevel + 1;
-    vk::SrgbDecodeMode srgbDecodeMode = (mImage->getFormat().actualImageFormat().isSRGB &&
-                                         (samplerState.getSRGBDecode() == GL_DECODE_EXT))
-                                            ? vk::SrgbDecodeMode::SrgbDecode
-                                            : vk::SrgbDecodeMode::SkipDecode;
-    gl::SrgbOverride srgbOverrideMode = (!mImage->getFormat().actualImageFormat().isSRGB &&
-                                         (mState.getSRGBOverride() == gl::SrgbOverride::SRGB))
-                                            ? gl::SrgbOverride::SRGB
-                                            : gl::SrgbOverride::Default;
+    uint32_t levelCount = gl::LevelIndex(mState.getMipmapMaxLevel()) - baseLevel + 1;
+
+    const angle::Format &angleFormat = mImage->getActualFormat();
+    vk::SrgbDecodeMode srgbDecodeMode =
+        (angleFormat.isSRGB && (samplerState.getSRGBDecode() == GL_DECODE_EXT))
+            ? vk::SrgbDecodeMode::SrgbDecode
+            : vk::SrgbDecodeMode::SkipDecode;
+    gl::SrgbOverride srgbOverrideMode =
+        (!angleFormat.isSRGB && (mState.getSRGBOverride() == gl::SrgbOverride::SRGB))
+            ? gl::SrgbOverride::SRGB
+            : gl::SrgbOverride::Default;
 
     return getImageViews().getSubresourceSerial(baseLevel, levelCount, 0, vk::LayerMode::All,
                                                 srgbDecodeMode, srgbOverrideMode);
@@ -3080,7 +3281,7 @@
     getImageViews().release(contextVk->getRenderer());
     const gl::ImageDesc &baseLevelDesc = mState.getBaseLevelDesc();
 
-    ANGLE_TRY(initImageViews(contextVk, mImage->getFormat(), baseLevelDesc.format.info->sized,
+    ANGLE_TRY(initImageViews(contextVk, mImage->getActualFormat(), baseLevelDesc.format.info->sized,
                              mImage->getLevelCount(), layerCount));
 
     // Let any Framebuffers know we need to refresh the RenderTarget cache.
@@ -3104,4 +3305,79 @@
 
     return refreshImageViews(contextVk);
 }
+
+angle::Result TextureVk::ensureRenderable(ContextVk *contextVk)
+{
+    if (mRequiredImageAccess == vk::ImageAccess::Renderable)
+    {
+        return angle::Result::Continue;
+    }
+
+    mRequiredImageAccess = vk::ImageAccess::Renderable;
+    if (!mImage)
+    {
+        // Later on when ensureImageAllocated() is called, it will ensure a renderable format is
+        // used.
+        return angle::Result::Continue;
+    }
+
+    RendererVk *renderer     = contextVk->getRenderer();
+    const vk::Format &format = getBaseLevelFormat(renderer);
+    if (!format.hasRenderableImageFallbackFormat())
+    {
+        // If there is no fallback format for renderable, then nothing to do.
+        return angle::Result::Continue;
+    }
+
+    if (!mImage->valid())
+    {
+        // Immutable texture must already have a valid image
+        ASSERT(!mState.getImmutableFormat());
+        // If we have staged update and it was encoded with different format, we need to flush out
+        // these staged update. The respecifyImageStorage should handle read back data and re-stage
+        // data with new format.
+        angle::FormatID intendedFormatID = format.getIntendedFormatID();
+        angle::FormatID actualFormatID = format.getActualImageFormatID(vk::ImageAccess::Renderable);
+
+        gl::LevelIndex levelGLStart, levelGLEnd;
+        ImageMipLevels mipLevels;
+        if (mState.getImmutableFormat())
+        {
+            levelGLStart = gl::LevelIndex(0);
+            levelGLEnd   = gl::LevelIndex(mState.getImmutableLevels());
+            mipLevels    = ImageMipLevels::FullMipChain;
+        }
+        else
+        {
+            levelGLStart = gl::LevelIndex(mState.getEffectiveBaseLevel());
+            levelGLEnd =
+                gl::LevelIndex(levelGLStart + getMipLevelCount(ImageMipLevels::EnabledLevels));
+            mipLevels = ImageMipLevels::EnabledLevels;
+        }
+
+        if (mImage->hasStagedUpdatesWithMismatchedFormat(levelGLStart, levelGLEnd, actualFormatID))
+        {
+            angle::FormatID sampleOnlyFormatID =
+                format.getActualImageFormatID(vk::ImageAccess::SampleOnly);
+
+            ANGLE_TRY(initImage(contextVk, intendedFormatID, sampleOnlyFormatID, mipLevels));
+            ANGLE_TRY(flushImageStagedUpdates(contextVk));
+        }
+    }
+
+    // Make sure we update mImageUsage bits
+    ANGLE_TRY(ensureImageAllocated(contextVk, format));
+
+    ANGLE_TRY(respecifyImageStorage(contextVk));
+    ANGLE_TRY(ensureImageInitialized(contextVk, ImageMipLevels::EnabledLevels));
+
+    return refreshImageViews(contextVk);
+}
+
+// Return true if image's format does not match the actual format
+bool TextureVk::imageHasActualImageFormat(angle::FormatID actualFormatID) const
+{
+    return mImage && (mImage->getActualFormatID() != actualFormatID);
+}
+
 }  // namespace rx
diff --git a/src/libANGLE/renderer/vulkan/TextureVk.h b/src/libANGLE/renderer/vulkan/TextureVk.h
index 679054a..341cbef 100644
--- a/src/libANGLE/renderer/vulkan/TextureVk.h
+++ b/src/libANGLE/renderer/vulkan/TextureVk.h
@@ -272,6 +272,7 @@
     }
 
     angle::Result ensureMutable(ContextVk *contextVk);
+    angle::Result ensureRenderable(ContextVk *contextVk);
 
     bool getAndResetImmutableSamplerDirtyState()
     {
@@ -415,11 +416,9 @@
                                            SurfaceRotation srcFramebufferRotation);
 
     angle::Result initImage(ContextVk *contextVk,
-                            const vk::Format &format,
-                            const bool sized,
-                            const gl::Extents &firstLevelExtents,
-                            const uint32_t firstLevel,
-                            const uint32_t levelCount);
+                            angle::FormatID intendedImageFormatID,
+                            angle::FormatID actualImageFormatID,
+                            ImageMipLevels mipLevels);
     void releaseImage(ContextVk *contextVk);
     void releaseStagingBuffer(ContextVk *contextVk);
     uint32_t getMipLevelCount(ImageMipLevels mipLevels) const;
@@ -428,8 +427,11 @@
                                         gl::LevelIndex previousFirstAllocateLevel,
                                         vk::ImageHelper *srcImage,
                                         vk::ImageHelper *dstImage);
+    angle::Result reinitImageAsRenderable(ContextVk *contextVk,
+                                          const vk::Format &format,
+                                          gl::TexLevelMask skipLevelsMask);
     angle::Result initImageViews(ContextVk *contextVk,
-                                 const vk::Format &format,
+                                 const angle::Format &format,
                                  const bool sized,
                                  uint32_t levelCount,
                                  uint32_t layerCount);
@@ -466,7 +468,8 @@
 
     bool isFastUnpackPossible(const vk::Format &vkFormat, size_t offset) const;
 
-    bool shouldUpdateBeStaged(gl::LevelIndex textureLevelIndexGL) const;
+    bool shouldUpdateBeStaged(gl::LevelIndex textureLevelIndexGL,
+                              angle::FormatID dstFormatID) const;
 
     // We monitor the staging buffer and set dirty bits if the staging buffer changes. Note that we
     // support changes in the staging buffer even outside the TextureVk class.
@@ -479,12 +482,16 @@
 
     angle::Result refreshImageViews(ContextVk *contextVk);
     bool shouldDecodeSRGB(ContextVk *contextVk, GLenum srgbDecode, bool texelFetchStaticUse) const;
-    void initImageUsageFlags(ContextVk *contextVk, const vk::Format &format);
+    void initImageUsageFlags(ContextVk *contextVk, angle::FormatID actualFormatID);
     void handleImmutableSamplerTransition(const vk::ImageHelper *previousImage,
                                           const vk::ImageHelper *nextImage);
 
+    vk::ImageAccess getRequiredImageAccess() const { return mRequiredImageAccess; }
+    bool imageHasActualImageFormat(angle::FormatID actualFormatID) const;
+
     bool mOwnsImage;
     bool mRequiresMutableStorage;
+    vk::ImageAccess mRequiredImageAccess;
     bool mImmutableSamplerDirty;
 
     gl::TextureType mImageNativeType;
diff --git a/src/libANGLE/renderer/vulkan/UtilsVk.cpp b/src/libANGLE/renderer/vulkan/UtilsVk.cpp
index e324b8a..d3dde42 100644
--- a/src/libANGLE/renderer/vulkan/UtilsVk.cpp
+++ b/src/libANGLE/renderer/vulkan/UtilsVk.cpp
@@ -213,11 +213,9 @@
     return floatFlag;
 }
 
-uint32_t GetImageCopyFlags(const vk::Format &srcFormat, const vk::Format &dstFormat)
+uint32_t GetImageCopyFlags(const angle::Format &srcIntendedFormat,
+                           const angle::Format &dstIntendedFormat)
 {
-    const angle::Format &srcIntendedFormat = srcFormat.intendedFormat();
-    const angle::Format &dstIntendedFormat = dstFormat.intendedFormat();
-
     uint32_t flags = 0;
 
     flags |= GetFormatFlags(srcIntendedFormat, ImageCopy_frag::kSrcIsSint,
@@ -231,12 +229,10 @@
 uint32_t GetBlitResolveFlags(bool blitColor,
                              bool blitDepth,
                              bool blitStencil,
-                             const vk::Format &format)
+                             const angle::Format &intendedFormat)
 {
     if (blitColor)
     {
-        const angle::Format &intendedFormat = format.intendedFormat();
-
         return GetFormatFlags(intendedFormat, BlitResolve_frag::kBlitColorInt,
                               BlitResolve_frag::kBlitColorUint, BlitResolve_frag::kBlitColorFloat);
     }
@@ -274,10 +270,8 @@
     }
 }
 
-uint32_t GetGenerateMipmapFlags(ContextVk *contextVk, const vk::Format &format)
+uint32_t GetGenerateMipmapFlags(ContextVk *contextVk, const angle::Format &actualFormat)
 {
-    const angle::Format &actualFormat = format.actualImageFormat();
-
     uint32_t flags = 0;
 
     // Note: If bits-per-component is 8 or 16 and float16 is supported in the shader, use that for
@@ -325,7 +319,7 @@
 
     for (uint32_t attachmentIndex = 0; attachmentIndex < colorAttachmentCount; ++attachmentIndex)
     {
-        const angle::Format &format = colorSrc[attachmentIndex]->getFormat().intendedFormat();
+        const angle::Format &format = colorSrc[attachmentIndex]->getIntendedFormat();
 
         UnresolveColorAttachmentType type = kUnresolveTypeFloat;
         if (format.isSint())
@@ -360,19 +354,18 @@
     return flags;
 }
 
-uint32_t GetFormatDefaultChannelMask(const vk::Format &format)
+uint32_t GetFormatDefaultChannelMask(const angle::Format &intendedImageFormat,
+                                     const angle::Format &actualImageFormat)
 {
     uint32_t mask = 0;
 
-    const angle::Format &intendedFormat = format.intendedFormat();
-    const angle::Format &imageFormat    = format.actualImageFormat();
-
     // Red can never be introduced due to format emulation (except for luma which is handled
     // especially)
-    ASSERT(((intendedFormat.redBits > 0) == (imageFormat.redBits > 0)) || intendedFormat.isLUMA());
-    mask |= intendedFormat.greenBits == 0 && imageFormat.greenBits > 0 ? 2 : 0;
-    mask |= intendedFormat.blueBits == 0 && imageFormat.blueBits > 0 ? 4 : 0;
-    mask |= intendedFormat.alphaBits == 0 && imageFormat.alphaBits > 0 ? 8 : 0;
+    ASSERT(((intendedImageFormat.redBits > 0) == (actualImageFormat.redBits > 0)) ||
+           intendedImageFormat.isLUMA());
+    mask |= intendedImageFormat.greenBits == 0 && actualImageFormat.greenBits > 0 ? 2 : 0;
+    mask |= intendedImageFormat.blueBits == 0 && actualImageFormat.blueBits > 0 ? 4 : 0;
+    mask |= intendedImageFormat.alphaBits == 0 && actualImageFormat.alphaBits > 0 ? 8 : 0;
 
     return mask;
 }
@@ -2097,15 +2090,16 @@
         imageClearProgram = &mImageClearProgram[flags];
     }
 
-    ANGLE_TRY(setupProgram(contextVk, Function::ImageClear, fragmentShader, vertexShader,
-                           imageClearProgram, &pipelineDesc, VK_NULL_HANDLE, &shaderParams,
-                           sizeof(shaderParams), commandBuffer));
-
-    // Make sure transform feedback is paused
+    // Make sure transform feedback is paused.  Needs to be done before binding the pipeline as
+    // that's not allowed in Vulkan.
     bool isTransformFeedbackActiveUnpaused =
         contextVk->getStartedRenderPassCommands().isTransformFeedbackActiveUnpaused();
     contextVk->pauseTransformFeedbackIfActiveUnpaused();
 
+    ANGLE_TRY(setupProgram(contextVk, Function::ImageClear, fragmentShader, vertexShader,
+                           imageClearProgram, &pipelineDesc, VK_NULL_HANDLE, &shaderParams,
+                           sizeof(shaderParams), commandBuffer));
+
     // Make sure this draw call doesn't count towards occlusion query results.
     contextVk->pauseRenderPassQueriesIfActive();
 
@@ -2263,7 +2257,8 @@
     // Linear sampling is only valid with color blitting.
     ASSERT((blitColor && !isResolve) || !params.linear);
 
-    uint32_t flags = GetBlitResolveFlags(blitColor, blitDepth, blitStencil, src->getFormat());
+    uint32_t flags =
+        GetBlitResolveFlags(blitColor, blitDepth, blitStencil, src->getIntendedFormat());
     flags |= src->getLayerCount() > 1 ? BlitResolve_frag::kSrcIsArray : 0;
     flags |= isResolve ? BlitResolve_frag::kIsResolve : 0;
 
@@ -2621,9 +2616,8 @@
 {
     ANGLE_TRY(ensureImageCopyResourcesInitialized(contextVk));
 
-    const vk::Format &srcFormat            = src->getFormat();
-    const vk::Format &dstFormat            = dest->getFormat();
-    const angle::Format &dstIntendedFormat = dstFormat.intendedFormat();
+    const angle::Format &srcIntendedFormat = src->getIntendedFormat();
+    const angle::Format &dstIntendedFormat = dest->getIntendedFormat();
 
     ImageCopyShaderParams shaderParams;
     shaderParams.flipX            = 0;
@@ -2632,19 +2626,18 @@
     shaderParams.unmultiplyAlpha  = params.srcUnmultiplyAlpha;
     shaderParams.destHasLuminance = dstIntendedFormat.luminanceBits > 0;
     shaderParams.destIsAlpha      = dstIntendedFormat.isLUMA() && dstIntendedFormat.alphaBits > 0;
-    shaderParams.destDefaultChannelsMask = GetFormatDefaultChannelMask(dstFormat);
-    shaderParams.srcMip                  = params.srcMip;
-    shaderParams.srcLayer                = params.srcLayer;
-    shaderParams.srcOffset[0]            = params.srcOffset[0];
-    shaderParams.srcOffset[1]            = params.srcOffset[1];
-    shaderParams.destOffset[0]           = params.destOffset[0];
-    shaderParams.destOffset[1]           = params.destOffset[1];
-    shaderParams.rotateXY                = 0;
+    shaderParams.destDefaultChannelsMask =
+        GetFormatDefaultChannelMask(dest->getIntendedFormat(), dest->getActualFormat());
+    shaderParams.srcMip        = params.srcMip;
+    shaderParams.srcLayer      = params.srcLayer;
+    shaderParams.srcOffset[0]  = params.srcOffset[0];
+    shaderParams.srcOffset[1]  = params.srcOffset[1];
+    shaderParams.destOffset[0] = params.destOffset[0];
+    shaderParams.destOffset[1] = params.destOffset[1];
+    shaderParams.rotateXY      = 0;
 
-    shaderParams.srcIsSRGB =
-        gl::GetSizedInternalFormatInfo(srcFormat.intendedGLFormat).colorEncoding == GL_SRGB;
-    shaderParams.destIsSRGB =
-        gl::GetSizedInternalFormatInfo(dstFormat.intendedGLFormat).colorEncoding == GL_SRGB;
+    shaderParams.srcIsSRGB  = params.srcColorEncoding == GL_SRGB;
+    shaderParams.destIsSRGB = params.destColorEncoding == GL_SRGB;
 
     // If both src and dest are sRGB, and there is no alpha multiplication/division necessary, then
     // the shader can work with sRGB data and pretend they are linear.
@@ -2696,7 +2689,7 @@
             break;
     }
 
-    uint32_t flags = GetImageCopyFlags(srcFormat, dstFormat);
+    uint32_t flags = GetImageCopyFlags(srcIntendedFormat, dstIntendedFormat);
     if (src->getType() == VK_IMAGE_TYPE_3D)
     {
         flags |= ImageCopy_frag::kSrcIs3D;
@@ -2717,7 +2710,7 @@
 
     vk::RenderPassDesc renderPassDesc;
     renderPassDesc.setSamples(dest->getSamples());
-    renderPassDesc.packColorAttachment(0, dstFormat.intendedFormatID);
+    renderPassDesc.packColorAttachment(0, dest->getActualFormatID());
 
     // Copy from multisampled image is not supported.
     ASSERT(src->getSamples() == 1);
@@ -2823,16 +2816,13 @@
     // new shader is necessary.  The srcEmulatedAlpha parameter is used to make sure the destination
     // alpha value is correct, if dest is RGBA.
 
-    const vk::Format &srcFormat = src->getFormat();
-    const vk::Format &dstFormat = dest->getFormat();
-
     // This path should only be necessary for when RGBA is used as fallback for RGB.  No other
     // format which can be used with EXT_copy_image has a fallback.
-    ASSERT(srcFormat.intendedFormat().blueBits > 0 && srcFormat.intendedFormat().alphaBits == 0);
-    ASSERT(dstFormat.intendedFormat().blueBits > 0 && dstFormat.intendedFormat().alphaBits == 0);
+    ASSERT(src->getIntendedFormat().blueBits > 0 && src->getIntendedFormat().alphaBits == 0);
+    ASSERT(dest->getIntendedFormat().blueBits > 0 && dest->getIntendedFormat().alphaBits == 0);
 
-    const angle::Format &srcImageFormat = srcFormat.actualImageFormat();
-    const angle::Format &dstImageFormat = dstFormat.actualImageFormat();
+    const angle::Format &srcImageFormat = src->getActualFormat();
+    const angle::Format &dstImageFormat = dest->getActualFormat();
 
     // Create temporary buffers.
     vk::RendererScoped<vk::BufferHelper> srcBuffer(contextVk->getRenderer());
@@ -3049,7 +3039,7 @@
     shaderParams.invSrcExtent[1] = 1.0f / srcExtents.height;
     shaderParams.levelCount      = params.destLevelCount;
 
-    uint32_t flags = GetGenerateMipmapFlags(contextVk, src->getFormat());
+    uint32_t flags = GetGenerateMipmapFlags(contextVk, src->getActualFormat());
 
     VkDescriptorSet descriptorSet;
     vk::RefCountedDescriptorPoolBinding descriptorPoolBinding;
diff --git a/src/libANGLE/renderer/vulkan/UtilsVk.h b/src/libANGLE/renderer/vulkan/UtilsVk.h
index d657e75..8f83b87 100644
--- a/src/libANGLE/renderer/vulkan/UtilsVk.h
+++ b/src/libANGLE/renderer/vulkan/UtilsVk.h
@@ -149,6 +149,8 @@
         bool srcFlipY;
         bool destFlipY;
         SurfaceRotation srcRotation;
+        GLenum srcColorEncoding;
+        GLenum destColorEncoding;
     };
 
     struct CopyImageBitsParameters
diff --git a/src/libANGLE/renderer/vulkan/VertexArrayVk.cpp b/src/libANGLE/renderer/vulkan/VertexArrayVk.cpp
index ed41650..2cec92a 100644
--- a/src/libANGLE/renderer/vulkan/VertexArrayVk.cpp
+++ b/src/libANGLE/renderer/vulkan/VertexArrayVk.cpp
@@ -59,16 +59,17 @@
         return angle::Result::Continue;
     }
 
-    std::ostringstream stream;
-    stream << "The Vulkan driver does not support the 0x" << std::hex
-           << vertexFormat.intendedFormat().glInternalFormat
-           << " vertex attribute format; emulating with 0x"
-           << vertexFormat.actualBufferFormat(compressed).glInternalFormat;
-    ANGLE_PERF_WARNING(contextVk->getDebug(), GL_DEBUG_SEVERITY_LOW, stream.str().c_str());
+    char stringBuffer[100];
+    snprintf(
+        stringBuffer, sizeof(stringBuffer),
+        "The Vulkan driver does not support vertex attribute format 0x%04X, emulating with 0x%04X",
+        vertexFormat.getIntendedFormat().glInternalFormat,
+        vertexFormat.getActualBufferFormat(compressed).glInternalFormat);
+    ANGLE_PERF_WARNING(contextVk->getDebug(), GL_DEBUG_SEVERITY_LOW, stringBuffer);
 
     if (insertEventMarker)
     {
-        ANGLE_TRY(contextVk->insertEventMarker(0, stream.str().c_str()));
+        ANGLE_TRY(contextVk->insertEventMarker(0, stringBuffer));
     }
 
     return angle::Result::Continue;
@@ -382,8 +383,8 @@
                                                     GLuint relativeOffset,
                                                     bool compressed)
 {
-    const angle::Format &srcFormat  = vertexFormat.intendedFormat();
-    const angle::Format &destFormat = vertexFormat.actualBufferFormat(compressed);
+    const angle::Format &srcFormat  = vertexFormat.getIntendedFormat();
+    const angle::Format &destFormat = vertexFormat.getActualBufferFormat(compressed);
 
     ASSERT(binding.getStride() % (srcFormat.pixelBytes / srcFormat.channelCount) == 0);
 
@@ -396,7 +397,7 @@
         return angle::Result::Continue;
     }
 
-    ASSERT(GetVertexInputAlignment(vertexFormat, compressed) <= vk::kVertexBufferAlignment);
+    ASSERT(vertexFormat.getVertexInputAlignment(compressed) <= vk::kVertexBufferAlignment);
 
     // Allocate buffer for results
     conversion->data.releaseInFlightBuffers(contextVk);
@@ -434,8 +435,8 @@
 {
     ANGLE_TRACE_EVENT0("gpu.angle", "VertexArrayVk::convertVertexBufferCpu");
 
-    unsigned srcFormatSize = vertexFormat.intendedFormat().pixelBytes;
-    unsigned dstFormatSize = vertexFormat.actualBufferFormat(compressed).pixelBytes;
+    unsigned srcFormatSize = vertexFormat.getIntendedFormat().pixelBytes;
+    unsigned dstFormatSize = vertexFormat.getActualBufferFormat(compressed).pixelBytes;
 
     conversion->data.releaseInFlightBuffers(contextVk);
 
@@ -449,7 +450,7 @@
     ANGLE_TRY(srcBuffer->mapImpl(contextVk, &src));
     const uint8_t *srcBytes = reinterpret_cast<const uint8_t *>(src);
     srcBytes += binding.getOffset() + relativeOffset;
-    ASSERT(GetVertexInputAlignment(vertexFormat, compressed) <= vk::kVertexBufferAlignment);
+    ASSERT(vertexFormat.getVertexInputAlignment(compressed) <= vk::kVertexBufferAlignment);
     ANGLE_TRY(StreamVertexData(
         contextVk, &conversion->data, srcBytes, numVertices * dstFormatSize, 0, numVertices,
         binding.getStride(), srcFormatSize, vertexFormat.getVertexLoadFunction(compressed),
@@ -607,14 +608,13 @@
         if (!isStreamingVertexAttrib)
         {
             BufferVk *bufferVk                  = vk::GetImpl(bufferGL);
-            const angle::Format &intendedFormat = vertexFormat.intendedFormat();
+            const angle::Format &intendedFormat = vertexFormat.getIntendedFormat();
             bool bindingIsAligned               = BindingIsAligned(
                 binding, intendedFormat, intendedFormat.channelCount, attrib.relativeOffset);
 
             if (renderer->getFeatures().compressVertexData.enabled &&
                 gl::IsStaticBufferUsage(bufferGL->getUsage()) &&
-                vertexFormat.actualCompressedBufferFormatID != angle::FormatID::NONE &&
-                vertexFormat.actualBufferFormatID != vertexFormat.actualCompressedBufferFormatID)
+                vertexFormat.canCompressBufferData())
             {
                 compressed = true;
             }
@@ -631,11 +631,9 @@
                     if (compressed)
                     {
                         INFO() << "Compressing vertex data in buffer " << bufferGL->id().value
-                               << " from "
-                               << static_cast<unsigned int>(vertexFormat.intendedFormatID) << " to "
-                               << static_cast<unsigned int>(
-                                      vertexFormat.actualCompressedBufferFormatID)
-                               << ".";
+                               << " from " << ToUnderlying(vertexFormat.getIntendedFormatID())
+                               << " to "
+                               << ToUnderlying(vertexFormat.getActualBufferFormat(true).id) << ".";
                     }
 
                     if (bindingIsAligned)
@@ -671,7 +669,7 @@
                 mCurrentArrayBufferRelativeOffsets[attribIndex] = 0;
 
                 // Converted buffer is tightly packed
-                stride = vertexFormat.actualBufferFormat(compressed).pixelBytes;
+                stride = vertexFormat.getActualBufferFormat(compressed).pixelBytes;
             }
             else
             {
@@ -712,7 +710,7 @@
             mCurrentArrayBufferHandles[attribIndex] = emptyBuffer.getBuffer().getHandle();
             mCurrentArrayBufferOffsets[attribIndex] = 0;
             // Client side buffer will be transfered to a tightly packed buffer later
-            stride = vertexFormat.actualBufferFormat(compressed).pixelBytes;
+            stride = vertexFormat.getActualBufferFormat(compressed).pixelBytes;
         }
 
         if (bufferOnly)
@@ -794,12 +792,12 @@
         const gl::VertexBinding &binding = bindings[attrib.bindingIndex];
 
         const vk::Format &vertexFormat = renderer->getFormat(attrib.format->id);
-        GLuint stride                  = vertexFormat.actualBufferFormat(false).pixelBytes;
+        GLuint stride                  = vertexFormat.getActualBufferFormat(false).pixelBytes;
 
         bool compressed = false;
         ANGLE_TRY(WarnOnVertexFormatConversion(contextVk, vertexFormat, compressed, false));
 
-        ASSERT(GetVertexInputAlignment(vertexFormat, false) <= vk::kVertexBufferAlignment);
+        ASSERT(vertexFormat.getVertexInputAlignment(false) <= vk::kVertexBufferAlignment);
 
         const uint8_t *src     = static_cast<const uint8_t *>(attrib.pointer);
         const uint32_t divisor = binding.getDivisor();
@@ -823,7 +821,7 @@
 
                 ANGLE_TRY(StreamVertexData(contextVk, &mDynamicVertexData, src, bytesToAllocate, 0,
                                            instanceCount, binding.getStride(), stride,
-                                           vertexFormat.vertexLoadFunction,
+                                           vertexFormat.getVertexLoadFunction(compressed),
                                            &mCurrentArrayBuffers[attribIndex],
                                            &mCurrentArrayBufferOffsets[attribIndex], divisor));
                 if (bufferVk)
@@ -839,7 +837,7 @@
 
                 ANGLE_TRY(StreamVertexData(contextVk, &mDynamicVertexData, src, bytesToAllocate, 0,
                                            count, binding.getStride(), stride,
-                                           vertexFormat.vertexLoadFunction,
+                                           vertexFormat.getVertexLoadFunction(compressed),
                                            &mCurrentArrayBuffers[attribIndex],
                                            &mCurrentArrayBufferOffsets[attribIndex], 1));
             }
@@ -856,7 +854,7 @@
 
             ANGLE_TRY(StreamVertexData(
                 contextVk, &mDynamicVertexData, src, bytesToAllocate, destOffset, vertexCount,
-                binding.getStride(), stride, vertexFormat.vertexLoadFunction,
+                binding.getStride(), stride, vertexFormat.getVertexLoadFunction(compressed),
                 &mCurrentArrayBuffers[attribIndex], &mCurrentArrayBufferOffsets[attribIndex], 1));
         }
 
diff --git a/src/libANGLE/renderer/vulkan/android/DisplayVkAndroid.cpp b/src/libANGLE/renderer/vulkan/android/DisplayVkAndroid.cpp
index 78a4924..1d5afab 100644
--- a/src/libANGLE/renderer/vulkan/android/DisplayVkAndroid.cpp
+++ b/src/libANGLE/renderer/vulkan/android/DisplayVkAndroid.cpp
@@ -98,8 +98,8 @@
     switch (target)
     {
         case EGL_NATIVE_BUFFER_ANDROID:
-            return HardwareBufferImageSiblingVkAndroid::ValidateHardwareBuffer(mRenderer,
-                                                                               clientBuffer);
+            return HardwareBufferImageSiblingVkAndroid::ValidateHardwareBuffer(
+                mRenderer, clientBuffer, attribs);
 
         default:
             return DisplayVk::validateImageClientBuffer(context, target, clientBuffer, attribs);
diff --git a/src/libANGLE/renderer/vulkan/android/HardwareBufferImageSiblingVkAndroid.cpp b/src/libANGLE/renderer/vulkan/android/HardwareBufferImageSiblingVkAndroid.cpp
index 8d15976..c78b2d0 100644
--- a/src/libANGLE/renderer/vulkan/android/HardwareBufferImageSiblingVkAndroid.cpp
+++ b/src/libANGLE/renderer/vulkan/android/HardwareBufferImageSiblingVkAndroid.cpp
@@ -87,8 +87,10 @@
 HardwareBufferImageSiblingVkAndroid::~HardwareBufferImageSiblingVkAndroid() {}
 
 // Static
-egl::Error HardwareBufferImageSiblingVkAndroid::ValidateHardwareBuffer(RendererVk *renderer,
-                                                                       EGLClientBuffer buffer)
+egl::Error HardwareBufferImageSiblingVkAndroid::ValidateHardwareBuffer(
+    RendererVk *renderer,
+    EGLClientBuffer buffer,
+    const egl::AttributeMap &attribs)
 {
     struct ANativeWindowBuffer *windowBuffer =
         angle::android::ClientBufferToANativeWindowBuffer(buffer);
@@ -133,6 +135,23 @@
         }
     }
 
+    if (attribs.getAsInt(EGL_PROTECTED_CONTENT_EXT, EGL_FALSE) == EGL_TRUE)
+    {
+        int width       = 0;
+        int height      = 0;
+        int depth       = 0;
+        int pixelFormat = 0;
+        uint64_t usage  = 0;
+        angle::android::GetANativeWindowBufferProperties(windowBuffer, &width, &height, &depth,
+                                                         &pixelFormat, &usage);
+        if ((usage & AHARDWAREBUFFER_USAGE_PROTECTED_CONTENT) == 0)
+        {
+            return egl::EglBadAccess()
+                   << "EGL_PROTECTED_CONTENT_EXT attribute does not match protected state "
+                      "of EGLCleintBuffer.";
+        }
+    }
+
     return egl::NoError();
 }
 
@@ -191,7 +210,7 @@
 
     int pixelFormat = 0;
     angle::android::GetANativeWindowBufferProperties(windowBuffer, &mSize.width, &mSize.height,
-                                                     &mSize.depth, &pixelFormat);
+                                                     &mSize.depth, &pixelFormat, &mUsage);
     GLenum internalFormat = angle::android::NativePixelFormatToGLInternalFormat(pixelFormat);
     mFormat               = gl::Format(internalFormat);
 
@@ -218,7 +237,7 @@
 
     const vk::Format &vkFormat         = renderer->getFormat(internalFormat);
     const vk::Format &externalVkFormat = renderer->getFormat(angle::FormatID::NONE);
-    const angle::Format &imageFormat   = vkFormat.actualImageFormat();
+    const angle::Format &imageFormat   = vkFormat.getActualRenderableImageFormat();
     bool isDepthOrStencilFormat        = imageFormat.hasDepthOrStencilBits();
 
     // Query AHB description and do the following -
@@ -259,12 +278,18 @@
     bool robustInitEnabled = false;
 
     mImage->setTilingMode(imageTilingMode);
+    VkImageCreateFlags imageCreateFlags = vk::kVkImageCreateFlagsNone;
+    if (hasProtectedContent())
+    {
+        imageCreateFlags |= VK_IMAGE_CREATE_PROTECTED_BIT;
+    }
+    const vk::Format &format =
+        bufferFormatProperties.format == VK_FORMAT_UNDEFINED ? externalVkFormat : vkFormat;
     ANGLE_TRY(mImage->initExternal(
-        displayVk, gl::TextureType::_2D, vkExtents,
-        bufferFormatProperties.format == VK_FORMAT_UNDEFINED ? externalVkFormat : vkFormat, 1,
-        usage, vk::kVkImageCreateFlagsNone, vk::ImageLayout::ExternalPreInitialized,
-        &externalMemoryImageCreateInfo, gl::LevelIndex(0), 1, 1, robustInitEnabled, nullptr,
-        false));
+        displayVk, gl::TextureType::_2D, vkExtents, format.getIntendedFormatID(),
+        format.getActualRenderableImageFormatID(), 1, usage, imageCreateFlags,
+        vk::ImageLayout::ExternalPreInitialized, &externalMemoryImageCreateInfo, gl::LevelIndex(0),
+        1, 1, robustInitEnabled, nullptr, hasProtectedContent()));
 
     VkImportAndroidHardwareBufferInfoANDROID importHardwareBufferInfo = {};
     importHardwareBufferInfo.sType  = VK_STRUCTURE_TYPE_IMPORT_ANDROID_HARDWARE_BUFFER_INFO_ANDROID;
@@ -281,7 +306,8 @@
     externalMemoryRequirements.alignment            = 0;
     externalMemoryRequirements.memoryTypeBits       = bufferProperties.memoryTypeBits;
 
-    VkMemoryPropertyFlags flags = VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT;
+    VkMemoryPropertyFlags flags = VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT |
+                                  (hasProtectedContent() ? VK_MEMORY_PROPERTY_PROTECTED_BIT : 0);
     if (bufferFormatProperties.format == VK_FORMAT_UNDEFINED)
     {
         // Note from Vulkan spec: Since GL_OES_EGL_image_external does not require the same sampling
@@ -316,15 +342,15 @@
 
     constexpr uint32_t kColorRenderableRequiredBits        = VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT;
     constexpr uint32_t kDepthStencilRenderableRequiredBits = VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT;
-    mRenderable = renderer->hasImageFormatFeatureBits(vkFormat.actualImageFormatID,
+    mRenderable = renderer->hasImageFormatFeatureBits(vkFormat.getActualRenderableImageFormatID(),
                                                       kColorRenderableRequiredBits) ||
-                  renderer->hasImageFormatFeatureBits(vkFormat.actualImageFormatID,
+                  renderer->hasImageFormatFeatureBits(vkFormat.getActualRenderableImageFormatID(),
                                                       kDepthStencilRenderableRequiredBits);
 
     constexpr uint32_t kTextureableRequiredBits =
         VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT;
-    mTextureable =
-        renderer->hasImageFormatFeatureBits(vkFormat.actualImageFormatID, kTextureableRequiredBits);
+    mTextureable = renderer->hasImageFormatFeatureBits(vkFormat.getActualRenderableImageFormatID(),
+                                                       kTextureableRequiredBits);
 
     return angle::Result::Continue;
 }
@@ -360,6 +386,11 @@
     return mYUV;
 }
 
+bool HardwareBufferImageSiblingVkAndroid::hasProtectedContent() const
+{
+    return ((mUsage & AHARDWAREBUFFER_USAGE_PROTECTED_CONTENT) != 0);
+}
+
 gl::Extents HardwareBufferImageSiblingVkAndroid::getSize() const
 {
     return mSize;
diff --git a/src/libANGLE/renderer/vulkan/android/HardwareBufferImageSiblingVkAndroid.h b/src/libANGLE/renderer/vulkan/android/HardwareBufferImageSiblingVkAndroid.h
index 39f5ed5..7f55bca 100644
--- a/src/libANGLE/renderer/vulkan/android/HardwareBufferImageSiblingVkAndroid.h
+++ b/src/libANGLE/renderer/vulkan/android/HardwareBufferImageSiblingVkAndroid.h
@@ -21,7 +21,9 @@
     HardwareBufferImageSiblingVkAndroid(EGLClientBuffer buffer);
     ~HardwareBufferImageSiblingVkAndroid() override;
 
-    static egl::Error ValidateHardwareBuffer(RendererVk *renderer, EGLClientBuffer buffer);
+    static egl::Error ValidateHardwareBuffer(RendererVk *renderer,
+                                             EGLClientBuffer buffer,
+                                             const egl::AttributeMap &attribs);
 
     egl::Error initialize(const egl::Display *display) override;
     void onDestroy(const egl::Display *display) override;
@@ -31,6 +33,7 @@
     bool isRenderable(const gl::Context *context) const override;
     bool isTexturable(const gl::Context *context) const override;
     bool isYUV() const override;
+    bool hasProtectedContent() const override;
     gl::Extents getSize() const override;
     size_t getSamples() const override;
 
@@ -49,6 +52,7 @@
     bool mRenderable;
     bool mTextureable;
     bool mYUV;
+    uint64_t mUsage;
     size_t mSamples;
 
     vk::ImageHelper *mImage;
diff --git a/src/libANGLE/renderer/vulkan/doc/OpenGLLineSegmentRasterization.md b/src/libANGLE/renderer/vulkan/doc/OpenGLLineSegmentRasterization.md
index 5afa272..1c52da4 100644
--- a/src/libANGLE/renderer/vulkan/doc/OpenGLLineSegmentRasterization.md
+++ b/src/libANGLE/renderer/vulkan/doc/OpenGLLineSegmentRasterization.md
@@ -68,7 +68,7 @@
 [Bresenham]: https://en.wikipedia.org/wiki/Bresenham%27s_line_algorithm
 [DiamondRule]: img/LineRasterPixelExample.png
 [Holes]: img/LineRasterHoles.jpg
-[TranslatorVulkan.cpp]: https://chromium.googlesource.com/angle/angle/+/refs/heads/master/src/compiler/translator/TranslatorVulkan.cpp
+[TranslatorVulkan.cpp]: https://chromium.googlesource.com/angle/angle/+/refs/heads/main/src/compiler/translator/TranslatorVulkan.cpp
 [VK_EXT_line_rasterization]: https://www.khronos.org/registry/vulkan/specs/1.1-extensions/man/html/VK_EXT_line_rasterization.html
 [VulkanLineRaster]: https://www.khronos.org/registry/vulkan/specs/1.1/html/chap24.html#primsrast-lines-basic
 [VulkanVsGLLineRaster]: img/LineRasterComparison.gif
diff --git a/src/libANGLE/renderer/vulkan/doc/ShaderModuleCompilation.md b/src/libANGLE/renderer/vulkan/doc/ShaderModuleCompilation.md
index 0f3146a..d4e3b8f 100644
--- a/src/libANGLE/renderer/vulkan/doc/ShaderModuleCompilation.md
+++ b/src/libANGLE/renderer/vulkan/doc/ShaderModuleCompilation.md
@@ -79,12 +79,12 @@
 "Vulkan Back-end"- ->"ANGLE Front-end": return success
 -->
 
-![Vulkan Shader Translation Flow](https://raw.githubusercontent.com/google/angle/master/src/libANGLE/renderer/vulkan/doc/img/VulkanShaderTranslation.svg?sanitize=true)
+![Vulkan Shader Translation Flow](https://raw.githubusercontent.com/google/angle/main/src/libANGLE/renderer/vulkan/doc/img/VulkanShaderTranslation.svg?sanitize=true)
 
-[GL_KHR_vulkan_glsl]: https://github.com/KhronosGroup/GLSL/blob/master/extensions/khr/GL_KHR_vulkan_glsl.txt
+[GL_KHR_vulkan_glsl]: https://github.com/KhronosGroup/GLSL/blob/main/extensions/khr/GL_KHR_vulkan_glsl.txt
 [glslang]: https://github.com/KhronosGroup/glslang
-[GlslangWrapperVk.cpp]: https://chromium.googlesource.com/angle/angle/+/refs/heads/master/src/libANGLE/renderer/vulkan/GlslangWrapperVk.cpp
+[GlslangWrapperVk.cpp]: https://chromium.googlesource.com/angle/angle/+/refs/heads/main/src/libANGLE/renderer/vulkan/GlslangWrapperVk.cpp
 [SPIRV-Tools]: https://github.com/KhronosGroup/SPIRV-Tools
-[translator]: https://chromium.googlesource.com/angle/angle/+/refs/heads/master/src/compiler/translator/
-[TranslatorVulkan.cpp]: https://chromium.googlesource.com/angle/angle/+/refs/heads/master/src/compiler/translator/TranslatorVulkan.cpp
+[translator]: https://chromium.googlesource.com/angle/angle/+/refs/heads/main/src/compiler/translator/
+[TranslatorVulkan.cpp]: https://chromium.googlesource.com/angle/angle/+/refs/heads/main/src/compiler/translator/TranslatorVulkan.cpp
 [VkShaderModule]: https://www.khronos.org/registry/vulkan/specs/1.1-extensions/man/html/VkShaderModule.html
diff --git a/src/libANGLE/renderer/vulkan/gen_vk_format_table.py b/src/libANGLE/renderer/vulkan/gen_vk_format_table.py
index 4232011..b1d924a 100644
--- a/src/libANGLE/renderer/vulkan/gen_vk_format_table.py
+++ b/src/libANGLE/renderer/vulkan/gen_vk_format_table.py
@@ -80,14 +80,14 @@
 """
 
 format_entry_template = """case angle::FormatID::{format_id}:
-intendedGLFormat = {internal_format};
+mIntendedGLFormat = {internal_format};
 {image_template}
 {buffer_template}
 break;
 """
 
-image_basic_template = """actualImageFormatID = {image};
-imageInitializerFunction = {image_initializer};"""
+image_basic_template = """mActualSampleOnlyImageFormatID = {image};
+mImageInitializerFunction = {image_initializer};"""
 
 image_struct_template = "{{{image}, {image_initializer}}}"
 
@@ -96,10 +96,10 @@
 initImageFallback(renderer, kInfo, ArraySize(kInfo));
 }}"""
 
-buffer_basic_template = """actualBufferFormatID = {buffer};
-vkBufferFormatIsPacked = {vk_buffer_format_is_packed};
-vertexLoadFunction = {vertex_load_function};
-vertexLoadRequiresConversion = {vertex_load_converts};"""
+buffer_basic_template = """mActualBufferFormatID = {buffer};
+mVkBufferFormatIsPacked = {vk_buffer_format_is_packed};
+mVertexLoadFunction = {vertex_load_function};
+mVertexLoadRequiresConversion = {vertex_load_converts};"""
 
 buffer_struct_template = """{{{buffer}, {vk_buffer_format_is_packed}, 
 {vertex_load_function}, {vertex_load_converts}}}"""
diff --git a/src/libANGLE/renderer/vulkan/vk_cache_utils.cpp b/src/libANGLE/renderer/vulkan/vk_cache_utils.cpp
index 6d7091d..752bb3c 100644
--- a/src/libANGLE/renderer/vulkan/vk_cache_utils.cpp
+++ b/src/libANGLE/renderer/vulkan/vk_cache_utils.cpp
@@ -153,12 +153,12 @@
 }
 
 void UnpackAttachmentDesc(VkAttachmentDescription *desc,
-                          const Format &format,
+                          angle::FormatID formatID,
                           uint8_t samples,
                           const PackedAttachmentOpsDesc &ops)
 {
     desc->flags   = 0;
-    desc->format  = format.actualImageVkFormat();
+    desc->format  = GetVkFormatFromFormatID(formatID);
     desc->samples = gl_vk::GetSamples(samples);
     desc->loadOp  = static_cast<VkAttachmentLoadOp>(ops.loadOp);
     desc->storeOp =
@@ -173,15 +173,15 @@
 }
 
 void UnpackColorResolveAttachmentDesc(VkAttachmentDescription *desc,
-                                      const Format &format,
+                                      angle::FormatID formatID,
                                       bool usedAsInputAttachment,
                                       bool isInvalidated)
 {
     desc->flags  = 0;
-    desc->format = format.actualImageVkFormat();
+    desc->format = GetVkFormatFromFormatID(formatID);
 
     // This function is for color resolve attachments.
-    const angle::Format &angleFormat = format.actualImageFormat();
+    const angle::Format &angleFormat = angle::Format::Get(formatID);
     ASSERT(angleFormat.depthBits == 0 && angleFormat.stencilBits == 0);
 
     // Resolve attachments always have a sample count of 1.
@@ -202,7 +202,7 @@
 }
 
 void UnpackDepthStencilResolveAttachmentDesc(VkAttachmentDescription *desc,
-                                             const Format &format,
+                                             angle::FormatID formatID,
                                              bool usedAsDepthInputAttachment,
                                              bool usedAsStencilInputAttachment,
                                              bool isDepthInvalidated,
@@ -211,10 +211,10 @@
     // There cannot be simultaneous usages of the depth/stencil resolve image, as depth/stencil
     // resolve currently only comes from depth/stencil renderbuffers.
     desc->flags  = 0;
-    desc->format = format.actualImageVkFormat();
+    desc->format = GetVkFormatFromFormatID(formatID);
 
     // This function is for depth/stencil resolve attachment.
-    const angle::Format &angleFormat = format.intendedFormat();
+    const angle::Format &angleFormat = angle::Format::Get(formatID);
     ASSERT(angleFormat.depthBits != 0 || angleFormat.stencilBits != 0);
 
     // Missing aspects are folded in is*Invalidated parameters, so no need to double check.
@@ -924,8 +924,6 @@
                                            const AttachmentOpsArray &ops,
                                            RenderPassHelper *renderPassHelper)
 {
-    RendererVk *renderer = contextVk->getRenderer();
-
     constexpr VkAttachmentReference kUnusedAttachment   = {VK_ATTACHMENT_UNUSED,
                                                          VK_IMAGE_LAYOUT_UNDEFINED};
     constexpr VkAttachmentReference2 kUnusedAttachment2 = {
@@ -977,9 +975,8 @@
             continue;
         }
 
-        angle::FormatID formatID = desc[colorIndexGL];
-        ASSERT(formatID != angle::FormatID::NONE);
-        const Format &format = renderer->getFormat(formatID);
+        angle::FormatID attachmentFormatID = desc[colorIndexGL];
+        ASSERT(attachmentFormatID != angle::FormatID::NONE);
 
         VkAttachmentReference colorRef;
         colorRef.attachment = attachmentCount.get();
@@ -989,24 +986,21 @@
                                     static_cast<ImageLayout>(ops[attachmentCount].initialLayout));
         colorAttachmentRefs.push_back(colorRef);
 
-        UnpackAttachmentDesc(&attachmentDescs[attachmentCount.get()], format, attachmentSamples,
-                             ops[attachmentCount]);
-
-        angle::FormatID attachmentFormat = format.actualImageFormatID;
+        UnpackAttachmentDesc(&attachmentDescs[attachmentCount.get()], attachmentFormatID,
+                             attachmentSamples, ops[attachmentCount]);
 
         // If this renderpass uses EXT_srgb_write_control, we need to override the format to its
         // linear counterpart. Formats that cannot be reinterpreted are exempt from this
         // requirement.
-        angle::FormatID linearFormat = rx::ConvertToLinear(attachmentFormat);
+        angle::FormatID linearFormat = rx::ConvertToLinear(attachmentFormatID);
         if (linearFormat != angle::FormatID::NONE)
         {
             if (desc.getSRGBWriteControlMode() == gl::SrgbWriteControlMode::Linear)
             {
-                attachmentFormat = linearFormat;
+                attachmentFormatID = linearFormat;
             }
         }
-        attachmentDescs[attachmentCount.get()].format =
-            contextVk->getRenderer()->getFormat(attachmentFormat).actualImageVkFormat();
+        attachmentDescs[attachmentCount.get()].format = GetVkFormatFromFormatID(attachmentFormatID);
         ASSERT(attachmentDescs[attachmentCount.get()].format != VK_FORMAT_UNDEFINED);
 
         isColorInvalidated.set(colorIndexGL, ops[attachmentCount].isInvalidated);
@@ -1019,16 +1013,15 @@
     {
         uint32_t depthStencilIndexGL = static_cast<uint32_t>(desc.depthStencilAttachmentIndex());
 
-        angle::FormatID formatID = desc[depthStencilIndexGL];
-        ASSERT(formatID != angle::FormatID::NONE);
-        const Format &format = renderer->getFormat(formatID);
+        angle::FormatID attachmentFormatID = desc[depthStencilIndexGL];
+        ASSERT(attachmentFormatID != angle::FormatID::NONE);
 
         depthStencilAttachmentRef.attachment = attachmentCount.get();
         depthStencilAttachmentRef.layout     = ConvertImageLayoutToVkImageLayout(
             static_cast<ImageLayout>(ops[attachmentCount].initialLayout));
 
-        UnpackAttachmentDesc(&attachmentDescs[attachmentCount.get()], format, attachmentSamples,
-                             ops[attachmentCount]);
+        UnpackAttachmentDesc(&attachmentDescs[attachmentCount.get()], attachmentFormatID,
+                             attachmentSamples, ops[attachmentCount]);
 
         isDepthInvalidated   = ops[attachmentCount].isInvalidated;
         isStencilInvalidated = ops[attachmentCount].isStencilInvalidated;
@@ -1048,7 +1041,7 @@
 
         ASSERT(desc.isColorAttachmentEnabled(colorIndexGL));
 
-        const Format &format = renderer->getFormat(desc[colorIndexGL]);
+        angle::FormatID attachmentFormatID = desc[colorIndexGL];
 
         VkAttachmentReference colorRef;
         colorRef.attachment = attachmentCount.get();
@@ -1064,9 +1057,9 @@
             colorResolveAttachmentRefs.push_back(colorRef);
         }
 
-        UnpackColorResolveAttachmentDesc(&attachmentDescs[attachmentCount.get()], format,
-                                         desc.hasColorUnresolveAttachment(colorIndexGL),
-                                         isColorInvalidated.test(colorIndexGL));
+        UnpackColorResolveAttachmentDesc(
+            &attachmentDescs[attachmentCount.get()], attachmentFormatID,
+            desc.hasColorUnresolveAttachment(colorIndexGL), isColorInvalidated.test(colorIndexGL));
 
         ++attachmentCount;
     }
@@ -1078,8 +1071,8 @@
 
         uint32_t depthStencilIndexGL = static_cast<uint32_t>(desc.depthStencilAttachmentIndex());
 
-        const Format &format             = renderer->getFormat(desc[depthStencilIndexGL]);
-        const angle::Format &angleFormat = format.intendedFormat();
+        angle::FormatID attachmentFormatID = desc[depthStencilIndexGL];
+        const angle::Format &angleFormat   = angle::Format::Get(attachmentFormatID);
 
         // Treat missing aspect as invalidated for the purpose of the resolve attachment.
         if (angleFormat.depthBits == 0)
@@ -1105,8 +1098,9 @@
         }
 
         UnpackDepthStencilResolveAttachmentDesc(
-            &attachmentDescs[attachmentCount.get()], format, desc.hasDepthUnresolveAttachment(),
-            desc.hasStencilUnresolveAttachment(), isDepthInvalidated, isStencilInvalidated);
+            &attachmentDescs[attachmentCount.get()], attachmentFormatID,
+            desc.hasDepthUnresolveAttachment(), desc.hasStencilUnresolveAttachment(),
+            isDepthInvalidated, isStencilInvalidated);
 
         ++attachmentCount;
     }
@@ -1795,13 +1789,13 @@
         }
 
         // Get the corresponding VkFormat for the attrib's format.
-        angle::FormatID formatID         = static_cast<angle::FormatID>(packedAttrib.format);
-        const Format &format             = contextVk->getRenderer()->getFormat(formatID);
-        const angle::Format &angleFormat = format.intendedFormat();
-        VkFormat vkFormat                = format.actualBufferVkFormat(packedAttrib.compressed);
+        angle::FormatID formatID            = static_cast<angle::FormatID>(packedAttrib.format);
+        const Format &format                = contextVk->getRenderer()->getFormat(formatID);
+        const angle::Format &intendedFormat = format.getIntendedFormat();
+        VkFormat vkFormat = format.getActualBufferVkFormat(packedAttrib.compressed);
 
-        gl::ComponentType attribType =
-            GetVertexAttributeComponentType(angleFormat.isPureInt(), angleFormat.vertexAttribType);
+        gl::ComponentType attribType = GetVertexAttributeComponentType(
+            intendedFormat.isPureInt(), intendedFormat.vertexAttribType);
         gl::ComponentType programAttribType =
             gl::GetComponentTypeMask(programAttribsTypeMask, attribIndex);
 
@@ -1820,27 +1814,22 @@
             {
                 // When converting from an unsigned to a signed format or vice versa, attempt to
                 // match the bit width.
-                angle::FormatID convertedFormatID = gl::ConvertFormatSignedness(angleFormat);
+                angle::FormatID convertedFormatID = gl::ConvertFormatSignedness(intendedFormat);
                 const Format &convertedFormat =
                     contextVk->getRenderer()->getFormat(convertedFormatID);
-                ASSERT(angleFormat.channelCount == convertedFormat.intendedFormat().channelCount);
-                ASSERT(angleFormat.redBits == convertedFormat.intendedFormat().redBits);
-                ASSERT(angleFormat.greenBits == convertedFormat.intendedFormat().greenBits);
-                ASSERT(angleFormat.blueBits == convertedFormat.intendedFormat().blueBits);
-                ASSERT(angleFormat.alphaBits == convertedFormat.intendedFormat().alphaBits);
+                ASSERT(intendedFormat.channelCount ==
+                       convertedFormat.getIntendedFormat().channelCount);
+                ASSERT(intendedFormat.redBits == convertedFormat.getIntendedFormat().redBits);
+                ASSERT(intendedFormat.greenBits == convertedFormat.getIntendedFormat().greenBits);
+                ASSERT(intendedFormat.blueBits == convertedFormat.getIntendedFormat().blueBits);
+                ASSERT(intendedFormat.alphaBits == convertedFormat.getIntendedFormat().alphaBits);
 
-                vkFormat = convertedFormat.actualBufferVkFormat(packedAttrib.compressed);
+                vkFormat = convertedFormat.getActualBufferVkFormat(packedAttrib.compressed);
             }
 
-            GLenum programAttributeType =
-                contextVk->getState().getProgramExecutable()->getProgramInputs()[attribIndex].type;
-            GLuint attribSize = gl::GetVertexFormatFromID(formatID).components;
-            GLuint shaderVarSize =
-                static_cast<GLuint>(gl::VariableColumnCount(programAttributeType));
-
             ASSERT(contextVk->getNativeExtensions().relaxedVertexAttributeTypeANGLE);
             if (programAttribType == gl::ComponentType::Float ||
-                attribType == gl::ComponentType::Float || attribSize != shaderVarSize)
+                attribType == gl::ComponentType::Float)
             {
                 bindingDesc.stride = 0;  // Prevent out-of-bounds accesses.
             }
@@ -1957,7 +1946,7 @@
 
     VkPipelineRasterizationStateStreamCreateInfoEXT rasterStreamState = {};
     rasterStreamState.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_STREAM_CREATE_INFO_EXT;
-    if (contextVk->getFeatures().supportsTransformFeedbackExtension.enabled)
+    if (contextVk->getFeatures().supportsGeometryStreamsCapability.enabled)
     {
         rasterStreamState.rasterizationStream = 0;
         *pNextPtr                             = &rasterStreamState;
@@ -2040,7 +2029,7 @@
             {
                 ASSERT(!contextVk->getRenderer()
                             ->getFormat(mRenderPassDesc[colorIndexGL])
-                            .actualImageFormat()
+                            .getActualRenderableImageFormat()
                             .isInt());
                 state.blendEnable = VK_TRUE;
                 UnpackBlendAttachmentState(inputAndBlend.attachments[colorIndexGL], &state);
@@ -3102,9 +3091,9 @@
                          const gl::SamplerState &samplerState,
                          bool stencilMode,
                          uint64_t externalFormat,
-                         angle::FormatID formatID)
+                         angle::FormatID intendedFormatID)
 {
-    update(contextVk, samplerState, stencilMode, externalFormat, formatID);
+    update(contextVk, samplerState, stencilMode, externalFormat, intendedFormatID);
 }
 
 void SamplerDesc::reset()
@@ -3136,7 +3125,7 @@
                          const gl::SamplerState &samplerState,
                          bool stencilMode,
                          uint64_t externalFormat,
-                         angle::FormatID formatID)
+                         angle::FormatID intendedFormatID)
 {
     const angle::FeaturesVk &featuresVk = contextVk->getFeatures();
     mMipLodBias                         = 0.0f;
@@ -3156,13 +3145,23 @@
     mMaxLod        = samplerState.getMaxLod();
 
     // GL has no notion of external format, this must be provided from metadata from the image
-    const vk::Format &vkFormat = contextVk->getRenderer()->getFormat(formatID);
-    mIsExternalFormat          = (externalFormat != 0) ? 1 : 0;
-    mExternalOrVkFormat        = (externalFormat != 0)
-                              ? externalFormat
-                              : (vkFormat.intendedFormat().isYUV)
-                                    ? static_cast<uint64_t>(vkFormat.actualImageVkFormat())
-                                    : 0;
+    const vk::Format &vkFormat = contextVk->getRenderer()->getFormat(intendedFormatID);
+    if (externalFormat)
+    {
+        mIsExternalFormat   = 1;
+        mExternalOrVkFormat = externalFormat;
+    }
+    else
+    {
+        mIsExternalFormat   = 0;
+        mExternalOrVkFormat = 0;
+        if (vkFormat.getIntendedFormat().isYUV)
+        {
+            ASSERT(!vkFormat.hasRenderableImageFallbackFormat());
+            mExternalOrVkFormat =
+                ToUnderlying(vkFormat.getActualImageVkFormat(vk::ImageAccess::SampleOnly));
+        }
+    }
 
     bool compareEnable    = samplerState.getCompareMode() == GL_COMPARE_REF_TO_TEXTURE;
     VkCompareOp compareOp = gl_vk::GetCompareOp(samplerState.getCompareFunc());
@@ -3211,9 +3210,9 @@
         (samplerState.getBorderColor().type == angle::ColorGeneric::Type::Float) ? 0 : 1;
 
     mBorderColor = samplerState.getBorderColor().colorF;
-    if (vkFormat.intendedFormatID != angle::FormatID::NONE)
+    if (vkFormat.getIntendedFormatID() != angle::FormatID::NONE)
     {
-        LoadTextureBorderFunctionInfo loadFunction = vkFormat.textureBorderLoadFunctions();
+        LoadTextureBorderFunctionInfo loadFunction = vkFormat.getTextureBorderLoadFunctions();
         loadFunction.loadFunction(mBorderColor);
     }
 
diff --git a/src/libANGLE/renderer/vulkan/vk_cache_utils.h b/src/libANGLE/renderer/vulkan/vk_cache_utils.h
index 81e6a59..9307dc9 100644
--- a/src/libANGLE/renderer/vulkan/vk_cache_utils.h
+++ b/src/libANGLE/renderer/vulkan/vk_cache_utils.h
@@ -840,7 +840,7 @@
                 const gl::SamplerState &samplerState,
                 bool stencilMode,
                 uint64_t externalFormat,
-                angle::FormatID formatID);
+                angle::FormatID intendedFormatID);
     ~SamplerDesc();
 
     SamplerDesc(const SamplerDesc &other);
@@ -850,7 +850,7 @@
                 const gl::SamplerState &samplerState,
                 bool stencilMode,
                 uint64_t externalFormat,
-                angle::FormatID formatID);
+                angle::FormatID intendedFormatID);
     void reset();
     angle::Result init(ContextVk *contextVk, Sampler *sampler) const;
 
diff --git a/src/libANGLE/renderer/vulkan/vk_caps_utils.cpp b/src/libANGLE/renderer/vulkan/vk_caps_utils.cpp
index 778e5bc..73edf3f 100644
--- a/src/libANGLE/renderer/vulkan/vk_caps_utils.cpp
+++ b/src/libANGLE/renderer/vulkan/vk_caps_utils.cpp
@@ -45,20 +45,22 @@
         if (baseCaps.texturable && baseCaps.filterable)
         {
             const Format &vkFormat = rendererVk->getFormat(glFormat);
+            // For capability query, we use the renderable format since that is what we are capable
+            // of when we fallback.
+            angle::FormatID imageFormatID = vkFormat.getActualRenderableImageFormatID();
 
-            angle::FormatID reinterpretedFormatID =
-                checkLinearColorspace ? ConvertToLinear(vkFormat.actualImageFormatID)
-                                      : ConvertToSRGB(vkFormat.actualImageFormatID);
+            angle::FormatID reinterpretedFormatID = checkLinearColorspace
+                                                        ? ConvertToLinear(imageFormatID)
+                                                        : ConvertToSRGB(imageFormatID);
 
             const Format &reinterpretedVkFormat = rendererVk->getFormat(reinterpretedFormatID);
 
-            if (reinterpretedVkFormat.actualImageFormatID != reinterpretedFormatID)
+            if (reinterpretedVkFormat.getActualRenderableImageFormatID() != reinterpretedFormatID)
             {
                 return false;
             }
 
-            if (!rendererVk->haveSameFormatFeatureBits(vkFormat.actualImageFormatID,
-                                                       reinterpretedFormatID))
+            if (!rendererVk->haveSameFormatFeatureBits(imageFormatID, reinterpretedFormatID))
             {
                 return false;
             }
@@ -175,7 +177,7 @@
     const Format &formatVk = rendererVk->getFormat(formatGL);
 
     return rendererVk->hasBufferFormatFeatureBits(
-        formatVk.actualBufferFormatID,
+        formatVk.getActualBufferFormat(false).id,
         VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT);
 }
 
@@ -273,12 +275,14 @@
 
     const Format &twoPlane8bitYuvFormat = rendererVk->getFormat(GL_G8_B8R8_2PLANE_420_UNORM_ANGLE);
     bool twoPlane8bitYuvFormatSupported = rendererVk->hasImageFormatFeatureBits(
-        twoPlane8bitYuvFormat.actualImageFormatID, VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT);
+        twoPlane8bitYuvFormat.getActualImageFormatID(vk::ImageAccess::SampleOnly),
+        VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT);
 
     const Format &threePlane8bitYuvFormat =
         rendererVk->getFormat(GL_G8_B8_R8_3PLANE_420_UNORM_ANGLE);
     bool threePlane8bitYuvFormatSupported = rendererVk->hasImageFormatFeatureBits(
-        threePlane8bitYuvFormat.actualImageFormatID, VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT);
+        threePlane8bitYuvFormat.getActualImageFormatID(vk::ImageAccess::SampleOnly),
+        VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT);
 
     return twoPlane8bitYuvFormatSupported && threePlane8bitYuvFormatSupported;
 }
@@ -344,6 +348,7 @@
     mNativeExtensions.drawBuffers            = true;
     mNativeExtensions.fragDepth              = true;
     mNativeExtensions.framebufferBlitANGLE   = true;
+    mNativeExtensions.framebufferBlitNV      = true;
     mNativeExtensions.framebufferMultisample = true;
     mNativeExtensions.multisampledRenderToTexture =
         getFeatures().enableMultisampledRenderToTexture.enabled;
@@ -408,20 +413,27 @@
 
     mNativeExtensions.vertexAttribType1010102OES = true;
 
-    // We use secondary command buffers almost everywhere and they require a feature to be
-    // able to execute in the presence of queries.  As a result, we won't support queries
-    // unless that feature is available.
-    mNativeExtensions.occlusionQueryBoolean =
-        vk::CommandBuffer::SupportsQueries(mPhysicalDeviceFeatures);
+    // Occlusion queries are natively supported in Vulkan.  ANGLE only issues this query inside a
+    // render pass, so there is no dependency to `inheritedQueries`.
+    mNativeExtensions.occlusionQueryBoolean = true;
 
     // From the Vulkan specs:
     // > The number of valid bits in a timestamp value is determined by the
     // > VkQueueFamilyProperties::timestampValidBits property of the queue on which the timestamp is
     // > written. Timestamps are supported on any queue which reports a non-zero value for
     // > timestampValidBits via vkGetPhysicalDeviceQueueFamilyProperties.
-    mNativeExtensions.disjointTimerQuery          = queueFamilyProperties.timestampValidBits > 0;
-    mNativeExtensions.queryCounterBitsTimeElapsed = queueFamilyProperties.timestampValidBits;
-    mNativeExtensions.queryCounterBitsTimestamp   = queueFamilyProperties.timestampValidBits;
+    //
+    // This query is applicable to render passes, but the `inheritedQueries` feature may not be
+    // present.  The extension is not exposed in that case.
+    // We use secondary command buffers almost everywhere and they require a feature to be
+    // able to execute in the presence of queries.  As a result, we won't support queries
+    // unless that feature is available.
+    if (vk::CommandBuffer::SupportsQueries(mPhysicalDeviceFeatures))
+    {
+        mNativeExtensions.disjointTimerQuery = queueFamilyProperties.timestampValidBits > 0;
+        mNativeExtensions.queryCounterBitsTimeElapsed = queueFamilyProperties.timestampValidBits;
+        mNativeExtensions.queryCounterBitsTimestamp   = queueFamilyProperties.timestampValidBits;
+    }
 
     mNativeExtensions.textureFilterAnisotropic =
         mPhysicalDeviceFeatures.samplerAnisotropy && limitsVk.maxSamplerAnisotropy > 1.0f;
@@ -1072,6 +1084,12 @@
     // GL_ANGLE_yuv_internal_format
     mNativeExtensions.yuvInternalFormatANGLE =
         getFeatures().supportsYUVSamplerConversion.enabled && vk::CanSupportYuvInternalFormat(this);
+
+    // GL_EXT_primitive_bounding_box
+    mNativeExtensions.primitiveBoundingBoxEXT = true;
+
+    // GL_EXT_protected_textures
+    mNativeExtensions.protectedTexturesEXT = mFeatures.supportsProtectedMemory.enabled;
 }
 
 namespace vk
diff --git a/src/libANGLE/renderer/vulkan/vk_format_table_autogen.cpp b/src/libANGLE/renderer/vulkan/vk_format_table_autogen.cpp
index 0744583..1ac4c8a 100644
--- a/src/libANGLE/renderer/vulkan/vk_format_table_autogen.cpp
+++ b/src/libANGLE/renderer/vulkan/vk_format_table_autogen.cpp
@@ -26,214 +26,214 @@
     switch (angleFormat.id)
     {
         case angle::FormatID::A16_FLOAT:
-            intendedGLFormat         = GL_ALPHA16F_EXT;
-            actualImageFormatID      = angle::FormatID::R16_FLOAT;
-            imageInitializerFunction = nullptr;
+            mIntendedGLFormat              = GL_ALPHA16F_EXT;
+            mActualSampleOnlyImageFormatID = angle::FormatID::R16_FLOAT;
+            mImageInitializerFunction      = nullptr;
 
             break;
 
         case angle::FormatID::A1R5G5B5_UNORM:
-            intendedGLFormat             = GL_A1RGB5_ANGLEX;
-            actualImageFormatID          = angle::FormatID::A1R5G5B5_UNORM;
-            imageInitializerFunction     = nullptr;
-            actualBufferFormatID         = angle::FormatID::A1R5G5B5_UNORM;
-            vkBufferFormatIsPacked       = true;
-            vertexLoadFunction           = CopyNativeVertexData<GLushort, 1, 1, 0>;
-            vertexLoadRequiresConversion = false;
+            mIntendedGLFormat              = GL_A1RGB5_ANGLEX;
+            mActualSampleOnlyImageFormatID = angle::FormatID::A1R5G5B5_UNORM;
+            mImageInitializerFunction      = nullptr;
+            mActualBufferFormatID          = angle::FormatID::A1R5G5B5_UNORM;
+            mVkBufferFormatIsPacked        = true;
+            mVertexLoadFunction            = CopyNativeVertexData<GLushort, 1, 1, 0>;
+            mVertexLoadRequiresConversion  = false;
             break;
 
         case angle::FormatID::A2R10G10B10_SINT_VERTEX:
-            intendedGLFormat             = GL_INT_10_10_10_2_OES;
-            actualImageFormatID          = angle::FormatID::NONE;
-            imageInitializerFunction     = nullptr;
-            actualBufferFormatID         = angle::FormatID::R16G16B16A16_FLOAT;
-            vkBufferFormatIsPacked       = false;
-            vertexLoadFunction           = CopyW2XYZ10ToXYZWFloatVertexData<true, false, true>;
-            vertexLoadRequiresConversion = true;
+            mIntendedGLFormat              = GL_INT_10_10_10_2_OES;
+            mActualSampleOnlyImageFormatID = angle::FormatID::NONE;
+            mImageInitializerFunction      = nullptr;
+            mActualBufferFormatID          = angle::FormatID::R16G16B16A16_FLOAT;
+            mVkBufferFormatIsPacked        = false;
+            mVertexLoadFunction            = CopyW2XYZ10ToXYZWFloatVertexData<true, false, true>;
+            mVertexLoadRequiresConversion  = true;
             break;
 
         case angle::FormatID::A2R10G10B10_SNORM_VERTEX:
-            intendedGLFormat             = GL_A2_RGB10_SNORM_ANGLEX;
-            actualImageFormatID          = angle::FormatID::NONE;
-            imageInitializerFunction     = nullptr;
-            actualBufferFormatID         = angle::FormatID::R16G16B16A16_FLOAT;
-            vkBufferFormatIsPacked       = false;
-            vertexLoadFunction           = CopyW2XYZ10ToXYZWFloatVertexData<true, true, true>;
-            vertexLoadRequiresConversion = true;
+            mIntendedGLFormat              = GL_A2_RGB10_SNORM_ANGLEX;
+            mActualSampleOnlyImageFormatID = angle::FormatID::NONE;
+            mImageInitializerFunction      = nullptr;
+            mActualBufferFormatID          = angle::FormatID::R16G16B16A16_FLOAT;
+            mVkBufferFormatIsPacked        = false;
+            mVertexLoadFunction            = CopyW2XYZ10ToXYZWFloatVertexData<true, true, true>;
+            mVertexLoadRequiresConversion  = true;
             break;
 
         case angle::FormatID::A2R10G10B10_SSCALED_VERTEX:
-            intendedGLFormat             = GL_A2_RGB10_SSCALED_ANGLEX;
-            actualImageFormatID          = angle::FormatID::NONE;
-            imageInitializerFunction     = nullptr;
-            actualBufferFormatID         = angle::FormatID::R16G16B16A16_FLOAT;
-            vkBufferFormatIsPacked       = false;
-            vertexLoadFunction           = CopyW2XYZ10ToXYZWFloatVertexData<true, false, true>;
-            vertexLoadRequiresConversion = true;
+            mIntendedGLFormat              = GL_A2_RGB10_SSCALED_ANGLEX;
+            mActualSampleOnlyImageFormatID = angle::FormatID::NONE;
+            mImageInitializerFunction      = nullptr;
+            mActualBufferFormatID          = angle::FormatID::R16G16B16A16_FLOAT;
+            mVkBufferFormatIsPacked        = false;
+            mVertexLoadFunction            = CopyW2XYZ10ToXYZWFloatVertexData<true, false, true>;
+            mVertexLoadRequiresConversion  = true;
             break;
 
         case angle::FormatID::A2R10G10B10_UINT_VERTEX:
-            intendedGLFormat             = GL_UNSIGNED_INT_10_10_10_2_OES;
-            actualImageFormatID          = angle::FormatID::NONE;
-            imageInitializerFunction     = nullptr;
-            actualBufferFormatID         = angle::FormatID::R16G16B16A16_FLOAT;
-            vkBufferFormatIsPacked       = false;
-            vertexLoadFunction           = CopyW2XYZ10ToXYZWFloatVertexData<false, false, true>;
-            vertexLoadRequiresConversion = true;
+            mIntendedGLFormat              = GL_UNSIGNED_INT_10_10_10_2_OES;
+            mActualSampleOnlyImageFormatID = angle::FormatID::NONE;
+            mImageInitializerFunction      = nullptr;
+            mActualBufferFormatID          = angle::FormatID::R16G16B16A16_FLOAT;
+            mVkBufferFormatIsPacked        = false;
+            mVertexLoadFunction            = CopyW2XYZ10ToXYZWFloatVertexData<false, false, true>;
+            mVertexLoadRequiresConversion  = true;
             break;
 
         case angle::FormatID::A2R10G10B10_UNORM_VERTEX:
-            intendedGLFormat             = GL_A2_RGB10_UNORM_ANGLEX;
-            actualImageFormatID          = angle::FormatID::NONE;
-            imageInitializerFunction     = nullptr;
-            actualBufferFormatID         = angle::FormatID::R16G16B16A16_FLOAT;
-            vkBufferFormatIsPacked       = false;
-            vertexLoadFunction           = CopyW2XYZ10ToXYZWFloatVertexData<false, true, true>;
-            vertexLoadRequiresConversion = true;
+            mIntendedGLFormat              = GL_A2_RGB10_UNORM_ANGLEX;
+            mActualSampleOnlyImageFormatID = angle::FormatID::NONE;
+            mImageInitializerFunction      = nullptr;
+            mActualBufferFormatID          = angle::FormatID::R16G16B16A16_FLOAT;
+            mVkBufferFormatIsPacked        = false;
+            mVertexLoadFunction            = CopyW2XYZ10ToXYZWFloatVertexData<false, true, true>;
+            mVertexLoadRequiresConversion  = true;
             break;
 
         case angle::FormatID::A2R10G10B10_USCALED_VERTEX:
-            intendedGLFormat             = GL_A2_RGB10_USCALED_ANGLEX;
-            actualImageFormatID          = angle::FormatID::NONE;
-            imageInitializerFunction     = nullptr;
-            actualBufferFormatID         = angle::FormatID::R16G16B16A16_FLOAT;
-            vkBufferFormatIsPacked       = false;
-            vertexLoadFunction           = CopyW2XYZ10ToXYZWFloatVertexData<false, false, true>;
-            vertexLoadRequiresConversion = true;
+            mIntendedGLFormat              = GL_A2_RGB10_USCALED_ANGLEX;
+            mActualSampleOnlyImageFormatID = angle::FormatID::NONE;
+            mImageInitializerFunction      = nullptr;
+            mActualBufferFormatID          = angle::FormatID::R16G16B16A16_FLOAT;
+            mVkBufferFormatIsPacked        = false;
+            mVertexLoadFunction            = CopyW2XYZ10ToXYZWFloatVertexData<false, false, true>;
+            mVertexLoadRequiresConversion  = true;
             break;
 
         case angle::FormatID::A32_FLOAT:
-            intendedGLFormat         = GL_ALPHA32F_EXT;
-            actualImageFormatID      = angle::FormatID::R32_FLOAT;
-            imageInitializerFunction = nullptr;
+            mIntendedGLFormat              = GL_ALPHA32F_EXT;
+            mActualSampleOnlyImageFormatID = angle::FormatID::R32_FLOAT;
+            mImageInitializerFunction      = nullptr;
 
             break;
 
         case angle::FormatID::A8_UNORM:
-            intendedGLFormat         = GL_ALPHA8_EXT;
-            actualImageFormatID      = angle::FormatID::R8_UNORM;
-            imageInitializerFunction = nullptr;
+            mIntendedGLFormat              = GL_ALPHA8_EXT;
+            mActualSampleOnlyImageFormatID = angle::FormatID::R8_UNORM;
+            mImageInitializerFunction      = nullptr;
 
             break;
 
         case angle::FormatID::ASTC_10x10_SRGB_BLOCK:
-            intendedGLFormat             = GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x10_KHR;
-            actualImageFormatID          = angle::FormatID::ASTC_10x10_SRGB_BLOCK;
-            imageInitializerFunction     = nullptr;
-            actualBufferFormatID         = angle::FormatID::ASTC_10x10_SRGB_BLOCK;
-            vkBufferFormatIsPacked       = false;
-            vertexLoadFunction           = nullptr;
-            vertexLoadRequiresConversion = false;
+            mIntendedGLFormat              = GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x10_KHR;
+            mActualSampleOnlyImageFormatID = angle::FormatID::ASTC_10x10_SRGB_BLOCK;
+            mImageInitializerFunction      = nullptr;
+            mActualBufferFormatID          = angle::FormatID::ASTC_10x10_SRGB_BLOCK;
+            mVkBufferFormatIsPacked        = false;
+            mVertexLoadFunction            = nullptr;
+            mVertexLoadRequiresConversion  = false;
             break;
 
         case angle::FormatID::ASTC_10x10_UNORM_BLOCK:
-            intendedGLFormat             = GL_COMPRESSED_RGBA_ASTC_10x10_KHR;
-            actualImageFormatID          = angle::FormatID::ASTC_10x10_UNORM_BLOCK;
-            imageInitializerFunction     = nullptr;
-            actualBufferFormatID         = angle::FormatID::ASTC_10x10_UNORM_BLOCK;
-            vkBufferFormatIsPacked       = false;
-            vertexLoadFunction           = nullptr;
-            vertexLoadRequiresConversion = false;
+            mIntendedGLFormat              = GL_COMPRESSED_RGBA_ASTC_10x10_KHR;
+            mActualSampleOnlyImageFormatID = angle::FormatID::ASTC_10x10_UNORM_BLOCK;
+            mImageInitializerFunction      = nullptr;
+            mActualBufferFormatID          = angle::FormatID::ASTC_10x10_UNORM_BLOCK;
+            mVkBufferFormatIsPacked        = false;
+            mVertexLoadFunction            = nullptr;
+            mVertexLoadRequiresConversion  = false;
             break;
 
         case angle::FormatID::ASTC_10x5_SRGB_BLOCK:
-            intendedGLFormat             = GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x5_KHR;
-            actualImageFormatID          = angle::FormatID::ASTC_10x5_SRGB_BLOCK;
-            imageInitializerFunction     = nullptr;
-            actualBufferFormatID         = angle::FormatID::ASTC_10x5_SRGB_BLOCK;
-            vkBufferFormatIsPacked       = false;
-            vertexLoadFunction           = nullptr;
-            vertexLoadRequiresConversion = false;
+            mIntendedGLFormat              = GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x5_KHR;
+            mActualSampleOnlyImageFormatID = angle::FormatID::ASTC_10x5_SRGB_BLOCK;
+            mImageInitializerFunction      = nullptr;
+            mActualBufferFormatID          = angle::FormatID::ASTC_10x5_SRGB_BLOCK;
+            mVkBufferFormatIsPacked        = false;
+            mVertexLoadFunction            = nullptr;
+            mVertexLoadRequiresConversion  = false;
             break;
 
         case angle::FormatID::ASTC_10x5_UNORM_BLOCK:
-            intendedGLFormat             = GL_COMPRESSED_RGBA_ASTC_10x5_KHR;
-            actualImageFormatID          = angle::FormatID::ASTC_10x5_UNORM_BLOCK;
-            imageInitializerFunction     = nullptr;
-            actualBufferFormatID         = angle::FormatID::ASTC_10x5_UNORM_BLOCK;
-            vkBufferFormatIsPacked       = false;
-            vertexLoadFunction           = nullptr;
-            vertexLoadRequiresConversion = false;
+            mIntendedGLFormat              = GL_COMPRESSED_RGBA_ASTC_10x5_KHR;
+            mActualSampleOnlyImageFormatID = angle::FormatID::ASTC_10x5_UNORM_BLOCK;
+            mImageInitializerFunction      = nullptr;
+            mActualBufferFormatID          = angle::FormatID::ASTC_10x5_UNORM_BLOCK;
+            mVkBufferFormatIsPacked        = false;
+            mVertexLoadFunction            = nullptr;
+            mVertexLoadRequiresConversion  = false;
             break;
 
         case angle::FormatID::ASTC_10x6_SRGB_BLOCK:
-            intendedGLFormat             = GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x6_KHR;
-            actualImageFormatID          = angle::FormatID::ASTC_10x6_SRGB_BLOCK;
-            imageInitializerFunction     = nullptr;
-            actualBufferFormatID         = angle::FormatID::ASTC_10x6_SRGB_BLOCK;
-            vkBufferFormatIsPacked       = false;
-            vertexLoadFunction           = nullptr;
-            vertexLoadRequiresConversion = false;
+            mIntendedGLFormat              = GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x6_KHR;
+            mActualSampleOnlyImageFormatID = angle::FormatID::ASTC_10x6_SRGB_BLOCK;
+            mImageInitializerFunction      = nullptr;
+            mActualBufferFormatID          = angle::FormatID::ASTC_10x6_SRGB_BLOCK;
+            mVkBufferFormatIsPacked        = false;
+            mVertexLoadFunction            = nullptr;
+            mVertexLoadRequiresConversion  = false;
             break;
 
         case angle::FormatID::ASTC_10x6_UNORM_BLOCK:
-            intendedGLFormat             = GL_COMPRESSED_RGBA_ASTC_10x6_KHR;
-            actualImageFormatID          = angle::FormatID::ASTC_10x6_UNORM_BLOCK;
-            imageInitializerFunction     = nullptr;
-            actualBufferFormatID         = angle::FormatID::ASTC_10x6_UNORM_BLOCK;
-            vkBufferFormatIsPacked       = false;
-            vertexLoadFunction           = nullptr;
-            vertexLoadRequiresConversion = false;
+            mIntendedGLFormat              = GL_COMPRESSED_RGBA_ASTC_10x6_KHR;
+            mActualSampleOnlyImageFormatID = angle::FormatID::ASTC_10x6_UNORM_BLOCK;
+            mImageInitializerFunction      = nullptr;
+            mActualBufferFormatID          = angle::FormatID::ASTC_10x6_UNORM_BLOCK;
+            mVkBufferFormatIsPacked        = false;
+            mVertexLoadFunction            = nullptr;
+            mVertexLoadRequiresConversion  = false;
             break;
 
         case angle::FormatID::ASTC_10x8_SRGB_BLOCK:
-            intendedGLFormat             = GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x8_KHR;
-            actualImageFormatID          = angle::FormatID::ASTC_10x8_SRGB_BLOCK;
-            imageInitializerFunction     = nullptr;
-            actualBufferFormatID         = angle::FormatID::ASTC_10x8_SRGB_BLOCK;
-            vkBufferFormatIsPacked       = false;
-            vertexLoadFunction           = nullptr;
-            vertexLoadRequiresConversion = false;
+            mIntendedGLFormat              = GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x8_KHR;
+            mActualSampleOnlyImageFormatID = angle::FormatID::ASTC_10x8_SRGB_BLOCK;
+            mImageInitializerFunction      = nullptr;
+            mActualBufferFormatID          = angle::FormatID::ASTC_10x8_SRGB_BLOCK;
+            mVkBufferFormatIsPacked        = false;
+            mVertexLoadFunction            = nullptr;
+            mVertexLoadRequiresConversion  = false;
             break;
 
         case angle::FormatID::ASTC_10x8_UNORM_BLOCK:
-            intendedGLFormat             = GL_COMPRESSED_RGBA_ASTC_10x8_KHR;
-            actualImageFormatID          = angle::FormatID::ASTC_10x8_UNORM_BLOCK;
-            imageInitializerFunction     = nullptr;
-            actualBufferFormatID         = angle::FormatID::ASTC_10x8_UNORM_BLOCK;
-            vkBufferFormatIsPacked       = false;
-            vertexLoadFunction           = nullptr;
-            vertexLoadRequiresConversion = false;
+            mIntendedGLFormat              = GL_COMPRESSED_RGBA_ASTC_10x8_KHR;
+            mActualSampleOnlyImageFormatID = angle::FormatID::ASTC_10x8_UNORM_BLOCK;
+            mImageInitializerFunction      = nullptr;
+            mActualBufferFormatID          = angle::FormatID::ASTC_10x8_UNORM_BLOCK;
+            mVkBufferFormatIsPacked        = false;
+            mVertexLoadFunction            = nullptr;
+            mVertexLoadRequiresConversion  = false;
             break;
 
         case angle::FormatID::ASTC_12x10_SRGB_BLOCK:
-            intendedGLFormat             = GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x10_KHR;
-            actualImageFormatID          = angle::FormatID::ASTC_12x10_SRGB_BLOCK;
-            imageInitializerFunction     = nullptr;
-            actualBufferFormatID         = angle::FormatID::ASTC_12x10_SRGB_BLOCK;
-            vkBufferFormatIsPacked       = false;
-            vertexLoadFunction           = nullptr;
-            vertexLoadRequiresConversion = false;
+            mIntendedGLFormat              = GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x10_KHR;
+            mActualSampleOnlyImageFormatID = angle::FormatID::ASTC_12x10_SRGB_BLOCK;
+            mImageInitializerFunction      = nullptr;
+            mActualBufferFormatID          = angle::FormatID::ASTC_12x10_SRGB_BLOCK;
+            mVkBufferFormatIsPacked        = false;
+            mVertexLoadFunction            = nullptr;
+            mVertexLoadRequiresConversion  = false;
             break;
 
         case angle::FormatID::ASTC_12x10_UNORM_BLOCK:
-            intendedGLFormat             = GL_COMPRESSED_RGBA_ASTC_12x10_KHR;
-            actualImageFormatID          = angle::FormatID::ASTC_12x10_UNORM_BLOCK;
-            imageInitializerFunction     = nullptr;
-            actualBufferFormatID         = angle::FormatID::ASTC_12x10_UNORM_BLOCK;
-            vkBufferFormatIsPacked       = false;
-            vertexLoadFunction           = nullptr;
-            vertexLoadRequiresConversion = false;
+            mIntendedGLFormat              = GL_COMPRESSED_RGBA_ASTC_12x10_KHR;
+            mActualSampleOnlyImageFormatID = angle::FormatID::ASTC_12x10_UNORM_BLOCK;
+            mImageInitializerFunction      = nullptr;
+            mActualBufferFormatID          = angle::FormatID::ASTC_12x10_UNORM_BLOCK;
+            mVkBufferFormatIsPacked        = false;
+            mVertexLoadFunction            = nullptr;
+            mVertexLoadRequiresConversion  = false;
             break;
 
         case angle::FormatID::ASTC_12x12_SRGB_BLOCK:
-            intendedGLFormat             = GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x12_KHR;
-            actualImageFormatID          = angle::FormatID::ASTC_12x12_SRGB_BLOCK;
-            imageInitializerFunction     = nullptr;
-            actualBufferFormatID         = angle::FormatID::ASTC_12x12_SRGB_BLOCK;
-            vkBufferFormatIsPacked       = false;
-            vertexLoadFunction           = nullptr;
-            vertexLoadRequiresConversion = false;
+            mIntendedGLFormat              = GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x12_KHR;
+            mActualSampleOnlyImageFormatID = angle::FormatID::ASTC_12x12_SRGB_BLOCK;
+            mImageInitializerFunction      = nullptr;
+            mActualBufferFormatID          = angle::FormatID::ASTC_12x12_SRGB_BLOCK;
+            mVkBufferFormatIsPacked        = false;
+            mVertexLoadFunction            = nullptr;
+            mVertexLoadRequiresConversion  = false;
             break;
 
         case angle::FormatID::ASTC_12x12_UNORM_BLOCK:
-            intendedGLFormat             = GL_COMPRESSED_RGBA_ASTC_12x12_KHR;
-            actualImageFormatID          = angle::FormatID::ASTC_12x12_UNORM_BLOCK;
-            imageInitializerFunction     = nullptr;
-            actualBufferFormatID         = angle::FormatID::ASTC_12x12_UNORM_BLOCK;
-            vkBufferFormatIsPacked       = false;
-            vertexLoadFunction           = nullptr;
-            vertexLoadRequiresConversion = false;
+            mIntendedGLFormat              = GL_COMPRESSED_RGBA_ASTC_12x12_KHR;
+            mActualSampleOnlyImageFormatID = angle::FormatID::ASTC_12x12_UNORM_BLOCK;
+            mImageInitializerFunction      = nullptr;
+            mActualBufferFormatID          = angle::FormatID::ASTC_12x12_UNORM_BLOCK;
+            mVkBufferFormatIsPacked        = false;
+            mVertexLoadFunction            = nullptr;
+            mVertexLoadRequiresConversion  = false;
             break;
 
         case angle::FormatID::ASTC_3x3x3_UNORM_BLOCK:
@@ -253,23 +253,23 @@
             break;
 
         case angle::FormatID::ASTC_4x4_SRGB_BLOCK:
-            intendedGLFormat             = GL_COMPRESSED_SRGB8_ALPHA8_ASTC_4x4_KHR;
-            actualImageFormatID          = angle::FormatID::ASTC_4x4_SRGB_BLOCK;
-            imageInitializerFunction     = nullptr;
-            actualBufferFormatID         = angle::FormatID::ASTC_4x4_SRGB_BLOCK;
-            vkBufferFormatIsPacked       = false;
-            vertexLoadFunction           = nullptr;
-            vertexLoadRequiresConversion = false;
+            mIntendedGLFormat              = GL_COMPRESSED_SRGB8_ALPHA8_ASTC_4x4_KHR;
+            mActualSampleOnlyImageFormatID = angle::FormatID::ASTC_4x4_SRGB_BLOCK;
+            mImageInitializerFunction      = nullptr;
+            mActualBufferFormatID          = angle::FormatID::ASTC_4x4_SRGB_BLOCK;
+            mVkBufferFormatIsPacked        = false;
+            mVertexLoadFunction            = nullptr;
+            mVertexLoadRequiresConversion  = false;
             break;
 
         case angle::FormatID::ASTC_4x4_UNORM_BLOCK:
-            intendedGLFormat             = GL_COMPRESSED_RGBA_ASTC_4x4_KHR;
-            actualImageFormatID          = angle::FormatID::ASTC_4x4_UNORM_BLOCK;
-            imageInitializerFunction     = nullptr;
-            actualBufferFormatID         = angle::FormatID::ASTC_4x4_UNORM_BLOCK;
-            vkBufferFormatIsPacked       = false;
-            vertexLoadFunction           = nullptr;
-            vertexLoadRequiresConversion = false;
+            mIntendedGLFormat              = GL_COMPRESSED_RGBA_ASTC_4x4_KHR;
+            mActualSampleOnlyImageFormatID = angle::FormatID::ASTC_4x4_UNORM_BLOCK;
+            mImageInitializerFunction      = nullptr;
+            mActualBufferFormatID          = angle::FormatID::ASTC_4x4_UNORM_BLOCK;
+            mVkBufferFormatIsPacked        = false;
+            mVertexLoadFunction            = nullptr;
+            mVertexLoadRequiresConversion  = false;
             break;
 
         case angle::FormatID::ASTC_4x4x3_UNORM_BLOCK:
@@ -289,23 +289,23 @@
             break;
 
         case angle::FormatID::ASTC_5x4_SRGB_BLOCK:
-            intendedGLFormat             = GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x4_KHR;
-            actualImageFormatID          = angle::FormatID::ASTC_5x4_SRGB_BLOCK;
-            imageInitializerFunction     = nullptr;
-            actualBufferFormatID         = angle::FormatID::ASTC_5x4_SRGB_BLOCK;
-            vkBufferFormatIsPacked       = false;
-            vertexLoadFunction           = nullptr;
-            vertexLoadRequiresConversion = false;
+            mIntendedGLFormat              = GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x4_KHR;
+            mActualSampleOnlyImageFormatID = angle::FormatID::ASTC_5x4_SRGB_BLOCK;
+            mImageInitializerFunction      = nullptr;
+            mActualBufferFormatID          = angle::FormatID::ASTC_5x4_SRGB_BLOCK;
+            mVkBufferFormatIsPacked        = false;
+            mVertexLoadFunction            = nullptr;
+            mVertexLoadRequiresConversion  = false;
             break;
 
         case angle::FormatID::ASTC_5x4_UNORM_BLOCK:
-            intendedGLFormat             = GL_COMPRESSED_RGBA_ASTC_5x4_KHR;
-            actualImageFormatID          = angle::FormatID::ASTC_5x4_UNORM_BLOCK;
-            imageInitializerFunction     = nullptr;
-            actualBufferFormatID         = angle::FormatID::ASTC_5x4_UNORM_BLOCK;
-            vkBufferFormatIsPacked       = false;
-            vertexLoadFunction           = nullptr;
-            vertexLoadRequiresConversion = false;
+            mIntendedGLFormat              = GL_COMPRESSED_RGBA_ASTC_5x4_KHR;
+            mActualSampleOnlyImageFormatID = angle::FormatID::ASTC_5x4_UNORM_BLOCK;
+            mImageInitializerFunction      = nullptr;
+            mActualBufferFormatID          = angle::FormatID::ASTC_5x4_UNORM_BLOCK;
+            mVkBufferFormatIsPacked        = false;
+            mVertexLoadFunction            = nullptr;
+            mVertexLoadRequiresConversion  = false;
             break;
 
         case angle::FormatID::ASTC_5x4x4_UNORM_BLOCK:
@@ -317,23 +317,23 @@
             break;
 
         case angle::FormatID::ASTC_5x5_SRGB_BLOCK:
-            intendedGLFormat             = GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x5_KHR;
-            actualImageFormatID          = angle::FormatID::ASTC_5x5_SRGB_BLOCK;
-            imageInitializerFunction     = nullptr;
-            actualBufferFormatID         = angle::FormatID::ASTC_5x5_SRGB_BLOCK;
-            vkBufferFormatIsPacked       = false;
-            vertexLoadFunction           = nullptr;
-            vertexLoadRequiresConversion = false;
+            mIntendedGLFormat              = GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x5_KHR;
+            mActualSampleOnlyImageFormatID = angle::FormatID::ASTC_5x5_SRGB_BLOCK;
+            mImageInitializerFunction      = nullptr;
+            mActualBufferFormatID          = angle::FormatID::ASTC_5x5_SRGB_BLOCK;
+            mVkBufferFormatIsPacked        = false;
+            mVertexLoadFunction            = nullptr;
+            mVertexLoadRequiresConversion  = false;
             break;
 
         case angle::FormatID::ASTC_5x5_UNORM_BLOCK:
-            intendedGLFormat             = GL_COMPRESSED_RGBA_ASTC_5x5_KHR;
-            actualImageFormatID          = angle::FormatID::ASTC_5x5_UNORM_BLOCK;
-            imageInitializerFunction     = nullptr;
-            actualBufferFormatID         = angle::FormatID::ASTC_5x5_UNORM_BLOCK;
-            vkBufferFormatIsPacked       = false;
-            vertexLoadFunction           = nullptr;
-            vertexLoadRequiresConversion = false;
+            mIntendedGLFormat              = GL_COMPRESSED_RGBA_ASTC_5x5_KHR;
+            mActualSampleOnlyImageFormatID = angle::FormatID::ASTC_5x5_UNORM_BLOCK;
+            mImageInitializerFunction      = nullptr;
+            mActualBufferFormatID          = angle::FormatID::ASTC_5x5_UNORM_BLOCK;
+            mVkBufferFormatIsPacked        = false;
+            mVertexLoadFunction            = nullptr;
+            mVertexLoadRequiresConversion  = false;
             break;
 
         case angle::FormatID::ASTC_5x5x4_UNORM_BLOCK:
@@ -353,23 +353,23 @@
             break;
 
         case angle::FormatID::ASTC_6x5_SRGB_BLOCK:
-            intendedGLFormat             = GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x5_KHR;
-            actualImageFormatID          = angle::FormatID::ASTC_6x5_SRGB_BLOCK;
-            imageInitializerFunction     = nullptr;
-            actualBufferFormatID         = angle::FormatID::ASTC_6x5_SRGB_BLOCK;
-            vkBufferFormatIsPacked       = false;
-            vertexLoadFunction           = nullptr;
-            vertexLoadRequiresConversion = false;
+            mIntendedGLFormat              = GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x5_KHR;
+            mActualSampleOnlyImageFormatID = angle::FormatID::ASTC_6x5_SRGB_BLOCK;
+            mImageInitializerFunction      = nullptr;
+            mActualBufferFormatID          = angle::FormatID::ASTC_6x5_SRGB_BLOCK;
+            mVkBufferFormatIsPacked        = false;
+            mVertexLoadFunction            = nullptr;
+            mVertexLoadRequiresConversion  = false;
             break;
 
         case angle::FormatID::ASTC_6x5_UNORM_BLOCK:
-            intendedGLFormat             = GL_COMPRESSED_RGBA_ASTC_6x5_KHR;
-            actualImageFormatID          = angle::FormatID::ASTC_6x5_UNORM_BLOCK;
-            imageInitializerFunction     = nullptr;
-            actualBufferFormatID         = angle::FormatID::ASTC_6x5_UNORM_BLOCK;
-            vkBufferFormatIsPacked       = false;
-            vertexLoadFunction           = nullptr;
-            vertexLoadRequiresConversion = false;
+            mIntendedGLFormat              = GL_COMPRESSED_RGBA_ASTC_6x5_KHR;
+            mActualSampleOnlyImageFormatID = angle::FormatID::ASTC_6x5_UNORM_BLOCK;
+            mImageInitializerFunction      = nullptr;
+            mActualBufferFormatID          = angle::FormatID::ASTC_6x5_UNORM_BLOCK;
+            mVkBufferFormatIsPacked        = false;
+            mVertexLoadFunction            = nullptr;
+            mVertexLoadRequiresConversion  = false;
             break;
 
         case angle::FormatID::ASTC_6x5x5_UNORM_BLOCK:
@@ -381,23 +381,23 @@
             break;
 
         case angle::FormatID::ASTC_6x6_SRGB_BLOCK:
-            intendedGLFormat             = GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x6_KHR;
-            actualImageFormatID          = angle::FormatID::ASTC_6x6_SRGB_BLOCK;
-            imageInitializerFunction     = nullptr;
-            actualBufferFormatID         = angle::FormatID::ASTC_6x6_SRGB_BLOCK;
-            vkBufferFormatIsPacked       = false;
-            vertexLoadFunction           = nullptr;
-            vertexLoadRequiresConversion = false;
+            mIntendedGLFormat              = GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x6_KHR;
+            mActualSampleOnlyImageFormatID = angle::FormatID::ASTC_6x6_SRGB_BLOCK;
+            mImageInitializerFunction      = nullptr;
+            mActualBufferFormatID          = angle::FormatID::ASTC_6x6_SRGB_BLOCK;
+            mVkBufferFormatIsPacked        = false;
+            mVertexLoadFunction            = nullptr;
+            mVertexLoadRequiresConversion  = false;
             break;
 
         case angle::FormatID::ASTC_6x6_UNORM_BLOCK:
-            intendedGLFormat             = GL_COMPRESSED_RGBA_ASTC_6x6_KHR;
-            actualImageFormatID          = angle::FormatID::ASTC_6x6_UNORM_BLOCK;
-            imageInitializerFunction     = nullptr;
-            actualBufferFormatID         = angle::FormatID::ASTC_6x6_UNORM_BLOCK;
-            vkBufferFormatIsPacked       = false;
-            vertexLoadFunction           = nullptr;
-            vertexLoadRequiresConversion = false;
+            mIntendedGLFormat              = GL_COMPRESSED_RGBA_ASTC_6x6_KHR;
+            mActualSampleOnlyImageFormatID = angle::FormatID::ASTC_6x6_UNORM_BLOCK;
+            mImageInitializerFunction      = nullptr;
+            mActualBufferFormatID          = angle::FormatID::ASTC_6x6_UNORM_BLOCK;
+            mVkBufferFormatIsPacked        = false;
+            mVertexLoadFunction            = nullptr;
+            mVertexLoadRequiresConversion  = false;
             break;
 
         case angle::FormatID::ASTC_6x6x5_UNORM_BLOCK:
@@ -417,103 +417,103 @@
             break;
 
         case angle::FormatID::ASTC_8x5_SRGB_BLOCK:
-            intendedGLFormat             = GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x5_KHR;
-            actualImageFormatID          = angle::FormatID::ASTC_8x5_SRGB_BLOCK;
-            imageInitializerFunction     = nullptr;
-            actualBufferFormatID         = angle::FormatID::ASTC_8x5_SRGB_BLOCK;
-            vkBufferFormatIsPacked       = false;
-            vertexLoadFunction           = nullptr;
-            vertexLoadRequiresConversion = false;
+            mIntendedGLFormat              = GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x5_KHR;
+            mActualSampleOnlyImageFormatID = angle::FormatID::ASTC_8x5_SRGB_BLOCK;
+            mImageInitializerFunction      = nullptr;
+            mActualBufferFormatID          = angle::FormatID::ASTC_8x5_SRGB_BLOCK;
+            mVkBufferFormatIsPacked        = false;
+            mVertexLoadFunction            = nullptr;
+            mVertexLoadRequiresConversion  = false;
             break;
 
         case angle::FormatID::ASTC_8x5_UNORM_BLOCK:
-            intendedGLFormat             = GL_COMPRESSED_RGBA_ASTC_8x5_KHR;
-            actualImageFormatID          = angle::FormatID::ASTC_8x5_UNORM_BLOCK;
-            imageInitializerFunction     = nullptr;
-            actualBufferFormatID         = angle::FormatID::ASTC_8x5_UNORM_BLOCK;
-            vkBufferFormatIsPacked       = false;
-            vertexLoadFunction           = nullptr;
-            vertexLoadRequiresConversion = false;
+            mIntendedGLFormat              = GL_COMPRESSED_RGBA_ASTC_8x5_KHR;
+            mActualSampleOnlyImageFormatID = angle::FormatID::ASTC_8x5_UNORM_BLOCK;
+            mImageInitializerFunction      = nullptr;
+            mActualBufferFormatID          = angle::FormatID::ASTC_8x5_UNORM_BLOCK;
+            mVkBufferFormatIsPacked        = false;
+            mVertexLoadFunction            = nullptr;
+            mVertexLoadRequiresConversion  = false;
             break;
 
         case angle::FormatID::ASTC_8x6_SRGB_BLOCK:
-            intendedGLFormat             = GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x6_KHR;
-            actualImageFormatID          = angle::FormatID::ASTC_8x6_SRGB_BLOCK;
-            imageInitializerFunction     = nullptr;
-            actualBufferFormatID         = angle::FormatID::ASTC_8x6_SRGB_BLOCK;
-            vkBufferFormatIsPacked       = false;
-            vertexLoadFunction           = nullptr;
-            vertexLoadRequiresConversion = false;
+            mIntendedGLFormat              = GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x6_KHR;
+            mActualSampleOnlyImageFormatID = angle::FormatID::ASTC_8x6_SRGB_BLOCK;
+            mImageInitializerFunction      = nullptr;
+            mActualBufferFormatID          = angle::FormatID::ASTC_8x6_SRGB_BLOCK;
+            mVkBufferFormatIsPacked        = false;
+            mVertexLoadFunction            = nullptr;
+            mVertexLoadRequiresConversion  = false;
             break;
 
         case angle::FormatID::ASTC_8x6_UNORM_BLOCK:
-            intendedGLFormat             = GL_COMPRESSED_RGBA_ASTC_8x6_KHR;
-            actualImageFormatID          = angle::FormatID::ASTC_8x6_UNORM_BLOCK;
-            imageInitializerFunction     = nullptr;
-            actualBufferFormatID         = angle::FormatID::ASTC_8x6_UNORM_BLOCK;
-            vkBufferFormatIsPacked       = false;
-            vertexLoadFunction           = nullptr;
-            vertexLoadRequiresConversion = false;
+            mIntendedGLFormat              = GL_COMPRESSED_RGBA_ASTC_8x6_KHR;
+            mActualSampleOnlyImageFormatID = angle::FormatID::ASTC_8x6_UNORM_BLOCK;
+            mImageInitializerFunction      = nullptr;
+            mActualBufferFormatID          = angle::FormatID::ASTC_8x6_UNORM_BLOCK;
+            mVkBufferFormatIsPacked        = false;
+            mVertexLoadFunction            = nullptr;
+            mVertexLoadRequiresConversion  = false;
             break;
 
         case angle::FormatID::ASTC_8x8_SRGB_BLOCK:
-            intendedGLFormat             = GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x8_KHR;
-            actualImageFormatID          = angle::FormatID::ASTC_8x8_SRGB_BLOCK;
-            imageInitializerFunction     = nullptr;
-            actualBufferFormatID         = angle::FormatID::ASTC_8x8_SRGB_BLOCK;
-            vkBufferFormatIsPacked       = false;
-            vertexLoadFunction           = nullptr;
-            vertexLoadRequiresConversion = false;
+            mIntendedGLFormat              = GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x8_KHR;
+            mActualSampleOnlyImageFormatID = angle::FormatID::ASTC_8x8_SRGB_BLOCK;
+            mImageInitializerFunction      = nullptr;
+            mActualBufferFormatID          = angle::FormatID::ASTC_8x8_SRGB_BLOCK;
+            mVkBufferFormatIsPacked        = false;
+            mVertexLoadFunction            = nullptr;
+            mVertexLoadRequiresConversion  = false;
             break;
 
         case angle::FormatID::ASTC_8x8_UNORM_BLOCK:
-            intendedGLFormat             = GL_COMPRESSED_RGBA_ASTC_8x8_KHR;
-            actualImageFormatID          = angle::FormatID::ASTC_8x8_UNORM_BLOCK;
-            imageInitializerFunction     = nullptr;
-            actualBufferFormatID         = angle::FormatID::ASTC_8x8_UNORM_BLOCK;
-            vkBufferFormatIsPacked       = false;
-            vertexLoadFunction           = nullptr;
-            vertexLoadRequiresConversion = false;
+            mIntendedGLFormat              = GL_COMPRESSED_RGBA_ASTC_8x8_KHR;
+            mActualSampleOnlyImageFormatID = angle::FormatID::ASTC_8x8_UNORM_BLOCK;
+            mImageInitializerFunction      = nullptr;
+            mActualBufferFormatID          = angle::FormatID::ASTC_8x8_UNORM_BLOCK;
+            mVkBufferFormatIsPacked        = false;
+            mVertexLoadFunction            = nullptr;
+            mVertexLoadRequiresConversion  = false;
             break;
 
         case angle::FormatID::B10G10R10A2_UNORM:
-            intendedGLFormat             = GL_BGR10_A2_ANGLEX;
-            actualImageFormatID          = angle::FormatID::B10G10R10A2_UNORM;
-            imageInitializerFunction     = nullptr;
-            actualBufferFormatID         = angle::FormatID::B10G10R10A2_UNORM;
-            vkBufferFormatIsPacked       = true;
-            vertexLoadFunction           = CopyNativeVertexData<GLuint, 1, 1, 0>;
-            vertexLoadRequiresConversion = false;
+            mIntendedGLFormat              = GL_BGR10_A2_ANGLEX;
+            mActualSampleOnlyImageFormatID = angle::FormatID::B10G10R10A2_UNORM;
+            mImageInitializerFunction      = nullptr;
+            mActualBufferFormatID          = angle::FormatID::B10G10R10A2_UNORM;
+            mVkBufferFormatIsPacked        = true;
+            mVertexLoadFunction            = CopyNativeVertexData<GLuint, 1, 1, 0>;
+            mVertexLoadRequiresConversion  = false;
             break;
 
         case angle::FormatID::B4G4R4A4_UNORM:
-            intendedGLFormat             = GL_BGRA4_ANGLEX;
-            actualImageFormatID          = angle::FormatID::B4G4R4A4_UNORM;
-            imageInitializerFunction     = nullptr;
-            actualBufferFormatID         = angle::FormatID::B4G4R4A4_UNORM;
-            vkBufferFormatIsPacked       = true;
-            vertexLoadFunction           = CopyNativeVertexData<GLushort, 1, 1, 0>;
-            vertexLoadRequiresConversion = false;
+            mIntendedGLFormat              = GL_BGRA4_ANGLEX;
+            mActualSampleOnlyImageFormatID = angle::FormatID::B4G4R4A4_UNORM;
+            mImageInitializerFunction      = nullptr;
+            mActualBufferFormatID          = angle::FormatID::B4G4R4A4_UNORM;
+            mVkBufferFormatIsPacked        = true;
+            mVertexLoadFunction            = CopyNativeVertexData<GLushort, 1, 1, 0>;
+            mVertexLoadRequiresConversion  = false;
             break;
 
         case angle::FormatID::B5G5R5A1_UNORM:
-            intendedGLFormat             = GL_BGR5_A1_ANGLEX;
-            actualImageFormatID          = angle::FormatID::B5G5R5A1_UNORM;
-            imageInitializerFunction     = nullptr;
-            actualBufferFormatID         = angle::FormatID::B5G5R5A1_UNORM;
-            vkBufferFormatIsPacked       = true;
-            vertexLoadFunction           = CopyNativeVertexData<GLushort, 1, 1, 0>;
-            vertexLoadRequiresConversion = false;
+            mIntendedGLFormat              = GL_BGR5_A1_ANGLEX;
+            mActualSampleOnlyImageFormatID = angle::FormatID::B5G5R5A1_UNORM;
+            mImageInitializerFunction      = nullptr;
+            mActualBufferFormatID          = angle::FormatID::B5G5R5A1_UNORM;
+            mVkBufferFormatIsPacked        = true;
+            mVertexLoadFunction            = CopyNativeVertexData<GLushort, 1, 1, 0>;
+            mVertexLoadRequiresConversion  = false;
             break;
 
         case angle::FormatID::B5G6R5_UNORM:
-            intendedGLFormat             = GL_BGR565_ANGLEX;
-            actualImageFormatID          = angle::FormatID::B5G6R5_UNORM;
-            imageInitializerFunction     = nullptr;
-            actualBufferFormatID         = angle::FormatID::B5G6R5_UNORM;
-            vkBufferFormatIsPacked       = true;
-            vertexLoadFunction           = CopyNativeVertexData<GLushort, 1, 1, 0>;
-            vertexLoadRequiresConversion = false;
+            mIntendedGLFormat              = GL_BGR565_ANGLEX;
+            mActualSampleOnlyImageFormatID = angle::FormatID::B5G6R5_UNORM;
+            mImageInitializerFunction      = nullptr;
+            mActualBufferFormatID          = angle::FormatID::B5G6R5_UNORM;
+            mVkBufferFormatIsPacked        = true;
+            mVertexLoadFunction            = CopyNativeVertexData<GLushort, 1, 1, 0>;
+            mVertexLoadRequiresConversion  = false;
             break;
 
         case angle::FormatID::B8G8R8A8_TYPELESS:
@@ -525,207 +525,207 @@
             break;
 
         case angle::FormatID::B8G8R8A8_UNORM:
-            intendedGLFormat             = GL_BGRA8_EXT;
-            actualImageFormatID          = angle::FormatID::B8G8R8A8_UNORM;
-            imageInitializerFunction     = nullptr;
-            actualBufferFormatID         = angle::FormatID::B8G8R8A8_UNORM;
-            vkBufferFormatIsPacked       = false;
-            vertexLoadFunction           = CopyNativeVertexData<GLubyte, 4, 4, 0>;
-            vertexLoadRequiresConversion = false;
+            mIntendedGLFormat              = GL_BGRA8_EXT;
+            mActualSampleOnlyImageFormatID = angle::FormatID::B8G8R8A8_UNORM;
+            mImageInitializerFunction      = nullptr;
+            mActualBufferFormatID          = angle::FormatID::B8G8R8A8_UNORM;
+            mVkBufferFormatIsPacked        = false;
+            mVertexLoadFunction            = CopyNativeVertexData<GLubyte, 4, 4, 0>;
+            mVertexLoadRequiresConversion  = false;
             break;
 
         case angle::FormatID::B8G8R8A8_UNORM_SRGB:
-            intendedGLFormat             = GL_BGRA8_SRGB_ANGLEX;
-            actualImageFormatID          = angle::FormatID::B8G8R8A8_UNORM_SRGB;
-            imageInitializerFunction     = nullptr;
-            actualBufferFormatID         = angle::FormatID::B8G8R8A8_UNORM_SRGB;
-            vkBufferFormatIsPacked       = false;
-            vertexLoadFunction           = CopyNativeVertexData<GLubyte, 4, 4, 0>;
-            vertexLoadRequiresConversion = false;
+            mIntendedGLFormat              = GL_BGRA8_SRGB_ANGLEX;
+            mActualSampleOnlyImageFormatID = angle::FormatID::B8G8R8A8_UNORM_SRGB;
+            mImageInitializerFunction      = nullptr;
+            mActualBufferFormatID          = angle::FormatID::B8G8R8A8_UNORM_SRGB;
+            mVkBufferFormatIsPacked        = false;
+            mVertexLoadFunction            = CopyNativeVertexData<GLubyte, 4, 4, 0>;
+            mVertexLoadRequiresConversion  = false;
             break;
 
         case angle::FormatID::B8G8R8X8_UNORM:
-            intendedGLFormat             = GL_BGRX8_ANGLEX;
-            actualImageFormatID          = angle::FormatID::B8G8R8A8_UNORM;
-            imageInitializerFunction     = nullptr;
-            actualBufferFormatID         = angle::FormatID::NONE;
-            vkBufferFormatIsPacked       = false;
-            vertexLoadFunction           = nullptr;
-            vertexLoadRequiresConversion = true;
+            mIntendedGLFormat              = GL_BGRX8_ANGLEX;
+            mActualSampleOnlyImageFormatID = angle::FormatID::B8G8R8A8_UNORM;
+            mImageInitializerFunction      = nullptr;
+            mActualBufferFormatID          = angle::FormatID::NONE;
+            mVkBufferFormatIsPacked        = false;
+            mVertexLoadFunction            = nullptr;
+            mVertexLoadRequiresConversion  = true;
             break;
 
         case angle::FormatID::BC1_RGBA_UNORM_BLOCK:
-            intendedGLFormat             = GL_COMPRESSED_RGBA_S3TC_DXT1_EXT;
-            actualImageFormatID          = angle::FormatID::BC1_RGBA_UNORM_BLOCK;
-            imageInitializerFunction     = nullptr;
-            actualBufferFormatID         = angle::FormatID::BC1_RGBA_UNORM_BLOCK;
-            vkBufferFormatIsPacked       = false;
-            vertexLoadFunction           = nullptr;
-            vertexLoadRequiresConversion = false;
+            mIntendedGLFormat              = GL_COMPRESSED_RGBA_S3TC_DXT1_EXT;
+            mActualSampleOnlyImageFormatID = angle::FormatID::BC1_RGBA_UNORM_BLOCK;
+            mImageInitializerFunction      = nullptr;
+            mActualBufferFormatID          = angle::FormatID::BC1_RGBA_UNORM_BLOCK;
+            mVkBufferFormatIsPacked        = false;
+            mVertexLoadFunction            = nullptr;
+            mVertexLoadRequiresConversion  = false;
             break;
 
         case angle::FormatID::BC1_RGBA_UNORM_SRGB_BLOCK:
-            intendedGLFormat             = GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT;
-            actualImageFormatID          = angle::FormatID::BC1_RGBA_UNORM_SRGB_BLOCK;
-            imageInitializerFunction     = nullptr;
-            actualBufferFormatID         = angle::FormatID::BC1_RGBA_UNORM_SRGB_BLOCK;
-            vkBufferFormatIsPacked       = false;
-            vertexLoadFunction           = nullptr;
-            vertexLoadRequiresConversion = false;
+            mIntendedGLFormat              = GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT;
+            mActualSampleOnlyImageFormatID = angle::FormatID::BC1_RGBA_UNORM_SRGB_BLOCK;
+            mImageInitializerFunction      = nullptr;
+            mActualBufferFormatID          = angle::FormatID::BC1_RGBA_UNORM_SRGB_BLOCK;
+            mVkBufferFormatIsPacked        = false;
+            mVertexLoadFunction            = nullptr;
+            mVertexLoadRequiresConversion  = false;
             break;
 
         case angle::FormatID::BC1_RGB_UNORM_BLOCK:
-            intendedGLFormat             = GL_COMPRESSED_RGB_S3TC_DXT1_EXT;
-            actualImageFormatID          = angle::FormatID::BC1_RGB_UNORM_BLOCK;
-            imageInitializerFunction     = nullptr;
-            actualBufferFormatID         = angle::FormatID::BC1_RGB_UNORM_BLOCK;
-            vkBufferFormatIsPacked       = false;
-            vertexLoadFunction           = nullptr;
-            vertexLoadRequiresConversion = false;
+            mIntendedGLFormat              = GL_COMPRESSED_RGB_S3TC_DXT1_EXT;
+            mActualSampleOnlyImageFormatID = angle::FormatID::BC1_RGB_UNORM_BLOCK;
+            mImageInitializerFunction      = nullptr;
+            mActualBufferFormatID          = angle::FormatID::BC1_RGB_UNORM_BLOCK;
+            mVkBufferFormatIsPacked        = false;
+            mVertexLoadFunction            = nullptr;
+            mVertexLoadRequiresConversion  = false;
             break;
 
         case angle::FormatID::BC1_RGB_UNORM_SRGB_BLOCK:
-            intendedGLFormat             = GL_COMPRESSED_SRGB_S3TC_DXT1_EXT;
-            actualImageFormatID          = angle::FormatID::BC1_RGB_UNORM_SRGB_BLOCK;
-            imageInitializerFunction     = nullptr;
-            actualBufferFormatID         = angle::FormatID::BC1_RGB_UNORM_SRGB_BLOCK;
-            vkBufferFormatIsPacked       = false;
-            vertexLoadFunction           = nullptr;
-            vertexLoadRequiresConversion = false;
+            mIntendedGLFormat              = GL_COMPRESSED_SRGB_S3TC_DXT1_EXT;
+            mActualSampleOnlyImageFormatID = angle::FormatID::BC1_RGB_UNORM_SRGB_BLOCK;
+            mImageInitializerFunction      = nullptr;
+            mActualBufferFormatID          = angle::FormatID::BC1_RGB_UNORM_SRGB_BLOCK;
+            mVkBufferFormatIsPacked        = false;
+            mVertexLoadFunction            = nullptr;
+            mVertexLoadRequiresConversion  = false;
             break;
 
         case angle::FormatID::BC2_RGBA_UNORM_BLOCK:
-            intendedGLFormat             = GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE;
-            actualImageFormatID          = angle::FormatID::BC2_RGBA_UNORM_BLOCK;
-            imageInitializerFunction     = nullptr;
-            actualBufferFormatID         = angle::FormatID::BC2_RGBA_UNORM_BLOCK;
-            vkBufferFormatIsPacked       = false;
-            vertexLoadFunction           = nullptr;
-            vertexLoadRequiresConversion = false;
+            mIntendedGLFormat              = GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE;
+            mActualSampleOnlyImageFormatID = angle::FormatID::BC2_RGBA_UNORM_BLOCK;
+            mImageInitializerFunction      = nullptr;
+            mActualBufferFormatID          = angle::FormatID::BC2_RGBA_UNORM_BLOCK;
+            mVkBufferFormatIsPacked        = false;
+            mVertexLoadFunction            = nullptr;
+            mVertexLoadRequiresConversion  = false;
             break;
 
         case angle::FormatID::BC2_RGBA_UNORM_SRGB_BLOCK:
-            intendedGLFormat             = GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT;
-            actualImageFormatID          = angle::FormatID::BC2_RGBA_UNORM_SRGB_BLOCK;
-            imageInitializerFunction     = nullptr;
-            actualBufferFormatID         = angle::FormatID::BC2_RGBA_UNORM_SRGB_BLOCK;
-            vkBufferFormatIsPacked       = false;
-            vertexLoadFunction           = nullptr;
-            vertexLoadRequiresConversion = false;
+            mIntendedGLFormat              = GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT;
+            mActualSampleOnlyImageFormatID = angle::FormatID::BC2_RGBA_UNORM_SRGB_BLOCK;
+            mImageInitializerFunction      = nullptr;
+            mActualBufferFormatID          = angle::FormatID::BC2_RGBA_UNORM_SRGB_BLOCK;
+            mVkBufferFormatIsPacked        = false;
+            mVertexLoadFunction            = nullptr;
+            mVertexLoadRequiresConversion  = false;
             break;
 
         case angle::FormatID::BC3_RGBA_UNORM_BLOCK:
-            intendedGLFormat             = GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE;
-            actualImageFormatID          = angle::FormatID::BC3_RGBA_UNORM_BLOCK;
-            imageInitializerFunction     = nullptr;
-            actualBufferFormatID         = angle::FormatID::BC3_RGBA_UNORM_BLOCK;
-            vkBufferFormatIsPacked       = false;
-            vertexLoadFunction           = nullptr;
-            vertexLoadRequiresConversion = false;
+            mIntendedGLFormat              = GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE;
+            mActualSampleOnlyImageFormatID = angle::FormatID::BC3_RGBA_UNORM_BLOCK;
+            mImageInitializerFunction      = nullptr;
+            mActualBufferFormatID          = angle::FormatID::BC3_RGBA_UNORM_BLOCK;
+            mVkBufferFormatIsPacked        = false;
+            mVertexLoadFunction            = nullptr;
+            mVertexLoadRequiresConversion  = false;
             break;
 
         case angle::FormatID::BC3_RGBA_UNORM_SRGB_BLOCK:
-            intendedGLFormat             = GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT;
-            actualImageFormatID          = angle::FormatID::BC3_RGBA_UNORM_SRGB_BLOCK;
-            imageInitializerFunction     = nullptr;
-            actualBufferFormatID         = angle::FormatID::BC3_RGBA_UNORM_SRGB_BLOCK;
-            vkBufferFormatIsPacked       = false;
-            vertexLoadFunction           = nullptr;
-            vertexLoadRequiresConversion = false;
+            mIntendedGLFormat              = GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT;
+            mActualSampleOnlyImageFormatID = angle::FormatID::BC3_RGBA_UNORM_SRGB_BLOCK;
+            mImageInitializerFunction      = nullptr;
+            mActualBufferFormatID          = angle::FormatID::BC3_RGBA_UNORM_SRGB_BLOCK;
+            mVkBufferFormatIsPacked        = false;
+            mVertexLoadFunction            = nullptr;
+            mVertexLoadRequiresConversion  = false;
             break;
 
         case angle::FormatID::BC4_RED_SNORM_BLOCK:
-            intendedGLFormat             = GL_COMPRESSED_SIGNED_RED_RGTC1_EXT;
-            actualImageFormatID          = angle::FormatID::BC4_RED_SNORM_BLOCK;
-            imageInitializerFunction     = nullptr;
-            actualBufferFormatID         = angle::FormatID::BC4_RED_SNORM_BLOCK;
-            vkBufferFormatIsPacked       = false;
-            vertexLoadFunction           = nullptr;
-            vertexLoadRequiresConversion = false;
+            mIntendedGLFormat              = GL_COMPRESSED_SIGNED_RED_RGTC1_EXT;
+            mActualSampleOnlyImageFormatID = angle::FormatID::BC4_RED_SNORM_BLOCK;
+            mImageInitializerFunction      = nullptr;
+            mActualBufferFormatID          = angle::FormatID::BC4_RED_SNORM_BLOCK;
+            mVkBufferFormatIsPacked        = false;
+            mVertexLoadFunction            = nullptr;
+            mVertexLoadRequiresConversion  = false;
             break;
 
         case angle::FormatID::BC4_RED_UNORM_BLOCK:
-            intendedGLFormat             = GL_COMPRESSED_RED_RGTC1_EXT;
-            actualImageFormatID          = angle::FormatID::BC4_RED_UNORM_BLOCK;
-            imageInitializerFunction     = nullptr;
-            actualBufferFormatID         = angle::FormatID::BC4_RED_UNORM_BLOCK;
-            vkBufferFormatIsPacked       = false;
-            vertexLoadFunction           = nullptr;
-            vertexLoadRequiresConversion = false;
+            mIntendedGLFormat              = GL_COMPRESSED_RED_RGTC1_EXT;
+            mActualSampleOnlyImageFormatID = angle::FormatID::BC4_RED_UNORM_BLOCK;
+            mImageInitializerFunction      = nullptr;
+            mActualBufferFormatID          = angle::FormatID::BC4_RED_UNORM_BLOCK;
+            mVkBufferFormatIsPacked        = false;
+            mVertexLoadFunction            = nullptr;
+            mVertexLoadRequiresConversion  = false;
             break;
 
         case angle::FormatID::BC5_RG_SNORM_BLOCK:
-            intendedGLFormat             = GL_COMPRESSED_SIGNED_RED_GREEN_RGTC2_EXT;
-            actualImageFormatID          = angle::FormatID::BC5_RG_SNORM_BLOCK;
-            imageInitializerFunction     = nullptr;
-            actualBufferFormatID         = angle::FormatID::BC5_RG_SNORM_BLOCK;
-            vkBufferFormatIsPacked       = false;
-            vertexLoadFunction           = nullptr;
-            vertexLoadRequiresConversion = false;
+            mIntendedGLFormat              = GL_COMPRESSED_SIGNED_RED_GREEN_RGTC2_EXT;
+            mActualSampleOnlyImageFormatID = angle::FormatID::BC5_RG_SNORM_BLOCK;
+            mImageInitializerFunction      = nullptr;
+            mActualBufferFormatID          = angle::FormatID::BC5_RG_SNORM_BLOCK;
+            mVkBufferFormatIsPacked        = false;
+            mVertexLoadFunction            = nullptr;
+            mVertexLoadRequiresConversion  = false;
             break;
 
         case angle::FormatID::BC5_RG_UNORM_BLOCK:
-            intendedGLFormat             = GL_COMPRESSED_RED_GREEN_RGTC2_EXT;
-            actualImageFormatID          = angle::FormatID::BC5_RG_UNORM_BLOCK;
-            imageInitializerFunction     = nullptr;
-            actualBufferFormatID         = angle::FormatID::BC5_RG_UNORM_BLOCK;
-            vkBufferFormatIsPacked       = false;
-            vertexLoadFunction           = nullptr;
-            vertexLoadRequiresConversion = false;
+            mIntendedGLFormat              = GL_COMPRESSED_RED_GREEN_RGTC2_EXT;
+            mActualSampleOnlyImageFormatID = angle::FormatID::BC5_RG_UNORM_BLOCK;
+            mImageInitializerFunction      = nullptr;
+            mActualBufferFormatID          = angle::FormatID::BC5_RG_UNORM_BLOCK;
+            mVkBufferFormatIsPacked        = false;
+            mVertexLoadFunction            = nullptr;
+            mVertexLoadRequiresConversion  = false;
             break;
 
         case angle::FormatID::BC6H_RGB_SFLOAT_BLOCK:
-            intendedGLFormat             = GL_COMPRESSED_RGB_BPTC_SIGNED_FLOAT_EXT;
-            actualImageFormatID          = angle::FormatID::BC6H_RGB_SFLOAT_BLOCK;
-            imageInitializerFunction     = nullptr;
-            actualBufferFormatID         = angle::FormatID::BC6H_RGB_SFLOAT_BLOCK;
-            vkBufferFormatIsPacked       = false;
-            vertexLoadFunction           = nullptr;
-            vertexLoadRequiresConversion = false;
+            mIntendedGLFormat              = GL_COMPRESSED_RGB_BPTC_SIGNED_FLOAT_EXT;
+            mActualSampleOnlyImageFormatID = angle::FormatID::BC6H_RGB_SFLOAT_BLOCK;
+            mImageInitializerFunction      = nullptr;
+            mActualBufferFormatID          = angle::FormatID::BC6H_RGB_SFLOAT_BLOCK;
+            mVkBufferFormatIsPacked        = false;
+            mVertexLoadFunction            = nullptr;
+            mVertexLoadRequiresConversion  = false;
             break;
 
         case angle::FormatID::BC6H_RGB_UFLOAT_BLOCK:
-            intendedGLFormat             = GL_COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT_EXT;
-            actualImageFormatID          = angle::FormatID::BC6H_RGB_UFLOAT_BLOCK;
-            imageInitializerFunction     = nullptr;
-            actualBufferFormatID         = angle::FormatID::BC6H_RGB_UFLOAT_BLOCK;
-            vkBufferFormatIsPacked       = false;
-            vertexLoadFunction           = nullptr;
-            vertexLoadRequiresConversion = false;
+            mIntendedGLFormat              = GL_COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT_EXT;
+            mActualSampleOnlyImageFormatID = angle::FormatID::BC6H_RGB_UFLOAT_BLOCK;
+            mImageInitializerFunction      = nullptr;
+            mActualBufferFormatID          = angle::FormatID::BC6H_RGB_UFLOAT_BLOCK;
+            mVkBufferFormatIsPacked        = false;
+            mVertexLoadFunction            = nullptr;
+            mVertexLoadRequiresConversion  = false;
             break;
 
         case angle::FormatID::BC7_RGBA_UNORM_BLOCK:
-            intendedGLFormat             = GL_COMPRESSED_RGBA_BPTC_UNORM_EXT;
-            actualImageFormatID          = angle::FormatID::BC7_RGBA_UNORM_BLOCK;
-            imageInitializerFunction     = nullptr;
-            actualBufferFormatID         = angle::FormatID::BC7_RGBA_UNORM_BLOCK;
-            vkBufferFormatIsPacked       = false;
-            vertexLoadFunction           = nullptr;
-            vertexLoadRequiresConversion = false;
+            mIntendedGLFormat              = GL_COMPRESSED_RGBA_BPTC_UNORM_EXT;
+            mActualSampleOnlyImageFormatID = angle::FormatID::BC7_RGBA_UNORM_BLOCK;
+            mImageInitializerFunction      = nullptr;
+            mActualBufferFormatID          = angle::FormatID::BC7_RGBA_UNORM_BLOCK;
+            mVkBufferFormatIsPacked        = false;
+            mVertexLoadFunction            = nullptr;
+            mVertexLoadRequiresConversion  = false;
             break;
 
         case angle::FormatID::BC7_RGBA_UNORM_SRGB_BLOCK:
-            intendedGLFormat             = GL_COMPRESSED_SRGB_ALPHA_BPTC_UNORM_EXT;
-            actualImageFormatID          = angle::FormatID::BC7_RGBA_UNORM_SRGB_BLOCK;
-            imageInitializerFunction     = nullptr;
-            actualBufferFormatID         = angle::FormatID::BC7_RGBA_UNORM_SRGB_BLOCK;
-            vkBufferFormatIsPacked       = false;
-            vertexLoadFunction           = nullptr;
-            vertexLoadRequiresConversion = false;
+            mIntendedGLFormat              = GL_COMPRESSED_SRGB_ALPHA_BPTC_UNORM_EXT;
+            mActualSampleOnlyImageFormatID = angle::FormatID::BC7_RGBA_UNORM_SRGB_BLOCK;
+            mImageInitializerFunction      = nullptr;
+            mActualBufferFormatID          = angle::FormatID::BC7_RGBA_UNORM_SRGB_BLOCK;
+            mVkBufferFormatIsPacked        = false;
+            mVertexLoadFunction            = nullptr;
+            mVertexLoadRequiresConversion  = false;
             break;
 
         case angle::FormatID::D16_UNORM:
-            intendedGLFormat             = GL_DEPTH_COMPONENT16;
-            actualImageFormatID          = angle::FormatID::D16_UNORM;
-            imageInitializerFunction     = nullptr;
-            actualBufferFormatID         = angle::FormatID::D16_UNORM;
-            vkBufferFormatIsPacked       = false;
-            vertexLoadFunction           = nullptr;
-            vertexLoadRequiresConversion = false;
+            mIntendedGLFormat              = GL_DEPTH_COMPONENT16;
+            mActualSampleOnlyImageFormatID = angle::FormatID::D16_UNORM;
+            mImageInitializerFunction      = nullptr;
+            mActualBufferFormatID          = angle::FormatID::D16_UNORM;
+            mVkBufferFormatIsPacked        = false;
+            mVertexLoadFunction            = nullptr;
+            mVertexLoadRequiresConversion  = false;
             break;
 
         case angle::FormatID::D24_UNORM_S8_UINT:
-            intendedGLFormat = GL_DEPTH24_STENCIL8;
+            mIntendedGLFormat = GL_DEPTH24_STENCIL8;
             {
                 static constexpr ImageFormatInitInfo kInfo[] = {
                     {angle::FormatID::D24_UNORM_S8_UINT, nullptr},
@@ -733,14 +733,14 @@
                     {angle::FormatID::D24_UNORM_S8_UINT, nullptr}};
                 initImageFallback(renderer, kInfo, ArraySize(kInfo));
             }
-            actualBufferFormatID         = angle::FormatID::D24_UNORM_S8_UINT;
-            vkBufferFormatIsPacked       = false;
-            vertexLoadFunction           = nullptr;
-            vertexLoadRequiresConversion = false;
+            mActualBufferFormatID         = angle::FormatID::D24_UNORM_S8_UINT;
+            mVkBufferFormatIsPacked       = false;
+            mVertexLoadFunction           = nullptr;
+            mVertexLoadRequiresConversion = false;
             break;
 
         case angle::FormatID::D24_UNORM_X8_UINT:
-            intendedGLFormat = GL_DEPTH_COMPONENT24;
+            mIntendedGLFormat = GL_DEPTH_COMPONENT24;
             {
                 static constexpr ImageFormatInitInfo kInfo[] = {
                     {angle::FormatID::D24_UNORM_X8_UINT, nullptr},
@@ -748,24 +748,24 @@
                     {angle::FormatID::D32_FLOAT_S8X24_UINT, nullptr}};
                 initImageFallback(renderer, kInfo, ArraySize(kInfo));
             }
-            actualBufferFormatID         = angle::FormatID::D24_UNORM_X8_UINT;
-            vkBufferFormatIsPacked       = true;
-            vertexLoadFunction           = CopyNativeVertexData<GLuint, 1, 1, 0>;
-            vertexLoadRequiresConversion = false;
+            mActualBufferFormatID         = angle::FormatID::D24_UNORM_X8_UINT;
+            mVkBufferFormatIsPacked       = true;
+            mVertexLoadFunction           = CopyNativeVertexData<GLuint, 1, 1, 0>;
+            mVertexLoadRequiresConversion = false;
             break;
 
         case angle::FormatID::D32_FLOAT:
-            intendedGLFormat             = GL_DEPTH_COMPONENT32F;
-            actualImageFormatID          = angle::FormatID::D32_FLOAT;
-            imageInitializerFunction     = nullptr;
-            actualBufferFormatID         = angle::FormatID::D32_FLOAT;
-            vkBufferFormatIsPacked       = false;
-            vertexLoadFunction           = CopyNativeVertexData<GLfloat, 1, 1, 0>;
-            vertexLoadRequiresConversion = false;
+            mIntendedGLFormat              = GL_DEPTH_COMPONENT32F;
+            mActualSampleOnlyImageFormatID = angle::FormatID::D32_FLOAT;
+            mImageInitializerFunction      = nullptr;
+            mActualBufferFormatID          = angle::FormatID::D32_FLOAT;
+            mVkBufferFormatIsPacked        = false;
+            mVertexLoadFunction            = CopyNativeVertexData<GLfloat, 1, 1, 0>;
+            mVertexLoadRequiresConversion  = false;
             break;
 
         case angle::FormatID::D32_FLOAT_S8X24_UINT:
-            intendedGLFormat = GL_DEPTH32F_STENCIL8;
+            mIntendedGLFormat = GL_DEPTH32F_STENCIL8;
             {
                 static constexpr ImageFormatInitInfo kInfo[] = {
                     {angle::FormatID::D32_FLOAT_S8X24_UINT, nullptr},
@@ -773,28 +773,28 @@
                     {angle::FormatID::D32_FLOAT_S8X24_UINT, nullptr}};
                 initImageFallback(renderer, kInfo, ArraySize(kInfo));
             }
-            actualBufferFormatID         = angle::FormatID::D32_FLOAT_S8X24_UINT;
-            vkBufferFormatIsPacked       = false;
-            vertexLoadFunction           = CopyNativeVertexData<GLfloat, 3, 3, 0>;
-            vertexLoadRequiresConversion = false;
+            mActualBufferFormatID         = angle::FormatID::D32_FLOAT_S8X24_UINT;
+            mVkBufferFormatIsPacked       = false;
+            mVertexLoadFunction           = CopyNativeVertexData<GLfloat, 3, 3, 0>;
+            mVertexLoadRequiresConversion = false;
             break;
 
         case angle::FormatID::D32_UNORM:
-            intendedGLFormat = GL_DEPTH_COMPONENT32_OES;
+            mIntendedGLFormat = GL_DEPTH_COMPONENT32_OES;
             {
                 static constexpr ImageFormatInitInfo kInfo[] = {
                     {angle::FormatID::D24_UNORM_S8_UINT, nullptr},
                     {angle::FormatID::D32_FLOAT, nullptr}};
                 initImageFallback(renderer, kInfo, ArraySize(kInfo));
             }
-            actualBufferFormatID         = angle::FormatID::NONE;
-            vkBufferFormatIsPacked       = false;
-            vertexLoadFunction           = nullptr;
-            vertexLoadRequiresConversion = true;
+            mActualBufferFormatID         = angle::FormatID::NONE;
+            mVkBufferFormatIsPacked       = false;
+            mVertexLoadFunction           = nullptr;
+            mVertexLoadRequiresConversion = true;
             break;
 
         case angle::FormatID::EAC_R11G11_SNORM_BLOCK:
-            intendedGLFormat = GL_COMPRESSED_SIGNED_RG11_EAC;
+            mIntendedGLFormat = GL_COMPRESSED_SIGNED_RG11_EAC;
             {
                 static constexpr ImageFormatInitInfo kInfo[] = {
                     {angle::FormatID::EAC_R11G11_SNORM_BLOCK, nullptr},
@@ -802,14 +802,14 @@
                     {angle::FormatID::R16G16_FLOAT, nullptr}};
                 initImageFallback(renderer, kInfo, ArraySize(kInfo));
             }
-            actualBufferFormatID         = angle::FormatID::EAC_R11G11_SNORM_BLOCK;
-            vkBufferFormatIsPacked       = false;
-            vertexLoadFunction           = nullptr;
-            vertexLoadRequiresConversion = false;
+            mActualBufferFormatID         = angle::FormatID::EAC_R11G11_SNORM_BLOCK;
+            mVkBufferFormatIsPacked       = false;
+            mVertexLoadFunction           = nullptr;
+            mVertexLoadRequiresConversion = false;
             break;
 
         case angle::FormatID::EAC_R11G11_UNORM_BLOCK:
-            intendedGLFormat = GL_COMPRESSED_RG11_EAC;
+            mIntendedGLFormat = GL_COMPRESSED_RG11_EAC;
             {
                 static constexpr ImageFormatInitInfo kInfo[] = {
                     {angle::FormatID::EAC_R11G11_UNORM_BLOCK, nullptr},
@@ -817,14 +817,14 @@
                     {angle::FormatID::R16G16_FLOAT, nullptr}};
                 initImageFallback(renderer, kInfo, ArraySize(kInfo));
             }
-            actualBufferFormatID         = angle::FormatID::EAC_R11G11_UNORM_BLOCK;
-            vkBufferFormatIsPacked       = false;
-            vertexLoadFunction           = nullptr;
-            vertexLoadRequiresConversion = false;
+            mActualBufferFormatID         = angle::FormatID::EAC_R11G11_UNORM_BLOCK;
+            mVkBufferFormatIsPacked       = false;
+            mVertexLoadFunction           = nullptr;
+            mVertexLoadRequiresConversion = false;
             break;
 
         case angle::FormatID::EAC_R11_SNORM_BLOCK:
-            intendedGLFormat = GL_COMPRESSED_SIGNED_R11_EAC;
+            mIntendedGLFormat = GL_COMPRESSED_SIGNED_R11_EAC;
             {
                 static constexpr ImageFormatInitInfo kInfo[] = {
                     {angle::FormatID::EAC_R11_SNORM_BLOCK, nullptr},
@@ -832,14 +832,14 @@
                     {angle::FormatID::R16_FLOAT, nullptr}};
                 initImageFallback(renderer, kInfo, ArraySize(kInfo));
             }
-            actualBufferFormatID         = angle::FormatID::EAC_R11_SNORM_BLOCK;
-            vkBufferFormatIsPacked       = false;
-            vertexLoadFunction           = nullptr;
-            vertexLoadRequiresConversion = false;
+            mActualBufferFormatID         = angle::FormatID::EAC_R11_SNORM_BLOCK;
+            mVkBufferFormatIsPacked       = false;
+            mVertexLoadFunction           = nullptr;
+            mVertexLoadRequiresConversion = false;
             break;
 
         case angle::FormatID::EAC_R11_UNORM_BLOCK:
-            intendedGLFormat = GL_COMPRESSED_R11_EAC;
+            mIntendedGLFormat = GL_COMPRESSED_R11_EAC;
             {
                 static constexpr ImageFormatInitInfo kInfo[] = {
                     {angle::FormatID::EAC_R11_UNORM_BLOCK, nullptr},
@@ -847,10 +847,10 @@
                     {angle::FormatID::R16_FLOAT, nullptr}};
                 initImageFallback(renderer, kInfo, ArraySize(kInfo));
             }
-            actualBufferFormatID         = angle::FormatID::EAC_R11_UNORM_BLOCK;
-            vkBufferFormatIsPacked       = false;
-            vertexLoadFunction           = nullptr;
-            vertexLoadRequiresConversion = false;
+            mActualBufferFormatID         = angle::FormatID::EAC_R11_UNORM_BLOCK;
+            mVkBufferFormatIsPacked       = false;
+            mVertexLoadFunction           = nullptr;
+            mVertexLoadRequiresConversion = false;
             break;
 
         case angle::FormatID::ETC1_LOSSY_DECODE_R8G8B8_UNORM_BLOCK:
@@ -858,7 +858,7 @@
             break;
 
         case angle::FormatID::ETC1_R8G8B8_UNORM_BLOCK:
-            intendedGLFormat = GL_ETC1_RGB8_OES;
+            mIntendedGLFormat = GL_ETC1_RGB8_OES;
             {
                 static constexpr ImageFormatInitInfo kInfo[] = {
                     {angle::FormatID::ETC2_R8G8B8_UNORM_BLOCK, nullptr},
@@ -866,28 +866,28 @@
                      Initialize4ComponentData<GLubyte, 0x00, 0x00, 0x00, 0xFF>}};
                 initImageFallback(renderer, kInfo, ArraySize(kInfo));
             }
-            actualBufferFormatID         = angle::FormatID::NONE;
-            vkBufferFormatIsPacked       = false;
-            vertexLoadFunction           = nullptr;
-            vertexLoadRequiresConversion = true;
+            mActualBufferFormatID         = angle::FormatID::NONE;
+            mVkBufferFormatIsPacked       = false;
+            mVertexLoadFunction           = nullptr;
+            mVertexLoadRequiresConversion = true;
             break;
 
         case angle::FormatID::ETC2_R8G8B8A1_SRGB_BLOCK:
-            intendedGLFormat = GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2;
+            mIntendedGLFormat = GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2;
             {
                 static constexpr ImageFormatInitInfo kInfo[] = {
                     {angle::FormatID::ETC2_R8G8B8A1_SRGB_BLOCK, nullptr},
                     {angle::FormatID::R8G8B8A8_UNORM_SRGB, nullptr}};
                 initImageFallback(renderer, kInfo, ArraySize(kInfo));
             }
-            actualBufferFormatID         = angle::FormatID::ETC2_R8G8B8A1_SRGB_BLOCK;
-            vkBufferFormatIsPacked       = false;
-            vertexLoadFunction           = CopyNativeVertexData<GLbyte, 4, 4, 0>;
-            vertexLoadRequiresConversion = false;
+            mActualBufferFormatID         = angle::FormatID::ETC2_R8G8B8A1_SRGB_BLOCK;
+            mVkBufferFormatIsPacked       = false;
+            mVertexLoadFunction           = CopyNativeVertexData<GLbyte, 4, 4, 0>;
+            mVertexLoadRequiresConversion = false;
             break;
 
         case angle::FormatID::ETC2_R8G8B8A1_UNORM_BLOCK:
-            intendedGLFormat = GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2;
+            mIntendedGLFormat = GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2;
             {
                 static constexpr ImageFormatInitInfo kInfo[] = {
                     {angle::FormatID::ETC2_R8G8B8A1_UNORM_BLOCK,
@@ -896,42 +896,42 @@
                      Initialize4ComponentData<GLubyte, 0x00, 0x00, 0x00, 0xFF>}};
                 initImageFallback(renderer, kInfo, ArraySize(kInfo));
             }
-            actualBufferFormatID         = angle::FormatID::ETC2_R8G8B8A1_UNORM_BLOCK;
-            vkBufferFormatIsPacked       = false;
-            vertexLoadFunction           = CopyNativeVertexData<GLubyte, 4, 4, 0>;
-            vertexLoadRequiresConversion = false;
+            mActualBufferFormatID         = angle::FormatID::ETC2_R8G8B8A1_UNORM_BLOCK;
+            mVkBufferFormatIsPacked       = false;
+            mVertexLoadFunction           = CopyNativeVertexData<GLubyte, 4, 4, 0>;
+            mVertexLoadRequiresConversion = false;
             break;
 
         case angle::FormatID::ETC2_R8G8B8A8_SRGB_BLOCK:
-            intendedGLFormat = GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC;
+            mIntendedGLFormat = GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC;
             {
                 static constexpr ImageFormatInitInfo kInfo[] = {
                     {angle::FormatID::ETC2_R8G8B8A8_SRGB_BLOCK, nullptr},
                     {angle::FormatID::R8G8B8A8_UNORM_SRGB, nullptr}};
                 initImageFallback(renderer, kInfo, ArraySize(kInfo));
             }
-            actualBufferFormatID         = angle::FormatID::ETC2_R8G8B8A8_SRGB_BLOCK;
-            vkBufferFormatIsPacked       = false;
-            vertexLoadFunction           = CopyNativeVertexData<GLbyte, 4, 4, 0>;
-            vertexLoadRequiresConversion = false;
+            mActualBufferFormatID         = angle::FormatID::ETC2_R8G8B8A8_SRGB_BLOCK;
+            mVkBufferFormatIsPacked       = false;
+            mVertexLoadFunction           = CopyNativeVertexData<GLbyte, 4, 4, 0>;
+            mVertexLoadRequiresConversion = false;
             break;
 
         case angle::FormatID::ETC2_R8G8B8A8_UNORM_BLOCK:
-            intendedGLFormat = GL_COMPRESSED_RGBA8_ETC2_EAC;
+            mIntendedGLFormat = GL_COMPRESSED_RGBA8_ETC2_EAC;
             {
                 static constexpr ImageFormatInitInfo kInfo[] = {
                     {angle::FormatID::ETC2_R8G8B8A8_UNORM_BLOCK, nullptr},
                     {angle::FormatID::R8G8B8A8_UNORM, nullptr}};
                 initImageFallback(renderer, kInfo, ArraySize(kInfo));
             }
-            actualBufferFormatID         = angle::FormatID::ETC2_R8G8B8A8_UNORM_BLOCK;
-            vkBufferFormatIsPacked       = false;
-            vertexLoadFunction           = CopyNativeVertexData<GLubyte, 4, 4, 0>;
-            vertexLoadRequiresConversion = false;
+            mActualBufferFormatID         = angle::FormatID::ETC2_R8G8B8A8_UNORM_BLOCK;
+            mVkBufferFormatIsPacked       = false;
+            mVertexLoadFunction           = CopyNativeVertexData<GLubyte, 4, 4, 0>;
+            mVertexLoadRequiresConversion = false;
             break;
 
         case angle::FormatID::ETC2_R8G8B8_SRGB_BLOCK:
-            intendedGLFormat = GL_COMPRESSED_SRGB8_ETC2;
+            mIntendedGLFormat = GL_COMPRESSED_SRGB8_ETC2;
             {
                 static constexpr ImageFormatInitInfo kInfo[] = {
                     {angle::FormatID::ETC2_R8G8B8_SRGB_BLOCK, nullptr},
@@ -939,14 +939,14 @@
                      Initialize4ComponentData<GLubyte, 0x00, 0x00, 0x00, 0xFF>}};
                 initImageFallback(renderer, kInfo, ArraySize(kInfo));
             }
-            actualBufferFormatID         = angle::FormatID::ETC2_R8G8B8_SRGB_BLOCK;
-            vkBufferFormatIsPacked       = false;
-            vertexLoadFunction           = CopyNativeVertexData<GLbyte, 3, 3, 0>;
-            vertexLoadRequiresConversion = false;
+            mActualBufferFormatID         = angle::FormatID::ETC2_R8G8B8_SRGB_BLOCK;
+            mVkBufferFormatIsPacked       = false;
+            mVertexLoadFunction           = CopyNativeVertexData<GLbyte, 3, 3, 0>;
+            mVertexLoadRequiresConversion = false;
             break;
 
         case angle::FormatID::ETC2_R8G8B8_UNORM_BLOCK:
-            intendedGLFormat = GL_COMPRESSED_RGB8_ETC2;
+            mIntendedGLFormat = GL_COMPRESSED_RGB8_ETC2;
             {
                 static constexpr ImageFormatInitInfo kInfo[] = {
                     {angle::FormatID::ETC2_R8G8B8_UNORM_BLOCK, nullptr},
@@ -954,82 +954,82 @@
                      Initialize4ComponentData<GLubyte, 0x00, 0x00, 0x00, 0xFF>}};
                 initImageFallback(renderer, kInfo, ArraySize(kInfo));
             }
-            actualBufferFormatID         = angle::FormatID::ETC2_R8G8B8_UNORM_BLOCK;
-            vkBufferFormatIsPacked       = false;
-            vertexLoadFunction           = CopyNativeVertexData<GLubyte, 3, 3, 0>;
-            vertexLoadRequiresConversion = false;
+            mActualBufferFormatID         = angle::FormatID::ETC2_R8G8B8_UNORM_BLOCK;
+            mVkBufferFormatIsPacked       = false;
+            mVertexLoadFunction           = CopyNativeVertexData<GLubyte, 3, 3, 0>;
+            mVertexLoadRequiresConversion = false;
             break;
 
         case angle::FormatID::G8_B8R8_2PLANE_420_UNORM:
-            intendedGLFormat             = GL_G8_B8R8_2PLANE_420_UNORM_ANGLE;
-            actualImageFormatID          = angle::FormatID::G8_B8R8_2PLANE_420_UNORM;
-            imageInitializerFunction     = nullptr;
-            actualBufferFormatID         = angle::FormatID::G8_B8R8_2PLANE_420_UNORM;
-            vkBufferFormatIsPacked       = false;
-            vertexLoadFunction           = CopyNativeVertexData<GLubyte, 3, 3, 0>;
-            vertexLoadRequiresConversion = false;
+            mIntendedGLFormat              = GL_G8_B8R8_2PLANE_420_UNORM_ANGLE;
+            mActualSampleOnlyImageFormatID = angle::FormatID::G8_B8R8_2PLANE_420_UNORM;
+            mImageInitializerFunction      = nullptr;
+            mActualBufferFormatID          = angle::FormatID::G8_B8R8_2PLANE_420_UNORM;
+            mVkBufferFormatIsPacked        = false;
+            mVertexLoadFunction            = CopyNativeVertexData<GLubyte, 3, 3, 0>;
+            mVertexLoadRequiresConversion  = false;
             break;
 
         case angle::FormatID::G8_B8_R8_3PLANE_420_UNORM:
-            intendedGLFormat             = GL_G8_B8_R8_3PLANE_420_UNORM_ANGLE;
-            actualImageFormatID          = angle::FormatID::G8_B8_R8_3PLANE_420_UNORM;
-            imageInitializerFunction     = nullptr;
-            actualBufferFormatID         = angle::FormatID::G8_B8_R8_3PLANE_420_UNORM;
-            vkBufferFormatIsPacked       = false;
-            vertexLoadFunction           = CopyNativeVertexData<GLubyte, 3, 3, 0>;
-            vertexLoadRequiresConversion = false;
+            mIntendedGLFormat              = GL_G8_B8_R8_3PLANE_420_UNORM_ANGLE;
+            mActualSampleOnlyImageFormatID = angle::FormatID::G8_B8_R8_3PLANE_420_UNORM;
+            mImageInitializerFunction      = nullptr;
+            mActualBufferFormatID          = angle::FormatID::G8_B8_R8_3PLANE_420_UNORM;
+            mVkBufferFormatIsPacked        = false;
+            mVertexLoadFunction            = CopyNativeVertexData<GLubyte, 3, 3, 0>;
+            mVertexLoadRequiresConversion  = false;
             break;
 
         case angle::FormatID::L16A16_FLOAT:
-            intendedGLFormat         = GL_LUMINANCE_ALPHA16F_EXT;
-            actualImageFormatID      = angle::FormatID::R16G16_FLOAT;
-            imageInitializerFunction = nullptr;
+            mIntendedGLFormat              = GL_LUMINANCE_ALPHA16F_EXT;
+            mActualSampleOnlyImageFormatID = angle::FormatID::R16G16_FLOAT;
+            mImageInitializerFunction      = nullptr;
 
             break;
 
         case angle::FormatID::L16_FLOAT:
-            intendedGLFormat         = GL_LUMINANCE16F_EXT;
-            actualImageFormatID      = angle::FormatID::R16_FLOAT;
-            imageInitializerFunction = nullptr;
+            mIntendedGLFormat              = GL_LUMINANCE16F_EXT;
+            mActualSampleOnlyImageFormatID = angle::FormatID::R16_FLOAT;
+            mImageInitializerFunction      = nullptr;
 
             break;
 
         case angle::FormatID::L32A32_FLOAT:
-            intendedGLFormat         = GL_LUMINANCE_ALPHA32F_EXT;
-            actualImageFormatID      = angle::FormatID::R32G32_FLOAT;
-            imageInitializerFunction = nullptr;
+            mIntendedGLFormat              = GL_LUMINANCE_ALPHA32F_EXT;
+            mActualSampleOnlyImageFormatID = angle::FormatID::R32G32_FLOAT;
+            mImageInitializerFunction      = nullptr;
 
             break;
 
         case angle::FormatID::L32_FLOAT:
-            intendedGLFormat         = GL_LUMINANCE32F_EXT;
-            actualImageFormatID      = angle::FormatID::R32_FLOAT;
-            imageInitializerFunction = nullptr;
+            mIntendedGLFormat              = GL_LUMINANCE32F_EXT;
+            mActualSampleOnlyImageFormatID = angle::FormatID::R32_FLOAT;
+            mImageInitializerFunction      = nullptr;
 
             break;
 
         case angle::FormatID::L8A8_UNORM:
-            intendedGLFormat         = GL_LUMINANCE8_ALPHA8_EXT;
-            actualImageFormatID      = angle::FormatID::R8G8_UNORM;
-            imageInitializerFunction = nullptr;
+            mIntendedGLFormat              = GL_LUMINANCE8_ALPHA8_EXT;
+            mActualSampleOnlyImageFormatID = angle::FormatID::R8G8_UNORM;
+            mImageInitializerFunction      = nullptr;
 
             break;
 
         case angle::FormatID::L8_UNORM:
-            intendedGLFormat         = GL_LUMINANCE8_EXT;
-            actualImageFormatID      = angle::FormatID::R8_UNORM;
-            imageInitializerFunction = nullptr;
+            mIntendedGLFormat              = GL_LUMINANCE8_EXT;
+            mActualSampleOnlyImageFormatID = angle::FormatID::R8_UNORM;
+            mImageInitializerFunction      = nullptr;
 
             break;
 
         case angle::FormatID::NONE:
-            intendedGLFormat             = GL_NONE;
-            actualImageFormatID          = angle::FormatID::NONE;
-            imageInitializerFunction     = nullptr;
-            actualBufferFormatID         = angle::FormatID::NONE;
-            vkBufferFormatIsPacked       = false;
-            vertexLoadFunction           = nullptr;
-            vertexLoadRequiresConversion = false;
+            mIntendedGLFormat              = GL_NONE;
+            mActualSampleOnlyImageFormatID = angle::FormatID::NONE;
+            mImageInitializerFunction      = nullptr;
+            mActualBufferFormatID          = angle::FormatID::NONE;
+            mVkBufferFormatIsPacked        = false;
+            mVertexLoadFunction            = nullptr;
+            mVertexLoadRequiresConversion  = false;
             break;
 
         case angle::FormatID::PVRTC1_RGBA_2BPP_UNORM_BLOCK:
@@ -1065,9 +1065,9 @@
             break;
 
         case angle::FormatID::R10G10B10A2_SINT:
-            intendedGLFormat         = GL_RGB10_A2_SINT_ANGLEX;
-            actualImageFormatID      = angle::FormatID::R10G10B10A2_SINT;
-            imageInitializerFunction = nullptr;
+            mIntendedGLFormat              = GL_RGB10_A2_SINT_ANGLEX;
+            mActualSampleOnlyImageFormatID = angle::FormatID::R10G10B10A2_SINT;
+            mImageInitializerFunction      = nullptr;
             {
                 static constexpr BufferFormatInitInfo kInfo[] = {
                     {angle::FormatID::R10G10B10A2_SINT, true, CopyNativeVertexData<GLuint, 1, 1, 0>,
@@ -1079,9 +1079,9 @@
             break;
 
         case angle::FormatID::R10G10B10A2_SNORM:
-            intendedGLFormat         = GL_RGB10_A2_SNORM_ANGLEX;
-            actualImageFormatID      = angle::FormatID::R10G10B10A2_SNORM;
-            imageInitializerFunction = nullptr;
+            mIntendedGLFormat              = GL_RGB10_A2_SNORM_ANGLEX;
+            mActualSampleOnlyImageFormatID = angle::FormatID::R10G10B10A2_SNORM;
+            mImageInitializerFunction      = nullptr;
             {
                 static constexpr BufferFormatInitInfo kInfo[] = {
                     {angle::FormatID::R10G10B10A2_SNORM, true,
@@ -1093,9 +1093,9 @@
             break;
 
         case angle::FormatID::R10G10B10A2_SSCALED:
-            intendedGLFormat         = GL_RGB10_A2_SSCALED_ANGLEX;
-            actualImageFormatID      = angle::FormatID::R10G10B10A2_SSCALED;
-            imageInitializerFunction = nullptr;
+            mIntendedGLFormat              = GL_RGB10_A2_SSCALED_ANGLEX;
+            mActualSampleOnlyImageFormatID = angle::FormatID::R10G10B10A2_SSCALED;
+            mImageInitializerFunction      = nullptr;
             {
                 static constexpr BufferFormatInitInfo kInfo[] = {
                     {angle::FormatID::R10G10B10A2_SSCALED, true,
@@ -1107,9 +1107,9 @@
             break;
 
         case angle::FormatID::R10G10B10A2_UINT:
-            intendedGLFormat         = GL_RGB10_A2UI;
-            actualImageFormatID      = angle::FormatID::R10G10B10A2_UINT;
-            imageInitializerFunction = nullptr;
+            mIntendedGLFormat              = GL_RGB10_A2UI;
+            mActualSampleOnlyImageFormatID = angle::FormatID::R10G10B10A2_UINT;
+            mImageInitializerFunction      = nullptr;
             {
                 static constexpr BufferFormatInitInfo kInfo[] = {
                     {angle::FormatID::R10G10B10A2_UINT, true, CopyNativeVertexData<GLuint, 1, 1, 0>,
@@ -1121,19 +1121,19 @@
             break;
 
         case angle::FormatID::R10G10B10A2_UNORM:
-            intendedGLFormat             = GL_RGB10_A2;
-            actualImageFormatID          = angle::FormatID::R10G10B10A2_UNORM;
-            imageInitializerFunction     = nullptr;
-            actualBufferFormatID         = angle::FormatID::R10G10B10A2_UNORM;
-            vkBufferFormatIsPacked       = true;
-            vertexLoadFunction           = CopyNativeVertexData<GLuint, 1, 1, 0>;
-            vertexLoadRequiresConversion = false;
+            mIntendedGLFormat              = GL_RGB10_A2;
+            mActualSampleOnlyImageFormatID = angle::FormatID::R10G10B10A2_UNORM;
+            mImageInitializerFunction      = nullptr;
+            mActualBufferFormatID          = angle::FormatID::R10G10B10A2_UNORM;
+            mVkBufferFormatIsPacked        = true;
+            mVertexLoadFunction            = CopyNativeVertexData<GLuint, 1, 1, 0>;
+            mVertexLoadRequiresConversion  = false;
             break;
 
         case angle::FormatID::R10G10B10A2_USCALED:
-            intendedGLFormat         = GL_RGB10_A2_USCALED_ANGLEX;
-            actualImageFormatID      = angle::FormatID::R10G10B10A2_USCALED;
-            imageInitializerFunction = nullptr;
+            mIntendedGLFormat              = GL_RGB10_A2_USCALED_ANGLEX;
+            mActualSampleOnlyImageFormatID = angle::FormatID::R10G10B10A2_USCALED;
+            mImageInitializerFunction      = nullptr;
             {
                 static constexpr BufferFormatInitInfo kInfo[] = {
                     {angle::FormatID::R10G10B10A2_USCALED, true,
@@ -1145,59 +1145,59 @@
             break;
 
         case angle::FormatID::R10G10B10X2_UNORM:
-            intendedGLFormat             = GL_RGB10_UNORM_ANGLEX;
-            actualImageFormatID          = angle::FormatID::R10G10B10A2_UNORM;
-            imageInitializerFunction     = nullptr;
-            actualBufferFormatID         = angle::FormatID::NONE;
-            vkBufferFormatIsPacked       = false;
-            vertexLoadFunction           = nullptr;
-            vertexLoadRequiresConversion = true;
+            mIntendedGLFormat              = GL_RGB10_UNORM_ANGLEX;
+            mActualSampleOnlyImageFormatID = angle::FormatID::R10G10B10A2_UNORM;
+            mImageInitializerFunction      = nullptr;
+            mActualBufferFormatID          = angle::FormatID::NONE;
+            mVkBufferFormatIsPacked        = false;
+            mVertexLoadFunction            = nullptr;
+            mVertexLoadRequiresConversion  = true;
             break;
 
         case angle::FormatID::R11G11B10_FLOAT:
-            intendedGLFormat             = GL_R11F_G11F_B10F;
-            actualImageFormatID          = angle::FormatID::R11G11B10_FLOAT;
-            imageInitializerFunction     = nullptr;
-            actualBufferFormatID         = angle::FormatID::R11G11B10_FLOAT;
-            vkBufferFormatIsPacked       = true;
-            vertexLoadFunction           = CopyNativeVertexData<GLuint, 1, 1, 0>;
-            vertexLoadRequiresConversion = false;
+            mIntendedGLFormat              = GL_R11F_G11F_B10F;
+            mActualSampleOnlyImageFormatID = angle::FormatID::R11G11B10_FLOAT;
+            mImageInitializerFunction      = nullptr;
+            mActualBufferFormatID          = angle::FormatID::R11G11B10_FLOAT;
+            mVkBufferFormatIsPacked        = true;
+            mVertexLoadFunction            = CopyNativeVertexData<GLuint, 1, 1, 0>;
+            mVertexLoadRequiresConversion  = false;
             break;
 
         case angle::FormatID::R16G16B16A16_FLOAT:
-            intendedGLFormat             = GL_RGBA16F;
-            actualImageFormatID          = angle::FormatID::R16G16B16A16_FLOAT;
-            imageInitializerFunction     = nullptr;
-            actualBufferFormatID         = angle::FormatID::R16G16B16A16_FLOAT;
-            vkBufferFormatIsPacked       = false;
-            vertexLoadFunction           = CopyNativeVertexData<GLhalf, 4, 4, 0>;
-            vertexLoadRequiresConversion = false;
+            mIntendedGLFormat              = GL_RGBA16F;
+            mActualSampleOnlyImageFormatID = angle::FormatID::R16G16B16A16_FLOAT;
+            mImageInitializerFunction      = nullptr;
+            mActualBufferFormatID          = angle::FormatID::R16G16B16A16_FLOAT;
+            mVkBufferFormatIsPacked        = false;
+            mVertexLoadFunction            = CopyNativeVertexData<GLhalf, 4, 4, 0>;
+            mVertexLoadRequiresConversion  = false;
             break;
 
         case angle::FormatID::R16G16B16A16_SINT:
-            intendedGLFormat             = GL_RGBA16I;
-            actualImageFormatID          = angle::FormatID::R16G16B16A16_SINT;
-            imageInitializerFunction     = nullptr;
-            actualBufferFormatID         = angle::FormatID::R16G16B16A16_SINT;
-            vkBufferFormatIsPacked       = false;
-            vertexLoadFunction           = CopyNativeVertexData<GLshort, 4, 4, 0>;
-            vertexLoadRequiresConversion = false;
+            mIntendedGLFormat              = GL_RGBA16I;
+            mActualSampleOnlyImageFormatID = angle::FormatID::R16G16B16A16_SINT;
+            mImageInitializerFunction      = nullptr;
+            mActualBufferFormatID          = angle::FormatID::R16G16B16A16_SINT;
+            mVkBufferFormatIsPacked        = false;
+            mVertexLoadFunction            = CopyNativeVertexData<GLshort, 4, 4, 0>;
+            mVertexLoadRequiresConversion  = false;
             break;
 
         case angle::FormatID::R16G16B16A16_SNORM:
-            intendedGLFormat             = GL_RGBA16_SNORM_EXT;
-            actualImageFormatID          = angle::FormatID::R16G16B16A16_SNORM;
-            imageInitializerFunction     = nullptr;
-            actualBufferFormatID         = angle::FormatID::R16G16B16A16_SNORM;
-            vkBufferFormatIsPacked       = false;
-            vertexLoadFunction           = CopyNativeVertexData<GLshort, 4, 4, 0>;
-            vertexLoadRequiresConversion = false;
+            mIntendedGLFormat              = GL_RGBA16_SNORM_EXT;
+            mActualSampleOnlyImageFormatID = angle::FormatID::R16G16B16A16_SNORM;
+            mImageInitializerFunction      = nullptr;
+            mActualBufferFormatID          = angle::FormatID::R16G16B16A16_SNORM;
+            mVkBufferFormatIsPacked        = false;
+            mVertexLoadFunction            = CopyNativeVertexData<GLshort, 4, 4, 0>;
+            mVertexLoadRequiresConversion  = false;
             break;
 
         case angle::FormatID::R16G16B16A16_SSCALED:
-            intendedGLFormat         = GL_RGBA16_SSCALED_ANGLEX;
-            actualImageFormatID      = angle::FormatID::R16G16B16A16_SSCALED;
-            imageInitializerFunction = nullptr;
+            mIntendedGLFormat              = GL_RGBA16_SSCALED_ANGLEX;
+            mActualSampleOnlyImageFormatID = angle::FormatID::R16G16B16A16_SSCALED;
+            mImageInitializerFunction      = nullptr;
             {
                 static constexpr BufferFormatInitInfo kInfo[] = {
                     {angle::FormatID::R16G16B16A16_SSCALED, false,
@@ -1211,29 +1211,29 @@
             break;
 
         case angle::FormatID::R16G16B16A16_UINT:
-            intendedGLFormat             = GL_RGBA16UI;
-            actualImageFormatID          = angle::FormatID::R16G16B16A16_UINT;
-            imageInitializerFunction     = nullptr;
-            actualBufferFormatID         = angle::FormatID::R16G16B16A16_UINT;
-            vkBufferFormatIsPacked       = false;
-            vertexLoadFunction           = CopyNativeVertexData<GLushort, 4, 4, 0>;
-            vertexLoadRequiresConversion = false;
+            mIntendedGLFormat              = GL_RGBA16UI;
+            mActualSampleOnlyImageFormatID = angle::FormatID::R16G16B16A16_UINT;
+            mImageInitializerFunction      = nullptr;
+            mActualBufferFormatID          = angle::FormatID::R16G16B16A16_UINT;
+            mVkBufferFormatIsPacked        = false;
+            mVertexLoadFunction            = CopyNativeVertexData<GLushort, 4, 4, 0>;
+            mVertexLoadRequiresConversion  = false;
             break;
 
         case angle::FormatID::R16G16B16A16_UNORM:
-            intendedGLFormat             = GL_RGBA16_EXT;
-            actualImageFormatID          = angle::FormatID::R16G16B16A16_UNORM;
-            imageInitializerFunction     = nullptr;
-            actualBufferFormatID         = angle::FormatID::R16G16B16A16_UNORM;
-            vkBufferFormatIsPacked       = false;
-            vertexLoadFunction           = CopyNativeVertexData<GLushort, 4, 4, 0>;
-            vertexLoadRequiresConversion = false;
+            mIntendedGLFormat              = GL_RGBA16_EXT;
+            mActualSampleOnlyImageFormatID = angle::FormatID::R16G16B16A16_UNORM;
+            mImageInitializerFunction      = nullptr;
+            mActualBufferFormatID          = angle::FormatID::R16G16B16A16_UNORM;
+            mVkBufferFormatIsPacked        = false;
+            mVertexLoadFunction            = CopyNativeVertexData<GLushort, 4, 4, 0>;
+            mVertexLoadRequiresConversion  = false;
             break;
 
         case angle::FormatID::R16G16B16A16_USCALED:
-            intendedGLFormat         = GL_RGBA16_USCALED_ANGLEX;
-            actualImageFormatID      = angle::FormatID::R16G16B16A16_USCALED;
-            imageInitializerFunction = nullptr;
+            mIntendedGLFormat              = GL_RGBA16_USCALED_ANGLEX;
+            mActualSampleOnlyImageFormatID = angle::FormatID::R16G16B16A16_USCALED;
+            mImageInitializerFunction      = nullptr;
             {
                 static constexpr BufferFormatInitInfo kInfo[] = {
                     {angle::FormatID::R16G16B16A16_USCALED, false,
@@ -1247,7 +1247,7 @@
             break;
 
         case angle::FormatID::R16G16B16_FLOAT:
-            intendedGLFormat = GL_RGB16F;
+            mIntendedGLFormat = GL_RGB16F;
             {
                 static constexpr ImageFormatInitInfo kInfo[] = {
                     {angle::FormatID::R16G16B16_FLOAT, nullptr},
@@ -1266,7 +1266,7 @@
             break;
 
         case angle::FormatID::R16G16B16_SINT:
-            intendedGLFormat = GL_RGB16I;
+            mIntendedGLFormat = GL_RGB16I;
             {
                 static constexpr ImageFormatInitInfo kInfo[] = {
                     {angle::FormatID::R16G16B16_SINT, nullptr},
@@ -1285,9 +1285,9 @@
             break;
 
         case angle::FormatID::R16G16B16_SNORM:
-            intendedGLFormat         = GL_RGB16_SNORM_EXT;
-            actualImageFormatID      = angle::FormatID::R16G16B16_SNORM;
-            imageInitializerFunction = nullptr;
+            mIntendedGLFormat              = GL_RGB16_SNORM_EXT;
+            mActualSampleOnlyImageFormatID = angle::FormatID::R16G16B16_SNORM;
+            mImageInitializerFunction      = nullptr;
             {
                 static constexpr BufferFormatInitInfo kInfo[] = {
                     {angle::FormatID::R16G16B16_SNORM, false,
@@ -1303,9 +1303,9 @@
             break;
 
         case angle::FormatID::R16G16B16_SSCALED:
-            intendedGLFormat         = GL_RGB16_SSCALED_ANGLEX;
-            actualImageFormatID      = angle::FormatID::R16G16B16_SSCALED;
-            imageInitializerFunction = nullptr;
+            mIntendedGLFormat              = GL_RGB16_SSCALED_ANGLEX;
+            mActualSampleOnlyImageFormatID = angle::FormatID::R16G16B16_SSCALED;
+            mImageInitializerFunction      = nullptr;
             {
                 static constexpr BufferFormatInitInfo kInfo[] = {
                     {angle::FormatID::R16G16B16_SSCALED, false,
@@ -1321,7 +1321,7 @@
             break;
 
         case angle::FormatID::R16G16B16_UINT:
-            intendedGLFormat = GL_RGB16UI;
+            mIntendedGLFormat = GL_RGB16UI;
             {
                 static constexpr ImageFormatInitInfo kInfo[] = {
                     {angle::FormatID::R16G16B16_UINT, nullptr},
@@ -1340,9 +1340,9 @@
             break;
 
         case angle::FormatID::R16G16B16_UNORM:
-            intendedGLFormat         = GL_RGB16_EXT;
-            actualImageFormatID      = angle::FormatID::R16G16B16_UNORM;
-            imageInitializerFunction = nullptr;
+            mIntendedGLFormat              = GL_RGB16_EXT;
+            mActualSampleOnlyImageFormatID = angle::FormatID::R16G16B16_UNORM;
+            mImageInitializerFunction      = nullptr;
             {
                 static constexpr BufferFormatInitInfo kInfo[] = {
                     {angle::FormatID::R16G16B16_UNORM, false,
@@ -1358,9 +1358,9 @@
             break;
 
         case angle::FormatID::R16G16B16_USCALED:
-            intendedGLFormat         = GL_RGB16_USCALED_ANGLEX;
-            actualImageFormatID      = angle::FormatID::R16G16B16_USCALED;
-            imageInitializerFunction = nullptr;
+            mIntendedGLFormat              = GL_RGB16_USCALED_ANGLEX;
+            mActualSampleOnlyImageFormatID = angle::FormatID::R16G16B16_USCALED;
+            mImageInitializerFunction      = nullptr;
             {
                 static constexpr BufferFormatInitInfo kInfo[] = {
                     {angle::FormatID::R16G16B16_USCALED, false,
@@ -1376,39 +1376,39 @@
             break;
 
         case angle::FormatID::R16G16_FLOAT:
-            intendedGLFormat             = GL_RG16F;
-            actualImageFormatID          = angle::FormatID::R16G16_FLOAT;
-            imageInitializerFunction     = nullptr;
-            actualBufferFormatID         = angle::FormatID::R16G16_FLOAT;
-            vkBufferFormatIsPacked       = false;
-            vertexLoadFunction           = CopyNativeVertexData<GLhalf, 2, 2, 0>;
-            vertexLoadRequiresConversion = false;
+            mIntendedGLFormat              = GL_RG16F;
+            mActualSampleOnlyImageFormatID = angle::FormatID::R16G16_FLOAT;
+            mImageInitializerFunction      = nullptr;
+            mActualBufferFormatID          = angle::FormatID::R16G16_FLOAT;
+            mVkBufferFormatIsPacked        = false;
+            mVertexLoadFunction            = CopyNativeVertexData<GLhalf, 2, 2, 0>;
+            mVertexLoadRequiresConversion  = false;
             break;
 
         case angle::FormatID::R16G16_SINT:
-            intendedGLFormat             = GL_RG16I;
-            actualImageFormatID          = angle::FormatID::R16G16_SINT;
-            imageInitializerFunction     = nullptr;
-            actualBufferFormatID         = angle::FormatID::R16G16_SINT;
-            vkBufferFormatIsPacked       = false;
-            vertexLoadFunction           = CopyNativeVertexData<GLshort, 2, 2, 0>;
-            vertexLoadRequiresConversion = false;
+            mIntendedGLFormat              = GL_RG16I;
+            mActualSampleOnlyImageFormatID = angle::FormatID::R16G16_SINT;
+            mImageInitializerFunction      = nullptr;
+            mActualBufferFormatID          = angle::FormatID::R16G16_SINT;
+            mVkBufferFormatIsPacked        = false;
+            mVertexLoadFunction            = CopyNativeVertexData<GLshort, 2, 2, 0>;
+            mVertexLoadRequiresConversion  = false;
             break;
 
         case angle::FormatID::R16G16_SNORM:
-            intendedGLFormat             = GL_RG16_SNORM_EXT;
-            actualImageFormatID          = angle::FormatID::R16G16_SNORM;
-            imageInitializerFunction     = nullptr;
-            actualBufferFormatID         = angle::FormatID::R16G16_SNORM;
-            vkBufferFormatIsPacked       = false;
-            vertexLoadFunction           = CopyNativeVertexData<GLshort, 2, 2, 0>;
-            vertexLoadRequiresConversion = false;
+            mIntendedGLFormat              = GL_RG16_SNORM_EXT;
+            mActualSampleOnlyImageFormatID = angle::FormatID::R16G16_SNORM;
+            mImageInitializerFunction      = nullptr;
+            mActualBufferFormatID          = angle::FormatID::R16G16_SNORM;
+            mVkBufferFormatIsPacked        = false;
+            mVertexLoadFunction            = CopyNativeVertexData<GLshort, 2, 2, 0>;
+            mVertexLoadRequiresConversion  = false;
             break;
 
         case angle::FormatID::R16G16_SSCALED:
-            intendedGLFormat         = GL_RG16_SSCALED_ANGLEX;
-            actualImageFormatID      = angle::FormatID::R16G16_SSCALED;
-            imageInitializerFunction = nullptr;
+            mIntendedGLFormat              = GL_RG16_SSCALED_ANGLEX;
+            mActualSampleOnlyImageFormatID = angle::FormatID::R16G16_SSCALED;
+            mImageInitializerFunction      = nullptr;
             {
                 static constexpr BufferFormatInitInfo kInfo[] = {
                     {angle::FormatID::R16G16_SSCALED, false, CopyNativeVertexData<GLshort, 2, 2, 0>,
@@ -1422,29 +1422,29 @@
             break;
 
         case angle::FormatID::R16G16_UINT:
-            intendedGLFormat             = GL_RG16UI;
-            actualImageFormatID          = angle::FormatID::R16G16_UINT;
-            imageInitializerFunction     = nullptr;
-            actualBufferFormatID         = angle::FormatID::R16G16_UINT;
-            vkBufferFormatIsPacked       = false;
-            vertexLoadFunction           = CopyNativeVertexData<GLushort, 2, 2, 0>;
-            vertexLoadRequiresConversion = false;
+            mIntendedGLFormat              = GL_RG16UI;
+            mActualSampleOnlyImageFormatID = angle::FormatID::R16G16_UINT;
+            mImageInitializerFunction      = nullptr;
+            mActualBufferFormatID          = angle::FormatID::R16G16_UINT;
+            mVkBufferFormatIsPacked        = false;
+            mVertexLoadFunction            = CopyNativeVertexData<GLushort, 2, 2, 0>;
+            mVertexLoadRequiresConversion  = false;
             break;
 
         case angle::FormatID::R16G16_UNORM:
-            intendedGLFormat             = GL_RG16_EXT;
-            actualImageFormatID          = angle::FormatID::R16G16_UNORM;
-            imageInitializerFunction     = nullptr;
-            actualBufferFormatID         = angle::FormatID::R16G16_UNORM;
-            vkBufferFormatIsPacked       = false;
-            vertexLoadFunction           = CopyNativeVertexData<GLushort, 2, 2, 0>;
-            vertexLoadRequiresConversion = false;
+            mIntendedGLFormat              = GL_RG16_EXT;
+            mActualSampleOnlyImageFormatID = angle::FormatID::R16G16_UNORM;
+            mImageInitializerFunction      = nullptr;
+            mActualBufferFormatID          = angle::FormatID::R16G16_UNORM;
+            mVkBufferFormatIsPacked        = false;
+            mVertexLoadFunction            = CopyNativeVertexData<GLushort, 2, 2, 0>;
+            mVertexLoadRequiresConversion  = false;
             break;
 
         case angle::FormatID::R16G16_USCALED:
-            intendedGLFormat         = GL_RG16_USCALED_ANGLEX;
-            actualImageFormatID      = angle::FormatID::R16G16_USCALED;
-            imageInitializerFunction = nullptr;
+            mIntendedGLFormat              = GL_RG16_USCALED_ANGLEX;
+            mActualSampleOnlyImageFormatID = angle::FormatID::R16G16_USCALED;
+            mImageInitializerFunction      = nullptr;
             {
                 static constexpr BufferFormatInitInfo kInfo[] = {
                     {angle::FormatID::R16G16_USCALED, false,
@@ -1458,39 +1458,39 @@
             break;
 
         case angle::FormatID::R16_FLOAT:
-            intendedGLFormat             = GL_R16F;
-            actualImageFormatID          = angle::FormatID::R16_FLOAT;
-            imageInitializerFunction     = nullptr;
-            actualBufferFormatID         = angle::FormatID::R16_FLOAT;
-            vkBufferFormatIsPacked       = false;
-            vertexLoadFunction           = CopyNativeVertexData<GLhalf, 1, 1, 0>;
-            vertexLoadRequiresConversion = false;
+            mIntendedGLFormat              = GL_R16F;
+            mActualSampleOnlyImageFormatID = angle::FormatID::R16_FLOAT;
+            mImageInitializerFunction      = nullptr;
+            mActualBufferFormatID          = angle::FormatID::R16_FLOAT;
+            mVkBufferFormatIsPacked        = false;
+            mVertexLoadFunction            = CopyNativeVertexData<GLhalf, 1, 1, 0>;
+            mVertexLoadRequiresConversion  = false;
             break;
 
         case angle::FormatID::R16_SINT:
-            intendedGLFormat             = GL_R16I;
-            actualImageFormatID          = angle::FormatID::R16_SINT;
-            imageInitializerFunction     = nullptr;
-            actualBufferFormatID         = angle::FormatID::R16_SINT;
-            vkBufferFormatIsPacked       = false;
-            vertexLoadFunction           = CopyNativeVertexData<GLshort, 1, 1, 0>;
-            vertexLoadRequiresConversion = false;
+            mIntendedGLFormat              = GL_R16I;
+            mActualSampleOnlyImageFormatID = angle::FormatID::R16_SINT;
+            mImageInitializerFunction      = nullptr;
+            mActualBufferFormatID          = angle::FormatID::R16_SINT;
+            mVkBufferFormatIsPacked        = false;
+            mVertexLoadFunction            = CopyNativeVertexData<GLshort, 1, 1, 0>;
+            mVertexLoadRequiresConversion  = false;
             break;
 
         case angle::FormatID::R16_SNORM:
-            intendedGLFormat             = GL_R16_SNORM_EXT;
-            actualImageFormatID          = angle::FormatID::R16_SNORM;
-            imageInitializerFunction     = nullptr;
-            actualBufferFormatID         = angle::FormatID::R16_SNORM;
-            vkBufferFormatIsPacked       = false;
-            vertexLoadFunction           = CopyNativeVertexData<GLshort, 1, 1, 0>;
-            vertexLoadRequiresConversion = false;
+            mIntendedGLFormat              = GL_R16_SNORM_EXT;
+            mActualSampleOnlyImageFormatID = angle::FormatID::R16_SNORM;
+            mImageInitializerFunction      = nullptr;
+            mActualBufferFormatID          = angle::FormatID::R16_SNORM;
+            mVkBufferFormatIsPacked        = false;
+            mVertexLoadFunction            = CopyNativeVertexData<GLshort, 1, 1, 0>;
+            mVertexLoadRequiresConversion  = false;
             break;
 
         case angle::FormatID::R16_SSCALED:
-            intendedGLFormat         = GL_R16_SSCALED_ANGLEX;
-            actualImageFormatID      = angle::FormatID::R16_SSCALED;
-            imageInitializerFunction = nullptr;
+            mIntendedGLFormat              = GL_R16_SSCALED_ANGLEX;
+            mActualSampleOnlyImageFormatID = angle::FormatID::R16_SSCALED;
+            mImageInitializerFunction      = nullptr;
             {
                 static constexpr BufferFormatInitInfo kInfo[] = {
                     {angle::FormatID::R16_SSCALED, false, CopyNativeVertexData<GLshort, 1, 1, 0>,
@@ -1504,29 +1504,29 @@
             break;
 
         case angle::FormatID::R16_UINT:
-            intendedGLFormat             = GL_R16UI;
-            actualImageFormatID          = angle::FormatID::R16_UINT;
-            imageInitializerFunction     = nullptr;
-            actualBufferFormatID         = angle::FormatID::R16_UINT;
-            vkBufferFormatIsPacked       = false;
-            vertexLoadFunction           = CopyNativeVertexData<GLushort, 1, 1, 0>;
-            vertexLoadRequiresConversion = false;
+            mIntendedGLFormat              = GL_R16UI;
+            mActualSampleOnlyImageFormatID = angle::FormatID::R16_UINT;
+            mImageInitializerFunction      = nullptr;
+            mActualBufferFormatID          = angle::FormatID::R16_UINT;
+            mVkBufferFormatIsPacked        = false;
+            mVertexLoadFunction            = CopyNativeVertexData<GLushort, 1, 1, 0>;
+            mVertexLoadRequiresConversion  = false;
             break;
 
         case angle::FormatID::R16_UNORM:
-            intendedGLFormat             = GL_R16_EXT;
-            actualImageFormatID          = angle::FormatID::R16_UNORM;
-            imageInitializerFunction     = nullptr;
-            actualBufferFormatID         = angle::FormatID::R16_UNORM;
-            vkBufferFormatIsPacked       = false;
-            vertexLoadFunction           = CopyNativeVertexData<GLushort, 1, 1, 0>;
-            vertexLoadRequiresConversion = false;
+            mIntendedGLFormat              = GL_R16_EXT;
+            mActualSampleOnlyImageFormatID = angle::FormatID::R16_UNORM;
+            mImageInitializerFunction      = nullptr;
+            mActualBufferFormatID          = angle::FormatID::R16_UNORM;
+            mVkBufferFormatIsPacked        = false;
+            mVertexLoadFunction            = CopyNativeVertexData<GLushort, 1, 1, 0>;
+            mVertexLoadRequiresConversion  = false;
             break;
 
         case angle::FormatID::R16_USCALED:
-            intendedGLFormat         = GL_R16_USCALED_ANGLEX;
-            actualImageFormatID      = angle::FormatID::R16_USCALED;
-            imageInitializerFunction = nullptr;
+            mIntendedGLFormat              = GL_R16_USCALED_ANGLEX;
+            mActualSampleOnlyImageFormatID = angle::FormatID::R16_USCALED;
+            mImageInitializerFunction      = nullptr;
             {
                 static constexpr BufferFormatInitInfo kInfo[] = {
                     {angle::FormatID::R16_USCALED, false, CopyNativeVertexData<GLushort, 1, 1, 0>,
@@ -1540,18 +1540,18 @@
             break;
 
         case angle::FormatID::R32G32B32A32_FIXED:
-            intendedGLFormat = GL_RGBA32_FIXED_ANGLEX;
+            mIntendedGLFormat = GL_RGBA32_FIXED_ANGLEX;
 
-            actualBufferFormatID         = angle::FormatID::R32G32B32A32_FLOAT;
-            vkBufferFormatIsPacked       = false;
-            vertexLoadFunction           = Copy32FixedTo32FVertexData<4, 4>;
-            vertexLoadRequiresConversion = true;
+            mActualBufferFormatID         = angle::FormatID::R32G32B32A32_FLOAT;
+            mVkBufferFormatIsPacked       = false;
+            mVertexLoadFunction           = Copy32FixedTo32FVertexData<4, 4>;
+            mVertexLoadRequiresConversion = true;
             break;
 
         case angle::FormatID::R32G32B32A32_FLOAT:
-            intendedGLFormat         = GL_RGBA32F;
-            actualImageFormatID      = angle::FormatID::R32G32B32A32_FLOAT;
-            imageInitializerFunction = nullptr;
+            mIntendedGLFormat              = GL_RGBA32F;
+            mActualSampleOnlyImageFormatID = angle::FormatID::R32G32B32A32_FLOAT;
+            mImageInitializerFunction      = nullptr;
             {
                 static constexpr BufferFormatInitInfo kInfo[] = {
                     {angle::FormatID::R32G32B32A32_FLOAT, false,
@@ -1563,72 +1563,72 @@
             break;
 
         case angle::FormatID::R32G32B32A32_SINT:
-            intendedGLFormat             = GL_RGBA32I;
-            actualImageFormatID          = angle::FormatID::R32G32B32A32_SINT;
-            imageInitializerFunction     = nullptr;
-            actualBufferFormatID         = angle::FormatID::R32G32B32A32_SINT;
-            vkBufferFormatIsPacked       = false;
-            vertexLoadFunction           = CopyNativeVertexData<GLint, 4, 4, 0>;
-            vertexLoadRequiresConversion = false;
+            mIntendedGLFormat              = GL_RGBA32I;
+            mActualSampleOnlyImageFormatID = angle::FormatID::R32G32B32A32_SINT;
+            mImageInitializerFunction      = nullptr;
+            mActualBufferFormatID          = angle::FormatID::R32G32B32A32_SINT;
+            mVkBufferFormatIsPacked        = false;
+            mVertexLoadFunction            = CopyNativeVertexData<GLint, 4, 4, 0>;
+            mVertexLoadRequiresConversion  = false;
             break;
 
         case angle::FormatID::R32G32B32A32_SNORM:
-            intendedGLFormat = GL_RGBA32_SNORM_ANGLEX;
+            mIntendedGLFormat = GL_RGBA32_SNORM_ANGLEX;
 
-            actualBufferFormatID         = angle::FormatID::R32G32B32A32_FLOAT;
-            vkBufferFormatIsPacked       = false;
-            vertexLoadFunction           = CopyToFloatVertexData<GLint, 4, 4, true, false>;
-            vertexLoadRequiresConversion = true;
+            mActualBufferFormatID         = angle::FormatID::R32G32B32A32_FLOAT;
+            mVkBufferFormatIsPacked       = false;
+            mVertexLoadFunction           = CopyToFloatVertexData<GLint, 4, 4, true, false>;
+            mVertexLoadRequiresConversion = true;
             break;
 
         case angle::FormatID::R32G32B32A32_SSCALED:
-            intendedGLFormat = GL_RGBA32_SSCALED_ANGLEX;
+            mIntendedGLFormat = GL_RGBA32_SSCALED_ANGLEX;
 
-            actualBufferFormatID         = angle::FormatID::R32G32B32A32_FLOAT;
-            vkBufferFormatIsPacked       = false;
-            vertexLoadFunction           = CopyToFloatVertexData<GLint, 4, 4, false, false>;
-            vertexLoadRequiresConversion = true;
+            mActualBufferFormatID         = angle::FormatID::R32G32B32A32_FLOAT;
+            mVkBufferFormatIsPacked       = false;
+            mVertexLoadFunction           = CopyToFloatVertexData<GLint, 4, 4, false, false>;
+            mVertexLoadRequiresConversion = true;
             break;
 
         case angle::FormatID::R32G32B32A32_UINT:
-            intendedGLFormat             = GL_RGBA32UI;
-            actualImageFormatID          = angle::FormatID::R32G32B32A32_UINT;
-            imageInitializerFunction     = nullptr;
-            actualBufferFormatID         = angle::FormatID::R32G32B32A32_UINT;
-            vkBufferFormatIsPacked       = false;
-            vertexLoadFunction           = CopyNativeVertexData<GLuint, 4, 4, 0>;
-            vertexLoadRequiresConversion = false;
+            mIntendedGLFormat              = GL_RGBA32UI;
+            mActualSampleOnlyImageFormatID = angle::FormatID::R32G32B32A32_UINT;
+            mImageInitializerFunction      = nullptr;
+            mActualBufferFormatID          = angle::FormatID::R32G32B32A32_UINT;
+            mVkBufferFormatIsPacked        = false;
+            mVertexLoadFunction            = CopyNativeVertexData<GLuint, 4, 4, 0>;
+            mVertexLoadRequiresConversion  = false;
             break;
 
         case angle::FormatID::R32G32B32A32_UNORM:
-            intendedGLFormat = GL_RGBA32_UNORM_ANGLEX;
+            mIntendedGLFormat = GL_RGBA32_UNORM_ANGLEX;
 
-            actualBufferFormatID         = angle::FormatID::R32G32B32A32_FLOAT;
-            vkBufferFormatIsPacked       = false;
-            vertexLoadFunction           = CopyToFloatVertexData<GLuint, 4, 4, true, false>;
-            vertexLoadRequiresConversion = true;
+            mActualBufferFormatID         = angle::FormatID::R32G32B32A32_FLOAT;
+            mVkBufferFormatIsPacked       = false;
+            mVertexLoadFunction           = CopyToFloatVertexData<GLuint, 4, 4, true, false>;
+            mVertexLoadRequiresConversion = true;
             break;
 
         case angle::FormatID::R32G32B32A32_USCALED:
-            intendedGLFormat = GL_RGBA32_USCALED_ANGLEX;
+            mIntendedGLFormat = GL_RGBA32_USCALED_ANGLEX;
 
-            actualBufferFormatID         = angle::FormatID::R32G32B32A32_FLOAT;
-            vkBufferFormatIsPacked       = false;
-            vertexLoadFunction           = CopyToFloatVertexData<GLuint, 4, 4, false, false>;
-            vertexLoadRequiresConversion = true;
+            mActualBufferFormatID         = angle::FormatID::R32G32B32A32_FLOAT;
+            mVkBufferFormatIsPacked       = false;
+            mVertexLoadFunction           = CopyToFloatVertexData<GLuint, 4, 4, false, false>;
+            mVertexLoadRequiresConversion = true;
             break;
 
         case angle::FormatID::R32G32B32_FIXED:
-            intendedGLFormat = GL_RGB32_FIXED_ANGLEX;
+            mIntendedGLFormat = GL_RGB32_FIXED_ANGLEX;
 
-            actualBufferFormatID         = angle::FormatID::R32G32B32_FLOAT;
-            vkBufferFormatIsPacked       = false;
-            vertexLoadFunction           = Copy32FixedTo32FVertexData<3, 3>;
-            vertexLoadRequiresConversion = true;
+            mActualBufferFormatID         = angle::FormatID::R32G32B32_FLOAT;
+            mVkBufferFormatIsPacked       = false;
+            mVertexLoadFunction           = Copy32FixedTo32FVertexData<3, 3>;
+            mVertexLoadRequiresConversion = true;
             break;
 
         case angle::FormatID::R32G32B32_FLOAT:
-            intendedGLFormat = GL_RGB32F;
+            mIntendedGLFormat = GL_RGB32F;
             {
                 static constexpr ImageFormatInitInfo kInfo[] = {
                     {angle::FormatID::R32G32B32_FLOAT, nullptr},
@@ -1650,7 +1650,7 @@
             break;
 
         case angle::FormatID::R32G32B32_SINT:
-            intendedGLFormat = GL_RGB32I;
+            mIntendedGLFormat = GL_RGB32I;
             {
                 static constexpr ImageFormatInitInfo kInfo[] = {
                     {angle::FormatID::R32G32B32_SINT, nullptr},
@@ -1659,32 +1659,32 @@
                                               0x00000001>}};
                 initImageFallback(renderer, kInfo, ArraySize(kInfo));
             }
-            actualBufferFormatID         = angle::FormatID::R32G32B32_SINT;
-            vkBufferFormatIsPacked       = false;
-            vertexLoadFunction           = CopyNativeVertexData<GLint, 3, 3, 0>;
-            vertexLoadRequiresConversion = false;
+            mActualBufferFormatID         = angle::FormatID::R32G32B32_SINT;
+            mVkBufferFormatIsPacked       = false;
+            mVertexLoadFunction           = CopyNativeVertexData<GLint, 3, 3, 0>;
+            mVertexLoadRequiresConversion = false;
             break;
 
         case angle::FormatID::R32G32B32_SNORM:
-            intendedGLFormat = GL_RGB32_SNORM_ANGLEX;
+            mIntendedGLFormat = GL_RGB32_SNORM_ANGLEX;
 
-            actualBufferFormatID         = angle::FormatID::R32G32B32_FLOAT;
-            vkBufferFormatIsPacked       = false;
-            vertexLoadFunction           = CopyToFloatVertexData<GLint, 3, 3, true, false>;
-            vertexLoadRequiresConversion = true;
+            mActualBufferFormatID         = angle::FormatID::R32G32B32_FLOAT;
+            mVkBufferFormatIsPacked       = false;
+            mVertexLoadFunction           = CopyToFloatVertexData<GLint, 3, 3, true, false>;
+            mVertexLoadRequiresConversion = true;
             break;
 
         case angle::FormatID::R32G32B32_SSCALED:
-            intendedGLFormat = GL_RGB32_SSCALED_ANGLEX;
+            mIntendedGLFormat = GL_RGB32_SSCALED_ANGLEX;
 
-            actualBufferFormatID         = angle::FormatID::R32G32B32_FLOAT;
-            vkBufferFormatIsPacked       = false;
-            vertexLoadFunction           = CopyToFloatVertexData<GLint, 3, 3, false, false>;
-            vertexLoadRequiresConversion = true;
+            mActualBufferFormatID         = angle::FormatID::R32G32B32_FLOAT;
+            mVkBufferFormatIsPacked       = false;
+            mVertexLoadFunction           = CopyToFloatVertexData<GLint, 3, 3, false, false>;
+            mVertexLoadRequiresConversion = true;
             break;
 
         case angle::FormatID::R32G32B32_UINT:
-            intendedGLFormat = GL_RGB32UI;
+            mIntendedGLFormat = GL_RGB32UI;
             {
                 static constexpr ImageFormatInitInfo kInfo[] = {
                     {angle::FormatID::R32G32B32_UINT, nullptr},
@@ -1693,43 +1693,43 @@
                                               0x00000001>}};
                 initImageFallback(renderer, kInfo, ArraySize(kInfo));
             }
-            actualBufferFormatID         = angle::FormatID::R32G32B32_UINT;
-            vkBufferFormatIsPacked       = false;
-            vertexLoadFunction           = CopyNativeVertexData<GLuint, 3, 3, 0>;
-            vertexLoadRequiresConversion = false;
+            mActualBufferFormatID         = angle::FormatID::R32G32B32_UINT;
+            mVkBufferFormatIsPacked       = false;
+            mVertexLoadFunction           = CopyNativeVertexData<GLuint, 3, 3, 0>;
+            mVertexLoadRequiresConversion = false;
             break;
 
         case angle::FormatID::R32G32B32_UNORM:
-            intendedGLFormat = GL_RGB32_UNORM_ANGLEX;
+            mIntendedGLFormat = GL_RGB32_UNORM_ANGLEX;
 
-            actualBufferFormatID         = angle::FormatID::R32G32B32_FLOAT;
-            vkBufferFormatIsPacked       = false;
-            vertexLoadFunction           = CopyToFloatVertexData<GLuint, 3, 3, true, false>;
-            vertexLoadRequiresConversion = true;
+            mActualBufferFormatID         = angle::FormatID::R32G32B32_FLOAT;
+            mVkBufferFormatIsPacked       = false;
+            mVertexLoadFunction           = CopyToFloatVertexData<GLuint, 3, 3, true, false>;
+            mVertexLoadRequiresConversion = true;
             break;
 
         case angle::FormatID::R32G32B32_USCALED:
-            intendedGLFormat = GL_RGB32_USCALED_ANGLEX;
+            mIntendedGLFormat = GL_RGB32_USCALED_ANGLEX;
 
-            actualBufferFormatID         = angle::FormatID::R32G32B32_FLOAT;
-            vkBufferFormatIsPacked       = false;
-            vertexLoadFunction           = CopyToFloatVertexData<GLuint, 3, 3, false, false>;
-            vertexLoadRequiresConversion = true;
+            mActualBufferFormatID         = angle::FormatID::R32G32B32_FLOAT;
+            mVkBufferFormatIsPacked       = false;
+            mVertexLoadFunction           = CopyToFloatVertexData<GLuint, 3, 3, false, false>;
+            mVertexLoadRequiresConversion = true;
             break;
 
         case angle::FormatID::R32G32_FIXED:
-            intendedGLFormat = GL_RG32_FIXED_ANGLEX;
+            mIntendedGLFormat = GL_RG32_FIXED_ANGLEX;
 
-            actualBufferFormatID         = angle::FormatID::R32G32_FLOAT;
-            vkBufferFormatIsPacked       = false;
-            vertexLoadFunction           = Copy32FixedTo32FVertexData<2, 2>;
-            vertexLoadRequiresConversion = true;
+            mActualBufferFormatID         = angle::FormatID::R32G32_FLOAT;
+            mVkBufferFormatIsPacked       = false;
+            mVertexLoadFunction           = Copy32FixedTo32FVertexData<2, 2>;
+            mVertexLoadRequiresConversion = true;
             break;
 
         case angle::FormatID::R32G32_FLOAT:
-            intendedGLFormat         = GL_RG32F;
-            actualImageFormatID      = angle::FormatID::R32G32_FLOAT;
-            imageInitializerFunction = nullptr;
+            mIntendedGLFormat              = GL_RG32F;
+            mActualSampleOnlyImageFormatID = angle::FormatID::R32G32_FLOAT;
+            mImageInitializerFunction      = nullptr;
             {
                 static constexpr BufferFormatInitInfo kInfo[] = {
                     {angle::FormatID::R32G32_FLOAT, false, CopyNativeVertexData<GLfloat, 2, 2, 0>,
@@ -1741,74 +1741,74 @@
             break;
 
         case angle::FormatID::R32G32_SINT:
-            intendedGLFormat             = GL_RG32I;
-            actualImageFormatID          = angle::FormatID::R32G32_SINT;
-            imageInitializerFunction     = nullptr;
-            actualBufferFormatID         = angle::FormatID::R32G32_SINT;
-            vkBufferFormatIsPacked       = false;
-            vertexLoadFunction           = CopyNativeVertexData<GLint, 2, 2, 0>;
-            vertexLoadRequiresConversion = false;
+            mIntendedGLFormat              = GL_RG32I;
+            mActualSampleOnlyImageFormatID = angle::FormatID::R32G32_SINT;
+            mImageInitializerFunction      = nullptr;
+            mActualBufferFormatID          = angle::FormatID::R32G32_SINT;
+            mVkBufferFormatIsPacked        = false;
+            mVertexLoadFunction            = CopyNativeVertexData<GLint, 2, 2, 0>;
+            mVertexLoadRequiresConversion  = false;
             break;
 
         case angle::FormatID::R32G32_SNORM:
-            intendedGLFormat = GL_RG32_SNORM_ANGLEX;
+            mIntendedGLFormat = GL_RG32_SNORM_ANGLEX;
 
-            actualBufferFormatID         = angle::FormatID::R32G32_FLOAT;
-            vkBufferFormatIsPacked       = false;
-            vertexLoadFunction           = CopyToFloatVertexData<GLint, 2, 2, true, false>;
-            vertexLoadRequiresConversion = true;
+            mActualBufferFormatID         = angle::FormatID::R32G32_FLOAT;
+            mVkBufferFormatIsPacked       = false;
+            mVertexLoadFunction           = CopyToFloatVertexData<GLint, 2, 2, true, false>;
+            mVertexLoadRequiresConversion = true;
             break;
 
         case angle::FormatID::R32G32_SSCALED:
-            intendedGLFormat = GL_RG32_SSCALED_ANGLEX;
+            mIntendedGLFormat = GL_RG32_SSCALED_ANGLEX;
 
-            actualBufferFormatID         = angle::FormatID::R32G32_FLOAT;
-            vkBufferFormatIsPacked       = false;
-            vertexLoadFunction           = CopyToFloatVertexData<GLint, 2, 2, false, false>;
-            vertexLoadRequiresConversion = true;
+            mActualBufferFormatID         = angle::FormatID::R32G32_FLOAT;
+            mVkBufferFormatIsPacked       = false;
+            mVertexLoadFunction           = CopyToFloatVertexData<GLint, 2, 2, false, false>;
+            mVertexLoadRequiresConversion = true;
             break;
 
         case angle::FormatID::R32G32_UINT:
-            intendedGLFormat             = GL_RG32UI;
-            actualImageFormatID          = angle::FormatID::R32G32_UINT;
-            imageInitializerFunction     = nullptr;
-            actualBufferFormatID         = angle::FormatID::R32G32_UINT;
-            vkBufferFormatIsPacked       = false;
-            vertexLoadFunction           = CopyNativeVertexData<GLuint, 2, 2, 0>;
-            vertexLoadRequiresConversion = false;
+            mIntendedGLFormat              = GL_RG32UI;
+            mActualSampleOnlyImageFormatID = angle::FormatID::R32G32_UINT;
+            mImageInitializerFunction      = nullptr;
+            mActualBufferFormatID          = angle::FormatID::R32G32_UINT;
+            mVkBufferFormatIsPacked        = false;
+            mVertexLoadFunction            = CopyNativeVertexData<GLuint, 2, 2, 0>;
+            mVertexLoadRequiresConversion  = false;
             break;
 
         case angle::FormatID::R32G32_UNORM:
-            intendedGLFormat = GL_RG32_UNORM_ANGLEX;
+            mIntendedGLFormat = GL_RG32_UNORM_ANGLEX;
 
-            actualBufferFormatID         = angle::FormatID::R32G32_FLOAT;
-            vkBufferFormatIsPacked       = false;
-            vertexLoadFunction           = CopyToFloatVertexData<GLuint, 2, 2, true, false>;
-            vertexLoadRequiresConversion = true;
+            mActualBufferFormatID         = angle::FormatID::R32G32_FLOAT;
+            mVkBufferFormatIsPacked       = false;
+            mVertexLoadFunction           = CopyToFloatVertexData<GLuint, 2, 2, true, false>;
+            mVertexLoadRequiresConversion = true;
             break;
 
         case angle::FormatID::R32G32_USCALED:
-            intendedGLFormat = GL_RG32_USCALED_ANGLEX;
+            mIntendedGLFormat = GL_RG32_USCALED_ANGLEX;
 
-            actualBufferFormatID         = angle::FormatID::R32G32_FLOAT;
-            vkBufferFormatIsPacked       = false;
-            vertexLoadFunction           = CopyToFloatVertexData<GLuint, 2, 2, false, false>;
-            vertexLoadRequiresConversion = true;
+            mActualBufferFormatID         = angle::FormatID::R32G32_FLOAT;
+            mVkBufferFormatIsPacked       = false;
+            mVertexLoadFunction           = CopyToFloatVertexData<GLuint, 2, 2, false, false>;
+            mVertexLoadRequiresConversion = true;
             break;
 
         case angle::FormatID::R32_FIXED:
-            intendedGLFormat = GL_R32_FIXED_ANGLEX;
+            mIntendedGLFormat = GL_R32_FIXED_ANGLEX;
 
-            actualBufferFormatID         = angle::FormatID::R32_FLOAT;
-            vkBufferFormatIsPacked       = false;
-            vertexLoadFunction           = Copy32FixedTo32FVertexData<1, 1>;
-            vertexLoadRequiresConversion = true;
+            mActualBufferFormatID         = angle::FormatID::R32_FLOAT;
+            mVkBufferFormatIsPacked       = false;
+            mVertexLoadFunction           = Copy32FixedTo32FVertexData<1, 1>;
+            mVertexLoadRequiresConversion = true;
             break;
 
         case angle::FormatID::R32_FLOAT:
-            intendedGLFormat         = GL_R32F;
-            actualImageFormatID      = angle::FormatID::R32_FLOAT;
-            imageInitializerFunction = nullptr;
+            mIntendedGLFormat              = GL_R32F;
+            mActualSampleOnlyImageFormatID = angle::FormatID::R32_FLOAT;
+            mImageInitializerFunction      = nullptr;
             {
                 static constexpr BufferFormatInitInfo kInfo[] = {
                     {angle::FormatID::R32_FLOAT, false, CopyNativeVertexData<GLfloat, 1, 1, 0>,
@@ -1820,123 +1820,123 @@
             break;
 
         case angle::FormatID::R32_SINT:
-            intendedGLFormat             = GL_R32I;
-            actualImageFormatID          = angle::FormatID::R32_SINT;
-            imageInitializerFunction     = nullptr;
-            actualBufferFormatID         = angle::FormatID::R32_SINT;
-            vkBufferFormatIsPacked       = false;
-            vertexLoadFunction           = CopyNativeVertexData<GLint, 1, 1, 0>;
-            vertexLoadRequiresConversion = false;
+            mIntendedGLFormat              = GL_R32I;
+            mActualSampleOnlyImageFormatID = angle::FormatID::R32_SINT;
+            mImageInitializerFunction      = nullptr;
+            mActualBufferFormatID          = angle::FormatID::R32_SINT;
+            mVkBufferFormatIsPacked        = false;
+            mVertexLoadFunction            = CopyNativeVertexData<GLint, 1, 1, 0>;
+            mVertexLoadRequiresConversion  = false;
             break;
 
         case angle::FormatID::R32_SNORM:
-            intendedGLFormat = GL_R32_SNORM_ANGLEX;
+            mIntendedGLFormat = GL_R32_SNORM_ANGLEX;
 
-            actualBufferFormatID         = angle::FormatID::R32_FLOAT;
-            vkBufferFormatIsPacked       = false;
-            vertexLoadFunction           = CopyToFloatVertexData<GLint, 1, 1, true, false>;
-            vertexLoadRequiresConversion = true;
+            mActualBufferFormatID         = angle::FormatID::R32_FLOAT;
+            mVkBufferFormatIsPacked       = false;
+            mVertexLoadFunction           = CopyToFloatVertexData<GLint, 1, 1, true, false>;
+            mVertexLoadRequiresConversion = true;
             break;
 
         case angle::FormatID::R32_SSCALED:
-            intendedGLFormat = GL_R32_SSCALED_ANGLEX;
+            mIntendedGLFormat = GL_R32_SSCALED_ANGLEX;
 
-            actualBufferFormatID         = angle::FormatID::R32_FLOAT;
-            vkBufferFormatIsPacked       = false;
-            vertexLoadFunction           = CopyToFloatVertexData<GLint, 1, 1, false, false>;
-            vertexLoadRequiresConversion = true;
+            mActualBufferFormatID         = angle::FormatID::R32_FLOAT;
+            mVkBufferFormatIsPacked       = false;
+            mVertexLoadFunction           = CopyToFloatVertexData<GLint, 1, 1, false, false>;
+            mVertexLoadRequiresConversion = true;
             break;
 
         case angle::FormatID::R32_UINT:
-            intendedGLFormat             = GL_R32UI;
-            actualImageFormatID          = angle::FormatID::R32_UINT;
-            imageInitializerFunction     = nullptr;
-            actualBufferFormatID         = angle::FormatID::R32_UINT;
-            vkBufferFormatIsPacked       = false;
-            vertexLoadFunction           = CopyNativeVertexData<GLuint, 1, 1, 0>;
-            vertexLoadRequiresConversion = false;
+            mIntendedGLFormat              = GL_R32UI;
+            mActualSampleOnlyImageFormatID = angle::FormatID::R32_UINT;
+            mImageInitializerFunction      = nullptr;
+            mActualBufferFormatID          = angle::FormatID::R32_UINT;
+            mVkBufferFormatIsPacked        = false;
+            mVertexLoadFunction            = CopyNativeVertexData<GLuint, 1, 1, 0>;
+            mVertexLoadRequiresConversion  = false;
             break;
 
         case angle::FormatID::R32_UNORM:
-            intendedGLFormat = GL_R32_UNORM_ANGLEX;
+            mIntendedGLFormat = GL_R32_UNORM_ANGLEX;
 
-            actualBufferFormatID         = angle::FormatID::R32_FLOAT;
-            vkBufferFormatIsPacked       = false;
-            vertexLoadFunction           = CopyToFloatVertexData<GLuint, 1, 1, true, false>;
-            vertexLoadRequiresConversion = true;
+            mActualBufferFormatID         = angle::FormatID::R32_FLOAT;
+            mVkBufferFormatIsPacked       = false;
+            mVertexLoadFunction           = CopyToFloatVertexData<GLuint, 1, 1, true, false>;
+            mVertexLoadRequiresConversion = true;
             break;
 
         case angle::FormatID::R32_USCALED:
-            intendedGLFormat = GL_R32_USCALED_ANGLEX;
+            mIntendedGLFormat = GL_R32_USCALED_ANGLEX;
 
-            actualBufferFormatID         = angle::FormatID::R32_FLOAT;
-            vkBufferFormatIsPacked       = false;
-            vertexLoadFunction           = CopyToFloatVertexData<GLuint, 1, 1, false, false>;
-            vertexLoadRequiresConversion = true;
+            mActualBufferFormatID         = angle::FormatID::R32_FLOAT;
+            mVkBufferFormatIsPacked       = false;
+            mVertexLoadFunction           = CopyToFloatVertexData<GLuint, 1, 1, false, false>;
+            mVertexLoadRequiresConversion = true;
             break;
 
         case angle::FormatID::R4G4B4A4_UNORM:
-            intendedGLFormat = GL_RGBA4;
+            mIntendedGLFormat = GL_RGBA4;
             {
                 static constexpr ImageFormatInitInfo kInfo[] = {
                     {angle::FormatID::R4G4B4A4_UNORM, nullptr},
                     {angle::FormatID::R8G8B8A8_UNORM, nullptr}};
                 initImageFallback(renderer, kInfo, ArraySize(kInfo));
             }
-            actualBufferFormatID         = angle::FormatID::R4G4B4A4_UNORM;
-            vkBufferFormatIsPacked       = true;
-            vertexLoadFunction           = CopyNativeVertexData<GLushort, 1, 1, 0>;
-            vertexLoadRequiresConversion = false;
+            mActualBufferFormatID         = angle::FormatID::R4G4B4A4_UNORM;
+            mVkBufferFormatIsPacked       = true;
+            mVertexLoadFunction           = CopyNativeVertexData<GLushort, 1, 1, 0>;
+            mVertexLoadRequiresConversion = false;
             break;
 
         case angle::FormatID::R5G5B5A1_UNORM:
-            intendedGLFormat = GL_RGB5_A1;
+            mIntendedGLFormat = GL_RGB5_A1;
             {
                 static constexpr ImageFormatInitInfo kInfo[] = {
                     {angle::FormatID::R5G5B5A1_UNORM, nullptr},
                     {angle::FormatID::A1R5G5B5_UNORM, nullptr}};
                 initImageFallback(renderer, kInfo, ArraySize(kInfo));
             }
-            actualBufferFormatID         = angle::FormatID::R5G5B5A1_UNORM;
-            vkBufferFormatIsPacked       = true;
-            vertexLoadFunction           = CopyNativeVertexData<GLushort, 1, 1, 0>;
-            vertexLoadRequiresConversion = false;
+            mActualBufferFormatID         = angle::FormatID::R5G5B5A1_UNORM;
+            mVkBufferFormatIsPacked       = true;
+            mVertexLoadFunction           = CopyNativeVertexData<GLushort, 1, 1, 0>;
+            mVertexLoadRequiresConversion = false;
             break;
 
         case angle::FormatID::R5G6B5_UNORM:
-            intendedGLFormat             = GL_RGB565;
-            actualImageFormatID          = angle::FormatID::R5G6B5_UNORM;
-            imageInitializerFunction     = nullptr;
-            actualBufferFormatID         = angle::FormatID::R5G6B5_UNORM;
-            vkBufferFormatIsPacked       = true;
-            vertexLoadFunction           = CopyNativeVertexData<GLushort, 1, 1, 0>;
-            vertexLoadRequiresConversion = false;
+            mIntendedGLFormat              = GL_RGB565;
+            mActualSampleOnlyImageFormatID = angle::FormatID::R5G6B5_UNORM;
+            mImageInitializerFunction      = nullptr;
+            mActualBufferFormatID          = angle::FormatID::R5G6B5_UNORM;
+            mVkBufferFormatIsPacked        = true;
+            mVertexLoadFunction            = CopyNativeVertexData<GLushort, 1, 1, 0>;
+            mVertexLoadRequiresConversion  = false;
             break;
 
         case angle::FormatID::R8G8B8A8_SINT:
-            intendedGLFormat             = GL_RGBA8I;
-            actualImageFormatID          = angle::FormatID::R8G8B8A8_SINT;
-            imageInitializerFunction     = nullptr;
-            actualBufferFormatID         = angle::FormatID::R8G8B8A8_SINT;
-            vkBufferFormatIsPacked       = false;
-            vertexLoadFunction           = CopyNativeVertexData<GLbyte, 4, 4, 0>;
-            vertexLoadRequiresConversion = false;
+            mIntendedGLFormat              = GL_RGBA8I;
+            mActualSampleOnlyImageFormatID = angle::FormatID::R8G8B8A8_SINT;
+            mImageInitializerFunction      = nullptr;
+            mActualBufferFormatID          = angle::FormatID::R8G8B8A8_SINT;
+            mVkBufferFormatIsPacked        = false;
+            mVertexLoadFunction            = CopyNativeVertexData<GLbyte, 4, 4, 0>;
+            mVertexLoadRequiresConversion  = false;
             break;
 
         case angle::FormatID::R8G8B8A8_SNORM:
-            intendedGLFormat             = GL_RGBA8_SNORM;
-            actualImageFormatID          = angle::FormatID::R8G8B8A8_SNORM;
-            imageInitializerFunction     = nullptr;
-            actualBufferFormatID         = angle::FormatID::R8G8B8A8_SNORM;
-            vkBufferFormatIsPacked       = false;
-            vertexLoadFunction           = CopyNativeVertexData<GLbyte, 4, 4, 0>;
-            vertexLoadRequiresConversion = false;
+            mIntendedGLFormat              = GL_RGBA8_SNORM;
+            mActualSampleOnlyImageFormatID = angle::FormatID::R8G8B8A8_SNORM;
+            mImageInitializerFunction      = nullptr;
+            mActualBufferFormatID          = angle::FormatID::R8G8B8A8_SNORM;
+            mVkBufferFormatIsPacked        = false;
+            mVertexLoadFunction            = CopyNativeVertexData<GLbyte, 4, 4, 0>;
+            mVertexLoadRequiresConversion  = false;
             break;
 
         case angle::FormatID::R8G8B8A8_SSCALED:
-            intendedGLFormat         = GL_RGBA8_SSCALED_ANGLEX;
-            actualImageFormatID      = angle::FormatID::R8G8B8A8_SSCALED;
-            imageInitializerFunction = nullptr;
+            mIntendedGLFormat              = GL_RGBA8_SSCALED_ANGLEX;
+            mActualSampleOnlyImageFormatID = angle::FormatID::R8G8B8A8_SSCALED;
+            mImageInitializerFunction      = nullptr;
             {
                 static constexpr BufferFormatInitInfo kInfo[] = {
                     {angle::FormatID::R8G8B8A8_SSCALED, false,
@@ -1956,39 +1956,39 @@
             break;
 
         case angle::FormatID::R8G8B8A8_UINT:
-            intendedGLFormat             = GL_RGBA8UI;
-            actualImageFormatID          = angle::FormatID::R8G8B8A8_UINT;
-            imageInitializerFunction     = nullptr;
-            actualBufferFormatID         = angle::FormatID::R8G8B8A8_UINT;
-            vkBufferFormatIsPacked       = false;
-            vertexLoadFunction           = CopyNativeVertexData<GLubyte, 4, 4, 0>;
-            vertexLoadRequiresConversion = false;
+            mIntendedGLFormat              = GL_RGBA8UI;
+            mActualSampleOnlyImageFormatID = angle::FormatID::R8G8B8A8_UINT;
+            mImageInitializerFunction      = nullptr;
+            mActualBufferFormatID          = angle::FormatID::R8G8B8A8_UINT;
+            mVkBufferFormatIsPacked        = false;
+            mVertexLoadFunction            = CopyNativeVertexData<GLubyte, 4, 4, 0>;
+            mVertexLoadRequiresConversion  = false;
             break;
 
         case angle::FormatID::R8G8B8A8_UNORM:
-            intendedGLFormat             = GL_RGBA8;
-            actualImageFormatID          = angle::FormatID::R8G8B8A8_UNORM;
-            imageInitializerFunction     = nullptr;
-            actualBufferFormatID         = angle::FormatID::R8G8B8A8_UNORM;
-            vkBufferFormatIsPacked       = false;
-            vertexLoadFunction           = CopyNativeVertexData<GLubyte, 4, 4, 0>;
-            vertexLoadRequiresConversion = false;
+            mIntendedGLFormat              = GL_RGBA8;
+            mActualSampleOnlyImageFormatID = angle::FormatID::R8G8B8A8_UNORM;
+            mImageInitializerFunction      = nullptr;
+            mActualBufferFormatID          = angle::FormatID::R8G8B8A8_UNORM;
+            mVkBufferFormatIsPacked        = false;
+            mVertexLoadFunction            = CopyNativeVertexData<GLubyte, 4, 4, 0>;
+            mVertexLoadRequiresConversion  = false;
             break;
 
         case angle::FormatID::R8G8B8A8_UNORM_SRGB:
-            intendedGLFormat             = GL_SRGB8_ALPHA8;
-            actualImageFormatID          = angle::FormatID::R8G8B8A8_UNORM_SRGB;
-            imageInitializerFunction     = nullptr;
-            actualBufferFormatID         = angle::FormatID::R8G8B8A8_UNORM_SRGB;
-            vkBufferFormatIsPacked       = false;
-            vertexLoadFunction           = CopyNativeVertexData<GLubyte, 4, 4, 0>;
-            vertexLoadRequiresConversion = false;
+            mIntendedGLFormat              = GL_SRGB8_ALPHA8;
+            mActualSampleOnlyImageFormatID = angle::FormatID::R8G8B8A8_UNORM_SRGB;
+            mImageInitializerFunction      = nullptr;
+            mActualBufferFormatID          = angle::FormatID::R8G8B8A8_UNORM_SRGB;
+            mVkBufferFormatIsPacked        = false;
+            mVertexLoadFunction            = CopyNativeVertexData<GLubyte, 4, 4, 0>;
+            mVertexLoadRequiresConversion  = false;
             break;
 
         case angle::FormatID::R8G8B8A8_USCALED:
-            intendedGLFormat         = GL_RGBA8_USCALED_ANGLEX;
-            actualImageFormatID      = angle::FormatID::R8G8B8A8_USCALED;
-            imageInitializerFunction = nullptr;
+            mIntendedGLFormat              = GL_RGBA8_USCALED_ANGLEX;
+            mActualSampleOnlyImageFormatID = angle::FormatID::R8G8B8A8_USCALED;
+            mImageInitializerFunction      = nullptr;
             {
                 static constexpr BufferFormatInitInfo kInfo[] = {
                     {angle::FormatID::R8G8B8A8_USCALED, false,
@@ -2000,7 +2000,7 @@
             break;
 
         case angle::FormatID::R8G8B8_SINT:
-            intendedGLFormat = GL_RGB8I;
+            mIntendedGLFormat = GL_RGB8I;
             {
                 static constexpr ImageFormatInitInfo kInfo[] = {
                     {angle::FormatID::R8G8B8_SINT, nullptr},
@@ -2019,7 +2019,7 @@
             break;
 
         case angle::FormatID::R8G8B8_SNORM:
-            intendedGLFormat = GL_RGB8_SNORM;
+            mIntendedGLFormat = GL_RGB8_SNORM;
             {
                 static constexpr ImageFormatInitInfo kInfo[] = {
                     {angle::FormatID::R8G8B8_SNORM, nullptr},
@@ -2038,9 +2038,9 @@
             break;
 
         case angle::FormatID::R8G8B8_SSCALED:
-            intendedGLFormat         = GL_RGB8_SSCALED_ANGLEX;
-            actualImageFormatID      = angle::FormatID::R8G8B8_SSCALED;
-            imageInitializerFunction = nullptr;
+            mIntendedGLFormat              = GL_RGB8_SSCALED_ANGLEX;
+            mActualSampleOnlyImageFormatID = angle::FormatID::R8G8B8_SSCALED;
+            mImageInitializerFunction      = nullptr;
             {
                 static constexpr BufferFormatInitInfo kInfo[] = {
                     {angle::FormatID::R8G8B8_SSCALED, false, CopyNativeVertexData<GLbyte, 3, 3, 0>,
@@ -2054,7 +2054,7 @@
             break;
 
         case angle::FormatID::R8G8B8_UINT:
-            intendedGLFormat = GL_RGB8UI;
+            mIntendedGLFormat = GL_RGB8UI;
             {
                 static constexpr ImageFormatInitInfo kInfo[] = {
                     {angle::FormatID::R8G8B8_UINT, nullptr},
@@ -2073,18 +2073,18 @@
             break;
 
         case angle::FormatID::R8G8B8_UNORM:
-            intendedGLFormat         = GL_RGB8;
-            actualImageFormatID      = angle::FormatID::R8G8B8A8_UNORM;
-            imageInitializerFunction = Initialize4ComponentData<GLubyte, 0x00, 0x00, 0x00, 0xFF>;
-            actualBufferFormatID     = angle::FormatID::R8G8B8A8_UNORM;
-            vkBufferFormatIsPacked   = false;
-            vertexLoadFunction =
+            mIntendedGLFormat              = GL_RGB8;
+            mActualSampleOnlyImageFormatID = angle::FormatID::R8G8B8A8_UNORM;
+            mImageInitializerFunction = Initialize4ComponentData<GLubyte, 0x00, 0x00, 0x00, 0xFF>;
+            mActualBufferFormatID     = angle::FormatID::R8G8B8A8_UNORM;
+            mVkBufferFormatIsPacked   = false;
+            mVertexLoadFunction =
                 CopyNativeVertexData<GLubyte, 3, 4, std::numeric_limits<GLubyte>::max()>;
-            vertexLoadRequiresConversion = true;
+            mVertexLoadRequiresConversion = true;
             break;
 
         case angle::FormatID::R8G8B8_UNORM_SRGB:
-            intendedGLFormat = GL_SRGB8;
+            mIntendedGLFormat = GL_SRGB8;
             {
                 static constexpr ImageFormatInitInfo kInfo[] = {
                     {angle::FormatID::R8G8B8_UNORM_SRGB, nullptr},
@@ -2092,16 +2092,16 @@
                      Initialize4ComponentData<GLubyte, 0x00, 0x00, 0x00, 0xFF>}};
                 initImageFallback(renderer, kInfo, ArraySize(kInfo));
             }
-            actualBufferFormatID         = angle::FormatID::R8G8B8_UNORM_SRGB;
-            vkBufferFormatIsPacked       = false;
-            vertexLoadFunction           = CopyNativeVertexData<GLubyte, 3, 3, 0>;
-            vertexLoadRequiresConversion = false;
+            mActualBufferFormatID         = angle::FormatID::R8G8B8_UNORM_SRGB;
+            mVkBufferFormatIsPacked       = false;
+            mVertexLoadFunction           = CopyNativeVertexData<GLubyte, 3, 3, 0>;
+            mVertexLoadRequiresConversion = false;
             break;
 
         case angle::FormatID::R8G8B8_USCALED:
-            intendedGLFormat         = GL_RGB8_USCALED_ANGLEX;
-            actualImageFormatID      = angle::FormatID::R8G8B8_USCALED;
-            imageInitializerFunction = nullptr;
+            mIntendedGLFormat              = GL_RGB8_USCALED_ANGLEX;
+            mActualSampleOnlyImageFormatID = angle::FormatID::R8G8B8_USCALED;
+            mImageInitializerFunction      = nullptr;
             {
                 static constexpr BufferFormatInitInfo kInfo[] = {
                     {angle::FormatID::R8G8B8_USCALED, false, CopyNativeVertexData<GLubyte, 3, 3, 0>,
@@ -2115,29 +2115,29 @@
             break;
 
         case angle::FormatID::R8G8_SINT:
-            intendedGLFormat             = GL_RG8I;
-            actualImageFormatID          = angle::FormatID::R8G8_SINT;
-            imageInitializerFunction     = nullptr;
-            actualBufferFormatID         = angle::FormatID::R8G8_SINT;
-            vkBufferFormatIsPacked       = false;
-            vertexLoadFunction           = CopyNativeVertexData<GLbyte, 2, 2, 0>;
-            vertexLoadRequiresConversion = false;
+            mIntendedGLFormat              = GL_RG8I;
+            mActualSampleOnlyImageFormatID = angle::FormatID::R8G8_SINT;
+            mImageInitializerFunction      = nullptr;
+            mActualBufferFormatID          = angle::FormatID::R8G8_SINT;
+            mVkBufferFormatIsPacked        = false;
+            mVertexLoadFunction            = CopyNativeVertexData<GLbyte, 2, 2, 0>;
+            mVertexLoadRequiresConversion  = false;
             break;
 
         case angle::FormatID::R8G8_SNORM:
-            intendedGLFormat             = GL_RG8_SNORM;
-            actualImageFormatID          = angle::FormatID::R8G8_SNORM;
-            imageInitializerFunction     = nullptr;
-            actualBufferFormatID         = angle::FormatID::R8G8_SNORM;
-            vkBufferFormatIsPacked       = false;
-            vertexLoadFunction           = CopyNativeVertexData<GLbyte, 2, 2, 0>;
-            vertexLoadRequiresConversion = false;
+            mIntendedGLFormat              = GL_RG8_SNORM;
+            mActualSampleOnlyImageFormatID = angle::FormatID::R8G8_SNORM;
+            mImageInitializerFunction      = nullptr;
+            mActualBufferFormatID          = angle::FormatID::R8G8_SNORM;
+            mVkBufferFormatIsPacked        = false;
+            mVertexLoadFunction            = CopyNativeVertexData<GLbyte, 2, 2, 0>;
+            mVertexLoadRequiresConversion  = false;
             break;
 
         case angle::FormatID::R8G8_SSCALED:
-            intendedGLFormat         = GL_RG8_SSCALED_ANGLEX;
-            actualImageFormatID      = angle::FormatID::R8G8_SSCALED;
-            imageInitializerFunction = nullptr;
+            mIntendedGLFormat              = GL_RG8_SSCALED_ANGLEX;
+            mActualSampleOnlyImageFormatID = angle::FormatID::R8G8_SSCALED;
+            mImageInitializerFunction      = nullptr;
             {
                 static constexpr BufferFormatInitInfo kInfo[] = {
                     {angle::FormatID::R8G8_SSCALED, false, CopyNativeVertexData<GLbyte, 2, 2, 0>,
@@ -2149,39 +2149,39 @@
             break;
 
         case angle::FormatID::R8G8_UINT:
-            intendedGLFormat             = GL_RG8UI;
-            actualImageFormatID          = angle::FormatID::R8G8_UINT;
-            imageInitializerFunction     = nullptr;
-            actualBufferFormatID         = angle::FormatID::R8G8_UINT;
-            vkBufferFormatIsPacked       = false;
-            vertexLoadFunction           = CopyNativeVertexData<GLubyte, 2, 2, 0>;
-            vertexLoadRequiresConversion = false;
+            mIntendedGLFormat              = GL_RG8UI;
+            mActualSampleOnlyImageFormatID = angle::FormatID::R8G8_UINT;
+            mImageInitializerFunction      = nullptr;
+            mActualBufferFormatID          = angle::FormatID::R8G8_UINT;
+            mVkBufferFormatIsPacked        = false;
+            mVertexLoadFunction            = CopyNativeVertexData<GLubyte, 2, 2, 0>;
+            mVertexLoadRequiresConversion  = false;
             break;
 
         case angle::FormatID::R8G8_UNORM:
-            intendedGLFormat             = GL_RG8;
-            actualImageFormatID          = angle::FormatID::R8G8_UNORM;
-            imageInitializerFunction     = nullptr;
-            actualBufferFormatID         = angle::FormatID::R8G8_UNORM;
-            vkBufferFormatIsPacked       = false;
-            vertexLoadFunction           = CopyNativeVertexData<GLubyte, 2, 2, 0>;
-            vertexLoadRequiresConversion = false;
+            mIntendedGLFormat              = GL_RG8;
+            mActualSampleOnlyImageFormatID = angle::FormatID::R8G8_UNORM;
+            mImageInitializerFunction      = nullptr;
+            mActualBufferFormatID          = angle::FormatID::R8G8_UNORM;
+            mVkBufferFormatIsPacked        = false;
+            mVertexLoadFunction            = CopyNativeVertexData<GLubyte, 2, 2, 0>;
+            mVertexLoadRequiresConversion  = false;
             break;
 
         case angle::FormatID::R8G8_UNORM_SRGB:
-            intendedGLFormat             = GL_SRG8_EXT;
-            actualImageFormatID          = angle::FormatID::R8G8_UNORM_SRGB;
-            imageInitializerFunction     = nullptr;
-            actualBufferFormatID         = angle::FormatID::R8G8_UNORM_SRGB;
-            vkBufferFormatIsPacked       = false;
-            vertexLoadFunction           = CopyNativeVertexData<GLubyte, 2, 2, 0>;
-            vertexLoadRequiresConversion = false;
+            mIntendedGLFormat              = GL_SRG8_EXT;
+            mActualSampleOnlyImageFormatID = angle::FormatID::R8G8_UNORM_SRGB;
+            mImageInitializerFunction      = nullptr;
+            mActualBufferFormatID          = angle::FormatID::R8G8_UNORM_SRGB;
+            mVkBufferFormatIsPacked        = false;
+            mVertexLoadFunction            = CopyNativeVertexData<GLubyte, 2, 2, 0>;
+            mVertexLoadRequiresConversion  = false;
             break;
 
         case angle::FormatID::R8G8_USCALED:
-            intendedGLFormat         = GL_RG8_USCALED_ANGLEX;
-            actualImageFormatID      = angle::FormatID::R8G8_USCALED;
-            imageInitializerFunction = nullptr;
+            mIntendedGLFormat              = GL_RG8_USCALED_ANGLEX;
+            mActualSampleOnlyImageFormatID = angle::FormatID::R8G8_USCALED;
+            mImageInitializerFunction      = nullptr;
             {
                 static constexpr BufferFormatInitInfo kInfo[] = {
                     {angle::FormatID::R8G8_USCALED, false, CopyNativeVertexData<GLubyte, 2, 2, 0>,
@@ -2193,29 +2193,29 @@
             break;
 
         case angle::FormatID::R8_SINT:
-            intendedGLFormat             = GL_R8I;
-            actualImageFormatID          = angle::FormatID::R8_SINT;
-            imageInitializerFunction     = nullptr;
-            actualBufferFormatID         = angle::FormatID::R8_SINT;
-            vkBufferFormatIsPacked       = false;
-            vertexLoadFunction           = CopyNativeVertexData<GLbyte, 1, 1, 0>;
-            vertexLoadRequiresConversion = false;
+            mIntendedGLFormat              = GL_R8I;
+            mActualSampleOnlyImageFormatID = angle::FormatID::R8_SINT;
+            mImageInitializerFunction      = nullptr;
+            mActualBufferFormatID          = angle::FormatID::R8_SINT;
+            mVkBufferFormatIsPacked        = false;
+            mVertexLoadFunction            = CopyNativeVertexData<GLbyte, 1, 1, 0>;
+            mVertexLoadRequiresConversion  = false;
             break;
 
         case angle::FormatID::R8_SNORM:
-            intendedGLFormat             = GL_R8_SNORM;
-            actualImageFormatID          = angle::FormatID::R8_SNORM;
-            imageInitializerFunction     = nullptr;
-            actualBufferFormatID         = angle::FormatID::R8_SNORM;
-            vkBufferFormatIsPacked       = false;
-            vertexLoadFunction           = CopyNativeVertexData<GLbyte, 1, 1, 0>;
-            vertexLoadRequiresConversion = false;
+            mIntendedGLFormat              = GL_R8_SNORM;
+            mActualSampleOnlyImageFormatID = angle::FormatID::R8_SNORM;
+            mImageInitializerFunction      = nullptr;
+            mActualBufferFormatID          = angle::FormatID::R8_SNORM;
+            mVkBufferFormatIsPacked        = false;
+            mVertexLoadFunction            = CopyNativeVertexData<GLbyte, 1, 1, 0>;
+            mVertexLoadRequiresConversion  = false;
             break;
 
         case angle::FormatID::R8_SSCALED:
-            intendedGLFormat         = GL_R8_SSCALED_ANGLEX;
-            actualImageFormatID      = angle::FormatID::R8_SSCALED;
-            imageInitializerFunction = nullptr;
+            mIntendedGLFormat              = GL_R8_SSCALED_ANGLEX;
+            mActualSampleOnlyImageFormatID = angle::FormatID::R8_SSCALED;
+            mImageInitializerFunction      = nullptr;
             {
                 static constexpr BufferFormatInitInfo kInfo[] = {
                     {angle::FormatID::R8_SSCALED, false, CopyNativeVertexData<GLbyte, 1, 1, 0>,
@@ -2227,39 +2227,39 @@
             break;
 
         case angle::FormatID::R8_UINT:
-            intendedGLFormat             = GL_R8UI;
-            actualImageFormatID          = angle::FormatID::R8_UINT;
-            imageInitializerFunction     = nullptr;
-            actualBufferFormatID         = angle::FormatID::R8_UINT;
-            vkBufferFormatIsPacked       = false;
-            vertexLoadFunction           = CopyNativeVertexData<GLubyte, 1, 1, 0>;
-            vertexLoadRequiresConversion = false;
+            mIntendedGLFormat              = GL_R8UI;
+            mActualSampleOnlyImageFormatID = angle::FormatID::R8_UINT;
+            mImageInitializerFunction      = nullptr;
+            mActualBufferFormatID          = angle::FormatID::R8_UINT;
+            mVkBufferFormatIsPacked        = false;
+            mVertexLoadFunction            = CopyNativeVertexData<GLubyte, 1, 1, 0>;
+            mVertexLoadRequiresConversion  = false;
             break;
 
         case angle::FormatID::R8_UNORM:
-            intendedGLFormat             = GL_R8;
-            actualImageFormatID          = angle::FormatID::R8_UNORM;
-            imageInitializerFunction     = nullptr;
-            actualBufferFormatID         = angle::FormatID::R8_UNORM;
-            vkBufferFormatIsPacked       = false;
-            vertexLoadFunction           = CopyNativeVertexData<GLubyte, 1, 1, 0>;
-            vertexLoadRequiresConversion = false;
+            mIntendedGLFormat              = GL_R8;
+            mActualSampleOnlyImageFormatID = angle::FormatID::R8_UNORM;
+            mImageInitializerFunction      = nullptr;
+            mActualBufferFormatID          = angle::FormatID::R8_UNORM;
+            mVkBufferFormatIsPacked        = false;
+            mVertexLoadFunction            = CopyNativeVertexData<GLubyte, 1, 1, 0>;
+            mVertexLoadRequiresConversion  = false;
             break;
 
         case angle::FormatID::R8_UNORM_SRGB:
-            intendedGLFormat             = GL_SR8_EXT;
-            actualImageFormatID          = angle::FormatID::R8_UNORM_SRGB;
-            imageInitializerFunction     = nullptr;
-            actualBufferFormatID         = angle::FormatID::R8_UNORM_SRGB;
-            vkBufferFormatIsPacked       = false;
-            vertexLoadFunction           = CopyNativeVertexData<GLubyte, 1, 1, 0>;
-            vertexLoadRequiresConversion = false;
+            mIntendedGLFormat              = GL_SR8_EXT;
+            mActualSampleOnlyImageFormatID = angle::FormatID::R8_UNORM_SRGB;
+            mImageInitializerFunction      = nullptr;
+            mActualBufferFormatID          = angle::FormatID::R8_UNORM_SRGB;
+            mVkBufferFormatIsPacked        = false;
+            mVertexLoadFunction            = CopyNativeVertexData<GLubyte, 1, 1, 0>;
+            mVertexLoadRequiresConversion  = false;
             break;
 
         case angle::FormatID::R8_USCALED:
-            intendedGLFormat         = GL_R8_USCALED_ANGLEX;
-            actualImageFormatID      = angle::FormatID::R8_USCALED;
-            imageInitializerFunction = nullptr;
+            mIntendedGLFormat              = GL_R8_USCALED_ANGLEX;
+            mActualSampleOnlyImageFormatID = angle::FormatID::R8_USCALED;
+            mImageInitializerFunction      = nullptr;
             {
                 static constexpr BufferFormatInitInfo kInfo[] = {
                     {angle::FormatID::R8_USCALED, false, CopyNativeVertexData<GLubyte, 1, 1, 0>,
@@ -2271,17 +2271,17 @@
             break;
 
         case angle::FormatID::R9G9B9E5_SHAREDEXP:
-            intendedGLFormat             = GL_RGB9_E5;
-            actualImageFormatID          = angle::FormatID::R9G9B9E5_SHAREDEXP;
-            imageInitializerFunction     = nullptr;
-            actualBufferFormatID         = angle::FormatID::R9G9B9E5_SHAREDEXP;
-            vkBufferFormatIsPacked       = true;
-            vertexLoadFunction           = CopyNativeVertexData<GLuint, 1, 1, 0>;
-            vertexLoadRequiresConversion = false;
+            mIntendedGLFormat              = GL_RGB9_E5;
+            mActualSampleOnlyImageFormatID = angle::FormatID::R9G9B9E5_SHAREDEXP;
+            mImageInitializerFunction      = nullptr;
+            mActualBufferFormatID          = angle::FormatID::R9G9B9E5_SHAREDEXP;
+            mVkBufferFormatIsPacked        = true;
+            mVertexLoadFunction            = CopyNativeVertexData<GLuint, 1, 1, 0>;
+            mVertexLoadRequiresConversion  = false;
             break;
 
         case angle::FormatID::S8_UINT:
-            intendedGLFormat = GL_STENCIL_INDEX8;
+            mIntendedGLFormat = GL_STENCIL_INDEX8;
             {
                 static constexpr ImageFormatInitInfo kInfo[] = {
                     {angle::FormatID::S8_UINT, nullptr},
@@ -2290,70 +2290,70 @@
                     {angle::FormatID::S8_UINT, nullptr}};
                 initImageFallback(renderer, kInfo, ArraySize(kInfo));
             }
-            actualBufferFormatID         = angle::FormatID::S8_UINT;
-            vkBufferFormatIsPacked       = false;
-            vertexLoadFunction           = nullptr;
-            vertexLoadRequiresConversion = false;
+            mActualBufferFormatID         = angle::FormatID::S8_UINT;
+            mVkBufferFormatIsPacked       = false;
+            mVertexLoadFunction           = nullptr;
+            mVertexLoadRequiresConversion = false;
             break;
 
         case angle::FormatID::X2R10G10B10_SINT_VERTEX:
-            intendedGLFormat             = GL_X2_RGB10_SINT_ANGLEX;
-            actualImageFormatID          = angle::FormatID::NONE;
-            imageInitializerFunction     = nullptr;
-            actualBufferFormatID         = angle::FormatID::R16G16B16A16_FLOAT;
-            vkBufferFormatIsPacked       = false;
-            vertexLoadFunction           = CopyXYZ10ToXYZWFloatVertexData<true, false, true>;
-            vertexLoadRequiresConversion = true;
+            mIntendedGLFormat              = GL_X2_RGB10_SINT_ANGLEX;
+            mActualSampleOnlyImageFormatID = angle::FormatID::NONE;
+            mImageInitializerFunction      = nullptr;
+            mActualBufferFormatID          = angle::FormatID::R16G16B16A16_FLOAT;
+            mVkBufferFormatIsPacked        = false;
+            mVertexLoadFunction            = CopyXYZ10ToXYZWFloatVertexData<true, false, true>;
+            mVertexLoadRequiresConversion  = true;
             break;
 
         case angle::FormatID::X2R10G10B10_SNORM_VERTEX:
-            intendedGLFormat             = GL_X2_RGB10_SNORM_ANGLEX;
-            actualImageFormatID          = angle::FormatID::NONE;
-            imageInitializerFunction     = nullptr;
-            actualBufferFormatID         = angle::FormatID::R16G16B16A16_FLOAT;
-            vkBufferFormatIsPacked       = false;
-            vertexLoadFunction           = CopyXYZ10ToXYZWFloatVertexData<true, true, true>;
-            vertexLoadRequiresConversion = true;
+            mIntendedGLFormat              = GL_X2_RGB10_SNORM_ANGLEX;
+            mActualSampleOnlyImageFormatID = angle::FormatID::NONE;
+            mImageInitializerFunction      = nullptr;
+            mActualBufferFormatID          = angle::FormatID::R16G16B16A16_FLOAT;
+            mVkBufferFormatIsPacked        = false;
+            mVertexLoadFunction            = CopyXYZ10ToXYZWFloatVertexData<true, true, true>;
+            mVertexLoadRequiresConversion  = true;
             break;
 
         case angle::FormatID::X2R10G10B10_SSCALED_VERTEX:
-            intendedGLFormat             = GL_X2_RGB10_SSCALED_ANGLEX;
-            actualImageFormatID          = angle::FormatID::NONE;
-            imageInitializerFunction     = nullptr;
-            actualBufferFormatID         = angle::FormatID::R16G16B16A16_FLOAT;
-            vkBufferFormatIsPacked       = false;
-            vertexLoadFunction           = CopyXYZ10ToXYZWFloatVertexData<true, false, true>;
-            vertexLoadRequiresConversion = true;
+            mIntendedGLFormat              = GL_X2_RGB10_SSCALED_ANGLEX;
+            mActualSampleOnlyImageFormatID = angle::FormatID::NONE;
+            mImageInitializerFunction      = nullptr;
+            mActualBufferFormatID          = angle::FormatID::R16G16B16A16_FLOAT;
+            mVkBufferFormatIsPacked        = false;
+            mVertexLoadFunction            = CopyXYZ10ToXYZWFloatVertexData<true, false, true>;
+            mVertexLoadRequiresConversion  = true;
             break;
 
         case angle::FormatID::X2R10G10B10_UINT_VERTEX:
-            intendedGLFormat             = GL_X2_RGB10_UINT_ANGLEX;
-            actualImageFormatID          = angle::FormatID::NONE;
-            imageInitializerFunction     = nullptr;
-            actualBufferFormatID         = angle::FormatID::R16G16B16A16_FLOAT;
-            vkBufferFormatIsPacked       = false;
-            vertexLoadFunction           = CopyXYZ10ToXYZWFloatVertexData<false, false, true>;
-            vertexLoadRequiresConversion = true;
+            mIntendedGLFormat              = GL_X2_RGB10_UINT_ANGLEX;
+            mActualSampleOnlyImageFormatID = angle::FormatID::NONE;
+            mImageInitializerFunction      = nullptr;
+            mActualBufferFormatID          = angle::FormatID::R16G16B16A16_FLOAT;
+            mVkBufferFormatIsPacked        = false;
+            mVertexLoadFunction            = CopyXYZ10ToXYZWFloatVertexData<false, false, true>;
+            mVertexLoadRequiresConversion  = true;
             break;
 
         case angle::FormatID::X2R10G10B10_UNORM_VERTEX:
-            intendedGLFormat             = GL_X2_RGB10_UNORM_ANGLEX;
-            actualImageFormatID          = angle::FormatID::NONE;
-            imageInitializerFunction     = nullptr;
-            actualBufferFormatID         = angle::FormatID::R16G16B16A16_FLOAT;
-            vkBufferFormatIsPacked       = false;
-            vertexLoadFunction           = CopyXYZ10ToXYZWFloatVertexData<false, true, true>;
-            vertexLoadRequiresConversion = true;
+            mIntendedGLFormat              = GL_X2_RGB10_UNORM_ANGLEX;
+            mActualSampleOnlyImageFormatID = angle::FormatID::NONE;
+            mImageInitializerFunction      = nullptr;
+            mActualBufferFormatID          = angle::FormatID::R16G16B16A16_FLOAT;
+            mVkBufferFormatIsPacked        = false;
+            mVertexLoadFunction            = CopyXYZ10ToXYZWFloatVertexData<false, true, true>;
+            mVertexLoadRequiresConversion  = true;
             break;
 
         case angle::FormatID::X2R10G10B10_USCALED_VERTEX:
-            intendedGLFormat             = GL_X2_RGB10_USCALED_ANGLEX;
-            actualImageFormatID          = angle::FormatID::NONE;
-            imageInitializerFunction     = nullptr;
-            actualBufferFormatID         = angle::FormatID::R16G16B16A16_FLOAT;
-            vkBufferFormatIsPacked       = false;
-            vertexLoadFunction           = CopyXYZ10ToXYZWFloatVertexData<false, false, true>;
-            vertexLoadRequiresConversion = true;
+            mIntendedGLFormat              = GL_X2_RGB10_USCALED_ANGLEX;
+            mActualSampleOnlyImageFormatID = angle::FormatID::NONE;
+            mImageInitializerFunction      = nullptr;
+            mActualBufferFormatID          = angle::FormatID::R16G16B16A16_FLOAT;
+            mVkBufferFormatIsPacked        = false;
+            mVertexLoadFunction            = CopyXYZ10ToXYZWFloatVertexData<false, false, true>;
+            mVertexLoadRequiresConversion  = true;
             break;
 
         default:
diff --git a/src/libANGLE/renderer/vulkan/vk_format_utils.cpp b/src/libANGLE/renderer/vulkan/vk_format_utils.cpp
index 04c50d3..4d8be4a 100644
--- a/src/libANGLE/renderer/vulkan/vk_format_utils.cpp
+++ b/src/libANGLE/renderer/vulkan/vk_format_utils.cpp
@@ -121,26 +121,28 @@
 {
 // Format implementation.
 Format::Format()
-    : intendedFormatID(angle::FormatID::NONE),
-      intendedGLFormat(GL_NONE),
-      actualImageFormatID(angle::FormatID::NONE),
-      actualBufferFormatID(angle::FormatID::NONE),
-      actualCompressedBufferFormatID(angle::FormatID::NONE),
-      imageInitializerFunction(nullptr),
-      textureLoadFunctions(),
-      vertexLoadFunction(nullptr),
-      compressedVertexLoadFunction(nullptr),
-      vertexLoadRequiresConversion(false),
-      compressedVertexLoadRequiresConversion(false),
-      vkBufferFormatIsPacked(false),
-      vkFormatIsInt(false),
-      vkFormatIsUnsigned(false)
+    : mIntendedFormatID(angle::FormatID::NONE),
+      mIntendedGLFormat(GL_NONE),
+      mActualSampleOnlyImageFormatID(angle::FormatID::NONE),
+      mActualRenderableImageFormatID(angle::FormatID::NONE),
+      mActualBufferFormatID(angle::FormatID::NONE),
+      mActualCompressedBufferFormatID(angle::FormatID::NONE),
+      mImageInitializerFunction(nullptr),
+      mTextureLoadFunctions(),
+      mRenderableTextureLoadFunctions(),
+      mVertexLoadFunction(nullptr),
+      mCompressedVertexLoadFunction(nullptr),
+      mVertexLoadRequiresConversion(false),
+      mCompressedVertexLoadRequiresConversion(false),
+      mVkBufferFormatIsPacked(false),
+      mVkFormatIsInt(false),
+      mVkFormatIsUnsigned(false)
 {}
 
 void Format::initImageFallback(RendererVk *renderer, const ImageFormatInitInfo *info, int numInfo)
 {
     size_t skip                 = renderer->getFeatures().forceFallbackFormat.enabled ? 1 : 0;
-    SupportTest testFunction    = HasFullTextureFormatSupport;
+    SupportTest testFunction    = HasNonRenderableTextureFormatSupport;
     const angle::Format &format = angle::Format::Get(info[0].format);
     if (format.isInt() || (format.isFloat() && format.redBits >= 32))
     {
@@ -150,17 +152,22 @@
         // enabled automatically by examining format capabilities.
         testFunction = HasNonFilterableTextureFormatSupport;
     }
-    if (format.isSnorm() || format.isBlock)
+
+    int i = FindSupportedFormat(renderer, info, skip, static_cast<uint32_t>(numInfo), testFunction);
+    mActualSampleOnlyImageFormatID = info[i].format;
+    mImageInitializerFunction      = info[i].initializer;
+
+    // Set renderable format.
+    if (testFunction != HasNonFilterableTextureFormatSupport && !format.isSnorm() &&
+        !format.isBlock)
     {
         // Rendering to SNORM textures is not supported on Android, and it's
         // enabled by the extension EXT_render_snorm.
         // Compressed textures also need to perform this check.
-        testFunction = HasNonRenderableTextureFormatSupport;
+        testFunction = HasFullTextureFormatSupport;
+        i = FindSupportedFormat(renderer, info, skip, static_cast<uint32_t>(numInfo), testFunction);
+        mActualRenderableImageFormatID = info[i].format;
     }
-    int i = FindSupportedFormat(renderer, info, skip, static_cast<uint32_t>(numInfo), testFunction);
-
-    actualImageFormatID      = info[i].format;
-    imageInitializerFunction = info[i].initializer;
 }
 
 void Format::initBufferFallback(RendererVk *renderer,
@@ -173,10 +180,10 @@
         int i       = FindSupportedFormat(renderer, info, skip, compressedStartIndex,
                                     HasFullBufferFormatSupport);
 
-        actualBufferFormatID         = info[i].format;
-        vkBufferFormatIsPacked       = info[i].vkFormatIsPacked;
-        vertexLoadFunction           = info[i].vertexLoadFunction;
-        vertexLoadRequiresConversion = info[i].vertexLoadRequiresConversion;
+        mActualBufferFormatID         = info[i].format;
+        mVkBufferFormatIsPacked       = info[i].vkFormatIsPacked;
+        mVertexLoadFunction           = info[i].vertexLoadFunction;
+        mVertexLoadRequiresConversion = info[i].vertexLoadRequiresConversion;
     }
 
     if (renderer->getFeatures().compressVertexData.enabled && compressedStartIndex < numInfo)
@@ -184,61 +191,33 @@
         int i = FindSupportedFormat(renderer, info, compressedStartIndex, numInfo,
                                     HasFullBufferFormatSupport);
 
-        actualCompressedBufferFormatID         = info[i].format;
-        vkCompressedBufferFormatIsPacked       = info[i].vkFormatIsPacked;
-        compressedVertexLoadFunction           = info[i].vertexLoadFunction;
-        compressedVertexLoadRequiresConversion = info[i].vertexLoadRequiresConversion;
+        mActualCompressedBufferFormatID         = info[i].format;
+        mVkCompressedBufferFormatIsPacked       = info[i].vkFormatIsPacked;
+        mCompressedVertexLoadFunction           = info[i].vertexLoadFunction;
+        mCompressedVertexLoadRequiresConversion = info[i].vertexLoadRequiresConversion;
     }
 }
 
-size_t Format::getImageCopyBufferAlignment() const
+size_t Format::getVertexInputAlignment(bool compressed) const
 {
-    // vkCmdCopyBufferToImage must have an offset that is a multiple of 4 as well as a multiple
-    // of the texel size (if uncompressed) or pixel block size (if compressed).
-    // https://www.khronos.org/registry/vulkan/specs/1.0/man/html/VkBufferImageCopy.html
-    //
-    // We need lcm(4, texelSize) (lcm = least common multiplier).  For compressed images,
-    // |texelSize| would contain the block size.  Since 4 is constant, this can be calculated as:
-    //
-    //                      | texelSize             texelSize % 4 == 0
-    //                      | 4 * texelSize         texelSize % 4 == 1
-    // lcm(4, texelSize) = <
-    //                      | 2 * texelSize         texelSize % 4 == 2
-    //                      | 4 * texelSize         texelSize % 4 == 3
-    //
-    // This means:
-    //
-    // - texelSize % 2 != 0 gives a 4x multiplier
-    // - else texelSize % 4 != 0 gives a 2x multiplier
-    // - else there's no multiplier.
-    //
-    const angle::Format &format = actualImageFormat();
-
-    ASSERT(format.pixelBytes != 0);
-    const size_t texelSize  = format.pixelBytes;
-    const size_t multiplier = texelSize % 2 != 0 ? 4 : texelSize % 4 != 0 ? 2 : 1;
-    const size_t alignment  = multiplier * texelSize;
-
-    return alignment;
+    const angle::Format &bufferFormat = getActualBufferFormat(compressed);
+    size_t pixelBytes                 = bufferFormat.pixelBytes;
+    return mVkBufferFormatIsPacked ? pixelBytes : (pixelBytes / bufferFormat.channelCount);
 }
 
-size_t Format::getValidImageCopyBufferAlignment() const
+bool HasEmulatedImageChannels(const angle::Format &intendedFormat,
+                              const angle::Format &actualFormat)
 {
-    constexpr size_t kMinimumAlignment = 16;
-    return (intendedFormatID == angle::FormatID::NONE) ? kMinimumAlignment
-                                                       : getImageCopyBufferAlignment();
+    return (intendedFormat.alphaBits == 0 && actualFormat.alphaBits > 0) ||
+           (intendedFormat.blueBits == 0 && actualFormat.blueBits > 0) ||
+           (intendedFormat.greenBits == 0 && actualFormat.greenBits > 0) ||
+           (intendedFormat.depthBits == 0 && actualFormat.depthBits > 0) ||
+           (intendedFormat.stencilBits == 0 && actualFormat.stencilBits > 0);
 }
 
-bool Format::hasEmulatedImageChannels() const
+bool HasEmulatedImageFormat(angle::FormatID intendedFormatID, angle::FormatID actualFormatID)
 {
-    const angle::Format &angleFmt   = intendedFormat();
-    const angle::Format &textureFmt = actualImageFormat();
-
-    return (angleFmt.alphaBits == 0 && textureFmt.alphaBits > 0) ||
-           (angleFmt.blueBits == 0 && textureFmt.blueBits > 0) ||
-           (angleFmt.greenBits == 0 && textureFmt.greenBits > 0) ||
-           (angleFmt.depthBits == 0 && textureFmt.depthBits > 0) ||
-           (angleFmt.stencilBits == 0 && textureFmt.stencilBits > 0);
+    return actualFormatID != intendedFormatID;
 }
 
 bool operator==(const Format &lhs, const Format &rhs)
@@ -262,12 +241,20 @@
 {
     for (size_t formatIndex = 0; formatIndex < angle::kNumANGLEFormats; ++formatIndex)
     {
-        Format &format                   = mFormatData[formatIndex];
-        const auto formatID              = static_cast<angle::FormatID>(formatIndex);
-        const angle::Format &angleFormat = angle::Format::Get(formatID);
+        Format &format                           = mFormatData[formatIndex];
+        const auto intendedFormatID              = static_cast<angle::FormatID>(formatIndex);
+        const angle::Format &intendedAngleFormat = angle::Format::Get(intendedFormatID);
 
-        format.initialize(renderer, angleFormat);
-        format.intendedFormatID = formatID;
+        format.initialize(renderer, intendedAngleFormat);
+        format.mIntendedFormatID = intendedFormatID;
+
+        if (format.mActualRenderableImageFormatID == angle::FormatID::NONE)
+        {
+            // If renderable format was not set, it means there is no fallback format for
+            // renderable. We populate this the same formatID as sampleOnly formatID so that
+            // getActualFormatID() will be simpler.
+            format.mActualRenderableImageFormatID = format.mActualSampleOnlyImageFormatID;
+        }
 
         if (!format.valid())
         {
@@ -275,24 +262,79 @@
         }
 
         gl::TextureCaps textureCaps;
-        FillTextureFormatCaps(renderer, format.actualImageFormatID, &textureCaps);
-        outTextureCapsMap->set(formatID, textureCaps);
+        FillTextureFormatCaps(renderer, format.mActualSampleOnlyImageFormatID, &textureCaps);
 
         if (textureCaps.texturable)
         {
-            format.textureLoadFunctions =
-                GetLoadFunctionsMap(format.intendedGLFormat, format.actualImageFormatID);
-            format.textureBorderLoadFunctions = GetLoadTextureBorderFunctionsMap(
-                format.intendedGLFormat, format.actualImageFormatID);
+            format.mTextureLoadFunctions = GetLoadFunctionsMap(
+                format.mIntendedGLFormat, format.mActualSampleOnlyImageFormatID);
+            format.mTextureBorderLoadFunctions = GetLoadTextureBorderFunctionsMap(
+                format.mIntendedGLFormat, format.mActualSampleOnlyImageFormatID);
         }
 
-        if (angleFormat.isBlock)
+        if (format.mActualRenderableImageFormatID == format.mActualSampleOnlyImageFormatID)
         {
-            outCompressedTextureFormats->push_back(format.intendedGLFormat);
+            outTextureCapsMap->set(intendedFormatID, textureCaps);
+            format.mRenderableTextureLoadFunctions = format.mTextureLoadFunctions;
+        }
+        else
+        {
+            FillTextureFormatCaps(renderer, format.mActualRenderableImageFormatID, &textureCaps);
+            outTextureCapsMap->set(intendedFormatID, textureCaps);
+            if (textureCaps.texturable)
+            {
+                format.mRenderableTextureLoadFunctions = GetLoadFunctionsMap(
+                    format.mIntendedGLFormat, format.mActualRenderableImageFormatID);
+            }
+        }
+
+        if (intendedAngleFormat.isBlock)
+        {
+            outCompressedTextureFormats->push_back(format.mIntendedGLFormat);
         }
     }
 }
 
+size_t GetImageCopyBufferAlignment(angle::FormatID actualFormatID)
+{
+    // vkCmdCopyBufferToImage must have an offset that is a multiple of 4 as well as a multiple
+    // of the texel size (if uncompressed) or pixel block size (if compressed).
+    // https://www.khronos.org/registry/vulkan/specs/1.0/man/html/VkBufferImageCopy.html
+    //
+    // We need lcm(4, texelSize) (lcm = least common multiplier).  For compressed images,
+    // |texelSize| would contain the block size.  Since 4 is constant, this can be calculated as:
+    //
+    //                      | texelSize             texelSize % 4 == 0
+    //                      | 4 * texelSize         texelSize % 4 == 1
+    // lcm(4, texelSize) = <
+    //                      | 2 * texelSize         texelSize % 4 == 2
+    //                      | 4 * texelSize         texelSize % 4 == 3
+    //
+    // This means:
+    //
+    // - texelSize % 2 != 0 gives a 4x multiplier
+    // - else texelSize % 4 != 0 gives a 2x multiplier
+    // - else there's no multiplier.
+    //
+    const angle::Format &actualFormat = angle::Format::Get(actualFormatID);
+
+    ASSERT(actualFormat.pixelBytes != 0);
+    const size_t texelSize  = actualFormat.pixelBytes;
+    const size_t multiplier = texelSize % 2 != 0 ? 4 : texelSize % 4 != 0 ? 2 : 1;
+    const size_t alignment  = multiplier * texelSize;
+
+    return alignment;
+}
+
+size_t GetValidImageCopyBufferAlignment(angle::FormatID intendedFormatID,
+                                        angle::FormatID actualFormatID)
+{
+    constexpr size_t kMinimumAlignment = 16;
+    return (intendedFormatID == angle::FormatID::NONE)
+               ? kMinimumAlignment
+               : GetImageCopyBufferAlignment(actualFormatID);
+}
+
 VkImageUsageFlags GetMaximalImageUsageFlags(RendererVk *renderer, angle::FormatID formatID)
 {
     constexpr VkFormatFeatureFlags kImageUsageFeatureBits =
@@ -355,13 +397,6 @@
            renderer->hasImageFormatFeatureBits(formatID, kBitsDepth);
 }
 
-size_t GetVertexInputAlignment(const vk::Format &format, bool compressed)
-{
-    const angle::Format &bufferFormat = format.actualBufferFormat(compressed);
-    size_t pixelBytes                 = bufferFormat.pixelBytes;
-    return format.vkBufferFormatIsPacked ? pixelBytes : (pixelBytes / bufferFormat.channelCount);
-}
-
 GLenum GetSwizzleStateComponent(const gl::SwizzleState &swizzleState, GLenum component)
 {
     switch (component)
@@ -393,11 +428,9 @@
 }
 
 gl::SwizzleState GetFormatSwizzle(const ContextVk *contextVk,
-                                  const vk::Format &format,
+                                  const angle::Format &angleFormat,
                                   const bool sized)
 {
-    const angle::Format &angleFormat = format.intendedFormat();
-
     gl::SwizzleState internalSwizzle;
 
     if (angleFormat.isLUMA())
diff --git a/src/libANGLE/renderer/vulkan/vk_format_utils.h b/src/libANGLE/renderer/vulkan/vk_format_utils.h
index f2dfb96..23182a3 100644
--- a/src/libANGLE/renderer/vulkan/vk_format_utils.h
+++ b/src/libANGLE/renderer/vulkan/vk_format_utils.h
@@ -34,6 +34,12 @@
 // VkFormat values in range [0, kNumVkFormats) are used as indices in various tables.
 constexpr uint32_t kNumVkFormats = 185;
 
+enum ImageAccess
+{
+    SampleOnly,
+    Renderable,
+};
+
 struct ImageFormatInitInfo final
 {
     angle::FormatID format;
@@ -48,75 +54,126 @@
     bool vertexLoadRequiresConversion;
 };
 
-VkFormat GetVkFormatFromFormatID(angle::FormatID formatID);
+VkFormat GetVkFormatFromFormatID(angle::FormatID actualFormatID);
 angle::FormatID GetFormatIDFromVkFormat(VkFormat vkFormat);
 
+// Returns buffer alignment for image-copy operations (to or from a buffer).
+size_t GetImageCopyBufferAlignment(angle::FormatID actualFormatID);
+size_t GetValidImageCopyBufferAlignment(angle::FormatID intendedFormatID,
+                                        angle::FormatID actualFormatID);
+bool HasEmulatedImageChannels(const angle::Format &intendedFormat,
+                              const angle::Format &actualFormat);
+// Returns true if the image has a different image format than intended.
+bool HasEmulatedImageFormat(angle::FormatID intendedFormatID, angle::FormatID actualFormatID);
+
 // Describes a Vulkan format. For more information on formats in the Vulkan back-end please see
-// https://chromium.googlesource.com/angle/angle/+/master/src/libANGLE/renderer/vulkan/doc/FormatTablesAndEmulation.md
-struct Format final : private angle::NonCopyable
+// https://chromium.googlesource.com/angle/angle/+/main/src/libANGLE/renderer/vulkan/doc/FormatTablesAndEmulation.md
+class Format final : private angle::NonCopyable
 {
+  public:
     Format();
 
-    bool valid() const { return intendedGLFormat != 0; }
+    bool valid() const { return mIntendedGLFormat != 0; }
 
     // The intended format is the front-end format. For Textures this usually correponds to a
     // GLenum in the headers. Buffer formats don't always have a corresponding GLenum type.
     // Some Surface formats and unsized types also don't have a corresponding GLenum.
-    const angle::Format &intendedFormat() const { return angle::Format::Get(intendedFormatID); }
+    angle::FormatID getIntendedFormatID() const { return mIntendedFormatID; }
+    const angle::Format &getIntendedFormat() const { return angle::Format::Get(mIntendedFormatID); }
 
     // The actual Image format is used to implement the front-end format for Texture/Renderbuffers.
-    const angle::Format &actualImageFormat() const
+    const angle::Format &getActualImageFormat(ImageAccess access) const
     {
-        return angle::Format::Get(actualImageFormatID);
+        return angle::Format::Get(getActualImageFormatID(access));
     }
 
-    VkFormat actualImageVkFormat() const { return GetVkFormatFromFormatID(actualImageFormatID); }
+    angle::FormatID getActualRenderableImageFormatID() const
+    {
+        return mActualRenderableImageFormatID;
+    }
+    const angle::Format &getActualRenderableImageFormat() const
+    {
+        return angle::Format::Get(mActualRenderableImageFormatID);
+    }
+    VkFormat getActualRenderableImageVkFormat() const
+    {
+        return GetVkFormatFromFormatID(mActualRenderableImageFormatID);
+    }
 
+    angle::FormatID getActualImageFormatID(ImageAccess access) const
+    {
+        return ImageAccess::Renderable == access ? mActualRenderableImageFormatID
+                                                 : mActualSampleOnlyImageFormatID;
+    }
+    VkFormat getActualImageVkFormat(ImageAccess access) const
+    {
+        return GetVkFormatFromFormatID(getActualImageFormatID(access));
+    }
+
+    LoadImageFunctionInfo getTextureLoadFunction(ImageAccess access, GLenum type) const
+    {
+        return ImageAccess::Renderable == access ? mRenderableTextureLoadFunctions(type)
+                                                 : mTextureLoadFunctions(type);
+    }
+
+    LoadTextureBorderFunctionInfo getTextureBorderLoadFunctions() const
+    {
+        return mTextureBorderLoadFunctions();
+    }
     // The actual Buffer format is used to implement the front-end format for Buffers.  This format
     // is used by vertex buffers as well as texture buffers.  Note that all formats required for
     // GL_EXT_texture_buffer have mandatory support for vertex buffers in Vulkan, so they won't be
     // using an emulated format.
-    const angle::Format &actualBufferFormat(bool compressed) const
+    const angle::Format &getActualBufferFormat(bool compressed) const
     {
-        return angle::Format::Get(compressed ? actualCompressedBufferFormatID
-                                             : actualBufferFormatID);
+        return angle::Format::Get(compressed ? mActualCompressedBufferFormatID
+                                             : mActualBufferFormatID);
     }
 
-    VkFormat actualBufferVkFormat(bool compressed) const
+    VkFormat getActualBufferVkFormat(bool compressed) const
     {
-        return GetVkFormatFromFormatID(compressed ? actualCompressedBufferFormatID
-                                                  : actualBufferFormatID);
+        return GetVkFormatFromFormatID(compressed ? mActualCompressedBufferFormatID
+                                                  : mActualBufferFormatID);
     }
 
     VertexCopyFunction getVertexLoadFunction(bool compressed) const
     {
-        return compressed ? compressedVertexLoadFunction : vertexLoadFunction;
+        return compressed ? mCompressedVertexLoadFunction : mVertexLoadFunction;
     }
 
     bool getVertexLoadRequiresConversion(bool compressed) const
     {
-        return compressed ? compressedVertexLoadRequiresConversion : vertexLoadRequiresConversion;
+        return compressed ? mCompressedVertexLoadRequiresConversion : mVertexLoadRequiresConversion;
     }
 
     // |intendedGLFormat| always correponds to a valid GLenum type. For types that don't have a
     // corresponding GLenum we do our best to specify a GLenum that is "close".
     const gl::InternalFormat &getInternalFormatInfo(GLenum type) const
     {
-        return gl::GetInternalFormatInfo(intendedGLFormat, type);
+        return gl::GetInternalFormatInfo(mIntendedGLFormat, type);
     }
 
-    // Returns buffer alignment for image-copy operations (to or from a buffer).
-    size_t getImageCopyBufferAlignment() const;
-    size_t getValidImageCopyBufferAlignment() const;
+    bool hasRenderableImageFallbackFormat() const
+    {
+        return mActualSampleOnlyImageFormatID != mActualRenderableImageFormatID;
+    }
 
-    // Returns true if the image format has more channels than the ANGLE format.
-    bool hasEmulatedImageChannels() const;
+    bool canCompressBufferData() const
+    {
+        return mActualCompressedBufferFormatID != angle::FormatID::NONE &&
+               mActualBufferFormatID != mActualCompressedBufferFormatID;
+    }
 
-    // Returns true if the image has a different image format than intended.
-    bool hasEmulatedImageFormat() const { return actualImageFormatID != intendedFormatID; }
+    // Returns the alignment for a buffer to be used with the vertex input stage in Vulkan. This
+    // calculation is listed in the Vulkan spec at the end of the section 'Vertex Input
+    // Description'.
+    size_t getVertexInputAlignment(bool compressed) const;
+
+  private:
+    friend class FormatTable;
 
     // This is an auto-generated method in vk_format_table_autogen.cpp.
-    void initialize(RendererVk *renderer, const angle::Format &angleFormat);
+    void initialize(RendererVk *renderer, const angle::Format &intendedAngleFormat);
 
     // These are used in the format table init.
     void initImageFallback(RendererVk *renderer, const ImageFormatInitInfo *info, int numInfo);
@@ -125,24 +182,26 @@
                             int numInfo,
                             int compressedStartIndex);
 
-    angle::FormatID intendedFormatID;
-    GLenum intendedGLFormat;
-    angle::FormatID actualImageFormatID;
-    angle::FormatID actualBufferFormatID;
-    angle::FormatID actualCompressedBufferFormatID;
+    angle::FormatID mIntendedFormatID;
+    GLenum mIntendedGLFormat;
+    angle::FormatID mActualSampleOnlyImageFormatID;
+    angle::FormatID mActualRenderableImageFormatID;
+    angle::FormatID mActualBufferFormatID;
+    angle::FormatID mActualCompressedBufferFormatID;
 
-    InitializeTextureDataFunction imageInitializerFunction;
-    LoadFunctionMap textureLoadFunctions;
-    LoadTextureBorderFunctionMap textureBorderLoadFunctions;
-    VertexCopyFunction vertexLoadFunction;
-    VertexCopyFunction compressedVertexLoadFunction;
+    InitializeTextureDataFunction mImageInitializerFunction;
+    LoadFunctionMap mTextureLoadFunctions;
+    LoadTextureBorderFunctionMap mTextureBorderLoadFunctions;
+    LoadFunctionMap mRenderableTextureLoadFunctions;
+    VertexCopyFunction mVertexLoadFunction;
+    VertexCopyFunction mCompressedVertexLoadFunction;
 
-    bool vertexLoadRequiresConversion;
-    bool compressedVertexLoadRequiresConversion;
-    bool vkBufferFormatIsPacked;
-    bool vkCompressedBufferFormatIsPacked;
-    bool vkFormatIsInt;
-    bool vkFormatIsUnsigned;
+    bool mVertexLoadRequiresConversion;
+    bool mCompressedVertexLoadRequiresConversion;
+    bool mVkBufferFormatIsPacked;
+    bool mVkCompressedBufferFormatIsPacked;
+    bool mVkFormatIsInt;
+    bool mVkFormatIsUnsigned;
 };
 
 bool operator==(const Format &lhs, const Format &rhs);
@@ -190,13 +249,9 @@
 // Checks if a Vulkan format supports all the features except rendering.
 bool HasNonRenderableTextureFormatSupport(RendererVk *renderer, angle::FormatID formatID);
 
-// Returns the alignment for a buffer to be used with the vertex input stage in Vulkan. This
-// calculation is listed in the Vulkan spec at the end of the section 'Vertex Input Description'.
-size_t GetVertexInputAlignment(const vk::Format &format, bool compressed);
-
 // Get the swizzle state based on format's requirements and emulations.
 gl::SwizzleState GetFormatSwizzle(const ContextVk *contextVk,
-                                  const vk::Format &format,
+                                  const angle::Format &angleFormat,
                                   const bool sized);
 
 // Apply application's swizzle to the swizzle implied by format as received from GetFormatSwizzle.
diff --git a/src/libANGLE/renderer/vulkan/vk_helpers.cpp b/src/libANGLE/renderer/vulkan/vk_helpers.cpp
index a06b60d..336915d 100644
--- a/src/libANGLE/renderer/vulkan/vk_helpers.cpp
+++ b/src/libANGLE/renderer/vulkan/vk_helpers.cpp
@@ -702,17 +702,19 @@
     }
 }
 
-VkClearValue GetRobustResourceClearValue(const Format &format)
+VkClearValue GetRobustResourceClearValue(const angle::Format &intendedFormat,
+                                         const angle::Format &actualFormat)
 {
     VkClearValue clearValue = {};
-    if (format.intendedFormat().hasDepthOrStencilBits())
+    if (intendedFormat.hasDepthOrStencilBits())
     {
         clearValue.depthStencil = kRobustInitDepthStencilValue;
     }
     else
     {
-        clearValue.color =
-            format.hasEmulatedImageChannels() ? kEmulatedInitColorValue : kRobustInitColorValue;
+        clearValue.color = HasEmulatedImageChannels(intendedFormat, actualFormat)
+                               ? kEmulatedInitColorValue
+                               : kRobustInitColorValue;
     }
     return clearValue;
 }
@@ -755,45 +757,24 @@
 }
 
 bool CanCopyWithTransferForCopyImage(RendererVk *renderer,
-                                     const Format &srcFormat,
+                                     ImageHelper *srcImage,
                                      VkImageTiling srcTilingMode,
-                                     const Format &destFormat,
+                                     ImageHelper *destImage,
                                      VkImageTiling destTilingMode)
 {
     // Neither source nor destination formats can be emulated for copy image through transfer,
-    // unless they are emualted with the same format!
+    // unless they are emulated with the same format!
     bool isFormatCompatible =
-        (!srcFormat.hasEmulatedImageFormat() && !destFormat.hasEmulatedImageFormat()) ||
-        srcFormat.actualImageFormatID == destFormat.actualImageFormatID;
+        (!srcImage->hasEmulatedImageFormat() && !destImage->hasEmulatedImageFormat()) ||
+        srcImage->getActualFormatID() == destImage->getActualFormatID();
 
     // If neither formats are emulated, GL validation ensures that pixelBytes is the same for both.
     ASSERT(!isFormatCompatible ||
-           srcFormat.actualImageFormat().pixelBytes == destFormat.actualImageFormat().pixelBytes);
+           srcImage->getActualFormat().pixelBytes == destImage->getActualFormat().pixelBytes);
 
     return isFormatCompatible &&
-           CanCopyWithTransfer(renderer, srcFormat, srcTilingMode, destFormat, destTilingMode);
-}
-
-bool CanCopyWithTransformForReadPixels(const PackPixelsParams &packPixelsParams,
-                                       const vk::Format *imageFormat,
-                                       const angle::Format *readFormat)
-{
-    // Don't allow copies from emulated formats for simplicity.
-    const bool isEmulatedFormat = imageFormat->hasEmulatedImageFormat();
-
-    // Only allow copies to PBOs with identical format.
-    const bool isSameFormatCopy = *readFormat == *packPixelsParams.destFormat;
-
-    // Disallow any transformation.
-    const bool needsTransformation =
-        packPixelsParams.rotation != SurfaceRotation::Identity || packPixelsParams.reverseRowOrder;
-
-    // Disallow copies when the output pitch cannot be correctly specified in Vulkan.
-    const bool isPitchMultipleOfTexelSize =
-        packPixelsParams.outputPitch % readFormat->pixelBytes == 0;
-
-    return !isEmulatedFormat && isSameFormatCopy && !needsTransformation &&
-           isPitchMultipleOfTexelSize;
+           CanCopyWithTransfer(renderer, srcImage->getActualFormatID(), srcTilingMode,
+                               destImage->getActualFormatID(), destTilingMode);
 }
 
 void ReleaseBufferListToRenderer(RendererVk *renderer, BufferHelperPointerVector *buffers)
@@ -852,18 +833,17 @@
 }
 
 bool CanCopyWithTransfer(RendererVk *renderer,
-                         const Format &srcFormat,
+                         angle::FormatID srcFormatID,
                          VkImageTiling srcTilingMode,
-                         const Format &destFormat,
+                         angle::FormatID destFormatID,
                          VkImageTiling destTilingMode)
 {
     // Checks that the formats in the copy transfer have the appropriate tiling and transfer bits
     bool isTilingCompatible           = srcTilingMode == destTilingMode;
     bool srcFormatHasNecessaryFeature = FormatHasNecessaryFeature(
-        renderer, srcFormat.actualImageFormatID, srcTilingMode, VK_FORMAT_FEATURE_TRANSFER_SRC_BIT);
-    bool dstFormatHasNecessaryFeature =
-        FormatHasNecessaryFeature(renderer, destFormat.actualImageFormatID, destTilingMode,
-                                  VK_FORMAT_FEATURE_TRANSFER_DST_BIT);
+        renderer, srcFormatID, srcTilingMode, VK_FORMAT_FEATURE_TRANSFER_SRC_BIT);
+    bool dstFormatHasNecessaryFeature = FormatHasNecessaryFeature(
+        renderer, destFormatID, destTilingMode, VK_FORMAT_FEATURE_TRANSFER_DST_BIT);
 
     return isTilingCompatible && srcFormatHasNecessaryFeature && dstFormatHasNecessaryFeature;
 }
@@ -1419,7 +1399,7 @@
 
     if (barrierRequired)
     {
-        const angle::Format &format = mDepthStencilImage->getFormat().actualImageFormat();
+        const angle::Format &format = mDepthStencilImage->getActualFormat();
         ASSERT(format.hasDepthOrStencilBits());
         VkImageAspectFlags aspectFlags = GetDepthStencilAspectFlags(format);
         updateImageLayoutAndBarrier(context, mDepthStencilImage, aspectFlags, imageLayout);
@@ -1433,7 +1413,7 @@
     ASSERT(!mDepthStencilResolveImage->hasRenderPassUsageFlag(RenderPassUsage::ReadOnlyAttachment));
 
     ImageLayout imageLayout     = ImageLayout::DepthStencilResolveAttachment;
-    const angle::Format &format = mDepthStencilResolveImage->getFormat().actualImageFormat();
+    const angle::Format &format = mDepthStencilResolveImage->getActualFormat();
     ASSERT(format.hasDepthOrStencilBits());
     VkImageAspectFlags aspectFlags = GetDepthStencilAspectFlags(format);
 
@@ -3823,7 +3803,8 @@
       mUsage(other.mUsage),
       mExtents(other.mExtents),
       mRotatedAspectRatio(other.mRotatedAspectRatio),
-      mFormat(other.mFormat),
+      mIntendedFormatID(other.mIntendedFormatID),
+      mActualFormatID(other.mActualFormatID),
       mSamples(other.mSamples),
       mImageSerial(other.mImageSerial),
       mCurrentLayout(other.mCurrentLayout),
@@ -3858,7 +3839,8 @@
     mUsage                       = 0;
     mExtents                     = {};
     mRotatedAspectRatio          = false;
-    mFormat                      = nullptr;
+    mIntendedFormatID            = angle::FormatID::NONE;
+    mActualFormatID              = angle::FormatID::NONE;
     mSamples                     = 1;
     mImageSerial                 = kInvalidImageSerial;
     mCurrentLayout               = ImageLayout::Undefined;
@@ -3973,7 +3955,8 @@
                                 bool isRobustResourceInitEnabled,
                                 bool hasProtectedContent)
 {
-    return initExternal(context, textureType, extents, format, samples, usage,
+    return initExternal(context, textureType, extents, format.getIntendedFormatID(),
+                        format.getActualRenderableImageFormatID(), samples, usage,
                         kVkImageCreateFlagsNone, ImageLayout::Undefined, nullptr, firstLevel,
                         mipLevels, layerCount, isRobustResourceInitEnabled, nullptr,
                         hasProtectedContent);
@@ -3992,7 +3975,8 @@
                                              bool isRobustResourceInitEnabled,
                                              bool hasProtectedContent)
 {
-    ANGLE_TRY(initExternal(context, textureType, extents, format, samples, usage,
+    ANGLE_TRY(initExternal(context, textureType, extents, format.getIntendedFormatID(),
+                           format.getActualRenderableImageFormatID(), samples, usage,
                            kVkImageCreateFlagsNone, ImageLayout::Undefined, nullptr, firstLevel,
                            mipLevels, layerCount, isRobustResourceInitEnabled, nullptr,
                            hasProtectedContent));
@@ -4007,7 +3991,8 @@
 angle::Result ImageHelper::initExternal(Context *context,
                                         gl::TextureType textureType,
                                         const VkExtent3D &extents,
-                                        const Format &format,
+                                        angle::FormatID intendedFormatID,
+                                        angle::FormatID actualFormatID,
                                         GLint samples,
                                         VkImageUsageFlags usage,
                                         VkImageCreateFlags additionalCreateFlags,
@@ -4027,7 +4012,8 @@
     mImageType           = gl_vk::GetImageType(textureType);
     mExtents             = extents;
     mRotatedAspectRatio  = false;
-    mFormat              = &format;
+    mIntendedFormatID    = intendedFormatID;
+    mActualFormatID      = actualFormatID;
     mSamples             = std::max(samples, 1);
     mImageSerial         = context->getRenderer()->getResourceSerialFactory().generateImageSerial();
     mFirstAllocatedLevel = firstLevel;
@@ -4049,17 +4035,17 @@
     bool imageFormatListEnabled                        = false;
     RendererVk *rendererVk                             = context->getRenderer();
     VkImageFormatListCreateInfoKHR imageFormatListInfo = {};
-    angle::FormatID imageFormat                        = format.actualImageFormatID;
-    angle::FormatID additionalFormat                   = format.actualImageFormat().isSRGB
-                                           ? ConvertToLinear(imageFormat)
-                                           : ConvertToSRGB(imageFormat);
+    const angle::Format &actualFormat                  = angle::Format::Get(mActualFormatID);
+    VkFormat actualVkFormat                            = GetVkFormatFromFormatID(mActualFormatID);
+    angle::FormatID additionalFormat =
+        actualFormat.isSRGB ? ConvertToLinear(mActualFormatID) : ConvertToSRGB(mActualFormatID);
     constexpr uint32_t kImageListFormatCount = 2;
     VkFormat imageListFormats[kImageListFormatCount];
-    imageListFormats[0] = vk::GetVkFormatFromFormatID(imageFormat);
+    imageListFormats[0] = vk::GetVkFormatFromFormatID(mActualFormatID);
     imageListFormats[1] = vk::GetVkFormatFromFormatID(additionalFormat);
 
     if (rendererVk->getFeatures().supportsImageFormatList.enabled &&
-        rendererVk->haveSameFormatFeatureBits(imageFormat, additionalFormat))
+        rendererVk->haveSameFormatFeatureBits(mActualFormatID, additionalFormat))
     {
         imageFormatListEnabled = true;
 
@@ -4081,7 +4067,7 @@
 
     mYuvConversionSampler.reset();
     mExternalFormat = 0;
-    if (format.actualImageFormat().isYUV)
+    if (actualFormat.isYUV)
     {
         // The Vulkan spec states: If sampler is used and the VkFormat of the image is a
         // multi-planar format, the image must have been created with
@@ -4096,8 +4082,7 @@
             VK_FORMAT_FEATURE_MIDPOINT_CHROMA_SAMPLES_BIT;
 
         VkFormatFeatureFlags supportedChromaSubSampleFeatureBits =
-            rendererVk->getImageFormatFeatureBits(format.actualImageFormatID,
-                                                  kChromaSubSampleFeatureBits);
+            rendererVk->getImageFormatFeatureBits(mActualFormatID, kChromaSubSampleFeatureBits);
 
         VkChromaLocation supportedLocation = ((supportedChromaSubSampleFeatureBits &
                                                VK_FORMAT_FEATURE_COSITED_CHROMA_SAMPLES_BIT) != 0)
@@ -4107,7 +4092,7 @@
         // Create the VkSamplerYcbcrConversion to associate with image views and samplers
         VkSamplerYcbcrConversionCreateInfo yuvConversionInfo = {};
         yuvConversionInfo.sType         = VK_STRUCTURE_TYPE_SAMPLER_YCBCR_CONVERSION_CREATE_INFO;
-        yuvConversionInfo.format        = format.actualImageVkFormat();
+        yuvConversionInfo.format        = actualVkFormat;
         yuvConversionInfo.xChromaOffset = supportedLocation;
         yuvConversionInfo.yChromaOffset = supportedLocation;
         yuvConversionInfo.ycbcrModel    = VK_SAMPLER_YCBCR_MODEL_CONVERSION_YCBCR_601;
@@ -4115,8 +4100,7 @@
         yuvConversionInfo.chromaFilter  = VK_FILTER_NEAREST;
 
         ANGLE_TRY(rendererVk->getYuvConversionCache().getYuvConversion(
-            context, format.actualImageVkFormat(), false, yuvConversionInfo,
-            &mYuvConversionSampler));
+            context, actualVkFormat, false, yuvConversionInfo, &mYuvConversionSampler));
     }
 
     if (hasProtectedContent)
@@ -4129,7 +4113,7 @@
     imageInfo.pNext     = (imageFormatListEnabled) ? &imageFormatListInfo : externalImageCreateInfo;
     imageInfo.flags     = mCreateFlags;
     imageInfo.imageType = mImageType;
-    imageInfo.format    = format.actualImageVkFormat();
+    imageInfo.format    = actualVkFormat;
     imageInfo.extent    = mExtents;
     imageInfo.mipLevels = mLevelCount;
     imageInfo.arrayLayers           = mLayerCount;
@@ -4208,7 +4192,7 @@
                                                    bool hasProtectedContent,
                                                    VkDeviceSize size)
 {
-    const angle::Format &angleFormat = mFormat->actualImageFormat();
+    const angle::Format &angleFormat = getActualFormat();
     bool isCompressedFormat          = angleFormat.isBlock;
 
     if (angleFormat.isYUV)
@@ -4399,29 +4383,28 @@
                                               uint32_t layerCount,
                                               gl::SrgbWriteControlMode mode) const
 {
-    angle::FormatID imageFormat = mFormat->actualImageFormatID;
+    angle::FormatID actualFormat = mActualFormatID;
 
     // If we are initializing an imageview for use with EXT_srgb_write_control, we need to override
     // the format to its linear counterpart. Formats that cannot be reinterpreted are exempt from
     // this requirement.
     if (mode == gl::SrgbWriteControlMode::Linear)
     {
-        angle::FormatID linearFormat = ConvertToLinear(imageFormat);
+        angle::FormatID linearFormat = ConvertToLinear(actualFormat);
         if (linearFormat != angle::FormatID::NONE)
         {
-            imageFormat = linearFormat;
+            actualFormat = linearFormat;
         }
     }
 
-    return initLayerImageViewImpl(
-        context, textureType, aspectMask, swizzleMap, imageViewOut, baseMipLevelVk, levelCount,
-        baseArrayLayer, layerCount,
-        context->getRenderer()->getFormat(imageFormat).actualImageVkFormat(), nullptr);
+    return initLayerImageViewImpl(context, textureType, aspectMask, swizzleMap, imageViewOut,
+                                  baseMipLevelVk, levelCount, baseArrayLayer, layerCount,
+                                  GetVkFormatFromFormatID(actualFormat), nullptr);
 }
 
 angle::Result ImageHelper::initLayerImageViewWithFormat(Context *context,
                                                         gl::TextureType textureType,
-                                                        const Format &format,
+                                                        VkFormat imageFormat,
                                                         VkImageAspectFlags aspectMask,
                                                         const gl::SwizzleState &swizzleMap,
                                                         ImageView *imageViewOut,
@@ -4432,7 +4415,7 @@
 {
     return initLayerImageViewImpl(context, textureType, aspectMask, swizzleMap, imageViewOut,
                                   baseMipLevelVk, levelCount, baseArrayLayer, layerCount,
-                                  format.actualImageVkFormat(), nullptr);
+                                  imageFormat, nullptr);
 }
 
 angle::Result ImageHelper::initLayerImageViewImpl(
@@ -4549,7 +4532,8 @@
 
     gl_vk::GetExtent(glExtents, &mExtents);
     mRotatedAspectRatio = rotatedAspectRatio;
-    mFormat             = &format;
+    mIntendedFormatID   = format.getIntendedFormatID();
+    mActualFormatID     = format.getActualRenderableImageFormatID();
     mSamples            = std::max(samples, 1);
     mImageSerial        = context->getRenderer()->getResourceSerialFactory().generateImageSerial();
     mCurrentLayout      = ImageLayout::Undefined;
@@ -4565,14 +4549,15 @@
                                          bool hasProtectedContent,
                                          const MemoryProperties &memoryProperties,
                                          const gl::Extents &glExtents,
-                                         const Format &format,
+                                         angle::FormatID intendedFormatID,
+                                         angle::FormatID actualFormatID,
                                          VkImageUsageFlags usage,
                                          uint32_t layerCount)
 {
     gl_vk::GetExtent(glExtents, &mExtents);
 
     return initStaging(context, hasProtectedContent, memoryProperties, VK_IMAGE_TYPE_2D, mExtents,
-                       format, 1, usage, 1, layerCount);
+                       intendedFormatID, actualFormatID, 1, usage, 1, layerCount);
 }
 
 angle::Result ImageHelper::initStaging(Context *context,
@@ -4580,7 +4565,8 @@
                                        const MemoryProperties &memoryProperties,
                                        VkImageType imageType,
                                        const VkExtent3D &extents,
-                                       const Format &format,
+                                       angle::FormatID intendedFormatID,
+                                       angle::FormatID actualFormatID,
                                        GLint samples,
                                        VkImageUsageFlags usage,
                                        uint32_t mipLevels,
@@ -4593,7 +4579,8 @@
     mImageType          = imageType;
     mExtents            = extents;
     mRotatedAspectRatio = false;
-    mFormat             = &format;
+    mIntendedFormatID   = intendedFormatID;
+    mActualFormatID     = actualFormatID;
     mSamples            = std::max(samples, 1);
     mImageSerial        = context->getRenderer()->getResourceSerialFactory().generateImageSerial();
     mLayerCount         = layerCount;
@@ -4610,7 +4597,7 @@
     imageInfo.sType                 = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
     imageInfo.flags                 = hasProtectedContent ? VK_IMAGE_CREATE_PROTECTED_BIT : 0;
     imageInfo.imageType             = mImageType;
-    imageInfo.format                = format.actualImageVkFormat();
+    imageInfo.format                = getActualVkFormat();
     imageInfo.extent                = mExtents;
     imageInfo.mipLevels             = mLevelCount;
     imageInfo.arrayLayers           = mLayerCount;
@@ -4669,11 +4656,12 @@
     const VkImageCreateFlags kMultisampledCreateFlags =
         hasProtectedContent ? VK_IMAGE_CREATE_PROTECTED_BIT : 0;
 
-    ANGLE_TRY(initExternal(
-        context, textureType, resolveImage.getExtents(), resolveImage.getFormat(), samples,
-        kMultisampledUsageFlags, kMultisampledCreateFlags, ImageLayout::Undefined, nullptr,
-        resolveImage.getFirstAllocatedLevel(), resolveImage.getLevelCount(),
-        resolveImage.getLayerCount(), isRobustResourceInitEnabled, nullptr, hasProtectedContent));
+    ANGLE_TRY(initExternal(context, textureType, resolveImage.getExtents(),
+                           resolveImage.getIntendedFormatID(), resolveImage.getActualFormatID(),
+                           samples, kMultisampledUsageFlags, kMultisampledCreateFlags,
+                           ImageLayout::Undefined, nullptr, resolveImage.getFirstAllocatedLevel(),
+                           resolveImage.getLevelCount(), resolveImage.getLayerCount(),
+                           isRobustResourceInitEnabled, nullptr, hasProtectedContent));
 
     const VkMemoryPropertyFlags kMultisampledMemoryFlags =
         VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT |
@@ -4693,7 +4681,7 @@
 
 VkImageAspectFlags ImageHelper::getAspectFlags() const
 {
-    return GetFormatAspectFlags(mFormat->actualImageFormat());
+    return GetFormatAspectFlags(getActualFormat());
 }
 
 bool ImageHelper::isCombinedDepthStencilFormat() const
@@ -4746,7 +4734,7 @@
 
 bool ImageHelper::isDepthOrStencil() const
 {
-    return mFormat->actualImageFormat().hasDepthOrStencilBits();
+    return getActualFormat().hasDepthOrStencilBits();
 }
 
 void ImageHelper::setRenderPassUsageFlag(RenderPassUsage flag)
@@ -5073,7 +5061,7 @@
                         uint32_t layerCount,
                         CommandBuffer *commandBuffer)
 {
-    const angle::Format &angleFormat = mFormat->actualImageFormat();
+    const angle::Format &angleFormat = getActualFormat();
     bool isDepthStencil              = angleFormat.depthBits > 0 || angleFormat.stencilBits > 0;
 
     if (isDepthStencil)
@@ -5139,16 +5127,14 @@
 {
     ContextVk *contextVk = GetImpl(context);
 
-    const Format &sourceVkFormat = srcImage->getFormat();
     VkImageTiling srcTilingMode  = srcImage->getTilingMode();
-    const Format &destVkFormat   = dstImage->getFormat();
     VkImageTiling destTilingMode = dstImage->getTilingMode();
 
     const gl::LevelIndex srcLevelGL = gl::LevelIndex(srcLevel);
     const gl::LevelIndex dstLevelGL = gl::LevelIndex(dstLevel);
 
-    if (CanCopyWithTransferForCopyImage(contextVk->getRenderer(), sourceVkFormat, srcTilingMode,
-                                        destVkFormat, destTilingMode))
+    if (CanCopyWithTransferForCopyImage(contextVk->getRenderer(), srcImage, srcTilingMode, dstImage,
+                                        destTilingMode))
     {
         bool isSrc3D = srcImage->getType() == VK_IMAGE_TYPE_3D;
         bool isDst3D = dstImage->getType() == VK_IMAGE_TYPE_3D;
@@ -5194,7 +5180,7 @@
         commandBuffer->copyImage(srcImage->getImage(), srcImage->getCurrentLayout(),
                                  dstImage->getImage(), dstImage->getCurrentLayout(), 1, &region);
     }
-    else if (!sourceVkFormat.intendedFormat().isBlock && !destVkFormat.intendedFormat().isBlock)
+    else if (!srcImage->getIntendedFormat().isBlock && !dstImage->getIntendedFormat().isBlock)
     {
         // The source and destination image formats may be using a fallback in the case of RGB
         // images.  A compute shader is used in such a case to perform the copy.
@@ -5254,7 +5240,8 @@
     barrier.subresourceRange.layerCount     = mLayerCount;
     barrier.subresourceRange.levelCount     = 1;
 
-    const VkFilter filter = gl_vk::GetFilter(CalculateGenerateMipmapFilter(contextVk, getFormat()));
+    const VkFilter filter =
+        gl_vk::GetFilter(CalculateGenerateMipmapFilter(contextVk, getActualFormatID()));
 
     for (LevelIndex mipLevel(1); mipLevel <= LevelIndex(mLevelCount); ++mipLevel)
     {
@@ -5409,11 +5396,12 @@
                                                       GLenum type,
                                                       const uint8_t *pixels,
                                                       const Format &vkFormat,
+                                                      ImageAccess access,
                                                       const GLuint inputRowPitch,
                                                       const GLuint inputDepthPitch,
                                                       const GLuint inputSkipBytes)
 {
-    const angle::Format &storageFormat = vkFormat.actualImageFormat();
+    const angle::Format &storageFormat = vkFormat.getActualImageFormat(access);
 
     size_t outputRowPitch;
     size_t outputDepthPitch;
@@ -5422,7 +5410,7 @@
     uint32_t bufferImageHeight;
     size_t allocationSize;
 
-    LoadImageFunctionInfo loadFunctionInfo = vkFormat.textureLoadFunctions(type);
+    LoadImageFunctionInfo loadFunctionInfo = vkFormat.getTextureLoadFunction(access, type);
     LoadImageFunction stencilLoadFunction  = nullptr;
 
     if (storageFormat.isBlock)
@@ -5526,7 +5514,7 @@
                                   outputDepthPitch);
 
     // YUV formats need special handling.
-    if (vkFormat.actualImageFormat().isYUV)
+    if (storageFormat.isYUV)
     {
         gl::YuvFormatInfo yuvInfo(formatInfo.internalFormat, glExtents);
 
@@ -5549,14 +5537,15 @@
             gl_vk::GetExtent(yuvInfo.planeExtent[plane], &copy.imageExtent);
             copy.imageSubresource.baseArrayLayer = 0;
             copy.imageSubresource.aspectMask     = kPlaneAspectFlags[plane];
-            appendSubresourceUpdate(gl::LevelIndex(0), SubresourceUpdate(currentBuffer, copy));
+            appendSubresourceUpdate(gl::LevelIndex(0),
+                                    SubresourceUpdate(currentBuffer, copy, storageFormat.id));
         }
 
         return angle::Result::Continue;
     }
 
     VkBufferImageCopy copy         = {};
-    VkImageAspectFlags aspectFlags = GetFormatAspectFlags(vkFormat.actualImageFormat());
+    VkImageAspectFlags aspectFlags = GetFormatAspectFlags(storageFormat);
 
     copy.bufferOffset      = stagingOffset;
     copy.bufferRowLength   = bufferRowLength;
@@ -5609,7 +5598,8 @@
         stencilCopy.imageOffset                     = copy.imageOffset;
         stencilCopy.imageExtent                     = copy.imageExtent;
         stencilCopy.imageSubresource.aspectMask     = VK_IMAGE_ASPECT_STENCIL_BIT;
-        appendSubresourceUpdate(updateLevelGL, SubresourceUpdate(currentBuffer, stencilCopy));
+        appendSubresourceUpdate(updateLevelGL,
+                                SubresourceUpdate(currentBuffer, stencilCopy, storageFormat.id));
 
         aspectFlags &= ~VK_IMAGE_ASPECT_STENCIL_BIT;
     }
@@ -5632,7 +5622,8 @@
     if (aspectFlags)
     {
         copy.imageSubresource.aspectMask = aspectFlags;
-        appendSubresourceUpdate(updateLevelGL, SubresourceUpdate(currentBuffer, copy));
+        appendSubresourceUpdate(updateLevelGL,
+                                SubresourceUpdate(currentBuffer, copy, storageFormat.id));
     }
 
     return angle::Result::Continue;
@@ -5679,7 +5670,7 @@
 
 bool ImageHelper::hasImmutableSampler() const
 {
-    return mExternalFormat != 0 || mFormat->actualImageFormat().isYUV;
+    return mExternalFormat != 0 || getActualFormat().isYUV;
 }
 
 void ImageHelper::onWrite(gl::LevelIndex levelStart,
@@ -5796,7 +5787,8 @@
                                                   DynamicBuffer *stagingBufferOverride,
                                                   GLenum type,
                                                   const uint8_t *pixels,
-                                                  const Format &vkFormat)
+                                                  const Format &vkFormat,
+                                                  ImageAccess access)
 {
     GLuint inputRowPitch   = 0;
     GLuint inputDepthPitch = 0;
@@ -5805,7 +5797,7 @@
                                   &inputRowPitch, &inputDepthPitch, &inputSkipBytes));
 
     ANGLE_TRY(stageSubresourceUpdateImpl(contextVk, index, glExtents, offset, formatInfo, unpack,
-                                         stagingBufferOverride, type, pixels, vkFormat,
+                                         stagingBufferOverride, type, pixels, vkFormat, access,
                                          inputRowPitch, inputDepthPitch, inputSkipBytes));
 
     return angle::Result::Continue;
@@ -5817,7 +5809,8 @@
                                                             const gl::Extents &glExtents,
                                                             const gl::Offset &offset,
                                                             uint8_t **destData,
-                                                            DynamicBuffer *stagingBufferOverride)
+                                                            DynamicBuffer *stagingBufferOverride,
+                                                            angle::FormatID formatID)
 {
     VkBuffer bufferHandle;
     VkDeviceSize stagingOffset = 0;
@@ -5839,13 +5832,14 @@
     copy.imageSubresource.layerCount     = imageIndex.getLayerCount();
 
     // Note: Only support color now
-    ASSERT((mFormat == nullptr) || (getAspectFlags() == VK_IMAGE_ASPECT_COLOR_BIT));
+    ASSERT((mActualFormatID == angle::FormatID::NONE) ||
+           (getAspectFlags() == VK_IMAGE_ASPECT_COLOR_BIT));
 
     gl_vk::GetOffset(offset, &copy.imageOffset);
     gl_vk::GetExtent(glExtents, &copy.imageExtent);
 
     appendSubresourceUpdate(updateLevelGL,
-                            SubresourceUpdate(stagingBuffer->getCurrentBuffer(), copy));
+                            SubresourceUpdate(stagingBuffer->getCurrentBuffer(), copy, formatID));
 
     return angle::Result::Continue;
 }
@@ -5857,6 +5851,7 @@
     const gl::Offset &dstOffset,
     const gl::Extents &dstExtent,
     const gl::InternalFormat &formatInfo,
+    ImageAccess access,
     FramebufferVk *framebufferVk,
     DynamicBuffer *stagingBufferOverride)
 {
@@ -5882,8 +5877,8 @@
     RendererVk *renderer = contextVk->getRenderer();
 
     const Format &vkFormat             = renderer->getFormat(formatInfo.sizedInternalFormat);
-    const angle::Format &storageFormat = vkFormat.actualImageFormat();
-    LoadImageFunctionInfo loadFunction = vkFormat.textureLoadFunctions(formatInfo.type);
+    const angle::Format &storageFormat = vkFormat.getActualImageFormat(access);
+    LoadImageFunctionInfo loadFunction = vkFormat.getTextureLoadFunction(access, formatInfo.type);
 
     size_t outputRowPitch   = storageFormat.pixelBytes * clippedRectangle.width;
     size_t outputDepthPitch = outputRowPitch * clippedRectangle.height;
@@ -5952,7 +5947,8 @@
     gl_vk::GetExtent(dstExtent, &copyToImage.imageExtent);
 
     // 3- enqueue the destination image subresource update
-    appendSubresourceUpdate(updateLevelGL, SubresourceUpdate(currentBuffer, copyToImage));
+    appendSubresourceUpdate(updateLevelGL,
+                            SubresourceUpdate(currentBuffer, copyToImage, storageFormat.id));
     return angle::Result::Continue;
 }
 
@@ -5993,7 +5989,8 @@
     gl_vk::GetOffset(destOffset, &copyToImage.dstOffset);
     gl_vk::GetExtent(glExtents, &copyToImage.extent);
 
-    appendSubresourceUpdate(updateLevelGL, SubresourceUpdate(image, copyToImage));
+    appendSubresourceUpdate(
+        updateLevelGL, SubresourceUpdate(image, copyToImage, image->get().getActualFormatID()));
 }
 
 void ImageHelper::stageSubresourceUpdatesFromAllImageLevels(RefCounted<ImageHelper> *image,
@@ -6023,8 +6020,8 @@
 {
     const VkImageAspectFlags aspectFlags = getAspectFlags();
 
-    ASSERT(mFormat);
-    VkClearValue clearValue = GetRobustResourceClearValue(*mFormat);
+    ASSERT(mActualFormatID != angle::FormatID::NONE);
+    VkClearValue clearValue = GetRobustResourceClearValue(getIntendedFormat(), getActualFormat());
 
     gl::LevelIndex updateLevelGL(index.getLevelIndex());
     appendSubresourceUpdate(updateLevelGL, SubresourceUpdate(aspectFlags, clearValue, index));
@@ -6033,16 +6030,16 @@
 angle::Result ImageHelper::stageRobustResourceClearWithFormat(ContextVk *contextVk,
                                                               const gl::ImageIndex &index,
                                                               const gl::Extents &glExtents,
-                                                              const Format &format)
+                                                              const angle::Format &intendedFormat,
+                                                              const angle::Format &imageFormat)
 {
-    const angle::Format &imageFormat     = format.actualImageFormat();
     const VkImageAspectFlags aspectFlags = GetFormatAspectFlags(imageFormat);
 
     // Robust clears must only be staged if we do not have any prior data for this subresource.
     ASSERT(!hasStagedUpdatesForSubresource(gl::LevelIndex(index.getLevelIndex()),
                                            index.getLayerIndex(), index.getLayerCount()));
 
-    VkClearValue clearValue = GetRobustResourceClearValue(format);
+    VkClearValue clearValue = GetRobustResourceClearValue(intendedFormat, imageFormat);
 
     gl::LevelIndex updateLevelGL(index.getLevelIndex());
 
@@ -6075,8 +6072,8 @@
         copyRegion.imageSubresource.baseArrayLayer = index.hasLayer() ? index.getLayerIndex() : 0;
         copyRegion.imageSubresource.layerCount     = index.getLayerCount();
 
-        appendSubresourceUpdate(updateLevelGL,
-                                SubresourceUpdate(mStagingBuffer.getCurrentBuffer(), copyRegion));
+        appendSubresourceUpdate(updateLevelGL, SubresourceUpdate(mStagingBuffer.getCurrentBuffer(),
+                                                                 copyRegion, imageFormat.id));
     }
     else
     {
@@ -6089,13 +6086,13 @@
 void ImageHelper::stageClearIfEmulatedFormat(bool isRobustResourceInitEnabled)
 {
     // Skip staging extra clears if robust resource init is enabled.
-    if (!mFormat->hasEmulatedImageChannels() || isRobustResourceInitEnabled)
+    if (!hasEmulatedImageChannels() || isRobustResourceInitEnabled)
     {
         return;
     }
 
     VkClearValue clearValue = {};
-    if (mFormat->intendedFormat().hasDepthOrStencilBits())
+    if (getIntendedFormat().hasDepthOrStencilBits())
     {
         clearValue.depthStencil = kRobustInitDepthStencilValue;
     }
@@ -6146,7 +6143,8 @@
 
     // Barrier information.  Note: mLevelCount is set to levelCount so that only the necessary
     // levels are transitioned when flushing the update.
-    prevImage->get().mFormat                      = mFormat;
+    prevImage->get().mIntendedFormatID            = mIntendedFormatID;
+    prevImage->get().mActualFormatID              = mActualFormatID;
     prevImage->get().mCurrentLayout               = mCurrentLayout;
     prevImage->get().mCurrentQueueFamilyIndex     = mCurrentQueueFamilyIndex;
     prevImage->get().mLastNonShaderReadOnlyLayout = mLastNonShaderReadOnlyLayout;
@@ -6291,7 +6289,7 @@
 
     ANGLE_TRY(mStagingBuffer.flush(contextVk));
 
-    const VkImageAspectFlags aspectFlags = GetFormatAspectFlags(mFormat->actualImageFormat());
+    const VkImageAspectFlags aspectFlags = GetFormatAspectFlags(getActualFormat());
 
     // For each level, upload layers that don't conflict in parallel.  The layer is hashed to
     // `layer % 64` and used to track whether that subresource is currently in transfer.  If so, a
@@ -6364,10 +6362,23 @@
             }
             else if (update.updateSource == UpdateSource::Buffer)
             {
+                if (update.data.buffer.formatID != mActualFormatID)
+                {
+                    // TODD: http://anglebug.com/6368, we should handle this in higher level code.
+                    // If we have incompatible updates, skip but keep it.
+                    updatesToKeep.emplace_back(std::move(update));
+                    continue;
+                }
                 update.data.buffer.copyRegion.imageSubresource.mipLevel = updateMipLevelVk.get();
             }
             else if (update.updateSource == UpdateSource::Image)
             {
+                if (update.data.image.formatID != mActualFormatID)
+                {
+                    // If we have incompatible updates, skip but keep it.
+                    updatesToKeep.emplace_back(std::move(update));
+                    continue;
+                }
                 update.data.image.copyRegion.dstSubresource.mipLevel = updateMipLevelVk.get();
             }
 
@@ -6464,6 +6475,7 @@
     {
         mStagingBuffer.releaseInFlightBuffers(contextVk);
         mStagingBuffer.release(contextVk->getRenderer());
+        onStateChange(angle::SubjectMessage::InitializationComplete);
     }
 
     return angle::Result::Continue;
@@ -6535,6 +6547,35 @@
     return false;
 }
 
+bool ImageHelper::hasStagedUpdatesWithMismatchedFormat(gl::LevelIndex levelStart,
+                                                       gl::LevelIndex levelEnd,
+                                                       angle::FormatID formatID) const
+{
+    for (gl::LevelIndex level = levelStart; level < levelEnd; ++level)
+    {
+        const std::vector<SubresourceUpdate> *levelUpdates = getLevelUpdates(level);
+        if (levelUpdates == nullptr)
+        {
+            continue;
+        }
+
+        for (const SubresourceUpdate &update : *levelUpdates)
+        {
+            if (update.updateSource == UpdateSource::Buffer &&
+                update.data.buffer.formatID != formatID)
+            {
+                return true;
+            }
+            if (update.updateSource == UpdateSource::Image &&
+                update.data.image.formatID != formatID)
+            {
+                return true;
+            }
+        }
+    }
+    return false;
+}
+
 bool ImageHelper::validateSubresourceUpdateImageRefConsistent(RefCounted<ImageHelper> *image) const
 {
     if (image == nullptr)
@@ -6708,7 +6749,7 @@
 {
     ANGLE_TRACE_EVENT0("gpu.angle", "ImageHelper::copyImageDataToBuffer");
 
-    const angle::Format &imageFormat = mFormat->actualImageFormat();
+    const angle::Format &imageFormat = getActualFormat();
 
     // Two VK formats (one depth-only, one combined depth/stencil) use an extra byte for depth.
     // From https://www.khronos.org/registry/vulkan/specs/1.1/html/vkspec.html#VkBufferImageCopy:
@@ -6719,7 +6760,7 @@
     //  per pixel which is sufficient to contain its depth aspect (no stencil aspect).
     uint32_t pixelBytes         = imageFormat.pixelBytes;
     uint32_t depthBytesPerPixel = imageFormat.depthBits >> 3;
-    if (mFormat->actualImageVkFormat() == VK_FORMAT_D24_UNORM_S8_UINT)
+    if (getActualVkFormat() == VK_FORMAT_D24_UNORM_S8_UINT)
     {
         pixelBytes         = 5;
         depthBytesPerPixel = 4;
@@ -6824,6 +6865,7 @@
                                                  gl::Buffer *packBuffer,
                                                  gl::LevelIndex levelGL,
                                                  uint32_t layer,
+                                                 uint32_t layerCount,
                                                  GLenum format,
                                                  GLenum type,
                                                  void *pixels)
@@ -6843,12 +6885,11 @@
             if (angleFormat.stencilBits != 0)
             {
                 // TODO (anglebug.com/4688) Support combined depth stencil for GetTexImage
-                WARN() << "Unable to pull combined depth/stencil for GetTexImage";
-                return angle::Result::Continue;
+                WARN() << "Unable to pull stencil from combined depth/stencil for GetTexImage";
             }
             aspectFlags = VK_IMAGE_ASPECT_DEPTH_BIT;
         }
-        if (angleFormat.stencilBits > 0)
+        else if (angleFormat.stencilBits > 0)
         {
             aspectFlags = VK_IMAGE_ASPECT_STENCIL_BIT;
         }
@@ -6871,12 +6912,17 @@
     stagingBuffer.get().init(contextVk->getRenderer(), VK_BUFFER_USAGE_TRANSFER_DST_BIT, 1,
                              kStagingBufferSize, true, DynamicBufferPolicy::OneShotUse);
 
-    if (mExtents.depth > 1)
+    if (mExtents.depth > 1 || layerCount > 1)
     {
+        ASSERT(layer == 0);
+        ASSERT(layerCount == 1 || mipExtents.depth == 1);
+
+        uint32_t lastLayer = std::max(static_cast<uint32_t>(mipExtents.depth), layerCount);
+
         // Depth > 1 means this is a 3D texture and we need to copy all layers
-        for (layer = 0; layer < static_cast<uint32_t>(mipExtents.depth); layer++)
+        for (uint32_t mipLayer = 0; mipLayer < lastLayer; mipLayer++)
         {
-            ANGLE_TRY(readPixels(contextVk, area, params, aspectFlags, levelGL, layer,
+            ANGLE_TRY(readPixels(contextVk, area, params, aspectFlags, levelGL, mipLayer,
                                  static_cast<uint8_t *>(pixels) + outputSkipBytes,
                                  &stagingBuffer.get()));
 
@@ -6894,6 +6940,27 @@
     return angle::Result::Continue;
 }
 
+bool ImageHelper::canCopyWithTransformForReadPixels(const PackPixelsParams &packPixelsParams,
+                                                    const angle::Format *readFormat)
+{
+    ASSERT(mActualFormatID != angle::FormatID::NONE && mIntendedFormatID != angle::FormatID::NONE);
+
+    // Only allow copies to PBOs with identical format.
+    const bool isSameFormatCopy = *readFormat == *packPixelsParams.destFormat;
+
+    // Disallow any transformation.
+    const bool needsTransformation =
+        packPixelsParams.rotation != SurfaceRotation::Identity || packPixelsParams.reverseRowOrder;
+
+    // Disallow copies when the output pitch cannot be correctly specified in Vulkan.
+    const bool isPitchMultipleOfTexelSize =
+        packPixelsParams.outputPitch % readFormat->pixelBytes == 0;
+
+    // Don't allow copies from emulated formats for simplicity.
+    return !hasEmulatedImageFormat() && isSameFormatCopy && !needsTransformation &&
+           isPitchMultipleOfTexelSize;
+}
+
 angle::Result ImageHelper::readPixels(ContextVk *contextVk,
                                       const gl::Rectangle &area,
                                       const PackPixelsParams &packPixelsParams,
@@ -6920,7 +6987,7 @@
     {
         ANGLE_TRY(resolvedImage.get().init2DStaging(
             contextVk, contextVk->hasProtectedContent(), renderer->getMemoryProperties(),
-            gl::Extents(area.width, area.height, 1), *mFormat,
+            gl::Extents(area.width, area.height, 1), mIntendedFormatID, mActualFormatID,
             VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT, 1));
         resolvedImage.get().retain(&contextVk->getResourceUseList());
     }
@@ -6939,7 +7006,7 @@
     CommandBuffer *commandBuffer;
     ANGLE_TRY(contextVk->getOutsideRenderPassCommandBuffer(access, &commandBuffer));
 
-    const angle::Format *readFormat = &mFormat->actualImageFormat();
+    const angle::Format *readFormat = &getActualFormat();
 
     if (copyAspectFlags != VK_IMAGE_ASPECT_COLOR_BIT)
     {
@@ -6995,7 +7062,7 @@
 
     // If PBO and if possible, copy directly on the GPU.
     if (packPixelsParams.packBuffer &&
-        CanCopyWithTransformForReadPixels(packPixelsParams, mFormat, readFormat))
+        canCopyWithTransformForReadPixels(packPixelsParams, readFormat))
     {
         VkDeviceSize packBufferOffset = 0;
         BufferHelper &packBuffer =
@@ -7090,19 +7157,23 @@
 ImageHelper::SubresourceUpdate::~SubresourceUpdate() {}
 
 ImageHelper::SubresourceUpdate::SubresourceUpdate(BufferHelper *bufferHelperIn,
-                                                  const VkBufferImageCopy &copyRegionIn)
+                                                  const VkBufferImageCopy &copyRegionIn,
+                                                  angle::FormatID formatID)
     : updateSource(UpdateSource::Buffer), image(nullptr)
 {
     data.buffer.bufferHelper = bufferHelperIn;
     data.buffer.copyRegion   = copyRegionIn;
+    data.buffer.formatID     = formatID;
 }
 
 ImageHelper::SubresourceUpdate::SubresourceUpdate(RefCounted<ImageHelper> *imageIn,
-                                                  const VkImageCopy &copyRegionIn)
+                                                  const VkImageCopy &copyRegionIn,
+                                                  angle::FormatID formatID)
     : updateSource(UpdateSource::Image), image(imageIn)
 {
     image->addRef();
     data.image.copyRegion = copyRegionIn;
+    data.image.formatID   = formatID;
 }
 
 ImageHelper::SubresourceUpdate::SubresourceUpdate(VkImageAspectFlags aspectFlags,
@@ -7270,6 +7341,18 @@
     onStateChange(angle::SubjectMessage::SubjectChanged);
 }
 
+bool ImageHelper::hasEmulatedImageChannels() const
+{
+    const angle::Format &angleFmt   = getIntendedFormat();
+    const angle::Format &textureFmt = getActualFormat();
+
+    return (angleFmt.alphaBits == 0 && textureFmt.alphaBits > 0) ||
+           (angleFmt.blueBits == 0 && textureFmt.blueBits > 0) ||
+           (angleFmt.greenBits == 0 && textureFmt.greenBits > 0) ||
+           (angleFmt.depthBits == 0 && textureFmt.depthBits > 0) ||
+           (angleFmt.stencilBits == 0 && textureFmt.stencilBits > 0);
+}
+
 // FramebufferHelper implementation.
 FramebufferHelper::FramebufferHelper() = default;
 
@@ -7471,7 +7554,7 @@
 angle::Result ImageViewHelper::initReadViews(ContextVk *contextVk,
                                              gl::TextureType viewType,
                                              const ImageHelper &image,
-                                             const Format &format,
+                                             const angle::Format &format,
                                              const gl::SwizzleState &formatSwizzle,
                                              const gl::SwizzleState &readSwizzle,
                                              LevelIndex baseLevel,
@@ -7517,7 +7600,7 @@
 angle::Result ImageViewHelper::initReadViewsImpl(ContextVk *contextVk,
                                                  gl::TextureType viewType,
                                                  const ImageHelper &image,
-                                                 const Format &format,
+                                                 const angle::Format &format,
                                                  const gl::SwizzleState &formatSwizzle,
                                                  const gl::SwizzleState &readSwizzle,
                                                  LevelIndex baseLevel,
@@ -7527,22 +7610,23 @@
 {
     ASSERT(mImageViewSerial.valid());
 
-    const VkImageAspectFlags aspectFlags = GetFormatAspectFlags(format.intendedFormat());
-    mLinearColorspace                    = !format.actualImageFormat().isSRGB;
+    const VkImageAspectFlags aspectFlags = GetFormatAspectFlags(image.getIntendedFormat());
+    mLinearColorspace                    = !format.isSRGB;
+    VkFormat vkFormat                    = GetVkFormatFromFormatID(format.id);
 
     if (HasBothDepthAndStencilAspects(aspectFlags))
     {
         ANGLE_TRY(image.initLayerImageViewWithFormat(
-            contextVk, viewType, format, VK_IMAGE_ASPECT_DEPTH_BIT, readSwizzle,
+            contextVk, viewType, vkFormat, VK_IMAGE_ASPECT_DEPTH_BIT, readSwizzle,
             &getReadImageView(), baseLevel, levelCount, baseLayer, layerCount));
         ANGLE_TRY(image.initLayerImageViewWithFormat(
-            contextVk, viewType, format, VK_IMAGE_ASPECT_STENCIL_BIT, readSwizzle,
+            contextVk, viewType, vkFormat, VK_IMAGE_ASPECT_STENCIL_BIT, readSwizzle,
             &mPerLevelStencilReadImageViews[mCurrentMaxLevel.get()], baseLevel, levelCount,
             baseLayer, layerCount));
     }
     else
     {
-        ANGLE_TRY(image.initLayerImageViewWithFormat(contextVk, viewType, format, aspectFlags,
+        ANGLE_TRY(image.initLayerImageViewWithFormat(contextVk, viewType, vkFormat, aspectFlags,
                                                      readSwizzle, &getReadImageView(), baseLevel,
                                                      levelCount, baseLayer, layerCount));
     }
@@ -7554,12 +7638,12 @@
     {
         fetchType = Get2DTextureType(layerCount, image.getSamples());
 
-        ANGLE_TRY(image.initLayerImageViewWithFormat(contextVk, fetchType, format, aspectFlags,
+        ANGLE_TRY(image.initLayerImageViewWithFormat(contextVk, fetchType, vkFormat, aspectFlags,
                                                      readSwizzle, &getFetchImageView(), baseLevel,
                                                      levelCount, baseLayer, layerCount));
     }
 
-    ANGLE_TRY(image.initLayerImageViewWithFormat(contextVk, fetchType, format, aspectFlags,
+    ANGLE_TRY(image.initLayerImageViewWithFormat(contextVk, fetchType, vkFormat, aspectFlags,
                                                  formatSwizzle, &getCopyImageView(), baseLevel,
                                                  levelCount, baseLayer, layerCount));
 
@@ -7569,7 +7653,7 @@
 angle::Result ImageViewHelper::initSRGBReadViewsImpl(ContextVk *contextVk,
                                                      gl::TextureType viewType,
                                                      const ImageHelper &image,
-                                                     const Format &format,
+                                                     const angle::Format &format,
                                                      const gl::SwizzleState &formatSwizzle,
                                                      const gl::SwizzleState &readSwizzle,
                                                      LevelIndex baseLevel,
@@ -7581,20 +7665,19 @@
     // When we select the linear/srgb counterpart formats, we must first make sure they're
     // actually supported by the ICD. If they are not supported by the ICD, then we treat that as if
     // there is no counterpart format. (In this case, the relevant extension should not be exposed)
-    angle::FormatID srgbOverrideFormat = ConvertToSRGB(image.getFormat().actualImageFormatID);
+    angle::FormatID srgbOverrideFormat = ConvertToSRGB(image.getActualFormatID());
     ASSERT((srgbOverrideFormat == angle::FormatID::NONE) ||
            (HasNonRenderableTextureFormatSupport(contextVk->getRenderer(), srgbOverrideFormat)));
 
-    angle::FormatID linearOverrideFormat = ConvertToLinear(image.getFormat().actualImageFormatID);
+    angle::FormatID linearOverrideFormat = ConvertToLinear(image.getActualFormatID());
     ASSERT((linearOverrideFormat == angle::FormatID::NONE) ||
            (HasNonRenderableTextureFormatSupport(contextVk->getRenderer(), linearOverrideFormat)));
 
-    angle::FormatID linearFormat = (linearOverrideFormat != angle::FormatID::NONE)
-                                       ? linearOverrideFormat
-                                       : format.actualImageFormatID;
+    angle::FormatID linearFormat =
+        (linearOverrideFormat != angle::FormatID::NONE) ? linearOverrideFormat : format.id;
     ASSERT(linearFormat != angle::FormatID::NONE);
 
-    const VkImageAspectFlags aspectFlags = GetFormatAspectFlags(format.intendedFormat());
+    const VkImageAspectFlags aspectFlags = GetFormatAspectFlags(image.getIntendedFormat());
 
     if (!mPerLevelLinearReadImageViews[mCurrentMaxLevel.get()].valid())
     {
@@ -7694,7 +7777,7 @@
 {
     ASSERT(image.valid());
     ASSERT(mImageViewSerial.valid());
-    ASSERT(!image.getFormat().actualImageFormat().isBlock);
+    ASSERT(!image.getActualFormat().isBlock);
 
     retain(&contextVk->getResourceUseList());
 
@@ -7725,7 +7808,7 @@
 {
     ASSERT(image.valid());
     ASSERT(mImageViewSerial.valid());
-    ASSERT(!image.getFormat().actualImageFormat().isBlock);
+    ASSERT(!image.getActualFormat().isBlock);
 
     retain(&contextVk->getResourceUseList());
 
@@ -7759,7 +7842,7 @@
 {
     ASSERT(image.valid());
     ASSERT(mImageViewSerial.valid());
-    ASSERT(!image.getFormat().actualImageFormat().isBlock);
+    ASSERT(!image.getActualFormat().isBlock);
 
     retain(&contextVk->getResourceUseList());
 
@@ -7917,7 +8000,7 @@
 {
     ASSERT(format.valid());
 
-    VkFormat viewVkFormat = format.actualBufferVkFormat(false);
+    VkFormat viewVkFormat = format.getActualBufferVkFormat(false);
 
     auto iter = mViews.find(viewVkFormat);
     if (iter != mViews.end())
@@ -7929,7 +8012,7 @@
     // If the size is not a multiple of pixelBytes, remove the extra bytes.  The last element cannot
     // be read anyway, and this is a requirement of Vulkan (for size to be a multiple of format
     // texel block size).
-    const angle::Format &bufferFormat = format.actualBufferFormat(false);
+    const angle::Format &bufferFormat = format.getActualBufferFormat(false);
     const GLuint pixelBytes           = bufferFormat.pixelBytes;
     VkDeviceSize size                 = mSize - mSize % pixelBytes;
 
diff --git a/src/libANGLE/renderer/vulkan/vk_helpers.h b/src/libANGLE/renderer/vulkan/vk_helpers.h
index 012c457..0737c51 100644
--- a/src/libANGLE/renderer/vulkan/vk_helpers.h
+++ b/src/libANGLE/renderer/vulkan/vk_helpers.h
@@ -12,6 +12,7 @@
 #include "common/MemoryBuffer.h"
 #include "libANGLE/renderer/vulkan/ResourceVk.h"
 #include "libANGLE/renderer/vulkan/vk_cache_utils.h"
+#include "libANGLE/renderer/vulkan/vk_format_utils.h"
 
 namespace gl
 {
@@ -1410,9 +1411,9 @@
                                VkFormatFeatureFlags featureBits);
 
 bool CanCopyWithTransfer(RendererVk *renderer,
-                         const Format &srcFormat,
+                         angle::FormatID srcFormatID,
                          VkImageTiling srcTilingMode,
-                         const Format &destFormat,
+                         angle::FormatID destFormatID,
                          VkImageTiling destTilingMode);
 
 class ImageHelper final : public Resource, public angle::Subject
@@ -1453,7 +1454,8 @@
     angle::Result initExternal(Context *context,
                                gl::TextureType textureType,
                                const VkExtent3D &extents,
-                               const Format &format,
+                               angle::FormatID intendedFormatID,
+                               angle::FormatID actualFormatID,
                                GLint samples,
                                VkImageUsageFlags usage,
                                VkImageCreateFlags additionalCreateFlags,
@@ -1489,7 +1491,7 @@
                                      gl::SrgbWriteControlMode mode) const;
     angle::Result initLayerImageViewWithFormat(Context *context,
                                                gl::TextureType textureType,
-                                               const Format &format,
+                                               VkFormat imageFormat,
                                                VkImageAspectFlags aspectMask,
                                                const gl::SwizzleState &swizzleMap,
                                                ImageView *imageViewOut,
@@ -1524,7 +1526,8 @@
                                 bool hasProtectedContent,
                                 const MemoryProperties &memoryProperties,
                                 const gl::Extents &glExtents,
-                                const Format &format,
+                                angle::FormatID intendedFormatID,
+                                angle::FormatID actualFormatID,
                                 VkImageUsageFlags usage,
                                 uint32_t layerCount);
     // Create an image for staging purposes.  Used by:
@@ -1536,7 +1539,8 @@
                               const MemoryProperties &memoryProperties,
                               VkImageType imageType,
                               const VkExtent3D &extents,
-                              const Format &format,
+                              angle::FormatID intendedFormatID,
+                              angle::FormatID actualFormatID,
                               GLint samples,
                               VkImageUsageFlags usage,
                               uint32_t mipLevels,
@@ -1586,7 +1590,13 @@
     const VkExtent3D getRotatedExtents() const;
     uint32_t getLayerCount() const { return mLayerCount; }
     uint32_t getLevelCount() const { return mLevelCount; }
-    const Format &getFormat() const { return *mFormat; }
+    angle::FormatID getIntendedFormatID() const { return mIntendedFormatID; }
+    const angle::Format &getIntendedFormat() const { return angle::Format::Get(mIntendedFormatID); }
+    angle::FormatID getActualFormatID() const { return mActualFormatID; }
+    VkFormat getActualVkFormat() const { return GetVkFormatFromFormatID(mActualFormatID); }
+    const angle::Format &getActualFormat() const { return angle::Format::Get(mActualFormatID); }
+    bool hasEmulatedImageChannels() const;
+    bool hasEmulatedImageFormat() const { return mActualFormatID != mIntendedFormatID; }
     GLint getSamples() const { return mSamples; }
 
     ImageSerial getImageSerial() const
@@ -1673,6 +1683,7 @@
                                              GLenum type,
                                              const uint8_t *pixels,
                                              const Format &vkFormat,
+                                             ImageAccess access,
                                              const GLuint inputRowPitch,
                                              const GLuint inputDepthPitch,
                                              const GLuint inputSkipBytes);
@@ -1686,7 +1697,8 @@
                                          DynamicBuffer *stagingBufferOverride,
                                          GLenum type,
                                          const uint8_t *pixels,
-                                         const Format &vkFormat);
+                                         const Format &vkFormat,
+                                         ImageAccess access);
 
     angle::Result stageSubresourceUpdateAndGetData(ContextVk *contextVk,
                                                    size_t allocationSize,
@@ -1694,7 +1706,8 @@
                                                    const gl::Extents &glExtents,
                                                    const gl::Offset &offset,
                                                    uint8_t **destData,
-                                                   DynamicBuffer *stagingBufferOverride);
+                                                   DynamicBuffer *stagingBufferOverride,
+                                                   angle::FormatID formatID);
 
     angle::Result stageSubresourceUpdateFromFramebuffer(const gl::Context *context,
                                                         const gl::ImageIndex &index,
@@ -1702,6 +1715,7 @@
                                                         const gl::Offset &dstOffset,
                                                         const gl::Extents &dstExtent,
                                                         const gl::InternalFormat &formatInfo,
+                                                        ImageAccess access,
                                                         FramebufferVk *framebufferVk,
                                                         DynamicBuffer *stagingBufferOverride);
 
@@ -1726,7 +1740,8 @@
     angle::Result stageRobustResourceClearWithFormat(ContextVk *contextVk,
                                                      const gl::ImageIndex &index,
                                                      const gl::Extents &glExtents,
-                                                     const Format &format);
+                                                     const angle::Format &intendedFormat,
+                                                     const angle::Format &actualFormat);
     void stageRobustResourceClear(const gl::ImageIndex &index);
 
     // Stage the currently allocated image as updates to base level and on, making this !valid().
@@ -1856,6 +1871,7 @@
                                         gl::Buffer *packBuffer,
                                         gl::LevelIndex levelGL,
                                         uint32_t layer,
+                                        uint32_t layerCount,
                                         GLenum format,
                                         GLenum type,
                                         void *pixels);
@@ -1909,6 +1925,9 @@
     void restoreSubresourceStencilContent(gl::LevelIndex level,
                                           uint32_t layerIndex,
                                           uint32_t layerCount);
+    bool hasStagedUpdatesWithMismatchedFormat(gl::LevelIndex levelStart,
+                                              gl::LevelIndex levelEnd,
+                                              angle::FormatID formatID) const;
 
   private:
     enum class UpdateSource
@@ -1935,18 +1954,24 @@
     {
         BufferHelper *bufferHelper;
         VkBufferImageCopy copyRegion;
+        angle::FormatID formatID;
     };
     struct ImageUpdate
     {
         VkImageCopy copyRegion;
+        angle::FormatID formatID;
     };
 
     struct SubresourceUpdate : angle::NonCopyable
     {
         SubresourceUpdate();
         ~SubresourceUpdate();
-        SubresourceUpdate(BufferHelper *bufferHelperIn, const VkBufferImageCopy &copyRegion);
-        SubresourceUpdate(RefCounted<ImageHelper> *imageIn, const VkImageCopy &copyRegion);
+        SubresourceUpdate(BufferHelper *bufferHelperIn,
+                          const VkBufferImageCopy &copyRegion,
+                          angle::FormatID formatID);
+        SubresourceUpdate(RefCounted<ImageHelper> *imageIn,
+                          const VkImageCopy &copyRegion,
+                          angle::FormatID formatID);
         SubresourceUpdate(VkImageAspectFlags aspectFlags,
                           const VkClearValue &clearValue,
                           const gl::ImageIndex &imageIndex);
@@ -2067,6 +2092,8 @@
         VkFormat imageFormat,
         const VkImageViewUsageCreateInfo *imageViewUsageCreateInfo) const;
 
+    bool canCopyWithTransformForReadPixels(const PackPixelsParams &packPixelsParams,
+                                           const angle::Format *readFormat);
     // Vulkan objects.
     Image mImage;
     DeviceMemory mDeviceMemory;
@@ -2083,7 +2110,8 @@
     // different between the rotated and non-rotated extents.
     VkExtent3D mExtents;
     bool mRotatedAspectRatio;
-    const Format *mFormat;
+    angle::FormatID mIntendedFormatID;
+    angle::FormatID mActualFormatID;
     GLint mSamples;
     ImageSerial mImageSerial;
 
@@ -2250,7 +2278,7 @@
     angle::Result initReadViews(ContextVk *contextVk,
                                 gl::TextureType viewType,
                                 const ImageHelper &image,
-                                const Format &format,
+                                const angle::Format &format,
                                 const gl::SwizzleState &formatSwizzle,
                                 const gl::SwizzleState &readSwizzle,
                                 LevelIndex baseLevel,
@@ -2348,7 +2376,7 @@
     angle::Result initReadViewsImpl(ContextVk *contextVk,
                                     gl::TextureType viewType,
                                     const ImageHelper &image,
-                                    const Format &format,
+                                    const angle::Format &format,
                                     const gl::SwizzleState &formatSwizzle,
                                     const gl::SwizzleState &readSwizzle,
                                     LevelIndex baseLevel,
@@ -2360,7 +2388,7 @@
     angle::Result initSRGBReadViewsImpl(ContextVk *contextVk,
                                         gl::TextureType viewType,
                                         const ImageHelper &image,
-                                        const Format &format,
+                                        const angle::Format &format,
                                         const gl::SwizzleState &formatSwizzle,
                                         const gl::SwizzleState &readSwizzle,
                                         LevelIndex baseLevel,
diff --git a/src/libANGLE/renderer/vulkan/vk_utils.cpp b/src/libANGLE/renderer/vulkan/vk_utils.cpp
index 92f3c53..a9f8159 100644
--- a/src/libANGLE/renderer/vulkan/vk_utils.cpp
+++ b/src/libANGLE/renderer/vulkan/vk_utils.cpp
@@ -1032,10 +1032,10 @@
 
 #endif  // !defined(ANGLE_SHARED_LIBVULKAN)
 
-GLenum CalculateGenerateMipmapFilter(ContextVk *contextVk, const vk::Format &format)
+GLenum CalculateGenerateMipmapFilter(ContextVk *contextVk, angle::FormatID formatID)
 {
     const bool formatSupportsLinearFiltering = contextVk->getRenderer()->hasImageFormatFeatureBits(
-        format.actualImageFormatID, VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT);
+        formatID, VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT);
     const bool hintFastest = contextVk->getState().getGenerateMipmapHint() == GL_FASTEST;
 
     return formatSupportsLinearFiltering && !hintFastest ? GL_LINEAR : GL_NEAREST;
diff --git a/src/libANGLE/renderer/vulkan/vk_utils.h b/src/libANGLE/renderer/vulkan/vk_utils.h
index 5d6ef38..3e71fda 100644
--- a/src/libANGLE/renderer/vulkan/vk_utils.h
+++ b/src/libANGLE/renderer/vulkan/vk_utils.h
@@ -112,8 +112,6 @@
 
 namespace vk
 {
-struct Format;
-
 // A packed attachment index interface with vulkan API
 class PackedAttachmentIndex final
 {
@@ -939,7 +937,7 @@
 
 #endif  // !defined(ANGLE_SHARED_LIBVULKAN)
 
-GLenum CalculateGenerateMipmapFilter(ContextVk *contextVk, const vk::Format &format);
+GLenum CalculateGenerateMipmapFilter(ContextVk *contextVk, angle::FormatID formatID);
 size_t PackSampleCount(GLint sampleCount);
 
 namespace gl_vk
diff --git a/src/libANGLE/renderer/vulkan/win32/DisplayVkWin32.cpp b/src/libANGLE/renderer/vulkan/win32/DisplayVkWin32.cpp
index 20a4375..46aa1b8 100644
--- a/src/libANGLE/renderer/vulkan/win32/DisplayVkWin32.cpp
+++ b/src/libANGLE/renderer/vulkan/win32/DisplayVkWin32.cpp
@@ -163,7 +163,7 @@
 
     for (const VkSurfaceFormatKHR &surfaceFormat : mSurfaceFormats)
     {
-        if (surfaceFormat.format == formatVk.actualImageVkFormat())
+        if (surfaceFormat.format == formatVk.getActualRenderableImageVkFormat())
         {
             return;
         }
diff --git a/src/libANGLE/renderer/vulkan/xcb/DisplayVkXcb.cpp b/src/libANGLE/renderer/vulkan/xcb/DisplayVkXcb.cpp
index 2b3ec8f..7107895 100644
--- a/src/libANGLE/renderer/vulkan/xcb/DisplayVkXcb.cpp
+++ b/src/libANGLE/renderer/vulkan/xcb/DisplayVkXcb.cpp
@@ -43,29 +43,42 @@
 }  // namespace
 
 DisplayVkXcb::DisplayVkXcb(const egl::DisplayState &state)
-    : DisplayVk(state), mXcbConnection(nullptr)
+    : DisplayVk(state), mXcbConnection(nullptr), mHasXDisplay(false)
 {}
 
 egl::Error DisplayVkXcb::initialize(egl::Display *display)
 {
-    mXcbConnection = xcb_connect(nullptr, nullptr);
-    if (mXcbConnection == nullptr)
+    mHasXDisplay = !angle::GetEnvironmentVar("DISPLAY").empty();
+    if (mHasXDisplay)
     {
-        return egl::EglNotInitialized();
+        mXcbConnection = xcb_connect(nullptr, nullptr);
+        ASSERT(mXcbConnection != nullptr);
+        int xcb_connection_error = xcb_connection_has_error(mXcbConnection);
+        if (xcb_connection_error)
+        {
+            ERR() << "xcb_connect() failed, error " << xcb_connection_error;
+            xcb_disconnect(mXcbConnection);
+            mXcbConnection = nullptr;
+            return egl::EglNotInitialized();
+        }
     }
     return DisplayVk::initialize(display);
 }
 
 void DisplayVkXcb::terminate()
 {
-    ASSERT(mXcbConnection != nullptr);
-    xcb_disconnect(mXcbConnection);
-    mXcbConnection = nullptr;
+    if (mHasXDisplay)
+    {
+        ASSERT(mXcbConnection != nullptr);
+        xcb_disconnect(mXcbConnection);
+        mXcbConnection = nullptr;
+    }
     DisplayVk::terminate();
 }
 
 bool DisplayVkXcb::isValidNativeWindow(EGLNativeWindowType window) const
 {
+    ASSERT(mHasXDisplay);
     // There doesn't appear to be an xcb function explicitly for checking the validity of a
     // window ID, but xcb_query_tree_reply will return nullptr if the window doesn't exist.
     xcb_query_tree_cookie_t cookie =
@@ -82,6 +95,7 @@
 SurfaceImpl *DisplayVkXcb::createWindowSurfaceVk(const egl::SurfaceState &state,
                                                  EGLNativeWindowType window)
 {
+    ASSERT(mHasXDisplay);
     return new WindowSurfaceVkXcb(state, window, mXcbConnection);
 }
 
@@ -104,8 +118,7 @@
 void DisplayVkXcb::checkConfigSupport(egl::Config *config)
 {
     // If no window system, cannot support windows.
-    static bool sNoX11Display = angle::GetEnvironmentVar("DISPLAY").empty();
-    if (sNoX11Display)
+    if (!mHasXDisplay)
     {
         // No window support if no X11.
         config->surfaceType &= ~EGL_WINDOW_BIT;
diff --git a/src/libANGLE/renderer/vulkan/xcb/DisplayVkXcb.h b/src/libANGLE/renderer/vulkan/xcb/DisplayVkXcb.h
index 01559b9..54eea5c 100644
--- a/src/libANGLE/renderer/vulkan/xcb/DisplayVkXcb.h
+++ b/src/libANGLE/renderer/vulkan/xcb/DisplayVkXcb.h
@@ -38,6 +38,10 @@
 
   private:
     xcb_connection_t *mXcbConnection;
+    // If there is no X Display, obviously it's impossible to connect to it with Xcb,
+    // so rendering to windows is not supported, but rendering to pbuffers is still supported.
+    // This mode is used in headless ozone testing.
+    bool mHasXDisplay;
 };
 
 }  // namespace rx
diff --git a/src/libANGLE/serializer/JsonSerializer.cpp b/src/libANGLE/serializer/JsonSerializer.cpp
index f203c53..a2141e5 100644
--- a/src/libANGLE/serializer/JsonSerializer.cpp
+++ b/src/libANGLE/serializer/JsonSerializer.cpp
@@ -26,11 +26,6 @@
 
 JsonSerializer::~JsonSerializer() {}
 
-void JsonSerializer::startDocument(const std::string &name)
-{
-    startGroup(name);
-}
-
 void JsonSerializer::startGroup(const std::string &name)
 {
     mGroupValueStack.push(SortedValueGroup());
@@ -39,12 +34,16 @@
 
 void JsonSerializer::endGroup()
 {
-    SortedValueGroup group = std::move(mGroupValueStack.top());
-    std::string name       = std::move(mGroupNameStack.top());
+    ASSERT(!mGroupValueStack.empty());
+    ASSERT(!mGroupNameStack.empty());
+
+    rapidjson::Value group = makeValueGroup(mGroupValueStack.top());
+    std::string name       = mGroupNameStack.top();
+
     mGroupValueStack.pop();
     mGroupNameStack.pop();
 
-    mGroupValueStack.top().insert(std::make_pair(name, makeValueGroup(group)));
+    addValue(name, std::move(group));
 }
 
 void JsonSerializer::addBlob(const std::string &name, const uint8_t *blob, size_t length)
@@ -53,8 +52,7 @@
     angle::base::SHA1HashBytes(blob, length, hash);
     std::ostringstream os;
 
-    // Since we don't want to de-serialize the data we just store a checksume
-    // of the blob
+    // Since we don't want to de-serialize the data we just store a checksum of the blob
     os << "SHA1:";
     static constexpr char kASCII[] = "0123456789ABCDEF";
     for (size_t i = 0; i < angle::base::kSHA1Length; ++i)
@@ -62,23 +60,23 @@
         os << kASCII[hash[i] & 0xf] << kASCII[hash[i] >> 4];
     }
 
-    std::ostringstream hash_name;
-    hash_name << name << "-hash";
-    addString(hash_name.str(), os.str());
+    std::ostringstream hashName;
+    hashName << name << "-hash";
+    addString(hashName.str(), os.str());
 
-    std::vector<uint8_t> data(length < 16 ? length : (size_t)16);
+    std::vector<uint8_t> data((length < 16) ? length : static_cast<size_t>(16));
     std::copy(blob, blob + data.size(), data.begin());
 
-    std::ostringstream raw_name;
-    raw_name << name << "-raw[0-" << data.size() - 1 << ']';
-    addVector(raw_name.str(), data);
+    std::ostringstream rawName;
+    rawName << name << "-raw[0-" << data.size() - 1 << ']';
+    addVector(rawName.str(), data);
 }
 
 void JsonSerializer::addCString(const std::string &name, const char *value)
 {
     rapidjson::Value tag(name.c_str(), mAllocator);
     rapidjson::Value val(value, mAllocator);
-    mGroupValueStack.top().insert(std::make_pair(name, std::move(val)));
+    addValue(name, std::move(val));
 }
 
 void JsonSerializer::addString(const std::string &name, const std::string &value)
@@ -89,51 +87,53 @@
 void JsonSerializer::addVectorOfStrings(const std::string &name,
                                         const std::vector<std::string> &value)
 {
-    rapidjson::Value array(rapidjson::kArrayType);
-    array.SetArray();
+    rapidjson::Value arrayValue(rapidjson::kArrayType);
+    arrayValue.SetArray();
 
     for (const std::string &v : value)
     {
         rapidjson::Value str(v.c_str(), mAllocator);
-        array.PushBack(str, mAllocator);
+        arrayValue.PushBack(str, mAllocator);
     }
 
-    mGroupValueStack.top().insert(std::make_pair(name, std::move(array)));
+    addValue(name, std::move(arrayValue));
 }
 
-const char *JsonSerializer::data() const
+void JsonSerializer::addBool(const std::string &name, bool value)
 {
+    rapidjson::Value boolValue(value);
+    addValue(name, std::move(boolValue));
+}
+
+const char *JsonSerializer::data()
+{
+    ensureEndDocument();
     return mResult.c_str();
 }
 
-std::vector<uint8_t> JsonSerializer::getData() const
+std::vector<uint8_t> JsonSerializer::getData()
 {
+    ensureEndDocument();
     return std::vector<uint8_t>(mResult.begin(), mResult.end());
 }
 
-void JsonSerializer::endDocument()
+void JsonSerializer::ensureEndDocument()
 {
-    // finalize last group
-    ASSERT(!mGroupValueStack.empty());
-    ASSERT(!mGroupNameStack.empty());
-
-    rapidjson::Value name_value(mGroupNameStack.top().c_str(), mAllocator);
-    mDoc.AddMember(name_value, makeValueGroup(mGroupValueStack.top()), mAllocator);
-
-    mGroupValueStack.pop();
-    mGroupNameStack.pop();
-    ASSERT(mGroupValueStack.empty());
-    ASSERT(mGroupNameStack.empty());
+    if (!mResult.empty())
+    {
+        return;
+    }
 
     std::stringstream os;
     js::OStreamWrapper osw(os);
-    js::PrettyWriter<js::OStreamWrapper> pretty_os(osw);
-    mDoc.Accept(pretty_os);
+    js::PrettyWriter<js::OStreamWrapper> prettyOs(osw);
+    mDoc.Accept(prettyOs);
     mResult = os.str();
 }
 
-size_t JsonSerializer::length() const
+size_t JsonSerializer::length()
 {
+    ensureEndDocument();
     return mResult.length();
 }
 
@@ -148,4 +148,16 @@
     return valueGroup;
 }
 
+void JsonSerializer::addValue(const std::string &name, rapidjson::Value &&value)
+{
+    if (!mGroupValueStack.empty())
+    {
+        mGroupValueStack.top().insert(std::make_pair(name, std::move(value)));
+    }
+    else
+    {
+        rapidjson::Value nameValue(name, mAllocator);
+        mDoc.AddMember(nameValue, std::move(value), mAllocator);
+    }
+}
 }  // namespace angle
diff --git a/src/libANGLE/serializer/JsonSerializer.h b/src/libANGLE/serializer/JsonSerializer.h
index 885ff10..6f3f594 100644
--- a/src/libANGLE/serializer/JsonSerializer.h
+++ b/src/libANGLE/serializer/JsonSerializer.h
@@ -52,9 +52,6 @@
     JsonSerializer();
     ~JsonSerializer();
 
-    void startDocument(const std::string &name);
-    void endDocument();
-
     void addCString(const std::string &name, const char *value);
 
     void addString(const std::string &name, const std::string &value);
@@ -65,29 +62,25 @@
 
     void endGroup();
 
-    const char *data() const;
-
-    std::vector<uint8_t> getData() const;
-
-    size_t length() const;
-
     template <typename T>
     void addScalar(const std::string &name, T value)
     {
         typename StoreAs<T>::Type v = value;
-        mGroupValueStack.top().insert(std::make_pair(name, rapidjson::Value(v)));
+        addValue(name, rapidjson::Value(v));
     }
 
     template <typename T>
     void addVector(const std::string &name, const std::vector<T> &value)
     {
-        rapidjson::Value array(rapidjson::kArrayType);
-        array.SetArray();
+        rapidjson::Value arr(rapidjson::kArrayType);
+        arr.SetArray();
 
         for (typename StoreAs<T>::Type v : value)
-            array.PushBack(v, mAllocator);
+        {
+            arr.PushBack(v, mAllocator);
+        }
 
-        mGroupValueStack.top().insert(std::make_pair(name, std::move(array)));
+        addValue(name, std::move(arr));
     }
 
     template <typename T>
@@ -105,10 +98,21 @@
 
     void addVectorOfStrings(const std::string &name, const std::vector<std::string> &value);
 
+    void addBool(const std::string &name, bool value);
+
+    const char *data();
+
+    std::vector<uint8_t> getData();
+
+    size_t length();
+
   private:
     using SortedValueGroup = std::multimap<std::string, rapidjson::Value>;
 
     rapidjson::Value makeValueGroup(SortedValueGroup &group);
+    void addValue(const std::string &name, rapidjson::Value &&value);
+
+    void ensureEndDocument();
 
     using ValuePointer = std::unique_ptr<rapidjson::Value>;
 
diff --git a/src/libANGLE/serializer/JsonSerializer_unittest.cpp b/src/libANGLE/serializer/JsonSerializer_unittest.cpp
index 442c004..9718490 100644
--- a/src/libANGLE/serializer/JsonSerializer_unittest.cpp
+++ b/src/libANGLE/serializer/JsonSerializer_unittest.cpp
@@ -264,16 +264,16 @@
 
 void JsonSerializerTest::SetUp()
 {
-    js.startDocument("context");
+    js.startGroup("context");
 }
 
 void JsonSerializerTest::check(const std::string &expect)
 {
-    js.endDocument();
+    js.endGroup();
     EXPECT_EQ(js.data(), expect);
     EXPECT_EQ(js.length(), expect.length());
-    std::vector<uint8_t> expect_as_ubyte(expect.begin(), expect.end());
-    EXPECT_EQ(js.getData(), expect_as_ubyte);
+    std::vector<uint8_t> expectAsUbyte(expect.begin(), expect.end());
+    EXPECT_EQ(js.getData(), expectAsUbyte);
 }
 
 #endif
diff --git a/src/libANGLE/validationEGL.cpp b/src/libANGLE/validationEGL.cpp
index b5f0414..9a1669b 100644
--- a/src/libANGLE/validationEGL.cpp
+++ b/src/libANGLE/validationEGL.cpp
@@ -259,7 +259,7 @@
             break;
 
         default:
-            val->setError(EGL_BAD_ATTRIBUTE, "Unknown attribute.");
+            val->setError(EGL_BAD_ATTRIBUTE, "Unknown attribute: 0x%04X", attribute);
             return false;
     }
 
@@ -1060,7 +1060,8 @@
     {
         if (val)
         {
-            val->setError(EGL_BAD_DISPLAY, "display is not a valid display.");
+            val->setError(EGL_BAD_DISPLAY, "display is not a valid display: 0x%04" PRIXPTR,
+                          display);
         }
         return false;
     }
@@ -2008,7 +2009,7 @@
                 break;
 
             default:
-                val->setError(EGL_BAD_ATTRIBUTE, "Unknown attribute.");
+                val->setError(EGL_BAD_ATTRIBUTE, "Unknown attribute: 0x%04X", attribute);
                 return false;
         }
     }
@@ -2248,6 +2249,23 @@
                 }
                 break;
 
+            case EGL_SWAP_INTERVAL_ANGLE:
+                if (!displayExtensions.createSurfaceSwapIntervalANGLE)
+                {
+                    val->setError(EGL_BAD_ATTRIBUTE,
+                                  "Attribute EGL_SWAP_INTERVAL_ANGLE requires "
+                                  "extension EGL_ANGLE_create_surface_swap_interval.");
+                    return false;
+                }
+                if (value < config->minSwapInterval || value > config->maxSwapInterval)
+                {
+                    val->setError(EGL_BAD_ATTRIBUTE,
+                                  "EGL_SWAP_INTERVAL_ANGLE must "
+                                  "be within the EGLConfig min and max swap intervals.");
+                    return false;
+                }
+                break;
+
             default:
                 val->setError(EGL_BAD_ATTRIBUTE);
                 return false;
@@ -3240,6 +3258,16 @@
                 return false;
             }
 
+            bool protectedContentAttrib =
+                (attributes.getAsInt(EGL_PROTECTED_CONTENT_EXT, EGL_FALSE) != EGL_FALSE);
+            if (protectedContentAttrib != texture->hasProtectedContent())
+            {
+                val->setError(EGL_BAD_PARAMETER,
+                              "EGL_PROTECTED_CONTENT_EXT attribute does not match protected state "
+                              "of target.");
+                return false;
+            }
+
             ANGLE_VALIDATION_TRY(ValidateCreateImageMipLevelCommon(val, context, texture, level));
         }
         break;
@@ -3301,6 +3329,16 @@
                               "zero.");
                 return false;
             }
+
+            bool protectedContentAttrib =
+                (attributes.getAsInt(EGL_PROTECTED_CONTENT_EXT, EGL_FALSE) != EGL_FALSE);
+            if (protectedContentAttrib != texture->hasProtectedContent())
+            {
+                val->setError(EGL_BAD_PARAMETER,
+                              "EGL_PROTECTED_CONTENT_EXT attribute does not match protected state "
+                              "of target.");
+                return false;
+            }
         }
         break;
 
@@ -3355,6 +3393,16 @@
                 return false;
             }
 
+            bool protectedContentAttrib =
+                (attributes.getAsInt(EGL_PROTECTED_CONTENT_EXT, EGL_FALSE) != EGL_FALSE);
+            if (protectedContentAttrib != texture->hasProtectedContent())
+            {
+                val->setError(EGL_BAD_PARAMETER,
+                              "EGL_PROTECTED_CONTENT_EXT attribute does not match protected state "
+                              "of target.");
+                return false;
+            }
+
             ANGLE_VALIDATION_TRY(ValidateCreateImageMipLevelCommon(val, context, texture, level));
         }
         break;
@@ -3396,6 +3444,16 @@
                 val->setError(EGL_BAD_PARAMETER, "target renderbuffer cannot be multisampled.");
                 return false;
             }
+
+            bool protectedContentAttrib =
+                (attributes.getAsInt(EGL_PROTECTED_CONTENT_EXT, EGL_FALSE) != EGL_FALSE);
+            if (protectedContentAttrib != renderbuffer->hasProtectedContent())
+            {
+                val->setError(EGL_BAD_ACCESS,
+                              "EGL_PROTECTED_CONTENT_EXT attribute does not match protected state "
+                              "of target.");
+                return false;
+            }
         }
         break;
 
@@ -5026,7 +5084,7 @@
             break;
 
         default:
-            val->setError(EGL_BAD_ATTRIBUTE, "Invalid surface attribute.");
+            val->setError(EGL_BAD_ATTRIBUTE, "Invalid surface attribute: 0x%04X", attribute);
             return false;
     }
 
@@ -5164,7 +5222,7 @@
         break;
 
         default:
-            val->setError(EGL_BAD_ATTRIBUTE, "Invalid surface attribute.");
+            val->setError(EGL_BAD_ATTRIBUTE, "Invalid surface attribute: 0x%04X", attribute);
             return false;
     }
 
@@ -5209,7 +5267,7 @@
             break;
 
         default:
-            val->setError(EGL_BAD_ATTRIBUTE, "Invalid context attribute.");
+            val->setError(EGL_BAD_ATTRIBUTE, "Invalid context attribute: 0x%04X", attribute);
             return false;
     }
 
diff --git a/src/libANGLE/validationES.cpp b/src/libANGLE/validationES.cpp
index 9765a9d..2867a5f 100644
--- a/src/libANGLE/validationES.cpp
+++ b/src/libANGLE/validationES.cpp
@@ -1008,6 +1008,15 @@
     return (level > 0) || (size % blockSize == 0);
 }
 
+bool ValidCompressedBaseLevelForWebGL(GLsizei size, GLuint blockSize, GLint level)
+{
+    // Avoid C++ undefined behavior.
+    constexpr int maxValidShifts = 31;
+    if (level > maxValidShifts)
+        return false;
+    return ((size << level) % blockSize) == 0;
+}
+
 bool ValidCompressedImageSize(const Context *context,
                               GLenum internalFormat,
                               GLint level,
@@ -1045,11 +1054,27 @@
 
     if (CompressedTextureFormatRequiresExactSize(internalFormat))
     {
-        if (!ValidCompressedDimension(width, formatInfo.compressedBlockWidth, level) ||
-            !ValidCompressedDimension(height, formatInfo.compressedBlockHeight, level) ||
-            !ValidCompressedDimension(depth, formatInfo.compressedBlockDepth, level))
+        // In WebGL compatibility mode, enforce that the base level implied
+        // by the compressed texture's mip level would conform to the block
+        // size. This is more strict than the non-WebGL check.
+        if (context->getExtensions().webglCompatibility)
         {
-            return false;
+            if (!ValidCompressedBaseLevelForWebGL(width, formatInfo.compressedBlockWidth, level) ||
+                !ValidCompressedBaseLevelForWebGL(height, formatInfo.compressedBlockHeight,
+                                                  level) ||
+                !ValidCompressedBaseLevelForWebGL(depth, formatInfo.compressedBlockDepth, level))
+            {
+                return false;
+            }
+        }
+        else
+        {
+            if (!ValidCompressedDimension(width, formatInfo.compressedBlockWidth, level) ||
+                !ValidCompressedDimension(height, formatInfo.compressedBlockHeight, level) ||
+                !ValidCompressedDimension(depth, formatInfo.compressedBlockDepth, level))
+            {
+                return false;
+            }
         }
     }
 
@@ -1777,6 +1802,33 @@
             context->validationError(GL_INVALID_VALUE, kInvalidMipLevel);
             return false;
         }
+
+        // GLES spec 3.1, Section 9.2.8 "Attaching Texture Images to a Framebuffer"
+        // An INVALID_VALUE error is generated if texture is not zero and level is
+        // not a supported texture level for textarget
+
+        // Common criteria for not supported texture levels(other criteria are handled case by case
+        // in non base functions): If texture refers to an immutable-format texture, level must be
+        // greater than or equal to zero and smaller than the value of TEXTURE_IMMUTABLE_LEVELS for
+        // texture.
+        if (tex->getImmutableFormat() && context->getClientVersion() >= ES_3_1)
+        {
+            if (level >= static_cast<GLint>(tex->getImmutableLevels()))
+            {
+                context->validationError(GL_INVALID_VALUE, kInvalidMipLevel);
+                return false;
+            }
+        }
+
+        // GLES spec 3.2, Section 9.2.8 "Attaching Texture Images to a Framebuffer"
+        // An INVALID_OPERATION error is generated if <texture> is the name of a buffer texture.
+        if ((context->getClientVersion() >= ES_3_2 ||
+             context->getExtensions().textureBufferAny()) &&
+            tex->getType() == TextureType::Buffer)
+        {
+            context->validationError(GL_INVALID_OPERATION, kInvalidTextureTarget);
+            return false;
+        }
     }
 
     const Framebuffer *framebuffer = context->getState().getTargetFramebuffer(target);
@@ -2728,6 +2780,14 @@
         }
         break;
 
+        case GL_PRIMITIVE_BOUNDING_BOX:
+            if (!context->getExtensions().primitiveBoundingBoxEXT)
+            {
+                context->validationError(GL_INVALID_ENUM, kExtensionNotEnabled);
+                return false;
+            }
+            break;
+
         default:
             break;
     }
@@ -3634,7 +3694,8 @@
         }
     }
 
-    if (textureFormatOut)
+    // Do not leak the previous texture format for non-subImage case.
+    if (textureFormatOut && isSubImage)
     {
         *textureFormatOut = texture->getFormat(target, level);
     }
@@ -3677,8 +3738,14 @@
     // An INVALID_OPERATION error is generated by any command that transfers vertices to the
     // GL or launches compute work if the current set of active
     // program objects cannot be executed, for reasons including:
+    // - There is no current program object specified by UseProgram, there is a current program
+    //    pipeline object, and that object is empty (no executable code is installed for any stage).
     // - A program object is active for at least one, but not all of the shader
     // stages that were present when the program was linked.
+    if (!programPipeline->getExecutable().getLinkedShaderStages().any())
+    {
+        return gl::err::kNoExecutableCodeInstalled;
+    }
     for (const ShaderType shaderType : gl::AllShaderTypes())
     {
         Program *shaderProgram = programPipeline->getShaderProgram(shaderType);
@@ -3878,12 +3945,8 @@
 
             bool goodResult = programPipeline->link(context) == angle::Result::Continue;
 
-            //  If there is no active program for the vertex or fragment shader stages, the results
-            //  of vertex and fragment shader execution will respectively be undefined. However,
-            //  this is not an error, so ANGLE only signals PPO link failures if both VS and FS
-            //  stages are present.
             ASSERT(executable);
-            if (!goodResult && executable->hasVertexAndFragmentShader())
+            if (!goodResult)
             {
                 return kProgramPipelineLinkFailed;
             }
@@ -3967,6 +4030,12 @@
             {
                 return kVertexBufferBoundForTransformFeedback;
             }
+
+            // Validate that we are rendering with a linked program.
+            if (!program->isLinked())
+            {
+                return kProgramNotLinked;
+            }
         }
     }
 
@@ -4583,6 +4652,13 @@
         return false;
     }
 
+    if (imageObject->hasProtectedContent() != context->getState().hasProtectedContent())
+    {
+        context->validationError(GL_INVALID_OPERATION,
+                                 "Mismatch between Image and Context Protected Content state");
+        return false;
+    }
+
     return true;
 }
 
@@ -4621,6 +4697,13 @@
         return false;
     }
 
+    if (imageObject->hasProtectedContent() != context->getState().hasProtectedContent())
+    {
+        context->validationError(GL_INVALID_OPERATION,
+                                 "Mismatch between Image and Context Protected Content state");
+        return false;
+    }
+
     return true;
 }
 
@@ -6549,6 +6632,14 @@
             }
             break;
 
+        case GL_TEXTURE_PROTECTED_EXT:
+            if (!context->getExtensions().protectedTexturesEXT)
+            {
+                context->validationError(GL_INVALID_ENUM, kProtectedTexturesExtensionRequired);
+                return false;
+            }
+            break;
+
         default:
             context->validationError(GL_INVALID_ENUM, kEnumNotSupported);
             return false;
@@ -7251,7 +7342,20 @@
                                          kRobustResourceInitializationExtensionRequired);
                 return false;
             }
+            break;
 
+        case GL_TEXTURE_PROTECTED_EXT:
+            if (!context->getExtensions().protectedTexturesEXT)
+            {
+                context->validationError(GL_INVALID_ENUM, kProtectedTexturesExtensionRequired);
+                return false;
+            }
+            if (ConvertToBool(params[0]) != context->getState().hasProtectedContent())
+            {
+                context->validationError(GL_INVALID_OPERATION,
+                                         "Protected Texture must match Protected Context");
+                return false;
+            }
             break;
 
         default:
diff --git a/src/libANGLE/validationES2.cpp b/src/libANGLE/validationES2.cpp
index 73a1651..c379b6f 100644
--- a/src/libANGLE/validationES2.cpp
+++ b/src/libANGLE/validationES2.cpp
@@ -384,11 +384,21 @@
         return false;
     }
 
+    ASSERT(textureFormat.valid() || !isSubImage);
+
     const Framebuffer *framebuffer = context->getState().getReadFramebuffer();
     GLenum colorbufferFormat =
         framebuffer->getReadColorAttachment()->getFormat().info->sizedInternalFormat;
     const auto &formatInfo = *textureFormat.info;
 
+    // ValidateCopyTexImageParametersBase rejects compressed formats with GL_INVALID_OPERATION.
+    ASSERT(!formatInfo.compressed);
+    ASSERT(!GetInternalFormatInfo(internalformat, GL_UNSIGNED_BYTE).compressed);
+
+    // ValidateCopyTexImageParametersBase rejects depth formats with GL_INVALID_OPERATION.
+    ASSERT(!formatInfo.depthBits);
+    ASSERT(!GetInternalFormatInfo(internalformat, GL_UNSIGNED_BYTE).depthBits);
+
     // [OpenGL ES 2.0.24] table 3.9
     if (isSubImage)
     {
@@ -467,26 +477,6 @@
                     return false;
                 }
                 break;
-            case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
-            case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
-            case GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE:
-            case GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE:
-            case GL_ETC1_RGB8_OES:
-            case GL_ETC1_RGB8_LOSSY_DECODE_ANGLE:
-            case GL_COMPRESSED_RGB8_LOSSY_DECODE_ETC2_ANGLE:
-            case GL_COMPRESSED_SRGB8_LOSSY_DECODE_ETC2_ANGLE:
-            case GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_LOSSY_DECODE_ETC2_ANGLE:
-            case GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_LOSSY_DECODE_ETC2_ANGLE:
-            case GL_COMPRESSED_RGBA_BPTC_UNORM_EXT:
-            case GL_COMPRESSED_SRGB_ALPHA_BPTC_UNORM_EXT:
-            case GL_COMPRESSED_RGB_BPTC_SIGNED_FLOAT_EXT:
-            case GL_COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT_EXT:
-                context->validationError(GL_INVALID_OPERATION, kInvalidFormat);
-                return false;
-            case GL_DEPTH_COMPONENT:
-            case GL_DEPTH_STENCIL_OES:
-                context->validationError(GL_INVALID_OPERATION, kInvalidFormat);
-                return false;
             default:
                 context->validationError(GL_INVALID_OPERATION, kInvalidFormat);
                 return false;
@@ -558,94 +548,6 @@
                     return false;
                 }
                 break;
-            case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
-            case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
-                if (context->getExtensions().textureCompressionDXT1)
-                {
-                    context->validationError(GL_INVALID_OPERATION, kInvalidFormat);
-                    return false;
-                }
-                context->validationError(GL_INVALID_ENUM, kEnumNotSupported);
-                return false;
-            case GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE:
-                if (context->getExtensions().textureCompressionDXT3)
-                {
-                    context->validationError(GL_INVALID_OPERATION, kInvalidFormat);
-                    return false;
-                }
-                context->validationError(GL_INVALID_ENUM, kEnumNotSupported);
-                return false;
-            case GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE:
-                if (context->getExtensions().textureCompressionDXT5)
-                {
-                    context->validationError(GL_INVALID_OPERATION, kInvalidFormat);
-                    return false;
-                }
-                context->validationError(GL_INVALID_ENUM, kEnumNotSupported);
-                return false;
-            case GL_ETC1_RGB8_OES:
-                if (context->getExtensions().compressedETC1RGB8TextureOES)
-                {
-                    context->validationError(GL_INVALID_OPERATION, kInvalidFormat);
-                    return false;
-                }
-                context->validationError(GL_INVALID_ENUM, kEnumNotSupported);
-                return false;
-            case GL_ETC1_RGB8_LOSSY_DECODE_ANGLE:
-            case GL_COMPRESSED_RGB8_LOSSY_DECODE_ETC2_ANGLE:
-            case GL_COMPRESSED_SRGB8_LOSSY_DECODE_ETC2_ANGLE:
-            case GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_LOSSY_DECODE_ETC2_ANGLE:
-            case GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_LOSSY_DECODE_ETC2_ANGLE:
-                if (context->getExtensions().lossyETCDecode)
-                {
-                    context->validationError(GL_INVALID_OPERATION, kInvalidFormat);
-                    return false;
-                }
-                context->validationError(GL_INVALID_ENUM, kEnumNotSupported);
-                return false;
-            case GL_COMPRESSED_RGB_PVRTC_4BPPV1_IMG:
-            case GL_COMPRESSED_RGB_PVRTC_2BPPV1_IMG:
-            case GL_COMPRESSED_RGBA_PVRTC_4BPPV1_IMG:
-            case GL_COMPRESSED_RGBA_PVRTC_2BPPV1_IMG:
-                if (context->getExtensions().compressedTexturePVRTC)
-                {
-                    context->validationError(GL_INVALID_OPERATION, kInvalidFormat);
-                    return false;
-                }
-                context->validationError(GL_INVALID_ENUM, kEnumNotSupported);
-                return false;
-            case GL_COMPRESSED_SRGB_PVRTC_2BPPV1_EXT:
-            case GL_COMPRESSED_SRGB_PVRTC_4BPPV1_EXT:
-            case GL_COMPRESSED_SRGB_ALPHA_PVRTC_2BPPV1_EXT:
-            case GL_COMPRESSED_SRGB_ALPHA_PVRTC_4BPPV1_EXT:
-                if (context->getExtensions().compressedTexturePVRTCsRGB)
-                {
-                    context->validationError(GL_INVALID_OPERATION, kInvalidFormat);
-                    return false;
-                }
-                context->validationError(GL_INVALID_ENUM, kEnumNotSupported);
-                return false;
-            case GL_DEPTH_COMPONENT:
-            case GL_DEPTH_COMPONENT16:
-            case GL_DEPTH_COMPONENT32_OES:
-                if (context->getExtensions().depthTextureAny())
-                {
-                    context->validationError(GL_INVALID_OPERATION, kInvalidFormat);
-                    return false;
-                }
-                context->validationError(GL_INVALID_ENUM, kEnumNotSupported);
-                return false;
-            case GL_DEPTH_STENCIL_OES:
-            case GL_DEPTH24_STENCIL8_OES:
-                if (context->getExtensions().depthTextureAny() ||
-                    context->getExtensions().packedDepthStencilOES ||
-                    context->getExtensions().depthTextureCubeMapOES)
-                {
-                    context->validationError(GL_INVALID_OPERATION, kInvalidFormat);
-                    return false;
-                }
-                context->validationError(GL_INVALID_ENUM, kEnumNotSupported);
-                return false;
             default:
                 context->validationError(GL_INVALID_ENUM, kEnumNotSupported);
                 return false;
@@ -1260,12 +1162,6 @@
                         return false;
                 }
                 break;
-            case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:  // error cases for compressed textures are
-                                                   // handled below
-            case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
-            case GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE:
-            case GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE:
-                break;
             case GL_DEPTH_COMPONENT:
                 switch (type)
                 {
@@ -1312,73 +1208,6 @@
 
         switch (format)
         {
-            case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
-            case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
-                if (context->getExtensions().textureCompressionDXT1)
-                {
-                    context->validationError(GL_INVALID_OPERATION, kInvalidFormat);
-                    return false;
-                }
-                context->validationError(GL_INVALID_ENUM, kEnumNotSupported);
-                return false;
-            case GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE:
-                if (context->getExtensions().textureCompressionDXT3)
-                {
-                    context->validationError(GL_INVALID_OPERATION, kInvalidFormat);
-                    return false;
-                }
-                context->validationError(GL_INVALID_ENUM, kEnumNotSupported);
-                return false;
-            case GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE:
-                if (context->getExtensions().textureCompressionDXT5)
-                {
-                    context->validationError(GL_INVALID_OPERATION, kInvalidFormat);
-                    return false;
-                }
-                context->validationError(GL_INVALID_ENUM, kEnumNotSupported);
-                return false;
-            case GL_ETC1_RGB8_OES:
-                if (context->getExtensions().compressedETC1RGB8TextureOES)
-                {
-                    context->validationError(GL_INVALID_OPERATION, kInvalidFormat);
-                    return false;
-                }
-                context->validationError(GL_INVALID_ENUM, kEnumNotSupported);
-                return false;
-            case GL_ETC1_RGB8_LOSSY_DECODE_ANGLE:
-            case GL_COMPRESSED_RGB8_LOSSY_DECODE_ETC2_ANGLE:
-            case GL_COMPRESSED_SRGB8_LOSSY_DECODE_ETC2_ANGLE:
-            case GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_LOSSY_DECODE_ETC2_ANGLE:
-            case GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_LOSSY_DECODE_ETC2_ANGLE:
-                if (context->getExtensions().lossyETCDecode)
-                {
-                    context->validationError(GL_INVALID_OPERATION, kInvalidFormat);
-                    return false;
-                }
-                context->validationError(GL_INVALID_ENUM, kEnumNotSupported);
-                return false;
-            case GL_COMPRESSED_RGB_PVRTC_4BPPV1_IMG:
-            case GL_COMPRESSED_RGB_PVRTC_2BPPV1_IMG:
-            case GL_COMPRESSED_RGBA_PVRTC_4BPPV1_IMG:
-            case GL_COMPRESSED_RGBA_PVRTC_2BPPV1_IMG:
-                if (context->getExtensions().compressedTexturePVRTC)
-                {
-                    context->validationError(GL_INVALID_OPERATION, kInvalidFormat);
-                    return false;
-                }
-                context->validationError(GL_INVALID_ENUM, kEnumNotSupported);
-                return false;
-            case GL_COMPRESSED_SRGB_PVRTC_2BPPV1_EXT:
-            case GL_COMPRESSED_SRGB_PVRTC_4BPPV1_EXT:
-            case GL_COMPRESSED_SRGB_ALPHA_PVRTC_2BPPV1_EXT:
-            case GL_COMPRESSED_SRGB_ALPHA_PVRTC_4BPPV1_EXT:
-                if (context->getExtensions().compressedTexturePVRTCsRGB)
-                {
-                    context->validationError(GL_INVALID_OPERATION, kInvalidFormat);
-                    return false;
-                }
-                context->validationError(GL_INVALID_ENUM, kEnumNotSupported);
-                return false;
             case GL_DEPTH_COMPONENT:
             case GL_DEPTH_STENCIL_OES:
                 if (!context->getExtensions().depthTextureANGLE &&
@@ -1784,122 +1613,26 @@
         }
     }
 
+    if (!formatInfo.textureSupport(context->getClientVersion(), context->getExtensions()))
+    {
+        context->validationError(GL_INVALID_ENUM, kInvalidFormat);
+        return false;
+    }
+
+    // Even with OES_texture_npot, some compressed formats may impose extra restrictions.
+    if (formatInfo.compressed)
+    {
+        if (!ValidCompressedImageSize(context, formatInfo.internalFormat, 0, width, height, 1))
+        {
+            context->validationError(GL_INVALID_OPERATION, kInvalidCompressedImageSize);
+            return false;
+        }
+    }
+
     switch (internalformat)
     {
-        case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
-        case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
-            if (!context->getExtensions().textureCompressionDXT1)
-            {
-                context->validationError(GL_INVALID_ENUM, kEnumNotSupported);
-                return false;
-            }
-            break;
-        case GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE:
-            if (!context->getExtensions().textureCompressionDXT3)
-            {
-                context->validationError(GL_INVALID_ENUM, kEnumNotSupported);
-                return false;
-            }
-            break;
-        case GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE:
-            if (!context->getExtensions().textureCompressionDXT5)
-            {
-                context->validationError(GL_INVALID_ENUM, kEnumNotSupported);
-                return false;
-            }
-            break;
-        case GL_ETC1_RGB8_OES:
-            if (!context->getExtensions().compressedETC1RGB8TextureOES)
-            {
-                context->validationError(GL_INVALID_ENUM, kEnumNotSupported);
-                return false;
-            }
-            break;
-        case GL_ETC1_RGB8_LOSSY_DECODE_ANGLE:
-        case GL_COMPRESSED_RGB8_LOSSY_DECODE_ETC2_ANGLE:
-        case GL_COMPRESSED_SRGB8_LOSSY_DECODE_ETC2_ANGLE:
-        case GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_LOSSY_DECODE_ETC2_ANGLE:
-        case GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_LOSSY_DECODE_ETC2_ANGLE:
-            if (!context->getExtensions().lossyETCDecode)
-            {
-                context->validationError(GL_INVALID_ENUM, kEnumNotSupported);
-                return false;
-            }
-            break;
-        case GL_COMPRESSED_RGB_PVRTC_4BPPV1_IMG:
-        case GL_COMPRESSED_RGB_PVRTC_2BPPV1_IMG:
-        case GL_COMPRESSED_RGBA_PVRTC_4BPPV1_IMG:
-        case GL_COMPRESSED_RGBA_PVRTC_2BPPV1_IMG:
-            if (!context->getExtensions().compressedTexturePVRTC)
-            {
-                context->validationError(GL_INVALID_ENUM, kEnumNotSupported);
-                return false;
-            }
-            break;
-        case GL_COMPRESSED_SRGB_PVRTC_2BPPV1_EXT:
-        case GL_COMPRESSED_SRGB_PVRTC_4BPPV1_EXT:
-        case GL_COMPRESSED_SRGB_ALPHA_PVRTC_2BPPV1_EXT:
-        case GL_COMPRESSED_SRGB_ALPHA_PVRTC_4BPPV1_EXT:
-            if (!context->getExtensions().compressedTexturePVRTCsRGB)
-            {
-                context->validationError(GL_INVALID_ENUM, kEnumNotSupported);
-                return false;
-            }
-            break;
-        case GL_RGBA32F_EXT:
-        case GL_RGB32F_EXT:
-        case GL_ALPHA32F_EXT:
-        case GL_LUMINANCE32F_EXT:
-        case GL_LUMINANCE_ALPHA32F_EXT:
-            if (!context->getExtensions().textureFloatOES)
-            {
-                context->validationError(GL_INVALID_ENUM, kEnumNotSupported);
-                return false;
-            }
-            break;
-        case GL_RGBA16F_EXT:
-        case GL_RGB16F_EXT:
-        case GL_ALPHA16F_EXT:
-        case GL_LUMINANCE16F_EXT:
-        case GL_LUMINANCE_ALPHA16F_EXT:
-            if (!context->getExtensions().textureHalfFloat)
-            {
-                context->validationError(GL_INVALID_ENUM, kEnumNotSupported);
-                return false;
-            }
-            break;
-        case GL_R8_EXT:
-        case GL_RG8_EXT:
-            if (!context->getExtensions().textureRG)
-            {
-                context->validationError(GL_INVALID_ENUM, kEnumNotSupported);
-                return false;
-            }
-            break;
-        case GL_R16F_EXT:
-        case GL_RG16F_EXT:
-            if (!context->getExtensions().textureRG || !context->getExtensions().textureHalfFloat)
-            {
-                context->validationError(GL_INVALID_ENUM, kEnumNotSupported);
-                return false;
-            }
-            break;
-        case GL_R32F_EXT:
-        case GL_RG32F_EXT:
-            if (!context->getExtensions().textureRG || !context->getExtensions().textureFloatOES)
-            {
-                context->validationError(GL_INVALID_ENUM, kEnumNotSupported);
-                return false;
-            }
-            break;
         case GL_DEPTH_COMPONENT16:
         case GL_DEPTH_COMPONENT32_OES:
-            if (!(context->getExtensions().depthTextureAny()))
-            {
-                context->validationError(GL_INVALID_ENUM, kEnumNotSupported);
-                return false;
-            }
-
             switch (target)
             {
                 case TextureType::_2D:
@@ -1927,15 +1660,6 @@
             }
             break;
         case GL_DEPTH24_STENCIL8_OES:
-            if (!(context->getExtensions().depthTextureANGLE ||
-                  ((context->getExtensions().packedDepthStencilOES ||
-                    context->getExtensions().depthTextureCubeMapOES) &&
-                   context->getExtensions().textureStorage)))
-            {
-                context->validationError(GL_INVALID_ENUM, kEnumNotSupported);
-                return false;
-            }
-
             switch (target)
             {
                 case TextureType::_2D:
@@ -3754,7 +3478,11 @@
         return false;
     }
 
-    if (buffer->isMapped())
+    // EXT_buffer_storage allows persistently mapped buffers to be updated via glBufferSubData
+    bool isPersistent = (buffer->getAccessFlags() & GL_MAP_PERSISTENT_BIT_EXT) != 0;
+
+    // Verify that buffer is not currently mapped unless persistent
+    if (buffer->isMapped() && !isPersistent)
     {
         context->validationError(GL_INVALID_OPERATION, kBufferMapped);
         return false;
diff --git a/src/libANGLE/validationES3.cpp b/src/libANGLE/validationES3.cpp
index a41744a..68d1f2a 100644
--- a/src/libANGLE/validationES3.cpp
+++ b/src/libANGLE/validationES3.cpp
@@ -373,8 +373,25 @@
     return true;
 }
 
+static bool ValidateES3CompressedFormatForTexture2DArray(const Context *context, GLenum format)
+{
+    if (IsETC1Format(format) || IsPVRTC1Format(format))
+    {
+        context->validationError(GL_INVALID_OPERATION, kInternalFormatRequiresTexture2D);
+        return false;
+    }
+
+    return true;
+}
+
 static bool ValidateES3CompressedFormatForTexture3D(const Context *context, GLenum format)
 {
+    if (IsETC1Format(format) || IsPVRTC1Format(format))
+    {
+        context->validationError(GL_INVALID_OPERATION, kInternalFormatRequiresTexture2D);
+        return false;
+    }
+
     if (IsETC2EACFormat(format))
     {
         // ES 3.1, Section 8.7, page 169.
@@ -403,6 +420,14 @@
         context->validationError(GL_INVALID_OPERATION, kInternalFormatRequiresTexture2DArrayRGTC);
         return false;
     }
+
+    if (IsBPTCFormat(format) && (context->getLimitations().noCompressedTexture3D))
+    {
+        // GL_EXT_texture_compression_bptc
+        context->validationError(GL_INVALID_OPERATION, kInternalFormatRequiresTexture2DArrayBPTC);
+        return false;
+    }
+
     return true;
 }
 
@@ -585,16 +610,6 @@
         return false;
     }
 
-    if (isCompressed && texType == TextureType::_3D)
-    {
-        GLenum compressedDataFormat = isSubImage ? format : internalformat;
-        if (!ValidateES3CompressedFormatForTexture3D(context, compressedDataFormat))
-        {
-            // Error already generated.
-            return false;
-        }
-    }
-
     // Validate texture formats
     GLenum actualInternalFormat =
         isSubImage ? texture->getFormat(target, level).info->internalFormat : internalformat;
@@ -609,10 +624,41 @@
                                                  : GetInternalFormatInfo(internalformat, type);
     if (isCompressed)
     {
-        if (!actualFormatInfo.compressed)
+        // compressedTexSubImage does not generate GL_INVALID_ENUM when format is unknown or invalid
+        if (!isSubImage)
         {
-            context->validationError(GL_INVALID_ENUM, kCompressedMismatch);
-            return false;
+            if (!actualFormatInfo.compressed)
+            {
+                context->validationError(GL_INVALID_ENUM, kCompressedMismatch);
+                return false;
+            }
+
+            if (!actualFormatInfo.textureSupport(context->getClientVersion(),
+                                                 context->getExtensions()))
+            {
+                context->validationError(GL_INVALID_ENUM, kInvalidFormat);
+                return false;
+            }
+        }
+
+        if (texType == TextureType::_2DArray)
+        {
+            GLenum compressedDataFormat = isSubImage ? format : internalformat;
+            if (!ValidateES3CompressedFormatForTexture2DArray(context, compressedDataFormat))
+            {
+                // Error already generated.
+                return false;
+            }
+        }
+
+        if (texType == TextureType::_3D)
+        {
+            GLenum compressedDataFormat = isSubImage ? format : internalformat;
+            if (!ValidateES3CompressedFormatForTexture3D(context, compressedDataFormat))
+            {
+                // Error already generated.
+                return false;
+            }
         }
 
         if (isSubImage)
@@ -650,12 +696,6 @@
             }
         }
 
-        if (!actualFormatInfo.textureSupport(context->getClientVersion(), context->getExtensions()))
-        {
-            context->validationError(GL_INVALID_ENUM, kInvalidFormat);
-            return false;
-        }
-
         // Disallow 3D-only compressed formats from being set on 2D textures
         if (actualFormatInfo.compressedBlockDepth > 1 && texType != TextureType::_2DArray)
         {
@@ -1409,17 +1449,35 @@
         return false;
     }
 
-    if (formatInfo.compressed && target == TextureType::Rectangle)
+    if (formatInfo.compressed)
     {
-        context->validationError(GL_INVALID_ENUM, kRectangleTextureCompressed);
-        return false;
-    }
-
-    if (formatInfo.compressed && target == TextureType::_3D)
-    {
-        if (!ValidateES3CompressedFormatForTexture3D(context, formatInfo.internalFormat))
+        if (target == TextureType::Rectangle)
         {
-            // Error already generated.
+            context->validationError(GL_INVALID_ENUM, kRectangleTextureCompressed);
+            return false;
+        }
+
+        if (target == TextureType::_2DArray)
+        {
+            if (!ValidateES3CompressedFormatForTexture2DArray(context, formatInfo.internalFormat))
+            {
+                // Error already generated.
+                return false;
+            }
+        }
+
+        if (target == TextureType::_3D)
+        {
+            if (!ValidateES3CompressedFormatForTexture3D(context, formatInfo.internalFormat))
+            {
+                // Error already generated.
+                return false;
+            }
+        }
+
+        if (!ValidCompressedImageSize(context, formatInfo.internalFormat, 0, width, height, depth))
+        {
+            context->validationError(GL_INVALID_OPERATION, kInvalidCompressedImageSize);
             return false;
         }
     }
@@ -3172,8 +3230,13 @@
         return false;
     }
 
-    // Verify that readBuffer and writeBuffer are not currently mapped
-    if (readBuffer->isMapped() || writeBuffer->isMapped())
+    // EXT_buffer_storage allows persistently mapped buffers to be updated via glCopyBufferSubData
+    bool isReadPersistent  = (readBuffer->getAccessFlags() & GL_MAP_PERSISTENT_BIT_EXT) != 0;
+    bool isWritePersistent = (writeBuffer->getAccessFlags() & GL_MAP_PERSISTENT_BIT_EXT) != 0;
+
+    // Verify that readBuffer and writeBuffer are not currently mapped unless persistent
+    if ((readBuffer->isMapped() && !isReadPersistent) ||
+        (writeBuffer->isMapped() && !isWritePersistent))
     {
         context->validationError(GL_INVALID_OPERATION, kBufferMapped);
         return false;
diff --git a/src/libANGLE/validationES31.cpp b/src/libANGLE/validationES31.cpp
index 416a348..78a3d9a 100644
--- a/src/libANGLE/validationES31.cpp
+++ b/src/libANGLE/validationES31.cpp
@@ -2716,6 +2716,24 @@
             context->validationError(GL_INVALID_VALUE, kInvalidMipLevel);
             return false;
         }
+
+        // GLES spec 3.1, Section 9.2.8 "Attaching Texture Images to a Framebuffer"
+        // If textarget is TEXTURE_2D_MULTISAMPLE, then level must be zero.
+        if (tex->getType() == TextureType::_2DMultisample && level != 0)
+        {
+            context->validationError(GL_INVALID_VALUE, kLevelNotZero);
+            return false;
+        }
+
+        // [OES_texture_storage_multisample_2d_array] Section 9.2.2 "Attaching Images to Framebuffer
+        // Objects"
+        // If texture is a two-dimensional multisample array texture, then level must be zero.
+        if (context->getExtensions().textureStorageMultisample2DArrayOES &&
+            tex->getType() == TextureType::_2DMultisampleArray && level != 0)
+        {
+            context->validationError(GL_INVALID_VALUE, kLevelNotZero);
+            return false;
+        }
     }
 
     if (!ValidateFramebufferTextureBase(context, target, attachment, texture, level))
diff --git a/src/libANGLE/validationESEXT.cpp b/src/libANGLE/validationESEXT.cpp
index e567816..f889198 100644
--- a/src/libANGLE/validationESEXT.cpp
+++ b/src/libANGLE/validationESEXT.cpp
@@ -72,6 +72,14 @@
         case GL_DEDICATED_MEMORY_OBJECT_EXT:
             return true;
 
+        case GL_PROTECTED_MEMORY_OBJECT_EXT:
+            if (!context->getExtensions().protectedTexturesEXT)
+            {
+                context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
+                return false;
+            }
+            return true;
+
         default:
             return false;
     }
@@ -1514,8 +1522,13 @@
                                      GLfloat maxZ,
                                      GLfloat maxW)
 {
-    context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
-    return false;
+    if (!context->getExtensions().primitiveBoundingBoxEXT)
+    {
+        context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
+        return false;
+    }
+
+    return true;
 }
 
 // GL_EXT_separate_shader_objects
@@ -2212,4 +2225,23 @@
 
     return ValidateObjectIdentifierAndName(context, type, object);
 }
+
+bool ValidateEGLImageTargetTextureStorageEXT(const Context *context,
+                                             GLuint texture,
+                                             GLeglImageOES image,
+                                             const GLint *attrib_list)
+{
+    UNREACHABLE();
+    return false;
+}
+
+bool ValidateEGLImageTargetTexStorageEXT(const Context *context,
+                                         GLenum target,
+                                         GLeglImageOES image,
+                                         const GLint *attrib_list)
+{
+    UNREACHABLE();
+    return false;
+}
+
 }  // namespace gl
diff --git a/src/libANGLE/validationESEXT_autogen.h b/src/libANGLE/validationESEXT_autogen.h
index 869ef4d..892e83b 100644
--- a/src/libANGLE/validationESEXT_autogen.h
+++ b/src/libANGLE/validationESEXT_autogen.h
@@ -751,6 +751,16 @@
 
 // GL_EXT_EGL_image_array
 
+// GL_EXT_EGL_image_storage
+bool ValidateEGLImageTargetTexStorageEXT(const Context *context,
+                                         GLenum target,
+                                         GLeglImageOES image,
+                                         const GLint *attrib_list);
+bool ValidateEGLImageTargetTextureStorageEXT(const Context *context,
+                                             GLuint texture,
+                                             GLeglImageOES image,
+                                             const GLint *attrib_list);
+
 // GL_EXT_YUV_target
 
 // GL_EXT_blend_func_extended
@@ -1052,6 +1062,10 @@
                                      GLfloat maxZ,
                                      GLfloat maxW);
 
+// GL_EXT_protected_textures
+
+// GL_EXT_pvrtc_sRGB
+
 // GL_EXT_read_format_bgra
 
 // GL_EXT_robustness
@@ -1426,6 +1440,10 @@
                              GLsizei height,
                              GLsizei depth);
 
+// GL_IMG_texture_compression_pvrtc
+
+// GL_IMG_texture_compression_pvrtc2
+
 // GL_KHR_blend_equation_advanced
 bool ValidateBlendBarrierKHR(const Context *context);
 
@@ -1487,6 +1505,12 @@
 // GL_KHR_parallel_shader_compile
 bool ValidateMaxShaderCompilerThreadsKHR(const Context *context, GLuint count);
 
+// GL_KHR_texture_compression_astc_hdr
+
+// GL_KHR_texture_compression_astc_ldr
+
+// GL_KHR_texture_compression_astc_sliced_3d
+
 // GL_NV_fence
 bool ValidateDeleteFencesNV(const Context *context, GLsizei n, const FenceNVID *fencesPacked);
 bool ValidateFinishFenceNV(const Context *context, FenceNVID fencePacked);
diff --git a/src/libGLESv2.gni b/src/libGLESv2.gni
index 23cab68..e6a668e 100644
--- a/src/libGLESv2.gni
+++ b/src/libGLESv2.gni
@@ -552,6 +552,7 @@
   "src/libANGLE/capture/frame_capture_utils_autogen.cpp",
   "src/libANGLE/capture/gl_enum_utils.cpp",
   "src/libANGLE/capture/gl_enum_utils_autogen.cpp",
+  "src/third_party/ceval/ceval.h",
 ]
 
 libgl_sources = [
diff --git a/src/libGLESv2/egl_stubs.cpp b/src/libGLESv2/egl_stubs.cpp
index bb28741..561c38a 100644
--- a/src/libGLESv2/egl_stubs.cpp
+++ b/src/libGLESv2/egl_stubs.cpp
@@ -657,9 +657,6 @@
 
     ScopedSyncCurrentContextFromThread scopedSyncCurrent(thread);
 
-    ANGLE_EGL_TRY_RETURN(
-        thread, display->makeCurrent(thread, thread->getContext(), nullptr, nullptr, nullptr),
-        "eglTerminate", GetDisplayIfValid(display), EGL_FALSE);
     ANGLE_EGL_TRY_RETURN(thread, display->terminate(thread), "eglTerminate",
                          GetDisplayIfValid(display), EGL_FALSE);
 
diff --git a/src/libGLESv2/entry_points_gles_ext_autogen.cpp b/src/libGLESv2/entry_points_gles_ext_autogen.cpp
index 10bfbbe..8bdc458 100644
--- a/src/libGLESv2/entry_points_gles_ext_autogen.cpp
+++ b/src/libGLESv2/entry_points_gles_ext_autogen.cpp
@@ -3627,6 +3627,62 @@
 
 // GL_EXT_EGL_image_array
 
+// GL_EXT_EGL_image_storage
+void GL_APIENTRY GL_EGLImageTargetTexStorageEXT(GLenum target,
+                                                GLeglImageOES image,
+                                                const GLint *attrib_list)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLEGLImageTargetTexStorageEXT,
+          "context = %d, target = %s, image = 0x%016" PRIxPTR ", attrib_list = 0x%016" PRIxPTR "",
+          CID(context), GLenumToString(GLenumGroup::DefaultGroup, target), (uintptr_t)image,
+          (uintptr_t)attrib_list);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetContextLock(context);
+        bool isCallValid = (context->skipValidation() || ValidateEGLImageTargetTexStorageEXT(
+                                                             context, target, image, attrib_list));
+        if (isCallValid)
+        {
+            context->eGLImageTargetTexStorage(target, image, attrib_list);
+        }
+        ANGLE_CAPTURE(EGLImageTargetTexStorageEXT, isCallValid, context, target, image,
+                      attrib_list);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
+void GL_APIENTRY GL_EGLImageTargetTextureStorageEXT(GLuint texture,
+                                                    GLeglImageOES image,
+                                                    const GLint *attrib_list)
+{
+    Context *context = GetValidGlobalContext();
+    EVENT(context, GLEGLImageTargetTextureStorageEXT,
+          "context = %d, texture = %u, image = 0x%016" PRIxPTR ", attrib_list = 0x%016" PRIxPTR "",
+          CID(context), texture, (uintptr_t)image, (uintptr_t)attrib_list);
+
+    if (context)
+    {
+        std::unique_lock<angle::GlobalMutex> shareContextLock = GetContextLock(context);
+        bool isCallValid = (context->skipValidation() || ValidateEGLImageTargetTextureStorageEXT(
+                                                             context, texture, image, attrib_list));
+        if (isCallValid)
+        {
+            context->eGLImageTargetTextureStorage(texture, image, attrib_list);
+        }
+        ANGLE_CAPTURE(EGLImageTargetTextureStorageEXT, isCallValid, context, texture, image,
+                      attrib_list);
+    }
+    else
+    {
+        GenerateContextLostErrorOnCurrentGlobalContext();
+    }
+}
+
 // GL_EXT_YUV_target
 
 // GL_EXT_blend_func_extended
@@ -5483,6 +5539,10 @@
     }
 }
 
+// GL_EXT_protected_textures
+
+// GL_EXT_pvrtc_sRGB
+
 // GL_EXT_read_format_bgra
 
 // GL_EXT_robustness
@@ -7610,6 +7670,10 @@
     }
 }
 
+// GL_IMG_texture_compression_pvrtc
+
+// GL_IMG_texture_compression_pvrtc2
+
 // GL_KHR_blend_equation_advanced
 void GL_APIENTRY GL_BlendBarrierKHR()
 {
@@ -7978,6 +8042,12 @@
     }
 }
 
+// GL_KHR_texture_compression_astc_hdr
+
+// GL_KHR_texture_compression_astc_ldr
+
+// GL_KHR_texture_compression_astc_sliced_3d
+
 // GL_NV_fence
 void GL_APIENTRY GL_DeleteFencesNV(GLsizei n, const GLuint *fences)
 {
diff --git a/src/libGLESv2/entry_points_gles_ext_autogen.h b/src/libGLESv2/entry_points_gles_ext_autogen.h
index 169cdc3..60b352c 100644
--- a/src/libGLESv2/entry_points_gles_ext_autogen.h
+++ b/src/libGLESv2/entry_points_gles_ext_autogen.h
@@ -655,6 +655,14 @@
 
 // GL_EXT_EGL_image_array
 
+// GL_EXT_EGL_image_storage
+ANGLE_EXPORT void GL_APIENTRY GL_EGLImageTargetTexStorageEXT(GLenum target,
+                                                             GLeglImageOES image,
+                                                             const GLint *attrib_list);
+ANGLE_EXPORT void GL_APIENTRY GL_EGLImageTargetTextureStorageEXT(GLuint texture,
+                                                                 GLeglImageOES image,
+                                                                 const GLint *attrib_list);
+
 // GL_EXT_YUV_target
 
 // GL_EXT_blend_func_extended
@@ -893,6 +901,10 @@
                                                          GLfloat maxZ,
                                                          GLfloat maxW);
 
+// GL_EXT_protected_textures
+
+// GL_EXT_pvrtc_sRGB
+
 // GL_EXT_read_format_bgra
 
 // GL_EXT_robustness
@@ -1169,6 +1181,10 @@
                                                  GLsizei height,
                                                  GLsizei depth);
 
+// GL_IMG_texture_compression_pvrtc
+
+// GL_IMG_texture_compression_pvrtc2
+
 // GL_KHR_blend_equation_advanced
 ANGLE_EXPORT void GL_APIENTRY GL_BlendBarrierKHR();
 
@@ -1221,6 +1237,12 @@
 // GL_KHR_parallel_shader_compile
 ANGLE_EXPORT void GL_APIENTRY GL_MaxShaderCompilerThreadsKHR(GLuint count);
 
+// GL_KHR_texture_compression_astc_hdr
+
+// GL_KHR_texture_compression_astc_ldr
+
+// GL_KHR_texture_compression_astc_sliced_3d
+
 // GL_NV_fence
 ANGLE_EXPORT void GL_APIENTRY GL_DeleteFencesNV(GLsizei n, const GLuint *fences);
 ANGLE_EXPORT void GL_APIENTRY GL_FinishFenceNV(GLuint fence);
diff --git a/src/libGLESv2/libGLESv2_autogen.cpp b/src/libGLESv2/libGLESv2_autogen.cpp
index b7467c9..a0c77ee 100644
--- a/src/libGLESv2/libGLESv2_autogen.cpp
+++ b/src/libGLESv2/libGLESv2_autogen.cpp
@@ -3771,6 +3771,21 @@
 
 // GL_EXT_EGL_image_array
 
+// GL_EXT_EGL_image_storage
+void GL_APIENTRY glEGLImageTargetTexStorageEXT(GLenum target,
+                                               GLeglImageOES image,
+                                               const GLint *attrib_list)
+{
+    return GL_EGLImageTargetTexStorageEXT(target, image, attrib_list);
+}
+
+void GL_APIENTRY glEGLImageTargetTextureStorageEXT(GLuint texture,
+                                                   GLeglImageOES image,
+                                                   const GLint *attrib_list)
+{
+    return GL_EGLImageTargetTextureStorageEXT(texture, image, attrib_list);
+}
+
 // GL_EXT_YUV_target
 
 // GL_EXT_blend_func_extended
@@ -4227,6 +4242,10 @@
     return GL_PrimitiveBoundingBoxEXT(minX, minY, minZ, minW, maxX, maxY, maxZ, maxW);
 }
 
+// GL_EXT_protected_textures
+
+// GL_EXT_pvrtc_sRGB
+
 // GL_EXT_read_format_bgra
 
 // GL_EXT_robustness
@@ -4743,6 +4762,10 @@
     return GL_TexStorage3DEXT(target, levels, internalformat, width, height, depth);
 }
 
+// GL_IMG_texture_compression_pvrtc
+
+// GL_IMG_texture_compression_pvrtc2
+
 // GL_KHR_blend_equation_advanced
 void GL_APIENTRY glBlendBarrierKHR()
 {
@@ -4839,6 +4862,12 @@
     return GL_MaxShaderCompilerThreadsKHR(count);
 }
 
+// GL_KHR_texture_compression_astc_hdr
+
+// GL_KHR_texture_compression_astc_ldr
+
+// GL_KHR_texture_compression_astc_sliced_3d
+
 // GL_NV_fence
 void GL_APIENTRY glDeleteFencesNV(GLsizei n, const GLuint *fences)
 {
diff --git a/src/libGLESv2/libGLESv2_autogen.def b/src/libGLESv2/libGLESv2_autogen.def
index 8d73795..a523994 100644
--- a/src/libGLESv2/libGLESv2_autogen.def
+++ b/src/libGLESv2/libGLESv2_autogen.def
@@ -612,6 +612,10 @@
 
     ; GL_EXT_EGL_image_array
 
+    ; GL_EXT_EGL_image_storage
+    glEGLImageTargetTexStorageEXT
+    glEGLImageTargetTextureStorageEXT
+
     ; GL_EXT_YUV_target
 
     ; GL_EXT_blend_func_extended
@@ -716,6 +720,10 @@
     ; GL_EXT_primitive_bounding_box
     glPrimitiveBoundingBoxEXT
 
+    ; GL_EXT_protected_textures
+
+    ; GL_EXT_pvrtc_sRGB
+
     ; GL_EXT_read_format_bgra
 
     ; GL_EXT_robustness
@@ -833,6 +841,10 @@
     glTexStorage2DEXT
     glTexStorage3DEXT
 
+    ; GL_IMG_texture_compression_pvrtc
+
+    ; GL_IMG_texture_compression_pvrtc2
+
     ; GL_KHR_blend_equation_advanced
     glBlendBarrierKHR
 
@@ -852,6 +864,12 @@
     ; GL_KHR_parallel_shader_compile
     glMaxShaderCompilerThreadsKHR
 
+    ; GL_KHR_texture_compression_astc_hdr
+
+    ; GL_KHR_texture_compression_astc_ldr
+
+    ; GL_KHR_texture_compression_astc_sliced_3d
+
     ; GL_NV_fence
     glDeleteFencesNV
     glFinishFenceNV
diff --git a/src/libGLESv2/libGLESv2_no_capture_autogen.def b/src/libGLESv2/libGLESv2_no_capture_autogen.def
index ee6dfb3..5073ecb 100644
--- a/src/libGLESv2/libGLESv2_no_capture_autogen.def
+++ b/src/libGLESv2/libGLESv2_no_capture_autogen.def
@@ -612,6 +612,10 @@
 
     ; GL_EXT_EGL_image_array
 
+    ; GL_EXT_EGL_image_storage
+    glEGLImageTargetTexStorageEXT
+    glEGLImageTargetTextureStorageEXT
+
     ; GL_EXT_YUV_target
 
     ; GL_EXT_blend_func_extended
@@ -716,6 +720,10 @@
     ; GL_EXT_primitive_bounding_box
     glPrimitiveBoundingBoxEXT
 
+    ; GL_EXT_protected_textures
+
+    ; GL_EXT_pvrtc_sRGB
+
     ; GL_EXT_read_format_bgra
 
     ; GL_EXT_robustness
@@ -833,6 +841,10 @@
     glTexStorage2DEXT
     glTexStorage3DEXT
 
+    ; GL_IMG_texture_compression_pvrtc
+
+    ; GL_IMG_texture_compression_pvrtc2
+
     ; GL_KHR_blend_equation_advanced
     glBlendBarrierKHR
 
@@ -852,6 +864,12 @@
     ; GL_KHR_parallel_shader_compile
     glMaxShaderCompilerThreadsKHR
 
+    ; GL_KHR_texture_compression_astc_hdr
+
+    ; GL_KHR_texture_compression_astc_ldr
+
+    ; GL_KHR_texture_compression_astc_sliced_3d
+
     ; GL_NV_fence
     glDeleteFencesNV
     glFinishFenceNV
diff --git a/src/libGLESv2/libGLESv2_with_capture_autogen.def b/src/libGLESv2/libGLESv2_with_capture_autogen.def
index 5a72263..1d66219 100644
--- a/src/libGLESv2/libGLESv2_with_capture_autogen.def
+++ b/src/libGLESv2/libGLESv2_with_capture_autogen.def
@@ -612,6 +612,10 @@
 
     ; GL_EXT_EGL_image_array
 
+    ; GL_EXT_EGL_image_storage
+    glEGLImageTargetTexStorageEXT
+    glEGLImageTargetTextureStorageEXT
+
     ; GL_EXT_YUV_target
 
     ; GL_EXT_blend_func_extended
@@ -716,6 +720,10 @@
     ; GL_EXT_primitive_bounding_box
     glPrimitiveBoundingBoxEXT
 
+    ; GL_EXT_protected_textures
+
+    ; GL_EXT_pvrtc_sRGB
+
     ; GL_EXT_read_format_bgra
 
     ; GL_EXT_robustness
@@ -833,6 +841,10 @@
     glTexStorage2DEXT
     glTexStorage3DEXT
 
+    ; GL_IMG_texture_compression_pvrtc
+
+    ; GL_IMG_texture_compression_pvrtc2
+
     ; GL_KHR_blend_equation_advanced
     glBlendBarrierKHR
 
@@ -852,6 +864,12 @@
     ; GL_KHR_parallel_shader_compile
     glMaxShaderCompilerThreadsKHR
 
+    ; GL_KHR_texture_compression_astc_hdr
+
+    ; GL_KHR_texture_compression_astc_ldr
+
+    ; GL_KHR_texture_compression_astc_sliced_3d
+
     ; GL_NV_fence
     glDeleteFencesNV
     glFinishFenceNV
diff --git a/src/libGLESv2/proc_table_egl_autogen.cpp b/src/libGLESv2/proc_table_egl_autogen.cpp
index 3cc8f17..f248a68 100644
--- a/src/libGLESv2/proc_table_egl_autogen.cpp
+++ b/src/libGLESv2/proc_table_egl_autogen.cpp
@@ -317,7 +317,9 @@
     {"glDrawTexxOES", P(GL_DrawTexxOES)},
     {"glDrawTexxvOES", P(GL_DrawTexxvOES)},
     {"glEGLImageTargetRenderbufferStorageOES", P(GL_EGLImageTargetRenderbufferStorageOES)},
+    {"glEGLImageTargetTexStorageEXT", P(GL_EGLImageTargetTexStorageEXT)},
     {"glEGLImageTargetTexture2DOES", P(GL_EGLImageTargetTexture2DOES)},
+    {"glEGLImageTargetTextureStorageEXT", P(GL_EGLImageTargetTextureStorageEXT)},
     {"glEnable", P(GL_Enable)},
     {"glEnableClientState", P(GL_EnableClientState)},
     {"glEnableVertexAttribArray", P(GL_EnableVertexAttribArray)},
@@ -916,5 +918,5 @@
     {"glWaitSync", P(GL_WaitSync)},
     {"glWeightPointerOES", P(GL_WeightPointerOES)}};
 
-const size_t g_numProcs = 883;
+const size_t g_numProcs = 885;
 }  // namespace egl
diff --git a/src/tests/BUILD.gn b/src/tests/BUILD.gn
index 3ab249c..054a4a5 100644
--- a/src/tests/BUILD.gn
+++ b/src/tests/BUILD.gn
@@ -109,6 +109,7 @@
     ]
     sources = [
       "$angle_root/third_party/renderdoc/src/renderdoc_app.h",
+      "test_utils/MultiThreadSteps.h",
       "test_utils/RenderDoc.cpp",
       "test_utils/RenderDoc.h",
       "test_utils/angle_test_configs.cpp",
@@ -187,6 +188,18 @@
     "$angle_root/util:angle_util_static",
   ]
 
+  if (angle_enable_vulkan) {
+    if (angle_enable_direct_spirv_gen) {
+      sources += [ "compiler_tests/Precise_test.cpp" ]
+    }
+    deps += [
+      "$angle_root/src/common/spirv:angle_spirv_base",
+      "$angle_root/src/common/spirv:angle_spirv_headers",
+      "$angle_root/src/common/spirv:angle_spirv_parser",
+      "${angle_spirv_headers_dir}:spv_headers",
+    ]
+  }
+
   if (!is_android && !is_fuchsia) {
     # SystemUtils.RunApp, the only unittest using a helper binary, is not supported on these
     # platforms yet.
@@ -230,6 +243,7 @@
 
     deps = [
       ":angle_common_test_utils_shared",
+      "$angle_root:angle_gl_enum_utils",
       "$angle_root:angle_image_util",
     ]
 
@@ -372,6 +386,9 @@
       "$angle_root:libGLESv2_static",
     ]
 
+    data = [ "$angle_root/src/tests/run_perf_tests.py" ]
+    data_deps = [ "//testing:run_perf_test" ]
+
     # These tests depend on vulkan_command_buffer_utils, which is
     # not yet compatible with mac and vulkan display/headless backend.
     if (angle_enable_vulkan && !angle_use_vulkan_display && !is_apple) {
@@ -409,6 +426,7 @@
       deps = [
         ":angle_perftests_shared",
         "$angle_root:angle_compression",
+        "$angle_root/util:angle_frame_capture_test_utils",
         "$angle_root/util:angle_png_utils",
         "restricted_traces:angle_restricted_traces",
       ]
@@ -429,13 +447,14 @@
       "$angle_spirv_tools_dir:spvtools_val",
     ]
 
+    data = [ "$angle_root/src/tests/run_perf_tests.py" ]
+
     data_deps = [
       "${angle_root}:libEGL",
       "${angle_root}:libGLESv2",
+      "//testing:run_perf_test",
     ]
 
-    data_deps += [ "//testing:run_perf_test" ]
-
     if (is_win || is_linux || is_chromeos) {
       data_deps += [ "${angle_root}/third_party/glmark2:glmark2_angle" ]
     }
@@ -493,6 +512,7 @@
         "-Wno-int-to-pointer-cast",
         "-Wno-self-assign",
         "-Wno-sign-compare",
+        "-Wno-unreachable-code-break",
         "-Wno-unused-const-variable",
         "-Wno-unused-result",
         "-Wno-unused-variable",
diff --git a/src/tests/angle_deqp_tests_main.cpp b/src/tests/angle_deqp_tests_main.cpp
index f098e8b..02631a4 100644
--- a/src/tests/angle_deqp_tests_main.cpp
+++ b/src/tests/angle_deqp_tests_main.cpp
@@ -17,14 +17,6 @@
 void InitTestHarness(int *argc, char **argv);
 }  // namespace angle
 
-// If we ever move to a text-based expectations format, we should move this list in that file.
-namespace
-{
-const char *kSlowTests[] = {
-    "dEQP.KHR_GLES31/core_arrays_of_arrays_ConstructorsAndUnsizedDeclConstructors1",
-    "dEQP.GLES31/functional_ssbo_layout_random_all_shared_buffer_36"};
-}  // namespace
-
 int main(int argc, char **argv)
 {
 #if defined(ANGLE_PLATFORM_MACOS)
@@ -35,6 +27,5 @@
 
     angle::InitTestHarness(&argc, argv);
     angle::TestSuite testSuite(&argc, argv);
-    testSuite.registerSlowTests(kSlowTests, ArraySize(kSlowTests));
     return testSuite.run();
 }
diff --git a/src/tests/angle_end2end_tests.gni b/src/tests/angle_end2end_tests.gni
index 28b5782..bfe8d39 100644
--- a/src/tests/angle_end2end_tests.gni
+++ b/src/tests/angle_end2end_tests.gni
@@ -14,7 +14,6 @@
   "egl_tests/EGLCreateContextAttribsTest.cpp",
   "egl_tests/EGLDebugTest.cpp",
   "egl_tests/EGLMultiContextTest.cpp",
-  "egl_tests/EGLMultiThreadSteps.h",
   "egl_tests/EGLNoConfigContextTest.cpp",
   "egl_tests/EGLPreRotationTest.cpp",
   "egl_tests/EGLPrintEGLinfoTest.cpp",
@@ -44,6 +43,7 @@
   "gl_tests/ClientArraysTest.cpp",
   "gl_tests/ClipDistanceTest.cpp",
   "gl_tests/ColorMaskTest.cpp",
+  "gl_tests/CompressedTextureFormatsTest.cpp",
   "gl_tests/ComputeShaderTest.cpp",
   "gl_tests/ContextLostTest.cpp",
   "gl_tests/ContextNoErrorTest.cpp",
diff --git a/src/tests/angle_end2end_tests_expectations.txt b/src/tests/angle_end2end_tests_expectations.txt
index 5603dd1..afeeae6 100644
--- a/src/tests/angle_end2end_tests_expectations.txt
+++ b/src/tests/angle_end2end_tests_expectations.txt
@@ -15,10 +15,17 @@
 6142 VULKAN : BlitFramebufferTest.BlitDepthStencilPixelByPixel/* = SKIP
 6153 VULKAN WIN INTEL : GLSLTest_ES31.StructAndArrayEqualOperator/ES3_1_Vulkan_DirectSPIRVGen = SKIP
 6153 VULKAN PIXEL4ORXL : GLSLTest_ES31.StructAndArrayEqualOperator/ES3_1_Vulkan_DirectSPIRVGen = SKIP
-// Fails due to bug in glslang: https://github.com/KhronosGroup/glslang/issues/2694
-6178 VULKAN : GLSLTest_ES31.BoolInInterfaceBlocks/ES3_1_Vulkan = SKIP
-6178 VULKAN : GLSLTest_ES31.BoolInInterfaceBlocks/ES3_1_Vulkan_SwiftShader = SKIP
-6178 VULKAN : GLSLTest_ES31.BoolInInterfaceBlocks/ES3_1_Vulkan_AsyncQueue = SKIP
+6344 PIXEL4ORXL : GLSLTest_ES31_InitShaderVariables.InitIOBlockWithStruct/ES3_1_Vulkan_InitShaderVars = SKIP
+6344 PIXEL4ORXL : GLSLTest_ES31_InitShaderVariables.InitIOBlockWithComplexTypes/ES3_1_Vulkan_InitShaderVars = SKIP
+6347 OPENGL : FramebufferTestWithFormatFallback.R5G5B5A1_BlitCopyTexImage/* = SKIP
+6347 OPENGL : FramebufferTestWithFormatFallback.RGBA4444_BlitCopyTexImage/* = SKIP
+6347 GLES : FramebufferTestWithFormatFallback.R5G5B5A1_BlitCopyTexImage/* = SKIP
+6347 GLES : FramebufferTestWithFormatFallback.RGBA4444_BlitCopyTexImage/* = SKIP
+
+// Direct SPIR-V generation.  The following tests pass on some platforms but not others.  Need to investigate.
+4889 VULKAN : GeometryShaderTest.LayeredFramebufferPreRenderClear2DArrayColor/ES3_1_Vulkan_DirectSPIRVGen = SKIP
+4889 VULKAN : GeometryShaderTest.LayeredFramebufferPreRenderClear3DColor/ES3_1_Vulkan_DirectSPIRVGen = SKIP
+4889 VULKAN : GLSLTest_ES31.VaryingTessellationSampleInAndOut/ES3_1_Vulkan_DirectSPIRVGen = SKIP
 
 // Windows
 3786 WIN NVIDIA D3D11 : BufferDataOverflowTest.VertexBufferIntegerOverflow/* = SKIP
@@ -30,6 +37,7 @@
 6123 WIN AMD VULKAN : GLSLTestLoops.DoWhileContinueInSwitch/* = SKIP
 1229184 WIN NVIDIA VULKAN : SimpleStateChangeTest.RedefineFramebufferTexture/ES2_Vulkan = SKIP
 6173 WIN INTEL OPENGL : GLSLTest_ES31.BoolInInterfaceBlocks/* = SKIP
+6217 WIN INTEL OPENGL : GLSLTest_ES31.StorageBufferBoolVectorPassedToFunctions/* = SKIP
 
 // Linux
 6065 LINUX INTEL VULKAN : SimpleStateChangeTestES31.DrawThenUpdateUBOThenDrawThenDrawIndexed/* = SKIP
@@ -40,6 +48,9 @@
 1230024 LINUX AMD GLES : GLSLTest_ES31.TypesUsedInDifferentBlockStorages/* = SKIP
 1230024 LINUX AMD OPENGL : GLSLTest_ES31.TypesUsedInDifferentBlockStorages/* = SKIP
 6192 LINUX AMD OPENGL : GLSLTest_ES31.BoolInInterfaceBlocks/ES3_1_OpenGL = SKIP
+5945 LINUX NVIDIA VULKAN : MultithreadingTest.MultiContextClear/* = SKIP
+5945 LINUX NVIDIA VULKAN : MultithreadingTest.MultiCreateContext/* = SKIP
+6367 LINUX INTEL OPENGL : ComputeShaderTest.DispatchGenerateMipmapDispatch/ES3_1_OpenGL = SKIP
 
 // Nvidia
 6115 NVIDIA OPENGL : GLSLTestLoops.DoWhileContinue/* = SKIP
@@ -76,7 +87,15 @@
 6060 MAC METAL : BlitFramebufferTest.OOBWrite/* = SKIP
 6124 MAC OPENGL : GLSLTestLoops.*ContinueInSwitch/* = SKIP
 6144 MAC OPENGL : BlitFramebufferTest.BlitDepthStencilPixelByPixel/* = SKIP
+6236 MAC OPENGL : BufferDataTestES3.DrawWithNotCallingBufferData/* = SKIP
 1227129 MAC METAL : StateChangeTestES3.SamplerMetadataUpdateOnSetProgram/* = SKIP
+772651 MAC NVIDIA OPENGL : GLSLTest.VectorScalarDivideAndAddInLoop/* = SKIP
+772651 MAC NVIDIA OPENGL : GLSLTest.VectorScalarMultiplyAndAddInLoop/* = SKIP
+6318 MAC METAL : EGLBlobCacheTest.FragmentOutputLocationKey/* = SKIP
+6347 MAC OPENGL : FramebufferTestWithFormatFallback.R5G5B5A1_TexImage/* = SKIP
+6347 MAC OPENGL : FramebufferTestWithFormatFallback.R5G5B5A1_CopyTexImage/* = SKIP
+6347 MAC OPENGL : FramebufferTestWithFormatFallback.R5G5B5A1_CubeTexImage/* = SKIP
+6347 MAC OPENGL : FramebufferTestWithFormatFallback.R4G4B4A4_OutOfRangeStagedUpdateReformated/* = SKIP
 
 // D3D
 6091 WIN D3D11 : GLSLTest_ES3.InitGlobalComplexConstant/* = SKIP
@@ -85,14 +104,19 @@
 // Fails on assertion in translation to D3D
 3841 WIN D3D11 : GLSLTest_ES31.TypesUsedInDifferentBlockStorages/* = SKIP
 3841 WIN D3D11 : GLSLTest_ES31.BoolInInterfaceBlocks/* = SKIP
+// Mistranslation
+6216 WIN D3D11 : GLSLTest_ES31.StorageBufferBoolVectorPassedToFunctions/* = SKIP
 
 // Android
 6095 ANDROID GLES : GLSLTest_ES3.InitGlobalComplexConstant/ES3_OpenGLES = SKIP
 6116 ANDROID GLES : GLSLTestLoops.ForNoCondition/ES3_OpenGLES = SKIP
+6237 ANDROID GLES : BufferDataTestES3.DrawWithNotCallingBufferData/ES3_OpenGLES = SKIP
 
 // Nexus 5X expectations.
 6149 NEXUS5X GLES : GLSLTest_ES31.StructAndArrayEqualOperator/* = SKIP
 6193 NEXUS5X GLES : GLSLTest_ES31.BuiltInsWithOutParameters/* = SKIP
+5505 NEXUS5X GLES : GLSLTest_ES3.CompareInequalityOfArrayOfVectors/ES3_OpenGLES = SKIP
+5505 NEXUS5X GLES : GLSLTest_ES3.CompareEqualityOfArrayOfVectors/ES3_OpenGLES = SKIP
 
 // Pixel 4 expectations.
 5981 PIXEL4ORXL GLES : BlitFramebufferTest.BlitSRGBToRGBOversizedDestArea/* = SKIP
@@ -204,3 +228,13 @@
 
 // Test is disabled as it only pertains to desktop GLSL
 6197 : GLSLTest_ES31.InterpolateAtWithSwizzle/* = SKIP
+
+// Slow tests
+5076 : GLSLTest.VerifyMaxVertexUniformVectors* = TIMEOUT
+6251 : MultiThreadingTest* = TIMEOUT
+
+6336 VULKAN : GetImageTest.InconsistentTexture2D/* = SKIP
+
+6358 D3D11 : GLSLTest_ES3.UnsuccessfulRelinkWithBindAttribLocation/* = SKIP
+6358 SWIFTSHADER : GLSLTest_ES3.UnsuccessfulRelinkWithBindAttribLocation/* = SKIP
+6358 METAL : GLSLTest_ES3.UnsuccessfulRelinkWithBindAttribLocation/* = SKIP
diff --git a/src/tests/angle_end2end_tests_main.cpp b/src/tests/angle_end2end_tests_main.cpp
index 8f37aa2..9f496a2 100644
--- a/src/tests/angle_end2end_tests_main.cpp
+++ b/src/tests/angle_end2end_tests_main.cpp
@@ -19,11 +19,8 @@
 // likely specialize more register functions more like dEQP instead of relying on static init.
 void RegisterContextCompatibilityTests();
 
-// If we ever move to a text-based expectations format, we should move this list in that file.
 namespace
 {
-const char *kSlowTests[]               = {"GLSLTest.VerifyMaxVertexUniformVectors*",
-                            "MultiThreadingTest.MultiContextDeleteDraw*"};
 constexpr char kTestExpectationsPath[] = "src/tests/angle_end2end_tests_expectations.txt";
 }  // namespace
 
@@ -32,7 +29,6 @@
     angle::TestSuite testSuite(&argc, argv);
     ANGLEProcessTestArgs(&argc, argv);
     RegisterContextCompatibilityTests();
-    testSuite.registerSlowTests(kSlowTests, ArraySize(kSlowTests));
 
     constexpr size_t kMaxPath = 512;
     std::array<char, kMaxPath> foundDataPath;
@@ -43,7 +39,8 @@
     }
 
     // end2end test expectations only allow SKIP at the moment.
-    testSuite.setTestExpectationsAllowMask(angle::GPUTestExpectationsParser::kGpuTestSkip);
+    testSuite.setTestExpectationsAllowMask(angle::GPUTestExpectationsParser::kGpuTestSkip |
+                                           angle::GPUTestExpectationsParser::kGpuTestTimeout);
 
     if (!testSuite.loadAllTestExpectationsFromFile(std::string(foundDataPath.data())))
     {
diff --git a/src/tests/angle_unittests.gni b/src/tests/angle_unittests.gni
index 650cc92..7c2b0c5 100644
--- a/src/tests/angle_unittests.gni
+++ b/src/tests/angle_unittests.gni
@@ -88,7 +88,6 @@
   "compiler_tests/ConstantFoldingOverflow_test.cpp",
   "compiler_tests/ConstantFolding_test.cpp",
   "compiler_tests/ConstructCompiler_test.cpp",
-  "compiler_tests/DebugShaderPrecision_test.cpp",
   "compiler_tests/EXT_YUV_target_test.cpp",
   "compiler_tests/EXT_blend_func_extended_test.cpp",
   "compiler_tests/EXT_clip_cull_distance_test.cpp",
@@ -136,7 +135,6 @@
   "compiler_tests/TypeTracking_test.cpp",
   "compiler_tests/Type_test.cpp",
   "compiler_tests/VariablePacker_test.cpp",
-  "compiler_tests/VectorizeVectorScalarArithmetic_test.cpp",
   "compiler_tests/WorkGroupSize_test.cpp",
   "test_utils/ConstantFoldingTest.cpp",
   "test_utils/ConstantFoldingTest.h",
diff --git a/src/tests/capture_replay_tests.py b/src/tests/capture_replay_tests.py
index fc8d15a..6a7d4a3 100755
--- a/src/tests/capture_replay_tests.py
+++ b/src/tests/capture_replay_tests.py
@@ -25,6 +25,7 @@
 import difflib
 import distutils.util
 import fnmatch
+import json
 import logging
 import math
 import multiprocessing
@@ -38,11 +39,9 @@
 import time
 import traceback
 
-from sys import platform
-
 PIPE_STDOUT = True
 DEFAULT_OUT_DIR = "out/CaptureReplayTest"  # relative to angle folder
-DEFAULT_FILTER = "*/ES2_Vulkan"
+DEFAULT_FILTER = "*/ES2_Vulkan_SwiftShader"
 DEFAULT_TEST_SUITE = "angle_end2end_tests"
 REPLAY_SAMPLE_FOLDER = "src/tests/capture_replay_tests"  # relative to angle folder
 DEFAULT_BATCH_COUNT = 8  # number of tests batched together
@@ -53,8 +52,9 @@
 DEFAULT_RESULT_FILE = "results.txt"
 DEFAULT_LOG_LEVEL = "info"
 DEFAULT_MAX_JOBS = 8
+DEFAULT_MAX_NINJA_JOBS = 3
 REPLAY_BINARY = "capture_replay_tests"
-if platform == "win32":
+if sys.platform == "win32":
     REPLAY_BINARY += ".exe"
 TRACE_FOLDER = "traces"
 
@@ -79,84 +79,9 @@
         default:
             return {default_val};"""
 
-test_trace_info_init_template = """\
-    {{
-        "{namespace}",
-        {namespace}::kReplayContextClientMajorVersion,
-        {namespace}::kReplayContextClientMinorVersion,
-        {namespace}::kReplayPlatformType,
-        {namespace}::kReplayDeviceType,
-        {namespace}::kReplayFrameStart,
-        {namespace}::kReplayFrameEnd,
-        {namespace}::kReplayDrawSurfaceWidth,
-        {namespace}::kReplayDrawSurfaceHeight,
-        {namespace}::kDefaultFramebufferRedBits,
-        {namespace}::kDefaultFramebufferGreenBits,
-        {namespace}::kDefaultFramebufferBlueBits,
-        {namespace}::kDefaultFramebufferAlphaBits,
-        {namespace}::kDefaultFramebufferDepthBits,
-        {namespace}::kDefaultFramebufferStencilBits,
-        {namespace}::kIsBinaryDataCompressed,
-        {namespace}::kAreClientArraysEnabled,
-        {namespace}::kbindGeneratesResources,
-        {namespace}::kWebGLCompatibility,
-        {namespace}::kRobustResourceInit,
-    }},
-"""
-
-composite_h_file_template = """\
-#pragma once
-#include <vector>
-#include <string>
-
-{trace_headers}
-
-struct TestTraceInfo {{
-    std::string testName;
-    uint32_t replayContextMajorVersion;
-    uint32_t replayContextMinorVersion;
-    EGLint replayPlatformType;
-    EGLint replayDeviceType;
-    uint32_t replayFrameStart;
-    uint32_t replayFrameEnd;
-    EGLint replayDrawSurfaceWidth;
-    EGLint replayDrawSurfaceHeight;
-    EGLint defaultFramebufferRedBits;
-    EGLint defaultFramebufferGreenBits;
-    EGLint defaultFramebufferBlueBits;
-    EGLint defaultFramebufferAlphaBits;
-    EGLint defaultFramebufferDepthBits;
-    EGLint defaultFramebufferStencilBits;
-    bool isBinaryDataCompressed;
-    bool areClientArraysEnabled;
-    bool bindGeneratesResources;
-    bool webGLCompatibility;
-    bool robustResourceInit;
-}};
-
-extern std::vector<TestTraceInfo> testTraceInfos;
-"""
-
-composite_cpp_file_template = """\
-#include "{h_filename}"
-
-std::vector<TestTraceInfo> testTraceInfos =
-{{
-{test_trace_info_inits}
-}};
-"""
-
-
-def debug(str):
-    logging.debug('%s: %s' % (multiprocessing.current_process().name, str))
-
-
-def info(str):
-    logging.info('%s: %s' % (multiprocessing.current_process().name, str))
-
 
 def winext(name, ext):
-    return ("%s.%s" % (name, ext)) if platform == "win32" else name
+    return ("%s.%s" % (name, ext)) if sys.platform == "win32" else name
 
 
 def AutodetectGoma():
@@ -165,7 +90,7 @@
 
 class SubProcess():
 
-    def __init__(self, command, env=os.environ, pipe_stdout=PIPE_STDOUT):
+    def __init__(self, command, logger, env=os.environ, pipe_stdout=PIPE_STDOUT):
         # shell=False so that only 1 subprocess is spawned.
         # if shell=True, a shell process is spawned, which in turn spawns the process running
         # the command. Since we do not have a handle to the 2nd process, we cannot terminate it.
@@ -174,9 +99,10 @@
                 command, env=env, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, shell=False)
         else:
             self.proc_handle = subprocess.Popen(command, env=env, shell=False)
+        self._logger = logger
 
     def Join(self, timeout):
-        debug('Joining with subprocess %d, timeout %s' % (self.Pid(), str(timeout)))
+        self._logger.debug('Joining with subprocess %d, timeout %s' % (self.Pid(), str(timeout)))
         output = self.proc_handle.communicate(timeout=timeout)[0]
         if output:
             output = output.decode('utf-8')
@@ -201,7 +127,7 @@
         path = os.path.join('third_party', 'depot_tools')
         return os.path.join(path, winext('gn', 'bat')), os.path.join(path, winext('ninja', 'exe'))
 
-    def __init__(self):
+    def __init__(self, logger, ninja_lock):
         # a dictionary of Subprocess, with pid as key
         self.subprocesses = {}
         # list of Python multiprocess.Process handles
@@ -209,10 +135,12 @@
 
         self._gn_path, self._ninja_path = self._GetGnAndNinjaAbsolutePaths()
         self._use_goma = AutodetectGoma()
+        self._logger = logger
+        self._ninja_lock = ninja_lock
 
     def RunSubprocess(self, command, env=None, pipe_stdout=True, timeout=None):
-        proc = SubProcess(command, env, pipe_stdout)
-        debug('Created subprocess: %s with pid %d' % (' '.join(command), proc.Pid()))
+        proc = SubProcess(command, self._logger, env, pipe_stdout)
+        self._logger.debug('Created subprocess: %s with pid %d' % (' '.join(command), proc.Pid()))
         self.subprocesses[proc.Pid()] = proc
         try:
             returncode, output = self.subprocesses[proc.Pid()].Join(timeout)
@@ -275,8 +203,8 @@
             gn_args.append(('angle_assert_always_on', 'true'))
         if args.asan:
             gn_args.append(('is_asan', 'true'))
-        debug('Calling GN gen with %s' % str(gn_args))
         args_str = ' '.join(['%s=%s' % (k, v) for (k, v) in gn_args])
+        self._logger.info('Calling gn gen --args="%s"' % args_str)
         cmd = [self._gn_path, 'gen', '--args=%s' % args_str, build_dir]
         return self.RunSubprocess(cmd, pipe_stdout=pipe_stdout)
 
@@ -304,51 +232,37 @@
             cmd.append('%d' % os.cpu_count())
 
         cmd += ['-C', build_dir, target]
-        return self.RunSubprocess(cmd, pipe_stdout=pipe_stdout)
+        with self._ninja_lock:
+            self._logger.info('Running %s' % ' '.join(cmd))
+            return self.RunSubprocess(cmd, pipe_stdout=pipe_stdout)
 
 
-def GetTestsListForFilter(args, test_path, filter):
+def GetTestsListForFilter(args, test_path, filter, logger):
     cmd = GetRunCommand(args, test_path) + ["--list-tests", "--gtest_filter=%s" % filter]
-    info('Getting test list from "%s"' % " ".join(cmd))
+    logger.info('Getting test list from "%s"' % " ".join(cmd))
     return subprocess.check_output(cmd, text=True)
 
 
-def GetSkippedTestPatterns():
-    skipped_test_patterns = []
-    test_expectations_filename = "capture_replay_expectations.txt"
-    test_expectations_path = os.path.join(REPLAY_SAMPLE_FOLDER, test_expectations_filename)
-    with open(test_expectations_path, "rt") as f:
-        for line in f:
-            l = line.strip()
-            if l != "" and not l.startswith("#"):
-                skipped_test_patterns.append(l)
-    return skipped_test_patterns
-
-
-def ParseTestNamesFromTestList(output):
-    def SkipTest(skipped_test_patterns, test):
-        for skipped_test_pattern in skipped_test_patterns:
-            if fnmatch.fnmatch(test, skipped_test_pattern):
-                return True
-        return False
-
+def ParseTestNamesFromTestList(output, test_expectation, also_run_skipped_for_capture_tests,
+                               logger):
     output_lines = output.splitlines()
     tests = []
-    skipped_test_patterns = GetSkippedTestPatterns()
     seen_start_of_tests = False
-    skips = 0
+    disabled = 0
     for line in output_lines:
         l = line.strip()
-        if l == "Tests list:":
+        if l == 'Tests list:':
             seen_start_of_tests = True
+        elif l == 'End tests list.':
+            break
         elif not seen_start_of_tests:
             pass
-        elif not SkipTest(skipped_test_patterns, l):
+        elif not test_expectation.TestIsSkippedForCapture(l) or also_run_skipped_for_capture_tests:
             tests.append(l)
         else:
-            skips += 1
+            disabled += 1
 
-    info('Found %s tests and %d skipped tests.' % (len(tests), skips))
+    logger.info('Found %s tests and %d disabled tests.' % (len(tests), disabled))
     return tests
 
 
@@ -360,13 +274,14 @@
 
 
 class GroupedResult():
-    Passed = "Passed"
-    Failed = "Comparison Failed"
+    Passed = "Pass"
+    Failed = "Fail"
     TimedOut = "Timeout"
     Crashed = "Crashed"
     CompileFailed = "CompileFailed"
     Skipped = "Skipped"
 
+    ResultTypes = [Passed, Failed, TimedOut, Crashed, CompileFailed, Skipped]
 
     def __init__(self, resultcode, message, output, tests):
         self.resultcode = resultcode
@@ -382,32 +297,13 @@
     display_output_lines = 20
 
     def __init__(self, grouped_results, verbose):
-        self.passes = []
-        self.fails = []
-        self.timeouts = []
-        self.crashes = []
-        self.compile_fails = []
-        self.skips = []
+        self.results = {}
+        for result_type in GroupedResult.ResultTypes:
+            self.results[result_type] = []
 
         for grouped_result in grouped_results:
-            if grouped_result.resultcode == GroupedResult.Passed:
-                for test in grouped_result.tests:
-                    self.passes.append(test.full_test_name)
-            elif grouped_result.resultcode == GroupedResult.Failed:
-                for test in grouped_result.tests:
-                    self.fails.append(test.full_test_name)
-            elif grouped_result.resultcode == GroupedResult.TimedOut:
-                for test in grouped_result.tests:
-                    self.timeouts.append(test.full_test_name)
-            elif grouped_result.resultcode == GroupedResult.Crashed:
-                for test in grouped_result.tests:
-                    self.crashes.append(test.full_test_name)
-            elif grouped_result.resultcode == GroupedResult.CompileFailed:
-                for test in grouped_result.tests:
-                    self.compile_fails.append(test.full_test_name)
-            elif grouped_result.resultcode == GroupedResult.Skipped:
-                for test in grouped_result.tests:
-                    self.skips.append(test.full_test_name)
+            for test in grouped_result.tests:
+                self.results[grouped_result.resultcode].append(test.full_test_name)
 
         self.repr_str = ""
         self.GenerateRepresentationString(grouped_results, verbose)
@@ -484,8 +380,8 @@
                 source_txt_count += 1
             elif f.endswith(".h"):
                 context_header_count += 1
-                context = f.split(TRACE_FILE_SUFFIX)[1][:-2]
-                if context != "_shared":
+                if TRACE_FILE_SUFFIX in f:
+                    context = f.split(TRACE_FILE_SUFFIX)[1][:-2]
                     context_id = int(context)
             elif f.endswith(".cpp"):
                 context_source_count += 1
@@ -501,10 +397,11 @@
 
     CAPTURE_FRAME_END = 100
 
-    def __init__(self, args):
+    def __init__(self, args, logger):
         self.args = args
         self.tests = []
         self.results = []
+        self.logger = logger
 
     def SetWorkerId(self, worker_id):
         self.trace_dir = "%s%d" % (TRACE_FOLDER, worker_id)
@@ -513,31 +410,28 @@
     def RunWithCapture(self, args, child_processes_manager):
         test_exe_path = os.path.join(args.out_dir, 'Capture', args.test_suite)
 
-        # set the static environment variables that do not change throughout the script run
-        env = os.environ.copy()
-        env['ANGLE_CAPTURE_FRAME_END'] = '{}'.format(self.CAPTURE_FRAME_END)
-        env['ANGLE_CAPTURE_SERIALIZE_STATE'] = '1'
-        env['ANGLE_FEATURE_OVERRIDES_ENABLED'] = 'forceRobustResourceInit'
-        env['ANGLE_CAPTURE_ENABLED'] = '1'
+        extra_env = {
+            'ANGLE_CAPTURE_FRAME_END': '{}'.format(self.CAPTURE_FRAME_END),
+            'ANGLE_CAPTURE_SERIALIZE_STATE': '1',
+            'ANGLE_FEATURE_OVERRIDES_ENABLED': 'forceRobustResourceInit:forceInitShaderVariables',
+            'ANGLE_CAPTURE_ENABLED': '1',
+            'ANGLE_CAPTURE_OUT_DIR': self.trace_folder_path,
+        }
 
-        info('Setting ANGLE_CAPTURE_OUT_DIR to %s' % self.trace_folder_path)
-        env['ANGLE_CAPTURE_OUT_DIR'] = self.trace_folder_path
+        env = {**os.environ.copy(), **extra_env}
 
         if not self.args.keep_temp_files:
             ClearFolderContent(self.trace_folder_path)
         filt = ':'.join([test.full_test_name for test in self.tests])
 
         cmd = GetRunCommand(args, test_exe_path)
-        filter_string = '--gtest_filter=%s' % filt
-        cmd += [filter_string, '--angle-per-test-capture-label']
-
-        if self.args.verbose:
-            info("Run capture: '{} {}'".format(test_exe_path, filter_string))
+        cmd += ['--gtest_filter=%s' % filt, '--angle-per-test-capture-label']
+        self.logger.info("Run capture: '{}' with env {}".format(' '.join(cmd), str(extra_env)))
 
         returncode, output = child_processes_manager.RunSubprocess(
             cmd, env, timeout=SUBPROCESS_TIMEOUT)
         if args.show_capture_stdout:
-            info("Capture stdout: %s" % output)
+            self.logger.info("Capture stdout: %s" % output)
         if returncode == -1:
             self.results.append(GroupedResult(GroupedResult.Crashed, "", output, self.tests))
             return False
@@ -565,9 +459,7 @@
     def BuildReplay(self, replay_build_dir, composite_file_id, tests, child_processes_manager):
         # write gni file that holds all the traces files in a list
         self.CreateGNIFile(composite_file_id, tests)
-        # write header and cpp composite files, which glue the trace files with
-        # CaptureReplayTests.cpp
-        self.CreateTestsCompositeFiles(composite_file_id, tests)
+        self.CreateTestNamesFile(composite_file_id, tests)
 
         gn_args = [('angle_build_capture_replay_tests', 'true'),
                    ('angle_capture_replay_test_trace_dir', '"%s"' % self.trace_dir),
@@ -575,6 +467,7 @@
         returncode, output = child_processes_manager.RunGNGen(self.args, replay_build_dir, True,
                                                               gn_args)
         if returncode != 0:
+            self.logger.warning('GN failure output: %s' % output)
             self.results.append(
                 GroupedResult(GroupedResult.CompileFailed, "Build replay failed at gn generation",
                               output, tests))
@@ -582,6 +475,7 @@
         returncode, output = child_processes_manager.RunNinja(self.args, replay_build_dir,
                                                               REPLAY_BINARY, True)
         if returncode != 0:
+            self.logger.warning('Ninja failure output: %s' % output)
             self.results.append(
                 GroupedResult(GroupedResult.CompileFailed, "Build replay failed at ninja", output,
                               tests))
@@ -589,12 +483,13 @@
         return True
 
     def RunReplay(self, replay_build_dir, replay_exe_path, child_processes_manager, tests):
-        env = os.environ.copy()
-        env['ANGLE_CAPTURE_ENABLED'] = '0'
-        env['ANGLE_FEATURE_OVERRIDES_ENABLED'] = 'enable_capture_limits'
+        extra_env = {
+            'ANGLE_CAPTURE_ENABLED': '0',
+            'ANGLE_FEATURE_OVERRIDES_ENABLED': 'enable_capture_limits',
+        }
+        env = {**os.environ.copy(), **extra_env}
 
-        if self.args.verbose:
-            info("Run Replay: {}".format(replay_exe_path))
+        self.logger.info("Run Replay: {} with env {}".format(replay_exe_path, str(extra_env)))
 
         returncode, output = child_processes_manager.RunSubprocess(
             GetRunCommand(self.args, replay_exe_path), env, timeout=SUBPROCESS_TIMEOUT)
@@ -620,7 +515,7 @@
                     passes.append(self.FindTestByLabel(words[1]))
                 else:
                     fails.append(self.FindTestByLabel(words[1]))
-                    logging.info("Context comparison failed: {}".format(
+                    self.logger.info("Context comparison failed: {}".format(
                         self.FindTestByLabel(words[1])))
                     self.PrintContextDiff(replay_build_dir, words[1])
 
@@ -666,47 +561,28 @@
             label = test.GetLabel()
             assert (test.context_id > 0)
 
-            fname = "%s%s%d_files.txt" % (label, TRACE_FILE_SUFFIX, test.context_id)
+            fname = '%s%s%d_files.txt' % (label, TRACE_FILE_SUFFIX, test.context_id)
             fpath = os.path.join(self.trace_folder_path, fname)
             with open(fpath) as f:
                 files = f.readlines()
                 f.close()
             files = ['"%s/%s"' % (self.trace_dir, file.strip()) for file in files]
-            angledata = "%s%s_shared.angledata.gz" % (label, TRACE_FILE_SUFFIX)
+            angledata = '%s%s.angledata.gz' % (label, TRACE_FILE_SUFFIX)
+            jsondata = '%s%s.json' % (label, TRACE_FILE_SUFFIX)
             test_list += [
-                '["%s", %s, [%s], "%s"]' % (label, test.context_id, ','.join(files), angledata)
+                '["%s", %s, [%s], ["%s", "%s"]]' %
+                (label, test.context_id, ','.join(files), angledata, jsondata)
             ]
-        gni_path = os.path.join(self.trace_folder_path, "traces%d.gni" % composite_file_id)
-        with open(gni_path, "w") as f:
-            f.write("trace_data = [\n%s\n]\n" % ',\n'.join(test_list))
+        gni_path = os.path.join(self.trace_folder_path, 'traces%d.gni' % composite_file_id)
+        with open(gni_path, 'w') as f:
+            f.write('trace_data = [\n%s\n]\n' % ',\n'.join(test_list))
             f.close()
 
-    # header and cpp composite files, which glue the trace files with CaptureReplayTests.cpp
-    def CreateTestsCompositeFiles(self, composite_file_id, tests):
-        # write CompositeTests header file
-        include_header_template = '#include "{header_file_path}.h"\n'
-        trace_headers = "".join([
-            include_header_template.format(header_file_path=test.GetLabel() + TRACE_FILE_SUFFIX +
-                                           str(test.context_id)) for test in tests
-        ])
-
-        h_filename = "CompositeTests%d.h" % composite_file_id
-        with open(os.path.join(self.trace_folder_path, h_filename), "w") as h_file:
-            h_file.write(composite_h_file_template.format(trace_headers=trace_headers))
-            h_file.close()
-
-        # write CompositeTests cpp file
-        test_trace_info_inits = "".join([
-            test_trace_info_init_template.format(namespace=tests[i].GetLabel())
-            for i in range(len(tests))
-        ])
-
-        cpp_filename = "CompositeTests%d.cpp" % composite_file_id
-        with open(os.path.join(self.trace_folder_path, cpp_filename), "w") as cpp_file:
-            cpp_file.write(
-                composite_cpp_file_template.format(
-                    h_filename=h_filename, test_trace_info_inits=test_trace_info_inits))
-            cpp_file.close()
+    def CreateTestNamesFile(self, composite_file_id, tests):
+        data = {'traces': [test.GetLabel() for test in tests]}
+        names_path = os.path.join(self.trace_folder_path, 'test_names_%d.json' % composite_file_id)
+        with open(names_path, 'w') as f:
+            f.write(json.dumps(data))
 
     def __str__(self):
         repr_str = "TestBatch:\n"
@@ -725,6 +601,96 @@
         return TestBatchResult(self.results, self.args.verbose)
 
 
+class TestExpectation():
+    # tests that must not be run as list
+    skipped_for_capture_tests = []
+
+    # test expectations for tests that do not pass
+    non_pass_results = {}
+
+    flaky_tests = []
+
+    non_pass_re = {}
+
+    # yapf: disable
+    # we want each pair on one line
+    result_map = { "FAIL" : GroupedResult.Failed,
+                   "TIMEOUT" : GroupedResult.TimedOut,
+                   "CRASHED" : GroupedResult.Crashed,
+                   "COMPILE_FAILED" : GroupedResult.CompileFailed,
+                   "SKIPPED_BY_GTEST" : GroupedResult.Skipped,
+                   "PASS" : GroupedResult.Passed}
+    # yapf: enable
+
+    def __init__(self, args):
+        expected_results_filename = "capture_replay_expectations.txt"
+        expected_results_path = os.path.join(REPLAY_SAMPLE_FOLDER, expected_results_filename)
+        self._asan = args.asan
+        with open(expected_results_path, "rt") as f:
+            for line in f:
+                l = line.strip()
+                if l != "" and not l.startswith("#"):
+                    self.ReadOneExpectation(l, args.debug)
+
+    def _CheckTagsWithConfig(self, tags, config_tags):
+        for tag in tags:
+            if tag not in config_tags:
+                return False
+        return True
+
+    def ReadOneExpectation(self, line, is_debug):
+        (testpattern, result) = line.split('=')
+        (test_info_string, test_name_string) = testpattern.split(':')
+        test_name = test_name_string.strip()
+        test_info = test_info_string.strip().split()
+        result_stripped = result.strip()
+
+        tags = []
+        if len(test_info) > 1:
+            tags = test_info[1:]
+
+        config_tags = [GetPlatformForSkip()]
+        if self._asan:
+            config_tags += ['ASAN']
+        if is_debug:
+            config_tags += ['DEBUG']
+
+        if self._CheckTagsWithConfig(tags, config_tags):
+            test_name_regex = re.compile('^' + test_name.replace('*', '.*') + '$')
+            if result_stripped == 'SKIP_FOR_CAPTURE':
+                self.skipped_for_capture_tests.append(test_name_regex)
+            elif result_stripped == 'FLAKY':
+                self.flaky_tests.append(test_name_regex)
+            else:
+                self.non_pass_results[test_name] = self.result_map[result_stripped]
+                self.non_pass_re[test_name] = test_name_regex
+
+    def TestIsSkippedForCapture(self, test_name):
+        for p in self.skipped_for_capture_tests:
+            m = p.match(test_name)
+            if m is not None:
+                return True
+        return False
+
+    def Filter(self, test_list, run_all_tests):
+        result = {}
+        for t in test_list:
+            for key in self.non_pass_results.keys():
+                if self.non_pass_re[key].match(t) is not None:
+                    result[t] = self.non_pass_results[key]
+            if run_all_tests:
+                for skip in self.skipped_for_capture_tests:
+                    if skip.match(t) is not None:
+                        result[t] = "'forced skip'"
+        return result
+
+    def IsFlaky(self, test_name):
+        for flaky in self.flaky_tests:
+            if flaky.match(test_name) is not None:
+                return True
+        return False
+
+
 def ClearFolderContent(path):
     all_files = []
     for f in os.listdir(path):
@@ -737,11 +703,11 @@
     return cwd
 
 
-def RunTests(args, worker_id, job_queue, result_list, message_queue):
+def RunTests(args, worker_id, job_queue, result_list, message_queue, logger, ninja_lock):
     replay_build_dir = os.path.join(args.out_dir, 'Replay%d' % worker_id)
     replay_exec_path = os.path.join(replay_build_dir, REPLAY_BINARY)
 
-    child_processes_manager = ChildProcessesManager()
+    child_processes_manager = ChildProcessesManager(logger, ninja_lock)
     # used to differentiate between multiple composite files when there are multiple test batchs
     # running on the same worker and --deleted_trace is set to False
     composite_file_id = 1
@@ -822,8 +788,21 @@
             SafeDeleteFolder(folder_path)
 
 
+def GetPlatformForSkip():
+    # yapf: disable
+    # we want each pair on one line
+    platform_map = { "win32" : "WIN",
+                     "linux" : "LINUX" }
+    # yapf: enable
+    return platform_map.get(sys.platform, "UNKNOWN")
+
+
 def main(args):
-    child_processes_manager = ChildProcessesManager()
+    logger = multiprocessing.log_to_stderr()
+    logger.setLevel(level=args.log.upper())
+
+    ninja_lock = multiprocessing.Semaphore(args.max_ninja_jobs)
+    child_processes_manager = ChildProcessesManager(logger, ninja_lock)
     try:
         start_time = time.time()
         # set the number of workers to be cpu_count - 1 (since the main process already takes up a
@@ -836,20 +815,24 @@
         capture_build_dir = os.path.normpath(r"%s/Capture" % args.out_dir)
         returncode, output = child_processes_manager.RunGNGen(args, capture_build_dir, False)
         if returncode != 0:
-            logging.error(output)
+            logger.error(output)
             child_processes_manager.KillAll()
             return EXIT_FAILURE
         # run ninja to build all tests
         returncode, output = child_processes_manager.RunNinja(args, capture_build_dir,
                                                               args.test_suite, False)
         if returncode != 0:
-            logging.error(output)
+            logger.error(output)
             child_processes_manager.KillAll()
             return EXIT_FAILURE
         # get a list of tests
         test_path = os.path.join(capture_build_dir, args.test_suite)
-        test_list = GetTestsListForFilter(args, test_path, args.gtest_filter)
-        test_names = ParseTestNamesFromTestList(test_list)
+        test_list = GetTestsListForFilter(args, test_path, args.filter, logger)
+        test_expectation = TestExpectation(args)
+        test_names = ParseTestNamesFromTestList(test_list, test_expectation,
+                                                args.also_run_skipped_for_capture_tests, logger)
+        test_expectation_for_list = test_expectation.Filter(
+            test_names, args.also_run_skipped_for_capture_tests)
         # objects created by manager can be shared by multiple processes. We use it to create
         # collections that are shared by multiple processes such as job queue or result list.
         manager = multiprocessing.Manager()
@@ -858,7 +841,7 @@
 
         # put the test batchs into the job queue
         for batch_index in range(test_batch_num):
-            batch = TestBatch(args)
+            batch = TestBatch(args, logger)
             test_index = batch_index
             while test_index < len(test_names):
                 batch.AddTest(Test(test_names[test_index]))
@@ -872,12 +855,12 @@
         compile_failed_count = 0
         skipped_count = 0
 
-        failed_tests = []
-        timed_out_tests = []
-        crashed_tests = []
-        compile_failed_tests = []
-        skipped_tests = []
+        unexpected_count = {}
+        unexpected_test_results = {}
 
+        for type in GroupedResult.ResultTypes:
+            unexpected_count[type] = 0
+            unexpected_test_results[type] = []
 
         # result list is created by manager and can be shared by multiple processes. Each
         # subprocess populates the result list with the results of its test runs. After all
@@ -892,7 +875,8 @@
         # spawning and starting up workers
         for worker_id in range(worker_count):
             proc = multiprocessing.Process(
-                target=RunTests, args=(args, worker_id, job_queue, result_list, message_queue))
+                target=RunTests,
+                args=(args, worker_id, job_queue, result_list, message_queue, logger, ninja_lock))
             child_processes_manager.AddWorker(proc)
             proc.start()
 
@@ -904,77 +888,92 @@
         while child_processes_manager.IsAnyWorkerAlive():
             while not message_queue.empty():
                 msg = message_queue.get()
-                info(msg)
+                logger.info(msg)
                 last_message_timestamp = time.time()
             cur_time = time.time()
             if cur_time - last_message_timestamp > TIME_BETWEEN_MESSAGE:
                 last_message_timestamp = cur_time
-                info("Tests are still running. Remaining workers: " + \
+                logger.info("Tests are still running. Remaining workers: " + \
                 str(child_processes_manager.GetRemainingWorkers()) + \
                 ". Unstarted jobs: " + str(job_queue.qsize()))
             time.sleep(1.0)
         child_processes_manager.JoinWorkers()
         while not message_queue.empty():
             msg = message_queue.get()
-            logging.warning(msg)
+            logger.warning(msg)
         end_time = time.time()
 
         # print out results
-        logging.info("\n\n\n")
-        logging.info("Results:")
-        for test_batch_result in result_list:
-            debug(str(test_batch_result))
-            passed_count += len(test_batch_result.passes)
-            failed_count += len(test_batch_result.fails)
-            timedout_count += len(test_batch_result.timeouts)
-            crashed_count += len(test_batch_result.crashes)
-            compile_failed_count += len(test_batch_result.compile_fails)
-            skipped_count += len(test_batch_result.skips)
+        logger.info("\n\n\n")
+        logger.info("Results:")
 
-            for failed_test in test_batch_result.fails:
-                failed_tests.append(failed_test)
-            for timeout_test in test_batch_result.timeouts:
-                timed_out_tests.append(timeout_test)
-            for crashed_test in test_batch_result.crashes:
-                crashed_tests.append(crashed_test)
-            for compile_failed_test in test_batch_result.compile_fails:
-                compile_failed_tests.append(compile_failed_test)
-            for skipped_test in test_batch_result.skips:
-                skipped_tests.append(skipped_test)
+        flaky_results = []
 
-        logging.info("\n\n")
-        logging.info("Elapsed time: %.2lf seconds" % (end_time - start_time))
-        logging.info(
-            "Passed: %d, Comparison Failed: %d, Crashed: %d, CompileFailed %d, Skipped: %d, Timeout: %d"
+        for test_batch in result_list:
+            test_batch_result = test_batch.results
+            logger.debug(str(test_batch_result))
+
+            passed_count += len(test_batch_result[GroupedResult.Passed])
+            failed_count += len(test_batch_result[GroupedResult.Failed])
+            timedout_count += len(test_batch_result[GroupedResult.TimedOut])
+            crashed_count += len(test_batch_result[GroupedResult.Crashed])
+            compile_failed_count += len(test_batch_result[GroupedResult.CompileFailed])
+            skipped_count += len(test_batch_result[GroupedResult.Skipped])
+
+            for real_result, test_list in test_batch_result.items():
+                for test in test_list:
+                    if test_expectation.IsFlaky(test):
+                        flaky_results.append("{} ({})".format(test, real_result))
+                        continue
+
+                    # Passing tests are not in the list
+                    if test not in test_expectation_for_list.keys():
+                        if real_result != GroupedResult.Passed:
+                            unexpected_count[real_result] += 1
+                            unexpected_test_results[real_result].append(
+                                "{} {} (expected Pass or is new test)".format(test, real_result))
+                    else:
+                        expected_result = test_expectation_for_list[test]
+                        if real_result != expected_result:
+                            unexpected_count[real_result] += 1
+                            unexpected_test_results[real_result].append(
+                                "{} {} (expected {})".format(test, real_result, expected_result))
+
+        logger.info("")
+        logger.info("Elapsed time: %.2lf seconds" % (end_time - start_time))
+        logger.info("")
+
+        if len(flaky_results):
+            logger.info("Flaky test(s):")
+            for line in flaky_results:
+                logger.info("    {}".format(line))
+            logger.info("")
+
+        logger.info(
+            "Summary: Passed: %d, Comparison Failed: %d, Crashed: %d, CompileFailed %d, Skipped: %d, Timeout: %d"
             % (passed_count, failed_count, crashed_count, compile_failed_count, skipped_count,
                timedout_count))
 
         retval = EXIT_SUCCESS
 
-        if len(failed_tests):
-            logging.info("Comparison Failed tests:")
-            for failed_test in sorted(failed_tests):
-                logging.info("  " + failed_test)
+        unexpected_test_results_count = 0
+        for count in unexpected_count.values():
+            unexpected_test_results_count += count
+
+        if unexpected_test_results_count > 0:
             retval = EXIT_FAILURE
-        if len(crashed_tests):
-            logging.info("Crashed tests:")
-            for crashed_test in sorted(crashed_tests):
-                logging.info("  " + crashed_test)
-            retval = EXIT_FAILURE
-        if len(compile_failed_tests):
-            logging.info("Compile failed tests:")
-            for compile_failed_test in sorted(compile_failed_tests):
-                logging.info("  " + compile_failed_test)
-            retval = EXIT_FAILURE
-        if len(skipped_tests):
-            logging.info("Skipped tests:")
-            for skipped_test in sorted(skipped_tests):
-                logging.info("  " + skipped_test)
-        if len(timed_out_tests):
-            logging.info("Timeout tests:")
-            for timeout_test in sorted(timed_out_tests):
-                logging.info("  " + timeout_test)
-            retval = EXIT_FAILURE
+            logger.info("")
+            logger.info("Failure: Obtained {} results that differ from expectation:".format(
+                unexpected_test_results_count))
+            logger.info("")
+            for result, count in unexpected_count.items():
+                if count > 0:
+                    logger.info("Unexpected '{}' ({}):".format(result, count))
+                    for test_result in unexpected_test_results[result]:
+                        logger.info("     {}".format(test_result))
+                    logger.info("")
+
+        logger.info("\n\n")
 
         # delete generated folders if --keep_temp_files flag is set to false
         if args.purge:
@@ -993,7 +992,7 @@
         return EXIT_FAILURE
 
 
-if __name__ == "__main__":
+if __name__ == '__main__':
     parser = argparse.ArgumentParser()
     parser.add_argument(
         '--out-dir',
@@ -1006,6 +1005,8 @@
         action='store_true',
         help='Use goma for distributed builds. Requires internal access. Off by default.')
     parser.add_argument(
+        '-f',
+        '--filter',
         '--gtest_filter',
         default=DEFAULT_FILTER,
         help='Same as GoogleTest\'s filter argument. Default is "%s".' % DEFAULT_FILTER)
@@ -1024,22 +1025,22 @@
         help='Whether to keep the temp files and folders. Off by default')
     parser.add_argument('--purge', help='Purge all build directories on exit.')
     parser.add_argument(
-        "--goma-dir",
-        default="",
+        '--goma-dir',
+        default='',
         help='Set custom goma directory. Uses the goma in path by default.')
     parser.add_argument(
-        "--output-to-file",
+        '--output-to-file',
         action='store_true',
         help='Whether to write output to a result file. Off by default')
     parser.add_argument(
-        "--result-file",
+        '--result-file',
         default=DEFAULT_RESULT_FILE,
         help='Name of the result file in the capture_replay_tests folder. Default is "%s".' %
         DEFAULT_RESULT_FILE)
-    parser.add_argument('-v', "--verbose", action='store_true', help='Off by default')
+    parser.add_argument('-v', "--verbose", action='store_true', help='Shows full test output.')
     parser.add_argument(
-        "-l",
-        "--log",
+        '-l',
+        '--log',
         default=DEFAULT_LOG_LEVEL,
         help='Controls the logging level. Default is "%s".' % DEFAULT_LOG_LEVEL)
     parser.add_argument(
@@ -1048,6 +1049,17 @@
         default=DEFAULT_MAX_JOBS,
         type=int,
         help='Maximum number of test processes. Default is %d.' % DEFAULT_MAX_JOBS)
+    parser.add_argument(
+        '-a',
+        '--also-run-skipped-for-capture-tests',
+        action='store_true',
+        help='Also run tests that are disabled in the expectations by SKIP_FOR_CAPTURE')
+    parser.add_argument(
+        '--max-ninja-jobs',
+        type=int,
+        default=DEFAULT_MAX_NINJA_JOBS,
+        help='Maximum number of concurrent ninja jobs to run at once.')
+
     # TODO(jmadill): Remove this argument. http://anglebug.com/6102
     parser.add_argument('--depot-tools-path', default=None, help='Path to depot tools')
     parser.add_argument('--xvfb', action='store_true', help='Run with xvfb.')
@@ -1056,10 +1068,14 @@
         '--show-capture-stdout', action='store_true', help='Print test stdout during capture.')
     parser.add_argument('--debug', action='store_true', help='Debug builds (default is Release).')
     args = parser.parse_args()
-    if platform == "win32":
+    if args.debug and (args.out_dir == DEFAULT_OUT_DIR):
+        args.out_dir = args.out_dir + "Debug"
+
+    if sys.platform == "win32":
         args.test_suite += ".exe"
     if args.output_to_file:
         logging.basicConfig(level=args.log.upper(), filename=args.result_file)
     else:
         logging.basicConfig(level=args.log.upper())
+
     sys.exit(main(args))
diff --git a/src/tests/capture_replay_tests/BUILD.gn b/src/tests/capture_replay_tests/BUILD.gn
index 57de597..922efcb 100644
--- a/src/tests/capture_replay_tests/BUILD.gn
+++ b/src/tests/capture_replay_tests/BUILD.gn
@@ -25,8 +25,6 @@
     ]
   }
 
-  # TODO (nguyenmh): http://anglebug.com/4758:
-  # turn angle_executable into angle_test when adding android support
   import(
       "${angle_capture_replay_test_trace_dir}/traces${angle_capture_replay_composite_file_id}.gni")
 
@@ -42,7 +40,7 @@
       trace_dir = angle_capture_replay_test_trace_dir
       trace_ctx = _trace_data[1]
       sources = _trace_data[2]
-      angledata = _trace_data[3]
+      data = _trace_data[3]
       fixture = ":angle_capture_replay_tests_fixture"
       output_name = _trace
     }
@@ -52,15 +50,13 @@
 
   angle_executable("capture_replay_tests") {
     testonly = true
-    sources = [
-      "${angle_capture_replay_test_trace_dir}/CompositeTests${angle_capture_replay_composite_file_id}.cpp",
-      "${angle_capture_replay_test_trace_dir}/CompositeTests${angle_capture_replay_composite_file_id}.h",
-      "CaptureReplayTests.cpp",
-    ]
+    sources = [ "CaptureReplayTests.cpp" ]
+    data = [ "${angle_capture_replay_test_trace_dir}/test_names_${angle_capture_replay_composite_file_id}.json" ]
     deps = [
              ":angle_capture_replay_tests_fixture",
              "$angle_root:angle_common",
              "$angle_root:angle_compression",
+             "$angle_root/util:angle_frame_capture_test_utils",
            ] + _traces
     configs += [
       "$angle_root:library_name_config",
@@ -80,9 +76,7 @@
     _data_path = rebase_path(_trace_folder_relative_path, root_out_dir)
     defines = [
       "ANGLE_CAPTURE_REPLAY_TEST_DATA_DIR=\"${_data_path}\"",
-      "ANGLE_CAPTURE_REPLAY_COMPOSITE_TESTS_HEADER=" +
-          angle_capture_replay_test_trace_dir +
-          "/CompositeTests${angle_capture_replay_composite_file_id}.h",
+      "ANGLE_CAPTURE_REPLAY_TEST_NAMES_PATH=\"${_data_path}/test_names_${angle_capture_replay_composite_file_id}.json\"",
       "ANGLE_REPLAY_EXPORT=",
     ]
     include_dirs = [ "." ]
diff --git a/src/tests/capture_replay_tests/CaptureReplayTests.cpp b/src/tests/capture_replay_tests/CaptureReplayTests.cpp
index 8b6ac86..c1f5be5 100644
--- a/src/tests/capture_replay_tests/CaptureReplayTests.cpp
+++ b/src/tests/capture_replay_tests/CaptureReplayTests.cpp
@@ -24,13 +24,10 @@
 #include <string>
 #include <utility>
 
-#include "util/frame_capture_test_utils.h"
-
-// Build the right context header based on replay ID
-// This will expand to "angle_capture_context<#>.h"
-#include ANGLE_MACRO_STRINGIZE(ANGLE_CAPTURE_REPLAY_COMPOSITE_TESTS_HEADER)
+#include "util/capture/frame_capture_test_utils.h"
 
 constexpr char kResultTag[] = "*RESULT";
+constexpr char kTracePath[] = ANGLE_CAPTURE_REPLAY_TEST_NAMES_PATH;
 
 class CaptureReplayTests
 {
@@ -51,10 +48,10 @@
         OSWindow::Delete(&mOSWindow);
     }
 
-    bool initializeTest(uint32_t testIndex, const TestTraceInfo &testTraceInfo)
+    bool initializeTest(const angle::TraceInfo &traceInfo)
     {
-        if (!mOSWindow->initialize(testTraceInfo.testName, testTraceInfo.replayDrawSurfaceWidth,
-                                   testTraceInfo.replayDrawSurfaceHeight))
+        if (!mOSWindow->initialize(traceInfo.name, traceInfo.drawSurfaceWidth,
+                                   traceInfo.drawSurfaceHeight))
         {
             return false;
         }
@@ -62,8 +59,8 @@
         mOSWindow->disableErrorMessageDialog();
         mOSWindow->setVisible(true);
 
-        if (mEGLWindow && !mEGLWindow->isContextVersion(testTraceInfo.replayContextMajorVersion,
-                                                        testTraceInfo.replayContextMinorVersion))
+        if (mEGLWindow && !mEGLWindow->isContextVersion(traceInfo.contextClientMajorVersion,
+                                                        traceInfo.contextClientMinorVersion))
         {
             EGLWindow::Delete(&mEGLWindow);
             mEGLWindow = nullptr;
@@ -71,25 +68,26 @@
 
         if (!mEGLWindow)
         {
-            mEGLWindow = EGLWindow::New(testTraceInfo.replayContextMajorVersion,
-                                        testTraceInfo.replayContextMinorVersion);
+            mEGLWindow = EGLWindow::New(traceInfo.contextClientMajorVersion,
+                                        traceInfo.contextClientMinorVersion);
         }
 
         ConfigParameters configParams;
-        configParams.redBits     = testTraceInfo.defaultFramebufferRedBits;
-        configParams.greenBits   = testTraceInfo.defaultFramebufferGreenBits;
-        configParams.blueBits    = testTraceInfo.defaultFramebufferBlueBits;
-        configParams.alphaBits   = testTraceInfo.defaultFramebufferAlphaBits;
-        configParams.depthBits   = testTraceInfo.defaultFramebufferDepthBits;
-        configParams.stencilBits = testTraceInfo.defaultFramebufferStencilBits;
+        configParams.redBits     = traceInfo.configRedBits;
+        configParams.greenBits   = traceInfo.configGreenBits;
+        configParams.blueBits    = traceInfo.configBlueBits;
+        configParams.alphaBits   = traceInfo.configAlphaBits;
+        configParams.depthBits   = traceInfo.configDepthBits;
+        configParams.stencilBits = traceInfo.configStencilBits;
 
-        configParams.clientArraysEnabled   = testTraceInfo.areClientArraysEnabled;
-        configParams.bindGeneratesResource = testTraceInfo.bindGeneratesResources;
-        configParams.webGLCompatibility    = testTraceInfo.webGLCompatibility;
-        configParams.robustResourceInit    = testTraceInfo.robustResourceInit;
+        configParams.clientArraysEnabled   = traceInfo.areClientArraysEnabled;
+        configParams.bindGeneratesResource = traceInfo.isBindGeneratesResourcesEnabled;
+        configParams.webGLCompatibility    = traceInfo.isWebGLCompatibilityEnabled;
+        configParams.robustResourceInit    = traceInfo.isRobustResourceInitEnabled;
 
-        mPlatformParams.renderer   = testTraceInfo.replayPlatformType;
-        mPlatformParams.deviceType = testTraceInfo.replayDeviceType;
+        mPlatformParams.renderer                 = traceInfo.displayPlatformType;
+        mPlatformParams.deviceType               = traceInfo.displayDeviceType;
+        mPlatformParams.forceInitShaderVariables = EGL_TRUE;
 
         if (!mEGLWindow->initializeGL(mOSWindow, mEntryPointsLib.get(),
                                       angle::GLESDriverType::AngleEGL, mPlatformParams,
@@ -105,19 +103,15 @@
             return false;
         }
 
-        mStartingDirectory = angle::GetCWD().value();
-
         // Load trace
-        mTraceLibrary.reset(new angle::TraceLibrary(testTraceInfo.testName.c_str()));
-
-        // Set CWD to executable directory.
-        std::string exeDir = angle::GetExecutableDirectory();
-        if (!angle::SetCWD(exeDir.c_str()))
+        mTraceLibrary.reset(new angle::TraceLibrary(traceInfo.name));
+        if (!mTraceLibrary->valid())
         {
-            cleanupTest();
+            std::cout << "Failed to load trace library: " << traceInfo.name << "\n";
             return false;
         }
-        if (testTraceInfo.isBinaryDataCompressed)
+
+        if (traceInfo.isBinaryDataCompressed)
         {
             mTraceLibrary->setBinaryDataDecompressCallback(angle::DecompressBinaryData);
         }
@@ -129,7 +123,6 @@
 
     void cleanupTest()
     {
-        angle::SetCWD(mStartingDirectory.c_str());
         mTraceLibrary.reset(nullptr);
         mEGLWindow->destroyGL();
         mOSWindow->destroy();
@@ -137,35 +130,40 @@
 
     void swap() { mEGLWindow->swap(); }
 
-    int runTest(uint32_t testIndex, const TestTraceInfo &testTraceInfo)
+    int runTest(const angle::TraceInfo &traceInfo)
     {
-        if (!initializeTest(testIndex, testTraceInfo))
+        if (!initializeTest(traceInfo))
         {
             return -1;
         }
 
-        for (uint32_t frame = testTraceInfo.replayFrameStart; frame <= testTraceInfo.replayFrameEnd;
-             frame++)
+        for (uint32_t frame = traceInfo.frameStart; frame <= traceInfo.frameEnd; frame++)
         {
             mTraceLibrary->replayFrame(frame);
 
-            const GLubyte *bytes = glGetString(GL_SERIALIZED_CONTEXT_STRING_ANGLE);
+            const char *capturedSerializedState =
+                reinterpret_cast<const char *>(glGetString(GL_SERIALIZED_CONTEXT_STRING_ANGLE));
+            const char *replayedSerializedState = mTraceLibrary->getSerializedContextState(frame);
+
             bool isEqual =
-                compareSerializedContexts(testIndex, frame, reinterpret_cast<const char *>(bytes));
+                (capturedSerializedState && replayedSerializedState)
+                    ? compareSerializedContexts(replayedSerializedState, capturedSerializedState)
+                    : (capturedSerializedState == replayedSerializedState);
+
             // Swap always to allow RenderDoc/other tools to capture frames.
             swap();
             if (!isEqual)
             {
                 std::ostringstream replayName;
-                replayName << testTraceInfo.testName << "_ContextReplayed" << frame << ".json";
+                replayName << traceInfo.name << "_ContextReplayed" << frame << ".json";
                 std::ofstream debugReplay(replayName.str());
-                debugReplay << reinterpret_cast<const char *>(bytes) << "\n";
+                debugReplay << (replayedSerializedState ? replayedSerializedState : "") << "\n";
 
                 std::ostringstream captureName;
-                captureName << testTraceInfo.testName << "_ContextCaptured" << frame << ".json";
+                captureName << traceInfo.name << "_ContextCaptured" << frame << ".json";
                 std::ofstream debugCapture(captureName.str());
 
-                debugCapture << mTraceLibrary->getSerializedContextState(frame) << "\n";
+                debugCapture << (capturedSerializedState ? capturedSerializedState : "") << "\n";
 
                 cleanupTest();
                 return -1;
@@ -177,25 +175,55 @@
 
     int run()
     {
-        for (size_t i = 0; i < testTraceInfos.size(); i++)
+        std::string startingDirectory = angle::GetCWD().value();
+
+        // Set CWD to executable directory.
+        std::string exeDir = angle::GetExecutableDirectory();
+        if (!angle::SetCWD(exeDir.c_str()))
         {
-            int result = runTest(static_cast<uint32_t>(i), testTraceInfos[i]);
-            std::cout << kResultTag << " " << testTraceInfos[i].testName << " " << result << "\n";
+            std::cout << "Unable to SetCWD to trace directory: " << exeDir << "\n";
+            return 1;
         }
+
+        std::vector<std::string> traces;
+        if (!angle::LoadTraceNamesFromJSON(kTracePath, &traces))
+        {
+            std::cout << "Unable to load trace names from " << kTracePath << "\n";
+            return 1;
+        }
+
+        for (const std::string &trace : traces)
+        {
+            std::stringstream traceJsonPathStream;
+            traceJsonPathStream << ANGLE_CAPTURE_REPLAY_TEST_DATA_DIR << angle::GetPathSeparator()
+                                << trace << ".json";
+            std::string traceJsonPath = traceJsonPathStream.str();
+
+            int result                 = -1;
+            angle::TraceInfo traceInfo = {};
+            if (!angle::LoadTraceInfoFromJSON(trace, traceJsonPath, &traceInfo))
+            {
+                std::cout << "Unable to load trace data: " << traceJsonPath << "\n";
+            }
+            else
+            {
+                result = runTest(traceInfo);
+            }
+            std::cout << kResultTag << " " << trace << " " << result << "\n";
+        }
+
+        angle::SetCWD(startingDirectory.c_str());
         return 0;
     }
 
   private:
-    bool compareSerializedContexts(uint32_t testIndex,
-                                   uint32_t frame,
+    bool compareSerializedContexts(const char *capturedSerializedContextState,
                                    const char *replaySerializedContextState)
     {
 
-        return !strcmp(replaySerializedContextState,
-                       mTraceLibrary->getSerializedContextState(frame));
+        return !strcmp(replaySerializedContextState, capturedSerializedContextState);
     }
 
-    std::string mStartingDirectory;
     OSWindow *mOSWindow   = nullptr;
     EGLWindow *mEGLWindow = nullptr;
     EGLPlatformParameters mPlatformParams;
diff --git a/src/tests/capture_replay_tests/capture_replay_expectations.txt b/src/tests/capture_replay_tests/capture_replay_expectations.txt
index e047757..23ac84a 100644
--- a/src/tests/capture_replay_tests/capture_replay_expectations.txt
+++ b/src/tests/capture_replay_tests/capture_replay_expectations.txt
@@ -3,78 +3,164 @@
 # Use of this source code is governed by a BSD-style license that can be
 # found in the LICENSE file.
 #
-# capture_replay_expectations:
-#   Skip these tests because they are expected to fail
+# Test are entered like
+# BUG PLATFORMS : test-name = handling/result
+#
+#  PLATFORMS is optional and lists the platforms the expectation / run disabling happens
+#
+# Valid values for "handling/result" are
+#
+#   SKIP_FOR_CAPTURE : capture_replay_tests.py drops this test from the
+#                      list of tests that will be passed to end2end_tests,
+#                      i.e. we will not try to run the test
+#
+#   SKIPPED_BY_GTEST : the is expceted to be skipped by the end2end_tests program
+#
+#   FAIL : the test is expected to fail
+#
+#   FLAKY : the tests is flaky, but we still run it
+#
+#   TIMEOUT : the test is expected to time out
+#
+#   COMPILE_FAILED : the compilation of the capture_replay exec is expected to fail
+#
+#   CRASHED : the test is expected to crash
+#
+# For test batches that run more than one test TIMEOUT, COMPILE_FAILED, and CRASHED
+# will have to be set for all tests that run a batch, because one test that fails
+# with one of these outcomes will bring down the whole batch.
 #
 
-# Failed tests
-D3DImageFormatConversionTest.*
-DrawBuffersTest.UnwrittenOutputVariablesShouldNotCrash/*
-FramebufferTest.MultiContextNoRenderingFeedbackLoops/*
-ImageTest.Deletion/*
-ImageTest.MipLevels/*
-ImageTest.Source2DTarget2D/*
-ImageTest.Source2DTargetExternal/*
-ImageTest.SourceCubeTarget2D/*
-ImageTest.SourceRenderbufferTargetTexture/*
-ImageTest.SourceRenderbufferTargetTextureExternal/*
-ImageTest.UpdatedData/*
-PbufferTest.BindTexImage/*
-PbufferTest.Clearing/*
-PbufferTest.TextureSizeReset/*
-SimpleStateChangeTest.DrawAndClearTextureRepeatedly/*
-SimpleStateChangeTest.RebindTranslatedAttribute/*
-WebGL2ReadOutsideFramebufferTest.CopyTexSubImage3D/*
-WebGLDrawElementsTest.DrawElementsTypeAlignment/*
-WebGLGLSLTest.*
-WebGLReadOutsideFramebufferTest.*
+# We don't support the Capture/Replay on OpenGL yet
 
-# http://anglebug.com/6006 Failing on bots
-GLSLTest.InactiveVaryingInVertexActiveInFragment/*
-# Flanky tests, pass standalone, but fail in a group
-ColorMaskTest.AMDZeroColorMaskBug/ES3_OpenGL
-WebGLCompatibilityTest.DrawArraysBufferOutOfBoundsNonInstanced/ES2_Vulkan_SwiftShader
-WebGLCompatibilityTest.DrawElementsBufferOutOfBoundsInIndexBuffer/ES2_Vulkan_SwiftShader
-WebGLCompatibilityTest.DrawElementsBufferOutOfBoundsInVertexBuffer/ES2_Vulkan_SwiftShader
+6345 : *OpenGL = SKIP_FOR_CAPTURE
 
-# Crashed tests
-BlitFramebufferANGLETest.Reverse*/*
-BlitFramebufferANGLETest.Scissored*/*
-ClipDistanceTest.*
-DebugMarkerTest.*
-DebugTest.*
-EGLStreamTest.*
-ExternalWrapTest.*
-GetImageTestNoExtensions.EntryPointsInactive/*
-GLSLTest.ArrayOfStructContainingArrayOfSamplers/*
-GLSLTest.InactiveSamplersInStruct/*
-GLSLTest.MixedShaderLengths/*
-GLSLTest.ZeroShaderLength/*
-GPUTestConfigTest.GPUTestConfigConditions_D3D11/*
-ImageTest.SourceCubeTargetExternal/*
-PBOExtensionTest.*
-RobustBufferAccessBehaviorTest.*
-Texture2DTest.DefineMultipleLevelsWithoutMipmapping/*
-VertexAttributeTest.*
+# ES2
 
-# Crashes because closing the FD fails and this raises an assertion
-VulkanExternalImageTest.ShouldImportSemaphoreOpaqueFd/ES2_Vulkan_SwiftShader
+6266 : ContextLostSkipValidationTest.LostNoErrorGetProgram/ES2_Vulkan = FAIL
+6266 : ContextLostTest.ParallelCompileReadyQuery/ES2_Vulkan = FAIL
 
-# Replay times out
-VulkanExternalImageTest.WaitSemaphoresRetainsContentOpaqueFd/ES2_Vulkan_SwiftShader
-VulkanExternalImageTest.ShouldClearOpaqueFdWithSema*/ES2_Vulkan_SwiftShader
-VulkanExternalImageTest.ShouldDrawOpaqueFdWithSemaphores/ES2_Vulkan_SwiftShader
+6180 : EGLContextASANTest.DestroyContextInUse/ES2_Vulkan = FAIL
+6267 : EGLContextSharingTest.TextureLifetime/ES2_Vulkan = SKIP_FOR_CAPTURE
+6269 : EGLContextSharingTest.BindTextureAfterShareContextFree/ES2_Vulkan = SKIPPED_BY_GTEST
+6269 : EGLContextSharingTest.DisplayShareGroupObjectSharing/ES2_Vulkan = SKIPPED_BY_GTEST
+6269 : EGLContextSharingTest.DisplayShareGroupReleasedWithLastContext/ES2_Vulkan = SKIPPED_BY_GTEST
 
-WebGLCompatibilityTest.MultiContextNoRenderingFeedbackLoops/*
-WebGLFramebufferTest.*
+5822 : ExternalWrapTest.ClampToEdge/* = SKIP_FOR_CAPTURE
+5822 : ExternalWrapTest.MirroredRepeat/* = SKIP_FOR_CAPTURE
+5822 : ExternalWrapTest.NoWrap/* = SKIP_FOR_CAPTURE
+5822 : ExternalWrapTest.Repeat/* = SKIP_FOR_CAPTURE
 
-# Skipped tests
-EGLProgramCacheControlTest.NegativeAPI/*
-EGLProgramCacheControlTest.SaveAndReload/*
-LineLoopTest.DISABLED_DrawArraysWithLargeCount/*
-MipmapTest.DISABLED_ThreeLevelsInitData/*
+6267 : FramebufferTest.MultiContextNoRenderingFeedbackLoops/* = SKIP_FOR_CAPTURE
 
-# Compile failed tests
+6286 : ImageTest.Deletion/* = FAIL
+6286 : ImageTest.MipLevels/* = FAIL
 
-# ES1 comparison failed tests
-BootAnimationTest.DefaultBootAnimation/*
+6286 : ImageTest.Source2DTarget2D/* = FAIL
+6286 : ImageTest.Source2DTargetExternal/* = FAIL
+6286 : ImageTest.SourceCubeTarget2D/* = FAIL
+5822 : ImageTest.SourceCubeTargetExternal/* = SKIP_FOR_CAPTURE
+6286 : ImageTest.SourceRenderbufferTargetTexture/* = FAIL
+6286 : ImageTest.SourceRenderbufferTargetTextureExternal/* = FAIL
+6286 : ImageTest.UpdatedData/* = FAIL
+
+6180 : MipmapTest.DefineValidExtraLevelAndUseItLater/ES2_Vulkan = FAIL
+6180 : MipmapTest.GenerateMipmapAfterModifyingBaseLevel/ES2_Vulkan = FAIL
+6180 : MipmapTest.GenerateMipmapAfterSingleLevelDraw/ES2_Vulkan = FAIL
+6180 : MipmapTest.GenerateMipmapFromInitDataThenRender/ES2_Vulkan = FAIL
+6180 : MipmapTest.GenerateMipmapFromRenderedImage/ES2_Vulkan = FAIL
+6180 : MipmapTest.MipMapGenerationD3D9Bug/ES2_Vulkan = FAIL
+6180 : MipmapTest.MipmapsForTexture3DOES/ES2_Vulkan = FAIL
+6180 : MipmapTest.RenderOntoLevelZeroAfterGenerateMipmap/ES2_Vulkan = FAIL
+
+6180 : PbufferTest.BindTexImage/* = FAIL
+6180 : PbufferTest.Clearing/* = FAIL
+6180 : PbufferTest.TextureSizeReset/* = FAIL
+
+6220 : Texture2DTest.DefineMultipleLevelsWithoutMipmapping/* = SKIP_FOR_CAPTURE
+
+6221 : VulkanExternalImageTest.ShouldClearOpaqueFdWithSemaphores/ES2_Vulkan* = SKIP_FOR_CAPTURE
+6221 : VulkanExternalImageTest.ShouldClearOpaqueFdWithSemaphoresMutableNoStorage/ES2_Vulkan* = SKIP_FOR_CAPTURE
+6221 : VulkanExternalImageTest.ShouldClearOpaqueFdWithSemaphoresNoStorage/ES2_Vulkan* = SKIP_FOR_CAPTURE
+6221 : VulkanExternalImageTest.ShouldClearOpaqueFdWithSemaphoresWithFlags/ES2_Vulkan* = SKIP_FOR_CAPTURE
+6221 : VulkanExternalImageTest.ShouldDrawOpaqueFdWithSemaphores/ES2_Vulkan* = SKIP_FOR_CAPTURE
+6221 : VulkanExternalImageTest.WaitSemaphoresRetainsContentOpaqueFd/ES2_Vulkan* = SKIP_FOR_CAPTURE
+
+6267 : WebGLCompatibilityTest.MultiContextNoRenderingFeedbackLoops/* = SKIP_FOR_CAPTURE
+
+6180 WIN : WebGLCompatibilityTest.DrawElementsBufferOutOfBoundsInVertexBuffer/ES2_Vulkan_SwiftShader = FAIL
+
+# Fails because of unsupported combined depth/stencil GetImage.
+4688 ASAN : DepthStencilTest.DepthOnlyEmulatedWithPacked/ES2_Vulkan_SwiftShader = FAIL
+
+# flaky test
+6180 : DrawBuffersTest.UnwrittenOutputVariablesShouldNotCrash/ES2_Vulkan_SwiftShader = FLAKY
+6180 : WebGLCompatibilityTest.DrawElementsBufferOutOfBoundsInIndexBuffer/ES2_Vulkan_SwiftShader = FLAKY
+6180 : ImageTest.MipLevels/* = FLAKY
+6373 : WebGLCompatibilityTest.DrawArraysBufferOutOfBoundsNonInstanced/* = FLAKY
+
+# ES3
+6180 : BlitFramebufferTest.BlitDepthStencilPixelByPixel/ES3_Vulkan_SwiftShader = SKIPPED_BY_GTEST
+
+6180 : FenceSyncTest.BasicOperations/ES3_Vulkan_SwiftShader = FAIL
+6180 : FenceSyncTest.BasicQueries/ES3_Vulkan_SwiftShader = FAIL
+6180 : FenceSyncTest.Errors/ES3_Vulkan_SwiftShader = FAIL
+6180 : FenceSyncTest.IsSync/ES3_Vulkan_SwiftShader = FAIL
+6180 : FenceSyncTest.MultipleFenceDraw/ES3_Vulkan_SwiftShader = FAIL
+6180 : ImageRespecificationTest.ImageTarget2DOESSwitch/ES3_Vulkan_SwiftShader = FAIL
+6180 : ImageTest.Source2DTarget2DArray/ES3_Vulkan_SwiftShader = FAIL
+6180 : ImageTestES3.Source2DTarget2DTargetTextureRespecifyLevel/ES3_Vulkan_SwiftShader = FAIL
+6180 : ImageTestES3.Source2DTargetExternalESSL3/ES3_Vulkan_SwiftShader = FAIL
+6180 : ImageTestES3.SourceRenderbufferTargetTextureExternalESSL3/ES3_Vulkan_SwiftShader = FAIL
+6180 : ObjectAllocationTest.BindFramebufferAfterGen/ES3_Vulkan_SwiftShader = FAIL
+6180 : ObjectAllocationTest.BindFramebufferBeforeGen/ES3_Vulkan_SwiftShader = FAIL
+6180 : RobustResourceInitTestES3.BindTexImage/ES3_Vulkan_SwiftShader = FAIL
+6180 : TransformFeedbackTest.MultiContext/ES3_Vulkan_SwiftShader = FAIL
+6180 : UniformBufferTest.BlockArrayContainingArrayOfStructs/ES3_Vulkan_SwiftShader = FAIL
+6180 : UniformBufferTest.ManyBlocks/ES3_Vulkan_SwiftShader = FAIL
+
+# Skip because crashes
+6313 : CopyTextureTestES3.InvalidateBlitThenBlend1000Layers/ES3_Vulkan_SwiftShader = SKIP_FOR_CAPTURE
+6313 : CopyTextureTestES3.InvalidateBlitThenBlend3Layers/ES3_Vulkan_SwiftShader = SKIP_FOR_CAPTURE
+6314 : FramebufferTest_ES3.AttachmentsWithUnequalDimensions/ES3_Vulkan_SwiftShader = SKIP_FOR_CAPTURE
+6314 : FramebufferTest_ES3.ChangeAttachmentThenInvalidateAndDraw/ES3_Vulkan_SwiftShader = SKIP_FOR_CAPTURE
+6314 : FramebufferTest_ES3.RenderAndInvalidateImmutableTextureWithBellowBaseLevelLOD/ES3_Vulkan_SwiftShader = SKIP_FOR_CAPTURE
+6314 : FramebufferTest_ES3.RenderAndInvalidateImmutableTextureWithBeyondMaxLevel/ES3_Vulkan_SwiftShader = SKIP_FOR_CAPTURE
+6314 : FramebufferTest_ES3.RenderAndInvalidateImmutableTextureWithSubImageWithBeyondMaxLevel/ES3_Vulkan_SwiftShader = SKIP_FOR_CAPTURE
+6315 : GLSLTest_ES3.InactiveFragmentShaderOutput/ES3_Vulkan_SwiftShader = SKIP_FOR_CAPTURE
+6180 : ImageTestES3.SourceCubeTargetExternalESSL3/ES3_Vulkan_SwiftShader = SKIP_FOR_CAPTURE
+6334 : MipmapTestES3.GenerateMipmapBaseLevelOutOfRangeImmutableTexture/ES3_Vulkan_SwiftShader = SKIP_FOR_CAPTURE
+6324 : OcclusionQueriesTestES3.UnresolveNotCounted/ES3_Vulkan_SwiftShader = SKIP_FOR_CAPTURE
+6325 : ProgramBinaryTest.SRGBDecodeWithSamplerAndTexelFetchTest/ES3_Vulkan_SwiftShader = SKIP_FOR_CAPTURE
+6329 : RenderbufferMultisampleTest.OddSampleCount/ES3_Vulkan_SwiftShader = SKIP_FOR_CAPTURE
+6333 : Texture2DFloatTestES3.TextureHalfFloatLinearLegacyTest/ES3_Vulkan_SwiftShader = SKIP_FOR_CAPTURE
+6333 : Texture2DFloatTestES3.TextureHalfFloatSampleLegacyTest/ES3_Vulkan_SwiftShader = SKIP_FOR_CAPTURE
+6334 : Texture2DTestES3.ImmutableTextureBaseLevelOutOfRange/ES3_Vulkan_SwiftShader = SKIP_FOR_CAPTURE
+6180 : Texture2DTestES3.TexStorage2DCycleThroughYuvSourcesNoData/ES3_Vulkan_SwiftShader = SKIP_FOR_CAPTURE
+6180 : Texture2DTestES3.TextureBaseLevelGreaterThanMaxLevel/ES3_Vulkan_SwiftShader = SKIP_FOR_CAPTURE
+6180 : Texture2DTestES3.TexStorage2DSimultaneousUseOfMultipleYuvSourcesNoData/ES3_Vulkan_SwiftShader = SKIP_FOR_CAPTURE
+6180 : Texture2DTestES3.TextureCompletenessChangesWithBaseLevel/ES3_Vulkan_SwiftShader = SKIP_FOR_CAPTURE
+6180 : Texture2DTestES3.TextureCompletenessChangesWithMaxLevel/ES3_Vulkan_SwiftShader = SKIP_FOR_CAPTURE
+6180 : Texture2DTestES3.TexStorage2DLargeYuvTextureCount/ES3_Vulkan_SwiftShader = SKIP_FOR_CAPTURE
+6180 : Texture2DTestES3.UpdateRenderTargetCacheOnDestroyTexStorage/ES3_Vulkan_SwiftShader = SKIP_FOR_CAPTURE
+6180 : Texture3DTestES3.Texture3DCompletenessChangesWithMaxLevel/ES3_Vulkan_SwiftShader = SKIP_FOR_CAPTURE
+6180 : VulkanExternalImageTest.ShouldClearOpaqueFdWithSemaphores/ES3_Vulkan_SwiftShader = SKIP_FOR_CAPTURE
+6180 : VulkanExternalImageTest.ShouldClearOpaqueFdWithSemaphoresMutableNoStorage/ES3_Vulkan_SwiftShader = SKIP_FOR_CAPTURE
+6180 : VulkanExternalImageTest.ShouldClearOpaqueFdWithSemaphoresNoStorage/ES3_Vulkan_SwiftShader = SKIP_FOR_CAPTURE
+6180 : VulkanExternalImageTest.ShouldClearOpaqueFdWithSemaphoresWithFlags/ES3_Vulkan_SwiftShader = SKIP_FOR_CAPTURE
+6180 : VulkanExternalImageTest.ShouldDrawOpaqueFdWithSemaphores/ES3_Vulkan_SwiftShader = SKIP_FOR_CAPTURE
+6180 : VulkanExternalImageTest.WaitSemaphoresRetainsContentOpaqueFd/ES3_Vulkan_SwiftShader = SKIP_FOR_CAPTURE
+6335 DEBUG : VulkanExternalImageTest.ShouldImportSemaphoreOpaqueFd/ES3_Vulkan_SwiftShader = SKIP_FOR_CAPTURE
+
+# Skip because CompileFailed
+6180 : ReadPixelsPBOTest.ExistingDataPreserved/ES3_Vulkan_SwiftShader = SKIP_FOR_CAPTURE
+6180 : UniformTestES3.ReturnsOnlyOneArrayElement/ES3_Vulkan_SwiftShader = SKIP_FOR_CAPTURE
+
+# Skip because Timeout
+
+# ES3 Flaky
+6180 : FenceSyncTest.BasicOperations/ES3_Vulkan_SwiftShader = FLAKY
+6180 : FenceSyncTest.BasicQueries/ES3_Vulkan_SwiftShader = FLAKY
+6180 : FenceSyncTest.IsSync/ES3_Vulkan_SwiftShader = FLAKY
+6180 : FenceSyncTest.Errors/ES3_Vulkan_SwiftShader = FLAKY
+6180 : FenceSyncTest.MultipleFenceDraw/ES3_Vulkan_SwiftShader = FLAKY
diff --git a/src/tests/compiler_tests/APPLE_clip_distance_test.cpp b/src/tests/compiler_tests/APPLE_clip_distance_test.cpp
index 958c6e0..6d26572 100644
--- a/src/tests/compiler_tests/APPLE_clip_distance_test.cpp
+++ b/src/tests/compiler_tests/APPLE_clip_distance_test.cpp
@@ -109,6 +109,36 @@
     InitializeCompiler(SH_SPIRV_VULKAN_OUTPUT);
     EXPECT_TRUE(TestShaderCompile(EXTPragma));
 }
+
+// Test that the SPIR-V gen path can compile a shader when this extension is not supported.
+TEST_P(APPLEClipDistanceTest, CompileSucceedsWithoutExtSupportVulkan)
+{
+    mResources.APPLE_clip_distance = 0;
+    mResources.MaxClipDistances    = 0;
+    mResources.MaxCullDistances    = 0;
+
+    InitializeCompiler(SH_SPIRV_VULKAN_OUTPUT);
+
+    constexpr char kNoClipCull[] = R"(
+    void main()
+    {
+        gl_Position = vec4(0);
+    })";
+    const char *shaderStrings[]  = {kNoClipCull};
+
+    bool success =
+        sh::Compile(mCompiler, shaderStrings, 1, SH_OBJECT_CODE | SH_GENERATE_SPIRV_DIRECTLY);
+    if (success)
+    {
+        ::testing::AssertionSuccess() << "Compilation success";
+    }
+    else
+    {
+        ::testing::AssertionFailure() << sh::GetInfoLog(mCompiler);
+    }
+
+    EXPECT_TRUE(success);
+}
 #endif
 
 #if defined(ANGLE_ENABLE_METAL)
diff --git a/src/tests/compiler_tests/DebugShaderPrecision_test.cpp b/src/tests/compiler_tests/DebugShaderPrecision_test.cpp
deleted file mode 100644
index d5fbde4..0000000
--- a/src/tests/compiler_tests/DebugShaderPrecision_test.cpp
+++ /dev/null
@@ -1,1112 +0,0 @@
-//
-// Copyright 2014 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-// DebugShaderPrecision_test.cpp:
-//   Tests for writing the code for shader precision emulation.
-//
-
-#include "GLSLANG/ShaderLang.h"
-#include "angle_gl.h"
-#include "gtest/gtest.h"
-#include "tests/test_utils/compiler_test.h"
-
-using namespace sh;
-
-class DebugShaderPrecisionTest : public MatchOutputCodeTest
-{
-  public:
-    DebugShaderPrecisionTest() : MatchOutputCodeTest(GL_FRAGMENT_SHADER, 0, SH_ESSL_OUTPUT)
-    {
-        addOutputType(SH_GLSL_COMPATIBILITY_OUTPUT);
-#if defined(ANGLE_ENABLE_HLSL)
-        addOutputType(SH_HLSL_4_1_OUTPUT);
-#endif
-        getResources()->WEBGL_debug_shader_precision = 1;
-    }
-
-  protected:
-    bool foundInAllGLSLCode(const char *str)
-    {
-        return foundInCode(SH_GLSL_COMPATIBILITY_OUTPUT, str) && foundInCode(SH_ESSL_OUTPUT, str);
-    }
-
-    bool foundInHLSLCode(const char *stringToFind) const
-    {
-#if defined(ANGLE_ENABLE_HLSL)
-        return foundInCode(SH_HLSL_4_1_OUTPUT, stringToFind);
-#else
-        return true;
-#endif
-    }
-
-    bool foundInHLSLCodeRegex(const char *regexToFind) const
-    {
-#if defined(ANGLE_ENABLE_HLSL)
-        return foundInCodeRegex(SH_HLSL_4_1_OUTPUT, std::regex(regexToFind));
-#else
-        return true;
-#endif
-    }
-};
-
-class NoDebugShaderPrecisionTest : public MatchOutputCodeTest
-{
-  public:
-    NoDebugShaderPrecisionTest()
-        : MatchOutputCodeTest(GL_FRAGMENT_SHADER, 0, SH_GLSL_COMPATIBILITY_OUTPUT)
-    {}
-};
-
-TEST_F(DebugShaderPrecisionTest, RoundingFunctionsDefined)
-{
-    const std::string &shaderString =
-        "precision mediump float;\n"
-        "uniform float u;\n"
-        "void main() {\n"
-        "   gl_FragColor = vec4(u);\n"
-        "}\n";
-    compile(shaderString);
-    ASSERT_TRUE(foundInESSLCode("highp float angle_frm(in highp float"));
-    ASSERT_TRUE(foundInESSLCode("highp vec2 angle_frm(in highp vec2"));
-    ASSERT_TRUE(foundInESSLCode("highp vec3 angle_frm(in highp vec3"));
-    ASSERT_TRUE(foundInESSLCode("highp vec4 angle_frm(in highp vec4"));
-    ASSERT_TRUE(foundInESSLCode("highp mat2 angle_frm(in highp mat2"));
-    ASSERT_TRUE(foundInESSLCode("highp mat3 angle_frm(in highp mat3"));
-    ASSERT_TRUE(foundInESSLCode("highp mat4 angle_frm(in highp mat4"));
-
-    ASSERT_TRUE(foundInESSLCode("highp float angle_frl(in highp float"));
-    ASSERT_TRUE(foundInESSLCode("highp vec2 angle_frl(in highp vec2"));
-    ASSERT_TRUE(foundInESSLCode("highp vec3 angle_frl(in highp vec3"));
-    ASSERT_TRUE(foundInESSLCode("highp vec4 angle_frl(in highp vec4"));
-    ASSERT_TRUE(foundInESSLCode("highp mat2 angle_frl(in highp mat2"));
-    ASSERT_TRUE(foundInESSLCode("highp mat3 angle_frl(in highp mat3"));
-    ASSERT_TRUE(foundInESSLCode("highp mat4 angle_frl(in highp mat4"));
-
-    ASSERT_TRUE(foundInGLSLCode("float angle_frm(in float"));
-    ASSERT_TRUE(foundInGLSLCode("vec2 angle_frm(in vec2"));
-    ASSERT_TRUE(foundInGLSLCode("vec3 angle_frm(in vec3"));
-    ASSERT_TRUE(foundInGLSLCode("vec4 angle_frm(in vec4"));
-    ASSERT_TRUE(foundInGLSLCode("mat2 angle_frm(in mat2"));
-    ASSERT_TRUE(foundInGLSLCode("mat3 angle_frm(in mat3"));
-    ASSERT_TRUE(foundInGLSLCode("mat4 angle_frm(in mat4"));
-
-    ASSERT_TRUE(foundInGLSLCode("float angle_frl(in float"));
-    ASSERT_TRUE(foundInGLSLCode("vec2 angle_frl(in vec2"));
-    ASSERT_TRUE(foundInGLSLCode("vec3 angle_frl(in vec3"));
-    ASSERT_TRUE(foundInGLSLCode("vec4 angle_frl(in vec4"));
-    ASSERT_TRUE(foundInGLSLCode("mat2 angle_frl(in mat2"));
-    ASSERT_TRUE(foundInGLSLCode("mat3 angle_frl(in mat3"));
-    ASSERT_TRUE(foundInGLSLCode("mat4 angle_frl(in mat4"));
-
-    ASSERT_TRUE(foundInHLSLCode("float1 angle_frm(float1"));
-    ASSERT_TRUE(foundInHLSLCode("float2 angle_frm(float2"));
-    ASSERT_TRUE(foundInHLSLCode("float3 angle_frm(float3"));
-    ASSERT_TRUE(foundInHLSLCode("float4 angle_frm(float4"));
-    ASSERT_TRUE(foundInHLSLCode("float2x2 angle_frm(float2x2"));
-    ASSERT_TRUE(foundInHLSLCode("float3x3 angle_frm(float3x3"));
-    ASSERT_TRUE(foundInHLSLCode("float4x4 angle_frm(float4x4"));
-
-    ASSERT_TRUE(foundInHLSLCode("float1 angle_frl(float1"));
-    ASSERT_TRUE(foundInHLSLCode("float2 angle_frl(float2"));
-    ASSERT_TRUE(foundInHLSLCode("float3 angle_frl(float3"));
-    ASSERT_TRUE(foundInHLSLCode("float4 angle_frl(float4"));
-    ASSERT_TRUE(foundInHLSLCode("float2x2 angle_frl(float2x2"));
-    ASSERT_TRUE(foundInHLSLCode("float3x3 angle_frl(float3x3"));
-    ASSERT_TRUE(foundInHLSLCode("float4x4 angle_frl(float4x4"));
-
-    // Check that ESSL 3.00 rounding functions for non-square matrices are not defined.
-    ASSERT_TRUE(notFoundInCode("mat2x"));
-    ASSERT_TRUE(notFoundInCode("mat3x"));
-    ASSERT_TRUE(notFoundInCode("mat4x"));
-}
-
-// Test that all ESSL 3.00 shaders get rounding function definitions for non-square matrices.
-TEST_F(DebugShaderPrecisionTest, NonSquareMatrixRoundingFunctionsDefinedES3)
-{
-    const std::string &shaderString =
-        "#version 300 es\n"
-        "precision mediump float;\n"
-        "uniform float u;\n"
-        "out vec4 my_FragColor;\n"
-        "void main() {\n"
-        "   my_FragColor = vec4(u);\n"
-        "}\n";
-    compile(shaderString);
-    ASSERT_TRUE(foundInESSLCode("highp mat2x3 angle_frm(in highp mat2x3"));
-    ASSERT_TRUE(foundInESSLCode("highp mat2x4 angle_frm(in highp mat2x4"));
-    ASSERT_TRUE(foundInESSLCode("highp mat3x2 angle_frm(in highp mat3x2"));
-    ASSERT_TRUE(foundInESSLCode("highp mat3x4 angle_frm(in highp mat3x4"));
-    ASSERT_TRUE(foundInESSLCode("highp mat4x2 angle_frm(in highp mat4x2"));
-    ASSERT_TRUE(foundInESSLCode("highp mat4x3 angle_frm(in highp mat4x3"));
-
-    ASSERT_TRUE(foundInESSLCode("highp mat2x3 angle_frl(in highp mat2x3"));
-    ASSERT_TRUE(foundInESSLCode("highp mat2x4 angle_frl(in highp mat2x4"));
-    ASSERT_TRUE(foundInESSLCode("highp mat3x2 angle_frl(in highp mat3x2"));
-    ASSERT_TRUE(foundInESSLCode("highp mat3x4 angle_frl(in highp mat3x4"));
-    ASSERT_TRUE(foundInESSLCode("highp mat4x2 angle_frl(in highp mat4x2"));
-    ASSERT_TRUE(foundInESSLCode("highp mat4x3 angle_frl(in highp mat4x3"));
-
-    ASSERT_TRUE(foundInGLSLCode("mat2x3 angle_frm(in mat2x3"));
-    ASSERT_TRUE(foundInGLSLCode("mat2x4 angle_frm(in mat2x4"));
-    ASSERT_TRUE(foundInGLSLCode("mat3x2 angle_frm(in mat3x2"));
-    ASSERT_TRUE(foundInGLSLCode("mat3x4 angle_frm(in mat3x4"));
-    ASSERT_TRUE(foundInGLSLCode("mat4x2 angle_frm(in mat4x2"));
-    ASSERT_TRUE(foundInGLSLCode("mat4x3 angle_frm(in mat4x3"));
-
-    ASSERT_TRUE(foundInGLSLCode("mat2x3 angle_frl(in mat2x3"));
-    ASSERT_TRUE(foundInGLSLCode("mat2x4 angle_frl(in mat2x4"));
-    ASSERT_TRUE(foundInGLSLCode("mat3x2 angle_frl(in mat3x2"));
-    ASSERT_TRUE(foundInGLSLCode("mat3x4 angle_frl(in mat3x4"));
-    ASSERT_TRUE(foundInGLSLCode("mat4x2 angle_frl(in mat4x2"));
-    ASSERT_TRUE(foundInGLSLCode("mat4x3 angle_frl(in mat4x3"));
-
-    ASSERT_TRUE(foundInHLSLCode("float2x3 angle_frm(float2x3"));
-    ASSERT_TRUE(foundInHLSLCode("float2x4 angle_frm(float2x4"));
-    ASSERT_TRUE(foundInHLSLCode("float3x2 angle_frm(float3x2"));
-    ASSERT_TRUE(foundInHLSLCode("float3x4 angle_frm(float3x4"));
-    ASSERT_TRUE(foundInHLSLCode("float4x2 angle_frm(float4x2"));
-    ASSERT_TRUE(foundInHLSLCode("float4x3 angle_frm(float4x3"));
-
-    ASSERT_TRUE(foundInHLSLCode("float2x3 angle_frl(float2x3"));
-    ASSERT_TRUE(foundInHLSLCode("float2x4 angle_frl(float2x4"));
-    ASSERT_TRUE(foundInHLSLCode("float3x2 angle_frl(float3x2"));
-    ASSERT_TRUE(foundInHLSLCode("float3x4 angle_frl(float3x4"));
-    ASSERT_TRUE(foundInHLSLCode("float4x2 angle_frl(float4x2"));
-    ASSERT_TRUE(foundInHLSLCode("float4x3 angle_frl(float4x3"));
-}
-
-TEST_F(DebugShaderPrecisionTest, PragmaDisablesEmulation)
-{
-    const std::string &shaderString =
-        "#pragma webgl_debug_shader_precision(off)\n"
-        "precision mediump float;\n"
-        "uniform float u;\n"
-        "void main() {\n"
-        "   gl_FragColor = vec4(u);\n"
-        "}\n";
-    compile(shaderString);
-    ASSERT_TRUE(notFoundInCode("angle_frm"));
-    const std::string &shaderStringPragmaOn =
-        "#pragma webgl_debug_shader_precision(on)\n"
-        "precision mediump float;\n"
-        "uniform float u;\n"
-        "void main() {\n"
-        "   gl_FragColor = vec4(u);\n"
-        "}\n";
-    compile(shaderStringPragmaOn);
-    ASSERT_TRUE(foundInCode("angle_frm"));
-}
-
-// Emulation can't be toggled on for only a part of a shader.
-// Only the last pragma in the shader has an effect.
-TEST_F(DebugShaderPrecisionTest, MultiplePragmas)
-{
-    const std::string &shaderString =
-        "#pragma webgl_debug_shader_precision(off)\n"
-        "precision mediump float;\n"
-        "uniform float u;\n"
-        "void main() {\n"
-        "   gl_FragColor = vec4(u);\n"
-        "}\n"
-        "#pragma webgl_debug_shader_precision(on)\n";
-    compile(shaderString);
-    ASSERT_TRUE(foundInCode("angle_frm"));
-}
-
-TEST_F(NoDebugShaderPrecisionTest, HelpersWrittenOnlyWithExtension)
-{
-    const std::string &shaderString =
-        "precision mediump float;\n"
-        "uniform float u;\n"
-        "void main() {\n"
-        "   gl_FragColor = vec4(u);\n"
-        "}\n";
-    compile(shaderString);
-    ASSERT_FALSE(foundInCode("angle_frm"));
-}
-
-TEST_F(NoDebugShaderPrecisionTest, PragmaHasEffectsOnlyWithExtension)
-{
-    const std::string &shaderString =
-        "#pragma webgl_debug_shader_precision(on)\n"
-        "precision mediump float;\n"
-        "uniform float u;\n"
-        "void main() {\n"
-        "   gl_FragColor = vec4(u);\n"
-        "}\n";
-    compile(shaderString);
-    ASSERT_FALSE(foundInCode("angle_frm"));
-}
-
-TEST_F(DebugShaderPrecisionTest, DeclarationsAndConstants)
-{
-    const std::string &shaderString =
-        "precision mediump float;\n"
-        "uniform vec4 f;\n"
-        "uniform float uu, uu2;\n"
-        "varying float vv, vv2;\n"
-        "float gg = 0.0, gg2;\n"
-        "void main() {\n"
-        "   float aa = 0.0, aa2;\n"
-        "   gl_FragColor = f;\n"
-        "}\n";
-    compile(shaderString);
-    // Declarations or constants should not have rounding inserted around them
-    ASSERT_TRUE(notFoundInCode("angle_frm(0"));
-    // GLSL output
-    ASSERT_TRUE(notFoundInCode("angle_frm(_uuu"));
-    ASSERT_TRUE(notFoundInCode("angle_frm(_uvv"));
-    ASSERT_TRUE(notFoundInCode("angle_frm(_ugg"));
-    ASSERT_TRUE(notFoundInCode("angle_frm(_uaa"));
-    // HLSL output
-    ASSERT_TRUE(notFoundInCode("angle_frm(_uu"));
-    ASSERT_TRUE(notFoundInCode("angle_frm(_vv"));
-    ASSERT_TRUE(notFoundInCode("angle_frm(_gg"));
-    ASSERT_TRUE(notFoundInCode("angle_frm(_aa"));
-}
-
-// Test that expressions that are part of initialization have rounding.
-TEST_F(DebugShaderPrecisionTest, InitializerRounding)
-{
-    const std::string &shaderString =
-        "precision mediump float;\n"
-        "uniform float u;\n"
-        "void main() {\n"
-        "   float a = u;\n"
-        "   gl_FragColor = vec4(a);\n"
-        "}\n";
-    compile(shaderString);
-    // An expression that's part of initialization should have rounding
-    ASSERT_TRUE(foundInAllGLSLCode("angle_frm(_uu)"));
-    ASSERT_TRUE(foundInHLSLCode("angle_frm(_u)"));
-}
-
-// Test that compound additions have rounding in the GLSL translations.
-TEST_F(DebugShaderPrecisionTest, CompoundAddFunction)
-{
-    const std::string &shaderString =
-        "precision mediump float;\n"
-        "uniform vec4 u;\n"
-        "uniform vec4 u2;\n"
-        "void main() {\n"
-        "   vec4 v = u;\n"
-        "   v += u2;\n"
-        "   gl_FragColor = v;\n"
-        "}\n";
-    compile(shaderString);
-    ASSERT_TRUE(
-        foundInESSLCode("highp vec4 angle_compound_add_frm(inout highp vec4 x, in highp vec4 y) {\n"
-                        "    x = angle_frm(angle_frm(x) + y);"));
-    ASSERT_TRUE(
-        foundInGLSLCode("vec4 angle_compound_add_frm(inout vec4 x, in vec4 y) {\n"
-                        "    x = angle_frm(angle_frm(x) + y);"));
-    ASSERT_TRUE(
-        foundInHLSLCode("float4 angle_compound_add_frm(inout float4 x, in float4 y) {\n"
-                        "    x = angle_frm(angle_frm(x) + y);"));
-    ASSERT_TRUE(foundInAllGLSLCode("angle_compound_add_frm(_uv, angle_frm(_uu2));"));
-    ASSERT_TRUE(foundInHLSLCodeRegex(R"(angle_compound_add_frm\(_v(\d)*, angle_frm\(_u2\)\);)"));
-    ASSERT_TRUE(notFoundInCode("+="));
-}
-
-TEST_F(DebugShaderPrecisionTest, CompoundSubFunction)
-{
-    const std::string &shaderString =
-        "precision mediump float;\n"
-        "uniform vec4 u;\n"
-        "uniform vec4 u2;\n"
-        "void main() {\n"
-        "   vec4 v = u;\n"
-        "   v -= u2;\n"
-        "   gl_FragColor = v;\n"
-        "}\n";
-    compile(shaderString);
-    ASSERT_TRUE(
-        foundInESSLCode("highp vec4 angle_compound_sub_frm(inout highp vec4 x, in highp vec4 y) {\n"
-                        "    x = angle_frm(angle_frm(x) - y);"));
-    ASSERT_TRUE(
-        foundInGLSLCode("vec4 angle_compound_sub_frm(inout vec4 x, in vec4 y) {\n"
-                        "    x = angle_frm(angle_frm(x) - y);"));
-    ASSERT_TRUE(
-        foundInHLSLCode("float4 angle_compound_sub_frm(inout float4 x, in float4 y) {\n"
-                        "    x = angle_frm(angle_frm(x) - y);"));
-    ASSERT_TRUE(foundInAllGLSLCode("angle_compound_sub_frm(_uv, angle_frm(_uu2));"));
-    ASSERT_TRUE(foundInHLSLCodeRegex("angle_compound_sub_frm\\(_v(\\d)*, angle_frm\\(_u2\\)\\);"));
-    ASSERT_TRUE(notFoundInCode("-="));
-}
-
-TEST_F(DebugShaderPrecisionTest, CompoundDivFunction)
-{
-    const std::string &shaderString =
-        "precision mediump float;\n"
-        "uniform vec4 u;\n"
-        "uniform vec4 u2;\n"
-        "void main() {\n"
-        "   vec4 v = u;\n"
-        "   v /= u2;\n"
-        "   gl_FragColor = v;\n"
-        "}\n";
-    compile(shaderString);
-    ASSERT_TRUE(
-        foundInESSLCode("highp vec4 angle_compound_div_frm(inout highp vec4 x, in highp vec4 y) {\n"
-                        "    x = angle_frm(angle_frm(x) / y);"));
-    ASSERT_TRUE(
-        foundInGLSLCode("vec4 angle_compound_div_frm(inout vec4 x, in vec4 y) {\n"
-                        "    x = angle_frm(angle_frm(x) / y);"));
-    ASSERT_TRUE(
-        foundInHLSLCode("float4 angle_compound_div_frm(inout float4 x, in float4 y) {\n"
-                        "    x = angle_frm(angle_frm(x) / y);"));
-    ASSERT_TRUE(foundInAllGLSLCode("angle_compound_div_frm(_uv, angle_frm(_uu2));"));
-    ASSERT_TRUE(foundInHLSLCodeRegex("angle_compound_div_frm\\(_v(\\d)*, angle_frm\\(_u2\\)\\);"));
-    ASSERT_TRUE(notFoundInCode("/="));
-}
-
-TEST_F(DebugShaderPrecisionTest, CompoundMulFunction)
-{
-    const std::string &shaderString =
-        "precision mediump float;\n"
-        "uniform vec4 u;\n"
-        "uniform vec4 u2;\n"
-        "void main() {\n"
-        "   vec4 v = u;\n"
-        "   v *= u2;\n"
-        "   gl_FragColor = v;\n"
-        "}\n";
-    compile(shaderString);
-    ASSERT_TRUE(
-        foundInESSLCode("highp vec4 angle_compound_mul_frm(inout highp vec4 x, in highp vec4 y) {\n"
-                        "    x = angle_frm(angle_frm(x) * y);"));
-    ASSERT_TRUE(
-        foundInGLSLCode("vec4 angle_compound_mul_frm(inout vec4 x, in vec4 y) {\n"
-                        "    x = angle_frm(angle_frm(x) * y);"));
-    ASSERT_TRUE(
-        foundInHLSLCode("float4 angle_compound_mul_frm(inout float4 x, in float4 y) {\n"
-                        "    x = angle_frm(angle_frm(x) * y);"));
-    ASSERT_TRUE(foundInAllGLSLCode("angle_compound_mul_frm(_uv, angle_frm(_uu2));"));
-    ASSERT_TRUE(foundInHLSLCodeRegex("angle_compound_mul_frm\\(_v(\\d)*, angle_frm\\(_u2\\)\\);"));
-    ASSERT_TRUE(notFoundInCode("*="));
-}
-
-TEST_F(DebugShaderPrecisionTest, CompoundAddVectorPlusScalarFunction)
-{
-    const std::string &shaderString =
-        "precision mediump float;\n"
-        "uniform vec4 u;\n"
-        "uniform float u2;\n"
-        "void main() {\n"
-        "   vec4 v = u;\n"
-        "   v += u2;\n"
-        "   gl_FragColor = v;\n"
-        "}\n";
-    compile(shaderString);
-    ASSERT_TRUE(foundInESSLCode(
-        "highp vec4 angle_compound_add_frm(inout highp vec4 x, in highp float y) {\n"
-        "    x = angle_frm(angle_frm(x) + y);"));
-    ASSERT_TRUE(
-        foundInGLSLCode("vec4 angle_compound_add_frm(inout vec4 x, in float y) {\n"
-                        "    x = angle_frm(angle_frm(x) + y);"));
-    ASSERT_TRUE(
-        foundInHLSLCode("float4 angle_compound_add_frm(inout float4 x, in float y) {\n"
-                        "    x = angle_frm(angle_frm(x) + y);"));
-    ASSERT_TRUE(foundInAllGLSLCode("angle_compound_add_frm(_uv, angle_frm(_uu2));"));
-    ASSERT_TRUE(foundInHLSLCodeRegex("angle_compound_add_frm\\(_v(\\d)*, angle_frm\\(_u2\\)\\);"));
-    ASSERT_TRUE(notFoundInCode("+="));
-}
-
-TEST_F(DebugShaderPrecisionTest, CompoundMatrixTimesMatrixFunction)
-{
-    const std::string &shaderString =
-        "precision mediump float;\n"
-        "uniform mat4 u;\n"
-        "uniform mat4 u2;\n"
-        "void main() {\n"
-        "   mat4 m = u;\n"
-        "   m *= u2;\n"
-        "   gl_FragColor = m[0];\n"
-        "}\n";
-    compile(shaderString);
-    ASSERT_TRUE(
-        foundInESSLCode("highp mat4 angle_compound_mul_frm(inout highp mat4 x, in highp mat4 y) {\n"
-                        "    x = angle_frm(angle_frm(x) * y);"));
-    ASSERT_TRUE(
-        foundInGLSLCode("mat4 angle_compound_mul_frm(inout mat4 x, in mat4 y) {\n"
-                        "    x = angle_frm(angle_frm(x) * y);"));
-    ASSERT_TRUE(
-        foundInHLSLCode("float4x4 angle_compound_mul_frm(inout float4x4 x, in float4x4 y) {\n"
-                        "    x = angle_frm(angle_frm(x) * y);"));
-    ASSERT_TRUE(foundInAllGLSLCode("angle_compound_mul_frm(_um, angle_frm(_uu2));"));
-    ASSERT_TRUE(foundInHLSLCodeRegex("angle_compound_mul_frm\\(_m(\\d)*, angle_frm\\(_u2\\)\\);"));
-    ASSERT_TRUE(notFoundInCode("*="));
-}
-
-// Test that compound multiplying a non-square matrix with another matrix gets translated into an
-// angle_compound_mul function call.
-TEST_F(DebugShaderPrecisionTest, CompoundNonSquareMatrixTimesMatrixFunction)
-{
-    const std::string &shaderString =
-        "#version 300 es\n"
-        "precision mediump float;\n"
-        "uniform mat2x4 u;\n"
-        "uniform mat2 u2;\n"
-        "out vec4 my_FragColor;\n"
-        "void main() {\n"
-        "   mat2x4 m = u;\n"
-        "   m *= u2;\n"
-        "   my_FragColor = m[0];\n"
-        "}\n";
-    compile(shaderString);
-    ASSERT_TRUE(foundInESSLCode(
-        "highp mat2x4 angle_compound_mul_frm(inout highp mat2x4 x, in highp mat2 y) {\n"
-        "    x = angle_frm(angle_frm(x) * y);"));
-    ASSERT_TRUE(
-        foundInGLSLCode("mat2x4 angle_compound_mul_frm(inout mat2x4 x, in mat2 y) {\n"
-                        "    x = angle_frm(angle_frm(x) * y);"));
-    ASSERT_TRUE(
-        foundInHLSLCode("float2x4 angle_compound_mul_frm(inout float2x4 x, in float2x2 y) {\n"
-                        "    x = angle_frm(angle_frm(x) * y);"));
-    ASSERT_TRUE(foundInAllGLSLCode("angle_compound_mul_frm(_um, angle_frm(_uu2));"));
-    ASSERT_TRUE(foundInHLSLCodeRegex("angle_compound_mul_frm\\(_m(\\d)*, angle_frm\\(_u2\\)\\);"));
-    ASSERT_TRUE(notFoundInCode("*="));
-}
-
-TEST_F(DebugShaderPrecisionTest, CompoundMatrixTimesScalarFunction)
-{
-    const std::string &shaderString =
-        "precision mediump float;\n"
-        "uniform mat4 u;\n"
-        "uniform float u2;\n"
-        "void main() {\n"
-        "   mat4 m = u;\n"
-        "   m *= u2;\n"
-        "   gl_FragColor = m[0];\n"
-        "}\n";
-    compile(shaderString);
-    ASSERT_TRUE(foundInESSLCode(
-        "highp mat4 angle_compound_mul_frm(inout highp mat4 x, in highp float y) {\n"
-        "    x = angle_frm(angle_frm(x) * y);"));
-    ASSERT_TRUE(
-        foundInGLSLCode("mat4 angle_compound_mul_frm(inout mat4 x, in float y) {\n"
-                        "    x = angle_frm(angle_frm(x) * y);"));
-    ASSERT_TRUE(
-        foundInHLSLCode("float4x4 angle_compound_mul_frm(inout float4x4 x, in float y) {\n"
-                        "    x = angle_frm(angle_frm(x) * y);"));
-    ASSERT_TRUE(foundInAllGLSLCode("angle_compound_mul_frm(_um, angle_frm(_uu2));"));
-    ASSERT_TRUE(foundInHLSLCodeRegex("angle_compound_mul_frm\\(_m(\\d)*, angle_frm\\(_u2\\)\\);"));
-    ASSERT_TRUE(notFoundInCode("*="));
-}
-
-TEST_F(DebugShaderPrecisionTest, CompoundVectorTimesMatrixFunction)
-{
-    const std::string &shaderString =
-        "precision mediump float;\n"
-        "uniform vec4 u;\n"
-        "uniform mat4 u2;\n"
-        "void main() {\n"
-        "   vec4 v = u;\n"
-        "   v *= u2;\n"
-        "   gl_FragColor = v;\n"
-        "}\n";
-    compile(shaderString);
-    ASSERT_TRUE(
-        foundInESSLCode("highp vec4 angle_compound_mul_frm(inout highp vec4 x, in highp mat4 y) {\n"
-                        "    x = angle_frm(angle_frm(x) * y);"));
-    ASSERT_TRUE(
-        foundInGLSLCode("vec4 angle_compound_mul_frm(inout vec4 x, in mat4 y) {\n"
-                        "    x = angle_frm(angle_frm(x) * y);"));
-    ASSERT_TRUE(
-        foundInHLSLCode("float4 angle_compound_mul_frm(inout float4 x, in float4x4 y) {\n"
-                        "    x = angle_frm(angle_frm(x) * y);"));
-    ASSERT_TRUE(foundInAllGLSLCode("angle_compound_mul_frm(_uv, angle_frm(_uu2));"));
-    ASSERT_TRUE(foundInHLSLCodeRegex("angle_compound_mul_frm\\(_v(\\d)*, angle_frm\\(_u2\\)\\);"));
-    ASSERT_TRUE(notFoundInCode("*="));
-}
-
-TEST_F(DebugShaderPrecisionTest, CompoundVectorTimesScalarFunction)
-{
-    const std::string &shaderString =
-        "precision mediump float;\n"
-        "uniform vec4 u;\n"
-        "uniform float u2;\n"
-        "void main() {\n"
-        "   vec4 v = u;\n"
-        "   v *= u2;\n"
-        "   gl_FragColor = v;\n"
-        "}\n";
-    compile(shaderString);
-    ASSERT_TRUE(foundInESSLCode(
-        "highp vec4 angle_compound_mul_frm(inout highp vec4 x, in highp float y) {\n"
-        "    x = angle_frm(angle_frm(x) * y);"));
-    ASSERT_TRUE(
-        foundInGLSLCode("vec4 angle_compound_mul_frm(inout vec4 x, in float y) {\n"
-                        "    x = angle_frm(angle_frm(x) * y);"));
-    ASSERT_TRUE(
-        foundInHLSLCode("float4 angle_compound_mul_frm(inout float4 x, in float y) {\n"
-                        "    x = angle_frm(angle_frm(x) * y);"));
-    ASSERT_TRUE(foundInAllGLSLCode("angle_compound_mul_frm(_uv, angle_frm(_uu2));"));
-    ASSERT_TRUE(foundInHLSLCodeRegex("angle_compound_mul_frm\\(_v(\\d)*, angle_frm\\(_u2\\)\\);"));
-    ASSERT_TRUE(notFoundInCode("*="));
-}
-
-TEST_F(DebugShaderPrecisionTest, BinaryMathRounding)
-{
-    const std::string &shaderString =
-        "precision mediump float;\n"
-        "uniform vec4 u1;\n"
-        "uniform vec4 u2;\n"
-        "uniform vec4 u3;\n"
-        "uniform vec4 u4;\n"
-        "uniform vec4 u5;\n"
-        "void main() {\n"
-        "   vec4 v1 = u1 + u2;\n"
-        "   vec4 v2 = u2 - u3;\n"
-        "   vec4 v3 = u3 * u4;\n"
-        "   vec4 v4 = u4 / u5;\n"
-        "   vec4 v5;\n"
-        "   vec4 v6 = (v5 = u5);\n"
-        "   gl_FragColor = v1 + v2 + v3 + v4;\n"
-        "}\n";
-    compile(shaderString);
-    ASSERT_TRUE(foundInAllGLSLCode("v1 = angle_frm((angle_frm(_uu1) + angle_frm(_uu2)))"));
-    ASSERT_TRUE(foundInAllGLSLCode("v2 = angle_frm((angle_frm(_uu2) - angle_frm(_uu3)))"));
-    ASSERT_TRUE(foundInAllGLSLCode("v3 = angle_frm((angle_frm(_uu3) * angle_frm(_uu4)))"));
-    ASSERT_TRUE(foundInAllGLSLCode("v4 = angle_frm((angle_frm(_uu4) / angle_frm(_uu5)))"));
-    ASSERT_TRUE(foundInAllGLSLCode("v6 = angle_frm((_uv5 = angle_frm(_uu5)))"));
-
-    ASSERT_TRUE(foundInHLSLCodeRegex(
-        "v1(\\d)* = angle_frm\\(\\(angle_frm\\(_u1\\) \\+ angle_frm\\(_u2\\)\\)\\)"));
-    ASSERT_TRUE(foundInHLSLCodeRegex(
-        "v2(\\d)* = angle_frm\\(\\(angle_frm\\(_u2\\) - angle_frm\\(_u3\\)\\)\\)"));
-    ASSERT_TRUE(foundInHLSLCodeRegex(
-        "v3(\\d)* = angle_frm\\(\\(angle_frm\\(_u3\\) \\* angle_frm\\(_u4\\)\\)\\)"));
-    ASSERT_TRUE(foundInHLSLCodeRegex(
-        "v4(\\d)* = angle_frm\\(\\(angle_frm\\(_u4\\) / angle_frm\\(_u5\\)\\)\\)"));
-    ASSERT_TRUE(
-        foundInHLSLCodeRegex("v6(\\d)* = angle_frm\\(\\(_v5(\\d)* = angle_frm\\(_u5\\)\\)\\)"));
-}
-
-TEST_F(DebugShaderPrecisionTest, BuiltInMathFunctionRounding)
-{
-    const std::string &shaderString =
-        "precision mediump float;\n"
-        "uniform vec4 u1;\n"
-        "uniform vec4 u2;\n"
-        "uniform vec4 u3;\n"
-        "uniform float uf;\n"
-        "uniform float uf2;\n"
-        "uniform vec3 uf31;\n"
-        "uniform vec3 uf32;\n"
-        "uniform mat4 um1;\n"
-        "uniform mat4 um2;\n"
-        "void main() {\n"
-        "   vec4 v1 = radians(u1);\n"
-        "   vec4 v2 = degrees(u1);\n"
-        "   vec4 v3 = sin(u1);\n"
-        "   vec4 v4 = cos(u1);\n"
-        "   vec4 v5 = tan(u1);\n"
-        "   vec4 v6 = asin(u1);\n"
-        "   vec4 v7 = acos(u1);\n"
-        "   vec4 v8 = atan(u1);\n"
-        "   vec4 v9 = atan(u1, u2);\n"
-        "   vec4 v10 = pow(u1, u2);\n"
-        "   vec4 v11 = exp(u1);\n"
-        "   vec4 v12 = log(u1);\n"
-        "   vec4 v13 = exp2(u1);\n"
-        "   vec4 v14 = log2(u1);\n"
-        "   vec4 v15 = sqrt(u1);\n"
-        "   vec4 v16 = inversesqrt(u1);\n"
-        "   vec4 v17 = abs(u1);\n"
-        "   vec4 v18 = sign(u1);\n"
-        "   vec4 v19 = floor(u1);\n"
-        "   vec4 v20 = ceil(u1);\n"
-        "   vec4 v21 = fract(u1);\n"
-        "   vec4 v22 = mod(u1, uf);\n"
-        "   vec4 v23 = mod(u1, u2);\n"
-        "   vec4 v24 = min(u1, uf);\n"
-        "   vec4 v25 = min(u1, u2);\n"
-        "   vec4 v26 = max(u1, uf);\n"
-        "   vec4 v27 = max(u1, u2);\n"
-        "   vec4 v28 = clamp(u1, u2, u3);\n"
-        "   vec4 v29 = clamp(u1, uf, uf2);\n"
-        "   vec4 v30 = mix(u1, u2, u3);\n"
-        "   vec4 v31 = mix(u1, u2, uf);\n"
-        "   vec4 v32 = step(u1, u2);\n"
-        "   vec4 v33 = step(uf, u1);\n"
-        "   vec4 v34 = smoothstep(u1, u2, u3);\n"
-        "   vec4 v35 = smoothstep(uf, uf2, u1);\n"
-        "   vec4 v36 = normalize(u1);\n"
-        "   vec4 v37 = faceforward(u1, u2, u3);\n"
-        "   vec4 v38 = reflect(u1, u2);\n"
-        "   vec4 v39 = refract(u1, u2, uf);\n"
-
-        "   float f1 = length(u1);\n"
-        "   float f2 = distance(u1, u2);\n"
-        "   float f3 = dot(u1, u2);\n"
-        "   vec3 vf31 = cross(uf31, uf32);\n"
-        "   mat4 m1 = matrixCompMult(um1, um2);\n"
-
-        "   gl_FragColor = v1 + v2 + v3 + v4 + v5 + v6 + v7 + v8 + v9 + v10 +"
-        "v11 + v12 + v13 + v14 + v15 + v16 + v17 + v18 + v19 + v20 +"
-        "v21 + v22 + v23 + v24 + v25 + v26 + v27 + v28 + v29 + v30 +"
-        "v31 + v32 + v33 + v34 + v35 + v36 + v37 + v38 + v39 +"
-        "vec4(f1, f2, f3, 0.0) + vec4(vf31, 0.0) + m1[0];\n"
-        "}\n";
-    compile(shaderString);
-    ASSERT_TRUE(foundInAllGLSLCode("v1 = angle_frm(radians(angle_frm(_uu1)))"));
-    ASSERT_TRUE(foundInAllGLSLCode("v2 = angle_frm(degrees(angle_frm(_uu1)))"));
-    ASSERT_TRUE(foundInAllGLSLCode("v3 = angle_frm(sin(angle_frm(_uu1)))"));
-    ASSERT_TRUE(foundInAllGLSLCode("v4 = angle_frm(cos(angle_frm(_uu1)))"));
-    ASSERT_TRUE(foundInAllGLSLCode("v5 = angle_frm(tan(angle_frm(_uu1)))"));
-    ASSERT_TRUE(foundInAllGLSLCode("v6 = angle_frm(asin(angle_frm(_uu1)))"));
-    ASSERT_TRUE(foundInAllGLSLCode("v7 = angle_frm(acos(angle_frm(_uu1)))"));
-    ASSERT_TRUE(foundInAllGLSLCode("v8 = angle_frm(atan(angle_frm(_uu1)))"));
-    ASSERT_TRUE(foundInAllGLSLCode("v9 = angle_frm(atan(angle_frm(_uu1), angle_frm(_uu2)))"));
-    ASSERT_TRUE(foundInAllGLSLCode("v10 = angle_frm(pow(angle_frm(_uu1), angle_frm(_uu2)))"));
-    ASSERT_TRUE(foundInAllGLSLCode("v11 = angle_frm(exp(angle_frm(_uu1)))"));
-    ASSERT_TRUE(foundInAllGLSLCode("v12 = angle_frm(log(angle_frm(_uu1)))"));
-    ASSERT_TRUE(foundInAllGLSLCode("v13 = angle_frm(exp2(angle_frm(_uu1)))"));
-    ASSERT_TRUE(foundInAllGLSLCode("v14 = angle_frm(log2(angle_frm(_uu1)))"));
-    ASSERT_TRUE(foundInAllGLSLCode("v15 = angle_frm(sqrt(angle_frm(_uu1)))"));
-    ASSERT_TRUE(foundInAllGLSLCode("v16 = angle_frm(inversesqrt(angle_frm(_uu1)))"));
-    ASSERT_TRUE(foundInAllGLSLCode("v17 = angle_frm(abs(angle_frm(_uu1)))"));
-    ASSERT_TRUE(foundInAllGLSLCode("v18 = angle_frm(sign(angle_frm(_uu1)))"));
-    ASSERT_TRUE(foundInAllGLSLCode("v19 = angle_frm(floor(angle_frm(_uu1)))"));
-    ASSERT_TRUE(foundInAllGLSLCode("v20 = angle_frm(ceil(angle_frm(_uu1)))"));
-    ASSERT_TRUE(foundInAllGLSLCode("v21 = angle_frm(fract(angle_frm(_uu1)))"));
-    ASSERT_TRUE(foundInAllGLSLCode("v22 = angle_frm(mod(angle_frm(_uu1), angle_frm(_uuf)))"));
-    ASSERT_TRUE(foundInAllGLSLCode("v23 = angle_frm(mod(angle_frm(_uu1), angle_frm(_uu2)))"));
-    ASSERT_TRUE(foundInAllGLSLCode("v24 = angle_frm(min(angle_frm(_uu1), angle_frm(_uuf)))"));
-    ASSERT_TRUE(foundInAllGLSLCode("v25 = angle_frm(min(angle_frm(_uu1), angle_frm(_uu2)))"));
-    ASSERT_TRUE(foundInAllGLSLCode("v26 = angle_frm(max(angle_frm(_uu1), angle_frm(_uuf)))"));
-    ASSERT_TRUE(foundInAllGLSLCode("v27 = angle_frm(max(angle_frm(_uu1), angle_frm(_uu2)))"));
-    ASSERT_TRUE(foundInAllGLSLCode(
-        "v28 = angle_frm(clamp(angle_frm(_uu1), angle_frm(_uu2), angle_frm(_uu3)))"));
-    ASSERT_TRUE(foundInAllGLSLCode(
-        "v29 = angle_frm(clamp(angle_frm(_uu1), angle_frm(_uuf), angle_frm(_uuf2)))"));
-    ASSERT_TRUE(foundInAllGLSLCode(
-        "v30 = angle_frm(mix(angle_frm(_uu1), angle_frm(_uu2), angle_frm(_uu3)))"));
-    ASSERT_TRUE(foundInAllGLSLCode(
-        "v31 = angle_frm(mix(angle_frm(_uu1), angle_frm(_uu2), angle_frm(_uuf)))"));
-    ASSERT_TRUE(foundInAllGLSLCode("v32 = angle_frm(step(angle_frm(_uu1), angle_frm(_uu2)))"));
-    ASSERT_TRUE(foundInAllGLSLCode("v33 = angle_frm(step(angle_frm(_uuf), angle_frm(_uu1)))"));
-    ASSERT_TRUE(foundInAllGLSLCode(
-        "v34 = angle_frm(smoothstep(angle_frm(_uu1), angle_frm(_uu2), angle_frm(_uu3)))"));
-    ASSERT_TRUE(foundInAllGLSLCode(
-        "v35 = angle_frm(smoothstep(angle_frm(_uuf), angle_frm(_uuf2), angle_frm(_uu1)))"));
-    ASSERT_TRUE(foundInAllGLSLCode("v36 = angle_frm(normalize(angle_frm(_uu1)))"));
-    ASSERT_TRUE(foundInAllGLSLCode(
-        "v37 = angle_frm(faceforward(angle_frm(_uu1), angle_frm(_uu2), angle_frm(_uu3)))"));
-    ASSERT_TRUE(foundInAllGLSLCode("v38 = angle_frm(reflect(angle_frm(_uu1), angle_frm(_uu2)))"));
-    ASSERT_TRUE(foundInAllGLSLCode(
-        "v39 = angle_frm(refract(angle_frm(_uu1), angle_frm(_uu2), angle_frm(_uuf)))"));
-
-    ASSERT_TRUE(foundInAllGLSLCode("f1 = angle_frm(length(angle_frm(_uu1)))"));
-    ASSERT_TRUE(foundInAllGLSLCode("f2 = angle_frm(distance(angle_frm(_uu1), angle_frm(_uu2)))"));
-    ASSERT_TRUE(foundInAllGLSLCode("f3 = angle_frm(dot(angle_frm(_uu1), angle_frm(_uu2)))"));
-    ASSERT_TRUE(
-        foundInAllGLSLCode("vf31 = angle_frm(cross(angle_frm(_uuf31), angle_frm(_uuf32)))"));
-    ASSERT_TRUE(
-        foundInAllGLSLCode("m1 = angle_frm(matrixCompMult(angle_frm(_uum1), angle_frm(_uum2)))"));
-
-    ASSERT_TRUE(foundInHLSLCodeRegex("v1(\\d)* = angle_frm\\(radians\\(angle_frm\\(_u1\\)\\)\\)"));
-    ASSERT_TRUE(foundInHLSLCodeRegex("v2(\\d)* = angle_frm\\(degrees\\(angle_frm\\(_u1\\)\\)\\)"));
-    ASSERT_TRUE(foundInHLSLCodeRegex("v3(\\d)* = angle_frm\\(sin\\(angle_frm\\(_u1\\)\\)\\)"));
-    ASSERT_TRUE(foundInHLSLCodeRegex("v4(\\d)* = angle_frm\\(cos\\(angle_frm\\(_u1\\)\\)\\)"));
-    ASSERT_TRUE(foundInHLSLCodeRegex("v5(\\d)* = angle_frm\\(tan\\(angle_frm\\(_u1\\)\\)\\)"));
-    ASSERT_TRUE(foundInHLSLCodeRegex("v6(\\d)* = angle_frm\\(asin\\(angle_frm\\(_u1\\)\\)\\)"));
-    ASSERT_TRUE(foundInHLSLCodeRegex("v7(\\d)* = angle_frm\\(acos\\(angle_frm\\(_u1\\)\\)\\)"));
-    ASSERT_TRUE(foundInHLSLCodeRegex("v8(\\d)* = angle_frm\\(atan\\(angle_frm\\(_u1\\)\\)\\)"));
-    ASSERT_TRUE(foundInHLSLCodeRegex(
-        "v9(\\d)* = angle_frm\\(atan_emu\\(angle_frm\\(_u1\\), angle_frm\\(_u2\\)\\)\\)"));
-    ASSERT_TRUE(foundInHLSLCodeRegex(
-        "v10(\\d)* = angle_frm\\(pow\\(angle_frm\\(_u1\\), angle_frm\\(_u2\\)\\)\\)"));
-    ASSERT_TRUE(foundInHLSLCodeRegex("v11(\\d)* = angle_frm\\(exp\\(angle_frm\\(_u1\\)\\)\\)"));
-    ASSERT_TRUE(foundInHLSLCodeRegex("v12(\\d)* = angle_frm\\(log\\(angle_frm\\(_u1\\)\\)\\)"));
-    ASSERT_TRUE(foundInHLSLCodeRegex("v13(\\d)* = angle_frm\\(exp2\\(angle_frm\\(_u1\\)\\)\\)"));
-    ASSERT_TRUE(foundInHLSLCodeRegex("v14(\\d)* = angle_frm\\(log2\\(angle_frm\\(_u1\\)\\)\\)"));
-    ASSERT_TRUE(foundInHLSLCodeRegex("v15(\\d)* = angle_frm\\(sqrt\\(angle_frm\\(_u1\\)\\)\\)"));
-    ASSERT_TRUE(foundInHLSLCodeRegex("v16(\\d)* = angle_frm\\(rsqrt\\(angle_frm\\(_u1\\)\\)\\)"));
-    ASSERT_TRUE(foundInHLSLCodeRegex("v17(\\d)* = angle_frm\\(abs\\(angle_frm\\(_u1\\)\\)\\)"));
-    ASSERT_TRUE(foundInHLSLCodeRegex("v18(\\d)* = angle_frm\\(sign\\(angle_frm\\(_u1\\)\\)\\)"));
-    ASSERT_TRUE(foundInHLSLCodeRegex("v19(\\d)* = angle_frm\\(floor\\(angle_frm\\(_u1\\)\\)\\)"));
-    ASSERT_TRUE(foundInHLSLCodeRegex("v20(\\d)* = angle_frm\\(ceil\\(angle_frm\\(_u1\\)\\)\\)"));
-    ASSERT_TRUE(foundInHLSLCodeRegex("v21(\\d)* = angle_frm\\(frac\\(angle_frm\\(_u1\\)\\)\\)"));
-    ASSERT_TRUE(foundInHLSLCodeRegex(
-        "v22(\\d)* = angle_frm\\(mod_emu\\(angle_frm\\(_u1\\), angle_frm\\(_uf\\)\\)\\)"));
-    ASSERT_TRUE(foundInHLSLCodeRegex(
-        "v23(\\d)* = angle_frm\\(mod_emu\\(angle_frm\\(_u1\\), angle_frm\\(_u2\\)\\)\\)"));
-    ASSERT_TRUE(foundInHLSLCodeRegex(
-        "v24(\\d)* = angle_frm\\(min\\(angle_frm\\(_u1\\), angle_frm\\(_uf\\)\\)\\)"));
-    ASSERT_TRUE(foundInHLSLCodeRegex(
-        "v25(\\d)* = angle_frm\\(min\\(angle_frm\\(_u1\\), angle_frm\\(_u2\\)\\)\\)"));
-    ASSERT_TRUE(foundInHLSLCodeRegex(
-        "v26(\\d)* = angle_frm\\(max\\(angle_frm\\(_u1\\), angle_frm\\(_uf\\)\\)\\)"));
-    ASSERT_TRUE(foundInHLSLCodeRegex(
-        "v27(\\d)* = angle_frm\\(max\\(angle_frm\\(_u1\\), angle_frm\\(_u2\\)\\)\\)"));
-    ASSERT_TRUE(foundInHLSLCodeRegex(
-        "v28(\\d)* = angle_frm\\(clamp\\(angle_frm\\(_u1\\), angle_frm\\(_u2\\), "
-        "angle_frm\\(_u3\\)\\)\\)"));
-    ASSERT_TRUE(foundInHLSLCodeRegex(
-        "v29(\\d)* = angle_frm\\(clamp\\(angle_frm\\(_u1\\), angle_frm\\(_uf\\), "
-        "angle_frm\\(_uf2\\)\\)\\)"));
-    ASSERT_TRUE(foundInHLSLCodeRegex(
-        "v30(\\d)* = angle_frm\\(lerp\\(angle_frm\\(_u1\\), angle_frm\\(_u2\\), "
-        "angle_frm\\(_u3\\)\\)\\)"));
-    ASSERT_TRUE(foundInHLSLCodeRegex(
-        "v31(\\d)* = angle_frm\\(lerp\\(angle_frm\\(_u1\\), angle_frm\\(_u2\\), "
-        "angle_frm\\(_uf\\)\\)\\)"));
-    ASSERT_TRUE(foundInHLSLCodeRegex(
-        "v32(\\d)* = angle_frm\\(step\\(angle_frm\\(_u1\\), angle_frm\\(_u2\\)\\)\\)"));
-    ASSERT_TRUE(foundInHLSLCodeRegex(
-        "v33(\\d)* = angle_frm\\(step\\(angle_frm\\(_uf\\), angle_frm\\(_u1\\)\\)\\)"));
-    ASSERT_TRUE(
-        foundInHLSLCodeRegex("v34(\\d)* = angle_frm\\(smoothstep\\(angle_frm\\(_u1\\), "
-                             "angle_frm\\(_u2\\), angle_frm\\(_u3\\)\\)\\)"));
-    ASSERT_TRUE(
-        foundInHLSLCodeRegex("v35(\\d)* = angle_frm\\(smoothstep\\(angle_frm\\(_uf\\), "
-                             "angle_frm\\(_uf2\\), angle_frm\\(_u1\\)\\)\\)"));
-    ASSERT_TRUE(
-        foundInHLSLCodeRegex("v36(\\d)* = angle_frm\\(normalize\\(angle_frm\\(_u1\\)\\)\\)"));
-    ASSERT_TRUE(
-        foundInHLSLCodeRegex("v37(\\d)* = angle_frm\\(faceforward_emu\\(angle_frm\\(_u1\\), "
-                             "angle_frm\\(_u2\\), angle_frm\\(_u3\\)\\)\\)"));
-    ASSERT_TRUE(foundInHLSLCodeRegex(
-        "v38(\\d)* = angle_frm\\(reflect\\(angle_frm\\(_u1\\), angle_frm\\(_u2\\)\\)\\)"));
-    ASSERT_TRUE(
-        foundInHLSLCodeRegex("v39(\\d)* = angle_frm\\(refract\\(angle_frm\\(_u1\\), "
-                             "angle_frm\\(_u2\\), angle_frm\\(_uf\\)\\)\\)"));
-
-    ASSERT_TRUE(foundInHLSLCodeRegex("f1(\\d)* = angle_frm\\(length\\(angle_frm\\(_u1\\)\\)\\)"));
-    ASSERT_TRUE(foundInHLSLCodeRegex(
-        "f2(\\d)* = angle_frm\\(distance\\(angle_frm\\(_u1\\), angle_frm\\(_u2\\)\\)\\)"));
-    ASSERT_TRUE(foundInHLSLCodeRegex(
-        "f3(\\d)* = angle_frm\\(dot\\(angle_frm\\(_u1\\), angle_frm\\(_u2\\)\\)\\)"));
-    ASSERT_TRUE(foundInHLSLCodeRegex(
-        "vf31(\\d)* = angle_frm\\(cross\\(angle_frm\\(_uf31\\), angle_frm\\(_uf32\\)\\)\\)"));
-    ASSERT_TRUE(foundInHLSLCodeRegex(
-        "m1(\\d)* = angle_frm\\(\\(angle_frm\\(_um1\\) \\* angle_frm\\(_um2\\)\\)\\)"));
-}
-
-TEST_F(DebugShaderPrecisionTest, BuiltInRelationalFunctionRounding)
-{
-    const std::string &shaderString =
-        "precision mediump float;\n"
-        "uniform vec4 u1;\n"
-        "uniform vec4 u2;\n"
-        "void main() {\n"
-        "   bvec4 bv1 = lessThan(u1, u2);\n"
-        "   bvec4 bv2 = lessThanEqual(u1, u2);\n"
-        "   bvec4 bv3 = greaterThan(u1, u2);\n"
-        "   bvec4 bv4 = greaterThanEqual(u1, u2);\n"
-        "   bvec4 bv5 = equal(u1, u2);\n"
-        "   bvec4 bv6 = notEqual(u1, u2);\n"
-        "   gl_FragColor = vec4(bv1) + vec4(bv2) + vec4(bv3) + vec4(bv4) + vec4(bv5) + vec4(bv6);\n"
-        "}\n";
-    compile(shaderString);
-    ASSERT_TRUE(foundInAllGLSLCode("bv1 = lessThan(angle_frm(_uu1), angle_frm(_uu2))"));
-    ASSERT_TRUE(foundInAllGLSLCode("bv2 = lessThanEqual(angle_frm(_uu1), angle_frm(_uu2))"));
-    ASSERT_TRUE(foundInAllGLSLCode("bv3 = greaterThan(angle_frm(_uu1), angle_frm(_uu2))"));
-    ASSERT_TRUE(foundInAllGLSLCode("bv4 = greaterThanEqual(angle_frm(_uu1), angle_frm(_uu2))"));
-    ASSERT_TRUE(foundInAllGLSLCode("bv5 = equal(angle_frm(_uu1), angle_frm(_uu2))"));
-    ASSERT_TRUE(foundInAllGLSLCode("bv6 = notEqual(angle_frm(_uu1), angle_frm(_uu2))"));
-
-    ASSERT_TRUE(foundInHLSLCodeRegex("bv1(\\d)* = \\(angle_frm\\(_u1\\) < angle_frm\\(_u2\\)\\)"));
-    ASSERT_TRUE(foundInHLSLCodeRegex("bv2(\\d)* = \\(angle_frm\\(_u1\\) <= angle_frm\\(_u2\\)\\)"));
-    ASSERT_TRUE(foundInHLSLCodeRegex("bv3(\\d)* = \\(angle_frm\\(_u1\\) > angle_frm\\(_u2\\)\\)"));
-    ASSERT_TRUE(foundInHLSLCodeRegex("bv4(\\d)* = \\(angle_frm\\(_u1\\) >= angle_frm\\(_u2\\)\\)"));
-    ASSERT_TRUE(foundInHLSLCodeRegex("bv5(\\d)* = \\(angle_frm\\(_u1\\) == angle_frm\\(_u2\\)\\)"));
-    ASSERT_TRUE(foundInHLSLCodeRegex("bv6(\\d)* = \\(angle_frm\\(_u1\\) != angle_frm\\(_u2\\)\\)"));
-}
-
-TEST_F(DebugShaderPrecisionTest, ConstructorRounding)
-{
-    const std::string &shaderString =
-        "precision mediump float;\n"
-        "precision mediump int;\n"
-        "uniform float u1;\n"
-        "uniform float u2;\n"
-        "uniform lowp float u3;\n"
-        "uniform float u4;\n"
-        "uniform ivec4 uiv;\n"
-        "void main() {\n"
-        "   vec4 v1 = vec4(u1, u2, u3, u4);\n"
-        "   vec4 v2 = vec4(uiv);\n"
-        "   gl_FragColor = v1 + v2;\n"
-        "}\n";
-    compile(shaderString);
-    ASSERT_TRUE(foundInAllGLSLCode("v1 = angle_frm(vec4(_uu1, _uu2, angle_frl(_uu3), _uu4))"));
-    ASSERT_TRUE(foundInAllGLSLCode("v2 = angle_frm(vec4(_uuiv))"));
-
-    ASSERT_TRUE(foundInHLSLCodeRegex(
-        "v1(\\d)* = angle_frm\\(vec4_ctor\\(_u1, _u2, angle_frl\\(_u3\\), _u4\\)\\)"));
-    ASSERT_TRUE(foundInHLSLCodeRegex("v2(\\d)* = angle_frm\\(vec4_ctor\\(_uiv\\)\\)"));
-}
-
-TEST_F(DebugShaderPrecisionTest, StructConstructorNoRounding)
-{
-    const std::string &shaderString =
-        "precision mediump float;\n"
-        "struct S { mediump vec4 a; };\n"
-        "uniform vec4 u;\n"
-        "void main() {\n"
-        "   S s = S(u);\n"
-        "   gl_FragColor = s.a;\n"
-        "}\n";
-    compile(shaderString);
-    ASSERT_TRUE(foundInAllGLSLCode("s = _uS(angle_frm(_uu))"));
-    ASSERT_TRUE(foundInHLSLCodeRegex("s(\\d)* = _S_ctor\\(angle_frm\\(_u\\)\\)"));
-    ASSERT_TRUE(notFoundInCode("angle_frm(_uS"));  // GLSL
-    ASSERT_TRUE(notFoundInCode("angle_frm(_S"));   // HLSL
-}
-
-TEST_F(DebugShaderPrecisionTest, SwizzleRounding)
-{
-    const std::string &shaderString =
-        "precision mediump float;\n"
-        "uniform vec4 u;\n"
-        "void main() {\n"
-        "   vec4 v = u.xyxy;"
-        "   gl_FragColor = v;\n"
-        "}\n";
-    compile(shaderString);
-    ASSERT_TRUE(foundInAllGLSLCode("v = angle_frm(_uu).xyxy"));
-    ASSERT_TRUE(foundInHLSLCodeRegex("v(\\d)* = angle_frm\\(_u\\)\\.xyxy"));
-}
-
-TEST_F(DebugShaderPrecisionTest, BuiltInTexFunctionRounding)
-{
-    const std::string &shaderString =
-        "precision mediump float;\n"
-        "precision lowp sampler2D;\n"
-        "uniform vec2 u;\n"
-        "uniform sampler2D s;\n"
-        "void main() {\n"
-        "   lowp vec4 v = texture2D(s, u);\n"
-        "   gl_FragColor = v;\n"
-        "}\n";
-    compile(shaderString);
-    ASSERT_TRUE(foundInAllGLSLCode("v = angle_frl(texture2D(_us, angle_frm(_uu)))"));
-    ASSERT_TRUE(
-        foundInHLSLCodeRegex("v(\\d)* = angle_frl\\(gl_texture2D\\(_s, angle_frm\\(_u\\)\\)\\)"));
-}
-
-TEST_F(DebugShaderPrecisionTest, FunctionCallParameterQualifiersFromDefinition)
-{
-    const std::string &shaderString =
-        "precision mediump float;\n"
-        "uniform vec4 u1;\n"
-        "uniform vec4 u2;\n"
-        "uniform vec4 u3;\n"
-        "uniform vec4 u4;\n"
-        "uniform vec4 u5;\n"
-        "vec4 add(in vec4 x, in vec4 y) {\n"
-        "   return x + y;\n"
-        "}\n"
-        "void compound_add(inout vec4 x, in vec4 y) {\n"
-        "   x = x + y;\n"
-        "}\n"
-        "void add_to_last(in vec4 x, in vec4 y, out vec4 z) {\n"
-        "   z = x + y;\n"
-        "}\n"
-        "void main() {\n"
-        "   vec4 v = add(u1, u2);\n"
-        "   compound_add(v, u3);\n"
-        "   vec4 v2;\n"
-        "   add_to_last(u4, u5, v2);\n"
-        "   gl_FragColor = v + v2;\n"
-        "}\n";
-    compile(shaderString);
-    // Note that this is not optimal code, there are redundant frm calls.
-    // However, getting the implementation working when other operations
-    // are nested within function calls would be tricky if to get right
-    // otherwise.
-    // Test in parameters
-    ASSERT_TRUE(foundInAllGLSLCode("v = _uadd(angle_frm(_uu1), angle_frm(_uu2))"));
-    ASSERT_TRUE(foundInHLSLCodeRegex(
-        "v(\\d)* = f_add_float4_float4\\(angle_frm\\(_u1\\), angle_frm\\(_u2\\)\\)"));
-    // Test inout parameter
-    ASSERT_TRUE(foundInAllGLSLCode("_ucompound_add(_uv, angle_frm(_uu3))"));
-    ASSERT_TRUE(
-        foundInHLSLCodeRegex("compound_add_float4_float4\\(_v(\\d)*, angle_frm\\(_u3\\)\\)"));
-    // Test out parameter
-    ASSERT_TRUE(foundInAllGLSLCode("_uadd_to_last(angle_frm(_uu4), angle_frm(_uu5), _uv2)"));
-    ASSERT_TRUE(foundInHLSLCodeRegex(
-        "add_to_last_float4_float4_float4\\(angle_frm\\(_u4\\), angle_frm\\(_u5\\), _v2(\\d)*\\)"));
-}
-
-TEST_F(DebugShaderPrecisionTest, FunctionCallParameterQualifiersFromPrototype)
-{
-    const std::string &shaderString =
-        "precision mediump float;\n"
-        "uniform vec4 u1;\n"
-        "uniform vec4 u2;\n"
-        "uniform vec4 u3;\n"
-        "uniform vec4 u4;\n"
-        "uniform vec4 u5;\n"
-        "vec4 add(in vec4 x, in vec4 y);\n"
-        "void compound_add(inout vec4 x, in vec4 y);\n"
-        "void add_to_last(in vec4 x, in vec4 y, out vec4 z);\n"
-        "void main() {\n"
-        "   vec4 v = add(u1, u2);\n"
-        "   compound_add(v, u3);\n"
-        "   vec4 v2;\n"
-        "   add_to_last(u4, u5, v2);\n"
-        "   gl_FragColor = v + v2;\n"
-        "}\n"
-        "vec4 add(in vec4 x, in vec4 y) {\n"
-        "   return x + y;\n"
-        "}\n"
-        "void compound_add(inout vec4 x, in vec4 y) {\n"
-        "   x = x + y;\n"
-        "}\n"
-        "void add_to_last(in vec4 x, in vec4 y, out vec4 z) {\n"
-        "   z = x + y;\n"
-        "}\n";
-    compile(shaderString);
-    // Test in parameters
-    ASSERT_TRUE(foundInAllGLSLCode("v = _uadd(angle_frm(_uu1), angle_frm(_uu2))"));
-    ASSERT_TRUE(foundInHLSLCodeRegex(
-        "v(\\d)* = f_add_float4_float4\\(angle_frm\\(_u1\\), angle_frm\\(_u2\\)\\)"));
-    // Test inout parameter
-    ASSERT_TRUE(foundInAllGLSLCode("_ucompound_add(_uv, angle_frm(_uu3))"));
-    ASSERT_TRUE(
-        foundInHLSLCodeRegex("compound_add_float4_float4\\(_v(\\d)*, angle_frm\\(_u3\\)\\)"));
-    // Test out parameter
-    ASSERT_TRUE(foundInAllGLSLCode("add_to_last(angle_frm(_uu4), angle_frm(_uu5), _uv2)"));
-    ASSERT_TRUE(foundInHLSLCodeRegex(
-        "add_to_last_float4_float4_float4\\(angle_frm\\(_u4\\), angle_frm\\(_u5\\), _v2(\\d)*\\)"));
-}
-
-TEST_F(DebugShaderPrecisionTest, NestedFunctionCalls)
-{
-    const std::string &shaderString =
-        "precision mediump float;\n"
-        "uniform vec4 u1;\n"
-        "uniform vec4 u2;\n"
-        "uniform vec4 u3;\n"
-        "vec4 add(in vec4 x, in vec4 y) {\n"
-        "   return x + y;\n"
-        "}\n"
-        "vec4 compound_add(inout vec4 x, in vec4 y) {\n"
-        "   x = x + y;\n"
-        "   return x;\n"
-        "}\n"
-        "void main() {\n"
-        "   vec4 v = u1;\n"
-        "   vec4 v2 = add(compound_add(v, u2), fract(u3));\n"
-        "   gl_FragColor = v + v2;\n"
-        "}\n";
-    compile(shaderString);
-    // Test nested calls
-    ASSERT_TRUE(foundInAllGLSLCode(
-        "v2 = _uadd(_ucompound_add(_uv, angle_frm(_uu2)), angle_frm(fract(angle_frm(_uu3))))"));
-    ASSERT_TRUE(foundInHLSLCodeRegex(
-        "v2(\\d)* = f_add_float4_float4\\(f_compound_add_float4_float4\\(_v(\\d)*, "
-        "angle_frm\\(_u2\\)\\), "
-        "angle_frm\\(frac\\(angle_frm\\(_u3\\)\\)\\)\\)"));
-}
-
-// Test that code inside an index of a function out parameter gets processed.
-TEST_F(DebugShaderPrecisionTest, OpInIndexOfFunctionOutParameter)
-{
-    const std::string &shaderString =
-        "precision mediump float;\n"
-        "void foo(out vec4 f) { f.x = 0.0; }\n"
-        "uniform float u2;\n"
-        "void main() {\n"
-        "   vec4 v[2];\n"
-        "   foo(v[int(exp2(u2))]);\n"
-        "   gl_FragColor = v[0];\n"
-        "}\n";
-    compile(shaderString);
-    ASSERT_TRUE(foundInAllGLSLCode("angle_frm(exp2(angle_frm(_uu2)))"));
-    ASSERT_TRUE(foundInHLSLCode("angle_frm(exp2(angle_frm(_u2)))"));
-}
-
-// Test that code inside an index of an l-value gets processed.
-TEST_F(DebugShaderPrecisionTest, OpInIndexOfLValue)
-{
-    const std::string &shaderString =
-        "precision mediump float;\n"
-        "uniform vec4 u1;\n"
-        "uniform float u2;\n"
-        "void main() {\n"
-        "   vec4 v[2];\n"
-        "   v[int(exp2(u2))] = u1;\n"
-        "   gl_FragColor = v[0];\n"
-        "}\n";
-    compile(shaderString);
-    ASSERT_TRUE(foundInAllGLSLCode("angle_frm(exp2(angle_frm(_uu2)))"));
-    ASSERT_TRUE(foundInHLSLCode("angle_frm(exp2(angle_frm(_u2)))"));
-}
-
-// Test that the out parameter of modf doesn't get rounded
-TEST_F(DebugShaderPrecisionTest, ModfOutParameter)
-{
-    const std::string &shaderString =
-        "#version 300 es\n"
-        "precision mediump float;\n"
-        "uniform float u;\n"
-        "out vec4 my_FragColor;\n"
-        "void main() {\n"
-        "   float o;\n"
-        "   float f = modf(u, o);\n"
-        "   my_FragColor = vec4(f, o, 0, 1);\n"
-        "}\n";
-    compile(shaderString);
-    ASSERT_TRUE(foundInAllGLSLCode("modf(angle_frm(_uu), _uo)"));
-    ASSERT_TRUE(foundInHLSLCodeRegex(R"(modf\(angle_frm\(_u\), _o(\d)*)"));
-}
-
-#if defined(ANGLE_ENABLE_HLSL)
-// Tests precision emulation with HLSL 3.0 output -- should error gracefully.
-TEST(DebugShaderPrecisionNegativeTest, HLSL3Unsupported)
-{
-    const std::string &shaderString =
-        "precision mediump float;\n"
-        "uniform float u;\n"
-        "void main() {\n"
-        "   gl_FragColor = vec4(u);\n"
-        "}\n";
-    std::string infoLog;
-    std::string translatedCode;
-    ShBuiltInResources resources;
-    sh::InitBuiltInResources(&resources);
-    resources.WEBGL_debug_shader_precision = 1;
-    ASSERT_FALSE(compileTestShader(GL_FRAGMENT_SHADER, SH_GLES3_SPEC, SH_HLSL_3_0_OUTPUT,
-                                   shaderString, &resources, 0, &translatedCode, &infoLog));
-}
-#endif  // defined(ANGLE_ENABLE_HLSL)
-
-// Test that compound assignment inside an expression compiles correctly. This is a test for a bug
-// where incorrect type information on the compound assignment call node caused an assert to trigger
-// in the debug build.
-TEST_F(DebugShaderPrecisionTest, CompoundAssignmentInsideExpression)
-{
-    const std::string &shaderString =
-        "#version 300 es\n"
-        "precision mediump float;\n"
-        "out vec4 my_FragColor;\n"
-        "void main() {\n"
-        "   float f = 0.0;\n"
-        "   my_FragColor = vec4(abs(f += 1.0), 0, 0, 1);\n"
-        "}\n";
-    compile(shaderString);
-    ASSERT_TRUE(foundInAllGLSLCode("abs(angle_compound_add_frm(_uf, 1.0))"));
-}
-
-// Test that having rounded values inside the right hand side of logical or doesn't trigger asserts
-// in HLSL output.
-TEST_F(DebugShaderPrecisionTest, RoundedValueOnRightSideOfLogicalOr)
-{
-    const std::string &shaderString =
-        "#version 300 es\n"
-        "precision mediump float;\n"
-        "out vec4 my_FragColor;\n"
-        "uniform float u1, u2;\n"
-        "void main() {\n"
-        "   my_FragColor = vec4(u1 == 0.0 || u2 == 0.0);\n"
-        "}\n";
-    compile(shaderString);
-    ASSERT_TRUE(foundInHLSLCode("angle_frm(_u2) == 0.0"));
-}
diff --git a/src/tests/compiler_tests/ImmutableString_test_ESSL_autogen.cpp b/src/tests/compiler_tests/ImmutableString_test_ESSL_autogen.cpp
index 1ec7832..a7b8985 100644
--- a/src/tests/compiler_tests/ImmutableString_test_ESSL_autogen.cpp
+++ b/src/tests/compiler_tests/ImmutableString_test_ESSL_autogen.cpp
@@ -1555,128 +1555,135 @@
     ASSERT_EQ(0x000005e2u, ImmutableString("groupMemoryBarrier(").mangledNameHash());
     ASSERT_EQ(0x000005e3u, ImmutableString("EmitVertex(").mangledNameHash());
     ASSERT_EQ(0x000005e4u, ImmutableString("EndPrimitive(").mangledNameHash());
-    ASSERT_EQ(0x000005e5u, ImmutableString("gl_DepthRangeParameters").mangledNameHash());
-    ASSERT_EQ(0x000005e6u, ImmutableString("gl_DepthRange").mangledNameHash());
-    ASSERT_EQ(0x000005e7u, ImmutableString("gl_NumSamples").mangledNameHash());
-    ASSERT_EQ(0x000005e8u, ImmutableString("gl_MaxVertexAttribs").mangledNameHash());
-    ASSERT_EQ(0x000005e9u, ImmutableString("gl_MaxVertexUniformVectors").mangledNameHash());
-    ASSERT_EQ(0x000005eau, ImmutableString("gl_MaxVertexTextureImageUnits").mangledNameHash());
-    ASSERT_EQ(0x000005ebu, ImmutableString("gl_MaxCombinedTextureImageUnits").mangledNameHash());
-    ASSERT_EQ(0x000005ecu, ImmutableString("gl_MaxTextureImageUnits").mangledNameHash());
-    ASSERT_EQ(0x000005edu, ImmutableString("gl_MaxFragmentUniformVectors").mangledNameHash());
-    ASSERT_EQ(0x000005eeu, ImmutableString("gl_MaxVaryingVectors").mangledNameHash());
-    ASSERT_EQ(0x000005efu, ImmutableString("gl_MaxDrawBuffers").mangledNameHash());
-    ASSERT_EQ(0x000005f0u, ImmutableString("gl_MaxDualSourceDrawBuffersEXT").mangledNameHash());
-    ASSERT_EQ(0x000005f1u, ImmutableString("gl_MaxVertexOutputVectors").mangledNameHash());
-    ASSERT_EQ(0x000005f2u, ImmutableString("gl_MaxFragmentInputVectors").mangledNameHash());
-    ASSERT_EQ(0x000005f3u, ImmutableString("gl_MinProgramTexelOffset").mangledNameHash());
-    ASSERT_EQ(0x000005f4u, ImmutableString("gl_MaxProgramTexelOffset").mangledNameHash());
-    ASSERT_EQ(0x000005f5u, ImmutableString("gl_MaxImageUnits").mangledNameHash());
-    ASSERT_EQ(0x000005f6u, ImmutableString("gl_MaxVertexImageUniforms").mangledNameHash());
-    ASSERT_EQ(0x000005f7u, ImmutableString("gl_MaxFragmentImageUniforms").mangledNameHash());
-    ASSERT_EQ(0x000005f8u, ImmutableString("gl_MaxComputeImageUniforms").mangledNameHash());
-    ASSERT_EQ(0x000005f9u, ImmutableString("gl_MaxCombinedImageUniforms").mangledNameHash());
-    ASSERT_EQ(0x000005fau,
+    ASSERT_EQ(0x000005e5u, ImmutableString("subpassLoad(01g").mangledNameHash());
+    ASSERT_EQ(0x000005e6u, ImmutableString("subpassLoad(01h").mangledNameHash());
+    ASSERT_EQ(0x000005e7u, ImmutableString("subpassLoad(01i").mangledNameHash());
+    ASSERT_EQ(0x000005e8u, ImmutableString("subpassLoad(01j00D").mangledNameHash());
+    ASSERT_EQ(0x000005e9u, ImmutableString("subpassLoad(01k00D").mangledNameHash());
+    ASSERT_EQ(0x000005eau, ImmutableString("subpassLoad(01l00D").mangledNameHash());
+    ASSERT_EQ(0x000005ebu, ImmutableString("gl_DepthRangeParameters").mangledNameHash());
+    ASSERT_EQ(0x000005ecu, ImmutableString("gl_DepthRange").mangledNameHash());
+    ASSERT_EQ(0x000005edu, ImmutableString("gl_NumSamples").mangledNameHash());
+    ASSERT_EQ(0x000005eeu, ImmutableString("gl_MaxVertexAttribs").mangledNameHash());
+    ASSERT_EQ(0x000005efu, ImmutableString("gl_MaxVertexUniformVectors").mangledNameHash());
+    ASSERT_EQ(0x000005f0u, ImmutableString("gl_MaxVertexTextureImageUnits").mangledNameHash());
+    ASSERT_EQ(0x000005f1u, ImmutableString("gl_MaxCombinedTextureImageUnits").mangledNameHash());
+    ASSERT_EQ(0x000005f2u, ImmutableString("gl_MaxTextureImageUnits").mangledNameHash());
+    ASSERT_EQ(0x000005f3u, ImmutableString("gl_MaxFragmentUniformVectors").mangledNameHash());
+    ASSERT_EQ(0x000005f4u, ImmutableString("gl_MaxVaryingVectors").mangledNameHash());
+    ASSERT_EQ(0x000005f5u, ImmutableString("gl_MaxDrawBuffers").mangledNameHash());
+    ASSERT_EQ(0x000005f6u, ImmutableString("gl_MaxDualSourceDrawBuffersEXT").mangledNameHash());
+    ASSERT_EQ(0x000005f7u, ImmutableString("gl_MaxVertexOutputVectors").mangledNameHash());
+    ASSERT_EQ(0x000005f8u, ImmutableString("gl_MaxFragmentInputVectors").mangledNameHash());
+    ASSERT_EQ(0x000005f9u, ImmutableString("gl_MinProgramTexelOffset").mangledNameHash());
+    ASSERT_EQ(0x000005fau, ImmutableString("gl_MaxProgramTexelOffset").mangledNameHash());
+    ASSERT_EQ(0x000005fbu, ImmutableString("gl_MaxImageUnits").mangledNameHash());
+    ASSERT_EQ(0x000005fcu, ImmutableString("gl_MaxVertexImageUniforms").mangledNameHash());
+    ASSERT_EQ(0x000005fdu, ImmutableString("gl_MaxFragmentImageUniforms").mangledNameHash());
+    ASSERT_EQ(0x000005feu, ImmutableString("gl_MaxComputeImageUniforms").mangledNameHash());
+    ASSERT_EQ(0x000005ffu, ImmutableString("gl_MaxCombinedImageUniforms").mangledNameHash());
+    ASSERT_EQ(0x00000600u,
               ImmutableString("gl_MaxCombinedShaderOutputResources").mangledNameHash());
-    ASSERT_EQ(0x000005fbu, ImmutableString("gl_MaxComputeWorkGroupCount").mangledNameHash());
-    ASSERT_EQ(0x000005fcu, ImmutableString("gl_MaxComputeWorkGroupSize").mangledNameHash());
-    ASSERT_EQ(0x000005fdu, ImmutableString("gl_MaxComputeUniformComponents").mangledNameHash());
-    ASSERT_EQ(0x000005feu, ImmutableString("gl_MaxComputeTextureImageUnits").mangledNameHash());
-    ASSERT_EQ(0x000005ffu, ImmutableString("gl_MaxComputeAtomicCounters").mangledNameHash());
-    ASSERT_EQ(0x00000600u, ImmutableString("gl_MaxComputeAtomicCounterBuffers").mangledNameHash());
-    ASSERT_EQ(0x00000601u, ImmutableString("gl_MaxVertexAtomicCounters").mangledNameHash());
-    ASSERT_EQ(0x00000602u, ImmutableString("gl_MaxFragmentAtomicCounters").mangledNameHash());
-    ASSERT_EQ(0x00000603u, ImmutableString("gl_MaxCombinedAtomicCounters").mangledNameHash());
-    ASSERT_EQ(0x00000604u, ImmutableString("gl_MaxAtomicCounterBindings").mangledNameHash());
-    ASSERT_EQ(0x00000605u, ImmutableString("gl_MaxVertexAtomicCounterBuffers").mangledNameHash());
-    ASSERT_EQ(0x00000606u, ImmutableString("gl_MaxFragmentAtomicCounterBuffers").mangledNameHash());
-    ASSERT_EQ(0x00000607u, ImmutableString("gl_MaxCombinedAtomicCounterBuffers").mangledNameHash());
-    ASSERT_EQ(0x00000608u, ImmutableString("gl_MaxAtomicCounterBufferSize").mangledNameHash());
-    ASSERT_EQ(0x00000609u, ImmutableString("gl_MaxGeometryInputComponents").mangledNameHash());
-    ASSERT_EQ(0x0000060au, ImmutableString("gl_MaxGeometryOutputComponents").mangledNameHash());
-    ASSERT_EQ(0x0000060bu, ImmutableString("gl_MaxGeometryImageUniforms").mangledNameHash());
-    ASSERT_EQ(0x0000060cu, ImmutableString("gl_MaxGeometryTextureImageUnits").mangledNameHash());
-    ASSERT_EQ(0x0000060du, ImmutableString("gl_MaxGeometryOutputVertices").mangledNameHash());
-    ASSERT_EQ(0x0000060eu,
+    ASSERT_EQ(0x00000601u, ImmutableString("gl_MaxComputeWorkGroupCount").mangledNameHash());
+    ASSERT_EQ(0x00000602u, ImmutableString("gl_MaxComputeWorkGroupSize").mangledNameHash());
+    ASSERT_EQ(0x00000603u, ImmutableString("gl_MaxComputeUniformComponents").mangledNameHash());
+    ASSERT_EQ(0x00000604u, ImmutableString("gl_MaxComputeTextureImageUnits").mangledNameHash());
+    ASSERT_EQ(0x00000605u, ImmutableString("gl_MaxComputeAtomicCounters").mangledNameHash());
+    ASSERT_EQ(0x00000606u, ImmutableString("gl_MaxComputeAtomicCounterBuffers").mangledNameHash());
+    ASSERT_EQ(0x00000607u, ImmutableString("gl_MaxVertexAtomicCounters").mangledNameHash());
+    ASSERT_EQ(0x00000608u, ImmutableString("gl_MaxFragmentAtomicCounters").mangledNameHash());
+    ASSERT_EQ(0x00000609u, ImmutableString("gl_MaxCombinedAtomicCounters").mangledNameHash());
+    ASSERT_EQ(0x0000060au, ImmutableString("gl_MaxAtomicCounterBindings").mangledNameHash());
+    ASSERT_EQ(0x0000060bu, ImmutableString("gl_MaxVertexAtomicCounterBuffers").mangledNameHash());
+    ASSERT_EQ(0x0000060cu, ImmutableString("gl_MaxFragmentAtomicCounterBuffers").mangledNameHash());
+    ASSERT_EQ(0x0000060du, ImmutableString("gl_MaxCombinedAtomicCounterBuffers").mangledNameHash());
+    ASSERT_EQ(0x0000060eu, ImmutableString("gl_MaxAtomicCounterBufferSize").mangledNameHash());
+    ASSERT_EQ(0x0000060fu, ImmutableString("gl_MaxGeometryInputComponents").mangledNameHash());
+    ASSERT_EQ(0x00000610u, ImmutableString("gl_MaxGeometryOutputComponents").mangledNameHash());
+    ASSERT_EQ(0x00000611u, ImmutableString("gl_MaxGeometryImageUniforms").mangledNameHash());
+    ASSERT_EQ(0x00000612u, ImmutableString("gl_MaxGeometryTextureImageUnits").mangledNameHash());
+    ASSERT_EQ(0x00000613u, ImmutableString("gl_MaxGeometryOutputVertices").mangledNameHash());
+    ASSERT_EQ(0x00000614u,
               ImmutableString("gl_MaxGeometryTotalOutputComponents").mangledNameHash());
-    ASSERT_EQ(0x0000060fu, ImmutableString("gl_MaxGeometryUniformComponents").mangledNameHash());
-    ASSERT_EQ(0x00000610u, ImmutableString("gl_MaxGeometryAtomicCounters").mangledNameHash());
-    ASSERT_EQ(0x00000611u, ImmutableString("gl_MaxGeometryAtomicCounterBuffers").mangledNameHash());
-    ASSERT_EQ(0x00000612u, ImmutableString("gl_MaxTessControlInputComponents").mangledNameHash());
-    ASSERT_EQ(0x00000613u, ImmutableString("gl_MaxTessControlOutputComponents").mangledNameHash());
-    ASSERT_EQ(0x00000614u, ImmutableString("gl_MaxTessControlTextureImageUnits").mangledNameHash());
-    ASSERT_EQ(0x00000615u, ImmutableString("gl_MaxTessControlUniformComponents").mangledNameHash());
-    ASSERT_EQ(0x00000616u,
+    ASSERT_EQ(0x00000615u, ImmutableString("gl_MaxGeometryUniformComponents").mangledNameHash());
+    ASSERT_EQ(0x00000616u, ImmutableString("gl_MaxGeometryAtomicCounters").mangledNameHash());
+    ASSERT_EQ(0x00000617u, ImmutableString("gl_MaxGeometryAtomicCounterBuffers").mangledNameHash());
+    ASSERT_EQ(0x00000618u, ImmutableString("gl_MaxTessControlInputComponents").mangledNameHash());
+    ASSERT_EQ(0x00000619u, ImmutableString("gl_MaxTessControlOutputComponents").mangledNameHash());
+    ASSERT_EQ(0x0000061au, ImmutableString("gl_MaxTessControlTextureImageUnits").mangledNameHash());
+    ASSERT_EQ(0x0000061bu, ImmutableString("gl_MaxTessControlUniformComponents").mangledNameHash());
+    ASSERT_EQ(0x0000061cu,
               ImmutableString("gl_MaxTessControlTotalOutputComponents").mangledNameHash());
-    ASSERT_EQ(0x00000617u, ImmutableString("gl_MaxTessControlImageUniforms").mangledNameHash());
-    ASSERT_EQ(0x00000618u, ImmutableString("gl_MaxTessControlAtomicCounters").mangledNameHash());
-    ASSERT_EQ(0x00000619u,
-              ImmutableString("gl_MaxTessControlAtomicCounterBuffers").mangledNameHash());
-    ASSERT_EQ(0x0000061au, ImmutableString("gl_MaxTessPatchComponents").mangledNameHash());
-    ASSERT_EQ(0x0000061bu, ImmutableString("gl_MaxPatchVertices").mangledNameHash());
-    ASSERT_EQ(0x0000061cu, ImmutableString("gl_MaxTessGenLevel").mangledNameHash());
-    ASSERT_EQ(0x0000061du,
-              ImmutableString("gl_MaxTessEvaluationInputComponents").mangledNameHash());
-    ASSERT_EQ(0x0000061eu,
-              ImmutableString("gl_MaxTessEvaluationOutputComponents").mangledNameHash());
+    ASSERT_EQ(0x0000061du, ImmutableString("gl_MaxTessControlImageUniforms").mangledNameHash());
+    ASSERT_EQ(0x0000061eu, ImmutableString("gl_MaxTessControlAtomicCounters").mangledNameHash());
     ASSERT_EQ(0x0000061fu,
-              ImmutableString("gl_MaxTessEvaluationTextureImageUnits").mangledNameHash());
-    ASSERT_EQ(0x00000620u,
-              ImmutableString("gl_MaxTessEvaluationUniformComponents").mangledNameHash());
-    ASSERT_EQ(0x00000621u, ImmutableString("gl_MaxTessEvaluationImageUniforms").mangledNameHash());
-    ASSERT_EQ(0x00000622u, ImmutableString("gl_MaxTessEvaluationAtomicCounters").mangledNameHash());
+              ImmutableString("gl_MaxTessControlAtomicCounterBuffers").mangledNameHash());
+    ASSERT_EQ(0x00000620u, ImmutableString("gl_MaxTessPatchComponents").mangledNameHash());
+    ASSERT_EQ(0x00000621u, ImmutableString("gl_MaxPatchVertices").mangledNameHash());
+    ASSERT_EQ(0x00000622u, ImmutableString("gl_MaxTessGenLevel").mangledNameHash());
     ASSERT_EQ(0x00000623u,
+              ImmutableString("gl_MaxTessEvaluationInputComponents").mangledNameHash());
+    ASSERT_EQ(0x00000624u,
+              ImmutableString("gl_MaxTessEvaluationOutputComponents").mangledNameHash());
+    ASSERT_EQ(0x00000625u,
+              ImmutableString("gl_MaxTessEvaluationTextureImageUnits").mangledNameHash());
+    ASSERT_EQ(0x00000626u,
+              ImmutableString("gl_MaxTessEvaluationUniformComponents").mangledNameHash());
+    ASSERT_EQ(0x00000627u, ImmutableString("gl_MaxTessEvaluationImageUniforms").mangledNameHash());
+    ASSERT_EQ(0x00000628u, ImmutableString("gl_MaxTessEvaluationAtomicCounters").mangledNameHash());
+    ASSERT_EQ(0x00000629u,
               ImmutableString("gl_MaxTessEvaluationAtomicCounterBuffers").mangledNameHash());
-    ASSERT_EQ(0x00000624u, ImmutableString("gl_MaxSamples").mangledNameHash());
-    ASSERT_EQ(0x00000625u, ImmutableString("gl_MaxClipDistances").mangledNameHash());
-    ASSERT_EQ(0x00000626u, ImmutableString("gl_MaxCullDistances").mangledNameHash());
-    ASSERT_EQ(0x00000627u, ImmutableString("gl_MaxCombinedClipAndCullDistances").mangledNameHash());
-    ASSERT_EQ(0x00000628u, ImmutableString("gl_FragCoord").mangledNameHash());
-    ASSERT_EQ(0x00000629u, ImmutableString("gl_FrontFacing").mangledNameHash());
-    ASSERT_EQ(0x0000062au, ImmutableString("gl_PointCoord").mangledNameHash());
-    ASSERT_EQ(0x0000062bu, ImmutableString("gl_FragColor").mangledNameHash());
-    ASSERT_EQ(0x0000062cu, ImmutableString("gl_FragData").mangledNameHash());
-    ASSERT_EQ(0x0000062du, ImmutableString("gl_FragDepth").mangledNameHash());
-    ASSERT_EQ(0x0000062eu, ImmutableString("gl_HelperInvocation").mangledNameHash());
-    ASSERT_EQ(0x0000062fu, ImmutableString("gl_SecondaryFragColorEXT").mangledNameHash());
-    ASSERT_EQ(0x00000630u, ImmutableString("gl_SecondaryFragDataEXT").mangledNameHash());
-    ASSERT_EQ(0x00000631u, ImmutableString("gl_FragDepthEXT").mangledNameHash());
-    ASSERT_EQ(0x00000632u, ImmutableString("gl_LastFragData").mangledNameHash());
-    ASSERT_EQ(0x00000633u, ImmutableString("gl_LastFragColor").mangledNameHash());
-    ASSERT_EQ(0x00000634u, ImmutableString("gl_LastFragColorARM").mangledNameHash());
-    ASSERT_EQ(0x00000635u, ImmutableString("gl_PrimitiveID").mangledNameHash());
-    ASSERT_EQ(0x00000636u, ImmutableString("gl_Layer").mangledNameHash());
-    ASSERT_EQ(0x00000637u, ImmutableString("gl_SampleID").mangledNameHash());
-    ASSERT_EQ(0x00000638u, ImmutableString("gl_SamplePosition").mangledNameHash());
-    ASSERT_EQ(0x00000639u, ImmutableString("gl_SampleMaskIn").mangledNameHash());
-    ASSERT_EQ(0x0000063au, ImmutableString("gl_SampleMask").mangledNameHash());
-    ASSERT_EQ(0x0000063bu, ImmutableString("gl_CullDistance").mangledNameHash());
-    ASSERT_EQ(0x0000063cu, ImmutableString("gl_ClipDistance").mangledNameHash());
-    ASSERT_EQ(0x0000063du, ImmutableString("gl_Position").mangledNameHash());
-    ASSERT_EQ(0x0000063eu, ImmutableString("gl_PointSize").mangledNameHash());
-    ASSERT_EQ(0x0000063fu, ImmutableString("gl_InstanceID").mangledNameHash());
-    ASSERT_EQ(0x00000641u, ImmutableString("gl_VertexID").mangledNameHash());
-    ASSERT_EQ(0x00000644u, ImmutableString("gl_DrawID").mangledNameHash());
-    ASSERT_EQ(0x00000645u, ImmutableString("gl_BaseVertex").mangledNameHash());
-    ASSERT_EQ(0x00000646u, ImmutableString("gl_BaseInstance").mangledNameHash());
-    ASSERT_EQ(0x00000647u, ImmutableString("angle_BaseVertex").mangledNameHash());
-    ASSERT_EQ(0x00000648u, ImmutableString("angle_BaseInstance").mangledNameHash());
-    ASSERT_EQ(0x00000649u, ImmutableString("gl_NumWorkGroups").mangledNameHash());
-    ASSERT_EQ(0x0000064au, ImmutableString("gl_WorkGroupSize").mangledNameHash());
-    ASSERT_EQ(0x0000064bu, ImmutableString("gl_WorkGroupID").mangledNameHash());
-    ASSERT_EQ(0x0000064cu, ImmutableString("gl_LocalInvocationID").mangledNameHash());
-    ASSERT_EQ(0x0000064du, ImmutableString("gl_GlobalInvocationID").mangledNameHash());
-    ASSERT_EQ(0x0000064eu, ImmutableString("gl_LocalInvocationIndex").mangledNameHash());
-    ASSERT_EQ(0x0000064fu, ImmutableString("gl_PrimitiveIDIn").mangledNameHash());
-    ASSERT_EQ(0x00000650u, ImmutableString("gl_InvocationID").mangledNameHash());
-    ASSERT_EQ(0x00000651u, ImmutableString("gl_PerVertex").mangledNameHash());
-    ASSERT_EQ(0x00000652u, ImmutableString("gl_in").mangledNameHash());
-    ASSERT_EQ(0x00000653u, ImmutableString("gl_PatchVerticesIn").mangledNameHash());
-    ASSERT_EQ(0x00000654u, ImmutableString("gl_TessLevelOuter").mangledNameHash());
-    ASSERT_EQ(0x00000655u, ImmutableString("gl_TessLevelInner").mangledNameHash());
-    ASSERT_EQ(0x00000656u, ImmutableString("gl_out").mangledNameHash());
-    ASSERT_EQ(0x00000657u, ImmutableString("gl_TessCoord").mangledNameHash());
-    ASSERT_EQ(0x00000658u, ImmutableString("gl_ViewID_OVR").mangledNameHash());
+    ASSERT_EQ(0x0000062au, ImmutableString("gl_MaxSamples").mangledNameHash());
+    ASSERT_EQ(0x0000062bu, ImmutableString("gl_MaxClipDistances").mangledNameHash());
+    ASSERT_EQ(0x0000062cu, ImmutableString("gl_MaxCullDistances").mangledNameHash());
+    ASSERT_EQ(0x0000062du, ImmutableString("gl_MaxCombinedClipAndCullDistances").mangledNameHash());
+    ASSERT_EQ(0x0000062eu, ImmutableString("gl_FragCoord").mangledNameHash());
+    ASSERT_EQ(0x0000062fu, ImmutableString("gl_FrontFacing").mangledNameHash());
+    ASSERT_EQ(0x00000630u, ImmutableString("gl_PointCoord").mangledNameHash());
+    ASSERT_EQ(0x00000631u, ImmutableString("gl_FragColor").mangledNameHash());
+    ASSERT_EQ(0x00000632u, ImmutableString("gl_FragData").mangledNameHash());
+    ASSERT_EQ(0x00000633u, ImmutableString("gl_FragDepth").mangledNameHash());
+    ASSERT_EQ(0x00000634u, ImmutableString("gl_HelperInvocation").mangledNameHash());
+    ASSERT_EQ(0x00000635u, ImmutableString("gl_SecondaryFragColorEXT").mangledNameHash());
+    ASSERT_EQ(0x00000636u, ImmutableString("gl_SecondaryFragDataEXT").mangledNameHash());
+    ASSERT_EQ(0x00000637u, ImmutableString("gl_FragDepthEXT").mangledNameHash());
+    ASSERT_EQ(0x00000638u, ImmutableString("gl_LastFragData").mangledNameHash());
+    ASSERT_EQ(0x00000639u, ImmutableString("gl_LastFragColor").mangledNameHash());
+    ASSERT_EQ(0x0000063au, ImmutableString("gl_LastFragColorARM").mangledNameHash());
+    ASSERT_EQ(0x0000063bu, ImmutableString("gl_PrimitiveID").mangledNameHash());
+    ASSERT_EQ(0x0000063cu, ImmutableString("gl_Layer").mangledNameHash());
+    ASSERT_EQ(0x0000063du, ImmutableString("gl_SampleID").mangledNameHash());
+    ASSERT_EQ(0x0000063eu, ImmutableString("gl_SamplePosition").mangledNameHash());
+    ASSERT_EQ(0x0000063fu, ImmutableString("gl_SampleMaskIn").mangledNameHash());
+    ASSERT_EQ(0x00000640u, ImmutableString("gl_SampleMask").mangledNameHash());
+    ASSERT_EQ(0x00000641u, ImmutableString("gl_CullDistance").mangledNameHash());
+    ASSERT_EQ(0x00000642u, ImmutableString("gl_ClipDistance").mangledNameHash());
+    ASSERT_EQ(0x00000643u, ImmutableString("gl_Position").mangledNameHash());
+    ASSERT_EQ(0x00000644u, ImmutableString("gl_PointSize").mangledNameHash());
+    ASSERT_EQ(0x00000645u, ImmutableString("gl_InstanceID").mangledNameHash());
+    ASSERT_EQ(0x00000647u, ImmutableString("gl_VertexID").mangledNameHash());
+    ASSERT_EQ(0x0000064au, ImmutableString("gl_DrawID").mangledNameHash());
+    ASSERT_EQ(0x0000064bu, ImmutableString("gl_BaseVertex").mangledNameHash());
+    ASSERT_EQ(0x0000064cu, ImmutableString("gl_BaseInstance").mangledNameHash());
+    ASSERT_EQ(0x0000064du, ImmutableString("angle_BaseVertex").mangledNameHash());
+    ASSERT_EQ(0x0000064eu, ImmutableString("angle_BaseInstance").mangledNameHash());
+    ASSERT_EQ(0x0000064fu, ImmutableString("gl_NumWorkGroups").mangledNameHash());
+    ASSERT_EQ(0x00000650u, ImmutableString("gl_WorkGroupSize").mangledNameHash());
+    ASSERT_EQ(0x00000651u, ImmutableString("gl_WorkGroupID").mangledNameHash());
+    ASSERT_EQ(0x00000652u, ImmutableString("gl_LocalInvocationID").mangledNameHash());
+    ASSERT_EQ(0x00000653u, ImmutableString("gl_GlobalInvocationID").mangledNameHash());
+    ASSERT_EQ(0x00000654u, ImmutableString("gl_LocalInvocationIndex").mangledNameHash());
+    ASSERT_EQ(0x00000655u, ImmutableString("gl_PrimitiveIDIn").mangledNameHash());
+    ASSERT_EQ(0x00000656u, ImmutableString("gl_InvocationID").mangledNameHash());
+    ASSERT_EQ(0x00000657u, ImmutableString("gl_PerVertex").mangledNameHash());
+    ASSERT_EQ(0x00000658u, ImmutableString("gl_in").mangledNameHash());
+    ASSERT_EQ(0x00000659u, ImmutableString("gl_PatchVerticesIn").mangledNameHash());
+    ASSERT_EQ(0x0000065au, ImmutableString("gl_TessLevelOuter").mangledNameHash());
+    ASSERT_EQ(0x0000065bu, ImmutableString("gl_TessLevelInner").mangledNameHash());
+    ASSERT_EQ(0x0000065cu, ImmutableString("gl_out").mangledNameHash());
+    ASSERT_EQ(0x0000065du, ImmutableString("gl_BoundingBoxEXT").mangledNameHash());
+    ASSERT_EQ(0x0000065eu, ImmutableString("gl_TessCoord").mangledNameHash());
+    ASSERT_EQ(0x0000065fu, ImmutableString("gl_ViewID_OVR").mangledNameHash());
     ASSERT_EQ(0x00000000u, ImmutableString("radians").unmangledNameHash());
     ASSERT_EQ(0x00000001u, ImmutableString("degrees").unmangledNameHash());
     ASSERT_EQ(0x00000002u, ImmutableString("sin").unmangledNameHash());
@@ -1843,6 +1850,7 @@
     ASSERT_EQ(0x000000a3u, ImmutableString("groupMemoryBarrier").unmangledNameHash());
     ASSERT_EQ(0x000000a4u, ImmutableString("EmitVertex").unmangledNameHash());
     ASSERT_EQ(0x000000a5u, ImmutableString("EndPrimitive").unmangledNameHash());
+    ASSERT_EQ(0x000000a6u, ImmutableString("subpassLoad").unmangledNameHash());
 }
 
 }  // namespace sh
diff --git a/src/tests/compiler_tests/ImmutableString_test_autogen.cpp b/src/tests/compiler_tests/ImmutableString_test_autogen.cpp
index 565ff80..e4047ed 100644
--- a/src/tests/compiler_tests/ImmutableString_test_autogen.cpp
+++ b/src/tests/compiler_tests/ImmutableString_test_autogen.cpp
@@ -2248,8 +2248,9 @@
     ASSERT_EQ(0x0000087fu, ImmutableString("gl_TessLevelOuter").mangledNameHash());
     ASSERT_EQ(0x00000880u, ImmutableString("gl_TessLevelInner").mangledNameHash());
     ASSERT_EQ(0x00000881u, ImmutableString("gl_out").mangledNameHash());
-    ASSERT_EQ(0x00000882u, ImmutableString("gl_TessCoord").mangledNameHash());
-    ASSERT_EQ(0x00000883u, ImmutableString("gl_ViewID_OVR").mangledNameHash());
+    ASSERT_EQ(0x00000882u, ImmutableString("gl_BoundingBoxEXT").mangledNameHash());
+    ASSERT_EQ(0x00000883u, ImmutableString("gl_TessCoord").mangledNameHash());
+    ASSERT_EQ(0x00000884u, ImmutableString("gl_ViewID_OVR").mangledNameHash());
     ASSERT_EQ(0x00000000u, ImmutableString("radians").unmangledNameHash());
     ASSERT_EQ(0x00000001u, ImmutableString("degrees").unmangledNameHash());
     ASSERT_EQ(0x00000002u, ImmutableString("sin").unmangledNameHash());
diff --git a/src/tests/compiler_tests/InitOutputVariables_test.cpp b/src/tests/compiler_tests/InitOutputVariables_test.cpp
index bf8781b..9ec47ed 100644
--- a/src/tests/compiler_tests/InitOutputVariables_test.cpp
+++ b/src/tests/compiler_tests/InitOutputVariables_test.cpp
@@ -240,6 +240,26 @@
     }
 };
 
+class InitOutputVariablesVertexShaderClipDistanceTest : public ShaderCompileTreeTest
+{
+  public:
+    InitOutputVariablesVertexShaderClipDistanceTest()
+    {
+        mExtraCompileOptions |= SH_VARIABLES;
+        mExtraCompileOptions |= SH_INIT_OUTPUT_VARIABLES;
+        mExtraCompileOptions |= SH_VALIDATE_AST;
+    }
+
+  protected:
+    ::GLenum getShaderType() const override { return GL_VERTEX_SHADER; }
+    ShShaderSpec getShaderSpec() const override { return SH_GLES2_SPEC; }
+    void initResources(ShBuiltInResources *resources) override
+    {
+        resources->APPLE_clip_distance = 1;
+        resources->MaxClipDistances    = 8;
+    }
+};
+
 // Test the initialization of output variables with various qualifiers in a vertex shader.
 TEST_F(InitOutputVariablesWebGL2VertexShaderTest, OutputAllQualifiers)
 {
@@ -439,4 +459,32 @@
     EXPECT_EQ(1u, verifier.getCandidates().size());
 }
 
+// Mirrors ClipDistanceTest.ThreeClipDistancesRedeclared
+TEST_F(InitOutputVariablesVertexShaderClipDistanceTest, RedeclareClipDistance)
+{
+    constexpr char shaderString[] = R"(
+#extension GL_APPLE_clip_distance : require
+
+varying highp float gl_ClipDistance[3];
+
+void computeClipDistances(in vec4 position, in vec4 plane[3])
+{
+    gl_ClipDistance[0] = dot(position, plane[0]);
+    gl_ClipDistance[1] = dot(position, plane[1]);
+    gl_ClipDistance[2] = dot(position, plane[2]);
+}
+
+uniform vec4 u_plane[3];
+
+attribute vec2 a_position;
+
+void main()
+{
+    gl_Position = vec4(a_position, 0.0, 1.0);
+
+    computeClipDistances(gl_Position, u_plane);
+})";
+
+    compileAssumeSuccess(shaderString);
+}
 }  // namespace sh
diff --git a/src/tests/compiler_tests/Precise_test.cpp b/src/tests/compiler_tests/Precise_test.cpp
new file mode 100644
index 0000000..8418145
--- /dev/null
+++ b/src/tests/compiler_tests/Precise_test.cpp
@@ -0,0 +1,488 @@
+//
+// Copyright 2021 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.
+//
+// Precise_test.cpp:
+//   Test that precise produces the right number of NoContraction decorations in the generated
+//   SPIR-V.
+//
+
+#include "GLSLANG/ShaderLang.h"
+#include "angle_gl.h"
+#include "common/spirv/spirv_instruction_parser_autogen.h"
+#include "gtest/gtest.h"
+
+namespace spirv = angle::spirv;
+
+namespace
+{
+class PreciseTest : public testing::TestWithParam<bool>
+{
+  public:
+    void SetUp() override
+    {
+        std::map<ShShaderOutput, std::string> shaderOutputList = {
+            {SH_SPIRV_VULKAN_OUTPUT, "SH_SPIRV_VULKAN_OUTPUT"}};
+
+        Initialize(shaderOutputList);
+    }
+
+    void TearDown() override
+    {
+        for (auto shaderOutputType : mShaderOutputList)
+        {
+            DestroyCompiler(shaderOutputType.first);
+        }
+    }
+
+    void Initialize(std::map<ShShaderOutput, std::string> &shaderOutputList)
+    {
+        mShaderOutputList = std::move(shaderOutputList);
+
+        for (auto shaderOutputType : mShaderOutputList)
+        {
+            sh::InitBuiltInResources(&mResourceList[shaderOutputType.first]);
+            mCompilerList[shaderOutputType.first] = nullptr;
+        }
+    }
+
+    void DestroyCompiler(ShShaderOutput shaderOutputType)
+    {
+        if (mCompilerList[shaderOutputType])
+        {
+            sh::Destruct(mCompilerList[shaderOutputType]);
+            mCompilerList[shaderOutputType] = nullptr;
+        }
+    }
+
+    void InitializeCompiler()
+    {
+        for (auto shaderOutputType : mShaderOutputList)
+        {
+            InitializeCompiler(shaderOutputType.first);
+        }
+    }
+
+    void InitializeCompiler(ShShaderOutput shaderOutputType)
+    {
+        DestroyCompiler(shaderOutputType);
+
+        mCompilerList[shaderOutputType] = sh::ConstructCompiler(
+            GL_VERTEX_SHADER, SH_GLES3_2_SPEC, shaderOutputType, &mResourceList[shaderOutputType]);
+        ASSERT_TRUE(mCompilerList[shaderOutputType] != nullptr)
+            << "Compiler for " << mShaderOutputList[shaderOutputType]
+            << " could not be constructed.";
+    }
+
+    bool isDirectSPIRVGen() const { return GetParam(); }
+
+    testing::AssertionResult TestShaderCompile(ShShaderOutput shaderOutputType,
+                                               const char *shaderSource)
+    {
+        const char *shaderStrings[] = {shaderSource};
+
+        const ShCompileOptions options =
+            SH_VARIABLES | SH_OBJECT_CODE | (isDirectSPIRVGen() ? SH_GENERATE_SPIRV_DIRECTLY : 0);
+
+        bool success = sh::Compile(mCompilerList[shaderOutputType], shaderStrings, 1, options);
+        if (success)
+        {
+            return ::testing::AssertionSuccess()
+                   << "Compilation success(" << mShaderOutputList[shaderOutputType] << ")";
+        }
+        return ::testing::AssertionFailure() << sh::GetInfoLog(mCompilerList[shaderOutputType]);
+    }
+
+    void TestShaderCompile(const char *shaderSource, size_t expectedNoContractionDecorationCount)
+    {
+        for (auto shaderOutputType : mShaderOutputList)
+        {
+            EXPECT_TRUE(TestShaderCompile(shaderOutputType.first, shaderSource));
+
+            const spirv::Blob &blob =
+                sh::GetObjectBinaryBlob(mCompilerList[shaderOutputType.first]);
+            ValidateDecorations(blob, expectedNoContractionDecorationCount);
+        }
+    }
+
+    void ValidateDecorations(const spirv::Blob &blob, size_t expectedNoContractionDecorationCount);
+
+  private:
+    std::map<ShShaderOutput, std::string> mShaderOutputList;
+    std::map<ShShaderOutput, ShHandle> mCompilerList;
+    std::map<ShShaderOutput, ShBuiltInResources> mResourceList;
+};
+
+// Parse the SPIR-V and verify that there are as many NoContraction decorations as expected.
+void PreciseTest::ValidateDecorations(const spirv::Blob &blob,
+                                      size_t expectedNoContractionDecorationCount)
+{
+    size_t currentWord                  = spirv::kHeaderIndexInstructions;
+    size_t noContractionDecorationCount = 0;
+
+    while (currentWord < blob.size())
+    {
+        uint32_t wordCount;
+        spv::Op opCode;
+        const uint32_t *instruction = &blob[currentWord];
+        spirv::GetInstructionOpAndLength(instruction, &opCode, &wordCount);
+
+        currentWord += wordCount;
+
+        // Early out when the decorations section is visited.
+        if (opCode == spv::OpTypeVoid || opCode == spv::OpTypeInt || opCode == spv::OpTypeFloat ||
+            opCode == spv::OpTypeBool)
+        {
+            break;
+        }
+
+        if (opCode == spv::OpMemberDecorate)
+        {
+            spirv::IdRef type;
+            spirv::LiteralInteger member;
+            spv::Decoration decoration;
+            spirv::ParseMemberDecorate(instruction, &type, &member, &decoration, nullptr);
+
+            // NoContraction should be applied to arithmetic instructions, and should not be seen on
+            // block members.
+            EXPECT_NE(decoration, spv::DecorationNoContraction);
+        }
+        else if (opCode == spv::OpDecorate)
+        {
+            spirv::IdRef target;
+            spv::Decoration decoration;
+            spirv::ParseDecorate(instruction, &target, &decoration, nullptr);
+
+            if (decoration == spv::DecorationNoContraction)
+            {
+                ++noContractionDecorationCount;
+            }
+        }
+    }
+
+    EXPECT_EQ(noContractionDecorationCount, expectedNoContractionDecorationCount);
+}
+
+// Test that precise on a local variable works.
+TEST_P(PreciseTest, LocalVariable)
+{
+    constexpr char kVS[] = R"(#version 320 es
+
+uniform float u;
+
+void main()
+{
+    float f1 = u, f2 = u;   // f1 is precise, but f2 isn't.
+
+    f1 += 1.0;              // NoContraction
+    f2 += 1.0;
+
+    float f3 = f1 * f1;     // NoContraction
+    f3 /= 2.0;              // NoContraction
+
+    int i1 = int(f3);       // i1 is precise
+    ++i1;                   // NoContraction
+    --i1;                   // NoContraction
+    i1++;                   // NoContraction
+    i1--;                   // NoContraction
+
+    int i2 = i1 % 3;
+    f2 -= float(i2);
+
+    precise float p = float(i1) / 1.5;  // NoContraction
+
+    gl_Position = vec4(p, f2, 0, 0);
+})";
+
+    InitializeCompiler();
+    TestShaderCompile(kVS, 8);
+}
+
+// Test that precise on gl_Position works.
+TEST_P(PreciseTest, Position)
+{
+    if (!isDirectSPIRVGen())
+    {
+        // glslang doesn't apply NoContraction to dot(), while its code seemingly means to.  Unclear
+        // whether dot() requires NoContraction.
+        // https://github.com/KhronosGroup/glslang/issues/2708
+        std::cout << "Test skipped on glslang" << std::endl;
+        return;
+    }
+
+    constexpr char kVS[] = R"(#version 320 es
+
+uniform float u;
+
+out float o;
+
+precise gl_Position;
+
+void main()
+{
+    mat4 m1 = mat4(u);      // m1 is precise, even if not all components are used to determine the
+                            // gl_Position.
+    vec4 v1 = vec4(u);      // v1 is precise
+
+    vec4 v2 = m1 * v1;
+    v1 *= m1;               // NoContraction
+    m1 *= m1;               // NoContraction
+    m1 *= u;                // NoContraction
+    v1 *= u;                // NoContraction
+
+    float f1 = dot(v1, v1);
+    float f2 = dot(v1, v1); // NoContraction
+
+    gl_Position = vec4(m1[0][0], v1[0], f2, 0);
+    o = f1;
+})";
+
+    InitializeCompiler();
+    TestShaderCompile(kVS, 5);
+}
+
+// Test that precise on struct member works.
+TEST_P(PreciseTest, StructMember)
+{
+    constexpr char kVS[] = R"(#version 320 es
+
+uniform float u;
+
+struct S1
+{
+    precise float f;
+    int i;
+};
+
+struct S2
+{
+    float f;
+};
+
+struct S3
+{
+    precise uint u;
+    S1 s1[2];
+    precise S2 s2;
+};
+
+layout(std430) buffer B
+{
+    S3 o1;
+    S3 o2;
+    S3 o3;
+};
+
+void main()
+{
+    S2 a = S2(u), b = S2(u), c = S2(u);     // a and c are precise
+
+    ++a.f;                  // NoContraction
+    o1.s2 = a;
+
+    c.f += a.f;             // NoContraction
+    o2.s1[0].i = int(a.f);
+    o2.s1[0].i *= 2;
+    o2.s1[0].i /= int(b.f);
+
+    o1.s1[1].i = int(u);
+    --o1.s1[1].i;           // NoContraction
+
+    o2.s1[0].f = c.f;
+
+    o3.u = o1.u + uint(o1.s1[1].i);     // NoContraction
+})";
+
+    InitializeCompiler();
+    TestShaderCompile(kVS, 4);
+}
+
+// Test that precise on function parameters and return value works.
+TEST_P(PreciseTest, Functions)
+{
+    constexpr char kVS[] = R"(#version 320 es
+
+uniform float u;
+
+struct S1
+{
+    float f;
+    int i;
+};
+
+precise float f1(S1 s, out int io)
+{
+    float f = s.f;          // f is precise
+    f *= float(s.i);        // NoContraction
+
+    io = s.i;
+    ++io;
+
+    return s.f / f;         // NoContraction
+}
+
+void f2(S1 s, precise out S1 so)
+{
+    float f = s.f;          // f is precise
+    f /= float(s.i);        // NoContraction
+
+    int i = s.i;            // i is precise
+    ++i;                    // NoContraction
+
+    so = S1(f, i);
+}
+
+void main()
+{
+    precise S1 s1;
+    S1 s2;
+
+    int i;
+    float f = f1(s1, i);    // f1's return value being precise doesn't affect f
+
+    f2(s1, s2);             // f2's out parameter being precise doesn't affect s2
+
+    i /= 2;
+    f *= 2.0;
+    s2.f += float(s2.i);
+
+    gl_Position = vec4(s1.f);
+})";
+
+    InitializeCompiler();
+    TestShaderCompile(kVS, 4);
+}
+
+// Test that struct constructors only apply precise to the precise fields.
+TEST_P(PreciseTest, StructConstructor)
+{
+    if (!isDirectSPIRVGen())
+    {
+        // glslang doesn't apply NoContraction through constructor arguments correctly.
+        // https://github.com/KhronosGroup/glslang/issues/2709
+        std::cout << "Test skipped on glslang" << std::endl;
+        return;
+    }
+
+    constexpr char kVS[] = R"(#version 320 es
+
+uniform float u;
+
+struct S1
+{
+    precise float f;
+    int i;
+    precise vec4 v;
+    mat4 m;
+};
+
+void main()
+{
+    float f = u;            // f is precise
+    int i = int(u);
+    vec4 v1 = vec4(u);      // v1 is precise
+    vec4 v2 = vec4(u);
+
+    f += 1.0;               // NoContraction
+
+    i--;
+    i--;
+
+    v1 *= 2.0;              // NoContraction
+    v1 *= 2.0;              // NoContraction
+    v1 *= 2.0;              // NoContraction
+    v1 *= 2.0;              // NoContraction
+
+    v2 /= 3.0;
+    v2 /= 3.0;
+    v2 /= 3.0;
+    v2 /= 3.0;
+    v2 /= 3.0;
+    v2 /= 3.0;
+    v2 /= 3.0;
+    v2 /= 3.0;
+    v2 /= 3.0;
+
+    S1 s = S1(f, i, v1, mat4(v2, v2, v2, v2));
+
+    gl_Position = vec4(s.f, float(s.i), s.v[0], s.m[0][0]);
+})";
+
+    InitializeCompiler();
+    TestShaderCompile(kVS, 5);
+}
+
+// Test that function call arguments become precise when the return value is assigned to a precise
+// object.
+TEST_P(PreciseTest, FunctionParams)
+{
+    if (!isDirectSPIRVGen())
+    {
+        // glslang doesn't apply NoContraction through function arguments correctly.
+        // https://github.com/KhronosGroup/glslang/issues/2710
+        std::cout << "Test skipped on glslang" << std::endl;
+        return;
+    }
+
+    constexpr char kVS[] = R"(#version 320 es
+
+uniform float u;
+
+struct S1
+{
+    precise float f;
+    int i;
+    precise vec4 v;
+    mat4 m;
+};
+
+S1 func(float f, int i, vec4 v, mat4 m)
+{
+    m /= f;
+    --i;
+    v *= m;
+    return S1(f, i, v, m);
+}
+
+void main()
+{
+    float f = u;            // f is precise
+    int i = int(u);         // i is precise
+    vec4 v1 = vec4(u);      // v1 is precise
+    vec4 v2 = vec4(u);      // v2 is precise
+
+    f += 1.0;               // NoContraction
+
+    i--;                    // NoContraction
+    i--;                    // NoContraction
+
+    v1 *= 2.0;              // NoContraction
+    v1 *= 2.0;              // NoContraction
+    v1 *= 2.0;              // NoContraction
+    v1 *= 2.0;              // NoContraction
+
+    v2 /= 3.0;              // NoContraction
+    v2 /= 3.0;              // NoContraction
+    v2 /= 3.0;              // NoContraction
+    v2 /= 3.0;              // NoContraction
+    v2 /= 3.0;              // NoContraction
+    v2 /= 3.0;              // NoContraction
+    v2 /= 3.0;              // NoContraction
+    v2 /= 3.0;              // NoContraction
+    v2 /= 3.0;              // NoContraction
+
+    // s.f and s.v1 are precise, but to calculate them, all parameters of the function must be made
+    // precise.
+    S1 s = func(f, i, v1, mat4(v2, v2, v2, v2));
+
+    gl_Position = vec4(s.f, float(s.i), s.v[0], s.m[0][0]);
+})";
+
+    InitializeCompiler();
+    TestShaderCompile(kVS, 16);
+}
+
+INSTANTIATE_TEST_SUITE_P(, PreciseTest, testing::Bool());
+
+}  // anonymous namespace
diff --git a/src/tests/compiler_tests/RecordConstantPrecision_test.cpp b/src/tests/compiler_tests/RecordConstantPrecision_test.cpp
index 7e5ab8e..4e7dcce 100644
--- a/src/tests/compiler_tests/RecordConstantPrecision_test.cpp
+++ b/src/tests/compiler_tests/RecordConstantPrecision_test.cpp
@@ -20,75 +20,132 @@
     RecordConstantPrecisionTest() : MatchOutputCodeTest(GL_FRAGMENT_SHADER, 0, SH_ESSL_OUTPUT) {}
 };
 
-// The constant cannot be folded if its precision is higher than the other operands, since it
-// increases the precision of the consuming expression.
+// The constant's precision must be specified if its precision is higher than the other operands,
+// since it increases the precision of the consuming expression.
 TEST_F(RecordConstantPrecisionTest, HigherPrecisionConstantAsParameter)
 {
-    const std::string &shaderString =
-        "uniform mediump float u;"
-        "void main()\n"
-        "{\n"
-        "    const highp float a = 4096.5;\n"
-        "    mediump float b = fract(a + u);\n"
-        "    gl_FragColor = vec4(b);\n"
-        "}\n";
+    const std::string &shaderString = R"(
+uniform mediump float u;
+void main()
+{
+    const highp float a = 4096.5;
+    mediump float b = fract(a + u);
+    gl_FragColor = vec4(b);
+})";
     compile(shaderString);
     ASSERT_TRUE(foundInCode("const highp float s"));
     ASSERT_FALSE(foundInCode("fract(4096.5"));
     ASSERT_FALSE(foundInCode("fract((4096.5"));
 }
 
-// The constant can be folded if its precision is equal to the other operands, as it does not
-// increase the precision of the consuming expression.
+// The constant's precision does not need to be specified if its precision is equal to the other
+// operands, as it does not increase the precision of the consuming expression.  For simplicity
+// however, the constant's precision is specified anyway.
 TEST_F(RecordConstantPrecisionTest, EqualPrecisionConstantAsParameter)
 {
-    const std::string &shaderString =
-        "uniform mediump float u;"
-        "void main()\n"
-        "{\n"
-        "    const mediump float a = 4096.5;\n"
-        "    mediump float b = fract(a + u);\n"
-        "    gl_FragColor = vec4(b);\n"
-        "}\n";
+    const std::string &shaderString = R"(
+uniform mediump float u;
+void main()
+{
+    const mediump float a = 4096.5;
+    mediump float b = fract(a + u);
+    gl_FragColor = vec4(b);
+})";
     compile(shaderString);
-    ASSERT_FALSE(foundInCode("const mediump float s"));
-    ASSERT_TRUE(foundInCode("fract((4096.5"));
+    ASSERT_TRUE(foundInCode("const mediump float s"));
+    ASSERT_FALSE(foundInCode("fract((4096.5"));
 }
 
-// The constant cannot be folded if its precision is higher than the other operands, since it
-// increases the precision of the consuming expression. This applies also when the constant is
-// part of a constant expression that can be folded.
+// The constant's precision must be specified if its precision is higher than the other operands,
+// since it increases the precision of the consuming expression.  This applies also when the
+// constant is part of a constant expression that can be folded.
 TEST_F(RecordConstantPrecisionTest, FoldedBinaryConstantPrecisionIsHigher)
 {
-    const std::string &shaderString =
-        "uniform mediump float u;"
-        "void main()\n"
-        "{\n"
-        "    const highp float a = 4095.5;\n"
-        "    mediump float b = fract((a + 1.0) + u);\n"
-        "    gl_FragColor = vec4(b);\n"
-        "}\n";
+    const std::string &shaderString = R"(
+uniform mediump float u;
+void main()
+{
+    const highp float a = 4095.5;
+    mediump float b = fract((a + 1.0) + u);
+    gl_FragColor = vec4(b);
+})";
     compile(shaderString);
     ASSERT_TRUE(foundInCode("const highp float s"));
     ASSERT_FALSE(foundInCode("fract(4096.5"));
     ASSERT_FALSE(foundInCode("fract((4096.5"));
 }
 
-// The constant cannot be folded if its precision is higher than the other operands, since it
-// increases the precision of the consuming expression. This applies also when the constant is
-// part of a constant expression that can be folded.
+// The constant's precision must be specified if its precision is higher than the other operands,
+// since it increases the precision of the consuming expression.  This applies also when the
+// constant is part of a constant expression that can be folded.
 TEST_F(RecordConstantPrecisionTest, FoldedUnaryConstantPrecisionIsHigher)
 {
-    const std::string &shaderString =
-        "uniform mediump float u;"
-        "void main()\n"
-        "{\n"
-        "    const highp float a = 0.5;\n"
-        "    mediump float b = sin(fract(a) + u);\n"
-        "    gl_FragColor = vec4(b);\n"
-        "}\n";
+    const std::string &shaderString = R"(
+uniform mediump float u;
+void main()
+{
+    const highp float a = 0.5;
+    mediump float b = sin(fract(a) + u);
+    gl_FragColor = vec4(b);
+})";
     compile(shaderString);
     ASSERT_TRUE(foundInCode("const highp float s"));
     ASSERT_FALSE(foundInCode("sin(0.5"));
     ASSERT_FALSE(foundInCode("sin((0.5"));
 }
+
+// The constant's precision must be specified if its precision is higher than the other operands,
+// since it increases the precision of the consuming expression.  This applies also when the
+// constant is part of a constructor expression.  Note that lowp constants never need their
+// precision specified.
+TEST_F(RecordConstantPrecisionTest, HigherPrecisionConstantInConstructor)
+{
+    const std::string &shaderString = R"(
+uniform mediump float u;
+void main()
+{
+    const highp float a = 4096.5;
+    const lowp float b = 1.0;
+    lowp vec4 result = vec4(b, a, b, u);
+    gl_FragColor = result;
+})";
+    compile(shaderString);
+    ASSERT_TRUE(foundInCode("const highp float s"));
+    ASSERT_FALSE(foundInCode("const lowp float s"));
+    ASSERT_TRUE(foundInCode("vec4(1.0, s"));
+}
+
+// The constant's precision does not need to be specified if its used to initialize a variable.
+TEST_F(RecordConstantPrecisionTest, HigherPrecisionConstantInAssignment)
+{
+    const std::string &shaderString = R"(
+uniform mediump float u;
+void main()
+{
+    const highp float a = 4096.5;
+    mediump float b = a;
+    mediump float c;
+    c = a;
+    gl_FragColor = vec4(b, b, c, c);
+})";
+    compile(shaderString);
+    ASSERT_FALSE(foundInCode("const highp float s"));
+    ASSERT_TRUE(foundInCode("b = 4096.5"));
+    ASSERT_TRUE(foundInCode("c = 4096.5"));
+}
+
+// The constant's precision does not need to be specified if its used as an index.
+TEST_F(RecordConstantPrecisionTest, HigherPrecisionConstantInIndex)
+{
+    const std::string &shaderString = R"(
+uniform mediump float u;
+void main()
+{
+    const highp int a = 33000;
+    mediump float b[34000];
+    gl_FragColor = vec4(b[a]);
+})";
+    compile(shaderString);
+    ASSERT_FALSE(foundInCode("const highp int s"));
+    ASSERT_TRUE(foundInCode("b[33000]"));
+}
diff --git a/src/tests/compiler_tests/ScalarizeVecAndMatConstructorArgs_test.cpp b/src/tests/compiler_tests/ScalarizeVecAndMatConstructorArgs_test.cpp
index c51e482..80b0582 100644
--- a/src/tests/compiler_tests/ScalarizeVecAndMatConstructorArgs_test.cpp
+++ b/src/tests/compiler_tests/ScalarizeVecAndMatConstructorArgs_test.cpp
@@ -88,7 +88,7 @@
         })";
     compile(shaderString);
 
-    std::vector<const char *> expectedStrings = {"_uv[0] += 1.0", "-_uv[0]"};
+    std::vector<const char *> expectedStrings = {"_uv[0] += ", "-_uv[0]"};
 
     EXPECT_TRUE(foundInCodeInOrder(expectedStrings));
 }
@@ -116,4 +116,21 @@
     EXPECT_TRUE(foundInCodeInOrder(expectedStrings));
 }
 
+// Verifies that constructors without precision don't cause issues.
+TEST_F(ScalarizeVecAndMatConstructorArgsTest, ConstructorWithoutPrecision)
+{
+    const std::string shaderString =
+        R"(
+        precision mediump float;
+
+        uniform float u;
+
+        void main()
+        {
+            mat4 m = mat4(u);
+            mat2(0, bvec3(m));
+        })";
+    compile(shaderString);
+}
+
 }  // anonymous namespace
diff --git a/src/tests/compiler_tests/ShCompile_test.cpp b/src/tests/compiler_tests/ShCompile_test.cpp
index a4efabc..d10927c 100644
--- a/src/tests/compiler_tests/ShCompile_test.cpp
+++ b/src/tests/compiler_tests/ShCompile_test.cpp
@@ -227,6 +227,9 @@
     }
 }
 
+// Desktop GLSL support is not enabled on Android
+#if !defined(ANGLE_PLATFORM_ANDROID)
+
 // For testing Desktop GL Shaders
 class ShCompileDesktopGLTest : public ShCompileTest
 {
@@ -364,3 +367,5 @@
 
     testCompile(shaderStrings, 1, true);
 }
+
+#endif  // !defined(ANGLE_PLATFORM_ANDROID)
diff --git a/src/tests/compiler_tests/ShaderImage_test.cpp b/src/tests/compiler_tests/ShaderImage_test.cpp
index 321b7fe..993b59e 100644
--- a/src/tests/compiler_tests/ShaderImage_test.cpp
+++ b/src/tests/compiler_tests/ShaderImage_test.cpp
@@ -190,14 +190,14 @@
 
     // imageLoad call with image2D passed
     std::string mangledName2D = "imageLoad(";
-    mangledName2D += StaticType::GetBasic<EbtImage2D>()->getMangledName();
-    mangledName2D += StaticType::GetBasic<EbtInt, 2>()->getMangledName();
+    mangledName2D += StaticType::GetBasic<EbtImage2D, EbpUndefined>()->getMangledName();
+    mangledName2D += StaticType::GetBasic<EbtInt, EbpUndefined, 2>()->getMangledName();
     CheckImageLoadCall(mASTRoot, mangledName2D.c_str(), EbtImage2D, 2);
 
     // imageLoad call with image3D passed
     std::string mangledName3D = "imageLoad(";
-    mangledName3D += StaticType::GetBasic<EbtIImage3D>()->getMangledName();
-    mangledName3D += StaticType::GetBasic<EbtInt, 3>()->getMangledName();
+    mangledName3D += StaticType::GetBasic<EbtIImage3D, EbpUndefined>()->getMangledName();
+    mangledName3D += StaticType::GetBasic<EbtInt, EbpUndefined, 3>()->getMangledName();
     CheckImageLoadCall(mASTRoot, mangledName3D.c_str(), EbtIImage3D, 3);
 }
 
@@ -220,16 +220,16 @@
 
     // imageStore call with image2D
     std::string mangledName2D = "imageStore(";
-    mangledName2D += StaticType::GetBasic<EbtImage2D>()->getMangledName();
-    mangledName2D += StaticType::GetBasic<EbtInt, 2>()->getMangledName();
-    mangledName2D += StaticType::GetBasic<EbtFloat, 4>()->getMangledName();
+    mangledName2D += StaticType::GetBasic<EbtImage2D, EbpUndefined>()->getMangledName();
+    mangledName2D += StaticType::GetBasic<EbtInt, EbpUndefined, 2>()->getMangledName();
+    mangledName2D += StaticType::GetBasic<EbtFloat, EbpUndefined, 4>()->getMangledName();
     CheckImageStoreCall(mASTRoot, mangledName2D.c_str(), EbtImage2D, 2, EbtFloat, 4);
 
     // imageStore call with image2DArray
     std::string mangledName2DArray = "imageStore(";
-    mangledName2DArray += StaticType::GetBasic<EbtUImage2DArray>()->getMangledName();
-    mangledName2DArray += StaticType::GetBasic<EbtInt, 3>()->getMangledName();
-    mangledName2DArray += StaticType::GetBasic<EbtUInt, 4>()->getMangledName();
+    mangledName2DArray += StaticType::GetBasic<EbtUImage2DArray, EbpUndefined>()->getMangledName();
+    mangledName2DArray += StaticType::GetBasic<EbtInt, EbpUndefined, 3>()->getMangledName();
+    mangledName2DArray += StaticType::GetBasic<EbtUInt, EbpUndefined, 4>()->getMangledName();
     CheckImageStoreCall(mASTRoot, mangledName2DArray.c_str(), EbtUImage2DArray, 3, EbtUInt, 4);
 }
 
diff --git a/src/tests/compiler_tests/VectorizeVectorScalarArithmetic_test.cpp b/src/tests/compiler_tests/VectorizeVectorScalarArithmetic_test.cpp
deleted file mode 100644
index 5f7a7c6..0000000
--- a/src/tests/compiler_tests/VectorizeVectorScalarArithmetic_test.cpp
+++ /dev/null
@@ -1,50 +0,0 @@
-//
-// Copyright 2017 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.
-//
-// VectorizeVectorScalarArithmetic_test.cpp:
-//  Tests shader compilation with SH_REWRITE_VECTOR_SCALAR_ARITHMETIC workaround on.
-
-#include "GLSLANG/ShaderLang.h"
-#include "angle_gl.h"
-#include "gtest/gtest.h"
-#include "tests/test_utils/ShaderCompileTreeTest.h"
-
-using namespace sh;
-
-class VectorizeVectorScalarArithmeticTest : public ShaderCompileTreeTest
-{
-  public:
-    VectorizeVectorScalarArithmeticTest() : ShaderCompileTreeTest()
-    {
-        mExtraCompileOptions = SH_REWRITE_VECTOR_SCALAR_ARITHMETIC;
-    }
-
-  protected:
-    ::GLenum getShaderType() const override { return GL_FRAGMENT_SHADER; }
-    ShShaderSpec getShaderSpec() const override { return SH_GLES3_1_SPEC; }
-};
-
-// Test that two ops that generate statements in the parent block inside the same statement don't
-// trigger an assert.
-TEST_F(VectorizeVectorScalarArithmeticTest, TwoMutatedOpsWithSideEffectsInsideSameStatement)
-{
-    const std::string &shaderString =
-        R"(#version 300 es
-        precision highp float;
-
-        out vec4 res;
-        uniform float uf;
-
-        void main()
-        {
-            res = vec4(0.0);
-            float f = uf;
-            res += f *= f, res += f *= f;
-        })";
-    if (!compile(shaderString))
-    {
-        FAIL() << "Shader compilation failed, expecting success:\n" << mInfoLog;
-    }
-}
diff --git a/src/tests/deqp_support/README.md b/src/tests/deqp_support/README.md
index 555534a..8248c71 100644
--- a/src/tests/deqp_support/README.md
+++ b/src/tests/deqp_support/README.md
@@ -35,6 +35,7 @@
     QUADROP400
     SWIFTSHADER
     PREROTATION PREROTATION90 PREROTATION180 PREROTATION270
+    SPIRVGEN
 
 `TEST_NAME` can be a specific test name, or set of test names using `'*'` as wildcard anywhere in
 the name.  Examples:
@@ -57,3 +58,6 @@
 
     // Failing when emulated pre-rotation is enabled with 270 degree angle:
     1234 PREROTATION270 : dEQP-GLES3.*blit* = FAIL
+
+    // Crashing when generating SPIR-V directly from the translator
+    1234 SPIRVGEN : dEQP.GLES2/functional_shaders_texture_functions_vertex_texture2dprojlod_vec4 = SKIP
diff --git a/src/tests/deqp_support/angle_deqp_gtest.cpp b/src/tests/deqp_support/angle_deqp_gtest.cpp
index 36b4c36..0116226 100644
--- a/src/tests/deqp_support/angle_deqp_gtest.cpp
+++ b/src/tests/deqp_support/angle_deqp_gtest.cpp
@@ -112,16 +112,17 @@
     {"angle-vulkan", GPUTestConfig::kAPIVulkan},
 };
 
-constexpr char kdEQPEGLString[]    = "--deqp-egl-display-type=";
-constexpr char kANGLEEGLString[]   = "--use-angle=";
-constexpr char kANGLEPreRotation[] = "--emulated-pre-rotation=";
-constexpr char kdEQPCaseString[]   = "--deqp-case=";
-constexpr char kVerboseString[]    = "--verbose";
-constexpr char kRenderDocString[]  = "--renderdoc";
+constexpr char kdEQPEGLString[]       = "--deqp-egl-display-type=";
+constexpr char kANGLEEGLString[]      = "--use-angle=";
+constexpr char kANGLEPreRotation[]    = "--emulated-pre-rotation=";
+constexpr char kANGLEDirectSPIRVGen[] = "--direct-spirv-gen";
+constexpr char kdEQPCaseString[]      = "--deqp-case=";
+constexpr char kVerboseString[]       = "--verbose";
+constexpr char kRenderDocString[]     = "--renderdoc";
 
 std::array<char, 500> gCaseStringBuffer;
 
-// For angle_deqp_gles3*_rotateN_tests, default gPreRotation to N.
+// For angle_deqp_gles3*_rotateN_tests, default gOptions.preRotation to N.
 #if defined(ANGLE_DEQP_GLES3_ROTATE90_TESTS) || defined(ANGLE_DEQP_GLES31_ROTATE90_TESTS)
 constexpr uint32_t kDefaultPreRotation = 90;
 #elif defined(ANGLE_DEQP_GLES3_ROTATE180_TESTS) || defined(ANGLE_DEQP_GLES31_ROTATE180_TESTS)
@@ -133,9 +134,11 @@
 #endif
 
 const APIInfo *gInitAPI = nullptr;
-uint32_t gPreRotation   = kDefaultPreRotation;
-
-bool gEnableRenderDocCapture = false;
+dEQPOptions gOptions    = {
+    kDefaultPreRotation,  // preRotation
+    false,                // enableDirectSPIRVGen
+    false,                // enableRenderDocCapture
+};
 
 constexpr const char gdEQPEGLConfigNameString[] = "--deqp-gl-config-name=";
 constexpr const char gdEQPLogImagesString[]     = "--deqp-log-images=";
@@ -282,7 +285,8 @@
         api = gInitAPI->second;
     }
 
-    GPUTestConfig testConfig = GPUTestConfig(api, gPreRotation);
+    GPUTestConfig testConfig =
+        GPUTestConfig(api, gOptions.preRotation, gOptions.enableDirectSPIRVGen);
 
 #if !defined(ANGLE_PLATFORM_ANDROID)
     // Note: These prints mess up parsing of test list when running on Android.
@@ -375,14 +379,16 @@
         // crashed tests we track how many tests we "tried" to run.
         sTestCount++;
 
-        if (caseInfo.mExpectation == GPUTestExpectationsParser::kGpuTestSkip ||
-            caseInfo.mExpectation == GPUTestExpectationsParser::kGpuTestTimeout)
+        if (caseInfo.mExpectation == GPUTestExpectationsParser::kGpuTestSkip)
         {
             sSkippedTestCount++;
             std::cout << "Test skipped.\n";
             return;
         }
 
+        TestSuite *testSuite = TestSuite::GetInstance();
+        testSuite->maybeUpdateTestTimeout(caseInfo.mExpectation);
+
         gExpectError          = (caseInfo.mExpectation != GPUTestExpectationsParser::kGpuTestPass);
         dEQPTestResult result = deqp_libtester_run(caseInfo.mDEQPName.c_str());
 
@@ -559,8 +565,7 @@
 
     // Init the platform.
     if (!deqp_libtester_init_platform(static_cast<int>(argv.size()), argv.data(),
-                                      reinterpret_cast<void *>(&HandlePlatformError), gPreRotation,
-                                      gEnableRenderDocCapture))
+                                      reinterpret_cast<void *>(&HandlePlatformError), gOptions))
     {
         std::cout << "Aborting test due to dEQP initialization error." << std::endl;
         exit(1);
@@ -683,7 +688,7 @@
         exit(1);
     }
 
-    gPreRotation = preRotation;
+    gOptions.preRotation = preRotation;
 }
 
 void HandleEGLConfigName(const char *configNameString)
@@ -745,6 +750,10 @@
         {
             HandlePreRotation(argv[argIndex] + strlen(kANGLEPreRotation));
         }
+        else if (strncmp(argv[argIndex], kANGLEDirectSPIRVGen, strlen(kANGLEDirectSPIRVGen)) == 0)
+        {
+            gOptions.enableDirectSPIRVGen = true;
+        }
         else if (strncmp(argv[argIndex], gdEQPEGLConfigNameString,
                          strlen(gdEQPEGLConfigNameString)) == 0)
         {
@@ -765,7 +774,7 @@
         }
         else if (strncmp(argv[argIndex], kRenderDocString, strlen(kRenderDocString)) == 0)
         {
-            gEnableRenderDocCapture = true;
+            gOptions.enableRenderDocCapture = true;
         }
         argIndex++;
     }
@@ -775,11 +784,17 @@
     {
         api = gInitAPI->second;
     }
-    if (gPreRotation != 0 && api != GPUTestConfig::kAPIVulkan &&
+    if (gOptions.preRotation != 0 && api != GPUTestConfig::kAPIVulkan &&
         api != GPUTestConfig::kAPISwiftShader)
     {
         std::cout << "PreRotation is only supported on Vulkan" << std::endl;
         exit(1);
     }
+    if (gOptions.enableDirectSPIRVGen != 0 && api != GPUTestConfig::kAPIVulkan &&
+        api != GPUTestConfig::kAPISwiftShader)
+    {
+        std::cout << "SPIR-V generation is only relevant to Vulkan" << std::endl;
+        exit(1);
+    }
 }
 }  // namespace angle
diff --git a/src/tests/deqp_support/angle_deqp_libtester.h b/src/tests/deqp_support/angle_deqp_libtester.h
index 02e1e79..39f588e 100644
--- a/src/tests/deqp_support/angle_deqp_libtester.h
+++ b/src/tests/deqp_support/angle_deqp_libtester.h
@@ -37,13 +37,19 @@
     Exception,
 };
 
+struct dEQPOptions
+{
+    uint32_t preRotation;
+    bool enableDirectSPIRVGen;  // TODO: remove when no longer needed.  http://anglebug.com/6210
+    bool enableRenderDocCapture;
+};
+
 // Exported to the tester app.
 ANGLE_LIBTESTER_EXPORT int deqp_libtester_main(int argc, const char *argv[]);
 ANGLE_LIBTESTER_EXPORT bool deqp_libtester_init_platform(int argc,
                                                          const char *argv[],
                                                          void *logErrorFunc,
-                                                         uint32_t preRotation,
-                                                         bool enableRenderDocCapture);
+                                                         const dEQPOptions &options);
 ANGLE_LIBTESTER_EXPORT void deqp_libtester_shutdown_platform();
 ANGLE_LIBTESTER_EXPORT dEQPTestResult deqp_libtester_run(const char *caseName);
 
diff --git a/src/tests/deqp_support/angle_deqp_libtester_main.cpp b/src/tests/deqp_support/angle_deqp_libtester_main.cpp
index a43f3ef..742ab3d 100644
--- a/src/tests/deqp_support/angle_deqp_libtester_main.cpp
+++ b/src/tests/deqp_support/angle_deqp_libtester_main.cpp
@@ -14,6 +14,7 @@
 #include "deMath.h"
 #include "deUniquePtr.hpp"
 #include "platform/PlatformMethods.h"
+#include "tcuANGLEPlatform.h"
 #include "tcuApp.hpp"
 #include "tcuCommandLine.hpp"
 #include "tcuDefs.hpp"
@@ -23,8 +24,6 @@
 #include "tcuTestLog.hpp"
 #include "util/OSWindow.h"
 
-tcu::Platform *CreateANGLEPlatform(angle::LogErrorFunc logErrorFunc, uint32_t preRotation);
-
 namespace
 {
 
@@ -51,8 +50,7 @@
 ANGLE_LIBTESTER_EXPORT bool deqp_libtester_init_platform(int argc,
                                                          const char *argv[],
                                                          void *logErrorFunc,
-                                                         uint32_t preRotation,
-                                                         bool enableRenderDocCapture)
+                                                         const dEQPOptions &options)
 {
     try
     {
@@ -60,8 +58,8 @@
         // Set stdout to line-buffered mode (will be fully buffered by default if stdout is pipe).
         setvbuf(stdout, DE_NULL, _IOLBF, 4 * 1024);
 #endif
-        g_platform =
-            CreateANGLEPlatform(reinterpret_cast<angle::LogErrorFunc>(logErrorFunc), preRotation);
+        g_platform = CreateANGLEPlatform(reinterpret_cast<angle::LogErrorFunc>(logErrorFunc),
+                                         options.preRotation, options.enableDirectSPIRVGen);
 
         if (!deSetRoundingMode(DE_ROUNDINGMODE_TO_NEAREST_EVEN))
         {
@@ -82,7 +80,8 @@
         g_log     = new tcu::TestLog(GetLogFileName(deqpDataDir).c_str(), g_cmdLine->getLogFlags());
         g_testCtx = new tcu::TestContext(*g_platform, *g_archive, *g_log, *g_cmdLine, DE_NULL);
         g_root    = new tcu::TestPackageRoot(*g_testCtx, tcu::TestPackageRegistry::getSingleton());
-        g_executor = new tcu::RandomOrderExecutor(*g_root, *g_testCtx, enableRenderDocCapture);
+        g_executor =
+            new tcu::RandomOrderExecutor(*g_root, *g_testCtx, options.enableRenderDocCapture);
     }
     catch (const std::exception &e)
     {
@@ -96,7 +95,7 @@
 // Exported to the tester app.
 ANGLE_LIBTESTER_EXPORT int deqp_libtester_main(int argc, const char *argv[])
 {
-    if (!deqp_libtester_init_platform(argc, argv, nullptr, 0, false))
+    if (!deqp_libtester_init_platform(argc, argv, nullptr, {}))
     {
         tcu::die("Could not initialize the dEQP platform");
     }
diff --git a/src/tests/deqp_support/deqp_egl_test_expectations.txt b/src/tests/deqp_support/deqp_egl_test_expectations.txt
index f4c67a1..af922ee 100644
--- a/src/tests/deqp_support/deqp_egl_test_expectations.txt
+++ b/src/tests/deqp_support/deqp_egl_test_expectations.txt
@@ -119,8 +119,7 @@
 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
-5753 LINUX VULKAN NVIDIA : dEQP-EGL.functional.resize.surface_size.grow = FAIL
-5884 LINUX VULKAN NVIDIA : dEQP-EGL.functional.resize.surface_size.stretch_width = FAIL
+5753 LINUX VULKAN : dEQP-EGL.functional.resize.surface_size.* = FAIL
 
 // Mac failures
 2546 MAC : dEQP-EGL.functional.native_color_mapping.native_window.* = FAIL
@@ -171,6 +170,16 @@
 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
+6277 ANDROID VULKAN : dEQP-EGL.functional.image.api.create_image_gles2_android_native_rgb8 = SKIP
+6277 ANDROID VULKAN : dEQP-EGL.functional.image.create.gles2_android_native_rgb8_read_pixels = SKIP
+6277 ANDROID VULKAN : dEQP-EGL.functional.image.create.gles2_android_native_rgb8_texture = SKIP
+6277 ANDROID VULKAN : dEQP-EGL.functional.image.create.gles3_android_native_array_rgb565_texture_array = SKIP
+6277 ANDROID VULKAN : dEQP-EGL.functional.image.create.gles3_android_native_array_rgb8_texture_array = SKIP
+6277 ANDROID VULKAN : dEQP-EGL.functional.image.create.gles3_android_native_array_rgba8_texture_array = SKIP
+6277 ANDROID VULKAN : dEQP-EGL.functional.image.modify.android_native_rgb8_renderbuffer_clear_color = SKIP
+6277 ANDROID VULKAN : dEQP-EGL.functional.image.modify.android_native_rgb8_tex_subimage_rgb8 = SKIP
+6277 ANDROID VULKAN : dEQP-EGL.functional.image.render_multiple_contexts.gles2_android_native_rgb8_read_pixels = SKIP
+6277 ANDROID VULKAN : dEQP-EGL.functional.image.render_multiple_contexts.gles2_android_native_rgb8_texture = SKIP
 
 // Robustness failures on multiple platforms
 3711 : dEQP-EGL.functional.robustness.reset_context.shaders.out_of_bounds.reset_status.reads.* = FAIL
diff --git a/src/tests/deqp_support/deqp_gles2_test_expectations.txt b/src/tests/deqp_support/deqp_gles2_test_expectations.txt
index 3bbb869..2d27549 100644
--- a/src/tests/deqp_support/deqp_gles2_test_expectations.txt
+++ b/src/tests/deqp_support/deqp_gles2_test_expectations.txt
@@ -215,6 +215,9 @@
 5172 MAC OPENGL AMD : dEQP-GLES2.functional.shaders.fragdata.* = FAIL
 5172 MAC OPENGL AMD : dEQP-GLES2.functional.fragment_ops.blend.equation_src_func_dst_func.* = FAIL
 
+// Mac AMD Metal specific
+6223 MAC METAL AMD : dEQP-GLES2.functional.shaders.discard.basic_always = 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
@@ -225,58 +228,6 @@
 //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
 
-// Android Pixel 2 clear failures with Vulkan backend
-161540999 VULKAN PIXEL2ORXL : dEQP-GLES2.functional.color_clear.masked_rgb = FAIL
-161540999 VULKAN PIXEL2ORXL : dEQP-GLES2.functional.color_clear.masked_rgba = FAIL
-161540999 VULKAN PIXEL2ORXL : dEQP-GLES2.functional.depth_stencil_clear.depth_stencil_masked = FAIL
-161540999 VULKAN PIXEL2ORXL : dEQP-GLES2.functional.fragment_ops.interaction.basic_shader.5 = FAIL
-161540999 VULKAN PIXEL2ORXL : dEQP-GLES2.functional.fragment_ops.interaction.basic_shader.7 = FAIL
-161540999 VULKAN PIXEL2ORXL : dEQP-GLES2.functional.fragment_ops.interaction.basic_shader.23 = FAIL
-161540999 VULKAN PIXEL2ORXL : dEQP-GLES2.functional.fragment_ops.interaction.basic_shader.54 = FAIL
-161540999 VULKAN PIXEL2ORXL : dEQP-GLES2.functional.fragment_ops.interaction.basic_shader.57 = FAIL
-161540999 VULKAN PIXEL2ORXL : dEQP-GLES2.functional.fragment_ops.interaction.basic_shader.67 = FAIL
-161540999 VULKAN PIXEL2ORXL : dEQP-GLES2.functional.fragment_ops.interaction.basic_shader.71 = FAIL
-161540999 VULKAN PIXEL2ORXL : dEQP-GLES2.functional.fragment_ops.interaction.basic_shader.83 = FAIL
-161540999 VULKAN PIXEL2ORXL : dEQP-GLES2.functional.fragment_ops.random.4 = FAIL
-161540999 VULKAN PIXEL2ORXL : dEQP-GLES2.functional.fragment_ops.random.7 = FAIL
-161540999 VULKAN PIXEL2ORXL : dEQP-GLES2.functional.fragment_ops.random.11 = FAIL
-161540999 VULKAN PIXEL2ORXL : dEQP-GLES2.functional.fragment_ops.random.13 = FAIL
-161540999 VULKAN PIXEL2ORXL : dEQP-GLES2.functional.fragment_ops.random.14 = FAIL
-161540999 VULKAN PIXEL2ORXL : dEQP-GLES2.functional.fragment_ops.random.16 = FAIL
-161540999 VULKAN PIXEL2ORXL : dEQP-GLES2.functional.fragment_ops.random.19 = FAIL
-161540999 VULKAN PIXEL2ORXL : dEQP-GLES2.functional.fragment_ops.random.20 = FAIL
-161540999 VULKAN PIXEL2ORXL : dEQP-GLES2.functional.fragment_ops.random.24 = FAIL
-161540999 VULKAN PIXEL2ORXL : dEQP-GLES2.functional.fragment_ops.random.30 = FAIL
-161540999 VULKAN PIXEL2ORXL : dEQP-GLES2.functional.fragment_ops.random.34 = FAIL
-161540999 VULKAN PIXEL2ORXL : dEQP-GLES2.functional.fragment_ops.random.35 = FAIL
-161540999 VULKAN PIXEL2ORXL : dEQP-GLES2.functional.fragment_ops.random.37 = FAIL
-161540999 VULKAN PIXEL2ORXL : dEQP-GLES2.functional.fragment_ops.random.38 = FAIL
-161540999 VULKAN PIXEL2ORXL : dEQP-GLES2.functional.fragment_ops.random.42 = FAIL
-161540999 VULKAN PIXEL2ORXL : dEQP-GLES2.functional.fragment_ops.random.44 = FAIL
-161540999 VULKAN PIXEL2ORXL : dEQP-GLES2.functional.fragment_ops.random.46 = FAIL
-161540999 VULKAN PIXEL2ORXL : dEQP-GLES2.functional.fragment_ops.random.47 = FAIL
-161540999 VULKAN PIXEL2ORXL : dEQP-GLES2.functional.fragment_ops.random.48 = FAIL
-161540999 VULKAN PIXEL2ORXL : dEQP-GLES2.functional.fragment_ops.random.55 = FAIL
-161540999 VULKAN PIXEL2ORXL : dEQP-GLES2.functional.fragment_ops.random.58 = FAIL
-161540999 VULKAN PIXEL2ORXL : dEQP-GLES2.functional.fragment_ops.random.60 = FAIL
-161540999 VULKAN PIXEL2ORXL : dEQP-GLES2.functional.fragment_ops.random.61 = FAIL
-161540999 VULKAN PIXEL2ORXL : dEQP-GLES2.functional.fragment_ops.random.64 = FAIL
-161540999 VULKAN PIXEL2ORXL : dEQP-GLES2.functional.fragment_ops.random.65 = FAIL
-161540999 VULKAN PIXEL2ORXL : dEQP-GLES2.functional.fragment_ops.random.66 = FAIL
-161540999 VULKAN PIXEL2ORXL : dEQP-GLES2.functional.fragment_ops.random.67 = FAIL
-161540999 VULKAN PIXEL2ORXL : dEQP-GLES2.functional.fragment_ops.random.68 = FAIL
-161540999 VULKAN PIXEL2ORXL : dEQP-GLES2.functional.fragment_ops.random.69 = FAIL
-161540999 VULKAN PIXEL2ORXL : dEQP-GLES2.functional.fragment_ops.random.71 = FAIL
-161540999 VULKAN PIXEL2ORXL : dEQP-GLES2.functional.fragment_ops.random.74 = FAIL
-161540999 VULKAN PIXEL2ORXL : dEQP-GLES2.functional.fragment_ops.random.79 = FAIL
-161540999 VULKAN PIXEL2ORXL : dEQP-GLES2.functional.fragment_ops.random.80 = FAIL
-161540999 VULKAN PIXEL2ORXL : dEQP-GLES2.functional.fragment_ops.random.82 = FAIL
-161540999 VULKAN PIXEL2ORXL : dEQP-GLES2.functional.fragment_ops.random.83 = FAIL
-161540999 VULKAN PIXEL2ORXL : dEQP-GLES2.functional.fragment_ops.random.86 = FAIL
-161540999 VULKAN PIXEL2ORXL : dEQP-GLES2.functional.fragment_ops.random.87 = FAIL
-161540999 VULKAN PIXEL2ORXL : dEQP-GLES2.functional.fragment_ops.random.94 = FAIL
-161540999 VULKAN PIXEL2ORXL : dEQP-GLES2.functional.fragment_ops.random.97 = FAIL
-
 // Nexus 5x failures
 3309 NEXUS5X GLES : dEQP-GLES2.functional.attribute_location.bind_aliasing.cond* = FAIL
 3716 NEXUS5X GLES : dEQP-GLES2.functional.fbo.completeness.renderable.texture.depth.depth_component_unsigned_int = FAIL
@@ -330,19 +281,6 @@
 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 PIXEL2ORXL : dEQP-GLES2.functional.shaders.builtin_variable.fragcoord_w = FAIL
-
-// Failing on the Pixel 2 due to Qualcomm Vulkan driver
-4344 VULKAN PIXEL2ORXL : dEQP-GLES2.functional.fragment_ops.interaction.basic_shader.1 = FAIL
-4344 VULKAN PIXEL2ORXL : dEQP-GLES2.functional.fragment_ops.interaction.basic_shader.30 = FAIL
-4344 VULKAN PIXEL2ORXL : dEQP-GLES2.functional.fragment_ops.interaction.basic_shader.35 = FAIL
-4344 VULKAN PIXEL2ORXL : dEQP-GLES2.functional.fragment_ops.interaction.basic_shader.38 = FAIL
-4344 VULKAN PIXEL2ORXL : dEQP-GLES2.functional.fragment_ops.interaction.basic_shader.60 = FAIL
-4344 VULKAN PIXEL2ORXL : dEQP-GLES2.functional.fragment_ops.interaction.basic_shader.62 = FAIL
-4344 VULKAN PIXEL2ORXL : dEQP-GLES2.functional.fragment_ops.random.62 = FAIL
-4344 VULKAN PIXEL2ORXL : dEQP-GLES2.functional.fragment_ops.random.78 = FAIL
-
 // These tests also fail on AMD windows driver as it is not allowed to use emulation due to errors.
 3243 VULKAN WIN AMD : dEQP-GLES2.functional.shaders.texture_functions.vertex.texturecubelod = FAIL
 3243 VULKAN WIN AMD : dEQP-GLES2.functional.texture.mipmap.cube.basic.linear_nearest = FAIL
diff --git a/src/tests/deqp_support/deqp_gles31_rotate_test_expectations.txt b/src/tests/deqp_support/deqp_gles31_rotate_test_expectations.txt
index 920fd62..5e35d99 100644
--- a/src/tests/deqp_support/deqp_gles31_rotate_test_expectations.txt
+++ b/src/tests/deqp_support/deqp_gles31_rotate_test_expectations.txt
@@ -11,3 +11,7 @@
 3589 VULKAN : dEQP-GLES31.functional.shaders.multisample_interpolation.interpolate_at_offset.centroid_qualifier.default_framebuffer = FAIL
 3589 VULKAN : dEQP-GLES31.functional.shaders.multisample_interpolation.interpolate_at_offset.sample_qualifier.default_framebuffer = FAIL
 3589 VULKAN : dEQP-GLES31.functional.shaders.multisample_interpolation.interpolate_at_offset.array_element.default_framebuffer = FAIL
+
+3576 VULKAN : dEQP-GLES31.functional.primitive_bounding_box.lines.global_state.vertex_fragment.default_framebuffer_bbox_equal = FAIL
+3576 VULKAN : dEQP-GLES31.functional.primitive_bounding_box.lines.global_state.vertex_fragment.default_framebuffer_bbox_larger = FAIL
+3576 VULKAN : dEQP-GLES31.functional.primitive_bounding_box.lines.global_state.vertex_fragment.default_framebuffer_bbox_smaller = FAIL
diff --git a/src/tests/deqp_support/deqp_gles31_test_expectations.txt b/src/tests/deqp_support/deqp_gles31_test_expectations.txt
index de746f1..39d5be0 100644
--- a/src/tests/deqp_support/deqp_gles31_test_expectations.txt
+++ b/src/tests/deqp_support/deqp_gles31_test_expectations.txt
@@ -221,19 +221,9 @@
 // Seem to trigger LowMemoryKiller when run in a certain sequence
 5185 VULKAN ANDROID : dEQP-GLES31.functional.atomic_counter.* = SKIP
 
-// SSBO synchronization:
-4097 VULKAN PIXEL2ORXL : dEQP-GLES31.functional.synchronization.in_invocation.ssbo_alias_overwrite = FAIL
-
 // Framebuffer without attachments:
 3579 ANDROID VULKAN : dEQP-GLES31.functional.fbo.no_attachments.* = SKIP
 
-// 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
-
-// Instanced lines with base vertex:
-4166 VULKAN PIXEL2ORXL : dEQP-GLES31.functional.draw_base_vertex.draw_elements_instanced_base_vertex.lines.instanced_attributes = FAIL
-
 // Need to support non-color when staging image updates
 4080 ANDROID VULKAN : dEQP-GLES31.functional.stencil_texturing.misc.base_level = SKIP
 
@@ -242,24 +232,6 @@
 4371 VULKAN ANDROID : dEQP-GLES31.functional.shaders.implicit_conversions.es31.arithmetic.input_before_literal.add.int_to_uvec3_vertex = FAIL
 4371 SWIFTSHADER : dEQP-GLES31.functional.shaders.implicit_conversions.* = FAIL
 
-// Unexpected crashes on Pixel 2.
-4822 VULKAN PIXEL2ORXL : dEQP-GLES31.functional.draw_buffers_indexed.random.max_implementation_draw_buffers.1 = SKIP
-4822 VULKAN PIXEL2ORXL : dEQP-GLES31.functional.draw_buffers_indexed.random.max_implementation_draw_buffers.3 = SKIP
-4822 VULKAN PIXEL2ORXL : dEQP-GLES31.functional.draw_buffers_indexed.random.max_implementation_draw_buffers.5 = SKIP
-4822 VULKAN PIXEL2ORXL : dEQP-GLES31.functional.draw_buffers_indexed.random.max_implementation_draw_buffers.9 = SKIP
-4822 VULKAN PIXEL2ORXL : dEQP-GLES31.functional.draw_buffers_indexed.random.max_implementation_draw_buffers.10 = SKIP
-4822 VULKAN PIXEL2ORXL : dEQP-GLES31.functional.draw_buffers_indexed.random.max_implementation_draw_buffers.12 = SKIP
-4822 VULKAN PIXEL2ORXL : dEQP-GLES31.functional.draw_buffers_indexed.random.max_implementation_draw_buffers.13 = SKIP
-4822 VULKAN PIXEL2ORXL : dEQP-GLES31.functional.draw_buffers_indexed.random.max_implementation_draw_buffers.14 = SKIP
-4822 VULKAN PIXEL2ORXL : dEQP-GLES31.functional.draw_buffers_indexed.random.max_implementation_draw_buffers.15 = SKIP
-4822 VULKAN PIXEL2ORXL : dEQP-GLES31.functional.draw_buffers_indexed.random.max_implementation_draw_buffers.17 = SKIP
-4822 VULKAN PIXEL2ORXL : dEQP-GLES31.functional.draw_buffers_indexed.random.max_implementation_draw_buffers.18 = SKIP
-4822 VULKAN PIXEL2ORXL : dEQP-GLES31.functional.draw_buffers_indexed.random.max_required_draw_buffers.0 = SKIP
-4822 VULKAN PIXEL2ORXL : dEQP-GLES31.functional.draw_buffers_indexed.random.max_required_draw_buffers.2 = SKIP
-4822 VULKAN PIXEL2ORXL : dEQP-GLES31.functional.draw_buffers_indexed.random.max_required_draw_buffers.10 = SKIP
-4822 VULKAN PIXEL2ORXL : dEQP-GLES31.functional.draw_buffers_indexed.random.max_required_draw_buffers.11 = SKIP
-4822 VULKAN PIXEL2ORXL : dEQP-GLES31.functional.draw_buffers_indexed.random.max_required_draw_buffers.17 = SKIP
-
 // Swiftshader fails to create a correct source/destination srgb8_alpha8_astc image before copy, however 5x4 is correct
 5275 SWIFTSHADER : dEQP-GLES31.functional.copy_image.*rgba*srgb8_alpha8_astc_*_khr.*_to_texture2d* = FAIL
 5275 SWIFTSHADER : dEQP-GLES31.functional.copy_image.*rgba*srgb8_alpha8_astc_*_khr.*_to_cubemap* = FAIL
@@ -282,38 +254,6 @@
 5277 VULKAN ANDROID : dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8_snorm_rgb10_a2* = FAIL
 5277 VULKAN ANDROID : dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8_snorm_rgb9_e5* = FAIL
 
-// Failures with some formats when copying to a renderbuffer
-5370 VULKAN PIXEL2ORXL : dEQP-GLES31.functional.copy_image.non_compressed.*rg8_snorm_r16i.*to_renderbuffer = FAIL
-5370 VULKAN PIXEL2ORXL : dEQP-GLES31.functional.copy_image.non_compressed.*rg8_snorm_r16ui.*to_renderbuffer = FAIL
-5370 VULKAN PIXEL2ORXL : dEQP-GLES31.functional.copy_image.non_compressed.*rgb8_snorm_rgb8.*to_renderbuffer = FAIL
-5370 VULKAN PIXEL2ORXL : dEQP-GLES31.functional.copy_image.non_compressed.*rgb8i_rgb8.*to_renderbuffer = FAIL
-5370 VULKAN PIXEL2ORXL : dEQP-GLES31.functional.copy_image.non_compressed.*rgb8ui_rgb8.*to_renderbuffer = FAIL
-5370 VULKAN PIXEL2ORXL : dEQP-GLES31.functional.copy_image.non_compressed.*srgb8_rgb8.*to_renderbuffer = FAIL
-5370 VULKAN PIXEL2ORXL : dEQP-GLES31.functional.copy_image.non_compressed.*r32i_rgba8.*to_renderbuffer = FAIL
-5370 VULKAN PIXEL2ORXL : dEQP-GLES31.functional.copy_image.non_compressed.*r32i_srgb8_alpha8.*to_renderbuffer = FAIL
-5370 VULKAN PIXEL2ORXL : dEQP-GLES31.functional.copy_image.non_compressed.*r32ui_rgba8.*to_renderbuffer = FAIL
-5370 VULKAN PIXEL2ORXL : dEQP-GLES31.functional.copy_image.non_compressed.*r32ui_srgb8_alpha8.*to_renderbuffer = FAIL
-5370 VULKAN PIXEL2ORXL : dEQP-GLES31.functional.copy_image.non_compressed.*rg16i_rgba8.*to_renderbuffer = FAIL
-5370 VULKAN PIXEL2ORXL : dEQP-GLES31.functional.copy_image.non_compressed.*rg16i_srgb8_alpha8.*to_renderbuffer = FAIL
-5370 VULKAN PIXEL2ORXL : dEQP-GLES31.functional.copy_image.non_compressed.*rg16ui_rgba8.*to_renderbuffer = FAIL
-5370 VULKAN PIXEL2ORXL : dEQP-GLES31.functional.copy_image.non_compressed.*rg16ui_srgb8_alpha8.*to_renderbuffer = FAIL
-5370 VULKAN PIXEL2ORXL : dEQP-GLES31.functional.copy_image.non_compressed.*rgb10_a2_rgba8.*to_renderbuffer = FAIL
-5370 VULKAN PIXEL2ORXL : dEQP-GLES31.functional.copy_image.non_compressed.*rgb10_a2_srgb8_alpha8.*to_renderbuffer = FAIL
-5370 VULKAN PIXEL2ORXL : dEQP-GLES31.functional.copy_image.non_compressed.*rgb10_a2ui_rgba8.*to_renderbuffer = FAIL
-5370 VULKAN PIXEL2ORXL : dEQP-GLES31.functional.copy_image.non_compressed.*rgb10_a2ui_srgb8_alpha8.*to_renderbuffer = FAIL
-5370 VULKAN PIXEL2ORXL : dEQP-GLES31.functional.copy_image.non_compressed.*rgba8_snorm_r32i.*to_renderbuffer = FAIL
-5370 VULKAN PIXEL2ORXL : dEQP-GLES31.functional.copy_image.non_compressed.*rgba8_snorm_r32ui.*to_renderbuffer = FAIL
-5370 VULKAN PIXEL2ORXL : dEQP-GLES31.functional.copy_image.non_compressed.*rgba8_snorm_rg16i.*to_renderbuffer = FAIL
-5370 VULKAN PIXEL2ORXL : dEQP-GLES31.functional.copy_image.non_compressed.*rgba8_snorm_rg16ui.*to_renderbuffer = FAIL
-5370 VULKAN PIXEL2ORXL : dEQP-GLES31.functional.copy_image.non_compressed.*rgba8_snorm_rgba8.*to_renderbuffer = FAIL
-5370 VULKAN PIXEL2ORXL : dEQP-GLES31.functional.copy_image.non_compressed.*rgba8_snorm_srgb8_alpha8.*to_renderbuffer = FAIL
-5370 VULKAN PIXEL2ORXL : dEQP-GLES31.functional.copy_image.non_compressed.*rgba8_srgb8_alpha8.*to_renderbuffer = FAIL
-5370 VULKAN PIXEL2ORXL : dEQP-GLES31.functional.copy_image.non_compressed.*rgba8i_rgba8.*to_renderbuffer = FAIL
-5370 VULKAN PIXEL2ORXL : dEQP-GLES31.functional.copy_image.non_compressed.*rgba8i_srgb8_alpha8.*to_renderbuffer = FAIL
-5370 VULKAN PIXEL2ORXL : dEQP-GLES31.functional.copy_image.non_compressed.*rgba8ui_rgba8.*to_renderbuffer = FAIL
-5370 VULKAN PIXEL2ORXL : dEQP-GLES31.functional.copy_image.non_compressed.*rgba8ui_srgb8_alpha8.*to_renderbuffer = FAIL
-5370 VULKAN PIXEL2ORXL : dEQP-GLES31.functional.copy_image.non_compressed.*srgb8_alpha8_rgba8.*to_renderbuffer = FAIL
-
 // Cannot support a seperate set of fragment shader input when per-sample shading:
 3588 VULKAN ANDROID : dEQP-GLES31.functional.shaders.sample_variables.sample_pos.correctness.multisample_*_1 = FAIL
 3588 VULKAN ANDROID : dEQP-GLES31.functional.shaders.sample_variables.sample_pos.correctness.multisample_*_2 = FAIL
@@ -1470,3 +1410,6 @@
 
 // Fails when the expression being interpolated as an indexed varying array.
 6194 PIXEL4ORXL VULKAN : dEQP-GLES31.functional.shaders.multisample_interpolation.interpolate_at_offset.array_element.* = FAIL
+
+// Slow tests.
+6021 : dEQP-GLES31.functional.ssbo.layout.random.all_shared_buffer.36 = TIMEOUT
diff --git a/src/tests/deqp_support/deqp_gles3_test_expectations.txt b/src/tests/deqp_support/deqp_gles3_test_expectations.txt
index f57236d..779ff6a 100644
--- a/src/tests/deqp_support/deqp_gles3_test_expectations.txt
+++ b/src/tests/deqp_support/deqp_gles3_test_expectations.txt
@@ -21,6 +21,10 @@
 //
 ////////////////////////////////////////////////////////////////////////////////
 
+// Undefined behaviour in the tests.
+6214 : dEQP-GLES3.functional.shaders.operator.unary_operator.minus.lowp_uvec4_vertex = FAIL
+6214 : dEQP-GLES3.functional.shaders.operator.unary_operator.minus.mediump_uvec4_vertex = FAIL
+
 // 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
@@ -361,10 +365,19 @@
 5172 MAC OPENGL AMD : dEQP-GLES3.functional.shaders.fragdata.valid_uniform_index = FAIL
 5172 MAC OPENGL AMD : dEQP-GLES3.functional.shaders.fragdata.draw_buffers = FAIL
 
+6222 MAC OPENGL AMD : dEQP-GLES3.functional.texture.specification.texsubimage3d_pbo.* = FAIL
+6222 MAC OPENGL AMD : dEQP-GLES3.functional.texture.specification.teximage3d_pbo.r8* = FAIL
+6222 MAC OPENGL AMD : dEQP-GLES3.functional.texture.specification.teximage3d_pbo.rg8* = FAIL
+6222 MAC OPENGL AMD : dEQP-GLES3.functional.texture.specification.teximage3d_pbo.r16* = FAIL
+
+6223 MAC METAL AMD : dEQP-GLES3.functional.shaders.discard.basic_always = 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 UHD 630 crashes
+6376 MAC OPENGL INTEL : dEQP-GLES3.functional.draw.random.127 = SKIP
 
 // Mac Intel failures
 2137 MAC OPENGL INTEL : dEQP-GLES3.functional.color_clear.* = FAIL
@@ -433,6 +446,12 @@
 5172 MAC OPENGL INTEL : dEQP-GLES3.functional.fragment_out.basic.int.* = FAIL
 5172 MAC OPENGL INTEL : dEQP-GLES3.functional.fragment_out.basic.uint.* = FAIL
 
+// Mac Intel UHD 630 failures
+6376 MAC OPENGL INTEL : dEQP-GLES3.functional.shaders.texture_functions.textureprojlod.isampler3d_vertex = FAIL
+6376 MAC OPENGL INTEL : dEQP-GLES3.functional.shaders.texture_functions.textureprojlod.usampler3d_vertex = FAIL
+6376 MAC OPENGL INTEL : dEQP-GLES3.functional.texture.mipmap.cube.base_level.linear_linear = FAIL
+6376 MAC OPENGL INTEL : dEQP-GLES3.functional.texture.mipmap.cube.base_level.linear_nearest = 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
@@ -549,84 +568,9 @@
 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
-
-161540999 PIXEL2ORXL VULKAN : dEQP-GLES3.functional.color_clear.masked_rgb = FAIL
-161540999 PIXEL2ORXL VULKAN : dEQP-GLES3.functional.color_clear.masked_rgba = FAIL
-161540999 PIXEL2ORXL VULKAN : dEQP-GLES3.functional.depth_stencil_clear.depth_stencil_masked = FAIL
-161540999 PIXEL2ORXL VULKAN : dEQP-GLES3.functional.fragment_ops.interaction.basic_shader.5 = FAIL
-161540999 PIXEL2ORXL VULKAN : dEQP-GLES3.functional.fragment_ops.interaction.basic_shader.7 = FAIL
-161540999 PIXEL2ORXL VULKAN : dEQP-GLES3.functional.fragment_ops.interaction.basic_shader.23 = FAIL
-161540999 PIXEL2ORXL VULKAN : dEQP-GLES3.functional.fragment_ops.interaction.basic_shader.57 = FAIL
-161540999 PIXEL2ORXL VULKAN : dEQP-GLES3.functional.fragment_ops.interaction.basic_shader.67 = FAIL
-161540999 PIXEL2ORXL VULKAN : dEQP-GLES3.functional.fragment_ops.interaction.basic_shader.71 = FAIL
-161540999 PIXEL2ORXL VULKAN : dEQP-GLES3.functional.fragment_ops.interaction.basic_shader.83 = FAIL
-161540999 PIXEL2ORXL VULKAN : dEQP-GLES3.functional.lifetime.attach.deleted_output.buffer_transform_feedback = FAIL
-161540999 PIXEL2ORXL VULKAN : dEQP-GLES3.functional.fragment_ops.random.4 = FAIL
-161540999 PIXEL2ORXL VULKAN : dEQP-GLES3.functional.fragment_ops.random.7 = FAIL
-161540999 PIXEL2ORXL VULKAN : dEQP-GLES3.functional.fragment_ops.random.11 = FAIL
-161540999 PIXEL2ORXL VULKAN : dEQP-GLES3.functional.fragment_ops.random.13 = FAIL
-161540999 PIXEL2ORXL VULKAN : dEQP-GLES3.functional.fragment_ops.random.14 = FAIL
-161540999 PIXEL2ORXL VULKAN : dEQP-GLES3.functional.fragment_ops.random.16 = FAIL
-161540999 PIXEL2ORXL VULKAN : dEQP-GLES3.functional.fragment_ops.random.19 = FAIL
-161540999 PIXEL2ORXL VULKAN : dEQP-GLES3.functional.fragment_ops.random.20 = FAIL
-161540999 PIXEL2ORXL VULKAN : dEQP-GLES3.functional.fragment_ops.random.24 = FAIL
-161540999 PIXEL2ORXL VULKAN : dEQP-GLES3.functional.fragment_ops.random.30 = FAIL
-161540999 PIXEL2ORXL VULKAN : dEQP-GLES3.functional.fragment_ops.random.34 = FAIL
-161540999 PIXEL2ORXL VULKAN : dEQP-GLES3.functional.fragment_ops.random.37 = FAIL
-161540999 PIXEL2ORXL VULKAN : dEQP-GLES3.functional.fragment_ops.random.38 = FAIL
-161540999 PIXEL2ORXL VULKAN : dEQP-GLES3.functional.fragment_ops.random.42 = FAIL
-161540999 PIXEL2ORXL VULKAN : dEQP-GLES3.functional.fragment_ops.random.44 = FAIL
-161540999 PIXEL2ORXL VULKAN : dEQP-GLES3.functional.fragment_ops.random.46 = FAIL
-161540999 PIXEL2ORXL VULKAN : dEQP-GLES3.functional.fragment_ops.random.47 = FAIL
-161540999 PIXEL2ORXL VULKAN : dEQP-GLES3.functional.fragment_ops.random.48 = FAIL
-161540999 PIXEL2ORXL VULKAN : dEQP-GLES3.functional.fragment_ops.random.55 = FAIL
-161540999 PIXEL2ORXL VULKAN : dEQP-GLES3.functional.fragment_ops.random.58 = FAIL
-161540999 PIXEL2ORXL VULKAN : dEQP-GLES3.functional.fragment_ops.random.60 = FAIL
-161540999 PIXEL2ORXL VULKAN : dEQP-GLES3.functional.fragment_ops.random.61 = FAIL
-161540999 PIXEL2ORXL VULKAN : dEQP-GLES3.functional.fragment_ops.random.64 = FAIL
-161540999 PIXEL2ORXL VULKAN : dEQP-GLES3.functional.fragment_ops.random.65 = FAIL
-161540999 PIXEL2ORXL VULKAN : dEQP-GLES3.functional.fragment_ops.random.66 = FAIL
-161540999 PIXEL2ORXL VULKAN : dEQP-GLES3.functional.fragment_ops.random.67 = FAIL
-161540999 PIXEL2ORXL VULKAN : dEQP-GLES3.functional.fragment_ops.random.69 = FAIL
-161540999 PIXEL2ORXL VULKAN : dEQP-GLES3.functional.fragment_ops.random.71 = FAIL
-161540999 PIXEL2ORXL VULKAN : dEQP-GLES3.functional.fragment_ops.random.74 = FAIL
-161540999 PIXEL2ORXL VULKAN : dEQP-GLES3.functional.fragment_ops.random.76 = FAIL
-161540999 PIXEL2ORXL VULKAN : dEQP-GLES3.functional.fragment_ops.random.79 = FAIL
-161540999 PIXEL2ORXL VULKAN : dEQP-GLES3.functional.fragment_ops.random.80 = FAIL
-161540999 PIXEL2ORXL VULKAN : dEQP-GLES3.functional.fragment_ops.random.82 = FAIL
-161540999 PIXEL2ORXL VULKAN : dEQP-GLES3.functional.fragment_ops.random.83 = FAIL
-161540999 PIXEL2ORXL VULKAN : dEQP-GLES3.functional.fragment_ops.random.86 = FAIL
-161540999 PIXEL2ORXL VULKAN : dEQP-GLES3.functional.fragment_ops.random.87 = FAIL
-161540999 PIXEL2ORXL VULKAN : dEQP-GLES3.functional.fragment_ops.random.94 = FAIL
-161540999 PIXEL2ORXL VULKAN : dEQP-GLES3.functional.fragment_ops.random.97 = 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
-
-// Failing on the Pixel 2 due to Qualcomm Vulkan driver
-4344 VULKAN PIXEL2ORXL : dEQP-GLES3.functional.fragment_ops.random.56 = FAIL
-4344 VULKAN PIXEL2ORXL : dEQP-GLES3.functional.fragment_ops.random.62 = FAIL
-4344 VULKAN PIXEL2ORXL : dEQP-GLES3.functional.fragment_ops.random.68 = FAIL
-// 161540999 PIXEL2ORXL VULKAN : dEQP-GLES3.functional.fragment_ops.random.68 = FAIL
-// Pixel 4 XL update (6/30/20): The previous 3 tests pass on Pixel 4 XL.  The following only fail
-// when the device is rotated 90 or 270 degrees, due to the same Qualcomm driver bug.  As before,
-// the driver bug can be worked around by immediately ending a render pass that does a clear.
-4344 VULKAN PIXEL2ORXL : dEQP-GLES3.functional.fragment_ops.interaction.basic_shader.54 = FAIL
-// 161540999 PIXEL2ORXL VULKAN : dEQP-GLES3.functional.fragment_ops.interaction.basic_shader.54 = FAIL
-4344 VULKAN PIXEL2ORXL : dEQP-GLES3.functional.fragment_ops.random.35 = FAIL
-// 161540999 PIXEL2ORXL VULKAN : dEQP-GLES3.functional.fragment_ops.random.35 = FAIL
-4344 VULKAN PIXEL2ORXL : dEQP-GLES3.functional.fragment_ops.random.73 = FAIL
-
 // Fails only with SwiftShader:
 
 // These only fail for a 565 config
@@ -637,10 +581,14 @@
 4418 SWIFTSHADER : dEQP-GLES3.functional.negative_api.buffer.framebuffer_texture_layer = FAIL
 
 // Flaky timeouts on SwANGLE
-1173237 SWIFTSHADER : dEQP-GLES3.functional.shaders.builtin_functions.precision.faceforward.lowp_fragment.vec4 = SKIP
-1173237 SWIFTSHADER : dEQP-GLES3.functional.shaders.builtin_functions.precision.faceforward.lowp_vertex.vec4 = SKIP
-1173237 SWIFTSHADER : dEQP-GLES3.functional.shaders.builtin_functions.precision.refract.lowp_fragment.vec4 = SKIP
-1173237 SWIFTSHADER : dEQP-GLES3.functional.shaders.builtin_functions.precision.refract.lowp_vertex.vec4 = SKIP
+1173237 SWIFTSHADER : dEQP-GLES3.functional.shaders.builtin_functions.precision.faceforward.lowp_fragment.vec4 = TIMEOUT
+1173237 SWIFTSHADER : dEQP-GLES3.functional.shaders.builtin_functions.precision.faceforward.lowp_vertex.vec4 = TIMEOUT
+1173237 SWIFTSHADER : dEQP-GLES3.functional.shaders.builtin_functions.precision.refract.lowp_fragment.vec4 = TIMEOUT
+1173237 SWIFTSHADER : dEQP-GLES3.functional.shaders.builtin_functions.precision.refract.lowp_vertex.vec4 = TIMEOUT
+
+// Fails on Win x86 SwANGLE bots with Clang llvmorg-13-init-15561-gf98ed74f
+6265 WIN SWIFTSHADER : dEQP-GLES3.functional.shaders.operator.unary_operator.minus.lowp_uvec3_vertex = FAIL
+6265 WIN SWIFTSHADER : dEQP-GLES3.functional.shaders.operator.unary_operator.minus.mediump_uvec3_vertex = FAIL
 
 // AddressSanitizer:DEADLYSIGNAL on Nexus 5X
 5665 NEXUS5X : dEQP-GLES3.functional.attribute_location.bind_aliasing.cond_mat3_offset_1 = SKIP
diff --git a/src/tests/deqp_support/deqp_khr_gles31_test_expectations.txt b/src/tests/deqp_support/deqp_khr_gles31_test_expectations.txt
index e65539a..543533f 100644
--- a/src/tests/deqp_support/deqp_khr_gles31_test_expectations.txt
+++ b/src/tests/deqp_support/deqp_khr_gles31_test_expectations.txt
@@ -34,26 +34,15 @@
 // Geometry shader support (conditioned to windows as that's our only bot capable of running these
 // tests)
 // Translator's lack of support for redefining gl_PerVertex
-5579 VULKAN WIN : KHR-GLES31.core.geometry_shader.api.getProgramiv3 = FAIL
-// Crash gathering transform feedback varyings on GS-only separable program
-5579 VULKAN WIN : KHR-GLES31.core.geometry_shader.api.program_pipeline_vs_gs_capture = SKIP
+5579 VULKAN : KHR-GLES31.core.geometry_shader.api.getProgramiv3 = FAIL
 // Wrong results
-5579 VULKAN WIN : KHR-GLES31.core.geometry_shader.adjacency.adjacency_indiced_triangle_strip = FAIL
-5579 VULKAN WIN : KHR-GLES31.core.geometry_shader.adjacency.adjacency_non_indiced_triangle_strip = FAIL
-5579 VULKAN WIN : KHR-GLES31.core.geometry_shader.rendering.rendering.triangles_input_line_strip_output_triangle_*_drawcall = FAIL
-5579 VULKAN WIN : KHR-GLES31.core.geometry_shader.rendering.rendering.triangles_input_triangle_strip_output_triangle_*_drawcall = FAIL
-5579 VULKAN WIN : KHR-GLES31.core.geometry_shader.rendering.rendering.triangles_with_adjacency_input_*_strip_output_triangle_strip_adjacency_drawcall = FAIL
-// Layered rendering (only fail when run in sequence, reproduced with --bot-mode)
-5579 VULKAN WIN : KHR-GLES31.core.geometry_shader.layered_fbo.fb_texture_invalid_level_number = FAIL
-5579 VULKAN WIN : KHR-GLES31.core.geometry_shader.layered_fbo.fb_texture_argument_refers_to_buffer_texture = FAIL
-// Crashes on ASSERT due to mismatch between shader resources and pipeline layout
-5579 VULKAN WIN : KHR-GLES31.core.geometry_shader.api.max_image_uniforms = SKIP
+5579 VULKAN : KHR-GLES31.core.geometry_shader.adjacency.adjacency_indiced_triangle_strip = FAIL
+5579 VULKAN : KHR-GLES31.core.geometry_shader.adjacency.adjacency_non_indiced_triangle_strip = FAIL
+5579 VULKAN : KHR-GLES31.core.geometry_shader.rendering.rendering.triangles_input_line_strip_output_triangle_*_drawcall = FAIL
+5579 VULKAN : KHR-GLES31.core.geometry_shader.rendering.rendering.triangles_input_triangle_strip_output_triangle_*_drawcall = FAIL
+5579 VULKAN : KHR-GLES31.core.geometry_shader.rendering.rendering.triangles_with_adjacency_input_*_strip_output_triangle_strip_adjacency_drawcall = FAIL
 // Failures on windows nvidia
-5579 VULKAN WIN NVIDIA : KHR-GLES31.core.geometry_shader.limits.max_invocations = FAIL
-
-// Dispatch indirect:
-4194 VULKAN PIXEL2ORXL : KHR-GLES31.core.compute_shader.resource-ubo = FAIL
-4194 VULKAN PIXEL2ORXL : KHR-GLES31.core.compute_shader.built-in-variables = FAIL
+5579 VULKAN NVIDIA : KHR-GLES31.core.geometry_shader.limits.max_invocations = FAIL
 
 // XFB array elements capture:
 // These tests only fail with VK_EXT_transform_feedback
@@ -107,10 +96,6 @@
 //// SwANGLE expectations
 ////
 
-// Flaky on Windows SwANGLE
-5755 WIN SWIFTSHADER : KHR-GLES31.core.arrays_of_arrays.SizedDeclarationsPrimitive = SKIP
-
-
 ////
 //// Android (i.e. Pixel*) Vulkan expectations
 ////
@@ -118,17 +103,6 @@
 // Crashes on Android
 4107 VULKAN ANDROID : KHR-GLES31.core.shader_storage_buffer_object.advanced-unsizedArrayLength* = SKIP
 
-// Explicit uniform locations:
-4219 VULKAN PIXEL2ORXL : KHR-GLES31.core.explicit_uniform_location.uniform-loc-mix-with-implicit-max = FAIL
-4219 VULKAN PIXEL2ORXL : KHR-GLES31.core.explicit_uniform_location.uniform-loc-mix-with-implicit-max-array = FAIL
-
-// Fails on Pixel2 and Pixel2 XL
-4159 VULKAN PIXEL2ORXL : KHR-GLES31.core.draw_indirect.advanced-twoPass-transformFeedback-elements = FAIL
-4159 VULKAN PIXEL2ORXL : KHR-GLES31.core.draw_indirect.advanced-twoPass-transformFeedback-arrays = FAIL
-
-// Fails to link the shader program on Pixel2 and Pixel2 XL
-5572 VULKAN PIXEL2ORXL : KHR-GLES31.core.sample_variables.mask.rgba8*.samples_*.mask_* = FAIL
-
 // Failing on Android with SwiftShader
 4300 SWIFTSHADER ANDROID : KHR-GLES31.core.shader_integer_mix.mix-bvec4 = FAIL
 4300 SWIFTSHADER ANDROID : KHR-GLES31.core.shader_integer_mix.mix-ivec4 = FAIL
@@ -301,3 +275,7 @@
 5990 PIXEL4ORXL VULKAN : KHR-GLES31.core.sample_variables.mask.rgba8ui.samples_4.mask_6 = SKIP
 5990 PIXEL4ORXL VULKAN : KHR-GLES31.core.sample_variables.mask.rgba8ui.samples_4.mask_7 = SKIP
 5990 PIXEL4ORXL VULKAN : KHR-GLES31.core.sample_variables.mask.rgba8ui.samples_4.mask_zero = SKIP
+
+// Slow tests
+5755 SWIFTSHADER : KHR-GLES31.core.arrays_of_arrays.SizedDeclarationsPrimitive = TIMEOUT
+6295 : KHR-GLES31.core.arrays_of_arrays.ConstructorsAndUnsizedDeclConstructors1 = TIMEOUT
diff --git a/src/tests/deqp_support/deqp_khr_gles32_test_expectations.txt b/src/tests/deqp_support/deqp_khr_gles32_test_expectations.txt
index 417fcfe..531a7c2 100644
--- a/src/tests/deqp_support/deqp_khr_gles32_test_expectations.txt
+++ b/src/tests/deqp_support/deqp_khr_gles32_test_expectations.txt
@@ -10,9 +10,6 @@
 // tests)
 // Translator's lack of support for redefining gl_PerVertex
 5579 VULKAN WIN : KHR-GLES32.core.geometry_shader.api.getProgramiv3 = FAIL
-// Crash gathering transform feedback varyings on GS-only separable program
-5579 VULKAN WIN : KHR-GLES32.core.geometry_shader.api.program_pipeline_vs_gs_capture = SKIP
-5579 VULKAN WIN : KHR-GLES32.core.separable_programs_tf.geometry_active = SKIP
 // API validation bugs
 5579 VULKAN WIN : KHR-GLES32.core.geometry_shader.qualifiers.flat_interpolation = FAIL
 // Wrong results
@@ -21,11 +18,6 @@
 5579 VULKAN WIN : KHR-GLES32.core.geometry_shader.rendering.rendering.triangles_input_line_strip_output_triangle_*_drawcall = FAIL
 5579 VULKAN WIN : KHR-GLES32.core.geometry_shader.rendering.rendering.triangles_input_triangle_strip_output_triangle_*_drawcall = FAIL
 5579 VULKAN WIN : KHR-GLES32.core.geometry_shader.rendering.rendering.triangles_with_adjacency_input_*_strip_output_triangle_strip_adjacency_drawcall = FAIL
-// Layered rendering (only fail when run in sequence, reproduced with --bot-mode)
-5579 VULKAN WIN : KHR-GLES32.core.geometry_shader.layered_fbo.fb_texture_invalid_level_number = FAIL
-5579 VULKAN WIN : KHR-GLES32.core.geometry_shader.layered_fbo.fb_texture_argument_refers_to_buffer_texture = FAIL
-// Crashes on ASSERT due to mismatch between shader resources and pipeline layout
-5579 VULKAN WIN : KHR-GLES32.core.geometry_shader.api.max_image_uniforms = SKIP
 // Failures on windows nvidia
 5579 VULKAN WIN NVIDIA : KHR-GLES32.core.geometry_shader.limits.max_invocations = FAIL
 5579 VULKAN WIN NVIDIA : KHR-GLES32.core.tessellation_shader.single.primitive_coverage = FAIL
@@ -161,8 +153,5 @@
 5393 VULKAN ANDROID : KHR-GLES32.core.texture_cube_map_array.texture_size_fragment_sh = FAIL
 5393 VULKAN ANDROID : KHR-GLES32.core.texture_cube_map_array.texture_size_vertex_sh = FAIL
 
-// Pixel 2 expectations
-6008 PIXEL2ORXL VULKAN : KHR-GLES32.core.framebuffer_completeness.cube_map_layered_attachment_valid_size_and_format = FAIL
-
 // Pixel 4 expectations.
 5990 PIXEL4ORXL VULKAN : KHR-GLES32.core.draw_buffers_indexed.color_masks = SKIP
diff --git a/src/tests/deqp_support/deqp_khr_gles3_test_expectations.txt b/src/tests/deqp_support/deqp_khr_gles3_test_expectations.txt
index fdaa4e7..4e11b9f 100644
--- a/src/tests/deqp_support/deqp_khr_gles3_test_expectations.txt
+++ b/src/tests/deqp_support/deqp_khr_gles3_test_expectations.txt
@@ -10,9 +10,6 @@
 3683 VULKAN ANDROID : KHR-GLES3.packed_depth_stencil.*.depth24_stencil8 = FAIL
 3683 VULKAN ANDROID : KHR-GLES3.packed_depth_stencil.*.depth32f_stencil8 = FAIL
 
-// Pixel 2 crashes
-5340 PIXEL2ORXL VULKAN : KHR-GLES3.copy_tex_image_conversions.* = SKIP
-
 // 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
diff --git a/src/tests/deqp_support/tcuANGLEPlatform.cpp b/src/tests/deqp_support/tcuANGLEPlatform.cpp
index 529513b..d196577 100644
--- a/src/tests/deqp_support/tcuANGLEPlatform.cpp
+++ b/src/tests/deqp_support/tcuANGLEPlatform.cpp
@@ -32,7 +32,9 @@
 
 namespace tcu
 {
-ANGLEPlatform::ANGLEPlatform(angle::LogErrorFunc logErrorFunc, uint32_t preRotation)
+ANGLEPlatform::ANGLEPlatform(angle::LogErrorFunc logErrorFunc,
+                             uint32_t preRotation,
+                             bool enableDirectSPIRVGen)
 {
     angle::SetLowPriorityProcess();
 
@@ -58,6 +60,11 @@
             break;
     }
 
+    if (enableDirectSPIRVGen)
+    {
+        mEnableFeatureOverrides.push_back("directSPIRVGeneration");
+    }
+
     mEnableFeatureOverrides.push_back(nullptr);
 
 #if (DE_OS == DE_OS_WIN32)
@@ -218,12 +225,14 @@
 }  // namespace tcu
 
 // Create platform
-tcu::Platform *CreateANGLEPlatform(angle::LogErrorFunc logErrorFunc, uint32_t preRotation)
+tcu::Platform *CreateANGLEPlatform(angle::LogErrorFunc logErrorFunc,
+                                   uint32_t preRotation,
+                                   bool enableDirectSPIRVGen)
 {
-    return new tcu::ANGLEPlatform(logErrorFunc, preRotation);
+    return new tcu::ANGLEPlatform(logErrorFunc, preRotation, enableDirectSPIRVGen);
 }
 
 tcu::Platform *createPlatform()
 {
-    return CreateANGLEPlatform(nullptr, 0);
+    return CreateANGLEPlatform(nullptr, 0, false);
 }
diff --git a/src/tests/deqp_support/tcuANGLEPlatform.h b/src/tests/deqp_support/tcuANGLEPlatform.h
index 2ce8a90..22247d5 100644
--- a/src/tests/deqp_support/tcuANGLEPlatform.h
+++ b/src/tests/deqp_support/tcuANGLEPlatform.h
@@ -18,8 +18,8 @@
  *
  */
 
-#ifndef TCU_ANGLE_WIN32_PLATFORM_H_
-#define TCU_ANGLE_WIN32_PLATFORM_H_
+#ifndef TCU_ANGLE_PLATFORM_H_
+#define TCU_ANGLE_PLATFORM_H_
 
 #include "gluPlatform.hpp"
 #include "tcuDefs.hpp"
@@ -38,7 +38,9 @@
 class ANGLEPlatform : public tcu::Platform, private glu::Platform, private eglu::Platform
 {
   public:
-    ANGLEPlatform(angle::LogErrorFunc logErrorFunc, uint32_t preRotation);
+    ANGLEPlatform(angle::LogErrorFunc logErrorFunc,
+                  uint32_t preRotation,
+                  bool enableDirectSPIRVGen);
     ~ANGLEPlatform();
 
     bool processEvents() override;
@@ -66,4 +68,8 @@
 
 }  // namespace tcu
 
-#endif  // TCU_ANGLE_WIN32_PLATFORM_H_
+tcu::Platform *CreateANGLEPlatform(angle::LogErrorFunc logErrorFunc,
+                                   uint32_t preRotation,
+                                   bool enableDirectSPIRVGen);
+
+#endif  // TCU_ANGLE_PLATFORM_H_
diff --git a/src/tests/egl_tests/EGLBackwardsCompatibleContextTest.cpp b/src/tests/egl_tests/EGLBackwardsCompatibleContextTest.cpp
index bb158fe..fce549e 100644
--- a/src/tests/egl_tests/EGLBackwardsCompatibleContextTest.cpp
+++ b/src/tests/egl_tests/EGLBackwardsCompatibleContextTest.cpp
@@ -133,6 +133,7 @@
         auto contextVersion = GetCurrentContextVersion();
         EXPECT_EQ(version, contextVersion);
 
+        ASSERT_EGL_TRUE(eglMakeCurrent(mDisplay, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT));
         eglDestroyContext(mDisplay, context);
     }
 }
@@ -163,6 +164,7 @@
 
     ASSERT_EGL_TRUE(eglMakeCurrent(mDisplay, mPbuffer, mPbuffer, es2Context));
     auto es2ContextVersion = GetCurrentContextVersion();
+    ASSERT_EGL_TRUE(eglMakeCurrent(mDisplay, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT));
     eglDestroyContext(mDisplay, es2Context);
 
     EXPECT_EQ(es3ContextVersion, es2ContextVersion);
@@ -184,6 +186,7 @@
     ASSERT_EGL_TRUE(eglMakeCurrent(mDisplay, mPbuffer, mPbuffer, es11Context));
     auto es11ContextVersion = GetCurrentContextVersion();
     ASSERT_EQ(std::make_pair(1, 1), es11ContextVersion);
+    ASSERT_EGL_TRUE(eglMakeCurrent(mDisplay, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT));
     eglDestroyContext(mDisplay, es11Context);
 
     EGLint es10ContextAttribs[] = {
@@ -195,6 +198,7 @@
     ASSERT_EGL_TRUE(eglMakeCurrent(mDisplay, mPbuffer, mPbuffer, es10Context));
     auto es10ContextVersion = GetCurrentContextVersion();
     ASSERT_EQ(std::make_pair(1, 1), es10ContextVersion);
+    ASSERT_EGL_TRUE(eglMakeCurrent(mDisplay, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT));
     eglDestroyContext(mDisplay, es10Context);
 }
 
diff --git a/src/tests/egl_tests/EGLContextSharingTest.cpp b/src/tests/egl_tests/EGLContextSharingTest.cpp
index 553ee6b..5aef45b 100644
--- a/src/tests/egl_tests/EGLContextSharingTest.cpp
+++ b/src/tests/egl_tests/EGLContextSharingTest.cpp
@@ -8,11 +8,12 @@
 
 #include <gtest/gtest.h>
 
-#include "EGLMultiThreadSteps.h"
 #include "test_utils/ANGLETest.h"
+#include "test_utils/MultiThreadSteps.h"
 #include "test_utils/angle_test_configs.h"
 #include "test_utils/gl_raii.h"
 #include "util/EGLWindow.h"
+#include "util/OSWindow.h"
 
 using namespace angle;
 
@@ -53,10 +54,105 @@
         getEGLWindow()->makeCurrent();
     }
 
-    EGLContext mContexts[2];
+    EGLContext mContexts[2] = {EGL_NO_CONTEXT, EGL_NO_CONTEXT};
     GLuint mTexture;
 };
 
+class EGLContextSharingTestNoFixture : public EGLContextSharingTest
+{
+  public:
+    EGLContextSharingTestNoFixture() : EGLContextSharingTest() {}
+
+    void testSetUp() override
+    {
+        mOsWindow     = OSWindow::New();
+        mMajorVersion = GetParam().majorVersion;
+    }
+
+    void testTearDown() override
+    {
+        if (mDisplay != EGL_NO_DISPLAY)
+        {
+            eglMakeCurrent(mDisplay, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT);
+
+            if (mSurface != EGL_NO_SURFACE)
+            {
+                eglDestroySurface(mDisplay, mSurface);
+                ASSERT_EGL_SUCCESS();
+                mSurface = EGL_NO_SURFACE;
+            }
+
+            for (auto &context : mContexts)
+            {
+                SafeDestroyContext(mDisplay, context);
+            }
+
+            eglTerminate(mDisplay);
+            mDisplay = EGL_NO_DISPLAY;
+            ASSERT_EGL_SUCCESS();
+            eglReleaseThread();
+            ASSERT_EGL_SUCCESS();
+        }
+
+        mOsWindow->destroy();
+        OSWindow::Delete(&mOsWindow);
+        ASSERT_EGL_SUCCESS() << "Error during test TearDown";
+    }
+
+    bool chooseConfig(EGLConfig *config) const
+    {
+        bool result          = false;
+        EGLint count         = 0;
+        EGLint clientVersion = mMajorVersion == 3 ? EGL_OPENGL_ES3_BIT : EGL_OPENGL_ES2_BIT;
+        EGLint attribs[]     = {EGL_RED_SIZE,
+                            8,
+                            EGL_GREEN_SIZE,
+                            8,
+                            EGL_BLUE_SIZE,
+                            8,
+                            EGL_ALPHA_SIZE,
+                            0,
+                            EGL_RENDERABLE_TYPE,
+                            clientVersion,
+                            EGL_SURFACE_TYPE,
+                            EGL_WINDOW_BIT,
+                            EGL_NONE};
+
+        result = eglChooseConfig(mDisplay, attribs, config, 1, &count);
+        EXPECT_EGL_TRUE(result && (count > 0));
+        return result;
+    }
+
+    bool createContext(EGLConfig config, EGLContext *context)
+    {
+        bool result      = false;
+        EGLint attribs[] = {EGL_CONTEXT_MAJOR_VERSION, mMajorVersion, EGL_NONE};
+
+        *context = eglCreateContext(mDisplay, config, nullptr, attribs);
+        result   = (*context != EGL_NO_CONTEXT);
+        EXPECT_TRUE(result);
+        return result;
+    }
+
+    bool createWindowSurface(EGLConfig config, EGLNativeWindowType win, EGLSurface *surface)
+    {
+        bool result      = false;
+        EGLint attribs[] = {EGL_NONE};
+
+        *surface = eglCreateWindowSurface(mDisplay, config, win, attribs);
+        result   = (*surface != EGL_NO_SURFACE);
+        EXPECT_TRUE(result);
+        return result;
+    }
+
+    OSWindow *mOsWindow;
+    EGLDisplay mDisplay  = EGL_NO_DISPLAY;
+    EGLSurface mSurface  = EGL_NO_SURFACE;
+    const EGLint kWidth  = 64;
+    const EGLint kHeight = 64;
+    EGLint mMajorVersion = 0;
+};
+
 // Tests that creating resources works after freeing the share context.
 TEST_P(EGLContextSharingTest, BindTextureAfterShareContextFree)
 {
@@ -109,14 +205,15 @@
     ASSERT_NE(EGL_NO_CONTEXT, mContexts[0]);
     ASSERT_NE(EGL_NO_CONTEXT, mContexts[1]);
     eglDestroyContext(display, mContexts[0]);
+    mContexts[0] = EGL_NO_CONTEXT;
 
     // Try creating a context that is not in the global share group but tries to share with a
     // context that is
     const EGLint notInShareGroupContextAttribs[] = {
         EGL_CONTEXT_CLIENT_VERSION, 2, EGL_DISPLAY_TEXTURE_SHARE_GROUP_ANGLE, EGL_FALSE, EGL_NONE};
-    mContexts[1] = eglCreateContext(display, config, mContexts[1], notInShareGroupContextAttribs);
+    mContexts[0] = eglCreateContext(display, config, mContexts[1], notInShareGroupContextAttribs);
     ASSERT_EGL_ERROR(EGL_BAD_ATTRIBUTE);
-    ASSERT_TRUE(mContexts[1] == EGL_NO_CONTEXT);
+    ASSERT_TRUE(mContexts[0] == EGL_NO_CONTEXT);
 }
 
 // Tests the sharing of textures using EGL_ANGLE_display_texture_share_group
@@ -540,6 +637,241 @@
         eglDestroyContext(dpy, ctx[t]);
     }
 }
+
+// Test that eglTerminate() with a thread doesn't cause other threads to crash.
+TEST_P(EGLContextSharingTestNoFixture, EglTerminateMultiThreaded)
+{
+    // http://anglebug.com/6208
+    // The following EGL calls led to a crash in eglMakeCurrent():
+    //
+    // Thread A: eglMakeCurrent(context A)
+    // Thread B: eglDestroyContext(context A)
+    //        B: eglTerminate() <<--- this release context A
+    // Thread A: eglMakeCurrent(context B)
+
+    EGLint dispattrs[] = {EGL_PLATFORM_ANGLE_TYPE_ANGLE, GetParam().getRenderer(), EGL_NONE};
+    mDisplay           = eglGetPlatformDisplayEXT(EGL_PLATFORM_ANGLE_ANGLE,
+                                        reinterpret_cast<void *>(EGL_DEFAULT_DISPLAY), dispattrs);
+    EXPECT_TRUE(mDisplay != EGL_NO_DISPLAY);
+    EXPECT_EGL_TRUE(eglInitialize(mDisplay, nullptr, nullptr));
+
+    EGLConfig config = EGL_NO_CONFIG_KHR;
+    EXPECT_TRUE(chooseConfig(&config));
+
+    mOsWindow->initialize("EGLContextSharingTestNoFixture", kWidth, kHeight);
+    EXPECT_TRUE(createWindowSurface(config, mOsWindow->getNativeWindow(), &mSurface));
+    ASSERT_EGL_SUCCESS() << "eglCreateWindowSurface failed.";
+
+    EXPECT_TRUE(createContext(config, &mContexts[0]));
+    EXPECT_EGL_TRUE(eglMakeCurrent(mDisplay, mSurface, mSurface, mContexts[0]));
+
+    // Must be after the eglMakeCurrent() so renderer string is initialized.
+    ANGLE_SKIP_TEST_IF(!platformSupportsMultithreading());
+    // TODO(http://www.anglebug.com/6304): Fails with OpenGL ES backend.
+    ANGLE_SKIP_TEST_IF(IsOpenGLES());
+
+    // Synchronization tools to ensure the two threads are interleaved as designed by this test.
+    std::mutex mutex;
+    std::condition_variable condVar;
+
+    enum class Step
+    {
+        Start,
+        Thread0Clear,
+        Thread1Terminate,
+        Thread0MakeCurrentContext1,
+        Finish,
+        Abort,
+    };
+    Step currentStep = Step::Start;
+
+    std::thread thread0 = std::thread([&]() {
+        ThreadSynchronization<Step> threadSynchronization(&currentStep, &mutex, &condVar);
+
+        ASSERT_TRUE(threadSynchronization.waitForStep(Step::Start));
+
+        EXPECT_EGL_TRUE(eglMakeCurrent(mDisplay, mSurface, mSurface, mContexts[0]));
+
+        // Clear and read back to make sure thread 0 uses context 0.
+        glClearColor(1.0, 0.0, 0.0, 1.0);
+        glClear(GL_COLOR_BUFFER_BIT);
+        EXPECT_PIXEL_EQ(0, 0, 255, 0, 0, 255);
+
+        // Wait for thread 1 to clear.
+        threadSynchronization.nextStep(Step::Thread0Clear);
+        ASSERT_TRUE(threadSynchronization.waitForStep(Step::Thread1Terminate));
+
+        // First Display was terminated, so we need to create a new one to create a new Context.
+        mDisplay = eglGetPlatformDisplayEXT(
+            EGL_PLATFORM_ANGLE_ANGLE, reinterpret_cast<void *>(EGL_DEFAULT_DISPLAY), dispattrs);
+        EXPECT_TRUE(mDisplay != EGL_NO_DISPLAY);
+        EXPECT_EGL_TRUE(eglInitialize(mDisplay, nullptr, nullptr));
+        config = EGL_NO_CONFIG_KHR;
+        EXPECT_TRUE(chooseConfig(&config));
+        EXPECT_TRUE(createContext(config, &mContexts[1]));
+        EXPECT_EGL_TRUE(eglMakeCurrent(mDisplay, mSurface, mSurface, mContexts[1]));
+
+        // Clear and read back to make sure thread 0 uses context 1.
+        glClearColor(1.0, 1.0, 0.0, 1.0);
+        glClear(GL_COLOR_BUFFER_BIT);
+        EXPECT_PIXEL_EQ(0, 0, 255, 255, 0, 255);
+
+        // Cleanup
+        EXPECT_TRUE(eglMakeCurrent(mDisplay, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT));
+        EXPECT_TRUE(SafeDestroyContext(mDisplay, mContexts[1]));
+        eglDestroySurface(mDisplay, mSurface);
+        mSurface = EGL_NO_SURFACE;
+        eglTerminate(mDisplay);
+        mDisplay = EGL_NO_DISPLAY;
+        EXPECT_EGL_SUCCESS();
+
+        threadSynchronization.nextStep(Step::Thread0MakeCurrentContext1);
+        ASSERT_TRUE(threadSynchronization.waitForStep(Step::Finish));
+    });
+
+    std::thread thread1 = std::thread([&]() {
+        ThreadSynchronization<Step> threadSynchronization(&currentStep, &mutex, &condVar);
+
+        // Wait for thread 0 to clear.
+        ASSERT_TRUE(threadSynchronization.waitForStep(Step::Thread0Clear));
+
+        // Destroy context 0 while thread1 has it current.
+        EXPECT_EGL_TRUE(eglMakeCurrent(mDisplay, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT));
+        EXPECT_TRUE(SafeDestroyContext(mDisplay, mContexts[0]));
+        EXPECT_EGL_SUCCESS();
+        eglTerminate(mDisplay);
+        mDisplay = EGL_NO_DISPLAY;
+        EXPECT_EGL_SUCCESS();
+
+        // Wait for the thread 0 to make a new context and glClear().
+        threadSynchronization.nextStep(Step::Thread1Terminate);
+        ASSERT_TRUE(threadSynchronization.waitForStep(Step::Thread0MakeCurrentContext1));
+
+        threadSynchronization.nextStep(Step::Finish);
+    });
+
+    thread0.join();
+    thread1.join();
+
+    ASSERT_NE(currentStep, Step::Abort);
+}
+
+// Test that eglDestoryContext() can be called multiple times on the same Context without causing
+// errors.
+TEST_P(EGLContextSharingTestNoFixture, EglDestoryContextManyTimesSameContext)
+{
+    EGLint dispattrs[] = {EGL_PLATFORM_ANGLE_TYPE_ANGLE, GetParam().getRenderer(), EGL_NONE};
+    mDisplay           = eglGetPlatformDisplayEXT(EGL_PLATFORM_ANGLE_ANGLE,
+                                        reinterpret_cast<void *>(EGL_DEFAULT_DISPLAY), dispattrs);
+    EXPECT_TRUE(mDisplay != EGL_NO_DISPLAY);
+    EXPECT_EGL_TRUE(eglInitialize(mDisplay, nullptr, nullptr));
+
+    EGLConfig config = EGL_NO_CONFIG_KHR;
+    EXPECT_TRUE(chooseConfig(&config));
+
+    mOsWindow->initialize("EGLContextSharingTestNoFixture", kWidth, kHeight);
+    EXPECT_TRUE(createWindowSurface(config, mOsWindow->getNativeWindow(), &mSurface));
+    ASSERT_EGL_SUCCESS() << "eglCreateWindowSurface failed.";
+
+    EXPECT_TRUE(createContext(config, &mContexts[0]));
+    EXPECT_EGL_TRUE(eglMakeCurrent(mDisplay, mSurface, mSurface, mContexts[0]));
+
+    // Must be after the eglMakeCurrent() so renderer string is initialized.
+    ANGLE_SKIP_TEST_IF(!platformSupportsMultithreading());
+    // TODO(http://www.anglebug.com/6304): Fails with OpenGL ES backend.
+    ANGLE_SKIP_TEST_IF(IsOpenGLES());
+
+    // Synchronization tools to ensure the two threads are interleaved as designed by this test.
+    std::mutex mutex;
+    std::condition_variable condVar;
+
+    enum class Step
+    {
+        Start,
+        Thread0Clear,
+        Thread1Terminate,
+        Thread0MakeCurrentContext1,
+        Finish,
+        Abort,
+    };
+    Step currentStep = Step::Start;
+
+    std::thread thread0 = std::thread([&]() {
+        ThreadSynchronization<Step> threadSynchronization(&currentStep, &mutex, &condVar);
+
+        ASSERT_TRUE(threadSynchronization.waitForStep(Step::Start));
+
+        EXPECT_EGL_TRUE(eglMakeCurrent(mDisplay, mSurface, mSurface, mContexts[0]));
+
+        // Clear and read back to make sure thread 0 uses context 0.
+        glClearColor(1.0, 0.0, 0.0, 1.0);
+        glClear(GL_COLOR_BUFFER_BIT);
+        EXPECT_PIXEL_EQ(0, 0, 255, 0, 0, 255);
+
+        // Wait for thread 1 to clear.
+        threadSynchronization.nextStep(Step::Thread0Clear);
+        ASSERT_TRUE(threadSynchronization.waitForStep(Step::Thread1Terminate));
+
+        // First Display was terminated, so we need to create a new one to create a new Context.
+        mDisplay = eglGetPlatformDisplayEXT(
+            EGL_PLATFORM_ANGLE_ANGLE, reinterpret_cast<void *>(EGL_DEFAULT_DISPLAY), dispattrs);
+        EXPECT_TRUE(mDisplay != EGL_NO_DISPLAY);
+        EXPECT_EGL_TRUE(eglInitialize(mDisplay, nullptr, nullptr));
+        config = EGL_NO_CONFIG_KHR;
+        EXPECT_TRUE(chooseConfig(&config));
+        EXPECT_TRUE(createContext(config, &mContexts[1]));
+        EXPECT_EGL_TRUE(eglMakeCurrent(mDisplay, mSurface, mSurface, mContexts[1]));
+
+        // Clear and read back to make sure thread 0 uses context 1.
+        glClearColor(1.0, 1.0, 0.0, 1.0);
+        glClear(GL_COLOR_BUFFER_BIT);
+        EXPECT_PIXEL_EQ(0, 0, 255, 255, 0, 255);
+
+        // Cleanup
+        EXPECT_TRUE(eglMakeCurrent(mDisplay, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT));
+        EXPECT_TRUE(SafeDestroyContext(mDisplay, mContexts[1]));
+        eglDestroySurface(mDisplay, mSurface);
+        mSurface = EGL_NO_SURFACE;
+        eglTerminate(mDisplay);
+        mDisplay = EGL_NO_DISPLAY;
+        EXPECT_EGL_SUCCESS();
+
+        threadSynchronization.nextStep(Step::Thread0MakeCurrentContext1);
+        ASSERT_TRUE(threadSynchronization.waitForStep(Step::Finish));
+    });
+
+    std::thread thread1 = std::thread([&]() {
+        ThreadSynchronization<Step> threadSynchronization(&currentStep, &mutex, &condVar);
+
+        // Wait for thread 0 to clear.
+        ASSERT_TRUE(threadSynchronization.waitForStep(Step::Thread0Clear));
+
+        EXPECT_EGL_TRUE(eglMakeCurrent(mDisplay, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT));
+
+        // Destroy context 0 5 times while thread1 has it current.
+        EXPECT_EGL_TRUE(eglDestroyContext(mDisplay, mContexts[0]));
+        EXPECT_EGL_TRUE(eglDestroyContext(mDisplay, mContexts[0]));
+        EXPECT_EGL_TRUE(eglDestroyContext(mDisplay, mContexts[0]));
+        EXPECT_EGL_TRUE(eglDestroyContext(mDisplay, mContexts[0]));
+        EXPECT_EGL_TRUE(eglDestroyContext(mDisplay, mContexts[0]));
+        mContexts[0] = EGL_NO_CONTEXT;
+
+        eglTerminate(mDisplay);
+        mDisplay = EGL_NO_DISPLAY;
+        EXPECT_EGL_SUCCESS();
+
+        // Wait for the thread 0 to make a new context and glClear().
+        threadSynchronization.nextStep(Step::Thread1Terminate);
+        ASSERT_TRUE(threadSynchronization.waitForStep(Step::Thread0MakeCurrentContext1));
+
+        threadSynchronization.nextStep(Step::Finish);
+    });
+
+    thread0.join();
+    thread1.join();
+
+    ASSERT_NE(currentStep, Step::Abort);
+}
 }  // anonymous namespace
 
 GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(EGLContextSharingTest);
@@ -552,3 +884,11 @@
                        ES3_OPENGL(),
                        ES2_VULKAN(),
                        ES3_VULKAN());
+
+ANGLE_INSTANTIATE_TEST(EGLContextSharingTestNoFixture,
+                       WithNoFixture(ES2_OPENGLES()),
+                       WithNoFixture(ES3_OPENGLES()),
+                       WithNoFixture(ES2_OPENGL()),
+                       WithNoFixture(ES3_OPENGL()),
+                       WithNoFixture(ES2_VULKAN()),
+                       WithNoFixture(ES3_VULKAN()));
\ No newline at end of file
diff --git a/src/tests/egl_tests/EGLCreateContextAttribsTest.cpp b/src/tests/egl_tests/EGLCreateContextAttribsTest.cpp
index 2b6b5b9..2ffe05b 100644
--- a/src/tests/egl_tests/EGLCreateContextAttribsTest.cpp
+++ b/src/tests/egl_tests/EGLCreateContextAttribsTest.cpp
@@ -210,6 +210,8 @@
     }
 
     // Cleanup contexts
+    ASSERT_EGL_TRUE(eglMakeCurrent(mDisplay, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT));
+    eglDestroyContext(mDisplay, context);
     eglTerminate(mDisplay);
 }
 
diff --git a/src/tests/egl_tests/EGLDeviceTest.cpp b/src/tests/egl_tests/EGLDeviceTest.cpp
index fed5f2a..254a90f 100644
--- a/src/tests/egl_tests/EGLDeviceTest.cpp
+++ b/src/tests/egl_tests/EGLDeviceTest.cpp
@@ -83,6 +83,7 @@
 
         if (mContext != EGL_NO_CONTEXT)
         {
+            eglMakeCurrent(mDisplay, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT);
             eglDestroyContext(mDisplay, mContext);
             mContext = EGL_NO_CONTEXT;
         }
@@ -257,6 +258,7 @@
 
     // Note that we must call TearDown() before we release the EGL device, since the display
     // depends on the device
+    ASSERT_EGL_TRUE(eglMakeCurrent(mDisplay, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT));
     testTearDown();
 
     eglReleaseDeviceANGLE(eglDevice);
diff --git a/src/tests/egl_tests/EGLDirectCompositionTest.cpp b/src/tests/egl_tests/EGLDirectCompositionTest.cpp
index e6c8db9..b7ae9b4 100644
--- a/src/tests/egl_tests/EGLDirectCompositionTest.cpp
+++ b/src/tests/egl_tests/EGLDirectCompositionTest.cpp
@@ -200,7 +200,11 @@
         {
             return;
         }
-        ASSERT_EGL_TRUE(eglTerminate(mEglDisplay));
+        if (mEglDisplay != EGL_NO_DISPLAY)
+        {
+            ASSERT_EGL_TRUE(eglTerminate(mEglDisplay));
+            mEglDisplay = EGL_NO_DISPLAY;
+        }
 
         OSWindow::Delete(&mOSWindow);
     }
@@ -247,8 +251,11 @@
     ASSERT_TRUE(surfacewidth == static_cast<int>(visualsize.X));
     ASSERT_TRUE(surfaceheight == static_cast<int>(visualsize.Y));
 
+    ASSERT_TRUE(eglMakeCurrent(mEglDisplay, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT) !=
+                EGL_FALSE);
     ASSERT_EGL_TRUE(eglDestroySurface(mEglDisplay, s));
     ASSERT_EGL_TRUE(eglDestroyContext(mEglDisplay, mEglContext));
+    mEglContext = EGL_NO_CONTEXT;
 }
 
 // This tests that a WindowSurface can be created using a SpriteVisual as the containing window
@@ -291,8 +298,11 @@
     ASSERT_EGL_TRUE(pixelBuffer[(50 * 50 * 4) + 2] == 0);
     ASSERT_EGL_TRUE(pixelBuffer[(50 * 50 * 4) + 3] == 255);
 
+    ASSERT_TRUE(eglMakeCurrent(mEglDisplay, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT) !=
+                EGL_FALSE);
     ASSERT_EGL_TRUE(eglDestroySurface(mEglDisplay, s));
     ASSERT_EGL_TRUE(eglDestroyContext(mEglDisplay, mEglContext));
+    mEglContext = EGL_NO_CONTEXT;
 }
 
 ANGLE_INSTANTIATE_TEST(EGLDirectCompositionTest, WithNoFixture(ES2_D3D11()));
diff --git a/src/tests/egl_tests/EGLMultiContextTest.cpp b/src/tests/egl_tests/EGLMultiContextTest.cpp
index 67ba777..a8acd74 100644
--- a/src/tests/egl_tests/EGLMultiContextTest.cpp
+++ b/src/tests/egl_tests/EGLMultiContextTest.cpp
@@ -8,8 +8,8 @@
 
 #include <gtest/gtest.h>
 
-#include "EGLMultiThreadSteps.h"
 #include "test_utils/ANGLETest.h"
+#include "test_utils/MultiThreadSteps.h"
 #include "test_utils/angle_test_configs.h"
 #include "test_utils/gl_raii.h"
 #include "util/EGLWindow.h"
@@ -69,6 +69,11 @@
     EXPECT_EGL_TRUE(eglMakeCurrent(dpy, EGL_NO_SURFACE, EGL_NO_SURFACE, context1));
     EXPECT_EGL_TRUE(eglDestroyContext(dpy, context2));
     EXPECT_EGL_SUCCESS();
+
+    // Cleanup
+    EXPECT_EGL_TRUE(eglMakeCurrent(dpy, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT));
+    EXPECT_EGL_TRUE(eglDestroyContext(dpy, context1));
+    EXPECT_EGL_SUCCESS();
 }
 
 // Test that a compute shader running in one thread will still work when rendering is happening in
@@ -226,6 +231,7 @@
     ASSERT_NE(currentStep, Step::Abort);
 
     // Clean up
+    EXPECT_EGL_TRUE(eglMakeCurrent(dpy, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT));
     for (size_t t = 0; t < kThreadCount; ++t)
     {
         eglDestroySurface(dpy, surface[t]);
diff --git a/src/tests/egl_tests/EGLPresentPathD3D11Test.cpp b/src/tests/egl_tests/EGLPresentPathD3D11Test.cpp
index fafdd22..0e3c317 100644
--- a/src/tests/egl_tests/EGLPresentPathD3D11Test.cpp
+++ b/src/tests/egl_tests/EGLPresentPathD3D11Test.cpp
@@ -146,6 +146,8 @@
 
             if (mContext != EGL_NO_CONTEXT)
             {
+                ASSERT_EGL_TRUE(
+                    eglMakeCurrent(mDisplay, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT));
                 eglDestroyContext(mDisplay, mContext);
                 mContext = EGL_NO_CONTEXT;
             }
diff --git a/src/tests/egl_tests/EGLProtectedContentTest.cpp b/src/tests/egl_tests/EGLProtectedContentTest.cpp
index e98cef9..ad8e5cb 100644
--- a/src/tests/egl_tests/EGLProtectedContentTest.cpp
+++ b/src/tests/egl_tests/EGLProtectedContentTest.cpp
@@ -63,6 +63,8 @@
                             clientVersion,
                             EGL_SURFACE_TYPE,
                             (EGL_PBUFFER_BIT | EGL_WINDOW_BIT),
+                            EGL_BIND_TO_TEXTURE_RGBA,
+                            EGL_TRUE,
                             EGL_NONE};
 
         EGLint count = 0;
@@ -88,10 +90,27 @@
 
     bool createPbufferSurface(EGLBoolean isProtected, EGLConfig config, EGLSurface *surface)
     {
-        bool result               = false;
-        EGLint attribsProtected[] = {
-            EGL_WIDTH, kWidth, EGL_HEIGHT, kHeight, EGL_PROTECTED_CONTENT_EXT, EGL_TRUE, EGL_NONE};
-        EGLint attribsUnProtected[] = {EGL_WIDTH, kWidth, EGL_HEIGHT, kHeight, EGL_NONE};
+        bool result                 = false;
+        EGLint attribsProtected[]   = {EGL_WIDTH,
+                                     kWidth,
+                                     EGL_HEIGHT,
+                                     kHeight,
+                                     EGL_TEXTURE_FORMAT,
+                                     EGL_TEXTURE_RGBA,
+                                     EGL_TEXTURE_TARGET,
+                                     EGL_TEXTURE_2D,
+                                     EGL_PROTECTED_CONTENT_EXT,
+                                     EGL_TRUE,
+                                     EGL_NONE};
+        EGLint attribsUnProtected[] = {EGL_WIDTH,
+                                       kWidth,
+                                       EGL_HEIGHT,
+                                       kHeight,
+                                       EGL_TEXTURE_FORMAT,
+                                       EGL_TEXTURE_RGBA,
+                                       EGL_TEXTURE_TARGET,
+                                       EGL_TEXTURE_2D,
+                                       EGL_NONE};
 
         *surface = eglCreatePbufferSurface(mDisplay, config,
                                            (isProtected ? attribsProtected : attribsUnProtected));
@@ -116,8 +135,231 @@
         return result;
     }
 
-    void PbufferTest(bool isProtectedContext, bool isProtectedSurface);
-    void WindowTest(bool isProtectedContext, bool isProtectedSurface);
+    bool createImage(EGLBoolean isProtected,
+                     EGLContext context,
+                     EGLenum target,
+                     EGLClientBuffer buffer,
+                     EGLImage *image)
+    {
+        bool result                  = false;
+        EGLAttrib attribsProtected[] = {EGL_PROTECTED_CONTENT_EXT, EGL_TRUE, EGL_NONE};
+
+        *image = eglCreateImage(mDisplay, context, target, buffer,
+                                (isProtected ? attribsProtected : nullptr));
+        EXPECT_EGL_SUCCESS();
+        result = (*image != EGL_NO_SURFACE);
+        EXPECT_TRUE(result);
+        return result;
+    }
+
+    bool createTexture(EGLBoolean isProtected, GLuint *textureId)
+    {
+        bool result    = false;
+        GLuint texture = 0;
+        glGenTextures(1, &texture);
+        glBindTexture(GL_TEXTURE_2D, texture);
+        glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, kWidth, kHeight, 0, GL_RGBA, GL_UNSIGNED_BYTE,
+                     nullptr);
+        EXPECT_GL_NO_ERROR();
+        if (isProtected)
+        {
+            glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_PROTECTED_EXT, GL_TRUE);
+            // GL_INVALID_OPERATION expected when context is not protected too.
+            GLenum error = glGetError();
+            if (error == GL_INVALID_OPERATION)
+            {
+                return false;
+            }
+        }
+        glTexStorage2D(GL_TEXTURE_2D, 1, GL_RGBA8, kWidth, kHeight);
+        EXPECT_GL_NO_ERROR();
+        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
+        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
+        result = (texture != 0);
+        EXPECT_TRUE(result);
+        *textureId = texture;
+        return result;
+    }
+
+    bool createTextureFromImage(EGLImage image, GLuint *textureId)
+    {
+        bool result    = false;
+        GLuint texture = 0;
+        glGenTextures(1, &texture);
+        glBindTexture(GL_TEXTURE_2D, texture);
+        glEGLImageTargetTexture2DOES(GL_TEXTURE_2D, image);
+        EXPECT_GL_NO_ERROR();
+        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
+        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
+        result = (texture != 0);
+        EXPECT_TRUE(result);
+        *textureId = texture;
+        return result;
+    }
+
+    bool createTextureFromPbuffer(EGLSurface pBuffer, GLuint *textureId)
+    {
+        bool result    = false;
+        GLuint texture = 0;
+        glGenTextures(1, &texture);
+        glBindTexture(GL_TEXTURE_2D, texture);
+        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
+        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
+        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
+        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
+        EXPECT_GL_NO_ERROR();
+        EXPECT_TRUE(texture != 0);
+        result = eglBindTexImage(mDisplay, pBuffer, EGL_BACK_BUFFER);
+        glViewport(0, 0, kWidth, kHeight);
+        *textureId = texture;
+        return result;
+    }
+
+    bool fillTexture(GLuint textureId, GLColor color)
+    {
+        GLuint pixels[kWidth * kHeight];
+        for (uint32_t i = 0; i < (kWidth * kHeight); i++)
+        {
+            pixels[i] = *(GLuint *)(color.data());
+        }
+        glBindTexture(GL_TEXTURE_2D, textureId);
+        glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, kWidth, kHeight, GL_RGBA, GL_UNSIGNED_BYTE,
+                        (void *)pixels);
+        EXPECT_GL_NO_ERROR();
+        return true;
+    }
+
+    bool renderTexture(GLuint textureId)
+    {
+        const char *kVertexShader   = R"(
+            precision highp float;
+            attribute vec4 position;
+            varying vec2 texcoord;
+
+            void main()
+            {
+                gl_Position = vec4(position.xy, 0.0, 1.0);
+                texcoord = (position.xy * 0.5) + 0.5;
+            }
+        )";
+        const char *kFragmentShader = R"(
+            precision highp float;
+            uniform sampler2D tex;
+            varying vec2 texcoord;
+
+            void main()
+            {
+                gl_FragColor = texture2D(tex, texcoord);
+            }
+        )";
+
+        GLuint program = CompileProgram(kVertexShader, kFragmentShader);
+        glUseProgram(program);
+        glBindTexture(GL_TEXTURE_2D, textureId);
+        glActiveTexture(GL_TEXTURE0);
+        GLint texture2DUniformLocation = glGetUniformLocation(program, "tex");
+        glUniform1i(texture2DUniformLocation, 0);
+        drawQuad(program, "position", 0.5f);
+        glDeleteProgram(program);
+        EXPECT_GL_NO_ERROR();
+        return true;
+    }
+
+    bool createRenderbuffer(GLuint *renderbuffer)
+    {
+        bool result   = false;
+        *renderbuffer = 0;
+        glGenRenderbuffers(1, renderbuffer);
+        glBindRenderbuffer(GL_RENDERBUFFER, *renderbuffer);
+        glRenderbufferStorage(GL_RENDERBUFFER, GL_RGBA, kWidth, kHeight);
+        EXPECT_GL_NO_ERROR();
+        result = (*renderbuffer != 0);
+        EXPECT_TRUE(result);
+        return result;
+    }
+
+    bool createRenderbufferFromImage(EGLImage image, GLuint *renderbuffer)
+    {
+        bool result   = false;
+        *renderbuffer = 0;
+        glGenRenderbuffers(1, renderbuffer);
+        glBindRenderbuffer(GL_RENDERBUFFER, *renderbuffer);
+        glEGLImageTargetRenderbufferStorageOES(GL_RENDERBUFFER, image);
+        EXPECT_GL_NO_ERROR();
+        result = (*renderbuffer != 0);
+        EXPECT_TRUE(result);
+        return result;
+    }
+
+    bool createAndroidClientBuffer(bool useProtected,
+                                   bool useRenderbuffer,
+                                   bool useTexture,
+                                   EGLClientBuffer *clientBuffer)
+    {
+        bool result = false;
+        EGLint nativeBufferUsage =
+            0 | (useProtected ? EGL_NATIVE_BUFFER_USAGE_PROTECTED_BIT_ANDROID : 0) |
+            (useRenderbuffer ? EGL_NATIVE_BUFFER_USAGE_RENDERBUFFER_BIT_ANDROID : 0) |
+            (useTexture ? EGL_NATIVE_BUFFER_USAGE_TEXTURE_BIT_ANDROID : 0);
+
+        EGLint attribs[] = {EGL_WIDTH,
+                            kWidth,
+                            EGL_HEIGHT,
+                            kHeight,
+                            EGL_RED_SIZE,
+                            8,
+                            EGL_GREEN_SIZE,
+                            8,
+                            EGL_BLUE_SIZE,
+                            8,
+                            EGL_ALPHA_SIZE,
+                            8,
+                            EGL_NATIVE_BUFFER_USAGE_ANDROID,
+                            nativeBufferUsage,
+                            EGL_NONE};
+
+        *clientBuffer = eglCreateNativeClientBufferANDROID(attribs);
+        EXPECT_EGL_SUCCESS();
+        result = (*clientBuffer != nullptr);
+        EXPECT_TRUE(result);
+        return result;
+    }
+
+    void pbufferTest(bool isProtectedContext, bool isProtectedSurface);
+    void windowTest(bool isProtectedContext, bool isProtectedSurface);
+    void textureTest(bool isProtectedContext, bool isProtectedTexture);
+    void textureFromImageTest(bool isProtectedContext, bool isProtectedTexture);
+    void textureFromPbufferTest(bool isProtectedContext, bool isProtectedTexture);
+    void textureFromAndroidNativeBufferTest(bool isProtectedContext, bool isProtectedTexture);
+
+    void checkSwapBuffersResult(const std::string color,
+                                bool isProtectedContext,
+                                bool isProtectedSurface)
+    {
+        std::this_thread::sleep_for(1s);
+        if (isProtectedContext)
+        {
+            if (isProtectedSurface)
+            {
+                std::cout << "Operator should see color: " << color << std::endl;
+            }
+            else
+            {
+                std::cout << "Operator should see color: BLACK" << std::endl;
+            }
+        }
+        else
+        {
+            if (isProtectedSurface)
+            {
+                std::cout << "Operator should see color: BLACK" << std::endl;
+            }
+            else
+            {
+                std::cout << "Operator should see color: " << color << std::endl;
+            }
+        }
+    }
 
     EGLDisplay mDisplay         = EGL_NO_DISPLAY;
     EGLint mMajorVersion        = 0;
@@ -125,15 +367,13 @@
     static const EGLint kHeight = 16;
 };
 
-void EGLProtectedContentTest::PbufferTest(bool isProtectedContext, bool isProtectedSurface)
+void EGLProtectedContentTest::pbufferTest(bool isProtectedContext, bool isProtectedSurface)
 {
-    if (isProtectedContext || isProtectedSurface)
-    {
-        ANGLE_SKIP_TEST_IF(!IsEGLDisplayExtensionEnabled(mDisplay, "EGL_EXT_protected_content"));
-    }
+    ANGLE_SKIP_TEST_IF(!IsEGLDisplayExtensionEnabled(mDisplay, "EGL_EXT_protected_content"));
 
     EGLConfig config = EGL_NO_CONFIG_KHR;
     EXPECT_TRUE(chooseConfig(&config));
+    ANGLE_SKIP_TEST_IF(config == EGL_NO_CONFIG_KHR);
 
     EGLContext context = EGL_NO_CONTEXT;
     EXPECT_TRUE(createContext(isProtectedContext, config, &context));
@@ -151,6 +391,7 @@
 
     glFinish();
     ASSERT_GL_NO_ERROR() << "glFinish failed";
+    EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::red);
 
     EXPECT_TRUE(eglMakeCurrent(mDisplay, EGL_NO_SURFACE, EGL_NO_SURFACE, context));
     ASSERT_EGL_SUCCESS() << "eglMakeCurrent - uncurrent failed.";
@@ -165,18 +406,16 @@
 // Unprotected context with Unprotected PbufferSurface
 TEST_P(EGLProtectedContentTest, UnprotectedContextWithUnprotectedPbufferSurface)
 {
-    PbufferTest(false, false);
+    pbufferTest(false, false);
 }
 
-void EGLProtectedContentTest::WindowTest(bool isProtectedContext, bool isProtectedSurface)
+void EGLProtectedContentTest::windowTest(bool isProtectedContext, bool isProtectedSurface)
 {
-    if (isProtectedContext || isProtectedSurface)
-    {
-        ANGLE_SKIP_TEST_IF(!IsEGLDisplayExtensionEnabled(mDisplay, "EGL_EXT_protected_content"));
-    }
+    ANGLE_SKIP_TEST_IF(!IsEGLDisplayExtensionEnabled(mDisplay, "EGL_EXT_protected_content"));
 
     EGLConfig config = EGL_NO_CONFIG_KHR;
     EXPECT_TRUE(chooseConfig(&config));
+    ANGLE_SKIP_TEST_IF(config == EGL_NO_CONFIG_KHR);
 
     EGLContext context = EGL_NO_CONTEXT;
     EXPECT_TRUE(createContext(isProtectedContext, config, &context));
@@ -199,7 +438,7 @@
     ASSERT_GL_NO_ERROR() << "glClear failed";
     eglSwapBuffers(mDisplay, windowSurface);
     ASSERT_EGL_SUCCESS() << "eglSwapBuffers failed.";
-    std::this_thread::sleep_for(1s);
+    checkSwapBuffersResult("RED", isProtectedContext, isProtectedSurface);
 
     // Green
     glClearColor(0.0, 1.0, 0.0, 1.0);
@@ -207,7 +446,7 @@
     ASSERT_GL_NO_ERROR() << "glClear failed";
     eglSwapBuffers(mDisplay, windowSurface);
     ASSERT_EGL_SUCCESS() << "eglSwapBuffers failed.";
-    std::this_thread::sleep_for(1s);
+    checkSwapBuffersResult("GREEN", isProtectedContext, isProtectedSurface);
 
     // Blue
     glClearColor(0.0, 0.0, 1.0, 1.0);
@@ -215,7 +454,7 @@
     ASSERT_GL_NO_ERROR() << "glClear failed";
     eglSwapBuffers(mDisplay, windowSurface);
     ASSERT_EGL_SUCCESS() << "eglSwapBuffers failed.";
-    std::this_thread::sleep_for(1s);
+    checkSwapBuffersResult("BLUE", isProtectedContext, isProtectedSurface);
 
     EXPECT_TRUE(eglMakeCurrent(mDisplay, EGL_NO_SURFACE, EGL_NO_SURFACE, context));
     ASSERT_EGL_SUCCESS() << "eglMakeCurrent - uncurrent failed.";
@@ -232,17 +471,365 @@
 // Unprotected context with Unprotected WindowSurface
 TEST_P(EGLProtectedContentTest, UnprotectedContextWithUnprotectedWindowSurface)
 {
-    std::cout << "Operator should see RED, GREEN, BLUE on screen" << std::endl;
-    WindowTest(false, false);
+    windowTest(false, false);
 }
 
 // Protected context with Protected WindowSurface
 TEST_P(EGLProtectedContentTest, ProtectedContextWithProtectedWindowSurface)
 {
-    std::cout << "Operator should see RED, GREEN, BLUE on screen" << std::endl;
-    WindowTest(true, true);
+    windowTest(true, true);
+}
+
+void EGLProtectedContentTest::textureTest(bool isProtectedContext, bool isProtectedTexture)
+{
+    ANGLE_SKIP_TEST_IF(!IsEGLDisplayExtensionEnabled(mDisplay, "EGL_EXT_protected_content"));
+
+    bool isProtectedSurface = isProtectedTexture;
+
+    EGLConfig config = EGL_NO_CONFIG_KHR;
+    EXPECT_TRUE(chooseConfig(&config));
+    ANGLE_SKIP_TEST_IF(config == EGL_NO_CONFIG_KHR);
+
+    EGLContext context = EGL_NO_CONTEXT;
+    EXPECT_TRUE(createContext(isProtectedContext, config, &context));
+    ASSERT_EGL_SUCCESS() << "eglCreateContext failed.";
+
+    OSWindow *osWindow = OSWindow::New();
+    osWindow->initialize("ProtectedContentTest", kWidth, kHeight);
+    EGLSurface windowSurface          = EGL_NO_SURFACE;
+    EGLBoolean createWinSurfaceResult = createWindowSurface(
+        isProtectedSurface, config, osWindow->getNativeWindow(), &windowSurface);
+    EXPECT_TRUE(createWinSurfaceResult);
+    ASSERT_EGL_SUCCESS() << "eglCreateWindowSurface failed.";
+    glViewport(0, 0, kWidth, kHeight);
+
+    EXPECT_TRUE(eglMakeCurrent(mDisplay, windowSurface, windowSurface, context));
+    ASSERT_EGL_SUCCESS() << "eglMakeCurrent failed.";
+
+    if (IsGLExtensionEnabled("GL_EXT_protected_textures"))
+    {
+        GLuint texture = 0;
+        bool result    = createTexture(isProtectedTexture, &texture);
+        if (isProtectedTexture && !isProtectedContext)
+        {
+            std::cout << "Can't create protected Texture for Unprotected Context" << std::endl;
+            ASSERT_FALSE(result);
+        }
+        else
+        {
+            ASSERT_TRUE(result);
+
+            EXPECT_TRUE(fillTexture(texture, GLColor::red));
+            EXPECT_TRUE(renderTexture(texture));
+
+            eglSwapBuffers(mDisplay, windowSurface);
+            ASSERT_EGL_SUCCESS() << "eglSwapBuffers failed.";
+            checkSwapBuffersResult("RED", isProtectedContext, isProtectedSurface);
+
+            glBindTexture(GL_TEXTURE_2D, 0);
+            glDeleteTextures(1, &texture);
+        }
+    }
+    else
+    {
+        std::cout << "Skipping tests, GL_EXT_protected_textures not supported" << std::endl;
+    }
+
+    EXPECT_TRUE(eglMakeCurrent(mDisplay, EGL_NO_SURFACE, EGL_NO_SURFACE, context));
+    ASSERT_EGL_SUCCESS() << "eglMakeCurrent - uncurrent failed.";
+
+    eglDestroySurface(mDisplay, windowSurface);
+    windowSurface = EGL_NO_SURFACE;
+    osWindow->destroy();
+    OSWindow::Delete(&osWindow);
+
+    eglDestroyContext(mDisplay, context);
+    context = EGL_NO_CONTEXT;
+}
+
+// Unprotected context with unprotected texture
+TEST_P(EGLProtectedContentTest, UnprotectedContextWithUnprotectedTexture)
+{
+    textureTest(false, false);
+}
+
+// Protected context with protected texture
+TEST_P(EGLProtectedContentTest, ProtectedContextWithProtectedTexture)
+{
+    textureTest(true, true);
+}
+
+void EGLProtectedContentTest::textureFromImageTest(bool isProtectedContext, bool isProtectedTexture)
+{
+    ANGLE_SKIP_TEST_IF(!IsEGLDisplayExtensionEnabled(mDisplay, "EGL_EXT_protected_content"));
+
+    bool isProtectedSurface = isProtectedTexture;
+
+    EGLConfig config = EGL_NO_CONFIG_KHR;
+    EXPECT_TRUE(chooseConfig(&config));
+    ANGLE_SKIP_TEST_IF(config == EGL_NO_CONFIG_KHR);
+
+    EGLContext context = EGL_NO_CONTEXT;
+    EXPECT_TRUE(createContext(isProtectedContext, config, &context));
+    ASSERT_EGL_SUCCESS() << "eglCreateContext failed.";
+
+    OSWindow *osWindow = OSWindow::New();
+    osWindow->initialize("ProtectedContentTest", kWidth, kHeight);
+    EGLSurface windowSurface          = EGL_NO_SURFACE;
+    EGLBoolean createWinSurfaceResult = createWindowSurface(
+        isProtectedSurface, config, osWindow->getNativeWindow(), &windowSurface);
+    EXPECT_TRUE(createWinSurfaceResult);
+    ASSERT_EGL_SUCCESS() << "eglCreateWindowSurface failed.";
+
+    EXPECT_TRUE(eglMakeCurrent(mDisplay, windowSurface, windowSurface, context));
+    ASSERT_EGL_SUCCESS() << "eglMakeCurrent failed.";
+    glViewport(0, 0, kWidth, kHeight);
+
+    if (IsGLExtensionEnabled("GL_OES_EGL_image") &&
+        IsGLExtensionEnabled("GL_EXT_protected_textures"))
+    {
+        GLuint srcTexture = 0;
+        if (isProtectedTexture && !isProtectedContext)
+        {
+            std::cout << "Can't create protected Texture for Unprotected Context, Skipping"
+                      << std::endl;
+            ASSERT_FALSE(createTexture(isProtectedTexture, &srcTexture));
+        }
+        else
+        {
+            ASSERT_TRUE(createTexture(isProtectedTexture, &srcTexture));
+            EXPECT_TRUE(fillTexture(srcTexture, GLColor::red));
+
+            EGLImage image = EGL_NO_IMAGE;
+            EXPECT_TRUE(createImage(isProtectedTexture, context, EGL_GL_TEXTURE_2D,
+                                    (void *)(static_cast<intptr_t>(srcTexture)), &image));
+
+            GLuint dstTexture = 0;
+            EXPECT_TRUE(createTextureFromImage(image, &dstTexture));
+            EXPECT_TRUE(renderTexture(dstTexture));
+
+            eglSwapBuffers(mDisplay, windowSurface);
+            ASSERT_EGL_SUCCESS() << "eglSwapBuffers failed.";
+            checkSwapBuffersResult("RED", isProtectedContext, isProtectedSurface);
+
+            glBindTexture(GL_TEXTURE_2D, 0);
+            glDeleteTextures(1, &dstTexture);
+            glDeleteTextures(1, &srcTexture);
+
+            eglDestroyImage(mDisplay, image);
+            image = EGL_NO_IMAGE;
+        }
+    }
+    else
+    {
+        std::cout << "Skipping tests, GL_OES_EGL_image or GL_EXT_protected_textures not supported"
+                  << std::endl;
+    }
+
+    EXPECT_TRUE(eglMakeCurrent(mDisplay, EGL_NO_SURFACE, EGL_NO_SURFACE, context));
+    ASSERT_EGL_SUCCESS() << "eglMakeCurrent - uncurrent failed.";
+
+    eglDestroySurface(mDisplay, windowSurface);
+    windowSurface = EGL_NO_SURFACE;
+    osWindow->destroy();
+    OSWindow::Delete(&osWindow);
+
+    eglDestroyContext(mDisplay, context);
+    context = EGL_NO_CONTEXT;
+}
+
+// Unprotected context with unprotected texture from EGL image
+TEST_P(EGLProtectedContentTest, UnprotectedContextWithUnprotectedTextureFromImage)
+{
+    textureFromImageTest(false, false);
+}
+
+// Protected context with protected texture from EGL image
+TEST_P(EGLProtectedContentTest, ProtectedContextWithProtectedTextureFromImage)
+{
+    textureFromImageTest(true, true);
+}
+
+void EGLProtectedContentTest::textureFromPbufferTest(bool isProtectedContext,
+                                                     bool isProtectedTexture)
+{
+    ANGLE_SKIP_TEST_IF(!IsEGLDisplayExtensionEnabled(mDisplay, "EGL_EXT_protected_content"));
+
+    bool isProtectedSurface = isProtectedTexture;
+
+    EGLConfig config = EGL_NO_CONFIG_KHR;
+    EXPECT_TRUE(chooseConfig(&config));
+    ANGLE_SKIP_TEST_IF(config == EGL_NO_CONFIG_KHR);
+
+    EGLContext context = EGL_NO_CONTEXT;
+    EXPECT_TRUE(createContext(isProtectedContext, config, &context));
+    ASSERT_EGL_SUCCESS() << "eglCreateContext failed.";
+
+    EGLSurface pBufferSurface = EGL_NO_SURFACE;
+    EXPECT_TRUE(createPbufferSurface(isProtectedSurface, config, &pBufferSurface));
+    ASSERT_EGL_SUCCESS() << "eglCreatePbufferSurface failed.";
+
+    EXPECT_TRUE(eglMakeCurrent(mDisplay, pBufferSurface, pBufferSurface, context));
+    ASSERT_EGL_SUCCESS() << "eglMakeCurrent failed.";
+
+    glViewport(0, 0, kWidth, kHeight);
+    glClearColor(1.0, 0.0, 0.0, 1.0);
+    glClear(GL_COLOR_BUFFER_BIT);
+
+    glFinish();
+    ASSERT_GL_NO_ERROR() << "glFinish failed";
+
+    OSWindow *osWindow = OSWindow::New();
+    osWindow->initialize("ProtectedContentTest", kWidth, kHeight);
+    EGLSurface windowSurface          = EGL_NO_SURFACE;
+    EGLBoolean createWinSurfaceResult = createWindowSurface(
+        isProtectedSurface, config, osWindow->getNativeWindow(), &windowSurface);
+    EXPECT_TRUE(createWinSurfaceResult);
+    ASSERT_EGL_SUCCESS() << "eglCreateWindowSurface failed.";
+
+    EXPECT_TRUE(eglMakeCurrent(mDisplay, windowSurface, windowSurface, context));
+    ASSERT_EGL_SUCCESS() << "eglMakeCurrent failed.";
+    glViewport(0, 0, kWidth, kHeight);
+
+    if (IsGLExtensionEnabled("GL_EXT_protected_textures"))
+    {
+        GLuint texture = 0;
+        EXPECT_TRUE(createTextureFromPbuffer(pBufferSurface, &texture));
+        EXPECT_TRUE(renderTexture(texture));
+
+        eglSwapBuffers(mDisplay, windowSurface);
+        ASSERT_EGL_SUCCESS() << "eglSwapBuffers failed.";
+        checkSwapBuffersResult("RED", isProtectedContext, isProtectedTexture);
+
+        eglReleaseTexImage(mDisplay, pBufferSurface, EGL_BACK_BUFFER);
+        glDeleteTextures(1, &texture);
+    }
+    else
+    {
+        std::cout << "Skipping tests, GL_EXT_protected_textures not supported" << std::endl;
+    }
+
+    EXPECT_TRUE(eglMakeCurrent(mDisplay, EGL_NO_SURFACE, EGL_NO_SURFACE, context));
+    ASSERT_EGL_SUCCESS() << "eglMakeCurrent - uncurrent failed.";
+
+    eglDestroySurface(mDisplay, windowSurface);
+    windowSurface = EGL_NO_SURFACE;
+    osWindow->destroy();
+    OSWindow::Delete(&osWindow);
+
+    eglDestroySurface(mDisplay, pBufferSurface);
+    pBufferSurface = EGL_NO_SURFACE;
+
+    eglDestroyContext(mDisplay, context);
+    context = EGL_NO_CONTEXT;
+}
+
+// Unprotected context with unprotected texture from BindTex of PBufferSurface
+TEST_P(EGLProtectedContentTest, UnprotectedContextWithUnprotectedTextureFromPBuffer)
+{
+    textureFromPbufferTest(false, false);
+}
+
+// Protected context with protected texture from BindTex of PBufferSurface
+TEST_P(EGLProtectedContentTest, ProtectedContextWithProtectedTextureFromPbuffer)
+{
+    textureFromPbufferTest(true, true);
+}
+
+void EGLProtectedContentTest::textureFromAndroidNativeBufferTest(bool isProtectedContext,
+                                                                 bool isProtectedTexture)
+{
+    ANGLE_SKIP_TEST_IF(!IsEGLDisplayExtensionEnabled(mDisplay, "EGL_EXT_protected_content"));
+    ANGLE_SKIP_TEST_IF(
+        !IsEGLDisplayExtensionEnabled(mDisplay, "EGL_ANDROID_get_native_client_buffer"));
+    ANGLE_SKIP_TEST_IF(!IsEGLDisplayExtensionEnabled(mDisplay, "EGL_ANDROID_image_native_buffer"));
+
+    bool isProtectedSurface = isProtectedTexture;
+
+    EGLConfig config = EGL_NO_CONFIG_KHR;
+    EXPECT_TRUE(chooseConfig(&config));
+    ANGLE_SKIP_TEST_IF(config == EGL_NO_CONFIG_KHR);
+
+    EGLContext context = EGL_NO_CONTEXT;
+    EXPECT_TRUE(createContext(isProtectedContext, config, &context));
+    ASSERT_EGL_SUCCESS() << "eglCreateContext failed.";
+
+    OSWindow *osWindow = OSWindow::New();
+    osWindow->initialize("ProtectedContentTest", kWidth, kHeight);
+    EGLSurface windowSurface          = EGL_NO_SURFACE;
+    EGLBoolean createWinSurfaceResult = createWindowSurface(
+        isProtectedSurface, config, osWindow->getNativeWindow(), &windowSurface);
+    EXPECT_TRUE(createWinSurfaceResult);
+    ASSERT_EGL_SUCCESS() << "eglCreateWindowSurface failed.";
+
+    EXPECT_TRUE(eglMakeCurrent(mDisplay, windowSurface, windowSurface, context));
+    ASSERT_EGL_SUCCESS() << "eglMakeCurrent failed.";
+    glViewport(0, 0, kWidth, kHeight);
+
+    if (IsGLExtensionEnabled("GL_EXT_protected_textures"))
+    {
+        EGLClientBuffer clientBuffer = nullptr;
+        EXPECT_TRUE(createAndroidClientBuffer(isProtectedTexture, false, true, &clientBuffer));
+
+        EGLImage image = EGL_NO_IMAGE;
+        EXPECT_TRUE(createImage(isProtectedTexture, EGL_NO_CONTEXT, EGL_NATIVE_BUFFER_ANDROID,
+                                clientBuffer, &image));
+
+        GLuint texture = 0;
+        if (isProtectedTexture && !isProtectedContext)
+        {
+            std::cout << "Can't create protected Texture for Unprotected Context, Skipping"
+                      << std::endl;
+            ASSERT_FALSE(createTextureFromImage(image, &texture));
+        }
+        else
+        {
+            EXPECT_TRUE(createTextureFromImage(image, &texture));
+            EXPECT_TRUE(fillTexture(texture, GLColor::red));
+            EXPECT_TRUE(renderTexture(texture));
+
+            eglSwapBuffers(mDisplay, windowSurface);
+            ASSERT_EGL_SUCCESS() << "eglSwapBuffers failed.";
+            checkSwapBuffersResult("RED", isProtectedContext, isProtectedTexture);
+
+            glBindTexture(GL_TEXTURE_2D, 0);
+            glDeleteTextures(1, &texture);
+
+            eglDestroyImage(mDisplay, image);
+            image = EGL_NO_IMAGE;
+        }
+    }
+    else
+    {
+        std::cout << "Skipping tests, GL_EXT_protected_textures not supported" << std::endl;
+    }
+
+    EXPECT_TRUE(eglMakeCurrent(mDisplay, EGL_NO_SURFACE, EGL_NO_SURFACE, context));
+    ASSERT_EGL_SUCCESS() << "eglMakeCurrent - uncurrent failed.";
+
+    eglDestroySurface(mDisplay, windowSurface);
+    windowSurface = EGL_NO_SURFACE;
+    osWindow->destroy();
+    OSWindow::Delete(&osWindow);
+
+    eglDestroyContext(mDisplay, context);
+    context = EGL_NO_CONTEXT;
+}
+
+// Unprotected context with unprotected texture from EGL image from Android native buffer
+TEST_P(EGLProtectedContentTest, UnprotectedContextWithUnprotectedTextureFromAndroidNativeBuffer)
+{
+    textureFromAndroidNativeBufferTest(false, false);
+}
+
+// Protected context with protected texture from EGL image from Android native buffer
+TEST_P(EGLProtectedContentTest, ProtectedContextWithProtectedTextureFromAndroidNativeBuffer)
+{
+    textureFromAndroidNativeBufferTest(true, true);
 }
 
 ANGLE_INSTANTIATE_TEST(EGLProtectedContentTest,
+                       WithNoFixture(ES2_OPENGLES()),
+                       WithNoFixture(ES3_OPENGLES()),
                        WithNoFixture(ES2_VULKAN()),
                        WithNoFixture(ES3_VULKAN()));
diff --git a/src/tests/egl_tests/EGLSurfaceTest.cpp b/src/tests/egl_tests/EGLSurfaceTest.cpp
index 1a69632..67d53fb 100644
--- a/src/tests/egl_tests/EGLSurfaceTest.cpp
+++ b/src/tests/egl_tests/EGLSurfaceTest.cpp
@@ -139,14 +139,22 @@
 
     void initializeContext()
     {
-        initializeSingleContext(&mContext);
-        initializeSingleContext(&mSecondContext);
+        // Only initialize the contexts once.
+        if (mContext == EGL_NO_CONTEXT)
+        {
+            initializeSingleContext(&mContext);
+        }
+        if (mSecondContext == EGL_NO_CONTEXT)
+        {
+            initializeSingleContext(&mSecondContext);
+        }
     }
 
-    void initializeSurfaceWithAttribs(EGLConfig config,
-                                      const std::vector<EGLint> &additionalAttributes)
+    void initializeWindowSurfaceWithAttribs(EGLConfig config,
+                                            const std::vector<EGLint> &additionalAttributes,
+                                            EGLenum expectedResult)
     {
-        mConfig = config;
+        ASSERT_EQ(mWindowSurface, EGL_NO_SURFACE);
 
         EGLint surfaceType = EGL_NONE;
         eglGetConfigAttrib(mDisplay, mConfig, EGL_SURFACE_TYPE, &surfaceType);
@@ -159,7 +167,22 @@
             // Create first window surface
             mWindowSurface = eglCreateWindowSurface(mDisplay, mConfig, mOSWindow->getNativeWindow(),
                                                     windowAttributes.data());
-            ASSERT_EGL_SUCCESS();
+        }
+
+        ASSERT_EGLENUM_EQ(eglGetError(), expectedResult);
+    }
+
+    void initializeSurfaceWithAttribs(EGLConfig config,
+                                      const std::vector<EGLint> &additionalAttributes)
+    {
+        mConfig = config;
+
+        EGLint surfaceType = EGL_NONE;
+        eglGetConfigAttrib(mDisplay, mConfig, EGL_SURFACE_TYPE, &surfaceType);
+
+        if (surfaceType & EGL_WINDOW_BIT)
+        {
+            initializeWindowSurfaceWithAttribs(config, additionalAttributes, EGL_SUCCESS);
         }
 
         if (surfaceType & EGL_PBUFFER_BIT)
@@ -283,6 +306,8 @@
         glClear(GL_COLOR_BUFFER_BIT);
     }
 
+    void drawQuadThenTearDown();
+
     EGLDisplay mDisplay;
     EGLSurface mWindowSurface;
     EGLSurface mPbufferSurface;
@@ -469,7 +494,6 @@
 
     initializeDisplay();
     initializeSurfaceWithDefaultConfig(true);
-    initializeContext();
     ASSERT_NE(mWindowSurface, EGL_NO_SURFACE);
 
     eglMakeCurrent(mDisplay, mWindowSurface, mWindowSurface, mContext);
@@ -898,6 +922,11 @@
 
     // Use the same surface for both draw and read
     EXPECT_EGL_TRUE(eglMakeCurrent(mDisplay, firstPbufferSurface, firstPbufferSurface, mContext));
+
+    // TODO(http://www.anglebug.com/6284): Failing with OpenGL ES backend on Android.
+    // Must be after the eglMakeCurrent() so the renderer string is initialized.
+    ANGLE_SKIP_TEST_IF(IsOpenGLES() && IsAndroid());
+
     glClearColor(GLColor::red.R, GLColor::red.G, GLColor::red.B, GLColor::red.A);
     glClear(GL_COLOR_BUFFER_BIT);
     ASSERT_GL_NO_ERROR();
@@ -1202,6 +1231,112 @@
 
 #endif  // ANGLE_ENABLE_D3D11
 
+// Verify bliting between two surfaces works correctly.
+TEST_P(EGLSurfaceTest3, BlitBetweenSurfaces)
+{
+    initializeDisplay();
+    ASSERT_NE(mDisplay, EGL_NO_DISPLAY);
+
+    initializeSurfaceWithDefaultConfig(true);
+    ASSERT_NE(mWindowSurface, EGL_NO_SURFACE);
+    ASSERT_NE(mContext, EGL_NO_CONTEXT);
+
+    EGLSurface surface1;
+    EGLSurface surface2;
+
+    const EGLint surfaceAttributes[] = {
+        EGL_WIDTH, 64, EGL_HEIGHT, 64, EGL_NONE,
+    };
+
+    surface1 = eglCreatePbufferSurface(mDisplay, mConfig, surfaceAttributes);
+    ASSERT_EGL_SUCCESS();
+    surface2 = eglCreatePbufferSurface(mDisplay, mConfig, surfaceAttributes);
+    ASSERT_EGL_SUCCESS();
+
+    // Clear surface1.
+    EXPECT_EGL_TRUE(eglMakeCurrent(mDisplay, surface1, surface1, mContext));
+
+    // TODO(http://www.anglebug.com/6284): Failing with OpenGL ES backend on Android and Windows.
+    // Must be after the eglMakeCurrent() so the renderer string is initialized.
+    ANGLE_SKIP_TEST_IF(IsOpenGLES() && (IsAndroid() || IsWindows()));
+
+    glClearColor(GLColor::red.R, GLColor::red.G, GLColor::red.B, GLColor::red.A);
+    glClear(GL_COLOR_BUFFER_BIT);
+    ASSERT_GL_NO_ERROR();
+
+    // Blit from surface1 to surface2.
+    EXPECT_EGL_TRUE(eglMakeCurrent(mDisplay, surface2, surface1, mContext));
+    glBlitFramebuffer(0, 0, 64, 64, 0, 0, 64, 64, GL_COLOR_BUFFER_BIT, GL_NEAREST);
+    ASSERT_GL_NO_ERROR();
+
+    // Confirm surface1 has the clear color.
+    EXPECT_EGL_TRUE(eglMakeCurrent(mDisplay, surface1, surface1, mContext));
+    EXPECT_PIXEL_COLOR_EQ(32, 32, GLColor::red);
+
+    // Confirm surface2 has the blited clear color.
+    EXPECT_EGL_TRUE(eglMakeCurrent(mDisplay, surface2, surface2, mContext));
+    EXPECT_PIXEL_COLOR_EQ(32, 32, GLColor::red);
+
+    eglDestroySurface(mDisplay, surface1);
+    eglDestroySurface(mDisplay, surface2);
+}
+
+// Verify bliting between two surfaces works correctly.
+TEST_P(EGLSurfaceTest3, BlitBetweenSurfacesWithDeferredClear)
+{
+    initializeDisplay();
+    ASSERT_NE(mDisplay, EGL_NO_DISPLAY);
+
+    initializeSurfaceWithDefaultConfig(true);
+    ASSERT_NE(mWindowSurface, EGL_NO_SURFACE);
+    ASSERT_NE(mContext, EGL_NO_CONTEXT);
+
+    EGLSurface surface1;
+    EGLSurface surface2;
+
+    const EGLint surfaceAttributes[] = {
+        EGL_WIDTH, 64, EGL_HEIGHT, 64, EGL_NONE,
+    };
+
+    surface1 = eglCreatePbufferSurface(mDisplay, mConfig, surfaceAttributes);
+    ASSERT_EGL_SUCCESS();
+    surface2 = eglCreatePbufferSurface(mDisplay, mConfig, surfaceAttributes);
+    ASSERT_EGL_SUCCESS();
+
+    // Clear surface1.
+    EXPECT_EGL_TRUE(eglMakeCurrent(mDisplay, surface1, surface1, mContext));
+
+    // TODO(http://www.anglebug.com/6284): Failing with OpenGL ES backend on Android and Windows.
+    // Must be after the eglMakeCurrent() so the renderer string is initialized.
+    ANGLE_SKIP_TEST_IF(IsOpenGLES() && (IsAndroid() || IsWindows()));
+
+    glClearColor(GLColor::red.R, GLColor::red.G, GLColor::red.B, GLColor::red.A);
+    glClear(GL_COLOR_BUFFER_BIT);
+    ASSERT_GL_NO_ERROR();
+    // Force the clear to be flushed
+    EXPECT_PIXEL_COLOR_EQ(32, 32, GLColor::red);
+
+    // Clear to green, but don't read it back so the clear is deferred.
+    glClearColor(GLColor::green.R, GLColor::green.G, GLColor::green.B, GLColor::green.A);
+    glClear(GL_COLOR_BUFFER_BIT);
+    ASSERT_GL_NO_ERROR();
+
+    // Blit from surface1 to surface2.
+    EXPECT_EGL_TRUE(eglMakeCurrent(mDisplay, surface2, surface1, mContext));
+    glBlitFramebuffer(0, 0, 64, 64, 0, 0, 64, 64, GL_COLOR_BUFFER_BIT, GL_NEAREST);
+    ASSERT_GL_NO_ERROR();
+
+    // Confirm surface1 has the clear color.
+    EXPECT_PIXEL_COLOR_EQ(32, 32, GLColor::green);
+
+    // Confirm surface2 has the blited clear color.
+    EXPECT_EGL_TRUE(eglMakeCurrent(mDisplay, surface2, surface2, mContext));
+    EXPECT_PIXEL_COLOR_EQ(32, 32, GLColor::green);
+
+    eglDestroySurface(mDisplay, surface1);
+    eglDestroySurface(mDisplay, surface2);
+}
+
 // Verify switching between a surface with robust resource init and one without still clears alpha.
 TEST_P(EGLSurfaceTest, RobustResourceInitAndEmulatedAlpha)
 {
@@ -1298,6 +1433,78 @@
         eglSwapBuffers(mDisplay, mWindowSurface);
     }
 }
+
+void EGLSurfaceTest::drawQuadThenTearDown()
+{
+    initializeSingleContext(&mContext);
+
+    eglMakeCurrent(mDisplay, mWindowSurface, mWindowSurface, mContext);
+    ASSERT_EGL_SUCCESS();
+
+    {
+        ANGLE_GL_PROGRAM(greenProgram, essl1_shaders::vs::Simple(), essl1_shaders::fs::Green());
+        drawQuad(greenProgram, essl1_shaders::PositionAttrib(), 0.5f);
+        EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::green);
+        eglSwapBuffers(mDisplay, mWindowSurface);
+        ASSERT_EGL_SUCCESS();
+    }
+
+    tearDownContextAndSurface();
+}
+
+// Tests the EGL_ANGLE_create_surface_swap_interval extension if available.
+TEST_P(EGLSurfaceTest, CreateSurfaceSwapIntervalANGLE)
+{
+    initializeDisplay();
+    ASSERT_NE(mDisplay, EGL_NO_DISPLAY);
+
+    mConfig = chooseDefaultConfig(true);
+    ASSERT_NE(mConfig, nullptr);
+
+    if (IsEGLDisplayExtensionEnabled(mDisplay, "EGL_ANGLE_create_surface_swap_interval"))
+    {
+        // Test error conditions.
+        EGLint minSwapInterval = 0;
+        eglGetConfigAttrib(mDisplay, mConfig, EGL_MIN_SWAP_INTERVAL, &minSwapInterval);
+        ASSERT_EGL_SUCCESS();
+
+        if (minSwapInterval > 0)
+        {
+            std::vector<EGLint> min1SwapAttribs = {EGL_SWAP_INTERVAL_ANGLE, minSwapInterval - 1};
+            initializeWindowSurfaceWithAttribs(mConfig, min1SwapAttribs, EGL_BAD_ATTRIBUTE);
+        }
+
+        EGLint maxSwapInterval = 0;
+        eglGetConfigAttrib(mDisplay, mConfig, EGL_MAX_SWAP_INTERVAL, &maxSwapInterval);
+        ASSERT_EGL_SUCCESS();
+
+        if (maxSwapInterval < std::numeric_limits<EGLint>::max())
+        {
+            std::vector<EGLint> max1SwapAttribs = {EGL_SWAP_INTERVAL_ANGLE, maxSwapInterval + 1};
+            initializeWindowSurfaceWithAttribs(mConfig, max1SwapAttribs, EGL_BAD_ATTRIBUTE);
+        }
+
+        // Test valid min/max usage.
+        {
+            std::vector<EGLint> minSwapAttribs = {EGL_SWAP_INTERVAL_ANGLE, minSwapInterval};
+            initializeWindowSurfaceWithAttribs(mConfig, minSwapAttribs, EGL_SUCCESS);
+            drawQuadThenTearDown();
+        }
+
+        if (minSwapInterval != maxSwapInterval)
+        {
+            std::vector<EGLint> maxSwapAttribs = {EGL_SWAP_INTERVAL_ANGLE, maxSwapInterval};
+            initializeWindowSurfaceWithAttribs(mConfig, maxSwapAttribs, EGL_SUCCESS);
+            drawQuadThenTearDown();
+        }
+    }
+    else
+    {
+        // Test extension unavailable error.
+        std::vector<EGLint> swapInterval1Attribs = {EGL_SWAP_INTERVAL_ANGLE, 1};
+        initializeWindowSurfaceWithAttribs(mConfig, swapInterval1Attribs, EGL_BAD_ATTRIBUTE);
+    }
+}
 }  // anonymous namespace
 
 ANGLE_INSTANTIATE_TEST(EGLSurfaceTest,
@@ -1321,7 +1528,11 @@
                        WithNoFixture(ES3_VULKAN()));
 
 GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(EGLSurfaceTest3);
-ANGLE_INSTANTIATE_TEST(EGLSurfaceTest3, WithNoFixture(ES3_VULKAN()));
+ANGLE_INSTANTIATE_TEST(EGLSurfaceTest3,
+                       WithNoFixture(ES3_D3D11()),
+                       WithNoFixture(ES3_OPENGLES()),
+                       WithNoFixture(ES3_VULKAN()),
+                       WithNoFixture(ES3_VULKAN_SWIFTSHADER()));
 
 #if defined(ANGLE_ENABLE_D3D11)
 ANGLE_INSTANTIATE_TEST(EGLSurfaceTestD3D11, WithNoFixture(ES2_D3D11()), WithNoFixture(ES3_D3D11()));
diff --git a/src/tests/gl_tests/AtomicCounterBufferTest.cpp b/src/tests/gl_tests/AtomicCounterBufferTest.cpp
index 2415f8b..f5e4d27 100644
--- a/src/tests/gl_tests/AtomicCounterBufferTest.cpp
+++ b/src/tests/gl_tests/AtomicCounterBufferTest.cpp
@@ -177,6 +177,52 @@
     EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::white);
 }
 
+// Test a bug in vulkan back-end where recreating the atomic counter storage should trigger state
+// update in the context
+TEST_P(AtomicCounterBufferTest31, DependentAtomicCounterBufferChange)
+{
+    // Skipping test while we work on enabling atomic counter buffer support in th D3D renderer.
+    // http://anglebug.com/1729
+    ANGLE_SKIP_TEST_IF(IsD3D11());
+
+    constexpr char kFS[] =
+        "#version 310 es\n"
+        "precision highp float;\n"
+        "layout(binding = 0, offset = 4) uniform atomic_uint ac;\n"
+        "out highp vec4 my_color;\n"
+        "void main()\n"
+        "{\n"
+        "    my_color = vec4(0.0);\n"
+        "    uint a1 = atomicCounter(ac);\n"
+        "    if (a1 == 3u) my_color = vec4(1.0);\n"
+        "    if (a1 == 19u) my_color = vec4(1.0, 0.0, 0.0, 1.0);\n"
+        "}\n";
+
+    ANGLE_GL_PROGRAM(program, essl31_shaders::vs::Simple(), kFS);
+
+    glUseProgram(program.get());
+
+    // The initial value of counter 'ac' is 3u.
+    unsigned int bufferDataLeft[3] = {11u, 3u, 1u};
+    GLBuffer atomicCounterBuffer;
+    glBindBuffer(GL_ATOMIC_COUNTER_BUFFER, atomicCounterBuffer);
+    glBufferData(GL_ATOMIC_COUNTER_BUFFER, sizeof(bufferDataLeft), bufferDataLeft, GL_STATIC_DRAW);
+
+    glBindBufferBase(GL_ATOMIC_COUNTER_BUFFER, 0, atomicCounterBuffer);
+    // Draw left quad
+    glViewport(0, 0, getWindowWidth() / 2, getWindowHeight());
+    drawQuad(program.get(), essl31_shaders::PositionAttrib(), 0.0f);
+    // Draw right quad
+    unsigned int bufferDataRight[3] = {11u, 19u, 1u};
+    glBufferData(GL_ATOMIC_COUNTER_BUFFER, sizeof(bufferDataRight), bufferDataRight,
+                 GL_STATIC_DRAW);
+    glViewport(getWindowWidth() / 2, 0, getWindowWidth() / 2, getWindowHeight());
+    drawQuad(program.get(), essl31_shaders::PositionAttrib(), 0.0f);
+    ASSERT_GL_NO_ERROR();
+    EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::white);
+    EXPECT_PIXEL_COLOR_EQ(getWindowWidth() / 2, 0, GLColor::red);
+}
+
 // Updating atomic counter buffer's offsets was optimized based on a count of valid bindings.
 // This test will fail if there are bugs in how we count valid bindings.
 TEST_P(AtomicCounterBufferTest31, AtomicCounterBufferRangeRead)
diff --git a/src/tests/gl_tests/BlitFramebufferANGLETest.cpp b/src/tests/gl_tests/BlitFramebufferANGLETest.cpp
index 61f462c..affed96 100644
--- a/src/tests/gl_tests/BlitFramebufferANGLETest.cpp
+++ b/src/tests/gl_tests/BlitFramebufferANGLETest.cpp
@@ -9,6 +9,8 @@
 
 using namespace angle;
 
+namespace
+{
 class BlitFramebufferANGLETest : public ANGLETest
 {
   protected:
@@ -1244,6 +1246,9 @@
     }
 };
 
+class BlitFramebufferTestES31 : public BlitFramebufferTest
+{};
+
 // Tests resolving a multisample depth buffer.
 TEST_P(BlitFramebufferTest, MultisampleDepth)
 {
@@ -2632,6 +2637,67 @@
     EXPECT_PIXEL_RECT_EQ(64, 0, 128, 1, GLColor::blue);
 }
 
+// Test that a draw call to a small FBO followed by a resolve of a large FBO works.
+TEST_P(BlitFramebufferTestES31, DrawToSmallFBOThenResolveLargeFBO)
+{
+    GLFramebuffer fboMS[2];
+    GLTexture textureMS[2];
+    GLFramebuffer fboSS;
+    GLTexture textureSS;
+
+    // A bug in the Vulkan backend grew the render area of the previous render pass on blit, even
+    // though the previous render pass belonged to an unrelated framebuffer.  This test only needs
+    // to make sure that the FBO being resolved is not strictly smaller than the previous FBO which
+    // was drawn to.
+    constexpr GLsizei kLargeWidth  = 127;
+    constexpr GLsizei kLargeHeight = 54;
+    constexpr GLsizei kSmallWidth  = 37;
+    constexpr GLsizei kSmallHeight = 79;
+
+    ANGLE_GL_PROGRAM(drawRed, essl1_shaders::vs::Simple(), essl1_shaders::fs::Red());
+
+    // Create resolve target.
+    glBindTexture(GL_TEXTURE_2D, textureSS);
+    glTexStorage2D(GL_TEXTURE_2D, 1, GL_RGBA8, kLargeWidth, kLargeHeight);
+
+    glBindFramebuffer(GL_FRAMEBUFFER, fboSS);
+    glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, textureSS, 0);
+    ASSERT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
+
+    // Create multisampled framebuffers and draw into them one by one.
+    for (size_t fboIndex = 0; fboIndex < 2; ++fboIndex)
+    {
+        const GLsizei width  = fboIndex == 0 ? kLargeWidth : kSmallWidth;
+        const GLsizei height = fboIndex == 0 ? kLargeHeight : kSmallHeight;
+
+        glBindTexture(GL_TEXTURE_2D_MULTISAMPLE, textureMS[fboIndex]);
+        glTexStorage2DMultisample(GL_TEXTURE_2D_MULTISAMPLE, 4, GL_RGBA8, width, height, GL_TRUE);
+
+        glBindFramebuffer(GL_FRAMEBUFFER, fboMS[fboIndex]);
+        glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D_MULTISAMPLE,
+                               textureMS[fboIndex], 0);
+        ASSERT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
+
+        glViewport(0, 0, width, height);
+        drawQuad(drawRed, essl1_shaders::PositionAttrib(), 0.8f);
+        EXPECT_GL_NO_ERROR();
+    }
+
+    // Resolve the first FBO
+    glBindFramebuffer(GL_DRAW_FRAMEBUFFER, fboSS);
+    glBindFramebuffer(GL_READ_FRAMEBUFFER, fboMS[0]);
+
+    glViewport(0, 0, kLargeWidth, kLargeHeight);
+    glBlitFramebuffer(0, 0, kLargeWidth, kLargeHeight, 0, 0, kLargeWidth, kLargeHeight,
+                      GL_COLOR_BUFFER_BIT, GL_NEAREST);
+    EXPECT_GL_NO_ERROR();
+
+    // Verify the resolve
+    glBindFramebuffer(GL_READ_FRAMEBUFFER, fboSS);
+    EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::red);
+    EXPECT_PIXEL_COLOR_EQ(kLargeWidth - 1, kLargeHeight - 1, GLColor::red);
+}
+
 // Use this to select which configurations (e.g. which renderer, which GLES major version) these
 // tests should be run against.
 GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(BlitFramebufferANGLETest);
@@ -2651,3 +2717,7 @@
 
 GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(BlitFramebufferTest);
 ANGLE_INSTANTIATE_TEST_ES3_AND(BlitFramebufferTest, WithNoShaderStencilOutput(ES3_METAL()));
+
+GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(BlitFramebufferTestES31);
+ANGLE_INSTANTIATE_TEST_ES31(BlitFramebufferTestES31);
+}  // namespace
diff --git a/src/tests/gl_tests/BufferDataTest.cpp b/src/tests/gl_tests/BufferDataTest.cpp
index 4a44b5d..b3e70c7 100644
--- a/src/tests/gl_tests/BufferDataTest.cpp
+++ b/src/tests/gl_tests/BufferDataTest.cpp
@@ -746,6 +746,24 @@
     EXPECT_PIXEL_COLOR_EQ(3, 3, GLColor::green);
 }
 
+// Tests a null crash bug caused by copying from null back-end buffer pointer
+// when calling bufferData again after drawing without calling bufferData in D3D11.
+TEST_P(BufferDataTestES3, DrawWithNotCallingBufferData)
+{
+    ANGLE_GL_PROGRAM(drawRed, essl3_shaders::vs::Simple(), essl3_shaders::fs::Red());
+    glUseProgram(drawRed);
+
+    GLint mem = 0;
+    GLBuffer buffer;
+    glBindBuffer(GL_ARRAY_BUFFER, buffer);
+    glEnableVertexAttribArray(0);
+    glVertexAttribPointer(0, 4, GL_FLOAT, GL_FALSE, 0, 0);
+    glDrawArrays(GL_TRIANGLES, 0, 3);
+    glBindBuffer(GL_COPY_WRITE_BUFFER, buffer);
+    glBufferData(GL_COPY_WRITE_BUFFER, 1, &mem, GL_STREAM_DRAW);
+    ASSERT_GL_NO_ERROR();
+}
+
 // Tests a bug where copying buffer data immediately after creation hit a nullptr in D3D11.
 TEST_P(BufferDataTestES3, NoBufferInitDataCopyBug)
 {
@@ -783,10 +801,9 @@
     glBufferData(GL_ARRAY_BUFFER, data1.size(), data1.data(), GL_STATIC_DRAW);
 
     // Map the buffer once
-    void *mappedBuffer =
-        glMapBufferRange(GL_ARRAY_BUFFER, 0, data1.size(),
-                         GL_MAP_WRITE_BIT | GL_MAP_INVALIDATE_BUFFER_BIT |
-                             GL_MAP_FLUSH_EXPLICIT_BIT | GL_MAP_UNSYNCHRONIZED_BIT);
+    glMapBufferRange(GL_ARRAY_BUFFER, 0, data1.size(),
+                     GL_MAP_WRITE_BIT | GL_MAP_INVALIDATE_BUFFER_BIT | GL_MAP_FLUSH_EXPLICIT_BIT |
+                         GL_MAP_UNSYNCHRONIZED_BIT);
 
     // Then repopulate the buffer. This should cause the buffer to become unmapped.
     glBufferData(GL_ARRAY_BUFFER, data2.size(), data2.data(), GL_STATIC_DRAW);
@@ -798,9 +815,9 @@
     EXPECT_GL_ERROR(GL_INVALID_OPERATION);
 
     // Try to map the buffer again, which should succeed
-    mappedBuffer = glMapBufferRange(GL_ARRAY_BUFFER, 0, data2.size(),
-                                    GL_MAP_WRITE_BIT | GL_MAP_INVALIDATE_BUFFER_BIT |
-                                        GL_MAP_FLUSH_EXPLICIT_BIT | GL_MAP_UNSYNCHRONIZED_BIT);
+    glMapBufferRange(GL_ARRAY_BUFFER, 0, data2.size(),
+                     GL_MAP_WRITE_BIT | GL_MAP_INVALIDATE_BUFFER_BIT | GL_MAP_FLUSH_EXPLICIT_BIT |
+                         GL_MAP_UNSYNCHRONIZED_BIT);
     ASSERT_GL_NO_ERROR();
 }
 
@@ -1030,6 +1047,86 @@
     EXPECT_EQ(data, actualData);
 }
 
+// Verify persistently mapped buffers can use glCopyBufferSubData
+// Tests a pattern used by Fortnite's GLES backend
+TEST_P(BufferStorageTestES3, StorageCopyBufferSubDataMapped)
+{
+    ANGLE_SKIP_TEST_IF(getClientMajorVersion() < 3 ||
+                       !IsGLExtensionEnabled("GL_EXT_buffer_storage") ||
+                       !IsGLExtensionEnabled("GL_EXT_map_buffer_range"));
+
+    const std::array<GLColor, 4> kInitialData = {GLColor::red, GLColor::green, GLColor::blue,
+                                                 GLColor::yellow};
+
+    // Set up the read buffer
+    GLBuffer readBuffer;
+    glBindBuffer(GL_ARRAY_BUFFER, readBuffer.get());
+    glBufferData(GL_ARRAY_BUFFER, sizeof(kInitialData), kInitialData.data(), GL_DYNAMIC_DRAW);
+
+    // Set up the write buffer to be persistently mapped
+    GLBuffer writeBuffer;
+    glBindBuffer(GL_COPY_WRITE_BUFFER, writeBuffer.get());
+    glBufferStorageEXT(GL_COPY_WRITE_BUFFER, 16, nullptr,
+                       GL_MAP_READ_BIT | GL_MAP_PERSISTENT_BIT_EXT | GL_MAP_COHERENT_BIT_EXT);
+    void *readMapPtr =
+        glMapBufferRange(GL_COPY_WRITE_BUFFER, 0, 16,
+                         GL_MAP_READ_BIT | GL_MAP_PERSISTENT_BIT_EXT | GL_MAP_COHERENT_BIT_EXT);
+    ASSERT_NE(nullptr, readMapPtr);
+    ASSERT_GL_NO_ERROR();
+
+    // Verify we can copy into the write buffer
+    glBindBuffer(GL_COPY_READ_BUFFER, readBuffer.get());
+    glCopyBufferSubData(GL_COPY_READ_BUFFER, GL_COPY_WRITE_BUFFER, 0, 0, 16);
+    ASSERT_GL_NO_ERROR();
+
+    // Flush the buffer.
+    glFinish();
+
+    // Check the contents
+    std::array<GLColor, 4> resultingData;
+    memcpy(resultingData.data(), readMapPtr, resultingData.size() * sizeof(GLColor));
+    glUnmapBuffer(GL_COPY_WRITE_BUFFER);
+    EXPECT_EQ(kInitialData, resultingData);
+    ASSERT_GL_NO_ERROR();
+}
+
+// Verify persistently mapped buffers can use glBufferSubData
+TEST_P(BufferStorageTestES3, StorageBufferSubDataMapped)
+{
+    ANGLE_SKIP_TEST_IF(getClientMajorVersion() < 3 ||
+                       !IsGLExtensionEnabled("GL_EXT_buffer_storage") ||
+                       !IsGLExtensionEnabled("GL_EXT_map_buffer_range"));
+
+    const std::array<GLColor, 4> kUpdateData1 = {GLColor::red, GLColor::green, GLColor::blue,
+                                                 GLColor::yellow};
+
+    // Set up the buffer to be persistently mapped and dynamic
+    GLBuffer buffer;
+    glBindBuffer(GL_ARRAY_BUFFER, buffer.get());
+    glBufferStorageEXT(GL_ARRAY_BUFFER, 16, nullptr,
+                       GL_MAP_READ_BIT | GL_MAP_WRITE_BIT | GL_MAP_PERSISTENT_BIT_EXT |
+                           GL_MAP_COHERENT_BIT_EXT | GL_DYNAMIC_STORAGE_BIT_EXT);
+    void *readMapPtr = glMapBufferRange(
+        GL_ARRAY_BUFFER, 0, 16,
+        GL_MAP_READ_BIT | GL_MAP_WRITE_BIT | GL_MAP_PERSISTENT_BIT_EXT | GL_MAP_COHERENT_BIT_EXT);
+    ASSERT_NE(nullptr, readMapPtr);
+    ASSERT_GL_NO_ERROR();
+
+    // Verify we can push new data into the buffer
+    glBufferSubData(GL_ARRAY_BUFFER, 0, sizeof(GLColor) * kUpdateData1.size(), kUpdateData1.data());
+    ASSERT_GL_NO_ERROR();
+
+    // Flush the buffer.
+    glFinish();
+
+    // Check the contents
+    std::array<GLColor, 4> persistentData1;
+    memcpy(persistentData1.data(), readMapPtr, persistentData1.size() * sizeof(GLColor));
+    EXPECT_EQ(kUpdateData1, persistentData1);
+    glUnmapBuffer(GL_ARRAY_BUFFER);
+    ASSERT_GL_NO_ERROR();
+}
+
 ANGLE_INSTANTIATE_TEST_ES2(BufferDataTest);
 
 GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(BufferDataTestES3);
diff --git a/src/tests/gl_tests/ClipDistanceTest.cpp b/src/tests/gl_tests/ClipDistanceTest.cpp
index f67573a..3672500 100644
--- a/src/tests/gl_tests/ClipDistanceTest.cpp
+++ b/src/tests/gl_tests/ClipDistanceTest.cpp
@@ -1371,9 +1371,9 @@
     }
 }
 
-// Use this to select which configurations (e.g. which renderer, which GLES major version) these
-// tests should be run against.
-ANGLE_INSTANTIATE_TEST_ES2_AND_ES3(ClipDistanceTest);
+ANGLE_INSTANTIATE_TEST_ES2_AND_ES3_AND(ClipDistanceTest, WithDirectSPIRVGeneration(ES3_VULKAN()));
 
 GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(ClipCullDistanceTest);
-ANGLE_INSTANTIATE_TEST_ES3_AND_ES31(ClipCullDistanceTest);
+ANGLE_INSTANTIATE_TEST_ES3_AND_ES31_AND(ClipCullDistanceTest,
+                                        WithDirectSPIRVGeneration(ES3_VULKAN()),
+                                        WithDirectSPIRVGeneration(ES31_VULKAN()));
diff --git a/src/tests/gl_tests/CompressedTextureFormatsTest.cpp b/src/tests/gl_tests/CompressedTextureFormatsTest.cpp
new file mode 100644
index 0000000..0680d49
--- /dev/null
+++ b/src/tests/gl_tests/CompressedTextureFormatsTest.cpp
@@ -0,0 +1,621 @@
+//
+// Copyright 2021 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.
+//
+// CompressedTextureFormatsTest:
+//   Tests that only the appropriate entry points are affected after
+//   enabling compressed texture extensions.
+//
+
+#include "libANGLE/capture/gl_enum_utils.h"
+#include "test_utils/ANGLETest.h"
+#include "test_utils/gl_raii.h"
+
+using namespace angle;
+
+namespace
+{
+
+using FormatDesc                  = std::pair<GLenum, GLsizei>;
+using CompressedTextureTestParams = std::tuple<angle::PlatformParameters, FormatDesc>;
+
+class CompressedTextureFormatsTest : public ANGLETestWithParam<CompressedTextureTestParams>
+{
+  public:
+    CompressedTextureFormatsTest(const std::string ext1,
+                                 const std::string ext2,
+                                 const bool supportsUpdates,
+                                 const bool supports2DArray,
+                                 const bool supports3D,
+                                 const bool alwaysOnES3)
+        : mExtNames({ext1, ext2}),
+          mSupportsUpdates(supportsUpdates),
+          mSupports2DArray(supports2DArray),
+          mSupports3D(supports3D),
+          mAlwaysOnES3(alwaysOnES3)
+    {
+        setExtensionsEnabled(false);
+    }
+
+    void testSetUp() override
+    {
+        // Older Metal versions do not support compressed TEXTURE_3D.
+        mDisableTexture3D = IsMetal() && !IsMetalCompressedTexture3DAvailable();
+    }
+
+    void checkSubImage2D(GLenum format, GLsizei size)
+    {
+        GLubyte data[32];
+
+        // The semantic of this call is to take uncompressed data, compress it on-the-fly,
+        // and perform a partial update of an existing GPU-compressed texture. This
+        // operation is not supported in OpenGL ES.
+        glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 4, 4, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
+        EXPECT_GL_ERROR(GL_INVALID_OPERATION);
+
+        // Compressed texture extensions never extend TexSubImage2D.
+        glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 4, 4, format, GL_UNSIGNED_BYTE, nullptr);
+        EXPECT_GL_ERROR(GL_INVALID_ENUM);
+
+        // The semantic of this call is to take pixel data from the current framebuffer, compress it
+        // on-the-fly, and perform a partial update of an existing GPU-compressed texture. This
+        // operation is not supported in OpenGL ES.
+        glCopyTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 0, 0, 4, 4);
+        EXPECT_GL_ERROR(GL_INVALID_OPERATION);
+
+        glCompressedTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 4, 4, format, size, data);
+        EXPECT_GL_ERROR(mSupportsUpdates ? GL_NO_ERROR : GL_INVALID_OPERATION);
+    }
+
+    void checkSubImage3D(GLenum target, GLenum format, GLsizei size)
+    {
+        GLubyte data[32];
+
+        // The semantic of this call is to take uncompressed data, compress it on-the-fly,
+        // and perform a partial update of an existing GPU-compressed texture. This
+        // operation is not supported in OpenGL ES.
+        glTexSubImage3D(target, 0, 0, 0, 0, 4, 4, 1, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
+        EXPECT_GL_ERROR(GL_INVALID_OPERATION);
+
+        // Compressed texture extensions never extend TexSubImage3D.
+        glTexSubImage3D(target, 0, 0, 0, 0, 4, 4, 1, format, GL_UNSIGNED_BYTE, nullptr);
+        EXPECT_GL_ERROR(GL_INVALID_ENUM);
+
+        // The semantic of this call is to take pixel data from the current framebuffer, compress it
+        // on-the-fly, and perform a partial update of an existing GPU-compressed texture. This
+        // operation is not supported in OpenGL ES.
+        glCopyTexSubImage3D(target, 0, 0, 0, 0, 0, 0, 4, 4);
+        EXPECT_GL_ERROR(GL_INVALID_OPERATION);
+
+        glCompressedTexSubImage3D(target, 0, 0, 0, 0, 4, 4, 1, format, size, data);
+        EXPECT_GL_NO_ERROR();
+    }
+
+    void check2D(const bool compressedFormatEnabled)
+    {
+        const GLenum format = ::testing::get<1>(GetParam()).first;
+        const GLsizei size  = ::testing::get<1>(GetParam()).second;
+
+        {
+            GLTexture texture;
+            glBindTexture(GL_TEXTURE_2D, texture);
+
+            // The semantic of this call is to take uncompressed data and compress it on-the-fly.
+            // This operation is not supported in OpenGL ES.
+            glTexImage2D(GL_TEXTURE_2D, 0, format, 4, 4, 0, GL_RGB, GL_UNSIGNED_BYTE, nullptr);
+            EXPECT_GL_ERROR(getClientMajorVersion() >= 3 ? GL_INVALID_OPERATION : GL_INVALID_VALUE);
+
+            // Try compressed enum as format. Compressed texture extensions never allow this.
+            glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 4, 4, 0, format, GL_UNSIGNED_BYTE, nullptr);
+            EXPECT_GL_ERROR(GL_INVALID_ENUM);
+
+            // The semantic of this call is to take pixel data from the current framebuffer
+            // and create a compressed texture from it on-the-fly. This operation is not supported
+            // in OpenGL ES.
+            glCopyTexImage2D(GL_TEXTURE_2D, 0, format, 0, 0, 4, 4, 0);
+            EXPECT_GL_ERROR(GL_INVALID_OPERATION);
+
+            glCompressedTexImage2D(GL_TEXTURE_2D, 0, format, 4, 4, 0, size, nullptr);
+            if (compressedFormatEnabled)
+            {
+                EXPECT_GL_NO_ERROR();
+
+                checkSubImage2D(format, size);
+            }
+            else
+            {
+                EXPECT_GL_ERROR(GL_INVALID_ENUM);
+            }
+        }
+
+        if (getClientMajorVersion() >= 3)
+        {
+            GLTexture texture;
+            glBindTexture(GL_TEXTURE_2D, texture);
+
+            glTexStorage2D(GL_TEXTURE_2D, 1, format, 4, 4);
+            if (compressedFormatEnabled)
+            {
+                EXPECT_GL_NO_ERROR();
+
+                checkSubImage2D(format, size);
+            }
+            else
+            {
+                EXPECT_GL_ERROR(GL_INVALID_ENUM);
+            }
+        }
+
+        if (EnsureGLExtensionEnabled("GL_EXT_texture_storage"))
+        {
+            GLTexture texture;
+            glBindTexture(GL_TEXTURE_2D, texture);
+
+            glTexStorage2DEXT(GL_TEXTURE_2D, 1, format, 4, 4);
+            if (compressedFormatEnabled)
+            {
+                EXPECT_GL_NO_ERROR();
+
+                checkSubImage2D(format, size);
+            }
+            else
+            {
+                EXPECT_GL_ERROR(GL_INVALID_ENUM);
+            }
+        }
+    }
+
+    void check3D(GLenum target, const bool compressedFormatEnabled, const bool supportsTarget)
+    {
+        const GLenum format = ::testing::get<1>(GetParam()).first;
+        const GLsizei size  = ::testing::get<1>(GetParam()).second;
+
+        {
+            GLTexture texture;
+            glBindTexture(target, texture);
+
+            // Try compressed enum as internalformat. The semantic of this call is to take
+            // uncompressed data and compress it on-the-fly. This operation is not supported in
+            // OpenGL ES.
+            glTexImage3D(target, 0, format, 4, 4, 1, 0, GL_RGB, GL_UNSIGNED_BYTE, nullptr);
+            EXPECT_GL_ERROR(GL_INVALID_OPERATION);
+
+            // Try compressed enum as format. Compressed texture extensions never allow this.
+            glTexImage3D(target, 0, GL_RGB, 4, 4, 1, 0, format, GL_UNSIGNED_BYTE, nullptr);
+            EXPECT_GL_ERROR(GL_INVALID_ENUM);
+
+            glCompressedTexImage3D(target, 0, format, 4, 4, 1, 0, size, nullptr);
+            if (compressedFormatEnabled)
+            {
+                if (supportsTarget)
+                {
+                    EXPECT_GL_NO_ERROR();
+
+                    checkSubImage3D(target, format, size);
+                }
+                else
+                {
+                    EXPECT_GL_ERROR(GL_INVALID_OPERATION);
+                }
+            }
+            else
+            {
+                EXPECT_GL_ERROR(GL_INVALID_ENUM);
+            }
+        }
+
+        {
+            GLTexture texture;
+            glBindTexture(target, texture);
+
+            glTexStorage3D(target, 1, format, 4, 4, 1);
+            if (compressedFormatEnabled)
+            {
+                if (supportsTarget)
+                {
+                    EXPECT_GL_NO_ERROR();
+
+                    checkSubImage3D(target, format, size);
+                }
+                else
+                {
+                    EXPECT_GL_ERROR(GL_INVALID_OPERATION);
+                }
+            }
+            else
+            {
+                EXPECT_GL_ERROR(GL_INVALID_ENUM);
+            }
+        }
+    }
+
+    void test()
+    {
+        // ETC2/EAC formats always pass validation on ES3 contexts but in some cases fail in drivers
+        // because their emulation is not implemented for OpenGL renderer.
+        // https://crbug.com/angleproject/6300
+        if (mAlwaysOnES3)
+        {
+            ANGLE_SKIP_TEST_IF(getClientMajorVersion() >= 3 &&
+                               !IsGLExtensionRequestable(mExtNames[0]));
+        }
+
+        // It's not possible to disable ETC2/EAC support on ES 3.0.
+        const bool compressedFormatEnabled = mAlwaysOnES3 && getClientMajorVersion() >= 3;
+        check2D(compressedFormatEnabled);
+        if (getClientMajorVersion() >= 3)
+        {
+            check3D(GL_TEXTURE_2D_ARRAY, compressedFormatEnabled, mSupports2DArray);
+            check3D(GL_TEXTURE_3D, compressedFormatEnabled, mSupports3D && !mDisableTexture3D);
+        }
+
+        for (const std::string &extName : mExtNames)
+        {
+            if (!extName.empty())
+            {
+                if (IsGLExtensionRequestable(extName))
+                {
+                    glRequestExtensionANGLE(extName.c_str());
+                }
+                ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled(extName));
+            }
+        }
+
+        // Repeat all checks after enabling the extensions.
+        check2D(true);
+        if (getClientMajorVersion() >= 3)
+        {
+            check3D(GL_TEXTURE_2D_ARRAY, true, mSupports2DArray);
+            check3D(GL_TEXTURE_3D, true, mSupports3D && !mDisableTexture3D);
+        }
+    }
+
+  private:
+    bool mDisableTexture3D = false;
+    const std::vector<std::string> mExtNames;
+    const bool mSupportsUpdates;
+    const bool mSupports2DArray;
+    const bool mSupports3D;
+    const bool mAlwaysOnES3;
+};
+
+template <char const *ext1,
+          char const *ext2,
+          bool supports_updates,
+          bool supports_2d_array,
+          bool supports_3d,
+          bool always_on_es3>
+class _Test : public CompressedTextureFormatsTest
+{
+  public:
+    _Test()
+        : CompressedTextureFormatsTest(ext1,
+                                       ext2,
+                                       supports_updates,
+                                       supports_2d_array,
+                                       supports_3d,
+                                       always_on_es3)
+    {}
+};
+
+const char kDXT1[]     = "GL_EXT_texture_compression_dxt1";
+const char kDXT3[]     = "GL_ANGLE_texture_compression_dxt3";
+const char kDXT5[]     = "GL_ANGLE_texture_compression_dxt5";
+const char kS3TCSRGB[] = "GL_EXT_texture_compression_s3tc_srgb";
+const char kRGTC[]     = "GL_EXT_texture_compression_rgtc";
+const char kBPTC[]     = "GL_EXT_texture_compression_bptc";
+
+const char kETC1[]    = "GL_OES_compressed_ETC1_RGB8_texture";
+const char kETC1Sub[] = "GL_EXT_compressed_ETC1_RGB8_sub_texture";
+
+const char kEACR11U[]  = "GL_OES_compressed_EAC_R11_unsigned_texture";
+const char kEACR11S[]  = "GL_OES_compressed_EAC_R11_signed_texture";
+const char kEACRG11U[] = "GL_OES_compressed_EAC_RG11_unsigned_texture";
+const char kEACRG11S[] = "GL_OES_compressed_EAC_RG11_signed_texture";
+
+const char kETC2RGB8[]       = "GL_OES_compressed_ETC2_RGB8_texture";
+const char kETC2RGB8SRGB[]   = "GL_OES_compressed_ETC2_sRGB8_texture";
+const char kETC2RGB8A1[]     = "GL_OES_compressed_ETC2_punchthroughA_RGBA8_texture";
+const char kETC2RGB8A1SRGB[] = "GL_OES_compressed_ETC2_punchthroughA_sRGB8_alpha_texture";
+const char kETC2RGBA8[]      = "GL_OES_compressed_ETC2_RGBA8_texture";
+const char kETC2RGBA8SRGB[]  = "GL_OES_compressed_ETC2_sRGB8_alpha8_texture";
+
+const char kASTC[]         = "GL_KHR_texture_compression_astc_ldr";
+const char kASTCSliced3D[] = "GL_KHR_texture_compression_astc_sliced_3d";
+
+const char kPVRTC1[]    = "GL_IMG_texture_compression_pvrtc";
+const char kPVRTCSRGB[] = "GL_EXT_pvrtc_sRGB";
+
+const char kEmpty[] = "";
+
+// clang-format off
+using CompressedTextureDXT1Test     = _Test<kDXT1,     kEmpty, true, true, false, false>;
+using CompressedTextureDXT3Test     = _Test<kDXT3,     kEmpty, true, true, false, false>;
+using CompressedTextureDXT5Test     = _Test<kDXT5,     kEmpty, true, true, false, false>;
+using CompressedTextureS3TCSRGBTest = _Test<kS3TCSRGB, kEmpty, true, true, false, false>;
+using CompressedTextureRGTCTest     = _Test<kRGTC,     kEmpty, true, true, false, false>;
+using CompressedTextureBPTCTest     = _Test<kBPTC,     kEmpty, true, true, true,  false>;
+
+using CompressedTextureETC1Test    = _Test<kETC1, kEmpty,   false, false, false, false>;
+using CompressedTextureETC1SubTest = _Test<kETC1, kETC1Sub, true,  false, false, false>;
+
+using CompressedTextureEACR11UTest  = _Test<kEACR11U,  kEmpty, true, true, false, true>;
+using CompressedTextureEACR11STest  = _Test<kEACR11S,  kEmpty, true, true, false, true>;
+using CompressedTextureEACRG11UTest = _Test<kEACRG11U, kEmpty, true, true, false, true>;
+using CompressedTextureEACRG11STest = _Test<kEACRG11S, kEmpty, true, true, false, true>;
+
+using CompressedTextureETC2RGB8Test       = _Test<kETC2RGB8,       kEmpty, true, true, false, true>;
+using CompressedTextureETC2RGB8SRGBTest   = _Test<kETC2RGB8SRGB,   kEmpty, true, true, false, true>;
+using CompressedTextureETC2RGB8A1Test     = _Test<kETC2RGB8A1,     kEmpty, true, true, false, true>;
+using CompressedTextureETC2RGB8A1SRGBTest = _Test<kETC2RGB8A1SRGB, kEmpty, true, true, false, true>;
+using CompressedTextureETC2RGBA8Test      = _Test<kETC2RGBA8,      kEmpty, true, true, false, true>;
+using CompressedTextureETC2RGBA8SRGBTest  = _Test<kETC2RGBA8SRGB,  kEmpty, true, true, false, true>;
+
+using CompressedTextureASTCTest         = _Test<kASTC, kEmpty,        true, true, false, false>;
+using CompressedTextureASTCSliced3DTest = _Test<kASTC, kASTCSliced3D, true, true, true,  false>;
+
+using CompressedTexturePVRTC1Test     = _Test<kPVRTC1, kEmpty,     true, false, false, false>;
+using CompressedTexturePVRTC1SRGBTest = _Test<kPVRTC1, kPVRTCSRGB, true, false, false, false>;
+// clang-format on
+
+std::string PrintToStringParamName(
+    const ::testing::TestParamInfo<CompressedTextureTestParams> &info)
+{
+    std::string name = gl::GLinternalFormatToString(std::get<1>(info.param).first);
+    name.erase(0, 3);  // Remove GL_
+    if (name.find("COMPRESSED_") == 0)
+    {
+        name.erase(0, 11);
+    }
+    for (std::string str : {"_EXT", "_IMG", "_KHR", "_OES"})
+    {
+        if (name.find(str) != std::string::npos)
+        {
+            name.erase(name.length() - 4, 4);
+            break;
+        }
+    }
+    std::stringstream nameStr;
+    nameStr << name << "__" << std::get<0>(info.param);
+    return nameStr.str();
+}
+
+static const FormatDesc kDXT1Formats[] = {{GL_COMPRESSED_RGB_S3TC_DXT1_EXT, 8},
+                                          {GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, 8}};
+
+static const FormatDesc kDXT3Formats[] = {{GL_COMPRESSED_RGBA_S3TC_DXT3_EXT, 16}};
+
+static const FormatDesc kDXT5Formats[] = {{GL_COMPRESSED_RGBA_S3TC_DXT5_EXT, 16}};
+
+static const FormatDesc kS3TCSRGBFormats[] = {{GL_COMPRESSED_SRGB_S3TC_DXT1_EXT, 8},
+                                              {GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT, 8},
+                                              {GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT, 16},
+                                              {GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT, 16}};
+
+static const FormatDesc kRGTCFormats[] = {{GL_COMPRESSED_RED_RGTC1_EXT, 8},
+                                          {GL_COMPRESSED_SIGNED_RED_RGTC1_EXT, 8},
+                                          {GL_COMPRESSED_RED_GREEN_RGTC2_EXT, 16},
+                                          {GL_COMPRESSED_SIGNED_RED_GREEN_RGTC2_EXT, 16}};
+
+static const FormatDesc kBPTCFormats[] = {{GL_COMPRESSED_RGBA_BPTC_UNORM_EXT, 16},
+                                          {GL_COMPRESSED_SRGB_ALPHA_BPTC_UNORM_EXT, 16},
+                                          {GL_COMPRESSED_RGB_BPTC_SIGNED_FLOAT_EXT, 16},
+                                          {GL_COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT_EXT, 16}};
+
+static const FormatDesc kETC1Formats[] = {{GL_ETC1_RGB8_OES, 8}};
+
+// clang-format off
+static const FormatDesc kEACR11UFormats[]        = {{GL_COMPRESSED_R11_EAC, 8}};
+static const FormatDesc kEACR11SFormats[]        = {{GL_COMPRESSED_SIGNED_R11_EAC, 8}};
+static const FormatDesc kEACRG11UFormats[]       = {{GL_COMPRESSED_RG11_EAC, 16}};
+static const FormatDesc kEACRG11SFormats[]       = {{GL_COMPRESSED_SIGNED_RG11_EAC, 16}};
+static const FormatDesc kETC2RGB8Formats[]       = {{GL_COMPRESSED_RGB8_ETC2, 8}};
+static const FormatDesc kETC2RGB8SRGBFormats[]   = {{GL_COMPRESSED_SRGB8_ETC2, 8}};
+static const FormatDesc kETC2RGB8A1Formats[]     = {{GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2, 8}};
+static const FormatDesc kETC2RGB8A1SRGBFormats[] = {{GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2, 8}};
+static const FormatDesc kETC2RGBA8Formats[]      = {{GL_COMPRESSED_RGBA8_ETC2_EAC, 16}};
+static const FormatDesc kETC2RGBA8SRGBFormats[]  = {{GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC, 16}};
+// clang-format on
+
+static const FormatDesc kASTCFormats[] = {{GL_COMPRESSED_RGBA_ASTC_4x4_KHR, 16},
+                                          {GL_COMPRESSED_RGBA_ASTC_5x4_KHR, 16},
+                                          {GL_COMPRESSED_RGBA_ASTC_5x5_KHR, 16},
+                                          {GL_COMPRESSED_RGBA_ASTC_6x5_KHR, 16},
+                                          {GL_COMPRESSED_RGBA_ASTC_6x6_KHR, 16},
+                                          {GL_COMPRESSED_RGBA_ASTC_8x5_KHR, 16},
+                                          {GL_COMPRESSED_RGBA_ASTC_8x6_KHR, 16},
+                                          {GL_COMPRESSED_RGBA_ASTC_8x8_KHR, 16},
+                                          {GL_COMPRESSED_RGBA_ASTC_10x5_KHR, 16},
+                                          {GL_COMPRESSED_RGBA_ASTC_10x6_KHR, 16},
+                                          {GL_COMPRESSED_RGBA_ASTC_10x8_KHR, 16},
+                                          {GL_COMPRESSED_RGBA_ASTC_10x10_KHR, 16},
+                                          {GL_COMPRESSED_RGBA_ASTC_12x10_KHR, 16},
+                                          {GL_COMPRESSED_RGBA_ASTC_12x12_KHR, 16},
+                                          {GL_COMPRESSED_SRGB8_ALPHA8_ASTC_4x4_KHR, 16},
+                                          {GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x4_KHR, 16},
+                                          {GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x5_KHR, 16},
+                                          {GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x5_KHR, 16},
+                                          {GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x6_KHR, 16},
+                                          {GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x5_KHR, 16},
+                                          {GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x6_KHR, 16},
+                                          {GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x8_KHR, 16},
+                                          {GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x5_KHR, 16},
+                                          {GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x6_KHR, 16},
+                                          {GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x8_KHR, 16},
+                                          {GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x10_KHR, 16},
+                                          {GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x10_KHR, 16},
+                                          {GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x12_KHR, 16}};
+
+static const FormatDesc kPVRTC1Formats[] = {{GL_COMPRESSED_RGB_PVRTC_4BPPV1_IMG, 32},
+                                            {GL_COMPRESSED_RGB_PVRTC_2BPPV1_IMG, 32},
+                                            {GL_COMPRESSED_RGBA_PVRTC_4BPPV1_IMG, 32},
+                                            {GL_COMPRESSED_RGBA_PVRTC_2BPPV1_IMG, 32}};
+
+static const FormatDesc kPVRTC1SRGBFormats[] = {{GL_COMPRESSED_SRGB_PVRTC_2BPPV1_EXT, 32},
+                                                {GL_COMPRESSED_SRGB_PVRTC_4BPPV1_EXT, 32},
+                                                {GL_COMPRESSED_SRGB_ALPHA_PVRTC_2BPPV1_EXT, 32},
+                                                {GL_COMPRESSED_SRGB_ALPHA_PVRTC_4BPPV1_EXT, 32}};
+
+ANGLE_INSTANTIATE_TEST_COMBINE_1(CompressedTextureDXT1Test,
+                                 PrintToStringParamName,
+                                 testing::ValuesIn(kDXT1Formats),
+                                 ANGLE_ALL_TEST_PLATFORMS_ES2,
+                                 ANGLE_ALL_TEST_PLATFORMS_ES3);
+
+ANGLE_INSTANTIATE_TEST_COMBINE_1(CompressedTextureDXT3Test,
+                                 PrintToStringParamName,
+                                 testing::ValuesIn(kDXT3Formats),
+                                 ANGLE_ALL_TEST_PLATFORMS_ES2,
+                                 ANGLE_ALL_TEST_PLATFORMS_ES3);
+
+ANGLE_INSTANTIATE_TEST_COMBINE_1(CompressedTextureDXT5Test,
+                                 PrintToStringParamName,
+                                 testing::ValuesIn(kDXT5Formats),
+                                 ANGLE_ALL_TEST_PLATFORMS_ES2,
+                                 ANGLE_ALL_TEST_PLATFORMS_ES3);
+
+ANGLE_INSTANTIATE_TEST_COMBINE_1(CompressedTextureS3TCSRGBTest,
+                                 PrintToStringParamName,
+                                 testing::ValuesIn(kS3TCSRGBFormats),
+                                 ANGLE_ALL_TEST_PLATFORMS_ES2,
+                                 ANGLE_ALL_TEST_PLATFORMS_ES3);
+
+ANGLE_INSTANTIATE_TEST_COMBINE_1(CompressedTextureRGTCTest,
+                                 PrintToStringParamName,
+                                 testing::ValuesIn(kRGTCFormats),
+                                 ANGLE_ALL_TEST_PLATFORMS_ES2,
+                                 ANGLE_ALL_TEST_PLATFORMS_ES3);
+
+ANGLE_INSTANTIATE_TEST_COMBINE_1(CompressedTextureBPTCTest,
+                                 PrintToStringParamName,
+                                 testing::ValuesIn(kBPTCFormats),
+                                 ANGLE_ALL_TEST_PLATFORMS_ES2,
+                                 ANGLE_ALL_TEST_PLATFORMS_ES3);
+
+ANGLE_INSTANTIATE_TEST_COMBINE_1(CompressedTextureETC1Test,
+                                 PrintToStringParamName,
+                                 testing::ValuesIn(kETC1Formats),
+                                 ANGLE_ALL_TEST_PLATFORMS_ES2,
+                                 ANGLE_ALL_TEST_PLATFORMS_ES3);
+
+ANGLE_INSTANTIATE_TEST_COMBINE_1(CompressedTextureETC1SubTest,
+                                 PrintToStringParamName,
+                                 testing::ValuesIn(kETC1Formats),
+                                 ANGLE_ALL_TEST_PLATFORMS_ES2,
+                                 ANGLE_ALL_TEST_PLATFORMS_ES3);
+
+ANGLE_INSTANTIATE_TEST_COMBINE_1(CompressedTextureEACR11UTest,
+                                 PrintToStringParamName,
+                                 testing::ValuesIn(kEACR11UFormats),
+                                 ANGLE_ALL_TEST_PLATFORMS_ES2,
+                                 ANGLE_ALL_TEST_PLATFORMS_ES3);
+
+ANGLE_INSTANTIATE_TEST_COMBINE_1(CompressedTextureEACR11STest,
+                                 PrintToStringParamName,
+                                 testing::ValuesIn(kEACR11SFormats),
+                                 ANGLE_ALL_TEST_PLATFORMS_ES2,
+                                 ANGLE_ALL_TEST_PLATFORMS_ES3);
+
+ANGLE_INSTANTIATE_TEST_COMBINE_1(CompressedTextureEACRG11UTest,
+                                 PrintToStringParamName,
+                                 testing::ValuesIn(kEACRG11UFormats),
+                                 ANGLE_ALL_TEST_PLATFORMS_ES2,
+                                 ANGLE_ALL_TEST_PLATFORMS_ES3);
+
+ANGLE_INSTANTIATE_TEST_COMBINE_1(CompressedTextureEACRG11STest,
+                                 PrintToStringParamName,
+                                 testing::ValuesIn(kEACRG11SFormats),
+                                 ANGLE_ALL_TEST_PLATFORMS_ES2,
+                                 ANGLE_ALL_TEST_PLATFORMS_ES3);
+
+ANGLE_INSTANTIATE_TEST_COMBINE_1(CompressedTextureETC2RGB8Test,
+                                 PrintToStringParamName,
+                                 testing::ValuesIn(kETC2RGB8Formats),
+                                 ANGLE_ALL_TEST_PLATFORMS_ES2,
+                                 ANGLE_ALL_TEST_PLATFORMS_ES3);
+
+ANGLE_INSTANTIATE_TEST_COMBINE_1(CompressedTextureETC2RGB8SRGBTest,
+                                 PrintToStringParamName,
+                                 testing::ValuesIn(kETC2RGB8SRGBFormats),
+                                 ANGLE_ALL_TEST_PLATFORMS_ES2,
+                                 ANGLE_ALL_TEST_PLATFORMS_ES3);
+
+ANGLE_INSTANTIATE_TEST_COMBINE_1(CompressedTextureETC2RGB8A1Test,
+                                 PrintToStringParamName,
+                                 testing::ValuesIn(kETC2RGB8A1Formats),
+                                 ANGLE_ALL_TEST_PLATFORMS_ES2,
+                                 ANGLE_ALL_TEST_PLATFORMS_ES3);
+
+ANGLE_INSTANTIATE_TEST_COMBINE_1(CompressedTextureETC2RGB8A1SRGBTest,
+                                 PrintToStringParamName,
+                                 testing::ValuesIn(kETC2RGB8A1SRGBFormats),
+                                 ANGLE_ALL_TEST_PLATFORMS_ES2,
+                                 ANGLE_ALL_TEST_PLATFORMS_ES3);
+
+ANGLE_INSTANTIATE_TEST_COMBINE_1(CompressedTextureETC2RGBA8Test,
+                                 PrintToStringParamName,
+                                 testing::ValuesIn(kETC2RGBA8Formats),
+                                 ANGLE_ALL_TEST_PLATFORMS_ES2,
+                                 ANGLE_ALL_TEST_PLATFORMS_ES3);
+
+ANGLE_INSTANTIATE_TEST_COMBINE_1(CompressedTextureETC2RGBA8SRGBTest,
+                                 PrintToStringParamName,
+                                 testing::ValuesIn(kETC2RGBA8SRGBFormats),
+                                 ANGLE_ALL_TEST_PLATFORMS_ES2,
+                                 ANGLE_ALL_TEST_PLATFORMS_ES3);
+
+ANGLE_INSTANTIATE_TEST_COMBINE_1(CompressedTextureASTCTest,
+                                 PrintToStringParamName,
+                                 testing::ValuesIn(kASTCFormats),
+                                 ANGLE_ALL_TEST_PLATFORMS_ES2,
+                                 ANGLE_ALL_TEST_PLATFORMS_ES3);
+
+ANGLE_INSTANTIATE_TEST_COMBINE_1(CompressedTextureASTCSliced3DTest,
+                                 PrintToStringParamName,
+                                 testing::ValuesIn(kASTCFormats),
+                                 ANGLE_ALL_TEST_PLATFORMS_ES2,
+                                 ANGLE_ALL_TEST_PLATFORMS_ES3);
+
+ANGLE_INSTANTIATE_TEST_COMBINE_1(CompressedTexturePVRTC1Test,
+                                 PrintToStringParamName,
+                                 testing::ValuesIn(kPVRTC1Formats),
+                                 ANGLE_ALL_TEST_PLATFORMS_ES2,
+                                 ANGLE_ALL_TEST_PLATFORMS_ES3);
+
+ANGLE_INSTANTIATE_TEST_COMBINE_1(CompressedTexturePVRTC1SRGBTest,
+                                 PrintToStringParamName,
+                                 testing::ValuesIn(kPVRTC1SRGBFormats),
+                                 ANGLE_ALL_TEST_PLATFORMS_ES2,
+                                 ANGLE_ALL_TEST_PLATFORMS_ES3);
+
+// clang-format off
+TEST_P(CompressedTextureDXT1Test,     Test) { test(); }
+TEST_P(CompressedTextureDXT3Test,     Test) { test(); }
+TEST_P(CompressedTextureDXT5Test,     Test) { test(); }
+TEST_P(CompressedTextureS3TCSRGBTest, Test) { test(); }
+TEST_P(CompressedTextureRGTCTest,     Test) { test(); }
+TEST_P(CompressedTextureBPTCTest,     Test) { test(); }
+
+TEST_P(CompressedTextureETC1Test,    Test) { test(); }
+TEST_P(CompressedTextureETC1SubTest, Test) { test(); }
+
+TEST_P(CompressedTextureEACR11UTest,  Test) { test(); }
+TEST_P(CompressedTextureEACR11STest,  Test) { test(); }
+TEST_P(CompressedTextureEACRG11UTest, Test) { test(); }
+TEST_P(CompressedTextureEACRG11STest, Test) { test(); }
+
+TEST_P(CompressedTextureETC2RGB8Test,       Test) { test(); }
+TEST_P(CompressedTextureETC2RGB8SRGBTest,   Test) { test(); }
+TEST_P(CompressedTextureETC2RGB8A1Test,     Test) { test(); }
+TEST_P(CompressedTextureETC2RGB8A1SRGBTest, Test) { test(); }
+TEST_P(CompressedTextureETC2RGBA8Test,      Test) { test(); }
+TEST_P(CompressedTextureETC2RGBA8SRGBTest,  Test) { test(); }
+
+TEST_P(CompressedTextureASTCTest,         Test) { test(); }
+TEST_P(CompressedTextureASTCSliced3DTest, Test) { test(); }
+
+TEST_P(CompressedTexturePVRTC1Test,     Test) { test(); }
+TEST_P(CompressedTexturePVRTC1SRGBTest, Test) { test(); }
+// clang-format on
+}  // namespace
diff --git a/src/tests/gl_tests/D3DTextureTest.cpp b/src/tests/gl_tests/D3DTextureTest.cpp
index 8965655..61a5f7b 100644
--- a/src/tests/gl_tests/D3DTextureTest.cpp
+++ b/src/tests/gl_tests/D3DTextureTest.cpp
@@ -1191,61 +1191,165 @@
     eglDestroySurface(display, pbuffer);
 }
 
-TEST_P(D3DTextureTest, ClearTextureImage)
+class D3DTextureClearTest : public D3DTextureTest
 {
-    ANGLE_SKIP_TEST_IF(!valid() || !IsD3D11());
+  protected:
+    D3DTextureClearTest() : D3DTextureTest() {}
 
-    EGLWindow *window  = getEGLWindow();
-    EGLDisplay display = window->getDisplay();
+    void RunClearTest(DXGI_FORMAT format)
+    {
+        ANGLE_SKIP_TEST_IF(!valid() || !IsD3D11());
 
-    window->makeCurrent();
+        EGLWindow *window  = getEGLWindow();
+        EGLDisplay display = window->getDisplay();
 
-    const UINT bufferSize = 32;
-    EXPECT_TRUE(mD3D11Device != nullptr);
-    ID3D11Texture2D *d3d11_texture = nullptr;
-    CD3D11_TEXTURE2D_DESC desc(DXGI_FORMAT_R8G8B8A8_UNORM, bufferSize, bufferSize, 1, 1,
-                               D3D11_BIND_SHADER_RESOURCE | D3D11_BIND_RENDER_TARGET);
-    EXPECT_TRUE(SUCCEEDED(mD3D11Device->CreateTexture2D(&desc, nullptr, &d3d11_texture)));
+        window->makeCurrent();
 
-    const EGLint attribs[] = {EGL_NONE};
+        const UINT bufferSize = 32;
+        EXPECT_TRUE(mD3D11Device != nullptr);
+        ID3D11Texture2D *d3d11Texture = nullptr;
+        CD3D11_TEXTURE2D_DESC desc(format, bufferSize, bufferSize, 1, 1,
+                                   D3D11_BIND_SHADER_RESOURCE | D3D11_BIND_RENDER_TARGET);
+        EXPECT_TRUE(SUCCEEDED(mD3D11Device->CreateTexture2D(&desc, nullptr, &d3d11Texture)));
 
-    EGLImage image = eglCreateImageKHR(display, EGL_NO_CONTEXT, EGL_D3D11_TEXTURE_ANGLE,
-                                       static_cast<EGLClientBuffer>(d3d11_texture), attribs);
-    ASSERT_EGL_SUCCESS();
-    ASSERT_NE(image, EGL_NO_IMAGE_KHR);
+        // Can use unsized formats for all cases, but use sized ones to match Chromium.
+        EGLint internalFormat = GL_NONE;
+        switch (format)
+        {
+            case DXGI_FORMAT_R8G8B8A8_UNORM:
+            case DXGI_FORMAT_R16G16B16A16_FLOAT:
+                internalFormat = GL_RGBA;
+                break;
+            case DXGI_FORMAT_B8G8R8A8_UNORM:
+                internalFormat = GL_BGRA_EXT;
+                break;
+            case DXGI_FORMAT_R8_UNORM:
+                internalFormat = GL_RED_EXT;
+                break;
+            case DXGI_FORMAT_R8G8_UNORM:
+                internalFormat = GL_RG_EXT;
+                break;
+            case DXGI_FORMAT_R10G10B10A2_UNORM:
+                internalFormat = GL_RGB10_A2_EXT;
+                break;
+            case DXGI_FORMAT_R16_UNORM:
+                internalFormat = GL_R16_EXT;
+                break;
+            case DXGI_FORMAT_R16G16_UNORM:
+                internalFormat = GL_RG16_EXT;
+                break;
+            default:
+                ASSERT_TRUE(false);
+                break;
+        }
 
-    GLuint texture;
-    glGenTextures(1, &texture);
-    glBindTexture(GL_TEXTURE_2D, texture);
-    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
-    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
-    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
-    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
-    ASSERT_GL_NO_ERROR();
+        const EGLint attribs[] = {EGL_TEXTURE_INTERNAL_FORMAT_ANGLE, internalFormat, EGL_NONE};
 
-    glEGLImageTargetTexture2DOES(GL_TEXTURE_2D, image);
-    ASSERT_GL_NO_ERROR();
+        EGLImage image = eglCreateImageKHR(display, EGL_NO_CONTEXT, EGL_D3D11_TEXTURE_ANGLE,
+                                           static_cast<EGLClientBuffer>(d3d11Texture), attribs);
+        ASSERT_EGL_SUCCESS();
+        ASSERT_NE(image, EGL_NO_IMAGE_KHR);
 
-    GLuint fbo;
-    glGenFramebuffers(1, &fbo);
-    glBindFramebuffer(GL_FRAMEBUFFER, fbo);
-    glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, texture, 0);
-    EXPECT_EQ(glCheckFramebufferStatus(GL_FRAMEBUFFER),
-              static_cast<unsigned>(GL_FRAMEBUFFER_COMPLETE));
-    ASSERT_GL_NO_ERROR();
+        GLuint texture;
+        glGenTextures(1, &texture);
+        glBindTexture(GL_TEXTURE_2D, texture);
+        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
+        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
+        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
+        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
+        ASSERT_GL_NO_ERROR();
 
-    glViewport(0, 0, static_cast<GLsizei>(bufferSize), static_cast<GLsizei>(bufferSize));
-    glClearColor(1.0f, 0.0f, 1.0f, 1.0f);
-    glClear(GL_COLOR_BUFFER_BIT);
-    ASSERT_GL_NO_ERROR();
-    EXPECT_PIXEL_EQ(static_cast<GLint>(bufferSize) / 2, static_cast<GLint>(bufferSize) / 2, 255, 0,
-                    255, 255);
+        glEGLImageTargetTexture2DOES(GL_TEXTURE_2D, image);
+        ASSERT_GL_NO_ERROR();
 
-    glDeleteFramebuffers(1, &fbo);
-    glDeleteTextures(1, &texture);
-    eglDestroyImageKHR(display, image);
+        GLuint fbo;
+        glGenFramebuffers(1, &fbo);
+        glBindFramebuffer(GL_FRAMEBUFFER, fbo);
+        glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, texture, 0);
+        EXPECT_EQ(glCheckFramebufferStatus(GL_FRAMEBUFFER),
+                  static_cast<unsigned>(GL_FRAMEBUFFER_COMPLETE));
+        ASSERT_GL_NO_ERROR();
 
-    d3d11_texture->Release();
+        glViewport(0, 0, static_cast<GLsizei>(bufferSize), static_cast<GLsizei>(bufferSize));
+        glClearColor(1.0f, 1.0f, 1.0f, 1.0f);
+        glClear(GL_COLOR_BUFFER_BIT);
+        ASSERT_GL_NO_ERROR();
+
+        if (format == DXGI_FORMAT_R16G16B16A16_FLOAT)
+        {
+            EXPECT_PIXEL_32F_EQ(static_cast<GLint>(bufferSize) / 2,
+                                static_cast<GLint>(bufferSize) / 2, 1.0f, 1.0f, 1.0f, 1.0f);
+        }
+        else
+        {
+            GLuint readColor[4] = {0, 0, 0, 255};
+            switch (internalFormat)
+            {
+                case GL_RGBA:
+                case GL_BGRA_EXT:
+                case GL_RGB10_A2_EXT:
+                    readColor[0] = readColor[1] = readColor[2] = 255;
+                    break;
+                case GL_RG_EXT:
+                case GL_RG16_EXT:
+                    readColor[0] = readColor[1] = 255;
+                    break;
+                case GL_RED_EXT:
+                case GL_R16_EXT:
+                    readColor[0] = 255;
+                    break;
+            }
+            // Read back as GL_UNSIGNED_BYTE even though the texture might have more than 8bpc.
+            EXPECT_PIXEL_EQ(static_cast<GLint>(bufferSize) / 2, static_cast<GLint>(bufferSize) / 2,
+                            readColor[0], readColor[1], readColor[2], readColor[3]);
+        }
+
+        glDeleteFramebuffers(1, &fbo);
+        glDeleteTextures(1, &texture);
+        eglDestroyImageKHR(display, image);
+
+        d3d11Texture->Release();
+    }
+};
+
+TEST_P(D3DTextureClearTest, ClearRGBA8)
+{
+    RunClearTest(DXGI_FORMAT_R8G8B8A8_UNORM);
+}
+
+TEST_P(D3DTextureClearTest, ClearBGRA8)
+{
+    RunClearTest(DXGI_FORMAT_B8G8R8A8_UNORM);
+}
+
+TEST_P(D3DTextureClearTest, ClearR8)
+{
+    RunClearTest(DXGI_FORMAT_R8_UNORM);
+}
+
+TEST_P(D3DTextureClearTest, ClearRG8)
+{
+    RunClearTest(DXGI_FORMAT_R8G8_UNORM);
+}
+
+TEST_P(D3DTextureClearTest, ClearRGB10A2)
+{
+    RunClearTest(DXGI_FORMAT_R10G10B10A2_UNORM);
+}
+
+TEST_P(D3DTextureClearTest, ClearRGBAF16)
+{
+    RunClearTest(DXGI_FORMAT_R16G16B16A16_FLOAT);
+}
+
+TEST_P(D3DTextureClearTest, ClearR16)
+{
+    RunClearTest(DXGI_FORMAT_R16_UNORM);
+}
+
+TEST_P(D3DTextureClearTest, ClearRG16)
+{
+    RunClearTest(DXGI_FORMAT_R16G16_UNORM);
 }
 
 TEST_P(D3DTextureTest, NonRenderableTextureImage)
@@ -1433,7 +1537,7 @@
     d3d11_texture->Release();
 }
 
-TEST_P(D3DTextureTest, TextureArrayImage)
+TEST_P(D3DTextureTest, TextureArray)
 {
     ANGLE_SKIP_TEST_IF(!valid() || !IsD3D11());
 
@@ -1745,6 +1849,7 @@
 // Use this to select which configurations (e.g. which renderer, which GLES major version) these
 // tests should be run against.
 ANGLE_INSTANTIATE_TEST_ES2(D3DTextureTest);
+ANGLE_INSTANTIATE_TEST_ES2(D3DTextureClearTest);
 ANGLE_INSTANTIATE_TEST_ES2(D3DTextureYUVTest);
 ANGLE_INSTANTIATE_TEST_ES3(D3DTextureTestES3);
 ANGLE_INSTANTIATE_TEST_ES3(D3DTextureYUVTestES3);
diff --git a/src/tests/gl_tests/FramebufferFetchTest.cpp b/src/tests/gl_tests/FramebufferFetchTest.cpp
index 80a3eba..531d024 100644
--- a/src/tests/gl_tests/FramebufferFetchTest.cpp
+++ b/src/tests/gl_tests/FramebufferFetchTest.cpp
@@ -1606,5 +1606,5 @@
 }
 
 GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(FramebufferFetchES31);
-ANGLE_INSTANTIATE_TEST_ES31(FramebufferFetchES31);
+ANGLE_INSTANTIATE_TEST_ES31_AND(FramebufferFetchES31, WithDirectSPIRVGeneration(ES31_VULKAN()));
 }  // namespace angle
diff --git a/src/tests/gl_tests/FramebufferTest.cpp b/src/tests/gl_tests/FramebufferTest.cpp
index ff01848..1bfbcc9 100644
--- a/src/tests/gl_tests/FramebufferTest.cpp
+++ b/src/tests/gl_tests/FramebufferTest.cpp
@@ -1095,6 +1095,560 @@
     ASSERT_GL_NO_ERROR();
 }
 
+class FramebufferTestWithFormatFallback : public ANGLETest
+{
+  protected:
+    FramebufferTestWithFormatFallback()
+    {
+        setWindowWidth(16);
+        setWindowHeight(16);
+        setConfigRedBits(8);
+        setConfigGreenBits(8);
+        setConfigBlueBits(8);
+        setConfigAlphaBits(8);
+        setConfigDepthBits(24);
+        setConfigStencilBits(8);
+    }
+
+    void texImageFollowedByFBORead(GLenum internalFormat, GLenum type);
+    void blitCopyFollowedByFBORead(GLenum internalFormat, GLenum type);
+    void copyTexImageFollowedBySampling(GLenum internalFormat, GLenum type);
+    void cubeTexImageFollowedByFBORead(GLenum internalFormat, GLenum type);
+    GLushort convertGLColorToUShort(GLenum internalFormat, const GLColor &color);
+    static constexpr GLsizei kTexWidth  = 16;
+    static constexpr GLsizei kTexHeight = 16;
+    static constexpr GLsizei kMaxLevel  = 4;
+};
+
+GLushort FramebufferTestWithFormatFallback::convertGLColorToUShort(GLenum internalFormat,
+                                                                   const GLColor &color)
+{
+    GLushort r, g, b, a;
+    switch (internalFormat)
+    {
+        case GL_RGB5_A1:
+            r = (color.R >> 3) << 11;
+            g = (color.G >> 3) << 6;
+            b = (color.B >> 3) << 1;
+            a = color.A >> 7;
+            break;
+        case GL_RGBA4:
+            r = (color.R >> 4) << 12;
+            g = (color.G >> 4) << 8;
+            b = (color.B >> 4) << 4;
+            a = color.A >> 4;
+            break;
+        default:
+            UNREACHABLE();
+            r = 0;
+            g = 0;
+            b = 0;
+            a = 0;
+            break;
+    }
+    return r | g | b | a;
+}
+
+// Test texture format fallback while it has staged updates.
+void FramebufferTestWithFormatFallback::texImageFollowedByFBORead(GLenum internalFormat,
+                                                                  GLenum type)
+{
+    ANGLE_GL_PROGRAM(program, essl3_shaders::vs::Texture2DLod(), essl3_shaders::fs::Texture2DLod());
+    GLint textureLocation = glGetUniformLocation(program, essl3_shaders::Texture2DUniform());
+    ASSERT_NE(-1, textureLocation);
+    GLint lodLocation = glGetUniformLocation(program, essl3_shaders::LodUniform());
+    ASSERT_NE(-1, lodLocation);
+
+    const GLColor kColor = GLColor::blue;
+
+    for (int loop = 0; loop < 4; loop++)
+    {
+        GLTexture texture;
+        glBindTexture(GL_TEXTURE_2D, texture);
+        const GLushort u16Color = convertGLColorToUShort(internalFormat, kColor);
+        std::vector<GLushort> pixels(kTexWidth * kTexHeight, u16Color);
+        if (loop == 0 || loop == 2)
+        {
+            glTexImage2D(GL_TEXTURE_2D, 0, internalFormat, kTexWidth, kTexHeight, 0, GL_RGBA, type,
+                         pixels.data());
+        }
+        else
+        {
+            glTexStorage2D(GL_TEXTURE_2D, 1, internalFormat, kTexWidth, kTexHeight);
+            glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, kTexWidth, kTexHeight, GL_RGBA, type,
+                            pixels.data());
+        }
+        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
+        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
+
+        if (loop >= 2)
+        {
+            // Draw quad using texture
+            glUseProgram(program);
+            glActiveTexture(GL_TEXTURE0);
+            glBindTexture(GL_TEXTURE_2D, texture);
+            glClearColor(0, 0, 0, 1);
+            glClear(GL_COLOR_BUFFER_BIT);
+            glUniform1f(lodLocation, 0);
+            drawQuad(program, essl3_shaders::PositionAttrib(), 0.5f);
+            EXPECT_PIXEL_EQ(getWindowWidth() / 2, getWindowHeight() / 2, 0, 0, 255, 255);
+            ASSERT_GL_NO_ERROR();
+        }
+
+        // attach blue texture to FBO
+        GLFramebuffer fbo;
+        glBindFramebuffer(GL_FRAMEBUFFER, fbo);
+        glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, texture, 0);
+        EXPECT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
+        EXPECT_PIXEL_EQ(kTexWidth / 2, kTexHeight / 2, kColor.R, kColor.G, kColor.B, kColor.A);
+        ASSERT_GL_NO_ERROR();
+    }
+}
+TEST_P(FramebufferTestWithFormatFallback, R5G5B5A1_TexImage)
+{
+    texImageFollowedByFBORead(GL_RGB5_A1, GL_UNSIGNED_SHORT_5_5_5_1);
+}
+TEST_P(FramebufferTestWithFormatFallback, R4G4B4A4_TexImage)
+{
+    texImageFollowedByFBORead(GL_RGBA4, GL_UNSIGNED_SHORT_4_4_4_4);
+}
+
+// Test texture format fallback while it has staged updates and then do copyTexImage2D and followed
+// by sampling.
+void FramebufferTestWithFormatFallback::copyTexImageFollowedBySampling(GLenum internalFormat,
+                                                                       GLenum type)
+{
+    const GLColor kColor = GLColor::blue;
+    // Create blue texture
+    GLTexture blueTex2D;
+    glBindTexture(GL_TEXTURE_2D, blueTex2D);
+    const GLushort u16Color = convertGLColorToUShort(internalFormat, kColor);
+    std::vector<GLushort> bluePixels(kTexWidth * kTexHeight, u16Color);
+    glTexImage2D(GL_TEXTURE_2D, 0, internalFormat, kTexWidth, kTexHeight, 0, GL_RGBA, type,
+                 bluePixels.data());
+    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
+    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
+
+    // attach blue texture to FBO and read back to verify. This should trigger format conversion
+    GLFramebuffer blueFbo;
+    glBindFramebuffer(GL_FRAMEBUFFER, blueFbo);
+    glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, blueTex2D, 0);
+    EXPECT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
+    EXPECT_PIXEL_EQ(kTexWidth / 2, kTexHeight / 2, 0, 0, 255, 255);
+    ASSERT_GL_NO_ERROR();
+
+    // Create red texture
+    GLTexture copyTex2D;
+    glBindTexture(GL_TEXTURE_2D, copyTex2D);
+    std::vector<GLushort> redPixels(kTexWidth * kTexHeight, 0xF801);
+    glTexImage2D(GL_TEXTURE_2D, 0, internalFormat, kTexWidth, kTexHeight, 0, GL_RGBA, type,
+                 redPixels.data());
+    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
+    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
+
+    // CopyTexImage from blue to red
+    glCopyTexImage2D(GL_TEXTURE_2D, 0, internalFormat, 0, 0, kTexWidth, kTexHeight, 0);
+    ASSERT_GL_NO_ERROR();
+
+    // Draw with copyTex2D
+    glBindFramebuffer(GL_FRAMEBUFFER, 0);
+    ANGLE_GL_PROGRAM(program, essl3_shaders::vs::Texture2DLod(), essl3_shaders::fs::Texture2DLod());
+    glUseProgram(program);
+    GLint textureLocation = glGetUniformLocation(program, essl3_shaders::Texture2DUniform());
+    ASSERT_NE(-1, textureLocation);
+    GLint lodLocation = glGetUniformLocation(program, essl3_shaders::LodUniform());
+    ASSERT_NE(-1, lodLocation);
+    glActiveTexture(GL_TEXTURE0);
+    glBindTexture(GL_TEXTURE_2D, copyTex2D);
+    glClearColor(0, 1, 0, 1);
+    glClear(GL_COLOR_BUFFER_BIT);
+    glUniform1f(lodLocation, 0);
+    drawQuad(program, essl3_shaders::PositionAttrib(), 0.5f);
+    EXPECT_PIXEL_EQ(getWindowWidth() / 2, getWindowHeight() / 2, kColor.R, kColor.G, kColor.B,
+                    kColor.A);
+    ASSERT_GL_NO_ERROR();
+}
+TEST_P(FramebufferTestWithFormatFallback, R5G5B5A1_CopyTexImage)
+{
+    copyTexImageFollowedBySampling(GL_RGB5_A1, GL_UNSIGNED_SHORT_5_5_5_1);
+}
+TEST_P(FramebufferTestWithFormatFallback, R4G4B4A4_CopyTexImage)
+{
+    copyTexImageFollowedBySampling(GL_RGBA4, GL_UNSIGNED_SHORT_4_4_4_4);
+}
+
+// Test texture format fallback while it has staged updates and then do FBO blit and followed by
+// copyTexImage2D.
+void FramebufferTestWithFormatFallback::blitCopyFollowedByFBORead(GLenum internalFormat,
+                                                                  GLenum type)
+{
+    for (int loop = 0; loop < 2; loop++)
+    {
+        // Create blue texture
+        GLTexture blueTex2D;
+        glBindTexture(GL_TEXTURE_2D, blueTex2D);
+        GLushort u16Color = convertGLColorToUShort(internalFormat, GLColor::blue);
+        std::vector<GLushort> bluePixels(kTexWidth * kTexHeight, u16Color);
+        glTexImage2D(GL_TEXTURE_2D, 0, internalFormat, kTexWidth, kTexHeight, 0, GL_RGBA, type,
+                     bluePixels.data());
+        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
+        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
+
+        // attach blue texture to FBO
+        GLFramebuffer readFbo;
+        glBindFramebuffer(GL_READ_FRAMEBUFFER, readFbo);
+        glFramebufferTexture2D(GL_READ_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, blueTex2D,
+                               0);
+        EXPECT_GL_FRAMEBUFFER_COMPLETE(GL_READ_FRAMEBUFFER);
+
+        GLTexture redTex2D;
+        GLRenderbuffer renderBuffer;
+        GLFramebuffer drawFbo;
+        if (loop == 0)
+        {
+            glBindRenderbuffer(GL_RENDERBUFFER, renderBuffer);
+            glRenderbufferStorage(GL_RENDERBUFFER, GL_RGBA4, kTexWidth, kTexHeight);
+
+            glBindFramebuffer(GL_DRAW_FRAMEBUFFER, drawFbo);
+            glFramebufferRenderbuffer(GL_DRAW_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER,
+                                      renderBuffer);
+            EXPECT_GL_FRAMEBUFFER_COMPLETE(GL_DRAW_FRAMEBUFFER);
+            glClearColor(1.0, 0.0, 0.0, 1.0);
+            glClear(GL_COLOR_BUFFER_BIT);
+        }
+        else
+        {
+            glBindTexture(GL_TEXTURE_2D, redTex2D);
+            u16Color = convertGLColorToUShort(internalFormat, GLColor::red);
+            std::vector<GLushort> redPixels(kTexWidth * kTexHeight, u16Color);
+            glTexImage2D(GL_TEXTURE_2D, 0, internalFormat, kTexWidth, kTexHeight, 0, GL_RGBA, type,
+                         redPixels.data());
+            glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
+            glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
+
+            glBindFramebuffer(GL_DRAW_FRAMEBUFFER, drawFbo);
+            glFramebufferTexture2D(GL_DRAW_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D,
+                                   redTex2D, 0);
+            EXPECT_GL_FRAMEBUFFER_COMPLETE(GL_DRAW_FRAMEBUFFER);
+        }
+
+        // Blit
+        glBindFramebuffer(GL_READ_FRAMEBUFFER, readFbo);
+        glBlitFramebuffer(0, 0, kTexWidth, kTexHeight, 0, 0, kTexWidth, kTexHeight,
+                          GL_COLOR_BUFFER_BIT, GL_NEAREST);
+        ASSERT_GL_NO_ERROR();
+
+        GLFramebuffer readFbo2;
+        if (loop == 0)
+        {
+            // CopyTexImage from renderBuffer to copyTex2D
+            glBindFramebuffer(GL_READ_FRAMEBUFFER, readFbo2);
+            glFramebufferRenderbuffer(GL_READ_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER,
+                                      renderBuffer);
+        }
+        else
+        {
+
+            // CopyTexImage from redTex2D to copyTex2D
+            glBindFramebuffer(GL_READ_FRAMEBUFFER, readFbo2);
+            glFramebufferTexture2D(GL_READ_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D,
+                                   redTex2D, 0);
+        }
+        GLTexture copyTex2D;
+        glBindTexture(GL_TEXTURE_2D, copyTex2D);
+        glCopyTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 0, 0, kTexWidth, kTexHeight, 0);
+        ASSERT_GL_NO_ERROR();
+        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
+        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
+        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
+        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
+        glBindTexture(GL_TEXTURE_2D, 0);
+
+        // Read out red texture
+        GLFramebuffer readFbo3;
+        glBindFramebuffer(GL_READ_FRAMEBUFFER, readFbo3);
+        glFramebufferTexture2D(GL_READ_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, copyTex2D,
+                               0);
+        EXPECT_GL_FRAMEBUFFER_COMPLETE(GL_READ_FRAMEBUFFER);
+        EXPECT_PIXEL_EQ(kTexWidth / 2, kTexHeight / 2, 0, 0, 255, 255);
+        ASSERT_GL_NO_ERROR();
+    }
+}
+TEST_P(FramebufferTestWithFormatFallback, R5G5B5A1_BlitCopyTexImage)
+{
+    blitCopyFollowedByFBORead(GL_RGB5_A1, GL_UNSIGNED_SHORT_5_5_5_1);
+}
+TEST_P(FramebufferTestWithFormatFallback, RGBA4444_BlitCopyTexImage)
+{
+    blitCopyFollowedByFBORead(GL_RGBA4, GL_UNSIGNED_SHORT_4_4_4_4);
+}
+
+// Test texture format fallback while it has staged updates, specially for cubemap target.
+void FramebufferTestWithFormatFallback::cubeTexImageFollowedByFBORead(GLenum internalFormat,
+                                                                      GLenum type)
+{
+    const GLColor kColors[6] = {GLColor::red,  GLColor::green,  GLColor::blue,
+                                GLColor::cyan, GLColor::yellow, GLColor::magenta};
+    GLTexture cubeTex2D;
+    glBindTexture(GL_TEXTURE_CUBE_MAP, cubeTex2D);
+    for (GLenum target = GL_TEXTURE_CUBE_MAP_POSITIVE_X; target <= GL_TEXTURE_CUBE_MAP_NEGATIVE_Z;
+         target++)
+    {
+        int j                   = target - GL_TEXTURE_CUBE_MAP_POSITIVE_X;
+        const GLushort u16Color = convertGLColorToUShort(internalFormat, kColors[j]);
+        std::vector<GLushort> pixels(kTexWidth * kTexHeight, u16Color);
+        glTexImage2D(target, 0, internalFormat, kTexWidth, kTexHeight, 0, GL_RGBA, type,
+                     pixels.data());
+    }
+    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
+    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
+
+    // attach blue texture to FBO
+    GLFramebuffer fbo;
+    glBindFramebuffer(GL_FRAMEBUFFER, fbo);
+    for (GLenum target = GL_TEXTURE_CUBE_MAP_POSITIVE_X; target <= GL_TEXTURE_CUBE_MAP_NEGATIVE_Z;
+         target++)
+    {
+        GLint j = target - GL_TEXTURE_CUBE_MAP_POSITIVE_X;
+        glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, target, cubeTex2D, 0);
+        EXPECT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
+        EXPECT_PIXEL_EQ(kTexWidth / 2, kTexHeight / 2, kColors[j].R, kColors[j].G, kColors[j].B,
+                        kColors[j].A);
+    }
+    ASSERT_GL_NO_ERROR();
+}
+TEST_P(FramebufferTestWithFormatFallback, R5G5B5A1_CubeTexImage)
+{
+    cubeTexImageFollowedByFBORead(GL_RGB5_A1, GL_UNSIGNED_SHORT_5_5_5_1);
+}
+TEST_P(FramebufferTestWithFormatFallback, R4G4B4A4_CubeTexImage)
+{
+    cubeTexImageFollowedByFBORead(GL_RGBA4, GL_UNSIGNED_SHORT_4_4_4_4);
+}
+
+// Tests that the out-of-range staged update is reformated when mipmapping is enabled, but not
+// before it.
+TEST_P(FramebufferTestWithFormatFallback, R4G4B4A4_OutOfRangeStagedUpdateReformated)
+{
+    ANGLE_GL_PROGRAM(program, essl3_shaders::vs::Texture2DLod(), essl3_shaders::fs::Texture2DLod());
+    glUseProgram(program);
+    GLint textureLocation = glGetUniformLocation(program, essl3_shaders::Texture2DUniform());
+    ASSERT_NE(-1, textureLocation);
+    GLint lodLocation = glGetUniformLocation(program, essl3_shaders::LodUniform());
+    ASSERT_NE(-1, lodLocation);
+
+    GLTexture texture;
+    glBindTexture(GL_TEXTURE_2D, texture);
+    GLushort u16Color = convertGLColorToUShort(GL_RGBA4, GLColor::red);
+    std::vector<GLushort> pixels(kTexWidth * kTexHeight, u16Color);
+    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, kTexWidth, kTexHeight, 0, GL_RGBA,
+                 GL_UNSIGNED_SHORT_4_4_4_4, pixels.data());
+    u16Color = convertGLColorToUShort(GL_RGB5_A1, GLColor::green);
+    pixels.assign(kTexWidth * kTexHeight, u16Color);
+    glTexImage2D(GL_TEXTURE_2D, 1, GL_RGBA, kTexWidth / 2, kTexHeight / 2, 0, GL_RGBA,
+                 GL_UNSIGNED_SHORT_5_5_5_1, pixels.data());
+    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
+    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
+
+    // Draw quad
+    glActiveTexture(GL_TEXTURE0);
+    glBindTexture(GL_TEXTURE_2D, texture);
+    glUniform1f(lodLocation, 0);
+    drawQuad(program, essl3_shaders::PositionAttrib(), 0.5f);
+    EXPECT_PIXEL_EQ(getWindowWidth() / 2, getWindowHeight() / 2, 255, 0, 0, 255);
+
+    // Now trigger format conversion
+    GLFramebuffer readFbo;
+    glBindFramebuffer(GL_READ_FRAMEBUFFER, readFbo);
+    glFramebufferTexture2D(GL_READ_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, texture, 0);
+    EXPECT_GL_FRAMEBUFFER_COMPLETE(GL_READ_FRAMEBUFFER);
+    EXPECT_PIXEL_EQ(getWindowWidth() / 2, getWindowWidth() / 2, 255, 0, 0, 255);
+
+    // update level0 with compatible data and enable mipmap
+    u16Color = convertGLColorToUShort(GL_RGB5_A1, GLColor::blue);
+    pixels.assign(kTexWidth * kTexHeight, u16Color);
+    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, kTexWidth, kTexHeight, 0, GL_RGBA,
+                 GL_UNSIGNED_SHORT_5_5_5_1, pixels.data());
+    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST_MIPMAP_NEAREST);
+    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
+    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, 1);
+
+    // Draw quad with lod0 and lod1 and verify color
+    glUniform1f(lodLocation, 0);
+    drawQuad(program, essl3_shaders::PositionAttrib(), 0.5f);
+    EXPECT_PIXEL_EQ(getWindowWidth() / 2, getWindowHeight() / 2, 0, 0, 255, 255);
+    glUniform1f(lodLocation, 1);
+    drawQuad(program, essl3_shaders::PositionAttrib(), 0.5f);
+    EXPECT_PIXEL_EQ(getWindowWidth() / 2, getWindowHeight() / 2, 0, 0, 255, 255);
+    ASSERT_GL_NO_ERROR();
+}
+
+// Tests that the texture is reformatted when the clear is done through the draw path.
+TEST_P(FramebufferTestWithFormatFallback, R4G4B4A4_MaskedClear)
+{
+    for (int loop = 0; loop < 2; loop++)
+    {
+        GLTexture texture;
+        glBindTexture(GL_TEXTURE_2D, texture);
+        GLushort u16Color = convertGLColorToUShort(GL_RGBA4, GLColor::red);
+        std::vector<GLushort> pixels(kTexWidth * kTexHeight, u16Color);
+        glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, kTexWidth, kTexHeight, 0, GL_RGBA,
+                     GL_UNSIGNED_SHORT_4_4_4_4, pixels.data());
+        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
+        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
+
+        if (loop == 0)
+        {
+            // Draw quad
+            ANGLE_GL_PROGRAM(program, essl3_shaders::vs::Texture2DLod(),
+                             essl3_shaders::fs::Texture2DLod());
+            glUseProgram(program);
+            GLint textureLocation =
+                glGetUniformLocation(program, essl3_shaders::Texture2DUniform());
+            ASSERT_NE(-1, textureLocation);
+            GLint lodLocation = glGetUniformLocation(program, essl3_shaders::LodUniform());
+            ASSERT_NE(-1, lodLocation);
+            glActiveTexture(GL_TEXTURE0);
+            glBindTexture(GL_TEXTURE_2D, texture);
+            glClearColor(0, 0, 0, 1);
+            glClear(GL_COLOR_BUFFER_BIT);
+            glUniform1f(lodLocation, 0);
+            drawQuad(program, essl3_shaders::PositionAttrib(), 0.5f);
+            EXPECT_PIXEL_EQ(getWindowWidth() / 2, getWindowHeight() / 2, 255, 0, 0, 255);
+            ASSERT_GL_NO_ERROR();
+        }
+
+        // Now trigger format conversion with masked clear
+        GLFramebuffer fbo;
+        glBindFramebuffer(GL_FRAMEBUFFER, fbo);
+        glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, texture, 0);
+        EXPECT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
+        glClearColor(0, 1, 1, 1);
+        glColorMask(false, true, false, false);
+        glClear(GL_COLOR_BUFFER_BIT);
+        EXPECT_PIXEL_EQ(kTexWidth / 2, kTexHeight / 2, 255, 255, 0, 255);
+        ASSERT_GL_NO_ERROR();
+    }
+}
+
+// Tests that glGenerateMipmap works when the format is converted to renderable..
+TEST_P(FramebufferTestWithFormatFallback, R4G4B4A4_GenerateMipmap)
+{
+    ANGLE_GL_PROGRAM(program, essl3_shaders::vs::Texture2DLod(), essl3_shaders::fs::Texture2DLod());
+    glUseProgram(program);
+    GLint textureLocation = glGetUniformLocation(program, essl3_shaders::Texture2DUniform());
+    ASSERT_NE(-1, textureLocation);
+    GLint lodLocation = glGetUniformLocation(program, essl3_shaders::LodUniform());
+    ASSERT_NE(-1, lodLocation);
+
+    for (int loop = 0; loop < 4; loop++)
+    {
+        GLTexture texture;
+        glBindTexture(GL_TEXTURE_2D, texture);
+        GLushort u16Color = convertGLColorToUShort(GL_RGBA4, GLColor::red);
+        std::vector<GLushort> pixels(kTexWidth * kTexHeight, u16Color);
+        glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, kTexWidth, kTexHeight, 0, GL_RGBA,
+                     GL_UNSIGNED_SHORT_4_4_4_4, pixels.data());
+        u16Color = convertGLColorToUShort(GL_RGBA4, GLColor::green);
+        pixels.assign(kTexWidth * kTexHeight, u16Color);
+        glTexImage2D(GL_TEXTURE_2D, 1, GL_RGBA, kTexWidth / 2, kTexHeight / 2, 0, GL_RGBA,
+                     GL_UNSIGNED_SHORT_5_5_5_1, pixels.data());
+        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
+        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
+
+        if (loop == 0 || loop == 2)
+        {
+            // Draw quad
+            glUniform1f(lodLocation, 0);
+            drawQuad(program, essl3_shaders::PositionAttrib(), 0.5f);
+            EXPECT_PIXEL_EQ(getWindowWidth() / 2, getWindowHeight() / 2, 255, 0, 0, 255);
+            ASSERT_GL_NO_ERROR();
+        }
+
+        if (loop > 2)
+        {
+            // Now trigger format conversion
+            GLFramebuffer readFbo;
+            glBindFramebuffer(GL_READ_FRAMEBUFFER, readFbo);
+            glFramebufferTexture2D(GL_READ_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D,
+                                   texture, 0);
+            EXPECT_GL_FRAMEBUFFER_COMPLETE(GL_READ_FRAMEBUFFER);
+        }
+
+        // GenerateMipmap
+        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST_MIPMAP_NEAREST);
+        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
+        glGenerateMipmap(GL_TEXTURE_2D);
+
+        // Verify each lod
+        for (int lod = 0; lod <= kMaxLevel; lod++)
+        {
+            glUniform1f(lodLocation, lod);
+            drawQuad(program, essl3_shaders::PositionAttrib(), 0.5f);
+            EXPECT_PIXEL_EQ(getWindowWidth() / 2, getWindowHeight() / 2, 255, 0, 0, 255);
+        }
+        ASSERT_GL_NO_ERROR();
+    }
+}
+
+// Tests that when reformatting the image, incompatible updates don't cause a problem.
+TEST_P(FramebufferTestWithFormatFallback, R4G4B4A4_InCompatibleFormat)
+{
+    ANGLE_GL_PROGRAM(program, essl3_shaders::vs::Texture2DLod(), essl3_shaders::fs::Texture2DLod());
+    glUseProgram(program);
+    GLint textureLocation = glGetUniformLocation(program, essl3_shaders::Texture2DUniform());
+    ASSERT_NE(-1, textureLocation);
+    GLint lodLocation = glGetUniformLocation(program, essl3_shaders::LodUniform());
+    ASSERT_NE(-1, lodLocation);
+
+    for (int loop = 0; loop < 4; loop++)
+    {
+        GLTexture texture;
+        glBindTexture(GL_TEXTURE_2D, texture);
+        // Define a texture with lod0 and lod1 with two different effective internal formats or size
+        GLushort u16Color = convertGLColorToUShort(GL_RGBA4, GLColor::red);
+        std::vector<GLushort> pixels(kTexWidth * kTexHeight, u16Color);
+        glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, kTexWidth, kTexHeight, 0, GL_RGBA,
+                     GL_UNSIGNED_SHORT_4_4_4_4, pixels.data());
+        if (loop < 2)
+        {
+            u16Color = convertGLColorToUShort(GL_RGB5_A1, GLColor::green);
+            pixels.assign(kTexWidth * kTexHeight, u16Color);
+            // bad effective internal format
+            glTexImage2D(GL_TEXTURE_2D, 1, GL_RGBA, kTexWidth / 2, kTexHeight / 2, 0, GL_RGBA,
+                         GL_UNSIGNED_SHORT_5_5_5_1, pixels.data());
+        }
+        else
+        {
+            u16Color = convertGLColorToUShort(GL_RGBA4, GLColor::green);
+            pixels.assign(kTexWidth * kTexHeight, u16Color);
+            // bad size
+            glTexImage2D(GL_TEXTURE_2D, 1, GL_RGBA, kTexWidth, kTexHeight, 0, GL_RGBA,
+                         GL_UNSIGNED_SHORT_4_4_4_4, pixels.data());
+        }
+        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST_MIPMAP_NEAREST);
+        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
+
+        // Now trigger format conversion and verify lod0
+        GLFramebuffer readFbo;
+        glBindFramebuffer(GL_READ_FRAMEBUFFER, readFbo);
+        glFramebufferTexture2D(GL_READ_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, texture,
+                               0);
+        EXPECT_GL_FRAMEBUFFER_COMPLETE(GL_READ_FRAMEBUFFER);
+        EXPECT_PIXEL_EQ(kTexWidth / 2, kTexHeight / 2, 255, 0, 0, 255);
+
+        if (loop == 1 || loop == 3)
+        {
+            // Disable mipmap and sample from lod0 and verify
+            glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
+            glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
+            glUniform1f(lodLocation, 0);
+            drawQuad(program, essl3_shaders::PositionAttrib(), 0.5f);
+            EXPECT_PIXEL_EQ(getWindowWidth() / 2, getWindowHeight() / 2, 255, 0, 0, 255);
+        }
+    }
+}
+
 class FramebufferTest_ES31 : public ANGLETest
 {
   protected:
@@ -3382,3 +3936,4 @@
 
 GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(FramebufferTest_ES31);
 ANGLE_INSTANTIATE_TEST_ES31(FramebufferTest_ES31);
+ANGLE_INSTANTIATE_TEST_ES3(FramebufferTestWithFormatFallback);
diff --git a/src/tests/gl_tests/GLSLTest.cpp b/src/tests/gl_tests/GLSLTest.cpp
index 41c6cf8..fc877a0 100644
--- a/src/tests/gl_tests/GLSLTest.cpp
+++ b/src/tests/gl_tests/GLSLTest.cpp
@@ -7,6 +7,7 @@
 #include "test_utils/ANGLETest.h"
 
 #include "test_utils/gl_raii.h"
+#include "util/shader_utils.h"
 
 using namespace angle;
 
@@ -515,6 +516,10 @@
 class GLSLTest_ES31 : public GLSLTest
 {};
 
+// Tests the "init output variables" ANGLE shader translator option.
+class GLSLTest_ES31_InitShaderVariables : public GLSLTest
+{};
+
 std::string BuildBigInitialStackShader(int length)
 {
     std::string result;
@@ -548,6 +553,258 @@
     ANGLE_GL_PROGRAM(program, essl1_shaders::vs::Simple(), kFS);
 }
 
+TEST_P(GLSLTest_ES3, CompareEqualityOfArrayOfVectors)
+{
+    constexpr char kFS[] = R"(#version 300 es
+precision mediump float;
+out vec4 fragColor;
+uniform vec3 a[3];
+uniform vec3 b[3];
+void main() {
+  bool same = a == b;
+  fragColor = vec4(0);
+  if (same) {
+    fragColor = vec4(1);
+  }
+}
+)";
+
+    ANGLE_GL_PROGRAM(program, essl3_shaders::vs::Simple(), kFS);
+    glUseProgram(program);
+
+    GLint aLocation = glGetUniformLocation(program, "a");
+    GLint bLocation = glGetUniformLocation(program, "b");
+    EXPECT_NE(aLocation, -1);
+    EXPECT_NE(bLocation, -1);
+
+    drawQuad(program, essl3_shaders::PositionAttrib(), 0.5f, 1.0f, true);
+    EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::white);
+
+    static float almostZeros[] = {0, 0, 0, 0, 0, 0, 0, 1, 0};
+    glUniform3fv(bLocation, 9, almostZeros);
+
+    drawQuad(program, essl3_shaders::PositionAttrib(), 0.5f, 1.0f, true);
+    EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::transparentBlack);
+
+    glUniform3fv(aLocation, 9, almostZeros);
+    drawQuad(program, essl3_shaders::PositionAttrib(), 0.5f, 1.0f, true);
+    EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::white);
+
+    ASSERT_GL_NO_ERROR();
+}
+
+TEST_P(GLSLTest_ES3, CompareEqualityOfArrayOfMatrices)
+{
+    constexpr char kFS[] = R"(#version 300 es
+precision mediump float;
+out vec4 fragColor;
+uniform mat3 a[3];
+uniform mat3 b[3];
+void main() {
+  bool same = a == b;
+  fragColor = vec4(0);
+  if (same) {
+    fragColor = vec4(1);
+  }
+}
+)";
+
+    ANGLE_GL_PROGRAM(program, essl3_shaders::vs::Simple(), kFS);
+    glUseProgram(program);
+
+    GLint aLocation = glGetUniformLocation(program, "a");
+    GLint bLocation = glGetUniformLocation(program, "b");
+    EXPECT_NE(aLocation, -1);
+    EXPECT_NE(bLocation, -1);
+
+    drawQuad(program, essl3_shaders::PositionAttrib(), 0.5f, 1.0f, true);
+    EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::white);
+
+    static float almostZeros[] = {
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0,
+    };
+    glUniformMatrix3fv(bLocation, 27, false, almostZeros);
+
+    drawQuad(program, essl3_shaders::PositionAttrib(), 0.5f, 1.0f, true);
+    EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::transparentBlack);
+
+    glUniformMatrix3fv(aLocation, 27, false, almostZeros);
+    drawQuad(program, essl3_shaders::PositionAttrib(), 0.5f, 1.0f, true);
+    EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::white);
+
+    ASSERT_GL_NO_ERROR();
+}
+
+TEST_P(GLSLTest_ES3, CompareEqualityOfArrayOfFloats)
+{
+    constexpr char kFS[] = R"(#version 300 es
+precision mediump float;
+out vec4 fragColor;
+uniform float a[3];
+uniform float b[3];
+void main() {
+  bool same = a == b;
+  fragColor = vec4(0);
+  if (same) {
+    fragColor = vec4(1);
+  }
+}
+)";
+
+    ANGLE_GL_PROGRAM(program, essl3_shaders::vs::Simple(), kFS);
+    glUseProgram(program);
+
+    GLint aLocation = glGetUniformLocation(program, "a");
+    GLint bLocation = glGetUniformLocation(program, "b");
+    EXPECT_NE(aLocation, -1);
+    EXPECT_NE(bLocation, -1);
+
+    drawQuad(program, essl3_shaders::PositionAttrib(), 0.5f, 1.0f, true);
+    EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::white);
+
+    static float almostZeros[] = {
+        0,
+        0,
+        1,
+    };
+    glUniform1fv(bLocation, 3, almostZeros);
+
+    drawQuad(program, essl3_shaders::PositionAttrib(), 0.5f, 1.0f, true);
+    EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::transparentBlack);
+
+    glUniform1fv(aLocation, 3, almostZeros);
+    drawQuad(program, essl3_shaders::PositionAttrib(), 0.5f, 1.0f, true);
+    EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::white);
+
+    ASSERT_GL_NO_ERROR();
+}
+
+TEST_P(GLSLTest_ES3, CompareInequalityOfArrayOfVectors)
+{
+    constexpr char kFS[] = R"(#version 300 es
+precision mediump float;
+out vec4 fragColor;
+uniform vec3 a[3];
+uniform vec3 b[3];
+void main() {
+  bool notSame = a != b;
+  fragColor = vec4(0);
+  if (notSame) {
+    fragColor = vec4(1);
+  }
+}
+)";
+
+    ANGLE_GL_PROGRAM(program, essl3_shaders::vs::Simple(), kFS);
+    glUseProgram(program);
+
+    GLint aLocation = glGetUniformLocation(program, "a");
+    GLint bLocation = glGetUniformLocation(program, "b");
+    EXPECT_NE(aLocation, -1);
+    EXPECT_NE(bLocation, -1);
+
+    drawQuad(program, essl3_shaders::PositionAttrib(), 0.5f, 1.0f, true);
+    EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::transparentBlack);
+
+    static float almostZeros[] = {0, 0, 0, 0, 0, 0, 0, 1, 0};
+    glUniform3fv(bLocation, 9, almostZeros);
+
+    drawQuad(program, essl3_shaders::PositionAttrib(), 0.5f, 1.0f, true);
+    EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::white);
+
+    glUniform3fv(aLocation, 9, almostZeros);
+    drawQuad(program, essl3_shaders::PositionAttrib(), 0.5f, 1.0f, true);
+    EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::transparentBlack);
+
+    ASSERT_GL_NO_ERROR();
+}
+
+TEST_P(GLSLTest_ES3, CompareInequalityOfArrayOfMatrices)
+{
+    constexpr char kFS[] = R"(#version 300 es
+precision mediump float;
+out vec4 fragColor;
+uniform mat3 a[3];
+uniform mat3 b[3];
+void main() {
+  bool notSame = a != b;
+  fragColor = vec4(0);
+  if (notSame) {
+    fragColor = vec4(1);
+  }
+}
+)";
+
+    ANGLE_GL_PROGRAM(program, essl3_shaders::vs::Simple(), kFS);
+    glUseProgram(program);
+
+    GLint aLocation = glGetUniformLocation(program, "a");
+    GLint bLocation = glGetUniformLocation(program, "b");
+    EXPECT_NE(aLocation, -1);
+    EXPECT_NE(bLocation, -1);
+
+    drawQuad(program, essl3_shaders::PositionAttrib(), 0.5f, 1.0f, true);
+    EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::transparentBlack);
+
+    static float almostZeros[] = {
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0,
+    };
+    glUniformMatrix3fv(bLocation, 27, false, almostZeros);
+
+    drawQuad(program, essl3_shaders::PositionAttrib(), 0.5f, 1.0f, true);
+    EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::white);
+
+    glUniformMatrix3fv(aLocation, 27, false, almostZeros);
+    drawQuad(program, essl3_shaders::PositionAttrib(), 0.5f, 1.0f, true);
+    EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::transparentBlack);
+
+    ASSERT_GL_NO_ERROR();
+}
+
+TEST_P(GLSLTest_ES3, CompareInequalityOfArrayOfFloats)
+{
+    constexpr char kFS[] = R"(#version 300 es
+precision mediump float;
+out vec4 fragColor;
+uniform float a[3];
+uniform float b[3];
+void main() {
+  bool notSame = a != b;
+  fragColor = vec4(0);
+  if (notSame) {
+    fragColor = vec4(1);
+  }
+}
+)";
+
+    ANGLE_GL_PROGRAM(program, essl3_shaders::vs::Simple(), kFS);
+    glUseProgram(program);
+
+    GLint aLocation = glGetUniformLocation(program, "a");
+    GLint bLocation = glGetUniformLocation(program, "b");
+    EXPECT_NE(aLocation, -1);
+    EXPECT_NE(bLocation, -1);
+
+    drawQuad(program, essl3_shaders::PositionAttrib(), 0.5f, 1.0f, true);
+    EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::transparentBlack);
+
+    static float almostZeros[] = {
+        0,
+        0,
+        1,
+    };
+    glUniform1fv(bLocation, 3, almostZeros);
+
+    drawQuad(program, essl3_shaders::PositionAttrib(), 0.5f, 1.0f, true);
+    EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::white);
+
+    glUniform1fv(aLocation, 3, almostZeros);
+    drawQuad(program, essl3_shaders::PositionAttrib(), 0.5f, 1.0f, true);
+    EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::transparentBlack);
+
+    ASSERT_GL_NO_ERROR();
+}
+
 // Test that array of fragment shader outputs is processed properly and draws
 // E.g. was issue with "out vec4 frag_color[4];"
 TEST_P(GLSLTest_ES3, FragmentShaderOutputArray)
@@ -2596,11 +2853,10 @@
 
 uniform int i;
 uniform uint u;
+uniform bool b;
 
 void main()
 {
-    bool b = i > 10;
-
     mat3x2 mi = mat3x2(i);
     mat4 mu = mat4(u);
     mat2x4 mb = mat2x4(b);
@@ -2618,10 +2874,55 @@
 
     GLint iloc = glGetUniformLocation(program, "i");
     GLint uloc = glGetUniformLocation(program, "u");
+    GLint bloc = glGetUniformLocation(program, "b");
     ASSERT_NE(iloc, -1);
     ASSERT_NE(uloc, -1);
+    ASSERT_NE(bloc, -1);
     glUniform1i(iloc, -123);
     glUniform1ui(uloc, 456);
+    glUniform1ui(bloc, 1);
+
+    drawQuad(program, essl3_shaders::PositionAttrib(), 0.5f);
+    EXPECT_GL_NO_ERROR();
+
+    EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::white);
+}
+
+// Test that constructing vectors from non-float types works.
+TEST_P(GLSLTest_ES3, ConstructVectorFromNonFloat)
+{
+    constexpr char kFS[] = R"(#version 300 es
+precision highp float;
+out vec4 color;
+
+uniform ivec2 i;
+uniform uvec2 u;
+uniform bvec2 b;
+
+void main()
+{
+    vec2 v2 = vec2(i.x, b);
+    vec3 v3 = vec3(b, u);
+    vec4 v4 = vec4(i, u);
+
+    color = vec4(v2.x == float(i.x) && v2.y == float(b.x) ? 1 : 0,
+                 v3.x == float(b.x) && v3.y == float(b.y) && v3.z == float(u.x) ? 1 : 0,
+                 v4.x == float(i.x) && v4.y == float(i.y) && v4.z == float(u.x) && v4.w == float(u.y) ? 1 : 0,
+                 1);
+})";
+
+    ANGLE_GL_PROGRAM(program, essl3_shaders::vs::Simple(), kFS);
+    glUseProgram(program);
+
+    GLint iloc = glGetUniformLocation(program, "i");
+    GLint uloc = glGetUniformLocation(program, "u");
+    GLint bloc = glGetUniformLocation(program, "b");
+    ASSERT_NE(iloc, -1);
+    ASSERT_NE(uloc, -1);
+    ASSERT_NE(bloc, -1);
+    glUniform2i(iloc, -123, -23);
+    glUniform2ui(uloc, 456, 76);
+    glUniform2ui(bloc, 1, 0);
 
     drawQuad(program, essl3_shaders::PositionAttrib(), 0.5f);
     EXPECT_GL_NO_ERROR();
@@ -2644,11 +2945,12 @@
     ivec3 vi = ivec3(m);
     uvec2 vu = uvec2(m);
     bvec4 vb = bvec4(m);
+    bvec2 vb2 = bvec2(vi.x, m);
 
     color = vec4(vi.x == int(f) ? 1 : 0,
                  vu.x == uint(f) ? 1 : 0,
                  vb.x == bool(f) ? 1 : 0,
-                 1);
+                 vb2.x == bool(f) && vb2.y == bool(f) ? 1 : 0);
 })";
 
     ANGLE_GL_PROGRAM(program, essl3_shaders::vs::Simple(), kFS);
@@ -3091,7 +3393,10 @@
 TEST_P(GLSLTest_ES3, UnaryMinusOperatorSignedInt)
 {
     // http://anglebug.com/5242
-    ANGLE_SKIP_TEST_IF(IsMetal() && IsIntel());
+    // Test times out on dual-GPU MacBook Pros that don't show up as
+    // IsIntel(); skip on all Metal for now.
+    // See also http://anglebug.com/6174 .
+    ANGLE_SKIP_TEST_IF(IsMetal());
 
     constexpr char kVS[] =
         "#version 300 es\n"
@@ -3141,7 +3446,10 @@
 TEST_P(GLSLTest_ES3, UnaryMinusOperatorUnsignedInt)
 {
     // http://anglebug.com/5242
-    ANGLE_SKIP_TEST_IF(IsMetal() && IsIntel());
+    // Test times out on dual-GPU MacBook Pros that don't show up as
+    // IsIntel(); skip on all Metal for now.
+    // See also http://anglebug.com/6174 .
+    ANGLE_SKIP_TEST_IF(IsMetal());
 
     constexpr char kVS[] =
         "#version 300 es\n"
@@ -3209,6 +3517,133 @@
     EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::green);
 }
 
+// Test that nesting ternary and short-circuitting operators work.
+TEST_P(GLSLTest, NestedTernaryAndShortCircuit)
+{
+    // Note that the uniform doesn't need to be set, and will contain the default value of false.
+    constexpr char kFS[] = R"(
+precision mediump float;
+uniform bool u;
+void main()
+{
+    int a = u ? 12345 : 2;      // will be 2
+    int b = u ? 12345 : 4;      // will be 4
+    int c = u ? 12345 : 0;      // will be 0
+
+    if (a == 2                  // true path is taken
+        ? (b == 3               // false path is taken
+            ? (a=0) != 0
+            : b != 0            // true
+          ) && (                // short-circuit evaluates RHS
+            (a=7) == 7          // true, modifies a
+            ||                  // short-circuit doesn't evaluate RHS
+            (b=8) == 8
+          )
+        : (a == 0 && b == 0
+            ? (c += int((a=0) == 0 && (b=0) == 0)) != 0
+            : (c += int((a=0) != 0 && (b=0) != 0)) != 0))
+    {
+        c += 15;                // will execute
+    }
+
+    // Verify that a is 7, b is 4 and c is 15.
+    gl_FragColor = vec4(a == 7, b == 4, c == 15, 1);
+})";
+
+    ANGLE_GL_PROGRAM(prog, essl1_shaders::vs::Simple(), kFS);
+    drawQuad(prog.get(), essl1_shaders::PositionAttrib(), 0.5f);
+    EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::white);
+}
+
+// Test that uniform bvecN passed to functions work.
+TEST_P(GLSLTest_ES3, UniformBoolVectorPassedToFunctions)
+{
+    constexpr char kFS[] = R"(#version 300 es
+precision mediump float;
+uniform bvec4 u;
+out vec4 color;
+
+bool f(bvec4 bv)
+{
+    return all(bv.xz) && !any(bv.yw);
+}
+
+void main() {
+    color = f(u) ? vec4(0, 1, 0, 1) : vec4(1, 0, 0, 1);
+})";
+
+    ANGLE_GL_PROGRAM(prog, essl3_shaders::vs::Simple(), kFS);
+    glUseProgram(prog);
+
+    GLint uloc = glGetUniformLocation(prog, "u");
+    ASSERT_NE(uloc, -1);
+    glUniform4ui(uloc, true, false, true, false);
+
+    drawQuad(prog.get(), essl3_shaders::PositionAttrib(), 0.5f);
+    EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::green);
+}
+
+// Test that bvecN in storage buffer passed to functions work.
+TEST_P(GLSLTest_ES31, StorageBufferBoolVectorPassedToFunctions)
+{
+    constexpr char kCS[] = R"(#version 310 es
+layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
+layout(binding = 0, std430) buffer Output {
+    bvec4 b;
+    bool valid;
+} outbuf;
+
+bool f_in(bvec4 bv)
+{
+    return all(bv.xz) && !any(bv.yw);
+}
+
+bool f_inout(inout bvec4 bv)
+{
+    bool ok = all(bv.xz) && !any(bv.yw);
+    bv.xw = bvec2(false, true);
+    return ok;
+}
+
+void f_out(out bvec4 bv)
+{
+    bv = bvec4(false, true, false, true);
+}
+
+void main() {
+    bool valid = f_in(outbuf.b);
+    valid = f_inout(outbuf.b) && valid;
+    f_out(outbuf.b);
+    outbuf.valid = valid;
+})";
+
+    ANGLE_GL_COMPUTE_PROGRAM(program, kCS);
+    glUseProgram(program);
+
+    constexpr std::array<GLuint, 5> kOutputInitData = {true, false, true, false, false};
+    GLBuffer outputBuffer;
+    glBindBuffer(GL_SHADER_STORAGE_BUFFER, outputBuffer);
+    glBufferData(GL_SHADER_STORAGE_BUFFER, sizeof(kOutputInitData), kOutputInitData.data(),
+                 GL_STATIC_DRAW);
+    glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 0, outputBuffer);
+    EXPECT_GL_NO_ERROR();
+
+    glDispatchCompute(1, 1, 1);
+    EXPECT_GL_NO_ERROR();
+
+    glMemoryBarrier(GL_BUFFER_UPDATE_BARRIER_BIT);
+
+    const GLuint *ptr = reinterpret_cast<const GLuint *>(
+        glMapBufferRange(GL_SHADER_STORAGE_BUFFER, 0, sizeof(kOutputInitData), GL_MAP_READ_BIT));
+    fprintf(stderr, "%d %d %d %d %d\n", ptr[0], ptr[1], ptr[2], ptr[3], ptr[4]);
+    EXPECT_FALSE(ptr[0]);
+    EXPECT_TRUE(ptr[1]);
+    EXPECT_FALSE(ptr[2]);
+    EXPECT_TRUE(ptr[3]);
+    EXPECT_TRUE(ptr[4]);
+    glUnmapBuffer(GL_SHADER_STORAGE_BUFFER);
+}
+
 // Test that using a sampler2D and samplerExternalOES in the same shader works (anglebug.com/1534)
 TEST_P(GLSLTest, ExternalAnd2DSampler)
 {
@@ -6825,6 +7260,33 @@
     EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::green);
 }
 
+// Test switch/case where default is last.
+TEST_P(GLSLTest_ES3, SwitchWithDefaultAtTheEnd)
+{
+    constexpr char kFS[] = R"(#version 300 es
+
+precision highp float;
+out vec4 my_FragColor;
+
+uniform int u_zero;
+
+void main()
+{
+    switch (u_zero)
+    {
+        case 1:
+            my_FragColor = vec4(1, 0, 0, 1);
+            break;
+        default:
+            my_FragColor = vec4(0, 1, 0, 1);
+    }
+})";
+
+    ANGLE_GL_PROGRAM(program, essl3_shaders::vs::Simple(), kFS);
+    drawQuad(program.get(), essl3_shaders::PositionAttrib(), 0.5f);
+    EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::green);
+}
+
 // Test that a switch statement with an empty block inside as a final statement compiles.
 TEST_P(GLSLTest_ES3, SwitchFinalCaseHasEmptyBlock)
 {
@@ -7291,9 +7753,7 @@
     EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::green);
 }
 
-// Test vector/scalar arithmetic (in this case multiplication and addition). Meant to reproduce a
-// bug that appeared in NVIDIA OpenGL drivers and that is worked around by
-// VectorizeVectorScalarArithmetic AST transform.
+// Test vector/scalar arithmetic (in this case multiplication and addition).
 TEST_P(GLSLTest, VectorScalarMultiplyAndAddInLoop)
 {
     constexpr char kFS[] = R"(precision mediump float;
@@ -7317,9 +7777,7 @@
     EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::green);
 }
 
-// Test vector/scalar arithmetic (in this case compound division and addition). Meant to reproduce a
-// bug that appeared in NVIDIA OpenGL drivers and that is worked around by
-// VectorizeVectorScalarArithmetic AST transform.
+// Test vector/scalar arithmetic (in this case compound division and addition).
 TEST_P(GLSLTest, VectorScalarDivideAndAddInLoop)
 {
     constexpr char kFS[] = R"(precision mediump float;
@@ -7999,6 +8457,47 @@
     EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::green);
 }
 
+// Test that if-else blocks whose contents get pruned due to compile-time constant conditions work.
+TEST_P(GLSLTest, IfElsePrunedBlocks)
+{
+    constexpr char kFS[] = R"(precision mediump float;
+uniform float u;
+void main()
+{
+    // if with only a pruned true block
+    if (u > 0.0)
+        if (false) discard;
+
+    // if with a pruned true block and a false block
+    if (u > 0.0)
+    {
+        if (false) discard;
+    }
+    else
+        ;
+
+    // if with a true block and a pruned false block
+    if (u > 0.0)
+        ;
+    else
+        if (false) discard;
+
+    // if with a pruned true block and a pruned false block
+    if (u > 0.0)
+    {
+        if (false) discard;
+    }
+    else
+        if (false) discard;
+
+    gl_FragColor = vec4(0, 1, 0, 1);
+})";
+
+    ANGLE_GL_PROGRAM(program, essl1_shaders::vs::Simple(), kFS);
+    drawQuad(program.get(), essl1_shaders::PositionAttrib(), 0.5f);
+    EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::green);
+}
+
 // Tests that PointCoord behaves the same betweeen a user FBO and the back buffer.
 TEST_P(GLSLTest, PointCoordConsistency)
 {
@@ -9387,6 +9886,37 @@
     EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::green);
 }
 
+// Regression test based on fuzzer issue.  If a case has statements that are pruned, and those
+// pruned statements in turn have branches, and another case follows, a prior implementation of
+// dead-code elimination doubly pruned some statements.
+TEST_P(GLSLTest_ES3, DeadCodeBranchInPrunedStatementsInCaseBeforeAnotherCase)
+{
+    constexpr char kFS[] = R"(#version 300 es
+precision mediump float;
+out vec4 color;
+void main()
+{
+    color = vec4(0, 1, 0, 1);
+    switch(0)
+    {
+    case 0:
+        break;
+        break;
+        color = vec4(1, 0, 0, 1);   // The bug was pruning this statement twice
+    default:
+        color = vec4(0, 0, 1, 1);
+        break;
+    }
+})";
+
+    ANGLE_GL_PROGRAM(program, essl3_shaders::vs::Simple(), kFS);
+
+    drawQuad(program, essl3_shaders::PositionAttrib(), 0.5f);
+    EXPECT_GL_NO_ERROR();
+
+    EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::green);
+}
+
 // Test shader with all resources (default uniform, UBO, SSBO, image, sampler and atomic counter) to
 // make sure they are all linked ok.  The front-end sorts these resources and traverses the list of
 // "uniforms" to find the range for each resource.  A bug there was causing some resource ranges to
@@ -11376,6 +11906,85 @@
     EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::white);
 }
 
+// Test varying packing in presence of I/O block arrays
+TEST_P(GLSLTest_ES31, IOBlockArray)
+{
+    ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_EXT_shader_io_blocks"));
+
+    constexpr char kVS[] = R"(#version 310 es
+#extension GL_EXT_shader_io_blocks : require
+
+in highp vec4 position;
+
+out VSBlock1
+{
+    vec4 b[2];
+} blockOut1[2];
+
+out VSBlock2
+{
+    vec4 d;
+} blockOut2[3];
+
+void main()
+{
+    blockOut1[0].b[0] = vec4(0.15, 0.18, 0.21, 0.24);
+    blockOut1[0].b[1] = vec4(0.27, 0.30, 0.33, 0.36);
+    blockOut1[1].b[0] = vec4(0.39, 0.42, 0.45, 0.48);
+    blockOut1[1].b[1] = vec4(0.51, 0.54, 0.57, 0.6);
+    blockOut2[0].d = vec4(0.63, 0.66, 0.66, 0.69);
+    blockOut2[1].d = vec4(0.72, 0.75, 0.78, 0.81);
+    blockOut2[2].d = vec4(0.84, 0.87, 0.9, 0.93);
+    gl_Position = position;
+})";
+
+    constexpr char kFS[] = R"(#version 310 es
+#extension GL_EXT_shader_io_blocks : require
+precision mediump float;
+
+layout(location = 0) out mediump vec4 color;
+
+in VSBlock1
+{
+    vec4 b[2];
+} blockIn1[2];
+
+in VSBlock2
+{
+    vec4 d;
+} blockIn2[3];
+
+bool isEq(vec4 a, vec4 b) { return all(lessThan(abs(a-b), vec4(0.001))); }
+
+void main()
+{
+    bool passR = isEq(blockIn1[0].b[0], vec4(0.15, 0.18, 0.21, 0.24)) &&
+                 isEq(blockIn1[0].b[1], vec4(0.27, 0.30, 0.33, 0.36));
+    bool passG = isEq(blockIn1[1].b[0], vec4(0.39, 0.42, 0.45, 0.48)) &&
+                 isEq(blockIn1[1].b[1], vec4(0.51, 0.54, 0.57, 0.6));
+    bool passB = isEq(blockIn2[0].d, vec4(0.63, 0.66, 0.66, 0.69));
+    bool passA = isEq(blockIn2[1].d, vec4(0.72, 0.75, 0.78, 0.81)) &&
+                 isEq(blockIn2[2].d, vec4(0.84, 0.87, 0.9, 0.93));
+
+    color = vec4(passR, passG, passB, passA);
+})";
+
+    ANGLE_GL_PROGRAM(program, kVS, kFS);
+    EXPECT_GL_NO_ERROR();
+
+    GLTexture color;
+    glBindTexture(GL_TEXTURE_2D, color);
+    glTexStorage2D(GL_TEXTURE_2D, 1, GL_RGBA8, 1, 1);
+
+    GLFramebuffer fbo;
+    glBindFramebuffer(GL_FRAMEBUFFER, fbo);
+    glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, color, 0);
+
+    drawQuad(program, "position", 0);
+
+    EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::white);
+}
+
 // Validate that link fails with I/O block member name mismatches.
 TEST_P(GLSLTest_ES31, NegativeIOBlocksLinkMemberNameMismatch)
 {
@@ -11733,6 +12342,111 @@
     EXPECT_EQ(0u, program);
 }
 
+// Test that separating declarators works with structs that have been separately defined.
+TEST_P(GLSLTest_ES31, SeparateDeclaratorsOfStructType)
+{
+    constexpr char kVS[] = R"(#version 310 es
+precision highp float;
+
+struct S
+{
+    mat4 a;
+    mat4 b;
+};
+
+S s1 = S(mat4(1), mat4(2)), s2[2][3], s3[2] = S[2](S(mat4(0), mat4(3)), S(mat4(4), mat4(5)));
+
+void main() {
+    S s4[2][3] = s2, s5 = s3[0], s6[2] = S[2](s1, s5), s7 = s5;
+
+    gl_Position = vec4(s3[1].a[0].x, s2[0][2].b[1].y, s4[1][0].a[2].z, s6[0].b[3].w);
+})";
+
+    GLuint shader = glCreateShader(GL_VERTEX_SHADER);
+
+    const char *sourceArray[1] = {kVS};
+    GLint lengths[1]           = {static_cast<GLint>(sizeof(kVS) - 1)};
+    glShaderSource(shader, 1, sourceArray, lengths);
+    glCompileShader(shader);
+
+    GLint compileResult;
+    glGetShaderiv(shader, GL_COMPILE_STATUS, &compileResult);
+    EXPECT_NE(compileResult, 0);
+}
+
+// Test that separating declarators works with structs that are simultaneously defined.
+TEST_P(GLSLTest_ES31, SeparateDeclaratorsOfStructTypeBeingSpecified)
+{
+    constexpr char kVS[] = R"(#version 310 es
+precision highp float;
+
+struct S
+{
+    mat4 a;
+    mat4 b;
+} s1 = S(mat4(1), mat4(2)), s2[2][3], s3[2] = S[2](S(mat4(0), mat4(3)), S(mat4(4), mat4(5)));
+
+void main() {
+    struct T
+    {
+        mat4 a;
+        mat4 b;
+    } s4[2][3], s5 = T(s3[0].a, s3[0].b), s6[2] = T[2](T(s1.a, s1.b), s5), s7 = s5;
+
+    float f1 = s3[1].a[0].x, f2 = s2[0][2].b[1].y;
+
+    gl_Position = vec4(f1, f2, s4[1][0].a[2].z, s6[0].b[3].w);
+})";
+
+    GLuint shader = glCreateShader(GL_VERTEX_SHADER);
+
+    const char *sourceArray[1] = {kVS};
+    GLint lengths[1]           = {static_cast<GLint>(sizeof(kVS) - 1)};
+    glShaderSource(shader, 1, sourceArray, lengths);
+    glCompileShader(shader);
+
+    GLint compileResult;
+    glGetShaderiv(shader, GL_COMPILE_STATUS, &compileResult);
+    EXPECT_NE(compileResult, 0);
+}
+
+// Test that separating declarators works with structs that are simultaneously defined and that are
+// nameless.
+TEST_P(GLSLTest_ES31, SeparateDeclaratorsOfNamelessStructType)
+{
+    constexpr char kVS[] = R"(#version 310 es
+precision highp float;
+
+struct
+{
+    mat4 a;
+    mat4 b;
+} s1, s2[2][3], s3[2];
+
+void main() {
+    struct
+    {
+        mat4 a;
+        mat4 b;
+    } s4[2][3], s5, s6[2], s7 = s5;
+
+    float f1 = s1.a[0].x + s3[1].a[0].x, f2 = s2[0][2].b[1].y + s7.b[1].z;
+
+    gl_Position = vec4(f1, f2, s4[1][0].a[2].z, s6[0].b[3].w);
+})";
+
+    GLuint shader = glCreateShader(GL_VERTEX_SHADER);
+
+    const char *sourceArray[1] = {kVS};
+    GLint lengths[1]           = {static_cast<GLint>(sizeof(kVS) - 1)};
+    glShaderSource(shader, 1, sourceArray, lengths);
+    glCompileShader(shader);
+
+    GLint compileResult;
+    glGetShaderiv(shader, GL_COMPILE_STATUS, &compileResult);
+    EXPECT_NE(compileResult, 0);
+}
+
 // Regression test for transformation bug which separates struct declarations from uniform
 // declarations.  The bug was that the uniform variable usage in the initializer of a new
 // declaration (y below) was not being processed.
@@ -11813,6 +12527,34 @@
     glDeleteShader(shader);
 }
 
+// Test that scalar(nonScalar) constructors work.
+TEST_P(GLSLTest_ES3, ScalarConstructor)
+{
+    constexpr char kFS[] = R"(#version 300 es
+precision mediump float;
+uniform vec4 u;
+out vec4 color;
+void main()
+{
+    float f1 = float(u);
+    mat3 m = mat3(u, u, u);
+    int i = int(m);
+    color = vec4(f1, float(i), 0, 1);
+})";
+
+    ANGLE_GL_PROGRAM(program, essl3_shaders::vs::Simple(), kFS);
+    glUseProgram(program);
+
+    GLint uloc = glGetUniformLocation(program, "u");
+    ASSERT_NE(uloc, -1);
+    glUniform4f(uloc, 1.0, 0.4, 0.2, 0.7);
+
+    drawQuad(program, essl3_shaders::PositionAttrib(), 0.5f);
+    EXPECT_GL_NO_ERROR();
+
+    EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::yellow);
+}
+
 // Test that initializing global variables with non-constant values work
 TEST_P(GLSLTest_ES3, InitGlobalNonConstant)
 {
@@ -12722,6 +13464,322 @@
     runTest(kFS);
 }
 
+// Test that precision is retained for constants (which are constant folded).  Adapted from a WebGL
+// test.
+TEST_P(GLSLTest, ConstantFoldedConstantsRetainPrecision)
+{
+    constexpr char kFS[] = R"(
+// It is assumed that uTest is set to 0. It's here to make the expression not constant.
+uniform mediump float uTest;
+void main() {
+    // exact representation of 4096.5 requires 13 bits of relative precision.
+    const highp float c = 4096.5;
+    mediump float a = 0.0;
+    // Below, addition should be evaluated at highp, since one of the operands has the highp qualifier.
+    // Thus fract should also be evaluated at highp.
+    // See OpenGL ES Shading Language spec section 4.5.2.
+    // This should make the result 0.5, since highp provides at least 16 bits of relative precision.
+    // (exceptions for operation precision are allowed for a small number of computationally
+    // intensive built-in functions, but it is reasonable to think that fract is not one of those).
+    // However, if fract() is incorrectly evaluated at minimum precision fulfilling mediump criteria,
+    // or at IEEE half float precision, the result is 0.0.
+    a = fract(c + uTest);
+    // Multiply by 2.0 to make the color green.
+    gl_FragColor = vec4(0.0, 2.0 * a, 0.0, 1.0);
+})";
+
+    ANGLE_GL_PROGRAM(program, essl1_shaders::vs::Simple(), kFS);
+
+    drawQuad(program, essl1_shaders::PositionAttrib(), 0.5f);
+    EXPECT_GL_NO_ERROR();
+
+    EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::green);
+}
+
+TEST_P(GLSLTest, VectorAndMatrixScalarizationDoesNotAffectRendering)
+{
+    ANGLE_SKIP_TEST_IF(IsWindows() && IsNVIDIA() && (IsOpenGL() || IsOpenGLES()));
+
+    constexpr char kFS[] = R"(
+precision mediump float;
+
+varying vec2 v_texCoord;
+
+float a = 0.;
+#define A 0.
+
+#define r(a)    mat2( cos( a + vec4(0,-1.5708,1.5708,0) ) )
+vec2 c;
+#define f(U,a)  ( c = (U) * r(a) , sin(10.*c.x) )
+
+void main() {
+    vec2 U = v_texCoord;
+
+    gl_FragColor = U.y > .5
+        ? vec4( f(U,a) , f(U*4.,a) , 0,1.0)   // top
+        : vec4( f(U,A) , f(U*4.,A) , 0,1.0);  // bottom
+}
+
+)";
+
+    ANGLE_GL_PROGRAM(program, essl1_shaders::vs::Texture2D(), kFS);
+    drawQuad(program, essl1_shaders::PositionAttrib(), 0.5f);
+
+    // Make sure we rendered something.
+    EXPECT_PIXEL_NE(0, 0, 0, 0, 0, 0);
+
+    // Comapare one line in top half to one line in bottom half.
+    int compareWidth  = getWindowWidth();
+    int compareHeight = getWindowHeight() / 4;
+
+    ASSERT_GE(compareWidth, 2);
+    ASSERT_GE(compareHeight, 2);
+
+    GLubyte pixelValue[4];
+    constexpr int tolerance = 12;
+
+    for (int x = 0; x < compareWidth; ++x)
+    {
+        glReadPixels(x, compareHeight, 1, 1, GL_RGBA, GL_UNSIGNED_BYTE, pixelValue);
+        EXPECT_PIXEL_NEAR(x, getWindowHeight() - compareHeight, pixelValue[0], pixelValue[1],
+                          pixelValue[2], pixelValue[3], tolerance);
+    }
+    EXPECT_GL_NO_ERROR();
+}
+
+// Tests initializing a shader IO block using the shader translator option.
+TEST_P(GLSLTest_ES31_InitShaderVariables, InitIOBlock)
+{
+    ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_EXT_shader_io_blocks"));
+
+    const char kVS[] = R"(#version 310 es
+#extension GL_EXT_shader_io_blocks : require
+in vec4 position;
+out BlockType {
+    vec4 blockMember;
+} BlockTypeOut;
+
+void main()
+{
+    gl_Position = position;
+})";
+
+    const char kFS[] = R"(#version 310 es
+#extension GL_EXT_shader_io_blocks : require
+precision mediump float;
+out vec4 colorOut;
+in BlockType {
+    vec4 blockMember;
+} BlockTypeOut;
+
+void main()
+{
+    if (BlockTypeOut.blockMember == vec4(0)) {
+        colorOut = vec4(0, 1, 0, 1);
+    } else {
+        colorOut = vec4(1, 0, 0, 1);
+    }
+})";
+
+    ANGLE_GL_PROGRAM(testProgram, kVS, kFS);
+    drawQuad(testProgram, "position", 0.5f, 1.0f, true);
+    ASSERT_GL_NO_ERROR();
+    EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::green);
+}
+
+// Tests initializing a shader IO block with an array using the shader translator option.
+TEST_P(GLSLTest_ES31_InitShaderVariables, InitIOBlockWithArray)
+{
+    ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_EXT_shader_io_blocks"));
+
+    const char kVS[] = R"(#version 310 es
+#extension GL_EXT_shader_io_blocks : require
+in vec4 position;
+out BlockType {
+    vec4 blockMember[2];
+} BlockTypeOut;
+
+void main()
+{
+    gl_Position = position;
+})";
+
+    const char kFS[] = R"(#version 310 es
+#extension GL_EXT_shader_io_blocks : require
+precision mediump float;
+out vec4 colorOut;
+in BlockType {
+    vec4 blockMember[2];
+} BlockTypeOut;
+
+void main()
+{
+    if (BlockTypeOut.blockMember[0] == vec4(0) &&
+        BlockTypeOut.blockMember[1] == vec4(0)) {
+        colorOut = vec4(0, 1, 0, 1);
+    } else {
+        colorOut = vec4(1, 0, 0, 1);
+    }
+})";
+
+    ANGLE_GL_PROGRAM(testProgram, kVS, kFS);
+    drawQuad(testProgram, "position", 0.5f, 1.0f, true);
+    ASSERT_GL_NO_ERROR();
+    EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::green);
+}
+
+// Tests initializing a shader IO block with a struct using the shader translator option.
+TEST_P(GLSLTest_ES31_InitShaderVariables, InitIOBlockWithStruct)
+{
+    ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_EXT_shader_io_blocks"));
+
+    const char kVS[] = R"(#version 310 es
+#extension GL_EXT_shader_io_blocks : require
+in vec4 position;
+struct s {
+    float f;
+    vec2 v;
+};
+out BlockType {
+    s blockMember;
+} BlockTypeOut;
+
+void main()
+{
+    gl_Position = position;
+})";
+
+    const char kFS[] = R"(#version 310 es
+#extension GL_EXT_shader_io_blocks : require
+precision mediump float;
+out vec4 colorOut;
+struct s {
+    float f;
+    vec2 v;
+};
+in BlockType {
+    s blockMember;
+} BlockTypeOut;
+
+void main()
+{
+    if (BlockTypeOut.blockMember.f == 0.0 &&
+        BlockTypeOut.blockMember.v == vec2(0)) {
+        colorOut = vec4(0, 1, 0, 1);
+    } else {
+        colorOut = vec4(1, 0, 0, 1);
+    }
+})";
+
+    ANGLE_GL_PROGRAM(testProgram, kVS, kFS);
+    drawQuad(testProgram, "position", 0.5f, 1.0f, true);
+    ASSERT_GL_NO_ERROR();
+    EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::green);
+}
+
+// Tests initializing an IO block with a complicated set of types, using the shader translator.
+TEST_P(GLSLTest_ES31_InitShaderVariables, InitIOBlockWithComplexTypes)
+{
+    ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_EXT_shader_io_blocks"));
+
+    const char kVS[] = R"(#version 310 es
+#extension GL_EXT_shader_io_blocks : require
+in vec4 position;
+struct s {
+    float f;
+    vec2 v;
+};
+out BlockType {
+    vec4 v;
+    s s1;
+    s s2[2];
+} BlockTypeOut;
+
+void main()
+{
+    gl_Position = position;
+})";
+
+    const char kFS[] = R"(#version 310 es
+#extension GL_EXT_shader_io_blocks : require
+precision mediump float;
+out vec4 colorOut;
+struct s {
+    float f;
+    vec2 v;
+};
+in BlockType {
+    vec4 v;
+    s s1;
+    s s2[2];
+} BlockTypeOut;
+
+void main()
+{
+    s sz = s(0.0, vec2(0));
+    if (BlockTypeOut.v == vec4(0) &&
+        BlockTypeOut.s1 == sz &&
+        BlockTypeOut.s2[0] == sz &&
+        BlockTypeOut.s2[1] == sz) {
+        colorOut = vec4(0, 1, 0, 1);
+    } else {
+        colorOut = vec4(1, 0, 0, 1);
+    }
+})";
+
+    ANGLE_GL_PROGRAM(testProgram, kVS, kFS);
+    drawQuad(testProgram, "position", 0.5f, 1.0f, true);
+    ASSERT_GL_NO_ERROR();
+    EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::green);
+}
+
+// Tests an unsuccessful re-link using glBindAttribLocation.
+TEST_P(GLSLTest_ES3, UnsuccessfulRelinkWithBindAttribLocation)
+{
+    // Make a simple program.
+    ANGLE_GL_PROGRAM(testProgram, essl1_shaders::vs::Simple(), essl1_shaders::fs::Green());
+
+    // Install the executable.
+    glUseProgram(testProgram);
+
+    // Re-link with a bad XFB varying and a bound attrib location.
+    const char *tfVaryings = "gl_FragColor";
+    glTransformFeedbackVaryings(testProgram, 1, &tfVaryings, GL_SEPARATE_ATTRIBS);
+    glBindAttribLocation(testProgram, 8, essl1_shaders::PositionAttrib());
+    glLinkProgram(testProgram);
+    GLint linkStatus = 999;
+    glGetProgramiv(testProgram, GL_LINK_STATUS, &linkStatus);
+    ASSERT_GL_NO_ERROR();
+    ASSERT_EQ(linkStatus, GL_FALSE);
+
+    // Under normal GL this is not an error.
+    glDrawArrays(GL_TRIANGLES, 79, 16);
+    EXPECT_GL_NO_ERROR();
+}
+
+// Tests an unsuccessful re-link using glBindAttribLocation under WebGL.
+TEST_P(WebGL2GLSLTest, UnsuccessfulRelinkWithBindAttribLocation)
+{
+    // Make a simple program.
+    ANGLE_GL_PROGRAM(testProgram, essl1_shaders::vs::Simple(), essl1_shaders::fs::Green());
+
+    // Install the executable.
+    glUseProgram(testProgram);
+
+    // Re-link with a bad XFB varying and a bound attrib location.
+    const char *tfVaryings = "gl_FragColor";
+    glTransformFeedbackVaryings(testProgram, 1, &tfVaryings, GL_SEPARATE_ATTRIBS);
+    glBindAttribLocation(testProgram, 8, essl1_shaders::PositionAttrib());
+    glLinkProgram(testProgram);
+    GLint linkStatus = 999;
+    glGetProgramiv(testProgram, GL_LINK_STATUS, &linkStatus);
+    ASSERT_GL_NO_ERROR();
+    ASSERT_EQ(linkStatus, GL_FALSE);
+
+    // Under WebGL this is an error.
+    glDrawArrays(GL_TRIANGLES, 79, 16);
+    EXPECT_GL_ERROR(GL_INVALID_OPERATION);
+}
 }  // anonymous namespace
 
 ANGLE_INSTANTIATE_TEST_ES2_AND_ES3_AND(GLSLTest, WithDirectSPIRVGeneration(ES2_VULKAN()));
@@ -12734,10 +13792,15 @@
 GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(GLSLTestLoops);
 ANGLE_INSTANTIATE_TEST_ES3_AND(GLSLTestLoops, WithDirectSPIRVGeneration(ES3_VULKAN()));
 
-ANGLE_INSTANTIATE_TEST_ES2_AND(WebGLGLSLTest, WithDirectSPIRVGeneration(ES2_VULKAN()));
+ANGLE_INSTANTIATE_TEST_ES2_AND(WebGLGLSLTest,
+                               WithDirectSPIRVGeneration(ES2_VULKAN()),
+                               WithDirectMetalGeneration(ES2_METAL()));
 
 GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(WebGL2GLSLTest);
 ANGLE_INSTANTIATE_TEST_ES3_AND(WebGL2GLSLTest, WithDirectSPIRVGeneration(ES3_VULKAN()));
 
 GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(GLSLTest_ES31);
 ANGLE_INSTANTIATE_TEST_ES31_AND(GLSLTest_ES31, WithDirectSPIRVGeneration(ES31_VULKAN()));
+
+GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(GLSLTest_ES31_InitShaderVariables);
+ANGLE_INSTANTIATE_TEST(GLSLTest_ES31_InitShaderVariables, WithInitShaderVariables(ES31_VULKAN()));
diff --git a/src/tests/gl_tests/GeometryShaderTest.cpp b/src/tests/gl_tests/GeometryShaderTest.cpp
index 7ba5b9c..373aa2e 100644
--- a/src/tests/gl_tests/GeometryShaderTest.cpp
+++ b/src/tests/gl_tests/GeometryShaderTest.cpp
@@ -94,6 +94,9 @@
 class GeometryShaderTestES3 : public ANGLETest
 {};
 
+class GeometryShaderTestES32 : public ANGLETest
+{};
+
 // Verify that Geometry Shader cannot be created in an OpenGL ES 3.0 context.
 TEST_P(GeometryShaderTestES3, CreateGeometryShaderInES3)
 {
@@ -1407,6 +1410,89 @@
     EXPECT_PIXEL_RECT_EQ(w / 2, 0, w / 2, h / 2, GLColor::red);
 }
 
+// Verify that we can have the max amount of uniforms with a geometry shader.
+TEST_P(GeometryShaderTestES32, MaxGeometryImageUniforms)
+{
+    ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_EXT_geometry_shader"));
+
+    GLint maxGeometryImageUnits;
+    glGetIntegerv(GL_MAX_GEOMETRY_IMAGE_UNIFORMS_EXT, &maxGeometryImageUnits);
+
+    const GLchar *vertString = essl31_shaders::vs::Simple();
+    const GLchar *fragString = R"(#version 310 es
+precision highp float;
+out vec4 my_FragColor;
+void main()
+{
+    my_FragColor = vec4(1.0);
+})";
+
+    std::stringstream geomStringStream;
+
+    geomStringStream << R"(#version 310 es
+#extension GL_OES_geometry_shader : require
+layout (points)                   in;
+layout (points, max_vertices = 1) out;
+
+precision highp iimage2D;
+
+ivec4 counter = ivec4(0);
+)";
+
+    for (GLint index = 0; index < maxGeometryImageUnits; ++index)
+    {
+        geomStringStream << "layout(binding = " << index << ", r32i) uniform iimage2D img" << index
+                         << ";" << std::endl;
+    }
+
+    geomStringStream << R"(
+void main()
+{
+)";
+
+    for (GLint index = 0; index < maxGeometryImageUnits; ++index)
+    {
+        geomStringStream << "counter += imageLoad(img" << index << ", ivec2(0, 0));" << std::endl;
+    }
+
+    geomStringStream << R"(
+    gl_Position = vec4(float(counter.x), 0.0, 0.0, 1.0);
+    EmitVertex();
+}
+)";
+
+    ANGLE_GL_PROGRAM_WITH_GS(program, vertString, geomStringStream.str().c_str(), fragString);
+    EXPECT_GL_NO_ERROR();
+
+    glClearColor(1.0, 0, 0, 1.0);
+    glClear(GL_COLOR_BUFFER_BIT);
+
+    glUseProgram(program);
+
+    std::vector<GLTexture> textures(maxGeometryImageUnits);
+    for (GLint index = 0; index < maxGeometryImageUnits; ++index)
+    {
+        GLint value = index + 1;
+
+        glBindTexture(GL_TEXTURE_2D, textures[index]);
+
+        glTexStorage2D(GL_TEXTURE_2D, 1 /*levels*/, GL_R32I, 1 /*width*/, 1 /*height*/);
+
+        glTexSubImage2D(GL_TEXTURE_2D, 0 /*level*/, 0 /*xoffset*/, 0 /*yoffset*/, 1 /*width*/,
+                        1 /*height*/, GL_RED_INTEGER, GL_INT, &value);
+
+        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
+
+        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
+
+        glBindImageTexture(index, textures[index], 0 /*level*/, GL_FALSE /*is layered?*/,
+                           0 /*layer*/, GL_READ_ONLY, GL_R32I);
+    }
+
+    glDrawArrays(GL_POINTS, 0, 3);
+    EXPECT_GL_NO_ERROR();
+}
+
 // Verify that depth viewport transform applies to the geometry shader stage if present.
 TEST_P(GeometryShaderTest, DepthViewportTransform)
 {
@@ -1494,9 +1580,6 @@
     // Errors in D3D11/GL. No plans to fix this.
     ANGLE_SKIP_TEST_IF(!IsVulkan());
 
-    // http://anglebug.com/5506
-    ANGLE_SKIP_TEST_IF(IsVulkan());
-
     const char *kVS = R"(#version 310 es
 precision mediump float;
 in vec4 position;
@@ -1771,5 +1854,9 @@
 ANGLE_INSTANTIATE_TEST_ES31_AND(GeometryShaderTest,
                                 WithEmulatedPrerotation(ES31_VULKAN(), 90),
                                 WithEmulatedPrerotation(ES31_VULKAN(), 180),
-                                WithEmulatedPrerotation(ES31_VULKAN(), 270));
+                                WithEmulatedPrerotation(ES31_VULKAN(), 270),
+                                WithDirectSPIRVGeneration(ES31_VULKAN()));
+
+GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(GeometryShaderTestES32);
+ANGLE_INSTANTIATE_TEST_ES32(GeometryShaderTestES32);
 }  // namespace
diff --git a/src/tests/gl_tests/GetImageTest.cpp b/src/tests/gl_tests/GetImageTest.cpp
index 5a7a577..d6d3819 100644
--- a/src/tests/gl_tests/GetImageTest.cpp
+++ b/src/tests/gl_tests/GetImageTest.cpp
@@ -41,6 +41,12 @@
     GetImageTestNoExtensions() { setExtensionsEnabled(false); }
 };
 
+class GetImageTestES31 : public GetImageTest
+{
+  public:
+    GetImageTestES31() {}
+};
+
 GLTexture InitTextureWithFormatAndSize(GLenum format, uint32_t size, void *pixelData)
 {
     GLTexture tex;
@@ -410,9 +416,192 @@
     }
 }
 
+// Tests GetImage behaviour with an RGB image.
+TEST_P(GetImageTest, GetImageRGB)
+{
+    // Verify the extension is enabled.
+    ASSERT_TRUE(IsGLExtensionEnabled(kExtensionName));
+
+    constexpr uint32_t kSmallSize        = 2;
+    std::vector<GLColorRGB> expectedData = {GLColorRGB::red, GLColorRGB::blue, GLColorRGB::green,
+                                            GLColorRGB::yellow};
+
+    glViewport(0, 0, kSmallSize, kSmallSize);
+
+    // Pack pixels tightly.
+    glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
+    glPixelStorei(GL_PACK_ALIGNMENT, 1);
+
+    // Init simple texture.
+    GLTexture tex;
+    glBindTexture(GL_TEXTURE_2D, tex);
+    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, kSmallSize, kSmallSize, 0, GL_RGB, GL_UNSIGNED_BYTE,
+                 expectedData.data());
+    glTexImage2D(GL_TEXTURE_2D, 1, GL_RGB, kSmallSize / 2, kSmallSize / 2, 0, GL_RGB,
+                 GL_UNSIGNED_BYTE, expectedData.data());
+    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
+    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
+
+    // Verify GetImage.
+    std::vector<GLColorRGB> actualData(kSmallSize * kSmallSize);
+    glGetTexImageANGLE(GL_TEXTURE_2D, 0, GL_RGB, GL_UNSIGNED_BYTE, actualData.data());
+    EXPECT_GL_NO_ERROR();
+    EXPECT_EQ(expectedData, actualData);
+
+    // Draw after the GetImage.
+    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);
+    EXPECT_PIXEL_COLOR_EQ(0, 1, GLColor::green);
+    EXPECT_PIXEL_COLOR_EQ(1, 0, GLColor::blue);
+    EXPECT_PIXEL_COLOR_EQ(1, 1, GLColor::yellow);
+}
+
+// Tests GetImage with 2D array textures.
+TEST_P(GetImageTestES31, Texture2DArray)
+{
+    // Verify the extension is enabled.
+    ASSERT_TRUE(IsGLExtensionEnabled(kExtensionName));
+
+    constexpr GLsizei kSize   = 2;
+    constexpr GLsizei kLayers = 4;
+
+    std::vector<GLColor> expectedPixels = {
+        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,
+    };
+
+    GLTexture tex;
+    glBindTexture(GL_TEXTURE_2D_ARRAY, tex);
+    glTexImage3D(GL_TEXTURE_2D_ARRAY, 0, GL_RGBA, kSize, kSize, kLayers, 0, GL_RGBA,
+                 GL_UNSIGNED_BYTE, expectedPixels.data());
+    ASSERT_GL_NO_ERROR();
+
+    std::vector<GLColor> actualPixels(expectedPixels.size(), GLColor::white);
+    glGetTexImageANGLE(GL_TEXTURE_2D_ARRAY, 0, GL_RGBA, GL_UNSIGNED_BYTE, actualPixels.data());
+    ASSERT_GL_NO_ERROR();
+    EXPECT_EQ(expectedPixels, actualPixels);
+}
+
+// Tests GetImage with 3D textures.
+TEST_P(GetImageTestES31, Texture3D)
+{
+    // Verify the extension is enabled.
+    ASSERT_TRUE(IsGLExtensionEnabled(kExtensionName));
+
+    constexpr GLsizei kSize = 2;
+
+    std::vector<GLColor> expectedPixels = {
+        GLColor::red,  GLColor::red,  GLColor::green,  GLColor::green,
+        GLColor::blue, GLColor::blue, GLColor::yellow, GLColor::yellow,
+    };
+
+    GLTexture tex;
+    glBindTexture(GL_TEXTURE_3D, tex);
+    glTexImage3D(GL_TEXTURE_3D, 0, GL_RGBA, kSize, kSize, kSize, 0, GL_RGBA, GL_UNSIGNED_BYTE,
+                 expectedPixels.data());
+    ASSERT_GL_NO_ERROR();
+
+    std::vector<GLColor> actualPixels(expectedPixels.size(), GLColor::white);
+    glGetTexImageANGLE(GL_TEXTURE_3D, 0, GL_RGBA, GL_UNSIGNED_BYTE, actualPixels.data());
+    ASSERT_GL_NO_ERROR();
+    EXPECT_EQ(expectedPixels, actualPixels);
+}
+
+// Tests GetImage with cube map array textures.
+TEST_P(GetImageTestES31, TextureCubeMapArray)
+{
+    ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_EXT_texture_cube_map_array") &&
+                       !IsGLExtensionEnabled("GL_OES_texture_cube_map_array"));
+
+    // Verify the extension is enabled.
+    ASSERT_TRUE(IsGLExtensionEnabled(kExtensionName));
+
+    constexpr GLsizei kSize   = 1;
+    constexpr GLsizei kLayers = 2;
+
+    std::vector<GLColor> expectedPixels = {
+        GLColor::red,  GLColor::green,   GLColor::blue, GLColor::yellow,
+        GLColor::cyan, GLColor::magenta, GLColor::red,  GLColor::green,
+        GLColor::blue, GLColor::yellow,  GLColor::cyan, GLColor::magenta,
+    };
+
+    ASSERT_EQ(expectedPixels.size(), static_cast<size_t>(6 * kSize * kSize * kLayers));
+
+    GLTexture tex;
+    glBindTexture(GL_TEXTURE_CUBE_MAP_ARRAY, tex);
+    glTexImage3D(GL_TEXTURE_CUBE_MAP_ARRAY, 0, GL_RGBA, kSize, kSize, kLayers * 6, 0, GL_RGBA,
+                 GL_UNSIGNED_BYTE, expectedPixels.data());
+    ASSERT_GL_NO_ERROR();
+
+    std::vector<GLColor> actualPixels(expectedPixels.size(), GLColor::white);
+    glGetTexImageANGLE(GL_TEXTURE_CUBE_MAP_ARRAY, 0, GL_RGBA, GL_UNSIGNED_BYTE,
+                       actualPixels.data());
+    ASSERT_GL_NO_ERROR();
+    EXPECT_EQ(expectedPixels, actualPixels);
+}
+
+// Tests GetImage with an inconsistent 2D texture.
+TEST_P(GetImageTest, InconsistentTexture2D)
+{
+    // 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;
+    glBindTexture(GL_TEXTURE_2D, tex);
+    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, kSmallSize, kSmallSize, 0, GL_RGBA, GL_UNSIGNED_BYTE,
+                 expectedData.data());
+    // The texture becomes inconsistent because a second 2x2 image does not fit in the mip chain.
+    glTexImage2D(GL_TEXTURE_2D, 1, GL_RGBA, kSmallSize, kSmallSize, 0, GL_RGBA, GL_UNSIGNED_BYTE,
+                 expectedData.data());
+
+    // Pack pixels tightly.
+    glPixelStorei(GL_PACK_ALIGNMENT, 1);
+
+    // Verify GetImage.
+    std::vector<GLColor> actualData(kSmallSize * kSmallSize, GLColor::white);
+    glGetTexImageANGLE(GL_TEXTURE_2D, 0, GL_RGBA, GL_UNSIGNED_BYTE, actualData.data());
+    EXPECT_GL_NO_ERROR();
+    EXPECT_EQ(expectedData, actualData);
+
+    std::fill(actualData.begin(), actualData.end(), GLColor::white);
+    glGetTexImageANGLE(GL_TEXTURE_2D, 1, GL_RGBA, GL_UNSIGNED_BYTE, actualData.data());
+    EXPECT_GL_NO_ERROR();
+    EXPECT_EQ(expectedData, actualData);
+}
+
+// Test GetImage with non-defined textures.
+TEST_P(GetImageTest, EmptyTexture)
+{
+    // Verify the extension is enabled.
+    ASSERT_TRUE(IsGLExtensionEnabled(kExtensionName));
+
+    GLTexture tex;
+    glBindTexture(GL_TEXTURE_2D, tex);
+
+    std::vector<GLColor> expectedData(4, GLColor::white);
+    std::vector<GLColor> actualData(4, GLColor::white);
+    glGetTexImageANGLE(GL_TEXTURE_2D, 0, GL_RGBA, GL_UNSIGNED_BYTE, actualData.data());
+    EXPECT_GL_NO_ERROR();
+    EXPECT_EQ(expectedData, actualData);
+}
+
 GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(GetImageTest);
 ANGLE_INSTANTIATE_TEST(GetImageTest, ES2_VULKAN(), ES3_VULKAN());
 
+GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(GetImageTestES31);
+ANGLE_INSTANTIATE_TEST(GetImageTestES31, ES31_VULKAN());
+
 GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(GetImageTestNoExtensions);
 ANGLE_INSTANTIATE_TEST(GetImageTestNoExtensions, ES2_VULKAN(), ES3_VULKAN());
 
diff --git a/src/tests/gl_tests/MultithreadingTest.cpp b/src/tests/gl_tests/MultithreadingTest.cpp
index a475233..9c034d4 100644
--- a/src/tests/gl_tests/MultithreadingTest.cpp
+++ b/src/tests/gl_tests/MultithreadingTest.cpp
@@ -193,9 +193,6 @@
 {
     ANGLE_SKIP_TEST_IF(!platformSupportsMultithreading());
 
-    // http://anglebug.com/5945: ES3_Vulkan_NoVirtual flaky on linux-clang-rel NVIDIA
-    ANGLE_SKIP_TEST_IF(IsVulkan() && IsLinux() && IsNVIDIA());
-
     auto testBody = [](EGLSurface surface, size_t thread) {
         constexpr size_t kIterationsPerThread = 32;
         for (size_t iteration = 0; iteration < kIterationsPerThread; iteration++)
@@ -346,8 +343,6 @@
 
     // http://anglebug.com/5099
     ANGLE_SKIP_TEST_IF(IsAndroid() && IsOpenGLES());
-    // http://anglebug.com/5099
-    ANGLE_SKIP_TEST_IF(IsWindows() && isSwiftshader());
 
     EGLWindow *window = getEGLWindow();
     EGLDisplay dpy    = window->getDisplay();
diff --git a/src/tests/gl_tests/PackUnpackTest.cpp b/src/tests/gl_tests/PackUnpackTest.cpp
index 290930f..546fde0 100644
--- a/src/tests/gl_tests/PackUnpackTest.cpp
+++ b/src/tests/gl_tests/PackUnpackTest.cpp
@@ -37,7 +37,7 @@
 
 void main()
 {
-    uint u = packSnorm2x16(v);
+    highp uint u = packSnorm2x16(v);
     vec2 r = unpackSnorm2x16(u);
     fragColor = vec4(r, 0.0, 1.0);
 })";
@@ -50,7 +50,7 @@
 
 void main()
 {
-    uint u = packUnorm2x16(v);
+    highp uint u = packUnorm2x16(v);
     vec2 r = unpackUnorm2x16(u);
     fragColor = vec4(r, 0.0, 1.0);
 })";
@@ -63,7 +63,7 @@
 
 void main()
 {
-    uint u = packHalf2x16(v);
+    highp uint u = packHalf2x16(v);
     vec2 r = unpackHalf2x16(u);
     fragColor = vec4(r, 0.0, 1.0);
 })";
diff --git a/src/tests/gl_tests/ProgramBinaryTest.cpp b/src/tests/gl_tests/ProgramBinaryTest.cpp
index 4e8c71f..b659843 100644
--- a/src/tests/gl_tests/ProgramBinaryTest.cpp
+++ b/src/tests/gl_tests/ProgramBinaryTest.cpp
@@ -888,6 +888,51 @@
     ASSERT_GL_NO_ERROR();
 }
 
+// Tests saving and loading a separable program that has a computer shader using a uniform and a
+// uniform block.
+TEST_P(ProgramBinaryES31Test, SeparableProgramLinkedUniforms)
+{
+    // We can't run the test if no program binary formats are supported.
+    GLint binaryFormatCount = 0;
+    glGetIntegerv(GL_NUM_PROGRAM_BINARY_FORMATS, &binaryFormatCount);
+    ANGLE_SKIP_TEST_IF(binaryFormatCount == 0);
+
+    constexpr char kComputeShader[] = R"(#version 310 es
+layout(local_size_x=4, local_size_y=3, local_size_z=1) in;
+uniform float testUint;
+uniform TestBlock
+{
+    mat4 testMatrix;
+};
+layout(rgba32ui) uniform highp writeonly uimage2D imageOut;
+void main() {
+    imageStore(imageOut, ivec2(gl_LocalInvocationIndex, 0), uvec4(testMatrix[0][0] + testUint, 0, 0, 0));
+})";
+
+    ANGLE_GL_COMPUTE_PROGRAM(program, kComputeShader);
+    glProgramParameteri(program, GL_PROGRAM_SEPARABLE, GL_TRUE);
+
+    // Read back the binary.
+    GLint programLength = 0;
+    glGetProgramiv(program, GL_PROGRAM_BINARY_LENGTH, &programLength);
+    ASSERT_GL_NO_ERROR();
+
+    GLsizei readLength  = 0;
+    GLenum binaryFormat = GL_NONE;
+    std::vector<uint8_t> binary(programLength);
+    glGetProgramBinary(program, programLength, &readLength, &binaryFormat, binary.data());
+    ASSERT_GL_NO_ERROR();
+
+    EXPECT_EQ(static_cast<GLsizei>(programLength), readLength);
+
+    // Load a new program with the binary.
+    ANGLE_GL_BINARY_ES3_PROGRAM(binaryProgram, binary, binaryFormat);
+    ASSERT_GL_NO_ERROR();
+
+    glUseProgram(binaryProgram);
+    ASSERT_GL_NO_ERROR();
+}
+
 // Tests that saving and loading a program attached with computer shader.
 TEST_P(ProgramBinaryES31Test, ProgramBinaryWithAtomicCounterComputeShader)
 {
diff --git a/src/tests/gl_tests/ProgramPipelineTest.cpp b/src/tests/gl_tests/ProgramPipelineTest.cpp
index 9d71499..b414604 100644
--- a/src/tests/gl_tests/ProgramPipelineTest.cpp
+++ b/src/tests/gl_tests/ProgramPipelineTest.cpp
@@ -327,6 +327,50 @@
     EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::red);
 }
 
+// Test pipeline without vertex shader
+TEST_P(ProgramPipelineTest31, PipelineWithoutVertexShader)
+{
+    ANGLE_SKIP_TEST_IF(!IsVulkan());
+
+    // Create a separable program object with a fragment shader
+    const GLchar *fragString = essl31_shaders::fs::Red();
+    mFragProg                = glCreateShaderProgramv(GL_FRAGMENT_SHADER, 1, &fragString);
+    ASSERT_NE(mFragProg, 0u);
+
+    // Generate a program pipeline and attach the program to it's respective stage
+    glGenProgramPipelines(1, &mPipeline);
+    EXPECT_GL_NO_ERROR();
+    glUseProgramStages(mPipeline, GL_FRAGMENT_SHADER_BIT, mFragProg);
+    EXPECT_GL_NO_ERROR();
+    glBindProgramPipeline(mPipeline);
+    EXPECT_GL_NO_ERROR();
+
+    glDrawArrays(GL_POINTS, 0, 3);
+    ASSERT_GL_NO_ERROR();
+}
+
+// Test pipeline without any shaders
+TEST_P(ProgramPipelineTest31, PipelineWithoutShaders)
+{
+    ANGLE_SKIP_TEST_IF(!IsVulkan());
+
+    // Generate a program pipeline
+    glGenProgramPipelines(1, &mPipeline);
+    EXPECT_GL_NO_ERROR();
+
+    glBindProgramPipeline(mPipeline);
+    EXPECT_GL_NO_ERROR();
+
+    glDrawArrays(GL_POINTS, 0, 3);
+    EXPECT_GL_ERROR(GL_INVALID_OPERATION);
+
+    // Ensure validation fails
+    GLint value;
+    glValidateProgramPipeline(mPipeline);
+    glGetProgramPipelineiv(mPipeline, GL_VALIDATE_STATUS, &value);
+    EXPECT_FALSE(value);
+}
+
 // Test glUniform
 TEST_P(ProgramPipelineTest31, FragmentStageUniformTest)
 {
@@ -645,9 +689,6 @@
     // Only the Vulkan backend supports PPOs
     ANGLE_SKIP_TEST_IF(!IsVulkan());
 
-    // http://anglebug.com/5506
-    ANGLE_SKIP_TEST_IF(IsVulkan());
-
     // Create a fragment shader using the varying location "5".
     const char *kFS = R"(#version 310 es
 precision mediump float;
@@ -1049,6 +1090,256 @@
     EXPECT_PIXEL_RECT_EQ(0, 0, kWidth, kHeight, GLColor::yellow);
 }
 
+// Verify that image uniforms can be used with separable programs
+TEST_P(ProgramPipelineTest31, ImageUniforms)
+{
+    ANGLE_SKIP_TEST_IF(!IsVulkan());
+
+    const GLchar *vertString = R"(#version 310 es
+precision highp float;
+precision highp image2D;
+layout(binding = 0, r32f) uniform image2D img;
+
+void main()
+{
+    gl_Position = imageLoad(img, ivec2(0, 0));
+})";
+
+    const GLchar *fragString = essl31_shaders::fs::Red();
+
+    bindProgramPipeline(vertString, fragString);
+
+    GLTexture texture;
+    GLfloat value = 1.0;
+
+    glBindTexture(GL_TEXTURE_2D, texture);
+
+    glTexStorage2D(GL_TEXTURE_2D, 1 /*levels*/, GL_R32F, 1 /*width*/, 1 /*height*/);
+
+    glTexSubImage2D(GL_TEXTURE_2D, 0 /*level*/, 0 /*xoffset*/, 0 /*yoffset*/, 1 /*width*/,
+                    1 /*height*/, GL_RED, GL_FLOAT, &value);
+
+    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
+
+    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
+
+    glBindImageTexture(0, texture, 0 /*level*/, GL_FALSE /*is layered?*/, 0 /*layer*/, GL_READ_ONLY,
+                       GL_R32F);
+
+    glDrawArrays(GL_POINTS, 0, 6);
+    ASSERT_GL_NO_ERROR();
+}
+
+// Verify that we can have the max amount of uniform buffer objects as part of a program
+// pipeline.
+TEST_P(ProgramPipelineTest31, MaxFragmentUniformBufferObjects)
+{
+    ANGLE_SKIP_TEST_IF(!IsVulkan());
+
+    GLint maxUniformBlocks;
+    glGetIntegerv(GL_MAX_FRAGMENT_UNIFORM_BLOCKS, &maxUniformBlocks);
+
+    const GLchar *vertString = essl31_shaders::vs::Simple();
+    std::stringstream fragStringStream;
+    fragStringStream << R"(#version 310 es
+precision highp float;
+out vec4 my_FragColor;
+layout(binding = 0) uniform block {
+    float data;
+} ubo[)";
+    fragStringStream << maxUniformBlocks;
+    fragStringStream << R"(];
+void main()
+{
+    my_FragColor = vec4(1.0);
+)";
+    for (GLint index = 0; index < maxUniformBlocks; index++)
+    {
+        fragStringStream << "my_FragColor.x + ubo[" << index << "].data;" << std::endl;
+    }
+    fragStringStream << "}" << std::endl;
+
+    bindProgramPipeline(vertString, fragStringStream.str().c_str());
+
+    std::vector<GLBuffer> buffers(maxUniformBlocks);
+    for (GLint index = 0; index < maxUniformBlocks; ++index)
+    {
+        glBindBuffer(GL_UNIFORM_BUFFER, buffers[index]);
+        glBufferData(GL_UNIFORM_BUFFER, sizeof(GLfloat), NULL, GL_STATIC_DRAW);
+        glBindBufferBase(GL_UNIFORM_BUFFER, index, buffers[index]);
+    }
+
+    glDrawArrays(GL_POINTS, 0, 6);
+    ASSERT_GL_NO_ERROR();
+}
+
+// Verify that we can have the max amount of shader storage buffer objects as part of a program
+// pipeline.
+TEST_P(ProgramPipelineTest31, MaxFragmentShaderStorageBufferObjects)
+{
+    ANGLE_SKIP_TEST_IF(!IsVulkan());
+
+    GLint maxShaderStorageBuffers;
+    glGetIntegerv(GL_MAX_FRAGMENT_SHADER_STORAGE_BLOCKS, &maxShaderStorageBuffers);
+    const GLchar *vertString = essl31_shaders::vs::Simple();
+    std::stringstream fragStringStream;
+    fragStringStream << R"(#version 310 es
+precision highp float;
+out vec4 my_FragColor;
+layout(binding = 0) buffer buf {
+    float data;
+} ssbo[)";
+    fragStringStream << maxShaderStorageBuffers;
+    fragStringStream << R"(];
+void main()
+{
+    my_FragColor = vec4(1.0);
+)";
+    for (GLint index = 0; index < maxShaderStorageBuffers; index++)
+    {
+        fragStringStream << "my_FragColor.x + ssbo[" << index << "].data;" << std::endl;
+    }
+    fragStringStream << "}" << std::endl;
+
+    bindProgramPipeline(vertString, fragStringStream.str().c_str());
+
+    std::vector<GLBuffer> buffers(maxShaderStorageBuffers);
+    for (GLint index = 0; index < maxShaderStorageBuffers; ++index)
+    {
+        glBindBuffer(GL_SHADER_STORAGE_BUFFER, buffers[index]);
+        glBufferData(GL_SHADER_STORAGE_BUFFER, sizeof(GLfloat), NULL, GL_STATIC_DRAW);
+        glBindBufferBase(GL_SHADER_STORAGE_BUFFER, index, buffers[index]);
+    }
+
+    glDrawArrays(GL_POINTS, 0, 6);
+    ASSERT_GL_NO_ERROR();
+}
+
+class ProgramPipelineTest32 : public ProgramPipelineTest
+{
+  protected:
+    void testTearDown() override
+    {
+        glDeleteProgram(mVertProg);
+        glDeleteProgram(mFragProg);
+        glDeleteProgramPipelines(1, &mPipeline);
+    }
+
+    void bindProgramPipeline(const GLchar *vertString,
+                             const GLchar *fragString,
+                             const GLchar *geomString);
+    void drawQuadWithPPO(const std::string &positionAttribName,
+                         const GLfloat positionAttribZ,
+                         const GLfloat positionAttribXYScale);
+
+    GLuint mVertProg = 0;
+    GLuint mFragProg = 0;
+    GLuint mGeomProg = 0;
+    GLuint mPipeline = 0;
+};
+
+void ProgramPipelineTest32::bindProgramPipeline(const GLchar *vertString,
+                                                const GLchar *fragString,
+                                                const GLchar *geomString)
+{
+    mVertProg = createShaderProgram(GL_VERTEX_SHADER, vertString);
+    ASSERT_NE(mVertProg, 0u);
+    mFragProg = createShaderProgram(GL_FRAGMENT_SHADER, fragString);
+    ASSERT_NE(mFragProg, 0u);
+    mGeomProg = createShaderProgram(GL_GEOMETRY_SHADER, geomString);
+    ASSERT_NE(mGeomProg, 0u);
+
+    // Generate a program pipeline and attach the programs to their respective stages
+    glGenProgramPipelines(1, &mPipeline);
+    EXPECT_GL_NO_ERROR();
+    glUseProgramStages(mPipeline, GL_VERTEX_SHADER_BIT, mVertProg);
+    EXPECT_GL_NO_ERROR();
+    glUseProgramStages(mPipeline, GL_FRAGMENT_SHADER_BIT, mFragProg);
+    EXPECT_GL_NO_ERROR();
+    glUseProgramStages(mPipeline, GL_GEOMETRY_SHADER_BIT, mGeomProg);
+    EXPECT_GL_NO_ERROR();
+    glBindProgramPipeline(mPipeline);
+    EXPECT_GL_NO_ERROR();
+}
+
+// Verify that we can have the max amount of uniforms with a geometry shader as part of a program
+// pipeline.
+TEST_P(ProgramPipelineTest32, MaxGeometryImageUniforms)
+{
+    ANGLE_SKIP_TEST_IF(!IsVulkan() || !IsGLExtensionEnabled("GL_EXT_geometry_shader"));
+
+    GLint maxGeometryImageUnits;
+    glGetIntegerv(GL_MAX_GEOMETRY_IMAGE_UNIFORMS_EXT, &maxGeometryImageUnits);
+
+    const GLchar *vertString = essl31_shaders::vs::Simple();
+    const GLchar *fragString = R"(#version 310 es
+precision highp float;
+out vec4 my_FragColor;
+void main()
+{
+    my_FragColor = vec4(1.0);
+})";
+
+    std::stringstream geomStringStream;
+
+    geomStringStream << R"(#version 310 es
+#extension GL_OES_geometry_shader : require
+layout (points)                   in;
+layout (points, max_vertices = 1) out;
+
+precision highp iimage2D;
+
+ivec4 counter = ivec4(0);
+)";
+
+    for (GLint index = 0; index < maxGeometryImageUnits; ++index)
+    {
+        geomStringStream << "layout(binding = " << index << ", r32i) uniform iimage2D img" << index
+                         << ";" << std::endl;
+    }
+
+    geomStringStream << R"(
+void main()
+{
+)";
+
+    for (GLint index = 0; index < maxGeometryImageUnits; ++index)
+    {
+        geomStringStream << "counter += imageLoad(img" << index << ", ivec2(0, 0));" << std::endl;
+    }
+
+    geomStringStream << R"(
+    gl_Position = vec4(float(counter.x), 0.0, 0.0, 1.0);
+    EmitVertex();
+}
+)";
+
+    bindProgramPipeline(vertString, fragString, geomStringStream.str().c_str());
+
+    std::vector<GLTexture> textures(maxGeometryImageUnits);
+    for (GLint index = 0; index < maxGeometryImageUnits; ++index)
+    {
+        GLint value = index + 1;
+
+        glBindTexture(GL_TEXTURE_2D, textures[index]);
+
+        glTexStorage2D(GL_TEXTURE_2D, 1 /*levels*/, GL_R32I, 1 /*width*/, 1 /*height*/);
+
+        glTexSubImage2D(GL_TEXTURE_2D, 0 /*level*/, 0 /*xoffset*/, 0 /*yoffset*/, 1 /*width*/,
+                        1 /*height*/, GL_RED_INTEGER, GL_INT, &value);
+
+        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
+
+        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
+
+        glBindImageTexture(index, textures[index], 0 /*level*/, GL_FALSE /*is layered?*/,
+                           0 /*layer*/, GL_READ_ONLY, GL_R32I);
+    }
+
+    glDrawArrays(GL_POINTS, 0, 6);
+    ASSERT_GL_NO_ERROR();
+}
+
 GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(ProgramPipelineTest);
 ANGLE_INSTANTIATE_TEST_ES3_AND_ES31(ProgramPipelineTest);
 
@@ -1058,4 +1349,7 @@
 GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(ProgramPipelineXFBTest31);
 ANGLE_INSTANTIATE_TEST_ES31(ProgramPipelineXFBTest31);
 
+GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(ProgramPipelineTest32);
+ANGLE_INSTANTIATE_TEST_ES32(ProgramPipelineTest32);
+
 }  // namespace
diff --git a/src/tests/gl_tests/SRGBFramebufferTest.cpp b/src/tests/gl_tests/SRGBFramebufferTest.cpp
index 1be6f38..b8590fc 100644
--- a/src/tests/gl_tests/SRGBFramebufferTest.cpp
+++ b/src/tests/gl_tests/SRGBFramebufferTest.cpp
@@ -301,6 +301,69 @@
     EXPECT_PIXEL_COLOR_NEAR(0, 0, srgbColor, 1.0);
 }
 
+// This test reproduces an issue in the Vulkan backend found in the Chromium CI that
+// was caused by enabling the VK_KHR_image_format_list extension on SwiftShader
+// which exposed GL_EXT_sRGB_write_control.
+TEST_P(SRGBFramebufferTest, DrawToSmallFBOClearLargeFBO)
+{
+    ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_EXT_sRGB_write_control") ||
+                       (!IsGLExtensionEnabled("GL_EXT_sRGB") && getClientMajorVersion() < 3));
+
+    // Disabling GL_FRAMEBUFFER_SRGB_EXT caused the issue
+    glDisable(GL_FRAMEBUFFER_SRGB_EXT);
+
+    // The issue involved framebuffers of two different sizes.
+    // The smaller needed to be drawn to, while the larger one could be just cleared
+    // to reproduce the issue. These are the smallest tested sizes that generated
+    // the validation error.
+    constexpr GLsizei kDimensionsSmall[] = {1, 1};
+    constexpr GLsizei kDimensionsLarge[] = {2, 2};
+    {
+        GLTexture texture;
+        glBindTexture(GL_TEXTURE_2D, texture.get());
+        glTexStorage2DEXT(GL_TEXTURE_2D, 1, GL_RGBA8, kDimensionsSmall[0], kDimensionsSmall[1]);
+        glBindTexture(GL_TEXTURE_2D, 0);
+
+        GLFramebuffer framebuffer;
+        glBindFramebuffer(GL_FRAMEBUFFER, framebuffer.get());
+        glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, texture.get(),
+                               0);
+
+        unsigned char vertexData[] = {0};
+        GLBuffer vertexBuffer;
+        glBindBuffer(GL_ARRAY_BUFFER, vertexBuffer.get());
+        glBufferData(GL_ARRAY_BUFFER, sizeof(char), vertexData, GL_STATIC_DRAW);
+
+        unsigned int indexData[] = {0};
+        GLBuffer indexBuffer;
+        glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, indexBuffer.get());
+        glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(int), indexData, GL_STATIC_DRAW);
+
+        glUseProgram(mProgram);
+
+        glDrawElements(GL_POINTS, 1, GL_UNSIGNED_INT, nullptr);
+
+        EXPECT_GL_NO_ERROR();
+    }
+    {
+        GLTexture texture;
+        glBindTexture(GL_TEXTURE_2D, texture.get());
+        glTexStorage2DEXT(GL_TEXTURE_2D, 1, GL_RGBA8, kDimensionsLarge[0], kDimensionsLarge[1]);
+        glBindTexture(GL_TEXTURE_2D, 0);
+
+        GLFramebuffer framebuffer;
+        glBindFramebuffer(GL_FRAMEBUFFER, framebuffer.get());
+        glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, texture.get(),
+                               0);
+
+        // Vulkan validation happened to fail here with:
+        // "Cannot execute a render pass with renderArea not within the bound of the framebuffer"
+        glClear(GL_COLOR_BUFFER_BIT);
+
+        EXPECT_GL_NO_ERROR();
+    }
+}
+
 // Use this to select which configurations (e.g. which renderer, which GLES major version) these
 // tests should be run against.
 ANGLE_INSTANTIATE_TEST_ES2_AND_ES3(SRGBFramebufferTest);
diff --git a/src/tests/gl_tests/SRGBTextureTest.cpp b/src/tests/gl_tests/SRGBTextureTest.cpp
index 271fe6d..a0eab1a 100644
--- a/src/tests/gl_tests/SRGBTextureTest.cpp
+++ b/src/tests/gl_tests/SRGBTextureTest.cpp
@@ -340,7 +340,7 @@
     {
         GLTexture tex;
         glBindTexture(GL_TEXTURE_2D, tex.get());
-        glTexStorage2D(GL_TEXTURE_2D, 1, format, 1, 1);
+        glTexStorage2D(GL_TEXTURE_2D, 1, format, 4, 4);
         GLenum error = glGetError();
         if (error == GL_INVALID_ENUM)
         {
diff --git a/src/tests/gl_tests/ShaderStorageBufferTest.cpp b/src/tests/gl_tests/ShaderStorageBufferTest.cpp
index a554d9f..b9e1325 100644
--- a/src/tests/gl_tests/ShaderStorageBufferTest.cpp
+++ b/src/tests/gl_tests/ShaderStorageBufferTest.cpp
@@ -2118,6 +2118,64 @@
     EXPECT_GL_NO_ERROR();
 }
 
+// Test that BufferData change propagate to context state.
+TEST_P(ShaderStorageBufferTest31, DependentBufferChange)
+{
+    // Test fail on Nexus devices. http://anglebug.com/6251
+    ANGLE_SKIP_TEST_IF(IsNexus5X() && IsOpenGLES());
+
+    constexpr char kComputeShaderSource[] =
+        R"(#version 310 es
+layout (local_size_x=1) in;
+layout(binding=0, std140) buffer Storage0
+{
+    uint b;
+} sb_load;
+layout(binding=1, std140) buffer Storage1
+{
+    uint b;
+} sb_store;
+void main()
+{
+    sb_store.b += sb_load.b;
+}
+)";
+
+    ANGLE_GL_COMPUTE_PROGRAM(program, kComputeShaderSource);
+    glUseProgram(program);
+
+    constexpr unsigned int kBufferSize                        = 4096;
+    constexpr unsigned int kBufferElementCount                = kBufferSize / sizeof(unsigned int);
+    std::array<unsigned int, kBufferElementCount> kBufferData = {};
+    GLBuffer shaderStorageBuffer[2];
+    glBindBuffer(GL_SHADER_STORAGE_BUFFER, shaderStorageBuffer[0]);
+    glBufferData(GL_SHADER_STORAGE_BUFFER, kBufferSize, kBufferData.data(), GL_STATIC_DRAW);
+    glBindBuffer(GL_SHADER_STORAGE_BUFFER, shaderStorageBuffer[1]);
+    kBufferData[0] = 5;  // initial value
+    glBufferData(GL_SHADER_STORAGE_BUFFER, kBufferSize, kBufferData.data(), GL_STATIC_DRAW);
+
+    glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 0, shaderStorageBuffer[0]);
+    glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 1, shaderStorageBuffer[1]);
+
+    glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 0, shaderStorageBuffer[0]);
+    kBufferData[0] = 7;
+    glBufferData(GL_SHADER_STORAGE_BUFFER, kBufferSize, kBufferData.data(), GL_STATIC_DRAW);
+    glDispatchCompute(1, 1, 1);
+    kBufferData[0] = 11;
+    glMemoryBarrier(GL_SHADER_STORAGE_BARRIER_BIT | GL_BUFFER_UPDATE_BARRIER_BIT);
+    glBufferData(GL_SHADER_STORAGE_BUFFER, kBufferSize, kBufferData.data(), GL_STATIC_DRAW);
+    glDispatchCompute(1, 1, 1);
+
+    glBindBuffer(GL_SHADER_STORAGE_BUFFER, shaderStorageBuffer[1]);
+    glMemoryBarrier(GL_BUFFER_UPDATE_BARRIER_BIT);
+    const GLuint *ptr = reinterpret_cast<const GLuint *>(
+        glMapBufferRange(GL_SHADER_STORAGE_BUFFER, 0, kBufferSize, GL_MAP_READ_BIT));
+    constexpr unsigned int kExpectedValue = 5 + 7 + 11;
+    EXPECT_EQ(kExpectedValue, *ptr);
+
+    EXPECT_GL_NO_ERROR();
+}
+
 // Test that readonly binary operator for buffer variable is correctly handled.
 TEST_P(ShaderStorageBufferTest31, ReadonlyBinaryOperator)
 {
diff --git a/src/tests/gl_tests/StateChangeTest.cpp b/src/tests/gl_tests/StateChangeTest.cpp
index 00887ea..52a197d 100644
--- a/src/tests/gl_tests/StateChangeTest.cpp
+++ b/src/tests/gl_tests/StateChangeTest.cpp
@@ -6936,6 +6936,19 @@
     // Ensure correct rendering.
     EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::cyan);
 }
+
+// Negative test for EXT_primitive_bounding_box
+TEST_P(SimpleStateChangeTestES31, PrimitiveBoundingBoxNegativeTest)
+{
+    ANGLE_SKIP_TEST_IF(IsGLExtensionEnabled("GL_EXT_primitive_bounding_box"));
+
+    glPrimitiveBoundingBoxEXT(0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f);
+    EXPECT_GL_ERROR(GL_INVALID_OPERATION);
+
+    GLfloat boundingBox[8] = {0};
+    glGetFloatv(GL_PRIMITIVE_BOUNDING_BOX_EXT, boundingBox);
+    EXPECT_GL_ERROR(GL_INVALID_ENUM);
+}
 }  // anonymous namespace
 
 ANGLE_INSTANTIATE_TEST_ES2(StateChangeTest);
diff --git a/src/tests/gl_tests/TextureRectangleTest.cpp b/src/tests/gl_tests/TextureRectangleTest.cpp
index d79fa02..dad203c 100644
--- a/src/tests/gl_tests/TextureRectangleTest.cpp
+++ b/src/tests/gl_tests/TextureRectangleTest.cpp
@@ -142,7 +142,7 @@
     {
         GLTexture tex;
         glBindTexture(GL_TEXTURE_RECTANGLE_ANGLE, tex);
-        TexStorage2D(GL_TEXTURE_RECTANGLE_ANGLE, 1, GL_RGBA8UI, 16, 16);
+        TexStorage2D(GL_TEXTURE_RECTANGLE_ANGLE, 1, GL_RGBA8, 16, 16);
         ASSERT_GL_NO_ERROR();
     }
 
@@ -152,7 +152,7 @@
         glBindTexture(GL_TEXTURE_RECTANGLE_ANGLE, tex);
         // Use 5 levels because the EXT_texture_storage extension requires a mip chain all the way
         // to a 1x1 mip.
-        TexStorage2D(GL_TEXTURE_RECTANGLE_ANGLE, 5, GL_RGBA8UI, 16, 16);
+        TexStorage2D(GL_TEXTURE_RECTANGLE_ANGLE, 5, GL_RGBA8, 16, 16);
         ASSERT_GL_ERROR(GL_INVALID_VALUE);
     }
 
@@ -165,7 +165,7 @@
 
         GLTexture tex;
         glBindTexture(GL_TEXTURE_RECTANGLE_ANGLE, tex);
-        TexStorage2D(GL_TEXTURE_RECTANGLE_ANGLE, 1, GL_RGBA8UI, maxSize, maxSize);
+        TexStorage2D(GL_TEXTURE_RECTANGLE_ANGLE, 1, GL_RGBA8, maxSize, maxSize);
         GLenum error = glGetError();
         ASSERT_TRUE(error == GL_NO_ERROR || error == GL_OUT_OF_MEMORY);
     }
@@ -174,9 +174,9 @@
     {
         GLTexture tex;
         glBindTexture(GL_TEXTURE_RECTANGLE_ANGLE, tex);
-        TexStorage2D(GL_TEXTURE_RECTANGLE_ANGLE, 1, GL_RGBA8UI, maxSize + 1, maxSize);
+        TexStorage2D(GL_TEXTURE_RECTANGLE_ANGLE, 1, GL_RGBA8, maxSize + 1, maxSize);
         ASSERT_GL_ERROR(GL_INVALID_VALUE);
-        TexStorage2D(GL_TEXTURE_RECTANGLE_ANGLE, 1, GL_RGBA8UI, maxSize, maxSize + 1);
+        TexStorage2D(GL_TEXTURE_RECTANGLE_ANGLE, 1, GL_RGBA8, maxSize, maxSize + 1);
         ASSERT_GL_ERROR(GL_INVALID_VALUE);
     }
 
diff --git a/src/tests/gl_tests/TextureTest.cpp b/src/tests/gl_tests/TextureTest.cpp
index 3de8f98..1968de6 100644
--- a/src/tests/gl_tests/TextureTest.cpp
+++ b/src/tests/gl_tests/TextureTest.cpp
@@ -373,6 +373,8 @@
         ASSERT_GL_NO_ERROR();
     }
 
+    void testTextureSize(int testCaseIndex);
+
     GLuint mTexture2D;
     GLint mTexture2DUniformLocation;
 };
@@ -1797,6 +1799,8 @@
         Texture2DTest::testTearDown();
     }
 
+    void runCompressedSubImage();
+
     GLuint mPBO;
 };
 
@@ -2651,6 +2655,39 @@
     EXPECT_PIXEL_EQ(width / 2 - 1, height / 2 - 1, 0, 255, 0, 255);
 }
 
+// Test if the KHR debug label is set and passed to D3D correctly using glCopyTexImage2D.
+TEST_P(Texture2DTest, TextureKHRDebugLabelWithCopyTexImage2D)
+{
+    GLTexture texture2D;
+    glBindTexture(GL_TEXTURE_2D, texture2D);
+    // Create a texture and copy into, to initialize storage object.
+    glCopyTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 0, 0, 32, 32, 0);
+
+    // Set KHR Debug Label.
+    const std::string &label = "TestKHR.DebugLabel";
+    glObjectLabelKHR(GL_TEXTURE, texture2D, -1, label.c_str());
+
+    std::vector<char> labelBuf(label.length() + 1);
+    GLsizei labelLengthBuf = 0;
+
+    glGetObjectLabelKHR(GL_TEXTURE, texture2D, static_cast<GLsizei>(labelBuf.size()),
+                        &labelLengthBuf, labelBuf.data());
+
+    EXPECT_EQ(static_cast<GLsizei>(label.length()), labelLengthBuf);
+    EXPECT_STREQ(label.c_str(), labelBuf.data());
+
+    // Delete the texture.
+    texture2D.reset();
+    EXPECT_GL_NO_ERROR();
+
+    glObjectLabelKHR(GL_TEXTURE, texture2D, -1, label.c_str());
+    EXPECT_GL_ERROR(GL_INVALID_VALUE);
+
+    glGetObjectLabelKHR(GL_TEXTURE, texture2D, static_cast<GLsizei>(labelBuf.size()),
+                        &labelLengthBuf, labelBuf.data());
+    EXPECT_GL_ERROR(GL_INVALID_VALUE);
+}
+
 // Test that glTexSubImage2D combined with a PBO works properly when glTexStorage2D has
 // initialized the image with a depth-only format.
 TEST_P(Texture2DTestES3, TexImageWithDepthPBO)
@@ -3233,85 +3270,59 @@
     EXPECT_GL_ERROR(GL_INVALID_VALUE);
 }
 
+// Test to ensure that glTexStorage3D accepts ASTC sliced 3D. https://crbug.com/1060012
+TEST_P(Texture3DTestES3, ImmutableASTCSliced3D)
+{
+    ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_KHR_texture_compression_astc_sliced_3d"));
+
+    glBindTexture(GL_TEXTURE_3D, mTexture3D);
+    glTexStorage3D(GL_TEXTURE_3D, 1, GL_COMPRESSED_RGBA_ASTC_4x4, 4, 4, 1);
+    EXPECT_GL_NO_ERROR();
+}
+
 void FillLevel(GLint level,
                GLuint width,
                GLuint height,
                const GLColor &color,
-               bool opt_cubemap,
-               bool opt_subTex)
+               bool cubemap,
+               bool subTex)
 {
-    GLsizei numPixels = width * height;
-    std::unique_ptr<uint8_t[]> pixels;
-    GLsizei largeDim = std::max(width, height);
-    GLsizei smallDim = std::min(width, height);
-
-    std::unique_ptr<uint8_t[]> pixelRow = std::make_unique<uint8_t[]>(largeDim * 4);
-    for (GLint jj = 0; jj < largeDim; ++jj)
+    std::vector<GLColor> pixels(width * height, color);
+    std::vector<GLenum> targets;
+    if (cubemap)
     {
-        GLsizei off       = jj * 4;
-        pixelRow[off + 0] = color[0];
-        pixelRow[off + 1] = color[1];
-        pixelRow[off + 2] = color[2];
-        pixelRow[off + 3] = color[3];
-    }
-
-    if (largeDim == numPixels)
-    {
-        pixels = std::move(pixelRow);
+        targets = {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};
     }
     else
     {
-        pixels = std::make_unique<uint8_t[]>(numPixels * 4);
-        for (GLint jj = 0; jj < smallDim; ++jj)
-        {
-            GLsizei off = jj * largeDim * 4;
-            memcpy(pixels.get() + off, pixelRow.get(), largeDim * 4);
-        }
+        targets = {GL_TEXTURE_2D};
     }
 
-    if (opt_cubemap)
+    for (GLenum target : targets)
     {
-        std::array<GLenum, 6> targets = {
-            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};
-        for (GLenum target : targets)
+        if (subTex)
         {
-            if (opt_subTex)
-            {
-                glTexSubImage2D(target, level, 0, 0, width, height, GL_RGBA, GL_UNSIGNED_BYTE,
-                                pixels.get());
-            }
-            else
-            {
-                glTexImage2D(target, level, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE,
-                             pixels.get());
-            }
-        }
-    }
-    else
-    {
-        if (opt_subTex)
-        {
-            glTexSubImage2D(GL_TEXTURE_2D, level, 0, 0, width, height, GL_RGBA, GL_UNSIGNED_BYTE,
-                            pixels.get());
+            glTexSubImage2D(target, level, 0, 0, width, height, GL_RGBA, GL_UNSIGNED_BYTE,
+                            pixels.data());
         }
         else
         {
-            glTexImage2D(GL_TEXTURE_2D, level, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE,
-                         pixels.get());
+            glTexImage2D(target, level, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE,
+                         pixels.data());
         }
     }
 }
 
 // This is part of tests that webgl_conformance_vulkan_passthrough_tests
 // conformance/textures/misc/texture-size.html does
-TEST_P(Texture2DTest, TextureSize)
+void Texture2DTest::testTextureSize(int testCaseIndex)
 {
-    // http://anglebug.com/5982
-    ANGLE_SKIP_TEST_IF(IsLinux() && IsTSan() && (IsOpenGL() || IsVulkan()));
+    // http://anglebug.com/6296
+    ANGLE_SKIP_TEST_IF(IsMetal());
 
-    const GLColor kNewMipColors[] = {
+    std::array<GLColor, 6> kNewMipColors = {
         GLColor::green,  GLColor::red,     GLColor::blue,
         GLColor::yellow, GLColor::magenta, GLColor::cyan,
     };
@@ -3337,108 +3348,129 @@
 {
     gl_FragColor = textureCube(tex, texcoord);
 })";
-    GLuint programCubeMap = CompileProgram(kVS, kFS);
-    ASSERT_NE(0u, programCubeMap);
+    ANGLE_GL_PROGRAM(programCubeMap, kVS, kFS);
+    GLint textureCubeUniformLocation = glGetUniformLocation(programCubeMap, "tex");
+    ASSERT_NE(-1, textureCubeUniformLocation);
     ASSERT_GL_NO_ERROR();
 
-    GLint max2DSize, maxCubeMapSize;
-    glGetTexParameteriv(GL_TEXTURE_2D, GL_MAX_TEXTURE_SIZE, &max2DSize);
-    glGetTexParameteriv(GL_TEXTURE_CUBE_MAP, GL_MAX_CUBE_MAP_TEXTURE_SIZE, &maxCubeMapSize);
-    // Assuming 2048x2048xRGBA (22meg with mips) will run on all WebGL platforms
+    GLint max2DSize = 0;
+    glGetIntegerv(GL_MAX_TEXTURE_SIZE, &max2DSize);
+    GLint maxCubeMapSize = 0;
+    glGetIntegerv(GL_MAX_CUBE_MAP_TEXTURE_SIZE, &maxCubeMapSize);
+    // Assuming 2048x2048xRGBA (22 mb with mips) will run on all WebGL platforms
     GLint max2DSquareSize = std::min(max2DSize, 2048);
-    // I'd prefer this to be 2048 but that's 16meg x 6 faces or 128meg (with mips)
-    // 1024 is 33.5 meg (with mips)
+    // I'd prefer this to be 2048 but that's 16 mb x 6 faces or 128 mb (with mips)
+    // 1024 is 33.5 mb (with mips)
     maxCubeMapSize = std::min(maxCubeMapSize, 1024);
+    ASSERT_GL_NO_ERROR();
 
-    GLint power = 0;
-    GLint size  = std::pow(2, power);
-    GLint texWidth, texHeight;
-
-    while (size <= max2DSize)
+    for (GLint size = 1; size <= max2DSize; size *= 2)
     {
-        for (int i = 0; i < 4; i++)
+        bool cubeMap     = testCaseIndex == 3;
+        GLenum texTarget = cubeMap ? GL_TEXTURE_CUBE_MAP : GL_TEXTURE_2D;
+        GLuint program   = cubeMap ? programCubeMap : mProgram;
+        GLint texWidth = 0, texHeight = 0;
+
+        switch (testCaseIndex)
         {
-            bool cubeMap     = i == 3 ? true : false;
-            GLenum texTarget = cubeMap ? GL_TEXTURE_CUBE_MAP : GL_TEXTURE_2D;
-
-            switch (i)
-            {
-                case 0:
-                    texWidth  = size;
-                    texHeight = 1;
-                    break;
-                case 1:
-                    texWidth  = 1;
-                    texHeight = size;
-                    break;
-                case 2:
-                case 3:
-                    texWidth  = size;
-                    texHeight = size;
-                    break;
-            }
-
-            if (texWidth == texHeight && size > max2DSquareSize)
-            {
-                continue;
-            }
-
-            if (cubeMap && size > maxCubeMapSize)
-            {
-                continue;
-            }
-
-            GLuint texture;
-            glGenTextures(1, &texture);
-
-            glActiveTexture(GL_TEXTURE0);
-            glBindTexture(texTarget, texture);
-            glTexParameteri(texTarget, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
-            glTexParameteri(texTarget, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
-            glTexParameteri(texTarget, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
-            FillLevel(0, texWidth, texHeight, kNewMipColors[colorCount], cubeMap, false);
-
-            if (cubeMap)
-            {
-                glUseProgram(programCubeMap);
-            }
-            else
-            {
-                glUseProgram(mProgram);
-            }
-            glUniform1i(mTexture2DUniformLocation, 0);
-
-            glClear(GL_COLOR_BUFFER_BIT);
-            drawQuad(mProgram, "position", 1.0f);
-            EXPECT_PIXEL_COLOR_EQ(0, 0, kNewMipColors[colorCount]);
-
-            colorCount = (colorCount + 1) % sizeof(kNewMipColors);
-            FillLevel(0, texWidth, texHeight, kNewMipColors[colorCount], cubeMap, false);
-            glGenerateMipmap(texTarget);
-            EXPECT_GL_NO_ERROR();
-
-            glTexParameteri(texTarget, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_NEAREST);
-            glClear(GL_COLOR_BUFFER_BIT);
-            drawQuad(mProgram, "position", 1.0f);
-            EXPECT_PIXEL_COLOR_EQ(0, 0, kNewMipColors[colorCount]);
-
-            colorCount = (colorCount + 1) % sizeof(kNewMipColors);
-            FillLevel(0, texWidth, texHeight, kNewMipColors[colorCount], cubeMap, true);
-            glGenerateMipmap(texTarget);
-
-            glClear(GL_COLOR_BUFFER_BIT);
-            drawQuad(mProgram, "position", 1.0f);
-            EXPECT_PIXEL_COLOR_EQ(0, 0, kNewMipColors[colorCount]);
-            EXPECT_GL_NO_ERROR();
-
-            glDeleteTextures(1, &texture);
+            case 0:
+                texWidth  = size;
+                texHeight = 1;
+                break;
+            case 1:
+                texWidth  = 1;
+                texHeight = size;
+                break;
+            case 2:
+            case 3:
+                texWidth  = size;
+                texHeight = size;
+                break;
         }
 
-        ++power;
-        size = std::pow(2, power);
+        if (texWidth == texHeight && size > max2DSquareSize)
+        {
+            return;
+        }
+
+        if (cubeMap && size > maxCubeMapSize)
+        {
+            return;
+        }
+
+        GLTexture texture;
+        glActiveTexture(GL_TEXTURE0);
+        glBindTexture(texTarget, texture);
+        FillLevel(0, texWidth, texHeight, kNewMipColors[colorCount], cubeMap, false);
+        glTexParameteri(texTarget, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
+        glTexParameteri(texTarget, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
+        glTexParameteri(texTarget, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
+        glTexParameteri(texTarget, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
+        ASSERT_GL_NO_ERROR();
+
+        glClear(GL_COLOR_BUFFER_BIT);
+        ASSERT_GL_NO_ERROR();
+
+        glUseProgram(program);
+        if (cubeMap)
+        {
+            glUniform1i(textureCubeUniformLocation, 0);
+        }
+        else
+        {
+            glUniform1i(mTexture2DUniformLocation, 0);
+        }
+
+        drawQuad(program, "position", 1.0f);
+        ASSERT_GL_NO_ERROR();
+        EXPECT_PIXEL_COLOR_EQ(0, 0, kNewMipColors[colorCount]);
+
+        colorCount = (colorCount + 1) % kNewMipColors.size();
+        FillLevel(0, texWidth, texHeight, kNewMipColors[colorCount], cubeMap, false);
+        glGenerateMipmap(texTarget);
+        ASSERT_GL_NO_ERROR();
+
+        glTexParameteri(texTarget, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_NEAREST);
+        glClear(GL_COLOR_BUFFER_BIT);
+        drawQuad(program, "position", 1.0f);
+        ASSERT_GL_NO_ERROR();
+        EXPECT_PIXEL_COLOR_EQ(0, 0, kNewMipColors[colorCount]);
+
+        colorCount = (colorCount + 1) % kNewMipColors.size();
+        FillLevel(0, texWidth, texHeight, kNewMipColors[colorCount], cubeMap, true);
+        glGenerateMipmap(texTarget);
+
+        glClear(GL_COLOR_BUFFER_BIT);
+        drawQuad(program, "position", 1.0f);
+        ASSERT_GL_NO_ERROR();
+        EXPECT_PIXEL_COLOR_EQ(0, 0, kNewMipColors[colorCount]);
     }
 }
 
+// Permutation 0 of testTextureSize.
+TEST_P(Texture2DTest, TextureSizeCase0)
+{
+    testTextureSize(0);
+}
+
+// Permutation 1 of testTextureSize.
+TEST_P(Texture2DTest, TextureSizeCase1)
+{
+    testTextureSize(1);
+}
+
+// Permutation 2 of testTextureSize.
+TEST_P(Texture2DTest, TextureSizeCase2)
+{
+    testTextureSize(2);
+}
+
+// Permutation 3 of testTextureSize.
+TEST_P(Texture2DTest, TextureSizeCase3)
+{
+    testTextureSize(3);
+}
+
 // Test that drawing works correctly RGBA 3D texture
 TEST_P(Texture3DTestES2, RGBA)
 {
@@ -5650,6 +5682,20 @@
     EXPECT_PIXEL_ALPHA_EQ(0, 0, 255);
 }
 
+// Test that CopyTexImage2D does not trigger assertion after CompressedTexImage2D.
+// https://crbug.com/1216276
+TEST_P(Texture2DTest, CopyAfterCompressed)
+{
+    ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_EXT_texture_compression_dxt1"));
+
+    glBindTexture(GL_TEXTURE_2D, mTexture2D);
+    glCompressedTexImage2D(GL_TEXTURE_2D, 0, GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, 4, 4, 0, 8, nullptr);
+    EXPECT_GL_NO_ERROR();
+
+    glCopyTexImage2D(GL_TEXTURE_2D, 0, GL_LUMINANCE_ALPHA, 0, 0, 4, 4, 0);
+    EXPECT_GL_NO_ERROR();
+}
+
 // When sampling a texture without an alpha channel, "1" is returned as the alpha value.
 // ES 3.0.4 table 3.24
 TEST_P(Texture2DUnsignedIntegerAlpha1TestES3, TextureRGB8UIImplicitAlpha1)
@@ -6767,7 +6813,7 @@
 
         drawQuad(mProgram, "position", 0.5f);
         ASSERT_GL_NO_ERROR();
-        EXPECT_PIXEL_EQ(0, 0, expectedSum.R, expectedSum.G, 0, 255);
+        EXPECT_PIXEL_NEAR(0, 0, expectedSum.R, expectedSum.G, 0, 255, 1);
     }
 
     GLuint mProgram;
@@ -6800,11 +6846,6 @@
 // Test rendering with maximum combined texture units.
 TEST_P(TextureLimitsTest, MaxCombinedTextures)
 {
-    // TODO(timvp): http://anglebug.com/3570
-    // max per-stage sampled image bindings count (32) exceeds device
-    // maxPerStageDescriptorSampledImages limit (16)
-    ANGLE_SKIP_TEST_IF(isSwiftshader());
-
     GLint vertexTextures = mMaxVertexTextures;
 
     if (vertexTextures + mMaxFragmentTextures > mMaxCombinedTextures)
@@ -8182,7 +8223,7 @@
     }
 };
 
-// Test depth texture compatibility with OES_depth_texture. Uses unsized internformat.
+// Test depth texture compatibility with OES_depth_texture. Uses unsized internal format.
 TEST_P(Texture2DDepthTest, DepthTextureES2Compatibility)
 {
     ANGLE_SKIP_TEST_IF(IsD3D11());
@@ -8984,6 +9025,26 @@
     EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::blue);
 }
 
+// Test if the RenderTargetCache is updated when the TextureStorage object is freed
+TEST_P(Texture2DTestES3, UpdateRenderTargetCacheOnDestroyTexStorage)
+{
+    ANGLE_GL_PROGRAM(drawRed, essl3_shaders::vs::Simple(), essl3_shaders::fs::Red());
+    const GLenum attachments[] = {GL_COLOR_ATTACHMENT0};
+
+    GLTexture tex;
+    GLFramebuffer fb;
+    glBindTexture(GL_TEXTURE_2D, tex);
+    glTexStorage2D(GL_TEXTURE_2D, 2, GL_RGBA8, 100, 1);
+    glBindFramebuffer(GL_FRAMEBUFFER, fb);
+    glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, tex, 0);
+    glInvalidateFramebuffer(GL_FRAMEBUFFER, 1, attachments);
+    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_BASE_LEVEL, 1);
+    drawQuad(drawRed, essl3_shaders::PositionAttrib(), 1.0f);
+    EXPECT_GL_NO_ERROR();
+
+    EXPECT_PIXEL_RECT_EQ(0, 0, 100, 1, GLColor::red);
+}
+
 // Draw a quad with an integer texture with a non-zero base level, and test that the color of the
 // texture is output.
 TEST_P(Texture2DIntegerTestES3, IntegerTextureNonZeroBaseLevel)
@@ -9173,8 +9234,7 @@
     EXPECT_PIXEL_COLOR_EQ(width - 1, height - 1, color);
 }
 
-// Test that uses glCompressedTexSubImage2D combined with a PBO
-TEST_P(PBOCompressedTextureTest, PBOCompressedSubImage)
+void PBOCompressedTextureTest::runCompressedSubImage()
 {
     // ETC texture formats are not supported on Mac OpenGL. http://anglebug.com/3853
     ANGLE_SKIP_TEST_IF(IsOSX() && IsDesktopOpenGL());
@@ -9232,6 +9292,23 @@
     ASSERT_GL_NO_ERROR();
 }
 
+// Test that uses glCompressedTexSubImage2D combined with a PBO
+TEST_P(PBOCompressedTextureTest, PBOCompressedSubImage)
+{
+    runCompressedSubImage();
+}
+
+// Verify the row length state is ignored when using compressed tex image calls.
+TEST_P(PBOCompressedTextureTest, PBOCompressedSubImageWithUnpackRowLength)
+{
+    // ROW_LENGTH requires ES3 or an extension.
+    ANGLE_SKIP_TEST_IF(getClientMajorVersion() < 3 &&
+                       !IsGLExtensionEnabled("GL_EXT_unpack_subimage"));
+
+    glPixelStorei(GL_UNPACK_ROW_LENGTH, 1);
+    runCompressedSubImage();
+}
+
 // Test using ETC1_RGB8 with subimage updates
 TEST_P(ETC1CompressedTextureTest, ETC1CompressedSubImage)
 {
diff --git a/src/tests/gl_tests/TransformFeedbackTest.cpp b/src/tests/gl_tests/TransformFeedbackTest.cpp
index 63dd230..8f1289d 100644
--- a/src/tests/gl_tests/TransformFeedbackTest.cpp
+++ b/src/tests/gl_tests/TransformFeedbackTest.cpp
@@ -1036,6 +1036,8 @@
 
     ANGLE_SKIP_TEST_IF(IsLinux() && IsAMD() && IsOpenGL());
 
+    ANGLE_SKIP_TEST_IF(IsAndroid() && IsOpenGL());
+
     // Flaky on Win Intel Vulkan. http://anglebug.com/4497
     ANGLE_SKIP_TEST_IF(IsWindows() && IsIntel() && IsVulkan());
 
diff --git a/src/tests/gl_tests/UniformTest.cpp b/src/tests/gl_tests/UniformTest.cpp
index 8386545..a96708d 100644
--- a/src/tests/gl_tests/UniformTest.cpp
+++ b/src/tests/gl_tests/UniformTest.cpp
@@ -1450,7 +1450,9 @@
 // Use this to select which configurations (e.g. which renderer, which GLES major version) these
 // tests should be run against.
 ANGLE_INSTANTIATE_TEST_ES2_AND_ES3(SimpleUniformTest);
-ANGLE_INSTANTIATE_TEST_ES2_AND_ES3(UniformTest);
+ANGLE_INSTANTIATE_TEST_ES2_AND_ES3_AND(UniformTest,
+                                       WithDirectMetalGeneration(ES2_METAL()),
+                                       WithDirectMetalGeneration(ES3_METAL()));
 
 GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(UniformTestES3);
 ANGLE_INSTANTIATE_TEST_ES3(UniformTestES3);
diff --git a/src/tests/gl_tests/VertexAttributeTest.cpp b/src/tests/gl_tests/VertexAttributeTest.cpp
index fd6f4b3..d6f499f 100644
--- a/src/tests/gl_tests/VertexAttributeTest.cpp
+++ b/src/tests/gl_tests/VertexAttributeTest.cpp
@@ -1862,8 +1862,7 @@
         kColorTestData[dataIndex] = 1u;
     }
 
-    GLuint buffer;
-    glGenBuffers(1, &buffer);
+    GLBuffer buffer;
     glBindBuffer(GL_ARRAY_BUFFER, buffer);
     glBufferData(GL_ARRAY_BUFFER, sizeof(GLuint) * kDataSize, kColorTestData, GL_STATIC_DRAW);
 
@@ -1880,6 +1879,79 @@
     ASSERT_GL_NO_ERROR();
 }
 
+// Test that ensures we do not send data for components not specified by glVertexAttribPointer when
+// component types and sizes are mismatched. Also guard against out of bound errors when atttribute
+// locations are specified.
+TEST_P(VertexAttributeTestES3, DrawWithMismatchedComponentCountLocationSpecified)
+{
+    ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_ANGLE_relaxed_vertex_attribute_type"));
+
+    // To ensure the test results are valid when we don't send data for every component, the
+    // shader's values must be defined by the backend.
+    // Vulkan Spec 22.3. Vertex Attribute Divisor in Instanced Rendering
+    // https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#_vertex_attribute_divisor_in_instanced_rendering
+    // If the format does not include G, B, or A components, then those are filled with (0,0,1) as
+    // needed (using either 1.0f or integer 1 based on the format) for attributes that are not
+    // 64-bit data types.
+    ANGLE_SKIP_TEST_IF(!IsVulkan());
+
+    constexpr char kVS[] = R"(#version 300 es
+precision highp float;
+layout(location = 2) in highp vec4 a_position;
+layout(location = 0) in highp ivec2 a_ColorTest;
+out highp vec2 v_colorTest;
+
+void main() {
+    v_colorTest = vec2(a_ColorTest);
+    gl_Position = a_position;
+})";
+
+    constexpr char kFS[] = R"(#version 300 es
+precision highp float;
+in highp vec2 v_colorTest;
+out vec4 fragColor;
+
+void main() {
+    if(v_colorTest.y < 0.5) {
+        fragColor = vec4(0.0, 1.0, 0.0, 1.0);
+    } else {
+        fragColor = vec4(1.0, 0.0, 0.0, 1.0);
+    }
+})";
+
+    ANGLE_GL_PROGRAM(program, kVS, kFS);
+    glLinkProgram(program);
+    glUseProgram(program);
+    ASSERT_GL_NO_ERROR();
+
+    constexpr size_t kDataSize = 24;
+
+    // Initialize vertex attribute data with 1s.
+    GLuint kColorTestData[kDataSize];
+    for (size_t dataIndex = 0; dataIndex < kDataSize; dataIndex++)
+    {
+        kColorTestData[dataIndex] = 1u;
+    }
+
+    GLBuffer buffer;
+    glBindBuffer(GL_ARRAY_BUFFER, buffer);
+    glBufferData(GL_ARRAY_BUFFER, sizeof(GLuint) * kDataSize, kColorTestData, GL_STATIC_DRAW);
+
+    GLint colorLocation = glGetAttribLocation(program, "a_ColorTest");
+    ASSERT_NE(colorLocation, -1);
+    glVertexAttribIPointer(colorLocation, 1, GL_UNSIGNED_INT, 4 * sizeof(GLuint),
+                           reinterpret_cast<const void *>(0));
+
+    glBindBuffer(GL_ARRAY_BUFFER, 0);
+    glEnableVertexAttribArray(1);
+
+    drawQuad(program, "a_position", 0.5f);
+
+    // Verify green was drawn.
+    EXPECT_PIXEL_RECT_EQ(0, 0, getWindowWidth(), getWindowHeight(), GLColor::green);
+    ASSERT_GL_NO_ERROR();
+}
+
 class VertexAttributeTestES31 : public VertexAttributeTestES3
 {
   protected:
diff --git a/src/tests/gl_tests/VulkanExternalImageTest.cpp b/src/tests/gl_tests/VulkanExternalImageTest.cpp
index 64725eb..552c5e4 100644
--- a/src/tests/gl_tests/VulkanExternalImageTest.cpp
+++ b/src/tests/gl_tests/VulkanExternalImageTest.cpp
@@ -469,7 +469,8 @@
                                         VkImageCreateFlags createFlags,
                                         VkImageUsageFlags usageFlags,
                                         bool isSwiftshader,
-                                        bool enableDebugLayers)
+                                        bool enableDebugLayers,
+                                        bool isES3)
 {
     ASSERT(EnsureGLExtensionEnabled(Traits::MemoryObjectExtension()));
 
@@ -494,6 +495,12 @@
             continue;
         }
 
+        if (format.internalFormat == GL_RGB10_A2_EXT && !isES3 &&
+            !IsGLExtensionEnabled("GL_EXT_texture_type_2_10_10_10_REV"))
+        {
+            continue;
+        }
+
         VkImage image                 = VK_NULL_HANDLE;
         VkDeviceMemory deviceMemory   = VK_NULL_HANDLE;
         VkDeviceSize deviceMemorySize = 0;
@@ -541,9 +548,9 @@
 TEST_P(VulkanExternalImageTest, TextureFormatCompatChromiumFd)
 {
     ANGLE_SKIP_TEST_IF(!EnsureGLExtensionEnabled("GL_EXT_memory_object_fd"));
-    RunTextureFormatCompatChromiumTest<OpaqueFdTraits>(false, kDefaultImageCreateFlags,
-                                                       kDefaultImageUsageFlags, isSwiftshader(),
-                                                       enableDebugLayers());
+    RunTextureFormatCompatChromiumTest<OpaqueFdTraits>(
+        false, kDefaultImageCreateFlags, kDefaultImageUsageFlags, isSwiftshader(),
+        enableDebugLayers(), getClientMajorVersion() >= 3);
 }
 
 // Test all format combinations used by Chrome import successfully (opaque fd), using
@@ -552,9 +559,9 @@
 {
     ANGLE_SKIP_TEST_IF(!EnsureGLExtensionEnabled("GL_EXT_memory_object_fd"));
     ANGLE_SKIP_TEST_IF(!EnsureGLExtensionEnabled("GL_ANGLE_memory_object_flags"));
-    RunTextureFormatCompatChromiumTest<OpaqueFdTraits>(true, kDefaultImageCreateFlags,
-                                                       kDefaultImageUsageFlags, isSwiftshader(),
-                                                       enableDebugLayers());
+    RunTextureFormatCompatChromiumTest<OpaqueFdTraits>(
+        true, kDefaultImageCreateFlags, kDefaultImageUsageFlags, isSwiftshader(),
+        enableDebugLayers(), getClientMajorVersion() >= 3);
 }
 
 // Test all format combinations used by Chrome import successfully (opaque fd), without STORAGE
@@ -563,9 +570,9 @@
 {
     ANGLE_SKIP_TEST_IF(!EnsureGLExtensionEnabled("GL_EXT_memory_object_fd"));
     ANGLE_SKIP_TEST_IF(!EnsureGLExtensionEnabled("GL_ANGLE_memory_object_flags"));
-    RunTextureFormatCompatChromiumTest<OpaqueFdTraits>(true, kDefaultImageCreateFlags,
-                                                       kNoStorageImageUsageFlags, isSwiftshader(),
-                                                       enableDebugLayers());
+    RunTextureFormatCompatChromiumTest<OpaqueFdTraits>(
+        true, kDefaultImageCreateFlags, kNoStorageImageUsageFlags, isSwiftshader(),
+        enableDebugLayers(), getClientMajorVersion() >= 3);
 }
 
 // Test all format combinations used by Chrome import successfully (opaque fd), without STORAGE
@@ -578,18 +585,18 @@
     // http://anglebug.com/5682
     ANGLE_SKIP_TEST_IF(IsLinux() && IsAMD() && IsVulkan());
 
-    RunTextureFormatCompatChromiumTest<OpaqueFdTraits>(true, kMutableImageCreateFlags,
-                                                       kNoStorageImageUsageFlags, isSwiftshader(),
-                                                       enableDebugLayers());
+    RunTextureFormatCompatChromiumTest<OpaqueFdTraits>(
+        true, kMutableImageCreateFlags, kNoStorageImageUsageFlags, isSwiftshader(),
+        enableDebugLayers(), getClientMajorVersion() >= 3);
 }
 
 // Test all format combinations used by Chrome import successfully (fuchsia).
 TEST_P(VulkanExternalImageTest, TextureFormatCompatChromiumZirconVmo)
 {
     ANGLE_SKIP_TEST_IF(!EnsureGLExtensionEnabled("GL_ANGLE_memory_object_fuchsia"));
-    RunTextureFormatCompatChromiumTest<FuchsiaTraits>(false, kDefaultImageCreateFlags,
-                                                      kDefaultImageUsageFlags, isSwiftshader(),
-                                                      enableDebugLayers());
+    RunTextureFormatCompatChromiumTest<FuchsiaTraits>(
+        false, kDefaultImageCreateFlags, kDefaultImageUsageFlags, isSwiftshader(),
+        enableDebugLayers(), getClientMajorVersion() >= 3);
 }
 
 // Test all format combinations used by Chrome import successfully (fuchsia), using
@@ -598,9 +605,9 @@
 {
     ANGLE_SKIP_TEST_IF(!EnsureGLExtensionEnabled("GL_ANGLE_memory_object_fuchsia"));
     ANGLE_SKIP_TEST_IF(!EnsureGLExtensionEnabled("GL_ANGLE_memory_object_flags"));
-    RunTextureFormatCompatChromiumTest<FuchsiaTraits>(true, kDefaultImageCreateFlags,
-                                                      kDefaultImageUsageFlags, isSwiftshader(),
-                                                      enableDebugLayers());
+    RunTextureFormatCompatChromiumTest<FuchsiaTraits>(
+        true, kDefaultImageCreateFlags, kDefaultImageUsageFlags, isSwiftshader(),
+        enableDebugLayers(), getClientMajorVersion() >= 3);
 }
 
 // Test all format combinations used by Chrome import successfully (fuchsia), without STORAGE usage.
@@ -608,9 +615,9 @@
 {
     ANGLE_SKIP_TEST_IF(!EnsureGLExtensionEnabled("GL_ANGLE_memory_object_fuchsia"));
     ANGLE_SKIP_TEST_IF(!EnsureGLExtensionEnabled("GL_ANGLE_memory_object_flags"));
-    RunTextureFormatCompatChromiumTest<FuchsiaTraits>(true, kDefaultImageCreateFlags,
-                                                      kNoStorageImageUsageFlags, isSwiftshader(),
-                                                      enableDebugLayers());
+    RunTextureFormatCompatChromiumTest<FuchsiaTraits>(
+        true, kDefaultImageCreateFlags, kNoStorageImageUsageFlags, isSwiftshader(),
+        enableDebugLayers(), getClientMajorVersion() >= 3);
 }
 
 // Test all format combinations used by Chrome import successfully (fuchsia), without STORAGE usage
@@ -619,9 +626,9 @@
 {
     ANGLE_SKIP_TEST_IF(!EnsureGLExtensionEnabled("GL_ANGLE_memory_object_fuchsia"));
     ANGLE_SKIP_TEST_IF(!EnsureGLExtensionEnabled("GL_ANGLE_memory_object_flags"));
-    RunTextureFormatCompatChromiumTest<FuchsiaTraits>(true, kMutableImageCreateFlags,
-                                                      kNoStorageImageUsageFlags, isSwiftshader(),
-                                                      enableDebugLayers());
+    RunTextureFormatCompatChromiumTest<FuchsiaTraits>(
+        true, kMutableImageCreateFlags, kNoStorageImageUsageFlags, isSwiftshader(),
+        enableDebugLayers(), getClientMajorVersion() >= 3);
 }
 
 template <typename Traits>
diff --git a/src/tests/gl_tests/VulkanFormatTablesTest.cpp b/src/tests/gl_tests/VulkanFormatTablesTest.cpp
index ee7ff9b..b546ad4 100644
--- a/src/tests/gl_tests/VulkanFormatTablesTest.cpp
+++ b/src/tests/gl_tests/VulkanFormatTablesTest.cpp
@@ -70,8 +70,8 @@
 
         for (const ParametersToTest params : parametersToTest)
         {
-            VkFormat actualImageVkFormat =
-                rx::vk::GetVkFormatFromFormatID(vkFormat.actualImageFormatID);
+            VkFormat actualImageVkFormat = rx::vk::GetVkFormatFromFormatID(
+                vkFormat.getActualImageFormatID(rx::vk::ImageAccess::SampleOnly));
 
             // Now let's verify that against vulkan.
             VkFormatProperties formatProperties;
@@ -97,14 +97,16 @@
             EXPECT_EQ(isFilterable, textureCaps.filterable) << actualImageVkFormat;
 
             // isRenderable?
+            VkFormat actualRenderableImageVkFormat =
+                rx::vk::GetVkFormatFromFormatID(vkFormat.getActualRenderableImageFormatID());
             const bool isRenderableColor =
                 (vkGetPhysicalDeviceImageFormatProperties(
-                    renderer->getPhysicalDevice(), actualImageVkFormat, params.imageType,
+                    renderer->getPhysicalDevice(), actualRenderableImageVkFormat, params.imageType,
                     VK_IMAGE_TILING_OPTIMAL, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT,
                     params.createFlags, &imageProperties)) == VK_SUCCESS;
             const bool isRenderableDepthStencil =
                 (vkGetPhysicalDeviceImageFormatProperties(
-                    renderer->getPhysicalDevice(), actualImageVkFormat, params.imageType,
+                    renderer->getPhysicalDevice(), actualRenderableImageVkFormat, params.imageType,
                     VK_IMAGE_TILING_OPTIMAL, VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT,
                     params.createFlags, &imageProperties)) == VK_SUCCESS;
 
diff --git a/src/tests/gl_tests/VulkanFramebufferTest.cpp b/src/tests/gl_tests/VulkanFramebufferTest.cpp
index d44405d..f903726 100644
--- a/src/tests/gl_tests/VulkanFramebufferTest.cpp
+++ b/src/tests/gl_tests/VulkanFramebufferTest.cpp
@@ -78,6 +78,50 @@
     EXPECT_EQ(textureVk->getImage().getLevelCount(), 1u);
 }
 
+// Test ensure that a R4G4B4A4 format sample only will actually uses R4G4B4A4 format instead of
+// R8G8B8A8.
+TEST_P(VulkanFramebufferTest, R4G4B4A4TextureSampleOnlyActuallyUses444Format)
+{
+    rx::ContextVk *contextVk = hackANGLE();
+    rx::RendererVk *renderer = contextVk->getRenderer();
+    angle::FormatID formatID = angle::FormatID::R4G4B4A4_UNORM;
+
+    // Check if R4G4B4A4_UNORM is supported format.
+    bool isTexturable = renderer->hasImageFormatFeatureBits(
+        formatID,
+        VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT);
+    ANGLE_SKIP_TEST_IF(!isTexturable);
+
+    static constexpr GLsizei kTexWidth  = 100;
+    static constexpr GLsizei kTexHeight = 100;
+    GLTexture texture;
+    glBindTexture(GL_TEXTURE_2D, texture);
+
+    const GLushort u16Color = 0xF00F;  // red
+    std::vector<GLushort> pixels(kTexWidth * kTexHeight, u16Color);
+    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA4, kTexWidth, kTexHeight, 0, GL_RGBA,
+                 GL_UNSIGNED_SHORT_4_4_4_4, pixels.data());
+    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
+    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
+    ANGLE_GL_PROGRAM(program, essl3_shaders::vs::Texture2DLod(), essl3_shaders::fs::Texture2DLod());
+    glUseProgram(program);
+    GLint textureLocation = glGetUniformLocation(program, essl3_shaders::Texture2DUniform());
+    ASSERT_NE(-1, textureLocation);
+    GLint lodLocation = glGetUniformLocation(program, essl3_shaders::LodUniform());
+    ASSERT_NE(-1, lodLocation);
+    glActiveTexture(GL_TEXTURE0);
+    glBindTexture(GL_TEXTURE_2D, texture);
+    glClearColor(0, 1, 0, 1);
+    glClear(GL_COLOR_BUFFER_BIT);
+    glUniform1f(lodLocation, 0);
+    drawQuad(program, essl3_shaders::PositionAttrib(), 0.5f);
+    EXPECT_PIXEL_EQ(getWindowWidth() / 2, getWindowHeight() / 2, 255, 0, 0, 255);
+    ASSERT_GL_NO_ERROR();
+
+    rx::TextureVk *textureVk = hackTexture(texture);
+    EXPECT_EQ(textureVk->getImage().getActualFormatID(), formatID);
+}
+
 ANGLE_INSTANTIATE_TEST(VulkanFramebufferTest, ES3_VULKAN());
 
 }  // anonymous namespace
diff --git a/src/tests/gl_tests/VulkanPerformanceCounterTest.cpp b/src/tests/gl_tests/VulkanPerformanceCounterTest.cpp
index 9f2c202..1ce8ba4 100644
--- a/src/tests/gl_tests/VulkanPerformanceCounterTest.cpp
+++ b/src/tests/gl_tests/VulkanPerformanceCounterTest.cpp
@@ -3024,6 +3024,9 @@
         }
     }
 
+    // TODO(syoussefi): Validate.
+    ANGLE_UNUSED_VARIABLE(descriptorSetAllocationsBefore);
+
     ASSERT_GL_NO_ERROR();
 
     // Verify correctness first.
diff --git a/src/tests/gl_tests/WebGLCompatibilityTest.cpp b/src/tests/gl_tests/WebGLCompatibilityTest.cpp
index f57e3c6..5869bbb 100644
--- a/src/tests/gl_tests/WebGLCompatibilityTest.cpp
+++ b/src/tests/gl_tests/WebGLCompatibilityTest.cpp
@@ -296,6 +296,16 @@
                                                    GLsizei blockSize,
                                                    const std::string &extName,
                                                    bool subImageAllowed);
+
+    GLint expectedByteLength(GLenum format, GLsizei width, GLsizei height);
+    void testCompressedTexLevelDimension(GLenum format,
+                                         GLint level,
+                                         GLsizei width,
+                                         GLsizei height,
+                                         GLsizei expectedByteLength,
+                                         GLenum expectedError,
+                                         const char *explanation);
+    void testCompressedTexImage(GLenum format);
 };
 
 class WebGL2CompatibilityTest : public WebGLCompatibilityTest
@@ -3044,6 +3054,84 @@
     ASSERT_GL_ERROR(GL_INVALID_OPERATION);
 }
 
+// Test WebGL-specific constraints on sizes of S3TC textures' mipmap levels.
+TEST_P(WebGLCompatibilityTest, CompressedTexImageS3TC)
+{
+    const char *extensions[] = {
+        "GL_EXT_texture_compression_dxt1",
+        "GL_ANGLE_texture_compression_dxt3",
+        "GL_ANGLE_texture_compression_dxt5",
+    };
+
+    for (const char *extension : extensions)
+    {
+        if (IsGLExtensionRequestable(extension))
+        {
+            glRequestExtensionANGLE(extension);
+        }
+
+        ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled(extension));
+    }
+
+    // Ported from WebGL conformance suite:
+    // sdk/tests/conformance/extensions/s3tc-and-srgb.html
+    constexpr GLenum formats[] = {
+        GL_COMPRESSED_RGB_S3TC_DXT1_EXT,
+        GL_COMPRESSED_RGBA_S3TC_DXT1_EXT,
+        GL_COMPRESSED_RGBA_S3TC_DXT3_EXT,
+        GL_COMPRESSED_RGBA_S3TC_DXT5_EXT,
+    };
+
+    for (GLenum format : formats)
+    {
+        testCompressedTexImage(format);
+    }
+}
+
+// Test WebGL-specific constraints on sizes of RGTC textures' mipmap levels.
+TEST_P(WebGLCompatibilityTest, CompressedTexImageRGTC)
+{
+    if (IsGLExtensionRequestable("GL_EXT_texture_compression_rgtc"))
+    {
+        glRequestExtensionANGLE("GL_EXT_texture_compression_rgtc");
+    }
+
+    ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_EXT_texture_compression_rgtc"));
+
+    // Ported from WebGL conformance suite:
+    // sdk/tests/conformance/extensions/ext-texture-compression-rgtc.html
+    constexpr GLenum formats[] = {GL_COMPRESSED_RED_RGTC1_EXT, GL_COMPRESSED_SIGNED_RED_RGTC1_EXT,
+                                  GL_COMPRESSED_RED_GREEN_RGTC2_EXT,
+                                  GL_COMPRESSED_SIGNED_RED_GREEN_RGTC2_EXT};
+
+    for (GLenum format : formats)
+    {
+        testCompressedTexImage(format);
+    }
+}
+
+// Test WebGL-specific constraints on sizes of BPTC textures' mipmap levels.
+TEST_P(WebGLCompatibilityTest, CompressedTexImageBPTC)
+{
+    if (IsGLExtensionRequestable("GL_EXT_texture_compression_bptc"))
+    {
+        glRequestExtensionANGLE("GL_EXT_texture_compression_bptc");
+    }
+
+    ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_EXT_texture_compression_bptc"));
+
+    // Ported from WebGL conformance suite:
+    // sdk/tests/conformance/extensions/ext-texture-compression-bptc.html
+    constexpr GLenum formats[] = {
+        GL_COMPRESSED_RGBA_BPTC_UNORM_EXT, GL_COMPRESSED_SRGB_ALPHA_BPTC_UNORM_EXT,
+        GL_COMPRESSED_RGB_BPTC_SIGNED_FLOAT_EXT, GL_COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT_EXT};
+
+    for (GLenum format : formats)
+    {
+        testCompressedTexImage(format);
+    }
+}
+
 TEST_P(WebGLCompatibilityTest, L32FTextures)
 {
     constexpr float textureData[]   = {15.1f, 0.0f, 0.0f, 0.0f};
@@ -4941,6 +5029,156 @@
     }
 }
 
+GLint WebGLCompatibilityTest::expectedByteLength(GLenum format, GLsizei width, GLsizei height)
+{
+    switch (format)
+    {
+        case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
+        case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
+        case GL_COMPRESSED_RED_RGTC1_EXT:
+        case GL_COMPRESSED_SIGNED_RED_RGTC1_EXT:
+            return ((width + 3) / 4) * ((height + 3) / 4) * 8;
+        case GL_COMPRESSED_RGBA_S3TC_DXT3_EXT:
+        case GL_COMPRESSED_RGBA_S3TC_DXT5_EXT:
+        case GL_COMPRESSED_RED_GREEN_RGTC2_EXT:
+        case GL_COMPRESSED_SIGNED_RED_GREEN_RGTC2_EXT:
+        case GL_COMPRESSED_RGBA_BPTC_UNORM_EXT:
+        case GL_COMPRESSED_SRGB_ALPHA_BPTC_UNORM_EXT:
+        case GL_COMPRESSED_RGB_BPTC_SIGNED_FLOAT_EXT:
+        case GL_COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT_EXT:
+            return ((width + 3) / 4) * ((height + 3) / 4) * 16;
+    }
+
+    UNREACHABLE();
+    return 0;
+}
+
+void WebGLCompatibilityTest::testCompressedTexLevelDimension(GLenum format,
+                                                             GLint level,
+                                                             GLsizei width,
+                                                             GLsizei height,
+                                                             GLsizei expectedByteLength,
+                                                             GLenum expectedError,
+                                                             const char *explanation)
+{
+    std::vector<uint8_t> tempVector(expectedByteLength, 0);
+
+    EXPECT_GL_NO_ERROR();
+
+    GLTexture sourceTexture;
+    glBindTexture(GL_TEXTURE_2D, sourceTexture);
+    glCompressedTexImage2D(GL_TEXTURE_2D, level, format, width, height, 0, expectedByteLength,
+                           tempVector.data());
+    if (expectedError == 0)
+    {
+        EXPECT_GL_NO_ERROR() << explanation;
+    }
+    else
+    {
+        EXPECT_GL_ERROR(expectedError) << explanation;
+    }
+
+    if (level == 0 && width > 0)
+    {
+        GLTexture sourceTextureStorage;
+        glBindTexture(GL_TEXTURE_2D, sourceTextureStorage);
+
+        if (getClientMajorVersion() >= 3)
+        {
+            glTexStorage2D(GL_TEXTURE_2D, 1, format, width, height);
+            if (expectedError == 0)
+            {
+                EXPECT_GL_NO_ERROR() << explanation << " (texStorage2D)";
+            }
+            else
+            {
+                EXPECT_GL_ERROR(expectedError) << explanation << " (texStorage2D)";
+            }
+        }
+        else
+        {
+            if (IsGLExtensionRequestable("GL_EXT_texture_storage"))
+            {
+                glRequestExtensionANGLE("GL_EXT_texture_storage");
+                ASSERT_TRUE(IsGLExtensionEnabled("GL_EXT_texture_storage"));
+
+                glTexStorage2DEXT(GL_TEXTURE_2D, 1, format, width, height);
+                if (expectedError == 0)
+                {
+                    EXPECT_GL_NO_ERROR() << explanation << " (texStorage2DEXT)";
+                }
+                else
+                {
+                    EXPECT_GL_ERROR(expectedError) << explanation << " (texStorage2DEXT)";
+                }
+            }
+        }
+    }
+}
+
+void WebGLCompatibilityTest::testCompressedTexImage(GLenum format)
+{
+    struct TestCase
+    {
+        GLint level;
+        GLsizei width;
+        GLsizei height;
+        GLenum expectedError;
+        const char *explanation;
+    };
+
+    constexpr TestCase testCases[] = {
+        {0, 4, 3, GL_INVALID_OPERATION, "level is 0, height is not a multiple of 4"},
+        {0, 3, 4, GL_INVALID_OPERATION, "level is 0, width is not a multiple of 4"},
+        {0, 2, 2, GL_INVALID_OPERATION, "level is 0, width is not a multiple of 4"},
+        {0, 4, 4, GL_NO_ERROR, "is valid"},
+        {1, 1, 1, GL_INVALID_OPERATION, "implied base mip 2x2 is invalid"},
+        {1, 1, 2, GL_INVALID_OPERATION, "implied base mip 2x4 is invalid"},
+        {1, 2, 1, GL_INVALID_OPERATION, "implied base mip 4x2 is invalid"},
+        {1, 2, 2, GL_NO_ERROR, "implied base mip 4x4 is valid"},
+    };
+
+    constexpr TestCase webgl2TestCases[] = {
+        {0, 0, 0, GL_NO_ERROR, "0: 0x0 is valid"},
+        {0, 1, 1, GL_INVALID_OPERATION, "0: 1x1 is invalid"},
+        {0, 2, 2, GL_INVALID_OPERATION, "0: 2x2 is invalid"},
+        {0, 3, 3, GL_INVALID_OPERATION, "0: 3x3 is invalid"},
+        {0, 10, 10, GL_INVALID_OPERATION, "0: 10x10 is invalid"},
+        {0, 11, 11, GL_INVALID_OPERATION, "0: 11x11 is invalid"},
+        {0, 11, 12, GL_INVALID_OPERATION, "0: 11x12 is invalid"},
+        {0, 12, 11, GL_INVALID_OPERATION, "0: 12x11 is invalid"},
+        {0, 12, 12, GL_NO_ERROR, "0: 12x12 is valid"},
+        {1, 0, 0, GL_NO_ERROR, "1: 0x0 is valid"},
+        {1, 3, 3, GL_INVALID_OPERATION, "1: 3x3 is invalid"},
+        {1, 5, 5, GL_INVALID_OPERATION, "1: 5x5 is invalid"},
+        {1, 5, 6, GL_INVALID_OPERATION, "1: 5x6 is invalid"},
+        {1, 6, 5, GL_INVALID_OPERATION, "1: 6x5 is invalid"},
+        {1, 6, 6, GL_NO_ERROR, "1: 6x6 is valid"},
+        {2, 0, 0, GL_NO_ERROR, "2: 0x0 is valid"},
+        {2, 3, 3, GL_NO_ERROR, "2: 3x3 is valid"},
+        {3, 1, 3, GL_NO_ERROR, "3: 1x3 is valid"},
+        {3, 1, 1, GL_NO_ERROR, "3: 1x1 is valid"},
+        {2, 1, 3, GL_NO_ERROR, "implied base mip 4x12 is valid"},
+    };
+
+    for (const TestCase &test : testCases)
+    {
+        testCompressedTexLevelDimension(format, test.level, test.width, test.height,
+                                        expectedByteLength(format, test.width, test.height),
+                                        test.expectedError, test.explanation);
+    }
+
+    if (getClientMajorVersion() >= 3)
+    {
+        for (const TestCase &test : webgl2TestCases)
+        {
+            testCompressedTexLevelDimension(format, test.level, test.width, test.height,
+                                            expectedByteLength(format, test.width, test.height),
+                                            test.expectedError, test.explanation);
+        }
+    }
+}
+
 // Test enabling GL_EXT_texture_compression_dxt1 for GL_COMPRESSED_RGB_S3TC_DXT1_EXT
 TEST_P(WebGLCompatibilityTest, EnableCompressedTextureExtensionDXT1RGB)
 {
@@ -5377,8 +5615,9 @@
     EXPECT_NE(0u, program);
 }
 
-ANGLE_INSTANTIATE_TEST_ES2_AND_ES3(WebGLCompatibilityTest);
+ANGLE_INSTANTIATE_TEST_ES2_AND_ES3_AND(WebGLCompatibilityTest,
+                                       WithDirectSPIRVGeneration(ES3_VULKAN()));
 
 GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(WebGL2CompatibilityTest);
-ANGLE_INSTANTIATE_TEST_ES3(WebGL2CompatibilityTest);
+ANGLE_INSTANTIATE_TEST_ES3_AND(WebGL2CompatibilityTest, WithDirectSPIRVGeneration(ES3_VULKAN()));
 }  // namespace angle
diff --git a/src/tests/perf_tests/ANGLEPerfTest.cpp b/src/tests/perf_tests/ANGLEPerfTest.cpp
index 0201e3a..c9b807a 100644
--- a/src/tests/perf_tests/ANGLEPerfTest.cpp
+++ b/src/tests/perf_tests/ANGLEPerfTest.cpp
@@ -57,31 +57,31 @@
     {1, "gpu.angle.gpu"},
 };
 
-void EmptyPlatformMethod(angle::PlatformMethods *, const char *) {}
+void EmptyPlatformMethod(PlatformMethods *, const char *) {}
 
-void CustomLogError(angle::PlatformMethods *platform, const char *errorMessage)
+void CustomLogError(PlatformMethods *platform, const char *errorMessage)
 {
     auto *angleRenderTest = static_cast<ANGLERenderTest *>(platform->context);
     angleRenderTest->onErrorMessage(errorMessage);
 }
 
-void OverrideWorkaroundsD3D(angle::PlatformMethods *platform, angle::FeaturesD3D *featuresD3D)
+void OverrideWorkaroundsD3D(PlatformMethods *platform, FeaturesD3D *featuresD3D)
 {
     auto *angleRenderTest = static_cast<ANGLERenderTest *>(platform->context);
     angleRenderTest->overrideWorkaroundsD3D(featuresD3D);
 }
 
-angle::TraceEventHandle AddPerfTraceEvent(angle::PlatformMethods *platform,
-                                          char phase,
-                                          const unsigned char *categoryEnabledFlag,
-                                          const char *name,
-                                          unsigned long long id,
-                                          double timestamp,
-                                          int numArgs,
-                                          const char **argNames,
-                                          const unsigned char *argTypes,
-                                          const unsigned long long *argValues,
-                                          unsigned char flags)
+TraceEventHandle AddPerfTraceEvent(PlatformMethods *platform,
+                                   char phase,
+                                   const unsigned char *categoryEnabledFlag,
+                                   const char *name,
+                                   unsigned long long id,
+                                   double timestamp,
+                                   int numArgs,
+                                   const char **argNames,
+                                   const unsigned char *argTypes,
+                                   const unsigned long long *argValues,
+                                   unsigned char flags)
 {
     if (!gEnableTrace)
         return 0;
@@ -103,7 +103,7 @@
     return buffer.size();
 }
 
-const unsigned char *GetPerfTraceCategoryEnabled(angle::PlatformMethods *platform,
+const unsigned char *GetPerfTraceCategoryEnabled(PlatformMethods *platform,
                                                  const char *categoryName)
 {
     if (gEnableTrace)
@@ -121,15 +121,15 @@
     return &kZero;
 }
 
-void UpdateTraceEventDuration(angle::PlatformMethods *platform,
+void UpdateTraceEventDuration(PlatformMethods *platform,
                               const unsigned char *categoryEnabledFlag,
                               const char *name,
-                              angle::TraceEventHandle eventHandle)
+                              TraceEventHandle eventHandle)
 {
     // Not implemented.
 }
 
-double MonotonicallyIncreasingTime(angle::PlatformMethods *platform)
+double MonotonicallyIncreasingTime(PlatformMethods *platform)
 {
     return GetHostTimeSeconds();
 }
@@ -214,6 +214,17 @@
         const_cast<ANGLERenderTest *>(reinterpret_cast<const ANGLERenderTest *>(userParam));
     renderTest->onErrorMessage(message);
 }
+
+double ComputeMean(const std::vector<double> &values)
+{
+    double mean = 0;
+    for (double value : values)
+    {
+        mean += value;
+    }
+    mean /= static_cast<double>(values.size());
+    return mean;
+}
 }  // anonymous namespace
 
 TraceEvent::TraceEvent(char phaseIn,
@@ -297,15 +308,10 @@
         }
     }
 
-    if (gVerboseLogging)
+    if (gVerboseLogging && !mTestTrialResults.empty())
     {
         double numResults = static_cast<double>(mTestTrialResults.size());
-        double mean       = 0;
-        for (double trialResult : mTestTrialResults)
-        {
-            mean += trialResult;
-        }
-        mean /= numResults;
+        double mean       = ComputeMean(mTestTrialResults);
 
         double variance = 0;
         for (double trialResult : mTestTrialResults)
@@ -340,28 +346,35 @@
 
     while (mRunning)
     {
-        step();
-
-        if (runPolicy == RunLoopPolicy::FinishEveryStep)
+        if (gMaxStepsPerformed > 0 && mTotalNumStepsPerformed >= gMaxStepsPerformed)
         {
-            glFinish();
+            if (gVerboseLogging)
+            {
+                printf("Stopping test after %d steps.\n", mTotalNumStepsPerformed);
+            }
+            mRunning = false;
         }
-
-        if (mRunning)
+        else if (mTimer.getElapsedTime() > maxRunTime)
         {
-            mTrialNumStepsPerformed++;
-            mTotalNumStepsPerformed++;
-            if (gMaxStepsPerformed > 0 && mTotalNumStepsPerformed >= gMaxStepsPerformed)
+            mRunning = false;
+        }
+        else if (mTrialNumStepsPerformed >= maxStepsToRun)
+        {
+            mRunning = false;
+        }
+        else
+        {
+            step();
+
+            if (runPolicy == RunLoopPolicy::FinishEveryStep)
             {
-                mRunning = false;
+                glFinish();
             }
-            else if (mTimer.getElapsedTime() > maxRunTime)
+
+            if (mRunning)
             {
-                mRunning = false;
-            }
-            else if (mTrialNumStepsPerformed >= maxStepsToRun)
-            {
-                mRunning = false;
+                mTrialNumStepsPerformed++;
+                mTotalNumStepsPerformed++;
             }
         }
     }
@@ -446,8 +459,9 @@
     // Output histogram JSON set format if enabled.
     double secondsPerStep = elapsedTimeSeconds[0] / static_cast<double>(mTrialNumStepsPerformed);
     double secondsPerIteration = secondsPerStep / static_cast<double>(mIterationsPerStep);
-    TestSuite::GetInstance()->addHistogramSample(
-        mName + mBackend, mStory, secondsPerIteration * kMilliSecondsPerSecond, "msBestFitFormat");
+    TestSuite::GetInstance()->addHistogramSample(mName + mBackend, mStory,
+                                                 secondsPerIteration * kMilliSecondsPerSecond,
+                                                 "ms_smallerIsBetter");
     return retValue;
 }
 
@@ -458,27 +472,64 @@
 
 void ANGLEPerfTest::calibrateStepsToRun(RunLoopPolicy policy)
 {
+    // Run initially for "gCalibrationTimeSeconds" using the run loop policy.
     doRunLoop(gCalibrationTimeSeconds, std::numeric_limits<int>::max(), policy);
 
     double elapsedTime = mTimer.getElapsedTime();
+    int stepsPerformed = mTrialNumStepsPerformed;
 
-    // Scale steps down according to the time that exeeded one second.
-    double scale = gCalibrationTimeSeconds / elapsedTime;
-    mStepsToRun  = static_cast<unsigned int>(static_cast<double>(mTrialNumStepsPerformed) * scale);
-    mStepsToRun  = std::max(1, mStepsToRun);
-
+    double scale   = gCalibrationTimeSeconds / elapsedTime;
+    int stepsToRun = static_cast<int>(static_cast<double>(stepsPerformed) * scale);
+    stepsToRun     = std::max(1, stepsPerformed);
     if (getStepAlignment() != 1)
     {
-        mStepsToRun = rx::roundUp(mStepsToRun, getStepAlignment());
+        stepsToRun = rx::roundUp(stepsToRun, getStepAlignment());
     }
 
+    // The run loop policy "FinishEveryStep" indicates we're running GPU tests. GPU work
+    // completes asynchronously from the issued CPU steps. Therefore we need to call
+    // glFinish before we can compute an accurate time elapsed by the test.
+    //
+    // To compute an accurate value for "mStepsToRun" we do a two-pass calibration. The
+    // first pass runs for "gCalibrationTimeSeconds" and calls glFinish every step. The
+    // estimated steps to run using this method is very inaccurate but is guaranteed to
+    // complete in a fixed amount of time. Using that estimate we then run a second pass
+    // and call glFinish a single time after "mStepsToRun" steps. We can then use the
+    // "actual" time elapsed to compute an accurate estimate for "mStepsToRun".
+
+    if (policy == RunLoopPolicy::FinishEveryStep)
+    {
+        for (int loopIndex = 0; loopIndex < gWarmupLoops; ++loopIndex)
+        {
+            doRunLoop(gMaxTrialTimeSeconds, stepsToRun, RunLoopPolicy::RunContinuously);
+
+            // Compute mean of the calibration results.
+            double sampleElapsedTime = mTimer.getElapsedTime();
+            int sampleStepsPerformed = mTrialNumStepsPerformed;
+
+            if (gVerboseLogging)
+            {
+                printf("Calibration loop took %.2lf seconds, with %d steps.\n", sampleElapsedTime,
+                       sampleStepsPerformed);
+            }
+
+            // Scale steps down according to the time that exceeded one second.
+            double sampleScale = gCalibrationTimeSeconds / sampleElapsedTime;
+            stepsToRun = static_cast<int>(static_cast<double>(sampleStepsPerformed) * sampleScale);
+            stepsToRun = std::max(1, stepsToRun);
+            if (getStepAlignment() != 1)
+            {
+                stepsToRun = rx::roundUp(stepsToRun, getStepAlignment());
+            }
+        }
+    }
+
+    // Scale steps down according to the time that exceeded one second.
+    mStepsToRun = stepsToRun;
+
     if (gVerboseLogging)
     {
-        printf(
-            "Running %d steps (calibration took %.2lf seconds). Expecting trial time of %.2lf "
-            "seconds.\n",
-            mStepsToRun, elapsedTime,
-            mStepsToRun * (elapsedTime / static_cast<double>(mTrialNumStepsPerformed)));
+        printf("Running %d steps after calibration.", mStepsToRun);
     }
 
     // Calibration allows the perf test runner script to save some time.
@@ -501,10 +552,10 @@
 
     switch (driver)
     {
-        case angle::GLESDriverType::AngleEGL:
+        case GLESDriverType::AngleEGL:
             break;
-        case angle::GLESDriverType::SystemWGL:
-        case angle::GLESDriverType::SystemEGL:
+        case GLESDriverType::SystemWGL:
+        case GLESDriverType::SystemEGL:
             strstr << "_native";
             break;
         default:
@@ -597,26 +648,24 @@
 
     switch (testParams.driver)
     {
-        case angle::GLESDriverType::AngleEGL:
+        case GLESDriverType::AngleEGL:
             mGLWindow = EGLWindow::New(testParams.majorVersion, testParams.minorVersion);
-            mEntryPointsLib.reset(
-                angle::OpenSharedLibrary(ANGLE_EGL_LIBRARY_NAME, angle::SearchType::ModuleDir));
+            mEntryPointsLib.reset(OpenSharedLibrary(ANGLE_EGL_LIBRARY_NAME, SearchType::ModuleDir));
             break;
-        case angle::GLESDriverType::SystemEGL:
+        case GLESDriverType::SystemEGL:
 #if defined(ANGLE_USE_UTIL_LOADER) && !defined(ANGLE_PLATFORM_WINDOWS)
             mGLWindow = EGLWindow::New(testParams.majorVersion, testParams.minorVersion);
-            mEntryPointsLib.reset(angle::OpenSharedLibraryWithExtension(
+            mEntryPointsLib.reset(OpenSharedLibraryWithExtension(
                 GetNativeEGLLibraryNameWithExtension(), SearchType::SystemDir));
 #else
             std::cerr << "Not implemented." << std::endl;
             mSkipTest = true;
 #endif  // defined(ANGLE_USE_UTIL_LOADER) && !defined(ANGLE_PLATFORM_WINDOWS)
             break;
-        case angle::GLESDriverType::SystemWGL:
+        case GLESDriverType::SystemWGL:
 #if defined(ANGLE_USE_UTIL_LOADER) && defined(ANGLE_PLATFORM_WINDOWS)
             mGLWindow = WGLWindow::New(testParams.majorVersion, testParams.minorVersion);
-            mEntryPointsLib.reset(
-                angle::OpenSharedLibrary("opengl32", angle::SearchType::SystemDir));
+            mEntryPointsLib.reset(OpenSharedLibrary("opengl32", SearchType::SystemDir));
 #else
             std::cout << "WGL driver not available. Skipping test." << std::endl;
             mSkipTest = true;
@@ -650,7 +699,7 @@
     ANGLEPerfTest::SetUp();
 
     // Set a consistent CPU core affinity and high priority.
-    angle::StabilizeCPUForBenchmarking();
+    StabilizeCPUForBenchmarking();
 
     mOSWindow = OSWindow::New();
 
@@ -688,6 +737,11 @@
     mConfigParams.alphaBits   = 8;
     mConfigParams.depthBits   = 24;
     mConfigParams.stencilBits = 8;
+    mConfigParams.colorSpace  = mTestParams.colorSpace;
+    if (mTestParams.surfaceType != SurfaceType::WindowWithVSync)
+    {
+        mConfigParams.swapInterval = 0;
+    }
 
     if (!mGLWindow->initializeGL(mOSWindow, mEntryPointsLib.get(), mTestParams.driver, withMethods,
                                  mConfigParams))
@@ -697,7 +751,7 @@
         // FAIL returns.
     }
 
-    // Disable vsync.
+    // Disable vsync (if not done by the window init).
     if (mTestParams.surfaceType != SurfaceType::WindowWithVSync)
     {
         if (!mGLWindow->setSwapInterval(0))
@@ -757,7 +811,7 @@
     if (mStepsToRun <= 0)
     {
         // Ensure we always call Finish when calibrating Render tests. This completes our work
-        // beween calibration measurements.
+        // between calibration measurements.
         calibrateStepsToRun(RunLoopPolicy::FinishEveryStep);
     }
 }
@@ -995,7 +1049,7 @@
 {
     // Move the time origin to the first call to this function, to avoid generating unnecessarily
     // large timestamps.
-    static double origin = angle::GetCurrentTime();
-    return angle::GetCurrentTime() - origin;
+    static double origin = GetCurrentTime();
+    return GetCurrentTime() - origin;
 }
 }  // namespace angle
diff --git a/src/tests/perf_tests/ANGLEPerfTest.h b/src/tests/perf_tests/ANGLEPerfTest.h
index 9af1103..3093dd4 100644
--- a/src/tests/perf_tests/ANGLEPerfTest.h
+++ b/src/tests/perf_tests/ANGLEPerfTest.h
@@ -144,6 +144,7 @@
     unsigned int iterationsPerStep = 0;
     bool trackGpuTime              = false;
     SurfaceType surfaceType        = SurfaceType::Window;
+    EGLenum colorSpace             = EGL_COLORSPACE_LINEAR;
 };
 
 class ANGLERenderTest : public ANGLEPerfTest
diff --git a/src/tests/perf_tests/ANGLEPerfTestArgs.cpp b/src/tests/perf_tests/ANGLEPerfTestArgs.cpp
index 6276507..313ab2c 100644
--- a/src/tests/perf_tests/ANGLEPerfTestArgs.cpp
+++ b/src/tests/perf_tests/ANGLEPerfTestArgs.cpp
@@ -28,6 +28,7 @@
 bool gEnableAllTraceTests      = false;
 bool gRetraceMode              = false;
 bool gMinimizeGPUWork          = false;
+bool gTraceTestValidation      = false;
 
 // Default to three warmup loops. There's no science to this. More than two loops was experimentally
 // helpful on a Windows NVIDIA setup when testing with Vulkan and native trace tests.
@@ -163,5 +164,12 @@
         {
             gMinimizeGPUWork = true;
         }
+        else if (strcmp("--validation", argv[argIndex]) == 0)
+        {
+            gTraceTestValidation = true;
+            gWarmupLoops         = 0;
+            gTestTrials          = 1;
+            gMaxTrialTimeSeconds = 600.0;
+        }
     }
 }
diff --git a/src/tests/perf_tests/ANGLEPerfTestArgs.h b/src/tests/perf_tests/ANGLEPerfTestArgs.h
index bf5c25c..91d8c51 100644
--- a/src/tests/perf_tests/ANGLEPerfTestArgs.h
+++ b/src/tests/perf_tests/ANGLEPerfTestArgs.h
@@ -30,6 +30,7 @@
 extern bool gEnableAllTraceTests;
 extern bool gRetraceMode;
 extern bool gMinimizeGPUWork;
+extern bool gTraceTestValidation;
 
 inline bool OneFrame()
 {
diff --git a/src/tests/perf_tests/BindingPerf.cpp b/src/tests/perf_tests/BindingPerf.cpp
index a111f13..3d3ece2 100644
--- a/src/tests/perf_tests/BindingPerf.cpp
+++ b/src/tests/perf_tests/BindingPerf.cpp
@@ -93,8 +93,8 @@
 
 BindingsBenchmark::BindingsBenchmark() : ANGLERenderTest("Bindings", GetParam())
 {
-    // Flaky on Windows Intel OpenGL. http://crbug.com/974083
-    if (IsIntel() && GetParam().eglParameters.renderer == EGL_PLATFORM_ANGLE_TYPE_OPENGL_ANGLE)
+    // Flaky on OpenGL. http://anglebug.com/6264
+    if (GetParam().eglParameters.renderer == EGL_PLATFORM_ANGLE_TYPE_OPENGL_ANGLE)
     {
         mSkipTest = true;
     }
diff --git a/src/tests/perf_tests/MultisampledRenderToTexturePerf.cpp b/src/tests/perf_tests/MultisampledRenderToTexturePerf.cpp
index 64e53c3..3d7119a 100644
--- a/src/tests/perf_tests/MultisampledRenderToTexturePerf.cpp
+++ b/src/tests/perf_tests/MultisampledRenderToTexturePerf.cpp
@@ -107,8 +107,8 @@
         mSkipTest = true;
     }
 
-    // Fails on Pixel 2 GLES: http://anglebug.com/5120
-    if (IsPixel2() && GetParam().eglParameters.renderer == EGL_PLATFORM_ANGLE_TYPE_OPENGLES_ANGLE)
+    // Fails on Pixel 4 GLES: http://anglebug.com/5120
+    if (IsPixel4() && GetParam().eglParameters.renderer == EGL_PLATFORM_ANGLE_TYPE_OPENGLES_ANGLE)
     {
         mSkipTest = true;
     }
@@ -120,6 +120,13 @@
     {
         mSkipTest = true;
     }
+
+    // http://anglebug.com/6319
+    if (IsLinux() && IsIntel() &&
+        GetParam().eglParameters.renderer == EGL_PLATFORM_ANGLE_TYPE_OPENGL_ANGLE)
+    {
+        mSkipTest = true;
+    }
 }
 
 void MultisampledRenderToTextureBenchmark::initializeBenchmark()
diff --git a/src/tests/perf_tests/README.md b/src/tests/perf_tests/README.md
index 7faa8e4..25cb5b4 100644
--- a/src/tests/perf_tests/README.md
+++ b/src/tests/perf_tests/README.md
@@ -8,7 +8,7 @@
 
 You can follow the usual instructions to [check out and build ANGLE](../../../doc/DevSetup.md). Build the `angle_perftests` target. Note that all test scores are higher-is-better. You should also ensure `is_debug=false` in your build. Running with `angle_assert_always_on` or debug validation enabled is not recommended.
 
-Variance can be a problem when benchmarking. We have a test harness to run a single test in an infinite loop and print some statistics to help mitigate variance. See [`scripts/perf_test_runner.py`](https://chromium.googlesource.com/angle/angle/+/master/scripts/perf_test_runner.py). To use the script first compile `angle_perftests` into a folder with the word `Release` in it. Then provide the name of the test as the argument to the script. The script will automatically pick up the most current `angle_perftests` and run in an infinite loop.
+Variance can be a problem when benchmarking. We have a test harness to run a single test in an infinite loop and print some statistics to help mitigate variance. See [`scripts/perf_test_runner.py`](https://chromium.googlesource.com/angle/angle/+/main/scripts/perf_test_runner.py). To use the script first compile `angle_perftests` into a folder with the word `Release` in it. Then provide the name of the test as the argument to the script. The script will automatically pick up the most current `angle_perftests` and run in an infinite loop.
 
 ### Choosing the Test to Run
 
@@ -41,6 +41,7 @@
 * `--no-finish`: Don't call glFinish after each test trial.
 * `--enable-all-trace-tests`: Offscreen and vsync-limited trace tests are disabled by default to reduce test time.
 * `--minimize-gpu-work`: Modify API calls so that GPU work is reduced to minimum.
+* `--validation`: Enable serialization validation in the trace tests. Normally used with SwiftShader and retracing.
 
 For example, for an endless run with no warmup, run:
 
diff --git a/src/tests/perf_tests/TextureUploadPerf.cpp b/src/tests/perf_tests/TextureUploadPerf.cpp
index 0343503..1d552cc 100644
--- a/src/tests/perf_tests/TextureUploadPerf.cpp
+++ b/src/tests/perf_tests/TextureUploadPerf.cpp
@@ -88,6 +88,13 @@
     TextureUploadSubImageBenchmark() : TextureUploadBenchmarkBase("TexSubImage")
     {
         addExtensionPrerequisite("GL_EXT_texture_storage");
+
+        // http://anglebug.com/6319
+        if (IsLinux() && IsIntel() &&
+            GetParam().eglParameters.renderer == EGL_PLATFORM_ANGLE_TYPE_OPENGL_ANGLE)
+        {
+            mSkipTest = true;
+        }
     }
 
     void initializeBenchmark() override
diff --git a/src/tests/perf_tests/TracePerfTest.cpp b/src/tests/perf_tests/TracePerfTest.cpp
index a5d472e..8c9d868 100644
--- a/src/tests/perf_tests/TracePerfTest.cpp
+++ b/src/tests/perf_tests/TracePerfTest.cpp
@@ -9,18 +9,23 @@
 
 #include <gtest/gtest.h>
 #include "common/PackedEnums.h"
+#include "common/string_utils.h"
 #include "common/system_utils.h"
 #include "tests/perf_tests/ANGLEPerfTest.h"
 #include "tests/perf_tests/ANGLEPerfTestArgs.h"
 #include "tests/perf_tests/DrawCallPerfParams.h"
+#include "util/capture/frame_capture_test_utils.h"
 #include "util/egl_loader_autogen.h"
-#include "util/frame_capture_test_utils.h"
 #include "util/png_utils.h"
 #include "util/test_utils.h"
 
 #include "restricted_traces/restricted_traces_autogen.h"
 
+#include <rapidjson/document.h>
+#include <rapidjson/istreamwrapper.h>
+
 #include <cassert>
+#include <fstream>
 #include <functional>
 #include <sstream>
 
@@ -42,6 +47,8 @@
 
 namespace
 {
+constexpr size_t kMaxPath = 1024;
+
 struct TracePerfParams final : public RenderTestParams
 {
     // Common default options
@@ -54,11 +61,11 @@
     std::string story() const override
     {
         std::stringstream strstr;
-        strstr << RenderTestParams::story() << "_" << GetTraceInfo(testID).name;
+        strstr << RenderTestParams::story() << "_" << traceInfo.name;
         return strstr.str();
     }
 
-    RestrictedTraceID testID;
+    TraceInfo traceInfo = {};
 };
 
 std::ostream &operator<<(std::ostream &os, const TracePerfParams &params)
@@ -76,6 +83,15 @@
     void destroyBenchmark() override;
     void drawBenchmark() override;
 
+    // TODO(http://www.anglebug.com/5878): Add support for creating EGLSurface:
+    // - eglCreatePbufferSurface()
+    // - eglCreateWindowSurface()
+    EGLContext onEglCreateContext(EGLDisplay display,
+                                  EGLConfig config,
+                                  EGLContext share_context,
+                                  EGLint const *attrib_list);
+    void onEglMakeCurrent(EGLDisplay display, EGLSurface draw, EGLSurface read, EGLContext context);
+    EGLContext onEglGetCurrentContext();
     void onReplayFramebufferChange(GLenum target, GLuint framebuffer);
     void onReplayInvalidateFramebuffer(GLenum target,
                                        GLsizei numAttachments,
@@ -93,19 +109,31 @@
                                        GLsizei numAttachments,
                                        const GLenum *attachments);
 
+    void validateSerializedState(const char *serializedState, const char *fileName, uint32_t line);
+
     bool isDefaultFramebuffer(GLenum target) const;
 
     double getHostTimeFromGLTime(GLint64 glTime);
 
+    uint32_t frameCount() const
+    {
+        const TraceInfo &traceInfo = mParams.traceInfo;
+        return traceInfo.frameEnd - traceInfo.frameStart + 1;
+    }
+
     int getStepAlignment() const override
     {
         // Align step counts to the number of frames in a trace.
-        const TraceInfo &traceInfo = GetTraceInfo(mParams.testID);
-        return static_cast<int>(traceInfo.endFrame - traceInfo.startFrame + 1);
+        return static_cast<int>(frameCount());
     }
 
     void TestBody() override { run(); }
 
+    bool traceNameIs(const char *name) const
+    {
+        return strncmp(name, mParams.traceInfo.name, kTraceInfoMaxNameLen) == 0;
+    }
+
   private:
     struct QueryInfo
     {
@@ -153,7 +181,28 @@
 
 TracePerfTest *gCurrentTracePerfTest = nullptr;
 
-// Don't forget to include KHRONOS_APIENTRY in override methods. Neccessary on Win/x86.
+// Don't forget to include KHRONOS_APIENTRY in override methods. Necessary on Win/x86.
+EGLContext KHRONOS_APIENTRY EglCreateContext(EGLDisplay display,
+                                             EGLConfig config,
+                                             EGLContext share_context,
+                                             EGLint const *attrib_list)
+{
+    return gCurrentTracePerfTest->onEglCreateContext(display, config, share_context, attrib_list);
+}
+
+void KHRONOS_APIENTRY EglMakeCurrent(EGLDisplay display,
+                                     EGLSurface draw,
+                                     EGLSurface read,
+                                     EGLContext context)
+{
+    gCurrentTracePerfTest->onEglMakeCurrent(display, draw, read, context);
+}
+
+EGLContext KHRONOS_APIENTRY EglGetCurrentContext()
+{
+    return gCurrentTracePerfTest->onEglGetCurrentContext();
+}
+
 void KHRONOS_APIENTRY BindFramebufferProc(GLenum target, GLuint framebuffer)
 {
     gCurrentTracePerfTest->onReplayFramebufferChange(target, framebuffer);
@@ -437,6 +486,21 @@
 
 angle::GenericProc KHRONOS_APIENTRY TraceLoadProc(const char *procName)
 {
+    // EGL
+    if (strcmp(procName, "eglCreateContext") == 0)
+    {
+        return reinterpret_cast<angle::GenericProc>(EglCreateContext);
+    }
+    if (strcmp(procName, "eglMakeCurrent") == 0)
+    {
+        return reinterpret_cast<angle::GenericProc>(EglMakeCurrent);
+    }
+    if (strcmp(procName, "eglGetCurrentContext") == 0)
+    {
+        return reinterpret_cast<angle::GenericProc>(EglGetCurrentContext);
+    }
+
+    // GLES
     if (strcmp(procName, "glBindFramebuffer") == 0)
     {
         return reinterpret_cast<angle::GenericProc>(BindFramebufferProc);
@@ -579,37 +643,42 @@
     return gCurrentTracePerfTest->getGLWindow()->getProcAddress(procName);
 }
 
+void ValidateSerializedState(const char *serializedState, const char *fileName, uint32_t line)
+{
+    gCurrentTracePerfTest->validateSerializedState(serializedState, fileName, line);
+}
+
+constexpr char kTraceTestFolder[] = "src/tests/restricted_traces";
+
+bool FindTraceTestDataPath(const char *traceName, char *testDataDirOut, size_t maxDataDirLen)
+{
+    char relativeTestDataDir[kMaxPath] = {};
+    snprintf(relativeTestDataDir, kMaxPath, "%s%c%s", kTraceTestFolder, GetPathSeparator(),
+             traceName);
+    return angle::FindTestDataPath(relativeTestDataDir, testDataDirOut, maxDataDirLen);
+}
+
+bool FindRootTraceTestDataPath(char *testDataDirOut, size_t maxDataDirLen)
+{
+    return angle::FindTestDataPath(kTraceTestFolder, testDataDirOut, maxDataDirLen);
+}
+
 TracePerfTest::TracePerfTest(const TracePerfParams &params)
     : ANGLERenderTest("TracePerf", params, "ms"), mParams(params), mStartFrame(0), mEndFrame(0)
 {
     // TODO: http://anglebug.com/4533 This fails after the upgrade to the 26.20.100.7870 driver.
-    if (IsWindows() && IsIntel() && mParams.getRenderer() == EGL_PLATFORM_ANGLE_TYPE_VULKAN_ANGLE &&
-        mParams.testID == RestrictedTraceID::manhattan_10)
+    if (IsWindows() && IsIntel() && mParams.isVulkan() && traceNameIs("manhattan_10"))
     {
         mSkipTest = true;
     }
 
     // TODO: http://anglebug.com/4731 Fails on older Intel drivers. Passes in newer.
-    if (IsWindows() && IsIntel() && mParams.driver != GLESDriverType::AngleEGL &&
-        mParams.testID == RestrictedTraceID::angry_birds_2_1500)
+    if (IsWindows() && IsIntel() && !mParams.isANGLE() && traceNameIs("angry_birds_2_1500"))
     {
         mSkipTest = true;
     }
 
-    if (mParams.surfaceType != SurfaceType::Window && !gEnableAllTraceTests)
-    {
-        printf("Test skipped. Use --enable-all-trace-tests to run.\n");
-        mSkipTest = true;
-    }
-
-    if (mParams.eglParameters.deviceType != EGL_PLATFORM_ANGLE_DEVICE_TYPE_HARDWARE_ANGLE &&
-        !gEnableAllTraceTests)
-    {
-        printf("Test skipped. Use --enable-all-trace-tests to run.\n");
-        mSkipTest = true;
-    }
-
-    if (mParams.testID == RestrictedTraceID::cod_mobile)
+    if (traceNameIs("cod_mobile"))
     {
         // TODO: http://anglebug.com/4967 Vulkan: GL_EXT_color_buffer_float not supported on Pixel 2
         // The COD:Mobile trace uses a framebuffer attachment with:
@@ -623,62 +692,62 @@
         addExtensionPrerequisite("GL_OES_EGL_image_external");
     }
 
-    if (mParams.testID == RestrictedTraceID::brawl_stars)
+    if (traceNameIs("brawl_stars"))
     {
         addExtensionPrerequisite("GL_EXT_shadow_samplers");
     }
 
-    if (mParams.testID == RestrictedTraceID::free_fire)
+    if (traceNameIs("free_fire"))
     {
         addExtensionPrerequisite("GL_OES_EGL_image_external");
     }
 
-    if (mParams.testID == RestrictedTraceID::marvel_contest_of_champions)
+    if (traceNameIs("marvel_contest_of_champions"))
     {
         addExtensionPrerequisite("GL_EXT_color_buffer_half_float");
     }
 
-    if (mParams.testID == RestrictedTraceID::world_of_tanks_blitz)
+    if (traceNameIs("world_of_tanks_blitz"))
     {
         addExtensionPrerequisite("GL_EXT_disjoint_timer_query");
     }
 
-    if (mParams.testID == RestrictedTraceID::dragon_ball_legends)
+    if (traceNameIs("dragon_ball_legends"))
     {
         addExtensionPrerequisite("GL_KHR_texture_compression_astc_ldr");
     }
 
-    if (mParams.testID == RestrictedTraceID::lego_legacy)
+    if (traceNameIs("lego_legacy"))
     {
         addExtensionPrerequisite("GL_EXT_shadow_samplers");
     }
 
-    if (mParams.testID == RestrictedTraceID::world_war_doh)
+    if (traceNameIs("world_war_doh"))
     {
-        // Linux+Nvidia doesn't support GL_KHR_texture_compression_astc_ldr (possibly others also)
+        // Linux+NVIDIA doesn't support GL_KHR_texture_compression_astc_ldr (possibly others also)
         addExtensionPrerequisite("GL_KHR_texture_compression_astc_ldr");
     }
 
-    if (mParams.testID == RestrictedTraceID::saint_seiya_awakening)
+    if (traceNameIs("saint_seiya_awakening"))
     {
         addExtensionPrerequisite("GL_EXT_shadow_samplers");
 
         // TODO(https://anglebug.com/5517) Linux+Intel generates "Framebuffer is incomplete" errors.
-        if (IsLinux() && IsIntel() && mParams.getRenderer() == EGL_PLATFORM_ANGLE_TYPE_VULKAN_ANGLE)
+        if (IsLinux() && IsIntel() && mParams.isVulkan())
         {
             mSkipTest = true;
         }
     }
 
-    if (mParams.testID == RestrictedTraceID::magic_tiles_3)
+    if (traceNameIs("magic_tiles_3"))
     {
-        // Linux+Nvidia doesn't support GL_KHR_texture_compression_astc_ldr (possibly others also)
+        // Linux+NVIDIA doesn't support GL_KHR_texture_compression_astc_ldr (possibly others also)
         addExtensionPrerequisite("GL_KHR_texture_compression_astc_ldr");
     }
 
-    if (mParams.testID == RestrictedTraceID::real_gangster_crime)
+    if (traceNameIs("real_gangster_crime"))
     {
-        // Linux+Nvidia doesn't support GL_KHR_texture_compression_astc_ldr (possibly others also)
+        // Linux+NVIDIA doesn't support GL_KHR_texture_compression_astc_ldr (possibly others also)
         addExtensionPrerequisite("GL_KHR_texture_compression_astc_ldr");
 
         // Intel doesn't support external images.
@@ -691,37 +760,36 @@
         }
     }
 
-    if (mParams.testID == RestrictedTraceID::asphalt_8)
+    if (traceNameIs("asphalt_8"))
     {
         addExtensionPrerequisite("GL_KHR_texture_compression_astc_ldr");
     }
 
-    if (mParams.testID == RestrictedTraceID::hearthstone)
+    if (traceNameIs("hearthstone"))
     {
         addExtensionPrerequisite("GL_KHR_texture_compression_astc_ldr");
     }
 
-    if (mParams.testID == RestrictedTraceID::efootball_pes_2021)
+    if (traceNameIs("efootball_pes_2021"))
     {
         // TODO(https://anglebug.com/5517) Linux+Intel and Pixel 2 generate "Framebuffer is
         // incomplete" errors with the Vulkan backend.
-        if (mParams.getRenderer() == EGL_PLATFORM_ANGLE_TYPE_VULKAN_ANGLE &&
-            ((IsLinux() && IsIntel()) || IsPixel2()))
+        if (mParams.isVulkan() && ((IsLinux() && IsIntel()) || IsPixel2()))
         {
             mSkipTest = true;
         }
     }
 
-    if (mParams.testID == RestrictedTraceID::manhattan_31)
+    if (traceNameIs("manhattan_31"))
     {
         // TODO: http://anglebug.com/5591 Trace crashes on Pixel 2 in vulkan driver
-        if (IsPixel2() && mParams.getRenderer() == EGL_PLATFORM_ANGLE_TYPE_VULKAN_ANGLE)
+        if (IsPixel2() && mParams.isVulkan())
         {
             mSkipTest = true;
         }
     }
 
-    if (mParams.testID == RestrictedTraceID::idle_heroes)
+    if (traceNameIs("idle_heroes"))
     {
         // TODO: http://anglebug.com/5591 Trace crashes on Pixel 2
         if (IsPixel2())
@@ -730,118 +798,113 @@
         }
     }
 
-    if (mParams.testID == RestrictedTraceID::shadow_fight_2)
+    if (traceNameIs("shadow_fight_2"))
     {
         addExtensionPrerequisite("GL_OES_EGL_image_external");
         addExtensionPrerequisite("GL_KHR_texture_compression_astc_ldr");
     }
 
-    if (mParams.testID == RestrictedTraceID::rise_of_kingdoms)
+    if (traceNameIs("rise_of_kingdoms"))
     {
         addExtensionPrerequisite("GL_OES_EGL_image_external");
     }
 
-    if (mParams.testID == RestrictedTraceID::happy_color)
+    if (traceNameIs("happy_color"))
     {
-        if (IsWindows() && IsAMD() && mParams.getRenderer() == EGL_PLATFORM_ANGLE_TYPE_VULKAN_ANGLE)
+        if (IsWindows() && IsAMD() && mParams.isVulkan())
         {
             mSkipTest = true;
         }
     }
 
-    if (mParams.testID == RestrictedTraceID::bus_simulator_indonesia)
+    if (traceNameIs("bus_simulator_indonesia"))
     {
         // TODO(https://anglebug.com/5629) Linux+(Intel|AMD) native GLES generates
         // GL_INVALID_OPERATION
-        if (IsLinux() && (IsIntel() || IsAMD()) &&
-            mParams.getRenderer() != EGL_PLATFORM_ANGLE_TYPE_VULKAN_ANGLE)
+        if (IsLinux() && (IsIntel() || IsAMD()) && !mParams.isVulkan())
         {
             mSkipTest = true;
         }
     }
 
-    if (mParams.testID == RestrictedTraceID::messenger_lite)
+    if (traceNameIs("messenger_lite"))
     {
-        // TODO: https://anglebug.com/5663 Incorrect pixels on Nvidia Windows for first frame
-        if (IsWindows() && IsNVIDIA() &&
-            mParams.getRenderer() == EGL_PLATFORM_ANGLE_TYPE_VULKAN_ANGLE &&
-            mParams.getDeviceType() != EGL_PLATFORM_ANGLE_DEVICE_TYPE_SWIFTSHADER_ANGLE)
+        // TODO: https://anglebug.com/5663 Incorrect pixels on NVIDIA Windows for first frame
+        if (IsWindows() && IsNVIDIA() && mParams.isVulkan() && !mParams.isSwiftshader())
         {
             mSkipTest = true;
         }
     }
 
-    if (mParams.testID == RestrictedTraceID::among_us)
+    if (traceNameIs("among_us"))
     {
         addExtensionPrerequisite("GL_KHR_texture_compression_astc_ldr");
     }
 
-    if (mParams.testID == RestrictedTraceID::car_parking_multiplayer)
+    if (traceNameIs("car_parking_multiplayer"))
     {
-        // TODO: https://anglebug.com/5613 Nvidia native driver spews undefined behavior warnings
-        if (IsNVIDIA() && mParams.getRenderer() != EGL_PLATFORM_ANGLE_TYPE_VULKAN_ANGLE)
+        // TODO: https://anglebug.com/5613 NVIDIA native driver spews undefined behavior warnings
+        if (IsNVIDIA() && !mParams.isVulkan())
         {
             mSkipTest = true;
         }
         // TODO: https://anglebug.com/5724 Device lost on Win Intel
-        if (IsWindows() && IsIntel() &&
-            mParams.getRenderer() == EGL_PLATFORM_ANGLE_TYPE_VULKAN_ANGLE)
+        if (IsWindows() && IsIntel() && mParams.isVulkan())
         {
             mSkipTest = true;
         }
     }
 
-    if (mParams.testID == RestrictedTraceID::fifa_mobile)
+    if (traceNameIs("fifa_mobile"))
     {
         // TODO: http://anglebug.com/5875 Intel Windows Vulkan flakily renders entirely black
-        if (IsWindows() && IsIntel() &&
-            mParams.getRenderer() == EGL_PLATFORM_ANGLE_TYPE_VULKAN_ANGLE)
+        if (IsWindows() && IsIntel() && mParams.isVulkan())
         {
             mSkipTest = true;
         }
     }
 
-    if (mParams.testID == RestrictedTraceID::rope_hero_vice_town)
+    if (traceNameIs("rope_hero_vice_town"))
     {
         // TODO: http://anglebug.com/5716 Trace crashes on Pixel 2 in vulkan driver
-        if (IsPixel2() && mParams.getRenderer() == EGL_PLATFORM_ANGLE_TYPE_VULKAN_ANGLE)
+        if (IsPixel2() && mParams.isVulkan())
         {
             mSkipTest = true;
         }
     }
 
-    if (mParams.testID == RestrictedTraceID::extreme_car_driving_simulator)
+    if (traceNameIs("extreme_car_driving_simulator"))
     {
         addExtensionPrerequisite("GL_KHR_texture_compression_astc_ldr");
     }
 
-    if (mParams.testID == RestrictedTraceID::plants_vs_zombies_2)
+    if (traceNameIs("plants_vs_zombies_2"))
     {
         // TODO: http://crbug.com/1187752 Corrupted image
-        if (IsWindows() && IsAMD() && mParams.getRenderer() == EGL_PLATFORM_ANGLE_TYPE_VULKAN_ANGLE)
+        if (IsWindows() && IsAMD() && mParams.isVulkan())
         {
             mSkipTest = true;
         }
     }
 
-    if (mParams.testID == RestrictedTraceID::junes_journey)
+    if (traceNameIs("junes_journey"))
     {
         addExtensionPrerequisite("GL_OES_EGL_image_external");
     }
 
-    if (mParams.testID == RestrictedTraceID::ragnarok_m_eternal_love)
+    if (traceNameIs("ragnarok_m_eternal_love"))
     {
         addExtensionPrerequisite("GL_OES_EGL_image_external");
         addExtensionPrerequisite("GL_KHR_texture_compression_astc_ldr");
 
         // TODO: http://anglebug.com/5772 Pixel 2 errors with "Framebuffer is incomplete" on Vulkan
-        if (IsPixel2() && mParams.getRenderer() == EGL_PLATFORM_ANGLE_TYPE_VULKAN_ANGLE)
+        if (IsPixel2() && mParams.isVulkan())
         {
             mSkipTest = true;
         }
     }
 
-    if (mParams.testID == RestrictedTraceID::real_cricket_20)
+    if (traceNameIs("real_cricket_20"))
     {
         // TODO: http://anglebug.com/5777 ARM doesn't have enough VS storage blocks
         if (IsAndroid() && IsARM())
@@ -850,44 +913,43 @@
         }
     }
 
-    if (mParams.testID == RestrictedTraceID::league_of_legends_wild_rift)
+    if (traceNameIs("league_of_legends_wild_rift"))
     {
         addExtensionPrerequisite("GL_OES_EGL_image_external");
         addExtensionPrerequisite("GL_KHR_texture_compression_astc_ldr");
 
         // TODO: http://anglebug.com/5815 Trace is crashing on Intel Linux
-        if (IsLinux() && IsIntel() && mParams.getRenderer() == EGL_PLATFORM_ANGLE_TYPE_VULKAN_ANGLE)
+        if (IsLinux() && IsIntel() && mParams.isVulkan())
         {
             mSkipTest = true;
         }
     }
 
-    if (mParams.testID == RestrictedTraceID::aztec_ruins)
+    if (traceNameIs("aztec_ruins"))
     {
         addExtensionPrerequisite("GL_KHR_texture_compression_astc_ldr");
 
         // TODO: http://anglebug.com/5553 Pixel 2 errors with "Framebuffer is incomplete" on Vulkan
-        if (IsPixel2() && mParams.getRenderer() == EGL_PLATFORM_ANGLE_TYPE_VULKAN_ANGLE)
+        if (IsPixel2() && mParams.isVulkan())
         {
             mSkipTest = true;
         }
     }
 
-    if (mParams.testID == RestrictedTraceID::dragon_raja)
+    if (traceNameIs("dragon_raja"))
     {
         addExtensionPrerequisite("GL_OES_EGL_image_external");
 
         // TODO: http://anglebug.com/5807 Intel Linux and Pixel 2 error with "Framebuffer is
         // incomplete" on Vulkan
-        if (((IsLinux() && IsIntel()) || IsPixel2()) &&
-            mParams.getRenderer() == EGL_PLATFORM_ANGLE_TYPE_VULKAN_ANGLE)
+        if (((IsLinux() && IsIntel()) || IsPixel2()) && mParams.isVulkan())
         {
             mSkipTest = true;
         }
     }
 
     // Adreno gives a driver error with empty/small draw calls. http://anglebug.com/5823
-    if (mParams.testID == RestrictedTraceID::hill_climb_racing)
+    if (traceNameIs("hill_climb_racing"))
     {
         if (IsAndroid() && (IsPixel2() || IsPixel4()) &&
             mParams.driver == GLESDriverType::SystemEGL)
@@ -896,51 +958,47 @@
         }
     }
 
-    if (mParams.testID == RestrictedTraceID::avakin_life)
+    if (traceNameIs("avakin_life"))
     {
         addExtensionPrerequisite("GL_OES_EGL_image_external");
     }
 
-    if (mParams.testID == RestrictedTraceID::professional_baseball_spirits)
+    if (traceNameIs("professional_baseball_spirits"))
     {
         // TODO(https://anglebug.com/5827) Linux+Mesa/RADV Vulkan generates
         // GL_INVALID_FRAMEBUFFER_OPERATION.
         // Mesa versions below 20.3.5 produce the same issue on Linux+Mesa/Intel Vulkan
-        if (IsLinux() && (IsAMD() || IsIntel()) &&
-            mParams.getRenderer() == EGL_PLATFORM_ANGLE_TYPE_VULKAN_ANGLE &&
-            mParams.eglParameters.deviceType != EGL_PLATFORM_ANGLE_DEVICE_TYPE_SWIFTSHADER_ANGLE)
+        if (IsLinux() && (IsAMD() || IsIntel()) && mParams.isVulkan() && !mParams.isSwiftshader())
         {
             mSkipTest = true;
         }
     }
 
-    if (mParams.testID == RestrictedTraceID::call_break_offline_card_game)
+    if (traceNameIs("call_break_offline_card_game"))
     {
         // TODO: http://anglebug.com/5837 Intel Linux Vulkan errors with "Framebuffer is incomplete"
-        if ((IsLinux() && IsIntel()) &&
-            mParams.getRenderer() == EGL_PLATFORM_ANGLE_TYPE_VULKAN_ANGLE)
+        if ((IsLinux() && IsIntel()) && mParams.isVulkan())
         {
             mSkipTest = true;
         }
     }
 
-    if (mParams.testID == RestrictedTraceID::slingshot_test1 ||
-        mParams.testID == RestrictedTraceID::slingshot_test2)
+    if (traceNameIs("slingshot_test1") || traceNameIs("slingshot_test2"))
     {
         // TODO: http://anglebug.com/5877 Trace crashes on Pixel 2 in vulkan driver
-        if (IsPixel2() && mParams.getRenderer() == EGL_PLATFORM_ANGLE_TYPE_VULKAN_ANGLE)
+        if (IsPixel2() && mParams.isVulkan())
         {
             mSkipTest = true;
         }
     }
 
-    if (mParams.testID == RestrictedTraceID::ludo_king)
+    if (traceNameIs("ludo_king"))
     {
         addExtensionPrerequisite("GL_KHR_texture_compression_astc_ldr");
     }
 
     // TODO: http://anglebug.com/5943 GL_INVALID_ENUM on Windows/Intel.
-    if (mParams.testID == RestrictedTraceID::summoners_war)
+    if (traceNameIs("summoners_war"))
     {
         if (IsWindows() && IsIntel() && mParams.driver != GLESDriverType::AngleEGL)
         {
@@ -948,21 +1006,20 @@
         }
     }
 
-    if (mParams.testID == RestrictedTraceID::pokemon_go)
+    if (traceNameIs("pokemon_go"))
     {
         addExtensionPrerequisite("GL_EXT_texture_cube_map_array");
         addExtensionPrerequisite("GL_KHR_texture_compression_astc_ldr");
 
         // TODO: http://anglebug.com/5989 Intel Linux crashing on teardown
         // TODO: http://anglebug.com/5994 Intel Windows timing out periodically
-        if ((IsLinux() || IsWindows()) && IsIntel() &&
-            mParams.getRenderer() == EGL_PLATFORM_ANGLE_TYPE_VULKAN_ANGLE)
+        if ((IsLinux() || IsWindows()) && IsIntel() && mParams.isVulkan())
         {
             mSkipTest = true;
         }
     }
 
-    if (mParams.testID == RestrictedTraceID::cookie_run_kingdom)
+    if (traceNameIs("cookie_run_kingdom"))
     {
         addExtensionPrerequisite("GL_EXT_texture_cube_map_array");
         addExtensionPrerequisite("GL_OES_EGL_image_external");
@@ -974,28 +1031,71 @@
         }
     }
 
-    if (mParams.testID == RestrictedTraceID::genshin_impact)
+    if (traceNameIs("genshin_impact"))
     {
         addExtensionPrerequisite("GL_KHR_texture_compression_astc_ldr");
 
         // TODO: http://anglebug.com/6023 Crashes on Pixel 2 in vulkan driver
         // TODO: http://anglebug.com/6029 Crashes on Linux Intel Vulkan
-        if (((IsLinux() && IsIntel()) || IsPixel2()) &&
-            mParams.getRenderer() == EGL_PLATFORM_ANGLE_TYPE_VULKAN_ANGLE)
+        if (((IsLinux() && IsIntel()) || IsPixel2()) && mParams.isVulkan())
         {
             mSkipTest = true;
         }
     }
 
+    if (traceNameIs("pubg_mobile_skydive") || traceNameIs("pubg_mobile_battle_royale"))
+    {
+        addExtensionPrerequisite("GL_EXT_texture_buffer");
+
+        // TODO: http://anglebug.com/6240 Internal errors on Windows using Intel or NVIDIA
+        if (IsWindows() && (IsIntel() || IsNVIDIA()) && mParams.driver == GLESDriverType::SystemWGL)
+        {
+            mSkipTest = true;
+        }
+    }
+
+    if (traceNameIs("sakura_school_simulator"))
+    {
+        // Flaky on Intel. http://anglebug.com/6294
+        if (IsWindows() && IsIntel())
+        {
+            mSkipTest = true;
+        }
+    }
+
+    if (traceNameIs("scrabble_go"))
+    {
+        addExtensionPrerequisite("GL_KHR_texture_compression_astc_ldr");
+    }
+
+    if (traceNameIs("world_of_kings"))
+    {
+        addExtensionPrerequisite("GL_OES_EGL_image_external");
+        // Flaky on Intel. http://anglebug.com/6372
+        if (IsWindows() && IsIntel())
+        {
+            mSkipTest = true;
+        }
+    }
+
+    ASSERT(mParams.surfaceType == SurfaceType::Window || gEnableAllTraceTests);
+    ASSERT(mParams.eglParameters.deviceType == EGL_PLATFORM_ANGLE_DEVICE_TYPE_HARDWARE_ANGLE ||
+           gEnableAllTraceTests);
+
     // We already swap in TracePerfTest::drawBenchmark, no need to swap again in the harness.
     disableTestHarnessSwap();
 
     gCurrentTracePerfTest = this;
+
+    if (gTraceTestValidation)
+    {
+        mStepsToRun = frameCount();
+    }
 }
 
 void TracePerfTest::initializeBenchmark()
 {
-    const TraceInfo &traceInfo = GetTraceInfo(mParams.testID);
+    const TraceInfo &traceInfo = mParams.traceInfo;
 
     mStartingDirectory = angle::GetCWD().value();
 
@@ -1011,28 +1111,26 @@
         angle::SetCWD(exeDir.c_str());
     }
 
+    trace_angle::LoadEGL(TraceLoadProc);
     trace_angle::LoadGLES(TraceLoadProc);
 
     if (!mTraceLibrary->valid())
     {
-        ERR() << "Could not load trace library.";
         mSkipTest = true;
-        return;
+        FAIL() << "Could not load trace library.";
     }
 
-    mStartFrame = traceInfo.startFrame;
-    mEndFrame   = traceInfo.endFrame;
+    mStartFrame = traceInfo.frameStart;
+    mEndFrame   = traceInfo.frameEnd;
     mTraceLibrary->setBinaryDataDecompressCallback(DecompressBinaryData);
 
-    std::string relativeTestDataDir = std::string("src/tests/restricted_traces/") + traceInfo.name;
+    mTraceLibrary->setValidateSerializedStateCallback(ValidateSerializedState);
 
-    constexpr size_t kMaxDataDirLen = 1000;
-    char testDataDir[kMaxDataDirLen];
-    if (!angle::FindTestDataPath(relativeTestDataDir.c_str(), testDataDir, kMaxDataDirLen))
+    char testDataDir[kMaxPath] = {};
+    if (!FindTraceTestDataPath(traceInfo.name, testDataDir, kMaxPath))
     {
-        ERR() << "Could not find test data folder.";
         mSkipTest = true;
-        return;
+        FAIL() << "Could not find test data folder.";
     }
 
     mTraceLibrary->setBinaryDataDir(testDataDir);
@@ -1056,7 +1154,7 @@
         getWindow()->setOrientation(mTestParams.windowWidth, mTestParams.windowHeight);
     }
 
-    // If we're rendering offscreen we set up a default backbuffer.
+    // If we're rendering offscreen we set up a default back buffer.
     if (mParams.surfaceType == SurfaceType::Offscreen)
     {
         if (!IsAndroid())
@@ -1096,16 +1194,15 @@
 
     glFinish();
 
-    ASSERT_TRUE(mEndFrame > mStartFrame);
+    ASSERT_GE(mEndFrame, mStartFrame);
 
     getWindow()->ignoreSizeEvents();
     getWindow()->setVisible(true);
 
     // If we're re-tracing, trigger capture start after setup. This ensures the Setup function gets
     // recaptured into another Setup function and not merged with the first frame.
-    if (angle::gRetraceMode)
+    if (gRetraceMode)
     {
-        angle::SetEnvironmentVar("ANGLE_CAPTURE_TRIGGER", "0");
         getGLWindow()->swap();
     }
 }
@@ -1220,12 +1317,6 @@
             uint32_t windowX = kOffscreenOffsetX + frameX * kOffscreenFrameWidth;
             uint32_t windowY = kOffscreenOffsetY + frameY * kOffscreenFrameHeight;
 
-            if (gVerboseLogging)
-            {
-                printf("Frame %d: x %d y %d (screen x %d, screen y %d)\n", mOffscreenFrameCount,
-                       frameX, frameY, windowX, windowY);
-            }
-
             GLboolean scissorTest = GL_FALSE;
             glGetBooleanv(GL_SCISSOR_TEST, &scissorTest);
 
@@ -1354,6 +1445,29 @@
     return mTimeline[firstSampleIndex].hostTime + hostRange * t;
 }
 
+EGLContext TracePerfTest::onEglCreateContext(EGLDisplay display,
+                                             EGLConfig config,
+                                             EGLContext share_context,
+                                             EGLint const *attrib_list)
+{
+    GLWindowContext newContext =
+        getGLWindow()->createContextGeneric(reinterpret_cast<GLWindowContext>(share_context));
+    return reinterpret_cast<EGLContext>(newContext);
+}
+
+void TracePerfTest::onEglMakeCurrent(EGLDisplay display,
+                                     EGLSurface draw,
+                                     EGLSurface read,
+                                     EGLContext context)
+{
+    getGLWindow()->makeCurrentGeneric(reinterpret_cast<GLWindowContext>(context));
+}
+
+EGLContext TracePerfTest::onEglGetCurrentContext()
+{
+    return getGLWindow()->getCurrentContextGeneric();
+}
+
 // Triggered when the replay calls glBindFramebuffer.
 void TracePerfTest::onReplayFramebufferChange(GLenum target, GLuint framebuffer)
 {
@@ -1405,6 +1519,94 @@
     mCurrentQuery.framebuffer = framebuffer;
 }
 
+std::string GetDiffPath()
+{
+#if defined(ANGLE_PLATFORM_WINDOWS)
+    std::array<char, MAX_PATH> filenameBuffer = {};
+    char *filenamePtr                         = nullptr;
+    if (SearchPathA(NULL, "diff", ".exe", MAX_PATH, filenameBuffer.data(), &filenamePtr) == 0)
+    {
+        return "";
+    }
+    return std::string(filenameBuffer.data());
+#else
+    return "/usr/bin/diff";
+#endif  // defined(ANGLE_PLATFORM_WINDOWS)
+}
+
+void PrintFileDiff(const char *aFilePath, const char *bFilePath)
+{
+    std::string pathToDiff = GetDiffPath();
+    if (pathToDiff.empty())
+    {
+        printf("Could not find diff in the path.\n");
+        return;
+    }
+
+    std::vector<const char *> args;
+    args.push_back(pathToDiff.c_str());
+    args.push_back(aFilePath);
+    args.push_back(bFilePath);
+    args.push_back("-u3");
+
+    printf("Calling");
+    for (const char *arg : args)
+    {
+        printf(" %s", arg);
+    }
+    printf("\n");
+
+    ProcessHandle proc(LaunchProcess(args, ProcessOutputCapture::StdoutOnly));
+    if (proc && proc->finish())
+    {
+        printf("\n%s\n", proc->getStdout().c_str());
+    }
+}
+
+void TracePerfTest::validateSerializedState(const char *expectedCapturedSerializedState,
+                                            const char *fileName,
+                                            uint32_t line)
+{
+    if (!gTraceTestValidation)
+    {
+        return;
+    }
+
+    printf("Serialization checkpoint %s:%u...\n", fileName, line);
+
+    const GLubyte *bytes                      = glGetString(GL_SERIALIZED_CONTEXT_STRING_ANGLE);
+    const char *actualReplayedSerializedState = reinterpret_cast<const char *>(bytes);
+    if (strcmp(expectedCapturedSerializedState, actualReplayedSerializedState) == 0)
+    {
+        printf("Serialization match.\n");
+        return;
+    }
+
+    printf("Serialization mismatch!\n");
+
+    char aFilePath[kMaxPath] = {};
+    if (CreateTemporaryFile(aFilePath, kMaxPath))
+    {
+        printf("Saving \"expected\" capture serialization to \"%s\".\n", aFilePath);
+        FILE *fpA = fopen(aFilePath, "wt");
+        ASSERT(fpA);
+        fprintf(fpA, "%s", expectedCapturedSerializedState);
+        fclose(fpA);
+    }
+
+    char bFilePath[kMaxPath] = {};
+    if (CreateTemporaryFile(bFilePath, kMaxPath))
+    {
+        printf("Saving \"actual\" replay serialization to \"%s\".\n", bFilePath);
+        FILE *fpB = fopen(bFilePath, "wt");
+        ASSERT(fpB);
+        fprintf(fpB, "%s", actualReplayedSerializedState);
+        fclose(fpB);
+    }
+
+    PrintFileDiff(aFilePath, bFilePath);
+}
+
 bool TracePerfTest::isDefaultFramebuffer(GLenum target) const
 {
     switch (target)
@@ -1570,8 +1772,7 @@
     std::vector<uint8_t> pixelData(pixelCount * 4);
 
     // Only unbind the framebuffer on context versions where it's available.
-    const TraceInfo &traceInfo = GetTraceInfo(mParams.testID);
-    if (traceInfo.contextClientMajorVersion > 1)
+    if (mParams.traceInfo.contextClientMajorVersion > 1)
     {
         glBindFramebuffer(GL_FRAMEBUFFER, 0);
     }
@@ -1602,16 +1803,15 @@
     }
 }
 
-TracePerfParams CombineTestID(const TracePerfParams &in, RestrictedTraceID id)
+TracePerfParams CombineWithTraceInfo(const TracePerfParams &in, const TraceInfo &traceInfo)
 {
-    const TraceInfo &traceInfo = GetTraceInfo(id);
-
     TracePerfParams out = in;
-    out.testID          = id;
+    out.traceInfo       = traceInfo;
     out.majorVersion    = traceInfo.contextClientMajorVersion;
     out.minorVersion    = traceInfo.contextClientMinorVersion;
     out.windowWidth     = traceInfo.drawSurfaceWidth;
     out.windowHeight    = traceInfo.drawSurfaceHeight;
+    out.colorSpace      = traceInfo.drawSurfaceColorSpace;
     return out;
 }
 
@@ -1640,6 +1840,53 @@
 
 void RegisterTraceTests()
 {
+    // To load the trace data path correctly we set the CWD to the executable dir.
+    std::string previousCWD;
+    if (!IsAndroid())
+    {
+        previousCWD        = GetCWD().value();
+        std::string exeDir = GetExecutableDirectory();
+        SetCWD(exeDir.c_str());
+    }
+
+    char rootTracePath[kMaxPath] = {};
+    if (!FindRootTraceTestDataPath(rootTracePath, kMaxPath))
+    {
+        ERR() << "Unable to find trace folder.";
+        return;
+    }
+
+    // Load JSON data.
+    std::stringstream tracesJsonStream;
+    tracesJsonStream << rootTracePath << GetPathSeparator() << "restricted_traces.json";
+    std::string tracesJsonPath = tracesJsonStream.str();
+
+    std::vector<std::string> traces;
+    if (!LoadTraceNamesFromJSON(tracesJsonPath, &traces))
+    {
+        ERR() << "Unable to load traces from JSON file: " << tracesJsonPath;
+        return;
+    }
+
+    std::vector<TraceInfo> traceInfos;
+    for (const std::string &trace : traces)
+    {
+        std::stringstream traceJsonStream;
+        traceJsonStream << rootTracePath << GetPathSeparator() << trace << GetPathSeparator()
+                        << trace << ".json";
+        std::string traceJsonPath = traceJsonStream.str();
+
+        TraceInfo traceInfo = {};
+        if (!LoadTraceInfoFromJSON(trace, traceJsonPath, &traceInfo))
+        {
+            static_assert(sizeof(TraceInfo) == sizeof(trace_angle::TraceInfo), "Size mismatch");
+            trace_angle::TraceInfo autogenFormatInfo = trace_angle::GetTraceInfo(trace.c_str());
+            memcpy(&traceInfo, &autogenFormatInfo, sizeof(TraceInfo));
+        }
+
+        traceInfos.push_back(traceInfo);
+    }
+
     std::vector<SurfaceType> surfaceTypes = {SurfaceType::Window};
     if (gEnableAllTraceTests)
     {
@@ -1657,14 +1904,29 @@
         renderers.push_back(VulkanSwiftShader<P>);
     }
 
-    PV testsWithID = CombineWithValues({P()}, AllEnums<RestrictedTraceID>(), CombineTestID);
-    PV testsWithSurfaceType = CombineWithValues(testsWithID, surfaceTypes, CombineWithSurfaceType);
-    PV testsWithRenderer    = CombineWithFuncs(testsWithSurfaceType, renderers);
-    PV filteredTests        = FilterTestParams(testsWithRenderer);
+    PV withTraceInfo   = CombineWithValues({P()}, traceInfos, CombineWithTraceInfo);
+    PV withSurfaceType = CombineWithValues(withTraceInfo, surfaceTypes, CombineWithSurfaceType);
+    PV withRenderer    = CombineWithFuncs(withSurfaceType, renderers);
 
-    for (const TracePerfParams &params : filteredTests)
+    for (const TracePerfParams &params : withRenderer)
     {
-        auto factory          = [params]() { return new TracePerfTest(params); };
+        if (!IsPlatformAvailable(params))
+        {
+            continue;
+        }
+
+        // Force on features if we're validating serialization.
+        TracePerfParams overrideParams = params;
+        if (gTraceTestValidation)
+        {
+            // Enable limits when validating traces because we usually turn off capture.
+            overrideParams.eglParameters.captureLimits = EGL_TRUE;
+
+            // This feature should also be enabled in capture to mirror the replay.
+            overrideParams.eglParameters.forceInitShaderVariables = EGL_TRUE;
+        }
+
+        auto factory          = [overrideParams]() { return new TracePerfTest(overrideParams); };
         std::string paramName = testing::PrintToString(params);
         std::stringstream testNameStr;
         testNameStr << "Run/" << paramName;
@@ -1672,4 +1934,9 @@
         testing::RegisterTest("TracePerfTest", testName.c_str(), nullptr, paramName.c_str(),
                               __FILE__, __LINE__, factory);
     }
+
+    if (!previousCWD.empty())
+    {
+        SetCWD(previousCWD.c_str());
+    }
 }
diff --git a/src/tests/restricted_traces/.gitignore b/src/tests/restricted_traces/.gitignore
index 7aa8592..fba8fa1 100644
--- a/src/tests/restricted_traces/.gitignore
+++ b/src/tests/restricted_traces/.gitignore
@@ -6,6 +6,7 @@
 avakin_life/
 aztec_ruins/
 beach_buggy_racing/
+blockman_go/
 brawl_stars/
 bricks_breaker_quest/
 bubble_shooter/
@@ -32,6 +33,7 @@
 farm_heroes_saga/
 fate_grand_order/
 fifa_mobile/
+final_fantasy/
 free_fire/
 gardenscapes/
 genshin_impact/
@@ -63,7 +65,9 @@
 plants_vs_zombies_2/
 pokemon_go/
 professional_baseball_spirits/
+pubg_mobile_battle_royale/
 pubg_mobile_lite/
+pubg_mobile_skydive/
 ragnarok_m_eternal_love/
 raid_shadow_legends/
 real_commando_secret_mission/
@@ -74,10 +78,12 @@
 rope_hero_vice_town/
 saint_seiya_awakening/
 sakura_school_simulator/
+scrabble_go/
 shadow_fight_2/
 slingshot_test1/
 slingshot_test2/
 sniper_3d/
+sonic_the_hedgehog/
 standoff_2/
 subway_princess_runner/
 subway_surfers/
@@ -89,6 +95,9 @@
 township/
 trex_200/
 whatsapp/
+words_with_friends_2/
+wordscapes/
+world_of_kings/
 world_of_tanks_blitz/
 world_war_doh/
 worms_zone_io/
\ No newline at end of file
diff --git a/src/tests/restricted_traces/BUILD.gn b/src/tests/restricted_traces/BUILD.gn
index 333649d..274aa1c 100644
--- a/src/tests/restricted_traces/BUILD.gn
+++ b/src/tests/restricted_traces/BUILD.gn
@@ -9,6 +9,7 @@
 angle_shared_library("angle_restricted_trace_loader") {
   sources = [
     "restricted_traces_autogen.h",
+    "restricted_traces_export.h",
     "trace_egl_loader_autogen.cpp",
     "trace_egl_loader_autogen.h",
     "trace_gles_loader_autogen.cpp",
@@ -20,7 +21,10 @@
 
 angle_trace_fixture("angle_restricted_trace_fixture") {
   gl_header = "angle_trace_gl.h"
-  public_deps = [ ":angle_restricted_trace_loader" ]
+  public_deps = [
+    ":angle_restricted_trace_loader",
+    "$angle_root/util:angle_util",
+  ]
   public_configs = [ "$angle_root:no_gl_prototypes" ]
 }
 
@@ -38,7 +42,7 @@
     trace_dir = _trace
     trace_ctx = _trace_data[1]
     sources = _trace_data[2]
-    angledata = _trace_data[3]
+    data = _trace_data[3]
     fixture = ":angle_restricted_trace_fixture"
   }
 
@@ -52,8 +56,11 @@
   sources = [
     "restricted_traces_autogen.cpp",
     "restricted_traces_autogen.h",
+    "restricted_traces_export.h",
   ]
 
+  data = [ "restricted_traces.json" ]
+
   data_deps = _traces
   defines = [ "ANGLE_TRACE_IMPLEMENTATION" ]
 
@@ -90,7 +97,7 @@
   data = [
     "restricted_trace_gold_tests.py",
     "restricted_traces.json",
-    "skia_gold/",
+    "../skia_gold/",
     "//build/skia_gold_common/",
     "//testing/scripts/common.py",
     "//testing/xvfb.py",
diff --git a/src/tests/restricted_traces/README.md b/src/tests/restricted_traces/README.md
index 8165474..a0a7137 100644
--- a/src/tests/restricted_traces/README.md
+++ b/src/tests/restricted_traces/README.md
@@ -38,7 +38,7 @@
 ...
 ```
 
-[CIPD]: https://chromium.googlesource.com/infra/luci/luci-go/+/master/cipd/README.md
+[CIPD]: https://chromium.googlesource.com/infra/luci/luci-go/+/main/cipd/README.md
 
 ## Building the trace tests
 
diff --git a/src/tests/restricted_traces/gen_restricted_traces.py b/src/tests/restricted_traces/gen_restricted_traces.py
old mode 100644
new mode 100755
index 14e091b..3750b18
--- a/src/tests/restricted_traces/gen_restricted_traces.py
+++ b/src/tests/restricted_traces/gen_restricted_traces.py
@@ -7,6 +7,7 @@
 # gen_restricted_traces.py:
 #   Generates integration code for the restricted trace tests.
 
+import getpass
 import glob
 import fnmatch
 import json
@@ -39,76 +40,58 @@
 //
 // {filename}: Types and enumerations for trace tests.
 
-#ifndef ANGLE_RESTRICTED_TRACES_H_
-#define ANGLE_RESTRICTED_TRACES_H_
+#ifndef ANGLE_RESTRICTED_TRACES_AUTOGEN_H_
+#define ANGLE_RESTRICTED_TRACES_AUTOGEN_H_
 
 #include <cstdint>
 #include <vector>
 #include <KHR/khrplatform.h>
+#include <EGL/egl.h>
 
-// See util/util_export.h for details on import/export labels.
-#if !defined(ANGLE_TRACE_EXPORT)
-#    if defined(_WIN32)
-#        if defined(ANGLE_TRACE_IMPLEMENTATION)
-#            define ANGLE_TRACE_EXPORT __declspec(dllexport)
-#        else
-#            define ANGLE_TRACE_EXPORT __declspec(dllimport)
-#        endif
-#    elif defined(__GNUC__)
-#        define ANGLE_TRACE_EXPORT __attribute__((visibility("default")))
-#    else
-#        define ANGLE_TRACE_EXPORT
-#    endif
-#endif  // !defined(ANGLE_TRACE_EXPORT)
-
-#if !defined(ANGLE_TRACE_LOADER_EXPORT)
-#    if defined(_WIN32)
-#        if defined(ANGLE_TRACE_LOADER_IMPLEMENTATION)
-#            define ANGLE_TRACE_LOADER_EXPORT __declspec(dllexport)
-#        else
-#            define ANGLE_TRACE_LOADER_EXPORT __declspec(dllimport)
-#        endif
-#    elif defined(__GNUC__)
-#        define ANGLE_TRACE_LOADER_EXPORT __attribute__((visibility("default")))
-#    else
-#        define ANGLE_TRACE_LOADER_EXPORT
-#    endif
-#endif  // !defined(ANGLE_TRACE_LOADER_EXPORT)
+#include "restricted_traces_export.h"
 
 namespace trace_angle
 {{
 using GenericProc = void (*)();
 using LoadProc    = GenericProc(KHRONOS_APIENTRY *)(const char *);
+ANGLE_TRACE_LOADER_EXPORT void LoadEGL(LoadProc loadProc);
 ANGLE_TRACE_LOADER_EXPORT void LoadGLES(LoadProc loadProc);
-}}  // namespace trace_angle
 
-namespace angle
-{{
-enum class RestrictedTraceID
-{{
-{trace_ids}, InvalidEnum, EnumCount = InvalidEnum
-}};
-
-static constexpr size_t kTraceInfoMaxNameLen = 32;
+static constexpr size_t kTraceInfoMaxNameLen = 128;
 
 static constexpr uint32_t kDefaultReplayContextClientMajorVersion = 3;
 static constexpr uint32_t kDefaultReplayContextClientMinorVersion = 1;
+static constexpr uint32_t kDefaultReplayDrawSurfaceColorSpace = EGL_COLORSPACE_LINEAR;
 
 struct TraceInfo
 {{
+    char name[kTraceInfoMaxNameLen];
     uint32_t contextClientMajorVersion;
     uint32_t contextClientMinorVersion;
-    uint32_t startFrame;
-    uint32_t endFrame;
+    uint32_t frameEnd;
+    uint32_t frameStart;
     uint32_t drawSurfaceWidth;
     uint32_t drawSurfaceHeight;
-    char name[kTraceInfoMaxNameLen];
+    uint32_t drawSurfaceColorSpace;
+    uint32_t displayPlatformType;
+    uint32_t displayDeviceType;
+    int configRedBits;
+    int configBlueBits;
+    int configGreenBits;
+    int configAlphaBits;
+    int configDepthBits;
+    int configStencilBits;
+    bool isBinaryDataCompressed;
+    bool areClientArraysEnabled;
+    bool isBindGeneratesResourcesEnabled;
+    bool isWebGLCompatibilityEnabled;
+    bool isRobustResourceInitEnabled;
 }};
 
-ANGLE_TRACE_EXPORT const TraceInfo &GetTraceInfo(RestrictedTraceID traceID);
-}}  // namespace angle
+ANGLE_TRACE_EXPORT const TraceInfo &GetTraceInfo(const char *traceName);
+}}  // namespace trace_angle
 
-#endif  // ANGLE_RESTRICTED_TRACES_H_
+#endif  // ANGLE_RESTRICTED_TRACES_AUTOGEN_H_
 """
 
 SOURCE_TEMPLATE = """\
@@ -128,23 +111,39 @@
 
 {trace_includes}
 
-namespace angle
+namespace trace_angle
 {{
 namespace
 {{
-constexpr angle::PackedEnumMap<RestrictedTraceID, TraceInfo> kTraceInfos = {{
+constexpr size_t kNumTraces = {num_traces};
+struct TracePair
+{{
+    const char name[kTraceInfoMaxNameLen];
+    TraceInfo info;
+}};
+constexpr TracePair kTraceInfos[kNumTraces] = {{
 {trace_infos}
 }};
 }}
 
-const TraceInfo &GetTraceInfo(RestrictedTraceID traceID)
+const TraceInfo &GetTraceInfo(const char *traceName)
 {{
-    return kTraceInfos[traceID];
+    // Could be improved using std::lower_bound.
+    for (const TracePair &tracePair : kTraceInfos)
+    {{
+        if (strncmp(tracePair.name, traceName, kTraceInfoMaxNameLen) == 0)
+        {{
+            return tracePair.info;
+        }}
+    }}
+    UNREACHABLE();
+    return kTraceInfos[0].info;
 }}
-}}  // namespace angle
+}}  // namespace trace_angle
 """
 
 CIPD_TRACE_PREFIX = 'angle/traces'
+EXPERIMENTAL_CIPD_PREFIX = 'experimental/google.com/%s/angle/traces'
 DEPS_PATH = '../../../DEPS'
 DEPS_START = '# === ANGLE Restricted Trace Generated Code Start ==='
 DEPS_END = '# === ANGLE Restricted Trace Generated Code End ==='
@@ -177,7 +176,7 @@
     angledata_files = glob.glob('%s/%s*angledata.gz' % (trace, trace))
     assert len(angledata_files) == 1, "Trace '%s' has %d angledata.gz files" % (
         trace, len(angledata_files))
-    return angledata_files[0]
+    return angledata_files[0].replace('\\', '/')
 
 
 def gen_gni(traces, gni_file, format_args):
@@ -188,8 +187,15 @@
         with open('%s/%s_capture_context%s_files.txt' % (trace, trace, context)) as f:
             files = f.readlines()
             f.close()
-        files = ['"%s/%s"' % (trace, file.strip()) for file in files]
-        test_list += ['["%s", %s, [%s], "%s"]' % (trace, context, ','.join(files), angledata_file)]
+        source_files = ['"%s/%s"' % (trace, file.strip()) for file in files]
+        data_files = ['"%s"' % angledata_file]
+        json_file_name = '%s/%s.json' % (trace, trace)
+        if os.path.exists(json_file_name):
+            data_files.append('"%s"' % json_file_name)
+        test_list += [
+            '["%s", %s, [%s], [%s]]' %
+            (trace, context, ','.join(source_files), ','.join(data_files))
+        ]
 
     format_args['test_list'] = ',\n'.join(test_list)
     gni_data = GNI_TEMPLATE.format(**format_args)
@@ -198,32 +204,63 @@
     return True
 
 
-def contains_context_version(trace):
-    """Determines if the trace contains the major/minor context version"""
+def contains_string(trace, string):
+    """Determines if the trace contains a string"""
     for file in os.listdir(trace):
         if fnmatch.fnmatch(file, '*.h'):
             with open(os.path.join(trace, file)) as f:
-                if 'kReplayContextClientMajorVersion' in f.read():
+                if string in f.read():
                     return True
     return False
 
 
+def contains_context_version(trace):
+    """Determines if the trace contains the major/minor context version"""
+    return contains_string(trace, 'kReplayContextClientMajorVersion')
+
+
+def contains_colorspace(trace):
+    """Determines if the trace contains an EGL surface color space"""
+    return contains_string(trace, 'kReplayDrawSurfaceColorSpace')
+
+
+def json_metadata_exists(trace):
+    return os.path.isfile('%s/%s.json' % (trace, trace))
+
+
 def get_trace_info(trace):
+    # Skip getting trace info if we're using JSON metadata.
+    # TODO: Remove generated code. http://anglebug.com/5133
+    if json_metadata_exists(trace):
+        return ''
+
     # Some traces don't contain major/minor version, so use defaults
-    info = []
-    defaults = ''
+    info = [f'"{trace}"']
     if contains_context_version(trace):
-        info += ["%s::kReplayContextClientMajorVersion", "%s::kReplayContextClientMinorVersion"]
+        info += [
+            f'{trace}::kReplayContextClientMajorVersion',
+            f'{trace}::kReplayContextClientMinorVersion'
+        ]
     else:
-        defaults = "kDefaultReplayContextClientMajorVersion, kDefaultReplayContextClientMinorVersion,"
+        info += [
+            'kDefaultReplayContextClientMajorVersion', 'kDefaultReplayContextClientMinorVersion'
+        ]
 
     info += [
-        "%s::kReplayFrameStart", "%s::kReplayFrameEnd", "%s::kReplayDrawSurfaceWidth",
-        "%s::kReplayDrawSurfaceHeight", "\"%s\""
+        f'{trace}::kReplayFrameStart', f'{trace}::kReplayFrameEnd',
+        f'{trace}::kReplayDrawSurfaceWidth', f'{trace}::kReplayDrawSurfaceHeight'
     ]
 
-    merged_info = defaults + ", ".join([element % trace for element in info])
-    return merged_info
+    if contains_colorspace(trace):
+        info += [f'{trace}::kReplayDrawSurfaceColorSpace']
+    else:
+        info += ['kDefaultReplayDrawSurfaceColorSpace']
+
+    # Add placeholder fields to fix an MSVC warning.
+    info += ['0'] * 8
+    info += ['false'] * 5
+
+    return ", ".join(info)
 
 
 def get_context(trace):
@@ -241,16 +278,16 @@
             while file[start - 1].isdigit():
                 start -= 1
             context = file[start:end]
-            assert context.isnumeric(), "Failed to find trace context number"
+            assert context.isnumeric(), 'Failed to find trace context number'
             return context
 
 
 def get_header_name(trace):
-    return "%s/%s_capture_context%s.h" % (trace, trace, get_context(trace))
+    return '%s/%s_capture_context%s.h' % (trace, trace, get_context(trace))
 
 
 def get_source_name(trace):
-    return "%s/%s_capture_context%s.cpp" % (trace, trace, get_context(trace))
+    return '%s/%s_capture_context%s.cpp' % (trace, trace, get_context(trace))
 
 
 def gen_header(header_file, format_args):
@@ -283,7 +320,12 @@
     # Generate substitution string
     replacement = ""
     for (trace, version) in trace_pairs:
-        sub = {'trace': trace, 'version': version, 'trace_prefix': CIPD_TRACE_PREFIX}
+        if 'x' in version:
+            version = version.strip('x')
+            trace_prefix = EXPERIMENTAL_CIPD_PREFIX % getpass.getuser()
+        else:
+            trace_prefix = CIPD_TRACE_PREFIX
+        sub = {'trace': trace, 'version': version, 'trace_prefix': trace_prefix}
         replacement += DEPS_TEMPLATE.format(**sub)
 
     # Update DEPS to download CIPD dependencies
@@ -342,23 +384,21 @@
         return 0
 
     format_args = {
-        "script_name": os.path.basename(__file__),
-        "data_source_name": json_file,
+        'script_name': os.path.basename(__file__),
+        'data_source_name': json_file,
     }
 
     if not gen_gni(traces, gni_file, format_args):
         print('.gni file generation failed.')
         return 1
 
-    includes = ["#include \"%s\"" % get_header_name(trace) for trace in traces]
-    trace_infos = [
-        "{RestrictedTraceID::%s, {%s}}" % (trace, get_trace_info(trace)) for trace in traces
-    ]
+    includes = ['#include "%s"' % get_header_name(trace) for trace in traces]
+    trace_infos = ['{"%s", {%s}}' % (trace, get_trace_info(trace)) for trace in traces]
 
-    format_args["filename"] = "restricted_traces_autogen"
-    format_args["trace_ids"] = ",\n".join(traces)
-    format_args["trace_includes"] = "\n".join(includes)
-    format_args["trace_infos"] = ",\n".join(trace_infos)
+    format_args['filename'] = 'restricted_traces_autogen'
+    format_args['num_traces'] = len(trace_infos)
+    format_args['trace_includes'] = '\n'.join(includes)
+    format_args['trace_infos'] = ',\n'.join(trace_infos)
     if not gen_header(header_file, format_args):
         print('.h file generation failed.')
         return 1
diff --git a/src/tests/restricted_traces/restricted_trace_gold_tests.py b/src/tests/restricted_traces/restricted_trace_gold_tests.py
index 54202dd..35be554 100755
--- a/src/tests/restricted_traces/restricted_trace_gold_tests.py
+++ b/src/tests/restricted_traces/restricted_trace_gold_tests.py
@@ -34,13 +34,15 @@
 import time
 import traceback
 
-from skia_gold import angle_skia_gold_properties
-from skia_gold import angle_skia_gold_session_manager
-
 # Add //src/testing into sys.path for importing xvfb and test_env, and
 # //src/testing/scripts for importing common.
 d = os.path.dirname
 THIS_DIR = d(os.path.abspath(__file__))
+sys.path.insert(0, d(THIS_DIR))
+
+from skia_gold import angle_skia_gold_properties
+from skia_gold import angle_skia_gold_session_manager
+
 ANGLE_SRC_DIR = d(d(d(THIS_DIR)))
 sys.path.insert(0, os.path.join(ANGLE_SRC_DIR, 'testing'))
 sys.path.insert(0, os.path.join(ANGLE_SRC_DIR, 'testing', 'scripts'))
@@ -302,7 +304,9 @@
             logging.error('Failed to get triage link for %s, raw output: %s', image_name, error)
             logging.error('Reason for no triage link: %s',
                           gold_session.GetTriageLinkOmissionReason(image_name))
-        elif gold_properties.IsTryjobRun():
+        if gold_properties.IsTryjobRun():
+            # Pick "show all results" so we can see the tryjob images by default.
+            triage_link += '&master=true'
             artifacts['triage_link_for_entire_cl'] = [triage_link]
         else:
             artifacts['gold_triage_link'] = [triage_link]
diff --git a/src/tests/restricted_traces/restricted_traces.json b/src/tests/restricted_traces/restricted_traces.json
index 1ae5ab9..69bb1d2 100644
--- a/src/tests/restricted_traces/restricted_traces.json
+++ b/src/tests/restricted_traces/restricted_traces.json
@@ -16,6 +16,7 @@
     "avakin_life 1",
     "aztec_ruins 1",
     "beach_buggy_racing 1",
+    "blockman_go 1",
     "brawl_stars 1",
     "bricks_breaker_quest 1",
     "bubble_shooter 1",
@@ -42,6 +43,7 @@
     "farm_heroes_saga 1",
     "fate_grand_order 1",
     "fifa_mobile 1",
+    "final_fantasy 1",
     "free_fire 1",
     "gardenscapes 1",
     "genshin_impact 2",
@@ -73,7 +75,9 @@
     "plants_vs_zombies_2 1",
     "pokemon_go 1",
     "professional_baseball_spirits 1",
+    "pubg_mobile_battle_royale 1",
     "pubg_mobile_lite 1",
+    "pubg_mobile_skydive 1",
     "ragnarok_m_eternal_love 1",
     "raid_shadow_legends 1",
     "real_commando_secret_mission 1",
@@ -84,10 +88,12 @@
     "rope_hero_vice_town 1",
     "saint_seiya_awakening 1",
     "sakura_school_simulator 1",
+    "scrabble_go 1",
     "shadow_fight_2 1",
     "slingshot_test1 1",
     "slingshot_test2 1",
     "sniper_3d 1",
+    "sonic_the_hedgehog 1",
     "standoff_2 1",
     "subway_princess_runner 1",
     "subway_surfers 1",
@@ -99,6 +105,9 @@
     "township 1",
     "trex_200 1",
     "whatsapp 1",
+    "words_with_friends_2 1",
+    "wordscapes 1",
+    "world_of_kings 1",
     "world_of_tanks_blitz 1",
     "world_war_doh 1",
     "worms_zone_io 1"
diff --git a/src/tests/restricted_traces/restricted_traces_autogen.cpp b/src/tests/restricted_traces/restricted_traces_autogen.cpp
index 4191a94..214fe35 100644
--- a/src/tests/restricted_traces/restricted_traces_autogen.cpp
+++ b/src/tests/restricted_traces/restricted_traces_autogen.cpp
@@ -20,6 +20,7 @@
 #include "avakin_life/avakin_life_capture_context1.h"
 #include "aztec_ruins/aztec_ruins_capture_context1.h"
 #include "beach_buggy_racing/beach_buggy_racing_capture_context1.h"
+#include "blockman_go/blockman_go_capture_context2.h"
 #include "brawl_stars/brawl_stars_capture_context1.h"
 #include "bricks_breaker_quest/bricks_breaker_quest_capture_context2.h"
 #include "bubble_shooter/bubble_shooter_capture_context5.h"
@@ -46,6 +47,7 @@
 #include "farm_heroes_saga/farm_heroes_saga_capture_context2.h"
 #include "fate_grand_order/fate_grand_order_capture_context1.h"
 #include "fifa_mobile/fifa_mobile_capture_context1.h"
+#include "final_fantasy/final_fantasy_capture_context3.h"
 #include "free_fire/free_fire_capture_context1.h"
 #include "gardenscapes/gardenscapes_capture_context1.h"
 #include "genshin_impact/genshin_impact_capture_context3.h"
@@ -77,7 +79,9 @@
 #include "plants_vs_zombies_2/plants_vs_zombies_2_capture_context1.h"
 #include "pokemon_go/pokemon_go_capture_context2.h"
 #include "professional_baseball_spirits/professional_baseball_spirits_capture_context1.h"
+#include "pubg_mobile_battle_royale/pubg_mobile_battle_royale_capture_context6.h"
 #include "pubg_mobile_lite/pubg_mobile_lite_capture_context1.h"
+#include "pubg_mobile_skydive/pubg_mobile_skydive_capture_context6.h"
 #include "ragnarok_m_eternal_love/ragnarok_m_eternal_love_capture_context1.h"
 #include "raid_shadow_legends/raid_shadow_legends_capture_context1.h"
 #include "real_commando_secret_mission/real_commando_secret_mission_capture_context1.h"
@@ -88,10 +92,12 @@
 #include "rope_hero_vice_town/rope_hero_vice_town_capture_context1.h"
 #include "saint_seiya_awakening/saint_seiya_awakening_capture_context1.h"
 #include "sakura_school_simulator/sakura_school_simulator_capture_context2.h"
+#include "scrabble_go/scrabble_go_capture_context2.h"
 #include "shadow_fight_2/shadow_fight_2_capture_context1.h"
 #include "slingshot_test1/slingshot_test1_capture_context2.h"
 #include "slingshot_test2/slingshot_test2_capture_context2.h"
 #include "sniper_3d/sniper_3d_capture_context1.h"
+#include "sonic_the_hedgehog/sonic_the_hedgehog_capture_context2.h"
 #include "standoff_2/standoff_2_capture_context1.h"
 #include "subway_princess_runner/subway_princess_runner_capture_context2.h"
 #include "subway_surfers/subway_surfers_capture_context1.h"
@@ -103,480 +109,2303 @@
 #include "township/township_capture_context2.h"
 #include "trex_200/trex_200_capture_context1.h"
 #include "whatsapp/whatsapp_capture_context1.h"
+#include "words_with_friends_2/words_with_friends_2_capture_context1.h"
+#include "wordscapes/wordscapes_capture_context3.h"
+#include "world_of_kings/world_of_kings_capture_context3.h"
 #include "world_of_tanks_blitz/world_of_tanks_blitz_capture_context1.h"
 #include "world_war_doh/world_war_doh_capture_context1.h"
 #include "worms_zone_io/worms_zone_io_capture_context1.h"
 
-namespace angle
+namespace trace_angle
 {
 namespace
 {
-constexpr angle::PackedEnumMap<RestrictedTraceID, TraceInfo> kTraceInfos = {
-    {RestrictedTraceID::aliexpress,
-     {aliexpress::kReplayContextClientMajorVersion, aliexpress::kReplayContextClientMinorVersion,
-      aliexpress::kReplayFrameStart, aliexpress::kReplayFrameEnd,
-      aliexpress::kReplayDrawSurfaceWidth, aliexpress::kReplayDrawSurfaceHeight, "aliexpress"}},
-    {RestrictedTraceID::among_us,
-     {among_us::kReplayContextClientMajorVersion, among_us::kReplayContextClientMinorVersion,
-      among_us::kReplayFrameStart, among_us::kReplayFrameEnd, among_us::kReplayDrawSurfaceWidth,
-      among_us::kReplayDrawSurfaceHeight, "among_us"}},
-    {RestrictedTraceID::angry_birds_2_1500,
-     {angry_birds_2_1500::kReplayContextClientMajorVersion,
-      angry_birds_2_1500::kReplayContextClientMinorVersion, angry_birds_2_1500::kReplayFrameStart,
-      angry_birds_2_1500::kReplayFrameEnd, angry_birds_2_1500::kReplayDrawSurfaceWidth,
-      angry_birds_2_1500::kReplayDrawSurfaceHeight, "angry_birds_2_1500"}},
-    {RestrictedTraceID::arena_of_valor,
-     {arena_of_valor::kReplayContextClientMajorVersion,
-      arena_of_valor::kReplayContextClientMinorVersion, arena_of_valor::kReplayFrameStart,
-      arena_of_valor::kReplayFrameEnd, arena_of_valor::kReplayDrawSurfaceWidth,
-      arena_of_valor::kReplayDrawSurfaceHeight, "arena_of_valor"}},
-    {RestrictedTraceID::asphalt_8,
-     {asphalt_8::kReplayContextClientMajorVersion, asphalt_8::kReplayContextClientMinorVersion,
-      asphalt_8::kReplayFrameStart, asphalt_8::kReplayFrameEnd, asphalt_8::kReplayDrawSurfaceWidth,
-      asphalt_8::kReplayDrawSurfaceHeight, "asphalt_8"}},
-    {RestrictedTraceID::avakin_life,
-     {avakin_life::kReplayContextClientMajorVersion, avakin_life::kReplayContextClientMinorVersion,
-      avakin_life::kReplayFrameStart, avakin_life::kReplayFrameEnd,
-      avakin_life::kReplayDrawSurfaceWidth, avakin_life::kReplayDrawSurfaceHeight, "avakin_life"}},
-    {RestrictedTraceID::aztec_ruins,
-     {aztec_ruins::kReplayContextClientMajorVersion, aztec_ruins::kReplayContextClientMinorVersion,
-      aztec_ruins::kReplayFrameStart, aztec_ruins::kReplayFrameEnd,
-      aztec_ruins::kReplayDrawSurfaceWidth, aztec_ruins::kReplayDrawSurfaceHeight, "aztec_ruins"}},
-    {RestrictedTraceID::beach_buggy_racing,
-     {beach_buggy_racing::kReplayContextClientMajorVersion,
-      beach_buggy_racing::kReplayContextClientMinorVersion, beach_buggy_racing::kReplayFrameStart,
-      beach_buggy_racing::kReplayFrameEnd, beach_buggy_racing::kReplayDrawSurfaceWidth,
-      beach_buggy_racing::kReplayDrawSurfaceHeight, "beach_buggy_racing"}},
-    {RestrictedTraceID::brawl_stars,
-     {brawl_stars::kReplayContextClientMajorVersion, brawl_stars::kReplayContextClientMinorVersion,
-      brawl_stars::kReplayFrameStart, brawl_stars::kReplayFrameEnd,
-      brawl_stars::kReplayDrawSurfaceWidth, brawl_stars::kReplayDrawSurfaceHeight, "brawl_stars"}},
-    {RestrictedTraceID::bricks_breaker_quest,
-     {bricks_breaker_quest::kReplayContextClientMajorVersion,
+constexpr size_t kNumTraces = 103;
+struct TracePair
+{
+    const char name[kTraceInfoMaxNameLen];
+    TraceInfo info;
+};
+constexpr TracePair kTraceInfos[kNumTraces] = {
+    {"aliexpress",
+     {"aliexpress",
+      aliexpress::kReplayContextClientMajorVersion,
+      aliexpress::kReplayContextClientMinorVersion,
+      aliexpress::kReplayFrameStart,
+      aliexpress::kReplayFrameEnd,
+      aliexpress::kReplayDrawSurfaceWidth,
+      aliexpress::kReplayDrawSurfaceHeight,
+      kDefaultReplayDrawSurfaceColorSpace,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      false,
+      false,
+      false,
+      false,
+      false}},
+    {"among_us",
+     {"among_us",
+      among_us::kReplayContextClientMajorVersion,
+      among_us::kReplayContextClientMinorVersion,
+      among_us::kReplayFrameStart,
+      among_us::kReplayFrameEnd,
+      among_us::kReplayDrawSurfaceWidth,
+      among_us::kReplayDrawSurfaceHeight,
+      kDefaultReplayDrawSurfaceColorSpace,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      false,
+      false,
+      false,
+      false,
+      false}},
+    {"angry_birds_2_1500",
+     {"angry_birds_2_1500",
+      angry_birds_2_1500::kReplayContextClientMajorVersion,
+      angry_birds_2_1500::kReplayContextClientMinorVersion,
+      angry_birds_2_1500::kReplayFrameStart,
+      angry_birds_2_1500::kReplayFrameEnd,
+      angry_birds_2_1500::kReplayDrawSurfaceWidth,
+      angry_birds_2_1500::kReplayDrawSurfaceHeight,
+      kDefaultReplayDrawSurfaceColorSpace,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      false,
+      false,
+      false,
+      false,
+      false}},
+    {"arena_of_valor",
+     {"arena_of_valor",
+      arena_of_valor::kReplayContextClientMajorVersion,
+      arena_of_valor::kReplayContextClientMinorVersion,
+      arena_of_valor::kReplayFrameStart,
+      arena_of_valor::kReplayFrameEnd,
+      arena_of_valor::kReplayDrawSurfaceWidth,
+      arena_of_valor::kReplayDrawSurfaceHeight,
+      kDefaultReplayDrawSurfaceColorSpace,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      false,
+      false,
+      false,
+      false,
+      false}},
+    {"asphalt_8",
+     {"asphalt_8",
+      asphalt_8::kReplayContextClientMajorVersion,
+      asphalt_8::kReplayContextClientMinorVersion,
+      asphalt_8::kReplayFrameStart,
+      asphalt_8::kReplayFrameEnd,
+      asphalt_8::kReplayDrawSurfaceWidth,
+      asphalt_8::kReplayDrawSurfaceHeight,
+      kDefaultReplayDrawSurfaceColorSpace,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      false,
+      false,
+      false,
+      false,
+      false}},
+    {"avakin_life",
+     {"avakin_life",
+      avakin_life::kReplayContextClientMajorVersion,
+      avakin_life::kReplayContextClientMinorVersion,
+      avakin_life::kReplayFrameStart,
+      avakin_life::kReplayFrameEnd,
+      avakin_life::kReplayDrawSurfaceWidth,
+      avakin_life::kReplayDrawSurfaceHeight,
+      kDefaultReplayDrawSurfaceColorSpace,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      false,
+      false,
+      false,
+      false,
+      false}},
+    {"aztec_ruins",
+     {"aztec_ruins",
+      aztec_ruins::kReplayContextClientMajorVersion,
+      aztec_ruins::kReplayContextClientMinorVersion,
+      aztec_ruins::kReplayFrameStart,
+      aztec_ruins::kReplayFrameEnd,
+      aztec_ruins::kReplayDrawSurfaceWidth,
+      aztec_ruins::kReplayDrawSurfaceHeight,
+      kDefaultReplayDrawSurfaceColorSpace,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      false,
+      false,
+      false,
+      false,
+      false}},
+    {"beach_buggy_racing",
+     {"beach_buggy_racing",
+      beach_buggy_racing::kReplayContextClientMajorVersion,
+      beach_buggy_racing::kReplayContextClientMinorVersion,
+      beach_buggy_racing::kReplayFrameStart,
+      beach_buggy_racing::kReplayFrameEnd,
+      beach_buggy_racing::kReplayDrawSurfaceWidth,
+      beach_buggy_racing::kReplayDrawSurfaceHeight,
+      kDefaultReplayDrawSurfaceColorSpace,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      false,
+      false,
+      false,
+      false,
+      false}},
+    {"blockman_go",
+     {"blockman_go",
+      blockman_go::kReplayContextClientMajorVersion,
+      blockman_go::kReplayContextClientMinorVersion,
+      blockman_go::kReplayFrameStart,
+      blockman_go::kReplayFrameEnd,
+      blockman_go::kReplayDrawSurfaceWidth,
+      blockman_go::kReplayDrawSurfaceHeight,
+      blockman_go::kReplayDrawSurfaceColorSpace,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      false,
+      false,
+      false,
+      false,
+      false}},
+    {"brawl_stars",
+     {"brawl_stars",
+      brawl_stars::kReplayContextClientMajorVersion,
+      brawl_stars::kReplayContextClientMinorVersion,
+      brawl_stars::kReplayFrameStart,
+      brawl_stars::kReplayFrameEnd,
+      brawl_stars::kReplayDrawSurfaceWidth,
+      brawl_stars::kReplayDrawSurfaceHeight,
+      kDefaultReplayDrawSurfaceColorSpace,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      false,
+      false,
+      false,
+      false,
+      false}},
+    {"bricks_breaker_quest",
+     {"bricks_breaker_quest",
+      bricks_breaker_quest::kReplayContextClientMajorVersion,
       bricks_breaker_quest::kReplayContextClientMinorVersion,
-      bricks_breaker_quest::kReplayFrameStart, bricks_breaker_quest::kReplayFrameEnd,
-      bricks_breaker_quest::kReplayDrawSurfaceWidth, bricks_breaker_quest::kReplayDrawSurfaceHeight,
-      "bricks_breaker_quest"}},
-    {RestrictedTraceID::bubble_shooter,
-     {bubble_shooter::kReplayContextClientMajorVersion,
-      bubble_shooter::kReplayContextClientMinorVersion, bubble_shooter::kReplayFrameStart,
-      bubble_shooter::kReplayFrameEnd, bubble_shooter::kReplayDrawSurfaceWidth,
-      bubble_shooter::kReplayDrawSurfaceHeight, "bubble_shooter"}},
-    {RestrictedTraceID::bus_simulator_indonesia,
-     {bus_simulator_indonesia::kReplayContextClientMajorVersion,
+      bricks_breaker_quest::kReplayFrameStart,
+      bricks_breaker_quest::kReplayFrameEnd,
+      bricks_breaker_quest::kReplayDrawSurfaceWidth,
+      bricks_breaker_quest::kReplayDrawSurfaceHeight,
+      kDefaultReplayDrawSurfaceColorSpace,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      false,
+      false,
+      false,
+      false,
+      false}},
+    {"bubble_shooter",
+     {"bubble_shooter",
+      bubble_shooter::kReplayContextClientMajorVersion,
+      bubble_shooter::kReplayContextClientMinorVersion,
+      bubble_shooter::kReplayFrameStart,
+      bubble_shooter::kReplayFrameEnd,
+      bubble_shooter::kReplayDrawSurfaceWidth,
+      bubble_shooter::kReplayDrawSurfaceHeight,
+      kDefaultReplayDrawSurfaceColorSpace,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      false,
+      false,
+      false,
+      false,
+      false}},
+    {"bus_simulator_indonesia",
+     {"bus_simulator_indonesia",
+      bus_simulator_indonesia::kReplayContextClientMajorVersion,
       bus_simulator_indonesia::kReplayContextClientMinorVersion,
-      bus_simulator_indonesia::kReplayFrameStart, bus_simulator_indonesia::kReplayFrameEnd,
+      bus_simulator_indonesia::kReplayFrameStart,
+      bus_simulator_indonesia::kReplayFrameEnd,
       bus_simulator_indonesia::kReplayDrawSurfaceWidth,
-      bus_simulator_indonesia::kReplayDrawSurfaceHeight, "bus_simulator_indonesia"}},
-    {RestrictedTraceID::call_break_offline_card_game,
-     {call_break_offline_card_game::kReplayContextClientMajorVersion,
+      bus_simulator_indonesia::kReplayDrawSurfaceHeight,
+      kDefaultReplayDrawSurfaceColorSpace,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      false,
+      false,
+      false,
+      false,
+      false}},
+    {"call_break_offline_card_game",
+     {"call_break_offline_card_game",
+      call_break_offline_card_game::kReplayContextClientMajorVersion,
       call_break_offline_card_game::kReplayContextClientMinorVersion,
       call_break_offline_card_game::kReplayFrameStart,
       call_break_offline_card_game::kReplayFrameEnd,
       call_break_offline_card_game::kReplayDrawSurfaceWidth,
-      call_break_offline_card_game::kReplayDrawSurfaceHeight, "call_break_offline_card_game"}},
-    {RestrictedTraceID::candy_crush_500,
-     {candy_crush_500::kReplayContextClientMajorVersion,
-      candy_crush_500::kReplayContextClientMinorVersion, candy_crush_500::kReplayFrameStart,
-      candy_crush_500::kReplayFrameEnd, candy_crush_500::kReplayDrawSurfaceWidth,
-      candy_crush_500::kReplayDrawSurfaceHeight, "candy_crush_500"}},
-    {RestrictedTraceID::candy_crush_soda_saga,
-     {candy_crush_soda_saga::kReplayContextClientMajorVersion,
+      call_break_offline_card_game::kReplayDrawSurfaceHeight,
+      kDefaultReplayDrawSurfaceColorSpace,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      false,
+      false,
+      false,
+      false,
+      false}},
+    {"candy_crush_500",
+     {"candy_crush_500",
+      candy_crush_500::kReplayContextClientMajorVersion,
+      candy_crush_500::kReplayContextClientMinorVersion,
+      candy_crush_500::kReplayFrameStart,
+      candy_crush_500::kReplayFrameEnd,
+      candy_crush_500::kReplayDrawSurfaceWidth,
+      candy_crush_500::kReplayDrawSurfaceHeight,
+      kDefaultReplayDrawSurfaceColorSpace,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      false,
+      false,
+      false,
+      false,
+      false}},
+    {"candy_crush_soda_saga",
+     {"candy_crush_soda_saga",
+      candy_crush_soda_saga::kReplayContextClientMajorVersion,
       candy_crush_soda_saga::kReplayContextClientMinorVersion,
-      candy_crush_soda_saga::kReplayFrameStart, candy_crush_soda_saga::kReplayFrameEnd,
+      candy_crush_soda_saga::kReplayFrameStart,
+      candy_crush_soda_saga::kReplayFrameEnd,
       candy_crush_soda_saga::kReplayDrawSurfaceWidth,
-      candy_crush_soda_saga::kReplayDrawSurfaceHeight, "candy_crush_soda_saga"}},
-    {RestrictedTraceID::car_parking_multiplayer,
-     {car_parking_multiplayer::kReplayContextClientMajorVersion,
+      candy_crush_soda_saga::kReplayDrawSurfaceHeight,
+      kDefaultReplayDrawSurfaceColorSpace,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      false,
+      false,
+      false,
+      false,
+      false}},
+    {"car_parking_multiplayer",
+     {"car_parking_multiplayer",
+      car_parking_multiplayer::kReplayContextClientMajorVersion,
       car_parking_multiplayer::kReplayContextClientMinorVersion,
-      car_parking_multiplayer::kReplayFrameStart, car_parking_multiplayer::kReplayFrameEnd,
+      car_parking_multiplayer::kReplayFrameStart,
+      car_parking_multiplayer::kReplayFrameEnd,
       car_parking_multiplayer::kReplayDrawSurfaceWidth,
-      car_parking_multiplayer::kReplayDrawSurfaceHeight, "car_parking_multiplayer"}},
-    {RestrictedTraceID::clash_of_clans,
-     {clash_of_clans::kReplayContextClientMajorVersion,
-      clash_of_clans::kReplayContextClientMinorVersion, clash_of_clans::kReplayFrameStart,
-      clash_of_clans::kReplayFrameEnd, clash_of_clans::kReplayDrawSurfaceWidth,
-      clash_of_clans::kReplayDrawSurfaceHeight, "clash_of_clans"}},
-    {RestrictedTraceID::clash_royale,
-     {clash_royale::kReplayContextClientMajorVersion,
-      clash_royale::kReplayContextClientMinorVersion, clash_royale::kReplayFrameStart,
-      clash_royale::kReplayFrameEnd, clash_royale::kReplayDrawSurfaceWidth,
-      clash_royale::kReplayDrawSurfaceHeight, "clash_royale"}},
-    {RestrictedTraceID::cod_mobile,
-     {cod_mobile::kReplayContextClientMajorVersion, cod_mobile::kReplayContextClientMinorVersion,
-      cod_mobile::kReplayFrameStart, cod_mobile::kReplayFrameEnd,
-      cod_mobile::kReplayDrawSurfaceWidth, cod_mobile::kReplayDrawSurfaceHeight, "cod_mobile"}},
-    {RestrictedTraceID::coin_master,
-     {coin_master::kReplayContextClientMajorVersion, coin_master::kReplayContextClientMinorVersion,
-      coin_master::kReplayFrameStart, coin_master::kReplayFrameEnd,
-      coin_master::kReplayDrawSurfaceWidth, coin_master::kReplayDrawSurfaceHeight, "coin_master"}},
-    {RestrictedTraceID::command_and_conquer_rivals,
-     {command_and_conquer_rivals::kReplayContextClientMajorVersion,
+      car_parking_multiplayer::kReplayDrawSurfaceHeight,
+      kDefaultReplayDrawSurfaceColorSpace,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      false,
+      false,
+      false,
+      false,
+      false}},
+    {"clash_of_clans",
+     {"clash_of_clans",
+      clash_of_clans::kReplayContextClientMajorVersion,
+      clash_of_clans::kReplayContextClientMinorVersion,
+      clash_of_clans::kReplayFrameStart,
+      clash_of_clans::kReplayFrameEnd,
+      clash_of_clans::kReplayDrawSurfaceWidth,
+      clash_of_clans::kReplayDrawSurfaceHeight,
+      kDefaultReplayDrawSurfaceColorSpace,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      false,
+      false,
+      false,
+      false,
+      false}},
+    {"clash_royale",
+     {"clash_royale",
+      clash_royale::kReplayContextClientMajorVersion,
+      clash_royale::kReplayContextClientMinorVersion,
+      clash_royale::kReplayFrameStart,
+      clash_royale::kReplayFrameEnd,
+      clash_royale::kReplayDrawSurfaceWidth,
+      clash_royale::kReplayDrawSurfaceHeight,
+      kDefaultReplayDrawSurfaceColorSpace,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      false,
+      false,
+      false,
+      false,
+      false}},
+    {"cod_mobile",
+     {"cod_mobile",
+      cod_mobile::kReplayContextClientMajorVersion,
+      cod_mobile::kReplayContextClientMinorVersion,
+      cod_mobile::kReplayFrameStart,
+      cod_mobile::kReplayFrameEnd,
+      cod_mobile::kReplayDrawSurfaceWidth,
+      cod_mobile::kReplayDrawSurfaceHeight,
+      kDefaultReplayDrawSurfaceColorSpace,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      false,
+      false,
+      false,
+      false,
+      false}},
+    {"coin_master",
+     {"coin_master",
+      coin_master::kReplayContextClientMajorVersion,
+      coin_master::kReplayContextClientMinorVersion,
+      coin_master::kReplayFrameStart,
+      coin_master::kReplayFrameEnd,
+      coin_master::kReplayDrawSurfaceWidth,
+      coin_master::kReplayDrawSurfaceHeight,
+      kDefaultReplayDrawSurfaceColorSpace,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      false,
+      false,
+      false,
+      false,
+      false}},
+    {"command_and_conquer_rivals",
+     {"command_and_conquer_rivals",
+      command_and_conquer_rivals::kReplayContextClientMajorVersion,
       command_and_conquer_rivals::kReplayContextClientMinorVersion,
-      command_and_conquer_rivals::kReplayFrameStart, command_and_conquer_rivals::kReplayFrameEnd,
+      command_and_conquer_rivals::kReplayFrameStart,
+      command_and_conquer_rivals::kReplayFrameEnd,
       command_and_conquer_rivals::kReplayDrawSurfaceWidth,
-      command_and_conquer_rivals::kReplayDrawSurfaceHeight, "command_and_conquer_rivals"}},
-    {RestrictedTraceID::cookie_run_kingdom,
-     {cookie_run_kingdom::kReplayContextClientMajorVersion,
-      cookie_run_kingdom::kReplayContextClientMinorVersion, cookie_run_kingdom::kReplayFrameStart,
-      cookie_run_kingdom::kReplayFrameEnd, cookie_run_kingdom::kReplayDrawSurfaceWidth,
-      cookie_run_kingdom::kReplayDrawSurfaceHeight, "cookie_run_kingdom"}},
-    {RestrictedTraceID::disney_tsum_tsum,
-     {disney_tsum_tsum::kReplayContextClientMajorVersion,
-      disney_tsum_tsum::kReplayContextClientMinorVersion, disney_tsum_tsum::kReplayFrameStart,
-      disney_tsum_tsum::kReplayFrameEnd, disney_tsum_tsum::kReplayDrawSurfaceWidth,
-      disney_tsum_tsum::kReplayDrawSurfaceHeight, "disney_tsum_tsum"}},
-    {RestrictedTraceID::dr_driving,
-     {dr_driving::kReplayContextClientMajorVersion, dr_driving::kReplayContextClientMinorVersion,
-      dr_driving::kReplayFrameStart, dr_driving::kReplayFrameEnd,
-      dr_driving::kReplayDrawSurfaceWidth, dr_driving::kReplayDrawSurfaceHeight, "dr_driving"}},
-    {RestrictedTraceID::dragon_ball_legends,
-     {dragon_ball_legends::kReplayContextClientMajorVersion,
-      dragon_ball_legends::kReplayContextClientMinorVersion, dragon_ball_legends::kReplayFrameStart,
-      dragon_ball_legends::kReplayFrameEnd, dragon_ball_legends::kReplayDrawSurfaceWidth,
-      dragon_ball_legends::kReplayDrawSurfaceHeight, "dragon_ball_legends"}},
-    {RestrictedTraceID::dragon_raja,
-     {dragon_raja::kReplayContextClientMajorVersion, dragon_raja::kReplayContextClientMinorVersion,
-      dragon_raja::kReplayFrameStart, dragon_raja::kReplayFrameEnd,
-      dragon_raja::kReplayDrawSurfaceWidth, dragon_raja::kReplayDrawSurfaceHeight, "dragon_raja"}},
-    {RestrictedTraceID::efootball_pes_2021,
-     {efootball_pes_2021::kReplayContextClientMajorVersion,
-      efootball_pes_2021::kReplayContextClientMinorVersion, efootball_pes_2021::kReplayFrameStart,
-      efootball_pes_2021::kReplayFrameEnd, efootball_pes_2021::kReplayDrawSurfaceWidth,
-      efootball_pes_2021::kReplayDrawSurfaceHeight, "efootball_pes_2021"}},
-    {RestrictedTraceID::egypt_1500,
-     {egypt_1500::kReplayContextClientMajorVersion, egypt_1500::kReplayContextClientMinorVersion,
-      egypt_1500::kReplayFrameStart, egypt_1500::kReplayFrameEnd,
-      egypt_1500::kReplayDrawSurfaceWidth, egypt_1500::kReplayDrawSurfaceHeight, "egypt_1500"}},
-    {RestrictedTraceID::eight_ball_pool,
-     {eight_ball_pool::kReplayContextClientMajorVersion,
-      eight_ball_pool::kReplayContextClientMinorVersion, eight_ball_pool::kReplayFrameStart,
-      eight_ball_pool::kReplayFrameEnd, eight_ball_pool::kReplayDrawSurfaceWidth,
-      eight_ball_pool::kReplayDrawSurfaceHeight, "eight_ball_pool"}},
-    {RestrictedTraceID::extreme_car_driving_simulator,
-     {extreme_car_driving_simulator::kReplayContextClientMajorVersion,
+      command_and_conquer_rivals::kReplayDrawSurfaceHeight,
+      kDefaultReplayDrawSurfaceColorSpace,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      false,
+      false,
+      false,
+      false,
+      false}},
+    {"cookie_run_kingdom",
+     {"cookie_run_kingdom",
+      cookie_run_kingdom::kReplayContextClientMajorVersion,
+      cookie_run_kingdom::kReplayContextClientMinorVersion,
+      cookie_run_kingdom::kReplayFrameStart,
+      cookie_run_kingdom::kReplayFrameEnd,
+      cookie_run_kingdom::kReplayDrawSurfaceWidth,
+      cookie_run_kingdom::kReplayDrawSurfaceHeight,
+      kDefaultReplayDrawSurfaceColorSpace,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      false,
+      false,
+      false,
+      false,
+      false}},
+    {"disney_tsum_tsum",
+     {"disney_tsum_tsum",
+      disney_tsum_tsum::kReplayContextClientMajorVersion,
+      disney_tsum_tsum::kReplayContextClientMinorVersion,
+      disney_tsum_tsum::kReplayFrameStart,
+      disney_tsum_tsum::kReplayFrameEnd,
+      disney_tsum_tsum::kReplayDrawSurfaceWidth,
+      disney_tsum_tsum::kReplayDrawSurfaceHeight,
+      kDefaultReplayDrawSurfaceColorSpace,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      false,
+      false,
+      false,
+      false,
+      false}},
+    {"dr_driving",
+     {"dr_driving",
+      dr_driving::kReplayContextClientMajorVersion,
+      dr_driving::kReplayContextClientMinorVersion,
+      dr_driving::kReplayFrameStart,
+      dr_driving::kReplayFrameEnd,
+      dr_driving::kReplayDrawSurfaceWidth,
+      dr_driving::kReplayDrawSurfaceHeight,
+      kDefaultReplayDrawSurfaceColorSpace,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      false,
+      false,
+      false,
+      false,
+      false}},
+    {"dragon_ball_legends",
+     {"dragon_ball_legends",
+      dragon_ball_legends::kReplayContextClientMajorVersion,
+      dragon_ball_legends::kReplayContextClientMinorVersion,
+      dragon_ball_legends::kReplayFrameStart,
+      dragon_ball_legends::kReplayFrameEnd,
+      dragon_ball_legends::kReplayDrawSurfaceWidth,
+      dragon_ball_legends::kReplayDrawSurfaceHeight,
+      kDefaultReplayDrawSurfaceColorSpace,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      false,
+      false,
+      false,
+      false,
+      false}},
+    {"dragon_raja",
+     {"dragon_raja",
+      dragon_raja::kReplayContextClientMajorVersion,
+      dragon_raja::kReplayContextClientMinorVersion,
+      dragon_raja::kReplayFrameStart,
+      dragon_raja::kReplayFrameEnd,
+      dragon_raja::kReplayDrawSurfaceWidth,
+      dragon_raja::kReplayDrawSurfaceHeight,
+      kDefaultReplayDrawSurfaceColorSpace,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      false,
+      false,
+      false,
+      false,
+      false}},
+    {"efootball_pes_2021",
+     {"efootball_pes_2021",
+      efootball_pes_2021::kReplayContextClientMajorVersion,
+      efootball_pes_2021::kReplayContextClientMinorVersion,
+      efootball_pes_2021::kReplayFrameStart,
+      efootball_pes_2021::kReplayFrameEnd,
+      efootball_pes_2021::kReplayDrawSurfaceWidth,
+      efootball_pes_2021::kReplayDrawSurfaceHeight,
+      kDefaultReplayDrawSurfaceColorSpace,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      false,
+      false,
+      false,
+      false,
+      false}},
+    {"egypt_1500",
+     {"egypt_1500",
+      egypt_1500::kReplayContextClientMajorVersion,
+      egypt_1500::kReplayContextClientMinorVersion,
+      egypt_1500::kReplayFrameStart,
+      egypt_1500::kReplayFrameEnd,
+      egypt_1500::kReplayDrawSurfaceWidth,
+      egypt_1500::kReplayDrawSurfaceHeight,
+      kDefaultReplayDrawSurfaceColorSpace,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      false,
+      false,
+      false,
+      false,
+      false}},
+    {"eight_ball_pool",
+     {"eight_ball_pool",
+      eight_ball_pool::kReplayContextClientMajorVersion,
+      eight_ball_pool::kReplayContextClientMinorVersion,
+      eight_ball_pool::kReplayFrameStart,
+      eight_ball_pool::kReplayFrameEnd,
+      eight_ball_pool::kReplayDrawSurfaceWidth,
+      eight_ball_pool::kReplayDrawSurfaceHeight,
+      kDefaultReplayDrawSurfaceColorSpace,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      false,
+      false,
+      false,
+      false,
+      false}},
+    {"extreme_car_driving_simulator",
+     {"extreme_car_driving_simulator",
+      extreme_car_driving_simulator::kReplayContextClientMajorVersion,
       extreme_car_driving_simulator::kReplayContextClientMinorVersion,
       extreme_car_driving_simulator::kReplayFrameStart,
       extreme_car_driving_simulator::kReplayFrameEnd,
       extreme_car_driving_simulator::kReplayDrawSurfaceWidth,
-      extreme_car_driving_simulator::kReplayDrawSurfaceHeight, "extreme_car_driving_simulator"}},
-    {RestrictedTraceID::fallout_shelter_online,
-     {fallout_shelter_online::kReplayContextClientMajorVersion,
+      extreme_car_driving_simulator::kReplayDrawSurfaceHeight,
+      kDefaultReplayDrawSurfaceColorSpace,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      false,
+      false,
+      false,
+      false,
+      false}},
+    {"fallout_shelter_online",
+     {"fallout_shelter_online",
+      fallout_shelter_online::kReplayContextClientMajorVersion,
       fallout_shelter_online::kReplayContextClientMinorVersion,
-      fallout_shelter_online::kReplayFrameStart, fallout_shelter_online::kReplayFrameEnd,
+      fallout_shelter_online::kReplayFrameStart,
+      fallout_shelter_online::kReplayFrameEnd,
       fallout_shelter_online::kReplayDrawSurfaceWidth,
-      fallout_shelter_online::kReplayDrawSurfaceHeight, "fallout_shelter_online"}},
-    {RestrictedTraceID::farm_heroes_saga,
-     {farm_heroes_saga::kReplayContextClientMajorVersion,
-      farm_heroes_saga::kReplayContextClientMinorVersion, farm_heroes_saga::kReplayFrameStart,
-      farm_heroes_saga::kReplayFrameEnd, farm_heroes_saga::kReplayDrawSurfaceWidth,
-      farm_heroes_saga::kReplayDrawSurfaceHeight, "farm_heroes_saga"}},
-    {RestrictedTraceID::fate_grand_order,
-     {fate_grand_order::kReplayContextClientMajorVersion,
-      fate_grand_order::kReplayContextClientMinorVersion, fate_grand_order::kReplayFrameStart,
-      fate_grand_order::kReplayFrameEnd, fate_grand_order::kReplayDrawSurfaceWidth,
-      fate_grand_order::kReplayDrawSurfaceHeight, "fate_grand_order"}},
-    {RestrictedTraceID::fifa_mobile,
-     {fifa_mobile::kReplayContextClientMajorVersion, fifa_mobile::kReplayContextClientMinorVersion,
-      fifa_mobile::kReplayFrameStart, fifa_mobile::kReplayFrameEnd,
-      fifa_mobile::kReplayDrawSurfaceWidth, fifa_mobile::kReplayDrawSurfaceHeight, "fifa_mobile"}},
-    {RestrictedTraceID::free_fire,
-     {free_fire::kReplayContextClientMajorVersion, free_fire::kReplayContextClientMinorVersion,
-      free_fire::kReplayFrameStart, free_fire::kReplayFrameEnd, free_fire::kReplayDrawSurfaceWidth,
-      free_fire::kReplayDrawSurfaceHeight, "free_fire"}},
-    {RestrictedTraceID::gardenscapes,
-     {gardenscapes::kReplayContextClientMajorVersion,
-      gardenscapes::kReplayContextClientMinorVersion, gardenscapes::kReplayFrameStart,
-      gardenscapes::kReplayFrameEnd, gardenscapes::kReplayDrawSurfaceWidth,
-      gardenscapes::kReplayDrawSurfaceHeight, "gardenscapes"}},
-    {RestrictedTraceID::genshin_impact,
-     {genshin_impact::kReplayContextClientMajorVersion,
-      genshin_impact::kReplayContextClientMinorVersion, genshin_impact::kReplayFrameStart,
-      genshin_impact::kReplayFrameEnd, genshin_impact::kReplayDrawSurfaceWidth,
-      genshin_impact::kReplayDrawSurfaceHeight, "genshin_impact"}},
-    {RestrictedTraceID::google_maps,
-     {google_maps::kReplayContextClientMajorVersion, google_maps::kReplayContextClientMinorVersion,
-      google_maps::kReplayFrameStart, google_maps::kReplayFrameEnd,
-      google_maps::kReplayDrawSurfaceWidth, google_maps::kReplayDrawSurfaceHeight, "google_maps"}},
-    {RestrictedTraceID::happy_color,
-     {happy_color::kReplayContextClientMajorVersion, happy_color::kReplayContextClientMinorVersion,
-      happy_color::kReplayFrameStart, happy_color::kReplayFrameEnd,
-      happy_color::kReplayDrawSurfaceWidth, happy_color::kReplayDrawSurfaceHeight, "happy_color"}},
-    {RestrictedTraceID::hay_day,
-     {hay_day::kReplayContextClientMajorVersion, hay_day::kReplayContextClientMinorVersion,
-      hay_day::kReplayFrameStart, hay_day::kReplayFrameEnd, hay_day::kReplayDrawSurfaceWidth,
-      hay_day::kReplayDrawSurfaceHeight, "hay_day"}},
-    {RestrictedTraceID::hearthstone,
-     {hearthstone::kReplayContextClientMajorVersion, hearthstone::kReplayContextClientMinorVersion,
-      hearthstone::kReplayFrameStart, hearthstone::kReplayFrameEnd,
-      hearthstone::kReplayDrawSurfaceWidth, hearthstone::kReplayDrawSurfaceHeight, "hearthstone"}},
-    {RestrictedTraceID::higgs_domino_island,
-     {higgs_domino_island::kReplayContextClientMajorVersion,
-      higgs_domino_island::kReplayContextClientMinorVersion, higgs_domino_island::kReplayFrameStart,
-      higgs_domino_island::kReplayFrameEnd, higgs_domino_island::kReplayDrawSurfaceWidth,
-      higgs_domino_island::kReplayDrawSurfaceHeight, "higgs_domino_island"}},
-    {RestrictedTraceID::hill_climb_racing,
-     {hill_climb_racing::kReplayContextClientMajorVersion,
-      hill_climb_racing::kReplayContextClientMinorVersion, hill_climb_racing::kReplayFrameStart,
-      hill_climb_racing::kReplayFrameEnd, hill_climb_racing::kReplayDrawSurfaceWidth,
-      hill_climb_racing::kReplayDrawSurfaceHeight, "hill_climb_racing"}},
-    {RestrictedTraceID::homescapes,
-     {homescapes::kReplayContextClientMajorVersion, homescapes::kReplayContextClientMinorVersion,
-      homescapes::kReplayFrameStart, homescapes::kReplayFrameEnd,
-      homescapes::kReplayDrawSurfaceWidth, homescapes::kReplayDrawSurfaceHeight, "homescapes"}},
-    {RestrictedTraceID::idle_heroes,
-     {idle_heroes::kReplayContextClientMajorVersion, idle_heroes::kReplayContextClientMinorVersion,
-      idle_heroes::kReplayFrameStart, idle_heroes::kReplayFrameEnd,
-      idle_heroes::kReplayDrawSurfaceWidth, idle_heroes::kReplayDrawSurfaceHeight, "idle_heroes"}},
-    {RestrictedTraceID::junes_journey,
-     {junes_journey::kReplayContextClientMajorVersion,
-      junes_journey::kReplayContextClientMinorVersion, junes_journey::kReplayFrameStart,
-      junes_journey::kReplayFrameEnd, junes_journey::kReplayDrawSurfaceWidth,
-      junes_journey::kReplayDrawSurfaceHeight, "junes_journey"}},
-    {RestrictedTraceID::kartrider_rush,
-     {kartrider_rush::kReplayContextClientMajorVersion,
-      kartrider_rush::kReplayContextClientMinorVersion, kartrider_rush::kReplayFrameStart,
-      kartrider_rush::kReplayFrameEnd, kartrider_rush::kReplayDrawSurfaceWidth,
-      kartrider_rush::kReplayDrawSurfaceHeight, "kartrider_rush"}},
-    {RestrictedTraceID::klondike_adventures,
-     {klondike_adventures::kReplayContextClientMajorVersion,
-      klondike_adventures::kReplayContextClientMinorVersion, klondike_adventures::kReplayFrameStart,
-      klondike_adventures::kReplayFrameEnd, klondike_adventures::kReplayDrawSurfaceWidth,
-      klondike_adventures::kReplayDrawSurfaceHeight, "klondike_adventures"}},
-    {RestrictedTraceID::league_of_legends_wild_rift,
-     {league_of_legends_wild_rift::kReplayContextClientMajorVersion,
+      fallout_shelter_online::kReplayDrawSurfaceHeight,
+      kDefaultReplayDrawSurfaceColorSpace,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      false,
+      false,
+      false,
+      false,
+      false}},
+    {"farm_heroes_saga",
+     {"farm_heroes_saga",
+      farm_heroes_saga::kReplayContextClientMajorVersion,
+      farm_heroes_saga::kReplayContextClientMinorVersion,
+      farm_heroes_saga::kReplayFrameStart,
+      farm_heroes_saga::kReplayFrameEnd,
+      farm_heroes_saga::kReplayDrawSurfaceWidth,
+      farm_heroes_saga::kReplayDrawSurfaceHeight,
+      kDefaultReplayDrawSurfaceColorSpace,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      false,
+      false,
+      false,
+      false,
+      false}},
+    {"fate_grand_order",
+     {"fate_grand_order",
+      fate_grand_order::kReplayContextClientMajorVersion,
+      fate_grand_order::kReplayContextClientMinorVersion,
+      fate_grand_order::kReplayFrameStart,
+      fate_grand_order::kReplayFrameEnd,
+      fate_grand_order::kReplayDrawSurfaceWidth,
+      fate_grand_order::kReplayDrawSurfaceHeight,
+      kDefaultReplayDrawSurfaceColorSpace,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      false,
+      false,
+      false,
+      false,
+      false}},
+    {"fifa_mobile",
+     {"fifa_mobile",
+      fifa_mobile::kReplayContextClientMajorVersion,
+      fifa_mobile::kReplayContextClientMinorVersion,
+      fifa_mobile::kReplayFrameStart,
+      fifa_mobile::kReplayFrameEnd,
+      fifa_mobile::kReplayDrawSurfaceWidth,
+      fifa_mobile::kReplayDrawSurfaceHeight,
+      kDefaultReplayDrawSurfaceColorSpace,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      false,
+      false,
+      false,
+      false,
+      false}},
+    {"final_fantasy",
+     {"final_fantasy",
+      final_fantasy::kReplayContextClientMajorVersion,
+      final_fantasy::kReplayContextClientMinorVersion,
+      final_fantasy::kReplayFrameStart,
+      final_fantasy::kReplayFrameEnd,
+      final_fantasy::kReplayDrawSurfaceWidth,
+      final_fantasy::kReplayDrawSurfaceHeight,
+      final_fantasy::kReplayDrawSurfaceColorSpace,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      false,
+      false,
+      false,
+      false,
+      false}},
+    {"free_fire",
+     {"free_fire",
+      free_fire::kReplayContextClientMajorVersion,
+      free_fire::kReplayContextClientMinorVersion,
+      free_fire::kReplayFrameStart,
+      free_fire::kReplayFrameEnd,
+      free_fire::kReplayDrawSurfaceWidth,
+      free_fire::kReplayDrawSurfaceHeight,
+      kDefaultReplayDrawSurfaceColorSpace,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      false,
+      false,
+      false,
+      false,
+      false}},
+    {"gardenscapes",
+     {"gardenscapes",
+      gardenscapes::kReplayContextClientMajorVersion,
+      gardenscapes::kReplayContextClientMinorVersion,
+      gardenscapes::kReplayFrameStart,
+      gardenscapes::kReplayFrameEnd,
+      gardenscapes::kReplayDrawSurfaceWidth,
+      gardenscapes::kReplayDrawSurfaceHeight,
+      kDefaultReplayDrawSurfaceColorSpace,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      false,
+      false,
+      false,
+      false,
+      false}},
+    {"genshin_impact",
+     {"genshin_impact",
+      genshin_impact::kReplayContextClientMajorVersion,
+      genshin_impact::kReplayContextClientMinorVersion,
+      genshin_impact::kReplayFrameStart,
+      genshin_impact::kReplayFrameEnd,
+      genshin_impact::kReplayDrawSurfaceWidth,
+      genshin_impact::kReplayDrawSurfaceHeight,
+      kDefaultReplayDrawSurfaceColorSpace,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      false,
+      false,
+      false,
+      false,
+      false}},
+    {"google_maps",
+     {"google_maps",
+      google_maps::kReplayContextClientMajorVersion,
+      google_maps::kReplayContextClientMinorVersion,
+      google_maps::kReplayFrameStart,
+      google_maps::kReplayFrameEnd,
+      google_maps::kReplayDrawSurfaceWidth,
+      google_maps::kReplayDrawSurfaceHeight,
+      kDefaultReplayDrawSurfaceColorSpace,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      false,
+      false,
+      false,
+      false,
+      false}},
+    {"happy_color",
+     {"happy_color",
+      happy_color::kReplayContextClientMajorVersion,
+      happy_color::kReplayContextClientMinorVersion,
+      happy_color::kReplayFrameStart,
+      happy_color::kReplayFrameEnd,
+      happy_color::kReplayDrawSurfaceWidth,
+      happy_color::kReplayDrawSurfaceHeight,
+      kDefaultReplayDrawSurfaceColorSpace,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      false,
+      false,
+      false,
+      false,
+      false}},
+    {"hay_day",
+     {"hay_day",
+      hay_day::kReplayContextClientMajorVersion,
+      hay_day::kReplayContextClientMinorVersion,
+      hay_day::kReplayFrameStart,
+      hay_day::kReplayFrameEnd,
+      hay_day::kReplayDrawSurfaceWidth,
+      hay_day::kReplayDrawSurfaceHeight,
+      kDefaultReplayDrawSurfaceColorSpace,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      false,
+      false,
+      false,
+      false,
+      false}},
+    {"hearthstone",
+     {"hearthstone",
+      hearthstone::kReplayContextClientMajorVersion,
+      hearthstone::kReplayContextClientMinorVersion,
+      hearthstone::kReplayFrameStart,
+      hearthstone::kReplayFrameEnd,
+      hearthstone::kReplayDrawSurfaceWidth,
+      hearthstone::kReplayDrawSurfaceHeight,
+      kDefaultReplayDrawSurfaceColorSpace,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      false,
+      false,
+      false,
+      false,
+      false}},
+    {"higgs_domino_island",
+     {"higgs_domino_island",
+      higgs_domino_island::kReplayContextClientMajorVersion,
+      higgs_domino_island::kReplayContextClientMinorVersion,
+      higgs_domino_island::kReplayFrameStart,
+      higgs_domino_island::kReplayFrameEnd,
+      higgs_domino_island::kReplayDrawSurfaceWidth,
+      higgs_domino_island::kReplayDrawSurfaceHeight,
+      kDefaultReplayDrawSurfaceColorSpace,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      false,
+      false,
+      false,
+      false,
+      false}},
+    {"hill_climb_racing",
+     {"hill_climb_racing",
+      hill_climb_racing::kReplayContextClientMajorVersion,
+      hill_climb_racing::kReplayContextClientMinorVersion,
+      hill_climb_racing::kReplayFrameStart,
+      hill_climb_racing::kReplayFrameEnd,
+      hill_climb_racing::kReplayDrawSurfaceWidth,
+      hill_climb_racing::kReplayDrawSurfaceHeight,
+      kDefaultReplayDrawSurfaceColorSpace,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      false,
+      false,
+      false,
+      false,
+      false}},
+    {"homescapes",
+     {"homescapes",
+      homescapes::kReplayContextClientMajorVersion,
+      homescapes::kReplayContextClientMinorVersion,
+      homescapes::kReplayFrameStart,
+      homescapes::kReplayFrameEnd,
+      homescapes::kReplayDrawSurfaceWidth,
+      homescapes::kReplayDrawSurfaceHeight,
+      kDefaultReplayDrawSurfaceColorSpace,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      false,
+      false,
+      false,
+      false,
+      false}},
+    {"idle_heroes",
+     {"idle_heroes",
+      idle_heroes::kReplayContextClientMajorVersion,
+      idle_heroes::kReplayContextClientMinorVersion,
+      idle_heroes::kReplayFrameStart,
+      idle_heroes::kReplayFrameEnd,
+      idle_heroes::kReplayDrawSurfaceWidth,
+      idle_heroes::kReplayDrawSurfaceHeight,
+      kDefaultReplayDrawSurfaceColorSpace,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      false,
+      false,
+      false,
+      false,
+      false}},
+    {"junes_journey",
+     {"junes_journey",
+      junes_journey::kReplayContextClientMajorVersion,
+      junes_journey::kReplayContextClientMinorVersion,
+      junes_journey::kReplayFrameStart,
+      junes_journey::kReplayFrameEnd,
+      junes_journey::kReplayDrawSurfaceWidth,
+      junes_journey::kReplayDrawSurfaceHeight,
+      kDefaultReplayDrawSurfaceColorSpace,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      false,
+      false,
+      false,
+      false,
+      false}},
+    {"kartrider_rush",
+     {"kartrider_rush",
+      kartrider_rush::kReplayContextClientMajorVersion,
+      kartrider_rush::kReplayContextClientMinorVersion,
+      kartrider_rush::kReplayFrameStart,
+      kartrider_rush::kReplayFrameEnd,
+      kartrider_rush::kReplayDrawSurfaceWidth,
+      kartrider_rush::kReplayDrawSurfaceHeight,
+      kDefaultReplayDrawSurfaceColorSpace,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      false,
+      false,
+      false,
+      false,
+      false}},
+    {"klondike_adventures",
+     {"klondike_adventures",
+      klondike_adventures::kReplayContextClientMajorVersion,
+      klondike_adventures::kReplayContextClientMinorVersion,
+      klondike_adventures::kReplayFrameStart,
+      klondike_adventures::kReplayFrameEnd,
+      klondike_adventures::kReplayDrawSurfaceWidth,
+      klondike_adventures::kReplayDrawSurfaceHeight,
+      kDefaultReplayDrawSurfaceColorSpace,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      false,
+      false,
+      false,
+      false,
+      false}},
+    {"league_of_legends_wild_rift",
+     {"league_of_legends_wild_rift",
+      league_of_legends_wild_rift::kReplayContextClientMajorVersion,
       league_of_legends_wild_rift::kReplayContextClientMinorVersion,
-      league_of_legends_wild_rift::kReplayFrameStart, league_of_legends_wild_rift::kReplayFrameEnd,
+      league_of_legends_wild_rift::kReplayFrameStart,
+      league_of_legends_wild_rift::kReplayFrameEnd,
       league_of_legends_wild_rift::kReplayDrawSurfaceWidth,
-      league_of_legends_wild_rift::kReplayDrawSurfaceHeight, "league_of_legends_wild_rift"}},
-    {RestrictedTraceID::lego_legacy,
-     {lego_legacy::kReplayContextClientMajorVersion, lego_legacy::kReplayContextClientMinorVersion,
-      lego_legacy::kReplayFrameStart, lego_legacy::kReplayFrameEnd,
-      lego_legacy::kReplayDrawSurfaceWidth, lego_legacy::kReplayDrawSurfaceHeight, "lego_legacy"}},
-    {RestrictedTraceID::lineage_m,
-     {lineage_m::kReplayContextClientMajorVersion, lineage_m::kReplayContextClientMinorVersion,
-      lineage_m::kReplayFrameStart, lineage_m::kReplayFrameEnd, lineage_m::kReplayDrawSurfaceWidth,
-      lineage_m::kReplayDrawSurfaceHeight, "lineage_m"}},
-    {RestrictedTraceID::ludo_king,
-     {ludo_king::kReplayContextClientMajorVersion, ludo_king::kReplayContextClientMinorVersion,
-      ludo_king::kReplayFrameStart, ludo_king::kReplayFrameEnd, ludo_king::kReplayDrawSurfaceWidth,
-      ludo_king::kReplayDrawSurfaceHeight, "ludo_king"}},
-    {RestrictedTraceID::magic_tiles_3,
-     {magic_tiles_3::kReplayContextClientMajorVersion,
-      magic_tiles_3::kReplayContextClientMinorVersion, magic_tiles_3::kReplayFrameStart,
-      magic_tiles_3::kReplayFrameEnd, magic_tiles_3::kReplayDrawSurfaceWidth,
-      magic_tiles_3::kReplayDrawSurfaceHeight, "magic_tiles_3"}},
-    {RestrictedTraceID::manhattan_10,
-     {manhattan_10::kReplayContextClientMajorVersion,
-      manhattan_10::kReplayContextClientMinorVersion, manhattan_10::kReplayFrameStart,
-      manhattan_10::kReplayFrameEnd, manhattan_10::kReplayDrawSurfaceWidth,
-      manhattan_10::kReplayDrawSurfaceHeight, "manhattan_10"}},
-    {RestrictedTraceID::manhattan_31,
-     {manhattan_31::kReplayContextClientMajorVersion,
-      manhattan_31::kReplayContextClientMinorVersion, manhattan_31::kReplayFrameStart,
-      manhattan_31::kReplayFrameEnd, manhattan_31::kReplayDrawSurfaceWidth,
-      manhattan_31::kReplayDrawSurfaceHeight, "manhattan_31"}},
-    {RestrictedTraceID::mario_kart_tour,
-     {mario_kart_tour::kReplayContextClientMajorVersion,
-      mario_kart_tour::kReplayContextClientMinorVersion, mario_kart_tour::kReplayFrameStart,
-      mario_kart_tour::kReplayFrameEnd, mario_kart_tour::kReplayDrawSurfaceWidth,
-      mario_kart_tour::kReplayDrawSurfaceHeight, "mario_kart_tour"}},
-    {RestrictedTraceID::marvel_contest_of_champions,
-     {marvel_contest_of_champions::kReplayContextClientMajorVersion,
+      league_of_legends_wild_rift::kReplayDrawSurfaceHeight,
+      kDefaultReplayDrawSurfaceColorSpace,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      false,
+      false,
+      false,
+      false,
+      false}},
+    {"lego_legacy",
+     {"lego_legacy",
+      lego_legacy::kReplayContextClientMajorVersion,
+      lego_legacy::kReplayContextClientMinorVersion,
+      lego_legacy::kReplayFrameStart,
+      lego_legacy::kReplayFrameEnd,
+      lego_legacy::kReplayDrawSurfaceWidth,
+      lego_legacy::kReplayDrawSurfaceHeight,
+      kDefaultReplayDrawSurfaceColorSpace,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      false,
+      false,
+      false,
+      false,
+      false}},
+    {"lineage_m",
+     {"lineage_m",
+      lineage_m::kReplayContextClientMajorVersion,
+      lineage_m::kReplayContextClientMinorVersion,
+      lineage_m::kReplayFrameStart,
+      lineage_m::kReplayFrameEnd,
+      lineage_m::kReplayDrawSurfaceWidth,
+      lineage_m::kReplayDrawSurfaceHeight,
+      kDefaultReplayDrawSurfaceColorSpace,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      false,
+      false,
+      false,
+      false,
+      false}},
+    {"ludo_king",
+     {"ludo_king",
+      ludo_king::kReplayContextClientMajorVersion,
+      ludo_king::kReplayContextClientMinorVersion,
+      ludo_king::kReplayFrameStart,
+      ludo_king::kReplayFrameEnd,
+      ludo_king::kReplayDrawSurfaceWidth,
+      ludo_king::kReplayDrawSurfaceHeight,
+      kDefaultReplayDrawSurfaceColorSpace,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      false,
+      false,
+      false,
+      false,
+      false}},
+    {"magic_tiles_3",
+     {"magic_tiles_3",
+      magic_tiles_3::kReplayContextClientMajorVersion,
+      magic_tiles_3::kReplayContextClientMinorVersion,
+      magic_tiles_3::kReplayFrameStart,
+      magic_tiles_3::kReplayFrameEnd,
+      magic_tiles_3::kReplayDrawSurfaceWidth,
+      magic_tiles_3::kReplayDrawSurfaceHeight,
+      kDefaultReplayDrawSurfaceColorSpace,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      false,
+      false,
+      false,
+      false,
+      false}},
+    {"manhattan_10",
+     {"manhattan_10",
+      manhattan_10::kReplayContextClientMajorVersion,
+      manhattan_10::kReplayContextClientMinorVersion,
+      manhattan_10::kReplayFrameStart,
+      manhattan_10::kReplayFrameEnd,
+      manhattan_10::kReplayDrawSurfaceWidth,
+      manhattan_10::kReplayDrawSurfaceHeight,
+      kDefaultReplayDrawSurfaceColorSpace,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      false,
+      false,
+      false,
+      false,
+      false}},
+    {"manhattan_31",
+     {"manhattan_31",
+      manhattan_31::kReplayContextClientMajorVersion,
+      manhattan_31::kReplayContextClientMinorVersion,
+      manhattan_31::kReplayFrameStart,
+      manhattan_31::kReplayFrameEnd,
+      manhattan_31::kReplayDrawSurfaceWidth,
+      manhattan_31::kReplayDrawSurfaceHeight,
+      kDefaultReplayDrawSurfaceColorSpace,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      false,
+      false,
+      false,
+      false,
+      false}},
+    {"mario_kart_tour",
+     {"mario_kart_tour",
+      mario_kart_tour::kReplayContextClientMajorVersion,
+      mario_kart_tour::kReplayContextClientMinorVersion,
+      mario_kart_tour::kReplayFrameStart,
+      mario_kart_tour::kReplayFrameEnd,
+      mario_kart_tour::kReplayDrawSurfaceWidth,
+      mario_kart_tour::kReplayDrawSurfaceHeight,
+      kDefaultReplayDrawSurfaceColorSpace,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      false,
+      false,
+      false,
+      false,
+      false}},
+    {"marvel_contest_of_champions",
+     {"marvel_contest_of_champions",
+      marvel_contest_of_champions::kReplayContextClientMajorVersion,
       marvel_contest_of_champions::kReplayContextClientMinorVersion,
-      marvel_contest_of_champions::kReplayFrameStart, marvel_contest_of_champions::kReplayFrameEnd,
+      marvel_contest_of_champions::kReplayFrameStart,
+      marvel_contest_of_champions::kReplayFrameEnd,
       marvel_contest_of_champions::kReplayDrawSurfaceWidth,
-      marvel_contest_of_champions::kReplayDrawSurfaceHeight, "marvel_contest_of_champions"}},
-    {RestrictedTraceID::messenger_lite,
-     {messenger_lite::kReplayContextClientMajorVersion,
-      messenger_lite::kReplayContextClientMinorVersion, messenger_lite::kReplayFrameStart,
-      messenger_lite::kReplayFrameEnd, messenger_lite::kReplayDrawSurfaceWidth,
-      messenger_lite::kReplayDrawSurfaceHeight, "messenger_lite"}},
-    {RestrictedTraceID::minecraft,
-     {minecraft::kReplayContextClientMajorVersion, minecraft::kReplayContextClientMinorVersion,
-      minecraft::kReplayFrameStart, minecraft::kReplayFrameEnd, minecraft::kReplayDrawSurfaceWidth,
-      minecraft::kReplayDrawSurfaceHeight, "minecraft"}},
-    {RestrictedTraceID::mobile_legends,
-     {mobile_legends::kReplayContextClientMajorVersion,
-      mobile_legends::kReplayContextClientMinorVersion, mobile_legends::kReplayFrameStart,
-      mobile_legends::kReplayFrameEnd, mobile_legends::kReplayDrawSurfaceWidth,
-      mobile_legends::kReplayDrawSurfaceHeight, "mobile_legends"}},
-    {RestrictedTraceID::nba2k20_800,
-     {nba2k20_800::kReplayContextClientMajorVersion, nba2k20_800::kReplayContextClientMinorVersion,
-      nba2k20_800::kReplayFrameStart, nba2k20_800::kReplayFrameEnd,
-      nba2k20_800::kReplayDrawSurfaceWidth, nba2k20_800::kReplayDrawSurfaceHeight, "nba2k20_800"}},
-    {RestrictedTraceID::one_punch_man,
-     {one_punch_man::kReplayContextClientMajorVersion,
-      one_punch_man::kReplayContextClientMinorVersion, one_punch_man::kReplayFrameStart,
-      one_punch_man::kReplayFrameEnd, one_punch_man::kReplayDrawSurfaceWidth,
-      one_punch_man::kReplayDrawSurfaceHeight, "one_punch_man"}},
-    {RestrictedTraceID::plants_vs_zombies_2,
-     {plants_vs_zombies_2::kReplayContextClientMajorVersion,
-      plants_vs_zombies_2::kReplayContextClientMinorVersion, plants_vs_zombies_2::kReplayFrameStart,
-      plants_vs_zombies_2::kReplayFrameEnd, plants_vs_zombies_2::kReplayDrawSurfaceWidth,
-      plants_vs_zombies_2::kReplayDrawSurfaceHeight, "plants_vs_zombies_2"}},
-    {RestrictedTraceID::pokemon_go,
-     {pokemon_go::kReplayContextClientMajorVersion, pokemon_go::kReplayContextClientMinorVersion,
-      pokemon_go::kReplayFrameStart, pokemon_go::kReplayFrameEnd,
-      pokemon_go::kReplayDrawSurfaceWidth, pokemon_go::kReplayDrawSurfaceHeight, "pokemon_go"}},
-    {RestrictedTraceID::professional_baseball_spirits,
-     {professional_baseball_spirits::kReplayContextClientMajorVersion,
+      marvel_contest_of_champions::kReplayDrawSurfaceHeight,
+      kDefaultReplayDrawSurfaceColorSpace,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      false,
+      false,
+      false,
+      false,
+      false}},
+    {"messenger_lite",
+     {"messenger_lite",
+      messenger_lite::kReplayContextClientMajorVersion,
+      messenger_lite::kReplayContextClientMinorVersion,
+      messenger_lite::kReplayFrameStart,
+      messenger_lite::kReplayFrameEnd,
+      messenger_lite::kReplayDrawSurfaceWidth,
+      messenger_lite::kReplayDrawSurfaceHeight,
+      kDefaultReplayDrawSurfaceColorSpace,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      false,
+      false,
+      false,
+      false,
+      false}},
+    {"minecraft",
+     {"minecraft",
+      minecraft::kReplayContextClientMajorVersion,
+      minecraft::kReplayContextClientMinorVersion,
+      minecraft::kReplayFrameStart,
+      minecraft::kReplayFrameEnd,
+      minecraft::kReplayDrawSurfaceWidth,
+      minecraft::kReplayDrawSurfaceHeight,
+      kDefaultReplayDrawSurfaceColorSpace,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      false,
+      false,
+      false,
+      false,
+      false}},
+    {"mobile_legends",
+     {"mobile_legends",
+      mobile_legends::kReplayContextClientMajorVersion,
+      mobile_legends::kReplayContextClientMinorVersion,
+      mobile_legends::kReplayFrameStart,
+      mobile_legends::kReplayFrameEnd,
+      mobile_legends::kReplayDrawSurfaceWidth,
+      mobile_legends::kReplayDrawSurfaceHeight,
+      kDefaultReplayDrawSurfaceColorSpace,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      false,
+      false,
+      false,
+      false,
+      false}},
+    {"nba2k20_800",
+     {"nba2k20_800",
+      nba2k20_800::kReplayContextClientMajorVersion,
+      nba2k20_800::kReplayContextClientMinorVersion,
+      nba2k20_800::kReplayFrameStart,
+      nba2k20_800::kReplayFrameEnd,
+      nba2k20_800::kReplayDrawSurfaceWidth,
+      nba2k20_800::kReplayDrawSurfaceHeight,
+      kDefaultReplayDrawSurfaceColorSpace,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      false,
+      false,
+      false,
+      false,
+      false}},
+    {"one_punch_man",
+     {"one_punch_man",
+      one_punch_man::kReplayContextClientMajorVersion,
+      one_punch_man::kReplayContextClientMinorVersion,
+      one_punch_man::kReplayFrameStart,
+      one_punch_man::kReplayFrameEnd,
+      one_punch_man::kReplayDrawSurfaceWidth,
+      one_punch_man::kReplayDrawSurfaceHeight,
+      kDefaultReplayDrawSurfaceColorSpace,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      false,
+      false,
+      false,
+      false,
+      false}},
+    {"plants_vs_zombies_2",
+     {"plants_vs_zombies_2",
+      plants_vs_zombies_2::kReplayContextClientMajorVersion,
+      plants_vs_zombies_2::kReplayContextClientMinorVersion,
+      plants_vs_zombies_2::kReplayFrameStart,
+      plants_vs_zombies_2::kReplayFrameEnd,
+      plants_vs_zombies_2::kReplayDrawSurfaceWidth,
+      plants_vs_zombies_2::kReplayDrawSurfaceHeight,
+      kDefaultReplayDrawSurfaceColorSpace,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      false,
+      false,
+      false,
+      false,
+      false}},
+    {"pokemon_go",
+     {"pokemon_go",
+      pokemon_go::kReplayContextClientMajorVersion,
+      pokemon_go::kReplayContextClientMinorVersion,
+      pokemon_go::kReplayFrameStart,
+      pokemon_go::kReplayFrameEnd,
+      pokemon_go::kReplayDrawSurfaceWidth,
+      pokemon_go::kReplayDrawSurfaceHeight,
+      kDefaultReplayDrawSurfaceColorSpace,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      false,
+      false,
+      false,
+      false,
+      false}},
+    {"professional_baseball_spirits",
+     {"professional_baseball_spirits",
+      professional_baseball_spirits::kReplayContextClientMajorVersion,
       professional_baseball_spirits::kReplayContextClientMinorVersion,
       professional_baseball_spirits::kReplayFrameStart,
       professional_baseball_spirits::kReplayFrameEnd,
       professional_baseball_spirits::kReplayDrawSurfaceWidth,
-      professional_baseball_spirits::kReplayDrawSurfaceHeight, "professional_baseball_spirits"}},
-    {RestrictedTraceID::pubg_mobile_lite,
-     {pubg_mobile_lite::kReplayContextClientMajorVersion,
-      pubg_mobile_lite::kReplayContextClientMinorVersion, pubg_mobile_lite::kReplayFrameStart,
-      pubg_mobile_lite::kReplayFrameEnd, pubg_mobile_lite::kReplayDrawSurfaceWidth,
-      pubg_mobile_lite::kReplayDrawSurfaceHeight, "pubg_mobile_lite"}},
-    {RestrictedTraceID::ragnarok_m_eternal_love,
-     {ragnarok_m_eternal_love::kReplayContextClientMajorVersion,
+      professional_baseball_spirits::kReplayDrawSurfaceHeight,
+      kDefaultReplayDrawSurfaceColorSpace,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      false,
+      false,
+      false,
+      false,
+      false}},
+    {"pubg_mobile_battle_royale",
+     {"pubg_mobile_battle_royale",
+      pubg_mobile_battle_royale::kReplayContextClientMajorVersion,
+      pubg_mobile_battle_royale::kReplayContextClientMinorVersion,
+      pubg_mobile_battle_royale::kReplayFrameStart,
+      pubg_mobile_battle_royale::kReplayFrameEnd,
+      pubg_mobile_battle_royale::kReplayDrawSurfaceWidth,
+      pubg_mobile_battle_royale::kReplayDrawSurfaceHeight,
+      pubg_mobile_battle_royale::kReplayDrawSurfaceColorSpace,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      false,
+      false,
+      false,
+      false,
+      false}},
+    {"pubg_mobile_lite",
+     {"pubg_mobile_lite",
+      pubg_mobile_lite::kReplayContextClientMajorVersion,
+      pubg_mobile_lite::kReplayContextClientMinorVersion,
+      pubg_mobile_lite::kReplayFrameStart,
+      pubg_mobile_lite::kReplayFrameEnd,
+      pubg_mobile_lite::kReplayDrawSurfaceWidth,
+      pubg_mobile_lite::kReplayDrawSurfaceHeight,
+      kDefaultReplayDrawSurfaceColorSpace,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      false,
+      false,
+      false,
+      false,
+      false}},
+    {"pubg_mobile_skydive",
+     {"pubg_mobile_skydive",
+      pubg_mobile_skydive::kReplayContextClientMajorVersion,
+      pubg_mobile_skydive::kReplayContextClientMinorVersion,
+      pubg_mobile_skydive::kReplayFrameStart,
+      pubg_mobile_skydive::kReplayFrameEnd,
+      pubg_mobile_skydive::kReplayDrawSurfaceWidth,
+      pubg_mobile_skydive::kReplayDrawSurfaceHeight,
+      pubg_mobile_skydive::kReplayDrawSurfaceColorSpace,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      false,
+      false,
+      false,
+      false,
+      false}},
+    {"ragnarok_m_eternal_love",
+     {"ragnarok_m_eternal_love",
+      ragnarok_m_eternal_love::kReplayContextClientMajorVersion,
       ragnarok_m_eternal_love::kReplayContextClientMinorVersion,
-      ragnarok_m_eternal_love::kReplayFrameStart, ragnarok_m_eternal_love::kReplayFrameEnd,
+      ragnarok_m_eternal_love::kReplayFrameStart,
+      ragnarok_m_eternal_love::kReplayFrameEnd,
       ragnarok_m_eternal_love::kReplayDrawSurfaceWidth,
-      ragnarok_m_eternal_love::kReplayDrawSurfaceHeight, "ragnarok_m_eternal_love"}},
-    {RestrictedTraceID::raid_shadow_legends,
-     {raid_shadow_legends::kReplayContextClientMajorVersion,
-      raid_shadow_legends::kReplayContextClientMinorVersion, raid_shadow_legends::kReplayFrameStart,
-      raid_shadow_legends::kReplayFrameEnd, raid_shadow_legends::kReplayDrawSurfaceWidth,
-      raid_shadow_legends::kReplayDrawSurfaceHeight, "raid_shadow_legends"}},
-    {RestrictedTraceID::real_commando_secret_mission,
-     {real_commando_secret_mission::kReplayContextClientMajorVersion,
+      ragnarok_m_eternal_love::kReplayDrawSurfaceHeight,
+      kDefaultReplayDrawSurfaceColorSpace,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      false,
+      false,
+      false,
+      false,
+      false}},
+    {"raid_shadow_legends",
+     {"raid_shadow_legends",
+      raid_shadow_legends::kReplayContextClientMajorVersion,
+      raid_shadow_legends::kReplayContextClientMinorVersion,
+      raid_shadow_legends::kReplayFrameStart,
+      raid_shadow_legends::kReplayFrameEnd,
+      raid_shadow_legends::kReplayDrawSurfaceWidth,
+      raid_shadow_legends::kReplayDrawSurfaceHeight,
+      kDefaultReplayDrawSurfaceColorSpace,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      false,
+      false,
+      false,
+      false,
+      false}},
+    {"real_commando_secret_mission",
+     {"real_commando_secret_mission",
+      real_commando_secret_mission::kReplayContextClientMajorVersion,
       real_commando_secret_mission::kReplayContextClientMinorVersion,
       real_commando_secret_mission::kReplayFrameStart,
       real_commando_secret_mission::kReplayFrameEnd,
       real_commando_secret_mission::kReplayDrawSurfaceWidth,
-      real_commando_secret_mission::kReplayDrawSurfaceHeight, "real_commando_secret_mission"}},
-    {RestrictedTraceID::real_cricket_20,
-     {real_cricket_20::kReplayContextClientMajorVersion,
-      real_cricket_20::kReplayContextClientMinorVersion, real_cricket_20::kReplayFrameStart,
-      real_cricket_20::kReplayFrameEnd, real_cricket_20::kReplayDrawSurfaceWidth,
-      real_cricket_20::kReplayDrawSurfaceHeight, "real_cricket_20"}},
-    {RestrictedTraceID::real_gangster_crime,
-     {real_gangster_crime::kReplayContextClientMajorVersion,
-      real_gangster_crime::kReplayContextClientMinorVersion, real_gangster_crime::kReplayFrameStart,
-      real_gangster_crime::kReplayFrameEnd, real_gangster_crime::kReplayDrawSurfaceWidth,
-      real_gangster_crime::kReplayDrawSurfaceHeight, "real_gangster_crime"}},
-    {RestrictedTraceID::rise_of_kingdoms,
-     {rise_of_kingdoms::kReplayContextClientMajorVersion,
-      rise_of_kingdoms::kReplayContextClientMinorVersion, rise_of_kingdoms::kReplayFrameStart,
-      rise_of_kingdoms::kReplayFrameEnd, rise_of_kingdoms::kReplayDrawSurfaceWidth,
-      rise_of_kingdoms::kReplayDrawSurfaceHeight, "rise_of_kingdoms"}},
-    {RestrictedTraceID::romancing_saga,
-     {romancing_saga::kReplayContextClientMajorVersion,
-      romancing_saga::kReplayContextClientMinorVersion, romancing_saga::kReplayFrameStart,
-      romancing_saga::kReplayFrameEnd, romancing_saga::kReplayDrawSurfaceWidth,
-      romancing_saga::kReplayDrawSurfaceHeight, "romancing_saga"}},
-    {RestrictedTraceID::rope_hero_vice_town,
-     {rope_hero_vice_town::kReplayContextClientMajorVersion,
-      rope_hero_vice_town::kReplayContextClientMinorVersion, rope_hero_vice_town::kReplayFrameStart,
-      rope_hero_vice_town::kReplayFrameEnd, rope_hero_vice_town::kReplayDrawSurfaceWidth,
-      rope_hero_vice_town::kReplayDrawSurfaceHeight, "rope_hero_vice_town"}},
-    {RestrictedTraceID::saint_seiya_awakening,
-     {saint_seiya_awakening::kReplayContextClientMajorVersion,
+      real_commando_secret_mission::kReplayDrawSurfaceHeight,
+      kDefaultReplayDrawSurfaceColorSpace,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      false,
+      false,
+      false,
+      false,
+      false}},
+    {"real_cricket_20",
+     {"real_cricket_20",
+      real_cricket_20::kReplayContextClientMajorVersion,
+      real_cricket_20::kReplayContextClientMinorVersion,
+      real_cricket_20::kReplayFrameStart,
+      real_cricket_20::kReplayFrameEnd,
+      real_cricket_20::kReplayDrawSurfaceWidth,
+      real_cricket_20::kReplayDrawSurfaceHeight,
+      kDefaultReplayDrawSurfaceColorSpace,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      false,
+      false,
+      false,
+      false,
+      false}},
+    {"real_gangster_crime",
+     {"real_gangster_crime",
+      real_gangster_crime::kReplayContextClientMajorVersion,
+      real_gangster_crime::kReplayContextClientMinorVersion,
+      real_gangster_crime::kReplayFrameStart,
+      real_gangster_crime::kReplayFrameEnd,
+      real_gangster_crime::kReplayDrawSurfaceWidth,
+      real_gangster_crime::kReplayDrawSurfaceHeight,
+      kDefaultReplayDrawSurfaceColorSpace,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      false,
+      false,
+      false,
+      false,
+      false}},
+    {"rise_of_kingdoms",
+     {"rise_of_kingdoms",
+      rise_of_kingdoms::kReplayContextClientMajorVersion,
+      rise_of_kingdoms::kReplayContextClientMinorVersion,
+      rise_of_kingdoms::kReplayFrameStart,
+      rise_of_kingdoms::kReplayFrameEnd,
+      rise_of_kingdoms::kReplayDrawSurfaceWidth,
+      rise_of_kingdoms::kReplayDrawSurfaceHeight,
+      kDefaultReplayDrawSurfaceColorSpace,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      false,
+      false,
+      false,
+      false,
+      false}},
+    {"romancing_saga",
+     {"romancing_saga",
+      romancing_saga::kReplayContextClientMajorVersion,
+      romancing_saga::kReplayContextClientMinorVersion,
+      romancing_saga::kReplayFrameStart,
+      romancing_saga::kReplayFrameEnd,
+      romancing_saga::kReplayDrawSurfaceWidth,
+      romancing_saga::kReplayDrawSurfaceHeight,
+      kDefaultReplayDrawSurfaceColorSpace,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      false,
+      false,
+      false,
+      false,
+      false}},
+    {"rope_hero_vice_town",
+     {"rope_hero_vice_town",
+      rope_hero_vice_town::kReplayContextClientMajorVersion,
+      rope_hero_vice_town::kReplayContextClientMinorVersion,
+      rope_hero_vice_town::kReplayFrameStart,
+      rope_hero_vice_town::kReplayFrameEnd,
+      rope_hero_vice_town::kReplayDrawSurfaceWidth,
+      rope_hero_vice_town::kReplayDrawSurfaceHeight,
+      kDefaultReplayDrawSurfaceColorSpace,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      false,
+      false,
+      false,
+      false,
+      false}},
+    {"saint_seiya_awakening",
+     {"saint_seiya_awakening",
+      saint_seiya_awakening::kReplayContextClientMajorVersion,
       saint_seiya_awakening::kReplayContextClientMinorVersion,
-      saint_seiya_awakening::kReplayFrameStart, saint_seiya_awakening::kReplayFrameEnd,
+      saint_seiya_awakening::kReplayFrameStart,
+      saint_seiya_awakening::kReplayFrameEnd,
       saint_seiya_awakening::kReplayDrawSurfaceWidth,
-      saint_seiya_awakening::kReplayDrawSurfaceHeight, "saint_seiya_awakening"}},
-    {RestrictedTraceID::sakura_school_simulator,
-     {sakura_school_simulator::kReplayContextClientMajorVersion,
+      saint_seiya_awakening::kReplayDrawSurfaceHeight,
+      kDefaultReplayDrawSurfaceColorSpace,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      false,
+      false,
+      false,
+      false,
+      false}},
+    {"sakura_school_simulator",
+     {"sakura_school_simulator",
+      sakura_school_simulator::kReplayContextClientMajorVersion,
       sakura_school_simulator::kReplayContextClientMinorVersion,
-      sakura_school_simulator::kReplayFrameStart, sakura_school_simulator::kReplayFrameEnd,
+      sakura_school_simulator::kReplayFrameStart,
+      sakura_school_simulator::kReplayFrameEnd,
       sakura_school_simulator::kReplayDrawSurfaceWidth,
-      sakura_school_simulator::kReplayDrawSurfaceHeight, "sakura_school_simulator"}},
-    {RestrictedTraceID::shadow_fight_2,
-     {shadow_fight_2::kReplayContextClientMajorVersion,
-      shadow_fight_2::kReplayContextClientMinorVersion, shadow_fight_2::kReplayFrameStart,
-      shadow_fight_2::kReplayFrameEnd, shadow_fight_2::kReplayDrawSurfaceWidth,
-      shadow_fight_2::kReplayDrawSurfaceHeight, "shadow_fight_2"}},
-    {RestrictedTraceID::slingshot_test1,
-     {slingshot_test1::kReplayContextClientMajorVersion,
-      slingshot_test1::kReplayContextClientMinorVersion, slingshot_test1::kReplayFrameStart,
-      slingshot_test1::kReplayFrameEnd, slingshot_test1::kReplayDrawSurfaceWidth,
-      slingshot_test1::kReplayDrawSurfaceHeight, "slingshot_test1"}},
-    {RestrictedTraceID::slingshot_test2,
-     {slingshot_test2::kReplayContextClientMajorVersion,
-      slingshot_test2::kReplayContextClientMinorVersion, slingshot_test2::kReplayFrameStart,
-      slingshot_test2::kReplayFrameEnd, slingshot_test2::kReplayDrawSurfaceWidth,
-      slingshot_test2::kReplayDrawSurfaceHeight, "slingshot_test2"}},
-    {RestrictedTraceID::sniper_3d,
-     {sniper_3d::kReplayContextClientMajorVersion, sniper_3d::kReplayContextClientMinorVersion,
-      sniper_3d::kReplayFrameStart, sniper_3d::kReplayFrameEnd, sniper_3d::kReplayDrawSurfaceWidth,
-      sniper_3d::kReplayDrawSurfaceHeight, "sniper_3d"}},
-    {RestrictedTraceID::standoff_2,
-     {standoff_2::kReplayContextClientMajorVersion, standoff_2::kReplayContextClientMinorVersion,
-      standoff_2::kReplayFrameStart, standoff_2::kReplayFrameEnd,
-      standoff_2::kReplayDrawSurfaceWidth, standoff_2::kReplayDrawSurfaceHeight, "standoff_2"}},
-    {RestrictedTraceID::subway_princess_runner,
-     {subway_princess_runner::kReplayContextClientMajorVersion,
+      sakura_school_simulator::kReplayDrawSurfaceHeight,
+      kDefaultReplayDrawSurfaceColorSpace,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      false,
+      false,
+      false,
+      false,
+      false}},
+    {"scrabble_go",
+     {"scrabble_go",
+      scrabble_go::kReplayContextClientMajorVersion,
+      scrabble_go::kReplayContextClientMinorVersion,
+      scrabble_go::kReplayFrameStart,
+      scrabble_go::kReplayFrameEnd,
+      scrabble_go::kReplayDrawSurfaceWidth,
+      scrabble_go::kReplayDrawSurfaceHeight,
+      scrabble_go::kReplayDrawSurfaceColorSpace,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      false,
+      false,
+      false,
+      false,
+      false}},
+    {"shadow_fight_2",
+     {"shadow_fight_2",
+      shadow_fight_2::kReplayContextClientMajorVersion,
+      shadow_fight_2::kReplayContextClientMinorVersion,
+      shadow_fight_2::kReplayFrameStart,
+      shadow_fight_2::kReplayFrameEnd,
+      shadow_fight_2::kReplayDrawSurfaceWidth,
+      shadow_fight_2::kReplayDrawSurfaceHeight,
+      kDefaultReplayDrawSurfaceColorSpace,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      false,
+      false,
+      false,
+      false,
+      false}},
+    {"slingshot_test1",
+     {"slingshot_test1",
+      slingshot_test1::kReplayContextClientMajorVersion,
+      slingshot_test1::kReplayContextClientMinorVersion,
+      slingshot_test1::kReplayFrameStart,
+      slingshot_test1::kReplayFrameEnd,
+      slingshot_test1::kReplayDrawSurfaceWidth,
+      slingshot_test1::kReplayDrawSurfaceHeight,
+      kDefaultReplayDrawSurfaceColorSpace,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      false,
+      false,
+      false,
+      false,
+      false}},
+    {"slingshot_test2",
+     {"slingshot_test2",
+      slingshot_test2::kReplayContextClientMajorVersion,
+      slingshot_test2::kReplayContextClientMinorVersion,
+      slingshot_test2::kReplayFrameStart,
+      slingshot_test2::kReplayFrameEnd,
+      slingshot_test2::kReplayDrawSurfaceWidth,
+      slingshot_test2::kReplayDrawSurfaceHeight,
+      kDefaultReplayDrawSurfaceColorSpace,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      false,
+      false,
+      false,
+      false,
+      false}},
+    {"sniper_3d",
+     {"sniper_3d",
+      sniper_3d::kReplayContextClientMajorVersion,
+      sniper_3d::kReplayContextClientMinorVersion,
+      sniper_3d::kReplayFrameStart,
+      sniper_3d::kReplayFrameEnd,
+      sniper_3d::kReplayDrawSurfaceWidth,
+      sniper_3d::kReplayDrawSurfaceHeight,
+      kDefaultReplayDrawSurfaceColorSpace,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      false,
+      false,
+      false,
+      false,
+      false}},
+    {"sonic_the_hedgehog",
+     {"sonic_the_hedgehog",
+      sonic_the_hedgehog::kReplayContextClientMajorVersion,
+      sonic_the_hedgehog::kReplayContextClientMinorVersion,
+      sonic_the_hedgehog::kReplayFrameStart,
+      sonic_the_hedgehog::kReplayFrameEnd,
+      sonic_the_hedgehog::kReplayDrawSurfaceWidth,
+      sonic_the_hedgehog::kReplayDrawSurfaceHeight,
+      sonic_the_hedgehog::kReplayDrawSurfaceColorSpace,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      false,
+      false,
+      false,
+      false,
+      false}},
+    {"standoff_2",
+     {"standoff_2",
+      standoff_2::kReplayContextClientMajorVersion,
+      standoff_2::kReplayContextClientMinorVersion,
+      standoff_2::kReplayFrameStart,
+      standoff_2::kReplayFrameEnd,
+      standoff_2::kReplayDrawSurfaceWidth,
+      standoff_2::kReplayDrawSurfaceHeight,
+      kDefaultReplayDrawSurfaceColorSpace,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      false,
+      false,
+      false,
+      false,
+      false}},
+    {"subway_princess_runner",
+     {"subway_princess_runner",
+      subway_princess_runner::kReplayContextClientMajorVersion,
       subway_princess_runner::kReplayContextClientMinorVersion,
-      subway_princess_runner::kReplayFrameStart, subway_princess_runner::kReplayFrameEnd,
+      subway_princess_runner::kReplayFrameStart,
+      subway_princess_runner::kReplayFrameEnd,
       subway_princess_runner::kReplayDrawSurfaceWidth,
-      subway_princess_runner::kReplayDrawSurfaceHeight, "subway_princess_runner"}},
-    {RestrictedTraceID::subway_surfers,
-     {subway_surfers::kReplayContextClientMajorVersion,
-      subway_surfers::kReplayContextClientMinorVersion, subway_surfers::kReplayFrameStart,
-      subway_surfers::kReplayFrameEnd, subway_surfers::kReplayDrawSurfaceWidth,
-      subway_surfers::kReplayDrawSurfaceHeight, "subway_surfers"}},
-    {RestrictedTraceID::summoners_war,
-     {summoners_war::kReplayContextClientMajorVersion,
-      summoners_war::kReplayContextClientMinorVersion, summoners_war::kReplayFrameStart,
-      summoners_war::kReplayFrameEnd, summoners_war::kReplayDrawSurfaceWidth,
-      summoners_war::kReplayDrawSurfaceHeight, "summoners_war"}},
-    {RestrictedTraceID::talking_tom_hero_dash,
-     {talking_tom_hero_dash::kReplayContextClientMajorVersion,
+      subway_princess_runner::kReplayDrawSurfaceHeight,
+      kDefaultReplayDrawSurfaceColorSpace,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      false,
+      false,
+      false,
+      false,
+      false}},
+    {"subway_surfers",
+     {"subway_surfers",
+      subway_surfers::kReplayContextClientMajorVersion,
+      subway_surfers::kReplayContextClientMinorVersion,
+      subway_surfers::kReplayFrameStart,
+      subway_surfers::kReplayFrameEnd,
+      subway_surfers::kReplayDrawSurfaceWidth,
+      subway_surfers::kReplayDrawSurfaceHeight,
+      kDefaultReplayDrawSurfaceColorSpace,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      false,
+      false,
+      false,
+      false,
+      false}},
+    {"summoners_war",
+     {"summoners_war",
+      summoners_war::kReplayContextClientMajorVersion,
+      summoners_war::kReplayContextClientMinorVersion,
+      summoners_war::kReplayFrameStart,
+      summoners_war::kReplayFrameEnd,
+      summoners_war::kReplayDrawSurfaceWidth,
+      summoners_war::kReplayDrawSurfaceHeight,
+      kDefaultReplayDrawSurfaceColorSpace,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      false,
+      false,
+      false,
+      false,
+      false}},
+    {"talking_tom_hero_dash",
+     {"talking_tom_hero_dash",
+      talking_tom_hero_dash::kReplayContextClientMajorVersion,
       talking_tom_hero_dash::kReplayContextClientMinorVersion,
-      talking_tom_hero_dash::kReplayFrameStart, talking_tom_hero_dash::kReplayFrameEnd,
+      talking_tom_hero_dash::kReplayFrameStart,
+      talking_tom_hero_dash::kReplayFrameEnd,
       talking_tom_hero_dash::kReplayDrawSurfaceWidth,
-      talking_tom_hero_dash::kReplayDrawSurfaceHeight, "talking_tom_hero_dash"}},
-    {RestrictedTraceID::temple_run_2,
-     {temple_run_2::kReplayContextClientMajorVersion,
-      temple_run_2::kReplayContextClientMinorVersion, temple_run_2::kReplayFrameStart,
-      temple_run_2::kReplayFrameEnd, temple_run_2::kReplayDrawSurfaceWidth,
-      temple_run_2::kReplayDrawSurfaceHeight, "temple_run_2"}},
-    {RestrictedTraceID::temple_run_300,
-     {temple_run_300::kReplayContextClientMajorVersion,
-      temple_run_300::kReplayContextClientMinorVersion, temple_run_300::kReplayFrameStart,
-      temple_run_300::kReplayFrameEnd, temple_run_300::kReplayDrawSurfaceWidth,
-      temple_run_300::kReplayDrawSurfaceHeight, "temple_run_300"}},
-    {RestrictedTraceID::toon_blast,
-     {toon_blast::kReplayContextClientMajorVersion, toon_blast::kReplayContextClientMinorVersion,
-      toon_blast::kReplayFrameStart, toon_blast::kReplayFrameEnd,
-      toon_blast::kReplayDrawSurfaceWidth, toon_blast::kReplayDrawSurfaceHeight, "toon_blast"}},
-    {RestrictedTraceID::township,
-     {township::kReplayContextClientMajorVersion, township::kReplayContextClientMinorVersion,
-      township::kReplayFrameStart, township::kReplayFrameEnd, township::kReplayDrawSurfaceWidth,
-      township::kReplayDrawSurfaceHeight, "township"}},
-    {RestrictedTraceID::trex_200,
-     {trex_200::kReplayContextClientMajorVersion, trex_200::kReplayContextClientMinorVersion,
-      trex_200::kReplayFrameStart, trex_200::kReplayFrameEnd, trex_200::kReplayDrawSurfaceWidth,
-      trex_200::kReplayDrawSurfaceHeight, "trex_200"}},
-    {RestrictedTraceID::whatsapp,
-     {whatsapp::kReplayContextClientMajorVersion, whatsapp::kReplayContextClientMinorVersion,
-      whatsapp::kReplayFrameStart, whatsapp::kReplayFrameEnd, whatsapp::kReplayDrawSurfaceWidth,
-      whatsapp::kReplayDrawSurfaceHeight, "whatsapp"}},
-    {RestrictedTraceID::world_of_tanks_blitz,
-     {world_of_tanks_blitz::kReplayContextClientMajorVersion,
+      talking_tom_hero_dash::kReplayDrawSurfaceHeight,
+      kDefaultReplayDrawSurfaceColorSpace,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      false,
+      false,
+      false,
+      false,
+      false}},
+    {"temple_run_2",
+     {"temple_run_2",
+      temple_run_2::kReplayContextClientMajorVersion,
+      temple_run_2::kReplayContextClientMinorVersion,
+      temple_run_2::kReplayFrameStart,
+      temple_run_2::kReplayFrameEnd,
+      temple_run_2::kReplayDrawSurfaceWidth,
+      temple_run_2::kReplayDrawSurfaceHeight,
+      kDefaultReplayDrawSurfaceColorSpace,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      false,
+      false,
+      false,
+      false,
+      false}},
+    {"temple_run_300",
+     {"temple_run_300",
+      temple_run_300::kReplayContextClientMajorVersion,
+      temple_run_300::kReplayContextClientMinorVersion,
+      temple_run_300::kReplayFrameStart,
+      temple_run_300::kReplayFrameEnd,
+      temple_run_300::kReplayDrawSurfaceWidth,
+      temple_run_300::kReplayDrawSurfaceHeight,
+      kDefaultReplayDrawSurfaceColorSpace,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      false,
+      false,
+      false,
+      false,
+      false}},
+    {"toon_blast",
+     {"toon_blast",
+      toon_blast::kReplayContextClientMajorVersion,
+      toon_blast::kReplayContextClientMinorVersion,
+      toon_blast::kReplayFrameStart,
+      toon_blast::kReplayFrameEnd,
+      toon_blast::kReplayDrawSurfaceWidth,
+      toon_blast::kReplayDrawSurfaceHeight,
+      kDefaultReplayDrawSurfaceColorSpace,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      false,
+      false,
+      false,
+      false,
+      false}},
+    {"township",
+     {"township",
+      township::kReplayContextClientMajorVersion,
+      township::kReplayContextClientMinorVersion,
+      township::kReplayFrameStart,
+      township::kReplayFrameEnd,
+      township::kReplayDrawSurfaceWidth,
+      township::kReplayDrawSurfaceHeight,
+      kDefaultReplayDrawSurfaceColorSpace,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      false,
+      false,
+      false,
+      false,
+      false}},
+    {"trex_200",
+     {"trex_200",
+      trex_200::kReplayContextClientMajorVersion,
+      trex_200::kReplayContextClientMinorVersion,
+      trex_200::kReplayFrameStart,
+      trex_200::kReplayFrameEnd,
+      trex_200::kReplayDrawSurfaceWidth,
+      trex_200::kReplayDrawSurfaceHeight,
+      kDefaultReplayDrawSurfaceColorSpace,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      false,
+      false,
+      false,
+      false,
+      false}},
+    {"whatsapp",
+     {"whatsapp",
+      whatsapp::kReplayContextClientMajorVersion,
+      whatsapp::kReplayContextClientMinorVersion,
+      whatsapp::kReplayFrameStart,
+      whatsapp::kReplayFrameEnd,
+      whatsapp::kReplayDrawSurfaceWidth,
+      whatsapp::kReplayDrawSurfaceHeight,
+      kDefaultReplayDrawSurfaceColorSpace,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      false,
+      false,
+      false,
+      false,
+      false}},
+    {"words_with_friends_2",
+     {"words_with_friends_2",
+      words_with_friends_2::kReplayContextClientMajorVersion,
+      words_with_friends_2::kReplayContextClientMinorVersion,
+      words_with_friends_2::kReplayFrameStart,
+      words_with_friends_2::kReplayFrameEnd,
+      words_with_friends_2::kReplayDrawSurfaceWidth,
+      words_with_friends_2::kReplayDrawSurfaceHeight,
+      words_with_friends_2::kReplayDrawSurfaceColorSpace,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      false,
+      false,
+      false,
+      false,
+      false}},
+    {"wordscapes",
+     {"wordscapes",
+      wordscapes::kReplayContextClientMajorVersion,
+      wordscapes::kReplayContextClientMinorVersion,
+      wordscapes::kReplayFrameStart,
+      wordscapes::kReplayFrameEnd,
+      wordscapes::kReplayDrawSurfaceWidth,
+      wordscapes::kReplayDrawSurfaceHeight,
+      wordscapes::kReplayDrawSurfaceColorSpace,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      false,
+      false,
+      false,
+      false,
+      false}},
+    {"world_of_kings",
+     {"world_of_kings",
+      world_of_kings::kReplayContextClientMajorVersion,
+      world_of_kings::kReplayContextClientMinorVersion,
+      world_of_kings::kReplayFrameStart,
+      world_of_kings::kReplayFrameEnd,
+      world_of_kings::kReplayDrawSurfaceWidth,
+      world_of_kings::kReplayDrawSurfaceHeight,
+      world_of_kings::kReplayDrawSurfaceColorSpace,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      false,
+      false,
+      false,
+      false,
+      false}},
+    {"world_of_tanks_blitz",
+     {"world_of_tanks_blitz",
+      world_of_tanks_blitz::kReplayContextClientMajorVersion,
       world_of_tanks_blitz::kReplayContextClientMinorVersion,
-      world_of_tanks_blitz::kReplayFrameStart, world_of_tanks_blitz::kReplayFrameEnd,
-      world_of_tanks_blitz::kReplayDrawSurfaceWidth, world_of_tanks_blitz::kReplayDrawSurfaceHeight,
-      "world_of_tanks_blitz"}},
-    {RestrictedTraceID::world_war_doh,
-     {world_war_doh::kReplayContextClientMajorVersion,
-      world_war_doh::kReplayContextClientMinorVersion, world_war_doh::kReplayFrameStart,
-      world_war_doh::kReplayFrameEnd, world_war_doh::kReplayDrawSurfaceWidth,
-      world_war_doh::kReplayDrawSurfaceHeight, "world_war_doh"}},
-    {RestrictedTraceID::worms_zone_io,
-     {worms_zone_io::kReplayContextClientMajorVersion,
-      worms_zone_io::kReplayContextClientMinorVersion, worms_zone_io::kReplayFrameStart,
-      worms_zone_io::kReplayFrameEnd, worms_zone_io::kReplayDrawSurfaceWidth,
-      worms_zone_io::kReplayDrawSurfaceHeight, "worms_zone_io"}}};
-}
+      world_of_tanks_blitz::kReplayFrameStart,
+      world_of_tanks_blitz::kReplayFrameEnd,
+      world_of_tanks_blitz::kReplayDrawSurfaceWidth,
+      world_of_tanks_blitz::kReplayDrawSurfaceHeight,
+      kDefaultReplayDrawSurfaceColorSpace,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      false,
+      false,
+      false,
+      false,
+      false}},
+    {"world_war_doh",
+     {"world_war_doh",
+      world_war_doh::kReplayContextClientMajorVersion,
+      world_war_doh::kReplayContextClientMinorVersion,
+      world_war_doh::kReplayFrameStart,
+      world_war_doh::kReplayFrameEnd,
+      world_war_doh::kReplayDrawSurfaceWidth,
+      world_war_doh::kReplayDrawSurfaceHeight,
+      kDefaultReplayDrawSurfaceColorSpace,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      false,
+      false,
+      false,
+      false,
+      false}},
+    {"worms_zone_io",
+     {"worms_zone_io",
+      worms_zone_io::kReplayContextClientMajorVersion,
+      worms_zone_io::kReplayContextClientMinorVersion,
+      worms_zone_io::kReplayFrameStart,
+      worms_zone_io::kReplayFrameEnd,
+      worms_zone_io::kReplayDrawSurfaceWidth,
+      worms_zone_io::kReplayDrawSurfaceHeight,
+      kDefaultReplayDrawSurfaceColorSpace,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      false,
+      false,
+      false,
+      false,
+      false}}};
+}  // namespace
 
-const TraceInfo &GetTraceInfo(RestrictedTraceID traceID)
+const TraceInfo &GetTraceInfo(const char *traceName)
 {
-    return kTraceInfos[traceID];
+    // Could be improved using std::lower_bound.
+    for (const TracePair &tracePair : kTraceInfos)
+    {
+        if (strncmp(tracePair.name, traceName, kTraceInfoMaxNameLen) == 0)
+        {
+            return tracePair.info;
+        }
+    }
+    UNREACHABLE();
+    return kTraceInfos[0].info;
 }
-}  // namespace angle
+}  // namespace trace_angle
diff --git a/src/tests/restricted_traces/restricted_traces_autogen.gni b/src/tests/restricted_traces/restricted_traces_autogen.gni
index 6129f1a..3de91c1 100644
--- a/src/tests/restricted_traces/restricted_traces_autogen.gni
+++ b/src/tests/restricted_traces/restricted_traces_autogen.gni
@@ -24,7 +24,7 @@
       "aliexpress/aliexpress_capture_context1_frame009.cpp",
       "aliexpress/aliexpress_capture_context1_frame010.cpp",
     ],
-    "aliexpress/aliexpress_capture_context1.angledata.gz",
+    [ "aliexpress/aliexpress_capture_context1.angledata.gz" ],
   ],
   [
     "among_us",
@@ -41,7 +41,7 @@
       "among_us/among_us_capture_context1_frame009.cpp",
       "among_us/among_us_capture_context1_frame010.cpp",
     ],
-    "among_us/among_us_capture_context1.angledata.gz",
+    [ "among_us/among_us_capture_context1.angledata.gz" ],
   ],
   [
     "angry_birds_2_1500",
@@ -59,7 +59,7 @@
       "angry_birds_2_1500/angry_birds_2_1500_capture_context1_frame010.cpp",
       "angry_birds_2_1500/angry_birds_2_1500_capture_context1_frame011.cpp",
     ],
-    "angry_birds_2_1500/angry_birds_2_1500_capture_context1.angledata.gz",
+    [ "angry_birds_2_1500/angry_birds_2_1500_capture_context1.angledata.gz" ],
   ],
   [
     "arena_of_valor",
@@ -76,7 +76,7 @@
       "arena_of_valor/arena_of_valor_capture_context1_frame009.cpp",
       "arena_of_valor/arena_of_valor_capture_context1_frame010.cpp",
     ],
-    "arena_of_valor/arena_of_valor_capture_context1.angledata.gz",
+    [ "arena_of_valor/arena_of_valor_capture_context1.angledata.gz" ],
   ],
   [
     "asphalt_8",
@@ -93,7 +93,7 @@
       "asphalt_8/asphalt_8_capture_context1_frame009.cpp",
       "asphalt_8/asphalt_8_capture_context1_frame010.cpp",
     ],
-    "asphalt_8/asphalt_8_capture_context1.angledata.gz",
+    [ "asphalt_8/asphalt_8_capture_context1.angledata.gz" ],
   ],
   [
     "avakin_life",
@@ -110,7 +110,7 @@
       "avakin_life/avakin_life_capture_context1_frame009.cpp",
       "avakin_life/avakin_life_capture_context1_frame010.cpp",
     ],
-    "avakin_life/avakin_life_capture_context1.angledata.gz",
+    [ "avakin_life/avakin_life_capture_context1.angledata.gz" ],
   ],
   [
     "aztec_ruins",
@@ -127,7 +127,7 @@
       "aztec_ruins/aztec_ruins_capture_context1_frame009.cpp",
       "aztec_ruins/aztec_ruins_capture_context1_frame010.cpp",
     ],
-    "aztec_ruins/aztec_ruins_capture_context1.angledata.gz",
+    [ "aztec_ruins/aztec_ruins_capture_context1.angledata.gz" ],
   ],
   [
     "beach_buggy_racing",
@@ -184,7 +184,115 @@
       "beach_buggy_racing/beach_buggy_racing_capture_context1_frame049.cpp",
       "beach_buggy_racing/beach_buggy_racing_capture_context1_frame050.cpp",
     ],
-    "beach_buggy_racing/beach_buggy_racing_capture_context1.angledata.gz",
+    [ "beach_buggy_racing/beach_buggy_racing_capture_context1.angledata.gz" ],
+  ],
+  [
+    "blockman_go",
+    2,
+    [
+      "blockman_go/blockman_go_capture_context2_frame001.cpp",
+      "blockman_go/blockman_go_capture_context2_frame002.cpp",
+      "blockman_go/blockman_go_capture_context2_frame003.cpp",
+      "blockman_go/blockman_go_capture_context2_frame004.cpp",
+      "blockman_go/blockman_go_capture_context2_frame005.cpp",
+      "blockman_go/blockman_go_capture_context2_frame006.cpp",
+      "blockman_go/blockman_go_capture_context2_frame007.cpp",
+      "blockman_go/blockman_go_capture_context2_frame008.cpp",
+      "blockman_go/blockman_go_capture_context2_frame009.cpp",
+      "blockman_go/blockman_go_capture_context2_frame010.cpp",
+      "blockman_go/blockman_go_capture_context2_frame011.cpp",
+      "blockman_go/blockman_go_capture_context2_frame012.cpp",
+      "blockman_go/blockman_go_capture_context2_frame013.cpp",
+      "blockman_go/blockman_go_capture_context2_frame014.cpp",
+      "blockman_go/blockman_go_capture_context2_frame015.cpp",
+      "blockman_go/blockman_go_capture_context2_frame016.cpp",
+      "blockman_go/blockman_go_capture_context2_frame017.cpp",
+      "blockman_go/blockman_go_capture_context2_frame018.cpp",
+      "blockman_go/blockman_go_capture_context2_frame019.cpp",
+      "blockman_go/blockman_go_capture_context2_frame020.cpp",
+      "blockman_go/blockman_go_capture_context2_frame021.cpp",
+      "blockman_go/blockman_go_capture_context2_frame022.cpp",
+      "blockman_go/blockman_go_capture_context2_frame023.cpp",
+      "blockman_go/blockman_go_capture_context2_frame024.cpp",
+      "blockman_go/blockman_go_capture_context2_frame025.cpp",
+      "blockman_go/blockman_go_capture_context2_frame026.cpp",
+      "blockman_go/blockman_go_capture_context2_frame027.cpp",
+      "blockman_go/blockman_go_capture_context2_frame028.cpp",
+      "blockman_go/blockman_go_capture_context2_frame029.cpp",
+      "blockman_go/blockman_go_capture_context2_frame030.cpp",
+      "blockman_go/blockman_go_capture_context2_frame031.cpp",
+      "blockman_go/blockman_go_capture_context2_frame032.cpp",
+      "blockman_go/blockman_go_capture_context2_frame033.cpp",
+      "blockman_go/blockman_go_capture_context2_frame034.cpp",
+      "blockman_go/blockman_go_capture_context2_frame035.cpp",
+      "blockman_go/blockman_go_capture_context2_frame036.cpp",
+      "blockman_go/blockman_go_capture_context2_frame037.cpp",
+      "blockman_go/blockman_go_capture_context2_frame038.cpp",
+      "blockman_go/blockman_go_capture_context2_frame039.cpp",
+      "blockman_go/blockman_go_capture_context2_frame040.cpp",
+      "blockman_go/blockman_go_capture_context2_frame041.cpp",
+      "blockman_go/blockman_go_capture_context2_frame042.cpp",
+      "blockman_go/blockman_go_capture_context2_frame043.cpp",
+      "blockman_go/blockman_go_capture_context2_frame044.cpp",
+      "blockman_go/blockman_go_capture_context2_frame045.cpp",
+      "blockman_go/blockman_go_capture_context2_frame046.cpp",
+      "blockman_go/blockman_go_capture_context2_frame047.cpp",
+      "blockman_go/blockman_go_capture_context2_frame048.cpp",
+      "blockman_go/blockman_go_capture_context2_frame049.cpp",
+      "blockman_go/blockman_go_capture_context2_frame050.cpp",
+      "blockman_go/blockman_go_capture_context2_frame051.cpp",
+      "blockman_go/blockman_go_capture_context2_frame052.cpp",
+      "blockman_go/blockman_go_capture_context2_frame053.cpp",
+      "blockman_go/blockman_go_capture_context2_frame054.cpp",
+      "blockman_go/blockman_go_capture_context2_frame055.cpp",
+      "blockman_go/blockman_go_capture_context2_frame056.cpp",
+      "blockman_go/blockman_go_capture_context2_frame057.cpp",
+      "blockman_go/blockman_go_capture_context2_frame058.cpp",
+      "blockman_go/blockman_go_capture_context2_frame059.cpp",
+      "blockman_go/blockman_go_capture_context2_frame060.cpp",
+      "blockman_go/blockman_go_capture_context2_frame061.cpp",
+      "blockman_go/blockman_go_capture_context2_frame062.cpp",
+      "blockman_go/blockman_go_capture_context2_frame063.cpp",
+      "blockman_go/blockman_go_capture_context2_frame064.cpp",
+      "blockman_go/blockman_go_capture_context2_frame065.cpp",
+      "blockman_go/blockman_go_capture_context2_frame066.cpp",
+      "blockman_go/blockman_go_capture_context2_frame067.cpp",
+      "blockman_go/blockman_go_capture_context2_frame068.cpp",
+      "blockman_go/blockman_go_capture_context2_frame069.cpp",
+      "blockman_go/blockman_go_capture_context2_frame070.cpp",
+      "blockman_go/blockman_go_capture_context2_frame071.cpp",
+      "blockman_go/blockman_go_capture_context2_frame072.cpp",
+      "blockman_go/blockman_go_capture_context2_frame073.cpp",
+      "blockman_go/blockman_go_capture_context2_frame074.cpp",
+      "blockman_go/blockman_go_capture_context2_frame075.cpp",
+      "blockman_go/blockman_go_capture_context2_frame076.cpp",
+      "blockman_go/blockman_go_capture_context2_frame077.cpp",
+      "blockman_go/blockman_go_capture_context2_frame078.cpp",
+      "blockman_go/blockman_go_capture_context2_frame079.cpp",
+      "blockman_go/blockman_go_capture_context2_frame080.cpp",
+      "blockman_go/blockman_go_capture_context2_frame081.cpp",
+      "blockman_go/blockman_go_capture_context2_frame082.cpp",
+      "blockman_go/blockman_go_capture_context2_frame083.cpp",
+      "blockman_go/blockman_go_capture_context2_frame084.cpp",
+      "blockman_go/blockman_go_capture_context2_frame085.cpp",
+      "blockman_go/blockman_go_capture_context2_frame086.cpp",
+      "blockman_go/blockman_go_capture_context2_frame087.cpp",
+      "blockman_go/blockman_go_capture_context2_frame088.cpp",
+      "blockman_go/blockman_go_capture_context2_frame089.cpp",
+      "blockman_go/blockman_go_capture_context2_frame090.cpp",
+      "blockman_go/blockman_go_capture_context2_frame091.cpp",
+      "blockman_go/blockman_go_capture_context2_frame092.cpp",
+      "blockman_go/blockman_go_capture_context2_frame093.cpp",
+      "blockman_go/blockman_go_capture_context2_frame094.cpp",
+      "blockman_go/blockman_go_capture_context2_frame095.cpp",
+      "blockman_go/blockman_go_capture_context2_frame096.cpp",
+      "blockman_go/blockman_go_capture_context2_frame097.cpp",
+      "blockman_go/blockman_go_capture_context2_frame098.cpp",
+      "blockman_go/blockman_go_capture_context2_frame099.cpp",
+      "blockman_go/blockman_go_capture_context2_frame100.cpp",
+      "blockman_go/blockman_go_capture_shared.cpp",
+    ],
+    [ "blockman_go/blockman_go.angledata.gz" ],
   ],
   [
     "brawl_stars",
@@ -201,7 +309,7 @@
       "brawl_stars/brawl_stars_capture_context1_frame009.cpp",
       "brawl_stars/brawl_stars_capture_context1_frame010.cpp",
     ],
-    "brawl_stars/brawl_stars_capture_context1.angledata.gz",
+    [ "brawl_stars/brawl_stars_capture_context1.angledata.gz" ],
   ],
   [
     "bricks_breaker_quest",
@@ -238,7 +346,7 @@
       "bricks_breaker_quest/bricks_breaker_quest_capture_context2_frame029.cpp",
       "bricks_breaker_quest/bricks_breaker_quest_capture_context2_frame030.cpp",
     ],
-    "bricks_breaker_quest/bricks_breaker_quest_capture_context2.angledata.gz",
+    [ "bricks_breaker_quest/bricks_breaker_quest_capture_context2.angledata.gz" ],
   ],
   [
     "bubble_shooter",
@@ -345,7 +453,7 @@
       "bubble_shooter/bubble_shooter_capture_context5_frame099.cpp",
       "bubble_shooter/bubble_shooter_capture_context5_frame100.cpp",
     ],
-    "bubble_shooter/bubble_shooter_capture_context5.angledata.gz",
+    [ "bubble_shooter/bubble_shooter_capture_context5.angledata.gz" ],
   ],
   [
     "bus_simulator_indonesia",
@@ -362,7 +470,7 @@
       "bus_simulator_indonesia/bus_simulator_indonesia_capture_context1_frame009.cpp",
       "bus_simulator_indonesia/bus_simulator_indonesia_capture_context1_frame010.cpp",
     ],
-    "bus_simulator_indonesia/bus_simulator_indonesia_capture_context1.angledata.gz",
+    [ "bus_simulator_indonesia/bus_simulator_indonesia_capture_context1.angledata.gz" ],
   ],
   [
     "call_break_offline_card_game",
@@ -469,7 +577,7 @@
       "call_break_offline_card_game/call_break_offline_card_game_capture_context2_frame099.cpp",
       "call_break_offline_card_game/call_break_offline_card_game_capture_context2_frame100.cpp",
     ],
-    "call_break_offline_card_game/call_break_offline_card_game_capture_context2.angledata.gz",
+    [ "call_break_offline_card_game/call_break_offline_card_game_capture_context2.angledata.gz" ],
   ],
   [
     "candy_crush_500",
@@ -487,7 +595,7 @@
       "candy_crush_500/candy_crush_500_capture_context1_frame010.cpp",
       "candy_crush_500/candy_crush_500_capture_context1_frame011.cpp",
     ],
-    "candy_crush_500/candy_crush_500_capture_context1.angledata.gz",
+    [ "candy_crush_500/candy_crush_500_capture_context1.angledata.gz" ],
   ],
   [
     "candy_crush_soda_saga",
@@ -594,7 +702,7 @@
       "candy_crush_soda_saga/candy_crush_soda_saga_capture_context2_frame099.cpp",
       "candy_crush_soda_saga/candy_crush_soda_saga_capture_context2_frame100.cpp",
     ],
-    "candy_crush_soda_saga/candy_crush_soda_saga_capture_context2.angledata.gz",
+    [ "candy_crush_soda_saga/candy_crush_soda_saga_capture_context2.angledata.gz" ],
   ],
   [
     "car_parking_multiplayer",
@@ -611,7 +719,7 @@
       "car_parking_multiplayer/car_parking_multiplayer_capture_context1_frame009.cpp",
       "car_parking_multiplayer/car_parking_multiplayer_capture_context1_frame010.cpp",
     ],
-    "car_parking_multiplayer/car_parking_multiplayer_capture_context1.angledata.gz",
+    [ "car_parking_multiplayer/car_parking_multiplayer_capture_context1.angledata.gz" ],
   ],
   [
     "clash_of_clans",
@@ -628,7 +736,7 @@
       "clash_of_clans/clash_of_clans_capture_context1_frame009.cpp",
       "clash_of_clans/clash_of_clans_capture_context1_frame010.cpp",
     ],
-    "clash_of_clans/clash_of_clans_capture_context1.angledata.gz",
+    [ "clash_of_clans/clash_of_clans_capture_context1.angledata.gz" ],
   ],
   [
     "clash_royale",
@@ -645,7 +753,7 @@
       "clash_royale/clash_royale_capture_context1_frame009.cpp",
       "clash_royale/clash_royale_capture_context1_frame010.cpp",
     ],
-    "clash_royale/clash_royale_capture_context1.angledata.gz",
+    [ "clash_royale/clash_royale_capture_context1.angledata.gz" ],
   ],
   [
     "cod_mobile",
@@ -662,7 +770,7 @@
       "cod_mobile/cod_mobile_capture_context1_frame009.cpp",
       "cod_mobile/cod_mobile_capture_context1_frame010.cpp",
     ],
-    "cod_mobile/cod_mobile_capture_context1.angledata.gz",
+    [ "cod_mobile/cod_mobile_capture_context1.angledata.gz" ],
   ],
   [
     "coin_master",
@@ -679,7 +787,7 @@
       "coin_master/coin_master_capture_context1_frame009.cpp",
       "coin_master/coin_master_capture_context1_frame010.cpp",
     ],
-    "coin_master/coin_master_capture_context1.angledata.gz",
+    [ "coin_master/coin_master_capture_context1.angledata.gz" ],
   ],
   [
     "command_and_conquer_rivals",
@@ -696,7 +804,7 @@
       "command_and_conquer_rivals/command_and_conquer_rivals_capture_context2_frame009.cpp",
       "command_and_conquer_rivals/command_and_conquer_rivals_capture_context2_frame010.cpp",
     ],
-    "command_and_conquer_rivals/command_and_conquer_rivals_capture_context2.angledata.gz",
+    [ "command_and_conquer_rivals/command_and_conquer_rivals_capture_context2.angledata.gz" ],
   ],
   [
     "cookie_run_kingdom",
@@ -753,7 +861,7 @@
       "cookie_run_kingdom/cookie_run_kingdom_capture_context2_frame049.cpp",
       "cookie_run_kingdom/cookie_run_kingdom_capture_context2_frame050.cpp",
     ],
-    "cookie_run_kingdom/cookie_run_kingdom_capture_context2.angledata.gz",
+    [ "cookie_run_kingdom/cookie_run_kingdom_capture_context2.angledata.gz" ],
   ],
   [
     "disney_tsum_tsum",
@@ -860,7 +968,7 @@
       "disney_tsum_tsum/disney_tsum_tsum_capture_context3_frame099.cpp",
       "disney_tsum_tsum/disney_tsum_tsum_capture_context3_frame100.cpp",
     ],
-    "disney_tsum_tsum/disney_tsum_tsum_capture_context3.angledata.gz",
+    [ "disney_tsum_tsum/disney_tsum_tsum_capture_context3.angledata.gz" ],
   ],
   [
     "dr_driving",
@@ -917,7 +1025,7 @@
       "dr_driving/dr_driving_capture_context3_frame049.cpp",
       "dr_driving/dr_driving_capture_context3_frame050.cpp",
     ],
-    "dr_driving/dr_driving_capture_context3.angledata.gz",
+    [ "dr_driving/dr_driving_capture_context3.angledata.gz" ],
   ],
   [
     "dragon_ball_legends",
@@ -934,7 +1042,7 @@
       "dragon_ball_legends/dragon_ball_legends_capture_context1_frame009.cpp",
       "dragon_ball_legends/dragon_ball_legends_capture_context1_frame010.cpp",
     ],
-    "dragon_ball_legends/dragon_ball_legends_capture_context1.angledata.gz",
+    [ "dragon_ball_legends/dragon_ball_legends_capture_context1.angledata.gz" ],
   ],
   [
     "dragon_raja",
@@ -952,7 +1060,7 @@
       "dragon_raja/dragon_raja_capture_context1_frame010.cpp",
       "dragon_raja/dragon_raja_capture_context1_frame011.cpp",
     ],
-    "dragon_raja/dragon_raja_capture_context1.angledata.gz",
+    [ "dragon_raja/dragon_raja_capture_context1.angledata.gz" ],
   ],
   [
     "efootball_pes_2021",
@@ -969,7 +1077,7 @@
       "efootball_pes_2021/efootball_pes_2021_capture_context1_frame009.cpp",
       "efootball_pes_2021/efootball_pes_2021_capture_context1_frame010.cpp",
     ],
-    "efootball_pes_2021/efootball_pes_2021_capture_context1.angledata.gz",
+    [ "efootball_pes_2021/efootball_pes_2021_capture_context1.angledata.gz" ],
   ],
   [
     "egypt_1500",
@@ -987,7 +1095,7 @@
       "egypt_1500/egypt_1500_capture_context1_frame010.cpp",
       "egypt_1500/egypt_1500_capture_context1_frame011.cpp",
     ],
-    "egypt_1500/egypt_1500_capture_context1.angledata.gz",
+    [ "egypt_1500/egypt_1500_capture_context1.angledata.gz" ],
   ],
   [
     "eight_ball_pool",
@@ -1004,7 +1112,7 @@
       "eight_ball_pool/eight_ball_pool_capture_context1_frame009.cpp",
       "eight_ball_pool/eight_ball_pool_capture_context1_frame010.cpp",
     ],
-    "eight_ball_pool/eight_ball_pool_capture_context1.angledata.gz",
+    [ "eight_ball_pool/eight_ball_pool_capture_context1.angledata.gz" ],
   ],
   [
     "extreme_car_driving_simulator",
@@ -1021,7 +1129,7 @@
       "extreme_car_driving_simulator/extreme_car_driving_simulator_capture_context1_frame009.cpp",
       "extreme_car_driving_simulator/extreme_car_driving_simulator_capture_context1_frame010.cpp",
     ],
-    "extreme_car_driving_simulator/extreme_car_driving_simulator_capture_context1.angledata.gz",
+    [ "extreme_car_driving_simulator/extreme_car_driving_simulator_capture_context1.angledata.gz" ],
   ],
   [
     "fallout_shelter_online",
@@ -1038,7 +1146,7 @@
       "fallout_shelter_online/fallout_shelter_online_capture_context1_frame009.cpp",
       "fallout_shelter_online/fallout_shelter_online_capture_context1_frame010.cpp",
     ],
-    "fallout_shelter_online/fallout_shelter_online_capture_context1.angledata.gz",
+    [ "fallout_shelter_online/fallout_shelter_online_capture_context1.angledata.gz" ],
   ],
   [
     "farm_heroes_saga",
@@ -1145,7 +1253,7 @@
       "farm_heroes_saga/farm_heroes_saga_capture_context2_frame099.cpp",
       "farm_heroes_saga/farm_heroes_saga_capture_context2_frame100.cpp",
     ],
-    "farm_heroes_saga/farm_heroes_saga_capture_context2.angledata.gz",
+    [ "farm_heroes_saga/farm_heroes_saga_capture_context2.angledata.gz" ],
   ],
   [
     "fate_grand_order",
@@ -1162,7 +1270,7 @@
       "fate_grand_order/fate_grand_order_capture_context1_frame009.cpp",
       "fate_grand_order/fate_grand_order_capture_context1_frame010.cpp",
     ],
-    "fate_grand_order/fate_grand_order_capture_context1.angledata.gz",
+    [ "fate_grand_order/fate_grand_order_capture_context1.angledata.gz" ],
   ],
   [
     "fifa_mobile",
@@ -1179,7 +1287,315 @@
       "fifa_mobile/fifa_mobile_capture_context1_frame009.cpp",
       "fifa_mobile/fifa_mobile_capture_context1_frame010.cpp",
     ],
-    "fifa_mobile/fifa_mobile_capture_context1.angledata.gz",
+    [ "fifa_mobile/fifa_mobile_capture_context1.angledata.gz" ],
+  ],
+  [
+    "final_fantasy",
+    3,
+    [
+      "final_fantasy/final_fantasy_capture_context3_frame001.cpp",
+      "final_fantasy/final_fantasy_capture_context3_frame002.cpp",
+      "final_fantasy/final_fantasy_capture_context3_frame003.cpp",
+      "final_fantasy/final_fantasy_capture_context3_frame004.cpp",
+      "final_fantasy/final_fantasy_capture_context3_frame005.cpp",
+      "final_fantasy/final_fantasy_capture_context3_frame006.cpp",
+      "final_fantasy/final_fantasy_capture_context3_frame007.cpp",
+      "final_fantasy/final_fantasy_capture_context3_frame008.cpp",
+      "final_fantasy/final_fantasy_capture_context3_frame009.cpp",
+      "final_fantasy/final_fantasy_capture_context3_frame010.cpp",
+      "final_fantasy/final_fantasy_capture_context3_frame011.cpp",
+      "final_fantasy/final_fantasy_capture_context3_frame012.cpp",
+      "final_fantasy/final_fantasy_capture_context3_frame013.cpp",
+      "final_fantasy/final_fantasy_capture_context3_frame014.cpp",
+      "final_fantasy/final_fantasy_capture_context3_frame015.cpp",
+      "final_fantasy/final_fantasy_capture_context3_frame016.cpp",
+      "final_fantasy/final_fantasy_capture_context3_frame017.cpp",
+      "final_fantasy/final_fantasy_capture_context3_frame018.cpp",
+      "final_fantasy/final_fantasy_capture_context3_frame019.cpp",
+      "final_fantasy/final_fantasy_capture_context3_frame020.cpp",
+      "final_fantasy/final_fantasy_capture_context3_frame021.cpp",
+      "final_fantasy/final_fantasy_capture_context3_frame022.cpp",
+      "final_fantasy/final_fantasy_capture_context3_frame023.cpp",
+      "final_fantasy/final_fantasy_capture_context3_frame024.cpp",
+      "final_fantasy/final_fantasy_capture_context3_frame025.cpp",
+      "final_fantasy/final_fantasy_capture_context3_frame026.cpp",
+      "final_fantasy/final_fantasy_capture_context3_frame027.cpp",
+      "final_fantasy/final_fantasy_capture_context3_frame028.cpp",
+      "final_fantasy/final_fantasy_capture_context3_frame029.cpp",
+      "final_fantasy/final_fantasy_capture_context3_frame030.cpp",
+      "final_fantasy/final_fantasy_capture_context3_frame031.cpp",
+      "final_fantasy/final_fantasy_capture_context3_frame032.cpp",
+      "final_fantasy/final_fantasy_capture_context3_frame033.cpp",
+      "final_fantasy/final_fantasy_capture_context3_frame034.cpp",
+      "final_fantasy/final_fantasy_capture_context3_frame035.cpp",
+      "final_fantasy/final_fantasy_capture_context3_frame036.cpp",
+      "final_fantasy/final_fantasy_capture_context3_frame037.cpp",
+      "final_fantasy/final_fantasy_capture_context3_frame038.cpp",
+      "final_fantasy/final_fantasy_capture_context3_frame039.cpp",
+      "final_fantasy/final_fantasy_capture_context3_frame040.cpp",
+      "final_fantasy/final_fantasy_capture_context3_frame041.cpp",
+      "final_fantasy/final_fantasy_capture_context3_frame042.cpp",
+      "final_fantasy/final_fantasy_capture_context3_frame043.cpp",
+      "final_fantasy/final_fantasy_capture_context3_frame044.cpp",
+      "final_fantasy/final_fantasy_capture_context3_frame045.cpp",
+      "final_fantasy/final_fantasy_capture_context3_frame046.cpp",
+      "final_fantasy/final_fantasy_capture_context3_frame047.cpp",
+      "final_fantasy/final_fantasy_capture_context3_frame048.cpp",
+      "final_fantasy/final_fantasy_capture_context3_frame049.cpp",
+      "final_fantasy/final_fantasy_capture_context3_frame050.cpp",
+      "final_fantasy/final_fantasy_capture_context3_frame051.cpp",
+      "final_fantasy/final_fantasy_capture_context3_frame052.cpp",
+      "final_fantasy/final_fantasy_capture_context3_frame053.cpp",
+      "final_fantasy/final_fantasy_capture_context3_frame054.cpp",
+      "final_fantasy/final_fantasy_capture_context3_frame055.cpp",
+      "final_fantasy/final_fantasy_capture_context3_frame056.cpp",
+      "final_fantasy/final_fantasy_capture_context3_frame057.cpp",
+      "final_fantasy/final_fantasy_capture_context3_frame058.cpp",
+      "final_fantasy/final_fantasy_capture_context3_frame059.cpp",
+      "final_fantasy/final_fantasy_capture_context3_frame060.cpp",
+      "final_fantasy/final_fantasy_capture_context3_frame061.cpp",
+      "final_fantasy/final_fantasy_capture_context3_frame062.cpp",
+      "final_fantasy/final_fantasy_capture_context3_frame063.cpp",
+      "final_fantasy/final_fantasy_capture_context3_frame064.cpp",
+      "final_fantasy/final_fantasy_capture_context3_frame065.cpp",
+      "final_fantasy/final_fantasy_capture_context3_frame066.cpp",
+      "final_fantasy/final_fantasy_capture_context3_frame067.cpp",
+      "final_fantasy/final_fantasy_capture_context3_frame068.cpp",
+      "final_fantasy/final_fantasy_capture_context3_frame069.cpp",
+      "final_fantasy/final_fantasy_capture_context3_frame070.cpp",
+      "final_fantasy/final_fantasy_capture_context3_frame071.cpp",
+      "final_fantasy/final_fantasy_capture_context3_frame072.cpp",
+      "final_fantasy/final_fantasy_capture_context3_frame073.cpp",
+      "final_fantasy/final_fantasy_capture_context3_frame074.cpp",
+      "final_fantasy/final_fantasy_capture_context3_frame075.cpp",
+      "final_fantasy/final_fantasy_capture_context3_frame076.cpp",
+      "final_fantasy/final_fantasy_capture_context3_frame077.cpp",
+      "final_fantasy/final_fantasy_capture_context3_frame078.cpp",
+      "final_fantasy/final_fantasy_capture_context3_frame079.cpp",
+      "final_fantasy/final_fantasy_capture_context3_frame080.cpp",
+      "final_fantasy/final_fantasy_capture_context3_frame081.cpp",
+      "final_fantasy/final_fantasy_capture_context3_frame082.cpp",
+      "final_fantasy/final_fantasy_capture_context3_frame083.cpp",
+      "final_fantasy/final_fantasy_capture_context3_frame084.cpp",
+      "final_fantasy/final_fantasy_capture_context3_frame085.cpp",
+      "final_fantasy/final_fantasy_capture_context3_frame086.cpp",
+      "final_fantasy/final_fantasy_capture_context3_frame087.cpp",
+      "final_fantasy/final_fantasy_capture_context3_frame088.cpp",
+      "final_fantasy/final_fantasy_capture_context3_frame089.cpp",
+      "final_fantasy/final_fantasy_capture_context3_frame090.cpp",
+      "final_fantasy/final_fantasy_capture_context3_frame091.cpp",
+      "final_fantasy/final_fantasy_capture_context3_frame092.cpp",
+      "final_fantasy/final_fantasy_capture_context3_frame093.cpp",
+      "final_fantasy/final_fantasy_capture_context3_frame094.cpp",
+      "final_fantasy/final_fantasy_capture_context3_frame095.cpp",
+      "final_fantasy/final_fantasy_capture_context3_frame096.cpp",
+      "final_fantasy/final_fantasy_capture_context3_frame097.cpp",
+      "final_fantasy/final_fantasy_capture_context3_frame098.cpp",
+      "final_fantasy/final_fantasy_capture_context3_frame099.cpp",
+      "final_fantasy/final_fantasy_capture_context3_frame100.cpp",
+      "final_fantasy/final_fantasy_capture_context3_frame101.cpp",
+      "final_fantasy/final_fantasy_capture_context3_frame102.cpp",
+      "final_fantasy/final_fantasy_capture_context3_frame103.cpp",
+      "final_fantasy/final_fantasy_capture_context3_frame104.cpp",
+      "final_fantasy/final_fantasy_capture_context3_frame105.cpp",
+      "final_fantasy/final_fantasy_capture_context3_frame106.cpp",
+      "final_fantasy/final_fantasy_capture_context3_frame107.cpp",
+      "final_fantasy/final_fantasy_capture_context3_frame108.cpp",
+      "final_fantasy/final_fantasy_capture_context3_frame109.cpp",
+      "final_fantasy/final_fantasy_capture_context3_frame110.cpp",
+      "final_fantasy/final_fantasy_capture_context3_frame111.cpp",
+      "final_fantasy/final_fantasy_capture_context3_frame112.cpp",
+      "final_fantasy/final_fantasy_capture_context3_frame113.cpp",
+      "final_fantasy/final_fantasy_capture_context3_frame114.cpp",
+      "final_fantasy/final_fantasy_capture_context3_frame115.cpp",
+      "final_fantasy/final_fantasy_capture_context3_frame116.cpp",
+      "final_fantasy/final_fantasy_capture_context3_frame117.cpp",
+      "final_fantasy/final_fantasy_capture_context3_frame118.cpp",
+      "final_fantasy/final_fantasy_capture_context3_frame119.cpp",
+      "final_fantasy/final_fantasy_capture_context3_frame120.cpp",
+      "final_fantasy/final_fantasy_capture_context3_frame121.cpp",
+      "final_fantasy/final_fantasy_capture_context3_frame122.cpp",
+      "final_fantasy/final_fantasy_capture_context3_frame123.cpp",
+      "final_fantasy/final_fantasy_capture_context3_frame124.cpp",
+      "final_fantasy/final_fantasy_capture_context3_frame125.cpp",
+      "final_fantasy/final_fantasy_capture_context3_frame126.cpp",
+      "final_fantasy/final_fantasy_capture_context3_frame127.cpp",
+      "final_fantasy/final_fantasy_capture_context3_frame128.cpp",
+      "final_fantasy/final_fantasy_capture_context3_frame129.cpp",
+      "final_fantasy/final_fantasy_capture_context3_frame130.cpp",
+      "final_fantasy/final_fantasy_capture_context3_frame131.cpp",
+      "final_fantasy/final_fantasy_capture_context3_frame132.cpp",
+      "final_fantasy/final_fantasy_capture_context3_frame133.cpp",
+      "final_fantasy/final_fantasy_capture_context3_frame134.cpp",
+      "final_fantasy/final_fantasy_capture_context3_frame135.cpp",
+      "final_fantasy/final_fantasy_capture_context3_frame136.cpp",
+      "final_fantasy/final_fantasy_capture_context3_frame137.cpp",
+      "final_fantasy/final_fantasy_capture_context3_frame138.cpp",
+      "final_fantasy/final_fantasy_capture_context3_frame139.cpp",
+      "final_fantasy/final_fantasy_capture_context3_frame140.cpp",
+      "final_fantasy/final_fantasy_capture_context3_frame141.cpp",
+      "final_fantasy/final_fantasy_capture_context3_frame142.cpp",
+      "final_fantasy/final_fantasy_capture_context3_frame143.cpp",
+      "final_fantasy/final_fantasy_capture_context3_frame144.cpp",
+      "final_fantasy/final_fantasy_capture_context3_frame145.cpp",
+      "final_fantasy/final_fantasy_capture_context3_frame146.cpp",
+      "final_fantasy/final_fantasy_capture_context3_frame147.cpp",
+      "final_fantasy/final_fantasy_capture_context3_frame148.cpp",
+      "final_fantasy/final_fantasy_capture_context3_frame149.cpp",
+      "final_fantasy/final_fantasy_capture_context3_frame150.cpp",
+      "final_fantasy/final_fantasy_capture_context3_frame151.cpp",
+      "final_fantasy/final_fantasy_capture_context3_frame152.cpp",
+      "final_fantasy/final_fantasy_capture_context3_frame153.cpp",
+      "final_fantasy/final_fantasy_capture_context3_frame154.cpp",
+      "final_fantasy/final_fantasy_capture_context3_frame155.cpp",
+      "final_fantasy/final_fantasy_capture_context3_frame156.cpp",
+      "final_fantasy/final_fantasy_capture_context3_frame157.cpp",
+      "final_fantasy/final_fantasy_capture_context3_frame158.cpp",
+      "final_fantasy/final_fantasy_capture_context3_frame159.cpp",
+      "final_fantasy/final_fantasy_capture_context3_frame160.cpp",
+      "final_fantasy/final_fantasy_capture_context3_frame161.cpp",
+      "final_fantasy/final_fantasy_capture_context3_frame162.cpp",
+      "final_fantasy/final_fantasy_capture_context3_frame163.cpp",
+      "final_fantasy/final_fantasy_capture_context3_frame164.cpp",
+      "final_fantasy/final_fantasy_capture_context3_frame165.cpp",
+      "final_fantasy/final_fantasy_capture_context3_frame166.cpp",
+      "final_fantasy/final_fantasy_capture_context3_frame167.cpp",
+      "final_fantasy/final_fantasy_capture_context3_frame168.cpp",
+      "final_fantasy/final_fantasy_capture_context3_frame169.cpp",
+      "final_fantasy/final_fantasy_capture_context3_frame170.cpp",
+      "final_fantasy/final_fantasy_capture_context3_frame171.cpp",
+      "final_fantasy/final_fantasy_capture_context3_frame172.cpp",
+      "final_fantasy/final_fantasy_capture_context3_frame173.cpp",
+      "final_fantasy/final_fantasy_capture_context3_frame174.cpp",
+      "final_fantasy/final_fantasy_capture_context3_frame175.cpp",
+      "final_fantasy/final_fantasy_capture_context3_frame176.cpp",
+      "final_fantasy/final_fantasy_capture_context3_frame177.cpp",
+      "final_fantasy/final_fantasy_capture_context3_frame178.cpp",
+      "final_fantasy/final_fantasy_capture_context3_frame179.cpp",
+      "final_fantasy/final_fantasy_capture_context3_frame180.cpp",
+      "final_fantasy/final_fantasy_capture_context3_frame181.cpp",
+      "final_fantasy/final_fantasy_capture_context3_frame182.cpp",
+      "final_fantasy/final_fantasy_capture_context3_frame183.cpp",
+      "final_fantasy/final_fantasy_capture_context3_frame184.cpp",
+      "final_fantasy/final_fantasy_capture_context3_frame185.cpp",
+      "final_fantasy/final_fantasy_capture_context3_frame186.cpp",
+      "final_fantasy/final_fantasy_capture_context3_frame187.cpp",
+      "final_fantasy/final_fantasy_capture_context3_frame188.cpp",
+      "final_fantasy/final_fantasy_capture_context3_frame189.cpp",
+      "final_fantasy/final_fantasy_capture_context3_frame190.cpp",
+      "final_fantasy/final_fantasy_capture_context3_frame191.cpp",
+      "final_fantasy/final_fantasy_capture_context3_frame192.cpp",
+      "final_fantasy/final_fantasy_capture_context3_frame193.cpp",
+      "final_fantasy/final_fantasy_capture_context3_frame194.cpp",
+      "final_fantasy/final_fantasy_capture_context3_frame195.cpp",
+      "final_fantasy/final_fantasy_capture_context3_frame196.cpp",
+      "final_fantasy/final_fantasy_capture_context3_frame197.cpp",
+      "final_fantasy/final_fantasy_capture_context3_frame198.cpp",
+      "final_fantasy/final_fantasy_capture_context3_frame199.cpp",
+      "final_fantasy/final_fantasy_capture_context3_frame200.cpp",
+      "final_fantasy/final_fantasy_capture_context3_frame201.cpp",
+      "final_fantasy/final_fantasy_capture_context3_frame202.cpp",
+      "final_fantasy/final_fantasy_capture_context3_frame203.cpp",
+      "final_fantasy/final_fantasy_capture_context3_frame204.cpp",
+      "final_fantasy/final_fantasy_capture_context3_frame205.cpp",
+      "final_fantasy/final_fantasy_capture_context3_frame206.cpp",
+      "final_fantasy/final_fantasy_capture_context3_frame207.cpp",
+      "final_fantasy/final_fantasy_capture_context3_frame208.cpp",
+      "final_fantasy/final_fantasy_capture_context3_frame209.cpp",
+      "final_fantasy/final_fantasy_capture_context3_frame210.cpp",
+      "final_fantasy/final_fantasy_capture_context3_frame211.cpp",
+      "final_fantasy/final_fantasy_capture_context3_frame212.cpp",
+      "final_fantasy/final_fantasy_capture_context3_frame213.cpp",
+      "final_fantasy/final_fantasy_capture_context3_frame214.cpp",
+      "final_fantasy/final_fantasy_capture_context3_frame215.cpp",
+      "final_fantasy/final_fantasy_capture_context3_frame216.cpp",
+      "final_fantasy/final_fantasy_capture_context3_frame217.cpp",
+      "final_fantasy/final_fantasy_capture_context3_frame218.cpp",
+      "final_fantasy/final_fantasy_capture_context3_frame219.cpp",
+      "final_fantasy/final_fantasy_capture_context3_frame220.cpp",
+      "final_fantasy/final_fantasy_capture_context3_frame221.cpp",
+      "final_fantasy/final_fantasy_capture_context3_frame222.cpp",
+      "final_fantasy/final_fantasy_capture_context3_frame223.cpp",
+      "final_fantasy/final_fantasy_capture_context3_frame224.cpp",
+      "final_fantasy/final_fantasy_capture_context3_frame225.cpp",
+      "final_fantasy/final_fantasy_capture_context3_frame226.cpp",
+      "final_fantasy/final_fantasy_capture_context3_frame227.cpp",
+      "final_fantasy/final_fantasy_capture_context3_frame228.cpp",
+      "final_fantasy/final_fantasy_capture_context3_frame229.cpp",
+      "final_fantasy/final_fantasy_capture_context3_frame230.cpp",
+      "final_fantasy/final_fantasy_capture_context3_frame231.cpp",
+      "final_fantasy/final_fantasy_capture_context3_frame232.cpp",
+      "final_fantasy/final_fantasy_capture_context3_frame233.cpp",
+      "final_fantasy/final_fantasy_capture_context3_frame234.cpp",
+      "final_fantasy/final_fantasy_capture_context3_frame235.cpp",
+      "final_fantasy/final_fantasy_capture_context3_frame236.cpp",
+      "final_fantasy/final_fantasy_capture_context3_frame237.cpp",
+      "final_fantasy/final_fantasy_capture_context3_frame238.cpp",
+      "final_fantasy/final_fantasy_capture_context3_frame239.cpp",
+      "final_fantasy/final_fantasy_capture_context3_frame240.cpp",
+      "final_fantasy/final_fantasy_capture_context3_frame241.cpp",
+      "final_fantasy/final_fantasy_capture_context3_frame242.cpp",
+      "final_fantasy/final_fantasy_capture_context3_frame243.cpp",
+      "final_fantasy/final_fantasy_capture_context3_frame244.cpp",
+      "final_fantasy/final_fantasy_capture_context3_frame245.cpp",
+      "final_fantasy/final_fantasy_capture_context3_frame246.cpp",
+      "final_fantasy/final_fantasy_capture_context3_frame247.cpp",
+      "final_fantasy/final_fantasy_capture_context3_frame248.cpp",
+      "final_fantasy/final_fantasy_capture_context3_frame249.cpp",
+      "final_fantasy/final_fantasy_capture_context3_frame250.cpp",
+      "final_fantasy/final_fantasy_capture_context3_frame251.cpp",
+      "final_fantasy/final_fantasy_capture_context3_frame252.cpp",
+      "final_fantasy/final_fantasy_capture_context3_frame253.cpp",
+      "final_fantasy/final_fantasy_capture_context3_frame254.cpp",
+      "final_fantasy/final_fantasy_capture_context3_frame255.cpp",
+      "final_fantasy/final_fantasy_capture_context3_frame256.cpp",
+      "final_fantasy/final_fantasy_capture_context3_frame257.cpp",
+      "final_fantasy/final_fantasy_capture_context3_frame258.cpp",
+      "final_fantasy/final_fantasy_capture_context3_frame259.cpp",
+      "final_fantasy/final_fantasy_capture_context3_frame260.cpp",
+      "final_fantasy/final_fantasy_capture_context3_frame261.cpp",
+      "final_fantasy/final_fantasy_capture_context3_frame262.cpp",
+      "final_fantasy/final_fantasy_capture_context3_frame263.cpp",
+      "final_fantasy/final_fantasy_capture_context3_frame264.cpp",
+      "final_fantasy/final_fantasy_capture_context3_frame265.cpp",
+      "final_fantasy/final_fantasy_capture_context3_frame266.cpp",
+      "final_fantasy/final_fantasy_capture_context3_frame267.cpp",
+      "final_fantasy/final_fantasy_capture_context3_frame268.cpp",
+      "final_fantasy/final_fantasy_capture_context3_frame269.cpp",
+      "final_fantasy/final_fantasy_capture_context3_frame270.cpp",
+      "final_fantasy/final_fantasy_capture_context3_frame271.cpp",
+      "final_fantasy/final_fantasy_capture_context3_frame272.cpp",
+      "final_fantasy/final_fantasy_capture_context3_frame273.cpp",
+      "final_fantasy/final_fantasy_capture_context3_frame274.cpp",
+      "final_fantasy/final_fantasy_capture_context3_frame275.cpp",
+      "final_fantasy/final_fantasy_capture_context3_frame276.cpp",
+      "final_fantasy/final_fantasy_capture_context3_frame277.cpp",
+      "final_fantasy/final_fantasy_capture_context3_frame278.cpp",
+      "final_fantasy/final_fantasy_capture_context3_frame279.cpp",
+      "final_fantasy/final_fantasy_capture_context3_frame280.cpp",
+      "final_fantasy/final_fantasy_capture_context3_frame281.cpp",
+      "final_fantasy/final_fantasy_capture_context3_frame282.cpp",
+      "final_fantasy/final_fantasy_capture_context3_frame283.cpp",
+      "final_fantasy/final_fantasy_capture_context3_frame284.cpp",
+      "final_fantasy/final_fantasy_capture_context3_frame285.cpp",
+      "final_fantasy/final_fantasy_capture_context3_frame286.cpp",
+      "final_fantasy/final_fantasy_capture_context3_frame287.cpp",
+      "final_fantasy/final_fantasy_capture_context3_frame288.cpp",
+      "final_fantasy/final_fantasy_capture_context3_frame289.cpp",
+      "final_fantasy/final_fantasy_capture_context3_frame290.cpp",
+      "final_fantasy/final_fantasy_capture_context3_frame291.cpp",
+      "final_fantasy/final_fantasy_capture_context3_frame292.cpp",
+      "final_fantasy/final_fantasy_capture_context3_frame293.cpp",
+      "final_fantasy/final_fantasy_capture_context3_frame294.cpp",
+      "final_fantasy/final_fantasy_capture_context3_frame295.cpp",
+      "final_fantasy/final_fantasy_capture_context3_frame296.cpp",
+      "final_fantasy/final_fantasy_capture_context3_frame297.cpp",
+      "final_fantasy/final_fantasy_capture_context3_frame298.cpp",
+      "final_fantasy/final_fantasy_capture_context3_frame299.cpp",
+      "final_fantasy/final_fantasy_capture_context3_frame300.cpp",
+      "final_fantasy/final_fantasy_frame001.cpp",
+    ],
+    [ "final_fantasy/final_fantasy.angledata.gz" ],
   ],
   [
     "free_fire",
@@ -1196,7 +1612,7 @@
       "free_fire/free_fire_capture_context1_frame009.cpp",
       "free_fire/free_fire_capture_context1_frame010.cpp",
     ],
-    "free_fire/free_fire_capture_context1.angledata.gz",
+    [ "free_fire/free_fire_capture_context1.angledata.gz" ],
   ],
   [
     "gardenscapes",
@@ -1233,7 +1649,7 @@
       "gardenscapes/gardenscapes_capture_context1_frame029.cpp",
       "gardenscapes/gardenscapes_capture_context1_frame030.cpp",
     ],
-    "gardenscapes/gardenscapes_capture_context1.angledata.gz",
+    [ "gardenscapes/gardenscapes_capture_context1.angledata.gz" ],
   ],
   [
     "genshin_impact",
@@ -1340,7 +1756,7 @@
       "genshin_impact/genshin_impact_capture_context3_frame099.cpp",
       "genshin_impact/genshin_impact_capture_context3_frame100.cpp",
     ],
-    "genshin_impact/genshin_impact_capture_context3.angledata.gz",
+    [ "genshin_impact/genshin_impact_capture_context3.angledata.gz" ],
   ],
   [
     "google_maps",
@@ -1647,7 +2063,7 @@
       "google_maps/google_maps_capture_context1_frame299.cpp",
       "google_maps/google_maps_capture_context1_frame300.cpp",
     ],
-    "google_maps/google_maps_capture_context1.angledata.gz",
+    [ "google_maps/google_maps_capture_context1.angledata.gz" ],
   ],
   [
     "happy_color",
@@ -1664,7 +2080,7 @@
       "happy_color/happy_color_capture_context1_frame009.cpp",
       "happy_color/happy_color_capture_context1_frame010.cpp",
     ],
-    "happy_color/happy_color_capture_context1.angledata.gz",
+    [ "happy_color/happy_color_capture_context1.angledata.gz" ],
   ],
   [
     "hay_day",
@@ -1681,7 +2097,7 @@
       "hay_day/hay_day_capture_context1_frame009.cpp",
       "hay_day/hay_day_capture_context1_frame010.cpp",
     ],
-    "hay_day/hay_day_capture_context1.angledata.gz",
+    [ "hay_day/hay_day_capture_context1.angledata.gz" ],
   ],
   [
     "hearthstone",
@@ -1698,7 +2114,7 @@
       "hearthstone/hearthstone_capture_context1_frame009.cpp",
       "hearthstone/hearthstone_capture_context1_frame010.cpp",
     ],
-    "hearthstone/hearthstone_capture_context1.angledata.gz",
+    [ "hearthstone/hearthstone_capture_context1.angledata.gz" ],
   ],
   [
     "higgs_domino_island",
@@ -1735,7 +2151,7 @@
       "higgs_domino_island/higgs_domino_island_capture_context2_frame029.cpp",
       "higgs_domino_island/higgs_domino_island_capture_context2_frame030.cpp",
     ],
-    "higgs_domino_island/higgs_domino_island_capture_context2.angledata.gz",
+    [ "higgs_domino_island/higgs_domino_island_capture_context2.angledata.gz" ],
   ],
   [
     "hill_climb_racing",
@@ -1752,7 +2168,7 @@
       "hill_climb_racing/hill_climb_racing_capture_context1_frame009.cpp",
       "hill_climb_racing/hill_climb_racing_capture_context1_frame010.cpp",
     ],
-    "hill_climb_racing/hill_climb_racing_capture_context1.angledata.gz",
+    [ "hill_climb_racing/hill_climb_racing_capture_context1.angledata.gz" ],
   ],
   [
     "homescapes",
@@ -1769,7 +2185,7 @@
       "homescapes/homescapes_capture_context1_frame009.cpp",
       "homescapes/homescapes_capture_context1_frame010.cpp",
     ],
-    "homescapes/homescapes_capture_context1.angledata.gz",
+    [ "homescapes/homescapes_capture_context1.angledata.gz" ],
   ],
   [
     "idle_heroes",
@@ -2775,7 +3191,7 @@
       "idle_heroes/idle_heroes_capture_context2_frame998.cpp",
       "idle_heroes/idle_heroes_capture_context2_frame999.cpp",
     ],
-    "idle_heroes/idle_heroes_capture_context2.angledata.gz",
+    [ "idle_heroes/idle_heroes_capture_context2.angledata.gz" ],
   ],
   [
     "junes_journey",
@@ -2792,7 +3208,7 @@
       "junes_journey/junes_journey_capture_context1_frame009.cpp",
       "junes_journey/junes_journey_capture_context1_frame010.cpp",
     ],
-    "junes_journey/junes_journey_capture_context1.angledata.gz",
+    [ "junes_journey/junes_journey_capture_context1.angledata.gz" ],
   ],
   [
     "kartrider_rush",
@@ -2809,7 +3225,7 @@
       "kartrider_rush/kartrider_rush_capture_context1_frame009.cpp",
       "kartrider_rush/kartrider_rush_capture_context1_frame010.cpp",
     ],
-    "kartrider_rush/kartrider_rush_capture_context1.angledata.gz",
+    [ "kartrider_rush/kartrider_rush_capture_context1.angledata.gz" ],
   ],
   [
     "klondike_adventures",
@@ -2826,7 +3242,7 @@
       "klondike_adventures/klondike_adventures_capture_context1_frame009.cpp",
       "klondike_adventures/klondike_adventures_capture_context1_frame010.cpp",
     ],
-    "klondike_adventures/klondike_adventures_capture_context1.angledata.gz",
+    [ "klondike_adventures/klondike_adventures_capture_context1.angledata.gz" ],
   ],
   [
     "league_of_legends_wild_rift",
@@ -2843,7 +3259,7 @@
       "league_of_legends_wild_rift/league_of_legends_wild_rift_capture_context1_frame009.cpp",
       "league_of_legends_wild_rift/league_of_legends_wild_rift_capture_context1_frame010.cpp",
     ],
-    "league_of_legends_wild_rift/league_of_legends_wild_rift_capture_context1.angledata.gz",
+    [ "league_of_legends_wild_rift/league_of_legends_wild_rift_capture_context1.angledata.gz" ],
   ],
   [
     "lego_legacy",
@@ -2860,7 +3276,7 @@
       "lego_legacy/lego_legacy_capture_context1_frame009.cpp",
       "lego_legacy/lego_legacy_capture_context1_frame010.cpp",
     ],
-    "lego_legacy/lego_legacy_capture_context1.angledata.gz",
+    [ "lego_legacy/lego_legacy_capture_context1.angledata.gz" ],
   ],
   [
     "lineage_m",
@@ -2877,7 +3293,7 @@
       "lineage_m/lineage_m_capture_context1_frame009.cpp",
       "lineage_m/lineage_m_capture_context1_frame010.cpp",
     ],
-    "lineage_m/lineage_m_capture_context1.angledata.gz",
+    [ "lineage_m/lineage_m_capture_context1.angledata.gz" ],
   ],
   [
     "ludo_king",
@@ -2914,7 +3330,7 @@
       "ludo_king/ludo_king_capture_context1_frame029.cpp",
       "ludo_king/ludo_king_capture_context1_frame030.cpp",
     ],
-    "ludo_king/ludo_king_capture_context1.angledata.gz",
+    [ "ludo_king/ludo_king_capture_context1.angledata.gz" ],
   ],
   [
     "magic_tiles_3",
@@ -2931,7 +3347,7 @@
       "magic_tiles_3/magic_tiles_3_capture_context1_frame009.cpp",
       "magic_tiles_3/magic_tiles_3_capture_context1_frame010.cpp",
     ],
-    "magic_tiles_3/magic_tiles_3_capture_context1.angledata.gz",
+    [ "magic_tiles_3/magic_tiles_3_capture_context1.angledata.gz" ],
   ],
   [
     "manhattan_10",
@@ -2949,7 +3365,7 @@
       "manhattan_10/manhattan_10_capture_context1_frame010.cpp",
       "manhattan_10/manhattan_10_capture_context1_frame011.cpp",
     ],
-    "manhattan_10/manhattan_10_capture_context1.angledata.gz",
+    [ "manhattan_10/manhattan_10_capture_context1.angledata.gz" ],
   ],
   [
     "manhattan_31",
@@ -3056,7 +3472,7 @@
       "manhattan_31/manhattan_31_capture_context1_frame099.cpp",
       "manhattan_31/manhattan_31_capture_context1_frame100.cpp",
     ],
-    "manhattan_31/manhattan_31_capture_context1.angledata.gz",
+    [ "manhattan_31/manhattan_31_capture_context1.angledata.gz" ],
   ],
   [
     "mario_kart_tour",
@@ -3163,7 +3579,7 @@
       "mario_kart_tour/mario_kart_tour_capture_context1_frame099.cpp",
       "mario_kart_tour/mario_kart_tour_capture_context1_frame100.cpp",
     ],
-    "mario_kart_tour/mario_kart_tour_capture_context1.angledata.gz",
+    [ "mario_kart_tour/mario_kart_tour_capture_context1.angledata.gz" ],
   ],
   [
     "marvel_contest_of_champions",
@@ -3180,7 +3596,7 @@
       "marvel_contest_of_champions/marvel_contest_of_champions_capture_context1_frame009.cpp",
       "marvel_contest_of_champions/marvel_contest_of_champions_capture_context1_frame010.cpp",
     ],
-    "marvel_contest_of_champions/marvel_contest_of_champions_capture_context1.angledata.gz",
+    [ "marvel_contest_of_champions/marvel_contest_of_champions_capture_context1.angledata.gz" ],
   ],
   [
     "messenger_lite",
@@ -3197,7 +3613,7 @@
       "messenger_lite/messenger_lite_capture_context1_frame009.cpp",
       "messenger_lite/messenger_lite_capture_context1_frame010.cpp",
     ],
-    "messenger_lite/messenger_lite_capture_context1.angledata.gz",
+    [ "messenger_lite/messenger_lite_capture_context1.angledata.gz" ],
   ],
   [
     "minecraft",
@@ -3214,7 +3630,7 @@
       "minecraft/minecraft_capture_context1_frame009.cpp",
       "minecraft/minecraft_capture_context1_frame010.cpp",
     ],
-    "minecraft/minecraft_capture_context1.angledata.gz",
+    [ "minecraft/minecraft_capture_context1.angledata.gz" ],
   ],
   [
     "mobile_legends",
@@ -3231,7 +3647,7 @@
       "mobile_legends/mobile_legends_capture_context1_frame009.cpp",
       "mobile_legends/mobile_legends_capture_context1_frame010.cpp",
     ],
-    "mobile_legends/mobile_legends_capture_context1.angledata.gz",
+    [ "mobile_legends/mobile_legends_capture_context1.angledata.gz" ],
   ],
   [
     "nba2k20_800",
@@ -3249,7 +3665,7 @@
       "nba2k20_800/nba2k20_800_capture_context1_frame010.cpp",
       "nba2k20_800/nba2k20_800_capture_context1_frame011.cpp",
     ],
-    "nba2k20_800/nba2k20_800_capture_context1.angledata.gz",
+    [ "nba2k20_800/nba2k20_800_capture_context1.angledata.gz" ],
   ],
   [
     "one_punch_man",
@@ -3266,7 +3682,7 @@
       "one_punch_man/one_punch_man_capture_context1_frame009.cpp",
       "one_punch_man/one_punch_man_capture_context1_frame010.cpp",
     ],
-    "one_punch_man/one_punch_man_capture_context1.angledata.gz",
+    [ "one_punch_man/one_punch_man_capture_context1.angledata.gz" ],
   ],
   [
     "plants_vs_zombies_2",
@@ -3283,7 +3699,7 @@
       "plants_vs_zombies_2/plants_vs_zombies_2_capture_context1_frame009.cpp",
       "plants_vs_zombies_2/plants_vs_zombies_2_capture_context1_frame010.cpp",
     ],
-    "plants_vs_zombies_2/plants_vs_zombies_2_capture_context1.angledata.gz",
+    [ "plants_vs_zombies_2/plants_vs_zombies_2_capture_context1.angledata.gz" ],
   ],
   [
     "pokemon_go",
@@ -3390,7 +3806,7 @@
       "pokemon_go/pokemon_go_capture_context2_frame099.cpp",
       "pokemon_go/pokemon_go_capture_context2_frame100.cpp",
     ],
-    "pokemon_go/pokemon_go_capture_context2.angledata.gz",
+    [ "pokemon_go/pokemon_go_capture_context2.angledata.gz" ],
   ],
   [
     "professional_baseball_spirits",
@@ -3597,7 +4013,116 @@
       "professional_baseball_spirits/professional_baseball_spirits_capture_context1_frame199.cpp",
       "professional_baseball_spirits/professional_baseball_spirits_capture_context1_frame200.cpp",
     ],
-    "professional_baseball_spirits/professional_baseball_spirits_capture_context1.angledata.gz",
+    [ "professional_baseball_spirits/professional_baseball_spirits_capture_context1.angledata.gz" ],
+  ],
+  [
+    "pubg_mobile_battle_royale",
+    6,
+    [
+      "pubg_mobile_battle_royale/pubg_mobile_battle_royale_capture_context6_frame001.cpp",
+      "pubg_mobile_battle_royale/pubg_mobile_battle_royale_capture_context6_frame002.cpp",
+      "pubg_mobile_battle_royale/pubg_mobile_battle_royale_capture_context6_frame003.cpp",
+      "pubg_mobile_battle_royale/pubg_mobile_battle_royale_capture_context6_frame004.cpp",
+      "pubg_mobile_battle_royale/pubg_mobile_battle_royale_capture_context6_frame005.cpp",
+      "pubg_mobile_battle_royale/pubg_mobile_battle_royale_capture_context6_frame006.cpp",
+      "pubg_mobile_battle_royale/pubg_mobile_battle_royale_capture_context6_frame007.cpp",
+      "pubg_mobile_battle_royale/pubg_mobile_battle_royale_capture_context6_frame008.cpp",
+      "pubg_mobile_battle_royale/pubg_mobile_battle_royale_capture_context6_frame009.cpp",
+      "pubg_mobile_battle_royale/pubg_mobile_battle_royale_capture_context6_frame010.cpp",
+      "pubg_mobile_battle_royale/pubg_mobile_battle_royale_capture_context6_frame011.cpp",
+      "pubg_mobile_battle_royale/pubg_mobile_battle_royale_capture_context6_frame012.cpp",
+      "pubg_mobile_battle_royale/pubg_mobile_battle_royale_capture_context6_frame013.cpp",
+      "pubg_mobile_battle_royale/pubg_mobile_battle_royale_capture_context6_frame014.cpp",
+      "pubg_mobile_battle_royale/pubg_mobile_battle_royale_capture_context6_frame015.cpp",
+      "pubg_mobile_battle_royale/pubg_mobile_battle_royale_capture_context6_frame016.cpp",
+      "pubg_mobile_battle_royale/pubg_mobile_battle_royale_capture_context6_frame017.cpp",
+      "pubg_mobile_battle_royale/pubg_mobile_battle_royale_capture_context6_frame018.cpp",
+      "pubg_mobile_battle_royale/pubg_mobile_battle_royale_capture_context6_frame019.cpp",
+      "pubg_mobile_battle_royale/pubg_mobile_battle_royale_capture_context6_frame020.cpp",
+      "pubg_mobile_battle_royale/pubg_mobile_battle_royale_capture_context6_frame021.cpp",
+      "pubg_mobile_battle_royale/pubg_mobile_battle_royale_capture_context6_frame022.cpp",
+      "pubg_mobile_battle_royale/pubg_mobile_battle_royale_capture_context6_frame023.cpp",
+      "pubg_mobile_battle_royale/pubg_mobile_battle_royale_capture_context6_frame024.cpp",
+      "pubg_mobile_battle_royale/pubg_mobile_battle_royale_capture_context6_frame025.cpp",
+      "pubg_mobile_battle_royale/pubg_mobile_battle_royale_capture_context6_frame026.cpp",
+      "pubg_mobile_battle_royale/pubg_mobile_battle_royale_capture_context6_frame027.cpp",
+      "pubg_mobile_battle_royale/pubg_mobile_battle_royale_capture_context6_frame028.cpp",
+      "pubg_mobile_battle_royale/pubg_mobile_battle_royale_capture_context6_frame029.cpp",
+      "pubg_mobile_battle_royale/pubg_mobile_battle_royale_capture_context6_frame030.cpp",
+      "pubg_mobile_battle_royale/pubg_mobile_battle_royale_capture_context6_frame031.cpp",
+      "pubg_mobile_battle_royale/pubg_mobile_battle_royale_capture_context6_frame032.cpp",
+      "pubg_mobile_battle_royale/pubg_mobile_battle_royale_capture_context6_frame033.cpp",
+      "pubg_mobile_battle_royale/pubg_mobile_battle_royale_capture_context6_frame034.cpp",
+      "pubg_mobile_battle_royale/pubg_mobile_battle_royale_capture_context6_frame035.cpp",
+      "pubg_mobile_battle_royale/pubg_mobile_battle_royale_capture_context6_frame036.cpp",
+      "pubg_mobile_battle_royale/pubg_mobile_battle_royale_capture_context6_frame037.cpp",
+      "pubg_mobile_battle_royale/pubg_mobile_battle_royale_capture_context6_frame038.cpp",
+      "pubg_mobile_battle_royale/pubg_mobile_battle_royale_capture_context6_frame039.cpp",
+      "pubg_mobile_battle_royale/pubg_mobile_battle_royale_capture_context6_frame040.cpp",
+      "pubg_mobile_battle_royale/pubg_mobile_battle_royale_capture_context6_frame041.cpp",
+      "pubg_mobile_battle_royale/pubg_mobile_battle_royale_capture_context6_frame042.cpp",
+      "pubg_mobile_battle_royale/pubg_mobile_battle_royale_capture_context6_frame043.cpp",
+      "pubg_mobile_battle_royale/pubg_mobile_battle_royale_capture_context6_frame044.cpp",
+      "pubg_mobile_battle_royale/pubg_mobile_battle_royale_capture_context6_frame045.cpp",
+      "pubg_mobile_battle_royale/pubg_mobile_battle_royale_capture_context6_frame046.cpp",
+      "pubg_mobile_battle_royale/pubg_mobile_battle_royale_capture_context6_frame047.cpp",
+      "pubg_mobile_battle_royale/pubg_mobile_battle_royale_capture_context6_frame048.cpp",
+      "pubg_mobile_battle_royale/pubg_mobile_battle_royale_capture_context6_frame049.cpp",
+      "pubg_mobile_battle_royale/pubg_mobile_battle_royale_capture_context6_frame050.cpp",
+      "pubg_mobile_battle_royale/pubg_mobile_battle_royale_capture_context6_frame051.cpp",
+      "pubg_mobile_battle_royale/pubg_mobile_battle_royale_capture_context6_frame052.cpp",
+      "pubg_mobile_battle_royale/pubg_mobile_battle_royale_capture_context6_frame053.cpp",
+      "pubg_mobile_battle_royale/pubg_mobile_battle_royale_capture_context6_frame054.cpp",
+      "pubg_mobile_battle_royale/pubg_mobile_battle_royale_capture_context6_frame055.cpp",
+      "pubg_mobile_battle_royale/pubg_mobile_battle_royale_capture_context6_frame056.cpp",
+      "pubg_mobile_battle_royale/pubg_mobile_battle_royale_capture_context6_frame057.cpp",
+      "pubg_mobile_battle_royale/pubg_mobile_battle_royale_capture_context6_frame058.cpp",
+      "pubg_mobile_battle_royale/pubg_mobile_battle_royale_capture_context6_frame059.cpp",
+      "pubg_mobile_battle_royale/pubg_mobile_battle_royale_capture_context6_frame060.cpp",
+      "pubg_mobile_battle_royale/pubg_mobile_battle_royale_capture_context6_frame061.cpp",
+      "pubg_mobile_battle_royale/pubg_mobile_battle_royale_capture_context6_frame062.cpp",
+      "pubg_mobile_battle_royale/pubg_mobile_battle_royale_capture_context6_frame063.cpp",
+      "pubg_mobile_battle_royale/pubg_mobile_battle_royale_capture_context6_frame064.cpp",
+      "pubg_mobile_battle_royale/pubg_mobile_battle_royale_capture_context6_frame065.cpp",
+      "pubg_mobile_battle_royale/pubg_mobile_battle_royale_capture_context6_frame066.cpp",
+      "pubg_mobile_battle_royale/pubg_mobile_battle_royale_capture_context6_frame067.cpp",
+      "pubg_mobile_battle_royale/pubg_mobile_battle_royale_capture_context6_frame068.cpp",
+      "pubg_mobile_battle_royale/pubg_mobile_battle_royale_capture_context6_frame069.cpp",
+      "pubg_mobile_battle_royale/pubg_mobile_battle_royale_capture_context6_frame070.cpp",
+      "pubg_mobile_battle_royale/pubg_mobile_battle_royale_capture_context6_frame071.cpp",
+      "pubg_mobile_battle_royale/pubg_mobile_battle_royale_capture_context6_frame072.cpp",
+      "pubg_mobile_battle_royale/pubg_mobile_battle_royale_capture_context6_frame073.cpp",
+      "pubg_mobile_battle_royale/pubg_mobile_battle_royale_capture_context6_frame074.cpp",
+      "pubg_mobile_battle_royale/pubg_mobile_battle_royale_capture_context6_frame075.cpp",
+      "pubg_mobile_battle_royale/pubg_mobile_battle_royale_capture_context6_frame076.cpp",
+      "pubg_mobile_battle_royale/pubg_mobile_battle_royale_capture_context6_frame077.cpp",
+      "pubg_mobile_battle_royale/pubg_mobile_battle_royale_capture_context6_frame078.cpp",
+      "pubg_mobile_battle_royale/pubg_mobile_battle_royale_capture_context6_frame079.cpp",
+      "pubg_mobile_battle_royale/pubg_mobile_battle_royale_capture_context6_frame080.cpp",
+      "pubg_mobile_battle_royale/pubg_mobile_battle_royale_capture_context6_frame081.cpp",
+      "pubg_mobile_battle_royale/pubg_mobile_battle_royale_capture_context6_frame082.cpp",
+      "pubg_mobile_battle_royale/pubg_mobile_battle_royale_capture_context6_frame083.cpp",
+      "pubg_mobile_battle_royale/pubg_mobile_battle_royale_capture_context6_frame084.cpp",
+      "pubg_mobile_battle_royale/pubg_mobile_battle_royale_capture_context6_frame085.cpp",
+      "pubg_mobile_battle_royale/pubg_mobile_battle_royale_capture_context6_frame086.cpp",
+      "pubg_mobile_battle_royale/pubg_mobile_battle_royale_capture_context6_frame087.cpp",
+      "pubg_mobile_battle_royale/pubg_mobile_battle_royale_capture_context6_frame088.cpp",
+      "pubg_mobile_battle_royale/pubg_mobile_battle_royale_capture_context6_frame089.cpp",
+      "pubg_mobile_battle_royale/pubg_mobile_battle_royale_capture_context6_frame090.cpp",
+      "pubg_mobile_battle_royale/pubg_mobile_battle_royale_capture_context6_frame091.cpp",
+      "pubg_mobile_battle_royale/pubg_mobile_battle_royale_capture_context6_frame092.cpp",
+      "pubg_mobile_battle_royale/pubg_mobile_battle_royale_capture_context6_frame093.cpp",
+      "pubg_mobile_battle_royale/pubg_mobile_battle_royale_capture_context6_frame094.cpp",
+      "pubg_mobile_battle_royale/pubg_mobile_battle_royale_capture_context6_frame095.cpp",
+      "pubg_mobile_battle_royale/pubg_mobile_battle_royale_capture_context6_frame096.cpp",
+      "pubg_mobile_battle_royale/pubg_mobile_battle_royale_capture_context6_frame097.cpp",
+      "pubg_mobile_battle_royale/pubg_mobile_battle_royale_capture_context6_frame098.cpp",
+      "pubg_mobile_battle_royale/pubg_mobile_battle_royale_capture_context6_frame099.cpp",
+      "pubg_mobile_battle_royale/pubg_mobile_battle_royale_capture_context6_frame100.cpp",
+      "pubg_mobile_battle_royale/pubg_mobile_battle_royale_capture_context5_frame001.cpp",
+      "pubg_mobile_battle_royale/pubg_mobile_battle_royale_frame001.cpp",
+    ],
+    [ "pubg_mobile_battle_royale/pubg_mobile_battle_royale.angledata.gz" ],
   ],
   [
     "pubg_mobile_lite",
@@ -3614,7 +4139,116 @@
       "pubg_mobile_lite/pubg_mobile_lite_capture_context1_frame009.cpp",
       "pubg_mobile_lite/pubg_mobile_lite_capture_context1_frame010.cpp",
     ],
-    "pubg_mobile_lite/pubg_mobile_lite_capture_context1.angledata.gz",
+    [ "pubg_mobile_lite/pubg_mobile_lite_capture_context1.angledata.gz" ],
+  ],
+  [
+    "pubg_mobile_skydive",
+    6,
+    [
+      "pubg_mobile_skydive/pubg_mobile_skydive_capture_context6_frame001.cpp",
+      "pubg_mobile_skydive/pubg_mobile_skydive_capture_context6_frame002.cpp",
+      "pubg_mobile_skydive/pubg_mobile_skydive_capture_context6_frame003.cpp",
+      "pubg_mobile_skydive/pubg_mobile_skydive_capture_context6_frame004.cpp",
+      "pubg_mobile_skydive/pubg_mobile_skydive_capture_context6_frame005.cpp",
+      "pubg_mobile_skydive/pubg_mobile_skydive_capture_context6_frame006.cpp",
+      "pubg_mobile_skydive/pubg_mobile_skydive_capture_context6_frame007.cpp",
+      "pubg_mobile_skydive/pubg_mobile_skydive_capture_context6_frame008.cpp",
+      "pubg_mobile_skydive/pubg_mobile_skydive_capture_context6_frame009.cpp",
+      "pubg_mobile_skydive/pubg_mobile_skydive_capture_context6_frame010.cpp",
+      "pubg_mobile_skydive/pubg_mobile_skydive_capture_context6_frame011.cpp",
+      "pubg_mobile_skydive/pubg_mobile_skydive_capture_context6_frame012.cpp",
+      "pubg_mobile_skydive/pubg_mobile_skydive_capture_context6_frame013.cpp",
+      "pubg_mobile_skydive/pubg_mobile_skydive_capture_context6_frame014.cpp",
+      "pubg_mobile_skydive/pubg_mobile_skydive_capture_context6_frame015.cpp",
+      "pubg_mobile_skydive/pubg_mobile_skydive_capture_context6_frame016.cpp",
+      "pubg_mobile_skydive/pubg_mobile_skydive_capture_context6_frame017.cpp",
+      "pubg_mobile_skydive/pubg_mobile_skydive_capture_context6_frame018.cpp",
+      "pubg_mobile_skydive/pubg_mobile_skydive_capture_context6_frame019.cpp",
+      "pubg_mobile_skydive/pubg_mobile_skydive_capture_context6_frame020.cpp",
+      "pubg_mobile_skydive/pubg_mobile_skydive_capture_context6_frame021.cpp",
+      "pubg_mobile_skydive/pubg_mobile_skydive_capture_context6_frame022.cpp",
+      "pubg_mobile_skydive/pubg_mobile_skydive_capture_context6_frame023.cpp",
+      "pubg_mobile_skydive/pubg_mobile_skydive_capture_context6_frame024.cpp",
+      "pubg_mobile_skydive/pubg_mobile_skydive_capture_context6_frame025.cpp",
+      "pubg_mobile_skydive/pubg_mobile_skydive_capture_context6_frame026.cpp",
+      "pubg_mobile_skydive/pubg_mobile_skydive_capture_context6_frame027.cpp",
+      "pubg_mobile_skydive/pubg_mobile_skydive_capture_context6_frame028.cpp",
+      "pubg_mobile_skydive/pubg_mobile_skydive_capture_context6_frame029.cpp",
+      "pubg_mobile_skydive/pubg_mobile_skydive_capture_context6_frame030.cpp",
+      "pubg_mobile_skydive/pubg_mobile_skydive_capture_context6_frame031.cpp",
+      "pubg_mobile_skydive/pubg_mobile_skydive_capture_context6_frame032.cpp",
+      "pubg_mobile_skydive/pubg_mobile_skydive_capture_context6_frame033.cpp",
+      "pubg_mobile_skydive/pubg_mobile_skydive_capture_context6_frame034.cpp",
+      "pubg_mobile_skydive/pubg_mobile_skydive_capture_context6_frame035.cpp",
+      "pubg_mobile_skydive/pubg_mobile_skydive_capture_context6_frame036.cpp",
+      "pubg_mobile_skydive/pubg_mobile_skydive_capture_context6_frame037.cpp",
+      "pubg_mobile_skydive/pubg_mobile_skydive_capture_context6_frame038.cpp",
+      "pubg_mobile_skydive/pubg_mobile_skydive_capture_context6_frame039.cpp",
+      "pubg_mobile_skydive/pubg_mobile_skydive_capture_context6_frame040.cpp",
+      "pubg_mobile_skydive/pubg_mobile_skydive_capture_context6_frame041.cpp",
+      "pubg_mobile_skydive/pubg_mobile_skydive_capture_context6_frame042.cpp",
+      "pubg_mobile_skydive/pubg_mobile_skydive_capture_context6_frame043.cpp",
+      "pubg_mobile_skydive/pubg_mobile_skydive_capture_context6_frame044.cpp",
+      "pubg_mobile_skydive/pubg_mobile_skydive_capture_context6_frame045.cpp",
+      "pubg_mobile_skydive/pubg_mobile_skydive_capture_context6_frame046.cpp",
+      "pubg_mobile_skydive/pubg_mobile_skydive_capture_context6_frame047.cpp",
+      "pubg_mobile_skydive/pubg_mobile_skydive_capture_context6_frame048.cpp",
+      "pubg_mobile_skydive/pubg_mobile_skydive_capture_context6_frame049.cpp",
+      "pubg_mobile_skydive/pubg_mobile_skydive_capture_context6_frame050.cpp",
+      "pubg_mobile_skydive/pubg_mobile_skydive_capture_context6_frame051.cpp",
+      "pubg_mobile_skydive/pubg_mobile_skydive_capture_context6_frame052.cpp",
+      "pubg_mobile_skydive/pubg_mobile_skydive_capture_context6_frame053.cpp",
+      "pubg_mobile_skydive/pubg_mobile_skydive_capture_context6_frame054.cpp",
+      "pubg_mobile_skydive/pubg_mobile_skydive_capture_context6_frame055.cpp",
+      "pubg_mobile_skydive/pubg_mobile_skydive_capture_context6_frame056.cpp",
+      "pubg_mobile_skydive/pubg_mobile_skydive_capture_context6_frame057.cpp",
+      "pubg_mobile_skydive/pubg_mobile_skydive_capture_context6_frame058.cpp",
+      "pubg_mobile_skydive/pubg_mobile_skydive_capture_context6_frame059.cpp",
+      "pubg_mobile_skydive/pubg_mobile_skydive_capture_context6_frame060.cpp",
+      "pubg_mobile_skydive/pubg_mobile_skydive_capture_context6_frame061.cpp",
+      "pubg_mobile_skydive/pubg_mobile_skydive_capture_context6_frame062.cpp",
+      "pubg_mobile_skydive/pubg_mobile_skydive_capture_context6_frame063.cpp",
+      "pubg_mobile_skydive/pubg_mobile_skydive_capture_context6_frame064.cpp",
+      "pubg_mobile_skydive/pubg_mobile_skydive_capture_context6_frame065.cpp",
+      "pubg_mobile_skydive/pubg_mobile_skydive_capture_context6_frame066.cpp",
+      "pubg_mobile_skydive/pubg_mobile_skydive_capture_context6_frame067.cpp",
+      "pubg_mobile_skydive/pubg_mobile_skydive_capture_context6_frame068.cpp",
+      "pubg_mobile_skydive/pubg_mobile_skydive_capture_context6_frame069.cpp",
+      "pubg_mobile_skydive/pubg_mobile_skydive_capture_context6_frame070.cpp",
+      "pubg_mobile_skydive/pubg_mobile_skydive_capture_context6_frame071.cpp",
+      "pubg_mobile_skydive/pubg_mobile_skydive_capture_context6_frame072.cpp",
+      "pubg_mobile_skydive/pubg_mobile_skydive_capture_context6_frame073.cpp",
+      "pubg_mobile_skydive/pubg_mobile_skydive_capture_context6_frame074.cpp",
+      "pubg_mobile_skydive/pubg_mobile_skydive_capture_context6_frame075.cpp",
+      "pubg_mobile_skydive/pubg_mobile_skydive_capture_context6_frame076.cpp",
+      "pubg_mobile_skydive/pubg_mobile_skydive_capture_context6_frame077.cpp",
+      "pubg_mobile_skydive/pubg_mobile_skydive_capture_context6_frame078.cpp",
+      "pubg_mobile_skydive/pubg_mobile_skydive_capture_context6_frame079.cpp",
+      "pubg_mobile_skydive/pubg_mobile_skydive_capture_context6_frame080.cpp",
+      "pubg_mobile_skydive/pubg_mobile_skydive_capture_context6_frame081.cpp",
+      "pubg_mobile_skydive/pubg_mobile_skydive_capture_context6_frame082.cpp",
+      "pubg_mobile_skydive/pubg_mobile_skydive_capture_context6_frame083.cpp",
+      "pubg_mobile_skydive/pubg_mobile_skydive_capture_context6_frame084.cpp",
+      "pubg_mobile_skydive/pubg_mobile_skydive_capture_context6_frame085.cpp",
+      "pubg_mobile_skydive/pubg_mobile_skydive_capture_context6_frame086.cpp",
+      "pubg_mobile_skydive/pubg_mobile_skydive_capture_context6_frame087.cpp",
+      "pubg_mobile_skydive/pubg_mobile_skydive_capture_context6_frame088.cpp",
+      "pubg_mobile_skydive/pubg_mobile_skydive_capture_context6_frame089.cpp",
+      "pubg_mobile_skydive/pubg_mobile_skydive_capture_context6_frame090.cpp",
+      "pubg_mobile_skydive/pubg_mobile_skydive_capture_context6_frame091.cpp",
+      "pubg_mobile_skydive/pubg_mobile_skydive_capture_context6_frame092.cpp",
+      "pubg_mobile_skydive/pubg_mobile_skydive_capture_context6_frame093.cpp",
+      "pubg_mobile_skydive/pubg_mobile_skydive_capture_context6_frame094.cpp",
+      "pubg_mobile_skydive/pubg_mobile_skydive_capture_context6_frame095.cpp",
+      "pubg_mobile_skydive/pubg_mobile_skydive_capture_context6_frame096.cpp",
+      "pubg_mobile_skydive/pubg_mobile_skydive_capture_context6_frame097.cpp",
+      "pubg_mobile_skydive/pubg_mobile_skydive_capture_context6_frame098.cpp",
+      "pubg_mobile_skydive/pubg_mobile_skydive_capture_context6_frame099.cpp",
+      "pubg_mobile_skydive/pubg_mobile_skydive_capture_context6_frame100.cpp",
+      "pubg_mobile_skydive/pubg_mobile_skydive_capture_context5_frame001.cpp",
+      "pubg_mobile_skydive/pubg_mobile_skydive_frame001.cpp",
+    ],
+    [ "pubg_mobile_skydive/pubg_mobile_skydive.angledata.gz" ],
   ],
   [
     "ragnarok_m_eternal_love",
@@ -3631,7 +4265,7 @@
       "ragnarok_m_eternal_love/ragnarok_m_eternal_love_capture_context1_frame009.cpp",
       "ragnarok_m_eternal_love/ragnarok_m_eternal_love_capture_context1_frame010.cpp",
     ],
-    "ragnarok_m_eternal_love/ragnarok_m_eternal_love_capture_context1.angledata.gz",
+    [ "ragnarok_m_eternal_love/ragnarok_m_eternal_love_capture_context1.angledata.gz" ],
   ],
   [
     "raid_shadow_legends",
@@ -3648,7 +4282,7 @@
       "raid_shadow_legends/raid_shadow_legends_capture_context1_frame009.cpp",
       "raid_shadow_legends/raid_shadow_legends_capture_context1_frame010.cpp",
     ],
-    "raid_shadow_legends/raid_shadow_legends_capture_context1.angledata.gz",
+    [ "raid_shadow_legends/raid_shadow_legends_capture_context1.angledata.gz" ],
   ],
   [
     "real_commando_secret_mission",
@@ -3665,7 +4299,7 @@
       "real_commando_secret_mission/real_commando_secret_mission_capture_context1_frame009.cpp",
       "real_commando_secret_mission/real_commando_secret_mission_capture_context1_frame010.cpp",
     ],
-    "real_commando_secret_mission/real_commando_secret_mission_capture_context1.angledata.gz",
+    [ "real_commando_secret_mission/real_commando_secret_mission_capture_context1.angledata.gz" ],
   ],
   [
     "real_cricket_20",
@@ -3682,7 +4316,7 @@
       "real_cricket_20/real_cricket_20_capture_context1_frame009.cpp",
       "real_cricket_20/real_cricket_20_capture_context1_frame010.cpp",
     ],
-    "real_cricket_20/real_cricket_20_capture_context1.angledata.gz",
+    [ "real_cricket_20/real_cricket_20_capture_context1.angledata.gz" ],
   ],
   [
     "real_gangster_crime",
@@ -3699,7 +4333,7 @@
       "real_gangster_crime/real_gangster_crime_capture_context1_frame009.cpp",
       "real_gangster_crime/real_gangster_crime_capture_context1_frame010.cpp",
     ],
-    "real_gangster_crime/real_gangster_crime_capture_context1.angledata.gz",
+    [ "real_gangster_crime/real_gangster_crime_capture_context1.angledata.gz" ],
   ],
   [
     "rise_of_kingdoms",
@@ -3716,7 +4350,7 @@
       "rise_of_kingdoms/rise_of_kingdoms_capture_context1_frame009.cpp",
       "rise_of_kingdoms/rise_of_kingdoms_capture_context1_frame010.cpp",
     ],
-    "rise_of_kingdoms/rise_of_kingdoms_capture_context1.angledata.gz",
+    [ "rise_of_kingdoms/rise_of_kingdoms_capture_context1.angledata.gz" ],
   ],
   [
     "romancing_saga",
@@ -3733,7 +4367,7 @@
       "romancing_saga/romancing_saga_capture_context1_frame009.cpp",
       "romancing_saga/romancing_saga_capture_context1_frame010.cpp",
     ],
-    "romancing_saga/romancing_saga_capture_context1.angledata.gz",
+    [ "romancing_saga/romancing_saga_capture_context1.angledata.gz" ],
   ],
   [
     "rope_hero_vice_town",
@@ -3750,7 +4384,7 @@
       "rope_hero_vice_town/rope_hero_vice_town_capture_context1_frame009.cpp",
       "rope_hero_vice_town/rope_hero_vice_town_capture_context1_frame010.cpp",
     ],
-    "rope_hero_vice_town/rope_hero_vice_town_capture_context1.angledata.gz",
+    [ "rope_hero_vice_town/rope_hero_vice_town_capture_context1.angledata.gz" ],
   ],
   [
     "saint_seiya_awakening",
@@ -3767,7 +4401,7 @@
       "saint_seiya_awakening/saint_seiya_awakening_capture_context1_frame009.cpp",
       "saint_seiya_awakening/saint_seiya_awakening_capture_context1_frame010.cpp",
     ],
-    "saint_seiya_awakening/saint_seiya_awakening_capture_context1.angledata.gz",
+    [ "saint_seiya_awakening/saint_seiya_awakening_capture_context1.angledata.gz" ],
   ],
   [
     "sakura_school_simulator",
@@ -3804,7 +4438,46 @@
       "sakura_school_simulator/sakura_school_simulator_capture_context2_frame029.cpp",
       "sakura_school_simulator/sakura_school_simulator_capture_context2_frame030.cpp",
     ],
-    "sakura_school_simulator/sakura_school_simulator_capture_context2.angledata.gz",
+    [ "sakura_school_simulator/sakura_school_simulator_capture_context2.angledata.gz" ],
+  ],
+  [
+    "scrabble_go",
+    2,
+    [
+      "scrabble_go/scrabble_go_capture_context2_frame001.cpp",
+      "scrabble_go/scrabble_go_capture_context2_frame002.cpp",
+      "scrabble_go/scrabble_go_capture_context2_frame003.cpp",
+      "scrabble_go/scrabble_go_capture_context2_frame004.cpp",
+      "scrabble_go/scrabble_go_capture_context2_frame005.cpp",
+      "scrabble_go/scrabble_go_capture_context2_frame006.cpp",
+      "scrabble_go/scrabble_go_capture_context2_frame007.cpp",
+      "scrabble_go/scrabble_go_capture_context2_frame008.cpp",
+      "scrabble_go/scrabble_go_capture_context2_frame009.cpp",
+      "scrabble_go/scrabble_go_capture_context2_frame010.cpp",
+      "scrabble_go/scrabble_go_capture_context2_frame011.cpp",
+      "scrabble_go/scrabble_go_capture_context2_frame012.cpp",
+      "scrabble_go/scrabble_go_capture_context2_frame013.cpp",
+      "scrabble_go/scrabble_go_capture_context2_frame014.cpp",
+      "scrabble_go/scrabble_go_capture_context2_frame015.cpp",
+      "scrabble_go/scrabble_go_capture_context2_frame016.cpp",
+      "scrabble_go/scrabble_go_capture_context2_frame017.cpp",
+      "scrabble_go/scrabble_go_capture_context2_frame018.cpp",
+      "scrabble_go/scrabble_go_capture_context2_frame019.cpp",
+      "scrabble_go/scrabble_go_capture_context2_frame020.cpp",
+      "scrabble_go/scrabble_go_capture_context2_frame021.cpp",
+      "scrabble_go/scrabble_go_capture_context2_frame022.cpp",
+      "scrabble_go/scrabble_go_capture_context2_frame023.cpp",
+      "scrabble_go/scrabble_go_capture_context2_frame024.cpp",
+      "scrabble_go/scrabble_go_capture_context2_frame025.cpp",
+      "scrabble_go/scrabble_go_capture_context2_frame026.cpp",
+      "scrabble_go/scrabble_go_capture_context2_frame027.cpp",
+      "scrabble_go/scrabble_go_capture_context2_frame028.cpp",
+      "scrabble_go/scrabble_go_capture_context2_frame029.cpp",
+      "scrabble_go/scrabble_go_capture_context2_frame030.cpp",
+      "scrabble_go/scrabble_go_capture_context2_frame031.cpp",
+      "scrabble_go/scrabble_go_capture_shared.cpp",
+    ],
+    [ "scrabble_go/scrabble_go.angledata.gz" ],
   ],
   [
     "shadow_fight_2",
@@ -3821,7 +4494,7 @@
       "shadow_fight_2/shadow_fight_2_capture_context1_frame009.cpp",
       "shadow_fight_2/shadow_fight_2_capture_context1_frame010.cpp",
     ],
-    "shadow_fight_2/shadow_fight_2_capture_context1.angledata.gz",
+    [ "shadow_fight_2/shadow_fight_2_capture_context1.angledata.gz" ],
   ],
   [
     "slingshot_test1",
@@ -4028,7 +4701,7 @@
       "slingshot_test1/slingshot_test1_capture_context2_frame199.cpp",
       "slingshot_test1/slingshot_test1_capture_context2_frame200.cpp",
     ],
-    "slingshot_test1/slingshot_test1_capture_context2.angledata.gz",
+    [ "slingshot_test1/slingshot_test1_capture_context2.angledata.gz" ],
   ],
   [
     "slingshot_test2",
@@ -4235,7 +4908,7 @@
       "slingshot_test2/slingshot_test2_capture_context2_frame199.cpp",
       "slingshot_test2/slingshot_test2_capture_context2_frame200.cpp",
     ],
-    "slingshot_test2/slingshot_test2_capture_context2.angledata.gz",
+    [ "slingshot_test2/slingshot_test2_capture_context2.angledata.gz" ],
   ],
   [
     "sniper_3d",
@@ -4252,7 +4925,65 @@
       "sniper_3d/sniper_3d_capture_context1_frame009.cpp",
       "sniper_3d/sniper_3d_capture_context1_frame010.cpp",
     ],
-    "sniper_3d/sniper_3d_capture_context1.angledata.gz",
+    [ "sniper_3d/sniper_3d_capture_context1.angledata.gz" ],
+  ],
+  [
+    "sonic_the_hedgehog",
+    2,
+    [
+      "sonic_the_hedgehog/sonic_the_hedgehog_capture_context2_frame001.cpp",
+      "sonic_the_hedgehog/sonic_the_hedgehog_capture_context2_frame002.cpp",
+      "sonic_the_hedgehog/sonic_the_hedgehog_capture_context2_frame003.cpp",
+      "sonic_the_hedgehog/sonic_the_hedgehog_capture_context2_frame004.cpp",
+      "sonic_the_hedgehog/sonic_the_hedgehog_capture_context2_frame005.cpp",
+      "sonic_the_hedgehog/sonic_the_hedgehog_capture_context2_frame006.cpp",
+      "sonic_the_hedgehog/sonic_the_hedgehog_capture_context2_frame007.cpp",
+      "sonic_the_hedgehog/sonic_the_hedgehog_capture_context2_frame008.cpp",
+      "sonic_the_hedgehog/sonic_the_hedgehog_capture_context2_frame009.cpp",
+      "sonic_the_hedgehog/sonic_the_hedgehog_capture_context2_frame010.cpp",
+      "sonic_the_hedgehog/sonic_the_hedgehog_capture_context2_frame011.cpp",
+      "sonic_the_hedgehog/sonic_the_hedgehog_capture_context2_frame012.cpp",
+      "sonic_the_hedgehog/sonic_the_hedgehog_capture_context2_frame013.cpp",
+      "sonic_the_hedgehog/sonic_the_hedgehog_capture_context2_frame014.cpp",
+      "sonic_the_hedgehog/sonic_the_hedgehog_capture_context2_frame015.cpp",
+      "sonic_the_hedgehog/sonic_the_hedgehog_capture_context2_frame016.cpp",
+      "sonic_the_hedgehog/sonic_the_hedgehog_capture_context2_frame017.cpp",
+      "sonic_the_hedgehog/sonic_the_hedgehog_capture_context2_frame018.cpp",
+      "sonic_the_hedgehog/sonic_the_hedgehog_capture_context2_frame019.cpp",
+      "sonic_the_hedgehog/sonic_the_hedgehog_capture_context2_frame020.cpp",
+      "sonic_the_hedgehog/sonic_the_hedgehog_capture_context2_frame021.cpp",
+      "sonic_the_hedgehog/sonic_the_hedgehog_capture_context2_frame022.cpp",
+      "sonic_the_hedgehog/sonic_the_hedgehog_capture_context2_frame023.cpp",
+      "sonic_the_hedgehog/sonic_the_hedgehog_capture_context2_frame024.cpp",
+      "sonic_the_hedgehog/sonic_the_hedgehog_capture_context2_frame025.cpp",
+      "sonic_the_hedgehog/sonic_the_hedgehog_capture_context2_frame026.cpp",
+      "sonic_the_hedgehog/sonic_the_hedgehog_capture_context2_frame027.cpp",
+      "sonic_the_hedgehog/sonic_the_hedgehog_capture_context2_frame028.cpp",
+      "sonic_the_hedgehog/sonic_the_hedgehog_capture_context2_frame029.cpp",
+      "sonic_the_hedgehog/sonic_the_hedgehog_capture_context2_frame030.cpp",
+      "sonic_the_hedgehog/sonic_the_hedgehog_capture_context2_frame031.cpp",
+      "sonic_the_hedgehog/sonic_the_hedgehog_capture_context2_frame032.cpp",
+      "sonic_the_hedgehog/sonic_the_hedgehog_capture_context2_frame033.cpp",
+      "sonic_the_hedgehog/sonic_the_hedgehog_capture_context2_frame034.cpp",
+      "sonic_the_hedgehog/sonic_the_hedgehog_capture_context2_frame035.cpp",
+      "sonic_the_hedgehog/sonic_the_hedgehog_capture_context2_frame036.cpp",
+      "sonic_the_hedgehog/sonic_the_hedgehog_capture_context2_frame037.cpp",
+      "sonic_the_hedgehog/sonic_the_hedgehog_capture_context2_frame038.cpp",
+      "sonic_the_hedgehog/sonic_the_hedgehog_capture_context2_frame039.cpp",
+      "sonic_the_hedgehog/sonic_the_hedgehog_capture_context2_frame040.cpp",
+      "sonic_the_hedgehog/sonic_the_hedgehog_capture_context2_frame041.cpp",
+      "sonic_the_hedgehog/sonic_the_hedgehog_capture_context2_frame042.cpp",
+      "sonic_the_hedgehog/sonic_the_hedgehog_capture_context2_frame043.cpp",
+      "sonic_the_hedgehog/sonic_the_hedgehog_capture_context2_frame044.cpp",
+      "sonic_the_hedgehog/sonic_the_hedgehog_capture_context2_frame045.cpp",
+      "sonic_the_hedgehog/sonic_the_hedgehog_capture_context2_frame046.cpp",
+      "sonic_the_hedgehog/sonic_the_hedgehog_capture_context2_frame047.cpp",
+      "sonic_the_hedgehog/sonic_the_hedgehog_capture_context2_frame048.cpp",
+      "sonic_the_hedgehog/sonic_the_hedgehog_capture_context2_frame049.cpp",
+      "sonic_the_hedgehog/sonic_the_hedgehog_capture_context2_frame050.cpp",
+      "sonic_the_hedgehog/sonic_the_hedgehog_capture_shared.cpp",
+    ],
+    [ "sonic_the_hedgehog/sonic_the_hedgehog.angledata.gz" ],
   ],
   [
     "standoff_2",
@@ -4269,7 +5000,7 @@
       "standoff_2/standoff_2_capture_context1_frame009.cpp",
       "standoff_2/standoff_2_capture_context1_frame010.cpp",
     ],
-    "standoff_2/standoff_2_capture_context1.angledata.gz",
+    [ "standoff_2/standoff_2_capture_context1.angledata.gz" ],
   ],
   [
     "subway_princess_runner",
@@ -4286,7 +5017,7 @@
       "subway_princess_runner/subway_princess_runner_capture_context2_frame009.cpp",
       "subway_princess_runner/subway_princess_runner_capture_context2_frame010.cpp",
     ],
-    "subway_princess_runner/subway_princess_runner_capture_context2.angledata.gz",
+    [ "subway_princess_runner/subway_princess_runner_capture_context2.angledata.gz" ],
   ],
   [
     "subway_surfers",
@@ -4303,7 +5034,7 @@
       "subway_surfers/subway_surfers_capture_context1_frame009.cpp",
       "subway_surfers/subway_surfers_capture_context1_frame010.cpp",
     ],
-    "subway_surfers/subway_surfers_capture_context1.angledata.gz",
+    [ "subway_surfers/subway_surfers_capture_context1.angledata.gz" ],
   ],
   [
     "summoners_war",
@@ -4360,7 +5091,7 @@
       "summoners_war/summoners_war_capture_context2_frame049.cpp",
       "summoners_war/summoners_war_capture_context2_frame050.cpp",
     ],
-    "summoners_war/summoners_war_capture_context2.angledata.gz",
+    [ "summoners_war/summoners_war_capture_context2.angledata.gz" ],
   ],
   [
     "talking_tom_hero_dash",
@@ -4377,7 +5108,7 @@
       "talking_tom_hero_dash/talking_tom_hero_dash_capture_context1_frame009.cpp",
       "talking_tom_hero_dash/talking_tom_hero_dash_capture_context1_frame010.cpp",
     ],
-    "talking_tom_hero_dash/talking_tom_hero_dash_capture_context1.angledata.gz",
+    [ "talking_tom_hero_dash/talking_tom_hero_dash_capture_context1.angledata.gz" ],
   ],
   [
     "temple_run_2",
@@ -4394,7 +5125,7 @@
       "temple_run_2/temple_run_2_capture_context1_frame009.cpp",
       "temple_run_2/temple_run_2_capture_context1_frame010.cpp",
     ],
-    "temple_run_2/temple_run_2_capture_context1.angledata.gz",
+    [ "temple_run_2/temple_run_2_capture_context1.angledata.gz" ],
   ],
   [
     "temple_run_300",
@@ -4412,7 +5143,7 @@
       "temple_run_300/temple_run_300_capture_context1_frame010.cpp",
       "temple_run_300/temple_run_300_capture_context1_frame011.cpp",
     ],
-    "temple_run_300/temple_run_300_capture_context1.angledata.gz",
+    [ "temple_run_300/temple_run_300_capture_context1.angledata.gz" ],
   ],
   [
     "toon_blast",
@@ -4519,7 +5250,7 @@
       "toon_blast/toon_blast_capture_context2_frame099.cpp",
       "toon_blast/toon_blast_capture_context2_frame100.cpp",
     ],
-    "toon_blast/toon_blast_capture_context2.angledata.gz",
+    [ "toon_blast/toon_blast_capture_context2.angledata.gz" ],
   ],
   [
     "township",
@@ -4536,7 +5267,7 @@
       "township/township_capture_context2_frame009.cpp",
       "township/township_capture_context2_frame010.cpp",
     ],
-    "township/township_capture_context2.angledata.gz",
+    [ "township/township_capture_context2.angledata.gz" ],
   ],
   [
     "trex_200",
@@ -4554,7 +5285,7 @@
       "trex_200/trex_200_capture_context1_frame010.cpp",
       "trex_200/trex_200_capture_context1_frame011.cpp",
     ],
-    "trex_200/trex_200_capture_context1.angledata.gz",
+    [ "trex_200/trex_200_capture_context1.angledata.gz" ],
   ],
   [
     "whatsapp",
@@ -4741,7 +5472,151 @@
       "whatsapp/whatsapp_capture_context1_frame179.cpp",
       "whatsapp/whatsapp_capture_context1_frame180.cpp",
     ],
-    "whatsapp/whatsapp_capture_context1.angledata.gz",
+    [ "whatsapp/whatsapp_capture_context1.angledata.gz" ],
+  ],
+  [
+    "words_with_friends_2",
+    1,
+    [
+      "words_with_friends_2/words_with_friends_2_capture_context1_frame001.cpp",
+      "words_with_friends_2/words_with_friends_2_capture_context1_frame002.cpp",
+      "words_with_friends_2/words_with_friends_2_capture_context1_frame003.cpp",
+      "words_with_friends_2/words_with_friends_2_capture_context1_frame004.cpp",
+      "words_with_friends_2/words_with_friends_2_capture_context1_frame005.cpp",
+      "words_with_friends_2/words_with_friends_2_capture_context1_frame006.cpp",
+      "words_with_friends_2/words_with_friends_2_capture_context1_frame007.cpp",
+      "words_with_friends_2/words_with_friends_2_capture_context1_frame008.cpp",
+      "words_with_friends_2/words_with_friends_2_capture_context1_frame009.cpp",
+      "words_with_friends_2/words_with_friends_2_capture_context1_frame010.cpp",
+      "words_with_friends_2/words_with_friends_2_capture_context1_frame011.cpp",
+      "words_with_friends_2/words_with_friends_2_capture_context1_frame012.cpp",
+      "words_with_friends_2/words_with_friends_2_capture_context1_frame013.cpp",
+      "words_with_friends_2/words_with_friends_2_capture_context1_frame014.cpp",
+      "words_with_friends_2/words_with_friends_2_capture_context1_frame015.cpp",
+      "words_with_friends_2/words_with_friends_2_capture_context1_frame016.cpp",
+      "words_with_friends_2/words_with_friends_2_capture_context1_frame017.cpp",
+      "words_with_friends_2/words_with_friends_2_capture_context1_frame018.cpp",
+      "words_with_friends_2/words_with_friends_2_capture_context1_frame019.cpp",
+      "words_with_friends_2/words_with_friends_2_capture_context1_frame020.cpp",
+      "words_with_friends_2/words_with_friends_2_capture_context1_frame021.cpp",
+      "words_with_friends_2/words_with_friends_2_capture_context1_frame022.cpp",
+      "words_with_friends_2/words_with_friends_2_capture_context1_frame023.cpp",
+      "words_with_friends_2/words_with_friends_2_capture_context1_frame024.cpp",
+      "words_with_friends_2/words_with_friends_2_capture_context1_frame025.cpp",
+      "words_with_friends_2/words_with_friends_2_capture_context1_frame026.cpp",
+      "words_with_friends_2/words_with_friends_2_capture_context1_frame027.cpp",
+      "words_with_friends_2/words_with_friends_2_capture_context1_frame028.cpp",
+      "words_with_friends_2/words_with_friends_2_capture_context1_frame029.cpp",
+      "words_with_friends_2/words_with_friends_2_capture_context1_frame030.cpp",
+      "words_with_friends_2/words_with_friends_2_capture_shared.cpp",
+    ],
+    [ "words_with_friends_2/words_with_friends_2.angledata.gz" ],
+  ],
+  [
+    "wordscapes",
+    3,
+    [
+      "wordscapes/wordscapes_capture_context3_frame001.cpp",
+      "wordscapes/wordscapes_capture_context3_frame002.cpp",
+      "wordscapes/wordscapes_capture_context3_frame003.cpp",
+      "wordscapes/wordscapes_capture_context3_frame004.cpp",
+      "wordscapes/wordscapes_capture_context3_frame005.cpp",
+      "wordscapes/wordscapes_capture_context3_frame006.cpp",
+      "wordscapes/wordscapes_capture_context3_frame007.cpp",
+      "wordscapes/wordscapes_capture_context3_frame008.cpp",
+      "wordscapes/wordscapes_capture_context3_frame009.cpp",
+      "wordscapes/wordscapes_capture_context3_frame010.cpp",
+      "wordscapes/wordscapes_capture_context3_frame011.cpp",
+      "wordscapes/wordscapes_capture_context3_frame012.cpp",
+      "wordscapes/wordscapes_capture_context3_frame013.cpp",
+      "wordscapes/wordscapes_capture_context3_frame014.cpp",
+      "wordscapes/wordscapes_capture_context3_frame015.cpp",
+      "wordscapes/wordscapes_capture_context3_frame016.cpp",
+      "wordscapes/wordscapes_capture_context3_frame017.cpp",
+      "wordscapes/wordscapes_capture_context3_frame018.cpp",
+      "wordscapes/wordscapes_capture_context3_frame019.cpp",
+      "wordscapes/wordscapes_capture_context3_frame020.cpp",
+      "wordscapes/wordscapes_capture_context3_frame021.cpp",
+      "wordscapes/wordscapes_capture_context3_frame022.cpp",
+      "wordscapes/wordscapes_capture_context3_frame023.cpp",
+      "wordscapes/wordscapes_capture_context3_frame024.cpp",
+      "wordscapes/wordscapes_capture_context3_frame025.cpp",
+      "wordscapes/wordscapes_capture_context3_frame026.cpp",
+      "wordscapes/wordscapes_capture_context3_frame027.cpp",
+      "wordscapes/wordscapes_capture_context3_frame028.cpp",
+      "wordscapes/wordscapes_capture_context3_frame029.cpp",
+      "wordscapes/wordscapes_capture_context3_frame030.cpp",
+      "wordscapes/wordscapes_capture_shared.cpp",
+    ],
+    [ "wordscapes/wordscapes.angledata.gz" ],
+  ],
+  [
+    "world_of_kings",
+    3,
+    [
+      "world_of_kings/world_of_kings_capture_context3_frame001.cpp",
+      "world_of_kings/world_of_kings_capture_context3_frame002.cpp",
+      "world_of_kings/world_of_kings_capture_context3_frame003.cpp",
+      "world_of_kings/world_of_kings_capture_context3_frame004.cpp",
+      "world_of_kings/world_of_kings_capture_context3_frame005.cpp",
+      "world_of_kings/world_of_kings_capture_context3_frame006.cpp",
+      "world_of_kings/world_of_kings_capture_context3_frame007.cpp",
+      "world_of_kings/world_of_kings_capture_context3_frame008.cpp",
+      "world_of_kings/world_of_kings_capture_context3_frame009.cpp",
+      "world_of_kings/world_of_kings_capture_context3_frame010.cpp",
+      "world_of_kings/world_of_kings_capture_context3_frame011.cpp",
+      "world_of_kings/world_of_kings_capture_context3_frame012.cpp",
+      "world_of_kings/world_of_kings_capture_context3_frame013.cpp",
+      "world_of_kings/world_of_kings_capture_context3_frame014.cpp",
+      "world_of_kings/world_of_kings_capture_context3_frame015.cpp",
+      "world_of_kings/world_of_kings_capture_context3_frame016.cpp",
+      "world_of_kings/world_of_kings_capture_context3_frame017.cpp",
+      "world_of_kings/world_of_kings_capture_context3_frame018.cpp",
+      "world_of_kings/world_of_kings_capture_context3_frame019.cpp",
+      "world_of_kings/world_of_kings_capture_context3_frame020.cpp",
+      "world_of_kings/world_of_kings_capture_context3_frame021.cpp",
+      "world_of_kings/world_of_kings_capture_context3_frame022.cpp",
+      "world_of_kings/world_of_kings_capture_context3_frame023.cpp",
+      "world_of_kings/world_of_kings_capture_context3_frame024.cpp",
+      "world_of_kings/world_of_kings_capture_context3_frame025.cpp",
+      "world_of_kings/world_of_kings_capture_context3_frame026.cpp",
+      "world_of_kings/world_of_kings_capture_context3_frame027.cpp",
+      "world_of_kings/world_of_kings_capture_context3_frame028.cpp",
+      "world_of_kings/world_of_kings_capture_context3_frame029.cpp",
+      "world_of_kings/world_of_kings_capture_context3_frame030.cpp",
+      "world_of_kings/world_of_kings_capture_context3_frame031.cpp",
+      "world_of_kings/world_of_kings_capture_context3_frame032.cpp",
+      "world_of_kings/world_of_kings_capture_context3_frame033.cpp",
+      "world_of_kings/world_of_kings_capture_context3_frame034.cpp",
+      "world_of_kings/world_of_kings_capture_context3_frame035.cpp",
+      "world_of_kings/world_of_kings_capture_context3_frame036.cpp",
+      "world_of_kings/world_of_kings_capture_context3_frame037.cpp",
+      "world_of_kings/world_of_kings_capture_context3_frame038.cpp",
+      "world_of_kings/world_of_kings_capture_context3_frame039.cpp",
+      "world_of_kings/world_of_kings_capture_context3_frame040.cpp",
+      "world_of_kings/world_of_kings_capture_context3_frame041.cpp",
+      "world_of_kings/world_of_kings_capture_context3_frame042.cpp",
+      "world_of_kings/world_of_kings_capture_context3_frame043.cpp",
+      "world_of_kings/world_of_kings_capture_context3_frame044.cpp",
+      "world_of_kings/world_of_kings_capture_context3_frame045.cpp",
+      "world_of_kings/world_of_kings_capture_context3_frame046.cpp",
+      "world_of_kings/world_of_kings_capture_context3_frame047.cpp",
+      "world_of_kings/world_of_kings_capture_context3_frame048.cpp",
+      "world_of_kings/world_of_kings_capture_context3_frame049.cpp",
+      "world_of_kings/world_of_kings_capture_context3_frame050.cpp",
+      "world_of_kings/world_of_kings_capture_context3_frame051.cpp",
+      "world_of_kings/world_of_kings_capture_context3_frame052.cpp",
+      "world_of_kings/world_of_kings_capture_context3_frame053.cpp",
+      "world_of_kings/world_of_kings_capture_context3_frame054.cpp",
+      "world_of_kings/world_of_kings_capture_context3_frame055.cpp",
+      "world_of_kings/world_of_kings_capture_context3_frame056.cpp",
+      "world_of_kings/world_of_kings_capture_context3_frame057.cpp",
+      "world_of_kings/world_of_kings_capture_context3_frame058.cpp",
+      "world_of_kings/world_of_kings_capture_context3_frame059.cpp",
+      "world_of_kings/world_of_kings_capture_context3_frame060.cpp",
+      "world_of_kings/world_of_kings_capture_shared.cpp",
+    ],
+    [ "world_of_kings/world_of_kings.angledata.gz" ],
   ],
   [
     "world_of_tanks_blitz",
@@ -4758,7 +5633,7 @@
       "world_of_tanks_blitz/world_of_tanks_blitz_capture_context1_frame009.cpp",
       "world_of_tanks_blitz/world_of_tanks_blitz_capture_context1_frame010.cpp",
     ],
-    "world_of_tanks_blitz/world_of_tanks_blitz_capture_context1.angledata.gz",
+    [ "world_of_tanks_blitz/world_of_tanks_blitz_capture_context1.angledata.gz" ],
   ],
   [
     "world_war_doh",
@@ -4775,7 +5650,7 @@
       "world_war_doh/world_war_doh_capture_context1_frame009.cpp",
       "world_war_doh/world_war_doh_capture_context1_frame010.cpp",
     ],
-    "world_war_doh/world_war_doh_capture_context1.angledata.gz",
+    [ "world_war_doh/world_war_doh_capture_context1.angledata.gz" ],
   ],
   [
     "worms_zone_io",
@@ -4792,6 +5667,6 @@
       "worms_zone_io/worms_zone_io_capture_context1_frame009.cpp",
       "worms_zone_io/worms_zone_io_capture_context1_frame010.cpp",
     ],
-    "worms_zone_io/worms_zone_io_capture_context1.angledata.gz",
+    [ "worms_zone_io/worms_zone_io_capture_context1.angledata.gz" ],
   ],
 ]
diff --git a/src/tests/restricted_traces/restricted_traces_autogen.h b/src/tests/restricted_traces/restricted_traces_autogen.h
index 0da395b..90fc217 100644
--- a/src/tests/restricted_traces/restricted_traces_autogen.h
+++ b/src/tests/restricted_traces/restricted_traces_autogen.h
@@ -7,168 +7,55 @@
 //
 // restricted_traces_autogen: Types and enumerations for trace tests.
 
-#ifndef ANGLE_RESTRICTED_TRACES_H_
-#define ANGLE_RESTRICTED_TRACES_H_
+#ifndef ANGLE_RESTRICTED_TRACES_AUTOGEN_H_
+#define ANGLE_RESTRICTED_TRACES_AUTOGEN_H_
 
+#include <EGL/egl.h>
 #include <KHR/khrplatform.h>
 #include <cstdint>
 #include <vector>
 
-// See util/util_export.h for details on import/export labels.
-#if !defined(ANGLE_TRACE_EXPORT)
-#    if defined(_WIN32)
-#        if defined(ANGLE_TRACE_IMPLEMENTATION)
-#            define ANGLE_TRACE_EXPORT __declspec(dllexport)
-#        else
-#            define ANGLE_TRACE_EXPORT __declspec(dllimport)
-#        endif
-#    elif defined(__GNUC__)
-#        define ANGLE_TRACE_EXPORT __attribute__((visibility("default")))
-#    else
-#        define ANGLE_TRACE_EXPORT
-#    endif
-#endif  // !defined(ANGLE_TRACE_EXPORT)
-
-#if !defined(ANGLE_TRACE_LOADER_EXPORT)
-#    if defined(_WIN32)
-#        if defined(ANGLE_TRACE_LOADER_IMPLEMENTATION)
-#            define ANGLE_TRACE_LOADER_EXPORT __declspec(dllexport)
-#        else
-#            define ANGLE_TRACE_LOADER_EXPORT __declspec(dllimport)
-#        endif
-#    elif defined(__GNUC__)
-#        define ANGLE_TRACE_LOADER_EXPORT __attribute__((visibility("default")))
-#    else
-#        define ANGLE_TRACE_LOADER_EXPORT
-#    endif
-#endif  // !defined(ANGLE_TRACE_LOADER_EXPORT)
+#include "restricted_traces_export.h"
 
 namespace trace_angle
 {
 using GenericProc = void (*)();
 using LoadProc    = GenericProc(KHRONOS_APIENTRY *)(const char *);
+ANGLE_TRACE_LOADER_EXPORT void LoadEGL(LoadProc loadProc);
 ANGLE_TRACE_LOADER_EXPORT void LoadGLES(LoadProc loadProc);
-}  // namespace trace_angle
 
-namespace angle
-{
-enum class RestrictedTraceID
-{
-    aliexpress,
-    among_us,
-    angry_birds_2_1500,
-    arena_of_valor,
-    asphalt_8,
-    avakin_life,
-    aztec_ruins,
-    beach_buggy_racing,
-    brawl_stars,
-    bricks_breaker_quest,
-    bubble_shooter,
-    bus_simulator_indonesia,
-    call_break_offline_card_game,
-    candy_crush_500,
-    candy_crush_soda_saga,
-    car_parking_multiplayer,
-    clash_of_clans,
-    clash_royale,
-    cod_mobile,
-    coin_master,
-    command_and_conquer_rivals,
-    cookie_run_kingdom,
-    disney_tsum_tsum,
-    dr_driving,
-    dragon_ball_legends,
-    dragon_raja,
-    efootball_pes_2021,
-    egypt_1500,
-    eight_ball_pool,
-    extreme_car_driving_simulator,
-    fallout_shelter_online,
-    farm_heroes_saga,
-    fate_grand_order,
-    fifa_mobile,
-    free_fire,
-    gardenscapes,
-    genshin_impact,
-    google_maps,
-    happy_color,
-    hay_day,
-    hearthstone,
-    higgs_domino_island,
-    hill_climb_racing,
-    homescapes,
-    idle_heroes,
-    junes_journey,
-    kartrider_rush,
-    klondike_adventures,
-    league_of_legends_wild_rift,
-    lego_legacy,
-    lineage_m,
-    ludo_king,
-    magic_tiles_3,
-    manhattan_10,
-    manhattan_31,
-    mario_kart_tour,
-    marvel_contest_of_champions,
-    messenger_lite,
-    minecraft,
-    mobile_legends,
-    nba2k20_800,
-    one_punch_man,
-    plants_vs_zombies_2,
-    pokemon_go,
-    professional_baseball_spirits,
-    pubg_mobile_lite,
-    ragnarok_m_eternal_love,
-    raid_shadow_legends,
-    real_commando_secret_mission,
-    real_cricket_20,
-    real_gangster_crime,
-    rise_of_kingdoms,
-    romancing_saga,
-    rope_hero_vice_town,
-    saint_seiya_awakening,
-    sakura_school_simulator,
-    shadow_fight_2,
-    slingshot_test1,
-    slingshot_test2,
-    sniper_3d,
-    standoff_2,
-    subway_princess_runner,
-    subway_surfers,
-    summoners_war,
-    talking_tom_hero_dash,
-    temple_run_2,
-    temple_run_300,
-    toon_blast,
-    township,
-    trex_200,
-    whatsapp,
-    world_of_tanks_blitz,
-    world_war_doh,
-    worms_zone_io,
-    InvalidEnum,
-    EnumCount = InvalidEnum
-};
-
-static constexpr size_t kTraceInfoMaxNameLen = 32;
+static constexpr size_t kTraceInfoMaxNameLen = 128;
 
 static constexpr uint32_t kDefaultReplayContextClientMajorVersion = 3;
 static constexpr uint32_t kDefaultReplayContextClientMinorVersion = 1;
+static constexpr uint32_t kDefaultReplayDrawSurfaceColorSpace     = EGL_COLORSPACE_LINEAR;
 
 struct TraceInfo
 {
+    char name[kTraceInfoMaxNameLen];
     uint32_t contextClientMajorVersion;
     uint32_t contextClientMinorVersion;
-    uint32_t startFrame;
-    uint32_t endFrame;
+    uint32_t frameEnd;
+    uint32_t frameStart;
     uint32_t drawSurfaceWidth;
     uint32_t drawSurfaceHeight;
-    char name[kTraceInfoMaxNameLen];
+    uint32_t drawSurfaceColorSpace;
+    uint32_t displayPlatformType;
+    uint32_t displayDeviceType;
+    int configRedBits;
+    int configBlueBits;
+    int configGreenBits;
+    int configAlphaBits;
+    int configDepthBits;
+    int configStencilBits;
+    bool isBinaryDataCompressed;
+    bool areClientArraysEnabled;
+    bool isBindGeneratesResourcesEnabled;
+    bool isWebGLCompatibilityEnabled;
+    bool isRobustResourceInitEnabled;
 };
 
-ANGLE_TRACE_EXPORT const TraceInfo &GetTraceInfo(RestrictedTraceID traceID);
-}  // namespace angle
+ANGLE_TRACE_EXPORT const TraceInfo &GetTraceInfo(const char *traceName);
+}  // namespace trace_angle
 
-#endif  // ANGLE_RESTRICTED_TRACES_H_
+#endif  // ANGLE_RESTRICTED_TRACES_AUTOGEN_H_
diff --git a/src/tests/restricted_traces/restricted_traces_export.h b/src/tests/restricted_traces/restricted_traces_export.h
new file mode 100644
index 0000000..7f47ac8
--- /dev/null
+++ b/src/tests/restricted_traces/restricted_traces_export.h
@@ -0,0 +1,40 @@
+//
+// Copyright 2021 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.
+//
+// restricted_traces_export: Export definitions for restricted traces.
+
+#ifndef ANGLE_RESTRICTED_TRACES_EXPORT_H_
+#define ANGLE_RESTRICTED_TRACES_EXPORT_H_
+
+// See util/util_export.h for details on import/export labels.
+#if !defined(ANGLE_TRACE_EXPORT)
+#    if defined(_WIN32)
+#        if defined(ANGLE_TRACE_IMPLEMENTATION)
+#            define ANGLE_TRACE_EXPORT __declspec(dllexport)
+#        else
+#            define ANGLE_TRACE_EXPORT __declspec(dllimport)
+#        endif
+#    elif defined(__GNUC__)
+#        define ANGLE_TRACE_EXPORT __attribute__((visibility("default")))
+#    else
+#        define ANGLE_TRACE_EXPORT
+#    endif
+#endif  // !defined(ANGLE_TRACE_EXPORT)
+
+#if !defined(ANGLE_TRACE_LOADER_EXPORT)
+#    if defined(_WIN32)
+#        if defined(ANGLE_TRACE_LOADER_IMPLEMENTATION)
+#            define ANGLE_TRACE_LOADER_EXPORT __declspec(dllexport)
+#        else
+#            define ANGLE_TRACE_LOADER_EXPORT __declspec(dllimport)
+#        endif
+#    elif defined(__GNUC__)
+#        define ANGLE_TRACE_LOADER_EXPORT __attribute__((visibility("default")))
+#    else
+#        define ANGLE_TRACE_LOADER_EXPORT
+#    endif
+#endif  // !defined(ANGLE_TRACE_LOADER_EXPORT)
+
+#endif  // ANGLE_RESTRICTED_TRACES_EXPORT_H_
diff --git a/src/tests/restricted_traces/retrace_restricted_traces.py b/src/tests/restricted_traces/retrace_restricted_traces.py
index 660b07f..1e93384 100755
--- a/src/tests/restricted_traces/retrace_restricted_traces.py
+++ b/src/tests/restricted_traces/retrace_restricted_traces.py
@@ -115,6 +115,16 @@
         '--no-overwrite',
         help='Skip traces which already exist in the out directory.',
         action='store_true')
+    parser.add_argument(
+        '--validation', help='Enable state serialization validation calls.', action='store_true')
+    parser.add_argument(
+        '--validation-expr',
+        help='Validation expression, used to add more validation checkpoints.')
+    parser.add_argument(
+        '--limit',
+        '--frame-limit',
+        type=int,
+        help='Limits the number of captured frames to produce a shorter trace than the original.')
     args, extra_flags = parser.parse_known_args()
 
     logging.basicConfig(level=args.log.upper())
@@ -148,10 +158,25 @@
 
         logging.debug('Read metadata: %s' % str(metadata))
 
-        env = os.environ.copy()
-        env['ANGLE_CAPTURE_OUT_DIR'] = trace_path
-        env['ANGLE_CAPTURE_LABEL'] = trace
-        env['ANGLE_CAPTURE_TRIGGER'] = str(num_frames)
+        max_steps = min(args.limit, num_frames) if args.limit else num_frames
+
+        # We start tracing from frame 2. --retrace-mode issues a Swap() after Setup() so we can
+        # accurately re-trace the MEC.
+        additional_env = {
+            'ANGLE_CAPTURE_LABEL': trace,
+            'ANGLE_CAPTURE_OUT_DIR': trace_path,
+            'ANGLE_CAPTURE_FRAME_START': '2',
+            'ANGLE_CAPTURE_FRAME_END': str(num_frames + 1),
+        }
+        if args.validation:
+            additional_env['ANGLE_CAPTURE_VALIDATION'] = '1'
+            # Also turn on shader output init to ensure we have no undefined values.
+            # This feature is also enabled in replay when using --validation.
+            additional_env['ANGLE_FEATURE_OVERRIDES_ENABLED'] = 'forceInitShaderOutputVariables'
+        if args.validation_expr:
+            additional_env['ANGLE_CAPTURE_VALIDATION_EXPR'] = args.validation_expr
+
+        env = {**os.environ.copy(), **additional_env}
 
         renderer = 'vulkan' if args.no_swiftshader else 'vulkan_swiftshader'
 
@@ -161,12 +186,13 @@
             trace_filter,
             '--retrace-mode',
             '--max-steps-performed',
-            str(num_frames),
+            str(max_steps),
             '--enable-all-trace-tests',
         ]
 
         print('Capturing "%s" (%d frames)...' % (trace, num_frames))
-        logging.debug('Running "%s" with capture environment' % ' '.join(run_args))
+        logging.debug('Running "%s" with environment: %s' %
+                      (' '.join(run_args), str(additional_env)))
         try:
             subprocess.check_call(run_args, env=env)
 
diff --git a/src/tests/restricted_traces/sync_restricted_traces_to_cipd.py b/src/tests/restricted_traces/sync_restricted_traces_to_cipd.py
index 224dfb3..ce9cab9 100644
--- a/src/tests/restricted_traces/sync_restricted_traces_to_cipd.py
+++ b/src/tests/restricted_traces/sync_restricted_traces_to_cipd.py
@@ -9,6 +9,8 @@
 #   restricted_traces.json. Requires access to the CIPD path to work.
 
 import argparse
+import getpass
+import fnmatch
 import logging
 import json
 import os
@@ -17,6 +19,7 @@
 import sys
 
 CIPD_PREFIX = 'angle/traces'
+EXPERIMENTAL_CIPD_PREFIX = 'experimental/google.com/%s/angle/traces'
 LOG_LEVEL = 'info'
 JSON_PATH = 'restricted_traces.json'
 SCRIPT_DIR = os.path.dirname(sys.argv[0])
@@ -37,7 +40,18 @@
 
     for trace_info in traces['traces']:
         trace, trace_version = trace_info.split(' ')
-        trace_name = '%s/%s' % (args.prefix, trace)
+
+        if args.filter and not fnmatch.fnmatch(trace, args.filter):
+            logging.debug('Skipping %s because it does not match the test filter.' % trace)
+            continue
+
+        if 'x' in trace_version:
+            trace_prefix = EXPERIMENTAL_CIPD_PREFIX % getpass.getuser()
+            trace_version = trace_version.strip('x')
+        else:
+            trace_prefix = CIPD_PREFIX
+
+        trace_name = '%s/%s' % (trace_prefix, trace)
         # Determine if this version exists
         if cipd('describe', trace_name, '-version', 'version:%s' % trace_version) == 0:
             logging.info('%s version %s already present' % (trace, trace_version))
@@ -59,6 +73,8 @@
         '-p', '--prefix', help='CIPD Prefix. Default: %s' % CIPD_PREFIX, default=CIPD_PREFIX)
     parser.add_argument(
         '-l', '--log', help='Logging level. Default: %s' % LOG_LEVEL, default=LOG_LEVEL)
+    parser.add_argument(
+        '-f', '--filter', help='Only sync specified tests. Supports fnmatch expressions.')
     args, extra_flags = parser.parse_known_args()
 
     logging.basicConfig(level=args.log.upper())
diff --git a/src/tests/restricted_traces/trace_egl_loader_autogen.h b/src/tests/restricted_traces/trace_egl_loader_autogen.h
index 741dfa2..3aad0c8 100644
--- a/src/tests/restricted_traces/trace_egl_loader_autogen.h
+++ b/src/tests/restricted_traces/trace_egl_loader_autogen.h
@@ -11,11 +11,11 @@
 #ifndef ANGLE_RESTRICTED_TRACES_EGL_LOADER_AUTOGEN_H_
 #define ANGLE_RESTRICTED_TRACES_EGL_LOADER_AUTOGEN_H_
 
-#include "restricted_traces_autogen.h"
-
 #include <EGL/egl.h>
 #include <EGL/eglext.h>
 
+#include "restricted_traces_export.h"
+
 #define eglChooseConfig t_eglChooseConfig
 #define eglCopyBuffers t_eglCopyBuffers
 #define eglCreateContext t_eglCreateContext
diff --git a/src/tests/restricted_traces/trace_gles_loader_autogen.cpp b/src/tests/restricted_traces/trace_gles_loader_autogen.cpp
index c66b773..7c72e66 100644
--- a/src/tests/restricted_traces/trace_gles_loader_autogen.cpp
+++ b/src/tests/restricted_traces/trace_gles_loader_autogen.cpp
@@ -595,6 +595,9 @@
 ANGLE_TRACE_LOADER_EXPORT PFNGLCOPYTEXTURECHROMIUMPROC t_glCopyTextureCHROMIUM;
 ANGLE_TRACE_LOADER_EXPORT PFNGLCOVERAGEMODULATIONCHROMIUMPROC t_glCoverageModulationCHROMIUM;
 ANGLE_TRACE_LOADER_EXPORT PFNGLLOSECONTEXTCHROMIUMPROC t_glLoseContextCHROMIUM;
+ANGLE_TRACE_LOADER_EXPORT PFNGLEGLIMAGETARGETTEXSTORAGEEXTPROC t_glEGLImageTargetTexStorageEXT;
+ANGLE_TRACE_LOADER_EXPORT PFNGLEGLIMAGETARGETTEXTURESTORAGEEXTPROC
+    t_glEGLImageTargetTextureStorageEXT;
 ANGLE_TRACE_LOADER_EXPORT PFNGLBINDFRAGDATALOCATIONEXTPROC t_glBindFragDataLocationEXT;
 ANGLE_TRACE_LOADER_EXPORT PFNGLBINDFRAGDATALOCATIONINDEXEDEXTPROC
     t_glBindFragDataLocationIndexedEXT;
@@ -1717,6 +1720,11 @@
         loadProc("glCoverageModulationCHROMIUM"));
     t_glLoseContextCHROMIUM =
         reinterpret_cast<PFNGLLOSECONTEXTCHROMIUMPROC>(loadProc("glLoseContextCHROMIUM"));
+    t_glEGLImageTargetTexStorageEXT = reinterpret_cast<PFNGLEGLIMAGETARGETTEXSTORAGEEXTPROC>(
+        loadProc("glEGLImageTargetTexStorageEXT"));
+    t_glEGLImageTargetTextureStorageEXT =
+        reinterpret_cast<PFNGLEGLIMAGETARGETTEXTURESTORAGEEXTPROC>(
+            loadProc("glEGLImageTargetTextureStorageEXT"));
     t_glBindFragDataLocationEXT =
         reinterpret_cast<PFNGLBINDFRAGDATALOCATIONEXTPROC>(loadProc("glBindFragDataLocationEXT"));
     t_glBindFragDataLocationIndexedEXT = reinterpret_cast<PFNGLBINDFRAGDATALOCATIONINDEXEDEXTPROC>(
diff --git a/src/tests/restricted_traces/trace_gles_loader_autogen.h b/src/tests/restricted_traces/trace_gles_loader_autogen.h
index 4f7e75b..c474eca 100644
--- a/src/tests/restricted_traces/trace_gles_loader_autogen.h
+++ b/src/tests/restricted_traces/trace_gles_loader_autogen.h
@@ -16,7 +16,7 @@
 #endif  // defined(GL_GLES_PROTOTYPES)
 
 #include "angle_gl.h"
-#include "restricted_traces_autogen.h"
+#include "restricted_traces_export.h"
 
 #define glAlphaFunc t_glAlphaFunc
 #define glClipPlanef t_glClipPlanef
@@ -568,6 +568,8 @@
 #define glCopyTextureCHROMIUM t_glCopyTextureCHROMIUM
 #define glCoverageModulationCHROMIUM t_glCoverageModulationCHROMIUM
 #define glLoseContextCHROMIUM t_glLoseContextCHROMIUM
+#define glEGLImageTargetTexStorageEXT t_glEGLImageTargetTexStorageEXT
+#define glEGLImageTargetTextureStorageEXT t_glEGLImageTargetTextureStorageEXT
 #define glBindFragDataLocationEXT t_glBindFragDataLocationEXT
 #define glBindFragDataLocationIndexedEXT t_glBindFragDataLocationIndexedEXT
 #define glGetFragDataIndexEXT t_glGetFragDataIndexEXT
@@ -1411,6 +1413,10 @@
 ANGLE_TRACE_LOADER_EXPORT extern PFNGLCOPYTEXTURECHROMIUMPROC t_glCopyTextureCHROMIUM;
 ANGLE_TRACE_LOADER_EXPORT extern PFNGLCOVERAGEMODULATIONCHROMIUMPROC t_glCoverageModulationCHROMIUM;
 ANGLE_TRACE_LOADER_EXPORT extern PFNGLLOSECONTEXTCHROMIUMPROC t_glLoseContextCHROMIUM;
+ANGLE_TRACE_LOADER_EXPORT extern PFNGLEGLIMAGETARGETTEXSTORAGEEXTPROC
+    t_glEGLImageTargetTexStorageEXT;
+ANGLE_TRACE_LOADER_EXPORT extern PFNGLEGLIMAGETARGETTEXTURESTORAGEEXTPROC
+    t_glEGLImageTargetTextureStorageEXT;
 ANGLE_TRACE_LOADER_EXPORT extern PFNGLBINDFRAGDATALOCATIONEXTPROC t_glBindFragDataLocationEXT;
 ANGLE_TRACE_LOADER_EXPORT extern PFNGLBINDFRAGDATALOCATIONINDEXEDEXTPROC
     t_glBindFragDataLocationIndexedEXT;
diff --git a/src/tests/run_perf_tests.py b/src/tests/run_perf_tests.py
new file mode 100755
index 0000000..96bfd5a
--- /dev/null
+++ b/src/tests/run_perf_tests.py
@@ -0,0 +1,422 @@
+#! /usr/bin/env vpython
+#
+# Copyright 2021 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.
+#
+# run_perf_test.py:
+#   Runs ANGLE perf tests using some statistical averaging.
+
+import argparse
+import fnmatch
+import json
+import logging
+import time
+import os
+import re
+import sys
+
+# Add //src/testing into sys.path for importing xvfb and test_env, and
+# //src/testing/scripts for importing common.
+d = os.path.dirname
+THIS_DIR = d(os.path.abspath(__file__))
+ANGLE_DIR = d(d(THIS_DIR))
+sys.path.append(os.path.join(ANGLE_DIR, 'testing'))
+sys.path.append(os.path.join(ANGLE_DIR, 'testing', 'scripts'))
+
+import common
+import test_env
+import xvfb
+
+sys.path.append(os.path.join(ANGLE_DIR, 'third_party', 'catapult', 'tracing'))
+from tracing.value import histogram
+from tracing.value import histogram_set
+from tracing.value import merge_histograms
+
+DEFAULT_TEST_SUITE = 'angle_perftests'
+DEFAULT_LOG = 'info'
+DEFAULT_SAMPLES = 5
+DEFAULT_TRIALS = 3
+DEFAULT_MAX_ERRORS = 3
+DEFAULT_WARMUP_LOOPS = 3
+DEFAULT_CALIBRATION_TIME = 3
+
+# Filters out stuff like: " I   72.572s run_tests_on_device(96071FFAZ00096) "
+ANDROID_LOGGING_PREFIX = r'I +\d+.\d+s \w+\(\w+\)  '
+
+# Test expectations
+FAIL = 'FAIL'
+PASS = 'PASS'
+SKIP = 'SKIP'
+
+
+def is_windows():
+    return sys.platform == 'cygwin' or sys.platform.startswith('win')
+
+
+def get_binary_name(binary):
+    if is_windows():
+        return '.\\%s.exe' % binary
+    else:
+        return './%s' % binary
+
+
+def _run_and_get_output(args, cmd, env):
+    lines = []
+    with common.temporary_file() as tempfile_path:
+        if args.xvfb:
+            ret = xvfb.run_executable(cmd, env, stdoutfile=tempfile_path)
+        else:
+            ret = test_env.run_command_with_output(cmd, env=env, stdoutfile=tempfile_path)
+        if ret:
+            logging.error('Error running test suite.')
+            return None
+        with open(tempfile_path) as f:
+            for line in f:
+                lines.append(line.strip())
+    return lines
+
+
+def _filter_tests(tests, pattern):
+    return [test for test in tests if fnmatch.fnmatch(test, pattern)]
+
+
+def _shard_tests(tests, shard_count, shard_index):
+    return [tests[index] for index in range(shard_index, len(tests), shard_count)]
+
+
+def _get_results_from_output(output, result):
+    output = '\n'.join(output)
+    m = re.search(r'Running (\d+) tests', output)
+    if m and int(m.group(1)) > 1:
+        raise Exception('Found more than one test result in output')
+
+    # Results are reported in the format:
+    # name_backend.result: story= value units.
+    pattern = r'\.' + result + r':.*= ([0-9.]+)'
+    logging.debug('Searching for %s in output' % pattern)
+    m = re.findall(pattern, output)
+    if not m:
+        logging.warning('Did not find the result "%s" in the test output.' % result)
+        return None
+
+    return [float(value) for value in m]
+
+
+def _get_tests_from_output(lines):
+    seen_start_of_tests = False
+    tests = []
+    android_prefix = re.compile(ANDROID_LOGGING_PREFIX)
+    logging.debug('Read %d lines from test output.' % len(lines))
+    for line in lines:
+        line = android_prefix.sub('', line.strip())
+        if line == 'Tests list:':
+            seen_start_of_tests = True
+        elif line == 'End tests list.':
+            break
+        elif seen_start_of_tests:
+            tests.append(line)
+    if not seen_start_of_tests:
+        raise Exception('Did not find test list in test output!')
+    logging.debug('Found %d tests from test output.' % len(tests))
+    return tests
+
+
+def _truncated_list(data, n):
+    """Compute a truncated list, n is truncation size"""
+    if len(data) < n * 2:
+        raise ValueError('list not large enough to truncate')
+    return sorted(data)[n:-n]
+
+
+def _mean(data):
+    """Return the sample arithmetic mean of data."""
+    n = len(data)
+    if n < 1:
+        raise ValueError('mean requires at least one data point')
+    return float(sum(data)) / float(n)  # in Python 2 use sum(data)/float(n)
+
+
+def _sum_of_square_deviations(data, c):
+    """Return sum of square deviations of sequence data."""
+    ss = sum((float(x) - c)**2 for x in data)
+    return ss
+
+
+def _coefficient_of_variation(data):
+    """Calculates the population coefficient of variation."""
+    n = len(data)
+    if n < 2:
+        raise ValueError('variance requires at least two data points')
+    c = _mean(data)
+    ss = _sum_of_square_deviations(data, c)
+    pvar = ss / n  # the population variance
+    stddev = (pvar**0.5)  # population standard deviation
+    return stddev / c
+
+
+def _save_extra_output_files(args, test_results, histograms):
+    isolated_out_dir = os.path.dirname(args.isolated_script_test_output)
+    if not os.path.isdir(isolated_out_dir):
+        return
+    benchmark_path = os.path.join(isolated_out_dir, args.test_suite)
+    if not os.path.isdir(benchmark_path):
+        os.makedirs(benchmark_path)
+    test_output_path = os.path.join(benchmark_path, 'test_results.json')
+    logging.info('Saving test results to %s.' % test_output_path)
+    with open(test_output_path, 'w') as out_file:
+        out_file.write(json.dumps(test_results, indent=2))
+    perf_output_path = os.path.join(benchmark_path, 'perf_results.json')
+    logging.info('Saving perf histograms to %s.' % perf_output_path)
+    with open(perf_output_path, 'w') as out_file:
+        out_file.write(json.dumps(histograms.AsDicts(), indent=2))
+
+
+def main():
+    parser = argparse.ArgumentParser()
+    parser.add_argument('--isolated-script-test-output', type=str)
+    parser.add_argument('--isolated-script-test-perf-output', type=str)
+    parser.add_argument(
+        '-f', '--filter', '--isolated-script-test-filter', type=str, help='Test filter.')
+    parser.add_argument('--test-suite', help='Test suite to run.', default=DEFAULT_TEST_SUITE)
+    parser.add_argument('--xvfb', help='Use xvfb.', action='store_true')
+    parser.add_argument(
+        '--shard-count',
+        help='Number of shards for test splitting. Default is 1.',
+        type=int,
+        default=1)
+    parser.add_argument(
+        '--shard-index',
+        help='Index of the current shard for test splitting. Default is 0.',
+        type=int,
+        default=0)
+    parser.add_argument(
+        '-l', '--log', help='Log output level. Default is %s.' % DEFAULT_LOG, default=DEFAULT_LOG)
+    parser.add_argument(
+        '-s',
+        '--samples-per-test',
+        help='Number of samples to run per test. Default is %d.' % DEFAULT_SAMPLES,
+        type=int,
+        default=DEFAULT_SAMPLES)
+    parser.add_argument(
+        '-t',
+        '--trials-per-sample',
+        help='Number of trials to run per sample. Default is %d.' % DEFAULT_TRIALS,
+        type=int,
+        default=DEFAULT_TRIALS)
+    parser.add_argument(
+        '--steps-per-trial', help='Fixed number of steps to run per trial.', type=int)
+    parser.add_argument(
+        '--max-errors',
+        help='After this many errors, abort the run. Default is %d.' % DEFAULT_MAX_ERRORS,
+        type=int,
+        default=DEFAULT_MAX_ERRORS)
+    parser.add_argument(
+        '--smoke-test-mode', help='Do a quick run to validate correctness.', action='store_true')
+    parser.add_argument(
+        '--warmup-loops',
+        help='Number of warmup loops to run in the perf test. Default is %d.' %
+        DEFAULT_WARMUP_LOOPS,
+        type=int,
+        default=DEFAULT_WARMUP_LOOPS)
+    parser.add_argument(
+        '--calibration-time',
+        help='Amount of time to spend each loop in calibration and warmup. Default is %d seconds.'
+        % DEFAULT_CALIBRATION_TIME,
+        type=int,
+        default=DEFAULT_CALIBRATION_TIME)
+
+    args, extra_flags = parser.parse_known_args()
+    logging.basicConfig(level=args.log.upper(), stream=sys.stdout)
+
+    start_time = time.time()
+
+    # Use fast execution for smoke test mode.
+    if args.smoke_test_mode:
+        args.steps_per_trial = 1
+        args.trials_per_sample = 1
+        args.samples_per_test = 1
+
+    env = os.environ.copy()
+
+    # Get sharding args
+    if 'GTEST_TOTAL_SHARDS' in env and int(env['GTEST_TOTAL_SHARDS']) != 1:
+        if 'GTEST_SHARD_INDEX' not in env:
+            logging.error('Sharding params must be specified together.')
+            sys.exit(1)
+        args.shard_count = int(env.pop('GTEST_TOTAL_SHARDS'))
+        args.shard_index = int(env.pop('GTEST_SHARD_INDEX'))
+
+    # Get test list
+    cmd = [get_binary_name(args.test_suite), '--list-tests', '--verbose']
+    lines = _run_and_get_output(args, cmd, env)
+    if not lines:
+        raise Exception('Could not find test list from test output.')
+    tests = _get_tests_from_output(lines)
+
+    if args.filter:
+        tests = _filter_tests(tests, args.filter)
+
+    # Get tests for this shard (if using sharding args)
+    tests = _shard_tests(tests, args.shard_count, args.shard_index)
+
+    # Run tests
+    results = {
+        'tests': {},
+        'interrupted': False,
+        'seconds_since_epoch': time.time(),
+        'path_delimiter': '.',
+        'version': 3,
+        'num_failures_by_type': {
+            FAIL: 0,
+            PASS: 0,
+            SKIP: 0,
+        },
+    }
+
+    test_results = {}
+    histograms = histogram_set.HistogramSet()
+    total_errors = 0
+
+    for test in tests:
+        cmd = [
+            get_binary_name(args.test_suite),
+            '--gtest_filter=%s' % test,
+            '--extract-test-list-from-filter',
+            '--enable-device-cache',
+            '--skip-clear-data',
+            '--use-existing-test-data',
+            '--verbose',
+            '--calibration-time',
+            str(args.calibration_time),
+        ]
+        if args.steps_per_trial:
+            steps_per_trial = args.steps_per_trial
+        else:
+            cmd_calibrate = cmd + [
+                '--calibration',
+                '--warmup-loops',
+                str(args.warmup_loops),
+            ]
+            calibrate_output = _run_and_get_output(args, cmd_calibrate, env)
+            if not calibrate_output:
+                logging.error('Failed to get calibration output')
+                test_results[test] = {'expected': PASS, 'actual': FAIL, 'is_unexpected': True}
+                results['num_failures_by_type'][FAIL] += 1
+                total_errors += 1
+                continue
+            steps_per_trial = _get_results_from_output(calibrate_output, 'steps_to_run')
+            if not steps_per_trial:
+                logging.warning('Skipping test %s' % test)
+                continue
+            assert (len(steps_per_trial) == 1)
+            steps_per_trial = int(steps_per_trial[0])
+        logging.info('Running %s %d times with %d trials and %d steps per trial.' %
+                     (test, args.samples_per_test, args.trials_per_sample, steps_per_trial))
+        wall_times = []
+        test_histogram_set = histogram_set.HistogramSet()
+        for sample in range(args.samples_per_test):
+            if total_errors >= args.max_errors:
+                logging.error('Error count exceeded max errors (%d). Aborting.' % args.max_errors)
+                return 1
+
+            cmd_run = cmd + [
+                '--steps-per-trial',
+                str(steps_per_trial),
+                '--trials',
+                str(args.trials_per_sample),
+            ]
+            if args.smoke_test_mode:
+                cmd_run += ['--no-warmup']
+            else:
+                cmd_run += ['--warmup-loops', str(args.warmup_loops)]
+            with common.temporary_file() as histogram_file_path:
+                cmd_run += ['--isolated-script-test-perf-output=%s' % histogram_file_path]
+                output = _run_and_get_output(args, cmd_run, env)
+                if output:
+                    sample_wall_times = _get_results_from_output(output, 'wall_time')
+                    if not sample_wall_times:
+                        logging.warning('Test %s failed to produce a sample output' % test)
+                        break
+                    logging.info('Sample %d wall_time results: %s' %
+                                 (sample, str(sample_wall_times)))
+                    wall_times += sample_wall_times
+                    with open(histogram_file_path) as histogram_file:
+                        sample_json = json.load(histogram_file)
+                        sample_histogram = histogram_set.HistogramSet()
+                        sample_histogram.ImportDicts(sample_json)
+                        test_histogram_set.Merge(sample_histogram)
+                else:
+                    logging.error('Failed to get sample for test %s' % test)
+                    total_errors += 1
+
+        if not wall_times:
+            logging.warning('Skipping test %s. Assuming this is intentional.' % test)
+            test_results[test] = {'expected': SKIP, 'actual': SKIP}
+            results['num_failures_by_type'][SKIP] += 1
+        elif len(wall_times) == (args.samples_per_test * args.trials_per_sample):
+            if len(wall_times) > 7:
+                truncation_n = len(wall_times) >> 3
+                logging.info(
+                    'Truncation: Removing the %d highest and lowest times from wall_times.' %
+                    truncation_n)
+                wall_times = _truncated_list(wall_times, truncation_n)
+
+            if len(wall_times) > 1:
+                logging.info(
+                    'Mean wall_time for %s is %.2f, with coefficient of variation %.2f%%' %
+                    (test, _mean(wall_times), (_coefficient_of_variation(wall_times) * 100.0)))
+            test_results[test] = {'expected': PASS, 'actual': PASS}
+            results['num_failures_by_type'][PASS] += 1
+
+            # Merge the histogram set into one histogram
+            with common.temporary_file() as merge_histogram_path:
+                logging.info('Writing merged histograms to %s.' % merge_histogram_path)
+                with open(merge_histogram_path, 'w') as merge_histogram_file:
+                    json.dump(test_histogram_set.AsDicts(), merge_histogram_file)
+                    merge_histogram_file.close()
+                merged_dicts = merge_histograms.MergeHistograms(
+                    merge_histogram_path, groupby=['name'])
+                merged_histogram = histogram_set.HistogramSet()
+                merged_histogram.ImportDicts(merged_dicts)
+                histograms.Merge(merged_histogram)
+        else:
+            logging.error('Test %s failed to record some samples' % test)
+            test_results[test] = {'expected': PASS, 'actual': FAIL, 'is_unexpected': True}
+            results['num_failures_by_type'][FAIL] += 1
+
+    if test_results:
+        results['tests'][args.test_suite] = test_results
+
+    if args.isolated_script_test_output:
+        with open(args.isolated_script_test_output, 'w') as out_file:
+            out_file.write(json.dumps(results, indent=2))
+
+        # Uses special output files to match the merge script.
+        _save_extra_output_files(args, results, histograms)
+
+    if args.isolated_script_test_perf_output:
+        with open(args.isolated_script_test_perf_output, 'w') as out_file:
+            out_file.write(json.dumps(histograms.AsDicts(), indent=2))
+
+    end_time = time.time()
+    logging.info('Elapsed time: %.2lf seconds.' % (end_time - start_time))
+
+    return 0
+
+
+# This is not really a "script test" so does not need to manually add
+# any additional compile targets.
+def main_compile_targets(args):
+    json.dump([], args.output)
+
+
+if __name__ == '__main__':
+    # Conform minimally to the protocol defined by ScriptTest.
+    if 'compile_targets' in sys.argv:
+        funcs = {
+            'run': None,
+            'compile_targets': main_compile_targets,
+        }
+        sys.exit(common.run_script(sys.argv[1:], funcs))
+    sys.exit(main())
diff --git a/src/tests/restricted_traces/skia_gold/__init__.py b/src/tests/skia_gold/__init__.py
similarity index 100%
rename from src/tests/restricted_traces/skia_gold/__init__.py
rename to src/tests/skia_gold/__init__.py
diff --git a/src/tests/restricted_traces/skia_gold/angle_skia_gold_properties.py b/src/tests/skia_gold/angle_skia_gold_properties.py
similarity index 96%
rename from src/tests/restricted_traces/skia_gold/angle_skia_gold_properties.py
rename to src/tests/skia_gold/angle_skia_gold_properties.py
index 752de9a..7913eb3 100644
--- a/src/tests/restricted_traces/skia_gold/angle_skia_gold_properties.py
+++ b/src/tests/skia_gold/angle_skia_gold_properties.py
@@ -10,7 +10,7 @@
 
 d = os.path.dirname
 THIS_DIR = d(os.path.abspath(__file__))
-ANGLE_SRC_DIR = d(d(d(d(THIS_DIR))))
+ANGLE_SRC_DIR = d(d(d(THIS_DIR)))
 sys.path.insert(0, os.path.join(ANGLE_SRC_DIR, 'build'))
 CHROMIUM_SRC_DIR = d(d(ANGLE_SRC_DIR))
 sys.path.insert(0, os.path.join(CHROMIUM_SRC_DIR, 'build'))
diff --git a/src/tests/restricted_traces/skia_gold/angle_skia_gold_session.py b/src/tests/skia_gold/angle_skia_gold_session.py
similarity index 94%
rename from src/tests/restricted_traces/skia_gold/angle_skia_gold_session.py
rename to src/tests/skia_gold/angle_skia_gold_session.py
index 8d94bed..7da60df 100644
--- a/src/tests/restricted_traces/skia_gold/angle_skia_gold_session.py
+++ b/src/tests/skia_gold/angle_skia_gold_session.py
@@ -8,7 +8,7 @@
 
 d = os.path.dirname
 THIS_DIR = d(os.path.abspath(__file__))
-ANGLE_SRC_DIR = d(d(d(d(THIS_DIR))))
+ANGLE_SRC_DIR = d(d(d(THIS_DIR)))
 sys.path.insert(0, os.path.join(ANGLE_SRC_DIR, 'build'))
 CHROMIUM_SRC_DIR = d(d(ANGLE_SRC_DIR))
 sys.path.insert(0, os.path.join(CHROMIUM_SRC_DIR, 'build'))
diff --git a/src/tests/restricted_traces/skia_gold/angle_skia_gold_session_manager.py b/src/tests/skia_gold/angle_skia_gold_session_manager.py
similarity index 95%
rename from src/tests/restricted_traces/skia_gold/angle_skia_gold_session_manager.py
rename to src/tests/skia_gold/angle_skia_gold_session_manager.py
index 3e1808a..6f743b5 100644
--- a/src/tests/restricted_traces/skia_gold/angle_skia_gold_session_manager.py
+++ b/src/tests/skia_gold/angle_skia_gold_session_manager.py
@@ -8,7 +8,7 @@
 
 d = os.path.dirname
 THIS_DIR = d(os.path.abspath(__file__))
-ANGLE_SRC_DIR = d(d(d(d(THIS_DIR))))
+ANGLE_SRC_DIR = d(d(d(THIS_DIR)))
 sys.path.insert(0, os.path.join(ANGLE_SRC_DIR, 'build'))
 CHROMIUM_SRC_DIR = d(d(ANGLE_SRC_DIR))
 sys.path.insert(0, os.path.join(CHROMIUM_SRC_DIR, 'build'))
diff --git a/src/tests/test_expectations/GPUTestConfig.cpp b/src/tests/test_expectations/GPUTestConfig.cpp
index 0642b62..5e81305 100644
--- a/src/tests/test_expectations/GPUTestConfig.cpp
+++ b/src/tests/test_expectations/GPUTestConfig.cpp
@@ -599,10 +599,12 @@
     mConditions[kConditionPreRotation90]  = false;
     mConditions[kConditionPreRotation180] = false;
     mConditions[kConditionPreRotation270] = false;
+
+    mConditions[kConditionSPIRVGen] = false;
 }
 
 // If the constructor is passed an API, load those conditions as well
-GPUTestConfig::GPUTestConfig(const API &api, uint32_t preRotation)
+GPUTestConfig::GPUTestConfig(const API &api, uint32_t preRotation, bool enableDirectSPIRVGen)
     : GPUTestConfig(IsSwiftShader(api))
 {
     mConditions[kConditionD3D9]      = IsD3D9(api);
@@ -629,6 +631,11 @@
         default:
             break;
     }
+
+    if (enableDirectSPIRVGen)
+    {
+        mConditions[kConditionSPIRVGen] = true;
+    }
 }
 
 // Return a const reference to the list of all pre-calculated conditions.
diff --git a/src/tests/test_expectations/GPUTestConfig.h b/src/tests/test_expectations/GPUTestConfig.h
index a873c52..3ae394c 100644
--- a/src/tests/test_expectations/GPUTestConfig.h
+++ b/src/tests/test_expectations/GPUTestConfig.h
@@ -71,6 +71,8 @@
         kConditionPreRotation90,
         kConditionPreRotation180,
         kConditionPreRotation270,
+        // TODO: remove when no longer needed.  http://anglebug.com/6210
+        kConditionSPIRVGen,
 
         kNumberOfConditions,
     };
@@ -79,7 +81,7 @@
 
     GPUTestConfig();
     GPUTestConfig(bool isSwiftShader);
-    GPUTestConfig(const API &api, uint32_t preRotation);
+    GPUTestConfig(const API &api, uint32_t preRotation, bool enableDirectSPIRVGen);
 
     const GPUTestConfig::ConditionArray &getConditions() const;
 
diff --git a/src/tests/test_expectations/GPUTestExpectationsParser.cpp b/src/tests/test_expectations/GPUTestExpectationsParser.cpp
index 8316b1b..7f0455f 100644
--- a/src/tests/test_expectations/GPUTestExpectationsParser.cpp
+++ b/src/tests/test_expectations/GPUTestExpectationsParser.cpp
@@ -82,6 +82,8 @@
     kConfigPreRotation90,
     kConfigPreRotation180,
     kConfigPreRotation270,
+    // SPIR-V generation
+    kConfigSPIRVGen,
     // expectation
     kExpectationPass,
     kExpectationFail,
@@ -179,6 +181,7 @@
     {"prerotation90", GPUTestConfig::kConditionPreRotation90},
     {"prerotation180", GPUTestConfig::kConditionPreRotation180},
     {"prerotation270", GPUTestConfig::kConditionPreRotation270},
+    {"spirvgen", GPUTestConfig::kConditionSPIRVGen},
     {"pass", GPUTestConfig::kConditionNone, GPUTestExpectationsParser::kGpuTestPass},
     {"fail", GPUTestConfig::kConditionNone, GPUTestExpectationsParser::kGpuTestFail},
     {"flaky", GPUTestConfig::kConditionNone, GPUTestExpectationsParser::kGpuTestFlaky},
@@ -501,6 +504,7 @@
             case kConfigPreRotation90:
             case kConfigPreRotation180:
             case kConfigPreRotation270:
+            case kConfigSPIRVGen:
                 // MODIFIERS, check each condition and add accordingly.
                 if (stage != kLineParserConfigs && stage != kLineParserBugID)
                 {
diff --git a/src/tests/test_expectations/GPUTestExpectationsTest.cpp b/src/tests/test_expectations/GPUTestExpectationsTest.cpp
index a1273a8..0fa4008 100644
--- a/src/tests/test_expectations/GPUTestExpectationsTest.cpp
+++ b/src/tests/test_expectations/GPUTestExpectationsTest.cpp
@@ -39,7 +39,8 @@
 
     void validateConfigAPI(const GPUTestConfig &config,
                            const GPUTestConfig::API &api,
-                           uint32_t preRotation)
+                           uint32_t preRotation,
+                           bool enableDirectSPIRVGen)
     {
         bool D3D9      = false;
         bool D3D11     = false;
@@ -105,6 +106,8 @@
                 EXPECT_FALSE(config.getConditions()[GPUTestConfig::kConditionPreRotation270]);
                 break;
         }
+
+        EXPECT_EQ(enableDirectSPIRVGen, config.getConditions()[GPUTestConfig::kConditionSPIRVGen]);
     }
 };
 
@@ -120,56 +123,62 @@
 // condition flags are set correctly.
 TEST_P(GPUTestConfigTest, GPUTestConfigConditions_D3D9)
 {
-    GPUTestConfig config(GPUTestConfig::kAPID3D9, 0);
-    validateConfigAPI(config, GPUTestConfig::kAPID3D9, 0);
+    GPUTestConfig config(GPUTestConfig::kAPID3D9, 0, false);
+    validateConfigAPI(config, GPUTestConfig::kAPID3D9, 0, false);
 }
 
 TEST_P(GPUTestConfigTest, GPUTestConfigConditions_D3D11)
 {
-    GPUTestConfig config(GPUTestConfig::kAPID3D11, 0);
-    validateConfigAPI(config, GPUTestConfig::kAPID3D11, 0);
+    GPUTestConfig config(GPUTestConfig::kAPID3D11, 0, false);
+    validateConfigAPI(config, GPUTestConfig::kAPID3D11, 0, false);
 }
 
 TEST_P(GPUTestConfigTest, GPUTestConfigConditions_Metal)
 {
-    GPUTestConfig config(GPUTestConfig::kAPIMetal, 0);
-    validateConfigAPI(config, GPUTestConfig::kAPIMetal, 0);
+    GPUTestConfig config(GPUTestConfig::kAPIMetal, 0, false);
+    validateConfigAPI(config, GPUTestConfig::kAPIMetal, 0, false);
 }
 
 TEST_P(GPUTestConfigTest, GPUTestConfigConditions_GLDesktop)
 {
-    GPUTestConfig config(GPUTestConfig::kAPIGLDesktop, 0);
-    validateConfigAPI(config, GPUTestConfig::kAPIGLDesktop, 0);
+    GPUTestConfig config(GPUTestConfig::kAPIGLDesktop, 0, false);
+    validateConfigAPI(config, GPUTestConfig::kAPIGLDesktop, 0, false);
 }
 
 TEST_P(GPUTestConfigTest, GPUTestConfigConditions_GLES)
 {
-    GPUTestConfig config(GPUTestConfig::kAPIGLES, 0);
-    validateConfigAPI(config, GPUTestConfig::kAPIGLES, 0);
+    GPUTestConfig config(GPUTestConfig::kAPIGLES, 0, false);
+    validateConfigAPI(config, GPUTestConfig::kAPIGLES, 0, false);
 }
 
 TEST_P(GPUTestConfigTest, GPUTestConfigConditions_Vulkan)
 {
-    GPUTestConfig config(GPUTestConfig::kAPIVulkan, 0);
-    validateConfigAPI(config, GPUTestConfig::kAPIVulkan, 0);
+    GPUTestConfig config(GPUTestConfig::kAPIVulkan, 0, false);
+    validateConfigAPI(config, GPUTestConfig::kAPIVulkan, 0, false);
 }
 
 TEST_P(GPUTestConfigTest, GPUTestConfigConditions_Vulkan_PreRotation90)
 {
-    GPUTestConfig config(GPUTestConfig::kAPIVulkan, 90);
-    validateConfigAPI(config, GPUTestConfig::kAPIVulkan, 90);
+    GPUTestConfig config(GPUTestConfig::kAPIVulkan, 90, false);
+    validateConfigAPI(config, GPUTestConfig::kAPIVulkan, 90, false);
 }
 
 TEST_P(GPUTestConfigTest, GPUTestConfigConditions_Vulkan_PreRotation180)
 {
-    GPUTestConfig config(GPUTestConfig::kAPIVulkan, 180);
-    validateConfigAPI(config, GPUTestConfig::kAPIVulkan, 180);
+    GPUTestConfig config(GPUTestConfig::kAPIVulkan, 180, false);
+    validateConfigAPI(config, GPUTestConfig::kAPIVulkan, 180, false);
 }
 
 TEST_P(GPUTestConfigTest, GPUTestConfigConditions_Vulkan_PreRotation270)
 {
-    GPUTestConfig config(GPUTestConfig::kAPIVulkan, 270);
-    validateConfigAPI(config, GPUTestConfig::kAPIVulkan, 270);
+    GPUTestConfig config(GPUTestConfig::kAPIVulkan, 270, false);
+    validateConfigAPI(config, GPUTestConfig::kAPIVulkan, 270, false);
+}
+
+TEST_P(GPUTestConfigTest, GPUTestConfigConditions_Vulkan_PreRotation270_DirectSPIRVGen)
+{
+    GPUTestConfig config(GPUTestConfig::kAPIVulkan, 270, true);
+    validateConfigAPI(config, GPUTestConfig::kAPIVulkan, 270, true);
 }
 
 // Use this to select which configurations (e.g. which renderer, which GLES major version) these
diff --git a/src/tests/test_utils/ANGLETest.cpp b/src/tests/test_utils/ANGLETest.cpp
index c928136..d7b4508 100644
--- a/src/tests/test_utils/ANGLETest.cpp
+++ b/src/tests/test_utils/ANGLETest.cpp
@@ -170,6 +170,11 @@
     return nullptr;
 }
 
+const char *GetColorName(GLColorRGB color)
+{
+    return GetColorName(GLColor(color.R, color.G, color.B, 255));
+}
+
 // Always re-use displays when using --bot-mode in the test runner.
 bool gReuseDisplays = false;
 
@@ -306,6 +311,30 @@
     return ostream;
 }
 
+bool operator==(const GLColorRGB &a, const GLColorRGB &b)
+{
+    return a.R == b.R && a.G == b.G && a.B == b.B;
+}
+
+bool operator!=(const GLColorRGB &a, const GLColorRGB &b)
+{
+    return !(a == b);
+}
+
+std::ostream &operator<<(std::ostream &ostream, const GLColorRGB &color)
+{
+    const char *colorName = GetColorName(color);
+    if (colorName)
+    {
+        return ostream << colorName;
+    }
+
+    ostream << "(" << static_cast<unsigned int>(color.R) << ", "
+            << static_cast<unsigned int>(color.G) << ", " << static_cast<unsigned int>(color.B)
+            << ")";
+    return ostream;
+}
+
 bool operator==(const GLColor32F &a, const GLColor32F &b)
 {
     return a.R == b.R && a.G == b.G && a.B == b.B && a.A == b.A;
@@ -399,6 +428,24 @@
     return kIndexedQuadVertices;
 }
 
+testing::AssertionResult AssertEGLEnumsEqual(const char *lhsExpr,
+                                             const char *rhsExpr,
+                                             EGLenum lhs,
+                                             EGLenum rhs)
+{
+    if (lhs == rhs)
+    {
+        return testing::AssertionSuccess();
+    }
+    else
+    {
+        std::stringstream strstr;
+        strstr << std::hex << lhsExpr << " (0x" << int(lhs) << ") != " << rhsExpr << " (0x"
+               << int(rhs) << ")";
+        return testing::AssertionFailure() << strstr.str();
+    }
+}
+
 ANGLETestBase::ANGLETestBase(const PlatformParameters &params)
     : mWidth(16),
       mHeight(16),
@@ -569,14 +616,15 @@
 
     angle::GPUTestConfig::API api = GetTestConfigAPIFromRenderer(mCurrentParams->getRenderer(),
                                                                  mCurrentParams->getDeviceType());
-    GPUTestConfig testConfig      = GPUTestConfig(api, 0);
+    GPUTestConfig testConfig      = GPUTestConfig(api, 0, false);
 
     std::stringstream fullTestNameStr;
     fullTestNameStr << testInfo->test_case_name() << "." << testInfo->name();
     std::string fullTestName = fullTestNameStr.str();
 
-    TestSuite *testSuite    = TestSuite::GetInstance();
-    int32_t testExpectation = testSuite->getTestExpectationWithConfig(testConfig, fullTestName);
+    TestSuite *testSuite = TestSuite::GetInstance();
+    int32_t testExpectation =
+        testSuite->getTestExpectationWithConfigAndUpdateTimeout(testConfig, fullTestName);
 
     if (testExpectation == GPUTestExpectationsParser::kGpuTestSkip)
     {
diff --git a/src/tests/test_utils/ANGLETest.h b/src/tests/test_utils/ANGLETest.h
index 1a24dd8..4a40fed 100644
--- a/src/tests/test_utils/ANGLETest.h
+++ b/src/tests/test_utils/ANGLETest.h
@@ -65,10 +65,17 @@
 #define EXPECT_GLENUM_NE(expected, actual) \
     EXPECT_NE(static_cast<GLenum>(expected), static_cast<GLenum>(actual))
 
-#define ASSERT_EGLENUM_EQ(expected, actual) \
-    ASSERT_EQ(static_cast<EGLenum>(expected), static_cast<EGLenum>(actual))
-#define EXPECT_EGLENUM_EQ(expected, actual) \
-    EXPECT_EQ(static_cast<EGLenum>(expected), static_cast<EGLenum>(actual))
+testing::AssertionResult AssertEGLEnumsEqual(const char *lhsExpr,
+                                             const char *rhsExpr,
+                                             EGLenum lhs,
+                                             EGLenum rhs);
+
+#define ASSERT_EGLENUM_EQ(expected, actual)                                  \
+    ASSERT_PRED_FORMAT2(AssertEGLEnumsEqual, static_cast<EGLenum>(expected), \
+                        static_cast<EGLenum>(actual))
+#define EXPECT_EGLENUM_EQ(expected, actual)                                  \
+    EXPECT_PRED_FORMAT2(AssertEGLEnumsEqual, static_cast<EGLenum>(expected), \
+                        static_cast<EGLenum>(actual))
 
 #define ASSERT_GL_FRAMEBUFFER_COMPLETE(framebuffer) \
     ASSERT_GLENUM_EQ(GL_FRAMEBUFFER_COMPLETE, glCheckFramebufferStatus(framebuffer))
@@ -197,6 +204,10 @@
 std::ostream &operator<<(std::ostream &ostream, const GLColor &color);
 GLColor ReadColor(GLint x, GLint y);
 
+bool operator==(const GLColorRGB &a, const GLColorRGB &b);
+bool operator!=(const GLColorRGB &a, const GLColorRGB &b);
+std::ostream &operator<<(std::ostream &ostream, const GLColorRGB &color);
+
 // Useful to cast any type to GLfloat.
 template <typename TR, typename TG, typename TB, typename TA>
 GLColor32F MakeGLColor32F(TR r, TG g, TB b, TA a)
diff --git a/src/tests/egl_tests/EGLMultiThreadSteps.h b/src/tests/test_utils/MultiThreadSteps.h
similarity index 100%
rename from src/tests/egl_tests/EGLMultiThreadSteps.h
rename to src/tests/test_utils/MultiThreadSteps.h
diff --git a/src/tests/test_utils/VulkanExternalHelper.cpp b/src/tests/test_utils/VulkanExternalHelper.cpp
index 3ad77d2..3c04102 100644
--- a/src/tests/test_utils/VulkanExternalHelper.cpp
+++ b/src/tests/test_utils/VulkanExternalHelper.cpp
@@ -424,6 +424,58 @@
     return true;
 }
 
+// TODO: Deduplicate function from renderer_utils http://anglebug.com/5281
+VkFormat ConvertToSRGB(VkFormat format)
+{
+    switch (format)
+    {
+        case VK_FORMAT_R8G8B8A8_UNORM:
+            return VK_FORMAT_R8G8B8A8_SRGB;
+        case VK_FORMAT_B8G8R8A8_UNORM:
+            return VK_FORMAT_B8G8R8A8_SRGB;
+        case VK_FORMAT_R8_UNORM:
+            return VK_FORMAT_R8_SRGB;
+        case VK_FORMAT_R8G8_UNORM:
+            return VK_FORMAT_R8G8_SRGB;
+        default:
+            return VK_FORMAT_UNDEFINED;
+    }
+}
+
+// TODO: Deduplicate function from RendererVk http://anglebug.com/5281
+bool HaveSameFormatFeatureBits(VkPhysicalDevice physicalDevice, VkFormat format1, VkFormat format2)
+{
+    if (format1 == VK_FORMAT_UNDEFINED || format2 == VK_FORMAT_UNDEFINED)
+    {
+        return false;
+    }
+
+    constexpr VkFormatFeatureFlags kImageUsageFeatureBits =
+        VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT |
+        VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT;
+
+    VkFormatProperties format1Properties = {};
+    vkGetPhysicalDeviceFormatProperties(physicalDevice, format1, &format1Properties);
+
+    VkFormatProperties format2Properties = {};
+    vkGetPhysicalDeviceFormatProperties(physicalDevice, format2, &format2Properties);
+
+    VkFormatFeatureFlags fmt1LinearFeatureBits =
+        format1Properties.linearTilingFeatures & kImageUsageFeatureBits;
+    VkFormatFeatureFlags fmt2LinearFeatureBits =
+        format2Properties.linearTilingFeatures & fmt1LinearFeatureBits;
+    bool sameLinearBits = (fmt2LinearFeatureBits & fmt1LinearFeatureBits) == fmt1LinearFeatureBits;
+
+    VkFormatFeatureFlags fmt1OptimalFeatureBits =
+        format1Properties.optimalTilingFeatures & kImageUsageFeatureBits;
+    VkFormatFeatureFlags fmt2OptimalFeatureBits =
+        format2Properties.optimalTilingFeatures & fmt1OptimalFeatureBits;
+    bool sameOptimalBits =
+        (fmt2OptimalFeatureBits & fmt1OptimalFeatureBits) == fmt1OptimalFeatureBits;
+
+    return sameLinearBits && sameOptimalBits;
+}
+
 VkResult VulkanExternalHelper::createImage2DExternal(VkFormat format,
                                                      VkImageCreateFlags createFlags,
                                                      VkImageUsageFlags usageFlags,
@@ -439,9 +491,32 @@
         /* .handleTypes = */ handleTypes,
     };
 
+    // Use the VK_KHR_image_format_list extension to match VkImageCreateInfo in vk_helpers
+    constexpr uint32_t kImageListFormatCount           = 2;
+    VkFormat imageListFormats[kImageListFormatCount]   = {format, ConvertToSRGB(format)};
+    bool imageFormatListEnabled                        = false;
+    VkImageFormatListCreateInfoKHR imageFormatListInfo = {};
+
+    if (HaveSameFormatFeatureBits(mPhysicalDevice, format, ConvertToSRGB(format)))
+    {
+        imageFormatListEnabled = true;
+
+        // Add VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT to VkImage create flag
+        createFlags |= VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT;
+
+        // There is just 1 additional format we might use to create a VkImageView for this
+        // VkImage
+        imageFormatListInfo.sType           = VK_STRUCTURE_TYPE_IMAGE_FORMAT_LIST_CREATE_INFO_KHR;
+        imageFormatListInfo.pNext           = &externalMemoryImageCreateInfo;
+        imageFormatListInfo.viewFormatCount = kImageListFormatCount;
+        imageFormatListInfo.pViewFormats    = imageListFormats;
+    }
+
     VkImageCreateInfo imageCreateInfo = {
         /* .sType = */ VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO,
-        /* .pNext = */ &externalMemoryImageCreateInfo,
+        /* .pNext = */
+        (imageFormatListEnabled) ? static_cast<const void *>(&imageFormatListInfo)
+                                 : static_cast<const void *>(&externalMemoryImageCreateInfo),
         /* .flags = */ createFlags,
         /* .imageType = */ VK_IMAGE_TYPE_2D,
         /* .format = */ format,
@@ -976,7 +1051,7 @@
     vkFreeCommandBuffers(mDevice, mCommandPool, commandBufferCount, commandBuffers);
 
     void *stagingMemory = nullptr;
-    result = vkMapMemory(mDevice, deviceMemory, 0 /* offset */, pixelsSize, 0 /* flags */,
+    result = vkMapMemory(mDevice, deviceMemory, 0 /* offset */, deviceMemorySize, 0 /* flags */,
                          &stagingMemory);
     ASSERT(result == VK_SUCCESS);
 
@@ -986,7 +1061,7 @@
             /* .pNext = */ nullptr,
             /* .memory = */ deviceMemory,
             /* .offset = */ 0,
-            /* .size = */ pixelsSize,
+            /* .size = */ deviceMemorySize,
         },
     };
     constexpr uint32_t memoryRangeCount = std::extent<decltype(memoryRanges)>();
diff --git a/src/tests/test_utils/angle_test_configs.cpp b/src/tests/test_utils/angle_test_configs.cpp
index cc1b68c..259cc81 100644
--- a/src/tests/test_utils/angle_test_configs.cpp
+++ b/src/tests/test_utils/angle_test_configs.cpp
@@ -49,6 +49,16 @@
     return eglParameters.deviceType == EGL_PLATFORM_ANGLE_DEVICE_TYPE_SWIFTSHADER_ANGLE;
 }
 
+bool PlatformParameters::isVulkan() const
+{
+    return eglParameters.renderer == EGL_PLATFORM_ANGLE_TYPE_VULKAN_ANGLE;
+}
+
+bool PlatformParameters::isANGLE() const
+{
+    return driver == GLESDriverType::AngleEGL;
+}
+
 EGLint PlatformParameters::getAllocateNonZeroMemoryFeature() const
 {
     return eglParameters.allocateNonZeroMemoryFeature;
@@ -278,6 +288,16 @@
         stream << "_DirectSPIRVGen";
     }
 
+    if (pp.eglParameters.directMetalGeneration == EGL_TRUE)
+    {
+        stream << "_DirectMetalGen";
+    }
+
+    if (pp.eglParameters.forceInitShaderVariables == EGL_TRUE)
+    {
+        stream << "_InitShaderVars";
+    }
+
     return stream;
 }
 
diff --git a/src/tests/test_utils/angle_test_configs.h b/src/tests/test_utils/angle_test_configs.h
index 7fb861d..7931d35 100644
--- a/src/tests/test_utils/angle_test_configs.h
+++ b/src/tests/test_utils/angle_test_configs.h
@@ -34,6 +34,8 @@
     EGLint getRenderer() const;
     EGLint getDeviceType() const;
     bool isSwiftshader() const;
+    bool isVulkan() const;
+    bool isANGLE() const;
     EGLint getAllocateNonZeroMemoryFeature() const;
 
     void initDefaultParameters();
@@ -303,6 +305,20 @@
     directSPIRVGeneration.eglParameters.directSPIRVGeneration = EGL_TRUE;
     return directSPIRVGeneration;
 }
+
+inline PlatformParameters WithDirectMetalGeneration(const PlatformParameters &params)
+{
+    PlatformParameters directMetalGeneration                  = params;
+    directMetalGeneration.eglParameters.directMetalGeneration = EGL_TRUE;
+    return directMetalGeneration;
+}
+
+inline PlatformParameters WithInitShaderVariables(const PlatformParameters &params)
+{
+    PlatformParameters initShaderVariables                     = params;
+    initShaderVariables.eglParameters.forceInitShaderVariables = EGL_TRUE;
+    return initShaderVariables;
+}
 }  // namespace angle
 
 #endif  // ANGLE_TEST_CONFIGS_H_
diff --git a/src/tests/test_utils/angle_test_instantiate.cpp b/src/tests/test_utils/angle_test_instantiate.cpp
index c65776b..6eeb639 100644
--- a/src/tests/test_utils/angle_test_instantiate.cpp
+++ b/src/tests/test_utils/angle_test_instantiate.cpp
@@ -176,6 +176,11 @@
 {
     return false;
 }
+
+bool IsMetalCompressedTexture3DAvailable()
+{
+    return false;
+}
 #endif
 
 SystemInfo *GetTestSystemInfo()
@@ -674,10 +679,11 @@
 #endif
 
         case EGL_PLATFORM_ANGLE_TYPE_NULL_ANGLE:
-#ifndef ANGLE_ENABLE_NULL
+#if !defined(ANGLE_ENABLE_NULL)
             return false;
-#endif
+#else
             break;
+#endif
 
         default:
             std::cout << "Unknown test platform: " << param << std::endl;
diff --git a/src/tests/test_utils/angle_test_instantiate.h b/src/tests/test_utils/angle_test_instantiate.h
index 8b142c4..1cbc56c 100644
--- a/src/tests/test_utils/angle_test_instantiate.h
+++ b/src/tests/test_utils/angle_test_instantiate.h
@@ -290,6 +290,9 @@
 // Check whether texture swizzle is natively supported on Metal device.
 bool IsMetalTextureSwizzleAvailable();
 
+// Check whether TEXTURE_3D target is supported for compressed formats on Metal device.
+bool IsMetalCompressedTexture3DAvailable();
+
 extern bool gEnableANGLEPerTestCaptureLabel;
 
 // For use with ANGLE_INSTANTIATE_TEST_ARRAY
diff --git a/src/tests/test_utils/angle_test_instantiate_apple.mm b/src/tests/test_utils/angle_test_instantiate_apple.mm
index 7954ba5..2a4662e 100644
--- a/src/tests/test_utils/angle_test_instantiate_apple.mm
+++ b/src/tests/test_utils/angle_test_instantiate_apple.mm
@@ -38,4 +38,13 @@
     return false;
 }
 
+bool IsMetalCompressedTexture3DAvailable()
+{
+    if (ANGLE_APPLE_AVAILABLE_XCI(10.15, 13.0, 13.0))
+    {
+        return true;
+    }
+    return false;
+}
+
 }  // namespace angle
diff --git a/src/tests/test_utils/compiler_test.cpp b/src/tests/test_utils/compiler_test.cpp
index f42fe19..28f2705 100644
--- a/src/tests/test_utils/compiler_test.cpp
+++ b/src/tests/test_utils/compiler_test.cpp
@@ -103,6 +103,7 @@
 {
     ShBuiltInResources resources;
     sh::InitBuiltInResources(&resources);
+    resources.FragmentPrecisionHigh = 1;
     return compileTestShader(type, spec, output, shaderString, &resources, compileOptions,
                              translatedCode, infoLog);
 }
@@ -113,7 +114,8 @@
     : mShaderType(shaderType), mDefaultCompileOptions(defaultCompileOptions)
 {
     sh::InitBuiltInResources(&mResources);
-    mOutputCode[outputType] = std::string();
+    mResources.FragmentPrecisionHigh = 1;
+    mOutputCode[outputType]          = std::string();
 }
 
 void MatchOutputCodeTest::addOutputType(const ShShaderOutput outputType)
diff --git a/src/tests/test_utils/runner/HistogramWriter.cpp b/src/tests/test_utils/runner/HistogramWriter.cpp
index 1ce80cc..6c48a2e 100644
--- a/src/tests/test_utils/runner/HistogramWriter.cpp
+++ b/src/tests/test_utils/runner/HistogramWriter.cpp
@@ -34,16 +34,11 @@
 {
 namespace
 {
-std::string AsJsonString(const std::string string)
-{
-    return "\"" + string + "\"";
-}
-
 std::string GetUnitAndDirection(proto::UnitAndDirection unit)
 {
     ASSERT(unit.improvement_direction() == proto::SMALLER_IS_BETTER);
-    ASSERT(unit.unit() == proto::MS_BEST_FIT_FORMAT);
-    return "msBestFitFormat";
+    ASSERT(unit.unit() == proto::MS);
+    return "ms_smallerIsBetter";
 }
 }  // namespace
 
@@ -61,7 +56,7 @@
     {
         proto::UnitAndDirection unitAndDirection;
         unitAndDirection.set_improvement_direction(proto::SMALLER_IS_BETTER);
-        unitAndDirection.set_unit(proto::MS_BEST_FIT_FORMAT);
+        unitAndDirection.set_unit(proto::MS);
 
         std::unique_ptr<catapult::HistogramBuilder> builder =
             std::make_unique<catapult::HistogramBuilder>(measurement, unitAndDirection);
@@ -73,7 +68,7 @@
 
         proto::Diagnostic stories;
         proto::GenericSet *genericSet = stories.mutable_generic_set();
-        genericSet->add_values(AsJsonString(story));
+        genericSet->add_values(story);
         mHistograms[measurementAndStory]->AddDiagnostic(catapult::kStoriesDiagnostic, stories);
     }
 
diff --git a/src/tests/test_utils/runner/README.md b/src/tests/test_utils/runner/README.md
index 382eba4..739d3f6 100644
--- a/src/tests/test_utils/runner/README.md
+++ b/src/tests/test_utils/runner/README.md
@@ -78,6 +78,6 @@
  * Closer integration with ANGLE's test expectations and system config libraries.
  * Supporting a GoogleTest-free integration.
 
-[BaseTest]: https://chromium.googlesource.com/chromium/src/+/refs/heads/master/base/test/
-[JSONFormat]: https://chromium.googlesource.com/chromium/src/+/master/docs/testing/json_test_results_format.md
+[BaseTest]: https://chromium.googlesource.com/chromium/src/+/refs/heads/main/base/test/
+[JSONFormat]: https://chromium.googlesource.com/chromium/src/+/main/docs/testing/json_test_results_format.md
 [HistogramSet]: https://chromium.googlesource.com/catapult/+/HEAD/docs/histogram-set-json-format.md
diff --git a/src/tests/test_utils/runner/TestSuite.cpp b/src/tests/test_utils/runner/TestSuite.cpp
index b9363c1..5dce484 100644
--- a/src/tests/test_utils/runner/TestSuite.cpp
+++ b/src/tests/test_utils/runner/TestSuite.cpp
@@ -56,13 +56,16 @@
 
 constexpr char kArtifactsFakeTestName[] = "TestArtifactsFakeTest";
 
+// Note: we use a fairly high test timeout to allow for the first test in a batch to be slow.
+// Ideally we could use a separate timeout for the slow first test.
 #if defined(NDEBUG)
-constexpr int kDefaultTestTimeout = 20;
+constexpr int kDefaultTestTimeout = 60;
 #else
-constexpr int kDefaultTestTimeout  = 60;
+constexpr int kDefaultTestTimeout  = 120;
 #endif
+constexpr int kSlowTestTimeoutScale = 3;
 #if defined(NDEBUG)
-constexpr int kDefaultBatchTimeout = 240;
+constexpr int kDefaultBatchTimeout = 300;
 #else
 constexpr int kDefaultBatchTimeout = 600;
 #endif
@@ -227,7 +230,7 @@
 }
 
 // Writes out a TestResults to the Chromium JSON Test Results format.
-// https://chromium.googlesource.com/chromium/src.git/+/master/docs/testing/json_test_results_format.md
+// https://chromium.googlesource.com/chromium/src.git/+/main/docs/testing/json_test_results_format.md
 void WriteResultsFile(bool interrupted,
                       const TestResults &testResults,
                       const std::string &outputFile,
@@ -432,39 +435,17 @@
     return {testInfo.test_suite_name(), testInfo.name()};
 }
 
-bool IsSlowTest(const std::vector<std::string> &slowTests, const TestIdentifier &testID)
-{
-    char buffer[200] = {};
-    testID.sprintfName(buffer);
-
-    for (const std::string &slowTest : slowTests)
-    {
-        if (NamesMatchWithWildcard(slowTest.c_str(), buffer))
-        {
-            return true;
-        }
-    }
-
-    return false;
-}
-
 class TestEventListener : public testing::EmptyTestEventListener
 {
   public:
     // Note: TestResults is owned by the TestSuite. It should outlive TestEventListener.
     TestEventListener(const std::string &resultsFile,
                       const std::string &histogramJsonFile,
-                      const std::vector<std::string> &slowTests,
-                      double fastTestTimeout,
-                      double slowTestTimeout,
                       const char *testSuiteName,
                       TestResults *testResults,
                       HistogramWriter *histogramWriter)
         : mResultsFile(resultsFile),
           mHistogramJsonFile(histogramJsonFile),
-          mSlowTests(slowTests),
-          mFastTestTimeout(fastTestTimeout),
-          mSlowTestTimeout(slowTestTimeout),
           mTestSuiteName(testSuiteName),
           mTestResults(testResults),
           mHistogramWriter(histogramWriter)
@@ -475,8 +456,6 @@
         std::lock_guard<std::mutex> guard(mTestResults->currentTestMutex);
         mTestResults->currentTest = GetTestIdentifier(testInfo);
         mTestResults->currentTestTimer.start();
-        mTestResults->currentTestTimeout =
-            IsSlowTest(mSlowTests, mTestResults->currentTest) ? mSlowTestTimeout : mFastTestTimeout;
     }
 
     void OnTestEnd(const testing::TestInfo &testInfo) override
@@ -499,9 +478,6 @@
   private:
     std::string mResultsFile;
     std::string mHistogramJsonFile;
-    const std::vector<std::string> &mSlowTests;
-    double mFastTestTimeout;
-    double mSlowTestTimeout;
     const char *mTestSuiteName;
     TestResults *mTestResults;
     HistogramWriter *mHistogramWriter;
@@ -940,8 +916,6 @@
 
 void ListTests(const std::map<TestIdentifier, TestResult> &resultsMap)
 {
-    std::map<std::string, std::vector<std::string>> suites;
-
     std::cout << "Tests list:\n";
 
     for (const auto &resultIt : resultsMap)
@@ -949,6 +923,8 @@
         const TestIdentifier &id = resultIt.first;
         std::cout << id << "\n";
     }
+
+    std::cout << "End tests list.\n";
 }
 
 // Prints the names of the tests matching the user-specified filter flag.
@@ -1071,10 +1047,7 @@
 #if defined(ANGLE_PLATFORM_MACOS)
     // By default, we should hook file API functions on macOS to avoid slow Metal shader caching
     // file access.
-    // TODO(anglebug.com/5505): in the angle_end2end_tests suite,
-    // disabling the shader cache makes the tests run more slowly than
-    // leaving it enabled.
-    // angle::InitMetalFileAPIHooking(*argc, argv);
+    angle::InitMetalFileAPIHooking(*argc, argv);
 #endif
 
 #if defined(ANGLE_PLATFORM_WINDOWS)
@@ -1115,6 +1088,16 @@
         ++argIndex;
     }
 
+    mTestResults.currentTestTimeout = mTestTimeout;
+
+#if defined(ANGLE_PLATFORM_ANDROID)
+    // Workaround for the Android test runner requiring a GTest test list.
+    if (mListTests && filterArgIndex.valid())
+    {
+        DeleteArg(argc, argv, filterArgIndex.value());
+    }
+#endif  // defined(ANGLE_PLATFORM_ANDROID)
+
     if (!mDisableCrashHandler)
     {
         // Note that the crash callback must be owned and not use global constructors.
@@ -1285,9 +1268,9 @@
     if (!mBotMode)
     {
         testing::TestEventListeners &listeners = testing::UnitTest::GetInstance()->listeners();
-        listeners.Append(new TestEventListener(
-            mResultsFile, mHistogramJsonFile, mSlowTests, mTestTimeout, mTestTimeout * 3.0,
-            mTestSuiteName.c_str(), &mTestResults, &mHistogramWriter));
+        listeners.Append(new TestEventListener(mResultsFile, mHistogramJsonFile,
+                                               mTestSuiteName.c_str(), &mTestResults,
+                                               &mHistogramWriter));
 
         for (const TestIdentifier &id : testSet)
         {
@@ -1323,7 +1306,9 @@
             ParseStringArg("--isolated-script-test-output=", argument, &mResultsFile) ||
             ParseStringArg(kFilterFileArg, argument, &mFilterFile) ||
             ParseStringArg(kHistogramJsonFileArg, argument, &mHistogramJsonFile) ||
+            // We need these overloads to work around technical debt in the Android test runner.
             ParseStringArg("--isolated-script-test-perf-output=", argument, &mHistogramJsonFile) ||
+            ParseStringArg("--isolated_script_test_perf_output=", argument, &mHistogramJsonFile) ||
             ParseStringArg(kIsolatedOutDir, argument, &mTestArtifactDirectory) ||
             ParseFlag("--bot-mode", argument, &mBotMode) ||
             ParseFlag("--debug-test-groups", argument, &mDebugTestGroups) ||
@@ -1395,7 +1380,7 @@
 
     std::string resultsFileArg = kResultFileArg + processInfo.resultsFileName;
 
-    // Construct commandline for child process.
+    // Construct command line for child process.
     std::vector<const char *> args;
 
     args.push_back(mTestExecutableName.c_str());
@@ -1471,7 +1456,7 @@
 
 bool TestSuite::finishProcess(ProcessInfo *processInfo)
 {
-    // Get test results and merge into master list.
+    // Get test results and merge into main list.
     TestResults batchResults;
 
     if (!GetTestResultsFromFile(processInfo->resultsFileName.c_str(), &batchResults))
@@ -1625,9 +1610,39 @@
 
 int TestSuite::run()
 {
+#if defined(ANGLE_PLATFORM_ANDROID)
+    if (mListTests && mGTestListTests)
+    {
+        // Workaround for the Android test runner requiring a GTest test list.
+        printf("PlaceholderTest.\n  Placeholder\n");
+        return EXIT_SUCCESS;
+    }
+#endif  // defined(ANGLE_PLATFORM_ANDROID)
+
     if (mListTests)
     {
         ListTests(mTestResults.results);
+
+#if defined(ANGLE_PLATFORM_ANDROID)
+        // Because of quirks with the Chromium-provided Android test runner, we need to use a few
+        // tricks to get the test list output. We add placeholder output for a single test to trick
+        // the test runner into thinking it ran the tests successfully. We also add an end marker
+        // for the tests list so we can parse the list from the more spammy Android stdout log.
+        static constexpr char kPlaceholderTestTest[] = R"(
+[==========] Running 1 test from 1 test suite.
+[----------] Global test environment set-up.
+[----------] 1 test from PlaceholderTest
+[ RUN      ] PlaceholderTest.Placeholder
+[       OK ] PlaceholderTest.Placeholder (0 ms)
+[----------] 1 test from APITest (0 ms total)
+
+[----------] Global test environment tear-down
+[==========] 1 test from 1 test suite ran. (24 ms total)
+[  PASSED  ] 1 test.
+)";
+        printf(kPlaceholderTestTest);
+#endif  // defined(ANGLE_PLATFORM_ANDROID)
+
         return EXIT_SUCCESS;
     }
 
@@ -1844,14 +1859,6 @@
     mHistogramWriter.addSample(measurement, story, value, units);
 }
 
-void TestSuite::registerSlowTests(const char *slowTests[], size_t numSlowTests)
-{
-    for (size_t slowTestIndex = 0; slowTestIndex < numSlowTests; ++slowTestIndex)
-    {
-        mSlowTests.push_back(slowTests[slowTestIndex]);
-    }
-}
-
 std::string TestSuite::addTestArtifact(const std::string &artifactName)
 {
     mTestResults.testArtifactPaths.push_back(artifactName);
@@ -1948,10 +1955,26 @@
     return mTestExpectationsParser.getTestExpectation(testName);
 }
 
-int32_t TestSuite::getTestExpectationWithConfig(const GPUTestConfig &config,
-                                                const std::string &testName)
+void TestSuite::maybeUpdateTestTimeout(uint32_t testExpectation)
 {
-    return mTestExpectationsParser.getTestExpectationWithConfig(config, testName);
+    double testTimeout = (testExpectation == GPUTestExpectationsParser::kGpuTestTimeout)
+                             ? getSlowTestTimeout()
+                             : mTestTimeout;
+    std::lock_guard<std::mutex> guard(mTestResults.currentTestMutex);
+    mTestResults.currentTestTimeout = testTimeout;
+}
+
+int32_t TestSuite::getTestExpectationWithConfigAndUpdateTimeout(const GPUTestConfig &config,
+                                                                const std::string &testName)
+{
+    uint32_t expectation = mTestExpectationsParser.getTestExpectationWithConfig(config, testName);
+    maybeUpdateTestTimeout(expectation);
+    return expectation;
+}
+
+int TestSuite::getSlowTestTimeout() const
+{
+    return mTestTimeout * kSlowTestTimeoutScale;
 }
 
 const char *TestResultTypeToString(TestResultType type)
diff --git a/src/tests/test_utils/runner/TestSuite.h b/src/tests/test_utils/runner/TestSuite.h
index 11ecd25..b167207 100644
--- a/src/tests/test_utils/runner/TestSuite.h
+++ b/src/tests/test_utils/runner/TestSuite.h
@@ -135,7 +135,6 @@
                             const std::string &story,
                             double value,
                             const std::string &units);
-    void registerSlowTests(const char *slowTests[], size_t numSlowTests);
 
     static TestSuite *GetInstance() { return mInstance; }
 
@@ -150,7 +149,9 @@
                                                 const std::string &fileName);
     bool loadAllTestExpectationsFromFile(const std::string &fileName);
     int32_t getTestExpectation(const std::string &testName);
-    int32_t getTestExpectationWithConfig(const GPUTestConfig &config, const std::string &testName);
+    void maybeUpdateTestTimeout(uint32_t testExpectation);
+    int32_t getTestExpectationWithConfigAndUpdateTimeout(const GPUTestConfig &config,
+                                                         const std::string &testName);
     bool logAnyUnusedTestExpectations();
     void setTestExpectationsAllowMask(uint32_t mask)
     {
@@ -164,6 +165,7 @@
     int printFailuresAndReturnCount() const;
     void startWatchdog();
     void dumpTestExpectationsErrorMessages();
+    int getSlowTestTimeout() const;
 
     static TestSuite *mInstance;
 
@@ -200,7 +202,6 @@
     std::vector<ProcessInfo> mCurrentProcesses;
     std::thread mWatchdogThread;
     HistogramWriter mHistogramWriter;
-    std::vector<std::string> mSlowTests;
     std::string mTestArtifactDirectory;
     GPUTestExpectationsParser mTestExpectationsParser;
 };
diff --git a/src/third_party/ceval/.clang-format b/src/third_party/ceval/.clang-format
new file mode 100644
index 0000000..9d15924
--- /dev/null
+++ b/src/third_party/ceval/.clang-format
@@ -0,0 +1,2 @@
+DisableFormat: true
+SortIncludes: false
diff --git a/src/third_party/ceval/LICENSE b/src/third_party/ceval/LICENSE
new file mode 100644
index 0000000..eda5f70
--- /dev/null
+++ b/src/third_party/ceval/LICENSE
@@ -0,0 +1,21 @@
+MIT License
+
+Copyright (c) 2021 e_t
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/src/third_party/ceval/README.chromium b/src/third_party/ceval/README.chromium
new file mode 100644
index 0000000..97158a6
--- /dev/null
+++ b/src/third_party/ceval/README.chromium
@@ -0,0 +1,8 @@
+Name: ceval
+URL: https://github.com/erstan/ceval-single-header
+Version: 1ed80ae78ba7bef1744b1ccdffc6c6802eeec8fa
+License: MIT
+License File: LICENSE
+
+Description:
+A C/C++ header for parsing and evaluation of arithmetic expressions.
diff --git a/src/third_party/ceval/README.md b/src/third_party/ceval/README.md
new file mode 100644
index 0000000..2d3befe
--- /dev/null
+++ b/src/third_party/ceval/README.md
@@ -0,0 +1,263 @@
+# ceval
+A C/C++ header for parsing and evaluation of arithmetic expressions.
+
+[README file is almost identical to that of the <a href="https://github.com/erstan/ceval#readme">ceval</a> library]
+
+## Functions accessibe from main()
+<table>
+<thead><th>Function</th><th>Argument(s)</th><th>Return Value</th></thead>
+<tbody>
+ <tr>
+  <td><code>ceval_result()</code></td>
+  <td>A mathematical expression in the form of a character array or a CPP string</td>
+  <td>The result of the expression as a floating point number</td>
+</tr>
+<tr>
+  <td><code>ceval_tree()</code></td>
+  <td>A mathematical expression in the form of a character array or a CPP string</td>
+  <td>The function prints the parse tree with each node properly indented depending on it's location in the tree structure</td>
+</tr>
+</tbody>
+</table>
+
+## Supported expressions
+Any valid combination of the following operators and functions, with floating point numbers as operands can be parsed by <b>ceval</b>. Parentheses can be used to override the default operator precedences. 
+
+* Arithematic operators
+
+`+` (addition), `-` (subtraction), `*` (multiplication), `/` (division), `%` (modulo), `**` (exponentiation), `//` (quotient)
+* Relational operators
+
+`==` (equal), `!=` (not equal), `<` (strictly less), `>` (strictly greater), `<=` (less or equal), `>=` (greater or equal) to compare the results of two expressions
+
+* Single-argument functions
+
+`exp()`, `sqrt()`, `cbrt()`, `sin()`, `cos()`, `tan()`, `asin()`, `acos()`, `atan()`, `sinh()`, `cosh()`, `tanh()`, `abs()`, `ceil()`, `floor()`, `log10()`, `ln()`, `deg2rad()`, `rad2deg()`, `signum()`, `int()`, `frac()`, `fact()`
+
+* Two-argument functions
+
+`pow()`, `atan2()`, `gcd()`, `hcf()`, `lcm()`, `log()` (generalized log(b, x) to any base `b`)
+
+* Pre-defined math constants
+
+`_pi`, `_e`
+
+...pre-defined constants are prefixed with an underscore
+
+* Logical operators
+
+`&&`, `||` and `!`
+
+* Bitwise operators 
+
+`&`, `|`, `^`, `<<`, `>>`, `~`
+
+* Other operators
+
+  * `,` (Comma operator)
+  Comma operator returns the result of it's rightmost operand
+  Ex: `2,3` would give `3`; `4,3,0` would be equal to `0`; and `cos(_pi/2,_pi/3,_pi)` would return `cos(_pi)` i.e, `-1`
+  * `e` (e-operator for scientific notation)
+  Using the binary `e` operator, we can use scientific notation in our arithmetic expressions
+  Ex: `0.0314` could be written as `3.14e-2`; `1230000` could be subsituted by `1.23e6`
+
+## Usage
+Include the ceval library using the `#include "PATH_TO_CEVAL.H"` directive your C/C++ project. 
+
+The code snippet given below is a console based interpreter that interactively takes in math expressions from stdin, and prints out their parse trees and results. 
+
+```
+//lang=c
+#include<stdio.h>
+#include<stdlib.h>
+
+#include "ceval.h"
+
+int main(int argc, char ** argv) {
+  char expr[100];
+  while (1) {
+    printf("In = ");
+    fgets(expr, 100, stdin);
+    if (!strcmp(expr, "exit\n")) {
+      break;
+    } else if (!strcmp(expr, "clear\n")) {
+      system("clear");
+      continue;
+    } else {
+      ceval_tree(expr);
+      printf("\nOut = %f\n\n", ceval_result(expr));
+    }
+  }
+  return 0;
+}
+```
+
+## Test Run
+```
+In = 3*7**2
+                2
+        **
+                7
+*
+        3
+
+Out = 147.000000
+
+
+In = (3.2+2.8)/2
+        2
+/
+                2.80
+        +
+                3.20
+
+Out = 3.000000
+
+
+In = _e**_pi>_pi**_e
+                2.72
+        **
+                3.14
+>
+                3.14
+        **
+                2.72
+
+Out = 1.000000
+
+
+In = 5.4%2
+        2
+%
+        5.40
+
+Out = 1.400000
+
+
+In = 5.4//2
+        2
+//
+        5.40
+
+Out = 2.000000
+
+
+In = 2*2.0+1.4
+        1.40
++
+                2
+        *
+                2
+
+Out = 5.400000
+
+
+In = (5/4+3*-5)+(sin(_pi))**2+(cos(_pi))**2
+                2
+        **
+                        3.14
+                cos
++
+                        2
+                **
+                                3.14
+                        sin
+        +
+                                        5
+                                -
+                        *
+                                3
+                +
+                                4
+                        /
+                                5
+
+Out = -12.750000
+
+
+In = 3,4,5,6
+        6
+,
+                5
+        ,
+                        4
+                ,
+                        3
+
+Out = 6.000000
+
+
+In = tanh(2/3)==(sinh(2/3)/cosh(2/3))
+                                3
+                        /
+                                2
+                cosh
+        /
+                                3
+                        /
+                                2
+                sinh
+==
+                        3
+                /
+                        2
+        tanh
+
+Out = 1.000000
+
+
+In = (2+3/3+(3+9.7))
+                9.70
+        +
+                3
++
+                        3
+                /
+                        3
+        +
+                2
+
+Out = 15.700000
+
+
+In = sin(_pi/2)+cos(_pi/2)+tan(_pi/2)
+                        2
+                /
+                        3.14
+        tan
++
+                                2
+                        /
+                                3.14
+                cos
+        +
+                                2
+                        /
+                                3.14
+                sin
+
+[ceval]: tan() is not defined for odd-integral multiples of _pi/2
+
+Out = nan
+
+
+In = asin(2)
+        2
+asin
+
+[ceval]: Numerical argument out of domain
+
+Out = nan
+
+
+In = exit
+... Program finished with exit code 0
+
+```
+## Note
+When the `ceval.h` file is included in a C-program, you might require the `-lm` flag to link `math.h`
+
+```shell
+gcc file.c -lm 
+```
+
diff --git a/src/third_party/ceval/ceval.h b/src/third_party/ceval/ceval.h
new file mode 100644
index 0000000..e8825ae
--- /dev/null
+++ b/src/third_party/ceval/ceval.h
@@ -0,0 +1,1072 @@
+#ifndef CEVAL
+#define CEVAL
+//functions accessible from main() 
+// - double ceval_result(char * inp) returns the result of valid math expression stored as a char array `inp`
+// - void ceval_tree(char * inp) prints the parse tree for the input expression `inp`
+
+#include<stdio.h>
+#include<string.h>
+#include<math.h>
+#include<ctype.h>
+#include<stdarg.h>
+/****************************************** TOKENS ***********************************************/
+typedef enum ceval_node_id {
+    CEVAL_WHITESPACE, CEVAL_OPENPAR, CEVAL_CLOSEPAR, CEVAL_COMMA, 
+    CEVAL_OR, CEVAL_AND, CEVAL_BIT_OR, CEVAL_BIT_XOR,
+    CEVAL_BIT_AND, CEVAL_EQUAL, CEVAL_NOTEQUAL,CEVAL_LESSER,
+    CEVAL_GREATER, CEVAL_LESSER_S, CEVAL_GREATER_S, CEVAL_BIT_LSHIFT, 
+    CEVAL_BIT_RSHIFT, CEVAL_PLUS, CEVAL_MINUS, CEVAL_TIMES, 
+    CEVAL_DIVIDE, CEVAL_MODULO, CEVAL_QUOTIENT, CEVAL_POW,
+    CEVAL_GCD, CEVAL_HCF, CEVAL_LCM, CEVAL_LOG,
+    CEVAL_ATAN2, CEVAL_SCI2DEC, CEVAL_POWFUN, 
+
+    CEVAL_ABS, CEVAL_EXP, CEVAL_SQRT,CEVAL_CBRT, 
+    CEVAL_LN, CEVAL_LOG10, CEVAL_CEIL, CEVAL_FLOOR, 
+    CEVAL_SIGNUM, CEVAL_FACTORIAL, CEVAL_INT, CEVAL_FRAC, 
+    CEVAL_DEG2RAD, CEVAL_RAD2DEG, CEVAL_SIN, CEVAL_COS, 
+    CEVAL_TAN, CEVAL_ASIN, CEVAL_ACOS, CEVAL_ATAN, 
+    CEVAL_SINH, CEVAL_COSH, CEVAL_TANH,CEVAL_NOT, 
+    CEVAL_BIT_NOT,CEVAL_POSSIGN, CEVAL_NEGSIGN, 
+    
+    CEVAL_NUMBER, CEVAL_CONST_PI, CEVAL_CONST_E
+} ceval_node_id;
+typedef enum ceval_token_prec_specifiers {
+// precedences :: <https://en.cppreference.com/w/cpp/language/operator_precedence>
+// these precision specifiers are ordered in the ascending order of their precedences
+// here, the higher precedence operators are evaluated first and end up at the bottom of the parse trees
+    CEVAL_PREC_IGNORE, 
+    // {' ', '\t', '\n', '\b', '\r'}
+    CEVAL_PREC_PARANTHESES,
+    // {'(', ')'}
+    CEVAL_PREC_COMMA_OPR,
+    // {','}
+    CEVAL_PREC_LOGICAL_OR_OPR,
+    // {'||'}
+    CEVAL_PREC_LOGICAL_AND_OPR,
+    // {'&&'}
+    CEVAL_PREC_BIT_OR_OPR,
+    // {'|'}
+    CEVAL_PREC_BIT_XOR_OPR,
+    // {'^'}
+    CEVAL_PREC_BIT_AND_OPR,
+    // {'&'}
+    CEVAL_PREC_EQUALITY_OPRS,
+    // {'==', '!='}
+    CEVAL_PREC_RELATIONAL_OPRS,
+    // {'<', '>', '<=', '>='}
+    CEVAL_PREC_BIT_SHIFT_OPRS,
+    // {'<<', '>>'}
+    CEVAL_PREC_ADDITIVE_OPRS,
+    // {'+', '-'}
+    CEVAL_PREC_SIGN_OPRS,
+    // {'+', '-'}
+    CEVAL_PREC_MULTIPLICATIVE_OPRS,
+    // {'*', '/', '%', '//'}
+    CEVAL_PREC_EXPONENTIATION_OPR,
+    // {'**'}
+    CEVAL_PREC_FUNCTIONS,
+    // {
+    //     'exp()', 'sqrt()', 'cbrt()', 'sin()',
+    //     'cos()', 'tan()', 'asin()', 'acos()', 
+    //     'atan()', 'sinh()', 'cosh()', 'tanh()', 
+    //     'abs()', 'ceil()', 'floor()', 'log10()', 
+    //     'ln()', 'deg2rad()', 'rad2deg()', 'signum()',
+    //     'int()', 'frac()', 'fact()', `pow()`, 
+    //     `atan2()`, `gcd()`, `hcf()`, `lcm()`,
+    //     `log()`
+    // }
+    CEVAL_PREC_NOT_OPRS,
+    // {'!', '~'}}
+    CEVAL_PREC_SCI2DEC_OPR,
+    // {'e'},
+    CEVAL_PREC_NUMERIC
+    // {'_pi', '_e', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9'}
+} ceval_token_prec_specifiers;
+typedef enum ceval_token_type {
+    CEVAL_UNARY_OPERATOR,
+    CEVAL_BINARY_OPERATOR,
+    CEVAL_UNARY_FUNCTION,
+    CEVAL_BINARY_FUNCTION,
+    CEVAL_OTHER
+} ceval_token_type;
+typedef struct ceval_token_info_ {
+    ceval_node_id id;
+    const char * symbol; 
+    double prec;
+    ceval_token_type token_type;
+} ceval_token_info_; 
+ceval_token_info_ ceval_token_info[] = {
+    { CEVAL_WHITESPACE, " ", CEVAL_PREC_IGNORE, CEVAL_OTHER },
+    { CEVAL_WHITESPACE, "\n", CEVAL_PREC_IGNORE, CEVAL_OTHER },
+    { CEVAL_WHITESPACE, "\t", CEVAL_PREC_IGNORE, CEVAL_OTHER },
+    { CEVAL_WHITESPACE, "\r", CEVAL_PREC_IGNORE, CEVAL_OTHER },
+    { CEVAL_WHITESPACE, "\b", CEVAL_PREC_IGNORE, CEVAL_OTHER },
+
+    { CEVAL_DEG2RAD, "deg2rad", CEVAL_PREC_FUNCTIONS, CEVAL_UNARY_FUNCTION },
+    { CEVAL_RAD2DEG, "rad2deg", CEVAL_PREC_FUNCTIONS, CEVAL_UNARY_FUNCTION },
+
+    { CEVAL_SIGNUM, "signum", CEVAL_PREC_FUNCTIONS, CEVAL_UNARY_FUNCTION },
+
+    { CEVAL_ATAN2, "atan2", CEVAL_PREC_FUNCTIONS, CEVAL_BINARY_FUNCTION }, 
+    { CEVAL_LOG10, "log10", CEVAL_PREC_FUNCTIONS, CEVAL_UNARY_FUNCTION },
+    { CEVAL_FLOOR, "floor", CEVAL_PREC_FUNCTIONS, CEVAL_UNARY_FUNCTION },
+
+    { CEVAL_SQRT, "sqrt", CEVAL_PREC_FUNCTIONS , CEVAL_UNARY_FUNCTION },
+    { CEVAL_CBRT, "cbrt", CEVAL_PREC_FUNCTIONS , CEVAL_UNARY_FUNCTION },
+    { CEVAL_CEIL, "ceil", CEVAL_PREC_FUNCTIONS, CEVAL_UNARY_FUNCTION },
+    { CEVAL_FRAC, "frac", CEVAL_PREC_FUNCTIONS, CEVAL_UNARY_FUNCTION },
+    { CEVAL_FACTORIAL, "fact", CEVAL_PREC_FUNCTIONS, CEVAL_UNARY_FUNCTION }, 
+    { CEVAL_SINH, "sinh", CEVAL_PREC_FUNCTIONS, CEVAL_UNARY_FUNCTION }, 
+    { CEVAL_COSH, "cosh", CEVAL_PREC_FUNCTIONS, CEVAL_UNARY_FUNCTION },
+    { CEVAL_TANH, "tanh", CEVAL_PREC_FUNCTIONS, CEVAL_UNARY_FUNCTION },
+    { CEVAL_ASIN, "asin", CEVAL_PREC_FUNCTIONS, CEVAL_UNARY_FUNCTION }, 
+    { CEVAL_ACOS, "acos", CEVAL_PREC_FUNCTIONS, CEVAL_UNARY_FUNCTION },
+    { CEVAL_ATAN, "atan", CEVAL_PREC_FUNCTIONS, CEVAL_UNARY_FUNCTION },
+    
+    { CEVAL_POWFUN, "pow", CEVAL_PREC_FUNCTIONS, CEVAL_BINARY_FUNCTION }, 
+    { CEVAL_GCD, "gcd", CEVAL_PREC_FUNCTIONS, CEVAL_BINARY_FUNCTION }, 
+    { CEVAL_HCF, "hcf", CEVAL_PREC_FUNCTIONS, CEVAL_BINARY_FUNCTION }, 
+    { CEVAL_LCM, "lcm", CEVAL_PREC_FUNCTIONS, CEVAL_BINARY_FUNCTION }, 
+    { CEVAL_LOG, "log", CEVAL_PREC_FUNCTIONS, CEVAL_BINARY_FUNCTION }, 
+    { CEVAL_INT, "int", CEVAL_PREC_FUNCTIONS, CEVAL_UNARY_FUNCTION },
+    { CEVAL_SIN, "sin", CEVAL_PREC_FUNCTIONS, CEVAL_UNARY_FUNCTION },
+    { CEVAL_COS, "cos", CEVAL_PREC_FUNCTIONS, CEVAL_UNARY_FUNCTION },
+    { CEVAL_TAN, "tan", CEVAL_PREC_FUNCTIONS, CEVAL_UNARY_FUNCTION },
+    { CEVAL_ABS, "abs", CEVAL_PREC_FUNCTIONS , CEVAL_UNARY_FUNCTION },
+    { CEVAL_EXP, "exp", CEVAL_PREC_FUNCTIONS , CEVAL_UNARY_FUNCTION },
+    { CEVAL_CONST_PI, "_pi", CEVAL_PREC_NUMERIC, CEVAL_OTHER },
+
+    { CEVAL_CONST_E, "_e", CEVAL_PREC_NUMERIC, CEVAL_OTHER },
+    { CEVAL_LN, "ln", CEVAL_PREC_FUNCTIONS, CEVAL_UNARY_FUNCTION },
+    { CEVAL_OR, "||", CEVAL_PREC_LOGICAL_OR_OPR, CEVAL_BINARY_OPERATOR },
+    { CEVAL_AND, "&&", CEVAL_PREC_LOGICAL_AND_OPR, CEVAL_BINARY_OPERATOR },
+    { CEVAL_EQUAL, "==", CEVAL_PREC_EQUALITY_OPRS, CEVAL_BINARY_OPERATOR },
+    { CEVAL_NOTEQUAL, "!=", CEVAL_PREC_EQUALITY_OPRS, CEVAL_BINARY_OPERATOR },
+    { CEVAL_LESSER, "<=", CEVAL_PREC_RELATIONAL_OPRS , CEVAL_BINARY_OPERATOR },
+    { CEVAL_GREATER, ">=", CEVAL_PREC_RELATIONAL_OPRS , CEVAL_BINARY_OPERATOR },
+    { CEVAL_BIT_LSHIFT, "<<", CEVAL_PREC_BIT_SHIFT_OPRS, CEVAL_BINARY_OPERATOR},
+    { CEVAL_BIT_RSHIFT, ">>", CEVAL_PREC_BIT_SHIFT_OPRS, CEVAL_BINARY_OPERATOR},
+    { CEVAL_QUOTIENT, "//", CEVAL_PREC_MULTIPLICATIVE_OPRS , CEVAL_BINARY_OPERATOR }, 
+    { CEVAL_POW, "**", CEVAL_PREC_EXPONENTIATION_OPR , CEVAL_BINARY_OPERATOR },
+
+    { CEVAL_OPENPAR, "(", CEVAL_PREC_PARANTHESES, CEVAL_OTHER },
+    { CEVAL_CLOSEPAR, ")", CEVAL_PREC_PARANTHESES, CEVAL_OTHER },
+    { CEVAL_COMMA, ",", CEVAL_PREC_COMMA_OPR , CEVAL_BINARY_OPERATOR },
+    { CEVAL_BIT_OR, "|", CEVAL_PREC_BIT_OR_OPR, CEVAL_BINARY_OPERATOR},
+    { CEVAL_BIT_XOR, "^", CEVAL_PREC_BIT_XOR_OPR, CEVAL_BINARY_OPERATOR},
+    { CEVAL_BIT_AND, "&", CEVAL_PREC_BIT_AND_OPR, CEVAL_BINARY_OPERATOR},
+    { CEVAL_LESSER_S, "<", CEVAL_PREC_RELATIONAL_OPRS , CEVAL_BINARY_OPERATOR },
+    { CEVAL_GREATER_S, ">", CEVAL_PREC_RELATIONAL_OPRS , CEVAL_BINARY_OPERATOR },
+    { CEVAL_PLUS, "+", CEVAL_PREC_ADDITIVE_OPRS , CEVAL_BINARY_OPERATOR },
+    { CEVAL_MINUS, "-", CEVAL_PREC_ADDITIVE_OPRS , CEVAL_BINARY_OPERATOR },
+    { CEVAL_POSSIGN, "+", CEVAL_PREC_SIGN_OPRS, CEVAL_UNARY_OPERATOR }, 
+    { CEVAL_NEGSIGN, "-", CEVAL_PREC_SIGN_OPRS, CEVAL_UNARY_OPERATOR }, 
+    { CEVAL_TIMES, "*", CEVAL_PREC_MULTIPLICATIVE_OPRS , CEVAL_BINARY_OPERATOR },
+    { CEVAL_DIVIDE, "/", CEVAL_PREC_MULTIPLICATIVE_OPRS , CEVAL_BINARY_OPERATOR },
+    { CEVAL_MODULO, "%", CEVAL_PREC_MULTIPLICATIVE_OPRS , CEVAL_BINARY_OPERATOR },
+    { CEVAL_NOT, "!", CEVAL_PREC_NOT_OPRS, CEVAL_UNARY_FUNCTION},
+    { CEVAL_BIT_NOT, "~", CEVAL_PREC_NOT_OPRS, CEVAL_UNARY_OPERATOR},
+
+    { CEVAL_SCI2DEC, "e", CEVAL_PREC_SCI2DEC_OPR , CEVAL_BINARY_OPERATOR },
+    { CEVAL_NUMBER, "0", CEVAL_PREC_NUMERIC, CEVAL_OTHER },
+    { CEVAL_NUMBER, "1", CEVAL_PREC_NUMERIC, CEVAL_OTHER },
+    { CEVAL_NUMBER, "2", CEVAL_PREC_NUMERIC, CEVAL_OTHER },
+    { CEVAL_NUMBER, "3", CEVAL_PREC_NUMERIC, CEVAL_OTHER },
+    { CEVAL_NUMBER, "4", CEVAL_PREC_NUMERIC, CEVAL_OTHER },
+    { CEVAL_NUMBER, "5", CEVAL_PREC_NUMERIC, CEVAL_OTHER },
+    { CEVAL_NUMBER, "6", CEVAL_PREC_NUMERIC, CEVAL_OTHER },
+    { CEVAL_NUMBER, "7", CEVAL_PREC_NUMERIC, CEVAL_OTHER },
+    { CEVAL_NUMBER, "8", CEVAL_PREC_NUMERIC, CEVAL_OTHER },
+    { CEVAL_NUMBER, "9", CEVAL_PREC_NUMERIC, CEVAL_OTHER },
+}; 
+#ifndef CEVAL_TOKEN_TABLE_SIZE
+#define CEVAL_TOKEN_TABLE_SIZE sizeof(ceval_token_info) / sizeof(ceval_token_info[0])
+#endif
+int ceval_is_binary_opr(ceval_node_id id) {
+    for(unsigned int i = 0; i < CEVAL_TOKEN_TABLE_SIZE; i++) {
+        if (ceval_token_info[i].id == id && ceval_token_info[i].token_type == CEVAL_BINARY_OPERATOR) {
+            return 1;
+        }
+    }
+    return 0;
+}
+int ceval_is_binary_fun(ceval_node_id id) {
+    for(unsigned int i = 0; i < CEVAL_TOKEN_TABLE_SIZE; i++) {
+        if (ceval_token_info[i].id == id && ceval_token_info[i].token_type == CEVAL_BINARY_FUNCTION) {
+            return 1;
+        }
+    }
+    return 0;
+}
+const char * ceval_token_symbol(ceval_node_id id) {
+    for(unsigned int i = 0; i < CEVAL_TOKEN_TABLE_SIZE; i++) {
+        if (id == ceval_token_info[i].id) {
+            return ceval_token_info[i].symbol;
+        }
+    }
+return "";
+}
+ceval_node_id ceval_token_id(char * symbol) {
+    for(unsigned int i = 0; i < CEVAL_TOKEN_TABLE_SIZE; i++) {
+        if (!strcmp(ceval_token_info[i].symbol, symbol)) {
+            return ceval_token_info[i].id;
+        }
+    }
+return CEVAL_WHITESPACE;
+}
+double ceval_token_prec(ceval_node_id id) {
+    for(unsigned int i = 0; i < CEVAL_TOKEN_TABLE_SIZE; i++) {
+        if (id == ceval_token_info[i].id) {
+            return ceval_token_info[i].prec;
+        }
+    }
+return 0;
+}
+typedef struct ceval_node {
+    enum ceval_node_id id;
+    double pre;
+    double number;
+    struct ceval_node * left, * right, * parent;
+}
+ceval_node;
+#ifdef __cplusplus
+  #define CEVAL_CXX
+  #include<iostream>
+  #include<string>
+#endif
+/***************************************** !TOKENS *******************************************/
+
+/****************************************** FUNCTIONS ******************************************/
+//constant definitions
+#ifdef M_PI
+#define CEVAL_PI M_PI
+#else
+#define CEVAL_PI 3.14159265358979323846
+#endif
+#ifdef M_E
+#define CEVAL_E M_E
+#else
+#define CEVAL_E 2.71828182845904523536
+#endif
+
+#ifndef CEVAL_EPSILON
+#define CEVAL_EPSILON 1e-2
+#endif
+#ifndef CEVAL_DELTA
+#define CEVAL_DELTA 1e-6
+#endif
+#ifndef CEVAL_MAX_DIGITS
+#define CEVAL_MAX_DIGITS 15
+#endif
+//these can be defined by the user before the include directive depending the desired level of precision
+
+//helper function prototypes
+void ceval_error(const char * , ...);
+double ceval_gcd_binary(int, int);
+char * ceval_shrink(char * );
+
+//single argument funtion prototypes
+double ceval_signum(double);
+double ceval_asin(double);
+double ceval_acos(double);
+double ceval_atan(double);
+double ceval_sin(double);
+double ceval_cos(double);
+double ceval_tan(double);
+double ceval_sinh(double);
+double ceval_cosh(double);
+double ceval_tanh(double);
+double ceval_rad2deg(double);
+double ceval_deg2rad(double);
+double ceval_int_part(double);
+double ceval_frac_part(double);
+double ceval_log10(double);
+double ceval_ln(double);
+double ceval_exp(double);
+double ceval_factorial(double);
+double ceval_positive_sign(double);
+double ceval_negative_sign(double);
+double ceval_abs(double);
+double ceval_sqrt(double);
+double ceval_sqrt(double);
+double ceval_cbrt(double);
+double ceval_ceil(double);
+double ceval_floor(double);
+double ceval_not(double);
+double ceval_bit_not(double);
+
+//double argument function prototypes
+double ceval_sum(double, double, int);
+double ceval_diff(double, double, int);
+double ceval_prod(double, double, int);
+double ceval_div(double, double, int);
+double ceval_quotient(double, double, int);
+double ceval_modulus(double, double, int);
+double ceval_gcd(double, double, int);
+double ceval_hcf(double, double, int);
+double ceval_lcm(double, double, int);
+double ceval_log(double, double, int);
+double ceval_are_equal(double, double, int);
+double ceval_not_equal(double, double, int);
+double ceval_lesser(double, double, int);
+double ceval_greater(double, double, int);
+double ceval_lesser_s(double, double, int);
+double ceval_greater_s(double, double, int);
+double ceval_comma(double, double, int);
+double ceval_power(double, double, int);
+double ceval_atan2(double, double, int);
+double ceval_sci2dec(double, double, int);
+double ceval_and(double, double, int);
+double ceval_or(double, double, int);
+double ceval_bit_and(double, double, int);
+double ceval_bit_xor(double, double, int);
+double ceval_bit_or(double, double, int);
+double ceval_bit_lshift(double, double, int);
+double ceval_bit_rshift(double, double, int);
+
+//helper function definitions
+void ceval_error(const char* error_format_string, ...) {
+    #ifndef CEVAL_STOICAL
+        // start whining
+        printf("\n[ceval]: ");
+        va_list args;
+        va_start(args, error_format_string);
+        vprintf(error_format_string, args);
+        va_end(args);
+        printf("\n");
+    #endif
+}
+double ceval_gcd_binary(int a, int b) {
+    if (a == 0 && b == 0)
+        return 0;
+    while (b) {
+        a %= b;
+        b ^= a;
+        a ^= b;
+        b ^= a;
+    }
+    return a;
+}
+char * ceval_shrink(char * x) {
+    char * y = x;
+    unsigned int len = 0;
+    for (unsigned int i = 0; i < strlen(x); i++) {
+        if(x[i] == ' ' || x[i] == '\n' || x[i] == '\t' || x[i] == '\r') {
+            continue;
+        } else {
+            if(x[i]=='(' && x[i+1]==')') {
+                // empty pairs of parantheses are ignored
+                // simlar to c lang where {} are ignored as empty blocks of code
+                i++;
+                continue;
+            }
+            *(y + len) = (char)tolower(x[i]);
+            len++;
+        }
+    }
+    y[len] = '\0';
+    return y;
+}
+//single argument function definitions
+double( * single_arg_fun[])(double) = {
+    // double_arg_fun (first three tokens are whitespace and parantheses)
+    NULL, NULL, NULL, NULL,
+    NULL, NULL, NULL, NULL,
+    NULL, NULL, NULL, NULL, 
+    NULL, NULL, NULL, NULL, 
+    NULL, NULL, NULL, NULL,
+    NULL, NULL, NULL, NULL,
+    NULL, NULL, NULL, NULL, 
+    NULL, NULL, NULL,
+    // single_arg_fun
+    ceval_abs, ceval_exp, ceval_sqrt, ceval_cbrt,
+    ceval_ln, ceval_log10, ceval_ceil, ceval_floor,
+    ceval_signum, ceval_factorial, ceval_int_part, ceval_frac_part,
+    ceval_deg2rad, ceval_rad2deg, ceval_sin, ceval_cos,
+    ceval_tan, ceval_asin, ceval_acos, ceval_atan,
+    ceval_sinh, ceval_cosh, ceval_tanh, ceval_not,
+    ceval_bit_not, ceval_positive_sign, ceval_negative_sign,
+    // number and constant tokens
+    NULL, NULL, NULL
+};
+double ceval_signum(double x) {
+    return (x == 0) ? 0 :
+        (x > 0) ? 1 :
+        -1;
+}
+double ceval_asin(double x) {
+    if (x > 1 || x < -1) {
+        ceval_error("Numerical argument out of domain");
+        return NAN;
+    }
+    return asin(x);
+}
+double ceval_acos(double x) {
+    if (x > 1 || x < -1) {
+        ceval_error("Numerical argument out of domain");
+        return NAN;
+    }
+    return acos(x);
+}
+double ceval_atan(double x) {
+    return atan(x);
+}
+double ceval_sin(double x) {
+    double sin_val = sin(x);
+    //sin(pi) == 0.000000, but sin(pi-CEVAL_EPSILON) == -0.00000* and sin(pi+CEVAL_EPSILON) == +0.00000*
+    //since the precision of pi (approx) is limited, it often leads to -0.0000 printed out as a result
+    //thus, we assumse 0.0000 value for all |sin(x)|<=CEVAL_EPSILON
+    return (fabs(sin_val) <= CEVAL_EPSILON) ? 0 : sin_val;
+}
+double ceval_cos(double x) {
+    double cos_val = cos(x);
+    return (fabs(cos_val) <= CEVAL_EPSILON) ? 0 : cos_val;
+}
+double ceval_tan(double x) {
+    double tan_val = tan(x);
+    if (fabs(ceval_modulus(x - CEVAL_PI / 2, CEVAL_PI, 0)) <= CEVAL_DELTA) {
+        ceval_error("tan() is not defined for odd-integral multiples of pi/2");
+        return NAN;
+    }
+    return (fabs(tan_val) <= CEVAL_EPSILON) ? 0 : tan_val;
+}
+double ceval_rad2deg(double x) {
+    return x / CEVAL_PI * 180;
+}
+double ceval_deg2rad(double x) {
+    return x / 180 * CEVAL_PI;
+}
+double ceval_int_part(double x) {
+    double x_i;
+    modf(x, & x_i);
+    return x_i;
+}
+double ceval_frac_part(double x) {
+    double x_i, x_f;
+    x_f = modf(x, & x_i);
+    return x_f;
+}
+double ceval_log10(double x) {
+    return ceval_log(10, x, 0);
+}
+double ceval_ln(double x) {
+    return ceval_log(CEVAL_E, x, 0);
+}
+double ceval_exp(double x) {
+    return ceval_power(CEVAL_E, x, 0);
+}
+double ceval_factorial(double x) {
+    if (x < 0) {
+        ceval_error("Numerical argument out of domain");
+        return NAN;
+    }
+    return tgamma(x + 1);
+}
+double ceval_positive_sign(double x) {
+    return x;
+}
+double ceval_negative_sign(double x) {
+    return -x;
+}
+double ceval_abs(double x) {
+    return fabs(x);
+}
+double ceval_sqrt(double x) {
+    if (x >= 0) return sqrt(x);
+    ceval_error("sqrt(): can't operate on negative numbers");
+    return NAN;
+}
+double ceval_cbrt(double x) {
+    return cbrt(x);
+}
+double ceval_ceil(double x) {
+    return ceil(x);
+}
+double ceval_floor(double x) {
+    return floor(x);
+}
+double ceval_sinh(double x) {
+    return sinh(x);
+}
+double ceval_cosh(double x) {
+    return cosh(x);
+}
+double ceval_tanh(double x) {
+    return tanh(x);
+}
+double ceval_not(double x) {
+    return (double) ! (int)x;
+}
+double ceval_bit_not(double x) {
+    if(ceval_frac_part(x) == 0) {
+        return ~(int)x;
+    } else {
+        ceval_error("bit_not(): operand must be of integral type");
+        return NAN;
+    }
+}
+//double argument function definitions
+double( * double_arg_fun[])(double, double, int) = {
+    // double_arg_fun (first three tokens are whitespace and parantheses)
+    NULL, NULL, NULL, ceval_comma,
+    ceval_or, ceval_and, ceval_bit_or, ceval_bit_xor,
+    ceval_bit_and, ceval_are_equal, ceval_not_equal, ceval_lesser,
+    ceval_greater, ceval_lesser_s, ceval_greater_s, ceval_bit_lshift,
+    ceval_bit_rshift, ceval_sum, ceval_diff, ceval_prod,
+    ceval_div, ceval_modulus, ceval_quotient, ceval_power, 
+    ceval_gcd, ceval_hcf, ceval_lcm, ceval_log,
+    ceval_atan2, ceval_sci2dec, ceval_power,
+    // single_arg_fun
+    NULL, NULL, NULL, NULL,
+    NULL, NULL, NULL, NULL,
+    NULL, NULL, NULL, NULL,
+    NULL, NULL, NULL, NULL,
+    NULL, NULL, NULL, NULL,
+    NULL, NULL, NULL, NULL,
+    NULL, NULL, NULL,
+    // number and constant tokens
+    NULL, NULL, NULL
+};
+double ceval_sum(double a, double b, int arg_check) {
+    if (arg_check) {
+        ceval_error("sum(): function takes two arguments");
+        return NAN;
+    }
+    return a + b;
+}
+double ceval_diff(double a, double b, int arg_check) {
+    if (arg_check) {
+        ceval_error("diff(): function takes two arguments");
+        return NAN;
+    }
+    return a - b;
+}
+double ceval_prod(double a, double b, int arg_check) {
+    if (arg_check) {
+        ceval_error("prod(): function takes two arguments");
+        return NAN;
+    }
+    return a * b;
+}
+double ceval_div(double a, double b, int arg_check) {
+    if (arg_check) {
+        ceval_error("div(): function takes two arguments");
+        return NAN;
+    }
+    if (b == 0 && a == 0) {
+        ceval_error("0/0 is indeterminate...");
+        ceval_error("Continuing evaluation with the assumption 0/0 = 1");
+        return 1;
+    } else if (b == 0) {
+        ceval_error("Division by 0 is not defined...");
+        ceval_error("Continuing evaluation with the assumption 1/0 = inf");
+        return a * INFINITY;
+    }
+    return a / b;
+}
+double ceval_modulus(double a, double b, int arg_check) {
+    if (arg_check) {
+        ceval_error("modulo(): function takes two arguments");
+        return NAN;
+    }
+    if (b == 0) {
+        ceval_error("Division by 0 is not defined...");
+        ceval_error("Continuing evaluation with the assumption 1%0 = 0");
+        return 0;
+    }
+    return fmod(a, b);
+}
+double ceval_quotient(double a, double b, int arg_check) {
+    if (arg_check) {
+        ceval_error("quotient(): function takes two arguments");
+        return NAN;
+    }
+    //a = b*q + r
+    //q = (a - r)/b
+    if (b == 0 && a == 0) {
+        ceval_error("0/0 is indeterminate...");
+        ceval_error("Continuing evaluation with the assumption 0/0 = 1");
+        return 1;
+
+    } else if (b == 0) {
+        ceval_error("Division by 0 is not defined...");
+        ceval_error("Continuing evaluation with the assumption 1/0 = inf");
+        return a * INFINITY;
+    }
+    return (a - ceval_modulus(a, b, 0)) / b;
+}
+double ceval_gcd(double a, double b, int arg_check) {
+    if (arg_check) {
+        ceval_error("gcd(): function takes two arguments");
+        return NAN;
+    }
+    double a_f = ceval_frac_part(a),
+        b_f = ceval_frac_part(b);
+    int a_i = (int)ceval_int_part(a),
+        b_i = (int)ceval_int_part(b);
+    if (a_f == 0 && b_f == 0) {
+        return (double) ceval_gcd_binary(a_i, b_i);
+    } else {
+        ceval_error("gcd() takes only integral parameters");
+        return NAN;
+    }
+}
+double ceval_hcf(double a, double b, int arg_check) {
+    if (arg_check) {
+        ceval_error("hcf(): function takes two arguments");
+        return NAN;
+    }
+    return ceval_gcd(a, b, 0);
+}
+double ceval_lcm(double a, double b, int arg_check) {
+    if (arg_check) {
+        ceval_error("lcm(): function takes two arguments");
+        return NAN;
+    }
+    return a * b / ceval_gcd(a, b, 0);
+}
+double ceval_log(double b, double x, int arg_check) {
+    if (arg_check) {
+        ceval_error("log(): function takes two arguments");
+        return NAN;
+    }
+    if (b == 0) {
+        if (x == 0) {
+            ceval_error("log(0,0) is indeterminate");
+            return NAN;
+        } else {
+            return 0;
+        }
+    }
+    return log(x) / log(b);
+}
+double ceval_are_equal(double a, double b, int arg_check) {
+    if (arg_check) {
+        ceval_error("==: function takes two arguments");
+        return NAN;
+    }
+    if (fabs(a - b) <= CEVAL_EPSILON) {
+        return 1;
+    } else {
+        return 0;
+    }
+}
+double ceval_not_equal(double a, double b, int arg_check) {
+    if (arg_check) {
+        ceval_error("!=: function takes two arguments");
+        return NAN;
+    }
+    return (double)!(int)ceval_are_equal(a, b, 0);
+}
+double ceval_lesser(double a, double b, int arg_check) {
+    if (arg_check) {
+        ceval_error("<=: function takes two arguments");
+        return NAN;
+    }
+    return (double)!(int)ceval_greater_s(a, b, 0);
+}
+double ceval_greater(double a, double b, int arg_check) {
+    if (arg_check) {
+        ceval_error(">=: function takes two arguments");
+        return NAN;
+    }
+    return (double)!(int)ceval_lesser_s(a, b, 0);
+}
+double ceval_lesser_s(double a, double b, int arg_check) {
+    if (arg_check) {
+        ceval_error("<: function takes two arguments");
+        return NAN;
+    }
+    return (b - a) >= CEVAL_EPSILON;
+}
+double ceval_greater_s(double a, double b, int arg_check) {
+    if (arg_check) {
+        ceval_error(">: function takes two arguments");
+        return NAN;
+    }
+    return (a - b) >= CEVAL_EPSILON;
+}
+double ceval_comma(double x, double y, int arg_check) {
+    if (arg_check) {
+        ceval_error(",: function takes two arguments");
+        return NAN;
+    }
+    return y;
+}
+double ceval_power(double x, double y, int arg_check) {
+    if (arg_check) {
+        ceval_error("pow(): function takes two arguments");
+        return NAN;
+    }
+    if(x<0 && ceval_frac_part(y)!=0) {
+        ceval_error("pow(): negative numbers can only be raised to integral powers");
+        return NAN;
+    }
+    return pow(x, y);
+}
+double ceval_atan2(double x, double y, int arg_check) {
+    if (arg_check) {
+        ceval_error("atan2(): function takes two arguments");
+        return NAN;
+    }
+    return atan2(x, y);
+}
+double ceval_sci2dec(double m, double e, int arg_check) {
+    if (arg_check) {
+        ceval_error("sci2dec(): function takes two arguments");
+        return NAN;
+    }
+    return (double) m * ceval_power(10, e, 0);
+}
+double ceval_and(double x, double y, int arg_check) {
+    if (arg_check) {
+        ceval_error("and(): function takes two arguments");
+        return NAN;
+    }
+    return (double) ((int)x && (int)y);
+}
+double ceval_or(double x, double y, int arg_check) {
+    if (arg_check) {
+        ceval_error("or(): function takes two arguments");
+        return NAN;
+    }
+    return (double) ((int)x || (int)y);
+}
+double ceval_bit_and(double x, double y, int arg_check) {
+    if (arg_check) {
+        ceval_error("bit_and(): function takes two arguments");
+        return NAN;
+    }
+    if(ceval_frac_part(x) == 0 && ceval_frac_part(y) == 0) {
+        return (int)x & (int)y;
+    } else {
+        ceval_error("bit_and(): operands must be of integral type");
+        return NAN;
+    }
+}
+double ceval_bit_xor(double x, double y, int arg_check) {
+    if (arg_check) {
+        ceval_error("bit_xor(): function takes two arguments");
+        return NAN;
+    }
+    if(ceval_frac_part(x) == 0 && ceval_frac_part(y) == 0) {
+        return (int)x ^ (int)y;
+    } else {
+        ceval_error("bit_xor(): operands must be of integral type");
+        return NAN;
+    }
+}
+double ceval_bit_or(double x, double y, int arg_check) {
+    if (arg_check) {
+        ceval_error("bit_or(): function takes two arguments");
+        return NAN;
+    }
+    if(ceval_frac_part(x) == 0 && ceval_frac_part(y) == 0) {
+        return (int)x | (int)y;
+    } else {
+        ceval_error("bit_or(): operands must be of integral type");
+        return NAN;
+    }
+}
+double ceval_bit_lshift(double x, double y, int arg_check) {
+    if (arg_check) {
+        ceval_error("bit_lshift(): function takes two arguments");
+        return NAN;
+    }
+    if(ceval_frac_part(x) == 0 && ceval_frac_part(y) == 0) {
+        return (int)x << (int)y;
+    } else {
+        ceval_error("bit_lshift(): operands must be of integral type");
+        return NAN;
+    }
+
+}
+double ceval_bit_rshift(double x, double y, int arg_check) {
+    if (arg_check) {
+        ceval_error("bit_rshift(): function takes two arguments");
+        return NAN;
+    }
+    if(ceval_frac_part(x) == 0 && ceval_frac_part(y) == 0) {
+        return (int)x >> (int)y;
+    } else {
+        ceval_error("bit_rshift(): operands must be of integral type");
+        return NAN;
+    }
+}
+/**************************************** !FUNCTIONS ********************************************/
+
+/***************************************** PARSE_TREE_CONSTRUCTION *******************************************/
+void * ceval_make_tree(char * );
+ceval_node * ceval_insert_node(ceval_node * , ceval_node, int);
+void ceval_print_tree(const void * );
+void ceval_print_node(const ceval_node * , int);
+void ceval_delete_node(ceval_node * );
+void ceval_delete_tree(void * );
+
+void ceval_delete_node(ceval_node * node) {
+    if (!node) return;
+    ceval_delete_node(node -> left);
+    ceval_delete_node(node -> right);
+    free(node);
+}
+void ceval_delete_tree(void * tree) {
+    ceval_delete_node((ceval_node * ) tree);
+}
+ceval_node * ceval_insert_node(ceval_node * current, ceval_node item, int isRightAssoc) {
+    if (item.id != CEVAL_OPENPAR &&
+        item.id != CEVAL_NEGSIGN &&
+        item.id != CEVAL_POSSIGN) {
+        if (isRightAssoc) {
+            while (current -> pre > item.pre) {
+                current = current -> parent;
+            }
+        } else {
+            while (current -> pre >= item.pre) {
+                current = current -> parent;
+            }
+        }
+    }
+    if (item.id == CEVAL_CLOSEPAR) {
+        ceval_node * parent_of_openpar = current -> parent;
+        parent_of_openpar -> right = current -> right;
+        if (current -> right) current -> right -> parent = parent_of_openpar;
+        free(current);
+        current = parent_of_openpar;
+
+        if (current -> right -> id == CEVAL_COMMA &&
+            ceval_is_binary_fun(current -> id)) {
+            ceval_node * address_of_comma = current -> right;
+            parent_of_openpar -> left = address_of_comma -> left;
+            address_of_comma -> left -> parent = parent_of_openpar;
+            parent_of_openpar -> right = address_of_comma -> right;
+            address_of_comma -> right -> parent = parent_of_openpar;
+            free(address_of_comma);
+        }
+        return current;
+    }
+    ceval_node * newnode = (ceval_node * ) malloc(sizeof(ceval_node));
+    * newnode = item;
+    newnode -> right = NULL;
+
+    newnode -> left = current -> right;
+    if (current -> right) current -> right -> parent = newnode;
+    current -> right = newnode;
+    newnode -> parent = current;
+    current = newnode;
+    return current;
+}
+
+void * ceval_make_tree(char * expression) {
+    if (expression == NULL) return NULL;
+    strcpy(expression, ceval_shrink(expression));
+    ceval_node root = {
+        CEVAL_OPENPAR,
+        ceval_token_prec(CEVAL_OPENPAR),
+        0,
+        NULL,
+        NULL,
+        NULL
+    };
+    ceval_node_id previous_id = CEVAL_OPENPAR;
+    ceval_node * current = & root;
+    int isRightAssoc = 0;
+    while (1) {
+        ceval_node node;
+        char c = * expression++;
+        if (c == '\0') break;
+        int token_found = -1;
+        char token[50];
+        unsigned int len = 0;
+        for(unsigned int i = 0; i < CEVAL_TOKEN_TABLE_SIZE; i++) {
+            strcpy(token, ceval_token_info[i].symbol);
+            len = (unsigned int) strlen(token);
+            if (!memcmp(expression - 1, token, len)) {
+                token_found = ceval_token_info[i].id;
+                isRightAssoc = (token_found == CEVAL_POW || token_found == CEVAL_CLOSEPAR ) ? 1 : 0;
+                break;
+            }
+        }
+        // if token is found
+        if (token_found > -1) {
+            // check if the token is a binary operator
+            if (ceval_is_binary_opr((ceval_node_id)token_found)) {
+                // a binary operator must be preceded by a number, a numerical constant, a clospar, or a factorial
+                if (previous_id == CEVAL_NUMBER ||
+                    previous_id == CEVAL_CONST_PI ||
+                    previous_id == CEVAL_CONST_E ||
+                    previous_id == CEVAL_CLOSEPAR) {
+                    // other tokens (other than CEVAL_NUMBER, CEVAL_CLOSEPAR) are allowed only before '+'s or '-'s
+                    expression = expression + (len - 1);
+                    node.id = (ceval_node_id)token_found;
+                    node.pre = ceval_token_prec(node.id);
+                } else {
+                    // if the operator is not preceded by a number, a numerical constant, a closepar, or a factorial, then check if the 
+                    // character is a sign ('+' or '-')
+                    if (c == '+') {
+                        node.id = CEVAL_POSSIGN;
+                        node.pre = ceval_token_prec(node.id);
+                    } else if (c == '-') {
+                        node.id = CEVAL_NEGSIGN;
+                        node.pre = ceval_token_prec(node.id);
+                    } else {
+                        // if it is not a sign, then it must be a misplaced character
+                        ceval_error("Misplaced '%c'.", c);
+                        ceval_delete_tree(root.right);
+                        root.right = NULL;
+                        return NULL;
+                    }
+                }
+            } else if (token_found == CEVAL_NUMBER){
+                // if the token is a number, then store it in an array
+                node.pre = ceval_token_prec(CEVAL_NUMBER);
+                unsigned int i;
+                char number[CEVAL_MAX_DIGITS];
+                for (i = 0; i + 1 < sizeof(number);) {
+                    number[i++] = c;
+                    c = * expression;
+                    if (('0' <= c && c <= '9') || 
+                                          c == '.')
+                        expression++;
+                    else 
+                        break;
+                }
+                number[i] = '\0';
+                //copy the contents of the number array at &node.number
+                sscanf(number, "%lf", & node.number);
+                node.id = CEVAL_NUMBER;
+                goto END;
+            } else if (token_found == CEVAL_WHITESPACE) {
+                // skip whitespace
+                continue;
+            } else {
+                // for any other token
+                expression = expression + (len - 1);
+                node.id = (ceval_node_id)token_found;
+                node.pre = ceval_token_prec(node.id);
+                if (node.id == CEVAL_CONST_PI || node.id == CEVAL_CONST_E) {
+                    node.number = (node.id == CEVAL_CONST_PI) ? CEVAL_PI : CEVAL_E;
+                }
+            }
+        } else {
+            // if the token is not found in the token table
+            ceval_error("Unknown token '%c'.", c);
+            ceval_delete_tree(root.right);
+            root.right = NULL;
+            return NULL;
+        }
+        END: ;
+        previous_id = node.id;
+        current = ceval_insert_node(current, node, isRightAssoc);
+    }
+    if (root.right) root.right -> parent = NULL;
+    return root.right;
+}
+void ceval_print_node(const ceval_node * node, int indent) {
+    int i;
+    char number[CEVAL_MAX_DIGITS];
+    const char * str;
+    if (!node) return;
+    ceval_print_node(node -> right, indent + 4);
+    if (node -> id == CEVAL_NUMBER) {
+        if ((long) node -> number == node -> number) //for integers, skip the trailing zeroes
+            sprintf(number, "%.0f", node -> number);
+        else sprintf(number, "%.2f", node -> number);
+        str = number;
+    } else {
+        str = ceval_token_symbol(node -> id);
+    }
+    for (i = 0; i < indent; i++) {
+        putchar(' ');
+        putchar(' ');
+    }
+    printf("%s\n", str);
+    ceval_print_node(node -> left, indent + 4);
+}
+void ceval_print_tree(const void * tree) {
+    ceval_print_node((const ceval_node * ) tree, 0);
+}
+/***************************************** !PARSE_TREE_CONSTRUCTION *******************************************/
+
+/***************************************** EVALUATION *******************************************/
+double ceval_evaluate_tree_(const ceval_node * );
+double ceval_evaluate_tree(const void * );
+
+double ceval_evaluate_tree_(const ceval_node * node) {
+    if (!node) 
+        return 0;
+    
+    double left, right;
+    left = ceval_evaluate_tree_(node -> left);
+    right = ceval_evaluate_tree_(node -> right);
+    switch (node -> id) {
+
+        //unary-right operators/functions (operate on the expression to their right)
+        case CEVAL_ABS: case CEVAL_EXP: case CEVAL_SQRT: case CEVAL_CBRT: 
+        case CEVAL_LN: case CEVAL_LOG10: case CEVAL_CEIL: case CEVAL_FLOOR: 
+        case CEVAL_SIGNUM: case CEVAL_FACTORIAL: case CEVAL_INT: case CEVAL_FRAC: 
+        case CEVAL_DEG2RAD: case CEVAL_RAD2DEG: case CEVAL_SIN: case CEVAL_COS: 
+        case CEVAL_TAN: case CEVAL_ASIN: case CEVAL_ACOS: case CEVAL_ATAN: 
+        case CEVAL_SINH: case CEVAL_COSH: case CEVAL_TANH: case CEVAL_NOT: 
+        case CEVAL_BIT_NOT: case CEVAL_POSSIGN: case CEVAL_NEGSIGN: 
+            if (node -> right != NULL) {
+                //operate on right operand
+                return ( * single_arg_fun[node -> id])(right);
+            } else {
+                ceval_error("Missing operand(s)");
+                return NAN;
+            }
+        //binary operators/functions
+        case CEVAL_COMMA:  
+        case CEVAL_OR:  case CEVAL_AND:  case CEVAL_BIT_OR:  case CEVAL_BIT_XOR: 
+        case CEVAL_BIT_AND:  case CEVAL_EQUAL:  case CEVAL_NOTEQUAL: case CEVAL_LESSER: 
+        case CEVAL_GREATER:  case CEVAL_LESSER_S:  case CEVAL_GREATER_S:  case CEVAL_BIT_LSHIFT:  
+        case CEVAL_BIT_RSHIFT:  case CEVAL_PLUS:  case CEVAL_MINUS:  case CEVAL_TIMES:  
+        case CEVAL_DIVIDE:  case CEVAL_MODULO:  case CEVAL_QUOTIENT:  case CEVAL_POW: 
+        case CEVAL_GCD:  case CEVAL_HCF:  case CEVAL_LCM:  case CEVAL_LOG: 
+        case CEVAL_ATAN2:  case CEVAL_SCI2DEC: case CEVAL_POWFUN:
+            if (node -> left == NULL) {
+                return ( * double_arg_fun[node -> id])(left, right, -1);
+            } else if (node -> right == NULL) {
+                return ( * double_arg_fun[node -> id])(left, right, 1);
+            } else {
+                return ( * double_arg_fun[node -> id])(left, right, 0);
+            }
+            default:
+                return node -> number;
+    }
+}
+double ceval_evaluate_tree(const void * node) {
+    return (node == NULL)? NAN :
+            ceval_evaluate_tree_((ceval_node * ) node);
+}
+/***************************************** !EVALUATION *******************************************/
+
+/***************************************** MAIN FUNCTIONS *******************************************/
+// functions accessible from main() 
+// - double ceval_result(char * inp) returns the result of valid math expression stored as a char array `inp`
+// - void ceval_tree(char * inp) prints the parse tree for the input expression `inp`
+// - define CEVAL_EPSILON (default value : 1e-2), CEVAL_DELTA (default value : 1e-6) and CEVAL_MAX_DIGITS (default value : 15) manually before the include directive
+// - define CEVAL_STOICAL before the #include directive to use the parser/evaluator in stoical (non-complaining) mode. It suppresses all the error messages from [ceval]. 
+
+double ceval_result(char * expr) {
+    void * tree = ceval_make_tree(expr);
+    double result = ceval_evaluate_tree(tree);
+    ceval_delete_tree(tree);
+    return result;
+}
+void ceval_tree(char * expr) {
+    void * tree = ceval_make_tree(expr);
+    ceval_print_tree(tree);
+    ceval_delete_tree(tree);
+}
+
+#ifdef CEVAL_CXX
+    double ceval_result(std::string expr) {
+        return ceval_result((char * ) expr.c_str());
+    }
+    void ceval_tree(std::string expr) {
+        ceval_tree((char * ) expr.c_str());
+    }
+#endif
+/***************************************** !MAIN FUNCTIONS *******************************************/
+#endif
diff --git a/src/third_party/ceval/package.json b/src/third_party/ceval/package.json
new file mode 100644
index 0000000..beb64b9
--- /dev/null
+++ b/src/third_party/ceval/package.json
@@ -0,0 +1,25 @@
+{
+  "name": "ceval",
+  "version": "1.0.0",
+  "description": "A single-header C/C++ library for parsing and evaluation of arithmetic expressions",
+  "main": "ceval.h",
+  "repository": {
+    "type": "git",
+    "url": "https://github.com/erstan/ceval-single-header.git"
+  },
+  "keywords": [
+    "c",
+    "calculator",
+    "math",
+    "interpreter",
+    "parser",
+    "eval",
+    "single-header"
+  ],
+  "author": "Ershad Tantry",
+  "license": "MIT",
+  "bugs": {
+    "url": "https://github.com/erstan/ceval-single-header/issues"
+  },
+  "homepage": "https://github.com/erstan/ceval-single-header#readme"
+}
diff --git a/third_party/BUILD.gn b/third_party/BUILD.gn
index 462f4d4..97614b5 100644
--- a/third_party/BUILD.gn
+++ b/third_party/BUILD.gn
@@ -3,7 +3,7 @@
 # found in the LICENSE file.
 #
 # See:
-# https://chromium.googlesource.com/chromium/src/+/master/third_party/BUILD.gn
+# https://chromium.googlesource.com/chromium/src/+/main/third_party/BUILD.gn
 
 import("//third_party/libjpeg.gni")
 
diff --git a/third_party/abseil-cpp/BUILD.gn b/third_party/abseil-cpp/BUILD.gn
index dd58685..81af323 100644
--- a/third_party/abseil-cpp/BUILD.gn
+++ b/third_party/abseil-cpp/BUILD.gn
@@ -71,6 +71,7 @@
     "//third_party/abseil-cpp/absl/hash",
     "//third_party/abseil-cpp/absl/memory",
     "//third_party/abseil-cpp/absl/meta:type_traits",
+    "//third_party/abseil-cpp/absl/numeric:bits",
     "//third_party/abseil-cpp/absl/numeric:int128",
     "//third_party/abseil-cpp/absl/status",
     "//third_party/abseil-cpp/absl/status:statusor",
@@ -186,15 +187,20 @@
         "absl/base:config_test",
         "absl/cleanup:cleanup_test",
         "absl/container:inlined_vector_test",
+        "absl/hash:low_level_hash_test",
         "absl/memory:memory_test",
         "absl/meta:type_traits_test",
+        "absl/status:statusor_test",
         "absl/strings:ascii_test",
+        "absl/strings:cord_rep_btree_test",
+        "absl/strings:cord_rep_btree_reader_test",
         "absl/strings:cord_rep_consume_test",
         "absl/strings:cordz_functions_test",
         "absl/strings:cordz_info_statistics_test",
         "absl/strings:cordz_info_test",
         "absl/strings:cordz_test",
         "absl/strings:cordz_update_scope_test",
+        "absl/strings:cord_rep_btree_navigator_test",
         "absl/strings:cordz_update_tracker_test",
         "absl/strings:match_test",
         "absl/strings:str_replace_test",
diff --git a/third_party/abseil-cpp/CMake/AbseilDll.cmake b/third_party/abseil-cpp/CMake/AbseilDll.cmake
index 78ace82..ea45c8a 100644
--- a/third_party/abseil-cpp/CMake/AbseilDll.cmake
+++ b/third_party/abseil-cpp/CMake/AbseilDll.cmake
@@ -124,8 +124,8 @@
   "hash/internal/hash.h"
   "hash/internal/hash.cc"
   "hash/internal/spy_hash_state.h"
-  "hash/internal/wyhash.h"
-  "hash/internal/wyhash.cc"
+  "hash/internal/low_level_hash.h"
+  "hash/internal/low_level_hash.cc"
   "memory/memory.h"
   "meta/type_traits.h"
   "numeric/bits.h"
@@ -205,6 +205,12 @@
   "strings/internal/cord_internal.h"
   "strings/internal/cord_rep_consume.h"
   "strings/internal/cord_rep_consume.cc"
+  "strings/internal/cord_rep_btree.cc"
+  "strings/internal/cord_rep_btree.h"
+  "strings/internal/cord_rep_btree_navigator.cc"
+  "strings/internal/cord_rep_btree_navigator.h"
+  "strings/internal/cord_rep_btree_reader.cc"
+  "strings/internal/cord_rep_btree_reader.h"
   "strings/internal/cord_rep_flat.h"
   "strings/internal/cord_rep_ring.cc"
   "strings/internal/cord_rep_ring.h"
diff --git a/third_party/abseil-cpp/CMake/AbseilHelpers.cmake b/third_party/abseil-cpp/CMake/AbseilHelpers.cmake
index 6a64a2c..17c4f44 100644
--- a/third_party/abseil-cpp/CMake/AbseilHelpers.cmake
+++ b/third_party/abseil-cpp/CMake/AbseilHelpers.cmake
@@ -254,9 +254,23 @@
       set_property(TARGET ${_NAME} PROPERTY FOLDER ${ABSL_IDE_FOLDER}/internal)
     endif()
 
-    # INTERFACE libraries can't have the CXX_STANDARD property set
-    set_property(TARGET ${_NAME} PROPERTY CXX_STANDARD ${ABSL_CXX_STANDARD})
-    set_property(TARGET ${_NAME} PROPERTY CXX_STANDARD_REQUIRED ON)
+    if(ABSL_PROPAGATE_CXX_STD)
+      # Abseil libraries require C++11 as the current minimum standard.
+      # Top-level application CMake projects should ensure a consistent C++
+      # standard for all compiled sources by setting CMAKE_CXX_STANDARD.
+      target_compile_features(${_NAME} PUBLIC cxx_std_11)
+    else()
+      # Note: This is legacy (before CMake 3.8) behavior. Setting the
+      # target-level CXX_STANDARD property to ABSL_CXX_STANDARD (which is
+      # initialized by CMAKE_CXX_STANDARD) should have no real effect, since
+      # that is the default value anyway.
+      #
+      # CXX_STANDARD_REQUIRED does guard against the top-level CMake project
+      # not having enabled CMAKE_CXX_STANDARD_REQUIRED (which prevents
+      # "decaying" to an older standard if the requested one isn't available).
+      set_property(TARGET ${_NAME} PROPERTY CXX_STANDARD ${ABSL_CXX_STANDARD})
+      set_property(TARGET ${_NAME} PROPERTY CXX_STANDARD_REQUIRED ON)
+    endif()
 
     # When being installed, we lose the absl_ prefix.  We want to put it back
     # to have properly named lib files.  This is a no-op when we are not being
@@ -287,6 +301,16 @@
         ${ABSL_DEFAULT_LINKOPTS}
     )
     target_compile_definitions(${_NAME} INTERFACE ${ABSL_CC_LIB_DEFINES})
+
+    if(ABSL_PROPAGATE_CXX_STD)
+      # Abseil libraries require C++11 as the current minimum standard.
+      # Top-level application CMake projects should ensure a consistent C++
+      # standard for all compiled sources by setting CMAKE_CXX_STANDARD.
+      target_compile_features(${_NAME} INTERFACE cxx_std_11)
+
+      # (INTERFACE libraries can't have the CXX_STANDARD property set, so there
+      # is no legacy behavior else case).
+    endif()
   endif()
 
   # TODO currently we don't install googletest alongside abseil sources, so
@@ -390,8 +414,23 @@
   # Add all Abseil targets to a folder in the IDE for organization.
   set_property(TARGET ${_NAME} PROPERTY FOLDER ${ABSL_IDE_FOLDER}/test)
 
-  set_property(TARGET ${_NAME} PROPERTY CXX_STANDARD ${ABSL_CXX_STANDARD})
-  set_property(TARGET ${_NAME} PROPERTY CXX_STANDARD_REQUIRED ON)
+  if(ABSL_PROPAGATE_CXX_STD)
+    # Abseil libraries require C++11 as the current minimum standard.
+    # Top-level application CMake projects should ensure a consistent C++
+    # standard for all compiled sources by setting CMAKE_CXX_STANDARD.
+    target_compile_features(${_NAME} PUBLIC cxx_std_11)
+  else()
+    # Note: This is legacy (before CMake 3.8) behavior. Setting the
+    # target-level CXX_STANDARD property to ABSL_CXX_STANDARD (which is
+    # initialized by CMAKE_CXX_STANDARD) should have no real effect, since
+    # that is the default value anyway.
+    #
+    # CXX_STANDARD_REQUIRED does guard against the top-level CMake project
+    # not having enabled CMAKE_CXX_STANDARD_REQUIRED (which prevents
+    # "decaying" to an older standard if the requested one isn't available).
+    set_property(TARGET ${_NAME} PROPERTY CXX_STANDARD ${ABSL_CXX_STANDARD})
+    set_property(TARGET ${_NAME} PROPERTY CXX_STANDARD_REQUIRED ON)
+  endif()
 
   add_test(NAME ${_NAME} COMMAND ${_NAME})
 endfunction()
diff --git a/third_party/abseil-cpp/CMake/README.md b/third_party/abseil-cpp/CMake/README.md
index fa8e8d3..f8b27e6 100644
--- a/third_party/abseil-cpp/CMake/README.md
+++ b/third_party/abseil-cpp/CMake/README.md
@@ -34,15 +34,16 @@
 4. Add the **absl::** target you wish to use to the
 [`target_link_libraries()`](https://cmake.org/cmake/help/latest/command/target_link_libraries.html)
 section of your executable or of your library.<br>
-Here is a short CMakeLists.txt example of a project file using Abseil.
+Here is a short CMakeLists.txt example of an application project using Abseil.
 
 ```cmake
-cmake_minimum_required(VERSION 3.5)
-project(my_project)
+cmake_minimum_required(VERSION 3.8.2)
+project(my_app_project)
 
 # Pick the C++ standard to compile with.
 # Abseil currently supports C++11, C++14, and C++17.
 set(CMAKE_CXX_STANDARD 11)
+set(CMAKE_CXX_STANDARD_REQUIRED ON)
 
 add_subdirectory(abseil-cpp)
 
@@ -50,6 +51,44 @@
 target_link_libraries(my_exe absl::base absl::synchronization absl::strings)
 ```
 
+Note that if you are developing a library designed for use by other clients, you
+should instead leave `CMAKE_CXX_STANDARD` unset (or only set if being built as
+the current top-level CMake project) and configure the minimum required C++
+standard at the target level. If you require a later minimum C++ standard than
+Abseil does, it's a good idea to also enforce that `CMAKE_CXX_STANDARD` (which
+will control Abseil library targets) is set to at least that minimum. For
+example:
+
+```cmake
+cmake_minimum_required(VERSION 3.8.2)
+project(my_lib_project)
+
+# Leave C++ standard up to the root application, so set it only if this is the
+# current top-level CMake project.
+if(CMAKE_SOURCE_DIR STREQUAL my_lib_project_SOURCE_DIR)
+  set(CMAKE_CXX_STANDARD 17)
+  set(CMAKE_CXX_STANDARD_REQUIRED ON)
+endif()
+
+add_subdirectory(abseil-cpp)
+
+add_library(my_lib source.cpp)
+target_link_libraries(my_lib absl::base absl::synchronization absl::strings)
+
+# Enforce that my_lib requires C++17. Important to document for clients that they
+# must set CMAKE_CXX_STANDARD to 17 or higher for proper Abseil ABI compatibility
+# (since otherwise, Abseil library targets could be compiled with a lower C++
+# standard than my_lib).
+target_compile_features(my_lib PUBLIC cxx_std_17)
+if(CMAKE_CXX_STANDARD LESS 17)
+  message(FATAL_ERROR
+      "my_lib_project requires CMAKE_CXX_STANDARD >= 17 (got: ${CMAKE_CXX_STANDARD})")
+endif()
+```
+
+Then the top-level application project that uses your library is responsible for
+setting a consistent `CMAKE_CXX_STANDARD` that is sufficiently high.
+
 ### Running Abseil Tests with CMake
 
 Use the `-DBUILD_TESTING=ON` flag to run Abseil tests.
diff --git a/third_party/abseil-cpp/CMake/install_test_project/CMakeLists.txt b/third_party/abseil-cpp/CMake/install_test_project/CMakeLists.txt
index eebfe61..b865b2e 100644
--- a/third_party/abseil-cpp/CMake/install_test_project/CMakeLists.txt
+++ b/third_party/abseil-cpp/CMake/install_test_project/CMakeLists.txt
@@ -22,4 +22,4 @@
 
 find_package(absl REQUIRED)
 
-target_link_libraries(simple absl::strings)
+target_link_libraries(simple absl::strings absl::config)
diff --git a/third_party/abseil-cpp/CMake/install_test_project/simple.cc b/third_party/abseil-cpp/CMake/install_test_project/simple.cc
index e9e3529..7daa7f0 100644
--- a/third_party/abseil-cpp/CMake/install_test_project/simple.cc
+++ b/third_party/abseil-cpp/CMake/install_test_project/simple.cc
@@ -14,8 +14,17 @@
 // limitations under the License.
 
 #include <iostream>
+#include "absl/base/config.h"
 #include "absl/strings/substitute.h"
 
+#if !defined(ABSL_LTS_RELEASE_VERSION) || ABSL_LTS_RELEASE_VERSION != 99998877
+#error ABSL_LTS_RELEASE_VERSION is not set correctly.
+#endif
+
+#if !defined(ABSL_LTS_RELEASE_PATCH_LEVEL) || ABSL_LTS_RELEASE_PATCH_LEVEL != 0
+#error ABSL_LTS_RELEASE_PATCH_LEVEL is not set correctly.
+#endif
+
 int main(int argc, char** argv) {
   for (int i = 0; i < argc; ++i) {
     std::cout << absl::Substitute("Arg $0: $1\n", i, argv[i]);
diff --git a/third_party/abseil-cpp/CMakeLists.txt b/third_party/abseil-cpp/CMakeLists.txt
index 42bcbe1..7c8bfff 100644
--- a/third_party/abseil-cpp/CMakeLists.txt
+++ b/third_party/abseil-cpp/CMakeLists.txt
@@ -67,6 +67,13 @@
   option(ABSL_ENABLE_INSTALL "Enable install rule" ON)
 endif()
 
+option(ABSL_PROPAGATE_CXX_STD
+  "Use CMake C++ standard meta features (e.g. cxx_std_11) that propagate to targets that link to Abseil"
+  OFF)  # TODO: Default to ON for CMake 3.8 and greater.
+if((${CMAKE_VERSION} VERSION_GREATER_EQUAL 3.8) AND (NOT ABSL_PROPAGATE_CXX_STD))
+  message(WARNING "A future Abseil release will default ABSL_PROPAGATE_CXX_STD to ON for CMake 3.8 and up. We recommend enabling this option to ensure your project still builds correctly.")
+endif()
+
 list(APPEND CMAKE_MODULE_PATH
   ${CMAKE_CURRENT_LIST_DIR}/CMake
   ${CMAKE_CURRENT_LIST_DIR}/absl/copts
diff --git a/third_party/abseil-cpp/FAQ.md b/third_party/abseil-cpp/FAQ.md
index 78028fc..fbd92ce 100644
--- a/third_party/abseil-cpp/FAQ.md
+++ b/third_party/abseil-cpp/FAQ.md
@@ -27,7 +27,10 @@
   file](https://docs.bazel.build/versions/master/guide.html#bazelrc)
 
 If you are using CMake as the build system, you'll need to add a line like
-`set(CMAKE_CXX_STANDARD 17)` to your top level `CMakeLists.txt` file. See the
+`set(CMAKE_CXX_STANDARD 17)` to your top level `CMakeLists.txt` file. If you
+are developing a library designed to be used by other clients, you should
+instead leave `CMAKE_CXX_STANDARD` unset and configure the minimum C++ standard
+required by each of your library targets via `target_compile_features`. See the
 [CMake build
 instructions](https://github.com/abseil/abseil-cpp/blob/master/CMake/README.md)
 for more information.
diff --git a/third_party/abseil-cpp/README.chromium b/third_party/abseil-cpp/README.chromium
index 26fc3d6..8d27557 100644
--- a/third_party/abseil-cpp/README.chromium
+++ b/third_party/abseil-cpp/README.chromium
@@ -4,7 +4,7 @@
 License: Apache 2.0
 License File: LICENSE
 Version: 0
-Revision: b06e719ee985ecd63e0dffbc68499549216f817f
+Revision: 8c800bb08d353c73d7dd68538388cf3bd2bcc6d0
 Security Critical: yes
 
 Description:
diff --git a/third_party/abseil-cpp/README.md b/third_party/abseil-cpp/README.md
index 264c4b3..db3a7b4 100644
--- a/third_party/abseil-cpp/README.md
+++ b/third_party/abseil-cpp/README.md
@@ -92,6 +92,9 @@
   available within C++14 and C++17 versions of the C++ `<type_traits>` library.
 * [`numeric`](absl/numeric/)
   <br /> The `numeric` library contains C++11-compatible 128-bit integers.
+* [`profiling`](absl/profiling/)
+  <br /> The `profiling` library contains utility code for profiling C++
+  entities.  It is currently a private dependency of other Abseil libraries.
 * [`status`](absl/status/)
   <br /> The `status` contains abstractions for error handling, specifically
   `absl::Status` and `absl::StatusOr<T>`.
diff --git a/third_party/abseil-cpp/WORKSPACE b/third_party/abseil-cpp/WORKSPACE
index bc00ea3..af30787 100644
--- a/third_party/abseil-cpp/WORKSPACE
+++ b/third_party/abseil-cpp/WORKSPACE
@@ -15,29 +15,38 @@
 #
 
 workspace(name = "com_google_absl")
+
 load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive")
 
 # GoogleTest/GoogleMock framework. Used by most unit-tests.
 http_archive(
-    name = "com_google_googletest",
+    name = "com_google_googletest",  # 2021-07-09T13:28:13Z
+    sha256 = "12ef65654dc01ab40f6f33f9d02c04f2097d2cd9fbe48dc6001b29543583b0ad",
+    strip_prefix = "googletest-8d51ffdfab10b3fba636ae69bc03da4b54f8c235",
     # Keep this URL in sync with ABSL_GOOGLETEST_COMMIT in ci/cmake_common.sh.
-    urls = ["https://github.com/google/googletest/archive/5bcd8e3bb929714e031a542d303f818e5a5af45d.zip"],  # 2021-06-08T22:36:38Z
-    strip_prefix = "googletest-5bcd8e3bb929714e031a542d303f818e5a5af45d",
-    sha256 = "3adecb6686ac7367452561dca518fad5a990fb09c5a961bfa1836f15eb774348",
+    urls = ["https://github.com/google/googletest/archive/8d51ffdfab10b3fba636ae69bc03da4b54f8c235.zip"],
 )
 
 # Google benchmark.
 http_archive(
-    name = "com_github_google_benchmark",
-    urls = ["https://github.com/google/benchmark/archive/7d0d9061d83b663ce05d9de5da3d5865a3845b79.zip"],  # 2021-05-11T11:56:00Z
-    strip_prefix = "benchmark-7d0d9061d83b663ce05d9de5da3d5865a3845b79",
-    sha256 = "a07789754963e3ea3a1e13fed3a4d48fac0c5f7f749c5065f6c30cd2c1529661",
+    name = "com_github_google_benchmark",  # 2021-07-01T09:02:54Z
+    sha256 = "1cb4b97a90aa1fd9c8e412a6bc29fc13fc140162a4a0db3811af40befd8c9ea5",
+    strip_prefix = "benchmark-e451e50e9b8af453f076dec10bd6890847f1624e",
+    urls = ["https://github.com/google/benchmark/archive/e451e50e9b8af453f076dec10bd6890847f1624e.zip"],
 )
 
 # C++ rules for Bazel.
 http_archive(
-    name = "rules_cc",
-    urls = ["https://github.com/bazelbuild/rules_cc/archive/ab5395627c80e025e824bd005d41f96b20618b9d.zip"],  # 2021-05-10T15:35:04Z
-    strip_prefix = "rules_cc-ab5395627c80e025e824bd005d41f96b20618b9d",
-    sha256 = "f3908cb40a6577ab0d1ef9e00052739bf69b4313fa7d20b4d61d4521ea67abf3",
+    name = "rules_cc",  # 2021-06-07T16:41:49Z
+    sha256 = "b295cad8c5899e371dde175079c0a2cdc0151f5127acc92366a8c986beb95c76",
+    strip_prefix = "rules_cc-daf6ace7cfeacd6a83e9ff2ed659f416537b6c74",
+    urls = ["https://github.com/bazelbuild/rules_cc/archive/daf6ace7cfeacd6a83e9ff2ed659f416537b6c74.zip"],
+)
+
+# Bazel platform rules.
+http_archive(
+    name = "platforms",
+    sha256 = "b601beaf841244de5c5a50d2b2eddd34839788000fa1be4260ce6603ca0d8eb7",
+    strip_prefix = "platforms-98939346da932eef0b54cf808622f5bb0928f00b",
+    urls = ["https://github.com/bazelbuild/platforms/archive/98939346da932eef0b54cf808622f5bb0928f00b.zip"],
 )
diff --git a/third_party/abseil-cpp/absl/BUILD.bazel b/third_party/abseil-cpp/absl/BUILD.bazel
index c9d4a2d..7239b5b 100644
--- a/third_party/abseil-cpp/absl/BUILD.bazel
+++ b/third_party/abseil-cpp/absl/BUILD.bazel
@@ -44,14 +44,14 @@
 config_setting(
     name = "osx",
     constraint_values = [
-        "@bazel_tools//platforms:osx",
+        "@platforms//os:osx",
     ],
 )
 
 config_setting(
     name = "ios",
     constraint_values = [
-        "@bazel_tools//platforms:ios",
+        "@platforms//os:ios",
     ],
 )
 
diff --git a/third_party/abseil-cpp/absl/CMakeLists.txt b/third_party/abseil-cpp/absl/CMakeLists.txt
index a41e1ee..b171584 100644
--- a/third_party/abseil-cpp/absl/CMakeLists.txt
+++ b/third_party/abseil-cpp/absl/CMakeLists.txt
@@ -25,6 +25,7 @@
 add_subdirectory(memory)
 add_subdirectory(meta)
 add_subdirectory(numeric)
+add_subdirectory(profiling)
 add_subdirectory(random)
 add_subdirectory(status)
 add_subdirectory(strings)
diff --git a/third_party/abseil-cpp/absl/algorithm/container.h b/third_party/abseil-cpp/absl/algorithm/container.h
index 1652e7b..c38a4a6 100644
--- a/third_party/abseil-cpp/absl/algorithm/container.h
+++ b/third_party/abseil-cpp/absl/algorithm/container.h
@@ -1262,7 +1262,7 @@
 // c_set_intersection()
 //
 // Container-based version of the <algorithm> `std::set_intersection()` function
-// to return an iterator containing the intersection of two containers.
+// to return an iterator containing the intersection of two sorted containers.
 template <typename C1, typename C2, typename OutputIterator,
           typename = typename std::enable_if<
               !container_algorithm_internal::IsUnorderedContainer<C1>::value,
@@ -1272,6 +1272,11 @@
               void>::type>
 OutputIterator c_set_intersection(const C1& c1, const C2& c2,
                                   OutputIterator output) {
+  // In debug builds, ensure that both containers are sorted with respect to the
+  // default comparator. std::set_intersection requires the containers be sorted
+  // using operator<.
+  assert(absl::c_is_sorted(c1));
+  assert(absl::c_is_sorted(c2));
   return std::set_intersection(container_algorithm_internal::c_begin(c1),
                                container_algorithm_internal::c_end(c1),
                                container_algorithm_internal::c_begin(c2),
@@ -1289,6 +1294,11 @@
               void>::type>
 OutputIterator c_set_intersection(const C1& c1, const C2& c2,
                                   OutputIterator output, LessThan&& comp) {
+  // In debug builds, ensure that both containers are sorted with respect to the
+  // default comparator. std::set_intersection requires the containers be sorted
+  // using the same comparator.
+  assert(absl::c_is_sorted(c1, comp));
+  assert(absl::c_is_sorted(c2, comp));
   return std::set_intersection(container_algorithm_internal::c_begin(c1),
                                container_algorithm_internal::c_end(c1),
                                container_algorithm_internal::c_begin(c2),
diff --git a/third_party/abseil-cpp/absl/base/attributes.h b/third_party/abseil-cpp/absl/base/attributes.h
index 5213955..2665d8f 100644
--- a/third_party/abseil-cpp/absl/base/attributes.h
+++ b/third_party/abseil-cpp/absl/base/attributes.h
@@ -548,13 +548,19 @@
 // ABSL_ATTRIBUTE_PACKED
 //
 // Instructs the compiler not to use natural alignment for a tagged data
-// structure, but instead to reduce its alignment to 1. This attribute can
-// either be applied to members of a structure or to a structure in its
-// entirety. Applying this attribute (judiciously) to a structure in its
-// entirety to optimize the memory footprint of very commonly-used structs is
-// fine. Do not apply this attribute to a structure in its entirety if the
-// purpose is to control the offsets of the members in the structure. Instead,
-// apply this attribute only to structure members that need it.
+// structure, but instead to reduce its alignment to 1.
+//
+// Therefore, DO NOT APPLY THIS ATTRIBUTE TO STRUCTS CONTAINING ATOMICS. Doing
+// so can cause atomic variables to be mis-aligned and silently violate
+// atomicity on x86.
+//
+// This attribute can either be applied to members of a structure or to a
+// structure in its entirety. Applying this attribute (judiciously) to a
+// structure in its entirety to optimize the memory footprint of very
+// commonly-used structs is fine. Do not apply this attribute to a structure in
+// its entirety if the purpose is to control the offsets of the members in the
+// structure. Instead, apply this attribute only to structure members that need
+// it.
 //
 // When applying ABSL_ATTRIBUTE_PACKED only to specific structure members the
 // natural alignment of structure members not annotated is preserved. Aligned
diff --git a/third_party/abseil-cpp/absl/base/config.h b/third_party/abseil-cpp/absl/base/config.h
index 0524196..c7b2e64 100644
--- a/third_party/abseil-cpp/absl/base/config.h
+++ b/third_party/abseil-cpp/absl/base/config.h
@@ -66,6 +66,35 @@
 #include "absl/base/options.h"
 #include "absl/base/policy_checks.h"
 
+// Abseil long-term support (LTS) releases will define
+// `ABSL_LTS_RELEASE_VERSION` to the integer representing the date string of the
+// LTS release version, and will define `ABSL_LTS_RELEASE_PATCH_LEVEL` to the
+// integer representing the patch-level for that release.
+//
+// For example, for LTS release version "20300401.2", this would give us
+// ABSL_LTS_RELEASE_VERSION == 20300401 && ABSL_LTS_RELEASE_PATCH_LEVEL == 2
+//
+// These symbols will not be defined in non-LTS code.
+//
+// Abseil recommends that clients live-at-head. Therefore, if you are using
+// these symbols to assert a minimum version requirement, we recommend you do it
+// as
+//
+// #if defined(ABSL_LTS_RELEASE_VERSION) && ABSL_LTS_RELEASE_VERSION < 20300401
+// #error Project foo requires Abseil LTS version >= 20300401
+// #endif
+//
+// The `defined(ABSL_LTS_RELEASE_VERSION)` part of the check excludes
+// live-at-head clients from the minimum version assertion.
+//
+// See https://abseil.io/about/releases for more information on Abseil release
+// management.
+//
+// LTS releases can be obtained from
+// https://github.com/abseil/abseil-cpp/releases.
+#undef ABSL_LTS_RELEASE_VERSION
+#undef ABSL_LTS_RELEASE_PATCH_LEVEL
+
 // Helper macro to convert a CPP variable to a string literal.
 #define ABSL_INTERNAL_DO_TOKEN_STR(x) #x
 #define ABSL_INTERNAL_TOKEN_STR(x) ABSL_INTERNAL_DO_TOKEN_STR(x)
diff --git a/third_party/abseil-cpp/absl/base/dynamic_annotations.h b/third_party/abseil-cpp/absl/base/dynamic_annotations.h
index 065bd5b..1ebf1d1 100644
--- a/third_party/abseil-cpp/absl/base/dynamic_annotations.h
+++ b/third_party/abseil-cpp/absl/base/dynamic_annotations.h
@@ -430,31 +430,6 @@
 
 #endif
 
-#ifdef __cplusplus
-#ifdef ABSL_HAVE_THREAD_SANITIZER
-ABSL_INTERNAL_BEGIN_EXTERN_C
-int RunningOnValgrind();
-double ValgrindSlowdown();
-ABSL_INTERNAL_END_EXTERN_C
-#else
-namespace absl {
-ABSL_NAMESPACE_BEGIN
-namespace base_internal {
-ABSL_DEPRECATED(
-    "Don't use this interface. It is misleading and is being deleted.")
-ABSL_ATTRIBUTE_ALWAYS_INLINE inline int RunningOnValgrind() { return 0; }
-ABSL_DEPRECATED(
-    "Don't use this interface. It is misleading and is being deleted.")
-ABSL_ATTRIBUTE_ALWAYS_INLINE inline double ValgrindSlowdown() { return 1.0; }
-}  // namespace base_internal
-ABSL_NAMESPACE_END
-}  // namespace absl
-
-using absl::base_internal::RunningOnValgrind;
-using absl::base_internal::ValgrindSlowdown;
-#endif
-#endif
-
 // -------------------------------------------------------------------------
 // Address sanitizer annotations
 
diff --git a/third_party/abseil-cpp/absl/base/internal/thread_identity.h b/third_party/abseil-cpp/absl/base/internal/thread_identity.h
index 6e25b92..659694b 100644
--- a/third_party/abseil-cpp/absl/base/internal/thread_identity.h
+++ b/third_party/abseil-cpp/absl/base/internal/thread_identity.h
@@ -188,25 +188,25 @@
 // May be chosen at compile time via: -DABSL_FORCE_THREAD_IDENTITY_MODE=<mode
 // index>
 #ifdef ABSL_THREAD_IDENTITY_MODE_USE_POSIX_SETSPECIFIC
-#error ABSL_THREAD_IDENTITY_MODE_USE_POSIX_SETSPECIFIC cannot be direcly set
+#error ABSL_THREAD_IDENTITY_MODE_USE_POSIX_SETSPECIFIC cannot be directly set
 #else
 #define ABSL_THREAD_IDENTITY_MODE_USE_POSIX_SETSPECIFIC 0
 #endif
 
 #ifdef ABSL_THREAD_IDENTITY_MODE_USE_TLS
-#error ABSL_THREAD_IDENTITY_MODE_USE_TLS cannot be direcly set
+#error ABSL_THREAD_IDENTITY_MODE_USE_TLS cannot be directly set
 #else
 #define ABSL_THREAD_IDENTITY_MODE_USE_TLS 1
 #endif
 
 #ifdef ABSL_THREAD_IDENTITY_MODE_USE_CPP11
-#error ABSL_THREAD_IDENTITY_MODE_USE_CPP11 cannot be direcly set
+#error ABSL_THREAD_IDENTITY_MODE_USE_CPP11 cannot be directly set
 #else
 #define ABSL_THREAD_IDENTITY_MODE_USE_CPP11 2
 #endif
 
 #ifdef ABSL_THREAD_IDENTITY_MODE
-#error ABSL_THREAD_IDENTITY_MODE cannot be direcly set
+#error ABSL_THREAD_IDENTITY_MODE cannot be directly set
 #elif defined(ABSL_FORCE_THREAD_IDENTITY_MODE)
 #define ABSL_THREAD_IDENTITY_MODE ABSL_FORCE_THREAD_IDENTITY_MODE
 #elif defined(_WIN32) && !defined(__MINGW32__)
diff --git a/third_party/abseil-cpp/absl/base/log_severity_test.cc b/third_party/abseil-cpp/absl/base/log_severity_test.cc
index 2c6872b..55b26d1 100644
--- a/third_party/abseil-cpp/absl/base/log_severity_test.cc
+++ b/third_party/abseil-cpp/absl/base/log_severity_test.cc
@@ -52,9 +52,9 @@
               Eq("absl::LogSeverity(4)"));
 }
 
-static_assert(
-    absl::flags_internal::FlagUseOneWordStorage<absl::LogSeverity>::value,
-    "Flags of type absl::LogSeverity ought to be lock-free.");
+static_assert(absl::flags_internal::FlagUseValueAndInitBitStorage<
+                  absl::LogSeverity>::value,
+              "Flags of type absl::LogSeverity ought to be lock-free.");
 
 using ParseFlagFromOutOfRangeIntegerTest = TestWithParam<int64_t>;
 INSTANTIATE_TEST_SUITE_P(
diff --git a/third_party/abseil-cpp/absl/cleanup/cleanup.h b/third_party/abseil-cpp/absl/cleanup/cleanup.h
index 61b53d5..960ccd0 100644
--- a/third_party/abseil-cpp/absl/cleanup/cleanup.h
+++ b/third_party/abseil-cpp/absl/cleanup/cleanup.h
@@ -86,25 +86,25 @@
                 "Callbacks that return values are not supported.");
 
  public:
-  Cleanup(Callback callback)  // NOLINT
-      : storage_(std::move(callback), /* is_callback_engaged = */ true) {}
+  Cleanup(Callback callback) : storage_(std::move(callback)) {}  // NOLINT
 
   Cleanup(Cleanup&& other) = default;
 
   void Cancel() && {
     ABSL_HARDENING_ASSERT(storage_.IsCallbackEngaged());
-    storage_.DisengageCallback();
+    storage_.DestroyCallback();
   }
 
   void Invoke() && {
     ABSL_HARDENING_ASSERT(storage_.IsCallbackEngaged());
-    storage_.DisengageCallback();
     storage_.InvokeCallback();
+    storage_.DestroyCallback();
   }
 
   ~Cleanup() {
     if (storage_.IsCallbackEngaged()) {
       storage_.InvokeCallback();
+      storage_.DestroyCallback();
     }
   }
 
diff --git a/third_party/abseil-cpp/absl/cleanup/cleanup_test.cc b/third_party/abseil-cpp/absl/cleanup/cleanup_test.cc
index 792595d..46b8858 100644
--- a/third_party/abseil-cpp/absl/cleanup/cleanup_test.cc
+++ b/third_party/abseil-cpp/absl/cleanup/cleanup_test.cc
@@ -264,4 +264,48 @@
   EXPECT_FALSE(called);  // Destructor shouldn't invoke the callback
 }
 
+int DestructionCount = 0;
+
+struct DestructionCounter {
+  void operator()() {}
+
+  ~DestructionCounter() { ++DestructionCount; }
+};
+
+TYPED_TEST(CleanupTest, DestructorDestroys) {
+  {
+    auto cleanup =
+        absl::MakeCleanup(TypeParam::AsCallback(DestructionCounter()));
+    DestructionCount = 0;
+  }
+
+  EXPECT_EQ(DestructionCount, 1);  // Engaged cleanup destroys
+}
+
+TYPED_TEST(CleanupTest, CancelDestroys) {
+  {
+    auto cleanup =
+        absl::MakeCleanup(TypeParam::AsCallback(DestructionCounter()));
+    DestructionCount = 0;
+
+    std::move(cleanup).Cancel();
+    EXPECT_EQ(DestructionCount, 1);  // Cancel destroys
+  }
+
+  EXPECT_EQ(DestructionCount, 1);  // Canceled cleanup does not double destroy
+}
+
+TYPED_TEST(CleanupTest, InvokeDestroys) {
+  {
+    auto cleanup =
+        absl::MakeCleanup(TypeParam::AsCallback(DestructionCounter()));
+    DestructionCount = 0;
+
+    std::move(cleanup).Invoke();
+    EXPECT_EQ(DestructionCount, 1);  // Invoke destroys
+  }
+
+  EXPECT_EQ(DestructionCount, 1);  // Invoked cleanup does not double destroy
+}
+
 }  // namespace
diff --git a/third_party/abseil-cpp/absl/cleanup/internal/cleanup.h b/third_party/abseil-cpp/absl/cleanup/internal/cleanup.h
index b4c4073..2783fcb 100644
--- a/third_party/abseil-cpp/absl/cleanup/internal/cleanup.h
+++ b/third_party/abseil-cpp/absl/cleanup/internal/cleanup.h
@@ -15,10 +15,12 @@
 #ifndef ABSL_CLEANUP_INTERNAL_CLEANUP_H_
 #define ABSL_CLEANUP_INTERNAL_CLEANUP_H_
 
+#include <new>
 #include <type_traits>
 #include <utility>
 
 #include "absl/base/internal/invoke.h"
+#include "absl/base/macros.h"
 #include "absl/base/thread_annotations.h"
 #include "absl/utility/utility.h"
 
@@ -45,14 +47,22 @@
  public:
   Storage() = delete;
 
-  Storage(Callback callback, bool is_callback_engaged)
-      : callback_(std::move(callback)),
-        is_callback_engaged_(is_callback_engaged) {}
+  explicit Storage(Callback callback) {
+    // Placement-new into a character buffer is used for eager destruction when
+    // the cleanup is invoked or cancelled. To ensure this optimizes well, the
+    // behavior is implemented locally instead of using an absl::optional.
+    ::new (GetCallbackBuffer()) Callback(std::move(callback));
+    is_callback_engaged_ = true;
+  }
 
-  Storage(Storage&& other)
-      : callback_(std::move(other.callback_)),
-        is_callback_engaged_(
-            absl::exchange(other.is_callback_engaged_, false)) {}
+  Storage(Storage&& other) {
+    ABSL_HARDENING_ASSERT(other.IsCallbackEngaged());
+
+    ::new (GetCallbackBuffer()) Callback(std::move(other.GetCallback()));
+    is_callback_engaged_ = true;
+
+    other.DestroyCallback();
+  }
 
   Storage(const Storage& other) = delete;
 
@@ -60,17 +70,26 @@
 
   Storage& operator=(const Storage& other) = delete;
 
+  void* GetCallbackBuffer() { return static_cast<void*>(+callback_buffer_); }
+
+  Callback& GetCallback() {
+    return *reinterpret_cast<Callback*>(GetCallbackBuffer());
+  }
+
   bool IsCallbackEngaged() const { return is_callback_engaged_; }
 
-  void DisengageCallback() { is_callback_engaged_ = false; }
+  void DestroyCallback() {
+    is_callback_engaged_ = false;
+    GetCallback().~Callback();
+  }
 
   void InvokeCallback() ABSL_NO_THREAD_SAFETY_ANALYSIS {
-    std::move(callback_)();
+    std::move(GetCallback())();
   }
 
  private:
-  Callback callback_;
   bool is_callback_engaged_;
+  alignas(Callback) char callback_buffer_[sizeof(Callback)];
 };
 
 }  // namespace cleanup_internal
diff --git a/third_party/abseil-cpp/absl/container/BUILD.bazel b/third_party/abseil-cpp/absl/container/BUILD.bazel
index f22fdc6..cf55f4b 100644
--- a/third_party/abseil-cpp/absl/container/BUILD.bazel
+++ b/third_party/abseil-cpp/absl/container/BUILD.bazel
@@ -598,7 +598,6 @@
         ":hashtable_debug_hooks",
         ":hashtablez_sampler",
         ":have_sse",
-        ":layout",
         "//absl/base:config",
         "//absl/base:core_headers",
         "//absl/base:endian",
diff --git a/third_party/abseil-cpp/absl/container/BUILD.gn b/third_party/abseil-cpp/absl/container/BUILD.gn
index 3e4c68d..ba939ae 100644
--- a/third_party/abseil-cpp/absl/container/BUILD.gn
+++ b/third_party/abseil-cpp/absl/container/BUILD.gn
@@ -218,7 +218,6 @@
     ":hashtable_debug_hooks",
     ":hashtablez_sampler",
     ":have_sse",
-    ":layout",
     "//third_party/abseil-cpp/absl/base:config",
     "//third_party/abseil-cpp/absl/base:core_headers",
     "//third_party/abseil-cpp/absl/base:endian",
diff --git a/third_party/abseil-cpp/absl/container/CMakeLists.txt b/third_party/abseil-cpp/absl/container/CMakeLists.txt
index 91c4015..691a05c 100644
--- a/third_party/abseil-cpp/absl/container/CMakeLists.txt
+++ b/third_party/abseil-cpp/absl/container/CMakeLists.txt
@@ -666,7 +666,6 @@
     absl::hash_policy_traits
     absl::hashtable_debug_hooks
     absl::have_sse
-    absl::layout
     absl::memory
     absl::meta
     absl::optional
diff --git a/third_party/abseil-cpp/absl/container/btree_test.cc b/third_party/abseil-cpp/absl/container/btree_test.cc
index d5d7915..d27cf27 100644
--- a/third_party/abseil-cpp/absl/container/btree_test.cc
+++ b/third_party/abseil-cpp/absl/container/btree_test.cc
@@ -595,7 +595,7 @@
   using V = typename remove_pair_const<typename T::value_type>::type;
   const std::vector<V> random_values = GenerateValuesWithSeed<V>(
       absl::GetFlag(FLAGS_test_values), 4 * absl::GetFlag(FLAGS_test_values),
-      testing::GTEST_FLAG(random_seed));
+      GTEST_FLAG_GET(random_seed));
 
   unique_checker<T, C> container;
 
@@ -619,7 +619,7 @@
   using V = typename remove_pair_const<typename T::value_type>::type;
   const std::vector<V> random_values = GenerateValuesWithSeed<V>(
       absl::GetFlag(FLAGS_test_values), 4 * absl::GetFlag(FLAGS_test_values),
-      testing::GTEST_FLAG(random_seed));
+      GTEST_FLAG_GET(random_seed));
 
   multi_checker<T, C> container;
 
diff --git a/third_party/abseil-cpp/absl/container/inlined_vector.h b/third_party/abseil-cpp/absl/container/inlined_vector.h
index 7c18234..37e5fef 100644
--- a/third_party/abseil-cpp/absl/container/inlined_vector.h
+++ b/third_party/abseil-cpp/absl/container/inlined_vector.h
@@ -72,37 +72,43 @@
 
   using Storage = inlined_vector_internal::Storage<T, N, A>;
 
-  using AllocatorTraits = typename Storage::AllocatorTraits;
-  using RValueReference = typename Storage::RValueReference;
-  using MoveIterator = typename Storage::MoveIterator;
-  using IsMemcpyOk = typename Storage::IsMemcpyOk;
+  template <typename TheA>
+  using AllocatorTraits = inlined_vector_internal::AllocatorTraits<TheA>;
+  template <typename TheA>
+  using MoveIterator = inlined_vector_internal::MoveIterator<TheA>;
+  template <typename TheA>
+  using IsMemcpyOk = inlined_vector_internal::IsMemcpyOk<TheA>;
 
-  template <typename Iterator>
+  template <typename TheA, typename Iterator>
   using IteratorValueAdapter =
-      typename Storage::template IteratorValueAdapter<Iterator>;
-  using CopyValueAdapter = typename Storage::CopyValueAdapter;
-  using DefaultValueAdapter = typename Storage::DefaultValueAdapter;
+      inlined_vector_internal::IteratorValueAdapter<TheA, Iterator>;
+  template <typename TheA>
+  using CopyValueAdapter = inlined_vector_internal::CopyValueAdapter<TheA>;
+  template <typename TheA>
+  using DefaultValueAdapter =
+      inlined_vector_internal::DefaultValueAdapter<TheA>;
 
   template <typename Iterator>
   using EnableIfAtLeastForwardIterator = absl::enable_if_t<
-      inlined_vector_internal::IsAtLeastForwardIterator<Iterator>::value>;
+      inlined_vector_internal::IsAtLeastForwardIterator<Iterator>::value, int>;
   template <typename Iterator>
   using DisableIfAtLeastForwardIterator = absl::enable_if_t<
-      !inlined_vector_internal::IsAtLeastForwardIterator<Iterator>::value>;
+      !inlined_vector_internal::IsAtLeastForwardIterator<Iterator>::value, int>;
 
  public:
-  using allocator_type = typename Storage::allocator_type;
-  using value_type = typename Storage::value_type;
-  using pointer = typename Storage::pointer;
-  using const_pointer = typename Storage::const_pointer;
-  using size_type = typename Storage::size_type;
-  using difference_type = typename Storage::difference_type;
-  using reference = typename Storage::reference;
-  using const_reference = typename Storage::const_reference;
-  using iterator = typename Storage::iterator;
-  using const_iterator = typename Storage::const_iterator;
-  using reverse_iterator = typename Storage::reverse_iterator;
-  using const_reverse_iterator = typename Storage::const_reverse_iterator;
+  using allocator_type = A;
+  using value_type = inlined_vector_internal::ValueType<A>;
+  using pointer = inlined_vector_internal::Pointer<A>;
+  using const_pointer = inlined_vector_internal::ConstPointer<A>;
+  using size_type = inlined_vector_internal::SizeType<A>;
+  using difference_type = inlined_vector_internal::DifferenceType<A>;
+  using reference = inlined_vector_internal::Reference<A>;
+  using const_reference = inlined_vector_internal::ConstReference<A>;
+  using iterator = inlined_vector_internal::Iterator<A>;
+  using const_iterator = inlined_vector_internal::ConstIterator<A>;
+  using reverse_iterator = inlined_vector_internal::ReverseIterator<A>;
+  using const_reverse_iterator =
+      inlined_vector_internal::ConstReverseIterator<A>;
 
   // ---------------------------------------------------------------------------
   // InlinedVector Constructors and Destructor
@@ -111,28 +117,28 @@
   // Creates an empty inlined vector with a value-initialized allocator.
   InlinedVector() noexcept(noexcept(allocator_type())) : storage_() {}
 
-  // Creates an empty inlined vector with a copy of `alloc`.
-  explicit InlinedVector(const allocator_type& alloc) noexcept
-      : storage_(alloc) {}
+  // Creates an empty inlined vector with a copy of `allocator`.
+  explicit InlinedVector(const allocator_type& allocator) noexcept
+      : storage_(allocator) {}
 
   // Creates an inlined vector with `n` copies of `value_type()`.
   explicit InlinedVector(size_type n,
-                         const allocator_type& alloc = allocator_type())
-      : storage_(alloc) {
-    storage_.Initialize(DefaultValueAdapter(), n);
+                         const allocator_type& allocator = allocator_type())
+      : storage_(allocator) {
+    storage_.Initialize(DefaultValueAdapter<A>(), n);
   }
 
   // Creates an inlined vector with `n` copies of `v`.
   InlinedVector(size_type n, const_reference v,
-                const allocator_type& alloc = allocator_type())
-      : storage_(alloc) {
-    storage_.Initialize(CopyValueAdapter(v), n);
+                const allocator_type& allocator = allocator_type())
+      : storage_(allocator) {
+    storage_.Initialize(CopyValueAdapter<A>(std::addressof(v)), n);
   }
 
   // Creates an inlined vector with copies of the elements of `list`.
   InlinedVector(std::initializer_list<value_type> list,
-                const allocator_type& alloc = allocator_type())
-      : InlinedVector(list.begin(), list.end(), alloc) {}
+                const allocator_type& allocator = allocator_type())
+      : InlinedVector(list.begin(), list.end(), allocator) {}
 
   // Creates an inlined vector with elements constructed from the provided
   // forward iterator range [`first`, `last`).
@@ -141,35 +147,36 @@
   // this constructor with two integral arguments and a call to the above
   // `InlinedVector(size_type, const_reference)` constructor.
   template <typename ForwardIterator,
-            EnableIfAtLeastForwardIterator<ForwardIterator>* = nullptr>
+            EnableIfAtLeastForwardIterator<ForwardIterator> = 0>
   InlinedVector(ForwardIterator first, ForwardIterator last,
-                const allocator_type& alloc = allocator_type())
-      : storage_(alloc) {
-    storage_.Initialize(IteratorValueAdapter<ForwardIterator>(first),
+                const allocator_type& allocator = allocator_type())
+      : storage_(allocator) {
+    storage_.Initialize(IteratorValueAdapter<A, ForwardIterator>(first),
                         std::distance(first, last));
   }
 
   // Creates an inlined vector with elements constructed from the provided input
   // iterator range [`first`, `last`).
   template <typename InputIterator,
-            DisableIfAtLeastForwardIterator<InputIterator>* = nullptr>
+            DisableIfAtLeastForwardIterator<InputIterator> = 0>
   InlinedVector(InputIterator first, InputIterator last,
-                const allocator_type& alloc = allocator_type())
-      : storage_(alloc) {
+                const allocator_type& allocator = allocator_type())
+      : storage_(allocator) {
     std::copy(first, last, std::back_inserter(*this));
   }
 
   // Creates an inlined vector by copying the contents of `other` using
   // `other`'s allocator.
   InlinedVector(const InlinedVector& other)
-      : InlinedVector(other, *other.storage_.GetAllocPtr()) {}
+      : InlinedVector(other, other.storage_.GetAllocator()) {}
 
-  // Creates an inlined vector by copying the contents of `other` using `alloc`.
-  InlinedVector(const InlinedVector& other, const allocator_type& alloc)
-      : storage_(alloc) {
+  // Creates an inlined vector by copying the contents of `other` using the
+  // provided `allocator`.
+  InlinedVector(const InlinedVector& other, const allocator_type& allocator)
+      : storage_(allocator) {
     if (other.empty()) {
       // Empty; nothing to do.
-    } else if (IsMemcpyOk::value && !other.storage_.GetIsAllocated()) {
+    } else if (IsMemcpyOk<A>::value && !other.storage_.GetIsAllocated()) {
       // Memcpy-able and do not need allocation.
       storage_.MemcpyFrom(other.storage_);
     } else {
@@ -194,8 +201,8 @@
   InlinedVector(InlinedVector&& other) noexcept(
       absl::allocator_is_nothrow<allocator_type>::value ||
       std::is_nothrow_move_constructible<value_type>::value)
-      : storage_(*other.storage_.GetAllocPtr()) {
-    if (IsMemcpyOk::value) {
+      : storage_(other.storage_.GetAllocator()) {
+    if (IsMemcpyOk<A>::value) {
       storage_.MemcpyFrom(other.storage_);
 
       other.storage_.SetInlinedSize(0);
@@ -206,11 +213,11 @@
 
       other.storage_.SetInlinedSize(0);
     } else {
-      IteratorValueAdapter<MoveIterator> other_values(
-          MoveIterator(other.storage_.GetInlinedData()));
+      IteratorValueAdapter<A, MoveIterator<A>> other_values(
+          MoveIterator<A>(other.storage_.GetInlinedData()));
 
-      inlined_vector_internal::ConstructElements(
-          storage_.GetAllocPtr(), storage_.GetInlinedData(), &other_values,
+      inlined_vector_internal::ConstructElements<A>(
+          storage_.GetAllocator(), storage_.GetInlinedData(), other_values,
           other.storage_.GetSize());
 
       storage_.SetInlinedSize(other.storage_.GetSize());
@@ -218,20 +225,22 @@
   }
 
   // Creates an inlined vector by moving in the contents of `other` with a copy
-  // of `alloc`.
+  // of `allocator`.
   //
-  // NOTE: if `other`'s allocator is not equal to `alloc`, even if `other`
+  // NOTE: if `other`'s allocator is not equal to `allocator`, even if `other`
   // contains allocated memory, this move constructor will still allocate. Since
   // allocation is performed, this constructor can only be `noexcept` if the
   // specified allocator is also `noexcept`.
-  InlinedVector(InlinedVector&& other, const allocator_type& alloc) noexcept(
-      absl::allocator_is_nothrow<allocator_type>::value)
-      : storage_(alloc) {
-    if (IsMemcpyOk::value) {
+  InlinedVector(
+      InlinedVector&& other,
+      const allocator_type& allocator)
+      noexcept(absl::allocator_is_nothrow<allocator_type>::value)
+      : storage_(allocator) {
+    if (IsMemcpyOk<A>::value) {
       storage_.MemcpyFrom(other.storage_);
 
       other.storage_.SetInlinedSize(0);
-    } else if ((*storage_.GetAllocPtr() == *other.storage_.GetAllocPtr()) &&
+    } else if ((storage_.GetAllocator() == other.storage_.GetAllocator()) &&
                other.storage_.GetIsAllocated()) {
       storage_.SetAllocatedData(other.storage_.GetAllocatedData(),
                                 other.storage_.GetAllocatedCapacity());
@@ -239,9 +248,9 @@
 
       other.storage_.SetInlinedSize(0);
     } else {
-      storage_.Initialize(
-          IteratorValueAdapter<MoveIterator>(MoveIterator(other.data())),
-          other.size());
+      storage_.Initialize(IteratorValueAdapter<A, MoveIterator<A>>(
+                              MoveIterator<A>(other.data())),
+                          other.size());
     }
   }
 
@@ -442,7 +451,7 @@
   // `InlinedVector::get_allocator()`
   //
   // Returns a copy of the inlined vector's allocator.
-  allocator_type get_allocator() const { return *storage_.GetAllocPtr(); }
+  allocator_type get_allocator() const { return storage_.GetAllocator(); }
 
   // ---------------------------------------------------------------------------
   // InlinedVector Member Mutators
@@ -476,16 +485,16 @@
   // unspecified state.
   InlinedVector& operator=(InlinedVector&& other) {
     if (ABSL_PREDICT_TRUE(this != std::addressof(other))) {
-      if (IsMemcpyOk::value || other.storage_.GetIsAllocated()) {
-        inlined_vector_internal::DestroyElements(storage_.GetAllocPtr(), data(),
-                                                 size());
+      if (IsMemcpyOk<A>::value || other.storage_.GetIsAllocated()) {
+        inlined_vector_internal::DestroyElements<A>(storage_.GetAllocator(),
+                                                    data(), size());
         storage_.DeallocateIfAllocated();
         storage_.MemcpyFrom(other.storage_);
 
         other.storage_.SetInlinedSize(0);
       } else {
-        storage_.Assign(IteratorValueAdapter<MoveIterator>(
-                            MoveIterator(other.storage_.GetInlinedData())),
+        storage_.Assign(IteratorValueAdapter<A, MoveIterator<A>>(
+                            MoveIterator<A>(other.storage_.GetInlinedData())),
                         other.size());
       }
     }
@@ -497,7 +506,7 @@
   //
   // Replaces the contents of the inlined vector with `n` copies of `v`.
   void assign(size_type n, const_reference v) {
-    storage_.Assign(CopyValueAdapter(v), n);
+    storage_.Assign(CopyValueAdapter<A>(std::addressof(v)), n);
   }
 
   // Overload of `InlinedVector::assign(...)` that replaces the contents of the
@@ -511,9 +520,9 @@
   //
   // NOTE: this overload is for iterators that are "forward" category or better.
   template <typename ForwardIterator,
-            EnableIfAtLeastForwardIterator<ForwardIterator>* = nullptr>
+            EnableIfAtLeastForwardIterator<ForwardIterator> = 0>
   void assign(ForwardIterator first, ForwardIterator last) {
-    storage_.Assign(IteratorValueAdapter<ForwardIterator>(first),
+    storage_.Assign(IteratorValueAdapter<A, ForwardIterator>(first),
                     std::distance(first, last));
   }
 
@@ -522,7 +531,7 @@
   //
   // NOTE: this overload is for iterators that are "input" category.
   template <typename InputIterator,
-            DisableIfAtLeastForwardIterator<InputIterator>* = nullptr>
+            DisableIfAtLeastForwardIterator<InputIterator> = 0>
   void assign(InputIterator first, InputIterator last) {
     size_type i = 0;
     for (; i < size() && first != last; ++i, static_cast<void>(++first)) {
@@ -541,7 +550,7 @@
   // is larger than `size()`, new elements are value-initialized.
   void resize(size_type n) {
     ABSL_HARDENING_ASSERT(n <= max_size());
-    storage_.Resize(DefaultValueAdapter(), n);
+    storage_.Resize(DefaultValueAdapter<A>(), n);
   }
 
   // Overload of `InlinedVector::resize(...)` that resizes the inlined vector to
@@ -551,7 +560,7 @@
   // is larger than `size()`, new elements are copied-constructed from `v`.
   void resize(size_type n, const_reference v) {
     ABSL_HARDENING_ASSERT(n <= max_size());
-    storage_.Resize(CopyValueAdapter(v), n);
+    storage_.Resize(CopyValueAdapter<A>(std::addressof(v)), n);
   }
 
   // `InlinedVector::insert(...)`
@@ -564,7 +573,7 @@
 
   // Overload of `InlinedVector::insert(...)` that inserts `v` at `pos` using
   // move semantics, returning an `iterator` to the newly inserted element.
-  iterator insert(const_iterator pos, RValueReference v) {
+  iterator insert(const_iterator pos, value_type&& v) {
     return emplace(pos, std::move(v));
   }
 
@@ -577,7 +586,8 @@
 
     if (ABSL_PREDICT_TRUE(n != 0)) {
       value_type dealias = v;
-      return storage_.Insert(pos, CopyValueAdapter(dealias), n);
+      return storage_.Insert(pos, CopyValueAdapter<A>(std::addressof(dealias)),
+                             n);
     } else {
       return const_cast<iterator>(pos);
     }
@@ -596,14 +606,15 @@
   //
   // NOTE: this overload is for iterators that are "forward" category or better.
   template <typename ForwardIterator,
-            EnableIfAtLeastForwardIterator<ForwardIterator>* = nullptr>
+            EnableIfAtLeastForwardIterator<ForwardIterator> = 0>
   iterator insert(const_iterator pos, ForwardIterator first,
                   ForwardIterator last) {
     ABSL_HARDENING_ASSERT(pos >= begin());
     ABSL_HARDENING_ASSERT(pos <= end());
 
     if (ABSL_PREDICT_TRUE(first != last)) {
-      return storage_.Insert(pos, IteratorValueAdapter<ForwardIterator>(first),
+      return storage_.Insert(pos,
+                             IteratorValueAdapter<A, ForwardIterator>(first),
                              std::distance(first, last));
     } else {
       return const_cast<iterator>(pos);
@@ -616,7 +627,7 @@
   //
   // NOTE: this overload is for iterators that are "input" category.
   template <typename InputIterator,
-            DisableIfAtLeastForwardIterator<InputIterator>* = nullptr>
+            DisableIfAtLeastForwardIterator<InputIterator> = 0>
   iterator insert(const_iterator pos, InputIterator first, InputIterator last) {
     ABSL_HARDENING_ASSERT(pos >= begin());
     ABSL_HARDENING_ASSERT(pos <= end());
@@ -640,8 +651,8 @@
 
     value_type dealias(std::forward<Args>(args)...);
     return storage_.Insert(pos,
-                           IteratorValueAdapter<MoveIterator>(
-                               MoveIterator(std::addressof(dealias))),
+                           IteratorValueAdapter<A, MoveIterator<A>>(
+                               MoveIterator<A>(std::addressof(dealias))),
                            1);
   }
 
@@ -661,7 +672,7 @@
 
   // Overload of `InlinedVector::push_back(...)` for inserting `v` at `end()`
   // using move semantics.
-  void push_back(RValueReference v) {
+  void push_back(value_type&& v) {
     static_cast<void>(emplace_back(std::move(v)));
   }
 
@@ -671,7 +682,7 @@
   void pop_back() noexcept {
     ABSL_HARDENING_ASSERT(!empty());
 
-    AllocatorTraits::destroy(*storage_.GetAllocPtr(), data() + (size() - 1));
+    AllocatorTraits<A>::destroy(storage_.GetAllocator(), data() + (size() - 1));
     storage_.SubtractSize(1);
   }
 
@@ -710,8 +721,8 @@
   // Destroys all elements in the inlined vector, setting the size to `0` and
   // deallocating any held memory.
   void clear() noexcept {
-    inlined_vector_internal::DestroyElements(storage_.GetAllocPtr(), data(),
-                                             size());
+    inlined_vector_internal::DestroyElements<A>(storage_.GetAllocator(), data(),
+                                                size());
     storage_.DeallocateIfAllocated();
 
     storage_.SetInlinedSize(0);
diff --git a/third_party/abseil-cpp/absl/container/internal/hash_function_defaults.h b/third_party/abseil-cpp/absl/container/internal/hash_function_defaults.h
index 0683422..250e662 100644
--- a/third_party/abseil-cpp/absl/container/internal/hash_function_defaults.h
+++ b/third_party/abseil-cpp/absl/container/internal/hash_function_defaults.h
@@ -78,24 +78,26 @@
   }
 };
 
+struct StringEq {
+  using is_transparent = void;
+  bool operator()(absl::string_view lhs, absl::string_view rhs) const {
+    return lhs == rhs;
+  }
+  bool operator()(const absl::Cord& lhs, const absl::Cord& rhs) const {
+    return lhs == rhs;
+  }
+  bool operator()(const absl::Cord& lhs, absl::string_view rhs) const {
+    return lhs == rhs;
+  }
+  bool operator()(absl::string_view lhs, const absl::Cord& rhs) const {
+    return lhs == rhs;
+  }
+};
+
 // Supports heterogeneous lookup for string-like elements.
 struct StringHashEq {
   using Hash = StringHash;
-  struct Eq {
-    using is_transparent = void;
-    bool operator()(absl::string_view lhs, absl::string_view rhs) const {
-      return lhs == rhs;
-    }
-    bool operator()(const absl::Cord& lhs, const absl::Cord& rhs) const {
-      return lhs == rhs;
-    }
-    bool operator()(const absl::Cord& lhs, absl::string_view rhs) const {
-      return lhs == rhs;
-    }
-    bool operator()(absl::string_view lhs, const absl::Cord& rhs) const {
-      return lhs == rhs;
-    }
-  };
+  using Eq = StringEq;
 };
 
 template <>
diff --git a/third_party/abseil-cpp/absl/container/internal/inlined_vector.h b/third_party/abseil-cpp/absl/container/internal/inlined_vector.h
index 49822af..1cfba9b 100644
--- a/third_party/abseil-cpp/absl/container/internal/inlined_vector.h
+++ b/third_party/abseil-cpp/absl/container/internal/inlined_vector.h
@@ -40,45 +40,65 @@
 #pragma GCC diagnostic ignored "-Wmaybe-uninitialized"
 #endif
 
+template <typename A>
+using AllocatorTraits = std::allocator_traits<A>;
+template <typename A>
+using ValueType = typename AllocatorTraits<A>::value_type;
+template <typename A>
+using SizeType = typename AllocatorTraits<A>::size_type;
+template <typename A>
+using Pointer = typename AllocatorTraits<A>::pointer;
+template <typename A>
+using ConstPointer = typename AllocatorTraits<A>::const_pointer;
+template <typename A>
+using SizeType = typename AllocatorTraits<A>::size_type;
+template <typename A>
+using DifferenceType = typename AllocatorTraits<A>::difference_type;
+template <typename A>
+using Reference = ValueType<A>&;
+template <typename A>
+using ConstReference = const ValueType<A>&;
+template <typename A>
+using Iterator = Pointer<A>;
+template <typename A>
+using ConstIterator = ConstPointer<A>;
+template <typename A>
+using ReverseIterator = typename std::reverse_iterator<Iterator<A>>;
+template <typename A>
+using ConstReverseIterator = typename std::reverse_iterator<ConstIterator<A>>;
+template <typename A>
+using MoveIterator = typename std::move_iterator<Iterator<A>>;
+
 template <typename Iterator>
 using IsAtLeastForwardIterator = std::is_convertible<
     typename std::iterator_traits<Iterator>::iterator_category,
     std::forward_iterator_tag>;
 
-template <typename AllocatorType,
-          typename ValueType =
-              typename absl::allocator_traits<AllocatorType>::value_type>
+template <typename A>
 using IsMemcpyOk =
-    absl::conjunction<std::is_same<AllocatorType, std::allocator<ValueType>>,
-                      absl::is_trivially_copy_constructible<ValueType>,
-                      absl::is_trivially_copy_assignable<ValueType>,
-                      absl::is_trivially_destructible<ValueType>>;
+    absl::conjunction<std::is_same<A, std::allocator<ValueType<A>>>,
+                      absl::is_trivially_copy_constructible<ValueType<A>>,
+                      absl::is_trivially_copy_assignable<ValueType<A>>,
+                      absl::is_trivially_destructible<ValueType<A>>>;
 
-template <typename AllocatorType, typename Pointer, typename SizeType>
-void DestroyElements(AllocatorType* alloc_ptr, Pointer destroy_first,
-                     SizeType destroy_size) {
-  using AllocatorTraits = absl::allocator_traits<AllocatorType>;
+template <typename T>
+struct TypeIdentity {
+  using type = T;
+};
 
+// Used for function arguments in template functions to prevent ADL by forcing
+// callers to explicitly specify the template parameter.
+template <typename T>
+using NoTypeDeduction = typename TypeIdentity<T>::type;
+
+template <typename A>
+void DestroyElements(NoTypeDeduction<A>& allocator, Pointer<A> destroy_first,
+                     SizeType<A> destroy_size) {
   if (destroy_first != nullptr) {
     for (auto i = destroy_size; i != 0;) {
       --i;
-      AllocatorTraits::destroy(*alloc_ptr, destroy_first + i);
+      AllocatorTraits<A>::destroy(allocator, destroy_first + i);
     }
-
-#if !defined(NDEBUG)
-    {
-      using ValueType = typename AllocatorTraits::value_type;
-
-      // Overwrite unused memory with `0xab` so we can catch uninitialized
-      // usage.
-      //
-      // Cast to `void*` to tell the compiler that we don't care that we might
-      // be scribbling on a vtable pointer.
-      void* memory_ptr = destroy_first;
-      auto memory_size = destroy_size * sizeof(ValueType);
-      std::memset(memory_ptr, 0xab, memory_size);
-    }
-#endif  // !defined(NDEBUG)
   }
 }
 
@@ -99,54 +119,45 @@
 template <>
 inline void MemcpyIfAllowed<false>(void*, const void*, size_t) {}
 
-template <typename AllocatorType, typename Pointer, typename ValueAdapter,
-          typename SizeType>
-void ConstructElements(AllocatorType* alloc_ptr, Pointer construct_first,
-                       ValueAdapter* values_ptr, SizeType construct_size) {
-  for (SizeType i = 0; i < construct_size; ++i) {
-    ABSL_INTERNAL_TRY {
-      values_ptr->ConstructNext(alloc_ptr, construct_first + i);
-    }
+template <typename A, typename ValueAdapter>
+void ConstructElements(NoTypeDeduction<A>& allocator,
+                       Pointer<A> construct_first, ValueAdapter& values,
+                       SizeType<A> construct_size) {
+  for (SizeType<A> i = 0; i < construct_size; ++i) {
+    ABSL_INTERNAL_TRY { values.ConstructNext(allocator, construct_first + i); }
     ABSL_INTERNAL_CATCH_ANY {
-      inlined_vector_internal::DestroyElements(alloc_ptr, construct_first, i);
+      DestroyElements<A>(allocator, construct_first, i);
       ABSL_INTERNAL_RETHROW;
     }
   }
 }
 
-template <typename Pointer, typename ValueAdapter, typename SizeType>
-void AssignElements(Pointer assign_first, ValueAdapter* values_ptr,
-                    SizeType assign_size) {
-  for (SizeType i = 0; i < assign_size; ++i) {
-    values_ptr->AssignNext(assign_first + i);
+template <typename A, typename ValueAdapter>
+void AssignElements(Pointer<A> assign_first, ValueAdapter& values,
+                    SizeType<A> assign_size) {
+  for (SizeType<A> i = 0; i < assign_size; ++i) {
+    values.AssignNext(assign_first + i);
   }
 }
 
-template <typename AllocatorType>
+template <typename A>
 struct StorageView {
-  using AllocatorTraits = absl::allocator_traits<AllocatorType>;
-  using Pointer = typename AllocatorTraits::pointer;
-  using SizeType = typename AllocatorTraits::size_type;
-
-  Pointer data;
-  SizeType size;
-  SizeType capacity;
+  Pointer<A> data;
+  SizeType<A> size;
+  SizeType<A> capacity;
 };
 
-template <typename AllocatorType, typename Iterator>
+template <typename A, typename Iterator>
 class IteratorValueAdapter {
-  using AllocatorTraits = absl::allocator_traits<AllocatorType>;
-  using Pointer = typename AllocatorTraits::pointer;
-
  public:
   explicit IteratorValueAdapter(const Iterator& it) : it_(it) {}
 
-  void ConstructNext(AllocatorType* alloc_ptr, Pointer construct_at) {
-    AllocatorTraits::construct(*alloc_ptr, construct_at, *it_);
+  void ConstructNext(A& allocator, Pointer<A> construct_at) {
+    AllocatorTraits<A>::construct(allocator, construct_at, *it_);
     ++it_;
   }
 
-  void AssignNext(Pointer assign_at) {
+  void AssignNext(Pointer<A> assign_at) {
     *assign_at = *it_;
     ++it_;
   }
@@ -155,68 +166,55 @@
   Iterator it_;
 };
 
-template <typename AllocatorType>
+template <typename A>
 class CopyValueAdapter {
-  using AllocatorTraits = absl::allocator_traits<AllocatorType>;
-  using ValueType = typename AllocatorTraits::value_type;
-  using Pointer = typename AllocatorTraits::pointer;
-  using ConstPointer = typename AllocatorTraits::const_pointer;
-
  public:
-  explicit CopyValueAdapter(const ValueType& v) : ptr_(std::addressof(v)) {}
+  explicit CopyValueAdapter(ConstPointer<A> p) : ptr_(p) {}
 
-  void ConstructNext(AllocatorType* alloc_ptr, Pointer construct_at) {
-    AllocatorTraits::construct(*alloc_ptr, construct_at, *ptr_);
+  void ConstructNext(A& allocator, Pointer<A> construct_at) {
+    AllocatorTraits<A>::construct(allocator, construct_at, *ptr_);
   }
 
-  void AssignNext(Pointer assign_at) { *assign_at = *ptr_; }
+  void AssignNext(Pointer<A> assign_at) { *assign_at = *ptr_; }
 
  private:
-  ConstPointer ptr_;
+  ConstPointer<A> ptr_;
 };
 
-template <typename AllocatorType>
+template <typename A>
 class DefaultValueAdapter {
-  using AllocatorTraits = absl::allocator_traits<AllocatorType>;
-  using ValueType = typename AllocatorTraits::value_type;
-  using Pointer = typename AllocatorTraits::pointer;
-
  public:
   explicit DefaultValueAdapter() {}
 
-  void ConstructNext(AllocatorType* alloc_ptr, Pointer construct_at) {
-    AllocatorTraits::construct(*alloc_ptr, construct_at);
+  void ConstructNext(A& allocator, Pointer<A> construct_at) {
+    AllocatorTraits<A>::construct(allocator, construct_at);
   }
 
-  void AssignNext(Pointer assign_at) { *assign_at = ValueType(); }
+  void AssignNext(Pointer<A> assign_at) { *assign_at = ValueType<A>(); }
 };
 
-template <typename AllocatorType>
+template <typename A>
 class AllocationTransaction {
-  using AllocatorTraits = absl::allocator_traits<AllocatorType>;
-  using Pointer = typename AllocatorTraits::pointer;
-  using SizeType = typename AllocatorTraits::size_type;
-
  public:
-  explicit AllocationTransaction(AllocatorType* alloc_ptr)
-      : alloc_data_(*alloc_ptr, nullptr) {}
+  explicit AllocationTransaction(A& allocator)
+      : allocator_data_(allocator, nullptr), capacity_(0) {}
 
   ~AllocationTransaction() {
     if (DidAllocate()) {
-      AllocatorTraits::deallocate(GetAllocator(), GetData(), GetCapacity());
+      AllocatorTraits<A>::deallocate(GetAllocator(), GetData(), GetCapacity());
     }
   }
 
   AllocationTransaction(const AllocationTransaction&) = delete;
   void operator=(const AllocationTransaction&) = delete;
 
-  AllocatorType& GetAllocator() { return alloc_data_.template get<0>(); }
-  Pointer& GetData() { return alloc_data_.template get<1>(); }
-  SizeType& GetCapacity() { return capacity_; }
+  A& GetAllocator() { return allocator_data_.template get<0>(); }
+  Pointer<A>& GetData() { return allocator_data_.template get<1>(); }
+  SizeType<A>& GetCapacity() { return capacity_; }
 
   bool DidAllocate() { return GetData() != nullptr; }
-  Pointer Allocate(SizeType capacity) {
-    GetData() = AllocatorTraits::allocate(GetAllocator(), capacity);
+  Pointer<A> Allocate(SizeType<A> capacity) {
+    GetData() = AllocatorTraits<A>::allocate(GetAllocator(), capacity);
     GetCapacity() = capacity;
     return GetData();
   }
@@ -227,39 +225,33 @@
   }
 
  private:
-  container_internal::CompressedTuple<AllocatorType, Pointer> alloc_data_;
-  SizeType capacity_ = 0;
+  container_internal::CompressedTuple<A, Pointer<A>> allocator_data_;
+  SizeType<A> capacity_;
 };
 
-template <typename AllocatorType>
+template <typename A>
 class ConstructionTransaction {
-  using AllocatorTraits = absl::allocator_traits<AllocatorType>;
-  using Pointer = typename AllocatorTraits::pointer;
-  using SizeType = typename AllocatorTraits::size_type;
-
  public:
-  explicit ConstructionTransaction(AllocatorType* alloc_ptr)
-      : alloc_data_(*alloc_ptr, nullptr) {}
+  explicit ConstructionTransaction(A& allocator)
+      : allocator_data_(allocator, nullptr), size_(0) {}
 
   ~ConstructionTransaction() {
     if (DidConstruct()) {
-      inlined_vector_internal::DestroyElements(std::addressof(GetAllocator()),
-                                               GetData(), GetSize());
+      DestroyElements<A>(GetAllocator(), GetData(), GetSize());
     }
   }
 
   ConstructionTransaction(const ConstructionTransaction&) = delete;
   void operator=(const ConstructionTransaction&) = delete;
 
-  AllocatorType& GetAllocator() { return alloc_data_.template get<0>(); }
-  Pointer& GetData() { return alloc_data_.template get<1>(); }
-  SizeType& GetSize() { return size_; }
+  A& GetAllocator() { return allocator_data_.template get<0>(); }
+  Pointer<A>& GetData() { return allocator_data_.template get<1>(); }
+  SizeType<A>& GetSize() { return size_; }
 
   bool DidConstruct() { return GetData() != nullptr; }
   template <typename ValueAdapter>
-  void Construct(Pointer data, ValueAdapter* values_ptr, SizeType size) {
-    inlined_vector_internal::ConstructElements(std::addressof(GetAllocator()),
-                                               data, values_ptr, size);
+  void Construct(Pointer<A> data, ValueAdapter& values, SizeType<A> size) {
+    ConstructElements<A>(GetAllocator(), data, values, size);
     GetData() = data;
     GetSize() = size;
   }
@@ -269,52 +261,19 @@
   }
 
  private:
-  container_internal::CompressedTuple<AllocatorType, Pointer> alloc_data_;
-  SizeType size_ = 0;
+  container_internal::CompressedTuple<A, Pointer<A>> allocator_data_;
+  SizeType<A> size_;
 };
 
 template <typename T, size_t N, typename A>
 class Storage {
  public:
-  using AllocatorTraits = absl::allocator_traits<A>;
-  using allocator_type = typename AllocatorTraits::allocator_type;
-  using value_type = typename AllocatorTraits::value_type;
-  using pointer = typename AllocatorTraits::pointer;
-  using const_pointer = typename AllocatorTraits::const_pointer;
-  using size_type = typename AllocatorTraits::size_type;
-  using difference_type = typename AllocatorTraits::difference_type;
-
-  using reference = value_type&;
-  using const_reference = const value_type&;
-  using RValueReference = value_type&&;
-  using iterator = pointer;
-  using const_iterator = const_pointer;
-  using reverse_iterator = std::reverse_iterator<iterator>;
-  using const_reverse_iterator = std::reverse_iterator<const_iterator>;
-  using MoveIterator = std::move_iterator<iterator>;
-  using IsMemcpyOk = inlined_vector_internal::IsMemcpyOk<allocator_type>;
-
-  using StorageView = inlined_vector_internal::StorageView<allocator_type>;
-
-  template <typename Iterator>
-  using IteratorValueAdapter =
-      inlined_vector_internal::IteratorValueAdapter<allocator_type, Iterator>;
-  using CopyValueAdapter =
-      inlined_vector_internal::CopyValueAdapter<allocator_type>;
-  using DefaultValueAdapter =
-      inlined_vector_internal::DefaultValueAdapter<allocator_type>;
-
-  using AllocationTransaction =
-      inlined_vector_internal::AllocationTransaction<allocator_type>;
-  using ConstructionTransaction =
-      inlined_vector_internal::ConstructionTransaction<allocator_type>;
-
-  static size_type NextCapacity(size_type current_capacity) {
+  static SizeType<A> NextCapacity(SizeType<A> current_capacity) {
     return current_capacity * 2;
   }
 
-  static size_type ComputeCapacity(size_type current_capacity,
-                                   size_type requested_capacity) {
+  static SizeType<A> ComputeCapacity(SizeType<A> current_capacity,
+                                     SizeType<A> requested_capacity) {
     return (std::max)(NextCapacity(current_capacity), requested_capacity);
   }
 
@@ -322,15 +281,15 @@
   // Storage Constructors and Destructor
   // ---------------------------------------------------------------------------
 
-  Storage() : metadata_(allocator_type(), /* size and is_allocated */ 0) {}
+  Storage() : metadata_(A(), /* size and is_allocated */ 0) {}
 
-  explicit Storage(const allocator_type& alloc)
-      : metadata_(alloc, /* size and is_allocated */ 0) {}
+  explicit Storage(const A& allocator)
+      : metadata_(allocator, /* size and is_allocated */ 0) {}
 
   ~Storage() {
     if (GetSizeAndIsAllocated() == 0) {
       // Empty and not allocated; nothing to do.
-    } else if (IsMemcpyOk::value) {
+    } else if (IsMemcpyOk<A>::value) {
       // No destructors need to be run; just deallocate if necessary.
       DeallocateIfAllocated();
     } else {
@@ -342,52 +301,48 @@
   // Storage Member Accessors
   // ---------------------------------------------------------------------------
 
-  size_type& GetSizeAndIsAllocated() { return metadata_.template get<1>(); }
+  SizeType<A>& GetSizeAndIsAllocated() { return metadata_.template get<1>(); }
 
-  const size_type& GetSizeAndIsAllocated() const {
+  const SizeType<A>& GetSizeAndIsAllocated() const {
     return metadata_.template get<1>();
   }
 
-  size_type GetSize() const { return GetSizeAndIsAllocated() >> 1; }
+  SizeType<A> GetSize() const { return GetSizeAndIsAllocated() >> 1; }
 
   bool GetIsAllocated() const { return GetSizeAndIsAllocated() & 1; }
 
-  pointer GetAllocatedData() { return data_.allocated.allocated_data; }
+  Pointer<A> GetAllocatedData() { return data_.allocated.allocated_data; }
 
-  const_pointer GetAllocatedData() const {
+  ConstPointer<A> GetAllocatedData() const {
     return data_.allocated.allocated_data;
   }
 
-  pointer GetInlinedData() {
-    return reinterpret_cast<pointer>(
+  Pointer<A> GetInlinedData() {
+    return reinterpret_cast<Pointer<A>>(
         std::addressof(data_.inlined.inlined_data[0]));
   }
 
-  const_pointer GetInlinedData() const {
-    return reinterpret_cast<const_pointer>(
+  ConstPointer<A> GetInlinedData() const {
+    return reinterpret_cast<ConstPointer<A>>(
         std::addressof(data_.inlined.inlined_data[0]));
   }
 
-  size_type GetAllocatedCapacity() const {
+  SizeType<A> GetAllocatedCapacity() const {
     return data_.allocated.allocated_capacity;
   }
 
-  size_type GetInlinedCapacity() const { return static_cast<size_type>(N); }
+  SizeType<A> GetInlinedCapacity() const { return static_cast<SizeType<A>>(N); }
 
-  StorageView MakeStorageView() {
-    return GetIsAllocated()
-               ? StorageView{GetAllocatedData(), GetSize(),
-                             GetAllocatedCapacity()}
-               : StorageView{GetInlinedData(), GetSize(), GetInlinedCapacity()};
+  StorageView<A> MakeStorageView() {
+    return GetIsAllocated() ? StorageView<A>{GetAllocatedData(), GetSize(),
+                                             GetAllocatedCapacity()}
+                            : StorageView<A>{GetInlinedData(), GetSize(),
+                                             GetInlinedCapacity()};
   }
 
-  allocator_type* GetAllocPtr() {
-    return std::addressof(metadata_.template get<0>());
-  }
+  A& GetAllocator() { return metadata_.template get<0>(); }
 
-  const allocator_type* GetAllocPtr() const {
-    return std::addressof(metadata_.template get<0>());
-  }
+  const A& GetAllocator() const { return metadata_.template get<0>(); }
 
   // ---------------------------------------------------------------------------
   // Storage Member Mutators
@@ -396,74 +351,73 @@
   ABSL_ATTRIBUTE_NOINLINE void InitFrom(const Storage& other);
 
   template <typename ValueAdapter>
-  void Initialize(ValueAdapter values, size_type new_size);
+  void Initialize(ValueAdapter values, SizeType<A> new_size);
 
   template <typename ValueAdapter>
-  void Assign(ValueAdapter values, size_type new_size);
+  void Assign(ValueAdapter values, SizeType<A> new_size);
 
   template <typename ValueAdapter>
-  void Resize(ValueAdapter values, size_type new_size);
+  void Resize(ValueAdapter values, SizeType<A> new_size);
 
   template <typename ValueAdapter>
-  iterator Insert(const_iterator pos, ValueAdapter values,
-                  size_type insert_count);
+  Iterator<A> Insert(ConstIterator<A> pos, ValueAdapter values,
+                     SizeType<A> insert_count);
 
   template <typename... Args>
-  reference EmplaceBack(Args&&... args);
+  Reference<A> EmplaceBack(Args&&... args);
 
-  iterator Erase(const_iterator from, const_iterator to);
+  Iterator<A> Erase(ConstIterator<A> from, ConstIterator<A> to);
 
-  void Reserve(size_type requested_capacity);
+  void Reserve(SizeType<A> requested_capacity);
 
   void ShrinkToFit();
 
   void Swap(Storage* other_storage_ptr);
 
   void SetIsAllocated() {
-    GetSizeAndIsAllocated() |= static_cast<size_type>(1);
+    GetSizeAndIsAllocated() |= static_cast<SizeType<A>>(1);
   }
 
   void UnsetIsAllocated() {
-    GetSizeAndIsAllocated() &= ((std::numeric_limits<size_type>::max)() - 1);
+    GetSizeAndIsAllocated() &= ((std::numeric_limits<SizeType<A>>::max)() - 1);
   }
 
-  void SetSize(size_type size) {
+  void SetSize(SizeType<A> size) {
     GetSizeAndIsAllocated() =
-        (size << 1) | static_cast<size_type>(GetIsAllocated());
+        (size << 1) | static_cast<SizeType<A>>(GetIsAllocated());
   }
 
-  void SetAllocatedSize(size_type size) {
-    GetSizeAndIsAllocated() = (size << 1) | static_cast<size_type>(1);
+  void SetAllocatedSize(SizeType<A> size) {
+    GetSizeAndIsAllocated() = (size << 1) | static_cast<SizeType<A>>(1);
   }
 
-  void SetInlinedSize(size_type size) {
-    GetSizeAndIsAllocated() = size << static_cast<size_type>(1);
+  void SetInlinedSize(SizeType<A> size) {
+    GetSizeAndIsAllocated() = size << static_cast<SizeType<A>>(1);
   }
 
-  void AddSize(size_type count) {
-    GetSizeAndIsAllocated() += count << static_cast<size_type>(1);
+  void AddSize(SizeType<A> count) {
+    GetSizeAndIsAllocated() += count << static_cast<SizeType<A>>(1);
   }
 
-  void SubtractSize(size_type count) {
+  void SubtractSize(SizeType<A> count) {
     assert(count <= GetSize());
 
-    GetSizeAndIsAllocated() -= count << static_cast<size_type>(1);
+    GetSizeAndIsAllocated() -= count << static_cast<SizeType<A>>(1);
   }
 
-  void SetAllocatedData(pointer data, size_type capacity) {
+  void SetAllocatedData(Pointer<A> data, SizeType<A> capacity) {
     data_.allocated.allocated_data = data;
     data_.allocated.allocated_capacity = capacity;
   }
 
-  void AcquireAllocatedData(AllocationTransaction* allocation_tx_ptr) {
-    SetAllocatedData(allocation_tx_ptr->GetData(),
-                     allocation_tx_ptr->GetCapacity());
+  void AcquireAllocatedData(AllocationTransaction<A>& allocation_tx) {
+    SetAllocatedData(allocation_tx.GetData(), allocation_tx.GetCapacity());
 
-    allocation_tx_ptr->Reset();
+    allocation_tx.Reset();
   }
 
   void MemcpyFrom(const Storage& other_storage) {
-    assert(IsMemcpyOk::value || other_storage.GetIsAllocated());
+    assert(IsMemcpyOk<A>::value || other_storage.GetIsAllocated());
 
     GetSizeAndIsAllocated() = other_storage.GetSizeAndIsAllocated();
     data_ = other_storage.data_;
@@ -471,24 +425,23 @@
 
   void DeallocateIfAllocated() {
     if (GetIsAllocated()) {
-      AllocatorTraits::deallocate(*GetAllocPtr(), GetAllocatedData(),
-                                  GetAllocatedCapacity());
+      AllocatorTraits<A>::deallocate(GetAllocator(), GetAllocatedData(),
+                                     GetAllocatedCapacity());
     }
   }
 
  private:
   ABSL_ATTRIBUTE_NOINLINE void DestroyContents();
 
-  using Metadata =
-      container_internal::CompressedTuple<allocator_type, size_type>;
+  using Metadata = container_internal::CompressedTuple<A, SizeType<A>>;
 
   struct Allocated {
-    pointer allocated_data;
-    size_type allocated_capacity;
+    Pointer<A> allocated_data;
+    SizeType<A> allocated_capacity;
   };
 
   struct Inlined {
-    alignas(value_type) char inlined_data[sizeof(value_type[N])];
+    alignas(ValueType<A>) char inlined_data[sizeof(ValueType<A>[N])];
   };
 
   union Data {
@@ -497,7 +450,7 @@
   };
 
   template <typename... Args>
-  ABSL_ATTRIBUTE_NOINLINE reference EmplaceBackSlow(Args&&... args);
+  ABSL_ATTRIBUTE_NOINLINE Reference<A> EmplaceBackSlow(Args&&... args);
 
   Metadata metadata_;
   Data data_;
@@ -505,8 +458,8 @@
 
 template <typename T, size_t N, typename A>
 void Storage<T, N, A>::DestroyContents() {
-  pointer data = GetIsAllocated() ? GetAllocatedData() : GetInlinedData();
-  inlined_vector_internal::DestroyElements(GetAllocPtr(), data, GetSize());
+  Pointer<A> data = GetIsAllocated() ? GetAllocatedData() : GetInlinedData();
+  DestroyElements<A>(GetAllocator(), data, GetSize());
   DeallocateIfAllocated();
 }
 
@@ -514,8 +467,8 @@
 void Storage<T, N, A>::InitFrom(const Storage& other) {
   const auto n = other.GetSize();
   assert(n > 0);  // Empty sources handled handled in caller.
-  const_pointer src;
-  pointer dst;
+  ConstPointer<A> src;
+  Pointer<A> dst;
   if (!other.GetIsAllocated()) {
     dst = GetInlinedData();
     src = other.GetInlinedData();
@@ -523,43 +476,42 @@
     // Because this is only called from the `InlinedVector` constructors, it's
     // safe to take on the allocation with size `0`. If `ConstructElements(...)`
     // throws, deallocation will be automatically handled by `~Storage()`.
-    size_type new_capacity = ComputeCapacity(GetInlinedCapacity(), n);
-    dst = AllocatorTraits::allocate(*GetAllocPtr(), new_capacity);
+    SizeType<A> new_capacity = ComputeCapacity(GetInlinedCapacity(), n);
+    dst = AllocatorTraits<A>::allocate(GetAllocator(), new_capacity);
     SetAllocatedData(dst, new_capacity);
     src = other.GetAllocatedData();
   }
-  if (IsMemcpyOk::value) {
-    MemcpyIfAllowed<IsMemcpyOk::value>(dst, src, sizeof(dst[0]) * n);
+  if (IsMemcpyOk<A>::value) {
+    MemcpyIfAllowed<IsMemcpyOk<A>::value>(dst, src, sizeof(dst[0]) * n);
   } else {
-    auto values = IteratorValueAdapter<const_pointer>(src);
-    inlined_vector_internal::ConstructElements(GetAllocPtr(), dst, &values, n);
+    auto values = IteratorValueAdapter<A, ConstPointer<A>>(src);
+    ConstructElements<A>(GetAllocator(), dst, values, n);
   }
   GetSizeAndIsAllocated() = other.GetSizeAndIsAllocated();
 }
 
 template <typename T, size_t N, typename A>
 template <typename ValueAdapter>
-auto Storage<T, N, A>::Initialize(ValueAdapter values, size_type new_size)
+auto Storage<T, N, A>::Initialize(ValueAdapter values, SizeType<A> new_size)
     -> void {
   // Only callable from constructors!
   assert(!GetIsAllocated());
   assert(GetSize() == 0);
 
-  pointer construct_data;
+  Pointer<A> construct_data;
   if (new_size > GetInlinedCapacity()) {
     // Because this is only called from the `InlinedVector` constructors, it's
     // safe to take on the allocation with size `0`. If `ConstructElements(...)`
     // throws, deallocation will be automatically handled by `~Storage()`.
-    size_type new_capacity = ComputeCapacity(GetInlinedCapacity(), new_size);
-    construct_data = AllocatorTraits::allocate(*GetAllocPtr(), new_capacity);
+    SizeType<A> new_capacity = ComputeCapacity(GetInlinedCapacity(), new_size);
+    construct_data = AllocatorTraits<A>::allocate(GetAllocator(), new_capacity);
     SetAllocatedData(construct_data, new_capacity);
     SetIsAllocated();
   } else {
     construct_data = GetInlinedData();
   }
 
-  inlined_vector_internal::ConstructElements(GetAllocPtr(), construct_data,
-                                             &values, new_size);
+  ConstructElements<A>(GetAllocator(), construct_data, values, new_size);
 
   // Since the initial size was guaranteed to be `0` and the allocated bit is
   // already correct for either case, *adding* `new_size` gives us the correct
@@ -569,17 +521,18 @@
 
 template <typename T, size_t N, typename A>
 template <typename ValueAdapter>
-auto Storage<T, N, A>::Assign(ValueAdapter values, size_type new_size) -> void {
-  StorageView storage_view = MakeStorageView();
+auto Storage<T, N, A>::Assign(ValueAdapter values, SizeType<A> new_size)
+    -> void {
+  StorageView<A> storage_view = MakeStorageView();
 
-  AllocationTransaction allocation_tx(GetAllocPtr());
+  AllocationTransaction<A> allocation_tx(GetAllocator());
 
-  absl::Span<value_type> assign_loop;
-  absl::Span<value_type> construct_loop;
-  absl::Span<value_type> destroy_loop;
+  absl::Span<ValueType<A>> assign_loop;
+  absl::Span<ValueType<A>> construct_loop;
+  absl::Span<ValueType<A>> destroy_loop;
 
   if (new_size > storage_view.capacity) {
-    size_type new_capacity = ComputeCapacity(storage_view.capacity, new_size);
+    SizeType<A> new_capacity = ComputeCapacity(storage_view.capacity, new_size);
     construct_loop = {allocation_tx.Allocate(new_capacity), new_size};
     destroy_loop = {storage_view.data, storage_view.size};
   } else if (new_size > storage_view.size) {
@@ -591,18 +544,16 @@
     destroy_loop = {storage_view.data + new_size, storage_view.size - new_size};
   }
 
-  inlined_vector_internal::AssignElements(assign_loop.data(), &values,
-                                          assign_loop.size());
+  AssignElements<A>(assign_loop.data(), values, assign_loop.size());
 
-  inlined_vector_internal::ConstructElements(
-      GetAllocPtr(), construct_loop.data(), &values, construct_loop.size());
+  ConstructElements<A>(GetAllocator(), construct_loop.data(), values,
+                       construct_loop.size());
 
-  inlined_vector_internal::DestroyElements(GetAllocPtr(), destroy_loop.data(),
-                                           destroy_loop.size());
+  DestroyElements<A>(GetAllocator(), destroy_loop.data(), destroy_loop.size());
 
   if (allocation_tx.DidAllocate()) {
     DeallocateIfAllocated();
-    AcquireAllocatedData(&allocation_tx);
+    AcquireAllocatedData(allocation_tx);
     SetIsAllocated();
   }
 
@@ -611,19 +562,18 @@
 
 template <typename T, size_t N, typename A>
 template <typename ValueAdapter>
-auto Storage<T, N, A>::Resize(ValueAdapter values, size_type new_size) -> void {
-  StorageView storage_view = MakeStorageView();
+auto Storage<T, N, A>::Resize(ValueAdapter values, SizeType<A> new_size)
+    -> void {
+  StorageView<A> storage_view = MakeStorageView();
   auto* const base = storage_view.data;
-  const size_type size = storage_view.size;
-  auto* alloc = GetAllocPtr();
+  const SizeType<A> size = storage_view.size;
+  auto& alloc = GetAllocator();
   if (new_size <= size) {
     // Destroy extra old elements.
-    inlined_vector_internal::DestroyElements(alloc, base + new_size,
-                                             size - new_size);
+    DestroyElements<A>(alloc, base + new_size, size - new_size);
   } else if (new_size <= storage_view.capacity) {
     // Construct new elements in place.
-    inlined_vector_internal::ConstructElements(alloc, base + size, &values,
-                                               new_size - size);
+    ConstructElements<A>(alloc, base + size, values, new_size - size);
   } else {
     // Steps:
     //  a. Allocate new backing store.
@@ -632,21 +582,21 @@
     //  d. Destroy all elements in old backing store.
     // Use transactional wrappers for the first two steps so we can roll
     // back if necessary due to exceptions.
-    AllocationTransaction allocation_tx(alloc);
-    size_type new_capacity = ComputeCapacity(storage_view.capacity, new_size);
-    pointer new_data = allocation_tx.Allocate(new_capacity);
+    AllocationTransaction<A> allocation_tx(alloc);
+    SizeType<A> new_capacity = ComputeCapacity(storage_view.capacity, new_size);
+    Pointer<A> new_data = allocation_tx.Allocate(new_capacity);
 
-    ConstructionTransaction construction_tx(alloc);
-    construction_tx.Construct(new_data + size, &values, new_size - size);
+    ConstructionTransaction<A> construction_tx(alloc);
+    construction_tx.Construct(new_data + size, values, new_size - size);
 
-    IteratorValueAdapter<MoveIterator> move_values((MoveIterator(base)));
-    inlined_vector_internal::ConstructElements(alloc, new_data, &move_values,
-                                               size);
+    IteratorValueAdapter<A, MoveIterator<A>> move_values(
+        (MoveIterator<A>(base)));
+    ConstructElements<A>(alloc, new_data, move_values, size);
 
-    inlined_vector_internal::DestroyElements(alloc, base, size);
+    DestroyElements<A>(alloc, base, size);
     construction_tx.Commit();
     DeallocateIfAllocated();
-    AcquireAllocatedData(&allocation_tx);
+    AcquireAllocatedData(allocation_tx);
     SetIsAllocated();
   }
   SetSize(new_size);
@@ -654,76 +604,75 @@
 
 template <typename T, size_t N, typename A>
 template <typename ValueAdapter>
-auto Storage<T, N, A>::Insert(const_iterator pos, ValueAdapter values,
-                              size_type insert_count) -> iterator {
-  StorageView storage_view = MakeStorageView();
+auto Storage<T, N, A>::Insert(ConstIterator<A> pos, ValueAdapter values,
+                              SizeType<A> insert_count) -> Iterator<A> {
+  StorageView<A> storage_view = MakeStorageView();
 
-  size_type insert_index =
-      std::distance(const_iterator(storage_view.data), pos);
-  size_type insert_end_index = insert_index + insert_count;
-  size_type new_size = storage_view.size + insert_count;
+  SizeType<A> insert_index =
+      std::distance(ConstIterator<A>(storage_view.data), pos);
+  SizeType<A> insert_end_index = insert_index + insert_count;
+  SizeType<A> new_size = storage_view.size + insert_count;
 
   if (new_size > storage_view.capacity) {
-    AllocationTransaction allocation_tx(GetAllocPtr());
-    ConstructionTransaction construction_tx(GetAllocPtr());
-    ConstructionTransaction move_construciton_tx(GetAllocPtr());
+    AllocationTransaction<A> allocation_tx(GetAllocator());
+    ConstructionTransaction<A> construction_tx(GetAllocator());
+    ConstructionTransaction<A> move_construction_tx(GetAllocator());
 
-    IteratorValueAdapter<MoveIterator> move_values(
-        MoveIterator(storage_view.data));
+    IteratorValueAdapter<A, MoveIterator<A>> move_values(
+        MoveIterator<A>(storage_view.data));
 
-    size_type new_capacity = ComputeCapacity(storage_view.capacity, new_size);
-    pointer new_data = allocation_tx.Allocate(new_capacity);
+    SizeType<A> new_capacity = ComputeCapacity(storage_view.capacity, new_size);
+    Pointer<A> new_data = allocation_tx.Allocate(new_capacity);
 
-    construction_tx.Construct(new_data + insert_index, &values, insert_count);
+    construction_tx.Construct(new_data + insert_index, values, insert_count);
 
-    move_construciton_tx.Construct(new_data, &move_values, insert_index);
+    move_construction_tx.Construct(new_data, move_values, insert_index);
 
-    inlined_vector_internal::ConstructElements(
-        GetAllocPtr(), new_data + insert_end_index, &move_values,
-        storage_view.size - insert_index);
+    ConstructElements<A>(GetAllocator(), new_data + insert_end_index,
+                         move_values, storage_view.size - insert_index);
 
-    inlined_vector_internal::DestroyElements(GetAllocPtr(), storage_view.data,
-                                             storage_view.size);
+    DestroyElements<A>(GetAllocator(), storage_view.data, storage_view.size);
 
     construction_tx.Commit();
-    move_construciton_tx.Commit();
+    move_construction_tx.Commit();
     DeallocateIfAllocated();
-    AcquireAllocatedData(&allocation_tx);
+    AcquireAllocatedData(allocation_tx);
 
     SetAllocatedSize(new_size);
-    return iterator(new_data + insert_index);
+    return Iterator<A>(new_data + insert_index);
   } else {
-    size_type move_construction_destination_index =
+    SizeType<A> move_construction_destination_index =
         (std::max)(insert_end_index, storage_view.size);
 
-    ConstructionTransaction move_construction_tx(GetAllocPtr());
+    ConstructionTransaction<A> move_construction_tx(GetAllocator());
 
-    IteratorValueAdapter<MoveIterator> move_construction_values(
-        MoveIterator(storage_view.data +
-                     (move_construction_destination_index - insert_count)));
-    absl::Span<value_type> move_construction = {
+    IteratorValueAdapter<A, MoveIterator<A>> move_construction_values(
+        MoveIterator<A>(storage_view.data +
+                        (move_construction_destination_index - insert_count)));
+    absl::Span<ValueType<A>> move_construction = {
         storage_view.data + move_construction_destination_index,
         new_size - move_construction_destination_index};
 
-    pointer move_assignment_values = storage_view.data + insert_index;
-    absl::Span<value_type> move_assignment = {
+    Pointer<A> move_assignment_values = storage_view.data + insert_index;
+    absl::Span<ValueType<A>> move_assignment = {
         storage_view.data + insert_end_index,
         move_construction_destination_index - insert_end_index};
 
-    absl::Span<value_type> insert_assignment = {move_assignment_values,
-                                                move_construction.size()};
+    absl::Span<ValueType<A>> insert_assignment = {move_assignment_values,
+                                                  move_construction.size()};
 
-    absl::Span<value_type> insert_construction = {
+    absl::Span<ValueType<A>> insert_construction = {
         insert_assignment.data() + insert_assignment.size(),
         insert_count - insert_assignment.size()};
 
     move_construction_tx.Construct(move_construction.data(),
-                                   &move_construction_values,
+                                   move_construction_values,
                                    move_construction.size());
 
-    for (pointer destination = move_assignment.data() + move_assignment.size(),
-                 last_destination = move_assignment.data(),
-                 source = move_assignment_values + move_assignment.size();
+    for (Pointer<A>
+             destination = move_assignment.data() + move_assignment.size(),
+             last_destination = move_assignment.data(),
+             source = move_assignment_values + move_assignment.size();
          ;) {
       --destination;
       --source;
@@ -731,30 +680,29 @@
       *destination = std::move(*source);
     }
 
-    inlined_vector_internal::AssignElements(insert_assignment.data(), &values,
-                                            insert_assignment.size());
+    AssignElements<A>(insert_assignment.data(), values,
+                      insert_assignment.size());
 
-    inlined_vector_internal::ConstructElements(
-        GetAllocPtr(), insert_construction.data(), &values,
-        insert_construction.size());
+    ConstructElements<A>(GetAllocator(), insert_construction.data(), values,
+                         insert_construction.size());
 
     move_construction_tx.Commit();
 
     AddSize(insert_count);
-    return iterator(storage_view.data + insert_index);
+    return Iterator<A>(storage_view.data + insert_index);
   }
 }
 
 template <typename T, size_t N, typename A>
 template <typename... Args>
-auto Storage<T, N, A>::EmplaceBack(Args&&... args) -> reference {
-  StorageView storage_view = MakeStorageView();
+auto Storage<T, N, A>::EmplaceBack(Args&&... args) -> Reference<A> {
+  StorageView<A> storage_view = MakeStorageView();
   const auto n = storage_view.size;
   if (ABSL_PREDICT_TRUE(n != storage_view.capacity)) {
     // Fast path; new element fits.
-    pointer last_ptr = storage_view.data + n;
-    AllocatorTraits::construct(*GetAllocPtr(), last_ptr,
-                               std::forward<Args>(args)...);
+    Pointer<A> last_ptr = storage_view.data + n;
+    AllocatorTraits<A>::construct(GetAllocator(), last_ptr,
+                                  std::forward<Args>(args)...);
     AddSize(1);
     return *last_ptr;
   }
@@ -764,87 +712,83 @@
 
 template <typename T, size_t N, typename A>
 template <typename... Args>
-auto Storage<T, N, A>::EmplaceBackSlow(Args&&... args) -> reference {
-  StorageView storage_view = MakeStorageView();
-  AllocationTransaction allocation_tx(GetAllocPtr());
-  IteratorValueAdapter<MoveIterator> move_values(
-      MoveIterator(storage_view.data));
-  size_type new_capacity = NextCapacity(storage_view.capacity);
-  pointer construct_data = allocation_tx.Allocate(new_capacity);
-  pointer last_ptr = construct_data + storage_view.size;
+auto Storage<T, N, A>::EmplaceBackSlow(Args&&... args) -> Reference<A> {
+  StorageView<A> storage_view = MakeStorageView();
+  AllocationTransaction<A> allocation_tx(GetAllocator());
+  IteratorValueAdapter<A, MoveIterator<A>> move_values(
+      MoveIterator<A>(storage_view.data));
+  SizeType<A> new_capacity = NextCapacity(storage_view.capacity);
+  Pointer<A> construct_data = allocation_tx.Allocate(new_capacity);
+  Pointer<A> last_ptr = construct_data + storage_view.size;
 
   // Construct new element.
-  AllocatorTraits::construct(*GetAllocPtr(), last_ptr,
-                             std::forward<Args>(args)...);
+  AllocatorTraits<A>::construct(GetAllocator(), last_ptr,
+                                std::forward<Args>(args)...);
   // Move elements from old backing store to new backing store.
   ABSL_INTERNAL_TRY {
-    inlined_vector_internal::ConstructElements(
-        GetAllocPtr(), allocation_tx.GetData(), &move_values,
-        storage_view.size);
+    ConstructElements<A>(GetAllocator(), allocation_tx.GetData(), move_values,
+                         storage_view.size);
   }
   ABSL_INTERNAL_CATCH_ANY {
-    AllocatorTraits::destroy(*GetAllocPtr(), last_ptr);
+    AllocatorTraits<A>::destroy(GetAllocator(), last_ptr);
     ABSL_INTERNAL_RETHROW;
   }
   // Destroy elements in old backing store.
-  inlined_vector_internal::DestroyElements(GetAllocPtr(), storage_view.data,
-                                           storage_view.size);
+  DestroyElements<A>(GetAllocator(), storage_view.data, storage_view.size);
 
   DeallocateIfAllocated();
-  AcquireAllocatedData(&allocation_tx);
+  AcquireAllocatedData(allocation_tx);
   SetIsAllocated();
   AddSize(1);
   return *last_ptr;
 }
 
 template <typename T, size_t N, typename A>
-auto Storage<T, N, A>::Erase(const_iterator from, const_iterator to)
-    -> iterator {
-  StorageView storage_view = MakeStorageView();
+auto Storage<T, N, A>::Erase(ConstIterator<A> from, ConstIterator<A> to)
+    -> Iterator<A> {
+  StorageView<A> storage_view = MakeStorageView();
 
-  size_type erase_size = std::distance(from, to);
-  size_type erase_index =
-      std::distance(const_iterator(storage_view.data), from);
-  size_type erase_end_index = erase_index + erase_size;
+  SizeType<A> erase_size = std::distance(from, to);
+  SizeType<A> erase_index =
+      std::distance(ConstIterator<A>(storage_view.data), from);
+  SizeType<A> erase_end_index = erase_index + erase_size;
 
-  IteratorValueAdapter<MoveIterator> move_values(
-      MoveIterator(storage_view.data + erase_end_index));
+  IteratorValueAdapter<A, MoveIterator<A>> move_values(
+      MoveIterator<A>(storage_view.data + erase_end_index));
 
-  inlined_vector_internal::AssignElements(storage_view.data + erase_index,
-                                          &move_values,
-                                          storage_view.size - erase_end_index);
+  AssignElements<A>(storage_view.data + erase_index, move_values,
+                    storage_view.size - erase_end_index);
 
-  inlined_vector_internal::DestroyElements(
-      GetAllocPtr(), storage_view.data + (storage_view.size - erase_size),
-      erase_size);
+  DestroyElements<A>(GetAllocator(),
+                     storage_view.data + (storage_view.size - erase_size),
+                     erase_size);
 
   SubtractSize(erase_size);
-  return iterator(storage_view.data + erase_index);
+  return Iterator<A>(storage_view.data + erase_index);
 }
 
 template <typename T, size_t N, typename A>
-auto Storage<T, N, A>::Reserve(size_type requested_capacity) -> void {
-  StorageView storage_view = MakeStorageView();
+auto Storage<T, N, A>::Reserve(SizeType<A> requested_capacity) -> void {
+  StorageView<A> storage_view = MakeStorageView();
 
   if (ABSL_PREDICT_FALSE(requested_capacity <= storage_view.capacity)) return;
 
-  AllocationTransaction allocation_tx(GetAllocPtr());
+  AllocationTransaction<A> allocation_tx(GetAllocator());
 
-  IteratorValueAdapter<MoveIterator> move_values(
-      MoveIterator(storage_view.data));
+  IteratorValueAdapter<A, MoveIterator<A>> move_values(
+      MoveIterator<A>(storage_view.data));
 
-  size_type new_capacity =
+  SizeType<A> new_capacity =
       ComputeCapacity(storage_view.capacity, requested_capacity);
-  pointer new_data = allocation_tx.Allocate(new_capacity);
+  Pointer<A> new_data = allocation_tx.Allocate(new_capacity);
 
-  inlined_vector_internal::ConstructElements(GetAllocPtr(), new_data,
-                                             &move_values, storage_view.size);
+  ConstructElements<A>(GetAllocator(), new_data, move_values,
+                       storage_view.size);
 
-  inlined_vector_internal::DestroyElements(GetAllocPtr(), storage_view.data,
-                                           storage_view.size);
+  DestroyElements<A>(GetAllocator(), storage_view.data, storage_view.size);
 
   DeallocateIfAllocated();
-  AcquireAllocatedData(&allocation_tx);
+  AcquireAllocatedData(allocation_tx);
   SetIsAllocated();
 }
 
@@ -853,41 +797,40 @@
   // May only be called on allocated instances!
   assert(GetIsAllocated());
 
-  StorageView storage_view{GetAllocatedData(), GetSize(),
-                           GetAllocatedCapacity()};
+  StorageView<A> storage_view{GetAllocatedData(), GetSize(),
+                              GetAllocatedCapacity()};
 
   if (ABSL_PREDICT_FALSE(storage_view.size == storage_view.capacity)) return;
 
-  AllocationTransaction allocation_tx(GetAllocPtr());
+  AllocationTransaction<A> allocation_tx(GetAllocator());
 
-  IteratorValueAdapter<MoveIterator> move_values(
-      MoveIterator(storage_view.data));
+  IteratorValueAdapter<A, MoveIterator<A>> move_values(
+      MoveIterator<A>(storage_view.data));
 
-  pointer construct_data;
+  Pointer<A> construct_data;
   if (storage_view.size > GetInlinedCapacity()) {
-    size_type new_capacity = storage_view.size;
+    SizeType<A> new_capacity = storage_view.size;
     construct_data = allocation_tx.Allocate(new_capacity);
   } else {
     construct_data = GetInlinedData();
   }
 
   ABSL_INTERNAL_TRY {
-    inlined_vector_internal::ConstructElements(GetAllocPtr(), construct_data,
-                                               &move_values, storage_view.size);
+    ConstructElements<A>(GetAllocator(), construct_data, move_values,
+                         storage_view.size);
   }
   ABSL_INTERNAL_CATCH_ANY {
     SetAllocatedData(storage_view.data, storage_view.capacity);
     ABSL_INTERNAL_RETHROW;
   }
 
-  inlined_vector_internal::DestroyElements(GetAllocPtr(), storage_view.data,
-                                           storage_view.size);
+  DestroyElements<A>(GetAllocator(), storage_view.data, storage_view.size);
 
-  AllocatorTraits::deallocate(*GetAllocPtr(), storage_view.data,
-                              storage_view.capacity);
+  AllocatorTraits<A>::deallocate(GetAllocator(), storage_view.data,
+                                 storage_view.capacity);
 
   if (allocation_tx.DidAllocate()) {
-    AcquireAllocatedData(&allocation_tx);
+    AcquireAllocatedData(allocation_tx);
   } else {
     UnsetIsAllocated();
   }
@@ -905,38 +848,37 @@
     Storage* large_ptr = other_storage_ptr;
     if (small_ptr->GetSize() > large_ptr->GetSize()) swap(small_ptr, large_ptr);
 
-    for (size_type i = 0; i < small_ptr->GetSize(); ++i) {
+    for (SizeType<A> i = 0; i < small_ptr->GetSize(); ++i) {
       swap(small_ptr->GetInlinedData()[i], large_ptr->GetInlinedData()[i]);
     }
 
-    IteratorValueAdapter<MoveIterator> move_values(
-        MoveIterator(large_ptr->GetInlinedData() + small_ptr->GetSize()));
+    IteratorValueAdapter<A, MoveIterator<A>> move_values(
+        MoveIterator<A>(large_ptr->GetInlinedData() + small_ptr->GetSize()));
 
-    inlined_vector_internal::ConstructElements(
-        large_ptr->GetAllocPtr(),
-        small_ptr->GetInlinedData() + small_ptr->GetSize(), &move_values,
-        large_ptr->GetSize() - small_ptr->GetSize());
+    ConstructElements<A>(large_ptr->GetAllocator(),
+                         small_ptr->GetInlinedData() + small_ptr->GetSize(),
+                         move_values,
+                         large_ptr->GetSize() - small_ptr->GetSize());
 
-    inlined_vector_internal::DestroyElements(
-        large_ptr->GetAllocPtr(),
-        large_ptr->GetInlinedData() + small_ptr->GetSize(),
-        large_ptr->GetSize() - small_ptr->GetSize());
+    DestroyElements<A>(large_ptr->GetAllocator(),
+                       large_ptr->GetInlinedData() + small_ptr->GetSize(),
+                       large_ptr->GetSize() - small_ptr->GetSize());
   } else {
     Storage* allocated_ptr = this;
     Storage* inlined_ptr = other_storage_ptr;
     if (!allocated_ptr->GetIsAllocated()) swap(allocated_ptr, inlined_ptr);
 
-    StorageView allocated_storage_view{allocated_ptr->GetAllocatedData(),
-                                       allocated_ptr->GetSize(),
-                                       allocated_ptr->GetAllocatedCapacity()};
+    StorageView<A> allocated_storage_view{
+        allocated_ptr->GetAllocatedData(), allocated_ptr->GetSize(),
+        allocated_ptr->GetAllocatedCapacity()};
 
-    IteratorValueAdapter<MoveIterator> move_values(
-        MoveIterator(inlined_ptr->GetInlinedData()));
+    IteratorValueAdapter<A, MoveIterator<A>> move_values(
+        MoveIterator<A>(inlined_ptr->GetInlinedData()));
 
     ABSL_INTERNAL_TRY {
-      inlined_vector_internal::ConstructElements(
-          inlined_ptr->GetAllocPtr(), allocated_ptr->GetInlinedData(),
-          &move_values, inlined_ptr->GetSize());
+      ConstructElements<A>(inlined_ptr->GetAllocator(),
+                           allocated_ptr->GetInlinedData(), move_values,
+                           inlined_ptr->GetSize());
     }
     ABSL_INTERNAL_CATCH_ANY {
       allocated_ptr->SetAllocatedData(allocated_storage_view.data,
@@ -944,16 +886,15 @@
       ABSL_INTERNAL_RETHROW;
     }
 
-    inlined_vector_internal::DestroyElements(inlined_ptr->GetAllocPtr(),
-                                             inlined_ptr->GetInlinedData(),
-                                             inlined_ptr->GetSize());
+    DestroyElements<A>(inlined_ptr->GetAllocator(),
+                       inlined_ptr->GetInlinedData(), inlined_ptr->GetSize());
 
     inlined_ptr->SetAllocatedData(allocated_storage_view.data,
                                   allocated_storage_view.capacity);
   }
 
   swap(GetSizeAndIsAllocated(), other_storage_ptr->GetSizeAndIsAllocated());
-  swap(*GetAllocPtr(), *other_storage_ptr->GetAllocPtr());
+  swap(GetAllocator(), other_storage_ptr->GetAllocator());
 }
 
 // End ignore "array-bounds" and "maybe-uninitialized"
diff --git a/third_party/abseil-cpp/absl/container/internal/raw_hash_set.cc b/third_party/abseil-cpp/absl/container/internal/raw_hash_set.cc
index f5a9ce6..687bcb8 100644
--- a/third_party/abseil-cpp/absl/container/internal/raw_hash_set.cc
+++ b/third_party/abseil-cpp/absl/container/internal/raw_hash_set.cc
@@ -23,6 +23,12 @@
 ABSL_NAMESPACE_BEGIN
 namespace container_internal {
 
+alignas(16) ABSL_CONST_INIT ABSL_DLL const ctrl_t kEmptyGroup[16] = {
+    ctrl_t::kSentinel, ctrl_t::kEmpty, ctrl_t::kEmpty, ctrl_t::kEmpty,
+    ctrl_t::kEmpty,    ctrl_t::kEmpty, ctrl_t::kEmpty, ctrl_t::kEmpty,
+    ctrl_t::kEmpty,    ctrl_t::kEmpty, ctrl_t::kEmpty, ctrl_t::kEmpty,
+    ctrl_t::kEmpty,    ctrl_t::kEmpty, ctrl_t::kEmpty, ctrl_t::kEmpty};
+
 constexpr size_t Group::kWidth;
 
 // Returns "random" seed.
@@ -37,24 +43,24 @@
   return value ^ static_cast<size_t>(reinterpret_cast<uintptr_t>(&counter));
 }
 
-bool ShouldInsertBackwards(size_t hash, ctrl_t* ctrl) {
+bool ShouldInsertBackwards(size_t hash, const ctrl_t* ctrl) {
   // To avoid problems with weak hashes and single bit tests, we use % 13.
   // TODO(kfm,sbenza): revisit after we do unconditional mixing
   return (H1(hash, ctrl) ^ RandomSeed()) % 13 > 6;
 }
 
-void ConvertDeletedToEmptyAndFullToDeleted(
-    ctrl_t* ctrl, size_t capacity) {
-  assert(ctrl[capacity] == kSentinel);
+void ConvertDeletedToEmptyAndFullToDeleted(ctrl_t* ctrl, size_t capacity) {
+  assert(ctrl[capacity] == ctrl_t::kSentinel);
   assert(IsValidCapacity(capacity));
   for (ctrl_t* pos = ctrl; pos < ctrl + capacity; pos += Group::kWidth) {
     Group{pos}.ConvertSpecialToEmptyAndFullToDeleted(pos);
   }
   // Copy the cloned ctrl bytes.
   std::memcpy(ctrl + capacity + 1, ctrl, NumClonedBytes());
-  ctrl[capacity] = kSentinel;
+  ctrl[capacity] = ctrl_t::kSentinel;
 }
-
+// Extern template instantiotion for inline function.
+template FindInfo find_first_non_full(const ctrl_t*, size_t, size_t);
 
 }  // namespace container_internal
 ABSL_NAMESPACE_END
diff --git a/third_party/abseil-cpp/absl/container/internal/raw_hash_set.h b/third_party/abseil-cpp/absl/container/internal/raw_hash_set.h
index a9034b0..f4919ce 100644
--- a/third_party/abseil-cpp/absl/container/internal/raw_hash_set.h
+++ b/third_party/abseil-cpp/absl/container/internal/raw_hash_set.h
@@ -112,7 +112,6 @@
 #include "absl/container/internal/hashtable_debug_hooks.h"
 #include "absl/container/internal/hashtablez_sampler.h"
 #include "absl/container/internal/have_sse.h"
-#include "absl/container/internal/layout.h"
 #include "absl/memory/memory.h"
 #include "absl/meta/type_traits.h"
 #include "absl/numeric/bits.h"
@@ -252,48 +251,53 @@
   T mask_;
 };
 
-using ctrl_t = signed char;
 using h2_t = uint8_t;
 
 // The values here are selected for maximum performance. See the static asserts
-// below for details.
-enum Ctrl : ctrl_t {
+// below for details. We use an enum class so that when strict aliasing is
+// enabled, the compiler knows ctrl_t doesn't alias other types.
+enum class ctrl_t : int8_t {
   kEmpty = -128,   // 0b10000000
   kDeleted = -2,   // 0b11111110
   kSentinel = -1,  // 0b11111111
 };
 static_assert(
-    kEmpty & kDeleted & kSentinel & 0x80,
+    (static_cast<int8_t>(ctrl_t::kEmpty) &
+     static_cast<int8_t>(ctrl_t::kDeleted) &
+     static_cast<int8_t>(ctrl_t::kSentinel) & 0x80) != 0,
     "Special markers need to have the MSB to make checking for them efficient");
-static_assert(kEmpty < kSentinel && kDeleted < kSentinel,
-              "kEmpty and kDeleted must be smaller than kSentinel to make the "
-              "SIMD test of IsEmptyOrDeleted() efficient");
-static_assert(kSentinel == -1,
-              "kSentinel must be -1 to elide loading it from memory into SIMD "
-              "registers (pcmpeqd xmm, xmm)");
-static_assert(kEmpty == -128,
-              "kEmpty must be -128 to make the SIMD check for its "
+static_assert(
+    ctrl_t::kEmpty < ctrl_t::kSentinel && ctrl_t::kDeleted < ctrl_t::kSentinel,
+    "ctrl_t::kEmpty and ctrl_t::kDeleted must be smaller than "
+    "ctrl_t::kSentinel to make the SIMD test of IsEmptyOrDeleted() efficient");
+static_assert(
+    ctrl_t::kSentinel == static_cast<ctrl_t>(-1),
+    "ctrl_t::kSentinel must be -1 to elide loading it from memory into SIMD "
+    "registers (pcmpeqd xmm, xmm)");
+static_assert(ctrl_t::kEmpty == static_cast<ctrl_t>(-128),
+              "ctrl_t::kEmpty must be -128 to make the SIMD check for its "
               "existence efficient (psignb xmm, xmm)");
-static_assert(~kEmpty & ~kDeleted & kSentinel & 0x7F,
-              "kEmpty and kDeleted must share an unset bit that is not shared "
-              "by kSentinel to make the scalar test for MatchEmptyOrDeleted() "
-              "efficient");
-static_assert(kDeleted == -2,
-              "kDeleted must be -2 to make the implementation of "
+static_assert(
+    (~static_cast<int8_t>(ctrl_t::kEmpty) &
+     ~static_cast<int8_t>(ctrl_t::kDeleted) &
+     static_cast<int8_t>(ctrl_t::kSentinel) & 0x7F) != 0,
+    "ctrl_t::kEmpty and ctrl_t::kDeleted must share an unset bit that is not "
+    "shared by ctrl_t::kSentinel to make the scalar test for "
+    "MatchEmptyOrDeleted() efficient");
+static_assert(ctrl_t::kDeleted == static_cast<ctrl_t>(-2),
+              "ctrl_t::kDeleted must be -2 to make the implementation of "
               "ConvertSpecialToEmptyAndFullToDeleted efficient");
 
 // A single block of empty control bytes for tables without any slots allocated.
 // This enables removing a branch in the hot path of find().
+ABSL_DLL extern const ctrl_t kEmptyGroup[16];
 inline ctrl_t* EmptyGroup() {
-  alignas(16) static constexpr ctrl_t empty_group[] = {
-      kSentinel, kEmpty, kEmpty, kEmpty, kEmpty, kEmpty, kEmpty, kEmpty,
-      kEmpty,    kEmpty, kEmpty, kEmpty, kEmpty, kEmpty, kEmpty, kEmpty};
-  return const_cast<ctrl_t*>(empty_group);
+  return const_cast<ctrl_t*>(kEmptyGroup);
 }
 
 // Mixes a randomly generated per-process seed with `hash` and `ctrl` to
 // randomize insertion order within groups.
-bool ShouldInsertBackwards(size_t hash, ctrl_t* ctrl);
+bool ShouldInsertBackwards(size_t hash, const ctrl_t* ctrl);
 
 // Returns a hash seed.
 //
@@ -309,12 +313,12 @@
 inline size_t H1(size_t hash, const ctrl_t* ctrl) {
   return (hash >> 7) ^ HashSeed(ctrl);
 }
-inline ctrl_t H2(size_t hash) { return hash & 0x7F; }
+inline h2_t H2(size_t hash) { return hash & 0x7F; }
 
-inline bool IsEmpty(ctrl_t c) { return c == kEmpty; }
-inline bool IsFull(ctrl_t c) { return c >= 0; }
-inline bool IsDeleted(ctrl_t c) { return c == kDeleted; }
-inline bool IsEmptyOrDeleted(ctrl_t c) { return c < kSentinel; }
+inline bool IsEmpty(ctrl_t c) { return c == ctrl_t::kEmpty; }
+inline bool IsFull(ctrl_t c) { return c >= static_cast<ctrl_t>(0); }
+inline bool IsDeleted(ctrl_t c) { return c == ctrl_t::kDeleted; }
+inline bool IsEmptyOrDeleted(ctrl_t c) { return c < ctrl_t::kSentinel; }
 
 #if ABSL_INTERNAL_RAW_HASH_SET_HAVE_SSE2
 
@@ -351,24 +355,24 @@
   // Returns a bitmask representing the positions of empty slots.
   BitMask<uint32_t, kWidth> MatchEmpty() const {
 #if ABSL_INTERNAL_RAW_HASH_SET_HAVE_SSSE3
-    // This only works because kEmpty is -128.
+    // This only works because ctrl_t::kEmpty is -128.
     return BitMask<uint32_t, kWidth>(
         _mm_movemask_epi8(_mm_sign_epi8(ctrl, ctrl)));
 #else
-    return Match(static_cast<h2_t>(kEmpty));
+    return Match(static_cast<h2_t>(ctrl_t::kEmpty));
 #endif
   }
 
   // Returns a bitmask representing the positions of empty or deleted slots.
   BitMask<uint32_t, kWidth> MatchEmptyOrDeleted() const {
-    auto special = _mm_set1_epi8(kSentinel);
+    auto special = _mm_set1_epi8(static_cast<int8_t>(ctrl_t::kSentinel));
     return BitMask<uint32_t, kWidth>(
         _mm_movemask_epi8(_mm_cmpgt_epi8_fixed(special, ctrl)));
   }
 
   // Returns the number of trailing empty or deleted elements in the group.
   uint32_t CountLeadingEmptyOrDeleted() const {
-    auto special = _mm_set1_epi8(kSentinel);
+    auto special = _mm_set1_epi8(static_cast<int8_t>(ctrl_t::kSentinel));
     return TrailingZeros(static_cast<uint32_t>(
         _mm_movemask_epi8(_mm_cmpgt_epi8_fixed(special, ctrl)) + 1));
   }
@@ -403,7 +407,7 @@
     //
     // Caveat: there are false positives but:
     // - they only occur if there is a real match
-    // - they never occur on kEmpty, kDeleted, kSentinel
+    // - they never occur on ctrl_t::kEmpty, ctrl_t::kDeleted, ctrl_t::kSentinel
     // - they will be handled gracefully by subsequent checks in code
     //
     // Example:
@@ -459,8 +463,8 @@
 
 // PRECONDITION:
 //   IsValidCapacity(capacity)
-//   ctrl[capacity] == kSentinel
-//   ctrl[i] != kSentinel for all i < capacity
+//   ctrl[capacity] == ctrl_t::kSentinel
+//   ctrl[i] != ctrl_t::kSentinel for all i < capacity
 // Applies mapping for every byte in ctrl:
 //   DELETED -> EMPTY
 //   EMPTY -> EMPTY
@@ -545,27 +549,29 @@
 //  This is important to make 1 a valid capacity.
 //
 //  - In small mode only the first `capacity()` control bytes after the
-//  sentinel are valid. The rest contain dummy kEmpty values that do not
+//  sentinel are valid. The rest contain dummy ctrl_t::kEmpty values that do not
 //  represent a real slot. This is important to take into account on
 //  find_first_non_full(), where we never try ShouldInsertBackwards() for
 //  small tables.
 inline bool is_small(size_t capacity) { return capacity < Group::kWidth - 1; }
 
-inline probe_seq<Group::kWidth> probe(ctrl_t* ctrl, size_t hash,
+inline probe_seq<Group::kWidth> probe(const ctrl_t* ctrl, size_t hash,
                                       size_t capacity) {
   return probe_seq<Group::kWidth>(H1(hash, ctrl), capacity);
 }
 
 // Probes the raw_hash_set with the probe sequence for hash and returns the
 // pointer to the first empty or deleted slot.
-// NOTE: this function must work with tables having both kEmpty and kDelete
-// in one group. Such tables appears during drop_deletes_without_resize.
+// NOTE: this function must work with tables having both ctrl_t::kEmpty and
+// ctrl_t::kDeleted in one group. Such tables appears during
+// drop_deletes_without_resize.
 //
 // This function is very useful when insertions happen and:
 // - the input is already a set
 // - there are enough slots
 // - the element with the hash is not in the table
-inline FindInfo find_first_non_full(ctrl_t* ctrl, size_t hash,
+template <typename = void>
+inline FindInfo find_first_non_full(const ctrl_t* ctrl, size_t hash,
                                     size_t capacity) {
   auto seq = probe(ctrl, hash, capacity);
   while (true) {
@@ -588,6 +594,56 @@
   }
 }
 
+// Extern template for inline function keep possibility of inlining.
+// When compiler decided to not inline, no symbols will be added to the
+// corresponding translation unit.
+extern template FindInfo find_first_non_full(const ctrl_t*, size_t, size_t);
+
+// Reset all ctrl bytes back to ctrl_t::kEmpty, except the sentinel.
+inline void ResetCtrl(size_t capacity, ctrl_t* ctrl, const void* slot,
+                      size_t slot_size) {
+  std::memset(ctrl, static_cast<int8_t>(ctrl_t::kEmpty),
+              capacity + 1 + NumClonedBytes());
+  ctrl[capacity] = ctrl_t::kSentinel;
+  SanitizerPoisonMemoryRegion(slot, slot_size * capacity);
+}
+
+// Sets the control byte, and if `i < NumClonedBytes()`, set the cloned byte
+// at the end too.
+inline void SetCtrl(size_t i, ctrl_t h, size_t capacity, ctrl_t* ctrl,
+                    const void* slot, size_t slot_size) {
+  assert(i < capacity);
+
+  auto* slot_i = static_cast<const char*>(slot) + i * slot_size;
+  if (IsFull(h)) {
+    SanitizerUnpoisonMemoryRegion(slot_i, slot_size);
+  } else {
+    SanitizerPoisonMemoryRegion(slot_i, slot_size);
+  }
+
+  ctrl[i] = h;
+  ctrl[((i - NumClonedBytes()) & capacity) + (NumClonedBytes() & capacity)] = h;
+}
+
+inline void SetCtrl(size_t i, h2_t h, size_t capacity, ctrl_t* ctrl,
+                    const void* slot, size_t slot_size) {
+  SetCtrl(i, static_cast<ctrl_t>(h), capacity, ctrl, slot, slot_size);
+}
+
+// The allocated block consists of `capacity + 1 + NumClonedBytes()` control
+// bytes followed by `capacity` slots, which must be aligned to `slot_align`.
+// SlotOffset returns the offset of the slots into the allocated block.
+inline size_t SlotOffset(size_t capacity, size_t slot_align) {
+  assert(IsValidCapacity(capacity));
+  const size_t num_control_bytes = capacity + 1 + NumClonedBytes();
+  return (num_control_bytes + slot_align - 1) & (~slot_align + 1);
+}
+
+// Returns the size of the allocated block. See also above comment.
+inline size_t AllocSize(size_t capacity, size_t slot_size, size_t slot_align) {
+  return SlotOffset(capacity, slot_align) + capacity * slot_size;
+}
+
 // Policy: a policy defines how to perform different operations on
 // the slots of the hashtable (see hash_policy_traits.h for the full interface
 // of policy).
@@ -644,15 +700,6 @@
   auto KeyTypeCanBeHashed(const Hash& h, const key_type& k) -> decltype(h(k));
   auto KeyTypeCanBeEq(const Eq& eq, const key_type& k) -> decltype(eq(k, k));
 
-  using Layout = absl::container_internal::Layout<ctrl_t, slot_type>;
-
-  static Layout MakeLayout(size_t capacity) {
-    assert(IsValidCapacity(capacity));
-    // The extra control bytes are for 1 sentinel byte followed by
-    // NumClonedBytes() bytes that are cloned from the beginning.
-    return Layout(capacity + 1 + NumClonedBytes(), capacity);
-  }
-
   using AllocTraits = absl::allocator_traits<allocator_type>;
   using SlotAlloc = typename absl::allocator_traits<
       allocator_type>::template rebind_alloc<slot_type>;
@@ -755,7 +802,7 @@
         ctrl_ += shift;
         slot_ += shift;
       }
-      if (ABSL_PREDICT_FALSE(*ctrl_ == kSentinel)) ctrl_ = nullptr;
+      if (ABSL_PREDICT_FALSE(*ctrl_ == ctrl_t::kSentinel)) ctrl_ = nullptr;
     }
 
     ctrl_t* ctrl_ = nullptr;
@@ -925,7 +972,8 @@
     for (const auto& v : that) {
       const size_t hash = PolicyTraits::apply(HashElement{hash_ref()}, v);
       auto target = find_first_non_full(ctrl_, hash, capacity_);
-      set_ctrl(target.offset, H2(hash));
+      SetCtrl(target.offset, H2(hash), capacity_, ctrl_, slots_,
+              sizeof(slot_type));
       emplace_at(target.offset, v);
       infoz().RecordInsert(hash, target.probe_length);
     }
@@ -1028,7 +1076,7 @@
         }
       }
       size_ = 0;
-      reset_ctrl();
+      ResetCtrl(capacity_, ctrl_, slots_, sizeof(slot_type));
       reset_growth_left();
     }
     assert(empty());
@@ -1549,7 +1597,8 @@
         static_cast<size_t>(empty_after.TrailingZeros() +
                             empty_before.LeadingZeros()) < Group::kWidth;
 
-    set_ctrl(index, was_never_full ? kEmpty : kDeleted);
+    SetCtrl(index, was_never_full ? ctrl_t::kEmpty : ctrl_t::kDeleted,
+            capacity_, ctrl_, slots_, sizeof(slot_type));
     growth_left() += was_never_full;
     infoz().RecordErase();
   }
@@ -1571,12 +1620,13 @@
       infoz() = Sample();
     }
 
-    auto layout = MakeLayout(capacity_);
-    char* mem = static_cast<char*>(
-        Allocate<Layout::Alignment()>(&alloc_ref(), layout.AllocSize()));
-    ctrl_ = layout.template Pointer<0>(mem);
-    slots_ = layout.template Pointer<1>(mem);
-    reset_ctrl();
+    char* mem = static_cast<char*>(Allocate<alignof(slot_type)>(
+        &alloc_ref(),
+        AllocSize(capacity_, sizeof(slot_type), alignof(slot_type))));
+    ctrl_ = reinterpret_cast<ctrl_t*>(mem);
+    slots_ = reinterpret_cast<slot_type*>(
+        mem + SlotOffset(capacity_, alignof(slot_type)));
+    ResetCtrl(capacity_, ctrl_, slots_, sizeof(slot_type));
     reset_growth_left();
     infoz().RecordStorageChanged(size_, capacity_);
   }
@@ -1588,10 +1638,11 @@
         PolicyTraits::destroy(&alloc_ref(), slots_ + i);
       }
     }
-    auto layout = MakeLayout(capacity_);
     // Unpoison before returning the memory to the allocator.
     SanitizerUnpoisonMemoryRegion(slots_, sizeof(slot_type) * capacity_);
-    Deallocate<Layout::Alignment()>(&alloc_ref(), ctrl_, layout.AllocSize());
+    Deallocate<alignof(slot_type)>(
+        &alloc_ref(), ctrl_,
+        AllocSize(capacity_, sizeof(slot_type), alignof(slot_type)));
     ctrl_ = EmptyGroup();
     slots_ = nullptr;
     size_ = 0;
@@ -1615,16 +1666,16 @@
         auto target = find_first_non_full(ctrl_, hash, capacity_);
         size_t new_i = target.offset;
         total_probe_length += target.probe_length;
-        set_ctrl(new_i, H2(hash));
+        SetCtrl(new_i, H2(hash), capacity_, ctrl_, slots_, sizeof(slot_type));
         PolicyTraits::transfer(&alloc_ref(), slots_ + new_i, old_slots + i);
       }
     }
     if (old_capacity) {
       SanitizerUnpoisonMemoryRegion(old_slots,
                                     sizeof(slot_type) * old_capacity);
-      auto layout = MakeLayout(old_capacity);
-      Deallocate<Layout::Alignment()>(&alloc_ref(), old_ctrl,
-                                      layout.AllocSize());
+      Deallocate<alignof(slot_type)>(
+          &alloc_ref(), old_ctrl,
+          AllocSize(old_capacity, sizeof(slot_type), alignof(slot_type)));
     }
     infoz().RecordRehash(total_probe_length);
   }
@@ -1670,19 +1721,19 @@
 
       // Element doesn't move.
       if (ABSL_PREDICT_TRUE(probe_index(new_i) == probe_index(i))) {
-        set_ctrl(i, H2(hash));
+        SetCtrl(i, H2(hash), capacity_, ctrl_, slots_, sizeof(slot_type));
         continue;
       }
       if (IsEmpty(ctrl_[new_i])) {
         // Transfer element to the empty spot.
-        // set_ctrl poisons/unpoisons the slots so we have to call it at the
+        // SetCtrl poisons/unpoisons the slots so we have to call it at the
         // right time.
-        set_ctrl(new_i, H2(hash));
+        SetCtrl(new_i, H2(hash), capacity_, ctrl_, slots_, sizeof(slot_type));
         PolicyTraits::transfer(&alloc_ref(), slots_ + new_i, slots_ + i);
-        set_ctrl(i, kEmpty);
+        SetCtrl(i, ctrl_t::kEmpty, capacity_, ctrl_, slots_, sizeof(slot_type));
       } else {
         assert(IsDeleted(ctrl_[new_i]));
-        set_ctrl(new_i, H2(hash));
+        SetCtrl(new_i, H2(hash), capacity_, ctrl_, slots_, sizeof(slot_type));
         // Until we are done rehashing, DELETED marks previously FULL slots.
         // Swap i and new_i elements.
         PolicyTraits::transfer(&alloc_ref(), slot, slots_ + i);
@@ -1698,8 +1749,50 @@
   void rehash_and_grow_if_necessary() {
     if (capacity_ == 0) {
       resize(1);
-    } else if (size() <= CapacityToGrowth(capacity()) / 2) {
+    } else if (capacity_ > Group::kWidth &&
+               // Do these calcuations in 64-bit to avoid overflow.
+               size() * uint64_t{32} <= capacity_ * uint64_t{25}) {
       // Squash DELETED without growing if there is enough capacity.
+      //
+      // Rehash in place if the current size is <= 25/32 of capacity_.
+      // Rationale for such a high factor: 1) drop_deletes_without_resize() is
+      // faster than resize, and 2) it takes quite a bit of work to add
+      // tombstones.  In the worst case, seems to take approximately 4
+      // insert/erase pairs to create a single tombstone and so if we are
+      // rehashing because of tombstones, we can afford to rehash-in-place as
+      // long as we are reclaiming at least 1/8 the capacity without doing more
+      // than 2X the work.  (Where "work" is defined to be size() for rehashing
+      // or rehashing in place, and 1 for an insert or erase.)  But rehashing in
+      // place is faster per operation than inserting or even doubling the size
+      // of the table, so we actually afford to reclaim even less space from a
+      // resize-in-place.  The decision is to rehash in place if we can reclaim
+      // at about 1/8th of the usable capacity (specifically 3/28 of the
+      // capacity) which means that the total cost of rehashing will be a small
+      // fraction of the total work.
+      //
+      // Here is output of an experiment using the BM_CacheInSteadyState
+      // benchmark running the old case (where we rehash-in-place only if we can
+      // reclaim at least 7/16*capacity_) vs. this code (which rehashes in place
+      // if we can recover 3/32*capacity_).
+      //
+      // Note that although in the worst-case number of rehashes jumped up from
+      // 15 to 190, but the number of operations per second is almost the same.
+      //
+      // Abridged output of running BM_CacheInSteadyState benchmark from
+      // raw_hash_set_benchmark.   N is the number of insert/erase operations.
+      //
+      //      | OLD (recover >= 7/16        | NEW (recover >= 3/32)
+      // size |    N/s LoadFactor NRehashes |    N/s LoadFactor NRehashes
+      //  448 | 145284       0.44        18 | 140118       0.44        19
+      //  493 | 152546       0.24        11 | 151417       0.48        28
+      //  538 | 151439       0.26        11 | 151152       0.53        38
+      //  583 | 151765       0.28        11 | 150572       0.57        50
+      //  628 | 150241       0.31        11 | 150853       0.61        66
+      //  672 | 149602       0.33        12 | 150110       0.66        90
+      //  717 | 149998       0.35        12 | 149531       0.70       129
+      //  762 | 149836       0.37        13 | 148559       0.74       190
+      //  807 | 149736       0.39        14 | 151107       0.39        14
+      //  852 | 150204       0.42        15 | 151019       0.42        15
       drop_deletes_without_resize();
     } else {
       // Otherwise grow the container.
@@ -1765,7 +1858,8 @@
     }
     ++size_;
     growth_left() -= IsEmpty(ctrl_[target.offset]);
-    set_ctrl(target.offset, H2(hash));
+    SetCtrl(target.offset, H2(hash), capacity_, ctrl_, slots_,
+            sizeof(slot_type));
     infoz().RecordInsert(hash, target.probe_length);
     return target.offset;
   }
@@ -1794,33 +1888,10 @@
  private:
   friend struct RawHashSetTestOnlyAccess;
 
-  // Reset all ctrl bytes back to kEmpty, except the sentinel.
-  void reset_ctrl() {
-    std::memset(ctrl_, kEmpty, capacity_ + Group::kWidth);
-    ctrl_[capacity_] = kSentinel;
-    SanitizerPoisonMemoryRegion(slots_, sizeof(slot_type) * capacity_);
-  }
-
   void reset_growth_left() {
     growth_left() = CapacityToGrowth(capacity()) - size_;
   }
 
-  // Sets the control byte, and if `i < Group::kWidth - 1`, set the cloned byte
-  // at the end too.
-  void set_ctrl(size_t i, ctrl_t h) {
-    assert(i < capacity_);
-
-    if (IsFull(h)) {
-      SanitizerUnpoisonObject(slots_ + i);
-    } else {
-      SanitizerPoisonObject(slots_ + i);
-    }
-
-    ctrl_[i] = h;
-    ctrl_[((i - NumClonedBytes()) & capacity_) +
-          (NumClonedBytes() & capacity_)] = h;
-  }
-
   size_t& growth_left() { return settings_.template get<0>(); }
 
   HashtablezInfoHandle& infoz() { return settings_.template get<1>(); }
@@ -1850,11 +1921,12 @@
 
 // Erases all elements that satisfy the predicate `pred` from the container `c`.
 template <typename P, typename H, typename E, typename A, typename Predicate>
-void EraseIf(Predicate pred, raw_hash_set<P, H, E, A>* c) {
+void EraseIf(Predicate& pred, raw_hash_set<P, H, E, A>* c) {
   for (auto it = c->begin(), last = c->end(); it != last;) {
-    auto copy_it = it++;
-    if (pred(*copy_it)) {
-      c->erase(copy_it);
+    if (pred(*it)) {
+      c->erase(it++);
+    } else {
+      ++it;
     }
   }
 }
@@ -1889,8 +1961,7 @@
   static size_t AllocatedByteSize(const Set& c) {
     size_t capacity = c.capacity_;
     if (capacity == 0) return 0;
-    auto layout = Set::MakeLayout(capacity);
-    size_t m = layout.AllocSize();
+    size_t m = AllocSize(capacity, sizeof(Slot), alignof(Slot));
 
     size_t per_slot = Traits::space_used(static_cast<const Slot*>(nullptr));
     if (per_slot != ~size_t{}) {
@@ -1908,8 +1979,8 @@
   static size_t LowerBoundAllocatedByteSize(size_t size) {
     size_t capacity = GrowthToLowerboundCapacity(size);
     if (capacity == 0) return 0;
-    auto layout = Set::MakeLayout(NormalizeCapacity(capacity));
-    size_t m = layout.AllocSize();
+    size_t m =
+        AllocSize(NormalizeCapacity(capacity), sizeof(Slot), alignof(Slot));
     size_t per_slot = Traits::space_used(static_cast<const Slot*>(nullptr));
     if (per_slot != ~size_t{}) {
       m += per_slot * size;
diff --git a/third_party/abseil-cpp/absl/container/internal/raw_hash_set_benchmark.cc b/third_party/abseil-cpp/absl/container/internal/raw_hash_set_benchmark.cc
index 977ff4c..c886d3a 100644
--- a/third_party/abseil-cpp/absl/container/internal/raw_hash_set_benchmark.cc
+++ b/third_party/abseil-cpp/absl/container/internal/raw_hash_set_benchmark.cc
@@ -315,9 +315,17 @@
 }
 BENCHMARK(BM_ReserveStringTable)->Range(128, 4096);
 
+// Like std::iota, except that ctrl_t doesn't support operator++.
+template <typename CtrlIter>
+void Iota(CtrlIter begin, CtrlIter end, int value) {
+  for (; begin != end; ++begin, ++value) {
+    *begin = static_cast<ctrl_t>(value);
+  }
+}
+
 void BM_Group_Match(benchmark::State& state) {
   std::array<ctrl_t, Group::kWidth> group;
-  std::iota(group.begin(), group.end(), -4);
+  Iota(group.begin(), group.end(), -4);
   Group g{group.data()};
   h2_t h = 1;
   for (auto _ : state) {
@@ -329,7 +337,7 @@
 
 void BM_Group_MatchEmpty(benchmark::State& state) {
   std::array<ctrl_t, Group::kWidth> group;
-  std::iota(group.begin(), group.end(), -4);
+  Iota(group.begin(), group.end(), -4);
   Group g{group.data()};
   for (auto _ : state) ::benchmark::DoNotOptimize(g.MatchEmpty());
 }
@@ -337,7 +345,7 @@
 
 void BM_Group_MatchEmptyOrDeleted(benchmark::State& state) {
   std::array<ctrl_t, Group::kWidth> group;
-  std::iota(group.begin(), group.end(), -4);
+  Iota(group.begin(), group.end(), -4);
   Group g{group.data()};
   for (auto _ : state) ::benchmark::DoNotOptimize(g.MatchEmptyOrDeleted());
 }
@@ -345,7 +353,7 @@
 
 void BM_Group_CountLeadingEmptyOrDeleted(benchmark::State& state) {
   std::array<ctrl_t, Group::kWidth> group;
-  std::iota(group.begin(), group.end(), -2);
+  Iota(group.begin(), group.end(), -2);
   Group g{group.data()};
   for (auto _ : state)
     ::benchmark::DoNotOptimize(g.CountLeadingEmptyOrDeleted());
@@ -354,7 +362,7 @@
 
 void BM_Group_MatchFirstEmptyOrDeleted(benchmark::State& state) {
   std::array<ctrl_t, Group::kWidth> group;
-  std::iota(group.begin(), group.end(), -2);
+  Iota(group.begin(), group.end(), -2);
   Group g{group.data()};
   for (auto _ : state) ::benchmark::DoNotOptimize(*g.MatchEmptyOrDeleted());
 }
@@ -363,8 +371,11 @@
 void BM_DropDeletes(benchmark::State& state) {
   constexpr size_t capacity = (1 << 20) - 1;
   std::vector<ctrl_t> ctrl(capacity + 1 + Group::kWidth);
-  ctrl[capacity] = kSentinel;
-  std::vector<ctrl_t> pattern = {kEmpty, 2, kDeleted, 2, kEmpty, 1, kDeleted};
+  ctrl[capacity] = ctrl_t::kSentinel;
+  std::vector<ctrl_t> pattern = {ctrl_t::kEmpty,   static_cast<ctrl_t>(2),
+                                 ctrl_t::kDeleted, static_cast<ctrl_t>(2),
+                                 ctrl_t::kEmpty,   static_cast<ctrl_t>(1),
+                                 ctrl_t::kDeleted};
   for (size_t i = 0; i != capacity; ++i) {
     ctrl[i] = pattern[i % pattern.size()];
   }
diff --git a/third_party/abseil-cpp/absl/container/internal/raw_hash_set_test.cc b/third_party/abseil-cpp/absl/container/internal/raw_hash_set_test.cc
index a191bff..4fb31fa 100644
--- a/third_party/abseil-cpp/absl/container/internal/raw_hash_set_test.cc
+++ b/third_party/abseil-cpp/absl/container/internal/raw_hash_set_test.cc
@@ -58,6 +58,9 @@
 using ::testing::Pair;
 using ::testing::UnorderedElementsAre;
 
+// Convenience function to static cast to ctrl_t.
+ctrl_t CtrlT(int i) { return static_cast<ctrl_t>(i); }
+
 TEST(Util, NormalizeCapacity) {
   EXPECT_EQ(1, NormalizeCapacity(0));
   EXPECT_EQ(1, NormalizeCapacity(1));
@@ -170,15 +173,19 @@
 
 TEST(Group, Match) {
   if (Group::kWidth == 16) {
-    ctrl_t group[] = {kEmpty, 1, kDeleted, 3, kEmpty, 5, kSentinel, 7,
-                      7,      5, 3,        1, 1,      1, 1,         1};
+    ctrl_t group[] = {ctrl_t::kEmpty, CtrlT(1), ctrl_t::kDeleted,  CtrlT(3),
+                      ctrl_t::kEmpty, CtrlT(5), ctrl_t::kSentinel, CtrlT(7),
+                      CtrlT(7),       CtrlT(5), CtrlT(3),          CtrlT(1),
+                      CtrlT(1),       CtrlT(1), CtrlT(1),          CtrlT(1)};
     EXPECT_THAT(Group{group}.Match(0), ElementsAre());
     EXPECT_THAT(Group{group}.Match(1), ElementsAre(1, 11, 12, 13, 14, 15));
     EXPECT_THAT(Group{group}.Match(3), ElementsAre(3, 10));
     EXPECT_THAT(Group{group}.Match(5), ElementsAre(5, 9));
     EXPECT_THAT(Group{group}.Match(7), ElementsAre(7, 8));
   } else if (Group::kWidth == 8) {
-    ctrl_t group[] = {kEmpty, 1, 2, kDeleted, 2, 1, kSentinel, 1};
+    ctrl_t group[] = {ctrl_t::kEmpty,    CtrlT(1), CtrlT(2),
+                      ctrl_t::kDeleted,  CtrlT(2), CtrlT(1),
+                      ctrl_t::kSentinel, CtrlT(1)};
     EXPECT_THAT(Group{group}.Match(0), ElementsAre());
     EXPECT_THAT(Group{group}.Match(1), ElementsAre(1, 5, 7));
     EXPECT_THAT(Group{group}.Match(2), ElementsAre(2, 4));
@@ -189,11 +196,15 @@
 
 TEST(Group, MatchEmpty) {
   if (Group::kWidth == 16) {
-    ctrl_t group[] = {kEmpty, 1, kDeleted, 3, kEmpty, 5, kSentinel, 7,
-                      7,      5, 3,        1, 1,      1, 1,         1};
+    ctrl_t group[] = {ctrl_t::kEmpty, CtrlT(1), ctrl_t::kDeleted,  CtrlT(3),
+                      ctrl_t::kEmpty, CtrlT(5), ctrl_t::kSentinel, CtrlT(7),
+                      CtrlT(7),       CtrlT(5), CtrlT(3),          CtrlT(1),
+                      CtrlT(1),       CtrlT(1), CtrlT(1),          CtrlT(1)};
     EXPECT_THAT(Group{group}.MatchEmpty(), ElementsAre(0, 4));
   } else if (Group::kWidth == 8) {
-    ctrl_t group[] = {kEmpty, 1, 2, kDeleted, 2, 1, kSentinel, 1};
+    ctrl_t group[] = {ctrl_t::kEmpty,    CtrlT(1), CtrlT(2),
+                      ctrl_t::kDeleted,  CtrlT(2), CtrlT(1),
+                      ctrl_t::kSentinel, CtrlT(1)};
     EXPECT_THAT(Group{group}.MatchEmpty(), ElementsAre(0));
   } else {
     FAIL() << "No test coverage for Group::kWidth==" << Group::kWidth;
@@ -202,11 +213,15 @@
 
 TEST(Group, MatchEmptyOrDeleted) {
   if (Group::kWidth == 16) {
-    ctrl_t group[] = {kEmpty, 1, kDeleted, 3, kEmpty, 5, kSentinel, 7,
-                      7,      5, 3,        1, 1,      1, 1,         1};
+    ctrl_t group[] = {ctrl_t::kEmpty, CtrlT(1), ctrl_t::kDeleted,  CtrlT(3),
+                      ctrl_t::kEmpty, CtrlT(5), ctrl_t::kSentinel, CtrlT(7),
+                      CtrlT(7),       CtrlT(5), CtrlT(3),          CtrlT(1),
+                      CtrlT(1),       CtrlT(1), CtrlT(1),          CtrlT(1)};
     EXPECT_THAT(Group{group}.MatchEmptyOrDeleted(), ElementsAre(0, 2, 4));
   } else if (Group::kWidth == 8) {
-    ctrl_t group[] = {kEmpty, 1, 2, kDeleted, 2, 1, kSentinel, 1};
+    ctrl_t group[] = {ctrl_t::kEmpty,    CtrlT(1), CtrlT(2),
+                      ctrl_t::kDeleted,  CtrlT(2), CtrlT(1),
+                      ctrl_t::kSentinel, CtrlT(1)};
     EXPECT_THAT(Group{group}.MatchEmptyOrDeleted(), ElementsAre(0, 3));
   } else {
     FAIL() << "No test coverage for Group::kWidth==" << Group::kWidth;
@@ -217,28 +232,32 @@
   constexpr size_t kCapacity = 63;
   constexpr size_t kGroupWidth = container_internal::Group::kWidth;
   std::vector<ctrl_t> ctrl(kCapacity + 1 + kGroupWidth);
-  ctrl[kCapacity] = kSentinel;
-  std::vector<ctrl_t> pattern = {kEmpty, 2, kDeleted, 2, kEmpty, 1, kDeleted};
+  ctrl[kCapacity] = ctrl_t::kSentinel;
+  std::vector<ctrl_t> pattern = {
+      ctrl_t::kEmpty, CtrlT(2), ctrl_t::kDeleted, CtrlT(2),
+      ctrl_t::kEmpty, CtrlT(1), ctrl_t::kDeleted};
   for (size_t i = 0; i != kCapacity; ++i) {
     ctrl[i] = pattern[i % pattern.size()];
     if (i < kGroupWidth - 1)
       ctrl[i + kCapacity + 1] = pattern[i % pattern.size()];
   }
   ConvertDeletedToEmptyAndFullToDeleted(ctrl.data(), kCapacity);
-  ASSERT_EQ(ctrl[kCapacity], kSentinel);
+  ASSERT_EQ(ctrl[kCapacity], ctrl_t::kSentinel);
   for (size_t i = 0; i < kCapacity + kGroupWidth; ++i) {
     ctrl_t expected = pattern[i % (kCapacity + 1) % pattern.size()];
-    if (i == kCapacity) expected = kSentinel;
-    if (expected == kDeleted) expected = kEmpty;
-    if (IsFull(expected)) expected = kDeleted;
+    if (i == kCapacity) expected = ctrl_t::kSentinel;
+    if (expected == ctrl_t::kDeleted) expected = ctrl_t::kEmpty;
+    if (IsFull(expected)) expected = ctrl_t::kDeleted;
     EXPECT_EQ(ctrl[i], expected)
-        << i << " " << int{pattern[i % pattern.size()]};
+        << i << " " << static_cast<int>(pattern[i % pattern.size()]);
   }
 }
 
 TEST(Group, CountLeadingEmptyOrDeleted) {
-  const std::vector<ctrl_t> empty_examples = {kEmpty, kDeleted};
-  const std::vector<ctrl_t> full_examples = {0, 1, 2, 3, 5, 9, 127, kSentinel};
+  const std::vector<ctrl_t> empty_examples = {ctrl_t::kEmpty, ctrl_t::kDeleted};
+  const std::vector<ctrl_t> full_examples = {
+      CtrlT(0), CtrlT(1), CtrlT(2),   CtrlT(3),
+      CtrlT(5), CtrlT(9), CtrlT(127), ctrl_t::kSentinel};
 
   for (ctrl_t empty : empty_examples) {
     std::vector<ctrl_t> e(Group::kWidth, empty);
@@ -871,7 +890,7 @@
   const size_t capacity = t.capacity();
 
   // Remove elements from all groups except the first and the last one.
-  // All elements removed from full groups will be marked as kDeleted.
+  // All elements removed from full groups will be marked as ctrl_t::kDeleted.
   const size_t erase_begin = Group::kWidth / 2;
   const size_t erase_end = (t.size() / Group::kWidth - 1) * Group::kWidth;
   for (size_t i = erase_begin; i < erase_end; ++i) {
diff --git a/third_party/abseil-cpp/absl/copts/GENERATED_AbseilCopts.cmake b/third_party/abseil-cpp/absl/copts/GENERATED_AbseilCopts.cmake
index 22a25eb..a4ab1aa 100644
--- a/third_party/abseil-cpp/absl/copts/GENERATED_AbseilCopts.cmake
+++ b/third_party/abseil-cpp/absl/copts/GENERATED_AbseilCopts.cmake
@@ -94,6 +94,7 @@
     "-Wno-implicit-int-conversion"
     "-Wno-shorten-64-to-32"
     "-Wno-sign-conversion"
+    "-Wno-unknown-warning-option"
     "-DNOMINMAX"
 )
 
diff --git a/third_party/abseil-cpp/absl/copts/GENERATED_copts.bzl b/third_party/abseil-cpp/absl/copts/GENERATED_copts.bzl
index 0c7a91b..a6efc98 100644
--- a/third_party/abseil-cpp/absl/copts/GENERATED_copts.bzl
+++ b/third_party/abseil-cpp/absl/copts/GENERATED_copts.bzl
@@ -95,6 +95,7 @@
     "-Wno-implicit-int-conversion",
     "-Wno-shorten-64-to-32",
     "-Wno-sign-conversion",
+    "-Wno-unknown-warning-option",
     "-DNOMINMAX",
 ]
 
diff --git a/third_party/abseil-cpp/absl/copts/configure_copts.bzl b/third_party/abseil-cpp/absl/copts/configure_copts.bzl
index 669a906..40d5849 100644
--- a/third_party/abseil-cpp/absl/copts/configure_copts.bzl
+++ b/third_party/abseil-cpp/absl/copts/configure_copts.bzl
@@ -50,6 +50,7 @@
     ":cpu_x64_windows": ABSL_RANDOM_HWAES_MSVC_X64_FLAGS,
     ":cpu_k8": ABSL_RANDOM_HWAES_X64_FLAGS,
     ":cpu_ppc": ["-mcrypto"],
+    ":cpu_aarch64": ABSL_RANDOM_HWAES_ARM64_FLAGS,
 
     # Supported by default or unsupported.
     "//conditions:default": [],
@@ -70,6 +71,7 @@
         "darwin",
         "x64_windows_msvc",
         "x64_windows",
+        "aarch64",
     ]
     for cpu in cpu_configs:
         native.config_setting(
diff --git a/third_party/abseil-cpp/absl/copts/copts.py b/third_party/abseil-cpp/absl/copts/copts.py
index 7268c68..0d6c1ec 100644
--- a/third_party/abseil-cpp/absl/copts/copts.py
+++ b/third_party/abseil-cpp/absl/copts/copts.py
@@ -112,6 +112,9 @@
         "-Wno-implicit-int-conversion",
         "-Wno-shorten-64-to-32",
         "-Wno-sign-conversion",
+        # Disable warnings on unknown warning flags (when warning flags are
+        # unknown on older compiler versions)
+        "-Wno-unknown-warning-option",
         # Don't define min and max macros (Build on Windows using clang)
         "-DNOMINMAX",
     ],
diff --git a/third_party/abseil-cpp/absl/debugging/BUILD.bazel b/third_party/abseil-cpp/absl/debugging/BUILD.bazel
index 2aac0f6..b536a04 100644
--- a/third_party/abseil-cpp/absl/debugging/BUILD.bazel
+++ b/third_party/abseil-cpp/absl/debugging/BUILD.bazel
@@ -34,8 +34,10 @@
         "internal/stacktrace_aarch64-inl.inc",
         "internal/stacktrace_arm-inl.inc",
         "internal/stacktrace_config.h",
+        "internal/stacktrace_emscripten-inl.inc",
         "internal/stacktrace_generic-inl.inc",
         "internal/stacktrace_powerpc-inl.inc",
+        "internal/stacktrace_riscv-inl.inc",
         "internal/stacktrace_unimplemented-inl.inc",
         "internal/stacktrace_win32-inl.inc",
         "internal/stacktrace_x86-inl.inc",
@@ -57,6 +59,7 @@
         "symbolize.cc",
         "symbolize_darwin.inc",
         "symbolize_elf.inc",
+        "symbolize_emscripten.inc",
         "symbolize_unimplemented.inc",
         "symbolize_win32.inc",
     ],
diff --git a/third_party/abseil-cpp/absl/debugging/BUILD.gn b/third_party/abseil-cpp/absl/debugging/BUILD.gn
index b941fb9..8774b9a 100644
--- a/third_party/abseil-cpp/absl/debugging/BUILD.gn
+++ b/third_party/abseil-cpp/absl/debugging/BUILD.gn
@@ -10,8 +10,10 @@
     "internal/stacktrace_aarch64-inl.inc",
     "internal/stacktrace_arm-inl.inc",
     "internal/stacktrace_config.h",
+    "internal/stacktrace_emscripten-inl.inc",
     "internal/stacktrace_generic-inl.inc",
     "internal/stacktrace_powerpc-inl.inc",
+    "internal/stacktrace_riscv-inl.inc",
     "internal/stacktrace_unimplemented-inl.inc",
     "internal/stacktrace_win32-inl.inc",
     "internal/stacktrace_x86-inl.inc",
@@ -31,6 +33,7 @@
     "symbolize.cc",
     "symbolize_darwin.inc",
     "symbolize_elf.inc",
+    "symbolize_emscripten.inc",
     "symbolize_unimplemented.inc",
     "symbolize_win32.inc",
   ]
diff --git a/third_party/abseil-cpp/absl/debugging/CMakeLists.txt b/third_party/abseil-cpp/absl/debugging/CMakeLists.txt
index bb4d4c9..b16fa00 100644
--- a/third_party/abseil-cpp/absl/debugging/CMakeLists.txt
+++ b/third_party/abseil-cpp/absl/debugging/CMakeLists.txt
@@ -22,8 +22,10 @@
     "internal/stacktrace_aarch64-inl.inc"
     "internal/stacktrace_arm-inl.inc"
     "internal/stacktrace_config.h"
+    "internal/stacktrace_emscripten-inl.inc"
     "internal/stacktrace_generic-inl.inc"
     "internal/stacktrace_powerpc-inl.inc"
+    "internal/stacktrace_riscv-inl.inc"
     "internal/stacktrace_unimplemented-inl.inc"
     "internal/stacktrace_win32-inl.inc"
     "internal/stacktrace_x86-inl.inc"
@@ -48,6 +50,7 @@
     "symbolize.cc"
     "symbolize_darwin.inc"
     "symbolize_elf.inc"
+    "symbolize_emscripten.inc"
     "symbolize_unimplemented.inc"
     "symbolize_win32.inc"
   COPTS
diff --git a/third_party/abseil-cpp/absl/debugging/internal/demangle.cc b/third_party/abseil-cpp/absl/debugging/internal/demangle.cc
index 5cd5632..93ae327 100644
--- a/third_party/abseil-cpp/absl/debugging/internal/demangle.cc
+++ b/third_party/abseil-cpp/absl/debugging/internal/demangle.cc
@@ -1617,6 +1617,7 @@
 //              ::= <2-ary operator-name> <expression> <expression>
 //              ::= <3-ary operator-name> <expression> <expression> <expression>
 //              ::= cl <expression>+ E
+//              ::= cp <simple-id> <expression>* E # Clang-specific.
 //              ::= cv <type> <expression>      # type (expression)
 //              ::= cv <type> _ <expression>* E # type (expr-list)
 //              ::= st <type>
@@ -1639,14 +1640,23 @@
     return true;
   }
 
-  // Object/function call expression.
   ParseState copy = state->parse_state;
+
+  // Object/function call expression.
   if (ParseTwoCharToken(state, "cl") && OneOrMore(ParseExpression, state) &&
       ParseOneCharToken(state, 'E')) {
     return true;
   }
   state->parse_state = copy;
 
+  // Clang-specific "cp <simple-id> <expression>* E"
+  //   https://clang.llvm.org/doxygen/ItaniumMangle_8cpp_source.html#l04338
+  if (ParseTwoCharToken(state, "cp") && ParseSimpleId(state) &&
+      ZeroOrMore(ParseExpression, state) && ParseOneCharToken(state, 'E')) {
+    return true;
+  }
+  state->parse_state = copy;
+
   // Function-param expression (level 0).
   if (ParseTwoCharToken(state, "fp") && Optional(ParseCVQualifiers(state)) &&
       Optional(ParseNumber(state, nullptr)) && ParseOneCharToken(state, '_')) {
diff --git a/third_party/abseil-cpp/absl/debugging/internal/stack_consumption.cc b/third_party/abseil-cpp/absl/debugging/internal/stack_consumption.cc
index e3dd51c..5134864 100644
--- a/third_party/abseil-cpp/absl/debugging/internal/stack_consumption.cc
+++ b/third_party/abseil-cpp/absl/debugging/internal/stack_consumption.cc
@@ -43,7 +43,7 @@
 // unspecified. Therefore, instead we hardcode the direction of the
 // stack on platforms we know about.
 #if defined(__i386__) || defined(__x86_64__) || defined(__ppc__) || \
-    defined(__aarch64__)
+    defined(__aarch64__) || defined(__riscv)
 constexpr bool kStackGrowsDown = true;
 #else
 #error Need to define kStackGrowsDown
diff --git a/third_party/abseil-cpp/absl/debugging/internal/stack_consumption.h b/third_party/abseil-cpp/absl/debugging/internal/stack_consumption.h
index 2b5e715..f41b64c3 100644
--- a/third_party/abseil-cpp/absl/debugging/internal/stack_consumption.h
+++ b/third_party/abseil-cpp/absl/debugging/internal/stack_consumption.h
@@ -26,7 +26,7 @@
 #error ABSL_INTERNAL_HAVE_DEBUGGING_STACK_CONSUMPTION cannot be set directly
 #elif !defined(__APPLE__) && !defined(_WIN32) &&                     \
     (defined(__i386__) || defined(__x86_64__) || defined(__ppc__) || \
-     defined(__aarch64__))
+     defined(__aarch64__) || defined(__riscv))
 #define ABSL_INTERNAL_HAVE_DEBUGGING_STACK_CONSUMPTION 1
 
 namespace absl {
diff --git a/third_party/abseil-cpp/absl/debugging/internal/stacktrace_config.h b/third_party/abseil-cpp/absl/debugging/internal/stacktrace_config.h
index cca410d..29b26bd 100644
--- a/third_party/abseil-cpp/absl/debugging/internal/stacktrace_config.h
+++ b/third_party/abseil-cpp/absl/debugging/internal/stacktrace_config.h
@@ -37,6 +37,10 @@
   "absl/debugging/internal/stacktrace_generic-inl.inc"
 #endif
 
+#elif defined(__EMSCRIPTEN__)
+#define ABSL_STACKTRACE_INL_HEADER \
+  "absl/debugging/internal/stacktrace_emscripten-inl.inc"
+
 #elif defined(__linux__) && !defined(__ANDROID__)
 
 #if defined(NO_FRAME_POINTER) && \
@@ -61,6 +65,9 @@
 #elif defined(__aarch64__)
 #define ABSL_STACKTRACE_INL_HEADER \
   "absl/debugging/internal/stacktrace_aarch64-inl.inc"
+#elif defined(__riscv)
+#define ABSL_STACKTRACE_INL_HEADER \
+  "absl/debugging/internal/stacktrace_riscv-inl.inc"
 #elif defined(__has_include)
 #if __has_include(<execinfo.h>)
 // Note: When using glibc this may require -funwind-tables to function properly.
@@ -68,7 +75,6 @@
   "absl/debugging/internal/stacktrace_generic-inl.inc"
 #endif
 #endif
-
 #endif
 
 // Fallback to the empty implementation.
diff --git a/third_party/abseil-cpp/absl/debugging/internal/stacktrace_emscripten-inl.inc b/third_party/abseil-cpp/absl/debugging/internal/stacktrace_emscripten-inl.inc
new file mode 100644
index 0000000..0f44451
--- /dev/null
+++ b/third_party/abseil-cpp/absl/debugging/internal/stacktrace_emscripten-inl.inc
@@ -0,0 +1,110 @@
+// Copyright 2017 The Abseil Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      https://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+// Portable implementation - just use glibc
+//
+// Note:  The glibc implementation may cause a call to malloc.
+// This can cause a deadlock in HeapProfiler.
+
+#ifndef ABSL_DEBUGGING_INTERNAL_STACKTRACE_EMSCRIPTEN_INL_H_
+#define ABSL_DEBUGGING_INTERNAL_STACKTRACE_EMSCRIPTEN_INL_H_
+
+#include <emscripten.h>
+
+#include <atomic>
+#include <cstring>
+
+#include "absl/base/attributes.h"
+#include "absl/debugging/stacktrace.h"
+
+extern "C" {
+uintptr_t emscripten_stack_snapshot();
+uint32_t emscripten_stack_unwind_buffer(uintptr_t pc, void *buffer,
+                                        uint32_t depth);
+}
+
+// Sometimes, we can try to get a stack trace from within a stack
+// trace, which can cause a self-deadlock.
+// Protect against such reentrant call by failing to get a stack trace.
+//
+// We use __thread here because the code here is extremely low level -- it is
+// called while collecting stack traces from within malloc and mmap, and thus
+// can not call anything which might call malloc or mmap itself.
+static __thread int recursive = 0;
+
+// The stack trace function might be invoked very early in the program's
+// execution (e.g. from the very first malloc).
+// As such, we suppress usage of backtrace during this early stage of execution.
+static std::atomic<bool> disable_stacktraces(true);  // Disabled until healthy.
+// Waiting until static initializers run seems to be late enough.
+// This file is included into stacktrace.cc so this will only run once.
+ABSL_ATTRIBUTE_UNUSED static int stacktraces_enabler = []() {
+  // Check if we can even create stacktraces. If not, bail early and leave
+  // disable_stacktraces set as-is.
+  // clang-format off
+  if (!EM_ASM_INT({ return (typeof wasmOffsetConverter !== 'undefined'); })) {
+    return 0;
+  }
+  // clang-format on
+  disable_stacktraces.store(false, std::memory_order_relaxed);
+  return 0;
+}();
+
+template <bool IS_STACK_FRAMES, bool IS_WITH_CONTEXT>
+static int UnwindImpl(void **result, int *sizes, int max_depth, int skip_count,
+                      const void *ucp, int *min_dropped_frames) {
+  if (recursive || disable_stacktraces.load(std::memory_order_relaxed)) {
+    return 0;
+  }
+  ++recursive;
+
+  static_cast<void>(ucp);  // Unused.
+  constexpr int kStackLength = 64;
+  void *stack[kStackLength];
+
+  int size;
+  uintptr_t pc = emscripten_stack_snapshot();
+  size = emscripten_stack_unwind_buffer(pc, stack, kStackLength);
+
+  int result_count = size - skip_count;
+  if (result_count < 0) result_count = 0;
+  if (result_count > max_depth) result_count = max_depth;
+  for (int i = 0; i < result_count; i++) result[i] = stack[i + skip_count];
+
+  if (IS_STACK_FRAMES) {
+    // No implementation for finding out the stack frame sizes yet.
+    memset(sizes, 0, sizeof(*sizes) * result_count);
+  }
+  if (min_dropped_frames != nullptr) {
+    if (size - skip_count - max_depth > 0) {
+      *min_dropped_frames = size - skip_count - max_depth;
+    } else {
+      *min_dropped_frames = 0;
+    }
+  }
+
+  --recursive;
+
+  return result_count;
+}
+
+namespace absl {
+ABSL_NAMESPACE_BEGIN
+namespace debugging_internal {
+bool StackTraceWorksForTest() { return true; }
+}  // namespace debugging_internal
+ABSL_NAMESPACE_END
+}  // namespace absl
+
+#endif  // ABSL_DEBUGGING_INTERNAL_STACKTRACE_EMSCRIPTEN_INL_H_
diff --git a/third_party/abseil-cpp/absl/debugging/internal/stacktrace_riscv-inl.inc b/third_party/abseil-cpp/absl/debugging/internal/stacktrace_riscv-inl.inc
new file mode 100644
index 0000000..8cbc785
--- /dev/null
+++ b/third_party/abseil-cpp/absl/debugging/internal/stacktrace_riscv-inl.inc
@@ -0,0 +1,234 @@
+// Copyright 2021 The Abseil Authors
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     https://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#ifndef ABSL_DEBUGGING_INTERNAL_STACKTRACE_RISCV_INL_H_
+#define ABSL_DEBUGGING_INTERNAL_STACKTRACE_RISCV_INL_H_
+
+// Generate stack trace for riscv
+
+#include <sys/ucontext.h>
+
+#include "absl/base/config.h"
+#if defined(__linux__)
+#include <sys/mman.h>
+#include <ucontext.h>
+#include <unistd.h>
+#endif
+
+#include <atomic>
+#include <cassert>
+#include <cstdint>
+#include <iostream>
+
+#include "absl/base/attributes.h"
+#include "absl/debugging/internal/address_is_readable.h"
+#include "absl/debugging/internal/vdso_support.h"
+#include "absl/debugging/stacktrace.h"
+
+static const uintptr_t kUnknownFrameSize = 0;
+
+#if defined(__linux__)
+// Returns the address of the VDSO __kernel_rt_sigreturn function, if present.
+static const unsigned char *GetKernelRtSigreturnAddress() {
+  constexpr uintptr_t kImpossibleAddress = 0;
+  ABSL_CONST_INIT static std::atomic<uintptr_t> memoized(kImpossibleAddress);
+  uintptr_t address = memoized.load(std::memory_order_relaxed);
+  if (address != kImpossibleAddress) {
+    return reinterpret_cast<const unsigned char *>(address);
+  }
+
+  address = reinterpret_cast<uintptr_t>(nullptr);
+
+#if ABSL_HAVE_VDSO_SUPPORT
+  absl::debugging_internal::VDSOSupport vdso;
+  if (vdso.IsPresent()) {
+    absl::debugging_internal::VDSOSupport::SymbolInfo symbol_info;
+    // Symbol versioning pulled from arch/riscv/kernel/vdso/vdso.lds at v5.10.
+    auto lookup = [&](int type) {
+      return vdso.LookupSymbol("__kernel_rt_sigreturn", "LINUX_4.15", type,
+                               &symbol_info);
+    };
+    if ((!lookup(STT_FUNC) && !lookup(STT_NOTYPE)) ||
+        symbol_info.address == nullptr) {
+      // Unexpected: VDSO is present, yet the expected symbol is missing or
+      // null.
+      assert(false && "VDSO is present, but doesn't have expected symbol");
+    } else {
+      if (reinterpret_cast<uintptr_t>(symbol_info.address) !=
+          kImpossibleAddress) {
+        address = reinterpret_cast<uintptr_t>(symbol_info.address);
+      } else {
+        assert(false && "VDSO returned invalid address");
+      }
+    }
+  }
+#endif
+
+  memoized.store(address, std::memory_order_relaxed);
+  return reinterpret_cast<const unsigned char *>(address);
+}
+#endif  // __linux__
+
+// Compute the size of a stack frame in [low..high).  We assume that low < high.
+// Return size of kUnknownFrameSize.
+template <typename T>
+static inline uintptr_t ComputeStackFrameSize(const T *low, const T *high) {
+  const char *low_char_ptr = reinterpret_cast<const char *>(low);
+  const char *high_char_ptr = reinterpret_cast<const char *>(high);
+  return low < high ? high_char_ptr - low_char_ptr : kUnknownFrameSize;
+}
+
+// Given a pointer to a stack frame, locate and return the calling stackframe,
+// or return null if no stackframe can be found. Perform sanity checks (the
+// strictness of which is controlled by the boolean parameter
+// "STRICT_UNWINDING") to reduce the chance that a bad pointer is returned.
+template <bool STRICT_UNWINDING, bool WITH_CONTEXT>
+ABSL_ATTRIBUTE_NO_SANITIZE_ADDRESS  // May read random elements from stack.
+ABSL_ATTRIBUTE_NO_SANITIZE_MEMORY   // May read random elements from stack.
+static void ** NextStackFrame(void **old_frame_pointer, const void *uc) {
+  //               .
+  //               .
+  //               .
+  //   +-> +----------------+
+  //   |   | return address |
+  //   |   |   previous fp  |
+  //   |   |      ...       |
+  //   |   +----------------+ <-+
+  //   |   | return address |   |
+  //   +---|-  previous fp  |   |
+  //       |      ...       |   |
+  // $fp ->|----------------+   |
+  //       | return address |   |
+  //       |   previous fp -|---+
+  // $sp ->|      ...       |
+  //       +----------------+
+  void **new_frame_pointer = reinterpret_cast<void **>(old_frame_pointer[-2]);
+  bool check_frame_size = true;
+
+#if defined(__linux__)
+  if (WITH_CONTEXT && uc != nullptr) {
+    // Check to see if next frame's return address is __kernel_rt_sigreturn.
+    if (old_frame_pointer[-1] == GetKernelRtSigreturnAddress()) {
+      const ucontext_t *ucv = static_cast<const ucontext_t *>(uc);
+      // old_frame_pointer is not suitable for unwinding, look at ucontext to
+      // discover frame pointer before signal.
+      //
+      // RISCV ELF psABI has the frame pointer at x8/fp/s0.
+      // -- RISCV psABI Table 18.2
+      void **const pre_signal_frame_pointer =
+          reinterpret_cast<void **>(ucv->uc_mcontext.__gregs[8]);
+
+      // Check the alleged frame pointer is actually readable. This is to
+      // prevent "double fault" in case we hit the first fault due to stack
+      // corruption.
+      if (!absl::debugging_internal::AddressIsReadable(
+              pre_signal_frame_pointer))
+        return nullptr;
+
+      // Alleged frame pointer is readable, use it for further unwinding.
+      new_frame_pointer = pre_signal_frame_pointer;
+
+      // Skip frame size check if we return from a signal.  We may be using an
+      // alterate stack for signals.
+      check_frame_size = false;
+    }
+  }
+#endif
+
+  // The RISCV ELF psABI mandates that the stack pointer is always 16-byte
+  // aligned.
+  // FIXME(abdulras) this doesn't hold for ILP32E which only mandates a 4-byte
+  // alignment.
+  if ((reinterpret_cast<uintptr_t>(new_frame_pointer) & 15) != 0)
+    return nullptr;
+
+  // Check frame size.  In strict mode, we assume frames to be under 100,000
+  // bytes.  In non-strict mode, we relax the limit to 1MB.
+  if (check_frame_size) {
+    const uintptr_t max_size = STRICT_UNWINDING ? 100000 : 1000000;
+    const uintptr_t frame_size =
+        ComputeStackFrameSize(old_frame_pointer, new_frame_pointer);
+    if (frame_size == kUnknownFrameSize || frame_size > max_size)
+      return nullptr;
+  }
+
+  return new_frame_pointer;
+}
+
+template <bool IS_STACK_FRAMES, bool IS_WITH_CONTEXT>
+ABSL_ATTRIBUTE_NO_SANITIZE_ADDRESS  // May read random elements from stack.
+ABSL_ATTRIBUTE_NO_SANITIZE_MEMORY   // May read random elements from stack.
+static int UnwindImpl(void **result, int *sizes, int max_depth, int skip_count,
+                      const void *ucp, int *min_dropped_frames) {
+#if defined(__GNUC__)
+  void **frame_pointer = reinterpret_cast<void **>(__builtin_frame_address(0));
+#else
+#error reading stack pointer not yet supported on this platform
+#endif
+
+  skip_count++;  // Skip the frame for this function.
+  int n = 0;
+
+  // The `frame_pointer` that is computed here points to the top of the frame.
+  // The two words preceding the address are the return address and the previous
+  // frame pointer.  To find a PC value associated with the current frame, we
+  // need to go down a level in the call chain.  So we remember the return
+  // address of the last frame seen.  This does not work for the first stack
+  // frame, which belongs to `UnwindImp()` but we skip the frame for
+  // `UnwindImp()` anyway.
+  void *prev_return_address = nullptr;
+
+  while (frame_pointer && n < max_depth) {
+    // The absl::GetStackFrames routine si called when we are in some
+    // informational context (the failure signal handler for example).  Use the
+    // non-strict unwinding rules to produce a stack trace that is as complete
+    // as possible (even if it contains a few bogus entries in some rare cases).
+    void **next_frame_pointer =
+        NextStackFrame<!IS_STACK_FRAMES, IS_WITH_CONTEXT>(frame_pointer, ucp);
+
+    if (skip_count > 0) {
+      skip_count--;
+    } else {
+      result[n] = prev_return_address;
+      if (IS_STACK_FRAMES) {
+        sizes[n] = ComputeStackFrameSize(frame_pointer, next_frame_pointer);
+      }
+      n++;
+    }
+    prev_return_address = frame_pointer[-1];
+    frame_pointer = next_frame_pointer;
+  }
+  if (min_dropped_frames != nullptr) {
+    // Implementation detail: we clamp the max of frames we are willing to
+    // count, so as not to spend too much time in the loop below.
+    const int kMaxUnwind = 200;
+    int j = 0;
+    for (; frame_pointer != nullptr && j < kMaxUnwind; j++) {
+      frame_pointer =
+          NextStackFrame<!IS_STACK_FRAMES, IS_WITH_CONTEXT>(frame_pointer, ucp);
+    }
+    *min_dropped_frames = j;
+  }
+  return n;
+}
+
+namespace absl {
+ABSL_NAMESPACE_BEGIN
+namespace debugging_internal {
+bool StackTraceWorksForTest() { return true; }
+}  // namespace debugging_internal
+ABSL_NAMESPACE_END
+}  // namespace absl
+
+#endif
diff --git a/third_party/abseil-cpp/absl/debugging/internal/symbolize.h b/third_party/abseil-cpp/absl/debugging/internal/symbolize.h
index 4f26130..27d5e65 100644
--- a/third_party/abseil-cpp/absl/debugging/internal/symbolize.h
+++ b/third_party/abseil-cpp/absl/debugging/internal/symbolize.h
@@ -28,8 +28,8 @@
 
 #ifdef ABSL_INTERNAL_HAVE_ELF_SYMBOLIZE
 #error ABSL_INTERNAL_HAVE_ELF_SYMBOLIZE cannot be directly set
-#elif defined(__ELF__) && defined(__GLIBC__) && !defined(__native_client__) && \
-    !defined(__asmjs__) && !defined(__wasm__)
+#elif defined(__ELF__) && defined(__GLIBC__) && !defined(__native_client__) \
+      && !defined(__asmjs__) && !defined(__wasm__)
 #define ABSL_INTERNAL_HAVE_ELF_SYMBOLIZE 1
 
 #include <elf.h>
@@ -68,6 +68,12 @@
 #define ABSL_INTERNAL_HAVE_DARWIN_SYMBOLIZE 1
 #endif
 
+#ifdef ABSL_INTERNAL_HAVE_EMSCRIPTEN_SYMBOLIZE
+#error ABSL_INTERNAL_HAVE_EMSCRIPTEN_SYMBOLIZE cannot be directly set
+#elif defined(__EMSCRIPTEN__)
+#define ABSL_INTERNAL_HAVE_EMSCRIPTEN_SYMBOLIZE 1
+#endif
+
 namespace absl {
 ABSL_NAMESPACE_BEGIN
 namespace debugging_internal {
diff --git a/third_party/abseil-cpp/absl/debugging/stacktrace.cc b/third_party/abseil-cpp/absl/debugging/stacktrace.cc
index 1f7c7d8..ff8069f 100644
--- a/third_party/abseil-cpp/absl/debugging/stacktrace.cc
+++ b/third_party/abseil-cpp/absl/debugging/stacktrace.cc
@@ -49,8 +49,10 @@
 
 # include "absl/debugging/internal/stacktrace_aarch64-inl.inc"
 # include "absl/debugging/internal/stacktrace_arm-inl.inc"
+# include "absl/debugging/internal/stacktrace_emscripten-inl.inc"
 # include "absl/debugging/internal/stacktrace_generic-inl.inc"
 # include "absl/debugging/internal/stacktrace_powerpc-inl.inc"
+# include "absl/debugging/internal/stacktrace_riscv-inl.inc"
 # include "absl/debugging/internal/stacktrace_unimplemented-inl.inc"
 # include "absl/debugging/internal/stacktrace_win32-inl.inc"
 # include "absl/debugging/internal/stacktrace_x86-inl.inc"
diff --git a/third_party/abseil-cpp/absl/debugging/symbolize.cc b/third_party/abseil-cpp/absl/debugging/symbolize.cc
index 5e4a25d..f1abdfd 100644
--- a/third_party/abseil-cpp/absl/debugging/symbolize.cc
+++ b/third_party/abseil-cpp/absl/debugging/symbolize.cc
@@ -31,6 +31,8 @@
 #include "absl/debugging/symbolize_win32.inc"
 #elif defined(__APPLE__)
 #include "absl/debugging/symbolize_darwin.inc"
+#elif defined(__EMSCRIPTEN__)
+#include "absl/debugging/symbolize_emscripten.inc"
 #else
 #include "absl/debugging/symbolize_unimplemented.inc"
 #endif
diff --git a/third_party/abseil-cpp/absl/debugging/symbolize_emscripten.inc b/third_party/abseil-cpp/absl/debugging/symbolize_emscripten.inc
new file mode 100644
index 0000000..c226c45
--- /dev/null
+++ b/third_party/abseil-cpp/absl/debugging/symbolize_emscripten.inc
@@ -0,0 +1,72 @@
+// Copyright 2020 The Abseil Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      https://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include <cxxabi.h>
+#include <emscripten.h>
+
+#include <algorithm>
+#include <cstring>
+
+#include "absl/base/internal/raw_logging.h"
+#include "absl/debugging/internal/demangle.h"
+#include "absl/strings/numbers.h"
+#include "absl/strings/str_cat.h"
+#include "absl/strings/string_view.h"
+
+extern "C" {
+const char* emscripten_pc_get_function(const void* pc);
+}
+
+// clang-format off
+EM_JS(bool, HaveOffsetConverter, (),
+      { return typeof wasmOffsetConverter !== 'undefined'; });
+// clang-format on
+
+namespace absl {
+ABSL_NAMESPACE_BEGIN
+
+void InitializeSymbolizer(const char*) {
+  if (!HaveOffsetConverter()) {
+    ABSL_RAW_LOG(INFO,
+                 "Symbolization unavailable. Rebuild with -sWASM=1 "
+                 "and -sUSE_OFFSET_CONVERTER=1.");
+  }
+}
+
+bool Symbolize(const void* pc, char* out, int out_size) {
+  // Check if we have the offset converter necessary for pc_get_function.
+  // Without it, the program will abort().
+  if (!HaveOffsetConverter()) {
+    return false;
+  }
+  const char* func_name = emscripten_pc_get_function(pc);
+  if (func_name == nullptr) {
+    return false;
+  }
+
+  strncpy(out, func_name, out_size);
+
+  if (out[out_size - 1] != '\0') {
+    // strncpy() does not '\0' terminate when it truncates.
+    static constexpr char kEllipsis[] = "...";
+    int ellipsis_size = std::min<int>(sizeof(kEllipsis) - 1, out_size - 1);
+    memcpy(out + out_size - ellipsis_size - 1, kEllipsis, ellipsis_size);
+    out[out_size - 1] = '\0';
+  }
+
+  return true;
+}
+
+ABSL_NAMESPACE_END
+}  // namespace absl
diff --git a/third_party/abseil-cpp/absl/debugging/symbolize_test.cc b/third_party/abseil-cpp/absl/debugging/symbolize_test.cc
index 35de02e..c710a3d 100644
--- a/third_party/abseil-cpp/absl/debugging/symbolize_test.cc
+++ b/third_party/abseil-cpp/absl/debugging/symbolize_test.cc
@@ -146,8 +146,22 @@
   return TrySymbolizeWithLimit(pc, sizeof(try_symbolize_buffer));
 }
 
-#if defined(ABSL_INTERNAL_HAVE_ELF_SYMBOLIZE) || \
-    defined(ABSL_INTERNAL_HAVE_DARWIN_SYMBOLIZE)
+#if defined(ABSL_INTERNAL_HAVE_ELF_SYMBOLIZE) ||    \
+    defined(ABSL_INTERNAL_HAVE_DARWIN_SYMBOLIZE) || \
+    defined(ABSL_INTERNAL_HAVE_EMSCRIPTEN_SYMBOLIZE)
+
+// Test with a return address.
+void ABSL_ATTRIBUTE_NOINLINE TestWithReturnAddress() {
+#if defined(ABSL_HAVE_ATTRIBUTE_NOINLINE)
+  void *return_address = __builtin_return_address(0);
+  const char *symbol = TrySymbolize(return_address);
+  ABSL_RAW_CHECK(symbol != nullptr, "TestWithReturnAddress failed");
+  ABSL_RAW_CHECK(strcmp(symbol, "main") == 0, "TestWithReturnAddress failed");
+  std::cout << "TestWithReturnAddress passed" << std::endl;
+#endif
+}
+
+#ifndef ABSL_INTERNAL_HAVE_EMSCRIPTEN_SYMBOLIZE
 
 TEST(Symbolize, Cached) {
   // Compilers should give us pointers to them.
@@ -418,6 +432,7 @@
   close(fd);
 }
 #endif  // !ABSL_INTERNAL_HAVE_DARWIN_SYMBOLIZE
+#endif  // !ABSL_INTERNAL_HAVE_EMSCRIPTEN_SYMBOLIZE
 
 // x86 specific tests.  Uses some inline assembler.
 extern "C" {
@@ -466,17 +481,6 @@
 }
 }
 
-// Test with a return address.
-void ABSL_ATTRIBUTE_NOINLINE TestWithReturnAddress() {
-#if defined(ABSL_HAVE_ATTRIBUTE_NOINLINE)
-  void *return_address = __builtin_return_address(0);
-  const char *symbol = TrySymbolize(return_address);
-  ABSL_RAW_CHECK(symbol != nullptr, "TestWithReturnAddress failed");
-  ABSL_RAW_CHECK(strcmp(symbol, "main") == 0, "TestWithReturnAddress failed");
-  std::cout << "TestWithReturnAddress passed" << std::endl;
-#endif
-}
-
 #if defined(__arm__) && ABSL_HAVE_ATTRIBUTE(target)
 // Test that we correctly identify bounds of Thumb functions on ARM.
 //
@@ -559,7 +563,6 @@
 
 #endif  // !defined(ABSL_CONSUME_DLL)
 #else  // Symbolizer unimplemented
-
 TEST(Symbolize, Unimplemented) {
   char buf[64];
   EXPECT_FALSE(absl::Symbolize((void *)(&nonstatic_func), buf, sizeof(buf)));
diff --git a/third_party/abseil-cpp/absl/flags/flag_test.cc b/third_party/abseil-cpp/absl/flags/flag_test.cc
index ba81317..6e974a5 100644
--- a/third_party/abseil-cpp/absl/flags/flag_test.cc
+++ b/third_party/abseil-cpp/absl/flags/flag_test.cc
@@ -103,9 +103,9 @@
 
 TEST_F(FlagTest, Traits) {
   EXPECT_EQ(flags::StorageKind<int>(),
-            flags::FlagValueStorageKind::kOneWordAtomic);
+            flags::FlagValueStorageKind::kValueAndInitBit);
   EXPECT_EQ(flags::StorageKind<bool>(),
-            flags::FlagValueStorageKind::kOneWordAtomic);
+            flags::FlagValueStorageKind::kValueAndInitBit);
   EXPECT_EQ(flags::StorageKind<double>(),
             flags::FlagValueStorageKind::kOneWordAtomic);
   EXPECT_EQ(flags::StorageKind<int64_t>(),
@@ -724,6 +724,8 @@
 namespace {
 
 TEST_F(FlagTest, TestCustomUDT) {
+  EXPECT_EQ(flags::StorageKind<CustomUDT>(),
+            flags::FlagValueStorageKind::kOneWordAtomic);
   EXPECT_EQ(absl::GetFlag(FLAGS_test_flag_custom_udt), CustomUDT(1, 1));
   absl::SetFlag(&FLAGS_test_flag_custom_udt, CustomUDT(2, 3));
   EXPECT_EQ(absl::GetFlag(FLAGS_test_flag_custom_udt), CustomUDT(2, 3));
@@ -944,3 +946,34 @@
 }
 
 }  // namespace
+
+// --------------------------------------------------------------------
+
+namespace {
+
+enum TestE { A = 1, B = 2, C = 3 };
+
+struct EnumWrapper {
+  EnumWrapper() : e(A) {}
+
+  TestE e;
+};
+
+bool AbslParseFlag(absl::string_view, EnumWrapper*, std::string*) {
+  return true;
+}
+std::string AbslUnparseFlag(const EnumWrapper&) { return ""; }
+
+}  // namespace
+
+ABSL_FLAG(EnumWrapper, test_enum_wrapper_flag, {}, "help");
+
+TEST_F(FlagTest, TesTypeWrappingEnum) {
+  EnumWrapper value = absl::GetFlag(FLAGS_test_enum_wrapper_flag);
+  EXPECT_EQ(value.e, A);
+
+  value.e = B;
+  absl::SetFlag(&FLAGS_test_enum_wrapper_flag, value);
+  value = absl::GetFlag(FLAGS_test_enum_wrapper_flag);
+  EXPECT_EQ(value.e, B);
+}
diff --git a/third_party/abseil-cpp/absl/flags/internal/flag.cc b/third_party/abseil-cpp/absl/flags/internal/flag.cc
index f83c1fe..1515022 100644
--- a/third_party/abseil-cpp/absl/flags/internal/flag.cc
+++ b/third_party/abseil-cpp/absl/flags/internal/flag.cc
@@ -145,12 +145,7 @@
   auto def_kind = static_cast<FlagDefaultKind>(def_kind_);
 
   switch (ValueStorageKind()) {
-    case FlagValueStorageKind::kAlignedBuffer:
-      // For this storage kind the default_value_ always points to gen_func
-      // during initialization.
-      assert(def_kind == FlagDefaultKind::kGenFunc);
-      (*default_value_.gen_func)(AlignedBufferValue());
-      break;
+    case FlagValueStorageKind::kValueAndInitBit:
     case FlagValueStorageKind::kOneWordAtomic: {
       alignas(int64_t) std::array<char, sizeof(int64_t)> buf{};
       if (def_kind == FlagDefaultKind::kGenFunc) {
@@ -159,6 +154,12 @@
         assert(def_kind != FlagDefaultKind::kDynamicValue);
         std::memcpy(buf.data(), &default_value_, Sizeof(op_));
       }
+      if (ValueStorageKind() == FlagValueStorageKind::kValueAndInitBit) {
+        // We presume here the memory layout of FlagValueAndInitBit struct.
+        uint8_t initialized = 1;
+        std::memcpy(buf.data() + Sizeof(op_), &initialized,
+                    sizeof(initialized));
+      }
       OneWordValue().store(absl::bit_cast<int64_t>(buf),
                            std::memory_order_release);
       break;
@@ -170,6 +171,12 @@
       (*default_value_.gen_func)(AtomicBufferValue());
       break;
     }
+    case FlagValueStorageKind::kAlignedBuffer:
+      // For this storage kind the default_value_ always points to gen_func
+      // during initialization.
+      assert(def_kind == FlagDefaultKind::kGenFunc);
+      (*default_value_.gen_func)(AlignedBufferValue());
+      break;
   }
   seq_lock_.MarkInitialized();
 }
@@ -226,12 +233,10 @@
 
 void FlagImpl::StoreValue(const void* src) {
   switch (ValueStorageKind()) {
-    case FlagValueStorageKind::kAlignedBuffer:
-      Copy(op_, src, AlignedBufferValue());
-      seq_lock_.IncrementModificationCount();
-      break;
+    case FlagValueStorageKind::kValueAndInitBit:
     case FlagValueStorageKind::kOneWordAtomic: {
-      int64_t one_word_val = 0;
+      // Load the current value to avoid setting 'init' bit manualy.
+      int64_t one_word_val = OneWordValue().load(std::memory_order_acquire);
       std::memcpy(&one_word_val, src, Sizeof(op_));
       OneWordValue().store(one_word_val, std::memory_order_release);
       seq_lock_.IncrementModificationCount();
@@ -241,6 +246,10 @@
       seq_lock_.Write(AtomicBufferValue(), src, Sizeof(op_));
       break;
     }
+    case FlagValueStorageKind::kAlignedBuffer:
+      Copy(op_, src, AlignedBufferValue());
+      seq_lock_.IncrementModificationCount();
+      break;
   }
   modified_ = true;
   InvokeCallback();
@@ -280,10 +289,7 @@
 std::string FlagImpl::CurrentValue() const {
   auto* guard = DataGuard();  // Make sure flag initialized
   switch (ValueStorageKind()) {
-    case FlagValueStorageKind::kAlignedBuffer: {
-      absl::MutexLock l(guard);
-      return flags_internal::Unparse(op_, AlignedBufferValue());
-    }
+    case FlagValueStorageKind::kValueAndInitBit:
     case FlagValueStorageKind::kOneWordAtomic: {
       const auto one_word_val =
           absl::bit_cast<std::array<char, sizeof(int64_t)>>(
@@ -296,6 +302,10 @@
       ReadSequenceLockedData(cloned.get());
       return flags_internal::Unparse(op_, cloned.get());
     }
+    case FlagValueStorageKind::kAlignedBuffer: {
+      absl::MutexLock l(guard);
+      return flags_internal::Unparse(op_, AlignedBufferValue());
+    }
   }
 
   return "";
@@ -341,11 +351,7 @@
   bool modified = modified_;
   bool on_command_line = on_command_line_;
   switch (ValueStorageKind()) {
-    case FlagValueStorageKind::kAlignedBuffer: {
-      return absl::make_unique<FlagState>(
-          *this, flags_internal::Clone(op_, AlignedBufferValue()), modified,
-          on_command_line, ModificationCount());
-    }
+    case FlagValueStorageKind::kValueAndInitBit:
     case FlagValueStorageKind::kOneWordAtomic: {
       return absl::make_unique<FlagState>(
           *this, OneWordValue().load(std::memory_order_acquire), modified,
@@ -361,6 +367,11 @@
       return absl::make_unique<FlagState>(*this, cloned, modified,
                                           on_command_line, ModificationCount());
     }
+    case FlagValueStorageKind::kAlignedBuffer: {
+      return absl::make_unique<FlagState>(
+          *this, flags_internal::Clone(op_, AlignedBufferValue()), modified,
+          on_command_line, ModificationCount());
+    }
   }
   return nullptr;
 }
@@ -372,13 +383,14 @@
   }
 
   switch (ValueStorageKind()) {
-    case FlagValueStorageKind::kAlignedBuffer:
-    case FlagValueStorageKind::kSequenceLocked:
-      StoreValue(flag_state.value_.heap_allocated);
-      break;
+    case FlagValueStorageKind::kValueAndInitBit:
     case FlagValueStorageKind::kOneWordAtomic:
       StoreValue(&flag_state.value_.one_word);
       break;
+    case FlagValueStorageKind::kSequenceLocked:
+    case FlagValueStorageKind::kAlignedBuffer:
+      StoreValue(flag_state.value_.heap_allocated);
+      break;
   }
 
   modified_ = flag_state.modified_;
@@ -407,7 +419,8 @@
 }
 
 std::atomic<int64_t>& FlagImpl::OneWordValue() const {
-  assert(ValueStorageKind() == FlagValueStorageKind::kOneWordAtomic);
+  assert(ValueStorageKind() == FlagValueStorageKind::kOneWordAtomic ||
+         ValueStorageKind() == FlagValueStorageKind::kValueAndInitBit);
   return OffsetValue<FlagOneWordValue>()->value;
 }
 
@@ -433,11 +446,7 @@
 void FlagImpl::Read(void* dst) const {
   auto* guard = DataGuard();  // Make sure flag initialized
   switch (ValueStorageKind()) {
-    case FlagValueStorageKind::kAlignedBuffer: {
-      absl::MutexLock l(guard);
-      flags_internal::CopyConstruct(op_, AlignedBufferValue(), dst);
-      break;
-    }
+    case FlagValueStorageKind::kValueAndInitBit:
     case FlagValueStorageKind::kOneWordAtomic: {
       const int64_t one_word_val =
           OneWordValue().load(std::memory_order_acquire);
@@ -448,9 +457,31 @@
       ReadSequenceLockedData(dst);
       break;
     }
+    case FlagValueStorageKind::kAlignedBuffer: {
+      absl::MutexLock l(guard);
+      flags_internal::CopyConstruct(op_, AlignedBufferValue(), dst);
+      break;
+    }
   }
 }
 
+int64_t FlagImpl::ReadOneWord() const {
+  assert(ValueStorageKind() == FlagValueStorageKind::kOneWordAtomic ||
+         ValueStorageKind() == FlagValueStorageKind::kValueAndInitBit);
+  auto* guard = DataGuard();  // Make sure flag initialized
+  (void)guard;
+  return OneWordValue().load(std::memory_order_acquire);
+}
+
+bool FlagImpl::ReadOneBool() const {
+  assert(ValueStorageKind() == FlagValueStorageKind::kValueAndInitBit);
+  auto* guard = DataGuard();  // Make sure flag initialized
+  (void)guard;
+  return absl::bit_cast<FlagValueAndInitBit<bool>>(
+             OneWordValue().load(std::memory_order_acquire))
+      .value;
+}
+
 void FlagImpl::ReadSequenceLockedData(void* dst) const {
   int size = Sizeof(op_);
   // Attempt to read using the sequence lock.
diff --git a/third_party/abseil-cpp/absl/flags/internal/flag.h b/third_party/abseil-cpp/absl/flags/internal/flag.h
index e6bade0..8636fad 100644
--- a/third_party/abseil-cpp/absl/flags/internal/flag.h
+++ b/third_party/abseil-cpp/absl/flags/internal/flag.h
@@ -29,6 +29,7 @@
 
 #include "absl/base/attributes.h"
 #include "absl/base/call_once.h"
+#include "absl/base/casts.h"
 #include "absl/base/config.h"
 #include "absl/base/optimization.h"
 #include "absl/base/thread_annotations.h"
@@ -305,48 +306,71 @@
 constexpr int64_t UninitializedFlagValue() { return 0xababababababababll; }
 
 template <typename T>
+using FlagUseValueAndInitBitStorage = std::integral_constant<
+    bool, absl::type_traits_internal::is_trivially_copyable<T>::value &&
+              std::is_default_constructible<T>::value && (sizeof(T) < 8)>;
+
+template <typename T>
 using FlagUseOneWordStorage = std::integral_constant<
     bool, absl::type_traits_internal::is_trivially_copyable<T>::value &&
               (sizeof(T) <= 8)>;
 
 template <class T>
-using FlagShouldUseSequenceLock = std::integral_constant<
+using FlagUseSequenceLockStorage = std::integral_constant<
     bool, absl::type_traits_internal::is_trivially_copyable<T>::value &&
               (sizeof(T) > 8)>;
 
 enum class FlagValueStorageKind : uint8_t {
-  kAlignedBuffer = 0,
+  kValueAndInitBit = 0,
   kOneWordAtomic = 1,
   kSequenceLocked = 2,
+  kAlignedBuffer = 3,
 };
 
 template <typename T>
 static constexpr FlagValueStorageKind StorageKind() {
-  return FlagUseOneWordStorage<T>::value ? FlagValueStorageKind::kOneWordAtomic
-         : FlagShouldUseSequenceLock<T>::value
+  return FlagUseValueAndInitBitStorage<T>::value
+             ? FlagValueStorageKind::kValueAndInitBit
+         : FlagUseOneWordStorage<T>::value
+             ? FlagValueStorageKind::kOneWordAtomic
+         : FlagUseSequenceLockStorage<T>::value
              ? FlagValueStorageKind::kSequenceLocked
              : FlagValueStorageKind::kAlignedBuffer;
 }
 
 struct FlagOneWordValue {
-  constexpr FlagOneWordValue() : value(UninitializedFlagValue()) {}
-
+  constexpr explicit FlagOneWordValue(int64_t v) : value(v) {}
   std::atomic<int64_t> value;
 };
 
+template <typename T>
+struct alignas(8) FlagValueAndInitBit {
+  T value;
+  // Use an int instead of a bool to guarantee that a non-zero value has
+  // a bit set.
+  uint8_t init;
+};
+
 template <typename T,
           FlagValueStorageKind Kind = flags_internal::StorageKind<T>()>
 struct FlagValue;
 
 template <typename T>
-struct FlagValue<T, FlagValueStorageKind::kAlignedBuffer> {
-  bool Get(const SequenceLock&, T&) const { return false; }
-
-  alignas(T) char value[sizeof(T)];
+struct FlagValue<T, FlagValueStorageKind::kValueAndInitBit> : FlagOneWordValue {
+  constexpr FlagValue() : FlagOneWordValue(0) {}
+  bool Get(const SequenceLock&, T& dst) const {
+    int64_t storage = value.load(std::memory_order_acquire);
+    if (ABSL_PREDICT_FALSE(storage == 0)) {
+      return false;
+    }
+    dst = absl::bit_cast<FlagValueAndInitBit<T>>(storage).value;
+    return true;
+  }
 };
 
 template <typename T>
 struct FlagValue<T, FlagValueStorageKind::kOneWordAtomic> : FlagOneWordValue {
+  constexpr FlagValue() : FlagOneWordValue(UninitializedFlagValue()) {}
   bool Get(const SequenceLock&, T& dst) const {
     int64_t one_word_val = value.load(std::memory_order_acquire);
     if (ABSL_PREDICT_FALSE(one_word_val == UninitializedFlagValue())) {
@@ -370,6 +394,13 @@
       std::atomic<uint64_t>) std::atomic<uint64_t> value_words[kNumWords];
 };
 
+template <typename T>
+struct FlagValue<T, FlagValueStorageKind::kAlignedBuffer> {
+  bool Get(const SequenceLock&, T&) const { return false; }
+
+  alignas(T) char value[sizeof(T)];
+};
+
 ///////////////////////////////////////////////////////////////////////////////
 // Flag callback auxiliary structs.
 
@@ -415,7 +446,27 @@
         data_guard_{} {}
 
   // Constant access methods
+  int64_t ReadOneWord() const ABSL_LOCKS_EXCLUDED(*DataGuard());
+  bool ReadOneBool() const ABSL_LOCKS_EXCLUDED(*DataGuard());
   void Read(void* dst) const override ABSL_LOCKS_EXCLUDED(*DataGuard());
+  void Read(bool* value) const ABSL_LOCKS_EXCLUDED(*DataGuard()) {
+    *value = ReadOneBool();
+  }
+  template <typename T,
+            absl::enable_if_t<flags_internal::StorageKind<T>() ==
+                                  FlagValueStorageKind::kOneWordAtomic,
+                              int> = 0>
+  void Read(T* value) const ABSL_LOCKS_EXCLUDED(*DataGuard()) {
+    int64_t v = ReadOneWord();
+    std::memcpy(value, static_cast<const void*>(&v), sizeof(T));
+  }
+  template <typename T,
+            typename std::enable_if<flags_internal::StorageKind<T>() ==
+                                        FlagValueStorageKind::kValueAndInitBit,
+                                    int>::type = 0>
+  void Read(T* value) const ABSL_LOCKS_EXCLUDED(*DataGuard()) {
+    *value = absl::bit_cast<FlagValueAndInitBit<T>>(ReadOneWord()).value;
+  }
 
   // Mutating access methods
   void Write(const void* src) ABSL_LOCKS_EXCLUDED(*DataGuard());
diff --git a/third_party/abseil-cpp/absl/flags/internal/sequence_lock.h b/third_party/abseil-cpp/absl/flags/internal/sequence_lock.h
index 807b2a7..36318ab 100644
--- a/third_party/abseil-cpp/absl/flags/internal/sequence_lock.h
+++ b/third_party/abseil-cpp/absl/flags/internal/sequence_lock.h
@@ -49,7 +49,7 @@
 // The memory reads and writes protected by this lock must use the provided
 // `TryRead()` and `Write()` functions. These functions behave similarly to
 // `memcpy()`, with one oddity: the protected data must be an array of
-// `std::atomic<int64>`. This is to comply with the C++ standard, which
+// `std::atomic<uint64>`. This is to comply with the C++ standard, which
 // considers data races on non-atomic objects to be undefined behavior. See "Can
 // Seqlocks Get Along With Programming Language Memory Models?"[1] by Hans J.
 // Boehm for more details.
diff --git a/third_party/abseil-cpp/absl/functional/BUILD.bazel b/third_party/abseil-cpp/absl/functional/BUILD.bazel
index ebd9b99..4555cd5 100644
--- a/third_party/abseil-cpp/absl/functional/BUILD.bazel
+++ b/third_party/abseil-cpp/absl/functional/BUILD.bazel
@@ -60,6 +60,7 @@
     linkopts = ABSL_DEFAULT_LINKOPTS,
     deps = [
         "//absl/base:base_internal",
+        "//absl/base:core_headers",
         "//absl/meta:type_traits",
     ],
 )
diff --git a/third_party/abseil-cpp/absl/functional/BUILD.gn b/third_party/abseil-cpp/absl/functional/BUILD.gn
index 7c30ac0..64dadde 100644
--- a/third_party/abseil-cpp/absl/functional/BUILD.gn
+++ b/third_party/abseil-cpp/absl/functional/BUILD.gn
@@ -20,6 +20,7 @@
   public = [ "function_ref.h" ]
   deps = [
     "//third_party/abseil-cpp/absl/base:base_internal",
+    "//third_party/abseil-cpp/absl/base:core_headers",
     "//third_party/abseil-cpp/absl/meta:type_traits",
   ]
 }
diff --git a/third_party/abseil-cpp/absl/functional/CMakeLists.txt b/third_party/abseil-cpp/absl/functional/CMakeLists.txt
index 3919e9a..338ddc6 100644
--- a/third_party/abseil-cpp/absl/functional/CMakeLists.txt
+++ b/third_party/abseil-cpp/absl/functional/CMakeLists.txt
@@ -53,6 +53,7 @@
     ${ABSL_DEFAULT_COPTS}
   DEPS
     absl::base_internal
+    absl::core_headers
     absl::meta
   PUBLIC
 )
diff --git a/third_party/abseil-cpp/absl/functional/function_ref.h b/third_party/abseil-cpp/absl/functional/function_ref.h
index 5790a65..824e3ce 100644
--- a/third_party/abseil-cpp/absl/functional/function_ref.h
+++ b/third_party/abseil-cpp/absl/functional/function_ref.h
@@ -50,6 +50,7 @@
 #include <functional>
 #include <type_traits>
 
+#include "absl/base/attributes.h"
 #include "absl/functional/internal/function_ref.h"
 #include "absl/meta/type_traits.h"
 
@@ -98,7 +99,8 @@
  public:
   // Constructs a FunctionRef from any invokable type.
   template <typename F, typename = EnableIfCompatible<const F&>>
-  FunctionRef(const F& f)  // NOLINT(runtime/explicit)
+  // NOLINTNEXTLINE(runtime/explicit)
+  FunctionRef(const F& f ABSL_ATTRIBUTE_LIFETIME_BOUND)
       : invoker_(&absl::functional_internal::InvokeObject<F, R, Args...>) {
     absl::functional_internal::AssertNonNull(f);
     ptr_.obj = &f;
diff --git a/third_party/abseil-cpp/absl/hash/BUILD.bazel b/third_party/abseil-cpp/absl/hash/BUILD.bazel
index 4b2c220..392b68f 100644
--- a/third_party/abseil-cpp/absl/hash/BUILD.bazel
+++ b/third_party/abseil-cpp/absl/hash/BUILD.bazel
@@ -37,7 +37,7 @@
     linkopts = ABSL_DEFAULT_LINKOPTS,
     deps = [
         ":city",
-        ":wyhash",
+        ":low_level_hash",
         "//absl/base:config",
         "//absl/base:core_headers",
         "//absl/base:endian",
@@ -143,27 +143,28 @@
 )
 
 cc_library(
-    name = "wyhash",
-    srcs = ["internal/wyhash.cc"],
-    hdrs = ["internal/wyhash.h"],
+    name = "low_level_hash",
+    srcs = ["internal/low_level_hash.cc"],
+    hdrs = ["internal/low_level_hash.h"],
     copts = ABSL_DEFAULT_COPTS,
     linkopts = ABSL_DEFAULT_LINKOPTS,
     visibility = ["//visibility:private"],
     deps = [
         "//absl/base:config",
         "//absl/base:endian",
+        "//absl/numeric:bits",
         "//absl/numeric:int128",
     ],
 )
 
 cc_test(
-    name = "wyhash_test",
-    srcs = ["internal/wyhash_test.cc"],
+    name = "low_level_hash_test",
+    srcs = ["internal/low_level_hash_test.cc"],
     copts = ABSL_TEST_COPTS,
     linkopts = ABSL_DEFAULT_LINKOPTS,
     visibility = ["//visibility:private"],
     deps = [
-        ":wyhash",
+        ":low_level_hash",
         "//absl/strings",
         "@com_google_googletest//:gtest_main",
     ],
diff --git a/third_party/abseil-cpp/absl/hash/BUILD.gn b/third_party/abseil-cpp/absl/hash/BUILD.gn
index 3e239b4..bec226c 100644
--- a/third_party/abseil-cpp/absl/hash/BUILD.gn
+++ b/third_party/abseil-cpp/absl/hash/BUILD.gn
@@ -13,7 +13,7 @@
   public = [ "hash.h" ]
   deps = [
     ":city",
-    ":wyhash",
+    ":low_level_hash",
     "//third_party/abseil-cpp/absl/base:config",
     "//third_party/abseil-cpp/absl/base:core_headers",
     "//third_party/abseil-cpp/absl/base:endian",
@@ -60,13 +60,25 @@
   ]
 }
 
-absl_source_set("wyhash") {
-  public = [ "internal/wyhash.h" ]
-  sources = [ "internal/wyhash.cc" ]
+absl_source_set("low_level_hash") {
+  public = [ "internal/low_level_hash.h" ]
+  sources = [ "internal/low_level_hash.cc" ]
   deps = [
     "//third_party/abseil-cpp/absl/base:config",
     "//third_party/abseil-cpp/absl/base:endian",
+    "//third_party/abseil-cpp/absl/numeric:bits",
     "//third_party/abseil-cpp/absl/numeric:int128",
   ]
   visibility = [ ":*" ]
 }
+
+absl_source_set("low_level_hash_test") {
+  testonly = true
+  sources = [ "internal/low_level_hash_test.cc" ]
+  deps = [
+    ":low_level_hash",
+    "//third_party/abseil-cpp/absl/strings",
+    "//third_party/googletest:gtest",
+    "//third_party/googletest:gmock",
+  ]
+}
diff --git a/third_party/abseil-cpp/absl/hash/CMakeLists.txt b/third_party/abseil-cpp/absl/hash/CMakeLists.txt
index c82f66f..5916ae3 100644
--- a/third_party/abseil-cpp/absl/hash/CMakeLists.txt
+++ b/third_party/abseil-cpp/absl/hash/CMakeLists.txt
@@ -36,7 +36,7 @@
     absl::optional
     absl::variant
     absl::utility
-    absl::wyhash
+    absl::low_level_hash
   PUBLIC
 )
 
@@ -118,14 +118,15 @@
 
 absl_cc_library(
   NAME
-    wyhash
+    low_level_hash
   HDRS
-    "internal/wyhash.h"
+    "internal/low_level_hash.h"
   SRCS
-    "internal/wyhash.cc"
+    "internal/low_level_hash.cc"
   COPTS
     ${ABSL_DEFAULT_COPTS}
   DEPS
+    absl::bits
     absl::config
     absl::endian
     absl::int128
@@ -133,13 +134,13 @@
 
 absl_cc_test(
   NAME
-    wyhash_test
+    low_level_hash_test
   SRCS
-    "internal/wyhash_test.cc"
+    "internal/low_level_hash_test.cc"
   COPTS
     ${ABSL_TEST_COPTS}
   DEPS
-    absl::wyhash
+    absl::low_level_hash
     absl::strings
     GTest::gmock_main
 )
diff --git a/third_party/abseil-cpp/absl/hash/internal/hash.cc b/third_party/abseil-cpp/absl/hash/internal/hash.cc
index 06f53a5..4b81891 100644
--- a/third_party/abseil-cpp/absl/hash/internal/hash.cc
+++ b/third_party/abseil-cpp/absl/hash/internal/hash.cc
@@ -46,21 +46,22 @@
 
 ABSL_CONST_INIT const void* const MixingHashState::kSeed = &kSeed;
 
-// The salt array used by Wyhash. This array is NOT the mechanism used to make
-// absl::Hash non-deterministic between program invocations.  See `Seed()` for
-// that mechanism.
+// The salt array used by LowLevelHash. This array is NOT the mechanism used to
+// make absl::Hash non-deterministic between program invocations.  See `Seed()`
+// for that mechanism.
 //
 // Any random values are fine. These values are just digits from the decimal
 // part of pi.
 // https://en.wikipedia.org/wiki/Nothing-up-my-sleeve_number
-constexpr uint64_t kWyhashSalt[5] = {
+constexpr uint64_t kHashSalt[5] = {
     uint64_t{0x243F6A8885A308D3}, uint64_t{0x13198A2E03707344},
     uint64_t{0xA4093822299F31D0}, uint64_t{0x082EFA98EC4E6C89},
     uint64_t{0x452821E638D01377},
 };
 
-uint64_t MixingHashState::WyhashImpl(const unsigned char* data, size_t len) {
-  return Wyhash(data, len, Seed(), kWyhashSalt);
+uint64_t MixingHashState::LowLevelHashImpl(const unsigned char* data,
+                                           size_t len) {
+  return LowLevelHash(data, len, Seed(), kHashSalt);
 }
 
 }  // namespace hash_internal
diff --git a/third_party/abseil-cpp/absl/hash/internal/hash.h b/third_party/abseil-cpp/absl/hash/internal/hash.h
index 90627e0..f517409 100644
--- a/third_party/abseil-cpp/absl/hash/internal/hash.h
+++ b/third_party/abseil-cpp/absl/hash/internal/hash.h
@@ -42,7 +42,7 @@
 #include "absl/base/internal/unaligned_access.h"
 #include "absl/base/port.h"
 #include "absl/container/fixed_array.h"
-#include "absl/hash/internal/wyhash.h"
+#include "absl/hash/internal/low_level_hash.h"
 #include "absl/meta/type_traits.h"
 #include "absl/numeric/int128.h"
 #include "absl/strings/string_view.h"
@@ -874,14 +874,14 @@
     return static_cast<uint64_t>(m ^ (m >> (sizeof(m) * 8 / 2)));
   }
 
-  // An extern to avoid bloat on a direct call to Wyhash() with fixed values for
-  // both the seed and salt parameters.
-  static uint64_t WyhashImpl(const unsigned char* data, size_t len);
+  // An extern to avoid bloat on a direct call to LowLevelHash() with fixed
+  // values for both the seed and salt parameters.
+  static uint64_t LowLevelHashImpl(const unsigned char* data, size_t len);
 
   ABSL_ATTRIBUTE_ALWAYS_INLINE static uint64_t Hash64(const unsigned char* data,
                                                       size_t len) {
 #ifdef ABSL_HAVE_INTRINSIC_INT128
-    return WyhashImpl(data, len);
+    return LowLevelHashImpl(data, len);
 #else
     return absl::hash_internal::CityHash64(reinterpret_cast<const char*>(data), len);
 #endif
@@ -945,8 +945,8 @@
 inline uint64_t MixingHashState::CombineContiguousImpl(
     uint64_t state, const unsigned char* first, size_t len,
     std::integral_constant<int, 8> /* sizeof_size_t */) {
-  // For large values we use Wyhash or CityHash depending on the platform, for
-  // small ones we just use a multiplicative hash.
+  // For large values we use LowLevelHash or CityHash depending on the platform,
+  // for small ones we just use a multiplicative hash.
   uint64_t v;
   if (len > 16) {
     if (ABSL_PREDICT_FALSE(len > PiecewiseChunkSize())) {
diff --git a/third_party/abseil-cpp/absl/hash/internal/wyhash.cc b/third_party/abseil-cpp/absl/hash/internal/low_level_hash.cc
similarity index 75%
rename from third_party/abseil-cpp/absl/hash/internal/wyhash.cc
rename to third_party/abseil-cpp/absl/hash/internal/low_level_hash.cc
index 642bde4..6f9cb9c 100644
--- a/third_party/abseil-cpp/absl/hash/internal/wyhash.cc
+++ b/third_party/abseil-cpp/absl/hash/internal/low_level_hash.cc
@@ -12,23 +12,35 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-#include "absl/hash/internal/wyhash.h"
+#include "absl/hash/internal/low_level_hash.h"
 
 #include "absl/base/internal/unaligned_access.h"
+#include "absl/numeric/bits.h"
 #include "absl/numeric/int128.h"
 
 namespace absl {
 ABSL_NAMESPACE_BEGIN
 namespace hash_internal {
 
-static uint64_t WyhashMix(uint64_t v0, uint64_t v1) {
+static uint64_t Mix(uint64_t v0, uint64_t v1) {
+#if !defined(__aarch64__)
+  // The default bit-mixer uses 64x64->128-bit multiplication.
   absl::uint128 p = v0;
   p *= v1;
   return absl::Uint128Low64(p) ^ absl::Uint128High64(p);
+#else
+  // The default bit-mixer above would perform poorly on some ARM microarchs,
+  // where calculating a 128-bit product requires a sequence of two
+  // instructions with a high combined latency and poor throughput.
+  // Instead, we mix bits using only 64-bit arithmetic, which is faster.
+  uint64_t p = v0 ^ absl::rotl(v1, 40);
+  p *= v1 ^ absl::rotl(v0, 39);
+  return p ^ (p >> 11);
+#endif
 }
 
-uint64_t Wyhash(const void* data, size_t len, uint64_t seed,
-                const uint64_t salt[]) {
+uint64_t LowLevelHash(const void* data, size_t len, uint64_t seed,
+                      const uint64_t salt[]) {
   const uint8_t* ptr = static_cast<const uint8_t*>(data);
   uint64_t starting_length = static_cast<uint64_t>(len);
   uint64_t current_state = seed ^ salt[0];
@@ -49,12 +61,12 @@
       uint64_t g = absl::base_internal::UnalignedLoad64(ptr + 48);
       uint64_t h = absl::base_internal::UnalignedLoad64(ptr + 56);
 
-      uint64_t cs0 = WyhashMix(a ^ salt[1], b ^ current_state);
-      uint64_t cs1 = WyhashMix(c ^ salt[2], d ^ current_state);
+      uint64_t cs0 = Mix(a ^ salt[1], b ^ current_state);
+      uint64_t cs1 = Mix(c ^ salt[2], d ^ current_state);
       current_state = (cs0 ^ cs1);
 
-      uint64_t ds0 = WyhashMix(e ^ salt[3], f ^ duplicated_state);
-      uint64_t ds1 = WyhashMix(g ^ salt[4], h ^ duplicated_state);
+      uint64_t ds0 = Mix(e ^ salt[3], f ^ duplicated_state);
+      uint64_t ds1 = Mix(g ^ salt[4], h ^ duplicated_state);
       duplicated_state = (ds0 ^ ds1);
 
       ptr += 64;
@@ -70,7 +82,7 @@
     uint64_t a = absl::base_internal::UnalignedLoad64(ptr);
     uint64_t b = absl::base_internal::UnalignedLoad64(ptr + 8);
 
-    current_state = WyhashMix(a ^ salt[1], b ^ current_state);
+    current_state = Mix(a ^ salt[1], b ^ current_state);
 
     ptr += 16;
     len -= 16;
@@ -101,9 +113,9 @@
     b = 0;
   }
 
-  uint64_t w = WyhashMix(a ^ salt[1], b ^ current_state);
+  uint64_t w = Mix(a ^ salt[1], b ^ current_state);
   uint64_t z = salt[1] ^ starting_length;
-  return WyhashMix(w, z);
+  return Mix(w, z);
 }
 
 }  // namespace hash_internal
diff --git a/third_party/abseil-cpp/absl/hash/internal/wyhash.h b/third_party/abseil-cpp/absl/hash/internal/low_level_hash.h
similarity index 61%
rename from third_party/abseil-cpp/absl/hash/internal/wyhash.h
rename to third_party/abseil-cpp/absl/hash/internal/low_level_hash.h
index 2b534b4..439968a 100644
--- a/third_party/abseil-cpp/absl/hash/internal/wyhash.h
+++ b/third_party/abseil-cpp/absl/hash/internal/low_level_hash.h
@@ -12,16 +12,18 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 //
-// This file provides the Google-internal implementation of the Wyhash
-// algorithm.
+// This file provides the Google-internal implementation of LowLevelHash.
 //
-// Wyhash is a fast hash function for hash tables, the fastest we've currently
-// (late 2020) found that passes the SMHasher tests. The algorithm relies on
-// intrinsic 128-bit multiplication for speed. This is not meant to be secure -
-// just fast.
+// LowLevelHash is a fast hash function for hash tables, the fastest we've
+// currently (late 2020) found that passes the SMHasher tests. The algorithm
+// relies on intrinsic 128-bit multiplication for speed. This is not meant to be
+// secure - just fast.
+//
+// It is closely based on a version of wyhash, but does not maintain or
+// guarantee future compatibility with it.
 
-#ifndef ABSL_HASH_INTERNAL_WYHASH_H_
-#define ABSL_HASH_INTERNAL_WYHASH_H_
+#ifndef ABSL_HASH_INTERNAL_LOW_LEVEL_HASH_H_
+#define ABSL_HASH_INTERNAL_LOW_LEVEL_HASH_H_
 
 #include <stdint.h>
 #include <stdlib.h>
@@ -38,11 +40,11 @@
 // To allow all hashable types (including string_view and Span) to depend on
 // this algorithm, we keep the API low-level, with as few dependencies as
 // possible.
-uint64_t Wyhash(const void* data, size_t len, uint64_t seed,
-                const uint64_t salt[5]);
+uint64_t LowLevelHash(const void* data, size_t len, uint64_t seed,
+                      const uint64_t salt[5]);
 
 }  // namespace hash_internal
 ABSL_NAMESPACE_END
 }  // namespace absl
 
-#endif  // ABSL_HASH_INTERNAL_WYHASH_H_
+#endif  // ABSL_HASH_INTERNAL_LOW_LEVEL_HASH_H_
diff --git a/third_party/abseil-cpp/absl/hash/internal/low_level_hash_test.cc b/third_party/abseil-cpp/absl/hash/internal/low_level_hash_test.cc
new file mode 100644
index 0000000..cf22dc3
--- /dev/null
+++ b/third_party/abseil-cpp/absl/hash/internal/low_level_hash_test.cc
@@ -0,0 +1,532 @@
+// Copyright 2020 The Abseil Authors
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     https://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include "absl/hash/internal/low_level_hash.h"
+
+#include <cinttypes>
+
+#include "gmock/gmock.h"
+#include "gtest/gtest.h"
+#include "absl/strings/escaping.h"
+
+#define UPDATE_GOLDEN 0
+
+namespace {
+
+static const uint64_t kSalt[5] = {0xa0761d6478bd642f, 0xe7037ed1a0b428dbl,
+                                  0x8ebc6af09c88c6e3, 0x589965cc75374cc3l,
+                                  0x1d8e4e27c47d124f};
+
+TEST(LowLevelHashTest, VerifyGolden) {
+  constexpr size_t kNumGoldenOutputs = 134;
+  static struct {
+    absl::string_view base64_data;
+    uint64_t seed;
+  } cases[] = {
+      {"", uint64_t{0xec42b7ab404b8acb}},
+      {"ICAg", uint64_t{0}},
+      {"YWFhYQ==", uint64_t{0}},
+      {"AQID", uint64_t{0}},
+      {"AQIDBA==", uint64_t{0}},
+      {"dGhpcmRfcGFydHl8d3loYXNofDY0", uint64_t{0}},
+      {"Zw==", uint64_t{0xeeee074043a3ee0f}},
+      {"xmk=", uint64_t{0x857902089c393de}},
+      {"c1H/", uint64_t{0x993df040024ca3af}},
+      {"SuwpzQ==", uint64_t{0xc4e4c2acea740e96}},
+      {"uqvy++M=", uint64_t{0x6a214b3db872d0cf}},
+      {"RnzCVPgb", uint64_t{0x44343db6a89dba4d}},
+      {"6OeNdlouYw==", uint64_t{0x77b5d6d1ae1dd483}},
+      {"M5/JmmYyDbc=", uint64_t{0x89ab8ecb44d221f1}},
+      {"MVijWiVdBRdY", uint64_t{0x60244b17577ca81b}},
+      {"6V7Uq7LNxpu0VA==", uint64_t{0x59a08dcee0717067}},
+      {"EQ6CdEEhPdyHcOk=", uint64_t{0xf5f20db3ade57396}},
+      {"PqFB4fxnPgF+l+rc", uint64_t{0xbf8dee0751ad3efb}},
+      {"a5aPOFwq7LA7+zKvPA==", uint64_t{0x6b7a06b268d63e30}},
+      {"VOwY21wCGv5D+/qqOvs=", uint64_t{0xb8c37f0ae0f54c82}},
+      {"KdHmBTx8lHXYvmGJ+Vy7", uint64_t{0x9fcbed0c38e50eef}},
+      {"qJkPlbHr8bMF7/cA6aE65Q==", uint64_t{0x2af4bade1d8e3a1d}},
+      {"ygvL0EhHZL0fIx6oHHtkxRQ=", uint64_t{0x714e3aa912da2f2c}},
+      {"c1rFXkt5YztwZCQRngncqtSs", uint64_t{0xf5ee75e3cbb82c1c}},
+      {"8hsQrzszzeNQSEcVXLtvIhm6mw==", uint64_t{0x620e7007321b93b9}},
+      {"ffUL4RocfyP4KfikGxO1yk7omDI=", uint64_t{0xc08528cac2e551fc}},
+      {"OOB5TT00vF9Od/rLbAWshiErqhpV", uint64_t{0x6a1debf9cc3ad39}},
+      {"or5wtXM7BFzTNpSzr+Lw5J5PMhVJ/Q==", uint64_t{0x7e0a3c88111fc226}},
+      {"gk6pCHDUsoopVEiaCrzVDhioRKxb844=", uint64_t{0x1301fef15df39edb}},
+      {"TNctmwlC5QbEM6/No4R/La3UdkfeMhzs", uint64_t{0x64e181f3d5817ab}},
+      {"SsQw9iAjhWz7sgcE9OwLuSC6hsM+BfHs2Q==", uint64_t{0xafafc44961078ecb}},
+      {"ZzO3mVCj4xTT2TT3XqDyEKj2BZQBvrS8RHg=", uint64_t{0x4f7bb45549250094}},
+      {"+klp5iPQGtppan5MflEls0iEUzqU+zGZkDJX", uint64_t{0xa30061abaa2818c}},
+      {"RO6bvOnlJc8I9eniXlNgqtKy0IX6VNg16NRmgg==",
+       uint64_t{0xd902ee3e44a5705f}},
+      {"ZJjZqId1ZXBaij9igClE3nyliU5XWdNRrayGlYA=", uint64_t{0x316d36da516f583}},
+      {"7BfkhfGMDGbxfMB8uyL85GbaYQtjr2K8g7RpLzr/",
+       uint64_t{0x402d83f9f834f616}},
+      {"rycWk6wHH7htETQtje9PidS2YzXBx+Qkg2fY7ZYS7A==",
+       uint64_t{0x9c604164c016b72c}},
+      {"RTkC2OUK+J13CdGllsH0H5WqgspsSa6QzRZouqx6pvI=",
+       uint64_t{0x3f4507e01f9e73ba}},
+      {"tKjKmbLCNyrLCM9hycOAXm4DKNpM12oZ7dLTmUx5iwAi",
+       uint64_t{0xc3fe0d5be8d2c7c7}},
+      {"VprUGNH+5NnNRaORxgH/ySrZFQFDL+4VAodhfBNinmn8cg==",
+       uint64_t{0x531858a40bfa7ea1}},
+      {"gc1xZaY+q0nPcUvOOnWnT3bqfmT/geth/f7Dm2e/DemMfk4=",
+       uint64_t{0x86689478a7a7e8fa}},
+      {"Mr35fIxqx1ukPAL0su1yFuzzAU3wABCLZ8+ZUFsXn47UmAph",
+       uint64_t{0x4ec948b8e7f27288}},
+      {"A9G8pw2+m7+rDtWYAdbl8tb2fT7FFo4hLi2vAsa5Y8mKH3CX3g==",
+       uint64_t{0xce46c7213c10032}},
+      {"DFaJGishGwEHDdj9ixbCoaTjz9KS0phLNWHVVdFsM93CvPft3hM=",
+       uint64_t{0xf63e96ee6f32a8b6}},
+      {"7+Ugx+Kr3aRNgYgcUxru62YkTDt5Hqis+2po81hGBkcrJg4N0uuy",
+       uint64_t{0x1cfe85e65fc5225}},
+      {"H2w6O8BUKqu6Tvj2xxaecxEI2wRgIgqnTTG1WwOgDSINR13Nm4d4Vg==",
+       uint64_t{0x45c474f1cee1d2e8}},
+      {"1XBMnIbqD5jy65xTDaf6WtiwtdtQwv1dCVoqpeKj+7cTR1SaMWMyI04=",
+       uint64_t{0x6e024e14015f329c}},
+      {"znZbdXG2TSFrKHEuJc83gPncYpzXGbAebUpP0XxzH0rpe8BaMQ17nDbt",
+       uint64_t{0x760c40502103ae1c}},
+      {"ylu8Atu13j1StlcC1MRMJJXIl7USgDDS22HgVv0WQ8hx/8pNtaiKB17hCQ==",
+       uint64_t{0x17fd05c3c560c320}},
+      {"M6ZVVzsd7vAvbiACSYHioH/440dp4xG2mLlBnxgiqEvI/aIEGpD0Sf4VS0g=",
+       uint64_t{0x8b34200a6f8e90d9}},
+      {"li3oFSXLXI+ubUVGJ4blP6mNinGKLHWkvGruun85AhVn6iuMtocbZPVhqxzn",
+       uint64_t{0x6be89e50818bdf69}},
+      {"kFuQHuUCqBF3Tc3hO4dgdIp223ShaCoog48d5Do5zMqUXOh5XpGK1t5XtxnfGA==",
+       uint64_t{0xfb389773315b47d8}},
+      {"jWmOad0v0QhXVJd1OdGuBZtDYYS8wBVHlvOeTQx9ZZnm8wLEItPMeihj72E0nWY=",
+       uint64_t{0x4f2512a23f61efee}},
+      {"z+DHU52HaOQdW4JrZwDQAebEA6rm13Zg/9lPYA3txt3NjTBqFZlOMvTRnVzRbl23",
+       uint64_t{0x59ccd92fc16c6fda}},
+      {"MmBiGDfYeTayyJa/tVycg+rN7f9mPDFaDc+23j0TlW9094er0ADigsl4QX7V3gG/qw==",
+       uint64_t{0x25c5a7f5bd330919}},
+      {"774RK+9rOL4iFvs1q2qpo/JVc/I39buvNjqEFDtDvyoB0FXxPI2vXqOrk08VPfIHkmU=",
+       uint64_t{0x51df4174d34c97d7}},
+      {"+slatXiQ7/2lK0BkVUI1qzNxOOLP3I1iK6OfHaoxgqT63FpzbElwEXSwdsryq3UlHK0I",
+       uint64_t{0x80ce6d76f89cb57}},
+      {"64mVTbQ47dHjHlOHGS/hjJwr/"
+       "K2frCNpn87exOqMzNUVYiPKmhCbfS7vBUce5tO6Ec9osQ==",
+       uint64_t{0x20961c911965f684}},
+      {"fIsaG1r530SFrBqaDj1kqE0AJnvvK8MNEZbII2Yw1OK77v0V59xabIh0B5axaz/"
+       "+a2V5WpA=",
+       uint64_t{0x4e5b926ec83868e7}},
+      {"PGih0zDEOWCYGxuHGDFu9Ivbff/"
+       "iE7BNUq65tycTR2R76TerrXALRosnzaNYO5fjFhTi+CiS",
+       uint64_t{0x3927b30b922eecef}},
+      {"RnpA/"
+       "zJnEnnLjmICORByRVb9bCOgxF44p3VMiW10G7PvW7IhwsWajlP9kIwNA9FjAD2GoQHk2Q="
+       "=",
+       uint64_t{0xbd0291284a49b61c}},
+      {"qFklMceaTHqJpy2qavJE+EVBiNFOi6OxjOA3LeIcBop1K7w8xQi3TrDk+"
+       "BrWPRIbfprszSaPfrI=",
+       uint64_t{0x73a77c575bcc956}},
+      {"cLbfUtLl3EcQmITWoTskUR8da/VafRDYF/ylPYwk7/"
+       "zazk6ssyrzxMN3mmSyvrXR2yDGNZ3WDrTT",
+       uint64_t{0x766a0e2ade6d09a6}},
+      {"s/"
+       "Jf1+"
+       "FbsbCpXWPTUSeWyMH6e4CvTFvPE5Fs6Z8hvFITGyr0dtukHzkI84oviVLxhM1xMxrMAy1db"
+       "w==",
+       uint64_t{0x2599f4f905115869}},
+      {"FvyQ00+j7nmYZVQ8hI1Edxd0AWplhTfWuFGiu34AK5X8u2hLX1bE97sZM0CmeLe+"
+       "7LgoUT1fJ/axybE=",
+       uint64_t{0xd8256e5444d21e53}},
+      {"L8ncxMaYLBH3g9buPu8hfpWZNlOF7nvWLNv9IozH07uQsIBWSKxoPy8+"
+       "LW4tTuzC6CIWbRGRRD1sQV/4",
+       uint64_t{0xf664a91333fb8dfd}},
+      {"CDK0meI07yrgV2kQlZZ+"
+       "wuVqhc2NmzqeLH7bmcA6kchsRWFPeVF5Wqjjaj556ABeUoUr3yBmfU3kWOakkg==",
+       uint64_t{0x9625b859be372cd1}},
+      {"d23/vc5ONh/"
+       "HkMiq+gYk4gaCNYyuFKwUkvn46t+dfVcKfBTYykr4kdvAPNXGYLjM4u1YkAEFpJP+"
+       "nX7eOvs=",
+       uint64_t{0x7b99940782e29898}},
+      {"NUR3SRxBkxTSbtQORJpu/GdR6b/h6sSGfsMj/KFd99ahbh+9r7LSgSGmkGVB/"
+       "mGoT0pnMTQst7Lv2q6QN6Vm",
+       uint64_t{0x4fe12fa5383b51a8}},
+      {"2BOFlcI3Z0RYDtS9T9Ie9yJoXlOdigpPeeT+CRujb/"
+       "O39Ih5LPC9hP6RQk1kYESGyaLZZi3jtabHs7DiVx/VDg==",
+       uint64_t{0xe2ccb09ac0f5b4b6}},
+      {"FF2HQE1FxEvWBpg6Z9zAMH+Zlqx8S1JD/"
+       "wIlViL6ZDZY63alMDrxB0GJQahmAtjlm26RGLnjW7jmgQ4Ie3I+014=",
+       uint64_t{0x7d0a37adbd7b753b}},
+      {"tHmO7mqVL/PX11nZrz50Hc+M17Poj5lpnqHkEN+4bpMx/"
+       "YGbkrGOaYjoQjgmt1X2QyypK7xClFrjeWrCMdlVYtbW",
+       uint64_t{0xd3ae96ef9f7185f2}},
+      {"/WiHi9IQcxRImsudkA/KOTqGe8/"
+       "gXkhKIHkjddv5S9hi02M049dIK3EUyAEjkjpdGLUs+BN0QzPtZqjIYPOgwsYE9g==",
+       uint64_t{0x4fb88ea63f79a0d8}},
+      {"qds+1ExSnU11L4fTSDz/QE90g4Jh6ioqSh3KDOTOAo2pQGL1k/"
+       "9CCC7J23YF27dUTzrWsCQA2m4epXoCc3yPHb3xElA=",
+       uint64_t{0xed564e259bb5ebe9}},
+      {"8FVYHx40lSQPTHheh08Oq0/"
+       "pGm2OlG8BEf8ezvAxHuGGdgCkqpXIueJBF2mQJhTfDy5NncO8ntS7vaKs7sCNdDaNGOEi",
+       uint64_t{0x3e3256b60c428000}},
+      {"4ZoEIrJtstiCkeew3oRzmyJHVt/pAs2pj0HgHFrBPztbQ10NsQ/"
+       "lM6DM439QVxpznnBSiHMgMQJhER+70l72LqFTO1JiIQ==",
+       uint64_t{0xfb05bad59ec8705}},
+      {"hQPtaYI+wJyxXgwD5n8jGIKFKaFA/"
+       "P83KqCKZfPthnjwdOFysqEOYwAaZuaaiv4cDyi9TyS8hk5cEbNP/jrI7q6pYGBLbsM=",
+       uint64_t{0xafdc251dbf97b5f8}},
+      {"S4gpMSKzMD7CWPsSfLeYyhSpfWOntyuVZdX1xSBjiGvsspwOZcxNKCRIOqAA0moUfOh3I5+"
+       "juQV4rsqYElMD/gWfDGpsWZKQ",
+       uint64_t{0x10ec9c92ddb5dcbc}},
+      {"oswxop+"
+       "bthuDLT4j0PcoSKby4LhF47ZKg8K17xxHf74UsGCzTBbOz0MM8hQEGlyqDT1iUiAYnaPaUp"
+       "L2mRK0rcIUYA4qLt5uOw==",
+       uint64_t{0x9a767d5822c7dac4}},
+      {"0II/"
+       "697p+"
+       "BtLSjxj5989OXI004TogEb94VUnDzOVSgMXie72cuYRvTFNIBgtXlKfkiUjeqVpd4a+"
+       "n5bxNOD1TGrjQtzKU5r7obo=",
+       uint64_t{0xee46254080d6e2db}},
+      {"E84YZW2qipAlMPmctrg7TKlwLZ68l4L+c0xRDUfyyFrA4MAti0q9sHq3TDFviH0Y+"
+       "Kq3tEE5srWFA8LM9oomtmvm5PYxoaarWPLc",
+       uint64_t{0xbbb669588d8bf398}},
+      {"x3pa4HIElyZG0Nj7Vdy9IdJIR4izLmypXw5PCmZB5y68QQ4uRaVVi3UthsoJROvbjDJkP2D"
+       "Q6L/eN8pFeLFzNPKBYzcmuMOb5Ull7w==",
+       uint64_t{0xdc2afaa529beef44}},
+      {"jVDKGYIuWOP/"
+       "QKLdd2wi8B2VJA8Wh0c8PwrXJVM8FOGM3voPDVPyDJOU6QsBDPseoR8uuKd19OZ/"
+       "zAvSCB+zlf6upAsBlheUKgCfKww=",
+       uint64_t{0xf1f67391d45013a8}},
+      {"mkquunhmYe1aR2wmUz4vcvLEcKBoe6H+kjUok9VUn2+eTSkWs4oDDtJvNCWtY5efJwg/"
+       "j4PgjRYWtqnrCkhaqJaEvkkOwVfgMIwF3e+d",
+       uint64_t{0x16fce2b8c65a3429}},
+      {"fRelvKYonTQ+s+rnnvQw+JzGfFoPixtna0vzcSjiDqX5s2Kg2//"
+       "UGrK+AVCyMUhO98WoB1DDbrsOYSw2QzrcPe0+3ck9sePvb+Q/IRaHbw==",
+       uint64_t{0xf4b096699f49fe67}},
+      {"DUwXFJzagljo44QeJ7/"
+       "6ZKw4QXV18lhkYT2jglMr8WB3CHUU4vdsytvw6AKv42ZcG6fRkZkq9fpnmXy6xG0aO3WPT1"
+       "eHuyFirAlkW+zKtwg=",
+       uint64_t{0xca584c4bc8198682}},
+      {"cYmZCrOOBBongNTr7e4nYn52uQUy2mfe48s50JXx2AZ6cRAt/"
+       "xRHJ5QbEoEJOeOHsJyM4nbzwFm++SlT6gFZZHJpkXJ92JkR86uS/eV1hJUR",
+       uint64_t{0xed269fc3818b6aad}},
+      {"EXeHBDfhwzAKFhsMcH9+2RHwV+mJaN01+9oacF6vgm8mCXRd6jeN9U2oAb0of5c5cO4i+"
+       "Vb/LlHZSMI490SnHU0bejhSCC2gsC5d2K30ER3iNA==",
+       uint64_t{0x33f253cbb8fe66a8}},
+      {"FzkzRYoNjkxFhZDso94IHRZaJUP61nFYrh5MwDwv9FNoJ5jyNCY/"
+       "eazPZk+tbmzDyJIGw2h3GxaWZ9bSlsol/vK98SbkMKCQ/wbfrXRLcDzdd/8=",
+       uint64_t{0xd0b76b2c1523d99c}},
+      {"Re4aXISCMlYY/XsX7zkIFR04ta03u4zkL9dVbLXMa/q6hlY/CImVIIYRN3VKP4pnd0AUr/"
+       "ugkyt36JcstAInb4h9rpAGQ7GMVOgBniiMBZ/MGU7H",
+       uint64_t{0xfd28f0811a2a237f}},
+      {"ueLyMcqJXX+MhO4UApylCN9WlTQ+"
+       "ltJmItgG7vFUtqs2qNwBMjmAvr5u0sAKd8jpzV0dDPTwchbIeAW5zbtkA2NABJV6hFM48ib"
+       "4/J3A5mseA3cS8w==",
+       uint64_t{0x6261fb136482e84}},
+      {"6Si7Yi11L+jZMkwaN+GUuzXMrlvEqviEkGOilNq0h8TdQyYKuFXzkYc/"
+       "q74gP3pVCyiwz9KpVGMM9vfnq36riMHRknkmhQutxLZs5fbmOgEO69HglCU=",
+       uint64_t{0x458efc750bca7c3a}},
+      {"Q6AbOofGuTJOegPh9Clm/"
+       "9crtUMQqylKrTc1fhfJo1tqvpXxhU4k08kntL1RG7woRnFrVh2UoMrL1kjin+s9CanT+"
+       "y4hHwLqRranl9FjvxfVKm3yvg68",
+       uint64_t{0xa7e69ff84e5e7c27}},
+      {"ieQEbIPvqY2YfIjHnqfJiO1/MIVRk0RoaG/WWi3kFrfIGiNLCczYoklgaecHMm/"
+       "1sZ96AjO+a5stQfZbJQwS7Sc1ODABEdJKcTsxeW2hbh9A6CFzpowP1A==",
+       uint64_t{0x3c59bfd0c29efe9e}},
+      {"zQUv8hFB3zh2GGl3KTvCmnfzE+"
+       "SUgQPVaSVIELFX5H9cE3FuVFGmymkPQZJLAyzC90Cmi8GqYCvPqTuAAB//"
+       "XTJxy4bCcVArgZG9zJXpjowpNBfr3ngWrSE=",
+       uint64_t{0x10befacc6afd298d}},
+      {"US4hcC1+op5JKGC7eIs8CUgInjKWKlvKQkapulxW262E/"
+       "B2ye79QxOexf188u2mFwwe3WTISJHRZzS61IwljqAWAWoBAqkUnW8SHmIDwHUP31J0p5sGd"
+       "P47L",
+       uint64_t{0x41d5320b0a38efa7}},
+      {"9bHUWFna2LNaGF6fQLlkx1Hkt24nrkLE2CmFdWgTQV3FFbUe747SSqYw6ebpTa07MWSpWRP"
+       "sHesVo2B9tqHbe7eQmqYebPDFnNqrhSdZwFm9arLQVs+7a3Ic6A==",
+       uint64_t{0x58db1c7450fe17f3}},
+      {"Kb3DpHRUPhtyqgs3RuXjzA08jGb59hjKTOeFt1qhoINfYyfTt2buKhD6YVffRCPsgK9SeqZ"
+       "qRPJSyaqsa0ovyq1WnWW8jI/NhvAkZTVHUrX2pC+cD3OPYT05Dag=",
+       uint64_t{0x6098c055a335b7a6}},
+      {"gzxyMJIPlU+bJBwhFUCHSofZ/"
+       "319LxqMoqnt3+L6h2U2+ZXJCSsYpE80xmR0Ta77Jq54o92SMH87HV8dGOaCTuAYF+"
+       "lDL42SY1P316Cl0sZTS2ow3ZqwGbcPNs/1",
+       uint64_t{0x1bbacec67845a801}},
+      {"uR7V0TW+FGVMpsifnaBAQ3IGlr1wx5sKd7TChuqRe6OvUXTlD4hKWy8S+"
+       "8yyOw8lQabism19vOQxfmocEOW/"
+       "vzY0pEa87qHrAZy4s9fH2Bltu8vaOIe+agYohhYORQ==",
+       uint64_t{0xc419cfc7442190}},
+      {"1UR5eoo2aCwhacjZHaCh9bkOsITp6QunUxHQ2SfeHv0imHetzt/"
+       "Z70mhyWZBalv6eAx+YfWKCUib2SHDtz/"
+       "A2dc3hqUWX5VfAV7FQsghPUAtu6IiRatq4YSLpDvKZBQ=",
+       uint64_t{0xc95e510d94ba270c}},
+      {"opubR7H63BH7OtY+Avd7QyQ25UZ8kLBdFDsBTwZlY6gA/"
+       "u+x+"
+       "czC9AaZMgmQrUy15DH7YMGsvdXnviTtI4eVI4aF1H9Rl3NXMKZgwFOsdTfdcZeeHVRzBBKX"
+       "8jUfh1il",
+       uint64_t{0xff1ae05c98089c3f}},
+      {"DC0kXcSXtfQ9FbSRwirIn5tgPri0sbzHSa78aDZVDUKCMaBGyFU6BmrulywYX8yzvwprdLs"
+       "oOwTWN2wMjHlPDqrvVHNEjnmufRDblW+nSS+xtKNs3N5xsxXdv6JXDrAB/Q==",
+       uint64_t{0x90c02b8dceced493}},
+      {"BXRBk+3wEP3Lpm1y75wjoz+PgB0AMzLe8tQ1AYU2/"
+       "oqrQB2YMC6W+9QDbcOfkGbeH+b7IBkt/"
+       "gwCMw2HaQsRFEsurXtcQ3YwRuPz5XNaw5NAvrNa67Fm7eRzdE1+hWLKtA8=",
+       uint64_t{0x9f8a76697ab1aa36}},
+      {"RRBSvEGYnzR9E45Aps/+WSnpCo/X7gJLO4DRnUqFrJCV/kzWlusLE/"
+       "6ZU6RoUf2ROwcgEvUiXTGjLs7ts3t9SXnJHxC1KiOzxHdYLMhVvgNd3hVSAXODpKFSkVXND"
+       "55G2L1W",
+       uint64_t{0x6ba1bf3d811a531d}},
+      {"jeh6Qazxmdi57pa9S3XSnnZFIRrnc6s8QLrah5OX3SB/V2ErSPoEAumavzQPkdKF1/"
+       "SfvmdL+qgF1C+Yawy562QaFqwVGq7+tW0yxP8FStb56ZRgNI4IOmI30s1Ei7iops9Uuw==",
+       uint64_t{0x6a418974109c67b4}},
+      {"6QO5nnDrY2/"
+       "wrUXpltlKy2dSBcmK15fOY092CR7KxAjNfaY+"
+       "aAmtWbbzQk3MjBg03x39afSUN1fkrWACdyQKRaGxgwq6MGNxI6W+8DLWJBHzIXrntrE/"
+       "ml6fnNXEpxplWJ1vEs4=",
+       uint64_t{0x8472f1c2b3d230a3}},
+      {"0oPxeEHhqhcFuwonNfLd5jF3RNATGZS6NPoS0WklnzyokbTqcl4BeBkMn07+fDQv83j/"
+       "BpGUwcWO05f3+DYzocfnizpFjLJemFGsls3gxcBYxcbqWYev51tG3lN9EvRE+X9+Pwww",
+       uint64_t{0x5e06068f884e73a7}},
+      {"naSBSjtOKgAOg8XVbR5cHAW3Y+QL4Pb/JO9/"
+       "oy6L08wvVRZqo0BrssMwhzBP401Um7A4ppAupbQeJFdMrysY34AuSSNvtNUy5VxjNECwiNt"
+       "gwYHw7yakDUv8WvonctmnoSPKENegQg==",
+       uint64_t{0x55290b1a8f170f59}},
+      {"vPyl8DxVeRe1OpilKb9KNwpGkQRtA94UpAHetNh+"
+       "95V7nIW38v7PpzhnTWIml5kw3So1Si0TXtIUPIbsu32BNhoH7QwFvLM+"
+       "JACgSpc5e3RjsL6Qwxxi11npwxRmRUqATDeMUfRAjxg=",
+       uint64_t{0x5501cfd83dfe706a}},
+      {"QC9i2GjdTMuNC1xQJ74ngKfrlA4w3o58FhvNCltdIpuMhHP1YsDA78scQPLbZ3OCUgeQguY"
+       "f/vw6zAaVKSgwtaykqg5ka/4vhz4hYqWU5ficdXqClHl+zkWEY26slCNYOM5nnDlly8Cj",
+       uint64_t{0xe43ed13d13a66990}},
+      {"7CNIgQhAHX27nxI0HeB5oUTnTdgKpRDYDKwRcXfSFGP1XeT9nQF6WKCMjL1tBV6x7KuJ91G"
+       "Zz11F4c+8s+MfqEAEpd4FHzamrMNjGcjCyrVtU6y+7HscMVzr7Q/"
+       "ODLcPEFztFnwjvCjmHw==",
+       uint64_t{0xdf43bc375cf5283f}},
+      {"Qa/hC2RPXhANSospe+gUaPfjdK/yhQvfm4cCV6/pdvCYWPv8p1kMtKOX3h5/"
+       "8oZ31fsmx4Axphu5qXJokuhZKkBUJueuMpxRyXpwSWz2wELx5glxF7CM0Fn+"
+       "OevnkhUn5jsPlG2r5jYlVn8=",
+       uint64_t{0x8112b806d288d7b5}},
+      {"kUw/0z4l3a89jTwN5jpG0SHY5km/"
+       "IVhTjgM5xCiPRLncg40aqWrJ5vcF891AOq5hEpSq0bUCJUMFXgct7kvnys905HjerV7Vs1G"
+       "y84tgVJ70/2+pAZTsB/PzNOE/G6sOj4+GbTzkQu819OLB",
+       uint64_t{0xd52a18abb001cb46}},
+      {"VDdfSDbO8Tdj3T5W0XM3EI7iHh5xpIutiM6dvcJ/fhe23V/srFEkDy5iZf/"
+       "VnA9kfi2C79ENnFnbOReeuZW1b3MUXB9lgC6U4pOTuC+"
+       "jHK3Qnpyiqzj7h3ISJSuo2pob7vY6VHZo6Fn7exEqHg==",
+       uint64_t{0xe12b76a2433a1236}},
+      {"Ldfvy3ORdquM/R2fIkhH/ONi69mcP1AEJ6n/"
+       "oropwecAsLJzQSgezSY8bEiEs0VnFTBBsW+RtZY6tDj03fnb3amNUOq1b7jbqyQkL9hpl+"
+       "2Z2J8IaVSeownWl+bQcsR5/xRktIMckC5AtF4YHfU=",
+       uint64_t{0x175bf7319cf1fa00}},
+      {"BrbNpb42+"
+       "VzZAjJw6QLirXzhweCVRfwlczzZ0VX2xluskwBqyfnGovz5EuX79JJ31VNXa5hTkAyQat3l"
+       "YKRADTdAdwE5PqM1N7YaMqqsqoAAAeuYVXuk5eWCykYmClNdSspegwgCuT+403JigBzi",
+       uint64_t{0xd63d57b3f67525ae}},
+      {"gB3NGHJJvVcuPyF0ZSvHwnWSIfmaI7La24VMPQVoIIWF7Z74NltPZZpx2f+cocESM+"
+       "ILzQW9p+BC8x5IWz7N4Str2WLGKMdgmaBfNkEhSHQDU0IJEOnpUt0HmjhFaBlx0/"
+       "LTmhua+rQ6Wup8ezLwfg==",
+       uint64_t{0x933faea858832b73}},
+      {"hTKHlRxx6Pl4gjG+6ksvvj0CWFicUg3WrPdSJypDpq91LUWRni2KF6+"
+       "81ZoHBFhEBrCdogKqeK+hy9bLDnx7g6rAFUjtn1+cWzQ2YjiOpz4+"
+       "ROBB7lnwjyTGWzJD1rXtlso1g2qVH8XJVigC5M9AIxM=",
+       uint64_t{0x53d061e5f8e7c04f}},
+      {"IWQBelSQnhrr0F3BhUpXUIDauhX6f95Qp+A0diFXiUK7irwPG1oqBiqHyK/SH/"
+       "9S+"
+       "rln9DlFROAmeFdH0OCJi2tFm4afxYzJTFR4HnR4cG4x12JqHaZLQx6iiu6CE3rtWBVz99oA"
+       "wCZUOEXIsLU24o2Y",
+       uint64_t{0xdb4124556dd515e0}},
+      {"TKo+l+"
+       "1dOXdLvIrFqeLaHdm0HZnbcdEgOoLVcGRiCbAMR0j5pIFw8D36tefckAS1RCFOH5IgP8yiF"
+       "T0Gd0a2hI3+"
+       "fTKA7iK96NekxWeoeqzJyctc6QsoiyBlkZerRxs5RplrxoeNg29kKDTM0K94mnhD9g==",
+       uint64_t{0x4fb31a0dd681ee71}},
+      {"YU4e7G6EfQYvxCFoCrrT0EFgVLHFfOWRTJQJ5gxM3G2b+"
+       "1kJf9YPrpsxF6Xr6nYtS8reEEbDoZJYqnlk9lXSkVArm88Cqn6d25VCx3+"
+       "49MqC0trIlXtb7SXUUhwpJK16T0hJUfPH7s5cMZXc6YmmbFuBNPE=",
+       uint64_t{0x27cc72eefa138e4c}},
+      {"/I/"
+       "eImMwPo1U6wekNFD1Jxjk9XQVi1D+"
+       "FPdqcHifYXQuP5aScNQfxMAmaPR2XhuOQhADV5tTVbBKwCDCX4E3jcDNHzCiPvViZF1W27t"
+       "xaf2BbFQdwKrNCmrtzcluBFYu0XZfc7RU1RmxK/RtnF1qHsq/O4pp",
+       uint64_t{0x44bc2dfba4bd3ced}},
+      {"CJTT9WGcY2XykTdo8KodRIA29qsqY0iHzWZRjKHb9alwyJ7RZAE3V5Juv4MY3MeYEr1EPCC"
+       "MxO7yFXqT8XA8YTjaMp3bafRt17Pw8JC4iKJ1zN+WWKOESrj+"
+       "3aluGQqn8z1EzqY4PH7rLG575PYeWsP98BugdA==",
+       uint64_t{0x242da1e3a439bed8}},
+      {"ZlhyQwLhXQyIUEnMH/"
+       "AEW27vh9xrbNKJxpWGtrEmKhd+nFqAfbeNBQjW0SfG1YI0xQkQMHXjuTt4P/"
+       "EpZRtA47ibZDVS8TtaxwyBjuIDwqcN09eCtpC+Ls+"
+       "vWDTLmBeDM3u4hmzz4DQAYsLiZYSJcldg9Q3wszw=",
+       uint64_t{0xdc559c746e35c139}},
+      {"v2KU8y0sCrBghmnm8lzGJlwo6D6ObccAxCf10heoDtYLosk4ztTpLlpSFEyu23MLA1tJkcg"
+       "Rko04h19QMG0mOw/"
+       "wc93EXAweriBqXfvdaP85sZABwiKO+6rtS9pacRVpYYhHJeVTQ5NzrvBvi1huxAr+"
+       "xswhVMfL",
+       uint64_t{0xd0b0350275b9989}},
+      {"QhKlnIS6BuVCTQsnoE67E/"
+       "yrgogE8EwO7xLaEGei26m0gEU4OksefJgppDh3X0x0Cs78Dr9IHK5b977CmZlrTRmwhlP8p"
+       "M+UzXPNRNIZuN3ntOum/QhUWP8SGpirheXENWsXMQ/"
+       "nxtxakyEtrNkKk471Oov9juP8oQ==",
+       uint64_t{0xb04489e41d17730c}},
+      {"/ZRMgnoRt+Uo6fUPr9FqQvKX7syhgVqWu+"
+       "WUSsiQ68UlN0efSP6Eced5gJZL6tg9gcYJIkhjuQNITU0Q3TjVAnAcobgbJikCn6qZ6pRxK"
+       "BY4MTiAlfGD3T7R7hwJwx554MAy++Zb/YUFlnCaCJiwQMnowF7aQzwYFCo=",
+       uint64_t{0x2217285eb4572156}},
+      {"NB7tU5fNE8nI+SXGfipc7sRkhnSkUF1krjeo6k+8FITaAtdyz+"
+       "o7mONgXmGLulBPH9bEwyYhKNVY0L+njNQrZ9YC2aXsFD3PdZsxAFaBT3VXEzh+"
+       "NGBTjDASNL3mXyS8Yv1iThGfHoY7T4aR0NYGJ+k+pR6f+KrPC96M",
+       uint64_t{0x12c2e8e68aede73b}},
+      {"8T6wrqCtEO6/rwxF6lvMeyuigVOLwPipX/FULvwyu+1wa5sQGav/"
+       "2FsLHUVn6cGSi0LlFwLewGHPFJDLR0u4t7ZUyM//"
+       "x6da0sWgOa5hzDqjsVGmjxEHXiaXKW3i4iSZNuxoNbMQkIbVML+"
+       "DkYu9ND0O2swg4itGeVSzXA==",
+       uint64_t{0x4d612125bdc4fd00}},
+      {"Ntf1bMRdondtMv1CYr3G80iDJ4WSAlKy5H34XdGruQiCrnRGDBa+"
+       "eUi7vKp4gp3BBcVGl8eYSasVQQjn7MLvb3BjtXx6c/"
+       "bCL7JtpzQKaDnPr9GWRxpBXVxKREgMM7d8lm35EODv0w+"
+       "hQLfVSh8OGs7fsBb68nNWPLeeSOo=",
+       uint64_t{0x81826b553954464e}},
+      {"VsSAw72Ro6xks02kaiLuiTEIWBC5bgqr4WDnmP8vglXzAhixk7td926rm9jNimL+"
+       "kroPSygZ9gl63aF5DCPOACXmsbmhDrAQuUzoh9ZKhWgElLQsrqo1KIjWoZT5b5QfVUXY9lS"
+       "IBg3U75SqORoTPq7HalxxoIT5diWOcJQi",
+       uint64_t{0xc2e5d345dc0ddd2d}},
+      {"j+loZ+C87+"
+       "bJxNVebg94gU0mSLeDulcHs84tQT7BZM2rzDSLiCNxUedHr1ZWJ9ejTiBa0dqy2I2ABc++"
+       "xzOLcv+//YfibtjKtYggC6/3rv0XCc7xu6d/"
+       "O6xO+XOBhOWAQ+IHJVHf7wZnDxIXB8AUHsnjEISKj7823biqXjyP3g==",
+       uint64_t{0x3da6830a9e32631e}},
+      {"f3LlpcPElMkspNtDq5xXyWU62erEaKn7RWKlo540gR6mZsNpK1czV/"
+       "sOmqaq8XAQLEn68LKj6/"
+       "cFkJukxRzCa4OF1a7cCAXYFp9+wZDu0bw4y63qbpjhdCl8GO6Z2lkcXy7KOzbPE01ukg7+"
+       "gN+7uKpoohgAhIwpAKQXmX5xtd0=",
+       uint64_t{0xc9ae5c8759b4877a}},
+  };
+
+#if defined(__aarch64__)
+  constexpr uint64_t kGolden[kNumGoldenOutputs] = {
+      0x45c0aadee165dcbe, 0x25ed8587f6f20d06, 0x5f23ae668ce7926d,
+      0xfef74d1da0846719, 0x54478408e68cb7d4, 0xee27ddaf88c6fe68,
+      0xb7ac7031e81867ca, 0xf1168f818ec6c36d, 0x1dd0b734a83b019a,
+      0xd6ae30d4142b54fe, 0xcd860c721ccb80fb, 0x068acf8493794756,
+      0xd4ada0be58681307, 0x13ffe0f64ca540ed, 0xffc1d7a3401aec02,
+      0xd81c4d865cf95fb9, 0x1dd0793acede62e0, 0xa6722abbca8fe4cf,
+      0x5453d3e4111a7e40, 0xf29b3e3204c9dcd2, 0x23be2980e43117f7,
+      0x74e2ccbc286f08eb, 0x19ef7c0f9496003a, 0xbfbf1c3e49b27987,
+      0x6e6c179eb4a82c70, 0x07f4e184216bc4fc, 0xf17fbc4254927554,
+      0xe57696b70a45b1b6, 0x6d3b144631b320e8, 0xccf8729792c75a2d,
+      0xe832495b41fa980b, 0x5c96cfdc7b227d34, 0xc4dca234ef4e43f4,
+      0x5fc801abf9abe307, 0xe41e3c5076d88f4d, 0x522346200ddec3c3,
+      0x72bed1946fd7aaa4, 0x0ac1f84dcc335f96, 0x3af78db5e0a47670,
+      0x6100ebf1481f1caf, 0xf5fd10037fc651a3, 0xa01227d8944665f3,
+      0x7217681c4bbc9420, 0x4adee538e3eb10d1, 0x35e1761ad96de9a7,
+      0x8b370aef9613bfba, 0x824506f749eeaf59, 0x85e805fa04423991,
+      0xb61e9c33283c3de7, 0xc79721bbcb039ed6, 0x04e1c19a3a1e6639,
+      0x6aaf6346b68dd638, 0x601a4b496be6d0c4, 0x3ece355f91c41787,
+      0xd2fc8998448d7888, 0xd7529804f843efa9, 0xabdcc38a288536aa,
+      0xdd323e48a9718648, 0x2090279c0030a52a, 0xe2f90faca88a3cd1,
+      0x3e0c4e92fc50e4aa, 0xa26d308798e801dd, 0x432eefeedee8c02e,
+      0xca4ce494614b77df, 0xbba82911e838066d, 0x4b00821016adee4b,
+      0x4cf6e526dfb5a20f, 0x5b8466495142cba2, 0xe28ac1406e88a68c,
+      0x8511e5f9d3100999, 0x05acbfe02798890b, 0x74c249c7ce4a8425,
+      0xdbe7468d09bc34bc, 0x11079ab10e3b9b58, 0xb7788dec9032035a,
+      0xb7e8daa786513f80, 0x34c3288831f46b45, 0x014cce5f0c21ecc6,
+      0xc6a8f7b024551a28, 0x49784e902e207fd8, 0x4720d32af0b55158,
+      0x8df3ec5de0c1da00, 0xf4db677b2c9e6853, 0xaa419abea78d312d,
+      0x181e0f91bd757443, 0xa8c45136fada083b, 0x91303b93f5f0582c,
+      0x883b95c6ddc62a08, 0x93186a8875fe952b, 0xd94f533928e957e2,
+      0x6ba343003e10c172, 0xc8623b620c715d6a, 0x8ca0c512e180e244,
+      0xdc9b74c2536b6216, 0x8eb5fdc61b295d96, 0x2ad83966b37c95ba,
+      0xb90bf154ac5edec9, 0x902cf847b326cfb3, 0x7b02d0c0ca7808ca,
+      0x492f310d003ea15f, 0x3eb6497a47c95990, 0x5d46b0ced31428b7,
+      0x081afa67d1986157, 0x043482ec286b20eb, 0xc103c8f18c1a2a53,
+      0xe8e9995a81481e83, 0x6bb3295822bc90b5, 0xeec75297a3fa5672,
+      0x591c8440c4857412, 0x74947f455aaf24ad, 0xcf0e571586ec77a9,
+      0x0c2553ea8c0400ad, 0x380219118066255f, 0x7595adb88b15ebe2,
+      0xb33c00696c64ae23, 0xa143516ddd7c9857, 0x39179af229248d26,
+      0x65d387a6f2ee2079, 0x89f8a9b21cd2f195, 0xbfef032d25df92e6,
+      0x6b7e18a36c69da71, 0x4b3b15f6c28974e6, 0x032a75917f6c544c,
+      0xe3b97ecca6d287cd, 0xa4a563110d3cda81, 0x35e09e8134f4e7f1,
+      0xc9419dd03a9a390e, 0x7b86fae9000fd329, 0x1e044f8d54fe74c3,
+      0x9c4991d7a47e9666, 0xfb485f3a1df4fdb6, 0xb11519969eeb94ff,
+      0x3224ea1c44caeb8d, 0x86570bbd7cc6b80d,
+  };
+#else
+  constexpr uint64_t kGolden[kNumGoldenOutputs] = {
+      0xe5a40d39ab796423, 0x1766974bf7527d81, 0x5c3bbbe230db17a8,
+      0xa6630143a7e6aa6f, 0x8787cb2d04b0c984, 0x33603654ff574ac2,
+      0xa6564b468248c683, 0xef192f401b116e1c, 0xbe8dc0c54617639d,
+      0x93d7f665b5521c8e, 0x646d70bb42445f28, 0x96a7b1e3cc9bd426,
+      0x76020289ab0790c4, 0x39f842e4133b9b44, 0x2b8d7047be4bcaab,
+      0x99628abef6716a97, 0x4432e02ba42b2740, 0x74d810efcad7918a,
+      0x88c84e986002507f, 0x4f99acf193cf39b9, 0xd90e7a3655891e37,
+      0x3bb378b1d4df8fcf, 0xf78e94045c052d47, 0x26da0b2130da6b40,
+      0x30b4d426af8c6986, 0x5413b4aaf3baaeae, 0x756ab265370a1597,
+      0xdaf5f4b7d09814fb, 0x8f874ae37742b75e, 0x8fecd03956121ce8,
+      0x229c292ea7a08285, 0x0bb4bf0692d14bae, 0x207b24ca3bdac1db,
+      0x64f6cd6745d3825b, 0xa2b2e1656b58df1e, 0x0d01d30d9ee7a148,
+      0x1cb4cd00ab804e3b, 0x4697f2637fd90999, 0x8383a756b5688c07,
+      0x695c29cb3696a975, 0xda2e5a5a5e971521, 0x7935d4befa056b2b,
+      0x38dd541ca95420fe, 0xcc06c7a4963f967f, 0xbf0f6f66e232fb20,
+      0xf7efb32d373fe71a, 0xe2e64634b1c12660, 0x285b8fd1638e306d,
+      0x658e8a4e3b714d6c, 0xf391fb968e0eb398, 0x744a9ea0cc144bf2,
+      0x12636f2be11012f1, 0x29c57de825948f80, 0x58c6f99ab0d1c021,
+      0x13e7b5a7b82fe3bb, 0x10fbc87901e02b63, 0xa24c9184901b748b,
+      0xcac4fd4c5080e581, 0xc38bdb7483ba68e1, 0xdb2a8069b2ceaffa,
+      0xdf9fe91d0d1c7887, 0xe83f49e96e2e6a08, 0x0c69e61b62ca2b62,
+      0xb4a4f3f85f8298fe, 0x167a1b39e1e95f41, 0xf8a2a5649855ee41,
+      0x27992565b595c498, 0x3e08cca5b71f9346, 0xad406b10c770a6d2,
+      0xd1713ce6e552bcf2, 0x753b287194c73ad3, 0x5ae41a95f600af1c,
+      0x4a61163b86a8bb4c, 0x42eeaa79e760c7e4, 0x698df622ef465b0a,
+      0x157583111e1a6026, 0xaa1388f078e793e0, 0xf10d68d0f3309360,
+      0x2af056184457a3de, 0x6d0058e1590b2489, 0x638f287f68817f12,
+      0xc46b71fecefd5467, 0x2c8e94679d964e0a, 0x8612b797ce22503a,
+      0x59f929babfba7170, 0x9527556923fb49a0, 0x1039ab644f5e150b,
+      0x7816c83f3aa05e6d, 0xf51d2f564518c619, 0x67d494cff03ac004,
+      0x2802d636ced1cfbb, 0xf64e20bad771cb12, 0x0b9a6cf84a83e15e,
+      0x8da6630319609301, 0x40946a86e2a996f3, 0xcab7f5997953fa76,
+      0x39129ca0e04fc465, 0x5238221fd685e1b8, 0x175130c407dbcaab,
+      0x02f20e7536c0b0df, 0x2742cb488a04ad56, 0xd6afb593879ff93b,
+      0xf50ad64caac0ca7f, 0x2ade95c4261364ae, 0x5c4f3299faacd07a,
+      0xfffe3bff0ae5e9bc, 0x1db785c0005166e4, 0xea000d962ad18418,
+      0xe42aef38359362d9, 0xc8e95657348a3891, 0xc162eca864f238c6,
+      0xbe1fb373e20579ad, 0x628a1d4f40aa6ffd, 0xa87bdb7456340f90,
+      0x5960ef3ba982c801, 0x5026586df9a431ec, 0xfe4b8a20fdf0840b,
+      0xdcb761867da7072f, 0xc10d4653667275b7, 0x727720deec13110b,
+      0x710b009662858dc9, 0xfbf8f7a3ecac1eb7, 0xb6fc4fcd0722e3df,
+      0x7cb86dcc55104aac, 0x19e71e9b45c3a51e, 0x51de38573c2bea48,
+      0xa73ab6996d6df158, 0x55ef2b8c930817b2, 0xb2850bf5fae87157,
+      0xecf3de1acd04651f, 0xcc0a40552559ff32, 0xc385c374f20315b1,
+      0xb90208a4c7234183, 0x58aa1ca7a4c075d9,
+  };
+#endif
+
+#if UPDATE_GOLDEN
+  (void)kGolden;  // Silence warning.
+  for (size_t i = 0; i < kNumGoldenOutputs; ++i) {
+    std::string str;
+    ASSERT_TRUE(absl::Base64Unescape(cases[i].base64_data, &str));
+    uint64_t h = absl::hash_internal::LowLevelHash(str.data(), str.size(),
+                                                   cases[i].seed, kSalt);
+    printf("0x%016" PRIx64 ", ", h);
+    if (i % 3 == 2) {
+      printf("\n");
+    }
+  }
+  printf("\n\n\n");
+  EXPECT_FALSE(true);
+#else
+  for (size_t i = 0; i < kNumGoldenOutputs; ++i) {
+    SCOPED_TRACE(::testing::Message()
+                 << "i = " << i << "; input = " << cases[i].base64_data);
+    std::string str;
+    ASSERT_TRUE(absl::Base64Unescape(cases[i].base64_data, &str));
+    EXPECT_EQ(absl::hash_internal::LowLevelHash(str.data(), str.size(),
+                                                cases[i].seed, kSalt),
+              kGolden[i]);
+  }
+#endif
+}
+
+}  // namespace
diff --git a/third_party/abseil-cpp/absl/hash/internal/wyhash_test.cc b/third_party/abseil-cpp/absl/hash/internal/wyhash_test.cc
deleted file mode 100644
index 9fb06d2..0000000
--- a/third_party/abseil-cpp/absl/hash/internal/wyhash_test.cc
+++ /dev/null
@@ -1,486 +0,0 @@
-// Copyright 2020 The Abseil Authors
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     https://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-#include "absl/hash/internal/wyhash.h"
-
-#include "absl/strings/escaping.h"
-#include "gmock/gmock.h"
-#include "gtest/gtest.h"
-
-namespace {
-
-static const uint64_t kCurrentSeed = 0;
-static const uint64_t kSalt[5] = {0xa0761d6478bd642f, 0xe7037ed1a0b428dbl,
-                                  0x8ebc6af09c88c6e3, 0x589965cc75374cc3l,
-                                  0x1d8e4e27c47d124f};
-
-// Note: We don't account for endianness, so the values here are only correct if
-// you're also running on a little endian platform.
-
-TEST(WyhashTest, EmptyString) {
-  const std::string s = "";
-  EXPECT_EQ(
-      absl::hash_internal::Wyhash(s.c_str(), s.length(), kCurrentSeed, kSalt),
-      4808886099364463827);
-}
-
-TEST(WyhashTest, Spaces) {
-  const std::string s = "   ";
-  EXPECT_EQ(
-      absl::hash_internal::Wyhash(s.c_str(), s.length(), kCurrentSeed, kSalt),
-      1686201463024549249);
-}
-
-TEST(WyhashTest, RepeatingString) {
-  const std::string s = "aaaa";
-  EXPECT_EQ(
-      absl::hash_internal::Wyhash(s.c_str(), s.length(), kCurrentSeed, kSalt),
-      6646112255271966632);
-}
-
-TEST(WyhashTest, HexString) {
-  const std::string small = "\x01\x02\x03";
-  const std::string med = "\x01\x02\x03\x04";
-
-  EXPECT_EQ(absl::hash_internal::Wyhash(small.c_str(), small.length(),
-                                        kCurrentSeed, kSalt),
-            11989428023081740911ULL);
-  EXPECT_EQ(absl::hash_internal::Wyhash(med.c_str(), med.length(), kCurrentSeed,
-                                        kSalt),
-            9765997711188871556ULL);
-}
-
-TEST(WyhashTest, Words) {
-  const std::string s = "third_party|wyhash|64";
-  EXPECT_EQ(
-      absl::hash_internal::Wyhash(s.c_str(), s.length(), kCurrentSeed, kSalt),
-      3702018632387611330);
-}
-
-TEST(WyhashTest, LongString) {
-  const std::string s =
-      "AbCdEfGhIjKlMnOpQrStUvWxYz0123456789AbCdEfGhIjKlMnOpQrStUvWxYz"
-      "0123456789AbCdEfGhIjKlMnOpQrStUvWxYz0123456789AbCdEfGhIjKlMnOp"
-      "QrStUvWxYz0123456789AbCdEfGhIjKlMnOpQrStUvWxYz0123456789AbCdEf"
-      "GhIjKlMnOpQrStUvWxYz0123456789AbCdEfGhIjKlMnOpQrStUvWxYz012345"
-      "6789AbCdEfGhIjKlMnOpQrStUvWxYz0123456789";
-
-  EXPECT_EQ(
-      absl::hash_internal::Wyhash(s.c_str(), s.length(), kCurrentSeed, kSalt),
-      9245411362605796064ULL);
-}
-
-TEST(WyhashTest, BigReference) {
-  struct ExpectedResult {
-    absl::string_view base64_data;
-    uint64_t seed;
-    uint64_t hash;
-  } expected_results[] = {
-      {"", uint64_t{0xec42b7ab404b8acb}, uint64_t{0xe5a40d39ab796423}},
-      {"Zw==", uint64_t{0xeeee074043a3ee0f}, uint64_t{0xa6564b468248c683}},
-      {"xmk=", uint64_t{0x857902089c393de}, uint64_t{0xef192f401b116e1c}},
-      {"c1H/", uint64_t{0x993df040024ca3af}, uint64_t{0xbe8dc0c54617639d}},
-      {"SuwpzQ==", uint64_t{0xc4e4c2acea740e96}, uint64_t{0x93d7f665b5521c8e}},
-      {"uqvy++M=", uint64_t{0x6a214b3db872d0cf}, uint64_t{0x646d70bb42445f28}},
-      {"RnzCVPgb", uint64_t{0x44343db6a89dba4d}, uint64_t{0x96a7b1e3cc9bd426}},
-      {"6OeNdlouYw==", uint64_t{0x77b5d6d1ae1dd483},
-       uint64_t{0x76020289ab0790c4}},
-      {"M5/JmmYyDbc=", uint64_t{0x89ab8ecb44d221f1},
-       uint64_t{0x39f842e4133b9b44}},
-      {"MVijWiVdBRdY", uint64_t{0x60244b17577ca81b},
-       uint64_t{0x2b8d7047be4bcaab}},
-      {"6V7Uq7LNxpu0VA==", uint64_t{0x59a08dcee0717067},
-       uint64_t{0x99628abef6716a97}},
-      {"EQ6CdEEhPdyHcOk=", uint64_t{0xf5f20db3ade57396},
-       uint64_t{0x4432e02ba42b2740}},
-      {"PqFB4fxnPgF+l+rc", uint64_t{0xbf8dee0751ad3efb},
-       uint64_t{0x74d810efcad7918a}},
-      {"a5aPOFwq7LA7+zKvPA==", uint64_t{0x6b7a06b268d63e30},
-       uint64_t{0x88c84e986002507f}},
-      {"VOwY21wCGv5D+/qqOvs=", uint64_t{0xb8c37f0ae0f54c82},
-       uint64_t{0x4f99acf193cf39b9}},
-      {"KdHmBTx8lHXYvmGJ+Vy7", uint64_t{0x9fcbed0c38e50eef},
-       uint64_t{0xd90e7a3655891e37}},
-      {"qJkPlbHr8bMF7/cA6aE65Q==", uint64_t{0x2af4bade1d8e3a1d},
-       uint64_t{0x3bb378b1d4df8fcf}},
-      {"ygvL0EhHZL0fIx6oHHtkxRQ=", uint64_t{0x714e3aa912da2f2c},
-       uint64_t{0xf78e94045c052d47}},
-      {"c1rFXkt5YztwZCQRngncqtSs", uint64_t{0xf5ee75e3cbb82c1c},
-       uint64_t{0x26da0b2130da6b40}},
-      {"8hsQrzszzeNQSEcVXLtvIhm6mw==", uint64_t{0x620e7007321b93b9},
-       uint64_t{0x30b4d426af8c6986}},
-      {"ffUL4RocfyP4KfikGxO1yk7omDI=", uint64_t{0xc08528cac2e551fc},
-       uint64_t{0x5413b4aaf3baaeae}},
-      {"OOB5TT00vF9Od/rLbAWshiErqhpV", uint64_t{0x6a1debf9cc3ad39},
-       uint64_t{0x756ab265370a1597}},
-      {"or5wtXM7BFzTNpSzr+Lw5J5PMhVJ/Q==", uint64_t{0x7e0a3c88111fc226},
-       uint64_t{0xdaf5f4b7d09814fb}},
-      {"gk6pCHDUsoopVEiaCrzVDhioRKxb844=", uint64_t{0x1301fef15df39edb},
-       uint64_t{0x8f874ae37742b75e}},
-      {"TNctmwlC5QbEM6/No4R/La3UdkfeMhzs", uint64_t{0x64e181f3d5817ab},
-       uint64_t{0x8fecd03956121ce8}},
-      {"SsQw9iAjhWz7sgcE9OwLuSC6hsM+BfHs2Q==", uint64_t{0xafafc44961078ecb},
-       uint64_t{0x229c292ea7a08285}},
-      {"ZzO3mVCj4xTT2TT3XqDyEKj2BZQBvrS8RHg=", uint64_t{0x4f7bb45549250094},
-       uint64_t{0xbb4bf0692d14bae}},
-      {"+klp5iPQGtppan5MflEls0iEUzqU+zGZkDJX", uint64_t{0xa30061abaa2818c},
-       uint64_t{0x207b24ca3bdac1db}},
-      {"RO6bvOnlJc8I9eniXlNgqtKy0IX6VNg16NRmgg==", uint64_t{0xd902ee3e44a5705f},
-       uint64_t{0x64f6cd6745d3825b}},
-      {"ZJjZqId1ZXBaij9igClE3nyliU5XWdNRrayGlYA=", uint64_t{0x316d36da516f583},
-       uint64_t{0xa2b2e1656b58df1e}},
-      {"7BfkhfGMDGbxfMB8uyL85GbaYQtjr2K8g7RpLzr/", uint64_t{0x402d83f9f834f616},
-       uint64_t{0xd01d30d9ee7a148}},
-      {"rycWk6wHH7htETQtje9PidS2YzXBx+Qkg2fY7ZYS7A==",
-       uint64_t{0x9c604164c016b72c}, uint64_t{0x1cb4cd00ab804e3b}},
-      {"RTkC2OUK+J13CdGllsH0H5WqgspsSa6QzRZouqx6pvI=",
-       uint64_t{0x3f4507e01f9e73ba}, uint64_t{0x4697f2637fd90999}},
-      {"tKjKmbLCNyrLCM9hycOAXm4DKNpM12oZ7dLTmUx5iwAi",
-       uint64_t{0xc3fe0d5be8d2c7c7}, uint64_t{0x8383a756b5688c07}},
-      {"VprUGNH+5NnNRaORxgH/ySrZFQFDL+4VAodhfBNinmn8cg==",
-       uint64_t{0x531858a40bfa7ea1}, uint64_t{0x695c29cb3696a975}},
-      {"gc1xZaY+q0nPcUvOOnWnT3bqfmT/geth/f7Dm2e/DemMfk4=",
-       uint64_t{0x86689478a7a7e8fa}, uint64_t{0xda2e5a5a5e971521}},
-      {"Mr35fIxqx1ukPAL0su1yFuzzAU3wABCLZ8+ZUFsXn47UmAph",
-       uint64_t{0x4ec948b8e7f27288}, uint64_t{0x7935d4befa056b2b}},
-      {"A9G8pw2+m7+rDtWYAdbl8tb2fT7FFo4hLi2vAsa5Y8mKH3CX3g==",
-       uint64_t{0xce46c7213c10032}, uint64_t{0x38dd541ca95420fe}},
-      {"DFaJGishGwEHDdj9ixbCoaTjz9KS0phLNWHVVdFsM93CvPft3hM=",
-       uint64_t{0xf63e96ee6f32a8b6}, uint64_t{0xcc06c7a4963f967f}},
-      {"7+Ugx+Kr3aRNgYgcUxru62YkTDt5Hqis+2po81hGBkcrJg4N0uuy",
-       uint64_t{0x1cfe85e65fc5225}, uint64_t{0xbf0f6f66e232fb20}},
-      {"H2w6O8BUKqu6Tvj2xxaecxEI2wRgIgqnTTG1WwOgDSINR13Nm4d4Vg==",
-       uint64_t{0x45c474f1cee1d2e8}, uint64_t{0xf7efb32d373fe71a}},
-      {"1XBMnIbqD5jy65xTDaf6WtiwtdtQwv1dCVoqpeKj+7cTR1SaMWMyI04=",
-       uint64_t{0x6e024e14015f329c}, uint64_t{0xe2e64634b1c12660}},
-      {"znZbdXG2TSFrKHEuJc83gPncYpzXGbAebUpP0XxzH0rpe8BaMQ17nDbt",
-       uint64_t{0x760c40502103ae1c}, uint64_t{0x285b8fd1638e306d}},
-      {"ylu8Atu13j1StlcC1MRMJJXIl7USgDDS22HgVv0WQ8hx/8pNtaiKB17hCQ==",
-       uint64_t{0x17fd05c3c560c320}, uint64_t{0x658e8a4e3b714d6c}},
-      {"M6ZVVzsd7vAvbiACSYHioH/440dp4xG2mLlBnxgiqEvI/aIEGpD0Sf4VS0g=",
-       uint64_t{0x8b34200a6f8e90d9}, uint64_t{0xf391fb968e0eb398}},
-      {"li3oFSXLXI+ubUVGJ4blP6mNinGKLHWkvGruun85AhVn6iuMtocbZPVhqxzn",
-       uint64_t{0x6be89e50818bdf69}, uint64_t{0x744a9ea0cc144bf2}},
-      {"kFuQHuUCqBF3Tc3hO4dgdIp223ShaCoog48d5Do5zMqUXOh5XpGK1t5XtxnfGA==",
-       uint64_t{0xfb389773315b47d8}, uint64_t{0x12636f2be11012f1}},
-      {"jWmOad0v0QhXVJd1OdGuBZtDYYS8wBVHlvOeTQx9ZZnm8wLEItPMeihj72E0nWY=",
-       uint64_t{0x4f2512a23f61efee}, uint64_t{0x29c57de825948f80}},
-      {"z+DHU52HaOQdW4JrZwDQAebEA6rm13Zg/9lPYA3txt3NjTBqFZlOMvTRnVzRbl23",
-       uint64_t{0x59ccd92fc16c6fda}, uint64_t{0x58c6f99ab0d1c021}},
-      {"MmBiGDfYeTayyJa/tVycg+rN7f9mPDFaDc+23j0TlW9094er0ADigsl4QX7V3gG/qw==",
-       uint64_t{0x25c5a7f5bd330919}, uint64_t{0x13e7b5a7b82fe3bb}},
-      {"774RK+9rOL4iFvs1q2qpo/JVc/I39buvNjqEFDtDvyoB0FXxPI2vXqOrk08VPfIHkmU=",
-       uint64_t{0x51df4174d34c97d7}, uint64_t{0x10fbc87901e02b63}},
-      {"+slatXiQ7/2lK0BkVUI1qzNxOOLP3I1iK6OfHaoxgqT63FpzbElwEXSwdsryq3UlHK0I",
-       uint64_t{0x80ce6d76f89cb57}, uint64_t{0xa24c9184901b748b}},
-      {"64mVTbQ47dHjHlOHGS/hjJwr/"
-       "K2frCNpn87exOqMzNUVYiPKmhCbfS7vBUce5tO6Ec9osQ==",
-       uint64_t{0x20961c911965f684}, uint64_t{0xcac4fd4c5080e581}},
-      {"fIsaG1r530SFrBqaDj1kqE0AJnvvK8MNEZbII2Yw1OK77v0V59xabIh0B5axaz/"
-       "+a2V5WpA=",
-       uint64_t{0x4e5b926ec83868e7}, uint64_t{0xc38bdb7483ba68e1}},
-      {"PGih0zDEOWCYGxuHGDFu9Ivbff/"
-       "iE7BNUq65tycTR2R76TerrXALRosnzaNYO5fjFhTi+CiS",
-       uint64_t{0x3927b30b922eecef}, uint64_t{0xdb2a8069b2ceaffa}},
-      {"RnpA/"
-       "zJnEnnLjmICORByRVb9bCOgxF44p3VMiW10G7PvW7IhwsWajlP9kIwNA9FjAD2GoQHk2Q="
-       "=",
-       uint64_t{0xbd0291284a49b61c}, uint64_t{0xdf9fe91d0d1c7887}},
-      {"qFklMceaTHqJpy2qavJE+EVBiNFOi6OxjOA3LeIcBop1K7w8xQi3TrDk+"
-       "BrWPRIbfprszSaPfrI=",
-       uint64_t{0x73a77c575bcc956}, uint64_t{0xe83f49e96e2e6a08}},
-      {"cLbfUtLl3EcQmITWoTskUR8da/VafRDYF/ylPYwk7/"
-       "zazk6ssyrzxMN3mmSyvrXR2yDGNZ3WDrTT",
-       uint64_t{0x766a0e2ade6d09a6}, uint64_t{0xc69e61b62ca2b62}},
-      {"s/"
-       "Jf1+"
-       "FbsbCpXWPTUSeWyMH6e4CvTFvPE5Fs6Z8hvFITGyr0dtukHzkI84oviVLxhM1xMxrMAy1db"
-       "w==",
-       uint64_t{0x2599f4f905115869}, uint64_t{0xb4a4f3f85f8298fe}},
-      {"FvyQ00+j7nmYZVQ8hI1Edxd0AWplhTfWuFGiu34AK5X8u2hLX1bE97sZM0CmeLe+"
-       "7LgoUT1fJ/axybE=",
-       uint64_t{0xd8256e5444d21e53}, uint64_t{0x167a1b39e1e95f41}},
-      {"L8ncxMaYLBH3g9buPu8hfpWZNlOF7nvWLNv9IozH07uQsIBWSKxoPy8+"
-       "LW4tTuzC6CIWbRGRRD1sQV/4",
-       uint64_t{0xf664a91333fb8dfd}, uint64_t{0xf8a2a5649855ee41}},
-      {"CDK0meI07yrgV2kQlZZ+"
-       "wuVqhc2NmzqeLH7bmcA6kchsRWFPeVF5Wqjjaj556ABeUoUr3yBmfU3kWOakkg==",
-       uint64_t{0x9625b859be372cd1}, uint64_t{0x27992565b595c498}},
-      {"d23/vc5ONh/"
-       "HkMiq+gYk4gaCNYyuFKwUkvn46t+dfVcKfBTYykr4kdvAPNXGYLjM4u1YkAEFpJP+"
-       "nX7eOvs=",
-       uint64_t{0x7b99940782e29898}, uint64_t{0x3e08cca5b71f9346}},
-      {"NUR3SRxBkxTSbtQORJpu/GdR6b/h6sSGfsMj/KFd99ahbh+9r7LSgSGmkGVB/"
-       "mGoT0pnMTQst7Lv2q6QN6Vm",
-       uint64_t{0x4fe12fa5383b51a8}, uint64_t{0xad406b10c770a6d2}},
-      {"2BOFlcI3Z0RYDtS9T9Ie9yJoXlOdigpPeeT+CRujb/"
-       "O39Ih5LPC9hP6RQk1kYESGyaLZZi3jtabHs7DiVx/VDg==",
-       uint64_t{0xe2ccb09ac0f5b4b6}, uint64_t{0xd1713ce6e552bcf2}},
-      {"FF2HQE1FxEvWBpg6Z9zAMH+Zlqx8S1JD/"
-       "wIlViL6ZDZY63alMDrxB0GJQahmAtjlm26RGLnjW7jmgQ4Ie3I+014=",
-       uint64_t{0x7d0a37adbd7b753b}, uint64_t{0x753b287194c73ad3}},
-      {"tHmO7mqVL/PX11nZrz50Hc+M17Poj5lpnqHkEN+4bpMx/"
-       "YGbkrGOaYjoQjgmt1X2QyypK7xClFrjeWrCMdlVYtbW",
-       uint64_t{0xd3ae96ef9f7185f2}, uint64_t{0x5ae41a95f600af1c}},
-      {"/WiHi9IQcxRImsudkA/KOTqGe8/"
-       "gXkhKIHkjddv5S9hi02M049dIK3EUyAEjkjpdGLUs+BN0QzPtZqjIYPOgwsYE9g==",
-       uint64_t{0x4fb88ea63f79a0d8}, uint64_t{0x4a61163b86a8bb4c}},
-      {"qds+1ExSnU11L4fTSDz/QE90g4Jh6ioqSh3KDOTOAo2pQGL1k/"
-       "9CCC7J23YF27dUTzrWsCQA2m4epXoCc3yPHb3xElA=",
-       uint64_t{0xed564e259bb5ebe9}, uint64_t{0x42eeaa79e760c7e4}},
-      {"8FVYHx40lSQPTHheh08Oq0/"
-       "pGm2OlG8BEf8ezvAxHuGGdgCkqpXIueJBF2mQJhTfDy5NncO8ntS7vaKs7sCNdDaNGOEi",
-       uint64_t{0x3e3256b60c428000}, uint64_t{0x698df622ef465b0a}},
-      {"4ZoEIrJtstiCkeew3oRzmyJHVt/pAs2pj0HgHFrBPztbQ10NsQ/"
-       "lM6DM439QVxpznnBSiHMgMQJhER+70l72LqFTO1JiIQ==",
-       uint64_t{0xfb05bad59ec8705}, uint64_t{0x157583111e1a6026}},
-      {"hQPtaYI+wJyxXgwD5n8jGIKFKaFA/"
-       "P83KqCKZfPthnjwdOFysqEOYwAaZuaaiv4cDyi9TyS8hk5cEbNP/jrI7q6pYGBLbsM=",
-       uint64_t{0xafdc251dbf97b5f8}, uint64_t{0xaa1388f078e793e0}},
-      {"S4gpMSKzMD7CWPsSfLeYyhSpfWOntyuVZdX1xSBjiGvsspwOZcxNKCRIOqAA0moUfOh3I5+"
-       "juQV4rsqYElMD/gWfDGpsWZKQ",
-       uint64_t{0x10ec9c92ddb5dcbc}, uint64_t{0xf10d68d0f3309360}},
-      {"oswxop+"
-       "bthuDLT4j0PcoSKby4LhF47ZKg8K17xxHf74UsGCzTBbOz0MM8hQEGlyqDT1iUiAYnaPaUp"
-       "L2mRK0rcIUYA4qLt5uOw==",
-       uint64_t{0x9a767d5822c7dac4}, uint64_t{0x2af056184457a3de}},
-      {"0II/"
-       "697p+"
-       "BtLSjxj5989OXI004TogEb94VUnDzOVSgMXie72cuYRvTFNIBgtXlKfkiUjeqVpd4a+"
-       "n5bxNOD1TGrjQtzKU5r7obo=",
-       uint64_t{0xee46254080d6e2db}, uint64_t{0x6d0058e1590b2489}},
-      {"E84YZW2qipAlMPmctrg7TKlwLZ68l4L+c0xRDUfyyFrA4MAti0q9sHq3TDFviH0Y+"
-       "Kq3tEE5srWFA8LM9oomtmvm5PYxoaarWPLc",
-       uint64_t{0xbbb669588d8bf398}, uint64_t{0x638f287f68817f12}},
-      {"x3pa4HIElyZG0Nj7Vdy9IdJIR4izLmypXw5PCmZB5y68QQ4uRaVVi3UthsoJROvbjDJkP2D"
-       "Q6L/eN8pFeLFzNPKBYzcmuMOb5Ull7w==",
-       uint64_t{0xdc2afaa529beef44}, uint64_t{0xc46b71fecefd5467}},
-      {"jVDKGYIuWOP/"
-       "QKLdd2wi8B2VJA8Wh0c8PwrXJVM8FOGM3voPDVPyDJOU6QsBDPseoR8uuKd19OZ/"
-       "zAvSCB+zlf6upAsBlheUKgCfKww=",
-       uint64_t{0xf1f67391d45013a8}, uint64_t{0x2c8e94679d964e0a}},
-      {"mkquunhmYe1aR2wmUz4vcvLEcKBoe6H+kjUok9VUn2+eTSkWs4oDDtJvNCWtY5efJwg/"
-       "j4PgjRYWtqnrCkhaqJaEvkkOwVfgMIwF3e+d",
-       uint64_t{0x16fce2b8c65a3429}, uint64_t{0x8612b797ce22503a}},
-      {"fRelvKYonTQ+s+rnnvQw+JzGfFoPixtna0vzcSjiDqX5s2Kg2//"
-       "UGrK+AVCyMUhO98WoB1DDbrsOYSw2QzrcPe0+3ck9sePvb+Q/IRaHbw==",
-       uint64_t{0xf4b096699f49fe67}, uint64_t{0x59f929babfba7170}},
-      {"DUwXFJzagljo44QeJ7/"
-       "6ZKw4QXV18lhkYT2jglMr8WB3CHUU4vdsytvw6AKv42ZcG6fRkZkq9fpnmXy6xG0aO3WPT1"
-       "eHuyFirAlkW+zKtwg=",
-       uint64_t{0xca584c4bc8198682}, uint64_t{0x9527556923fb49a0}},
-      {"cYmZCrOOBBongNTr7e4nYn52uQUy2mfe48s50JXx2AZ6cRAt/"
-       "xRHJ5QbEoEJOeOHsJyM4nbzwFm++SlT6gFZZHJpkXJ92JkR86uS/eV1hJUR",
-       uint64_t{0xed269fc3818b6aad}, uint64_t{0x1039ab644f5e150b}},
-      {"EXeHBDfhwzAKFhsMcH9+2RHwV+mJaN01+9oacF6vgm8mCXRd6jeN9U2oAb0of5c5cO4i+"
-       "Vb/LlHZSMI490SnHU0bejhSCC2gsC5d2K30ER3iNA==",
-       uint64_t{0x33f253cbb8fe66a8}, uint64_t{0x7816c83f3aa05e6d}},
-      {"FzkzRYoNjkxFhZDso94IHRZaJUP61nFYrh5MwDwv9FNoJ5jyNCY/"
-       "eazPZk+tbmzDyJIGw2h3GxaWZ9bSlsol/vK98SbkMKCQ/wbfrXRLcDzdd/8=",
-       uint64_t{0xd0b76b2c1523d99c}, uint64_t{0xf51d2f564518c619}},
-      {"Re4aXISCMlYY/XsX7zkIFR04ta03u4zkL9dVbLXMa/q6hlY/CImVIIYRN3VKP4pnd0AUr/"
-       "ugkyt36JcstAInb4h9rpAGQ7GMVOgBniiMBZ/MGU7H",
-       uint64_t{0xfd28f0811a2a237f}, uint64_t{0x67d494cff03ac004}},
-      {"ueLyMcqJXX+MhO4UApylCN9WlTQ+"
-       "ltJmItgG7vFUtqs2qNwBMjmAvr5u0sAKd8jpzV0dDPTwchbIeAW5zbtkA2NABJV6hFM48ib"
-       "4/J3A5mseA3cS8w==",
-       uint64_t{0x6261fb136482e84}, uint64_t{0x2802d636ced1cfbb}},
-      {"6Si7Yi11L+jZMkwaN+GUuzXMrlvEqviEkGOilNq0h8TdQyYKuFXzkYc/"
-       "q74gP3pVCyiwz9KpVGMM9vfnq36riMHRknkmhQutxLZs5fbmOgEO69HglCU=",
-       uint64_t{0x458efc750bca7c3a}, uint64_t{0xf64e20bad771cb12}},
-      {"Q6AbOofGuTJOegPh9Clm/"
-       "9crtUMQqylKrTc1fhfJo1tqvpXxhU4k08kntL1RG7woRnFrVh2UoMrL1kjin+s9CanT+"
-       "y4hHwLqRranl9FjvxfVKm3yvg68",
-       uint64_t{0xa7e69ff84e5e7c27}, uint64_t{0xb9a6cf84a83e15e}},
-      {"ieQEbIPvqY2YfIjHnqfJiO1/MIVRk0RoaG/WWi3kFrfIGiNLCczYoklgaecHMm/"
-       "1sZ96AjO+a5stQfZbJQwS7Sc1ODABEdJKcTsxeW2hbh9A6CFzpowP1A==",
-       uint64_t{0x3c59bfd0c29efe9e}, uint64_t{0x8da6630319609301}},
-      {"zQUv8hFB3zh2GGl3KTvCmnfzE+"
-       "SUgQPVaSVIELFX5H9cE3FuVFGmymkPQZJLAyzC90Cmi8GqYCvPqTuAAB//"
-       "XTJxy4bCcVArgZG9zJXpjowpNBfr3ngWrSE=",
-       uint64_t{0x10befacc6afd298d}, uint64_t{0x40946a86e2a996f3}},
-      {"US4hcC1+op5JKGC7eIs8CUgInjKWKlvKQkapulxW262E/"
-       "B2ye79QxOexf188u2mFwwe3WTISJHRZzS61IwljqAWAWoBAqkUnW8SHmIDwHUP31J0p5sGd"
-       "P47L",
-       uint64_t{0x41d5320b0a38efa7}, uint64_t{0xcab7f5997953fa76}},
-      {"9bHUWFna2LNaGF6fQLlkx1Hkt24nrkLE2CmFdWgTQV3FFbUe747SSqYw6ebpTa07MWSpWRP"
-       "sHesVo2B9tqHbe7eQmqYebPDFnNqrhSdZwFm9arLQVs+7a3Ic6A==",
-       uint64_t{0x58db1c7450fe17f3}, uint64_t{0x39129ca0e04fc465}},
-      {"Kb3DpHRUPhtyqgs3RuXjzA08jGb59hjKTOeFt1qhoINfYyfTt2buKhD6YVffRCPsgK9SeqZ"
-       "qRPJSyaqsa0ovyq1WnWW8jI/NhvAkZTVHUrX2pC+cD3OPYT05Dag=",
-       uint64_t{0x6098c055a335b7a6}, uint64_t{0x5238221fd685e1b8}},
-      {"gzxyMJIPlU+bJBwhFUCHSofZ/"
-       "319LxqMoqnt3+L6h2U2+ZXJCSsYpE80xmR0Ta77Jq54o92SMH87HV8dGOaCTuAYF+"
-       "lDL42SY1P316Cl0sZTS2ow3ZqwGbcPNs/1",
-       uint64_t{0x1bbacec67845a801}, uint64_t{0x175130c407dbcaab}},
-      {"uR7V0TW+FGVMpsifnaBAQ3IGlr1wx5sKd7TChuqRe6OvUXTlD4hKWy8S+"
-       "8yyOw8lQabism19vOQxfmocEOW/"
-       "vzY0pEa87qHrAZy4s9fH2Bltu8vaOIe+agYohhYORQ==",
-       uint64_t{0xc419cfc7442190}, uint64_t{0x2f20e7536c0b0df}},
-      {"1UR5eoo2aCwhacjZHaCh9bkOsITp6QunUxHQ2SfeHv0imHetzt/"
-       "Z70mhyWZBalv6eAx+YfWKCUib2SHDtz/"
-       "A2dc3hqUWX5VfAV7FQsghPUAtu6IiRatq4YSLpDvKZBQ=",
-       uint64_t{0xc95e510d94ba270c}, uint64_t{0x2742cb488a04ad56}},
-      {"opubR7H63BH7OtY+Avd7QyQ25UZ8kLBdFDsBTwZlY6gA/"
-       "u+x+"
-       "czC9AaZMgmQrUy15DH7YMGsvdXnviTtI4eVI4aF1H9Rl3NXMKZgwFOsdTfdcZeeHVRzBBKX"
-       "8jUfh1il",
-       uint64_t{0xff1ae05c98089c3f}, uint64_t{0xd6afb593879ff93b}},
-      {"DC0kXcSXtfQ9FbSRwirIn5tgPri0sbzHSa78aDZVDUKCMaBGyFU6BmrulywYX8yzvwprdLs"
-       "oOwTWN2wMjHlPDqrvVHNEjnmufRDblW+nSS+xtKNs3N5xsxXdv6JXDrAB/Q==",
-       uint64_t{0x90c02b8dceced493}, uint64_t{0xf50ad64caac0ca7f}},
-      {"BXRBk+3wEP3Lpm1y75wjoz+PgB0AMzLe8tQ1AYU2/"
-       "oqrQB2YMC6W+9QDbcOfkGbeH+b7IBkt/"
-       "gwCMw2HaQsRFEsurXtcQ3YwRuPz5XNaw5NAvrNa67Fm7eRzdE1+hWLKtA8=",
-       uint64_t{0x9f8a76697ab1aa36}, uint64_t{0x2ade95c4261364ae}},
-      {"RRBSvEGYnzR9E45Aps/+WSnpCo/X7gJLO4DRnUqFrJCV/kzWlusLE/"
-       "6ZU6RoUf2ROwcgEvUiXTGjLs7ts3t9SXnJHxC1KiOzxHdYLMhVvgNd3hVSAXODpKFSkVXND"
-       "55G2L1W",
-       uint64_t{0x6ba1bf3d811a531d}, uint64_t{0x5c4f3299faacd07a}},
-      {"jeh6Qazxmdi57pa9S3XSnnZFIRrnc6s8QLrah5OX3SB/V2ErSPoEAumavzQPkdKF1/"
-       "SfvmdL+qgF1C+Yawy562QaFqwVGq7+tW0yxP8FStb56ZRgNI4IOmI30s1Ei7iops9Uuw==",
-       uint64_t{0x6a418974109c67b4}, uint64_t{0xfffe3bff0ae5e9bc}},
-      {"6QO5nnDrY2/"
-       "wrUXpltlKy2dSBcmK15fOY092CR7KxAjNfaY+"
-       "aAmtWbbzQk3MjBg03x39afSUN1fkrWACdyQKRaGxgwq6MGNxI6W+8DLWJBHzIXrntrE/"
-       "ml6fnNXEpxplWJ1vEs4=",
-       uint64_t{0x8472f1c2b3d230a3}, uint64_t{0x1db785c0005166e4}},
-      {"0oPxeEHhqhcFuwonNfLd5jF3RNATGZS6NPoS0WklnzyokbTqcl4BeBkMn07+fDQv83j/"
-       "BpGUwcWO05f3+DYzocfnizpFjLJemFGsls3gxcBYxcbqWYev51tG3lN9EvRE+X9+Pwww",
-       uint64_t{0x5e06068f884e73a7}, uint64_t{0xea000d962ad18418}},
-      {"naSBSjtOKgAOg8XVbR5cHAW3Y+QL4Pb/JO9/"
-       "oy6L08wvVRZqo0BrssMwhzBP401Um7A4ppAupbQeJFdMrysY34AuSSNvtNUy5VxjNECwiNt"
-       "gwYHw7yakDUv8WvonctmnoSPKENegQg==",
-       uint64_t{0x55290b1a8f170f59}, uint64_t{0xe42aef38359362d9}},
-      {"vPyl8DxVeRe1OpilKb9KNwpGkQRtA94UpAHetNh+"
-       "95V7nIW38v7PpzhnTWIml5kw3So1Si0TXtIUPIbsu32BNhoH7QwFvLM+"
-       "JACgSpc5e3RjsL6Qwxxi11npwxRmRUqATDeMUfRAjxg=",
-       uint64_t{0x5501cfd83dfe706a}, uint64_t{0xc8e95657348a3891}},
-      {"QC9i2GjdTMuNC1xQJ74ngKfrlA4w3o58FhvNCltdIpuMhHP1YsDA78scQPLbZ3OCUgeQguY"
-       "f/vw6zAaVKSgwtaykqg5ka/4vhz4hYqWU5ficdXqClHl+zkWEY26slCNYOM5nnDlly8Cj",
-       uint64_t{0xe43ed13d13a66990}, uint64_t{0xc162eca864f238c6}},
-      {"7CNIgQhAHX27nxI0HeB5oUTnTdgKpRDYDKwRcXfSFGP1XeT9nQF6WKCMjL1tBV6x7KuJ91G"
-       "Zz11F4c+8s+MfqEAEpd4FHzamrMNjGcjCyrVtU6y+7HscMVzr7Q/"
-       "ODLcPEFztFnwjvCjmHw==",
-       uint64_t{0xdf43bc375cf5283f}, uint64_t{0xbe1fb373e20579ad}},
-      {"Qa/hC2RPXhANSospe+gUaPfjdK/yhQvfm4cCV6/pdvCYWPv8p1kMtKOX3h5/"
-       "8oZ31fsmx4Axphu5qXJokuhZKkBUJueuMpxRyXpwSWz2wELx5glxF7CM0Fn+"
-       "OevnkhUn5jsPlG2r5jYlVn8=",
-       uint64_t{0x8112b806d288d7b5}, uint64_t{0x628a1d4f40aa6ffd}},
-      {"kUw/0z4l3a89jTwN5jpG0SHY5km/"
-       "IVhTjgM5xCiPRLncg40aqWrJ5vcF891AOq5hEpSq0bUCJUMFXgct7kvnys905HjerV7Vs1G"
-       "y84tgVJ70/2+pAZTsB/PzNOE/G6sOj4+GbTzkQu819OLB",
-       uint64_t{0xd52a18abb001cb46}, uint64_t{0xa87bdb7456340f90}},
-      {"VDdfSDbO8Tdj3T5W0XM3EI7iHh5xpIutiM6dvcJ/fhe23V/srFEkDy5iZf/"
-       "VnA9kfi2C79ENnFnbOReeuZW1b3MUXB9lgC6U4pOTuC+"
-       "jHK3Qnpyiqzj7h3ISJSuo2pob7vY6VHZo6Fn7exEqHg==",
-       uint64_t{0xe12b76a2433a1236}, uint64_t{0x5960ef3ba982c801}},
-      {"Ldfvy3ORdquM/R2fIkhH/ONi69mcP1AEJ6n/"
-       "oropwecAsLJzQSgezSY8bEiEs0VnFTBBsW+RtZY6tDj03fnb3amNUOq1b7jbqyQkL9hpl+"
-       "2Z2J8IaVSeownWl+bQcsR5/xRktIMckC5AtF4YHfU=",
-       uint64_t{0x175bf7319cf1fa00}, uint64_t{0x5026586df9a431ec}},
-      {"BrbNpb42+"
-       "VzZAjJw6QLirXzhweCVRfwlczzZ0VX2xluskwBqyfnGovz5EuX79JJ31VNXa5hTkAyQat3l"
-       "YKRADTdAdwE5PqM1N7YaMqqsqoAAAeuYVXuk5eWCykYmClNdSspegwgCuT+403JigBzi",
-       uint64_t{0xd63d57b3f67525ae}, uint64_t{0xfe4b8a20fdf0840b}},
-      {"gB3NGHJJvVcuPyF0ZSvHwnWSIfmaI7La24VMPQVoIIWF7Z74NltPZZpx2f+cocESM+"
-       "ILzQW9p+BC8x5IWz7N4Str2WLGKMdgmaBfNkEhSHQDU0IJEOnpUt0HmjhFaBlx0/"
-       "LTmhua+rQ6Wup8ezLwfg==",
-       uint64_t{0x933faea858832b73}, uint64_t{0xdcb761867da7072f}},
-      {"hTKHlRxx6Pl4gjG+6ksvvj0CWFicUg3WrPdSJypDpq91LUWRni2KF6+"
-       "81ZoHBFhEBrCdogKqeK+hy9bLDnx7g6rAFUjtn1+cWzQ2YjiOpz4+"
-       "ROBB7lnwjyTGWzJD1rXtlso1g2qVH8XJVigC5M9AIxM=",
-       uint64_t{0x53d061e5f8e7c04f}, uint64_t{0xc10d4653667275b7}},
-      {"IWQBelSQnhrr0F3BhUpXUIDauhX6f95Qp+A0diFXiUK7irwPG1oqBiqHyK/SH/"
-       "9S+"
-       "rln9DlFROAmeFdH0OCJi2tFm4afxYzJTFR4HnR4cG4x12JqHaZLQx6iiu6CE3rtWBVz99oA"
-       "wCZUOEXIsLU24o2Y",
-       uint64_t{0xdb4124556dd515e0}, uint64_t{0x727720deec13110b}},
-      {"TKo+l+"
-       "1dOXdLvIrFqeLaHdm0HZnbcdEgOoLVcGRiCbAMR0j5pIFw8D36tefckAS1RCFOH5IgP8yiF"
-       "T0Gd0a2hI3+"
-       "fTKA7iK96NekxWeoeqzJyctc6QsoiyBlkZerRxs5RplrxoeNg29kKDTM0K94mnhD9g==",
-       uint64_t{0x4fb31a0dd681ee71}, uint64_t{0x710b009662858dc9}},
-      {"YU4e7G6EfQYvxCFoCrrT0EFgVLHFfOWRTJQJ5gxM3G2b+"
-       "1kJf9YPrpsxF6Xr6nYtS8reEEbDoZJYqnlk9lXSkVArm88Cqn6d25VCx3+"
-       "49MqC0trIlXtb7SXUUhwpJK16T0hJUfPH7s5cMZXc6YmmbFuBNPE=",
-       uint64_t{0x27cc72eefa138e4c}, uint64_t{0xfbf8f7a3ecac1eb7}},
-      {"/I/"
-       "eImMwPo1U6wekNFD1Jxjk9XQVi1D+"
-       "FPdqcHifYXQuP5aScNQfxMAmaPR2XhuOQhADV5tTVbBKwCDCX4E3jcDNHzCiPvViZF1W27t"
-       "xaf2BbFQdwKrNCmrtzcluBFYu0XZfc7RU1RmxK/RtnF1qHsq/O4pp",
-       uint64_t{0x44bc2dfba4bd3ced}, uint64_t{0xb6fc4fcd0722e3df}},
-      {"CJTT9WGcY2XykTdo8KodRIA29qsqY0iHzWZRjKHb9alwyJ7RZAE3V5Juv4MY3MeYEr1EPCC"
-       "MxO7yFXqT8XA8YTjaMp3bafRt17Pw8JC4iKJ1zN+WWKOESrj+"
-       "3aluGQqn8z1EzqY4PH7rLG575PYeWsP98BugdA==",
-       uint64_t{0x242da1e3a439bed8}, uint64_t{0x7cb86dcc55104aac}},
-      {"ZlhyQwLhXQyIUEnMH/"
-       "AEW27vh9xrbNKJxpWGtrEmKhd+nFqAfbeNBQjW0SfG1YI0xQkQMHXjuTt4P/"
-       "EpZRtA47ibZDVS8TtaxwyBjuIDwqcN09eCtpC+Ls+"
-       "vWDTLmBeDM3u4hmzz4DQAYsLiZYSJcldg9Q3wszw=",
-       uint64_t{0xdc559c746e35c139}, uint64_t{0x19e71e9b45c3a51e}},
-      {"v2KU8y0sCrBghmnm8lzGJlwo6D6ObccAxCf10heoDtYLosk4ztTpLlpSFEyu23MLA1tJkcg"
-       "Rko04h19QMG0mOw/"
-       "wc93EXAweriBqXfvdaP85sZABwiKO+6rtS9pacRVpYYhHJeVTQ5NzrvBvi1huxAr+"
-       "xswhVMfL",
-       uint64_t{0xd0b0350275b9989}, uint64_t{0x51de38573c2bea48}},
-      {"QhKlnIS6BuVCTQsnoE67E/"
-       "yrgogE8EwO7xLaEGei26m0gEU4OksefJgppDh3X0x0Cs78Dr9IHK5b977CmZlrTRmwhlP8p"
-       "M+UzXPNRNIZuN3ntOum/QhUWP8SGpirheXENWsXMQ/"
-       "nxtxakyEtrNkKk471Oov9juP8oQ==",
-       uint64_t{0xb04489e41d17730c}, uint64_t{0xa73ab6996d6df158}},
-      {"/ZRMgnoRt+Uo6fUPr9FqQvKX7syhgVqWu+"
-       "WUSsiQ68UlN0efSP6Eced5gJZL6tg9gcYJIkhjuQNITU0Q3TjVAnAcobgbJikCn6qZ6pRxK"
-       "BY4MTiAlfGD3T7R7hwJwx554MAy++Zb/YUFlnCaCJiwQMnowF7aQzwYFCo=",
-       uint64_t{0x2217285eb4572156}, uint64_t{0x55ef2b8c930817b2}},
-      {"NB7tU5fNE8nI+SXGfipc7sRkhnSkUF1krjeo6k+8FITaAtdyz+"
-       "o7mONgXmGLulBPH9bEwyYhKNVY0L+njNQrZ9YC2aXsFD3PdZsxAFaBT3VXEzh+"
-       "NGBTjDASNL3mXyS8Yv1iThGfHoY7T4aR0NYGJ+k+pR6f+KrPC96M",
-       uint64_t{0x12c2e8e68aede73b}, uint64_t{0xb2850bf5fae87157}},
-      {"8T6wrqCtEO6/rwxF6lvMeyuigVOLwPipX/FULvwyu+1wa5sQGav/"
-       "2FsLHUVn6cGSi0LlFwLewGHPFJDLR0u4t7ZUyM//"
-       "x6da0sWgOa5hzDqjsVGmjxEHXiaXKW3i4iSZNuxoNbMQkIbVML+"
-       "DkYu9ND0O2swg4itGeVSzXA==",
-       uint64_t{0x4d612125bdc4fd00}, uint64_t{0xecf3de1acd04651f}},
-      {"Ntf1bMRdondtMv1CYr3G80iDJ4WSAlKy5H34XdGruQiCrnRGDBa+"
-       "eUi7vKp4gp3BBcVGl8eYSasVQQjn7MLvb3BjtXx6c/"
-       "bCL7JtpzQKaDnPr9GWRxpBXVxKREgMM7d8lm35EODv0w+"
-       "hQLfVSh8OGs7fsBb68nNWPLeeSOo=",
-       uint64_t{0x81826b553954464e}, uint64_t{0xcc0a40552559ff32}},
-      {"VsSAw72Ro6xks02kaiLuiTEIWBC5bgqr4WDnmP8vglXzAhixk7td926rm9jNimL+"
-       "kroPSygZ9gl63aF5DCPOACXmsbmhDrAQuUzoh9ZKhWgElLQsrqo1KIjWoZT5b5QfVUXY9lS"
-       "IBg3U75SqORoTPq7HalxxoIT5diWOcJQi",
-       uint64_t{0xc2e5d345dc0ddd2d}, uint64_t{0xc385c374f20315b1}},
-      {"j+loZ+C87+"
-       "bJxNVebg94gU0mSLeDulcHs84tQT7BZM2rzDSLiCNxUedHr1ZWJ9ejTiBa0dqy2I2ABc++"
-       "xzOLcv+//YfibtjKtYggC6/3rv0XCc7xu6d/"
-       "O6xO+XOBhOWAQ+IHJVHf7wZnDxIXB8AUHsnjEISKj7823biqXjyP3g==",
-       uint64_t{0x3da6830a9e32631e}, uint64_t{0xb90208a4c7234183}},
-      {"f3LlpcPElMkspNtDq5xXyWU62erEaKn7RWKlo540gR6mZsNpK1czV/"
-       "sOmqaq8XAQLEn68LKj6/"
-       "cFkJukxRzCa4OF1a7cCAXYFp9+wZDu0bw4y63qbpjhdCl8GO6Z2lkcXy7KOzbPE01ukg7+"
-       "gN+7uKpoohgAhIwpAKQXmX5xtd0=",
-       uint64_t{0xc9ae5c8759b4877a}, uint64_t{0x58aa1ca7a4c075d9}},
-  };
-
-  for (const auto& expected_result : expected_results) {
-    std::string str;
-    ASSERT_TRUE(absl::Base64Unescape(expected_result.base64_data, &str));
-    EXPECT_EQ(absl::hash_internal::Wyhash(str.data(), str.size(),
-                                          expected_result.seed, kSalt),
-              expected_result.hash);
-  }
-}
-
-}  // namespace
diff --git a/third_party/abseil-cpp/absl/numeric/int128.cc b/third_party/abseil-cpp/absl/numeric/int128.cc
index 5160df7..17d8874 100644
--- a/third_party/abseil-cpp/absl/numeric/int128.cc
+++ b/third_party/abseil-cpp/absl/numeric/int128.cc
@@ -138,28 +138,21 @@
 uint128::uint128(double v) : uint128(MakeUint128FromFloat(v)) {}
 uint128::uint128(long double v) : uint128(MakeUint128FromFloat(v)) {}
 
+#if !defined(ABSL_HAVE_INTRINSIC_INT128)
 uint128 operator/(uint128 lhs, uint128 rhs) {
-#if defined(ABSL_HAVE_INTRINSIC_INT128)
-  return static_cast<unsigned __int128>(lhs) /
-         static_cast<unsigned __int128>(rhs);
-#else  // ABSL_HAVE_INTRINSIC_INT128
   uint128 quotient = 0;
   uint128 remainder = 0;
   DivModImpl(lhs, rhs, &quotient, &remainder);
   return quotient;
-#endif  // ABSL_HAVE_INTRINSIC_INT128
 }
+
 uint128 operator%(uint128 lhs, uint128 rhs) {
-#if defined(ABSL_HAVE_INTRINSIC_INT128)
-  return static_cast<unsigned __int128>(lhs) %
-         static_cast<unsigned __int128>(rhs);
-#else  // ABSL_HAVE_INTRINSIC_INT128
   uint128 quotient = 0;
   uint128 remainder = 0;
   DivModImpl(lhs, rhs, &quotient, &remainder);
   return remainder;
-#endif  // ABSL_HAVE_INTRINSIC_INT128
 }
+#endif  // !defined(ABSL_HAVE_INTRINSIC_INT128)
 
 namespace {
 
diff --git a/third_party/abseil-cpp/absl/numeric/int128.h b/third_party/abseil-cpp/absl/numeric/int128.h
index 198aa19..c7ad96b 100644
--- a/third_party/abseil-cpp/absl/numeric/int128.h
+++ b/third_party/abseil-cpp/absl/numeric/int128.h
@@ -18,6 +18,10 @@
 // -----------------------------------------------------------------------------
 //
 // This header file defines 128-bit integer types, `uint128` and `int128`.
+//
+// TODO(absl-team): This module is inconsistent as many inline `uint128` methods
+// are defined in this file, while many inline `int128` methods are defined in
+// the `int128_*_intrinsic.inc` files.
 
 #ifndef ABSL_NUMERIC_INT128_H_
 #define ABSL_NUMERIC_INT128_H_
@@ -582,10 +586,10 @@
 
 // Arithmetic operators.
 
-uint128 operator<<(uint128 lhs, int amount);
-uint128 operator>>(uint128 lhs, int amount);
-uint128 operator+(uint128 lhs, uint128 rhs);
-uint128 operator-(uint128 lhs, uint128 rhs);
+constexpr uint128 operator<<(uint128 lhs, int amount);
+constexpr uint128 operator>>(uint128 lhs, int amount);
+constexpr uint128 operator+(uint128 lhs, uint128 rhs);
+constexpr uint128 operator-(uint128 lhs, uint128 rhs);
 uint128 operator*(uint128 lhs, uint128 rhs);
 uint128 operator/(uint128 lhs, uint128 rhs);
 uint128 operator%(uint128 lhs, uint128 rhs);
@@ -782,16 +786,19 @@
 
 // Comparison operators.
 
-inline bool operator==(uint128 lhs, uint128 rhs) {
+constexpr bool operator==(uint128 lhs, uint128 rhs) {
+#if defined(ABSL_HAVE_INTRINSIC_INT128)
+  return static_cast<unsigned __int128>(lhs) ==
+         static_cast<unsigned __int128>(rhs);
+#else
   return (Uint128Low64(lhs) == Uint128Low64(rhs) &&
           Uint128High64(lhs) == Uint128High64(rhs));
+#endif
 }
 
-inline bool operator!=(uint128 lhs, uint128 rhs) {
-  return !(lhs == rhs);
-}
+constexpr bool operator!=(uint128 lhs, uint128 rhs) { return !(lhs == rhs); }
 
-inline bool operator<(uint128 lhs, uint128 rhs) {
+constexpr bool operator<(uint128 lhs, uint128 rhs) {
 #ifdef ABSL_HAVE_INTRINSIC_INT128
   return static_cast<unsigned __int128>(lhs) <
          static_cast<unsigned __int128>(rhs);
@@ -802,11 +809,11 @@
 #endif
 }
 
-inline bool operator>(uint128 lhs, uint128 rhs) { return rhs < lhs; }
+constexpr bool operator>(uint128 lhs, uint128 rhs) { return rhs < lhs; }
 
-inline bool operator<=(uint128 lhs, uint128 rhs) { return !(rhs < lhs); }
+constexpr bool operator<=(uint128 lhs, uint128 rhs) { return !(rhs < lhs); }
 
-inline bool operator>=(uint128 lhs, uint128 rhs) { return !(lhs < rhs); }
+constexpr bool operator>=(uint128 lhs, uint128 rhs) { return !(lhs < rhs); }
 
 // Unary operators.
 
@@ -818,110 +825,153 @@
   return val;
 }
 
-inline uint128 operator-(uint128 val) {
-  uint64_t hi = ~Uint128High64(val);
-  uint64_t lo = ~Uint128Low64(val) + 1;
-  if (lo == 0) ++hi;  // carry
-  return MakeUint128(hi, lo);
+constexpr uint128 operator-(uint128 val) {
+#if defined(ABSL_HAVE_INTRINSIC_INT128)
+  return -static_cast<unsigned __int128>(val);
+#else
+  return MakeUint128(
+      ~Uint128High64(val) + static_cast<unsigned long>(Uint128Low64(val) == 0),
+      ~Uint128Low64(val) + 1);
+#endif
 }
 
 constexpr inline bool operator!(uint128 val) {
+#if defined(ABSL_HAVE_INTRINSIC_INT128)
+  return !static_cast<unsigned __int128>(val);
+#else
   return !Uint128High64(val) && !Uint128Low64(val);
+#endif
 }
 
 // Logical operators.
 
 constexpr inline uint128 operator~(uint128 val) {
+#if defined(ABSL_HAVE_INTRINSIC_INT128)
+  return ~static_cast<unsigned __int128>(val);
+#else
   return MakeUint128(~Uint128High64(val), ~Uint128Low64(val));
+#endif
 }
 
 constexpr inline uint128 operator|(uint128 lhs, uint128 rhs) {
+#if defined(ABSL_HAVE_INTRINSIC_INT128)
+  return static_cast<unsigned __int128>(lhs) |
+         static_cast<unsigned __int128>(rhs);
+#else
   return MakeUint128(Uint128High64(lhs) | Uint128High64(rhs),
-                           Uint128Low64(lhs) | Uint128Low64(rhs));
+                     Uint128Low64(lhs) | Uint128Low64(rhs));
+#endif
 }
 
 constexpr inline uint128 operator&(uint128 lhs, uint128 rhs) {
+#if defined(ABSL_HAVE_INTRINSIC_INT128)
+  return static_cast<unsigned __int128>(lhs) &
+         static_cast<unsigned __int128>(rhs);
+#else
   return MakeUint128(Uint128High64(lhs) & Uint128High64(rhs),
-                           Uint128Low64(lhs) & Uint128Low64(rhs));
+                     Uint128Low64(lhs) & Uint128Low64(rhs));
+#endif
 }
 
 constexpr inline uint128 operator^(uint128 lhs, uint128 rhs) {
+#if defined(ABSL_HAVE_INTRINSIC_INT128)
+  return static_cast<unsigned __int128>(lhs) ^
+         static_cast<unsigned __int128>(rhs);
+#else
   return MakeUint128(Uint128High64(lhs) ^ Uint128High64(rhs),
-                           Uint128Low64(lhs) ^ Uint128Low64(rhs));
+                     Uint128Low64(lhs) ^ Uint128Low64(rhs));
+#endif
 }
 
 inline uint128& uint128::operator|=(uint128 other) {
-  hi_ |= other.hi_;
-  lo_ |= other.lo_;
+  *this = *this | other;
   return *this;
 }
 
 inline uint128& uint128::operator&=(uint128 other) {
-  hi_ &= other.hi_;
-  lo_ &= other.lo_;
+  *this = *this & other;
   return *this;
 }
 
 inline uint128& uint128::operator^=(uint128 other) {
-  hi_ ^= other.hi_;
-  lo_ ^= other.lo_;
+  *this = *this ^ other;
   return *this;
 }
 
 // Arithmetic operators.
 
-inline uint128 operator<<(uint128 lhs, int amount) {
+constexpr uint128 operator<<(uint128 lhs, int amount) {
 #ifdef ABSL_HAVE_INTRINSIC_INT128
   return static_cast<unsigned __int128>(lhs) << amount;
 #else
   // uint64_t shifts of >= 64 are undefined, so we will need some
   // special-casing.
-  if (amount < 64) {
-    if (amount != 0) {
-      return MakeUint128(
-          (Uint128High64(lhs) << amount) | (Uint128Low64(lhs) >> (64 - amount)),
-          Uint128Low64(lhs) << amount);
-    }
-    return lhs;
-  }
-  return MakeUint128(Uint128Low64(lhs) << (amount - 64), 0);
+  return amount >= 64 ? MakeUint128(Uint128Low64(lhs) << (amount - 64), 0)
+         : amount == 0 ? lhs
+                       : MakeUint128((Uint128High64(lhs) << amount) |
+                                         (Uint128Low64(lhs) >> (64 - amount)),
+                                     Uint128Low64(lhs) << amount);
 #endif
 }
 
-inline uint128 operator>>(uint128 lhs, int amount) {
+constexpr uint128 operator>>(uint128 lhs, int amount) {
 #ifdef ABSL_HAVE_INTRINSIC_INT128
   return static_cast<unsigned __int128>(lhs) >> amount;
 #else
   // uint64_t shifts of >= 64 are undefined, so we will need some
   // special-casing.
-  if (amount < 64) {
-    if (amount != 0) {
-      return MakeUint128(Uint128High64(lhs) >> amount,
-                         (Uint128Low64(lhs) >> amount) |
-                             (Uint128High64(lhs) << (64 - amount)));
-    }
-    return lhs;
-  }
-  return MakeUint128(0, Uint128High64(lhs) >> (amount - 64));
+  return amount >= 64 ? MakeUint128(0, Uint128High64(lhs) >> (amount - 64))
+         : amount == 0 ? lhs
+                       : MakeUint128(Uint128High64(lhs) >> amount,
+                                     (Uint128Low64(lhs) >> amount) |
+                                         (Uint128High64(lhs) << (64 - amount)));
 #endif
 }
 
-inline uint128 operator+(uint128 lhs, uint128 rhs) {
-  uint128 result = MakeUint128(Uint128High64(lhs) + Uint128High64(rhs),
-                               Uint128Low64(lhs) + Uint128Low64(rhs));
-  if (Uint128Low64(result) < Uint128Low64(lhs)) {  // check for carry
-    return MakeUint128(Uint128High64(result) + 1, Uint128Low64(result));
-  }
-  return result;
+#if !defined(ABSL_HAVE_INTRINSIC_INT128)
+namespace int128_internal {
+constexpr uint128 AddResult(uint128 result, uint128 lhs) {
+  // check for carry
+  return (Uint128Low64(result) < Uint128Low64(lhs))
+             ? MakeUint128(Uint128High64(result) + 1, Uint128Low64(result))
+             : result;
+}
+}  // namespace int128_internal
+#endif
+
+constexpr uint128 operator+(uint128 lhs, uint128 rhs) {
+#if defined(ABSL_HAVE_INTRINSIC_INT128)
+  return static_cast<unsigned __int128>(lhs) +
+         static_cast<unsigned __int128>(rhs);
+#else
+  return int128_internal::AddResult(
+      MakeUint128(Uint128High64(lhs) + Uint128High64(rhs),
+                  Uint128Low64(lhs) + Uint128Low64(rhs)),
+      lhs);
+#endif
 }
 
-inline uint128 operator-(uint128 lhs, uint128 rhs) {
-  uint128 result = MakeUint128(Uint128High64(lhs) - Uint128High64(rhs),
-                               Uint128Low64(lhs) - Uint128Low64(rhs));
-  if (Uint128Low64(lhs) < Uint128Low64(rhs)) {  // check for carry
-    return MakeUint128(Uint128High64(result) - 1, Uint128Low64(result));
-  }
-  return result;
+#if !defined(ABSL_HAVE_INTRINSIC_INT128)
+namespace int128_internal {
+constexpr uint128 SubstructResult(uint128 result, uint128 lhs, uint128 rhs) {
+  // check for carry
+  return (Uint128Low64(lhs) < Uint128Low64(rhs))
+             ? MakeUint128(Uint128High64(result) - 1, Uint128Low64(result))
+             : result;
+}
+}  // namespace int128_internal
+#endif
+
+constexpr uint128 operator-(uint128 lhs, uint128 rhs) {
+#if defined(ABSL_HAVE_INTRINSIC_INT128)
+  return static_cast<unsigned __int128>(lhs) -
+         static_cast<unsigned __int128>(rhs);
+#else
+  return int128_internal::SubstructResult(
+      MakeUint128(Uint128High64(lhs) - Uint128High64(rhs),
+                  Uint128Low64(lhs) - Uint128Low64(rhs)),
+      lhs, rhs);
+#endif
 }
 
 inline uint128 operator*(uint128 lhs, uint128 rhs) {
@@ -951,6 +1001,18 @@
 #endif  // ABSL_HAVE_INTRINSIC128
 }
 
+#if defined(ABSL_HAVE_INTRINSIC_INT128)
+inline uint128 operator/(uint128 lhs, uint128 rhs) {
+  return static_cast<unsigned __int128>(lhs) /
+         static_cast<unsigned __int128>(rhs);
+}
+
+inline uint128 operator%(uint128 lhs, uint128 rhs) {
+  return static_cast<unsigned __int128>(lhs) %
+         static_cast<unsigned __int128>(rhs);
+}
+#endif
+
 // Increment/decrement operators.
 
 inline uint128 uint128::operator++(int) {
@@ -1008,17 +1070,17 @@
 }
 
 // Arithmetic operators.
-
-int128 operator+(int128 lhs, int128 rhs);
-int128 operator-(int128 lhs, int128 rhs);
+constexpr int128 operator-(int128 v);
+constexpr int128 operator+(int128 lhs, int128 rhs);
+constexpr int128 operator-(int128 lhs, int128 rhs);
 int128 operator*(int128 lhs, int128 rhs);
 int128 operator/(int128 lhs, int128 rhs);
 int128 operator%(int128 lhs, int128 rhs);
-int128 operator|(int128 lhs, int128 rhs);
-int128 operator&(int128 lhs, int128 rhs);
-int128 operator^(int128 lhs, int128 rhs);
-int128 operator<<(int128 lhs, int amount);
-int128 operator>>(int128 lhs, int amount);
+constexpr int128 operator|(int128 lhs, int128 rhs);
+constexpr int128 operator&(int128 lhs, int128 rhs);
+constexpr int128 operator^(int128 lhs, int128 rhs);
+constexpr int128 operator<<(int128 lhs, int amount);
+constexpr int128 operator>>(int128 lhs, int amount);
 
 inline int128& int128::operator+=(int128 other) {
   *this = *this + other;
@@ -1070,6 +1132,9 @@
   return *this;
 }
 
+// Forward declaration for comparison operators.
+constexpr bool operator!=(int128 lhs, int128 rhs);
+
 namespace int128_internal {
 
 // Casts from unsigned to signed while preserving the underlying binary
diff --git a/third_party/abseil-cpp/absl/numeric/int128_have_intrinsic.inc b/third_party/abseil-cpp/absl/numeric/int128_have_intrinsic.inc
index d6c76dd..3945fa2 100644
--- a/third_party/abseil-cpp/absl/numeric/int128_have_intrinsic.inc
+++ b/third_party/abseil-cpp/absl/numeric/int128_have_intrinsic.inc
@@ -155,7 +155,7 @@
 #if defined(__clang__) && !defined(__ppc64__)
 inline int128::operator float() const { return static_cast<float>(v_); }
 
-inline int128::operator double () const { return static_cast<double>(v_); }
+inline int128::operator double() const { return static_cast<double>(v_); }
 
 inline int128::operator long double() const {
   return static_cast<long double>(v_);
@@ -163,8 +163,8 @@
 
 #else  // Clang on PowerPC
 // Forward declaration for conversion operators to floating point types.
-int128 operator-(int128 v);
-bool operator!=(int128 lhs, int128 rhs);
+constexpr int128 operator-(int128 v);
+constexpr bool operator!=(int128 lhs, int128 rhs);
 
 inline int128::operator float() const {
   // We must convert the absolute value and then negate as needed, because
@@ -199,51 +199,45 @@
 
 // Comparison operators.
 
-inline bool operator==(int128 lhs, int128 rhs) {
+constexpr bool operator==(int128 lhs, int128 rhs) {
   return static_cast<__int128>(lhs) == static_cast<__int128>(rhs);
 }
 
-inline bool operator!=(int128 lhs, int128 rhs) {
+constexpr bool operator!=(int128 lhs, int128 rhs) {
   return static_cast<__int128>(lhs) != static_cast<__int128>(rhs);
 }
 
-inline bool operator<(int128 lhs, int128 rhs) {
+constexpr bool operator<(int128 lhs, int128 rhs) {
   return static_cast<__int128>(lhs) < static_cast<__int128>(rhs);
 }
 
-inline bool operator>(int128 lhs, int128 rhs) {
+constexpr bool operator>(int128 lhs, int128 rhs) {
   return static_cast<__int128>(lhs) > static_cast<__int128>(rhs);
 }
 
-inline bool operator<=(int128 lhs, int128 rhs) {
+constexpr bool operator<=(int128 lhs, int128 rhs) {
   return static_cast<__int128>(lhs) <= static_cast<__int128>(rhs);
 }
 
-inline bool operator>=(int128 lhs, int128 rhs) {
+constexpr bool operator>=(int128 lhs, int128 rhs) {
   return static_cast<__int128>(lhs) >= static_cast<__int128>(rhs);
 }
 
 // Unary operators.
 
-inline int128 operator-(int128 v) {
-  return -static_cast<__int128>(v);
-}
+constexpr int128 operator-(int128 v) { return -static_cast<__int128>(v); }
 
-inline bool operator!(int128 v) {
-  return !static_cast<__int128>(v);
-}
+constexpr bool operator!(int128 v) { return !static_cast<__int128>(v); }
 
-inline int128 operator~(int128 val) {
-  return ~static_cast<__int128>(val);
-}
+constexpr int128 operator~(int128 val) { return ~static_cast<__int128>(val); }
 
 // Arithmetic operators.
 
-inline int128 operator+(int128 lhs, int128 rhs) {
+constexpr int128 operator+(int128 lhs, int128 rhs) {
   return static_cast<__int128>(lhs) + static_cast<__int128>(rhs);
 }
 
-inline int128 operator-(int128 lhs, int128 rhs) {
+constexpr int128 operator-(int128 lhs, int128 rhs) {
   return static_cast<__int128>(lhs) - static_cast<__int128>(rhs);
 }
 
@@ -281,22 +275,22 @@
   return *this;
 }
 
-inline int128 operator|(int128 lhs, int128 rhs) {
+constexpr int128 operator|(int128 lhs, int128 rhs) {
   return static_cast<__int128>(lhs) | static_cast<__int128>(rhs);
 }
 
-inline int128 operator&(int128 lhs, int128 rhs) {
+constexpr int128 operator&(int128 lhs, int128 rhs) {
   return static_cast<__int128>(lhs) & static_cast<__int128>(rhs);
 }
 
-inline int128 operator^(int128 lhs, int128 rhs) {
+constexpr int128 operator^(int128 lhs, int128 rhs) {
   return static_cast<__int128>(lhs) ^ static_cast<__int128>(rhs);
 }
 
-inline int128 operator<<(int128 lhs, int amount) {
+constexpr int128 operator<<(int128 lhs, int amount) {
   return static_cast<__int128>(lhs) << amount;
 }
 
-inline int128 operator>>(int128 lhs, int amount) {
+constexpr int128 operator>>(int128 lhs, int amount) {
   return static_cast<__int128>(lhs) >> amount;
 }
diff --git a/third_party/abseil-cpp/absl/numeric/int128_no_intrinsic.inc b/third_party/abseil-cpp/absl/numeric/int128_no_intrinsic.inc
index c753771..66f6809 100644
--- a/third_party/abseil-cpp/absl/numeric/int128_no_intrinsic.inc
+++ b/third_party/abseil-cpp/absl/numeric/int128_no_intrinsic.inc
@@ -134,10 +134,6 @@
   return static_cast<unsigned long long>(lo_);           // NOLINT(runtime/int)
 }
 
-// Forward declaration for conversion operators to floating point types.
-int128 operator-(int128 v);
-bool operator!=(int128 lhs, int128 rhs);
-
 inline int128::operator float() const {
   // We must convert the absolute value and then negate as needed, because
   // floating point types are typically sign-magnitude. Otherwise, the
@@ -169,76 +165,80 @@
 
 // Comparison operators.
 
-inline bool operator==(int128 lhs, int128 rhs) {
+constexpr bool operator==(int128 lhs, int128 rhs) {
   return (Int128Low64(lhs) == Int128Low64(rhs) &&
           Int128High64(lhs) == Int128High64(rhs));
 }
 
-inline bool operator!=(int128 lhs, int128 rhs) {
-  return !(lhs == rhs);
-}
+constexpr bool operator!=(int128 lhs, int128 rhs) { return !(lhs == rhs); }
 
-inline bool operator<(int128 lhs, int128 rhs) {
+constexpr bool operator<(int128 lhs, int128 rhs) {
   return (Int128High64(lhs) == Int128High64(rhs))
              ? (Int128Low64(lhs) < Int128Low64(rhs))
              : (Int128High64(lhs) < Int128High64(rhs));
 }
 
-inline bool operator>(int128 lhs, int128 rhs) {
+constexpr bool operator>(int128 lhs, int128 rhs) {
   return (Int128High64(lhs) == Int128High64(rhs))
              ? (Int128Low64(lhs) > Int128Low64(rhs))
              : (Int128High64(lhs) > Int128High64(rhs));
 }
 
-inline bool operator<=(int128 lhs, int128 rhs) {
-  return !(lhs > rhs);
-}
+constexpr bool operator<=(int128 lhs, int128 rhs) { return !(lhs > rhs); }
 
-inline bool operator>=(int128 lhs, int128 rhs) {
-  return !(lhs < rhs);
-}
+constexpr bool operator>=(int128 lhs, int128 rhs) { return !(lhs < rhs); }
 
 // Unary operators.
 
-inline int128 operator-(int128 v) {
-  int64_t hi = ~Int128High64(v);
-  uint64_t lo = ~Int128Low64(v) + 1;
-  if (lo == 0) ++hi;  // carry
-  return MakeInt128(hi, lo);
+constexpr int128 operator-(int128 v) {
+  return MakeInt128(~Int128High64(v) + (Int128Low64(v) == 0),
+                    ~Int128Low64(v) + 1);
 }
 
-inline bool operator!(int128 v) {
+constexpr bool operator!(int128 v) {
   return !Int128Low64(v) && !Int128High64(v);
 }
 
-inline int128 operator~(int128 val) {
+constexpr int128 operator~(int128 val) {
   return MakeInt128(~Int128High64(val), ~Int128Low64(val));
 }
 
 // Arithmetic operators.
 
-inline int128 operator+(int128 lhs, int128 rhs) {
-  int128 result = MakeInt128(Int128High64(lhs) + Int128High64(rhs),
-                             Int128Low64(lhs) + Int128Low64(rhs));
-  if (Int128Low64(result) < Int128Low64(lhs)) {  // check for carry
-    return MakeInt128(Int128High64(result) + 1, Int128Low64(result));
-  }
-  return result;
+namespace int128_internal {
+constexpr int128 SignedAddResult(int128 result, int128 lhs) {
+  // check for carry
+  return (Int128Low64(result) < Int128Low64(lhs))
+             ? MakeInt128(Int128High64(result) + 1, Int128Low64(result))
+             : result;
+}
+}  // namespace int128_internal
+constexpr int128 operator+(int128 lhs, int128 rhs) {
+  return int128_internal::SignedAddResult(
+      MakeInt128(Int128High64(lhs) + Int128High64(rhs),
+                 Int128Low64(lhs) + Int128Low64(rhs)),
+      lhs);
 }
 
-inline int128 operator-(int128 lhs, int128 rhs) {
-  int128 result = MakeInt128(Int128High64(lhs) - Int128High64(rhs),
-                             Int128Low64(lhs) - Int128Low64(rhs));
-  if (Int128Low64(lhs) < Int128Low64(rhs)) {  // check for carry
-    return MakeInt128(Int128High64(result) - 1, Int128Low64(result));
-  }
-  return result;
+namespace int128_internal {
+constexpr int128 SignedSubstructResult(int128 result, int128 lhs, int128 rhs) {
+  // check for carry
+  return (Int128Low64(lhs) < Int128Low64(rhs))
+             ? MakeInt128(Int128High64(result) - 1, Int128Low64(result))
+             : result;
+}
+}  // namespace int128_internal
+constexpr int128 operator-(int128 lhs, int128 rhs) {
+  return int128_internal::SignedSubstructResult(
+      MakeInt128(Int128High64(lhs) - Int128High64(rhs),
+                 Int128Low64(lhs) - Int128Low64(rhs)),
+      lhs, rhs);
 }
 
 inline int128 operator*(int128 lhs, int128 rhs) {
-  uint128 result = uint128(lhs) * rhs;
-  return MakeInt128(int128_internal::BitCastToSigned(Uint128High64(result)),
-                    Uint128Low64(result));
+  return MakeInt128(
+      int128_internal::BitCastToSigned(Uint128High64(uint128(lhs) * rhs)),
+      Uint128Low64(uint128(lhs) * rhs));
 }
 
 inline int128 int128::operator++(int) {
@@ -263,46 +263,43 @@
   return *this;
 }
 
-inline int128 operator|(int128 lhs, int128 rhs) {
+constexpr int128 operator|(int128 lhs, int128 rhs) {
   return MakeInt128(Int128High64(lhs) | Int128High64(rhs),
                     Int128Low64(lhs) | Int128Low64(rhs));
 }
 
-inline int128 operator&(int128 lhs, int128 rhs) {
+constexpr int128 operator&(int128 lhs, int128 rhs) {
   return MakeInt128(Int128High64(lhs) & Int128High64(rhs),
                     Int128Low64(lhs) & Int128Low64(rhs));
 }
 
-inline int128 operator^(int128 lhs, int128 rhs) {
+constexpr int128 operator^(int128 lhs, int128 rhs) {
   return MakeInt128(Int128High64(lhs) ^ Int128High64(rhs),
                     Int128Low64(lhs) ^ Int128Low64(rhs));
 }
 
-inline int128 operator<<(int128 lhs, int amount) {
+constexpr int128 operator<<(int128 lhs, int amount) {
   // uint64_t shifts of >= 64 are undefined, so we need some special-casing.
-  if (amount < 64) {
-    if (amount != 0) {
-      return MakeInt128(
-          (Int128High64(lhs) << amount) |
-              static_cast<int64_t>(Int128Low64(lhs) >> (64 - amount)),
-          Int128Low64(lhs) << amount);
-    }
-    return lhs;
-  }
-  return MakeInt128(static_cast<int64_t>(Int128Low64(lhs) << (amount - 64)), 0);
+  return amount >= 64
+             ? MakeInt128(
+                   static_cast<int64_t>(Int128Low64(lhs) << (amount - 64)), 0)
+         : amount == 0
+             ? lhs
+             : MakeInt128(
+                   (Int128High64(lhs) << amount) |
+                       static_cast<int64_t>(Int128Low64(lhs) >> (64 - amount)),
+                   Int128Low64(lhs) << amount);
 }
 
-inline int128 operator>>(int128 lhs, int amount) {
+constexpr int128 operator>>(int128 lhs, int amount) {
   // uint64_t shifts of >= 64 are undefined, so we need some special-casing.
-  if (amount < 64) {
-    if (amount != 0) {
-      return MakeInt128(
-          Int128High64(lhs) >> amount,
-          (Int128Low64(lhs) >> amount) |
-              (static_cast<uint64_t>(Int128High64(lhs)) << (64 - amount)));
-    }
-    return lhs;
-  }
-  return MakeInt128(0,
-                    static_cast<uint64_t>(Int128High64(lhs) >> (amount - 64)));
+  return amount >= 64
+             ? MakeInt128(
+                   0, static_cast<uint64_t>(Int128High64(lhs) >> (amount - 64)))
+         : amount == 0
+             ? lhs
+             : MakeInt128(Int128High64(lhs) >> amount,
+                          (Int128Low64(lhs) >> amount) |
+                              (static_cast<uint64_t>(Int128High64(lhs))
+                               << (64 - amount)));
 }
diff --git a/third_party/abseil-cpp/absl/profiling/BUILD.bazel b/third_party/abseil-cpp/absl/profiling/BUILD.bazel
new file mode 100644
index 0000000..10b256d
--- /dev/null
+++ b/third_party/abseil-cpp/absl/profiling/BUILD.bazel
@@ -0,0 +1,17 @@
+# Copyright 2021 The Abseil Authors
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     https://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+package(default_visibility = ["//visibility:private"])
+
+licenses(["notice"])
diff --git a/third_party/abseil-cpp/absl/profiling/CMakeLists.txt b/third_party/abseil-cpp/absl/profiling/CMakeLists.txt
new file mode 100644
index 0000000..3c37491
--- /dev/null
+++ b/third_party/abseil-cpp/absl/profiling/CMakeLists.txt
@@ -0,0 +1,14 @@
+# Copyright 2021 The Abseil Authors
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     https://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
diff --git a/third_party/abseil-cpp/absl/random/internal/BUILD.bazel b/third_party/abseil-cpp/absl/random/internal/BUILD.bazel
index cf6b538..df6e42f 100644
--- a/third_party/abseil-cpp/absl/random/internal/BUILD.bazel
+++ b/third_party/abseil-cpp/absl/random/internal/BUILD.bazel
@@ -297,6 +297,7 @@
         ":platform",
         "//absl/base:config",
         "//absl/base:core_headers",
+        "//absl/base:endian",
         "//absl/numeric:int128",
     ],
 )
@@ -625,7 +626,7 @@
     name = "randen_hwaes_test",
     size = "small",
     srcs = ["randen_hwaes_test.cc"],
-    copts = ABSL_TEST_COPTS,
+    copts = ABSL_TEST_COPTS + ABSL_RANDOM_RANDEN_COPTS,
     linkopts = ABSL_DEFAULT_LINKOPTS,
     tags = ABSL_RANDOM_NONPORTABLE_TAGS,
     deps = [
diff --git a/third_party/abseil-cpp/absl/random/internal/BUILD.gn b/third_party/abseil-cpp/absl/random/internal/BUILD.gn
index 09a1558..9f8edc2 100644
--- a/third_party/abseil-cpp/absl/random/internal/BUILD.gn
+++ b/third_party/abseil-cpp/absl/random/internal/BUILD.gn
@@ -185,6 +185,7 @@
     ":platform",
     "//third_party/abseil-cpp/absl/base:config",
     "//third_party/abseil-cpp/absl/base:core_headers",
+    "//third_party/abseil-cpp/absl/base:endian",
     "//third_party/abseil-cpp/absl/numeric:int128",
   ]
 }
@@ -243,16 +244,20 @@
   ]
 }
 
-absl_source_set("nanobenchmark") {
-  sources = [ "nanobenchmark.cc" ]
-  deps = [
-    ":platform",
-    ":randen_engine",
-    "//third_party/abseil-cpp/absl/base:config",
-    "//third_party/abseil-cpp/absl/base:core_headers",
-    "//third_party/abseil-cpp/absl/base:raw_logging_internal",
-  ]
-}
+# TODO(danilchap): Enable when can be compiled on all chromium bots.
+# nanobenchmark uses platform specific functions to take accurate current time,
+# and fallbacks to clock_gettime. Several chromium configurations lack both
+# dedicated code and the clock_gettime system function.
+# absl_source_set("nanobenchmark") {
+#  sources = [ "nanobenchmark.cc" ]
+#  deps = [
+#    ":platform",
+#    ":randen_engine",
+#    "//third_party/abseil-cpp/absl/base:config",
+#    "//third_party/abseil-cpp/absl/base:core_headers",
+#    "//third_party/abseil-cpp/absl/base:raw_logging_internal",
+#  ]
+# }
 
 absl_source_set("uniform_helper") {
   public = [ "uniform_helper.h" ]
diff --git a/third_party/abseil-cpp/absl/random/internal/generate_real.h b/third_party/abseil-cpp/absl/random/internal/generate_real.h
index 4f62873..d5fbb44 100644
--- a/third_party/abseil-cpp/absl/random/internal/generate_real.h
+++ b/third_party/abseil-cpp/absl/random/internal/generate_real.h
@@ -127,10 +127,8 @@
 
   // Construct the 32-bit or 64-bit IEEE 754 floating-point value from
   // the individual fields: sign, exp, mantissa(bits).
-  uint_type val =
-      (std::is_same<SignedTag, GeneratePositiveTag>::value ? 0u : sign) |
-      (static_cast<uint_type>(exp) << kExp) |
-      (static_cast<uint_type>(bits) & kMask);
+  uint_type val = sign | (static_cast<uint_type>(exp) << kExp) |
+                  (static_cast<uint_type>(bits) & kMask);
 
   // bit_cast to the output-type
   real_type result;
diff --git a/third_party/abseil-cpp/absl/random/internal/randen_hwaes.cc b/third_party/abseil-cpp/absl/random/internal/randen_hwaes.cc
index ab51e4a..3040b3a 100644
--- a/third_party/abseil-cpp/absl/random/internal/randen_hwaes.cc
+++ b/third_party/abseil-cpp/absl/random/internal/randen_hwaes.cc
@@ -30,43 +30,13 @@
 // ABSL_RANDEN_HWAES_IMPL indicates whether this file will contain
 // a hardware accelerated implementation of randen, or whether it
 // will contain stubs that exit the process.
-#if defined(ABSL_ARCH_X86_64) || defined(ABSL_ARCH_X86_32)
-// The platform.h directives are sufficient to indicate whether
-// we should build accelerated implementations for x86.
-#if (ABSL_HAVE_ACCELERATED_AES || ABSL_RANDOM_INTERNAL_AES_DISPATCH)
-#define ABSL_RANDEN_HWAES_IMPL 1
-#endif
-#elif defined(ABSL_ARCH_PPC)
-// The platform.h directives are sufficient to indicate whether
-// we should build accelerated implementations for PPC.
-//
-// NOTE: This has mostly been tested on 64-bit Power variants,
-// and not embedded cpus such as powerpc32-8540
 #if ABSL_HAVE_ACCELERATED_AES
+// The following plaforms have implemented RandenHwAes.
+#if defined(ABSL_ARCH_X86_64) || defined(ABSL_ARCH_X86_32) || \
+    defined(ABSL_ARCH_PPC) || defined(ABSL_ARCH_ARM) ||       \
+    defined(ABSL_ARCH_AARCH64)
 #define ABSL_RANDEN_HWAES_IMPL 1
 #endif
-#elif defined(ABSL_ARCH_ARM) || defined(ABSL_ARCH_AARCH64)
-// ARM is somewhat more complicated. We might support crypto natively...
-#if ABSL_HAVE_ACCELERATED_AES || \
-    (defined(__ARM_NEON) && defined(__ARM_FEATURE_CRYPTO))
-#define ABSL_RANDEN_HWAES_IMPL 1
-
-#elif ABSL_RANDOM_INTERNAL_AES_DISPATCH && !defined(__APPLE__) && \
-    (defined(__GNUC__) && __GNUC__ > 4 || __GNUC__ == 4 && __GNUC_MINOR__ > 9)
-// ...or, on GCC, we can use an ASM directive to
-// instruct the assember to allow crypto instructions.
-#define ABSL_RANDEN_HWAES_IMPL 1
-#define ABSL_RANDEN_HWAES_IMPL_CRYPTO_DIRECTIVE 1
-#endif
-#else
-// HWAES is unsupported by these architectures / platforms:
-//   __myriad2__
-//   __mips__
-//
-// Other architectures / platforms are unknown.
-//
-// See the Abseil documentation on supported macros at:
-// https://abseil.io/docs/cpp/platforms/macros
 #endif
 
 #if !defined(ABSL_RANDEN_HWAES_IMPL)
@@ -192,22 +162,6 @@
 
 #elif defined(ABSL_ARCH_ARM) || defined(ABSL_ARCH_AARCH64)
 
-// This asm directive will cause the file to be compiled with crypto extensions
-// whether or not the cpu-architecture supports it.
-#if ABSL_RANDEN_HWAES_IMPL_CRYPTO_DIRECTIVE
-asm(".arch_extension  crypto\n");
-
-// Override missing defines.
-#if !defined(__ARM_NEON)
-#define __ARM_NEON 1
-#endif
-
-#if !defined(__ARM_FEATURE_CRYPTO)
-#define __ARM_FEATURE_CRYPTO 1
-#endif
-
-#endif
-
 // Rely on the ARM NEON+Crypto advanced simd types, defined in <arm_neon.h>.
 // uint8x16_t is the user alias for underlying __simd128_uint8_t type.
 // http://infocenter.arm.com/help/topic/com.arm.doc.ihi0073a/IHI0073A_arm_neon_intrinsics_ref.pdf
diff --git a/third_party/abseil-cpp/absl/random/internal/randen_slow.cc b/third_party/abseil-cpp/absl/random/internal/randen_slow.cc
index 56aeb03..d5c9347 100644
--- a/third_party/abseil-cpp/absl/random/internal/randen_slow.cc
+++ b/third_party/abseil-cpp/absl/random/internal/randen_slow.cc
@@ -19,6 +19,7 @@
 #include <cstring>
 
 #include "absl/base/attributes.h"
+#include "absl/base/internal/endian.h"
 #include "absl/numeric/int128.h"
 #include "absl/random/internal/platform.h"
 #include "absl/random/internal/randen_traits.h"
@@ -40,7 +41,7 @@
 
 // AES portions based on rijndael-alg-fst.c,
 // https://fastcrypto.org/front/misc/rijndael-alg-fst.c, and modified for
-// little-endianness.
+// platform-endianness.
 //
 // Implementation of
 // http://www.csrc.nist.gov/publications/fips/fips197/fips-197.pdf
@@ -251,6 +252,7 @@
 inline ABSL_RANDOM_INTERNAL_ATTRIBUTE_ALWAYS_INLINE Vector128
 AesRound(const Vector128& state, const Vector128& round_key) {
   Vector128 result;
+#ifdef ABSL_IS_LITTLE_ENDIAN
   result.s[0] = round_key.s[0] ^                  //
                 te0[uint8_t(state.s[0])] ^        //
                 te1[uint8_t(state.s[1] >> 8)] ^   //
@@ -271,6 +273,28 @@
                 te1[uint8_t(state.s[0] >> 8)] ^   //
                 te2[uint8_t(state.s[1] >> 16)] ^  //
                 te3[uint8_t(state.s[2] >> 24)];
+#else
+  result.s[0] = round_key.s[0] ^                  //
+                te0[uint8_t(state.s[0])] ^        //
+                te1[uint8_t(state.s[3] >> 8)] ^   //
+                te2[uint8_t(state.s[2] >> 16)] ^  //
+                te3[uint8_t(state.s[1] >> 24)];
+  result.s[1] = round_key.s[1] ^                  //
+                te0[uint8_t(state.s[1])] ^        //
+                te1[uint8_t(state.s[0] >> 8)] ^   //
+                te2[uint8_t(state.s[3] >> 16)] ^  //
+                te3[uint8_t(state.s[2] >> 24)];
+  result.s[2] = round_key.s[2] ^                  //
+                te0[uint8_t(state.s[2])] ^        //
+                te1[uint8_t(state.s[1] >> 8)] ^   //
+                te2[uint8_t(state.s[0] >> 16)] ^  //
+                te3[uint8_t(state.s[3] >> 24)];
+  result.s[3] = round_key.s[3] ^                  //
+                te0[uint8_t(state.s[3])] ^        //
+                te1[uint8_t(state.s[2] >> 8)] ^   //
+                te2[uint8_t(state.s[1] >> 16)] ^  //
+                te3[uint8_t(state.s[0] >> 24)];
+#endif
   return result;
 }
 
@@ -380,7 +404,11 @@
 const void* RandenSlow::GetKeys() {
   // Round keys for one AES per Feistel round and branch.
   // The canonical implementation uses first digits of Pi.
+#ifdef ABSL_IS_LITTLE_ENDIAN
   return kRandenRoundKeys;
+#else
+  return kRandenRoundKeysBE;
+#endif
 }
 
 void RandenSlow::Absorb(const void* seed_void, void* state_void) {
diff --git a/third_party/abseil-cpp/absl/status/BUILD.bazel b/third_party/abseil-cpp/absl/status/BUILD.bazel
index 189bd73..30df22a 100644
--- a/third_party/abseil-cpp/absl/status/BUILD.bazel
+++ b/third_party/abseil-cpp/absl/status/BUILD.bazel
@@ -78,6 +78,7 @@
     copts = ABSL_DEFAULT_COPTS,
     deps = [
         ":status",
+        "//absl/base",
         "//absl/base:core_headers",
         "//absl/base:raw_logging_internal",
         "//absl/meta:type_traits",
@@ -96,6 +97,7 @@
         ":statusor",
         "//absl/base",
         "//absl/memory",
+        "//absl/strings",
         "//absl/types:any",
         "//absl/utility",
         "@com_google_googletest//:gtest_main",
diff --git a/third_party/abseil-cpp/absl/status/BUILD.gn b/third_party/abseil-cpp/absl/status/BUILD.gn
index 740fb19..7aee518 100644
--- a/third_party/abseil-cpp/absl/status/BUILD.gn
+++ b/third_party/abseil-cpp/absl/status/BUILD.gn
@@ -39,6 +39,7 @@
   ]
   deps = [
     ":status",
+    "//third_party/abseil-cpp/absl/base",
     "//third_party/abseil-cpp/absl/base:core_headers",
     "//third_party/abseil-cpp/absl/base:raw_logging_internal",
     "//third_party/abseil-cpp/absl/meta:type_traits",
@@ -48,3 +49,21 @@
   ]
 }
 
+absl_source_set("statusor_test") {
+  testonly = true
+  sources = [
+    "statusor_test.cc",
+  ]
+  deps = [
+    ":status",
+    ":statusor",
+    "//third_party/abseil-cpp/absl/base",
+    "//third_party/abseil-cpp/absl/memory",
+    "//third_party/abseil-cpp/absl/strings",
+    "//third_party/abseil-cpp/absl/types:any",
+    "//third_party/abseil-cpp/absl/utility",
+    "//third_party/googletest:gmock",
+    "//third_party/googletest:gtest",
+  ]
+}
+
diff --git a/third_party/abseil-cpp/absl/status/CMakeLists.txt b/third_party/abseil-cpp/absl/status/CMakeLists.txt
index 1248dff..4389856 100644
--- a/third_party/abseil-cpp/absl/status/CMakeLists.txt
+++ b/third_party/abseil-cpp/absl/status/CMakeLists.txt
@@ -64,6 +64,7 @@
   COPTS
     ${ABSL_DEFAULT_COPTS}
   DEPS
+    absl::base
     absl::status
     absl::core_headers
     absl::raw_logging_internal
diff --git a/third_party/abseil-cpp/absl/status/status.h b/third_party/abseil-cpp/absl/status/status.h
index 2e05f46..c5fe0a7 100644
--- a/third_party/abseil-cpp/absl/status/status.h
+++ b/third_party/abseil-cpp/absl/status/status.h
@@ -80,7 +80,7 @@
 // `kFailedPrecondition` if both codes apply. Similarly prefer `kNotFound` or
 // `kAlreadyExists` over `kFailedPrecondition`.
 //
-// Because these errors may travel RPC boundaries, these codes are tied to the
+// Because these errors may cross RPC boundaries, these codes are tied to the
 // `google.rpc.Code` definitions within
 // https://github.com/googleapis/googleapis/blob/master/google/rpc/code.proto
 // The string value of these RPC codes is denoted within each enum below.
@@ -114,10 +114,10 @@
   // StatusCode::kInvalidArgument
   //
   // kInvalidArgument (gRPC code "INVALID_ARGUMENT") indicates the caller
-  // specified an invalid argument, such a malformed filename. Note that such
-  // errors should be narrowly limited to indicate to the invalid nature of the
-  // arguments themselves. Errors with validly formed arguments that may cause
-  // errors with the state of the receiving system should be denoted with
+  // specified an invalid argument, such as a malformed filename. Note that use
+  // of such errors should be narrowly limited to indicate the invalid nature of
+  // the arguments themselves. Errors with validly formed arguments that may
+  // cause errors with the state of the receiving system should be denoted with
   // `kFailedPrecondition` instead.
   kInvalidArgument = 3,
 
@@ -137,14 +137,15 @@
   //
   // `kNotFound` is useful if a request should be denied for an entire class of
   // users, such as during a gradual feature rollout or undocumented allow list.
-  // If, instead, a request should be denied for specific sets of users, such as
-  // through user-based access control, use `kPermissionDenied` instead.
+  // If a request should be denied for specific sets of users, such as through
+  // user-based access control, use `kPermissionDenied` instead.
   kNotFound = 5,
 
   // StatusCode::kAlreadyExists
   //
-  // kAlreadyExists (gRPC code "ALREADY_EXISTS") indicates the entity that a
-  // caller attempted to create (such as file or directory) is already present.
+  // kAlreadyExists (gRPC code "ALREADY_EXISTS") indicates that the entity a
+  // caller attempted to create (such as a file or directory) is already
+  // present.
   kAlreadyExists = 6,
 
   // StatusCode::kPermissionDenied
@@ -183,7 +184,7 @@
   //      level (such as when a client-specified test-and-set fails, indicating
   //      the client should restart a read-modify-write sequence).
   //  (c) Use `kFailedPrecondition` if the client should not retry until
-  //      the system state has been explicitly fixed. For example, if an "rmdir"
+  //      the system state has been explicitly fixed. For example, if a "rmdir"
   //      fails because the directory is non-empty, `kFailedPrecondition`
   //      should be returned since the client should not retry unless
   //      the files are deleted from the directory.
@@ -283,7 +284,7 @@
 // absl::StatusToStringMode
 //
 // An `absl::StatusToStringMode` is an enumerated type indicating how
-// `absl::Status::ToString()` should construct the output string for an non-ok
+// `absl::Status::ToString()` should construct the output string for a non-ok
 // status.
 enum class StatusToStringMode : int {
   // ToString will not contain any extra data (such as payloads). It will only
diff --git a/third_party/abseil-cpp/absl/status/statusor.cc b/third_party/abseil-cpp/absl/status/statusor.cc
index b954b45..96642b3 100644
--- a/third_party/abseil-cpp/absl/status/statusor.cc
+++ b/third_party/abseil-cpp/absl/status/statusor.cc
@@ -16,6 +16,7 @@
 #include <cstdlib>
 #include <utility>
 
+#include "absl/base/call_once.h"
 #include "absl/base/internal/raw_logging.h"
 #include "absl/status/status.h"
 #include "absl/strings/str_cat.h"
@@ -26,13 +27,44 @@
 BadStatusOrAccess::BadStatusOrAccess(absl::Status status)
     : status_(std::move(status)) {}
 
-BadStatusOrAccess::~BadStatusOrAccess() = default;
+BadStatusOrAccess::BadStatusOrAccess(const BadStatusOrAccess& other)
+    : status_(other.status_) {}
+
+BadStatusOrAccess& BadStatusOrAccess::operator=(
+    const BadStatusOrAccess& other) {
+  // Ensure assignment is correct regardless of whether this->InitWhat() has
+  // already been called.
+  other.InitWhat();
+  status_ = other.status_;
+  what_ = other.what_;
+  return *this;
+}
+
+BadStatusOrAccess& BadStatusOrAccess::operator=(BadStatusOrAccess&& other) {
+  // Ensure assignment is correct regardless of whether this->InitWhat() has
+  // already been called.
+  other.InitWhat();
+  status_ = std::move(other.status_);
+  what_ = std::move(other.what_);
+  return *this;
+}
+
+BadStatusOrAccess::BadStatusOrAccess(BadStatusOrAccess&& other)
+    : status_(std::move(other.status_)) {}
+
 const char* BadStatusOrAccess::what() const noexcept {
-  return "Bad StatusOr access";
+  InitWhat();
+  return what_.c_str();
 }
 
 const absl::Status& BadStatusOrAccess::status() const { return status_; }
 
+void BadStatusOrAccess::InitWhat() const {
+  absl::call_once(init_what_, [this] {
+    what_ = absl::StrCat("Bad StatusOr access: ", status_.ToString());
+  });
+}
+
 namespace internal_statusor {
 
 void Helper::HandleInvalidStatusCtorArg(absl::Status* status) {
diff --git a/third_party/abseil-cpp/absl/status/statusor.h b/third_party/abseil-cpp/absl/status/statusor.h
index b7c55cc..7fa623f 100644
--- a/third_party/abseil-cpp/absl/status/statusor.h
+++ b/third_party/abseil-cpp/absl/status/statusor.h
@@ -44,6 +44,7 @@
 #include <utility>
 
 #include "absl/base/attributes.h"
+#include "absl/base/call_once.h"
 #include "absl/meta/type_traits.h"
 #include "absl/status/internal/statusor_internal.h"
 #include "absl/status/status.h"
@@ -72,13 +73,18 @@
 class BadStatusOrAccess : public std::exception {
  public:
   explicit BadStatusOrAccess(absl::Status status);
-  ~BadStatusOrAccess() override;
+  ~BadStatusOrAccess() override = default;
+
+  BadStatusOrAccess(const BadStatusOrAccess& other);
+  BadStatusOrAccess& operator=(const BadStatusOrAccess& other);
+  BadStatusOrAccess(BadStatusOrAccess&& other);
+  BadStatusOrAccess& operator=(BadStatusOrAccess&& other);
 
   // BadStatusOrAccess::what()
   //
   // Returns the associated explanatory string of the `absl::StatusOr<T>`
-  // object's error code. This function only returns the string literal "Bad
-  // StatusOr Access" for cases when evaluating general exceptions.
+  // object's error code. This function contains information about the failing
+  // status, but its exact formatting may change and should not be depended on.
   //
   // The pointer of this string is guaranteed to be valid until any non-const
   // function is invoked on the exception object.
@@ -91,7 +97,11 @@
   const absl::Status& status() const;
 
  private:
+  void InitWhat() const;
+
   absl::Status status_;
+  mutable absl::once_flag init_what_;
+  mutable std::string what_;
 };
 
 // Returned StatusOr objects may not be ignored.
@@ -437,8 +447,7 @@
                               T, U&&>>>>>::value,
           int> = 0>
   StatusOr(U&& u)  // NOLINT
-      : StatusOr(absl::in_place, std::forward<U>(u)) {
-  }
+      : StatusOr(absl::in_place, std::forward<U>(u)) {}
 
   template <
       typename U = T,
@@ -457,8 +466,7 @@
               absl::negation<std::is_convertible<U&&, T>>>::value,
           int> = 0>
   explicit StatusOr(U&& u)  // NOLINT
-      : StatusOr(absl::in_place, std::forward<U>(u)) {
-  }
+      : StatusOr(absl::in_place, std::forward<U>(u)) {}
 
   // StatusOr<T>::ok()
   //
@@ -481,7 +489,7 @@
   // Returns a reference to the current `absl::Status` contained within the
   // `absl::StatusOr<T>`. If `absl::StatusOr<T>` contains a `T`, then this
   // function returns `absl::OkStatus()`.
-  const Status& status() const &;
+  const Status& status() const&;
   Status status() &&;
 
   // StatusOr<T>::value()
@@ -510,10 +518,10 @@
   //
   // The `std::move` on statusor instead of on the whole expression enables
   // warnings about possible uses of the statusor object after the move.
-  const T& value() const&;
-  T& value() &;
-  const T&& value() const&&;
-  T&& value() &&;
+  const T& value() const& ABSL_ATTRIBUTE_LIFETIME_BOUND;
+  T& value() & ABSL_ATTRIBUTE_LIFETIME_BOUND;
+  const T&& value() const&& ABSL_ATTRIBUTE_LIFETIME_BOUND;
+  T&& value() && ABSL_ATTRIBUTE_LIFETIME_BOUND;
 
   // StatusOr<T>:: operator*()
   //
@@ -525,10 +533,10 @@
   // `absl::StatusOr<T>`. Alternatively, see the `value()` member function for a
   // similar API that guarantees crashing or throwing an exception if there is
   // no current value.
-  const T& operator*() const&;
-  T& operator*() &;
-  const T&& operator*() const&&;
-  T&& operator*() &&;
+  const T& operator*() const& ABSL_ATTRIBUTE_LIFETIME_BOUND;
+  T& operator*() & ABSL_ATTRIBUTE_LIFETIME_BOUND;
+  const T&& operator*() const&& ABSL_ATTRIBUTE_LIFETIME_BOUND;
+  T&& operator*() && ABSL_ATTRIBUTE_LIFETIME_BOUND;
 
   // StatusOr<T>::operator->()
   //
@@ -537,8 +545,8 @@
   // REQUIRES: `this->ok() == true`, otherwise the behavior is undefined.
   //
   // Use `this->ok()` to verify that there is a current value.
-  const T* operator->() const;
-  T* operator->();
+  const T* operator->() const ABSL_ATTRIBUTE_LIFETIME_BOUND;
+  T* operator->() ABSL_ATTRIBUTE_LIFETIME_BOUND;
 
   // StatusOr<T>::value_or()
   //
@@ -661,7 +669,9 @@
     : Base(absl::in_place, ilist, std::forward<Args>(args)...) {}
 
 template <typename T>
-const Status& StatusOr<T>::status() const & { return this->status_; }
+const Status& StatusOr<T>::status() const& {
+  return this->status_;
+}
 template <typename T>
 Status StatusOr<T>::status() && {
   return ok() ? OkStatus() : std::move(this->status_);
diff --git a/third_party/abseil-cpp/absl/status/statusor_test.cc b/third_party/abseil-cpp/absl/status/statusor_test.cc
index c2e8fb7..7cae90e 100644
--- a/third_party/abseil-cpp/absl/status/statusor_test.cc
+++ b/third_party/abseil-cpp/absl/status/statusor_test.cc
@@ -17,6 +17,7 @@
 #include <array>
 #include <initializer_list>
 #include <memory>
+#include <string>
 #include <type_traits>
 #include <utility>
 
@@ -25,6 +26,7 @@
 #include "absl/base/casts.h"
 #include "absl/memory/memory.h"
 #include "absl/status/status.h"
+#include "absl/strings/string_view.h"
 #include "absl/types/any.h"
 #include "absl/utility/utility.h"
 
@@ -34,6 +36,7 @@
 using ::testing::AnyWith;
 using ::testing::ElementsAre;
 using ::testing::Field;
+using ::testing::HasSubstr;
 using ::testing::Ne;
 using ::testing::Not;
 using ::testing::Pointee;
@@ -257,9 +260,9 @@
 
 TEST(StatusOr, TestValueOrDieOverloadForConstTemporary) {
   static_assert(
-      std::is_same<const int&&,
-                   decltype(
-                       std::declval<const absl::StatusOr<int>&&>().value())>(),
+      std::is_same<
+          const int&&,
+          decltype(std::declval<const absl::StatusOr<int>&&>().value())>(),
       "value() for const temporaries should return const T&&");
 }
 
@@ -303,20 +306,57 @@
   EXPECT_NE(status.message(), "Some error");
 }
 
+TEST(BadStatusOrAccessTest, CopyConstructionWhatOk) {
+  absl::Status error =
+      absl::InternalError("some arbitrary message too big for the sso buffer");
+  absl::BadStatusOrAccess e1{error};
+  absl::BadStatusOrAccess e2{e1};
+  EXPECT_THAT(e1.what(), HasSubstr(error.ToString()));
+  EXPECT_THAT(e2.what(), HasSubstr(error.ToString()));
+}
+
+TEST(BadStatusOrAccessTest, CopyAssignmentWhatOk) {
+  absl::Status error =
+      absl::InternalError("some arbitrary message too big for the sso buffer");
+  absl::BadStatusOrAccess e1{error};
+  absl::BadStatusOrAccess e2{absl::InternalError("other")};
+  e2 = e1;
+  EXPECT_THAT(e1.what(), HasSubstr(error.ToString()));
+  EXPECT_THAT(e2.what(), HasSubstr(error.ToString()));
+}
+
+TEST(BadStatusOrAccessTest, MoveConstructionWhatOk) {
+  absl::Status error =
+      absl::InternalError("some arbitrary message too big for the sso buffer");
+  absl::BadStatusOrAccess e1{error};
+  absl::BadStatusOrAccess e2{std::move(e1)};
+  EXPECT_THAT(e2.what(), HasSubstr(error.ToString()));
+}
+
+TEST(BadStatusOrAccessTest, MoveAssignmentWhatOk) {
+  absl::Status error =
+      absl::InternalError("some arbitrary message too big for the sso buffer");
+  absl::BadStatusOrAccess e1{error};
+  absl::BadStatusOrAccess e2{absl::InternalError("other")};
+  e2 = std::move(e1);
+  EXPECT_THAT(e2.what(), HasSubstr(error.ToString()));
+}
+
 // Define `EXPECT_DEATH_OR_THROW` to test the behavior of `StatusOr::value`,
 // which either throws `BadStatusOrAccess` or `LOG(FATAL)` based on whether
 // exceptions are enabled.
 #ifdef ABSL_HAVE_EXCEPTIONS
-#define EXPECT_DEATH_OR_THROW(statement, status_)    \
-  EXPECT_THROW(                                      \
-      {                                              \
-        try {                                        \
-          statement;                                 \
-        } catch (const absl::BadStatusOrAccess& e) { \
-          EXPECT_EQ(e.status(), status_);            \
-          throw;                                     \
-        }                                            \
-      },                                             \
+#define EXPECT_DEATH_OR_THROW(statement, status_)                  \
+  EXPECT_THROW(                                                    \
+      {                                                            \
+        try {                                                      \
+          statement;                                               \
+        } catch (const absl::BadStatusOrAccess& e) {               \
+          EXPECT_EQ(e.status(), status_);                          \
+          EXPECT_THAT(e.what(), HasSubstr(e.status().ToString())); \
+          throw;                                                   \
+        }                                                          \
+      },                                                           \
       absl::BadStatusOrAccess);
 #else  // ABSL_HAVE_EXCEPTIONS
 #define EXPECT_DEATH_OR_THROW(statement, status) \
@@ -412,8 +452,6 @@
   EXPECT_EQ(thing.status().code(), absl::StatusCode::kCancelled);
 }
 
-
-
 TEST(StatusOr, TestValueCtor) {
   const int kI = 4;
   const absl::StatusOr<int> thing(kI);
@@ -1300,8 +1338,6 @@
   EXPECT_EQ(thing.status().code(), absl::StatusCode::kUnknown);
 }
 
-
-
 TEST(StatusOr, TestPointerStatusCtor) {
   absl::StatusOr<int*> thing(absl::CancelledError());
   EXPECT_FALSE(thing.ok());
diff --git a/third_party/abseil-cpp/absl/strings/BUILD.bazel b/third_party/abseil-cpp/absl/strings/BUILD.bazel
index b70aac3..f9735b4 100644
--- a/third_party/abseil-cpp/absl/strings/BUILD.bazel
+++ b/third_party/abseil-cpp/absl/strings/BUILD.bazel
@@ -269,11 +269,17 @@
     name = "cord_internal",
     srcs = [
         "internal/cord_internal.cc",
+        "internal/cord_rep_btree.cc",
+        "internal/cord_rep_btree_navigator.cc",
+        "internal/cord_rep_btree_reader.cc",
         "internal/cord_rep_consume.cc",
         "internal/cord_rep_ring.cc",
     ],
     hdrs = [
         "internal/cord_internal.h",
+        "internal/cord_rep_btree.h",
+        "internal/cord_rep_btree_navigator.h",
+        "internal/cord_rep_btree_reader.h",
         "internal/cord_rep_consume.h",
         "internal/cord_rep_flat.h",
         "internal/cord_rep_ring.h",
@@ -296,6 +302,57 @@
         "//absl/container:layout",
         "//absl/functional:function_ref",
         "//absl/meta:type_traits",
+        "//absl/types:span",
+    ],
+)
+
+cc_test(
+    name = "cord_rep_btree_test",
+    size = "medium",
+    srcs = ["internal/cord_rep_btree_test.cc"],
+    copts = ABSL_TEST_COPTS,
+    visibility = ["//visibility:private"],
+    deps = [
+        ":cord_internal",
+        ":cord_rep_test_util",
+        ":strings",
+        "//absl/base:config",
+        "//absl/base:raw_logging_internal",
+        "//absl/cleanup",
+        "@com_google_googletest//:gtest_main",
+    ],
+)
+
+cc_test(
+    name = "cord_rep_btree_navigator_test",
+    size = "medium",
+    srcs = ["internal/cord_rep_btree_navigator_test.cc"],
+    copts = ABSL_TEST_COPTS,
+    visibility = ["//visibility:private"],
+    deps = [
+        ":cord_internal",
+        ":cord_rep_test_util",
+        ":strings",
+        "//absl/base:config",
+        "//absl/base:raw_logging_internal",
+        "@com_google_googletest//:gtest_main",
+    ],
+)
+
+cc_test(
+    name = "cord_rep_btree_reader_test",
+    size = "medium",
+    srcs = ["internal/cord_rep_btree_reader_test.cc"],
+    copts = ABSL_TEST_COPTS,
+    visibility = ["//visibility:private"],
+    deps = [
+        ":cord",
+        ":cord_internal",
+        ":cord_rep_test_util",
+        ":strings",
+        "//absl/base:config",
+        "//absl/base:raw_logging_internal",
+        "@com_google_googletest//:gtest_main",
     ],
 )
 
@@ -578,6 +635,19 @@
 )
 
 cc_library(
+    name = "cord_rep_test_util",
+    testonly = 1,
+    hdrs = ["internal/cord_rep_test_util.h"],
+    copts = ABSL_DEFAULT_COPTS,
+    deps = [
+        ":cord_internal",
+        ":strings",
+        "//absl/base:config",
+        "//absl/base:raw_logging_internal",
+    ],
+)
+
+cc_library(
     name = "cordz_test_helpers",
     testonly = 1,
     hdrs = ["cordz_test_helpers.h"],
diff --git a/third_party/abseil-cpp/absl/strings/BUILD.gn b/third_party/abseil-cpp/absl/strings/BUILD.gn
index 09042b7..ad9f925 100644
--- a/third_party/abseil-cpp/absl/strings/BUILD.gn
+++ b/third_party/abseil-cpp/absl/strings/BUILD.gn
@@ -120,11 +120,17 @@
 absl_source_set("cord_internal") {
   sources = [
     "internal/cord_internal.cc",
+    "internal/cord_rep_btree.cc",
+    "internal/cord_rep_btree_navigator.cc",
+    "internal/cord_rep_btree_reader.cc",
     "internal/cord_rep_consume.cc",
     "internal/cord_rep_ring.cc",
   ]
   public = [
     "internal/cord_internal.h",
+    "internal/cord_rep_btree.h",
+    "internal/cord_rep_btree_navigator.h",
+    "internal/cord_rep_btree_reader.h",
     "internal/cord_rep_consume.h",
     "internal/cord_rep_flat.h",
     "internal/cord_rep_ring.h",
@@ -144,6 +150,37 @@
     "//third_party/abseil-cpp/absl/container:layout",
     "//third_party/abseil-cpp/absl/functional:function_ref",
     "//third_party/abseil-cpp/absl/meta:type_traits",
+    "//third_party/abseil-cpp/absl/types:span",
+  ]
+}
+
+absl_source_set("cord_rep_btree_test") {
+  testonly = true
+  sources = ["internal/cord_rep_btree_test.cc"]
+  deps = [
+    ":cord_internal",
+    ":cord_rep_test_util",
+    ":strings",
+    "//third_party/abseil-cpp/absl/base:config",
+    "//third_party/abseil-cpp/absl/base:raw_logging_internal",
+    "//third_party/abseil-cpp/absl/cleanup",
+    "//third_party/googletest:gmock",
+    "//third_party/googletest:gtest",
+  ]
+}
+
+absl_source_set("cord_rep_btree_reader_test") {
+  testonly = true
+  sources = ["internal/cord_rep_btree_reader_test.cc"]
+  deps = [
+    ":cord",
+    ":cord_internal",
+    ":cord_rep_test_util",
+    ":strings",
+    "//third_party/abseil-cpp/absl/base:config",
+    "//third_party/abseil-cpp/absl/base:raw_logging_internal",
+    "//third_party/googletest:gmock",
+    "//third_party/googletest:gtest",
   ]
 }
 
@@ -385,6 +422,17 @@
   ]
 }
 
+absl_source_set("cord_rep_test_util") {
+  testonly = true
+  public = ["internal/cord_rep_test_util.h"]
+  deps = [
+    ":cord_internal",
+    ":strings",
+    "//third_party/abseil-cpp/absl/base:config",
+    "//third_party/abseil-cpp/absl/base:raw_logging_internal",
+  ]
+}
+
 absl_source_set("cordz_test_helpers") {
   testonly = true
   public = ["cordz_test_helpers.h"]
@@ -484,3 +532,17 @@
     "//third_party/googletest:gtest",
   ]
 }
+
+absl_source_set("cord_rep_btree_navigator_test") {
+  testonly = true
+  sources = [ "internal/cord_rep_btree_navigator_test.cc" ]
+  deps = [
+    ":cord_internal",
+    ":cord_rep_test_util",
+    ":strings",
+    "//third_party/abseil-cpp/absl/base:config",
+    "//third_party/abseil-cpp/absl/base:raw_logging_internal",
+    "//third_party/googletest:gmock",
+    "//third_party/googletest:gtest",
+  ]
+}
diff --git a/third_party/abseil-cpp/absl/strings/CMakeLists.txt b/third_party/abseil-cpp/absl/strings/CMakeLists.txt
index d79ef71..8ad5f9c 100644
--- a/third_party/abseil-cpp/absl/strings/CMakeLists.txt
+++ b/third_party/abseil-cpp/absl/strings/CMakeLists.txt
@@ -555,12 +555,18 @@
     cord_internal
   HDRS
     "internal/cord_internal.h"
+    "internal/cord_rep_btree.h"
+    "internal/cord_rep_btree_navigator.h"
+    "internal/cord_rep_btree_reader.h"
     "internal/cord_rep_consume.h"
     "internal/cord_rep_flat.h"
     "internal/cord_rep_ring.h"
     "internal/cord_rep_ring_reader.h"
   SRCS
     "internal/cord_internal.cc"
+    "internal/cord_rep_btree.cc"
+    "internal/cord_rep_btree_navigator.cc"
+    "internal/cord_rep_btree_reader.cc"
     "internal/cord_rep_consume.cc"
     "internal/cord_rep_ring.cc"
   COPTS
@@ -849,6 +855,21 @@
 
 absl_cc_library(
   NAME
+    cord_rep_test_util
+  HDRS
+    "internal/cord_rep_test_util.h"
+  COPTS
+    ${ABSL_TEST_COPTS}
+  DEPS
+    absl::config
+    absl::cord_internal
+    absl::raw_logging_internal
+    absl::strings
+  TESTONLY
+)
+
+absl_cc_library(
+  NAME
     cord_test_helpers
   HDRS
     "cord_test_helpers.h"
@@ -924,6 +945,61 @@
 
 absl_cc_test(
   NAME
+    cord_rep_btree_test
+  SRCS
+    "internal/cord_rep_btree_test.cc"
+  COPTS
+    ${ABSL_TEST_COPTS}
+  DEPS
+    absl::base
+    absl::cleanup
+    absl::config
+    absl::cord_internal
+    absl::cord_rep_test_util
+    absl::core_headers
+    absl::raw_logging_internal
+    absl::strings
+    GTest::gmock_main
+)
+
+absl_cc_test(
+  NAME
+    cord_rep_btree_navigator_test
+  SRCS
+    "internal/cord_rep_btree_navigator_test.cc"
+  COPTS
+    ${ABSL_TEST_COPTS}
+  DEPS
+    absl::base
+    absl::config
+    absl::cord_internal
+    absl::cord_rep_test_util
+    absl::core_headers
+    absl::raw_logging_internal
+    absl::strings
+    GTest::gmock_main
+)
+
+absl_cc_test(
+  NAME
+    cord_rep_btree_reader_test
+  SRCS
+    "internal/cord_rep_btree_reader_test.cc"
+  COPTS
+    ${ABSL_TEST_COPTS}
+  DEPS
+    absl::base
+    absl::config
+    absl::cord_internal
+    absl::cord_rep_test_util
+    absl::core_headers
+    absl::raw_logging_internal
+    absl::strings
+    GTest::gmock_main
+)
+
+absl_cc_test(
+  NAME
     cord_ring_test
   SRCS
     "cord_ring_test.cc"
diff --git a/third_party/abseil-cpp/absl/strings/cord.cc b/third_party/abseil-cpp/absl/strings/cord.cc
index f5aa6e4..115705a 100644
--- a/third_party/abseil-cpp/absl/strings/cord.cc
+++ b/third_party/abseil-cpp/absl/strings/cord.cc
@@ -36,8 +36,8 @@
 #include "absl/container/inlined_vector.h"
 #include "absl/strings/escaping.h"
 #include "absl/strings/internal/cord_internal.h"
+#include "absl/strings/internal/cord_rep_btree.h"
 #include "absl/strings/internal/cord_rep_flat.h"
-#include "absl/strings/internal/cord_rep_ring.h"
 #include "absl/strings/internal/cordz_statistics.h"
 #include "absl/strings/internal/cordz_update_scope.h"
 #include "absl/strings/internal/cordz_update_tracker.h"
@@ -51,22 +51,16 @@
 ABSL_NAMESPACE_BEGIN
 
 using ::absl::cord_internal::CordRep;
+using ::absl::cord_internal::CordRepBtree;
 using ::absl::cord_internal::CordRepConcat;
 using ::absl::cord_internal::CordRepExternal;
 using ::absl::cord_internal::CordRepFlat;
-using ::absl::cord_internal::CordRepRing;
 using ::absl::cord_internal::CordRepSubstring;
 using ::absl::cord_internal::CordzUpdateTracker;
 using ::absl::cord_internal::InlineData;
 using ::absl::cord_internal::kMaxFlatLength;
 using ::absl::cord_internal::kMinFlatLength;
 
-using ::absl::cord_internal::CONCAT;
-using ::absl::cord_internal::EXTERNAL;
-using ::absl::cord_internal::FLAT;
-using ::absl::cord_internal::RING;
-using ::absl::cord_internal::SUBSTRING;
-
 using ::absl::cord_internal::kInlinedVectorSize;
 using ::absl::cord_internal::kMaxBytesToCopy;
 
@@ -100,13 +94,13 @@
 
 static const int kMinLengthSize = ABSL_ARRAYSIZE(min_length);
 
-static inline bool cord_ring_enabled() {
-  return cord_internal::cord_ring_buffer_enabled.load(
+static inline bool btree_enabled() {
+  return cord_internal::cord_btree_enabled.load(
       std::memory_order_relaxed);
 }
 
 static inline bool IsRootBalanced(CordRep* node) {
-  if (node->tag != CONCAT) {
+  if (!node->IsConcat()) {
     return true;
   } else if (node->concat()->depth() <= 15) {
     return true;
@@ -143,7 +137,7 @@
 
 // Return the depth of a node
 static int Depth(const CordRep* rep) {
-  if (rep->tag == CONCAT) {
+  if (rep->IsConcat()) {
     return rep->concat()->depth();
   } else {
     return 0;
@@ -176,7 +170,7 @@
   }
 
   CordRepConcat* rep = new CordRepConcat();
-  rep->tag = CONCAT;
+  rep->tag = cord_internal::CONCAT;
   SetConcatChildren(rep, left, right);
 
   return rep;
@@ -218,27 +212,25 @@
   return flat;
 }
 
-// Creates a new flat or ringbuffer out of the specified array.
+// Creates a new flat or Btree out of the specified array.
 // The returned node has a refcount of 1.
-static CordRep* RingNewTree(const char* data, size_t length,
-                            size_t alloc_hint) {
+static CordRep* NewBtree(const char* data, size_t length, size_t alloc_hint) {
   if (length <= kMaxFlatLength) {
     return CreateFlat(data, length, alloc_hint);
   }
   CordRepFlat* flat = CreateFlat(data, kMaxFlatLength, 0);
   data += kMaxFlatLength;
   length -= kMaxFlatLength;
-  size_t extra = (length - 1) / kMaxFlatLength + 1;
-  auto* root = CordRepRing::Create(flat, extra);
-  return CordRepRing::Append(root, {data, length}, alloc_hint);
+  auto* root = CordRepBtree::Create(flat);
+  return CordRepBtree::Append(root, {data, length}, alloc_hint);
 }
 
 // Create a new tree out of the specified array.
 // The returned node has a refcount of 1.
 static CordRep* NewTree(const char* data, size_t length, size_t alloc_hint) {
   if (length == 0) return nullptr;
-  if (cord_ring_enabled()) {
-    return RingNewTree(data, length, alloc_hint);
+  if (btree_enabled()) {
+    return NewBtree(data, length, alloc_hint);
   }
   absl::FixedArray<CordRep*> reps((length - 1) / kMaxFlatLength + 1);
   size_t n = 0;
@@ -275,7 +267,7 @@
     CordRepSubstring* rep = new CordRepSubstring();
     assert((offset + length) <= child->length);
     rep->length = length;
-    rep->tag = SUBSTRING;
+    rep->tag = cord_internal::SUBSTRING;
     rep->start = offset;
     rep->child = child;
     return VerifyTree(rep);
@@ -346,10 +338,10 @@
   reduce_size(n);
 }
 
-// Returns `rep` converted into a CordRepRing.
-// Directly returns `rep` if `rep` is already a CordRepRing.
-static CordRepRing* ForceRing(CordRep* rep, size_t extra) {
-  return (rep->tag == RING) ? rep->ring() : CordRepRing::Create(rep, extra);
+// Returns `rep` converted into a CordRepBtree.
+// Directly returns `rep` if `rep` is already a CordRepBtree.
+static CordRepBtree* ForceBtree(CordRep* rep) {
+  return rep->IsBtree() ? rep->btree() : CordRepBtree::Create(rep);
 }
 
 void Cord::InlineRep::AppendTreeToInlined(CordRep* tree,
@@ -357,8 +349,8 @@
   assert(!is_tree());
   if (!data_.is_empty()) {
     CordRepFlat* flat = MakeFlatWithExtraCapacity(0);
-    if (cord_ring_enabled()) {
-      tree = CordRepRing::Append(CordRepRing::Create(flat, 1), tree);
+    if (btree_enabled()) {
+      tree = CordRepBtree::Append(CordRepBtree::Create(flat), tree);
     } else {
       tree = Concat(flat, tree);
     }
@@ -369,8 +361,8 @@
 void Cord::InlineRep::AppendTreeToTree(CordRep* tree, MethodIdentifier method) {
   assert(is_tree());
   const CordzUpdateScope scope(data_.cordz_info(), method);
-  if (cord_ring_enabled()) {
-    tree = CordRepRing::Append(ForceRing(data_.as_tree(), 1), tree);
+  if (btree_enabled()) {
+    tree = CordRepBtree::Append(ForceBtree(data_.as_tree()), tree);
   } else {
     tree = Concat(data_.as_tree(), tree);
   }
@@ -391,8 +383,8 @@
   assert(!is_tree());
   if (!data_.is_empty()) {
     CordRepFlat* flat = MakeFlatWithExtraCapacity(0);
-    if (cord_ring_enabled()) {
-      tree = CordRepRing::Prepend(CordRepRing::Create(flat, 1), tree);
+    if (btree_enabled()) {
+      tree = CordRepBtree::Prepend(CordRepBtree::Create(flat), tree);
     } else {
       tree = Concat(tree, flat);
     }
@@ -404,8 +396,8 @@
                                         MethodIdentifier method) {
   assert(is_tree());
   const CordzUpdateScope scope(data_.cordz_info(), method);
-  if (cord_ring_enabled()) {
-    tree = CordRepRing::Prepend(ForceRing(data_.as_tree(), 1), tree);
+  if (btree_enabled()) {
+    tree = CordRepBtree::Prepend(ForceBtree(data_.as_tree()), tree);
   } else {
     tree = Concat(tree, data_.as_tree());
   }
@@ -427,8 +419,8 @@
 // written to region and the actual size increase will be written to size.
 static inline bool PrepareAppendRegion(CordRep* root, char** region,
                                        size_t* size, size_t max_length) {
-  if (root->tag == RING && root->refcount.IsOne()) {
-    Span<char> span = root->ring()->GetAppendBuffer(max_length);
+  if (root->IsBtree() && root->refcount.IsOne()) {
+    Span<char> span = root->btree()->GetAppendBuffer(max_length);
     if (!span.empty()) {
       *region = span.data();
       *size = span.size();
@@ -438,11 +430,11 @@
 
   // Search down the right-hand path for a non-full FLAT node.
   CordRep* dst = root;
-  while (dst->tag == CONCAT && dst->refcount.IsOne()) {
+  while (dst->IsConcat() && dst->refcount.IsOne()) {
     dst = dst->concat()->right;
   }
 
-  if (dst->tag < FLAT || !dst->refcount.IsOne()) {
+  if (!dst->IsFlat() || !dst->refcount.IsOne()) {
     *region = nullptr;
     *size = 0;
     return false;
@@ -500,22 +492,48 @@
   *region = new_node->Data();
   *size = new_node->length;
 
-  if (cord_ring_enabled()) {
-    rep = CordRepRing::Append(ForceRing(rep, 1), new_node);
+  if (btree_enabled()) {
+    rep = CordRepBtree::Append(ForceBtree(rep), new_node);
   } else {
     rep = Concat(rep, new_node);
   }
   CommitTree(root, rep, scope, method);
 }
 
+// Computes the memory side of the provided edge which must be a valid data edge
+// for a btrtee, i.e., a FLAT, EXTERNAL or SUBSTRING of a FLAT or EXTERNAL node.
+static bool RepMemoryUsageDataEdge(const CordRep* rep,
+                                   size_t* total_mem_usage) {
+  size_t maybe_sub_size = 0;
+  if (ABSL_PREDICT_FALSE(rep->IsSubstring())) {
+    maybe_sub_size = sizeof(cord_internal::CordRepSubstring);
+    rep = rep->substring()->child;
+  }
+  if (rep->IsFlat()) {
+    *total_mem_usage += maybe_sub_size + rep->flat()->AllocatedSize();
+    return true;
+  }
+  if (rep->IsExternal()) {
+    // We don't know anything about the embedded / bound data, but we can safely
+    // assume it is 'at least' a word / pointer to data. In the future we may
+    // choose to use the 'data' byte as a tag to identify the types of some
+    // well-known externals, such as a std::string instance.
+    *total_mem_usage += maybe_sub_size +
+                        sizeof(cord_internal::CordRepExternalImpl<intptr_t>) +
+                        rep->length;
+    return true;
+  }
+  return false;
+}
+
 // If the rep is a leaf, this will increment the value at total_mem_usage and
 // will return true.
 static bool RepMemoryUsageLeaf(const CordRep* rep, size_t* total_mem_usage) {
-  if (rep->tag >= FLAT) {
+  if (rep->IsFlat()) {
     *total_mem_usage += rep->flat()->AllocatedSize();
     return true;
   }
-  if (rep->tag == EXTERNAL) {
+  if (rep->IsExternal()) {
     // We don't know anything about the embedded / bound data, but we can safely
     // assume it is 'at least' a word / pointer to data. In the future we may
     // choose to use the 'data' byte as a tag to identify the types of some
@@ -630,7 +648,7 @@
   }
   if (tree != nullptr) {
     CordzUpdateScope scope(contents_.cordz_info(), method);
-    if (tree->tag >= FLAT && tree->flat()->Capacity() >= length &&
+    if (tree->IsFlat() && tree->flat()->Capacity() >= length &&
         tree->refcount.IsOne()) {
       // Copy in place if the existing FLAT node is reusable.
       memmove(tree->flat()->Data(), data, length);
@@ -671,13 +689,10 @@
       return;
     }
 
-    // Note: we don't concern ourselves if src aliases data stored in the
-    // inlined data of 'this',  as we update the InlineData only at the end.
-    // We are going from an inline size to beyond inline size. Make the new size
-    // either double the inlined size, or the added size + 10%.
-    const size_t size1 = inline_length * 2 + src.size();
-    const size_t size2 = inline_length + src.size() / 10;
-    rep = CordRepFlat::New(std::max<size_t>(size1, size2));
+    // Allocate flat to be a perfect fit on first append exceeding inlined size.
+    // Subsequent growth will use amortized growth until we reach maximum flat
+    // size.
+    rep = CordRepFlat::New(inline_length + src.size());
     appended = std::min(src.size(), rep->flat()->Capacity() - inline_length);
     memcpy(rep->flat()->Data(), data_.as_chars(), inline_length);
     memcpy(rep->flat()->Data() + inline_length, src.data(), appended);
@@ -690,9 +705,11 @@
     return;
   }
 
-  if (cord_ring_enabled()) {
-    rep = ForceRing(rep, (src.size() - 1) / kMaxFlatLength + 1);
-    rep = CordRepRing::Append(rep->ring(), src);
+  if (btree_enabled()) {
+    // TODO(b/192061034): keep legacy 10% growth rate: consider other rates.
+    rep = ForceBtree(rep);
+    const size_t alloc_hint = (std::min)(kMaxFlatLength, rep->length / 10);
+    rep = CordRepBtree::Append(rep->btree(), src, alloc_hint);
   } else {
     // Use new block(s) for any remaining bytes that were not handled above.
     // Alloc extra memory only if the right child of the root of the new tree
@@ -747,7 +764,7 @@
       contents_.AppendArray({src.contents_.data(), src_size}, method);
       return;
     }
-    if (src_tree->tag >= FLAT) {
+    if (src_tree->IsFlat()) {
       // src tree just has one flat node.
       contents_.AppendArray({src_tree->flat()->Data(), src_size}, method);
       return;
@@ -769,9 +786,13 @@
   contents_.AppendTree(rep, CordzUpdateTracker::kAppendCord);
 }
 
-void Cord::Append(const Cord& src) { AppendImpl(src); }
+void Cord::Append(const Cord& src) {
+  AppendImpl(src);
+}
 
-void Cord::Append(Cord&& src) { AppendImpl(std::move(src)); }
+void Cord::Append(Cord&& src) {
+  AppendImpl(std::move(src));
+}
 
 template <typename T, Cord::EnableIfString<T>>
 void Cord::Append(T&& src) {
@@ -833,7 +854,7 @@
   if (n == 0) return CordRep::Ref(node);
   absl::InlinedVector<CordRep*, kInlinedVectorSize> rhs_stack;
 
-  while (node->tag == CONCAT) {
+  while (node->IsConcat()) {
     assert(n <= node->length);
     if (n < node->concat()->left->length) {
       // Push right to stack, descend left.
@@ -852,7 +873,7 @@
   } else {
     size_t start = n;
     size_t len = node->length - n;
-    if (node->tag == SUBSTRING) {
+    if (node->IsSubstring()) {
       // Consider in-place update of node, similar to in RemoveSuffixFrom().
       start += node->substring()->start;
       node = node->substring()->child;
@@ -875,7 +896,7 @@
   absl::InlinedVector<CordRep*, kInlinedVectorSize> lhs_stack;
   bool inplace_ok = node->refcount.IsOne();
 
-  while (node->tag == CONCAT) {
+  while (node->IsConcat()) {
     assert(n <= node->length);
     if (n < node->concat()->right->length) {
       // Push left to stack, descend right.
@@ -892,7 +913,7 @@
 
   if (n == 0) {
     CordRep::Ref(node);
-  } else if (inplace_ok && node->tag != EXTERNAL) {
+  } else if (inplace_ok && !node->IsExternal()) {
     // Consider making a new buffer if the current node capacity is much
     // larger than the new length.
     CordRep::Ref(node);
@@ -900,7 +921,7 @@
   } else {
     size_t start = 0;
     size_t len = node->length - n;
-    if (node->tag == SUBSTRING) {
+    if (node->IsSubstring()) {
       start = node->substring()->start;
       node = node->substring()->child;
     }
@@ -923,8 +944,10 @@
   } else {
     auto constexpr method = CordzUpdateTracker::kRemovePrefix;
     CordzUpdateScope scope(contents_.cordz_info(), method);
-    if (tree->tag == RING) {
-      tree = CordRepRing::RemovePrefix(tree->ring(), n);
+    if (tree->IsBtree()) {
+      CordRep* old = tree;
+      tree = tree->btree()->SubTree(n, tree->length - n);
+      CordRep::Unref(old);
     } else {
       CordRep* newrep = RemovePrefixFrom(tree, n);
       CordRep::Unref(tree);
@@ -944,8 +967,10 @@
   } else {
     auto constexpr method = CordzUpdateTracker::kRemoveSuffix;
     CordzUpdateScope scope(contents_.cordz_info(), method);
-    if (tree->tag == RING) {
-      tree = CordRepRing::RemoveSuffix(tree->ring(), n);
+    if (tree->IsBtree()) {
+      CordRep* old = tree;
+      tree = tree->btree()->SubTree(0, tree->length - n);
+      CordRep::Unref(old);
     } else {
       CordRep* newrep = RemoveSuffixFrom(tree, n);
       CordRep::Unref(tree);
@@ -984,8 +1009,8 @@
       results.push_back(Concat(left, right));
     } else if (pos == 0 && n == node->length) {
       results.push_back(CordRep::Ref(node));
-    } else if (node->tag != CONCAT) {
-      if (node->tag == SUBSTRING) {
+    } else if (!node->IsConcat()) {
+      if (node->IsSubstring()) {
         pos += node->substring()->start;
         node = node->substring()->child;
       }
@@ -1037,9 +1062,8 @@
     return sub_cord;
   }
 
-  if (tree->tag == RING) {
-    CordRepRing* ring = CordRep::Ref(tree)->ring();
-    tree = CordRepRing::SubRing(ring, pos, new_size);
+  if (tree->IsBtree()) {
+    tree = tree->btree()->SubTree(pos, new_size);
   } else {
     tree = NewSubRange(tree, pos, new_size);
   }
@@ -1063,7 +1087,7 @@
       CordRep* node = pending.back();
       pending.pop_back();
       CheckNode(node);
-      if (ABSL_PREDICT_FALSE(node->tag != CONCAT)) {
+      if (ABSL_PREDICT_FALSE(!node->IsConcat())) {
         AddNode(node);
         continue;
       }
@@ -1157,7 +1181,7 @@
 
   static void CheckNode(CordRep* node) {
     ABSL_INTERNAL_CHECK(node->length != 0u, "");
-    if (node->tag == CONCAT) {
+    if (node->IsConcat()) {
       ABSL_INTERNAL_CHECK(node->concat()->left != nullptr, "");
       ABSL_INTERNAL_CHECK(node->concat()->right != nullptr, "");
       ABSL_INTERNAL_CHECK(node->length == (node->concat()->left->length +
@@ -1177,7 +1201,7 @@
 
 static CordRep* Rebalance(CordRep* node) {
   VerifyTree(node);
-  assert(node->tag == CONCAT);
+  assert(node->IsConcat());
 
   if (node->length == 0) {
     return nullptr;
@@ -1227,28 +1251,33 @@
 
 }  // namespace
 
-// Helper routine. Locates the first flat chunk of the Cord without
-// initializing the iterator.
+// Helper routine. Locates the first flat or external chunk of the Cord without
+// initializing the iterator, and returns a string_view referencing the data.
 inline absl::string_view Cord::InlineRep::FindFlatStartPiece() const {
   if (!is_tree()) {
     return absl::string_view(data_.as_chars(), data_.inline_size());
   }
 
   CordRep* node = tree();
-  if (node->tag >= FLAT) {
+  if (node->IsFlat()) {
     return absl::string_view(node->flat()->Data(), node->length);
   }
 
-  if (node->tag == EXTERNAL) {
+  if (node->IsExternal()) {
     return absl::string_view(node->external()->base, node->length);
   }
 
-  if (node->tag == RING) {
-    return node->ring()->entry_data(node->ring()->head());
+  if (node->IsBtree()) {
+    CordRepBtree* tree = node->btree();
+    int height = tree->height();
+    while (--height >= 0) {
+      tree = tree->Edge(CordRepBtree::kFront)->btree();
+    }
+    return tree->Data(tree->begin());
   }
 
   // Walk down the left branches until we hit a non-CONCAT node.
-  while (node->tag == CONCAT) {
+  while (node->IsConcat()) {
     node = node->concat()->left;
   }
 
@@ -1257,16 +1286,16 @@
   size_t length = node->length;
   assert(length != 0);
 
-  if (node->tag == SUBSTRING) {
+  if (node->IsSubstring()) {
     offset = node->substring()->start;
     node = node->substring()->child;
   }
 
-  if (node->tag >= FLAT) {
+  if (node->IsFlat()) {
     return absl::string_view(node->flat()->Data() + offset, length);
   }
 
-  assert((node->tag == EXTERNAL) && "Expect FLAT or EXTERNAL node here");
+  assert(node->IsExternal() && "Expect FLAT or EXTERNAL node here");
 
   return absl::string_view(node->external()->base + offset, length);
 }
@@ -1460,7 +1489,7 @@
 
   // Walk down the left branches until we hit a non-CONCAT node. Save the
   // right children to the stack for subsequent traversal.
-  while (node->tag == CONCAT) {
+  while (node->IsConcat()) {
     stack_of_right_children.push_back(node->concat()->right);
     node = node->concat()->left;
   }
@@ -1468,15 +1497,15 @@
   // Get the child node if we encounter a SUBSTRING.
   size_t offset = 0;
   size_t length = node->length;
-  if (node->tag == SUBSTRING) {
+  if (node->IsSubstring()) {
     offset = node->substring()->start;
     node = node->substring()->child;
   }
 
-  assert(node->tag == EXTERNAL || node->tag >= FLAT);
+  assert(node->IsExternal() || node->IsFlat());
   assert(length != 0);
   const char* data =
-      node->tag == EXTERNAL ? node->external()->base : node->flat()->Data();
+      node->IsExternal() ? node->external()->base : node->flat()->Data();
   current_chunk_ = absl::string_view(data + offset, length);
   current_leaf_ = node;
   return *this;
@@ -1506,22 +1535,21 @@
     return subcord;
   }
 
-  if (ring_reader_) {
+  if (btree_reader_) {
     size_t chunk_size = current_chunk_.size();
     if (n <= chunk_size && n <= kMaxBytesToCopy) {
       subcord = Cord(current_chunk_.substr(0, n), method);
+      if (n < chunk_size) {
+        current_chunk_.remove_prefix(n);
+      } else {
+        current_chunk_ = btree_reader_.Next();
+      }
     } else {
-      auto* ring = CordRep::Ref(ring_reader_.ring())->ring();
-      size_t offset = ring_reader_.length() - bytes_remaining_;
-      CordRep* rep = CordRepRing::SubRing(ring, offset, n);
+      CordRep* rep;
+      current_chunk_ = btree_reader_.Read(n, chunk_size, rep);
       subcord.contents_.EmplaceTree(rep, method);
     }
-    if (n < chunk_size) {
-      bytes_remaining_ -= n;
-      current_chunk_.remove_prefix(n);
-    } else {
-      AdvanceBytesRing(n);
-    }
+    bytes_remaining_ -= n;
     return subcord;
   }
 
@@ -1530,8 +1558,8 @@
     // Range to read is a proper subrange of the current chunk.
     assert(current_leaf_ != nullptr);
     CordRep* subnode = CordRep::Ref(current_leaf_);
-    const char* data = subnode->tag == EXTERNAL ? subnode->external()->base
-                                                : subnode->flat()->Data();
+    const char* data = subnode->IsExternal() ? subnode->external()->base
+                                             : subnode->flat()->Data();
     subnode = NewSubstring(subnode, current_chunk_.data() - data, n);
     subcord.contents_.EmplaceTree(VerifyTree(subnode), method);
     RemoveChunkPrefix(n);
@@ -1543,8 +1571,8 @@
   assert(current_leaf_ != nullptr);
   CordRep* subnode = CordRep::Ref(current_leaf_);
   if (current_chunk_.size() < subnode->length) {
-    const char* data = subnode->tag == EXTERNAL ? subnode->external()->base
-                                                : subnode->flat()->Data();
+    const char* data = subnode->IsExternal() ? subnode->external()->base
+                                             : subnode->flat()->Data();
     subnode = NewSubstring(subnode, current_chunk_.data() - data,
                            current_chunk_.size());
   }
@@ -1582,7 +1610,7 @@
 
   // Walk down the appropriate branches until we hit a non-CONCAT node. Save the
   // right children to the stack for subsequent traversal.
-  while (node->tag == CONCAT) {
+  while (node->IsConcat()) {
     if (node->concat()->left->length > n) {
       // Push right, descend left.
       stack_of_right_children.push_back(node->concat()->right);
@@ -1599,20 +1627,20 @@
   // Get the child node if we encounter a SUBSTRING.
   size_t offset = 0;
   size_t length = node->length;
-  if (node->tag == SUBSTRING) {
+  if (node->IsSubstring()) {
     offset = node->substring()->start;
     node = node->substring()->child;
   }
 
   // Range to read ends with a proper (possibly empty) subrange of the current
   // chunk.
-  assert(node->tag == EXTERNAL || node->tag >= FLAT);
+  assert(node->IsExternal() || node->IsFlat());
   assert(length > n);
   if (n > 0) {
     subnode = Concat(subnode, NewSubstring(CordRep::Ref(node), offset, n));
   }
   const char* data =
-      node->tag == EXTERNAL ? node->external()->base : node->flat()->Data();
+      node->IsExternal() ? node->external()->base : node->flat()->Data();
   current_chunk_ = absl::string_view(data + offset + n, length - n);
   current_leaf_ = node;
   bytes_remaining_ -= n;
@@ -1655,7 +1683,7 @@
 
   // Walk down the appropriate branches until we hit a non-CONCAT node. Save the
   // right children to the stack for subsequent traversal.
-  while (node->tag == CONCAT) {
+  while (node->IsConcat()) {
     if (node->concat()->left->length > n) {
       // Push right, descend left.
       stack_of_right_children.push_back(node->concat()->right);
@@ -1671,15 +1699,15 @@
   // Get the child node if we encounter a SUBSTRING.
   size_t offset = 0;
   size_t length = node->length;
-  if (node->tag == SUBSTRING) {
+  if (node->IsSubstring()) {
     offset = node->substring()->start;
     node = node->substring()->child;
   }
 
-  assert(node->tag == EXTERNAL || node->tag >= FLAT);
+  assert(node->IsExternal() || node->IsFlat());
   assert(length > n);
   const char* data =
-      node->tag == EXTERNAL ? node->external()->base : node->flat()->Data();
+      node->IsExternal() ? node->external()->base : node->flat()->Data();
   current_chunk_ = absl::string_view(data + offset + n, length - n);
   current_leaf_ = node;
   bytes_remaining_ -= n;
@@ -1695,15 +1723,15 @@
   while (true) {
     assert(rep != nullptr);
     assert(offset < rep->length);
-    if (rep->tag >= FLAT) {
+    if (rep->IsFlat()) {
       // Get the "i"th character directly from the flat array.
       return rep->flat()->Data()[offset];
-    } else if (rep->tag == RING) {
-      return rep->ring()->GetCharacter(offset);
-    } else if (rep->tag == EXTERNAL) {
+    } else if (rep->IsBtree()) {
+      return rep->btree()->GetCharacter(offset);
+    } else if (rep->IsExternal()) {
       // Get the "i"th character from the external array.
       return rep->external()->base[offset];
-    } else if (rep->tag == CONCAT) {
+    } else if (rep->IsConcat()) {
       // Recursively branch to the side of the concatenation that the "i"th
       // character is on.
       size_t left_length = rep->concat()->left->length;
@@ -1715,7 +1743,7 @@
       }
     } else {
       // This must be a substring a node, so bypass it to get to the child.
-      assert(rep->tag == SUBSTRING);
+      assert(rep->IsSubstring());
       offset += rep->substring()->start;
       rep = rep->substring()->child;
     }
@@ -1752,27 +1780,27 @@
 
 /* static */ bool Cord::GetFlatAux(CordRep* rep, absl::string_view* fragment) {
   assert(rep != nullptr);
-  if (rep->tag >= FLAT) {
+  if (rep->IsFlat()) {
     *fragment = absl::string_view(rep->flat()->Data(), rep->length);
     return true;
-  } else if (rep->tag == EXTERNAL) {
+  } else if (rep->IsExternal()) {
     *fragment = absl::string_view(rep->external()->base, rep->length);
     return true;
-  } else if (rep->tag == RING) {
-    return rep->ring()->IsFlat(fragment);
-  } else if (rep->tag == SUBSTRING) {
+  } else if (rep->IsBtree()) {
+    return rep->btree()->IsFlat(fragment);
+  } else if (rep->IsSubstring()) {
     CordRep* child = rep->substring()->child;
-    if (child->tag >= FLAT) {
+    if (child->IsFlat()) {
       *fragment = absl::string_view(
           child->flat()->Data() + rep->substring()->start, rep->length);
       return true;
-    } else if (child->tag == EXTERNAL) {
+    } else if (child->IsExternal()) {
       *fragment = absl::string_view(
           child->external()->base + rep->substring()->start, rep->length);
       return true;
-    } else if (child->tag == RING) {
-      return child->ring()->IsFlat(rep->substring()->start, rep->length,
-                                   fragment);
+    } else if (child->IsBtree()) {
+      return child->btree()->IsFlat(rep->substring()->start, rep->length,
+                                    fragment);
     }
   }
   return false;
@@ -1781,7 +1809,7 @@
 /* static */ void Cord::ForEachChunkAux(
     absl::cord_internal::CordRep* rep,
     absl::FunctionRef<void(absl::string_view)> callback) {
-  if (rep->tag == RING) {
+  if (rep->IsBtree()) {
     ChunkIterator it(rep), end;
     while (it != end) {
       callback(*it);
@@ -1797,7 +1825,7 @@
   absl::cord_internal::CordRep* stack[stack_max];
   absl::cord_internal::CordRep* current_node = rep;
   while (true) {
-    if (current_node->tag == CONCAT) {
+    if (current_node->IsConcat()) {
       if (stack_pos == stack_max) {
         // There's no more room on our stack array to add another right branch,
         // and the idea is to avoid allocations, so call this function
@@ -1844,37 +1872,29 @@
     *os << "]";
     *os << " " << (IsRootBalanced(rep) ? 'b' : 'u');
     *os << " " << std::setw(indent) << "";
-    if (rep->tag == CONCAT) {
+    if (rep->IsConcat()) {
       *os << "CONCAT depth=" << Depth(rep) << "\n";
       indent += kIndentStep;
       indents.push_back(indent);
       stack.push_back(rep->concat()->right);
       rep = rep->concat()->left;
-    } else if (rep->tag == SUBSTRING) {
+    } else if (rep->IsSubstring()) {
       *os << "SUBSTRING @ " << rep->substring()->start << "\n";
       indent += kIndentStep;
       rep = rep->substring()->child;
     } else {  // Leaf or ring
-      if (rep->tag == EXTERNAL) {
+      if (rep->IsExternal()) {
         *os << "EXTERNAL [";
         if (include_data)
           *os << absl::CEscape(std::string(rep->external()->base, rep->length));
         *os << "]\n";
-      } else if (rep->tag >= FLAT) {
+      } else if (rep->IsFlat()) {
         *os << "FLAT cap=" << rep->flat()->Capacity() << " [";
         if (include_data)
           *os << absl::CEscape(std::string(rep->flat()->Data(), rep->length));
         *os << "]\n";
       } else {
-        assert(rep->tag == RING);
-        auto* ring = rep->ring();
-        *os << "RING, entries = " << ring->entries() << "\n";
-        CordRepRing::index_type head = ring->head();
-        do {
-          DumpNode(ring->entry_child(head), include_data, os,
-                   indent + kIndentStep);
-          head = ring->advance(head);
-        } while (head != ring->tail());
+        CordRepBtree::Dump(rep, /*label=*/ "", include_data, *os);
       }
       if (stack.empty()) break;
       rep = stack.back();
@@ -1906,7 +1926,7 @@
       ABSL_INTERNAL_CHECK(node->length != 0, ReportError(root, node));
     }
 
-    if (node->tag == CONCAT) {
+    if (node->IsConcat()) {
       ABSL_INTERNAL_CHECK(node->concat()->left != nullptr,
                           ReportError(root, node));
       ABSL_INTERNAL_CHECK(node->concat()->right != nullptr,
@@ -1918,13 +1938,13 @@
         worklist.push_back(node->concat()->right);
         worklist.push_back(node->concat()->left);
       }
-    } else if (node->tag >= FLAT) {
+    } else if (node->IsFlat()) {
       ABSL_INTERNAL_CHECK(node->length <= node->flat()->Capacity(),
                           ReportError(root, node));
-    } else if (node->tag == EXTERNAL) {
+    } else if (node->IsExternal()) {
       ABSL_INTERNAL_CHECK(node->external()->base != nullptr,
                           ReportError(root, node));
-    } else if (node->tag == SUBSTRING) {
+    } else if (node->IsSubstring()) {
       ABSL_INTERNAL_CHECK(
           node->substring()->start < node->substring()->child->length,
           ReportError(root, node));
@@ -1953,7 +1973,7 @@
   while (true) {
     const CordRep* next_node = nullptr;
 
-    if (cur_node->tag == CONCAT) {
+    if (cur_node->IsConcat()) {
       total_mem_usage += sizeof(CordRepConcat);
       const CordRep* left = cur_node->concat()->left;
       if (!RepMemoryUsageLeaf(left, &total_mem_usage)) {
@@ -1967,18 +1987,21 @@
         }
         next_node = right;
       }
-    } else if (cur_node->tag == RING) {
-      total_mem_usage += CordRepRing::AllocSize(cur_node->ring()->capacity());
-      const CordRepRing* ring = cur_node->ring();
-      CordRepRing::index_type pos = ring->head(), tail = ring->tail();
-      do {
-        CordRep* node = ring->entry_child(pos);
-        assert(node->tag >= FLAT || node->tag == EXTERNAL);
-        RepMemoryUsageLeaf(node, &total_mem_usage);
-      } while ((pos = ring->advance(pos)) != tail);
+    } else if (cur_node->IsBtree()) {
+      total_mem_usage += sizeof(CordRepBtree);
+      const CordRepBtree* node = cur_node->btree();
+      if (node->height() == 0) {
+        for (const CordRep* edge : node->Edges()) {
+          RepMemoryUsageDataEdge(edge, &total_mem_usage);
+        }
+      } else {
+        for (const CordRep* edge : node->Edges()) {
+          tree_stack.push_back(edge);
+        }
+      }
     } else {
       // Since cur_node is not a leaf or a concat node it must be a substring.
-      assert(cur_node->tag == SUBSTRING);
+      assert(cur_node->IsSubstring());
       total_mem_usage += sizeof(CordRepSubstring);
       next_node = cur_node->substring()->child;
       if (RepMemoryUsageLeaf(next_node, &total_mem_usage)) {
diff --git a/third_party/abseil-cpp/absl/strings/cord.h b/third_party/abseil-cpp/absl/strings/cord.h
index e758f1c..ac1832f 100644
--- a/third_party/abseil-cpp/absl/strings/cord.h
+++ b/third_party/abseil-cpp/absl/strings/cord.h
@@ -79,8 +79,9 @@
 #include "absl/functional/function_ref.h"
 #include "absl/meta/type_traits.h"
 #include "absl/strings/internal/cord_internal.h"
+#include "absl/strings/internal/cord_rep_btree.h"
+#include "absl/strings/internal/cord_rep_btree_reader.h"
 #include "absl/strings/internal/cord_rep_ring.h"
-#include "absl/strings/internal/cord_rep_ring_reader.h"
 #include "absl/strings/internal/cordz_functions.h"
 #include "absl/strings/internal/cordz_info.h"
 #include "absl/strings/internal/cordz_statistics.h"
@@ -370,8 +371,8 @@
 
    private:
     using CordRep = absl::cord_internal::CordRep;
-    using CordRepRing = absl::cord_internal::CordRepRing;
-    using CordRepRingReader = absl::cord_internal::CordRepRingReader;
+    using CordRepBtree = absl::cord_internal::CordRepBtree;
+    using CordRepBtreeReader = absl::cord_internal::CordRepBtreeReader;
 
     // Stack of right children of concat nodes that we have to visit.
     // Keep this at the end of the structure to avoid cache-thrashing.
@@ -397,9 +398,9 @@
     // Stack specific operator++
     ChunkIterator& AdvanceStack();
 
-    // Ring buffer specific operator++
-    ChunkIterator& AdvanceRing();
-    void AdvanceBytesRing(size_t n);
+    // Btree specific operator++
+    ChunkIterator& AdvanceBtree();
+    void AdvanceBytesBtree(size_t n);
 
     // Iterates `n` bytes, where `n` is expected to be greater than or equal to
     // `current_chunk_.size()`.
@@ -415,8 +416,8 @@
     // The number of bytes left in the `Cord` over which we are iterating.
     size_t bytes_remaining_ = 0;
 
-    // Cord reader for ring buffers. Empty if not traversing a ring buffer.
-    CordRepRingReader ring_reader_;
+    // Cord reader for cord btrees. Empty if not traversing a btree.
+    CordRepBtreeReader btree_reader_;
 
     // See 'Stack' alias definition.
     Stack stack_of_right_children_;
@@ -1247,8 +1248,8 @@
 }
 
 inline void Cord::ChunkIterator::InitTree(cord_internal::CordRep* tree) {
-  if (tree->tag == cord_internal::RING) {
-    current_chunk_ = ring_reader_.Reset(tree->ring());
+  if (tree->tag == cord_internal::BTREE) {
+    current_chunk_ = btree_reader_.Init(tree->btree());
     return;
   }
 
@@ -1271,20 +1272,20 @@
   }
 }
 
-inline Cord::ChunkIterator& Cord::ChunkIterator::AdvanceRing() {
-  current_chunk_ = ring_reader_.Next();
+inline Cord::ChunkIterator& Cord::ChunkIterator::AdvanceBtree() {
+  current_chunk_ = btree_reader_.Next();
   return *this;
 }
 
-inline void Cord::ChunkIterator::AdvanceBytesRing(size_t n) {
+inline void Cord::ChunkIterator::AdvanceBytesBtree(size_t n) {
   assert(n >= current_chunk_.size());
   bytes_remaining_ -= n;
   if (bytes_remaining_) {
     if (n == current_chunk_.size()) {
-      current_chunk_ = ring_reader_.Next();
+      current_chunk_ = btree_reader_.Next();
     } else {
-      size_t offset = ring_reader_.length() - bytes_remaining_;
-      current_chunk_ = ring_reader_.Seek(offset);
+      size_t offset = btree_reader_.length() - bytes_remaining_;
+      current_chunk_ = btree_reader_.Seek(offset);
     }
   } else {
     current_chunk_ = {};
@@ -1297,7 +1298,7 @@
   assert(bytes_remaining_ >= current_chunk_.size());
   bytes_remaining_ -= current_chunk_.size();
   if (bytes_remaining_ > 0) {
-    return ring_reader_ ? AdvanceRing() : AdvanceStack();
+    return btree_reader_ ? AdvanceBtree() : AdvanceStack();
   } else {
     current_chunk_ = {};
   }
@@ -1339,7 +1340,7 @@
   if (ABSL_PREDICT_TRUE(n < current_chunk_.size())) {
     RemoveChunkPrefix(n);
   } else if (n != 0) {
-    ring_reader_ ? AdvanceBytesRing(n) : AdvanceBytesSlowPath(n);
+    btree_reader_ ? AdvanceBytesBtree(n) : AdvanceBytesSlowPath(n);
   }
 }
 
diff --git a/third_party/abseil-cpp/absl/strings/cord_ring_test.cc b/third_party/abseil-cpp/absl/strings/cord_ring_test.cc
index b1787ed..f131859 100644
--- a/third_party/abseil-cpp/absl/strings/cord_ring_test.cc
+++ b/third_party/abseil-cpp/absl/strings/cord_ring_test.cc
@@ -275,7 +275,7 @@
 enum Composition { kMix, kAppend, kPrepend };
 
 Composition RandomComposition() {
-  RandomEngine rng(testing::GTEST_FLAG(random_seed));
+  RandomEngine rng(GTEST_FLAG_GET(random_seed));
   return (rng() & 1) ? kMix : ((rng() & 1) ? kAppend : kPrepend);
 }
 
diff --git a/third_party/abseil-cpp/absl/strings/cord_test.cc b/third_party/abseil-cpp/absl/strings/cord_test.cc
index 14eca15..06a7bd6 100644
--- a/third_party/abseil-cpp/absl/strings/cord_test.cc
+++ b/third_party/abseil-cpp/absl/strings/cord_test.cc
@@ -206,7 +206,32 @@
 ABSL_NAMESPACE_END
 }  // namespace absl
 
-TEST(Cord, AllFlatSizes) {
+// The CordTest fixture runs all tests with and without Cord Btree enabled.
+class CordTest : public testing::TestWithParam<bool> {
+ public:
+  CordTest() : was_btree_(absl::cord_internal::cord_btree_enabled.load()) {
+    absl::cord_internal::cord_btree_enabled.store(UseBtree());
+  }
+  ~CordTest() override {
+    absl::cord_internal::cord_btree_enabled.store(was_btree_);
+  }
+
+  // Returns true if test is running with btree enabled.
+  bool UseBtree() const { return GetParam(); }
+
+  // Returns human readable string representation of the test parameter.
+  static std::string ToString(testing::TestParamInfo<bool> param) {
+    return param.param ? "Btree" : "Concat";
+  }
+
+ private:
+  const bool was_btree_;
+};
+
+INSTANTIATE_TEST_SUITE_P(WithParam, CordTest, testing::Bool(),
+                         CordTest::ToString);
+
+TEST_P(CordTest, AllFlatSizes) {
   using absl::strings_internal::CordTestAccess;
 
   for (size_t s = 0; s < CordTestAccess::MaxFlatLength(); s++) {
@@ -224,7 +249,7 @@
 // We create a Cord at least 128GB in size using the fact that Cords can
 // internally reference-count; thus the Cord is enormous without actually
 // consuming very much memory.
-TEST(GigabyteCord, FromExternal) {
+TEST_P(CordTest, GigabyteCordFromExternal) {
   const size_t one_gig = 1024U * 1024U * 1024U;
   size_t max_size = 2 * one_gig;
   if (sizeof(max_size) > 4) max_size = 128 * one_gig;
@@ -273,7 +298,7 @@
 extern bool my_unique_true_boolean;
 bool my_unique_true_boolean = true;
 
-TEST(Cord, Assignment) {
+TEST_P(CordTest, Assignment) {
   absl::Cord x(absl::string_view("hi there"));
   absl::Cord y(x);
   ASSERT_EQ(std::string(x), "hi there");
@@ -327,7 +352,7 @@
   }
 }
 
-TEST(Cord, StartsEndsWith) {
+TEST_P(CordTest, StartsEndsWith) {
   absl::Cord x(absl::string_view("abcde"));
   absl::Cord empty("");
 
@@ -360,13 +385,13 @@
   ASSERT_TRUE(!empty.EndsWith("xyz"));
 }
 
-TEST(Cord, Subcord) {
-  RandomEngine rng(testing::GTEST_FLAG(random_seed));
+TEST_P(CordTest, Subcord) {
+  RandomEngine rng(GTEST_FLAG_GET(random_seed));
   const std::string s = RandomLowercaseString(&rng, 1024);
 
   absl::Cord a;
   AppendWithFragments(s, &rng, &a);
-  ASSERT_EQ(s.size(), a.size());
+  ASSERT_EQ(s, std::string(a));
 
   // Check subcords of a, from a variety of interesting points.
   std::set<size_t> positions;
@@ -421,7 +446,7 @@
   EXPECT_TRUE(sa.empty());
 }
 
-TEST(Cord, Swap) {
+TEST_P(CordTest, Swap) {
   absl::string_view a("Dexter");
   absl::string_view b("Mandark");
   absl::Cord x(a);
@@ -453,7 +478,7 @@
   }
 }
 
-TEST(Cord, CopyToString) {
+TEST_P(CordTest, CopyToString) {
   VerifyCopyToString(absl::Cord());
   VerifyCopyToString(absl::Cord("small cord"));
   VerifyCopyToString(
@@ -461,45 +486,45 @@
                                 "copying ", "to ", "a ", "string."}));
 }
 
-TEST(TryFlat, Empty) {
+TEST_P(CordTest, TryFlatEmpty) {
   absl::Cord c;
   EXPECT_EQ(c.TryFlat(), "");
 }
 
-TEST(TryFlat, Flat) {
+TEST_P(CordTest, TryFlatFlat) {
   absl::Cord c("hello");
   EXPECT_EQ(c.TryFlat(), "hello");
 }
 
-TEST(TryFlat, SubstrInlined) {
+TEST_P(CordTest, TryFlatSubstrInlined) {
   absl::Cord c("hello");
   c.RemovePrefix(1);
   EXPECT_EQ(c.TryFlat(), "ello");
 }
 
-TEST(TryFlat, SubstrFlat) {
+TEST_P(CordTest, TryFlatSubstrFlat) {
   absl::Cord c("longer than 15 bytes");
   absl::Cord sub = absl::CordTestPeer::MakeSubstring(c, 1, c.size() - 1);
   EXPECT_EQ(sub.TryFlat(), "onger than 15 bytes");
 }
 
-TEST(TryFlat, Concat) {
+TEST_P(CordTest, TryFlatConcat) {
   absl::Cord c = absl::MakeFragmentedCord({"hel", "lo"});
   EXPECT_EQ(c.TryFlat(), absl::nullopt);
 }
 
-TEST(TryFlat, External) {
+TEST_P(CordTest, TryFlatExternal) {
   absl::Cord c = absl::MakeCordFromExternal("hell", [](absl::string_view) {});
   EXPECT_EQ(c.TryFlat(), "hell");
 }
 
-TEST(TryFlat, SubstrExternal) {
+TEST_P(CordTest, TryFlatSubstrExternal) {
   absl::Cord c = absl::MakeCordFromExternal("hell", [](absl::string_view) {});
   absl::Cord sub = absl::CordTestPeer::MakeSubstring(c, 1, c.size() - 1);
   EXPECT_EQ(sub.TryFlat(), "ell");
 }
 
-TEST(TryFlat, SubstrConcat) {
+TEST_P(CordTest, TryFlatSubstrConcat) {
   absl::Cord c = absl::MakeFragmentedCord({"hello", " world"});
   absl::Cord sub = absl::CordTestPeer::MakeSubstring(c, 1, c.size() - 1);
   EXPECT_EQ(sub.TryFlat(), absl::nullopt);
@@ -507,7 +532,7 @@
   EXPECT_EQ(c.TryFlat(), absl::nullopt);
 }
 
-TEST(TryFlat, CommonlyAssumedInvariants) {
+TEST_P(CordTest, TryFlatCommonlyAssumedInvariants) {
   // The behavior tested below is not part of the API contract of Cord, but it's
   // something we intend to be true in our current implementation.  This test
   // exists to detect and prevent accidental breakage of the implementation.
@@ -563,14 +588,14 @@
   EXPECT_TRUE(IsFlat(c));
 }
 
-TEST(Cord, Flatten) {
+TEST_P(CordTest, Flatten) {
   VerifyFlatten(absl::Cord());
   VerifyFlatten(absl::Cord("small cord"));
   VerifyFlatten(absl::Cord("larger than small buffer optimization"));
   VerifyFlatten(absl::MakeFragmentedCord({"small ", "fragmented ", "cord"}));
 
   // Test with a cord that is longer than the largest flat buffer
-  RandomEngine rng(testing::GTEST_FLAG(random_seed));
+  RandomEngine rng(GTEST_FLAG_GET(random_seed));
   VerifyFlatten(absl::Cord(RandomLowercaseString(&rng, 8192)));
 }
 
@@ -617,7 +642,7 @@
 };
 }  // namespace
 
-TEST(Cord, MultipleLengths) {
+TEST_P(CordTest, MultipleLengths) {
   TestData d;
   for (size_t i = 0; i < d.size(); i++) {
     std::string a = d.data(i);
@@ -693,7 +718,7 @@
 
 namespace {
 
-TEST(Cord, RemoveSuffixWithExternalOrSubstring) {
+TEST_P(CordTest, RemoveSuffixWithExternalOrSubstring) {
   absl::Cord cord = absl::MakeCordFromExternal(
       "foo bar baz", [](absl::string_view s) { DoNothing(s, nullptr); });
 
@@ -708,7 +733,7 @@
   EXPECT_EQ("foo", std::string(cord));
 }
 
-TEST(Cord, RemoveSuffixMakesZeroLengthNode) {
+TEST_P(CordTest, RemoveSuffixMakesZeroLengthNode) {
   absl::Cord c;
   c.Append(absl::Cord(std::string(100, 'x')));
   absl::Cord other_ref = c;  // Prevent inplace appends
@@ -735,7 +760,7 @@
 }
 
 // Establish that ZedBlock does what we think it does.
-TEST(CordSpliceTest, ZedBlock) {
+TEST_P(CordTest, CordSpliceTestZedBlock) {
   absl::Cord blob = CordWithZedBlock(10);
   EXPECT_EQ(10, blob.size());
   std::string s;
@@ -743,7 +768,7 @@
   EXPECT_EQ("zzzzzzzzzz", s);
 }
 
-TEST(CordSpliceTest, ZedBlock0) {
+TEST_P(CordTest, CordSpliceTestZedBlock0) {
   absl::Cord blob = CordWithZedBlock(0);
   EXPECT_EQ(0, blob.size());
   std::string s;
@@ -751,7 +776,7 @@
   EXPECT_EQ("", s);
 }
 
-TEST(CordSpliceTest, ZedBlockSuffix1) {
+TEST_P(CordTest, CordSpliceTestZedBlockSuffix1) {
   absl::Cord blob = CordWithZedBlock(10);
   EXPECT_EQ(10, blob.size());
   absl::Cord suffix(blob);
@@ -763,7 +788,7 @@
 }
 
 // Remove all of a prefix block
-TEST(CordSpliceTest, ZedBlockSuffix0) {
+TEST_P(CordTest, CordSpliceTestZedBlockSuffix0) {
   absl::Cord blob = CordWithZedBlock(10);
   EXPECT_EQ(10, blob.size());
   absl::Cord suffix(blob);
@@ -795,7 +820,7 @@
 }
 
 // Taking an empty suffix of a block breaks appending.
-TEST(CordSpliceTest, RemoveEntireBlock1) {
+TEST_P(CordTest, CordSpliceTestRemoveEntireBlock1) {
   absl::Cord zero = CordWithZedBlock(10);
   absl::Cord suffix(zero);
   suffix.RemovePrefix(10);
@@ -803,7 +828,7 @@
   result.Append(suffix);
 }
 
-TEST(CordSpliceTest, RemoveEntireBlock2) {
+TEST_P(CordTest, CordSpliceTestRemoveEntireBlock2) {
   absl::Cord zero = CordWithZedBlock(10);
   absl::Cord prefix(zero);
   prefix.RemoveSuffix(10);
@@ -813,7 +838,7 @@
   result.Append(suffix);
 }
 
-TEST(CordSpliceTest, RemoveEntireBlock3) {
+TEST_P(CordTest, CordSpliceTestRemoveEntireBlock3) {
   absl::Cord blob = CordWithZedBlock(10);
   absl::Cord block = BigCord(10, 'b');
   blob = SpliceCord(blob, 0, block);
@@ -844,7 +869,7 @@
       << "LHS=" << rhs_string << "; RHS=" << lhs_string;
 }
 
-TEST(Cord, Compare) {
+TEST_P(CordTest, Compare) {
   absl::Cord subcord("aaaaaBBBBBcccccDDDDD");
   subcord = subcord.Subcord(3, 10);
 
@@ -907,7 +932,7 @@
   }
 }
 
-TEST(Cord, CompareAfterAssign) {
+TEST_P(CordTest, CompareAfterAssign) {
   absl::Cord a("aaaaaa1111111");
   absl::Cord b("aaaaaa2222222");
   a = "cccccc";
@@ -936,8 +961,8 @@
   EXPECT_EQ(expected, sign(c.Compare(d))) << c << ", " << d;
 }
 
-TEST(Compare, ComparisonIsUnsigned) {
-  RandomEngine rng(testing::GTEST_FLAG(random_seed));
+TEST_P(CordTest, CompareComparisonIsUnsigned) {
+  RandomEngine rng(GTEST_FLAG_GET(random_seed));
   std::uniform_int_distribution<uint32_t> uniform_uint8(0, 255);
   char x = static_cast<char>(uniform_uint8(rng));
   TestCompare(
@@ -945,9 +970,9 @@
       absl::Cord(std::string(GetUniformRandomUpTo(&rng, 100), x ^ 0x80)), &rng);
 }
 
-TEST(Compare, RandomComparisons) {
+TEST_P(CordTest, CompareRandomComparisons) {
   const int kIters = 5000;
-  RandomEngine rng(testing::GTEST_FLAG(random_seed));
+  RandomEngine rng(GTEST_FLAG_GET(random_seed));
 
   int n = GetUniformRandomUpTo(&rng, 5000);
   absl::Cord a[] = {MakeExternalCord(n),
@@ -1003,43 +1028,43 @@
   EXPECT_FALSE(b <= a);
 }
 
-TEST(ComparisonOperators, Cord_Cord) {
+TEST_P(CordTest, ComparisonOperators_Cord_Cord) {
   CompareOperators<absl::Cord, absl::Cord>();
 }
 
-TEST(ComparisonOperators, Cord_StringPiece) {
+TEST_P(CordTest, ComparisonOperators_Cord_StringPiece) {
   CompareOperators<absl::Cord, absl::string_view>();
 }
 
-TEST(ComparisonOperators, StringPiece_Cord) {
+TEST_P(CordTest, ComparisonOperators_StringPiece_Cord) {
   CompareOperators<absl::string_view, absl::Cord>();
 }
 
-TEST(ComparisonOperators, Cord_string) {
+TEST_P(CordTest, ComparisonOperators_Cord_string) {
   CompareOperators<absl::Cord, std::string>();
 }
 
-TEST(ComparisonOperators, string_Cord) {
+TEST_P(CordTest, ComparisonOperators_string_Cord) {
   CompareOperators<std::string, absl::Cord>();
 }
 
-TEST(ComparisonOperators, stdstring_Cord) {
+TEST_P(CordTest, ComparisonOperators_stdstring_Cord) {
   CompareOperators<std::string, absl::Cord>();
 }
 
-TEST(ComparisonOperators, Cord_stdstring) {
+TEST_P(CordTest, ComparisonOperators_Cord_stdstring) {
   CompareOperators<absl::Cord, std::string>();
 }
 
-TEST(ComparisonOperators, charstar_Cord) {
+TEST_P(CordTest, ComparisonOperators_charstar_Cord) {
   CompareOperators<const char*, absl::Cord>();
 }
 
-TEST(ComparisonOperators, Cord_charstar) {
+TEST_P(CordTest, ComparisonOperators_Cord_charstar) {
   CompareOperators<absl::Cord, const char*>();
 }
 
-TEST(ConstructFromExternal, ReleaserInvoked) {
+TEST_P(CordTest, ConstructFromExternalReleaserInvoked) {
   // Empty external memory means the releaser should be called immediately.
   {
     bool invoked = false;
@@ -1081,8 +1106,8 @@
   }
 }
 
-TEST(ConstructFromExternal, CompareContents) {
-  RandomEngine rng(testing::GTEST_FLAG(random_seed));
+TEST_P(CordTest, ConstructFromExternalCompareContents) {
+  RandomEngine rng(GTEST_FLAG_GET(random_seed));
 
   for (int length = 1; length <= 2048; length *= 2) {
     std::string data = RandomLowercaseString(&rng, length);
@@ -1097,8 +1122,8 @@
   }
 }
 
-TEST(ConstructFromExternal, LargeReleaser) {
-  RandomEngine rng(testing::GTEST_FLAG(random_seed));
+TEST_P(CordTest, ConstructFromExternalLargeReleaser) {
+  RandomEngine rng(GTEST_FLAG_GET(random_seed));
   constexpr size_t kLength = 256;
   std::string data = RandomLowercaseString(&rng, kLength);
   std::array<char, kLength> data_array;
@@ -1112,7 +1137,7 @@
   EXPECT_TRUE(invoked);
 }
 
-TEST(ConstructFromExternal, FunctionPointerReleaser) {
+TEST_P(CordTest, ConstructFromExternalFunctionPointerReleaser) {
   static absl::string_view data("hello world");
   static bool invoked;
   auto* releaser =
@@ -1129,7 +1154,7 @@
   EXPECT_TRUE(invoked);
 }
 
-TEST(ConstructFromExternal, MoveOnlyReleaser) {
+TEST_P(CordTest, ConstructFromExternalMoveOnlyReleaser) {
   struct Releaser {
     explicit Releaser(bool* invoked) : invoked(invoked) {}
     Releaser(Releaser&& other) noexcept : invoked(other.invoked) {}
@@ -1143,20 +1168,20 @@
   EXPECT_TRUE(invoked);
 }
 
-TEST(ConstructFromExternal, NoArgLambda) {
+TEST_P(CordTest, ConstructFromExternalNoArgLambda) {
   bool invoked = false;
   (void)absl::MakeCordFromExternal("dummy", [&invoked]() { invoked = true; });
   EXPECT_TRUE(invoked);
 }
 
-TEST(ConstructFromExternal, StringViewArgLambda) {
+TEST_P(CordTest, ConstructFromExternalStringViewArgLambda) {
   bool invoked = false;
   (void)absl::MakeCordFromExternal(
       "dummy", [&invoked](absl::string_view) { invoked = true; });
   EXPECT_TRUE(invoked);
 }
 
-TEST(ConstructFromExternal, NonTrivialReleaserDestructor) {
+TEST_P(CordTest, ConstructFromExternalNonTrivialReleaserDestructor) {
   struct Releaser {
     explicit Releaser(bool* destroyed) : destroyed(destroyed) {}
     ~Releaser() { *destroyed = true; }
@@ -1171,7 +1196,7 @@
   EXPECT_TRUE(destroyed);
 }
 
-TEST(ConstructFromExternal, ReferenceQualifierOverloads) {
+TEST_P(CordTest, ConstructFromExternalReferenceQualifierOverloads) {
   struct Releaser {
     void operator()(absl::string_view) & { *lvalue_invoked = true; }
     void operator()(absl::string_view) && { *rvalue_invoked = true; }
@@ -1199,7 +1224,7 @@
   EXPECT_TRUE(rvalue_invoked);
 }
 
-TEST(ExternalMemory, BasicUsage) {
+TEST_P(CordTest, ExternalMemoryBasicUsage) {
   static const char* strings[] = {"", "hello", "there"};
   for (const char* str : strings) {
     absl::Cord dst("(prefix)");
@@ -1210,7 +1235,7 @@
   }
 }
 
-TEST(ExternalMemory, RemovePrefixSuffix) {
+TEST_P(CordTest, ExternalMemoryRemovePrefixSuffix) {
   // Exhaustively try all sub-strings.
   absl::Cord cord = MakeComposite();
   std::string s = std::string(cord);
@@ -1225,7 +1250,7 @@
   }
 }
 
-TEST(ExternalMemory, Get) {
+TEST_P(CordTest, ExternalMemoryGet) {
   absl::Cord cord("hello");
   AddExternalMemory(" world!", &cord);
   AddExternalMemory(" how are ", &cord);
@@ -1244,16 +1269,16 @@
 // Additionally we have some whiteboxed expectations based on our knowledge of
 // the layout and size of empty and inlined cords, and flat nodes.
 
-TEST(CordMemoryUsage, Empty) {
+TEST_P(CordTest, CordMemoryUsageEmpty) {
   EXPECT_EQ(sizeof(absl::Cord), absl::Cord().EstimatedMemoryUsage());
 }
 
-TEST(CordMemoryUsage, Embedded) {
+TEST_P(CordTest, CordMemoryUsageEmbedded) {
   absl::Cord a("hello");
   EXPECT_EQ(a.EstimatedMemoryUsage(), sizeof(absl::Cord));
 }
 
-TEST(CordMemoryUsage, EmbeddedAppend) {
+TEST_P(CordTest, CordMemoryUsageEmbeddedAppend) {
   absl::Cord a("a");
   absl::Cord b("bcd");
   EXPECT_EQ(b.EstimatedMemoryUsage(), sizeof(absl::Cord));
@@ -1261,7 +1286,7 @@
   EXPECT_EQ(a.EstimatedMemoryUsage(), sizeof(absl::Cord));
 }
 
-TEST(CordMemoryUsage, ExternalMemory) {
+TEST_P(CordTest, CordMemoryUsageExternalMemory) {
   static const int kLength = 1000;
   absl::Cord cord;
   AddExternalMemory(std::string(kLength, 'x'), &cord);
@@ -1269,14 +1294,14 @@
   EXPECT_LE(cord.EstimatedMemoryUsage(), kLength * 1.5);
 }
 
-TEST(CordMemoryUsage, Flat) {
+TEST_P(CordTest, CordMemoryUsageFlat) {
   static const int kLength = 125;
   absl::Cord a(std::string(kLength, 'a'));
   EXPECT_GT(a.EstimatedMemoryUsage(), kLength);
   EXPECT_LE(a.EstimatedMemoryUsage(), kLength * 1.5);
 }
 
-TEST(CordMemoryUsage, AppendFlat) {
+TEST_P(CordTest, CordMemoryUsageAppendFlat) {
   using absl::strings_internal::CordTestAccess;
   absl::Cord a(std::string(CordTestAccess::MaxFlatLength(), 'a'));
   size_t length = a.EstimatedMemoryUsage();
@@ -1286,9 +1311,32 @@
   EXPECT_LE(delta, CordTestAccess::MaxFlatLength() * 1.5);
 }
 
+TEST_P(CordTest, CordMemoryUsageAppendExternal) {
+  static const int kLength = 1000;
+  using absl::strings_internal::CordTestAccess;
+  absl::Cord a(std::string(CordTestAccess::MaxFlatLength(), 'a'));
+  size_t length = a.EstimatedMemoryUsage();
+  AddExternalMemory(std::string(kLength, 'b'), &a);
+  size_t delta = a.EstimatedMemoryUsage() - length;
+  EXPECT_GT(delta, kLength);
+  EXPECT_LE(delta, kLength * 1.5);
+}
+
+TEST_P(CordTest, CordMemoryUsageSubString) {
+  static const int kLength = 2000;
+  using absl::strings_internal::CordTestAccess;
+  absl::Cord a(std::string(kLength, 'a'));
+  size_t length = a.EstimatedMemoryUsage();
+  AddExternalMemory(std::string(kLength, 'b'), &a);
+  absl::Cord b = a.Subcord(0, kLength + kLength / 2);
+  size_t delta = b.EstimatedMemoryUsage() - length;
+  EXPECT_GT(delta, kLength);
+  EXPECT_LE(delta, kLength * 1.5);
+}
+
 // Regtest for a change that had to be rolled back because it expanded out
 // of the InlineRep too soon, which was observable through MemoryUsage().
-TEST(CordMemoryUsage, InlineRep) {
+TEST_P(CordTest, CordMemoryUsageInlineRep) {
   constexpr size_t kMaxInline = 15;  // Cord::InlineRep::N
   const std::string small_string(kMaxInline, 'x');
   absl::Cord c1(small_string);
@@ -1302,7 +1350,7 @@
 }  // namespace
 
 // Regtest for 7510292 (fix a bug introduced by 7465150)
-TEST(Cord, Concat_Append) {
+TEST_P(CordTest, Concat_Append) {
   // Create a rep of type CONCAT
   absl::Cord s1("foobarbarbarbarbar");
   s1.Append("abcdefgabcdefgabcdefgabcdefgabcdefgabcdefgabcdefg");
@@ -1317,13 +1365,13 @@
   EXPECT_EQ(s2.size(), size + 1);
 }
 
-TEST(Cord, DiabolicalGrowth) {
+TEST_P(CordTest, DiabolicalGrowth) {
   // This test exercises a diabolical Append(<one char>) on a cord, making the
   // cord shared before each Append call resulting in a terribly fragmented
   // resulting cord.
   // TODO(b/183983616): Apply some minimum compaction when copying a shared
   // source cord into a mutable copy for updates in CordRepRing.
-  RandomEngine rng(testing::GTEST_FLAG(random_seed));
+  RandomEngine rng(GTEST_FLAG_GET(random_seed));
   const std::string expected = RandomLowercaseString(&rng, 5000);
   absl::Cord cord;
   for (char c : expected) {
@@ -1337,7 +1385,60 @@
                cord.EstimatedMemoryUsage());
 }
 
-TEST(MakeFragmentedCord, MakeFragmentedCordFromInitializerList) {
+// The following tests check support for >4GB cords in 64-bit binaries, and
+// 2GB-4GB cords in 32-bit binaries.  This function returns the large cord size
+// that's appropriate for the binary.
+
+// Construct a huge cord with the specified valid prefix.
+static absl::Cord MakeHuge(absl::string_view prefix) {
+  absl::Cord cord;
+  if (sizeof(size_t) > 4) {
+    // In 64-bit binaries, test 64-bit Cord support.
+    const size_t size =
+        static_cast<size_t>(std::numeric_limits<uint32_t>::max()) + 314;
+    cord.Append(absl::MakeCordFromExternal(
+        absl::string_view(prefix.data(), size),
+        [](absl::string_view s) { DoNothing(s, nullptr); }));
+  } else {
+    // Cords are limited to 32-bit lengths in 32-bit binaries.  The following
+    // tests check for use of "signed int" to represent Cord length/offset.
+    // However absl::string_view does not allow lengths >= (1u<<31), so we need
+    // to append in two parts;
+    const size_t s1 = (1u << 31) - 1;
+    // For shorter cord, `Append` copies the data rather than allocating a new
+    // node. The threshold is currently set to 511, so `s2` needs to be bigger
+    // to not trigger the copy.
+    const size_t s2 = 600;
+    cord.Append(absl::MakeCordFromExternal(
+        absl::string_view(prefix.data(), s1),
+        [](absl::string_view s) { DoNothing(s, nullptr); }));
+    cord.Append(absl::MakeCordFromExternal(
+        absl::string_view("", s2),
+        [](absl::string_view s) { DoNothing(s, nullptr); }));
+  }
+  return cord;
+}
+
+TEST_P(CordTest, HugeCord) {
+  absl::Cord cord = MakeHuge("huge cord");
+  EXPECT_LE(cord.size(), cord.EstimatedMemoryUsage());
+  EXPECT_GE(cord.size() + 100, cord.EstimatedMemoryUsage());
+}
+
+// Tests that Append() works ok when handed a self reference
+TEST_P(CordTest, AppendSelf) {
+  // We run the test until data is ~16K
+  // This guarantees it covers small, medium and large data.
+  std::string control_data = "Abc";
+  absl::Cord data(control_data);
+  while (control_data.length() < 0x4000) {
+    data.Append(data);
+    control_data.append(control_data);
+    ASSERT_EQ(control_data, data);
+  }
+}
+
+TEST_P(CordTest, MakeFragmentedCordFromInitializerList) {
   absl::Cord fragmented =
       absl::MakeFragmentedCord({"A ", "fragmented ", "Cord"});
 
@@ -1357,7 +1458,7 @@
   ASSERT_TRUE(++chunk_it == fragmented.chunk_end());
 }
 
-TEST(MakeFragmentedCord, MakeFragmentedCordFromVector) {
+TEST_P(CordTest, MakeFragmentedCordFromVector) {
   std::vector<absl::string_view> chunks = {"A ", "fragmented ", "Cord"};
   absl::Cord fragmented = absl::MakeFragmentedCord(chunks);
 
@@ -1377,7 +1478,7 @@
   ASSERT_TRUE(++chunk_it == fragmented.chunk_end());
 }
 
-TEST(CordChunkIterator, Traits) {
+TEST_P(CordTest, CordChunkIteratorTraits) {
   static_assert(std::is_copy_constructible<absl::Cord::ChunkIterator>::value,
                 "");
   static_assert(std::is_copy_assignable<absl::Cord::ChunkIterator>::value, "");
@@ -1458,7 +1559,7 @@
   EXPECT_TRUE(post_iter == cord.chunk_end());  // NOLINT
 }
 
-TEST(CordChunkIterator, Operations) {
+TEST_P(CordTest, CordChunkIteratorOperations) {
   absl::Cord empty_cord;
   VerifyChunkIterator(empty_cord, 0);
 
@@ -1483,7 +1584,7 @@
     VerifyChunkIterator(reused_nodes_cord, expected_chunks);
   }
 
-  RandomEngine rng(testing::GTEST_FLAG(random_seed));
+  RandomEngine rng(GTEST_FLAG_GET(random_seed));
   absl::Cord flat_cord(RandomLowercaseString(&rng, 256));
   absl::Cord subcords;
   for (int i = 0; i < 128; ++i) subcords.Prepend(flat_cord.Subcord(i, 128));
@@ -1621,14 +1722,14 @@
     VerifyCharIterator(reused_nodes_cord);
   }
 
-  RandomEngine rng(testing::GTEST_FLAG(random_seed));
+  RandomEngine rng(GTEST_FLAG_GET(random_seed));
   absl::Cord flat_cord(RandomLowercaseString(&rng, 256));
   absl::Cord subcords;
   for (int i = 0; i < 4; ++i) subcords.Prepend(flat_cord.Subcord(16 * i, 128));
   VerifyCharIterator(subcords);
 }
 
-TEST(Cord, StreamingOutput) {
+TEST_P(CordTest, StreamingOutput) {
   absl::Cord c =
       absl::MakeFragmentedCord({"A ", "small ", "fragmented ", "Cord", "."});
   std::stringstream output;
@@ -1636,7 +1737,7 @@
   EXPECT_EQ("A small fragmented Cord.", output.str());
 }
 
-TEST(Cord, ForEachChunk) {
+TEST_P(CordTest, ForEachChunk) {
   for (int num_elements : {1, 10, 200}) {
     SCOPED_TRACE(num_elements);
     std::vector<std::string> cord_chunks;
@@ -1654,7 +1755,7 @@
   }
 }
 
-TEST(Cord, SmallBufferAssignFromOwnData) {
+TEST_P(CordTest, SmallBufferAssignFromOwnData) {
   constexpr size_t kMaxInline = 15;
   std::string contents = "small buff cord";
   EXPECT_EQ(contents.size(), kMaxInline);
@@ -1669,7 +1770,7 @@
   }
 }
 
-TEST(Cord, Format) {
+TEST_P(CordTest, Format) {
   absl::Cord c;
   absl::Format(&c, "There were %04d little %s.", 3, "pigs");
   EXPECT_EQ(c, "There were 0003 little pigs.");
@@ -1770,7 +1871,7 @@
 };
 
 
-TEST(Cord, ConstinitConstructor) {
+TEST_P(CordTest, ConstinitConstructor) {
   TestConstinitConstructor(
       absl::strings_internal::MakeStringConstant(ShortView{}));
   TestConstinitConstructor(
diff --git a/third_party/abseil-cpp/absl/strings/internal/cord_internal.cc b/third_party/abseil-cpp/absl/strings/internal/cord_internal.cc
index 6a0b051..1767e6f 100644
--- a/third_party/abseil-cpp/absl/strings/internal/cord_internal.cc
+++ b/third_party/abseil-cpp/absl/strings/internal/cord_internal.cc
@@ -18,6 +18,7 @@
 #include <memory>
 
 #include "absl/container/inlined_vector.h"
+#include "absl/strings/internal/cord_rep_btree.h"
 #include "absl/strings/internal/cord_rep_flat.h"
 #include "absl/strings/internal/cord_rep_ring.h"
 
@@ -30,6 +31,7 @@
     kCordEnableRingBufferDefault);
 ABSL_CONST_INIT std::atomic<bool> shallow_subcords_enabled(
     kCordShallowSubcordsDefault);
+ABSL_CONST_INIT std::atomic<bool> cord_btree_exhaustive_validation(false);
 
 void CordRep::Destroy(CordRep* rep) {
   assert(rep != nullptr);
@@ -50,6 +52,9 @@
         rep = left;
         continue;
       }
+    } else if (rep->tag == BTREE) {
+      CordRepBtree::Destroy(rep->btree());
+      rep = nullptr;
     } else if (rep->tag == RING) {
       CordRepRing::Destroy(rep->ring());
       rep = nullptr;
diff --git a/third_party/abseil-cpp/absl/strings/internal/cord_internal.h b/third_party/abseil-cpp/absl/strings/internal/cord_internal.h
index 371a7f9..7172b14 100644
--- a/third_party/abseil-cpp/absl/strings/internal/cord_internal.h
+++ b/third_party/abseil-cpp/absl/strings/internal/cord_internal.h
@@ -46,6 +46,12 @@
 extern std::atomic<bool> cord_ring_buffer_enabled;
 extern std::atomic<bool> shallow_subcords_enabled;
 
+// `cord_btree_exhaustive_validation` can be set to force exhaustive validation
+// in debug assertions, and code that calls `IsValid()` explicitly. By default,
+// assertions should be relatively cheap and AssertValid() can easily lead to
+// O(n^2) complexity as recursive / full tree validation is O(n).
+extern std::atomic<bool> cord_btree_exhaustive_validation;
+
 inline void enable_cord_btree(bool enable) {
   cord_btree_enabled.store(enable, std::memory_order_relaxed);
 }
@@ -74,12 +80,13 @@
   kMaxBytesToCopy = 511
 };
 
-// Wraps std::atomic for reference counting.
-class Refcount {
+// Compact class for tracking the reference count and state flags for CordRep
+// instances.  Data is stored in an atomic int32_t for compactness and speed.
+class RefcountAndFlags {
  public:
-  constexpr Refcount() : count_{kRefIncrement} {}
+  constexpr RefcountAndFlags() : count_{kRefIncrement} {}
   struct Immortal {};
-  explicit constexpr Refcount(Immortal) : count_(kImmortalTag) {}
+  explicit constexpr RefcountAndFlags(Immortal) : count_(kImmortalFlag) {}
 
   // Increments the reference count. Imposes no memory ordering.
   inline void Increment() {
@@ -92,26 +99,27 @@
   // Returns false if there are no references outstanding; true otherwise.
   // Inserts barriers to ensure that state written before this method returns
   // false will be visible to a thread that just observed this method returning
-  // false.
+  // false.  Always returns false when the immortal bit is set.
   inline bool Decrement() {
-    int32_t refcount = count_.load(std::memory_order_acquire);
-    assert(refcount > 0 || refcount & kImmortalTag);
+    int32_t refcount = count_.load(std::memory_order_acquire) & kRefcountMask;
+    assert(refcount > 0 || refcount & kImmortalFlag);
     return refcount != kRefIncrement &&
-           count_.fetch_sub(kRefIncrement, std::memory_order_acq_rel) !=
-               kRefIncrement;
+           (count_.fetch_sub(kRefIncrement, std::memory_order_acq_rel) &
+            kRefcountMask) != kRefIncrement;
   }
 
   // Same as Decrement but expect that refcount is greater than 1.
   inline bool DecrementExpectHighRefcount() {
     int32_t refcount =
-        count_.fetch_sub(kRefIncrement, std::memory_order_acq_rel);
-    assert(refcount > 0 || refcount & kImmortalTag);
+        count_.fetch_sub(kRefIncrement, std::memory_order_acq_rel) &
+        kRefcountMask;
+    assert(refcount > 0 || refcount & kImmortalFlag);
     return refcount != kRefIncrement;
   }
 
   // Returns the current reference count using acquire semantics.
   inline int32_t Get() const {
-    return count_.load(std::memory_order_acquire) >> kImmortalShift;
+    return count_.load(std::memory_order_acquire) >> kNumFlags;
   }
 
   // Returns whether the atomic integer is 1.
@@ -121,26 +129,34 @@
   // This call performs the test for a reference count of one, and
   // performs the memory barrier needed for the owning thread
   // to act on the object, knowing that it has exclusive access to the
-  // object.
+  // object.  Always returns false when the immortal bit is set.
   inline bool IsOne() {
-    return count_.load(std::memory_order_acquire) == kRefIncrement;
+    return (count_.load(std::memory_order_acquire) & kRefcountMask) ==
+           kRefIncrement;
   }
 
   bool IsImmortal() const {
-    return (count_.load(std::memory_order_relaxed) & kImmortalTag) != 0;
+    return (count_.load(std::memory_order_relaxed) & kImmortalFlag) != 0;
   }
 
  private:
-  // We reserve the bottom bit to tag a reference count as immortal.
-  // By making it `1` we ensure that we never reach `0` when adding/subtracting
-  // `2`, thus it never looks as if it should be destroyed.
-  // These are used for the StringConstant constructor where we do not increase
-  // the refcount at construction time (due to constinit requirements) but we
-  // will still decrease it at destruction time to avoid branching on Unref.
+  // We reserve the bottom bits for flags.
+  // kImmortalBit indicates that this entity should never be collected; it is
+  // used for the StringConstant constructor to avoid collecting immutable
+  // constant cords.
+  // kReservedFlag is reserved for future use.
   enum {
-    kImmortalShift = 1,
-    kRefIncrement = 1 << kImmortalShift,
-    kImmortalTag = kRefIncrement - 1
+    kNumFlags = 2,
+
+    kImmortalFlag = 0x1,
+    kReservedFlag = 0x2,
+    kRefIncrement = (1 << kNumFlags),
+
+    // Bitmask to use when checking refcount by equality.  This masks out
+    // all flags except kImmortalFlag, which is part of the refcount for
+    // purposes of equality.  (A refcount of 0 or 1 does not count as 0 or 1
+    // if the immortal bit is set.)
+    kRefcountMask = ~kReservedFlag,
   };
 
   std::atomic<int32_t> count_;
@@ -189,13 +205,13 @@
 
 struct CordRep {
   CordRep() = default;
-  constexpr CordRep(Refcount::Immortal immortal, size_t l)
+  constexpr CordRep(RefcountAndFlags::Immortal immortal, size_t l)
       : length(l), refcount(immortal), tag(EXTERNAL), storage{} {}
 
   // The following three fields have to be less than 32 bytes since
   // that is the smallest supported flat node size.
   size_t length;
-  Refcount refcount;
+  RefcountAndFlags refcount;
   // If tag < FLAT, it represents CordRepKind and indicates the type of node.
   // Otherwise, the node type is CordRepFlat and the tag is the encoded size.
   uint8_t tag;
@@ -210,6 +226,14 @@
   // padding space from the base class (clang and gcc do, MSVC does not, etc)
   uint8_t storage[3];
 
+  // Returns true if this instance's tag matches the requested type.
+  constexpr bool IsRing() const { return tag == RING; }
+  constexpr bool IsConcat() const { return tag == CONCAT; }
+  constexpr bool IsSubstring() const { return tag == SUBSTRING; }
+  constexpr bool IsExternal() const { return tag == EXTERNAL; }
+  constexpr bool IsFlat() const { return tag >= FLAT; }
+  constexpr bool IsBtree() const { return tag == BTREE; }
+
   inline CordRepRing* ring();
   inline const CordRepRing* ring() const;
   inline CordRepConcat* concat();
@@ -220,7 +244,6 @@
   inline const CordRepExternal* external() const;
   inline CordRepFlat* flat();
   inline const CordRepFlat* flat() const;
-
   inline CordRepBtree* btree();
   inline const CordRepBtree* btree() const;
 
@@ -262,7 +285,7 @@
 struct CordRepExternal : public CordRep {
   CordRepExternal() = default;
   explicit constexpr CordRepExternal(absl::string_view str)
-      : CordRep(Refcount::Immortal{}, str.size()),
+      : CordRep(RefcountAndFlags::Immortal{}, str.size()),
         base(str.data()),
         releaser_invoker(nullptr) {}
 
@@ -271,7 +294,7 @@
   ExternalReleaserInvoker releaser_invoker;
 
   // Deletes (releases) the external rep.
-  // Requires rep != nullptr and rep->tag == EXTERNAL
+  // Requires rep != nullptr and rep->IsExternal()
   static void Delete(CordRep* rep);
 };
 
@@ -314,7 +337,7 @@
 };
 
 inline void CordRepExternal::Delete(CordRep* rep) {
-  assert(rep != nullptr && rep->tag == EXTERNAL);
+  assert(rep != nullptr && rep->IsExternal());
   auto* rep_external = static_cast<CordRepExternal*>(rep);
   assert(rep_external->releaser_invoker != nullptr);
   rep_external->releaser_invoker(rep_external);
@@ -516,7 +539,7 @@
   // store the size in the last char of `as_chars_` shifted left + 1.
   // Else we store it in a tree and store a pointer to that tree in
   // `as_tree_.rep` and store a tag in `tagged_size`.
-  union  {
+  union {
     char as_chars_[kMaxInline + 1];
     AsTree as_tree_;
   };
@@ -525,32 +548,32 @@
 static_assert(sizeof(InlineData) == kMaxInline + 1, "");
 
 inline CordRepConcat* CordRep::concat() {
-  assert(tag == CONCAT);
+  assert(IsConcat());
   return static_cast<CordRepConcat*>(this);
 }
 
 inline const CordRepConcat* CordRep::concat() const {
-  assert(tag == CONCAT);
+  assert(IsConcat());
   return static_cast<const CordRepConcat*>(this);
 }
 
 inline CordRepSubstring* CordRep::substring() {
-  assert(tag == SUBSTRING);
+  assert(IsSubstring());
   return static_cast<CordRepSubstring*>(this);
 }
 
 inline const CordRepSubstring* CordRep::substring() const {
-  assert(tag == SUBSTRING);
+  assert(IsSubstring());
   return static_cast<const CordRepSubstring*>(this);
 }
 
 inline CordRepExternal* CordRep::external() {
-  assert(tag == EXTERNAL);
+  assert(IsExternal());
   return static_cast<CordRepExternal*>(this);
 }
 
 inline const CordRepExternal* CordRep::external() const {
-  assert(tag == EXTERNAL);
+  assert(IsExternal());
   return static_cast<const CordRepExternal*>(this);
 }
 
diff --git a/third_party/abseil-cpp/absl/strings/internal/cord_rep_btree.cc b/third_party/abseil-cpp/absl/strings/internal/cord_rep_btree.cc
new file mode 100644
index 0000000..8fe589f
--- /dev/null
+++ b/third_party/abseil-cpp/absl/strings/internal/cord_rep_btree.cc
@@ -0,0 +1,954 @@
+// Copyright 2021 The Abseil Authors
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     https://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include "absl/strings/internal/cord_rep_btree.h"
+
+#include <cassert>
+#include <cstdint>
+#include <iostream>
+#include <string>
+
+#include "absl/base/attributes.h"
+#include "absl/base/config.h"
+#include "absl/base/internal/raw_logging.h"
+#include "absl/strings/internal/cord_internal.h"
+#include "absl/strings/internal/cord_rep_consume.h"
+#include "absl/strings/internal/cord_rep_flat.h"
+#include "absl/strings/str_cat.h"
+#include "absl/strings/string_view.h"
+
+namespace absl {
+ABSL_NAMESPACE_BEGIN
+namespace cord_internal {
+
+constexpr size_t CordRepBtree::kMaxCapacity;  // NOLINT: needed for c++ < c++17
+
+namespace {
+
+using NodeStack = CordRepBtree * [CordRepBtree::kMaxDepth];
+using EdgeType = CordRepBtree::EdgeType;
+using OpResult = CordRepBtree::OpResult;
+using CopyResult = CordRepBtree::CopyResult;
+
+constexpr auto kFront = CordRepBtree::kFront;
+constexpr auto kBack = CordRepBtree::kBack;
+
+inline bool exhaustive_validation() {
+  return cord_btree_exhaustive_validation.load(std::memory_order_relaxed);
+}
+
+// Implementation of the various 'Dump' functions.
+// Prints the entire tree structure or 'rep'. External callers should
+// not specify 'depth' and leave it to its default (0) value.
+// Rep may be a CordRepBtree tree, or a SUBSTRING / EXTERNAL / FLAT node.
+void DumpAll(const CordRep* rep, bool include_contents, std::ostream& stream,
+             int depth = 0) {
+  // Allow for full height trees + substring -> flat / external nodes.
+  assert(depth <= CordRepBtree::kMaxDepth + 2);
+  std::string sharing = const_cast<CordRep*>(rep)->refcount.IsOne()
+                            ? std::string("Private")
+                            : absl::StrCat("Shared(", rep->refcount.Get(), ")");
+  std::string sptr = absl::StrCat("0x", absl::Hex(rep));
+
+  // Dumps the data contents of `rep` if `include_contents` is true.
+  // Always emits a new line character.
+  auto maybe_dump_data = [&stream, include_contents](const CordRep* r) {
+    if (include_contents) {
+      // Allow for up to 60 wide display of content data, which with some
+      // indentation and prefix / labels keeps us within roughly 80-100 wide.
+      constexpr size_t kMaxDataLength = 60;
+      stream << ", data = \""
+             << CordRepBtree::EdgeData(r).substr(0, kMaxDataLength)
+             << (r->length > kMaxDataLength ? "\"..." : "\"");
+    }
+    stream << '\n';
+  };
+
+  // For each level, we print the 'shared/private' state and the rep pointer,
+  // indented by two spaces per recursive depth.
+  stream << std::string(depth * 2, ' ') << sharing << " (" << sptr << ") ";
+
+  if (rep->IsBtree()) {
+    const CordRepBtree* node = rep->btree();
+    std::string label =
+        node->height() ? absl::StrCat("Node(", node->height(), ")") : "Leaf";
+    stream << label << ", len = " << node->length
+           << ", begin = " << node->begin() << ", end = " << node->end()
+           << "\n";
+    for (CordRep* edge : node->Edges()) {
+      DumpAll(edge, include_contents, stream, depth + 1);
+    }
+  } else if (rep->tag == SUBSTRING) {
+    const CordRepSubstring* substring = rep->substring();
+    stream << "Substring, len = " << rep->length
+           << ", start = " << substring->start;
+    maybe_dump_data(rep);
+    DumpAll(substring->child, include_contents, stream, depth + 1);
+  } else if (rep->tag >= FLAT) {
+    stream << "Flat, len = " << rep->length;
+    maybe_dump_data(rep);
+  } else if (rep->tag == EXTERNAL) {
+    stream << "Extn, len = " << rep->length;
+    maybe_dump_data(rep);
+  }
+}
+
+// TODO(b/192061034): add 'bytes to copy' logic to avoid large slop on substring
+// small data out of large reps, and general efficiency of 'always copy small
+// data'. Consider making this a cord rep internal library function.
+CordRepSubstring* CreateSubstring(CordRep* rep, size_t offset, size_t n) {
+  assert(n != 0);
+  assert(offset + n <= rep->length);
+  assert(offset != 0 || n != rep->length);
+
+  if (rep->tag == SUBSTRING) {
+    CordRepSubstring* substring = rep->substring();
+    offset += substring->start;
+    rep = CordRep::Ref(substring->child);
+    CordRep::Unref(substring);
+  }
+  CordRepSubstring* substring = new CordRepSubstring();
+  substring->length = n;
+  substring->tag = SUBSTRING;
+  substring->start = offset;
+  substring->child = rep;
+  return substring;
+}
+
+// TODO(b/192061034): consider making this a cord rep library function.
+inline CordRep* MakeSubstring(CordRep* rep, size_t offset, size_t n) {
+  if (n == rep->length) return rep;
+  if (n == 0) return CordRep::Unref(rep), nullptr;
+  return CreateSubstring(rep, offset, n);
+}
+
+// TODO(b/192061034): consider making this a cord rep library function.
+inline CordRep* MakeSubstring(CordRep* rep, size_t offset) {
+  if (offset == 0) return rep;
+  return CreateSubstring(rep, offset, rep->length - offset);
+}
+
+template <EdgeType edge_type>
+inline absl::string_view Consume(absl::string_view s, size_t n) {
+  return edge_type == kBack ? s.substr(n) : s.substr(0, s.size() - n);
+}
+
+template <EdgeType edge_type>
+inline absl::string_view Consume(char* dst, absl::string_view s, size_t n) {
+  if (edge_type == kBack) {
+    memcpy(dst, s.data(), n);
+    return s.substr(n);
+  } else {
+    const size_t offset = s.size() - n;
+    memcpy(dst, s.data() + offset, n);
+    return s.substr(0, offset);
+  }
+}
+
+// Known issue / optimization weirdness: the store associated with the
+// decrement introduces traffic between cpus (even if the result of that
+// traffic does nothing), making this faster than a single call to
+// refcount.Decrement() checking the zero refcount condition.
+template <typename R, typename Fn>
+inline void FastUnref(R* r, Fn&& fn) {
+  if (r->refcount.IsOne()) {
+    fn(r);
+  } else if (!r->refcount.DecrementExpectHighRefcount()) {
+    fn(r);
+  }
+}
+
+// Deletes a leaf node data edge. Requires `rep` to be an EXTERNAL or FLAT
+// node, or a SUBSTRING of an EXTERNAL or FLAT node.
+void DeleteLeafEdge(CordRep* rep) {
+  for (;;) {
+    if (rep->tag >= FLAT) {
+      CordRepFlat::Delete(rep->flat());
+      return;
+    }
+    if (rep->tag == EXTERNAL) {
+      CordRepExternal::Delete(rep->external());
+      return;
+    }
+    assert(rep->tag == SUBSTRING);
+    CordRepSubstring* substring = rep->substring();
+    rep = substring->child;
+    assert(rep->tag == EXTERNAL || rep->tag >= FLAT);
+    delete substring;
+    if (rep->refcount.Decrement()) return;
+  }
+}
+
+// StackOperations contains the logic to build a left-most or right-most stack
+// (leg) down to the leaf level of a btree, and 'unwind' / 'Finalize' methods to
+// propagate node changes up the stack.
+template <EdgeType edge_type>
+struct StackOperations {
+  // Returns true if the node at 'depth' is not shared, i.e. has a refcount
+  // of one and all of its parent nodes have a refcount of one.
+  inline bool owned(int depth) const { return depth < share_depth; }
+
+  // Returns the node at 'depth'.
+  inline CordRepBtree* node(int depth) const { return stack[depth]; }
+
+  // Builds a `depth` levels deep stack starting at `tree` recording which nodes
+  // are private in the form of the 'share depth' where nodes are shared.
+  inline CordRepBtree* BuildStack(CordRepBtree* tree, int depth) {
+    assert(depth <= tree->height());
+    int current_depth = 0;
+    while (current_depth < depth && tree->refcount.IsOne()) {
+      stack[current_depth++] = tree;
+      tree = tree->Edge(edge_type)->btree();
+    }
+    share_depth = current_depth + (tree->refcount.IsOne() ? 1 : 0);
+    while (current_depth < depth) {
+      stack[current_depth++] = tree;
+      tree = tree->Edge(edge_type)->btree();
+    }
+    return tree;
+  }
+
+  // Builds a stack with the invariant that all nodes are private owned / not
+  // shared. This is used in iterative updates where a previous propagation
+  // guaranteed all nodes are owned / private.
+  inline void BuildOwnedStack(CordRepBtree* tree, int height) {
+    assert(height <= CordRepBtree::kMaxHeight);
+    int depth = 0;
+    while (depth < height) {
+      assert(tree->refcount.IsOne());
+      stack[depth++] = tree;
+      tree = tree->Edge(edge_type)->btree();
+    }
+    assert(tree->refcount.IsOne());
+    share_depth = depth + 1;
+  }
+
+  // Processes the final 'top level' result action for the tree.
+  // See the 'Action' enum for the various action implications.
+  static inline CordRepBtree* Finalize(CordRepBtree* tree, OpResult result) {
+    switch (result.action) {
+      case CordRepBtree::kPopped:
+        if (ABSL_PREDICT_FALSE(tree->height() >= CordRepBtree::kMaxHeight)) {
+          ABSL_RAW_LOG(FATAL, "Max height exceeded");
+        }
+        return edge_type == kBack ? CordRepBtree::New(tree, result.tree)
+                                  : CordRepBtree::New(result.tree, tree);
+      case CordRepBtree::kCopied:
+        CordRep::Unref(tree);
+        ABSL_FALLTHROUGH_INTENDED;
+      case CordRepBtree::kSelf:
+        return result.tree;
+    }
+    ABSL_INTERNAL_UNREACHABLE;
+    return result.tree;
+  }
+
+  // Propagate the action result in 'result' up into all nodes of the stack
+  // starting at depth 'depth'. 'length' contains the extra length of data that
+  // was added at the lowest level, and is updated into all nodes of the stack.
+  // See the 'Action' enum for the various action implications.
+  // If 'propagate' is true, then any copied node values are updated into the
+  // stack, which is used for iterative processing on the same stack.
+  template <bool propagate = false>
+  inline CordRepBtree* Unwind(CordRepBtree* tree, int depth, size_t length,
+                              OpResult result) {
+    // TODO(mvels): revisit the below code to check if 3 loops with 3
+    // (incremental) conditions is faster than 1 loop with a switch.
+    // Benchmarking and perf recordings indicate the loop with switch is
+    // fastest, likely because of indirect jumps on the tight case values and
+    // dense branches. But it's worth considering 3 loops, as the `action`
+    // transitions are mono directional. E.g.:
+    //   while (action == kPopped) {
+    //     ...
+    //   }
+    //   while (action == kCopied) {
+    //     ...
+    //   }
+    //   ...
+    // We also  found that an "if () do {}" loop here seems faster, possibly
+    // because it allows the branch predictor more granular heuristics on
+    // 'single leaf' (`depth` == 0) and 'single depth' (`depth` == 1) cases
+    // which appear to be the most common use cases.
+    if (depth != 0) {
+      do {
+        CordRepBtree* node = stack[--depth];
+        const bool owned = depth < share_depth;
+        switch (result.action) {
+          case CordRepBtree::kPopped:
+            assert(!propagate);
+            result = node->AddEdge<edge_type>(owned, result.tree, length);
+            break;
+          case CordRepBtree::kCopied:
+            result = node->SetEdge<edge_type>(owned, result.tree, length);
+            if (propagate) stack[depth] = result.tree;
+            break;
+          case CordRepBtree::kSelf:
+            node->length += length;
+            while (depth > 0) {
+              node = stack[--depth];
+              node->length += length;
+            }
+            return node;
+        }
+      } while (depth > 0);
+    }
+    return Finalize(tree, result);
+  }
+
+  // Invokes `Unwind` with `propagate=true` to update the stack node values.
+  inline CordRepBtree* Propagate(CordRepBtree* tree, int depth, size_t length,
+                                 OpResult result) {
+    return Unwind</*propagate=*/true>(tree, depth, length, result);
+  }
+
+  // `share_depth` contains the depth at which the nodes in the stack become
+  // shared. I.e., if the top most level is shared (i.e.: `!refcount.IsOne()`),
+  // then `share_depth` is 0. If the 2nd node is shared (and implicitly all
+  // nodes below that) then `share_depth` is 1, etc. A `share_depth` greater
+  // than the depth of the stack indicates that none of the nodes in the stack
+  // are shared.
+  int share_depth;
+
+  NodeStack stack;
+};
+
+}  // namespace
+
+void CordRepBtree::Dump(const CordRep* rep, absl::string_view label,
+                        bool include_contents, std::ostream& stream) {
+  stream << "===================================\n";
+  if (!label.empty()) {
+    stream << label << '\n';
+    stream << "-----------------------------------\n";
+  }
+  if (rep) {
+    DumpAll(rep, include_contents, stream);
+  } else {
+    stream << "NULL\n";
+  }
+}
+
+void CordRepBtree::Dump(const CordRep* rep, absl::string_view label,
+                        std::ostream& stream) {
+  Dump(rep, label, false, stream);
+}
+
+void CordRepBtree::Dump(const CordRep* rep, std::ostream& stream) {
+  Dump(rep, absl::string_view(), false, stream);
+}
+
+void CordRepBtree::DestroyLeaf(CordRepBtree* tree, size_t begin, size_t end) {
+  for (CordRep* edge : tree->Edges(begin, end)) {
+    FastUnref(edge, DeleteLeafEdge);
+  }
+  Delete(tree);
+}
+
+void CordRepBtree::DestroyNonLeaf(CordRepBtree* tree, size_t begin,
+                                  size_t end) {
+  for (CordRep* edge : tree->Edges(begin, end)) {
+    FastUnref(edge->btree(), Destroy);
+  }
+  Delete(tree);
+}
+
+bool CordRepBtree::IsValid(const CordRepBtree* tree, bool shallow) {
+#define NODE_CHECK_VALID(x)                                           \
+  if (!(x)) {                                                         \
+    ABSL_RAW_LOG(ERROR, "CordRepBtree::CheckValid() FAILED: %s", #x); \
+    return false;                                                     \
+  }
+#define NODE_CHECK_EQ(x, y)                                                    \
+  if ((x) != (y)) {                                                            \
+    ABSL_RAW_LOG(ERROR,                                                        \
+                 "CordRepBtree::CheckValid() FAILED: %s != %s (%s vs %s)", #x, \
+                 #y, absl::StrCat(x).c_str(), absl::StrCat(y).c_str());        \
+    return false;                                                              \
+  }
+
+  NODE_CHECK_VALID(tree != nullptr);
+  NODE_CHECK_VALID(tree->IsBtree());
+  NODE_CHECK_VALID(tree->height() <= kMaxHeight);
+  NODE_CHECK_VALID(tree->begin() < tree->capacity());
+  NODE_CHECK_VALID(tree->end() <= tree->capacity());
+  NODE_CHECK_VALID(tree->begin() <= tree->end());
+  size_t child_length = 0;
+  for (CordRep* edge : tree->Edges()) {
+    NODE_CHECK_VALID(edge != nullptr);
+    if (tree->height() > 0) {
+      NODE_CHECK_VALID(edge->IsBtree());
+      NODE_CHECK_VALID(edge->btree()->height() == tree->height() - 1);
+    } else {
+      NODE_CHECK_VALID(IsDataEdge(edge));
+    }
+    child_length += edge->length;
+  }
+  NODE_CHECK_EQ(child_length, tree->length);
+  if ((!shallow || exhaustive_validation()) && tree->height() > 0) {
+    for (CordRep* edge : tree->Edges()) {
+      if (!IsValid(edge->btree(), shallow)) return false;
+    }
+  }
+  return true;
+
+#undef NODE_CHECK_VALID
+#undef NODE_CHECK_EQ
+}
+
+#ifndef NDEBUG
+
+CordRepBtree* CordRepBtree::AssertValid(CordRepBtree* tree, bool shallow) {
+  if (!IsValid(tree, shallow)) {
+    Dump(tree, "CordRepBtree validation failed:", false, std::cout);
+    ABSL_RAW_LOG(FATAL, "CordRepBtree::CheckValid() FAILED");
+  }
+  return tree;
+}
+
+const CordRepBtree* CordRepBtree::AssertValid(const CordRepBtree* tree,
+                                              bool shallow) {
+  if (!IsValid(tree, shallow)) {
+    Dump(tree, "CordRepBtree validation failed:", false, std::cout);
+    ABSL_RAW_LOG(FATAL, "CordRepBtree::CheckValid() FAILED");
+  }
+  return tree;
+}
+
+#endif  // NDEBUG
+
+template <EdgeType edge_type>
+inline OpResult CordRepBtree::AddEdge(bool owned, CordRep* edge, size_t delta) {
+  if (size() >= kMaxCapacity) return {New(edge), kPopped};
+  OpResult result = ToOpResult(owned);
+  result.tree->Add<edge_type>(edge);
+  result.tree->length += delta;
+  return result;
+}
+
+template <EdgeType edge_type>
+OpResult CordRepBtree::SetEdge(bool owned, CordRep* edge, size_t delta) {
+  OpResult result;
+  const size_t idx = index(edge_type);
+  if (owned) {
+    result = {this, kSelf};
+    CordRep::Unref(edges_[idx]);
+  } else {
+    // Create a copy containing all unchanged edges. Unchanged edges are the
+    // open interval [begin, back) or [begin + 1, end) depending on `edge_type`.
+    // We conveniently cover both case using a constexpr `shift` being 0 or 1
+    // as `end :== back + 1`.
+    result = {CopyRaw(), kCopied};
+    constexpr int shift = edge_type == kFront ? 1 : 0;
+    for (CordRep* r : Edges(begin() + shift, back() + shift)) {
+      CordRep::Ref(r);
+    }
+  }
+  result.tree->edges_[idx] = edge;
+  result.tree->length += delta;
+  return result;
+}
+
+template <EdgeType edge_type>
+CordRepBtree* CordRepBtree::AddCordRep(CordRepBtree* tree, CordRep* rep) {
+  const int depth = tree->height();
+  const size_t length = rep->length;
+  StackOperations<edge_type> ops;
+  CordRepBtree* leaf = ops.BuildStack(tree, depth);
+  const OpResult result =
+      leaf->AddEdge<edge_type>(ops.owned(depth), rep, length);
+  return ops.Unwind(tree, depth, length, result);
+}
+
+template <>
+CordRepBtree* CordRepBtree::NewLeaf<kBack>(absl::string_view data,
+                                           size_t extra) {
+  CordRepBtree* leaf = CordRepBtree::New(0);
+  size_t length = 0;
+  size_t end = 0;
+  const size_t cap = leaf->capacity();
+  while (!data.empty() && end != cap) {
+    auto* flat = CordRepFlat::New(data.length() + extra);
+    flat->length = (std::min)(data.length(), flat->Capacity());
+    length += flat->length;
+    leaf->edges_[end++] = flat;
+    data = Consume<kBack>(flat->Data(), data, flat->length);
+  }
+  leaf->length = length;
+  leaf->set_end(end);
+  return leaf;
+}
+
+template <>
+CordRepBtree* CordRepBtree::NewLeaf<kFront>(absl::string_view data,
+                                            size_t extra) {
+  CordRepBtree* leaf = CordRepBtree::New(0);
+  size_t length = 0;
+  size_t begin = leaf->capacity();
+  leaf->set_end(leaf->capacity());
+  while (!data.empty() && begin != 0) {
+    auto* flat = CordRepFlat::New(data.length() + extra);
+    flat->length = (std::min)(data.length(), flat->Capacity());
+    length += flat->length;
+    leaf->edges_[--begin] = flat;
+    data = Consume<kFront>(flat->Data(), data, flat->length);
+  }
+  leaf->length = length;
+  leaf->set_begin(begin);
+  return leaf;
+}
+
+template <>
+absl::string_view CordRepBtree::AddData<kBack>(absl::string_view data,
+                                               size_t extra) {
+  assert(!data.empty());
+  assert(size() < capacity());
+  AlignBegin();
+  const size_t cap = capacity();
+  do {
+    CordRepFlat* flat = CordRepFlat::New(data.length() + extra);
+    const size_t n = (std::min)(data.length(), flat->Capacity());
+    flat->length = n;
+    edges_[fetch_add_end(1)] = flat;
+    data = Consume<kBack>(flat->Data(), data, n);
+  } while (!data.empty() && end() != cap);
+  return data;
+}
+
+template <>
+absl::string_view CordRepBtree::AddData<kFront>(absl::string_view data,
+                                                size_t extra) {
+  assert(!data.empty());
+  assert(size() < capacity());
+  AlignEnd();
+  do {
+    CordRepFlat* flat = CordRepFlat::New(data.length() + extra);
+    const size_t n = (std::min)(data.length(), flat->Capacity());
+    flat->length = n;
+    edges_[sub_fetch_begin(1)] = flat;
+    data = Consume<kFront>(flat->Data(), data, n);
+  } while (!data.empty() && begin() != 0);
+  return data;
+}
+
+template <EdgeType edge_type>
+CordRepBtree* CordRepBtree::AddData(CordRepBtree* tree, absl::string_view data,
+                                    size_t extra) {
+  if (ABSL_PREDICT_FALSE(data.empty())) return tree;
+
+  const size_t original_data_size = data.size();
+  int depth = tree->height();
+  StackOperations<edge_type> ops;
+  CordRepBtree* leaf = ops.BuildStack(tree, depth);
+
+  // If there is capacity in the last edge, append as much data
+  // as possible into this last edge.
+  if (leaf->size() < leaf->capacity()) {
+    OpResult result = leaf->ToOpResult(ops.owned(depth));
+    data = result.tree->AddData<edge_type>(data, extra);
+    if (data.empty()) {
+      result.tree->length += original_data_size;
+      return ops.Unwind(tree, depth, original_data_size, result);
+    }
+
+    // We added some data into this leaf, but not all. Propagate the added
+    // length to the top most node, and rebuild the stack with any newly copied
+    // or updated nodes. From this point on, the path (leg) from the top most
+    // node to the right-most node towards the leaf node is privately owned.
+    size_t delta = original_data_size - data.size();
+    assert(delta > 0);
+    result.tree->length += delta;
+    tree = ops.Propagate(tree, depth, delta, result);
+    ops.share_depth = depth + 1;
+  }
+
+  // We were unable to append all data into the existing right-most leaf node.
+  // This means all remaining data must be put into (a) new leaf node(s) which
+  // we append to the tree. To make this efficient, we iteratively build full
+  // leaf nodes from `data` until the created leaf contains all remaining data.
+  // We utilize the `Unwind` method to merge the created leaf into the first
+  // level towards root that has capacity. On each iteration with remaining
+  // data, we rebuild the stack in the knowledge that right-most nodes are
+  // privately owned after the first `Unwind` completes.
+  for (;;) {
+    OpResult result = {CordRepBtree::NewLeaf<edge_type>(data, extra), kPopped};
+    if (result.tree->length == data.size()) {
+      return ops.Unwind(tree, depth, result.tree->length, result);
+    }
+    data = Consume<edge_type>(data, result.tree->length);
+    tree = ops.Unwind(tree, depth, result.tree->length, result);
+    depth = tree->height();
+    ops.BuildOwnedStack(tree, depth);
+  }
+}
+
+template <EdgeType edge_type>
+CordRepBtree* CordRepBtree::Merge(CordRepBtree* dst, CordRepBtree* src) {
+  assert(dst->height() >= src->height());
+
+  // Capture source length as we may consume / destroy `src`.
+  const size_t length = src->length;
+
+  // We attempt to merge `src` at its corresponding height in `dst`.
+  const int depth = dst->height() - src->height();
+  StackOperations<edge_type> ops;
+  CordRepBtree* merge_node = ops.BuildStack(dst, depth);
+
+  // If there is enough space in `merge_node` for all edges from `src`, add all
+  // edges to this node, making a fresh copy as needed if not privately owned.
+  // If `merge_node` does not have capacity for `src`, we rely on `Unwind` and
+  // `Finalize` to merge `src` into the first level towards `root` where there
+  // is capacity for another edge, or create a new top level node.
+  OpResult result;
+  if (merge_node->size() + src->size() <= kMaxCapacity) {
+    result = merge_node->ToOpResult(ops.owned(depth));
+    result.tree->Add<edge_type>(src->Edges());
+    result.tree->length += src->length;
+    if (src->refcount.IsOne()) {
+      Delete(src);
+    } else {
+      for (CordRep* edge : src->Edges()) CordRep::Ref(edge);
+      CordRepBtree::Unref(src);
+    }
+  } else {
+    result = {src, kPopped};
+  }
+
+  // Unless we merged at the top level (i.e.: src and dst are equal height),
+  // unwind the result towards the top level, and finalize the result.
+  if (depth) {
+    return ops.Unwind(dst, depth, length, result);
+  }
+  return ops.Finalize(dst, result);
+}
+
+CopyResult CordRepBtree::CopySuffix(size_t offset) {
+  assert(offset < this->length);
+
+  // As long as `offset` starts inside the last edge, we can 'drop' the current
+  // depth. For the most extreme example: if offset references the last data
+  // edge in the tree, there is only a single edge / path from the top of the
+  // tree to that last edge, so we can drop all the nodes except that edge.
+  // The fast path check for this is `back->length >= length - offset`.
+  int height = this->height();
+  CordRepBtree* node = this;
+  size_t len = node->length - offset;
+  CordRep* back = node->Edge(kBack);
+  while (back->length >= len) {
+    offset = back->length - len;
+    if (--height < 0) {
+      return {MakeSubstring(CordRep::Ref(back), offset), height};
+    }
+    node = back->btree();
+    back = node->Edge(kBack);
+  }
+  if (offset == 0) return {CordRep::Ref(node), height};
+
+  // Offset does not point into the last edge, so we span at least two edges.
+  // Find the index of offset with `IndexBeyond` which provides us the edge
+  // 'beyond' the offset if offset is not a clean starting point of an edge.
+  Position pos = node->IndexBeyond(offset);
+  CordRepBtree* sub = node->CopyToEndFrom(pos.index, len);
+  const CopyResult result = {sub, height};
+
+  // `pos.n` contains a non zero value if the offset is not an exact starting
+  // point of an edge. In this case, `pos.n` contains the 'trailing' amount of
+  // bytes of the edge preceding that in `pos.index`. We need to iteratively
+  // adjust the preceding edge with the 'broken' offset until we have a perfect
+  // start of the edge.
+  while (pos.n != 0) {
+    assert(pos.index >= 1);
+    const size_t begin = pos.index - 1;
+    sub->set_begin(begin);
+    CordRep* const edge = node->Edge(begin);
+
+    len = pos.n;
+    offset = edge->length - len;
+
+    if (--height < 0) {
+      sub->edges_[begin] = MakeSubstring(CordRep::Ref(edge), offset, len);
+      return result;
+    }
+
+    node = edge->btree();
+    pos = node->IndexBeyond(offset);
+
+    CordRepBtree* nsub = node->CopyToEndFrom(pos.index, len);
+    sub->edges_[begin] = nsub;
+    sub = nsub;
+  }
+  sub->set_begin(pos.index);
+  return result;
+}
+
+CopyResult CordRepBtree::CopyPrefix(size_t n) {
+  assert(n > 0);
+  assert(n <= this->length);
+
+  // As long as `n` does not exceed the length of the first edge, we can 'drop'
+  // the current depth. For the most extreme example: if we'd copy a 1 byte
+  // prefix from a tree, there is only a single edge / path from the top of the
+  // tree to the single data edge containing this byte, so we can drop all the
+  // nodes except the data node.
+  int height = this->height();
+  CordRepBtree* node = this;
+  CordRep* front = node->Edge(kFront);
+  while (front->length >= n) {
+    if (--height < 0) return {MakeSubstring(CordRep::Ref(front), 0, n), -1};
+    node = front->btree();
+    front = node->Edge(kFront);
+  }
+  if (node->length == n) return {CordRep::Ref(node), height};
+
+  // `n` spans at least two nodes, find the end point of the span.
+  Position pos = node->IndexOf(n);
+
+  // Create a partial copy of the node up to `pos.index`, with a defined length
+  // of `n`. Any 'partial last edge' is added further below as needed.
+  CordRepBtree* sub = node->CopyBeginTo(pos.index, n);
+  const CopyResult result = {sub, height};
+
+  // `pos.n` contains the 'offset inside the edge for IndexOf(n)'. As long as
+  // this is not zero, we don't have a 'clean cut', so we need to make a
+  // (partial) copy of that last edge, and repeat this until pos.n is zero.
+  while (pos.n != 0) {
+    size_t end = pos.index;
+    n = pos.n;
+
+    CordRep* edge = node->Edge(pos.index);
+    if (--height < 0) {
+      sub->edges_[end++] = MakeSubstring(CordRep::Ref(edge), 0, n);
+      sub->set_end(end);
+      AssertValid(result.edge->btree());
+      return result;
+    }
+
+    node = edge->btree();
+    pos = node->IndexOf(n);
+    CordRepBtree* nsub = node->CopyBeginTo(pos.index, n);
+    sub->edges_[end++] = nsub;
+    sub->set_end(end);
+    sub = nsub;
+  }
+  sub->set_end(pos.index);
+  AssertValid(result.edge->btree());
+  return result;
+}
+
+CordRep* CordRepBtree::SubTree(size_t offset, size_t n) {
+  assert(n <= this->length);
+  assert(offset <= this->length - n);
+  if (ABSL_PREDICT_FALSE(n == 0)) return nullptr;
+
+  CordRepBtree* node = this;
+  int height = node->height();
+  Position front = node->IndexOf(offset);
+  CordRep* left = node->edges_[front.index];
+  while (front.n + n <= left->length) {
+    if (--height < 0) return MakeSubstring(CordRep::Ref(left), front.n, n);
+    node = left->btree();
+    front = node->IndexOf(front.n);
+    left = node->edges_[front.index];
+  }
+
+  const Position back = node->IndexBefore(front, n);
+  CordRep* const right = node->edges_[back.index];
+  assert(back.index > front.index);
+
+  // Get partial suffix and prefix entries.
+  CopyResult prefix;
+  CopyResult suffix;
+  if (height > 0) {
+    // Copy prefix and suffix of the boundary nodes.
+    prefix = left->btree()->CopySuffix(front.n);
+    suffix = right->btree()->CopyPrefix(back.n);
+
+    // If there is an edge between the prefix and suffix edges, then the tree
+    // must remain at its previous (full) height. If we have no edges between
+    // prefix and suffix edges, then the tree must be as high as either the
+    // suffix or prefix edges (which are collapsed to their minimum heights).
+    if (front.index + 1 == back.index) {
+      height = (std::max)(prefix.height, suffix.height) + 1;
+    }
+
+    // Raise prefix and suffixes to the new tree height.
+    for (int h = prefix.height + 1; h < height; ++h) {
+      prefix.edge = CordRepBtree::New(prefix.edge);
+    }
+    for (int h = suffix.height + 1; h < height; ++h) {
+      suffix.edge = CordRepBtree::New(suffix.edge);
+    }
+  } else {
+    // Leaf node, simply take substrings for prefix and suffix.
+    prefix = CopyResult{MakeSubstring(CordRep::Ref(left), front.n), -1};
+    suffix = CopyResult{MakeSubstring(CordRep::Ref(right), 0, back.n), -1};
+  }
+
+  // Compose resulting tree.
+  CordRepBtree* sub = CordRepBtree::New(height);
+  size_t end = 0;
+  sub->edges_[end++] = prefix.edge;
+  for (CordRep* r : node->Edges(front.index + 1, back.index)) {
+    sub->edges_[end++] = CordRep::Ref(r);
+  }
+  sub->edges_[end++] = suffix.edge;
+  sub->set_end(end);
+  sub->length = n;
+  return AssertValid(sub);
+}
+
+CordRepBtree* CordRepBtree::MergeTrees(CordRepBtree* left,
+                                       CordRepBtree* right) {
+  return left->height() >= right->height() ? Merge<kBack>(left, right)
+                                           : Merge<kFront>(right, left);
+}
+
+bool CordRepBtree::IsFlat(absl::string_view* fragment) const {
+  if (height() == 0 && size() == 1) {
+    if (fragment) *fragment = Data(begin());
+    return true;
+  }
+  return false;
+}
+
+bool CordRepBtree::IsFlat(size_t offset, const size_t n,
+                          absl::string_view* fragment) const {
+  assert(n <= this->length);
+  assert(offset <= this->length - n);
+  if (ABSL_PREDICT_FALSE(n == 0)) return false;
+  int height = this->height();
+  const CordRepBtree* node = this;
+  for (;;) {
+    const Position front = node->IndexOf(offset);
+    const CordRep* edge = node->Edge(front.index);
+    if (edge->length < front.n + n) return false;
+    if (--height < 0) {
+      if (fragment) *fragment = EdgeData(edge).substr(front.n, n);
+      return true;
+    }
+    offset = front.n;
+    node = node->Edge(front.index)->btree();
+  }
+}
+
+char CordRepBtree::GetCharacter(size_t offset) const {
+  assert(offset < length);
+  const CordRepBtree* node = this;
+  int height = node->height();
+  for (;;) {
+    Position front = node->IndexOf(offset);
+    if (--height < 0) return node->Data(front.index)[front.n];
+    offset = front.n;
+    node = node->Edge(front.index)->btree();
+  }
+}
+
+Span<char> CordRepBtree::GetAppendBufferSlow(size_t size) {
+  // The inlined version in `GetAppendBuffer()` deals with all heights <= 3.
+  assert(height() >= 4);
+  assert(refcount.IsOne());
+
+  // Build a stack of nodes we may potentially need to update if we find a
+  // non-shared FLAT with capacity at the leaf level.
+  const int depth = height();
+  CordRepBtree* node = this;
+  CordRepBtree* stack[kMaxDepth];
+  for (int i = 0; i < depth; ++i) {
+    node = node->Edge(kBack)->btree();
+    if (!node->refcount.IsOne()) return {};
+    stack[i] = node;
+  }
+
+  // Must be a privately owned flat.
+  CordRep* const edge = node->Edge(kBack);
+  if (!edge->refcount.IsOne() || edge->tag < FLAT) return {};
+
+  // Must have capacity.
+  const size_t avail = edge->flat()->Capacity() - edge->length;
+  if (avail == 0) return {};
+
+  // Build span on remaining capacity.
+  size_t delta = (std::min)(size, avail);
+  Span<char> span = {edge->flat()->Data() + edge->length, delta};
+  edge->length += delta;
+  this->length += delta;
+  for (int i = 0; i < depth; ++i) {
+    stack[i]->length += delta;
+  }
+  return span;
+}
+
+CordRepBtree* CordRepBtree::CreateSlow(CordRep* rep) {
+  if (rep->IsBtree()) return rep->btree();
+
+  CordRepBtree* node = nullptr;
+  auto consume = [&node](CordRep* r, size_t offset, size_t length) {
+    r = MakeSubstring(r, offset, length);
+    if (node == nullptr) {
+      node = New(r);
+    } else {
+      node = CordRepBtree::AddCordRep<kBack>(node, r);
+    }
+  };
+  Consume(rep, consume);
+  return node;
+}
+
+CordRepBtree* CordRepBtree::AppendSlow(CordRepBtree* tree, CordRep* rep) {
+  if (ABSL_PREDICT_TRUE(rep->IsBtree())) {
+    return MergeTrees(tree, rep->btree());
+  }
+  auto consume = [&tree](CordRep* r, size_t offset, size_t length) {
+    r = MakeSubstring(r, offset, length);
+    tree = CordRepBtree::AddCordRep<kBack>(tree, r);
+  };
+  Consume(rep, consume);
+  return tree;
+}
+
+CordRepBtree* CordRepBtree::PrependSlow(CordRepBtree* tree, CordRep* rep) {
+  if (ABSL_PREDICT_TRUE(rep->IsBtree())) {
+    return MergeTrees(rep->btree(), tree);
+  }
+  auto consume = [&tree](CordRep* r, size_t offset, size_t length) {
+    r = MakeSubstring(r, offset, length);
+    tree = CordRepBtree::AddCordRep<kFront>(tree, r);
+  };
+  ReverseConsume(rep, consume);
+  return tree;
+}
+
+CordRepBtree* CordRepBtree::Append(CordRepBtree* tree, absl::string_view data,
+                                   size_t extra) {
+  return CordRepBtree::AddData<kBack>(tree, data, extra);
+}
+
+CordRepBtree* CordRepBtree::Prepend(CordRepBtree* tree, absl::string_view data,
+                                    size_t extra) {
+  return CordRepBtree::AddData<kFront>(tree, data, extra);
+}
+
+template CordRepBtree* CordRepBtree::AddCordRep<kFront>(CordRepBtree* tree,
+                                                        CordRep* rep);
+template CordRepBtree* CordRepBtree::AddCordRep<kBack>(CordRepBtree* tree,
+                                                       CordRep* rep);
+template CordRepBtree* CordRepBtree::AddData<kFront>(CordRepBtree* tree,
+                                                     absl::string_view data,
+                                                     size_t extra);
+template CordRepBtree* CordRepBtree::AddData<kBack>(CordRepBtree* tree,
+                                                    absl::string_view data,
+                                                    size_t extra);
+
+}  // namespace cord_internal
+ABSL_NAMESPACE_END
+}  // namespace absl
diff --git a/third_party/abseil-cpp/absl/strings/internal/cord_rep_btree.h b/third_party/abseil-cpp/absl/strings/internal/cord_rep_btree.h
new file mode 100644
index 0000000..bbaa793
--- /dev/null
+++ b/third_party/abseil-cpp/absl/strings/internal/cord_rep_btree.h
@@ -0,0 +1,870 @@
+// Copyright 2021 The Abseil Authors
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     https://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#ifndef ABSL_STRINGS_INTERNAL_CORD_REP_BTREE_H_
+#define ABSL_STRINGS_INTERNAL_CORD_REP_BTREE_H_
+
+#include <cassert>
+#include <cstdint>
+#include <iosfwd>
+
+#include "absl/base/config.h"
+#include "absl/base/internal/raw_logging.h"
+#include "absl/base/optimization.h"
+#include "absl/strings/internal/cord_internal.h"
+#include "absl/strings/internal/cord_rep_flat.h"
+#include "absl/strings/string_view.h"
+#include "absl/types/span.h"
+
+namespace absl {
+ABSL_NAMESPACE_BEGIN
+namespace cord_internal {
+
+class CordRepBtreeNavigator;
+
+// CordRepBtree is as the name implies a btree implementation of a Cordrep tree.
+// Data is stored at the leaf level only, non leaf nodes contain down pointers
+// only. Allowed types of data edges are FLAT, EXTERNAL and SUBSTRINGs of FLAT
+// or EXTERNAL nodes. The implementation allows for data to be added to either
+// end of the tree only, it does not provide any 'insert' logic. This has the
+// benefit that we can expect good fill ratios: all nodes except the outer
+// 'legs' will have 100% fill ratios for trees built using Append/Prepend
+// methods. Merged trees will typically have a fill ratio well above 50% as in a
+// similar fashion, one side of the merged tree will typically have a 100% fill
+// ratio, and the 'open' end will average 50%. All operations are O(log(n)) or
+// better, and the tree never needs balancing.
+//
+// All methods accepting a CordRep* or CordRepBtree* adopt a reference on that
+// input unless explicitly stated otherwise. All functions returning a CordRep*
+// or CordRepBtree* instance transfer a reference back to the caller.
+// Simplified, callers both 'donate' and 'consume' a reference count on each
+// call, simplifying the API. An example of building a tree:
+//
+//   CordRepBtree* tree = CordRepBtree::Create(MakeFlat("Hello"));
+//   tree = CordRepBtree::Append(tree, MakeFlat("world"));
+//
+// In the above example, all inputs are consumed, making each call affecting
+// `tree` reference count neutral. The returned `tree` value can be different
+// from the input if the input is shared with other threads, or if the tree
+// grows in height, but callers typically never have to concern themselves with
+// that and trust that all methods DTRT at all times.
+class CordRepBtree : public CordRep {
+ public:
+  // EdgeType identifies `front` and `back` enum values.
+  // Various implementations in CordRepBtree such as `Add` and `Edge` are
+  // generic and templated on operating on either of the boundary edges.
+  // For more information on the possible edges contained in a CordRepBtree
+  // instance see the documentation for `edges_`.
+  enum class EdgeType { kFront, kBack };
+
+  // Convenience constants into `EdgeType`
+  static constexpr EdgeType kFront = EdgeType::kFront;
+  static constexpr EdgeType kBack = EdgeType::kBack;
+
+  // Maximum number of edges: based on experiments and performance data, we can
+  // pick suitable values resulting in optimum cacheline aligned values. The
+  // preferred values are based on 64-bit systems where we aim to align this
+  // class onto 64 bytes, i.e.:  6 = 64 bytes, 14 = 128 bytes, etc.
+  // TODO(b/192061034): experiment with alternative sizes.
+  static constexpr size_t kMaxCapacity = 6;
+
+  // Reasonable maximum height of the btree. We can expect a fill ratio of at
+  // least 50%: trees are always expanded at the front or back. Concatenating
+  // trees will then typically fold at the top most node, where the lower nodes
+  // are at least at capacity on one side of joined inputs. At a lower fill
+  // rate of 4 edges per node, we have capacity for ~16 million leaf nodes.
+  // We will fail / abort if an application ever exceeds this height, which
+  // should be extremely rare (near impossible) and be an indication of an
+  // application error: we do not assume it reasonable for any application to
+  // operate correctly with such monster trees.
+  // Another compelling reason for the number `12` is that any contextual stack
+  // required for navigation or insertion requires 12 words and 12 bytes, which
+  // fits inside 2 cache lines with some room to spare, and is reasonable as a
+  // local stack variable compared to Cord's current near 400 bytes stack use.
+  // The maximum `height` value of a node is then `kMaxDepth - 1` as node height
+  // values start with a value of 0 for leaf nodes.
+  static constexpr int kMaxDepth = 12;
+  static constexpr int kMaxHeight = kMaxDepth - 1;
+
+  // `Action` defines the action for unwinding changes done at the btree's leaf
+  // level that need to be propagated up to the parent node(s). Each operation
+  // on a node has an effect / action defined as follows:
+  // - kSelf
+  //   The operation (add / update, etc) was performed directly on the node as
+  //   the node is private to the current thread (i.e.: not shared directly or
+  //   indirectly through a refcount > 1). Changes can be propagated directly to
+  //   all parent nodes as all parent nodes are also then private to the current
+  //   thread.
+  // - kCopied
+  //   The operation (add / update, etc) was performed on a copy of the original
+  //   node, as the node is (potentially) directly or indirectly shared with
+  //   other threads. Changes need to be propagated into the parent nodes where
+  //   the old down pointer must be unreffed and replaced with this new copy.
+  //   Such changes to parent nodes may themselves require a copy if the parent
+  //   node is also shared. A kCopied action can propagate all the way to the
+  //   top node where we then must unref the `tree` input provided by the
+  //   caller, and return the new copy.
+  // - kPopped
+  //   The operation (typically add) could not be satisfied due to insufficient
+  //   capacity in the targeted node, and a new 'leg' was created that needs to
+  //   be added into the parent node. For example, adding a FLAT inside a leaf
+  //   node that is at capacity will create a new leaf node containing that
+  //   FLAT, that needs to be 'popped' up the btree. Such 'pop' actions can
+  //   cascade up the tree if parent nodes are also at capacity. A 'Popped'
+  //   action propagating all the way to the top of the tree will result in
+  //   the tree becoming one level higher than the current tree through a final
+  //   `CordRepBtree::New(tree, popped)` call, resulting in a new top node
+  //   referencing the old tree and the new (fully popped upwards) 'leg'.
+  enum Action { kSelf, kCopied, kPopped };
+
+  // Result of an operation on a node. See the `Action` enum for details.
+  struct OpResult {
+    CordRepBtree* tree;
+    Action action;
+  };
+
+  // Return value of the CopyPrefix and CopySuffix methods which can
+  // return a node or data edge at any height inside the tree.
+  // A height of 0 defines the lowest (leaf) node, a height of -1 identifies
+  // `edge` as being a plain data node: EXTERNAL / FLAT or SUBSTRING thereof.
+  struct CopyResult {
+    CordRep* edge;
+    int height;
+  };
+
+  // Logical position inside a node:
+  // - index: index of the edge.
+  // - n: size or offset value depending on context.
+  struct Position {
+    size_t index;
+    size_t n;
+  };
+
+  // Creates a btree from the given input. Adopts a ref of `rep`.
+  // If the input `rep` is itself a btree, i.e., `IsBtree()`, then this
+  // function immediately returns `rep->btree()`. If the input is a valid data
+  // edge (see IsDataEdge()), then a new leaf node is returned containing `rep`
+  // as the sole data edge. Else, the input is assumed to be a (legacy) concat
+  // tree, and the input is consumed and transformed into a btree().
+  static CordRepBtree* Create(CordRep* rep);
+
+  // Destroys the provided tree. Should only be called by cord internal API's,
+  // typically after a ref_count.Decrement() on the last reference count.
+  static void Destroy(CordRepBtree* tree);
+
+  // Appends / Prepends an existing CordRep instance to this tree.
+  // The below methods accept three types of input:
+  // 1) `rep` is a data node (See `IsDataNode` for valid data edges).
+  // `rep` is appended or prepended to this tree 'as is'.
+  // 2) `rep` is a BTREE.
+  // `rep` is merged into `tree` respecting the Append/Prepend order.
+  // 3) `rep` is some other (legacy) type.
+  // `rep` is converted in place and added to `tree`
+  // Requires `tree` and `rep` to be not null.
+  static CordRepBtree* Append(CordRepBtree* tree, CordRep* rep);
+  static CordRepBtree* Prepend(CordRepBtree* tree, CordRep* rep);
+
+  // Append/Prepend the data in `data` to this tree.
+  // The `extra` parameter defines how much extra capacity should be allocated
+  // for any additional FLAT being allocated. This is an optimization hint from
+  // the caller. For example, a caller may need to add 2 string_views of data
+  // "abc" and "defghi" which are not consecutive. The caller can in this case
+  // invoke `AddData(tree, "abc", 6)`, and any newly added flat is allocated
+  // where possible with at least 6 bytes of extra capacity beyond `length`.
+  // This helps avoiding data getting fragmented over multiple flats.
+  // There is no limit on the size of `data`. If `data` can not be stored inside
+  // a single flat, then the function will iteratively add flats until all data
+  // has been consumed and appended or prepended to the tree.
+  static CordRepBtree* Append(CordRepBtree* tree, string_view data,
+                              size_t extra = 0);
+  static CordRepBtree* Prepend(CordRepBtree* tree, string_view data,
+                               size_t extra = 0);
+
+  // Returns a new tree, containing `n` bytes of data from this instance
+  // starting at offset `offset`. Where possible, the returned tree shares
+  // (re-uses) data edges and nodes with this instance to minimize the
+  // combined memory footprint of both trees.
+  // Requires `offset + n <= length`. Returns `nullptr` if `n` is zero.
+  CordRep* SubTree(size_t offset, size_t n);
+
+  // Returns the character at the given offset.
+  char GetCharacter(size_t offset) const;
+
+  // Returns true if this node holds a single data edge, and if so, sets
+  // `fragment` to reference the contained data. `fragment` is an optional
+  // output parameter and allowed to be null.
+  bool IsFlat(absl::string_view* fragment) const;
+
+  // Returns true if the data of `n` bytes starting at offset `offset`
+  // is contained in a single data edge, and if so, sets fragment to reference
+  // the contained data. `fragment` is an optional output parameter and allowed
+  // to be null.
+  bool IsFlat(size_t offset, size_t n, absl::string_view* fragment) const;
+
+  // Returns a span (mutable range of bytes) of up to `size` bytes into the
+  // last FLAT data edge inside this tree under the following conditions:
+  // - none of the nodes down into the FLAT node are shared.
+  // - the last data edge in this tree is a non-shared FLAT.
+  // - the referenced FLAT has additional capacity available.
+  // If all these conditions are met, a non-empty span is returned, and the
+  // length of the flat node and involved tree nodes have been increased by
+  // `span.length()`. The caller is responsible for immediately assigning values
+  // to all uninitialized data reference by the returned span.
+  // Requires `this->refcount.IsOne()`: this function forces the caller to do
+  // this fast path check on the top level node, as this is the most commonly
+  // shared node of a cord tree.
+  Span<char> GetAppendBuffer(size_t size);
+
+  // Returns the `height` of the tree. The height of a tree is limited to
+  // kMaxHeight. `height` is implemented as an `int` as in some places we
+  // use negative (-1) values for 'data edges'.
+  int height() const { return static_cast<int>(storage[0]); }
+
+  // Properties: begin, back, end, front/back boundary indexes.
+  size_t begin() const { return static_cast<size_t>(storage[1]); }
+  size_t back() const { return static_cast<size_t>(storage[2]) - 1; }
+  size_t end() const { return static_cast<size_t>(storage[2]); }
+  size_t index(EdgeType edge) const {
+    return edge == kFront ? begin() : back();
+  }
+
+  // Properties: size and capacity.
+  // `capacity` contains the current capacity of this instance, where
+  // `kMaxCapacity` contains the maximum capacity of a btree node.
+  // For now, `capacity` and `kMaxCapacity` return the same value, but this may
+  // change in the future if we see benefit in dynamically sizing 'small' nodes
+  // to 'large' nodes for large data trees.
+  size_t size() const { return end() - begin(); }
+  size_t capacity() const { return kMaxCapacity; }
+
+  // Edge access
+  inline CordRep* Edge(size_t index) const;
+  inline CordRep* Edge(EdgeType edge_type) const;
+  inline absl::Span<CordRep* const> Edges() const;
+  inline absl::Span<CordRep* const> Edges(size_t begin, size_t end) const;
+
+  // Returns reference to the data edge at `index`.
+  // Requires this instance to be a leaf node, and `index` to be valid index.
+  inline absl::string_view Data(size_t index) const;
+
+  static const char* EdgeDataPtr(const CordRep* r);
+  static absl::string_view EdgeData(const CordRep* r);
+
+  // Returns true if the provided rep is a FLAT, EXTERNAL or a SUBSTRING node
+  // holding a FLAT or EXTERNAL child rep.
+  static bool IsDataEdge(const CordRep* rep);
+
+  // Diagnostics: returns true if `tree` is valid and internally consistent.
+  // If `shallow` is false, then the provided top level node and all child nodes
+  // below it are recursively checked. If `shallow` is true, only the provided
+  // node in `tree` and the cumulative length, type and height of the direct
+  // child nodes of `tree` are checked. The value of `shallow` is ignored if the
+  // internal `cord_btree_exhaustive_validation` diagnostics variable is true,
+  // in which case the performed validations works as if `shallow` were false.
+  // This function is intended for debugging and testing purposes only.
+  static bool IsValid(const CordRepBtree* tree, bool shallow = false);
+
+  // Diagnostics: asserts that the provided tree is valid.
+  // `AssertValid()` performs a shallow validation by default. `shallow` can be
+  // set to false in which case an exhaustive validation is performed. This
+  // function is implemented in terms of calling `IsValid()` and asserting the
+  // return value to be true. See `IsValid()` for more information.
+  // This function is intended for debugging and testing purposes only.
+  static CordRepBtree* AssertValid(CordRepBtree* tree, bool shallow = true);
+  static const CordRepBtree* AssertValid(const CordRepBtree* tree,
+                                         bool shallow = true);
+
+  // Diagnostics: dump the contents of this tree to `stream`.
+  // This function is intended for debugging and testing purposes only.
+  static void Dump(const CordRep* rep, std::ostream& stream);
+  static void Dump(const CordRep* rep, absl::string_view label,
+                   std::ostream& stream);
+  static void Dump(const CordRep* rep, absl::string_view label,
+                   bool include_contents, std::ostream& stream);
+
+  // Adds the edge `edge` to this node if possible. `owned` indicates if the
+  // current node is potentially shared or not with other threads. Returns:
+  // - {kSelf, <this>}
+  //   The edge was directly added to this node.
+  // - {kCopied, <node>}
+  //   The edge was added to a copy of this node.
+  // - {kPopped, New(edge, height())}
+  //   A new leg with the edge was created as this node has no extra capacity.
+  template <EdgeType edge_type>
+  inline OpResult AddEdge(bool owned, CordRep* edge, size_t delta);
+
+  // Replaces the front or back edge with the provided new edge. Returns:
+  // - {kSelf, <this>}
+  //   The edge was directly set in this node. The old edge is unreffed.
+  // - {kCopied, <node>}
+  //   A copy of this node was created with the new edge value.
+  // In both cases, the function adopts a reference on `edge`.
+  template <EdgeType edge_type>
+  OpResult SetEdge(bool owned, CordRep* edge, size_t delta);
+
+  // Creates a new empty node at the specified height.
+  static CordRepBtree* New(int height = 0);
+
+  // Creates a new node containing `rep`, with the height being computed
+  // automatically based on the type of `rep`.
+  static CordRepBtree* New(CordRep* rep);
+
+  // Creates a new node containing both `front` and `back` at height
+  // `front.height() + 1`. Requires `back.height() == front.height()`.
+  static CordRepBtree* New(CordRepBtree* front, CordRepBtree* back);
+
+ private:
+  CordRepBtree() = default;
+  ~CordRepBtree() = default;
+
+  // Initializes the main properties `tag`, `begin`, `end`, `height`.
+  inline void InitInstance(int height, size_t begin = 0, size_t end = 0);
+
+  // Direct property access begin / end
+  void set_begin(size_t begin) { storage[1] = static_cast<uint8_t>(begin); }
+  void set_end(size_t end) { storage[2] = static_cast<uint8_t>(end); }
+
+  // Decreases the value of `begin` by `n`, and returns the new value. Notice
+  // how this returns the new value unlike atomic::fetch_add which returns the
+  // old value. This is because this is used to prepend edges at 'begin - 1'.
+  size_t sub_fetch_begin(size_t n) {
+    storage[1] -= static_cast<uint8_t>(n);
+    return storage[1];
+  }
+
+  // Increases the value of `end` by `n`, and returns the previous value. This
+  // function is typically used to append edges at 'end'.
+  size_t fetch_add_end(size_t n) {
+    const uint8_t current = storage[2];
+    storage[2] = static_cast<uint8_t>(current + n);
+    return current;
+  }
+
+  // Returns the index of the last edge starting on, or before `offset`, with
+  // `n` containing the relative offset of `offset` inside that edge.
+  // Requires `offset` < length.
+  Position IndexOf(size_t offset) const;
+
+  // Returns the index of the last edge starting before `offset`, with `n`
+  // containing the relative offset of `offset` inside that edge.
+  // This function is useful to find the edges for some span of bytes ending at
+  // `offset` (i.e., `n` bytes). For example:
+  //
+  //   Position pos = IndexBefore(n)
+  //   edges = Edges(begin(), pos.index)     // All full edges (may be empty)
+  //   last = Sub(Edge(pos.index), 0, pos.n) // Last partial edge (may be empty)
+  //
+  // Requires 0 < `offset` <= length.
+  Position IndexBefore(size_t offset) const;
+
+  // Identical to the above function except starting from the position `front`.
+  // This function is equivalent to `IndexBefore(front.n + offset)`, with
+  // the difference that this function is optimized to start at `front.index`.
+  Position IndexBefore(Position front, size_t offset) const;
+
+  // Returns the index of the edge directly beyond the edge containing offset
+  // `offset`, with `n` containing the distance of that edge from `offset`.
+  // This function is useful for iteratively finding suffix nodes and remaining
+  // partial bytes in left-most suffix nodes as for example in CopySuffix.
+  // Requires `offset` < length.
+  Position IndexBeyond(size_t offset) const;
+
+  // Destruction
+  static void DestroyLeaf(CordRepBtree* tree, size_t begin, size_t end);
+  static void DestroyNonLeaf(CordRepBtree* tree, size_t begin, size_t end);
+  static void DestroyTree(CordRepBtree* tree, size_t begin, size_t end);
+  static void Delete(CordRepBtree* tree) { delete tree; }
+
+  // Creates a new leaf node containing as much data as possible from `data`.
+  // The data is added either forwards or reversed depending on `edge_type`.
+  // Callers must check the length of the returned node to determine if all data
+  // was copied or not.
+  // See the `Append/Prepend` function for the meaning and purpose of `extra`.
+  template <EdgeType edge_type>
+  static CordRepBtree* NewLeaf(absl::string_view data, size_t extra);
+
+  // Creates a raw copy of this Btree node, copying all properties, but
+  // without adding any references to existing edges.
+  CordRepBtree* CopyRaw() const;
+
+  // Creates a full copy of this Btree node, adding a reference on all edges.
+  CordRepBtree* Copy() const;
+
+  // Creates a partial copy of this Btree node, copying all edges up to `end`,
+  // adding a reference on each copied edge, and sets the length of the newly
+  // created copy to `new_length`.
+  CordRepBtree* CopyBeginTo(size_t end, size_t new_length) const;
+
+  // Creates a partial copy of this Btree node, copying all edges starting at
+  // `begin`, adding a reference on each copied edge, and sets the length of
+  // the newly created copy to `new_length`.
+  CordRepBtree* CopyToEndFrom(size_t begin, size_t new_length) const;
+
+  // Returns a tree containing the result of appending `right` to `left`.
+  static CordRepBtree* MergeTrees(CordRepBtree* left, CordRepBtree* right);
+
+  // Fallback functions for `Create()`, `Append()` and `Prepend()` which
+  // deal with legacy / non conforming input, i.e.: CONCAT trees.
+  static CordRepBtree* CreateSlow(CordRep* rep);
+  static CordRepBtree* AppendSlow(CordRepBtree*, CordRep* rep);
+  static CordRepBtree* PrependSlow(CordRepBtree*, CordRep* rep);
+
+  // Aligns existing edges to start at index 0, to allow for a new edge to be
+  // added to the back of the current edges.
+  inline void AlignBegin();
+
+  // Aligns existing edges to end at `capacity`, to allow for a new edge to be
+  // added in front of the current edges.
+  inline void AlignEnd();
+
+  // Adds the provided edge to this node.
+  // Requires this node to have capacity for the edge. Realigns / moves
+  // existing edges as needed to prepend or append the new edge.
+  template <EdgeType edge_type>
+  inline void Add(CordRep* rep);
+
+  // Adds the provided edges to this node.
+  // Requires this node to have capacity for the edges. Realigns / moves
+  // existing edges as needed to prepend or append the new edges.
+  template <EdgeType edge_type>
+  inline void Add(absl::Span<CordRep* const>);
+
+  // Adds data from `data` to this node until either all data has been consumed,
+  // or there is no more capacity for additional flat nodes inside this node.
+  // Requires the current node to be a leaf node, data to be non empty, and the
+  // current node to have capacity for at least one more data edge.
+  // Returns any remaining data from `data` that was not added, which is
+  // depending on the edge type (front / back) either the remaining prefix of
+  // suffix of the input.
+  // See the `Append/Prepend` function for the meaning and purpose of `extra`.
+  template <EdgeType edge_type>
+  absl::string_view AddData(absl::string_view data, size_t extra);
+
+  // Replace the front or back edge with the provided value.
+  // Adopts a reference on `edge` and unrefs the old edge.
+  template <EdgeType edge_type>
+  inline void SetEdge(CordRep* edge);
+
+  // Returns a partial copy of the current tree containing the first `n` bytes
+  // of data. `CopyResult` contains both the resulting edge and its height. The
+  // resulting tree may be less high than the current tree, or even be a single
+  // matching data edge. For example, if `n == 1`, then the result will be the
+  // single data edge, and height will be set to -1 (one below the owning leaf
+  // node). If n == 0, this function returns null.
+  // Requires `n <= length`
+  CopyResult CopyPrefix(size_t n);
+
+  // Returns a partial copy of the current tree containing all data starting
+  // after `offset`. `CopyResult` contains both the resulting edge and its
+  // height. The resulting tree may be less high than the current tree, or even
+  // be a single matching data edge. For example, if `n == length - 1`, then the
+  // result will be a single data edge, and height will be set to -1 (one below
+  // the owning leaf node).
+  // Requires `offset < length`
+  CopyResult CopySuffix(size_t offset);
+
+  // Returns a OpResult value of {this, kSelf} or {Copy(), kCopied}
+  // depending on the value of `owned`.
+  inline OpResult ToOpResult(bool owned);
+
+  // Adds `rep` to the specified tree, returning the modified tree.
+  template <EdgeType edge_type>
+  static CordRepBtree* AddCordRep(CordRepBtree* tree, CordRep* rep);
+
+  // Adds `data` to the specified tree, returning the modified tree.
+  // See the `Append/Prepend` function for the meaning and purpose of `extra`.
+  template <EdgeType edge_type>
+  static CordRepBtree* AddData(CordRepBtree* tree, absl::string_view data,
+                               size_t extra = 0);
+
+  // Merges `src` into `dst` with `src` being added either before (kFront) or
+  // after (kBack) `dst`. Requires the height of `dst` to be greater than or
+  // equal to the height of `src`.
+  template <EdgeType edge_type>
+  static CordRepBtree* Merge(CordRepBtree* dst, CordRepBtree* src);
+
+  // Fallback version of GetAppendBuffer for large trees: GetAppendBuffer()
+  // implements an inlined version for trees of limited height (3 levels),
+  // GetAppendBufferSlow implements the logic for large trees.
+  Span<char> GetAppendBufferSlow(size_t size);
+
+  // `edges_` contains all edges starting from this instance.
+  // These are explicitly `child` edges only, a cord btree (or any cord tree in
+  // that respect) does not store `parent` pointers anywhere: multiple trees /
+  // parents can reference the same shared child edge. The type of these edges
+  // depends on the height of the node. `Leaf nodes` (height == 0) contain `data
+  // edges` (external or flat nodes, or sub-strings thereof). All other nodes
+  // (height > 0) contain pointers to BTREE nodes with a height of `height - 1`.
+  CordRep* edges_[kMaxCapacity];
+
+  friend class CordRepBtreeTestPeer;
+  friend class CordRepBtreeNavigator;
+};
+
+inline CordRepBtree* CordRep::btree() {
+  assert(IsBtree());
+  return static_cast<CordRepBtree*>(this);
+}
+
+inline const CordRepBtree* CordRep::btree() const {
+  assert(IsBtree());
+  return static_cast<const CordRepBtree*>(this);
+}
+
+inline void CordRepBtree::InitInstance(int height, size_t begin, size_t end) {
+  tag = BTREE;
+  storage[0] = static_cast<uint8_t>(height);
+  storage[1] = static_cast<uint8_t>(begin);
+  storage[2] = static_cast<uint8_t>(end);
+}
+
+inline CordRep* CordRepBtree::Edge(size_t index) const {
+  assert(index >= begin());
+  assert(index < end());
+  return edges_[index];
+}
+
+inline CordRep* CordRepBtree::Edge(EdgeType edge_type) const {
+  return edges_[edge_type == kFront ? begin() : back()];
+}
+
+inline absl::Span<CordRep* const> CordRepBtree::Edges() const {
+  return {edges_ + begin(), size()};
+}
+
+inline absl::Span<CordRep* const> CordRepBtree::Edges(size_t begin,
+                                                      size_t end) const {
+  assert(begin <= end);
+  assert(begin >= this->begin());
+  assert(end <= this->end());
+  return {edges_ + begin, static_cast<size_t>(end - begin)};
+}
+
+inline const char* CordRepBtree::EdgeDataPtr(const CordRep* r) {
+  assert(IsDataEdge(r));
+  size_t offset = 0;
+  if (r->tag == SUBSTRING) {
+    offset = r->substring()->start;
+    r = r->substring()->child;
+  }
+  return (r->tag >= FLAT ? r->flat()->Data() : r->external()->base) + offset;
+}
+
+inline absl::string_view CordRepBtree::EdgeData(const CordRep* r) {
+  return absl::string_view(EdgeDataPtr(r), r->length);
+}
+
+inline absl::string_view CordRepBtree::Data(size_t index) const {
+  assert(height() == 0);
+  return EdgeData(Edge(index));
+}
+
+inline bool CordRepBtree::IsDataEdge(const CordRep* rep) {
+  // The fast path is that `rep` is an EXTERNAL or FLAT node, making the below
+  // if a single, well predicted branch. We then repeat the FLAT or EXTERNAL
+  // check in the slow path the SUBSTRING check to optimize for the hot path.
+  if (rep->tag == EXTERNAL || rep->tag >= FLAT) return true;
+  if (rep->tag == SUBSTRING) rep = rep->substring()->child;
+  return rep->tag == EXTERNAL || rep->tag >= FLAT;
+}
+
+inline CordRepBtree* CordRepBtree::New(int height) {
+  CordRepBtree* tree = new CordRepBtree;
+  tree->length = 0;
+  tree->InitInstance(height);
+  return tree;
+}
+
+inline CordRepBtree* CordRepBtree::New(CordRep* rep) {
+  CordRepBtree* tree = new CordRepBtree;
+  int height = rep->IsBtree() ? rep->btree()->height() + 1 : 0;
+  tree->length = rep->length;
+  tree->InitInstance(height, /*begin=*/0, /*end=*/1);
+  tree->edges_[0] = rep;
+  return tree;
+}
+
+inline CordRepBtree* CordRepBtree::New(CordRepBtree* front,
+                                       CordRepBtree* back) {
+  assert(front->height() == back->height());
+  CordRepBtree* tree = new CordRepBtree;
+  tree->length = front->length + back->length;
+  tree->InitInstance(front->height() + 1, /*begin=*/0, /*end=*/2);
+  tree->edges_[0] = front;
+  tree->edges_[1] = back;
+  return tree;
+}
+
+inline void CordRepBtree::DestroyTree(CordRepBtree* tree, size_t begin,
+                                      size_t end) {
+  if (tree->height() == 0) {
+    DestroyLeaf(tree, begin, end);
+  } else {
+    DestroyNonLeaf(tree, begin, end);
+  }
+}
+
+inline void CordRepBtree::Destroy(CordRepBtree* tree) {
+  DestroyTree(tree, tree->begin(), tree->end());
+}
+
+inline CordRepBtree* CordRepBtree::CopyRaw() const {
+  auto* tree = static_cast<CordRepBtree*>(::operator new(sizeof(CordRepBtree)));
+  memcpy(static_cast<void*>(tree), this, sizeof(CordRepBtree));
+  new (&tree->refcount) RefcountAndFlags;
+  return tree;
+}
+
+inline CordRepBtree* CordRepBtree::Copy() const {
+  CordRepBtree* tree = CopyRaw();
+  for (CordRep* rep : Edges()) CordRep::Ref(rep);
+  return tree;
+}
+
+inline CordRepBtree* CordRepBtree::CopyToEndFrom(size_t begin,
+                                                 size_t new_length) const {
+  assert(begin >= this->begin());
+  assert(begin <= this->end());
+  CordRepBtree* tree = CopyRaw();
+  tree->length = new_length;
+  tree->set_begin(begin);
+  for (CordRep* edge : tree->Edges()) CordRep::Ref(edge);
+  return tree;
+}
+
+inline CordRepBtree* CordRepBtree::CopyBeginTo(size_t end,
+                                               size_t new_length) const {
+  assert(end <= capacity());
+  assert(end >= this->begin());
+  CordRepBtree* tree = CopyRaw();
+  tree->length = new_length;
+  tree->set_end(end);
+  for (CordRep* edge : tree->Edges()) CordRep::Ref(edge);
+  return tree;
+}
+
+inline void CordRepBtree::AlignBegin() {
+  // The below code itself does not need to be fast as typically we have
+  // mono-directional append/prepend calls, and `begin` / `end` are typically
+  // adjusted no more than once. But we want to avoid potential register clobber
+  // effects, making the compiler emit register save/store/spills, and minimize
+  // the size of code.
+  const size_t delta = begin();
+  if (ABSL_PREDICT_FALSE(delta != 0)) {
+    const size_t new_end = end() - delta;
+    set_begin(0);
+    set_end(new_end);
+    // TODO(mvels): we can write this using 2 loads / 2 stores depending on
+    // total size for the kMaxCapacity = 6 case. I.e., we can branch (switch) on
+    // size, and then do overlapping load/store of up to 4 pointers (inlined as
+    // XMM, YMM or ZMM load/store) and up to 2 pointers (XMM / YMM), which is a)
+    // compact and b) not clobbering any registers.
+    ABSL_INTERNAL_ASSUME(new_end <= kMaxCapacity);
+#ifdef __clang__
+#pragma unroll 1
+#endif
+    for (size_t i = 0; i < new_end; ++i) {
+      edges_[i] = edges_[i + delta];
+    }
+  }
+}
+
+inline void CordRepBtree::AlignEnd() {
+  // See comments in `AlignBegin` for motivation on the hand-rolled for loops.
+  const size_t delta = capacity() - end();
+  if (delta != 0) {
+    const size_t new_begin = begin() + delta;
+    const size_t new_end = end() + delta;
+    set_begin(new_begin);
+    set_end(new_end);
+    ABSL_INTERNAL_ASSUME(new_end <= kMaxCapacity);
+#ifdef __clang__
+#pragma unroll 1
+#endif
+    for (size_t i = new_end - 1; i >= new_begin; --i) {
+      edges_[i] = edges_[i - delta];
+    }
+  }
+}
+
+template <>
+inline void CordRepBtree::Add<CordRepBtree::kBack>(CordRep* rep) {
+  AlignBegin();
+  edges_[fetch_add_end(1)] = rep;
+}
+
+template <>
+inline void CordRepBtree::Add<CordRepBtree::kBack>(
+    absl::Span<CordRep* const> edges) {
+  AlignBegin();
+  size_t new_end = end();
+  for (CordRep* edge : edges) edges_[new_end++] = edge;
+  set_end(new_end);
+}
+
+template <>
+inline void CordRepBtree::Add<CordRepBtree::kFront>(CordRep* rep) {
+  AlignEnd();
+  edges_[sub_fetch_begin(1)] = rep;
+}
+
+template <>
+inline void CordRepBtree::Add<CordRepBtree::kFront>(
+    absl::Span<CordRep* const> edges) {
+  AlignEnd();
+  size_t new_begin = begin() - edges.size();
+  set_begin(new_begin);
+  for (CordRep* edge : edges) edges_[new_begin++] = edge;
+}
+
+template <CordRepBtree::EdgeType edge_type>
+inline void CordRepBtree::SetEdge(CordRep* edge) {
+  const int idx = edge_type == kFront ? begin() : back();
+  CordRep::Unref(edges_[idx]);
+  edges_[idx] = edge;
+}
+
+inline CordRepBtree::OpResult CordRepBtree::ToOpResult(bool owned) {
+  return owned ? OpResult{this, kSelf} : OpResult{Copy(), kCopied};
+}
+
+inline CordRepBtree::Position CordRepBtree::IndexOf(size_t offset) const {
+  assert(offset < length);
+  size_t index = begin();
+  while (offset >= edges_[index]->length) offset -= edges_[index++]->length;
+  return {index, offset};
+}
+
+inline CordRepBtree::Position CordRepBtree::IndexBefore(size_t offset) const {
+  assert(offset > 0);
+  assert(offset <= length);
+  size_t index = begin();
+  while (offset > edges_[index]->length) offset -= edges_[index++]->length;
+  return {index, offset};
+}
+
+inline CordRepBtree::Position CordRepBtree::IndexBefore(Position front,
+                                                        size_t offset) const {
+  size_t index = front.index;
+  offset = offset + front.n;
+  while (offset > edges_[index]->length) offset -= edges_[index++]->length;
+  return {index, offset};
+}
+
+inline CordRepBtree::Position CordRepBtree::IndexBeyond(
+    const size_t offset) const {
+  // We need to find the edge which `starting offset` is beyond (>=)`offset`.
+  // For this we can't use the `offset -= length` logic of IndexOf. Instead, we
+  // track the offset of the `current edge` in `off`, which we increase as we
+  // iterate over the edges until we find the matching edge.
+  size_t off = 0;
+  size_t index = begin();
+  while (offset > off) off += edges_[index++]->length;
+  return {index, off - offset};
+}
+
+inline CordRepBtree* CordRepBtree::Create(CordRep* rep) {
+  if (IsDataEdge(rep)) return New(rep);
+  return CreateSlow(rep);
+}
+
+inline Span<char> CordRepBtree::GetAppendBuffer(size_t size) {
+  assert(refcount.IsOne());
+  CordRepBtree* tree = this;
+  const int height = this->height();
+  CordRepBtree* n1 = tree;
+  CordRepBtree* n2 = tree;
+  CordRepBtree* n3 = tree;
+  switch (height) {
+    case 3:
+      tree = tree->Edge(kBack)->btree();
+      if (!tree->refcount.IsOne()) return {};
+      n2 = tree;
+      ABSL_FALLTHROUGH_INTENDED;
+    case 2:
+      tree = tree->Edge(kBack)->btree();
+      if (!tree->refcount.IsOne()) return {};
+      n1 = tree;
+      ABSL_FALLTHROUGH_INTENDED;
+    case 1:
+      tree = tree->Edge(kBack)->btree();
+      if (!tree->refcount.IsOne()) return {};
+      ABSL_FALLTHROUGH_INTENDED;
+    case 0:
+      CordRep* edge = tree->Edge(kBack);
+      if (!edge->refcount.IsOne()) return {};
+      if (edge->tag < FLAT) return {};
+      size_t avail = edge->flat()->Capacity() - edge->length;
+      if (avail == 0) return {};
+      size_t delta = (std::min)(size, avail);
+      Span<char> span = {edge->flat()->Data() + edge->length, delta};
+      edge->length += delta;
+      switch (height) {
+        case 3:
+          n3->length += delta;
+          ABSL_FALLTHROUGH_INTENDED;
+        case 2:
+          n2->length += delta;
+          ABSL_FALLTHROUGH_INTENDED;
+        case 1:
+          n1->length += delta;
+          ABSL_FALLTHROUGH_INTENDED;
+        case 0:
+          tree->length += delta;
+          return span;
+      }
+      break;
+  }
+  return GetAppendBufferSlow(size);
+}
+
+extern template CordRepBtree* CordRepBtree::AddCordRep<CordRepBtree::kBack>(
+    CordRepBtree* tree, CordRep* rep);
+
+extern template CordRepBtree* CordRepBtree::AddCordRep<CordRepBtree::kFront>(
+    CordRepBtree* tree, CordRep* rep);
+
+inline CordRepBtree* CordRepBtree::Append(CordRepBtree* tree, CordRep* rep) {
+  if (ABSL_PREDICT_TRUE(IsDataEdge(rep))) {
+    return CordRepBtree::AddCordRep<kBack>(tree, rep);
+  }
+  return AppendSlow(tree, rep);
+}
+
+inline CordRepBtree* CordRepBtree::Prepend(CordRepBtree* tree, CordRep* rep) {
+  if (ABSL_PREDICT_TRUE(IsDataEdge(rep))) {
+    return CordRepBtree::AddCordRep<kFront>(tree, rep);
+  }
+  return PrependSlow(tree, rep);
+}
+
+#ifdef NDEBUG
+
+inline CordRepBtree* CordRepBtree::AssertValid(CordRepBtree* tree,
+                                               bool /* shallow */) {
+  return tree;
+}
+
+inline const CordRepBtree* CordRepBtree::AssertValid(const CordRepBtree* tree,
+                                                     bool /* shallow */) {
+  return tree;
+}
+
+#endif
+
+}  // namespace cord_internal
+ABSL_NAMESPACE_END
+}  // namespace absl
+
+#endif  // ABSL_STRINGS_INTERNAL_CORD_REP_BTREE_H_
diff --git a/third_party/abseil-cpp/absl/strings/internal/cord_rep_btree_navigator.cc b/third_party/abseil-cpp/absl/strings/internal/cord_rep_btree_navigator.cc
new file mode 100644
index 0000000..d1f9995
--- /dev/null
+++ b/third_party/abseil-cpp/absl/strings/internal/cord_rep_btree_navigator.cc
@@ -0,0 +1,185 @@
+// Copyright 2021 The Abseil Authors
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     https://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include "absl/strings/internal/cord_rep_btree_navigator.h"
+
+#include <cassert>
+
+#include "absl/strings/internal/cord_internal.h"
+#include "absl/strings/internal/cord_rep_btree.h"
+
+namespace absl {
+ABSL_NAMESPACE_BEGIN
+namespace cord_internal {
+
+using ReadResult = CordRepBtreeNavigator::ReadResult;
+
+namespace {
+
+// Returns a `CordRepSubstring` from `rep` starting at `offset` of size `n`.
+// If `rep` is already a `CordRepSubstring` instance, an adjusted instance is
+// created based on the old offset and new offset.
+// Adopts a reference on `rep`. Rep must be a valid data edge. Returns
+// nullptr if `n == 0`, `rep` if `n == rep->length`.
+// Requires `offset < rep->length` and `offset + n <= rep->length`.
+// TODO(192061034): move to utility library in internal and optimize for small
+// substrings of larger reps.
+inline CordRep* Substring(CordRep* rep, size_t offset, size_t n) {
+  assert(n <= rep->length);
+  assert(offset < rep->length);
+  assert(offset <= rep->length - n);
+  assert(CordRepBtree::IsDataEdge(rep));
+
+  if (n == 0) return nullptr;
+  if (n == rep->length) return CordRep::Ref(rep);
+
+  if (rep->tag == SUBSTRING) {
+    offset += rep->substring()->start;
+    rep = rep->substring()->child;
+  }
+
+  CordRepSubstring* substring = new CordRepSubstring();
+  substring->length = n;
+  substring->tag = SUBSTRING;
+  substring->start = offset;
+  substring->child = CordRep::Ref(rep);
+  return substring;
+}
+
+inline CordRep* Substring(CordRep* rep, size_t offset) {
+  return Substring(rep, offset, rep->length - offset);
+}
+
+}  // namespace
+
+CordRepBtreeNavigator::Position CordRepBtreeNavigator::Skip(size_t n) {
+  int height = 0;
+  size_t index = index_[0];
+  CordRepBtree* node = node_[0];
+  CordRep* edge = node->Edge(index);
+
+  // Overall logic: Find an edge of at least the length we need to skip.
+  // We consume all edges which are smaller (i.e., must be 100% skipped).
+  // If we exhausted all edges on the current level, we move one level
+  // up the tree, and repeat until we either find the edge, or until we hit
+  // the top of the tree meaning the skip exceeds tree->length.
+  while (n >= edge->length) {
+    n -= edge->length;
+    while (++index == node->end()) {
+      if (++height > height_) return {nullptr, n};
+      node = node_[height];
+      index = index_[height];
+    }
+    edge = node->Edge(index);
+  }
+
+  // If we moved up the tree, descend down to the leaf level, consuming all
+  // edges that must be skipped.
+  while (height > 0) {
+    node = edge->btree();
+    index_[height] = index;
+    node_[--height] = node;
+    index = node->begin();
+    edge = node->Edge(index);
+    while (n >= edge->length) {
+      n -= edge->length;
+      ++index;
+      assert(index != node->end());
+      edge = node->Edge(index);
+    }
+  }
+  index_[0] = index;
+  return {edge, n};
+}
+
+ReadResult CordRepBtreeNavigator::Read(size_t edge_offset, size_t n) {
+  int height = 0;
+  size_t length = edge_offset + n;
+  size_t index = index_[0];
+  CordRepBtree* node = node_[0];
+  CordRep* edge = node->Edge(index);
+  assert(edge_offset < edge->length);
+
+  if (length < edge->length) {
+    return {Substring(edge, edge_offset, n), length};
+  }
+
+  // Similar to 'Skip', we consume all edges that are inside the 'length' of
+  // data that needs to be read. If we exhaust the current level, we move one
+  // level up the tree and repeat until we hit the final edge that must be
+  // (partially) read. We consume all edges into `subtree`.
+  CordRepBtree* subtree = CordRepBtree::New(Substring(edge, edge_offset));
+  size_t subtree_end = 1;
+  do {
+    length -= edge->length;
+    while (++index == node->end()) {
+      index_[height] = index;
+      if (++height > height_) {
+        subtree->set_end(subtree_end);
+        if (length == 0) return {subtree, 0};
+        CordRep::Unref(subtree);
+        return {nullptr, length};
+      }
+      if (length != 0) {
+        subtree->set_end(subtree_end);
+        subtree = CordRepBtree::New(subtree);
+        subtree_end = 1;
+      }
+      node = node_[height];
+      index = index_[height];
+    }
+    edge = node->Edge(index);
+    if (length >= edge->length) {
+      subtree->length += edge->length;
+      subtree->edges_[subtree_end++] = CordRep::Ref(edge);
+    }
+  } while (length >= edge->length);
+  CordRepBtree* tree = subtree;
+  subtree->length += length;
+
+  // If we moved up the tree, descend down to the leaf level, consuming all
+  // edges that must be read, adding 'down' nodes to `subtree`.
+  while (height > 0) {
+    node = edge->btree();
+    index_[height] = index;
+    node_[--height] = node;
+    index = node->begin();
+    edge = node->Edge(index);
+
+    if (length != 0) {
+      CordRepBtree* right = CordRepBtree::New(height);
+      right->length = length;
+      subtree->edges_[subtree_end++] = right;
+      subtree->set_end(subtree_end);
+      subtree = right;
+      subtree_end = 0;
+      while (length >= edge->length) {
+        subtree->edges_[subtree_end++] = CordRep::Ref(edge);
+        length -= edge->length;
+        edge = node->Edge(++index);
+      }
+    }
+  }
+  // Add any (partial) edge still remaining at the leaf level.
+  if (length != 0) {
+    subtree->edges_[subtree_end++] = Substring(edge, 0, length);
+  }
+  subtree->set_end(subtree_end);
+  index_[0] = index;
+  return {tree, length};
+}
+
+}  // namespace cord_internal
+ABSL_NAMESPACE_END
+}  // namespace absl
diff --git a/third_party/abseil-cpp/absl/strings/internal/cord_rep_btree_navigator.h b/third_party/abseil-cpp/absl/strings/internal/cord_rep_btree_navigator.h
new file mode 100644
index 0000000..971b92e
--- /dev/null
+++ b/third_party/abseil-cpp/absl/strings/internal/cord_rep_btree_navigator.h
@@ -0,0 +1,265 @@
+// Copyright 2021 The Abseil Authors
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     https://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#ifndef ABSL_STRINGS_INTERNAL_CORD_REP_BTREE_NAVIGATOR_H_
+#define ABSL_STRINGS_INTERNAL_CORD_REP_BTREE_NAVIGATOR_H_
+
+#include <cassert>
+#include <iostream>
+
+#include "absl/strings/internal/cord_internal.h"
+#include "absl/strings/internal/cord_rep_btree.h"
+
+namespace absl {
+ABSL_NAMESPACE_BEGIN
+namespace cord_internal {
+
+// CordRepBtreeNavigator is a bi-directional navigator allowing callers to
+// navigate all the (leaf) data edges in a CordRepBtree instance.
+//
+// A CordRepBtreeNavigator instance is by default empty. Callers initialize a
+// navigator instance by calling one of `InitFirst()`, `InitLast()` or
+// `InitOffset()`, which establishes a current position. Callers can then
+// navigate using the `Next`, `Previous`, `Skip` and `Seek` methods.
+//
+// The navigator instance does not take or adopt a reference on the provided
+// `tree` on any of the initialization calls. Callers are responsible for
+// guaranteeing the lifecycle of the provided tree. A navigator instance can
+// be reset to the empty state by calling `Reset`.
+//
+// A navigator only keeps positional state on the 'current data edge', it does
+// explicitly not keep any 'offset' state. The class does accept and return
+// offsets in the `Read()`, `Skip()` and 'Seek()` methods as these would
+// otherwise put a big burden on callers. Callers are expected to maintain
+// (returned) offset info if they require such granular state.
+class CordRepBtreeNavigator {
+ public:
+  // The logical position as returned by the Seek() and Skip() functions.
+  // Returns the current leaf edge for the desired seek or skip position and
+  // the offset of that position inside that edge.
+  struct Position {
+    CordRep* edge;
+    size_t offset;
+  };
+
+  // The read result as returned by the Read() function.
+  // `tree` contains the resulting tree which is identical to the result
+  // of calling CordRepBtree::SubTree(...) on the tree being navigated.
+  // `n` contains the number of bytes used from the last navigated to
+  // edge of the tree.
+  struct ReadResult {
+    CordRep* tree;
+    size_t n;
+  };
+
+  // Returns true if this instance is not empty.
+  explicit operator bool() const;
+
+  // Returns the tree for this instance or nullptr if empty.
+  CordRepBtree* btree() const;
+
+  // Returns the data edge of the current position.
+  // Requires this instance to not be empty.
+  CordRep* Current() const;
+
+  // Resets this navigator to `tree`, returning the first data edge in the tree.
+  CordRep* InitFirst(CordRepBtree* tree);
+
+  // Resets this navigator to `tree`, returning the last data edge in the tree.
+  CordRep* InitLast(CordRepBtree* tree);
+
+  // Resets this navigator to `tree` returning the data edge at position
+  // `offset` and the relative offset of `offset` into that data edge.
+  // Returns `Position.edge = nullptr` if the provided offset is greater
+  // than or equal to the length of the tree, in which case the state of
+  // the navigator instance remains unchanged.
+  Position InitOffset(CordRepBtree* tree, size_t offset);
+
+  // Navigates to the next data edge.
+  // Returns the next data edge or nullptr if there is no next data edge, in
+  // which case the current position remains unchanged.
+  CordRep* Next();
+
+  // Navigates to the previous data edge.
+  // Returns the previous data edge or nullptr if there is no previous data
+  // edge, in which case the current position remains unchanged.
+  CordRep* Previous();
+
+  // Navigates to the data edge at position `offset`. Returns the navigated to
+  // data edge in `Position.edge` and the relative offset of `offset` into that
+  // data edge in `Position.offset`. Returns `Position.edge = nullptr` if the
+  // provide offset is greater than or equal to the tree's length.
+  Position Seek(size_t offset);
+
+  // Reads `n` bytes of data starting at offset `edge_offset` of the current
+  // data edge, and returns the result in `ReadResult.tree`. `ReadResult.n`
+  // contains the 'bytes used` from the last / current data edge in the tree.
+  // This allows users that mix regular navigation (using string views) and
+  // 'read into cord' navigation to keep track of the current state, and which
+  // bytes have been consumed from a navigator.
+  // This function returns `ReadResult.tree = nullptr` if the requested length
+  // exceeds the length of the tree starting at the current data edge.
+  ReadResult Read(size_t edge_offset, size_t n);
+
+  // Skips `n` bytes forward from the current data edge, returning the navigated
+  // to data edge in `Position.edge` and `Position.offset` containing the offset
+  // inside that data edge. Note that the state of the navigator is left
+  // unchanged if `n` is smaller than the length of the current data edge.
+  Position Skip(size_t n);
+
+  // Resets this instance to the default / empty state.
+  void Reset();
+
+ private:
+  // Slow path for Next() if Next() reached the end of a leaf node. Backtracks
+  // up the stack until it finds a node that has a 'next' position available,
+  // and then does a 'front dive' towards the next leaf node.
+  CordRep* NextUp();
+
+  // Slow path for Previous() if Previous() reached the beginning of a leaf
+  // node. Backtracks up the stack until it finds a node that has a 'previous'
+  // position available, and then does a 'back dive' towards the previous leaf
+  // node.
+  CordRep* PreviousUp();
+
+  // Generic implementation of InitFirst() and InitLast().
+  template <CordRepBtree::EdgeType edge_type>
+  CordRep* Init(CordRepBtree* tree);
+
+  // `height_` contains the height of the current tree, or -1 if empty.
+  int height_ = -1;
+
+  // `index_` and `node_` contain the navigation state as the 'path' to the
+  // current data edge which is at `node_[0]->Edge(index_[0])`. The contents
+  // of these are undefined until the instance is initialized (`height_ >= 0`).
+  uint8_t index_[CordRepBtree::kMaxHeight];
+  CordRepBtree* node_[CordRepBtree::kMaxHeight];
+};
+
+// Returns true if this instance is not empty.
+inline CordRepBtreeNavigator::operator bool() const { return height_ >= 0; }
+
+inline CordRepBtree* CordRepBtreeNavigator::btree() const {
+  return height_ >= 0 ? node_[height_] : nullptr;
+}
+
+inline CordRep* CordRepBtreeNavigator::Current() const {
+  assert(height_ >= 0);
+  return node_[0]->Edge(index_[0]);
+}
+
+inline void CordRepBtreeNavigator::Reset() { height_ = -1; }
+
+inline CordRep* CordRepBtreeNavigator::InitFirst(CordRepBtree* tree) {
+  return Init<CordRepBtree::kFront>(tree);
+}
+
+inline CordRep* CordRepBtreeNavigator::InitLast(CordRepBtree* tree) {
+  return Init<CordRepBtree::kBack>(tree);
+}
+
+template <CordRepBtree::EdgeType edge_type>
+inline CordRep* CordRepBtreeNavigator::Init(CordRepBtree* tree) {
+  assert(tree != nullptr);
+  assert(tree->size() > 0);
+  int height = height_ = tree->height();
+  size_t index = tree->index(edge_type);
+  node_[height] = tree;
+  index_[height] = static_cast<uint8_t>(index);
+  while (--height >= 0) {
+    tree = tree->Edge(index)->btree();
+    node_[height] = tree;
+    index = tree->index(edge_type);
+    index_[height] = static_cast<uint8_t>(index);
+  }
+  return node_[0]->Edge(index);
+}
+
+inline CordRepBtreeNavigator::Position CordRepBtreeNavigator::Seek(
+    size_t offset) {
+  assert(btree() != nullptr);
+  int height = height_;
+  CordRepBtree* edge = node_[height];
+  if (ABSL_PREDICT_FALSE(offset >= edge->length)) return {nullptr, 0};
+  CordRepBtree::Position index = edge->IndexOf(offset);
+  index_[height] = static_cast<uint8_t>(index.index);
+  while (--height >= 0) {
+    edge = edge->Edge(index.index)->btree();
+    node_[height] = edge;
+    index = edge->IndexOf(index.n);
+    index_[height] = static_cast<uint8_t>(index.index);
+  }
+  return {edge->Edge(index.index), index.n};
+}
+
+inline CordRepBtreeNavigator::Position CordRepBtreeNavigator::InitOffset(
+    CordRepBtree* tree, size_t offset) {
+  assert(tree != nullptr);
+  if (ABSL_PREDICT_FALSE(offset >= tree->length)) return {nullptr, 0};
+  height_ = tree->height();
+  node_[height_] = tree;
+  return Seek(offset);
+}
+
+inline CordRep* CordRepBtreeNavigator::Next() {
+  CordRepBtree* edge = node_[0];
+  return index_[0] == edge->back() ? NextUp() : edge->Edge(++index_[0]);
+}
+
+inline CordRep* CordRepBtreeNavigator::Previous() {
+  CordRepBtree* edge = node_[0];
+  return index_[0] == edge->begin() ? PreviousUp() : edge->Edge(--index_[0]);
+}
+
+inline CordRep* CordRepBtreeNavigator::NextUp() {
+  assert(index_[0] == node_[0]->back());
+  CordRepBtree* edge;
+  size_t index;
+  int height = 0;
+  do {
+    if (++height > height_) return nullptr;
+    edge = node_[height];
+    index = index_[height] + 1;
+  } while (index == edge->end());
+  index_[height] = static_cast<uint8_t>(index);
+  do {
+    node_[--height] = edge = edge->Edge(index)->btree();
+    index_[height] = static_cast<uint8_t>(index = edge->begin());
+  } while (height > 0);
+  return edge->Edge(index);
+}
+
+inline CordRep* CordRepBtreeNavigator::PreviousUp() {
+  assert(index_[0] == node_[0]->begin());
+  CordRepBtree* edge;
+  size_t index;
+  int height = 0;
+  do {
+    if (++height > height_) return nullptr;
+    edge = node_[height];
+    index = index_[height];
+  } while (index == edge->begin());
+  index_[height] = static_cast<uint8_t>(--index);
+  do {
+    node_[--height] = edge = edge->Edge(index)->btree();
+    index_[height] = static_cast<uint8_t>(index = edge->back());
+  } while (height > 0);
+  return edge->Edge(index);
+}
+
+}  // namespace cord_internal
+ABSL_NAMESPACE_END
+}  // namespace absl
+
+#endif  // ABSL_STRINGS_INTERNAL_CORD_REP_BTREE_NAVIGATOR_H_
diff --git a/third_party/abseil-cpp/absl/strings/internal/cord_rep_btree_navigator_test.cc b/third_party/abseil-cpp/absl/strings/internal/cord_rep_btree_navigator_test.cc
new file mode 100644
index 0000000..ce09b19
--- /dev/null
+++ b/third_party/abseil-cpp/absl/strings/internal/cord_rep_btree_navigator_test.cc
@@ -0,0 +1,325 @@
+// Copyright 2021 The Abseil Authors
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     https://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include "absl/strings/internal/cord_rep_btree_navigator.h"
+
+#include <string>
+#include <vector>
+
+#include "gmock/gmock.h"
+#include "gtest/gtest.h"
+#include "absl/base/config.h"
+#include "absl/base/internal/raw_logging.h"
+#include "absl/strings/internal/cord_internal.h"
+#include "absl/strings/internal/cord_rep_btree.h"
+#include "absl/strings/internal/cord_rep_test_util.h"
+#include "absl/strings/str_cat.h"
+#include "absl/strings/string_view.h"
+
+namespace absl {
+ABSL_NAMESPACE_BEGIN
+namespace cord_internal {
+namespace {
+
+using ::testing::Eq;
+using ::testing::Ne;
+
+using ::absl::cordrep_testing::CordRepBtreeFromFlats;
+using ::absl::cordrep_testing::CordToString;
+using ::absl::cordrep_testing::CreateFlatsFromString;
+using ::absl::cordrep_testing::CreateRandomString;
+using ::absl::cordrep_testing::MakeFlat;
+using ::absl::cordrep_testing::MakeSubstring;
+
+using ReadResult = CordRepBtreeNavigator::ReadResult;
+using Position = CordRepBtreeNavigator::Position;
+
+// CordRepBtreeNavigatorTest is a test fixture which automatically creates a
+// tree to test navigation logic on. The parameter `count' defines the number of
+// data edges in the test tree.
+class CordRepBtreeNavigatorTest : public testing::TestWithParam<int> {
+ public:
+  using Flats = std::vector<CordRep*>;
+  static constexpr size_t kCharsPerFlat = 3;
+
+  CordRepBtreeNavigatorTest() {
+    data_ = CreateRandomString(count() * kCharsPerFlat);
+    flats_ = CreateFlatsFromString(data_, kCharsPerFlat);
+
+    // Turn flat 0 or 1 into a substring to cover partial reads on substrings.
+    if (count() > 1) {
+      CordRep::Unref(flats_[1]);
+      flats_[1] = MakeSubstring(kCharsPerFlat, kCharsPerFlat, MakeFlat(data_));
+    } else {
+      CordRep::Unref(flats_[0]);
+      flats_[0] = MakeSubstring(0, kCharsPerFlat, MakeFlat(data_));
+    }
+
+    tree_ = CordRepBtreeFromFlats(flats_);
+  }
+
+  ~CordRepBtreeNavigatorTest() override { CordRep::Unref(tree_); }
+
+  int count() const { return GetParam(); }
+  CordRepBtree* tree() { return tree_; }
+  const std::string& data() const { return data_; }
+  const std::vector<CordRep*>& flats() const { return flats_; }
+
+  static std::string ToString(testing::TestParamInfo<int> param) {
+    return absl::StrCat(param.param, "_Flats");
+  }
+
+ private:
+  std::string data_;
+  Flats flats_;
+  CordRepBtree* tree_;
+};
+
+INSTANTIATE_TEST_SUITE_P(
+    WithParam, CordRepBtreeNavigatorTest,
+    testing::Values(1, CordRepBtree::kMaxCapacity - 1,
+                    CordRepBtree::kMaxCapacity,
+                    CordRepBtree::kMaxCapacity* CordRepBtree::kMaxCapacity - 1,
+                    CordRepBtree::kMaxCapacity* CordRepBtree::kMaxCapacity,
+                    CordRepBtree::kMaxCapacity* CordRepBtree::kMaxCapacity + 1,
+                    CordRepBtree::kMaxCapacity* CordRepBtree::kMaxCapacity * 2 +
+                        17),
+    CordRepBtreeNavigatorTest::ToString);
+
+TEST(CordRepBtreeNavigatorTest, Uninitialized) {
+  CordRepBtreeNavigator nav;
+  EXPECT_FALSE(nav);
+  EXPECT_THAT(nav.btree(), Eq(nullptr));
+#if defined(GTEST_HAS_DEATH_TEST) && !defined(NDEBUG)
+  EXPECT_DEATH(nav.Current(), ".*");
+#endif
+}
+
+TEST_P(CordRepBtreeNavigatorTest, InitFirst) {
+  CordRepBtreeNavigator nav;
+  CordRep* edge = nav.InitFirst(tree());
+  EXPECT_TRUE(nav);
+  EXPECT_THAT(nav.btree(), Eq(tree()));
+  EXPECT_THAT(nav.Current(), Eq(flats().front()));
+  EXPECT_THAT(edge, Eq(flats().front()));
+}
+
+TEST_P(CordRepBtreeNavigatorTest, InitLast) {
+  CordRepBtreeNavigator nav;
+  CordRep* edge = nav.InitLast(tree());
+  EXPECT_TRUE(nav);
+  EXPECT_THAT(nav.btree(), Eq(tree()));
+  EXPECT_THAT(nav.Current(), Eq(flats().back()));
+  EXPECT_THAT(edge, Eq(flats().back()));
+}
+
+TEST_P(CordRepBtreeNavigatorTest, NextPrev) {
+  CordRepBtreeNavigator nav;
+  nav.InitFirst(tree());
+  const Flats& flats = this->flats();
+
+  EXPECT_THAT(nav.Previous(), Eq(nullptr));
+  EXPECT_THAT(nav.Current(), Eq(flats.front()));
+  for (int i = 1; i < flats.size(); ++i) {
+    ASSERT_THAT(nav.Next(), Eq(flats[i]));
+    EXPECT_THAT(nav.Current(), Eq(flats[i]));
+  }
+  EXPECT_THAT(nav.Next(), Eq(nullptr));
+  EXPECT_THAT(nav.Current(), Eq(flats.back()));
+  for (int i = static_cast<int>(flats.size()) - 2; i >= 0; --i) {
+    ASSERT_THAT(nav.Previous(), Eq(flats[i]));
+    EXPECT_THAT(nav.Current(), Eq(flats[i]));
+  }
+  EXPECT_THAT(nav.Previous(), Eq(nullptr));
+  EXPECT_THAT(nav.Current(), Eq(flats.front()));
+}
+
+TEST_P(CordRepBtreeNavigatorTest, PrevNext) {
+  CordRepBtreeNavigator nav;
+  nav.InitLast(tree());
+  const Flats& flats = this->flats();
+
+  EXPECT_THAT(nav.Next(), Eq(nullptr));
+  EXPECT_THAT(nav.Current(), Eq(flats.back()));
+  for (int i = static_cast<int>(flats.size()) - 2; i >= 0; --i) {
+    ASSERT_THAT(nav.Previous(), Eq(flats[i]));
+    EXPECT_THAT(nav.Current(), Eq(flats[i]));
+  }
+  EXPECT_THAT(nav.Previous(), Eq(nullptr));
+  EXPECT_THAT(nav.Current(), Eq(flats.front()));
+  for (int i = 1; i < flats.size(); ++i) {
+    ASSERT_THAT(nav.Next(), Eq(flats[i]));
+    EXPECT_THAT(nav.Current(), Eq(flats[i]));
+  }
+  EXPECT_THAT(nav.Next(), Eq(nullptr));
+  EXPECT_THAT(nav.Current(), Eq(flats.back()));
+}
+
+TEST(CordRepBtreeNavigatorTest, Reset) {
+  CordRepBtree* tree = CordRepBtree::Create(MakeFlat("abc"));
+  CordRepBtreeNavigator nav;
+  nav.InitFirst(tree);
+  nav.Reset();
+  EXPECT_FALSE(nav);
+  EXPECT_THAT(nav.btree(), Eq(nullptr));
+#if defined(GTEST_HAS_DEATH_TEST) && !defined(NDEBUG)
+  EXPECT_DEATH(nav.Current(), ".*");
+#endif
+  CordRep::Unref(tree);
+}
+
+TEST_P(CordRepBtreeNavigatorTest, Skip) {
+  int count = this->count();
+  const Flats& flats = this->flats();
+  CordRepBtreeNavigator nav;
+  nav.InitFirst(tree());
+
+  for (int char_offset = 0; char_offset < kCharsPerFlat; ++char_offset) {
+    Position pos = nav.Skip(char_offset);
+    EXPECT_THAT(pos.edge, Eq(nav.Current()));
+    EXPECT_THAT(pos.edge, Eq(flats[0]));
+    EXPECT_THAT(pos.offset, Eq(char_offset));
+  }
+
+  for (int index1 = 0; index1 < count; ++index1) {
+    for (int index2 = index1; index2 < count; ++index2) {
+      for (int char_offset = 0; char_offset < kCharsPerFlat; ++char_offset) {
+        CordRepBtreeNavigator nav;
+        nav.InitFirst(tree());
+
+        size_t length1 = index1 * kCharsPerFlat;
+        Position pos1 = nav.Skip(length1 + char_offset);
+        ASSERT_THAT(pos1.edge, Eq(flats[index1]));
+        ASSERT_THAT(pos1.edge, Eq(nav.Current()));
+        ASSERT_THAT(pos1.offset, Eq(char_offset));
+
+        size_t length2 = index2 * kCharsPerFlat;
+        Position pos2 = nav.Skip(length2 - length1 + char_offset);
+        ASSERT_THAT(pos2.edge, Eq(flats[index2]));
+        ASSERT_THAT(pos2.edge, Eq(nav.Current()));
+        ASSERT_THAT(pos2.offset, Eq(char_offset));
+      }
+    }
+  }
+}
+
+TEST_P(CordRepBtreeNavigatorTest, Seek) {
+  int count = this->count();
+  const Flats& flats = this->flats();
+  CordRepBtreeNavigator nav;
+  nav.InitFirst(tree());
+
+  for (int char_offset = 0; char_offset < kCharsPerFlat; ++char_offset) {
+    Position pos = nav.Seek(char_offset);
+    EXPECT_THAT(pos.edge, Eq(nav.Current()));
+    EXPECT_THAT(pos.edge, Eq(flats[0]));
+    EXPECT_THAT(pos.offset, Eq(char_offset));
+  }
+
+  for (int index = 0; index < count; ++index) {
+    for (int char_offset = 0; char_offset < kCharsPerFlat; ++char_offset) {
+      size_t offset = index * kCharsPerFlat + char_offset;
+      Position pos1 = nav.Seek(offset);
+      ASSERT_THAT(pos1.edge, Eq(flats[index]));
+      ASSERT_THAT(pos1.edge, Eq(nav.Current()));
+      ASSERT_THAT(pos1.offset, Eq(char_offset));
+    }
+  }
+}
+
+TEST(CordRepBtreeNavigatorTest, InitOffset) {
+  // Whitebox: InitOffset() is implemented in terms of Seek() which is
+  // exhaustively tested. Only test it initializes / forwards properly..
+  CordRepBtree* tree = CordRepBtree::Create(MakeFlat("abc"));
+  tree = CordRepBtree::Append(tree, MakeFlat("def"));
+  CordRepBtreeNavigator nav;
+  Position pos = nav.InitOffset(tree, 5);
+  EXPECT_TRUE(nav);
+  EXPECT_THAT(nav.btree(), Eq(tree));
+  EXPECT_THAT(pos.edge, Eq(tree->Edges()[1]));
+  EXPECT_THAT(pos.edge, Eq(nav.Current()));
+  EXPECT_THAT(pos.offset, Eq(2));
+  CordRep::Unref(tree);
+}
+
+TEST(CordRepBtreeNavigatorTest, InitOffsetAndSeekBeyondLength) {
+  CordRepBtree* tree1 = CordRepBtree::Create(MakeFlat("abc"));
+  CordRepBtree* tree2 = CordRepBtree::Create(MakeFlat("def"));
+
+  CordRepBtreeNavigator nav;
+  nav.InitFirst(tree1);
+  EXPECT_THAT(nav.Seek(3).edge, Eq(nullptr));
+  EXPECT_THAT(nav.Seek(100).edge, Eq(nullptr));
+  EXPECT_THAT(nav.btree(), Eq(tree1));
+  EXPECT_THAT(nav.Current(), Eq(tree1->Edges().front()));
+
+  EXPECT_THAT(nav.InitOffset(tree2, 3).edge, Eq(nullptr));
+  EXPECT_THAT(nav.InitOffset(tree2, 100).edge, Eq(nullptr));
+  EXPECT_THAT(nav.btree(), Eq(tree1));
+  EXPECT_THAT(nav.Current(), Eq(tree1->Edges().front()));
+
+  CordRep::Unref(tree1);
+  CordRep::Unref(tree2);
+}
+
+TEST_P(CordRepBtreeNavigatorTest, Read) {
+  const Flats& flats = this->flats();
+  const std::string& data = this->data();
+
+  for (size_t offset = 0; offset < data.size(); ++offset) {
+    for (size_t length = 1; length <= data.size() - offset; ++length) {
+      CordRepBtreeNavigator nav;
+      nav.InitFirst(tree());
+
+      // Skip towards edge holding offset
+      size_t edge_offset = nav.Skip(offset).offset;
+
+      // Read node
+      ReadResult result = nav.Read(edge_offset, length);
+      ASSERT_THAT(result.tree, Ne(nullptr));
+      EXPECT_THAT(result.tree->length, Eq(length));
+      if (result.tree->tag == BTREE) {
+        ASSERT_TRUE(CordRepBtree::IsValid(result.tree->btree()));
+      }
+
+      // Verify contents
+      std::string value = CordToString(result.tree);
+      EXPECT_THAT(value, Eq(data.substr(offset, length)));
+
+      // Verify 'partial last edge' reads.
+      size_t partial = (offset + length) % kCharsPerFlat;
+      ASSERT_THAT(result.n, Eq(partial));
+
+      // Verify ending position if not EOF
+      if (offset + length < data.size()) {
+        size_t index = (offset + length) / kCharsPerFlat;
+        EXPECT_THAT(nav.Current(), Eq(flats[index]));
+      }
+
+      CordRep::Unref(result.tree);
+    }
+  }
+}
+
+TEST_P(CordRepBtreeNavigatorTest, ReadBeyondLengthOfTree) {
+  CordRepBtreeNavigator nav;
+  nav.InitFirst(tree());
+  ReadResult result = nav.Read(2, tree()->length);
+  ASSERT_THAT(result.tree, Eq(nullptr));
+}
+
+}  // namespace
+}  // namespace cord_internal
+ABSL_NAMESPACE_END
+}  // namespace absl
diff --git a/third_party/abseil-cpp/absl/strings/internal/cord_rep_btree_reader.cc b/third_party/abseil-cpp/absl/strings/internal/cord_rep_btree_reader.cc
new file mode 100644
index 0000000..3ba4314
--- /dev/null
+++ b/third_party/abseil-cpp/absl/strings/internal/cord_rep_btree_reader.cc
@@ -0,0 +1,68 @@
+// Copyright 2021 The Abseil Authors
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     https://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include "absl/strings/internal/cord_rep_btree_reader.h"
+
+#include <cassert>
+
+#include "absl/base/config.h"
+#include "absl/strings/internal/cord_internal.h"
+#include "absl/strings/internal/cord_rep_btree.h"
+#include "absl/strings/internal/cord_rep_btree_navigator.h"
+#include "absl/strings/internal/cord_rep_flat.h"
+
+namespace absl {
+ABSL_NAMESPACE_BEGIN
+namespace cord_internal {
+
+absl::string_view CordRepBtreeReader::Read(size_t n, size_t chunk_size,
+                                           CordRep*& tree) {
+  assert(chunk_size <= navigator_.Current()->length);
+
+  // If chunk_size is non-zero, we need to start inside last returned edge.
+  // Else we start reading at the next data edge of the tree.
+  CordRep* edge = chunk_size ? navigator_.Current() : navigator_.Next();
+  const size_t offset = chunk_size ? edge->length - chunk_size : 0;
+
+  // Read the sub tree and verify we got what we wanted.
+  ReadResult result = navigator_.Read(offset, n);
+  tree = result.tree;
+
+  // If the data returned in `tree` was covered entirely by `chunk_size`, i.e.,
+  // read from the 'previous' edge, we did not consume any additional data, and
+  // can directly return the substring into the current data edge as the next
+  // chunk. We can easily establish from the above code that `navigator_.Next()`
+  // has not been called as that requires `chunk_size` to be zero.
+  if (n < chunk_size) return CordRepBtree::EdgeData(edge).substr(result.n);
+
+  // The amount of data taken from the last edge is `chunk_size` and `result.n`
+  // contains the offset into the current edge trailing the read data (which can
+  // be 0). As the call to `navigator_.Read()` could have consumed all remaining
+  // data, calling `navigator_.Current()` is not safe before checking if we
+  // already consumed all remaining data.
+  const size_t consumed_by_read = n - chunk_size - result.n;
+  if (consumed_ + consumed_by_read >= length()) {
+    consumed_ = length();
+    return {};
+  }
+
+  // We did not read all data, return remaining data from current edge.
+  edge = navigator_.Current();
+  consumed_ += consumed_by_read + edge->length;
+  return CordRepBtree::EdgeData(edge).substr(result.n);
+}
+
+}  // namespace cord_internal
+ABSL_NAMESPACE_END
+}  // namespace absl
diff --git a/third_party/abseil-cpp/absl/strings/internal/cord_rep_btree_reader.h b/third_party/abseil-cpp/absl/strings/internal/cord_rep_btree_reader.h
new file mode 100644
index 0000000..c19fa43
--- /dev/null
+++ b/third_party/abseil-cpp/absl/strings/internal/cord_rep_btree_reader.h
@@ -0,0 +1,219 @@
+// Copyright 2021 The Abseil Authors
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     https://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#ifndef ABSL_STRINGS_INTERNAL_CORD_REP_BTREE_READER_H_
+#define ABSL_STRINGS_INTERNAL_CORD_REP_BTREE_READER_H_
+
+#include <cassert>
+
+#include "absl/base/config.h"
+#include "absl/strings/internal/cord_internal.h"
+#include "absl/strings/internal/cord_rep_btree.h"
+#include "absl/strings/internal/cord_rep_btree_navigator.h"
+#include "absl/strings/internal/cord_rep_flat.h"
+
+namespace absl {
+ABSL_NAMESPACE_BEGIN
+namespace cord_internal {
+
+// CordRepBtreeReader implements logic to iterate over cord btrees.
+// References to the underlying data are returned as absl::string_view values.
+// The most typical use case is a forward only iteration over tree data.
+// The class also provides `Skip()`, `Seek()` and `Read()` methods similar to
+// CordRepBtreeNavigator that allow more advanced navigation. The class provides
+// a `consumed` property which contains the end offset of the chunk last
+// returned to the user which is useful in cord iteration logic.
+//
+// Example: iterate over all data inside a cord btree:
+//
+//   CordRepBtreeReader reader;
+//   for (string_view sv = reader.Init(tree); !sv.Empty(); sv = sv.Next()) {
+//     DoSomethingWithDataIn(sv);
+//   }
+//
+// All navigation methods always return the next 'chunk' of data. The class
+// assumes that all data is directly 'consumed' by the caller. For example:
+// invoking `Skip()` will skip the desired number of bytes, and directly
+// read and return the next chunk of data directly after the skipped bytes.
+//
+// Example: iterate over all data inside a btree skipping the first 100 bytes:
+//
+//   CordRepBtreeReader reader;
+//   absl::string_view sv = reader.Init(tree);
+//   if (sv.length() > 100) {
+//     sv.RemovePrefix(100);
+//   } else {
+//     sv = reader.Skip(100 - sv.length());
+//   }
+//   while (!sv.empty()) {
+//     DoSomethingWithDataIn(sv);
+//     absl::string_view sv = reader.Next();
+//   }
+//
+// It is important to notice that `consumed` represents the end position of the
+// last data edge returned to the caller, not the cumulative data returned to
+// the caller which can be less in cases of skipping or seeking over data.
+//
+// For example, consider a cord btree with five data edges: "abc", "def", "ghi",
+// "jkl" and "mno":
+//
+//   absl::string_view sv;
+//   CordRepBtreeReader reader;
+//
+//   sv = reader.Init(tree); // sv = "abc", reader.consumed() = 3
+//   sv = reader.Skip(4);    // sv = "hi",  reader.consumed() = 9
+//   sv = reader.Skip(2);    // sv = "l",   reader.consumed() = 12
+//   sv = reader.Next();     // sv = "mno", reader.consumed() = 15
+//
+// In the above example, `reader.consumed()` reflects the data edges iterated
+// over or skipped by the reader, not the amount of data 'consumed' by the
+// caller.
+class CordRepBtreeReader {
+ public:
+  using ReadResult = CordRepBtreeNavigator::ReadResult;
+  using Position = CordRepBtreeNavigator::Position;
+
+  // Returns true if this instance is not empty.
+  explicit operator bool() const { return navigator_.btree() != nullptr; }
+
+  // Returns the tree referenced by this instance or nullptr if empty.
+  CordRepBtree* btree() const { return navigator_.btree(); }
+
+  // Returns the current data edge inside the referenced btree.
+  // Requires that the current instance is not empty.
+  CordRep* node() const { return navigator_.Current(); }
+
+  // Returns the length of the referenced tree.
+  // Requires that the current instance is not empty.
+  size_t length() const;
+
+  // Returns the end offset of the last navigated to chunk, which represents the
+  // total bytes 'consumed' relative to the start of the tree. The returned
+  // value is never zero. For example, initializing a reader with a tree with a
+  // first data edge of 19 bytes will return `consumed() = 19`. See also the
+  // class comments on the meaning of `consumed`.
+  // Requires that the current instance is not empty.
+  size_t consumed() const;
+
+  // Resets this instance to an empty value.
+  void Reset() { navigator_.Reset(); }
+
+  // Initializes this instance with `tree`. `tree` must not be null.
+  // Returns a reference to the first data edge of the provided tree.
+  absl::string_view Init(CordRepBtree* tree);
+
+  // Navigates to and returns the next data edge of the referenced tree.
+  // Returns an empty string_view if an attempt is made to read beyond the end
+  // of the tree, i.e.: if `remaining()` is zero indicating an EOF condition.
+  // Requires that the current instance is not empty.
+  absl::string_view Next();
+
+  // Skips the provided amount of bytes and returns a reference to the data
+  // directly following the skipped bytes.
+  absl::string_view Skip(size_t skip);
+
+  // Reads `n` bytes into `tree`.
+  // If `chunk_size` is zero, starts reading at the next data edge. If
+  // `chunk_size` is non zero, the read starts at the last `chunk_size` bytes of
+  // the last returned data edge. Effectively, this means that the read starts
+  // at offset `consumed() - chunk_size`.
+  // Requires that `chunk_size` is less than or equal to the length of the
+  // last returned data edge. The purpose of `chunk_size` is to simplify code
+  // partially consuming a returned chunk and wanting to include the remaining
+  // bytes in the Read call. For example, the below code will read 1000 bytes of
+  // data into a cord tree if the first chunk starts with "big:":
+  //
+  //   CordRepBtreeReader reader;
+  //   absl::string_view sv = reader.Init(tree);
+  //   if (absl::StartsWith(sv, "big:")) {
+  //     CordRepBtree tree;
+  //     sv = reader.Read(1000, sv.size() - 4 /* "big:" */, &tree);
+  //   }
+  //
+  // This method will return an empty string view if all remaining data was
+  // read. If `n` exceeded the amount of remaining data this function will
+  // return an empty string view and `tree` will be set to nullptr.
+  // In both cases, `consumed` will be set to `length`.
+  absl::string_view Read(size_t n, size_t chunk_size, CordRep*& tree);
+
+  // Navigates to the chunk at offset `offset`.
+  // Returns a reference into the navigated to chunk, adjusted for the relative
+  // position of `offset` into that chunk. For example, calling `Seek(13)` on a
+  // cord tree containing 2 chunks of 10 and 20 bytes respectively will return
+  // a string view into the second chunk starting at offset 3 with a size of 17.
+  // Returns an empty string view if `offset` is equal to or greater than the
+  // length of the referenced tree.
+  absl::string_view Seek(size_t offset);
+
+ private:
+  size_t consumed_;
+  CordRepBtreeNavigator navigator_;
+};
+
+inline size_t CordRepBtreeReader::length() const {
+  assert(btree() != nullptr);
+  return btree()->length;
+}
+
+inline size_t CordRepBtreeReader::consumed() const {
+  assert(btree() != nullptr);
+  return consumed_;
+}
+
+inline absl::string_view CordRepBtreeReader::Init(CordRepBtree* tree) {
+  assert(tree != nullptr);
+  const CordRep* edge = navigator_.InitFirst(tree);
+  consumed_ = edge->length;
+  return CordRepBtree::EdgeData(edge);
+}
+
+inline absl::string_view CordRepBtreeReader::Next() {
+  assert(consumed() < length());
+  const CordRep* edge = navigator_.Next();
+  assert(edge != nullptr);
+  consumed_ += edge->length;
+  return CordRepBtree::EdgeData(edge);
+}
+
+inline absl::string_view CordRepBtreeReader::Skip(size_t skip) {
+  // As we are always positioned on the last 'consumed' edge, we
+  // need to skip the current edge as well as `skip`.
+  const size_t edge_length = navigator_.Current()->length;
+  CordRepBtreeNavigator::Position pos = navigator_.Skip(skip + edge_length);
+  if (ABSL_PREDICT_FALSE(pos.edge == nullptr)) {
+    consumed_ = length();
+    return {};
+  }
+  // The combined length of all edges skipped before `pos.edge` is `skip -
+  // pos.offset`, all of which are 'consumed', as well as the current edge.
+  consumed_ += skip - pos.offset + pos.edge->length;
+  return CordRepBtree::EdgeData(pos.edge).substr(pos.offset);
+}
+
+inline absl::string_view CordRepBtreeReader::Seek(size_t offset) {
+  const CordRepBtreeNavigator::Position pos = navigator_.Seek(offset);
+  if (ABSL_PREDICT_FALSE(pos.edge == nullptr)) {
+    consumed_ = length();
+    return {};
+  }
+  absl::string_view chunk = CordRepBtree::EdgeData(pos.edge).substr(pos.offset);
+  consumed_ = offset + chunk.length();
+  return chunk;
+}
+
+}  // namespace cord_internal
+ABSL_NAMESPACE_END
+}  // namespace absl
+
+#endif  // ABSL_STRINGS_INTERNAL_CORD_REP_BTREE_READER_H_
diff --git a/third_party/abseil-cpp/absl/strings/internal/cord_rep_btree_reader_test.cc b/third_party/abseil-cpp/absl/strings/internal/cord_rep_btree_reader_test.cc
new file mode 100644
index 0000000..44d3365
--- /dev/null
+++ b/third_party/abseil-cpp/absl/strings/internal/cord_rep_btree_reader_test.cc
@@ -0,0 +1,285 @@
+// Copyright 2021 The Abseil Authors
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     https://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include "absl/strings/internal/cord_rep_btree_reader.h"
+
+#include <iostream>
+#include <random>
+#include <string>
+#include <vector>
+
+#include "gmock/gmock.h"
+#include "gtest/gtest.h"
+#include "absl/base/config.h"
+#include "absl/base/internal/raw_logging.h"
+#include "absl/strings/cord.h"
+#include "absl/strings/internal/cord_internal.h"
+#include "absl/strings/internal/cord_rep_btree.h"
+#include "absl/strings/internal/cord_rep_test_util.h"
+#include "absl/strings/string_view.h"
+
+namespace absl {
+ABSL_NAMESPACE_BEGIN
+namespace cord_internal {
+namespace {
+
+using ::testing::Eq;
+using ::testing::IsEmpty;
+using ::testing::Ne;
+using ::testing::Not;
+
+using ::absl::cordrep_testing::CordRepBtreeFromFlats;
+using ::absl::cordrep_testing::MakeFlat;
+using ::absl::cordrep_testing::CordToString;
+using ::absl::cordrep_testing::CreateFlatsFromString;
+using ::absl::cordrep_testing::CreateRandomString;
+
+using ReadResult = CordRepBtreeReader::ReadResult;
+
+TEST(CordRepBtreeReaderTest, Next) {
+  constexpr size_t kChars = 3;
+  const size_t cap = CordRepBtree::kMaxCapacity;
+  int counts[] = {1, 2, cap, cap * cap, cap * cap + 1, cap * cap * 2 + 17};
+
+  for (int count : counts) {
+    std::string data = CreateRandomString(count * kChars);
+    std::vector<CordRep*> flats = CreateFlatsFromString(data, kChars);
+    CordRepBtree* node = CordRepBtreeFromFlats(flats);
+
+    CordRepBtreeReader reader;
+    absl::string_view chunk = reader.Init(node);
+    EXPECT_THAT(chunk, Eq(data.substr(0, chunk.length())));
+
+    size_t consumed = chunk.length();
+    EXPECT_THAT(reader.consumed(), Eq(consumed));
+
+    while (consumed < data.length()) {
+      chunk = reader.Next();
+      EXPECT_THAT(chunk, Eq(data.substr(consumed, chunk.length())));
+
+      consumed += chunk.length();
+      EXPECT_THAT(reader.consumed(), Eq(consumed));
+    }
+
+    EXPECT_THAT(consumed, Eq(data.length()));
+    EXPECT_THAT(reader.consumed(), Eq(data.length()));
+
+    CordRep::Unref(node);
+  }
+}
+
+TEST(CordRepBtreeReaderTest, Skip) {
+  constexpr size_t kChars = 3;
+  const size_t cap = CordRepBtree::kMaxCapacity;
+  int counts[] = {1, 2, cap, cap * cap, cap * cap + 1, cap * cap * 2 + 17};
+
+  for (int count : counts) {
+    std::string data = CreateRandomString(count * kChars);
+    std::vector<CordRep*> flats = CreateFlatsFromString(data, kChars);
+    CordRepBtree* node = CordRepBtreeFromFlats(flats);
+
+    for (size_t skip1 = 0; skip1 < data.length() - kChars; ++skip1) {
+      for (size_t skip2 = 0; skip2 < data.length() - kChars; ++skip2) {
+        CordRepBtreeReader reader;
+        absl::string_view chunk = reader.Init(node);
+        size_t consumed = chunk.length();
+
+        chunk = reader.Skip(skip1);
+        ASSERT_THAT(chunk, Eq(data.substr(consumed + skip1, chunk.length())));
+        consumed += chunk.length() + skip1;
+        ASSERT_THAT(reader.consumed(), Eq(consumed));
+
+        if (consumed >= data.length()) continue;
+
+        size_t skip = std::min(data.length() - consumed - 1, skip2);
+        chunk = reader.Skip(skip);
+        ASSERT_THAT(chunk, Eq(data.substr(consumed + skip, chunk.length())));
+      }
+    }
+
+    CordRep::Unref(node);
+  }
+}
+
+TEST(CordRepBtreeReaderTest, SkipBeyondLength) {
+  CordRepBtree* tree = CordRepBtree::Create(MakeFlat("abc"));
+  tree = CordRepBtree::Append(tree, MakeFlat("def"));
+  CordRepBtreeReader reader;
+  reader.Init(tree);
+  EXPECT_THAT(reader.Skip(100), IsEmpty());
+  EXPECT_THAT(reader.consumed(), Eq(6));
+  CordRep::Unref(tree);
+}
+
+TEST(CordRepBtreeReaderTest, Seek) {
+  constexpr size_t kChars = 3;
+  const size_t cap = CordRepBtree::kMaxCapacity;
+  int counts[] = {1, 2, cap, cap * cap, cap * cap + 1, cap * cap * 2 + 17};
+
+  for (int count : counts) {
+    std::string data = CreateRandomString(count * kChars);
+    std::vector<CordRep*> flats = CreateFlatsFromString(data, kChars);
+    CordRepBtree* node = CordRepBtreeFromFlats(flats);
+
+    for (size_t seek = 0; seek < data.length() - 1; ++seek) {
+      CordRepBtreeReader reader;
+      reader.Init(node);
+      absl::string_view chunk = reader.Seek(seek);
+      ASSERT_THAT(chunk, Not(IsEmpty()));
+      ASSERT_THAT(chunk, Eq(data.substr(seek, chunk.length())));
+      ASSERT_THAT(reader.consumed(), Eq(seek + chunk.length()));
+    }
+
+    CordRep::Unref(node);
+  }
+}
+
+TEST(CordRepBtreeReaderTest, SeekBeyondLength) {
+  CordRepBtree* tree = CordRepBtree::Create(MakeFlat("abc"));
+  tree = CordRepBtree::Append(tree, MakeFlat("def"));
+  CordRepBtreeReader reader;
+  reader.Init(tree);
+  EXPECT_THAT(reader.Seek(6), IsEmpty());
+  EXPECT_THAT(reader.consumed(), Eq(6));
+  EXPECT_THAT(reader.Seek(100), IsEmpty());
+  EXPECT_THAT(reader.consumed(), Eq(6));
+  CordRep::Unref(tree);
+}
+
+TEST(CordRepBtreeReaderTest, Read) {
+  std::string data = "abcdefghijklmno";
+  std::vector<CordRep*> flats = CreateFlatsFromString(data, 5);
+  CordRepBtree* node = CordRepBtreeFromFlats(flats);
+
+  CordRep* tree;
+  CordRepBtreeReader reader;
+  absl::string_view chunk;
+
+  // Read zero bytes
+  chunk = reader.Init(node);
+  chunk = reader.Read(0, chunk.length(), tree);
+  EXPECT_THAT(tree, Eq(nullptr));
+  EXPECT_THAT(chunk, Eq("abcde"));
+  EXPECT_THAT(reader.consumed(), Eq(5));
+  EXPECT_THAT(reader.Next(), Eq("fghij"));
+
+  // Read in full
+  chunk = reader.Init(node);
+  chunk = reader.Read(15, chunk.length(), tree);
+  EXPECT_THAT(tree, Ne(nullptr));
+  EXPECT_THAT(CordToString(tree), Eq("abcdefghijklmno"));
+  EXPECT_THAT(chunk, Eq(""));
+  EXPECT_THAT(reader.consumed(), Eq(15));
+  CordRep::Unref(tree);
+
+  // Read < chunk bytes
+  chunk = reader.Init(node);
+  chunk = reader.Read(3, chunk.length(), tree);
+  ASSERT_THAT(tree, Ne(nullptr));
+  EXPECT_THAT(CordToString(tree), Eq("abc"));
+  EXPECT_THAT(chunk, Eq("de"));
+  EXPECT_THAT(reader.consumed(), Eq(5));
+  EXPECT_THAT(reader.Next(), Eq("fghij"));
+  CordRep::Unref(tree);
+
+  // Read < chunk bytes at offset
+  chunk = reader.Init(node);
+  chunk = reader.Read(2, chunk.length() - 2, tree);
+  ASSERT_THAT(tree, Ne(nullptr));
+  EXPECT_THAT(CordToString(tree), Eq("cd"));
+  EXPECT_THAT(chunk, Eq("e"));
+  EXPECT_THAT(reader.consumed(), Eq(5));
+  EXPECT_THAT(reader.Next(), Eq("fghij"));
+  CordRep::Unref(tree);
+
+  // Read from consumed chunk
+  chunk = reader.Init(node);
+  chunk = reader.Read(3, 0, tree);
+  ASSERT_THAT(tree, Ne(nullptr));
+  EXPECT_THAT(CordToString(tree), Eq("fgh"));
+  EXPECT_THAT(chunk, Eq("ij"));
+  EXPECT_THAT(reader.consumed(), Eq(10));
+  EXPECT_THAT(reader.Next(), Eq("klmno"));
+  CordRep::Unref(tree);
+
+  // Read across chunks
+  chunk = reader.Init(node);
+  chunk = reader.Read(12, chunk.length() - 2, tree);
+  ASSERT_THAT(tree, Ne(nullptr));
+  EXPECT_THAT(CordToString(tree), Eq("cdefghijklmn"));
+  EXPECT_THAT(chunk, Eq("o"));
+  EXPECT_THAT(reader.consumed(), Eq(15));
+  CordRep::Unref(tree);
+
+  // Read across chunks landing on exact edge boundary
+  chunk = reader.Init(node);
+  chunk = reader.Read(10 - 2, chunk.length() - 2, tree);
+  ASSERT_THAT(tree, Ne(nullptr));
+  EXPECT_THAT(CordToString(tree), Eq("cdefghij"));
+  EXPECT_THAT(chunk, Eq("klmno"));
+  EXPECT_THAT(reader.consumed(), Eq(15));
+  CordRep::Unref(tree);
+
+  CordRep::Unref(node);
+}
+
+TEST(CordRepBtreeReaderTest, ReadExhaustive) {
+  constexpr size_t kChars = 3;
+  const size_t cap = CordRepBtree::kMaxCapacity;
+  int counts[] = {1, 2, cap, cap * cap + 1, cap * cap * cap * 2 + 17};
+
+  for (int count : counts) {
+    std::string data = CreateRandomString(count * kChars);
+    std::vector<CordRep*> flats = CreateFlatsFromString(data, kChars);
+    CordRepBtree* node = CordRepBtreeFromFlats(flats);
+
+    for (size_t read_size : {kChars - 1, kChars, kChars + 7, cap * cap}) {
+      CordRepBtreeReader reader;
+      absl::string_view chunk = reader.Init(node);
+
+      // `consumed` tracks the end of last consumed chunk which is the start of
+      // the next chunk: we always read with `chunk_size = chunk.length()`.
+      size_t consumed = 0;
+      size_t remaining = data.length();
+      while (remaining > 0) {
+        CordRep* tree;
+        size_t n = (std::min)(remaining, read_size);
+        chunk = reader.Read(n, chunk.length(), tree);
+        EXPECT_THAT(tree, Ne(nullptr));
+        if (tree) {
+          EXPECT_THAT(CordToString(tree), Eq(data.substr(consumed, n)));
+          CordRep::Unref(tree);
+        }
+
+        consumed += n;
+        remaining -= n;
+        EXPECT_THAT(reader.consumed(), Eq(consumed + chunk.length()));
+
+        if (remaining > 0) {
+          ASSERT_FALSE(chunk.empty());
+          ASSERT_THAT(chunk, Eq(data.substr(consumed, chunk.length())));
+        } else {
+          ASSERT_TRUE(chunk.empty()) << chunk;
+        }
+      }
+    }
+
+    CordRep::Unref(node);
+  }
+}
+
+}  // namespace
+}  // namespace cord_internal
+ABSL_NAMESPACE_END
+}  // namespace absl
diff --git a/third_party/abseil-cpp/absl/strings/internal/cord_rep_btree_test.cc b/third_party/abseil-cpp/absl/strings/internal/cord_rep_btree_test.cc
new file mode 100644
index 0000000..073a7d4
--- /dev/null
+++ b/third_party/abseil-cpp/absl/strings/internal/cord_rep_btree_test.cc
@@ -0,0 +1,1395 @@
+// Copyright 2021 The Abseil Authors
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     https://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include "absl/strings/internal/cord_rep_btree.h"
+
+#include <cmath>
+#include <deque>
+#include <iostream>
+#include <string>
+#include <vector>
+
+#include "gmock/gmock.h"
+#include "gtest/gtest.h"
+#include "absl/base/config.h"
+#include "absl/base/internal/raw_logging.h"
+#include "absl/cleanup/cleanup.h"
+#include "absl/strings/internal/cord_internal.h"
+#include "absl/strings/internal/cord_rep_test_util.h"
+#include "absl/strings/str_cat.h"
+#include "absl/strings/string_view.h"
+
+namespace absl {
+ABSL_NAMESPACE_BEGIN
+namespace cord_internal {
+
+class CordRepBtreeTestPeer {
+ public:
+  static void SetEdge(CordRepBtree* node, size_t idx, CordRep* edge) {
+    node->edges_[idx] = edge;
+  }
+  static void AddEdge(CordRepBtree* node, CordRep* edge) {
+    node->edges_[node->fetch_add_end(1)] = edge;
+  }
+};
+
+namespace {
+
+using ::absl::cordrep_testing::AutoUnref;
+using ::absl::cordrep_testing::CordToString;
+using ::absl::cordrep_testing::CreateFlatsFromString;
+using ::absl::cordrep_testing::CreateRandomString;
+using ::absl::cordrep_testing::MakeConcat;
+using ::absl::cordrep_testing::MakeExternal;
+using ::absl::cordrep_testing::MakeFlat;
+using ::absl::cordrep_testing::MakeSubstring;
+using ::testing::_;
+using ::testing::AllOf;
+using ::testing::AnyOf;
+using ::testing::Conditional;
+using ::testing::ElementsAre;
+using ::testing::ElementsAreArray;
+using ::testing::Eq;
+using ::testing::HasSubstr;
+using ::testing::Ne;
+using ::testing::Not;
+using ::testing::SizeIs;
+using ::testing::TypedEq;
+
+MATCHER_P(EqFlatHolding, data, "Equals flat holding data") {
+  if (arg->tag < FLAT) {
+    *result_listener << "Expected FLAT, got tag " << static_cast<int>(arg->tag);
+    return false;
+  }
+  std::string actual = CordToString(arg);
+  if (actual != data) {
+    *result_listener << "Expected flat holding \"" << data
+                     << "\", got flat holding \"" << actual << "\"";
+    return false;
+  }
+  return true;
+}
+
+MATCHER_P(IsNode, height, absl::StrCat("Is a valid node of height ", height)) {
+  if (arg == nullptr) {
+    *result_listener << "Expected NODE, got nullptr";
+    return false;
+  }
+  if (arg->tag != BTREE) {
+    *result_listener << "Expected NODE, got " << static_cast<int>(arg->tag);
+    return false;
+  }
+  if (!CordRepBtree::IsValid(arg->btree())) {
+    CordRepBtree::Dump(arg->btree(), "Expected valid NODE, got:", false,
+                       *result_listener->stream());
+    return false;
+  }
+  if (arg->btree()->height() != height) {
+    *result_listener << "Expected NODE of height " << height << ", got "
+                     << arg->btree()->height();
+    return false;
+  }
+  return true;
+}
+
+MATCHER_P2(IsSubstring, start, length,
+           absl::StrCat("Is a substring(start = ", start, ", length = ", length,
+                        ")")) {
+  if (arg == nullptr) {
+    *result_listener << "Expected substring, got nullptr";
+    return false;
+  }
+  if (arg->tag != SUBSTRING) {
+    *result_listener << "Expected SUBSTRING, got "
+                     << static_cast<int>(arg->tag);
+    return false;
+  }
+  const CordRepSubstring* const substr = arg->substring();
+  if (substr->start != start || substr->length != length) {
+    *result_listener << "Expected substring(" << start << ", " << length
+                     << "), got substring(" << substr->start << ", "
+                     << substr->length << ")";
+    return false;
+  }
+  return true;
+}
+
+// DataConsumer is a simple helper class used by tests to 'consume' string
+// fragments from the provided input in forward or backward direction.
+class DataConsumer {
+ public:
+  // Starts consumption of `data`. Caller must make sure `data` outlives this
+  // instance. Consumes data starting at the front if `forward` is true, else
+  // consumes data from the back.
+  DataConsumer(absl::string_view data, bool forward)
+      : data_(data), forward_(forward) {}
+
+  // Return the next `n` bytes from referenced data.
+  absl::string_view Next(size_t n) {
+    assert(n <= data_.size() - consumed_);
+    consumed_ += n;
+    return data_.substr(forward_ ? consumed_ - n : data_.size() - consumed_, n);
+  }
+
+  // Returns all data consumed so far.
+  absl::string_view Consumed() const {
+    return forward_ ? data_.substr(0, consumed_)
+                    : data_.substr(data_.size() - consumed_);
+  }
+
+ private:
+  absl::string_view data_;
+  size_t consumed_ = 0;
+  bool forward_;
+};
+
+// BtreeAdd returns either CordRepBtree::Append or CordRepBtree::Prepend.
+CordRepBtree* BtreeAdd(CordRepBtree* node, bool append,
+                       absl::string_view data) {
+  return append ? CordRepBtree::Append(node, data)
+                : CordRepBtree::Prepend(node, data);
+}
+
+// Recursively collects all leaf edges from `tree` and appends them to `edges`.
+void GetLeafEdges(const CordRepBtree* tree, std::vector<CordRep*>& edges) {
+  if (tree->height() == 0) {
+    for (CordRep* edge : tree->Edges()) {
+      edges.push_back(edge);
+    }
+  } else {
+    for (CordRep* edge : tree->Edges()) {
+      GetLeafEdges(edge->btree(), edges);
+    }
+  }
+}
+
+// Recursively collects and returns all leaf edges from `tree`.
+std::vector<CordRep*> GetLeafEdges(const CordRepBtree* tree) {
+  std::vector<CordRep*> edges;
+  GetLeafEdges(tree, edges);
+  return edges;
+}
+
+// Creates a flat containing the hexadecimal value of `i` zero padded
+// to at least 4 digits prefixed with "0x", e.g.: "0x04AC".
+CordRepFlat* MakeHexFlat(size_t i) {
+  return MakeFlat(absl::StrCat("0x", absl::Hex(i, absl::kZeroPad4)));
+}
+
+CordRepBtree* MakeLeaf(size_t size = CordRepBtree::kMaxCapacity) {
+  assert(size <= CordRepBtree::kMaxCapacity);
+  CordRepBtree* leaf = CordRepBtree::Create(MakeHexFlat(0));
+  for (size_t i = 1; i < size; ++i) {
+    leaf = CordRepBtree::Append(leaf, MakeHexFlat(i));
+  }
+  return leaf;
+}
+
+CordRepBtree* MakeTree(size_t size, bool append = true) {
+  CordRepBtree* tree = CordRepBtree::Create(MakeHexFlat(0));
+  for (size_t i = 1; i < size; ++i) {
+    tree = append ? CordRepBtree::Append(tree, MakeHexFlat(i))
+                  : CordRepBtree::Prepend(tree, MakeHexFlat(i));
+  }
+  return tree;
+}
+
+CordRepBtree* CreateTree(absl::string_view data, size_t chunk_size) {
+  std::vector<CordRep*> flats = CreateFlatsFromString(data, chunk_size);
+  auto it = flats.begin();
+  CordRepBtree* tree = CordRepBtree::Create(*it);
+  while (++it != flats.end()) tree = CordRepBtree::Append(tree, *it);
+  return tree;
+}
+
+CordRepBtree* CreateTreeReverse(absl::string_view data, size_t chunk_size) {
+  std::vector<CordRep*> flats = CreateFlatsFromString(data, chunk_size);
+  auto rit = flats.rbegin();
+  CordRepBtree* tree = CordRepBtree::Create(*rit);
+  while (++rit != flats.rend()) tree = CordRepBtree::Prepend(tree, *rit);
+  return tree;
+}
+
+class CordRepBtreeTest : public testing::TestWithParam<bool> {
+ public:
+  bool shared() const { return GetParam(); }
+
+  static std::string ToString(testing::TestParamInfo<bool> param) {
+    return param.param ? "Shared" : "Private";
+  }
+};
+
+INSTANTIATE_TEST_SUITE_P(WithParam, CordRepBtreeTest, testing::Bool(),
+                         CordRepBtreeTest::ToString);
+
+class CordRepBtreeHeightTest : public testing::TestWithParam<int> {
+ public:
+  int height() const { return GetParam(); }
+
+  static std::string ToString(testing::TestParamInfo<int> param) {
+    return absl::StrCat(param.param);
+  }
+};
+
+INSTANTIATE_TEST_SUITE_P(WithHeights, CordRepBtreeHeightTest,
+                         testing::Range(0, CordRepBtree::kMaxHeight),
+                         CordRepBtreeHeightTest::ToString);
+
+using TwoBools = testing::tuple<bool, bool>;
+
+class CordRepBtreeDualTest : public testing::TestWithParam<TwoBools> {
+ public:
+  bool first_shared() const { return std::get<0>(GetParam()); }
+  bool second_shared() const { return std::get<1>(GetParam()); }
+
+  static std::string ToString(testing::TestParamInfo<TwoBools> param) {
+    if (std::get<0>(param.param)) {
+      return std::get<1>(param.param) ? "BothShared" : "FirstShared";
+    }
+    return std::get<1>(param.param) ? "SecondShared" : "Private";
+  }
+};
+
+INSTANTIATE_TEST_SUITE_P(WithParam, CordRepBtreeDualTest,
+                         testing::Combine(testing::Bool(), testing::Bool()),
+                         CordRepBtreeDualTest::ToString);
+
+TEST(CordRepBtreeTest, SizeIsMultipleOf64) {
+  // Only enforce for fully 64-bit platforms.
+  if (sizeof(size_t) == 8 && sizeof(void*) == 8) {
+    EXPECT_THAT(sizeof(CordRepBtree) % 64, Eq(0)) << "Should be multiple of 64";
+  }
+}
+
+TEST(CordRepBtreeTest, NewDestroyEmptyTree) {
+  auto* tree = CordRepBtree::New();
+  EXPECT_THAT(tree->size(), Eq(0));
+  EXPECT_THAT(tree->height(), Eq(0));
+  EXPECT_THAT(tree->Edges(), ElementsAre());
+  CordRepBtree::Destroy(tree);
+}
+
+TEST(CordRepBtreeTest, NewDestroyEmptyTreeAtHeight) {
+  auto* tree = CordRepBtree::New(3);
+  EXPECT_THAT(tree->size(), Eq(0));
+  EXPECT_THAT(tree->height(), Eq(3));
+  EXPECT_THAT(tree->Edges(), ElementsAre());
+  CordRepBtree::Destroy(tree);
+}
+
+TEST(CordRepBtreeTest, Btree) {
+  CordRep* rep = CordRepBtree::New();
+  EXPECT_THAT(rep->btree(), Eq(rep));
+  EXPECT_THAT(static_cast<const CordRep*>(rep)->btree(), Eq(rep));
+  CordRep::Unref(rep);
+#if defined(GTEST_HAS_DEATH_TEST) && !defined(NDEBUG)
+  rep = MakeFlat("Hello world");
+  EXPECT_DEATH(rep->btree(), ".*");
+  EXPECT_DEATH(static_cast<const CordRep*>(rep)->btree(), ".*");
+  CordRep::Unref(rep);
+#endif
+}
+
+TEST(CordRepBtreeTest, EdgeData) {
+  CordRepFlat* flat = MakeFlat("Hello world");
+  CordRepExternal* external = MakeExternal("Hello external");
+  CordRep* substr1 = MakeSubstring(1, 6, CordRep::Ref(flat));
+  CordRep* substr2 = MakeSubstring(1, 6, CordRep::Ref(external));
+  CordRep* concat = MakeConcat(CordRep::Ref(flat), CordRep::Ref(external));
+  CordRep* bad_substr = MakeSubstring(1, 2, CordRep::Ref(substr1));
+
+  EXPECT_TRUE(CordRepBtree::IsDataEdge(flat));
+  EXPECT_THAT(CordRepBtree::EdgeDataPtr(flat),
+              TypedEq<const void*>(flat->Data()));
+  EXPECT_THAT(CordRepBtree::EdgeData(flat), Eq("Hello world"));
+
+  EXPECT_TRUE(CordRepBtree::IsDataEdge(external));
+  EXPECT_THAT(CordRepBtree::EdgeDataPtr(external),
+              TypedEq<const void*>(external->base));
+  EXPECT_THAT(CordRepBtree::EdgeData(external), Eq("Hello external"));
+
+  EXPECT_TRUE(CordRepBtree::IsDataEdge(substr1));
+  EXPECT_THAT(CordRepBtree::EdgeDataPtr(substr1),
+              TypedEq<const void*>(flat->Data() + 1));
+  EXPECT_THAT(CordRepBtree::EdgeData(substr1), Eq("ello w"));
+
+  EXPECT_TRUE(CordRepBtree::IsDataEdge(substr2));
+  EXPECT_THAT(CordRepBtree::EdgeDataPtr(substr2),
+              TypedEq<const void*>(external->base + 1));
+  EXPECT_THAT(CordRepBtree::EdgeData(substr2), Eq("ello e"));
+
+  EXPECT_FALSE(CordRepBtree::IsDataEdge(concat));
+  EXPECT_FALSE(CordRepBtree::IsDataEdge(bad_substr));
+#if defined(GTEST_HAS_DEATH_TEST) && !defined(NDEBUG)
+  EXPECT_DEATH(CordRepBtree::EdgeData(concat), ".*");
+  EXPECT_DEATH(CordRepBtree::EdgeDataPtr(concat), ".*");
+  EXPECT_DEATH(CordRepBtree::EdgeData(bad_substr), ".*");
+  EXPECT_DEATH(CordRepBtree::EdgeDataPtr(bad_substr), ".*");
+#endif
+
+  CordRep::Unref(bad_substr);
+  CordRep::Unref(concat);
+  CordRep::Unref(substr2);
+  CordRep::Unref(substr1);
+  CordRep::Unref(external);
+  CordRep::Unref(flat);
+}
+
+TEST(CordRepBtreeTest, CreateUnrefLeaf) {
+  auto* flat = MakeFlat("a");
+  auto* leaf = CordRepBtree::Create(flat);
+  EXPECT_THAT(leaf->size(), Eq(1));
+  EXPECT_THAT(leaf->height(), Eq(0));
+  EXPECT_THAT(leaf->Edges(), ElementsAre(flat));
+  CordRepBtree::Unref(leaf);
+}
+
+TEST(CordRepBtreeTest, NewUnrefNode) {
+  auto* leaf = CordRepBtree::Create(MakeFlat("a"));
+  CordRepBtree* tree = CordRepBtree::New(leaf);
+  EXPECT_THAT(tree->size(), Eq(1));
+  EXPECT_THAT(tree->height(), Eq(1));
+  EXPECT_THAT(tree->Edges(), ElementsAre(leaf));
+  CordRepBtree::Unref(tree);
+}
+
+TEST_P(CordRepBtreeTest, AppendToLeafToCapacity) {
+  AutoUnref refs;
+  std::vector<CordRep*> flats;
+  flats.push_back(MakeHexFlat(0));
+  auto* leaf = CordRepBtree::Create(flats.back());
+
+  for (size_t i = 1; i < CordRepBtree::kMaxCapacity; ++i) {
+    refs.RefIf(shared(), leaf);
+    flats.push_back(MakeHexFlat(i));
+    auto* result = CordRepBtree::Append(leaf, flats.back());
+    EXPECT_THAT(result->height(), Eq(0));
+    EXPECT_THAT(result, Conditional(shared(), Ne(leaf), Eq(leaf)));
+    EXPECT_THAT(result->Edges(), ElementsAreArray(flats));
+    leaf = result;
+  }
+  CordRep::Unref(leaf);
+}
+
+TEST_P(CordRepBtreeTest, PrependToLeafToCapacity) {
+  AutoUnref refs;
+  std::deque<CordRep*> flats;
+  flats.push_front(MakeHexFlat(0));
+  auto* leaf = CordRepBtree::Create(flats.front());
+
+  for (size_t i = 1; i < CordRepBtree::kMaxCapacity; ++i) {
+    refs.RefIf(shared(), leaf);
+    flats.push_front(MakeHexFlat(i));
+    auto* result = CordRepBtree::Prepend(leaf, flats.front());
+    EXPECT_THAT(result->height(), Eq(0));
+    EXPECT_THAT(result, Conditional(shared(), Ne(leaf), Eq(leaf)));
+    EXPECT_THAT(result->Edges(), ElementsAreArray(flats));
+    leaf = result;
+  }
+  CordRep::Unref(leaf);
+}
+
+// This test specifically aims at code aligning data at either the front or the
+// back of the contained `edges[]` array, alternating Append and Prepend will
+// move `begin()` and `end()` values as needed for each added value.
+TEST_P(CordRepBtreeTest, AppendPrependToLeafToCapacity) {
+  AutoUnref refs;
+  std::deque<CordRep*> flats;
+  flats.push_front(MakeHexFlat(0));
+  auto* leaf = CordRepBtree::Create(flats.front());
+
+  for (size_t i = 1; i < CordRepBtree::kMaxCapacity; ++i) {
+    refs.RefIf(shared(), leaf);
+    CordRepBtree* result;
+    if (i % 2 != 0) {
+      flats.push_front(MakeHexFlat(i));
+      result = CordRepBtree::Prepend(leaf, flats.front());
+    } else {
+      flats.push_back(MakeHexFlat(i));
+      result = CordRepBtree::Append(leaf, flats.back());
+    }
+    EXPECT_THAT(result->height(), Eq(0));
+    EXPECT_THAT(result, Conditional(shared(), Ne(leaf), Eq(leaf)));
+    EXPECT_THAT(result->Edges(), ElementsAreArray(flats));
+    leaf = result;
+  }
+  CordRep::Unref(leaf);
+}
+
+TEST_P(CordRepBtreeTest, AppendToLeafBeyondCapacity) {
+  AutoUnref refs;
+  auto* leaf = MakeLeaf();
+  refs.RefIf(shared(), leaf);
+  CordRep* flat = MakeFlat("abc");
+  auto* result = CordRepBtree::Append(leaf, flat);
+  ASSERT_THAT(result, IsNode(1));
+  EXPECT_THAT(result, Ne(leaf));
+  absl::Span<CordRep* const> edges = result->Edges();
+  ASSERT_THAT(edges, ElementsAre(leaf, IsNode(0)));
+  EXPECT_THAT(edges[1]->btree()->Edges(), ElementsAre(flat));
+  CordRep::Unref(result);
+}
+
+TEST_P(CordRepBtreeTest, PrependToLeafBeyondCapacity) {
+  AutoUnref refs;
+  auto* leaf = MakeLeaf();
+  refs.RefIf(shared(), leaf);
+  CordRep* flat = MakeFlat("abc");
+  auto* result = CordRepBtree::Prepend(leaf, flat);
+  ASSERT_THAT(result, IsNode(1));
+  EXPECT_THAT(result, Ne(leaf));
+  absl::Span<CordRep* const> edges = result->Edges();
+  ASSERT_THAT(edges, ElementsAre(IsNode(0), leaf));
+  EXPECT_THAT(edges[0]->btree()->Edges(), ElementsAre(flat));
+  CordRep::Unref(result);
+}
+
+TEST_P(CordRepBtreeTest, AppendToTreeOneDeep) {
+  constexpr size_t max_cap = CordRepBtree::kMaxCapacity;
+  AutoUnref refs;
+  std::vector<CordRep*> flats;
+  flats.push_back(MakeHexFlat(0));
+  CordRepBtree* tree = CordRepBtree::Create(flats.back());
+  for (size_t i = 1; i <= max_cap; ++i) {
+    flats.push_back(MakeHexFlat(i));
+    tree = CordRepBtree::Append(tree, flats.back());
+  }
+  ASSERT_THAT(tree, IsNode(1));
+
+  for (size_t i = max_cap + 1; i < max_cap * max_cap; ++i) {
+    // Ref top level tree based on param.
+    // Ref leaf node once every 4 iterations, which should not have an
+    // observable effect other than that the leaf itself is copied.
+    refs.RefIf(shared(), tree);
+    refs.RefIf(i % 4 == 0, tree->Edges().back());
+
+    flats.push_back(MakeHexFlat(i));
+    CordRepBtree* result = CordRepBtree::Append(tree, flats.back());
+    ASSERT_THAT(result, IsNode(1));
+    ASSERT_THAT(result, Conditional(shared(), Ne(tree), Eq(tree)));
+    std::vector<CordRep*> edges = GetLeafEdges(result);
+    ASSERT_THAT(edges, ElementsAreArray(flats));
+    tree = result;
+  }
+  CordRep::Unref(tree);
+}
+
+TEST_P(CordRepBtreeTest, AppendToTreeTwoDeep) {
+  constexpr size_t max_cap = CordRepBtree::kMaxCapacity;
+  AutoUnref refs;
+  std::vector<CordRep*> flats;
+  flats.push_back(MakeHexFlat(0));
+  CordRepBtree* tree = CordRepBtree::Create(flats.back());
+  for (size_t i = 1; i <= max_cap * max_cap; ++i) {
+    flats.push_back(MakeHexFlat(i));
+    tree = CordRepBtree::Append(tree, flats.back());
+  }
+  ASSERT_THAT(tree, IsNode(2));
+  for (size_t i = max_cap * max_cap + 1; i < max_cap * max_cap * max_cap; ++i) {
+    // Ref top level tree based on param.
+    // Ref child node once every 16 iterations, and leaf node every 4
+    // iterrations which  which should not have an observable effect other than
+    //  the node and/or the leaf below it being copied.
+    refs.RefIf(shared(), tree);
+    refs.RefIf(i % 16 == 0, tree->Edges().back());
+    refs.RefIf(i % 4 == 0, tree->Edges().back()->btree()->Edges().back());
+
+    flats.push_back(MakeHexFlat(i));
+    CordRepBtree* result = CordRepBtree::Append(tree, flats.back());
+    ASSERT_THAT(result, IsNode(2));
+    ASSERT_THAT(result, Conditional(shared(), Ne(tree), Eq(tree)));
+    std::vector<CordRep*> edges = GetLeafEdges(result);
+    ASSERT_THAT(edges, ElementsAreArray(flats));
+    tree = result;
+  }
+  CordRep::Unref(tree);
+}
+
+TEST_P(CordRepBtreeTest, PrependToTreeOneDeep) {
+  constexpr size_t max_cap = CordRepBtree::kMaxCapacity;
+  AutoUnref refs;
+  std::deque<CordRep*> flats;
+  flats.push_back(MakeHexFlat(0));
+  CordRepBtree* tree = CordRepBtree::Create(flats.back());
+  for (size_t i = 1; i <= max_cap; ++i) {
+    flats.push_front(MakeHexFlat(i));
+    tree = CordRepBtree::Prepend(tree, flats.front());
+  }
+  ASSERT_THAT(tree, IsNode(1));
+
+  for (size_t i = max_cap + 1; i < max_cap * max_cap; ++i) {
+    // Ref top level tree based on param.
+    // Ref leaf node once every 4 iterations which should not have an observable
+    // effect other than than the leaf itself is copied.
+    refs.RefIf(shared(), tree);
+    refs.RefIf(i % 4 == 0, tree->Edges().back());
+
+    flats.push_front(MakeHexFlat(i));
+    CordRepBtree* result = CordRepBtree::Prepend(tree, flats.front());
+    ASSERT_THAT(result, IsNode(1));
+    ASSERT_THAT(result, Conditional(shared(), Ne(tree), Eq(tree)));
+    std::vector<CordRep*> edges = GetLeafEdges(result);
+    ASSERT_THAT(edges, ElementsAreArray(flats));
+    tree = result;
+  }
+  CordRep::Unref(tree);
+}
+
+TEST_P(CordRepBtreeTest, PrependToTreeTwoDeep) {
+  constexpr size_t max_cap = CordRepBtree::kMaxCapacity;
+  AutoUnref refs;
+  std::deque<CordRep*> flats;
+  flats.push_back(MakeHexFlat(0));
+  CordRepBtree* tree = CordRepBtree::Create(flats.back());
+  for (size_t i = 1; i <= max_cap * max_cap; ++i) {
+    flats.push_front(MakeHexFlat(i));
+    tree = CordRepBtree::Prepend(tree, flats.front());
+  }
+  ASSERT_THAT(tree, IsNode(2));
+  for (size_t i = max_cap * max_cap + 1; i < max_cap * max_cap * max_cap; ++i) {
+    // Ref top level tree based on param.
+    // Ref child node once every 16 iterations, and leaf node every 4
+    // iterrations which  which should not have an observable effect other than
+    //  the node and/or the leaf below it being copied.
+    refs.RefIf(shared(), tree);
+    refs.RefIf(i % 16 == 0, tree->Edges().back());
+    refs.RefIf(i % 4 == 0, tree->Edges().back()->btree()->Edges().back());
+
+    flats.push_front(MakeHexFlat(i));
+    CordRepBtree* result = CordRepBtree::Prepend(tree, flats.front());
+    ASSERT_THAT(result, IsNode(2));
+    ASSERT_THAT(result, Conditional(shared(), Ne(tree), Eq(tree)));
+    std::vector<CordRep*> edges = GetLeafEdges(result);
+    ASSERT_THAT(edges, ElementsAreArray(flats));
+    tree = result;
+  }
+  CordRep::Unref(tree);
+}
+
+TEST_P(CordRepBtreeDualTest, MergeLeafsNotExceedingCapacity) {
+  for (bool use_append : {false, true}) {
+    SCOPED_TRACE(use_append ? "Using Append" : "Using Prepend");
+
+    AutoUnref refs;
+    std::vector<CordRep*> flats;
+
+    // Build `left` side leaf appending all contained flats to `flats`
+    CordRepBtree* left = MakeLeaf(3);
+    GetLeafEdges(left, flats);
+    refs.RefIf(first_shared(), left);
+
+    // Build `right` side leaf appending all contained flats to `flats`
+    CordRepBtree* right = MakeLeaf(2);
+    GetLeafEdges(right, flats);
+    refs.RefIf(second_shared(), right);
+
+    CordRepBtree* tree = use_append ? CordRepBtree::Append(left, right)
+                                    : CordRepBtree::Prepend(right, left);
+    EXPECT_THAT(tree, IsNode(0));
+
+    // `tree` contains all flats originally belonging to `left` and `right`.
+    EXPECT_THAT(tree->Edges(), ElementsAreArray(flats));
+    CordRepBtree::Unref(tree);
+  }
+}
+
+TEST_P(CordRepBtreeDualTest, MergeLeafsExceedingCapacity) {
+  for (bool use_append : {false, true}) {
+    SCOPED_TRACE(use_append ? "Using Append" : "Using Prepend");
+
+    AutoUnref refs;
+
+    // Build `left` side tree appending all contained flats to `flats`
+    CordRepBtree* left = MakeLeaf(CordRepBtree::kMaxCapacity - 2);
+    refs.RefIf(first_shared(), left);
+
+    // Build `right` side tree appending all contained flats to `flats`
+    CordRepBtree* right = MakeLeaf(CordRepBtree::kMaxCapacity - 1);
+    refs.RefIf(second_shared(), right);
+
+    CordRepBtree* tree = use_append ? CordRepBtree::Append(left, right)
+                                    : CordRepBtree::Prepend(right, left);
+    EXPECT_THAT(tree, IsNode(1));
+    EXPECT_THAT(tree->Edges(), ElementsAre(left, right));
+    CordRepBtree::Unref(tree);
+  }
+}
+
+TEST_P(CordRepBtreeDualTest, MergeEqualHeightTrees) {
+  for (bool use_append : {false, true}) {
+    SCOPED_TRACE(use_append ? "Using Append" : "Using Prepend");
+
+    AutoUnref refs;
+    std::vector<CordRep*> flats;
+
+    // Build `left` side tree appending all contained flats to `flats`
+    CordRepBtree* left = MakeTree(CordRepBtree::kMaxCapacity * 3);
+    GetLeafEdges(left, flats);
+    refs.RefIf(first_shared(), left);
+
+    // Build `right` side tree appending all contained flats to `flats`
+    CordRepBtree* right = MakeTree(CordRepBtree::kMaxCapacity * 2);
+    GetLeafEdges(right, flats);
+    refs.RefIf(second_shared(), right);
+
+    CordRepBtree* tree = use_append ? CordRepBtree::Append(left, right)
+                                    : CordRepBtree::Prepend(right, left);
+    EXPECT_THAT(tree, IsNode(1));
+    EXPECT_THAT(tree->Edges(), SizeIs(5));
+
+    // `tree` contains all flats originally belonging to `left` and `right`.
+    EXPECT_THAT(GetLeafEdges(tree), ElementsAreArray(flats));
+    CordRepBtree::Unref(tree);
+  }
+}
+
+TEST_P(CordRepBtreeDualTest, MergeLeafWithTreeNotExceedingLeafCapacity) {
+  for (bool use_append : {false, true}) {
+    SCOPED_TRACE(use_append ? "Using Append" : "Using Prepend");
+
+    AutoUnref refs;
+    std::vector<CordRep*> flats;
+
+    // Build `left` side tree appending all added flats to `flats`
+    CordRepBtree* left = MakeTree(CordRepBtree::kMaxCapacity * 2 + 2);
+    GetLeafEdges(left, flats);
+    refs.RefIf(first_shared(), left);
+
+    // Build `right` side tree appending all added flats to `flats`
+    CordRepBtree* right = MakeTree(3);
+    GetLeafEdges(right, flats);
+    refs.RefIf(second_shared(), right);
+
+    CordRepBtree* tree = use_append ? CordRepBtree::Append(left, right)
+                                    : CordRepBtree::Prepend(right, left);
+    EXPECT_THAT(tree, IsNode(1));
+    EXPECT_THAT(tree->Edges(), SizeIs(3));
+
+    // `tree` contains all flats originally belonging to `left` and `right`.
+    EXPECT_THAT(GetLeafEdges(tree), ElementsAreArray(flats));
+    CordRepBtree::Unref(tree);
+  }
+}
+
+TEST_P(CordRepBtreeDualTest, MergeLeafWithTreeExceedingLeafCapacity) {
+  for (bool use_append : {false, true}) {
+    SCOPED_TRACE(use_append ? "Using Append" : "Using Prepend");
+
+    AutoUnref refs;
+    std::vector<CordRep*> flats;
+
+    // Build `left` side tree appending all added flats to `flats`
+    CordRepBtree* left = MakeTree(CordRepBtree::kMaxCapacity * 3 - 2);
+    GetLeafEdges(left, flats);
+    refs.RefIf(first_shared(), left);
+
+    // Build `right` side tree appending all added flats to `flats`
+    CordRepBtree* right = MakeTree(3);
+    GetLeafEdges(right, flats);
+    refs.RefIf(second_shared(), right);
+
+    CordRepBtree* tree = use_append ? CordRepBtree::Append(left, right)
+                                    : CordRepBtree::Prepend(right, left);
+    EXPECT_THAT(tree, IsNode(1));
+    EXPECT_THAT(tree->Edges(), SizeIs(4));
+
+    // `tree` contains all flats originally belonging to `left` and `right`.
+    EXPECT_THAT(GetLeafEdges(tree), ElementsAreArray(flats));
+    CordRepBtree::Unref(tree);
+  }
+}
+
+void RefEdgesAt(size_t depth, AutoUnref& refs, CordRepBtree* tree) {
+  absl::Span<CordRep* const> edges = tree->Edges();
+  if (depth == 0) {
+    refs.Ref(edges.front());
+    refs.Ref(edges.back());
+  } else {
+    assert(tree->height() > 0);
+    RefEdgesAt(depth - 1, refs, edges.front()->btree());
+    RefEdgesAt(depth - 1, refs, edges.back()->btree());
+  }
+}
+
+TEST(CordRepBtreeTest, MergeFuzzTest) {
+  constexpr size_t max_cap = CordRepBtree::kMaxCapacity;
+  std::minstd_rand rnd;
+  std::uniform_int_distribution<int> coin_flip(0, 1);
+  std::uniform_int_distribution<int> dice_throw(1, 6);
+
+  auto random_leaf_count = [&]() {
+    std::uniform_int_distribution<int> dist_height(0, 3);
+    std::uniform_int_distribution<int> dist_leaf(0, max_cap - 1);
+    const size_t height = dist_height(rnd);
+    return (height ? pow(max_cap, height) : 0) + dist_leaf(rnd);
+  };
+
+  for (int i = 0; i < 10000; ++i) {
+    AutoUnref refs;
+    std::vector<CordRep*> flats;
+
+    CordRepBtree* left = MakeTree(random_leaf_count(), coin_flip(rnd));
+    GetLeafEdges(left, flats);
+    if (dice_throw(rnd) == 1) {
+      std::uniform_int_distribution<int> dist(0, left->height());
+      RefEdgesAt(dist(rnd), refs, left);
+    }
+
+    CordRepBtree* right = MakeTree(random_leaf_count(), coin_flip(rnd));
+    GetLeafEdges(right, flats);
+    if (dice_throw(rnd) == 1) {
+      std::uniform_int_distribution<int> dist(0, right->height());
+      RefEdgesAt(dist(rnd), refs, right);
+    }
+
+    CordRepBtree* tree = CordRepBtree::Append(left, right);
+    EXPECT_THAT(GetLeafEdges(tree), ElementsAreArray(flats));
+    CordRepBtree::Unref(tree);
+  }
+}
+
+TEST(CordRepBtreeTest, SubTree) {
+  // Create tree of at least 2 levels high
+  constexpr size_t max_cap = CordRepBtree::kMaxCapacity;
+  const size_t n = max_cap * max_cap * 2;
+  const std::string data = CreateRandomString(n * 3);
+  std::vector<CordRep*> flats;
+  for (absl::string_view s = data; !s.empty(); s.remove_prefix(3)) {
+    flats.push_back(MakeFlat(s.substr(0, 3)));
+  }
+  CordRepBtree* node = CordRepBtree::Create(CordRep::Ref(flats[0]));
+  for (size_t i = 1; i < flats.size(); ++i) {
+    node = CordRepBtree::Append(node, CordRep::Ref(flats[i]));
+  }
+
+  for (int offset = 0; offset < data.length(); ++offset) {
+    for (int length = 1; length <= data.length() - offset; ++length) {
+      CordRep* rep = node->SubTree(offset, length);
+      EXPECT_THAT(CordToString(rep), Eq(data.substr(offset, length)));
+      CordRep::Unref(rep);
+    }
+  }
+  CordRepBtree::Unref(node);
+  for (CordRep* rep : flats) {
+    CordRep::Unref(rep);
+  }
+}
+
+TEST(CordRepBtreeTest, SubTreeOnExistingSubstring) {
+  // This test verifies that a SubTree call on a pre-existing (large) substring
+  // adjusts the existing substring if not shared, and else rewrites the
+  // existing substring.
+  AutoUnref refs;
+  std::string data = CreateRandomString(1000);
+  CordRepBtree* leaf = CordRepBtree::Create(MakeFlat("abc"));
+  CordRep* flat = MakeFlat(data);
+  leaf = CordRepBtree::Append(leaf, flat);
+
+  // Setup tree containing substring.
+  CordRep* result = leaf->SubTree(0, 3 + 990);
+  ASSERT_THAT(result->tag, Eq(BTREE));
+  CordRep::Unref(leaf);
+  leaf = result->btree();
+  ASSERT_THAT(leaf->Edges(), ElementsAre(_, IsSubstring(0, 990)));
+  EXPECT_THAT(leaf->Edges()[1]->substring()->child, Eq(flat));
+
+  // Verify substring of substring.
+  result = leaf->SubTree(3 + 5, 970);
+  ASSERT_THAT(result, IsSubstring(5, 970));
+  EXPECT_THAT(result->substring()->child, Eq(flat));
+  CordRep::Unref(result);
+
+  CordRep::Unref(leaf);
+}
+
+TEST_P(CordRepBtreeTest, AddDataToLeaf) {
+  const size_t n = CordRepBtree::kMaxCapacity;
+  const std::string data = CreateRandomString(n * 3);
+
+  for (bool append : {true, false}) {
+    AutoUnref refs;
+    DataConsumer consumer(data, append);
+    SCOPED_TRACE(append ? "Append" : "Prepend");
+
+    CordRepBtree* leaf = CordRepBtree::Create(MakeFlat(consumer.Next(3)));
+    for (size_t i = 1; i < n; ++i) {
+      refs.RefIf(shared(), leaf);
+      CordRepBtree* result = BtreeAdd(leaf, append, consumer.Next(3));
+      EXPECT_THAT(result, Conditional(shared(), Ne(leaf), Eq(leaf)));
+      EXPECT_THAT(CordToString(result), Eq(consumer.Consumed()));
+      leaf = result;
+    }
+    CordRep::Unref(leaf);
+  }
+}
+
+TEST_P(CordRepBtreeTest, AppendDataToTree) {
+  AutoUnref refs;
+  size_t n = CordRepBtree::kMaxCapacity + CordRepBtree::kMaxCapacity / 2;
+  std::string data = CreateRandomString(n * 3);
+  CordRepBtree* tree = refs.RefIf(shared(), CreateTree(data, 3));
+  CordRepBtree* leaf0 = tree->Edges()[0]->btree();
+  CordRepBtree* leaf1 = tree->Edges()[1]->btree();
+  CordRepBtree* result = CordRepBtree::Append(tree, "123456789");
+  EXPECT_THAT(result, Conditional(shared(), Ne(tree), Eq(tree)));
+  EXPECT_THAT(result->Edges(),
+              ElementsAre(leaf0, Conditional(shared(), Ne(leaf1), Eq(leaf1))));
+  EXPECT_THAT(CordToString(result), Eq(data + "123456789"));
+  CordRep::Unref(result);
+}
+
+TEST_P(CordRepBtreeTest, PrependDataToTree) {
+  AutoUnref refs;
+  size_t n = CordRepBtree::kMaxCapacity + CordRepBtree::kMaxCapacity / 2;
+  std::string data = CreateRandomString(n * 3);
+  CordRepBtree* tree = refs.RefIf(shared(), CreateTreeReverse(data, 3));
+  CordRepBtree* leaf0 = tree->Edges()[0]->btree();
+  CordRepBtree* leaf1 = tree->Edges()[1]->btree();
+  CordRepBtree* result = CordRepBtree::Prepend(tree, "123456789");
+  EXPECT_THAT(result, Conditional(shared(), Ne(tree), Eq(tree)));
+  EXPECT_THAT(result->Edges(),
+              ElementsAre(Conditional(shared(), Ne(leaf0), Eq(leaf0)), leaf1));
+  EXPECT_THAT(CordToString(result), Eq("123456789" + data));
+  CordRep::Unref(result);
+}
+
+TEST_P(CordRepBtreeTest, AddDataToTreeThreeLevelsDeep) {
+  constexpr size_t max_cap = CordRepBtree::kMaxCapacity;
+  const size_t n = max_cap * max_cap * max_cap;
+  const std::string data = CreateRandomString(n * 3);
+
+  for (bool append : {true, false}) {
+    AutoUnref refs;
+    DataConsumer consumer(data, append);
+    SCOPED_TRACE(append ? "Append" : "Prepend");
+
+    // Fill leaf
+    CordRepBtree* tree = CordRepBtree::Create(MakeFlat(consumer.Next(3)));
+    for (size_t i = 1; i < max_cap; ++i) {
+      tree = BtreeAdd(tree, append, consumer.Next(3));
+    }
+    ASSERT_THAT(CordToString(tree), Eq(consumer.Consumed()));
+
+    // Fill to maximum at one deep
+    refs.RefIf(shared(), tree);
+    CordRepBtree* result = BtreeAdd(tree, append, consumer.Next(3));
+    ASSERT_THAT(result, IsNode(1));
+    ASSERT_THAT(result, Ne(tree));
+    ASSERT_THAT(CordToString(result), Eq(consumer.Consumed()));
+    tree = result;
+    for (size_t i = max_cap + 1; i < max_cap * max_cap; ++i) {
+      refs.RefIf(shared(), tree);
+      result = BtreeAdd(tree, append, consumer.Next(3));
+      ASSERT_THAT(result, Conditional(shared(), Ne(tree), Eq(tree)));
+      ASSERT_THAT(CordToString(result), Eq(consumer.Consumed()));
+      tree = result;
+    }
+
+    // Fill to maximum at two deep
+    refs.RefIf(shared(), tree);
+    result = BtreeAdd(tree, append, consumer.Next(3));
+    ASSERT_THAT(result, IsNode(2));
+    ASSERT_THAT(result, Ne(tree));
+    ASSERT_THAT(CordToString(result), Eq(consumer.Consumed()));
+    tree = result;
+    for (size_t i = max_cap * max_cap + 1; i < max_cap * max_cap * max_cap;
+         ++i) {
+      refs.RefIf(shared(), tree);
+      result = BtreeAdd(tree, append, consumer.Next(3));
+      ASSERT_THAT(result, Conditional(shared(), Ne(tree), Eq(tree)));
+      ASSERT_THAT(CordToString(result), Eq(consumer.Consumed()));
+      tree = result;
+    }
+
+    CordRep::Unref(tree);
+  }
+}
+
+TEST_P(CordRepBtreeTest, AddLargeDataToLeaf) {
+  const size_t max_cap = CordRepBtree::kMaxCapacity;
+  const size_t n = max_cap * max_cap * max_cap * 3 + 2;
+  const std::string data = CreateRandomString(n * kMaxFlatLength);
+
+  for (bool append : {true, false}) {
+    AutoUnref refs;
+    SCOPED_TRACE(append ? "Append" : "Prepend");
+
+    CordRepBtree* leaf = CordRepBtree::Create(MakeFlat("abc"));
+    refs.RefIf(shared(), leaf);
+    CordRepBtree* result = BtreeAdd(leaf, append, data);
+    EXPECT_THAT(CordToString(result), Eq(append ? "abc" + data : data + "abc"));
+    CordRep::Unref(result);
+  }
+}
+
+TEST_P(CordRepBtreeDualTest, CreateFromConcat) {
+  AutoUnref refs;
+  CordRep* flats[] = {MakeFlat("abcdefgh"), MakeFlat("ijklm"),
+                      MakeFlat("nopqrstuv"), MakeFlat("wxyz")};
+  auto* left = MakeConcat(flats[0], flats[1]);
+  auto* right = MakeConcat(flats[2], refs.RefIf(first_shared(), flats[3]));
+  auto* concat = refs.RefIf(second_shared(), MakeConcat(left, right));
+  CordRepBtree* result = CordRepBtree::Create(concat);
+  ASSERT_TRUE(CordRepBtree::IsValid(result));
+  EXPECT_THAT(result->length, Eq(26));
+  EXPECT_THAT(CordToString(result), Eq("abcdefghijklmnopqrstuvwxyz"));
+  CordRep::Unref(result);
+}
+
+TEST_P(CordRepBtreeDualTest, AppendConcat) {
+  AutoUnref refs;
+  CordRep* flats[] = {MakeFlat("defgh"), MakeFlat("ijklm"),
+                      MakeFlat("nopqrstuv"), MakeFlat("wxyz")};
+  auto* left = MakeConcat(flats[0], flats[1]);
+  auto* right = MakeConcat(flats[2], refs.RefIf(first_shared(), flats[3]));
+  auto* concat = refs.RefIf(second_shared(), MakeConcat(left, right));
+  CordRepBtree* result = CordRepBtree::Create(MakeFlat("abc"));
+  result = CordRepBtree::Append(result, concat);
+  ASSERT_TRUE(CordRepBtree::IsValid(result));
+  EXPECT_THAT(result->length, Eq(26));
+  EXPECT_THAT(CordToString(result), Eq("abcdefghijklmnopqrstuvwxyz"));
+  CordRep::Unref(result);
+}
+
+TEST_P(CordRepBtreeDualTest, PrependConcat) {
+  AutoUnref refs;
+  CordRep* flats[] = {MakeFlat("abcdefgh"), MakeFlat("ijklm"),
+                      MakeFlat("nopqrstuv"), MakeFlat("wx")};
+  auto* left = MakeConcat(flats[0], flats[1]);
+  auto* right = MakeConcat(flats[2], refs.RefIf(first_shared(), flats[3]));
+  auto* concat = refs.RefIf(second_shared(), MakeConcat(left, right));
+  CordRepBtree* result = CordRepBtree::Create(MakeFlat("yz"));
+  result = CordRepBtree::Prepend(result, concat);
+  ASSERT_TRUE(CordRepBtree::IsValid(result));
+  EXPECT_THAT(result->length, Eq(26));
+  EXPECT_THAT(CordToString(result), Eq("abcdefghijklmnopqrstuvwxyz"));
+  CordRep::Unref(result);
+}
+
+TEST_P(CordRepBtreeTest, CreateFromTreeReturnsTree) {
+  AutoUnref refs;
+  CordRepBtree* leaf = CordRepBtree::Create(MakeFlat("Hello world"));
+  refs.RefIf(shared(), leaf);
+  CordRepBtree* result = CordRepBtree::Create(leaf);
+  EXPECT_THAT(result, Eq(leaf));
+  CordRep::Unref(result);
+}
+
+TEST_P(CordRepBtreeTest, ExceedMaxHeight) {
+  AutoUnref refs;
+  CordRepBtree* tree = MakeLeaf();
+  for (int h = 1; h <= CordRepBtree::kMaxHeight; ++h) {
+    CordRepBtree* newtree = CordRepBtree::New(tree);
+    for (size_t i = 1; i < CordRepBtree::kMaxCapacity; ++i) {
+      newtree = CordRepBtree::Append(newtree, CordRep::Ref(tree));
+    }
+    tree = newtree;
+  }
+  refs.RefIf(shared(), tree);
+#if defined(GTEST_HAS_DEATH_TEST)
+  EXPECT_DEATH(tree = CordRepBtree::Append(tree, MakeFlat("Boom")), ".*");
+#endif
+  CordRep::Unref(tree);
+}
+
+TEST(CordRepBtreeTest, GetCharacter) {
+  size_t n = CordRepBtree::kMaxCapacity * CordRepBtree::kMaxCapacity + 2;
+  std::string data = CreateRandomString(n * 3);
+  CordRepBtree* tree = CreateTree(data, 3);
+  // Add a substring node for good measure.
+  tree = tree->Append(tree, MakeSubstring(4, 5, MakeFlat("abcdefghijklm")));
+  data += "efghi";
+  for (size_t i = 0; i < data.length(); ++i) {
+    ASSERT_THAT(tree->GetCharacter(i), Eq(data[i]));
+  }
+  CordRep::Unref(tree);
+}
+
+TEST_P(CordRepBtreeTest, IsFlatSingleFlat) {
+  CordRepBtree* leaf = CordRepBtree::Create(MakeFlat("Hello world"));
+
+  absl::string_view fragment;
+  EXPECT_TRUE(leaf->IsFlat(nullptr));
+  EXPECT_TRUE(leaf->IsFlat(&fragment));
+  EXPECT_THAT(fragment, Eq("Hello world"));
+  fragment = "";
+  EXPECT_TRUE(leaf->IsFlat(0, 11, nullptr));
+  EXPECT_TRUE(leaf->IsFlat(0, 11, &fragment));
+  EXPECT_THAT(fragment, Eq("Hello world"));
+
+  // Arbitrary ranges must check true as well.
+  EXPECT_TRUE(leaf->IsFlat(1, 4, &fragment));
+  EXPECT_THAT(fragment, Eq("ello"));
+  EXPECT_TRUE(leaf->IsFlat(6, 5, &fragment));
+  EXPECT_THAT(fragment, Eq("world"));
+
+  CordRep::Unref(leaf);
+}
+
+TEST(CordRepBtreeTest, IsFlatMultiFlat) {
+  size_t n = CordRepBtree::kMaxCapacity * CordRepBtree::kMaxCapacity + 2;
+  std::string data = CreateRandomString(n * 3);
+  CordRepBtree* tree = CreateTree(data, 3);
+  // Add substring nodes for good measure.
+  tree = tree->Append(tree, MakeSubstring(4, 3, MakeFlat("abcdefghijklm")));
+  tree = tree->Append(tree, MakeSubstring(8, 3, MakeFlat("abcdefghijklm")));
+  data += "efgijk";
+
+  EXPECT_FALSE(tree->IsFlat(nullptr));
+  absl::string_view fragment = "Can't touch this";
+  EXPECT_FALSE(tree->IsFlat(&fragment));
+  EXPECT_THAT(fragment, Eq("Can't touch this"));
+
+  for (size_t offset = 0; offset < data.size(); offset += 3) {
+    EXPECT_TRUE(tree->IsFlat(offset, 3, nullptr));
+    EXPECT_TRUE(tree->IsFlat(offset, 3, &fragment));
+    EXPECT_THAT(fragment, Eq(data.substr(offset, 3)));
+
+    fragment = "Can't touch this";
+    if (offset > 0) {
+      EXPECT_FALSE(tree->IsFlat(offset - 1, 4, nullptr));
+      EXPECT_FALSE(tree->IsFlat(offset - 1, 4, &fragment));
+      EXPECT_THAT(fragment, Eq("Can't touch this"));
+    }
+    if (offset < data.size() - 4) {
+      EXPECT_FALSE(tree->IsFlat(offset, 4, nullptr));
+      EXPECT_FALSE(tree->IsFlat(offset, 4, &fragment));
+      EXPECT_THAT(fragment, Eq("Can't touch this"));
+    }
+  }
+
+  CordRep::Unref(tree);
+}
+
+#if defined(GTEST_HAS_DEATH_TEST) && !defined(NDEBUG)
+
+TEST_P(CordRepBtreeHeightTest, GetAppendBufferNotPrivate) {
+  CordRepBtree* tree = CordRepBtree::Create(MakeExternal("Foo"));
+  CordRepBtree::Ref(tree);
+  EXPECT_DEATH(tree->GetAppendBuffer(1), ".*");
+  CordRepBtree::Unref(tree);
+  CordRepBtree::Unref(tree);
+}
+
+#endif  // defined(GTEST_HAS_DEATH_TEST) && !defined(NDEBUG)
+
+TEST_P(CordRepBtreeHeightTest, GetAppendBufferNotFlat) {
+  CordRepBtree* tree = CordRepBtree::Create(MakeExternal("Foo"));
+  for (int i = 1; i <= height(); ++i) {
+    tree = CordRepBtree::New(tree);
+  }
+  EXPECT_THAT(tree->GetAppendBuffer(1), SizeIs(0));
+  CordRepBtree::Unref(tree);
+}
+
+TEST_P(CordRepBtreeHeightTest, GetAppendBufferFlatNotPrivate) {
+  CordRepFlat* flat = MakeFlat("abc");
+  CordRepBtree* tree = CordRepBtree::Create(CordRep::Ref(flat));
+  for (int i = 1; i <= height(); ++i) {
+    tree = CordRepBtree::New(tree);
+  }
+  EXPECT_THAT(tree->GetAppendBuffer(1), SizeIs(0));
+  CordRepBtree::Unref(tree);
+  CordRep::Unref(flat);
+}
+
+TEST_P(CordRepBtreeHeightTest, GetAppendBufferTreeNotPrivate) {
+  if (height() == 0) return;
+  AutoUnref refs;
+  CordRepFlat* flat = MakeFlat("abc");
+  CordRepBtree* tree = CordRepBtree::Create(CordRep::Ref(flat));
+  for (int i = 1; i <= height(); ++i) {
+    if (i == (height() + 1) / 2) refs.Ref(tree);
+    tree = CordRepBtree::New(tree);
+  }
+  EXPECT_THAT(tree->GetAppendBuffer(1), SizeIs(0));
+  CordRepBtree::Unref(tree);
+  CordRep::Unref(flat);
+}
+
+TEST_P(CordRepBtreeHeightTest, GetAppendBufferFlatNoCapacity) {
+  CordRepFlat* flat = MakeFlat("abc");
+  flat->length = flat->Capacity();
+  CordRepBtree* tree = CordRepBtree::Create(flat);
+  for (int i = 1; i <= height(); ++i) {
+    tree = CordRepBtree::New(tree);
+  }
+  EXPECT_THAT(tree->GetAppendBuffer(1), SizeIs(0));
+  CordRepBtree::Unref(tree);
+}
+
+TEST_P(CordRepBtreeHeightTest, GetAppendBufferFlatWithCapacity) {
+  CordRepFlat* flat = MakeFlat("abc");
+  CordRepBtree* tree = CordRepBtree::Create(flat);
+  for (int i = 1; i <= height(); ++i) {
+    tree = CordRepBtree::New(tree);
+  }
+  absl::Span<char> span = tree->GetAppendBuffer(2);
+  EXPECT_THAT(span, SizeIs(2));
+  EXPECT_THAT(span.data(), TypedEq<void*>(flat->Data() + 3));
+  EXPECT_THAT(tree->length, Eq(5));
+
+  size_t avail = flat->Capacity() - 5;
+  span = tree->GetAppendBuffer(avail + 100);
+  EXPECT_THAT(span, SizeIs(avail));
+  EXPECT_THAT(span.data(), TypedEq<void*>(flat->Data() + 5));
+  EXPECT_THAT(tree->length, Eq(5 + avail));
+
+  CordRepBtree::Unref(tree);
+}
+
+TEST(CordRepBtreeTest, Dump) {
+  // Handles nullptr
+  std::stringstream ss;
+  CordRepBtree::Dump(nullptr, ss);
+  CordRepBtree::Dump(nullptr, "Once upon a label", ss);
+  CordRepBtree::Dump(nullptr, "Once upon a label", false, ss);
+  CordRepBtree::Dump(nullptr, "Once upon a label", true, ss);
+
+  // Cover legal edges
+  CordRepFlat* flat = MakeFlat("Hello world");
+  CordRepExternal* external = MakeExternal("Hello external");
+  CordRep* substr_flat = MakeSubstring(1, 6, CordRep::Ref(flat));
+  CordRep* substr_external = MakeSubstring(2, 7, CordRep::Ref(external));
+
+  // Build tree
+  CordRepBtree* tree = CordRepBtree::Create(flat);
+  tree = CordRepBtree::Append(tree, external);
+  tree = CordRepBtree::Append(tree, substr_flat);
+  tree = CordRepBtree::Append(tree, substr_external);
+
+  // Repeat until we have a tree
+  while (tree->height() == 0) {
+    tree = CordRepBtree::Append(tree, CordRep::Ref(flat));
+    tree = CordRepBtree::Append(tree, CordRep::Ref(external));
+    tree = CordRepBtree::Append(tree, CordRep::Ref(substr_flat));
+    tree = CordRepBtree::Append(tree, CordRep::Ref(substr_external));
+  }
+
+  for (int api = 0; api <= 3; ++api) {
+    absl::string_view api_scope;
+    std::stringstream ss;
+    switch (api) {
+      case 0:
+        api_scope = "Bare";
+        CordRepBtree::Dump(tree, ss);
+        break;
+      case 1:
+        api_scope = "Label only";
+        CordRepBtree::Dump(tree, "Once upon a label", ss);
+        break;
+      case 2:
+        api_scope = "Label no content";
+        CordRepBtree::Dump(tree, "Once upon a label", false, ss);
+        break;
+      default:
+        api_scope = "Label and content";
+        CordRepBtree::Dump(tree, "Once upon a label", true, ss);
+        break;
+    }
+    SCOPED_TRACE(api_scope);
+    std::string str = ss.str();
+
+    // Contains Node(depth) / Leaf and private / shared indicators
+    EXPECT_THAT(str, AllOf(HasSubstr("Node(1)"), HasSubstr("Leaf"),
+                           HasSubstr("Private"), HasSubstr("Shared")));
+
+    // Contains length and start offset of all data edges
+    EXPECT_THAT(str, AllOf(HasSubstr("len = 11"), HasSubstr("len = 14"),
+                           HasSubstr("len = 6"), HasSubstr("len = 7"),
+                           HasSubstr("start = 1"), HasSubstr("start = 2")));
+
+    // Contains address of all data edges
+    EXPECT_THAT(
+        str, AllOf(HasSubstr(absl::StrCat("0x", absl::Hex(flat))),
+                   HasSubstr(absl::StrCat("0x", absl::Hex(external))),
+                   HasSubstr(absl::StrCat("0x", absl::Hex(substr_flat))),
+                   HasSubstr(absl::StrCat("0x", absl::Hex(substr_external)))));
+
+    if (api != 0) {
+      // Contains label
+      EXPECT_THAT(str, HasSubstr("Once upon a label"));
+    }
+
+    if (api != 3) {
+      // Does not contain contents
+      EXPECT_THAT(str, Not(AnyOf((HasSubstr("data = \"Hello world\""),
+                                  HasSubstr("data = \"Hello external\""),
+                                  HasSubstr("data = \"ello w\""),
+                                  HasSubstr("data = \"llo ext\"")))));
+    } else {
+      // Contains contents
+      EXPECT_THAT(str, AllOf((HasSubstr("data = \"Hello world\""),
+                              HasSubstr("data = \"Hello external\""),
+                              HasSubstr("data = \"ello w\""),
+                              HasSubstr("data = \"llo ext\""))));
+    }
+  }
+
+  CordRep::Unref(tree);
+}
+
+TEST(CordRepBtreeTest, IsValid) {
+  EXPECT_FALSE(CordRepBtree::IsValid(nullptr));
+
+  CordRepBtree* empty = CordRepBtree::New(0);
+  EXPECT_TRUE(CordRepBtree::IsValid(empty));
+  CordRep::Unref(empty);
+
+  for (bool as_tree : {false, true}) {
+    CordRepBtree* leaf = CordRepBtree::Create(MakeFlat("abc"));
+    CordRepBtree* tree = as_tree ? CordRepBtree::New(leaf) : nullptr;
+    CordRepBtree* check = as_tree ? tree : leaf;
+
+    ASSERT_TRUE(CordRepBtree::IsValid(check));
+    leaf->length--;
+    EXPECT_FALSE(CordRepBtree::IsValid(check));
+    leaf->length++;
+
+    ASSERT_TRUE(CordRepBtree::IsValid(check));
+    leaf->tag--;
+    EXPECT_FALSE(CordRepBtree::IsValid(check));
+    leaf->tag++;
+
+    // Height
+    ASSERT_TRUE(CordRepBtree::IsValid(check));
+    leaf->storage[0] = static_cast<uint8_t>(CordRepBtree::kMaxHeight + 1);
+    EXPECT_FALSE(CordRepBtree::IsValid(check));
+    leaf->storage[0] = 1;
+    EXPECT_FALSE(CordRepBtree::IsValid(check));
+    leaf->storage[0] = 0;
+
+    // Begin
+    ASSERT_TRUE(CordRepBtree::IsValid(check));
+    const uint8_t begin = leaf->storage[1];
+    leaf->storage[1] = static_cast<uint8_t>(CordRepBtree::kMaxCapacity);
+    EXPECT_FALSE(CordRepBtree::IsValid(check));
+    leaf->storage[1] = 2;
+    EXPECT_FALSE(CordRepBtree::IsValid(check));
+    leaf->storage[1] = begin;
+
+    // End
+    ASSERT_TRUE(CordRepBtree::IsValid(check));
+    const uint8_t end = leaf->storage[2];
+    leaf->storage[2] = static_cast<uint8_t>(CordRepBtree::kMaxCapacity + 1);
+    EXPECT_FALSE(CordRepBtree::IsValid(check));
+    leaf->storage[2] = end;
+
+    // DataEdge tag and value
+    ASSERT_TRUE(CordRepBtree::IsValid(check));
+    CordRep* const edge = leaf->Edges()[0];
+    const uint8_t tag = edge->tag;
+    CordRepBtreeTestPeer::SetEdge(leaf, begin, nullptr);
+    EXPECT_FALSE(CordRepBtree::IsValid(check));
+    CordRepBtreeTestPeer::SetEdge(leaf, begin, edge);
+    edge->tag = BTREE;
+    EXPECT_FALSE(CordRepBtree::IsValid(check));
+    edge->tag = tag;
+
+    if (as_tree) {
+      ASSERT_TRUE(CordRepBtree::IsValid(check));
+      leaf->length--;
+      EXPECT_FALSE(CordRepBtree::IsValid(check));
+      leaf->length++;
+
+      // Height
+      ASSERT_TRUE(CordRepBtree::IsValid(check));
+      tree->storage[0] = static_cast<uint8_t>(2);
+      EXPECT_FALSE(CordRepBtree::IsValid(check));
+      tree->storage[0] = 1;
+
+      // Btree edge
+      ASSERT_TRUE(CordRepBtree::IsValid(check));
+      CordRep* const edge = tree->Edges()[0];
+      const uint8_t tag = edge->tag;
+      edge->tag = FLAT;
+      EXPECT_FALSE(CordRepBtree::IsValid(check));
+      edge->tag = tag;
+    }
+
+    ASSERT_TRUE(CordRepBtree::IsValid(check));
+    CordRep::Unref(check);
+  }
+}
+
+TEST(CordRepBtreeTest, AssertValid) {
+  CordRepBtree* tree = CordRepBtree::Create(MakeFlat("abc"));
+  const CordRepBtree* ctree = tree;
+  EXPECT_THAT(CordRepBtree::AssertValid(tree), Eq(tree));
+  EXPECT_THAT(CordRepBtree::AssertValid(ctree), Eq(ctree));
+
+#if defined(GTEST_HAS_DEATH_TEST)
+  CordRepBtree* nulltree = nullptr;
+  const CordRepBtree* cnulltree = nullptr;
+  EXPECT_DEBUG_DEATH(
+      EXPECT_THAT(CordRepBtree::AssertValid(nulltree), Eq(nulltree)), ".*");
+  EXPECT_DEBUG_DEATH(
+      EXPECT_THAT(CordRepBtree::AssertValid(cnulltree), Eq(cnulltree)), ".*");
+
+  tree->length--;
+  EXPECT_DEBUG_DEATH(EXPECT_THAT(CordRepBtree::AssertValid(tree), Eq(tree)),
+                     ".*");
+  EXPECT_DEBUG_DEATH(EXPECT_THAT(CordRepBtree::AssertValid(ctree), Eq(ctree)),
+                     ".*");
+  tree->length++;
+#endif
+  CordRep::Unref(tree);
+}
+
+TEST(CordRepBtreeTest, CheckAssertValidShallowVsDeep) {
+  // Restore exhaustive validation on any exit.
+  const bool exhaustive_validation = cord_btree_exhaustive_validation.load();
+  auto cleanup = absl::MakeCleanup([exhaustive_validation] {
+    cord_btree_exhaustive_validation.store(exhaustive_validation);
+  });
+
+  // Create a tree of at least 2 levels, and mess with the original flat, which
+  // should go undetected in shallow mode as the flat is too far away, but
+  // should be detected in forced non-shallow mode.
+  CordRep* flat = MakeFlat("abc");
+  CordRepBtree* tree = CordRepBtree::Create(flat);
+  constexpr size_t max_cap = CordRepBtree::kMaxCapacity;
+  const size_t n = max_cap * max_cap * 2;
+  for (size_t i = 0; i < n; ++i) {
+    tree = CordRepBtree::Append(tree, MakeFlat("Hello world"));
+  }
+  flat->length = 100;
+
+  cord_btree_exhaustive_validation.store(false);
+  EXPECT_FALSE(CordRepBtree::IsValid(tree));
+  EXPECT_TRUE(CordRepBtree::IsValid(tree, true));
+  EXPECT_FALSE(CordRepBtree::IsValid(tree, false));
+  CordRepBtree::AssertValid(tree);
+  CordRepBtree::AssertValid(tree, true);
+#if defined(GTEST_HAS_DEATH_TEST)
+  EXPECT_DEBUG_DEATH(CordRepBtree::AssertValid(tree, false), ".*");
+#endif
+
+  cord_btree_exhaustive_validation.store(true);
+  EXPECT_FALSE(CordRepBtree::IsValid(tree));
+  EXPECT_FALSE(CordRepBtree::IsValid(tree, true));
+  EXPECT_FALSE(CordRepBtree::IsValid(tree, false));
+#if defined(GTEST_HAS_DEATH_TEST)
+  EXPECT_DEBUG_DEATH(CordRepBtree::AssertValid(tree), ".*");
+  EXPECT_DEBUG_DEATH(CordRepBtree::AssertValid(tree, true), ".*");
+#endif
+
+  flat->length = 3;
+  CordRep::Unref(tree);
+}
+
+}  // namespace
+}  // namespace cord_internal
+ABSL_NAMESPACE_END
+}  // namespace absl
diff --git a/third_party/abseil-cpp/absl/strings/internal/cord_rep_ring.cc b/third_party/abseil-cpp/absl/strings/internal/cord_rep_ring.cc
index 20a6fc2..db1f63f 100644
--- a/third_party/abseil-cpp/absl/strings/internal/cord_rep_ring.cc
+++ b/third_party/abseil-cpp/absl/strings/internal/cord_rep_ring.cc
@@ -40,7 +40,7 @@
 enum class Direction { kForward, kReversed };
 
 inline bool IsFlatOrExternal(CordRep* rep) {
-  return rep->tag >= FLAT || rep->tag == EXTERNAL;
+  return rep->IsFlat() || rep->IsExternal();
 }
 
 // Verifies that n + extra <= kMaxCapacity: throws std::length_error otherwise.
@@ -229,7 +229,7 @@
 }
 
 void CordRepRing::Delete(CordRepRing* rep) {
-  assert(rep != nullptr && rep->tag == RING);
+  assert(rep != nullptr && rep->IsRing());
 #if defined(__cpp_sized_deallocation)
   size_t size = AllocSize(rep->capacity_);
   rep->~CordRepRing();
@@ -360,7 +360,7 @@
   if (IsFlatOrExternal(child)) {
     return CreateFromLeaf(child, 0, length, extra);
   }
-  if (child->tag == RING) {
+  if (child->IsRing()) {
     return Mutable(child->ring(), extra);
   }
   return CreateSlow(child, extra);
@@ -433,7 +433,7 @@
 
 CordRepRing* CordRepRing::AppendSlow(CordRepRing* rep, CordRep* child) {
   Consume(child, [&rep](CordRep* child_arg, size_t offset, size_t len) {
-    if (child_arg->tag == RING) {
+    if (child_arg->IsRing()) {
       rep = AddRing<AddMode::kAppend>(rep, child_arg->ring(), offset, len);
     } else {
       rep = AppendLeaf(rep, child_arg, offset, len);
@@ -460,7 +460,7 @@
   if (IsFlatOrExternal(child)) {
     return AppendLeaf(rep, child, 0, length);
   }
-  if (child->tag == RING) {
+  if (child->IsRing()) {
     return AddRing<AddMode::kAppend>(rep, child->ring(), 0, length);
   }
   return AppendSlow(rep, child);
@@ -496,7 +496,7 @@
   if (IsFlatOrExternal(child)) {
     return PrependLeaf(rep, child, 0, length);
   }
-  if (child->tag == RING) {
+  if (child->IsRing()) {
     return AddRing<AddMode::kPrepend>(rep, child->ring(), 0, length);
   }
   return PrependSlow(rep, child);
diff --git a/third_party/abseil-cpp/absl/strings/internal/cord_rep_ring.h b/third_party/abseil-cpp/absl/strings/internal/cord_rep_ring.h
index 2082a56..44db849 100644
--- a/third_party/abseil-cpp/absl/strings/internal/cord_rep_ring.h
+++ b/third_party/abseil-cpp/absl/strings/internal/cord_rep_ring.h
@@ -570,12 +570,12 @@
 
 // Now that CordRepRing is defined, we can define CordRep's helper casts:
 inline CordRepRing* CordRep::ring() {
-  assert(tag == RING);
+  assert(IsRing());
   return static_cast<CordRepRing*>(this);
 }
 
 inline const CordRepRing* CordRep::ring() const {
-  assert(tag == RING);
+  assert(IsRing());
   return static_cast<const CordRepRing*>(this);
 }
 
diff --git a/third_party/abseil-cpp/absl/strings/internal/cord_rep_test_util.h b/third_party/abseil-cpp/absl/strings/internal/cord_rep_test_util.h
new file mode 100644
index 0000000..bc50006
--- /dev/null
+++ b/third_party/abseil-cpp/absl/strings/internal/cord_rep_test_util.h
@@ -0,0 +1,185 @@
+// Copyright 2021 The Abseil Authors
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     https://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#ifndef ABSL_STRINGS_INTERNAL_CORD_REP_TEST_UTIL_H_
+#define ABSL_STRINGS_INTERNAL_CORD_REP_TEST_UTIL_H_
+
+#include <cassert>
+#include <memory>
+#include <random>
+#include <string>
+#include <vector>
+
+#include "absl/base/config.h"
+#include "absl/base/internal/raw_logging.h"
+#include "absl/strings/internal/cord_internal.h"
+#include "absl/strings/internal/cord_rep_btree.h"
+#include "absl/strings/internal/cord_rep_flat.h"
+#include "absl/strings/string_view.h"
+
+namespace absl {
+ABSL_NAMESPACE_BEGIN
+namespace cordrep_testing {
+
+inline cord_internal::CordRepSubstring* MakeSubstring(
+    size_t start, size_t len, cord_internal::CordRep* rep) {
+  auto* sub = new cord_internal::CordRepSubstring;
+  sub->tag = cord_internal::SUBSTRING;
+  sub->start = start;
+  sub->length = len <= 0 ? rep->length - start + len : len;
+  sub->child = rep;
+  return sub;
+}
+
+inline cord_internal::CordRepConcat* MakeConcat(cord_internal::CordRep* left,
+                                                cord_internal::CordRep* right,
+                                                int depth = 0) {
+  auto* concat = new cord_internal::CordRepConcat;
+  concat->tag = cord_internal::CONCAT;
+  concat->length = left->length + right->length;
+  concat->left = left;
+  concat->right = right;
+  concat->set_depth(depth);
+  return concat;
+}
+
+inline cord_internal::CordRepFlat* MakeFlat(absl::string_view value) {
+  assert(value.length() <= cord_internal::kMaxFlatLength);
+  auto* flat = cord_internal::CordRepFlat::New(value.length());
+  flat->length = value.length();
+  memcpy(flat->Data(), value.data(), value.length());
+  return flat;
+}
+
+// Creates an external node for testing
+inline cord_internal::CordRepExternal* MakeExternal(absl::string_view s) {
+  struct Rep : public cord_internal::CordRepExternal {
+    std::string s;
+    explicit Rep(absl::string_view sv) : s(sv) {
+      this->tag = cord_internal::EXTERNAL;
+      this->base = s.data();
+      this->length = s.length();
+      this->releaser_invoker = [](cord_internal::CordRepExternal* self) {
+        delete static_cast<Rep*>(self);
+      };
+    }
+  };
+  return new Rep(s);
+}
+
+inline std::string CreateRandomString(size_t n) {
+  absl::string_view data =
+      "abcdefghijklmnopqrstuvwxyz"
+      "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
+      "0123456789~!@#$%^&*()_+=-<>?:\"{}[]|";
+  std::minstd_rand rnd;
+  std::uniform_int_distribution<size_t> dist(0, data.size() - 1);
+  std::string s(n, ' ');
+  for (size_t i = 0; i < n; ++i) {
+    s[i] = data[dist(rnd)];
+  }
+  return s;
+}
+
+// Creates an array of flats from the provided string, chopping
+// the provided string up into flats of size `chunk_size` characters
+// resulting in roughly `data.size() / chunk_size` total flats.
+inline std::vector<cord_internal::CordRep*> CreateFlatsFromString(
+    absl::string_view data, size_t chunk_size) {
+  assert(chunk_size > 0);
+  std::vector<cord_internal::CordRep*> flats;
+  for (absl::string_view s = data; !s.empty(); s.remove_prefix(chunk_size)) {
+    flats.push_back(MakeFlat(s.substr(0, chunk_size)));
+  }
+  return flats;
+}
+
+inline cord_internal::CordRepBtree* CordRepBtreeFromFlats(
+    absl::Span<cord_internal::CordRep* const> flats) {
+  assert(!flats.empty());
+  auto* node = cord_internal::CordRepBtree::Create(flats[0]);
+  for (size_t i = 1; i < flats.size(); ++i) {
+    node = cord_internal::CordRepBtree::Append(node, flats[i]);
+  }
+  return node;
+}
+
+inline void CordToString(cord_internal::CordRep* rep, std::string& s) {
+  size_t offset = 0;
+  size_t length = rep->length;
+  while (rep->tag == cord_internal::SUBSTRING) {
+    offset += rep->substring()->start;
+    rep = rep->substring()->child;
+  }
+  if (rep->tag == cord_internal::BTREE) {
+    for (cord_internal::CordRep* edge : rep->btree()->Edges()) {
+      CordToString(edge, s);
+    }
+  } else if (rep->tag >= cord_internal::FLAT) {
+    s.append(rep->flat()->Data() + offset, length);
+  } else if (rep->tag == cord_internal::EXTERNAL) {
+    s.append(rep->external()->base + offset, length);
+  } else {
+    ABSL_RAW_LOG(FATAL, "Unsupported tag %d", rep->tag);
+  }
+}
+
+inline std::string CordToString(cord_internal::CordRep* rep) {
+  std::string s;
+  s.reserve(rep->length);
+  CordToString(rep, s);
+  return s;
+}
+
+// RAII Helper class to automatically unref reps on destruction.
+class AutoUnref {
+ public:
+  ~AutoUnref() {
+    for (CordRep* rep : unrefs_) CordRep::Unref(rep);
+  }
+
+  // Adds `rep` to the list of reps to be unreffed at destruction.
+  template <typename CordRepType>
+  CordRepType* Add(CordRepType* rep) {
+    unrefs_.push_back(rep);
+    return rep;
+  }
+
+  // Increments the reference count of `rep` by one, and adds it to
+  // the list of reps to be unreffed at destruction.
+  template <typename CordRepType>
+  CordRepType* Ref(CordRepType* rep) {
+    unrefs_.push_back(CordRep::Ref(rep));
+    return rep;
+  }
+
+  // Increments the reference count of `rep` by one if `condition` is true,
+  // and adds it to the list of reps to be unreffed at destruction.
+  template <typename CordRepType>
+  CordRepType* RefIf(bool condition, CordRepType* rep) {
+    if (condition) unrefs_.push_back(CordRep::Ref(rep));
+    return rep;
+  }
+
+ private:
+  using CordRep = absl::cord_internal::CordRep;
+
+  std::vector<CordRep*> unrefs_;
+};
+
+}  // namespace cordrep_testing
+ABSL_NAMESPACE_END
+}  // namespace absl
+
+#endif  // ABSL_STRINGS_INTERNAL_CORD_REP_TEST_UTIL_H_
diff --git a/third_party/abseil-cpp/absl/strings/internal/cordz_functions.cc b/third_party/abseil-cpp/absl/strings/internal/cordz_functions.cc
index f30080f..4836993 100644
--- a/third_party/abseil-cpp/absl/strings/internal/cordz_functions.cc
+++ b/third_party/abseil-cpp/absl/strings/internal/cordz_functions.cc
@@ -24,13 +24,6 @@
 #include "absl/base/internal/exponential_biased.h"
 #include "absl/base/internal/raw_logging.h"
 
-// TODO(b/162942788): weak 'cordz_disabled' value.
-// A strong version is in the 'cordz_disabled_hack_for_odr' library which can
-// be linked in to disable cordz at compile time.
-extern "C" {
-bool absl_internal_cordz_disabled ABSL_ATTRIBUTE_WEAK = false;
-}
-
 namespace absl {
 ABSL_NAMESPACE_BEGIN
 namespace cord_internal {
@@ -54,13 +47,6 @@
 constexpr int64_t kIntervalIfDisabled = 1 << 16;
 
 ABSL_ATTRIBUTE_NOINLINE bool cordz_should_profile_slow() {
-  // TODO(b/162942788): check if profiling is disabled at compile time.
-  if (absl_internal_cordz_disabled) {
-    ABSL_RAW_LOG(WARNING, "Cordz info disabled at compile time");
-    // We are permanently disabled: set counter to highest possible value.
-    cordz_next_sample = std::numeric_limits<int64_t>::max();
-    return false;
-  }
 
   thread_local absl::base_internal::ExponentialBiased
       exponential_biased_generator;
diff --git a/third_party/abseil-cpp/absl/strings/internal/cordz_info.cc b/third_party/abseil-cpp/absl/strings/internal/cordz_info.cc
index a3a0b9c..5c18bbc 100644
--- a/third_party/abseil-cpp/absl/strings/internal/cordz_info.cc
+++ b/third_party/abseil-cpp/absl/strings/internal/cordz_info.cc
@@ -19,6 +19,7 @@
 #include "absl/container/inlined_vector.h"
 #include "absl/debugging/stacktrace.h"
 #include "absl/strings/internal/cord_internal.h"
+#include "absl/strings/internal/cord_rep_btree.h"
 #include "absl/strings/internal/cord_rep_ring.h"
 #include "absl/strings/internal/cordz_handle.h"
 #include "absl/strings/internal/cordz_statistics.h"
@@ -83,19 +84,23 @@
     // Process all top level linear nodes (substrings and flats).
     repref = CountLinearReps(repref, memory_usage_);
 
-    // We should have have either a concat or ring node node if not null.
     if (repref.rep != nullptr) {
-      assert(repref.rep->tag == RING || repref.rep->tag == CONCAT);
       if (repref.rep->tag == RING) {
         AnalyzeRing(repref);
+      } else if (repref.rep->tag == BTREE) {
+        AnalyzeBtree(repref);
       } else if (repref.rep->tag == CONCAT) {
         AnalyzeConcat(repref);
+      } else {
+        // We should have either a concat, btree, or ring node if not null.
+        assert(false);
       }
     }
 
     // Adds values to output
     statistics_.estimated_memory_usage += memory_usage_.total;
-    statistics_.estimated_fair_share_memory_usage += memory_usage_.fair_share;
+    statistics_.estimated_fair_share_memory_usage +=
+        static_cast<size_t>(memory_usage_.fair_share);
   }
 
  private:
@@ -117,13 +122,13 @@
   // Memory usage values
   struct MemoryUsage {
     size_t total = 0;
-    size_t fair_share = 0;
+    double fair_share = 0.0;
 
     // Adds 'size` memory usage to this class, with a cumulative (recursive)
     // reference count of `refcount`
     void Add(size_t size, size_t refcount) {
       total += size;
-      fair_share += size / refcount;
+      fair_share += static_cast<double>(size) / refcount;
     }
   };
 
@@ -215,28 +220,32 @@
     }
   }
 
-  // Counts the provided ring buffer child into `child_usage`.
-  void CountRingChild(const CordRep* child, MemoryUsage& child_usage) {
-    RepRef rep{child, static_cast<size_t>(child->refcount.Get())};
-    rep = CountLinearReps(rep, child_usage);
-    assert(rep.rep == nullptr);
-  }
-
-  // Analyzes the provided ring. As ring buffers can have many child nodes, the
-  // effect of rounding errors can become non trivial, so we compute the totals
-  // first at the ring level, and then divide the fair share of the total
-  // including children fair share totals.
+  // Analyzes the provided ring.
   void AnalyzeRing(RepRef rep) {
     statistics_.node_count++;
     statistics_.node_counts.ring++;
-    MemoryUsage ring_usage;
     const CordRepRing* ring = rep.rep->ring();
-    ring_usage.Add(CordRepRing::AllocSize(ring->capacity()), 1);
+    memory_usage_.Add(CordRepRing::AllocSize(ring->capacity()), rep.refcount);
     ring->ForEach([&](CordRepRing::index_type pos) {
-      CountRingChild(ring->entry_child(pos), ring_usage);
+      CountLinearReps(rep.Child(ring->entry_child(pos)), memory_usage_);
     });
-    memory_usage_.total += ring_usage.total;
-    memory_usage_.fair_share += ring_usage.fair_share / rep.refcount;
+  }
+
+  // Analyzes the provided btree.
+  void AnalyzeBtree(RepRef rep) {
+    statistics_.node_count++;
+    statistics_.node_counts.btree++;
+    memory_usage_.Add(sizeof(CordRepBtree), rep.refcount);
+    const CordRepBtree* tree = rep.rep->btree();
+    if (tree->height() > 0) {
+      for (CordRep* edge : tree->Edges()) {
+        AnalyzeBtree(rep.Child(edge));
+      }
+    } else {
+      for (CordRep* edge : tree->Edges()) {
+        CountLinearReps(rep.Child(edge), memory_usage_);
+      }
+    }
   }
 
   CordzStatistics& statistics_;
diff --git a/third_party/abseil-cpp/absl/strings/internal/cordz_info_statistics_test.cc b/third_party/abseil-cpp/absl/strings/internal/cordz_info_statistics_test.cc
index 9f2842d..7430d28 100644
--- a/third_party/abseil-cpp/absl/strings/internal/cordz_info_statistics_test.cc
+++ b/third_party/abseil-cpp/absl/strings/internal/cordz_info_statistics_test.cc
@@ -21,6 +21,7 @@
 #include "absl/base/config.h"
 #include "absl/strings/cord.h"
 #include "absl/strings/internal/cord_internal.h"
+#include "absl/strings/internal/cord_rep_btree.h"
 #include "absl/strings/internal/cord_rep_flat.h"
 #include "absl/strings/internal/cord_rep_ring.h"
 #include "absl/strings/internal/cordz_info.h"
@@ -42,6 +43,8 @@
 
 namespace {
 
+using ::testing::Ge;
+
 // Creates a flat of the specified allocated size
 CordRepFlat* Flat(size_t size) {
   // Round up to a tag size, as we are going to poke an exact tag size back into
@@ -134,8 +137,8 @@
 }
 
 // Computes fair share memory used in a naive 'we dare to recurse' way.
-size_t FairShare(CordRep* rep, size_t ref = 1) {
-  size_t self = 0, children = 0;
+double FairShareImpl(CordRep* rep, size_t ref) {
+  double self = 0.0, children = 0.0;
   ref *= rep->refcount.Get();
   if (rep->tag >= FLAT) {
     self = SizeOf(rep->flat());
@@ -143,22 +146,32 @@
     self = SizeOf(rep->external());
   } else if (rep->tag == SUBSTRING) {
     self = SizeOf(rep->substring());
-    children = FairShare(rep->substring()->child, ref);
+    children = FairShareImpl(rep->substring()->child, ref);
+  } else if (rep->tag == BTREE) {
+    self = SizeOf(rep->btree());
+    for (CordRep*edge : rep->btree()->Edges()) {
+      children += FairShareImpl(edge, ref);
+    }
   } else if (rep->tag == RING) {
     self = SizeOf(rep->ring());
     rep->ring()->ForEach([&](CordRepRing::index_type i) {
-      self += FairShare(rep->ring()->entry_child(i));
+      self += FairShareImpl(rep->ring()->entry_child(i), 1);
     });
   } else if (rep->tag == CONCAT) {
     self = SizeOf(rep->concat());
-    children = FairShare(rep->concat()->left, ref) +
-               FairShare(rep->concat()->right, ref);
+    children = FairShareImpl(rep->concat()->left, ref) +
+               FairShareImpl(rep->concat()->right, ref);
   } else {
     assert(false);
   }
   return self / ref + children;
 }
 
+// Returns the fair share memory size from `ShareFhareImpl()` as a size_t.
+size_t FairShare(CordRep* rep, size_t ref = 1) {
+  return static_cast<size_t>(FairShareImpl(rep, ref));
+}
+
 // Samples the cord and returns CordzInfo::GetStatistics()
 CordzStatistics SampleCord(CordRep* rep) {
   InlineData cord(rep);
@@ -191,6 +204,7 @@
   STATS_MATCHER_EXPECT_EQ(node_counts.concat);
   STATS_MATCHER_EXPECT_EQ(node_counts.substring);
   STATS_MATCHER_EXPECT_EQ(node_counts.ring);
+  STATS_MATCHER_EXPECT_EQ(node_counts.btree);
   STATS_MATCHER_EXPECT_EQ(estimated_memory_usage);
   STATS_MATCHER_EXPECT_EQ(estimated_fair_share_memory_usage);
 
@@ -424,6 +438,103 @@
   EXPECT_THAT(SampleCord(substring), EqStatistics(expected));
 }
 
+TEST(CordzInfoStatisticsTest, BtreeLeaf) {
+  ASSERT_THAT(CordRepBtree::kMaxCapacity, Ge(3));
+  RefHelper ref;
+  auto* flat1 = Flat(2000);
+  auto* flat2 = Flat(200);
+  auto* substr = Substring(flat2);
+  auto* external = External(3000);
+
+  CordRepBtree* tree = CordRepBtree::Create(flat1);
+  tree = CordRepBtree::Append(tree, substr);
+  tree = CordRepBtree::Append(tree, external);
+  size_t flat3_count = CordRepBtree::kMaxCapacity - 3;
+  size_t flat3_size = 0;
+  for (size_t i = 0; i < flat3_count; ++i) {
+    auto* flat3 = Flat(70);
+    flat3_size += SizeOf(flat3);
+    tree = CordRepBtree::Append(tree, flat3);
+  }
+  ref.NeedsUnref(tree);
+
+  CordzStatistics expected;
+  expected.size = tree->length;
+  expected.estimated_memory_usage = SizeOf(tree) + SizeOf(flat1) +
+                                    SizeOf(flat2) + SizeOf(substr) +
+                                    flat3_size + SizeOf(external);
+  expected.estimated_fair_share_memory_usage = expected.estimated_memory_usage;
+  expected.node_count = 1 + 3 + 1 + flat3_count;
+  expected.node_counts.flat = 2 + flat3_count;
+  expected.node_counts.flat_128 = flat3_count;
+  expected.node_counts.flat_256 = 1;
+  expected.node_counts.external = 1;
+  expected.node_counts.substring = 1;
+  expected.node_counts.btree = 1;
+
+  EXPECT_THAT(SampleCord(tree), EqStatistics(expected));
+}
+
+TEST(CordzInfoStatisticsTest, BtreeNodeShared) {
+  RefHelper ref;
+  static constexpr int leaf_count = 3;
+  const size_t flat3_count = CordRepBtree::kMaxCapacity - 3;
+  ASSERT_THAT(flat3_count, Ge(0));
+
+  CordRepBtree* tree = nullptr;
+  size_t mem_size = 0;
+  for (int i = 0; i < leaf_count; ++i) {
+    auto* flat1 = ref.Ref(Flat(2000), 9);
+    mem_size += SizeOf(flat1);
+    if (i == 0) {
+      tree = CordRepBtree::Create(flat1);
+    } else {
+      tree = CordRepBtree::Append(tree, flat1);
+    }
+
+    auto* flat2 = Flat(200);
+    auto* substr = Substring(flat2);
+    mem_size += SizeOf(flat2) + SizeOf(substr);
+    tree = CordRepBtree::Append(tree, substr);
+
+    auto* external = External(30);
+    mem_size += SizeOf(external);
+    tree = CordRepBtree::Append(tree, external);
+
+    for (size_t i = 0; i < flat3_count; ++i) {
+      auto* flat3 = Flat(70);
+      mem_size += SizeOf(flat3);
+      tree = CordRepBtree::Append(tree, flat3);
+    }
+
+    if (i == 0) {
+      mem_size += SizeOf(tree);
+    } else {
+      mem_size += SizeOf(tree->Edges().back()->btree());
+    }
+  }
+  ref.NeedsUnref(tree);
+
+  // Ref count: 2 for top (add 1), 5 for leaf 0 (add 4).
+  ref.Ref(tree, 1);
+  ref.Ref(tree->Edges().front(), 4);
+
+  CordzStatistics expected;
+  expected.size = tree->length;
+  expected.estimated_memory_usage = SizeOf(tree) + mem_size;
+  expected.estimated_fair_share_memory_usage = FairShare(tree);
+
+  expected.node_count = 1 + leaf_count * (1 + 3 + 1 + flat3_count);
+  expected.node_counts.flat = leaf_count * (2 + flat3_count);
+  expected.node_counts.flat_128 = leaf_count * flat3_count;
+  expected.node_counts.flat_256 = leaf_count;
+  expected.node_counts.external = leaf_count;
+  expected.node_counts.substring = leaf_count;
+  expected.node_counts.btree = 1 + leaf_count;
+
+  EXPECT_THAT(SampleCord(tree), EqStatistics(expected));
+}
+
 TEST(CordzInfoStatisticsTest, ThreadSafety) {
   Notification stop;
   static constexpr int kNumThreads = 8;
@@ -471,9 +582,15 @@
                 CordRep::Unref(cord.as_tree());
                 cord.set_inline_size(0);
               } else {
-                // 50/50 Ring or Flat coin toss
+                // Coin toss to 25% ring, 25% btree, and 50% flat.
                 CordRep* rep = Flat(256);
-                rep = (coin_toss(gen) != 0) ? CordRepRing::Create(rep) : rep;
+                if (coin_toss(gen) != 0) {
+                  if (coin_toss(gen) != 0) {
+                    rep = CordRepRing::Create(rep);
+                  } else {
+                    rep = CordRepBtree::Create(rep);
+                  }
+                }
                 cord.make_tree(rep);
 
                 // 50/50 sample
diff --git a/third_party/abseil-cpp/absl/strings/internal/cordz_statistics.h b/third_party/abseil-cpp/absl/strings/internal/cordz_statistics.h
index e03c651..da4c7db 100644
--- a/third_party/abseil-cpp/absl/strings/internal/cordz_statistics.h
+++ b/third_party/abseil-cpp/absl/strings/internal/cordz_statistics.h
@@ -40,6 +40,7 @@
     size_t substring = 0;  // #substring reps
     size_t concat = 0;     // #concat reps
     size_t ring = 0;       // #ring buffer reps
+    size_t btree = 0;      // #btree reps
   };
 
   // The size of the cord in bytes. This matches the result of Cord::size().
@@ -61,6 +62,8 @@
 
   // The total number of nodes referenced by this cord.
   // For ring buffer Cords, this includes the 'ring buffer' node.
+  // For btree Cords, this includes all 'CordRepBtree' tree nodes as well as all
+  // the substring, flat and external nodes referenced by the tree.
   // A value of 0 implies the property has not been recorded.
   int64_t node_count = 0;
 
diff --git a/third_party/abseil-cpp/absl/strings/internal/str_format/bind.h b/third_party/abseil-cpp/absl/strings/internal/str_format/bind.h
index 267cc0e..b26cff6 100644
--- a/third_party/abseil-cpp/absl/strings/internal/str_format/bind.h
+++ b/third_party/abseil-cpp/absl/strings/internal/str_format/bind.h
@@ -100,7 +100,7 @@
   // We use the 'unavailable' attribute to give a better compiler error than
   // just 'method is deleted'.
   // To avoid checking the format twice, we just check that the format is
-  // constexpr. If is it valid, then the overload below will kick in.
+  // constexpr. If it is valid, then the overload below will kick in.
   // We add the template here to make this overload have lower priority.
   template <typename = void>
   FormatSpecTemplate(const char* s)  // NOLINT
diff --git a/third_party/abseil-cpp/absl/strings/string_view.h b/third_party/abseil-cpp/absl/strings/string_view.h
index 968549b..ea76052 100644
--- a/third_party/abseil-cpp/absl/strings/string_view.h
+++ b/third_party/abseil-cpp/absl/strings/string_view.h
@@ -191,14 +191,16 @@
           ABSL_ATTRIBUTE_LIFETIME_BOUND) noexcept
       // This is implemented in terms of `string_view(p, n)` so `str.size()`
       // doesn't need to be reevaluated after `ptr_` is set.
-      : string_view(str.data(), str.size()) {}
+      // The length check is also skipped since it is unnecessary and causes
+      // code bloat.
+      : string_view(str.data(), str.size(), SkipCheckLengthTag{}) {}
 
   // Implicit constructor of a `string_view` from NUL-terminated `str`. When
   // accepting possibly null strings, use `absl::NullSafeStringView(str)`
   // instead (see below).
+  // The length check is skipped since it is unnecessary and causes code bloat.
   constexpr string_view(const char* str)  // NOLINT(runtime/explicit)
-      : ptr_(str),
-        length_(str ? CheckLengthInternal(StrlenInternal(str)) : 0) {}
+      : ptr_(str), length_(str ? StrlenInternal(str) : 0) {}
 
   // Implicit constructor of a `string_view` from a `const char*` and length.
   constexpr string_view(const char* data, size_type len)
@@ -594,6 +596,12 @@
   }
 
  private:
+  // The constructor from std::string delegates to this constuctor.
+  // See the comment on that constructor for the rationale.
+  struct SkipCheckLengthTag {};
+  string_view(const char* data, size_type len, SkipCheckLengthTag) noexcept
+      : ptr_(data), length_(len) {}
+
   static constexpr size_type kMaxSize =
       (std::numeric_limits<difference_type>::max)();
 
diff --git a/third_party/abseil-cpp/absl/strings/substitute.h b/third_party/abseil-cpp/absl/strings/substitute.h
index c6da4dc..151c56f 100644
--- a/third_party/abseil-cpp/absl/strings/substitute.h
+++ b/third_party/abseil-cpp/absl/strings/substitute.h
@@ -361,43 +361,49 @@
 // This body of functions catches cases where the number of placeholders
 // doesn't match the number of data arguments.
 void SubstituteAndAppend(std::string* output, const char* format)
-    ABSL_BAD_CALL_IF(substitute_internal::PlaceholderBitmask(format) != 0,
-                     "There were no substitution arguments "
-                     "but this format string has a $[0-9] in it");
+    ABSL_BAD_CALL_IF(
+        substitute_internal::PlaceholderBitmask(format) != 0,
+        "There were no substitution arguments "
+        "but this format string either has a $[0-9] in it or contains "
+        "an unescaped $ character (use $$ instead)");
 
 void SubstituteAndAppend(std::string* output, const char* format,
                          const substitute_internal::Arg& a0)
     ABSL_BAD_CALL_IF(substitute_internal::PlaceholderBitmask(format) != 1,
                      "There was 1 substitution argument given, but "
-                     "this format string is either missing its $0, or "
-                     "contains one of $1-$9");
+                     "this format string is missing its $0, contains "
+                     "one of $1-$9, or contains an unescaped $ character (use "
+                     "$$ instead)");
 
 void SubstituteAndAppend(std::string* output, const char* format,
                          const substitute_internal::Arg& a0,
                          const substitute_internal::Arg& a1)
-    ABSL_BAD_CALL_IF(substitute_internal::PlaceholderBitmask(format) != 3,
-                     "There were 2 substitution arguments given, but "
-                     "this format string is either missing its $0/$1, or "
-                     "contains one of $2-$9");
+    ABSL_BAD_CALL_IF(
+        substitute_internal::PlaceholderBitmask(format) != 3,
+        "There were 2 substitution arguments given, but this format string is "
+        "missing its $0/$1, contains one of $2-$9, or contains an "
+        "unescaped $ character (use $$ instead)");
 
 void SubstituteAndAppend(std::string* output, const char* format,
                          const substitute_internal::Arg& a0,
                          const substitute_internal::Arg& a1,
                          const substitute_internal::Arg& a2)
-    ABSL_BAD_CALL_IF(substitute_internal::PlaceholderBitmask(format) != 7,
-                     "There were 3 substitution arguments given, but "
-                     "this format string is either missing its $0/$1/$2, or "
-                     "contains one of $3-$9");
+    ABSL_BAD_CALL_IF(
+        substitute_internal::PlaceholderBitmask(format) != 7,
+        "There were 3 substitution arguments given, but "
+        "this format string is missing its $0/$1/$2, contains one of "
+        "$3-$9, or contains an unescaped $ character (use $$ instead)");
 
 void SubstituteAndAppend(std::string* output, const char* format,
                          const substitute_internal::Arg& a0,
                          const substitute_internal::Arg& a1,
                          const substitute_internal::Arg& a2,
                          const substitute_internal::Arg& a3)
-    ABSL_BAD_CALL_IF(substitute_internal::PlaceholderBitmask(format) != 15,
-                     "There were 4 substitution arguments given, but "
-                     "this format string is either missing its $0-$3, or "
-                     "contains one of $4-$9");
+    ABSL_BAD_CALL_IF(
+        substitute_internal::PlaceholderBitmask(format) != 15,
+        "There were 4 substitution arguments given, but "
+        "this format string is missing its $0-$3, contains one of "
+        "$4-$9, or contains an unescaped $ character (use $$ instead)");
 
 void SubstituteAndAppend(std::string* output, const char* format,
                          const substitute_internal::Arg& a0,
@@ -405,10 +411,11 @@
                          const substitute_internal::Arg& a2,
                          const substitute_internal::Arg& a3,
                          const substitute_internal::Arg& a4)
-    ABSL_BAD_CALL_IF(substitute_internal::PlaceholderBitmask(format) != 31,
-                     "There were 5 substitution arguments given, but "
-                     "this format string is either missing its $0-$4, or "
-                     "contains one of $5-$9");
+    ABSL_BAD_CALL_IF(
+        substitute_internal::PlaceholderBitmask(format) != 31,
+        "There were 5 substitution arguments given, but "
+        "this format string is missing its $0-$4, contains one of "
+        "$5-$9, or contains an unescaped $ character (use $$ instead)");
 
 void SubstituteAndAppend(std::string* output, const char* format,
                          const substitute_internal::Arg& a0,
@@ -417,20 +424,22 @@
                          const substitute_internal::Arg& a3,
                          const substitute_internal::Arg& a4,
                          const substitute_internal::Arg& a5)
-    ABSL_BAD_CALL_IF(substitute_internal::PlaceholderBitmask(format) != 63,
-                     "There were 6 substitution arguments given, but "
-                     "this format string is either missing its $0-$5, or "
-                     "contains one of $6-$9");
+    ABSL_BAD_CALL_IF(
+        substitute_internal::PlaceholderBitmask(format) != 63,
+        "There were 6 substitution arguments given, but "
+        "this format string is missing its $0-$5, contains one of "
+        "$6-$9, or contains an unescaped $ character (use $$ instead)");
 
 void SubstituteAndAppend(
     std::string* output, const char* format, const substitute_internal::Arg& a0,
     const substitute_internal::Arg& a1, const substitute_internal::Arg& a2,
     const substitute_internal::Arg& a3, const substitute_internal::Arg& a4,
     const substitute_internal::Arg& a5, const substitute_internal::Arg& a6)
-    ABSL_BAD_CALL_IF(substitute_internal::PlaceholderBitmask(format) != 127,
-                     "There were 7 substitution arguments given, but "
-                     "this format string is either missing its $0-$6, or "
-                     "contains one of $7-$9");
+    ABSL_BAD_CALL_IF(
+        substitute_internal::PlaceholderBitmask(format) != 127,
+        "There were 7 substitution arguments given, but "
+        "this format string is missing its $0-$6, contains one of "
+        "$7-$9, or contains an unescaped $ character (use $$ instead)");
 
 void SubstituteAndAppend(
     std::string* output, const char* format, const substitute_internal::Arg& a0,
@@ -438,10 +447,11 @@
     const substitute_internal::Arg& a3, const substitute_internal::Arg& a4,
     const substitute_internal::Arg& a5, const substitute_internal::Arg& a6,
     const substitute_internal::Arg& a7)
-    ABSL_BAD_CALL_IF(substitute_internal::PlaceholderBitmask(format) != 255,
-                     "There were 8 substitution arguments given, but "
-                     "this format string is either missing its $0-$7, or "
-                     "contains one of $8-$9");
+    ABSL_BAD_CALL_IF(
+        substitute_internal::PlaceholderBitmask(format) != 255,
+        "There were 8 substitution arguments given, but "
+        "this format string is missing its $0-$7, contains one of "
+        "$8-$9, or contains an unescaped $ character (use $$ instead)");
 
 void SubstituteAndAppend(
     std::string* output, const char* format, const substitute_internal::Arg& a0,
@@ -452,7 +462,8 @@
     ABSL_BAD_CALL_IF(
         substitute_internal::PlaceholderBitmask(format) != 511,
         "There were 9 substitution arguments given, but "
-        "this format string is either missing its $0-$8, or contains a $9");
+        "this format string is missing its $0-$8, contains a $9, or "
+        "contains an unescaped $ character (use $$ instead)");
 
 void SubstituteAndAppend(
     std::string* output, const char* format, const substitute_internal::Arg& a0,
@@ -461,9 +472,11 @@
     const substitute_internal::Arg& a5, const substitute_internal::Arg& a6,
     const substitute_internal::Arg& a7, const substitute_internal::Arg& a8,
     const substitute_internal::Arg& a9)
-    ABSL_BAD_CALL_IF(substitute_internal::PlaceholderBitmask(format) != 1023,
-                     "There were 10 substitution arguments given, but this "
-                     "format string doesn't contain all of $0 through $9");
+    ABSL_BAD_CALL_IF(
+        substitute_internal::PlaceholderBitmask(format) != 1023,
+        "There were 10 substitution arguments given, but this "
+        "format string either doesn't contain all of $0 through $9 or "
+        "contains an unescaped $ character (use $$ instead)");
 #endif  // ABSL_BAD_CALL_IF
 
 // Substitute()
@@ -589,47 +602,53 @@
 std::string Substitute(const char* format)
     ABSL_BAD_CALL_IF(substitute_internal::PlaceholderBitmask(format) != 0,
                      "There were no substitution arguments "
-                     "but this format string has a $[0-9] in it");
+                     "but this format string either has a $[0-9] in it or "
+                     "contains an unescaped $ character (use $$ instead)");
 
 std::string Substitute(const char* format, const substitute_internal::Arg& a0)
-    ABSL_BAD_CALL_IF(substitute_internal::PlaceholderBitmask(format) != 1,
-                     "There was 1 substitution argument given, but "
-                     "this format string is either missing its $0, or "
-                     "contains one of $1-$9");
+    ABSL_BAD_CALL_IF(
+        substitute_internal::PlaceholderBitmask(format) != 1,
+        "There was 1 substitution argument given, but "
+        "this format string is missing its $0, contains one of $1-$9, "
+        "or contains an unescaped $ character (use $$ instead)");
 
 std::string Substitute(const char* format, const substitute_internal::Arg& a0,
                        const substitute_internal::Arg& a1)
-    ABSL_BAD_CALL_IF(substitute_internal::PlaceholderBitmask(format) != 3,
-                     "There were 2 substitution arguments given, but "
-                     "this format string is either missing its $0/$1, or "
-                     "contains one of $2-$9");
+    ABSL_BAD_CALL_IF(
+        substitute_internal::PlaceholderBitmask(format) != 3,
+        "There were 2 substitution arguments given, but "
+        "this format string is missing its $0/$1, contains one of "
+        "$2-$9, or contains an unescaped $ character (use $$ instead)");
 
 std::string Substitute(const char* format, const substitute_internal::Arg& a0,
                        const substitute_internal::Arg& a1,
                        const substitute_internal::Arg& a2)
-    ABSL_BAD_CALL_IF(substitute_internal::PlaceholderBitmask(format) != 7,
-                     "There were 3 substitution arguments given, but "
-                     "this format string is either missing its $0/$1/$2, or "
-                     "contains one of $3-$9");
+    ABSL_BAD_CALL_IF(
+        substitute_internal::PlaceholderBitmask(format) != 7,
+        "There were 3 substitution arguments given, but "
+        "this format string is missing its $0/$1/$2, contains one of "
+        "$3-$9, or contains an unescaped $ character (use $$ instead)");
 
 std::string Substitute(const char* format, const substitute_internal::Arg& a0,
                        const substitute_internal::Arg& a1,
                        const substitute_internal::Arg& a2,
                        const substitute_internal::Arg& a3)
-    ABSL_BAD_CALL_IF(substitute_internal::PlaceholderBitmask(format) != 15,
-                     "There were 4 substitution arguments given, but "
-                     "this format string is either missing its $0-$3, or "
-                     "contains one of $4-$9");
+    ABSL_BAD_CALL_IF(
+        substitute_internal::PlaceholderBitmask(format) != 15,
+        "There were 4 substitution arguments given, but "
+        "this format string is missing its $0-$3, contains one of "
+        "$4-$9, or contains an unescaped $ character (use $$ instead)");
 
 std::string Substitute(const char* format, const substitute_internal::Arg& a0,
                        const substitute_internal::Arg& a1,
                        const substitute_internal::Arg& a2,
                        const substitute_internal::Arg& a3,
                        const substitute_internal::Arg& a4)
-    ABSL_BAD_CALL_IF(substitute_internal::PlaceholderBitmask(format) != 31,
-                     "There were 5 substitution arguments given, but "
-                     "this format string is either missing its $0-$4, or "
-                     "contains one of $5-$9");
+    ABSL_BAD_CALL_IF(
+        substitute_internal::PlaceholderBitmask(format) != 31,
+        "There were 5 substitution arguments given, but "
+        "this format string is missing its $0-$4, contains one of "
+        "$5-$9, or contains an unescaped $ character (use $$ instead)");
 
 std::string Substitute(const char* format, const substitute_internal::Arg& a0,
                        const substitute_internal::Arg& a1,
@@ -637,10 +656,11 @@
                        const substitute_internal::Arg& a3,
                        const substitute_internal::Arg& a4,
                        const substitute_internal::Arg& a5)
-    ABSL_BAD_CALL_IF(substitute_internal::PlaceholderBitmask(format) != 63,
-                     "There were 6 substitution arguments given, but "
-                     "this format string is either missing its $0-$5, or "
-                     "contains one of $6-$9");
+    ABSL_BAD_CALL_IF(
+        substitute_internal::PlaceholderBitmask(format) != 63,
+        "There were 6 substitution arguments given, but "
+        "this format string is missing its $0-$5, contains one of "
+        "$6-$9, or contains an unescaped $ character (use $$ instead)");
 
 std::string Substitute(const char* format, const substitute_internal::Arg& a0,
                        const substitute_internal::Arg& a1,
@@ -649,10 +669,11 @@
                        const substitute_internal::Arg& a4,
                        const substitute_internal::Arg& a5,
                        const substitute_internal::Arg& a6)
-    ABSL_BAD_CALL_IF(substitute_internal::PlaceholderBitmask(format) != 127,
-                     "There were 7 substitution arguments given, but "
-                     "this format string is either missing its $0-$6, or "
-                     "contains one of $7-$9");
+    ABSL_BAD_CALL_IF(
+        substitute_internal::PlaceholderBitmask(format) != 127,
+        "There were 7 substitution arguments given, but "
+        "this format string is missing its $0-$6, contains one of "
+        "$7-$9, or contains an unescaped $ character (use $$ instead)");
 
 std::string Substitute(const char* format, const substitute_internal::Arg& a0,
                        const substitute_internal::Arg& a1,
@@ -662,10 +683,11 @@
                        const substitute_internal::Arg& a5,
                        const substitute_internal::Arg& a6,
                        const substitute_internal::Arg& a7)
-    ABSL_BAD_CALL_IF(substitute_internal::PlaceholderBitmask(format) != 255,
-                     "There were 8 substitution arguments given, but "
-                     "this format string is either missing its $0-$7, or "
-                     "contains one of $8-$9");
+    ABSL_BAD_CALL_IF(
+        substitute_internal::PlaceholderBitmask(format) != 255,
+        "There were 8 substitution arguments given, but "
+        "this format string is missing its $0-$7, contains one of "
+        "$8-$9, or contains an unescaped $ character (use $$ instead)");
 
 std::string Substitute(
     const char* format, const substitute_internal::Arg& a0,
@@ -676,7 +698,8 @@
     ABSL_BAD_CALL_IF(
         substitute_internal::PlaceholderBitmask(format) != 511,
         "There were 9 substitution arguments given, but "
-        "this format string is either missing its $0-$8, or contains a $9");
+        "this format string is missing its $0-$8, contains a $9, or "
+        "contains an unescaped $ character (use $$ instead)");
 
 std::string Substitute(
     const char* format, const substitute_internal::Arg& a0,
@@ -685,9 +708,11 @@
     const substitute_internal::Arg& a5, const substitute_internal::Arg& a6,
     const substitute_internal::Arg& a7, const substitute_internal::Arg& a8,
     const substitute_internal::Arg& a9)
-    ABSL_BAD_CALL_IF(substitute_internal::PlaceholderBitmask(format) != 1023,
-                     "There were 10 substitution arguments given, but this "
-                     "format string doesn't contain all of $0 through $9");
+    ABSL_BAD_CALL_IF(
+        substitute_internal::PlaceholderBitmask(format) != 1023,
+        "There were 10 substitution arguments given, but this "
+        "format string either doesn't contain all of $0 through $9 or "
+        "contains an unescaped $ character (use $$ instead)");
 #endif  // ABSL_BAD_CALL_IF
 
 ABSL_NAMESPACE_END
diff --git a/third_party/abseil-cpp/absl/time/internal/cctz/BUILD.bazel b/third_party/abseil-cpp/absl/time/internal/cctz/BUILD.bazel
index 45a9529..f549af6 100644
--- a/third_party/abseil-cpp/absl/time/internal/cctz/BUILD.bazel
+++ b/third_party/abseil-cpp/absl/time/internal/cctz/BUILD.bazel
@@ -26,14 +26,14 @@
 config_setting(
     name = "osx",
     constraint_values = [
-        "@bazel_tools//platforms:osx",
+        "@platforms//os:osx",
     ],
 )
 
 config_setting(
     name = "ios",
     constraint_values = [
-        "@bazel_tools//platforms:ios",
+        "@platforms//os:ios",
     ],
 )
 
diff --git a/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_info.cc b/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_info.cc
index 8039353..f2777d9 100644
--- a/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_info.cc
+++ b/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_info.cc
@@ -43,6 +43,7 @@
 #include <memory>
 #include <sstream>
 #include <string>
+#include <utility>
 
 #include "absl/base/config.h"
 #include "absl/time/internal/cctz/include/cctz/civil_time.h"
@@ -576,14 +577,17 @@
 
 namespace {
 
+using FilePtr = std::unique_ptr<FILE, int (*)(FILE*)>;
+
 // fopen(3) adaptor.
-inline FILE* FOpen(const char* path, const char* mode) {
+inline FilePtr FOpen(const char* path, const char* mode) {
 #if defined(_MSC_VER)
   FILE* fp;
   if (fopen_s(&fp, path, mode) != 0) fp = nullptr;
-  return fp;
+  return FilePtr(fp, fclose);
 #else
-  return fopen(path, mode);  // TODO: Enable the close-on-exec flag.
+  // TODO: Enable the close-on-exec flag.
+  return FilePtr(fopen(path, mode), fclose);
 #endif
 }
 
@@ -611,11 +615,11 @@
 
  protected:
   explicit FileZoneInfoSource(
-      FILE* fp, std::size_t len = std::numeric_limits<std::size_t>::max())
-      : fp_(fp, fclose), len_(len) {}
+      FilePtr fp, std::size_t len = std::numeric_limits<std::size_t>::max())
+      : fp_(std::move(fp)), len_(len) {}
 
  private:
-  std::unique_ptr<FILE, int (*)(FILE*)> fp_;
+  FilePtr fp_;
   std::size_t len_;
 };
 
@@ -644,17 +648,9 @@
   path.append(name, pos, std::string::npos);
 
   // Open the zoneinfo file.
-  FILE* fp = FOpen(path.c_str(), "rb");
-  if (fp == nullptr) return nullptr;
-  std::size_t length = 0;
-  if (fseek(fp, 0, SEEK_END) == 0) {
-    long offset = ftell(fp);
-    if (offset >= 0) {
-      length = static_cast<std::size_t>(offset);
-    }
-    rewind(fp);
-  }
-  return std::unique_ptr<ZoneInfoSource>(new FileZoneInfoSource(fp, length));
+  auto fp = FOpen(path.c_str(), "rb");
+  if (fp.get() == nullptr) return nullptr;
+  return std::unique_ptr<ZoneInfoSource>(new FileZoneInfoSource(std::move(fp)));
 }
 
 class AndroidZoneInfoSource : public FileZoneInfoSource {
@@ -663,8 +659,9 @@
   std::string Version() const override { return version_; }
 
  private:
-  explicit AndroidZoneInfoSource(FILE* fp, std::size_t len, const char* vers)
-      : FileZoneInfoSource(fp, len), version_(vers) {}
+  explicit AndroidZoneInfoSource(FilePtr fp, std::size_t len,
+                                 std::string version)
+      : FileZoneInfoSource(std::move(fp), len), version_(std::move(version)) {}
   std::string version_;
 };
 
@@ -676,7 +673,7 @@
   // See Android's libc/tzcode/bionic.cpp for additional information.
   for (const char* tzdata : {"/data/misc/zoneinfo/current/tzdata",
                              "/system/usr/share/zoneinfo/tzdata"}) {
-    std::unique_ptr<FILE, int (*)(FILE*)> fp(FOpen(tzdata, "rb"), fclose);
+    auto fp = FOpen(tzdata, "rb");
     if (fp.get() == nullptr) continue;
 
     char hbuf[24];  // covers header.zonetab_offset too
@@ -703,7 +700,7 @@
       if (strcmp(name.c_str() + pos, ebuf) == 0) {
         if (fseek(fp.get(), static_cast<long>(start), SEEK_SET) != 0) break;
         return std::unique_ptr<ZoneInfoSource>(new AndroidZoneInfoSource(
-            fp.release(), static_cast<std::size_t>(length), vers));
+            std::move(fp), static_cast<std::size_t>(length), vers));
       }
     }
   }
diff --git a/third_party/abseil-cpp/absl/time/time.h b/third_party/abseil-cpp/absl/time/time.h
index 7fa0f5c..e9cbce8 100644
--- a/third_party/abseil-cpp/absl/time/time.h
+++ b/third_party/abseil-cpp/absl/time/time.h
@@ -182,18 +182,29 @@
 
   // Overloads that forward to either the int64_t or double overloads above.
   // Integer operands must be representable as int64_t.
-  template <typename T>
+  template <typename T, time_internal::EnableIfIntegral<T> = 0>
   Duration& operator*=(T r) {
     int64_t x = r;
     return *this *= x;
   }
-  template <typename T>
+
+  template <typename T, time_internal::EnableIfIntegral<T> = 0>
   Duration& operator/=(T r) {
     int64_t x = r;
     return *this /= x;
   }
-  Duration& operator*=(float r) { return *this *= static_cast<double>(r); }
-  Duration& operator/=(float r) { return *this /= static_cast<double>(r); }
+
+  template <typename T, time_internal::EnableIfFloat<T> = 0>
+  Duration& operator*=(T r) {
+    double x = r;
+    return *this *= x;
+  }
+
+  template <typename T, time_internal::EnableIfFloat<T> = 0>
+  Duration& operator/=(T r) {
+    double x = r;
+    return *this /= x;
+  }
 
   template <typename H>
   friend H AbslHashValue(H h, Duration d) {
@@ -392,12 +403,30 @@
 //
 //   absl::Duration a = absl::Seconds(60);
 //   absl::Duration b = absl::Minutes(1);  // b == a
-constexpr Duration Nanoseconds(int64_t n);
-constexpr Duration Microseconds(int64_t n);
-constexpr Duration Milliseconds(int64_t n);
-constexpr Duration Seconds(int64_t n);
-constexpr Duration Minutes(int64_t n);
-constexpr Duration Hours(int64_t n);
+template <typename T, time_internal::EnableIfIntegral<T> = 0>
+constexpr Duration Nanoseconds(T n) {
+  return time_internal::FromInt64(n, std::nano{});
+}
+template <typename T, time_internal::EnableIfIntegral<T> = 0>
+constexpr Duration Microseconds(T n) {
+  return time_internal::FromInt64(n, std::micro{});
+}
+template <typename T, time_internal::EnableIfIntegral<T> = 0>
+constexpr Duration Milliseconds(T n) {
+  return time_internal::FromInt64(n, std::milli{});
+}
+template <typename T, time_internal::EnableIfIntegral<T> = 0>
+constexpr Duration Seconds(T n) {
+  return time_internal::FromInt64(n, std::ratio<1>{});
+}
+template <typename T, time_internal::EnableIfIntegral<T> = 0>
+constexpr Duration Minutes(T n) {
+  return time_internal::FromInt64(n, std::ratio<60>{});
+}
+template <typename T, time_internal::EnableIfIntegral<T> = 0>
+constexpr Duration Hours(T n) {
+  return time_internal::FromInt64(n, std::ratio<3600>{});
+}
 
 // Factory overloads for constructing `Duration` values from a floating-point
 // number of the unit indicated by the factory function's name. These functions
@@ -1496,25 +1525,6 @@
 
 }  // namespace time_internal
 
-constexpr Duration Nanoseconds(int64_t n) {
-  return time_internal::FromInt64(n, std::nano{});
-}
-constexpr Duration Microseconds(int64_t n) {
-  return time_internal::FromInt64(n, std::micro{});
-}
-constexpr Duration Milliseconds(int64_t n) {
-  return time_internal::FromInt64(n, std::milli{});
-}
-constexpr Duration Seconds(int64_t n) {
-  return time_internal::FromInt64(n, std::ratio<1>{});
-}
-constexpr Duration Minutes(int64_t n) {
-  return time_internal::FromInt64(n, std::ratio<60>{});
-}
-constexpr Duration Hours(int64_t n) {
-  return time_internal::FromInt64(n, std::ratio<3600>{});
-}
-
 constexpr bool operator<(Duration lhs, Duration rhs) {
   return time_internal::GetRepHi(lhs) != time_internal::GetRepHi(rhs)
              ? time_internal::GetRepHi(lhs) < time_internal::GetRepHi(rhs)
diff --git a/third_party/abseil-cpp/absl/types/bad_optional_access.h b/third_party/abseil-cpp/absl/types/bad_optional_access.h
index a500286..049e72a 100644
--- a/third_party/abseil-cpp/absl/types/bad_optional_access.h
+++ b/third_party/abseil-cpp/absl/types/bad_optional_access.h
@@ -67,7 +67,7 @@
 namespace optional_internal {
 
 // throw delegator
-[[noreturn]] void throw_bad_optional_access();
+[[noreturn]] ABSL_DLL void throw_bad_optional_access();
 
 }  // namespace optional_internal
 ABSL_NAMESPACE_END
diff --git a/third_party/abseil-cpp/absl/types/bad_variant_access.h b/third_party/abseil-cpp/absl/types/bad_variant_access.h
index 095969f..8ab215e 100644
--- a/third_party/abseil-cpp/absl/types/bad_variant_access.h
+++ b/third_party/abseil-cpp/absl/types/bad_variant_access.h
@@ -70,8 +70,8 @@
 
 namespace variant_internal {
 
-[[noreturn]] void ThrowBadVariantAccess();
-[[noreturn]] void Rethrow();
+[[noreturn]] ABSL_DLL void ThrowBadVariantAccess();
+[[noreturn]] ABSL_DLL void Rethrow();
 
 }  // namespace variant_internal
 ABSL_NAMESPACE_END
diff --git a/third_party/abseil-cpp/absl/types/span.h b/third_party/abseil-cpp/absl/types/span.h
index 41db342..6272bb7 100644
--- a/third_party/abseil-cpp/absl/types/span.h
+++ b/third_party/abseil-cpp/absl/types/span.h
@@ -40,7 +40,6 @@
 //    * `absl::Span` has compiler-provided move and copy constructors and
 //      assignment. This is due to them being specified as `constexpr`, but that
 //      implies const in C++11.
-//    * `absl::Span` has no `element_type` typedef
 //    * A read-only `absl::Span<const T>` can be implicitly constructed from an
 //      initializer list.
 //    * `absl::Span` has no `bytes()`, `size_bytes()`, `as_bytes()`, or
@@ -170,6 +169,7 @@
       typename std::enable_if<!std::is_const<T>::value, U>::type;
 
  public:
+  using element_type = T;
   using value_type = absl::remove_cv_t<T>;
   using pointer = T*;
   using const_pointer = const T*;
diff --git a/third_party/abseil-cpp/absl/types/span_test.cc b/third_party/abseil-cpp/absl/types/span_test.cc
index 2584339..13264aa 100644
--- a/third_party/abseil-cpp/absl/types/span_test.cc
+++ b/third_party/abseil-cpp/absl/types/span_test.cc
@@ -661,6 +661,8 @@
   CheckType<absl::Span<int>::const_reverse_iterator>(slice.crend());
   testing::StaticAssertTypeEq<int, absl::Span<int>::value_type>();
   testing::StaticAssertTypeEq<int, absl::Span<const int>::value_type>();
+  testing::StaticAssertTypeEq<int, absl::Span<int>::element_type>();
+  testing::StaticAssertTypeEq<const int, absl::Span<const int>::element_type>();
   testing::StaticAssertTypeEq<int*, absl::Span<int>::pointer>();
   testing::StaticAssertTypeEq<const int*, absl::Span<const int>::pointer>();
   testing::StaticAssertTypeEq<int&, absl::Span<int>::reference>();
diff --git a/third_party/abseil-cpp/ci/cmake_common.sh b/third_party/abseil-cpp/ci/cmake_common.sh
index 626fed0..51f3106 100644
--- a/third_party/abseil-cpp/ci/cmake_common.sh
+++ b/third_party/abseil-cpp/ci/cmake_common.sh
@@ -14,7 +14,7 @@
 
 # The commit of GoogleTest to be used in the CMake tests in this directory.
 # Keep this in sync with the commit in the WORKSPACE file.
-readonly ABSL_GOOGLETEST_COMMIT="5bcd8e3bb929714e031a542d303f818e5a5af45d"
+readonly ABSL_GOOGLETEST_COMMIT="8d51ffdfab10b3fba636ae69bc03da4b54f8c235"
 
 # Avoid depending on GitHub by looking for a cached copy of the commit first.
 if [[ -r "${KOKORO_GFILE_DIR:-}/distdir/${ABSL_GOOGLETEST_COMMIT}.zip" ]]; then
diff --git a/third_party/abseil-cpp/create_lts.py b/third_party/abseil-cpp/create_lts.py
index d5d7b28..5617080 100755
--- a/third_party/abseil-cpp/create_lts.py
+++ b/third_party/abseil-cpp/create_lts.py
@@ -96,6 +96,13 @@
 
   # Replacement directives go here.
   ReplaceStringsInFile(
+      'absl/base/config.h', {
+          '#undef ABSL_LTS_RELEASE_VERSION':
+              '#define ABSL_LTS_RELEASE_VERSION {}'.format(datestamp),
+          '#undef ABSL_LTS_RELEASE_PATCH_LEVEL':
+              '#define ABSL_LTS_RELEASE_PATCH_LEVEL 0'
+      })
+  ReplaceStringsInFile(
       'absl/base/options.h', {
           '#define ABSL_OPTION_USE_INLINE_NAMESPACE 0':
               '#define ABSL_OPTION_USE_INLINE_NAMESPACE 1',
diff --git a/third_party/abseil-cpp/generate_def_files.py b/third_party/abseil-cpp/generate_def_files.py
index 3f0d03b..f288c9b 100755
--- a/third_party/abseil-cpp/generate_def_files.py
+++ b/third_party/abseil-cpp/generate_def_files.py
@@ -1,6 +1,4 @@
-#!/usr/bin/env python
-
-# NOTE: This script requires python 3.
+#!/usr/bin/env python3
 
 """Script to generate Chromium's Abseil .def files at roll time.
 
diff --git a/third_party/abseil-cpp/roll_abseil.py b/third_party/abseil-cpp/roll_abseil.py
index 6d54e4f..365b460 100755
--- a/third_party/abseil-cpp/roll_abseil.py
+++ b/third_party/abseil-cpp/roll_abseil.py
@@ -1,6 +1,4 @@
-#!/usr/bin/env python
-
-# NOTE: This script requires python 3.
+#!/usr/bin/env python3
 
 """Script to do the first step of Abseil roll into chromium.
 """
diff --git a/third_party/abseil-cpp/symbols_arm64_dbg.def b/third_party/abseil-cpp/symbols_arm64_dbg.def
index 36a1267..a943d3f 100644
--- a/third_party/abseil-cpp/symbols_arm64_dbg.def
+++ b/third_party/abseil-cpp/symbols_arm64_dbg.def
@@ -1,6 +1,7 @@
 EXPORTS
     ??$?0$$CBD$0A@@VoidPtr@str_format_internal@absl@@QEAA@PEBD@Z
     ??$?0$$CBU?$atomic@_N@__1@std@@@Condition@absl@@QEAA@P6A_NPEBU?$atomic@_N@__1@std@@@Z0@Z
+    ??$?0$$CBUCordRep@cord_internal@absl@@@Hex@absl@@QEAA@PEBUCordRep@cord_internal@1@W4PadSpec@1@@Z
     ??$?0$$CBVFormatArgImpl@str_format_internal@absl@@$$CBV012@@?$Span@$$CBVFormatArgImpl@str_format_internal@absl@@@absl@@QEAA@V?$initializer_list@VFormatArgImpl@str_format_internal@absl@@@std@@@Z
     ??$?0$$T@?$Storage@PEAH$00$0A@@internal_compressed_tuple@container_internal@absl@@QEAA@Uin_place_t@3@$$QEA$$T@Z
     ??$?0$$T@?$Storage@PEAPEAUCordRep@cord_internal@absl@@$00$0A@@internal_compressed_tuple@container_internal@absl@@QEAA@Uin_place_t@3@$$QEA$$T@Z
@@ -220,7 +221,19 @@
     ??$?RW4LogSeverity@absl@@AEBQEBDHAEAPEBD@?$AtomicHook@P6AXW4LogSeverity@absl@@PEBDHAEBV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@Z@base_internal@absl@@QEBAX$$QEAW4LogSeverity@2@AEBQEBD$$QEAHAEAPEBD@Z
     ??$?RW4LogSeverity@absl@@AEBQEBDHAEAV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@?$AtomicHook@P6AXW4LogSeverity@absl@@PEBDHAEBV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@Z@base_internal@absl@@QEBAX$$QEAW4LogSeverity@2@AEBQEBD$$QEAHAEAV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@Z
     ??$?RW4LogSeverity@absl@@AEBQEBDHV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@?$AtomicHook@P6AXW4LogSeverity@absl@@PEBDHAEBV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@Z@base_internal@absl@@QEBAX$$QEAW4LogSeverity@2@AEBQEBD$$QEAH$$QEAV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@Z
-    ??$?XH@Duration@absl@@QEAAAEAV01@H@Z
+    ??$?XH$0A@@Duration@absl@@QEAAAEAV01@H@Z
+    ??$Add@$00@CordRepBtree@cord_internal@absl@@AEAAXPEAUCordRep@12@@Z
+    ??$Add@$00@CordRepBtree@cord_internal@absl@@AEAAXV?$Span@QEAUCordRep@cord_internal@absl@@@2@@Z
+    ??$Add@$0A@@CordRepBtree@cord_internal@absl@@AEAAXPEAUCordRep@12@@Z
+    ??$Add@$0A@@CordRepBtree@cord_internal@absl@@AEAAXV?$Span@QEAUCordRep@cord_internal@absl@@@2@@Z
+    ??$AddCordRep@$00@CordRepBtree@cord_internal@absl@@CAPEAV012@PEAV012@PEAUCordRep@12@@Z
+    ??$AddCordRep@$0A@@CordRepBtree@cord_internal@absl@@CAPEAV012@PEAV012@PEAUCordRep@12@@Z
+    ??$AddData@$00@CordRepBtree@cord_internal@absl@@AEAA?AVstring_view@2@V32@_K@Z
+    ??$AddData@$00@CordRepBtree@cord_internal@absl@@CAPEAV012@PEAV012@Vstring_view@2@_K@Z
+    ??$AddData@$0A@@CordRepBtree@cord_internal@absl@@AEAA?AVstring_view@2@V32@_K@Z
+    ??$AddData@$0A@@CordRepBtree@cord_internal@absl@@CAPEAV012@PEAV012@Vstring_view@2@_K@Z
+    ??$AddEdge@$00@CordRepBtree@cord_internal@absl@@QEAA?AUOpResult@012@_NPEAUCordRep@12@_K@Z
+    ??$AddEdge@$0A@@CordRepBtree@cord_internal@absl@@QEAA?AUOpResult@012@_NPEAUCordRep@12@_K@Z
     ??$AddRing@$00@CordRepRing@cord_internal@absl@@CAPEAV012@PEAV012@0_K1@Z
     ??$AddRing@$0A@@CordRepRing@cord_internal@absl@@CAPEAV012@PEAV012@0_K1@Z
     ??$Append@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@$0A@@Cord@absl@@QEAAX$$QEAV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@Z
@@ -247,25 +260,25 @@
     ??$ArgumentToConv@_J@str_format_internal@absl@@YA?AW4FormatConversionCharSet@1@XZ
     ??$ArgumentToConv@_K@str_format_internal@absl@@YA?AW4FormatConversionCharSet@1@XZ
     ??$ArgumentToConv@_N@str_format_internal@absl@@YA?AW4FormatConversionCharSet@1@XZ
-    ??$AssignElements@PEAUPayload@status_internal@absl@@V?$IteratorValueAdapter@V?$allocator@UPayload@status_internal@absl@@@__1@std@@V?$move_iterator@PEAUPayload@status_internal@absl@@@23@@inlined_vector_internal@3@_K@inlined_vector_internal@absl@@YAXPEAUPayload@status_internal@1@PEAV?$IteratorValueAdapter@V?$allocator@UPayload@status_internal@absl@@@__1@std@@V?$move_iterator@PEAUPayload@status_internal@absl@@@23@@01@_K@Z
+    ??$AssignElements@V?$allocator@UPayload@status_internal@absl@@@__1@std@@V?$IteratorValueAdapter@V?$allocator@UPayload@status_internal@absl@@@__1@std@@V?$move_iterator@PEAUPayload@status_internal@absl@@@23@@inlined_vector_internal@absl@@@inlined_vector_internal@absl@@YAXPEAUPayload@status_internal@1@AEAV?$IteratorValueAdapter@V?$allocator@UPayload@status_internal@absl@@@__1@std@@V?$move_iterator@PEAUPayload@status_internal@absl@@@23@@01@_K@Z
     ??$Base64EscapeInternal@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@strings_internal@absl@@YAXPEBE_KPEAV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@_NPEBD@Z
     ??$CallOnceImpl@A6AXXZ$$V@base_internal@absl@@YAXPEAU?$atomic@I@__1@std@@W4SchedulingMode@01@A6AXXZ@Z
     ??$CastAndCallFunction@$$CBU?$atomic@_N@__1@std@@@Condition@absl@@CA_NPEBV01@@Z
     ??$CastAndCallFunction@USynchEvent@absl@@@Condition@absl@@CA_NPEBV01@@Z
     ??$Compare@$0FE@$0FE@@strings_internal@absl@@YAHAEBV?$BigUnsigned@$0FE@@01@0@Z
-    ??$ConstructElements@V?$allocator@H@__1@std@@PEAHV?$IteratorValueAdapter@V?$allocator@H@__1@std@@V?$move_iterator@PEAH@23@@inlined_vector_internal@absl@@_K@inlined_vector_internal@absl@@YAXPEAV?$allocator@H@__1@std@@PEAHPEAV?$IteratorValueAdapter@V?$allocator@H@__1@std@@V?$move_iterator@PEAH@23@@01@_K@Z
-    ??$ConstructElements@V?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@PEAPEAUCordRep@cord_internal@absl@@V?$CopyValueAdapter@V?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@@inlined_vector_internal@6@_K@inlined_vector_internal@absl@@YAXPEAV?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@PEAPEAUCordRep@cord_internal@1@PEAV?$CopyValueAdapter@V?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@@01@_K@Z
-    ??$ConstructElements@V?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@PEAPEAUCordRep@cord_internal@absl@@V?$IteratorValueAdapter@V?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@V?$move_iterator@PEAPEAUCordRep@cord_internal@absl@@@23@@inlined_vector_internal@6@_K@inlined_vector_internal@absl@@YAXPEAV?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@PEAPEAUCordRep@cord_internal@1@PEAV?$IteratorValueAdapter@V?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@V?$move_iterator@PEAPEAUCordRep@cord_internal@absl@@@23@@01@_K@Z
-    ??$ConstructElements@V?$allocator@PEBUCordRep@cord_internal@absl@@@__1@std@@PEAPEBUCordRep@cord_internal@absl@@V?$IteratorValueAdapter@V?$allocator@PEBUCordRep@cord_internal@absl@@@__1@std@@V?$move_iterator@PEAPEBUCordRep@cord_internal@absl@@@23@@inlined_vector_internal@6@_K@inlined_vector_internal@absl@@YAXPEAV?$allocator@PEBUCordRep@cord_internal@absl@@@__1@std@@PEAPEBUCordRep@cord_internal@1@PEAV?$IteratorValueAdapter@V?$allocator@PEBUCordRep@cord_internal@absl@@@__1@std@@V?$move_iterator@PEAPEBUCordRep@cord_internal@absl@@@23@@01@_K@Z
-    ??$ConstructElements@V?$allocator@UPayload@status_internal@absl@@@__1@std@@PEAUPayload@status_internal@absl@@V?$IteratorValueAdapter@V?$allocator@UPayload@status_internal@absl@@@__1@std@@PEBUPayload@status_internal@absl@@@inlined_vector_internal@6@_K@inlined_vector_internal@absl@@YAXPEAV?$allocator@UPayload@status_internal@absl@@@__1@std@@PEAUPayload@status_internal@1@PEAV?$IteratorValueAdapter@V?$allocator@UPayload@status_internal@absl@@@__1@std@@PEBUPayload@status_internal@absl@@@01@_K@Z
-    ??$ConstructElements@V?$allocator@UPayload@status_internal@absl@@@__1@std@@PEAUPayload@status_internal@absl@@V?$IteratorValueAdapter@V?$allocator@UPayload@status_internal@absl@@@__1@std@@V?$move_iterator@PEAUPayload@status_internal@absl@@@23@@inlined_vector_internal@6@_K@inlined_vector_internal@absl@@YAXPEAV?$allocator@UPayload@status_internal@absl@@@__1@std@@PEAUPayload@status_internal@1@PEAV?$IteratorValueAdapter@V?$allocator@UPayload@status_internal@absl@@@__1@std@@V?$move_iterator@PEAUPayload@status_internal@absl@@@23@@01@_K@Z
-    ??$ConstructElements@V?$allocator@USubRange@absl@@@__1@std@@PEAUSubRange@absl@@V?$IteratorValueAdapter@V?$allocator@USubRange@absl@@@__1@std@@V?$move_iterator@PEAUSubRange@absl@@@23@@inlined_vector_internal@5@_K@inlined_vector_internal@absl@@YAXPEAV?$allocator@USubRange@absl@@@__1@std@@PEAUSubRange@1@PEAV?$IteratorValueAdapter@V?$allocator@USubRange@absl@@@__1@std@@V?$move_iterator@PEAUSubRange@absl@@@23@@01@_K@Z
+    ??$ConstructElements@V?$allocator@H@__1@std@@V?$IteratorValueAdapter@V?$allocator@H@__1@std@@V?$move_iterator@PEAH@23@@inlined_vector_internal@absl@@@inlined_vector_internal@absl@@YAXAEAV?$allocator@H@__1@std@@PEAHAEAV?$IteratorValueAdapter@V?$allocator@H@__1@std@@V?$move_iterator@PEAH@23@@01@_K@Z
+    ??$ConstructElements@V?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@V?$CopyValueAdapter@V?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@@inlined_vector_internal@absl@@@inlined_vector_internal@absl@@YAXAEAV?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@PEAPEAUCordRep@cord_internal@1@AEAV?$CopyValueAdapter@V?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@@01@_K@Z
+    ??$ConstructElements@V?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@V?$IteratorValueAdapter@V?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@V?$move_iterator@PEAPEAUCordRep@cord_internal@absl@@@23@@inlined_vector_internal@absl@@@inlined_vector_internal@absl@@YAXAEAV?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@PEAPEAUCordRep@cord_internal@1@AEAV?$IteratorValueAdapter@V?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@V?$move_iterator@PEAPEAUCordRep@cord_internal@absl@@@23@@01@_K@Z
+    ??$ConstructElements@V?$allocator@PEBUCordRep@cord_internal@absl@@@__1@std@@V?$IteratorValueAdapter@V?$allocator@PEBUCordRep@cord_internal@absl@@@__1@std@@V?$move_iterator@PEAPEBUCordRep@cord_internal@absl@@@23@@inlined_vector_internal@absl@@@inlined_vector_internal@absl@@YAXAEAV?$allocator@PEBUCordRep@cord_internal@absl@@@__1@std@@PEAPEBUCordRep@cord_internal@1@AEAV?$IteratorValueAdapter@V?$allocator@PEBUCordRep@cord_internal@absl@@@__1@std@@V?$move_iterator@PEAPEBUCordRep@cord_internal@absl@@@23@@01@_K@Z
+    ??$ConstructElements@V?$allocator@UPayload@status_internal@absl@@@__1@std@@V?$IteratorValueAdapter@V?$allocator@UPayload@status_internal@absl@@@__1@std@@PEBUPayload@status_internal@absl@@@inlined_vector_internal@absl@@@inlined_vector_internal@absl@@YAXAEAV?$allocator@UPayload@status_internal@absl@@@__1@std@@PEAUPayload@status_internal@1@AEAV?$IteratorValueAdapter@V?$allocator@UPayload@status_internal@absl@@@__1@std@@PEBUPayload@status_internal@absl@@@01@_K@Z
+    ??$ConstructElements@V?$allocator@UPayload@status_internal@absl@@@__1@std@@V?$IteratorValueAdapter@V?$allocator@UPayload@status_internal@absl@@@__1@std@@V?$move_iterator@PEAUPayload@status_internal@absl@@@23@@inlined_vector_internal@absl@@@inlined_vector_internal@absl@@YAXAEAV?$allocator@UPayload@status_internal@absl@@@__1@std@@PEAUPayload@status_internal@1@AEAV?$IteratorValueAdapter@V?$allocator@UPayload@status_internal@absl@@@__1@std@@V?$move_iterator@PEAUPayload@status_internal@absl@@@23@@01@_K@Z
+    ??$ConstructElements@V?$allocator@USubRange@absl@@@__1@std@@V?$IteratorValueAdapter@V?$allocator@USubRange@absl@@@__1@std@@V?$move_iterator@PEAUSubRange@absl@@@23@@inlined_vector_internal@absl@@@inlined_vector_internal@absl@@YAXAEAV?$allocator@USubRange@absl@@@__1@std@@PEAUSubRange@1@AEAV?$IteratorValueAdapter@V?$allocator@USubRange@absl@@@__1@std@@V?$move_iterator@PEAUSubRange@absl@@@23@@01@_K@Z
     ??$Convert@VFormatArgImpl@str_format_internal@absl@@@FormatArgImplFriend@str_format_internal@absl@@SA_NVFormatArgImpl@12@VFormatConversionSpecImpl@12@PEAVFormatSinkImpl@12@@Z
-    ??$DestroyElements@V?$allocator@H@__1@std@@PEAH_K@inlined_vector_internal@absl@@YAXPEAV?$allocator@H@__1@std@@PEAH_K@Z
-    ??$DestroyElements@V?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@PEAPEAUCordRep@cord_internal@absl@@_K@inlined_vector_internal@absl@@YAXPEAV?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@PEAPEAUCordRep@cord_internal@1@_K@Z
-    ??$DestroyElements@V?$allocator@PEBUCordRep@cord_internal@absl@@@__1@std@@PEAPEBUCordRep@cord_internal@absl@@_K@inlined_vector_internal@absl@@YAXPEAV?$allocator@PEBUCordRep@cord_internal@absl@@@__1@std@@PEAPEBUCordRep@cord_internal@1@_K@Z
-    ??$DestroyElements@V?$allocator@UPayload@status_internal@absl@@@__1@std@@PEAUPayload@status_internal@absl@@_K@inlined_vector_internal@absl@@YAXPEAV?$allocator@UPayload@status_internal@absl@@@__1@std@@PEAUPayload@status_internal@1@_K@Z
-    ??$DestroyElements@V?$allocator@USubRange@absl@@@__1@std@@PEAUSubRange@absl@@_K@inlined_vector_internal@absl@@YAXPEAV?$allocator@USubRange@absl@@@__1@std@@PEAUSubRange@1@_K@Z
+    ??$DestroyElements@V?$allocator@H@__1@std@@@inlined_vector_internal@absl@@YAXAEAV?$allocator@H@__1@std@@PEAH_K@Z
+    ??$DestroyElements@V?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@@inlined_vector_internal@absl@@YAXAEAV?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@PEAPEAUCordRep@cord_internal@1@_K@Z
+    ??$DestroyElements@V?$allocator@PEBUCordRep@cord_internal@absl@@@__1@std@@@inlined_vector_internal@absl@@YAXAEAV?$allocator@PEBUCordRep@cord_internal@absl@@@__1@std@@PEAPEBUCordRep@cord_internal@1@_K@Z
+    ??$DestroyElements@V?$allocator@UPayload@status_internal@absl@@@__1@std@@@inlined_vector_internal@absl@@YAXAEAV?$allocator@UPayload@status_internal@absl@@@__1@std@@PEAUPayload@status_internal@1@_K@Z
+    ??$DestroyElements@V?$allocator@USubRange@absl@@@__1@std@@@inlined_vector_internal@absl@@YAXAEAV?$allocator@USubRange@absl@@@__1@std@@PEAUSubRange@1@_K@Z
     ??$Dispatch@C@FormatArgImpl@str_format_internal@absl@@CA_NTData@012@VFormatConversionSpecImpl@12@PEAX@Z
     ??$Dispatch@D@FormatArgImpl@str_format_internal@absl@@CA_NTData@012@VFormatConversionSpecImpl@12@PEAX@Z
     ??$Dispatch@E@FormatArgImpl@str_format_internal@absl@@CA_NTData@012@VFormatConversionSpecImpl@12@PEAX@Z
@@ -349,6 +362,8 @@
     ??$HidePtr@$$CBX@base_internal@absl@@YA_KPEBX@Z
     ??$HidePtr@U?$atomic@_J@__1@std@@@base_internal@absl@@YA_KPEAU?$atomic@_J@__1@std@@@Z
     ??$HidePtr@X@base_internal@absl@@YA_KPEAX@Z
+    ??$Hours@H$0A@@absl@@YA?AVDuration@0@H@Z
+    ??$Init@$0A@@CordRepBtreeNavigator@cord_internal@absl@@AEAAPEAUCordRep@12@PEAVCordRepBtree@12@@Z
     ??$Init@H@FormatArgImpl@str_format_internal@absl@@AEAAXAEBH@Z
     ??$Initialize@V?$CopyValueAdapter@V?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@@inlined_vector_internal@absl@@@?$Storage@PEAUCordRep@cord_internal@absl@@$0CP@V?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@@inlined_vector_internal@absl@@QEAAXV?$CopyValueAdapter@V?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@@12@_K@Z
     ??$Invoke@A6AXXZ$$V@Callable@base_internal@absl@@SAXA6AXXZ@Z
@@ -364,7 +379,19 @@
     ??$MakeSpan@$SI$0CIA@@absl@@YA?AV?$Span@I@0@AEAY0CIA@I@Z
     ??$MakeSpan@$SI$0IA@@absl@@YA?AV?$Span@I@0@AEAY0IA@I@Z
     ??$MakeSpan@$SVFormatArgImpl@str_format_internal@absl@@@absl@@YA?AV?$Span@VFormatArgImpl@str_format_internal@absl@@@0@PEAVFormatArgImpl@str_format_internal@0@_K@Z
+    ??$Merge@$00@CordRepBtree@cord_internal@absl@@CAPEAV012@PEAV012@0@Z
+    ??$Merge@$0A@@CordRepBtree@cord_internal@absl@@CAPEAV012@PEAV012@0@Z
+    ??$Microseconds@H$0A@@absl@@YA?AVDuration@0@H@Z
+    ??$Microseconds@J$0A@@absl@@YA?AVDuration@0@J@Z
+    ??$Milliseconds@H$0A@@absl@@YA?AVDuration@0@H@Z
+    ??$Milliseconds@K$0A@@absl@@YA?AVDuration@0@K@Z
     ??$Milliseconds@N$0A@@absl@@YA?AVDuration@0@N@Z
+    ??$Minutes@H$0A@@absl@@YA?AVDuration@0@H@Z
+    ??$Nanoseconds@H$0A@@absl@@YA?AVDuration@0@H@Z
+    ??$Nanoseconds@J$0A@@absl@@YA?AVDuration@0@J@Z
+    ??$Nanoseconds@_J$0A@@absl@@YA?AVDuration@0@_J@Z
+    ??$NewLeaf@$00@CordRepBtree@cord_internal@absl@@CAPEAV012@Vstring_view@2@_K@Z
+    ??$NewLeaf@$0A@@CordRepBtree@cord_internal@absl@@CAPEAV012@Vstring_view@2@_K@Z
     ??$Offset@$00$0A@@?$LayoutImpl@V?$tuple@_KPEAUCordRep@cord_internal@absl@@I@__1@std@@U?$integer_sequence@_K$0A@$00$01@absl@@U45@@internal_layout@container_internal@absl@@QEBA_KXZ
     ??$Offset@$00$0A@@?$LayoutImpl@V?$tuple@_KPEAUCordRep@cord_internal@absl@@I@__1@std@@U?$integer_sequence@_K$0A@$00@absl@@U?$integer_sequence@_K$0A@$00$01@5@@internal_layout@container_internal@absl@@QEBA_KXZ
     ??$Offset@$00$0A@@?$LayoutImpl@V?$tuple@_KPEAUCordRep@cord_internal@absl@@I@__1@std@@U?$integer_sequence@_K$0A@@absl@@U?$integer_sequence@_K$0A@$00@5@@internal_layout@container_internal@absl@@QEBA_KXZ
@@ -394,6 +421,11 @@
     ??$STLStringReserveAmortized@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@strings_internal@absl@@YAXPEAV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@_K@Z
     ??$STLStringResizeUninitialized@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@X@strings_internal@absl@@YAXPEAV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@_K@Z
     ??$STLStringResizeUninitializedAmortized@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@strings_internal@absl@@YAXPEAV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@_K@Z
+    ??$Seconds@H$0A@@absl@@YA?AVDuration@0@H@Z
+    ??$Seconds@J$0A@@absl@@YA?AVDuration@0@J@Z
+    ??$Seconds@_J$0A@@absl@@YA?AVDuration@0@_J@Z
+    ??$SetEdge@$00@CordRepBtree@cord_internal@absl@@QEAA?AUOpResult@012@_NPEAUCordRep@12@_K@Z
+    ??$SetEdge@$0A@@CordRepBtree@cord_internal@absl@@QEAA?AUOpResult@012@_NPEAUCordRep@12@_K@Z
     ??$SharedCompareImpl@VCord@absl@@@absl@@YAHAEBVCord@0@0@Z
     ??$SharedCompareImpl@Vstring_view@absl@@@absl@@YAHAEBVCord@0@AEBVstring_view@0@@Z
     ??$StrAppend@$$V@absl@@YAXPEAV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@AEBVAlphaNum@0@1111@Z
@@ -439,6 +471,7 @@
     ??$ToIntVal@_J@FormatArgImpl@str_format_internal@absl@@CAHAEB_J@Z
     ??$ToIntVal@_K@FormatArgImpl@str_format_internal@absl@@CAHAEB_K@Z
     ??$ToIntVal@_N@FormatArgImpl@str_format_internal@absl@@CAHAEB_N@Z
+    ??$TrailingZeros@_K@container_internal@absl@@YAI_K@Z
     ??$UnhidePtr@X@base_internal@absl@@YAPEAX_K@Z
     ??$__advance@PEBUTransition@cctz@time_internal@absl@@@__1@std@@YAXAEAPEBUTransition@cctz@time_internal@absl@@_JUrandom_access_iterator_tag@01@@Z
     ??$__advance@PEBVFormatArgImpl@str_format_internal@absl@@@__1@std@@YAXAEAPEBVFormatArgImpl@str_format_internal@absl@@_JUrandom_access_iterator_tag@01@@Z
@@ -523,16 +556,11 @@
     ??$__upper_bound@AEAUByUnixTime@Transition@cctz@time_internal@absl@@PEBU2345@U2345@@__1@std@@YAPEBUTransition@cctz@time_internal@absl@@PEBU2345@0AEBU2345@AEAUByUnixTime@2345@@Z
     ??$addressof@$$CBU?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@@__1@std@@YAPEBU?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@01@AEBU201@@Z
     ??$addressof@$$CBU?$pair@$$CBV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@@__1@std@@YAPEBU?$pair@$$CBV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@01@AEBU201@@Z
-    ??$addressof@$$CBV?$allocator@UPayload@status_internal@absl@@@__1@std@@@__1@std@@YAPEBV?$allocator@UPayload@status_internal@absl@@@01@AEBV201@@Z
     ??$addressof@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@YAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@AEAPEBV23456@@Z
     ??$addressof@QEAUCordRep@cord_internal@absl@@@__1@std@@YAPEBQEAUCordRep@cord_internal@absl@@AEBQEAU234@@Z
     ??$addressof@U?$__hash_node_base@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@PEAX@__1@std@@@__1@std@@@__1@std@@YAPEAU?$__hash_node_base@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@PEAX@__1@std@@@01@AEAU201@@Z
     ??$addressof@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@@__1@std@@YAPEAU?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@01@AEAU201@@Z
     ??$addressof@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@@__1@std@@YAPEAU?$pair@$$CBV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@01@AEAU201@@Z
-    ??$addressof@V?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@@__1@std@@YAPEAV?$allocator@PEAUCordRep@cord_internal@absl@@@01@AEAV201@@Z
-    ??$addressof@V?$allocator@PEBUCordRep@cord_internal@absl@@@__1@std@@@__1@std@@YAPEAV?$allocator@PEBUCordRep@cord_internal@absl@@@01@AEAV201@@Z
-    ??$addressof@V?$allocator@UPayload@status_internal@absl@@@__1@std@@@__1@std@@YAPEAV?$allocator@UPayload@status_internal@absl@@@01@AEAV201@@Z
-    ??$addressof@V?$allocator@USubRange@absl@@@__1@std@@@__1@std@@YAPEAV?$allocator@USubRange@absl@@@01@AEAV201@@Z
     ??$advance@PEBUTransition@cctz@time_internal@absl@@_J@__1@std@@YAXAEAPEBUTransition@cctz@time_internal@absl@@_J@Z
     ??$advance@PEBVFormatArgImpl@str_format_internal@absl@@_K@__1@std@@YAXAEAPEBVFormatArgImpl@str_format_internal@absl@@_K@Z
     ??$assign@PEBVFormatArgImpl@str_format_internal@absl@@@?$vector@VFormatArgImpl@str_format_internal@absl@@V?$allocator@VFormatArgImpl@str_format_internal@absl@@@__1@std@@@__1@std@@QEAAXPEBVFormatArgImpl@str_format_internal@absl@@0@Z
@@ -540,23 +568,20 @@
     ??$bit_cast@_J_K$0A@@absl@@YA_JAEB_K@Z
     ??$bit_cast@_K_J$0A@@absl@@YA_KAEB_J@Z
     ??$bit_width@_K@absl@@YA_K_K@Z
-    ??$construct@HAEBH@?$allocator_traits@V?$allocator@H@__1@std@@@absl@@SAXAEAV?$allocator@H@__1@std@@PEAHAEBH@Z
-    ??$construct@HH@?$allocator_traits@V?$allocator@H@__1@std@@@absl@@SAXAEAV?$allocator@H@__1@std@@PEAH$$QEAH@Z
     ??$construct@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@AEBQEAPEBV12345@@?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@QEAAXPEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@AEBQEAPEBV34567@@Z
     ??$construct@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@AEBQEAPEBV12345@X@?$allocator_traits@V?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@@__1@std@@SAXAEAV?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@12@PEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@AEBQEAPEBV45678@@Z
     ??$construct@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@PEAPEBV12345@@?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@QEAAXPEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@$$QEAPEAPEBV34567@@Z
     ??$construct@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@PEAPEBV12345@X@?$allocator_traits@V?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@@__1@std@@SAXAEAV?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@12@PEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@$$QEAPEAPEBV45678@@Z
     ??$construct@PEAUCordRep@cord_internal@absl@@AEBQEAU123@@?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@QEAAXPEAPEAUCordRep@cord_internal@absl@@AEBQEAU345@@Z
-    ??$construct@PEAUCordRep@cord_internal@absl@@AEBQEAU123@@?$allocator_traits@V?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@@absl@@SAXAEAV?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@PEAPEAUCordRep@cord_internal@1@AEBQEAU561@@Z
     ??$construct@PEAUCordRep@cord_internal@absl@@AEBQEAU123@X@?$allocator_traits@V?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@@__1@std@@SAXAEAV?$allocator@PEAUCordRep@cord_internal@absl@@@12@PEAPEAUCordRep@cord_internal@absl@@AEBQEAU456@@Z
     ??$construct@PEAUCordRep@cord_internal@absl@@PEAU123@@?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@QEAAXPEAPEAUCordRep@cord_internal@absl@@$$QEAPEAU345@@Z
-    ??$construct@PEAUCordRep@cord_internal@absl@@PEAU123@@?$allocator_traits@V?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@@absl@@SAXAEAV?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@PEAPEAUCordRep@cord_internal@1@$$QEAPEAU561@@Z
+    ??$construct@PEAUCordRep@cord_internal@absl@@PEAU123@X@?$allocator_traits@V?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@@__1@std@@SAXAEAV?$allocator@PEAUCordRep@cord_internal@absl@@@12@PEAPEAUCordRep@cord_internal@absl@@$$QEAPEAU456@@Z
     ??$construct@PEAVCordzHandle@cord_internal@absl@@AEBQEAV123@@?$allocator@PEAVCordzHandle@cord_internal@absl@@@__1@std@@QEAAXPEAPEAVCordzHandle@cord_internal@absl@@AEBQEAV345@@Z
     ??$construct@PEAVCordzHandle@cord_internal@absl@@AEBQEAV123@X@?$allocator_traits@V?$allocator@PEAVCordzHandle@cord_internal@absl@@@__1@std@@@__1@std@@SAXAEAV?$allocator@PEAVCordzHandle@cord_internal@absl@@@12@PEAPEAVCordzHandle@cord_internal@absl@@AEBQEAV456@@Z
     ??$construct@PEBUCordRep@cord_internal@absl@@AEBQEBU123@@?$allocator@PEBUCordRep@cord_internal@absl@@@__1@std@@QEAAXPEAPEBUCordRep@cord_internal@absl@@AEBQEBU345@@Z
-    ??$construct@PEBUCordRep@cord_internal@absl@@AEBQEBU123@@?$allocator_traits@V?$allocator@PEBUCordRep@cord_internal@absl@@@__1@std@@@absl@@SAXAEAV?$allocator@PEBUCordRep@cord_internal@absl@@@__1@std@@PEAPEBUCordRep@cord_internal@1@AEBQEBU561@@Z
+    ??$construct@PEBUCordRep@cord_internal@absl@@AEBQEBU123@X@?$allocator_traits@V?$allocator@PEBUCordRep@cord_internal@absl@@@__1@std@@@__1@std@@SAXAEAV?$allocator@PEBUCordRep@cord_internal@absl@@@12@PEAPEBUCordRep@cord_internal@absl@@AEBQEBU456@@Z
     ??$construct@PEBUCordRep@cord_internal@absl@@PEBU123@@?$allocator@PEBUCordRep@cord_internal@absl@@@__1@std@@QEAAXPEAPEBUCordRep@cord_internal@absl@@$$QEAPEBU345@@Z
-    ??$construct@PEBUCordRep@cord_internal@absl@@PEBU123@@?$allocator_traits@V?$allocator@PEBUCordRep@cord_internal@absl@@@__1@std@@@absl@@SAXAEAV?$allocator@PEBUCordRep@cord_internal@absl@@@__1@std@@PEAPEBUCordRep@cord_internal@1@$$QEAPEBU561@@Z
+    ??$construct@PEBUCordRep@cord_internal@absl@@PEBU123@X@?$allocator_traits@V?$allocator@PEBUCordRep@cord_internal@absl@@@__1@std@@@__1@std@@SAXAEAV?$allocator@PEBUCordRep@cord_internal@absl@@@12@PEAPEBUCordRep@cord_internal@absl@@$$QEAPEBU456@@Z
     ??$construct@PEBVCordzHandle@cord_internal@absl@@AEBQEBV123@@?$allocator@PEBVCordzHandle@cord_internal@absl@@@__1@std@@QEAAXPEAPEBVCordzHandle@cord_internal@absl@@AEBQEBV345@@Z
     ??$construct@PEBVCordzHandle@cord_internal@absl@@AEBQEBV123@X@?$allocator_traits@V?$allocator@PEBVCordzHandle@cord_internal@absl@@@__1@std@@@__1@std@@SAXAEAV?$allocator@PEBVCordzHandle@cord_internal@absl@@@12@PEAPEBVCordzHandle@cord_internal@absl@@AEBQEBV456@@Z
     ??$construct@PEBVImpl@time_zone@cctz@time_internal@absl@@AEBQEBV12345@@?$allocator@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@QEAAXPEAPEBVImpl@time_zone@cctz@time_internal@absl@@AEBQEBV34567@@Z
@@ -566,11 +591,11 @@
     ??$construct@UConversionItem@ParsedFormatBase@str_format_internal@absl@@U1234@@?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__1@std@@QEAAXPEAUConversionItem@ParsedFormatBase@str_format_internal@absl@@$$QEAU3456@@Z
     ??$construct@UConversionItem@ParsedFormatBase@str_format_internal@absl@@U1234@X@?$allocator_traits@V?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__1@std@@@__1@std@@SAXAEAV?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@12@PEAUConversionItem@ParsedFormatBase@str_format_internal@absl@@$$QEAU4567@@Z
     ??$construct@UPayload@status_internal@absl@@AEBU123@@?$allocator@UPayload@status_internal@absl@@@__1@std@@QEAAXPEAUPayload@status_internal@absl@@AEBU345@@Z
-    ??$construct@UPayload@status_internal@absl@@AEBU123@@?$allocator_traits@V?$allocator@UPayload@status_internal@absl@@@__1@std@@@absl@@SAXAEAV?$allocator@UPayload@status_internal@absl@@@__1@std@@PEAUPayload@status_internal@1@AEBU561@@Z
+    ??$construct@UPayload@status_internal@absl@@AEBU123@X@?$allocator_traits@V?$allocator@UPayload@status_internal@absl@@@__1@std@@@__1@std@@SAXAEAV?$allocator@UPayload@status_internal@absl@@@12@PEAUPayload@status_internal@absl@@AEBU456@@Z
     ??$construct@UPayload@status_internal@absl@@U123@@?$allocator@UPayload@status_internal@absl@@@__1@std@@QEAAXPEAUPayload@status_internal@absl@@$$QEAU345@@Z
-    ??$construct@UPayload@status_internal@absl@@U123@@?$allocator_traits@V?$allocator@UPayload@status_internal@absl@@@__1@std@@@absl@@SAXAEAV?$allocator@UPayload@status_internal@absl@@@__1@std@@PEAUPayload@status_internal@1@$$QEAU561@@Z
+    ??$construct@UPayload@status_internal@absl@@U123@X@?$allocator_traits@V?$allocator@UPayload@status_internal@absl@@@__1@std@@@__1@std@@SAXAEAV?$allocator@UPayload@status_internal@absl@@@12@PEAUPayload@status_internal@absl@@$$QEAU456@@Z
     ??$construct@USubRange@absl@@U12@@?$allocator@USubRange@absl@@@__1@std@@QEAAXPEAUSubRange@absl@@$$QEAU34@@Z
-    ??$construct@USubRange@absl@@U12@@?$allocator_traits@V?$allocator@USubRange@absl@@@__1@std@@@absl@@SAXAEAV?$allocator@USubRange@absl@@@__1@std@@PEAUSubRange@1@$$QEAU51@@Z
+    ??$construct@USubRange@absl@@U12@X@?$allocator_traits@V?$allocator@USubRange@absl@@@__1@std@@@__1@std@@SAXAEAV?$allocator@USubRange@absl@@@12@PEAUSubRange@absl@@$$QEAU45@@Z
     ??$construct@UTransition@cctz@time_internal@absl@@$$V@?$allocator@UTransition@cctz@time_internal@absl@@@__1@std@@QEAAXPEAUTransition@cctz@time_internal@absl@@@Z
     ??$construct@UTransition@cctz@time_internal@absl@@$$VX@?$allocator_traits@V?$allocator@UTransition@cctz@time_internal@absl@@@__1@std@@@__1@std@@SAXAEAV?$allocator@UTransition@cctz@time_internal@absl@@@12@PEAUTransition@cctz@time_internal@absl@@@Z
     ??$construct@UTransition@cctz@time_internal@absl@@AEBU1234@@?$allocator@UTransition@cctz@time_internal@absl@@@__1@std@@QEAAXPEAUTransition@cctz@time_internal@absl@@AEBU3456@@Z
@@ -584,37 +609,22 @@
     ??$construct@UViableSubstitution@strings_internal@absl@@AEAVstring_view@3@AEBV43@AEA_K@?$allocator@UViableSubstitution@strings_internal@absl@@@__1@std@@QEAAXPEAUViableSubstitution@strings_internal@absl@@AEAVstring_view@5@AEBV65@AEA_K@Z
     ??$construct@UViableSubstitution@strings_internal@absl@@AEAVstring_view@3@AEBV43@AEA_KX@?$allocator_traits@V?$allocator@UViableSubstitution@strings_internal@absl@@@__1@std@@@__1@std@@SAXAEAV?$allocator@UViableSubstitution@strings_internal@absl@@@12@PEAUViableSubstitution@strings_internal@absl@@AEAVstring_view@6@AEBV76@AEA_K@Z
     ??$construct@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@?$optional_data_base@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@optional_internal@absl@@IEAAX$$QEAV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@Z
-    ??$construct_impl@V?$allocator@H@__1@std@@AEAPEAHAEBH@?$allocator_traits@V?$allocator@H@__1@std@@@absl@@CAXHAEAV?$allocator@H@__1@std@@AEAPEAHAEBH@Z
-    ??$construct_impl@V?$allocator@H@__1@std@@AEAPEAHH@?$allocator_traits@V?$allocator@H@__1@std@@@absl@@CAXHAEAV?$allocator@H@__1@std@@AEAPEAH$$QEAH@Z
-    ??$construct_impl@V?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@AEAPEAPEAUCordRep@cord_internal@absl@@AEBQEAU456@@?$allocator_traits@V?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@@absl@@CAXHAEAV?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@AEAPEAPEAUCordRep@cord_internal@1@AEBQEAU561@@Z
-    ??$construct_impl@V?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@AEAPEAPEAUCordRep@cord_internal@absl@@PEAU456@@?$allocator_traits@V?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@@absl@@CAXHAEAV?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@AEAPEAPEAUCordRep@cord_internal@1@$$QEAPEAU561@@Z
-    ??$construct_impl@V?$allocator@PEBUCordRep@cord_internal@absl@@@__1@std@@AEAPEAPEBUCordRep@cord_internal@absl@@AEBQEBU456@@?$allocator_traits@V?$allocator@PEBUCordRep@cord_internal@absl@@@__1@std@@@absl@@CAXHAEAV?$allocator@PEBUCordRep@cord_internal@absl@@@__1@std@@AEAPEAPEBUCordRep@cord_internal@1@AEBQEBU561@@Z
-    ??$construct_impl@V?$allocator@PEBUCordRep@cord_internal@absl@@@__1@std@@AEAPEAPEBUCordRep@cord_internal@absl@@PEBU456@@?$allocator_traits@V?$allocator@PEBUCordRep@cord_internal@absl@@@__1@std@@@absl@@CAXHAEAV?$allocator@PEBUCordRep@cord_internal@absl@@@__1@std@@AEAPEAPEBUCordRep@cord_internal@1@$$QEAPEBU561@@Z
-    ??$construct_impl@V?$allocator@UPayload@status_internal@absl@@@__1@std@@AEAPEAUPayload@status_internal@absl@@AEBU456@@?$allocator_traits@V?$allocator@UPayload@status_internal@absl@@@__1@std@@@absl@@CAXHAEAV?$allocator@UPayload@status_internal@absl@@@__1@std@@AEAPEAUPayload@status_internal@1@AEBU561@@Z
-    ??$construct_impl@V?$allocator@UPayload@status_internal@absl@@@__1@std@@AEAPEAUPayload@status_internal@absl@@U456@@?$allocator_traits@V?$allocator@UPayload@status_internal@absl@@@__1@std@@@absl@@CAXHAEAV?$allocator@UPayload@status_internal@absl@@@__1@std@@AEAPEAUPayload@status_internal@1@$$QEAU561@@Z
-    ??$construct_impl@V?$allocator@USubRange@absl@@@__1@std@@AEAPEAUSubRange@absl@@U45@@?$allocator_traits@V?$allocator@USubRange@absl@@@__1@std@@@absl@@CAXHAEAV?$allocator@USubRange@absl@@@__1@std@@AEAPEAUSubRange@1@$$QEAU51@@Z
     ??$copy@PEBVFormatArgImpl@str_format_internal@absl@@PEAV123@@__1@std@@YAPEAVFormatArgImpl@str_format_internal@absl@@PEBV234@0PEAV234@@Z
     ??$countl_zero@_K@absl@@YAH_K@Z
-    ??$destroy@H@?$allocator_traits@V?$allocator@H@__1@std@@@absl@@SAXAEAV?$allocator@H@__1@std@@PEAH@Z
+    ??$countr_zero@_K@absl@@YAH_K@Z
     ??$destroy@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@X@?$allocator_traits@V?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@@__1@std@@SAXAEAV?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@12@PEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@@Z
-    ??$destroy@PEAUCordRep@cord_internal@absl@@@?$allocator_traits@V?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@@absl@@SAXAEAV?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@PEAPEAUCordRep@cord_internal@1@@Z
     ??$destroy@PEAUCordRep@cord_internal@absl@@X@?$allocator_traits@V?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@@__1@std@@SAXAEAV?$allocator@PEAUCordRep@cord_internal@absl@@@12@PEAPEAUCordRep@cord_internal@absl@@@Z
     ??$destroy@PEAVCordzHandle@cord_internal@absl@@X@?$allocator_traits@V?$allocator@PEAVCordzHandle@cord_internal@absl@@@__1@std@@@__1@std@@SAXAEAV?$allocator@PEAVCordzHandle@cord_internal@absl@@@12@PEAPEAVCordzHandle@cord_internal@absl@@@Z
-    ??$destroy@PEBUCordRep@cord_internal@absl@@@?$allocator_traits@V?$allocator@PEBUCordRep@cord_internal@absl@@@__1@std@@@absl@@SAXAEAV?$allocator@PEBUCordRep@cord_internal@absl@@@__1@std@@PEAPEBUCordRep@cord_internal@1@@Z
+    ??$destroy@PEBUCordRep@cord_internal@absl@@X@?$allocator_traits@V?$allocator@PEBUCordRep@cord_internal@absl@@@__1@std@@@__1@std@@SAXAEAV?$allocator@PEBUCordRep@cord_internal@absl@@@12@PEAPEBUCordRep@cord_internal@absl@@@Z
     ??$destroy@PEBVCordzHandle@cord_internal@absl@@X@?$allocator_traits@V?$allocator@PEBVCordzHandle@cord_internal@absl@@@__1@std@@@__1@std@@SAXAEAV?$allocator@PEBVCordzHandle@cord_internal@absl@@@12@PEAPEBVCordzHandle@cord_internal@absl@@@Z
     ??$destroy@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@XX@?$allocator_traits@V?$allocator@U?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@PEAX@__1@std@@@__1@std@@@__1@std@@SAXAEAV?$allocator@U?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@PEAX@__1@std@@@12@PEAU?$pair@$$CBV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@12@@Z
     ??$destroy@UConversionItem@ParsedFormatBase@str_format_internal@absl@@X@?$allocator_traits@V?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__1@std@@@__1@std@@SAXAEAV?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@12@PEAUConversionItem@ParsedFormatBase@str_format_internal@absl@@@Z
-    ??$destroy@UPayload@status_internal@absl@@@?$allocator_traits@V?$allocator@UPayload@status_internal@absl@@@__1@std@@@absl@@SAXAEAV?$allocator@UPayload@status_internal@absl@@@__1@std@@PEAUPayload@status_internal@1@@Z
-    ??$destroy@USubRange@absl@@@?$allocator_traits@V?$allocator@USubRange@absl@@@__1@std@@@absl@@SAXAEAV?$allocator@USubRange@absl@@@__1@std@@PEAUSubRange@1@@Z
+    ??$destroy@UPayload@status_internal@absl@@X@?$allocator_traits@V?$allocator@UPayload@status_internal@absl@@@__1@std@@@__1@std@@SAXAEAV?$allocator@UPayload@status_internal@absl@@@12@PEAUPayload@status_internal@absl@@@Z
+    ??$destroy@USubRange@absl@@X@?$allocator_traits@V?$allocator@USubRange@absl@@@__1@std@@@__1@std@@SAXAEAV?$allocator@USubRange@absl@@@12@PEAUSubRange@absl@@@Z
     ??$destroy@UTransition@cctz@time_internal@absl@@X@?$allocator_traits@V?$allocator@UTransition@cctz@time_internal@absl@@@__1@std@@@__1@std@@SAXAEAV?$allocator@UTransition@cctz@time_internal@absl@@@12@PEAUTransition@cctz@time_internal@absl@@@Z
     ??$destroy@UTransitionType@cctz@time_internal@absl@@X@?$allocator_traits@V?$allocator@UTransitionType@cctz@time_internal@absl@@@__1@std@@@__1@std@@SAXAEAV?$allocator@UTransitionType@cctz@time_internal@absl@@@12@PEAUTransitionType@cctz@time_internal@absl@@@Z
     ??$destroy@UViableSubstitution@strings_internal@absl@@X@?$allocator_traits@V?$allocator@UViableSubstitution@strings_internal@absl@@@__1@std@@@__1@std@@SAXAEAV?$allocator@UViableSubstitution@strings_internal@absl@@@12@PEAUViableSubstitution@strings_internal@absl@@@Z
     ??$destroy@VFormatArgImpl@str_format_internal@absl@@X@?$allocator_traits@V?$allocator@VFormatArgImpl@str_format_internal@absl@@@__1@std@@@__1@std@@SAXAEAV?$allocator@VFormatArgImpl@str_format_internal@absl@@@12@PEAVFormatArgImpl@str_format_internal@absl@@@Z
-    ??$destroy_impl@V?$allocator@H@__1@std@@H@?$allocator_traits@V?$allocator@H@__1@std@@@absl@@CAXHAEAV?$allocator@H@__1@std@@PEAH@Z
-    ??$destroy_impl@V?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@PEAUCordRep@cord_internal@absl@@@?$allocator_traits@V?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@@absl@@CAXHAEAV?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@PEAPEAUCordRep@cord_internal@1@@Z
-    ??$destroy_impl@V?$allocator@PEBUCordRep@cord_internal@absl@@@__1@std@@PEBUCordRep@cord_internal@absl@@@?$allocator_traits@V?$allocator@PEBUCordRep@cord_internal@absl@@@__1@std@@@absl@@CAXHAEAV?$allocator@PEBUCordRep@cord_internal@absl@@@__1@std@@PEAPEBUCordRep@cord_internal@1@@Z
-    ??$destroy_impl@V?$allocator@UPayload@status_internal@absl@@@__1@std@@UPayload@status_internal@absl@@@?$allocator_traits@V?$allocator@UPayload@status_internal@absl@@@__1@std@@@absl@@CAXHAEAV?$allocator@UPayload@status_internal@absl@@@__1@std@@PEAUPayload@status_internal@1@@Z
-    ??$destroy_impl@V?$allocator@USubRange@absl@@@__1@std@@USubRange@absl@@@?$allocator_traits@V?$allocator@USubRange@absl@@@__1@std@@@absl@@CAXHAEAV?$allocator@USubRange@absl@@@__1@std@@PEAUSubRange@1@@Z
     ??$distance@PEBUPayload@status_internal@absl@@@__1@std@@YA_JPEBUPayload@status_internal@absl@@0@Z
     ??$distance@PEBUTransition@cctz@time_internal@absl@@@__1@std@@YA_JPEBUTransition@cctz@time_internal@absl@@0@Z
     ??$distance@PEBVFormatArgImpl@str_format_internal@absl@@@__1@std@@YA_JPEBVFormatArgImpl@str_format_internal@absl@@0@Z
@@ -634,14 +644,11 @@
     ??$emplace_back@UPayload@status_internal@absl@@@?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__1@std@@@absl@@QEAAAEAUPayload@status_internal@1@$$QEAU231@@Z
     ??$emplace_back@USubRange@absl@@@?$InlinedVector@USubRange@absl@@$0CP@V?$allocator@USubRange@absl@@@__1@std@@@absl@@QEAAAEAUSubRange@1@$$QEAU21@@Z
     ??$find@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@?$__hash_table@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@V?$__unordered_map_hasher@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@23@$00@23@V?$__unordered_map_equal@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@23@$00@23@V?$allocator@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@@23@@__1@std@@QEAA?AV?$__hash_iterator@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@PEAX@__1@std@@@12@AEBV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@12@@Z
+    ??$find_first_non_full@X@container_internal@absl@@YA?AUFindInfo@01@PEBW4ctrl_t@01@_K1@Z
     ??$forward@$$T@absl@@YA$$QEA$$TAEA$$T@Z
     ??$forward@AEAI@absl@@YAAEAIAEAI@Z
-    ??$forward@AEAPEAPEAUCordRep@cord_internal@absl@@@__1@std@@YAAEAPEAPEAUCordRep@cord_internal@absl@@AEAPEAPEAU234@@Z
-    ??$forward@AEAPEAPEBUCordRep@cord_internal@absl@@@__1@std@@YAAEAPEAPEBUCordRep@cord_internal@absl@@AEAPEAPEBU234@@Z
     ??$forward@AEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@YAAEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@AEAPEAPEBV23456@@Z
     ??$forward@AEAPEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@PEAX@__1@std@@@__1@std@@YAAEAPEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@PEAX@01@AEAPEAU201@@Z
-    ??$forward@AEAPEAUPayload@status_internal@absl@@@__1@std@@YAAEAPEAUPayload@status_internal@absl@@AEAPEAU234@@Z
-    ??$forward@AEAPEAUSubRange@absl@@@__1@std@@YAAEAPEAUSubRange@absl@@AEAPEAU23@@Z
     ??$forward@AEAPEAUThreadIdentity@base_internal@absl@@@__1@std@@YAAEAPEAUThreadIdentity@base_internal@absl@@AEAPEAU234@@Z
     ??$forward@AEAPEAV?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__1@std@@@absl@@@__1@std@@YAAEAPEAV?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__1@std@@@absl@@AEAPEAV23@@Z
     ??$forward@AEAPEAVTimeZoneIf@cctz@time_internal@absl@@@__1@std@@YAAEAPEAVTimeZoneIf@cctz@time_internal@absl@@AEAPEAV2345@@Z
@@ -791,6 +798,7 @@
     ??$move_backward@PEAUTransition@cctz@time_internal@absl@@PEAU1234@@__1@std@@YAPEAUTransition@cctz@time_internal@absl@@PEAU2345@00@Z
     ??$move_backward@PEAUTransitionType@cctz@time_internal@absl@@PEAU1234@@__1@std@@YAPEAUTransitionType@cctz@time_internal@absl@@PEAU2345@00@Z
     ??$reset@PEAPEAU?$__hash_node_base@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@PEAX@__1@std@@@__1@std@@@?$unique_ptr@$$BY0A@PEAU?$__hash_node_base@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@PEAX@__1@std@@@__1@std@@V?$__bucket_list_deallocator@V?$allocator@PEAU?$__hash_node_base@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@PEAX@__1@std@@@__1@std@@@__1@std@@@23@@__1@std@@QEAAXPEAPEAU?$__hash_node_base@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@PEAX@__1@std@@@12@@Z
+    ??$rotl@_K@absl@@YA_K_KH@Z
     ??$swap@PEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@YAXAEAPEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@0@Z
     ??$swap@PEAPEAUCordRep@cord_internal@absl@@@__1@std@@YAXAEAPEAPEAUCordRep@cord_internal@absl@@0@Z
     ??$swap@PEAPEAVCordzHandle@cord_internal@absl@@@__1@std@@YAXAEAPEAPEAVCordzHandle@cord_internal@absl@@0@Z
@@ -803,18 +811,19 @@
     ??$swap@UViableSubstitution@strings_internal@absl@@@__1@std@@YAXAEAUViableSubstitution@strings_internal@absl@@0@Z
     ??$upper_bound@PEBUTransition@cctz@time_internal@absl@@U1234@UByCivilTime@1234@@__1@std@@YAPEBUTransition@cctz@time_internal@absl@@PEBU2345@0AEBU2345@UByCivilTime@2345@@Z
     ??$upper_bound@PEBUTransition@cctz@time_internal@absl@@U1234@UByUnixTime@1234@@__1@std@@YAPEBUTransition@cctz@time_internal@absl@@PEBU2345@0AEBU2345@UByUnixTime@2345@@Z
-    ??0?$AllocationTransaction@V?$allocator@H@__1@std@@@inlined_vector_internal@absl@@QEAA@PEAV?$allocator@H@__1@std@@@Z
-    ??0?$AllocationTransaction@V?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@@inlined_vector_internal@absl@@QEAA@PEAV?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@@Z
-    ??0?$AllocationTransaction@V?$allocator@PEBUCordRep@cord_internal@absl@@@__1@std@@@inlined_vector_internal@absl@@QEAA@PEAV?$allocator@PEBUCordRep@cord_internal@absl@@@__1@std@@@Z
-    ??0?$AllocationTransaction@V?$allocator@UPayload@status_internal@absl@@@__1@std@@@inlined_vector_internal@absl@@QEAA@PEAV?$allocator@UPayload@status_internal@absl@@@__1@std@@@Z
-    ??0?$AllocationTransaction@V?$allocator@USubRange@absl@@@__1@std@@@inlined_vector_internal@absl@@QEAA@PEAV?$allocator@USubRange@absl@@@__1@std@@@Z
+    ??0?$AllocationTransaction@V?$allocator@H@__1@std@@@inlined_vector_internal@absl@@QEAA@AEAV?$allocator@H@__1@std@@@Z
+    ??0?$AllocationTransaction@V?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@@inlined_vector_internal@absl@@QEAA@AEAV?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@@Z
+    ??0?$AllocationTransaction@V?$allocator@PEBUCordRep@cord_internal@absl@@@__1@std@@@inlined_vector_internal@absl@@QEAA@AEAV?$allocator@PEBUCordRep@cord_internal@absl@@@__1@std@@@Z
+    ??0?$AllocationTransaction@V?$allocator@UPayload@status_internal@absl@@@__1@std@@@inlined_vector_internal@absl@@QEAA@AEAV?$allocator@UPayload@status_internal@absl@@@__1@std@@@Z
+    ??0?$AllocationTransaction@V?$allocator@USubRange@absl@@@__1@std@@@inlined_vector_internal@absl@@QEAA@AEAV?$allocator@USubRange@absl@@@__1@std@@@Z
     ??0?$BigUnsigned@$03@strings_internal@absl@@QEAA@Vstring_view@2@@Z
     ??0?$BigUnsigned@$03@strings_internal@absl@@QEAA@XZ
     ??0?$BigUnsigned@$03@strings_internal@absl@@QEAA@_K@Z
     ??0?$BigUnsigned@$0FE@@strings_internal@absl@@QEAA@Vstring_view@2@@Z
     ??0?$BigUnsigned@$0FE@@strings_internal@absl@@QEAA@XZ
     ??0?$BigUnsigned@$0FE@@strings_internal@absl@@QEAA@_K@Z
-    ??0?$CopyValueAdapter@V?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@@inlined_vector_internal@absl@@QEAA@AEBQEAUCordRep@cord_internal@2@@Z
+    ??0?$BitMask@_K$07$02@container_internal@absl@@QEAA@_K@Z
+    ??0?$CopyValueAdapter@V?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@@inlined_vector_internal@absl@@QEAA@PEBQEAUCordRep@cord_internal@2@@Z
     ??0?$FixedArray@PEAUCordRep@cord_internal@absl@@$0?0V?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@@absl@@QEAA@_KAEBV?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@@Z
     ??0?$InlinedVector@H$0CP@V?$allocator@H@__1@std@@@absl@@QEAA@XZ
     ??0?$InlinedVector@PEAUCordRep@cord_internal@absl@@$01V?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@@absl@@QEAA@XZ
@@ -839,7 +848,9 @@
     ??0?$Span@$$CBVFormatArgImpl@str_format_internal@absl@@@absl@@QEAA@PEBVFormatArgImpl@str_format_internal@1@_K@Z
     ??0?$Span@$$CBVFormatArgImpl@str_format_internal@absl@@@absl@@QEAA@XZ
     ??0?$Span@D@absl@@QEAA@PEAD_K@Z
+    ??0?$Span@D@absl@@QEAA@XZ
     ??0?$Span@I@absl@@QEAA@PEAI_K@Z
+    ??0?$Span@QEAUCordRep@cord_internal@absl@@@absl@@QEAA@PEBQEAUCordRep@cord_internal@1@_K@Z
     ??0?$Span@QEAX@absl@@QEAA@PEBQEAX_K@Z
     ??0?$Span@VFormatArgImpl@str_format_internal@absl@@@absl@@QEAA@PEAVFormatArgImpl@str_format_internal@1@_K@Z
     ??0?$Storage@H$0CP@V?$allocator@H@__1@std@@@inlined_vector_internal@absl@@QEAA@XZ
@@ -980,6 +991,7 @@
     ??0?$optional_data_base@VCord@absl@@@optional_internal@absl@@QEAA@XZ
     ??0?$optional_data_dtor_base@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@$0A@@optional_internal@absl@@IEAA@XZ
     ??0?$optional_data_dtor_base@VCord@absl@@$0A@@optional_internal@absl@@IEAA@XZ
+    ??0?$probe_seq@$07@container_internal@absl@@QEAA@_K0@Z
     ??0?$unique_ptr@V?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__1@std@@@absl@@U?$default_delete@V?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__1@std@@@absl@@@__1@std@@@__1@std@@QEAA@$$QEAV012@@Z
     ??0?$unordered_map@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@U?$hash@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@@23@@__1@std@@QEAA@XZ
     ??0?$vector@PEAUCordRep@cord_internal@absl@@V?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@@__1@std@@QEAA@V?$initializer_list@PEAUCordRep@cord_internal@absl@@@2@@Z
@@ -990,6 +1002,7 @@
     ??0?$vector@UTransitionType@cctz@time_internal@absl@@V?$allocator@UTransitionType@cctz@time_internal@absl@@@__1@std@@@__1@std@@QEAA@XZ
     ??0?$vector@UViableSubstitution@strings_internal@absl@@V?$allocator@UViableSubstitution@strings_internal@absl@@@__1@std@@@__1@std@@QEAA@XZ
     ??0?$vector@VFormatArgImpl@str_format_internal@absl@@V?$allocator@VFormatArgImpl@str_format_internal@absl@@@__1@std@@@__1@std@@QEAA@XZ
+    ??0AlphaNum@absl@@QEAA@H@Z
     ??0AlphaNum@absl@@QEAA@PEBD@Z
     ??0AlphaNum@absl@@QEAA@UDec@1@@Z
     ??0AlphaNum@absl@@QEAA@UHex@1@@Z
@@ -1000,6 +1013,8 @@
     ??0Arg@substitute_internal@absl@@QEAA@PEBX@Z
     ??0Arg@substitute_internal@absl@@QEAA@UDec@2@@Z
     ??0Arg@substitute_internal@absl@@QEAA@UHex@2@@Z
+    ??0BadStatusOrAccess@absl@@QEAA@$$QEAV01@@Z
+    ??0BadStatusOrAccess@absl@@QEAA@AEBV01@@Z
     ??0BadStatusOrAccess@absl@@QEAA@VStatus@1@@Z
     ??0BlockingCounter@absl@@QEAA@H@Z
     ??0BoundConversion@str_format_internal@absl@@QEAA@XZ
@@ -1022,11 +1037,13 @@
     ??0Cord@absl@@QEAA@XZ
     ??0CordForest@absl@@QEAA@_K@Z
     ??0CordRep@cord_internal@absl@@QEAA@XZ
+    ??0CordRepBtree@cord_internal@absl@@AEAA@XZ
+    ??0CordRepBtreeNavigator@cord_internal@absl@@QEAA@XZ
+    ??0CordRepBtreeReader@cord_internal@absl@@QEAA@XZ
     ??0CordRepConcat@cord_internal@absl@@QEAA@XZ
     ??0CordRepExternal@cord_internal@absl@@QEAA@XZ
     ??0CordRepFlat@cord_internal@absl@@QEAA@XZ
     ??0CordRepRing@cord_internal@absl@@AEAA@I@Z
-    ??0CordRepRingReader@cord_internal@absl@@QEAA@XZ
     ??0CordRepSubstring@cord_internal@absl@@QEAA@XZ
     ??0CordzHandle@cord_internal@absl@@IEAA@_N@Z
     ??0CordzHandle@cord_internal@absl@@QEAA@XZ
@@ -1043,9 +1060,10 @@
     ??0FormatConversionSpecImpl@str_format_internal@absl@@QEAA@XZ
     ??0FormatSinkImpl@str_format_internal@absl@@QEAA@VFormatRawSinkImpl@12@@Z
     ??0GraphCycles@synchronization_internal@absl@@QEAA@XZ
-    ??0GroupPortableImpl@container_internal@absl@@QEAA@PEBC@Z
+    ??0GroupPortableImpl@container_internal@absl@@QEAA@PEBW4ctrl_t@12@@Z
     ??0HashtablezInfo@container_internal@absl@@QEAA@XZ
     ??0HashtablezSampler@container_internal@absl@@QEAA@XZ
+    ??0Hex@absl@@AEAA@W4PadSpec@1@_K@Z
     ??0Impl@time_zone@cctz@time_internal@absl@@AEAA@AEBV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@Z
     ??0InlineData@cord_internal@absl@@QEAA@W4DefaultInitType@012@@Z
     ??0InlineData@cord_internal@absl@@QEAA@XZ
@@ -1066,7 +1084,7 @@
     ??0Payload@status_internal@absl@@QEAA@$$QEAU012@@Z
     ??0Payload@status_internal@absl@@QEAA@AEBU012@@Z
     ??0PosixTimeZone@cctz@time_internal@absl@@QEAA@XZ
-    ??0Refcount@cord_internal@absl@@QEAA@XZ
+    ??0RefcountAndFlags@cord_internal@absl@@QEAA@XZ
     ??0Rep@GraphCycles@synchronization_internal@absl@@QEAA@XZ
     ??0SchedulingHelper@base_internal@absl@@QEAA@W4SchedulingMode@12@@Z
     ??0ScopedDisable@SchedulingGuard@base_internal@absl@@QEAA@XZ
@@ -1074,6 +1092,7 @@
     ??0SpinLock@base_internal@absl@@QEAA@W4SchedulingMode@12@@Z
     ??0SpinLockHolder@base_internal@absl@@QEAA@PEAVSpinLock@12@@Z
     ??0Status@absl@@QEAA@$$QEAV01@@Z
+    ??0Status@absl@@QEAA@AEBV01@@Z
     ??0Status@absl@@QEAA@W4StatusCode@1@Vstring_view@1@@Z
     ??0StatusRep@status_internal@absl@@QEAA@W4StatusCode@2@Vstring_view@2@V?$unique_ptr@V?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__1@std@@@absl@@U?$default_delete@V?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__1@std@@@absl@@@__1@std@@@__1@std@@@Z
     ??0Storage@?$FixedArray@PEAUCordRep@cord_internal@absl@@$0?0V?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@@absl@@QEAA@_KAEBV?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@@Z
@@ -1116,6 +1135,8 @@
     ??0int128@absl@@QEAA@M@Z
     ??0int128@absl@@QEAA@N@Z
     ??0int128@absl@@QEAA@O@Z
+    ??0once_flag@absl@@QEAA@XZ
+    ??0string_view@absl@@AEAA@PEBD_KUSkipCheckLengthTag@01@@Z
     ??0string_view@absl@@QEAA@PEBD@Z
     ??0string_view@absl@@QEAA@PEBD_K@Z
     ??0string_view@absl@@QEAA@XZ
@@ -1239,12 +1260,15 @@
     ??4?$optional@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@absl@@QEAAAEAV01@$$QEAV01@@Z
     ??4?$optional_data@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@$0A@@optional_internal@absl@@IEAAAEAV012@$$QEAV012@@Z
     ??4?$unique_ptr@V?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__1@std@@@absl@@U?$default_delete@V?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__1@std@@@absl@@@__1@std@@@__1@std@@QEAAAEAV012@$$QEAV012@@Z
+    ??4BadStatusOrAccess@absl@@QEAAAEAV01@$$QEAV01@@Z
+    ??4BadStatusOrAccess@absl@@QEAAAEAV01@AEBV01@@Z
     ??4Cord@absl@@QEAAAEAV01@$$QEAV01@@Z
     ??4Cord@absl@@QEAAAEAV01@Vstring_view@1@@Z
     ??4CordzUpdateTracker@cord_internal@absl@@QEAAAEAV012@AEBV012@@Z
     ??4InlineRep@Cord@absl@@QEAAAEAV012@$$QEAV012@@Z
     ??4Payload@status_internal@absl@@QEAAAEAU012@$$QEAU012@@Z
     ??4Status@absl@@QEAAAEAV01@$$QEAV01@@Z
+    ??4Status@absl@@QEAAAEAV01@AEBV01@@Z
     ??4int128@absl@@QEAAAEAV01@H@Z
     ??4uint128@absl@@QEAAAEAV01@H@Z
     ??4uint128@absl@@QEAAAEAV01@_J@Z
@@ -1311,12 +1335,13 @@
     ??A?$vector@UViableSubstitution@strings_internal@absl@@V?$allocator@UViableSubstitution@strings_internal@absl@@@__1@std@@@__1@std@@QEAAAEAUViableSubstitution@strings_internal@absl@@_K@Z
     ??ACord@absl@@QEBAD_K@Z
     ??Astring_view@absl@@QEBAAEBD_K@Z
+    ??B?$BitMask@_K$07$02@container_internal@absl@@QEBA_NXZ
     ??B?$__atomic_base@PEAVCordzHandle@cord_internal@absl@@$0A@@__1@std@@QEBAPEAVCordzHandle@cord_internal@absl@@XZ
     ??B?$unique_ptr@V?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__1@std@@@absl@@U?$default_delete@V?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__1@std@@@absl@@@__1@std@@@__1@std@@QEBA_NXZ
     ??B?$unique_ptr@VTimeZoneIf@cctz@time_internal@absl@@U?$default_delete@VTimeZoneIf@cctz@time_internal@absl@@@__1@std@@@__1@std@@QEBA_NXZ
     ??B?$unique_ptr@VZoneInfoSource@cctz@time_internal@absl@@U?$default_delete@VZoneInfoSource@cctz@time_internal@absl@@@__1@std@@@__1@std@@QEBA_NXZ
     ??BCord@absl@@QEBA?AV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@XZ
-    ??BCordRepRingReader@cord_internal@absl@@QEBA_NXZ
+    ??BCordRepBtreeReader@cord_internal@absl@@QEBA_NXZ
     ??BTimeZone@absl@@QEBA?AVtime_zone@cctz@time_internal@1@XZ
     ??Bint128@absl@@QEBAEXZ
     ??Bint128@absl@@QEBANXZ
@@ -1497,15 +1522,16 @@
     ?AbslParseFlag@absl@@YA_NVstring_view@1@PEAVTime@1@PEAV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@Z
     ?AbslUnparseFlag@absl@@YA?AV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@VDuration@1@@Z
     ?AbslUnparseFlag@absl@@YA?AV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@VTime@1@@Z
-    ?AcquireAllocatedData@?$Storage@H$0CP@V?$allocator@H@__1@std@@@inlined_vector_internal@absl@@QEAAXPEAV?$AllocationTransaction@V?$allocator@H@__1@std@@@23@@Z
-    ?AcquireAllocatedData@?$Storage@PEAUCordRep@cord_internal@absl@@$01V?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@@inlined_vector_internal@absl@@QEAAXPEAV?$AllocationTransaction@V?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@@23@@Z
-    ?AcquireAllocatedData@?$Storage@PEAUCordRep@cord_internal@absl@@$0CP@V?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@@inlined_vector_internal@absl@@QEAAXPEAV?$AllocationTransaction@V?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@@23@@Z
-    ?AcquireAllocatedData@?$Storage@PEBUCordRep@cord_internal@absl@@$0CP@V?$allocator@PEBUCordRep@cord_internal@absl@@@__1@std@@@inlined_vector_internal@absl@@QEAAXPEAV?$AllocationTransaction@V?$allocator@PEBUCordRep@cord_internal@absl@@@__1@std@@@23@@Z
-    ?AcquireAllocatedData@?$Storage@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__1@std@@@inlined_vector_internal@absl@@QEAAXPEAV?$AllocationTransaction@V?$allocator@UPayload@status_internal@absl@@@__1@std@@@23@@Z
-    ?AcquireAllocatedData@?$Storage@USubRange@absl@@$0CP@V?$allocator@USubRange@absl@@@__1@std@@@inlined_vector_internal@absl@@QEAAXPEAV?$AllocationTransaction@V?$allocator@USubRange@absl@@@__1@std@@@23@@Z
+    ?AcquireAllocatedData@?$Storage@H$0CP@V?$allocator@H@__1@std@@@inlined_vector_internal@absl@@QEAAXAEAV?$AllocationTransaction@V?$allocator@H@__1@std@@@23@@Z
+    ?AcquireAllocatedData@?$Storage@PEAUCordRep@cord_internal@absl@@$01V?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@@inlined_vector_internal@absl@@QEAAXAEAV?$AllocationTransaction@V?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@@23@@Z
+    ?AcquireAllocatedData@?$Storage@PEAUCordRep@cord_internal@absl@@$0CP@V?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@@inlined_vector_internal@absl@@QEAAXAEAV?$AllocationTransaction@V?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@@23@@Z
+    ?AcquireAllocatedData@?$Storage@PEBUCordRep@cord_internal@absl@@$0CP@V?$allocator@PEBUCordRep@cord_internal@absl@@@__1@std@@@inlined_vector_internal@absl@@QEAAXAEAV?$AllocationTransaction@V?$allocator@PEBUCordRep@cord_internal@absl@@@__1@std@@@23@@Z
+    ?AcquireAllocatedData@?$Storage@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__1@std@@@inlined_vector_internal@absl@@QEAAXAEAV?$AllocationTransaction@V?$allocator@UPayload@status_internal@absl@@@__1@std@@@23@@Z
+    ?AcquireAllocatedData@?$Storage@USubRange@absl@@$0CP@V?$allocator@USubRange@absl@@@__1@std@@@inlined_vector_internal@absl@@QEAAXAEAV?$AllocationTransaction@V?$allocator@USubRange@absl@@@__1@std@@@23@@Z
     ?Add@Filler@CordRepRing@cord_internal@absl@@QEAAXPEAUCordRep@34@_K1@Z
     ?AddDataOffset@CordRepRing@cord_internal@absl@@AEAAXI_K@Z
     ?AddNode@CordForest@absl@@AEAAXPEAUCordRep@cord_internal@2@@Z
+    ?AddResult@int128_internal@absl@@YA?AVuint128@2@V32@0@Z
     ?AddSize@?$Storage@H$0CP@V?$allocator@H@__1@std@@@inlined_vector_internal@absl@@QEAAX_K@Z
     ?AddSize@?$Storage@PEAUCordRep@cord_internal@absl@@$01V?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@@inlined_vector_internal@absl@@QEAAX_K@Z
     ?AddSize@?$Storage@PEAUCordRep@cord_internal@absl@@$0CP@V?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@@inlined_vector_internal@absl@@QEAAX_K@Z
@@ -1518,12 +1544,14 @@
     ?AddWithCarry@?$BigUnsigned@$0FE@@strings_internal@absl@@AEAAXH_K@Z
     ?AddressIsReadable@debugging_internal@absl@@YA_NPEBX@Z
     ?AdvanceAndReadBytes@ChunkIterator@Cord@absl@@AEAA?AV23@_K@Z
+    ?AdvanceBtree@ChunkIterator@Cord@absl@@AEAAAEAV123@XZ
     ?AdvanceBytes@ChunkIterator@Cord@absl@@AEAAX_K@Z
-    ?AdvanceBytesRing@ChunkIterator@Cord@absl@@AEAAX_K@Z
+    ?AdvanceBytesBtree@ChunkIterator@Cord@absl@@AEAAX_K@Z
     ?AdvanceBytesSlowPath@ChunkIterator@Cord@absl@@AEAAX_K@Z
-    ?AdvanceRing@ChunkIterator@Cord@absl@@AEAAAEAV123@XZ
     ?AdvanceStack@ChunkIterator@Cord@absl@@AEAAAEAV123@XZ
     ?Align@adl_barrier@internal_layout@container_internal@absl@@YA_K_K0@Z
+    ?AlignBegin@CordRepBtree@cord_internal@absl@@AEAAXXZ
+    ?AlignEnd@CordRepBtree@cord_internal@absl@@AEAAXXZ
     ?Alloc@LowLevelAlloc@base_internal@absl@@SAPEAX_K@Z
     ?AllocSize@?$LayoutImpl@V?$tuple@_KPEAUCordRep@cord_internal@absl@@I@__1@std@@U?$integer_sequence@_K$0A@$00$01@absl@@U45@@internal_layout@container_internal@absl@@QEBA_KXZ
     ?AllocSize@CordRepRing@cord_internal@absl@@SA_K_K@Z
@@ -1542,6 +1570,8 @@
     ?Append@Cord@absl@@QEAAX$$QEAV12@@Z
     ?Append@Cord@absl@@QEAAXAEBV12@@Z
     ?Append@Cord@absl@@QEAAXVstring_view@2@@Z
+    ?Append@CordRepBtree@cord_internal@absl@@SAPEAV123@PEAV123@PEAUCordRep@23@@Z
+    ?Append@CordRepBtree@cord_internal@absl@@SAPEAV123@PEAV123@Vstring_view@3@_K@Z
     ?Append@CordRepRing@cord_internal@absl@@SAPEAV123@PEAV123@PEAUCordRep@23@@Z
     ?Append@CordRepRing@cord_internal@absl@@SAPEAV123@PEAV123@Vstring_view@3@_K@Z
     ?Append@FormatSinkImpl@str_format_internal@absl@@QEAAXVstring_view@3@@Z
@@ -1552,6 +1582,7 @@
     ?AppendNode@CordForest@absl@@AEAAPEAUCordRep@cord_internal@2@PEAU342@0@Z
     ?AppendPack@str_format_internal@absl@@YAAEAV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEAV345@VUntypedFormatSpecImpl@12@V?$Span@$$CBVFormatArgImpl@str_format_internal@absl@@@2@@Z
     ?AppendPieces@strings_internal@absl@@YAXPEAV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@V?$initializer_list@Vstring_view@absl@@@5@@Z
+    ?AppendSlow@CordRepBtree@cord_internal@absl@@CAPEAV123@PEAV123@PEAUCordRep@23@@Z
     ?AppendSlow@CordRepRing@cord_internal@absl@@CAPEAV123@PEAV123@PEAUCordRep@23@@Z
     ?AppendText@ParsedFormatConsumer@ParsedFormatBase@str_format_internal@absl@@QEAA_KVstring_view@4@@Z
     ?AppendTree@InlineRep@Cord@absl@@QEAAXPEAUCordRep@cord_internal@3@W4MethodIdentifier@CordzUpdateTracker@53@@Z
@@ -1565,6 +1596,8 @@
     ?AssertHeld@Mutex@absl@@QEBAXXZ
     ?AssertNotHeld@Mutex@absl@@QEBAXXZ
     ?AssertReaderHeld@Mutex@absl@@QEBAXXZ
+    ?AssertValid@CordRepBtree@cord_internal@absl@@SAPEAV123@PEAV123@_N@Z
+    ?AssertValid@CordRepBtree@cord_internal@absl@@SAPEBV123@PEBV123@_N@Z
     ?AssignLargeString@Cord@absl@@AEAAAEAV12@$$QEAV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@Z
     ?AssignNext@?$IteratorValueAdapter@V?$allocator@UPayload@status_internal@absl@@@__1@std@@V?$move_iterator@PEAUPayload@status_internal@absl@@@23@@inlined_vector_internal@absl@@QEAAXPEAUPayload@status_internal@3@@Z
     ?AssignSlow@InlineRep@Cord@absl@@AEAAXAEBV123@@Z
@@ -1622,13 +1655,13 @@
     ?ComputeCapacity@?$Storage@PEAUCordRep@cord_internal@absl@@$0CP@V?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@@inlined_vector_internal@absl@@SA_K_K0@Z
     ?ComputeCapacity@?$Storage@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__1@std@@@inlined_vector_internal@absl@@SA_K_K0@Z
     ?ConcatNodes@CordForest@absl@@QEAAPEAUCordRep@cord_internal@2@XZ
-    ?ConstructNext@?$CopyValueAdapter@V?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@@inlined_vector_internal@absl@@QEAAXPEAV?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@PEAPEAUCordRep@cord_internal@3@@Z
-    ?ConstructNext@?$IteratorValueAdapter@V?$allocator@H@__1@std@@V?$move_iterator@PEAH@23@@inlined_vector_internal@absl@@QEAAXPEAV?$allocator@H@__1@std@@PEAH@Z
-    ?ConstructNext@?$IteratorValueAdapter@V?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@V?$move_iterator@PEAPEAUCordRep@cord_internal@absl@@@23@@inlined_vector_internal@absl@@QEAAXPEAV?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@PEAPEAUCordRep@cord_internal@3@@Z
-    ?ConstructNext@?$IteratorValueAdapter@V?$allocator@PEBUCordRep@cord_internal@absl@@@__1@std@@V?$move_iterator@PEAPEBUCordRep@cord_internal@absl@@@23@@inlined_vector_internal@absl@@QEAAXPEAV?$allocator@PEBUCordRep@cord_internal@absl@@@__1@std@@PEAPEBUCordRep@cord_internal@3@@Z
-    ?ConstructNext@?$IteratorValueAdapter@V?$allocator@UPayload@status_internal@absl@@@__1@std@@PEBUPayload@status_internal@absl@@@inlined_vector_internal@absl@@QEAAXPEAV?$allocator@UPayload@status_internal@absl@@@__1@std@@PEAUPayload@status_internal@3@@Z
-    ?ConstructNext@?$IteratorValueAdapter@V?$allocator@UPayload@status_internal@absl@@@__1@std@@V?$move_iterator@PEAUPayload@status_internal@absl@@@23@@inlined_vector_internal@absl@@QEAAXPEAV?$allocator@UPayload@status_internal@absl@@@__1@std@@PEAUPayload@status_internal@3@@Z
-    ?ConstructNext@?$IteratorValueAdapter@V?$allocator@USubRange@absl@@@__1@std@@V?$move_iterator@PEAUSubRange@absl@@@23@@inlined_vector_internal@absl@@QEAAXPEAV?$allocator@USubRange@absl@@@__1@std@@PEAUSubRange@3@@Z
+    ?ConstructNext@?$CopyValueAdapter@V?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@@inlined_vector_internal@absl@@QEAAXAEAV?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@PEAPEAUCordRep@cord_internal@3@@Z
+    ?ConstructNext@?$IteratorValueAdapter@V?$allocator@H@__1@std@@V?$move_iterator@PEAH@23@@inlined_vector_internal@absl@@QEAAXAEAV?$allocator@H@__1@std@@PEAH@Z
+    ?ConstructNext@?$IteratorValueAdapter@V?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@V?$move_iterator@PEAPEAUCordRep@cord_internal@absl@@@23@@inlined_vector_internal@absl@@QEAAXAEAV?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@PEAPEAUCordRep@cord_internal@3@@Z
+    ?ConstructNext@?$IteratorValueAdapter@V?$allocator@PEBUCordRep@cord_internal@absl@@@__1@std@@V?$move_iterator@PEAPEBUCordRep@cord_internal@absl@@@23@@inlined_vector_internal@absl@@QEAAXAEAV?$allocator@PEBUCordRep@cord_internal@absl@@@__1@std@@PEAPEBUCordRep@cord_internal@3@@Z
+    ?ConstructNext@?$IteratorValueAdapter@V?$allocator@UPayload@status_internal@absl@@@__1@std@@PEBUPayload@status_internal@absl@@@inlined_vector_internal@absl@@QEAAXAEAV?$allocator@UPayload@status_internal@absl@@@__1@std@@PEAUPayload@status_internal@3@@Z
+    ?ConstructNext@?$IteratorValueAdapter@V?$allocator@UPayload@status_internal@absl@@@__1@std@@V?$move_iterator@PEAUPayload@status_internal@absl@@@23@@inlined_vector_internal@absl@@QEAAXAEAV?$allocator@UPayload@status_internal@absl@@@__1@std@@PEAUPayload@status_internal@3@@Z
+    ?ConstructNext@?$IteratorValueAdapter@V?$allocator@USubRange@absl@@@__1@std@@V?$move_iterator@PEAUSubRange@absl@@@23@@inlined_vector_internal@absl@@QEAAXAEAV?$allocator@USubRange@absl@@@__1@std@@PEAUSubRange@3@@Z
     ?Consume@cord_internal@absl@@YAXPEAUCordRep@12@V?$FunctionRef@$$A6AXPEAUCordRep@cord_internal@absl@@_K1@Z@2@@Z
     ?ConsumePrefix@absl@@YA_NPEAVstring_view@1@V21@@Z
     ?ConsumeUnboundConversion@str_format_internal@absl@@YAPEBDPEBD0PEAUUnboundConversion@12@PEAH@Z
@@ -1636,22 +1669,32 @@
     ?Contains@str_format_internal@absl@@YA_NW4FormatConversionCharSet@2@W4FormatConversionChar@2@@Z
     ?ControlWord@base_internal@absl@@YAPEAU?$atomic@I@__1@std@@PEAVonce_flag@2@@Z
     ?ConvertDateTime@absl@@YA?AUTimeConversion@1@_JHHHHHVTimeZone@1@@Z
-    ?ConvertDeletedToEmptyAndFullToDeleted@container_internal@absl@@YAXPEAC_K@Z
+    ?ConvertDeletedToEmptyAndFullToDeleted@container_internal@absl@@YAXPEAW4ctrl_t@12@_K@Z
     ?ConvertFloatImpl@str_format_internal@absl@@YA_NMAEBVFormatConversionSpecImpl@12@PEAVFormatSinkImpl@12@@Z
     ?ConvertFloatImpl@str_format_internal@absl@@YA_NNAEBVFormatConversionSpecImpl@12@PEAVFormatSinkImpl@12@@Z
     ?ConvertFloatImpl@str_format_internal@absl@@YA_NOAEBVFormatConversionSpecImpl@12@PEAVFormatSinkImpl@12@@Z
     ?ConvertOne@ParsedFormatConsumer@ParsedFormatBase@str_format_internal@absl@@QEAA_NAEBUUnboundConversion@34@Vstring_view@4@@Z
-    ?ConvertSpecialToEmptyAndFullToDeleted@GroupPortableImpl@container_internal@absl@@QEBAXPEAC@Z
+    ?ConvertSpecialToEmptyAndFullToDeleted@GroupPortableImpl@container_internal@absl@@QEBAXPEAW4ctrl_t@23@@Z
+    ?Copy@CordRepBtree@cord_internal@absl@@AEBAPEAV123@XZ
     ?Copy@CordRepRing@cord_internal@absl@@CAPEAV123@PEAV123@II_K@Z
+    ?CopyBeginTo@CordRepBtree@cord_internal@absl@@AEBAPEAV123@_K0@Z
     ?CopyCordToString@absl@@YAXAEBVCord@1@PEAV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@Z
+    ?CopyPrefix@CordRepBtree@cord_internal@absl@@AEAA?AUCopyResult@123@_K@Z
+    ?CopyRaw@CordRepBtree@cord_internal@absl@@AEBAPEAV123@XZ
+    ?CopySuffix@CordRepBtree@cord_internal@absl@@AEAA?AUCopyResult@123@_K@Z
     ?CopyTo@InlineRep@Cord@absl@@QEBAXPEAV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@Z
     ?CopyToArraySlowPath@Cord@absl@@AEBAXPEAD@Z
+    ?CopyToEndFrom@CordRepBtree@cord_internal@absl@@AEBAPEAV123@_K0@Z
     ?Crash@Helper@internal_statusor@absl@@SAXAEBVStatus@3@@Z
+    ?Create@CordRepBtree@cord_internal@absl@@SAPEAV123@PEAUCordRep@23@@Z
     ?Create@CordRepRing@cord_internal@absl@@SAPEAV123@PEAUCordRep@23@_K@Z
     ?CreateFromLeaf@CordRepRing@cord_internal@absl@@CAPEAV123@PEAUCordRep@23@_K11@Z
+    ?CreateSlow@CordRepBtree@cord_internal@absl@@CAPEAV123@PEAUCordRep@23@@Z
     ?CreateSlow@CordRepRing@cord_internal@absl@@CAPEAV123@PEAUCordRep@23@_K@Z
     ?CreateThreadIdentity@synchronization_internal@absl@@YAPEAUThreadIdentity@base_internal@2@XZ
+    ?Current@CordRepBtreeNavigator@cord_internal@absl@@QEBAPEAUCordRep@23@XZ
     ?CurrentThreadIdentityIfPresent@base_internal@absl@@YAPEAUThreadIdentity@12@XZ
+    ?Data@CordRepBtree@cord_internal@absl@@QEBA?AVstring_view@3@_K@Z
     ?Data@CordRepFlat@cord_internal@absl@@QEAAPEADXZ
     ?Data@CordRepFlat@cord_internal@absl@@QEBAPEBDXZ
     ?DataLength@Header@TimeZoneInfo@cctz@time_internal@absl@@QEBA_K_K@Z
@@ -1664,12 +1707,13 @@
     ?DeallocateIfAllocated@?$Storage@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__1@std@@@inlined_vector_internal@absl@@QEAAXXZ
     ?DeallocateIfAllocated@?$Storage@USubRange@absl@@$0CP@V?$allocator@USubRange@absl@@@__1@std@@@inlined_vector_internal@absl@@QEAAXXZ
     ?DecodeWaitCycles@SpinLock@base_internal@absl@@KA_KI@Z
-    ?Decrement@Refcount@cord_internal@absl@@QEAA_NXZ
+    ?Decrement@RefcountAndFlags@cord_internal@absl@@QEAA_NXZ
     ?DecrementCount@BlockingCounter@absl@@QEAA_NXZ
-    ?DecrementExpectHighRefcount@Refcount@cord_internal@absl@@QEAA_NXZ
+    ?DecrementExpectHighRefcount@RefcountAndFlags@cord_internal@absl@@QEAA_NXZ
     ?DecrementSynchSem@Mutex@absl@@CA_NPEAV12@PEAUPerThreadSynch@base_internal@2@VKernelTimeout@synchronization_internal@2@@Z
     ?DefaultArena@LowLevelAlloc@base_internal@absl@@SAPEAUArena@123@XZ
     ?DefaultStackUnwinder@absl@@YAHPEAPEAXPEAHHHPEBX1@Z
+    ?Delete@CordRepBtree@cord_internal@absl@@CAXPEAV123@@Z
     ?Delete@CordRepExternal@cord_internal@absl@@SAXPEAUCordRep@23@@Z
     ?Delete@CordRepFlat@cord_internal@absl@@SAXPEAUCordRep@23@@Z
     ?Delete@CordRepRing@cord_internal@absl@@CAXPEAV123@@Z
@@ -1680,10 +1724,14 @@
     ?Description@TimeZoneInfo@cctz@time_internal@absl@@UEBA?AV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@XZ
     ?Description@TimeZoneLibC@cctz@time_internal@absl@@UEBA?AV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@XZ
     ?Destroy@CordRep@cord_internal@absl@@SAXPEAU123@@Z
+    ?Destroy@CordRepBtree@cord_internal@absl@@SAXPEAV123@@Z
     ?Destroy@CordRepRing@cord_internal@absl@@CAXPEAV123@@Z
     ?Destroy@PerThreadSem@synchronization_internal@absl@@CAXPEAUThreadIdentity@base_internal@3@@Z
     ?DestroyContents@?$Storage@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__1@std@@@inlined_vector_internal@absl@@AEAAXXZ
     ?DestroyCordSlow@Cord@absl@@AEAAXXZ
+    ?DestroyLeaf@CordRepBtree@cord_internal@absl@@CAXPEAV123@_K1@Z
+    ?DestroyNonLeaf@CordRepBtree@cord_internal@absl@@CAXPEAV123@_K1@Z
+    ?DestroyTree@CordRepBtree@cord_internal@absl@@CAXPEAV123@_K1@Z
     ?DiagnosticsGetDeleteQueue@CordzHandle@cord_internal@absl@@SA?AV?$vector@PEBVCordzHandle@cord_internal@absl@@V?$allocator@PEBVCordzHandle@cord_internal@absl@@@__1@std@@@__1@std@@XZ
     ?DiagnosticsGetSafeToInspectDeletedHandles@CordzHandle@cord_internal@absl@@QEAA?AV?$vector@PEBVCordzHandle@cord_internal@absl@@V?$allocator@PEBVCordzHandle@cord_internal@absl@@@__1@std@@@__1@std@@XZ
     ?DiagnosticsHandleIsSafeToInspect@CordzHandle@cord_internal@absl@@QEBA_NPEBV123@@Z
@@ -1722,9 +1770,18 @@
     ?DummyFunction@?$AtomicHook@P6AXPEBX_J@Z@base_internal@absl@@CAXPEBX_J@Z
     ?DummyFunction@?$AtomicHook@P6AX_J@Z@base_internal@absl@@CAX_J@Z
     ?DummyFunction@?$AtomicHook@P6A_NW4LogSeverity@absl@@PEBDHPEAPEADPEAH@Z@base_internal@absl@@CA_NW4LogSeverity@3@PEBDHPEAPEADPEAH@Z
+    ?Dump@CordRepBtree@cord_internal@absl@@SAXPEBUCordRep@23@AEAV?$basic_ostream@DU?$char_traits@D@__1@std@@@__1@std@@@Z
+    ?Dump@CordRepBtree@cord_internal@absl@@SAXPEBUCordRep@23@Vstring_view@3@AEAV?$basic_ostream@DU?$char_traits@D@__1@std@@@__1@std@@@Z
+    ?Dump@CordRepBtree@cord_internal@absl@@SAXPEBUCordRep@23@Vstring_view@3@_NAEAV?$basic_ostream@DU?$char_traits@D@__1@std@@@__1@std@@@Z
     ?DumpPCAndFrameSizesAndStackTrace@debugging_internal@absl@@YAXPEAXQEBQEAXQEAHHH_NP6AXPEBD0@Z0@Z
     ?DurationFromTimespec@absl@@YA?AVDuration@1@Utimespec@@@Z
     ?DurationFromTimeval@absl@@YA?AVDuration@1@Utimeval@@@Z
+    ?Edge@CordRepBtree@cord_internal@absl@@QEBAPEAUCordRep@23@W4EdgeType@123@@Z
+    ?Edge@CordRepBtree@cord_internal@absl@@QEBAPEAUCordRep@23@_K@Z
+    ?EdgeData@CordRepBtree@cord_internal@absl@@SA?AVstring_view@3@PEBUCordRep@23@@Z
+    ?EdgeDataPtr@CordRepBtree@cord_internal@absl@@SAPEBDPEBUCordRep@23@@Z
+    ?Edges@CordRepBtree@cord_internal@absl@@QEBA?AV?$Span@QEAUCordRep@cord_internal@absl@@@3@XZ
+    ?Edges@CordRepBtree@cord_internal@absl@@QEBA?AV?$Span@QEAUCordRep@cord_internal@absl@@@3@_K0@Z
     ?EmplaceTree@InlineRep@Cord@absl@@QEAAXPEAUCordRep@cord_internal@3@AEBVInlineData@53@W4MethodIdentifier@CordzUpdateTracker@53@@Z
     ?EmplaceTree@InlineRep@Cord@absl@@QEAAXPEAUCordRep@cord_internal@3@W4MethodIdentifier@CordzUpdateTracker@53@@Z
     ?EmptyString@Status@absl@@CAPEBV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@XZ
@@ -1762,7 +1819,6 @@
     ?Find@ByChar@absl@@QEBA?AVstring_view@2@V32@_K@Z
     ?Find@ByLength@absl@@QEBA?AVstring_view@2@V32@_K@Z
     ?Find@ByString@absl@@QEBA?AVstring_view@2@V32@_K@Z
-    ?Find@CordRepRing@cord_internal@absl@@QEBA?AUPosition@123@I_K@Z
     ?Find@CordRepRing@cord_internal@absl@@QEBA?AUPosition@123@_K@Z
     ?FindFlatStartPiece@InlineRep@Cord@absl@@QEBA?AVstring_view@3@XZ
     ?FindPath@GraphCycles@synchronization_internal@absl@@QEBAHUGraphId@23@0HQEAU423@@Z
@@ -1840,14 +1896,7 @@
     ?FromUniversal@absl@@YA?AVTime@1@_J@Z
     ?FromUnixDuration@time_internal@absl@@YA?AVTime@2@VDuration@2@@Z
     ?FromUnixSeconds@cctz@time_internal@absl@@YA?AV?$time_point@Vsystem_clock@chrono@__1@std@@V?$duration@_JV?$ratio@$00$00@__1@std@@@234@@chrono@__1@std@@_J@Z
-    ?Get@Refcount@cord_internal@absl@@QEBAHXZ
-    ?GetAllocPtr@?$Storage@H$0CP@V?$allocator@H@__1@std@@@inlined_vector_internal@absl@@QEAAPEAV?$allocator@H@__1@std@@XZ
-    ?GetAllocPtr@?$Storage@PEAUCordRep@cord_internal@absl@@$01V?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@@inlined_vector_internal@absl@@QEAAPEAV?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@XZ
-    ?GetAllocPtr@?$Storage@PEAUCordRep@cord_internal@absl@@$0CP@V?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@@inlined_vector_internal@absl@@QEAAPEAV?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@XZ
-    ?GetAllocPtr@?$Storage@PEBUCordRep@cord_internal@absl@@$0CP@V?$allocator@PEBUCordRep@cord_internal@absl@@@__1@std@@@inlined_vector_internal@absl@@QEAAPEAV?$allocator@PEBUCordRep@cord_internal@absl@@@__1@std@@XZ
-    ?GetAllocPtr@?$Storage@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__1@std@@@inlined_vector_internal@absl@@QEAAPEAV?$allocator@UPayload@status_internal@absl@@@__1@std@@XZ
-    ?GetAllocPtr@?$Storage@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__1@std@@@inlined_vector_internal@absl@@QEBAPEBV?$allocator@UPayload@status_internal@absl@@@__1@std@@XZ
-    ?GetAllocPtr@?$Storage@USubRange@absl@@$0CP@V?$allocator@USubRange@absl@@@__1@std@@@inlined_vector_internal@absl@@QEAAPEAV?$allocator@USubRange@absl@@@__1@std@@XZ
+    ?Get@RefcountAndFlags@cord_internal@absl@@QEBAHXZ
     ?GetAllocatedCapacity@?$Storage@H$0CP@V?$allocator@H@__1@std@@@inlined_vector_internal@absl@@QEBA_KXZ
     ?GetAllocatedCapacity@?$Storage@PEAUCordRep@cord_internal@absl@@$01V?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@@inlined_vector_internal@absl@@QEBA_KXZ
     ?GetAllocatedCapacity@?$Storage@PEAUCordRep@cord_internal@absl@@$0CP@V?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@@inlined_vector_internal@absl@@QEBA_KXZ
@@ -1866,13 +1915,23 @@
     ?GetAllocator@?$AllocationTransaction@V?$allocator@PEBUCordRep@cord_internal@absl@@@__1@std@@@inlined_vector_internal@absl@@QEAAAEAV?$allocator@PEBUCordRep@cord_internal@absl@@@__1@std@@XZ
     ?GetAllocator@?$AllocationTransaction@V?$allocator@UPayload@status_internal@absl@@@__1@std@@@inlined_vector_internal@absl@@QEAAAEAV?$allocator@UPayload@status_internal@absl@@@__1@std@@XZ
     ?GetAllocator@?$AllocationTransaction@V?$allocator@USubRange@absl@@@__1@std@@@inlined_vector_internal@absl@@QEAAAEAV?$allocator@USubRange@absl@@@__1@std@@XZ
+    ?GetAllocator@?$Storage@H$0CP@V?$allocator@H@__1@std@@@inlined_vector_internal@absl@@QEAAAEAV?$allocator@H@__1@std@@XZ
+    ?GetAllocator@?$Storage@PEAUCordRep@cord_internal@absl@@$01V?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@@inlined_vector_internal@absl@@QEAAAEAV?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@XZ
+    ?GetAllocator@?$Storage@PEAUCordRep@cord_internal@absl@@$0CP@V?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@@inlined_vector_internal@absl@@QEAAAEAV?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@XZ
+    ?GetAllocator@?$Storage@PEBUCordRep@cord_internal@absl@@$0CP@V?$allocator@PEBUCordRep@cord_internal@absl@@@__1@std@@@inlined_vector_internal@absl@@QEAAAEAV?$allocator@PEBUCordRep@cord_internal@absl@@@__1@std@@XZ
+    ?GetAllocator@?$Storage@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__1@std@@@inlined_vector_internal@absl@@QEAAAEAV?$allocator@UPayload@status_internal@absl@@@__1@std@@XZ
+    ?GetAllocator@?$Storage@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__1@std@@@inlined_vector_internal@absl@@QEBAAEBV?$allocator@UPayload@status_internal@absl@@@__1@std@@XZ
+    ?GetAllocator@?$Storage@USubRange@absl@@$0CP@V?$allocator@USubRange@absl@@@__1@std@@@inlined_vector_internal@absl@@QEAAAEAV?$allocator@USubRange@absl@@@__1@std@@XZ
+    ?GetAppendBuffer@CordRepBtree@cord_internal@absl@@QEAA?AV?$Span@D@3@_K@Z
     ?GetAppendBuffer@CordRepRing@cord_internal@absl@@QEAA?AV?$Span@D@3@_K@Z
+    ?GetAppendBufferSlow@CordRepBtree@cord_internal@absl@@AEAA?AV?$Span@D@3@_K@Z
     ?GetCachedTID@base_internal@absl@@YAIXZ
     ?GetCapacity@?$AllocationTransaction@V?$allocator@H@__1@std@@@inlined_vector_internal@absl@@QEAAAEA_KXZ
     ?GetCapacity@?$AllocationTransaction@V?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@@inlined_vector_internal@absl@@QEAAAEA_KXZ
     ?GetCapacity@?$AllocationTransaction@V?$allocator@PEBUCordRep@cord_internal@absl@@@__1@std@@@inlined_vector_internal@absl@@QEAAAEA_KXZ
     ?GetCapacity@?$AllocationTransaction@V?$allocator@UPayload@status_internal@absl@@@__1@std@@@inlined_vector_internal@absl@@QEAAAEA_KXZ
     ?GetCapacity@?$AllocationTransaction@V?$allocator@USubRange@absl@@@__1@std@@@inlined_vector_internal@absl@@QEAAAEA_KXZ
+    ?GetCharacter@CordRepBtree@cord_internal@absl@@QEBAD_K@Z
     ?GetCharacter@CordRepRing@cord_internal@absl@@QEBAD_K@Z
     ?GetCond@WinHelper@Waiter@synchronization_internal@absl@@SAPEAU_RTL_CONDITION_VARIABLE@@PEAV234@@Z
     ?GetCordzStatistics@CordzInfo@cord_internal@absl@@QEBA?AUCordzStatistics@23@XZ
@@ -1956,28 +2015,35 @@
     ?GetYearDay@absl@@YAHV?$civil_time@Usecond_tag@time_internal@absl@@@detail@cctz@time_internal@1@@Z
     ?Global@HashtablezSampler@container_internal@absl@@SAAEAV123@XZ
     ?GuaranteedEqual@Condition@absl@@SA_NPEBV12@0@Z
-    ?H1@container_internal@absl@@YA_K_KPEBC@Z
+    ?H1@container_internal@absl@@YA_K_KPEBW4ctrl_t@12@@Z
     ?HandleInvalidStatusCtorArg@Helper@internal_statusor@absl@@SAXPEAVStatus@3@@Z
     ?HasBeenNotifiedInternal@Notification@absl@@CA_NPEBU?$atomic@_N@__1@std@@@Z
     ?HasEdge@GraphCycles@synchronization_internal@absl@@QEBA_NUGraphId@23@0@Z
     ?HasNode@GraphCycles@synchronization_internal@absl@@QEAA_NUGraphId@23@@Z
-    ?HashSeed@container_internal@absl@@YA_KPEBC@Z
+    ?HashSeed@container_internal@absl@@YA_KPEBW4ctrl_t@12@@Z
     ?Head@CordzInfo@cord_internal@absl@@SAPEAV123@AEBVCordzSnapshot@23@@Z
     ?HexStringToBytes@absl@@YA?AV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@Vstring_view@1@@Z
     ?HideMask@base_internal@absl@@YA_KXZ
-    ?Hours@absl@@YA?AVDuration@1@_J@Z
+    ?HighestBitSet@?$BitMask@_K$07$02@container_internal@absl@@QEBAIXZ
     ?IDivDuration@absl@@YA_JVDuration@1@0PEAV21@@Z
     ?IDivDuration@time_internal@absl@@YA_J_NVDuration@2@1PEAV32@@Z
     ?In@Time@absl@@QEBA?AUBreakdown@12@VTimeZone@2@@Z
     ?InMillisecondsFromNow@KernelTimeout@synchronization_internal@absl@@AEBAKXZ
-    ?Increment@Refcount@cord_internal@absl@@QEAAXXZ
+    ?Increment@RefcountAndFlags@cord_internal@absl@@QEAAXXZ
     ?IncrementSynchSem@Mutex@absl@@CAXPEAV12@PEAUPerThreadSynch@base_internal@2@@Z
+    ?IndexBefore@CordRepBtree@cord_internal@absl@@AEBA?AUPosition@123@U4123@_K@Z
+    ?IndexBeyond@CordRepBtree@cord_internal@absl@@AEBA?AUPosition@123@_K@Z
+    ?IndexOf@CordRepBtree@cord_internal@absl@@AEBA?AUPosition@123@_K@Z
     ?InfiniteDuration@absl@@YA?AVDuration@1@XZ
     ?InfiniteFuture@absl@@YA?AVTime@1@XZ
     ?InfinitePast@absl@@YA?AVTime@1@XZ
+    ?Init@CordRepBtreeReader@cord_internal@absl@@QEAA?AVstring_view@3@PEAVCordRepBtree@23@@Z
     ?Init@PerThreadSem@synchronization_internal@absl@@CAXPEAUThreadIdentity@base_internal@3@@Z
+    ?InitFirst@CordRepBtreeNavigator@cord_internal@absl@@QEAAPEAUCordRep@23@PEAVCordRepBtree@23@@Z
     ?InitFrom@?$Storage@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__1@std@@@inlined_vector_internal@absl@@QEAAXAEBV123@@Z
+    ?InitInstance@CordRepBtree@cord_internal@absl@@AEAAXH_K0@Z
     ?InitTree@ChunkIterator@Cord@absl@@AEAAXPEAUCordRep@cord_internal@3@@Z
+    ?InitWhat@BadStatusOrAccess@absl@@AEBAXXZ
     ?Initialize@ExponentialBiased@base_internal@absl@@AEAAXXZ
     ?InitializeCordRepExternal@cord_internal@absl@@YAXVstring_view@2@PEAUCordRepExternal@12@@Z
     ?InitializeData@Storage@?$FixedArray@PEAUCordRep@cord_internal@absl@@$0?0V?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@@absl@@AEAAPEAPEAUCordRep@cord_internal@3@XZ
@@ -1996,31 +2062,39 @@
     ?InvalidGraphId@synchronization_internal@absl@@YA?AUGraphId@12@XZ
     ?IsAborted@absl@@YA_NAEBVStatus@1@@Z
     ?IsAlreadyExists@absl@@YA_NAEBVStatus@1@@Z
+    ?IsBtree@CordRep@cord_internal@absl@@QEBA_NXZ
     ?IsCancelled@absl@@YA_NAEBVStatus@1@@Z
+    ?IsConcat@CordRep@cord_internal@absl@@QEBA_NXZ
     ?IsCooperative@SpinLock@base_internal@absl@@CA_NW4SchedulingMode@23@@Z
+    ?IsDataEdge@CordRepBtree@cord_internal@absl@@SA_NPEBUCordRep@23@@Z
     ?IsDataLoss@absl@@YA_NAEBVStatus@1@@Z
     ?IsDeadlineExceeded@absl@@YA_NAEBVStatus@1@@Z
     ?IsEmpty@Queue@CordzHandle@cord_internal@absl@@QEBA_NXZ
+    ?IsExternal@CordRep@cord_internal@absl@@QEBA_NXZ
     ?IsFailedPrecondition@absl@@YA_NAEBVStatus@1@@Z
-    ?IsFlat@CordRepRing@cord_internal@absl@@QEBA_NPEAVstring_view@3@@Z
-    ?IsFlat@CordRepRing@cord_internal@absl@@QEBA_N_K0PEAVstring_view@3@@Z
-    ?IsImmortal@Refcount@cord_internal@absl@@QEBA_NXZ
+    ?IsFlat@CordRep@cord_internal@absl@@QEBA_NXZ
+    ?IsFlat@CordRepBtree@cord_internal@absl@@QEBA_NPEAVstring_view@3@@Z
+    ?IsFlat@CordRepBtree@cord_internal@absl@@QEBA_N_K0PEAVstring_view@3@@Z
+    ?IsImmortal@RefcountAndFlags@cord_internal@absl@@QEBA_NXZ
     ?IsInfiniteDuration@time_internal@absl@@YA_NVDuration@2@@Z
     ?IsInlined@Status@absl@@CA_N_K@Z
     ?IsInternal@absl@@YA_NAEBVStatus@1@@Z
     ?IsInvalidArgument@absl@@YA_NAEBVStatus@1@@Z
     ?IsMovedFrom@Status@absl@@CA_N_K@Z
     ?IsNotFound@absl@@YA_NAEBVStatus@1@@Z
-    ?IsOne@Refcount@cord_internal@absl@@QEAA_NXZ
+    ?IsOne@RefcountAndFlags@cord_internal@absl@@QEAA_NXZ
     ?IsOutOfRange@absl@@YA_NAEBVStatus@1@@Z
     ?IsPermissionDenied@absl@@YA_NAEBVStatus@1@@Z
     ?IsReachable@GraphCycles@synchronization_internal@absl@@QEBA_NUGraphId@23@0@Z
     ?IsResourceExhausted@absl@@YA_NAEBVStatus@1@@Z
+    ?IsRing@CordRep@cord_internal@absl@@QEBA_NXZ
     ?IsSame@InlineRep@Cord@absl@@QEBA_NAEBV123@@Z
+    ?IsSubstring@CordRep@cord_internal@absl@@QEBA_NXZ
     ?IsUnauthenticated@absl@@YA_NAEBVStatus@1@@Z
     ?IsUnavailable@absl@@YA_NAEBVStatus@1@@Z
     ?IsUnimplemented@absl@@YA_NAEBVStatus@1@@Z
     ?IsUnknown@absl@@YA_NAEBVStatus@1@@Z
+    ?IsValid@CordRepBtree@cord_internal@absl@@SA_NPEBV123@_N@Z
     ?IsValid@CordRepRing@cord_internal@absl@@QEBA_NAEAV?$basic_ostream@DU?$char_traits@D@__1@std@@@__1@std@@@Z
     ?IsValidCapacity@container_internal@absl@@YA_N_K@Z
     ?IsValidIndex@CordRepRing@cord_internal@absl@@AEBA_NI@Z
@@ -2051,6 +2125,9 @@
     ?LogSeverityName@absl@@YAPEBDW4LogSeverity@1@@Z
     ?LossyAdd@CordzUpdateTracker@cord_internal@absl@@QEAAXAEBV123@@Z
     ?LossyAdd@CordzUpdateTracker@cord_internal@absl@@QEAAXW4MethodIdentifier@123@_J@Z
+    ?LowLevelHash@hash_internal@absl@@YA_KPEBX_K1QEB_K@Z
+    ?LowLevelHashImpl@MixingHashState@hash_internal@absl@@CA_KPEBE_K@Z
+    ?LowestBitSet@?$BitMask@_K$07$02@container_internal@absl@@QEBAIXZ
     ?MakeConcat@CordForest@absl@@AEAAPEAUCordRep@cord_internal@2@PEAU342@0@Z
     ?MakeDuration@time_internal@absl@@YA?AVDuration@2@_J0@Z
     ?MakeDuration@time_internal@absl@@YA?AVDuration@2@_JI@Z
@@ -2069,14 +2146,13 @@
     ?MakeTime@TimeZoneLibC@cctz@time_internal@absl@@UEBA?AUcivil_lookup@time_zone@234@AEBV?$civil_time@Usecond_tag@detail@cctz@time_internal@absl@@@detail@234@@Z
     ?MakeUint128@absl@@YA?AVuint128@1@_K0@Z
     ?MapToLocalCode@status_internal@absl@@YA?AW4StatusCode@2@H@Z
+    ?MatchEmptyOrDeleted@GroupPortableImpl@container_internal@absl@@QEBA?AV?$BitMask@_K$07$02@23@XZ
     ?MatchesConversions@ParsedFormatBase@str_format_internal@absl@@AEBA_N_NV?$initializer_list@W4FormatConversionCharSet@absl@@@std@@@Z
     ?MaxFlatLength@CordTestAccess@strings_internal@absl@@SA_KXZ
     ?MaybeTrackCordImpl@CordzInfo@cord_internal@absl@@CAXAEAVInlineData@23@AEBV423@W4MethodIdentifier@CordzUpdateTracker@23@@Z
     ?MemoryUsageAux@Cord@absl@@CA_KPEBUCordRep@cord_internal@2@@Z
-    ?Microseconds@absl@@YA?AVDuration@1@_J@Z
-    ?Milliseconds@absl@@YA?AVDuration@1@_J@Z
+    ?MergeTrees@CordRepBtree@cord_internal@absl@@CAPEAV123@PEAV123@0@Z
     ?Min@string_view@absl@@CA_K_K0@Z
-    ?Minutes@absl@@YA?AVDuration@1@_J@Z
     ?MovedFromRep@Status@absl@@CA_KXZ
     ?MovedFromString@Status@absl@@CAPEBV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@XZ
     ?MultiplyBy@?$BigUnsigned@$03@strings_internal@absl@@AEAAXHPEBI@Z
@@ -2094,13 +2170,16 @@
     ?Mutable@CordRepRing@cord_internal@absl@@CAPEAV123@PEAV123@_K@Z
     ?MutexDelay@synchronization_internal@absl@@YAHHH@Z
     ?Name@Impl@time_zone@cctz@time_internal@absl@@QEBAAEBV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@XZ
-    ?Nanoseconds@absl@@YA?AVDuration@1@_J@Z
     ?NegateAndSubtractOne@time_internal@absl@@YA_J_J@Z
     ?Never@KernelTimeout@synchronization_internal@absl@@SA?AV123@XZ
+    ?New@CordRepBtree@cord_internal@absl@@SAPEAV123@H@Z
+    ?New@CordRepBtree@cord_internal@absl@@SAPEAV123@PEAUCordRep@23@@Z
+    ?New@CordRepBtree@cord_internal@absl@@SAPEAV123@PEAV123@0@Z
     ?New@CordRepFlat@cord_internal@absl@@SAPEAU123@_K@Z
     ?New@CordRepRing@cord_internal@absl@@CAPEAV123@_K0@Z
     ?NewArena@LowLevelAlloc@base_internal@absl@@SAPEAUArena@123@H@Z
-    ?Next@CordRepRingReader@cord_internal@absl@@QEAA?AVstring_view@3@XZ
+    ?Next@CordRepBtreeNavigator@cord_internal@absl@@QEAAPEAUCordRep@23@XZ
+    ?Next@CordRepBtreeReader@cord_internal@absl@@QEAA?AVstring_view@3@XZ
     ?Next@CordzInfo@cord_internal@absl@@QEBAPEAV123@AEBVCordzSnapshot@23@@Z
     ?NextCapacity@?$Storage@H$0CP@V?$allocator@H@__1@std@@@inlined_vector_internal@absl@@SA_K_K@Z
     ?NextCapacity@?$Storage@PEAUCordRep@cord_internal@absl@@$01V?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@@inlined_vector_internal@absl@@SA_K_K@Z
@@ -2113,6 +2192,7 @@
     ?NextTransition@TimeZone@absl@@QEBA_NVTime@2@PEAUCivilTransition@12@@Z
     ?NextTransition@TimeZoneInfo@cctz@time_internal@absl@@UEBA_NAEBV?$time_point@Vsystem_clock@chrono@__1@std@@V?$duration@_JV?$ratio@$00$00@__1@std@@@234@@chrono@__1@std@@PEAUcivil_transition@time_zone@234@@Z
     ?NextTransition@TimeZoneLibC@cctz@time_internal@absl@@UEBA_NAEBV?$time_point@Vsystem_clock@chrono@__1@std@@V?$duration@_JV?$ratio@$00$00@__1@std@@@234@@chrono@__1@std@@PEAUcivil_transition@time_zone@234@@Z
+    ?NextUp@CordRepBtreeNavigator@cord_internal@absl@@AEAAPEAUCordRep@23@XZ
     ?NominalCPUFrequency@base_internal@absl@@YANXZ
     ?NormalizeLogSeverity@absl@@YA?AW4LogSeverity@1@W421@@Z
     ?NotFoundError@absl@@YA?AVStatus@1@Vstring_view@1@@Z
@@ -2158,10 +2238,13 @@
     ?PrepareToModify@Status@absl@@AEAAXXZ
     ?Prepend@Cord@absl@@QEAAXAEBV12@@Z
     ?Prepend@Cord@absl@@QEAAXVstring_view@2@@Z
+    ?Prepend@CordRepBtree@cord_internal@absl@@SAPEAV123@PEAV123@PEAUCordRep@23@@Z
+    ?Prepend@CordRepBtree@cord_internal@absl@@SAPEAV123@PEAV123@Vstring_view@3@_K@Z
     ?Prepend@CordRepRing@cord_internal@absl@@SAPEAV123@PEAV123@PEAUCordRep@23@@Z
     ?Prepend@CordRepRing@cord_internal@absl@@SAPEAV123@PEAV123@Vstring_view@3@_K@Z
     ?PrependLeaf@CordRepRing@cord_internal@absl@@CAPEAV123@PEAV123@PEAUCordRep@23@_K2@Z
     ?PrependNode@CordForest@absl@@AEAAPEAUCordRep@cord_internal@2@PEAU342@0@Z
+    ?PrependSlow@CordRepBtree@cord_internal@absl@@CAPEAV123@PEAV123@PEAUCordRep@23@@Z
     ?PrependSlow@CordRepRing@cord_internal@absl@@CAPEAV123@PEAV123@PEAUCordRep@23@@Z
     ?PrependTree@InlineRep@Cord@absl@@QEAAXPEAUCordRep@cord_internal@3@W4MethodIdentifier@CordzUpdateTracker@53@@Z
     ?PrependTreeToInlined@InlineRep@Cord@absl@@QEAAXPEAUCordRep@cord_internal@3@W4MethodIdentifier@CordzUpdateTracker@53@@Z
@@ -2182,6 +2265,8 @@
     ?Read1To3@MixingHashState@hash_internal@absl@@CAIPEBE_K@Z
     ?Read4To8@MixingHashState@hash_internal@absl@@CA_KPEBE_K@Z
     ?Read9To16@MixingHashState@hash_internal@absl@@CA?AU?$pair@_K_K@__1@std@@PEBE_K@Z
+    ?Read@CordRepBtreeNavigator@cord_internal@absl@@QEAA?AUReadResult@123@_K0@Z
+    ?Read@CordRepBtreeReader@cord_internal@absl@@QEAA?AVstring_view@3@_K0AEAPEAUCordRep@23@@Z
     ?ReadDigits@?$BigUnsigned@$03@strings_internal@absl@@AEAAHPEBD0H@Z
     ?ReadDigits@?$BigUnsigned@$0FE@@strings_internal@absl@@AEAAHPEBD0H@Z
     ?ReadFloatMantissa@?$BigUnsigned@$03@strings_internal@absl@@QEAAHAEBUParsedFloat@23@H@Z
@@ -2195,6 +2280,7 @@
     ?ReclaimThreadIdentity@synchronization_internal@absl@@YAXPEAX@Z
     ?RecordInsertSlow@container_internal@absl@@YAXPEAUHashtablezInfo@12@_K1@Z
     ?Ref@CordRep@cord_internal@absl@@SAPEAU123@PEAU123@@Z
+    ?Ref@Status@absl@@CAX_K@Z
     ?RefCordRep@CordzInfo@cord_internal@absl@@QEBAPEAUCordRep@23@XZ
     ?Register@CycleClockSource@base_internal@absl@@CAXP6A_JXZ@Z
     ?Register@HashtablezSampler@container_internal@absl@@QEAAPEAUHashtablezInfo@23@XZ
@@ -2222,7 +2308,6 @@
     ?Reset@?$AllocationTransaction@V?$allocator@PEBUCordRep@cord_internal@absl@@@__1@std@@@inlined_vector_internal@absl@@QEAAXXZ
     ?Reset@?$AllocationTransaction@V?$allocator@UPayload@status_internal@absl@@@__1@std@@@inlined_vector_internal@absl@@QEAAXXZ
     ?Reset@?$AllocationTransaction@V?$allocator@USubRange@absl@@@__1@std@@@inlined_vector_internal@absl@@QEAAXXZ
-    ?Reset@CordRepRingReader@cord_internal@absl@@QEAA?AVstring_view@3@PEAVCordRepRing@23@@Z
     ?ResetToBuiltinUTC@TimeZoneInfo@cctz@time_internal@absl@@AEAA_NAEBV?$duration@_JV?$ratio@$00$00@__1@std@@@chrono@__1@std@@@Z
     ?ResetToEmpty@InlineRep@Cord@absl@@AEAAXXZ
     ?Resize@?$ResizeUninitializedTraits@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@X@strings_internal@absl@@SAXPEAV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@_K@Z
@@ -2234,8 +2319,8 @@
     ?SafeToDelete@CordzHandle@cord_internal@absl@@QEBA_NXZ
     ?SafeWriteToStderr@raw_logging_internal@absl@@YAXPEBD_K@Z
     ?SampleSlow@container_internal@absl@@YAPEAUHashtablezInfo@12@PEA_J@Z
-    ?Seconds@absl@@YA?AVDuration@1@_J@Z
-    ?Seek@CordRepRingReader@cord_internal@absl@@QEAA?AVstring_view@3@_K@Z
+    ?Seek@CordRepBtreeNavigator@cord_internal@absl@@QEAA?AUPosition@123@_K@Z
+    ?Seek@CordRepBtreeReader@cord_internal@absl@@QEAA?AVstring_view@3@_K@Z
     ?SetAllocatedData@?$Storage@H$0CP@V?$allocator@H@__1@std@@@inlined_vector_internal@absl@@QEAAXPEAH_K@Z
     ?SetAllocatedData@?$Storage@PEAUCordRep@cord_internal@absl@@$01V?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@@inlined_vector_internal@absl@@QEAAXPEAPEAUCordRep@cord_internal@3@_K@Z
     ?SetAllocatedData@?$Storage@PEAUCordRep@cord_internal@absl@@$0CP@V?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@@inlined_vector_internal@absl@@QEAAXPEAPEAUCordRep@cord_internal@3@_K@Z
@@ -2272,9 +2357,11 @@
     ?SetWidth@FormatConversionSpecImplFriend@str_format_internal@absl@@SAXHPEAVFormatConversionSpecImpl@23@@Z
     ?ShiftLeft@?$BigUnsigned@$03@strings_internal@absl@@QEAAXH@Z
     ?ShiftLeft@?$BigUnsigned@$0FE@@strings_internal@absl@@QEAAXH@Z
-    ?ShouldInsertBackwards@container_internal@absl@@YA_N_KPEAC@Z
+    ?ShouldInsertBackwards@container_internal@absl@@YA_N_KPEBW4ctrl_t@12@@Z
     ?Signal@CondVar@absl@@QEAAXXZ
     ?SignalAll@CondVar@absl@@QEAAXXZ
+    ?SignedAddResult@int128_internal@absl@@YA?AVint128@2@V32@0@Z
+    ?SignedSubstructResult@int128_internal@absl@@YA?AVint128@2@V32@00@Z
     ?SimpleAtob@absl@@YA_NVstring_view@1@PEA_N@Z
     ?SimpleAtod@absl@@YA_NVstring_view@1@PEAN@Z
     ?SimpleAtof@absl@@YA_NVstring_view@1@PEAM@Z
@@ -2282,6 +2369,7 @@
     ?SizeofCordRepConcat@CordTestAccess@strings_internal@absl@@SA_KXZ
     ?SizeofCordRepExternal@CordTestAccess@strings_internal@absl@@SA_KXZ
     ?SizeofCordRepSubstring@CordTestAccess@strings_internal@absl@@SA_KXZ
+    ?Skip@CordRepBtreeNavigator@cord_internal@absl@@QEAA?AUPosition@123@_K@Z
     ?SleepFor@absl@@YAXVDuration@1@@Z
     ?SlowLock@SpinLock@base_internal@absl@@AEAAXXZ
     ?SlowUnlock@SpinLock@base_internal@absl@@AEAAXI@Z
@@ -2313,6 +2401,7 @@
     ?StrCat@absl@@YA?AV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@AEBVAlphaNum@1@000@Z
     ?StrCat@absl@@YA?AV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@AEBVAlphaNum@1@00@Z
     ?StrCat@absl@@YA?AV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@AEBVAlphaNum@1@0@Z
+    ?StrCat@absl@@YA?AV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@AEBVAlphaNum@1@@Z
     ?StrReplaceAll@absl@@YA?AV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@Vstring_view@1@V?$initializer_list@U?$pair@Vstring_view@absl@@V12@@__1@std@@@4@@Z
     ?StrReplaceAll@absl@@YAHV?$initializer_list@U?$pair@Vstring_view@absl@@V12@@__1@std@@@std@@PEAV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@3@@Z
     ?StripAsciiWhitespace@absl@@YA?AVstring_view@1@V21@@Z
@@ -2321,8 +2410,10 @@
     ?StrlenInternal@string_view@absl@@CA_KPEBD@Z
     ?SubLength@CordRepRing@cord_internal@absl@@AEAAXI_K@Z
     ?SubRing@CordRepRing@cord_internal@absl@@SAPEAV123@PEAV123@_K11@Z
+    ?SubTree@CordRepBtree@cord_internal@absl@@QEAAPEAUCordRep@23@_K0@Z
     ?Subcord@Cord@absl@@QEBA?AV12@_K0@Z
     ?SubstituteAndAppendArray@substitute_internal@absl@@YAXPEAV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@Vstring_view@2@PEBV62@_K@Z
+    ?SubstructResult@int128_internal@absl@@YA?AVuint128@2@V32@00@Z
     ?SubtractSize@?$Storage@H$0CP@V?$allocator@H@__1@std@@@inlined_vector_internal@absl@@QEAAX_K@Z
     ?SubtractSize@?$Storage@PEAUCordRep@cord_internal@absl@@$01V?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@@inlined_vector_internal@absl@@QEAAX_K@Z
     ?SubtractSize@?$Storage@PEAUCordRep@cord_internal@absl@@$0CP@V?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@@inlined_vector_internal@absl@@QEAAX_K@Z
@@ -2391,6 +2482,7 @@
     ?ToInt64Minutes@absl@@YA_JVDuration@1@@Z
     ?ToInt64Nanoseconds@absl@@YA_JVDuration@1@@Z
     ?ToInt64Seconds@absl@@YA_JVDuration@1@@Z
+    ?ToOpResult@CordRepBtree@cord_internal@absl@@AEAA?AUOpResult@123@_N@Z
     ?ToString@?$BigUnsigned@$03@strings_internal@absl@@QEBA?AV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@XZ
     ?ToString@?$BigUnsigned@$0FE@@strings_internal@absl@@QEBA?AV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@XZ
     ?ToString@Status@absl@@QEBA?AV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@W4StatusToStringMode@2@@Z
@@ -2496,8 +2588,6 @@
     ?Write@BufferRawSink@str_format_internal@absl@@QEAAXVstring_view@3@@Z
     ?Write@FILERawSink@str_format_internal@absl@@QEAAXVstring_view@3@@Z
     ?Write@FormatRawSinkImpl@str_format_internal@absl@@QEAAXVstring_view@3@@Z
-    ?Wyhash@hash_internal@absl@@YA_KPEBX_K1QEB_K@Z
-    ?WyhashImpl@MixingHashState@hash_internal@absl@@CA_KPEBE_K@Z
     ?ZeroDuration@absl@@YA?AVDuration@1@XZ
     ?__add_back_capacity@?$deque@PEBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@@__1@std@@AEAAXXZ
     ?__addr@?$__temp_value@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@__1@std@@@__1@std@@QEAAPEAUTransition@cctz@time_internal@absl@@XZ
@@ -2786,19 +2876,17 @@
     ?allocate@?$allocator@UTransitionType@cctz@time_internal@absl@@@__1@std@@QEAAPEAUTransitionType@cctz@time_internal@absl@@_K@Z
     ?allocate@?$allocator@UViableSubstitution@strings_internal@absl@@@__1@std@@QEAAPEAUViableSubstitution@strings_internal@absl@@_K@Z
     ?allocate@?$allocator@VFormatArgImpl@str_format_internal@absl@@@__1@std@@QEAAPEAVFormatArgImpl@str_format_internal@absl@@_K@Z
-    ?allocate@?$allocator_traits@V?$allocator@H@__1@std@@@absl@@SAPEAHAEAV?$allocator@H@__1@std@@_K@Z
     ?allocate@?$allocator_traits@V?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@@__1@std@@SAPEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@AEAV?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@23@_K@Z
     ?allocate@?$allocator_traits@V?$allocator@PEAU?$__hash_node_base@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@PEAX@__1@std@@@__1@std@@@__1@std@@@__1@std@@SAPEAPEAU?$__hash_node_base@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@PEAX@__1@std@@@23@AEAV?$allocator@PEAU?$__hash_node_base@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@PEAX@__1@std@@@__1@std@@@23@_K@Z
     ?allocate@?$allocator_traits@V?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@@__1@std@@SAPEAPEAUCordRep@cord_internal@absl@@AEAV?$allocator@PEAUCordRep@cord_internal@absl@@@23@_K@Z
-    ?allocate@?$allocator_traits@V?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@@absl@@SAPEAPEAUCordRep@cord_internal@2@AEAV?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@_K@Z
     ?allocate@?$allocator_traits@V?$allocator@PEAVCordzHandle@cord_internal@absl@@@__1@std@@@__1@std@@SAPEAPEAVCordzHandle@cord_internal@absl@@AEAV?$allocator@PEAVCordzHandle@cord_internal@absl@@@23@_K@Z
-    ?allocate@?$allocator_traits@V?$allocator@PEBUCordRep@cord_internal@absl@@@__1@std@@@absl@@SAPEAPEBUCordRep@cord_internal@2@AEAV?$allocator@PEBUCordRep@cord_internal@absl@@@__1@std@@_K@Z
+    ?allocate@?$allocator_traits@V?$allocator@PEBUCordRep@cord_internal@absl@@@__1@std@@@__1@std@@SAPEAPEBUCordRep@cord_internal@absl@@AEAV?$allocator@PEBUCordRep@cord_internal@absl@@@23@_K@Z
     ?allocate@?$allocator_traits@V?$allocator@PEBVCordzHandle@cord_internal@absl@@@__1@std@@@__1@std@@SAPEAPEBVCordzHandle@cord_internal@absl@@AEAV?$allocator@PEBVCordzHandle@cord_internal@absl@@@23@_K@Z
     ?allocate@?$allocator_traits@V?$allocator@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@@__1@std@@SAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@AEAV?$allocator@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@_K@Z
     ?allocate@?$allocator_traits@V?$allocator@U?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@PEAX@__1@std@@@__1@std@@@__1@std@@SAPEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@PEAX@23@AEAV?$allocator@U?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@PEAX@__1@std@@@23@_K@Z
     ?allocate@?$allocator_traits@V?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__1@std@@@__1@std@@SAPEAUConversionItem@ParsedFormatBase@str_format_internal@absl@@AEAV?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@23@_K@Z
-    ?allocate@?$allocator_traits@V?$allocator@UPayload@status_internal@absl@@@__1@std@@@absl@@SAPEAUPayload@status_internal@2@AEAV?$allocator@UPayload@status_internal@absl@@@__1@std@@_K@Z
-    ?allocate@?$allocator_traits@V?$allocator@USubRange@absl@@@__1@std@@@absl@@SAPEAUSubRange@2@AEAV?$allocator@USubRange@absl@@@__1@std@@_K@Z
+    ?allocate@?$allocator_traits@V?$allocator@UPayload@status_internal@absl@@@__1@std@@@__1@std@@SAPEAUPayload@status_internal@absl@@AEAV?$allocator@UPayload@status_internal@absl@@@23@_K@Z
+    ?allocate@?$allocator_traits@V?$allocator@USubRange@absl@@@__1@std@@@__1@std@@SAPEAUSubRange@absl@@AEAV?$allocator@USubRange@absl@@@23@_K@Z
     ?allocate@?$allocator_traits@V?$allocator@UTransition@cctz@time_internal@absl@@@__1@std@@@__1@std@@SAPEAUTransition@cctz@time_internal@absl@@AEAV?$allocator@UTransition@cctz@time_internal@absl@@@23@_K@Z
     ?allocate@?$allocator_traits@V?$allocator@UTransitionType@cctz@time_internal@absl@@@__1@std@@@__1@std@@SAPEAUTransitionType@cctz@time_internal@absl@@AEAV?$allocator@UTransitionType@cctz@time_internal@absl@@@23@_K@Z
     ?allocate@?$allocator_traits@V?$allocator@UViableSubstitution@strings_internal@absl@@@__1@std@@@__1@std@@SAPEAUViableSubstitution@strings_internal@absl@@AEAV?$allocator@UViableSubstitution@strings_internal@absl@@@23@_K@Z
@@ -2827,6 +2915,7 @@
     ?back@?$vector@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@__1@std@@@__1@std@@QEAAAEAUTransition@cctz@time_internal@absl@@XZ
     ?back@?$vector@UTransitionType@cctz@time_internal@absl@@V?$allocator@UTransitionType@cctz@time_internal@absl@@@__1@std@@@__1@std@@QEAAAEAUTransitionType@cctz@time_internal@absl@@XZ
     ?back@?$vector@UViableSubstitution@strings_internal@absl@@V?$allocator@UViableSubstitution@strings_internal@absl@@@__1@std@@@__1@std@@QEAAAEAUViableSubstitution@strings_internal@absl@@XZ
+    ?back@CordRepBtree@cord_internal@absl@@QEBA_KXZ
     ?base@?$__wrap_iter@PEAPEAVCordzHandle@cord_internal@absl@@@__1@std@@QEBAPEAPEAVCordzHandle@cord_internal@absl@@XZ
     ?base@?$__wrap_iter@PEAUTransition@cctz@time_internal@absl@@@__1@std@@QEBAPEAUTransition@cctz@time_internal@absl@@XZ
     ?base@?$__wrap_iter@PEAUTransitionType@cctz@time_internal@absl@@@__1@std@@QEBAPEAUTransitionType@cctz@time_internal@absl@@XZ
@@ -2840,6 +2929,7 @@
     ?begin@?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__1@std@@@absl@@QEAAPEAUPayload@status_internal@2@XZ
     ?begin@?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__1@std@@@absl@@QEBAPEBUPayload@status_internal@2@XZ
     ?begin@?$Span@$$CBVFormatArgImpl@str_format_internal@absl@@@absl@@QEBAPEBVFormatArgImpl@str_format_internal@2@XZ
+    ?begin@?$Span@QEAUCordRep@cord_internal@absl@@@absl@@QEBAPEBQEAUCordRep@cord_internal@2@XZ
     ?begin@?$__hash_table@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@V?$__unordered_map_hasher@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@23@$00@23@V?$__unordered_map_equal@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@23@$00@23@V?$allocator@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@@23@@__1@std@@QEAA?AV?$__hash_iterator@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@PEAX@__1@std@@@23@XZ
     ?begin@?$__split_buffer@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@@__1@std@@QEAAPEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@XZ
     ?begin@?$initializer_list@PEAUCordRep@cord_internal@absl@@@std@@QEBAPEBQEAUCordRep@cord_internal@absl@@XZ
@@ -2853,8 +2943,13 @@
     ?begin@?$vector@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@__1@std@@@__1@std@@QEAA?AV?$__wrap_iter@PEAUTransition@cctz@time_internal@absl@@@23@XZ
     ?begin@?$vector@UTransitionType@cctz@time_internal@absl@@V?$allocator@UTransitionType@cctz@time_internal@absl@@@__1@std@@@__1@std@@QEAA?AV?$__wrap_iter@PEAUTransitionType@cctz@time_internal@absl@@@23@XZ
     ?begin@ChunkRange@Cord@absl@@QEBA?AVChunkIterator@23@XZ
+    ?begin@CordRepBtree@cord_internal@absl@@QEBA_KXZ
     ?begin@Storage@?$FixedArray@PEAUCordRep@cord_internal@absl@@$0?0V?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@@absl@@QEBAPEAPEAUCordRep@cord_internal@3@XZ
     ?begin@string_view@absl@@QEBAPEBDXZ
+    ?btree@CordRep@cord_internal@absl@@QEAAPEAVCordRepBtree@23@XZ
+    ?btree@CordRep@cord_internal@absl@@QEBAPEBVCordRepBtree@23@XZ
+    ?btree@CordRepBtreeNavigator@cord_internal@absl@@QEBAPEAVCordRepBtree@23@XZ
+    ?btree@CordRepBtreeReader@cord_internal@absl@@QEBAPEAVCordRepBtree@23@XZ
     ?bucket_count@?$__hash_table@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@V?$__unordered_map_hasher@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@23@$00@23@V?$__unordered_map_equal@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@23@$00@23@V?$allocator@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@@23@@__1@std@@QEBA_KXZ
     ?capacity@?$__split_buffer@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@AEAV?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@@__1@std@@QEBA_KXZ
     ?capacity@?$__split_buffer@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@@__1@std@@QEBA_KXZ
@@ -2881,6 +2976,7 @@
     ?capacity@?$vector@UTransitionType@cctz@time_internal@absl@@V?$allocator@UTransitionType@cctz@time_internal@absl@@@__1@std@@@__1@std@@QEBA_KXZ
     ?capacity@?$vector@UViableSubstitution@strings_internal@absl@@V?$allocator@UViableSubstitution@strings_internal@absl@@@__1@std@@@__1@std@@QEBA_KXZ
     ?capacity@?$vector@VFormatArgImpl@str_format_internal@absl@@V?$allocator@VFormatArgImpl@str_format_internal@absl@@@__1@std@@@__1@std@@QEBA_KXZ
+    ?capacity@CordRepBtree@cord_internal@absl@@QEBA_KXZ
     ?capacity@CordRepRing@cord_internal@absl@@QEBAIXZ
     ?chunk_begin@Cord@absl@@QEBA?AVChunkIterator@12@XZ
     ?chunk_end@Cord@absl@@QEBA?AVChunkIterator@12@XZ
@@ -2909,7 +3005,7 @@
     ?compare_exchange_weak@?$__atomic_base@PEAUHashtablezInfo@container_internal@absl@@$0A@@__1@std@@QEAA_NAEAPEAUHashtablezInfo@container_internal@absl@@PEAU456@W4memory_order@23@2@Z
     ?concat@CordRep@cord_internal@absl@@QEAAPEAUCordRepConcat@23@XZ
     ?concat@CordRep@cord_internal@absl@@QEBAPEBUCordRepConcat@23@XZ
-    ?consumed@CordRepRingReader@cord_internal@absl@@QEBA_KXZ
+    ?consumed@CordRepBtreeReader@cord_internal@absl@@QEBA_KXZ
     ?conversion_char@FormatConversionSpecImpl@str_format_internal@absl@@QEBA?AW4FormatConversionChar@3@XZ
     ?cord_btree_enabled@cord_internal@absl@@3U?$atomic@_N@__1@std@@A
     ?cordz_info@InlineData@cord_internal@absl@@QEBAPEAVCordzInfo@23@XZ
@@ -2927,6 +3023,7 @@
     ?data@?$Span@$$CBVFormatArgImpl@str_format_internal@absl@@@absl@@QEBAPEBVFormatArgImpl@str_format_internal@2@XZ
     ?data@?$Span@D@absl@@QEBAPEADXZ
     ?data@?$Span@I@absl@@QEBAPEAIXZ
+    ?data@?$Span@QEAUCordRep@cord_internal@absl@@@absl@@QEBAPEBQEAUCordRep@cord_internal@2@XZ
     ?data@?$Span@VFormatArgImpl@str_format_internal@absl@@@absl@@QEBAPEAVFormatArgImpl@str_format_internal@2@XZ
     ?data@?$vector@PEAUCordRep@cord_internal@absl@@V?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@@__1@std@@QEBAPEBQEAUCordRep@cord_internal@absl@@XZ
     ?data@?$vector@PEAVCordzHandle@cord_internal@absl@@V?$allocator@PEAVCordzHandle@cord_internal@absl@@@__1@std@@@__1@std@@QEBAPEBQEAVCordzHandle@cord_internal@absl@@XZ
@@ -2963,19 +3060,17 @@
     ?deallocate@?$allocator@UTransitionType@cctz@time_internal@absl@@@__1@std@@QEAAXPEAUTransitionType@cctz@time_internal@absl@@_K@Z
     ?deallocate@?$allocator@UViableSubstitution@strings_internal@absl@@@__1@std@@QEAAXPEAUViableSubstitution@strings_internal@absl@@_K@Z
     ?deallocate@?$allocator@VFormatArgImpl@str_format_internal@absl@@@__1@std@@QEAAXPEAVFormatArgImpl@str_format_internal@absl@@_K@Z
-    ?deallocate@?$allocator_traits@V?$allocator@H@__1@std@@@absl@@SAXAEAV?$allocator@H@__1@std@@PEAH_K@Z
     ?deallocate@?$allocator_traits@V?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@@__1@std@@SAXAEAV?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@23@PEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@_K@Z
     ?deallocate@?$allocator_traits@V?$allocator@PEAU?$__hash_node_base@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@PEAX@__1@std@@@__1@std@@@__1@std@@@__1@std@@SAXAEAV?$allocator@PEAU?$__hash_node_base@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@PEAX@__1@std@@@__1@std@@@23@PEAPEAU?$__hash_node_base@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@PEAX@__1@std@@@23@_K@Z
     ?deallocate@?$allocator_traits@V?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@@__1@std@@SAXAEAV?$allocator@PEAUCordRep@cord_internal@absl@@@23@PEAPEAUCordRep@cord_internal@absl@@_K@Z
-    ?deallocate@?$allocator_traits@V?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@@absl@@SAXAEAV?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@PEAPEAUCordRep@cord_internal@2@_K@Z
     ?deallocate@?$allocator_traits@V?$allocator@PEAVCordzHandle@cord_internal@absl@@@__1@std@@@__1@std@@SAXAEAV?$allocator@PEAVCordzHandle@cord_internal@absl@@@23@PEAPEAVCordzHandle@cord_internal@absl@@_K@Z
-    ?deallocate@?$allocator_traits@V?$allocator@PEBUCordRep@cord_internal@absl@@@__1@std@@@absl@@SAXAEAV?$allocator@PEBUCordRep@cord_internal@absl@@@__1@std@@PEAPEBUCordRep@cord_internal@2@_K@Z
+    ?deallocate@?$allocator_traits@V?$allocator@PEBUCordRep@cord_internal@absl@@@__1@std@@@__1@std@@SAXAEAV?$allocator@PEBUCordRep@cord_internal@absl@@@23@PEAPEBUCordRep@cord_internal@absl@@_K@Z
     ?deallocate@?$allocator_traits@V?$allocator@PEBVCordzHandle@cord_internal@absl@@@__1@std@@@__1@std@@SAXAEAV?$allocator@PEBVCordzHandle@cord_internal@absl@@@23@PEAPEBVCordzHandle@cord_internal@absl@@_K@Z
     ?deallocate@?$allocator_traits@V?$allocator@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@@__1@std@@SAXAEAV?$allocator@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@_K@Z
     ?deallocate@?$allocator_traits@V?$allocator@U?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@PEAX@__1@std@@@__1@std@@@__1@std@@SAXAEAV?$allocator@U?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@PEAX@__1@std@@@23@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@PEAX@23@_K@Z
     ?deallocate@?$allocator_traits@V?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__1@std@@@__1@std@@SAXAEAV?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@23@PEAUConversionItem@ParsedFormatBase@str_format_internal@absl@@_K@Z
-    ?deallocate@?$allocator_traits@V?$allocator@UPayload@status_internal@absl@@@__1@std@@@absl@@SAXAEAV?$allocator@UPayload@status_internal@absl@@@__1@std@@PEAUPayload@status_internal@2@_K@Z
-    ?deallocate@?$allocator_traits@V?$allocator@USubRange@absl@@@__1@std@@@absl@@SAXAEAV?$allocator@USubRange@absl@@@__1@std@@PEAUSubRange@2@_K@Z
+    ?deallocate@?$allocator_traits@V?$allocator@UPayload@status_internal@absl@@@__1@std@@@__1@std@@SAXAEAV?$allocator@UPayload@status_internal@absl@@@23@PEAUPayload@status_internal@absl@@_K@Z
+    ?deallocate@?$allocator_traits@V?$allocator@USubRange@absl@@@__1@std@@@__1@std@@SAXAEAV?$allocator@USubRange@absl@@@23@PEAUSubRange@absl@@_K@Z
     ?deallocate@?$allocator_traits@V?$allocator@UTransition@cctz@time_internal@absl@@@__1@std@@@__1@std@@SAXAEAV?$allocator@UTransition@cctz@time_internal@absl@@@23@PEAUTransition@cctz@time_internal@absl@@_K@Z
     ?deallocate@?$allocator_traits@V?$allocator@UTransitionType@cctz@time_internal@absl@@@__1@std@@@__1@std@@SAXAEAV?$allocator@UTransitionType@cctz@time_internal@absl@@@23@PEAUTransitionType@cctz@time_internal@absl@@_K@Z
     ?deallocate@?$allocator_traits@V?$allocator@UViableSubstitution@strings_internal@absl@@@__1@std@@@__1@std@@SAXAEAV?$allocator@UViableSubstitution@strings_internal@absl@@@23@PEAUViableSubstitution@strings_internal@absl@@_K@Z
@@ -3019,6 +3114,7 @@
     ?end@?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__1@std@@@absl@@QEAAPEAUPayload@status_internal@2@XZ
     ?end@?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__1@std@@@absl@@QEBAPEBUPayload@status_internal@2@XZ
     ?end@?$Span@$$CBVFormatArgImpl@str_format_internal@absl@@@absl@@QEBAPEBVFormatArgImpl@str_format_internal@2@XZ
+    ?end@?$Span@QEAUCordRep@cord_internal@absl@@@absl@@QEBAPEBQEAUCordRep@cord_internal@2@XZ
     ?end@?$__deque_base@PEBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@@__1@std@@IEAA?AV?$__deque_iterator@PEBVImpl@time_zone@cctz@time_internal@absl@@PEAPEBV12345@AEAPEBV12345@PEAPEAPEBV12345@_J$0A@@23@XZ
     ?end@?$__hash_table@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@V?$__unordered_map_hasher@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@23@$00@23@V?$__unordered_map_equal@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@23@$00@23@V?$allocator@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@@23@@__1@std@@QEAA?AV?$__hash_iterator@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@PEAX@__1@std@@@23@XZ
     ?end@?$__split_buffer@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@@__1@std@@QEAAPEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@XZ
@@ -3031,6 +3127,7 @@
     ?end@?$vector@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@__1@std@@@__1@std@@QEAA?AV?$__wrap_iter@PEAUTransition@cctz@time_internal@absl@@@23@XZ
     ?end@?$vector@UTransitionType@cctz@time_internal@absl@@V?$allocator@UTransitionType@cctz@time_internal@absl@@@__1@std@@@__1@std@@QEAA?AV?$__wrap_iter@PEAUTransitionType@cctz@time_internal@absl@@@23@XZ
     ?end@ChunkRange@Cord@absl@@QEBA?AVChunkIterator@23@XZ
+    ?end@CordRepBtree@cord_internal@absl@@QEBA_KXZ
     ?end@Storage@?$FixedArray@PEAUCordRep@cord_internal@absl@@$0?0V?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@@absl@@QEBAPEAPEAUCordRep@cord_internal@3@XZ
     ?end@string_view@absl@@QEBAPEBDXZ
     ?entries@CordRepRing@cord_internal@absl@@QEBAIII@Z
@@ -3038,7 +3135,6 @@
     ?entry_begin_pos@CordRepRing@cord_internal@absl@@QEBAAEB_KI@Z
     ?entry_child@CordRepRing@cord_internal@absl@@AEAAPEAPEAUCordRep@23@XZ
     ?entry_child@CordRepRing@cord_internal@absl@@QEBAAEBQEAUCordRep@23@I@Z
-    ?entry_data@CordRepRing@cord_internal@absl@@QEBA?AVstring_view@3@I@Z
     ?entry_data_offset@CordRepRing@cord_internal@absl@@AEAAPEAIXZ
     ?entry_data_offset@CordRepRing@cord_internal@absl@@QEBAAEBII@Z
     ?entry_end_offset@CordRepRing@cord_internal@absl@@QEBA_KI@Z
@@ -3051,6 +3147,7 @@
     ?exchange@?$__atomic_base@P6AXAEBUHashtablezInfo@container_internal@absl@@@Z$0A@@__1@std@@QEAAP6AXAEBUHashtablezInfo@container_internal@absl@@@ZP6AX0@ZW4memory_order@23@@Z
     ?external@CordRep@cord_internal@absl@@QEAAPEAUCordRepExternal@23@XZ
     ?external@CordRep@cord_internal@absl@@QEBAPEBUCordRepExternal@23@XZ
+    ?fetch_add_end@CordRepBtree@cord_internal@absl@@AEAA_K_K@Z
     ?find@?$unordered_map@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@U?$hash@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@@23@@__1@std@@QEAA?AV?$__hash_map_iterator@V?$__hash_iterator@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@PEAX@__1@std@@@__1@std@@@23@AEBV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@23@@Z
     ?find@string_view@absl@@QEBA_KD_K@Z
     ?find@string_view@absl@@QEBA_KV12@_K@Z
@@ -3172,9 +3269,12 @@
     ?hash_function@?$__hash_table@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@V?$__unordered_map_hasher@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@23@$00@23@V?$__unordered_map_equal@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@23@$00@23@V?$allocator@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@@23@@__1@std@@QEAAAEAV?$__unordered_map_hasher@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@23@$00@23@XZ
     ?head@CordRepRing@cord_internal@absl@@QEBAIXZ
     ?head@Filler@CordRepRing@cord_internal@absl@@QEBAIXZ
+    ?height@CordRepBtree@cord_internal@absl@@QEBAHXZ
     ?hour@?$civil_time@Uhour_tag@detail@cctz@time_internal@absl@@@detail@cctz@time_internal@absl@@QEBAHXZ
     ?hour@?$civil_time@Usecond_tag@detail@cctz@time_internal@absl@@@detail@cctz@time_internal@absl@@QEBAHXZ
     ?hour@?$civil_time@Usecond_tag@time_internal@absl@@@detail@cctz@time_internal@absl@@QEBAHXZ
+    ?index@?$probe_seq@$07@container_internal@absl@@QEBA_KXZ
+    ?index@CordRepBtree@cord_internal@absl@@QEBA_KW4EdgeType@123@@Z
     ?inline_size@InlineData@cord_internal@absl@@QEBA_KXZ
     ?inline_size@InlineRep@Cord@absl@@AEBA_KXZ
     ?is_basic@FormatConversionSpecImpl@str_format_internal@absl@@QEBA_NXZ
@@ -3186,12 +3286,13 @@
     ?is_leap_year@impl@detail@cctz@time_internal@absl@@YA_N_J@Z
     ?is_length@ConvTag@str_format_internal@absl@@QEBA_NXZ
     ?is_profiled@InlineData@cord_internal@absl@@QEBA_NXZ
+    ?is_small@container_internal@absl@@YA_N_K@Z
     ?is_snapshot@CordzHandle@cord_internal@absl@@QEBA_NXZ
     ?is_tree@InlineData@cord_internal@absl@@QEBA_NXZ
     ?is_tree@InlineRep@Cord@absl@@QEBA_NXZ
     ?key_eq@?$__hash_table@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@V?$__unordered_map_hasher@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@23@$00@23@V?$__unordered_map_equal@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@23@$00@23@V?$allocator@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@@23@@__1@std@@QEAAAEAV?$__unordered_map_equal@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@23@$00@23@XZ
     ?length@?$Span@D@absl@@QEBA_KXZ
-    ?length@CordRepRingReader@cord_internal@absl@@QEBA_KXZ
+    ?length@CordRepBtreeReader@cord_internal@absl@@QEBA_KXZ
     ?length@string_view@absl@@QEBA_KXZ
     ?load@?$__atomic_base@P6AXAEBUHashtablezInfo@container_internal@absl@@@Z$0A@@__1@std@@QEBAP6AXAEBUHashtablezInfo@container_internal@absl@@@ZW4memory_order@23@@Z
     ?load@?$__atomic_base@PEAUHashtablezInfo@container_internal@absl@@$0A@@__1@std@@QEBAPEAUHashtablezInfo@container_internal@absl@@W4memory_order@23@@Z
@@ -3256,8 +3357,11 @@
     ?n_mon@impl@detail@cctz@time_internal@absl@@YA?AUfields@2345@_J000CCC@Z
     ?n_sec@impl@detail@cctz@time_internal@absl@@YA?AUfields@2345@_J00000@Z
     ?name@time_zone@cctz@time_internal@absl@@QEBA?AV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@XZ
+    ?next@?$probe_seq@$07@container_internal@absl@@QEAAXXZ
     ?next_transition@time_zone@cctz@time_internal@absl@@QEBA_NAEBV?$time_point@Vsystem_clock@chrono@__1@std@@V?$duration@_JV?$ratio@$00$00@__1@std@@@234@@chrono@__1@std@@PEAUcivil_transition@1234@@Z
     ?next_weekday@detail@cctz@time_internal@absl@@YA?AV?$civil_time@Uday_tag@detail@cctz@time_internal@absl@@@1234@V51234@W4weekday@1234@@Z
+    ?offset@?$probe_seq@$07@container_internal@absl@@QEBA_KXZ
+    ?offset@?$probe_seq@$07@container_internal@absl@@QEBA_K_K@Z
     ?ok@Status@absl@@QEBA_NXZ
     ?overflow@OStringStream@strings_internal@absl@@EEAAHH@Z
     ?parse@detail@cctz@time_internal@absl@@YA_NAEBV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@0AEBVtime_zone@234@PEAV?$time_point@Vsystem_clock@chrono@__1@std@@V?$duration@_JV?$ratio@$00$00@__1@std@@@234@@chrono@67@PEAV?$duration@_JV?$ratio@$00$0DINHOKEMGIAAA@@__1@std@@@chrono@67@PEAV567@@Z
@@ -3278,6 +3382,7 @@
     ?precision@FormatConversionSpecImpl@str_format_internal@absl@@QEBAHXZ
     ?prev_transition@time_zone@cctz@time_internal@absl@@QEBA_NAEBV?$time_point@Vsystem_clock@chrono@__1@std@@V?$duration@_JV?$ratio@$00$00@__1@std@@@234@@chrono@__1@std@@PEAUcivil_transition@1234@@Z
     ?prev_weekday@detail@cctz@time_internal@absl@@YA?AV?$civil_time@Uday_tag@detail@cctz@time_internal@absl@@@1234@V51234@W4weekday@1234@@Z
+    ?probe@container_internal@absl@@YA?AV?$probe_seq@$07@12@PEBW4ctrl_t@12@_K1@Z
     ?push_back@?$InlinedVector@H$0CP@V?$allocator@H@__1@std@@@absl@@QEAAXAEBH@Z
     ?push_back@?$InlinedVector@PEAUCordRep@cord_internal@absl@@$01V?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@@absl@@QEAAXAEBQEAUCordRep@cord_internal@2@@Z
     ?push_back@?$InlinedVector@PEAUCordRep@cord_internal@absl@@$0CP@V?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@@absl@@QEAAX$$QEAPEAUCordRep@cord_internal@2@@Z
@@ -3306,7 +3411,6 @@
     ?release@?$unique_ptr@U?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@PEAX@__1@std@@V?$__hash_node_destructor@V?$allocator@U?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@PEAX@__1@std@@@__1@std@@@23@@__1@std@@QEAAPEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@PEAX@23@XZ
     ?release@?$unique_ptr@V?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__1@std@@@absl@@U?$default_delete@V?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__1@std@@@absl@@@__1@std@@@__1@std@@QEAAPEAV?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__1@std@@@absl@@XZ
     ?release@?$unique_ptr@VTimeZoneInfo@cctz@time_internal@absl@@U?$default_delete@VTimeZoneInfo@cctz@time_internal@absl@@@__1@std@@@__1@std@@QEAAPEAVTimeZoneInfo@cctz@time_internal@absl@@XZ
-    ?remaining@CordRepRingReader@cord_internal@absl@@QEBA_KXZ
     ?remove_prefix@InlineRep@Cord@absl@@QEAAX_K@Z
     ?remove_prefix@string_view@absl@@QEAAX_K@Z
     ?remove_suffix@string_view@absl@@QEAAX_K@Z
@@ -3330,7 +3434,6 @@
     ?rfind@string_view@absl@@QEBA_KV12@_K@Z
     ?ring@CordRep@cord_internal@absl@@QEAAPEAVCordRepRing@23@XZ
     ?ring@CordRep@cord_internal@absl@@QEBAPEBVCordRepRing@23@XZ
-    ?ring@CordRepRingReader@cord_internal@absl@@QEBAPEAVCordRepRing@23@XZ
     ?safe_strto128_base@numbers_internal@absl@@YA_NVstring_view@2@PEAVint128@2@H@Z
     ?safe_strto32_base@numbers_internal@absl@@YA_NVstring_view@2@PEAHH@Z
     ?safe_strto64_base@numbers_internal@absl@@YA_NVstring_view@2@PEA_JH@Z
@@ -3381,11 +3484,13 @@
     ?second@?$civil_time@Usecond_tag@detail@cctz@time_internal@absl@@@detail@cctz@time_internal@absl@@QEBAHXZ
     ?second@?$civil_time@Usecond_tag@time_internal@absl@@@detail@cctz@time_internal@absl@@QEBAHXZ
     ?set_arg@BoundConversion@str_format_internal@absl@@QEAAXPEBVFormatArgImpl@23@@Z
+    ?set_begin@CordRepBtree@cord_internal@absl@@AEAAX_K@Z
     ?set_cordz_info@InlineData@cord_internal@absl@@QEAAXPEAVCordzInfo@23@@Z
     ?set_cordz_mean_interval@cord_internal@absl@@YAXH@Z
     ?set_data@InlineRep@Cord@absl@@QEAAPEAD_K@Z
     ?set_data@InlineRep@Cord@absl@@QEAAXPEBD_K_N@Z
     ?set_depth@CordRepConcat@cord_internal@absl@@QEAAXE@Z
+    ?set_end@CordRepBtree@cord_internal@absl@@AEAAX_K@Z
     ?set_from_arg@InputValue@UnboundConversion@str_format_internal@absl@@QEAAXH@Z
     ?set_inline_size@InlineData@cord_internal@absl@@QEAAX_K@Z
     ?set_inline_size@InlineRep@Cord@absl@@AEAAX_K@Z
@@ -3404,6 +3509,7 @@
     ?size@?$Span@$$CBVFormatArgImpl@str_format_internal@absl@@@absl@@QEBA_KXZ
     ?size@?$Span@D@absl@@QEBA_KXZ
     ?size@?$Span@I@absl@@QEBA_KXZ
+    ?size@?$Span@QEAUCordRep@cord_internal@absl@@@absl@@QEBA_KXZ
     ?size@?$Span@VFormatArgImpl@str_format_internal@absl@@@absl@@QEBA_KXZ
     ?size@?$__bucket_list_deallocator@V?$allocator@PEAU?$__hash_node_base@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@PEAX@__1@std@@@__1@std@@@__1@std@@@__1@std@@QEAAAEA_KXZ
     ?size@?$__bucket_list_deallocator@V?$allocator@PEAU?$__hash_node_base@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@PEAX@__1@std@@@__1@std@@@__1@std@@@__1@std@@QEBA_KXZ
@@ -3425,6 +3531,7 @@
     ?size@?$vector@VFormatArgImpl@str_format_internal@absl@@V?$allocator@VFormatArgImpl@str_format_internal@absl@@@__1@std@@@__1@std@@QEBA_KXZ
     ?size@AlphaNum@absl@@QEBA_KXZ
     ?size@Cord@absl@@QEBA_KXZ
+    ?size@CordRepBtree@cord_internal@absl@@QEBA_KXZ
     ?size@InlineRep@Cord@absl@@QEBA_KXZ
     ?size@Storage@?$FixedArray@PEAUCordRep@cord_internal@absl@@$0?0V?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@@absl@@QEBA_KXZ
     ?size@string_view@absl@@QEBA_KXZ
@@ -3436,6 +3543,7 @@
     ?store@?$__atomic_base@W4OnDeadlockCycle@absl@@$0A@@__1@std@@QEAAXW4OnDeadlockCycle@absl@@W4memory_order@23@@Z
     ?store@?$__atomic_base@W4State@PerThreadSynch@base_internal@absl@@$0A@@__1@std@@QEAAXW4State@PerThreadSynch@base_internal@absl@@W4memory_order@23@@Z
     ?str@UntypedFormatSpecImpl@str_format_internal@absl@@QEBA?AVstring_view@3@XZ
+    ?sub_fetch_begin@CordRepBtree@cord_internal@absl@@AEAA_K_K@Z
     ?substr@string_view@absl@@QEBA?AV12@_K0@Z
     ?substring@CordRep@cord_internal@absl@@QEAAPEAUCordRepSubstring@23@XZ
     ?substring@CordRep@cord_internal@absl@@QEBAPEBUCordRepSubstring@23@XZ
diff --git a/third_party/abseil-cpp/symbols_arm64_rel.def b/third_party/abseil-cpp/symbols_arm64_rel.def
index 50dc982..dd83c1f 100644
--- a/third_party/abseil-cpp/symbols_arm64_rel.def
+++ b/third_party/abseil-cpp/symbols_arm64_rel.def
@@ -3,6 +3,12 @@
     ??$?0V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@$0A@@Cord@absl@@QEAA@$$QEAV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@Z
     ??$?MUsecond_tag@detail@cctz@time_internal@absl@@U01234@@detail@cctz@time_internal@absl@@YA_NAEBV?$civil_time@Usecond_tag@detail@cctz@time_internal@absl@@@0123@0@Z
     ??$?RW4LogSeverity@absl@@AEBQEBDHAEAPEBD@?$AtomicHook@P6AXW4LogSeverity@absl@@PEBDHAEBV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@Z@base_internal@absl@@QEBAX$$QEAW4LogSeverity@2@AEBQEBD$$QEAHAEAPEBD@Z
+    ??$AddCordRep@$00@CordRepBtree@cord_internal@absl@@CAPEAV012@PEAV012@PEAUCordRep@12@@Z
+    ??$AddCordRep@$0A@@CordRepBtree@cord_internal@absl@@CAPEAV012@PEAV012@PEAUCordRep@12@@Z
+    ??$AddData@$00@CordRepBtree@cord_internal@absl@@AEAA?AVstring_view@2@V32@_K@Z
+    ??$AddData@$00@CordRepBtree@cord_internal@absl@@CAPEAV012@PEAV012@Vstring_view@2@_K@Z
+    ??$AddData@$0A@@CordRepBtree@cord_internal@absl@@AEAA?AVstring_view@2@V32@_K@Z
+    ??$AddData@$0A@@CordRepBtree@cord_internal@absl@@CAPEAV012@PEAV012@Vstring_view@2@_K@Z
     ??$AddRing@$00@CordRepRing@cord_internal@absl@@CAPEAV012@PEAV012@0_K1@Z
     ??$AddRing@$0A@@CordRepRing@cord_internal@absl@@CAPEAV012@PEAV012@0_K1@Z
     ??$Append@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@$0A@@Cord@absl@@QEAAX$$QEAV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@Z
@@ -62,12 +68,18 @@
     ??$GenericCompare@HVstring_view@absl@@@absl@@YAHAEBVCord@0@AEBVstring_view@0@_K@Z
     ??$GenericCompare@_NVCord@absl@@@absl@@YA_NAEBVCord@0@0_K@Z
     ??$GenericCompare@_NVstring_view@absl@@@absl@@YA_NAEBVCord@0@AEBVstring_view@0@_K@Z
+    ??$Merge@$00@CordRepBtree@cord_internal@absl@@CAPEAV012@PEAV012@0@Z
+    ??$Merge@$0A@@CordRepBtree@cord_internal@absl@@CAPEAV012@PEAV012@0@Z
+    ??$NewLeaf@$00@CordRepBtree@cord_internal@absl@@CAPEAV012@Vstring_view@2@_K@Z
+    ??$NewLeaf@$0A@@CordRepBtree@cord_internal@absl@@CAPEAV012@Vstring_view@2@_K@Z
     ??$ParseFloat@$09@strings_internal@absl@@YA?AUParsedFloat@01@PEBD0W4chars_format@1@@Z
     ??$ParseFloat@$0BA@@strings_internal@absl@@YA?AUParsedFloat@01@PEBD0W4chars_format@1@@Z
     ??$ParseFormatString@UParsedFormatConsumer@ParsedFormatBase@str_format_internal@absl@@@str_format_internal@absl@@YA_NVstring_view@1@UParsedFormatConsumer@ParsedFormatBase@01@@Z
     ??$Prepend@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@$0A@@Cord@absl@@QEAAX$$QEAV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@Z
     ??$STLStringReserveAmortized@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@strings_internal@absl@@YAXPEAV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@_K@Z
     ??$STLStringResizeUninitializedAmortized@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@strings_internal@absl@@YAXPEAV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@_K@Z
+    ??$SetEdge@$00@CordRepBtree@cord_internal@absl@@QEAA?AUOpResult@012@_NPEAUCordRep@12@_K@Z
+    ??$SetEdge@$0A@@CordRepBtree@cord_internal@absl@@QEAA?AUOpResult@012@_NPEAUCordRep@12@_K@Z
     ??$StrReplaceAll@V?$initializer_list@U?$pair@Vstring_view@absl@@V12@@__1@std@@@std@@@absl@@YA?AV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@Vstring_view@0@AEBV?$initializer_list@U?$pair@Vstring_view@absl@@V12@@__1@std@@@3@@Z
     ??$StrReplaceAll@V?$initializer_list@U?$pair@Vstring_view@absl@@V12@@__1@std@@@std@@@absl@@YAHAEBV?$initializer_list@U?$pair@Vstring_view@absl@@V12@@__1@std@@@std@@PEAV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@2@@Z
     ??$__construct_node_hash@AEBUpiecewise_construct_t@__1@std@@V?$tuple@AEBV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@23@V?$tuple@$$V@23@@?$__hash_table@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@V?$__unordered_map_hasher@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@23@$00@23@V?$__unordered_map_equal@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@23@$00@23@V?$allocator@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@@23@@__1@std@@AEAA?AV?$unique_ptr@U?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@PEAX@__1@std@@V?$__hash_node_destructor@V?$allocator@U?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@PEAX@__1@std@@@__1@std@@@23@@12@_KAEBUpiecewise_construct_t@12@$$QEAV?$tuple@AEBV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@12@$$QEAV?$tuple@$$V@12@@Z
@@ -82,6 +94,7 @@
     ??$emplace_back@$$V@?$__split_buffer@UTransition@cctz@time_internal@absl@@AEAV?$allocator@UTransition@cctz@time_internal@absl@@@__1@std@@@__1@std@@QEAAXXZ
     ??$emplace_back@$$V@?$__split_buffer@UTransitionType@cctz@time_internal@absl@@AEAV?$allocator@UTransitionType@cctz@time_internal@absl@@@__1@std@@@__1@std@@QEAAXXZ
     ??$find@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@?$__hash_table@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@V?$__unordered_map_hasher@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@23@$00@23@V?$__unordered_map_equal@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@23@$00@23@V?$allocator@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@@23@@__1@std@@QEAA?AV?$__hash_iterator@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@PEAX@__1@std@@@12@AEBV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@12@@Z
+    ??$find_first_non_full@X@container_internal@absl@@YA?AUFindInfo@01@PEBW4ctrl_t@01@_K1@Z
     ??0?$BigUnsigned@$03@strings_internal@absl@@QEAA@Vstring_view@2@@Z
     ??0?$BigUnsigned@$03@strings_internal@absl@@QEAA@XZ
     ??0?$BigUnsigned@$03@strings_internal@absl@@QEAA@_K@Z
@@ -91,7 +104,6 @@
     ??0?$__split_buffer@UTransition@cctz@time_internal@absl@@AEAV?$allocator@UTransition@cctz@time_internal@absl@@@__1@std@@@__1@std@@QEAA@_K0AEAV?$allocator@UTransition@cctz@time_internal@absl@@@12@@Z
     ??0?$__split_buffer@UTransitionType@cctz@time_internal@absl@@AEAV?$allocator@UTransitionType@cctz@time_internal@absl@@@__1@std@@@__1@std@@QEAA@_K0AEAV?$allocator@UTransitionType@cctz@time_internal@absl@@@12@@Z
     ??0?$__split_buffer@UViableSubstitution@strings_internal@absl@@AEAV?$allocator@UViableSubstitution@strings_internal@absl@@@__1@std@@@__1@std@@QEAA@_K0AEAV?$allocator@UViableSubstitution@strings_internal@absl@@@12@@Z
-    ??0AlphaNum@absl@@QEAA@PEBD@Z
     ??0AlphaNum@absl@@QEAA@UDec@1@@Z
     ??0AlphaNum@absl@@QEAA@UHex@1@@Z
     ??0AlphaNum@absl@@QEAA@_K@Z
@@ -99,6 +111,8 @@
     ??0Arg@substitute_internal@absl@@QEAA@PEBX@Z
     ??0Arg@substitute_internal@absl@@QEAA@UDec@2@@Z
     ??0Arg@substitute_internal@absl@@QEAA@UHex@2@@Z
+    ??0BadStatusOrAccess@absl@@QEAA@$$QEAV01@@Z
+    ??0BadStatusOrAccess@absl@@QEAA@AEBV01@@Z
     ??0BadStatusOrAccess@absl@@QEAA@VStatus@1@@Z
     ??0BlockingCounter@absl@@QEAA@H@Z
     ??0ByAnyChar@absl@@QEAA@Vstring_view@1@@Z
@@ -143,6 +157,8 @@
     ??1bad_optional_access@absl@@UEAA@XZ
     ??1bad_variant_access@absl@@UEAA@XZ
     ??4?$optional_data@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@$0A@@optional_internal@absl@@IEAAAEAV012@$$QEAV012@@Z
+    ??4BadStatusOrAccess@absl@@QEAAAEAV01@$$QEAV01@@Z
+    ??4BadStatusOrAccess@absl@@QEAAAEAV01@AEBV01@@Z
     ??4Cord@absl@@QEAAAEAV01@Vstring_view@1@@Z
     ??6absl@@YAAEAV?$basic_ostream@DU?$char_traits@D@__1@std@@@__1@std@@AEAV123@AEBVCord@0@@Z
     ??6absl@@YAAEAV?$basic_ostream@DU?$char_traits@D@__1@std@@@__1@std@@AEAV123@AEBVStatus@0@@Z
@@ -168,6 +184,7 @@
     ??ACord@absl@@QEBAD_K@Z
     ??BCord@absl@@QEBA?AV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@XZ
     ??Bint128@absl@@QEBANXZ
+    ??EChunkIterator@Cord@absl@@QEAAAEAV012@XZ
     ??Gdetail@cctz@time_internal@absl@@YA?AV?$civil_time@Uday_tag@detail@cctz@time_internal@absl@@@0123@V40123@_J@Z
     ??Gdetail@cctz@time_internal@absl@@YA?AV?$civil_time@Usecond_tag@detail@cctz@time_internal@absl@@@0123@V40123@_J@Z
     ??Hdetail@cctz@time_internal@absl@@YA?AV?$civil_time@Uday_tag@detail@cctz@time_internal@absl@@@0123@V40123@_J@Z
@@ -196,7 +213,7 @@
     ?AddWithCarry@?$BigUnsigned@$0FE@@strings_internal@absl@@AEAAXH_K@Z
     ?AddressIsReadable@debugging_internal@absl@@YA_NPEBX@Z
     ?AdvanceAndReadBytes@ChunkIterator@Cord@absl@@AEAA?AV23@_K@Z
-    ?AdvanceBytesRing@ChunkIterator@Cord@absl@@AEAAX_K@Z
+    ?AdvanceBytesBtree@ChunkIterator@Cord@absl@@AEAAX_K@Z
     ?AdvanceBytesSlowPath@ChunkIterator@Cord@absl@@AEAAX_K@Z
     ?AdvanceStack@ChunkIterator@Cord@absl@@AEAAAEAV123@XZ
     ?Alloc@LowLevelAlloc@base_internal@absl@@SAPEAX_K@Z
@@ -204,6 +221,7 @@
     ?AlreadyExistsError@absl@@YA?AVStatus@1@Vstring_view@1@@Z
     ?Append@Cord@absl@@QEAAX$$QEAV12@@Z
     ?Append@Cord@absl@@QEAAXAEBV12@@Z
+    ?Append@CordRepBtree@cord_internal@absl@@SAPEAV123@PEAV123@Vstring_view@3@_K@Z
     ?Append@CordRepRing@cord_internal@absl@@SAPEAV123@PEAV123@PEAUCordRep@23@@Z
     ?Append@CordRepRing@cord_internal@absl@@SAPEAV123@PEAV123@Vstring_view@3@_K@Z
     ?Append@FormatSinkImpl@str_format_internal@absl@@QEAAXVstring_view@3@@Z
@@ -213,6 +231,7 @@
     ?AppendLeaf@CordRepRing@cord_internal@absl@@CAPEAV123@PEAV123@PEAUCordRep@23@_K2@Z
     ?AppendPack@str_format_internal@absl@@YAAEAV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEAV345@VUntypedFormatSpecImpl@12@V?$Span@$$CBVFormatArgImpl@str_format_internal@absl@@@2@@Z
     ?AppendPieces@strings_internal@absl@@YAXPEAV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@V?$initializer_list@Vstring_view@absl@@@5@@Z
+    ?AppendSlow@CordRepBtree@cord_internal@absl@@CAPEAV123@PEAV123@PEAUCordRep@23@@Z
     ?AppendSlow@CordRepRing@cord_internal@absl@@CAPEAV123@PEAV123@PEAUCordRep@23@@Z
     ?AppendTree@InlineRep@Cord@absl@@QEAAXPEAUCordRep@cord_internal@3@W4MethodIdentifier@CordzUpdateTracker@53@@Z
     ?AppendTreeToInlined@InlineRep@Cord@absl@@QEAAXPEAUCordRep@cord_internal@3@W4MethodIdentifier@CordzUpdateTracker@53@@Z
@@ -272,18 +291,21 @@
     ?Consume@cord_internal@absl@@YAXPEAUCordRep@12@V?$FunctionRef@$$A6AXPEAUCordRep@cord_internal@absl@@_K1@Z@2@@Z
     ?ConsumeUnboundConversion@str_format_internal@absl@@YAPEBDPEBD0PEAUUnboundConversion@12@PEAH@Z
     ?ConvertDateTime@absl@@YA?AUTimeConversion@1@_JHHHHHVTimeZone@1@@Z
-    ?ConvertDeletedToEmptyAndFullToDeleted@container_internal@absl@@YAXPEAC_K@Z
+    ?ConvertDeletedToEmptyAndFullToDeleted@container_internal@absl@@YAXPEAW4ctrl_t@12@_K@Z
     ?ConvertFloatImpl@str_format_internal@absl@@YA_NMAEBVFormatConversionSpecImpl@12@PEAVFormatSinkImpl@12@@Z
     ?ConvertFloatImpl@str_format_internal@absl@@YA_NNAEBVFormatConversionSpecImpl@12@PEAVFormatSinkImpl@12@@Z
     ?ConvertFloatImpl@str_format_internal@absl@@YA_NOAEBVFormatConversionSpecImpl@12@PEAVFormatSinkImpl@12@@Z
     ?ConvertOne@ParsedFormatConsumer@ParsedFormatBase@str_format_internal@absl@@QEAA_NAEBUUnboundConversion@34@Vstring_view@4@@Z
     ?Copy@CordRepRing@cord_internal@absl@@CAPEAV123@PEAV123@II_K@Z
     ?CopyCordToString@absl@@YAXAEBVCord@1@PEAV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@Z
+    ?CopyPrefix@CordRepBtree@cord_internal@absl@@AEAA?AUCopyResult@123@_K@Z
+    ?CopySuffix@CordRepBtree@cord_internal@absl@@AEAA?AUCopyResult@123@_K@Z
     ?CopyTo@InlineRep@Cord@absl@@QEBAXPEAV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@Z
     ?CopyToArraySlowPath@Cord@absl@@AEBAXPEAD@Z
     ?Crash@Helper@internal_statusor@absl@@SAXAEBVStatus@3@@Z
     ?Create@CordRepRing@cord_internal@absl@@SAPEAV123@PEAUCordRep@23@_K@Z
     ?CreateFromLeaf@CordRepRing@cord_internal@absl@@CAPEAV123@PEAUCordRep@23@_K11@Z
+    ?CreateSlow@CordRepBtree@cord_internal@absl@@CAPEAV123@PEAUCordRep@23@@Z
     ?CreateSlow@CordRepRing@cord_internal@absl@@CAPEAV123@PEAUCordRep@23@_K@Z
     ?CreateThreadIdentity@synchronization_internal@absl@@YAPEAUThreadIdentity@base_internal@2@XZ
     ?CurrentThreadIdentityIfPresent@base_internal@absl@@YAPEAUThreadIdentity@12@XZ
@@ -306,6 +328,8 @@
     ?Destroy@PerThreadSem@synchronization_internal@absl@@CAXPEAUThreadIdentity@base_internal@3@@Z
     ?DestroyContents@?$Storage@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__1@std@@@inlined_vector_internal@absl@@AEAAXXZ
     ?DestroyCordSlow@Cord@absl@@AEAAXXZ
+    ?DestroyLeaf@CordRepBtree@cord_internal@absl@@CAXPEAV123@_K1@Z
+    ?DestroyNonLeaf@CordRepBtree@cord_internal@absl@@CAXPEAV123@_K1@Z
     ?DiagnosticsGetDeleteQueue@CordzHandle@cord_internal@absl@@SA?AV?$vector@PEBVCordzHandle@cord_internal@absl@@V?$allocator@PEBVCordzHandle@cord_internal@absl@@@__1@std@@@__1@std@@XZ
     ?DiagnosticsGetSafeToInspectDeletedHandles@CordzHandle@cord_internal@absl@@QEAA?AV?$vector@PEBVCordzHandle@cord_internal@absl@@V?$allocator@PEBVCordzHandle@cord_internal@absl@@@__1@std@@@__1@std@@XZ
     ?DiagnosticsHandleIsSafeToInspect@CordzHandle@cord_internal@absl@@QEBA_NPEBV123@@Z
@@ -318,6 +342,9 @@
     ?DummyFunction@?$AtomicHook@P6AXPEBX_J@Z@base_internal@absl@@CAXPEBX_J@Z
     ?DummyFunction@?$AtomicHook@P6AX_J@Z@base_internal@absl@@CAX_J@Z
     ?DummyFunction@?$AtomicHook@P6A_NW4LogSeverity@absl@@PEBDHPEAPEADPEAH@Z@base_internal@absl@@CA_NW4LogSeverity@3@PEBDHPEAPEADPEAH@Z
+    ?Dump@CordRepBtree@cord_internal@absl@@SAXPEBUCordRep@23@AEAV?$basic_ostream@DU?$char_traits@D@__1@std@@@__1@std@@@Z
+    ?Dump@CordRepBtree@cord_internal@absl@@SAXPEBUCordRep@23@Vstring_view@3@AEAV?$basic_ostream@DU?$char_traits@D@__1@std@@@__1@std@@@Z
+    ?Dump@CordRepBtree@cord_internal@absl@@SAXPEBUCordRep@23@Vstring_view@3@_NAEAV?$basic_ostream@DU?$char_traits@D@__1@std@@@__1@std@@@Z
     ?DumpPCAndFrameSizesAndStackTrace@debugging_internal@absl@@YAXPEAXQEBQEAXQEAHHH_NP6AXPEBD0@Z0@Z
     ?DurationFromTimespec@absl@@YA?AVDuration@1@Utimespec@@@Z
     ?DurationFromTimeval@absl@@YA?AVDuration@1@Utimeval@@@Z
@@ -411,8 +438,11 @@
     ?FromTM@absl@@YA?AVTime@1@AEBUtm@@VTimeZone@1@@Z
     ?FromUDate@absl@@YA?AVTime@1@N@Z
     ?FromUniversal@absl@@YA?AVTime@1@_J@Z
+    ?GetAppendBuffer@CordRepBtree@cord_internal@absl@@QEAA?AV?$Span@D@3@_K@Z
     ?GetAppendBuffer@CordRepRing@cord_internal@absl@@QEAA?AV?$Span@D@3@_K@Z
+    ?GetAppendBufferSlow@CordRepBtree@cord_internal@absl@@AEAA?AV?$Span@D@3@_K@Z
     ?GetCachedTID@base_internal@absl@@YAIXZ
+    ?GetCharacter@CordRepBtree@cord_internal@absl@@QEBAD_K@Z
     ?GetCharacter@CordRepRing@cord_internal@absl@@QEBAD_K@Z
     ?GetCordzStatistics@CordzInfo@cord_internal@absl@@QEBA?AUCordzStatistics@23@XZ
     ?GetCurrentTimeNanos@absl@@YA_JXZ
@@ -451,7 +481,7 @@
     ?IncrementSynchSem@Mutex@absl@@CAXPEAV12@PEAUPerThreadSynch@base_internal@2@@Z
     ?Init@PerThreadSem@synchronization_internal@absl@@CAXPEAUThreadIdentity@base_internal@3@@Z
     ?InitFrom@?$Storage@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__1@std@@@inlined_vector_internal@absl@@QEAAXAEBV123@@Z
-    ?InitTree@ChunkIterator@Cord@absl@@AEAAXPEAUCordRep@cord_internal@3@@Z
+    ?InitWhat@BadStatusOrAccess@absl@@AEBAXXZ
     ?Initialize@ExponentialBiased@base_internal@absl@@AEAAXXZ
     ?InitializeCordRepExternal@cord_internal@absl@@YAXVstring_view@2@PEAUCordRepExternal@12@@Z
     ?InitializeSymbolizer@absl@@YAXPEBD@Z
@@ -467,7 +497,8 @@
     ?IsDataLoss@absl@@YA_NAEBVStatus@1@@Z
     ?IsDeadlineExceeded@absl@@YA_NAEBVStatus@1@@Z
     ?IsFailedPrecondition@absl@@YA_NAEBVStatus@1@@Z
-    ?IsFlat@CordRepRing@cord_internal@absl@@QEBA_N_K0PEAVstring_view@3@@Z
+    ?IsFlat@CordRepBtree@cord_internal@absl@@QEBA_NPEAVstring_view@3@@Z
+    ?IsFlat@CordRepBtree@cord_internal@absl@@QEBA_N_K0PEAVstring_view@3@@Z
     ?IsInternal@absl@@YA_NAEBVStatus@1@@Z
     ?IsInvalidArgument@absl@@YA_NAEBVStatus@1@@Z
     ?IsNotFound@absl@@YA_NAEBVStatus@1@@Z
@@ -479,6 +510,7 @@
     ?IsUnavailable@absl@@YA_NAEBVStatus@1@@Z
     ?IsUnimplemented@absl@@YA_NAEBVStatus@1@@Z
     ?IsUnknown@absl@@YA_NAEBVStatus@1@@Z
+    ?IsValid@CordRepBtree@cord_internal@absl@@SA_NPEBV123@_N@Z
     ?IsValid@CordRepRing@cord_internal@absl@@QEBA_NAEAV?$basic_ostream@DU?$char_traits@D@__1@std@@@__1@std@@@Z
     ?Iterate@HashtablezSampler@container_internal@absl@@QEAA_JAEBV?$function@$$A6AXAEBUHashtablezInfo@container_internal@absl@@@Z@__1@std@@@Z
     ?LengthModToString@str_format_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@W4LengthMod@12@@Z
@@ -497,6 +529,8 @@
     ?LockWhen@Mutex@absl@@QEAAXAEBVCondition@2@@Z
     ?LockWhenWithDeadline@Mutex@absl@@QEAA_NAEBVCondition@2@VTime@2@@Z
     ?LockWhenWithTimeout@Mutex@absl@@QEAA_NAEBVCondition@2@VDuration@2@@Z
+    ?LowLevelHash@hash_internal@absl@@YA_KPEBX_K1QEB_K@Z
+    ?LowLevelHashImpl@MixingHashState@hash_internal@absl@@CA_KPEBE_K@Z
     ?MakeConcat@CordForest@absl@@AEAAPEAUCordRep@cord_internal@2@PEAU342@0@Z
     ?MakeTime@TimeZoneInfo@cctz@time_internal@absl@@UEBA?AUcivil_lookup@time_zone@234@AEBV?$civil_time@Usecond_tag@detail@cctz@time_internal@absl@@@detail@234@@Z
     ?MakeTime@TimeZoneLibC@cctz@time_internal@absl@@UEBA?AUcivil_lookup@time_zone@234@AEBV?$civil_time@Usecond_tag@detail@cctz@time_internal@absl@@@detail@234@@Z
@@ -505,6 +539,7 @@
     ?MaxFlatLength@CordTestAccess@strings_internal@absl@@SA_KXZ
     ?MaybeTrackCordImpl@CordzInfo@cord_internal@absl@@CAXAEAVInlineData@23@AEBV423@W4MethodIdentifier@CordzUpdateTracker@23@@Z
     ?MemoryUsageAux@Cord@absl@@CA_KPEBUCordRep@cord_internal@2@@Z
+    ?MergeTrees@CordRepBtree@cord_internal@absl@@CAPEAV123@PEAV123@0@Z
     ?MovedFromString@Status@absl@@CAPEBV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@XZ
     ?MultiplyBy@?$BigUnsigned@$03@strings_internal@absl@@AEAAXHPEBI@Z
     ?MultiplyBy@?$BigUnsigned@$03@strings_internal@absl@@QEAAXI@Z
@@ -523,7 +558,6 @@
     ?New@CordRepFlat@cord_internal@absl@@SAPEAU123@_K@Z
     ?New@CordRepRing@cord_internal@absl@@CAPEAV123@_K0@Z
     ?NewArena@LowLevelAlloc@base_internal@absl@@SAPEAUArena@123@H@Z
-    ?Next@CordRepRingReader@cord_internal@absl@@QEAA?AVstring_view@3@XZ
     ?Next@CordzInfo@cord_internal@absl@@QEBAPEAV123@AEBVCordzSnapshot@23@@Z
     ?NextTransition@TimeZone@absl@@QEBA_NVTime@2@PEAUCivilTransition@12@@Z
     ?NextTransition@TimeZoneInfo@cctz@time_internal@absl@@UEBA_NAEBV?$time_point@Vsystem_clock@chrono@__1@std@@V?$duration@_JV?$ratio@$00$00@__1@std@@@234@@chrono@__1@std@@PEAUcivil_transition@time_zone@234@@Z
@@ -562,9 +596,11 @@
     ?PrepareToModify@Status@absl@@AEAAXXZ
     ?Prepend@Cord@absl@@QEAAXAEBV12@@Z
     ?Prepend@Cord@absl@@QEAAXVstring_view@2@@Z
+    ?Prepend@CordRepBtree@cord_internal@absl@@SAPEAV123@PEAV123@Vstring_view@3@_K@Z
     ?Prepend@CordRepRing@cord_internal@absl@@SAPEAV123@PEAV123@PEAUCordRep@23@@Z
     ?Prepend@CordRepRing@cord_internal@absl@@SAPEAV123@PEAV123@Vstring_view@3@_K@Z
     ?PrependLeaf@CordRepRing@cord_internal@absl@@CAPEAV123@PEAV123@PEAUCordRep@23@_K2@Z
+    ?PrependSlow@CordRepBtree@cord_internal@absl@@CAPEAV123@PEAV123@PEAUCordRep@23@@Z
     ?PrependSlow@CordRepRing@cord_internal@absl@@CAPEAV123@PEAV123@PEAUCordRep@23@@Z
     ?PrependTree@InlineRep@Cord@absl@@QEAAXPEAUCordRep@cord_internal@3@W4MethodIdentifier@CordzUpdateTracker@53@@Z
     ?PrependTreeToInlined@InlineRep@Cord@absl@@QEAAXPEAUCordRep@cord_internal@3@W4MethodIdentifier@CordzUpdateTracker@53@@Z
@@ -579,6 +615,8 @@
     ?PutPaddedString@FormatSinkImpl@str_format_internal@absl@@QEAA_NVstring_view@3@HH_N@Z
     ?RawLog@raw_logging_internal@absl@@YAXW4LogSeverity@2@PEBDH1ZZ
     ?RawLoggingFullySupported@raw_logging_internal@absl@@YA_NXZ
+    ?Read@CordRepBtreeNavigator@cord_internal@absl@@QEAA?AUReadResult@123@_K0@Z
+    ?Read@CordRepBtreeReader@cord_internal@absl@@QEAA?AVstring_view@3@_K0AEAPEAUCordRep@23@@Z
     ?ReadDigits@?$BigUnsigned@$03@strings_internal@absl@@AEAAHPEBD0H@Z
     ?ReadDigits@?$BigUnsigned@$0FE@@strings_internal@absl@@AEAAHPEBD0H@Z
     ?ReadFloatMantissa@?$BigUnsigned@$03@strings_internal@absl@@QEAAHAEBUParsedFloat@23@H@Z
@@ -617,7 +655,7 @@
     ?SafeToDelete@CordzHandle@cord_internal@absl@@QEBA_NXZ
     ?SafeWriteToStderr@raw_logging_internal@absl@@YAXPEBD_K@Z
     ?SampleSlow@container_internal@absl@@YAPEAUHashtablezInfo@12@PEA_J@Z
-    ?Seek@CordRepRingReader@cord_internal@absl@@QEAA?AVstring_view@3@_K@Z
+    ?Seek@CordRepBtreeReader@cord_internal@absl@@QEAA?AVstring_view@3@_K@Z
     ?SetCapacityForTesting@CordRepRing@cord_internal@absl@@QEAAX_K@Z
     ?SetCurrentThreadIdentity@base_internal@absl@@YAXPEAUThreadIdentity@12@P6AXPEAX@Z@Z
     ?SetDisposeCallback@HashtablezSampler@container_internal@absl@@QEAAP6AXAEBUHashtablezInfo@23@@ZP6AX0@Z@Z
@@ -633,7 +671,7 @@
     ?SetToZero@?$BigUnsigned@$0FE@@strings_internal@absl@@QEAAXXZ
     ?ShiftLeft@?$BigUnsigned@$03@strings_internal@absl@@QEAAXH@Z
     ?ShiftLeft@?$BigUnsigned@$0FE@@strings_internal@absl@@QEAAXH@Z
-    ?ShouldInsertBackwards@container_internal@absl@@YA_N_KPEAC@Z
+    ?ShouldInsertBackwards@container_internal@absl@@YA_N_KPEBW4ctrl_t@12@@Z
     ?Signal@CondVar@absl@@QEAAXXZ
     ?SignalAll@CondVar@absl@@QEAAXXZ
     ?SimpleAtob@absl@@YA_NVstring_view@1@PEA_N@Z
@@ -643,6 +681,7 @@
     ?SizeofCordRepConcat@CordTestAccess@strings_internal@absl@@SA_KXZ
     ?SizeofCordRepExternal@CordTestAccess@strings_internal@absl@@SA_KXZ
     ?SizeofCordRepSubstring@CordTestAccess@strings_internal@absl@@SA_KXZ
+    ?Skip@CordRepBtreeNavigator@cord_internal@absl@@QEAA?AUPosition@123@_K@Z
     ?SlowLock@SpinLock@base_internal@absl@@AEAAXXZ
     ?SlowUnlock@SpinLock@base_internal@absl@@AEAAXI@Z
     ?SnprintF@str_format_internal@absl@@YAHPEAD_KVUntypedFormatSpecImpl@12@V?$Span@$$CBVFormatArgImpl@str_format_internal@absl@@@2@@Z
@@ -663,6 +702,7 @@
     ?StrReplaceAll@absl@@YAHV?$initializer_list@U?$pair@Vstring_view@absl@@V12@@__1@std@@@std@@PEAV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@3@@Z
     ?SubLength@CordRepRing@cord_internal@absl@@AEAAXI_K@Z
     ?SubRing@CordRepRing@cord_internal@absl@@SAPEAV123@PEAV123@_K11@Z
+    ?SubTree@CordRepBtree@cord_internal@absl@@QEAAPEAUCordRep@23@_K0@Z
     ?Subcord@Cord@absl@@QEBA?AV12@_K0@Z
     ?SubstituteAndAppendArray@substitute_internal@absl@@YAXPEAV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@Vstring_view@2@PEBV62@_K@Z
     ?Summarize@str_format_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@VUntypedFormatSpecImpl@12@V?$Span@$$CBVFormatArgImpl@str_format_internal@absl@@@2@@Z
@@ -773,8 +813,6 @@
     ?WebSafeBase64Unescape@absl@@YA_NVstring_view@1@PEAV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@Z
     ?Write@BufferRawSink@str_format_internal@absl@@QEAAXVstring_view@3@@Z
     ?Write@FILERawSink@str_format_internal@absl@@QEAAXVstring_view@3@@Z
-    ?Wyhash@hash_internal@absl@@YA_KPEBX_K1QEB_K@Z
-    ?WyhashImpl@MixingHashState@hash_internal@absl@@CA_KPEBE_K@Z
     ?__add_back_capacity@?$deque@PEBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@@__1@std@@AEAAXXZ
     ?__append@?$vector@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@__1@std@@@__1@std@@AEAAX_K@Z
     ?__append@?$vector@UTransitionType@cctz@time_internal@absl@@V?$allocator@UTransitionType@cctz@time_internal@absl@@@__1@std@@@__1@std@@AEAAX_K@Z
@@ -787,9 +825,11 @@
     ?__swap_out_circular_buffer@?$vector@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@__1@std@@@__1@std@@AEAAPEAUTransition@cctz@time_internal@absl@@AEAU?$__split_buffer@UTransition@cctz@time_internal@absl@@AEAV?$allocator@UTransition@cctz@time_internal@absl@@@__1@std@@@23@PEAU4567@@Z
     ?__swap_out_circular_buffer@?$vector@UTransitionType@cctz@time_internal@absl@@V?$allocator@UTransitionType@cctz@time_internal@absl@@@__1@std@@@__1@std@@AEAAPEAUTransitionType@cctz@time_internal@absl@@AEAU?$__split_buffer@UTransitionType@cctz@time_internal@absl@@AEAV?$allocator@UTransitionType@cctz@time_internal@absl@@@__1@std@@@23@PEAU4567@@Z
     ?__vallocate@?$vector@VFormatArgImpl@str_format_internal@absl@@V?$allocator@VFormatArgImpl@str_format_internal@absl@@@__1@std@@@__1@std@@AEAAX_K@Z
+    ?chunk_begin@Cord@absl@@QEBA?AVChunkIterator@12@XZ
     ?clear@?$__hash_table@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@V?$__unordered_map_hasher@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@23@$00@23@V?$__unordered_map_equal@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@23@$00@23@V?$allocator@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@@23@@__1@std@@QEAAXXZ
     ?code@Status@absl@@QEBA?AW4StatusCode@2@XZ
     ?cord_btree_enabled@cord_internal@absl@@3U?$atomic@_N@__1@std@@A
+    ?cord_btree_exhaustive_validation@cord_internal@absl@@3U?$atomic@_N@__1@std@@A
     ?cord_ring_buffer_enabled@cord_internal@absl@@3U?$atomic@_N@__1@std@@A
     ?day_difference@impl@detail@cctz@time_internal@absl@@YA_J_JCC0CC@Z
     ?description@time_zone@cctz@time_internal@absl@@QEBA?AV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@XZ
diff --git a/third_party/abseil-cpp/symbols_x64_dbg.def b/third_party/abseil-cpp/symbols_x64_dbg.def
index 32f5c4c..9113b31 100644
--- a/third_party/abseil-cpp/symbols_x64_dbg.def
+++ b/third_party/abseil-cpp/symbols_x64_dbg.def
@@ -1,6 +1,7 @@
 EXPORTS
     ??$?0$$CBD$0A@@VoidPtr@str_format_internal@absl@@QEAA@PEBD@Z
     ??$?0$$CBU?$atomic@_N@__1@std@@@Condition@absl@@QEAA@P6A_NPEBU?$atomic@_N@__1@std@@@Z0@Z
+    ??$?0$$CBUCordRep@cord_internal@absl@@@Hex@absl@@QEAA@PEBUCordRep@cord_internal@1@W4PadSpec@1@@Z
     ??$?0$$CBVFormatArgImpl@str_format_internal@absl@@$$CBV012@@?$Span@$$CBVFormatArgImpl@str_format_internal@absl@@@absl@@QEAA@V?$initializer_list@VFormatArgImpl@str_format_internal@absl@@@std@@@Z
     ??$?0$$T@?$Storage@PEAH$00$0A@@internal_compressed_tuple@container_internal@absl@@QEAA@Uin_place_t@3@$$QEA$$T@Z
     ??$?0$$T@?$Storage@PEAPEAUCordRep@cord_internal@absl@@$00$0A@@internal_compressed_tuple@container_internal@absl@@QEAA@Uin_place_t@3@$$QEA$$T@Z
@@ -220,7 +221,19 @@
     ??$?RW4LogSeverity@absl@@AEBQEBDHAEAPEBD@?$AtomicHook@P6AXW4LogSeverity@absl@@PEBDHAEBV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@Z@base_internal@absl@@QEBAX$$QEAW4LogSeverity@2@AEBQEBD$$QEAHAEAPEBD@Z
     ??$?RW4LogSeverity@absl@@AEBQEBDHAEAV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@?$AtomicHook@P6AXW4LogSeverity@absl@@PEBDHAEBV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@Z@base_internal@absl@@QEBAX$$QEAW4LogSeverity@2@AEBQEBD$$QEAHAEAV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@Z
     ??$?RW4LogSeverity@absl@@AEBQEBDHV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@?$AtomicHook@P6AXW4LogSeverity@absl@@PEBDHAEBV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@Z@base_internal@absl@@QEBAX$$QEAW4LogSeverity@2@AEBQEBD$$QEAH$$QEAV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@Z
-    ??$?XH@Duration@absl@@QEAAAEAV01@H@Z
+    ??$?XH$0A@@Duration@absl@@QEAAAEAV01@H@Z
+    ??$Add@$00@CordRepBtree@cord_internal@absl@@AEAAXPEAUCordRep@12@@Z
+    ??$Add@$00@CordRepBtree@cord_internal@absl@@AEAAXV?$Span@QEAUCordRep@cord_internal@absl@@@2@@Z
+    ??$Add@$0A@@CordRepBtree@cord_internal@absl@@AEAAXPEAUCordRep@12@@Z
+    ??$Add@$0A@@CordRepBtree@cord_internal@absl@@AEAAXV?$Span@QEAUCordRep@cord_internal@absl@@@2@@Z
+    ??$AddCordRep@$00@CordRepBtree@cord_internal@absl@@CAPEAV012@PEAV012@PEAUCordRep@12@@Z
+    ??$AddCordRep@$0A@@CordRepBtree@cord_internal@absl@@CAPEAV012@PEAV012@PEAUCordRep@12@@Z
+    ??$AddData@$00@CordRepBtree@cord_internal@absl@@AEAA?AVstring_view@2@V32@_K@Z
+    ??$AddData@$00@CordRepBtree@cord_internal@absl@@CAPEAV012@PEAV012@Vstring_view@2@_K@Z
+    ??$AddData@$0A@@CordRepBtree@cord_internal@absl@@AEAA?AVstring_view@2@V32@_K@Z
+    ??$AddData@$0A@@CordRepBtree@cord_internal@absl@@CAPEAV012@PEAV012@Vstring_view@2@_K@Z
+    ??$AddEdge@$00@CordRepBtree@cord_internal@absl@@QEAA?AUOpResult@012@_NPEAUCordRep@12@_K@Z
+    ??$AddEdge@$0A@@CordRepBtree@cord_internal@absl@@QEAA?AUOpResult@012@_NPEAUCordRep@12@_K@Z
     ??$AddRing@$00@CordRepRing@cord_internal@absl@@CAPEAV012@PEAV012@0_K1@Z
     ??$AddRing@$0A@@CordRepRing@cord_internal@absl@@CAPEAV012@PEAV012@0_K1@Z
     ??$Append@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@$0A@@Cord@absl@@QEAAX$$QEAV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@Z
@@ -247,25 +260,25 @@
     ??$ArgumentToConv@_J@str_format_internal@absl@@YA?AW4FormatConversionCharSet@1@XZ
     ??$ArgumentToConv@_K@str_format_internal@absl@@YA?AW4FormatConversionCharSet@1@XZ
     ??$ArgumentToConv@_N@str_format_internal@absl@@YA?AW4FormatConversionCharSet@1@XZ
-    ??$AssignElements@PEAUPayload@status_internal@absl@@V?$IteratorValueAdapter@V?$allocator@UPayload@status_internal@absl@@@__1@std@@V?$move_iterator@PEAUPayload@status_internal@absl@@@23@@inlined_vector_internal@3@_K@inlined_vector_internal@absl@@YAXPEAUPayload@status_internal@1@PEAV?$IteratorValueAdapter@V?$allocator@UPayload@status_internal@absl@@@__1@std@@V?$move_iterator@PEAUPayload@status_internal@absl@@@23@@01@_K@Z
+    ??$AssignElements@V?$allocator@UPayload@status_internal@absl@@@__1@std@@V?$IteratorValueAdapter@V?$allocator@UPayload@status_internal@absl@@@__1@std@@V?$move_iterator@PEAUPayload@status_internal@absl@@@23@@inlined_vector_internal@absl@@@inlined_vector_internal@absl@@YAXPEAUPayload@status_internal@1@AEAV?$IteratorValueAdapter@V?$allocator@UPayload@status_internal@absl@@@__1@std@@V?$move_iterator@PEAUPayload@status_internal@absl@@@23@@01@_K@Z
     ??$Base64EscapeInternal@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@strings_internal@absl@@YAXPEBE_KPEAV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@_NPEBD@Z
     ??$CallOnceImpl@A6AXXZ$$V@base_internal@absl@@YAXPEAU?$atomic@I@__1@std@@W4SchedulingMode@01@A6AXXZ@Z
     ??$CastAndCallFunction@$$CBU?$atomic@_N@__1@std@@@Condition@absl@@CA_NPEBV01@@Z
     ??$CastAndCallFunction@USynchEvent@absl@@@Condition@absl@@CA_NPEBV01@@Z
     ??$Compare@$0FE@$0FE@@strings_internal@absl@@YAHAEBV?$BigUnsigned@$0FE@@01@0@Z
-    ??$ConstructElements@V?$allocator@H@__1@std@@PEAHV?$IteratorValueAdapter@V?$allocator@H@__1@std@@V?$move_iterator@PEAH@23@@inlined_vector_internal@absl@@_K@inlined_vector_internal@absl@@YAXPEAV?$allocator@H@__1@std@@PEAHPEAV?$IteratorValueAdapter@V?$allocator@H@__1@std@@V?$move_iterator@PEAH@23@@01@_K@Z
-    ??$ConstructElements@V?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@PEAPEAUCordRep@cord_internal@absl@@V?$CopyValueAdapter@V?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@@inlined_vector_internal@6@_K@inlined_vector_internal@absl@@YAXPEAV?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@PEAPEAUCordRep@cord_internal@1@PEAV?$CopyValueAdapter@V?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@@01@_K@Z
-    ??$ConstructElements@V?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@PEAPEAUCordRep@cord_internal@absl@@V?$IteratorValueAdapter@V?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@V?$move_iterator@PEAPEAUCordRep@cord_internal@absl@@@23@@inlined_vector_internal@6@_K@inlined_vector_internal@absl@@YAXPEAV?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@PEAPEAUCordRep@cord_internal@1@PEAV?$IteratorValueAdapter@V?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@V?$move_iterator@PEAPEAUCordRep@cord_internal@absl@@@23@@01@_K@Z
-    ??$ConstructElements@V?$allocator@PEBUCordRep@cord_internal@absl@@@__1@std@@PEAPEBUCordRep@cord_internal@absl@@V?$IteratorValueAdapter@V?$allocator@PEBUCordRep@cord_internal@absl@@@__1@std@@V?$move_iterator@PEAPEBUCordRep@cord_internal@absl@@@23@@inlined_vector_internal@6@_K@inlined_vector_internal@absl@@YAXPEAV?$allocator@PEBUCordRep@cord_internal@absl@@@__1@std@@PEAPEBUCordRep@cord_internal@1@PEAV?$IteratorValueAdapter@V?$allocator@PEBUCordRep@cord_internal@absl@@@__1@std@@V?$move_iterator@PEAPEBUCordRep@cord_internal@absl@@@23@@01@_K@Z
-    ??$ConstructElements@V?$allocator@UPayload@status_internal@absl@@@__1@std@@PEAUPayload@status_internal@absl@@V?$IteratorValueAdapter@V?$allocator@UPayload@status_internal@absl@@@__1@std@@PEBUPayload@status_internal@absl@@@inlined_vector_internal@6@_K@inlined_vector_internal@absl@@YAXPEAV?$allocator@UPayload@status_internal@absl@@@__1@std@@PEAUPayload@status_internal@1@PEAV?$IteratorValueAdapter@V?$allocator@UPayload@status_internal@absl@@@__1@std@@PEBUPayload@status_internal@absl@@@01@_K@Z
-    ??$ConstructElements@V?$allocator@UPayload@status_internal@absl@@@__1@std@@PEAUPayload@status_internal@absl@@V?$IteratorValueAdapter@V?$allocator@UPayload@status_internal@absl@@@__1@std@@V?$move_iterator@PEAUPayload@status_internal@absl@@@23@@inlined_vector_internal@6@_K@inlined_vector_internal@absl@@YAXPEAV?$allocator@UPayload@status_internal@absl@@@__1@std@@PEAUPayload@status_internal@1@PEAV?$IteratorValueAdapter@V?$allocator@UPayload@status_internal@absl@@@__1@std@@V?$move_iterator@PEAUPayload@status_internal@absl@@@23@@01@_K@Z
-    ??$ConstructElements@V?$allocator@USubRange@absl@@@__1@std@@PEAUSubRange@absl@@V?$IteratorValueAdapter@V?$allocator@USubRange@absl@@@__1@std@@V?$move_iterator@PEAUSubRange@absl@@@23@@inlined_vector_internal@5@_K@inlined_vector_internal@absl@@YAXPEAV?$allocator@USubRange@absl@@@__1@std@@PEAUSubRange@1@PEAV?$IteratorValueAdapter@V?$allocator@USubRange@absl@@@__1@std@@V?$move_iterator@PEAUSubRange@absl@@@23@@01@_K@Z
+    ??$ConstructElements@V?$allocator@H@__1@std@@V?$IteratorValueAdapter@V?$allocator@H@__1@std@@V?$move_iterator@PEAH@23@@inlined_vector_internal@absl@@@inlined_vector_internal@absl@@YAXAEAV?$allocator@H@__1@std@@PEAHAEAV?$IteratorValueAdapter@V?$allocator@H@__1@std@@V?$move_iterator@PEAH@23@@01@_K@Z
+    ??$ConstructElements@V?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@V?$CopyValueAdapter@V?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@@inlined_vector_internal@absl@@@inlined_vector_internal@absl@@YAXAEAV?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@PEAPEAUCordRep@cord_internal@1@AEAV?$CopyValueAdapter@V?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@@01@_K@Z
+    ??$ConstructElements@V?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@V?$IteratorValueAdapter@V?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@V?$move_iterator@PEAPEAUCordRep@cord_internal@absl@@@23@@inlined_vector_internal@absl@@@inlined_vector_internal@absl@@YAXAEAV?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@PEAPEAUCordRep@cord_internal@1@AEAV?$IteratorValueAdapter@V?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@V?$move_iterator@PEAPEAUCordRep@cord_internal@absl@@@23@@01@_K@Z
+    ??$ConstructElements@V?$allocator@PEBUCordRep@cord_internal@absl@@@__1@std@@V?$IteratorValueAdapter@V?$allocator@PEBUCordRep@cord_internal@absl@@@__1@std@@V?$move_iterator@PEAPEBUCordRep@cord_internal@absl@@@23@@inlined_vector_internal@absl@@@inlined_vector_internal@absl@@YAXAEAV?$allocator@PEBUCordRep@cord_internal@absl@@@__1@std@@PEAPEBUCordRep@cord_internal@1@AEAV?$IteratorValueAdapter@V?$allocator@PEBUCordRep@cord_internal@absl@@@__1@std@@V?$move_iterator@PEAPEBUCordRep@cord_internal@absl@@@23@@01@_K@Z
+    ??$ConstructElements@V?$allocator@UPayload@status_internal@absl@@@__1@std@@V?$IteratorValueAdapter@V?$allocator@UPayload@status_internal@absl@@@__1@std@@PEBUPayload@status_internal@absl@@@inlined_vector_internal@absl@@@inlined_vector_internal@absl@@YAXAEAV?$allocator@UPayload@status_internal@absl@@@__1@std@@PEAUPayload@status_internal@1@AEAV?$IteratorValueAdapter@V?$allocator@UPayload@status_internal@absl@@@__1@std@@PEBUPayload@status_internal@absl@@@01@_K@Z
+    ??$ConstructElements@V?$allocator@UPayload@status_internal@absl@@@__1@std@@V?$IteratorValueAdapter@V?$allocator@UPayload@status_internal@absl@@@__1@std@@V?$move_iterator@PEAUPayload@status_internal@absl@@@23@@inlined_vector_internal@absl@@@inlined_vector_internal@absl@@YAXAEAV?$allocator@UPayload@status_internal@absl@@@__1@std@@PEAUPayload@status_internal@1@AEAV?$IteratorValueAdapter@V?$allocator@UPayload@status_internal@absl@@@__1@std@@V?$move_iterator@PEAUPayload@status_internal@absl@@@23@@01@_K@Z
+    ??$ConstructElements@V?$allocator@USubRange@absl@@@__1@std@@V?$IteratorValueAdapter@V?$allocator@USubRange@absl@@@__1@std@@V?$move_iterator@PEAUSubRange@absl@@@23@@inlined_vector_internal@absl@@@inlined_vector_internal@absl@@YAXAEAV?$allocator@USubRange@absl@@@__1@std@@PEAUSubRange@1@AEAV?$IteratorValueAdapter@V?$allocator@USubRange@absl@@@__1@std@@V?$move_iterator@PEAUSubRange@absl@@@23@@01@_K@Z
     ??$Convert@VFormatArgImpl@str_format_internal@absl@@@FormatArgImplFriend@str_format_internal@absl@@SA_NVFormatArgImpl@12@VFormatConversionSpecImpl@12@PEAVFormatSinkImpl@12@@Z
-    ??$DestroyElements@V?$allocator@H@__1@std@@PEAH_K@inlined_vector_internal@absl@@YAXPEAV?$allocator@H@__1@std@@PEAH_K@Z
-    ??$DestroyElements@V?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@PEAPEAUCordRep@cord_internal@absl@@_K@inlined_vector_internal@absl@@YAXPEAV?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@PEAPEAUCordRep@cord_internal@1@_K@Z
-    ??$DestroyElements@V?$allocator@PEBUCordRep@cord_internal@absl@@@__1@std@@PEAPEBUCordRep@cord_internal@absl@@_K@inlined_vector_internal@absl@@YAXPEAV?$allocator@PEBUCordRep@cord_internal@absl@@@__1@std@@PEAPEBUCordRep@cord_internal@1@_K@Z
-    ??$DestroyElements@V?$allocator@UPayload@status_internal@absl@@@__1@std@@PEAUPayload@status_internal@absl@@_K@inlined_vector_internal@absl@@YAXPEAV?$allocator@UPayload@status_internal@absl@@@__1@std@@PEAUPayload@status_internal@1@_K@Z
-    ??$DestroyElements@V?$allocator@USubRange@absl@@@__1@std@@PEAUSubRange@absl@@_K@inlined_vector_internal@absl@@YAXPEAV?$allocator@USubRange@absl@@@__1@std@@PEAUSubRange@1@_K@Z
+    ??$DestroyElements@V?$allocator@H@__1@std@@@inlined_vector_internal@absl@@YAXAEAV?$allocator@H@__1@std@@PEAH_K@Z
+    ??$DestroyElements@V?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@@inlined_vector_internal@absl@@YAXAEAV?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@PEAPEAUCordRep@cord_internal@1@_K@Z
+    ??$DestroyElements@V?$allocator@PEBUCordRep@cord_internal@absl@@@__1@std@@@inlined_vector_internal@absl@@YAXAEAV?$allocator@PEBUCordRep@cord_internal@absl@@@__1@std@@PEAPEBUCordRep@cord_internal@1@_K@Z
+    ??$DestroyElements@V?$allocator@UPayload@status_internal@absl@@@__1@std@@@inlined_vector_internal@absl@@YAXAEAV?$allocator@UPayload@status_internal@absl@@@__1@std@@PEAUPayload@status_internal@1@_K@Z
+    ??$DestroyElements@V?$allocator@USubRange@absl@@@__1@std@@@inlined_vector_internal@absl@@YAXAEAV?$allocator@USubRange@absl@@@__1@std@@PEAUSubRange@1@_K@Z
     ??$Dispatch@C@FormatArgImpl@str_format_internal@absl@@CA_NTData@012@VFormatConversionSpecImpl@12@PEAX@Z
     ??$Dispatch@D@FormatArgImpl@str_format_internal@absl@@CA_NTData@012@VFormatConversionSpecImpl@12@PEAX@Z
     ??$Dispatch@E@FormatArgImpl@str_format_internal@absl@@CA_NTData@012@VFormatConversionSpecImpl@12@PEAX@Z
@@ -349,6 +362,8 @@
     ??$HidePtr@$$CBX@base_internal@absl@@YA_KPEBX@Z
     ??$HidePtr@U?$atomic@_J@__1@std@@@base_internal@absl@@YA_KPEAU?$atomic@_J@__1@std@@@Z
     ??$HidePtr@X@base_internal@absl@@YA_KPEAX@Z
+    ??$Hours@H$0A@@absl@@YA?AVDuration@0@H@Z
+    ??$Init@$0A@@CordRepBtreeNavigator@cord_internal@absl@@AEAAPEAUCordRep@12@PEAVCordRepBtree@12@@Z
     ??$Init@H@FormatArgImpl@str_format_internal@absl@@AEAAXAEBH@Z
     ??$Initialize@V?$CopyValueAdapter@V?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@@inlined_vector_internal@absl@@@?$Storage@PEAUCordRep@cord_internal@absl@@$0CP@V?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@@inlined_vector_internal@absl@@QEAAXV?$CopyValueAdapter@V?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@@12@_K@Z
     ??$Invoke@A6AXXZ$$V@Callable@base_internal@absl@@SAXA6AXXZ@Z
@@ -364,7 +379,19 @@
     ??$MakeSpan@$SI$0CIA@@absl@@YA?AV?$Span@I@0@AEAY0CIA@I@Z
     ??$MakeSpan@$SI$0IA@@absl@@YA?AV?$Span@I@0@AEAY0IA@I@Z
     ??$MakeSpan@$SVFormatArgImpl@str_format_internal@absl@@@absl@@YA?AV?$Span@VFormatArgImpl@str_format_internal@absl@@@0@PEAVFormatArgImpl@str_format_internal@0@_K@Z
+    ??$Merge@$00@CordRepBtree@cord_internal@absl@@CAPEAV012@PEAV012@0@Z
+    ??$Merge@$0A@@CordRepBtree@cord_internal@absl@@CAPEAV012@PEAV012@0@Z
+    ??$Microseconds@H$0A@@absl@@YA?AVDuration@0@H@Z
+    ??$Microseconds@J$0A@@absl@@YA?AVDuration@0@J@Z
+    ??$Milliseconds@H$0A@@absl@@YA?AVDuration@0@H@Z
+    ??$Milliseconds@K$0A@@absl@@YA?AVDuration@0@K@Z
     ??$Milliseconds@N$0A@@absl@@YA?AVDuration@0@N@Z
+    ??$Minutes@H$0A@@absl@@YA?AVDuration@0@H@Z
+    ??$Nanoseconds@H$0A@@absl@@YA?AVDuration@0@H@Z
+    ??$Nanoseconds@J$0A@@absl@@YA?AVDuration@0@J@Z
+    ??$Nanoseconds@_J$0A@@absl@@YA?AVDuration@0@_J@Z
+    ??$NewLeaf@$00@CordRepBtree@cord_internal@absl@@CAPEAV012@Vstring_view@2@_K@Z
+    ??$NewLeaf@$0A@@CordRepBtree@cord_internal@absl@@CAPEAV012@Vstring_view@2@_K@Z
     ??$Offset@$00$0A@@?$LayoutImpl@V?$tuple@_KPEAUCordRep@cord_internal@absl@@I@__1@std@@U?$integer_sequence@_K$0A@$00$01@absl@@U45@@internal_layout@container_internal@absl@@QEBA_KXZ
     ??$Offset@$00$0A@@?$LayoutImpl@V?$tuple@_KPEAUCordRep@cord_internal@absl@@I@__1@std@@U?$integer_sequence@_K$0A@$00@absl@@U?$integer_sequence@_K$0A@$00$01@5@@internal_layout@container_internal@absl@@QEBA_KXZ
     ??$Offset@$00$0A@@?$LayoutImpl@V?$tuple@_KPEAUCordRep@cord_internal@absl@@I@__1@std@@U?$integer_sequence@_K$0A@@absl@@U?$integer_sequence@_K$0A@$00@5@@internal_layout@container_internal@absl@@QEBA_KXZ
@@ -394,6 +421,11 @@
     ??$STLStringReserveAmortized@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@strings_internal@absl@@YAXPEAV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@_K@Z
     ??$STLStringResizeUninitialized@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@X@strings_internal@absl@@YAXPEAV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@_K@Z
     ??$STLStringResizeUninitializedAmortized@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@strings_internal@absl@@YAXPEAV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@_K@Z
+    ??$Seconds@H$0A@@absl@@YA?AVDuration@0@H@Z
+    ??$Seconds@J$0A@@absl@@YA?AVDuration@0@J@Z
+    ??$Seconds@_J$0A@@absl@@YA?AVDuration@0@_J@Z
+    ??$SetEdge@$00@CordRepBtree@cord_internal@absl@@QEAA?AUOpResult@012@_NPEAUCordRep@12@_K@Z
+    ??$SetEdge@$0A@@CordRepBtree@cord_internal@absl@@QEAA?AUOpResult@012@_NPEAUCordRep@12@_K@Z
     ??$SharedCompareImpl@VCord@absl@@@absl@@YAHAEBVCord@0@0@Z
     ??$SharedCompareImpl@Vstring_view@absl@@@absl@@YAHAEBVCord@0@AEBVstring_view@0@@Z
     ??$StrAppend@$$V@absl@@YAXPEAV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@AEBVAlphaNum@0@1111@Z
@@ -439,6 +471,7 @@
     ??$ToIntVal@_J@FormatArgImpl@str_format_internal@absl@@CAHAEB_J@Z
     ??$ToIntVal@_K@FormatArgImpl@str_format_internal@absl@@CAHAEB_K@Z
     ??$ToIntVal@_N@FormatArgImpl@str_format_internal@absl@@CAHAEB_N@Z
+    ??$TrailingZeros@I@container_internal@absl@@YAII@Z
     ??$UnhidePtr@X@base_internal@absl@@YAPEAX_K@Z
     ??$__advance@PEBUTransition@cctz@time_internal@absl@@@__1@std@@YAXAEAPEBUTransition@cctz@time_internal@absl@@_JUrandom_access_iterator_tag@01@@Z
     ??$__advance@PEBVFormatArgImpl@str_format_internal@absl@@@__1@std@@YAXAEAPEBVFormatArgImpl@str_format_internal@absl@@_JUrandom_access_iterator_tag@01@@Z
@@ -523,16 +556,11 @@
     ??$__upper_bound@AEAUByUnixTime@Transition@cctz@time_internal@absl@@PEBU2345@U2345@@__1@std@@YAPEBUTransition@cctz@time_internal@absl@@PEBU2345@0AEBU2345@AEAUByUnixTime@2345@@Z
     ??$addressof@$$CBU?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@@__1@std@@YAPEBU?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@01@AEBU201@@Z
     ??$addressof@$$CBU?$pair@$$CBV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@@__1@std@@YAPEBU?$pair@$$CBV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@01@AEBU201@@Z
-    ??$addressof@$$CBV?$allocator@UPayload@status_internal@absl@@@__1@std@@@__1@std@@YAPEBV?$allocator@UPayload@status_internal@absl@@@01@AEBV201@@Z
     ??$addressof@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@YAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@AEAPEBV23456@@Z
     ??$addressof@QEAUCordRep@cord_internal@absl@@@__1@std@@YAPEBQEAUCordRep@cord_internal@absl@@AEBQEAU234@@Z
     ??$addressof@U?$__hash_node_base@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@PEAX@__1@std@@@__1@std@@@__1@std@@YAPEAU?$__hash_node_base@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@PEAX@__1@std@@@01@AEAU201@@Z
     ??$addressof@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@@__1@std@@YAPEAU?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@01@AEAU201@@Z
     ??$addressof@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@@__1@std@@YAPEAU?$pair@$$CBV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@01@AEAU201@@Z
-    ??$addressof@V?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@@__1@std@@YAPEAV?$allocator@PEAUCordRep@cord_internal@absl@@@01@AEAV201@@Z
-    ??$addressof@V?$allocator@PEBUCordRep@cord_internal@absl@@@__1@std@@@__1@std@@YAPEAV?$allocator@PEBUCordRep@cord_internal@absl@@@01@AEAV201@@Z
-    ??$addressof@V?$allocator@UPayload@status_internal@absl@@@__1@std@@@__1@std@@YAPEAV?$allocator@UPayload@status_internal@absl@@@01@AEAV201@@Z
-    ??$addressof@V?$allocator@USubRange@absl@@@__1@std@@@__1@std@@YAPEAV?$allocator@USubRange@absl@@@01@AEAV201@@Z
     ??$advance@PEBUTransition@cctz@time_internal@absl@@_J@__1@std@@YAXAEAPEBUTransition@cctz@time_internal@absl@@_J@Z
     ??$advance@PEBVFormatArgImpl@str_format_internal@absl@@_K@__1@std@@YAXAEAPEBVFormatArgImpl@str_format_internal@absl@@_K@Z
     ??$assign@PEBVFormatArgImpl@str_format_internal@absl@@@?$vector@VFormatArgImpl@str_format_internal@absl@@V?$allocator@VFormatArgImpl@str_format_internal@absl@@@__1@std@@@__1@std@@QEAAXPEBVFormatArgImpl@str_format_internal@absl@@0@Z
@@ -541,24 +569,22 @@
     ??$bit_cast@N_K$0A@@absl@@YANAEB_K@Z
     ??$bit_cast@_J_K$0A@@absl@@YA_JAEB_K@Z
     ??$bit_cast@_K_J$0A@@absl@@YA_KAEB_J@Z
+    ??$bit_width@I@absl@@YAII@Z
     ??$bit_width@_K@absl@@YA_K_K@Z
-    ??$construct@HAEBH@?$allocator_traits@V?$allocator@H@__1@std@@@absl@@SAXAEAV?$allocator@H@__1@std@@PEAHAEBH@Z
-    ??$construct@HH@?$allocator_traits@V?$allocator@H@__1@std@@@absl@@SAXAEAV?$allocator@H@__1@std@@PEAH$$QEAH@Z
     ??$construct@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@AEBQEAPEBV12345@@?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@QEAAXPEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@AEBQEAPEBV34567@@Z
     ??$construct@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@AEBQEAPEBV12345@X@?$allocator_traits@V?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@@__1@std@@SAXAEAV?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@12@PEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@AEBQEAPEBV45678@@Z
     ??$construct@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@PEAPEBV12345@@?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@QEAAXPEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@$$QEAPEAPEBV34567@@Z
     ??$construct@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@PEAPEBV12345@X@?$allocator_traits@V?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@@__1@std@@SAXAEAV?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@12@PEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@$$QEAPEAPEBV45678@@Z
     ??$construct@PEAUCordRep@cord_internal@absl@@AEBQEAU123@@?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@QEAAXPEAPEAUCordRep@cord_internal@absl@@AEBQEAU345@@Z
-    ??$construct@PEAUCordRep@cord_internal@absl@@AEBQEAU123@@?$allocator_traits@V?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@@absl@@SAXAEAV?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@PEAPEAUCordRep@cord_internal@1@AEBQEAU561@@Z
     ??$construct@PEAUCordRep@cord_internal@absl@@AEBQEAU123@X@?$allocator_traits@V?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@@__1@std@@SAXAEAV?$allocator@PEAUCordRep@cord_internal@absl@@@12@PEAPEAUCordRep@cord_internal@absl@@AEBQEAU456@@Z
     ??$construct@PEAUCordRep@cord_internal@absl@@PEAU123@@?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@QEAAXPEAPEAUCordRep@cord_internal@absl@@$$QEAPEAU345@@Z
-    ??$construct@PEAUCordRep@cord_internal@absl@@PEAU123@@?$allocator_traits@V?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@@absl@@SAXAEAV?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@PEAPEAUCordRep@cord_internal@1@$$QEAPEAU561@@Z
+    ??$construct@PEAUCordRep@cord_internal@absl@@PEAU123@X@?$allocator_traits@V?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@@__1@std@@SAXAEAV?$allocator@PEAUCordRep@cord_internal@absl@@@12@PEAPEAUCordRep@cord_internal@absl@@$$QEAPEAU456@@Z
     ??$construct@PEAVCordzHandle@cord_internal@absl@@AEBQEAV123@@?$allocator@PEAVCordzHandle@cord_internal@absl@@@__1@std@@QEAAXPEAPEAVCordzHandle@cord_internal@absl@@AEBQEAV345@@Z
     ??$construct@PEAVCordzHandle@cord_internal@absl@@AEBQEAV123@X@?$allocator_traits@V?$allocator@PEAVCordzHandle@cord_internal@absl@@@__1@std@@@__1@std@@SAXAEAV?$allocator@PEAVCordzHandle@cord_internal@absl@@@12@PEAPEAVCordzHandle@cord_internal@absl@@AEBQEAV456@@Z
     ??$construct@PEBUCordRep@cord_internal@absl@@AEBQEBU123@@?$allocator@PEBUCordRep@cord_internal@absl@@@__1@std@@QEAAXPEAPEBUCordRep@cord_internal@absl@@AEBQEBU345@@Z
-    ??$construct@PEBUCordRep@cord_internal@absl@@AEBQEBU123@@?$allocator_traits@V?$allocator@PEBUCordRep@cord_internal@absl@@@__1@std@@@absl@@SAXAEAV?$allocator@PEBUCordRep@cord_internal@absl@@@__1@std@@PEAPEBUCordRep@cord_internal@1@AEBQEBU561@@Z
+    ??$construct@PEBUCordRep@cord_internal@absl@@AEBQEBU123@X@?$allocator_traits@V?$allocator@PEBUCordRep@cord_internal@absl@@@__1@std@@@__1@std@@SAXAEAV?$allocator@PEBUCordRep@cord_internal@absl@@@12@PEAPEBUCordRep@cord_internal@absl@@AEBQEBU456@@Z
     ??$construct@PEBUCordRep@cord_internal@absl@@PEBU123@@?$allocator@PEBUCordRep@cord_internal@absl@@@__1@std@@QEAAXPEAPEBUCordRep@cord_internal@absl@@$$QEAPEBU345@@Z
-    ??$construct@PEBUCordRep@cord_internal@absl@@PEBU123@@?$allocator_traits@V?$allocator@PEBUCordRep@cord_internal@absl@@@__1@std@@@absl@@SAXAEAV?$allocator@PEBUCordRep@cord_internal@absl@@@__1@std@@PEAPEBUCordRep@cord_internal@1@$$QEAPEBU561@@Z
+    ??$construct@PEBUCordRep@cord_internal@absl@@PEBU123@X@?$allocator_traits@V?$allocator@PEBUCordRep@cord_internal@absl@@@__1@std@@@__1@std@@SAXAEAV?$allocator@PEBUCordRep@cord_internal@absl@@@12@PEAPEBUCordRep@cord_internal@absl@@$$QEAPEBU456@@Z
     ??$construct@PEBVCordzHandle@cord_internal@absl@@AEBQEBV123@@?$allocator@PEBVCordzHandle@cord_internal@absl@@@__1@std@@QEAAXPEAPEBVCordzHandle@cord_internal@absl@@AEBQEBV345@@Z
     ??$construct@PEBVCordzHandle@cord_internal@absl@@AEBQEBV123@X@?$allocator_traits@V?$allocator@PEBVCordzHandle@cord_internal@absl@@@__1@std@@@__1@std@@SAXAEAV?$allocator@PEBVCordzHandle@cord_internal@absl@@@12@PEAPEBVCordzHandle@cord_internal@absl@@AEBQEBV456@@Z
     ??$construct@PEBVImpl@time_zone@cctz@time_internal@absl@@AEBQEBV12345@@?$allocator@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@QEAAXPEAPEBVImpl@time_zone@cctz@time_internal@absl@@AEBQEBV34567@@Z
@@ -568,11 +594,11 @@
     ??$construct@UConversionItem@ParsedFormatBase@str_format_internal@absl@@U1234@@?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__1@std@@QEAAXPEAUConversionItem@ParsedFormatBase@str_format_internal@absl@@$$QEAU3456@@Z
     ??$construct@UConversionItem@ParsedFormatBase@str_format_internal@absl@@U1234@X@?$allocator_traits@V?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__1@std@@@__1@std@@SAXAEAV?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@12@PEAUConversionItem@ParsedFormatBase@str_format_internal@absl@@$$QEAU4567@@Z
     ??$construct@UPayload@status_internal@absl@@AEBU123@@?$allocator@UPayload@status_internal@absl@@@__1@std@@QEAAXPEAUPayload@status_internal@absl@@AEBU345@@Z
-    ??$construct@UPayload@status_internal@absl@@AEBU123@@?$allocator_traits@V?$allocator@UPayload@status_internal@absl@@@__1@std@@@absl@@SAXAEAV?$allocator@UPayload@status_internal@absl@@@__1@std@@PEAUPayload@status_internal@1@AEBU561@@Z
+    ??$construct@UPayload@status_internal@absl@@AEBU123@X@?$allocator_traits@V?$allocator@UPayload@status_internal@absl@@@__1@std@@@__1@std@@SAXAEAV?$allocator@UPayload@status_internal@absl@@@12@PEAUPayload@status_internal@absl@@AEBU456@@Z
     ??$construct@UPayload@status_internal@absl@@U123@@?$allocator@UPayload@status_internal@absl@@@__1@std@@QEAAXPEAUPayload@status_internal@absl@@$$QEAU345@@Z
-    ??$construct@UPayload@status_internal@absl@@U123@@?$allocator_traits@V?$allocator@UPayload@status_internal@absl@@@__1@std@@@absl@@SAXAEAV?$allocator@UPayload@status_internal@absl@@@__1@std@@PEAUPayload@status_internal@1@$$QEAU561@@Z
+    ??$construct@UPayload@status_internal@absl@@U123@X@?$allocator_traits@V?$allocator@UPayload@status_internal@absl@@@__1@std@@@__1@std@@SAXAEAV?$allocator@UPayload@status_internal@absl@@@12@PEAUPayload@status_internal@absl@@$$QEAU456@@Z
     ??$construct@USubRange@absl@@U12@@?$allocator@USubRange@absl@@@__1@std@@QEAAXPEAUSubRange@absl@@$$QEAU34@@Z
-    ??$construct@USubRange@absl@@U12@@?$allocator_traits@V?$allocator@USubRange@absl@@@__1@std@@@absl@@SAXAEAV?$allocator@USubRange@absl@@@__1@std@@PEAUSubRange@1@$$QEAU51@@Z
+    ??$construct@USubRange@absl@@U12@X@?$allocator_traits@V?$allocator@USubRange@absl@@@__1@std@@@__1@std@@SAXAEAV?$allocator@USubRange@absl@@@12@PEAUSubRange@absl@@$$QEAU45@@Z
     ??$construct@UTransition@cctz@time_internal@absl@@$$V@?$allocator@UTransition@cctz@time_internal@absl@@@__1@std@@QEAAXPEAUTransition@cctz@time_internal@absl@@@Z
     ??$construct@UTransition@cctz@time_internal@absl@@$$VX@?$allocator_traits@V?$allocator@UTransition@cctz@time_internal@absl@@@__1@std@@@__1@std@@SAXAEAV?$allocator@UTransition@cctz@time_internal@absl@@@12@PEAUTransition@cctz@time_internal@absl@@@Z
     ??$construct@UTransition@cctz@time_internal@absl@@AEBU1234@@?$allocator@UTransition@cctz@time_internal@absl@@@__1@std@@QEAAXPEAUTransition@cctz@time_internal@absl@@AEBU3456@@Z
@@ -586,37 +612,23 @@
     ??$construct@UViableSubstitution@strings_internal@absl@@AEAVstring_view@3@AEBV43@AEA_K@?$allocator@UViableSubstitution@strings_internal@absl@@@__1@std@@QEAAXPEAUViableSubstitution@strings_internal@absl@@AEAVstring_view@5@AEBV65@AEA_K@Z
     ??$construct@UViableSubstitution@strings_internal@absl@@AEAVstring_view@3@AEBV43@AEA_KX@?$allocator_traits@V?$allocator@UViableSubstitution@strings_internal@absl@@@__1@std@@@__1@std@@SAXAEAV?$allocator@UViableSubstitution@strings_internal@absl@@@12@PEAUViableSubstitution@strings_internal@absl@@AEAVstring_view@6@AEBV76@AEA_K@Z
     ??$construct@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@?$optional_data_base@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@optional_internal@absl@@IEAAX$$QEAV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@Z
-    ??$construct_impl@V?$allocator@H@__1@std@@AEAPEAHAEBH@?$allocator_traits@V?$allocator@H@__1@std@@@absl@@CAXHAEAV?$allocator@H@__1@std@@AEAPEAHAEBH@Z
-    ??$construct_impl@V?$allocator@H@__1@std@@AEAPEAHH@?$allocator_traits@V?$allocator@H@__1@std@@@absl@@CAXHAEAV?$allocator@H@__1@std@@AEAPEAH$$QEAH@Z
-    ??$construct_impl@V?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@AEAPEAPEAUCordRep@cord_internal@absl@@AEBQEAU456@@?$allocator_traits@V?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@@absl@@CAXHAEAV?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@AEAPEAPEAUCordRep@cord_internal@1@AEBQEAU561@@Z
-    ??$construct_impl@V?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@AEAPEAPEAUCordRep@cord_internal@absl@@PEAU456@@?$allocator_traits@V?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@@absl@@CAXHAEAV?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@AEAPEAPEAUCordRep@cord_internal@1@$$QEAPEAU561@@Z
-    ??$construct_impl@V?$allocator@PEBUCordRep@cord_internal@absl@@@__1@std@@AEAPEAPEBUCordRep@cord_internal@absl@@AEBQEBU456@@?$allocator_traits@V?$allocator@PEBUCordRep@cord_internal@absl@@@__1@std@@@absl@@CAXHAEAV?$allocator@PEBUCordRep@cord_internal@absl@@@__1@std@@AEAPEAPEBUCordRep@cord_internal@1@AEBQEBU561@@Z
-    ??$construct_impl@V?$allocator@PEBUCordRep@cord_internal@absl@@@__1@std@@AEAPEAPEBUCordRep@cord_internal@absl@@PEBU456@@?$allocator_traits@V?$allocator@PEBUCordRep@cord_internal@absl@@@__1@std@@@absl@@CAXHAEAV?$allocator@PEBUCordRep@cord_internal@absl@@@__1@std@@AEAPEAPEBUCordRep@cord_internal@1@$$QEAPEBU561@@Z
-    ??$construct_impl@V?$allocator@UPayload@status_internal@absl@@@__1@std@@AEAPEAUPayload@status_internal@absl@@AEBU456@@?$allocator_traits@V?$allocator@UPayload@status_internal@absl@@@__1@std@@@absl@@CAXHAEAV?$allocator@UPayload@status_internal@absl@@@__1@std@@AEAPEAUPayload@status_internal@1@AEBU561@@Z
-    ??$construct_impl@V?$allocator@UPayload@status_internal@absl@@@__1@std@@AEAPEAUPayload@status_internal@absl@@U456@@?$allocator_traits@V?$allocator@UPayload@status_internal@absl@@@__1@std@@@absl@@CAXHAEAV?$allocator@UPayload@status_internal@absl@@@__1@std@@AEAPEAUPayload@status_internal@1@$$QEAU561@@Z
-    ??$construct_impl@V?$allocator@USubRange@absl@@@__1@std@@AEAPEAUSubRange@absl@@U45@@?$allocator_traits@V?$allocator@USubRange@absl@@@__1@std@@@absl@@CAXHAEAV?$allocator@USubRange@absl@@@__1@std@@AEAPEAUSubRange@1@$$QEAU51@@Z
     ??$copy@PEBVFormatArgImpl@str_format_internal@absl@@PEAV123@@__1@std@@YAPEAVFormatArgImpl@str_format_internal@absl@@PEBV234@0PEAV234@@Z
+    ??$countl_zero@I@absl@@YAHI@Z
     ??$countl_zero@_K@absl@@YAH_K@Z
-    ??$destroy@H@?$allocator_traits@V?$allocator@H@__1@std@@@absl@@SAXAEAV?$allocator@H@__1@std@@PEAH@Z
+    ??$countr_zero@I@absl@@YAHI@Z
     ??$destroy@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@X@?$allocator_traits@V?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@@__1@std@@SAXAEAV?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@12@PEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@@Z
-    ??$destroy@PEAUCordRep@cord_internal@absl@@@?$allocator_traits@V?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@@absl@@SAXAEAV?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@PEAPEAUCordRep@cord_internal@1@@Z
     ??$destroy@PEAUCordRep@cord_internal@absl@@X@?$allocator_traits@V?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@@__1@std@@SAXAEAV?$allocator@PEAUCordRep@cord_internal@absl@@@12@PEAPEAUCordRep@cord_internal@absl@@@Z
     ??$destroy@PEAVCordzHandle@cord_internal@absl@@X@?$allocator_traits@V?$allocator@PEAVCordzHandle@cord_internal@absl@@@__1@std@@@__1@std@@SAXAEAV?$allocator@PEAVCordzHandle@cord_internal@absl@@@12@PEAPEAVCordzHandle@cord_internal@absl@@@Z
-    ??$destroy@PEBUCordRep@cord_internal@absl@@@?$allocator_traits@V?$allocator@PEBUCordRep@cord_internal@absl@@@__1@std@@@absl@@SAXAEAV?$allocator@PEBUCordRep@cord_internal@absl@@@__1@std@@PEAPEBUCordRep@cord_internal@1@@Z
+    ??$destroy@PEBUCordRep@cord_internal@absl@@X@?$allocator_traits@V?$allocator@PEBUCordRep@cord_internal@absl@@@__1@std@@@__1@std@@SAXAEAV?$allocator@PEBUCordRep@cord_internal@absl@@@12@PEAPEBUCordRep@cord_internal@absl@@@Z
     ??$destroy@PEBVCordzHandle@cord_internal@absl@@X@?$allocator_traits@V?$allocator@PEBVCordzHandle@cord_internal@absl@@@__1@std@@@__1@std@@SAXAEAV?$allocator@PEBVCordzHandle@cord_internal@absl@@@12@PEAPEBVCordzHandle@cord_internal@absl@@@Z
     ??$destroy@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@XX@?$allocator_traits@V?$allocator@U?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@PEAX@__1@std@@@__1@std@@@__1@std@@SAXAEAV?$allocator@U?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@PEAX@__1@std@@@12@PEAU?$pair@$$CBV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@12@@Z
     ??$destroy@UConversionItem@ParsedFormatBase@str_format_internal@absl@@X@?$allocator_traits@V?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__1@std@@@__1@std@@SAXAEAV?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@12@PEAUConversionItem@ParsedFormatBase@str_format_internal@absl@@@Z
-    ??$destroy@UPayload@status_internal@absl@@@?$allocator_traits@V?$allocator@UPayload@status_internal@absl@@@__1@std@@@absl@@SAXAEAV?$allocator@UPayload@status_internal@absl@@@__1@std@@PEAUPayload@status_internal@1@@Z
-    ??$destroy@USubRange@absl@@@?$allocator_traits@V?$allocator@USubRange@absl@@@__1@std@@@absl@@SAXAEAV?$allocator@USubRange@absl@@@__1@std@@PEAUSubRange@1@@Z
+    ??$destroy@UPayload@status_internal@absl@@X@?$allocator_traits@V?$allocator@UPayload@status_internal@absl@@@__1@std@@@__1@std@@SAXAEAV?$allocator@UPayload@status_internal@absl@@@12@PEAUPayload@status_internal@absl@@@Z
+    ??$destroy@USubRange@absl@@X@?$allocator_traits@V?$allocator@USubRange@absl@@@__1@std@@@__1@std@@SAXAEAV?$allocator@USubRange@absl@@@12@PEAUSubRange@absl@@@Z
     ??$destroy@UTransition@cctz@time_internal@absl@@X@?$allocator_traits@V?$allocator@UTransition@cctz@time_internal@absl@@@__1@std@@@__1@std@@SAXAEAV?$allocator@UTransition@cctz@time_internal@absl@@@12@PEAUTransition@cctz@time_internal@absl@@@Z
     ??$destroy@UTransitionType@cctz@time_internal@absl@@X@?$allocator_traits@V?$allocator@UTransitionType@cctz@time_internal@absl@@@__1@std@@@__1@std@@SAXAEAV?$allocator@UTransitionType@cctz@time_internal@absl@@@12@PEAUTransitionType@cctz@time_internal@absl@@@Z
     ??$destroy@UViableSubstitution@strings_internal@absl@@X@?$allocator_traits@V?$allocator@UViableSubstitution@strings_internal@absl@@@__1@std@@@__1@std@@SAXAEAV?$allocator@UViableSubstitution@strings_internal@absl@@@12@PEAUViableSubstitution@strings_internal@absl@@@Z
     ??$destroy@VFormatArgImpl@str_format_internal@absl@@X@?$allocator_traits@V?$allocator@VFormatArgImpl@str_format_internal@absl@@@__1@std@@@__1@std@@SAXAEAV?$allocator@VFormatArgImpl@str_format_internal@absl@@@12@PEAVFormatArgImpl@str_format_internal@absl@@@Z
-    ??$destroy_impl@V?$allocator@H@__1@std@@H@?$allocator_traits@V?$allocator@H@__1@std@@@absl@@CAXHAEAV?$allocator@H@__1@std@@PEAH@Z
-    ??$destroy_impl@V?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@PEAUCordRep@cord_internal@absl@@@?$allocator_traits@V?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@@absl@@CAXHAEAV?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@PEAPEAUCordRep@cord_internal@1@@Z
-    ??$destroy_impl@V?$allocator@PEBUCordRep@cord_internal@absl@@@__1@std@@PEBUCordRep@cord_internal@absl@@@?$allocator_traits@V?$allocator@PEBUCordRep@cord_internal@absl@@@__1@std@@@absl@@CAXHAEAV?$allocator@PEBUCordRep@cord_internal@absl@@@__1@std@@PEAPEBUCordRep@cord_internal@1@@Z
-    ??$destroy_impl@V?$allocator@UPayload@status_internal@absl@@@__1@std@@UPayload@status_internal@absl@@@?$allocator_traits@V?$allocator@UPayload@status_internal@absl@@@__1@std@@@absl@@CAXHAEAV?$allocator@UPayload@status_internal@absl@@@__1@std@@PEAUPayload@status_internal@1@@Z
-    ??$destroy_impl@V?$allocator@USubRange@absl@@@__1@std@@USubRange@absl@@@?$allocator_traits@V?$allocator@USubRange@absl@@@__1@std@@@absl@@CAXHAEAV?$allocator@USubRange@absl@@@__1@std@@PEAUSubRange@1@@Z
     ??$distance@PEBUPayload@status_internal@absl@@@__1@std@@YA_JPEBUPayload@status_internal@absl@@0@Z
     ??$distance@PEBUTransition@cctz@time_internal@absl@@@__1@std@@YA_JPEBUTransition@cctz@time_internal@absl@@0@Z
     ??$distance@PEBVFormatArgImpl@str_format_internal@absl@@@__1@std@@YA_JPEBVFormatArgImpl@str_format_internal@absl@@0@Z
@@ -636,14 +648,11 @@
     ??$emplace_back@UPayload@status_internal@absl@@@?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__1@std@@@absl@@QEAAAEAUPayload@status_internal@1@$$QEAU231@@Z
     ??$emplace_back@USubRange@absl@@@?$InlinedVector@USubRange@absl@@$0CP@V?$allocator@USubRange@absl@@@__1@std@@@absl@@QEAAAEAUSubRange@1@$$QEAU21@@Z
     ??$find@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@?$__hash_table@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@V?$__unordered_map_hasher@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@23@$00@23@V?$__unordered_map_equal@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@23@$00@23@V?$allocator@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@@23@@__1@std@@QEAA?AV?$__hash_iterator@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@PEAX@__1@std@@@12@AEBV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@12@@Z
+    ??$find_first_non_full@X@container_internal@absl@@YA?AUFindInfo@01@PEBW4ctrl_t@01@_K1@Z
     ??$forward@$$T@absl@@YA$$QEA$$TAEA$$T@Z
     ??$forward@AEAI@absl@@YAAEAIAEAI@Z
-    ??$forward@AEAPEAPEAUCordRep@cord_internal@absl@@@__1@std@@YAAEAPEAPEAUCordRep@cord_internal@absl@@AEAPEAPEAU234@@Z
-    ??$forward@AEAPEAPEBUCordRep@cord_internal@absl@@@__1@std@@YAAEAPEAPEBUCordRep@cord_internal@absl@@AEAPEAPEBU234@@Z
     ??$forward@AEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@YAAEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@AEAPEAPEBV23456@@Z
     ??$forward@AEAPEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@PEAX@__1@std@@@__1@std@@YAAEAPEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@PEAX@01@AEAPEAU201@@Z
-    ??$forward@AEAPEAUPayload@status_internal@absl@@@__1@std@@YAAEAPEAUPayload@status_internal@absl@@AEAPEAU234@@Z
-    ??$forward@AEAPEAUSubRange@absl@@@__1@std@@YAAEAPEAUSubRange@absl@@AEAPEAU23@@Z
     ??$forward@AEAPEAUThreadIdentity@base_internal@absl@@@__1@std@@YAAEAPEAUThreadIdentity@base_internal@absl@@AEAPEAU234@@Z
     ??$forward@AEAPEAV?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__1@std@@@absl@@@__1@std@@YAAEAPEAV?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__1@std@@@absl@@AEAPEAV23@@Z
     ??$forward@AEAPEAVTimeZoneIf@cctz@time_internal@absl@@@__1@std@@YAAEAPEAVTimeZoneIf@cctz@time_internal@absl@@AEAPEAV2345@@Z
@@ -805,18 +814,19 @@
     ??$swap@UViableSubstitution@strings_internal@absl@@@__1@std@@YAXAEAUViableSubstitution@strings_internal@absl@@0@Z
     ??$upper_bound@PEBUTransition@cctz@time_internal@absl@@U1234@UByCivilTime@1234@@__1@std@@YAPEBUTransition@cctz@time_internal@absl@@PEBU2345@0AEBU2345@UByCivilTime@2345@@Z
     ??$upper_bound@PEBUTransition@cctz@time_internal@absl@@U1234@UByUnixTime@1234@@__1@std@@YAPEBUTransition@cctz@time_internal@absl@@PEBU2345@0AEBU2345@UByUnixTime@2345@@Z
-    ??0?$AllocationTransaction@V?$allocator@H@__1@std@@@inlined_vector_internal@absl@@QEAA@PEAV?$allocator@H@__1@std@@@Z
-    ??0?$AllocationTransaction@V?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@@inlined_vector_internal@absl@@QEAA@PEAV?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@@Z
-    ??0?$AllocationTransaction@V?$allocator@PEBUCordRep@cord_internal@absl@@@__1@std@@@inlined_vector_internal@absl@@QEAA@PEAV?$allocator@PEBUCordRep@cord_internal@absl@@@__1@std@@@Z
-    ??0?$AllocationTransaction@V?$allocator@UPayload@status_internal@absl@@@__1@std@@@inlined_vector_internal@absl@@QEAA@PEAV?$allocator@UPayload@status_internal@absl@@@__1@std@@@Z
-    ??0?$AllocationTransaction@V?$allocator@USubRange@absl@@@__1@std@@@inlined_vector_internal@absl@@QEAA@PEAV?$allocator@USubRange@absl@@@__1@std@@@Z
+    ??0?$AllocationTransaction@V?$allocator@H@__1@std@@@inlined_vector_internal@absl@@QEAA@AEAV?$allocator@H@__1@std@@@Z
+    ??0?$AllocationTransaction@V?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@@inlined_vector_internal@absl@@QEAA@AEAV?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@@Z
+    ??0?$AllocationTransaction@V?$allocator@PEBUCordRep@cord_internal@absl@@@__1@std@@@inlined_vector_internal@absl@@QEAA@AEAV?$allocator@PEBUCordRep@cord_internal@absl@@@__1@std@@@Z
+    ??0?$AllocationTransaction@V?$allocator@UPayload@status_internal@absl@@@__1@std@@@inlined_vector_internal@absl@@QEAA@AEAV?$allocator@UPayload@status_internal@absl@@@__1@std@@@Z
+    ??0?$AllocationTransaction@V?$allocator@USubRange@absl@@@__1@std@@@inlined_vector_internal@absl@@QEAA@AEAV?$allocator@USubRange@absl@@@__1@std@@@Z
     ??0?$BigUnsigned@$03@strings_internal@absl@@QEAA@Vstring_view@2@@Z
     ??0?$BigUnsigned@$03@strings_internal@absl@@QEAA@XZ
     ??0?$BigUnsigned@$03@strings_internal@absl@@QEAA@_K@Z
     ??0?$BigUnsigned@$0FE@@strings_internal@absl@@QEAA@Vstring_view@2@@Z
     ??0?$BigUnsigned@$0FE@@strings_internal@absl@@QEAA@XZ
     ??0?$BigUnsigned@$0FE@@strings_internal@absl@@QEAA@_K@Z
-    ??0?$CopyValueAdapter@V?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@@inlined_vector_internal@absl@@QEAA@AEBQEAUCordRep@cord_internal@2@@Z
+    ??0?$BitMask@I$0BA@$0A@@container_internal@absl@@QEAA@I@Z
+    ??0?$CopyValueAdapter@V?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@@inlined_vector_internal@absl@@QEAA@PEBQEAUCordRep@cord_internal@2@@Z
     ??0?$FixedArray@PEAUCordRep@cord_internal@absl@@$0?0V?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@@absl@@QEAA@_KAEBV?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@@Z
     ??0?$InlinedVector@H$0CP@V?$allocator@H@__1@std@@@absl@@QEAA@XZ
     ??0?$InlinedVector@PEAUCordRep@cord_internal@absl@@$01V?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@@absl@@QEAA@XZ
@@ -841,7 +851,9 @@
     ??0?$Span@$$CBVFormatArgImpl@str_format_internal@absl@@@absl@@QEAA@PEBVFormatArgImpl@str_format_internal@1@_K@Z
     ??0?$Span@$$CBVFormatArgImpl@str_format_internal@absl@@@absl@@QEAA@XZ
     ??0?$Span@D@absl@@QEAA@PEAD_K@Z
+    ??0?$Span@D@absl@@QEAA@XZ
     ??0?$Span@I@absl@@QEAA@PEAI_K@Z
+    ??0?$Span@QEAUCordRep@cord_internal@absl@@@absl@@QEAA@PEBQEAUCordRep@cord_internal@1@_K@Z
     ??0?$Span@QEAX@absl@@QEAA@PEBQEAX_K@Z
     ??0?$Span@VFormatArgImpl@str_format_internal@absl@@@absl@@QEAA@PEAVFormatArgImpl@str_format_internal@1@_K@Z
     ??0?$Storage@H$0CP@V?$allocator@H@__1@std@@@inlined_vector_internal@absl@@QEAA@XZ
@@ -982,6 +994,7 @@
     ??0?$optional_data_base@VCord@absl@@@optional_internal@absl@@QEAA@XZ
     ??0?$optional_data_dtor_base@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@$0A@@optional_internal@absl@@IEAA@XZ
     ??0?$optional_data_dtor_base@VCord@absl@@$0A@@optional_internal@absl@@IEAA@XZ
+    ??0?$probe_seq@$0BA@@container_internal@absl@@QEAA@_K0@Z
     ??0?$unique_ptr@V?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__1@std@@@absl@@U?$default_delete@V?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__1@std@@@absl@@@__1@std@@@__1@std@@QEAA@$$QEAV012@@Z
     ??0?$unordered_map@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@U?$hash@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@@23@@__1@std@@QEAA@XZ
     ??0?$vector@PEAUCordRep@cord_internal@absl@@V?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@@__1@std@@QEAA@V?$initializer_list@PEAUCordRep@cord_internal@absl@@@2@@Z
@@ -992,6 +1005,7 @@
     ??0?$vector@UTransitionType@cctz@time_internal@absl@@V?$allocator@UTransitionType@cctz@time_internal@absl@@@__1@std@@@__1@std@@QEAA@XZ
     ??0?$vector@UViableSubstitution@strings_internal@absl@@V?$allocator@UViableSubstitution@strings_internal@absl@@@__1@std@@@__1@std@@QEAA@XZ
     ??0?$vector@VFormatArgImpl@str_format_internal@absl@@V?$allocator@VFormatArgImpl@str_format_internal@absl@@@__1@std@@@__1@std@@QEAA@XZ
+    ??0AlphaNum@absl@@QEAA@H@Z
     ??0AlphaNum@absl@@QEAA@PEBD@Z
     ??0AlphaNum@absl@@QEAA@UDec@1@@Z
     ??0AlphaNum@absl@@QEAA@UHex@1@@Z
@@ -1002,6 +1016,8 @@
     ??0Arg@substitute_internal@absl@@QEAA@PEBX@Z
     ??0Arg@substitute_internal@absl@@QEAA@UDec@2@@Z
     ??0Arg@substitute_internal@absl@@QEAA@UHex@2@@Z
+    ??0BadStatusOrAccess@absl@@QEAA@$$QEAV01@@Z
+    ??0BadStatusOrAccess@absl@@QEAA@AEBV01@@Z
     ??0BadStatusOrAccess@absl@@QEAA@VStatus@1@@Z
     ??0BlockingCounter@absl@@QEAA@H@Z
     ??0BoundConversion@str_format_internal@absl@@QEAA@XZ
@@ -1024,11 +1040,13 @@
     ??0Cord@absl@@QEAA@XZ
     ??0CordForest@absl@@QEAA@_K@Z
     ??0CordRep@cord_internal@absl@@QEAA@XZ
+    ??0CordRepBtree@cord_internal@absl@@AEAA@XZ
+    ??0CordRepBtreeNavigator@cord_internal@absl@@QEAA@XZ
+    ??0CordRepBtreeReader@cord_internal@absl@@QEAA@XZ
     ??0CordRepConcat@cord_internal@absl@@QEAA@XZ
     ??0CordRepExternal@cord_internal@absl@@QEAA@XZ
     ??0CordRepFlat@cord_internal@absl@@QEAA@XZ
     ??0CordRepRing@cord_internal@absl@@AEAA@I@Z
-    ??0CordRepRingReader@cord_internal@absl@@QEAA@XZ
     ??0CordRepSubstring@cord_internal@absl@@QEAA@XZ
     ??0CordzHandle@cord_internal@absl@@IEAA@_N@Z
     ??0CordzHandle@cord_internal@absl@@QEAA@XZ
@@ -1045,9 +1063,10 @@
     ??0FormatConversionSpecImpl@str_format_internal@absl@@QEAA@XZ
     ??0FormatSinkImpl@str_format_internal@absl@@QEAA@VFormatRawSinkImpl@12@@Z
     ??0GraphCycles@synchronization_internal@absl@@QEAA@XZ
-    ??0GroupSse2Impl@container_internal@absl@@QEAA@PEBC@Z
+    ??0GroupSse2Impl@container_internal@absl@@QEAA@PEBW4ctrl_t@12@@Z
     ??0HashtablezInfo@container_internal@absl@@QEAA@XZ
     ??0HashtablezSampler@container_internal@absl@@QEAA@XZ
+    ??0Hex@absl@@AEAA@W4PadSpec@1@_K@Z
     ??0Impl@time_zone@cctz@time_internal@absl@@AEAA@AEBV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@Z
     ??0InlineData@cord_internal@absl@@QEAA@W4DefaultInitType@012@@Z
     ??0InlineData@cord_internal@absl@@QEAA@XZ
@@ -1068,7 +1087,7 @@
     ??0Payload@status_internal@absl@@QEAA@$$QEAU012@@Z
     ??0Payload@status_internal@absl@@QEAA@AEBU012@@Z
     ??0PosixTimeZone@cctz@time_internal@absl@@QEAA@XZ
-    ??0Refcount@cord_internal@absl@@QEAA@XZ
+    ??0RefcountAndFlags@cord_internal@absl@@QEAA@XZ
     ??0Rep@GraphCycles@synchronization_internal@absl@@QEAA@XZ
     ??0SchedulingHelper@base_internal@absl@@QEAA@W4SchedulingMode@12@@Z
     ??0ScopedDisable@SchedulingGuard@base_internal@absl@@QEAA@XZ
@@ -1076,6 +1095,7 @@
     ??0SpinLock@base_internal@absl@@QEAA@W4SchedulingMode@12@@Z
     ??0SpinLockHolder@base_internal@absl@@QEAA@PEAVSpinLock@12@@Z
     ??0Status@absl@@QEAA@$$QEAV01@@Z
+    ??0Status@absl@@QEAA@AEBV01@@Z
     ??0Status@absl@@QEAA@W4StatusCode@1@Vstring_view@1@@Z
     ??0StatusRep@status_internal@absl@@QEAA@W4StatusCode@2@Vstring_view@2@V?$unique_ptr@V?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__1@std@@@absl@@U?$default_delete@V?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__1@std@@@absl@@@__1@std@@@__1@std@@@Z
     ??0Storage@?$FixedArray@PEAUCordRep@cord_internal@absl@@$0?0V?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@@absl@@QEAA@_KAEBV?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@@Z
@@ -1118,6 +1138,8 @@
     ??0int128@absl@@QEAA@M@Z
     ??0int128@absl@@QEAA@N@Z
     ??0int128@absl@@QEAA@O@Z
+    ??0once_flag@absl@@QEAA@XZ
+    ??0string_view@absl@@AEAA@PEBD_KUSkipCheckLengthTag@01@@Z
     ??0string_view@absl@@QEAA@PEBD@Z
     ??0string_view@absl@@QEAA@PEBD_K@Z
     ??0string_view@absl@@QEAA@XZ
@@ -1241,12 +1263,15 @@
     ??4?$optional@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@absl@@QEAAAEAV01@$$QEAV01@@Z
     ??4?$optional_data@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@$0A@@optional_internal@absl@@IEAAAEAV012@$$QEAV012@@Z
     ??4?$unique_ptr@V?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__1@std@@@absl@@U?$default_delete@V?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__1@std@@@absl@@@__1@std@@@__1@std@@QEAAAEAV012@$$QEAV012@@Z
+    ??4BadStatusOrAccess@absl@@QEAAAEAV01@$$QEAV01@@Z
+    ??4BadStatusOrAccess@absl@@QEAAAEAV01@AEBV01@@Z
     ??4Cord@absl@@QEAAAEAV01@$$QEAV01@@Z
     ??4Cord@absl@@QEAAAEAV01@Vstring_view@1@@Z
     ??4CordzUpdateTracker@cord_internal@absl@@QEAAAEAV012@AEBV012@@Z
     ??4InlineRep@Cord@absl@@QEAAAEAV012@$$QEAV012@@Z
     ??4Payload@status_internal@absl@@QEAAAEAU012@$$QEAU012@@Z
     ??4Status@absl@@QEAAAEAV01@$$QEAV01@@Z
+    ??4Status@absl@@QEAAAEAV01@AEBV01@@Z
     ??4int128@absl@@QEAAAEAV01@H@Z
     ??4uint128@absl@@QEAAAEAV01@H@Z
     ??4uint128@absl@@QEAAAEAV01@_J@Z
@@ -1313,12 +1338,13 @@
     ??A?$vector@UViableSubstitution@strings_internal@absl@@V?$allocator@UViableSubstitution@strings_internal@absl@@@__1@std@@@__1@std@@QEAAAEAUViableSubstitution@strings_internal@absl@@_K@Z
     ??ACord@absl@@QEBAD_K@Z
     ??Astring_view@absl@@QEBAAEBD_K@Z
+    ??B?$BitMask@I$0BA@$0A@@container_internal@absl@@QEBA_NXZ
     ??B?$__atomic_base@PEAVCordzHandle@cord_internal@absl@@$0A@@__1@std@@QEBAPEAVCordzHandle@cord_internal@absl@@XZ
     ??B?$unique_ptr@V?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__1@std@@@absl@@U?$default_delete@V?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__1@std@@@absl@@@__1@std@@@__1@std@@QEBA_NXZ
     ??B?$unique_ptr@VTimeZoneIf@cctz@time_internal@absl@@U?$default_delete@VTimeZoneIf@cctz@time_internal@absl@@@__1@std@@@__1@std@@QEBA_NXZ
     ??B?$unique_ptr@VZoneInfoSource@cctz@time_internal@absl@@U?$default_delete@VZoneInfoSource@cctz@time_internal@absl@@@__1@std@@@__1@std@@QEBA_NXZ
     ??BCord@absl@@QEBA?AV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@XZ
-    ??BCordRepRingReader@cord_internal@absl@@QEBA_NXZ
+    ??BCordRepBtreeReader@cord_internal@absl@@QEBA_NXZ
     ??BTimeZone@absl@@QEBA?AVtime_zone@cctz@time_internal@1@XZ
     ??Bint128@absl@@QEBAEXZ
     ??Bint128@absl@@QEBANXZ
@@ -1468,6 +1494,7 @@
     ??RByUnixTime@Transition@cctz@time_internal@absl@@QEBA_NAEBU1234@0@Z
     ??Sabsl@@YA?AVuint128@0@V10@@Z
     ??Tabsl@@YA?AVuint128@0@V10@0@Z
+    ??Uabsl@@YA?AVuint128@0@V10@0@Z
     ??Ustr_format_internal@absl@@YA?AW4Flags@01@W4201@0@Z
     ??XDuration@absl@@QEAAAEAV01@N@Z
     ??XDuration@absl@@QEAAAEAV01@_J@Z
@@ -1499,15 +1526,16 @@
     ?AbslParseFlag@absl@@YA_NVstring_view@1@PEAVTime@1@PEAV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@Z
     ?AbslUnparseFlag@absl@@YA?AV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@VDuration@1@@Z
     ?AbslUnparseFlag@absl@@YA?AV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@VTime@1@@Z
-    ?AcquireAllocatedData@?$Storage@H$0CP@V?$allocator@H@__1@std@@@inlined_vector_internal@absl@@QEAAXPEAV?$AllocationTransaction@V?$allocator@H@__1@std@@@23@@Z
-    ?AcquireAllocatedData@?$Storage@PEAUCordRep@cord_internal@absl@@$01V?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@@inlined_vector_internal@absl@@QEAAXPEAV?$AllocationTransaction@V?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@@23@@Z
-    ?AcquireAllocatedData@?$Storage@PEAUCordRep@cord_internal@absl@@$0CP@V?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@@inlined_vector_internal@absl@@QEAAXPEAV?$AllocationTransaction@V?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@@23@@Z
-    ?AcquireAllocatedData@?$Storage@PEBUCordRep@cord_internal@absl@@$0CP@V?$allocator@PEBUCordRep@cord_internal@absl@@@__1@std@@@inlined_vector_internal@absl@@QEAAXPEAV?$AllocationTransaction@V?$allocator@PEBUCordRep@cord_internal@absl@@@__1@std@@@23@@Z
-    ?AcquireAllocatedData@?$Storage@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__1@std@@@inlined_vector_internal@absl@@QEAAXPEAV?$AllocationTransaction@V?$allocator@UPayload@status_internal@absl@@@__1@std@@@23@@Z
-    ?AcquireAllocatedData@?$Storage@USubRange@absl@@$0CP@V?$allocator@USubRange@absl@@@__1@std@@@inlined_vector_internal@absl@@QEAAXPEAV?$AllocationTransaction@V?$allocator@USubRange@absl@@@__1@std@@@23@@Z
+    ?AcquireAllocatedData@?$Storage@H$0CP@V?$allocator@H@__1@std@@@inlined_vector_internal@absl@@QEAAXAEAV?$AllocationTransaction@V?$allocator@H@__1@std@@@23@@Z
+    ?AcquireAllocatedData@?$Storage@PEAUCordRep@cord_internal@absl@@$01V?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@@inlined_vector_internal@absl@@QEAAXAEAV?$AllocationTransaction@V?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@@23@@Z
+    ?AcquireAllocatedData@?$Storage@PEAUCordRep@cord_internal@absl@@$0CP@V?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@@inlined_vector_internal@absl@@QEAAXAEAV?$AllocationTransaction@V?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@@23@@Z
+    ?AcquireAllocatedData@?$Storage@PEBUCordRep@cord_internal@absl@@$0CP@V?$allocator@PEBUCordRep@cord_internal@absl@@@__1@std@@@inlined_vector_internal@absl@@QEAAXAEAV?$AllocationTransaction@V?$allocator@PEBUCordRep@cord_internal@absl@@@__1@std@@@23@@Z
+    ?AcquireAllocatedData@?$Storage@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__1@std@@@inlined_vector_internal@absl@@QEAAXAEAV?$AllocationTransaction@V?$allocator@UPayload@status_internal@absl@@@__1@std@@@23@@Z
+    ?AcquireAllocatedData@?$Storage@USubRange@absl@@$0CP@V?$allocator@USubRange@absl@@@__1@std@@@inlined_vector_internal@absl@@QEAAXAEAV?$AllocationTransaction@V?$allocator@USubRange@absl@@@__1@std@@@23@@Z
     ?Add@Filler@CordRepRing@cord_internal@absl@@QEAAXPEAUCordRep@34@_K1@Z
     ?AddDataOffset@CordRepRing@cord_internal@absl@@AEAAXI_K@Z
     ?AddNode@CordForest@absl@@AEAAXPEAUCordRep@cord_internal@2@@Z
+    ?AddResult@int128_internal@absl@@YA?AVuint128@2@V32@0@Z
     ?AddSize@?$Storage@H$0CP@V?$allocator@H@__1@std@@@inlined_vector_internal@absl@@QEAAX_K@Z
     ?AddSize@?$Storage@PEAUCordRep@cord_internal@absl@@$01V?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@@inlined_vector_internal@absl@@QEAAX_K@Z
     ?AddSize@?$Storage@PEAUCordRep@cord_internal@absl@@$0CP@V?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@@inlined_vector_internal@absl@@QEAAX_K@Z
@@ -1520,12 +1548,14 @@
     ?AddWithCarry@?$BigUnsigned@$0FE@@strings_internal@absl@@AEAAXH_K@Z
     ?AddressIsReadable@debugging_internal@absl@@YA_NPEBX@Z
     ?AdvanceAndReadBytes@ChunkIterator@Cord@absl@@AEAA?AV23@_K@Z
+    ?AdvanceBtree@ChunkIterator@Cord@absl@@AEAAAEAV123@XZ
     ?AdvanceBytes@ChunkIterator@Cord@absl@@AEAAX_K@Z
-    ?AdvanceBytesRing@ChunkIterator@Cord@absl@@AEAAX_K@Z
+    ?AdvanceBytesBtree@ChunkIterator@Cord@absl@@AEAAX_K@Z
     ?AdvanceBytesSlowPath@ChunkIterator@Cord@absl@@AEAAX_K@Z
-    ?AdvanceRing@ChunkIterator@Cord@absl@@AEAAAEAV123@XZ
     ?AdvanceStack@ChunkIterator@Cord@absl@@AEAAAEAV123@XZ
     ?Align@adl_barrier@internal_layout@container_internal@absl@@YA_K_K0@Z
+    ?AlignBegin@CordRepBtree@cord_internal@absl@@AEAAXXZ
+    ?AlignEnd@CordRepBtree@cord_internal@absl@@AEAAXXZ
     ?Alloc@LowLevelAlloc@base_internal@absl@@SAPEAX_K@Z
     ?AllocSize@?$LayoutImpl@V?$tuple@_KPEAUCordRep@cord_internal@absl@@I@__1@std@@U?$integer_sequence@_K$0A@$00$01@absl@@U45@@internal_layout@container_internal@absl@@QEBA_KXZ
     ?AllocSize@CordRepRing@cord_internal@absl@@SA_K_K@Z
@@ -1544,6 +1574,8 @@
     ?Append@Cord@absl@@QEAAX$$QEAV12@@Z
     ?Append@Cord@absl@@QEAAXAEBV12@@Z
     ?Append@Cord@absl@@QEAAXVstring_view@2@@Z
+    ?Append@CordRepBtree@cord_internal@absl@@SAPEAV123@PEAV123@PEAUCordRep@23@@Z
+    ?Append@CordRepBtree@cord_internal@absl@@SAPEAV123@PEAV123@Vstring_view@3@_K@Z
     ?Append@CordRepRing@cord_internal@absl@@SAPEAV123@PEAV123@PEAUCordRep@23@@Z
     ?Append@CordRepRing@cord_internal@absl@@SAPEAV123@PEAV123@Vstring_view@3@_K@Z
     ?Append@FormatSinkImpl@str_format_internal@absl@@QEAAXVstring_view@3@@Z
@@ -1554,6 +1586,7 @@
     ?AppendNode@CordForest@absl@@AEAAPEAUCordRep@cord_internal@2@PEAU342@0@Z
     ?AppendPack@str_format_internal@absl@@YAAEAV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEAV345@VUntypedFormatSpecImpl@12@V?$Span@$$CBVFormatArgImpl@str_format_internal@absl@@@2@@Z
     ?AppendPieces@strings_internal@absl@@YAXPEAV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@V?$initializer_list@Vstring_view@absl@@@5@@Z
+    ?AppendSlow@CordRepBtree@cord_internal@absl@@CAPEAV123@PEAV123@PEAUCordRep@23@@Z
     ?AppendSlow@CordRepRing@cord_internal@absl@@CAPEAV123@PEAV123@PEAUCordRep@23@@Z
     ?AppendText@ParsedFormatConsumer@ParsedFormatBase@str_format_internal@absl@@QEAA_KVstring_view@4@@Z
     ?AppendTree@InlineRep@Cord@absl@@QEAAXPEAUCordRep@cord_internal@3@W4MethodIdentifier@CordzUpdateTracker@53@@Z
@@ -1567,6 +1600,8 @@
     ?AssertHeld@Mutex@absl@@QEBAXXZ
     ?AssertNotHeld@Mutex@absl@@QEBAXXZ
     ?AssertReaderHeld@Mutex@absl@@QEBAXXZ
+    ?AssertValid@CordRepBtree@cord_internal@absl@@SAPEAV123@PEAV123@_N@Z
+    ?AssertValid@CordRepBtree@cord_internal@absl@@SAPEBV123@PEBV123@_N@Z
     ?AssignLargeString@Cord@absl@@AEAAAEAV12@$$QEAV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@Z
     ?AssignNext@?$IteratorValueAdapter@V?$allocator@UPayload@status_internal@absl@@@__1@std@@V?$move_iterator@PEAUPayload@status_internal@absl@@@23@@inlined_vector_internal@absl@@QEAAXPEAUPayload@status_internal@3@@Z
     ?AssignSlow@InlineRep@Cord@absl@@AEAAXAEBV123@@Z
@@ -1624,13 +1659,13 @@
     ?ComputeCapacity@?$Storage@PEAUCordRep@cord_internal@absl@@$0CP@V?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@@inlined_vector_internal@absl@@SA_K_K0@Z
     ?ComputeCapacity@?$Storage@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__1@std@@@inlined_vector_internal@absl@@SA_K_K0@Z
     ?ConcatNodes@CordForest@absl@@QEAAPEAUCordRep@cord_internal@2@XZ
-    ?ConstructNext@?$CopyValueAdapter@V?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@@inlined_vector_internal@absl@@QEAAXPEAV?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@PEAPEAUCordRep@cord_internal@3@@Z
-    ?ConstructNext@?$IteratorValueAdapter@V?$allocator@H@__1@std@@V?$move_iterator@PEAH@23@@inlined_vector_internal@absl@@QEAAXPEAV?$allocator@H@__1@std@@PEAH@Z
-    ?ConstructNext@?$IteratorValueAdapter@V?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@V?$move_iterator@PEAPEAUCordRep@cord_internal@absl@@@23@@inlined_vector_internal@absl@@QEAAXPEAV?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@PEAPEAUCordRep@cord_internal@3@@Z
-    ?ConstructNext@?$IteratorValueAdapter@V?$allocator@PEBUCordRep@cord_internal@absl@@@__1@std@@V?$move_iterator@PEAPEBUCordRep@cord_internal@absl@@@23@@inlined_vector_internal@absl@@QEAAXPEAV?$allocator@PEBUCordRep@cord_internal@absl@@@__1@std@@PEAPEBUCordRep@cord_internal@3@@Z
-    ?ConstructNext@?$IteratorValueAdapter@V?$allocator@UPayload@status_internal@absl@@@__1@std@@PEBUPayload@status_internal@absl@@@inlined_vector_internal@absl@@QEAAXPEAV?$allocator@UPayload@status_internal@absl@@@__1@std@@PEAUPayload@status_internal@3@@Z
-    ?ConstructNext@?$IteratorValueAdapter@V?$allocator@UPayload@status_internal@absl@@@__1@std@@V?$move_iterator@PEAUPayload@status_internal@absl@@@23@@inlined_vector_internal@absl@@QEAAXPEAV?$allocator@UPayload@status_internal@absl@@@__1@std@@PEAUPayload@status_internal@3@@Z
-    ?ConstructNext@?$IteratorValueAdapter@V?$allocator@USubRange@absl@@@__1@std@@V?$move_iterator@PEAUSubRange@absl@@@23@@inlined_vector_internal@absl@@QEAAXPEAV?$allocator@USubRange@absl@@@__1@std@@PEAUSubRange@3@@Z
+    ?ConstructNext@?$CopyValueAdapter@V?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@@inlined_vector_internal@absl@@QEAAXAEAV?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@PEAPEAUCordRep@cord_internal@3@@Z
+    ?ConstructNext@?$IteratorValueAdapter@V?$allocator@H@__1@std@@V?$move_iterator@PEAH@23@@inlined_vector_internal@absl@@QEAAXAEAV?$allocator@H@__1@std@@PEAH@Z
+    ?ConstructNext@?$IteratorValueAdapter@V?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@V?$move_iterator@PEAPEAUCordRep@cord_internal@absl@@@23@@inlined_vector_internal@absl@@QEAAXAEAV?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@PEAPEAUCordRep@cord_internal@3@@Z
+    ?ConstructNext@?$IteratorValueAdapter@V?$allocator@PEBUCordRep@cord_internal@absl@@@__1@std@@V?$move_iterator@PEAPEBUCordRep@cord_internal@absl@@@23@@inlined_vector_internal@absl@@QEAAXAEAV?$allocator@PEBUCordRep@cord_internal@absl@@@__1@std@@PEAPEBUCordRep@cord_internal@3@@Z
+    ?ConstructNext@?$IteratorValueAdapter@V?$allocator@UPayload@status_internal@absl@@@__1@std@@PEBUPayload@status_internal@absl@@@inlined_vector_internal@absl@@QEAAXAEAV?$allocator@UPayload@status_internal@absl@@@__1@std@@PEAUPayload@status_internal@3@@Z
+    ?ConstructNext@?$IteratorValueAdapter@V?$allocator@UPayload@status_internal@absl@@@__1@std@@V?$move_iterator@PEAUPayload@status_internal@absl@@@23@@inlined_vector_internal@absl@@QEAAXAEAV?$allocator@UPayload@status_internal@absl@@@__1@std@@PEAUPayload@status_internal@3@@Z
+    ?ConstructNext@?$IteratorValueAdapter@V?$allocator@USubRange@absl@@@__1@std@@V?$move_iterator@PEAUSubRange@absl@@@23@@inlined_vector_internal@absl@@QEAAXAEAV?$allocator@USubRange@absl@@@__1@std@@PEAUSubRange@3@@Z
     ?Consume@cord_internal@absl@@YAXPEAUCordRep@12@V?$FunctionRef@$$A6AXPEAUCordRep@cord_internal@absl@@_K1@Z@2@@Z
     ?ConsumePrefix@absl@@YA_NPEAVstring_view@1@V21@@Z
     ?ConsumeUnboundConversion@str_format_internal@absl@@YAPEBDPEBD0PEAUUnboundConversion@12@PEAH@Z
@@ -1638,22 +1673,32 @@
     ?Contains@str_format_internal@absl@@YA_NW4FormatConversionCharSet@2@W4FormatConversionChar@2@@Z
     ?ControlWord@base_internal@absl@@YAPEAU?$atomic@I@__1@std@@PEAVonce_flag@2@@Z
     ?ConvertDateTime@absl@@YA?AUTimeConversion@1@_JHHHHHVTimeZone@1@@Z
-    ?ConvertDeletedToEmptyAndFullToDeleted@container_internal@absl@@YAXPEAC_K@Z
+    ?ConvertDeletedToEmptyAndFullToDeleted@container_internal@absl@@YAXPEAW4ctrl_t@12@_K@Z
     ?ConvertFloatImpl@str_format_internal@absl@@YA_NMAEBVFormatConversionSpecImpl@12@PEAVFormatSinkImpl@12@@Z
     ?ConvertFloatImpl@str_format_internal@absl@@YA_NNAEBVFormatConversionSpecImpl@12@PEAVFormatSinkImpl@12@@Z
     ?ConvertFloatImpl@str_format_internal@absl@@YA_NOAEBVFormatConversionSpecImpl@12@PEAVFormatSinkImpl@12@@Z
     ?ConvertOne@ParsedFormatConsumer@ParsedFormatBase@str_format_internal@absl@@QEAA_NAEBUUnboundConversion@34@Vstring_view@4@@Z
-    ?ConvertSpecialToEmptyAndFullToDeleted@GroupSse2Impl@container_internal@absl@@QEBAXPEAC@Z
+    ?ConvertSpecialToEmptyAndFullToDeleted@GroupSse2Impl@container_internal@absl@@QEBAXPEAW4ctrl_t@23@@Z
+    ?Copy@CordRepBtree@cord_internal@absl@@AEBAPEAV123@XZ
     ?Copy@CordRepRing@cord_internal@absl@@CAPEAV123@PEAV123@II_K@Z
+    ?CopyBeginTo@CordRepBtree@cord_internal@absl@@AEBAPEAV123@_K0@Z
     ?CopyCordToString@absl@@YAXAEBVCord@1@PEAV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@Z
+    ?CopyPrefix@CordRepBtree@cord_internal@absl@@AEAA?AUCopyResult@123@_K@Z
+    ?CopyRaw@CordRepBtree@cord_internal@absl@@AEBAPEAV123@XZ
+    ?CopySuffix@CordRepBtree@cord_internal@absl@@AEAA?AUCopyResult@123@_K@Z
     ?CopyTo@InlineRep@Cord@absl@@QEBAXPEAV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@Z
     ?CopyToArraySlowPath@Cord@absl@@AEBAXPEAD@Z
+    ?CopyToEndFrom@CordRepBtree@cord_internal@absl@@AEBAPEAV123@_K0@Z
     ?Crash@Helper@internal_statusor@absl@@SAXAEBVStatus@3@@Z
+    ?Create@CordRepBtree@cord_internal@absl@@SAPEAV123@PEAUCordRep@23@@Z
     ?Create@CordRepRing@cord_internal@absl@@SAPEAV123@PEAUCordRep@23@_K@Z
     ?CreateFromLeaf@CordRepRing@cord_internal@absl@@CAPEAV123@PEAUCordRep@23@_K11@Z
+    ?CreateSlow@CordRepBtree@cord_internal@absl@@CAPEAV123@PEAUCordRep@23@@Z
     ?CreateSlow@CordRepRing@cord_internal@absl@@CAPEAV123@PEAUCordRep@23@_K@Z
     ?CreateThreadIdentity@synchronization_internal@absl@@YAPEAUThreadIdentity@base_internal@2@XZ
+    ?Current@CordRepBtreeNavigator@cord_internal@absl@@QEBAPEAUCordRep@23@XZ
     ?CurrentThreadIdentityIfPresent@base_internal@absl@@YAPEAUThreadIdentity@12@XZ
+    ?Data@CordRepBtree@cord_internal@absl@@QEBA?AVstring_view@3@_K@Z
     ?Data@CordRepFlat@cord_internal@absl@@QEAAPEADXZ
     ?Data@CordRepFlat@cord_internal@absl@@QEBAPEBDXZ
     ?DataLength@Header@TimeZoneInfo@cctz@time_internal@absl@@QEBA_K_K@Z
@@ -1666,12 +1711,13 @@
     ?DeallocateIfAllocated@?$Storage@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__1@std@@@inlined_vector_internal@absl@@QEAAXXZ
     ?DeallocateIfAllocated@?$Storage@USubRange@absl@@$0CP@V?$allocator@USubRange@absl@@@__1@std@@@inlined_vector_internal@absl@@QEAAXXZ
     ?DecodeWaitCycles@SpinLock@base_internal@absl@@KA_KI@Z
-    ?Decrement@Refcount@cord_internal@absl@@QEAA_NXZ
+    ?Decrement@RefcountAndFlags@cord_internal@absl@@QEAA_NXZ
     ?DecrementCount@BlockingCounter@absl@@QEAA_NXZ
-    ?DecrementExpectHighRefcount@Refcount@cord_internal@absl@@QEAA_NXZ
+    ?DecrementExpectHighRefcount@RefcountAndFlags@cord_internal@absl@@QEAA_NXZ
     ?DecrementSynchSem@Mutex@absl@@CA_NPEAV12@PEAUPerThreadSynch@base_internal@2@VKernelTimeout@synchronization_internal@2@@Z
     ?DefaultArena@LowLevelAlloc@base_internal@absl@@SAPEAUArena@123@XZ
     ?DefaultStackUnwinder@absl@@YAHPEAPEAXPEAHHHPEBX1@Z
+    ?Delete@CordRepBtree@cord_internal@absl@@CAXPEAV123@@Z
     ?Delete@CordRepExternal@cord_internal@absl@@SAXPEAUCordRep@23@@Z
     ?Delete@CordRepFlat@cord_internal@absl@@SAXPEAUCordRep@23@@Z
     ?Delete@CordRepRing@cord_internal@absl@@CAXPEAV123@@Z
@@ -1682,10 +1728,14 @@
     ?Description@TimeZoneInfo@cctz@time_internal@absl@@UEBA?AV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@XZ
     ?Description@TimeZoneLibC@cctz@time_internal@absl@@UEBA?AV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@XZ
     ?Destroy@CordRep@cord_internal@absl@@SAXPEAU123@@Z
+    ?Destroy@CordRepBtree@cord_internal@absl@@SAXPEAV123@@Z
     ?Destroy@CordRepRing@cord_internal@absl@@CAXPEAV123@@Z
     ?Destroy@PerThreadSem@synchronization_internal@absl@@CAXPEAUThreadIdentity@base_internal@3@@Z
     ?DestroyContents@?$Storage@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__1@std@@@inlined_vector_internal@absl@@AEAAXXZ
     ?DestroyCordSlow@Cord@absl@@AEAAXXZ
+    ?DestroyLeaf@CordRepBtree@cord_internal@absl@@CAXPEAV123@_K1@Z
+    ?DestroyNonLeaf@CordRepBtree@cord_internal@absl@@CAXPEAV123@_K1@Z
+    ?DestroyTree@CordRepBtree@cord_internal@absl@@CAXPEAV123@_K1@Z
     ?DiagnosticsGetDeleteQueue@CordzHandle@cord_internal@absl@@SA?AV?$vector@PEBVCordzHandle@cord_internal@absl@@V?$allocator@PEBVCordzHandle@cord_internal@absl@@@__1@std@@@__1@std@@XZ
     ?DiagnosticsGetSafeToInspectDeletedHandles@CordzHandle@cord_internal@absl@@QEAA?AV?$vector@PEBVCordzHandle@cord_internal@absl@@V?$allocator@PEBVCordzHandle@cord_internal@absl@@@__1@std@@@__1@std@@XZ
     ?DiagnosticsHandleIsSafeToInspect@CordzHandle@cord_internal@absl@@QEBA_NPEBV123@@Z
@@ -1724,9 +1774,18 @@
     ?DummyFunction@?$AtomicHook@P6AXPEBX_J@Z@base_internal@absl@@CAXPEBX_J@Z
     ?DummyFunction@?$AtomicHook@P6AX_J@Z@base_internal@absl@@CAX_J@Z
     ?DummyFunction@?$AtomicHook@P6A_NW4LogSeverity@absl@@PEBDHPEAPEADPEAH@Z@base_internal@absl@@CA_NW4LogSeverity@3@PEBDHPEAPEADPEAH@Z
+    ?Dump@CordRepBtree@cord_internal@absl@@SAXPEBUCordRep@23@AEAV?$basic_ostream@DU?$char_traits@D@__1@std@@@__1@std@@@Z
+    ?Dump@CordRepBtree@cord_internal@absl@@SAXPEBUCordRep@23@Vstring_view@3@AEAV?$basic_ostream@DU?$char_traits@D@__1@std@@@__1@std@@@Z
+    ?Dump@CordRepBtree@cord_internal@absl@@SAXPEBUCordRep@23@Vstring_view@3@_NAEAV?$basic_ostream@DU?$char_traits@D@__1@std@@@__1@std@@@Z
     ?DumpPCAndFrameSizesAndStackTrace@debugging_internal@absl@@YAXPEAXQEBQEAXQEAHHH_NP6AXPEBD0@Z0@Z
     ?DurationFromTimespec@absl@@YA?AVDuration@1@Utimespec@@@Z
     ?DurationFromTimeval@absl@@YA?AVDuration@1@Utimeval@@@Z
+    ?Edge@CordRepBtree@cord_internal@absl@@QEBAPEAUCordRep@23@W4EdgeType@123@@Z
+    ?Edge@CordRepBtree@cord_internal@absl@@QEBAPEAUCordRep@23@_K@Z
+    ?EdgeData@CordRepBtree@cord_internal@absl@@SA?AVstring_view@3@PEBUCordRep@23@@Z
+    ?EdgeDataPtr@CordRepBtree@cord_internal@absl@@SAPEBDPEBUCordRep@23@@Z
+    ?Edges@CordRepBtree@cord_internal@absl@@QEBA?AV?$Span@QEAUCordRep@cord_internal@absl@@@3@XZ
+    ?Edges@CordRepBtree@cord_internal@absl@@QEBA?AV?$Span@QEAUCordRep@cord_internal@absl@@@3@_K0@Z
     ?EmplaceTree@InlineRep@Cord@absl@@QEAAXPEAUCordRep@cord_internal@3@AEBVInlineData@53@W4MethodIdentifier@CordzUpdateTracker@53@@Z
     ?EmplaceTree@InlineRep@Cord@absl@@QEAAXPEAUCordRep@cord_internal@3@W4MethodIdentifier@CordzUpdateTracker@53@@Z
     ?EmptyString@Status@absl@@CAPEBV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@XZ
@@ -1764,7 +1823,6 @@
     ?Find@ByChar@absl@@QEBA?AVstring_view@2@V32@_K@Z
     ?Find@ByLength@absl@@QEBA?AVstring_view@2@V32@_K@Z
     ?Find@ByString@absl@@QEBA?AVstring_view@2@V32@_K@Z
-    ?Find@CordRepRing@cord_internal@absl@@QEBA?AUPosition@123@I_K@Z
     ?Find@CordRepRing@cord_internal@absl@@QEBA?AUPosition@123@_K@Z
     ?FindFlatStartPiece@InlineRep@Cord@absl@@QEBA?AVstring_view@3@XZ
     ?FindPath@GraphCycles@synchronization_internal@absl@@QEBAHUGraphId@23@0HQEAU423@@Z
@@ -1841,14 +1899,7 @@
     ?FromUniversal@absl@@YA?AVTime@1@_J@Z
     ?FromUnixDuration@time_internal@absl@@YA?AVTime@2@VDuration@2@@Z
     ?FromUnixSeconds@cctz@time_internal@absl@@YA?AV?$time_point@Vsystem_clock@chrono@__1@std@@V?$duration@_JV?$ratio@$00$00@__1@std@@@234@@chrono@__1@std@@_J@Z
-    ?Get@Refcount@cord_internal@absl@@QEBAHXZ
-    ?GetAllocPtr@?$Storage@H$0CP@V?$allocator@H@__1@std@@@inlined_vector_internal@absl@@QEAAPEAV?$allocator@H@__1@std@@XZ
-    ?GetAllocPtr@?$Storage@PEAUCordRep@cord_internal@absl@@$01V?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@@inlined_vector_internal@absl@@QEAAPEAV?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@XZ
-    ?GetAllocPtr@?$Storage@PEAUCordRep@cord_internal@absl@@$0CP@V?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@@inlined_vector_internal@absl@@QEAAPEAV?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@XZ
-    ?GetAllocPtr@?$Storage@PEBUCordRep@cord_internal@absl@@$0CP@V?$allocator@PEBUCordRep@cord_internal@absl@@@__1@std@@@inlined_vector_internal@absl@@QEAAPEAV?$allocator@PEBUCordRep@cord_internal@absl@@@__1@std@@XZ
-    ?GetAllocPtr@?$Storage@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__1@std@@@inlined_vector_internal@absl@@QEAAPEAV?$allocator@UPayload@status_internal@absl@@@__1@std@@XZ
-    ?GetAllocPtr@?$Storage@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__1@std@@@inlined_vector_internal@absl@@QEBAPEBV?$allocator@UPayload@status_internal@absl@@@__1@std@@XZ
-    ?GetAllocPtr@?$Storage@USubRange@absl@@$0CP@V?$allocator@USubRange@absl@@@__1@std@@@inlined_vector_internal@absl@@QEAAPEAV?$allocator@USubRange@absl@@@__1@std@@XZ
+    ?Get@RefcountAndFlags@cord_internal@absl@@QEBAHXZ
     ?GetAllocatedCapacity@?$Storage@H$0CP@V?$allocator@H@__1@std@@@inlined_vector_internal@absl@@QEBA_KXZ
     ?GetAllocatedCapacity@?$Storage@PEAUCordRep@cord_internal@absl@@$01V?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@@inlined_vector_internal@absl@@QEBA_KXZ
     ?GetAllocatedCapacity@?$Storage@PEAUCordRep@cord_internal@absl@@$0CP@V?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@@inlined_vector_internal@absl@@QEBA_KXZ
@@ -1867,13 +1918,23 @@
     ?GetAllocator@?$AllocationTransaction@V?$allocator@PEBUCordRep@cord_internal@absl@@@__1@std@@@inlined_vector_internal@absl@@QEAAAEAV?$allocator@PEBUCordRep@cord_internal@absl@@@__1@std@@XZ
     ?GetAllocator@?$AllocationTransaction@V?$allocator@UPayload@status_internal@absl@@@__1@std@@@inlined_vector_internal@absl@@QEAAAEAV?$allocator@UPayload@status_internal@absl@@@__1@std@@XZ
     ?GetAllocator@?$AllocationTransaction@V?$allocator@USubRange@absl@@@__1@std@@@inlined_vector_internal@absl@@QEAAAEAV?$allocator@USubRange@absl@@@__1@std@@XZ
+    ?GetAllocator@?$Storage@H$0CP@V?$allocator@H@__1@std@@@inlined_vector_internal@absl@@QEAAAEAV?$allocator@H@__1@std@@XZ
+    ?GetAllocator@?$Storage@PEAUCordRep@cord_internal@absl@@$01V?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@@inlined_vector_internal@absl@@QEAAAEAV?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@XZ
+    ?GetAllocator@?$Storage@PEAUCordRep@cord_internal@absl@@$0CP@V?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@@inlined_vector_internal@absl@@QEAAAEAV?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@XZ
+    ?GetAllocator@?$Storage@PEBUCordRep@cord_internal@absl@@$0CP@V?$allocator@PEBUCordRep@cord_internal@absl@@@__1@std@@@inlined_vector_internal@absl@@QEAAAEAV?$allocator@PEBUCordRep@cord_internal@absl@@@__1@std@@XZ
+    ?GetAllocator@?$Storage@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__1@std@@@inlined_vector_internal@absl@@QEAAAEAV?$allocator@UPayload@status_internal@absl@@@__1@std@@XZ
+    ?GetAllocator@?$Storage@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__1@std@@@inlined_vector_internal@absl@@QEBAAEBV?$allocator@UPayload@status_internal@absl@@@__1@std@@XZ
+    ?GetAllocator@?$Storage@USubRange@absl@@$0CP@V?$allocator@USubRange@absl@@@__1@std@@@inlined_vector_internal@absl@@QEAAAEAV?$allocator@USubRange@absl@@@__1@std@@XZ
+    ?GetAppendBuffer@CordRepBtree@cord_internal@absl@@QEAA?AV?$Span@D@3@_K@Z
     ?GetAppendBuffer@CordRepRing@cord_internal@absl@@QEAA?AV?$Span@D@3@_K@Z
+    ?GetAppendBufferSlow@CordRepBtree@cord_internal@absl@@AEAA?AV?$Span@D@3@_K@Z
     ?GetCachedTID@base_internal@absl@@YAIXZ
     ?GetCapacity@?$AllocationTransaction@V?$allocator@H@__1@std@@@inlined_vector_internal@absl@@QEAAAEA_KXZ
     ?GetCapacity@?$AllocationTransaction@V?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@@inlined_vector_internal@absl@@QEAAAEA_KXZ
     ?GetCapacity@?$AllocationTransaction@V?$allocator@PEBUCordRep@cord_internal@absl@@@__1@std@@@inlined_vector_internal@absl@@QEAAAEA_KXZ
     ?GetCapacity@?$AllocationTransaction@V?$allocator@UPayload@status_internal@absl@@@__1@std@@@inlined_vector_internal@absl@@QEAAAEA_KXZ
     ?GetCapacity@?$AllocationTransaction@V?$allocator@USubRange@absl@@@__1@std@@@inlined_vector_internal@absl@@QEAAAEA_KXZ
+    ?GetCharacter@CordRepBtree@cord_internal@absl@@QEBAD_K@Z
     ?GetCharacter@CordRepRing@cord_internal@absl@@QEBAD_K@Z
     ?GetCond@WinHelper@Waiter@synchronization_internal@absl@@SAPEAU_RTL_CONDITION_VARIABLE@@PEAV234@@Z
     ?GetCordzStatistics@CordzInfo@cord_internal@absl@@QEBA?AUCordzStatistics@23@XZ
@@ -1957,28 +2018,35 @@
     ?GetYearDay@absl@@YAHV?$civil_time@Usecond_tag@time_internal@absl@@@detail@cctz@time_internal@1@@Z
     ?Global@HashtablezSampler@container_internal@absl@@SAAEAV123@XZ
     ?GuaranteedEqual@Condition@absl@@SA_NPEBV12@0@Z
-    ?H1@container_internal@absl@@YA_K_KPEBC@Z
+    ?H1@container_internal@absl@@YA_K_KPEBW4ctrl_t@12@@Z
     ?HandleInvalidStatusCtorArg@Helper@internal_statusor@absl@@SAXPEAVStatus@3@@Z
     ?HasBeenNotifiedInternal@Notification@absl@@CA_NPEBU?$atomic@_N@__1@std@@@Z
     ?HasEdge@GraphCycles@synchronization_internal@absl@@QEBA_NUGraphId@23@0@Z
     ?HasNode@GraphCycles@synchronization_internal@absl@@QEAA_NUGraphId@23@@Z
-    ?HashSeed@container_internal@absl@@YA_KPEBC@Z
+    ?HashSeed@container_internal@absl@@YA_KPEBW4ctrl_t@12@@Z
     ?Head@CordzInfo@cord_internal@absl@@SAPEAV123@AEBVCordzSnapshot@23@@Z
     ?HexStringToBytes@absl@@YA?AV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@Vstring_view@1@@Z
     ?HideMask@base_internal@absl@@YA_KXZ
-    ?Hours@absl@@YA?AVDuration@1@_J@Z
+    ?HighestBitSet@?$BitMask@I$0BA@$0A@@container_internal@absl@@QEBAIXZ
     ?IDivDuration@absl@@YA_JVDuration@1@0PEAV21@@Z
     ?IDivDuration@time_internal@absl@@YA_J_NVDuration@2@1PEAV32@@Z
     ?In@Time@absl@@QEBA?AUBreakdown@12@VTimeZone@2@@Z
     ?InMillisecondsFromNow@KernelTimeout@synchronization_internal@absl@@AEBAKXZ
-    ?Increment@Refcount@cord_internal@absl@@QEAAXXZ
+    ?Increment@RefcountAndFlags@cord_internal@absl@@QEAAXXZ
     ?IncrementSynchSem@Mutex@absl@@CAXPEAV12@PEAUPerThreadSynch@base_internal@2@@Z
+    ?IndexBefore@CordRepBtree@cord_internal@absl@@AEBA?AUPosition@123@U4123@_K@Z
+    ?IndexBeyond@CordRepBtree@cord_internal@absl@@AEBA?AUPosition@123@_K@Z
+    ?IndexOf@CordRepBtree@cord_internal@absl@@AEBA?AUPosition@123@_K@Z
     ?InfiniteDuration@absl@@YA?AVDuration@1@XZ
     ?InfiniteFuture@absl@@YA?AVTime@1@XZ
     ?InfinitePast@absl@@YA?AVTime@1@XZ
+    ?Init@CordRepBtreeReader@cord_internal@absl@@QEAA?AVstring_view@3@PEAVCordRepBtree@23@@Z
     ?Init@PerThreadSem@synchronization_internal@absl@@CAXPEAUThreadIdentity@base_internal@3@@Z
+    ?InitFirst@CordRepBtreeNavigator@cord_internal@absl@@QEAAPEAUCordRep@23@PEAVCordRepBtree@23@@Z
     ?InitFrom@?$Storage@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__1@std@@@inlined_vector_internal@absl@@QEAAXAEBV123@@Z
+    ?InitInstance@CordRepBtree@cord_internal@absl@@AEAAXH_K0@Z
     ?InitTree@ChunkIterator@Cord@absl@@AEAAXPEAUCordRep@cord_internal@3@@Z
+    ?InitWhat@BadStatusOrAccess@absl@@AEBAXXZ
     ?Initialize@ExponentialBiased@base_internal@absl@@AEAAXXZ
     ?InitializeCordRepExternal@cord_internal@absl@@YAXVstring_view@2@PEAUCordRepExternal@12@@Z
     ?InitializeData@Storage@?$FixedArray@PEAUCordRep@cord_internal@absl@@$0?0V?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@@absl@@AEAAPEAPEAUCordRep@cord_internal@3@XZ
@@ -1997,31 +2065,39 @@
     ?InvalidGraphId@synchronization_internal@absl@@YA?AUGraphId@12@XZ
     ?IsAborted@absl@@YA_NAEBVStatus@1@@Z
     ?IsAlreadyExists@absl@@YA_NAEBVStatus@1@@Z
+    ?IsBtree@CordRep@cord_internal@absl@@QEBA_NXZ
     ?IsCancelled@absl@@YA_NAEBVStatus@1@@Z
+    ?IsConcat@CordRep@cord_internal@absl@@QEBA_NXZ
     ?IsCooperative@SpinLock@base_internal@absl@@CA_NW4SchedulingMode@23@@Z
+    ?IsDataEdge@CordRepBtree@cord_internal@absl@@SA_NPEBUCordRep@23@@Z
     ?IsDataLoss@absl@@YA_NAEBVStatus@1@@Z
     ?IsDeadlineExceeded@absl@@YA_NAEBVStatus@1@@Z
     ?IsEmpty@Queue@CordzHandle@cord_internal@absl@@QEBA_NXZ
+    ?IsExternal@CordRep@cord_internal@absl@@QEBA_NXZ
     ?IsFailedPrecondition@absl@@YA_NAEBVStatus@1@@Z
-    ?IsFlat@CordRepRing@cord_internal@absl@@QEBA_NPEAVstring_view@3@@Z
-    ?IsFlat@CordRepRing@cord_internal@absl@@QEBA_N_K0PEAVstring_view@3@@Z
-    ?IsImmortal@Refcount@cord_internal@absl@@QEBA_NXZ
+    ?IsFlat@CordRep@cord_internal@absl@@QEBA_NXZ
+    ?IsFlat@CordRepBtree@cord_internal@absl@@QEBA_NPEAVstring_view@3@@Z
+    ?IsFlat@CordRepBtree@cord_internal@absl@@QEBA_N_K0PEAVstring_view@3@@Z
+    ?IsImmortal@RefcountAndFlags@cord_internal@absl@@QEBA_NXZ
     ?IsInfiniteDuration@time_internal@absl@@YA_NVDuration@2@@Z
     ?IsInlined@Status@absl@@CA_N_K@Z
     ?IsInternal@absl@@YA_NAEBVStatus@1@@Z
     ?IsInvalidArgument@absl@@YA_NAEBVStatus@1@@Z
     ?IsMovedFrom@Status@absl@@CA_N_K@Z
     ?IsNotFound@absl@@YA_NAEBVStatus@1@@Z
-    ?IsOne@Refcount@cord_internal@absl@@QEAA_NXZ
+    ?IsOne@RefcountAndFlags@cord_internal@absl@@QEAA_NXZ
     ?IsOutOfRange@absl@@YA_NAEBVStatus@1@@Z
     ?IsPermissionDenied@absl@@YA_NAEBVStatus@1@@Z
     ?IsReachable@GraphCycles@synchronization_internal@absl@@QEBA_NUGraphId@23@0@Z
     ?IsResourceExhausted@absl@@YA_NAEBVStatus@1@@Z
+    ?IsRing@CordRep@cord_internal@absl@@QEBA_NXZ
     ?IsSame@InlineRep@Cord@absl@@QEBA_NAEBV123@@Z
+    ?IsSubstring@CordRep@cord_internal@absl@@QEBA_NXZ
     ?IsUnauthenticated@absl@@YA_NAEBVStatus@1@@Z
     ?IsUnavailable@absl@@YA_NAEBVStatus@1@@Z
     ?IsUnimplemented@absl@@YA_NAEBVStatus@1@@Z
     ?IsUnknown@absl@@YA_NAEBVStatus@1@@Z
+    ?IsValid@CordRepBtree@cord_internal@absl@@SA_NPEBV123@_N@Z
     ?IsValid@CordRepRing@cord_internal@absl@@QEBA_NAEAV?$basic_ostream@DU?$char_traits@D@__1@std@@@__1@std@@@Z
     ?IsValidCapacity@container_internal@absl@@YA_N_K@Z
     ?IsValidIndex@CordRepRing@cord_internal@absl@@AEBA_NI@Z
@@ -2051,6 +2127,9 @@
     ?LogSeverityName@absl@@YAPEBDW4LogSeverity@1@@Z
     ?LossyAdd@CordzUpdateTracker@cord_internal@absl@@QEAAXAEBV123@@Z
     ?LossyAdd@CordzUpdateTracker@cord_internal@absl@@QEAAXW4MethodIdentifier@123@_J@Z
+    ?LowLevelHash@hash_internal@absl@@YA_KPEBX_K1QEB_K@Z
+    ?LowLevelHashImpl@MixingHashState@hash_internal@absl@@CA_KPEBE_K@Z
+    ?LowestBitSet@?$BitMask@I$0BA@$0A@@container_internal@absl@@QEBAIXZ
     ?MakeConcat@CordForest@absl@@AEAAPEAUCordRep@cord_internal@2@PEAU342@0@Z
     ?MakeDuration@time_internal@absl@@YA?AVDuration@2@_J0@Z
     ?MakeDuration@time_internal@absl@@YA?AVDuration@2@_JI@Z
@@ -2069,14 +2148,13 @@
     ?MakeTime@TimeZoneLibC@cctz@time_internal@absl@@UEBA?AUcivil_lookup@time_zone@234@AEBV?$civil_time@Usecond_tag@detail@cctz@time_internal@absl@@@detail@234@@Z
     ?MakeUint128@absl@@YA?AVuint128@1@_K0@Z
     ?MapToLocalCode@status_internal@absl@@YA?AW4StatusCode@2@H@Z
+    ?MatchEmptyOrDeleted@GroupSse2Impl@container_internal@absl@@QEBA?AV?$BitMask@I$0BA@$0A@@23@XZ
     ?MatchesConversions@ParsedFormatBase@str_format_internal@absl@@AEBA_N_NV?$initializer_list@W4FormatConversionCharSet@absl@@@std@@@Z
     ?MaxFlatLength@CordTestAccess@strings_internal@absl@@SA_KXZ
     ?MaybeTrackCordImpl@CordzInfo@cord_internal@absl@@CAXAEAVInlineData@23@AEBV423@W4MethodIdentifier@CordzUpdateTracker@23@@Z
     ?MemoryUsageAux@Cord@absl@@CA_KPEBUCordRep@cord_internal@2@@Z
-    ?Microseconds@absl@@YA?AVDuration@1@_J@Z
-    ?Milliseconds@absl@@YA?AVDuration@1@_J@Z
+    ?MergeTrees@CordRepBtree@cord_internal@absl@@CAPEAV123@PEAV123@0@Z
     ?Min@string_view@absl@@CA_K_K0@Z
-    ?Minutes@absl@@YA?AVDuration@1@_J@Z
     ?MovedFromRep@Status@absl@@CA_KXZ
     ?MovedFromString@Status@absl@@CAPEBV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@XZ
     ?MultiplyBy@?$BigUnsigned@$03@strings_internal@absl@@AEAAXHPEBI@Z
@@ -2094,13 +2172,16 @@
     ?Mutable@CordRepRing@cord_internal@absl@@CAPEAV123@PEAV123@_K@Z
     ?MutexDelay@synchronization_internal@absl@@YAHHH@Z
     ?Name@Impl@time_zone@cctz@time_internal@absl@@QEBAAEBV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@XZ
-    ?Nanoseconds@absl@@YA?AVDuration@1@_J@Z
     ?NegateAndSubtractOne@time_internal@absl@@YA_J_J@Z
     ?Never@KernelTimeout@synchronization_internal@absl@@SA?AV123@XZ
+    ?New@CordRepBtree@cord_internal@absl@@SAPEAV123@H@Z
+    ?New@CordRepBtree@cord_internal@absl@@SAPEAV123@PEAUCordRep@23@@Z
+    ?New@CordRepBtree@cord_internal@absl@@SAPEAV123@PEAV123@0@Z
     ?New@CordRepFlat@cord_internal@absl@@SAPEAU123@_K@Z
     ?New@CordRepRing@cord_internal@absl@@CAPEAV123@_K0@Z
     ?NewArena@LowLevelAlloc@base_internal@absl@@SAPEAUArena@123@H@Z
-    ?Next@CordRepRingReader@cord_internal@absl@@QEAA?AVstring_view@3@XZ
+    ?Next@CordRepBtreeNavigator@cord_internal@absl@@QEAAPEAUCordRep@23@XZ
+    ?Next@CordRepBtreeReader@cord_internal@absl@@QEAA?AVstring_view@3@XZ
     ?Next@CordzInfo@cord_internal@absl@@QEBAPEAV123@AEBVCordzSnapshot@23@@Z
     ?NextCapacity@?$Storage@H$0CP@V?$allocator@H@__1@std@@@inlined_vector_internal@absl@@SA_K_K@Z
     ?NextCapacity@?$Storage@PEAUCordRep@cord_internal@absl@@$01V?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@@inlined_vector_internal@absl@@SA_K_K@Z
@@ -2113,6 +2194,7 @@
     ?NextTransition@TimeZone@absl@@QEBA_NVTime@2@PEAUCivilTransition@12@@Z
     ?NextTransition@TimeZoneInfo@cctz@time_internal@absl@@UEBA_NAEBV?$time_point@Vsystem_clock@chrono@__1@std@@V?$duration@_JV?$ratio@$00$00@__1@std@@@234@@chrono@__1@std@@PEAUcivil_transition@time_zone@234@@Z
     ?NextTransition@TimeZoneLibC@cctz@time_internal@absl@@UEBA_NAEBV?$time_point@Vsystem_clock@chrono@__1@std@@V?$duration@_JV?$ratio@$00$00@__1@std@@@234@@chrono@__1@std@@PEAUcivil_transition@time_zone@234@@Z
+    ?NextUp@CordRepBtreeNavigator@cord_internal@absl@@AEAAPEAUCordRep@23@XZ
     ?NominalCPUFrequency@base_internal@absl@@YANXZ
     ?NormalizeLogSeverity@absl@@YA?AW4LogSeverity@1@W421@@Z
     ?NotFoundError@absl@@YA?AVStatus@1@Vstring_view@1@@Z
@@ -2158,10 +2240,13 @@
     ?PrepareToModify@Status@absl@@AEAAXXZ
     ?Prepend@Cord@absl@@QEAAXAEBV12@@Z
     ?Prepend@Cord@absl@@QEAAXVstring_view@2@@Z
+    ?Prepend@CordRepBtree@cord_internal@absl@@SAPEAV123@PEAV123@PEAUCordRep@23@@Z
+    ?Prepend@CordRepBtree@cord_internal@absl@@SAPEAV123@PEAV123@Vstring_view@3@_K@Z
     ?Prepend@CordRepRing@cord_internal@absl@@SAPEAV123@PEAV123@PEAUCordRep@23@@Z
     ?Prepend@CordRepRing@cord_internal@absl@@SAPEAV123@PEAV123@Vstring_view@3@_K@Z
     ?PrependLeaf@CordRepRing@cord_internal@absl@@CAPEAV123@PEAV123@PEAUCordRep@23@_K2@Z
     ?PrependNode@CordForest@absl@@AEAAPEAUCordRep@cord_internal@2@PEAU342@0@Z
+    ?PrependSlow@CordRepBtree@cord_internal@absl@@CAPEAV123@PEAV123@PEAUCordRep@23@@Z
     ?PrependSlow@CordRepRing@cord_internal@absl@@CAPEAV123@PEAV123@PEAUCordRep@23@@Z
     ?PrependTree@InlineRep@Cord@absl@@QEAAXPEAUCordRep@cord_internal@3@W4MethodIdentifier@CordzUpdateTracker@53@@Z
     ?PrependTreeToInlined@InlineRep@Cord@absl@@QEAAXPEAUCordRep@cord_internal@3@W4MethodIdentifier@CordzUpdateTracker@53@@Z
@@ -2182,6 +2267,8 @@
     ?Read1To3@MixingHashState@hash_internal@absl@@CAIPEBE_K@Z
     ?Read4To8@MixingHashState@hash_internal@absl@@CA_KPEBE_K@Z
     ?Read9To16@MixingHashState@hash_internal@absl@@CA?AU?$pair@_K_K@__1@std@@PEBE_K@Z
+    ?Read@CordRepBtreeNavigator@cord_internal@absl@@QEAA?AUReadResult@123@_K0@Z
+    ?Read@CordRepBtreeReader@cord_internal@absl@@QEAA?AVstring_view@3@_K0AEAPEAUCordRep@23@@Z
     ?ReadDigits@?$BigUnsigned@$03@strings_internal@absl@@AEAAHPEBD0H@Z
     ?ReadDigits@?$BigUnsigned@$0FE@@strings_internal@absl@@AEAAHPEBD0H@Z
     ?ReadFloatMantissa@?$BigUnsigned@$03@strings_internal@absl@@QEAAHAEBUParsedFloat@23@H@Z
@@ -2195,6 +2282,7 @@
     ?ReclaimThreadIdentity@synchronization_internal@absl@@YAXPEAX@Z
     ?RecordInsertSlow@container_internal@absl@@YAXPEAUHashtablezInfo@12@_K1@Z
     ?Ref@CordRep@cord_internal@absl@@SAPEAU123@PEAU123@@Z
+    ?Ref@Status@absl@@CAX_K@Z
     ?RefCordRep@CordzInfo@cord_internal@absl@@QEBAPEAUCordRep@23@XZ
     ?Register@CycleClockSource@base_internal@absl@@CAXP6A_JXZ@Z
     ?Register@HashtablezSampler@container_internal@absl@@QEAAPEAUHashtablezInfo@23@XZ
@@ -2222,7 +2310,6 @@
     ?Reset@?$AllocationTransaction@V?$allocator@PEBUCordRep@cord_internal@absl@@@__1@std@@@inlined_vector_internal@absl@@QEAAXXZ
     ?Reset@?$AllocationTransaction@V?$allocator@UPayload@status_internal@absl@@@__1@std@@@inlined_vector_internal@absl@@QEAAXXZ
     ?Reset@?$AllocationTransaction@V?$allocator@USubRange@absl@@@__1@std@@@inlined_vector_internal@absl@@QEAAXXZ
-    ?Reset@CordRepRingReader@cord_internal@absl@@QEAA?AVstring_view@3@PEAVCordRepRing@23@@Z
     ?ResetToBuiltinUTC@TimeZoneInfo@cctz@time_internal@absl@@AEAA_NAEBV?$duration@_JV?$ratio@$00$00@__1@std@@@chrono@__1@std@@@Z
     ?ResetToEmpty@InlineRep@Cord@absl@@AEAAXXZ
     ?Resize@?$ResizeUninitializedTraits@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@X@strings_internal@absl@@SAXPEAV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@_K@Z
@@ -2234,8 +2321,8 @@
     ?SafeToDelete@CordzHandle@cord_internal@absl@@QEBA_NXZ
     ?SafeWriteToStderr@raw_logging_internal@absl@@YAXPEBD_K@Z
     ?SampleSlow@container_internal@absl@@YAPEAUHashtablezInfo@12@PEA_J@Z
-    ?Seconds@absl@@YA?AVDuration@1@_J@Z
-    ?Seek@CordRepRingReader@cord_internal@absl@@QEAA?AVstring_view@3@_K@Z
+    ?Seek@CordRepBtreeNavigator@cord_internal@absl@@QEAA?AUPosition@123@_K@Z
+    ?Seek@CordRepBtreeReader@cord_internal@absl@@QEAA?AVstring_view@3@_K@Z
     ?SetAllocatedData@?$Storage@H$0CP@V?$allocator@H@__1@std@@@inlined_vector_internal@absl@@QEAAXPEAH_K@Z
     ?SetAllocatedData@?$Storage@PEAUCordRep@cord_internal@absl@@$01V?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@@inlined_vector_internal@absl@@QEAAXPEAPEAUCordRep@cord_internal@3@_K@Z
     ?SetAllocatedData@?$Storage@PEAUCordRep@cord_internal@absl@@$0CP@V?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@@inlined_vector_internal@absl@@QEAAXPEAPEAUCordRep@cord_internal@3@_K@Z
@@ -2272,9 +2359,11 @@
     ?SetWidth@FormatConversionSpecImplFriend@str_format_internal@absl@@SAXHPEAVFormatConversionSpecImpl@23@@Z
     ?ShiftLeft@?$BigUnsigned@$03@strings_internal@absl@@QEAAXH@Z
     ?ShiftLeft@?$BigUnsigned@$0FE@@strings_internal@absl@@QEAAXH@Z
-    ?ShouldInsertBackwards@container_internal@absl@@YA_N_KPEAC@Z
+    ?ShouldInsertBackwards@container_internal@absl@@YA_N_KPEBW4ctrl_t@12@@Z
     ?Signal@CondVar@absl@@QEAAXXZ
     ?SignalAll@CondVar@absl@@QEAAXXZ
+    ?SignedAddResult@int128_internal@absl@@YA?AVint128@2@V32@0@Z
+    ?SignedSubstructResult@int128_internal@absl@@YA?AVint128@2@V32@00@Z
     ?SimpleAtob@absl@@YA_NVstring_view@1@PEA_N@Z
     ?SimpleAtod@absl@@YA_NVstring_view@1@PEAN@Z
     ?SimpleAtof@absl@@YA_NVstring_view@1@PEAM@Z
@@ -2282,6 +2371,7 @@
     ?SizeofCordRepConcat@CordTestAccess@strings_internal@absl@@SA_KXZ
     ?SizeofCordRepExternal@CordTestAccess@strings_internal@absl@@SA_KXZ
     ?SizeofCordRepSubstring@CordTestAccess@strings_internal@absl@@SA_KXZ
+    ?Skip@CordRepBtreeNavigator@cord_internal@absl@@QEAA?AUPosition@123@_K@Z
     ?SleepFor@absl@@YAXVDuration@1@@Z
     ?SlowLock@SpinLock@base_internal@absl@@AEAAXXZ
     ?SlowUnlock@SpinLock@base_internal@absl@@AEAAXI@Z
@@ -2312,6 +2402,7 @@
     ?StrCat@absl@@YA?AV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@AEBVAlphaNum@1@000@Z
     ?StrCat@absl@@YA?AV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@AEBVAlphaNum@1@00@Z
     ?StrCat@absl@@YA?AV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@AEBVAlphaNum@1@0@Z
+    ?StrCat@absl@@YA?AV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@AEBVAlphaNum@1@@Z
     ?StrReplaceAll@absl@@YA?AV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@Vstring_view@1@V?$initializer_list@U?$pair@Vstring_view@absl@@V12@@__1@std@@@4@@Z
     ?StrReplaceAll@absl@@YAHV?$initializer_list@U?$pair@Vstring_view@absl@@V12@@__1@std@@@std@@PEAV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@3@@Z
     ?StripAsciiWhitespace@absl@@YA?AVstring_view@1@V21@@Z
@@ -2320,8 +2411,10 @@
     ?StrlenInternal@string_view@absl@@CA_KPEBD@Z
     ?SubLength@CordRepRing@cord_internal@absl@@AEAAXI_K@Z
     ?SubRing@CordRepRing@cord_internal@absl@@SAPEAV123@PEAV123@_K11@Z
+    ?SubTree@CordRepBtree@cord_internal@absl@@QEAAPEAUCordRep@23@_K0@Z
     ?Subcord@Cord@absl@@QEBA?AV12@_K0@Z
     ?SubstituteAndAppendArray@substitute_internal@absl@@YAXPEAV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@Vstring_view@2@PEBV62@_K@Z
+    ?SubstructResult@int128_internal@absl@@YA?AVuint128@2@V32@00@Z
     ?SubtractSize@?$Storage@H$0CP@V?$allocator@H@__1@std@@@inlined_vector_internal@absl@@QEAAX_K@Z
     ?SubtractSize@?$Storage@PEAUCordRep@cord_internal@absl@@$01V?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@@inlined_vector_internal@absl@@QEAAX_K@Z
     ?SubtractSize@?$Storage@PEAUCordRep@cord_internal@absl@@$0CP@V?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@@inlined_vector_internal@absl@@QEAAX_K@Z
@@ -2389,6 +2482,7 @@
     ?ToInt64Minutes@absl@@YA_JVDuration@1@@Z
     ?ToInt64Nanoseconds@absl@@YA_JVDuration@1@@Z
     ?ToInt64Seconds@absl@@YA_JVDuration@1@@Z
+    ?ToOpResult@CordRepBtree@cord_internal@absl@@AEAA?AUOpResult@123@_N@Z
     ?ToString@?$BigUnsigned@$03@strings_internal@absl@@QEBA?AV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@XZ
     ?ToString@?$BigUnsigned@$0FE@@strings_internal@absl@@QEBA?AV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@XZ
     ?ToString@Status@absl@@QEBA?AV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@W4StatusToStringMode@2@@Z
@@ -2493,8 +2587,6 @@
     ?Write@BufferRawSink@str_format_internal@absl@@QEAAXVstring_view@3@@Z
     ?Write@FILERawSink@str_format_internal@absl@@QEAAXVstring_view@3@@Z
     ?Write@FormatRawSinkImpl@str_format_internal@absl@@QEAAXVstring_view@3@@Z
-    ?Wyhash@hash_internal@absl@@YA_KPEBX_K1QEB_K@Z
-    ?WyhashImpl@MixingHashState@hash_internal@absl@@CA_KPEBE_K@Z
     ?ZeroDuration@absl@@YA?AVDuration@1@XZ
     ?__add_back_capacity@?$deque@PEBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@@__1@std@@AEAAXXZ
     ?__addr@?$__temp_value@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@__1@std@@@__1@std@@QEAAPEAUTransition@cctz@time_internal@absl@@XZ
@@ -2784,19 +2876,17 @@
     ?allocate@?$allocator@UTransitionType@cctz@time_internal@absl@@@__1@std@@QEAAPEAUTransitionType@cctz@time_internal@absl@@_K@Z
     ?allocate@?$allocator@UViableSubstitution@strings_internal@absl@@@__1@std@@QEAAPEAUViableSubstitution@strings_internal@absl@@_K@Z
     ?allocate@?$allocator@VFormatArgImpl@str_format_internal@absl@@@__1@std@@QEAAPEAVFormatArgImpl@str_format_internal@absl@@_K@Z
-    ?allocate@?$allocator_traits@V?$allocator@H@__1@std@@@absl@@SAPEAHAEAV?$allocator@H@__1@std@@_K@Z
     ?allocate@?$allocator_traits@V?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@@__1@std@@SAPEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@AEAV?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@23@_K@Z
     ?allocate@?$allocator_traits@V?$allocator@PEAU?$__hash_node_base@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@PEAX@__1@std@@@__1@std@@@__1@std@@@__1@std@@SAPEAPEAU?$__hash_node_base@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@PEAX@__1@std@@@23@AEAV?$allocator@PEAU?$__hash_node_base@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@PEAX@__1@std@@@__1@std@@@23@_K@Z
     ?allocate@?$allocator_traits@V?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@@__1@std@@SAPEAPEAUCordRep@cord_internal@absl@@AEAV?$allocator@PEAUCordRep@cord_internal@absl@@@23@_K@Z
-    ?allocate@?$allocator_traits@V?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@@absl@@SAPEAPEAUCordRep@cord_internal@2@AEAV?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@_K@Z
     ?allocate@?$allocator_traits@V?$allocator@PEAVCordzHandle@cord_internal@absl@@@__1@std@@@__1@std@@SAPEAPEAVCordzHandle@cord_internal@absl@@AEAV?$allocator@PEAVCordzHandle@cord_internal@absl@@@23@_K@Z
-    ?allocate@?$allocator_traits@V?$allocator@PEBUCordRep@cord_internal@absl@@@__1@std@@@absl@@SAPEAPEBUCordRep@cord_internal@2@AEAV?$allocator@PEBUCordRep@cord_internal@absl@@@__1@std@@_K@Z
+    ?allocate@?$allocator_traits@V?$allocator@PEBUCordRep@cord_internal@absl@@@__1@std@@@__1@std@@SAPEAPEBUCordRep@cord_internal@absl@@AEAV?$allocator@PEBUCordRep@cord_internal@absl@@@23@_K@Z
     ?allocate@?$allocator_traits@V?$allocator@PEBVCordzHandle@cord_internal@absl@@@__1@std@@@__1@std@@SAPEAPEBVCordzHandle@cord_internal@absl@@AEAV?$allocator@PEBVCordzHandle@cord_internal@absl@@@23@_K@Z
     ?allocate@?$allocator_traits@V?$allocator@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@@__1@std@@SAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@AEAV?$allocator@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@_K@Z
     ?allocate@?$allocator_traits@V?$allocator@U?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@PEAX@__1@std@@@__1@std@@@__1@std@@SAPEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@PEAX@23@AEAV?$allocator@U?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@PEAX@__1@std@@@23@_K@Z
     ?allocate@?$allocator_traits@V?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__1@std@@@__1@std@@SAPEAUConversionItem@ParsedFormatBase@str_format_internal@absl@@AEAV?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@23@_K@Z
-    ?allocate@?$allocator_traits@V?$allocator@UPayload@status_internal@absl@@@__1@std@@@absl@@SAPEAUPayload@status_internal@2@AEAV?$allocator@UPayload@status_internal@absl@@@__1@std@@_K@Z
-    ?allocate@?$allocator_traits@V?$allocator@USubRange@absl@@@__1@std@@@absl@@SAPEAUSubRange@2@AEAV?$allocator@USubRange@absl@@@__1@std@@_K@Z
+    ?allocate@?$allocator_traits@V?$allocator@UPayload@status_internal@absl@@@__1@std@@@__1@std@@SAPEAUPayload@status_internal@absl@@AEAV?$allocator@UPayload@status_internal@absl@@@23@_K@Z
+    ?allocate@?$allocator_traits@V?$allocator@USubRange@absl@@@__1@std@@@__1@std@@SAPEAUSubRange@absl@@AEAV?$allocator@USubRange@absl@@@23@_K@Z
     ?allocate@?$allocator_traits@V?$allocator@UTransition@cctz@time_internal@absl@@@__1@std@@@__1@std@@SAPEAUTransition@cctz@time_internal@absl@@AEAV?$allocator@UTransition@cctz@time_internal@absl@@@23@_K@Z
     ?allocate@?$allocator_traits@V?$allocator@UTransitionType@cctz@time_internal@absl@@@__1@std@@@__1@std@@SAPEAUTransitionType@cctz@time_internal@absl@@AEAV?$allocator@UTransitionType@cctz@time_internal@absl@@@23@_K@Z
     ?allocate@?$allocator_traits@V?$allocator@UViableSubstitution@strings_internal@absl@@@__1@std@@@__1@std@@SAPEAUViableSubstitution@strings_internal@absl@@AEAV?$allocator@UViableSubstitution@strings_internal@absl@@@23@_K@Z
@@ -2825,6 +2915,7 @@
     ?back@?$vector@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@__1@std@@@__1@std@@QEAAAEAUTransition@cctz@time_internal@absl@@XZ
     ?back@?$vector@UTransitionType@cctz@time_internal@absl@@V?$allocator@UTransitionType@cctz@time_internal@absl@@@__1@std@@@__1@std@@QEAAAEAUTransitionType@cctz@time_internal@absl@@XZ
     ?back@?$vector@UViableSubstitution@strings_internal@absl@@V?$allocator@UViableSubstitution@strings_internal@absl@@@__1@std@@@__1@std@@QEAAAEAUViableSubstitution@strings_internal@absl@@XZ
+    ?back@CordRepBtree@cord_internal@absl@@QEBA_KXZ
     ?base@?$__wrap_iter@PEAPEAVCordzHandle@cord_internal@absl@@@__1@std@@QEBAPEAPEAVCordzHandle@cord_internal@absl@@XZ
     ?base@?$__wrap_iter@PEAUTransition@cctz@time_internal@absl@@@__1@std@@QEBAPEAUTransition@cctz@time_internal@absl@@XZ
     ?base@?$__wrap_iter@PEAUTransitionType@cctz@time_internal@absl@@@__1@std@@QEBAPEAUTransitionType@cctz@time_internal@absl@@XZ
@@ -2838,6 +2929,7 @@
     ?begin@?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__1@std@@@absl@@QEAAPEAUPayload@status_internal@2@XZ
     ?begin@?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__1@std@@@absl@@QEBAPEBUPayload@status_internal@2@XZ
     ?begin@?$Span@$$CBVFormatArgImpl@str_format_internal@absl@@@absl@@QEBAPEBVFormatArgImpl@str_format_internal@2@XZ
+    ?begin@?$Span@QEAUCordRep@cord_internal@absl@@@absl@@QEBAPEBQEAUCordRep@cord_internal@2@XZ
     ?begin@?$__hash_table@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@V?$__unordered_map_hasher@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@23@$00@23@V?$__unordered_map_equal@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@23@$00@23@V?$allocator@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@@23@@__1@std@@QEAA?AV?$__hash_iterator@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@PEAX@__1@std@@@23@XZ
     ?begin@?$__split_buffer@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@@__1@std@@QEAAPEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@XZ
     ?begin@?$initializer_list@PEAUCordRep@cord_internal@absl@@@std@@QEBAPEBQEAUCordRep@cord_internal@absl@@XZ
@@ -2851,8 +2943,13 @@
     ?begin@?$vector@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@__1@std@@@__1@std@@QEAA?AV?$__wrap_iter@PEAUTransition@cctz@time_internal@absl@@@23@XZ
     ?begin@?$vector@UTransitionType@cctz@time_internal@absl@@V?$allocator@UTransitionType@cctz@time_internal@absl@@@__1@std@@@__1@std@@QEAA?AV?$__wrap_iter@PEAUTransitionType@cctz@time_internal@absl@@@23@XZ
     ?begin@ChunkRange@Cord@absl@@QEBA?AVChunkIterator@23@XZ
+    ?begin@CordRepBtree@cord_internal@absl@@QEBA_KXZ
     ?begin@Storage@?$FixedArray@PEAUCordRep@cord_internal@absl@@$0?0V?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@@absl@@QEBAPEAPEAUCordRep@cord_internal@3@XZ
     ?begin@string_view@absl@@QEBAPEBDXZ
+    ?btree@CordRep@cord_internal@absl@@QEAAPEAVCordRepBtree@23@XZ
+    ?btree@CordRep@cord_internal@absl@@QEBAPEBVCordRepBtree@23@XZ
+    ?btree@CordRepBtreeNavigator@cord_internal@absl@@QEBAPEAVCordRepBtree@23@XZ
+    ?btree@CordRepBtreeReader@cord_internal@absl@@QEBAPEAVCordRepBtree@23@XZ
     ?bucket_count@?$__hash_table@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@V?$__unordered_map_hasher@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@23@$00@23@V?$__unordered_map_equal@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@23@$00@23@V?$allocator@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@@23@@__1@std@@QEBA_KXZ
     ?capacity@?$__split_buffer@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@AEAV?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@@__1@std@@QEBA_KXZ
     ?capacity@?$__split_buffer@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@@__1@std@@QEBA_KXZ
@@ -2879,6 +2976,7 @@
     ?capacity@?$vector@UTransitionType@cctz@time_internal@absl@@V?$allocator@UTransitionType@cctz@time_internal@absl@@@__1@std@@@__1@std@@QEBA_KXZ
     ?capacity@?$vector@UViableSubstitution@strings_internal@absl@@V?$allocator@UViableSubstitution@strings_internal@absl@@@__1@std@@@__1@std@@QEBA_KXZ
     ?capacity@?$vector@VFormatArgImpl@str_format_internal@absl@@V?$allocator@VFormatArgImpl@str_format_internal@absl@@@__1@std@@@__1@std@@QEBA_KXZ
+    ?capacity@CordRepBtree@cord_internal@absl@@QEBA_KXZ
     ?capacity@CordRepRing@cord_internal@absl@@QEBAIXZ
     ?chunk_begin@Cord@absl@@QEBA?AVChunkIterator@12@XZ
     ?chunk_end@Cord@absl@@QEBA?AVChunkIterator@12@XZ
@@ -2907,7 +3005,7 @@
     ?compare_exchange_weak@?$__atomic_base@PEAUHashtablezInfo@container_internal@absl@@$0A@@__1@std@@QEAA_NAEAPEAUHashtablezInfo@container_internal@absl@@PEAU456@W4memory_order@23@2@Z
     ?concat@CordRep@cord_internal@absl@@QEAAPEAUCordRepConcat@23@XZ
     ?concat@CordRep@cord_internal@absl@@QEBAPEBUCordRepConcat@23@XZ
-    ?consumed@CordRepRingReader@cord_internal@absl@@QEBA_KXZ
+    ?consumed@CordRepBtreeReader@cord_internal@absl@@QEBA_KXZ
     ?conversion_char@FormatConversionSpecImpl@str_format_internal@absl@@QEBA?AW4FormatConversionChar@3@XZ
     ?cord_btree_enabled@cord_internal@absl@@3U?$atomic@_N@__1@std@@A
     ?cordz_info@InlineData@cord_internal@absl@@QEBAPEAVCordzInfo@23@XZ
@@ -2925,6 +3023,7 @@
     ?data@?$Span@$$CBVFormatArgImpl@str_format_internal@absl@@@absl@@QEBAPEBVFormatArgImpl@str_format_internal@2@XZ
     ?data@?$Span@D@absl@@QEBAPEADXZ
     ?data@?$Span@I@absl@@QEBAPEAIXZ
+    ?data@?$Span@QEAUCordRep@cord_internal@absl@@@absl@@QEBAPEBQEAUCordRep@cord_internal@2@XZ
     ?data@?$Span@VFormatArgImpl@str_format_internal@absl@@@absl@@QEBAPEAVFormatArgImpl@str_format_internal@2@XZ
     ?data@?$vector@PEAUCordRep@cord_internal@absl@@V?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@@__1@std@@QEBAPEBQEAUCordRep@cord_internal@absl@@XZ
     ?data@?$vector@PEAVCordzHandle@cord_internal@absl@@V?$allocator@PEAVCordzHandle@cord_internal@absl@@@__1@std@@@__1@std@@QEBAPEBQEAVCordzHandle@cord_internal@absl@@XZ
@@ -2961,19 +3060,17 @@
     ?deallocate@?$allocator@UTransitionType@cctz@time_internal@absl@@@__1@std@@QEAAXPEAUTransitionType@cctz@time_internal@absl@@_K@Z
     ?deallocate@?$allocator@UViableSubstitution@strings_internal@absl@@@__1@std@@QEAAXPEAUViableSubstitution@strings_internal@absl@@_K@Z
     ?deallocate@?$allocator@VFormatArgImpl@str_format_internal@absl@@@__1@std@@QEAAXPEAVFormatArgImpl@str_format_internal@absl@@_K@Z
-    ?deallocate@?$allocator_traits@V?$allocator@H@__1@std@@@absl@@SAXAEAV?$allocator@H@__1@std@@PEAH_K@Z
     ?deallocate@?$allocator_traits@V?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@@__1@std@@SAXAEAV?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@23@PEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@_K@Z
     ?deallocate@?$allocator_traits@V?$allocator@PEAU?$__hash_node_base@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@PEAX@__1@std@@@__1@std@@@__1@std@@@__1@std@@SAXAEAV?$allocator@PEAU?$__hash_node_base@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@PEAX@__1@std@@@__1@std@@@23@PEAPEAU?$__hash_node_base@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@PEAX@__1@std@@@23@_K@Z
     ?deallocate@?$allocator_traits@V?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@@__1@std@@SAXAEAV?$allocator@PEAUCordRep@cord_internal@absl@@@23@PEAPEAUCordRep@cord_internal@absl@@_K@Z
-    ?deallocate@?$allocator_traits@V?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@@absl@@SAXAEAV?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@PEAPEAUCordRep@cord_internal@2@_K@Z
     ?deallocate@?$allocator_traits@V?$allocator@PEAVCordzHandle@cord_internal@absl@@@__1@std@@@__1@std@@SAXAEAV?$allocator@PEAVCordzHandle@cord_internal@absl@@@23@PEAPEAVCordzHandle@cord_internal@absl@@_K@Z
-    ?deallocate@?$allocator_traits@V?$allocator@PEBUCordRep@cord_internal@absl@@@__1@std@@@absl@@SAXAEAV?$allocator@PEBUCordRep@cord_internal@absl@@@__1@std@@PEAPEBUCordRep@cord_internal@2@_K@Z
+    ?deallocate@?$allocator_traits@V?$allocator@PEBUCordRep@cord_internal@absl@@@__1@std@@@__1@std@@SAXAEAV?$allocator@PEBUCordRep@cord_internal@absl@@@23@PEAPEBUCordRep@cord_internal@absl@@_K@Z
     ?deallocate@?$allocator_traits@V?$allocator@PEBVCordzHandle@cord_internal@absl@@@__1@std@@@__1@std@@SAXAEAV?$allocator@PEBVCordzHandle@cord_internal@absl@@@23@PEAPEBVCordzHandle@cord_internal@absl@@_K@Z
     ?deallocate@?$allocator_traits@V?$allocator@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@@__1@std@@SAXAEAV?$allocator@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@_K@Z
     ?deallocate@?$allocator_traits@V?$allocator@U?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@PEAX@__1@std@@@__1@std@@@__1@std@@SAXAEAV?$allocator@U?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@PEAX@__1@std@@@23@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@PEAX@23@_K@Z
     ?deallocate@?$allocator_traits@V?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__1@std@@@__1@std@@SAXAEAV?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@23@PEAUConversionItem@ParsedFormatBase@str_format_internal@absl@@_K@Z
-    ?deallocate@?$allocator_traits@V?$allocator@UPayload@status_internal@absl@@@__1@std@@@absl@@SAXAEAV?$allocator@UPayload@status_internal@absl@@@__1@std@@PEAUPayload@status_internal@2@_K@Z
-    ?deallocate@?$allocator_traits@V?$allocator@USubRange@absl@@@__1@std@@@absl@@SAXAEAV?$allocator@USubRange@absl@@@__1@std@@PEAUSubRange@2@_K@Z
+    ?deallocate@?$allocator_traits@V?$allocator@UPayload@status_internal@absl@@@__1@std@@@__1@std@@SAXAEAV?$allocator@UPayload@status_internal@absl@@@23@PEAUPayload@status_internal@absl@@_K@Z
+    ?deallocate@?$allocator_traits@V?$allocator@USubRange@absl@@@__1@std@@@__1@std@@SAXAEAV?$allocator@USubRange@absl@@@23@PEAUSubRange@absl@@_K@Z
     ?deallocate@?$allocator_traits@V?$allocator@UTransition@cctz@time_internal@absl@@@__1@std@@@__1@std@@SAXAEAV?$allocator@UTransition@cctz@time_internal@absl@@@23@PEAUTransition@cctz@time_internal@absl@@_K@Z
     ?deallocate@?$allocator_traits@V?$allocator@UTransitionType@cctz@time_internal@absl@@@__1@std@@@__1@std@@SAXAEAV?$allocator@UTransitionType@cctz@time_internal@absl@@@23@PEAUTransitionType@cctz@time_internal@absl@@_K@Z
     ?deallocate@?$allocator_traits@V?$allocator@UViableSubstitution@strings_internal@absl@@@__1@std@@@__1@std@@SAXAEAV?$allocator@UViableSubstitution@strings_internal@absl@@@23@PEAUViableSubstitution@strings_internal@absl@@_K@Z
@@ -3017,6 +3114,7 @@
     ?end@?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__1@std@@@absl@@QEAAPEAUPayload@status_internal@2@XZ
     ?end@?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__1@std@@@absl@@QEBAPEBUPayload@status_internal@2@XZ
     ?end@?$Span@$$CBVFormatArgImpl@str_format_internal@absl@@@absl@@QEBAPEBVFormatArgImpl@str_format_internal@2@XZ
+    ?end@?$Span@QEAUCordRep@cord_internal@absl@@@absl@@QEBAPEBQEAUCordRep@cord_internal@2@XZ
     ?end@?$__deque_base@PEBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@@__1@std@@IEAA?AV?$__deque_iterator@PEBVImpl@time_zone@cctz@time_internal@absl@@PEAPEBV12345@AEAPEBV12345@PEAPEAPEBV12345@_J$0A@@23@XZ
     ?end@?$__hash_table@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@V?$__unordered_map_hasher@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@23@$00@23@V?$__unordered_map_equal@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@23@$00@23@V?$allocator@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@@23@@__1@std@@QEAA?AV?$__hash_iterator@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@PEAX@__1@std@@@23@XZ
     ?end@?$__split_buffer@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@@__1@std@@QEAAPEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@XZ
@@ -3029,6 +3127,7 @@
     ?end@?$vector@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@__1@std@@@__1@std@@QEAA?AV?$__wrap_iter@PEAUTransition@cctz@time_internal@absl@@@23@XZ
     ?end@?$vector@UTransitionType@cctz@time_internal@absl@@V?$allocator@UTransitionType@cctz@time_internal@absl@@@__1@std@@@__1@std@@QEAA?AV?$__wrap_iter@PEAUTransitionType@cctz@time_internal@absl@@@23@XZ
     ?end@ChunkRange@Cord@absl@@QEBA?AVChunkIterator@23@XZ
+    ?end@CordRepBtree@cord_internal@absl@@QEBA_KXZ
     ?end@Storage@?$FixedArray@PEAUCordRep@cord_internal@absl@@$0?0V?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@@absl@@QEBAPEAPEAUCordRep@cord_internal@3@XZ
     ?end@string_view@absl@@QEBAPEBDXZ
     ?entries@CordRepRing@cord_internal@absl@@QEBAIII@Z
@@ -3036,7 +3135,6 @@
     ?entry_begin_pos@CordRepRing@cord_internal@absl@@QEBAAEB_KI@Z
     ?entry_child@CordRepRing@cord_internal@absl@@AEAAPEAPEAUCordRep@23@XZ
     ?entry_child@CordRepRing@cord_internal@absl@@QEBAAEBQEAUCordRep@23@I@Z
-    ?entry_data@CordRepRing@cord_internal@absl@@QEBA?AVstring_view@3@I@Z
     ?entry_data_offset@CordRepRing@cord_internal@absl@@AEAAPEAIXZ
     ?entry_data_offset@CordRepRing@cord_internal@absl@@QEBAAEBII@Z
     ?entry_end_offset@CordRepRing@cord_internal@absl@@QEBA_KI@Z
@@ -3049,6 +3147,7 @@
     ?exchange@?$__atomic_base@P6AXAEBUHashtablezInfo@container_internal@absl@@@Z$0A@@__1@std@@QEAAP6AXAEBUHashtablezInfo@container_internal@absl@@@ZP6AX0@ZW4memory_order@23@@Z
     ?external@CordRep@cord_internal@absl@@QEAAPEAUCordRepExternal@23@XZ
     ?external@CordRep@cord_internal@absl@@QEBAPEBUCordRepExternal@23@XZ
+    ?fetch_add_end@CordRepBtree@cord_internal@absl@@AEAA_K_K@Z
     ?find@?$unordered_map@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@U?$hash@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@@23@@__1@std@@QEAA?AV?$__hash_map_iterator@V?$__hash_iterator@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@PEAX@__1@std@@@__1@std@@@23@AEBV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@23@@Z
     ?find@string_view@absl@@QEBA_KD_K@Z
     ?find@string_view@absl@@QEBA_KV12@_K@Z
@@ -3170,9 +3269,12 @@
     ?hash_function@?$__hash_table@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@V?$__unordered_map_hasher@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@23@$00@23@V?$__unordered_map_equal@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@23@$00@23@V?$allocator@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@@23@@__1@std@@QEAAAEAV?$__unordered_map_hasher@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@23@$00@23@XZ
     ?head@CordRepRing@cord_internal@absl@@QEBAIXZ
     ?head@Filler@CordRepRing@cord_internal@absl@@QEBAIXZ
+    ?height@CordRepBtree@cord_internal@absl@@QEBAHXZ
     ?hour@?$civil_time@Uhour_tag@detail@cctz@time_internal@absl@@@detail@cctz@time_internal@absl@@QEBAHXZ
     ?hour@?$civil_time@Usecond_tag@detail@cctz@time_internal@absl@@@detail@cctz@time_internal@absl@@QEBAHXZ
     ?hour@?$civil_time@Usecond_tag@time_internal@absl@@@detail@cctz@time_internal@absl@@QEBAHXZ
+    ?index@?$probe_seq@$0BA@@container_internal@absl@@QEBA_KXZ
+    ?index@CordRepBtree@cord_internal@absl@@QEBA_KW4EdgeType@123@@Z
     ?inline_size@InlineData@cord_internal@absl@@QEBA_KXZ
     ?inline_size@InlineRep@Cord@absl@@AEBA_KXZ
     ?is_basic@FormatConversionSpecImpl@str_format_internal@absl@@QEBA_NXZ
@@ -3184,12 +3286,13 @@
     ?is_leap_year@impl@detail@cctz@time_internal@absl@@YA_N_J@Z
     ?is_length@ConvTag@str_format_internal@absl@@QEBA_NXZ
     ?is_profiled@InlineData@cord_internal@absl@@QEBA_NXZ
+    ?is_small@container_internal@absl@@YA_N_K@Z
     ?is_snapshot@CordzHandle@cord_internal@absl@@QEBA_NXZ
     ?is_tree@InlineData@cord_internal@absl@@QEBA_NXZ
     ?is_tree@InlineRep@Cord@absl@@QEBA_NXZ
     ?key_eq@?$__hash_table@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@V?$__unordered_map_hasher@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@23@$00@23@V?$__unordered_map_equal@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@23@$00@23@V?$allocator@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@@23@@__1@std@@QEAAAEAV?$__unordered_map_equal@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@23@$00@23@XZ
     ?length@?$Span@D@absl@@QEBA_KXZ
-    ?length@CordRepRingReader@cord_internal@absl@@QEBA_KXZ
+    ?length@CordRepBtreeReader@cord_internal@absl@@QEBA_KXZ
     ?length@string_view@absl@@QEBA_KXZ
     ?load@?$__atomic_base@P6AXAEBUHashtablezInfo@container_internal@absl@@@Z$0A@@__1@std@@QEBAP6AXAEBUHashtablezInfo@container_internal@absl@@@ZW4memory_order@23@@Z
     ?load@?$__atomic_base@PEAUHashtablezInfo@container_internal@absl@@$0A@@__1@std@@QEBAPEAUHashtablezInfo@container_internal@absl@@W4memory_order@23@@Z
@@ -3254,8 +3357,11 @@
     ?n_mon@impl@detail@cctz@time_internal@absl@@YA?AUfields@2345@_J000CCC@Z
     ?n_sec@impl@detail@cctz@time_internal@absl@@YA?AUfields@2345@_J00000@Z
     ?name@time_zone@cctz@time_internal@absl@@QEBA?AV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@XZ
+    ?next@?$probe_seq@$0BA@@container_internal@absl@@QEAAXXZ
     ?next_transition@time_zone@cctz@time_internal@absl@@QEBA_NAEBV?$time_point@Vsystem_clock@chrono@__1@std@@V?$duration@_JV?$ratio@$00$00@__1@std@@@234@@chrono@__1@std@@PEAUcivil_transition@1234@@Z
     ?next_weekday@detail@cctz@time_internal@absl@@YA?AV?$civil_time@Uday_tag@detail@cctz@time_internal@absl@@@1234@V51234@W4weekday@1234@@Z
+    ?offset@?$probe_seq@$0BA@@container_internal@absl@@QEBA_KXZ
+    ?offset@?$probe_seq@$0BA@@container_internal@absl@@QEBA_K_K@Z
     ?ok@Status@absl@@QEBA_NXZ
     ?overflow@OStringStream@strings_internal@absl@@EEAAHH@Z
     ?parse@detail@cctz@time_internal@absl@@YA_NAEBV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@0AEBVtime_zone@234@PEAV?$time_point@Vsystem_clock@chrono@__1@std@@V?$duration@_JV?$ratio@$00$00@__1@std@@@234@@chrono@67@PEAV?$duration@_JV?$ratio@$00$0DINHOKEMGIAAA@@__1@std@@@chrono@67@PEAV567@@Z
@@ -3276,6 +3382,7 @@
     ?precision@FormatConversionSpecImpl@str_format_internal@absl@@QEBAHXZ
     ?prev_transition@time_zone@cctz@time_internal@absl@@QEBA_NAEBV?$time_point@Vsystem_clock@chrono@__1@std@@V?$duration@_JV?$ratio@$00$00@__1@std@@@234@@chrono@__1@std@@PEAUcivil_transition@1234@@Z
     ?prev_weekday@detail@cctz@time_internal@absl@@YA?AV?$civil_time@Uday_tag@detail@cctz@time_internal@absl@@@1234@V51234@W4weekday@1234@@Z
+    ?probe@container_internal@absl@@YA?AV?$probe_seq@$0BA@@12@PEBW4ctrl_t@12@_K1@Z
     ?push_back@?$InlinedVector@H$0CP@V?$allocator@H@__1@std@@@absl@@QEAAXAEBH@Z
     ?push_back@?$InlinedVector@PEAUCordRep@cord_internal@absl@@$01V?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@@absl@@QEAAXAEBQEAUCordRep@cord_internal@2@@Z
     ?push_back@?$InlinedVector@PEAUCordRep@cord_internal@absl@@$0CP@V?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@@absl@@QEAAX$$QEAPEAUCordRep@cord_internal@2@@Z
@@ -3304,7 +3411,6 @@
     ?release@?$unique_ptr@U?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@PEAX@__1@std@@V?$__hash_node_destructor@V?$allocator@U?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@PEAX@__1@std@@@__1@std@@@23@@__1@std@@QEAAPEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@PEAX@23@XZ
     ?release@?$unique_ptr@V?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__1@std@@@absl@@U?$default_delete@V?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__1@std@@@absl@@@__1@std@@@__1@std@@QEAAPEAV?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__1@std@@@absl@@XZ
     ?release@?$unique_ptr@VTimeZoneInfo@cctz@time_internal@absl@@U?$default_delete@VTimeZoneInfo@cctz@time_internal@absl@@@__1@std@@@__1@std@@QEAAPEAVTimeZoneInfo@cctz@time_internal@absl@@XZ
-    ?remaining@CordRepRingReader@cord_internal@absl@@QEBA_KXZ
     ?remove_prefix@InlineRep@Cord@absl@@QEAAX_K@Z
     ?remove_prefix@string_view@absl@@QEAAX_K@Z
     ?remove_suffix@string_view@absl@@QEAAX_K@Z
@@ -3328,7 +3434,6 @@
     ?rfind@string_view@absl@@QEBA_KV12@_K@Z
     ?ring@CordRep@cord_internal@absl@@QEAAPEAVCordRepRing@23@XZ
     ?ring@CordRep@cord_internal@absl@@QEBAPEBVCordRepRing@23@XZ
-    ?ring@CordRepRingReader@cord_internal@absl@@QEBAPEAVCordRepRing@23@XZ
     ?safe_strto128_base@numbers_internal@absl@@YA_NVstring_view@2@PEAVint128@2@H@Z
     ?safe_strto32_base@numbers_internal@absl@@YA_NVstring_view@2@PEAHH@Z
     ?safe_strto64_base@numbers_internal@absl@@YA_NVstring_view@2@PEA_JH@Z
@@ -3379,11 +3484,13 @@
     ?second@?$civil_time@Usecond_tag@detail@cctz@time_internal@absl@@@detail@cctz@time_internal@absl@@QEBAHXZ
     ?second@?$civil_time@Usecond_tag@time_internal@absl@@@detail@cctz@time_internal@absl@@QEBAHXZ
     ?set_arg@BoundConversion@str_format_internal@absl@@QEAAXPEBVFormatArgImpl@23@@Z
+    ?set_begin@CordRepBtree@cord_internal@absl@@AEAAX_K@Z
     ?set_cordz_info@InlineData@cord_internal@absl@@QEAAXPEAVCordzInfo@23@@Z
     ?set_cordz_mean_interval@cord_internal@absl@@YAXH@Z
     ?set_data@InlineRep@Cord@absl@@QEAAPEAD_K@Z
     ?set_data@InlineRep@Cord@absl@@QEAAXPEBD_K_N@Z
     ?set_depth@CordRepConcat@cord_internal@absl@@QEAAXE@Z
+    ?set_end@CordRepBtree@cord_internal@absl@@AEAAX_K@Z
     ?set_from_arg@InputValue@UnboundConversion@str_format_internal@absl@@QEAAXH@Z
     ?set_inline_size@InlineData@cord_internal@absl@@QEAAX_K@Z
     ?set_inline_size@InlineRep@Cord@absl@@AEAAX_K@Z
@@ -3402,6 +3509,7 @@
     ?size@?$Span@$$CBVFormatArgImpl@str_format_internal@absl@@@absl@@QEBA_KXZ
     ?size@?$Span@D@absl@@QEBA_KXZ
     ?size@?$Span@I@absl@@QEBA_KXZ
+    ?size@?$Span@QEAUCordRep@cord_internal@absl@@@absl@@QEBA_KXZ
     ?size@?$Span@VFormatArgImpl@str_format_internal@absl@@@absl@@QEBA_KXZ
     ?size@?$__bucket_list_deallocator@V?$allocator@PEAU?$__hash_node_base@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@PEAX@__1@std@@@__1@std@@@__1@std@@@__1@std@@QEAAAEA_KXZ
     ?size@?$__bucket_list_deallocator@V?$allocator@PEAU?$__hash_node_base@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@PEAX@__1@std@@@__1@std@@@__1@std@@@__1@std@@QEBA_KXZ
@@ -3423,6 +3531,7 @@
     ?size@?$vector@VFormatArgImpl@str_format_internal@absl@@V?$allocator@VFormatArgImpl@str_format_internal@absl@@@__1@std@@@__1@std@@QEBA_KXZ
     ?size@AlphaNum@absl@@QEBA_KXZ
     ?size@Cord@absl@@QEBA_KXZ
+    ?size@CordRepBtree@cord_internal@absl@@QEBA_KXZ
     ?size@InlineRep@Cord@absl@@QEBA_KXZ
     ?size@Storage@?$FixedArray@PEAUCordRep@cord_internal@absl@@$0?0V?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@@absl@@QEBA_KXZ
     ?size@string_view@absl@@QEBA_KXZ
@@ -3434,6 +3543,7 @@
     ?store@?$__atomic_base@W4OnDeadlockCycle@absl@@$0A@@__1@std@@QEAAXW4OnDeadlockCycle@absl@@W4memory_order@23@@Z
     ?store@?$__atomic_base@W4State@PerThreadSynch@base_internal@absl@@$0A@@__1@std@@QEAAXW4State@PerThreadSynch@base_internal@absl@@W4memory_order@23@@Z
     ?str@UntypedFormatSpecImpl@str_format_internal@absl@@QEBA?AVstring_view@3@XZ
+    ?sub_fetch_begin@CordRepBtree@cord_internal@absl@@AEAA_K_K@Z
     ?substr@string_view@absl@@QEBA?AV12@_K0@Z
     ?substring@CordRep@cord_internal@absl@@QEAAPEAUCordRepSubstring@23@XZ
     ?substring@CordRep@cord_internal@absl@@QEBAPEBUCordRepSubstring@23@XZ
diff --git a/third_party/abseil-cpp/symbols_x64_rel.def b/third_party/abseil-cpp/symbols_x64_rel.def
index 095b9e7..495a12f 100644
--- a/third_party/abseil-cpp/symbols_x64_rel.def
+++ b/third_party/abseil-cpp/symbols_x64_rel.def
@@ -3,6 +3,12 @@
     ??$?0V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@$0A@@Cord@absl@@QEAA@$$QEAV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@Z
     ??$?MUsecond_tag@detail@cctz@time_internal@absl@@U01234@@detail@cctz@time_internal@absl@@YA_NAEBV?$civil_time@Usecond_tag@detail@cctz@time_internal@absl@@@0123@0@Z
     ??$?RW4LogSeverity@absl@@AEBQEBDHAEAPEBD@?$AtomicHook@P6AXW4LogSeverity@absl@@PEBDHAEBV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@Z@base_internal@absl@@QEBAX$$QEAW4LogSeverity@2@AEBQEBD$$QEAHAEAPEBD@Z
+    ??$AddCordRep@$00@CordRepBtree@cord_internal@absl@@CAPEAV012@PEAV012@PEAUCordRep@12@@Z
+    ??$AddCordRep@$0A@@CordRepBtree@cord_internal@absl@@CAPEAV012@PEAV012@PEAUCordRep@12@@Z
+    ??$AddData@$00@CordRepBtree@cord_internal@absl@@AEAA?AVstring_view@2@V32@_K@Z
+    ??$AddData@$00@CordRepBtree@cord_internal@absl@@CAPEAV012@PEAV012@Vstring_view@2@_K@Z
+    ??$AddData@$0A@@CordRepBtree@cord_internal@absl@@AEAA?AVstring_view@2@V32@_K@Z
+    ??$AddData@$0A@@CordRepBtree@cord_internal@absl@@CAPEAV012@PEAV012@Vstring_view@2@_K@Z
     ??$AddRing@$00@CordRepRing@cord_internal@absl@@CAPEAV012@PEAV012@0_K1@Z
     ??$AddRing@$0A@@CordRepRing@cord_internal@absl@@CAPEAV012@PEAV012@0_K1@Z
     ??$Append@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@$0A@@Cord@absl@@QEAAX$$QEAV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@Z
@@ -62,12 +68,18 @@
     ??$GenericCompare@HVstring_view@absl@@@absl@@YAHAEBVCord@0@AEBVstring_view@0@_K@Z
     ??$GenericCompare@_NVCord@absl@@@absl@@YA_NAEBVCord@0@0_K@Z
     ??$GenericCompare@_NVstring_view@absl@@@absl@@YA_NAEBVCord@0@AEBVstring_view@0@_K@Z
+    ??$Merge@$00@CordRepBtree@cord_internal@absl@@CAPEAV012@PEAV012@0@Z
+    ??$Merge@$0A@@CordRepBtree@cord_internal@absl@@CAPEAV012@PEAV012@0@Z
+    ??$NewLeaf@$00@CordRepBtree@cord_internal@absl@@CAPEAV012@Vstring_view@2@_K@Z
+    ??$NewLeaf@$0A@@CordRepBtree@cord_internal@absl@@CAPEAV012@Vstring_view@2@_K@Z
     ??$ParseFloat@$09@strings_internal@absl@@YA?AUParsedFloat@01@PEBD0W4chars_format@1@@Z
     ??$ParseFloat@$0BA@@strings_internal@absl@@YA?AUParsedFloat@01@PEBD0W4chars_format@1@@Z
     ??$ParseFormatString@UParsedFormatConsumer@ParsedFormatBase@str_format_internal@absl@@@str_format_internal@absl@@YA_NVstring_view@1@UParsedFormatConsumer@ParsedFormatBase@01@@Z
     ??$Prepend@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@$0A@@Cord@absl@@QEAAX$$QEAV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@Z
     ??$STLStringReserveAmortized@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@strings_internal@absl@@YAXPEAV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@_K@Z
     ??$STLStringResizeUninitializedAmortized@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@strings_internal@absl@@YAXPEAV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@_K@Z
+    ??$SetEdge@$00@CordRepBtree@cord_internal@absl@@QEAA?AUOpResult@012@_NPEAUCordRep@12@_K@Z
+    ??$SetEdge@$0A@@CordRepBtree@cord_internal@absl@@QEAA?AUOpResult@012@_NPEAUCordRep@12@_K@Z
     ??$StrReplaceAll@V?$initializer_list@U?$pair@Vstring_view@absl@@V12@@__1@std@@@std@@@absl@@YA?AV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@Vstring_view@0@AEBV?$initializer_list@U?$pair@Vstring_view@absl@@V12@@__1@std@@@3@@Z
     ??$StrReplaceAll@V?$initializer_list@U?$pair@Vstring_view@absl@@V12@@__1@std@@@std@@@absl@@YAHAEBV?$initializer_list@U?$pair@Vstring_view@absl@@V12@@__1@std@@@std@@PEAV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@2@@Z
     ??$ToChronoDuration@V?$duration@JV?$ratio@$0DM@$00@__1@std@@@chrono@__1@std@@@time_internal@absl@@YA?AV?$duration@JV?$ratio@$0DM@$00@__1@std@@@chrono@__1@std@@VDuration@1@@Z
@@ -85,6 +97,7 @@
     ??$emplace_back@$$V@?$__split_buffer@UTransition@cctz@time_internal@absl@@AEAV?$allocator@UTransition@cctz@time_internal@absl@@@__1@std@@@__1@std@@QEAAXXZ
     ??$emplace_back@$$V@?$__split_buffer@UTransitionType@cctz@time_internal@absl@@AEAV?$allocator@UTransitionType@cctz@time_internal@absl@@@__1@std@@@__1@std@@QEAAXXZ
     ??$find@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@?$__hash_table@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@V?$__unordered_map_hasher@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@23@$00@23@V?$__unordered_map_equal@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@23@$00@23@V?$allocator@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@@23@@__1@std@@QEAA?AV?$__hash_iterator@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@PEAX@__1@std@@@12@AEBV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@12@@Z
+    ??$find_first_non_full@X@container_internal@absl@@YA?AUFindInfo@01@PEBW4ctrl_t@01@_K1@Z
     ??0?$BigUnsigned@$03@strings_internal@absl@@QEAA@Vstring_view@2@@Z
     ??0?$BigUnsigned@$03@strings_internal@absl@@QEAA@XZ
     ??0?$BigUnsigned@$03@strings_internal@absl@@QEAA@_K@Z
@@ -95,7 +108,6 @@
     ??0?$__split_buffer@UTransition@cctz@time_internal@absl@@AEAV?$allocator@UTransition@cctz@time_internal@absl@@@__1@std@@@__1@std@@QEAA@_K0AEAV?$allocator@UTransition@cctz@time_internal@absl@@@12@@Z
     ??0?$__split_buffer@UTransitionType@cctz@time_internal@absl@@AEAV?$allocator@UTransitionType@cctz@time_internal@absl@@@__1@std@@@__1@std@@QEAA@_K0AEAV?$allocator@UTransitionType@cctz@time_internal@absl@@@12@@Z
     ??0?$__split_buffer@UViableSubstitution@strings_internal@absl@@AEAV?$allocator@UViableSubstitution@strings_internal@absl@@@__1@std@@@__1@std@@QEAA@_K0AEAV?$allocator@UViableSubstitution@strings_internal@absl@@@12@@Z
-    ??0AlphaNum@absl@@QEAA@PEBD@Z
     ??0AlphaNum@absl@@QEAA@UDec@1@@Z
     ??0AlphaNum@absl@@QEAA@UHex@1@@Z
     ??0AlphaNum@absl@@QEAA@_K@Z
@@ -103,6 +115,8 @@
     ??0Arg@substitute_internal@absl@@QEAA@PEBX@Z
     ??0Arg@substitute_internal@absl@@QEAA@UDec@2@@Z
     ??0Arg@substitute_internal@absl@@QEAA@UHex@2@@Z
+    ??0BadStatusOrAccess@absl@@QEAA@$$QEAV01@@Z
+    ??0BadStatusOrAccess@absl@@QEAA@AEBV01@@Z
     ??0BadStatusOrAccess@absl@@QEAA@VStatus@1@@Z
     ??0BlockingCounter@absl@@QEAA@H@Z
     ??0ByAnyChar@absl@@QEAA@Vstring_view@1@@Z
@@ -147,6 +161,8 @@
     ??1bad_optional_access@absl@@UEAA@XZ
     ??1bad_variant_access@absl@@UEAA@XZ
     ??4?$optional_data@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@$0A@@optional_internal@absl@@IEAAAEAV012@$$QEAV012@@Z
+    ??4BadStatusOrAccess@absl@@QEAAAEAV01@$$QEAV01@@Z
+    ??4BadStatusOrAccess@absl@@QEAAAEAV01@AEBV01@@Z
     ??4Cord@absl@@QEAAAEAV01@Vstring_view@1@@Z
     ??6absl@@YAAEAV?$basic_ostream@DU?$char_traits@D@__1@std@@@__1@std@@AEAV123@AEBVCord@0@@Z
     ??6absl@@YAAEAV?$basic_ostream@DU?$char_traits@D@__1@std@@@__1@std@@AEAV123@AEBVStatus@0@@Z
@@ -172,6 +188,7 @@
     ??ACord@absl@@QEBAD_K@Z
     ??BCord@absl@@QEBA?AV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@XZ
     ??Bint128@absl@@QEBANXZ
+    ??EChunkIterator@Cord@absl@@QEAAAEAV012@XZ
     ??Gdetail@cctz@time_internal@absl@@YA?AV?$civil_time@Uday_tag@detail@cctz@time_internal@absl@@@0123@V40123@_J@Z
     ??Gdetail@cctz@time_internal@absl@@YA?AV?$civil_time@Usecond_tag@detail@cctz@time_internal@absl@@@0123@V40123@_J@Z
     ??Hdetail@cctz@time_internal@absl@@YA?AV?$civil_time@Uday_tag@detail@cctz@time_internal@absl@@@0123@V40123@_J@Z
@@ -201,7 +218,7 @@
     ?AddWithCarry@?$BigUnsigned@$0FE@@strings_internal@absl@@AEAAXH_K@Z
     ?AddressIsReadable@debugging_internal@absl@@YA_NPEBX@Z
     ?AdvanceAndReadBytes@ChunkIterator@Cord@absl@@AEAA?AV23@_K@Z
-    ?AdvanceBytesRing@ChunkIterator@Cord@absl@@AEAAX_K@Z
+    ?AdvanceBytesBtree@ChunkIterator@Cord@absl@@AEAAX_K@Z
     ?AdvanceBytesSlowPath@ChunkIterator@Cord@absl@@AEAAX_K@Z
     ?AdvanceStack@ChunkIterator@Cord@absl@@AEAAAEAV123@XZ
     ?Alloc@LowLevelAlloc@base_internal@absl@@SAPEAX_K@Z
@@ -209,6 +226,7 @@
     ?AlreadyExistsError@absl@@YA?AVStatus@1@Vstring_view@1@@Z
     ?Append@Cord@absl@@QEAAX$$QEAV12@@Z
     ?Append@Cord@absl@@QEAAXAEBV12@@Z
+    ?Append@CordRepBtree@cord_internal@absl@@SAPEAV123@PEAV123@Vstring_view@3@_K@Z
     ?Append@CordRepRing@cord_internal@absl@@SAPEAV123@PEAV123@PEAUCordRep@23@@Z
     ?Append@CordRepRing@cord_internal@absl@@SAPEAV123@PEAV123@Vstring_view@3@_K@Z
     ?Append@FormatSinkImpl@str_format_internal@absl@@QEAAXVstring_view@3@@Z
@@ -218,6 +236,7 @@
     ?AppendLeaf@CordRepRing@cord_internal@absl@@CAPEAV123@PEAV123@PEAUCordRep@23@_K2@Z
     ?AppendPack@str_format_internal@absl@@YAAEAV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEAV345@VUntypedFormatSpecImpl@12@V?$Span@$$CBVFormatArgImpl@str_format_internal@absl@@@2@@Z
     ?AppendPieces@strings_internal@absl@@YAXPEAV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@V?$initializer_list@Vstring_view@absl@@@5@@Z
+    ?AppendSlow@CordRepBtree@cord_internal@absl@@CAPEAV123@PEAV123@PEAUCordRep@23@@Z
     ?AppendSlow@CordRepRing@cord_internal@absl@@CAPEAV123@PEAV123@PEAUCordRep@23@@Z
     ?AppendTree@InlineRep@Cord@absl@@QEAAXPEAUCordRep@cord_internal@3@W4MethodIdentifier@CordzUpdateTracker@53@@Z
     ?AppendTreeToInlined@InlineRep@Cord@absl@@QEAAXPEAUCordRep@cord_internal@3@W4MethodIdentifier@CordzUpdateTracker@53@@Z
@@ -277,18 +296,21 @@
     ?Consume@cord_internal@absl@@YAXPEAUCordRep@12@V?$FunctionRef@$$A6AXPEAUCordRep@cord_internal@absl@@_K1@Z@2@@Z
     ?ConsumeUnboundConversion@str_format_internal@absl@@YAPEBDPEBD0PEAUUnboundConversion@12@PEAH@Z
     ?ConvertDateTime@absl@@YA?AUTimeConversion@1@_JHHHHHVTimeZone@1@@Z
-    ?ConvertDeletedToEmptyAndFullToDeleted@container_internal@absl@@YAXPEAC_K@Z
+    ?ConvertDeletedToEmptyAndFullToDeleted@container_internal@absl@@YAXPEAW4ctrl_t@12@_K@Z
     ?ConvertFloatImpl@str_format_internal@absl@@YA_NMAEBVFormatConversionSpecImpl@12@PEAVFormatSinkImpl@12@@Z
     ?ConvertFloatImpl@str_format_internal@absl@@YA_NNAEBVFormatConversionSpecImpl@12@PEAVFormatSinkImpl@12@@Z
     ?ConvertFloatImpl@str_format_internal@absl@@YA_NOAEBVFormatConversionSpecImpl@12@PEAVFormatSinkImpl@12@@Z
     ?ConvertOne@ParsedFormatConsumer@ParsedFormatBase@str_format_internal@absl@@QEAA_NAEBUUnboundConversion@34@Vstring_view@4@@Z
     ?Copy@CordRepRing@cord_internal@absl@@CAPEAV123@PEAV123@II_K@Z
     ?CopyCordToString@absl@@YAXAEBVCord@1@PEAV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@Z
+    ?CopyPrefix@CordRepBtree@cord_internal@absl@@AEAA?AUCopyResult@123@_K@Z
+    ?CopySuffix@CordRepBtree@cord_internal@absl@@AEAA?AUCopyResult@123@_K@Z
     ?CopyTo@InlineRep@Cord@absl@@QEBAXPEAV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@Z
     ?CopyToArraySlowPath@Cord@absl@@AEBAXPEAD@Z
     ?Crash@Helper@internal_statusor@absl@@SAXAEBVStatus@3@@Z
     ?Create@CordRepRing@cord_internal@absl@@SAPEAV123@PEAUCordRep@23@_K@Z
     ?CreateFromLeaf@CordRepRing@cord_internal@absl@@CAPEAV123@PEAUCordRep@23@_K11@Z
+    ?CreateSlow@CordRepBtree@cord_internal@absl@@CAPEAV123@PEAUCordRep@23@@Z
     ?CreateSlow@CordRepRing@cord_internal@absl@@CAPEAV123@PEAUCordRep@23@_K@Z
     ?CreateThreadIdentity@synchronization_internal@absl@@YAPEAUThreadIdentity@base_internal@2@XZ
     ?CurrentThreadIdentityIfPresent@base_internal@absl@@YAPEAUThreadIdentity@12@XZ
@@ -311,6 +333,8 @@
     ?Destroy@PerThreadSem@synchronization_internal@absl@@CAXPEAUThreadIdentity@base_internal@3@@Z
     ?DestroyContents@?$Storage@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__1@std@@@inlined_vector_internal@absl@@AEAAXXZ
     ?DestroyCordSlow@Cord@absl@@AEAAXXZ
+    ?DestroyLeaf@CordRepBtree@cord_internal@absl@@CAXPEAV123@_K1@Z
+    ?DestroyNonLeaf@CordRepBtree@cord_internal@absl@@CAXPEAV123@_K1@Z
     ?DiagnosticsGetDeleteQueue@CordzHandle@cord_internal@absl@@SA?AV?$vector@PEBVCordzHandle@cord_internal@absl@@V?$allocator@PEBVCordzHandle@cord_internal@absl@@@__1@std@@@__1@std@@XZ
     ?DiagnosticsGetSafeToInspectDeletedHandles@CordzHandle@cord_internal@absl@@QEAA?AV?$vector@PEBVCordzHandle@cord_internal@absl@@V?$allocator@PEBVCordzHandle@cord_internal@absl@@@__1@std@@@__1@std@@XZ
     ?DiagnosticsHandleIsSafeToInspect@CordzHandle@cord_internal@absl@@QEBA_NPEBV123@@Z
@@ -323,6 +347,9 @@
     ?DummyFunction@?$AtomicHook@P6AXPEBX_J@Z@base_internal@absl@@CAXPEBX_J@Z
     ?DummyFunction@?$AtomicHook@P6AX_J@Z@base_internal@absl@@CAX_J@Z
     ?DummyFunction@?$AtomicHook@P6A_NW4LogSeverity@absl@@PEBDHPEAPEADPEAH@Z@base_internal@absl@@CA_NW4LogSeverity@3@PEBDHPEAPEADPEAH@Z
+    ?Dump@CordRepBtree@cord_internal@absl@@SAXPEBUCordRep@23@AEAV?$basic_ostream@DU?$char_traits@D@__1@std@@@__1@std@@@Z
+    ?Dump@CordRepBtree@cord_internal@absl@@SAXPEBUCordRep@23@Vstring_view@3@AEAV?$basic_ostream@DU?$char_traits@D@__1@std@@@__1@std@@@Z
+    ?Dump@CordRepBtree@cord_internal@absl@@SAXPEBUCordRep@23@Vstring_view@3@_NAEAV?$basic_ostream@DU?$char_traits@D@__1@std@@@__1@std@@@Z
     ?DumpPCAndFrameSizesAndStackTrace@debugging_internal@absl@@YAXPEAXQEBQEAXQEAHHH_NP6AXPEBD0@Z0@Z
     ?DurationFromTimespec@absl@@YA?AVDuration@1@Utimespec@@@Z
     ?DurationFromTimeval@absl@@YA?AVDuration@1@Utimeval@@@Z
@@ -415,8 +442,11 @@
     ?FromTM@absl@@YA?AVTime@1@AEBUtm@@VTimeZone@1@@Z
     ?FromUDate@absl@@YA?AVTime@1@N@Z
     ?FromUniversal@absl@@YA?AVTime@1@_J@Z
+    ?GetAppendBuffer@CordRepBtree@cord_internal@absl@@QEAA?AV?$Span@D@3@_K@Z
     ?GetAppendBuffer@CordRepRing@cord_internal@absl@@QEAA?AV?$Span@D@3@_K@Z
+    ?GetAppendBufferSlow@CordRepBtree@cord_internal@absl@@AEAA?AV?$Span@D@3@_K@Z
     ?GetCachedTID@base_internal@absl@@YAIXZ
+    ?GetCharacter@CordRepBtree@cord_internal@absl@@QEBAD_K@Z
     ?GetCharacter@CordRepRing@cord_internal@absl@@QEBAD_K@Z
     ?GetCordzStatistics@CordzInfo@cord_internal@absl@@QEBA?AUCordzStatistics@23@XZ
     ?GetCurrentTimeNanos@absl@@YA_JXZ
@@ -455,7 +485,7 @@
     ?IncrementSynchSem@Mutex@absl@@CAXPEAV12@PEAUPerThreadSynch@base_internal@2@@Z
     ?Init@PerThreadSem@synchronization_internal@absl@@CAXPEAUThreadIdentity@base_internal@3@@Z
     ?InitFrom@?$Storage@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__1@std@@@inlined_vector_internal@absl@@QEAAXAEBV123@@Z
-    ?InitTree@ChunkIterator@Cord@absl@@AEAAXPEAUCordRep@cord_internal@3@@Z
+    ?InitWhat@BadStatusOrAccess@absl@@AEBAXXZ
     ?Initialize@ExponentialBiased@base_internal@absl@@AEAAXXZ
     ?InitializeCordRepExternal@cord_internal@absl@@YAXVstring_view@2@PEAUCordRepExternal@12@@Z
     ?InitializeSymbolizer@absl@@YAXPEBD@Z
@@ -471,6 +501,8 @@
     ?IsDataLoss@absl@@YA_NAEBVStatus@1@@Z
     ?IsDeadlineExceeded@absl@@YA_NAEBVStatus@1@@Z
     ?IsFailedPrecondition@absl@@YA_NAEBVStatus@1@@Z
+    ?IsFlat@CordRepBtree@cord_internal@absl@@QEBA_NPEAVstring_view@3@@Z
+    ?IsFlat@CordRepBtree@cord_internal@absl@@QEBA_N_K0PEAVstring_view@3@@Z
     ?IsInternal@absl@@YA_NAEBVStatus@1@@Z
     ?IsInvalidArgument@absl@@YA_NAEBVStatus@1@@Z
     ?IsNotFound@absl@@YA_NAEBVStatus@1@@Z
@@ -482,6 +514,7 @@
     ?IsUnavailable@absl@@YA_NAEBVStatus@1@@Z
     ?IsUnimplemented@absl@@YA_NAEBVStatus@1@@Z
     ?IsUnknown@absl@@YA_NAEBVStatus@1@@Z
+    ?IsValid@CordRepBtree@cord_internal@absl@@SA_NPEBV123@_N@Z
     ?IsValid@CordRepRing@cord_internal@absl@@QEBA_NAEAV?$basic_ostream@DU?$char_traits@D@__1@std@@@__1@std@@@Z
     ?Iterate@HashtablezSampler@container_internal@absl@@QEAA_JAEBV?$function@$$A6AXAEBUHashtablezInfo@container_internal@absl@@@Z@__1@std@@@Z
     ?LengthModToString@str_format_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@W4LengthMod@12@@Z
@@ -500,6 +533,8 @@
     ?LockWhen@Mutex@absl@@QEAAXAEBVCondition@2@@Z
     ?LockWhenWithDeadline@Mutex@absl@@QEAA_NAEBVCondition@2@VTime@2@@Z
     ?LockWhenWithTimeout@Mutex@absl@@QEAA_NAEBVCondition@2@VDuration@2@@Z
+    ?LowLevelHash@hash_internal@absl@@YA_KPEBX_K1QEB_K@Z
+    ?LowLevelHashImpl@MixingHashState@hash_internal@absl@@CA_KPEBE_K@Z
     ?MakeConcat@CordForest@absl@@AEAAPEAUCordRep@cord_internal@2@PEAU342@0@Z
     ?MakeNs@KernelTimeout@synchronization_internal@absl@@CA_JVTime@3@@Z
     ?MakeTime@TimeZoneInfo@cctz@time_internal@absl@@UEBA?AUcivil_lookup@time_zone@234@AEBV?$civil_time@Usecond_tag@detail@cctz@time_internal@absl@@@detail@234@@Z
@@ -509,6 +544,7 @@
     ?MaxFlatLength@CordTestAccess@strings_internal@absl@@SA_KXZ
     ?MaybeTrackCordImpl@CordzInfo@cord_internal@absl@@CAXAEAVInlineData@23@AEBV423@W4MethodIdentifier@CordzUpdateTracker@23@@Z
     ?MemoryUsageAux@Cord@absl@@CA_KPEBUCordRep@cord_internal@2@@Z
+    ?MergeTrees@CordRepBtree@cord_internal@absl@@CAPEAV123@PEAV123@0@Z
     ?MovedFromString@Status@absl@@CAPEBV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@XZ
     ?MultiplyBy@?$BigUnsigned@$03@strings_internal@absl@@AEAAXHPEBI@Z
     ?MultiplyBy@?$BigUnsigned@$03@strings_internal@absl@@QEAAXI@Z
@@ -527,7 +563,6 @@
     ?New@CordRepFlat@cord_internal@absl@@SAPEAU123@_K@Z
     ?New@CordRepRing@cord_internal@absl@@CAPEAV123@_K0@Z
     ?NewArena@LowLevelAlloc@base_internal@absl@@SAPEAUArena@123@H@Z
-    ?Next@CordRepRingReader@cord_internal@absl@@QEAA?AVstring_view@3@XZ
     ?Next@CordzInfo@cord_internal@absl@@QEBAPEAV123@AEBVCordzSnapshot@23@@Z
     ?NextTransition@TimeZone@absl@@QEBA_NVTime@2@PEAUCivilTransition@12@@Z
     ?NextTransition@TimeZoneInfo@cctz@time_internal@absl@@UEBA_NAEBV?$time_point@Vsystem_clock@chrono@__1@std@@V?$duration@_JV?$ratio@$00$00@__1@std@@@234@@chrono@__1@std@@PEAUcivil_transition@time_zone@234@@Z
@@ -566,9 +601,11 @@
     ?PrepareToModify@Status@absl@@AEAAXXZ
     ?Prepend@Cord@absl@@QEAAXAEBV12@@Z
     ?Prepend@Cord@absl@@QEAAXVstring_view@2@@Z
+    ?Prepend@CordRepBtree@cord_internal@absl@@SAPEAV123@PEAV123@Vstring_view@3@_K@Z
     ?Prepend@CordRepRing@cord_internal@absl@@SAPEAV123@PEAV123@PEAUCordRep@23@@Z
     ?Prepend@CordRepRing@cord_internal@absl@@SAPEAV123@PEAV123@Vstring_view@3@_K@Z
     ?PrependLeaf@CordRepRing@cord_internal@absl@@CAPEAV123@PEAV123@PEAUCordRep@23@_K2@Z
+    ?PrependSlow@CordRepBtree@cord_internal@absl@@CAPEAV123@PEAV123@PEAUCordRep@23@@Z
     ?PrependSlow@CordRepRing@cord_internal@absl@@CAPEAV123@PEAV123@PEAUCordRep@23@@Z
     ?PrependTree@InlineRep@Cord@absl@@QEAAXPEAUCordRep@cord_internal@3@W4MethodIdentifier@CordzUpdateTracker@53@@Z
     ?PrependTreeToInlined@InlineRep@Cord@absl@@QEAAXPEAUCordRep@cord_internal@3@W4MethodIdentifier@CordzUpdateTracker@53@@Z
@@ -583,6 +620,8 @@
     ?PutPaddedString@FormatSinkImpl@str_format_internal@absl@@QEAA_NVstring_view@3@HH_N@Z
     ?RawLog@raw_logging_internal@absl@@YAXW4LogSeverity@2@PEBDH1ZZ
     ?RawLoggingFullySupported@raw_logging_internal@absl@@YA_NXZ
+    ?Read@CordRepBtreeNavigator@cord_internal@absl@@QEAA?AUReadResult@123@_K0@Z
+    ?Read@CordRepBtreeReader@cord_internal@absl@@QEAA?AVstring_view@3@_K0AEAPEAUCordRep@23@@Z
     ?ReadDigits@?$BigUnsigned@$03@strings_internal@absl@@AEAAHPEBD0H@Z
     ?ReadDigits@?$BigUnsigned@$0FE@@strings_internal@absl@@AEAAHPEBD0H@Z
     ?ReadFloatMantissa@?$BigUnsigned@$03@strings_internal@absl@@QEAAHAEBUParsedFloat@23@H@Z
@@ -621,7 +660,7 @@
     ?SafeToDelete@CordzHandle@cord_internal@absl@@QEBA_NXZ
     ?SafeWriteToStderr@raw_logging_internal@absl@@YAXPEBD_K@Z
     ?SampleSlow@container_internal@absl@@YAPEAUHashtablezInfo@12@PEA_J@Z
-    ?Seek@CordRepRingReader@cord_internal@absl@@QEAA?AVstring_view@3@_K@Z
+    ?Seek@CordRepBtreeReader@cord_internal@absl@@QEAA?AVstring_view@3@_K@Z
     ?SetCapacityForTesting@CordRepRing@cord_internal@absl@@QEAAX_K@Z
     ?SetCurrentThreadIdentity@base_internal@absl@@YAXPEAUThreadIdentity@12@P6AXPEAX@Z@Z
     ?SetDisposeCallback@HashtablezSampler@container_internal@absl@@QEAAP6AXAEBUHashtablezInfo@23@@ZP6AX0@Z@Z
@@ -637,7 +676,7 @@
     ?SetToZero@?$BigUnsigned@$0FE@@strings_internal@absl@@QEAAXXZ
     ?ShiftLeft@?$BigUnsigned@$03@strings_internal@absl@@QEAAXH@Z
     ?ShiftLeft@?$BigUnsigned@$0FE@@strings_internal@absl@@QEAAXH@Z
-    ?ShouldInsertBackwards@container_internal@absl@@YA_N_KPEAC@Z
+    ?ShouldInsertBackwards@container_internal@absl@@YA_N_KPEBW4ctrl_t@12@@Z
     ?Signal@CondVar@absl@@QEAAXXZ
     ?SignalAll@CondVar@absl@@QEAAXXZ
     ?SimpleAtob@absl@@YA_NVstring_view@1@PEA_N@Z
@@ -647,6 +686,7 @@
     ?SizeofCordRepConcat@CordTestAccess@strings_internal@absl@@SA_KXZ
     ?SizeofCordRepExternal@CordTestAccess@strings_internal@absl@@SA_KXZ
     ?SizeofCordRepSubstring@CordTestAccess@strings_internal@absl@@SA_KXZ
+    ?Skip@CordRepBtreeNavigator@cord_internal@absl@@QEAA?AUPosition@123@_K@Z
     ?SlowLock@SpinLock@base_internal@absl@@AEAAXXZ
     ?SlowUnlock@SpinLock@base_internal@absl@@AEAAXI@Z
     ?SnprintF@str_format_internal@absl@@YAHPEAD_KVUntypedFormatSpecImpl@12@V?$Span@$$CBVFormatArgImpl@str_format_internal@absl@@@2@@Z
@@ -667,6 +707,7 @@
     ?StrReplaceAll@absl@@YAHV?$initializer_list@U?$pair@Vstring_view@absl@@V12@@__1@std@@@std@@PEAV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@3@@Z
     ?SubLength@CordRepRing@cord_internal@absl@@AEAAXI_K@Z
     ?SubRing@CordRepRing@cord_internal@absl@@SAPEAV123@PEAV123@_K11@Z
+    ?SubTree@CordRepBtree@cord_internal@absl@@QEAAPEAUCordRep@23@_K0@Z
     ?Subcord@Cord@absl@@QEBA?AV12@_K0@Z
     ?SubstituteAndAppendArray@substitute_internal@absl@@YAXPEAV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@Vstring_view@2@PEBV62@_K@Z
     ?Summarize@str_format_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@VUntypedFormatSpecImpl@12@V?$Span@$$CBVFormatArgImpl@str_format_internal@absl@@@2@@Z
@@ -777,8 +818,6 @@
     ?WebSafeBase64Unescape@absl@@YA_NVstring_view@1@PEAV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@Z
     ?Write@BufferRawSink@str_format_internal@absl@@QEAAXVstring_view@3@@Z
     ?Write@FILERawSink@str_format_internal@absl@@QEAAXVstring_view@3@@Z
-    ?Wyhash@hash_internal@absl@@YA_KPEBX_K1QEB_K@Z
-    ?WyhashImpl@MixingHashState@hash_internal@absl@@CA_KPEBE_K@Z
     ?__add_back_capacity@?$deque@PEBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@@__1@std@@AEAAXXZ
     ?__append@?$vector@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@__1@std@@@__1@std@@AEAAX_K@Z
     ?__append@?$vector@UTransitionType@cctz@time_internal@absl@@V?$allocator@UTransitionType@cctz@time_internal@absl@@@__1@std@@@__1@std@@AEAAX_K@Z
@@ -792,9 +831,11 @@
     ?__swap_out_circular_buffer@?$vector@UTransitionType@cctz@time_internal@absl@@V?$allocator@UTransitionType@cctz@time_internal@absl@@@__1@std@@@__1@std@@AEAAPEAUTransitionType@cctz@time_internal@absl@@AEAU?$__split_buffer@UTransitionType@cctz@time_internal@absl@@AEAV?$allocator@UTransitionType@cctz@time_internal@absl@@@__1@std@@@23@PEAU4567@@Z
     ?__vallocate@?$vector@PEAUCordRep@cord_internal@absl@@V?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@@__1@std@@AEAAX_K@Z
     ?__vallocate@?$vector@VFormatArgImpl@str_format_internal@absl@@V?$allocator@VFormatArgImpl@str_format_internal@absl@@@__1@std@@@__1@std@@AEAAX_K@Z
+    ?chunk_begin@Cord@absl@@QEBA?AVChunkIterator@12@XZ
     ?clear@?$__hash_table@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@V?$__unordered_map_hasher@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@23@$00@23@V?$__unordered_map_equal@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@23@$00@23@V?$allocator@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@@23@@__1@std@@QEAAXXZ
     ?code@Status@absl@@QEBA?AW4StatusCode@2@XZ
     ?cord_btree_enabled@cord_internal@absl@@3U?$atomic@_N@__1@std@@A
+    ?cord_btree_exhaustive_validation@cord_internal@absl@@3U?$atomic@_N@__1@std@@A
     ?cord_ring_buffer_enabled@cord_internal@absl@@3U?$atomic@_N@__1@std@@A
     ?day_difference@impl@detail@cctz@time_internal@absl@@YA_J_JCC0CC@Z
     ?description@time_zone@cctz@time_internal@absl@@QEBA?AV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@XZ
diff --git a/third_party/abseil-cpp/symbols_x64_rel_asan.def b/third_party/abseil-cpp/symbols_x64_rel_asan.def
index 2e437b1..7c8b094 100644
--- a/third_party/abseil-cpp/symbols_x64_rel_asan.def
+++ b/third_party/abseil-cpp/symbols_x64_rel_asan.def
@@ -3,6 +3,12 @@
     ??$?0V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@$0A@@Cord@absl@@QEAA@$$QEAV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@Z
     ??$?MUsecond_tag@detail@cctz@time_internal@absl@@U01234@@detail@cctz@time_internal@absl@@YA_NAEBV?$civil_time@Usecond_tag@detail@cctz@time_internal@absl@@@0123@0@Z
     ??$?RW4LogSeverity@absl@@AEBQEBDHAEAPEBD@?$AtomicHook@P6AXW4LogSeverity@absl@@PEBDHAEBV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@Z@base_internal@absl@@QEBAX$$QEAW4LogSeverity@2@AEBQEBD$$QEAHAEAPEBD@Z
+    ??$AddCordRep@$00@CordRepBtree@cord_internal@absl@@CAPEAV012@PEAV012@PEAUCordRep@12@@Z
+    ??$AddCordRep@$0A@@CordRepBtree@cord_internal@absl@@CAPEAV012@PEAV012@PEAUCordRep@12@@Z
+    ??$AddData@$00@CordRepBtree@cord_internal@absl@@AEAA?AVstring_view@2@V32@_K@Z
+    ??$AddData@$00@CordRepBtree@cord_internal@absl@@CAPEAV012@PEAV012@Vstring_view@2@_K@Z
+    ??$AddData@$0A@@CordRepBtree@cord_internal@absl@@AEAA?AVstring_view@2@V32@_K@Z
+    ??$AddData@$0A@@CordRepBtree@cord_internal@absl@@CAPEAV012@PEAV012@Vstring_view@2@_K@Z
     ??$AddRing@$00@CordRepRing@cord_internal@absl@@CAPEAV012@PEAV012@0_K1@Z
     ??$AddRing@$0A@@CordRepRing@cord_internal@absl@@CAPEAV012@PEAV012@0_K1@Z
     ??$Append@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@$0A@@Cord@absl@@QEAAX$$QEAV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@Z
@@ -11,7 +17,6 @@
     ??$Base64EscapeInternal@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@strings_internal@absl@@YAXPEBE_KPEAV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@_NPEBD@Z
     ??$CallOnceImpl@A6AXXZ$$V@base_internal@absl@@YAXPEAU?$atomic@I@__1@std@@W4SchedulingMode@01@A6AXXZ@Z
     ??$CastAndCallFunction@$$CBU?$atomic@_N@__1@std@@@Condition@absl@@CA_NPEBV01@@Z
-    ??$Compare@$0FE@$0FE@@strings_internal@absl@@YAHAEBV?$BigUnsigned@$0FE@@01@0@Z
     ??$Dispatch@C@FormatArgImpl@str_format_internal@absl@@CA_NTData@012@VFormatConversionSpecImpl@12@PEAX@Z
     ??$Dispatch@D@FormatArgImpl@str_format_internal@absl@@CA_NTData@012@VFormatConversionSpecImpl@12@PEAX@Z
     ??$Dispatch@E@FormatArgImpl@str_format_internal@absl@@CA_NTData@012@VFormatConversionSpecImpl@12@PEAX@Z
@@ -62,12 +67,18 @@
     ??$GenericCompare@HVstring_view@absl@@@absl@@YAHAEBVCord@0@AEBVstring_view@0@_K@Z
     ??$GenericCompare@_NVCord@absl@@@absl@@YA_NAEBVCord@0@0_K@Z
     ??$GenericCompare@_NVstring_view@absl@@@absl@@YA_NAEBVCord@0@AEBVstring_view@0@_K@Z
+    ??$Merge@$00@CordRepBtree@cord_internal@absl@@CAPEAV012@PEAV012@0@Z
+    ??$Merge@$0A@@CordRepBtree@cord_internal@absl@@CAPEAV012@PEAV012@0@Z
+    ??$NewLeaf@$00@CordRepBtree@cord_internal@absl@@CAPEAV012@Vstring_view@2@_K@Z
+    ??$NewLeaf@$0A@@CordRepBtree@cord_internal@absl@@CAPEAV012@Vstring_view@2@_K@Z
     ??$ParseFloat@$09@strings_internal@absl@@YA?AUParsedFloat@01@PEBD0W4chars_format@1@@Z
     ??$ParseFloat@$0BA@@strings_internal@absl@@YA?AUParsedFloat@01@PEBD0W4chars_format@1@@Z
     ??$ParseFormatString@UParsedFormatConsumer@ParsedFormatBase@str_format_internal@absl@@@str_format_internal@absl@@YA_NVstring_view@1@UParsedFormatConsumer@ParsedFormatBase@01@@Z
     ??$Prepend@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@$0A@@Cord@absl@@QEAAX$$QEAV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@Z
     ??$STLStringReserveAmortized@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@strings_internal@absl@@YAXPEAV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@_K@Z
     ??$STLStringResizeUninitializedAmortized@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@strings_internal@absl@@YAXPEAV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@_K@Z
+    ??$SetEdge@$00@CordRepBtree@cord_internal@absl@@QEAA?AUOpResult@012@_NPEAUCordRep@12@_K@Z
+    ??$SetEdge@$0A@@CordRepBtree@cord_internal@absl@@QEAA?AUOpResult@012@_NPEAUCordRep@12@_K@Z
     ??$StrReplaceAll@V?$initializer_list@U?$pair@Vstring_view@absl@@V12@@__1@std@@@std@@@absl@@YA?AV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@Vstring_view@0@AEBV?$initializer_list@U?$pair@Vstring_view@absl@@V12@@__1@std@@@3@@Z
     ??$StrReplaceAll@V?$initializer_list@U?$pair@Vstring_view@absl@@V12@@__1@std@@@std@@@absl@@YAHAEBV?$initializer_list@U?$pair@Vstring_view@absl@@V12@@__1@std@@@std@@PEAV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@2@@Z
     ??$ToChronoDuration@V?$duration@JV?$ratio@$0DM@$00@__1@std@@@chrono@__1@std@@@time_internal@absl@@YA?AV?$duration@JV?$ratio@$0DM@$00@__1@std@@@chrono@__1@std@@VDuration@1@@Z
@@ -89,6 +100,7 @@
     ??$emplace_back@$$V@?$__split_buffer@UTransition@cctz@time_internal@absl@@AEAV?$allocator@UTransition@cctz@time_internal@absl@@@__1@std@@@__1@std@@QEAAXXZ
     ??$emplace_back@$$V@?$__split_buffer@UTransitionType@cctz@time_internal@absl@@AEAV?$allocator@UTransitionType@cctz@time_internal@absl@@@__1@std@@@__1@std@@QEAAXXZ
     ??$find@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@?$__hash_table@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@V?$__unordered_map_hasher@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@23@$00@23@V?$__unordered_map_equal@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@23@$00@23@V?$allocator@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@@23@@__1@std@@QEAA?AV?$__hash_iterator@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@PEAX@__1@std@@@12@AEBV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@12@@Z
+    ??$find_first_non_full@X@container_internal@absl@@YA?AUFindInfo@01@PEBW4ctrl_t@01@_K1@Z
     ??0?$BigUnsigned@$03@strings_internal@absl@@QEAA@Vstring_view@2@@Z
     ??0?$BigUnsigned@$03@strings_internal@absl@@QEAA@XZ
     ??0?$BigUnsigned@$03@strings_internal@absl@@QEAA@_K@Z
@@ -99,7 +111,6 @@
     ??0?$__split_buffer@UTransition@cctz@time_internal@absl@@AEAV?$allocator@UTransition@cctz@time_internal@absl@@@__1@std@@@__1@std@@QEAA@_K0AEAV?$allocator@UTransition@cctz@time_internal@absl@@@12@@Z
     ??0?$__split_buffer@UTransitionType@cctz@time_internal@absl@@AEAV?$allocator@UTransitionType@cctz@time_internal@absl@@@__1@std@@@__1@std@@QEAA@_K0AEAV?$allocator@UTransitionType@cctz@time_internal@absl@@@12@@Z
     ??0?$__split_buffer@UViableSubstitution@strings_internal@absl@@AEAV?$allocator@UViableSubstitution@strings_internal@absl@@@__1@std@@@__1@std@@QEAA@_K0AEAV?$allocator@UViableSubstitution@strings_internal@absl@@@12@@Z
-    ??0AlphaNum@absl@@QEAA@PEBD@Z
     ??0AlphaNum@absl@@QEAA@UDec@1@@Z
     ??0AlphaNum@absl@@QEAA@UHex@1@@Z
     ??0AlphaNum@absl@@QEAA@_K@Z
@@ -107,6 +118,8 @@
     ??0Arg@substitute_internal@absl@@QEAA@PEBX@Z
     ??0Arg@substitute_internal@absl@@QEAA@UDec@2@@Z
     ??0Arg@substitute_internal@absl@@QEAA@UHex@2@@Z
+    ??0BadStatusOrAccess@absl@@QEAA@$$QEAV01@@Z
+    ??0BadStatusOrAccess@absl@@QEAA@AEBV01@@Z
     ??0BadStatusOrAccess@absl@@QEAA@VStatus@1@@Z
     ??0BlockingCounter@absl@@QEAA@H@Z
     ??0ByAnyChar@absl@@QEAA@Vstring_view@1@@Z
@@ -158,6 +171,8 @@
     ??1bad_optional_access@absl@@UEAA@XZ
     ??1bad_variant_access@absl@@UEAA@XZ
     ??4?$optional_data@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@$0A@@optional_internal@absl@@IEAAAEAV012@$$QEAV012@@Z
+    ??4BadStatusOrAccess@absl@@QEAAAEAV01@$$QEAV01@@Z
+    ??4BadStatusOrAccess@absl@@QEAAAEAV01@AEBV01@@Z
     ??4Cord@absl@@QEAAAEAV01@Vstring_view@1@@Z
     ??6absl@@YAAEAV?$basic_ostream@DU?$char_traits@D@__1@std@@@__1@std@@AEAV123@AEBVCord@0@@Z
     ??6absl@@YAAEAV?$basic_ostream@DU?$char_traits@D@__1@std@@@__1@std@@AEAV123@AEBVStatus@0@@Z
@@ -183,6 +198,7 @@
     ??ACord@absl@@QEBAD_K@Z
     ??BCord@absl@@QEBA?AV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@XZ
     ??Bint128@absl@@QEBANXZ
+    ??EChunkIterator@Cord@absl@@QEAAAEAV012@XZ
     ??Gdetail@cctz@time_internal@absl@@YA?AV?$civil_time@Uday_tag@detail@cctz@time_internal@absl@@@0123@V40123@_J@Z
     ??Gdetail@cctz@time_internal@absl@@YA?AV?$civil_time@Usecond_tag@detail@cctz@time_internal@absl@@@0123@V40123@_J@Z
     ??Hdetail@cctz@time_internal@absl@@YA?AV?$civil_time@Uday_tag@detail@cctz@time_internal@absl@@@0123@V40123@_J@Z
@@ -212,7 +228,7 @@
     ?AddWithCarry@?$BigUnsigned@$0FE@@strings_internal@absl@@AEAAXH_K@Z
     ?AddressIsReadable@debugging_internal@absl@@YA_NPEBX@Z
     ?AdvanceAndReadBytes@ChunkIterator@Cord@absl@@AEAA?AV23@_K@Z
-    ?AdvanceBytesRing@ChunkIterator@Cord@absl@@AEAAX_K@Z
+    ?AdvanceBytesBtree@ChunkIterator@Cord@absl@@AEAAX_K@Z
     ?AdvanceBytesSlowPath@ChunkIterator@Cord@absl@@AEAAX_K@Z
     ?AdvanceStack@ChunkIterator@Cord@absl@@AEAAAEAV123@XZ
     ?Alloc@LowLevelAlloc@base_internal@absl@@SAPEAX_K@Z
@@ -222,6 +238,7 @@
     ?AnnotateDestruct@NonEmptyInlinedStorage@?$FixedArray@PEAUCordRep@cord_internal@absl@@$0?0V?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@@absl@@QEAAX_K@Z
     ?Append@Cord@absl@@QEAAX$$QEAV12@@Z
     ?Append@Cord@absl@@QEAAXAEBV12@@Z
+    ?Append@CordRepBtree@cord_internal@absl@@SAPEAV123@PEAV123@Vstring_view@3@_K@Z
     ?Append@CordRepRing@cord_internal@absl@@SAPEAV123@PEAV123@PEAUCordRep@23@@Z
     ?Append@CordRepRing@cord_internal@absl@@SAPEAV123@PEAV123@Vstring_view@3@_K@Z
     ?Append@FormatSinkImpl@str_format_internal@absl@@QEAAXVstring_view@3@@Z
@@ -231,6 +248,7 @@
     ?AppendLeaf@CordRepRing@cord_internal@absl@@CAPEAV123@PEAV123@PEAUCordRep@23@_K2@Z
     ?AppendPack@str_format_internal@absl@@YAAEAV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEAV345@VUntypedFormatSpecImpl@12@V?$Span@$$CBVFormatArgImpl@str_format_internal@absl@@@2@@Z
     ?AppendPieces@strings_internal@absl@@YAXPEAV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@V?$initializer_list@Vstring_view@absl@@@5@@Z
+    ?AppendSlow@CordRepBtree@cord_internal@absl@@CAPEAV123@PEAV123@PEAUCordRep@23@@Z
     ?AppendSlow@CordRepRing@cord_internal@absl@@CAPEAV123@PEAV123@PEAUCordRep@23@@Z
     ?AppendTree@InlineRep@Cord@absl@@QEAAXPEAUCordRep@cord_internal@3@W4MethodIdentifier@CordzUpdateTracker@53@@Z
     ?AppendTreeToInlined@InlineRep@Cord@absl@@QEAAXPEAUCordRep@cord_internal@3@W4MethodIdentifier@CordzUpdateTracker@53@@Z
@@ -290,17 +308,20 @@
     ?Consume@cord_internal@absl@@YAXPEAUCordRep@12@V?$FunctionRef@$$A6AXPEAUCordRep@cord_internal@absl@@_K1@Z@2@@Z
     ?ConsumeUnboundConversion@str_format_internal@absl@@YAPEBDPEBD0PEAUUnboundConversion@12@PEAH@Z
     ?ConvertDateTime@absl@@YA?AUTimeConversion@1@_JHHHHHVTimeZone@1@@Z
-    ?ConvertDeletedToEmptyAndFullToDeleted@container_internal@absl@@YAXPEAC_K@Z
+    ?ConvertDeletedToEmptyAndFullToDeleted@container_internal@absl@@YAXPEAW4ctrl_t@12@_K@Z
     ?ConvertFloatImpl@str_format_internal@absl@@YA_NMAEBVFormatConversionSpecImpl@12@PEAVFormatSinkImpl@12@@Z
     ?ConvertFloatImpl@str_format_internal@absl@@YA_NNAEBVFormatConversionSpecImpl@12@PEAVFormatSinkImpl@12@@Z
     ?ConvertFloatImpl@str_format_internal@absl@@YA_NOAEBVFormatConversionSpecImpl@12@PEAVFormatSinkImpl@12@@Z
     ?Copy@CordRepRing@cord_internal@absl@@CAPEAV123@PEAV123@II_K@Z
     ?CopyCordToString@absl@@YAXAEBVCord@1@PEAV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@Z
+    ?CopyPrefix@CordRepBtree@cord_internal@absl@@AEAA?AUCopyResult@123@_K@Z
+    ?CopySuffix@CordRepBtree@cord_internal@absl@@AEAA?AUCopyResult@123@_K@Z
     ?CopyTo@InlineRep@Cord@absl@@QEBAXPEAV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@Z
     ?CopyToArraySlowPath@Cord@absl@@AEBAXPEAD@Z
     ?Crash@Helper@internal_statusor@absl@@SAXAEBVStatus@3@@Z
     ?Create@CordRepRing@cord_internal@absl@@SAPEAV123@PEAUCordRep@23@_K@Z
     ?CreateFromLeaf@CordRepRing@cord_internal@absl@@CAPEAV123@PEAUCordRep@23@_K11@Z
+    ?CreateSlow@CordRepBtree@cord_internal@absl@@CAPEAV123@PEAUCordRep@23@@Z
     ?CreateSlow@CordRepRing@cord_internal@absl@@CAPEAV123@PEAUCordRep@23@_K@Z
     ?CreateThreadIdentity@synchronization_internal@absl@@YAPEAUThreadIdentity@base_internal@2@XZ
     ?CurrentThreadIdentityIfPresent@base_internal@absl@@YAPEAUThreadIdentity@12@XZ
@@ -323,6 +344,8 @@
     ?Destroy@PerThreadSem@synchronization_internal@absl@@CAXPEAUThreadIdentity@base_internal@3@@Z
     ?DestroyContents@?$Storage@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__1@std@@@inlined_vector_internal@absl@@AEAAXXZ
     ?DestroyCordSlow@Cord@absl@@AEAAXXZ
+    ?DestroyLeaf@CordRepBtree@cord_internal@absl@@CAXPEAV123@_K1@Z
+    ?DestroyNonLeaf@CordRepBtree@cord_internal@absl@@CAXPEAV123@_K1@Z
     ?DiagnosticsGetDeleteQueue@CordzHandle@cord_internal@absl@@SA?AV?$vector@PEBVCordzHandle@cord_internal@absl@@V?$allocator@PEBVCordzHandle@cord_internal@absl@@@__1@std@@@__1@std@@XZ
     ?DiagnosticsGetSafeToInspectDeletedHandles@CordzHandle@cord_internal@absl@@QEAA?AV?$vector@PEBVCordzHandle@cord_internal@absl@@V?$allocator@PEBVCordzHandle@cord_internal@absl@@@__1@std@@@__1@std@@XZ
     ?DiagnosticsHandleIsSafeToInspect@CordzHandle@cord_internal@absl@@QEBA_NPEBV123@@Z
@@ -335,6 +358,9 @@
     ?DummyFunction@?$AtomicHook@P6AXPEBX_J@Z@base_internal@absl@@CAXPEBX_J@Z
     ?DummyFunction@?$AtomicHook@P6AX_J@Z@base_internal@absl@@CAX_J@Z
     ?DummyFunction@?$AtomicHook@P6A_NW4LogSeverity@absl@@PEBDHPEAPEADPEAH@Z@base_internal@absl@@CA_NW4LogSeverity@3@PEBDHPEAPEADPEAH@Z
+    ?Dump@CordRepBtree@cord_internal@absl@@SAXPEBUCordRep@23@AEAV?$basic_ostream@DU?$char_traits@D@__1@std@@@__1@std@@@Z
+    ?Dump@CordRepBtree@cord_internal@absl@@SAXPEBUCordRep@23@Vstring_view@3@AEAV?$basic_ostream@DU?$char_traits@D@__1@std@@@__1@std@@@Z
+    ?Dump@CordRepBtree@cord_internal@absl@@SAXPEBUCordRep@23@Vstring_view@3@_NAEAV?$basic_ostream@DU?$char_traits@D@__1@std@@@__1@std@@@Z
     ?DumpPCAndFrameSizesAndStackTrace@debugging_internal@absl@@YAXPEAXQEBQEAXQEAHHH_NP6AXPEBD0@Z0@Z
     ?DurationFromTimespec@absl@@YA?AVDuration@1@Utimespec@@@Z
     ?DurationFromTimeval@absl@@YA?AVDuration@1@Utimeval@@@Z
@@ -428,8 +454,11 @@
     ?FromTM@absl@@YA?AVTime@1@AEBUtm@@VTimeZone@1@@Z
     ?FromUDate@absl@@YA?AVTime@1@N@Z
     ?FromUniversal@absl@@YA?AVTime@1@_J@Z
+    ?GetAppendBuffer@CordRepBtree@cord_internal@absl@@QEAA?AV?$Span@D@3@_K@Z
     ?GetAppendBuffer@CordRepRing@cord_internal@absl@@QEAA?AV?$Span@D@3@_K@Z
+    ?GetAppendBufferSlow@CordRepBtree@cord_internal@absl@@AEAA?AV?$Span@D@3@_K@Z
     ?GetCachedTID@base_internal@absl@@YAIXZ
+    ?GetCharacter@CordRepBtree@cord_internal@absl@@QEBAD_K@Z
     ?GetCharacter@CordRepRing@cord_internal@absl@@QEBAD_K@Z
     ?GetCordzStatistics@CordzInfo@cord_internal@absl@@QEBA?AUCordzStatistics@23@XZ
     ?GetCurrentTimeNanos@absl@@YA_JXZ
@@ -468,7 +497,7 @@
     ?IncrementSynchSem@Mutex@absl@@CAXPEAV12@PEAUPerThreadSynch@base_internal@2@@Z
     ?Init@PerThreadSem@synchronization_internal@absl@@CAXPEAUThreadIdentity@base_internal@3@@Z
     ?InitFrom@?$Storage@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__1@std@@@inlined_vector_internal@absl@@QEAAXAEBV123@@Z
-    ?InitTree@ChunkIterator@Cord@absl@@AEAAXPEAUCordRep@cord_internal@3@@Z
+    ?InitWhat@BadStatusOrAccess@absl@@AEBAXXZ
     ?Initialize@ExponentialBiased@base_internal@absl@@AEAAXXZ
     ?InitializeCordRepExternal@cord_internal@absl@@YAXVstring_view@2@PEAUCordRepExternal@12@@Z
     ?InitializeData@Storage@?$FixedArray@PEAUCordRep@cord_internal@absl@@$0?0V?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@@absl@@AEAAPEAPEAUCordRep@cord_internal@3@XZ
@@ -485,6 +514,8 @@
     ?IsDataLoss@absl@@YA_NAEBVStatus@1@@Z
     ?IsDeadlineExceeded@absl@@YA_NAEBVStatus@1@@Z
     ?IsFailedPrecondition@absl@@YA_NAEBVStatus@1@@Z
+    ?IsFlat@CordRepBtree@cord_internal@absl@@QEBA_NPEAVstring_view@3@@Z
+    ?IsFlat@CordRepBtree@cord_internal@absl@@QEBA_N_K0PEAVstring_view@3@@Z
     ?IsInternal@absl@@YA_NAEBVStatus@1@@Z
     ?IsInvalidArgument@absl@@YA_NAEBVStatus@1@@Z
     ?IsNotFound@absl@@YA_NAEBVStatus@1@@Z
@@ -496,6 +527,7 @@
     ?IsUnavailable@absl@@YA_NAEBVStatus@1@@Z
     ?IsUnimplemented@absl@@YA_NAEBVStatus@1@@Z
     ?IsUnknown@absl@@YA_NAEBVStatus@1@@Z
+    ?IsValid@CordRepBtree@cord_internal@absl@@SA_NPEBV123@_N@Z
     ?IsValid@CordRepRing@cord_internal@absl@@QEBA_NAEAV?$basic_ostream@DU?$char_traits@D@__1@std@@@__1@std@@@Z
     ?Iterate@HashtablezSampler@container_internal@absl@@QEAA_JAEBV?$function@$$A6AXAEBUHashtablezInfo@container_internal@absl@@@Z@__1@std@@@Z
     ?LengthModToString@str_format_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@W4LengthMod@12@@Z
@@ -514,6 +546,8 @@
     ?LockWhen@Mutex@absl@@QEAAXAEBVCondition@2@@Z
     ?LockWhenWithDeadline@Mutex@absl@@QEAA_NAEBVCondition@2@VTime@2@@Z
     ?LockWhenWithTimeout@Mutex@absl@@QEAA_NAEBVCondition@2@VDuration@2@@Z
+    ?LowLevelHash@hash_internal@absl@@YA_KPEBX_K1QEB_K@Z
+    ?LowLevelHashImpl@MixingHashState@hash_internal@absl@@CA_KPEBE_K@Z
     ?MakeConcat@CordForest@absl@@AEAAPEAUCordRep@cord_internal@2@PEAU342@0@Z
     ?MakeNs@KernelTimeout@synchronization_internal@absl@@CA_JVTime@3@@Z
     ?MakeTime@TimeZoneInfo@cctz@time_internal@absl@@UEBA?AUcivil_lookup@time_zone@234@AEBV?$civil_time@Usecond_tag@detail@cctz@time_internal@absl@@@detail@234@@Z
@@ -523,6 +557,7 @@
     ?MaxFlatLength@CordTestAccess@strings_internal@absl@@SA_KXZ
     ?MaybeTrackCordImpl@CordzInfo@cord_internal@absl@@CAXAEAVInlineData@23@AEBV423@W4MethodIdentifier@CordzUpdateTracker@23@@Z
     ?MemoryUsageAux@Cord@absl@@CA_KPEBUCordRep@cord_internal@2@@Z
+    ?MergeTrees@CordRepBtree@cord_internal@absl@@CAPEAV123@PEAV123@0@Z
     ?MovedFromString@Status@absl@@CAPEBV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@XZ
     ?MultiplyBy@?$BigUnsigned@$03@strings_internal@absl@@AEAAXHPEBI@Z
     ?MultiplyBy@?$BigUnsigned@$03@strings_internal@absl@@QEAAXI@Z
@@ -541,7 +576,6 @@
     ?New@CordRepFlat@cord_internal@absl@@SAPEAU123@_K@Z
     ?New@CordRepRing@cord_internal@absl@@CAPEAV123@_K0@Z
     ?NewArena@LowLevelAlloc@base_internal@absl@@SAPEAUArena@123@H@Z
-    ?Next@CordRepRingReader@cord_internal@absl@@QEAA?AVstring_view@3@XZ
     ?Next@CordzInfo@cord_internal@absl@@QEBAPEAV123@AEBVCordzSnapshot@23@@Z
     ?NextTransition@TimeZone@absl@@QEBA_NVTime@2@PEAUCivilTransition@12@@Z
     ?NextTransition@TimeZoneInfo@cctz@time_internal@absl@@UEBA_NAEBV?$time_point@Vsystem_clock@chrono@__1@std@@V?$duration@_JV?$ratio@$00$00@__1@std@@@234@@chrono@__1@std@@PEAUcivil_transition@time_zone@234@@Z
@@ -580,9 +614,11 @@
     ?PrepareToModify@Status@absl@@AEAAXXZ
     ?Prepend@Cord@absl@@QEAAXAEBV12@@Z
     ?Prepend@Cord@absl@@QEAAXVstring_view@2@@Z
+    ?Prepend@CordRepBtree@cord_internal@absl@@SAPEAV123@PEAV123@Vstring_view@3@_K@Z
     ?Prepend@CordRepRing@cord_internal@absl@@SAPEAV123@PEAV123@PEAUCordRep@23@@Z
     ?Prepend@CordRepRing@cord_internal@absl@@SAPEAV123@PEAV123@Vstring_view@3@_K@Z
     ?PrependLeaf@CordRepRing@cord_internal@absl@@CAPEAV123@PEAV123@PEAUCordRep@23@_K2@Z
+    ?PrependSlow@CordRepBtree@cord_internal@absl@@CAPEAV123@PEAV123@PEAUCordRep@23@@Z
     ?PrependSlow@CordRepRing@cord_internal@absl@@CAPEAV123@PEAV123@PEAUCordRep@23@@Z
     ?PrependTree@InlineRep@Cord@absl@@QEAAXPEAUCordRep@cord_internal@3@W4MethodIdentifier@CordzUpdateTracker@53@@Z
     ?PrependTreeToInlined@InlineRep@Cord@absl@@QEAAXPEAUCordRep@cord_internal@3@W4MethodIdentifier@CordzUpdateTracker@53@@Z
@@ -597,6 +633,8 @@
     ?PutPaddedString@FormatSinkImpl@str_format_internal@absl@@QEAA_NVstring_view@3@HH_N@Z
     ?RawLog@raw_logging_internal@absl@@YAXW4LogSeverity@2@PEBDH1ZZ
     ?RawLoggingFullySupported@raw_logging_internal@absl@@YA_NXZ
+    ?Read@CordRepBtreeNavigator@cord_internal@absl@@QEAA?AUReadResult@123@_K0@Z
+    ?Read@CordRepBtreeReader@cord_internal@absl@@QEAA?AVstring_view@3@_K0AEAPEAUCordRep@23@@Z
     ?ReadDigits@?$BigUnsigned@$03@strings_internal@absl@@AEAAHPEBD0H@Z
     ?ReadDigits@?$BigUnsigned@$0FE@@strings_internal@absl@@AEAAHPEBD0H@Z
     ?ReadFloatMantissa@?$BigUnsigned@$03@strings_internal@absl@@QEAAHAEBUParsedFloat@23@H@Z
@@ -635,7 +673,7 @@
     ?SafeToDelete@CordzHandle@cord_internal@absl@@QEBA_NXZ
     ?SafeWriteToStderr@raw_logging_internal@absl@@YAXPEBD_K@Z
     ?SampleSlow@container_internal@absl@@YAPEAUHashtablezInfo@12@PEA_J@Z
-    ?Seek@CordRepRingReader@cord_internal@absl@@QEAA?AVstring_view@3@_K@Z
+    ?Seek@CordRepBtreeReader@cord_internal@absl@@QEAA?AVstring_view@3@_K@Z
     ?SetCapacityForTesting@CordRepRing@cord_internal@absl@@QEAAX_K@Z
     ?SetCurrentThreadIdentity@base_internal@absl@@YAXPEAUThreadIdentity@12@P6AXPEAX@Z@Z
     ?SetDisposeCallback@HashtablezSampler@container_internal@absl@@QEAAP6AXAEBUHashtablezInfo@23@@ZP6AX0@Z@Z
@@ -651,7 +689,7 @@
     ?SetToZero@?$BigUnsigned@$0FE@@strings_internal@absl@@QEAAXXZ
     ?ShiftLeft@?$BigUnsigned@$03@strings_internal@absl@@QEAAXH@Z
     ?ShiftLeft@?$BigUnsigned@$0FE@@strings_internal@absl@@QEAAXH@Z
-    ?ShouldInsertBackwards@container_internal@absl@@YA_N_KPEAC@Z
+    ?ShouldInsertBackwards@container_internal@absl@@YA_N_KPEBW4ctrl_t@12@@Z
     ?Signal@CondVar@absl@@QEAAXXZ
     ?SignalAll@CondVar@absl@@QEAAXXZ
     ?SimpleAtob@absl@@YA_NVstring_view@1@PEA_N@Z
@@ -661,6 +699,7 @@
     ?SizeofCordRepConcat@CordTestAccess@strings_internal@absl@@SA_KXZ
     ?SizeofCordRepExternal@CordTestAccess@strings_internal@absl@@SA_KXZ
     ?SizeofCordRepSubstring@CordTestAccess@strings_internal@absl@@SA_KXZ
+    ?Skip@CordRepBtreeNavigator@cord_internal@absl@@QEAA?AUPosition@123@_K@Z
     ?SlowLock@SpinLock@base_internal@absl@@AEAAXXZ
     ?SlowUnlock@SpinLock@base_internal@absl@@AEAAXI@Z
     ?SnprintF@str_format_internal@absl@@YAHPEAD_KVUntypedFormatSpecImpl@12@V?$Span@$$CBVFormatArgImpl@str_format_internal@absl@@@2@@Z
@@ -681,6 +720,7 @@
     ?StrReplaceAll@absl@@YAHV?$initializer_list@U?$pair@Vstring_view@absl@@V12@@__1@std@@@std@@PEAV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@3@@Z
     ?SubLength@CordRepRing@cord_internal@absl@@AEAAXI_K@Z
     ?SubRing@CordRepRing@cord_internal@absl@@SAPEAV123@PEAV123@_K11@Z
+    ?SubTree@CordRepBtree@cord_internal@absl@@QEAAPEAUCordRep@23@_K0@Z
     ?Subcord@Cord@absl@@QEBA?AV12@_K0@Z
     ?SubstituteAndAppendArray@substitute_internal@absl@@YAXPEAV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@Vstring_view@2@PEBV62@_K@Z
     ?Summarize@str_format_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@VUntypedFormatSpecImpl@12@V?$Span@$$CBVFormatArgImpl@str_format_internal@absl@@@2@@Z
@@ -791,8 +831,6 @@
     ?WebSafeBase64Unescape@absl@@YA_NVstring_view@1@PEAV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@Z
     ?Write@BufferRawSink@str_format_internal@absl@@QEAAXVstring_view@3@@Z
     ?Write@FILERawSink@str_format_internal@absl@@QEAAXVstring_view@3@@Z
-    ?Wyhash@hash_internal@absl@@YA_KPEBX_K1QEB_K@Z
-    ?WyhashImpl@MixingHashState@hash_internal@absl@@CA_KPEBE_K@Z
     ?__add_back_capacity@?$deque@PEBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@@__1@std@@AEAAXXZ
     ?__annotate_delete@?$vector@PEAUCordRep@cord_internal@absl@@V?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@@__1@std@@AEBAXXZ
     ?__annotate_delete@?$vector@PEAVCordzHandle@cord_internal@absl@@V?$allocator@PEAVCordzHandle@cord_internal@absl@@@__1@std@@@__1@std@@AEBAXXZ
@@ -840,9 +878,11 @@
     ?__vallocate@?$vector@PEAUCordRep@cord_internal@absl@@V?$allocator@PEAUCordRep@cord_internal@absl@@@__1@std@@@__1@std@@AEAAX_K@Z
     ?__vallocate@?$vector@VFormatArgImpl@str_format_internal@absl@@V?$allocator@VFormatArgImpl@str_format_internal@absl@@@__1@std@@@__1@std@@AEAAX_K@Z
     ?__vdeallocate@?$vector@VFormatArgImpl@str_format_internal@absl@@V?$allocator@VFormatArgImpl@str_format_internal@absl@@@__1@std@@@__1@std@@AEAAXXZ
+    ?chunk_begin@Cord@absl@@QEBA?AVChunkIterator@12@XZ
     ?clear@?$__hash_table@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@V?$__unordered_map_hasher@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@23@$00@23@V?$__unordered_map_equal@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@23@$00@23@V?$allocator@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@@23@@__1@std@@QEAAXXZ
     ?code@Status@absl@@QEBA?AW4StatusCode@2@XZ
     ?cord_btree_enabled@cord_internal@absl@@3U?$atomic@_N@__1@std@@A
+    ?cord_btree_exhaustive_validation@cord_internal@absl@@3U?$atomic@_N@__1@std@@A
     ?cord_ring_buffer_enabled@cord_internal@absl@@3U?$atomic@_N@__1@std@@A
     ?day_difference@impl@detail@cctz@time_internal@absl@@YA_J_JCC0CC@Z
     ?description@time_zone@cctz@time_internal@absl@@QEBA?AV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@XZ
diff --git a/third_party/abseil-cpp/symbols_x86_dbg.def b/third_party/abseil-cpp/symbols_x86_dbg.def
index 29e9ce4..5641446 100644
--- a/third_party/abseil-cpp/symbols_x86_dbg.def
+++ b/third_party/abseil-cpp/symbols_x86_dbg.def
@@ -1,6 +1,7 @@
 EXPORTS
     ??$?0$$CBD$0A@@VoidPtr@str_format_internal@absl@@QAE@PBD@Z
     ??$?0$$CBU?$atomic@_N@__1@std@@@Condition@absl@@QAE@P6A_NPBU?$atomic@_N@__1@std@@@Z0@Z
+    ??$?0$$CBUCordRep@cord_internal@absl@@@Hex@absl@@QAE@PBUCordRep@cord_internal@1@W4PadSpec@1@@Z
     ??$?0$$CBVFormatArgImpl@str_format_internal@absl@@$$CBV012@@?$Span@$$CBVFormatArgImpl@str_format_internal@absl@@@absl@@QAE@V?$initializer_list@VFormatArgImpl@str_format_internal@absl@@@std@@@Z
     ??$?0$$T@?$Storage@PAH$00$0A@@internal_compressed_tuple@container_internal@absl@@QAE@Uin_place_t@3@$$QA$$T@Z
     ??$?0$$T@?$Storage@PAPAUCordRep@cord_internal@absl@@$00$0A@@internal_compressed_tuple@container_internal@absl@@QAE@Uin_place_t@3@$$QA$$T@Z
@@ -220,7 +221,19 @@
     ??$?RW4LogSeverity@absl@@ABQBDHAAPBD@?$AtomicHook@P6AXW4LogSeverity@absl@@PBDHABV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@Z@base_internal@absl@@QBEX$$QAW4LogSeverity@2@ABQBD$$QAHAAPBD@Z
     ??$?RW4LogSeverity@absl@@ABQBDHAAV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@?$AtomicHook@P6AXW4LogSeverity@absl@@PBDHABV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@Z@base_internal@absl@@QBEX$$QAW4LogSeverity@2@ABQBD$$QAHAAV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@Z
     ??$?RW4LogSeverity@absl@@ABQBDHV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@?$AtomicHook@P6AXW4LogSeverity@absl@@PBDHABV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@Z@base_internal@absl@@QBEX$$QAW4LogSeverity@2@ABQBD$$QAH$$QAV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@Z
-    ??$?XH@Duration@absl@@QAEAAV01@H@Z
+    ??$?XH$0A@@Duration@absl@@QAEAAV01@H@Z
+    ??$Add@$00@CordRepBtree@cord_internal@absl@@AAEXPAUCordRep@12@@Z
+    ??$Add@$00@CordRepBtree@cord_internal@absl@@AAEXV?$Span@QAUCordRep@cord_internal@absl@@@2@@Z
+    ??$Add@$0A@@CordRepBtree@cord_internal@absl@@AAEXPAUCordRep@12@@Z
+    ??$Add@$0A@@CordRepBtree@cord_internal@absl@@AAEXV?$Span@QAUCordRep@cord_internal@absl@@@2@@Z
+    ??$AddCordRep@$00@CordRepBtree@cord_internal@absl@@CAPAV012@PAV012@PAUCordRep@12@@Z
+    ??$AddCordRep@$0A@@CordRepBtree@cord_internal@absl@@CAPAV012@PAV012@PAUCordRep@12@@Z
+    ??$AddData@$00@CordRepBtree@cord_internal@absl@@AAE?AVstring_view@2@V32@I@Z
+    ??$AddData@$00@CordRepBtree@cord_internal@absl@@CAPAV012@PAV012@Vstring_view@2@I@Z
+    ??$AddData@$0A@@CordRepBtree@cord_internal@absl@@AAE?AVstring_view@2@V32@I@Z
+    ??$AddData@$0A@@CordRepBtree@cord_internal@absl@@CAPAV012@PAV012@Vstring_view@2@I@Z
+    ??$AddEdge@$00@CordRepBtree@cord_internal@absl@@QAE?AUOpResult@012@_NPAUCordRep@12@I@Z
+    ??$AddEdge@$0A@@CordRepBtree@cord_internal@absl@@QAE?AUOpResult@012@_NPAUCordRep@12@I@Z
     ??$AddRing@$00@CordRepRing@cord_internal@absl@@CAPAV012@PAV012@0II@Z
     ??$AddRing@$0A@@CordRepRing@cord_internal@absl@@CAPAV012@PAV012@0II@Z
     ??$Append@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@$0A@@Cord@absl@@QAEX$$QAV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@Z
@@ -247,25 +260,25 @@
     ??$ArgumentToConv@_J@str_format_internal@absl@@YA?AW4FormatConversionCharSet@1@XZ
     ??$ArgumentToConv@_K@str_format_internal@absl@@YA?AW4FormatConversionCharSet@1@XZ
     ??$ArgumentToConv@_N@str_format_internal@absl@@YA?AW4FormatConversionCharSet@1@XZ
-    ??$AssignElements@PAUPayload@status_internal@absl@@V?$IteratorValueAdapter@V?$allocator@UPayload@status_internal@absl@@@__1@std@@V?$move_iterator@PAUPayload@status_internal@absl@@@23@@inlined_vector_internal@3@I@inlined_vector_internal@absl@@YAXPAUPayload@status_internal@1@PAV?$IteratorValueAdapter@V?$allocator@UPayload@status_internal@absl@@@__1@std@@V?$move_iterator@PAUPayload@status_internal@absl@@@23@@01@I@Z
+    ??$AssignElements@V?$allocator@UPayload@status_internal@absl@@@__1@std@@V?$IteratorValueAdapter@V?$allocator@UPayload@status_internal@absl@@@__1@std@@V?$move_iterator@PAUPayload@status_internal@absl@@@23@@inlined_vector_internal@absl@@@inlined_vector_internal@absl@@YAXPAUPayload@status_internal@1@AAV?$IteratorValueAdapter@V?$allocator@UPayload@status_internal@absl@@@__1@std@@V?$move_iterator@PAUPayload@status_internal@absl@@@23@@01@I@Z
     ??$Base64EscapeInternal@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@strings_internal@absl@@YAXPBEIPAV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@_NPBD@Z
     ??$CallOnceImpl@A6AXXZ$$V@base_internal@absl@@YAXPAU?$atomic@I@__1@std@@W4SchedulingMode@01@A6AXXZ@Z
     ??$CastAndCallFunction@$$CBU?$atomic@_N@__1@std@@@Condition@absl@@CA_NPBV01@@Z
     ??$CastAndCallFunction@USynchEvent@absl@@@Condition@absl@@CA_NPBV01@@Z
     ??$Compare@$0FE@$0FE@@strings_internal@absl@@YAHABV?$BigUnsigned@$0FE@@01@0@Z
-    ??$ConstructElements@V?$allocator@H@__1@std@@PAHV?$IteratorValueAdapter@V?$allocator@H@__1@std@@V?$move_iterator@PAH@23@@inlined_vector_internal@absl@@I@inlined_vector_internal@absl@@YAXPAV?$allocator@H@__1@std@@PAHPAV?$IteratorValueAdapter@V?$allocator@H@__1@std@@V?$move_iterator@PAH@23@@01@I@Z
-    ??$ConstructElements@V?$allocator@PAUCordRep@cord_internal@absl@@@__1@std@@PAPAUCordRep@cord_internal@absl@@V?$CopyValueAdapter@V?$allocator@PAUCordRep@cord_internal@absl@@@__1@std@@@inlined_vector_internal@6@I@inlined_vector_internal@absl@@YAXPAV?$allocator@PAUCordRep@cord_internal@absl@@@__1@std@@PAPAUCordRep@cord_internal@1@PAV?$CopyValueAdapter@V?$allocator@PAUCordRep@cord_internal@absl@@@__1@std@@@01@I@Z
-    ??$ConstructElements@V?$allocator@PAUCordRep@cord_internal@absl@@@__1@std@@PAPAUCordRep@cord_internal@absl@@V?$IteratorValueAdapter@V?$allocator@PAUCordRep@cord_internal@absl@@@__1@std@@V?$move_iterator@PAPAUCordRep@cord_internal@absl@@@23@@inlined_vector_internal@6@I@inlined_vector_internal@absl@@YAXPAV?$allocator@PAUCordRep@cord_internal@absl@@@__1@std@@PAPAUCordRep@cord_internal@1@PAV?$IteratorValueAdapter@V?$allocator@PAUCordRep@cord_internal@absl@@@__1@std@@V?$move_iterator@PAPAUCordRep@cord_internal@absl@@@23@@01@I@Z
-    ??$ConstructElements@V?$allocator@PBUCordRep@cord_internal@absl@@@__1@std@@PAPBUCordRep@cord_internal@absl@@V?$IteratorValueAdapter@V?$allocator@PBUCordRep@cord_internal@absl@@@__1@std@@V?$move_iterator@PAPBUCordRep@cord_internal@absl@@@23@@inlined_vector_internal@6@I@inlined_vector_internal@absl@@YAXPAV?$allocator@PBUCordRep@cord_internal@absl@@@__1@std@@PAPBUCordRep@cord_internal@1@PAV?$IteratorValueAdapter@V?$allocator@PBUCordRep@cord_internal@absl@@@__1@std@@V?$move_iterator@PAPBUCordRep@cord_internal@absl@@@23@@01@I@Z
-    ??$ConstructElements@V?$allocator@UPayload@status_internal@absl@@@__1@std@@PAUPayload@status_internal@absl@@V?$IteratorValueAdapter@V?$allocator@UPayload@status_internal@absl@@@__1@std@@PBUPayload@status_internal@absl@@@inlined_vector_internal@6@I@inlined_vector_internal@absl@@YAXPAV?$allocator@UPayload@status_internal@absl@@@__1@std@@PAUPayload@status_internal@1@PAV?$IteratorValueAdapter@V?$allocator@UPayload@status_internal@absl@@@__1@std@@PBUPayload@status_internal@absl@@@01@I@Z
-    ??$ConstructElements@V?$allocator@UPayload@status_internal@absl@@@__1@std@@PAUPayload@status_internal@absl@@V?$IteratorValueAdapter@V?$allocator@UPayload@status_internal@absl@@@__1@std@@V?$move_iterator@PAUPayload@status_internal@absl@@@23@@inlined_vector_internal@6@I@inlined_vector_internal@absl@@YAXPAV?$allocator@UPayload@status_internal@absl@@@__1@std@@PAUPayload@status_internal@1@PAV?$IteratorValueAdapter@V?$allocator@UPayload@status_internal@absl@@@__1@std@@V?$move_iterator@PAUPayload@status_internal@absl@@@23@@01@I@Z
-    ??$ConstructElements@V?$allocator@USubRange@absl@@@__1@std@@PAUSubRange@absl@@V?$IteratorValueAdapter@V?$allocator@USubRange@absl@@@__1@std@@V?$move_iterator@PAUSubRange@absl@@@23@@inlined_vector_internal@5@I@inlined_vector_internal@absl@@YAXPAV?$allocator@USubRange@absl@@@__1@std@@PAUSubRange@1@PAV?$IteratorValueAdapter@V?$allocator@USubRange@absl@@@__1@std@@V?$move_iterator@PAUSubRange@absl@@@23@@01@I@Z
+    ??$ConstructElements@V?$allocator@H@__1@std@@V?$IteratorValueAdapter@V?$allocator@H@__1@std@@V?$move_iterator@PAH@23@@inlined_vector_internal@absl@@@inlined_vector_internal@absl@@YAXAAV?$allocator@H@__1@std@@PAHAAV?$IteratorValueAdapter@V?$allocator@H@__1@std@@V?$move_iterator@PAH@23@@01@I@Z
+    ??$ConstructElements@V?$allocator@PAUCordRep@cord_internal@absl@@@__1@std@@V?$CopyValueAdapter@V?$allocator@PAUCordRep@cord_internal@absl@@@__1@std@@@inlined_vector_internal@absl@@@inlined_vector_internal@absl@@YAXAAV?$allocator@PAUCordRep@cord_internal@absl@@@__1@std@@PAPAUCordRep@cord_internal@1@AAV?$CopyValueAdapter@V?$allocator@PAUCordRep@cord_internal@absl@@@__1@std@@@01@I@Z
+    ??$ConstructElements@V?$allocator@PAUCordRep@cord_internal@absl@@@__1@std@@V?$IteratorValueAdapter@V?$allocator@PAUCordRep@cord_internal@absl@@@__1@std@@V?$move_iterator@PAPAUCordRep@cord_internal@absl@@@23@@inlined_vector_internal@absl@@@inlined_vector_internal@absl@@YAXAAV?$allocator@PAUCordRep@cord_internal@absl@@@__1@std@@PAPAUCordRep@cord_internal@1@AAV?$IteratorValueAdapter@V?$allocator@PAUCordRep@cord_internal@absl@@@__1@std@@V?$move_iterator@PAPAUCordRep@cord_internal@absl@@@23@@01@I@Z
+    ??$ConstructElements@V?$allocator@PBUCordRep@cord_internal@absl@@@__1@std@@V?$IteratorValueAdapter@V?$allocator@PBUCordRep@cord_internal@absl@@@__1@std@@V?$move_iterator@PAPBUCordRep@cord_internal@absl@@@23@@inlined_vector_internal@absl@@@inlined_vector_internal@absl@@YAXAAV?$allocator@PBUCordRep@cord_internal@absl@@@__1@std@@PAPBUCordRep@cord_internal@1@AAV?$IteratorValueAdapter@V?$allocator@PBUCordRep@cord_internal@absl@@@__1@std@@V?$move_iterator@PAPBUCordRep@cord_internal@absl@@@23@@01@I@Z
+    ??$ConstructElements@V?$allocator@UPayload@status_internal@absl@@@__1@std@@V?$IteratorValueAdapter@V?$allocator@UPayload@status_internal@absl@@@__1@std@@PBUPayload@status_internal@absl@@@inlined_vector_internal@absl@@@inlined_vector_internal@absl@@YAXAAV?$allocator@UPayload@status_internal@absl@@@__1@std@@PAUPayload@status_internal@1@AAV?$IteratorValueAdapter@V?$allocator@UPayload@status_internal@absl@@@__1@std@@PBUPayload@status_internal@absl@@@01@I@Z
+    ??$ConstructElements@V?$allocator@UPayload@status_internal@absl@@@__1@std@@V?$IteratorValueAdapter@V?$allocator@UPayload@status_internal@absl@@@__1@std@@V?$move_iterator@PAUPayload@status_internal@absl@@@23@@inlined_vector_internal@absl@@@inlined_vector_internal@absl@@YAXAAV?$allocator@UPayload@status_internal@absl@@@__1@std@@PAUPayload@status_internal@1@AAV?$IteratorValueAdapter@V?$allocator@UPayload@status_internal@absl@@@__1@std@@V?$move_iterator@PAUPayload@status_internal@absl@@@23@@01@I@Z
+    ??$ConstructElements@V?$allocator@USubRange@absl@@@__1@std@@V?$IteratorValueAdapter@V?$allocator@USubRange@absl@@@__1@std@@V?$move_iterator@PAUSubRange@absl@@@23@@inlined_vector_internal@absl@@@inlined_vector_internal@absl@@YAXAAV?$allocator@USubRange@absl@@@__1@std@@PAUSubRange@1@AAV?$IteratorValueAdapter@V?$allocator@USubRange@absl@@@__1@std@@V?$move_iterator@PAUSubRange@absl@@@23@@01@I@Z
     ??$Convert@VFormatArgImpl@str_format_internal@absl@@@FormatArgImplFriend@str_format_internal@absl@@SA_NVFormatArgImpl@12@VFormatConversionSpecImpl@12@PAVFormatSinkImpl@12@@Z
-    ??$DestroyElements@V?$allocator@H@__1@std@@PAHI@inlined_vector_internal@absl@@YAXPAV?$allocator@H@__1@std@@PAHI@Z
-    ??$DestroyElements@V?$allocator@PAUCordRep@cord_internal@absl@@@__1@std@@PAPAUCordRep@cord_internal@absl@@I@inlined_vector_internal@absl@@YAXPAV?$allocator@PAUCordRep@cord_internal@absl@@@__1@std@@PAPAUCordRep@cord_internal@1@I@Z
-    ??$DestroyElements@V?$allocator@PBUCordRep@cord_internal@absl@@@__1@std@@PAPBUCordRep@cord_internal@absl@@I@inlined_vector_internal@absl@@YAXPAV?$allocator@PBUCordRep@cord_internal@absl@@@__1@std@@PAPBUCordRep@cord_internal@1@I@Z
-    ??$DestroyElements@V?$allocator@UPayload@status_internal@absl@@@__1@std@@PAUPayload@status_internal@absl@@I@inlined_vector_internal@absl@@YAXPAV?$allocator@UPayload@status_internal@absl@@@__1@std@@PAUPayload@status_internal@1@I@Z
-    ??$DestroyElements@V?$allocator@USubRange@absl@@@__1@std@@PAUSubRange@absl@@I@inlined_vector_internal@absl@@YAXPAV?$allocator@USubRange@absl@@@__1@std@@PAUSubRange@1@I@Z
+    ??$DestroyElements@V?$allocator@H@__1@std@@@inlined_vector_internal@absl@@YAXAAV?$allocator@H@__1@std@@PAHI@Z
+    ??$DestroyElements@V?$allocator@PAUCordRep@cord_internal@absl@@@__1@std@@@inlined_vector_internal@absl@@YAXAAV?$allocator@PAUCordRep@cord_internal@absl@@@__1@std@@PAPAUCordRep@cord_internal@1@I@Z
+    ??$DestroyElements@V?$allocator@PBUCordRep@cord_internal@absl@@@__1@std@@@inlined_vector_internal@absl@@YAXAAV?$allocator@PBUCordRep@cord_internal@absl@@@__1@std@@PAPBUCordRep@cord_internal@1@I@Z
+    ??$DestroyElements@V?$allocator@UPayload@status_internal@absl@@@__1@std@@@inlined_vector_internal@absl@@YAXAAV?$allocator@UPayload@status_internal@absl@@@__1@std@@PAUPayload@status_internal@1@I@Z
+    ??$DestroyElements@V?$allocator@USubRange@absl@@@__1@std@@@inlined_vector_internal@absl@@YAXAAV?$allocator@USubRange@absl@@@__1@std@@PAUSubRange@1@I@Z
     ??$Dispatch@C@FormatArgImpl@str_format_internal@absl@@CA_NTData@012@VFormatConversionSpecImpl@12@PAX@Z
     ??$Dispatch@D@FormatArgImpl@str_format_internal@absl@@CA_NTData@012@VFormatConversionSpecImpl@12@PAX@Z
     ??$Dispatch@E@FormatArgImpl@str_format_internal@absl@@CA_NTData@012@VFormatConversionSpecImpl@12@PAX@Z
@@ -349,6 +362,8 @@
     ??$HidePtr@$$CBX@base_internal@absl@@YAIPBX@Z
     ??$HidePtr@U?$atomic@H@__1@std@@@base_internal@absl@@YAIPAU?$atomic@H@__1@std@@@Z
     ??$HidePtr@X@base_internal@absl@@YAIPAX@Z
+    ??$Hours@H$0A@@absl@@YA?AVDuration@0@H@Z
+    ??$Init@$0A@@CordRepBtreeNavigator@cord_internal@absl@@AAEPAUCordRep@12@PAVCordRepBtree@12@@Z
     ??$Init@H@FormatArgImpl@str_format_internal@absl@@AAEXABH@Z
     ??$Initialize@V?$CopyValueAdapter@V?$allocator@PAUCordRep@cord_internal@absl@@@__1@std@@@inlined_vector_internal@absl@@@?$Storage@PAUCordRep@cord_internal@absl@@$0CP@V?$allocator@PAUCordRep@cord_internal@absl@@@__1@std@@@inlined_vector_internal@absl@@QAEXV?$CopyValueAdapter@V?$allocator@PAUCordRep@cord_internal@absl@@@__1@std@@@12@I@Z
     ??$Invoke@A6AXXZ$$V@Callable@base_internal@absl@@SAXA6AXXZ@Z
@@ -364,7 +379,19 @@
     ??$MakeSpan@$SI$0CIA@@absl@@YA?AV?$Span@I@0@AAY0CIA@I@Z
     ??$MakeSpan@$SI$0IA@@absl@@YA?AV?$Span@I@0@AAY0IA@I@Z
     ??$MakeSpan@$SVFormatArgImpl@str_format_internal@absl@@@absl@@YA?AV?$Span@VFormatArgImpl@str_format_internal@absl@@@0@PAVFormatArgImpl@str_format_internal@0@I@Z
+    ??$Merge@$00@CordRepBtree@cord_internal@absl@@CAPAV012@PAV012@0@Z
+    ??$Merge@$0A@@CordRepBtree@cord_internal@absl@@CAPAV012@PAV012@0@Z
+    ??$Microseconds@H$0A@@absl@@YA?AVDuration@0@H@Z
+    ??$Microseconds@J$0A@@absl@@YA?AVDuration@0@J@Z
+    ??$Milliseconds@H$0A@@absl@@YA?AVDuration@0@H@Z
+    ??$Milliseconds@K$0A@@absl@@YA?AVDuration@0@K@Z
     ??$Milliseconds@N$0A@@absl@@YA?AVDuration@0@N@Z
+    ??$Minutes@H$0A@@absl@@YA?AVDuration@0@H@Z
+    ??$Nanoseconds@H$0A@@absl@@YA?AVDuration@0@H@Z
+    ??$Nanoseconds@J$0A@@absl@@YA?AVDuration@0@J@Z
+    ??$Nanoseconds@_J$0A@@absl@@YA?AVDuration@0@_J@Z
+    ??$NewLeaf@$00@CordRepBtree@cord_internal@absl@@CAPAV012@Vstring_view@2@I@Z
+    ??$NewLeaf@$0A@@CordRepBtree@cord_internal@absl@@CAPAV012@Vstring_view@2@I@Z
     ??$Offset@$00$0A@@?$LayoutImpl@V?$tuple@IPAUCordRep@cord_internal@absl@@I@__1@std@@U?$integer_sequence@I$0A@$00$01@absl@@U45@@internal_layout@container_internal@absl@@QBEIXZ
     ??$Offset@$00$0A@@?$LayoutImpl@V?$tuple@IPAUCordRep@cord_internal@absl@@I@__1@std@@U?$integer_sequence@I$0A@$00@absl@@U?$integer_sequence@I$0A@$00$01@5@@internal_layout@container_internal@absl@@QBEIXZ
     ??$Offset@$00$0A@@?$LayoutImpl@V?$tuple@IPAUCordRep@cord_internal@absl@@I@__1@std@@U?$integer_sequence@I$0A@@absl@@U?$integer_sequence@I$0A@$00@5@@internal_layout@container_internal@absl@@QBEIXZ
@@ -392,6 +419,11 @@
     ??$STLStringReserveAmortized@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@strings_internal@absl@@YAXPAV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@I@Z
     ??$STLStringResizeUninitialized@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@X@strings_internal@absl@@YAXPAV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@I@Z
     ??$STLStringResizeUninitializedAmortized@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@strings_internal@absl@@YAXPAV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@I@Z
+    ??$Seconds@H$0A@@absl@@YA?AVDuration@0@H@Z
+    ??$Seconds@J$0A@@absl@@YA?AVDuration@0@J@Z
+    ??$Seconds@_J$0A@@absl@@YA?AVDuration@0@_J@Z
+    ??$SetEdge@$00@CordRepBtree@cord_internal@absl@@QAE?AUOpResult@012@_NPAUCordRep@12@I@Z
+    ??$SetEdge@$0A@@CordRepBtree@cord_internal@absl@@QAE?AUOpResult@012@_NPAUCordRep@12@I@Z
     ??$SharedCompareImpl@VCord@absl@@@absl@@YAHABVCord@0@0@Z
     ??$SharedCompareImpl@Vstring_view@absl@@@absl@@YAHABVCord@0@ABVstring_view@0@@Z
     ??$StrAppend@$$V@absl@@YAXPAV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@ABVAlphaNum@0@1111@Z
@@ -437,6 +469,7 @@
     ??$ToIntVal@_J@FormatArgImpl@str_format_internal@absl@@CAHAB_J@Z
     ??$ToIntVal@_K@FormatArgImpl@str_format_internal@absl@@CAHAB_K@Z
     ??$ToIntVal@_N@FormatArgImpl@str_format_internal@absl@@CAHAB_N@Z
+    ??$TrailingZeros@I@container_internal@absl@@YAII@Z
     ??$UnhidePtr@X@base_internal@absl@@YAPAXI@Z
     ??$__advance@PBUTransition@cctz@time_internal@absl@@@__1@std@@YAXAAPBUTransition@cctz@time_internal@absl@@HUrandom_access_iterator_tag@01@@Z
     ??$__advance@PBVFormatArgImpl@str_format_internal@absl@@@__1@std@@YAXAAPBVFormatArgImpl@str_format_internal@absl@@HUrandom_access_iterator_tag@01@@Z
@@ -521,40 +554,33 @@
     ??$__upper_bound@AAUByUnixTime@Transition@cctz@time_internal@absl@@PBU2345@U2345@@__1@std@@YAPBUTransition@cctz@time_internal@absl@@PBU2345@0ABU2345@AAUByUnixTime@2345@@Z
     ??$addressof@$$CBU?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@@__1@std@@YAPBU?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@01@ABU201@@Z
     ??$addressof@$$CBU?$pair@$$CBV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@@__1@std@@YAPBU?$pair@$$CBV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@01@ABU201@@Z
-    ??$addressof@$$CBV?$allocator@UPayload@status_internal@absl@@@__1@std@@@__1@std@@YAPBV?$allocator@UPayload@status_internal@absl@@@01@ABV201@@Z
     ??$addressof@PBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@YAPAPBVImpl@time_zone@cctz@time_internal@absl@@AAPBV23456@@Z
     ??$addressof@QAUCordRep@cord_internal@absl@@@__1@std@@YAPBQAUCordRep@cord_internal@absl@@ABQAU234@@Z
     ??$addressof@U?$__hash_node_base@PAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@PAX@__1@std@@@__1@std@@@__1@std@@YAPAU?$__hash_node_base@PAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@PAX@__1@std@@@01@AAU201@@Z
     ??$addressof@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@@__1@std@@YAPAU?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@01@AAU201@@Z
     ??$addressof@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@@__1@std@@YAPAU?$pair@$$CBV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@01@AAU201@@Z
-    ??$addressof@V?$allocator@PAUCordRep@cord_internal@absl@@@__1@std@@@__1@std@@YAPAV?$allocator@PAUCordRep@cord_internal@absl@@@01@AAV201@@Z
-    ??$addressof@V?$allocator@PBUCordRep@cord_internal@absl@@@__1@std@@@__1@std@@YAPAV?$allocator@PBUCordRep@cord_internal@absl@@@01@AAV201@@Z
-    ??$addressof@V?$allocator@UPayload@status_internal@absl@@@__1@std@@@__1@std@@YAPAV?$allocator@UPayload@status_internal@absl@@@01@AAV201@@Z
-    ??$addressof@V?$allocator@USubRange@absl@@@__1@std@@@__1@std@@YAPAV?$allocator@USubRange@absl@@@01@AAV201@@Z
     ??$advance@PBUTransition@cctz@time_internal@absl@@H@__1@std@@YAXAAPBUTransition@cctz@time_internal@absl@@H@Z
     ??$advance@PBVFormatArgImpl@str_format_internal@absl@@I@__1@std@@YAXAAPBVFormatArgImpl@str_format_internal@absl@@I@Z
     ??$assign@PBVFormatArgImpl@str_format_internal@absl@@@?$vector@VFormatArgImpl@str_format_internal@absl@@V?$allocator@VFormatArgImpl@str_format_internal@absl@@@__1@std@@@__1@std@@QAEXPBVFormatArgImpl@str_format_internal@absl@@0@Z
     ??$assign@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@?$optional_data_base@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@optional_internal@absl@@IAEX$$QAV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@Z
     ??$bit_cast@_J_K$0A@@absl@@YA_JAB_K@Z
     ??$bit_cast@_K_J$0A@@absl@@YA_KAB_J@Z
+    ??$bit_width@I@absl@@YAII@Z
     ??$bit_width@_K@absl@@YA_K_K@Z
-    ??$construct@HABH@?$allocator_traits@V?$allocator@H@__1@std@@@absl@@SAXAAV?$allocator@H@__1@std@@PAHABH@Z
-    ??$construct@HH@?$allocator_traits@V?$allocator@H@__1@std@@@absl@@SAXAAV?$allocator@H@__1@std@@PAH$$QAH@Z
     ??$construct@PAPBVImpl@time_zone@cctz@time_internal@absl@@ABQAPBV12345@@?$allocator@PAPBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@QAEXPAPAPBVImpl@time_zone@cctz@time_internal@absl@@ABQAPBV34567@@Z
     ??$construct@PAPBVImpl@time_zone@cctz@time_internal@absl@@ABQAPBV12345@X@?$allocator_traits@V?$allocator@PAPBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@@__1@std@@SAXAAV?$allocator@PAPBVImpl@time_zone@cctz@time_internal@absl@@@12@PAPAPBVImpl@time_zone@cctz@time_internal@absl@@ABQAPBV45678@@Z
     ??$construct@PAPBVImpl@time_zone@cctz@time_internal@absl@@PAPBV12345@@?$allocator@PAPBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@QAEXPAPAPBVImpl@time_zone@cctz@time_internal@absl@@$$QAPAPBV34567@@Z
     ??$construct@PAPBVImpl@time_zone@cctz@time_internal@absl@@PAPBV12345@X@?$allocator_traits@V?$allocator@PAPBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@@__1@std@@SAXAAV?$allocator@PAPBVImpl@time_zone@cctz@time_internal@absl@@@12@PAPAPBVImpl@time_zone@cctz@time_internal@absl@@$$QAPAPBV45678@@Z
     ??$construct@PAUCordRep@cord_internal@absl@@ABQAU123@@?$allocator@PAUCordRep@cord_internal@absl@@@__1@std@@QAEXPAPAUCordRep@cord_internal@absl@@ABQAU345@@Z
-    ??$construct@PAUCordRep@cord_internal@absl@@ABQAU123@@?$allocator_traits@V?$allocator@PAUCordRep@cord_internal@absl@@@__1@std@@@absl@@SAXAAV?$allocator@PAUCordRep@cord_internal@absl@@@__1@std@@PAPAUCordRep@cord_internal@1@ABQAU561@@Z
     ??$construct@PAUCordRep@cord_internal@absl@@ABQAU123@X@?$allocator_traits@V?$allocator@PAUCordRep@cord_internal@absl@@@__1@std@@@__1@std@@SAXAAV?$allocator@PAUCordRep@cord_internal@absl@@@12@PAPAUCordRep@cord_internal@absl@@ABQAU456@@Z
     ??$construct@PAUCordRep@cord_internal@absl@@PAU123@@?$allocator@PAUCordRep@cord_internal@absl@@@__1@std@@QAEXPAPAUCordRep@cord_internal@absl@@$$QAPAU345@@Z
-    ??$construct@PAUCordRep@cord_internal@absl@@PAU123@@?$allocator_traits@V?$allocator@PAUCordRep@cord_internal@absl@@@__1@std@@@absl@@SAXAAV?$allocator@PAUCordRep@cord_internal@absl@@@__1@std@@PAPAUCordRep@cord_internal@1@$$QAPAU561@@Z
+    ??$construct@PAUCordRep@cord_internal@absl@@PAU123@X@?$allocator_traits@V?$allocator@PAUCordRep@cord_internal@absl@@@__1@std@@@__1@std@@SAXAAV?$allocator@PAUCordRep@cord_internal@absl@@@12@PAPAUCordRep@cord_internal@absl@@$$QAPAU456@@Z
     ??$construct@PAVCordzHandle@cord_internal@absl@@ABQAV123@@?$allocator@PAVCordzHandle@cord_internal@absl@@@__1@std@@QAEXPAPAVCordzHandle@cord_internal@absl@@ABQAV345@@Z
     ??$construct@PAVCordzHandle@cord_internal@absl@@ABQAV123@X@?$allocator_traits@V?$allocator@PAVCordzHandle@cord_internal@absl@@@__1@std@@@__1@std@@SAXAAV?$allocator@PAVCordzHandle@cord_internal@absl@@@12@PAPAVCordzHandle@cord_internal@absl@@ABQAV456@@Z
     ??$construct@PBUCordRep@cord_internal@absl@@ABQBU123@@?$allocator@PBUCordRep@cord_internal@absl@@@__1@std@@QAEXPAPBUCordRep@cord_internal@absl@@ABQBU345@@Z
-    ??$construct@PBUCordRep@cord_internal@absl@@ABQBU123@@?$allocator_traits@V?$allocator@PBUCordRep@cord_internal@absl@@@__1@std@@@absl@@SAXAAV?$allocator@PBUCordRep@cord_internal@absl@@@__1@std@@PAPBUCordRep@cord_internal@1@ABQBU561@@Z
+    ??$construct@PBUCordRep@cord_internal@absl@@ABQBU123@X@?$allocator_traits@V?$allocator@PBUCordRep@cord_internal@absl@@@__1@std@@@__1@std@@SAXAAV?$allocator@PBUCordRep@cord_internal@absl@@@12@PAPBUCordRep@cord_internal@absl@@ABQBU456@@Z
     ??$construct@PBUCordRep@cord_internal@absl@@PBU123@@?$allocator@PBUCordRep@cord_internal@absl@@@__1@std@@QAEXPAPBUCordRep@cord_internal@absl@@$$QAPBU345@@Z
-    ??$construct@PBUCordRep@cord_internal@absl@@PBU123@@?$allocator_traits@V?$allocator@PBUCordRep@cord_internal@absl@@@__1@std@@@absl@@SAXAAV?$allocator@PBUCordRep@cord_internal@absl@@@__1@std@@PAPBUCordRep@cord_internal@1@$$QAPBU561@@Z
+    ??$construct@PBUCordRep@cord_internal@absl@@PBU123@X@?$allocator_traits@V?$allocator@PBUCordRep@cord_internal@absl@@@__1@std@@@__1@std@@SAXAAV?$allocator@PBUCordRep@cord_internal@absl@@@12@PAPBUCordRep@cord_internal@absl@@$$QAPBU456@@Z
     ??$construct@PBVCordzHandle@cord_internal@absl@@ABQBV123@@?$allocator@PBVCordzHandle@cord_internal@absl@@@__1@std@@QAEXPAPBVCordzHandle@cord_internal@absl@@ABQBV345@@Z
     ??$construct@PBVCordzHandle@cord_internal@absl@@ABQBV123@X@?$allocator_traits@V?$allocator@PBVCordzHandle@cord_internal@absl@@@__1@std@@@__1@std@@SAXAAV?$allocator@PBVCordzHandle@cord_internal@absl@@@12@PAPBVCordzHandle@cord_internal@absl@@ABQBV456@@Z
     ??$construct@PBVImpl@time_zone@cctz@time_internal@absl@@ABQBV12345@@?$allocator@PBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@QAEXPAPBVImpl@time_zone@cctz@time_internal@absl@@ABQBV34567@@Z
@@ -564,11 +590,11 @@
     ??$construct@UConversionItem@ParsedFormatBase@str_format_internal@absl@@U1234@@?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__1@std@@QAEXPAUConversionItem@ParsedFormatBase@str_format_internal@absl@@$$QAU3456@@Z
     ??$construct@UConversionItem@ParsedFormatBase@str_format_internal@absl@@U1234@X@?$allocator_traits@V?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__1@std@@@__1@std@@SAXAAV?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@12@PAUConversionItem@ParsedFormatBase@str_format_internal@absl@@$$QAU4567@@Z
     ??$construct@UPayload@status_internal@absl@@ABU123@@?$allocator@UPayload@status_internal@absl@@@__1@std@@QAEXPAUPayload@status_internal@absl@@ABU345@@Z
-    ??$construct@UPayload@status_internal@absl@@ABU123@@?$allocator_traits@V?$allocator@UPayload@status_internal@absl@@@__1@std@@@absl@@SAXAAV?$allocator@UPayload@status_internal@absl@@@__1@std@@PAUPayload@status_internal@1@ABU561@@Z
+    ??$construct@UPayload@status_internal@absl@@ABU123@X@?$allocator_traits@V?$allocator@UPayload@status_internal@absl@@@__1@std@@@__1@std@@SAXAAV?$allocator@UPayload@status_internal@absl@@@12@PAUPayload@status_internal@absl@@ABU456@@Z
     ??$construct@UPayload@status_internal@absl@@U123@@?$allocator@UPayload@status_internal@absl@@@__1@std@@QAEXPAUPayload@status_internal@absl@@$$QAU345@@Z
-    ??$construct@UPayload@status_internal@absl@@U123@@?$allocator_traits@V?$allocator@UPayload@status_internal@absl@@@__1@std@@@absl@@SAXAAV?$allocator@UPayload@status_internal@absl@@@__1@std@@PAUPayload@status_internal@1@$$QAU561@@Z
+    ??$construct@UPayload@status_internal@absl@@U123@X@?$allocator_traits@V?$allocator@UPayload@status_internal@absl@@@__1@std@@@__1@std@@SAXAAV?$allocator@UPayload@status_internal@absl@@@12@PAUPayload@status_internal@absl@@$$QAU456@@Z
     ??$construct@USubRange@absl@@U12@@?$allocator@USubRange@absl@@@__1@std@@QAEXPAUSubRange@absl@@$$QAU34@@Z
-    ??$construct@USubRange@absl@@U12@@?$allocator_traits@V?$allocator@USubRange@absl@@@__1@std@@@absl@@SAXAAV?$allocator@USubRange@absl@@@__1@std@@PAUSubRange@1@$$QAU51@@Z
+    ??$construct@USubRange@absl@@U12@X@?$allocator_traits@V?$allocator@USubRange@absl@@@__1@std@@@__1@std@@SAXAAV?$allocator@USubRange@absl@@@12@PAUSubRange@absl@@$$QAU45@@Z
     ??$construct@UTransition@cctz@time_internal@absl@@$$V@?$allocator@UTransition@cctz@time_internal@absl@@@__1@std@@QAEXPAUTransition@cctz@time_internal@absl@@@Z
     ??$construct@UTransition@cctz@time_internal@absl@@$$VX@?$allocator_traits@V?$allocator@UTransition@cctz@time_internal@absl@@@__1@std@@@__1@std@@SAXAAV?$allocator@UTransition@cctz@time_internal@absl@@@12@PAUTransition@cctz@time_internal@absl@@@Z
     ??$construct@UTransition@cctz@time_internal@absl@@ABU1234@@?$allocator@UTransition@cctz@time_internal@absl@@@__1@std@@QAEXPAUTransition@cctz@time_internal@absl@@ABU3456@@Z
@@ -582,37 +608,23 @@
     ??$construct@UViableSubstitution@strings_internal@absl@@AAVstring_view@3@ABV43@AAI@?$allocator@UViableSubstitution@strings_internal@absl@@@__1@std@@QAEXPAUViableSubstitution@strings_internal@absl@@AAVstring_view@5@ABV65@AAI@Z
     ??$construct@UViableSubstitution@strings_internal@absl@@AAVstring_view@3@ABV43@AAIX@?$allocator_traits@V?$allocator@UViableSubstitution@strings_internal@absl@@@__1@std@@@__1@std@@SAXAAV?$allocator@UViableSubstitution@strings_internal@absl@@@12@PAUViableSubstitution@strings_internal@absl@@AAVstring_view@6@ABV76@AAI@Z
     ??$construct@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@?$optional_data_base@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@optional_internal@absl@@IAEX$$QAV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@Z
-    ??$construct_impl@V?$allocator@H@__1@std@@AAPAHABH@?$allocator_traits@V?$allocator@H@__1@std@@@absl@@CAXHAAV?$allocator@H@__1@std@@AAPAHABH@Z
-    ??$construct_impl@V?$allocator@H@__1@std@@AAPAHH@?$allocator_traits@V?$allocator@H@__1@std@@@absl@@CAXHAAV?$allocator@H@__1@std@@AAPAH$$QAH@Z
-    ??$construct_impl@V?$allocator@PAUCordRep@cord_internal@absl@@@__1@std@@AAPAPAUCordRep@cord_internal@absl@@ABQAU456@@?$allocator_traits@V?$allocator@PAUCordRep@cord_internal@absl@@@__1@std@@@absl@@CAXHAAV?$allocator@PAUCordRep@cord_internal@absl@@@__1@std@@AAPAPAUCordRep@cord_internal@1@ABQAU561@@Z
-    ??$construct_impl@V?$allocator@PAUCordRep@cord_internal@absl@@@__1@std@@AAPAPAUCordRep@cord_internal@absl@@PAU456@@?$allocator_traits@V?$allocator@PAUCordRep@cord_internal@absl@@@__1@std@@@absl@@CAXHAAV?$allocator@PAUCordRep@cord_internal@absl@@@__1@std@@AAPAPAUCordRep@cord_internal@1@$$QAPAU561@@Z
-    ??$construct_impl@V?$allocator@PBUCordRep@cord_internal@absl@@@__1@std@@AAPAPBUCordRep@cord_internal@absl@@ABQBU456@@?$allocator_traits@V?$allocator@PBUCordRep@cord_internal@absl@@@__1@std@@@absl@@CAXHAAV?$allocator@PBUCordRep@cord_internal@absl@@@__1@std@@AAPAPBUCordRep@cord_internal@1@ABQBU561@@Z
-    ??$construct_impl@V?$allocator@PBUCordRep@cord_internal@absl@@@__1@std@@AAPAPBUCordRep@cord_internal@absl@@PBU456@@?$allocator_traits@V?$allocator@PBUCordRep@cord_internal@absl@@@__1@std@@@absl@@CAXHAAV?$allocator@PBUCordRep@cord_internal@absl@@@__1@std@@AAPAPBUCordRep@cord_internal@1@$$QAPBU561@@Z
-    ??$construct_impl@V?$allocator@UPayload@status_internal@absl@@@__1@std@@AAPAUPayload@status_internal@absl@@ABU456@@?$allocator_traits@V?$allocator@UPayload@status_internal@absl@@@__1@std@@@absl@@CAXHAAV?$allocator@UPayload@status_internal@absl@@@__1@std@@AAPAUPayload@status_internal@1@ABU561@@Z
-    ??$construct_impl@V?$allocator@UPayload@status_internal@absl@@@__1@std@@AAPAUPayload@status_internal@absl@@U456@@?$allocator_traits@V?$allocator@UPayload@status_internal@absl@@@__1@std@@@absl@@CAXHAAV?$allocator@UPayload@status_internal@absl@@@__1@std@@AAPAUPayload@status_internal@1@$$QAU561@@Z
-    ??$construct_impl@V?$allocator@USubRange@absl@@@__1@std@@AAPAUSubRange@absl@@U45@@?$allocator_traits@V?$allocator@USubRange@absl@@@__1@std@@@absl@@CAXHAAV?$allocator@USubRange@absl@@@__1@std@@AAPAUSubRange@1@$$QAU51@@Z
     ??$copy@PBVFormatArgImpl@str_format_internal@absl@@PAV123@@__1@std@@YAPAVFormatArgImpl@str_format_internal@absl@@PBV234@0PAV234@@Z
+    ??$countl_zero@I@absl@@YAHI@Z
     ??$countl_zero@_K@absl@@YAH_K@Z
-    ??$destroy@H@?$allocator_traits@V?$allocator@H@__1@std@@@absl@@SAXAAV?$allocator@H@__1@std@@PAH@Z
+    ??$countr_zero@I@absl@@YAHI@Z
     ??$destroy@PAPBVImpl@time_zone@cctz@time_internal@absl@@X@?$allocator_traits@V?$allocator@PAPBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@@__1@std@@SAXAAV?$allocator@PAPBVImpl@time_zone@cctz@time_internal@absl@@@12@PAPAPBVImpl@time_zone@cctz@time_internal@absl@@@Z
-    ??$destroy@PAUCordRep@cord_internal@absl@@@?$allocator_traits@V?$allocator@PAUCordRep@cord_internal@absl@@@__1@std@@@absl@@SAXAAV?$allocator@PAUCordRep@cord_internal@absl@@@__1@std@@PAPAUCordRep@cord_internal@1@@Z
     ??$destroy@PAUCordRep@cord_internal@absl@@X@?$allocator_traits@V?$allocator@PAUCordRep@cord_internal@absl@@@__1@std@@@__1@std@@SAXAAV?$allocator@PAUCordRep@cord_internal@absl@@@12@PAPAUCordRep@cord_internal@absl@@@Z
     ??$destroy@PAVCordzHandle@cord_internal@absl@@X@?$allocator_traits@V?$allocator@PAVCordzHandle@cord_internal@absl@@@__1@std@@@__1@std@@SAXAAV?$allocator@PAVCordzHandle@cord_internal@absl@@@12@PAPAVCordzHandle@cord_internal@absl@@@Z
-    ??$destroy@PBUCordRep@cord_internal@absl@@@?$allocator_traits@V?$allocator@PBUCordRep@cord_internal@absl@@@__1@std@@@absl@@SAXAAV?$allocator@PBUCordRep@cord_internal@absl@@@__1@std@@PAPBUCordRep@cord_internal@1@@Z
+    ??$destroy@PBUCordRep@cord_internal@absl@@X@?$allocator_traits@V?$allocator@PBUCordRep@cord_internal@absl@@@__1@std@@@__1@std@@SAXAAV?$allocator@PBUCordRep@cord_internal@absl@@@12@PAPBUCordRep@cord_internal@absl@@@Z
     ??$destroy@PBVCordzHandle@cord_internal@absl@@X@?$allocator_traits@V?$allocator@PBVCordzHandle@cord_internal@absl@@@__1@std@@@__1@std@@SAXAAV?$allocator@PBVCordzHandle@cord_internal@absl@@@12@PAPBVCordzHandle@cord_internal@absl@@@Z
     ??$destroy@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@XX@?$allocator_traits@V?$allocator@U?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@PAX@__1@std@@@__1@std@@@__1@std@@SAXAAV?$allocator@U?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@PAX@__1@std@@@12@PAU?$pair@$$CBV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@12@@Z
     ??$destroy@UConversionItem@ParsedFormatBase@str_format_internal@absl@@X@?$allocator_traits@V?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__1@std@@@__1@std@@SAXAAV?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@12@PAUConversionItem@ParsedFormatBase@str_format_internal@absl@@@Z
-    ??$destroy@UPayload@status_internal@absl@@@?$allocator_traits@V?$allocator@UPayload@status_internal@absl@@@__1@std@@@absl@@SAXAAV?$allocator@UPayload@status_internal@absl@@@__1@std@@PAUPayload@status_internal@1@@Z
-    ??$destroy@USubRange@absl@@@?$allocator_traits@V?$allocator@USubRange@absl@@@__1@std@@@absl@@SAXAAV?$allocator@USubRange@absl@@@__1@std@@PAUSubRange@1@@Z
+    ??$destroy@UPayload@status_internal@absl@@X@?$allocator_traits@V?$allocator@UPayload@status_internal@absl@@@__1@std@@@__1@std@@SAXAAV?$allocator@UPayload@status_internal@absl@@@12@PAUPayload@status_internal@absl@@@Z
+    ??$destroy@USubRange@absl@@X@?$allocator_traits@V?$allocator@USubRange@absl@@@__1@std@@@__1@std@@SAXAAV?$allocator@USubRange@absl@@@12@PAUSubRange@absl@@@Z
     ??$destroy@UTransition@cctz@time_internal@absl@@X@?$allocator_traits@V?$allocator@UTransition@cctz@time_internal@absl@@@__1@std@@@__1@std@@SAXAAV?$allocator@UTransition@cctz@time_internal@absl@@@12@PAUTransition@cctz@time_internal@absl@@@Z
     ??$destroy@UTransitionType@cctz@time_internal@absl@@X@?$allocator_traits@V?$allocator@UTransitionType@cctz@time_internal@absl@@@__1@std@@@__1@std@@SAXAAV?$allocator@UTransitionType@cctz@time_internal@absl@@@12@PAUTransitionType@cctz@time_internal@absl@@@Z
     ??$destroy@UViableSubstitution@strings_internal@absl@@X@?$allocator_traits@V?$allocator@UViableSubstitution@strings_internal@absl@@@__1@std@@@__1@std@@SAXAAV?$allocator@UViableSubstitution@strings_internal@absl@@@12@PAUViableSubstitution@strings_internal@absl@@@Z
     ??$destroy@VFormatArgImpl@str_format_internal@absl@@X@?$allocator_traits@V?$allocator@VFormatArgImpl@str_format_internal@absl@@@__1@std@@@__1@std@@SAXAAV?$allocator@VFormatArgImpl@str_format_internal@absl@@@12@PAVFormatArgImpl@str_format_internal@absl@@@Z
-    ??$destroy_impl@V?$allocator@H@__1@std@@H@?$allocator_traits@V?$allocator@H@__1@std@@@absl@@CAXHAAV?$allocator@H@__1@std@@PAH@Z
-    ??$destroy_impl@V?$allocator@PAUCordRep@cord_internal@absl@@@__1@std@@PAUCordRep@cord_internal@absl@@@?$allocator_traits@V?$allocator@PAUCordRep@cord_internal@absl@@@__1@std@@@absl@@CAXHAAV?$allocator@PAUCordRep@cord_internal@absl@@@__1@std@@PAPAUCordRep@cord_internal@1@@Z
-    ??$destroy_impl@V?$allocator@PBUCordRep@cord_internal@absl@@@__1@std@@PBUCordRep@cord_internal@absl@@@?$allocator_traits@V?$allocator@PBUCordRep@cord_internal@absl@@@__1@std@@@absl@@CAXHAAV?$allocator@PBUCordRep@cord_internal@absl@@@__1@std@@PAPBUCordRep@cord_internal@1@@Z
-    ??$destroy_impl@V?$allocator@UPayload@status_internal@absl@@@__1@std@@UPayload@status_internal@absl@@@?$allocator_traits@V?$allocator@UPayload@status_internal@absl@@@__1@std@@@absl@@CAXHAAV?$allocator@UPayload@status_internal@absl@@@__1@std@@PAUPayload@status_internal@1@@Z
-    ??$destroy_impl@V?$allocator@USubRange@absl@@@__1@std@@USubRange@absl@@@?$allocator_traits@V?$allocator@USubRange@absl@@@__1@std@@@absl@@CAXHAAV?$allocator@USubRange@absl@@@__1@std@@PAUSubRange@1@@Z
     ??$distance@PBUPayload@status_internal@absl@@@__1@std@@YAHPBUPayload@status_internal@absl@@0@Z
     ??$distance@PBUTransition@cctz@time_internal@absl@@@__1@std@@YAHPBUTransition@cctz@time_internal@absl@@0@Z
     ??$distance@PBVFormatArgImpl@str_format_internal@absl@@@__1@std@@YAHPBVFormatArgImpl@str_format_internal@absl@@0@Z
@@ -632,14 +644,11 @@
     ??$emplace_back@UPayload@status_internal@absl@@@?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__1@std@@@absl@@QAEAAUPayload@status_internal@1@$$QAU231@@Z
     ??$emplace_back@USubRange@absl@@@?$InlinedVector@USubRange@absl@@$0CP@V?$allocator@USubRange@absl@@@__1@std@@@absl@@QAEAAUSubRange@1@$$QAU21@@Z
     ??$find@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@?$__hash_table@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@V?$__unordered_map_hasher@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@23@$00@23@V?$__unordered_map_equal@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@23@$00@23@V?$allocator@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@@23@@__1@std@@QAE?AV?$__hash_iterator@PAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@PAX@__1@std@@@12@ABV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@12@@Z
+    ??$find_first_non_full@X@container_internal@absl@@YA?AUFindInfo@01@PBW4ctrl_t@01@II@Z
     ??$forward@$$T@absl@@YA$$QA$$TAA$$T@Z
     ??$forward@AAI@absl@@YAAAIAAI@Z
-    ??$forward@AAPAPAUCordRep@cord_internal@absl@@@__1@std@@YAAAPAPAUCordRep@cord_internal@absl@@AAPAPAU234@@Z
-    ??$forward@AAPAPBUCordRep@cord_internal@absl@@@__1@std@@YAAAPAPBUCordRep@cord_internal@absl@@AAPAPBU234@@Z
     ??$forward@AAPAPBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@YAAAPAPBVImpl@time_zone@cctz@time_internal@absl@@AAPAPBV23456@@Z
     ??$forward@AAPAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@PAX@__1@std@@@__1@std@@YAAAPAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@PAX@01@AAPAU201@@Z
-    ??$forward@AAPAUPayload@status_internal@absl@@@__1@std@@YAAAPAUPayload@status_internal@absl@@AAPAU234@@Z
-    ??$forward@AAPAUSubRange@absl@@@__1@std@@YAAAPAUSubRange@absl@@AAPAU23@@Z
     ??$forward@AAPAUThreadIdentity@base_internal@absl@@@__1@std@@YAAAPAUThreadIdentity@base_internal@absl@@AAPAU234@@Z
     ??$forward@AAPAV?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__1@std@@@absl@@@__1@std@@YAAAPAV?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__1@std@@@absl@@AAPAV23@@Z
     ??$forward@AAPAVTimeZoneIf@cctz@time_internal@absl@@@__1@std@@YAAAPAVTimeZoneIf@cctz@time_internal@absl@@AAPAV2345@@Z
@@ -800,18 +809,19 @@
     ??$swap@UViableSubstitution@strings_internal@absl@@@__1@std@@YAXAAUViableSubstitution@strings_internal@absl@@0@Z
     ??$upper_bound@PBUTransition@cctz@time_internal@absl@@U1234@UByCivilTime@1234@@__1@std@@YAPBUTransition@cctz@time_internal@absl@@PBU2345@0ABU2345@UByCivilTime@2345@@Z
     ??$upper_bound@PBUTransition@cctz@time_internal@absl@@U1234@UByUnixTime@1234@@__1@std@@YAPBUTransition@cctz@time_internal@absl@@PBU2345@0ABU2345@UByUnixTime@2345@@Z
-    ??0?$AllocationTransaction@V?$allocator@H@__1@std@@@inlined_vector_internal@absl@@QAE@PAV?$allocator@H@__1@std@@@Z
-    ??0?$AllocationTransaction@V?$allocator@PAUCordRep@cord_internal@absl@@@__1@std@@@inlined_vector_internal@absl@@QAE@PAV?$allocator@PAUCordRep@cord_internal@absl@@@__1@std@@@Z
-    ??0?$AllocationTransaction@V?$allocator@PBUCordRep@cord_internal@absl@@@__1@std@@@inlined_vector_internal@absl@@QAE@PAV?$allocator@PBUCordRep@cord_internal@absl@@@__1@std@@@Z
-    ??0?$AllocationTransaction@V?$allocator@UPayload@status_internal@absl@@@__1@std@@@inlined_vector_internal@absl@@QAE@PAV?$allocator@UPayload@status_internal@absl@@@__1@std@@@Z
-    ??0?$AllocationTransaction@V?$allocator@USubRange@absl@@@__1@std@@@inlined_vector_internal@absl@@QAE@PAV?$allocator@USubRange@absl@@@__1@std@@@Z
+    ??0?$AllocationTransaction@V?$allocator@H@__1@std@@@inlined_vector_internal@absl@@QAE@AAV?$allocator@H@__1@std@@@Z
+    ??0?$AllocationTransaction@V?$allocator@PAUCordRep@cord_internal@absl@@@__1@std@@@inlined_vector_internal@absl@@QAE@AAV?$allocator@PAUCordRep@cord_internal@absl@@@__1@std@@@Z
+    ??0?$AllocationTransaction@V?$allocator@PBUCordRep@cord_internal@absl@@@__1@std@@@inlined_vector_internal@absl@@QAE@AAV?$allocator@PBUCordRep@cord_internal@absl@@@__1@std@@@Z
+    ??0?$AllocationTransaction@V?$allocator@UPayload@status_internal@absl@@@__1@std@@@inlined_vector_internal@absl@@QAE@AAV?$allocator@UPayload@status_internal@absl@@@__1@std@@@Z
+    ??0?$AllocationTransaction@V?$allocator@USubRange@absl@@@__1@std@@@inlined_vector_internal@absl@@QAE@AAV?$allocator@USubRange@absl@@@__1@std@@@Z
     ??0?$BigUnsigned@$03@strings_internal@absl@@QAE@Vstring_view@2@@Z
     ??0?$BigUnsigned@$03@strings_internal@absl@@QAE@XZ
     ??0?$BigUnsigned@$03@strings_internal@absl@@QAE@_K@Z
     ??0?$BigUnsigned@$0FE@@strings_internal@absl@@QAE@Vstring_view@2@@Z
     ??0?$BigUnsigned@$0FE@@strings_internal@absl@@QAE@XZ
     ??0?$BigUnsigned@$0FE@@strings_internal@absl@@QAE@_K@Z
-    ??0?$CopyValueAdapter@V?$allocator@PAUCordRep@cord_internal@absl@@@__1@std@@@inlined_vector_internal@absl@@QAE@ABQAUCordRep@cord_internal@2@@Z
+    ??0?$BitMask@I$0BA@$0A@@container_internal@absl@@QAE@I@Z
+    ??0?$CopyValueAdapter@V?$allocator@PAUCordRep@cord_internal@absl@@@__1@std@@@inlined_vector_internal@absl@@QAE@PBQAUCordRep@cord_internal@2@@Z
     ??0?$FixedArray@PAUCordRep@cord_internal@absl@@$0PPPPPPPP@V?$allocator@PAUCordRep@cord_internal@absl@@@__1@std@@@absl@@QAE@IABV?$allocator@PAUCordRep@cord_internal@absl@@@__1@std@@@Z
     ??0?$InlinedVector@H$0CP@V?$allocator@H@__1@std@@@absl@@QAE@XZ
     ??0?$InlinedVector@PAUCordRep@cord_internal@absl@@$01V?$allocator@PAUCordRep@cord_internal@absl@@@__1@std@@@absl@@QAE@XZ
@@ -836,7 +846,9 @@
     ??0?$Span@$$CBVFormatArgImpl@str_format_internal@absl@@@absl@@QAE@PBVFormatArgImpl@str_format_internal@1@I@Z
     ??0?$Span@$$CBVFormatArgImpl@str_format_internal@absl@@@absl@@QAE@XZ
     ??0?$Span@D@absl@@QAE@PADI@Z
+    ??0?$Span@D@absl@@QAE@XZ
     ??0?$Span@I@absl@@QAE@PAII@Z
+    ??0?$Span@QAUCordRep@cord_internal@absl@@@absl@@QAE@PBQAUCordRep@cord_internal@1@I@Z
     ??0?$Span@QAX@absl@@QAE@PBQAXI@Z
     ??0?$Span@VFormatArgImpl@str_format_internal@absl@@@absl@@QAE@PAVFormatArgImpl@str_format_internal@1@I@Z
     ??0?$Storage@H$0CP@V?$allocator@H@__1@std@@@inlined_vector_internal@absl@@QAE@XZ
@@ -977,6 +989,7 @@
     ??0?$optional_data_base@VCord@absl@@@optional_internal@absl@@QAE@XZ
     ??0?$optional_data_dtor_base@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@$0A@@optional_internal@absl@@IAE@XZ
     ??0?$optional_data_dtor_base@VCord@absl@@$0A@@optional_internal@absl@@IAE@XZ
+    ??0?$probe_seq@$0BA@@container_internal@absl@@QAE@II@Z
     ??0?$unique_ptr@V?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__1@std@@@absl@@U?$default_delete@V?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__1@std@@@absl@@@__1@std@@@__1@std@@QAE@$$QAV012@@Z
     ??0?$unordered_map@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PBVImpl@time_zone@cctz@time_internal@absl@@U?$hash@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@@23@@__1@std@@QAE@XZ
     ??0?$vector@PAUCordRep@cord_internal@absl@@V?$allocator@PAUCordRep@cord_internal@absl@@@__1@std@@@__1@std@@QAE@V?$initializer_list@PAUCordRep@cord_internal@absl@@@2@@Z
@@ -987,6 +1000,7 @@
     ??0?$vector@UTransitionType@cctz@time_internal@absl@@V?$allocator@UTransitionType@cctz@time_internal@absl@@@__1@std@@@__1@std@@QAE@XZ
     ??0?$vector@UViableSubstitution@strings_internal@absl@@V?$allocator@UViableSubstitution@strings_internal@absl@@@__1@std@@@__1@std@@QAE@XZ
     ??0?$vector@VFormatArgImpl@str_format_internal@absl@@V?$allocator@VFormatArgImpl@str_format_internal@absl@@@__1@std@@@__1@std@@QAE@XZ
+    ??0AlphaNum@absl@@QAE@H@Z
     ??0AlphaNum@absl@@QAE@I@Z
     ??0AlphaNum@absl@@QAE@PBD@Z
     ??0AlphaNum@absl@@QAE@UDec@1@@Z
@@ -997,6 +1011,8 @@
     ??0Arg@substitute_internal@absl@@QAE@PBX@Z
     ??0Arg@substitute_internal@absl@@QAE@UDec@2@@Z
     ??0Arg@substitute_internal@absl@@QAE@UHex@2@@Z
+    ??0BadStatusOrAccess@absl@@QAE@$$QAV01@@Z
+    ??0BadStatusOrAccess@absl@@QAE@ABV01@@Z
     ??0BadStatusOrAccess@absl@@QAE@VStatus@1@@Z
     ??0BlockingCounter@absl@@QAE@H@Z
     ??0BoundConversion@str_format_internal@absl@@QAE@XZ
@@ -1019,11 +1035,13 @@
     ??0Cord@absl@@QAE@XZ
     ??0CordForest@absl@@QAE@I@Z
     ??0CordRep@cord_internal@absl@@QAE@XZ
+    ??0CordRepBtree@cord_internal@absl@@AAE@XZ
+    ??0CordRepBtreeNavigator@cord_internal@absl@@QAE@XZ
+    ??0CordRepBtreeReader@cord_internal@absl@@QAE@XZ
     ??0CordRepConcat@cord_internal@absl@@QAE@XZ
     ??0CordRepExternal@cord_internal@absl@@QAE@XZ
     ??0CordRepFlat@cord_internal@absl@@QAE@XZ
     ??0CordRepRing@cord_internal@absl@@AAE@I@Z
-    ??0CordRepRingReader@cord_internal@absl@@QAE@XZ
     ??0CordRepSubstring@cord_internal@absl@@QAE@XZ
     ??0CordzHandle@cord_internal@absl@@IAE@_N@Z
     ??0CordzHandle@cord_internal@absl@@QAE@XZ
@@ -1040,9 +1058,10 @@
     ??0FormatConversionSpecImpl@str_format_internal@absl@@QAE@XZ
     ??0FormatSinkImpl@str_format_internal@absl@@QAE@VFormatRawSinkImpl@12@@Z
     ??0GraphCycles@synchronization_internal@absl@@QAE@XZ
-    ??0GroupSse2Impl@container_internal@absl@@QAE@PBC@Z
+    ??0GroupSse2Impl@container_internal@absl@@QAE@PBW4ctrl_t@12@@Z
     ??0HashtablezInfo@container_internal@absl@@QAE@XZ
     ??0HashtablezSampler@container_internal@absl@@QAE@XZ
+    ??0Hex@absl@@AAE@W4PadSpec@1@_K@Z
     ??0Impl@time_zone@cctz@time_internal@absl@@AAE@ABV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@Z
     ??0InlineData@cord_internal@absl@@QAE@W4DefaultInitType@012@@Z
     ??0InlineData@cord_internal@absl@@QAE@XZ
@@ -1063,7 +1082,7 @@
     ??0Payload@status_internal@absl@@QAE@$$QAU012@@Z
     ??0Payload@status_internal@absl@@QAE@ABU012@@Z
     ??0PosixTimeZone@cctz@time_internal@absl@@QAE@XZ
-    ??0Refcount@cord_internal@absl@@QAE@XZ
+    ??0RefcountAndFlags@cord_internal@absl@@QAE@XZ
     ??0Rep@GraphCycles@synchronization_internal@absl@@QAE@XZ
     ??0SchedulingHelper@base_internal@absl@@QAE@W4SchedulingMode@12@@Z
     ??0ScopedDisable@SchedulingGuard@base_internal@absl@@QAE@XZ
@@ -1071,6 +1090,7 @@
     ??0SpinLock@base_internal@absl@@QAE@W4SchedulingMode@12@@Z
     ??0SpinLockHolder@base_internal@absl@@QAE@PAVSpinLock@12@@Z
     ??0Status@absl@@QAE@$$QAV01@@Z
+    ??0Status@absl@@QAE@ABV01@@Z
     ??0Status@absl@@QAE@W4StatusCode@1@Vstring_view@1@@Z
     ??0StatusRep@status_internal@absl@@QAE@W4StatusCode@2@Vstring_view@2@V?$unique_ptr@V?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__1@std@@@absl@@U?$default_delete@V?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__1@std@@@absl@@@__1@std@@@__1@std@@@Z
     ??0Storage@?$FixedArray@PAUCordRep@cord_internal@absl@@$0PPPPPPPP@V?$allocator@PAUCordRep@cord_internal@absl@@@__1@std@@@absl@@QAE@IABV?$allocator@PAUCordRep@cord_internal@absl@@@__1@std@@@Z
@@ -1113,6 +1133,8 @@
     ??0int128@absl@@QAE@M@Z
     ??0int128@absl@@QAE@N@Z
     ??0int128@absl@@QAE@O@Z
+    ??0once_flag@absl@@QAE@XZ
+    ??0string_view@absl@@AAE@PBDIUSkipCheckLengthTag@01@@Z
     ??0string_view@absl@@QAE@PBD@Z
     ??0string_view@absl@@QAE@PBDI@Z
     ??0string_view@absl@@QAE@XZ
@@ -1236,12 +1258,15 @@
     ??4?$optional@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@absl@@QAEAAV01@$$QAV01@@Z
     ??4?$optional_data@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@$0A@@optional_internal@absl@@IAEAAV012@$$QAV012@@Z
     ??4?$unique_ptr@V?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__1@std@@@absl@@U?$default_delete@V?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__1@std@@@absl@@@__1@std@@@__1@std@@QAEAAV012@$$QAV012@@Z
+    ??4BadStatusOrAccess@absl@@QAEAAV01@$$QAV01@@Z
+    ??4BadStatusOrAccess@absl@@QAEAAV01@ABV01@@Z
     ??4Cord@absl@@QAEAAV01@$$QAV01@@Z
     ??4Cord@absl@@QAEAAV01@Vstring_view@1@@Z
     ??4CordzUpdateTracker@cord_internal@absl@@QAEAAV012@ABV012@@Z
     ??4InlineRep@Cord@absl@@QAEAAV012@$$QAV012@@Z
     ??4Payload@status_internal@absl@@QAEAAU012@$$QAU012@@Z
     ??4Status@absl@@QAEAAV01@$$QAV01@@Z
+    ??4Status@absl@@QAEAAV01@ABV01@@Z
     ??4int128@absl@@QAEAAV01@H@Z
     ??4uint128@absl@@QAEAAV01@H@Z
     ??4uint128@absl@@QAEAAV01@_J@Z
@@ -1308,12 +1333,13 @@
     ??A?$vector@UViableSubstitution@strings_internal@absl@@V?$allocator@UViableSubstitution@strings_internal@absl@@@__1@std@@@__1@std@@QAEAAUViableSubstitution@strings_internal@absl@@I@Z
     ??ACord@absl@@QBEDI@Z
     ??Astring_view@absl@@QBEABDI@Z
+    ??B?$BitMask@I$0BA@$0A@@container_internal@absl@@QBE_NXZ
     ??B?$__atomic_base@PAVCordzHandle@cord_internal@absl@@$0A@@__1@std@@QBEPAVCordzHandle@cord_internal@absl@@XZ
     ??B?$unique_ptr@V?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__1@std@@@absl@@U?$default_delete@V?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__1@std@@@absl@@@__1@std@@@__1@std@@QBE_NXZ
     ??B?$unique_ptr@VTimeZoneIf@cctz@time_internal@absl@@U?$default_delete@VTimeZoneIf@cctz@time_internal@absl@@@__1@std@@@__1@std@@QBE_NXZ
     ??B?$unique_ptr@VZoneInfoSource@cctz@time_internal@absl@@U?$default_delete@VZoneInfoSource@cctz@time_internal@absl@@@__1@std@@@__1@std@@QBE_NXZ
     ??BCord@absl@@QBE?AV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@XZ
-    ??BCordRepRingReader@cord_internal@absl@@QBE_NXZ
+    ??BCordRepBtreeReader@cord_internal@absl@@QBE_NXZ
     ??BTimeZone@absl@@QBE?AVtime_zone@cctz@time_internal@1@XZ
     ??Bint128@absl@@QBEEXZ
     ??Bint128@absl@@QBENXZ
@@ -1462,6 +1488,7 @@
     ??RByCivilTime@Transition@cctz@time_internal@absl@@QBE_NABU1234@0@Z
     ??RByUnixTime@Transition@cctz@time_internal@absl@@QBE_NABU1234@0@Z
     ??Sabsl@@YA?AVuint128@0@V10@@Z
+    ??Uabsl@@YA?AVuint128@0@V10@0@Z
     ??Ustr_format_internal@absl@@YA?AW4Flags@01@W4201@0@Z
     ??XDuration@absl@@QAEAAV01@N@Z
     ??XDuration@absl@@QAEAAV01@_J@Z
@@ -1493,15 +1520,16 @@
     ?AbslParseFlag@absl@@YA_NVstring_view@1@PAVTime@1@PAV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@Z
     ?AbslUnparseFlag@absl@@YA?AV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@VDuration@1@@Z
     ?AbslUnparseFlag@absl@@YA?AV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@VTime@1@@Z
-    ?AcquireAllocatedData@?$Storage@H$0CP@V?$allocator@H@__1@std@@@inlined_vector_internal@absl@@QAEXPAV?$AllocationTransaction@V?$allocator@H@__1@std@@@23@@Z
-    ?AcquireAllocatedData@?$Storage@PAUCordRep@cord_internal@absl@@$01V?$allocator@PAUCordRep@cord_internal@absl@@@__1@std@@@inlined_vector_internal@absl@@QAEXPAV?$AllocationTransaction@V?$allocator@PAUCordRep@cord_internal@absl@@@__1@std@@@23@@Z
-    ?AcquireAllocatedData@?$Storage@PAUCordRep@cord_internal@absl@@$0CP@V?$allocator@PAUCordRep@cord_internal@absl@@@__1@std@@@inlined_vector_internal@absl@@QAEXPAV?$AllocationTransaction@V?$allocator@PAUCordRep@cord_internal@absl@@@__1@std@@@23@@Z
-    ?AcquireAllocatedData@?$Storage@PBUCordRep@cord_internal@absl@@$0CP@V?$allocator@PBUCordRep@cord_internal@absl@@@__1@std@@@inlined_vector_internal@absl@@QAEXPAV?$AllocationTransaction@V?$allocator@PBUCordRep@cord_internal@absl@@@__1@std@@@23@@Z
-    ?AcquireAllocatedData@?$Storage@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__1@std@@@inlined_vector_internal@absl@@QAEXPAV?$AllocationTransaction@V?$allocator@UPayload@status_internal@absl@@@__1@std@@@23@@Z
-    ?AcquireAllocatedData@?$Storage@USubRange@absl@@$0CP@V?$allocator@USubRange@absl@@@__1@std@@@inlined_vector_internal@absl@@QAEXPAV?$AllocationTransaction@V?$allocator@USubRange@absl@@@__1@std@@@23@@Z
+    ?AcquireAllocatedData@?$Storage@H$0CP@V?$allocator@H@__1@std@@@inlined_vector_internal@absl@@QAEXAAV?$AllocationTransaction@V?$allocator@H@__1@std@@@23@@Z
+    ?AcquireAllocatedData@?$Storage@PAUCordRep@cord_internal@absl@@$01V?$allocator@PAUCordRep@cord_internal@absl@@@__1@std@@@inlined_vector_internal@absl@@QAEXAAV?$AllocationTransaction@V?$allocator@PAUCordRep@cord_internal@absl@@@__1@std@@@23@@Z
+    ?AcquireAllocatedData@?$Storage@PAUCordRep@cord_internal@absl@@$0CP@V?$allocator@PAUCordRep@cord_internal@absl@@@__1@std@@@inlined_vector_internal@absl@@QAEXAAV?$AllocationTransaction@V?$allocator@PAUCordRep@cord_internal@absl@@@__1@std@@@23@@Z
+    ?AcquireAllocatedData@?$Storage@PBUCordRep@cord_internal@absl@@$0CP@V?$allocator@PBUCordRep@cord_internal@absl@@@__1@std@@@inlined_vector_internal@absl@@QAEXAAV?$AllocationTransaction@V?$allocator@PBUCordRep@cord_internal@absl@@@__1@std@@@23@@Z
+    ?AcquireAllocatedData@?$Storage@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__1@std@@@inlined_vector_internal@absl@@QAEXAAV?$AllocationTransaction@V?$allocator@UPayload@status_internal@absl@@@__1@std@@@23@@Z
+    ?AcquireAllocatedData@?$Storage@USubRange@absl@@$0CP@V?$allocator@USubRange@absl@@@__1@std@@@inlined_vector_internal@absl@@QAEXAAV?$AllocationTransaction@V?$allocator@USubRange@absl@@@__1@std@@@23@@Z
     ?Add@Filler@CordRepRing@cord_internal@absl@@QAEXPAUCordRep@34@II@Z
     ?AddDataOffset@CordRepRing@cord_internal@absl@@AAEXII@Z
     ?AddNode@CordForest@absl@@AAEXPAUCordRep@cord_internal@2@@Z
+    ?AddResult@int128_internal@absl@@YA?AVuint128@2@V32@0@Z
     ?AddSize@?$Storage@H$0CP@V?$allocator@H@__1@std@@@inlined_vector_internal@absl@@QAEXI@Z
     ?AddSize@?$Storage@PAUCordRep@cord_internal@absl@@$01V?$allocator@PAUCordRep@cord_internal@absl@@@__1@std@@@inlined_vector_internal@absl@@QAEXI@Z
     ?AddSize@?$Storage@PAUCordRep@cord_internal@absl@@$0CP@V?$allocator@PAUCordRep@cord_internal@absl@@@__1@std@@@inlined_vector_internal@absl@@QAEXI@Z
@@ -1514,12 +1542,14 @@
     ?AddWithCarry@?$BigUnsigned@$0FE@@strings_internal@absl@@AAEXH_K@Z
     ?AddressIsReadable@debugging_internal@absl@@YA_NPBX@Z
     ?AdvanceAndReadBytes@ChunkIterator@Cord@absl@@AAE?AV23@I@Z
+    ?AdvanceBtree@ChunkIterator@Cord@absl@@AAEAAV123@XZ
     ?AdvanceBytes@ChunkIterator@Cord@absl@@AAEXI@Z
-    ?AdvanceBytesRing@ChunkIterator@Cord@absl@@AAEXI@Z
+    ?AdvanceBytesBtree@ChunkIterator@Cord@absl@@AAEXI@Z
     ?AdvanceBytesSlowPath@ChunkIterator@Cord@absl@@AAEXI@Z
-    ?AdvanceRing@ChunkIterator@Cord@absl@@AAEAAV123@XZ
     ?AdvanceStack@ChunkIterator@Cord@absl@@AAEAAV123@XZ
     ?Align@adl_barrier@internal_layout@container_internal@absl@@YAIII@Z
+    ?AlignBegin@CordRepBtree@cord_internal@absl@@AAEXXZ
+    ?AlignEnd@CordRepBtree@cord_internal@absl@@AAEXXZ
     ?Alloc@LowLevelAlloc@base_internal@absl@@SAPAXI@Z
     ?AllocSize@?$LayoutImpl@V?$tuple@IPAUCordRep@cord_internal@absl@@I@__1@std@@U?$integer_sequence@I$0A@$00$01@absl@@U45@@internal_layout@container_internal@absl@@QBEIXZ
     ?AllocSize@CordRepRing@cord_internal@absl@@SAII@Z
@@ -1538,6 +1568,8 @@
     ?Append@Cord@absl@@QAEX$$QAV12@@Z
     ?Append@Cord@absl@@QAEXABV12@@Z
     ?Append@Cord@absl@@QAEXVstring_view@2@@Z
+    ?Append@CordRepBtree@cord_internal@absl@@SAPAV123@PAV123@PAUCordRep@23@@Z
+    ?Append@CordRepBtree@cord_internal@absl@@SAPAV123@PAV123@Vstring_view@3@I@Z
     ?Append@CordRepRing@cord_internal@absl@@SAPAV123@PAV123@PAUCordRep@23@@Z
     ?Append@CordRepRing@cord_internal@absl@@SAPAV123@PAV123@Vstring_view@3@I@Z
     ?Append@FormatSinkImpl@str_format_internal@absl@@QAEXID@Z
@@ -1548,6 +1580,7 @@
     ?AppendNode@CordForest@absl@@AAEPAUCordRep@cord_internal@2@PAU342@0@Z
     ?AppendPack@str_format_internal@absl@@YAAAV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PAV345@VUntypedFormatSpecImpl@12@V?$Span@$$CBVFormatArgImpl@str_format_internal@absl@@@2@@Z
     ?AppendPieces@strings_internal@absl@@YAXPAV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@V?$initializer_list@Vstring_view@absl@@@5@@Z
+    ?AppendSlow@CordRepBtree@cord_internal@absl@@CAPAV123@PAV123@PAUCordRep@23@@Z
     ?AppendSlow@CordRepRing@cord_internal@absl@@CAPAV123@PAV123@PAUCordRep@23@@Z
     ?AppendText@ParsedFormatConsumer@ParsedFormatBase@str_format_internal@absl@@QAEIVstring_view@4@@Z
     ?AppendTree@InlineRep@Cord@absl@@QAEXPAUCordRep@cord_internal@3@W4MethodIdentifier@CordzUpdateTracker@53@@Z
@@ -1561,6 +1594,8 @@
     ?AssertHeld@Mutex@absl@@QBEXXZ
     ?AssertNotHeld@Mutex@absl@@QBEXXZ
     ?AssertReaderHeld@Mutex@absl@@QBEXXZ
+    ?AssertValid@CordRepBtree@cord_internal@absl@@SAPAV123@PAV123@_N@Z
+    ?AssertValid@CordRepBtree@cord_internal@absl@@SAPBV123@PBV123@_N@Z
     ?AssignLargeString@Cord@absl@@AAEAAV12@$$QAV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@Z
     ?AssignNext@?$IteratorValueAdapter@V?$allocator@UPayload@status_internal@absl@@@__1@std@@V?$move_iterator@PAUPayload@status_internal@absl@@@23@@inlined_vector_internal@absl@@QAEXPAUPayload@status_internal@3@@Z
     ?AssignSlow@InlineRep@Cord@absl@@AAEXABV123@@Z
@@ -1618,13 +1653,13 @@
     ?ComputeCapacity@?$Storage@PAUCordRep@cord_internal@absl@@$0CP@V?$allocator@PAUCordRep@cord_internal@absl@@@__1@std@@@inlined_vector_internal@absl@@SAIII@Z
     ?ComputeCapacity@?$Storage@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__1@std@@@inlined_vector_internal@absl@@SAIII@Z
     ?ConcatNodes@CordForest@absl@@QAEPAUCordRep@cord_internal@2@XZ
-    ?ConstructNext@?$CopyValueAdapter@V?$allocator@PAUCordRep@cord_internal@absl@@@__1@std@@@inlined_vector_internal@absl@@QAEXPAV?$allocator@PAUCordRep@cord_internal@absl@@@__1@std@@PAPAUCordRep@cord_internal@3@@Z
-    ?ConstructNext@?$IteratorValueAdapter@V?$allocator@H@__1@std@@V?$move_iterator@PAH@23@@inlined_vector_internal@absl@@QAEXPAV?$allocator@H@__1@std@@PAH@Z
-    ?ConstructNext@?$IteratorValueAdapter@V?$allocator@PAUCordRep@cord_internal@absl@@@__1@std@@V?$move_iterator@PAPAUCordRep@cord_internal@absl@@@23@@inlined_vector_internal@absl@@QAEXPAV?$allocator@PAUCordRep@cord_internal@absl@@@__1@std@@PAPAUCordRep@cord_internal@3@@Z
-    ?ConstructNext@?$IteratorValueAdapter@V?$allocator@PBUCordRep@cord_internal@absl@@@__1@std@@V?$move_iterator@PAPBUCordRep@cord_internal@absl@@@23@@inlined_vector_internal@absl@@QAEXPAV?$allocator@PBUCordRep@cord_internal@absl@@@__1@std@@PAPBUCordRep@cord_internal@3@@Z
-    ?ConstructNext@?$IteratorValueAdapter@V?$allocator@UPayload@status_internal@absl@@@__1@std@@PBUPayload@status_internal@absl@@@inlined_vector_internal@absl@@QAEXPAV?$allocator@UPayload@status_internal@absl@@@__1@std@@PAUPayload@status_internal@3@@Z
-    ?ConstructNext@?$IteratorValueAdapter@V?$allocator@UPayload@status_internal@absl@@@__1@std@@V?$move_iterator@PAUPayload@status_internal@absl@@@23@@inlined_vector_internal@absl@@QAEXPAV?$allocator@UPayload@status_internal@absl@@@__1@std@@PAUPayload@status_internal@3@@Z
-    ?ConstructNext@?$IteratorValueAdapter@V?$allocator@USubRange@absl@@@__1@std@@V?$move_iterator@PAUSubRange@absl@@@23@@inlined_vector_internal@absl@@QAEXPAV?$allocator@USubRange@absl@@@__1@std@@PAUSubRange@3@@Z
+    ?ConstructNext@?$CopyValueAdapter@V?$allocator@PAUCordRep@cord_internal@absl@@@__1@std@@@inlined_vector_internal@absl@@QAEXAAV?$allocator@PAUCordRep@cord_internal@absl@@@__1@std@@PAPAUCordRep@cord_internal@3@@Z
+    ?ConstructNext@?$IteratorValueAdapter@V?$allocator@H@__1@std@@V?$move_iterator@PAH@23@@inlined_vector_internal@absl@@QAEXAAV?$allocator@H@__1@std@@PAH@Z
+    ?ConstructNext@?$IteratorValueAdapter@V?$allocator@PAUCordRep@cord_internal@absl@@@__1@std@@V?$move_iterator@PAPAUCordRep@cord_internal@absl@@@23@@inlined_vector_internal@absl@@QAEXAAV?$allocator@PAUCordRep@cord_internal@absl@@@__1@std@@PAPAUCordRep@cord_internal@3@@Z
+    ?ConstructNext@?$IteratorValueAdapter@V?$allocator@PBUCordRep@cord_internal@absl@@@__1@std@@V?$move_iterator@PAPBUCordRep@cord_internal@absl@@@23@@inlined_vector_internal@absl@@QAEXAAV?$allocator@PBUCordRep@cord_internal@absl@@@__1@std@@PAPBUCordRep@cord_internal@3@@Z
+    ?ConstructNext@?$IteratorValueAdapter@V?$allocator@UPayload@status_internal@absl@@@__1@std@@PBUPayload@status_internal@absl@@@inlined_vector_internal@absl@@QAEXAAV?$allocator@UPayload@status_internal@absl@@@__1@std@@PAUPayload@status_internal@3@@Z
+    ?ConstructNext@?$IteratorValueAdapter@V?$allocator@UPayload@status_internal@absl@@@__1@std@@V?$move_iterator@PAUPayload@status_internal@absl@@@23@@inlined_vector_internal@absl@@QAEXAAV?$allocator@UPayload@status_internal@absl@@@__1@std@@PAUPayload@status_internal@3@@Z
+    ?ConstructNext@?$IteratorValueAdapter@V?$allocator@USubRange@absl@@@__1@std@@V?$move_iterator@PAUSubRange@absl@@@23@@inlined_vector_internal@absl@@QAEXAAV?$allocator@USubRange@absl@@@__1@std@@PAUSubRange@3@@Z
     ?Consume@cord_internal@absl@@YAXPAUCordRep@12@V?$FunctionRef@$$A6AXPAUCordRep@cord_internal@absl@@II@Z@2@@Z
     ?ConsumePrefix@absl@@YA_NPAVstring_view@1@V21@@Z
     ?ConsumeUnboundConversion@str_format_internal@absl@@YAPBDPBD0PAUUnboundConversion@12@PAH@Z
@@ -1632,22 +1667,32 @@
     ?Contains@str_format_internal@absl@@YA_NW4FormatConversionCharSet@2@W4FormatConversionChar@2@@Z
     ?ControlWord@base_internal@absl@@YAPAU?$atomic@I@__1@std@@PAVonce_flag@2@@Z
     ?ConvertDateTime@absl@@YA?AUTimeConversion@1@_JHHHHHVTimeZone@1@@Z
-    ?ConvertDeletedToEmptyAndFullToDeleted@container_internal@absl@@YAXPACI@Z
+    ?ConvertDeletedToEmptyAndFullToDeleted@container_internal@absl@@YAXPAW4ctrl_t@12@I@Z
     ?ConvertFloatImpl@str_format_internal@absl@@YA_NMABVFormatConversionSpecImpl@12@PAVFormatSinkImpl@12@@Z
     ?ConvertFloatImpl@str_format_internal@absl@@YA_NNABVFormatConversionSpecImpl@12@PAVFormatSinkImpl@12@@Z
     ?ConvertFloatImpl@str_format_internal@absl@@YA_NOABVFormatConversionSpecImpl@12@PAVFormatSinkImpl@12@@Z
     ?ConvertOne@ParsedFormatConsumer@ParsedFormatBase@str_format_internal@absl@@QAE_NABUUnboundConversion@34@Vstring_view@4@@Z
-    ?ConvertSpecialToEmptyAndFullToDeleted@GroupSse2Impl@container_internal@absl@@QBEXPAC@Z
+    ?ConvertSpecialToEmptyAndFullToDeleted@GroupSse2Impl@container_internal@absl@@QBEXPAW4ctrl_t@23@@Z
+    ?Copy@CordRepBtree@cord_internal@absl@@ABEPAV123@XZ
     ?Copy@CordRepRing@cord_internal@absl@@CAPAV123@PAV123@III@Z
+    ?CopyBeginTo@CordRepBtree@cord_internal@absl@@ABEPAV123@II@Z
     ?CopyCordToString@absl@@YAXABVCord@1@PAV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@Z
+    ?CopyPrefix@CordRepBtree@cord_internal@absl@@AAE?AUCopyResult@123@I@Z
+    ?CopyRaw@CordRepBtree@cord_internal@absl@@ABEPAV123@XZ
+    ?CopySuffix@CordRepBtree@cord_internal@absl@@AAE?AUCopyResult@123@I@Z
     ?CopyTo@InlineRep@Cord@absl@@QBEXPAV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@Z
     ?CopyToArraySlowPath@Cord@absl@@ABEXPAD@Z
+    ?CopyToEndFrom@CordRepBtree@cord_internal@absl@@ABEPAV123@II@Z
     ?Crash@Helper@internal_statusor@absl@@SAXABVStatus@3@@Z
+    ?Create@CordRepBtree@cord_internal@absl@@SAPAV123@PAUCordRep@23@@Z
     ?Create@CordRepRing@cord_internal@absl@@SAPAV123@PAUCordRep@23@I@Z
     ?CreateFromLeaf@CordRepRing@cord_internal@absl@@CAPAV123@PAUCordRep@23@III@Z
+    ?CreateSlow@CordRepBtree@cord_internal@absl@@CAPAV123@PAUCordRep@23@@Z
     ?CreateSlow@CordRepRing@cord_internal@absl@@CAPAV123@PAUCordRep@23@I@Z
     ?CreateThreadIdentity@synchronization_internal@absl@@YAPAUThreadIdentity@base_internal@2@XZ
+    ?Current@CordRepBtreeNavigator@cord_internal@absl@@QBEPAUCordRep@23@XZ
     ?CurrentThreadIdentityIfPresent@base_internal@absl@@YAPAUThreadIdentity@12@XZ
+    ?Data@CordRepBtree@cord_internal@absl@@QBE?AVstring_view@3@I@Z
     ?Data@CordRepFlat@cord_internal@absl@@QAEPADXZ
     ?Data@CordRepFlat@cord_internal@absl@@QBEPBDXZ
     ?DataLength@Header@TimeZoneInfo@cctz@time_internal@absl@@QBEII@Z
@@ -1660,12 +1705,13 @@
     ?DeallocateIfAllocated@?$Storage@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__1@std@@@inlined_vector_internal@absl@@QAEXXZ
     ?DeallocateIfAllocated@?$Storage@USubRange@absl@@$0CP@V?$allocator@USubRange@absl@@@__1@std@@@inlined_vector_internal@absl@@QAEXXZ
     ?DecodeWaitCycles@SpinLock@base_internal@absl@@KA_KI@Z
-    ?Decrement@Refcount@cord_internal@absl@@QAE_NXZ
+    ?Decrement@RefcountAndFlags@cord_internal@absl@@QAE_NXZ
     ?DecrementCount@BlockingCounter@absl@@QAE_NXZ
-    ?DecrementExpectHighRefcount@Refcount@cord_internal@absl@@QAE_NXZ
+    ?DecrementExpectHighRefcount@RefcountAndFlags@cord_internal@absl@@QAE_NXZ
     ?DecrementSynchSem@Mutex@absl@@CA_NPAV12@PAUPerThreadSynch@base_internal@2@VKernelTimeout@synchronization_internal@2@@Z
     ?DefaultArena@LowLevelAlloc@base_internal@absl@@SAPAUArena@123@XZ
     ?DefaultStackUnwinder@absl@@YAHPAPAXPAHHHPBX1@Z
+    ?Delete@CordRepBtree@cord_internal@absl@@CAXPAV123@@Z
     ?Delete@CordRepExternal@cord_internal@absl@@SAXPAUCordRep@23@@Z
     ?Delete@CordRepFlat@cord_internal@absl@@SAXPAUCordRep@23@@Z
     ?Delete@CordRepRing@cord_internal@absl@@CAXPAV123@@Z
@@ -1676,10 +1722,14 @@
     ?Description@TimeZoneInfo@cctz@time_internal@absl@@UBE?AV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@XZ
     ?Description@TimeZoneLibC@cctz@time_internal@absl@@UBE?AV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@XZ
     ?Destroy@CordRep@cord_internal@absl@@SAXPAU123@@Z
+    ?Destroy@CordRepBtree@cord_internal@absl@@SAXPAV123@@Z
     ?Destroy@CordRepRing@cord_internal@absl@@CAXPAV123@@Z
     ?Destroy@PerThreadSem@synchronization_internal@absl@@CAXPAUThreadIdentity@base_internal@3@@Z
     ?DestroyContents@?$Storage@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__1@std@@@inlined_vector_internal@absl@@AAEXXZ
     ?DestroyCordSlow@Cord@absl@@AAEXXZ
+    ?DestroyLeaf@CordRepBtree@cord_internal@absl@@CAXPAV123@II@Z
+    ?DestroyNonLeaf@CordRepBtree@cord_internal@absl@@CAXPAV123@II@Z
+    ?DestroyTree@CordRepBtree@cord_internal@absl@@CAXPAV123@II@Z
     ?DiagnosticsGetDeleteQueue@CordzHandle@cord_internal@absl@@SA?AV?$vector@PBVCordzHandle@cord_internal@absl@@V?$allocator@PBVCordzHandle@cord_internal@absl@@@__1@std@@@__1@std@@XZ
     ?DiagnosticsGetSafeToInspectDeletedHandles@CordzHandle@cord_internal@absl@@QAE?AV?$vector@PBVCordzHandle@cord_internal@absl@@V?$allocator@PBVCordzHandle@cord_internal@absl@@@__1@std@@@__1@std@@XZ
     ?DiagnosticsHandleIsSafeToInspect@CordzHandle@cord_internal@absl@@QBE_NPBV123@@Z
@@ -1718,9 +1768,18 @@
     ?DummyFunction@?$AtomicHook@P6AXPBX_J@Z@base_internal@absl@@CAXPBX_J@Z
     ?DummyFunction@?$AtomicHook@P6AX_J@Z@base_internal@absl@@CAX_J@Z
     ?DummyFunction@?$AtomicHook@P6A_NW4LogSeverity@absl@@PBDHPAPADPAH@Z@base_internal@absl@@CA_NW4LogSeverity@3@PBDHPAPADPAH@Z
+    ?Dump@CordRepBtree@cord_internal@absl@@SAXPBUCordRep@23@AAV?$basic_ostream@DU?$char_traits@D@__1@std@@@__1@std@@@Z
+    ?Dump@CordRepBtree@cord_internal@absl@@SAXPBUCordRep@23@Vstring_view@3@AAV?$basic_ostream@DU?$char_traits@D@__1@std@@@__1@std@@@Z
+    ?Dump@CordRepBtree@cord_internal@absl@@SAXPBUCordRep@23@Vstring_view@3@_NAAV?$basic_ostream@DU?$char_traits@D@__1@std@@@__1@std@@@Z
     ?DumpPCAndFrameSizesAndStackTrace@debugging_internal@absl@@YAXPAXQBQAXQAHHH_NP6AXPBD0@Z0@Z
     ?DurationFromTimespec@absl@@YA?AVDuration@1@Utimespec@@@Z
     ?DurationFromTimeval@absl@@YA?AVDuration@1@Utimeval@@@Z
+    ?Edge@CordRepBtree@cord_internal@absl@@QBEPAUCordRep@23@I@Z
+    ?Edge@CordRepBtree@cord_internal@absl@@QBEPAUCordRep@23@W4EdgeType@123@@Z
+    ?EdgeData@CordRepBtree@cord_internal@absl@@SA?AVstring_view@3@PBUCordRep@23@@Z
+    ?EdgeDataPtr@CordRepBtree@cord_internal@absl@@SAPBDPBUCordRep@23@@Z
+    ?Edges@CordRepBtree@cord_internal@absl@@QBE?AV?$Span@QAUCordRep@cord_internal@absl@@@3@II@Z
+    ?Edges@CordRepBtree@cord_internal@absl@@QBE?AV?$Span@QAUCordRep@cord_internal@absl@@@3@XZ
     ?EmplaceTree@InlineRep@Cord@absl@@QAEXPAUCordRep@cord_internal@3@ABVInlineData@53@W4MethodIdentifier@CordzUpdateTracker@53@@Z
     ?EmplaceTree@InlineRep@Cord@absl@@QAEXPAUCordRep@cord_internal@3@W4MethodIdentifier@CordzUpdateTracker@53@@Z
     ?EmptyString@Status@absl@@CAPBV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@XZ
@@ -1759,7 +1818,6 @@
     ?Find@ByLength@absl@@QBE?AVstring_view@2@V32@I@Z
     ?Find@ByString@absl@@QBE?AVstring_view@2@V32@I@Z
     ?Find@CordRepRing@cord_internal@absl@@QBE?AUPosition@123@I@Z
-    ?Find@CordRepRing@cord_internal@absl@@QBE?AUPosition@123@II@Z
     ?FindFlatStartPiece@InlineRep@Cord@absl@@QBE?AVstring_view@3@XZ
     ?FindPath@GraphCycles@synchronization_internal@absl@@QBEHUGraphId@23@0HQAU423@@Z
     ?FindSlow@CordRepRing@cord_internal@absl@@ABE?AUPosition@123@II@Z
@@ -1835,14 +1893,7 @@
     ?FromUniversal@absl@@YA?AVTime@1@_J@Z
     ?FromUnixDuration@time_internal@absl@@YA?AVTime@2@VDuration@2@@Z
     ?FromUnixSeconds@cctz@time_internal@absl@@YA?AV?$time_point@Vsystem_clock@chrono@__1@std@@V?$duration@_JV?$ratio@$00$00@__1@std@@@234@@chrono@__1@std@@_J@Z
-    ?Get@Refcount@cord_internal@absl@@QBEHXZ
-    ?GetAllocPtr@?$Storage@H$0CP@V?$allocator@H@__1@std@@@inlined_vector_internal@absl@@QAEPAV?$allocator@H@__1@std@@XZ
-    ?GetAllocPtr@?$Storage@PAUCordRep@cord_internal@absl@@$01V?$allocator@PAUCordRep@cord_internal@absl@@@__1@std@@@inlined_vector_internal@absl@@QAEPAV?$allocator@PAUCordRep@cord_internal@absl@@@__1@std@@XZ
-    ?GetAllocPtr@?$Storage@PAUCordRep@cord_internal@absl@@$0CP@V?$allocator@PAUCordRep@cord_internal@absl@@@__1@std@@@inlined_vector_internal@absl@@QAEPAV?$allocator@PAUCordRep@cord_internal@absl@@@__1@std@@XZ
-    ?GetAllocPtr@?$Storage@PBUCordRep@cord_internal@absl@@$0CP@V?$allocator@PBUCordRep@cord_internal@absl@@@__1@std@@@inlined_vector_internal@absl@@QAEPAV?$allocator@PBUCordRep@cord_internal@absl@@@__1@std@@XZ
-    ?GetAllocPtr@?$Storage@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__1@std@@@inlined_vector_internal@absl@@QAEPAV?$allocator@UPayload@status_internal@absl@@@__1@std@@XZ
-    ?GetAllocPtr@?$Storage@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__1@std@@@inlined_vector_internal@absl@@QBEPBV?$allocator@UPayload@status_internal@absl@@@__1@std@@XZ
-    ?GetAllocPtr@?$Storage@USubRange@absl@@$0CP@V?$allocator@USubRange@absl@@@__1@std@@@inlined_vector_internal@absl@@QAEPAV?$allocator@USubRange@absl@@@__1@std@@XZ
+    ?Get@RefcountAndFlags@cord_internal@absl@@QBEHXZ
     ?GetAllocatedCapacity@?$Storage@H$0CP@V?$allocator@H@__1@std@@@inlined_vector_internal@absl@@QBEIXZ
     ?GetAllocatedCapacity@?$Storage@PAUCordRep@cord_internal@absl@@$01V?$allocator@PAUCordRep@cord_internal@absl@@@__1@std@@@inlined_vector_internal@absl@@QBEIXZ
     ?GetAllocatedCapacity@?$Storage@PAUCordRep@cord_internal@absl@@$0CP@V?$allocator@PAUCordRep@cord_internal@absl@@@__1@std@@@inlined_vector_internal@absl@@QBEIXZ
@@ -1861,13 +1912,23 @@
     ?GetAllocator@?$AllocationTransaction@V?$allocator@PBUCordRep@cord_internal@absl@@@__1@std@@@inlined_vector_internal@absl@@QAEAAV?$allocator@PBUCordRep@cord_internal@absl@@@__1@std@@XZ
     ?GetAllocator@?$AllocationTransaction@V?$allocator@UPayload@status_internal@absl@@@__1@std@@@inlined_vector_internal@absl@@QAEAAV?$allocator@UPayload@status_internal@absl@@@__1@std@@XZ
     ?GetAllocator@?$AllocationTransaction@V?$allocator@USubRange@absl@@@__1@std@@@inlined_vector_internal@absl@@QAEAAV?$allocator@USubRange@absl@@@__1@std@@XZ
+    ?GetAllocator@?$Storage@H$0CP@V?$allocator@H@__1@std@@@inlined_vector_internal@absl@@QAEAAV?$allocator@H@__1@std@@XZ
+    ?GetAllocator@?$Storage@PAUCordRep@cord_internal@absl@@$01V?$allocator@PAUCordRep@cord_internal@absl@@@__1@std@@@inlined_vector_internal@absl@@QAEAAV?$allocator@PAUCordRep@cord_internal@absl@@@__1@std@@XZ
+    ?GetAllocator@?$Storage@PAUCordRep@cord_internal@absl@@$0CP@V?$allocator@PAUCordRep@cord_internal@absl@@@__1@std@@@inlined_vector_internal@absl@@QAEAAV?$allocator@PAUCordRep@cord_internal@absl@@@__1@std@@XZ
+    ?GetAllocator@?$Storage@PBUCordRep@cord_internal@absl@@$0CP@V?$allocator@PBUCordRep@cord_internal@absl@@@__1@std@@@inlined_vector_internal@absl@@QAEAAV?$allocator@PBUCordRep@cord_internal@absl@@@__1@std@@XZ
+    ?GetAllocator@?$Storage@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__1@std@@@inlined_vector_internal@absl@@QAEAAV?$allocator@UPayload@status_internal@absl@@@__1@std@@XZ
+    ?GetAllocator@?$Storage@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__1@std@@@inlined_vector_internal@absl@@QBEABV?$allocator@UPayload@status_internal@absl@@@__1@std@@XZ
+    ?GetAllocator@?$Storage@USubRange@absl@@$0CP@V?$allocator@USubRange@absl@@@__1@std@@@inlined_vector_internal@absl@@QAEAAV?$allocator@USubRange@absl@@@__1@std@@XZ
+    ?GetAppendBuffer@CordRepBtree@cord_internal@absl@@QAE?AV?$Span@D@3@I@Z
     ?GetAppendBuffer@CordRepRing@cord_internal@absl@@QAE?AV?$Span@D@3@I@Z
+    ?GetAppendBufferSlow@CordRepBtree@cord_internal@absl@@AAE?AV?$Span@D@3@I@Z
     ?GetCachedTID@base_internal@absl@@YAIXZ
     ?GetCapacity@?$AllocationTransaction@V?$allocator@H@__1@std@@@inlined_vector_internal@absl@@QAEAAIXZ
     ?GetCapacity@?$AllocationTransaction@V?$allocator@PAUCordRep@cord_internal@absl@@@__1@std@@@inlined_vector_internal@absl@@QAEAAIXZ
     ?GetCapacity@?$AllocationTransaction@V?$allocator@PBUCordRep@cord_internal@absl@@@__1@std@@@inlined_vector_internal@absl@@QAEAAIXZ
     ?GetCapacity@?$AllocationTransaction@V?$allocator@UPayload@status_internal@absl@@@__1@std@@@inlined_vector_internal@absl@@QAEAAIXZ
     ?GetCapacity@?$AllocationTransaction@V?$allocator@USubRange@absl@@@__1@std@@@inlined_vector_internal@absl@@QAEAAIXZ
+    ?GetCharacter@CordRepBtree@cord_internal@absl@@QBEDI@Z
     ?GetCharacter@CordRepRing@cord_internal@absl@@QBEDI@Z
     ?GetCond@WinHelper@Waiter@synchronization_internal@absl@@SAPAU_RTL_CONDITION_VARIABLE@@PAV234@@Z
     ?GetCordzStatistics@CordzInfo@cord_internal@absl@@QBE?AUCordzStatistics@23@XZ
@@ -1951,28 +2012,35 @@
     ?GetYearDay@absl@@YAHV?$civil_time@Usecond_tag@time_internal@absl@@@detail@cctz@time_internal@1@@Z
     ?Global@HashtablezSampler@container_internal@absl@@SAAAV123@XZ
     ?GuaranteedEqual@Condition@absl@@SA_NPBV12@0@Z
-    ?H1@container_internal@absl@@YAIIPBC@Z
+    ?H1@container_internal@absl@@YAIIPBW4ctrl_t@12@@Z
     ?HandleInvalidStatusCtorArg@Helper@internal_statusor@absl@@SAXPAVStatus@3@@Z
     ?HasBeenNotifiedInternal@Notification@absl@@CA_NPBU?$atomic@_N@__1@std@@@Z
     ?HasEdge@GraphCycles@synchronization_internal@absl@@QBE_NUGraphId@23@0@Z
     ?HasNode@GraphCycles@synchronization_internal@absl@@QAE_NUGraphId@23@@Z
-    ?HashSeed@container_internal@absl@@YAIPBC@Z
+    ?HashSeed@container_internal@absl@@YAIPBW4ctrl_t@12@@Z
     ?Head@CordzInfo@cord_internal@absl@@SAPAV123@ABVCordzSnapshot@23@@Z
     ?HexStringToBytes@absl@@YA?AV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@Vstring_view@1@@Z
     ?HideMask@base_internal@absl@@YAIXZ
-    ?Hours@absl@@YA?AVDuration@1@_J@Z
+    ?HighestBitSet@?$BitMask@I$0BA@$0A@@container_internal@absl@@QBEIXZ
     ?IDivDuration@absl@@YA_JVDuration@1@0PAV21@@Z
     ?IDivDuration@time_internal@absl@@YA_J_NVDuration@2@1PAV32@@Z
     ?In@Time@absl@@QBE?AUBreakdown@12@VTimeZone@2@@Z
     ?InMillisecondsFromNow@KernelTimeout@synchronization_internal@absl@@ABEKXZ
-    ?Increment@Refcount@cord_internal@absl@@QAEXXZ
+    ?Increment@RefcountAndFlags@cord_internal@absl@@QAEXXZ
     ?IncrementSynchSem@Mutex@absl@@CAXPAV12@PAUPerThreadSynch@base_internal@2@@Z
+    ?IndexBefore@CordRepBtree@cord_internal@absl@@ABE?AUPosition@123@U4123@I@Z
+    ?IndexBeyond@CordRepBtree@cord_internal@absl@@ABE?AUPosition@123@I@Z
+    ?IndexOf@CordRepBtree@cord_internal@absl@@ABE?AUPosition@123@I@Z
     ?InfiniteDuration@absl@@YA?AVDuration@1@XZ
     ?InfiniteFuture@absl@@YA?AVTime@1@XZ
     ?InfinitePast@absl@@YA?AVTime@1@XZ
+    ?Init@CordRepBtreeReader@cord_internal@absl@@QAE?AVstring_view@3@PAVCordRepBtree@23@@Z
     ?Init@PerThreadSem@synchronization_internal@absl@@CAXPAUThreadIdentity@base_internal@3@@Z
+    ?InitFirst@CordRepBtreeNavigator@cord_internal@absl@@QAEPAUCordRep@23@PAVCordRepBtree@23@@Z
     ?InitFrom@?$Storage@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__1@std@@@inlined_vector_internal@absl@@QAEXABV123@@Z
+    ?InitInstance@CordRepBtree@cord_internal@absl@@AAEXHII@Z
     ?InitTree@ChunkIterator@Cord@absl@@AAEXPAUCordRep@cord_internal@3@@Z
+    ?InitWhat@BadStatusOrAccess@absl@@ABEXXZ
     ?Initialize@ExponentialBiased@base_internal@absl@@AAEXXZ
     ?InitializeCordRepExternal@cord_internal@absl@@YAXVstring_view@2@PAUCordRepExternal@12@@Z
     ?InitializeData@Storage@?$FixedArray@PAUCordRep@cord_internal@absl@@$0PPPPPPPP@V?$allocator@PAUCordRep@cord_internal@absl@@@__1@std@@@absl@@AAEPAPAUCordRep@cord_internal@3@XZ
@@ -1991,31 +2059,39 @@
     ?InvalidGraphId@synchronization_internal@absl@@YA?AUGraphId@12@XZ
     ?IsAborted@absl@@YA_NABVStatus@1@@Z
     ?IsAlreadyExists@absl@@YA_NABVStatus@1@@Z
+    ?IsBtree@CordRep@cord_internal@absl@@QBE_NXZ
     ?IsCancelled@absl@@YA_NABVStatus@1@@Z
+    ?IsConcat@CordRep@cord_internal@absl@@QBE_NXZ
     ?IsCooperative@SpinLock@base_internal@absl@@CA_NW4SchedulingMode@23@@Z
+    ?IsDataEdge@CordRepBtree@cord_internal@absl@@SA_NPBUCordRep@23@@Z
     ?IsDataLoss@absl@@YA_NABVStatus@1@@Z
     ?IsDeadlineExceeded@absl@@YA_NABVStatus@1@@Z
     ?IsEmpty@Queue@CordzHandle@cord_internal@absl@@QBE_NXZ
+    ?IsExternal@CordRep@cord_internal@absl@@QBE_NXZ
     ?IsFailedPrecondition@absl@@YA_NABVStatus@1@@Z
-    ?IsFlat@CordRepRing@cord_internal@absl@@QBE_NIIPAVstring_view@3@@Z
-    ?IsFlat@CordRepRing@cord_internal@absl@@QBE_NPAVstring_view@3@@Z
-    ?IsImmortal@Refcount@cord_internal@absl@@QBE_NXZ
+    ?IsFlat@CordRep@cord_internal@absl@@QBE_NXZ
+    ?IsFlat@CordRepBtree@cord_internal@absl@@QBE_NIIPAVstring_view@3@@Z
+    ?IsFlat@CordRepBtree@cord_internal@absl@@QBE_NPAVstring_view@3@@Z
+    ?IsImmortal@RefcountAndFlags@cord_internal@absl@@QBE_NXZ
     ?IsInfiniteDuration@time_internal@absl@@YA_NVDuration@2@@Z
     ?IsInlined@Status@absl@@CA_NI@Z
     ?IsInternal@absl@@YA_NABVStatus@1@@Z
     ?IsInvalidArgument@absl@@YA_NABVStatus@1@@Z
     ?IsMovedFrom@Status@absl@@CA_NI@Z
     ?IsNotFound@absl@@YA_NABVStatus@1@@Z
-    ?IsOne@Refcount@cord_internal@absl@@QAE_NXZ
+    ?IsOne@RefcountAndFlags@cord_internal@absl@@QAE_NXZ
     ?IsOutOfRange@absl@@YA_NABVStatus@1@@Z
     ?IsPermissionDenied@absl@@YA_NABVStatus@1@@Z
     ?IsReachable@GraphCycles@synchronization_internal@absl@@QBE_NUGraphId@23@0@Z
     ?IsResourceExhausted@absl@@YA_NABVStatus@1@@Z
+    ?IsRing@CordRep@cord_internal@absl@@QBE_NXZ
     ?IsSame@InlineRep@Cord@absl@@QBE_NABV123@@Z
+    ?IsSubstring@CordRep@cord_internal@absl@@QBE_NXZ
     ?IsUnauthenticated@absl@@YA_NABVStatus@1@@Z
     ?IsUnavailable@absl@@YA_NABVStatus@1@@Z
     ?IsUnimplemented@absl@@YA_NABVStatus@1@@Z
     ?IsUnknown@absl@@YA_NABVStatus@1@@Z
+    ?IsValid@CordRepBtree@cord_internal@absl@@SA_NPBV123@_N@Z
     ?IsValid@CordRepRing@cord_internal@absl@@QBE_NAAV?$basic_ostream@DU?$char_traits@D@__1@std@@@__1@std@@@Z
     ?IsValidCapacity@container_internal@absl@@YA_NI@Z
     ?IsValidIndex@CordRepRing@cord_internal@absl@@ABE_NI@Z
@@ -2045,6 +2121,9 @@
     ?LogSeverityName@absl@@YAPBDW4LogSeverity@1@@Z
     ?LossyAdd@CordzUpdateTracker@cord_internal@absl@@QAEXABV123@@Z
     ?LossyAdd@CordzUpdateTracker@cord_internal@absl@@QAEXW4MethodIdentifier@123@_J@Z
+    ?LowLevelHash@hash_internal@absl@@YA_KPBXI_KQB_K@Z
+    ?LowLevelHashImpl@MixingHashState@hash_internal@absl@@CA_KPBEI@Z
+    ?LowestBitSet@?$BitMask@I$0BA@$0A@@container_internal@absl@@QBEIXZ
     ?MakeConcat@CordForest@absl@@AAEPAUCordRep@cord_internal@2@PAU342@0@Z
     ?MakeDuration@time_internal@absl@@YA?AVDuration@2@_J0@Z
     ?MakeDuration@time_internal@absl@@YA?AVDuration@2@_JI@Z
@@ -2063,14 +2142,13 @@
     ?MakeTime@TimeZoneLibC@cctz@time_internal@absl@@UBE?AUcivil_lookup@time_zone@234@ABV?$civil_time@Usecond_tag@detail@cctz@time_internal@absl@@@detail@234@@Z
     ?MakeUint128@absl@@YA?AVuint128@1@_K0@Z
     ?MapToLocalCode@status_internal@absl@@YA?AW4StatusCode@2@H@Z
+    ?MatchEmptyOrDeleted@GroupSse2Impl@container_internal@absl@@QBE?AV?$BitMask@I$0BA@$0A@@23@XZ
     ?MatchesConversions@ParsedFormatBase@str_format_internal@absl@@ABE_N_NV?$initializer_list@W4FormatConversionCharSet@absl@@@std@@@Z
     ?MaxFlatLength@CordTestAccess@strings_internal@absl@@SAIXZ
     ?MaybeTrackCordImpl@CordzInfo@cord_internal@absl@@CAXAAVInlineData@23@ABV423@W4MethodIdentifier@CordzUpdateTracker@23@@Z
     ?MemoryUsageAux@Cord@absl@@CAIPBUCordRep@cord_internal@2@@Z
-    ?Microseconds@absl@@YA?AVDuration@1@_J@Z
-    ?Milliseconds@absl@@YA?AVDuration@1@_J@Z
+    ?MergeTrees@CordRepBtree@cord_internal@absl@@CAPAV123@PAV123@0@Z
     ?Min@string_view@absl@@CAIII@Z
-    ?Minutes@absl@@YA?AVDuration@1@_J@Z
     ?MovedFromRep@Status@absl@@CAIXZ
     ?MovedFromString@Status@absl@@CAPBV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@XZ
     ?MultiplyBy@?$BigUnsigned@$03@strings_internal@absl@@AAEXHPBI@Z
@@ -2088,13 +2166,16 @@
     ?Mutable@CordRepRing@cord_internal@absl@@CAPAV123@PAV123@I@Z
     ?MutexDelay@synchronization_internal@absl@@YAHHH@Z
     ?Name@Impl@time_zone@cctz@time_internal@absl@@QBEABV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@XZ
-    ?Nanoseconds@absl@@YA?AVDuration@1@_J@Z
     ?NegateAndSubtractOne@time_internal@absl@@YA_J_J@Z
     ?Never@KernelTimeout@synchronization_internal@absl@@SA?AV123@XZ
+    ?New@CordRepBtree@cord_internal@absl@@SAPAV123@H@Z
+    ?New@CordRepBtree@cord_internal@absl@@SAPAV123@PAUCordRep@23@@Z
+    ?New@CordRepBtree@cord_internal@absl@@SAPAV123@PAV123@0@Z
     ?New@CordRepFlat@cord_internal@absl@@SAPAU123@I@Z
     ?New@CordRepRing@cord_internal@absl@@CAPAV123@II@Z
     ?NewArena@LowLevelAlloc@base_internal@absl@@SAPAUArena@123@H@Z
-    ?Next@CordRepRingReader@cord_internal@absl@@QAE?AVstring_view@3@XZ
+    ?Next@CordRepBtreeNavigator@cord_internal@absl@@QAEPAUCordRep@23@XZ
+    ?Next@CordRepBtreeReader@cord_internal@absl@@QAE?AVstring_view@3@XZ
     ?Next@CordzInfo@cord_internal@absl@@QBEPAV123@ABVCordzSnapshot@23@@Z
     ?NextCapacity@?$Storage@H$0CP@V?$allocator@H@__1@std@@@inlined_vector_internal@absl@@SAII@Z
     ?NextCapacity@?$Storage@PAUCordRep@cord_internal@absl@@$01V?$allocator@PAUCordRep@cord_internal@absl@@@__1@std@@@inlined_vector_internal@absl@@SAII@Z
@@ -2107,6 +2188,7 @@
     ?NextTransition@TimeZone@absl@@QBE_NVTime@2@PAUCivilTransition@12@@Z
     ?NextTransition@TimeZoneInfo@cctz@time_internal@absl@@UBE_NABV?$time_point@Vsystem_clock@chrono@__1@std@@V?$duration@_JV?$ratio@$00$00@__1@std@@@234@@chrono@__1@std@@PAUcivil_transition@time_zone@234@@Z
     ?NextTransition@TimeZoneLibC@cctz@time_internal@absl@@UBE_NABV?$time_point@Vsystem_clock@chrono@__1@std@@V?$duration@_JV?$ratio@$00$00@__1@std@@@234@@chrono@__1@std@@PAUcivil_transition@time_zone@234@@Z
+    ?NextUp@CordRepBtreeNavigator@cord_internal@absl@@AAEPAUCordRep@23@XZ
     ?NominalCPUFrequency@base_internal@absl@@YANXZ
     ?NormalizeLogSeverity@absl@@YA?AW4LogSeverity@1@W421@@Z
     ?NotFoundError@absl@@YA?AVStatus@1@Vstring_view@1@@Z
@@ -2152,10 +2234,13 @@
     ?PrepareToModify@Status@absl@@AAEXXZ
     ?Prepend@Cord@absl@@QAEXABV12@@Z
     ?Prepend@Cord@absl@@QAEXVstring_view@2@@Z
+    ?Prepend@CordRepBtree@cord_internal@absl@@SAPAV123@PAV123@PAUCordRep@23@@Z
+    ?Prepend@CordRepBtree@cord_internal@absl@@SAPAV123@PAV123@Vstring_view@3@I@Z
     ?Prepend@CordRepRing@cord_internal@absl@@SAPAV123@PAV123@PAUCordRep@23@@Z
     ?Prepend@CordRepRing@cord_internal@absl@@SAPAV123@PAV123@Vstring_view@3@I@Z
     ?PrependLeaf@CordRepRing@cord_internal@absl@@CAPAV123@PAV123@PAUCordRep@23@II@Z
     ?PrependNode@CordForest@absl@@AAEPAUCordRep@cord_internal@2@PAU342@0@Z
+    ?PrependSlow@CordRepBtree@cord_internal@absl@@CAPAV123@PAV123@PAUCordRep@23@@Z
     ?PrependSlow@CordRepRing@cord_internal@absl@@CAPAV123@PAV123@PAUCordRep@23@@Z
     ?PrependTree@InlineRep@Cord@absl@@QAEXPAUCordRep@cord_internal@3@W4MethodIdentifier@CordzUpdateTracker@53@@Z
     ?PrependTreeToInlined@InlineRep@Cord@absl@@QAEXPAUCordRep@cord_internal@3@W4MethodIdentifier@CordzUpdateTracker@53@@Z
@@ -2176,6 +2261,8 @@
     ?Read1To3@MixingHashState@hash_internal@absl@@CAIPBEI@Z
     ?Read4To8@MixingHashState@hash_internal@absl@@CA_KPBEI@Z
     ?Read9To16@MixingHashState@hash_internal@absl@@CA?AU?$pair@_K_K@__1@std@@PBEI@Z
+    ?Read@CordRepBtreeNavigator@cord_internal@absl@@QAE?AUReadResult@123@II@Z
+    ?Read@CordRepBtreeReader@cord_internal@absl@@QAE?AVstring_view@3@IIAAPAUCordRep@23@@Z
     ?ReadDigits@?$BigUnsigned@$03@strings_internal@absl@@AAEHPBD0H@Z
     ?ReadDigits@?$BigUnsigned@$0FE@@strings_internal@absl@@AAEHPBD0H@Z
     ?ReadFloatMantissa@?$BigUnsigned@$03@strings_internal@absl@@QAEHABUParsedFloat@23@H@Z
@@ -2189,6 +2276,7 @@
     ?ReclaimThreadIdentity@synchronization_internal@absl@@YAXPAX@Z
     ?RecordInsertSlow@container_internal@absl@@YAXPAUHashtablezInfo@12@II@Z
     ?Ref@CordRep@cord_internal@absl@@SAPAU123@PAU123@@Z
+    ?Ref@Status@absl@@CAXI@Z
     ?RefCordRep@CordzInfo@cord_internal@absl@@QBEPAUCordRep@23@XZ
     ?Register@CycleClockSource@base_internal@absl@@CAXP6A_JXZ@Z
     ?Register@HashtablezSampler@container_internal@absl@@QAEPAUHashtablezInfo@23@XZ
@@ -2216,7 +2304,6 @@
     ?Reset@?$AllocationTransaction@V?$allocator@PBUCordRep@cord_internal@absl@@@__1@std@@@inlined_vector_internal@absl@@QAEXXZ
     ?Reset@?$AllocationTransaction@V?$allocator@UPayload@status_internal@absl@@@__1@std@@@inlined_vector_internal@absl@@QAEXXZ
     ?Reset@?$AllocationTransaction@V?$allocator@USubRange@absl@@@__1@std@@@inlined_vector_internal@absl@@QAEXXZ
-    ?Reset@CordRepRingReader@cord_internal@absl@@QAE?AVstring_view@3@PAVCordRepRing@23@@Z
     ?ResetToBuiltinUTC@TimeZoneInfo@cctz@time_internal@absl@@AAE_NABV?$duration@_JV?$ratio@$00$00@__1@std@@@chrono@__1@std@@@Z
     ?ResetToEmpty@InlineRep@Cord@absl@@AAEXXZ
     ?Resize@?$ResizeUninitializedTraits@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@X@strings_internal@absl@@SAXPAV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@I@Z
@@ -2228,8 +2315,8 @@
     ?SafeToDelete@CordzHandle@cord_internal@absl@@QBE_NXZ
     ?SafeWriteToStderr@raw_logging_internal@absl@@YAXPBDI@Z
     ?SampleSlow@container_internal@absl@@YAPAUHashtablezInfo@12@PA_J@Z
-    ?Seconds@absl@@YA?AVDuration@1@_J@Z
-    ?Seek@CordRepRingReader@cord_internal@absl@@QAE?AVstring_view@3@I@Z
+    ?Seek@CordRepBtreeNavigator@cord_internal@absl@@QAE?AUPosition@123@I@Z
+    ?Seek@CordRepBtreeReader@cord_internal@absl@@QAE?AVstring_view@3@I@Z
     ?SetAllocatedData@?$Storage@H$0CP@V?$allocator@H@__1@std@@@inlined_vector_internal@absl@@QAEXPAHI@Z
     ?SetAllocatedData@?$Storage@PAUCordRep@cord_internal@absl@@$01V?$allocator@PAUCordRep@cord_internal@absl@@@__1@std@@@inlined_vector_internal@absl@@QAEXPAPAUCordRep@cord_internal@3@I@Z
     ?SetAllocatedData@?$Storage@PAUCordRep@cord_internal@absl@@$0CP@V?$allocator@PAUCordRep@cord_internal@absl@@@__1@std@@@inlined_vector_internal@absl@@QAEXPAPAUCordRep@cord_internal@3@I@Z
@@ -2266,9 +2353,11 @@
     ?SetWidth@FormatConversionSpecImplFriend@str_format_internal@absl@@SAXHPAVFormatConversionSpecImpl@23@@Z
     ?ShiftLeft@?$BigUnsigned@$03@strings_internal@absl@@QAEXH@Z
     ?ShiftLeft@?$BigUnsigned@$0FE@@strings_internal@absl@@QAEXH@Z
-    ?ShouldInsertBackwards@container_internal@absl@@YA_NIPAC@Z
+    ?ShouldInsertBackwards@container_internal@absl@@YA_NIPBW4ctrl_t@12@@Z
     ?Signal@CondVar@absl@@QAEXXZ
     ?SignalAll@CondVar@absl@@QAEXXZ
+    ?SignedAddResult@int128_internal@absl@@YA?AVint128@2@V32@0@Z
+    ?SignedSubstructResult@int128_internal@absl@@YA?AVint128@2@V32@00@Z
     ?SimpleAtob@absl@@YA_NVstring_view@1@PA_N@Z
     ?SimpleAtod@absl@@YA_NVstring_view@1@PAN@Z
     ?SimpleAtof@absl@@YA_NVstring_view@1@PAM@Z
@@ -2276,6 +2365,7 @@
     ?SizeofCordRepConcat@CordTestAccess@strings_internal@absl@@SAIXZ
     ?SizeofCordRepExternal@CordTestAccess@strings_internal@absl@@SAIXZ
     ?SizeofCordRepSubstring@CordTestAccess@strings_internal@absl@@SAIXZ
+    ?Skip@CordRepBtreeNavigator@cord_internal@absl@@QAE?AUPosition@123@I@Z
     ?SleepFor@absl@@YAXVDuration@1@@Z
     ?SlowLock@SpinLock@base_internal@absl@@AAEXXZ
     ?SlowUnlock@SpinLock@base_internal@absl@@AAEXI@Z
@@ -2306,6 +2396,7 @@
     ?StrCat@absl@@YA?AV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@ABVAlphaNum@1@000@Z
     ?StrCat@absl@@YA?AV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@ABVAlphaNum@1@00@Z
     ?StrCat@absl@@YA?AV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@ABVAlphaNum@1@0@Z
+    ?StrCat@absl@@YA?AV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@ABVAlphaNum@1@@Z
     ?StrReplaceAll@absl@@YA?AV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@Vstring_view@1@V?$initializer_list@U?$pair@Vstring_view@absl@@V12@@__1@std@@@4@@Z
     ?StrReplaceAll@absl@@YAHV?$initializer_list@U?$pair@Vstring_view@absl@@V12@@__1@std@@@std@@PAV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@3@@Z
     ?StripAsciiWhitespace@absl@@YA?AVstring_view@1@V21@@Z
@@ -2314,8 +2405,10 @@
     ?StrlenInternal@string_view@absl@@CAIPBD@Z
     ?SubLength@CordRepRing@cord_internal@absl@@AAEXII@Z
     ?SubRing@CordRepRing@cord_internal@absl@@SAPAV123@PAV123@III@Z
+    ?SubTree@CordRepBtree@cord_internal@absl@@QAEPAUCordRep@23@II@Z
     ?Subcord@Cord@absl@@QBE?AV12@II@Z
     ?SubstituteAndAppendArray@substitute_internal@absl@@YAXPAV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@Vstring_view@2@PBV62@I@Z
+    ?SubstructResult@int128_internal@absl@@YA?AVuint128@2@V32@00@Z
     ?SubtractSize@?$Storage@H$0CP@V?$allocator@H@__1@std@@@inlined_vector_internal@absl@@QAEXI@Z
     ?SubtractSize@?$Storage@PAUCordRep@cord_internal@absl@@$01V?$allocator@PAUCordRep@cord_internal@absl@@@__1@std@@@inlined_vector_internal@absl@@QAEXI@Z
     ?SubtractSize@?$Storage@PAUCordRep@cord_internal@absl@@$0CP@V?$allocator@PAUCordRep@cord_internal@absl@@@__1@std@@@inlined_vector_internal@absl@@QAEXI@Z
@@ -2383,6 +2476,7 @@
     ?ToInt64Minutes@absl@@YA_JVDuration@1@@Z
     ?ToInt64Nanoseconds@absl@@YA_JVDuration@1@@Z
     ?ToInt64Seconds@absl@@YA_JVDuration@1@@Z
+    ?ToOpResult@CordRepBtree@cord_internal@absl@@AAE?AUOpResult@123@_N@Z
     ?ToString@?$BigUnsigned@$03@strings_internal@absl@@QBE?AV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@XZ
     ?ToString@?$BigUnsigned@$0FE@@strings_internal@absl@@QBE?AV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@XZ
     ?ToString@Status@absl@@QBE?AV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@W4StatusToStringMode@2@@Z
@@ -2487,8 +2581,6 @@
     ?Write@BufferRawSink@str_format_internal@absl@@QAEXVstring_view@3@@Z
     ?Write@FILERawSink@str_format_internal@absl@@QAEXVstring_view@3@@Z
     ?Write@FormatRawSinkImpl@str_format_internal@absl@@QAEXVstring_view@3@@Z
-    ?Wyhash@hash_internal@absl@@YA_KPBXI_KQB_K@Z
-    ?WyhashImpl@MixingHashState@hash_internal@absl@@CA_KPBEI@Z
     ?ZeroDuration@absl@@YA?AVDuration@1@XZ
     ?__add_back_capacity@?$deque@PBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@@__1@std@@AAEXXZ
     ?__addr@?$__temp_value@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@__1@std@@@__1@std@@QAEPAUTransition@cctz@time_internal@absl@@XZ
@@ -2778,19 +2870,17 @@
     ?allocate@?$allocator@UTransitionType@cctz@time_internal@absl@@@__1@std@@QAEPAUTransitionType@cctz@time_internal@absl@@I@Z
     ?allocate@?$allocator@UViableSubstitution@strings_internal@absl@@@__1@std@@QAEPAUViableSubstitution@strings_internal@absl@@I@Z
     ?allocate@?$allocator@VFormatArgImpl@str_format_internal@absl@@@__1@std@@QAEPAVFormatArgImpl@str_format_internal@absl@@I@Z
-    ?allocate@?$allocator_traits@V?$allocator@H@__1@std@@@absl@@SAPAHAAV?$allocator@H@__1@std@@I@Z
     ?allocate@?$allocator_traits@V?$allocator@PAPBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@@__1@std@@SAPAPAPBVImpl@time_zone@cctz@time_internal@absl@@AAV?$allocator@PAPBVImpl@time_zone@cctz@time_internal@absl@@@23@I@Z
     ?allocate@?$allocator_traits@V?$allocator@PAU?$__hash_node_base@PAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@PAX@__1@std@@@__1@std@@@__1@std@@@__1@std@@SAPAPAU?$__hash_node_base@PAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@PAX@__1@std@@@23@AAV?$allocator@PAU?$__hash_node_base@PAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@PAX@__1@std@@@__1@std@@@23@I@Z
     ?allocate@?$allocator_traits@V?$allocator@PAUCordRep@cord_internal@absl@@@__1@std@@@__1@std@@SAPAPAUCordRep@cord_internal@absl@@AAV?$allocator@PAUCordRep@cord_internal@absl@@@23@I@Z
-    ?allocate@?$allocator_traits@V?$allocator@PAUCordRep@cord_internal@absl@@@__1@std@@@absl@@SAPAPAUCordRep@cord_internal@2@AAV?$allocator@PAUCordRep@cord_internal@absl@@@__1@std@@I@Z
     ?allocate@?$allocator_traits@V?$allocator@PAVCordzHandle@cord_internal@absl@@@__1@std@@@__1@std@@SAPAPAVCordzHandle@cord_internal@absl@@AAV?$allocator@PAVCordzHandle@cord_internal@absl@@@23@I@Z
-    ?allocate@?$allocator_traits@V?$allocator@PBUCordRep@cord_internal@absl@@@__1@std@@@absl@@SAPAPBUCordRep@cord_internal@2@AAV?$allocator@PBUCordRep@cord_internal@absl@@@__1@std@@I@Z
+    ?allocate@?$allocator_traits@V?$allocator@PBUCordRep@cord_internal@absl@@@__1@std@@@__1@std@@SAPAPBUCordRep@cord_internal@absl@@AAV?$allocator@PBUCordRep@cord_internal@absl@@@23@I@Z
     ?allocate@?$allocator_traits@V?$allocator@PBVCordzHandle@cord_internal@absl@@@__1@std@@@__1@std@@SAPAPBVCordzHandle@cord_internal@absl@@AAV?$allocator@PBVCordzHandle@cord_internal@absl@@@23@I@Z
     ?allocate@?$allocator_traits@V?$allocator@PBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@@__1@std@@SAPAPBVImpl@time_zone@cctz@time_internal@absl@@AAV?$allocator@PBVImpl@time_zone@cctz@time_internal@absl@@@23@I@Z
     ?allocate@?$allocator_traits@V?$allocator@U?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@PAX@__1@std@@@__1@std@@@__1@std@@SAPAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@PAX@23@AAV?$allocator@U?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@PAX@__1@std@@@23@I@Z
     ?allocate@?$allocator_traits@V?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__1@std@@@__1@std@@SAPAUConversionItem@ParsedFormatBase@str_format_internal@absl@@AAV?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@23@I@Z
-    ?allocate@?$allocator_traits@V?$allocator@UPayload@status_internal@absl@@@__1@std@@@absl@@SAPAUPayload@status_internal@2@AAV?$allocator@UPayload@status_internal@absl@@@__1@std@@I@Z
-    ?allocate@?$allocator_traits@V?$allocator@USubRange@absl@@@__1@std@@@absl@@SAPAUSubRange@2@AAV?$allocator@USubRange@absl@@@__1@std@@I@Z
+    ?allocate@?$allocator_traits@V?$allocator@UPayload@status_internal@absl@@@__1@std@@@__1@std@@SAPAUPayload@status_internal@absl@@AAV?$allocator@UPayload@status_internal@absl@@@23@I@Z
+    ?allocate@?$allocator_traits@V?$allocator@USubRange@absl@@@__1@std@@@__1@std@@SAPAUSubRange@absl@@AAV?$allocator@USubRange@absl@@@23@I@Z
     ?allocate@?$allocator_traits@V?$allocator@UTransition@cctz@time_internal@absl@@@__1@std@@@__1@std@@SAPAUTransition@cctz@time_internal@absl@@AAV?$allocator@UTransition@cctz@time_internal@absl@@@23@I@Z
     ?allocate@?$allocator_traits@V?$allocator@UTransitionType@cctz@time_internal@absl@@@__1@std@@@__1@std@@SAPAUTransitionType@cctz@time_internal@absl@@AAV?$allocator@UTransitionType@cctz@time_internal@absl@@@23@I@Z
     ?allocate@?$allocator_traits@V?$allocator@UViableSubstitution@strings_internal@absl@@@__1@std@@@__1@std@@SAPAUViableSubstitution@strings_internal@absl@@AAV?$allocator@UViableSubstitution@strings_internal@absl@@@23@I@Z
@@ -2819,6 +2909,7 @@
     ?back@?$vector@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@__1@std@@@__1@std@@QAEAAUTransition@cctz@time_internal@absl@@XZ
     ?back@?$vector@UTransitionType@cctz@time_internal@absl@@V?$allocator@UTransitionType@cctz@time_internal@absl@@@__1@std@@@__1@std@@QAEAAUTransitionType@cctz@time_internal@absl@@XZ
     ?back@?$vector@UViableSubstitution@strings_internal@absl@@V?$allocator@UViableSubstitution@strings_internal@absl@@@__1@std@@@__1@std@@QAEAAUViableSubstitution@strings_internal@absl@@XZ
+    ?back@CordRepBtree@cord_internal@absl@@QBEIXZ
     ?base@?$__wrap_iter@PAPAVCordzHandle@cord_internal@absl@@@__1@std@@QBEPAPAVCordzHandle@cord_internal@absl@@XZ
     ?base@?$__wrap_iter@PAUTransition@cctz@time_internal@absl@@@__1@std@@QBEPAUTransition@cctz@time_internal@absl@@XZ
     ?base@?$__wrap_iter@PAUTransitionType@cctz@time_internal@absl@@@__1@std@@QBEPAUTransitionType@cctz@time_internal@absl@@XZ
@@ -2832,6 +2923,7 @@
     ?begin@?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__1@std@@@absl@@QAEPAUPayload@status_internal@2@XZ
     ?begin@?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__1@std@@@absl@@QBEPBUPayload@status_internal@2@XZ
     ?begin@?$Span@$$CBVFormatArgImpl@str_format_internal@absl@@@absl@@QBEPBVFormatArgImpl@str_format_internal@2@XZ
+    ?begin@?$Span@QAUCordRep@cord_internal@absl@@@absl@@QBEPBQAUCordRep@cord_internal@2@XZ
     ?begin@?$__hash_table@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@V?$__unordered_map_hasher@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@23@$00@23@V?$__unordered_map_equal@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@23@$00@23@V?$allocator@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@@23@@__1@std@@QAE?AV?$__hash_iterator@PAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@PAX@__1@std@@@23@XZ
     ?begin@?$__split_buffer@PAPBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PAPBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@@__1@std@@QAEPAPAPBVImpl@time_zone@cctz@time_internal@absl@@XZ
     ?begin@?$initializer_list@PAUCordRep@cord_internal@absl@@@std@@QBEPBQAUCordRep@cord_internal@absl@@XZ
@@ -2845,8 +2937,13 @@
     ?begin@?$vector@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@__1@std@@@__1@std@@QAE?AV?$__wrap_iter@PAUTransition@cctz@time_internal@absl@@@23@XZ
     ?begin@?$vector@UTransitionType@cctz@time_internal@absl@@V?$allocator@UTransitionType@cctz@time_internal@absl@@@__1@std@@@__1@std@@QAE?AV?$__wrap_iter@PAUTransitionType@cctz@time_internal@absl@@@23@XZ
     ?begin@ChunkRange@Cord@absl@@QBE?AVChunkIterator@23@XZ
+    ?begin@CordRepBtree@cord_internal@absl@@QBEIXZ
     ?begin@Storage@?$FixedArray@PAUCordRep@cord_internal@absl@@$0PPPPPPPP@V?$allocator@PAUCordRep@cord_internal@absl@@@__1@std@@@absl@@QBEPAPAUCordRep@cord_internal@3@XZ
     ?begin@string_view@absl@@QBEPBDXZ
+    ?btree@CordRep@cord_internal@absl@@QAEPAVCordRepBtree@23@XZ
+    ?btree@CordRep@cord_internal@absl@@QBEPBVCordRepBtree@23@XZ
+    ?btree@CordRepBtreeNavigator@cord_internal@absl@@QBEPAVCordRepBtree@23@XZ
+    ?btree@CordRepBtreeReader@cord_internal@absl@@QBEPAVCordRepBtree@23@XZ
     ?bucket_count@?$__hash_table@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@V?$__unordered_map_hasher@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@23@$00@23@V?$__unordered_map_equal@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@23@$00@23@V?$allocator@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@@23@@__1@std@@QBEIXZ
     ?capacity@?$__split_buffer@PAPBVImpl@time_zone@cctz@time_internal@absl@@AAV?$allocator@PAPBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@@__1@std@@QBEIXZ
     ?capacity@?$__split_buffer@PAPBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PAPBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@@__1@std@@QBEIXZ
@@ -2873,6 +2970,7 @@
     ?capacity@?$vector@UTransitionType@cctz@time_internal@absl@@V?$allocator@UTransitionType@cctz@time_internal@absl@@@__1@std@@@__1@std@@QBEIXZ
     ?capacity@?$vector@UViableSubstitution@strings_internal@absl@@V?$allocator@UViableSubstitution@strings_internal@absl@@@__1@std@@@__1@std@@QBEIXZ
     ?capacity@?$vector@VFormatArgImpl@str_format_internal@absl@@V?$allocator@VFormatArgImpl@str_format_internal@absl@@@__1@std@@@__1@std@@QBEIXZ
+    ?capacity@CordRepBtree@cord_internal@absl@@QBEIXZ
     ?capacity@CordRepRing@cord_internal@absl@@QBEIXZ
     ?chunk_begin@Cord@absl@@QBE?AVChunkIterator@12@XZ
     ?chunk_end@Cord@absl@@QBE?AVChunkIterator@12@XZ
@@ -2901,7 +2999,7 @@
     ?compare_exchange_weak@?$__atomic_base@PAUHashtablezInfo@container_internal@absl@@$0A@@__1@std@@QAE_NAAPAUHashtablezInfo@container_internal@absl@@PAU456@W4memory_order@23@2@Z
     ?concat@CordRep@cord_internal@absl@@QAEPAUCordRepConcat@23@XZ
     ?concat@CordRep@cord_internal@absl@@QBEPBUCordRepConcat@23@XZ
-    ?consumed@CordRepRingReader@cord_internal@absl@@QBEIXZ
+    ?consumed@CordRepBtreeReader@cord_internal@absl@@QBEIXZ
     ?conversion_char@FormatConversionSpecImpl@str_format_internal@absl@@QBE?AW4FormatConversionChar@3@XZ
     ?cord_btree_enabled@cord_internal@absl@@3U?$atomic@_N@__1@std@@A
     ?cordz_info@InlineData@cord_internal@absl@@QBEPAVCordzInfo@23@XZ
@@ -2919,6 +3017,7 @@
     ?data@?$Span@$$CBVFormatArgImpl@str_format_internal@absl@@@absl@@QBEPBVFormatArgImpl@str_format_internal@2@XZ
     ?data@?$Span@D@absl@@QBEPADXZ
     ?data@?$Span@I@absl@@QBEPAIXZ
+    ?data@?$Span@QAUCordRep@cord_internal@absl@@@absl@@QBEPBQAUCordRep@cord_internal@2@XZ
     ?data@?$Span@VFormatArgImpl@str_format_internal@absl@@@absl@@QBEPAVFormatArgImpl@str_format_internal@2@XZ
     ?data@?$vector@PAUCordRep@cord_internal@absl@@V?$allocator@PAUCordRep@cord_internal@absl@@@__1@std@@@__1@std@@QBEPBQAUCordRep@cord_internal@absl@@XZ
     ?data@?$vector@PAVCordzHandle@cord_internal@absl@@V?$allocator@PAVCordzHandle@cord_internal@absl@@@__1@std@@@__1@std@@QBEPBQAVCordzHandle@cord_internal@absl@@XZ
@@ -2955,19 +3054,17 @@
     ?deallocate@?$allocator@UTransitionType@cctz@time_internal@absl@@@__1@std@@QAEXPAUTransitionType@cctz@time_internal@absl@@I@Z
     ?deallocate@?$allocator@UViableSubstitution@strings_internal@absl@@@__1@std@@QAEXPAUViableSubstitution@strings_internal@absl@@I@Z
     ?deallocate@?$allocator@VFormatArgImpl@str_format_internal@absl@@@__1@std@@QAEXPAVFormatArgImpl@str_format_internal@absl@@I@Z
-    ?deallocate@?$allocator_traits@V?$allocator@H@__1@std@@@absl@@SAXAAV?$allocator@H@__1@std@@PAHI@Z
     ?deallocate@?$allocator_traits@V?$allocator@PAPBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@@__1@std@@SAXAAV?$allocator@PAPBVImpl@time_zone@cctz@time_internal@absl@@@23@PAPAPBVImpl@time_zone@cctz@time_internal@absl@@I@Z
     ?deallocate@?$allocator_traits@V?$allocator@PAU?$__hash_node_base@PAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@PAX@__1@std@@@__1@std@@@__1@std@@@__1@std@@SAXAAV?$allocator@PAU?$__hash_node_base@PAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@PAX@__1@std@@@__1@std@@@23@PAPAU?$__hash_node_base@PAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@PAX@__1@std@@@23@I@Z
     ?deallocate@?$allocator_traits@V?$allocator@PAUCordRep@cord_internal@absl@@@__1@std@@@__1@std@@SAXAAV?$allocator@PAUCordRep@cord_internal@absl@@@23@PAPAUCordRep@cord_internal@absl@@I@Z
-    ?deallocate@?$allocator_traits@V?$allocator@PAUCordRep@cord_internal@absl@@@__1@std@@@absl@@SAXAAV?$allocator@PAUCordRep@cord_internal@absl@@@__1@std@@PAPAUCordRep@cord_internal@2@I@Z
     ?deallocate@?$allocator_traits@V?$allocator@PAVCordzHandle@cord_internal@absl@@@__1@std@@@__1@std@@SAXAAV?$allocator@PAVCordzHandle@cord_internal@absl@@@23@PAPAVCordzHandle@cord_internal@absl@@I@Z
-    ?deallocate@?$allocator_traits@V?$allocator@PBUCordRep@cord_internal@absl@@@__1@std@@@absl@@SAXAAV?$allocator@PBUCordRep@cord_internal@absl@@@__1@std@@PAPBUCordRep@cord_internal@2@I@Z
+    ?deallocate@?$allocator_traits@V?$allocator@PBUCordRep@cord_internal@absl@@@__1@std@@@__1@std@@SAXAAV?$allocator@PBUCordRep@cord_internal@absl@@@23@PAPBUCordRep@cord_internal@absl@@I@Z
     ?deallocate@?$allocator_traits@V?$allocator@PBVCordzHandle@cord_internal@absl@@@__1@std@@@__1@std@@SAXAAV?$allocator@PBVCordzHandle@cord_internal@absl@@@23@PAPBVCordzHandle@cord_internal@absl@@I@Z
     ?deallocate@?$allocator_traits@V?$allocator@PBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@@__1@std@@SAXAAV?$allocator@PBVImpl@time_zone@cctz@time_internal@absl@@@23@PAPBVImpl@time_zone@cctz@time_internal@absl@@I@Z
     ?deallocate@?$allocator_traits@V?$allocator@U?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@PAX@__1@std@@@__1@std@@@__1@std@@SAXAAV?$allocator@U?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@PAX@__1@std@@@23@PAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@PAX@23@I@Z
     ?deallocate@?$allocator_traits@V?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@__1@std@@@__1@std@@SAXAAV?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@23@PAUConversionItem@ParsedFormatBase@str_format_internal@absl@@I@Z
-    ?deallocate@?$allocator_traits@V?$allocator@UPayload@status_internal@absl@@@__1@std@@@absl@@SAXAAV?$allocator@UPayload@status_internal@absl@@@__1@std@@PAUPayload@status_internal@2@I@Z
-    ?deallocate@?$allocator_traits@V?$allocator@USubRange@absl@@@__1@std@@@absl@@SAXAAV?$allocator@USubRange@absl@@@__1@std@@PAUSubRange@2@I@Z
+    ?deallocate@?$allocator_traits@V?$allocator@UPayload@status_internal@absl@@@__1@std@@@__1@std@@SAXAAV?$allocator@UPayload@status_internal@absl@@@23@PAUPayload@status_internal@absl@@I@Z
+    ?deallocate@?$allocator_traits@V?$allocator@USubRange@absl@@@__1@std@@@__1@std@@SAXAAV?$allocator@USubRange@absl@@@23@PAUSubRange@absl@@I@Z
     ?deallocate@?$allocator_traits@V?$allocator@UTransition@cctz@time_internal@absl@@@__1@std@@@__1@std@@SAXAAV?$allocator@UTransition@cctz@time_internal@absl@@@23@PAUTransition@cctz@time_internal@absl@@I@Z
     ?deallocate@?$allocator_traits@V?$allocator@UTransitionType@cctz@time_internal@absl@@@__1@std@@@__1@std@@SAXAAV?$allocator@UTransitionType@cctz@time_internal@absl@@@23@PAUTransitionType@cctz@time_internal@absl@@I@Z
     ?deallocate@?$allocator_traits@V?$allocator@UViableSubstitution@strings_internal@absl@@@__1@std@@@__1@std@@SAXAAV?$allocator@UViableSubstitution@strings_internal@absl@@@23@PAUViableSubstitution@strings_internal@absl@@I@Z
@@ -3011,6 +3108,7 @@
     ?end@?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__1@std@@@absl@@QAEPAUPayload@status_internal@2@XZ
     ?end@?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__1@std@@@absl@@QBEPBUPayload@status_internal@2@XZ
     ?end@?$Span@$$CBVFormatArgImpl@str_format_internal@absl@@@absl@@QBEPBVFormatArgImpl@str_format_internal@2@XZ
+    ?end@?$Span@QAUCordRep@cord_internal@absl@@@absl@@QBEPBQAUCordRep@cord_internal@2@XZ
     ?end@?$__deque_base@PBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@@__1@std@@IAE?AV?$__deque_iterator@PBVImpl@time_zone@cctz@time_internal@absl@@PAPBV12345@AAPBV12345@PAPAPBV12345@H$0A@@23@XZ
     ?end@?$__hash_table@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@V?$__unordered_map_hasher@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@23@$00@23@V?$__unordered_map_equal@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@23@$00@23@V?$allocator@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@@23@@__1@std@@QAE?AV?$__hash_iterator@PAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@PAX@__1@std@@@23@XZ
     ?end@?$__split_buffer@PAPBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PAPBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@@__1@std@@QAEPAPAPBVImpl@time_zone@cctz@time_internal@absl@@XZ
@@ -3023,6 +3121,7 @@
     ?end@?$vector@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@__1@std@@@__1@std@@QAE?AV?$__wrap_iter@PAUTransition@cctz@time_internal@absl@@@23@XZ
     ?end@?$vector@UTransitionType@cctz@time_internal@absl@@V?$allocator@UTransitionType@cctz@time_internal@absl@@@__1@std@@@__1@std@@QAE?AV?$__wrap_iter@PAUTransitionType@cctz@time_internal@absl@@@23@XZ
     ?end@ChunkRange@Cord@absl@@QBE?AVChunkIterator@23@XZ
+    ?end@CordRepBtree@cord_internal@absl@@QBEIXZ
     ?end@Storage@?$FixedArray@PAUCordRep@cord_internal@absl@@$0PPPPPPPP@V?$allocator@PAUCordRep@cord_internal@absl@@@__1@std@@@absl@@QBEPAPAUCordRep@cord_internal@3@XZ
     ?end@string_view@absl@@QBEPBDXZ
     ?entries@CordRepRing@cord_internal@absl@@QBEIII@Z
@@ -3030,7 +3129,6 @@
     ?entry_begin_pos@CordRepRing@cord_internal@absl@@QBEABII@Z
     ?entry_child@CordRepRing@cord_internal@absl@@AAEPAPAUCordRep@23@XZ
     ?entry_child@CordRepRing@cord_internal@absl@@QBEABQAUCordRep@23@I@Z
-    ?entry_data@CordRepRing@cord_internal@absl@@QBE?AVstring_view@3@I@Z
     ?entry_data_offset@CordRepRing@cord_internal@absl@@AAEPAIXZ
     ?entry_data_offset@CordRepRing@cord_internal@absl@@QBEABII@Z
     ?entry_end_offset@CordRepRing@cord_internal@absl@@QBEII@Z
@@ -3043,6 +3141,7 @@
     ?exchange@?$__atomic_base@P6AXABUHashtablezInfo@container_internal@absl@@@Z$0A@@__1@std@@QAEP6AXABUHashtablezInfo@container_internal@absl@@@ZP6AX0@ZW4memory_order@23@@Z
     ?external@CordRep@cord_internal@absl@@QAEPAUCordRepExternal@23@XZ
     ?external@CordRep@cord_internal@absl@@QBEPBUCordRepExternal@23@XZ
+    ?fetch_add_end@CordRepBtree@cord_internal@absl@@AAEII@Z
     ?find@?$unordered_map@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PBVImpl@time_zone@cctz@time_internal@absl@@U?$hash@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@@23@@__1@std@@QAE?AV?$__hash_map_iterator@V?$__hash_iterator@PAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@PAX@__1@std@@@__1@std@@@23@ABV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@23@@Z
     ?find@string_view@absl@@QBEIDI@Z
     ?find@string_view@absl@@QBEIV12@I@Z
@@ -3164,9 +3263,12 @@
     ?hash_function@?$__hash_table@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@V?$__unordered_map_hasher@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@23@$00@23@V?$__unordered_map_equal@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@23@$00@23@V?$allocator@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@@23@@__1@std@@QAEAAV?$__unordered_map_hasher@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@23@$00@23@XZ
     ?head@CordRepRing@cord_internal@absl@@QBEIXZ
     ?head@Filler@CordRepRing@cord_internal@absl@@QBEIXZ
+    ?height@CordRepBtree@cord_internal@absl@@QBEHXZ
     ?hour@?$civil_time@Uhour_tag@detail@cctz@time_internal@absl@@@detail@cctz@time_internal@absl@@QBEHXZ
     ?hour@?$civil_time@Usecond_tag@detail@cctz@time_internal@absl@@@detail@cctz@time_internal@absl@@QBEHXZ
     ?hour@?$civil_time@Usecond_tag@time_internal@absl@@@detail@cctz@time_internal@absl@@QBEHXZ
+    ?index@?$probe_seq@$0BA@@container_internal@absl@@QBEIXZ
+    ?index@CordRepBtree@cord_internal@absl@@QBEIW4EdgeType@123@@Z
     ?inline_size@InlineData@cord_internal@absl@@QBEIXZ
     ?inline_size@InlineRep@Cord@absl@@ABEIXZ
     ?is_basic@FormatConversionSpecImpl@str_format_internal@absl@@QBE_NXZ
@@ -3178,12 +3280,13 @@
     ?is_leap_year@impl@detail@cctz@time_internal@absl@@YA_N_J@Z
     ?is_length@ConvTag@str_format_internal@absl@@QBE_NXZ
     ?is_profiled@InlineData@cord_internal@absl@@QBE_NXZ
+    ?is_small@container_internal@absl@@YA_NI@Z
     ?is_snapshot@CordzHandle@cord_internal@absl@@QBE_NXZ
     ?is_tree@InlineData@cord_internal@absl@@QBE_NXZ
     ?is_tree@InlineRep@Cord@absl@@QBE_NXZ
     ?key_eq@?$__hash_table@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@V?$__unordered_map_hasher@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@23@$00@23@V?$__unordered_map_equal@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@23@$00@23@V?$allocator@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@@23@@__1@std@@QAEAAV?$__unordered_map_equal@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@23@$00@23@XZ
     ?length@?$Span@D@absl@@QBEIXZ
-    ?length@CordRepRingReader@cord_internal@absl@@QBEIXZ
+    ?length@CordRepBtreeReader@cord_internal@absl@@QBEIXZ
     ?length@string_view@absl@@QBEIXZ
     ?load@?$__atomic_base@P6AXABUHashtablezInfo@container_internal@absl@@@Z$0A@@__1@std@@QBEP6AXABUHashtablezInfo@container_internal@absl@@@ZW4memory_order@23@@Z
     ?load@?$__atomic_base@PAUHashtablezInfo@container_internal@absl@@$0A@@__1@std@@QBEPAUHashtablezInfo@container_internal@absl@@W4memory_order@23@@Z
@@ -3248,8 +3351,11 @@
     ?n_mon@impl@detail@cctz@time_internal@absl@@YA?AUfields@2345@_J000CCC@Z
     ?n_sec@impl@detail@cctz@time_internal@absl@@YA?AUfields@2345@_J00000@Z
     ?name@time_zone@cctz@time_internal@absl@@QBE?AV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@XZ
+    ?next@?$probe_seq@$0BA@@container_internal@absl@@QAEXXZ
     ?next_transition@time_zone@cctz@time_internal@absl@@QBE_NABV?$time_point@Vsystem_clock@chrono@__1@std@@V?$duration@_JV?$ratio@$00$00@__1@std@@@234@@chrono@__1@std@@PAUcivil_transition@1234@@Z
     ?next_weekday@detail@cctz@time_internal@absl@@YA?AV?$civil_time@Uday_tag@detail@cctz@time_internal@absl@@@1234@V51234@W4weekday@1234@@Z
+    ?offset@?$probe_seq@$0BA@@container_internal@absl@@QBEII@Z
+    ?offset@?$probe_seq@$0BA@@container_internal@absl@@QBEIXZ
     ?ok@Status@absl@@QBE_NXZ
     ?overflow@OStringStream@strings_internal@absl@@EAEHH@Z
     ?parse@detail@cctz@time_internal@absl@@YA_NABV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@0ABVtime_zone@234@PAV?$time_point@Vsystem_clock@chrono@__1@std@@V?$duration@_JV?$ratio@$00$00@__1@std@@@234@@chrono@67@PAV?$duration@_JV?$ratio@$00$0DINHOKEMGIAAA@@__1@std@@@chrono@67@PAV567@@Z
@@ -3270,6 +3376,7 @@
     ?precision@FormatConversionSpecImpl@str_format_internal@absl@@QBEHXZ
     ?prev_transition@time_zone@cctz@time_internal@absl@@QBE_NABV?$time_point@Vsystem_clock@chrono@__1@std@@V?$duration@_JV?$ratio@$00$00@__1@std@@@234@@chrono@__1@std@@PAUcivil_transition@1234@@Z
     ?prev_weekday@detail@cctz@time_internal@absl@@YA?AV?$civil_time@Uday_tag@detail@cctz@time_internal@absl@@@1234@V51234@W4weekday@1234@@Z
+    ?probe@container_internal@absl@@YA?AV?$probe_seq@$0BA@@12@PBW4ctrl_t@12@II@Z
     ?push_back@?$InlinedVector@H$0CP@V?$allocator@H@__1@std@@@absl@@QAEXABH@Z
     ?push_back@?$InlinedVector@PAUCordRep@cord_internal@absl@@$01V?$allocator@PAUCordRep@cord_internal@absl@@@__1@std@@@absl@@QAEXABQAUCordRep@cord_internal@2@@Z
     ?push_back@?$InlinedVector@PAUCordRep@cord_internal@absl@@$0CP@V?$allocator@PAUCordRep@cord_internal@absl@@@__1@std@@@absl@@QAEX$$QAPAUCordRep@cord_internal@2@@Z
@@ -3298,7 +3405,6 @@
     ?release@?$unique_ptr@U?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@PAX@__1@std@@V?$__hash_node_destructor@V?$allocator@U?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@PAX@__1@std@@@__1@std@@@23@@__1@std@@QAEPAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@PAX@23@XZ
     ?release@?$unique_ptr@V?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__1@std@@@absl@@U?$default_delete@V?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__1@std@@@absl@@@__1@std@@@__1@std@@QAEPAV?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__1@std@@@absl@@XZ
     ?release@?$unique_ptr@VTimeZoneInfo@cctz@time_internal@absl@@U?$default_delete@VTimeZoneInfo@cctz@time_internal@absl@@@__1@std@@@__1@std@@QAEPAVTimeZoneInfo@cctz@time_internal@absl@@XZ
-    ?remaining@CordRepRingReader@cord_internal@absl@@QBEIXZ
     ?remove_prefix@InlineRep@Cord@absl@@QAEXI@Z
     ?remove_prefix@string_view@absl@@QAEXI@Z
     ?remove_suffix@string_view@absl@@QAEXI@Z
@@ -3322,7 +3428,6 @@
     ?rfind@string_view@absl@@QBEIV12@I@Z
     ?ring@CordRep@cord_internal@absl@@QAEPAVCordRepRing@23@XZ
     ?ring@CordRep@cord_internal@absl@@QBEPBVCordRepRing@23@XZ
-    ?ring@CordRepRingReader@cord_internal@absl@@QBEPAVCordRepRing@23@XZ
     ?safe_strto128_base@numbers_internal@absl@@YA_NVstring_view@2@PAVint128@2@H@Z
     ?safe_strto32_base@numbers_internal@absl@@YA_NVstring_view@2@PAHH@Z
     ?safe_strto64_base@numbers_internal@absl@@YA_NVstring_view@2@PA_JH@Z
@@ -3373,11 +3478,13 @@
     ?second@?$civil_time@Usecond_tag@detail@cctz@time_internal@absl@@@detail@cctz@time_internal@absl@@QBEHXZ
     ?second@?$civil_time@Usecond_tag@time_internal@absl@@@detail@cctz@time_internal@absl@@QBEHXZ
     ?set_arg@BoundConversion@str_format_internal@absl@@QAEXPBVFormatArgImpl@23@@Z
+    ?set_begin@CordRepBtree@cord_internal@absl@@AAEXI@Z
     ?set_cordz_info@InlineData@cord_internal@absl@@QAEXPAVCordzInfo@23@@Z
     ?set_cordz_mean_interval@cord_internal@absl@@YAXH@Z
     ?set_data@InlineRep@Cord@absl@@QAEPADI@Z
     ?set_data@InlineRep@Cord@absl@@QAEXPBDI_N@Z
     ?set_depth@CordRepConcat@cord_internal@absl@@QAEXE@Z
+    ?set_end@CordRepBtree@cord_internal@absl@@AAEXI@Z
     ?set_from_arg@InputValue@UnboundConversion@str_format_internal@absl@@QAEXH@Z
     ?set_inline_size@InlineData@cord_internal@absl@@QAEXI@Z
     ?set_inline_size@InlineRep@Cord@absl@@AAEXI@Z
@@ -3396,6 +3503,7 @@
     ?size@?$Span@$$CBVFormatArgImpl@str_format_internal@absl@@@absl@@QBEIXZ
     ?size@?$Span@D@absl@@QBEIXZ
     ?size@?$Span@I@absl@@QBEIXZ
+    ?size@?$Span@QAUCordRep@cord_internal@absl@@@absl@@QBEIXZ
     ?size@?$Span@VFormatArgImpl@str_format_internal@absl@@@absl@@QBEIXZ
     ?size@?$__bucket_list_deallocator@V?$allocator@PAU?$__hash_node_base@PAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@PAX@__1@std@@@__1@std@@@__1@std@@@__1@std@@QAEAAIXZ
     ?size@?$__bucket_list_deallocator@V?$allocator@PAU?$__hash_node_base@PAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@PAX@__1@std@@@__1@std@@@__1@std@@@__1@std@@QBEIXZ
@@ -3417,6 +3525,7 @@
     ?size@?$vector@VFormatArgImpl@str_format_internal@absl@@V?$allocator@VFormatArgImpl@str_format_internal@absl@@@__1@std@@@__1@std@@QBEIXZ
     ?size@AlphaNum@absl@@QBEIXZ
     ?size@Cord@absl@@QBEIXZ
+    ?size@CordRepBtree@cord_internal@absl@@QBEIXZ
     ?size@InlineRep@Cord@absl@@QBEIXZ
     ?size@Storage@?$FixedArray@PAUCordRep@cord_internal@absl@@$0PPPPPPPP@V?$allocator@PAUCordRep@cord_internal@absl@@@__1@std@@@absl@@QBEIXZ
     ?size@string_view@absl@@QBEIXZ
@@ -3428,6 +3537,7 @@
     ?store@?$__atomic_base@W4OnDeadlockCycle@absl@@$0A@@__1@std@@QAEXW4OnDeadlockCycle@absl@@W4memory_order@23@@Z
     ?store@?$__atomic_base@W4State@PerThreadSynch@base_internal@absl@@$0A@@__1@std@@QAEXW4State@PerThreadSynch@base_internal@absl@@W4memory_order@23@@Z
     ?str@UntypedFormatSpecImpl@str_format_internal@absl@@QBE?AVstring_view@3@XZ
+    ?sub_fetch_begin@CordRepBtree@cord_internal@absl@@AAEII@Z
     ?substr@string_view@absl@@QBE?AV12@II@Z
     ?substring@CordRep@cord_internal@absl@@QAEPAUCordRepSubstring@23@XZ
     ?substring@CordRep@cord_internal@absl@@QBEPBUCordRepSubstring@23@XZ
diff --git a/third_party/abseil-cpp/symbols_x86_rel.def b/third_party/abseil-cpp/symbols_x86_rel.def
index 376a193..f278d37 100644
--- a/third_party/abseil-cpp/symbols_x86_rel.def
+++ b/third_party/abseil-cpp/symbols_x86_rel.def
@@ -3,6 +3,12 @@
     ??$?0V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@$0A@@Cord@absl@@QAE@$$QAV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@Z
     ??$?MUsecond_tag@detail@cctz@time_internal@absl@@U01234@@detail@cctz@time_internal@absl@@YA_NABV?$civil_time@Usecond_tag@detail@cctz@time_internal@absl@@@0123@0@Z
     ??$?RW4LogSeverity@absl@@ABQBDHAAPBD@?$AtomicHook@P6AXW4LogSeverity@absl@@PBDHABV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@Z@base_internal@absl@@QBEX$$QAW4LogSeverity@2@ABQBD$$QAHAAPBD@Z
+    ??$AddCordRep@$00@CordRepBtree@cord_internal@absl@@CAPAV012@PAV012@PAUCordRep@12@@Z
+    ??$AddCordRep@$0A@@CordRepBtree@cord_internal@absl@@CAPAV012@PAV012@PAUCordRep@12@@Z
+    ??$AddData@$00@CordRepBtree@cord_internal@absl@@AAE?AVstring_view@2@V32@I@Z
+    ??$AddData@$00@CordRepBtree@cord_internal@absl@@CAPAV012@PAV012@Vstring_view@2@I@Z
+    ??$AddData@$0A@@CordRepBtree@cord_internal@absl@@AAE?AVstring_view@2@V32@I@Z
+    ??$AddData@$0A@@CordRepBtree@cord_internal@absl@@CAPAV012@PAV012@Vstring_view@2@I@Z
     ??$AddRing@$00@CordRepRing@cord_internal@absl@@CAPAV012@PAV012@0II@Z
     ??$AddRing@$0A@@CordRepRing@cord_internal@absl@@CAPAV012@PAV012@0II@Z
     ??$Append@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@$0A@@Cord@absl@@QAEX$$QAV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@Z
@@ -62,12 +68,18 @@
     ??$GenericCompare@HVstring_view@absl@@@absl@@YAHABVCord@0@ABVstring_view@0@I@Z
     ??$GenericCompare@_NVCord@absl@@@absl@@YA_NABVCord@0@0I@Z
     ??$GenericCompare@_NVstring_view@absl@@@absl@@YA_NABVCord@0@ABVstring_view@0@I@Z
+    ??$Merge@$00@CordRepBtree@cord_internal@absl@@CAPAV012@PAV012@0@Z
+    ??$Merge@$0A@@CordRepBtree@cord_internal@absl@@CAPAV012@PAV012@0@Z
+    ??$NewLeaf@$00@CordRepBtree@cord_internal@absl@@CAPAV012@Vstring_view@2@I@Z
+    ??$NewLeaf@$0A@@CordRepBtree@cord_internal@absl@@CAPAV012@Vstring_view@2@I@Z
     ??$ParseFloat@$09@strings_internal@absl@@YA?AUParsedFloat@01@PBD0W4chars_format@1@@Z
     ??$ParseFloat@$0BA@@strings_internal@absl@@YA?AUParsedFloat@01@PBD0W4chars_format@1@@Z
     ??$ParseFormatString@UParsedFormatConsumer@ParsedFormatBase@str_format_internal@absl@@@str_format_internal@absl@@YA_NVstring_view@1@UParsedFormatConsumer@ParsedFormatBase@01@@Z
     ??$Prepend@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@$0A@@Cord@absl@@QAEX$$QAV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@Z
     ??$STLStringReserveAmortized@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@strings_internal@absl@@YAXPAV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@I@Z
     ??$STLStringResizeUninitializedAmortized@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@strings_internal@absl@@YAXPAV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@I@Z
+    ??$SetEdge@$00@CordRepBtree@cord_internal@absl@@QAE?AUOpResult@012@_NPAUCordRep@12@I@Z
+    ??$SetEdge@$0A@@CordRepBtree@cord_internal@absl@@QAE?AUOpResult@012@_NPAUCordRep@12@I@Z
     ??$StrReplaceAll@V?$initializer_list@U?$pair@Vstring_view@absl@@V12@@__1@std@@@std@@@absl@@YA?AV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@Vstring_view@0@ABV?$initializer_list@U?$pair@Vstring_view@absl@@V12@@__1@std@@@3@@Z
     ??$StrReplaceAll@V?$initializer_list@U?$pair@Vstring_view@absl@@V12@@__1@std@@@std@@@absl@@YAHABV?$initializer_list@U?$pair@Vstring_view@absl@@V12@@__1@std@@@std@@PAV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@2@@Z
     ??$__construct_node_hash@ABUpiecewise_construct_t@__1@std@@V?$tuple@ABV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@23@V?$tuple@$$V@23@@?$__hash_table@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@V?$__unordered_map_hasher@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@23@$00@23@V?$__unordered_map_equal@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@23@$00@23@V?$allocator@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@@23@@__1@std@@AAE?AV?$unique_ptr@U?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@PAX@__1@std@@V?$__hash_node_destructor@V?$allocator@U?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@PAX@__1@std@@@__1@std@@@23@@12@IABUpiecewise_construct_t@12@$$QAV?$tuple@ABV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@12@$$QAV?$tuple@$$V@12@@Z
@@ -83,6 +95,7 @@
     ??$emplace_back@$$V@?$__split_buffer@UTransition@cctz@time_internal@absl@@AAV?$allocator@UTransition@cctz@time_internal@absl@@@__1@std@@@__1@std@@QAEXXZ
     ??$emplace_back@$$V@?$__split_buffer@UTransitionType@cctz@time_internal@absl@@AAV?$allocator@UTransitionType@cctz@time_internal@absl@@@__1@std@@@__1@std@@QAEXXZ
     ??$find@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@?$__hash_table@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@V?$__unordered_map_hasher@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@23@$00@23@V?$__unordered_map_equal@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@23@$00@23@V?$allocator@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@@23@@__1@std@@QAE?AV?$__hash_iterator@PAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@PAX@__1@std@@@12@ABV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@12@@Z
+    ??$find_first_non_full@X@container_internal@absl@@YA?AUFindInfo@01@PBW4ctrl_t@01@II@Z
     ??0?$BigUnsigned@$03@strings_internal@absl@@QAE@Vstring_view@2@@Z
     ??0?$BigUnsigned@$03@strings_internal@absl@@QAE@XZ
     ??0?$BigUnsigned@$03@strings_internal@absl@@QAE@_K@Z
@@ -94,13 +107,14 @@
     ??0?$__split_buffer@UTransitionType@cctz@time_internal@absl@@AAV?$allocator@UTransitionType@cctz@time_internal@absl@@@__1@std@@@__1@std@@QAE@IIAAV?$allocator@UTransitionType@cctz@time_internal@absl@@@12@@Z
     ??0?$__split_buffer@UViableSubstitution@strings_internal@absl@@AAV?$allocator@UViableSubstitution@strings_internal@absl@@@__1@std@@@__1@std@@QAE@IIAAV?$allocator@UViableSubstitution@strings_internal@absl@@@12@@Z
     ??0AlphaNum@absl@@QAE@I@Z
-    ??0AlphaNum@absl@@QAE@PBD@Z
     ??0AlphaNum@absl@@QAE@UDec@1@@Z
     ??0AlphaNum@absl@@QAE@UHex@1@@Z
     ??0Arena@LowLevelAlloc@base_internal@absl@@QAE@I@Z
     ??0Arg@substitute_internal@absl@@QAE@PBX@Z
     ??0Arg@substitute_internal@absl@@QAE@UDec@2@@Z
     ??0Arg@substitute_internal@absl@@QAE@UHex@2@@Z
+    ??0BadStatusOrAccess@absl@@QAE@$$QAV01@@Z
+    ??0BadStatusOrAccess@absl@@QAE@ABV01@@Z
     ??0BadStatusOrAccess@absl@@QAE@VStatus@1@@Z
     ??0BlockingCounter@absl@@QAE@H@Z
     ??0ByAnyChar@absl@@QAE@Vstring_view@1@@Z
@@ -145,6 +159,8 @@
     ??1bad_optional_access@absl@@UAE@XZ
     ??1bad_variant_access@absl@@UAE@XZ
     ??4?$optional_data@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@$0A@@optional_internal@absl@@IAEAAV012@$$QAV012@@Z
+    ??4BadStatusOrAccess@absl@@QAEAAV01@$$QAV01@@Z
+    ??4BadStatusOrAccess@absl@@QAEAAV01@ABV01@@Z
     ??4Cord@absl@@QAEAAV01@Vstring_view@1@@Z
     ??6absl@@YAAAV?$basic_ostream@DU?$char_traits@D@__1@std@@@__1@std@@AAV123@ABVCord@0@@Z
     ??6absl@@YAAAV?$basic_ostream@DU?$char_traits@D@__1@std@@@__1@std@@AAV123@ABVStatus@0@@Z
@@ -176,6 +192,7 @@
     ??Kabsl@@YA?AVuint128@0@V10@0@Z
     ??Labsl@@YA?AVint128@0@V10@0@Z
     ??Labsl@@YA?AVuint128@0@V10@0@Z
+    ??R<lambda_1>@?0??CompareSlowPath@Cord@absl@@ABEHABV23@II@Z@QBE?A?<auto>@@PAVChunkIterator@23@PAVstring_view@3@@Z
     ??R?$default_delete@$$CBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@QBEXPBVImpl@time_zone@cctz@time_internal@absl@@@Z
     ??XDuration@absl@@QAEAAV01@N@Z
     ??XDuration@absl@@QAEAAV01@_J@Z
@@ -197,7 +214,7 @@
     ?AddWithCarry@?$BigUnsigned@$0FE@@strings_internal@absl@@AAEXH_K@Z
     ?AddressIsReadable@debugging_internal@absl@@YA_NPBX@Z
     ?AdvanceAndReadBytes@ChunkIterator@Cord@absl@@AAE?AV23@I@Z
-    ?AdvanceBytesRing@ChunkIterator@Cord@absl@@AAEXI@Z
+    ?AdvanceBytesBtree@ChunkIterator@Cord@absl@@AAEXI@Z
     ?AdvanceBytesSlowPath@ChunkIterator@Cord@absl@@AAEXI@Z
     ?AdvanceStack@ChunkIterator@Cord@absl@@AAEAAV123@XZ
     ?Alloc@LowLevelAlloc@base_internal@absl@@SAPAXI@Z
@@ -205,6 +222,7 @@
     ?AlreadyExistsError@absl@@YA?AVStatus@1@Vstring_view@1@@Z
     ?Append@Cord@absl@@QAEX$$QAV12@@Z
     ?Append@Cord@absl@@QAEXABV12@@Z
+    ?Append@CordRepBtree@cord_internal@absl@@SAPAV123@PAV123@Vstring_view@3@I@Z
     ?Append@CordRepRing@cord_internal@absl@@SAPAV123@PAV123@PAUCordRep@23@@Z
     ?Append@CordRepRing@cord_internal@absl@@SAPAV123@PAV123@Vstring_view@3@I@Z
     ?Append@FormatSinkImpl@str_format_internal@absl@@QAEXID@Z
@@ -214,6 +232,7 @@
     ?AppendLeaf@CordRepRing@cord_internal@absl@@CAPAV123@PAV123@PAUCordRep@23@II@Z
     ?AppendPack@str_format_internal@absl@@YAAAV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PAV345@VUntypedFormatSpecImpl@12@V?$Span@$$CBVFormatArgImpl@str_format_internal@absl@@@2@@Z
     ?AppendPieces@strings_internal@absl@@YAXPAV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@V?$initializer_list@Vstring_view@absl@@@5@@Z
+    ?AppendSlow@CordRepBtree@cord_internal@absl@@CAPAV123@PAV123@PAUCordRep@23@@Z
     ?AppendSlow@CordRepRing@cord_internal@absl@@CAPAV123@PAV123@PAUCordRep@23@@Z
     ?AppendTree@InlineRep@Cord@absl@@QAEXPAUCordRep@cord_internal@3@W4MethodIdentifier@CordzUpdateTracker@53@@Z
     ?AppendTreeToInlined@InlineRep@Cord@absl@@QAEXPAUCordRep@cord_internal@3@W4MethodIdentifier@CordzUpdateTracker@53@@Z
@@ -273,18 +292,21 @@
     ?Consume@cord_internal@absl@@YAXPAUCordRep@12@V?$FunctionRef@$$A6AXPAUCordRep@cord_internal@absl@@II@Z@2@@Z
     ?ConsumeUnboundConversion@str_format_internal@absl@@YAPBDPBD0PAUUnboundConversion@12@PAH@Z
     ?ConvertDateTime@absl@@YA?AUTimeConversion@1@_JHHHHHVTimeZone@1@@Z
-    ?ConvertDeletedToEmptyAndFullToDeleted@container_internal@absl@@YAXPACI@Z
+    ?ConvertDeletedToEmptyAndFullToDeleted@container_internal@absl@@YAXPAW4ctrl_t@12@I@Z
     ?ConvertFloatImpl@str_format_internal@absl@@YA_NMABVFormatConversionSpecImpl@12@PAVFormatSinkImpl@12@@Z
     ?ConvertFloatImpl@str_format_internal@absl@@YA_NNABVFormatConversionSpecImpl@12@PAVFormatSinkImpl@12@@Z
     ?ConvertFloatImpl@str_format_internal@absl@@YA_NOABVFormatConversionSpecImpl@12@PAVFormatSinkImpl@12@@Z
     ?ConvertOne@ParsedFormatConsumer@ParsedFormatBase@str_format_internal@absl@@QAE_NABUUnboundConversion@34@Vstring_view@4@@Z
     ?Copy@CordRepRing@cord_internal@absl@@CAPAV123@PAV123@III@Z
     ?CopyCordToString@absl@@YAXABVCord@1@PAV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@Z
+    ?CopyPrefix@CordRepBtree@cord_internal@absl@@AAE?AUCopyResult@123@I@Z
+    ?CopySuffix@CordRepBtree@cord_internal@absl@@AAE?AUCopyResult@123@I@Z
     ?CopyTo@InlineRep@Cord@absl@@QBEXPAV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@Z
     ?CopyToArraySlowPath@Cord@absl@@ABEXPAD@Z
     ?Crash@Helper@internal_statusor@absl@@SAXABVStatus@3@@Z
     ?Create@CordRepRing@cord_internal@absl@@SAPAV123@PAUCordRep@23@I@Z
     ?CreateFromLeaf@CordRepRing@cord_internal@absl@@CAPAV123@PAUCordRep@23@III@Z
+    ?CreateSlow@CordRepBtree@cord_internal@absl@@CAPAV123@PAUCordRep@23@@Z
     ?CreateSlow@CordRepRing@cord_internal@absl@@CAPAV123@PAUCordRep@23@I@Z
     ?CreateThreadIdentity@synchronization_internal@absl@@YAPAUThreadIdentity@base_internal@2@XZ
     ?CurrentThreadIdentityIfPresent@base_internal@absl@@YAPAUThreadIdentity@12@XZ
@@ -307,6 +329,8 @@
     ?Destroy@PerThreadSem@synchronization_internal@absl@@CAXPAUThreadIdentity@base_internal@3@@Z
     ?DestroyContents@?$Storage@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__1@std@@@inlined_vector_internal@absl@@AAEXXZ
     ?DestroyCordSlow@Cord@absl@@AAEXXZ
+    ?DestroyLeaf@CordRepBtree@cord_internal@absl@@CAXPAV123@II@Z
+    ?DestroyNonLeaf@CordRepBtree@cord_internal@absl@@CAXPAV123@II@Z
     ?DiagnosticsGetDeleteQueue@CordzHandle@cord_internal@absl@@SA?AV?$vector@PBVCordzHandle@cord_internal@absl@@V?$allocator@PBVCordzHandle@cord_internal@absl@@@__1@std@@@__1@std@@XZ
     ?DiagnosticsGetSafeToInspectDeletedHandles@CordzHandle@cord_internal@absl@@QAE?AV?$vector@PBVCordzHandle@cord_internal@absl@@V?$allocator@PBVCordzHandle@cord_internal@absl@@@__1@std@@@__1@std@@XZ
     ?DiagnosticsHandleIsSafeToInspect@CordzHandle@cord_internal@absl@@QBE_NPBV123@@Z
@@ -319,6 +343,9 @@
     ?DummyFunction@?$AtomicHook@P6AXPBX_J@Z@base_internal@absl@@CAXPBX_J@Z
     ?DummyFunction@?$AtomicHook@P6AX_J@Z@base_internal@absl@@CAX_J@Z
     ?DummyFunction@?$AtomicHook@P6A_NW4LogSeverity@absl@@PBDHPAPADPAH@Z@base_internal@absl@@CA_NW4LogSeverity@3@PBDHPAPADPAH@Z
+    ?Dump@CordRepBtree@cord_internal@absl@@SAXPBUCordRep@23@AAV?$basic_ostream@DU?$char_traits@D@__1@std@@@__1@std@@@Z
+    ?Dump@CordRepBtree@cord_internal@absl@@SAXPBUCordRep@23@Vstring_view@3@AAV?$basic_ostream@DU?$char_traits@D@__1@std@@@__1@std@@@Z
+    ?Dump@CordRepBtree@cord_internal@absl@@SAXPBUCordRep@23@Vstring_view@3@_NAAV?$basic_ostream@DU?$char_traits@D@__1@std@@@__1@std@@@Z
     ?DumpPCAndFrameSizesAndStackTrace@debugging_internal@absl@@YAXPAXQBQAXQAHHH_NP6AXPBD0@Z0@Z
     ?DurationFromTimespec@absl@@YA?AVDuration@1@Utimespec@@@Z
     ?DurationFromTimeval@absl@@YA?AVDuration@1@Utimeval@@@Z
@@ -412,8 +439,11 @@
     ?FromUDate@absl@@YA?AVTime@1@N@Z
     ?FromUniversal@absl@@YA?AVTime@1@_J@Z
     ?FromUnixSeconds@cctz@time_internal@absl@@YA?AV?$time_point@Vsystem_clock@chrono@__1@std@@V?$duration@_JV?$ratio@$00$00@__1@std@@@234@@chrono@__1@std@@_J@Z
+    ?GetAppendBuffer@CordRepBtree@cord_internal@absl@@QAE?AV?$Span@D@3@I@Z
     ?GetAppendBuffer@CordRepRing@cord_internal@absl@@QAE?AV?$Span@D@3@I@Z
+    ?GetAppendBufferSlow@CordRepBtree@cord_internal@absl@@AAE?AV?$Span@D@3@I@Z
     ?GetCachedTID@base_internal@absl@@YAIXZ
+    ?GetCharacter@CordRepBtree@cord_internal@absl@@QBEDI@Z
     ?GetCharacter@CordRepRing@cord_internal@absl@@QBEDI@Z
     ?GetCordzStatistics@CordzInfo@cord_internal@absl@@QBE?AUCordzStatistics@23@XZ
     ?GetCurrentTimeNanos@absl@@YA_JXZ
@@ -453,6 +483,7 @@
     ?Init@PerThreadSem@synchronization_internal@absl@@CAXPAUThreadIdentity@base_internal@3@@Z
     ?InitFrom@?$Storage@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__1@std@@@inlined_vector_internal@absl@@QAEXABV123@@Z
     ?InitTree@ChunkIterator@Cord@absl@@AAEXPAUCordRep@cord_internal@3@@Z
+    ?InitWhat@BadStatusOrAccess@absl@@ABEXXZ
     ?Initialize@ExponentialBiased@base_internal@absl@@AAEXXZ
     ?InitializeCordRepExternal@cord_internal@absl@@YAXVstring_view@2@PAUCordRepExternal@12@@Z
     ?InitializeSymbolizer@absl@@YAXPBD@Z
@@ -468,6 +499,8 @@
     ?IsDataLoss@absl@@YA_NABVStatus@1@@Z
     ?IsDeadlineExceeded@absl@@YA_NABVStatus@1@@Z
     ?IsFailedPrecondition@absl@@YA_NABVStatus@1@@Z
+    ?IsFlat@CordRepBtree@cord_internal@absl@@QBE_NIIPAVstring_view@3@@Z
+    ?IsFlat@CordRepBtree@cord_internal@absl@@QBE_NPAVstring_view@3@@Z
     ?IsInternal@absl@@YA_NABVStatus@1@@Z
     ?IsInvalidArgument@absl@@YA_NABVStatus@1@@Z
     ?IsNotFound@absl@@YA_NABVStatus@1@@Z
@@ -479,6 +512,7 @@
     ?IsUnavailable@absl@@YA_NABVStatus@1@@Z
     ?IsUnimplemented@absl@@YA_NABVStatus@1@@Z
     ?IsUnknown@absl@@YA_NABVStatus@1@@Z
+    ?IsValid@CordRepBtree@cord_internal@absl@@SA_NPBV123@_N@Z
     ?IsValid@CordRepRing@cord_internal@absl@@QBE_NAAV?$basic_ostream@DU?$char_traits@D@__1@std@@@__1@std@@@Z
     ?Iterate@HashtablezSampler@container_internal@absl@@QAE_JABV?$function@$$A6AXABUHashtablezInfo@container_internal@absl@@@Z@__1@std@@@Z
     ?LengthModToString@str_format_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@W4LengthMod@12@@Z
@@ -497,6 +531,8 @@
     ?LockWhen@Mutex@absl@@QAEXABVCondition@2@@Z
     ?LockWhenWithDeadline@Mutex@absl@@QAE_NABVCondition@2@VTime@2@@Z
     ?LockWhenWithTimeout@Mutex@absl@@QAE_NABVCondition@2@VDuration@2@@Z
+    ?LowLevelHash@hash_internal@absl@@YA_KPBXI_KQB_K@Z
+    ?LowLevelHashImpl@MixingHashState@hash_internal@absl@@CA_KPBEI@Z
     ?MakeConcat@CordForest@absl@@AAEPAUCordRep@cord_internal@2@PAU342@0@Z
     ?MakeTime@TimeZoneInfo@cctz@time_internal@absl@@UBE?AUcivil_lookup@time_zone@234@ABV?$civil_time@Usecond_tag@detail@cctz@time_internal@absl@@@detail@234@@Z
     ?MakeTime@TimeZoneLibC@cctz@time_internal@absl@@UBE?AUcivil_lookup@time_zone@234@ABV?$civil_time@Usecond_tag@detail@cctz@time_internal@absl@@@detail@234@@Z
@@ -505,6 +541,7 @@
     ?MaxFlatLength@CordTestAccess@strings_internal@absl@@SAIXZ
     ?MaybeTrackCordImpl@CordzInfo@cord_internal@absl@@CAXAAVInlineData@23@ABV423@W4MethodIdentifier@CordzUpdateTracker@23@@Z
     ?MemoryUsageAux@Cord@absl@@CAIPBUCordRep@cord_internal@2@@Z
+    ?MergeTrees@CordRepBtree@cord_internal@absl@@CAPAV123@PAV123@0@Z
     ?MovedFromString@Status@absl@@CAPBV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@XZ
     ?MultiplyBy@?$BigUnsigned@$03@strings_internal@absl@@AAEXHPBI@Z
     ?MultiplyBy@?$BigUnsigned@$03@strings_internal@absl@@QAEXI@Z
@@ -523,7 +560,6 @@
     ?New@CordRepFlat@cord_internal@absl@@SAPAU123@I@Z
     ?New@CordRepRing@cord_internal@absl@@CAPAV123@II@Z
     ?NewArena@LowLevelAlloc@base_internal@absl@@SAPAUArena@123@H@Z
-    ?Next@CordRepRingReader@cord_internal@absl@@QAE?AVstring_view@3@XZ
     ?Next@CordzInfo@cord_internal@absl@@QBEPAV123@ABVCordzSnapshot@23@@Z
     ?NextTransition@TimeZone@absl@@QBE_NVTime@2@PAUCivilTransition@12@@Z
     ?NextTransition@TimeZoneInfo@cctz@time_internal@absl@@UBE_NABV?$time_point@Vsystem_clock@chrono@__1@std@@V?$duration@_JV?$ratio@$00$00@__1@std@@@234@@chrono@__1@std@@PAUcivil_transition@time_zone@234@@Z
@@ -562,9 +598,11 @@
     ?PrepareToModify@Status@absl@@AAEXXZ
     ?Prepend@Cord@absl@@QAEXABV12@@Z
     ?Prepend@Cord@absl@@QAEXVstring_view@2@@Z
+    ?Prepend@CordRepBtree@cord_internal@absl@@SAPAV123@PAV123@Vstring_view@3@I@Z
     ?Prepend@CordRepRing@cord_internal@absl@@SAPAV123@PAV123@PAUCordRep@23@@Z
     ?Prepend@CordRepRing@cord_internal@absl@@SAPAV123@PAV123@Vstring_view@3@I@Z
     ?PrependLeaf@CordRepRing@cord_internal@absl@@CAPAV123@PAV123@PAUCordRep@23@II@Z
+    ?PrependSlow@CordRepBtree@cord_internal@absl@@CAPAV123@PAV123@PAUCordRep@23@@Z
     ?PrependSlow@CordRepRing@cord_internal@absl@@CAPAV123@PAV123@PAUCordRep@23@@Z
     ?PrependTree@InlineRep@Cord@absl@@QAEXPAUCordRep@cord_internal@3@W4MethodIdentifier@CordzUpdateTracker@53@@Z
     ?PrependTreeToInlined@InlineRep@Cord@absl@@QAEXPAUCordRep@cord_internal@3@W4MethodIdentifier@CordzUpdateTracker@53@@Z
@@ -579,6 +617,8 @@
     ?PutPaddedString@FormatSinkImpl@str_format_internal@absl@@QAE_NVstring_view@3@HH_N@Z
     ?RawLog@raw_logging_internal@absl@@YAXW4LogSeverity@2@PBDH1ZZ
     ?RawLoggingFullySupported@raw_logging_internal@absl@@YA_NXZ
+    ?Read@CordRepBtreeNavigator@cord_internal@absl@@QAE?AUReadResult@123@II@Z
+    ?Read@CordRepBtreeReader@cord_internal@absl@@QAE?AVstring_view@3@IIAAPAUCordRep@23@@Z
     ?ReadDigits@?$BigUnsigned@$03@strings_internal@absl@@AAEHPBD0H@Z
     ?ReadDigits@?$BigUnsigned@$0FE@@strings_internal@absl@@AAEHPBD0H@Z
     ?ReadFloatMantissa@?$BigUnsigned@$03@strings_internal@absl@@QAEHABUParsedFloat@23@H@Z
@@ -617,7 +657,6 @@
     ?SafeToDelete@CordzHandle@cord_internal@absl@@QBE_NXZ
     ?SafeWriteToStderr@raw_logging_internal@absl@@YAXPBDI@Z
     ?SampleSlow@container_internal@absl@@YAPAUHashtablezInfo@12@PA_J@Z
-    ?Seek@CordRepRingReader@cord_internal@absl@@QAE?AVstring_view@3@I@Z
     ?SetCapacityForTesting@CordRepRing@cord_internal@absl@@QAEXI@Z
     ?SetCurrentThreadIdentity@base_internal@absl@@YAXPAUThreadIdentity@12@P6AXPAX@Z@Z
     ?SetDisposeCallback@HashtablezSampler@container_internal@absl@@QAEP6AXABUHashtablezInfo@23@@ZP6AX0@Z@Z
@@ -633,7 +672,7 @@
     ?SetToZero@?$BigUnsigned@$0FE@@strings_internal@absl@@QAEXXZ
     ?ShiftLeft@?$BigUnsigned@$03@strings_internal@absl@@QAEXH@Z
     ?ShiftLeft@?$BigUnsigned@$0FE@@strings_internal@absl@@QAEXH@Z
-    ?ShouldInsertBackwards@container_internal@absl@@YA_NIPAC@Z
+    ?ShouldInsertBackwards@container_internal@absl@@YA_NIPBW4ctrl_t@12@@Z
     ?Signal@CondVar@absl@@QAEXXZ
     ?SignalAll@CondVar@absl@@QAEXXZ
     ?SimpleAtob@absl@@YA_NVstring_view@1@PA_N@Z
@@ -643,6 +682,7 @@
     ?SizeofCordRepConcat@CordTestAccess@strings_internal@absl@@SAIXZ
     ?SizeofCordRepExternal@CordTestAccess@strings_internal@absl@@SAIXZ
     ?SizeofCordRepSubstring@CordTestAccess@strings_internal@absl@@SAIXZ
+    ?Skip@CordRepBtreeNavigator@cord_internal@absl@@QAE?AUPosition@123@I@Z
     ?SlowLock@SpinLock@base_internal@absl@@AAEXXZ
     ?SlowUnlock@SpinLock@base_internal@absl@@AAEXI@Z
     ?SnprintF@str_format_internal@absl@@YAHPADIVUntypedFormatSpecImpl@12@V?$Span@$$CBVFormatArgImpl@str_format_internal@absl@@@2@@Z
@@ -663,6 +703,7 @@
     ?StrReplaceAll@absl@@YAHV?$initializer_list@U?$pair@Vstring_view@absl@@V12@@__1@std@@@std@@PAV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@3@@Z
     ?SubLength@CordRepRing@cord_internal@absl@@AAEXII@Z
     ?SubRing@CordRepRing@cord_internal@absl@@SAPAV123@PAV123@III@Z
+    ?SubTree@CordRepBtree@cord_internal@absl@@QAEPAUCordRep@23@II@Z
     ?Subcord@Cord@absl@@QBE?AV12@II@Z
     ?SubstituteAndAppendArray@substitute_internal@absl@@YAXPAV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@Vstring_view@2@PBV62@I@Z
     ?Summarize@str_format_internal@absl@@YA?AV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@VUntypedFormatSpecImpl@12@V?$Span@$$CBVFormatArgImpl@str_format_internal@absl@@@2@@Z
@@ -773,8 +814,6 @@
     ?WebSafeBase64Unescape@absl@@YA_NVstring_view@1@PAV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@Z
     ?Write@BufferRawSink@str_format_internal@absl@@QAEXVstring_view@3@@Z
     ?Write@FILERawSink@str_format_internal@absl@@QAEXVstring_view@3@@Z
-    ?Wyhash@hash_internal@absl@@YA_KPBXI_KQB_K@Z
-    ?WyhashImpl@MixingHashState@hash_internal@absl@@CA_KPBEI@Z
     ?__add_back_capacity@?$deque@PBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@@__1@std@@AAEXXZ
     ?__append@?$vector@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@__1@std@@@__1@std@@AAEXI@Z
     ?__append@?$vector@UTransitionType@cctz@time_internal@absl@@V?$allocator@UTransitionType@cctz@time_internal@absl@@@__1@std@@@__1@std@@AAEXI@Z
@@ -790,6 +829,7 @@
     ?clear@?$__hash_table@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@V?$__unordered_map_hasher@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@23@$00@23@V?$__unordered_map_equal@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@23@$00@23@V?$allocator@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@@23@@__1@std@@QAEXXZ
     ?code@Status@absl@@QBE?AW4StatusCode@2@XZ
     ?cord_btree_enabled@cord_internal@absl@@3U?$atomic@_N@__1@std@@A
+    ?cord_btree_exhaustive_validation@cord_internal@absl@@3U?$atomic@_N@__1@std@@A
     ?cord_ring_buffer_enabled@cord_internal@absl@@3U?$atomic@_N@__1@std@@A
     ?day_difference@impl@detail@cctz@time_internal@absl@@YA_J_JCC0CC@Z
     ?description@time_zone@cctz@time_internal@absl@@QBE?AV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@XZ
diff --git a/third_party/libjpeg.gni b/third_party/libjpeg.gni
index 8d4527c..a133cf7 100644
--- a/third_party/libjpeg.gni
+++ b/third_party/libjpeg.gni
@@ -3,7 +3,7 @@
 # found in the LICENSE file.
 #
 # See:
-# https://chromium.googlesource.com/chromium/src/+/master/third_party/libjpeg.gni
+# https://chromium.googlesource.com/chromium/src/+/main/third_party/libjpeg.gni
 
 declare_args() {
   # Uses system libjpeg. If true, overrides use_libjpeg_turbo.
diff --git a/third_party/vulkan-deps/DEPS b/third_party/vulkan-deps/DEPS
index a2facd2..c228503 100644
--- a/third_party/vulkan-deps/DEPS
+++ b/third_party/vulkan-deps/DEPS
@@ -9,28 +9,28 @@
   'chromium_git': 'https://chromium.googlesource.com',
 
   # Current revision of glslang, the Khronos SPIRV compiler.
-  'glslang_revision': '9158061398a96033c990e69156bd28c67114544b',
+  'glslang_revision': 'e0771b5d4c7e64a4354e1aa93fb2a673b2a08010',
 
   # Current revision of spirv-cross, the Khronos SPIRV cross compiler.
-  'spirv_cross_revision': 'e51630595fadfa99ba7f41229176667214d1a83d',
+  'spirv_cross_revision': '51d8e7be9443aebb773192812ef7e4d67a7adce1',
 
   # Current revision fo the SPIRV-Headers Vulkan support library.
-  'spirv_headers_revision': '1d4e3a7e3a04ba205ed8cb1485f7cb7369bec609',
+  'spirv_headers_revision': '6cae8216a6ea19ff3f237af01e54378c1ff81fcd',
 
   # Current revision of SPIRV-Tools for Vulkan.
-  'spirv_tools_revision': 'f084bcfe2bf94d8d9867e7fd4baed78381539ea1',
+  'spirv_tools_revision': '789de0dc4bc952c8b21c5d6c5ed5cc8656b1e135',
 
   # Current revision of Khronos Vulkan-Headers.
-  'vulkan_headers_revision': '0193e158bc9f4d17e3c3a61c9311a0439ed5572d',
+  'vulkan_headers_revision': '9e62d027636cd7210f60d934f56107ed6e1579b8',
 
   # Current revision of Khronos Vulkan-Loader.
-  'vulkan_loader_revision': '99c0b1433a0965ba7cd0dbef0e19fce649ddc12e',
+  'vulkan_loader_revision': 'ee4d7bb1bfba4f551eae9a3785be6b06f4e6a0c2',
 
   # Current revision of Khronos Vulkan-Tools.
-  'vulkan_tools_revision': '33a87ce6daecf60742277408ca9fa7ec6a4a5aae',
+  'vulkan_tools_revision': 'cf9d49e46157b4c2a0dcf3051679d550c5fb20a1',
 
   # Current revision of Khronos Vulkan-ValidationLayers.
-  'vulkan_validation_revision': 'd444097efd55c176eced51777cf22bd0a66dd114',
+  'vulkan_validation_revision': '2fdf7a587be55eeda1a090c3172b62c4131ea1f9',
 }
 
 deps = {
diff --git a/third_party/vulkan-deps/OWNERS b/third_party/vulkan-deps/OWNERS
index 3221373..0374b4a 100644
--- a/third_party/vulkan-deps/OWNERS
+++ b/third_party/vulkan-deps/OWNERS
@@ -1,3 +1,5 @@
 cwallez@chromium.org
 jmadill@chromium.org
 vmuira@chromium.org
+
+per-file DEPS=chromium-autoroll@skia-public.iam.gserviceaccount.com
diff --git a/third_party/vulkan-deps/glslang/src/CHANGES.md b/third_party/vulkan-deps/glslang/src/CHANGES.md
index 27b002e..ad4fa40 100644
--- a/third_party/vulkan-deps/glslang/src/CHANGES.md
+++ b/third_party/vulkan-deps/glslang/src/CHANGES.md
@@ -3,6 +3,17 @@
 All notable changes to this project will be documented in this file.
 This project adheres to [Semantic Versioning](https://semver.org/).
 
+## 11.6.0 2021-08-25
+
+### Other changes
+* Atomic memory function only for shader storage block member or shared variable
+* Add support for gl_MaxVaryingVectors for ogl
+* Fix loading bool arrays from interface blocks
+* Generate separate stores for partially swizzled memory stores
+* Allow layout(std430) uniform with GL_EXT_scalar_block_layout
+* Support for pragma STDGL invariant(all)
+* Support for GL_NV_ray_tracing_motion_blur
+
 ## 11.5.0 2021-06-23
 
 ### Other changes
diff --git a/third_party/vulkan-deps/glslang/src/CMakeLists.txt b/third_party/vulkan-deps/glslang/src/CMakeLists.txt
index 0600516..c318eef 100644
--- a/third_party/vulkan-deps/glslang/src/CMakeLists.txt
+++ b/third_party/vulkan-deps/glslang/src/CMakeLists.txt
@@ -138,7 +138,8 @@
 
 if(WIN32)
     set(CMAKE_DEBUG_POSTFIX "d")
-    if(MSVC)
+    option(OVERRIDE_MSVCCRT "Overrides runtime of MSVC " ON)
+    if(MSVC AND OVERRIDE_MSVCCRT)
         include(ChooseMSVCCRT.cmake)
     endif(MSVC)
     add_definitions(-DGLSLANG_OSINCLUDE_WIN32)
@@ -197,7 +198,7 @@
     if(ENABLE_EXCEPTIONS)
         add_compile_options(/EHsc) # Enable Exceptions
 	else()
-        string(REGEX REPLACE /EHsc "" CMAKE_CXX_FLAGS ${CMAKE_CXX_FLAGS}) # Try to remove default /EHsc cxx_flag
+        string(REGEX REPLACE "/EHsc" "" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}") # Try to remove default /EHsc cxx_flag
         add_compile_options(/D_HAS_EXCEPTIONS=0)
     endif()
 endif()
diff --git a/third_party/vulkan-deps/glslang/src/SPIRV/GLSL.ext.NV.h b/third_party/vulkan-deps/glslang/src/SPIRV/GLSL.ext.NV.h
index 50146da..93c98bf 100644
--- a/third_party/vulkan-deps/glslang/src/SPIRV/GLSL.ext.NV.h
+++ b/third_party/vulkan-deps/glslang/src/SPIRV/GLSL.ext.NV.h
@@ -69,6 +69,9 @@
 //SPV_NV_raytracing
 const char* const E_SPV_NV_ray_tracing = "SPV_NV_ray_tracing";
 
+//SPV_NV_ray_tracing_motion_blur
+const char* const E_SPV_NV_ray_tracing_motion_blur = "SPV_NV_ray_tracing_motion_blur";
+
 //SPV_NV_shading_rate
 const char* const E_SPV_NV_shading_rate = "SPV_NV_shading_rate";
 
diff --git a/third_party/vulkan-deps/glslang/src/SPIRV/GlslangToSpv.cpp b/third_party/vulkan-deps/glslang/src/SPIRV/GlslangToSpv.cpp
index d0bebae..c323bcd 100644
--- a/third_party/vulkan-deps/glslang/src/SPIRV/GlslangToSpv.cpp
+++ b/third_party/vulkan-deps/glslang/src/SPIRV/GlslangToSpv.cpp
@@ -1033,6 +1033,10 @@
         return spv::BuiltInIncomingRayFlagsKHR;
     case glslang::EbvGeometryIndex:
         return spv::BuiltInRayGeometryIndexKHR;
+    case glslang::EbvCurrentRayTimeNV:
+        builder.addExtension(spv::E_SPV_NV_ray_tracing_motion_blur);
+        builder.addCapability(spv::CapabilityRayTracingMotionBlurNV);
+        return spv::BuiltInCurrentRayTimeNV;
 
     // barycentrics
     case glslang::EbvBaryCoordNV:
@@ -3018,6 +3022,7 @@
     case glslang::EOpIgnoreIntersectionNV:
     case glslang::EOpTerminateRayNV:
     case glslang::EOpTraceNV:
+    case glslang::EOpTraceRayMotionNV:
     case glslang::EOpTraceKHR:
     case glslang::EOpExecuteCallableNV:
     case glslang::EOpExecuteCallableKHR:
@@ -3317,9 +3322,11 @@
                 bool cond = glslangOperands[arg]->getAsConstantUnion()->getConstArray()[0].getBConst();
                 operands.push_back(builder.makeIntConstant(cond ? 1 : 0));
              } else if ((arg == 10 && glslangOp == glslang::EOpTraceKHR) ||
+                        (arg == 11 && glslangOp == glslang::EOpTraceRayMotionNV) ||
                         (arg == 1  && glslangOp == glslang::EOpExecuteCallableKHR)) {
-                 const int opdNum = glslangOp == glslang::EOpTraceKHR ? 10 : 1;
-                 const int set = glslangOp == glslang::EOpTraceKHR ? 0 : 1;
+                 const int opdNum = glslangOp == glslang::EOpTraceKHR ? 10 : (glslangOp == glslang::EOpTraceRayMotionNV ? 11 : 1);
+                 const int set = glslangOp == glslang::EOpExecuteCallableKHR ? 1 : 0;
+
                  const int location = glslangOperands[opdNum]->getAsConstantUnion()->getConstArray()[0].getUConst();
                  auto itNode = locationToSymbol[set].find(location);
                  visitSymbol(itNode->second);
@@ -4400,7 +4407,6 @@
 {
     // Name and decorate the non-hidden members
     int offset = -1;
-    int locationOffset = 0;  // for use within the members of this struct
     bool memberLocationInvalid = type.isArrayOfArrays() ||
         (type.isArray() && (type.getQualifier().isArrayedIo(glslangIntermediate->getStage()) == false));
     for (int i = 0; i < (int)glslangMembers->size(); i++) {
@@ -4458,10 +4464,6 @@
         if (!memberLocationInvalid && memberQualifier.hasLocation())
             builder.addMemberDecoration(spvType, member, spv::DecorationLocation, memberQualifier.layoutLocation);
 
-        if (qualifier.hasLocation())      // track for upcoming inheritance
-            locationOffset += glslangIntermediate->computeTypeLocationSize(
-                                            glslangMember, glslangIntermediate->getStage());
-
         // component, XFB, others
         if (glslangMember.getQualifier().hasComponent())
             builder.addMemberDecoration(spvType, member, spv::DecorationComponent,
@@ -5322,7 +5324,10 @@
 
     int components = node->getType().getVectorSize();
 
-    if (node->getOp() == glslang::EOpTextureFetch) {
+    if (node->getOp() == glslang::EOpImageLoad ||
+        node->getOp() == glslang::EOpImageLoadLod ||
+        node->getOp() == glslang::EOpTextureFetch ||
+        node->getOp() == glslang::EOpTextureFetchOffset) {
         // These must produce 4 components, per SPIR-V spec.  We'll add a conversion constructor if needed.
         // This will only happen through the HLSL path for operator[], so we do not have to handle e.g.
         // the EOpTexture/Proj/Lod/etc family.  It would be harmless to do so, but would need more logic
@@ -8324,6 +8329,11 @@
     case glslang::EOpTraceNV:
         builder.createNoResultOp(spv::OpTraceNV, operands);
         return 0;
+    case glslang::EOpTraceRayMotionNV:
+        builder.addExtension(spv::E_SPV_NV_ray_tracing_motion_blur);
+        builder.addCapability(spv::CapabilityRayTracingMotionBlurNV);
+        builder.createNoResultOp(spv::OpTraceRayMotionNV, operands);
+        return 0;
     case glslang::EOpTraceKHR:
         builder.createNoResultOp(spv::OpTraceRayKHR, operands);
         return 0;
diff --git a/third_party/vulkan-deps/glslang/src/SPIRV/SpvBuilder.cpp b/third_party/vulkan-deps/glslang/src/SPIRV/SpvBuilder.cpp
index 0482c5a..e83306e 100644
--- a/third_party/vulkan-deps/glslang/src/SPIRV/SpvBuilder.cpp
+++ b/third_party/vulkan-deps/glslang/src/SPIRV/SpvBuilder.cpp
@@ -743,6 +743,26 @@
     }
 }
 
+// Figure out the final resulting type of the access chain.
+Id Builder::getResultingAccessChainType() const
+{
+    assert(accessChain.base != NoResult);
+    Id typeId = getTypeId(accessChain.base);
+
+    assert(isPointerType(typeId));
+    typeId = getContainedTypeId(typeId);
+
+    for (int i = 0; i < (int)accessChain.indexChain.size(); ++i) {
+        if (isStructType(typeId)) {
+            assert(isConstantScalar(accessChain.indexChain[i]));
+            typeId = getContainedTypeId(typeId, getConstantScalar(accessChain.indexChain[i]));
+        } else
+            typeId = getContainedTypeId(typeId, accessChain.indexChain[i]);
+    }
+
+    return typeId;
+}
+
 // Return the immediately contained type of a given composite type.
 Id Builder::getContainedTypeId(Id typeId) const
 {
@@ -1585,16 +1605,7 @@
 Id Builder::createAccessChain(StorageClass storageClass, Id base, const std::vector<Id>& offsets)
 {
     // Figure out the final resulting type.
-    spv::Id typeId = getTypeId(base);
-    assert(isPointerType(typeId) && offsets.size() > 0);
-    typeId = getContainedTypeId(typeId);
-    for (int i = 0; i < (int)offsets.size(); ++i) {
-        if (isStructType(typeId)) {
-            assert(isConstantScalar(offsets[i]));
-            typeId = getContainedTypeId(typeId, getConstantScalar(offsets[i]));
-        } else
-            typeId = getContainedTypeId(typeId, offsets[i]);
-    }
+    Id typeId = getResultingAccessChainType();
     typeId = makePointer(storageClass, typeId);
 
     // Make the instruction
@@ -2794,28 +2805,59 @@
     assert(accessChain.isRValue == false);
 
     transferAccessChainSwizzle(true);
-    Id base = collapseAccessChain();
-    addDecoration(base, nonUniform);
 
-    Id source = rvalue;
+    // If a swizzle exists and is not full and is not dynamic, then the swizzle will be broken into individual stores.
+    if (accessChain.swizzle.size() > 0 &&
+        getNumTypeComponents(getResultingAccessChainType()) != (int)accessChain.swizzle.size() &&
+        accessChain.component == NoResult) {
+        for (unsigned int i = 0; i < accessChain.swizzle.size(); ++i) {
+            accessChain.indexChain.push_back(makeUintConstant(accessChain.swizzle[i]));
+            accessChain.instr = NoResult;
 
-    // dynamic component should be gone
-    assert(accessChain.component == NoResult);
+            Id base = collapseAccessChain();
+            addDecoration(base, nonUniform);
 
-    // If swizzle still exists, it is out-of-order or not full, we must load the target vector,
-    // extract and insert elements to perform writeMask and/or swizzle.
-    if (accessChain.swizzle.size() > 0) {
-        Id tempBaseId = createLoad(base, spv::NoPrecision);
-        source = createLvalueSwizzle(getTypeId(tempBaseId), tempBaseId, source, accessChain.swizzle);
+            accessChain.indexChain.pop_back();
+            accessChain.instr = NoResult;
+
+            // dynamic component should be gone
+            assert(accessChain.component == NoResult);
+
+            Id source = createCompositeExtract(rvalue, getContainedTypeId(getTypeId(rvalue)), i);
+
+            // take LSB of alignment
+            alignment = alignment & ~(alignment & (alignment-1));
+            if (getStorageClass(base) == StorageClassPhysicalStorageBufferEXT) {
+                memoryAccess = (spv::MemoryAccessMask)(memoryAccess | spv::MemoryAccessAlignedMask);
+            }
+
+            createStore(source, base, memoryAccess, scope, alignment);
+        }
     }
+    else {
+        Id base = collapseAccessChain();
+        addDecoration(base, nonUniform);
 
-    // take LSB of alignment
-    alignment = alignment & ~(alignment & (alignment-1));
-    if (getStorageClass(base) == StorageClassPhysicalStorageBufferEXT) {
-        memoryAccess = (spv::MemoryAccessMask)(memoryAccess | spv::MemoryAccessAlignedMask);
+        Id source = rvalue;
+
+        // dynamic component should be gone
+        assert(accessChain.component == NoResult);
+
+        // If swizzle still exists, it may be out-of-order, we must load the target vector,
+        // extract and insert elements to perform writeMask and/or swizzle.
+        if (accessChain.swizzle.size() > 0) {
+            Id tempBaseId = createLoad(base, spv::NoPrecision);
+            source = createLvalueSwizzle(getTypeId(tempBaseId), tempBaseId, source, accessChain.swizzle);
+        }
+
+        // take LSB of alignment
+        alignment = alignment & ~(alignment & (alignment-1));
+        if (getStorageClass(base) == StorageClassPhysicalStorageBufferEXT) {
+            memoryAccess = (spv::MemoryAccessMask)(memoryAccess | spv::MemoryAccessAlignedMask);
+        }
+
+        createStore(source, base, memoryAccess, scope, alignment);
     }
-
-    createStore(source, base, memoryAccess, scope, alignment);
 }
 
 // Comments in header
diff --git a/third_party/vulkan-deps/glslang/src/SPIRV/SpvBuilder.h b/third_party/vulkan-deps/glslang/src/SPIRV/SpvBuilder.h
index 73847e1..251b9ee 100644
--- a/third_party/vulkan-deps/glslang/src/SPIRV/SpvBuilder.h
+++ b/third_party/vulkan-deps/glslang/src/SPIRV/SpvBuilder.h
@@ -202,6 +202,7 @@
     StorageClass getTypeStorageClass(Id typeId) const { return module.getStorageClass(typeId); }
     ImageFormat getImageTypeFormat(Id typeId) const
         { return (ImageFormat)module.getInstruction(typeId)->getImmediateOperand(6); }
+    Id getResultingAccessChainType() const;
 
     bool isPointer(Id resultId)      const { return isPointerType(getTypeId(resultId)); }
     bool isScalar(Id resultId)       const { return isScalarType(getTypeId(resultId)); }
diff --git a/third_party/vulkan-deps/glslang/src/SPIRV/doc.cpp b/third_party/vulkan-deps/glslang/src/SPIRV/doc.cpp
index 31b20a1..dbdf707 100644
--- a/third_party/vulkan-deps/glslang/src/SPIRV/doc.cpp
+++ b/third_party/vulkan-deps/glslang/src/SPIRV/doc.cpp
@@ -426,6 +426,7 @@
     case BuiltInSMCountNV:              return "SMCountNV";
     case BuiltInWarpIDNV:               return "WarpIDNV";
     case BuiltInSMIDNV:                 return "SMIDNV";
+    case BuiltInCurrentRayTimeNV:       return "CurrentRayTimeNV";
 
     default: return "Bad";
     }
@@ -916,6 +917,7 @@
     case CapabilityPerViewAttributesNV:             return "PerViewAttributesNV";
     case CapabilityGroupNonUniformPartitionedNV:    return "GroupNonUniformPartitionedNV";
     case CapabilityRayTracingNV:                    return "RayTracingNV";
+    case CapabilityRayTracingMotionBlurNV:          return "RayTracingMotionBlurNV";
     case CapabilityRayTracingKHR:                   return "RayTracingKHR";
     case CapabilityRayQueryKHR:                     return "RayQueryKHR";
     case CapabilityRayTracingProvisionalKHR:        return "RayTracingProvisionalKHR";
@@ -1382,6 +1384,7 @@
     case OpTerminateRayNV:                    return "OpTerminateRayNV";
     case OpTerminateRayKHR:                   return "OpTerminateRayKHR";
     case OpTraceNV:                           return "OpTraceNV";
+    case OpTraceRayMotionNV:                  return "OpTraceRayMotionNV";
     case OpTraceRayKHR:                       return "OpTraceRayKHR";
     case OpTypeAccelerationStructureKHR:      return "OpTypeAccelerationStructureKHR";
     case OpExecuteCallableNV:                 return "OpExecuteCallableNV";
@@ -2812,6 +2815,20 @@
     InstructionDesc[OpTraceNV].operands.push(OperandId, "'Payload'");
     InstructionDesc[OpTraceNV].setResultAndType(false, false);
 
+    InstructionDesc[OpTraceRayMotionNV].operands.push(OperandId, "'Acceleration Structure'");
+    InstructionDesc[OpTraceRayMotionNV].operands.push(OperandId, "'Ray Flags'");
+    InstructionDesc[OpTraceRayMotionNV].operands.push(OperandId, "'Cull Mask'");
+    InstructionDesc[OpTraceRayMotionNV].operands.push(OperandId, "'SBT Record Offset'");
+    InstructionDesc[OpTraceRayMotionNV].operands.push(OperandId, "'SBT Record Stride'");
+    InstructionDesc[OpTraceRayMotionNV].operands.push(OperandId, "'Miss Index'");
+    InstructionDesc[OpTraceRayMotionNV].operands.push(OperandId, "'Ray Origin'");
+    InstructionDesc[OpTraceRayMotionNV].operands.push(OperandId, "'TMin'");
+    InstructionDesc[OpTraceRayMotionNV].operands.push(OperandId, "'Ray Direction'");
+    InstructionDesc[OpTraceRayMotionNV].operands.push(OperandId, "'TMax'");
+    InstructionDesc[OpTraceRayMotionNV].operands.push(OperandId, "'Time'");
+    InstructionDesc[OpTraceRayMotionNV].operands.push(OperandId, "'Payload'");
+    InstructionDesc[OpTraceRayMotionNV].setResultAndType(false, false);
+
     InstructionDesc[OpTraceRayKHR].operands.push(OperandId, "'Acceleration Structure'");
     InstructionDesc[OpTraceRayKHR].operands.push(OperandId, "'Ray Flags'");
     InstructionDesc[OpTraceRayKHR].operands.push(OperandId, "'Cull Mask'");
diff --git a/third_party/vulkan-deps/glslang/src/SPIRV/spirv.hpp b/third_party/vulkan-deps/glslang/src/SPIRV/spirv.hpp
index 317db81..e0fe249 100644
--- a/third_party/vulkan-deps/glslang/src/SPIRV/spirv.hpp
+++ b/third_party/vulkan-deps/glslang/src/SPIRV/spirv.hpp
@@ -652,6 +652,7 @@
     BuiltInHitTNV = 5332,
     BuiltInHitKindKHR = 5333,
     BuiltInHitKindNV = 5333,
+    BuiltInCurrentRayTimeNV = 5334,
     BuiltInIncomingRayFlagsKHR = 5351,
     BuiltInIncomingRayFlagsNV = 5351,
     BuiltInRayGeometryIndexKHR = 5352,
@@ -988,6 +989,7 @@
     CapabilityStorageTexelBufferArrayNonUniformIndexing = 5312,
     CapabilityStorageTexelBufferArrayNonUniformIndexingEXT = 5312,
     CapabilityRayTracingNV = 5340,
+    CapabilityRayTracingMotionBlurNV = 5341,
     CapabilityVulkanMemoryModel = 5345,
     CapabilityVulkanMemoryModelKHR = 5345,
     CapabilityVulkanMemoryModelDeviceScope = 5346,
@@ -1503,6 +1505,8 @@
     OpIgnoreIntersectionNV = 5335,
     OpTerminateRayNV = 5336,
     OpTraceNV = 5337,
+    OpTraceMotionNV = 5338,
+    OpTraceRayMotionNV = 5339,
     OpTypeAccelerationStructureKHR = 5341,
     OpTypeAccelerationStructureNV = 5341,
     OpExecuteCallableNV = 5344,
@@ -2090,6 +2094,8 @@
     case OpIgnoreIntersectionNV: *hasResult = false; *hasResultType = false; break;
     case OpTerminateRayNV: *hasResult = false; *hasResultType = false; break;
     case OpTraceNV: *hasResult = false; *hasResultType = false; break;
+    case OpTraceMotionNV: *hasResult = false; *hasResultType = false; break;
+    case OpTraceRayMotionNV: *hasResult = false; *hasResultType = false; break;
     case OpTypeAccelerationStructureNV: *hasResult = true; *hasResultType = false; break;
     case OpExecuteCallableNV: *hasResult = false; *hasResultType = false; break;
     case OpTypeCooperativeMatrixNV: *hasResult = true; *hasResultType = false; break;
diff --git a/third_party/vulkan-deps/glslang/src/StandAlone/StandAlone.cpp b/third_party/vulkan-deps/glslang/src/StandAlone/StandAlone.cpp
index c6dc597..e62f92f 100644
--- a/third_party/vulkan-deps/glslang/src/StandAlone/StandAlone.cpp
+++ b/third_party/vulkan-deps/glslang/src/StandAlone/StandAlone.cpp
@@ -347,13 +347,13 @@
         lang = FindLanguage(argv[arg++], false);
     }
 
-    if ((argc - arg) > 2 && isdigit(argv[arg+0][0]) && isdigit(argv[arg+1][0])) {
+    if ((argc - arg) >= 2 && isdigit(argv[arg+0][0]) && isdigit(argv[arg+1][0])) {
         // Parse a per-set binding base
-        while ((argc - arg) > 2 && isdigit(argv[arg+0][0]) && isdigit(argv[arg+1][0])) {
+        do {
             const int baseNum = atoi(argv[arg++]);
             const int setNum = atoi(argv[arg++]);
             perSetBase[setNum] = baseNum;
-        }
+        } while ((argc - arg) >= 2 && isdigit(argv[arg + 0][0]) && isdigit(argv[arg + 1][0]));
     } else {
         // Parse single binding base
         singleBase = atoi(argv[arg++]);
diff --git a/third_party/vulkan-deps/glslang/src/Test/GL_ARB_gpu_shader5.u2i.vert b/third_party/vulkan-deps/glslang/src/Test/GL_ARB_gpu_shader5.u2i.vert
new file mode 100644
index 0000000..0caa9bc
--- /dev/null
+++ b/third_party/vulkan-deps/glslang/src/Test/GL_ARB_gpu_shader5.u2i.vert
@@ -0,0 +1,11 @@
+#version 150
+#extension GL_ARB_gpu_shader5 : require
+
+uniform int u1;
+uniform int u2;
+out   vec4 result;
+void main()
+{
+    uint v = 0;
+    v = uint(u2) - u1;  // implicit conversions
+}
diff --git a/third_party/vulkan-deps/glslang/src/Test/atomicAdd.comp b/third_party/vulkan-deps/glslang/src/Test/atomicAdd.comp
new file mode 100644
index 0000000..27dfa13
--- /dev/null
+++ b/third_party/vulkan-deps/glslang/src/Test/atomicAdd.comp
@@ -0,0 +1,19 @@
+#version 320 es
+layout(local_size_x = 1) in;
+
+struct structType{
+    int y[3];
+};
+
+layout(std430) buffer t2 {
+    structType f;
+} t;
+
+buffer coherent Buffer { int x; };
+int z;
+
+void main() {
+  atomicAdd(x, 1);
+  atomicAdd(t.f.y[1], 1);
+  atomicAdd(z, 1);
+}
\ No newline at end of file
diff --git a/third_party/vulkan-deps/glslang/src/Test/atomicCounterARBOps.vert b/third_party/vulkan-deps/glslang/src/Test/atomicCounterARBOps.vert
new file mode 100644
index 0000000..5eb6637
--- /dev/null
+++ b/third_party/vulkan-deps/glslang/src/Test/atomicCounterARBOps.vert
@@ -0,0 +1,28 @@
+#version 450 core
+#extension GL_ARB_shader_atomic_counters: enable
+#extension GL_ARB_shader_atomic_counter_ops:enable
+
+layout(binding = 0) uniform atomic_uint counter;
+
+out highp vec4 vsColor;
+
+void main(){
+    vec4 outColor = vec4(1.0);
+    uint ret;
+
+    ret = atomicCounterAddARB(counter, 4u);
+    ret = atomicCounterSubtractARB(counter, 4u);
+    ret = atomicCounterMinARB(counter, 4u);
+    ret = atomicCounterMaxARB(counter, 4u);
+    ret = atomicCounterAndARB(counter, 4u);
+    ret = atomicCounterOrARB(counter, 4u);
+    ret = atomicCounterXorARB(counter, 4u);
+    ret = atomicCounterExchangeARB(counter, 4u);
+    ret = atomicCounterCompSwapARB(counter, 4u, 4u);
+
+    uint after = atomicCounter(counter);
+    if (after == ret)
+        outColor = vec4(0.0);
+
+    vsColor = outColor;
+}
\ No newline at end of file
diff --git a/third_party/vulkan-deps/glslang/src/Test/baseLegalResults/hlsl.partialFlattenLocal.vert.out b/third_party/vulkan-deps/glslang/src/Test/baseLegalResults/hlsl.partialFlattenLocal.vert.out
index 824aa49..f45a768 100644
--- a/third_party/vulkan-deps/glslang/src/Test/baseLegalResults/hlsl.partialFlattenLocal.vert.out
+++ b/third_party/vulkan-deps/glslang/src/Test/baseLegalResults/hlsl.partialFlattenLocal.vert.out
@@ -1,18 +1,18 @@
 hlsl.partialFlattenLocal.vert
 // Module Version 10000
 // Generated by (magic number): 8000a
-// Id's are bound by 159
+// Id's are bound by 164
 
                               Capability Shader
                1:             ExtInstImport  "GLSL.std.450"
                               MemoryModel Logical GLSL450
-                              EntryPoint Vertex 4  "main" 83 86
+                              EntryPoint Vertex 4  "main" 86 89
                               Source HLSL 500
                               Name 4  "main"
-                              Name 83  "pos"
-                              Name 86  "@entryPointOutput"
-                              Decorate 83(pos) Location 0
-                              Decorate 86(@entryPointOutput) BuiltIn Position
+                              Name 86  "pos"
+                              Name 89  "@entryPointOutput"
+                              Decorate 86(pos) Location 0
+                              Decorate 89(@entryPointOutput) BuiltIn Position
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeFloat 32
@@ -33,49 +33,54 @@
               37:    6(float) Constant 1065353216
               38:   18(fvec2) ConstantComposite 32 37
               39:             TypePointer Function 18(fvec2)
+              42:             TypePointer Function 6(float)
               54:             TypeBool
-              82:             TypePointer Input 7(fvec4)
-         83(pos):     82(ptr) Variable Input
-              85:             TypePointer Output 7(fvec4)
-86(@entryPointOutput):     85(ptr) Variable Output
-             131:             TypePointer Function 17
-             133:             TypePointer Function 20
+              64:     15(int) Constant 0
+              67:     15(int) Constant 1
+              85:             TypePointer Input 7(fvec4)
+         86(pos):     85(ptr) Variable Input
+              88:             TypePointer Output 7(fvec4)
+89(@entryPointOutput):     88(ptr) Variable Output
+             135:             TypePointer Function 17
+             137:             TypePointer Function 20
          4(main):           2 Function None 3
                5:             Label
-             134:    133(ptr) Variable Function
-             132:    131(ptr) Variable Function
-              84:    7(fvec4) Load 83(pos)
-             137:     34(ptr) AccessChain 132 25
-                              Store 137 33
-             138:     39(ptr) AccessChain 134 25
-                              Store 138 38
-                              Branch 101
-             101:             Label
-             158:     21(int) Phi 25 5 119 105
-             104:    54(bool) SLessThan 158 31
-                              LoopMerge 120 105 None
-                              BranchConditional 104 105 120
-             105:               Label
-             139:     39(ptr)   AccessChain 134 158
-             109:   18(fvec2)   Load 139
-             140:     34(ptr)   AccessChain 132 158
-             111:   14(fvec3)   Load 140
-             112:   18(fvec2)   VectorShuffle 111 111 0 1
-             113:   18(fvec2)   FAdd 112 109
-             141:     34(ptr)   AccessChain 132 158
-             115:   14(fvec3)   Load 141
-             116:   14(fvec3)   VectorShuffle 115 113 3 4 2
-                                Store 141 116
-             119:     21(int)   IAdd 158 31
-                                Branch 101
-             120:             Label
-             143:          17 Load 132
-             157:   14(fvec3) CompositeExtract 143 0
-             125:    6(float) CompositeExtract 157 0
-             126:    6(float) CompositeExtract 157 1
-             127:    6(float) CompositeExtract 157 2
-             128:    7(fvec4) CompositeConstruct 125 126 127 32
-             129:    7(fvec4) FAdd 84 128
-                              Store 86(@entryPointOutput) 129
+             138:    137(ptr) Variable Function
+             136:    135(ptr) Variable Function
+              87:    7(fvec4) Load 86(pos)
+             141:     34(ptr) AccessChain 136 25
+                              Store 141 33
+             142:     39(ptr) AccessChain 138 25
+                              Store 142 38
+                              Branch 104
+             104:             Label
+             163:     21(int) Phi 25 5 123 108
+             107:    54(bool) SLessThan 163 31
+                              LoopMerge 124 108 None
+                              BranchConditional 107 108 124
+             108:               Label
+             143:     39(ptr)   AccessChain 138 163
+             112:   18(fvec2)   Load 143
+             144:     34(ptr)   AccessChain 136 163
+             114:   14(fvec3)   Load 144
+             115:   18(fvec2)   VectorShuffle 114 114 0 1
+             116:   18(fvec2)   FAdd 115 112
+             145:     42(ptr)   AccessChain 136 163 64
+             118:    6(float)   CompositeExtract 116 0
+                                Store 145 118
+             146:     42(ptr)   AccessChain 136 163 67
+             120:    6(float)   CompositeExtract 116 1
+                                Store 146 120
+             123:     21(int)   IAdd 163 31
+                                Branch 104
+             124:             Label
+             148:          17 Load 136
+             162:   14(fvec3) CompositeExtract 148 0
+             129:    6(float) CompositeExtract 162 0
+             130:    6(float) CompositeExtract 162 1
+             131:    6(float) CompositeExtract 162 2
+             132:    7(fvec4) CompositeConstruct 129 130 131 32
+             133:    7(fvec4) FAdd 87 132
+                              Store 89(@entryPointOutput) 133
                               Return
                               FunctionEnd
diff --git a/third_party/vulkan-deps/glslang/src/Test/baseResults/300block.frag.out b/third_party/vulkan-deps/glslang/src/Test/baseResults/300block.frag.out
index e5b07dd..1a5bd9b 100644
--- a/third_party/vulkan-deps/glslang/src/Test/baseResults/300block.frag.out
+++ b/third_party/vulkan-deps/glslang/src/Test/baseResults/300block.frag.out
@@ -24,18 +24,18 @@
 0:42  Function Definition: main( ( global void)
 0:42    Function Parameters: 
 0:44    Sequence
-0:44      texture ( global lowp 4-component vector of int)
+0:44      texture ( global lowp 4-component vector of int, operation at mediump)
 0:44        sampler: direct index for structure ( global lowp isampler3D)
 0:44          's' ( uniform structure{ global mediump 4-component vector of float u,  global mediump 4-component vector of uint v,  global lowp isampler3D sampler,  global mediump 3-component vector of float w,  global structure{ global mediump int a} t})
 0:44          Constant:
 0:44            2 (const int)
-0:44        Construct vec3 ( temp lowp 3-component vector of float)
-0:44          Convert int to float ( temp lowp float)
+0:44        Construct vec3 ( temp mediump 3-component vector of float)
+0:44          Convert int to float ( temp mediump float)
 0:44            ni: direct index for structure (layout( column_major shared) uniform mediump int)
 0:44              'inst' (layout( column_major shared) uniform block{layout( column_major shared) uniform mediump 4-component vector of uint nbv, layout( column_major shared) uniform mediump int ni})
 0:44              Constant:
 0:44                1 (const int)
-0:44          Convert uint to float ( temp lowp float)
+0:44          Convert uint to float ( temp mediump float)
 0:44            direct index ( temp mediump uint)
 0:44              bv: direct index for structure (layout( column_major shared) uniform mediump 4-component vector of uint)
 0:44                'anon@0' (layout( column_major shared) uniform block{layout( column_major shared) uniform mediump 4-component vector of uint bv, layout( column_major shared) uniform mediump 2X2 matrix of float bm2, layout( column_major shared) uniform lowp isampler2D sampler, layout( column_major shared) uniform structure{ global mediump int a} t, layout( column_major shared) uniform structure{ global mediump 4-component vector of float u,  global mediump 4-component vector of uint v,  global lowp isampler3D sampler,  global mediump 3-component vector of float w, layout( column_major) global structure{ global mediump int a} t} fbs})
@@ -43,7 +43,7 @@
 0:44                  0 (const uint)
 0:44              Constant:
 0:44                1 (const int)
-0:44          Convert uint to float ( temp lowp float)
+0:44          Convert uint to float ( temp mediump float)
 0:44            direct index ( temp mediump uint)
 0:44              nbv: direct index for structure (layout( column_major shared) uniform mediump 4-component vector of uint)
 0:44                direct index (layout( column_major shared) temp block{layout( column_major shared) uniform mediump 4-component vector of uint nbv, layout( column_major shared) uniform mediump int ni})
@@ -92,18 +92,18 @@
 0:42  Function Definition: main( ( global void)
 0:42    Function Parameters: 
 0:44    Sequence
-0:44      texture ( global lowp 4-component vector of int)
+0:44      texture ( global lowp 4-component vector of int, operation at mediump)
 0:44        sampler: direct index for structure ( global lowp isampler3D)
 0:44          's' ( uniform structure{ global mediump 4-component vector of float u,  global mediump 4-component vector of uint v,  global lowp isampler3D sampler,  global mediump 3-component vector of float w,  global structure{ global mediump int a} t})
 0:44          Constant:
 0:44            2 (const int)
-0:44        Construct vec3 ( temp lowp 3-component vector of float)
-0:44          Convert int to float ( temp lowp float)
+0:44        Construct vec3 ( temp mediump 3-component vector of float)
+0:44          Convert int to float ( temp mediump float)
 0:44            ni: direct index for structure (layout( column_major shared) uniform mediump int)
 0:44              'inst' (layout( column_major shared) uniform block{layout( column_major shared) uniform mediump 4-component vector of uint nbv, layout( column_major shared) uniform mediump int ni})
 0:44              Constant:
 0:44                1 (const int)
-0:44          Convert uint to float ( temp lowp float)
+0:44          Convert uint to float ( temp mediump float)
 0:44            direct index ( temp mediump uint)
 0:44              bv: direct index for structure (layout( column_major shared) uniform mediump 4-component vector of uint)
 0:44                'anon@0' (layout( column_major shared) uniform block{layout( column_major shared) uniform mediump 4-component vector of uint bv, layout( column_major shared) uniform mediump 2X2 matrix of float bm2, layout( column_major shared) uniform lowp isampler2D sampler, layout( column_major shared) uniform structure{ global mediump int a} t, layout( column_major shared) uniform structure{ global mediump 4-component vector of float u,  global mediump 4-component vector of uint v,  global lowp isampler3D sampler,  global mediump 3-component vector of float w, layout( column_major) global structure{ global mediump int a} t} fbs})
@@ -111,7 +111,7 @@
 0:44                  0 (const uint)
 0:44              Constant:
 0:44                1 (const int)
-0:44          Convert uint to float ( temp lowp float)
+0:44          Convert uint to float ( temp mediump float)
 0:44            direct index ( temp mediump uint)
 0:44              nbv: direct index for structure (layout( column_major shared) uniform mediump 4-component vector of uint)
 0:44                direct index (layout( column_major shared) temp block{layout( column_major shared) uniform mediump 4-component vector of uint nbv, layout( column_major shared) uniform mediump int ni})
diff --git a/third_party/vulkan-deps/glslang/src/Test/baseResults/310.comp.out b/third_party/vulkan-deps/glslang/src/Test/baseResults/310.comp.out
index 85b0116..ac76cbd 100644
--- a/third_party/vulkan-deps/glslang/src/Test/baseResults/310.comp.out
+++ b/third_party/vulkan-deps/glslang/src/Test/baseResults/310.comp.out
@@ -180,7 +180,7 @@
 0:91              'i' ( temp highp int)
 0:92      imageStore ( global highp void)
 0:92        'ii2da' ( writeonly uniform highp iimage2DArray)
-0:92        Construct ivec3 ( temp 3-component vector of int)
+0:92        Construct ivec3 ( temp highp 3-component vector of int)
 0:92          'i' ( temp highp int)
 0:92          'i' ( temp highp int)
 0:92          'i' ( temp highp int)
@@ -189,9 +189,9 @@
 0:92          0 (const int)
 0:92          0 (const int)
 0:92          0 (const int)
-0:93      imageLoad ( global mediump 4-component vector of float)
+0:93      imageLoad ( global mediump 4-component vector of float, operation at highp)
 0:93        'img2Drgba' (layout( rgba32f) readonly uniform mediump image2D)
-0:93        Construct ivec2 ( temp mediump 2-component vector of int)
+0:93        Construct ivec2 ( temp highp 2-component vector of int)
 0:93          'i' ( temp highp int)
 0:93          'i' ( temp highp int)
 0:94      imageLoad ( global highp 4-component vector of int)
diff --git a/third_party/vulkan-deps/glslang/src/Test/baseResults/310.frag.out b/third_party/vulkan-deps/glslang/src/Test/baseResults/310.frag.out
index 9f73c67..e43a887 100644
--- a/third_party/vulkan-deps/glslang/src/Test/baseResults/310.frag.out
+++ b/third_party/vulkan-deps/glslang/src/Test/baseResults/310.frag.out
@@ -270,7 +270,7 @@
 0:42        Constant:
 0:42          0.000000
 0:42          0.000000
-0:42        Convert float to int ( temp highp 2-component vector of int)
+0:42        Convert float to int ( temp mediump 2-component vector of int)
 0:42          'c2D' ( smooth in mediump 2-component vector of float)
 0:43      textureProjGradOffset ( global highp 4-component vector of uint)
 0:43        'usamp2d' ( uniform highp usampler2D)
@@ -471,7 +471,7 @@
 0:211        Constant:
 0:211          0.100000
 0:211          0.100000
-0:211        Convert float to int ( temp highp 2-component vector of int)
+0:211        Convert float to int ( temp mediump 2-component vector of int)
 0:211          'inf' ( smooth in mediump 2-component vector of float)
 0:212      textureGatherOffsets ( global highp 4-component vector of float)
 0:212        direct index ( temp highp sampler2D)
@@ -507,7 +507,7 @@
 0:221        Constant:
 0:221          0.100000
 0:221          0.100000
-0:221        Convert float to int ( temp highp 2-component vector of int)
+0:221        Convert float to int ( temp mediump 2-component vector of int)
 0:221          'inf' ( smooth in mediump 2-component vector of float)
 0:222      textureGatherOffsets ( global highp 4-component vector of float)
 0:222        direct index ( temp highp sampler2D)
diff --git a/third_party/vulkan-deps/glslang/src/Test/baseResults/310.vert.out b/third_party/vulkan-deps/glslang/src/Test/baseResults/310.vert.out
index 1d2152d..13a88df 100644
--- a/third_party/vulkan-deps/glslang/src/Test/baseResults/310.vert.out
+++ b/third_party/vulkan-deps/glslang/src/Test/baseResults/310.vert.out
@@ -330,7 +330,7 @@
 0:164          'sIndex' ( uniform highp int)
 0:164          Constant:
 0:164            2 (const int)
-0:165      textureGatherOffset ( global lowp 4-component vector of float)
+0:165      textureGatherOffset ( global lowp 4-component vector of float, operation at highp)
 0:165        direct index ( temp lowp sampler2D)
 0:165          'sArray' ( uniform 4-element array of lowp sampler2D)
 0:165          Constant:
@@ -338,7 +338,7 @@
 0:165        Constant:
 0:165          0.100000
 0:165          0.100000
-0:165        Convert float to int ( temp lowp 2-component vector of int)
+0:165        Convert float to int ( temp highp 2-component vector of int)
 0:165          'inf' ( in highp 2-component vector of float)
 0:166      textureGatherOffsets ( global lowp 4-component vector of float, operation at highp)
 0:166        direct index ( temp lowp sampler2D)
@@ -394,7 +394,7 @@
 0:179          'sIndex' ( uniform highp int)
 0:179          Constant:
 0:179            2 (const int)
-0:180      textureGatherOffset ( global lowp 4-component vector of float)
+0:180      textureGatherOffset ( global lowp 4-component vector of float, operation at highp)
 0:180        direct index ( temp lowp sampler2D)
 0:180          'sArray' ( uniform 4-element array of lowp sampler2D)
 0:180          Constant:
@@ -402,7 +402,7 @@
 0:180        Constant:
 0:180          0.100000
 0:180          0.100000
-0:180        Convert float to int ( temp lowp 2-component vector of int)
+0:180        Convert float to int ( temp highp 2-component vector of int)
 0:180          'inf' ( in highp 2-component vector of float)
 0:181      textureGatherOffsets ( global lowp 4-component vector of float, operation at highp)
 0:181        direct index ( temp lowp sampler2D)
diff --git a/third_party/vulkan-deps/glslang/src/Test/baseResults/320.frag.out b/third_party/vulkan-deps/glslang/src/Test/baseResults/320.frag.out
index 002aa7f..9f4a817 100644
--- a/third_party/vulkan-deps/glslang/src/Test/baseResults/320.frag.out
+++ b/third_party/vulkan-deps/glslang/src/Test/baseResults/320.frag.out
@@ -121,7 +121,7 @@
 0:76          'inf' ( smooth in mediump 2-component vector of float)
 0:76          'ing' ( smooth in mediump 2-component vector of float)
 0:76          'h' ( noContraction temp mediump 2-component vector of float)
-0:77      textureGatherOffset ( global lowp 4-component vector of float)
+0:77      textureGatherOffset ( global lowp 4-component vector of float, operation at mediump)
 0:77        direct index ( temp lowp sampler2D)
 0:77          'sArray' ( uniform 4-element array of lowp sampler2D)
 0:77          Constant:
@@ -129,7 +129,7 @@
 0:77        Constant:
 0:77          0.100000
 0:77          0.100000
-0:77        Convert float to int ( temp lowp 2-component vector of int)
+0:77        Convert float to int ( temp mediump 2-component vector of int)
 0:77          'inf' ( smooth in mediump 2-component vector of float)
 0:78      textureGatherOffsets ( global lowp 4-component vector of float, operation at mediump)
 0:78        direct index ( temp lowp sampler2D)
diff --git a/third_party/vulkan-deps/glslang/src/Test/baseResults/320.vert.out b/third_party/vulkan-deps/glslang/src/Test/baseResults/320.vert.out
index 0313b61..5e80d14 100644
--- a/third_party/vulkan-deps/glslang/src/Test/baseResults/320.vert.out
+++ b/third_party/vulkan-deps/glslang/src/Test/baseResults/320.vert.out
@@ -99,7 +99,7 @@
 0:70          'sIndex' ( uniform highp int)
 0:70          Constant:
 0:70            2 (const int)
-0:71      textureGatherOffset ( global lowp 4-component vector of float)
+0:71      textureGatherOffset ( global lowp 4-component vector of float, operation at highp)
 0:71        direct index ( temp lowp sampler2D)
 0:71          'sArray' ( uniform 4-element array of lowp sampler2D)
 0:71          Constant:
@@ -107,7 +107,7 @@
 0:71        Constant:
 0:71          0.100000
 0:71          0.100000
-0:71        Convert float to int ( temp lowp 2-component vector of int)
+0:71        Convert float to int ( temp highp 2-component vector of int)
 0:71          'inf' ( in highp 2-component vector of float)
 0:72      textureGatherOffsets ( global lowp 4-component vector of float, operation at highp)
 0:72        direct index ( temp lowp sampler2D)
diff --git a/third_party/vulkan-deps/glslang/src/Test/baseResults/GL_ARB_gpu_shader5.u2i.vert.out b/third_party/vulkan-deps/glslang/src/Test/baseResults/GL_ARB_gpu_shader5.u2i.vert.out
new file mode 100644
index 0000000..c7b3455
--- /dev/null
+++ b/third_party/vulkan-deps/glslang/src/Test/baseResults/GL_ARB_gpu_shader5.u2i.vert.out
@@ -0,0 +1,57 @@
+GL_ARB_gpu_shader5.u2i.vert
+WARNING: 0:2: '#extension' : extension is only partially supported: GL_ARB_gpu_shader5
+
+Shader version: 150
+Requested GL_ARB_gpu_shader5
+0:? Sequence
+0:7  Function Definition: main( ( global void)
+0:7    Function Parameters: 
+0:9    Sequence
+0:9      Sequence
+0:9        move second child to first child ( temp uint)
+0:9          'v' ( temp uint)
+0:9          Constant:
+0:9            0 (const uint)
+0:10      move second child to first child ( temp uint)
+0:10        'v' ( temp uint)
+0:10        subtract ( temp uint)
+0:10          Convert int to uint ( temp uint)
+0:10            'u2' ( uniform int)
+0:10          Convert int to uint ( temp uint)
+0:10            'u1' ( uniform int)
+0:?   Linker Objects
+0:?     'u1' ( uniform int)
+0:?     'u2' ( uniform int)
+0:?     'result' ( smooth out 4-component vector of float)
+0:?     'gl_VertexID' ( gl_VertexId int VertexId)
+0:?     'gl_InstanceID' ( gl_InstanceId int InstanceId)
+
+
+Linked vertex stage:
+
+
+Shader version: 150
+Requested GL_ARB_gpu_shader5
+0:? Sequence
+0:7  Function Definition: main( ( global void)
+0:7    Function Parameters: 
+0:9    Sequence
+0:9      Sequence
+0:9        move second child to first child ( temp uint)
+0:9          'v' ( temp uint)
+0:9          Constant:
+0:9            0 (const uint)
+0:10      move second child to first child ( temp uint)
+0:10        'v' ( temp uint)
+0:10        subtract ( temp uint)
+0:10          Convert int to uint ( temp uint)
+0:10            'u2' ( uniform int)
+0:10          Convert int to uint ( temp uint)
+0:10            'u1' ( uniform int)
+0:?   Linker Objects
+0:?     'u1' ( uniform int)
+0:?     'u2' ( uniform int)
+0:?     'result' ( smooth out 4-component vector of float)
+0:?     'gl_VertexID' ( gl_VertexId int VertexId)
+0:?     'gl_InstanceID' ( gl_InstanceId int InstanceId)
+
diff --git a/third_party/vulkan-deps/glslang/src/Test/baseResults/atomicAdd.comp.out b/third_party/vulkan-deps/glslang/src/Test/baseResults/atomicAdd.comp.out
new file mode 100644
index 0000000..6752a71
--- /dev/null
+++ b/third_party/vulkan-deps/glslang/src/Test/baseResults/atomicAdd.comp.out
@@ -0,0 +1,87 @@
+atomicAdd.comp
+ERROR: 0:18: 'atomicAdd' : Atomic memory function can only be used for shader storage block member or shared variable. 
+ERROR: 1 compilation errors.  No code generated.
+
+
+Shader version: 320
+local_size = (1, 1, 1)
+ERROR: node is still EOpNull!
+0:15  Function Definition: main( ( global void)
+0:15    Function Parameters: 
+0:16    Sequence
+0:16      AtomicAdd ( global highp int)
+0:16        x: direct index for structure (layout( column_major shared) coherent buffer highp int)
+0:16          'anon@0' (layout( column_major shared) coherent buffer block{layout( column_major shared) coherent buffer highp int x})
+0:16          Constant:
+0:16            0 (const uint)
+0:16        Constant:
+0:16          1 (const int)
+0:17      AtomicAdd ( global highp int)
+0:17        direct index (layout( std430) temp highp int)
+0:17          y: direct index for structure (layout( std430) global 3-element array of highp int)
+0:17            f: direct index for structure (layout( column_major std430 offset=0) buffer structure{layout( std430) global 3-element array of highp int y})
+0:17              't' (layout( column_major std430) buffer block{layout( column_major std430 offset=0) buffer structure{layout( std430) global 3-element array of highp int y} f})
+0:17              Constant:
+0:17                0 (const int)
+0:17            Constant:
+0:17              0 (const int)
+0:17          Constant:
+0:17            1 (const int)
+0:17        Constant:
+0:17          1 (const int)
+0:18      AtomicAdd ( global highp int)
+0:18        'z' ( global highp int)
+0:18        Constant:
+0:18          1 (const int)
+0:?   Linker Objects
+0:?     'gl_WorkGroupSize' ( const highp 3-component vector of uint WorkGroupSize)
+0:?       1 (const uint)
+0:?       1 (const uint)
+0:?       1 (const uint)
+0:?     't' (layout( column_major std430) buffer block{layout( column_major std430 offset=0) buffer structure{layout( std430) global 3-element array of highp int y} f})
+0:?     'anon@0' (layout( column_major shared) coherent buffer block{layout( column_major shared) coherent buffer highp int x})
+0:?     'z' ( global highp int)
+
+
+Linked compute stage:
+
+
+Shader version: 320
+local_size = (1, 1, 1)
+ERROR: node is still EOpNull!
+0:15  Function Definition: main( ( global void)
+0:15    Function Parameters: 
+0:16    Sequence
+0:16      AtomicAdd ( global highp int)
+0:16        x: direct index for structure (layout( column_major shared) coherent buffer highp int)
+0:16          'anon@0' (layout( column_major shared) coherent buffer block{layout( column_major shared) coherent buffer highp int x})
+0:16          Constant:
+0:16            0 (const uint)
+0:16        Constant:
+0:16          1 (const int)
+0:17      AtomicAdd ( global highp int)
+0:17        direct index (layout( std430) temp highp int)
+0:17          y: direct index for structure (layout( std430) global 3-element array of highp int)
+0:17            f: direct index for structure (layout( column_major std430 offset=0) buffer structure{layout( std430) global 3-element array of highp int y})
+0:17              't' (layout( column_major std430) buffer block{layout( column_major std430 offset=0) buffer structure{layout( std430) global 3-element array of highp int y} f})
+0:17              Constant:
+0:17                0 (const int)
+0:17            Constant:
+0:17              0 (const int)
+0:17          Constant:
+0:17            1 (const int)
+0:17        Constant:
+0:17          1 (const int)
+0:18      AtomicAdd ( global highp int)
+0:18        'z' ( global highp int)
+0:18        Constant:
+0:18          1 (const int)
+0:?   Linker Objects
+0:?     'gl_WorkGroupSize' ( const highp 3-component vector of uint WorkGroupSize)
+0:?       1 (const uint)
+0:?       1 (const uint)
+0:?       1 (const uint)
+0:?     't' (layout( column_major std430) buffer block{layout( column_major std430 offset=0) buffer structure{layout( std430) global 3-element array of highp int y} f})
+0:?     'anon@0' (layout( column_major shared) coherent buffer block{layout( column_major shared) coherent buffer highp int x})
+0:?     'z' ( global highp int)
+
diff --git a/third_party/vulkan-deps/glslang/src/Test/baseResults/atomicCounterARBOps.vert.out b/third_party/vulkan-deps/glslang/src/Test/baseResults/atomicCounterARBOps.vert.out
new file mode 100644
index 0000000..ebb4411
--- /dev/null
+++ b/third_party/vulkan-deps/glslang/src/Test/baseResults/atomicCounterARBOps.vert.out
@@ -0,0 +1,201 @@
+atomicCounterARBOps.vert
+Shader version: 450
+Requested GL_ARB_shader_atomic_counter_ops
+Requested GL_ARB_shader_atomic_counters
+0:? Sequence
+0:9  Function Definition: main( ( global void)
+0:9    Function Parameters: 
+0:10    Sequence
+0:10      Sequence
+0:10        move second child to first child ( temp 4-component vector of float)
+0:10          'outColor' ( temp 4-component vector of float)
+0:10          Constant:
+0:10            1.000000
+0:10            1.000000
+0:10            1.000000
+0:10            1.000000
+0:13      move second child to first child ( temp uint)
+0:13        'ret' ( temp uint)
+0:13        AtomicCounterAdd ( global uint)
+0:13          'counter' (layout( binding=0 offset=0) uniform atomic_uint)
+0:13          Constant:
+0:13            4 (const uint)
+0:14      move second child to first child ( temp uint)
+0:14        'ret' ( temp uint)
+0:14        AtomicCounterSubtract ( global uint)
+0:14          'counter' (layout( binding=0 offset=0) uniform atomic_uint)
+0:14          Constant:
+0:14            4 (const uint)
+0:15      move second child to first child ( temp uint)
+0:15        'ret' ( temp uint)
+0:15        AtomicCounterMin ( global uint)
+0:15          'counter' (layout( binding=0 offset=0) uniform atomic_uint)
+0:15          Constant:
+0:15            4 (const uint)
+0:16      move second child to first child ( temp uint)
+0:16        'ret' ( temp uint)
+0:16        AtomicCounterMax ( global uint)
+0:16          'counter' (layout( binding=0 offset=0) uniform atomic_uint)
+0:16          Constant:
+0:16            4 (const uint)
+0:17      move second child to first child ( temp uint)
+0:17        'ret' ( temp uint)
+0:17        AtomicCounterAnd ( global uint)
+0:17          'counter' (layout( binding=0 offset=0) uniform atomic_uint)
+0:17          Constant:
+0:17            4 (const uint)
+0:18      move second child to first child ( temp uint)
+0:18        'ret' ( temp uint)
+0:18        AtomicCounterOr ( global uint)
+0:18          'counter' (layout( binding=0 offset=0) uniform atomic_uint)
+0:18          Constant:
+0:18            4 (const uint)
+0:19      move second child to first child ( temp uint)
+0:19        'ret' ( temp uint)
+0:19        AtomicCounterXor ( global uint)
+0:19          'counter' (layout( binding=0 offset=0) uniform atomic_uint)
+0:19          Constant:
+0:19            4 (const uint)
+0:20      move second child to first child ( temp uint)
+0:20        'ret' ( temp uint)
+0:20        AtomicCounterExchange ( global uint)
+0:20          'counter' (layout( binding=0 offset=0) uniform atomic_uint)
+0:20          Constant:
+0:20            4 (const uint)
+0:21      move second child to first child ( temp uint)
+0:21        'ret' ( temp uint)
+0:21        AtomicCounterCompSwap ( global uint)
+0:21          'counter' (layout( binding=0 offset=0) uniform atomic_uint)
+0:21          Constant:
+0:21            4 (const uint)
+0:21          Constant:
+0:21            4 (const uint)
+0:23      Sequence
+0:23        move second child to first child ( temp uint)
+0:23          'after' ( temp uint)
+0:23          AtomicCounter ( global uint)
+0:23            'counter' (layout( binding=0 offset=0) uniform atomic_uint)
+0:24      Test condition and select ( temp void)
+0:24        Condition
+0:24        Compare Equal ( temp bool)
+0:24          'after' ( temp uint)
+0:24          'ret' ( temp uint)
+0:24        true case
+0:25        move second child to first child ( temp 4-component vector of float)
+0:25          'outColor' ( temp 4-component vector of float)
+0:25          Constant:
+0:25            0.000000
+0:25            0.000000
+0:25            0.000000
+0:25            0.000000
+0:27      move second child to first child ( temp 4-component vector of float)
+0:27        'vsColor' ( smooth out 4-component vector of float)
+0:27        'outColor' ( temp 4-component vector of float)
+0:?   Linker Objects
+0:?     'counter' (layout( binding=0 offset=0) uniform atomic_uint)
+0:?     'vsColor' ( smooth out 4-component vector of float)
+0:?     'gl_VertexID' ( gl_VertexId int VertexId)
+0:?     'gl_InstanceID' ( gl_InstanceId int InstanceId)
+
+
+Linked vertex stage:
+
+
+Shader version: 450
+Requested GL_ARB_shader_atomic_counter_ops
+Requested GL_ARB_shader_atomic_counters
+0:? Sequence
+0:9  Function Definition: main( ( global void)
+0:9    Function Parameters: 
+0:10    Sequence
+0:10      Sequence
+0:10        move second child to first child ( temp 4-component vector of float)
+0:10          'outColor' ( temp 4-component vector of float)
+0:10          Constant:
+0:10            1.000000
+0:10            1.000000
+0:10            1.000000
+0:10            1.000000
+0:13      move second child to first child ( temp uint)
+0:13        'ret' ( temp uint)
+0:13        AtomicCounterAdd ( global uint)
+0:13          'counter' (layout( binding=0 offset=0) uniform atomic_uint)
+0:13          Constant:
+0:13            4 (const uint)
+0:14      move second child to first child ( temp uint)
+0:14        'ret' ( temp uint)
+0:14        AtomicCounterSubtract ( global uint)
+0:14          'counter' (layout( binding=0 offset=0) uniform atomic_uint)
+0:14          Constant:
+0:14            4 (const uint)
+0:15      move second child to first child ( temp uint)
+0:15        'ret' ( temp uint)
+0:15        AtomicCounterMin ( global uint)
+0:15          'counter' (layout( binding=0 offset=0) uniform atomic_uint)
+0:15          Constant:
+0:15            4 (const uint)
+0:16      move second child to first child ( temp uint)
+0:16        'ret' ( temp uint)
+0:16        AtomicCounterMax ( global uint)
+0:16          'counter' (layout( binding=0 offset=0) uniform atomic_uint)
+0:16          Constant:
+0:16            4 (const uint)
+0:17      move second child to first child ( temp uint)
+0:17        'ret' ( temp uint)
+0:17        AtomicCounterAnd ( global uint)
+0:17          'counter' (layout( binding=0 offset=0) uniform atomic_uint)
+0:17          Constant:
+0:17            4 (const uint)
+0:18      move second child to first child ( temp uint)
+0:18        'ret' ( temp uint)
+0:18        AtomicCounterOr ( global uint)
+0:18          'counter' (layout( binding=0 offset=0) uniform atomic_uint)
+0:18          Constant:
+0:18            4 (const uint)
+0:19      move second child to first child ( temp uint)
+0:19        'ret' ( temp uint)
+0:19        AtomicCounterXor ( global uint)
+0:19          'counter' (layout( binding=0 offset=0) uniform atomic_uint)
+0:19          Constant:
+0:19            4 (const uint)
+0:20      move second child to first child ( temp uint)
+0:20        'ret' ( temp uint)
+0:20        AtomicCounterExchange ( global uint)
+0:20          'counter' (layout( binding=0 offset=0) uniform atomic_uint)
+0:20          Constant:
+0:20            4 (const uint)
+0:21      move second child to first child ( temp uint)
+0:21        'ret' ( temp uint)
+0:21        AtomicCounterCompSwap ( global uint)
+0:21          'counter' (layout( binding=0 offset=0) uniform atomic_uint)
+0:21          Constant:
+0:21            4 (const uint)
+0:21          Constant:
+0:21            4 (const uint)
+0:23      Sequence
+0:23        move second child to first child ( temp uint)
+0:23          'after' ( temp uint)
+0:23          AtomicCounter ( global uint)
+0:23            'counter' (layout( binding=0 offset=0) uniform atomic_uint)
+0:24      Test condition and select ( temp void)
+0:24        Condition
+0:24        Compare Equal ( temp bool)
+0:24          'after' ( temp uint)
+0:24          'ret' ( temp uint)
+0:24        true case
+0:25        move second child to first child ( temp 4-component vector of float)
+0:25          'outColor' ( temp 4-component vector of float)
+0:25          Constant:
+0:25            0.000000
+0:25            0.000000
+0:25            0.000000
+0:25            0.000000
+0:27      move second child to first child ( temp 4-component vector of float)
+0:27        'vsColor' ( smooth out 4-component vector of float)
+0:27        'outColor' ( temp 4-component vector of float)
+0:?   Linker Objects
+0:?     'counter' (layout( binding=0 offset=0) uniform atomic_uint)
+0:?     'vsColor' ( smooth out 4-component vector of float)
+0:?     'gl_VertexID' ( gl_VertexId int VertexId)
+0:?     'gl_InstanceID' ( gl_InstanceId int InstanceId)
+
diff --git a/third_party/vulkan-deps/glslang/src/Test/baseResults/glsl.es320.subgroup.geom.out b/third_party/vulkan-deps/glslang/src/Test/baseResults/glsl.es320.subgroup.geom.out
index 5d18d30..eab5454 100644
--- a/third_party/vulkan-deps/glslang/src/Test/baseResults/glsl.es320.subgroup.geom.out
+++ b/third_party/vulkan-deps/glslang/src/Test/baseResults/glsl.es320.subgroup.geom.out
@@ -16,7 +16,7 @@
 0:12            Constant:
 0:12              0 (const uint)
 0:12          'gl_PrimitiveIDIn' ( in highp int PrimitiveID)
-0:12        Construct uvec4 ( temp highp 4-component vector of uint)
+0:12        Construct uvec4 ( temp mediump 4-component vector of uint)
 0:12          'gl_SubgroupSize' ( in mediump uint SubgroupSize)
 0:12          'gl_SubgroupInvocationID' ( in mediump uint SubgroupInvocationID)
 0:12          Constant:
@@ -47,7 +47,7 @@
 0:12            Constant:
 0:12              0 (const uint)
 0:12          'gl_PrimitiveIDIn' ( in highp int PrimitiveID)
-0:12        Construct uvec4 ( temp highp 4-component vector of uint)
+0:12        Construct uvec4 ( temp mediump 4-component vector of uint)
 0:12          'gl_SubgroupSize' ( in mediump uint SubgroupSize)
 0:12          'gl_SubgroupInvocationID' ( in mediump uint SubgroupInvocationID)
 0:12          Constant:
diff --git a/third_party/vulkan-deps/glslang/src/Test/baseResults/glsl.es320.subgroup.tesc.out b/third_party/vulkan-deps/glslang/src/Test/baseResults/glsl.es320.subgroup.tesc.out
index 9512bc5..431a3c3 100644
--- a/third_party/vulkan-deps/glslang/src/Test/baseResults/glsl.es320.subgroup.tesc.out
+++ b/third_party/vulkan-deps/glslang/src/Test/baseResults/glsl.es320.subgroup.tesc.out
@@ -13,7 +13,7 @@
 0:11            Constant:
 0:11              0 (const uint)
 0:11          'gl_PrimitiveID' ( in highp int PrimitiveID)
-0:11        Construct uvec4 ( temp highp 4-component vector of uint)
+0:11        Construct uvec4 ( temp mediump 4-component vector of uint)
 0:11          'gl_SubgroupSize' ( in mediump uint SubgroupSize)
 0:11          'gl_SubgroupInvocationID' ( in mediump uint SubgroupInvocationID)
 0:11          Constant:
@@ -41,7 +41,7 @@
 0:11            Constant:
 0:11              0 (const uint)
 0:11          'gl_PrimitiveID' ( in highp int PrimitiveID)
-0:11        Construct uvec4 ( temp highp 4-component vector of uint)
+0:11        Construct uvec4 ( temp mediump 4-component vector of uint)
 0:11          'gl_SubgroupSize' ( in mediump uint SubgroupSize)
 0:11          'gl_SubgroupInvocationID' ( in mediump uint SubgroupInvocationID)
 0:11          Constant:
diff --git a/third_party/vulkan-deps/glslang/src/Test/baseResults/glsl.es320.subgroup.tese.out b/third_party/vulkan-deps/glslang/src/Test/baseResults/glsl.es320.subgroup.tese.out
index 29f7b73..198a757 100644
--- a/third_party/vulkan-deps/glslang/src/Test/baseResults/glsl.es320.subgroup.tese.out
+++ b/third_party/vulkan-deps/glslang/src/Test/baseResults/glsl.es320.subgroup.tese.out
@@ -15,7 +15,7 @@
 0:11            Constant:
 0:11              0 (const uint)
 0:11          'gl_PrimitiveID' ( in highp int PrimitiveID)
-0:11        Construct uvec4 ( temp highp 4-component vector of uint)
+0:11        Construct uvec4 ( temp mediump 4-component vector of uint)
 0:11          'gl_SubgroupSize' ( in mediump uint SubgroupSize)
 0:11          'gl_SubgroupInvocationID' ( in mediump uint SubgroupInvocationID)
 0:11          Constant:
@@ -45,7 +45,7 @@
 0:11            Constant:
 0:11              0 (const uint)
 0:11          'gl_PrimitiveID' ( in highp int PrimitiveID)
-0:11        Construct uvec4 ( temp highp 4-component vector of uint)
+0:11        Construct uvec4 ( temp mediump 4-component vector of uint)
 0:11          'gl_SubgroupSize' ( in mediump uint SubgroupSize)
 0:11          'gl_SubgroupInvocationID' ( in mediump uint SubgroupInvocationID)
 0:11          Constant:
diff --git a/third_party/vulkan-deps/glslang/src/Test/baseResults/glsl.es320.subgroup.vert.out b/third_party/vulkan-deps/glslang/src/Test/baseResults/glsl.es320.subgroup.vert.out
index bf1da49..e1a6bea 100644
--- a/third_party/vulkan-deps/glslang/src/Test/baseResults/glsl.es320.subgroup.vert.out
+++ b/third_party/vulkan-deps/glslang/src/Test/baseResults/glsl.es320.subgroup.vert.out
@@ -12,7 +12,7 @@
 0:10            Constant:
 0:10              0 (const uint)
 0:10          'gl_VertexID' ( gl_VertexId highp int VertexId)
-0:10        Construct uvec4 ( temp highp 4-component vector of uint)
+0:10        Construct uvec4 ( temp mediump 4-component vector of uint)
 0:10          'gl_SubgroupSize' ( in mediump uint SubgroupSize)
 0:10          'gl_SubgroupInvocationID' ( in mediump uint SubgroupInvocationID)
 0:10          Constant:
@@ -41,7 +41,7 @@
 0:10            Constant:
 0:10              0 (const uint)
 0:10          'gl_VertexID' ( gl_VertexId highp int VertexId)
-0:10        Construct uvec4 ( temp highp 4-component vector of uint)
+0:10        Construct uvec4 ( temp mediump 4-component vector of uint)
 0:10          'gl_SubgroupSize' ( in mediump uint SubgroupSize)
 0:10          'gl_SubgroupInvocationID' ( in mediump uint SubgroupInvocationID)
 0:10          Constant:
diff --git a/third_party/vulkan-deps/glslang/src/Test/baseResults/hlsl.imagefetch-subvec4.comp.out b/third_party/vulkan-deps/glslang/src/Test/baseResults/hlsl.imagefetch-subvec4.comp.out
index a12c59f..ff201eb 100644
--- a/third_party/vulkan-deps/glslang/src/Test/baseResults/hlsl.imagefetch-subvec4.comp.out
+++ b/third_party/vulkan-deps/glslang/src/Test/baseResults/hlsl.imagefetch-subvec4.comp.out
@@ -2,35 +2,204 @@
 Shader version: 500
 local_size = (8, 8, 8)
 0:? Sequence
-0:6  Function Definition: @main(vu3; ( temp void)
-0:6    Function Parameters: 
-0:6      'tid' ( in 3-component vector of uint)
+0:21  Function Definition: @main(vu3; ( temp void)
+0:21    Function Parameters: 
+0:21      'tid' ( in 3-component vector of uint)
 0:?     Sequence
-0:7      Sequence
-0:7        move second child to first child ( temp uint)
-0:7          'storeTemp' ( temp uint)
-0:7          Convert int to uint ( temp uint)
-0:7            textureFetch ( temp int)
-0:7              'IN' (layout( binding=0) uniform itexture3D)
-0:7              'tid' ( in 3-component vector of uint)
-0:7              Constant:
-0:7                0 (const int)
-0:7        imageStore ( temp void)
-0:7          'OUT' (layout( binding=1 r32ui) uniform uimage3D)
-0:7          'tid' ( in 3-component vector of uint)
-0:7          'storeTemp' ( temp uint)
-0:7        'storeTemp' ( temp uint)
-0:6  Function Definition: main( ( temp void)
-0:6    Function Parameters: 
+0:22      Sequence
+0:22        move second child to first child ( temp float)
+0:22          'f' ( temp float)
+0:22          Constant:
+0:22            0.000000
+0:23      add second child into first child ( temp float)
+0:23        'f' ( temp float)
+0:23        textureFetch ( temp float)
+0:23          'i1D' (layout( binding=0) uniform texture1D)
+0:23          direct index ( temp uint)
+0:23            'tid' ( in 3-component vector of uint)
+0:23            Constant:
+0:23              0 (const int)
+0:23          Constant:
+0:23            0 (const int)
+0:24      add second child into first child ( temp float)
+0:24        'f' ( temp float)
+0:24        textureFetch ( temp float)
+0:24          'i2D' (layout( binding=1) uniform texture2D)
+0:24          vector swizzle ( temp 2-component vector of uint)
+0:24            'tid' ( in 3-component vector of uint)
+0:24            Sequence
+0:24              Constant:
+0:24                0 (const int)
+0:24              Constant:
+0:24                1 (const int)
+0:24          Constant:
+0:24            0 (const int)
+0:25      add second child into first child ( temp float)
+0:25        'f' ( temp float)
+0:25        textureFetch ( temp float)
+0:25          'i3D' (layout( binding=2) uniform texture3D)
+0:25          'tid' ( in 3-component vector of uint)
+0:25          Constant:
+0:25            0 (const int)
+0:26      add second child into first child ( temp float)
+0:26        'f' ( temp float)
+0:26        textureFetch ( temp float)
+0:26          'i1DArray' (layout( binding=3) uniform texture1DArray)
+0:26          vector swizzle ( temp 2-component vector of uint)
+0:26            'tid' ( in 3-component vector of uint)
+0:26            Sequence
+0:26              Constant:
+0:26                0 (const int)
+0:26              Constant:
+0:26                1 (const int)
+0:26          Constant:
+0:26            0 (const int)
+0:27      add second child into first child ( temp float)
+0:27        'f' ( temp float)
+0:27        textureFetch ( temp float)
+0:27          'i2DArray' (layout( binding=4) uniform texture2DArray)
+0:27          'tid' ( in 3-component vector of uint)
+0:27          Constant:
+0:27            0 (const int)
+0:28      add second child into first child ( temp float)
+0:28        'f' ( temp float)
+0:28        Construct float ( temp float)
+0:?           textureFetch ( temp 4-component vector of float)
+0:28            'i2DMS' (layout( binding=5) uniform texture2DMS)
+0:28            Convert uint to int ( temp 2-component vector of int)
+0:28              vector swizzle ( temp 2-component vector of uint)
+0:28                'tid' ( in 3-component vector of uint)
+0:28                Sequence
+0:28                  Constant:
+0:28                    0 (const int)
+0:28                  Constant:
+0:28                    1 (const int)
+0:28            Constant:
+0:28              1 (const int)
+0:29      add second child into first child ( temp float)
+0:29        'f' ( temp float)
+0:29        Construct float ( temp float)
+0:?           textureFetch ( temp 4-component vector of float)
+0:29            'i2DMSArray' (layout( binding=6) uniform texture2DMSArray)
+0:29            Convert uint to int ( temp 3-component vector of int)
+0:29              'tid' ( in 3-component vector of uint)
+0:29            Constant:
+0:29              3 (const int)
+0:31      Sequence
+0:31        move second child to first child ( temp int)
+0:31          'i' ( temp int)
+0:31          Constant:
+0:31            0 (const int)
+0:32      add second child into first child ( temp int)
+0:32        'i' ( temp int)
+0:32        textureFetch ( temp int)
+0:32          'ii1D' (layout( binding=7) uniform itexture1D)
+0:32          direct index ( temp uint)
+0:32            'tid' ( in 3-component vector of uint)
+0:32            Constant:
+0:32              0 (const int)
+0:32          Constant:
+0:32            0 (const int)
+0:33      add second child into first child ( temp int)
+0:33        'i' ( temp int)
+0:33        textureFetch ( temp int)
+0:33          'ii2D' (layout( binding=8) uniform itexture2D)
+0:33          vector swizzle ( temp 2-component vector of uint)
+0:33            'tid' ( in 3-component vector of uint)
+0:33            Sequence
+0:33              Constant:
+0:33                0 (const int)
+0:33              Constant:
+0:33                1 (const int)
+0:33          Constant:
+0:33            0 (const int)
+0:34      add second child into first child ( temp int)
+0:34        'i' ( temp int)
+0:34        textureFetch ( temp int)
+0:34          'ii3D' (layout( binding=9) uniform itexture3D)
+0:34          'tid' ( in 3-component vector of uint)
+0:34          Constant:
+0:34            0 (const int)
+0:35      add second child into first child ( temp int)
+0:35        'i' ( temp int)
+0:35        textureFetch ( temp int)
+0:35          'ii1DArray' (layout( binding=10) uniform itexture1DArray)
+0:35          vector swizzle ( temp 2-component vector of uint)
+0:35            'tid' ( in 3-component vector of uint)
+0:35            Sequence
+0:35              Constant:
+0:35                0 (const int)
+0:35              Constant:
+0:35                1 (const int)
+0:35          Constant:
+0:35            0 (const int)
+0:36      add second child into first child ( temp int)
+0:36        'i' ( temp int)
+0:36        textureFetch ( temp int)
+0:36          'ii2DArray' (layout( binding=11) uniform itexture2DArray)
+0:36          'tid' ( in 3-component vector of uint)
+0:36          Constant:
+0:36            0 (const int)
+0:37      add second child into first child ( temp int)
+0:37        'i' ( temp int)
+0:37        Construct int ( temp int)
+0:?           textureFetch ( temp 4-component vector of int)
+0:37            'ii2DMS' (layout( binding=12) uniform itexture2DMS)
+0:37            Convert uint to int ( temp 2-component vector of int)
+0:37              vector swizzle ( temp 2-component vector of uint)
+0:37                'tid' ( in 3-component vector of uint)
+0:37                Sequence
+0:37                  Constant:
+0:37                    0 (const int)
+0:37                  Constant:
+0:37                    1 (const int)
+0:37            Constant:
+0:37              1 (const int)
+0:38      add second child into first child ( temp int)
+0:38        'i' ( temp int)
+0:38        Construct int ( temp int)
+0:?           textureFetch ( temp 4-component vector of int)
+0:38            'ii2DMSArray' (layout( binding=13) uniform itexture2DMSArray)
+0:38            Convert uint to int ( temp 3-component vector of int)
+0:38              'tid' ( in 3-component vector of uint)
+0:38            Constant:
+0:38              3 (const int)
+0:40      Sequence
+0:40        move second child to first child ( temp float)
+0:40          'storeTemp' ( temp float)
+0:40          add ( temp float)
+0:40            'f' ( temp float)
+0:40            Convert int to float ( temp float)
+0:40              'i' ( temp int)
+0:40        imageStore ( temp void)
+0:40          'OUT' (layout( binding=0 r32f) uniform image3D)
+0:40          'tid' ( in 3-component vector of uint)
+0:40          'storeTemp' ( temp float)
+0:40        'storeTemp' ( temp float)
+0:21  Function Definition: main( ( temp void)
+0:21    Function Parameters: 
 0:?     Sequence
-0:6      move second child to first child ( temp 3-component vector of uint)
+0:21      move second child to first child ( temp 3-component vector of uint)
 0:?         'tid' ( temp 3-component vector of uint)
 0:?         'tid' ( in 3-component vector of uint GlobalInvocationID)
-0:6      Function Call: @main(vu3; ( temp void)
+0:21      Function Call: @main(vu3; ( temp void)
 0:?         'tid' ( temp 3-component vector of uint)
 0:?   Linker Objects
-0:?     'IN' (layout( binding=0) uniform itexture3D)
-0:?     'OUT' (layout( binding=1 r32ui) uniform uimage3D)
+0:?     'i1D' (layout( binding=0) uniform texture1D)
+0:?     'i2D' (layout( binding=1) uniform texture2D)
+0:?     'i3D' (layout( binding=2) uniform texture3D)
+0:?     'i1DArray' (layout( binding=3) uniform texture1DArray)
+0:?     'i2DArray' (layout( binding=4) uniform texture2DArray)
+0:?     'i2DMS' (layout( binding=5) uniform texture2DMS)
+0:?     'i2DMSArray' (layout( binding=6) uniform texture2DMSArray)
+0:?     'ii1D' (layout( binding=7) uniform itexture1D)
+0:?     'ii2D' (layout( binding=8) uniform itexture2D)
+0:?     'ii3D' (layout( binding=9) uniform itexture3D)
+0:?     'ii1DArray' (layout( binding=10) uniform itexture1DArray)
+0:?     'ii2DArray' (layout( binding=11) uniform itexture2DArray)
+0:?     'ii2DMS' (layout( binding=12) uniform itexture2DMS)
+0:?     'ii2DMSArray' (layout( binding=13) uniform itexture2DMSArray)
+0:?     'OUT' (layout( binding=0 r32f) uniform image3D)
 0:?     'tid' ( in 3-component vector of uint GlobalInvocationID)
 
 
@@ -40,103 +209,477 @@
 Shader version: 500
 local_size = (8, 8, 8)
 0:? Sequence
-0:6  Function Definition: @main(vu3; ( temp void)
-0:6    Function Parameters: 
-0:6      'tid' ( in 3-component vector of uint)
+0:21  Function Definition: @main(vu3; ( temp void)
+0:21    Function Parameters: 
+0:21      'tid' ( in 3-component vector of uint)
 0:?     Sequence
-0:7      Sequence
-0:7        move second child to first child ( temp uint)
-0:7          'storeTemp' ( temp uint)
-0:7          Convert int to uint ( temp uint)
-0:7            textureFetch ( temp int)
-0:7              'IN' (layout( binding=0) uniform itexture3D)
-0:7              'tid' ( in 3-component vector of uint)
-0:7              Constant:
-0:7                0 (const int)
-0:7        imageStore ( temp void)
-0:7          'OUT' (layout( binding=1 r32ui) uniform uimage3D)
-0:7          'tid' ( in 3-component vector of uint)
-0:7          'storeTemp' ( temp uint)
-0:7        'storeTemp' ( temp uint)
-0:6  Function Definition: main( ( temp void)
-0:6    Function Parameters: 
+0:22      Sequence
+0:22        move second child to first child ( temp float)
+0:22          'f' ( temp float)
+0:22          Constant:
+0:22            0.000000
+0:23      add second child into first child ( temp float)
+0:23        'f' ( temp float)
+0:23        textureFetch ( temp float)
+0:23          'i1D' (layout( binding=0) uniform texture1D)
+0:23          direct index ( temp uint)
+0:23            'tid' ( in 3-component vector of uint)
+0:23            Constant:
+0:23              0 (const int)
+0:23          Constant:
+0:23            0 (const int)
+0:24      add second child into first child ( temp float)
+0:24        'f' ( temp float)
+0:24        textureFetch ( temp float)
+0:24          'i2D' (layout( binding=1) uniform texture2D)
+0:24          vector swizzle ( temp 2-component vector of uint)
+0:24            'tid' ( in 3-component vector of uint)
+0:24            Sequence
+0:24              Constant:
+0:24                0 (const int)
+0:24              Constant:
+0:24                1 (const int)
+0:24          Constant:
+0:24            0 (const int)
+0:25      add second child into first child ( temp float)
+0:25        'f' ( temp float)
+0:25        textureFetch ( temp float)
+0:25          'i3D' (layout( binding=2) uniform texture3D)
+0:25          'tid' ( in 3-component vector of uint)
+0:25          Constant:
+0:25            0 (const int)
+0:26      add second child into first child ( temp float)
+0:26        'f' ( temp float)
+0:26        textureFetch ( temp float)
+0:26          'i1DArray' (layout( binding=3) uniform texture1DArray)
+0:26          vector swizzle ( temp 2-component vector of uint)
+0:26            'tid' ( in 3-component vector of uint)
+0:26            Sequence
+0:26              Constant:
+0:26                0 (const int)
+0:26              Constant:
+0:26                1 (const int)
+0:26          Constant:
+0:26            0 (const int)
+0:27      add second child into first child ( temp float)
+0:27        'f' ( temp float)
+0:27        textureFetch ( temp float)
+0:27          'i2DArray' (layout( binding=4) uniform texture2DArray)
+0:27          'tid' ( in 3-component vector of uint)
+0:27          Constant:
+0:27            0 (const int)
+0:28      add second child into first child ( temp float)
+0:28        'f' ( temp float)
+0:28        Construct float ( temp float)
+0:?           textureFetch ( temp 4-component vector of float)
+0:28            'i2DMS' (layout( binding=5) uniform texture2DMS)
+0:28            Convert uint to int ( temp 2-component vector of int)
+0:28              vector swizzle ( temp 2-component vector of uint)
+0:28                'tid' ( in 3-component vector of uint)
+0:28                Sequence
+0:28                  Constant:
+0:28                    0 (const int)
+0:28                  Constant:
+0:28                    1 (const int)
+0:28            Constant:
+0:28              1 (const int)
+0:29      add second child into first child ( temp float)
+0:29        'f' ( temp float)
+0:29        Construct float ( temp float)
+0:?           textureFetch ( temp 4-component vector of float)
+0:29            'i2DMSArray' (layout( binding=6) uniform texture2DMSArray)
+0:29            Convert uint to int ( temp 3-component vector of int)
+0:29              'tid' ( in 3-component vector of uint)
+0:29            Constant:
+0:29              3 (const int)
+0:31      Sequence
+0:31        move second child to first child ( temp int)
+0:31          'i' ( temp int)
+0:31          Constant:
+0:31            0 (const int)
+0:32      add second child into first child ( temp int)
+0:32        'i' ( temp int)
+0:32        textureFetch ( temp int)
+0:32          'ii1D' (layout( binding=7) uniform itexture1D)
+0:32          direct index ( temp uint)
+0:32            'tid' ( in 3-component vector of uint)
+0:32            Constant:
+0:32              0 (const int)
+0:32          Constant:
+0:32            0 (const int)
+0:33      add second child into first child ( temp int)
+0:33        'i' ( temp int)
+0:33        textureFetch ( temp int)
+0:33          'ii2D' (layout( binding=8) uniform itexture2D)
+0:33          vector swizzle ( temp 2-component vector of uint)
+0:33            'tid' ( in 3-component vector of uint)
+0:33            Sequence
+0:33              Constant:
+0:33                0 (const int)
+0:33              Constant:
+0:33                1 (const int)
+0:33          Constant:
+0:33            0 (const int)
+0:34      add second child into first child ( temp int)
+0:34        'i' ( temp int)
+0:34        textureFetch ( temp int)
+0:34          'ii3D' (layout( binding=9) uniform itexture3D)
+0:34          'tid' ( in 3-component vector of uint)
+0:34          Constant:
+0:34            0 (const int)
+0:35      add second child into first child ( temp int)
+0:35        'i' ( temp int)
+0:35        textureFetch ( temp int)
+0:35          'ii1DArray' (layout( binding=10) uniform itexture1DArray)
+0:35          vector swizzle ( temp 2-component vector of uint)
+0:35            'tid' ( in 3-component vector of uint)
+0:35            Sequence
+0:35              Constant:
+0:35                0 (const int)
+0:35              Constant:
+0:35                1 (const int)
+0:35          Constant:
+0:35            0 (const int)
+0:36      add second child into first child ( temp int)
+0:36        'i' ( temp int)
+0:36        textureFetch ( temp int)
+0:36          'ii2DArray' (layout( binding=11) uniform itexture2DArray)
+0:36          'tid' ( in 3-component vector of uint)
+0:36          Constant:
+0:36            0 (const int)
+0:37      add second child into first child ( temp int)
+0:37        'i' ( temp int)
+0:37        Construct int ( temp int)
+0:?           textureFetch ( temp 4-component vector of int)
+0:37            'ii2DMS' (layout( binding=12) uniform itexture2DMS)
+0:37            Convert uint to int ( temp 2-component vector of int)
+0:37              vector swizzle ( temp 2-component vector of uint)
+0:37                'tid' ( in 3-component vector of uint)
+0:37                Sequence
+0:37                  Constant:
+0:37                    0 (const int)
+0:37                  Constant:
+0:37                    1 (const int)
+0:37            Constant:
+0:37              1 (const int)
+0:38      add second child into first child ( temp int)
+0:38        'i' ( temp int)
+0:38        Construct int ( temp int)
+0:?           textureFetch ( temp 4-component vector of int)
+0:38            'ii2DMSArray' (layout( binding=13) uniform itexture2DMSArray)
+0:38            Convert uint to int ( temp 3-component vector of int)
+0:38              'tid' ( in 3-component vector of uint)
+0:38            Constant:
+0:38              3 (const int)
+0:40      Sequence
+0:40        move second child to first child ( temp float)
+0:40          'storeTemp' ( temp float)
+0:40          add ( temp float)
+0:40            'f' ( temp float)
+0:40            Convert int to float ( temp float)
+0:40              'i' ( temp int)
+0:40        imageStore ( temp void)
+0:40          'OUT' (layout( binding=0 r32f) uniform image3D)
+0:40          'tid' ( in 3-component vector of uint)
+0:40          'storeTemp' ( temp float)
+0:40        'storeTemp' ( temp float)
+0:21  Function Definition: main( ( temp void)
+0:21    Function Parameters: 
 0:?     Sequence
-0:6      move second child to first child ( temp 3-component vector of uint)
+0:21      move second child to first child ( temp 3-component vector of uint)
 0:?         'tid' ( temp 3-component vector of uint)
 0:?         'tid' ( in 3-component vector of uint GlobalInvocationID)
-0:6      Function Call: @main(vu3; ( temp void)
+0:21      Function Call: @main(vu3; ( temp void)
 0:?         'tid' ( temp 3-component vector of uint)
 0:?   Linker Objects
-0:?     'IN' (layout( binding=0) uniform itexture3D)
-0:?     'OUT' (layout( binding=1 r32ui) uniform uimage3D)
+0:?     'i1D' (layout( binding=0) uniform texture1D)
+0:?     'i2D' (layout( binding=1) uniform texture2D)
+0:?     'i3D' (layout( binding=2) uniform texture3D)
+0:?     'i1DArray' (layout( binding=3) uniform texture1DArray)
+0:?     'i2DArray' (layout( binding=4) uniform texture2DArray)
+0:?     'i2DMS' (layout( binding=5) uniform texture2DMS)
+0:?     'i2DMSArray' (layout( binding=6) uniform texture2DMSArray)
+0:?     'ii1D' (layout( binding=7) uniform itexture1D)
+0:?     'ii2D' (layout( binding=8) uniform itexture2D)
+0:?     'ii3D' (layout( binding=9) uniform itexture3D)
+0:?     'ii1DArray' (layout( binding=10) uniform itexture1DArray)
+0:?     'ii2DArray' (layout( binding=11) uniform itexture2DArray)
+0:?     'ii2DMS' (layout( binding=12) uniform itexture2DMS)
+0:?     'ii2DMSArray' (layout( binding=13) uniform itexture2DMSArray)
+0:?     'OUT' (layout( binding=0 r32f) uniform image3D)
 0:?     'tid' ( in 3-component vector of uint GlobalInvocationID)
 
 // Module Version 10000
 // Generated by (magic number): 8000a
-// Id's are bound by 39
+// Id's are bound by 186
 
                               Capability Shader
+                              Capability Sampled1D
                1:             ExtInstImport  "GLSL.std.450"
                               MemoryModel Logical GLSL450
-                              EntryPoint GLCompute 4  "main" 34
+                              EntryPoint GLCompute 4  "main" 181
                               ExecutionMode 4 LocalSize 8 8 8
                               Source HLSL 500
                               Name 4  "main"
                               Name 11  "@main(vu3;"
                               Name 10  "tid"
-                              Name 14  "storeTemp"
-                              Name 18  "IN"
-                              Name 28  "OUT"
-                              Name 32  "tid"
-                              Name 34  "tid"
-                              Name 36  "param"
-                              Decorate 18(IN) DescriptorSet 0
-                              Decorate 18(IN) Binding 0
-                              Decorate 28(OUT) DescriptorSet 0
-                              Decorate 28(OUT) Binding 1
-                              Decorate 34(tid) BuiltIn GlobalInvocationId
+                              Name 15  "f"
+                              Name 19  "i1D"
+                              Name 34  "i2D"
+                              Name 45  "i3D"
+                              Name 54  "i1DArray"
+                              Name 64  "i2DArray"
+                              Name 73  "i2DMS"
+                              Name 86  "i2DMSArray"
+                              Name 97  "i"
+                              Name 100  "ii1D"
+                              Name 111  "ii2D"
+                              Name 121  "ii3D"
+                              Name 130  "ii1DArray"
+                              Name 140  "ii2DArray"
+                              Name 149  "ii2DMS"
+                              Name 160  "ii2DMSArray"
+                              Name 168  "storeTemp"
+                              Name 175  "OUT"
+                              Name 179  "tid"
+                              Name 181  "tid"
+                              Name 183  "param"
+                              Decorate 19(i1D) DescriptorSet 0
+                              Decorate 19(i1D) Binding 0
+                              Decorate 34(i2D) DescriptorSet 0
+                              Decorate 34(i2D) Binding 1
+                              Decorate 45(i3D) DescriptorSet 0
+                              Decorate 45(i3D) Binding 2
+                              Decorate 54(i1DArray) DescriptorSet 0
+                              Decorate 54(i1DArray) Binding 3
+                              Decorate 64(i2DArray) DescriptorSet 0
+                              Decorate 64(i2DArray) Binding 4
+                              Decorate 73(i2DMS) DescriptorSet 0
+                              Decorate 73(i2DMS) Binding 5
+                              Decorate 86(i2DMSArray) DescriptorSet 0
+                              Decorate 86(i2DMSArray) Binding 6
+                              Decorate 100(ii1D) DescriptorSet 0
+                              Decorate 100(ii1D) Binding 7
+                              Decorate 111(ii2D) DescriptorSet 0
+                              Decorate 111(ii2D) Binding 8
+                              Decorate 121(ii3D) DescriptorSet 0
+                              Decorate 121(ii3D) Binding 9
+                              Decorate 130(ii1DArray) DescriptorSet 0
+                              Decorate 130(ii1DArray) Binding 10
+                              Decorate 140(ii2DArray) DescriptorSet 0
+                              Decorate 140(ii2DArray) Binding 11
+                              Decorate 149(ii2DMS) DescriptorSet 0
+                              Decorate 149(ii2DMS) Binding 12
+                              Decorate 160(ii2DMSArray) DescriptorSet 0
+                              Decorate 160(ii2DMSArray) Binding 13
+                              Decorate 175(OUT) DescriptorSet 0
+                              Decorate 175(OUT) Binding 0
+                              Decorate 181(tid) BuiltIn GlobalInvocationId
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeInt 32 0
                7:             TypeVector 6(int) 3
                8:             TypePointer Function 7(ivec3)
                9:             TypeFunction 2 8(ptr)
-              13:             TypePointer Function 6(int)
-              15:             TypeInt 32 1
-              16:             TypeImage 15(int) 3D sampled format:Unknown
-              17:             TypePointer UniformConstant 16
-          18(IN):     17(ptr) Variable UniformConstant
-              21:     15(int) Constant 0
-              22:             TypeVector 15(int) 4
-              26:             TypeImage 6(int) 3D nonsampled format:R32ui
-              27:             TypePointer UniformConstant 26
-         28(OUT):     27(ptr) Variable UniformConstant
-              33:             TypePointer Input 7(ivec3)
-         34(tid):     33(ptr) Variable Input
+              13:             TypeFloat 32
+              14:             TypePointer Function 13(float)
+              16:   13(float) Constant 0
+              17:             TypeImage 13(float) 1D sampled format:Unknown
+              18:             TypePointer UniformConstant 17
+         19(i1D):     18(ptr) Variable UniformConstant
+              21:      6(int) Constant 0
+              22:             TypePointer Function 6(int)
+              25:             TypeInt 32 1
+              26:     25(int) Constant 0
+              27:             TypeVector 13(float) 4
+              32:             TypeImage 13(float) 2D sampled format:Unknown
+              33:             TypePointer UniformConstant 32
+         34(i2D):     33(ptr) Variable UniformConstant
+              36:             TypeVector 6(int) 2
+              43:             TypeImage 13(float) 3D sampled format:Unknown
+              44:             TypePointer UniformConstant 43
+         45(i3D):     44(ptr) Variable UniformConstant
+              52:             TypeImage 13(float) 1D array sampled format:Unknown
+              53:             TypePointer UniformConstant 52
+    54(i1DArray):     53(ptr) Variable UniformConstant
+              62:             TypeImage 13(float) 2D array sampled format:Unknown
+              63:             TypePointer UniformConstant 62
+    64(i2DArray):     63(ptr) Variable UniformConstant
+              71:             TypeImage 13(float) 2D multi-sampled sampled format:Unknown
+              72:             TypePointer UniformConstant 71
+       73(i2DMS):     72(ptr) Variable UniformConstant
+              77:             TypeVector 25(int) 2
+              79:     25(int) Constant 1
+              84:             TypeImage 13(float) 2D array multi-sampled sampled format:Unknown
+              85:             TypePointer UniformConstant 84
+  86(i2DMSArray):     85(ptr) Variable UniformConstant
+              89:             TypeVector 25(int) 3
+              91:     25(int) Constant 3
+              96:             TypePointer Function 25(int)
+              98:             TypeImage 25(int) 1D sampled format:Unknown
+              99:             TypePointer UniformConstant 98
+       100(ii1D):     99(ptr) Variable UniformConstant
+             104:             TypeVector 25(int) 4
+             109:             TypeImage 25(int) 2D sampled format:Unknown
+             110:             TypePointer UniformConstant 109
+       111(ii2D):    110(ptr) Variable UniformConstant
+             119:             TypeImage 25(int) 3D sampled format:Unknown
+             120:             TypePointer UniformConstant 119
+       121(ii3D):    120(ptr) Variable UniformConstant
+             128:             TypeImage 25(int) 1D array sampled format:Unknown
+             129:             TypePointer UniformConstant 128
+  130(ii1DArray):    129(ptr) Variable UniformConstant
+             138:             TypeImage 25(int) 2D array sampled format:Unknown
+             139:             TypePointer UniformConstant 138
+  140(ii2DArray):    139(ptr) Variable UniformConstant
+             147:             TypeImage 25(int) 2D multi-sampled sampled format:Unknown
+             148:             TypePointer UniformConstant 147
+     149(ii2DMS):    148(ptr) Variable UniformConstant
+             158:             TypeImage 25(int) 2D array multi-sampled sampled format:Unknown
+             159:             TypePointer UniformConstant 158
+160(ii2DMSArray):    159(ptr) Variable UniformConstant
+             173:             TypeImage 13(float) 3D nonsampled format:R32f
+             174:             TypePointer UniformConstant 173
+        175(OUT):    174(ptr) Variable UniformConstant
+             180:             TypePointer Input 7(ivec3)
+        181(tid):    180(ptr) Variable Input
          4(main):           2 Function None 3
                5:             Label
-         32(tid):      8(ptr) Variable Function
-       36(param):      8(ptr) Variable Function
-              35:    7(ivec3) Load 34(tid)
-                              Store 32(tid) 35
-              37:    7(ivec3) Load 32(tid)
-                              Store 36(param) 37
-              38:           2 FunctionCall 11(@main(vu3;) 36(param)
+        179(tid):      8(ptr) Variable Function
+      183(param):      8(ptr) Variable Function
+             182:    7(ivec3) Load 181(tid)
+                              Store 179(tid) 182
+             184:    7(ivec3) Load 179(tid)
+                              Store 183(param) 184
+             185:           2 FunctionCall 11(@main(vu3;) 183(param)
                               Return
                               FunctionEnd
   11(@main(vu3;):           2 Function None 9
          10(tid):      8(ptr) FunctionParameter
               12:             Label
-   14(storeTemp):     13(ptr) Variable Function
-              19:          16 Load 18(IN)
-              20:    7(ivec3) Load 10(tid)
-              23:   22(ivec4) ImageFetch 19 20 Lod 21
-              24:     15(int) CompositeExtract 23 0
-              25:      6(int) Bitcast 24
-                              Store 14(storeTemp) 25
-              29:          26 Load 28(OUT)
-              30:    7(ivec3) Load 10(tid)
-              31:      6(int) Load 14(storeTemp)
-                              ImageWrite 29 30 31
+           15(f):     14(ptr) Variable Function
+           97(i):     96(ptr) Variable Function
+  168(storeTemp):     14(ptr) Variable Function
+                              Store 15(f) 16
+              20:          17 Load 19(i1D)
+              23:     22(ptr) AccessChain 10(tid) 21
+              24:      6(int) Load 23
+              28:   27(fvec4) ImageFetch 20 24 Lod 26
+              29:   13(float) CompositeExtract 28 0
+              30:   13(float) Load 15(f)
+              31:   13(float) FAdd 30 29
+                              Store 15(f) 31
+              35:          32 Load 34(i2D)
+              37:    7(ivec3) Load 10(tid)
+              38:   36(ivec2) VectorShuffle 37 37 0 1
+              39:   27(fvec4) ImageFetch 35 38 Lod 26
+              40:   13(float) CompositeExtract 39 0
+              41:   13(float) Load 15(f)
+              42:   13(float) FAdd 41 40
+                              Store 15(f) 42
+              46:          43 Load 45(i3D)
+              47:    7(ivec3) Load 10(tid)
+              48:   27(fvec4) ImageFetch 46 47 Lod 26
+              49:   13(float) CompositeExtract 48 0
+              50:   13(float) Load 15(f)
+              51:   13(float) FAdd 50 49
+                              Store 15(f) 51
+              55:          52 Load 54(i1DArray)
+              56:    7(ivec3) Load 10(tid)
+              57:   36(ivec2) VectorShuffle 56 56 0 1
+              58:   27(fvec4) ImageFetch 55 57 Lod 26
+              59:   13(float) CompositeExtract 58 0
+              60:   13(float) Load 15(f)
+              61:   13(float) FAdd 60 59
+                              Store 15(f) 61
+              65:          62 Load 64(i2DArray)
+              66:    7(ivec3) Load 10(tid)
+              67:   27(fvec4) ImageFetch 65 66 Lod 26
+              68:   13(float) CompositeExtract 67 0
+              69:   13(float) Load 15(f)
+              70:   13(float) FAdd 69 68
+                              Store 15(f) 70
+              74:          71 Load 73(i2DMS)
+              75:    7(ivec3) Load 10(tid)
+              76:   36(ivec2) VectorShuffle 75 75 0 1
+              78:   77(ivec2) Bitcast 76
+              80:   27(fvec4) ImageFetch 74 78 Sample 79
+              81:   13(float) CompositeExtract 80 0
+              82:   13(float) Load 15(f)
+              83:   13(float) FAdd 82 81
+                              Store 15(f) 83
+              87:          84 Load 86(i2DMSArray)
+              88:    7(ivec3) Load 10(tid)
+              90:   89(ivec3) Bitcast 88
+              92:   27(fvec4) ImageFetch 87 90 Sample 91
+              93:   13(float) CompositeExtract 92 0
+              94:   13(float) Load 15(f)
+              95:   13(float) FAdd 94 93
+                              Store 15(f) 95
+                              Store 97(i) 26
+             101:          98 Load 100(ii1D)
+             102:     22(ptr) AccessChain 10(tid) 21
+             103:      6(int) Load 102
+             105:  104(ivec4) ImageFetch 101 103 Lod 26
+             106:     25(int) CompositeExtract 105 0
+             107:     25(int) Load 97(i)
+             108:     25(int) IAdd 107 106
+                              Store 97(i) 108
+             112:         109 Load 111(ii2D)
+             113:    7(ivec3) Load 10(tid)
+             114:   36(ivec2) VectorShuffle 113 113 0 1
+             115:  104(ivec4) ImageFetch 112 114 Lod 26
+             116:     25(int) CompositeExtract 115 0
+             117:     25(int) Load 97(i)
+             118:     25(int) IAdd 117 116
+                              Store 97(i) 118
+             122:         119 Load 121(ii3D)
+             123:    7(ivec3) Load 10(tid)
+             124:  104(ivec4) ImageFetch 122 123 Lod 26
+             125:     25(int) CompositeExtract 124 0
+             126:     25(int) Load 97(i)
+             127:     25(int) IAdd 126 125
+                              Store 97(i) 127
+             131:         128 Load 130(ii1DArray)
+             132:    7(ivec3) Load 10(tid)
+             133:   36(ivec2) VectorShuffle 132 132 0 1
+             134:  104(ivec4) ImageFetch 131 133 Lod 26
+             135:     25(int) CompositeExtract 134 0
+             136:     25(int) Load 97(i)
+             137:     25(int) IAdd 136 135
+                              Store 97(i) 137
+             141:         138 Load 140(ii2DArray)
+             142:    7(ivec3) Load 10(tid)
+             143:  104(ivec4) ImageFetch 141 142 Lod 26
+             144:     25(int) CompositeExtract 143 0
+             145:     25(int) Load 97(i)
+             146:     25(int) IAdd 145 144
+                              Store 97(i) 146
+             150:         147 Load 149(ii2DMS)
+             151:    7(ivec3) Load 10(tid)
+             152:   36(ivec2) VectorShuffle 151 151 0 1
+             153:   77(ivec2) Bitcast 152
+             154:  104(ivec4) ImageFetch 150 153 Sample 79
+             155:     25(int) CompositeExtract 154 0
+             156:     25(int) Load 97(i)
+             157:     25(int) IAdd 156 155
+                              Store 97(i) 157
+             161:         158 Load 160(ii2DMSArray)
+             162:    7(ivec3) Load 10(tid)
+             163:   89(ivec3) Bitcast 162
+             164:  104(ivec4) ImageFetch 161 163 Sample 91
+             165:     25(int) CompositeExtract 164 0
+             166:     25(int) Load 97(i)
+             167:     25(int) IAdd 166 165
+                              Store 97(i) 167
+             169:   13(float) Load 15(f)
+             170:     25(int) Load 97(i)
+             171:   13(float) ConvertSToF 170
+             172:   13(float) FAdd 169 171
+                              Store 168(storeTemp) 172
+             176:         173 Load 175(OUT)
+             177:    7(ivec3) Load 10(tid)
+             178:   13(float) Load 168(storeTemp)
+                              ImageWrite 176 177 178
                               Return
                               FunctionEnd
diff --git a/third_party/vulkan-deps/glslang/src/Test/baseResults/hlsl.imageload-subvec4.comp.out b/third_party/vulkan-deps/glslang/src/Test/baseResults/hlsl.imageload-subvec4.comp.out
new file mode 100644
index 0000000..4d038a1
--- /dev/null
+++ b/third_party/vulkan-deps/glslang/src/Test/baseResults/hlsl.imageload-subvec4.comp.out
@@ -0,0 +1,477 @@
+hlsl.imageload-subvec4.comp
+Shader version: 500
+local_size = (8, 8, 8)
+0:? Sequence
+0:17  Function Definition: @main(vu3; ( temp void)
+0:17    Function Parameters: 
+0:17      'tid' ( in 3-component vector of uint)
+0:?     Sequence
+0:18      Sequence
+0:18        move second child to first child ( temp float)
+0:18          'f' ( temp float)
+0:18          Constant:
+0:18            0.000000
+0:19      add second child into first child ( temp float)
+0:19        'f' ( temp float)
+0:19        imageLoad ( temp float)
+0:19          'i1D' (layout( binding=0 r32f) uniform image1D)
+0:19          direct index ( temp uint)
+0:19            'tid' ( in 3-component vector of uint)
+0:19            Constant:
+0:19              0 (const int)
+0:20      add second child into first child ( temp float)
+0:20        'f' ( temp float)
+0:20        imageLoad ( temp float)
+0:20          'i2D' (layout( binding=1 r32f) uniform image2D)
+0:20          vector swizzle ( temp 2-component vector of uint)
+0:20            'tid' ( in 3-component vector of uint)
+0:20            Sequence
+0:20              Constant:
+0:20                0 (const int)
+0:20              Constant:
+0:20                1 (const int)
+0:21      add second child into first child ( temp float)
+0:21        'f' ( temp float)
+0:21        imageLoad ( temp float)
+0:21          'i3D' (layout( binding=2 r32f) uniform image3D)
+0:21          'tid' ( in 3-component vector of uint)
+0:22      add second child into first child ( temp float)
+0:22        'f' ( temp float)
+0:22        imageLoad ( temp float)
+0:22          'i1DArray' (layout( binding=3 r32f) uniform image1DArray)
+0:22          vector swizzle ( temp 2-component vector of uint)
+0:22            'tid' ( in 3-component vector of uint)
+0:22            Sequence
+0:22              Constant:
+0:22                0 (const int)
+0:22              Constant:
+0:22                1 (const int)
+0:23      add second child into first child ( temp float)
+0:23        'f' ( temp float)
+0:23        imageLoad ( temp float)
+0:23          'i2DArray' (layout( binding=4 r32f) uniform image2DArray)
+0:23          'tid' ( in 3-component vector of uint)
+0:25      Sequence
+0:25        move second child to first child ( temp int)
+0:25          'i' ( temp int)
+0:25          Constant:
+0:25            0 (const int)
+0:26      add second child into first child ( temp int)
+0:26        'i' ( temp int)
+0:26        imageLoad ( temp int)
+0:26          'ii1D' (layout( binding=5 r32i) uniform iimage1D)
+0:26          direct index ( temp uint)
+0:26            'tid' ( in 3-component vector of uint)
+0:26            Constant:
+0:26              0 (const int)
+0:27      add second child into first child ( temp int)
+0:27        'i' ( temp int)
+0:27        imageLoad ( temp int)
+0:27          'ii2D' (layout( binding=6 r32i) uniform iimage2D)
+0:27          vector swizzle ( temp 2-component vector of uint)
+0:27            'tid' ( in 3-component vector of uint)
+0:27            Sequence
+0:27              Constant:
+0:27                0 (const int)
+0:27              Constant:
+0:27                1 (const int)
+0:28      add second child into first child ( temp int)
+0:28        'i' ( temp int)
+0:28        imageLoad ( temp int)
+0:28          'ii3D' (layout( binding=7 r32i) uniform iimage3D)
+0:28          'tid' ( in 3-component vector of uint)
+0:29      add second child into first child ( temp int)
+0:29        'i' ( temp int)
+0:29        imageLoad ( temp int)
+0:29          'ii1DArray' (layout( binding=8 r32i) uniform iimage1DArray)
+0:29          vector swizzle ( temp 2-component vector of uint)
+0:29            'tid' ( in 3-component vector of uint)
+0:29            Sequence
+0:29              Constant:
+0:29                0 (const int)
+0:29              Constant:
+0:29                1 (const int)
+0:30      add second child into first child ( temp int)
+0:30        'i' ( temp int)
+0:30        imageLoad ( temp int)
+0:30          'ii2DArray' (layout( binding=9 r32i) uniform iimage2DArray)
+0:30          'tid' ( in 3-component vector of uint)
+0:32      Sequence
+0:32        move second child to first child ( temp float)
+0:32          'storeTemp' ( temp float)
+0:32          add ( temp float)
+0:32            'f' ( temp float)
+0:32            Convert int to float ( temp float)
+0:32              'i' ( temp int)
+0:32        imageStore ( temp void)
+0:32          'OUT' (layout( binding=10 r32f) uniform image3D)
+0:32          'tid' ( in 3-component vector of uint)
+0:32          'storeTemp' ( temp float)
+0:32        'storeTemp' ( temp float)
+0:17  Function Definition: main( ( temp void)
+0:17    Function Parameters: 
+0:?     Sequence
+0:17      move second child to first child ( temp 3-component vector of uint)
+0:?         'tid' ( temp 3-component vector of uint)
+0:?         'tid' ( in 3-component vector of uint GlobalInvocationID)
+0:17      Function Call: @main(vu3; ( temp void)
+0:?         'tid' ( temp 3-component vector of uint)
+0:?   Linker Objects
+0:?     'i1D' (layout( binding=0 r32f) uniform image1D)
+0:?     'i2D' (layout( binding=1 r32f) uniform image2D)
+0:?     'i3D' (layout( binding=2 r32f) uniform image3D)
+0:?     'i1DArray' (layout( binding=3 r32f) uniform image1DArray)
+0:?     'i2DArray' (layout( binding=4 r32f) uniform image2DArray)
+0:?     'ii1D' (layout( binding=5 r32i) uniform iimage1D)
+0:?     'ii2D' (layout( binding=6 r32i) uniform iimage2D)
+0:?     'ii3D' (layout( binding=7 r32i) uniform iimage3D)
+0:?     'ii1DArray' (layout( binding=8 r32i) uniform iimage1DArray)
+0:?     'ii2DArray' (layout( binding=9 r32i) uniform iimage2DArray)
+0:?     'OUT' (layout( binding=10 r32f) uniform image3D)
+0:?     'tid' ( in 3-component vector of uint GlobalInvocationID)
+
+
+Linked compute stage:
+
+
+Shader version: 500
+local_size = (8, 8, 8)
+0:? Sequence
+0:17  Function Definition: @main(vu3; ( temp void)
+0:17    Function Parameters: 
+0:17      'tid' ( in 3-component vector of uint)
+0:?     Sequence
+0:18      Sequence
+0:18        move second child to first child ( temp float)
+0:18          'f' ( temp float)
+0:18          Constant:
+0:18            0.000000
+0:19      add second child into first child ( temp float)
+0:19        'f' ( temp float)
+0:19        imageLoad ( temp float)
+0:19          'i1D' (layout( binding=0 r32f) uniform image1D)
+0:19          direct index ( temp uint)
+0:19            'tid' ( in 3-component vector of uint)
+0:19            Constant:
+0:19              0 (const int)
+0:20      add second child into first child ( temp float)
+0:20        'f' ( temp float)
+0:20        imageLoad ( temp float)
+0:20          'i2D' (layout( binding=1 r32f) uniform image2D)
+0:20          vector swizzle ( temp 2-component vector of uint)
+0:20            'tid' ( in 3-component vector of uint)
+0:20            Sequence
+0:20              Constant:
+0:20                0 (const int)
+0:20              Constant:
+0:20                1 (const int)
+0:21      add second child into first child ( temp float)
+0:21        'f' ( temp float)
+0:21        imageLoad ( temp float)
+0:21          'i3D' (layout( binding=2 r32f) uniform image3D)
+0:21          'tid' ( in 3-component vector of uint)
+0:22      add second child into first child ( temp float)
+0:22        'f' ( temp float)
+0:22        imageLoad ( temp float)
+0:22          'i1DArray' (layout( binding=3 r32f) uniform image1DArray)
+0:22          vector swizzle ( temp 2-component vector of uint)
+0:22            'tid' ( in 3-component vector of uint)
+0:22            Sequence
+0:22              Constant:
+0:22                0 (const int)
+0:22              Constant:
+0:22                1 (const int)
+0:23      add second child into first child ( temp float)
+0:23        'f' ( temp float)
+0:23        imageLoad ( temp float)
+0:23          'i2DArray' (layout( binding=4 r32f) uniform image2DArray)
+0:23          'tid' ( in 3-component vector of uint)
+0:25      Sequence
+0:25        move second child to first child ( temp int)
+0:25          'i' ( temp int)
+0:25          Constant:
+0:25            0 (const int)
+0:26      add second child into first child ( temp int)
+0:26        'i' ( temp int)
+0:26        imageLoad ( temp int)
+0:26          'ii1D' (layout( binding=5 r32i) uniform iimage1D)
+0:26          direct index ( temp uint)
+0:26            'tid' ( in 3-component vector of uint)
+0:26            Constant:
+0:26              0 (const int)
+0:27      add second child into first child ( temp int)
+0:27        'i' ( temp int)
+0:27        imageLoad ( temp int)
+0:27          'ii2D' (layout( binding=6 r32i) uniform iimage2D)
+0:27          vector swizzle ( temp 2-component vector of uint)
+0:27            'tid' ( in 3-component vector of uint)
+0:27            Sequence
+0:27              Constant:
+0:27                0 (const int)
+0:27              Constant:
+0:27                1 (const int)
+0:28      add second child into first child ( temp int)
+0:28        'i' ( temp int)
+0:28        imageLoad ( temp int)
+0:28          'ii3D' (layout( binding=7 r32i) uniform iimage3D)
+0:28          'tid' ( in 3-component vector of uint)
+0:29      add second child into first child ( temp int)
+0:29        'i' ( temp int)
+0:29        imageLoad ( temp int)
+0:29          'ii1DArray' (layout( binding=8 r32i) uniform iimage1DArray)
+0:29          vector swizzle ( temp 2-component vector of uint)
+0:29            'tid' ( in 3-component vector of uint)
+0:29            Sequence
+0:29              Constant:
+0:29                0 (const int)
+0:29              Constant:
+0:29                1 (const int)
+0:30      add second child into first child ( temp int)
+0:30        'i' ( temp int)
+0:30        imageLoad ( temp int)
+0:30          'ii2DArray' (layout( binding=9 r32i) uniform iimage2DArray)
+0:30          'tid' ( in 3-component vector of uint)
+0:32      Sequence
+0:32        move second child to first child ( temp float)
+0:32          'storeTemp' ( temp float)
+0:32          add ( temp float)
+0:32            'f' ( temp float)
+0:32            Convert int to float ( temp float)
+0:32              'i' ( temp int)
+0:32        imageStore ( temp void)
+0:32          'OUT' (layout( binding=10 r32f) uniform image3D)
+0:32          'tid' ( in 3-component vector of uint)
+0:32          'storeTemp' ( temp float)
+0:32        'storeTemp' ( temp float)
+0:17  Function Definition: main( ( temp void)
+0:17    Function Parameters: 
+0:?     Sequence
+0:17      move second child to first child ( temp 3-component vector of uint)
+0:?         'tid' ( temp 3-component vector of uint)
+0:?         'tid' ( in 3-component vector of uint GlobalInvocationID)
+0:17      Function Call: @main(vu3; ( temp void)
+0:?         'tid' ( temp 3-component vector of uint)
+0:?   Linker Objects
+0:?     'i1D' (layout( binding=0 r32f) uniform image1D)
+0:?     'i2D' (layout( binding=1 r32f) uniform image2D)
+0:?     'i3D' (layout( binding=2 r32f) uniform image3D)
+0:?     'i1DArray' (layout( binding=3 r32f) uniform image1DArray)
+0:?     'i2DArray' (layout( binding=4 r32f) uniform image2DArray)
+0:?     'ii1D' (layout( binding=5 r32i) uniform iimage1D)
+0:?     'ii2D' (layout( binding=6 r32i) uniform iimage2D)
+0:?     'ii3D' (layout( binding=7 r32i) uniform iimage3D)
+0:?     'ii1DArray' (layout( binding=8 r32i) uniform iimage1DArray)
+0:?     'ii2DArray' (layout( binding=9 r32i) uniform iimage2DArray)
+0:?     'OUT' (layout( binding=10 r32f) uniform image3D)
+0:?     'tid' ( in 3-component vector of uint GlobalInvocationID)
+
+// Module Version 10000
+// Generated by (magic number): 8000a
+// Id's are bound by 138
+
+                              Capability Shader
+                              Capability Image1D
+               1:             ExtInstImport  "GLSL.std.450"
+                              MemoryModel Logical GLSL450
+                              EntryPoint GLCompute 4  "main" 133
+                              ExecutionMode 4 LocalSize 8 8 8
+                              Source HLSL 500
+                              Name 4  "main"
+                              Name 11  "@main(vu3;"
+                              Name 10  "tid"
+                              Name 15  "f"
+                              Name 19  "i1D"
+                              Name 32  "i2D"
+                              Name 43  "i3D"
+                              Name 52  "i1DArray"
+                              Name 62  "i2DArray"
+                              Name 71  "i"
+                              Name 75  "ii1D"
+                              Name 86  "ii2D"
+                              Name 96  "ii3D"
+                              Name 105  "ii1DArray"
+                              Name 115  "ii2DArray"
+                              Name 122  "storeTemp"
+                              Name 127  "OUT"
+                              Name 131  "tid"
+                              Name 133  "tid"
+                              Name 135  "param"
+                              Decorate 19(i1D) DescriptorSet 0
+                              Decorate 19(i1D) Binding 0
+                              Decorate 32(i2D) DescriptorSet 0
+                              Decorate 32(i2D) Binding 1
+                              Decorate 43(i3D) DescriptorSet 0
+                              Decorate 43(i3D) Binding 2
+                              Decorate 52(i1DArray) DescriptorSet 0
+                              Decorate 52(i1DArray) Binding 3
+                              Decorate 62(i2DArray) DescriptorSet 0
+                              Decorate 62(i2DArray) Binding 4
+                              Decorate 75(ii1D) DescriptorSet 0
+                              Decorate 75(ii1D) Binding 5
+                              Decorate 86(ii2D) DescriptorSet 0
+                              Decorate 86(ii2D) Binding 6
+                              Decorate 96(ii3D) DescriptorSet 0
+                              Decorate 96(ii3D) Binding 7
+                              Decorate 105(ii1DArray) DescriptorSet 0
+                              Decorate 105(ii1DArray) Binding 8
+                              Decorate 115(ii2DArray) DescriptorSet 0
+                              Decorate 115(ii2DArray) Binding 9
+                              Decorate 127(OUT) DescriptorSet 0
+                              Decorate 127(OUT) Binding 10
+                              Decorate 133(tid) BuiltIn GlobalInvocationId
+               2:             TypeVoid
+               3:             TypeFunction 2
+               6:             TypeInt 32 0
+               7:             TypeVector 6(int) 3
+               8:             TypePointer Function 7(ivec3)
+               9:             TypeFunction 2 8(ptr)
+              13:             TypeFloat 32
+              14:             TypePointer Function 13(float)
+              16:   13(float) Constant 0
+              17:             TypeImage 13(float) 1D nonsampled format:R32f
+              18:             TypePointer UniformConstant 17
+         19(i1D):     18(ptr) Variable UniformConstant
+              21:      6(int) Constant 0
+              22:             TypePointer Function 6(int)
+              25:             TypeVector 13(float) 4
+              30:             TypeImage 13(float) 2D nonsampled format:R32f
+              31:             TypePointer UniformConstant 30
+         32(i2D):     31(ptr) Variable UniformConstant
+              34:             TypeVector 6(int) 2
+              41:             TypeImage 13(float) 3D nonsampled format:R32f
+              42:             TypePointer UniformConstant 41
+         43(i3D):     42(ptr) Variable UniformConstant
+              50:             TypeImage 13(float) 1D array nonsampled format:R32f
+              51:             TypePointer UniformConstant 50
+    52(i1DArray):     51(ptr) Variable UniformConstant
+              60:             TypeImage 13(float) 2D array nonsampled format:R32f
+              61:             TypePointer UniformConstant 60
+    62(i2DArray):     61(ptr) Variable UniformConstant
+              69:             TypeInt 32 1
+              70:             TypePointer Function 69(int)
+              72:     69(int) Constant 0
+              73:             TypeImage 69(int) 1D nonsampled format:R32i
+              74:             TypePointer UniformConstant 73
+        75(ii1D):     74(ptr) Variable UniformConstant
+              79:             TypeVector 69(int) 4
+              84:             TypeImage 69(int) 2D nonsampled format:R32i
+              85:             TypePointer UniformConstant 84
+        86(ii2D):     85(ptr) Variable UniformConstant
+              94:             TypeImage 69(int) 3D nonsampled format:R32i
+              95:             TypePointer UniformConstant 94
+        96(ii3D):     95(ptr) Variable UniformConstant
+             103:             TypeImage 69(int) 1D array nonsampled format:R32i
+             104:             TypePointer UniformConstant 103
+  105(ii1DArray):    104(ptr) Variable UniformConstant
+             113:             TypeImage 69(int) 2D array nonsampled format:R32i
+             114:             TypePointer UniformConstant 113
+  115(ii2DArray):    114(ptr) Variable UniformConstant
+        127(OUT):     42(ptr) Variable UniformConstant
+             132:             TypePointer Input 7(ivec3)
+        133(tid):    132(ptr) Variable Input
+         4(main):           2 Function None 3
+               5:             Label
+        131(tid):      8(ptr) Variable Function
+      135(param):      8(ptr) Variable Function
+             134:    7(ivec3) Load 133(tid)
+                              Store 131(tid) 134
+             136:    7(ivec3) Load 131(tid)
+                              Store 135(param) 136
+             137:           2 FunctionCall 11(@main(vu3;) 135(param)
+                              Return
+                              FunctionEnd
+  11(@main(vu3;):           2 Function None 9
+         10(tid):      8(ptr) FunctionParameter
+              12:             Label
+           15(f):     14(ptr) Variable Function
+           71(i):     70(ptr) Variable Function
+  122(storeTemp):     14(ptr) Variable Function
+                              Store 15(f) 16
+              20:          17 Load 19(i1D)
+              23:     22(ptr) AccessChain 10(tid) 21
+              24:      6(int) Load 23
+              26:   25(fvec4) ImageRead 20 24
+              27:   13(float) CompositeExtract 26 0
+              28:   13(float) Load 15(f)
+              29:   13(float) FAdd 28 27
+                              Store 15(f) 29
+              33:          30 Load 32(i2D)
+              35:    7(ivec3) Load 10(tid)
+              36:   34(ivec2) VectorShuffle 35 35 0 1
+              37:   25(fvec4) ImageRead 33 36
+              38:   13(float) CompositeExtract 37 0
+              39:   13(float) Load 15(f)
+              40:   13(float) FAdd 39 38
+                              Store 15(f) 40
+              44:          41 Load 43(i3D)
+              45:    7(ivec3) Load 10(tid)
+              46:   25(fvec4) ImageRead 44 45
+              47:   13(float) CompositeExtract 46 0
+              48:   13(float) Load 15(f)
+              49:   13(float) FAdd 48 47
+                              Store 15(f) 49
+              53:          50 Load 52(i1DArray)
+              54:    7(ivec3) Load 10(tid)
+              55:   34(ivec2) VectorShuffle 54 54 0 1
+              56:   25(fvec4) ImageRead 53 55
+              57:   13(float) CompositeExtract 56 0
+              58:   13(float) Load 15(f)
+              59:   13(float) FAdd 58 57
+                              Store 15(f) 59
+              63:          60 Load 62(i2DArray)
+              64:    7(ivec3) Load 10(tid)
+              65:   25(fvec4) ImageRead 63 64
+              66:   13(float) CompositeExtract 65 0
+              67:   13(float) Load 15(f)
+              68:   13(float) FAdd 67 66
+                              Store 15(f) 68
+                              Store 71(i) 72
+              76:          73 Load 75(ii1D)
+              77:     22(ptr) AccessChain 10(tid) 21
+              78:      6(int) Load 77
+              80:   79(ivec4) ImageRead 76 78
+              81:     69(int) CompositeExtract 80 0
+              82:     69(int) Load 71(i)
+              83:     69(int) IAdd 82 81
+                              Store 71(i) 83
+              87:          84 Load 86(ii2D)
+              88:    7(ivec3) Load 10(tid)
+              89:   34(ivec2) VectorShuffle 88 88 0 1
+              90:   79(ivec4) ImageRead 87 89
+              91:     69(int) CompositeExtract 90 0
+              92:     69(int) Load 71(i)
+              93:     69(int) IAdd 92 91
+                              Store 71(i) 93
+              97:          94 Load 96(ii3D)
+              98:    7(ivec3) Load 10(tid)
+              99:   79(ivec4) ImageRead 97 98
+             100:     69(int) CompositeExtract 99 0
+             101:     69(int) Load 71(i)
+             102:     69(int) IAdd 101 100
+                              Store 71(i) 102
+             106:         103 Load 105(ii1DArray)
+             107:    7(ivec3) Load 10(tid)
+             108:   34(ivec2) VectorShuffle 107 107 0 1
+             109:   79(ivec4) ImageRead 106 108
+             110:     69(int) CompositeExtract 109 0
+             111:     69(int) Load 71(i)
+             112:     69(int) IAdd 111 110
+                              Store 71(i) 112
+             116:         113 Load 115(ii2DArray)
+             117:    7(ivec3) Load 10(tid)
+             118:   79(ivec4) ImageRead 116 117
+             119:     69(int) CompositeExtract 118 0
+             120:     69(int) Load 71(i)
+             121:     69(int) IAdd 120 119
+                              Store 71(i) 121
+             123:   13(float) Load 15(f)
+             124:     69(int) Load 71(i)
+             125:   13(float) ConvertSToF 124
+             126:   13(float) FAdd 123 125
+                              Store 122(storeTemp) 126
+             128:          41 Load 127(OUT)
+             129:    7(ivec3) Load 10(tid)
+             130:   13(float) Load 122(storeTemp)
+                              ImageWrite 128 129 130
+                              Return
+                              FunctionEnd
diff --git a/third_party/vulkan-deps/glslang/src/Test/baseResults/hlsl.partialFlattenLocal.vert.out b/third_party/vulkan-deps/glslang/src/Test/baseResults/hlsl.partialFlattenLocal.vert.out
index 12a6065..7bcc879 100644
--- a/third_party/vulkan-deps/glslang/src/Test/baseResults/hlsl.partialFlattenLocal.vert.out
+++ b/third_party/vulkan-deps/glslang/src/Test/baseResults/hlsl.partialFlattenLocal.vert.out
@@ -238,12 +238,12 @@
 
 // Module Version 10000
 // Generated by (magic number): 8000a
-// Id's are bound by 90
+// Id's are bound by 93
 
                               Capability Shader
                1:             ExtInstImport  "GLSL.std.450"
                               MemoryModel Logical GLSL450
-                              EntryPoint Vertex 4  "main" 83 86
+                              EntryPoint Vertex 4  "main" 86 89
                               Source HLSL 500
                               Name 4  "main"
                               Name 11  "@main(vf4;"
@@ -257,15 +257,15 @@
                               Name 24  "packed"
                               Name 27  "tex"
                               Name 47  "i"
-                              Name 69  "packed2"
-                              Name 81  "pos"
-                              Name 83  "pos"
-                              Name 86  "@entryPointOutput"
-                              Name 87  "param"
+                              Name 72  "packed2"
+                              Name 84  "pos"
+                              Name 86  "pos"
+                              Name 89  "@entryPointOutput"
+                              Name 90  "param"
                               Decorate 27(tex) DescriptorSet 0
                               Decorate 27(tex) Binding 0
-                              Decorate 83(pos) Location 0
-                              Decorate 86(@entryPointOutput) BuiltIn Position
+                              Decorate 86(pos) Location 0
+                              Decorate 89(@entryPointOutput) BuiltIn Position
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeFloat 32
@@ -300,20 +300,22 @@
               44:     21(int) Constant 4
               45:             TypePointer Function 21(int)
               54:             TypeBool
-              82:             TypePointer Input 7(fvec4)
-         83(pos):     82(ptr) Variable Input
-              85:             TypePointer Output 7(fvec4)
-86(@entryPointOutput):     85(ptr) Variable Output
+              64:     15(int) Constant 0
+              67:     15(int) Constant 1
+              85:             TypePointer Input 7(fvec4)
+         86(pos):     85(ptr) Variable Input
+              88:             TypePointer Output 7(fvec4)
+89(@entryPointOutput):     88(ptr) Variable Output
          4(main):           2 Function None 3
                5:             Label
-         81(pos):      8(ptr) Variable Function
-       87(param):      8(ptr) Variable Function
-              84:    7(fvec4) Load 83(pos)
-                              Store 81(pos) 84
-              88:    7(fvec4) Load 81(pos)
-                              Store 87(param) 88
-              89:    7(fvec4) FunctionCall 11(@main(vf4;) 87(param)
-                              Store 86(@entryPointOutput) 89
+         84(pos):      8(ptr) Variable Function
+       90(param):      8(ptr) Variable Function
+              87:    7(fvec4) Load 86(pos)
+                              Store 84(pos) 87
+              91:    7(fvec4) Load 84(pos)
+                              Store 90(param) 91
+              92:    7(fvec4) FunctionCall 11(@main(vf4;) 90(param)
+                              Store 89(@entryPointOutput) 92
                               Return
                               FunctionEnd
   11(@main(vf4;):    7(fvec4) Function None 9
@@ -321,7 +323,7 @@
               12:             Label
       24(packed):     23(ptr) Variable Function
            47(i):     45(ptr) Variable Function
-     69(packed2):     23(ptr) Variable Function
+     72(packed2):     23(ptr) Variable Function
               28:          13 Load 27(tex)
               30:     29(ptr) AccessChain 24(packed) 25
                               Store 30 28
@@ -351,26 +353,28 @@
               61:   14(fvec3)   Load 60
               62:   18(fvec2)   VectorShuffle 61 61 0 1
               63:   18(fvec2)   FAdd 62 59
-              64:     34(ptr)   AccessChain 24(packed) 31 56
-              65:   14(fvec3)   Load 64
-              66:   14(fvec3)   VectorShuffle 65 63 3 4 2
-                                Store 64 66
+              65:     42(ptr)   AccessChain 24(packed) 31 56 64
+              66:    6(float)   CompositeExtract 63 0
+                                Store 65 66
+              68:     42(ptr)   AccessChain 24(packed) 31 56 67
+              69:    6(float)   CompositeExtract 63 1
+                                Store 68 69
                                 Branch 51
               51:               Label
-              67:     21(int)   Load 47(i)
-              68:     21(int)   IAdd 67 31
-                                Store 47(i) 68
+              70:     21(int)   Load 47(i)
+              71:     21(int)   IAdd 70 31
+                                Store 47(i) 71
                                 Branch 48
               50:             Label
-              70:  22(Packed) Load 24(packed)
-                              Store 69(packed2) 70
-              71:    7(fvec4) Load 10(pos)
-              72:     34(ptr) AccessChain 69(packed2) 31 25
-              73:   14(fvec3) Load 72
-              74:    6(float) CompositeExtract 73 0
-              75:    6(float) CompositeExtract 73 1
-              76:    6(float) CompositeExtract 73 2
-              77:    7(fvec4) CompositeConstruct 74 75 76 32
-              78:    7(fvec4) FAdd 71 77
-                              ReturnValue 78
+              73:  22(Packed) Load 24(packed)
+                              Store 72(packed2) 73
+              74:    7(fvec4) Load 10(pos)
+              75:     34(ptr) AccessChain 72(packed2) 31 25
+              76:   14(fvec3) Load 75
+              77:    6(float) CompositeExtract 76 0
+              78:    6(float) CompositeExtract 76 1
+              79:    6(float) CompositeExtract 76 2
+              80:    7(fvec4) CompositeConstruct 77 78 79 32
+              81:    7(fvec4) FAdd 74 80
+                              ReturnValue 81
                               FunctionEnd
diff --git a/third_party/vulkan-deps/glslang/src/Test/baseResults/hlsl.rw.register.frag.out b/third_party/vulkan-deps/glslang/src/Test/baseResults/hlsl.rw.register.frag.out
index 7bcecc9..265eaf9 100644
--- a/third_party/vulkan-deps/glslang/src/Test/baseResults/hlsl.rw.register.frag.out
+++ b/third_party/vulkan-deps/glslang/src/Test/baseResults/hlsl.rw.register.frag.out
@@ -97,17 +97,16 @@
 0:?     'g_tBuf1du1' (layout( binding=3 r32ui) uniform uimageBuffer)
 0:?     '@entryPointOutput.Color' (layout( location=0) out 4-component vector of float)
 
-Validation failed
 // Module Version 10000
 // Generated by (magic number): 8000a
-// Id's are bound by 42
+// Id's are bound by 45
 
                               Capability Shader
                               Capability Image1D
                               Capability ImageBuffer
                1:             ExtInstImport  "GLSL.std.450"
                               MemoryModel Logical GLSL450
-                              EntryPoint Fragment 4  "main" 39
+                              EntryPoint Fragment 4  "main" 42
                               ExecutionMode 4 OriginUpperLeft
                               Source HLSL 500
                               Name 4  "main"
@@ -116,15 +115,15 @@
                               Name 10  "@main("
                               Name 13  "r00"
                               Name 16  "g_tTex1df1"
-                              Name 23  "r01"
-                              Name 26  "g_tBuf1du1"
-                              Name 30  "psout"
-                              Name 39  "@entryPointOutput.Color"
+                              Name 24  "r01"
+                              Name 27  "g_tBuf1du1"
+                              Name 33  "psout"
+                              Name 42  "@entryPointOutput.Color"
                               Decorate 16(g_tTex1df1) DescriptorSet 0
                               Decorate 16(g_tTex1df1) Binding 2
-                              Decorate 26(g_tBuf1du1) DescriptorSet 0
-                              Decorate 26(g_tBuf1du1) Binding 3
-                              Decorate 39(@entryPointOutput.Color) Location 0
+                              Decorate 27(g_tBuf1du1) DescriptorSet 0
+                              Decorate 27(g_tBuf1du1) Binding 3
+                              Decorate 42(@entryPointOutput.Color) Location 0
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeFloat 32
@@ -137,37 +136,40 @@
   16(g_tTex1df1):     15(ptr) Variable UniformConstant
               18:             TypeInt 32 1
               19:     18(int) Constant 0
-              21:             TypeInt 32 0
-              22:             TypePointer Function 21(int)
-              24:             TypeImage 21(int) Buffer nonsampled format:R32ui
-              25:             TypePointer UniformConstant 24
-  26(g_tBuf1du1):     25(ptr) Variable UniformConstant
-              29:             TypePointer Function 8(PS_OUTPUT)
-              31:    6(float) Constant 1065353216
-              32:    7(fvec4) ConstantComposite 31 31 31 31
-              33:             TypePointer Function 7(fvec4)
-              38:             TypePointer Output 7(fvec4)
-39(@entryPointOutput.Color):     38(ptr) Variable Output
+              22:             TypeInt 32 0
+              23:             TypePointer Function 22(int)
+              25:             TypeImage 22(int) Buffer nonsampled format:R32ui
+              26:             TypePointer UniformConstant 25
+  27(g_tBuf1du1):     26(ptr) Variable UniformConstant
+              29:             TypeVector 22(int) 4
+              32:             TypePointer Function 8(PS_OUTPUT)
+              34:    6(float) Constant 1065353216
+              35:    7(fvec4) ConstantComposite 34 34 34 34
+              36:             TypePointer Function 7(fvec4)
+              41:             TypePointer Output 7(fvec4)
+42(@entryPointOutput.Color):     41(ptr) Variable Output
          4(main):           2 Function None 3
                5:             Label
-              40:8(PS_OUTPUT) FunctionCall 10(@main()
-              41:    7(fvec4) CompositeExtract 40 0
-                              Store 39(@entryPointOutput.Color) 41
+              43:8(PS_OUTPUT) FunctionCall 10(@main()
+              44:    7(fvec4) CompositeExtract 43 0
+                              Store 42(@entryPointOutput.Color) 44
                               Return
                               FunctionEnd
       10(@main():8(PS_OUTPUT) Function None 9
               11:             Label
          13(r00):     12(ptr) Variable Function
-         23(r01):     22(ptr) Variable Function
-       30(psout):     29(ptr) Variable Function
+         24(r01):     23(ptr) Variable Function
+       33(psout):     32(ptr) Variable Function
               17:          14 Load 16(g_tTex1df1)
-              20:    6(float) ImageRead 17 19
-                              Store 13(r00) 20
-              27:          24 Load 26(g_tBuf1du1)
-              28:     21(int) ImageRead 27 19
-                              Store 23(r01) 28
-              34:     33(ptr) AccessChain 30(psout) 19
-                              Store 34 32
-              35:8(PS_OUTPUT) Load 30(psout)
-                              ReturnValue 35
+              20:    7(fvec4) ImageRead 17 19
+              21:    6(float) CompositeExtract 20 0
+                              Store 13(r00) 21
+              28:          25 Load 27(g_tBuf1du1)
+              30:   29(ivec4) ImageRead 28 19
+              31:     22(int) CompositeExtract 30 0
+                              Store 24(r01) 31
+              37:     36(ptr) AccessChain 33(psout) 19
+                              Store 37 35
+              38:8(PS_OUTPUT) Load 33(psout)
+                              ReturnValue 38
                               FunctionEnd
diff --git a/third_party/vulkan-deps/glslang/src/Test/baseResults/hlsl.rw.scalar.bracket.frag.out b/third_party/vulkan-deps/glslang/src/Test/baseResults/hlsl.rw.scalar.bracket.frag.out
index e76d597..8e4716b 100644
--- a/third_party/vulkan-deps/glslang/src/Test/baseResults/hlsl.rw.scalar.bracket.frag.out
+++ b/third_party/vulkan-deps/glslang/src/Test/baseResults/hlsl.rw.scalar.bracket.frag.out
@@ -1689,16 +1689,15 @@
 0:?     'anon@0' (layout( row_major std140) uniform block{ uniform int c1,  uniform 2-component vector of int c2,  uniform 3-component vector of int c3,  uniform 4-component vector of int c4,  uniform int o1,  uniform 2-component vector of int o2,  uniform 3-component vector of int o3,  uniform 4-component vector of int o4,  uniform float uf1,  uniform int ui1,  uniform uint uu1})
 0:?     '@entryPointOutput.Color' (layout( location=0) out 4-component vector of float)
 
-Validation failed
 // Module Version 10000
 // Generated by (magic number): 8000a
-// Id's are bound by 571
+// Id's are bound by 607
 
                               Capability Shader
                               Capability Image1D
                1:             ExtInstImport  "GLSL.std.450"
                               MemoryModel Logical GLSL450
-                              EntryPoint Fragment 4  "main" 547
+                              EntryPoint Fragment 4  "main" 583
                               ExecutionMode 4 OriginUpperLeft
                               Source HLSL 500
                               Name 4  "main"
@@ -1732,101 +1731,101 @@
                               MemberName 59($Global) 10  "uu1"
                               Name 61  ""
                               Name 70  "g_tTex1df1"
-                              Name 75  "r00"
-                              Name 80  "r01"
-                              Name 83  "g_tTex1di1"
-                              Name 88  "r02"
-                              Name 91  "g_tTex1du1"
-                              Name 96  "r10"
-                              Name 99  "g_tTex2df1"
-                              Name 106  "r11"
-                              Name 109  "g_tTex2di1"
-                              Name 114  "r12"
-                              Name 117  "g_tTex2du1"
-                              Name 122  "r20"
-                              Name 125  "g_tTex3df1"
-                              Name 132  "r21"
-                              Name 135  "g_tTex3di1"
-                              Name 140  "r22"
-                              Name 143  "g_tTex3du1"
-                              Name 148  "lf1"
-                              Name 153  "storeTemp"
-                              Name 163  "storeTemp"
-                              Name 168  "storeTemp"
-                              Name 174  "val1"
-                              Name 175  "coordTemp"
-                              Name 178  "storeTemp"
-                              Name 189  "coordTemp"
-                              Name 192  "storeTemp"
-                              Name 202  "coordTemp"
-                              Name 205  "storeTemp"
+                              Name 76  "r00"
+                              Name 82  "r01"
+                              Name 85  "g_tTex1di1"
+                              Name 91  "r02"
+                              Name 94  "g_tTex1du1"
+                              Name 101  "r10"
+                              Name 104  "g_tTex2df1"
+                              Name 112  "r11"
+                              Name 115  "g_tTex2di1"
+                              Name 121  "r12"
+                              Name 124  "g_tTex2du1"
+                              Name 130  "r20"
+                              Name 133  "g_tTex3df1"
+                              Name 141  "r21"
+                              Name 144  "g_tTex3di1"
+                              Name 150  "r22"
+                              Name 153  "g_tTex3du1"
+                              Name 159  "lf1"
+                              Name 164  "storeTemp"
+                              Name 174  "storeTemp"
+                              Name 179  "storeTemp"
+                              Name 185  "val1"
+                              Name 186  "coordTemp"
+                              Name 189  "storeTemp"
+                              Name 201  "coordTemp"
+                              Name 204  "storeTemp"
                               Name 215  "coordTemp"
                               Name 218  "storeTemp"
-                              Name 227  "coordTemp"
-                              Name 230  "storeTemp"
-                              Name 239  "coordTemp"
-                              Name 242  "storeTemp"
-                              Name 252  "coordTemp"
-                              Name 255  "storeTemp"
-                              Name 265  "coordTemp"
-                              Name 268  "storeTemp"
-                              Name 277  "coordTemp"
-                              Name 280  "storeTemp"
-                              Name 289  "storeTemp"
+                              Name 229  "coordTemp"
+                              Name 232  "storeTemp"
+                              Name 242  "coordTemp"
+                              Name 245  "storeTemp"
+                              Name 255  "coordTemp"
+                              Name 258  "storeTemp"
+                              Name 269  "coordTemp"
+                              Name 272  "storeTemp"
+                              Name 283  "coordTemp"
+                              Name 286  "storeTemp"
+                              Name 296  "coordTemp"
                               Name 299  "storeTemp"
-                              Name 305  "storeTemp"
-                              Name 311  "storeTemp"
-                              Name 321  "storeTemp"
-                              Name 326  "storeTemp"
-                              Name 336  "param"
-                              Name 342  "param"
-                              Name 348  "param"
-                              Name 350  "tempArg"
-                              Name 351  "param"
-                              Name 358  "tempArg"
-                              Name 359  "param"
-                              Name 366  "tempArg"
-                              Name 367  "param"
-                              Name 374  "coordTemp"
-                              Name 377  "storeTemp"
-                              Name 387  "coordTemp"
-                              Name 390  "storeTemp"
-                              Name 399  "coordTemp"
-                              Name 402  "storeTemp"
+                              Name 309  "storeTemp"
+                              Name 319  "storeTemp"
+                              Name 325  "storeTemp"
+                              Name 331  "storeTemp"
+                              Name 341  "storeTemp"
+                              Name 346  "storeTemp"
+                              Name 357  "param"
+                              Name 364  "param"
+                              Name 371  "param"
+                              Name 373  "tempArg"
+                              Name 374  "param"
+                              Name 381  "tempArg"
+                              Name 382  "param"
+                              Name 389  "tempArg"
+                              Name 390  "param"
+                              Name 397  "coordTemp"
+                              Name 400  "storeTemp"
                               Name 411  "coordTemp"
                               Name 414  "storeTemp"
-                              Name 423  "coordTemp"
-                              Name 426  "storeTemp"
-                              Name 435  "coordTemp"
-                              Name 438  "storeTemp"
-                              Name 447  "coordTemp"
-                              Name 450  "storeTempPre"
-                              Name 454  "storeTempPost"
-                              Name 461  "coordTemp"
-                              Name 464  "storeTempPre"
-                              Name 468  "storeTempPost"
-                              Name 475  "coordTemp"
-                              Name 478  "storeTempPre"
-                              Name 482  "storeTempPost"
-                              Name 489  "coordTemp"
-                              Name 492  "storeTempPre"
-                              Name 496  "storeTempPost"
-                              Name 503  "coordTemp"
-                              Name 506  "storeTempPre"
-                              Name 510  "storeTempPost"
-                              Name 517  "coordTemp"
-                              Name 520  "storeTempPre"
-                              Name 524  "storeTempPost"
-                              Name 531  "storeTemp"
-                              Name 539  "psout"
-                              Name 547  "@entryPointOutput.Color"
-                              Name 552  "g_sSamp"
-                              Name 555  "g_tTex1df1a"
-                              Name 558  "g_tTex1di1a"
-                              Name 561  "g_tTex1du1a"
-                              Name 564  "g_tTex2df1a"
-                              Name 567  "g_tTex2di1a"
-                              Name 570  "g_tTex2du1a"
+                              Name 424  "coordTemp"
+                              Name 427  "storeTemp"
+                              Name 437  "coordTemp"
+                              Name 440  "storeTemp"
+                              Name 450  "coordTemp"
+                              Name 453  "storeTemp"
+                              Name 463  "coordTemp"
+                              Name 466  "storeTemp"
+                              Name 476  "coordTemp"
+                              Name 479  "storeTempPre"
+                              Name 484  "storeTempPost"
+                              Name 491  "coordTemp"
+                              Name 494  "storeTempPre"
+                              Name 499  "storeTempPost"
+                              Name 506  "coordTemp"
+                              Name 509  "storeTempPre"
+                              Name 514  "storeTempPost"
+                              Name 521  "coordTemp"
+                              Name 524  "storeTempPre"
+                              Name 529  "storeTempPost"
+                              Name 536  "coordTemp"
+                              Name 539  "storeTempPre"
+                              Name 544  "storeTempPost"
+                              Name 551  "coordTemp"
+                              Name 554  "storeTempPre"
+                              Name 559  "storeTempPost"
+                              Name 566  "storeTemp"
+                              Name 575  "psout"
+                              Name 583  "@entryPointOutput.Color"
+                              Name 588  "g_sSamp"
+                              Name 591  "g_tTex1df1a"
+                              Name 594  "g_tTex1di1a"
+                              Name 597  "g_tTex1du1a"
+                              Name 600  "g_tTex2df1a"
+                              Name 603  "g_tTex2di1a"
+                              Name 606  "g_tTex2du1a"
                               MemberDecorate 59($Global) 0 Offset 0
                               MemberDecorate 59($Global) 1 Offset 8
                               MemberDecorate 59($Global) 2 Offset 16
@@ -1843,37 +1842,37 @@
                               Decorate 61 Binding 10
                               Decorate 70(g_tTex1df1) DescriptorSet 0
                               Decorate 70(g_tTex1df1) Binding 1
-                              Decorate 83(g_tTex1di1) DescriptorSet 0
-                              Decorate 83(g_tTex1di1) Binding 2
-                              Decorate 91(g_tTex1du1) DescriptorSet 0
-                              Decorate 91(g_tTex1du1) Binding 3
-                              Decorate 99(g_tTex2df1) DescriptorSet 0
-                              Decorate 99(g_tTex2df1) Binding 4
-                              Decorate 109(g_tTex2di1) DescriptorSet 0
-                              Decorate 109(g_tTex2di1) Binding 5
-                              Decorate 117(g_tTex2du1) DescriptorSet 0
-                              Decorate 117(g_tTex2du1) Binding 6
-                              Decorate 125(g_tTex3df1) DescriptorSet 0
-                              Decorate 125(g_tTex3df1) Binding 7
-                              Decorate 135(g_tTex3di1) DescriptorSet 0
-                              Decorate 135(g_tTex3di1) Binding 8
-                              Decorate 143(g_tTex3du1) DescriptorSet 0
-                              Decorate 143(g_tTex3du1) Binding 9
-                              Decorate 547(@entryPointOutput.Color) Location 0
-                              Decorate 552(g_sSamp) DescriptorSet 0
-                              Decorate 552(g_sSamp) Binding 0
-                              Decorate 555(g_tTex1df1a) DescriptorSet 0
-                              Decorate 555(g_tTex1df1a) Binding 0
-                              Decorate 558(g_tTex1di1a) DescriptorSet 0
-                              Decorate 558(g_tTex1di1a) Binding 0
-                              Decorate 561(g_tTex1du1a) DescriptorSet 0
-                              Decorate 561(g_tTex1du1a) Binding 0
-                              Decorate 564(g_tTex2df1a) DescriptorSet 0
-                              Decorate 564(g_tTex2df1a) Binding 0
-                              Decorate 567(g_tTex2di1a) DescriptorSet 0
-                              Decorate 567(g_tTex2di1a) Binding 0
-                              Decorate 570(g_tTex2du1a) DescriptorSet 0
-                              Decorate 570(g_tTex2du1a) Binding 0
+                              Decorate 85(g_tTex1di1) DescriptorSet 0
+                              Decorate 85(g_tTex1di1) Binding 2
+                              Decorate 94(g_tTex1du1) DescriptorSet 0
+                              Decorate 94(g_tTex1du1) Binding 3
+                              Decorate 104(g_tTex2df1) DescriptorSet 0
+                              Decorate 104(g_tTex2df1) Binding 4
+                              Decorate 115(g_tTex2di1) DescriptorSet 0
+                              Decorate 115(g_tTex2di1) Binding 5
+                              Decorate 124(g_tTex2du1) DescriptorSet 0
+                              Decorate 124(g_tTex2du1) Binding 6
+                              Decorate 133(g_tTex3df1) DescriptorSet 0
+                              Decorate 133(g_tTex3df1) Binding 7
+                              Decorate 144(g_tTex3di1) DescriptorSet 0
+                              Decorate 144(g_tTex3di1) Binding 8
+                              Decorate 153(g_tTex3du1) DescriptorSet 0
+                              Decorate 153(g_tTex3du1) Binding 9
+                              Decorate 583(@entryPointOutput.Color) Location 0
+                              Decorate 588(g_sSamp) DescriptorSet 0
+                              Decorate 588(g_sSamp) Binding 0
+                              Decorate 591(g_tTex1df1a) DescriptorSet 0
+                              Decorate 591(g_tTex1df1a) Binding 0
+                              Decorate 594(g_tTex1di1a) DescriptorSet 0
+                              Decorate 594(g_tTex1di1a) Binding 0
+                              Decorate 597(g_tTex1du1a) DescriptorSet 0
+                              Decorate 597(g_tTex1du1a) Binding 0
+                              Decorate 600(g_tTex2df1a) DescriptorSet 0
+                              Decorate 600(g_tTex2df1a) Binding 0
+                              Decorate 603(g_tTex2di1a) DescriptorSet 0
+                              Decorate 603(g_tTex2di1a) Binding 0
+                              Decorate 606(g_tTex2du1a) DescriptorSet 0
+                              Decorate 606(g_tTex2du1a) Binding 0
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeInt 32 1
@@ -1905,79 +1904,80 @@
               68:             TypeImage 18(float) 1D nonsampled format:R32f
               69:             TypePointer UniformConstant 68
   70(g_tTex1df1):     69(ptr) Variable UniformConstant
-              81:             TypeImage 6(int) 1D nonsampled format:R32i
-              82:             TypePointer UniformConstant 81
-  83(g_tTex1di1):     82(ptr) Variable UniformConstant
-              89:             TypeImage 12(int) 1D nonsampled format:R32ui
-              90:             TypePointer UniformConstant 89
-  91(g_tTex1du1):     90(ptr) Variable UniformConstant
-              97:             TypeImage 18(float) 2D nonsampled format:R32f
-              98:             TypePointer UniformConstant 97
-  99(g_tTex2df1):     98(ptr) Variable UniformConstant
-             101:      6(int) Constant 1
-             102:             TypePointer Uniform 56(ivec2)
-             107:             TypeImage 6(int) 2D nonsampled format:R32i
-             108:             TypePointer UniformConstant 107
- 109(g_tTex2di1):    108(ptr) Variable UniformConstant
-             115:             TypeImage 12(int) 2D nonsampled format:R32ui
-             116:             TypePointer UniformConstant 115
- 117(g_tTex2du1):    116(ptr) Variable UniformConstant
-             123:             TypeImage 18(float) 3D nonsampled format:R32f
-             124:             TypePointer UniformConstant 123
- 125(g_tTex3df1):    124(ptr) Variable UniformConstant
-             127:      6(int) Constant 2
-             128:             TypePointer Uniform 57(ivec3)
-             133:             TypeImage 6(int) 3D nonsampled format:R32i
-             134:             TypePointer UniformConstant 133
- 135(g_tTex3di1):    134(ptr) Variable UniformConstant
-             141:             TypeImage 12(int) 3D nonsampled format:R32ui
-             142:             TypePointer UniformConstant 141
- 143(g_tTex3du1):    142(ptr) Variable UniformConstant
-             149:      6(int) Constant 8
-             150:             TypePointer Uniform 18(float)
-             169:     12(int) Constant 3
-             182:   18(float) Constant 1073741824
-             196:   18(float) Constant 1077936128
-             209:   18(float) Constant 1082130432
-             246:      6(int) Constant 65535
-             259:      6(int) Constant 61680
-             300:      6(int) Constant 5
-             306:     12(int) Constant 6
-             327:     12(int) Constant 9
-             382:   18(float) Constant 1065353216
-             533:      6(int) Constant 3
-             534:   56(ivec2) ConstantComposite 127 533
-             538:             TypePointer Function 40(PS_OUTPUT)
-             540:   39(fvec4) ConstantComposite 382 382 382 382
-             541:             TypePointer Function 39(fvec4)
-             546:             TypePointer Output 39(fvec4)
-547(@entryPointOutput.Color):    546(ptr) Variable Output
-             550:             TypeSampler
-             551:             TypePointer UniformConstant 550
-    552(g_sSamp):    551(ptr) Variable UniformConstant
-             553:             TypeImage 18(float) 1D array nonsampled format:R32f
-             554:             TypePointer UniformConstant 553
-555(g_tTex1df1a):    554(ptr) Variable UniformConstant
-             556:             TypeImage 6(int) 1D array nonsampled format:R32i
-             557:             TypePointer UniformConstant 556
-558(g_tTex1di1a):    557(ptr) Variable UniformConstant
-             559:             TypeImage 12(int) 1D array nonsampled format:R32ui
-             560:             TypePointer UniformConstant 559
-561(g_tTex1du1a):    560(ptr) Variable UniformConstant
-             562:             TypeImage 18(float) 2D array nonsampled format:R32f
-             563:             TypePointer UniformConstant 562
-564(g_tTex2df1a):    563(ptr) Variable UniformConstant
-             565:             TypeImage 6(int) 2D array nonsampled format:R32i
-             566:             TypePointer UniformConstant 565
-567(g_tTex2di1a):    566(ptr) Variable UniformConstant
-             568:             TypeImage 12(int) 2D array nonsampled format:R32ui
-             569:             TypePointer UniformConstant 568
-570(g_tTex2du1a):    569(ptr) Variable UniformConstant
+              83:             TypeImage 6(int) 1D nonsampled format:R32i
+              84:             TypePointer UniformConstant 83
+  85(g_tTex1di1):     84(ptr) Variable UniformConstant
+              92:             TypeImage 12(int) 1D nonsampled format:R32ui
+              93:             TypePointer UniformConstant 92
+  94(g_tTex1du1):     93(ptr) Variable UniformConstant
+              98:             TypeVector 12(int) 4
+             102:             TypeImage 18(float) 2D nonsampled format:R32f
+             103:             TypePointer UniformConstant 102
+ 104(g_tTex2df1):    103(ptr) Variable UniformConstant
+             106:      6(int) Constant 1
+             107:             TypePointer Uniform 56(ivec2)
+             113:             TypeImage 6(int) 2D nonsampled format:R32i
+             114:             TypePointer UniformConstant 113
+ 115(g_tTex2di1):    114(ptr) Variable UniformConstant
+             122:             TypeImage 12(int) 2D nonsampled format:R32ui
+             123:             TypePointer UniformConstant 122
+ 124(g_tTex2du1):    123(ptr) Variable UniformConstant
+             131:             TypeImage 18(float) 3D nonsampled format:R32f
+             132:             TypePointer UniformConstant 131
+ 133(g_tTex3df1):    132(ptr) Variable UniformConstant
+             135:      6(int) Constant 2
+             136:             TypePointer Uniform 57(ivec3)
+             142:             TypeImage 6(int) 3D nonsampled format:R32i
+             143:             TypePointer UniformConstant 142
+ 144(g_tTex3di1):    143(ptr) Variable UniformConstant
+             151:             TypeImage 12(int) 3D nonsampled format:R32ui
+             152:             TypePointer UniformConstant 151
+ 153(g_tTex3du1):    152(ptr) Variable UniformConstant
+             160:      6(int) Constant 8
+             161:             TypePointer Uniform 18(float)
+             180:     12(int) Constant 3
+             194:   18(float) Constant 1073741824
+             209:   18(float) Constant 1077936128
+             223:   18(float) Constant 1082130432
+             263:      6(int) Constant 65535
+             277:      6(int) Constant 61680
+             320:      6(int) Constant 5
+             326:     12(int) Constant 6
+             347:     12(int) Constant 9
+             406:   18(float) Constant 1065353216
+             568:      6(int) Constant 3
+             569:   56(ivec2) ConstantComposite 135 568
+             574:             TypePointer Function 40(PS_OUTPUT)
+             576:   39(fvec4) ConstantComposite 406 406 406 406
+             577:             TypePointer Function 39(fvec4)
+             582:             TypePointer Output 39(fvec4)
+583(@entryPointOutput.Color):    582(ptr) Variable Output
+             586:             TypeSampler
+             587:             TypePointer UniformConstant 586
+    588(g_sSamp):    587(ptr) Variable UniformConstant
+             589:             TypeImage 18(float) 1D array nonsampled format:R32f
+             590:             TypePointer UniformConstant 589
+591(g_tTex1df1a):    590(ptr) Variable UniformConstant
+             592:             TypeImage 6(int) 1D array nonsampled format:R32i
+             593:             TypePointer UniformConstant 592
+594(g_tTex1di1a):    593(ptr) Variable UniformConstant
+             595:             TypeImage 12(int) 1D array nonsampled format:R32ui
+             596:             TypePointer UniformConstant 595
+597(g_tTex1du1a):    596(ptr) Variable UniformConstant
+             598:             TypeImage 18(float) 2D array nonsampled format:R32f
+             599:             TypePointer UniformConstant 598
+600(g_tTex2df1a):    599(ptr) Variable UniformConstant
+             601:             TypeImage 6(int) 2D array nonsampled format:R32i
+             602:             TypePointer UniformConstant 601
+603(g_tTex2di1a):    602(ptr) Variable UniformConstant
+             604:             TypeImage 12(int) 2D array nonsampled format:R32ui
+             605:             TypePointer UniformConstant 604
+606(g_tTex2du1a):    605(ptr) Variable UniformConstant
          4(main):           2 Function None 3
                5:             Label
-             548:40(PS_OUTPUT) FunctionCall 42(@main()
-             549:   39(fvec4) CompositeExtract 548 0
-                              Store 547(@entryPointOutput.Color) 549
+             584:40(PS_OUTPUT) FunctionCall 42(@main()
+             585:   39(fvec4) CompositeExtract 584 0
+                              Store 583(@entryPointOutput.Color) 585
                               Return
                               FunctionEnd
      10(Fn1(i1;):      6(int) Function None 8
@@ -2025,567 +2025,602 @@
                               FunctionEnd
       42(@main():40(PS_OUTPUT) Function None 41
               43:             Label
-         75(r00):     19(ptr) Variable Function
-         80(r01):      7(ptr) Variable Function
-         88(r02):     13(ptr) Variable Function
-         96(r10):     19(ptr) Variable Function
-        106(r11):      7(ptr) Variable Function
-        114(r12):     13(ptr) Variable Function
-        122(r20):     19(ptr) Variable Function
-        132(r21):      7(ptr) Variable Function
-        140(r22):     13(ptr) Variable Function
-        148(lf1):     19(ptr) Variable Function
-  153(storeTemp):     19(ptr) Variable Function
-  163(storeTemp):      7(ptr) Variable Function
-  168(storeTemp):     13(ptr) Variable Function
-       174(val1):     19(ptr) Variable Function
-  175(coordTemp):      7(ptr) Variable Function
-  178(storeTemp):     19(ptr) Variable Function
-  189(coordTemp):      7(ptr) Variable Function
-  192(storeTemp):     19(ptr) Variable Function
-  202(coordTemp):      7(ptr) Variable Function
-  205(storeTemp):     19(ptr) Variable Function
+         76(r00):     19(ptr) Variable Function
+         82(r01):      7(ptr) Variable Function
+         91(r02):     13(ptr) Variable Function
+        101(r10):     19(ptr) Variable Function
+        112(r11):      7(ptr) Variable Function
+        121(r12):     13(ptr) Variable Function
+        130(r20):     19(ptr) Variable Function
+        141(r21):      7(ptr) Variable Function
+        150(r22):     13(ptr) Variable Function
+        159(lf1):     19(ptr) Variable Function
+  164(storeTemp):     19(ptr) Variable Function
+  174(storeTemp):      7(ptr) Variable Function
+  179(storeTemp):     13(ptr) Variable Function
+       185(val1):     19(ptr) Variable Function
+  186(coordTemp):      7(ptr) Variable Function
+  189(storeTemp):     19(ptr) Variable Function
+  201(coordTemp):      7(ptr) Variable Function
+  204(storeTemp):     19(ptr) Variable Function
   215(coordTemp):      7(ptr) Variable Function
-  218(storeTemp):      7(ptr) Variable Function
-  227(coordTemp):      7(ptr) Variable Function
-  230(storeTemp):      7(ptr) Variable Function
-  239(coordTemp):      7(ptr) Variable Function
-  242(storeTemp):      7(ptr) Variable Function
-  252(coordTemp):      7(ptr) Variable Function
-  255(storeTemp):      7(ptr) Variable Function
-  265(coordTemp):      7(ptr) Variable Function
-  268(storeTemp):      7(ptr) Variable Function
-  277(coordTemp):      7(ptr) Variable Function
-  280(storeTemp):      7(ptr) Variable Function
-  289(storeTemp):     19(ptr) Variable Function
+  218(storeTemp):     19(ptr) Variable Function
+  229(coordTemp):      7(ptr) Variable Function
+  232(storeTemp):      7(ptr) Variable Function
+  242(coordTemp):      7(ptr) Variable Function
+  245(storeTemp):      7(ptr) Variable Function
+  255(coordTemp):      7(ptr) Variable Function
+  258(storeTemp):      7(ptr) Variable Function
+  269(coordTemp):      7(ptr) Variable Function
+  272(storeTemp):      7(ptr) Variable Function
+  283(coordTemp):      7(ptr) Variable Function
+  286(storeTemp):      7(ptr) Variable Function
+  296(coordTemp):      7(ptr) Variable Function
   299(storeTemp):      7(ptr) Variable Function
-  305(storeTemp):     13(ptr) Variable Function
-  311(storeTemp):     19(ptr) Variable Function
-  321(storeTemp):      7(ptr) Variable Function
-  326(storeTemp):     13(ptr) Variable Function
-      336(param):     19(ptr) Variable Function
-      342(param):      7(ptr) Variable Function
-      348(param):     13(ptr) Variable Function
-    350(tempArg):     19(ptr) Variable Function
-      351(param):     19(ptr) Variable Function
-    358(tempArg):      7(ptr) Variable Function
-      359(param):      7(ptr) Variable Function
-    366(tempArg):     13(ptr) Variable Function
-      367(param):     13(ptr) Variable Function
-  374(coordTemp):      7(ptr) Variable Function
-  377(storeTemp):     19(ptr) Variable Function
-  387(coordTemp):      7(ptr) Variable Function
-  390(storeTemp):      7(ptr) Variable Function
-  399(coordTemp):      7(ptr) Variable Function
-  402(storeTemp):     13(ptr) Variable Function
+  309(storeTemp):     19(ptr) Variable Function
+  319(storeTemp):      7(ptr) Variable Function
+  325(storeTemp):     13(ptr) Variable Function
+  331(storeTemp):     19(ptr) Variable Function
+  341(storeTemp):      7(ptr) Variable Function
+  346(storeTemp):     13(ptr) Variable Function
+      357(param):     19(ptr) Variable Function
+      364(param):      7(ptr) Variable Function
+      371(param):     13(ptr) Variable Function
+    373(tempArg):     19(ptr) Variable Function
+      374(param):     19(ptr) Variable Function
+    381(tempArg):      7(ptr) Variable Function
+      382(param):      7(ptr) Variable Function
+    389(tempArg):     13(ptr) Variable Function
+      390(param):     13(ptr) Variable Function
+  397(coordTemp):      7(ptr) Variable Function
+  400(storeTemp):     19(ptr) Variable Function
   411(coordTemp):      7(ptr) Variable Function
-  414(storeTemp):     19(ptr) Variable Function
-  423(coordTemp):      7(ptr) Variable Function
-  426(storeTemp):      7(ptr) Variable Function
-  435(coordTemp):      7(ptr) Variable Function
-  438(storeTemp):     13(ptr) Variable Function
-  447(coordTemp):      7(ptr) Variable Function
-450(storeTempPre):     19(ptr) Variable Function
-454(storeTempPost):     19(ptr) Variable Function
-  461(coordTemp):      7(ptr) Variable Function
-464(storeTempPre):     13(ptr) Variable Function
-468(storeTempPost):     13(ptr) Variable Function
-  475(coordTemp):      7(ptr) Variable Function
-478(storeTempPre):      7(ptr) Variable Function
-482(storeTempPost):      7(ptr) Variable Function
-  489(coordTemp):      7(ptr) Variable Function
-492(storeTempPre):     19(ptr) Variable Function
-496(storeTempPost):     19(ptr) Variable Function
-  503(coordTemp):      7(ptr) Variable Function
-506(storeTempPre):      7(ptr) Variable Function
-510(storeTempPost):      7(ptr) Variable Function
-  517(coordTemp):      7(ptr) Variable Function
-520(storeTempPre):     13(ptr) Variable Function
-524(storeTempPost):     13(ptr) Variable Function
-  531(storeTemp):     19(ptr) Variable Function
-      539(psout):    538(ptr) Variable Function
+  414(storeTemp):      7(ptr) Variable Function
+  424(coordTemp):      7(ptr) Variable Function
+  427(storeTemp):     13(ptr) Variable Function
+  437(coordTemp):      7(ptr) Variable Function
+  440(storeTemp):     19(ptr) Variable Function
+  450(coordTemp):      7(ptr) Variable Function
+  453(storeTemp):      7(ptr) Variable Function
+  463(coordTemp):      7(ptr) Variable Function
+  466(storeTemp):     13(ptr) Variable Function
+  476(coordTemp):      7(ptr) Variable Function
+479(storeTempPre):     19(ptr) Variable Function
+484(storeTempPost):     19(ptr) Variable Function
+  491(coordTemp):      7(ptr) Variable Function
+494(storeTempPre):     13(ptr) Variable Function
+499(storeTempPost):     13(ptr) Variable Function
+  506(coordTemp):      7(ptr) Variable Function
+509(storeTempPre):      7(ptr) Variable Function
+514(storeTempPost):      7(ptr) Variable Function
+  521(coordTemp):      7(ptr) Variable Function
+524(storeTempPre):     19(ptr) Variable Function
+529(storeTempPost):     19(ptr) Variable Function
+  536(coordTemp):      7(ptr) Variable Function
+539(storeTempPre):      7(ptr) Variable Function
+544(storeTempPost):      7(ptr) Variable Function
+  551(coordTemp):      7(ptr) Variable Function
+554(storeTempPre):     13(ptr) Variable Function
+559(storeTempPost):     13(ptr) Variable Function
+  566(storeTemp):     19(ptr) Variable Function
+      575(psout):    574(ptr) Variable Function
               71:          68 Load 70(g_tTex1df1)
               72:     62(ptr) AccessChain 61 53
               73:      6(int) Load 72
-              74:   18(float) ImageRead 71 73
-              76:          68 Load 70(g_tTex1df1)
-              77:     62(ptr) AccessChain 61 53
-              78:      6(int) Load 77
-              79:   18(float) ImageRead 76 78
-                              Store 75(r00) 79
-              84:          81 Load 83(g_tTex1di1)
-              85:     62(ptr) AccessChain 61 53
-              86:      6(int) Load 85
-              87:      6(int) ImageRead 84 86
-                              Store 80(r01) 87
-              92:          89 Load 91(g_tTex1du1)
-              93:     62(ptr) AccessChain 61 53
-              94:      6(int) Load 93
-              95:     12(int) ImageRead 92 94
-                              Store 88(r02) 95
-             100:          97 Load 99(g_tTex2df1)
-             103:    102(ptr) AccessChain 61 101
-             104:   56(ivec2) Load 103
-             105:   18(float) ImageRead 100 104
-                              Store 96(r10) 105
-             110:         107 Load 109(g_tTex2di1)
-             111:    102(ptr) AccessChain 61 101
-             112:   56(ivec2) Load 111
-             113:      6(int) ImageRead 110 112
-                              Store 106(r11) 113
-             118:         115 Load 117(g_tTex2du1)
-             119:    102(ptr) AccessChain 61 101
-             120:   56(ivec2) Load 119
-             121:     12(int) ImageRead 118 120
-                              Store 114(r12) 121
-             126:         123 Load 125(g_tTex3df1)
-             129:    128(ptr) AccessChain 61 127
-             130:   57(ivec3) Load 129
-             131:   18(float) ImageRead 126 130
-                              Store 122(r20) 131
-             136:         133 Load 135(g_tTex3di1)
-             137:    128(ptr) AccessChain 61 127
+              74:   39(fvec4) ImageRead 71 73
+              75:   18(float) CompositeExtract 74 0
+              77:          68 Load 70(g_tTex1df1)
+              78:     62(ptr) AccessChain 61 53
+              79:      6(int) Load 78
+              80:   39(fvec4) ImageRead 77 79
+              81:   18(float) CompositeExtract 80 0
+                              Store 76(r00) 81
+              86:          83 Load 85(g_tTex1di1)
+              87:     62(ptr) AccessChain 61 53
+              88:      6(int) Load 87
+              89:   58(ivec4) ImageRead 86 88
+              90:      6(int) CompositeExtract 89 0
+                              Store 82(r01) 90
+              95:          92 Load 94(g_tTex1du1)
+              96:     62(ptr) AccessChain 61 53
+              97:      6(int) Load 96
+              99:   98(ivec4) ImageRead 95 97
+             100:     12(int) CompositeExtract 99 0
+                              Store 91(r02) 100
+             105:         102 Load 104(g_tTex2df1)
+             108:    107(ptr) AccessChain 61 106
+             109:   56(ivec2) Load 108
+             110:   39(fvec4) ImageRead 105 109
+             111:   18(float) CompositeExtract 110 0
+                              Store 101(r10) 111
+             116:         113 Load 115(g_tTex2di1)
+             117:    107(ptr) AccessChain 61 106
+             118:   56(ivec2) Load 117
+             119:   58(ivec4) ImageRead 116 118
+             120:      6(int) CompositeExtract 119 0
+                              Store 112(r11) 120
+             125:         122 Load 124(g_tTex2du1)
+             126:    107(ptr) AccessChain 61 106
+             127:   56(ivec2) Load 126
+             128:   98(ivec4) ImageRead 125 127
+             129:     12(int) CompositeExtract 128 0
+                              Store 121(r12) 129
+             134:         131 Load 133(g_tTex3df1)
+             137:    136(ptr) AccessChain 61 135
              138:   57(ivec3) Load 137
-             139:      6(int) ImageRead 136 138
-                              Store 132(r21) 139
-             144:         141 Load 143(g_tTex3du1)
-             145:    128(ptr) AccessChain 61 127
-             146:   57(ivec3) Load 145
-             147:     12(int) ImageRead 144 146
-                              Store 140(r22) 147
-             151:    150(ptr) AccessChain 61 149
-             152:   18(float) Load 151
-                              Store 148(lf1) 152
-             154:   18(float) FunctionCall 37(SomeValue()
-                              Store 153(storeTemp) 154
-             155:          68 Load 70(g_tTex1df1)
-             156:     62(ptr) AccessChain 61 53
-             157:      6(int) Load 156
-             158:   18(float) Load 153(storeTemp)
-                              ImageWrite 155 157 158
-             159:          68 Load 70(g_tTex1df1)
-             160:     62(ptr) AccessChain 61 53
-             161:      6(int) Load 160
-             162:   18(float) Load 148(lf1)
-                              ImageWrite 159 161 162
-                              Store 163(storeTemp) 127
-             164:          81 Load 83(g_tTex1di1)
-             165:     62(ptr) AccessChain 61 53
-             166:      6(int) Load 165
-             167:      6(int) Load 163(storeTemp)
-                              ImageWrite 164 166 167
-                              Store 168(storeTemp) 169
-             170:          89 Load 91(g_tTex1du1)
+             139:   39(fvec4) ImageRead 134 138
+             140:   18(float) CompositeExtract 139 0
+                              Store 130(r20) 140
+             145:         142 Load 144(g_tTex3di1)
+             146:    136(ptr) AccessChain 61 135
+             147:   57(ivec3) Load 146
+             148:   58(ivec4) ImageRead 145 147
+             149:      6(int) CompositeExtract 148 0
+                              Store 141(r21) 149
+             154:         151 Load 153(g_tTex3du1)
+             155:    136(ptr) AccessChain 61 135
+             156:   57(ivec3) Load 155
+             157:   98(ivec4) ImageRead 154 156
+             158:     12(int) CompositeExtract 157 0
+                              Store 150(r22) 158
+             162:    161(ptr) AccessChain 61 160
+             163:   18(float) Load 162
+                              Store 159(lf1) 163
+             165:   18(float) FunctionCall 37(SomeValue()
+                              Store 164(storeTemp) 165
+             166:          68 Load 70(g_tTex1df1)
+             167:     62(ptr) AccessChain 61 53
+             168:      6(int) Load 167
+             169:   18(float) Load 164(storeTemp)
+                              ImageWrite 166 168 169
+             170:          68 Load 70(g_tTex1df1)
              171:     62(ptr) AccessChain 61 53
              172:      6(int) Load 171
-             173:     12(int) Load 168(storeTemp)
+             173:   18(float) Load 159(lf1)
                               ImageWrite 170 172 173
+                              Store 174(storeTemp) 135
+             175:          83 Load 85(g_tTex1di1)
              176:     62(ptr) AccessChain 61 53
              177:      6(int) Load 176
-                              Store 175(coordTemp) 177
-             179:          68 Load 70(g_tTex1df1)
-             180:      6(int) Load 175(coordTemp)
-             181:   18(float) ImageRead 179 180
-                              Store 178(storeTemp) 181
-             183:   18(float) Load 178(storeTemp)
-             184:   18(float) FMul 183 182
-                              Store 178(storeTemp) 184
-             185:          68 Load 70(g_tTex1df1)
-             186:      6(int) Load 175(coordTemp)
-             187:   18(float) Load 178(storeTemp)
-                              ImageWrite 185 186 187
-             188:   18(float) Load 178(storeTemp)
-                              Store 174(val1) 188
-             190:     62(ptr) AccessChain 61 53
-             191:      6(int) Load 190
-                              Store 189(coordTemp) 191
-             193:          68 Load 70(g_tTex1df1)
-             194:      6(int) Load 189(coordTemp)
-             195:   18(float) ImageRead 193 194
-                              Store 192(storeTemp) 195
-             197:   18(float) Load 192(storeTemp)
-             198:   18(float) FSub 197 196
-                              Store 192(storeTemp) 198
-             199:          68 Load 70(g_tTex1df1)
-             200:      6(int) Load 189(coordTemp)
-             201:   18(float) Load 192(storeTemp)
-                              ImageWrite 199 200 201
-             203:     62(ptr) AccessChain 61 53
-             204:      6(int) Load 203
-                              Store 202(coordTemp) 204
-             206:          68 Load 70(g_tTex1df1)
-             207:      6(int) Load 202(coordTemp)
-             208:   18(float) ImageRead 206 207
-                              Store 205(storeTemp) 208
-             210:   18(float) Load 205(storeTemp)
-             211:   18(float) FAdd 210 209
-                              Store 205(storeTemp) 211
+             178:      6(int) Load 174(storeTemp)
+                              ImageWrite 175 177 178
+                              Store 179(storeTemp) 180
+             181:          92 Load 94(g_tTex1du1)
+             182:     62(ptr) AccessChain 61 53
+             183:      6(int) Load 182
+             184:     12(int) Load 179(storeTemp)
+                              ImageWrite 181 183 184
+             187:     62(ptr) AccessChain 61 53
+             188:      6(int) Load 187
+                              Store 186(coordTemp) 188
+             190:          68 Load 70(g_tTex1df1)
+             191:      6(int) Load 186(coordTemp)
+             192:   39(fvec4) ImageRead 190 191
+             193:   18(float) CompositeExtract 192 0
+                              Store 189(storeTemp) 193
+             195:   18(float) Load 189(storeTemp)
+             196:   18(float) FMul 195 194
+                              Store 189(storeTemp) 196
+             197:          68 Load 70(g_tTex1df1)
+             198:      6(int) Load 186(coordTemp)
+             199:   18(float) Load 189(storeTemp)
+                              ImageWrite 197 198 199
+             200:   18(float) Load 189(storeTemp)
+                              Store 185(val1) 200
+             202:     62(ptr) AccessChain 61 53
+             203:      6(int) Load 202
+                              Store 201(coordTemp) 203
+             205:          68 Load 70(g_tTex1df1)
+             206:      6(int) Load 201(coordTemp)
+             207:   39(fvec4) ImageRead 205 206
+             208:   18(float) CompositeExtract 207 0
+                              Store 204(storeTemp) 208
+             210:   18(float) Load 204(storeTemp)
+             211:   18(float) FSub 210 209
+                              Store 204(storeTemp) 211
              212:          68 Load 70(g_tTex1df1)
-             213:      6(int) Load 202(coordTemp)
-             214:   18(float) Load 205(storeTemp)
+             213:      6(int) Load 201(coordTemp)
+             214:   18(float) Load 204(storeTemp)
                               ImageWrite 212 213 214
              216:     62(ptr) AccessChain 61 53
              217:      6(int) Load 216
                               Store 215(coordTemp) 217
-             219:          81 Load 83(g_tTex1di1)
+             219:          68 Load 70(g_tTex1df1)
              220:      6(int) Load 215(coordTemp)
-             221:      6(int) ImageRead 219 220
-                              Store 218(storeTemp) 221
-             222:      6(int) Load 218(storeTemp)
-             223:      6(int) SDiv 222 127
-                              Store 218(storeTemp) 223
-             224:          81 Load 83(g_tTex1di1)
-             225:      6(int) Load 215(coordTemp)
-             226:      6(int) Load 218(storeTemp)
-                              ImageWrite 224 225 226
-             228:     62(ptr) AccessChain 61 53
-             229:      6(int) Load 228
-                              Store 227(coordTemp) 229
-             231:          81 Load 83(g_tTex1di1)
-             232:      6(int) Load 227(coordTemp)
-             233:      6(int) ImageRead 231 232
-                              Store 230(storeTemp) 233
-             234:      6(int) Load 230(storeTemp)
-             235:      6(int) SMod 234 127
-                              Store 230(storeTemp) 235
-             236:          81 Load 83(g_tTex1di1)
-             237:      6(int) Load 227(coordTemp)
-             238:      6(int) Load 230(storeTemp)
-                              ImageWrite 236 237 238
-             240:     62(ptr) AccessChain 61 53
-             241:      6(int) Load 240
-                              Store 239(coordTemp) 241
-             243:          81 Load 83(g_tTex1di1)
-             244:      6(int) Load 239(coordTemp)
-             245:      6(int) ImageRead 243 244
-                              Store 242(storeTemp) 245
-             247:      6(int) Load 242(storeTemp)
-             248:      6(int) BitwiseAnd 247 246
-                              Store 242(storeTemp) 248
-             249:          81 Load 83(g_tTex1di1)
-             250:      6(int) Load 239(coordTemp)
-             251:      6(int) Load 242(storeTemp)
-                              ImageWrite 249 250 251
-             253:     62(ptr) AccessChain 61 53
-             254:      6(int) Load 253
-                              Store 252(coordTemp) 254
-             256:          81 Load 83(g_tTex1di1)
-             257:      6(int) Load 252(coordTemp)
-             258:      6(int) ImageRead 256 257
-                              Store 255(storeTemp) 258
-             260:      6(int) Load 255(storeTemp)
-             261:      6(int) BitwiseOr 260 259
-                              Store 255(storeTemp) 261
-             262:          81 Load 83(g_tTex1di1)
-             263:      6(int) Load 252(coordTemp)
-             264:      6(int) Load 255(storeTemp)
-                              ImageWrite 262 263 264
-             266:     62(ptr) AccessChain 61 53
-             267:      6(int) Load 266
-                              Store 265(coordTemp) 267
-             269:          81 Load 83(g_tTex1di1)
-             270:      6(int) Load 265(coordTemp)
-             271:      6(int) ImageRead 269 270
-                              Store 268(storeTemp) 271
-             272:      6(int) Load 268(storeTemp)
-             273:      6(int) ShiftLeftLogical 272 127
-                              Store 268(storeTemp) 273
-             274:          81 Load 83(g_tTex1di1)
-             275:      6(int) Load 265(coordTemp)
-             276:      6(int) Load 268(storeTemp)
-                              ImageWrite 274 275 276
-             278:     62(ptr) AccessChain 61 53
-             279:      6(int) Load 278
-                              Store 277(coordTemp) 279
-             281:          81 Load 83(g_tTex1di1)
-             282:      6(int) Load 277(coordTemp)
-             283:      6(int) ImageRead 281 282
-                              Store 280(storeTemp) 283
-             284:      6(int) Load 280(storeTemp)
-             285:      6(int) ShiftRightArithmetic 284 127
-                              Store 280(storeTemp) 285
-             286:          81 Load 83(g_tTex1di1)
-             287:      6(int) Load 277(coordTemp)
-             288:      6(int) Load 280(storeTemp)
-                              ImageWrite 286 287 288
-             290:   18(float) FunctionCall 37(SomeValue()
-                              Store 289(storeTemp) 290
-             291:          97 Load 99(g_tTex2df1)
-             292:    102(ptr) AccessChain 61 101
-             293:   56(ivec2) Load 292
-             294:   18(float) Load 289(storeTemp)
-                              ImageWrite 291 293 294
-             295:          97 Load 99(g_tTex2df1)
-             296:    102(ptr) AccessChain 61 101
-             297:   56(ivec2) Load 296
-             298:   18(float) Load 148(lf1)
-                              ImageWrite 295 297 298
-                              Store 299(storeTemp) 300
-             301:         107 Load 109(g_tTex2di1)
-             302:    102(ptr) AccessChain 61 101
-             303:   56(ivec2) Load 302
+             221:   39(fvec4) ImageRead 219 220
+             222:   18(float) CompositeExtract 221 0
+                              Store 218(storeTemp) 222
+             224:   18(float) Load 218(storeTemp)
+             225:   18(float) FAdd 224 223
+                              Store 218(storeTemp) 225
+             226:          68 Load 70(g_tTex1df1)
+             227:      6(int) Load 215(coordTemp)
+             228:   18(float) Load 218(storeTemp)
+                              ImageWrite 226 227 228
+             230:     62(ptr) AccessChain 61 53
+             231:      6(int) Load 230
+                              Store 229(coordTemp) 231
+             233:          83 Load 85(g_tTex1di1)
+             234:      6(int) Load 229(coordTemp)
+             235:   58(ivec4) ImageRead 233 234
+             236:      6(int) CompositeExtract 235 0
+                              Store 232(storeTemp) 236
+             237:      6(int) Load 232(storeTemp)
+             238:      6(int) SDiv 237 135
+                              Store 232(storeTemp) 238
+             239:          83 Load 85(g_tTex1di1)
+             240:      6(int) Load 229(coordTemp)
+             241:      6(int) Load 232(storeTemp)
+                              ImageWrite 239 240 241
+             243:     62(ptr) AccessChain 61 53
+             244:      6(int) Load 243
+                              Store 242(coordTemp) 244
+             246:          83 Load 85(g_tTex1di1)
+             247:      6(int) Load 242(coordTemp)
+             248:   58(ivec4) ImageRead 246 247
+             249:      6(int) CompositeExtract 248 0
+                              Store 245(storeTemp) 249
+             250:      6(int) Load 245(storeTemp)
+             251:      6(int) SMod 250 135
+                              Store 245(storeTemp) 251
+             252:          83 Load 85(g_tTex1di1)
+             253:      6(int) Load 242(coordTemp)
+             254:      6(int) Load 245(storeTemp)
+                              ImageWrite 252 253 254
+             256:     62(ptr) AccessChain 61 53
+             257:      6(int) Load 256
+                              Store 255(coordTemp) 257
+             259:          83 Load 85(g_tTex1di1)
+             260:      6(int) Load 255(coordTemp)
+             261:   58(ivec4) ImageRead 259 260
+             262:      6(int) CompositeExtract 261 0
+                              Store 258(storeTemp) 262
+             264:      6(int) Load 258(storeTemp)
+             265:      6(int) BitwiseAnd 264 263
+                              Store 258(storeTemp) 265
+             266:          83 Load 85(g_tTex1di1)
+             267:      6(int) Load 255(coordTemp)
+             268:      6(int) Load 258(storeTemp)
+                              ImageWrite 266 267 268
+             270:     62(ptr) AccessChain 61 53
+             271:      6(int) Load 270
+                              Store 269(coordTemp) 271
+             273:          83 Load 85(g_tTex1di1)
+             274:      6(int) Load 269(coordTemp)
+             275:   58(ivec4) ImageRead 273 274
+             276:      6(int) CompositeExtract 275 0
+                              Store 272(storeTemp) 276
+             278:      6(int) Load 272(storeTemp)
+             279:      6(int) BitwiseOr 278 277
+                              Store 272(storeTemp) 279
+             280:          83 Load 85(g_tTex1di1)
+             281:      6(int) Load 269(coordTemp)
+             282:      6(int) Load 272(storeTemp)
+                              ImageWrite 280 281 282
+             284:     62(ptr) AccessChain 61 53
+             285:      6(int) Load 284
+                              Store 283(coordTemp) 285
+             287:          83 Load 85(g_tTex1di1)
+             288:      6(int) Load 283(coordTemp)
+             289:   58(ivec4) ImageRead 287 288
+             290:      6(int) CompositeExtract 289 0
+                              Store 286(storeTemp) 290
+             291:      6(int) Load 286(storeTemp)
+             292:      6(int) ShiftLeftLogical 291 135
+                              Store 286(storeTemp) 292
+             293:          83 Load 85(g_tTex1di1)
+             294:      6(int) Load 283(coordTemp)
+             295:      6(int) Load 286(storeTemp)
+                              ImageWrite 293 294 295
+             297:     62(ptr) AccessChain 61 53
+             298:      6(int) Load 297
+                              Store 296(coordTemp) 298
+             300:          83 Load 85(g_tTex1di1)
+             301:      6(int) Load 296(coordTemp)
+             302:   58(ivec4) ImageRead 300 301
+             303:      6(int) CompositeExtract 302 0
+                              Store 299(storeTemp) 303
              304:      6(int) Load 299(storeTemp)
-                              ImageWrite 301 303 304
-                              Store 305(storeTemp) 306
-             307:         115 Load 117(g_tTex2du1)
-             308:    102(ptr) AccessChain 61 101
-             309:   56(ivec2) Load 308
-             310:     12(int) Load 305(storeTemp)
-                              ImageWrite 307 309 310
-             312:   18(float) FunctionCall 37(SomeValue()
-                              Store 311(storeTemp) 312
-             313:         123 Load 125(g_tTex3df1)
-             314:    128(ptr) AccessChain 61 127
-             315:   57(ivec3) Load 314
-             316:   18(float) Load 311(storeTemp)
-                              ImageWrite 313 315 316
-             317:         123 Load 125(g_tTex3df1)
-             318:    128(ptr) AccessChain 61 127
-             319:   57(ivec3) Load 318
-             320:   18(float) Load 148(lf1)
-                              ImageWrite 317 319 320
-                              Store 321(storeTemp) 149
-             322:         133 Load 135(g_tTex3di1)
-             323:    128(ptr) AccessChain 61 127
-             324:   57(ivec3) Load 323
-             325:      6(int) Load 321(storeTemp)
-                              ImageWrite 322 324 325
-                              Store 326(storeTemp) 327
-             328:         141 Load 143(g_tTex3du1)
-             329:    128(ptr) AccessChain 61 127
-             330:   57(ivec3) Load 329
-             331:     12(int) Load 326(storeTemp)
-                              ImageWrite 328 330 331
-             332:          68 Load 70(g_tTex1df1)
-             333:     62(ptr) AccessChain 61 53
-             334:      6(int) Load 333
-             335:   18(float) ImageRead 332 334
-                              Store 336(param) 335
-             337:   18(float) FunctionCall 22(Fn1(f1;) 336(param)
-             338:          81 Load 83(g_tTex1di1)
-             339:     62(ptr) AccessChain 61 53
-             340:      6(int) Load 339
-             341:      6(int) ImageRead 338 340
-                              Store 342(param) 341
-             343:      6(int) FunctionCall 10(Fn1(i1;) 342(param)
-             344:          89 Load 91(g_tTex1du1)
-             345:     62(ptr) AccessChain 61 53
-             346:      6(int) Load 345
-             347:     12(int) ImageRead 344 346
-                              Store 348(param) 347
-             349:     12(int) FunctionCall 16(Fn1(u1;) 348(param)
-             352:           2 FunctionCall 34(Fn2(f1;) 351(param)
-             353:   18(float) Load 351(param)
-                              Store 350(tempArg) 353
-             354:          68 Load 70(g_tTex1df1)
-             355:     62(ptr) AccessChain 61 53
-             356:      6(int) Load 355
-             357:   18(float) Load 350(tempArg)
-                              ImageWrite 354 356 357
-             360:           2 FunctionCall 26(Fn2(i1;) 359(param)
-             361:      6(int) Load 359(param)
-                              Store 358(tempArg) 361
-             362:          81 Load 83(g_tTex1di1)
-             363:     62(ptr) AccessChain 61 53
-             364:      6(int) Load 363
-             365:      6(int) Load 358(tempArg)
-                              ImageWrite 362 364 365
-             368:           2 FunctionCall 30(Fn2(u1;) 367(param)
-             369:     12(int) Load 367(param)
-                              Store 366(tempArg) 369
-             370:          89 Load 91(g_tTex1du1)
-             371:     62(ptr) AccessChain 61 53
-             372:      6(int) Load 371
-             373:     12(int) Load 366(tempArg)
-                              ImageWrite 370 372 373
-             375:     62(ptr) AccessChain 61 53
-             376:      6(int) Load 375
-                              Store 374(coordTemp) 376
-             378:          68 Load 70(g_tTex1df1)
-             379:      6(int) Load 374(coordTemp)
-             380:   18(float) ImageRead 378 379
-                              Store 377(storeTemp) 380
-             381:   18(float) Load 377(storeTemp)
-             383:   18(float) FAdd 381 382
-                              Store 377(storeTemp) 383
-             384:          68 Load 70(g_tTex1df1)
-             385:      6(int) Load 374(coordTemp)
-             386:   18(float) Load 377(storeTemp)
-                              ImageWrite 384 385 386
-             388:     62(ptr) AccessChain 61 53
-             389:      6(int) Load 388
-                              Store 387(coordTemp) 389
-             391:          81 Load 83(g_tTex1di1)
-             392:      6(int) Load 387(coordTemp)
-             393:      6(int) ImageRead 391 392
-                              Store 390(storeTemp) 393
-             394:      6(int) Load 390(storeTemp)
-             395:      6(int) IAdd 394 101
-                              Store 390(storeTemp) 395
-             396:          81 Load 83(g_tTex1di1)
-             397:      6(int) Load 387(coordTemp)
-             398:      6(int) Load 390(storeTemp)
-                              ImageWrite 396 397 398
-             400:     62(ptr) AccessChain 61 53
-             401:      6(int) Load 400
-                              Store 399(coordTemp) 401
-             403:          89 Load 91(g_tTex1du1)
-             404:      6(int) Load 399(coordTemp)
-             405:     12(int) ImageRead 403 404
-                              Store 402(storeTemp) 405
-             406:     12(int) Load 402(storeTemp)
-             407:     12(int) IAdd 406 101
-                              Store 402(storeTemp) 407
-             408:          89 Load 91(g_tTex1du1)
-             409:      6(int) Load 399(coordTemp)
-             410:     12(int) Load 402(storeTemp)
+             305:      6(int) ShiftRightArithmetic 304 135
+                              Store 299(storeTemp) 305
+             306:          83 Load 85(g_tTex1di1)
+             307:      6(int) Load 296(coordTemp)
+             308:      6(int) Load 299(storeTemp)
+                              ImageWrite 306 307 308
+             310:   18(float) FunctionCall 37(SomeValue()
+                              Store 309(storeTemp) 310
+             311:         102 Load 104(g_tTex2df1)
+             312:    107(ptr) AccessChain 61 106
+             313:   56(ivec2) Load 312
+             314:   18(float) Load 309(storeTemp)
+                              ImageWrite 311 313 314
+             315:         102 Load 104(g_tTex2df1)
+             316:    107(ptr) AccessChain 61 106
+             317:   56(ivec2) Load 316
+             318:   18(float) Load 159(lf1)
+                              ImageWrite 315 317 318
+                              Store 319(storeTemp) 320
+             321:         113 Load 115(g_tTex2di1)
+             322:    107(ptr) AccessChain 61 106
+             323:   56(ivec2) Load 322
+             324:      6(int) Load 319(storeTemp)
+                              ImageWrite 321 323 324
+                              Store 325(storeTemp) 326
+             327:         122 Load 124(g_tTex2du1)
+             328:    107(ptr) AccessChain 61 106
+             329:   56(ivec2) Load 328
+             330:     12(int) Load 325(storeTemp)
+                              ImageWrite 327 329 330
+             332:   18(float) FunctionCall 37(SomeValue()
+                              Store 331(storeTemp) 332
+             333:         131 Load 133(g_tTex3df1)
+             334:    136(ptr) AccessChain 61 135
+             335:   57(ivec3) Load 334
+             336:   18(float) Load 331(storeTemp)
+                              ImageWrite 333 335 336
+             337:         131 Load 133(g_tTex3df1)
+             338:    136(ptr) AccessChain 61 135
+             339:   57(ivec3) Load 338
+             340:   18(float) Load 159(lf1)
+                              ImageWrite 337 339 340
+                              Store 341(storeTemp) 160
+             342:         142 Load 144(g_tTex3di1)
+             343:    136(ptr) AccessChain 61 135
+             344:   57(ivec3) Load 343
+             345:      6(int) Load 341(storeTemp)
+                              ImageWrite 342 344 345
+                              Store 346(storeTemp) 347
+             348:         151 Load 153(g_tTex3du1)
+             349:    136(ptr) AccessChain 61 135
+             350:   57(ivec3) Load 349
+             351:     12(int) Load 346(storeTemp)
+                              ImageWrite 348 350 351
+             352:          68 Load 70(g_tTex1df1)
+             353:     62(ptr) AccessChain 61 53
+             354:      6(int) Load 353
+             355:   39(fvec4) ImageRead 352 354
+             356:   18(float) CompositeExtract 355 0
+                              Store 357(param) 356
+             358:   18(float) FunctionCall 22(Fn1(f1;) 357(param)
+             359:          83 Load 85(g_tTex1di1)
+             360:     62(ptr) AccessChain 61 53
+             361:      6(int) Load 360
+             362:   58(ivec4) ImageRead 359 361
+             363:      6(int) CompositeExtract 362 0
+                              Store 364(param) 363
+             365:      6(int) FunctionCall 10(Fn1(i1;) 364(param)
+             366:          92 Load 94(g_tTex1du1)
+             367:     62(ptr) AccessChain 61 53
+             368:      6(int) Load 367
+             369:   98(ivec4) ImageRead 366 368
+             370:     12(int) CompositeExtract 369 0
+                              Store 371(param) 370
+             372:     12(int) FunctionCall 16(Fn1(u1;) 371(param)
+             375:           2 FunctionCall 34(Fn2(f1;) 374(param)
+             376:   18(float) Load 374(param)
+                              Store 373(tempArg) 376
+             377:          68 Load 70(g_tTex1df1)
+             378:     62(ptr) AccessChain 61 53
+             379:      6(int) Load 378
+             380:   18(float) Load 373(tempArg)
+                              ImageWrite 377 379 380
+             383:           2 FunctionCall 26(Fn2(i1;) 382(param)
+             384:      6(int) Load 382(param)
+                              Store 381(tempArg) 384
+             385:          83 Load 85(g_tTex1di1)
+             386:     62(ptr) AccessChain 61 53
+             387:      6(int) Load 386
+             388:      6(int) Load 381(tempArg)
+                              ImageWrite 385 387 388
+             391:           2 FunctionCall 30(Fn2(u1;) 390(param)
+             392:     12(int) Load 390(param)
+                              Store 389(tempArg) 392
+             393:          92 Load 94(g_tTex1du1)
+             394:     62(ptr) AccessChain 61 53
+             395:      6(int) Load 394
+             396:     12(int) Load 389(tempArg)
+                              ImageWrite 393 395 396
+             398:     62(ptr) AccessChain 61 53
+             399:      6(int) Load 398
+                              Store 397(coordTemp) 399
+             401:          68 Load 70(g_tTex1df1)
+             402:      6(int) Load 397(coordTemp)
+             403:   39(fvec4) ImageRead 401 402
+             404:   18(float) CompositeExtract 403 0
+                              Store 400(storeTemp) 404
+             405:   18(float) Load 400(storeTemp)
+             407:   18(float) FAdd 405 406
+                              Store 400(storeTemp) 407
+             408:          68 Load 70(g_tTex1df1)
+             409:      6(int) Load 397(coordTemp)
+             410:   18(float) Load 400(storeTemp)
                               ImageWrite 408 409 410
              412:     62(ptr) AccessChain 61 53
              413:      6(int) Load 412
                               Store 411(coordTemp) 413
-             415:          68 Load 70(g_tTex1df1)
+             415:          83 Load 85(g_tTex1di1)
              416:      6(int) Load 411(coordTemp)
-             417:   18(float) ImageRead 415 416
-                              Store 414(storeTemp) 417
-             418:   18(float) Load 414(storeTemp)
-             419:   18(float) FSub 418 382
-                              Store 414(storeTemp) 419
-             420:          68 Load 70(g_tTex1df1)
-             421:      6(int) Load 411(coordTemp)
-             422:   18(float) Load 414(storeTemp)
-                              ImageWrite 420 421 422
-             424:     62(ptr) AccessChain 61 53
-             425:      6(int) Load 424
-                              Store 423(coordTemp) 425
-             427:          81 Load 83(g_tTex1di1)
-             428:      6(int) Load 423(coordTemp)
-             429:      6(int) ImageRead 427 428
-                              Store 426(storeTemp) 429
-             430:      6(int) Load 426(storeTemp)
-             431:      6(int) ISub 430 101
-                              Store 426(storeTemp) 431
-             432:          81 Load 83(g_tTex1di1)
-             433:      6(int) Load 423(coordTemp)
-             434:      6(int) Load 426(storeTemp)
-                              ImageWrite 432 433 434
-             436:     62(ptr) AccessChain 61 53
-             437:      6(int) Load 436
-                              Store 435(coordTemp) 437
-             439:          89 Load 91(g_tTex1du1)
-             440:      6(int) Load 435(coordTemp)
-             441:     12(int) ImageRead 439 440
-                              Store 438(storeTemp) 441
-             442:     12(int) Load 438(storeTemp)
-             443:     12(int) ISub 442 101
-                              Store 438(storeTemp) 443
-             444:          89 Load 91(g_tTex1du1)
-             445:      6(int) Load 435(coordTemp)
-             446:     12(int) Load 438(storeTemp)
-                              ImageWrite 444 445 446
-             448:     62(ptr) AccessChain 61 53
-             449:      6(int) Load 448
-                              Store 447(coordTemp) 449
-             451:          68 Load 70(g_tTex1df1)
-             452:      6(int) Load 447(coordTemp)
-             453:   18(float) ImageRead 451 452
-                              Store 450(storeTempPre) 453
-             455:   18(float) Load 450(storeTempPre)
-                              Store 454(storeTempPost) 455
-             456:   18(float) Load 454(storeTempPost)
-             457:   18(float) FAdd 456 382
-                              Store 454(storeTempPost) 457
-             458:          68 Load 70(g_tTex1df1)
-             459:      6(int) Load 447(coordTemp)
-             460:   18(float) Load 454(storeTempPost)
-                              ImageWrite 458 459 460
-             462:     62(ptr) AccessChain 61 53
-             463:      6(int) Load 462
-                              Store 461(coordTemp) 463
-             465:          89 Load 91(g_tTex1du1)
-             466:      6(int) Load 461(coordTemp)
-             467:     12(int) ImageRead 465 466
-                              Store 464(storeTempPre) 467
-             469:     12(int) Load 464(storeTempPre)
-                              Store 468(storeTempPost) 469
-             470:     12(int) Load 468(storeTempPost)
-             471:     12(int) ISub 470 101
-                              Store 468(storeTempPost) 471
-             472:          89 Load 91(g_tTex1du1)
-             473:      6(int) Load 461(coordTemp)
-             474:     12(int) Load 468(storeTempPost)
-                              ImageWrite 472 473 474
-             476:     62(ptr) AccessChain 61 53
-             477:      6(int) Load 476
-                              Store 475(coordTemp) 477
-             479:          81 Load 83(g_tTex1di1)
-             480:      6(int) Load 475(coordTemp)
-             481:      6(int) ImageRead 479 480
-                              Store 478(storeTempPre) 481
-             483:      6(int) Load 478(storeTempPre)
-                              Store 482(storeTempPost) 483
-             484:      6(int) Load 482(storeTempPost)
-             485:      6(int) IAdd 484 101
-                              Store 482(storeTempPost) 485
-             486:          81 Load 83(g_tTex1di1)
-             487:      6(int) Load 475(coordTemp)
-             488:      6(int) Load 482(storeTempPost)
-                              ImageWrite 486 487 488
-             490:     62(ptr) AccessChain 61 53
-             491:      6(int) Load 490
-                              Store 489(coordTemp) 491
-             493:          68 Load 70(g_tTex1df1)
-             494:      6(int) Load 489(coordTemp)
-             495:   18(float) ImageRead 493 494
-                              Store 492(storeTempPre) 495
-             497:   18(float) Load 492(storeTempPre)
-                              Store 496(storeTempPost) 497
-             498:   18(float) Load 496(storeTempPost)
-             499:   18(float) FSub 498 382
-                              Store 496(storeTempPost) 499
-             500:          68 Load 70(g_tTex1df1)
-             501:      6(int) Load 489(coordTemp)
-             502:   18(float) Load 496(storeTempPost)
-                              ImageWrite 500 501 502
-             504:     62(ptr) AccessChain 61 53
-             505:      6(int) Load 504
-                              Store 503(coordTemp) 505
-             507:          81 Load 83(g_tTex1di1)
-             508:      6(int) Load 503(coordTemp)
-             509:      6(int) ImageRead 507 508
-                              Store 506(storeTempPre) 509
-             511:      6(int) Load 506(storeTempPre)
-                              Store 510(storeTempPost) 511
-             512:      6(int) Load 510(storeTempPost)
-             513:      6(int) IAdd 512 101
-                              Store 510(storeTempPost) 513
-             514:          81 Load 83(g_tTex1di1)
-             515:      6(int) Load 503(coordTemp)
-             516:      6(int) Load 510(storeTempPost)
-                              ImageWrite 514 515 516
-             518:     62(ptr) AccessChain 61 53
-             519:      6(int) Load 518
-                              Store 517(coordTemp) 519
-             521:          89 Load 91(g_tTex1du1)
-             522:      6(int) Load 517(coordTemp)
-             523:     12(int) ImageRead 521 522
-                              Store 520(storeTempPre) 523
-             525:     12(int) Load 520(storeTempPre)
-                              Store 524(storeTempPost) 525
-             526:     12(int) Load 524(storeTempPost)
-             527:     12(int) ISub 526 101
-                              Store 524(storeTempPost) 527
-             528:          89 Load 91(g_tTex1du1)
-             529:      6(int) Load 517(coordTemp)
-             530:     12(int) Load 524(storeTempPost)
-                              ImageWrite 528 529 530
-             532:          97 Load 99(g_tTex2df1)
-             535:   18(float) ImageRead 532 534
-                              Store 531(storeTemp) 535
-             536:          68 Load 70(g_tTex1df1)
-             537:   18(float) Load 531(storeTemp)
-                              ImageWrite 536 101 537
-             542:    541(ptr) AccessChain 539(psout) 53
-                              Store 542 540
-             543:40(PS_OUTPUT) Load 539(psout)
-                              ReturnValue 543
+             417:   58(ivec4) ImageRead 415 416
+             418:      6(int) CompositeExtract 417 0
+                              Store 414(storeTemp) 418
+             419:      6(int) Load 414(storeTemp)
+             420:      6(int) IAdd 419 106
+                              Store 414(storeTemp) 420
+             421:          83 Load 85(g_tTex1di1)
+             422:      6(int) Load 411(coordTemp)
+             423:      6(int) Load 414(storeTemp)
+                              ImageWrite 421 422 423
+             425:     62(ptr) AccessChain 61 53
+             426:      6(int) Load 425
+                              Store 424(coordTemp) 426
+             428:          92 Load 94(g_tTex1du1)
+             429:      6(int) Load 424(coordTemp)
+             430:   98(ivec4) ImageRead 428 429
+             431:     12(int) CompositeExtract 430 0
+                              Store 427(storeTemp) 431
+             432:     12(int) Load 427(storeTemp)
+             433:     12(int) IAdd 432 106
+                              Store 427(storeTemp) 433
+             434:          92 Load 94(g_tTex1du1)
+             435:      6(int) Load 424(coordTemp)
+             436:     12(int) Load 427(storeTemp)
+                              ImageWrite 434 435 436
+             438:     62(ptr) AccessChain 61 53
+             439:      6(int) Load 438
+                              Store 437(coordTemp) 439
+             441:          68 Load 70(g_tTex1df1)
+             442:      6(int) Load 437(coordTemp)
+             443:   39(fvec4) ImageRead 441 442
+             444:   18(float) CompositeExtract 443 0
+                              Store 440(storeTemp) 444
+             445:   18(float) Load 440(storeTemp)
+             446:   18(float) FSub 445 406
+                              Store 440(storeTemp) 446
+             447:          68 Load 70(g_tTex1df1)
+             448:      6(int) Load 437(coordTemp)
+             449:   18(float) Load 440(storeTemp)
+                              ImageWrite 447 448 449
+             451:     62(ptr) AccessChain 61 53
+             452:      6(int) Load 451
+                              Store 450(coordTemp) 452
+             454:          83 Load 85(g_tTex1di1)
+             455:      6(int) Load 450(coordTemp)
+             456:   58(ivec4) ImageRead 454 455
+             457:      6(int) CompositeExtract 456 0
+                              Store 453(storeTemp) 457
+             458:      6(int) Load 453(storeTemp)
+             459:      6(int) ISub 458 106
+                              Store 453(storeTemp) 459
+             460:          83 Load 85(g_tTex1di1)
+             461:      6(int) Load 450(coordTemp)
+             462:      6(int) Load 453(storeTemp)
+                              ImageWrite 460 461 462
+             464:     62(ptr) AccessChain 61 53
+             465:      6(int) Load 464
+                              Store 463(coordTemp) 465
+             467:          92 Load 94(g_tTex1du1)
+             468:      6(int) Load 463(coordTemp)
+             469:   98(ivec4) ImageRead 467 468
+             470:     12(int) CompositeExtract 469 0
+                              Store 466(storeTemp) 470
+             471:     12(int) Load 466(storeTemp)
+             472:     12(int) ISub 471 106
+                              Store 466(storeTemp) 472
+             473:          92 Load 94(g_tTex1du1)
+             474:      6(int) Load 463(coordTemp)
+             475:     12(int) Load 466(storeTemp)
+                              ImageWrite 473 474 475
+             477:     62(ptr) AccessChain 61 53
+             478:      6(int) Load 477
+                              Store 476(coordTemp) 478
+             480:          68 Load 70(g_tTex1df1)
+             481:      6(int) Load 476(coordTemp)
+             482:   39(fvec4) ImageRead 480 481
+             483:   18(float) CompositeExtract 482 0
+                              Store 479(storeTempPre) 483
+             485:   18(float) Load 479(storeTempPre)
+                              Store 484(storeTempPost) 485
+             486:   18(float) Load 484(storeTempPost)
+             487:   18(float) FAdd 486 406
+                              Store 484(storeTempPost) 487
+             488:          68 Load 70(g_tTex1df1)
+             489:      6(int) Load 476(coordTemp)
+             490:   18(float) Load 484(storeTempPost)
+                              ImageWrite 488 489 490
+             492:     62(ptr) AccessChain 61 53
+             493:      6(int) Load 492
+                              Store 491(coordTemp) 493
+             495:          92 Load 94(g_tTex1du1)
+             496:      6(int) Load 491(coordTemp)
+             497:   98(ivec4) ImageRead 495 496
+             498:     12(int) CompositeExtract 497 0
+                              Store 494(storeTempPre) 498
+             500:     12(int) Load 494(storeTempPre)
+                              Store 499(storeTempPost) 500
+             501:     12(int) Load 499(storeTempPost)
+             502:     12(int) ISub 501 106
+                              Store 499(storeTempPost) 502
+             503:          92 Load 94(g_tTex1du1)
+             504:      6(int) Load 491(coordTemp)
+             505:     12(int) Load 499(storeTempPost)
+                              ImageWrite 503 504 505
+             507:     62(ptr) AccessChain 61 53
+             508:      6(int) Load 507
+                              Store 506(coordTemp) 508
+             510:          83 Load 85(g_tTex1di1)
+             511:      6(int) Load 506(coordTemp)
+             512:   58(ivec4) ImageRead 510 511
+             513:      6(int) CompositeExtract 512 0
+                              Store 509(storeTempPre) 513
+             515:      6(int) Load 509(storeTempPre)
+                              Store 514(storeTempPost) 515
+             516:      6(int) Load 514(storeTempPost)
+             517:      6(int) IAdd 516 106
+                              Store 514(storeTempPost) 517
+             518:          83 Load 85(g_tTex1di1)
+             519:      6(int) Load 506(coordTemp)
+             520:      6(int) Load 514(storeTempPost)
+                              ImageWrite 518 519 520
+             522:     62(ptr) AccessChain 61 53
+             523:      6(int) Load 522
+                              Store 521(coordTemp) 523
+             525:          68 Load 70(g_tTex1df1)
+             526:      6(int) Load 521(coordTemp)
+             527:   39(fvec4) ImageRead 525 526
+             528:   18(float) CompositeExtract 527 0
+                              Store 524(storeTempPre) 528
+             530:   18(float) Load 524(storeTempPre)
+                              Store 529(storeTempPost) 530
+             531:   18(float) Load 529(storeTempPost)
+             532:   18(float) FSub 531 406
+                              Store 529(storeTempPost) 532
+             533:          68 Load 70(g_tTex1df1)
+             534:      6(int) Load 521(coordTemp)
+             535:   18(float) Load 529(storeTempPost)
+                              ImageWrite 533 534 535
+             537:     62(ptr) AccessChain 61 53
+             538:      6(int) Load 537
+                              Store 536(coordTemp) 538
+             540:          83 Load 85(g_tTex1di1)
+             541:      6(int) Load 536(coordTemp)
+             542:   58(ivec4) ImageRead 540 541
+             543:      6(int) CompositeExtract 542 0
+                              Store 539(storeTempPre) 543
+             545:      6(int) Load 539(storeTempPre)
+                              Store 544(storeTempPost) 545
+             546:      6(int) Load 544(storeTempPost)
+             547:      6(int) IAdd 546 106
+                              Store 544(storeTempPost) 547
+             548:          83 Load 85(g_tTex1di1)
+             549:      6(int) Load 536(coordTemp)
+             550:      6(int) Load 544(storeTempPost)
+                              ImageWrite 548 549 550
+             552:     62(ptr) AccessChain 61 53
+             553:      6(int) Load 552
+                              Store 551(coordTemp) 553
+             555:          92 Load 94(g_tTex1du1)
+             556:      6(int) Load 551(coordTemp)
+             557:   98(ivec4) ImageRead 555 556
+             558:     12(int) CompositeExtract 557 0
+                              Store 554(storeTempPre) 558
+             560:     12(int) Load 554(storeTempPre)
+                              Store 559(storeTempPost) 560
+             561:     12(int) Load 559(storeTempPost)
+             562:     12(int) ISub 561 106
+                              Store 559(storeTempPost) 562
+             563:          92 Load 94(g_tTex1du1)
+             564:      6(int) Load 551(coordTemp)
+             565:     12(int) Load 559(storeTempPost)
+                              ImageWrite 563 564 565
+             567:         102 Load 104(g_tTex2df1)
+             570:   39(fvec4) ImageRead 567 569
+             571:   18(float) CompositeExtract 570 0
+                              Store 566(storeTemp) 571
+             572:          68 Load 70(g_tTex1df1)
+             573:   18(float) Load 566(storeTemp)
+                              ImageWrite 572 106 573
+             578:    577(ptr) AccessChain 575(psout) 53
+                              Store 578 576
+             579:40(PS_OUTPUT) Load 575(psout)
+                              ReturnValue 579
                               FunctionEnd
diff --git a/third_party/vulkan-deps/glslang/src/Test/baseResults/hlsl.rw.vec2.bracket.frag.out b/third_party/vulkan-deps/glslang/src/Test/baseResults/hlsl.rw.vec2.bracket.frag.out
index c8d10e6..1f77a77 100644
--- a/third_party/vulkan-deps/glslang/src/Test/baseResults/hlsl.rw.vec2.bracket.frag.out
+++ b/third_party/vulkan-deps/glslang/src/Test/baseResults/hlsl.rw.vec2.bracket.frag.out
@@ -1707,17 +1707,16 @@
 0:?     'anon@0' (layout( row_major std140) uniform block{ uniform int c1,  uniform 2-component vector of int c2,  uniform 3-component vector of int c3,  uniform 4-component vector of int c4,  uniform int o1,  uniform 2-component vector of int o2,  uniform 3-component vector of int o3,  uniform 4-component vector of int o4,  uniform 2-component vector of float uf2,  uniform 2-component vector of int ui2,  uniform 2-component vector of uint uu2})
 0:?     '@entryPointOutput.Color' (layout( location=0) out 4-component vector of float)
 
-Validation failed
 // Module Version 10000
 // Generated by (magic number): 8000a
-// Id's are bound by 605
+// Id's are bound by 711
 
                               Capability Shader
                               Capability Image1D
                               Capability StorageImageExtendedFormats
                1:             ExtInstImport  "GLSL.std.450"
                               MemoryModel Logical GLSL450
-                              EntryPoint Fragment 4  "main" 581
+                              EntryPoint Fragment 4  "main" 687
                               ExecutionMode 4 OriginUpperLeft
                               Source HLSL 500
                               Name 4  "main"
@@ -1751,101 +1750,101 @@
                               MemberName 64($Global) 10  "uu2"
                               Name 66  ""
                               Name 76  "g_tTex1df2"
-                              Name 82  "r00"
-                              Name 87  "r01"
-                              Name 90  "g_tTex1di2"
-                              Name 95  "r02"
-                              Name 98  "g_tTex1du2"
-                              Name 103  "r10"
-                              Name 106  "g_tTex2df2"
-                              Name 111  "r11"
-                              Name 114  "g_tTex2di2"
-                              Name 119  "r12"
-                              Name 122  "g_tTex2du2"
-                              Name 127  "r20"
-                              Name 130  "g_tTex3df2"
-                              Name 137  "r21"
-                              Name 140  "g_tTex3di2"
-                              Name 145  "r22"
-                              Name 148  "g_tTex3du2"
-                              Name 153  "lf2"
-                              Name 158  "storeTemp"
-                              Name 168  "storeTemp"
-                              Name 174  "storeTemp"
-                              Name 182  "val1"
-                              Name 184  "coordTemp"
-                              Name 187  "storeTemp"
-                              Name 198  "coordTemp"
-                              Name 201  "storeTemp"
-                              Name 212  "coordTemp"
-                              Name 215  "storeTemp"
-                              Name 226  "coordTemp"
-                              Name 229  "storeTemp"
-                              Name 239  "coordTemp"
-                              Name 242  "storeTemp"
-                              Name 252  "coordTemp"
-                              Name 255  "storeTemp"
+                              Name 85  "r00"
+                              Name 93  "r01"
+                              Name 96  "g_tTex1di2"
+                              Name 104  "r02"
+                              Name 107  "g_tTex1du2"
+                              Name 116  "r10"
+                              Name 119  "g_tTex2df2"
+                              Name 127  "r11"
+                              Name 130  "g_tTex2di2"
+                              Name 138  "r12"
+                              Name 141  "g_tTex2du2"
+                              Name 149  "r20"
+                              Name 152  "g_tTex3df2"
+                              Name 162  "r21"
+                              Name 165  "g_tTex3di2"
+                              Name 173  "r22"
+                              Name 176  "g_tTex3du2"
+                              Name 184  "lf2"
+                              Name 189  "storeTemp"
+                              Name 199  "storeTemp"
+                              Name 205  "storeTemp"
+                              Name 213  "val1"
+                              Name 215  "coordTemp"
+                              Name 218  "storeTemp"
+                              Name 232  "coordTemp"
+                              Name 235  "storeTemp"
+                              Name 249  "coordTemp"
+                              Name 252  "storeTemp"
                               Name 266  "coordTemp"
                               Name 269  "storeTemp"
-                              Name 280  "coordTemp"
-                              Name 283  "storeTemp"
-                              Name 293  "coordTemp"
-                              Name 296  "storeTemp"
-                              Name 306  "storeTemp"
-                              Name 316  "storeTemp"
-                              Name 323  "storeTemp"
-                              Name 330  "storeTemp"
-                              Name 340  "storeTemp"
-                              Name 347  "storeTemp"
-                              Name 358  "param"
-                              Name 364  "param"
-                              Name 370  "param"
-                              Name 372  "tempArg"
-                              Name 373  "param"
-                              Name 380  "tempArg"
-                              Name 381  "param"
-                              Name 388  "tempArg"
-                              Name 389  "param"
-                              Name 396  "coordTemp"
-                              Name 399  "storeTemp"
-                              Name 410  "coordTemp"
-                              Name 413  "storeTemp"
-                              Name 423  "coordTemp"
-                              Name 426  "storeTemp"
-                              Name 436  "coordTemp"
-                              Name 439  "storeTemp"
-                              Name 449  "coordTemp"
-                              Name 452  "storeTemp"
-                              Name 462  "coordTemp"
-                              Name 465  "storeTemp"
-                              Name 475  "coordTemp"
-                              Name 478  "storeTempPre"
-                              Name 482  "storeTempPost"
-                              Name 490  "coordTemp"
-                              Name 493  "storeTempPre"
-                              Name 497  "storeTempPost"
-                              Name 505  "coordTemp"
-                              Name 508  "storeTempPre"
-                              Name 512  "storeTempPost"
-                              Name 520  "coordTemp"
-                              Name 523  "storeTempPre"
-                              Name 527  "storeTempPost"
-                              Name 535  "coordTemp"
-                              Name 538  "storeTempPre"
-                              Name 542  "storeTempPost"
-                              Name 550  "coordTemp"
-                              Name 553  "storeTempPre"
-                              Name 557  "storeTempPost"
-                              Name 565  "storeTemp"
-                              Name 573  "psout"
-                              Name 581  "@entryPointOutput.Color"
-                              Name 586  "g_sSamp"
-                              Name 589  "g_tTex1df2a"
-                              Name 592  "g_tTex1di2a"
-                              Name 595  "g_tTex1du2a"
-                              Name 598  "g_tTex2df2a"
-                              Name 601  "g_tTex2di2a"
-                              Name 604  "g_tTex2du2a"
+                              Name 282  "coordTemp"
+                              Name 285  "storeTemp"
+                              Name 298  "coordTemp"
+                              Name 301  "storeTemp"
+                              Name 315  "coordTemp"
+                              Name 318  "storeTemp"
+                              Name 332  "coordTemp"
+                              Name 335  "storeTemp"
+                              Name 348  "coordTemp"
+                              Name 351  "storeTemp"
+                              Name 364  "storeTemp"
+                              Name 374  "storeTemp"
+                              Name 381  "storeTemp"
+                              Name 388  "storeTemp"
+                              Name 398  "storeTemp"
+                              Name 405  "storeTemp"
+                              Name 419  "param"
+                              Name 428  "param"
+                              Name 437  "param"
+                              Name 439  "tempArg"
+                              Name 440  "param"
+                              Name 447  "tempArg"
+                              Name 448  "param"
+                              Name 455  "tempArg"
+                              Name 456  "param"
+                              Name 463  "coordTemp"
+                              Name 466  "storeTemp"
+                              Name 480  "coordTemp"
+                              Name 483  "storeTemp"
+                              Name 496  "coordTemp"
+                              Name 499  "storeTemp"
+                              Name 512  "coordTemp"
+                              Name 515  "storeTemp"
+                              Name 528  "coordTemp"
+                              Name 531  "storeTemp"
+                              Name 544  "coordTemp"
+                              Name 547  "storeTemp"
+                              Name 560  "coordTemp"
+                              Name 563  "storeTempPre"
+                              Name 570  "storeTempPost"
+                              Name 578  "coordTemp"
+                              Name 581  "storeTempPre"
+                              Name 588  "storeTempPost"
+                              Name 596  "coordTemp"
+                              Name 599  "storeTempPre"
+                              Name 606  "storeTempPost"
+                              Name 614  "coordTemp"
+                              Name 617  "storeTempPre"
+                              Name 624  "storeTempPost"
+                              Name 632  "coordTemp"
+                              Name 635  "storeTempPre"
+                              Name 642  "storeTempPost"
+                              Name 650  "coordTemp"
+                              Name 653  "storeTempPre"
+                              Name 660  "storeTempPost"
+                              Name 668  "storeTemp"
+                              Name 679  "psout"
+                              Name 687  "@entryPointOutput.Color"
+                              Name 692  "g_sSamp"
+                              Name 695  "g_tTex1df2a"
+                              Name 698  "g_tTex1di2a"
+                              Name 701  "g_tTex1du2a"
+                              Name 704  "g_tTex2df2a"
+                              Name 707  "g_tTex2di2a"
+                              Name 710  "g_tTex2du2a"
                               MemberDecorate 64($Global) 0 Offset 0
                               MemberDecorate 64($Global) 1 Offset 8
                               MemberDecorate 64($Global) 2 Offset 16
@@ -1862,37 +1861,37 @@
                               Decorate 66 Binding 10
                               Decorate 76(g_tTex1df2) DescriptorSet 0
                               Decorate 76(g_tTex1df2) Binding 1
-                              Decorate 90(g_tTex1di2) DescriptorSet 0
-                              Decorate 90(g_tTex1di2) Binding 2
-                              Decorate 98(g_tTex1du2) DescriptorSet 0
-                              Decorate 98(g_tTex1du2) Binding 3
-                              Decorate 106(g_tTex2df2) DescriptorSet 0
-                              Decorate 106(g_tTex2df2) Binding 4
-                              Decorate 114(g_tTex2di2) DescriptorSet 0
-                              Decorate 114(g_tTex2di2) Binding 5
-                              Decorate 122(g_tTex2du2) DescriptorSet 0
-                              Decorate 122(g_tTex2du2) Binding 6
-                              Decorate 130(g_tTex3df2) DescriptorSet 0
-                              Decorate 130(g_tTex3df2) Binding 7
-                              Decorate 140(g_tTex3di2) DescriptorSet 0
-                              Decorate 140(g_tTex3di2) Binding 8
-                              Decorate 148(g_tTex3du2) DescriptorSet 0
-                              Decorate 148(g_tTex3du2) Binding 9
-                              Decorate 581(@entryPointOutput.Color) Location 0
-                              Decorate 586(g_sSamp) DescriptorSet 0
-                              Decorate 586(g_sSamp) Binding 0
-                              Decorate 589(g_tTex1df2a) DescriptorSet 0
-                              Decorate 589(g_tTex1df2a) Binding 0
-                              Decorate 592(g_tTex1di2a) DescriptorSet 0
-                              Decorate 592(g_tTex1di2a) Binding 0
-                              Decorate 595(g_tTex1du2a) DescriptorSet 0
-                              Decorate 595(g_tTex1du2a) Binding 0
-                              Decorate 598(g_tTex2df2a) DescriptorSet 0
-                              Decorate 598(g_tTex2df2a) Binding 0
-                              Decorate 601(g_tTex2di2a) DescriptorSet 0
-                              Decorate 601(g_tTex2di2a) Binding 0
-                              Decorate 604(g_tTex2du2a) DescriptorSet 0
-                              Decorate 604(g_tTex2du2a) Binding 0
+                              Decorate 96(g_tTex1di2) DescriptorSet 0
+                              Decorate 96(g_tTex1di2) Binding 2
+                              Decorate 107(g_tTex1du2) DescriptorSet 0
+                              Decorate 107(g_tTex1du2) Binding 3
+                              Decorate 119(g_tTex2df2) DescriptorSet 0
+                              Decorate 119(g_tTex2df2) Binding 4
+                              Decorate 130(g_tTex2di2) DescriptorSet 0
+                              Decorate 130(g_tTex2di2) Binding 5
+                              Decorate 141(g_tTex2du2) DescriptorSet 0
+                              Decorate 141(g_tTex2du2) Binding 6
+                              Decorate 152(g_tTex3df2) DescriptorSet 0
+                              Decorate 152(g_tTex3df2) Binding 7
+                              Decorate 165(g_tTex3di2) DescriptorSet 0
+                              Decorate 165(g_tTex3di2) Binding 8
+                              Decorate 176(g_tTex3du2) DescriptorSet 0
+                              Decorate 176(g_tTex3du2) Binding 9
+                              Decorate 687(@entryPointOutput.Color) Location 0
+                              Decorate 692(g_sSamp) DescriptorSet 0
+                              Decorate 692(g_sSamp) Binding 0
+                              Decorate 695(g_tTex1df2a) DescriptorSet 0
+                              Decorate 695(g_tTex1df2a) Binding 0
+                              Decorate 698(g_tTex1di2a) DescriptorSet 0
+                              Decorate 698(g_tTex1di2a) Binding 0
+                              Decorate 701(g_tTex1du2a) DescriptorSet 0
+                              Decorate 701(g_tTex1du2a) Binding 0
+                              Decorate 704(g_tTex2df2a) DescriptorSet 0
+                              Decorate 704(g_tTex2df2a) Binding 0
+                              Decorate 707(g_tTex2di2a) DescriptorSet 0
+                              Decorate 707(g_tTex2di2a) Binding 0
+                              Decorate 710(g_tTex2du2a) DescriptorSet 0
+                              Decorate 710(g_tTex2du2a) Binding 0
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeInt 32 1
@@ -1931,86 +1930,87 @@
               75:             TypePointer UniformConstant 74
   76(g_tTex1df2):     75(ptr) Variable UniformConstant
               78:             TypePointer Uniform 6(int)
-              88:             TypeImage 6(int) 1D nonsampled format:Rg32i
-              89:             TypePointer UniformConstant 88
-  90(g_tTex1di2):     89(ptr) Variable UniformConstant
-              96:             TypeImage 13(int) 1D nonsampled format:Rg32ui
-              97:             TypePointer UniformConstant 96
-  98(g_tTex1du2):     97(ptr) Variable UniformConstant
-             104:             TypeImage 20(float) 2D nonsampled format:Rg32f
-             105:             TypePointer UniformConstant 104
- 106(g_tTex2df2):    105(ptr) Variable UniformConstant
-             112:             TypeImage 6(int) 2D nonsampled format:Rg32i
-             113:             TypePointer UniformConstant 112
- 114(g_tTex2di2):    113(ptr) Variable UniformConstant
-             120:             TypeImage 13(int) 2D nonsampled format:Rg32ui
-             121:             TypePointer UniformConstant 120
- 122(g_tTex2du2):    121(ptr) Variable UniformConstant
-             128:             TypeImage 20(float) 3D nonsampled format:Rg32f
+              94:             TypeImage 6(int) 1D nonsampled format:Rg32i
+              95:             TypePointer UniformConstant 94
+  96(g_tTex1di2):     95(ptr) Variable UniformConstant
+             105:             TypeImage 13(int) 1D nonsampled format:Rg32ui
+             106:             TypePointer UniformConstant 105
+ 107(g_tTex1du2):    106(ptr) Variable UniformConstant
+             111:             TypeVector 13(int) 4
+             117:             TypeImage 20(float) 2D nonsampled format:Rg32f
+             118:             TypePointer UniformConstant 117
+ 119(g_tTex2df2):    118(ptr) Variable UniformConstant
+             128:             TypeImage 6(int) 2D nonsampled format:Rg32i
              129:             TypePointer UniformConstant 128
- 130(g_tTex3df2):    129(ptr) Variable UniformConstant
-             132:      6(int) Constant 2
-             133:             TypePointer Uniform 62(ivec3)
-             138:             TypeImage 6(int) 3D nonsampled format:Rg32i
-             139:             TypePointer UniformConstant 138
- 140(g_tTex3di2):    139(ptr) Variable UniformConstant
-             146:             TypeImage 13(int) 3D nonsampled format:Rg32ui
-             147:             TypePointer UniformConstant 146
- 148(g_tTex3du2):    147(ptr) Variable UniformConstant
-             154:      6(int) Constant 8
-             155:             TypePointer Uniform 21(fvec2)
-             169:    7(ivec2) ConstantComposite 132 132
-             175:     13(int) Constant 3
-             176:     13(int) Constant 2
-             177:   14(ivec2) ConstantComposite 175 176
-             183:             TypePointer Function 6(int)
-             191:   20(float) Constant 1073741824
-             205:   20(float) Constant 1077936128
-             219:   20(float) Constant 1082130432
-             259:      6(int) Constant 65535
-             273:      6(int) Constant 61680
-             317:      6(int) Constant 5
-             318:    7(ivec2) ConstantComposite 317 132
-             324:     13(int) Constant 6
-             325:   14(ivec2) ConstantComposite 324 176
-             341:      6(int) Constant 6
-             342:    7(ivec2) ConstantComposite 154 341
-             348:     13(int) Constant 9
-             349:   14(ivec2) ConstantComposite 348 176
-             404:   20(float) Constant 1065353216
-             567:      6(int) Constant 3
-             568:    7(ivec2) ConstantComposite 132 567
-             572:             TypePointer Function 43(PS_OUTPUT)
-             574:   42(fvec4) ConstantComposite 404 404 404 404
-             575:             TypePointer Function 42(fvec4)
-             580:             TypePointer Output 42(fvec4)
-581(@entryPointOutput.Color):    580(ptr) Variable Output
-             584:             TypeSampler
-             585:             TypePointer UniformConstant 584
-    586(g_sSamp):    585(ptr) Variable UniformConstant
-             587:             TypeImage 20(float) 1D array nonsampled format:Rg32f
-             588:             TypePointer UniformConstant 587
-589(g_tTex1df2a):    588(ptr) Variable UniformConstant
-             590:             TypeImage 6(int) 1D array nonsampled format:Rg32i
-             591:             TypePointer UniformConstant 590
-592(g_tTex1di2a):    591(ptr) Variable UniformConstant
-             593:             TypeImage 13(int) 1D array nonsampled format:Rg32ui
-             594:             TypePointer UniformConstant 593
-595(g_tTex1du2a):    594(ptr) Variable UniformConstant
-             596:             TypeImage 20(float) 2D array nonsampled format:Rg32f
-             597:             TypePointer UniformConstant 596
-598(g_tTex2df2a):    597(ptr) Variable UniformConstant
-             599:             TypeImage 6(int) 2D array nonsampled format:Rg32i
-             600:             TypePointer UniformConstant 599
-601(g_tTex2di2a):    600(ptr) Variable UniformConstant
-             602:             TypeImage 13(int) 2D array nonsampled format:Rg32ui
-             603:             TypePointer UniformConstant 602
-604(g_tTex2du2a):    603(ptr) Variable UniformConstant
+ 130(g_tTex2di2):    129(ptr) Variable UniformConstant
+             139:             TypeImage 13(int) 2D nonsampled format:Rg32ui
+             140:             TypePointer UniformConstant 139
+ 141(g_tTex2du2):    140(ptr) Variable UniformConstant
+             150:             TypeImage 20(float) 3D nonsampled format:Rg32f
+             151:             TypePointer UniformConstant 150
+ 152(g_tTex3df2):    151(ptr) Variable UniformConstant
+             154:      6(int) Constant 2
+             155:             TypePointer Uniform 62(ivec3)
+             163:             TypeImage 6(int) 3D nonsampled format:Rg32i
+             164:             TypePointer UniformConstant 163
+ 165(g_tTex3di2):    164(ptr) Variable UniformConstant
+             174:             TypeImage 13(int) 3D nonsampled format:Rg32ui
+             175:             TypePointer UniformConstant 174
+ 176(g_tTex3du2):    175(ptr) Variable UniformConstant
+             185:      6(int) Constant 8
+             186:             TypePointer Uniform 21(fvec2)
+             200:    7(ivec2) ConstantComposite 154 154
+             206:     13(int) Constant 3
+             207:     13(int) Constant 2
+             208:   14(ivec2) ConstantComposite 206 207
+             214:             TypePointer Function 6(int)
+             225:   20(float) Constant 1073741824
+             242:   20(float) Constant 1077936128
+             259:   20(float) Constant 1082130432
+             308:      6(int) Constant 65535
+             325:      6(int) Constant 61680
+             375:      6(int) Constant 5
+             376:    7(ivec2) ConstantComposite 375 154
+             382:     13(int) Constant 6
+             383:   14(ivec2) ConstantComposite 382 207
+             399:      6(int) Constant 6
+             400:    7(ivec2) ConstantComposite 185 399
+             406:     13(int) Constant 9
+             407:   14(ivec2) ConstantComposite 406 207
+             474:   20(float) Constant 1065353216
+             670:      6(int) Constant 3
+             671:    7(ivec2) ConstantComposite 154 670
+             678:             TypePointer Function 43(PS_OUTPUT)
+             680:   42(fvec4) ConstantComposite 474 474 474 474
+             681:             TypePointer Function 42(fvec4)
+             686:             TypePointer Output 42(fvec4)
+687(@entryPointOutput.Color):    686(ptr) Variable Output
+             690:             TypeSampler
+             691:             TypePointer UniformConstant 690
+    692(g_sSamp):    691(ptr) Variable UniformConstant
+             693:             TypeImage 20(float) 1D array nonsampled format:Rg32f
+             694:             TypePointer UniformConstant 693
+695(g_tTex1df2a):    694(ptr) Variable UniformConstant
+             696:             TypeImage 6(int) 1D array nonsampled format:Rg32i
+             697:             TypePointer UniformConstant 696
+698(g_tTex1di2a):    697(ptr) Variable UniformConstant
+             699:             TypeImage 13(int) 1D array nonsampled format:Rg32ui
+             700:             TypePointer UniformConstant 699
+701(g_tTex1du2a):    700(ptr) Variable UniformConstant
+             702:             TypeImage 20(float) 2D array nonsampled format:Rg32f
+             703:             TypePointer UniformConstant 702
+704(g_tTex2df2a):    703(ptr) Variable UniformConstant
+             705:             TypeImage 6(int) 2D array nonsampled format:Rg32i
+             706:             TypePointer UniformConstant 705
+707(g_tTex2di2a):    706(ptr) Variable UniformConstant
+             708:             TypeImage 13(int) 2D array nonsampled format:Rg32ui
+             709:             TypePointer UniformConstant 708
+710(g_tTex2du2a):    709(ptr) Variable UniformConstant
          4(main):           2 Function None 3
                5:             Label
-             582:43(PS_OUTPUT) FunctionCall 45(@main()
-             583:   42(fvec4) CompositeExtract 582 0
-                              Store 581(@entryPointOutput.Color) 583
+             688:43(PS_OUTPUT) FunctionCall 45(@main()
+             689:   42(fvec4) CompositeExtract 688 0
+                              Store 687(@entryPointOutput.Color) 689
                               Return
                               FunctionEnd
     11(Fn1(vi2;):    7(ivec2) Function None 9
@@ -2058,587 +2058,692 @@
                               FunctionEnd
       45(@main():43(PS_OUTPUT) Function None 44
               46:             Label
-         82(r00):     22(ptr) Variable Function
-         87(r01):      8(ptr) Variable Function
-         95(r02):     15(ptr) Variable Function
-        103(r10):     22(ptr) Variable Function
-        111(r11):      8(ptr) Variable Function
-        119(r12):     15(ptr) Variable Function
-        127(r20):     22(ptr) Variable Function
-        137(r21):      8(ptr) Variable Function
-        145(r22):     15(ptr) Variable Function
-        153(lf2):     22(ptr) Variable Function
-  158(storeTemp):     22(ptr) Variable Function
-  168(storeTemp):      8(ptr) Variable Function
-  174(storeTemp):     15(ptr) Variable Function
-       182(val1):     22(ptr) Variable Function
-  184(coordTemp):    183(ptr) Variable Function
-  187(storeTemp):     22(ptr) Variable Function
-  198(coordTemp):    183(ptr) Variable Function
-  201(storeTemp):     22(ptr) Variable Function
-  212(coordTemp):    183(ptr) Variable Function
-  215(storeTemp):     22(ptr) Variable Function
-  226(coordTemp):    183(ptr) Variable Function
-  229(storeTemp):      8(ptr) Variable Function
-  239(coordTemp):    183(ptr) Variable Function
-  242(storeTemp):      8(ptr) Variable Function
-  252(coordTemp):    183(ptr) Variable Function
-  255(storeTemp):      8(ptr) Variable Function
-  266(coordTemp):    183(ptr) Variable Function
+         85(r00):     22(ptr) Variable Function
+         93(r01):      8(ptr) Variable Function
+        104(r02):     15(ptr) Variable Function
+        116(r10):     22(ptr) Variable Function
+        127(r11):      8(ptr) Variable Function
+        138(r12):     15(ptr) Variable Function
+        149(r20):     22(ptr) Variable Function
+        162(r21):      8(ptr) Variable Function
+        173(r22):     15(ptr) Variable Function
+        184(lf2):     22(ptr) Variable Function
+  189(storeTemp):     22(ptr) Variable Function
+  199(storeTemp):      8(ptr) Variable Function
+  205(storeTemp):     15(ptr) Variable Function
+       213(val1):     22(ptr) Variable Function
+  215(coordTemp):    214(ptr) Variable Function
+  218(storeTemp):     22(ptr) Variable Function
+  232(coordTemp):    214(ptr) Variable Function
+  235(storeTemp):     22(ptr) Variable Function
+  249(coordTemp):    214(ptr) Variable Function
+  252(storeTemp):     22(ptr) Variable Function
+  266(coordTemp):    214(ptr) Variable Function
   269(storeTemp):      8(ptr) Variable Function
-  280(coordTemp):    183(ptr) Variable Function
-  283(storeTemp):      8(ptr) Variable Function
-  293(coordTemp):    183(ptr) Variable Function
-  296(storeTemp):      8(ptr) Variable Function
-  306(storeTemp):     22(ptr) Variable Function
-  316(storeTemp):      8(ptr) Variable Function
-  323(storeTemp):     15(ptr) Variable Function
-  330(storeTemp):     22(ptr) Variable Function
-  340(storeTemp):      8(ptr) Variable Function
-  347(storeTemp):     15(ptr) Variable Function
-      358(param):     22(ptr) Variable Function
-      364(param):      8(ptr) Variable Function
-      370(param):     15(ptr) Variable Function
-    372(tempArg):     22(ptr) Variable Function
-      373(param):     22(ptr) Variable Function
-    380(tempArg):      8(ptr) Variable Function
-      381(param):      8(ptr) Variable Function
-    388(tempArg):     15(ptr) Variable Function
-      389(param):     15(ptr) Variable Function
-  396(coordTemp):    183(ptr) Variable Function
-  399(storeTemp):     22(ptr) Variable Function
-  410(coordTemp):    183(ptr) Variable Function
-  413(storeTemp):      8(ptr) Variable Function
-  423(coordTemp):    183(ptr) Variable Function
-  426(storeTemp):     15(ptr) Variable Function
-  436(coordTemp):    183(ptr) Variable Function
-  439(storeTemp):     22(ptr) Variable Function
-  449(coordTemp):    183(ptr) Variable Function
-  452(storeTemp):      8(ptr) Variable Function
-  462(coordTemp):    183(ptr) Variable Function
-  465(storeTemp):     15(ptr) Variable Function
-  475(coordTemp):    183(ptr) Variable Function
-478(storeTempPre):     22(ptr) Variable Function
-482(storeTempPost):     22(ptr) Variable Function
-  490(coordTemp):    183(ptr) Variable Function
-493(storeTempPre):     15(ptr) Variable Function
-497(storeTempPost):     15(ptr) Variable Function
-  505(coordTemp):    183(ptr) Variable Function
-508(storeTempPre):      8(ptr) Variable Function
-512(storeTempPost):      8(ptr) Variable Function
-  520(coordTemp):    183(ptr) Variable Function
-523(storeTempPre):     22(ptr) Variable Function
-527(storeTempPost):     22(ptr) Variable Function
-  535(coordTemp):    183(ptr) Variable Function
-538(storeTempPre):      8(ptr) Variable Function
-542(storeTempPost):      8(ptr) Variable Function
-  550(coordTemp):    183(ptr) Variable Function
-553(storeTempPre):     15(ptr) Variable Function
-557(storeTempPost):     15(ptr) Variable Function
-  565(storeTemp):     22(ptr) Variable Function
-      573(psout):    572(ptr) Variable Function
+  282(coordTemp):    214(ptr) Variable Function
+  285(storeTemp):      8(ptr) Variable Function
+  298(coordTemp):    214(ptr) Variable Function
+  301(storeTemp):      8(ptr) Variable Function
+  315(coordTemp):    214(ptr) Variable Function
+  318(storeTemp):      8(ptr) Variable Function
+  332(coordTemp):    214(ptr) Variable Function
+  335(storeTemp):      8(ptr) Variable Function
+  348(coordTemp):    214(ptr) Variable Function
+  351(storeTemp):      8(ptr) Variable Function
+  364(storeTemp):     22(ptr) Variable Function
+  374(storeTemp):      8(ptr) Variable Function
+  381(storeTemp):     15(ptr) Variable Function
+  388(storeTemp):     22(ptr) Variable Function
+  398(storeTemp):      8(ptr) Variable Function
+  405(storeTemp):     15(ptr) Variable Function
+      419(param):     22(ptr) Variable Function
+      428(param):      8(ptr) Variable Function
+      437(param):     15(ptr) Variable Function
+    439(tempArg):     22(ptr) Variable Function
+      440(param):     22(ptr) Variable Function
+    447(tempArg):      8(ptr) Variable Function
+      448(param):      8(ptr) Variable Function
+    455(tempArg):     15(ptr) Variable Function
+      456(param):     15(ptr) Variable Function
+  463(coordTemp):    214(ptr) Variable Function
+  466(storeTemp):     22(ptr) Variable Function
+  480(coordTemp):    214(ptr) Variable Function
+  483(storeTemp):      8(ptr) Variable Function
+  496(coordTemp):    214(ptr) Variable Function
+  499(storeTemp):     15(ptr) Variable Function
+  512(coordTemp):    214(ptr) Variable Function
+  515(storeTemp):     22(ptr) Variable Function
+  528(coordTemp):    214(ptr) Variable Function
+  531(storeTemp):      8(ptr) Variable Function
+  544(coordTemp):    214(ptr) Variable Function
+  547(storeTemp):     15(ptr) Variable Function
+  560(coordTemp):    214(ptr) Variable Function
+563(storeTempPre):     22(ptr) Variable Function
+570(storeTempPost):     22(ptr) Variable Function
+  578(coordTemp):    214(ptr) Variable Function
+581(storeTempPre):     15(ptr) Variable Function
+588(storeTempPost):     15(ptr) Variable Function
+  596(coordTemp):    214(ptr) Variable Function
+599(storeTempPre):      8(ptr) Variable Function
+606(storeTempPost):      8(ptr) Variable Function
+  614(coordTemp):    214(ptr) Variable Function
+617(storeTempPre):     22(ptr) Variable Function
+624(storeTempPost):     22(ptr) Variable Function
+  632(coordTemp):    214(ptr) Variable Function
+635(storeTempPre):      8(ptr) Variable Function
+642(storeTempPost):      8(ptr) Variable Function
+  650(coordTemp):    214(ptr) Variable Function
+653(storeTempPre):     15(ptr) Variable Function
+660(storeTempPost):     15(ptr) Variable Function
+  668(storeTemp):     22(ptr) Variable Function
+      679(psout):    678(ptr) Variable Function
               77:          74 Load 76(g_tTex1df2)
               79:     78(ptr) AccessChain 66 56
               80:      6(int) Load 79
-              81:   21(fvec2) ImageRead 77 80
-              83:          74 Load 76(g_tTex1df2)
-              84:     78(ptr) AccessChain 66 56
-              85:      6(int) Load 84
-              86:   21(fvec2) ImageRead 83 85
-                              Store 82(r00) 86
-              91:          88 Load 90(g_tTex1di2)
-              92:     78(ptr) AccessChain 66 56
-              93:      6(int) Load 92
-              94:    7(ivec2) ImageRead 91 93
-                              Store 87(r01) 94
-              99:          96 Load 98(g_tTex1du2)
-             100:     78(ptr) AccessChain 66 56
-             101:      6(int) Load 100
-             102:   14(ivec2) ImageRead 99 101
-                              Store 95(r02) 102
-             107:         104 Load 106(g_tTex2df2)
-             108:     68(ptr) AccessChain 66 67
-             109:    7(ivec2) Load 108
-             110:   21(fvec2) ImageRead 107 109
-                              Store 103(r10) 110
-             115:         112 Load 114(g_tTex2di2)
-             116:     68(ptr) AccessChain 66 67
-             117:    7(ivec2) Load 116
-             118:    7(ivec2) ImageRead 115 117
-                              Store 111(r11) 118
-             123:         120 Load 122(g_tTex2du2)
-             124:     68(ptr) AccessChain 66 67
-             125:    7(ivec2) Load 124
-             126:   14(ivec2) ImageRead 123 125
-                              Store 119(r12) 126
-             131:         128 Load 130(g_tTex3df2)
-             134:    133(ptr) AccessChain 66 132
-             135:   62(ivec3) Load 134
-             136:   21(fvec2) ImageRead 131 135
-                              Store 127(r20) 136
-             141:         138 Load 140(g_tTex3di2)
-             142:    133(ptr) AccessChain 66 132
-             143:   62(ivec3) Load 142
-             144:    7(ivec2) ImageRead 141 143
-                              Store 137(r21) 144
-             149:         146 Load 148(g_tTex3du2)
-             150:    133(ptr) AccessChain 66 132
-             151:   62(ivec3) Load 150
-             152:   14(ivec2) ImageRead 149 151
-                              Store 145(r22) 152
+              81:   42(fvec4) ImageRead 77 80
+              82:   20(float) CompositeExtract 81 0
+              83:   20(float) CompositeExtract 81 1
+              84:   21(fvec2) CompositeConstruct 82 83
+              86:          74 Load 76(g_tTex1df2)
+              87:     78(ptr) AccessChain 66 56
+              88:      6(int) Load 87
+              89:   42(fvec4) ImageRead 86 88
+              90:   20(float) CompositeExtract 89 0
+              91:   20(float) CompositeExtract 89 1
+              92:   21(fvec2) CompositeConstruct 90 91
+                              Store 85(r00) 92
+              97:          94 Load 96(g_tTex1di2)
+              98:     78(ptr) AccessChain 66 56
+              99:      6(int) Load 98
+             100:   63(ivec4) ImageRead 97 99
+             101:      6(int) CompositeExtract 100 0
+             102:      6(int) CompositeExtract 100 1
+             103:    7(ivec2) CompositeConstruct 101 102
+                              Store 93(r01) 103
+             108:         105 Load 107(g_tTex1du2)
+             109:     78(ptr) AccessChain 66 56
+             110:      6(int) Load 109
+             112:  111(ivec4) ImageRead 108 110
+             113:     13(int) CompositeExtract 112 0
+             114:     13(int) CompositeExtract 112 1
+             115:   14(ivec2) CompositeConstruct 113 114
+                              Store 104(r02) 115
+             120:         117 Load 119(g_tTex2df2)
+             121:     68(ptr) AccessChain 66 67
+             122:    7(ivec2) Load 121
+             123:   42(fvec4) ImageRead 120 122
+             124:   20(float) CompositeExtract 123 0
+             125:   20(float) CompositeExtract 123 1
+             126:   21(fvec2) CompositeConstruct 124 125
+                              Store 116(r10) 126
+             131:         128 Load 130(g_tTex2di2)
+             132:     68(ptr) AccessChain 66 67
+             133:    7(ivec2) Load 132
+             134:   63(ivec4) ImageRead 131 133
+             135:      6(int) CompositeExtract 134 0
+             136:      6(int) CompositeExtract 134 1
+             137:    7(ivec2) CompositeConstruct 135 136
+                              Store 127(r11) 137
+             142:         139 Load 141(g_tTex2du2)
+             143:     68(ptr) AccessChain 66 67
+             144:    7(ivec2) Load 143
+             145:  111(ivec4) ImageRead 142 144
+             146:     13(int) CompositeExtract 145 0
+             147:     13(int) CompositeExtract 145 1
+             148:   14(ivec2) CompositeConstruct 146 147
+                              Store 138(r12) 148
+             153:         150 Load 152(g_tTex3df2)
              156:    155(ptr) AccessChain 66 154
-             157:   21(fvec2) Load 156
-                              Store 153(lf2) 157
-             159:   21(fvec2) FunctionCall 40(SomeValue()
-                              Store 158(storeTemp) 159
-             160:          74 Load 76(g_tTex1df2)
-             161:     78(ptr) AccessChain 66 56
-             162:      6(int) Load 161
-             163:   21(fvec2) Load 158(storeTemp)
-                              ImageWrite 160 162 163
-             164:          74 Load 76(g_tTex1df2)
-             165:     78(ptr) AccessChain 66 56
-             166:      6(int) Load 165
-             167:   21(fvec2) Load 153(lf2)
-                              ImageWrite 164 166 167
-                              Store 168(storeTemp) 169
-             170:          88 Load 90(g_tTex1di2)
-             171:     78(ptr) AccessChain 66 56
-             172:      6(int) Load 171
-             173:    7(ivec2) Load 168(storeTemp)
-                              ImageWrite 170 172 173
-                              Store 174(storeTemp) 177
-             178:          96 Load 98(g_tTex1du2)
-             179:     78(ptr) AccessChain 66 56
-             180:      6(int) Load 179
-             181:   14(ivec2) Load 174(storeTemp)
-                              ImageWrite 178 180 181
-             185:     78(ptr) AccessChain 66 56
-             186:      6(int) Load 185
-                              Store 184(coordTemp) 186
-             188:          74 Load 76(g_tTex1df2)
-             189:      6(int) Load 184(coordTemp)
-             190:   21(fvec2) ImageRead 188 189
-                              Store 187(storeTemp) 190
-             192:   21(fvec2) Load 187(storeTemp)
-             193:   21(fvec2) VectorTimesScalar 192 191
-                              Store 187(storeTemp) 193
-             194:          74 Load 76(g_tTex1df2)
-             195:      6(int) Load 184(coordTemp)
-             196:   21(fvec2) Load 187(storeTemp)
-                              ImageWrite 194 195 196
-             197:   21(fvec2) Load 187(storeTemp)
-                              Store 182(val1) 197
-             199:     78(ptr) AccessChain 66 56
-             200:      6(int) Load 199
-                              Store 198(coordTemp) 200
-             202:          74 Load 76(g_tTex1df2)
-             203:      6(int) Load 198(coordTemp)
-             204:   21(fvec2) ImageRead 202 203
-                              Store 201(storeTemp) 204
-             206:   21(fvec2) Load 201(storeTemp)
-             207:   21(fvec2) CompositeConstruct 205 205
-             208:   21(fvec2) FSub 206 207
-                              Store 201(storeTemp) 208
-             209:          74 Load 76(g_tTex1df2)
-             210:      6(int) Load 198(coordTemp)
-             211:   21(fvec2) Load 201(storeTemp)
-                              ImageWrite 209 210 211
-             213:     78(ptr) AccessChain 66 56
-             214:      6(int) Load 213
-                              Store 212(coordTemp) 214
-             216:          74 Load 76(g_tTex1df2)
-             217:      6(int) Load 212(coordTemp)
-             218:   21(fvec2) ImageRead 216 217
-                              Store 215(storeTemp) 218
-             220:   21(fvec2) Load 215(storeTemp)
-             221:   21(fvec2) CompositeConstruct 219 219
-             222:   21(fvec2) FAdd 220 221
-                              Store 215(storeTemp) 222
-             223:          74 Load 76(g_tTex1df2)
-             224:      6(int) Load 212(coordTemp)
-             225:   21(fvec2) Load 215(storeTemp)
-                              ImageWrite 223 224 225
-             227:     78(ptr) AccessChain 66 56
-             228:      6(int) Load 227
-                              Store 226(coordTemp) 228
-             230:          88 Load 90(g_tTex1di2)
-             231:      6(int) Load 226(coordTemp)
-             232:    7(ivec2) ImageRead 230 231
-                              Store 229(storeTemp) 232
-             233:    7(ivec2) Load 229(storeTemp)
-             234:    7(ivec2) CompositeConstruct 132 132
-             235:    7(ivec2) SDiv 233 234
-                              Store 229(storeTemp) 235
-             236:          88 Load 90(g_tTex1di2)
-             237:      6(int) Load 226(coordTemp)
-             238:    7(ivec2) Load 229(storeTemp)
-                              ImageWrite 236 237 238
-             240:     78(ptr) AccessChain 66 56
-             241:      6(int) Load 240
-                              Store 239(coordTemp) 241
-             243:          88 Load 90(g_tTex1di2)
-             244:      6(int) Load 239(coordTemp)
-             245:    7(ivec2) ImageRead 243 244
-                              Store 242(storeTemp) 245
-             246:    7(ivec2) Load 242(storeTemp)
-             247:    7(ivec2) CompositeConstruct 132 132
-             248:    7(ivec2) SMod 246 247
-                              Store 242(storeTemp) 248
-             249:          88 Load 90(g_tTex1di2)
-             250:      6(int) Load 239(coordTemp)
-             251:    7(ivec2) Load 242(storeTemp)
-                              ImageWrite 249 250 251
-             253:     78(ptr) AccessChain 66 56
-             254:      6(int) Load 253
-                              Store 252(coordTemp) 254
-             256:          88 Load 90(g_tTex1di2)
-             257:      6(int) Load 252(coordTemp)
-             258:    7(ivec2) ImageRead 256 257
-                              Store 255(storeTemp) 258
-             260:    7(ivec2) Load 255(storeTemp)
-             261:    7(ivec2) CompositeConstruct 259 259
-             262:    7(ivec2) BitwiseAnd 260 261
-                              Store 255(storeTemp) 262
-             263:          88 Load 90(g_tTex1di2)
-             264:      6(int) Load 252(coordTemp)
-             265:    7(ivec2) Load 255(storeTemp)
+             157:   62(ivec3) Load 156
+             158:   42(fvec4) ImageRead 153 157
+             159:   20(float) CompositeExtract 158 0
+             160:   20(float) CompositeExtract 158 1
+             161:   21(fvec2) CompositeConstruct 159 160
+                              Store 149(r20) 161
+             166:         163 Load 165(g_tTex3di2)
+             167:    155(ptr) AccessChain 66 154
+             168:   62(ivec3) Load 167
+             169:   63(ivec4) ImageRead 166 168
+             170:      6(int) CompositeExtract 169 0
+             171:      6(int) CompositeExtract 169 1
+             172:    7(ivec2) CompositeConstruct 170 171
+                              Store 162(r21) 172
+             177:         174 Load 176(g_tTex3du2)
+             178:    155(ptr) AccessChain 66 154
+             179:   62(ivec3) Load 178
+             180:  111(ivec4) ImageRead 177 179
+             181:     13(int) CompositeExtract 180 0
+             182:     13(int) CompositeExtract 180 1
+             183:   14(ivec2) CompositeConstruct 181 182
+                              Store 173(r22) 183
+             187:    186(ptr) AccessChain 66 185
+             188:   21(fvec2) Load 187
+                              Store 184(lf2) 188
+             190:   21(fvec2) FunctionCall 40(SomeValue()
+                              Store 189(storeTemp) 190
+             191:          74 Load 76(g_tTex1df2)
+             192:     78(ptr) AccessChain 66 56
+             193:      6(int) Load 192
+             194:   21(fvec2) Load 189(storeTemp)
+                              ImageWrite 191 193 194
+             195:          74 Load 76(g_tTex1df2)
+             196:     78(ptr) AccessChain 66 56
+             197:      6(int) Load 196
+             198:   21(fvec2) Load 184(lf2)
+                              ImageWrite 195 197 198
+                              Store 199(storeTemp) 200
+             201:          94 Load 96(g_tTex1di2)
+             202:     78(ptr) AccessChain 66 56
+             203:      6(int) Load 202
+             204:    7(ivec2) Load 199(storeTemp)
+                              ImageWrite 201 203 204
+                              Store 205(storeTemp) 208
+             209:         105 Load 107(g_tTex1du2)
+             210:     78(ptr) AccessChain 66 56
+             211:      6(int) Load 210
+             212:   14(ivec2) Load 205(storeTemp)
+                              ImageWrite 209 211 212
+             216:     78(ptr) AccessChain 66 56
+             217:      6(int) Load 216
+                              Store 215(coordTemp) 217
+             219:          74 Load 76(g_tTex1df2)
+             220:      6(int) Load 215(coordTemp)
+             221:   42(fvec4) ImageRead 219 220
+             222:   20(float) CompositeExtract 221 0
+             223:   20(float) CompositeExtract 221 1
+             224:   21(fvec2) CompositeConstruct 222 223
+                              Store 218(storeTemp) 224
+             226:   21(fvec2) Load 218(storeTemp)
+             227:   21(fvec2) VectorTimesScalar 226 225
+                              Store 218(storeTemp) 227
+             228:          74 Load 76(g_tTex1df2)
+             229:      6(int) Load 215(coordTemp)
+             230:   21(fvec2) Load 218(storeTemp)
+                              ImageWrite 228 229 230
+             231:   21(fvec2) Load 218(storeTemp)
+                              Store 213(val1) 231
+             233:     78(ptr) AccessChain 66 56
+             234:      6(int) Load 233
+                              Store 232(coordTemp) 234
+             236:          74 Load 76(g_tTex1df2)
+             237:      6(int) Load 232(coordTemp)
+             238:   42(fvec4) ImageRead 236 237
+             239:   20(float) CompositeExtract 238 0
+             240:   20(float) CompositeExtract 238 1
+             241:   21(fvec2) CompositeConstruct 239 240
+                              Store 235(storeTemp) 241
+             243:   21(fvec2) Load 235(storeTemp)
+             244:   21(fvec2) CompositeConstruct 242 242
+             245:   21(fvec2) FSub 243 244
+                              Store 235(storeTemp) 245
+             246:          74 Load 76(g_tTex1df2)
+             247:      6(int) Load 232(coordTemp)
+             248:   21(fvec2) Load 235(storeTemp)
+                              ImageWrite 246 247 248
+             250:     78(ptr) AccessChain 66 56
+             251:      6(int) Load 250
+                              Store 249(coordTemp) 251
+             253:          74 Load 76(g_tTex1df2)
+             254:      6(int) Load 249(coordTemp)
+             255:   42(fvec4) ImageRead 253 254
+             256:   20(float) CompositeExtract 255 0
+             257:   20(float) CompositeExtract 255 1
+             258:   21(fvec2) CompositeConstruct 256 257
+                              Store 252(storeTemp) 258
+             260:   21(fvec2) Load 252(storeTemp)
+             261:   21(fvec2) CompositeConstruct 259 259
+             262:   21(fvec2) FAdd 260 261
+                              Store 252(storeTemp) 262
+             263:          74 Load 76(g_tTex1df2)
+             264:      6(int) Load 249(coordTemp)
+             265:   21(fvec2) Load 252(storeTemp)
                               ImageWrite 263 264 265
              267:     78(ptr) AccessChain 66 56
              268:      6(int) Load 267
                               Store 266(coordTemp) 268
-             270:          88 Load 90(g_tTex1di2)
+             270:          94 Load 96(g_tTex1di2)
              271:      6(int) Load 266(coordTemp)
-             272:    7(ivec2) ImageRead 270 271
-                              Store 269(storeTemp) 272
-             274:    7(ivec2) Load 269(storeTemp)
-             275:    7(ivec2) CompositeConstruct 273 273
-             276:    7(ivec2) BitwiseOr 274 275
-                              Store 269(storeTemp) 276
-             277:          88 Load 90(g_tTex1di2)
-             278:      6(int) Load 266(coordTemp)
-             279:    7(ivec2) Load 269(storeTemp)
-                              ImageWrite 277 278 279
-             281:     78(ptr) AccessChain 66 56
-             282:      6(int) Load 281
-                              Store 280(coordTemp) 282
-             284:          88 Load 90(g_tTex1di2)
-             285:      6(int) Load 280(coordTemp)
-             286:    7(ivec2) ImageRead 284 285
-                              Store 283(storeTemp) 286
-             287:    7(ivec2) Load 283(storeTemp)
-             288:    7(ivec2) CompositeConstruct 132 132
-             289:    7(ivec2) ShiftLeftLogical 287 288
-                              Store 283(storeTemp) 289
-             290:          88 Load 90(g_tTex1di2)
-             291:      6(int) Load 280(coordTemp)
-             292:    7(ivec2) Load 283(storeTemp)
-                              ImageWrite 290 291 292
-             294:     78(ptr) AccessChain 66 56
-             295:      6(int) Load 294
-                              Store 293(coordTemp) 295
-             297:          88 Load 90(g_tTex1di2)
-             298:      6(int) Load 293(coordTemp)
-             299:    7(ivec2) ImageRead 297 298
-                              Store 296(storeTemp) 299
-             300:    7(ivec2) Load 296(storeTemp)
-             301:    7(ivec2) CompositeConstruct 132 132
-             302:    7(ivec2) ShiftRightArithmetic 300 301
-                              Store 296(storeTemp) 302
-             303:          88 Load 90(g_tTex1di2)
-             304:      6(int) Load 293(coordTemp)
-             305:    7(ivec2) Load 296(storeTemp)
-                              ImageWrite 303 304 305
-             307:   21(fvec2) FunctionCall 40(SomeValue()
-                              Store 306(storeTemp) 307
-             308:         104 Load 106(g_tTex2df2)
-             309:     68(ptr) AccessChain 66 67
-             310:    7(ivec2) Load 309
-             311:   21(fvec2) Load 306(storeTemp)
-                              ImageWrite 308 310 311
-             312:         104 Load 106(g_tTex2df2)
-             313:     68(ptr) AccessChain 66 67
-             314:    7(ivec2) Load 313
-             315:   21(fvec2) Load 153(lf2)
-                              ImageWrite 312 314 315
-                              Store 316(storeTemp) 318
-             319:         112 Load 114(g_tTex2di2)
-             320:     68(ptr) AccessChain 66 67
-             321:    7(ivec2) Load 320
-             322:    7(ivec2) Load 316(storeTemp)
-                              ImageWrite 319 321 322
-                              Store 323(storeTemp) 325
-             326:         120 Load 122(g_tTex2du2)
-             327:     68(ptr) AccessChain 66 67
-             328:    7(ivec2) Load 327
-             329:   14(ivec2) Load 323(storeTemp)
-                              ImageWrite 326 328 329
-             331:   21(fvec2) FunctionCall 40(SomeValue()
-                              Store 330(storeTemp) 331
-             332:         128 Load 130(g_tTex3df2)
-             333:    133(ptr) AccessChain 66 132
-             334:   62(ivec3) Load 333
-             335:   21(fvec2) Load 330(storeTemp)
-                              ImageWrite 332 334 335
-             336:         128 Load 130(g_tTex3df2)
-             337:    133(ptr) AccessChain 66 132
-             338:   62(ivec3) Load 337
-             339:   21(fvec2) Load 153(lf2)
-                              ImageWrite 336 338 339
-                              Store 340(storeTemp) 342
-             343:         138 Load 140(g_tTex3di2)
-             344:    133(ptr) AccessChain 66 132
-             345:   62(ivec3) Load 344
-             346:    7(ivec2) Load 340(storeTemp)
-                              ImageWrite 343 345 346
-                              Store 347(storeTemp) 349
-             350:         146 Load 148(g_tTex3du2)
-             351:    133(ptr) AccessChain 66 132
-             352:   62(ivec3) Load 351
-             353:   14(ivec2) Load 347(storeTemp)
-                              ImageWrite 350 352 353
-             354:          74 Load 76(g_tTex1df2)
-             355:     78(ptr) AccessChain 66 56
-             356:      6(int) Load 355
-             357:   21(fvec2) ImageRead 354 356
-                              Store 358(param) 357
-             359:   21(fvec2) FunctionCall 25(Fn1(vf2;) 358(param)
-             360:          88 Load 90(g_tTex1di2)
-             361:     78(ptr) AccessChain 66 56
-             362:      6(int) Load 361
-             363:    7(ivec2) ImageRead 360 362
-                              Store 364(param) 363
-             365:    7(ivec2) FunctionCall 11(Fn1(vi2;) 364(param)
-             366:          96 Load 98(g_tTex1du2)
-             367:     78(ptr) AccessChain 66 56
-             368:      6(int) Load 367
-             369:   14(ivec2) ImageRead 366 368
-                              Store 370(param) 369
-             371:   14(ivec2) FunctionCall 18(Fn1(vu2;) 370(param)
-             374:           2 FunctionCall 37(Fn2(vf2;) 373(param)
-             375:   21(fvec2) Load 373(param)
-                              Store 372(tempArg) 375
-             376:          74 Load 76(g_tTex1df2)
-             377:     78(ptr) AccessChain 66 56
-             378:      6(int) Load 377
-             379:   21(fvec2) Load 372(tempArg)
-                              ImageWrite 376 378 379
-             382:           2 FunctionCall 29(Fn2(vi2;) 381(param)
-             383:    7(ivec2) Load 381(param)
-                              Store 380(tempArg) 383
-             384:          88 Load 90(g_tTex1di2)
-             385:     78(ptr) AccessChain 66 56
-             386:      6(int) Load 385
-             387:    7(ivec2) Load 380(tempArg)
+             272:   63(ivec4) ImageRead 270 271
+             273:      6(int) CompositeExtract 272 0
+             274:      6(int) CompositeExtract 272 1
+             275:    7(ivec2) CompositeConstruct 273 274
+                              Store 269(storeTemp) 275
+             276:    7(ivec2) Load 269(storeTemp)
+             277:    7(ivec2) CompositeConstruct 154 154
+             278:    7(ivec2) SDiv 276 277
+                              Store 269(storeTemp) 278
+             279:          94 Load 96(g_tTex1di2)
+             280:      6(int) Load 266(coordTemp)
+             281:    7(ivec2) Load 269(storeTemp)
+                              ImageWrite 279 280 281
+             283:     78(ptr) AccessChain 66 56
+             284:      6(int) Load 283
+                              Store 282(coordTemp) 284
+             286:          94 Load 96(g_tTex1di2)
+             287:      6(int) Load 282(coordTemp)
+             288:   63(ivec4) ImageRead 286 287
+             289:      6(int) CompositeExtract 288 0
+             290:      6(int) CompositeExtract 288 1
+             291:    7(ivec2) CompositeConstruct 289 290
+                              Store 285(storeTemp) 291
+             292:    7(ivec2) Load 285(storeTemp)
+             293:    7(ivec2) CompositeConstruct 154 154
+             294:    7(ivec2) SMod 292 293
+                              Store 285(storeTemp) 294
+             295:          94 Load 96(g_tTex1di2)
+             296:      6(int) Load 282(coordTemp)
+             297:    7(ivec2) Load 285(storeTemp)
+                              ImageWrite 295 296 297
+             299:     78(ptr) AccessChain 66 56
+             300:      6(int) Load 299
+                              Store 298(coordTemp) 300
+             302:          94 Load 96(g_tTex1di2)
+             303:      6(int) Load 298(coordTemp)
+             304:   63(ivec4) ImageRead 302 303
+             305:      6(int) CompositeExtract 304 0
+             306:      6(int) CompositeExtract 304 1
+             307:    7(ivec2) CompositeConstruct 305 306
+                              Store 301(storeTemp) 307
+             309:    7(ivec2) Load 301(storeTemp)
+             310:    7(ivec2) CompositeConstruct 308 308
+             311:    7(ivec2) BitwiseAnd 309 310
+                              Store 301(storeTemp) 311
+             312:          94 Load 96(g_tTex1di2)
+             313:      6(int) Load 298(coordTemp)
+             314:    7(ivec2) Load 301(storeTemp)
+                              ImageWrite 312 313 314
+             316:     78(ptr) AccessChain 66 56
+             317:      6(int) Load 316
+                              Store 315(coordTemp) 317
+             319:          94 Load 96(g_tTex1di2)
+             320:      6(int) Load 315(coordTemp)
+             321:   63(ivec4) ImageRead 319 320
+             322:      6(int) CompositeExtract 321 0
+             323:      6(int) CompositeExtract 321 1
+             324:    7(ivec2) CompositeConstruct 322 323
+                              Store 318(storeTemp) 324
+             326:    7(ivec2) Load 318(storeTemp)
+             327:    7(ivec2) CompositeConstruct 325 325
+             328:    7(ivec2) BitwiseOr 326 327
+                              Store 318(storeTemp) 328
+             329:          94 Load 96(g_tTex1di2)
+             330:      6(int) Load 315(coordTemp)
+             331:    7(ivec2) Load 318(storeTemp)
+                              ImageWrite 329 330 331
+             333:     78(ptr) AccessChain 66 56
+             334:      6(int) Load 333
+                              Store 332(coordTemp) 334
+             336:          94 Load 96(g_tTex1di2)
+             337:      6(int) Load 332(coordTemp)
+             338:   63(ivec4) ImageRead 336 337
+             339:      6(int) CompositeExtract 338 0
+             340:      6(int) CompositeExtract 338 1
+             341:    7(ivec2) CompositeConstruct 339 340
+                              Store 335(storeTemp) 341
+             342:    7(ivec2) Load 335(storeTemp)
+             343:    7(ivec2) CompositeConstruct 154 154
+             344:    7(ivec2) ShiftLeftLogical 342 343
+                              Store 335(storeTemp) 344
+             345:          94 Load 96(g_tTex1di2)
+             346:      6(int) Load 332(coordTemp)
+             347:    7(ivec2) Load 335(storeTemp)
+                              ImageWrite 345 346 347
+             349:     78(ptr) AccessChain 66 56
+             350:      6(int) Load 349
+                              Store 348(coordTemp) 350
+             352:          94 Load 96(g_tTex1di2)
+             353:      6(int) Load 348(coordTemp)
+             354:   63(ivec4) ImageRead 352 353
+             355:      6(int) CompositeExtract 354 0
+             356:      6(int) CompositeExtract 354 1
+             357:    7(ivec2) CompositeConstruct 355 356
+                              Store 351(storeTemp) 357
+             358:    7(ivec2) Load 351(storeTemp)
+             359:    7(ivec2) CompositeConstruct 154 154
+             360:    7(ivec2) ShiftRightArithmetic 358 359
+                              Store 351(storeTemp) 360
+             361:          94 Load 96(g_tTex1di2)
+             362:      6(int) Load 348(coordTemp)
+             363:    7(ivec2) Load 351(storeTemp)
+                              ImageWrite 361 362 363
+             365:   21(fvec2) FunctionCall 40(SomeValue()
+                              Store 364(storeTemp) 365
+             366:         117 Load 119(g_tTex2df2)
+             367:     68(ptr) AccessChain 66 67
+             368:    7(ivec2) Load 367
+             369:   21(fvec2) Load 364(storeTemp)
+                              ImageWrite 366 368 369
+             370:         117 Load 119(g_tTex2df2)
+             371:     68(ptr) AccessChain 66 67
+             372:    7(ivec2) Load 371
+             373:   21(fvec2) Load 184(lf2)
+                              ImageWrite 370 372 373
+                              Store 374(storeTemp) 376
+             377:         128 Load 130(g_tTex2di2)
+             378:     68(ptr) AccessChain 66 67
+             379:    7(ivec2) Load 378
+             380:    7(ivec2) Load 374(storeTemp)
+                              ImageWrite 377 379 380
+                              Store 381(storeTemp) 383
+             384:         139 Load 141(g_tTex2du2)
+             385:     68(ptr) AccessChain 66 67
+             386:    7(ivec2) Load 385
+             387:   14(ivec2) Load 381(storeTemp)
                               ImageWrite 384 386 387
-             390:           2 FunctionCall 33(Fn2(vu2;) 389(param)
-             391:   14(ivec2) Load 389(param)
-                              Store 388(tempArg) 391
-             392:          96 Load 98(g_tTex1du2)
-             393:     78(ptr) AccessChain 66 56
-             394:      6(int) Load 393
-             395:   14(ivec2) Load 388(tempArg)
-                              ImageWrite 392 394 395
-             397:     78(ptr) AccessChain 66 56
-             398:      6(int) Load 397
-                              Store 396(coordTemp) 398
-             400:          74 Load 76(g_tTex1df2)
-             401:      6(int) Load 396(coordTemp)
-             402:   21(fvec2) ImageRead 400 401
-                              Store 399(storeTemp) 402
-             403:   21(fvec2) Load 399(storeTemp)
-             405:   21(fvec2) CompositeConstruct 404 404
-             406:   21(fvec2) FAdd 403 405
-                              Store 399(storeTemp) 406
-             407:          74 Load 76(g_tTex1df2)
-             408:      6(int) Load 396(coordTemp)
-             409:   21(fvec2) Load 399(storeTemp)
-                              ImageWrite 407 408 409
-             411:     78(ptr) AccessChain 66 56
-             412:      6(int) Load 411
-                              Store 410(coordTemp) 412
-             414:          88 Load 90(g_tTex1di2)
-             415:      6(int) Load 410(coordTemp)
-             416:    7(ivec2) ImageRead 414 415
-                              Store 413(storeTemp) 416
-             417:    7(ivec2) Load 413(storeTemp)
-             418:    7(ivec2) CompositeConstruct 67 67
-             419:    7(ivec2) IAdd 417 418
-                              Store 413(storeTemp) 419
-             420:          88 Load 90(g_tTex1di2)
-             421:      6(int) Load 410(coordTemp)
-             422:    7(ivec2) Load 413(storeTemp)
-                              ImageWrite 420 421 422
-             424:     78(ptr) AccessChain 66 56
-             425:      6(int) Load 424
-                              Store 423(coordTemp) 425
-             427:          96 Load 98(g_tTex1du2)
-             428:      6(int) Load 423(coordTemp)
-             429:   14(ivec2) ImageRead 427 428
-                              Store 426(storeTemp) 429
-             430:   14(ivec2) Load 426(storeTemp)
-             431:    7(ivec2) CompositeConstruct 67 67
-             432:   14(ivec2) IAdd 430 431
-                              Store 426(storeTemp) 432
-             433:          96 Load 98(g_tTex1du2)
-             434:      6(int) Load 423(coordTemp)
-             435:   14(ivec2) Load 426(storeTemp)
-                              ImageWrite 433 434 435
-             437:     78(ptr) AccessChain 66 56
-             438:      6(int) Load 437
-                              Store 436(coordTemp) 438
-             440:          74 Load 76(g_tTex1df2)
-             441:      6(int) Load 436(coordTemp)
-             442:   21(fvec2) ImageRead 440 441
-                              Store 439(storeTemp) 442
-             443:   21(fvec2) Load 439(storeTemp)
-             444:   21(fvec2) CompositeConstruct 404 404
-             445:   21(fvec2) FSub 443 444
-                              Store 439(storeTemp) 445
-             446:          74 Load 76(g_tTex1df2)
-             447:      6(int) Load 436(coordTemp)
-             448:   21(fvec2) Load 439(storeTemp)
-                              ImageWrite 446 447 448
-             450:     78(ptr) AccessChain 66 56
-             451:      6(int) Load 450
-                              Store 449(coordTemp) 451
-             453:          88 Load 90(g_tTex1di2)
-             454:      6(int) Load 449(coordTemp)
-             455:    7(ivec2) ImageRead 453 454
-                              Store 452(storeTemp) 455
-             456:    7(ivec2) Load 452(storeTemp)
-             457:    7(ivec2) CompositeConstruct 67 67
-             458:    7(ivec2) ISub 456 457
-                              Store 452(storeTemp) 458
-             459:          88 Load 90(g_tTex1di2)
-             460:      6(int) Load 449(coordTemp)
-             461:    7(ivec2) Load 452(storeTemp)
-                              ImageWrite 459 460 461
-             463:     78(ptr) AccessChain 66 56
-             464:      6(int) Load 463
-                              Store 462(coordTemp) 464
-             466:          96 Load 98(g_tTex1du2)
-             467:      6(int) Load 462(coordTemp)
-             468:   14(ivec2) ImageRead 466 467
-                              Store 465(storeTemp) 468
-             469:   14(ivec2) Load 465(storeTemp)
-             470:    7(ivec2) CompositeConstruct 67 67
-             471:   14(ivec2) ISub 469 470
-                              Store 465(storeTemp) 471
-             472:          96 Load 98(g_tTex1du2)
-             473:      6(int) Load 462(coordTemp)
-             474:   14(ivec2) Load 465(storeTemp)
-                              ImageWrite 472 473 474
-             476:     78(ptr) AccessChain 66 56
-             477:      6(int) Load 476
-                              Store 475(coordTemp) 477
-             479:          74 Load 76(g_tTex1df2)
-             480:      6(int) Load 475(coordTemp)
-             481:   21(fvec2) ImageRead 479 480
-                              Store 478(storeTempPre) 481
-             483:   21(fvec2) Load 478(storeTempPre)
-                              Store 482(storeTempPost) 483
-             484:   21(fvec2) Load 482(storeTempPost)
-             485:   21(fvec2) CompositeConstruct 404 404
-             486:   21(fvec2) FAdd 484 485
-                              Store 482(storeTempPost) 486
-             487:          74 Load 76(g_tTex1df2)
-             488:      6(int) Load 475(coordTemp)
-             489:   21(fvec2) Load 482(storeTempPost)
-                              ImageWrite 487 488 489
-             491:     78(ptr) AccessChain 66 56
-             492:      6(int) Load 491
-                              Store 490(coordTemp) 492
-             494:          96 Load 98(g_tTex1du2)
-             495:      6(int) Load 490(coordTemp)
-             496:   14(ivec2) ImageRead 494 495
-                              Store 493(storeTempPre) 496
-             498:   14(ivec2) Load 493(storeTempPre)
-                              Store 497(storeTempPost) 498
-             499:   14(ivec2) Load 497(storeTempPost)
-             500:    7(ivec2) CompositeConstruct 67 67
-             501:   14(ivec2) ISub 499 500
-                              Store 497(storeTempPost) 501
-             502:          96 Load 98(g_tTex1du2)
-             503:      6(int) Load 490(coordTemp)
-             504:   14(ivec2) Load 497(storeTempPost)
-                              ImageWrite 502 503 504
-             506:     78(ptr) AccessChain 66 56
-             507:      6(int) Load 506
-                              Store 505(coordTemp) 507
-             509:          88 Load 90(g_tTex1di2)
-             510:      6(int) Load 505(coordTemp)
-             511:    7(ivec2) ImageRead 509 510
-                              Store 508(storeTempPre) 511
-             513:    7(ivec2) Load 508(storeTempPre)
-                              Store 512(storeTempPost) 513
-             514:    7(ivec2) Load 512(storeTempPost)
-             515:    7(ivec2) CompositeConstruct 67 67
-             516:    7(ivec2) IAdd 514 515
-                              Store 512(storeTempPost) 516
-             517:          88 Load 90(g_tTex1di2)
-             518:      6(int) Load 505(coordTemp)
-             519:    7(ivec2) Load 512(storeTempPost)
-                              ImageWrite 517 518 519
-             521:     78(ptr) AccessChain 66 56
-             522:      6(int) Load 521
-                              Store 520(coordTemp) 522
-             524:          74 Load 76(g_tTex1df2)
-             525:      6(int) Load 520(coordTemp)
-             526:   21(fvec2) ImageRead 524 525
-                              Store 523(storeTempPre) 526
-             528:   21(fvec2) Load 523(storeTempPre)
-                              Store 527(storeTempPost) 528
-             529:   21(fvec2) Load 527(storeTempPost)
-             530:   21(fvec2) CompositeConstruct 404 404
-             531:   21(fvec2) FSub 529 530
-                              Store 527(storeTempPost) 531
-             532:          74 Load 76(g_tTex1df2)
-             533:      6(int) Load 520(coordTemp)
-             534:   21(fvec2) Load 527(storeTempPost)
-                              ImageWrite 532 533 534
-             536:     78(ptr) AccessChain 66 56
-             537:      6(int) Load 536
-                              Store 535(coordTemp) 537
-             539:          88 Load 90(g_tTex1di2)
-             540:      6(int) Load 535(coordTemp)
-             541:    7(ivec2) ImageRead 539 540
-                              Store 538(storeTempPre) 541
-             543:    7(ivec2) Load 538(storeTempPre)
-                              Store 542(storeTempPost) 543
-             544:    7(ivec2) Load 542(storeTempPost)
-             545:    7(ivec2) CompositeConstruct 67 67
-             546:    7(ivec2) IAdd 544 545
-                              Store 542(storeTempPost) 546
-             547:          88 Load 90(g_tTex1di2)
-             548:      6(int) Load 535(coordTemp)
-             549:    7(ivec2) Load 542(storeTempPost)
-                              ImageWrite 547 548 549
-             551:     78(ptr) AccessChain 66 56
-             552:      6(int) Load 551
-                              Store 550(coordTemp) 552
-             554:          96 Load 98(g_tTex1du2)
-             555:      6(int) Load 550(coordTemp)
-             556:   14(ivec2) ImageRead 554 555
-                              Store 553(storeTempPre) 556
-             558:   14(ivec2) Load 553(storeTempPre)
-                              Store 557(storeTempPost) 558
-             559:   14(ivec2) Load 557(storeTempPost)
-             560:    7(ivec2) CompositeConstruct 67 67
-             561:   14(ivec2) ISub 559 560
-                              Store 557(storeTempPost) 561
-             562:          96 Load 98(g_tTex1du2)
-             563:      6(int) Load 550(coordTemp)
-             564:   14(ivec2) Load 557(storeTempPost)
-                              ImageWrite 562 563 564
-             566:         104 Load 106(g_tTex2df2)
-             569:   21(fvec2) ImageRead 566 568
-                              Store 565(storeTemp) 569
-             570:          74 Load 76(g_tTex1df2)
-             571:   21(fvec2) Load 565(storeTemp)
-                              ImageWrite 570 67 571
-             576:    575(ptr) AccessChain 573(psout) 56
-                              Store 576 574
-             577:43(PS_OUTPUT) Load 573(psout)
-                              ReturnValue 577
+             389:   21(fvec2) FunctionCall 40(SomeValue()
+                              Store 388(storeTemp) 389
+             390:         150 Load 152(g_tTex3df2)
+             391:    155(ptr) AccessChain 66 154
+             392:   62(ivec3) Load 391
+             393:   21(fvec2) Load 388(storeTemp)
+                              ImageWrite 390 392 393
+             394:         150 Load 152(g_tTex3df2)
+             395:    155(ptr) AccessChain 66 154
+             396:   62(ivec3) Load 395
+             397:   21(fvec2) Load 184(lf2)
+                              ImageWrite 394 396 397
+                              Store 398(storeTemp) 400
+             401:         163 Load 165(g_tTex3di2)
+             402:    155(ptr) AccessChain 66 154
+             403:   62(ivec3) Load 402
+             404:    7(ivec2) Load 398(storeTemp)
+                              ImageWrite 401 403 404
+                              Store 405(storeTemp) 407
+             408:         174 Load 176(g_tTex3du2)
+             409:    155(ptr) AccessChain 66 154
+             410:   62(ivec3) Load 409
+             411:   14(ivec2) Load 405(storeTemp)
+                              ImageWrite 408 410 411
+             412:          74 Load 76(g_tTex1df2)
+             413:     78(ptr) AccessChain 66 56
+             414:      6(int) Load 413
+             415:   42(fvec4) ImageRead 412 414
+             416:   20(float) CompositeExtract 415 0
+             417:   20(float) CompositeExtract 415 1
+             418:   21(fvec2) CompositeConstruct 416 417
+                              Store 419(param) 418
+             420:   21(fvec2) FunctionCall 25(Fn1(vf2;) 419(param)
+             421:          94 Load 96(g_tTex1di2)
+             422:     78(ptr) AccessChain 66 56
+             423:      6(int) Load 422
+             424:   63(ivec4) ImageRead 421 423
+             425:      6(int) CompositeExtract 424 0
+             426:      6(int) CompositeExtract 424 1
+             427:    7(ivec2) CompositeConstruct 425 426
+                              Store 428(param) 427
+             429:    7(ivec2) FunctionCall 11(Fn1(vi2;) 428(param)
+             430:         105 Load 107(g_tTex1du2)
+             431:     78(ptr) AccessChain 66 56
+             432:      6(int) Load 431
+             433:  111(ivec4) ImageRead 430 432
+             434:     13(int) CompositeExtract 433 0
+             435:     13(int) CompositeExtract 433 1
+             436:   14(ivec2) CompositeConstruct 434 435
+                              Store 437(param) 436
+             438:   14(ivec2) FunctionCall 18(Fn1(vu2;) 437(param)
+             441:           2 FunctionCall 37(Fn2(vf2;) 440(param)
+             442:   21(fvec2) Load 440(param)
+                              Store 439(tempArg) 442
+             443:          74 Load 76(g_tTex1df2)
+             444:     78(ptr) AccessChain 66 56
+             445:      6(int) Load 444
+             446:   21(fvec2) Load 439(tempArg)
+                              ImageWrite 443 445 446
+             449:           2 FunctionCall 29(Fn2(vi2;) 448(param)
+             450:    7(ivec2) Load 448(param)
+                              Store 447(tempArg) 450
+             451:          94 Load 96(g_tTex1di2)
+             452:     78(ptr) AccessChain 66 56
+             453:      6(int) Load 452
+             454:    7(ivec2) Load 447(tempArg)
+                              ImageWrite 451 453 454
+             457:           2 FunctionCall 33(Fn2(vu2;) 456(param)
+             458:   14(ivec2) Load 456(param)
+                              Store 455(tempArg) 458
+             459:         105 Load 107(g_tTex1du2)
+             460:     78(ptr) AccessChain 66 56
+             461:      6(int) Load 460
+             462:   14(ivec2) Load 455(tempArg)
+                              ImageWrite 459 461 462
+             464:     78(ptr) AccessChain 66 56
+             465:      6(int) Load 464
+                              Store 463(coordTemp) 465
+             467:          74 Load 76(g_tTex1df2)
+             468:      6(int) Load 463(coordTemp)
+             469:   42(fvec4) ImageRead 467 468
+             470:   20(float) CompositeExtract 469 0
+             471:   20(float) CompositeExtract 469 1
+             472:   21(fvec2) CompositeConstruct 470 471
+                              Store 466(storeTemp) 472
+             473:   21(fvec2) Load 466(storeTemp)
+             475:   21(fvec2) CompositeConstruct 474 474
+             476:   21(fvec2) FAdd 473 475
+                              Store 466(storeTemp) 476
+             477:          74 Load 76(g_tTex1df2)
+             478:      6(int) Load 463(coordTemp)
+             479:   21(fvec2) Load 466(storeTemp)
+                              ImageWrite 477 478 479
+             481:     78(ptr) AccessChain 66 56
+             482:      6(int) Load 481
+                              Store 480(coordTemp) 482
+             484:          94 Load 96(g_tTex1di2)
+             485:      6(int) Load 480(coordTemp)
+             486:   63(ivec4) ImageRead 484 485
+             487:      6(int) CompositeExtract 486 0
+             488:      6(int) CompositeExtract 486 1
+             489:    7(ivec2) CompositeConstruct 487 488
+                              Store 483(storeTemp) 489
+             490:    7(ivec2) Load 483(storeTemp)
+             491:    7(ivec2) CompositeConstruct 67 67
+             492:    7(ivec2) IAdd 490 491
+                              Store 483(storeTemp) 492
+             493:          94 Load 96(g_tTex1di2)
+             494:      6(int) Load 480(coordTemp)
+             495:    7(ivec2) Load 483(storeTemp)
+                              ImageWrite 493 494 495
+             497:     78(ptr) AccessChain 66 56
+             498:      6(int) Load 497
+                              Store 496(coordTemp) 498
+             500:         105 Load 107(g_tTex1du2)
+             501:      6(int) Load 496(coordTemp)
+             502:  111(ivec4) ImageRead 500 501
+             503:     13(int) CompositeExtract 502 0
+             504:     13(int) CompositeExtract 502 1
+             505:   14(ivec2) CompositeConstruct 503 504
+                              Store 499(storeTemp) 505
+             506:   14(ivec2) Load 499(storeTemp)
+             507:    7(ivec2) CompositeConstruct 67 67
+             508:   14(ivec2) IAdd 506 507
+                              Store 499(storeTemp) 508
+             509:         105 Load 107(g_tTex1du2)
+             510:      6(int) Load 496(coordTemp)
+             511:   14(ivec2) Load 499(storeTemp)
+                              ImageWrite 509 510 511
+             513:     78(ptr) AccessChain 66 56
+             514:      6(int) Load 513
+                              Store 512(coordTemp) 514
+             516:          74 Load 76(g_tTex1df2)
+             517:      6(int) Load 512(coordTemp)
+             518:   42(fvec4) ImageRead 516 517
+             519:   20(float) CompositeExtract 518 0
+             520:   20(float) CompositeExtract 518 1
+             521:   21(fvec2) CompositeConstruct 519 520
+                              Store 515(storeTemp) 521
+             522:   21(fvec2) Load 515(storeTemp)
+             523:   21(fvec2) CompositeConstruct 474 474
+             524:   21(fvec2) FSub 522 523
+                              Store 515(storeTemp) 524
+             525:          74 Load 76(g_tTex1df2)
+             526:      6(int) Load 512(coordTemp)
+             527:   21(fvec2) Load 515(storeTemp)
+                              ImageWrite 525 526 527
+             529:     78(ptr) AccessChain 66 56
+             530:      6(int) Load 529
+                              Store 528(coordTemp) 530
+             532:          94 Load 96(g_tTex1di2)
+             533:      6(int) Load 528(coordTemp)
+             534:   63(ivec4) ImageRead 532 533
+             535:      6(int) CompositeExtract 534 0
+             536:      6(int) CompositeExtract 534 1
+             537:    7(ivec2) CompositeConstruct 535 536
+                              Store 531(storeTemp) 537
+             538:    7(ivec2) Load 531(storeTemp)
+             539:    7(ivec2) CompositeConstruct 67 67
+             540:    7(ivec2) ISub 538 539
+                              Store 531(storeTemp) 540
+             541:          94 Load 96(g_tTex1di2)
+             542:      6(int) Load 528(coordTemp)
+             543:    7(ivec2) Load 531(storeTemp)
+                              ImageWrite 541 542 543
+             545:     78(ptr) AccessChain 66 56
+             546:      6(int) Load 545
+                              Store 544(coordTemp) 546
+             548:         105 Load 107(g_tTex1du2)
+             549:      6(int) Load 544(coordTemp)
+             550:  111(ivec4) ImageRead 548 549
+             551:     13(int) CompositeExtract 550 0
+             552:     13(int) CompositeExtract 550 1
+             553:   14(ivec2) CompositeConstruct 551 552
+                              Store 547(storeTemp) 553
+             554:   14(ivec2) Load 547(storeTemp)
+             555:    7(ivec2) CompositeConstruct 67 67
+             556:   14(ivec2) ISub 554 555
+                              Store 547(storeTemp) 556
+             557:         105 Load 107(g_tTex1du2)
+             558:      6(int) Load 544(coordTemp)
+             559:   14(ivec2) Load 547(storeTemp)
+                              ImageWrite 557 558 559
+             561:     78(ptr) AccessChain 66 56
+             562:      6(int) Load 561
+                              Store 560(coordTemp) 562
+             564:          74 Load 76(g_tTex1df2)
+             565:      6(int) Load 560(coordTemp)
+             566:   42(fvec4) ImageRead 564 565
+             567:   20(float) CompositeExtract 566 0
+             568:   20(float) CompositeExtract 566 1
+             569:   21(fvec2) CompositeConstruct 567 568
+                              Store 563(storeTempPre) 569
+             571:   21(fvec2) Load 563(storeTempPre)
+                              Store 570(storeTempPost) 571
+             572:   21(fvec2) Load 570(storeTempPost)
+             573:   21(fvec2) CompositeConstruct 474 474
+             574:   21(fvec2) FAdd 572 573
+                              Store 570(storeTempPost) 574
+             575:          74 Load 76(g_tTex1df2)
+             576:      6(int) Load 560(coordTemp)
+             577:   21(fvec2) Load 570(storeTempPost)
+                              ImageWrite 575 576 577
+             579:     78(ptr) AccessChain 66 56
+             580:      6(int) Load 579
+                              Store 578(coordTemp) 580
+             582:         105 Load 107(g_tTex1du2)
+             583:      6(int) Load 578(coordTemp)
+             584:  111(ivec4) ImageRead 582 583
+             585:     13(int) CompositeExtract 584 0
+             586:     13(int) CompositeExtract 584 1
+             587:   14(ivec2) CompositeConstruct 585 586
+                              Store 581(storeTempPre) 587
+             589:   14(ivec2) Load 581(storeTempPre)
+                              Store 588(storeTempPost) 589
+             590:   14(ivec2) Load 588(storeTempPost)
+             591:    7(ivec2) CompositeConstruct 67 67
+             592:   14(ivec2) ISub 590 591
+                              Store 588(storeTempPost) 592
+             593:         105 Load 107(g_tTex1du2)
+             594:      6(int) Load 578(coordTemp)
+             595:   14(ivec2) Load 588(storeTempPost)
+                              ImageWrite 593 594 595
+             597:     78(ptr) AccessChain 66 56
+             598:      6(int) Load 597
+                              Store 596(coordTemp) 598
+             600:          94 Load 96(g_tTex1di2)
+             601:      6(int) Load 596(coordTemp)
+             602:   63(ivec4) ImageRead 600 601
+             603:      6(int) CompositeExtract 602 0
+             604:      6(int) CompositeExtract 602 1
+             605:    7(ivec2) CompositeConstruct 603 604
+                              Store 599(storeTempPre) 605
+             607:    7(ivec2) Load 599(storeTempPre)
+                              Store 606(storeTempPost) 607
+             608:    7(ivec2) Load 606(storeTempPost)
+             609:    7(ivec2) CompositeConstruct 67 67
+             610:    7(ivec2) IAdd 608 609
+                              Store 606(storeTempPost) 610
+             611:          94 Load 96(g_tTex1di2)
+             612:      6(int) Load 596(coordTemp)
+             613:    7(ivec2) Load 606(storeTempPost)
+                              ImageWrite 611 612 613
+             615:     78(ptr) AccessChain 66 56
+             616:      6(int) Load 615
+                              Store 614(coordTemp) 616
+             618:          74 Load 76(g_tTex1df2)
+             619:      6(int) Load 614(coordTemp)
+             620:   42(fvec4) ImageRead 618 619
+             621:   20(float) CompositeExtract 620 0
+             622:   20(float) CompositeExtract 620 1
+             623:   21(fvec2) CompositeConstruct 621 622
+                              Store 617(storeTempPre) 623
+             625:   21(fvec2) Load 617(storeTempPre)
+                              Store 624(storeTempPost) 625
+             626:   21(fvec2) Load 624(storeTempPost)
+             627:   21(fvec2) CompositeConstruct 474 474
+             628:   21(fvec2) FSub 626 627
+                              Store 624(storeTempPost) 628
+             629:          74 Load 76(g_tTex1df2)
+             630:      6(int) Load 614(coordTemp)
+             631:   21(fvec2) Load 624(storeTempPost)
+                              ImageWrite 629 630 631
+             633:     78(ptr) AccessChain 66 56
+             634:      6(int) Load 633
+                              Store 632(coordTemp) 634
+             636:          94 Load 96(g_tTex1di2)
+             637:      6(int) Load 632(coordTemp)
+             638:   63(ivec4) ImageRead 636 637
+             639:      6(int) CompositeExtract 638 0
+             640:      6(int) CompositeExtract 638 1
+             641:    7(ivec2) CompositeConstruct 639 640
+                              Store 635(storeTempPre) 641
+             643:    7(ivec2) Load 635(storeTempPre)
+                              Store 642(storeTempPost) 643
+             644:    7(ivec2) Load 642(storeTempPost)
+             645:    7(ivec2) CompositeConstruct 67 67
+             646:    7(ivec2) IAdd 644 645
+                              Store 642(storeTempPost) 646
+             647:          94 Load 96(g_tTex1di2)
+             648:      6(int) Load 632(coordTemp)
+             649:    7(ivec2) Load 642(storeTempPost)
+                              ImageWrite 647 648 649
+             651:     78(ptr) AccessChain 66 56
+             652:      6(int) Load 651
+                              Store 650(coordTemp) 652
+             654:         105 Load 107(g_tTex1du2)
+             655:      6(int) Load 650(coordTemp)
+             656:  111(ivec4) ImageRead 654 655
+             657:     13(int) CompositeExtract 656 0
+             658:     13(int) CompositeExtract 656 1
+             659:   14(ivec2) CompositeConstruct 657 658
+                              Store 653(storeTempPre) 659
+             661:   14(ivec2) Load 653(storeTempPre)
+                              Store 660(storeTempPost) 661
+             662:   14(ivec2) Load 660(storeTempPost)
+             663:    7(ivec2) CompositeConstruct 67 67
+             664:   14(ivec2) ISub 662 663
+                              Store 660(storeTempPost) 664
+             665:         105 Load 107(g_tTex1du2)
+             666:      6(int) Load 650(coordTemp)
+             667:   14(ivec2) Load 660(storeTempPost)
+                              ImageWrite 665 666 667
+             669:         117 Load 119(g_tTex2df2)
+             672:   42(fvec4) ImageRead 669 671
+             673:   20(float) CompositeExtract 672 0
+             674:   20(float) CompositeExtract 672 1
+             675:   21(fvec2) CompositeConstruct 673 674
+                              Store 668(storeTemp) 675
+             676:          74 Load 76(g_tTex1df2)
+             677:   21(fvec2) Load 668(storeTemp)
+                              ImageWrite 676 67 677
+             682:    681(ptr) AccessChain 679(psout) 56
+                              Store 682 680
+             683:43(PS_OUTPUT) Load 679(psout)
+                              ReturnValue 683
                               FunctionEnd
diff --git a/third_party/vulkan-deps/glslang/src/Test/baseResults/hlsl.wavebroadcast.comp.out b/third_party/vulkan-deps/glslang/src/Test/baseResults/hlsl.wavebroadcast.comp.out
index 573195d..01bc953 100644
--- a/third_party/vulkan-deps/glslang/src/Test/baseResults/hlsl.wavebroadcast.comp.out
+++ b/third_party/vulkan-deps/glslang/src/Test/baseResults/hlsl.wavebroadcast.comp.out
@@ -2299,7 +2299,7 @@
 
 // Module Version 10300
 // Generated by (magic number): 8000a
-// Id's are bound by 359
+// Id's are bound by 393
 
                               Capability Shader
                               Capability Float64
@@ -2308,7 +2308,7 @@
                               Capability GroupNonUniformShuffle
                1:             ExtInstImport  "GLSL.std.450"
                               MemoryModel Logical GLSL450
-                              EntryPoint GLCompute 4  "CSMain" 354
+                              EntryPoint GLCompute 4  "CSMain" 388
                               ExecutionMode 4 LocalSize 32 16 1
                               Source HLSL 500
                               Name 4  "CSMain"
@@ -2322,9 +2322,9 @@
                               Name 22  "data"
                               MemberName 22(data) 0  "@data"
                               Name 24  "data"
-                              Name 352  "dti"
-                              Name 354  "dti"
-                              Name 356  "param"
+                              Name 386  "dti"
+                              Name 388  "dti"
+                              Name 390  "param"
                               MemberDecorate 20(Types) 0 Offset 0
                               MemberDecorate 20(Types) 1 Offset 16
                               MemberDecorate 20(Types) 2 Offset 32
@@ -2334,7 +2334,7 @@
                               Decorate 22(data) BufferBlock
                               Decorate 24(data) DescriptorSet 0
                               Decorate 24(data) Binding 0
-                              Decorate 354(dti) BuiltIn GlobalInvocationId
+                              Decorate 388(dti) BuiltIn GlobalInvocationId
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeInt 32 0
@@ -2361,32 +2361,34 @@
               36:      6(int) Constant 3
               43:             TypePointer Uniform 6(int)
               52:             TypeVector 6(int) 2
-              73:     14(int) Constant 1
-              76:             TypePointer Uniform 15(ivec4)
-              85:             TypePointer Uniform 14(int)
-              94:             TypeVector 14(int) 2
-             106:             TypeVector 14(int) 3
-             116:     14(int) Constant 2
-             119:             TypePointer Uniform 17(fvec4)
-             128:             TypePointer Uniform 16(float)
-             137:             TypeVector 16(float) 2
-             149:             TypeVector 16(float) 3
-             159:     14(int) Constant 3
-             162:             TypePointer Uniform 19(f64vec4)
-             171:             TypePointer Uniform 18(float64_t)
-             180:             TypeVector 18(float64_t) 2
-             192:             TypeVector 18(float64_t) 3
-             353:             TypePointer Input 7(ivec3)
-        354(dti):    353(ptr) Variable Input
+              59:      6(int) Constant 1
+              74:      6(int) Constant 2
+              79:     14(int) Constant 1
+              82:             TypePointer Uniform 15(ivec4)
+              91:             TypePointer Uniform 14(int)
+             100:             TypeVector 14(int) 2
+             113:             TypeVector 14(int) 3
+             126:     14(int) Constant 2
+             129:             TypePointer Uniform 17(fvec4)
+             138:             TypePointer Uniform 16(float)
+             147:             TypeVector 16(float) 2
+             160:             TypeVector 16(float) 3
+             173:     14(int) Constant 3
+             176:             TypePointer Uniform 19(f64vec4)
+             185:             TypePointer Uniform 18(float64_t)
+             194:             TypeVector 18(float64_t) 2
+             207:             TypeVector 18(float64_t) 3
+             387:             TypePointer Input 7(ivec3)
+        388(dti):    387(ptr) Variable Input
        4(CSMain):           2 Function None 3
                5:             Label
-        352(dti):      8(ptr) Variable Function
-      356(param):      8(ptr) Variable Function
-             355:    7(ivec3) Load 354(dti)
-                              Store 352(dti) 355
-             357:    7(ivec3) Load 352(dti)
-                              Store 356(param) 357
-             358:           2 FunctionCall 11(@CSMain(vu3;) 356(param)
+        386(dti):      8(ptr) Variable Function
+      390(param):      8(ptr) Variable Function
+             389:    7(ivec3) Load 388(dti)
+                              Store 386(dti) 389
+             391:    7(ivec3) Load 386(dti)
+                              Store 390(param) 391
+             392:           2 FunctionCall 11(@CSMain(vu3;) 390(param)
                               Return
                               FunctionEnd
 11(@CSMain(vu3;):           2 Function None 9
@@ -2418,315 +2420,371 @@
               54:   13(ivec4) Load 53
               55:   52(ivec2) VectorShuffle 54 54 0 1
               56:   52(ivec2) GroupNonUniformShuffle 36 55 35
-              57:     32(ptr) AccessChain 24(data) 25 49 25
-              58:   13(ivec4) Load 57
-              59:   13(ivec4) VectorShuffle 58 56 4 5 2 3
-                              Store 57 59
-              60:     27(ptr) AccessChain 10(dti) 26
-              61:      6(int) Load 60
+              57:     43(ptr) AccessChain 24(data) 25 49 25 26
+              58:      6(int) CompositeExtract 56 0
+                              Store 57 58
+              60:     43(ptr) AccessChain 24(data) 25 49 25 59
+              61:      6(int) CompositeExtract 56 1
+                              Store 60 61
               62:     27(ptr) AccessChain 10(dti) 26
               63:      6(int) Load 62
-              64:     32(ptr) AccessChain 24(data) 25 63 25
-              65:   13(ivec4) Load 64
-              66:    7(ivec3) VectorShuffle 65 65 0 1 2
-              67:    7(ivec3) GroupNonUniformShuffle 36 66 35
-              68:     32(ptr) AccessChain 24(data) 25 61 25
-              69:   13(ivec4) Load 68
-              70:   13(ivec4) VectorShuffle 69 67 4 5 6 3
-                              Store 68 70
-              71:     27(ptr) AccessChain 10(dti) 26
-              72:      6(int) Load 71
-              74:     27(ptr) AccessChain 10(dti) 26
-              75:      6(int) Load 74
-              77:     76(ptr) AccessChain 24(data) 25 75 73
-              78:   15(ivec4) Load 77
-              79:   15(ivec4) GroupNonUniformShuffle 36 78 35
-              80:     76(ptr) AccessChain 24(data) 25 72 73
-                              Store 80 79
-              81:     27(ptr) AccessChain 10(dti) 26
-              82:      6(int) Load 81
-              83:     27(ptr) AccessChain 10(dti) 26
-              84:      6(int) Load 83
-              86:     85(ptr) AccessChain 24(data) 25 84 73 26
-              87:     14(int) Load 86
-              88:     14(int) GroupNonUniformShuffle 36 87 35
-              89:     85(ptr) AccessChain 24(data) 25 82 73 26
-                              Store 89 88
-              90:     27(ptr) AccessChain 10(dti) 26
-              91:      6(int) Load 90
-              92:     27(ptr) AccessChain 10(dti) 26
-              93:      6(int) Load 92
-              95:     76(ptr) AccessChain 24(data) 25 93 73
-              96:   15(ivec4) Load 95
-              97:   94(ivec2) VectorShuffle 96 96 0 1
-              98:   94(ivec2) GroupNonUniformShuffle 36 97 35
-              99:     76(ptr) AccessChain 24(data) 25 91 73
-             100:   15(ivec4) Load 99
-             101:   15(ivec4) VectorShuffle 100 98 4 5 2 3
-                              Store 99 101
-             102:     27(ptr) AccessChain 10(dti) 26
-             103:      6(int) Load 102
-             104:     27(ptr) AccessChain 10(dti) 26
-             105:      6(int) Load 104
-             107:     76(ptr) AccessChain 24(data) 25 105 73
-             108:   15(ivec4) Load 107
-             109:  106(ivec3) VectorShuffle 108 108 0 1 2
-             110:  106(ivec3) GroupNonUniformShuffle 36 109 35
-             111:     76(ptr) AccessChain 24(data) 25 103 73
-             112:   15(ivec4) Load 111
-             113:   15(ivec4) VectorShuffle 112 110 4 5 6 3
-                              Store 111 113
-             114:     27(ptr) AccessChain 10(dti) 26
-             115:      6(int) Load 114
-             117:     27(ptr) AccessChain 10(dti) 26
-             118:      6(int) Load 117
-             120:    119(ptr) AccessChain 24(data) 25 118 116
-             121:   17(fvec4) Load 120
-             122:   17(fvec4) GroupNonUniformShuffle 36 121 35
-             123:    119(ptr) AccessChain 24(data) 25 115 116
-                              Store 123 122
+              64:     27(ptr) AccessChain 10(dti) 26
+              65:      6(int) Load 64
+              66:     32(ptr) AccessChain 24(data) 25 65 25
+              67:   13(ivec4) Load 66
+              68:    7(ivec3) VectorShuffle 67 67 0 1 2
+              69:    7(ivec3) GroupNonUniformShuffle 36 68 35
+              70:     43(ptr) AccessChain 24(data) 25 63 25 26
+              71:      6(int) CompositeExtract 69 0
+                              Store 70 71
+              72:     43(ptr) AccessChain 24(data) 25 63 25 59
+              73:      6(int) CompositeExtract 69 1
+                              Store 72 73
+              75:     43(ptr) AccessChain 24(data) 25 63 25 74
+              76:      6(int) CompositeExtract 69 2
+                              Store 75 76
+              77:     27(ptr) AccessChain 10(dti) 26
+              78:      6(int) Load 77
+              80:     27(ptr) AccessChain 10(dti) 26
+              81:      6(int) Load 80
+              83:     82(ptr) AccessChain 24(data) 25 81 79
+              84:   15(ivec4) Load 83
+              85:   15(ivec4) GroupNonUniformShuffle 36 84 35
+              86:     82(ptr) AccessChain 24(data) 25 78 79
+                              Store 86 85
+              87:     27(ptr) AccessChain 10(dti) 26
+              88:      6(int) Load 87
+              89:     27(ptr) AccessChain 10(dti) 26
+              90:      6(int) Load 89
+              92:     91(ptr) AccessChain 24(data) 25 90 79 26
+              93:     14(int) Load 92
+              94:     14(int) GroupNonUniformShuffle 36 93 35
+              95:     91(ptr) AccessChain 24(data) 25 88 79 26
+                              Store 95 94
+              96:     27(ptr) AccessChain 10(dti) 26
+              97:      6(int) Load 96
+              98:     27(ptr) AccessChain 10(dti) 26
+              99:      6(int) Load 98
+             101:     82(ptr) AccessChain 24(data) 25 99 79
+             102:   15(ivec4) Load 101
+             103:  100(ivec2) VectorShuffle 102 102 0 1
+             104:  100(ivec2) GroupNonUniformShuffle 36 103 35
+             105:     91(ptr) AccessChain 24(data) 25 97 79 26
+             106:     14(int) CompositeExtract 104 0
+                              Store 105 106
+             107:     91(ptr) AccessChain 24(data) 25 97 79 59
+             108:     14(int) CompositeExtract 104 1
+                              Store 107 108
+             109:     27(ptr) AccessChain 10(dti) 26
+             110:      6(int) Load 109
+             111:     27(ptr) AccessChain 10(dti) 26
+             112:      6(int) Load 111
+             114:     82(ptr) AccessChain 24(data) 25 112 79
+             115:   15(ivec4) Load 114
+             116:  113(ivec3) VectorShuffle 115 115 0 1 2
+             117:  113(ivec3) GroupNonUniformShuffle 36 116 35
+             118:     91(ptr) AccessChain 24(data) 25 110 79 26
+             119:     14(int) CompositeExtract 117 0
+                              Store 118 119
+             120:     91(ptr) AccessChain 24(data) 25 110 79 59
+             121:     14(int) CompositeExtract 117 1
+                              Store 120 121
+             122:     91(ptr) AccessChain 24(data) 25 110 79 74
+             123:     14(int) CompositeExtract 117 2
+                              Store 122 123
              124:     27(ptr) AccessChain 10(dti) 26
              125:      6(int) Load 124
-             126:     27(ptr) AccessChain 10(dti) 26
-             127:      6(int) Load 126
-             129:    128(ptr) AccessChain 24(data) 25 127 116 26
-             130:   16(float) Load 129
-             131:   16(float) GroupNonUniformShuffle 36 130 35
-             132:    128(ptr) AccessChain 24(data) 25 125 116 26
-                              Store 132 131
-             133:     27(ptr) AccessChain 10(dti) 26
-             134:      6(int) Load 133
-             135:     27(ptr) AccessChain 10(dti) 26
-             136:      6(int) Load 135
-             138:    119(ptr) AccessChain 24(data) 25 136 116
-             139:   17(fvec4) Load 138
-             140:  137(fvec2) VectorShuffle 139 139 0 1
-             141:  137(fvec2) GroupNonUniformShuffle 36 140 35
-             142:    119(ptr) AccessChain 24(data) 25 134 116
-             143:   17(fvec4) Load 142
-             144:   17(fvec4) VectorShuffle 143 141 4 5 2 3
-                              Store 142 144
+             127:     27(ptr) AccessChain 10(dti) 26
+             128:      6(int) Load 127
+             130:    129(ptr) AccessChain 24(data) 25 128 126
+             131:   17(fvec4) Load 130
+             132:   17(fvec4) GroupNonUniformShuffle 36 131 35
+             133:    129(ptr) AccessChain 24(data) 25 125 126
+                              Store 133 132
+             134:     27(ptr) AccessChain 10(dti) 26
+             135:      6(int) Load 134
+             136:     27(ptr) AccessChain 10(dti) 26
+             137:      6(int) Load 136
+             139:    138(ptr) AccessChain 24(data) 25 137 126 26
+             140:   16(float) Load 139
+             141:   16(float) GroupNonUniformShuffle 36 140 35
+             142:    138(ptr) AccessChain 24(data) 25 135 126 26
+                              Store 142 141
+             143:     27(ptr) AccessChain 10(dti) 26
+             144:      6(int) Load 143
              145:     27(ptr) AccessChain 10(dti) 26
              146:      6(int) Load 145
-             147:     27(ptr) AccessChain 10(dti) 26
-             148:      6(int) Load 147
-             150:    119(ptr) AccessChain 24(data) 25 148 116
-             151:   17(fvec4) Load 150
-             152:  149(fvec3) VectorShuffle 151 151 0 1 2
-             153:  149(fvec3) GroupNonUniformShuffle 36 152 35
-             154:    119(ptr) AccessChain 24(data) 25 146 116
-             155:   17(fvec4) Load 154
-             156:   17(fvec4) VectorShuffle 155 153 4 5 6 3
-                              Store 154 156
-             157:     27(ptr) AccessChain 10(dti) 26
-             158:      6(int) Load 157
-             160:     27(ptr) AccessChain 10(dti) 26
-             161:      6(int) Load 160
-             163:    162(ptr) AccessChain 24(data) 25 161 159
-             164: 19(f64vec4) Load 163
-             165: 19(f64vec4) GroupNonUniformBroadcastFirst 36 164
-             166:    162(ptr) AccessChain 24(data) 25 158 159
-                              Store 166 165
-             167:     27(ptr) AccessChain 10(dti) 26
-             168:      6(int) Load 167
-             169:     27(ptr) AccessChain 10(dti) 26
-             170:      6(int) Load 169
-             172:    171(ptr) AccessChain 24(data) 25 170 159 26
-             173:18(float64_t) Load 172
-             174:18(float64_t) GroupNonUniformBroadcastFirst 36 173
-             175:    171(ptr) AccessChain 24(data) 25 168 159 26
-                              Store 175 174
-             176:     27(ptr) AccessChain 10(dti) 26
-             177:      6(int) Load 176
-             178:     27(ptr) AccessChain 10(dti) 26
-             179:      6(int) Load 178
-             181:    162(ptr) AccessChain 24(data) 25 179 159
-             182: 19(f64vec4) Load 181
-             183:180(f64vec2) VectorShuffle 182 182 0 1
-             184:180(f64vec2) GroupNonUniformBroadcastFirst 36 183
-             185:    162(ptr) AccessChain 24(data) 25 177 159
-             186: 19(f64vec4) Load 185
-             187: 19(f64vec4) VectorShuffle 186 184 4 5 2 3
-                              Store 185 187
-             188:     27(ptr) AccessChain 10(dti) 26
-             189:      6(int) Load 188
+             148:    129(ptr) AccessChain 24(data) 25 146 126
+             149:   17(fvec4) Load 148
+             150:  147(fvec2) VectorShuffle 149 149 0 1
+             151:  147(fvec2) GroupNonUniformShuffle 36 150 35
+             152:    138(ptr) AccessChain 24(data) 25 144 126 26
+             153:   16(float) CompositeExtract 151 0
+                              Store 152 153
+             154:    138(ptr) AccessChain 24(data) 25 144 126 59
+             155:   16(float) CompositeExtract 151 1
+                              Store 154 155
+             156:     27(ptr) AccessChain 10(dti) 26
+             157:      6(int) Load 156
+             158:     27(ptr) AccessChain 10(dti) 26
+             159:      6(int) Load 158
+             161:    129(ptr) AccessChain 24(data) 25 159 126
+             162:   17(fvec4) Load 161
+             163:  160(fvec3) VectorShuffle 162 162 0 1 2
+             164:  160(fvec3) GroupNonUniformShuffle 36 163 35
+             165:    138(ptr) AccessChain 24(data) 25 157 126 26
+             166:   16(float) CompositeExtract 164 0
+                              Store 165 166
+             167:    138(ptr) AccessChain 24(data) 25 157 126 59
+             168:   16(float) CompositeExtract 164 1
+                              Store 167 168
+             169:    138(ptr) AccessChain 24(data) 25 157 126 74
+             170:   16(float) CompositeExtract 164 2
+                              Store 169 170
+             171:     27(ptr) AccessChain 10(dti) 26
+             172:      6(int) Load 171
+             174:     27(ptr) AccessChain 10(dti) 26
+             175:      6(int) Load 174
+             177:    176(ptr) AccessChain 24(data) 25 175 173
+             178: 19(f64vec4) Load 177
+             179: 19(f64vec4) GroupNonUniformBroadcastFirst 36 178
+             180:    176(ptr) AccessChain 24(data) 25 172 173
+                              Store 180 179
+             181:     27(ptr) AccessChain 10(dti) 26
+             182:      6(int) Load 181
+             183:     27(ptr) AccessChain 10(dti) 26
+             184:      6(int) Load 183
+             186:    185(ptr) AccessChain 24(data) 25 184 173 26
+             187:18(float64_t) Load 186
+             188:18(float64_t) GroupNonUniformBroadcastFirst 36 187
+             189:    185(ptr) AccessChain 24(data) 25 182 173 26
+                              Store 189 188
              190:     27(ptr) AccessChain 10(dti) 26
              191:      6(int) Load 190
-             193:    162(ptr) AccessChain 24(data) 25 191 159
-             194: 19(f64vec4) Load 193
-             195:192(f64vec3) VectorShuffle 194 194 0 1 2
-             196:192(f64vec3) GroupNonUniformBroadcastFirst 36 195
-             197:    162(ptr) AccessChain 24(data) 25 189 159
-             198: 19(f64vec4) Load 197
-             199: 19(f64vec4) VectorShuffle 198 196 4 5 6 3
-                              Store 197 199
-             200:     27(ptr) AccessChain 10(dti) 26
-             201:      6(int) Load 200
-             202:     27(ptr) AccessChain 10(dti) 26
-             203:      6(int) Load 202
-             204:     32(ptr) AccessChain 24(data) 25 203 25
-             205:   13(ivec4) Load 204
-             206:   13(ivec4) GroupNonUniformBroadcastFirst 36 205
-             207:     32(ptr) AccessChain 24(data) 25 201 25
-                              Store 207 206
-             208:     27(ptr) AccessChain 10(dti) 26
-             209:      6(int) Load 208
-             210:     27(ptr) AccessChain 10(dti) 26
-             211:      6(int) Load 210
-             212:     43(ptr) AccessChain 24(data) 25 211 25 26
-             213:      6(int) Load 212
-             214:      6(int) GroupNonUniformBroadcastFirst 36 213
-             215:     43(ptr) AccessChain 24(data) 25 209 25 26
-                              Store 215 214
-             216:     27(ptr) AccessChain 10(dti) 26
-             217:      6(int) Load 216
+             192:     27(ptr) AccessChain 10(dti) 26
+             193:      6(int) Load 192
+             195:    176(ptr) AccessChain 24(data) 25 193 173
+             196: 19(f64vec4) Load 195
+             197:194(f64vec2) VectorShuffle 196 196 0 1
+             198:194(f64vec2) GroupNonUniformBroadcastFirst 36 197
+             199:    185(ptr) AccessChain 24(data) 25 191 173 26
+             200:18(float64_t) CompositeExtract 198 0
+                              Store 199 200
+             201:    185(ptr) AccessChain 24(data) 25 191 173 59
+             202:18(float64_t) CompositeExtract 198 1
+                              Store 201 202
+             203:     27(ptr) AccessChain 10(dti) 26
+             204:      6(int) Load 203
+             205:     27(ptr) AccessChain 10(dti) 26
+             206:      6(int) Load 205
+             208:    176(ptr) AccessChain 24(data) 25 206 173
+             209: 19(f64vec4) Load 208
+             210:207(f64vec3) VectorShuffle 209 209 0 1 2
+             211:207(f64vec3) GroupNonUniformBroadcastFirst 36 210
+             212:    185(ptr) AccessChain 24(data) 25 204 173 26
+             213:18(float64_t) CompositeExtract 211 0
+                              Store 212 213
+             214:    185(ptr) AccessChain 24(data) 25 204 173 59
+             215:18(float64_t) CompositeExtract 211 1
+                              Store 214 215
+             216:    185(ptr) AccessChain 24(data) 25 204 173 74
+             217:18(float64_t) CompositeExtract 211 2
+                              Store 216 217
              218:     27(ptr) AccessChain 10(dti) 26
              219:      6(int) Load 218
-             220:     32(ptr) AccessChain 24(data) 25 219 25
-             221:   13(ivec4) Load 220
-             222:   52(ivec2) VectorShuffle 221 221 0 1
-             223:   52(ivec2) GroupNonUniformBroadcastFirst 36 222
-             224:     32(ptr) AccessChain 24(data) 25 217 25
-             225:   13(ivec4) Load 224
-             226:   13(ivec4) VectorShuffle 225 223 4 5 2 3
-                              Store 224 226
-             227:     27(ptr) AccessChain 10(dti) 26
-             228:      6(int) Load 227
-             229:     27(ptr) AccessChain 10(dti) 26
-             230:      6(int) Load 229
-             231:     32(ptr) AccessChain 24(data) 25 230 25
-             232:   13(ivec4) Load 231
-             233:    7(ivec3) VectorShuffle 232 232 0 1 2
-             234:    7(ivec3) GroupNonUniformBroadcastFirst 36 233
-             235:     32(ptr) AccessChain 24(data) 25 228 25
-             236:   13(ivec4) Load 235
-             237:   13(ivec4) VectorShuffle 236 234 4 5 6 3
-                              Store 235 237
-             238:     27(ptr) AccessChain 10(dti) 26
-             239:      6(int) Load 238
-             240:     27(ptr) AccessChain 10(dti) 26
-             241:      6(int) Load 240
-             242:     76(ptr) AccessChain 24(data) 25 241 73
-             243:   15(ivec4) Load 242
-             244:   15(ivec4) GroupNonUniformBroadcastFirst 36 243
-             245:     76(ptr) AccessChain 24(data) 25 239 73
-                              Store 245 244
+             220:     27(ptr) AccessChain 10(dti) 26
+             221:      6(int) Load 220
+             222:     32(ptr) AccessChain 24(data) 25 221 25
+             223:   13(ivec4) Load 222
+             224:   13(ivec4) GroupNonUniformBroadcastFirst 36 223
+             225:     32(ptr) AccessChain 24(data) 25 219 25
+                              Store 225 224
+             226:     27(ptr) AccessChain 10(dti) 26
+             227:      6(int) Load 226
+             228:     27(ptr) AccessChain 10(dti) 26
+             229:      6(int) Load 228
+             230:     43(ptr) AccessChain 24(data) 25 229 25 26
+             231:      6(int) Load 230
+             232:      6(int) GroupNonUniformBroadcastFirst 36 231
+             233:     43(ptr) AccessChain 24(data) 25 227 25 26
+                              Store 233 232
+             234:     27(ptr) AccessChain 10(dti) 26
+             235:      6(int) Load 234
+             236:     27(ptr) AccessChain 10(dti) 26
+             237:      6(int) Load 236
+             238:     32(ptr) AccessChain 24(data) 25 237 25
+             239:   13(ivec4) Load 238
+             240:   52(ivec2) VectorShuffle 239 239 0 1
+             241:   52(ivec2) GroupNonUniformBroadcastFirst 36 240
+             242:     43(ptr) AccessChain 24(data) 25 235 25 26
+             243:      6(int) CompositeExtract 241 0
+                              Store 242 243
+             244:     43(ptr) AccessChain 24(data) 25 235 25 59
+             245:      6(int) CompositeExtract 241 1
+                              Store 244 245
              246:     27(ptr) AccessChain 10(dti) 26
              247:      6(int) Load 246
              248:     27(ptr) AccessChain 10(dti) 26
              249:      6(int) Load 248
-             250:     85(ptr) AccessChain 24(data) 25 249 73 26
-             251:     14(int) Load 250
-             252:     14(int) GroupNonUniformBroadcastFirst 36 251
-             253:     85(ptr) AccessChain 24(data) 25 247 73 26
-                              Store 253 252
-             254:     27(ptr) AccessChain 10(dti) 26
-             255:      6(int) Load 254
-             256:     27(ptr) AccessChain 10(dti) 26
-             257:      6(int) Load 256
-             258:     76(ptr) AccessChain 24(data) 25 257 73
-             259:   15(ivec4) Load 258
-             260:   94(ivec2) VectorShuffle 259 259 0 1
-             261:   94(ivec2) GroupNonUniformBroadcastFirst 36 260
-             262:     76(ptr) AccessChain 24(data) 25 255 73
-             263:   15(ivec4) Load 262
-             264:   15(ivec4) VectorShuffle 263 261 4 5 2 3
-                              Store 262 264
-             265:     27(ptr) AccessChain 10(dti) 26
-             266:      6(int) Load 265
-             267:     27(ptr) AccessChain 10(dti) 26
-             268:      6(int) Load 267
-             269:     76(ptr) AccessChain 24(data) 25 268 73
-             270:   15(ivec4) Load 269
-             271:  106(ivec3) VectorShuffle 270 270 0 1 2
-             272:  106(ivec3) GroupNonUniformBroadcastFirst 36 271
-             273:     76(ptr) AccessChain 24(data) 25 266 73
-             274:   15(ivec4) Load 273
-             275:   15(ivec4) VectorShuffle 274 272 4 5 6 3
-                              Store 273 275
+             250:     32(ptr) AccessChain 24(data) 25 249 25
+             251:   13(ivec4) Load 250
+             252:    7(ivec3) VectorShuffle 251 251 0 1 2
+             253:    7(ivec3) GroupNonUniformBroadcastFirst 36 252
+             254:     43(ptr) AccessChain 24(data) 25 247 25 26
+             255:      6(int) CompositeExtract 253 0
+                              Store 254 255
+             256:     43(ptr) AccessChain 24(data) 25 247 25 59
+             257:      6(int) CompositeExtract 253 1
+                              Store 256 257
+             258:     43(ptr) AccessChain 24(data) 25 247 25 74
+             259:      6(int) CompositeExtract 253 2
+                              Store 258 259
+             260:     27(ptr) AccessChain 10(dti) 26
+             261:      6(int) Load 260
+             262:     27(ptr) AccessChain 10(dti) 26
+             263:      6(int) Load 262
+             264:     82(ptr) AccessChain 24(data) 25 263 79
+             265:   15(ivec4) Load 264
+             266:   15(ivec4) GroupNonUniformBroadcastFirst 36 265
+             267:     82(ptr) AccessChain 24(data) 25 261 79
+                              Store 267 266
+             268:     27(ptr) AccessChain 10(dti) 26
+             269:      6(int) Load 268
+             270:     27(ptr) AccessChain 10(dti) 26
+             271:      6(int) Load 270
+             272:     91(ptr) AccessChain 24(data) 25 271 79 26
+             273:     14(int) Load 272
+             274:     14(int) GroupNonUniformBroadcastFirst 36 273
+             275:     91(ptr) AccessChain 24(data) 25 269 79 26
+                              Store 275 274
              276:     27(ptr) AccessChain 10(dti) 26
              277:      6(int) Load 276
              278:     27(ptr) AccessChain 10(dti) 26
              279:      6(int) Load 278
-             280:    119(ptr) AccessChain 24(data) 25 279 116
-             281:   17(fvec4) Load 280
-             282:   17(fvec4) GroupNonUniformBroadcastFirst 36 281
-             283:    119(ptr) AccessChain 24(data) 25 277 116
-                              Store 283 282
-             284:     27(ptr) AccessChain 10(dti) 26
-             285:      6(int) Load 284
-             286:     27(ptr) AccessChain 10(dti) 26
-             287:      6(int) Load 286
-             288:    128(ptr) AccessChain 24(data) 25 287 116 26
-             289:   16(float) Load 288
-             290:   16(float) GroupNonUniformBroadcastFirst 36 289
-             291:    128(ptr) AccessChain 24(data) 25 285 116 26
-                              Store 291 290
-             292:     27(ptr) AccessChain 10(dti) 26
-             293:      6(int) Load 292
-             294:     27(ptr) AccessChain 10(dti) 26
-             295:      6(int) Load 294
-             296:    119(ptr) AccessChain 24(data) 25 295 116
-             297:   17(fvec4) Load 296
-             298:  137(fvec2) VectorShuffle 297 297 0 1
-             299:  137(fvec2) GroupNonUniformBroadcastFirst 36 298
-             300:    119(ptr) AccessChain 24(data) 25 293 116
-             301:   17(fvec4) Load 300
-             302:   17(fvec4) VectorShuffle 301 299 4 5 2 3
-                              Store 300 302
-             303:     27(ptr) AccessChain 10(dti) 26
-             304:      6(int) Load 303
-             305:     27(ptr) AccessChain 10(dti) 26
-             306:      6(int) Load 305
-             307:    119(ptr) AccessChain 24(data) 25 306 116
-             308:   17(fvec4) Load 307
-             309:  149(fvec3) VectorShuffle 308 308 0 1 2
-             310:  149(fvec3) GroupNonUniformBroadcastFirst 36 309
-             311:    119(ptr) AccessChain 24(data) 25 304 116
-             312:   17(fvec4) Load 311
-             313:   17(fvec4) VectorShuffle 312 310 4 5 6 3
-                              Store 311 313
-             314:     27(ptr) AccessChain 10(dti) 26
-             315:      6(int) Load 314
-             316:     27(ptr) AccessChain 10(dti) 26
-             317:      6(int) Load 316
-             318:    162(ptr) AccessChain 24(data) 25 317 159
-             319: 19(f64vec4) Load 318
-             320: 19(f64vec4) GroupNonUniformBroadcastFirst 36 319
-             321:    162(ptr) AccessChain 24(data) 25 315 159
-                              Store 321 320
-             322:     27(ptr) AccessChain 10(dti) 26
-             323:      6(int) Load 322
-             324:     27(ptr) AccessChain 10(dti) 26
-             325:      6(int) Load 324
-             326:    171(ptr) AccessChain 24(data) 25 325 159 26
-             327:18(float64_t) Load 326
-             328:18(float64_t) GroupNonUniformBroadcastFirst 36 327
-             329:    171(ptr) AccessChain 24(data) 25 323 159 26
-                              Store 329 328
+             280:     82(ptr) AccessChain 24(data) 25 279 79
+             281:   15(ivec4) Load 280
+             282:  100(ivec2) VectorShuffle 281 281 0 1
+             283:  100(ivec2) GroupNonUniformBroadcastFirst 36 282
+             284:     91(ptr) AccessChain 24(data) 25 277 79 26
+             285:     14(int) CompositeExtract 283 0
+                              Store 284 285
+             286:     91(ptr) AccessChain 24(data) 25 277 79 59
+             287:     14(int) CompositeExtract 283 1
+                              Store 286 287
+             288:     27(ptr) AccessChain 10(dti) 26
+             289:      6(int) Load 288
+             290:     27(ptr) AccessChain 10(dti) 26
+             291:      6(int) Load 290
+             292:     82(ptr) AccessChain 24(data) 25 291 79
+             293:   15(ivec4) Load 292
+             294:  113(ivec3) VectorShuffle 293 293 0 1 2
+             295:  113(ivec3) GroupNonUniformBroadcastFirst 36 294
+             296:     91(ptr) AccessChain 24(data) 25 289 79 26
+             297:     14(int) CompositeExtract 295 0
+                              Store 296 297
+             298:     91(ptr) AccessChain 24(data) 25 289 79 59
+             299:     14(int) CompositeExtract 295 1
+                              Store 298 299
+             300:     91(ptr) AccessChain 24(data) 25 289 79 74
+             301:     14(int) CompositeExtract 295 2
+                              Store 300 301
+             302:     27(ptr) AccessChain 10(dti) 26
+             303:      6(int) Load 302
+             304:     27(ptr) AccessChain 10(dti) 26
+             305:      6(int) Load 304
+             306:    129(ptr) AccessChain 24(data) 25 305 126
+             307:   17(fvec4) Load 306
+             308:   17(fvec4) GroupNonUniformBroadcastFirst 36 307
+             309:    129(ptr) AccessChain 24(data) 25 303 126
+                              Store 309 308
+             310:     27(ptr) AccessChain 10(dti) 26
+             311:      6(int) Load 310
+             312:     27(ptr) AccessChain 10(dti) 26
+             313:      6(int) Load 312
+             314:    138(ptr) AccessChain 24(data) 25 313 126 26
+             315:   16(float) Load 314
+             316:   16(float) GroupNonUniformBroadcastFirst 36 315
+             317:    138(ptr) AccessChain 24(data) 25 311 126 26
+                              Store 317 316
+             318:     27(ptr) AccessChain 10(dti) 26
+             319:      6(int) Load 318
+             320:     27(ptr) AccessChain 10(dti) 26
+             321:      6(int) Load 320
+             322:    129(ptr) AccessChain 24(data) 25 321 126
+             323:   17(fvec4) Load 322
+             324:  147(fvec2) VectorShuffle 323 323 0 1
+             325:  147(fvec2) GroupNonUniformBroadcastFirst 36 324
+             326:    138(ptr) AccessChain 24(data) 25 319 126 26
+             327:   16(float) CompositeExtract 325 0
+                              Store 326 327
+             328:    138(ptr) AccessChain 24(data) 25 319 126 59
+             329:   16(float) CompositeExtract 325 1
+                              Store 328 329
              330:     27(ptr) AccessChain 10(dti) 26
              331:      6(int) Load 330
              332:     27(ptr) AccessChain 10(dti) 26
              333:      6(int) Load 332
-             334:    162(ptr) AccessChain 24(data) 25 333 159
-             335: 19(f64vec4) Load 334
-             336:180(f64vec2) VectorShuffle 335 335 0 1
-             337:180(f64vec2) GroupNonUniformBroadcastFirst 36 336
-             338:    162(ptr) AccessChain 24(data) 25 331 159
-             339: 19(f64vec4) Load 338
-             340: 19(f64vec4) VectorShuffle 339 337 4 5 2 3
-                              Store 338 340
-             341:     27(ptr) AccessChain 10(dti) 26
-             342:      6(int) Load 341
-             343:     27(ptr) AccessChain 10(dti) 26
-             344:      6(int) Load 343
-             345:    162(ptr) AccessChain 24(data) 25 344 159
-             346: 19(f64vec4) Load 345
-             347:192(f64vec3) VectorShuffle 346 346 0 1 2
-             348:192(f64vec3) GroupNonUniformBroadcastFirst 36 347
-             349:    162(ptr) AccessChain 24(data) 25 342 159
-             350: 19(f64vec4) Load 349
-             351: 19(f64vec4) VectorShuffle 350 348 4 5 6 3
-                              Store 349 351
+             334:    129(ptr) AccessChain 24(data) 25 333 126
+             335:   17(fvec4) Load 334
+             336:  160(fvec3) VectorShuffle 335 335 0 1 2
+             337:  160(fvec3) GroupNonUniformBroadcastFirst 36 336
+             338:    138(ptr) AccessChain 24(data) 25 331 126 26
+             339:   16(float) CompositeExtract 337 0
+                              Store 338 339
+             340:    138(ptr) AccessChain 24(data) 25 331 126 59
+             341:   16(float) CompositeExtract 337 1
+                              Store 340 341
+             342:    138(ptr) AccessChain 24(data) 25 331 126 74
+             343:   16(float) CompositeExtract 337 2
+                              Store 342 343
+             344:     27(ptr) AccessChain 10(dti) 26
+             345:      6(int) Load 344
+             346:     27(ptr) AccessChain 10(dti) 26
+             347:      6(int) Load 346
+             348:    176(ptr) AccessChain 24(data) 25 347 173
+             349: 19(f64vec4) Load 348
+             350: 19(f64vec4) GroupNonUniformBroadcastFirst 36 349
+             351:    176(ptr) AccessChain 24(data) 25 345 173
+                              Store 351 350
+             352:     27(ptr) AccessChain 10(dti) 26
+             353:      6(int) Load 352
+             354:     27(ptr) AccessChain 10(dti) 26
+             355:      6(int) Load 354
+             356:    185(ptr) AccessChain 24(data) 25 355 173 26
+             357:18(float64_t) Load 356
+             358:18(float64_t) GroupNonUniformBroadcastFirst 36 357
+             359:    185(ptr) AccessChain 24(data) 25 353 173 26
+                              Store 359 358
+             360:     27(ptr) AccessChain 10(dti) 26
+             361:      6(int) Load 360
+             362:     27(ptr) AccessChain 10(dti) 26
+             363:      6(int) Load 362
+             364:    176(ptr) AccessChain 24(data) 25 363 173
+             365: 19(f64vec4) Load 364
+             366:194(f64vec2) VectorShuffle 365 365 0 1
+             367:194(f64vec2) GroupNonUniformBroadcastFirst 36 366
+             368:    185(ptr) AccessChain 24(data) 25 361 173 26
+             369:18(float64_t) CompositeExtract 367 0
+                              Store 368 369
+             370:    185(ptr) AccessChain 24(data) 25 361 173 59
+             371:18(float64_t) CompositeExtract 367 1
+                              Store 370 371
+             372:     27(ptr) AccessChain 10(dti) 26
+             373:      6(int) Load 372
+             374:     27(ptr) AccessChain 10(dti) 26
+             375:      6(int) Load 374
+             376:    176(ptr) AccessChain 24(data) 25 375 173
+             377: 19(f64vec4) Load 376
+             378:207(f64vec3) VectorShuffle 377 377 0 1 2
+             379:207(f64vec3) GroupNonUniformBroadcastFirst 36 378
+             380:    185(ptr) AccessChain 24(data) 25 373 173 26
+             381:18(float64_t) CompositeExtract 379 0
+                              Store 380 381
+             382:    185(ptr) AccessChain 24(data) 25 373 173 59
+             383:18(float64_t) CompositeExtract 379 1
+                              Store 382 383
+             384:    185(ptr) AccessChain 24(data) 25 373 173 74
+             385:18(float64_t) CompositeExtract 379 2
+                              Store 384 385
                               Return
                               FunctionEnd
diff --git a/third_party/vulkan-deps/glslang/src/Test/baseResults/hlsl.waveprefix.comp.out b/third_party/vulkan-deps/glslang/src/Test/baseResults/hlsl.waveprefix.comp.out
index 1d79f17..cc4737e 100644
--- a/third_party/vulkan-deps/glslang/src/Test/baseResults/hlsl.waveprefix.comp.out
+++ b/third_party/vulkan-deps/glslang/src/Test/baseResults/hlsl.waveprefix.comp.out
@@ -2323,7 +2323,7 @@
 
 // Module Version 10300
 // Generated by (magic number): 8000a
-// Id's are bound by 369
+// Id's are bound by 403
 
                               Capability Shader
                               Capability Float64
@@ -2332,7 +2332,7 @@
                               Capability GroupNonUniformBallot
                1:             ExtInstImport  "GLSL.std.450"
                               MemoryModel Logical GLSL450
-                              EntryPoint GLCompute 4  "CSMain" 364
+                              EntryPoint GLCompute 4  "CSMain" 398
                               ExecutionMode 4 LocalSize 32 16 1
                               Source HLSL 500
                               Name 4  "CSMain"
@@ -2346,9 +2346,9 @@
                               Name 22  "data"
                               MemberName 22(data) 0  "@data"
                               Name 24  "data"
-                              Name 362  "dti"
-                              Name 364  "dti"
-                              Name 366  "param"
+                              Name 396  "dti"
+                              Name 398  "dti"
+                              Name 400  "param"
                               MemberDecorate 20(Types) 0 Offset 0
                               MemberDecorate 20(Types) 1 Offset 16
                               MemberDecorate 20(Types) 2 Offset 32
@@ -2358,7 +2358,7 @@
                               Decorate 22(data) BufferBlock
                               Decorate 24(data) DescriptorSet 0
                               Decorate 24(data) Binding 0
-                              Decorate 364(dti) BuiltIn GlobalInvocationId
+                              Decorate 398(dti) BuiltIn GlobalInvocationId
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeInt 32 0
@@ -2384,33 +2384,35 @@
               35:      6(int) Constant 3
               42:             TypePointer Uniform 6(int)
               51:             TypeVector 6(int) 2
-              72:     14(int) Constant 1
-              75:             TypePointer Uniform 15(ivec4)
-              84:             TypePointer Uniform 14(int)
-              93:             TypeVector 14(int) 2
-             105:             TypeVector 14(int) 3
-             115:     14(int) Constant 2
-             118:             TypePointer Uniform 17(fvec4)
-             127:             TypePointer Uniform 16(float)
-             136:             TypeVector 16(float) 2
-             148:             TypeVector 16(float) 3
-             158:     14(int) Constant 3
-             161:             TypePointer Uniform 19(f64vec4)
-             170:             TypePointer Uniform 18(float64_t)
-             179:             TypeVector 18(float64_t) 2
-             191:             TypeVector 18(float64_t) 3
-             357:             TypeBool
-             363:             TypePointer Input 7(ivec3)
-        364(dti):    363(ptr) Variable Input
+              58:      6(int) Constant 1
+              73:      6(int) Constant 2
+              78:     14(int) Constant 1
+              81:             TypePointer Uniform 15(ivec4)
+              90:             TypePointer Uniform 14(int)
+              99:             TypeVector 14(int) 2
+             112:             TypeVector 14(int) 3
+             125:     14(int) Constant 2
+             128:             TypePointer Uniform 17(fvec4)
+             137:             TypePointer Uniform 16(float)
+             146:             TypeVector 16(float) 2
+             159:             TypeVector 16(float) 3
+             172:     14(int) Constant 3
+             175:             TypePointer Uniform 19(f64vec4)
+             184:             TypePointer Uniform 18(float64_t)
+             193:             TypeVector 18(float64_t) 2
+             206:             TypeVector 18(float64_t) 3
+             391:             TypeBool
+             397:             TypePointer Input 7(ivec3)
+        398(dti):    397(ptr) Variable Input
        4(CSMain):           2 Function None 3
                5:             Label
-        362(dti):      8(ptr) Variable Function
-      366(param):      8(ptr) Variable Function
-             365:    7(ivec3) Load 364(dti)
-                              Store 362(dti) 365
-             367:    7(ivec3) Load 362(dti)
-                              Store 366(param) 367
-             368:           2 FunctionCall 11(@CSMain(vu3;) 366(param)
+        396(dti):      8(ptr) Variable Function
+      400(param):      8(ptr) Variable Function
+             399:    7(ivec3) Load 398(dti)
+                              Store 396(dti) 399
+             401:    7(ivec3) Load 396(dti)
+                              Store 400(param) 401
+             402:           2 FunctionCall 11(@CSMain(vu3;) 400(param)
                               Return
                               FunctionEnd
 11(@CSMain(vu3;):           2 Function None 9
@@ -2442,326 +2444,382 @@
               53:   13(ivec4) Load 52
               54:   51(ivec2) VectorShuffle 53 53 0 1
               55:   51(ivec2) GroupNonUniformIAdd 35 InclusiveScan 54
-              56:     32(ptr) AccessChain 24(data) 25 48 25
-              57:   13(ivec4) Load 56
-              58:   13(ivec4) VectorShuffle 57 55 4 5 2 3
-                              Store 56 58
-              59:     27(ptr) AccessChain 10(dti) 26
-              60:      6(int) Load 59
+              56:     42(ptr) AccessChain 24(data) 25 48 25 26
+              57:      6(int) CompositeExtract 55 0
+                              Store 56 57
+              59:     42(ptr) AccessChain 24(data) 25 48 25 58
+              60:      6(int) CompositeExtract 55 1
+                              Store 59 60
               61:     27(ptr) AccessChain 10(dti) 26
               62:      6(int) Load 61
-              63:     32(ptr) AccessChain 24(data) 25 62 25
-              64:   13(ivec4) Load 63
-              65:    7(ivec3) VectorShuffle 64 64 0 1 2
-              66:    7(ivec3) GroupNonUniformIAdd 35 InclusiveScan 65
-              67:     32(ptr) AccessChain 24(data) 25 60 25
-              68:   13(ivec4) Load 67
-              69:   13(ivec4) VectorShuffle 68 66 4 5 6 3
-                              Store 67 69
-              70:     27(ptr) AccessChain 10(dti) 26
-              71:      6(int) Load 70
-              73:     27(ptr) AccessChain 10(dti) 26
-              74:      6(int) Load 73
-              76:     75(ptr) AccessChain 24(data) 25 74 72
-              77:   15(ivec4) Load 76
-              78:   15(ivec4) GroupNonUniformIAdd 35 InclusiveScan 77
-              79:     75(ptr) AccessChain 24(data) 25 71 72
-                              Store 79 78
-              80:     27(ptr) AccessChain 10(dti) 26
-              81:      6(int) Load 80
-              82:     27(ptr) AccessChain 10(dti) 26
-              83:      6(int) Load 82
-              85:     84(ptr) AccessChain 24(data) 25 83 72 26
-              86:     14(int) Load 85
-              87:     14(int) GroupNonUniformIAdd 35 InclusiveScan 86
-              88:     84(ptr) AccessChain 24(data) 25 81 72 26
-                              Store 88 87
-              89:     27(ptr) AccessChain 10(dti) 26
-              90:      6(int) Load 89
-              91:     27(ptr) AccessChain 10(dti) 26
-              92:      6(int) Load 91
-              94:     75(ptr) AccessChain 24(data) 25 92 72
-              95:   15(ivec4) Load 94
-              96:   93(ivec2) VectorShuffle 95 95 0 1
-              97:   93(ivec2) GroupNonUniformIAdd 35 InclusiveScan 96
-              98:     75(ptr) AccessChain 24(data) 25 90 72
-              99:   15(ivec4) Load 98
-             100:   15(ivec4) VectorShuffle 99 97 4 5 2 3
-                              Store 98 100
-             101:     27(ptr) AccessChain 10(dti) 26
-             102:      6(int) Load 101
-             103:     27(ptr) AccessChain 10(dti) 26
-             104:      6(int) Load 103
-             106:     75(ptr) AccessChain 24(data) 25 104 72
-             107:   15(ivec4) Load 106
-             108:  105(ivec3) VectorShuffle 107 107 0 1 2
-             109:  105(ivec3) GroupNonUniformIAdd 35 InclusiveScan 108
-             110:     75(ptr) AccessChain 24(data) 25 102 72
-             111:   15(ivec4) Load 110
-             112:   15(ivec4) VectorShuffle 111 109 4 5 6 3
-                              Store 110 112
-             113:     27(ptr) AccessChain 10(dti) 26
-             114:      6(int) Load 113
-             116:     27(ptr) AccessChain 10(dti) 26
-             117:      6(int) Load 116
-             119:    118(ptr) AccessChain 24(data) 25 117 115
-             120:   17(fvec4) Load 119
-             121:   17(fvec4) GroupNonUniformFAdd 35 InclusiveScan 120
-             122:    118(ptr) AccessChain 24(data) 25 114 115
-                              Store 122 121
+              63:     27(ptr) AccessChain 10(dti) 26
+              64:      6(int) Load 63
+              65:     32(ptr) AccessChain 24(data) 25 64 25
+              66:   13(ivec4) Load 65
+              67:    7(ivec3) VectorShuffle 66 66 0 1 2
+              68:    7(ivec3) GroupNonUniformIAdd 35 InclusiveScan 67
+              69:     42(ptr) AccessChain 24(data) 25 62 25 26
+              70:      6(int) CompositeExtract 68 0
+                              Store 69 70
+              71:     42(ptr) AccessChain 24(data) 25 62 25 58
+              72:      6(int) CompositeExtract 68 1
+                              Store 71 72
+              74:     42(ptr) AccessChain 24(data) 25 62 25 73
+              75:      6(int) CompositeExtract 68 2
+                              Store 74 75
+              76:     27(ptr) AccessChain 10(dti) 26
+              77:      6(int) Load 76
+              79:     27(ptr) AccessChain 10(dti) 26
+              80:      6(int) Load 79
+              82:     81(ptr) AccessChain 24(data) 25 80 78
+              83:   15(ivec4) Load 82
+              84:   15(ivec4) GroupNonUniformIAdd 35 InclusiveScan 83
+              85:     81(ptr) AccessChain 24(data) 25 77 78
+                              Store 85 84
+              86:     27(ptr) AccessChain 10(dti) 26
+              87:      6(int) Load 86
+              88:     27(ptr) AccessChain 10(dti) 26
+              89:      6(int) Load 88
+              91:     90(ptr) AccessChain 24(data) 25 89 78 26
+              92:     14(int) Load 91
+              93:     14(int) GroupNonUniformIAdd 35 InclusiveScan 92
+              94:     90(ptr) AccessChain 24(data) 25 87 78 26
+                              Store 94 93
+              95:     27(ptr) AccessChain 10(dti) 26
+              96:      6(int) Load 95
+              97:     27(ptr) AccessChain 10(dti) 26
+              98:      6(int) Load 97
+             100:     81(ptr) AccessChain 24(data) 25 98 78
+             101:   15(ivec4) Load 100
+             102:   99(ivec2) VectorShuffle 101 101 0 1
+             103:   99(ivec2) GroupNonUniformIAdd 35 InclusiveScan 102
+             104:     90(ptr) AccessChain 24(data) 25 96 78 26
+             105:     14(int) CompositeExtract 103 0
+                              Store 104 105
+             106:     90(ptr) AccessChain 24(data) 25 96 78 58
+             107:     14(int) CompositeExtract 103 1
+                              Store 106 107
+             108:     27(ptr) AccessChain 10(dti) 26
+             109:      6(int) Load 108
+             110:     27(ptr) AccessChain 10(dti) 26
+             111:      6(int) Load 110
+             113:     81(ptr) AccessChain 24(data) 25 111 78
+             114:   15(ivec4) Load 113
+             115:  112(ivec3) VectorShuffle 114 114 0 1 2
+             116:  112(ivec3) GroupNonUniformIAdd 35 InclusiveScan 115
+             117:     90(ptr) AccessChain 24(data) 25 109 78 26
+             118:     14(int) CompositeExtract 116 0
+                              Store 117 118
+             119:     90(ptr) AccessChain 24(data) 25 109 78 58
+             120:     14(int) CompositeExtract 116 1
+                              Store 119 120
+             121:     90(ptr) AccessChain 24(data) 25 109 78 73
+             122:     14(int) CompositeExtract 116 2
+                              Store 121 122
              123:     27(ptr) AccessChain 10(dti) 26
              124:      6(int) Load 123
-             125:     27(ptr) AccessChain 10(dti) 26
-             126:      6(int) Load 125
-             128:    127(ptr) AccessChain 24(data) 25 126 115 26
-             129:   16(float) Load 128
-             130:   16(float) GroupNonUniformFAdd 35 InclusiveScan 129
-             131:    127(ptr) AccessChain 24(data) 25 124 115 26
-                              Store 131 130
-             132:     27(ptr) AccessChain 10(dti) 26
-             133:      6(int) Load 132
-             134:     27(ptr) AccessChain 10(dti) 26
-             135:      6(int) Load 134
-             137:    118(ptr) AccessChain 24(data) 25 135 115
-             138:   17(fvec4) Load 137
-             139:  136(fvec2) VectorShuffle 138 138 0 1
-             140:  136(fvec2) GroupNonUniformFAdd 35 InclusiveScan 139
-             141:    118(ptr) AccessChain 24(data) 25 133 115
-             142:   17(fvec4) Load 141
-             143:   17(fvec4) VectorShuffle 142 140 4 5 2 3
-                              Store 141 143
+             126:     27(ptr) AccessChain 10(dti) 26
+             127:      6(int) Load 126
+             129:    128(ptr) AccessChain 24(data) 25 127 125
+             130:   17(fvec4) Load 129
+             131:   17(fvec4) GroupNonUniformFAdd 35 InclusiveScan 130
+             132:    128(ptr) AccessChain 24(data) 25 124 125
+                              Store 132 131
+             133:     27(ptr) AccessChain 10(dti) 26
+             134:      6(int) Load 133
+             135:     27(ptr) AccessChain 10(dti) 26
+             136:      6(int) Load 135
+             138:    137(ptr) AccessChain 24(data) 25 136 125 26
+             139:   16(float) Load 138
+             140:   16(float) GroupNonUniformFAdd 35 InclusiveScan 139
+             141:    137(ptr) AccessChain 24(data) 25 134 125 26
+                              Store 141 140
+             142:     27(ptr) AccessChain 10(dti) 26
+             143:      6(int) Load 142
              144:     27(ptr) AccessChain 10(dti) 26
              145:      6(int) Load 144
-             146:     27(ptr) AccessChain 10(dti) 26
-             147:      6(int) Load 146
-             149:    118(ptr) AccessChain 24(data) 25 147 115
-             150:   17(fvec4) Load 149
-             151:  148(fvec3) VectorShuffle 150 150 0 1 2
-             152:  148(fvec3) GroupNonUniformFAdd 35 InclusiveScan 151
-             153:    118(ptr) AccessChain 24(data) 25 145 115
-             154:   17(fvec4) Load 153
-             155:   17(fvec4) VectorShuffle 154 152 4 5 6 3
-                              Store 153 155
-             156:     27(ptr) AccessChain 10(dti) 26
-             157:      6(int) Load 156
-             159:     27(ptr) AccessChain 10(dti) 26
-             160:      6(int) Load 159
-             162:    161(ptr) AccessChain 24(data) 25 160 158
-             163: 19(f64vec4) Load 162
-             164: 19(f64vec4) GroupNonUniformFAdd 35 InclusiveScan 163
-             165:    161(ptr) AccessChain 24(data) 25 157 158
-                              Store 165 164
-             166:     27(ptr) AccessChain 10(dti) 26
-             167:      6(int) Load 166
-             168:     27(ptr) AccessChain 10(dti) 26
-             169:      6(int) Load 168
-             171:    170(ptr) AccessChain 24(data) 25 169 158 26
-             172:18(float64_t) Load 171
-             173:18(float64_t) GroupNonUniformFAdd 35 InclusiveScan 172
-             174:    170(ptr) AccessChain 24(data) 25 167 158 26
-                              Store 174 173
-             175:     27(ptr) AccessChain 10(dti) 26
-             176:      6(int) Load 175
-             177:     27(ptr) AccessChain 10(dti) 26
-             178:      6(int) Load 177
-             180:    161(ptr) AccessChain 24(data) 25 178 158
-             181: 19(f64vec4) Load 180
-             182:179(f64vec2) VectorShuffle 181 181 0 1
-             183:179(f64vec2) GroupNonUniformFAdd 35 InclusiveScan 182
-             184:    161(ptr) AccessChain 24(data) 25 176 158
-             185: 19(f64vec4) Load 184
-             186: 19(f64vec4) VectorShuffle 185 183 4 5 2 3
-                              Store 184 186
-             187:     27(ptr) AccessChain 10(dti) 26
-             188:      6(int) Load 187
+             147:    128(ptr) AccessChain 24(data) 25 145 125
+             148:   17(fvec4) Load 147
+             149:  146(fvec2) VectorShuffle 148 148 0 1
+             150:  146(fvec2) GroupNonUniformFAdd 35 InclusiveScan 149
+             151:    137(ptr) AccessChain 24(data) 25 143 125 26
+             152:   16(float) CompositeExtract 150 0
+                              Store 151 152
+             153:    137(ptr) AccessChain 24(data) 25 143 125 58
+             154:   16(float) CompositeExtract 150 1
+                              Store 153 154
+             155:     27(ptr) AccessChain 10(dti) 26
+             156:      6(int) Load 155
+             157:     27(ptr) AccessChain 10(dti) 26
+             158:      6(int) Load 157
+             160:    128(ptr) AccessChain 24(data) 25 158 125
+             161:   17(fvec4) Load 160
+             162:  159(fvec3) VectorShuffle 161 161 0 1 2
+             163:  159(fvec3) GroupNonUniformFAdd 35 InclusiveScan 162
+             164:    137(ptr) AccessChain 24(data) 25 156 125 26
+             165:   16(float) CompositeExtract 163 0
+                              Store 164 165
+             166:    137(ptr) AccessChain 24(data) 25 156 125 58
+             167:   16(float) CompositeExtract 163 1
+                              Store 166 167
+             168:    137(ptr) AccessChain 24(data) 25 156 125 73
+             169:   16(float) CompositeExtract 163 2
+                              Store 168 169
+             170:     27(ptr) AccessChain 10(dti) 26
+             171:      6(int) Load 170
+             173:     27(ptr) AccessChain 10(dti) 26
+             174:      6(int) Load 173
+             176:    175(ptr) AccessChain 24(data) 25 174 172
+             177: 19(f64vec4) Load 176
+             178: 19(f64vec4) GroupNonUniformFAdd 35 InclusiveScan 177
+             179:    175(ptr) AccessChain 24(data) 25 171 172
+                              Store 179 178
+             180:     27(ptr) AccessChain 10(dti) 26
+             181:      6(int) Load 180
+             182:     27(ptr) AccessChain 10(dti) 26
+             183:      6(int) Load 182
+             185:    184(ptr) AccessChain 24(data) 25 183 172 26
+             186:18(float64_t) Load 185
+             187:18(float64_t) GroupNonUniformFAdd 35 InclusiveScan 186
+             188:    184(ptr) AccessChain 24(data) 25 181 172 26
+                              Store 188 187
              189:     27(ptr) AccessChain 10(dti) 26
              190:      6(int) Load 189
-             192:    161(ptr) AccessChain 24(data) 25 190 158
-             193: 19(f64vec4) Load 192
-             194:191(f64vec3) VectorShuffle 193 193 0 1 2
-             195:191(f64vec3) GroupNonUniformFAdd 35 InclusiveScan 194
-             196:    161(ptr) AccessChain 24(data) 25 188 158
-             197: 19(f64vec4) Load 196
-             198: 19(f64vec4) VectorShuffle 197 195 4 5 6 3
-                              Store 196 198
-             199:     27(ptr) AccessChain 10(dti) 26
-             200:      6(int) Load 199
-             201:     27(ptr) AccessChain 10(dti) 26
-             202:      6(int) Load 201
-             203:     32(ptr) AccessChain 24(data) 25 202 25
-             204:   13(ivec4) Load 203
-             205:   13(ivec4) GroupNonUniformIMul 35 InclusiveScan 204
-             206:     32(ptr) AccessChain 24(data) 25 200 25
-                              Store 206 205
-             207:     27(ptr) AccessChain 10(dti) 26
-             208:      6(int) Load 207
-             209:     27(ptr) AccessChain 10(dti) 26
-             210:      6(int) Load 209
-             211:     42(ptr) AccessChain 24(data) 25 210 25 26
-             212:      6(int) Load 211
-             213:      6(int) GroupNonUniformIMul 35 InclusiveScan 212
-             214:     42(ptr) AccessChain 24(data) 25 208 25 26
-                              Store 214 213
-             215:     27(ptr) AccessChain 10(dti) 26
-             216:      6(int) Load 215
+             191:     27(ptr) AccessChain 10(dti) 26
+             192:      6(int) Load 191
+             194:    175(ptr) AccessChain 24(data) 25 192 172
+             195: 19(f64vec4) Load 194
+             196:193(f64vec2) VectorShuffle 195 195 0 1
+             197:193(f64vec2) GroupNonUniformFAdd 35 InclusiveScan 196
+             198:    184(ptr) AccessChain 24(data) 25 190 172 26
+             199:18(float64_t) CompositeExtract 197 0
+                              Store 198 199
+             200:    184(ptr) AccessChain 24(data) 25 190 172 58
+             201:18(float64_t) CompositeExtract 197 1
+                              Store 200 201
+             202:     27(ptr) AccessChain 10(dti) 26
+             203:      6(int) Load 202
+             204:     27(ptr) AccessChain 10(dti) 26
+             205:      6(int) Load 204
+             207:    175(ptr) AccessChain 24(data) 25 205 172
+             208: 19(f64vec4) Load 207
+             209:206(f64vec3) VectorShuffle 208 208 0 1 2
+             210:206(f64vec3) GroupNonUniformFAdd 35 InclusiveScan 209
+             211:    184(ptr) AccessChain 24(data) 25 203 172 26
+             212:18(float64_t) CompositeExtract 210 0
+                              Store 211 212
+             213:    184(ptr) AccessChain 24(data) 25 203 172 58
+             214:18(float64_t) CompositeExtract 210 1
+                              Store 213 214
+             215:    184(ptr) AccessChain 24(data) 25 203 172 73
+             216:18(float64_t) CompositeExtract 210 2
+                              Store 215 216
              217:     27(ptr) AccessChain 10(dti) 26
              218:      6(int) Load 217
-             219:     32(ptr) AccessChain 24(data) 25 218 25
-             220:   13(ivec4) Load 219
-             221:   51(ivec2) VectorShuffle 220 220 0 1
-             222:   51(ivec2) GroupNonUniformIMul 35 InclusiveScan 221
-             223:     32(ptr) AccessChain 24(data) 25 216 25
-             224:   13(ivec4) Load 223
-             225:   13(ivec4) VectorShuffle 224 222 4 5 2 3
-                              Store 223 225
-             226:     27(ptr) AccessChain 10(dti) 26
-             227:      6(int) Load 226
-             228:     27(ptr) AccessChain 10(dti) 26
-             229:      6(int) Load 228
-             230:     32(ptr) AccessChain 24(data) 25 229 25
-             231:   13(ivec4) Load 230
-             232:    7(ivec3) VectorShuffle 231 231 0 1 2
-             233:    7(ivec3) GroupNonUniformIMul 35 InclusiveScan 232
-             234:     32(ptr) AccessChain 24(data) 25 227 25
-             235:   13(ivec4) Load 234
-             236:   13(ivec4) VectorShuffle 235 233 4 5 6 3
-                              Store 234 236
-             237:     27(ptr) AccessChain 10(dti) 26
-             238:      6(int) Load 237
-             239:     27(ptr) AccessChain 10(dti) 26
-             240:      6(int) Load 239
-             241:     75(ptr) AccessChain 24(data) 25 240 72
-             242:   15(ivec4) Load 241
-             243:   15(ivec4) GroupNonUniformIMul 35 InclusiveScan 242
-             244:     75(ptr) AccessChain 24(data) 25 238 72
-                              Store 244 243
+             219:     27(ptr) AccessChain 10(dti) 26
+             220:      6(int) Load 219
+             221:     32(ptr) AccessChain 24(data) 25 220 25
+             222:   13(ivec4) Load 221
+             223:   13(ivec4) GroupNonUniformIMul 35 InclusiveScan 222
+             224:     32(ptr) AccessChain 24(data) 25 218 25
+                              Store 224 223
+             225:     27(ptr) AccessChain 10(dti) 26
+             226:      6(int) Load 225
+             227:     27(ptr) AccessChain 10(dti) 26
+             228:      6(int) Load 227
+             229:     42(ptr) AccessChain 24(data) 25 228 25 26
+             230:      6(int) Load 229
+             231:      6(int) GroupNonUniformIMul 35 InclusiveScan 230
+             232:     42(ptr) AccessChain 24(data) 25 226 25 26
+                              Store 232 231
+             233:     27(ptr) AccessChain 10(dti) 26
+             234:      6(int) Load 233
+             235:     27(ptr) AccessChain 10(dti) 26
+             236:      6(int) Load 235
+             237:     32(ptr) AccessChain 24(data) 25 236 25
+             238:   13(ivec4) Load 237
+             239:   51(ivec2) VectorShuffle 238 238 0 1
+             240:   51(ivec2) GroupNonUniformIMul 35 InclusiveScan 239
+             241:     42(ptr) AccessChain 24(data) 25 234 25 26
+             242:      6(int) CompositeExtract 240 0
+                              Store 241 242
+             243:     42(ptr) AccessChain 24(data) 25 234 25 58
+             244:      6(int) CompositeExtract 240 1
+                              Store 243 244
              245:     27(ptr) AccessChain 10(dti) 26
              246:      6(int) Load 245
              247:     27(ptr) AccessChain 10(dti) 26
              248:      6(int) Load 247
-             249:     84(ptr) AccessChain 24(data) 25 248 72 26
-             250:     14(int) Load 249
-             251:     14(int) GroupNonUniformIMul 35 InclusiveScan 250
-             252:     84(ptr) AccessChain 24(data) 25 246 72 26
-                              Store 252 251
-             253:     27(ptr) AccessChain 10(dti) 26
-             254:      6(int) Load 253
-             255:     27(ptr) AccessChain 10(dti) 26
-             256:      6(int) Load 255
-             257:     75(ptr) AccessChain 24(data) 25 256 72
-             258:   15(ivec4) Load 257
-             259:   93(ivec2) VectorShuffle 258 258 0 1
-             260:   93(ivec2) GroupNonUniformIMul 35 InclusiveScan 259
-             261:     75(ptr) AccessChain 24(data) 25 254 72
-             262:   15(ivec4) Load 261
-             263:   15(ivec4) VectorShuffle 262 260 4 5 2 3
-                              Store 261 263
-             264:     27(ptr) AccessChain 10(dti) 26
-             265:      6(int) Load 264
-             266:     27(ptr) AccessChain 10(dti) 26
-             267:      6(int) Load 266
-             268:     75(ptr) AccessChain 24(data) 25 267 72
-             269:   15(ivec4) Load 268
-             270:  105(ivec3) VectorShuffle 269 269 0 1 2
-             271:  105(ivec3) GroupNonUniformIMul 35 InclusiveScan 270
-             272:     75(ptr) AccessChain 24(data) 25 265 72
-             273:   15(ivec4) Load 272
-             274:   15(ivec4) VectorShuffle 273 271 4 5 6 3
-                              Store 272 274
+             249:     32(ptr) AccessChain 24(data) 25 248 25
+             250:   13(ivec4) Load 249
+             251:    7(ivec3) VectorShuffle 250 250 0 1 2
+             252:    7(ivec3) GroupNonUniformIMul 35 InclusiveScan 251
+             253:     42(ptr) AccessChain 24(data) 25 246 25 26
+             254:      6(int) CompositeExtract 252 0
+                              Store 253 254
+             255:     42(ptr) AccessChain 24(data) 25 246 25 58
+             256:      6(int) CompositeExtract 252 1
+                              Store 255 256
+             257:     42(ptr) AccessChain 24(data) 25 246 25 73
+             258:      6(int) CompositeExtract 252 2
+                              Store 257 258
+             259:     27(ptr) AccessChain 10(dti) 26
+             260:      6(int) Load 259
+             261:     27(ptr) AccessChain 10(dti) 26
+             262:      6(int) Load 261
+             263:     81(ptr) AccessChain 24(data) 25 262 78
+             264:   15(ivec4) Load 263
+             265:   15(ivec4) GroupNonUniformIMul 35 InclusiveScan 264
+             266:     81(ptr) AccessChain 24(data) 25 260 78
+                              Store 266 265
+             267:     27(ptr) AccessChain 10(dti) 26
+             268:      6(int) Load 267
+             269:     27(ptr) AccessChain 10(dti) 26
+             270:      6(int) Load 269
+             271:     90(ptr) AccessChain 24(data) 25 270 78 26
+             272:     14(int) Load 271
+             273:     14(int) GroupNonUniformIMul 35 InclusiveScan 272
+             274:     90(ptr) AccessChain 24(data) 25 268 78 26
+                              Store 274 273
              275:     27(ptr) AccessChain 10(dti) 26
              276:      6(int) Load 275
              277:     27(ptr) AccessChain 10(dti) 26
              278:      6(int) Load 277
-             279:    118(ptr) AccessChain 24(data) 25 278 115
-             280:   17(fvec4) Load 279
-             281:   17(fvec4) GroupNonUniformFMul 35 InclusiveScan 280
-             282:    118(ptr) AccessChain 24(data) 25 276 115
-                              Store 282 281
-             283:     27(ptr) AccessChain 10(dti) 26
-             284:      6(int) Load 283
-             285:     27(ptr) AccessChain 10(dti) 26
-             286:      6(int) Load 285
-             287:    127(ptr) AccessChain 24(data) 25 286 115 26
-             288:   16(float) Load 287
-             289:   16(float) GroupNonUniformFMul 35 InclusiveScan 288
-             290:    127(ptr) AccessChain 24(data) 25 284 115 26
-                              Store 290 289
-             291:     27(ptr) AccessChain 10(dti) 26
-             292:      6(int) Load 291
-             293:     27(ptr) AccessChain 10(dti) 26
-             294:      6(int) Load 293
-             295:    118(ptr) AccessChain 24(data) 25 294 115
-             296:   17(fvec4) Load 295
-             297:  136(fvec2) VectorShuffle 296 296 0 1
-             298:  136(fvec2) GroupNonUniformFMul 35 InclusiveScan 297
-             299:    118(ptr) AccessChain 24(data) 25 292 115
-             300:   17(fvec4) Load 299
-             301:   17(fvec4) VectorShuffle 300 298 4 5 2 3
-                              Store 299 301
-             302:     27(ptr) AccessChain 10(dti) 26
-             303:      6(int) Load 302
-             304:     27(ptr) AccessChain 10(dti) 26
-             305:      6(int) Load 304
-             306:    118(ptr) AccessChain 24(data) 25 305 115
-             307:   17(fvec4) Load 306
-             308:  148(fvec3) VectorShuffle 307 307 0 1 2
-             309:  148(fvec3) GroupNonUniformFMul 35 InclusiveScan 308
-             310:    118(ptr) AccessChain 24(data) 25 303 115
-             311:   17(fvec4) Load 310
-             312:   17(fvec4) VectorShuffle 311 309 4 5 6 3
-                              Store 310 312
-             313:     27(ptr) AccessChain 10(dti) 26
-             314:      6(int) Load 313
-             315:     27(ptr) AccessChain 10(dti) 26
-             316:      6(int) Load 315
-             317:    161(ptr) AccessChain 24(data) 25 316 158
-             318: 19(f64vec4) Load 317
-             319: 19(f64vec4) GroupNonUniformFMul 35 InclusiveScan 318
-             320:    161(ptr) AccessChain 24(data) 25 314 158
-                              Store 320 319
-             321:     27(ptr) AccessChain 10(dti) 26
-             322:      6(int) Load 321
-             323:     27(ptr) AccessChain 10(dti) 26
-             324:      6(int) Load 323
-             325:    170(ptr) AccessChain 24(data) 25 324 158 26
-             326:18(float64_t) Load 325
-             327:18(float64_t) GroupNonUniformFMul 35 InclusiveScan 326
-             328:    170(ptr) AccessChain 24(data) 25 322 158 26
-                              Store 328 327
+             279:     81(ptr) AccessChain 24(data) 25 278 78
+             280:   15(ivec4) Load 279
+             281:   99(ivec2) VectorShuffle 280 280 0 1
+             282:   99(ivec2) GroupNonUniformIMul 35 InclusiveScan 281
+             283:     90(ptr) AccessChain 24(data) 25 276 78 26
+             284:     14(int) CompositeExtract 282 0
+                              Store 283 284
+             285:     90(ptr) AccessChain 24(data) 25 276 78 58
+             286:     14(int) CompositeExtract 282 1
+                              Store 285 286
+             287:     27(ptr) AccessChain 10(dti) 26
+             288:      6(int) Load 287
+             289:     27(ptr) AccessChain 10(dti) 26
+             290:      6(int) Load 289
+             291:     81(ptr) AccessChain 24(data) 25 290 78
+             292:   15(ivec4) Load 291
+             293:  112(ivec3) VectorShuffle 292 292 0 1 2
+             294:  112(ivec3) GroupNonUniformIMul 35 InclusiveScan 293
+             295:     90(ptr) AccessChain 24(data) 25 288 78 26
+             296:     14(int) CompositeExtract 294 0
+                              Store 295 296
+             297:     90(ptr) AccessChain 24(data) 25 288 78 58
+             298:     14(int) CompositeExtract 294 1
+                              Store 297 298
+             299:     90(ptr) AccessChain 24(data) 25 288 78 73
+             300:     14(int) CompositeExtract 294 2
+                              Store 299 300
+             301:     27(ptr) AccessChain 10(dti) 26
+             302:      6(int) Load 301
+             303:     27(ptr) AccessChain 10(dti) 26
+             304:      6(int) Load 303
+             305:    128(ptr) AccessChain 24(data) 25 304 125
+             306:   17(fvec4) Load 305
+             307:   17(fvec4) GroupNonUniformFMul 35 InclusiveScan 306
+             308:    128(ptr) AccessChain 24(data) 25 302 125
+                              Store 308 307
+             309:     27(ptr) AccessChain 10(dti) 26
+             310:      6(int) Load 309
+             311:     27(ptr) AccessChain 10(dti) 26
+             312:      6(int) Load 311
+             313:    137(ptr) AccessChain 24(data) 25 312 125 26
+             314:   16(float) Load 313
+             315:   16(float) GroupNonUniformFMul 35 InclusiveScan 314
+             316:    137(ptr) AccessChain 24(data) 25 310 125 26
+                              Store 316 315
+             317:     27(ptr) AccessChain 10(dti) 26
+             318:      6(int) Load 317
+             319:     27(ptr) AccessChain 10(dti) 26
+             320:      6(int) Load 319
+             321:    128(ptr) AccessChain 24(data) 25 320 125
+             322:   17(fvec4) Load 321
+             323:  146(fvec2) VectorShuffle 322 322 0 1
+             324:  146(fvec2) GroupNonUniformFMul 35 InclusiveScan 323
+             325:    137(ptr) AccessChain 24(data) 25 318 125 26
+             326:   16(float) CompositeExtract 324 0
+                              Store 325 326
+             327:    137(ptr) AccessChain 24(data) 25 318 125 58
+             328:   16(float) CompositeExtract 324 1
+                              Store 327 328
              329:     27(ptr) AccessChain 10(dti) 26
              330:      6(int) Load 329
              331:     27(ptr) AccessChain 10(dti) 26
              332:      6(int) Load 331
-             333:    161(ptr) AccessChain 24(data) 25 332 158
-             334: 19(f64vec4) Load 333
-             335:179(f64vec2) VectorShuffle 334 334 0 1
-             336:179(f64vec2) GroupNonUniformFMul 35 InclusiveScan 335
-             337:    161(ptr) AccessChain 24(data) 25 330 158
-             338: 19(f64vec4) Load 337
-             339: 19(f64vec4) VectorShuffle 338 336 4 5 2 3
-                              Store 337 339
-             340:     27(ptr) AccessChain 10(dti) 26
-             341:      6(int) Load 340
-             342:     27(ptr) AccessChain 10(dti) 26
-             343:      6(int) Load 342
-             344:    161(ptr) AccessChain 24(data) 25 343 158
-             345: 19(f64vec4) Load 344
-             346:191(f64vec3) VectorShuffle 345 345 0 1 2
-             347:191(f64vec3) GroupNonUniformFMul 35 InclusiveScan 346
-             348:    161(ptr) AccessChain 24(data) 25 341 158
-             349: 19(f64vec4) Load 348
-             350: 19(f64vec4) VectorShuffle 349 347 4 5 6 3
-                              Store 348 350
+             333:    128(ptr) AccessChain 24(data) 25 332 125
+             334:   17(fvec4) Load 333
+             335:  159(fvec3) VectorShuffle 334 334 0 1 2
+             336:  159(fvec3) GroupNonUniformFMul 35 InclusiveScan 335
+             337:    137(ptr) AccessChain 24(data) 25 330 125 26
+             338:   16(float) CompositeExtract 336 0
+                              Store 337 338
+             339:    137(ptr) AccessChain 24(data) 25 330 125 58
+             340:   16(float) CompositeExtract 336 1
+                              Store 339 340
+             341:    137(ptr) AccessChain 24(data) 25 330 125 73
+             342:   16(float) CompositeExtract 336 2
+                              Store 341 342
+             343:     27(ptr) AccessChain 10(dti) 26
+             344:      6(int) Load 343
+             345:     27(ptr) AccessChain 10(dti) 26
+             346:      6(int) Load 345
+             347:    175(ptr) AccessChain 24(data) 25 346 172
+             348: 19(f64vec4) Load 347
+             349: 19(f64vec4) GroupNonUniformFMul 35 InclusiveScan 348
+             350:    175(ptr) AccessChain 24(data) 25 344 172
+                              Store 350 349
              351:     27(ptr) AccessChain 10(dti) 26
              352:      6(int) Load 351
              353:     27(ptr) AccessChain 10(dti) 26
              354:      6(int) Load 353
-             355:     42(ptr) AccessChain 24(data) 25 354 25 26
-             356:      6(int) Load 355
-             358:   357(bool) IEqual 356 26
-             359:   13(ivec4) GroupNonUniformBallot 35 358
-             360:      6(int) GroupNonUniformBallotBitCount 35 InclusiveScan 359
-             361:     42(ptr) AccessChain 24(data) 25 352 25 26
-                              Store 361 360
+             355:    184(ptr) AccessChain 24(data) 25 354 172 26
+             356:18(float64_t) Load 355
+             357:18(float64_t) GroupNonUniformFMul 35 InclusiveScan 356
+             358:    184(ptr) AccessChain 24(data) 25 352 172 26
+                              Store 358 357
+             359:     27(ptr) AccessChain 10(dti) 26
+             360:      6(int) Load 359
+             361:     27(ptr) AccessChain 10(dti) 26
+             362:      6(int) Load 361
+             363:    175(ptr) AccessChain 24(data) 25 362 172
+             364: 19(f64vec4) Load 363
+             365:193(f64vec2) VectorShuffle 364 364 0 1
+             366:193(f64vec2) GroupNonUniformFMul 35 InclusiveScan 365
+             367:    184(ptr) AccessChain 24(data) 25 360 172 26
+             368:18(float64_t) CompositeExtract 366 0
+                              Store 367 368
+             369:    184(ptr) AccessChain 24(data) 25 360 172 58
+             370:18(float64_t) CompositeExtract 366 1
+                              Store 369 370
+             371:     27(ptr) AccessChain 10(dti) 26
+             372:      6(int) Load 371
+             373:     27(ptr) AccessChain 10(dti) 26
+             374:      6(int) Load 373
+             375:    175(ptr) AccessChain 24(data) 25 374 172
+             376: 19(f64vec4) Load 375
+             377:206(f64vec3) VectorShuffle 376 376 0 1 2
+             378:206(f64vec3) GroupNonUniformFMul 35 InclusiveScan 377
+             379:    184(ptr) AccessChain 24(data) 25 372 172 26
+             380:18(float64_t) CompositeExtract 378 0
+                              Store 379 380
+             381:    184(ptr) AccessChain 24(data) 25 372 172 58
+             382:18(float64_t) CompositeExtract 378 1
+                              Store 381 382
+             383:    184(ptr) AccessChain 24(data) 25 372 172 73
+             384:18(float64_t) CompositeExtract 378 2
+                              Store 383 384
+             385:     27(ptr) AccessChain 10(dti) 26
+             386:      6(int) Load 385
+             387:     27(ptr) AccessChain 10(dti) 26
+             388:      6(int) Load 387
+             389:     42(ptr) AccessChain 24(data) 25 388 25 26
+             390:      6(int) Load 389
+             392:   391(bool) IEqual 390 26
+             393:   13(ivec4) GroupNonUniformBallot 35 392
+             394:      6(int) GroupNonUniformBallotBitCount 35 InclusiveScan 393
+             395:     42(ptr) AccessChain 24(data) 25 386 25 26
+                              Store 395 394
                               Return
                               FunctionEnd
diff --git a/third_party/vulkan-deps/glslang/src/Test/baseResults/hlsl.wavequad.comp.out b/third_party/vulkan-deps/glslang/src/Test/baseResults/hlsl.wavequad.comp.out
index 1647c7d..e4311c7 100644
--- a/third_party/vulkan-deps/glslang/src/Test/baseResults/hlsl.wavequad.comp.out
+++ b/third_party/vulkan-deps/glslang/src/Test/baseResults/hlsl.wavequad.comp.out
@@ -8027,7 +8027,7 @@
 
 // Module Version 10300
 // Generated by (magic number): 8000a
-// Id's are bound by 1120
+// Id's are bound by 1232
 
                               Capability Shader
                               Capability Float64
@@ -8035,7 +8035,7 @@
                               Capability GroupNonUniformQuad
                1:             ExtInstImport  "GLSL.std.450"
                               MemoryModel Logical GLSL450
-                              EntryPoint GLCompute 4  "CSMain" 1115
+                              EntryPoint GLCompute 4  "CSMain" 1227
                               ExecutionMode 4 LocalSize 32 16 1
                               Source HLSL 500
                               Name 4  "CSMain"
@@ -8049,9 +8049,9 @@
                               Name 22  "data"
                               MemberName 22(data) 0  "@data"
                               Name 24  "data"
-                              Name 1113  "dti"
-                              Name 1115  "dti"
-                              Name 1117  "param"
+                              Name 1225  "dti"
+                              Name 1227  "dti"
+                              Name 1229  "param"
                               MemberDecorate 20(Types) 0 Offset 0
                               MemberDecorate 20(Types) 1 Offset 16
                               MemberDecorate 20(Types) 2 Offset 32
@@ -8061,7 +8061,7 @@
                               Decorate 22(data) BufferBlock
                               Decorate 24(data) DescriptorSet 0
                               Decorate 24(data) Binding 0
-                              Decorate 1115(dti) BuiltIn GlobalInvocationId
+                              Decorate 1227(dti) BuiltIn GlobalInvocationId
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeInt 32 0
@@ -8087,34 +8087,34 @@
               35:      6(int) Constant 3
               42:             TypePointer Uniform 6(int)
               51:             TypeVector 6(int) 2
-              72:     14(int) Constant 1
-              75:             TypePointer Uniform 15(ivec4)
-              84:             TypePointer Uniform 14(int)
-              93:             TypeVector 14(int) 2
-             105:             TypeVector 14(int) 3
-             115:     14(int) Constant 2
-             118:             TypePointer Uniform 17(fvec4)
-             127:             TypePointer Uniform 16(float)
-             136:             TypeVector 16(float) 2
-             148:             TypeVector 16(float) 3
-             158:     14(int) Constant 3
-             161:             TypePointer Uniform 19(f64vec4)
-             170:             TypePointer Uniform 18(float64_t)
-             179:             TypeVector 18(float64_t) 2
-             191:             TypeVector 18(float64_t) 3
-             205:      6(int) Constant 1
-             358:      6(int) Constant 2
-            1114:             TypePointer Input 7(ivec3)
-       1115(dti):   1114(ptr) Variable Input
+              58:      6(int) Constant 1
+              73:      6(int) Constant 2
+              78:     14(int) Constant 1
+              81:             TypePointer Uniform 15(ivec4)
+              90:             TypePointer Uniform 14(int)
+              99:             TypeVector 14(int) 2
+             112:             TypeVector 14(int) 3
+             125:     14(int) Constant 2
+             128:             TypePointer Uniform 17(fvec4)
+             137:             TypePointer Uniform 16(float)
+             146:             TypeVector 16(float) 2
+             159:             TypeVector 16(float) 3
+             172:     14(int) Constant 3
+             175:             TypePointer Uniform 19(f64vec4)
+             184:             TypePointer Uniform 18(float64_t)
+             193:             TypeVector 18(float64_t) 2
+             206:             TypeVector 18(float64_t) 3
+            1226:             TypePointer Input 7(ivec3)
+       1227(dti):   1226(ptr) Variable Input
        4(CSMain):           2 Function None 3
                5:             Label
-       1113(dti):      8(ptr) Variable Function
-     1117(param):      8(ptr) Variable Function
-            1116:    7(ivec3) Load 1115(dti)
-                              Store 1113(dti) 1116
-            1118:    7(ivec3) Load 1113(dti)
-                              Store 1117(param) 1118
-            1119:           2 FunctionCall 11(@CSMain(vu3;) 1117(param)
+       1225(dti):      8(ptr) Variable Function
+     1229(param):      8(ptr) Variable Function
+            1228:    7(ivec3) Load 1227(dti)
+                              Store 1225(dti) 1228
+            1230:    7(ivec3) Load 1225(dti)
+                              Store 1229(param) 1230
+            1231:           2 FunctionCall 11(@CSMain(vu3;) 1229(param)
                               Return
                               FunctionEnd
 11(@CSMain(vu3;):           2 Function None 9
@@ -8146,1155 +8146,1351 @@
               53:   13(ivec4) Load 52
               54:   51(ivec2) VectorShuffle 53 53 0 1
               55:   51(ivec2) GroupNonUniformQuadBroadcast 35 54 26
-              56:     32(ptr) AccessChain 24(data) 25 48 25
-              57:   13(ivec4) Load 56
-              58:   13(ivec4) VectorShuffle 57 55 4 5 2 3
-                              Store 56 58
-              59:     27(ptr) AccessChain 10(dti) 26
-              60:      6(int) Load 59
+              56:     42(ptr) AccessChain 24(data) 25 48 25 26
+              57:      6(int) CompositeExtract 55 0
+                              Store 56 57
+              59:     42(ptr) AccessChain 24(data) 25 48 25 58
+              60:      6(int) CompositeExtract 55 1
+                              Store 59 60
               61:     27(ptr) AccessChain 10(dti) 26
               62:      6(int) Load 61
-              63:     32(ptr) AccessChain 24(data) 25 62 25
-              64:   13(ivec4) Load 63
-              65:    7(ivec3) VectorShuffle 64 64 0 1 2
-              66:    7(ivec3) GroupNonUniformQuadBroadcast 35 65 26
-              67:     32(ptr) AccessChain 24(data) 25 60 25
-              68:   13(ivec4) Load 67
-              69:   13(ivec4) VectorShuffle 68 66 4 5 6 3
-                              Store 67 69
-              70:     27(ptr) AccessChain 10(dti) 26
-              71:      6(int) Load 70
-              73:     27(ptr) AccessChain 10(dti) 26
-              74:      6(int) Load 73
-              76:     75(ptr) AccessChain 24(data) 25 74 72
-              77:   15(ivec4) Load 76
-              78:   15(ivec4) GroupNonUniformQuadBroadcast 35 77 26
-              79:     75(ptr) AccessChain 24(data) 25 71 72
-                              Store 79 78
-              80:     27(ptr) AccessChain 10(dti) 26
-              81:      6(int) Load 80
-              82:     27(ptr) AccessChain 10(dti) 26
-              83:      6(int) Load 82
-              85:     84(ptr) AccessChain 24(data) 25 83 72 26
-              86:     14(int) Load 85
-              87:     14(int) GroupNonUniformQuadBroadcast 35 86 26
-              88:     84(ptr) AccessChain 24(data) 25 81 72 26
-                              Store 88 87
-              89:     27(ptr) AccessChain 10(dti) 26
-              90:      6(int) Load 89
-              91:     27(ptr) AccessChain 10(dti) 26
-              92:      6(int) Load 91
-              94:     75(ptr) AccessChain 24(data) 25 92 72
-              95:   15(ivec4) Load 94
-              96:   93(ivec2) VectorShuffle 95 95 0 1
-              97:   93(ivec2) GroupNonUniformQuadBroadcast 35 96 26
-              98:     75(ptr) AccessChain 24(data) 25 90 72
-              99:   15(ivec4) Load 98
-             100:   15(ivec4) VectorShuffle 99 97 4 5 2 3
-                              Store 98 100
-             101:     27(ptr) AccessChain 10(dti) 26
-             102:      6(int) Load 101
-             103:     27(ptr) AccessChain 10(dti) 26
-             104:      6(int) Load 103
-             106:     75(ptr) AccessChain 24(data) 25 104 72
-             107:   15(ivec4) Load 106
-             108:  105(ivec3) VectorShuffle 107 107 0 1 2
-             109:  105(ivec3) GroupNonUniformQuadBroadcast 35 108 26
-             110:     75(ptr) AccessChain 24(data) 25 102 72
-             111:   15(ivec4) Load 110
-             112:   15(ivec4) VectorShuffle 111 109 4 5 6 3
-                              Store 110 112
-             113:     27(ptr) AccessChain 10(dti) 26
-             114:      6(int) Load 113
-             116:     27(ptr) AccessChain 10(dti) 26
-             117:      6(int) Load 116
-             119:    118(ptr) AccessChain 24(data) 25 117 115
-             120:   17(fvec4) Load 119
-             121:   17(fvec4) GroupNonUniformQuadBroadcast 35 120 26
-             122:    118(ptr) AccessChain 24(data) 25 114 115
-                              Store 122 121
+              63:     27(ptr) AccessChain 10(dti) 26
+              64:      6(int) Load 63
+              65:     32(ptr) AccessChain 24(data) 25 64 25
+              66:   13(ivec4) Load 65
+              67:    7(ivec3) VectorShuffle 66 66 0 1 2
+              68:    7(ivec3) GroupNonUniformQuadBroadcast 35 67 26
+              69:     42(ptr) AccessChain 24(data) 25 62 25 26
+              70:      6(int) CompositeExtract 68 0
+                              Store 69 70
+              71:     42(ptr) AccessChain 24(data) 25 62 25 58
+              72:      6(int) CompositeExtract 68 1
+                              Store 71 72
+              74:     42(ptr) AccessChain 24(data) 25 62 25 73
+              75:      6(int) CompositeExtract 68 2
+                              Store 74 75
+              76:     27(ptr) AccessChain 10(dti) 26
+              77:      6(int) Load 76
+              79:     27(ptr) AccessChain 10(dti) 26
+              80:      6(int) Load 79
+              82:     81(ptr) AccessChain 24(data) 25 80 78
+              83:   15(ivec4) Load 82
+              84:   15(ivec4) GroupNonUniformQuadBroadcast 35 83 26
+              85:     81(ptr) AccessChain 24(data) 25 77 78
+                              Store 85 84
+              86:     27(ptr) AccessChain 10(dti) 26
+              87:      6(int) Load 86
+              88:     27(ptr) AccessChain 10(dti) 26
+              89:      6(int) Load 88
+              91:     90(ptr) AccessChain 24(data) 25 89 78 26
+              92:     14(int) Load 91
+              93:     14(int) GroupNonUniformQuadBroadcast 35 92 26
+              94:     90(ptr) AccessChain 24(data) 25 87 78 26
+                              Store 94 93
+              95:     27(ptr) AccessChain 10(dti) 26
+              96:      6(int) Load 95
+              97:     27(ptr) AccessChain 10(dti) 26
+              98:      6(int) Load 97
+             100:     81(ptr) AccessChain 24(data) 25 98 78
+             101:   15(ivec4) Load 100
+             102:   99(ivec2) VectorShuffle 101 101 0 1
+             103:   99(ivec2) GroupNonUniformQuadBroadcast 35 102 26
+             104:     90(ptr) AccessChain 24(data) 25 96 78 26
+             105:     14(int) CompositeExtract 103 0
+                              Store 104 105
+             106:     90(ptr) AccessChain 24(data) 25 96 78 58
+             107:     14(int) CompositeExtract 103 1
+                              Store 106 107
+             108:     27(ptr) AccessChain 10(dti) 26
+             109:      6(int) Load 108
+             110:     27(ptr) AccessChain 10(dti) 26
+             111:      6(int) Load 110
+             113:     81(ptr) AccessChain 24(data) 25 111 78
+             114:   15(ivec4) Load 113
+             115:  112(ivec3) VectorShuffle 114 114 0 1 2
+             116:  112(ivec3) GroupNonUniformQuadBroadcast 35 115 26
+             117:     90(ptr) AccessChain 24(data) 25 109 78 26
+             118:     14(int) CompositeExtract 116 0
+                              Store 117 118
+             119:     90(ptr) AccessChain 24(data) 25 109 78 58
+             120:     14(int) CompositeExtract 116 1
+                              Store 119 120
+             121:     90(ptr) AccessChain 24(data) 25 109 78 73
+             122:     14(int) CompositeExtract 116 2
+                              Store 121 122
              123:     27(ptr) AccessChain 10(dti) 26
              124:      6(int) Load 123
-             125:     27(ptr) AccessChain 10(dti) 26
-             126:      6(int) Load 125
-             128:    127(ptr) AccessChain 24(data) 25 126 115 26
-             129:   16(float) Load 128
-             130:   16(float) GroupNonUniformQuadBroadcast 35 129 26
-             131:    127(ptr) AccessChain 24(data) 25 124 115 26
-                              Store 131 130
-             132:     27(ptr) AccessChain 10(dti) 26
-             133:      6(int) Load 132
-             134:     27(ptr) AccessChain 10(dti) 26
-             135:      6(int) Load 134
-             137:    118(ptr) AccessChain 24(data) 25 135 115
-             138:   17(fvec4) Load 137
-             139:  136(fvec2) VectorShuffle 138 138 0 1
-             140:  136(fvec2) GroupNonUniformQuadBroadcast 35 139 26
-             141:    118(ptr) AccessChain 24(data) 25 133 115
-             142:   17(fvec4) Load 141
-             143:   17(fvec4) VectorShuffle 142 140 4 5 2 3
-                              Store 141 143
+             126:     27(ptr) AccessChain 10(dti) 26
+             127:      6(int) Load 126
+             129:    128(ptr) AccessChain 24(data) 25 127 125
+             130:   17(fvec4) Load 129
+             131:   17(fvec4) GroupNonUniformQuadBroadcast 35 130 26
+             132:    128(ptr) AccessChain 24(data) 25 124 125
+                              Store 132 131
+             133:     27(ptr) AccessChain 10(dti) 26
+             134:      6(int) Load 133
+             135:     27(ptr) AccessChain 10(dti) 26
+             136:      6(int) Load 135
+             138:    137(ptr) AccessChain 24(data) 25 136 125 26
+             139:   16(float) Load 138
+             140:   16(float) GroupNonUniformQuadBroadcast 35 139 26
+             141:    137(ptr) AccessChain 24(data) 25 134 125 26
+                              Store 141 140
+             142:     27(ptr) AccessChain 10(dti) 26
+             143:      6(int) Load 142
              144:     27(ptr) AccessChain 10(dti) 26
              145:      6(int) Load 144
-             146:     27(ptr) AccessChain 10(dti) 26
-             147:      6(int) Load 146
-             149:    118(ptr) AccessChain 24(data) 25 147 115
-             150:   17(fvec4) Load 149
-             151:  148(fvec3) VectorShuffle 150 150 0 1 2
-             152:  148(fvec3) GroupNonUniformQuadBroadcast 35 151 26
-             153:    118(ptr) AccessChain 24(data) 25 145 115
-             154:   17(fvec4) Load 153
-             155:   17(fvec4) VectorShuffle 154 152 4 5 6 3
-                              Store 153 155
-             156:     27(ptr) AccessChain 10(dti) 26
-             157:      6(int) Load 156
-             159:     27(ptr) AccessChain 10(dti) 26
-             160:      6(int) Load 159
-             162:    161(ptr) AccessChain 24(data) 25 160 158
-             163: 19(f64vec4) Load 162
-             164: 19(f64vec4) GroupNonUniformQuadBroadcast 35 163 26
-             165:    161(ptr) AccessChain 24(data) 25 157 158
-                              Store 165 164
-             166:     27(ptr) AccessChain 10(dti) 26
-             167:      6(int) Load 166
-             168:     27(ptr) AccessChain 10(dti) 26
-             169:      6(int) Load 168
-             171:    170(ptr) AccessChain 24(data) 25 169 158 26
-             172:18(float64_t) Load 171
-             173:18(float64_t) GroupNonUniformQuadBroadcast 35 172 26
-             174:    170(ptr) AccessChain 24(data) 25 167 158 26
-                              Store 174 173
-             175:     27(ptr) AccessChain 10(dti) 26
-             176:      6(int) Load 175
-             177:     27(ptr) AccessChain 10(dti) 26
-             178:      6(int) Load 177
-             180:    161(ptr) AccessChain 24(data) 25 178 158
-             181: 19(f64vec4) Load 180
-             182:179(f64vec2) VectorShuffle 181 181 0 1
-             183:179(f64vec2) GroupNonUniformQuadBroadcast 35 182 26
-             184:    161(ptr) AccessChain 24(data) 25 176 158
-             185: 19(f64vec4) Load 184
-             186: 19(f64vec4) VectorShuffle 185 183 4 5 2 3
-                              Store 184 186
-             187:     27(ptr) AccessChain 10(dti) 26
-             188:      6(int) Load 187
+             147:    128(ptr) AccessChain 24(data) 25 145 125
+             148:   17(fvec4) Load 147
+             149:  146(fvec2) VectorShuffle 148 148 0 1
+             150:  146(fvec2) GroupNonUniformQuadBroadcast 35 149 26
+             151:    137(ptr) AccessChain 24(data) 25 143 125 26
+             152:   16(float) CompositeExtract 150 0
+                              Store 151 152
+             153:    137(ptr) AccessChain 24(data) 25 143 125 58
+             154:   16(float) CompositeExtract 150 1
+                              Store 153 154
+             155:     27(ptr) AccessChain 10(dti) 26
+             156:      6(int) Load 155
+             157:     27(ptr) AccessChain 10(dti) 26
+             158:      6(int) Load 157
+             160:    128(ptr) AccessChain 24(data) 25 158 125
+             161:   17(fvec4) Load 160
+             162:  159(fvec3) VectorShuffle 161 161 0 1 2
+             163:  159(fvec3) GroupNonUniformQuadBroadcast 35 162 26
+             164:    137(ptr) AccessChain 24(data) 25 156 125 26
+             165:   16(float) CompositeExtract 163 0
+                              Store 164 165
+             166:    137(ptr) AccessChain 24(data) 25 156 125 58
+             167:   16(float) CompositeExtract 163 1
+                              Store 166 167
+             168:    137(ptr) AccessChain 24(data) 25 156 125 73
+             169:   16(float) CompositeExtract 163 2
+                              Store 168 169
+             170:     27(ptr) AccessChain 10(dti) 26
+             171:      6(int) Load 170
+             173:     27(ptr) AccessChain 10(dti) 26
+             174:      6(int) Load 173
+             176:    175(ptr) AccessChain 24(data) 25 174 172
+             177: 19(f64vec4) Load 176
+             178: 19(f64vec4) GroupNonUniformQuadBroadcast 35 177 26
+             179:    175(ptr) AccessChain 24(data) 25 171 172
+                              Store 179 178
+             180:     27(ptr) AccessChain 10(dti) 26
+             181:      6(int) Load 180
+             182:     27(ptr) AccessChain 10(dti) 26
+             183:      6(int) Load 182
+             185:    184(ptr) AccessChain 24(data) 25 183 172 26
+             186:18(float64_t) Load 185
+             187:18(float64_t) GroupNonUniformQuadBroadcast 35 186 26
+             188:    184(ptr) AccessChain 24(data) 25 181 172 26
+                              Store 188 187
              189:     27(ptr) AccessChain 10(dti) 26
              190:      6(int) Load 189
-             192:    161(ptr) AccessChain 24(data) 25 190 158
-             193: 19(f64vec4) Load 192
-             194:191(f64vec3) VectorShuffle 193 193 0 1 2
-             195:191(f64vec3) GroupNonUniformQuadBroadcast 35 194 26
-             196:    161(ptr) AccessChain 24(data) 25 188 158
-             197: 19(f64vec4) Load 196
-             198: 19(f64vec4) VectorShuffle 197 195 4 5 6 3
-                              Store 196 198
-             199:     27(ptr) AccessChain 10(dti) 26
-             200:      6(int) Load 199
-             201:     27(ptr) AccessChain 10(dti) 26
-             202:      6(int) Load 201
-             203:     32(ptr) AccessChain 24(data) 25 202 25
-             204:   13(ivec4) Load 203
-             206:   13(ivec4) GroupNonUniformQuadBroadcast 35 204 205
-             207:     32(ptr) AccessChain 24(data) 25 200 25
-                              Store 207 206
-             208:     27(ptr) AccessChain 10(dti) 26
-             209:      6(int) Load 208
-             210:     27(ptr) AccessChain 10(dti) 26
-             211:      6(int) Load 210
-             212:     42(ptr) AccessChain 24(data) 25 211 25 26
-             213:      6(int) Load 212
-             214:      6(int) GroupNonUniformQuadBroadcast 35 213 205
-             215:     42(ptr) AccessChain 24(data) 25 209 25 26
-                              Store 215 214
-             216:     27(ptr) AccessChain 10(dti) 26
-             217:      6(int) Load 216
-             218:     27(ptr) AccessChain 10(dti) 26
-             219:      6(int) Load 218
-             220:     32(ptr) AccessChain 24(data) 25 219 25
-             221:   13(ivec4) Load 220
-             222:   51(ivec2) VectorShuffle 221 221 0 1
-             223:   51(ivec2) GroupNonUniformQuadBroadcast 35 222 205
-             224:     32(ptr) AccessChain 24(data) 25 217 25
-             225:   13(ivec4) Load 224
-             226:   13(ivec4) VectorShuffle 225 223 4 5 2 3
-                              Store 224 226
+             191:     27(ptr) AccessChain 10(dti) 26
+             192:      6(int) Load 191
+             194:    175(ptr) AccessChain 24(data) 25 192 172
+             195: 19(f64vec4) Load 194
+             196:193(f64vec2) VectorShuffle 195 195 0 1
+             197:193(f64vec2) GroupNonUniformQuadBroadcast 35 196 26
+             198:    184(ptr) AccessChain 24(data) 25 190 172 26
+             199:18(float64_t) CompositeExtract 197 0
+                              Store 198 199
+             200:    184(ptr) AccessChain 24(data) 25 190 172 58
+             201:18(float64_t) CompositeExtract 197 1
+                              Store 200 201
+             202:     27(ptr) AccessChain 10(dti) 26
+             203:      6(int) Load 202
+             204:     27(ptr) AccessChain 10(dti) 26
+             205:      6(int) Load 204
+             207:    175(ptr) AccessChain 24(data) 25 205 172
+             208: 19(f64vec4) Load 207
+             209:206(f64vec3) VectorShuffle 208 208 0 1 2
+             210:206(f64vec3) GroupNonUniformQuadBroadcast 35 209 26
+             211:    184(ptr) AccessChain 24(data) 25 203 172 26
+             212:18(float64_t) CompositeExtract 210 0
+                              Store 211 212
+             213:    184(ptr) AccessChain 24(data) 25 203 172 58
+             214:18(float64_t) CompositeExtract 210 1
+                              Store 213 214
+             215:    184(ptr) AccessChain 24(data) 25 203 172 73
+             216:18(float64_t) CompositeExtract 210 2
+                              Store 215 216
+             217:     27(ptr) AccessChain 10(dti) 26
+             218:      6(int) Load 217
+             219:     27(ptr) AccessChain 10(dti) 26
+             220:      6(int) Load 219
+             221:     32(ptr) AccessChain 24(data) 25 220 25
+             222:   13(ivec4) Load 221
+             223:   13(ivec4) GroupNonUniformQuadBroadcast 35 222 58
+             224:     32(ptr) AccessChain 24(data) 25 218 25
+                              Store 224 223
+             225:     27(ptr) AccessChain 10(dti) 26
+             226:      6(int) Load 225
              227:     27(ptr) AccessChain 10(dti) 26
              228:      6(int) Load 227
-             229:     27(ptr) AccessChain 10(dti) 26
+             229:     42(ptr) AccessChain 24(data) 25 228 25 26
              230:      6(int) Load 229
-             231:     32(ptr) AccessChain 24(data) 25 230 25
-             232:   13(ivec4) Load 231
-             233:    7(ivec3) VectorShuffle 232 232 0 1 2
-             234:    7(ivec3) GroupNonUniformQuadBroadcast 35 233 205
-             235:     32(ptr) AccessChain 24(data) 25 228 25
-             236:   13(ivec4) Load 235
-             237:   13(ivec4) VectorShuffle 236 234 4 5 6 3
-                              Store 235 237
-             238:     27(ptr) AccessChain 10(dti) 26
-             239:      6(int) Load 238
-             240:     27(ptr) AccessChain 10(dti) 26
-             241:      6(int) Load 240
-             242:     75(ptr) AccessChain 24(data) 25 241 72
-             243:   15(ivec4) Load 242
-             244:   15(ivec4) GroupNonUniformQuadBroadcast 35 243 205
-             245:     75(ptr) AccessChain 24(data) 25 239 72
-                              Store 245 244
-             246:     27(ptr) AccessChain 10(dti) 26
-             247:      6(int) Load 246
-             248:     27(ptr) AccessChain 10(dti) 26
-             249:      6(int) Load 248
-             250:     84(ptr) AccessChain 24(data) 25 249 72 26
-             251:     14(int) Load 250
-             252:     14(int) GroupNonUniformQuadBroadcast 35 251 205
-             253:     84(ptr) AccessChain 24(data) 25 247 72 26
-                              Store 253 252
-             254:     27(ptr) AccessChain 10(dti) 26
-             255:      6(int) Load 254
-             256:     27(ptr) AccessChain 10(dti) 26
-             257:      6(int) Load 256
-             258:     75(ptr) AccessChain 24(data) 25 257 72
-             259:   15(ivec4) Load 258
-             260:   93(ivec2) VectorShuffle 259 259 0 1
-             261:   93(ivec2) GroupNonUniformQuadBroadcast 35 260 205
-             262:     75(ptr) AccessChain 24(data) 25 255 72
-             263:   15(ivec4) Load 262
-             264:   15(ivec4) VectorShuffle 263 261 4 5 2 3
-                              Store 262 264
-             265:     27(ptr) AccessChain 10(dti) 26
-             266:      6(int) Load 265
+             231:      6(int) GroupNonUniformQuadBroadcast 35 230 58
+             232:     42(ptr) AccessChain 24(data) 25 226 25 26
+                              Store 232 231
+             233:     27(ptr) AccessChain 10(dti) 26
+             234:      6(int) Load 233
+             235:     27(ptr) AccessChain 10(dti) 26
+             236:      6(int) Load 235
+             237:     32(ptr) AccessChain 24(data) 25 236 25
+             238:   13(ivec4) Load 237
+             239:   51(ivec2) VectorShuffle 238 238 0 1
+             240:   51(ivec2) GroupNonUniformQuadBroadcast 35 239 58
+             241:     42(ptr) AccessChain 24(data) 25 234 25 26
+             242:      6(int) CompositeExtract 240 0
+                              Store 241 242
+             243:     42(ptr) AccessChain 24(data) 25 234 25 58
+             244:      6(int) CompositeExtract 240 1
+                              Store 243 244
+             245:     27(ptr) AccessChain 10(dti) 26
+             246:      6(int) Load 245
+             247:     27(ptr) AccessChain 10(dti) 26
+             248:      6(int) Load 247
+             249:     32(ptr) AccessChain 24(data) 25 248 25
+             250:   13(ivec4) Load 249
+             251:    7(ivec3) VectorShuffle 250 250 0 1 2
+             252:    7(ivec3) GroupNonUniformQuadBroadcast 35 251 58
+             253:     42(ptr) AccessChain 24(data) 25 246 25 26
+             254:      6(int) CompositeExtract 252 0
+                              Store 253 254
+             255:     42(ptr) AccessChain 24(data) 25 246 25 58
+             256:      6(int) CompositeExtract 252 1
+                              Store 255 256
+             257:     42(ptr) AccessChain 24(data) 25 246 25 73
+             258:      6(int) CompositeExtract 252 2
+                              Store 257 258
+             259:     27(ptr) AccessChain 10(dti) 26
+             260:      6(int) Load 259
+             261:     27(ptr) AccessChain 10(dti) 26
+             262:      6(int) Load 261
+             263:     81(ptr) AccessChain 24(data) 25 262 78
+             264:   15(ivec4) Load 263
+             265:   15(ivec4) GroupNonUniformQuadBroadcast 35 264 58
+             266:     81(ptr) AccessChain 24(data) 25 260 78
+                              Store 266 265
              267:     27(ptr) AccessChain 10(dti) 26
              268:      6(int) Load 267
-             269:     75(ptr) AccessChain 24(data) 25 268 72
-             270:   15(ivec4) Load 269
-             271:  105(ivec3) VectorShuffle 270 270 0 1 2
-             272:  105(ivec3) GroupNonUniformQuadBroadcast 35 271 205
-             273:     75(ptr) AccessChain 24(data) 25 266 72
-             274:   15(ivec4) Load 273
-             275:   15(ivec4) VectorShuffle 274 272 4 5 6 3
-                              Store 273 275
-             276:     27(ptr) AccessChain 10(dti) 26
-             277:      6(int) Load 276
-             278:     27(ptr) AccessChain 10(dti) 26
-             279:      6(int) Load 278
-             280:    118(ptr) AccessChain 24(data) 25 279 115
-             281:   17(fvec4) Load 280
-             282:   17(fvec4) GroupNonUniformQuadBroadcast 35 281 205
-             283:    118(ptr) AccessChain 24(data) 25 277 115
-                              Store 283 282
-             284:     27(ptr) AccessChain 10(dti) 26
-             285:      6(int) Load 284
-             286:     27(ptr) AccessChain 10(dti) 26
-             287:      6(int) Load 286
-             288:    127(ptr) AccessChain 24(data) 25 287 115 26
-             289:   16(float) Load 288
-             290:   16(float) GroupNonUniformQuadBroadcast 35 289 205
-             291:    127(ptr) AccessChain 24(data) 25 285 115 26
-                              Store 291 290
-             292:     27(ptr) AccessChain 10(dti) 26
-             293:      6(int) Load 292
-             294:     27(ptr) AccessChain 10(dti) 26
-             295:      6(int) Load 294
-             296:    118(ptr) AccessChain 24(data) 25 295 115
-             297:   17(fvec4) Load 296
-             298:  136(fvec2) VectorShuffle 297 297 0 1
-             299:  136(fvec2) GroupNonUniformQuadBroadcast 35 298 205
-             300:    118(ptr) AccessChain 24(data) 25 293 115
-             301:   17(fvec4) Load 300
-             302:   17(fvec4) VectorShuffle 301 299 4 5 2 3
-                              Store 300 302
+             269:     27(ptr) AccessChain 10(dti) 26
+             270:      6(int) Load 269
+             271:     90(ptr) AccessChain 24(data) 25 270 78 26
+             272:     14(int) Load 271
+             273:     14(int) GroupNonUniformQuadBroadcast 35 272 58
+             274:     90(ptr) AccessChain 24(data) 25 268 78 26
+                              Store 274 273
+             275:     27(ptr) AccessChain 10(dti) 26
+             276:      6(int) Load 275
+             277:     27(ptr) AccessChain 10(dti) 26
+             278:      6(int) Load 277
+             279:     81(ptr) AccessChain 24(data) 25 278 78
+             280:   15(ivec4) Load 279
+             281:   99(ivec2) VectorShuffle 280 280 0 1
+             282:   99(ivec2) GroupNonUniformQuadBroadcast 35 281 58
+             283:     90(ptr) AccessChain 24(data) 25 276 78 26
+             284:     14(int) CompositeExtract 282 0
+                              Store 283 284
+             285:     90(ptr) AccessChain 24(data) 25 276 78 58
+             286:     14(int) CompositeExtract 282 1
+                              Store 285 286
+             287:     27(ptr) AccessChain 10(dti) 26
+             288:      6(int) Load 287
+             289:     27(ptr) AccessChain 10(dti) 26
+             290:      6(int) Load 289
+             291:     81(ptr) AccessChain 24(data) 25 290 78
+             292:   15(ivec4) Load 291
+             293:  112(ivec3) VectorShuffle 292 292 0 1 2
+             294:  112(ivec3) GroupNonUniformQuadBroadcast 35 293 58
+             295:     90(ptr) AccessChain 24(data) 25 288 78 26
+             296:     14(int) CompositeExtract 294 0
+                              Store 295 296
+             297:     90(ptr) AccessChain 24(data) 25 288 78 58
+             298:     14(int) CompositeExtract 294 1
+                              Store 297 298
+             299:     90(ptr) AccessChain 24(data) 25 288 78 73
+             300:     14(int) CompositeExtract 294 2
+                              Store 299 300
+             301:     27(ptr) AccessChain 10(dti) 26
+             302:      6(int) Load 301
              303:     27(ptr) AccessChain 10(dti) 26
              304:      6(int) Load 303
-             305:     27(ptr) AccessChain 10(dti) 26
-             306:      6(int) Load 305
-             307:    118(ptr) AccessChain 24(data) 25 306 115
-             308:   17(fvec4) Load 307
-             309:  148(fvec3) VectorShuffle 308 308 0 1 2
-             310:  148(fvec3) GroupNonUniformQuadBroadcast 35 309 205
-             311:    118(ptr) AccessChain 24(data) 25 304 115
-             312:   17(fvec4) Load 311
-             313:   17(fvec4) VectorShuffle 312 310 4 5 6 3
-                              Store 311 313
-             314:     27(ptr) AccessChain 10(dti) 26
-             315:      6(int) Load 314
-             316:     27(ptr) AccessChain 10(dti) 26
-             317:      6(int) Load 316
-             318:    161(ptr) AccessChain 24(data) 25 317 158
-             319: 19(f64vec4) Load 318
-             320: 19(f64vec4) GroupNonUniformQuadBroadcast 35 319 205
-             321:    161(ptr) AccessChain 24(data) 25 315 158
-                              Store 321 320
-             322:     27(ptr) AccessChain 10(dti) 26
-             323:      6(int) Load 322
-             324:     27(ptr) AccessChain 10(dti) 26
-             325:      6(int) Load 324
-             326:    170(ptr) AccessChain 24(data) 25 325 158 26
-             327:18(float64_t) Load 326
-             328:18(float64_t) GroupNonUniformQuadBroadcast 35 327 205
-             329:    170(ptr) AccessChain 24(data) 25 323 158 26
-                              Store 329 328
-             330:     27(ptr) AccessChain 10(dti) 26
-             331:      6(int) Load 330
-             332:     27(ptr) AccessChain 10(dti) 26
-             333:      6(int) Load 332
-             334:    161(ptr) AccessChain 24(data) 25 333 158
-             335: 19(f64vec4) Load 334
-             336:179(f64vec2) VectorShuffle 335 335 0 1
-             337:179(f64vec2) GroupNonUniformQuadBroadcast 35 336 205
-             338:    161(ptr) AccessChain 24(data) 25 331 158
-             339: 19(f64vec4) Load 338
-             340: 19(f64vec4) VectorShuffle 339 337 4 5 2 3
-                              Store 338 340
-             341:     27(ptr) AccessChain 10(dti) 26
-             342:      6(int) Load 341
+             305:    128(ptr) AccessChain 24(data) 25 304 125
+             306:   17(fvec4) Load 305
+             307:   17(fvec4) GroupNonUniformQuadBroadcast 35 306 58
+             308:    128(ptr) AccessChain 24(data) 25 302 125
+                              Store 308 307
+             309:     27(ptr) AccessChain 10(dti) 26
+             310:      6(int) Load 309
+             311:     27(ptr) AccessChain 10(dti) 26
+             312:      6(int) Load 311
+             313:    137(ptr) AccessChain 24(data) 25 312 125 26
+             314:   16(float) Load 313
+             315:   16(float) GroupNonUniformQuadBroadcast 35 314 58
+             316:    137(ptr) AccessChain 24(data) 25 310 125 26
+                              Store 316 315
+             317:     27(ptr) AccessChain 10(dti) 26
+             318:      6(int) Load 317
+             319:     27(ptr) AccessChain 10(dti) 26
+             320:      6(int) Load 319
+             321:    128(ptr) AccessChain 24(data) 25 320 125
+             322:   17(fvec4) Load 321
+             323:  146(fvec2) VectorShuffle 322 322 0 1
+             324:  146(fvec2) GroupNonUniformQuadBroadcast 35 323 58
+             325:    137(ptr) AccessChain 24(data) 25 318 125 26
+             326:   16(float) CompositeExtract 324 0
+                              Store 325 326
+             327:    137(ptr) AccessChain 24(data) 25 318 125 58
+             328:   16(float) CompositeExtract 324 1
+                              Store 327 328
+             329:     27(ptr) AccessChain 10(dti) 26
+             330:      6(int) Load 329
+             331:     27(ptr) AccessChain 10(dti) 26
+             332:      6(int) Load 331
+             333:    128(ptr) AccessChain 24(data) 25 332 125
+             334:   17(fvec4) Load 333
+             335:  159(fvec3) VectorShuffle 334 334 0 1 2
+             336:  159(fvec3) GroupNonUniformQuadBroadcast 35 335 58
+             337:    137(ptr) AccessChain 24(data) 25 330 125 26
+             338:   16(float) CompositeExtract 336 0
+                              Store 337 338
+             339:    137(ptr) AccessChain 24(data) 25 330 125 58
+             340:   16(float) CompositeExtract 336 1
+                              Store 339 340
+             341:    137(ptr) AccessChain 24(data) 25 330 125 73
+             342:   16(float) CompositeExtract 336 2
+                              Store 341 342
              343:     27(ptr) AccessChain 10(dti) 26
              344:      6(int) Load 343
-             345:    161(ptr) AccessChain 24(data) 25 344 158
-             346: 19(f64vec4) Load 345
-             347:191(f64vec3) VectorShuffle 346 346 0 1 2
-             348:191(f64vec3) GroupNonUniformQuadBroadcast 35 347 205
-             349:    161(ptr) AccessChain 24(data) 25 342 158
-             350: 19(f64vec4) Load 349
-             351: 19(f64vec4) VectorShuffle 350 348 4 5 6 3
-                              Store 349 351
-             352:     27(ptr) AccessChain 10(dti) 26
-             353:      6(int) Load 352
-             354:     27(ptr) AccessChain 10(dti) 26
-             355:      6(int) Load 354
-             356:     32(ptr) AccessChain 24(data) 25 355 25
-             357:   13(ivec4) Load 356
-             359:   13(ivec4) GroupNonUniformQuadBroadcast 35 357 358
-             360:     32(ptr) AccessChain 24(data) 25 353 25
-                              Store 360 359
+             345:     27(ptr) AccessChain 10(dti) 26
+             346:      6(int) Load 345
+             347:    175(ptr) AccessChain 24(data) 25 346 172
+             348: 19(f64vec4) Load 347
+             349: 19(f64vec4) GroupNonUniformQuadBroadcast 35 348 58
+             350:    175(ptr) AccessChain 24(data) 25 344 172
+                              Store 350 349
+             351:     27(ptr) AccessChain 10(dti) 26
+             352:      6(int) Load 351
+             353:     27(ptr) AccessChain 10(dti) 26
+             354:      6(int) Load 353
+             355:    184(ptr) AccessChain 24(data) 25 354 172 26
+             356:18(float64_t) Load 355
+             357:18(float64_t) GroupNonUniformQuadBroadcast 35 356 58
+             358:    184(ptr) AccessChain 24(data) 25 352 172 26
+                              Store 358 357
+             359:     27(ptr) AccessChain 10(dti) 26
+             360:      6(int) Load 359
              361:     27(ptr) AccessChain 10(dti) 26
              362:      6(int) Load 361
-             363:     27(ptr) AccessChain 10(dti) 26
-             364:      6(int) Load 363
-             365:     42(ptr) AccessChain 24(data) 25 364 25 26
-             366:      6(int) Load 365
-             367:      6(int) GroupNonUniformQuadBroadcast 35 366 358
-             368:     42(ptr) AccessChain 24(data) 25 362 25 26
-                              Store 368 367
-             369:     27(ptr) AccessChain 10(dti) 26
-             370:      6(int) Load 369
+             363:    175(ptr) AccessChain 24(data) 25 362 172
+             364: 19(f64vec4) Load 363
+             365:193(f64vec2) VectorShuffle 364 364 0 1
+             366:193(f64vec2) GroupNonUniformQuadBroadcast 35 365 58
+             367:    184(ptr) AccessChain 24(data) 25 360 172 26
+             368:18(float64_t) CompositeExtract 366 0
+                              Store 367 368
+             369:    184(ptr) AccessChain 24(data) 25 360 172 58
+             370:18(float64_t) CompositeExtract 366 1
+                              Store 369 370
              371:     27(ptr) AccessChain 10(dti) 26
              372:      6(int) Load 371
-             373:     32(ptr) AccessChain 24(data) 25 372 25
-             374:   13(ivec4) Load 373
-             375:   51(ivec2) VectorShuffle 374 374 0 1
-             376:   51(ivec2) GroupNonUniformQuadBroadcast 35 375 358
-             377:     32(ptr) AccessChain 24(data) 25 370 25
-             378:   13(ivec4) Load 377
-             379:   13(ivec4) VectorShuffle 378 376 4 5 2 3
-                              Store 377 379
-             380:     27(ptr) AccessChain 10(dti) 26
-             381:      6(int) Load 380
-             382:     27(ptr) AccessChain 10(dti) 26
-             383:      6(int) Load 382
-             384:     32(ptr) AccessChain 24(data) 25 383 25
-             385:   13(ivec4) Load 384
-             386:    7(ivec3) VectorShuffle 385 385 0 1 2
-             387:    7(ivec3) GroupNonUniformQuadBroadcast 35 386 358
-             388:     32(ptr) AccessChain 24(data) 25 381 25
-             389:   13(ivec4) Load 388
-             390:   13(ivec4) VectorShuffle 389 387 4 5 6 3
-                              Store 388 390
-             391:     27(ptr) AccessChain 10(dti) 26
-             392:      6(int) Load 391
+             373:     27(ptr) AccessChain 10(dti) 26
+             374:      6(int) Load 373
+             375:    175(ptr) AccessChain 24(data) 25 374 172
+             376: 19(f64vec4) Load 375
+             377:206(f64vec3) VectorShuffle 376 376 0 1 2
+             378:206(f64vec3) GroupNonUniformQuadBroadcast 35 377 58
+             379:    184(ptr) AccessChain 24(data) 25 372 172 26
+             380:18(float64_t) CompositeExtract 378 0
+                              Store 379 380
+             381:    184(ptr) AccessChain 24(data) 25 372 172 58
+             382:18(float64_t) CompositeExtract 378 1
+                              Store 381 382
+             383:    184(ptr) AccessChain 24(data) 25 372 172 73
+             384:18(float64_t) CompositeExtract 378 2
+                              Store 383 384
+             385:     27(ptr) AccessChain 10(dti) 26
+             386:      6(int) Load 385
+             387:     27(ptr) AccessChain 10(dti) 26
+             388:      6(int) Load 387
+             389:     32(ptr) AccessChain 24(data) 25 388 25
+             390:   13(ivec4) Load 389
+             391:   13(ivec4) GroupNonUniformQuadBroadcast 35 390 73
+             392:     32(ptr) AccessChain 24(data) 25 386 25
+                              Store 392 391
              393:     27(ptr) AccessChain 10(dti) 26
              394:      6(int) Load 393
-             395:     75(ptr) AccessChain 24(data) 25 394 72
-             396:   15(ivec4) Load 395
-             397:   15(ivec4) GroupNonUniformQuadBroadcast 35 396 358
-             398:     75(ptr) AccessChain 24(data) 25 392 72
-                              Store 398 397
-             399:     27(ptr) AccessChain 10(dti) 26
-             400:      6(int) Load 399
+             395:     27(ptr) AccessChain 10(dti) 26
+             396:      6(int) Load 395
+             397:     42(ptr) AccessChain 24(data) 25 396 25 26
+             398:      6(int) Load 397
+             399:      6(int) GroupNonUniformQuadBroadcast 35 398 73
+             400:     42(ptr) AccessChain 24(data) 25 394 25 26
+                              Store 400 399
              401:     27(ptr) AccessChain 10(dti) 26
              402:      6(int) Load 401
-             403:     84(ptr) AccessChain 24(data) 25 402 72 26
-             404:     14(int) Load 403
-             405:     14(int) GroupNonUniformQuadBroadcast 35 404 358
-             406:     84(ptr) AccessChain 24(data) 25 400 72 26
-                              Store 406 405
-             407:     27(ptr) AccessChain 10(dti) 26
-             408:      6(int) Load 407
-             409:     27(ptr) AccessChain 10(dti) 26
-             410:      6(int) Load 409
-             411:     75(ptr) AccessChain 24(data) 25 410 72
-             412:   15(ivec4) Load 411
-             413:   93(ivec2) VectorShuffle 412 412 0 1
-             414:   93(ivec2) GroupNonUniformQuadBroadcast 35 413 358
-             415:     75(ptr) AccessChain 24(data) 25 408 72
-             416:   15(ivec4) Load 415
-             417:   15(ivec4) VectorShuffle 416 414 4 5 2 3
-                              Store 415 417
-             418:     27(ptr) AccessChain 10(dti) 26
-             419:      6(int) Load 418
-             420:     27(ptr) AccessChain 10(dti) 26
-             421:      6(int) Load 420
-             422:     75(ptr) AccessChain 24(data) 25 421 72
-             423:   15(ivec4) Load 422
-             424:  105(ivec3) VectorShuffle 423 423 0 1 2
-             425:  105(ivec3) GroupNonUniformQuadBroadcast 35 424 358
-             426:     75(ptr) AccessChain 24(data) 25 419 72
-             427:   15(ivec4) Load 426
-             428:   15(ivec4) VectorShuffle 427 425 4 5 6 3
-                              Store 426 428
+             403:     27(ptr) AccessChain 10(dti) 26
+             404:      6(int) Load 403
+             405:     32(ptr) AccessChain 24(data) 25 404 25
+             406:   13(ivec4) Load 405
+             407:   51(ivec2) VectorShuffle 406 406 0 1
+             408:   51(ivec2) GroupNonUniformQuadBroadcast 35 407 73
+             409:     42(ptr) AccessChain 24(data) 25 402 25 26
+             410:      6(int) CompositeExtract 408 0
+                              Store 409 410
+             411:     42(ptr) AccessChain 24(data) 25 402 25 58
+             412:      6(int) CompositeExtract 408 1
+                              Store 411 412
+             413:     27(ptr) AccessChain 10(dti) 26
+             414:      6(int) Load 413
+             415:     27(ptr) AccessChain 10(dti) 26
+             416:      6(int) Load 415
+             417:     32(ptr) AccessChain 24(data) 25 416 25
+             418:   13(ivec4) Load 417
+             419:    7(ivec3) VectorShuffle 418 418 0 1 2
+             420:    7(ivec3) GroupNonUniformQuadBroadcast 35 419 73
+             421:     42(ptr) AccessChain 24(data) 25 414 25 26
+             422:      6(int) CompositeExtract 420 0
+                              Store 421 422
+             423:     42(ptr) AccessChain 24(data) 25 414 25 58
+             424:      6(int) CompositeExtract 420 1
+                              Store 423 424
+             425:     42(ptr) AccessChain 24(data) 25 414 25 73
+             426:      6(int) CompositeExtract 420 2
+                              Store 425 426
+             427:     27(ptr) AccessChain 10(dti) 26
+             428:      6(int) Load 427
              429:     27(ptr) AccessChain 10(dti) 26
              430:      6(int) Load 429
-             431:     27(ptr) AccessChain 10(dti) 26
-             432:      6(int) Load 431
-             433:    118(ptr) AccessChain 24(data) 25 432 115
-             434:   17(fvec4) Load 433
-             435:   17(fvec4) GroupNonUniformQuadBroadcast 35 434 358
-             436:    118(ptr) AccessChain 24(data) 25 430 115
-                              Store 436 435
+             431:     81(ptr) AccessChain 24(data) 25 430 78
+             432:   15(ivec4) Load 431
+             433:   15(ivec4) GroupNonUniformQuadBroadcast 35 432 73
+             434:     81(ptr) AccessChain 24(data) 25 428 78
+                              Store 434 433
+             435:     27(ptr) AccessChain 10(dti) 26
+             436:      6(int) Load 435
              437:     27(ptr) AccessChain 10(dti) 26
              438:      6(int) Load 437
-             439:     27(ptr) AccessChain 10(dti) 26
-             440:      6(int) Load 439
-             441:    127(ptr) AccessChain 24(data) 25 440 115 26
-             442:   16(float) Load 441
-             443:   16(float) GroupNonUniformQuadBroadcast 35 442 358
-             444:    127(ptr) AccessChain 24(data) 25 438 115 26
-                              Store 444 443
+             439:     90(ptr) AccessChain 24(data) 25 438 78 26
+             440:     14(int) Load 439
+             441:     14(int) GroupNonUniformQuadBroadcast 35 440 73
+             442:     90(ptr) AccessChain 24(data) 25 436 78 26
+                              Store 442 441
+             443:     27(ptr) AccessChain 10(dti) 26
+             444:      6(int) Load 443
              445:     27(ptr) AccessChain 10(dti) 26
              446:      6(int) Load 445
-             447:     27(ptr) AccessChain 10(dti) 26
-             448:      6(int) Load 447
-             449:    118(ptr) AccessChain 24(data) 25 448 115
-             450:   17(fvec4) Load 449
-             451:  136(fvec2) VectorShuffle 450 450 0 1
-             452:  136(fvec2) GroupNonUniformQuadBroadcast 35 451 358
-             453:    118(ptr) AccessChain 24(data) 25 446 115
-             454:   17(fvec4) Load 453
-             455:   17(fvec4) VectorShuffle 454 452 4 5 2 3
-                              Store 453 455
-             456:     27(ptr) AccessChain 10(dti) 26
-             457:      6(int) Load 456
-             458:     27(ptr) AccessChain 10(dti) 26
-             459:      6(int) Load 458
-             460:    118(ptr) AccessChain 24(data) 25 459 115
-             461:   17(fvec4) Load 460
-             462:  148(fvec3) VectorShuffle 461 461 0 1 2
-             463:  148(fvec3) GroupNonUniformQuadBroadcast 35 462 358
-             464:    118(ptr) AccessChain 24(data) 25 457 115
-             465:   17(fvec4) Load 464
-             466:   17(fvec4) VectorShuffle 465 463 4 5 6 3
-                              Store 464 466
-             467:     27(ptr) AccessChain 10(dti) 26
-             468:      6(int) Load 467
+             447:     81(ptr) AccessChain 24(data) 25 446 78
+             448:   15(ivec4) Load 447
+             449:   99(ivec2) VectorShuffle 448 448 0 1
+             450:   99(ivec2) GroupNonUniformQuadBroadcast 35 449 73
+             451:     90(ptr) AccessChain 24(data) 25 444 78 26
+             452:     14(int) CompositeExtract 450 0
+                              Store 451 452
+             453:     90(ptr) AccessChain 24(data) 25 444 78 58
+             454:     14(int) CompositeExtract 450 1
+                              Store 453 454
+             455:     27(ptr) AccessChain 10(dti) 26
+             456:      6(int) Load 455
+             457:     27(ptr) AccessChain 10(dti) 26
+             458:      6(int) Load 457
+             459:     81(ptr) AccessChain 24(data) 25 458 78
+             460:   15(ivec4) Load 459
+             461:  112(ivec3) VectorShuffle 460 460 0 1 2
+             462:  112(ivec3) GroupNonUniformQuadBroadcast 35 461 73
+             463:     90(ptr) AccessChain 24(data) 25 456 78 26
+             464:     14(int) CompositeExtract 462 0
+                              Store 463 464
+             465:     90(ptr) AccessChain 24(data) 25 456 78 58
+             466:     14(int) CompositeExtract 462 1
+                              Store 465 466
+             467:     90(ptr) AccessChain 24(data) 25 456 78 73
+             468:     14(int) CompositeExtract 462 2
+                              Store 467 468
              469:     27(ptr) AccessChain 10(dti) 26
              470:      6(int) Load 469
-             471:    161(ptr) AccessChain 24(data) 25 470 158
-             472: 19(f64vec4) Load 471
-             473: 19(f64vec4) GroupNonUniformQuadBroadcast 35 472 358
-             474:    161(ptr) AccessChain 24(data) 25 468 158
-                              Store 474 473
-             475:     27(ptr) AccessChain 10(dti) 26
-             476:      6(int) Load 475
+             471:     27(ptr) AccessChain 10(dti) 26
+             472:      6(int) Load 471
+             473:    128(ptr) AccessChain 24(data) 25 472 125
+             474:   17(fvec4) Load 473
+             475:   17(fvec4) GroupNonUniformQuadBroadcast 35 474 73
+             476:    128(ptr) AccessChain 24(data) 25 470 125
+                              Store 476 475
              477:     27(ptr) AccessChain 10(dti) 26
              478:      6(int) Load 477
-             479:    170(ptr) AccessChain 24(data) 25 478 158 26
-             480:18(float64_t) Load 479
-             481:18(float64_t) GroupNonUniformQuadBroadcast 35 480 358
-             482:    170(ptr) AccessChain 24(data) 25 476 158 26
-                              Store 482 481
-             483:     27(ptr) AccessChain 10(dti) 26
-             484:      6(int) Load 483
+             479:     27(ptr) AccessChain 10(dti) 26
+             480:      6(int) Load 479
+             481:    137(ptr) AccessChain 24(data) 25 480 125 26
+             482:   16(float) Load 481
+             483:   16(float) GroupNonUniformQuadBroadcast 35 482 73
+             484:    137(ptr) AccessChain 24(data) 25 478 125 26
+                              Store 484 483
              485:     27(ptr) AccessChain 10(dti) 26
              486:      6(int) Load 485
-             487:    161(ptr) AccessChain 24(data) 25 486 158
-             488: 19(f64vec4) Load 487
-             489:179(f64vec2) VectorShuffle 488 488 0 1
-             490:179(f64vec2) GroupNonUniformQuadBroadcast 35 489 358
-             491:    161(ptr) AccessChain 24(data) 25 484 158
-             492: 19(f64vec4) Load 491
-             493: 19(f64vec4) VectorShuffle 492 490 4 5 2 3
-                              Store 491 493
-             494:     27(ptr) AccessChain 10(dti) 26
-             495:      6(int) Load 494
-             496:     27(ptr) AccessChain 10(dti) 26
-             497:      6(int) Load 496
-             498:    161(ptr) AccessChain 24(data) 25 497 158
-             499: 19(f64vec4) Load 498
-             500:191(f64vec3) VectorShuffle 499 499 0 1 2
-             501:191(f64vec3) GroupNonUniformQuadBroadcast 35 500 358
-             502:    161(ptr) AccessChain 24(data) 25 495 158
-             503: 19(f64vec4) Load 502
-             504: 19(f64vec4) VectorShuffle 503 501 4 5 6 3
-                              Store 502 504
-             505:     27(ptr) AccessChain 10(dti) 26
-             506:      6(int) Load 505
-             507:     27(ptr) AccessChain 10(dti) 26
-             508:      6(int) Load 507
-             509:     32(ptr) AccessChain 24(data) 25 508 25
-             510:   13(ivec4) Load 509
-             511:   13(ivec4) GroupNonUniformQuadBroadcast 35 510 35
-             512:     32(ptr) AccessChain 24(data) 25 506 25
-                              Store 512 511
+             487:     27(ptr) AccessChain 10(dti) 26
+             488:      6(int) Load 487
+             489:    128(ptr) AccessChain 24(data) 25 488 125
+             490:   17(fvec4) Load 489
+             491:  146(fvec2) VectorShuffle 490 490 0 1
+             492:  146(fvec2) GroupNonUniformQuadBroadcast 35 491 73
+             493:    137(ptr) AccessChain 24(data) 25 486 125 26
+             494:   16(float) CompositeExtract 492 0
+                              Store 493 494
+             495:    137(ptr) AccessChain 24(data) 25 486 125 58
+             496:   16(float) CompositeExtract 492 1
+                              Store 495 496
+             497:     27(ptr) AccessChain 10(dti) 26
+             498:      6(int) Load 497
+             499:     27(ptr) AccessChain 10(dti) 26
+             500:      6(int) Load 499
+             501:    128(ptr) AccessChain 24(data) 25 500 125
+             502:   17(fvec4) Load 501
+             503:  159(fvec3) VectorShuffle 502 502 0 1 2
+             504:  159(fvec3) GroupNonUniformQuadBroadcast 35 503 73
+             505:    137(ptr) AccessChain 24(data) 25 498 125 26
+             506:   16(float) CompositeExtract 504 0
+                              Store 505 506
+             507:    137(ptr) AccessChain 24(data) 25 498 125 58
+             508:   16(float) CompositeExtract 504 1
+                              Store 507 508
+             509:    137(ptr) AccessChain 24(data) 25 498 125 73
+             510:   16(float) CompositeExtract 504 2
+                              Store 509 510
+             511:     27(ptr) AccessChain 10(dti) 26
+             512:      6(int) Load 511
              513:     27(ptr) AccessChain 10(dti) 26
              514:      6(int) Load 513
-             515:     27(ptr) AccessChain 10(dti) 26
-             516:      6(int) Load 515
-             517:     42(ptr) AccessChain 24(data) 25 516 25 26
-             518:      6(int) Load 517
-             519:      6(int) GroupNonUniformQuadBroadcast 35 518 35
-             520:     42(ptr) AccessChain 24(data) 25 514 25 26
-                              Store 520 519
+             515:    175(ptr) AccessChain 24(data) 25 514 172
+             516: 19(f64vec4) Load 515
+             517: 19(f64vec4) GroupNonUniformQuadBroadcast 35 516 73
+             518:    175(ptr) AccessChain 24(data) 25 512 172
+                              Store 518 517
+             519:     27(ptr) AccessChain 10(dti) 26
+             520:      6(int) Load 519
              521:     27(ptr) AccessChain 10(dti) 26
              522:      6(int) Load 521
-             523:     27(ptr) AccessChain 10(dti) 26
-             524:      6(int) Load 523
-             525:     32(ptr) AccessChain 24(data) 25 524 25
-             526:   13(ivec4) Load 525
-             527:   51(ivec2) VectorShuffle 526 526 0 1
-             528:   51(ivec2) GroupNonUniformQuadBroadcast 35 527 35
-             529:     32(ptr) AccessChain 24(data) 25 522 25
-             530:   13(ivec4) Load 529
-             531:   13(ivec4) VectorShuffle 530 528 4 5 2 3
-                              Store 529 531
-             532:     27(ptr) AccessChain 10(dti) 26
-             533:      6(int) Load 532
-             534:     27(ptr) AccessChain 10(dti) 26
-             535:      6(int) Load 534
-             536:     32(ptr) AccessChain 24(data) 25 535 25
-             537:   13(ivec4) Load 536
-             538:    7(ivec3) VectorShuffle 537 537 0 1 2
-             539:    7(ivec3) GroupNonUniformQuadBroadcast 35 538 35
-             540:     32(ptr) AccessChain 24(data) 25 533 25
-             541:   13(ivec4) Load 540
-             542:   13(ivec4) VectorShuffle 541 539 4 5 6 3
-                              Store 540 542
-             543:     27(ptr) AccessChain 10(dti) 26
-             544:      6(int) Load 543
-             545:     27(ptr) AccessChain 10(dti) 26
-             546:      6(int) Load 545
-             547:     75(ptr) AccessChain 24(data) 25 546 72
-             548:   15(ivec4) Load 547
-             549:   15(ivec4) GroupNonUniformQuadBroadcast 35 548 35
-             550:     75(ptr) AccessChain 24(data) 25 544 72
-                              Store 550 549
-             551:     27(ptr) AccessChain 10(dti) 26
-             552:      6(int) Load 551
+             523:    184(ptr) AccessChain 24(data) 25 522 172 26
+             524:18(float64_t) Load 523
+             525:18(float64_t) GroupNonUniformQuadBroadcast 35 524 73
+             526:    184(ptr) AccessChain 24(data) 25 520 172 26
+                              Store 526 525
+             527:     27(ptr) AccessChain 10(dti) 26
+             528:      6(int) Load 527
+             529:     27(ptr) AccessChain 10(dti) 26
+             530:      6(int) Load 529
+             531:    175(ptr) AccessChain 24(data) 25 530 172
+             532: 19(f64vec4) Load 531
+             533:193(f64vec2) VectorShuffle 532 532 0 1
+             534:193(f64vec2) GroupNonUniformQuadBroadcast 35 533 73
+             535:    184(ptr) AccessChain 24(data) 25 528 172 26
+             536:18(float64_t) CompositeExtract 534 0
+                              Store 535 536
+             537:    184(ptr) AccessChain 24(data) 25 528 172 58
+             538:18(float64_t) CompositeExtract 534 1
+                              Store 537 538
+             539:     27(ptr) AccessChain 10(dti) 26
+             540:      6(int) Load 539
+             541:     27(ptr) AccessChain 10(dti) 26
+             542:      6(int) Load 541
+             543:    175(ptr) AccessChain 24(data) 25 542 172
+             544: 19(f64vec4) Load 543
+             545:206(f64vec3) VectorShuffle 544 544 0 1 2
+             546:206(f64vec3) GroupNonUniformQuadBroadcast 35 545 73
+             547:    184(ptr) AccessChain 24(data) 25 540 172 26
+             548:18(float64_t) CompositeExtract 546 0
+                              Store 547 548
+             549:    184(ptr) AccessChain 24(data) 25 540 172 58
+             550:18(float64_t) CompositeExtract 546 1
+                              Store 549 550
+             551:    184(ptr) AccessChain 24(data) 25 540 172 73
+             552:18(float64_t) CompositeExtract 546 2
+                              Store 551 552
              553:     27(ptr) AccessChain 10(dti) 26
              554:      6(int) Load 553
-             555:     84(ptr) AccessChain 24(data) 25 554 72 26
-             556:     14(int) Load 555
-             557:     14(int) GroupNonUniformQuadBroadcast 35 556 35
-             558:     84(ptr) AccessChain 24(data) 25 552 72 26
-                              Store 558 557
-             559:     27(ptr) AccessChain 10(dti) 26
-             560:      6(int) Load 559
+             555:     27(ptr) AccessChain 10(dti) 26
+             556:      6(int) Load 555
+             557:     32(ptr) AccessChain 24(data) 25 556 25
+             558:   13(ivec4) Load 557
+             559:   13(ivec4) GroupNonUniformQuadBroadcast 35 558 35
+             560:     32(ptr) AccessChain 24(data) 25 554 25
+                              Store 560 559
              561:     27(ptr) AccessChain 10(dti) 26
              562:      6(int) Load 561
-             563:     75(ptr) AccessChain 24(data) 25 562 72
-             564:   15(ivec4) Load 563
-             565:   93(ivec2) VectorShuffle 564 564 0 1
-             566:   93(ivec2) GroupNonUniformQuadBroadcast 35 565 35
-             567:     75(ptr) AccessChain 24(data) 25 560 72
-             568:   15(ivec4) Load 567
-             569:   15(ivec4) VectorShuffle 568 566 4 5 2 3
-                              Store 567 569
-             570:     27(ptr) AccessChain 10(dti) 26
-             571:      6(int) Load 570
-             572:     27(ptr) AccessChain 10(dti) 26
-             573:      6(int) Load 572
-             574:     75(ptr) AccessChain 24(data) 25 573 72
-             575:   15(ivec4) Load 574
-             576:  105(ivec3) VectorShuffle 575 575 0 1 2
-             577:  105(ivec3) GroupNonUniformQuadBroadcast 35 576 35
-             578:     75(ptr) AccessChain 24(data) 25 571 72
-             579:   15(ivec4) Load 578
-             580:   15(ivec4) VectorShuffle 579 577 4 5 6 3
-                              Store 578 580
+             563:     27(ptr) AccessChain 10(dti) 26
+             564:      6(int) Load 563
+             565:     42(ptr) AccessChain 24(data) 25 564 25 26
+             566:      6(int) Load 565
+             567:      6(int) GroupNonUniformQuadBroadcast 35 566 35
+             568:     42(ptr) AccessChain 24(data) 25 562 25 26
+                              Store 568 567
+             569:     27(ptr) AccessChain 10(dti) 26
+             570:      6(int) Load 569
+             571:     27(ptr) AccessChain 10(dti) 26
+             572:      6(int) Load 571
+             573:     32(ptr) AccessChain 24(data) 25 572 25
+             574:   13(ivec4) Load 573
+             575:   51(ivec2) VectorShuffle 574 574 0 1
+             576:   51(ivec2) GroupNonUniformQuadBroadcast 35 575 35
+             577:     42(ptr) AccessChain 24(data) 25 570 25 26
+             578:      6(int) CompositeExtract 576 0
+                              Store 577 578
+             579:     42(ptr) AccessChain 24(data) 25 570 25 58
+             580:      6(int) CompositeExtract 576 1
+                              Store 579 580
              581:     27(ptr) AccessChain 10(dti) 26
              582:      6(int) Load 581
              583:     27(ptr) AccessChain 10(dti) 26
              584:      6(int) Load 583
-             585:    118(ptr) AccessChain 24(data) 25 584 115
-             586:   17(fvec4) Load 585
-             587:   17(fvec4) GroupNonUniformQuadBroadcast 35 586 35
-             588:    118(ptr) AccessChain 24(data) 25 582 115
-                              Store 588 587
-             589:     27(ptr) AccessChain 10(dti) 26
-             590:      6(int) Load 589
-             591:     27(ptr) AccessChain 10(dti) 26
-             592:      6(int) Load 591
-             593:    127(ptr) AccessChain 24(data) 25 592 115 26
-             594:   16(float) Load 593
-             595:   16(float) GroupNonUniformQuadBroadcast 35 594 35
-             596:    127(ptr) AccessChain 24(data) 25 590 115 26
-                              Store 596 595
+             585:     32(ptr) AccessChain 24(data) 25 584 25
+             586:   13(ivec4) Load 585
+             587:    7(ivec3) VectorShuffle 586 586 0 1 2
+             588:    7(ivec3) GroupNonUniformQuadBroadcast 35 587 35
+             589:     42(ptr) AccessChain 24(data) 25 582 25 26
+             590:      6(int) CompositeExtract 588 0
+                              Store 589 590
+             591:     42(ptr) AccessChain 24(data) 25 582 25 58
+             592:      6(int) CompositeExtract 588 1
+                              Store 591 592
+             593:     42(ptr) AccessChain 24(data) 25 582 25 73
+             594:      6(int) CompositeExtract 588 2
+                              Store 593 594
+             595:     27(ptr) AccessChain 10(dti) 26
+             596:      6(int) Load 595
              597:     27(ptr) AccessChain 10(dti) 26
              598:      6(int) Load 597
-             599:     27(ptr) AccessChain 10(dti) 26
-             600:      6(int) Load 599
-             601:    118(ptr) AccessChain 24(data) 25 600 115
-             602:   17(fvec4) Load 601
-             603:  136(fvec2) VectorShuffle 602 602 0 1
-             604:  136(fvec2) GroupNonUniformQuadBroadcast 35 603 35
-             605:    118(ptr) AccessChain 24(data) 25 598 115
-             606:   17(fvec4) Load 605
-             607:   17(fvec4) VectorShuffle 606 604 4 5 2 3
-                              Store 605 607
-             608:     27(ptr) AccessChain 10(dti) 26
-             609:      6(int) Load 608
-             610:     27(ptr) AccessChain 10(dti) 26
-             611:      6(int) Load 610
-             612:    118(ptr) AccessChain 24(data) 25 611 115
-             613:   17(fvec4) Load 612
-             614:  148(fvec3) VectorShuffle 613 613 0 1 2
-             615:  148(fvec3) GroupNonUniformQuadBroadcast 35 614 35
-             616:    118(ptr) AccessChain 24(data) 25 609 115
-             617:   17(fvec4) Load 616
-             618:   17(fvec4) VectorShuffle 617 615 4 5 6 3
-                              Store 616 618
-             619:     27(ptr) AccessChain 10(dti) 26
-             620:      6(int) Load 619
-             621:     27(ptr) AccessChain 10(dti) 26
-             622:      6(int) Load 621
-             623:    161(ptr) AccessChain 24(data) 25 622 158
-             624: 19(f64vec4) Load 623
-             625: 19(f64vec4) GroupNonUniformQuadBroadcast 35 624 35
-             626:    161(ptr) AccessChain 24(data) 25 620 158
-                              Store 626 625
-             627:     27(ptr) AccessChain 10(dti) 26
-             628:      6(int) Load 627
-             629:     27(ptr) AccessChain 10(dti) 26
-             630:      6(int) Load 629
-             631:    170(ptr) AccessChain 24(data) 25 630 158 26
-             632:18(float64_t) Load 631
-             633:18(float64_t) GroupNonUniformQuadBroadcast 35 632 35
-             634:    170(ptr) AccessChain 24(data) 25 628 158 26
-                              Store 634 633
-             635:     27(ptr) AccessChain 10(dti) 26
-             636:      6(int) Load 635
+             599:     81(ptr) AccessChain 24(data) 25 598 78
+             600:   15(ivec4) Load 599
+             601:   15(ivec4) GroupNonUniformQuadBroadcast 35 600 35
+             602:     81(ptr) AccessChain 24(data) 25 596 78
+                              Store 602 601
+             603:     27(ptr) AccessChain 10(dti) 26
+             604:      6(int) Load 603
+             605:     27(ptr) AccessChain 10(dti) 26
+             606:      6(int) Load 605
+             607:     90(ptr) AccessChain 24(data) 25 606 78 26
+             608:     14(int) Load 607
+             609:     14(int) GroupNonUniformQuadBroadcast 35 608 35
+             610:     90(ptr) AccessChain 24(data) 25 604 78 26
+                              Store 610 609
+             611:     27(ptr) AccessChain 10(dti) 26
+             612:      6(int) Load 611
+             613:     27(ptr) AccessChain 10(dti) 26
+             614:      6(int) Load 613
+             615:     81(ptr) AccessChain 24(data) 25 614 78
+             616:   15(ivec4) Load 615
+             617:   99(ivec2) VectorShuffle 616 616 0 1
+             618:   99(ivec2) GroupNonUniformQuadBroadcast 35 617 35
+             619:     90(ptr) AccessChain 24(data) 25 612 78 26
+             620:     14(int) CompositeExtract 618 0
+                              Store 619 620
+             621:     90(ptr) AccessChain 24(data) 25 612 78 58
+             622:     14(int) CompositeExtract 618 1
+                              Store 621 622
+             623:     27(ptr) AccessChain 10(dti) 26
+             624:      6(int) Load 623
+             625:     27(ptr) AccessChain 10(dti) 26
+             626:      6(int) Load 625
+             627:     81(ptr) AccessChain 24(data) 25 626 78
+             628:   15(ivec4) Load 627
+             629:  112(ivec3) VectorShuffle 628 628 0 1 2
+             630:  112(ivec3) GroupNonUniformQuadBroadcast 35 629 35
+             631:     90(ptr) AccessChain 24(data) 25 624 78 26
+             632:     14(int) CompositeExtract 630 0
+                              Store 631 632
+             633:     90(ptr) AccessChain 24(data) 25 624 78 58
+             634:     14(int) CompositeExtract 630 1
+                              Store 633 634
+             635:     90(ptr) AccessChain 24(data) 25 624 78 73
+             636:     14(int) CompositeExtract 630 2
+                              Store 635 636
              637:     27(ptr) AccessChain 10(dti) 26
              638:      6(int) Load 637
-             639:    161(ptr) AccessChain 24(data) 25 638 158
-             640: 19(f64vec4) Load 639
-             641:179(f64vec2) VectorShuffle 640 640 0 1
-             642:179(f64vec2) GroupNonUniformQuadBroadcast 35 641 35
-             643:    161(ptr) AccessChain 24(data) 25 636 158
-             644: 19(f64vec4) Load 643
-             645: 19(f64vec4) VectorShuffle 644 642 4 5 2 3
-                              Store 643 645
-             646:     27(ptr) AccessChain 10(dti) 26
-             647:      6(int) Load 646
-             648:     27(ptr) AccessChain 10(dti) 26
-             649:      6(int) Load 648
-             650:    161(ptr) AccessChain 24(data) 25 649 158
-             651: 19(f64vec4) Load 650
-             652:191(f64vec3) VectorShuffle 651 651 0 1 2
-             653:191(f64vec3) GroupNonUniformQuadBroadcast 35 652 35
-             654:    161(ptr) AccessChain 24(data) 25 647 158
-             655: 19(f64vec4) Load 654
-             656: 19(f64vec4) VectorShuffle 655 653 4 5 6 3
-                              Store 654 656
-             657:     27(ptr) AccessChain 10(dti) 26
-             658:      6(int) Load 657
-             659:     27(ptr) AccessChain 10(dti) 26
-             660:      6(int) Load 659
-             661:     32(ptr) AccessChain 24(data) 25 660 25
-             662:   13(ivec4) Load 661
-             663:   13(ivec4) GroupNonUniformQuadSwap 35 662 26
-             664:     32(ptr) AccessChain 24(data) 25 658 25
-                              Store 664 663
+             639:     27(ptr) AccessChain 10(dti) 26
+             640:      6(int) Load 639
+             641:    128(ptr) AccessChain 24(data) 25 640 125
+             642:   17(fvec4) Load 641
+             643:   17(fvec4) GroupNonUniformQuadBroadcast 35 642 35
+             644:    128(ptr) AccessChain 24(data) 25 638 125
+                              Store 644 643
+             645:     27(ptr) AccessChain 10(dti) 26
+             646:      6(int) Load 645
+             647:     27(ptr) AccessChain 10(dti) 26
+             648:      6(int) Load 647
+             649:    137(ptr) AccessChain 24(data) 25 648 125 26
+             650:   16(float) Load 649
+             651:   16(float) GroupNonUniformQuadBroadcast 35 650 35
+             652:    137(ptr) AccessChain 24(data) 25 646 125 26
+                              Store 652 651
+             653:     27(ptr) AccessChain 10(dti) 26
+             654:      6(int) Load 653
+             655:     27(ptr) AccessChain 10(dti) 26
+             656:      6(int) Load 655
+             657:    128(ptr) AccessChain 24(data) 25 656 125
+             658:   17(fvec4) Load 657
+             659:  146(fvec2) VectorShuffle 658 658 0 1
+             660:  146(fvec2) GroupNonUniformQuadBroadcast 35 659 35
+             661:    137(ptr) AccessChain 24(data) 25 654 125 26
+             662:   16(float) CompositeExtract 660 0
+                              Store 661 662
+             663:    137(ptr) AccessChain 24(data) 25 654 125 58
+             664:   16(float) CompositeExtract 660 1
+                              Store 663 664
              665:     27(ptr) AccessChain 10(dti) 26
              666:      6(int) Load 665
              667:     27(ptr) AccessChain 10(dti) 26
              668:      6(int) Load 667
-             669:     42(ptr) AccessChain 24(data) 25 668 25 26
-             670:      6(int) Load 669
-             671:      6(int) GroupNonUniformQuadSwap 35 670 26
-             672:     42(ptr) AccessChain 24(data) 25 666 25 26
-                              Store 672 671
-             673:     27(ptr) AccessChain 10(dti) 26
-             674:      6(int) Load 673
-             675:     27(ptr) AccessChain 10(dti) 26
-             676:      6(int) Load 675
-             677:     32(ptr) AccessChain 24(data) 25 676 25
-             678:   13(ivec4) Load 677
-             679:   51(ivec2) VectorShuffle 678 678 0 1
-             680:   51(ivec2) GroupNonUniformQuadSwap 35 679 26
-             681:     32(ptr) AccessChain 24(data) 25 674 25
-             682:   13(ivec4) Load 681
-             683:   13(ivec4) VectorShuffle 682 680 4 5 2 3
-                              Store 681 683
-             684:     27(ptr) AccessChain 10(dti) 26
-             685:      6(int) Load 684
-             686:     27(ptr) AccessChain 10(dti) 26
-             687:      6(int) Load 686
-             688:     32(ptr) AccessChain 24(data) 25 687 25
-             689:   13(ivec4) Load 688
-             690:    7(ivec3) VectorShuffle 689 689 0 1 2
-             691:    7(ivec3) GroupNonUniformQuadSwap 35 690 26
-             692:     32(ptr) AccessChain 24(data) 25 685 25
-             693:   13(ivec4) Load 692
-             694:   13(ivec4) VectorShuffle 693 691 4 5 6 3
-                              Store 692 694
+             669:    128(ptr) AccessChain 24(data) 25 668 125
+             670:   17(fvec4) Load 669
+             671:  159(fvec3) VectorShuffle 670 670 0 1 2
+             672:  159(fvec3) GroupNonUniformQuadBroadcast 35 671 35
+             673:    137(ptr) AccessChain 24(data) 25 666 125 26
+             674:   16(float) CompositeExtract 672 0
+                              Store 673 674
+             675:    137(ptr) AccessChain 24(data) 25 666 125 58
+             676:   16(float) CompositeExtract 672 1
+                              Store 675 676
+             677:    137(ptr) AccessChain 24(data) 25 666 125 73
+             678:   16(float) CompositeExtract 672 2
+                              Store 677 678
+             679:     27(ptr) AccessChain 10(dti) 26
+             680:      6(int) Load 679
+             681:     27(ptr) AccessChain 10(dti) 26
+             682:      6(int) Load 681
+             683:    175(ptr) AccessChain 24(data) 25 682 172
+             684: 19(f64vec4) Load 683
+             685: 19(f64vec4) GroupNonUniformQuadBroadcast 35 684 35
+             686:    175(ptr) AccessChain 24(data) 25 680 172
+                              Store 686 685
+             687:     27(ptr) AccessChain 10(dti) 26
+             688:      6(int) Load 687
+             689:     27(ptr) AccessChain 10(dti) 26
+             690:      6(int) Load 689
+             691:    184(ptr) AccessChain 24(data) 25 690 172 26
+             692:18(float64_t) Load 691
+             693:18(float64_t) GroupNonUniformQuadBroadcast 35 692 35
+             694:    184(ptr) AccessChain 24(data) 25 688 172 26
+                              Store 694 693
              695:     27(ptr) AccessChain 10(dti) 26
              696:      6(int) Load 695
              697:     27(ptr) AccessChain 10(dti) 26
              698:      6(int) Load 697
-             699:     75(ptr) AccessChain 24(data) 25 698 72
-             700:   15(ivec4) Load 699
-             701:   15(ivec4) GroupNonUniformQuadSwap 35 700 26
-             702:     75(ptr) AccessChain 24(data) 25 696 72
-                              Store 702 701
-             703:     27(ptr) AccessChain 10(dti) 26
-             704:      6(int) Load 703
-             705:     27(ptr) AccessChain 10(dti) 26
-             706:      6(int) Load 705
-             707:     84(ptr) AccessChain 24(data) 25 706 72 26
-             708:     14(int) Load 707
-             709:     14(int) GroupNonUniformQuadSwap 35 708 26
-             710:     84(ptr) AccessChain 24(data) 25 704 72 26
-                              Store 710 709
-             711:     27(ptr) AccessChain 10(dti) 26
-             712:      6(int) Load 711
-             713:     27(ptr) AccessChain 10(dti) 26
-             714:      6(int) Load 713
-             715:     75(ptr) AccessChain 24(data) 25 714 72
-             716:   15(ivec4) Load 715
-             717:   93(ivec2) VectorShuffle 716 716 0 1
-             718:   93(ivec2) GroupNonUniformQuadSwap 35 717 26
-             719:     75(ptr) AccessChain 24(data) 25 712 72
-             720:   15(ivec4) Load 719
-             721:   15(ivec4) VectorShuffle 720 718 4 5 2 3
-                              Store 719 721
-             722:     27(ptr) AccessChain 10(dti) 26
-             723:      6(int) Load 722
-             724:     27(ptr) AccessChain 10(dti) 26
-             725:      6(int) Load 724
-             726:     75(ptr) AccessChain 24(data) 25 725 72
-             727:   15(ivec4) Load 726
-             728:  105(ivec3) VectorShuffle 727 727 0 1 2
-             729:  105(ivec3) GroupNonUniformQuadSwap 35 728 26
-             730:     75(ptr) AccessChain 24(data) 25 723 72
-             731:   15(ivec4) Load 730
-             732:   15(ivec4) VectorShuffle 731 729 4 5 6 3
-                              Store 730 732
-             733:     27(ptr) AccessChain 10(dti) 26
+             699:    175(ptr) AccessChain 24(data) 25 698 172
+             700: 19(f64vec4) Load 699
+             701:193(f64vec2) VectorShuffle 700 700 0 1
+             702:193(f64vec2) GroupNonUniformQuadBroadcast 35 701 35
+             703:    184(ptr) AccessChain 24(data) 25 696 172 26
+             704:18(float64_t) CompositeExtract 702 0
+                              Store 703 704
+             705:    184(ptr) AccessChain 24(data) 25 696 172 58
+             706:18(float64_t) CompositeExtract 702 1
+                              Store 705 706
+             707:     27(ptr) AccessChain 10(dti) 26
+             708:      6(int) Load 707
+             709:     27(ptr) AccessChain 10(dti) 26
+             710:      6(int) Load 709
+             711:    175(ptr) AccessChain 24(data) 25 710 172
+             712: 19(f64vec4) Load 711
+             713:206(f64vec3) VectorShuffle 712 712 0 1 2
+             714:206(f64vec3) GroupNonUniformQuadBroadcast 35 713 35
+             715:    184(ptr) AccessChain 24(data) 25 708 172 26
+             716:18(float64_t) CompositeExtract 714 0
+                              Store 715 716
+             717:    184(ptr) AccessChain 24(data) 25 708 172 58
+             718:18(float64_t) CompositeExtract 714 1
+                              Store 717 718
+             719:    184(ptr) AccessChain 24(data) 25 708 172 73
+             720:18(float64_t) CompositeExtract 714 2
+                              Store 719 720
+             721:     27(ptr) AccessChain 10(dti) 26
+             722:      6(int) Load 721
+             723:     27(ptr) AccessChain 10(dti) 26
+             724:      6(int) Load 723
+             725:     32(ptr) AccessChain 24(data) 25 724 25
+             726:   13(ivec4) Load 725
+             727:   13(ivec4) GroupNonUniformQuadSwap 35 726 26
+             728:     32(ptr) AccessChain 24(data) 25 722 25
+                              Store 728 727
+             729:     27(ptr) AccessChain 10(dti) 26
+             730:      6(int) Load 729
+             731:     27(ptr) AccessChain 10(dti) 26
+             732:      6(int) Load 731
+             733:     42(ptr) AccessChain 24(data) 25 732 25 26
              734:      6(int) Load 733
-             735:     27(ptr) AccessChain 10(dti) 26
-             736:      6(int) Load 735
-             737:    118(ptr) AccessChain 24(data) 25 736 115
-             738:   17(fvec4) Load 737
-             739:   17(fvec4) GroupNonUniformQuadSwap 35 738 26
-             740:    118(ptr) AccessChain 24(data) 25 734 115
-                              Store 740 739
-             741:     27(ptr) AccessChain 10(dti) 26
-             742:      6(int) Load 741
-             743:     27(ptr) AccessChain 10(dti) 26
-             744:      6(int) Load 743
-             745:    127(ptr) AccessChain 24(data) 25 744 115 26
-             746:   16(float) Load 745
-             747:   16(float) GroupNonUniformQuadSwap 35 746 26
-             748:    127(ptr) AccessChain 24(data) 25 742 115 26
-                              Store 748 747
+             735:      6(int) GroupNonUniformQuadSwap 35 734 26
+             736:     42(ptr) AccessChain 24(data) 25 730 25 26
+                              Store 736 735
+             737:     27(ptr) AccessChain 10(dti) 26
+             738:      6(int) Load 737
+             739:     27(ptr) AccessChain 10(dti) 26
+             740:      6(int) Load 739
+             741:     32(ptr) AccessChain 24(data) 25 740 25
+             742:   13(ivec4) Load 741
+             743:   51(ivec2) VectorShuffle 742 742 0 1
+             744:   51(ivec2) GroupNonUniformQuadSwap 35 743 26
+             745:     42(ptr) AccessChain 24(data) 25 738 25 26
+             746:      6(int) CompositeExtract 744 0
+                              Store 745 746
+             747:     42(ptr) AccessChain 24(data) 25 738 25 58
+             748:      6(int) CompositeExtract 744 1
+                              Store 747 748
              749:     27(ptr) AccessChain 10(dti) 26
              750:      6(int) Load 749
              751:     27(ptr) AccessChain 10(dti) 26
              752:      6(int) Load 751
-             753:    118(ptr) AccessChain 24(data) 25 752 115
-             754:   17(fvec4) Load 753
-             755:  136(fvec2) VectorShuffle 754 754 0 1
-             756:  136(fvec2) GroupNonUniformQuadSwap 35 755 26
-             757:    118(ptr) AccessChain 24(data) 25 750 115
-             758:   17(fvec4) Load 757
-             759:   17(fvec4) VectorShuffle 758 756 4 5 2 3
-                              Store 757 759
-             760:     27(ptr) AccessChain 10(dti) 26
-             761:      6(int) Load 760
-             762:     27(ptr) AccessChain 10(dti) 26
-             763:      6(int) Load 762
-             764:    118(ptr) AccessChain 24(data) 25 763 115
-             765:   17(fvec4) Load 764
-             766:  148(fvec3) VectorShuffle 765 765 0 1 2
-             767:  148(fvec3) GroupNonUniformQuadSwap 35 766 26
-             768:    118(ptr) AccessChain 24(data) 25 761 115
-             769:   17(fvec4) Load 768
-             770:   17(fvec4) VectorShuffle 769 767 4 5 6 3
-                              Store 768 770
+             753:     32(ptr) AccessChain 24(data) 25 752 25
+             754:   13(ivec4) Load 753
+             755:    7(ivec3) VectorShuffle 754 754 0 1 2
+             756:    7(ivec3) GroupNonUniformQuadSwap 35 755 26
+             757:     42(ptr) AccessChain 24(data) 25 750 25 26
+             758:      6(int) CompositeExtract 756 0
+                              Store 757 758
+             759:     42(ptr) AccessChain 24(data) 25 750 25 58
+             760:      6(int) CompositeExtract 756 1
+                              Store 759 760
+             761:     42(ptr) AccessChain 24(data) 25 750 25 73
+             762:      6(int) CompositeExtract 756 2
+                              Store 761 762
+             763:     27(ptr) AccessChain 10(dti) 26
+             764:      6(int) Load 763
+             765:     27(ptr) AccessChain 10(dti) 26
+             766:      6(int) Load 765
+             767:     81(ptr) AccessChain 24(data) 25 766 78
+             768:   15(ivec4) Load 767
+             769:   15(ivec4) GroupNonUniformQuadSwap 35 768 26
+             770:     81(ptr) AccessChain 24(data) 25 764 78
+                              Store 770 769
              771:     27(ptr) AccessChain 10(dti) 26
              772:      6(int) Load 771
              773:     27(ptr) AccessChain 10(dti) 26
              774:      6(int) Load 773
-             775:    161(ptr) AccessChain 24(data) 25 774 158
-             776: 19(f64vec4) Load 775
-             777: 19(f64vec4) GroupNonUniformQuadSwap 35 776 26
-             778:    161(ptr) AccessChain 24(data) 25 772 158
+             775:     90(ptr) AccessChain 24(data) 25 774 78 26
+             776:     14(int) Load 775
+             777:     14(int) GroupNonUniformQuadSwap 35 776 26
+             778:     90(ptr) AccessChain 24(data) 25 772 78 26
                               Store 778 777
              779:     27(ptr) AccessChain 10(dti) 26
              780:      6(int) Load 779
              781:     27(ptr) AccessChain 10(dti) 26
              782:      6(int) Load 781
-             783:    170(ptr) AccessChain 24(data) 25 782 158 26
-             784:18(float64_t) Load 783
-             785:18(float64_t) GroupNonUniformQuadSwap 35 784 26
-             786:    170(ptr) AccessChain 24(data) 25 780 158 26
-                              Store 786 785
-             787:     27(ptr) AccessChain 10(dti) 26
-             788:      6(int) Load 787
-             789:     27(ptr) AccessChain 10(dti) 26
-             790:      6(int) Load 789
-             791:    161(ptr) AccessChain 24(data) 25 790 158
-             792: 19(f64vec4) Load 791
-             793:179(f64vec2) VectorShuffle 792 792 0 1
-             794:179(f64vec2) GroupNonUniformQuadSwap 35 793 26
-             795:    161(ptr) AccessChain 24(data) 25 788 158
-             796: 19(f64vec4) Load 795
-             797: 19(f64vec4) VectorShuffle 796 794 4 5 2 3
-                              Store 795 797
-             798:     27(ptr) AccessChain 10(dti) 26
-             799:      6(int) Load 798
-             800:     27(ptr) AccessChain 10(dti) 26
-             801:      6(int) Load 800
-             802:    161(ptr) AccessChain 24(data) 25 801 158
-             803: 19(f64vec4) Load 802
-             804:191(f64vec3) VectorShuffle 803 803 0 1 2
-             805:191(f64vec3) GroupNonUniformQuadSwap 35 804 26
-             806:    161(ptr) AccessChain 24(data) 25 799 158
-             807: 19(f64vec4) Load 806
-             808: 19(f64vec4) VectorShuffle 807 805 4 5 6 3
-                              Store 806 808
-             809:     27(ptr) AccessChain 10(dti) 26
-             810:      6(int) Load 809
-             811:     27(ptr) AccessChain 10(dti) 26
-             812:      6(int) Load 811
-             813:     32(ptr) AccessChain 24(data) 25 812 25
-             814:   13(ivec4) Load 813
-             815:   13(ivec4) GroupNonUniformQuadSwap 35 814 205
-             816:     32(ptr) AccessChain 24(data) 25 810 25
-                              Store 816 815
-             817:     27(ptr) AccessChain 10(dti) 26
-             818:      6(int) Load 817
-             819:     27(ptr) AccessChain 10(dti) 26
-             820:      6(int) Load 819
-             821:     42(ptr) AccessChain 24(data) 25 820 25 26
+             783:     81(ptr) AccessChain 24(data) 25 782 78
+             784:   15(ivec4) Load 783
+             785:   99(ivec2) VectorShuffle 784 784 0 1
+             786:   99(ivec2) GroupNonUniformQuadSwap 35 785 26
+             787:     90(ptr) AccessChain 24(data) 25 780 78 26
+             788:     14(int) CompositeExtract 786 0
+                              Store 787 788
+             789:     90(ptr) AccessChain 24(data) 25 780 78 58
+             790:     14(int) CompositeExtract 786 1
+                              Store 789 790
+             791:     27(ptr) AccessChain 10(dti) 26
+             792:      6(int) Load 791
+             793:     27(ptr) AccessChain 10(dti) 26
+             794:      6(int) Load 793
+             795:     81(ptr) AccessChain 24(data) 25 794 78
+             796:   15(ivec4) Load 795
+             797:  112(ivec3) VectorShuffle 796 796 0 1 2
+             798:  112(ivec3) GroupNonUniformQuadSwap 35 797 26
+             799:     90(ptr) AccessChain 24(data) 25 792 78 26
+             800:     14(int) CompositeExtract 798 0
+                              Store 799 800
+             801:     90(ptr) AccessChain 24(data) 25 792 78 58
+             802:     14(int) CompositeExtract 798 1
+                              Store 801 802
+             803:     90(ptr) AccessChain 24(data) 25 792 78 73
+             804:     14(int) CompositeExtract 798 2
+                              Store 803 804
+             805:     27(ptr) AccessChain 10(dti) 26
+             806:      6(int) Load 805
+             807:     27(ptr) AccessChain 10(dti) 26
+             808:      6(int) Load 807
+             809:    128(ptr) AccessChain 24(data) 25 808 125
+             810:   17(fvec4) Load 809
+             811:   17(fvec4) GroupNonUniformQuadSwap 35 810 26
+             812:    128(ptr) AccessChain 24(data) 25 806 125
+                              Store 812 811
+             813:     27(ptr) AccessChain 10(dti) 26
+             814:      6(int) Load 813
+             815:     27(ptr) AccessChain 10(dti) 26
+             816:      6(int) Load 815
+             817:    137(ptr) AccessChain 24(data) 25 816 125 26
+             818:   16(float) Load 817
+             819:   16(float) GroupNonUniformQuadSwap 35 818 26
+             820:    137(ptr) AccessChain 24(data) 25 814 125 26
+                              Store 820 819
+             821:     27(ptr) AccessChain 10(dti) 26
              822:      6(int) Load 821
-             823:      6(int) GroupNonUniformQuadSwap 35 822 205
-             824:     42(ptr) AccessChain 24(data) 25 818 25 26
-                              Store 824 823
-             825:     27(ptr) AccessChain 10(dti) 26
-             826:      6(int) Load 825
-             827:     27(ptr) AccessChain 10(dti) 26
-             828:      6(int) Load 827
-             829:     32(ptr) AccessChain 24(data) 25 828 25
-             830:   13(ivec4) Load 829
-             831:   51(ivec2) VectorShuffle 830 830 0 1
-             832:   51(ivec2) GroupNonUniformQuadSwap 35 831 205
-             833:     32(ptr) AccessChain 24(data) 25 826 25
-             834:   13(ivec4) Load 833
-             835:   13(ivec4) VectorShuffle 834 832 4 5 2 3
-                              Store 833 835
-             836:     27(ptr) AccessChain 10(dti) 26
-             837:      6(int) Load 836
-             838:     27(ptr) AccessChain 10(dti) 26
-             839:      6(int) Load 838
-             840:     32(ptr) AccessChain 24(data) 25 839 25
-             841:   13(ivec4) Load 840
-             842:    7(ivec3) VectorShuffle 841 841 0 1 2
-             843:    7(ivec3) GroupNonUniformQuadSwap 35 842 205
-             844:     32(ptr) AccessChain 24(data) 25 837 25
-             845:   13(ivec4) Load 844
-             846:   13(ivec4) VectorShuffle 845 843 4 5 6 3
-                              Store 844 846
+             823:     27(ptr) AccessChain 10(dti) 26
+             824:      6(int) Load 823
+             825:    128(ptr) AccessChain 24(data) 25 824 125
+             826:   17(fvec4) Load 825
+             827:  146(fvec2) VectorShuffle 826 826 0 1
+             828:  146(fvec2) GroupNonUniformQuadSwap 35 827 26
+             829:    137(ptr) AccessChain 24(data) 25 822 125 26
+             830:   16(float) CompositeExtract 828 0
+                              Store 829 830
+             831:    137(ptr) AccessChain 24(data) 25 822 125 58
+             832:   16(float) CompositeExtract 828 1
+                              Store 831 832
+             833:     27(ptr) AccessChain 10(dti) 26
+             834:      6(int) Load 833
+             835:     27(ptr) AccessChain 10(dti) 26
+             836:      6(int) Load 835
+             837:    128(ptr) AccessChain 24(data) 25 836 125
+             838:   17(fvec4) Load 837
+             839:  159(fvec3) VectorShuffle 838 838 0 1 2
+             840:  159(fvec3) GroupNonUniformQuadSwap 35 839 26
+             841:    137(ptr) AccessChain 24(data) 25 834 125 26
+             842:   16(float) CompositeExtract 840 0
+                              Store 841 842
+             843:    137(ptr) AccessChain 24(data) 25 834 125 58
+             844:   16(float) CompositeExtract 840 1
+                              Store 843 844
+             845:    137(ptr) AccessChain 24(data) 25 834 125 73
+             846:   16(float) CompositeExtract 840 2
+                              Store 845 846
              847:     27(ptr) AccessChain 10(dti) 26
              848:      6(int) Load 847
              849:     27(ptr) AccessChain 10(dti) 26
              850:      6(int) Load 849
-             851:     75(ptr) AccessChain 24(data) 25 850 72
-             852:   15(ivec4) Load 851
-             853:   15(ivec4) GroupNonUniformQuadSwap 35 852 205
-             854:     75(ptr) AccessChain 24(data) 25 848 72
+             851:    175(ptr) AccessChain 24(data) 25 850 172
+             852: 19(f64vec4) Load 851
+             853: 19(f64vec4) GroupNonUniformQuadSwap 35 852 26
+             854:    175(ptr) AccessChain 24(data) 25 848 172
                               Store 854 853
              855:     27(ptr) AccessChain 10(dti) 26
              856:      6(int) Load 855
              857:     27(ptr) AccessChain 10(dti) 26
              858:      6(int) Load 857
-             859:     84(ptr) AccessChain 24(data) 25 858 72 26
-             860:     14(int) Load 859
-             861:     14(int) GroupNonUniformQuadSwap 35 860 205
-             862:     84(ptr) AccessChain 24(data) 25 856 72 26
+             859:    184(ptr) AccessChain 24(data) 25 858 172 26
+             860:18(float64_t) Load 859
+             861:18(float64_t) GroupNonUniformQuadSwap 35 860 26
+             862:    184(ptr) AccessChain 24(data) 25 856 172 26
                               Store 862 861
              863:     27(ptr) AccessChain 10(dti) 26
              864:      6(int) Load 863
              865:     27(ptr) AccessChain 10(dti) 26
              866:      6(int) Load 865
-             867:     75(ptr) AccessChain 24(data) 25 866 72
-             868:   15(ivec4) Load 867
-             869:   93(ivec2) VectorShuffle 868 868 0 1
-             870:   93(ivec2) GroupNonUniformQuadSwap 35 869 205
-             871:     75(ptr) AccessChain 24(data) 25 864 72
-             872:   15(ivec4) Load 871
-             873:   15(ivec4) VectorShuffle 872 870 4 5 2 3
-                              Store 871 873
-             874:     27(ptr) AccessChain 10(dti) 26
-             875:      6(int) Load 874
-             876:     27(ptr) AccessChain 10(dti) 26
-             877:      6(int) Load 876
-             878:     75(ptr) AccessChain 24(data) 25 877 72
-             879:   15(ivec4) Load 878
-             880:  105(ivec3) VectorShuffle 879 879 0 1 2
-             881:  105(ivec3) GroupNonUniformQuadSwap 35 880 205
-             882:     75(ptr) AccessChain 24(data) 25 875 72
-             883:   15(ivec4) Load 882
-             884:   15(ivec4) VectorShuffle 883 881 4 5 6 3
-                              Store 882 884
-             885:     27(ptr) AccessChain 10(dti) 26
-             886:      6(int) Load 885
-             887:     27(ptr) AccessChain 10(dti) 26
-             888:      6(int) Load 887
-             889:    118(ptr) AccessChain 24(data) 25 888 115
-             890:   17(fvec4) Load 889
-             891:   17(fvec4) GroupNonUniformQuadSwap 35 890 205
-             892:    118(ptr) AccessChain 24(data) 25 886 115
-                              Store 892 891
-             893:     27(ptr) AccessChain 10(dti) 26
-             894:      6(int) Load 893
-             895:     27(ptr) AccessChain 10(dti) 26
-             896:      6(int) Load 895
-             897:    127(ptr) AccessChain 24(data) 25 896 115 26
-             898:   16(float) Load 897
-             899:   16(float) GroupNonUniformQuadSwap 35 898 205
-             900:    127(ptr) AccessChain 24(data) 25 894 115 26
-                              Store 900 899
-             901:     27(ptr) AccessChain 10(dti) 26
+             867:    175(ptr) AccessChain 24(data) 25 866 172
+             868: 19(f64vec4) Load 867
+             869:193(f64vec2) VectorShuffle 868 868 0 1
+             870:193(f64vec2) GroupNonUniformQuadSwap 35 869 26
+             871:    184(ptr) AccessChain 24(data) 25 864 172 26
+             872:18(float64_t) CompositeExtract 870 0
+                              Store 871 872
+             873:    184(ptr) AccessChain 24(data) 25 864 172 58
+             874:18(float64_t) CompositeExtract 870 1
+                              Store 873 874
+             875:     27(ptr) AccessChain 10(dti) 26
+             876:      6(int) Load 875
+             877:     27(ptr) AccessChain 10(dti) 26
+             878:      6(int) Load 877
+             879:    175(ptr) AccessChain 24(data) 25 878 172
+             880: 19(f64vec4) Load 879
+             881:206(f64vec3) VectorShuffle 880 880 0 1 2
+             882:206(f64vec3) GroupNonUniformQuadSwap 35 881 26
+             883:    184(ptr) AccessChain 24(data) 25 876 172 26
+             884:18(float64_t) CompositeExtract 882 0
+                              Store 883 884
+             885:    184(ptr) AccessChain 24(data) 25 876 172 58
+             886:18(float64_t) CompositeExtract 882 1
+                              Store 885 886
+             887:    184(ptr) AccessChain 24(data) 25 876 172 73
+             888:18(float64_t) CompositeExtract 882 2
+                              Store 887 888
+             889:     27(ptr) AccessChain 10(dti) 26
+             890:      6(int) Load 889
+             891:     27(ptr) AccessChain 10(dti) 26
+             892:      6(int) Load 891
+             893:     32(ptr) AccessChain 24(data) 25 892 25
+             894:   13(ivec4) Load 893
+             895:   13(ivec4) GroupNonUniformQuadSwap 35 894 58
+             896:     32(ptr) AccessChain 24(data) 25 890 25
+                              Store 896 895
+             897:     27(ptr) AccessChain 10(dti) 26
+             898:      6(int) Load 897
+             899:     27(ptr) AccessChain 10(dti) 26
+             900:      6(int) Load 899
+             901:     42(ptr) AccessChain 24(data) 25 900 25 26
              902:      6(int) Load 901
-             903:     27(ptr) AccessChain 10(dti) 26
-             904:      6(int) Load 903
-             905:    118(ptr) AccessChain 24(data) 25 904 115
-             906:   17(fvec4) Load 905
-             907:  136(fvec2) VectorShuffle 906 906 0 1
-             908:  136(fvec2) GroupNonUniformQuadSwap 35 907 205
-             909:    118(ptr) AccessChain 24(data) 25 902 115
-             910:   17(fvec4) Load 909
-             911:   17(fvec4) VectorShuffle 910 908 4 5 2 3
-                              Store 909 911
-             912:     27(ptr) AccessChain 10(dti) 26
-             913:      6(int) Load 912
-             914:     27(ptr) AccessChain 10(dti) 26
-             915:      6(int) Load 914
-             916:    118(ptr) AccessChain 24(data) 25 915 115
-             917:   17(fvec4) Load 916
-             918:  148(fvec3) VectorShuffle 917 917 0 1 2
-             919:  148(fvec3) GroupNonUniformQuadSwap 35 918 205
-             920:    118(ptr) AccessChain 24(data) 25 913 115
-             921:   17(fvec4) Load 920
-             922:   17(fvec4) VectorShuffle 921 919 4 5 6 3
-                              Store 920 922
-             923:     27(ptr) AccessChain 10(dti) 26
-             924:      6(int) Load 923
-             925:     27(ptr) AccessChain 10(dti) 26
-             926:      6(int) Load 925
-             927:    161(ptr) AccessChain 24(data) 25 926 158
-             928: 19(f64vec4) Load 927
-             929: 19(f64vec4) GroupNonUniformQuadSwap 35 928 205
-             930:    161(ptr) AccessChain 24(data) 25 924 158
-                              Store 930 929
+             903:      6(int) GroupNonUniformQuadSwap 35 902 58
+             904:     42(ptr) AccessChain 24(data) 25 898 25 26
+                              Store 904 903
+             905:     27(ptr) AccessChain 10(dti) 26
+             906:      6(int) Load 905
+             907:     27(ptr) AccessChain 10(dti) 26
+             908:      6(int) Load 907
+             909:     32(ptr) AccessChain 24(data) 25 908 25
+             910:   13(ivec4) Load 909
+             911:   51(ivec2) VectorShuffle 910 910 0 1
+             912:   51(ivec2) GroupNonUniformQuadSwap 35 911 58
+             913:     42(ptr) AccessChain 24(data) 25 906 25 26
+             914:      6(int) CompositeExtract 912 0
+                              Store 913 914
+             915:     42(ptr) AccessChain 24(data) 25 906 25 58
+             916:      6(int) CompositeExtract 912 1
+                              Store 915 916
+             917:     27(ptr) AccessChain 10(dti) 26
+             918:      6(int) Load 917
+             919:     27(ptr) AccessChain 10(dti) 26
+             920:      6(int) Load 919
+             921:     32(ptr) AccessChain 24(data) 25 920 25
+             922:   13(ivec4) Load 921
+             923:    7(ivec3) VectorShuffle 922 922 0 1 2
+             924:    7(ivec3) GroupNonUniformQuadSwap 35 923 58
+             925:     42(ptr) AccessChain 24(data) 25 918 25 26
+             926:      6(int) CompositeExtract 924 0
+                              Store 925 926
+             927:     42(ptr) AccessChain 24(data) 25 918 25 58
+             928:      6(int) CompositeExtract 924 1
+                              Store 927 928
+             929:     42(ptr) AccessChain 24(data) 25 918 25 73
+             930:      6(int) CompositeExtract 924 2
+                              Store 929 930
              931:     27(ptr) AccessChain 10(dti) 26
              932:      6(int) Load 931
              933:     27(ptr) AccessChain 10(dti) 26
              934:      6(int) Load 933
-             935:    170(ptr) AccessChain 24(data) 25 934 158 26
-             936:18(float64_t) Load 935
-             937:18(float64_t) GroupNonUniformQuadSwap 35 936 205
-             938:    170(ptr) AccessChain 24(data) 25 932 158 26
+             935:     81(ptr) AccessChain 24(data) 25 934 78
+             936:   15(ivec4) Load 935
+             937:   15(ivec4) GroupNonUniformQuadSwap 35 936 58
+             938:     81(ptr) AccessChain 24(data) 25 932 78
                               Store 938 937
              939:     27(ptr) AccessChain 10(dti) 26
              940:      6(int) Load 939
              941:     27(ptr) AccessChain 10(dti) 26
              942:      6(int) Load 941
-             943:    161(ptr) AccessChain 24(data) 25 942 158
-             944: 19(f64vec4) Load 943
-             945:179(f64vec2) VectorShuffle 944 944 0 1
-             946:179(f64vec2) GroupNonUniformQuadSwap 35 945 205
-             947:    161(ptr) AccessChain 24(data) 25 940 158
-             948: 19(f64vec4) Load 947
-             949: 19(f64vec4) VectorShuffle 948 946 4 5 2 3
-                              Store 947 949
-             950:     27(ptr) AccessChain 10(dti) 26
-             951:      6(int) Load 950
-             952:     27(ptr) AccessChain 10(dti) 26
-             953:      6(int) Load 952
-             954:    161(ptr) AccessChain 24(data) 25 953 158
-             955: 19(f64vec4) Load 954
-             956:191(f64vec3) VectorShuffle 955 955 0 1 2
-             957:191(f64vec3) GroupNonUniformQuadSwap 35 956 205
-             958:    161(ptr) AccessChain 24(data) 25 951 158
-             959: 19(f64vec4) Load 958
-             960: 19(f64vec4) VectorShuffle 959 957 4 5 6 3
-                              Store 958 960
+             943:     90(ptr) AccessChain 24(data) 25 942 78 26
+             944:     14(int) Load 943
+             945:     14(int) GroupNonUniformQuadSwap 35 944 58
+             946:     90(ptr) AccessChain 24(data) 25 940 78 26
+                              Store 946 945
+             947:     27(ptr) AccessChain 10(dti) 26
+             948:      6(int) Load 947
+             949:     27(ptr) AccessChain 10(dti) 26
+             950:      6(int) Load 949
+             951:     81(ptr) AccessChain 24(data) 25 950 78
+             952:   15(ivec4) Load 951
+             953:   99(ivec2) VectorShuffle 952 952 0 1
+             954:   99(ivec2) GroupNonUniformQuadSwap 35 953 58
+             955:     90(ptr) AccessChain 24(data) 25 948 78 26
+             956:     14(int) CompositeExtract 954 0
+                              Store 955 956
+             957:     90(ptr) AccessChain 24(data) 25 948 78 58
+             958:     14(int) CompositeExtract 954 1
+                              Store 957 958
+             959:     27(ptr) AccessChain 10(dti) 26
+             960:      6(int) Load 959
              961:     27(ptr) AccessChain 10(dti) 26
              962:      6(int) Load 961
-             963:     27(ptr) AccessChain 10(dti) 26
-             964:      6(int) Load 963
-             965:     32(ptr) AccessChain 24(data) 25 964 25
-             966:   13(ivec4) Load 965
-             967:   13(ivec4) GroupNonUniformQuadSwap 35 966 358
-             968:     32(ptr) AccessChain 24(data) 25 962 25
-                              Store 968 967
-             969:     27(ptr) AccessChain 10(dti) 26
-             970:      6(int) Load 969
-             971:     27(ptr) AccessChain 10(dti) 26
-             972:      6(int) Load 971
-             973:     42(ptr) AccessChain 24(data) 25 972 25 26
+             963:     81(ptr) AccessChain 24(data) 25 962 78
+             964:   15(ivec4) Load 963
+             965:  112(ivec3) VectorShuffle 964 964 0 1 2
+             966:  112(ivec3) GroupNonUniformQuadSwap 35 965 58
+             967:     90(ptr) AccessChain 24(data) 25 960 78 26
+             968:     14(int) CompositeExtract 966 0
+                              Store 967 968
+             969:     90(ptr) AccessChain 24(data) 25 960 78 58
+             970:     14(int) CompositeExtract 966 1
+                              Store 969 970
+             971:     90(ptr) AccessChain 24(data) 25 960 78 73
+             972:     14(int) CompositeExtract 966 2
+                              Store 971 972
+             973:     27(ptr) AccessChain 10(dti) 26
              974:      6(int) Load 973
-             975:      6(int) GroupNonUniformQuadSwap 35 974 358
-             976:     42(ptr) AccessChain 24(data) 25 970 25 26
-                              Store 976 975
-             977:     27(ptr) AccessChain 10(dti) 26
-             978:      6(int) Load 977
-             979:     27(ptr) AccessChain 10(dti) 26
-             980:      6(int) Load 979
-             981:     32(ptr) AccessChain 24(data) 25 980 25
-             982:   13(ivec4) Load 981
-             983:   51(ivec2) VectorShuffle 982 982 0 1
-             984:   51(ivec2) GroupNonUniformQuadSwap 35 983 358
-             985:     32(ptr) AccessChain 24(data) 25 978 25
-             986:   13(ivec4) Load 985
-             987:   13(ivec4) VectorShuffle 986 984 4 5 2 3
-                              Store 985 987
-             988:     27(ptr) AccessChain 10(dti) 26
-             989:      6(int) Load 988
-             990:     27(ptr) AccessChain 10(dti) 26
-             991:      6(int) Load 990
-             992:     32(ptr) AccessChain 24(data) 25 991 25
-             993:   13(ivec4) Load 992
-             994:    7(ivec3) VectorShuffle 993 993 0 1 2
-             995:    7(ivec3) GroupNonUniformQuadSwap 35 994 358
-             996:     32(ptr) AccessChain 24(data) 25 989 25
-             997:   13(ivec4) Load 996
-             998:   13(ivec4) VectorShuffle 997 995 4 5 6 3
-                              Store 996 998
-             999:     27(ptr) AccessChain 10(dti) 26
-            1000:      6(int) Load 999
+             975:     27(ptr) AccessChain 10(dti) 26
+             976:      6(int) Load 975
+             977:    128(ptr) AccessChain 24(data) 25 976 125
+             978:   17(fvec4) Load 977
+             979:   17(fvec4) GroupNonUniformQuadSwap 35 978 58
+             980:    128(ptr) AccessChain 24(data) 25 974 125
+                              Store 980 979
+             981:     27(ptr) AccessChain 10(dti) 26
+             982:      6(int) Load 981
+             983:     27(ptr) AccessChain 10(dti) 26
+             984:      6(int) Load 983
+             985:    137(ptr) AccessChain 24(data) 25 984 125 26
+             986:   16(float) Load 985
+             987:   16(float) GroupNonUniformQuadSwap 35 986 58
+             988:    137(ptr) AccessChain 24(data) 25 982 125 26
+                              Store 988 987
+             989:     27(ptr) AccessChain 10(dti) 26
+             990:      6(int) Load 989
+             991:     27(ptr) AccessChain 10(dti) 26
+             992:      6(int) Load 991
+             993:    128(ptr) AccessChain 24(data) 25 992 125
+             994:   17(fvec4) Load 993
+             995:  146(fvec2) VectorShuffle 994 994 0 1
+             996:  146(fvec2) GroupNonUniformQuadSwap 35 995 58
+             997:    137(ptr) AccessChain 24(data) 25 990 125 26
+             998:   16(float) CompositeExtract 996 0
+                              Store 997 998
+             999:    137(ptr) AccessChain 24(data) 25 990 125 58
+            1000:   16(float) CompositeExtract 996 1
+                              Store 999 1000
             1001:     27(ptr) AccessChain 10(dti) 26
             1002:      6(int) Load 1001
-            1003:     75(ptr) AccessChain 24(data) 25 1002 72
-            1004:   15(ivec4) Load 1003
-            1005:   15(ivec4) GroupNonUniformQuadSwap 35 1004 358
-            1006:     75(ptr) AccessChain 24(data) 25 1000 72
-                              Store 1006 1005
-            1007:     27(ptr) AccessChain 10(dti) 26
-            1008:      6(int) Load 1007
-            1009:     27(ptr) AccessChain 10(dti) 26
-            1010:      6(int) Load 1009
-            1011:     84(ptr) AccessChain 24(data) 25 1010 72 26
-            1012:     14(int) Load 1011
-            1013:     14(int) GroupNonUniformQuadSwap 35 1012 358
-            1014:     84(ptr) AccessChain 24(data) 25 1008 72 26
-                              Store 1014 1013
+            1003:     27(ptr) AccessChain 10(dti) 26
+            1004:      6(int) Load 1003
+            1005:    128(ptr) AccessChain 24(data) 25 1004 125
+            1006:   17(fvec4) Load 1005
+            1007:  159(fvec3) VectorShuffle 1006 1006 0 1 2
+            1008:  159(fvec3) GroupNonUniformQuadSwap 35 1007 58
+            1009:    137(ptr) AccessChain 24(data) 25 1002 125 26
+            1010:   16(float) CompositeExtract 1008 0
+                              Store 1009 1010
+            1011:    137(ptr) AccessChain 24(data) 25 1002 125 58
+            1012:   16(float) CompositeExtract 1008 1
+                              Store 1011 1012
+            1013:    137(ptr) AccessChain 24(data) 25 1002 125 73
+            1014:   16(float) CompositeExtract 1008 2
+                              Store 1013 1014
             1015:     27(ptr) AccessChain 10(dti) 26
             1016:      6(int) Load 1015
             1017:     27(ptr) AccessChain 10(dti) 26
             1018:      6(int) Load 1017
-            1019:     75(ptr) AccessChain 24(data) 25 1018 72
-            1020:   15(ivec4) Load 1019
-            1021:   93(ivec2) VectorShuffle 1020 1020 0 1
-            1022:   93(ivec2) GroupNonUniformQuadSwap 35 1021 358
-            1023:     75(ptr) AccessChain 24(data) 25 1016 72
-            1024:   15(ivec4) Load 1023
-            1025:   15(ivec4) VectorShuffle 1024 1022 4 5 2 3
-                              Store 1023 1025
-            1026:     27(ptr) AccessChain 10(dti) 26
-            1027:      6(int) Load 1026
-            1028:     27(ptr) AccessChain 10(dti) 26
-            1029:      6(int) Load 1028
-            1030:     75(ptr) AccessChain 24(data) 25 1029 72
-            1031:   15(ivec4) Load 1030
-            1032:  105(ivec3) VectorShuffle 1031 1031 0 1 2
-            1033:  105(ivec3) GroupNonUniformQuadSwap 35 1032 358
-            1034:     75(ptr) AccessChain 24(data) 25 1027 72
-            1035:   15(ivec4) Load 1034
-            1036:   15(ivec4) VectorShuffle 1035 1033 4 5 6 3
-                              Store 1034 1036
-            1037:     27(ptr) AccessChain 10(dti) 26
-            1038:      6(int) Load 1037
-            1039:     27(ptr) AccessChain 10(dti) 26
-            1040:      6(int) Load 1039
-            1041:    118(ptr) AccessChain 24(data) 25 1040 115
-            1042:   17(fvec4) Load 1041
-            1043:   17(fvec4) GroupNonUniformQuadSwap 35 1042 358
-            1044:    118(ptr) AccessChain 24(data) 25 1038 115
-                              Store 1044 1043
+            1019:    175(ptr) AccessChain 24(data) 25 1018 172
+            1020: 19(f64vec4) Load 1019
+            1021: 19(f64vec4) GroupNonUniformQuadSwap 35 1020 58
+            1022:    175(ptr) AccessChain 24(data) 25 1016 172
+                              Store 1022 1021
+            1023:     27(ptr) AccessChain 10(dti) 26
+            1024:      6(int) Load 1023
+            1025:     27(ptr) AccessChain 10(dti) 26
+            1026:      6(int) Load 1025
+            1027:    184(ptr) AccessChain 24(data) 25 1026 172 26
+            1028:18(float64_t) Load 1027
+            1029:18(float64_t) GroupNonUniformQuadSwap 35 1028 58
+            1030:    184(ptr) AccessChain 24(data) 25 1024 172 26
+                              Store 1030 1029
+            1031:     27(ptr) AccessChain 10(dti) 26
+            1032:      6(int) Load 1031
+            1033:     27(ptr) AccessChain 10(dti) 26
+            1034:      6(int) Load 1033
+            1035:    175(ptr) AccessChain 24(data) 25 1034 172
+            1036: 19(f64vec4) Load 1035
+            1037:193(f64vec2) VectorShuffle 1036 1036 0 1
+            1038:193(f64vec2) GroupNonUniformQuadSwap 35 1037 58
+            1039:    184(ptr) AccessChain 24(data) 25 1032 172 26
+            1040:18(float64_t) CompositeExtract 1038 0
+                              Store 1039 1040
+            1041:    184(ptr) AccessChain 24(data) 25 1032 172 58
+            1042:18(float64_t) CompositeExtract 1038 1
+                              Store 1041 1042
+            1043:     27(ptr) AccessChain 10(dti) 26
+            1044:      6(int) Load 1043
             1045:     27(ptr) AccessChain 10(dti) 26
             1046:      6(int) Load 1045
-            1047:     27(ptr) AccessChain 10(dti) 26
-            1048:      6(int) Load 1047
-            1049:    127(ptr) AccessChain 24(data) 25 1048 115 26
-            1050:   16(float) Load 1049
-            1051:   16(float) GroupNonUniformQuadSwap 35 1050 358
-            1052:    127(ptr) AccessChain 24(data) 25 1046 115 26
-                              Store 1052 1051
-            1053:     27(ptr) AccessChain 10(dti) 26
-            1054:      6(int) Load 1053
-            1055:     27(ptr) AccessChain 10(dti) 26
-            1056:      6(int) Load 1055
-            1057:    118(ptr) AccessChain 24(data) 25 1056 115
-            1058:   17(fvec4) Load 1057
-            1059:  136(fvec2) VectorShuffle 1058 1058 0 1
-            1060:  136(fvec2) GroupNonUniformQuadSwap 35 1059 358
-            1061:    118(ptr) AccessChain 24(data) 25 1054 115
-            1062:   17(fvec4) Load 1061
-            1063:   17(fvec4) VectorShuffle 1062 1060 4 5 2 3
-                              Store 1061 1063
-            1064:     27(ptr) AccessChain 10(dti) 26
-            1065:      6(int) Load 1064
-            1066:     27(ptr) AccessChain 10(dti) 26
-            1067:      6(int) Load 1066
-            1068:    118(ptr) AccessChain 24(data) 25 1067 115
-            1069:   17(fvec4) Load 1068
-            1070:  148(fvec3) VectorShuffle 1069 1069 0 1 2
-            1071:  148(fvec3) GroupNonUniformQuadSwap 35 1070 358
-            1072:    118(ptr) AccessChain 24(data) 25 1065 115
-            1073:   17(fvec4) Load 1072
-            1074:   17(fvec4) VectorShuffle 1073 1071 4 5 6 3
-                              Store 1072 1074
+            1047:    175(ptr) AccessChain 24(data) 25 1046 172
+            1048: 19(f64vec4) Load 1047
+            1049:206(f64vec3) VectorShuffle 1048 1048 0 1 2
+            1050:206(f64vec3) GroupNonUniformQuadSwap 35 1049 58
+            1051:    184(ptr) AccessChain 24(data) 25 1044 172 26
+            1052:18(float64_t) CompositeExtract 1050 0
+                              Store 1051 1052
+            1053:    184(ptr) AccessChain 24(data) 25 1044 172 58
+            1054:18(float64_t) CompositeExtract 1050 1
+                              Store 1053 1054
+            1055:    184(ptr) AccessChain 24(data) 25 1044 172 73
+            1056:18(float64_t) CompositeExtract 1050 2
+                              Store 1055 1056
+            1057:     27(ptr) AccessChain 10(dti) 26
+            1058:      6(int) Load 1057
+            1059:     27(ptr) AccessChain 10(dti) 26
+            1060:      6(int) Load 1059
+            1061:     32(ptr) AccessChain 24(data) 25 1060 25
+            1062:   13(ivec4) Load 1061
+            1063:   13(ivec4) GroupNonUniformQuadSwap 35 1062 73
+            1064:     32(ptr) AccessChain 24(data) 25 1058 25
+                              Store 1064 1063
+            1065:     27(ptr) AccessChain 10(dti) 26
+            1066:      6(int) Load 1065
+            1067:     27(ptr) AccessChain 10(dti) 26
+            1068:      6(int) Load 1067
+            1069:     42(ptr) AccessChain 24(data) 25 1068 25 26
+            1070:      6(int) Load 1069
+            1071:      6(int) GroupNonUniformQuadSwap 35 1070 73
+            1072:     42(ptr) AccessChain 24(data) 25 1066 25 26
+                              Store 1072 1071
+            1073:     27(ptr) AccessChain 10(dti) 26
+            1074:      6(int) Load 1073
             1075:     27(ptr) AccessChain 10(dti) 26
             1076:      6(int) Load 1075
-            1077:     27(ptr) AccessChain 10(dti) 26
-            1078:      6(int) Load 1077
-            1079:    161(ptr) AccessChain 24(data) 25 1078 158
-            1080: 19(f64vec4) Load 1079
-            1081: 19(f64vec4) GroupNonUniformQuadSwap 35 1080 358
-            1082:    161(ptr) AccessChain 24(data) 25 1076 158
-                              Store 1082 1081
-            1083:     27(ptr) AccessChain 10(dti) 26
-            1084:      6(int) Load 1083
+            1077:     32(ptr) AccessChain 24(data) 25 1076 25
+            1078:   13(ivec4) Load 1077
+            1079:   51(ivec2) VectorShuffle 1078 1078 0 1
+            1080:   51(ivec2) GroupNonUniformQuadSwap 35 1079 73
+            1081:     42(ptr) AccessChain 24(data) 25 1074 25 26
+            1082:      6(int) CompositeExtract 1080 0
+                              Store 1081 1082
+            1083:     42(ptr) AccessChain 24(data) 25 1074 25 58
+            1084:      6(int) CompositeExtract 1080 1
+                              Store 1083 1084
             1085:     27(ptr) AccessChain 10(dti) 26
             1086:      6(int) Load 1085
-            1087:    170(ptr) AccessChain 24(data) 25 1086 158 26
-            1088:18(float64_t) Load 1087
-            1089:18(float64_t) GroupNonUniformQuadSwap 35 1088 358
-            1090:    170(ptr) AccessChain 24(data) 25 1084 158 26
-                              Store 1090 1089
-            1091:     27(ptr) AccessChain 10(dti) 26
-            1092:      6(int) Load 1091
-            1093:     27(ptr) AccessChain 10(dti) 26
-            1094:      6(int) Load 1093
-            1095:    161(ptr) AccessChain 24(data) 25 1094 158
-            1096: 19(f64vec4) Load 1095
-            1097:179(f64vec2) VectorShuffle 1096 1096 0 1
-            1098:179(f64vec2) GroupNonUniformQuadSwap 35 1097 358
-            1099:    161(ptr) AccessChain 24(data) 25 1092 158
-            1100: 19(f64vec4) Load 1099
-            1101: 19(f64vec4) VectorShuffle 1100 1098 4 5 2 3
-                              Store 1099 1101
-            1102:     27(ptr) AccessChain 10(dti) 26
-            1103:      6(int) Load 1102
-            1104:     27(ptr) AccessChain 10(dti) 26
-            1105:      6(int) Load 1104
-            1106:    161(ptr) AccessChain 24(data) 25 1105 158
-            1107: 19(f64vec4) Load 1106
-            1108:191(f64vec3) VectorShuffle 1107 1107 0 1 2
-            1109:191(f64vec3) GroupNonUniformQuadSwap 35 1108 358
-            1110:    161(ptr) AccessChain 24(data) 25 1103 158
-            1111: 19(f64vec4) Load 1110
-            1112: 19(f64vec4) VectorShuffle 1111 1109 4 5 6 3
-                              Store 1110 1112
+            1087:     27(ptr) AccessChain 10(dti) 26
+            1088:      6(int) Load 1087
+            1089:     32(ptr) AccessChain 24(data) 25 1088 25
+            1090:   13(ivec4) Load 1089
+            1091:    7(ivec3) VectorShuffle 1090 1090 0 1 2
+            1092:    7(ivec3) GroupNonUniformQuadSwap 35 1091 73
+            1093:     42(ptr) AccessChain 24(data) 25 1086 25 26
+            1094:      6(int) CompositeExtract 1092 0
+                              Store 1093 1094
+            1095:     42(ptr) AccessChain 24(data) 25 1086 25 58
+            1096:      6(int) CompositeExtract 1092 1
+                              Store 1095 1096
+            1097:     42(ptr) AccessChain 24(data) 25 1086 25 73
+            1098:      6(int) CompositeExtract 1092 2
+                              Store 1097 1098
+            1099:     27(ptr) AccessChain 10(dti) 26
+            1100:      6(int) Load 1099
+            1101:     27(ptr) AccessChain 10(dti) 26
+            1102:      6(int) Load 1101
+            1103:     81(ptr) AccessChain 24(data) 25 1102 78
+            1104:   15(ivec4) Load 1103
+            1105:   15(ivec4) GroupNonUniformQuadSwap 35 1104 73
+            1106:     81(ptr) AccessChain 24(data) 25 1100 78
+                              Store 1106 1105
+            1107:     27(ptr) AccessChain 10(dti) 26
+            1108:      6(int) Load 1107
+            1109:     27(ptr) AccessChain 10(dti) 26
+            1110:      6(int) Load 1109
+            1111:     90(ptr) AccessChain 24(data) 25 1110 78 26
+            1112:     14(int) Load 1111
+            1113:     14(int) GroupNonUniformQuadSwap 35 1112 73
+            1114:     90(ptr) AccessChain 24(data) 25 1108 78 26
+                              Store 1114 1113
+            1115:     27(ptr) AccessChain 10(dti) 26
+            1116:      6(int) Load 1115
+            1117:     27(ptr) AccessChain 10(dti) 26
+            1118:      6(int) Load 1117
+            1119:     81(ptr) AccessChain 24(data) 25 1118 78
+            1120:   15(ivec4) Load 1119
+            1121:   99(ivec2) VectorShuffle 1120 1120 0 1
+            1122:   99(ivec2) GroupNonUniformQuadSwap 35 1121 73
+            1123:     90(ptr) AccessChain 24(data) 25 1116 78 26
+            1124:     14(int) CompositeExtract 1122 0
+                              Store 1123 1124
+            1125:     90(ptr) AccessChain 24(data) 25 1116 78 58
+            1126:     14(int) CompositeExtract 1122 1
+                              Store 1125 1126
+            1127:     27(ptr) AccessChain 10(dti) 26
+            1128:      6(int) Load 1127
+            1129:     27(ptr) AccessChain 10(dti) 26
+            1130:      6(int) Load 1129
+            1131:     81(ptr) AccessChain 24(data) 25 1130 78
+            1132:   15(ivec4) Load 1131
+            1133:  112(ivec3) VectorShuffle 1132 1132 0 1 2
+            1134:  112(ivec3) GroupNonUniformQuadSwap 35 1133 73
+            1135:     90(ptr) AccessChain 24(data) 25 1128 78 26
+            1136:     14(int) CompositeExtract 1134 0
+                              Store 1135 1136
+            1137:     90(ptr) AccessChain 24(data) 25 1128 78 58
+            1138:     14(int) CompositeExtract 1134 1
+                              Store 1137 1138
+            1139:     90(ptr) AccessChain 24(data) 25 1128 78 73
+            1140:     14(int) CompositeExtract 1134 2
+                              Store 1139 1140
+            1141:     27(ptr) AccessChain 10(dti) 26
+            1142:      6(int) Load 1141
+            1143:     27(ptr) AccessChain 10(dti) 26
+            1144:      6(int) Load 1143
+            1145:    128(ptr) AccessChain 24(data) 25 1144 125
+            1146:   17(fvec4) Load 1145
+            1147:   17(fvec4) GroupNonUniformQuadSwap 35 1146 73
+            1148:    128(ptr) AccessChain 24(data) 25 1142 125
+                              Store 1148 1147
+            1149:     27(ptr) AccessChain 10(dti) 26
+            1150:      6(int) Load 1149
+            1151:     27(ptr) AccessChain 10(dti) 26
+            1152:      6(int) Load 1151
+            1153:    137(ptr) AccessChain 24(data) 25 1152 125 26
+            1154:   16(float) Load 1153
+            1155:   16(float) GroupNonUniformQuadSwap 35 1154 73
+            1156:    137(ptr) AccessChain 24(data) 25 1150 125 26
+                              Store 1156 1155
+            1157:     27(ptr) AccessChain 10(dti) 26
+            1158:      6(int) Load 1157
+            1159:     27(ptr) AccessChain 10(dti) 26
+            1160:      6(int) Load 1159
+            1161:    128(ptr) AccessChain 24(data) 25 1160 125
+            1162:   17(fvec4) Load 1161
+            1163:  146(fvec2) VectorShuffle 1162 1162 0 1
+            1164:  146(fvec2) GroupNonUniformQuadSwap 35 1163 73
+            1165:    137(ptr) AccessChain 24(data) 25 1158 125 26
+            1166:   16(float) CompositeExtract 1164 0
+                              Store 1165 1166
+            1167:    137(ptr) AccessChain 24(data) 25 1158 125 58
+            1168:   16(float) CompositeExtract 1164 1
+                              Store 1167 1168
+            1169:     27(ptr) AccessChain 10(dti) 26
+            1170:      6(int) Load 1169
+            1171:     27(ptr) AccessChain 10(dti) 26
+            1172:      6(int) Load 1171
+            1173:    128(ptr) AccessChain 24(data) 25 1172 125
+            1174:   17(fvec4) Load 1173
+            1175:  159(fvec3) VectorShuffle 1174 1174 0 1 2
+            1176:  159(fvec3) GroupNonUniformQuadSwap 35 1175 73
+            1177:    137(ptr) AccessChain 24(data) 25 1170 125 26
+            1178:   16(float) CompositeExtract 1176 0
+                              Store 1177 1178
+            1179:    137(ptr) AccessChain 24(data) 25 1170 125 58
+            1180:   16(float) CompositeExtract 1176 1
+                              Store 1179 1180
+            1181:    137(ptr) AccessChain 24(data) 25 1170 125 73
+            1182:   16(float) CompositeExtract 1176 2
+                              Store 1181 1182
+            1183:     27(ptr) AccessChain 10(dti) 26
+            1184:      6(int) Load 1183
+            1185:     27(ptr) AccessChain 10(dti) 26
+            1186:      6(int) Load 1185
+            1187:    175(ptr) AccessChain 24(data) 25 1186 172
+            1188: 19(f64vec4) Load 1187
+            1189: 19(f64vec4) GroupNonUniformQuadSwap 35 1188 73
+            1190:    175(ptr) AccessChain 24(data) 25 1184 172
+                              Store 1190 1189
+            1191:     27(ptr) AccessChain 10(dti) 26
+            1192:      6(int) Load 1191
+            1193:     27(ptr) AccessChain 10(dti) 26
+            1194:      6(int) Load 1193
+            1195:    184(ptr) AccessChain 24(data) 25 1194 172 26
+            1196:18(float64_t) Load 1195
+            1197:18(float64_t) GroupNonUniformQuadSwap 35 1196 73
+            1198:    184(ptr) AccessChain 24(data) 25 1192 172 26
+                              Store 1198 1197
+            1199:     27(ptr) AccessChain 10(dti) 26
+            1200:      6(int) Load 1199
+            1201:     27(ptr) AccessChain 10(dti) 26
+            1202:      6(int) Load 1201
+            1203:    175(ptr) AccessChain 24(data) 25 1202 172
+            1204: 19(f64vec4) Load 1203
+            1205:193(f64vec2) VectorShuffle 1204 1204 0 1
+            1206:193(f64vec2) GroupNonUniformQuadSwap 35 1205 73
+            1207:    184(ptr) AccessChain 24(data) 25 1200 172 26
+            1208:18(float64_t) CompositeExtract 1206 0
+                              Store 1207 1208
+            1209:    184(ptr) AccessChain 24(data) 25 1200 172 58
+            1210:18(float64_t) CompositeExtract 1206 1
+                              Store 1209 1210
+            1211:     27(ptr) AccessChain 10(dti) 26
+            1212:      6(int) Load 1211
+            1213:     27(ptr) AccessChain 10(dti) 26
+            1214:      6(int) Load 1213
+            1215:    175(ptr) AccessChain 24(data) 25 1214 172
+            1216: 19(f64vec4) Load 1215
+            1217:206(f64vec3) VectorShuffle 1216 1216 0 1 2
+            1218:206(f64vec3) GroupNonUniformQuadSwap 35 1217 73
+            1219:    184(ptr) AccessChain 24(data) 25 1212 172 26
+            1220:18(float64_t) CompositeExtract 1218 0
+                              Store 1219 1220
+            1221:    184(ptr) AccessChain 24(data) 25 1212 172 58
+            1222:18(float64_t) CompositeExtract 1218 1
+                              Store 1221 1222
+            1223:    184(ptr) AccessChain 24(data) 25 1212 172 73
+            1224:18(float64_t) CompositeExtract 1218 2
+                              Store 1223 1224
                               Return
                               FunctionEnd
diff --git a/third_party/vulkan-deps/glslang/src/Test/baseResults/hlsl.wavereduction.comp.out b/third_party/vulkan-deps/glslang/src/Test/baseResults/hlsl.wavereduction.comp.out
index a898612..64a4e7c 100644
--- a/third_party/vulkan-deps/glslang/src/Test/baseResults/hlsl.wavereduction.comp.out
+++ b/third_party/vulkan-deps/glslang/src/Test/baseResults/hlsl.wavereduction.comp.out
@@ -6187,7 +6187,7 @@
 
 // Module Version 10300
 // Generated by (magic number): 8000a
-// Id's are bound by 901
+// Id's are bound by 991
 
                               Capability Shader
                               Capability Float64
@@ -6196,7 +6196,7 @@
                               Capability GroupNonUniformBallot
                1:             ExtInstImport  "GLSL.std.450"
                               MemoryModel Logical GLSL450
-                              EntryPoint GLCompute 4  "CSMain" 896
+                              EntryPoint GLCompute 4  "CSMain" 986
                               ExecutionMode 4 LocalSize 32 16 1
                               Source HLSL 500
                               Name 4  "CSMain"
@@ -6210,9 +6210,9 @@
                               Name 22  "data"
                               MemberName 22(data) 0  "@data"
                               Name 24  "data"
-                              Name 894  "dti"
-                              Name 896  "dti"
-                              Name 898  "param"
+                              Name 984  "dti"
+                              Name 986  "dti"
+                              Name 988  "param"
                               MemberDecorate 20(Types) 0 Offset 0
                               MemberDecorate 20(Types) 1 Offset 16
                               MemberDecorate 20(Types) 2 Offset 32
@@ -6222,7 +6222,7 @@
                               Decorate 22(data) BufferBlock
                               Decorate 24(data) DescriptorSet 0
                               Decorate 24(data) Binding 0
-                              Decorate 896(dti) BuiltIn GlobalInvocationId
+                              Decorate 986(dti) BuiltIn GlobalInvocationId
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeInt 32 0
@@ -6248,33 +6248,35 @@
               35:      6(int) Constant 3
               42:             TypePointer Uniform 6(int)
               51:             TypeVector 6(int) 2
-              72:     14(int) Constant 1
-              75:             TypePointer Uniform 15(ivec4)
-              84:             TypePointer Uniform 14(int)
-              93:             TypeVector 14(int) 2
-             105:             TypeVector 14(int) 3
-             115:     14(int) Constant 2
-             118:             TypePointer Uniform 17(fvec4)
-             127:             TypePointer Uniform 16(float)
-             136:             TypeVector 16(float) 2
-             148:             TypeVector 16(float) 3
-             158:     14(int) Constant 3
-             161:             TypePointer Uniform 19(f64vec4)
-             170:             TypePointer Uniform 18(float64_t)
-             179:             TypeVector 18(float64_t) 2
-             191:             TypeVector 18(float64_t) 3
-             889:             TypeBool
-             895:             TypePointer Input 7(ivec3)
-        896(dti):    895(ptr) Variable Input
+              58:      6(int) Constant 1
+              73:      6(int) Constant 2
+              78:     14(int) Constant 1
+              81:             TypePointer Uniform 15(ivec4)
+              90:             TypePointer Uniform 14(int)
+              99:             TypeVector 14(int) 2
+             112:             TypeVector 14(int) 3
+             125:     14(int) Constant 2
+             128:             TypePointer Uniform 17(fvec4)
+             137:             TypePointer Uniform 16(float)
+             146:             TypeVector 16(float) 2
+             159:             TypeVector 16(float) 3
+             172:     14(int) Constant 3
+             175:             TypePointer Uniform 19(f64vec4)
+             184:             TypePointer Uniform 18(float64_t)
+             193:             TypeVector 18(float64_t) 2
+             206:             TypeVector 18(float64_t) 3
+             979:             TypeBool
+             985:             TypePointer Input 7(ivec3)
+        986(dti):    985(ptr) Variable Input
        4(CSMain):           2 Function None 3
                5:             Label
-        894(dti):      8(ptr) Variable Function
-      898(param):      8(ptr) Variable Function
-             897:    7(ivec3) Load 896(dti)
-                              Store 894(dti) 897
-             899:    7(ivec3) Load 894(dti)
-                              Store 898(param) 899
-             900:           2 FunctionCall 11(@CSMain(vu3;) 898(param)
+        984(dti):      8(ptr) Variable Function
+      988(param):      8(ptr) Variable Function
+             987:    7(ivec3) Load 986(dti)
+                              Store 984(dti) 987
+             989:    7(ivec3) Load 984(dti)
+                              Store 988(param) 989
+             990:           2 FunctionCall 11(@CSMain(vu3;) 988(param)
                               Return
                               FunctionEnd
 11(@CSMain(vu3;):           2 Function None 9
@@ -6306,914 +6308,1068 @@
               53:   13(ivec4) Load 52
               54:   51(ivec2) VectorShuffle 53 53 0 1
               55:   51(ivec2) GroupNonUniformIAdd 35 Reduce 54
-              56:     32(ptr) AccessChain 24(data) 25 48 25
-              57:   13(ivec4) Load 56
-              58:   13(ivec4) VectorShuffle 57 55 4 5 2 3
-                              Store 56 58
-              59:     27(ptr) AccessChain 10(dti) 26
-              60:      6(int) Load 59
+              56:     42(ptr) AccessChain 24(data) 25 48 25 26
+              57:      6(int) CompositeExtract 55 0
+                              Store 56 57
+              59:     42(ptr) AccessChain 24(data) 25 48 25 58
+              60:      6(int) CompositeExtract 55 1
+                              Store 59 60
               61:     27(ptr) AccessChain 10(dti) 26
               62:      6(int) Load 61
-              63:     32(ptr) AccessChain 24(data) 25 62 25
-              64:   13(ivec4) Load 63
-              65:    7(ivec3) VectorShuffle 64 64 0 1 2
-              66:    7(ivec3) GroupNonUniformIAdd 35 Reduce 65
-              67:     32(ptr) AccessChain 24(data) 25 60 25
-              68:   13(ivec4) Load 67
-              69:   13(ivec4) VectorShuffle 68 66 4 5 6 3
-                              Store 67 69
-              70:     27(ptr) AccessChain 10(dti) 26
-              71:      6(int) Load 70
-              73:     27(ptr) AccessChain 10(dti) 26
-              74:      6(int) Load 73
-              76:     75(ptr) AccessChain 24(data) 25 74 72
-              77:   15(ivec4) Load 76
-              78:   15(ivec4) GroupNonUniformIAdd 35 Reduce 77
-              79:     75(ptr) AccessChain 24(data) 25 71 72
-                              Store 79 78
-              80:     27(ptr) AccessChain 10(dti) 26
-              81:      6(int) Load 80
-              82:     27(ptr) AccessChain 10(dti) 26
-              83:      6(int) Load 82
-              85:     84(ptr) AccessChain 24(data) 25 83 72 26
-              86:     14(int) Load 85
-              87:     14(int) GroupNonUniformIAdd 35 Reduce 86
-              88:     84(ptr) AccessChain 24(data) 25 81 72 26
-                              Store 88 87
-              89:     27(ptr) AccessChain 10(dti) 26
-              90:      6(int) Load 89
-              91:     27(ptr) AccessChain 10(dti) 26
-              92:      6(int) Load 91
-              94:     75(ptr) AccessChain 24(data) 25 92 72
-              95:   15(ivec4) Load 94
-              96:   93(ivec2) VectorShuffle 95 95 0 1
-              97:   93(ivec2) GroupNonUniformIAdd 35 Reduce 96
-              98:     75(ptr) AccessChain 24(data) 25 90 72
-              99:   15(ivec4) Load 98
-             100:   15(ivec4) VectorShuffle 99 97 4 5 2 3
-                              Store 98 100
-             101:     27(ptr) AccessChain 10(dti) 26
-             102:      6(int) Load 101
-             103:     27(ptr) AccessChain 10(dti) 26
-             104:      6(int) Load 103
-             106:     75(ptr) AccessChain 24(data) 25 104 72
-             107:   15(ivec4) Load 106
-             108:  105(ivec3) VectorShuffle 107 107 0 1 2
-             109:  105(ivec3) GroupNonUniformIAdd 35 Reduce 108
-             110:     75(ptr) AccessChain 24(data) 25 102 72
-             111:   15(ivec4) Load 110
-             112:   15(ivec4) VectorShuffle 111 109 4 5 6 3
-                              Store 110 112
-             113:     27(ptr) AccessChain 10(dti) 26
-             114:      6(int) Load 113
-             116:     27(ptr) AccessChain 10(dti) 26
-             117:      6(int) Load 116
-             119:    118(ptr) AccessChain 24(data) 25 117 115
-             120:   17(fvec4) Load 119
-             121:   17(fvec4) GroupNonUniformFAdd 35 Reduce 120
-             122:    118(ptr) AccessChain 24(data) 25 114 115
-                              Store 122 121
+              63:     27(ptr) AccessChain 10(dti) 26
+              64:      6(int) Load 63
+              65:     32(ptr) AccessChain 24(data) 25 64 25
+              66:   13(ivec4) Load 65
+              67:    7(ivec3) VectorShuffle 66 66 0 1 2
+              68:    7(ivec3) GroupNonUniformIAdd 35 Reduce 67
+              69:     42(ptr) AccessChain 24(data) 25 62 25 26
+              70:      6(int) CompositeExtract 68 0
+                              Store 69 70
+              71:     42(ptr) AccessChain 24(data) 25 62 25 58
+              72:      6(int) CompositeExtract 68 1
+                              Store 71 72
+              74:     42(ptr) AccessChain 24(data) 25 62 25 73
+              75:      6(int) CompositeExtract 68 2
+                              Store 74 75
+              76:     27(ptr) AccessChain 10(dti) 26
+              77:      6(int) Load 76
+              79:     27(ptr) AccessChain 10(dti) 26
+              80:      6(int) Load 79
+              82:     81(ptr) AccessChain 24(data) 25 80 78
+              83:   15(ivec4) Load 82
+              84:   15(ivec4) GroupNonUniformIAdd 35 Reduce 83
+              85:     81(ptr) AccessChain 24(data) 25 77 78
+                              Store 85 84
+              86:     27(ptr) AccessChain 10(dti) 26
+              87:      6(int) Load 86
+              88:     27(ptr) AccessChain 10(dti) 26
+              89:      6(int) Load 88
+              91:     90(ptr) AccessChain 24(data) 25 89 78 26
+              92:     14(int) Load 91
+              93:     14(int) GroupNonUniformIAdd 35 Reduce 92
+              94:     90(ptr) AccessChain 24(data) 25 87 78 26
+                              Store 94 93
+              95:     27(ptr) AccessChain 10(dti) 26
+              96:      6(int) Load 95
+              97:     27(ptr) AccessChain 10(dti) 26
+              98:      6(int) Load 97
+             100:     81(ptr) AccessChain 24(data) 25 98 78
+             101:   15(ivec4) Load 100
+             102:   99(ivec2) VectorShuffle 101 101 0 1
+             103:   99(ivec2) GroupNonUniformIAdd 35 Reduce 102
+             104:     90(ptr) AccessChain 24(data) 25 96 78 26
+             105:     14(int) CompositeExtract 103 0
+                              Store 104 105
+             106:     90(ptr) AccessChain 24(data) 25 96 78 58
+             107:     14(int) CompositeExtract 103 1
+                              Store 106 107
+             108:     27(ptr) AccessChain 10(dti) 26
+             109:      6(int) Load 108
+             110:     27(ptr) AccessChain 10(dti) 26
+             111:      6(int) Load 110
+             113:     81(ptr) AccessChain 24(data) 25 111 78
+             114:   15(ivec4) Load 113
+             115:  112(ivec3) VectorShuffle 114 114 0 1 2
+             116:  112(ivec3) GroupNonUniformIAdd 35 Reduce 115
+             117:     90(ptr) AccessChain 24(data) 25 109 78 26
+             118:     14(int) CompositeExtract 116 0
+                              Store 117 118
+             119:     90(ptr) AccessChain 24(data) 25 109 78 58
+             120:     14(int) CompositeExtract 116 1
+                              Store 119 120
+             121:     90(ptr) AccessChain 24(data) 25 109 78 73
+             122:     14(int) CompositeExtract 116 2
+                              Store 121 122
              123:     27(ptr) AccessChain 10(dti) 26
              124:      6(int) Load 123
-             125:     27(ptr) AccessChain 10(dti) 26
-             126:      6(int) Load 125
-             128:    127(ptr) AccessChain 24(data) 25 126 115 26
-             129:   16(float) Load 128
-             130:   16(float) GroupNonUniformFAdd 35 Reduce 129
-             131:    127(ptr) AccessChain 24(data) 25 124 115 26
-                              Store 131 130
-             132:     27(ptr) AccessChain 10(dti) 26
-             133:      6(int) Load 132
-             134:     27(ptr) AccessChain 10(dti) 26
-             135:      6(int) Load 134
-             137:    118(ptr) AccessChain 24(data) 25 135 115
-             138:   17(fvec4) Load 137
-             139:  136(fvec2) VectorShuffle 138 138 0 1
-             140:  136(fvec2) GroupNonUniformFAdd 35 Reduce 139
-             141:    118(ptr) AccessChain 24(data) 25 133 115
-             142:   17(fvec4) Load 141
-             143:   17(fvec4) VectorShuffle 142 140 4 5 2 3
-                              Store 141 143
+             126:     27(ptr) AccessChain 10(dti) 26
+             127:      6(int) Load 126
+             129:    128(ptr) AccessChain 24(data) 25 127 125
+             130:   17(fvec4) Load 129
+             131:   17(fvec4) GroupNonUniformFAdd 35 Reduce 130
+             132:    128(ptr) AccessChain 24(data) 25 124 125
+                              Store 132 131
+             133:     27(ptr) AccessChain 10(dti) 26
+             134:      6(int) Load 133
+             135:     27(ptr) AccessChain 10(dti) 26
+             136:      6(int) Load 135
+             138:    137(ptr) AccessChain 24(data) 25 136 125 26
+             139:   16(float) Load 138
+             140:   16(float) GroupNonUniformFAdd 35 Reduce 139
+             141:    137(ptr) AccessChain 24(data) 25 134 125 26
+                              Store 141 140
+             142:     27(ptr) AccessChain 10(dti) 26
+             143:      6(int) Load 142
              144:     27(ptr) AccessChain 10(dti) 26
              145:      6(int) Load 144
-             146:     27(ptr) AccessChain 10(dti) 26
-             147:      6(int) Load 146
-             149:    118(ptr) AccessChain 24(data) 25 147 115
-             150:   17(fvec4) Load 149
-             151:  148(fvec3) VectorShuffle 150 150 0 1 2
-             152:  148(fvec3) GroupNonUniformFAdd 35 Reduce 151
-             153:    118(ptr) AccessChain 24(data) 25 145 115
-             154:   17(fvec4) Load 153
-             155:   17(fvec4) VectorShuffle 154 152 4 5 6 3
-                              Store 153 155
-             156:     27(ptr) AccessChain 10(dti) 26
-             157:      6(int) Load 156
-             159:     27(ptr) AccessChain 10(dti) 26
-             160:      6(int) Load 159
-             162:    161(ptr) AccessChain 24(data) 25 160 158
-             163: 19(f64vec4) Load 162
-             164: 19(f64vec4) GroupNonUniformFAdd 35 Reduce 163
-             165:    161(ptr) AccessChain 24(data) 25 157 158
-                              Store 165 164
-             166:     27(ptr) AccessChain 10(dti) 26
-             167:      6(int) Load 166
-             168:     27(ptr) AccessChain 10(dti) 26
-             169:      6(int) Load 168
-             171:    170(ptr) AccessChain 24(data) 25 169 158 26
-             172:18(float64_t) Load 171
-             173:18(float64_t) GroupNonUniformFAdd 35 Reduce 172
-             174:    170(ptr) AccessChain 24(data) 25 167 158 26
-                              Store 174 173
-             175:     27(ptr) AccessChain 10(dti) 26
-             176:      6(int) Load 175
-             177:     27(ptr) AccessChain 10(dti) 26
-             178:      6(int) Load 177
-             180:    161(ptr) AccessChain 24(data) 25 178 158
-             181: 19(f64vec4) Load 180
-             182:179(f64vec2) VectorShuffle 181 181 0 1
-             183:179(f64vec2) GroupNonUniformFAdd 35 Reduce 182
-             184:    161(ptr) AccessChain 24(data) 25 176 158
-             185: 19(f64vec4) Load 184
-             186: 19(f64vec4) VectorShuffle 185 183 4 5 2 3
-                              Store 184 186
-             187:     27(ptr) AccessChain 10(dti) 26
-             188:      6(int) Load 187
+             147:    128(ptr) AccessChain 24(data) 25 145 125
+             148:   17(fvec4) Load 147
+             149:  146(fvec2) VectorShuffle 148 148 0 1
+             150:  146(fvec2) GroupNonUniformFAdd 35 Reduce 149
+             151:    137(ptr) AccessChain 24(data) 25 143 125 26
+             152:   16(float) CompositeExtract 150 0
+                              Store 151 152
+             153:    137(ptr) AccessChain 24(data) 25 143 125 58
+             154:   16(float) CompositeExtract 150 1
+                              Store 153 154
+             155:     27(ptr) AccessChain 10(dti) 26
+             156:      6(int) Load 155
+             157:     27(ptr) AccessChain 10(dti) 26
+             158:      6(int) Load 157
+             160:    128(ptr) AccessChain 24(data) 25 158 125
+             161:   17(fvec4) Load 160
+             162:  159(fvec3) VectorShuffle 161 161 0 1 2
+             163:  159(fvec3) GroupNonUniformFAdd 35 Reduce 162
+             164:    137(ptr) AccessChain 24(data) 25 156 125 26
+             165:   16(float) CompositeExtract 163 0
+                              Store 164 165
+             166:    137(ptr) AccessChain 24(data) 25 156 125 58
+             167:   16(float) CompositeExtract 163 1
+                              Store 166 167
+             168:    137(ptr) AccessChain 24(data) 25 156 125 73
+             169:   16(float) CompositeExtract 163 2
+                              Store 168 169
+             170:     27(ptr) AccessChain 10(dti) 26
+             171:      6(int) Load 170
+             173:     27(ptr) AccessChain 10(dti) 26
+             174:      6(int) Load 173
+             176:    175(ptr) AccessChain 24(data) 25 174 172
+             177: 19(f64vec4) Load 176
+             178: 19(f64vec4) GroupNonUniformFAdd 35 Reduce 177
+             179:    175(ptr) AccessChain 24(data) 25 171 172
+                              Store 179 178
+             180:     27(ptr) AccessChain 10(dti) 26
+             181:      6(int) Load 180
+             182:     27(ptr) AccessChain 10(dti) 26
+             183:      6(int) Load 182
+             185:    184(ptr) AccessChain 24(data) 25 183 172 26
+             186:18(float64_t) Load 185
+             187:18(float64_t) GroupNonUniformFAdd 35 Reduce 186
+             188:    184(ptr) AccessChain 24(data) 25 181 172 26
+                              Store 188 187
              189:     27(ptr) AccessChain 10(dti) 26
              190:      6(int) Load 189
-             192:    161(ptr) AccessChain 24(data) 25 190 158
-             193: 19(f64vec4) Load 192
-             194:191(f64vec3) VectorShuffle 193 193 0 1 2
-             195:191(f64vec3) GroupNonUniformFAdd 35 Reduce 194
-             196:    161(ptr) AccessChain 24(data) 25 188 158
-             197: 19(f64vec4) Load 196
-             198: 19(f64vec4) VectorShuffle 197 195 4 5 6 3
-                              Store 196 198
-             199:     27(ptr) AccessChain 10(dti) 26
-             200:      6(int) Load 199
-             201:     27(ptr) AccessChain 10(dti) 26
-             202:      6(int) Load 201
-             203:     32(ptr) AccessChain 24(data) 25 202 25
-             204:   13(ivec4) Load 203
-             205:   13(ivec4) GroupNonUniformIMul 35 Reduce 204
-             206:     32(ptr) AccessChain 24(data) 25 200 25
-                              Store 206 205
-             207:     27(ptr) AccessChain 10(dti) 26
-             208:      6(int) Load 207
-             209:     27(ptr) AccessChain 10(dti) 26
-             210:      6(int) Load 209
-             211:     42(ptr) AccessChain 24(data) 25 210 25 26
-             212:      6(int) Load 211
-             213:      6(int) GroupNonUniformIMul 35 Reduce 212
-             214:     42(ptr) AccessChain 24(data) 25 208 25 26
-                              Store 214 213
-             215:     27(ptr) AccessChain 10(dti) 26
-             216:      6(int) Load 215
+             191:     27(ptr) AccessChain 10(dti) 26
+             192:      6(int) Load 191
+             194:    175(ptr) AccessChain 24(data) 25 192 172
+             195: 19(f64vec4) Load 194
+             196:193(f64vec2) VectorShuffle 195 195 0 1
+             197:193(f64vec2) GroupNonUniformFAdd 35 Reduce 196
+             198:    184(ptr) AccessChain 24(data) 25 190 172 26
+             199:18(float64_t) CompositeExtract 197 0
+                              Store 198 199
+             200:    184(ptr) AccessChain 24(data) 25 190 172 58
+             201:18(float64_t) CompositeExtract 197 1
+                              Store 200 201
+             202:     27(ptr) AccessChain 10(dti) 26
+             203:      6(int) Load 202
+             204:     27(ptr) AccessChain 10(dti) 26
+             205:      6(int) Load 204
+             207:    175(ptr) AccessChain 24(data) 25 205 172
+             208: 19(f64vec4) Load 207
+             209:206(f64vec3) VectorShuffle 208 208 0 1 2
+             210:206(f64vec3) GroupNonUniformFAdd 35 Reduce 209
+             211:    184(ptr) AccessChain 24(data) 25 203 172 26
+             212:18(float64_t) CompositeExtract 210 0
+                              Store 211 212
+             213:    184(ptr) AccessChain 24(data) 25 203 172 58
+             214:18(float64_t) CompositeExtract 210 1
+                              Store 213 214
+             215:    184(ptr) AccessChain 24(data) 25 203 172 73
+             216:18(float64_t) CompositeExtract 210 2
+                              Store 215 216
              217:     27(ptr) AccessChain 10(dti) 26
              218:      6(int) Load 217
-             219:     32(ptr) AccessChain 24(data) 25 218 25
-             220:   13(ivec4) Load 219
-             221:   51(ivec2) VectorShuffle 220 220 0 1
-             222:   51(ivec2) GroupNonUniformIMul 35 Reduce 221
-             223:     32(ptr) AccessChain 24(data) 25 216 25
-             224:   13(ivec4) Load 223
-             225:   13(ivec4) VectorShuffle 224 222 4 5 2 3
-                              Store 223 225
-             226:     27(ptr) AccessChain 10(dti) 26
-             227:      6(int) Load 226
-             228:     27(ptr) AccessChain 10(dti) 26
-             229:      6(int) Load 228
-             230:     32(ptr) AccessChain 24(data) 25 229 25
-             231:   13(ivec4) Load 230
-             232:    7(ivec3) VectorShuffle 231 231 0 1 2
-             233:    7(ivec3) GroupNonUniformIMul 35 Reduce 232
-             234:     32(ptr) AccessChain 24(data) 25 227 25
-             235:   13(ivec4) Load 234
-             236:   13(ivec4) VectorShuffle 235 233 4 5 6 3
-                              Store 234 236
-             237:     27(ptr) AccessChain 10(dti) 26
-             238:      6(int) Load 237
-             239:     27(ptr) AccessChain 10(dti) 26
-             240:      6(int) Load 239
-             241:     75(ptr) AccessChain 24(data) 25 240 72
-             242:   15(ivec4) Load 241
-             243:   15(ivec4) GroupNonUniformIMul 35 Reduce 242
-             244:     75(ptr) AccessChain 24(data) 25 238 72
-                              Store 244 243
+             219:     27(ptr) AccessChain 10(dti) 26
+             220:      6(int) Load 219
+             221:     32(ptr) AccessChain 24(data) 25 220 25
+             222:   13(ivec4) Load 221
+             223:   13(ivec4) GroupNonUniformIMul 35 Reduce 222
+             224:     32(ptr) AccessChain 24(data) 25 218 25
+                              Store 224 223
+             225:     27(ptr) AccessChain 10(dti) 26
+             226:      6(int) Load 225
+             227:     27(ptr) AccessChain 10(dti) 26
+             228:      6(int) Load 227
+             229:     42(ptr) AccessChain 24(data) 25 228 25 26
+             230:      6(int) Load 229
+             231:      6(int) GroupNonUniformIMul 35 Reduce 230
+             232:     42(ptr) AccessChain 24(data) 25 226 25 26
+                              Store 232 231
+             233:     27(ptr) AccessChain 10(dti) 26
+             234:      6(int) Load 233
+             235:     27(ptr) AccessChain 10(dti) 26
+             236:      6(int) Load 235
+             237:     32(ptr) AccessChain 24(data) 25 236 25
+             238:   13(ivec4) Load 237
+             239:   51(ivec2) VectorShuffle 238 238 0 1
+             240:   51(ivec2) GroupNonUniformIMul 35 Reduce 239
+             241:     42(ptr) AccessChain 24(data) 25 234 25 26
+             242:      6(int) CompositeExtract 240 0
+                              Store 241 242
+             243:     42(ptr) AccessChain 24(data) 25 234 25 58
+             244:      6(int) CompositeExtract 240 1
+                              Store 243 244
              245:     27(ptr) AccessChain 10(dti) 26
              246:      6(int) Load 245
              247:     27(ptr) AccessChain 10(dti) 26
              248:      6(int) Load 247
-             249:     84(ptr) AccessChain 24(data) 25 248 72 26
-             250:     14(int) Load 249
-             251:     14(int) GroupNonUniformIMul 35 Reduce 250
-             252:     84(ptr) AccessChain 24(data) 25 246 72 26
-                              Store 252 251
-             253:     27(ptr) AccessChain 10(dti) 26
-             254:      6(int) Load 253
-             255:     27(ptr) AccessChain 10(dti) 26
-             256:      6(int) Load 255
-             257:     75(ptr) AccessChain 24(data) 25 256 72
-             258:   15(ivec4) Load 257
-             259:   93(ivec2) VectorShuffle 258 258 0 1
-             260:   93(ivec2) GroupNonUniformIMul 35 Reduce 259
-             261:     75(ptr) AccessChain 24(data) 25 254 72
-             262:   15(ivec4) Load 261
-             263:   15(ivec4) VectorShuffle 262 260 4 5 2 3
-                              Store 261 263
-             264:     27(ptr) AccessChain 10(dti) 26
-             265:      6(int) Load 264
-             266:     27(ptr) AccessChain 10(dti) 26
-             267:      6(int) Load 266
-             268:     75(ptr) AccessChain 24(data) 25 267 72
-             269:   15(ivec4) Load 268
-             270:  105(ivec3) VectorShuffle 269 269 0 1 2
-             271:  105(ivec3) GroupNonUniformIMul 35 Reduce 270
-             272:     75(ptr) AccessChain 24(data) 25 265 72
-             273:   15(ivec4) Load 272
-             274:   15(ivec4) VectorShuffle 273 271 4 5 6 3
-                              Store 272 274
+             249:     32(ptr) AccessChain 24(data) 25 248 25
+             250:   13(ivec4) Load 249
+             251:    7(ivec3) VectorShuffle 250 250 0 1 2
+             252:    7(ivec3) GroupNonUniformIMul 35 Reduce 251
+             253:     42(ptr) AccessChain 24(data) 25 246 25 26
+             254:      6(int) CompositeExtract 252 0
+                              Store 253 254
+             255:     42(ptr) AccessChain 24(data) 25 246 25 58
+             256:      6(int) CompositeExtract 252 1
+                              Store 255 256
+             257:     42(ptr) AccessChain 24(data) 25 246 25 73
+             258:      6(int) CompositeExtract 252 2
+                              Store 257 258
+             259:     27(ptr) AccessChain 10(dti) 26
+             260:      6(int) Load 259
+             261:     27(ptr) AccessChain 10(dti) 26
+             262:      6(int) Load 261
+             263:     81(ptr) AccessChain 24(data) 25 262 78
+             264:   15(ivec4) Load 263
+             265:   15(ivec4) GroupNonUniformIMul 35 Reduce 264
+             266:     81(ptr) AccessChain 24(data) 25 260 78
+                              Store 266 265
+             267:     27(ptr) AccessChain 10(dti) 26
+             268:      6(int) Load 267
+             269:     27(ptr) AccessChain 10(dti) 26
+             270:      6(int) Load 269
+             271:     90(ptr) AccessChain 24(data) 25 270 78 26
+             272:     14(int) Load 271
+             273:     14(int) GroupNonUniformIMul 35 Reduce 272
+             274:     90(ptr) AccessChain 24(data) 25 268 78 26
+                              Store 274 273
              275:     27(ptr) AccessChain 10(dti) 26
              276:      6(int) Load 275
              277:     27(ptr) AccessChain 10(dti) 26
              278:      6(int) Load 277
-             279:    118(ptr) AccessChain 24(data) 25 278 115
-             280:   17(fvec4) Load 279
-             281:   17(fvec4) GroupNonUniformFMul 35 Reduce 280
-             282:    118(ptr) AccessChain 24(data) 25 276 115
-                              Store 282 281
-             283:     27(ptr) AccessChain 10(dti) 26
-             284:      6(int) Load 283
-             285:     27(ptr) AccessChain 10(dti) 26
-             286:      6(int) Load 285
-             287:    127(ptr) AccessChain 24(data) 25 286 115 26
-             288:   16(float) Load 287
-             289:   16(float) GroupNonUniformFMul 35 Reduce 288
-             290:    127(ptr) AccessChain 24(data) 25 284 115 26
-                              Store 290 289
-             291:     27(ptr) AccessChain 10(dti) 26
-             292:      6(int) Load 291
-             293:     27(ptr) AccessChain 10(dti) 26
-             294:      6(int) Load 293
-             295:    118(ptr) AccessChain 24(data) 25 294 115
-             296:   17(fvec4) Load 295
-             297:  136(fvec2) VectorShuffle 296 296 0 1
-             298:  136(fvec2) GroupNonUniformFMul 35 Reduce 297
-             299:    118(ptr) AccessChain 24(data) 25 292 115
-             300:   17(fvec4) Load 299
-             301:   17(fvec4) VectorShuffle 300 298 4 5 2 3
-                              Store 299 301
-             302:     27(ptr) AccessChain 10(dti) 26
-             303:      6(int) Load 302
-             304:     27(ptr) AccessChain 10(dti) 26
-             305:      6(int) Load 304
-             306:    118(ptr) AccessChain 24(data) 25 305 115
-             307:   17(fvec4) Load 306
-             308:  148(fvec3) VectorShuffle 307 307 0 1 2
-             309:  148(fvec3) GroupNonUniformFMul 35 Reduce 308
-             310:    118(ptr) AccessChain 24(data) 25 303 115
-             311:   17(fvec4) Load 310
-             312:   17(fvec4) VectorShuffle 311 309 4 5 6 3
-                              Store 310 312
-             313:     27(ptr) AccessChain 10(dti) 26
-             314:      6(int) Load 313
-             315:     27(ptr) AccessChain 10(dti) 26
-             316:      6(int) Load 315
-             317:    161(ptr) AccessChain 24(data) 25 316 158
-             318: 19(f64vec4) Load 317
-             319: 19(f64vec4) GroupNonUniformFMul 35 Reduce 318
-             320:    161(ptr) AccessChain 24(data) 25 314 158
-                              Store 320 319
-             321:     27(ptr) AccessChain 10(dti) 26
-             322:      6(int) Load 321
-             323:     27(ptr) AccessChain 10(dti) 26
-             324:      6(int) Load 323
-             325:    170(ptr) AccessChain 24(data) 25 324 158 26
-             326:18(float64_t) Load 325
-             327:18(float64_t) GroupNonUniformFMul 35 Reduce 326
-             328:    170(ptr) AccessChain 24(data) 25 322 158 26
-                              Store 328 327
+             279:     81(ptr) AccessChain 24(data) 25 278 78
+             280:   15(ivec4) Load 279
+             281:   99(ivec2) VectorShuffle 280 280 0 1
+             282:   99(ivec2) GroupNonUniformIMul 35 Reduce 281
+             283:     90(ptr) AccessChain 24(data) 25 276 78 26
+             284:     14(int) CompositeExtract 282 0
+                              Store 283 284
+             285:     90(ptr) AccessChain 24(data) 25 276 78 58
+             286:     14(int) CompositeExtract 282 1
+                              Store 285 286
+             287:     27(ptr) AccessChain 10(dti) 26
+             288:      6(int) Load 287
+             289:     27(ptr) AccessChain 10(dti) 26
+             290:      6(int) Load 289
+             291:     81(ptr) AccessChain 24(data) 25 290 78
+             292:   15(ivec4) Load 291
+             293:  112(ivec3) VectorShuffle 292 292 0 1 2
+             294:  112(ivec3) GroupNonUniformIMul 35 Reduce 293
+             295:     90(ptr) AccessChain 24(data) 25 288 78 26
+             296:     14(int) CompositeExtract 294 0
+                              Store 295 296
+             297:     90(ptr) AccessChain 24(data) 25 288 78 58
+             298:     14(int) CompositeExtract 294 1
+                              Store 297 298
+             299:     90(ptr) AccessChain 24(data) 25 288 78 73
+             300:     14(int) CompositeExtract 294 2
+                              Store 299 300
+             301:     27(ptr) AccessChain 10(dti) 26
+             302:      6(int) Load 301
+             303:     27(ptr) AccessChain 10(dti) 26
+             304:      6(int) Load 303
+             305:    128(ptr) AccessChain 24(data) 25 304 125
+             306:   17(fvec4) Load 305
+             307:   17(fvec4) GroupNonUniformFMul 35 Reduce 306
+             308:    128(ptr) AccessChain 24(data) 25 302 125
+                              Store 308 307
+             309:     27(ptr) AccessChain 10(dti) 26
+             310:      6(int) Load 309
+             311:     27(ptr) AccessChain 10(dti) 26
+             312:      6(int) Load 311
+             313:    137(ptr) AccessChain 24(data) 25 312 125 26
+             314:   16(float) Load 313
+             315:   16(float) GroupNonUniformFMul 35 Reduce 314
+             316:    137(ptr) AccessChain 24(data) 25 310 125 26
+                              Store 316 315
+             317:     27(ptr) AccessChain 10(dti) 26
+             318:      6(int) Load 317
+             319:     27(ptr) AccessChain 10(dti) 26
+             320:      6(int) Load 319
+             321:    128(ptr) AccessChain 24(data) 25 320 125
+             322:   17(fvec4) Load 321
+             323:  146(fvec2) VectorShuffle 322 322 0 1
+             324:  146(fvec2) GroupNonUniformFMul 35 Reduce 323
+             325:    137(ptr) AccessChain 24(data) 25 318 125 26
+             326:   16(float) CompositeExtract 324 0
+                              Store 325 326
+             327:    137(ptr) AccessChain 24(data) 25 318 125 58
+             328:   16(float) CompositeExtract 324 1
+                              Store 327 328
              329:     27(ptr) AccessChain 10(dti) 26
              330:      6(int) Load 329
              331:     27(ptr) AccessChain 10(dti) 26
              332:      6(int) Load 331
-             333:    161(ptr) AccessChain 24(data) 25 332 158
-             334: 19(f64vec4) Load 333
-             335:179(f64vec2) VectorShuffle 334 334 0 1
-             336:179(f64vec2) GroupNonUniformFMul 35 Reduce 335
-             337:    161(ptr) AccessChain 24(data) 25 330 158
-             338: 19(f64vec4) Load 337
-             339: 19(f64vec4) VectorShuffle 338 336 4 5 2 3
-                              Store 337 339
-             340:     27(ptr) AccessChain 10(dti) 26
-             341:      6(int) Load 340
-             342:     27(ptr) AccessChain 10(dti) 26
-             343:      6(int) Load 342
-             344:    161(ptr) AccessChain 24(data) 25 343 158
-             345: 19(f64vec4) Load 344
-             346:191(f64vec3) VectorShuffle 345 345 0 1 2
-             347:191(f64vec3) GroupNonUniformFMul 35 Reduce 346
-             348:    161(ptr) AccessChain 24(data) 25 341 158
-             349: 19(f64vec4) Load 348
-             350: 19(f64vec4) VectorShuffle 349 347 4 5 6 3
-                              Store 348 350
+             333:    128(ptr) AccessChain 24(data) 25 332 125
+             334:   17(fvec4) Load 333
+             335:  159(fvec3) VectorShuffle 334 334 0 1 2
+             336:  159(fvec3) GroupNonUniformFMul 35 Reduce 335
+             337:    137(ptr) AccessChain 24(data) 25 330 125 26
+             338:   16(float) CompositeExtract 336 0
+                              Store 337 338
+             339:    137(ptr) AccessChain 24(data) 25 330 125 58
+             340:   16(float) CompositeExtract 336 1
+                              Store 339 340
+             341:    137(ptr) AccessChain 24(data) 25 330 125 73
+             342:   16(float) CompositeExtract 336 2
+                              Store 341 342
+             343:     27(ptr) AccessChain 10(dti) 26
+             344:      6(int) Load 343
+             345:     27(ptr) AccessChain 10(dti) 26
+             346:      6(int) Load 345
+             347:    175(ptr) AccessChain 24(data) 25 346 172
+             348: 19(f64vec4) Load 347
+             349: 19(f64vec4) GroupNonUniformFMul 35 Reduce 348
+             350:    175(ptr) AccessChain 24(data) 25 344 172
+                              Store 350 349
              351:     27(ptr) AccessChain 10(dti) 26
              352:      6(int) Load 351
              353:     27(ptr) AccessChain 10(dti) 26
              354:      6(int) Load 353
-             355:     32(ptr) AccessChain 24(data) 25 354 25
-             356:   13(ivec4) Load 355
-             357:   13(ivec4) GroupNonUniformUMin 35 Reduce 356
-             358:     32(ptr) AccessChain 24(data) 25 352 25
+             355:    184(ptr) AccessChain 24(data) 25 354 172 26
+             356:18(float64_t) Load 355
+             357:18(float64_t) GroupNonUniformFMul 35 Reduce 356
+             358:    184(ptr) AccessChain 24(data) 25 352 172 26
                               Store 358 357
              359:     27(ptr) AccessChain 10(dti) 26
              360:      6(int) Load 359
              361:     27(ptr) AccessChain 10(dti) 26
              362:      6(int) Load 361
-             363:     42(ptr) AccessChain 24(data) 25 362 25 26
-             364:      6(int) Load 363
-             365:      6(int) GroupNonUniformUMin 35 Reduce 364
-             366:     42(ptr) AccessChain 24(data) 25 360 25 26
-                              Store 366 365
-             367:     27(ptr) AccessChain 10(dti) 26
-             368:      6(int) Load 367
-             369:     27(ptr) AccessChain 10(dti) 26
-             370:      6(int) Load 369
-             371:     32(ptr) AccessChain 24(data) 25 370 25
-             372:   13(ivec4) Load 371
-             373:   51(ivec2) VectorShuffle 372 372 0 1
-             374:   51(ivec2) GroupNonUniformUMin 35 Reduce 373
-             375:     32(ptr) AccessChain 24(data) 25 368 25
-             376:   13(ivec4) Load 375
-             377:   13(ivec4) VectorShuffle 376 374 4 5 2 3
-                              Store 375 377
-             378:     27(ptr) AccessChain 10(dti) 26
-             379:      6(int) Load 378
-             380:     27(ptr) AccessChain 10(dti) 26
-             381:      6(int) Load 380
-             382:     32(ptr) AccessChain 24(data) 25 381 25
-             383:   13(ivec4) Load 382
-             384:    7(ivec3) VectorShuffle 383 383 0 1 2
-             385:    7(ivec3) GroupNonUniformUMin 35 Reduce 384
-             386:     32(ptr) AccessChain 24(data) 25 379 25
-             387:   13(ivec4) Load 386
-             388:   13(ivec4) VectorShuffle 387 385 4 5 6 3
-                              Store 386 388
-             389:     27(ptr) AccessChain 10(dti) 26
-             390:      6(int) Load 389
-             391:     27(ptr) AccessChain 10(dti) 26
-             392:      6(int) Load 391
-             393:     75(ptr) AccessChain 24(data) 25 392 72
-             394:   15(ivec4) Load 393
-             395:   15(ivec4) GroupNonUniformSMin 35 Reduce 394
-             396:     75(ptr) AccessChain 24(data) 25 390 72
-                              Store 396 395
-             397:     27(ptr) AccessChain 10(dti) 26
+             363:    175(ptr) AccessChain 24(data) 25 362 172
+             364: 19(f64vec4) Load 363
+             365:193(f64vec2) VectorShuffle 364 364 0 1
+             366:193(f64vec2) GroupNonUniformFMul 35 Reduce 365
+             367:    184(ptr) AccessChain 24(data) 25 360 172 26
+             368:18(float64_t) CompositeExtract 366 0
+                              Store 367 368
+             369:    184(ptr) AccessChain 24(data) 25 360 172 58
+             370:18(float64_t) CompositeExtract 366 1
+                              Store 369 370
+             371:     27(ptr) AccessChain 10(dti) 26
+             372:      6(int) Load 371
+             373:     27(ptr) AccessChain 10(dti) 26
+             374:      6(int) Load 373
+             375:    175(ptr) AccessChain 24(data) 25 374 172
+             376: 19(f64vec4) Load 375
+             377:206(f64vec3) VectorShuffle 376 376 0 1 2
+             378:206(f64vec3) GroupNonUniformFMul 35 Reduce 377
+             379:    184(ptr) AccessChain 24(data) 25 372 172 26
+             380:18(float64_t) CompositeExtract 378 0
+                              Store 379 380
+             381:    184(ptr) AccessChain 24(data) 25 372 172 58
+             382:18(float64_t) CompositeExtract 378 1
+                              Store 381 382
+             383:    184(ptr) AccessChain 24(data) 25 372 172 73
+             384:18(float64_t) CompositeExtract 378 2
+                              Store 383 384
+             385:     27(ptr) AccessChain 10(dti) 26
+             386:      6(int) Load 385
+             387:     27(ptr) AccessChain 10(dti) 26
+             388:      6(int) Load 387
+             389:     32(ptr) AccessChain 24(data) 25 388 25
+             390:   13(ivec4) Load 389
+             391:   13(ivec4) GroupNonUniformUMin 35 Reduce 390
+             392:     32(ptr) AccessChain 24(data) 25 386 25
+                              Store 392 391
+             393:     27(ptr) AccessChain 10(dti) 26
+             394:      6(int) Load 393
+             395:     27(ptr) AccessChain 10(dti) 26
+             396:      6(int) Load 395
+             397:     42(ptr) AccessChain 24(data) 25 396 25 26
              398:      6(int) Load 397
-             399:     27(ptr) AccessChain 10(dti) 26
-             400:      6(int) Load 399
-             401:     84(ptr) AccessChain 24(data) 25 400 72 26
-             402:     14(int) Load 401
-             403:     14(int) GroupNonUniformSMin 35 Reduce 402
-             404:     84(ptr) AccessChain 24(data) 25 398 72 26
-                              Store 404 403
-             405:     27(ptr) AccessChain 10(dti) 26
-             406:      6(int) Load 405
-             407:     27(ptr) AccessChain 10(dti) 26
-             408:      6(int) Load 407
-             409:     75(ptr) AccessChain 24(data) 25 408 72
-             410:   15(ivec4) Load 409
-             411:   93(ivec2) VectorShuffle 410 410 0 1
-             412:   93(ivec2) GroupNonUniformSMin 35 Reduce 411
-             413:     75(ptr) AccessChain 24(data) 25 406 72
-             414:   15(ivec4) Load 413
-             415:   15(ivec4) VectorShuffle 414 412 4 5 2 3
-                              Store 413 415
-             416:     27(ptr) AccessChain 10(dti) 26
-             417:      6(int) Load 416
-             418:     27(ptr) AccessChain 10(dti) 26
-             419:      6(int) Load 418
-             420:     75(ptr) AccessChain 24(data) 25 419 72
-             421:   15(ivec4) Load 420
-             422:  105(ivec3) VectorShuffle 421 421 0 1 2
-             423:  105(ivec3) GroupNonUniformSMin 35 Reduce 422
-             424:     75(ptr) AccessChain 24(data) 25 417 72
-             425:   15(ivec4) Load 424
-             426:   15(ivec4) VectorShuffle 425 423 4 5 6 3
-                              Store 424 426
+             399:      6(int) GroupNonUniformUMin 35 Reduce 398
+             400:     42(ptr) AccessChain 24(data) 25 394 25 26
+                              Store 400 399
+             401:     27(ptr) AccessChain 10(dti) 26
+             402:      6(int) Load 401
+             403:     27(ptr) AccessChain 10(dti) 26
+             404:      6(int) Load 403
+             405:     32(ptr) AccessChain 24(data) 25 404 25
+             406:   13(ivec4) Load 405
+             407:   51(ivec2) VectorShuffle 406 406 0 1
+             408:   51(ivec2) GroupNonUniformUMin 35 Reduce 407
+             409:     42(ptr) AccessChain 24(data) 25 402 25 26
+             410:      6(int) CompositeExtract 408 0
+                              Store 409 410
+             411:     42(ptr) AccessChain 24(data) 25 402 25 58
+             412:      6(int) CompositeExtract 408 1
+                              Store 411 412
+             413:     27(ptr) AccessChain 10(dti) 26
+             414:      6(int) Load 413
+             415:     27(ptr) AccessChain 10(dti) 26
+             416:      6(int) Load 415
+             417:     32(ptr) AccessChain 24(data) 25 416 25
+             418:   13(ivec4) Load 417
+             419:    7(ivec3) VectorShuffle 418 418 0 1 2
+             420:    7(ivec3) GroupNonUniformUMin 35 Reduce 419
+             421:     42(ptr) AccessChain 24(data) 25 414 25 26
+             422:      6(int) CompositeExtract 420 0
+                              Store 421 422
+             423:     42(ptr) AccessChain 24(data) 25 414 25 58
+             424:      6(int) CompositeExtract 420 1
+                              Store 423 424
+             425:     42(ptr) AccessChain 24(data) 25 414 25 73
+             426:      6(int) CompositeExtract 420 2
+                              Store 425 426
              427:     27(ptr) AccessChain 10(dti) 26
              428:      6(int) Load 427
              429:     27(ptr) AccessChain 10(dti) 26
              430:      6(int) Load 429
-             431:    118(ptr) AccessChain 24(data) 25 430 115
-             432:   17(fvec4) Load 431
-             433:   17(fvec4) GroupNonUniformFMin 35 Reduce 432
-             434:    118(ptr) AccessChain 24(data) 25 428 115
+             431:     81(ptr) AccessChain 24(data) 25 430 78
+             432:   15(ivec4) Load 431
+             433:   15(ivec4) GroupNonUniformSMin 35 Reduce 432
+             434:     81(ptr) AccessChain 24(data) 25 428 78
                               Store 434 433
              435:     27(ptr) AccessChain 10(dti) 26
              436:      6(int) Load 435
              437:     27(ptr) AccessChain 10(dti) 26
              438:      6(int) Load 437
-             439:    127(ptr) AccessChain 24(data) 25 438 115 26
-             440:   16(float) Load 439
-             441:   16(float) GroupNonUniformFMin 35 Reduce 440
-             442:    127(ptr) AccessChain 24(data) 25 436 115 26
+             439:     90(ptr) AccessChain 24(data) 25 438 78 26
+             440:     14(int) Load 439
+             441:     14(int) GroupNonUniformSMin 35 Reduce 440
+             442:     90(ptr) AccessChain 24(data) 25 436 78 26
                               Store 442 441
              443:     27(ptr) AccessChain 10(dti) 26
              444:      6(int) Load 443
              445:     27(ptr) AccessChain 10(dti) 26
              446:      6(int) Load 445
-             447:    118(ptr) AccessChain 24(data) 25 446 115
-             448:   17(fvec4) Load 447
-             449:  136(fvec2) VectorShuffle 448 448 0 1
-             450:  136(fvec2) GroupNonUniformFMin 35 Reduce 449
-             451:    118(ptr) AccessChain 24(data) 25 444 115
-             452:   17(fvec4) Load 451
-             453:   17(fvec4) VectorShuffle 452 450 4 5 2 3
-                              Store 451 453
-             454:     27(ptr) AccessChain 10(dti) 26
-             455:      6(int) Load 454
-             456:     27(ptr) AccessChain 10(dti) 26
-             457:      6(int) Load 456
-             458:    118(ptr) AccessChain 24(data) 25 457 115
-             459:   17(fvec4) Load 458
-             460:  148(fvec3) VectorShuffle 459 459 0 1 2
-             461:  148(fvec3) GroupNonUniformFMin 35 Reduce 460
-             462:    118(ptr) AccessChain 24(data) 25 455 115
-             463:   17(fvec4) Load 462
-             464:   17(fvec4) VectorShuffle 463 461 4 5 6 3
-                              Store 462 464
-             465:     27(ptr) AccessChain 10(dti) 26
-             466:      6(int) Load 465
-             467:     27(ptr) AccessChain 10(dti) 26
-             468:      6(int) Load 467
-             469:    161(ptr) AccessChain 24(data) 25 468 158
-             470: 19(f64vec4) Load 469
-             471: 19(f64vec4) GroupNonUniformFMin 35 Reduce 470
-             472:    161(ptr) AccessChain 24(data) 25 466 158
-                              Store 472 471
-             473:     27(ptr) AccessChain 10(dti) 26
-             474:      6(int) Load 473
-             475:     27(ptr) AccessChain 10(dti) 26
-             476:      6(int) Load 475
-             477:    170(ptr) AccessChain 24(data) 25 476 158 26
-             478:18(float64_t) Load 477
-             479:18(float64_t) GroupNonUniformFMin 35 Reduce 478
-             480:    170(ptr) AccessChain 24(data) 25 474 158 26
-                              Store 480 479
-             481:     27(ptr) AccessChain 10(dti) 26
-             482:      6(int) Load 481
-             483:     27(ptr) AccessChain 10(dti) 26
-             484:      6(int) Load 483
-             485:    161(ptr) AccessChain 24(data) 25 484 158
-             486: 19(f64vec4) Load 485
-             487:179(f64vec2) VectorShuffle 486 486 0 1
-             488:179(f64vec2) GroupNonUniformFMin 35 Reduce 487
-             489:    161(ptr) AccessChain 24(data) 25 482 158
-             490: 19(f64vec4) Load 489
-             491: 19(f64vec4) VectorShuffle 490 488 4 5 2 3
-                              Store 489 491
-             492:     27(ptr) AccessChain 10(dti) 26
-             493:      6(int) Load 492
-             494:     27(ptr) AccessChain 10(dti) 26
-             495:      6(int) Load 494
-             496:    161(ptr) AccessChain 24(data) 25 495 158
-             497: 19(f64vec4) Load 496
-             498:191(f64vec3) VectorShuffle 497 497 0 1 2
-             499:191(f64vec3) GroupNonUniformFMin 35 Reduce 498
-             500:    161(ptr) AccessChain 24(data) 25 493 158
-             501: 19(f64vec4) Load 500
-             502: 19(f64vec4) VectorShuffle 501 499 4 5 6 3
-                              Store 500 502
-             503:     27(ptr) AccessChain 10(dti) 26
-             504:      6(int) Load 503
-             505:     27(ptr) AccessChain 10(dti) 26
-             506:      6(int) Load 505
-             507:     32(ptr) AccessChain 24(data) 25 506 25
-             508:   13(ivec4) Load 507
-             509:   13(ivec4) GroupNonUniformUMax 35 Reduce 508
-             510:     32(ptr) AccessChain 24(data) 25 504 25
-                              Store 510 509
+             447:     81(ptr) AccessChain 24(data) 25 446 78
+             448:   15(ivec4) Load 447
+             449:   99(ivec2) VectorShuffle 448 448 0 1
+             450:   99(ivec2) GroupNonUniformSMin 35 Reduce 449
+             451:     90(ptr) AccessChain 24(data) 25 444 78 26
+             452:     14(int) CompositeExtract 450 0
+                              Store 451 452
+             453:     90(ptr) AccessChain 24(data) 25 444 78 58
+             454:     14(int) CompositeExtract 450 1
+                              Store 453 454
+             455:     27(ptr) AccessChain 10(dti) 26
+             456:      6(int) Load 455
+             457:     27(ptr) AccessChain 10(dti) 26
+             458:      6(int) Load 457
+             459:     81(ptr) AccessChain 24(data) 25 458 78
+             460:   15(ivec4) Load 459
+             461:  112(ivec3) VectorShuffle 460 460 0 1 2
+             462:  112(ivec3) GroupNonUniformSMin 35 Reduce 461
+             463:     90(ptr) AccessChain 24(data) 25 456 78 26
+             464:     14(int) CompositeExtract 462 0
+                              Store 463 464
+             465:     90(ptr) AccessChain 24(data) 25 456 78 58
+             466:     14(int) CompositeExtract 462 1
+                              Store 465 466
+             467:     90(ptr) AccessChain 24(data) 25 456 78 73
+             468:     14(int) CompositeExtract 462 2
+                              Store 467 468
+             469:     27(ptr) AccessChain 10(dti) 26
+             470:      6(int) Load 469
+             471:     27(ptr) AccessChain 10(dti) 26
+             472:      6(int) Load 471
+             473:    128(ptr) AccessChain 24(data) 25 472 125
+             474:   17(fvec4) Load 473
+             475:   17(fvec4) GroupNonUniformFMin 35 Reduce 474
+             476:    128(ptr) AccessChain 24(data) 25 470 125
+                              Store 476 475
+             477:     27(ptr) AccessChain 10(dti) 26
+             478:      6(int) Load 477
+             479:     27(ptr) AccessChain 10(dti) 26
+             480:      6(int) Load 479
+             481:    137(ptr) AccessChain 24(data) 25 480 125 26
+             482:   16(float) Load 481
+             483:   16(float) GroupNonUniformFMin 35 Reduce 482
+             484:    137(ptr) AccessChain 24(data) 25 478 125 26
+                              Store 484 483
+             485:     27(ptr) AccessChain 10(dti) 26
+             486:      6(int) Load 485
+             487:     27(ptr) AccessChain 10(dti) 26
+             488:      6(int) Load 487
+             489:    128(ptr) AccessChain 24(data) 25 488 125
+             490:   17(fvec4) Load 489
+             491:  146(fvec2) VectorShuffle 490 490 0 1
+             492:  146(fvec2) GroupNonUniformFMin 35 Reduce 491
+             493:    137(ptr) AccessChain 24(data) 25 486 125 26
+             494:   16(float) CompositeExtract 492 0
+                              Store 493 494
+             495:    137(ptr) AccessChain 24(data) 25 486 125 58
+             496:   16(float) CompositeExtract 492 1
+                              Store 495 496
+             497:     27(ptr) AccessChain 10(dti) 26
+             498:      6(int) Load 497
+             499:     27(ptr) AccessChain 10(dti) 26
+             500:      6(int) Load 499
+             501:    128(ptr) AccessChain 24(data) 25 500 125
+             502:   17(fvec4) Load 501
+             503:  159(fvec3) VectorShuffle 502 502 0 1 2
+             504:  159(fvec3) GroupNonUniformFMin 35 Reduce 503
+             505:    137(ptr) AccessChain 24(data) 25 498 125 26
+             506:   16(float) CompositeExtract 504 0
+                              Store 505 506
+             507:    137(ptr) AccessChain 24(data) 25 498 125 58
+             508:   16(float) CompositeExtract 504 1
+                              Store 507 508
+             509:    137(ptr) AccessChain 24(data) 25 498 125 73
+             510:   16(float) CompositeExtract 504 2
+                              Store 509 510
              511:     27(ptr) AccessChain 10(dti) 26
              512:      6(int) Load 511
              513:     27(ptr) AccessChain 10(dti) 26
              514:      6(int) Load 513
-             515:     42(ptr) AccessChain 24(data) 25 514 25 26
-             516:      6(int) Load 515
-             517:      6(int) GroupNonUniformUMax 35 Reduce 516
-             518:     42(ptr) AccessChain 24(data) 25 512 25 26
+             515:    175(ptr) AccessChain 24(data) 25 514 172
+             516: 19(f64vec4) Load 515
+             517: 19(f64vec4) GroupNonUniformFMin 35 Reduce 516
+             518:    175(ptr) AccessChain 24(data) 25 512 172
                               Store 518 517
              519:     27(ptr) AccessChain 10(dti) 26
              520:      6(int) Load 519
              521:     27(ptr) AccessChain 10(dti) 26
              522:      6(int) Load 521
-             523:     32(ptr) AccessChain 24(data) 25 522 25
-             524:   13(ivec4) Load 523
-             525:   51(ivec2) VectorShuffle 524 524 0 1
-             526:   51(ivec2) GroupNonUniformUMax 35 Reduce 525
-             527:     32(ptr) AccessChain 24(data) 25 520 25
-             528:   13(ivec4) Load 527
-             529:   13(ivec4) VectorShuffle 528 526 4 5 2 3
-                              Store 527 529
-             530:     27(ptr) AccessChain 10(dti) 26
-             531:      6(int) Load 530
-             532:     27(ptr) AccessChain 10(dti) 26
-             533:      6(int) Load 532
-             534:     32(ptr) AccessChain 24(data) 25 533 25
-             535:   13(ivec4) Load 534
-             536:    7(ivec3) VectorShuffle 535 535 0 1 2
-             537:    7(ivec3) GroupNonUniformUMax 35 Reduce 536
-             538:     32(ptr) AccessChain 24(data) 25 531 25
-             539:   13(ivec4) Load 538
-             540:   13(ivec4) VectorShuffle 539 537 4 5 6 3
-                              Store 538 540
+             523:    184(ptr) AccessChain 24(data) 25 522 172 26
+             524:18(float64_t) Load 523
+             525:18(float64_t) GroupNonUniformFMin 35 Reduce 524
+             526:    184(ptr) AccessChain 24(data) 25 520 172 26
+                              Store 526 525
+             527:     27(ptr) AccessChain 10(dti) 26
+             528:      6(int) Load 527
+             529:     27(ptr) AccessChain 10(dti) 26
+             530:      6(int) Load 529
+             531:    175(ptr) AccessChain 24(data) 25 530 172
+             532: 19(f64vec4) Load 531
+             533:193(f64vec2) VectorShuffle 532 532 0 1
+             534:193(f64vec2) GroupNonUniformFMin 35 Reduce 533
+             535:    184(ptr) AccessChain 24(data) 25 528 172 26
+             536:18(float64_t) CompositeExtract 534 0
+                              Store 535 536
+             537:    184(ptr) AccessChain 24(data) 25 528 172 58
+             538:18(float64_t) CompositeExtract 534 1
+                              Store 537 538
+             539:     27(ptr) AccessChain 10(dti) 26
+             540:      6(int) Load 539
              541:     27(ptr) AccessChain 10(dti) 26
              542:      6(int) Load 541
-             543:     27(ptr) AccessChain 10(dti) 26
-             544:      6(int) Load 543
-             545:     75(ptr) AccessChain 24(data) 25 544 72
-             546:   15(ivec4) Load 545
-             547:   15(ivec4) GroupNonUniformSMax 35 Reduce 546
-             548:     75(ptr) AccessChain 24(data) 25 542 72
-                              Store 548 547
-             549:     27(ptr) AccessChain 10(dti) 26
-             550:      6(int) Load 549
-             551:     27(ptr) AccessChain 10(dti) 26
-             552:      6(int) Load 551
-             553:     84(ptr) AccessChain 24(data) 25 552 72 26
-             554:     14(int) Load 553
-             555:     14(int) GroupNonUniformSMax 35 Reduce 554
-             556:     84(ptr) AccessChain 24(data) 25 550 72 26
-                              Store 556 555
-             557:     27(ptr) AccessChain 10(dti) 26
-             558:      6(int) Load 557
-             559:     27(ptr) AccessChain 10(dti) 26
-             560:      6(int) Load 559
-             561:     75(ptr) AccessChain 24(data) 25 560 72
-             562:   15(ivec4) Load 561
-             563:   93(ivec2) VectorShuffle 562 562 0 1
-             564:   93(ivec2) GroupNonUniformSMax 35 Reduce 563
-             565:     75(ptr) AccessChain 24(data) 25 558 72
-             566:   15(ivec4) Load 565
-             567:   15(ivec4) VectorShuffle 566 564 4 5 2 3
-                              Store 565 567
-             568:     27(ptr) AccessChain 10(dti) 26
-             569:      6(int) Load 568
-             570:     27(ptr) AccessChain 10(dti) 26
-             571:      6(int) Load 570
-             572:     75(ptr) AccessChain 24(data) 25 571 72
-             573:   15(ivec4) Load 572
-             574:  105(ivec3) VectorShuffle 573 573 0 1 2
-             575:  105(ivec3) GroupNonUniformSMax 35 Reduce 574
-             576:     75(ptr) AccessChain 24(data) 25 569 72
-             577:   15(ivec4) Load 576
-             578:   15(ivec4) VectorShuffle 577 575 4 5 6 3
-                              Store 576 578
-             579:     27(ptr) AccessChain 10(dti) 26
-             580:      6(int) Load 579
+             543:    175(ptr) AccessChain 24(data) 25 542 172
+             544: 19(f64vec4) Load 543
+             545:206(f64vec3) VectorShuffle 544 544 0 1 2
+             546:206(f64vec3) GroupNonUniformFMin 35 Reduce 545
+             547:    184(ptr) AccessChain 24(data) 25 540 172 26
+             548:18(float64_t) CompositeExtract 546 0
+                              Store 547 548
+             549:    184(ptr) AccessChain 24(data) 25 540 172 58
+             550:18(float64_t) CompositeExtract 546 1
+                              Store 549 550
+             551:    184(ptr) AccessChain 24(data) 25 540 172 73
+             552:18(float64_t) CompositeExtract 546 2
+                              Store 551 552
+             553:     27(ptr) AccessChain 10(dti) 26
+             554:      6(int) Load 553
+             555:     27(ptr) AccessChain 10(dti) 26
+             556:      6(int) Load 555
+             557:     32(ptr) AccessChain 24(data) 25 556 25
+             558:   13(ivec4) Load 557
+             559:   13(ivec4) GroupNonUniformUMax 35 Reduce 558
+             560:     32(ptr) AccessChain 24(data) 25 554 25
+                              Store 560 559
+             561:     27(ptr) AccessChain 10(dti) 26
+             562:      6(int) Load 561
+             563:     27(ptr) AccessChain 10(dti) 26
+             564:      6(int) Load 563
+             565:     42(ptr) AccessChain 24(data) 25 564 25 26
+             566:      6(int) Load 565
+             567:      6(int) GroupNonUniformUMax 35 Reduce 566
+             568:     42(ptr) AccessChain 24(data) 25 562 25 26
+                              Store 568 567
+             569:     27(ptr) AccessChain 10(dti) 26
+             570:      6(int) Load 569
+             571:     27(ptr) AccessChain 10(dti) 26
+             572:      6(int) Load 571
+             573:     32(ptr) AccessChain 24(data) 25 572 25
+             574:   13(ivec4) Load 573
+             575:   51(ivec2) VectorShuffle 574 574 0 1
+             576:   51(ivec2) GroupNonUniformUMax 35 Reduce 575
+             577:     42(ptr) AccessChain 24(data) 25 570 25 26
+             578:      6(int) CompositeExtract 576 0
+                              Store 577 578
+             579:     42(ptr) AccessChain 24(data) 25 570 25 58
+             580:      6(int) CompositeExtract 576 1
+                              Store 579 580
              581:     27(ptr) AccessChain 10(dti) 26
              582:      6(int) Load 581
-             583:    118(ptr) AccessChain 24(data) 25 582 115
-             584:   17(fvec4) Load 583
-             585:   17(fvec4) GroupNonUniformFMax 35 Reduce 584
-             586:    118(ptr) AccessChain 24(data) 25 580 115
-                              Store 586 585
-             587:     27(ptr) AccessChain 10(dti) 26
-             588:      6(int) Load 587
-             589:     27(ptr) AccessChain 10(dti) 26
-             590:      6(int) Load 589
-             591:    127(ptr) AccessChain 24(data) 25 590 115 26
-             592:   16(float) Load 591
-             593:   16(float) GroupNonUniformFMax 35 Reduce 592
-             594:    127(ptr) AccessChain 24(data) 25 588 115 26
-                              Store 594 593
+             583:     27(ptr) AccessChain 10(dti) 26
+             584:      6(int) Load 583
+             585:     32(ptr) AccessChain 24(data) 25 584 25
+             586:   13(ivec4) Load 585
+             587:    7(ivec3) VectorShuffle 586 586 0 1 2
+             588:    7(ivec3) GroupNonUniformUMax 35 Reduce 587
+             589:     42(ptr) AccessChain 24(data) 25 582 25 26
+             590:      6(int) CompositeExtract 588 0
+                              Store 589 590
+             591:     42(ptr) AccessChain 24(data) 25 582 25 58
+             592:      6(int) CompositeExtract 588 1
+                              Store 591 592
+             593:     42(ptr) AccessChain 24(data) 25 582 25 73
+             594:      6(int) CompositeExtract 588 2
+                              Store 593 594
              595:     27(ptr) AccessChain 10(dti) 26
              596:      6(int) Load 595
              597:     27(ptr) AccessChain 10(dti) 26
              598:      6(int) Load 597
-             599:    118(ptr) AccessChain 24(data) 25 598 115
-             600:   17(fvec4) Load 599
-             601:  136(fvec2) VectorShuffle 600 600 0 1
-             602:  136(fvec2) GroupNonUniformFMax 35 Reduce 601
-             603:    118(ptr) AccessChain 24(data) 25 596 115
-             604:   17(fvec4) Load 603
-             605:   17(fvec4) VectorShuffle 604 602 4 5 2 3
-                              Store 603 605
-             606:     27(ptr) AccessChain 10(dti) 26
-             607:      6(int) Load 606
-             608:     27(ptr) AccessChain 10(dti) 26
-             609:      6(int) Load 608
-             610:    118(ptr) AccessChain 24(data) 25 609 115
-             611:   17(fvec4) Load 610
-             612:  148(fvec3) VectorShuffle 611 611 0 1 2
-             613:  148(fvec3) GroupNonUniformFMax 35 Reduce 612
-             614:    118(ptr) AccessChain 24(data) 25 607 115
-             615:   17(fvec4) Load 614
-             616:   17(fvec4) VectorShuffle 615 613 4 5 6 3
-                              Store 614 616
-             617:     27(ptr) AccessChain 10(dti) 26
-             618:      6(int) Load 617
-             619:     27(ptr) AccessChain 10(dti) 26
-             620:      6(int) Load 619
-             621:    161(ptr) AccessChain 24(data) 25 620 158
-             622: 19(f64vec4) Load 621
-             623: 19(f64vec4) GroupNonUniformFMax 35 Reduce 622
-             624:    161(ptr) AccessChain 24(data) 25 618 158
-                              Store 624 623
+             599:     81(ptr) AccessChain 24(data) 25 598 78
+             600:   15(ivec4) Load 599
+             601:   15(ivec4) GroupNonUniformSMax 35 Reduce 600
+             602:     81(ptr) AccessChain 24(data) 25 596 78
+                              Store 602 601
+             603:     27(ptr) AccessChain 10(dti) 26
+             604:      6(int) Load 603
+             605:     27(ptr) AccessChain 10(dti) 26
+             606:      6(int) Load 605
+             607:     90(ptr) AccessChain 24(data) 25 606 78 26
+             608:     14(int) Load 607
+             609:     14(int) GroupNonUniformSMax 35 Reduce 608
+             610:     90(ptr) AccessChain 24(data) 25 604 78 26
+                              Store 610 609
+             611:     27(ptr) AccessChain 10(dti) 26
+             612:      6(int) Load 611
+             613:     27(ptr) AccessChain 10(dti) 26
+             614:      6(int) Load 613
+             615:     81(ptr) AccessChain 24(data) 25 614 78
+             616:   15(ivec4) Load 615
+             617:   99(ivec2) VectorShuffle 616 616 0 1
+             618:   99(ivec2) GroupNonUniformSMax 35 Reduce 617
+             619:     90(ptr) AccessChain 24(data) 25 612 78 26
+             620:     14(int) CompositeExtract 618 0
+                              Store 619 620
+             621:     90(ptr) AccessChain 24(data) 25 612 78 58
+             622:     14(int) CompositeExtract 618 1
+                              Store 621 622
+             623:     27(ptr) AccessChain 10(dti) 26
+             624:      6(int) Load 623
              625:     27(ptr) AccessChain 10(dti) 26
              626:      6(int) Load 625
-             627:     27(ptr) AccessChain 10(dti) 26
-             628:      6(int) Load 627
-             629:    170(ptr) AccessChain 24(data) 25 628 158 26
-             630:18(float64_t) Load 629
-             631:18(float64_t) GroupNonUniformFMax 35 Reduce 630
-             632:    170(ptr) AccessChain 24(data) 25 626 158 26
-                              Store 632 631
-             633:     27(ptr) AccessChain 10(dti) 26
-             634:      6(int) Load 633
-             635:     27(ptr) AccessChain 10(dti) 26
-             636:      6(int) Load 635
-             637:    161(ptr) AccessChain 24(data) 25 636 158
-             638: 19(f64vec4) Load 637
-             639:179(f64vec2) VectorShuffle 638 638 0 1
-             640:179(f64vec2) GroupNonUniformFMax 35 Reduce 639
-             641:    161(ptr) AccessChain 24(data) 25 634 158
-             642: 19(f64vec4) Load 641
-             643: 19(f64vec4) VectorShuffle 642 640 4 5 2 3
-                              Store 641 643
-             644:     27(ptr) AccessChain 10(dti) 26
-             645:      6(int) Load 644
-             646:     27(ptr) AccessChain 10(dti) 26
-             647:      6(int) Load 646
-             648:    161(ptr) AccessChain 24(data) 25 647 158
-             649: 19(f64vec4) Load 648
-             650:191(f64vec3) VectorShuffle 649 649 0 1 2
-             651:191(f64vec3) GroupNonUniformFMax 35 Reduce 650
-             652:    161(ptr) AccessChain 24(data) 25 645 158
-             653: 19(f64vec4) Load 652
-             654: 19(f64vec4) VectorShuffle 653 651 4 5 6 3
-                              Store 652 654
+             627:     81(ptr) AccessChain 24(data) 25 626 78
+             628:   15(ivec4) Load 627
+             629:  112(ivec3) VectorShuffle 628 628 0 1 2
+             630:  112(ivec3) GroupNonUniformSMax 35 Reduce 629
+             631:     90(ptr) AccessChain 24(data) 25 624 78 26
+             632:     14(int) CompositeExtract 630 0
+                              Store 631 632
+             633:     90(ptr) AccessChain 24(data) 25 624 78 58
+             634:     14(int) CompositeExtract 630 1
+                              Store 633 634
+             635:     90(ptr) AccessChain 24(data) 25 624 78 73
+             636:     14(int) CompositeExtract 630 2
+                              Store 635 636
+             637:     27(ptr) AccessChain 10(dti) 26
+             638:      6(int) Load 637
+             639:     27(ptr) AccessChain 10(dti) 26
+             640:      6(int) Load 639
+             641:    128(ptr) AccessChain 24(data) 25 640 125
+             642:   17(fvec4) Load 641
+             643:   17(fvec4) GroupNonUniformFMax 35 Reduce 642
+             644:    128(ptr) AccessChain 24(data) 25 638 125
+                              Store 644 643
+             645:     27(ptr) AccessChain 10(dti) 26
+             646:      6(int) Load 645
+             647:     27(ptr) AccessChain 10(dti) 26
+             648:      6(int) Load 647
+             649:    137(ptr) AccessChain 24(data) 25 648 125 26
+             650:   16(float) Load 649
+             651:   16(float) GroupNonUniformFMax 35 Reduce 650
+             652:    137(ptr) AccessChain 24(data) 25 646 125 26
+                              Store 652 651
+             653:     27(ptr) AccessChain 10(dti) 26
+             654:      6(int) Load 653
              655:     27(ptr) AccessChain 10(dti) 26
              656:      6(int) Load 655
-             657:     27(ptr) AccessChain 10(dti) 26
-             658:      6(int) Load 657
-             659:     32(ptr) AccessChain 24(data) 25 658 25
-             660:   13(ivec4) Load 659
-             661:   13(ivec4) GroupNonUniformBitwiseAnd 35 Reduce 660
-             662:     32(ptr) AccessChain 24(data) 25 656 25
-                              Store 662 661
-             663:     27(ptr) AccessChain 10(dti) 26
-             664:      6(int) Load 663
+             657:    128(ptr) AccessChain 24(data) 25 656 125
+             658:   17(fvec4) Load 657
+             659:  146(fvec2) VectorShuffle 658 658 0 1
+             660:  146(fvec2) GroupNonUniformFMax 35 Reduce 659
+             661:    137(ptr) AccessChain 24(data) 25 654 125 26
+             662:   16(float) CompositeExtract 660 0
+                              Store 661 662
+             663:    137(ptr) AccessChain 24(data) 25 654 125 58
+             664:   16(float) CompositeExtract 660 1
+                              Store 663 664
              665:     27(ptr) AccessChain 10(dti) 26
              666:      6(int) Load 665
-             667:     42(ptr) AccessChain 24(data) 25 666 25 26
+             667:     27(ptr) AccessChain 10(dti) 26
              668:      6(int) Load 667
-             669:      6(int) GroupNonUniformBitwiseAnd 35 Reduce 668
-             670:     42(ptr) AccessChain 24(data) 25 664 25 26
-                              Store 670 669
-             671:     27(ptr) AccessChain 10(dti) 26
-             672:      6(int) Load 671
-             673:     27(ptr) AccessChain 10(dti) 26
-             674:      6(int) Load 673
-             675:     32(ptr) AccessChain 24(data) 25 674 25
-             676:   13(ivec4) Load 675
-             677:   51(ivec2) VectorShuffle 676 676 0 1
-             678:   51(ivec2) GroupNonUniformBitwiseAnd 35 Reduce 677
-             679:     32(ptr) AccessChain 24(data) 25 672 25
-             680:   13(ivec4) Load 679
-             681:   13(ivec4) VectorShuffle 680 678 4 5 2 3
-                              Store 679 681
-             682:     27(ptr) AccessChain 10(dti) 26
-             683:      6(int) Load 682
-             684:     27(ptr) AccessChain 10(dti) 26
-             685:      6(int) Load 684
-             686:     32(ptr) AccessChain 24(data) 25 685 25
-             687:   13(ivec4) Load 686
-             688:    7(ivec3) VectorShuffle 687 687 0 1 2
-             689:    7(ivec3) GroupNonUniformBitwiseAnd 35 Reduce 688
-             690:     32(ptr) AccessChain 24(data) 25 683 25
-             691:   13(ivec4) Load 690
-             692:   13(ivec4) VectorShuffle 691 689 4 5 6 3
-                              Store 690 692
-             693:     27(ptr) AccessChain 10(dti) 26
-             694:      6(int) Load 693
+             669:    128(ptr) AccessChain 24(data) 25 668 125
+             670:   17(fvec4) Load 669
+             671:  159(fvec3) VectorShuffle 670 670 0 1 2
+             672:  159(fvec3) GroupNonUniformFMax 35 Reduce 671
+             673:    137(ptr) AccessChain 24(data) 25 666 125 26
+             674:   16(float) CompositeExtract 672 0
+                              Store 673 674
+             675:    137(ptr) AccessChain 24(data) 25 666 125 58
+             676:   16(float) CompositeExtract 672 1
+                              Store 675 676
+             677:    137(ptr) AccessChain 24(data) 25 666 125 73
+             678:   16(float) CompositeExtract 672 2
+                              Store 677 678
+             679:     27(ptr) AccessChain 10(dti) 26
+             680:      6(int) Load 679
+             681:     27(ptr) AccessChain 10(dti) 26
+             682:      6(int) Load 681
+             683:    175(ptr) AccessChain 24(data) 25 682 172
+             684: 19(f64vec4) Load 683
+             685: 19(f64vec4) GroupNonUniformFMax 35 Reduce 684
+             686:    175(ptr) AccessChain 24(data) 25 680 172
+                              Store 686 685
+             687:     27(ptr) AccessChain 10(dti) 26
+             688:      6(int) Load 687
+             689:     27(ptr) AccessChain 10(dti) 26
+             690:      6(int) Load 689
+             691:    184(ptr) AccessChain 24(data) 25 690 172 26
+             692:18(float64_t) Load 691
+             693:18(float64_t) GroupNonUniformFMax 35 Reduce 692
+             694:    184(ptr) AccessChain 24(data) 25 688 172 26
+                              Store 694 693
              695:     27(ptr) AccessChain 10(dti) 26
              696:      6(int) Load 695
-             697:     75(ptr) AccessChain 24(data) 25 696 72
-             698:   15(ivec4) Load 697
-             699:   15(ivec4) GroupNonUniformBitwiseAnd 35 Reduce 698
-             700:     75(ptr) AccessChain 24(data) 25 694 72
-                              Store 700 699
-             701:     27(ptr) AccessChain 10(dti) 26
-             702:      6(int) Load 701
-             703:     27(ptr) AccessChain 10(dti) 26
-             704:      6(int) Load 703
-             705:     84(ptr) AccessChain 24(data) 25 704 72 26
-             706:     14(int) Load 705
-             707:     14(int) GroupNonUniformBitwiseAnd 35 Reduce 706
-             708:     84(ptr) AccessChain 24(data) 25 702 72 26
-                              Store 708 707
+             697:     27(ptr) AccessChain 10(dti) 26
+             698:      6(int) Load 697
+             699:    175(ptr) AccessChain 24(data) 25 698 172
+             700: 19(f64vec4) Load 699
+             701:193(f64vec2) VectorShuffle 700 700 0 1
+             702:193(f64vec2) GroupNonUniformFMax 35 Reduce 701
+             703:    184(ptr) AccessChain 24(data) 25 696 172 26
+             704:18(float64_t) CompositeExtract 702 0
+                              Store 703 704
+             705:    184(ptr) AccessChain 24(data) 25 696 172 58
+             706:18(float64_t) CompositeExtract 702 1
+                              Store 705 706
+             707:     27(ptr) AccessChain 10(dti) 26
+             708:      6(int) Load 707
              709:     27(ptr) AccessChain 10(dti) 26
              710:      6(int) Load 709
-             711:     27(ptr) AccessChain 10(dti) 26
-             712:      6(int) Load 711
-             713:     75(ptr) AccessChain 24(data) 25 712 72
-             714:   15(ivec4) Load 713
-             715:   93(ivec2) VectorShuffle 714 714 0 1
-             716:   93(ivec2) GroupNonUniformBitwiseAnd 35 Reduce 715
-             717:     75(ptr) AccessChain 24(data) 25 710 72
-             718:   15(ivec4) Load 717
-             719:   15(ivec4) VectorShuffle 718 716 4 5 2 3
-                              Store 717 719
-             720:     27(ptr) AccessChain 10(dti) 26
-             721:      6(int) Load 720
-             722:     27(ptr) AccessChain 10(dti) 26
-             723:      6(int) Load 722
-             724:     75(ptr) AccessChain 24(data) 25 723 72
-             725:   15(ivec4) Load 724
-             726:  105(ivec3) VectorShuffle 725 725 0 1 2
-             727:  105(ivec3) GroupNonUniformBitwiseAnd 35 Reduce 726
-             728:     75(ptr) AccessChain 24(data) 25 721 72
-             729:   15(ivec4) Load 728
-             730:   15(ivec4) VectorShuffle 729 727 4 5 6 3
-                              Store 728 730
+             711:    175(ptr) AccessChain 24(data) 25 710 172
+             712: 19(f64vec4) Load 711
+             713:206(f64vec3) VectorShuffle 712 712 0 1 2
+             714:206(f64vec3) GroupNonUniformFMax 35 Reduce 713
+             715:    184(ptr) AccessChain 24(data) 25 708 172 26
+             716:18(float64_t) CompositeExtract 714 0
+                              Store 715 716
+             717:    184(ptr) AccessChain 24(data) 25 708 172 58
+             718:18(float64_t) CompositeExtract 714 1
+                              Store 717 718
+             719:    184(ptr) AccessChain 24(data) 25 708 172 73
+             720:18(float64_t) CompositeExtract 714 2
+                              Store 719 720
+             721:     27(ptr) AccessChain 10(dti) 26
+             722:      6(int) Load 721
+             723:     27(ptr) AccessChain 10(dti) 26
+             724:      6(int) Load 723
+             725:     32(ptr) AccessChain 24(data) 25 724 25
+             726:   13(ivec4) Load 725
+             727:   13(ivec4) GroupNonUniformBitwiseAnd 35 Reduce 726
+             728:     32(ptr) AccessChain 24(data) 25 722 25
+                              Store 728 727
+             729:     27(ptr) AccessChain 10(dti) 26
+             730:      6(int) Load 729
              731:     27(ptr) AccessChain 10(dti) 26
              732:      6(int) Load 731
-             733:     27(ptr) AccessChain 10(dti) 26
+             733:     42(ptr) AccessChain 24(data) 25 732 25 26
              734:      6(int) Load 733
-             735:     32(ptr) AccessChain 24(data) 25 734 25
-             736:   13(ivec4) Load 735
-             737:   13(ivec4) GroupNonUniformBitwiseOr 35 Reduce 736
-             738:     32(ptr) AccessChain 24(data) 25 732 25
-                              Store 738 737
+             735:      6(int) GroupNonUniformBitwiseAnd 35 Reduce 734
+             736:     42(ptr) AccessChain 24(data) 25 730 25 26
+                              Store 736 735
+             737:     27(ptr) AccessChain 10(dti) 26
+             738:      6(int) Load 737
              739:     27(ptr) AccessChain 10(dti) 26
              740:      6(int) Load 739
-             741:     27(ptr) AccessChain 10(dti) 26
-             742:      6(int) Load 741
-             743:     42(ptr) AccessChain 24(data) 25 742 25 26
-             744:      6(int) Load 743
-             745:      6(int) GroupNonUniformBitwiseOr 35 Reduce 744
-             746:     42(ptr) AccessChain 24(data) 25 740 25 26
-                              Store 746 745
-             747:     27(ptr) AccessChain 10(dti) 26
-             748:      6(int) Load 747
+             741:     32(ptr) AccessChain 24(data) 25 740 25
+             742:   13(ivec4) Load 741
+             743:   51(ivec2) VectorShuffle 742 742 0 1
+             744:   51(ivec2) GroupNonUniformBitwiseAnd 35 Reduce 743
+             745:     42(ptr) AccessChain 24(data) 25 738 25 26
+             746:      6(int) CompositeExtract 744 0
+                              Store 745 746
+             747:     42(ptr) AccessChain 24(data) 25 738 25 58
+             748:      6(int) CompositeExtract 744 1
+                              Store 747 748
              749:     27(ptr) AccessChain 10(dti) 26
              750:      6(int) Load 749
-             751:     32(ptr) AccessChain 24(data) 25 750 25
-             752:   13(ivec4) Load 751
-             753:   51(ivec2) VectorShuffle 752 752 0 1
-             754:   51(ivec2) GroupNonUniformBitwiseOr 35 Reduce 753
-             755:     32(ptr) AccessChain 24(data) 25 748 25
-             756:   13(ivec4) Load 755
-             757:   13(ivec4) VectorShuffle 756 754 4 5 2 3
-                              Store 755 757
-             758:     27(ptr) AccessChain 10(dti) 26
-             759:      6(int) Load 758
-             760:     27(ptr) AccessChain 10(dti) 26
-             761:      6(int) Load 760
-             762:     32(ptr) AccessChain 24(data) 25 761 25
-             763:   13(ivec4) Load 762
-             764:    7(ivec3) VectorShuffle 763 763 0 1 2
-             765:    7(ivec3) GroupNonUniformBitwiseOr 35 Reduce 764
-             766:     32(ptr) AccessChain 24(data) 25 759 25
-             767:   13(ivec4) Load 766
-             768:   13(ivec4) VectorShuffle 767 765 4 5 6 3
-                              Store 766 768
-             769:     27(ptr) AccessChain 10(dti) 26
-             770:      6(int) Load 769
+             751:     27(ptr) AccessChain 10(dti) 26
+             752:      6(int) Load 751
+             753:     32(ptr) AccessChain 24(data) 25 752 25
+             754:   13(ivec4) Load 753
+             755:    7(ivec3) VectorShuffle 754 754 0 1 2
+             756:    7(ivec3) GroupNonUniformBitwiseAnd 35 Reduce 755
+             757:     42(ptr) AccessChain 24(data) 25 750 25 26
+             758:      6(int) CompositeExtract 756 0
+                              Store 757 758
+             759:     42(ptr) AccessChain 24(data) 25 750 25 58
+             760:      6(int) CompositeExtract 756 1
+                              Store 759 760
+             761:     42(ptr) AccessChain 24(data) 25 750 25 73
+             762:      6(int) CompositeExtract 756 2
+                              Store 761 762
+             763:     27(ptr) AccessChain 10(dti) 26
+             764:      6(int) Load 763
+             765:     27(ptr) AccessChain 10(dti) 26
+             766:      6(int) Load 765
+             767:     81(ptr) AccessChain 24(data) 25 766 78
+             768:   15(ivec4) Load 767
+             769:   15(ivec4) GroupNonUniformBitwiseAnd 35 Reduce 768
+             770:     81(ptr) AccessChain 24(data) 25 764 78
+                              Store 770 769
              771:     27(ptr) AccessChain 10(dti) 26
              772:      6(int) Load 771
-             773:     75(ptr) AccessChain 24(data) 25 772 72
-             774:   15(ivec4) Load 773
-             775:   15(ivec4) GroupNonUniformBitwiseOr 35 Reduce 774
-             776:     75(ptr) AccessChain 24(data) 25 770 72
-                              Store 776 775
-             777:     27(ptr) AccessChain 10(dti) 26
-             778:      6(int) Load 777
+             773:     27(ptr) AccessChain 10(dti) 26
+             774:      6(int) Load 773
+             775:     90(ptr) AccessChain 24(data) 25 774 78 26
+             776:     14(int) Load 775
+             777:     14(int) GroupNonUniformBitwiseAnd 35 Reduce 776
+             778:     90(ptr) AccessChain 24(data) 25 772 78 26
+                              Store 778 777
              779:     27(ptr) AccessChain 10(dti) 26
              780:      6(int) Load 779
-             781:     84(ptr) AccessChain 24(data) 25 780 72 26
-             782:     14(int) Load 781
-             783:     14(int) GroupNonUniformBitwiseOr 35 Reduce 782
-             784:     84(ptr) AccessChain 24(data) 25 778 72 26
-                              Store 784 783
-             785:     27(ptr) AccessChain 10(dti) 26
-             786:      6(int) Load 785
-             787:     27(ptr) AccessChain 10(dti) 26
-             788:      6(int) Load 787
-             789:     75(ptr) AccessChain 24(data) 25 788 72
-             790:   15(ivec4) Load 789
-             791:   93(ivec2) VectorShuffle 790 790 0 1
-             792:   93(ivec2) GroupNonUniformBitwiseOr 35 Reduce 791
-             793:     75(ptr) AccessChain 24(data) 25 786 72
-             794:   15(ivec4) Load 793
-             795:   15(ivec4) VectorShuffle 794 792 4 5 2 3
-                              Store 793 795
-             796:     27(ptr) AccessChain 10(dti) 26
-             797:      6(int) Load 796
-             798:     27(ptr) AccessChain 10(dti) 26
-             799:      6(int) Load 798
-             800:     75(ptr) AccessChain 24(data) 25 799 72
-             801:   15(ivec4) Load 800
-             802:  105(ivec3) VectorShuffle 801 801 0 1 2
-             803:  105(ivec3) GroupNonUniformBitwiseOr 35 Reduce 802
-             804:     75(ptr) AccessChain 24(data) 25 797 72
-             805:   15(ivec4) Load 804
-             806:   15(ivec4) VectorShuffle 805 803 4 5 6 3
-                              Store 804 806
+             781:     27(ptr) AccessChain 10(dti) 26
+             782:      6(int) Load 781
+             783:     81(ptr) AccessChain 24(data) 25 782 78
+             784:   15(ivec4) Load 783
+             785:   99(ivec2) VectorShuffle 784 784 0 1
+             786:   99(ivec2) GroupNonUniformBitwiseAnd 35 Reduce 785
+             787:     90(ptr) AccessChain 24(data) 25 780 78 26
+             788:     14(int) CompositeExtract 786 0
+                              Store 787 788
+             789:     90(ptr) AccessChain 24(data) 25 780 78 58
+             790:     14(int) CompositeExtract 786 1
+                              Store 789 790
+             791:     27(ptr) AccessChain 10(dti) 26
+             792:      6(int) Load 791
+             793:     27(ptr) AccessChain 10(dti) 26
+             794:      6(int) Load 793
+             795:     81(ptr) AccessChain 24(data) 25 794 78
+             796:   15(ivec4) Load 795
+             797:  112(ivec3) VectorShuffle 796 796 0 1 2
+             798:  112(ivec3) GroupNonUniformBitwiseAnd 35 Reduce 797
+             799:     90(ptr) AccessChain 24(data) 25 792 78 26
+             800:     14(int) CompositeExtract 798 0
+                              Store 799 800
+             801:     90(ptr) AccessChain 24(data) 25 792 78 58
+             802:     14(int) CompositeExtract 798 1
+                              Store 801 802
+             803:     90(ptr) AccessChain 24(data) 25 792 78 73
+             804:     14(int) CompositeExtract 798 2
+                              Store 803 804
+             805:     27(ptr) AccessChain 10(dti) 26
+             806:      6(int) Load 805
              807:     27(ptr) AccessChain 10(dti) 26
              808:      6(int) Load 807
-             809:     27(ptr) AccessChain 10(dti) 26
-             810:      6(int) Load 809
-             811:     32(ptr) AccessChain 24(data) 25 810 25
-             812:   13(ivec4) Load 811
-             813:   13(ivec4) GroupNonUniformBitwiseXor 35 Reduce 812
-             814:     32(ptr) AccessChain 24(data) 25 808 25
-                              Store 814 813
+             809:     32(ptr) AccessChain 24(data) 25 808 25
+             810:   13(ivec4) Load 809
+             811:   13(ivec4) GroupNonUniformBitwiseOr 35 Reduce 810
+             812:     32(ptr) AccessChain 24(data) 25 806 25
+                              Store 812 811
+             813:     27(ptr) AccessChain 10(dti) 26
+             814:      6(int) Load 813
              815:     27(ptr) AccessChain 10(dti) 26
              816:      6(int) Load 815
-             817:     27(ptr) AccessChain 10(dti) 26
+             817:     42(ptr) AccessChain 24(data) 25 816 25 26
              818:      6(int) Load 817
-             819:     42(ptr) AccessChain 24(data) 25 818 25 26
-             820:      6(int) Load 819
-             821:      6(int) GroupNonUniformBitwiseXor 35 Reduce 820
-             822:     42(ptr) AccessChain 24(data) 25 816 25 26
-                              Store 822 821
+             819:      6(int) GroupNonUniformBitwiseOr 35 Reduce 818
+             820:     42(ptr) AccessChain 24(data) 25 814 25 26
+                              Store 820 819
+             821:     27(ptr) AccessChain 10(dti) 26
+             822:      6(int) Load 821
              823:     27(ptr) AccessChain 10(dti) 26
              824:      6(int) Load 823
-             825:     27(ptr) AccessChain 10(dti) 26
-             826:      6(int) Load 825
-             827:     32(ptr) AccessChain 24(data) 25 826 25
-             828:   13(ivec4) Load 827
-             829:   51(ivec2) VectorShuffle 828 828 0 1
-             830:   51(ivec2) GroupNonUniformBitwiseXor 35 Reduce 829
-             831:     32(ptr) AccessChain 24(data) 25 824 25
-             832:   13(ivec4) Load 831
-             833:   13(ivec4) VectorShuffle 832 830 4 5 2 3
-                              Store 831 833
-             834:     27(ptr) AccessChain 10(dti) 26
-             835:      6(int) Load 834
-             836:     27(ptr) AccessChain 10(dti) 26
-             837:      6(int) Load 836
-             838:     32(ptr) AccessChain 24(data) 25 837 25
-             839:   13(ivec4) Load 838
-             840:    7(ivec3) VectorShuffle 839 839 0 1 2
-             841:    7(ivec3) GroupNonUniformBitwiseXor 35 Reduce 840
-             842:     32(ptr) AccessChain 24(data) 25 835 25
-             843:   13(ivec4) Load 842
-             844:   13(ivec4) VectorShuffle 843 841 4 5 6 3
-                              Store 842 844
-             845:     27(ptr) AccessChain 10(dti) 26
-             846:      6(int) Load 845
+             825:     32(ptr) AccessChain 24(data) 25 824 25
+             826:   13(ivec4) Load 825
+             827:   51(ivec2) VectorShuffle 826 826 0 1
+             828:   51(ivec2) GroupNonUniformBitwiseOr 35 Reduce 827
+             829:     42(ptr) AccessChain 24(data) 25 822 25 26
+             830:      6(int) CompositeExtract 828 0
+                              Store 829 830
+             831:     42(ptr) AccessChain 24(data) 25 822 25 58
+             832:      6(int) CompositeExtract 828 1
+                              Store 831 832
+             833:     27(ptr) AccessChain 10(dti) 26
+             834:      6(int) Load 833
+             835:     27(ptr) AccessChain 10(dti) 26
+             836:      6(int) Load 835
+             837:     32(ptr) AccessChain 24(data) 25 836 25
+             838:   13(ivec4) Load 837
+             839:    7(ivec3) VectorShuffle 838 838 0 1 2
+             840:    7(ivec3) GroupNonUniformBitwiseOr 35 Reduce 839
+             841:     42(ptr) AccessChain 24(data) 25 834 25 26
+             842:      6(int) CompositeExtract 840 0
+                              Store 841 842
+             843:     42(ptr) AccessChain 24(data) 25 834 25 58
+             844:      6(int) CompositeExtract 840 1
+                              Store 843 844
+             845:     42(ptr) AccessChain 24(data) 25 834 25 73
+             846:      6(int) CompositeExtract 840 2
+                              Store 845 846
              847:     27(ptr) AccessChain 10(dti) 26
              848:      6(int) Load 847
-             849:     75(ptr) AccessChain 24(data) 25 848 72
-             850:   15(ivec4) Load 849
-             851:   15(ivec4) GroupNonUniformBitwiseXor 35 Reduce 850
-             852:     75(ptr) AccessChain 24(data) 25 846 72
-                              Store 852 851
-             853:     27(ptr) AccessChain 10(dti) 26
-             854:      6(int) Load 853
+             849:     27(ptr) AccessChain 10(dti) 26
+             850:      6(int) Load 849
+             851:     81(ptr) AccessChain 24(data) 25 850 78
+             852:   15(ivec4) Load 851
+             853:   15(ivec4) GroupNonUniformBitwiseOr 35 Reduce 852
+             854:     81(ptr) AccessChain 24(data) 25 848 78
+                              Store 854 853
              855:     27(ptr) AccessChain 10(dti) 26
              856:      6(int) Load 855
-             857:     84(ptr) AccessChain 24(data) 25 856 72 26
-             858:     14(int) Load 857
-             859:     14(int) GroupNonUniformBitwiseXor 35 Reduce 858
-             860:     84(ptr) AccessChain 24(data) 25 854 72 26
-                              Store 860 859
-             861:     27(ptr) AccessChain 10(dti) 26
-             862:      6(int) Load 861
+             857:     27(ptr) AccessChain 10(dti) 26
+             858:      6(int) Load 857
+             859:     90(ptr) AccessChain 24(data) 25 858 78 26
+             860:     14(int) Load 859
+             861:     14(int) GroupNonUniformBitwiseOr 35 Reduce 860
+             862:     90(ptr) AccessChain 24(data) 25 856 78 26
+                              Store 862 861
              863:     27(ptr) AccessChain 10(dti) 26
              864:      6(int) Load 863
-             865:     75(ptr) AccessChain 24(data) 25 864 72
-             866:   15(ivec4) Load 865
-             867:   93(ivec2) VectorShuffle 866 866 0 1
-             868:   93(ivec2) GroupNonUniformBitwiseXor 35 Reduce 867
-             869:     75(ptr) AccessChain 24(data) 25 862 72
-             870:   15(ivec4) Load 869
-             871:   15(ivec4) VectorShuffle 870 868 4 5 2 3
-                              Store 869 871
-             872:     27(ptr) AccessChain 10(dti) 26
-             873:      6(int) Load 872
-             874:     27(ptr) AccessChain 10(dti) 26
-             875:      6(int) Load 874
-             876:     75(ptr) AccessChain 24(data) 25 875 72
-             877:   15(ivec4) Load 876
-             878:  105(ivec3) VectorShuffle 877 877 0 1 2
-             879:  105(ivec3) GroupNonUniformBitwiseXor 35 Reduce 878
-             880:     75(ptr) AccessChain 24(data) 25 873 72
-             881:   15(ivec4) Load 880
-             882:   15(ivec4) VectorShuffle 881 879 4 5 6 3
-                              Store 880 882
-             883:     27(ptr) AccessChain 10(dti) 26
-             884:      6(int) Load 883
-             885:     27(ptr) AccessChain 10(dti) 26
-             886:      6(int) Load 885
-             887:     42(ptr) AccessChain 24(data) 25 886 25 26
-             888:      6(int) Load 887
-             890:   889(bool) IEqual 888 26
-             891:   13(ivec4) GroupNonUniformBallot 35 890
-             892:      6(int) GroupNonUniformBallotBitCount 35 Reduce 891
-             893:     42(ptr) AccessChain 24(data) 25 884 25 26
-                              Store 893 892
+             865:     27(ptr) AccessChain 10(dti) 26
+             866:      6(int) Load 865
+             867:     81(ptr) AccessChain 24(data) 25 866 78
+             868:   15(ivec4) Load 867
+             869:   99(ivec2) VectorShuffle 868 868 0 1
+             870:   99(ivec2) GroupNonUniformBitwiseOr 35 Reduce 869
+             871:     90(ptr) AccessChain 24(data) 25 864 78 26
+             872:     14(int) CompositeExtract 870 0
+                              Store 871 872
+             873:     90(ptr) AccessChain 24(data) 25 864 78 58
+             874:     14(int) CompositeExtract 870 1
+                              Store 873 874
+             875:     27(ptr) AccessChain 10(dti) 26
+             876:      6(int) Load 875
+             877:     27(ptr) AccessChain 10(dti) 26
+             878:      6(int) Load 877
+             879:     81(ptr) AccessChain 24(data) 25 878 78
+             880:   15(ivec4) Load 879
+             881:  112(ivec3) VectorShuffle 880 880 0 1 2
+             882:  112(ivec3) GroupNonUniformBitwiseOr 35 Reduce 881
+             883:     90(ptr) AccessChain 24(data) 25 876 78 26
+             884:     14(int) CompositeExtract 882 0
+                              Store 883 884
+             885:     90(ptr) AccessChain 24(data) 25 876 78 58
+             886:     14(int) CompositeExtract 882 1
+                              Store 885 886
+             887:     90(ptr) AccessChain 24(data) 25 876 78 73
+             888:     14(int) CompositeExtract 882 2
+                              Store 887 888
+             889:     27(ptr) AccessChain 10(dti) 26
+             890:      6(int) Load 889
+             891:     27(ptr) AccessChain 10(dti) 26
+             892:      6(int) Load 891
+             893:     32(ptr) AccessChain 24(data) 25 892 25
+             894:   13(ivec4) Load 893
+             895:   13(ivec4) GroupNonUniformBitwiseXor 35 Reduce 894
+             896:     32(ptr) AccessChain 24(data) 25 890 25
+                              Store 896 895
+             897:     27(ptr) AccessChain 10(dti) 26
+             898:      6(int) Load 897
+             899:     27(ptr) AccessChain 10(dti) 26
+             900:      6(int) Load 899
+             901:     42(ptr) AccessChain 24(data) 25 900 25 26
+             902:      6(int) Load 901
+             903:      6(int) GroupNonUniformBitwiseXor 35 Reduce 902
+             904:     42(ptr) AccessChain 24(data) 25 898 25 26
+                              Store 904 903
+             905:     27(ptr) AccessChain 10(dti) 26
+             906:      6(int) Load 905
+             907:     27(ptr) AccessChain 10(dti) 26
+             908:      6(int) Load 907
+             909:     32(ptr) AccessChain 24(data) 25 908 25
+             910:   13(ivec4) Load 909
+             911:   51(ivec2) VectorShuffle 910 910 0 1
+             912:   51(ivec2) GroupNonUniformBitwiseXor 35 Reduce 911
+             913:     42(ptr) AccessChain 24(data) 25 906 25 26
+             914:      6(int) CompositeExtract 912 0
+                              Store 913 914
+             915:     42(ptr) AccessChain 24(data) 25 906 25 58
+             916:      6(int) CompositeExtract 912 1
+                              Store 915 916
+             917:     27(ptr) AccessChain 10(dti) 26
+             918:      6(int) Load 917
+             919:     27(ptr) AccessChain 10(dti) 26
+             920:      6(int) Load 919
+             921:     32(ptr) AccessChain 24(data) 25 920 25
+             922:   13(ivec4) Load 921
+             923:    7(ivec3) VectorShuffle 922 922 0 1 2
+             924:    7(ivec3) GroupNonUniformBitwiseXor 35 Reduce 923
+             925:     42(ptr) AccessChain 24(data) 25 918 25 26
+             926:      6(int) CompositeExtract 924 0
+                              Store 925 926
+             927:     42(ptr) AccessChain 24(data) 25 918 25 58
+             928:      6(int) CompositeExtract 924 1
+                              Store 927 928
+             929:     42(ptr) AccessChain 24(data) 25 918 25 73
+             930:      6(int) CompositeExtract 924 2
+                              Store 929 930
+             931:     27(ptr) AccessChain 10(dti) 26
+             932:      6(int) Load 931
+             933:     27(ptr) AccessChain 10(dti) 26
+             934:      6(int) Load 933
+             935:     81(ptr) AccessChain 24(data) 25 934 78
+             936:   15(ivec4) Load 935
+             937:   15(ivec4) GroupNonUniformBitwiseXor 35 Reduce 936
+             938:     81(ptr) AccessChain 24(data) 25 932 78
+                              Store 938 937
+             939:     27(ptr) AccessChain 10(dti) 26
+             940:      6(int) Load 939
+             941:     27(ptr) AccessChain 10(dti) 26
+             942:      6(int) Load 941
+             943:     90(ptr) AccessChain 24(data) 25 942 78 26
+             944:     14(int) Load 943
+             945:     14(int) GroupNonUniformBitwiseXor 35 Reduce 944
+             946:     90(ptr) AccessChain 24(data) 25 940 78 26
+                              Store 946 945
+             947:     27(ptr) AccessChain 10(dti) 26
+             948:      6(int) Load 947
+             949:     27(ptr) AccessChain 10(dti) 26
+             950:      6(int) Load 949
+             951:     81(ptr) AccessChain 24(data) 25 950 78
+             952:   15(ivec4) Load 951
+             953:   99(ivec2) VectorShuffle 952 952 0 1
+             954:   99(ivec2) GroupNonUniformBitwiseXor 35 Reduce 953
+             955:     90(ptr) AccessChain 24(data) 25 948 78 26
+             956:     14(int) CompositeExtract 954 0
+                              Store 955 956
+             957:     90(ptr) AccessChain 24(data) 25 948 78 58
+             958:     14(int) CompositeExtract 954 1
+                              Store 957 958
+             959:     27(ptr) AccessChain 10(dti) 26
+             960:      6(int) Load 959
+             961:     27(ptr) AccessChain 10(dti) 26
+             962:      6(int) Load 961
+             963:     81(ptr) AccessChain 24(data) 25 962 78
+             964:   15(ivec4) Load 963
+             965:  112(ivec3) VectorShuffle 964 964 0 1 2
+             966:  112(ivec3) GroupNonUniformBitwiseXor 35 Reduce 965
+             967:     90(ptr) AccessChain 24(data) 25 960 78 26
+             968:     14(int) CompositeExtract 966 0
+                              Store 967 968
+             969:     90(ptr) AccessChain 24(data) 25 960 78 58
+             970:     14(int) CompositeExtract 966 1
+                              Store 969 970
+             971:     90(ptr) AccessChain 24(data) 25 960 78 73
+             972:     14(int) CompositeExtract 966 2
+                              Store 971 972
+             973:     27(ptr) AccessChain 10(dti) 26
+             974:      6(int) Load 973
+             975:     27(ptr) AccessChain 10(dti) 26
+             976:      6(int) Load 975
+             977:     42(ptr) AccessChain 24(data) 25 976 25 26
+             978:      6(int) Load 977
+             980:   979(bool) IEqual 978 26
+             981:   13(ivec4) GroupNonUniformBallot 35 980
+             982:      6(int) GroupNonUniformBallotBitCount 35 Reduce 981
+             983:     42(ptr) AccessChain 24(data) 25 974 25 26
+                              Store 983 982
                               Return
                               FunctionEnd
diff --git a/third_party/vulkan-deps/glslang/src/Test/baseResults/remap.uniformarray.everything.frag.out b/third_party/vulkan-deps/glslang/src/Test/baseResults/remap.uniformarray.everything.frag.out
index bebff93..ee1daa7 100644
--- a/third_party/vulkan-deps/glslang/src/Test/baseResults/remap.uniformarray.everything.frag.out
+++ b/third_party/vulkan-deps/glslang/src/Test/baseResults/remap.uniformarray.everything.frag.out
@@ -28,14 +28,17 @@
               24:             TypeVector 13(float) 3
              661:             TypePointer Input 24(fvec3)
             4957:    661(ptr) Variable Input
+            2570:     11(int) Constant 0
+             650:             TypePointer Function 13(float)
+            2573:     11(int) Constant 1
+            2576:     11(int) Constant 2
             2618:     11(int) Constant 16
-             669:             TypeArray 13(float) 2618
-            1306:             TypePointer Input 669
-            4339:   1306(ptr) Variable Input
+             709:             TypeArray 13(float) 2618
+            1346:             TypePointer Input 709
+            4339:   1346(ptr) Variable Input
             2607:     12(int) Constant 12
-             650:             TypePointer Input 13(float)
+             651:             TypePointer Input 13(float)
             2579:     11(int) Constant 3
-             651:             TypePointer Function 13(float)
              668:             TypePointer Output 29(fvec4)
             5139:    668(ptr) Variable Output
             5663:           8 Function None 1282
@@ -49,17 +52,23 @@
                               Store 4902 23084
            21218:   24(fvec3) Load 4957
            13695:   29(fvec4) Load 4902
-           23883:   24(fvec3) VectorShuffle 13695 13695 0 1 2
-           15591:   24(fvec3) FAdd 23883 21218
-           17086:   29(fvec4) Load 4902
-            7051:   29(fvec4) VectorShuffle 17086 15591 4 5 6 3
-                              Store 4902 7051
-           18282:    650(ptr) AccessChain 4339 2607
-            7372:   13(float) Load 18282
-           21371:    651(ptr) AccessChain 4902 2579
+           23959:   24(fvec3) VectorShuffle 13695 13695 0 1 2
+           14937:   24(fvec3) FAdd 23959 21218
+           15653:    650(ptr) AccessChain 4902 2570
+           21354:   13(float) CompositeExtract 14937 0
+                              Store 15653 21354
+           16378:    650(ptr) AccessChain 4902 2573
+           15746:   13(float) CompositeExtract 14937 1
+                              Store 16378 15746
+           16379:    650(ptr) AccessChain 4902 2576
+           15747:   13(float) CompositeExtract 14937 2
+                              Store 16379 15747
+           19895:    651(ptr) AccessChain 4339 2607
+            7372:   13(float) Load 19895
+           21371:    650(ptr) AccessChain 4902 2579
            11412:   13(float) Load 21371
            22584:   13(float) FAdd 11412 7372
-           17318:    651(ptr) AccessChain 4902 2579
+           17318:    650(ptr) AccessChain 4902 2579
                               Store 17318 22584
            17934:   29(fvec4) Load 4902
                               Store 5139 17934
diff --git a/third_party/vulkan-deps/glslang/src/Test/baseResults/remap.uniformarray.none.frag.out b/third_party/vulkan-deps/glslang/src/Test/baseResults/remap.uniformarray.none.frag.out
index 6bd58d2..00e1f57 100644
--- a/third_party/vulkan-deps/glslang/src/Test/baseResults/remap.uniformarray.none.frag.out
+++ b/third_party/vulkan-deps/glslang/src/Test/baseResults/remap.uniformarray.none.frag.out
@@ -1,27 +1,27 @@
 remap.uniformarray.none.frag
 // Module Version 10000
 // Generated by (magic number): 8000a
-// Id's are bound by 53
+// Id's are bound by 60
 
                               Capability Shader
                1:             ExtInstImport  "GLSL.std.450"
                               MemoryModel Logical GLSL450
-                              EntryPoint Fragment 4  "main" 14 25 35 47
+                              EntryPoint Fragment 4  "main" 14 25 43 54
                               ExecutionMode 4 OriginUpperLeft
                               Source GLSL 140
                               Name 4  "main"
                               Name 9  "texColor"
                               Name 14  "color"
                               Name 25  "inColor"
-                              Name 35  "alpha"
-                              Name 47  "gl_FragColor"
-                              Name 52  "texSampler2D"
+                              Name 43  "alpha"
+                              Name 54  "gl_FragColor"
+                              Name 59  "texSampler2D"
                               Decorate 14(color) Location 1
                               Decorate 25(inColor) Location 0
-                              Decorate 35(alpha) Location 7
-                              Decorate 47(gl_FragColor) Location 0
-                              Decorate 52(texSampler2D) DescriptorSet 0
-                              Decorate 52(texSampler2D) Binding 0
+                              Decorate 43(alpha) Location 7
+                              Decorate 54(gl_FragColor) Location 0
+                              Decorate 59(texSampler2D) DescriptorSet 0
+                              Decorate 59(texSampler2D) Binding 0
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeFloat 32
@@ -38,20 +38,23 @@
               23:             TypeVector 6(float) 3
               24:             TypePointer Input 23(fvec3)
      25(inColor):     24(ptr) Variable Input
-              32:     10(int) Constant 16
-              33:             TypeArray 6(float) 32
-              34:             TypePointer Input 33
-       35(alpha):     34(ptr) Variable Input
-              36:     15(int) Constant 12
-              37:             TypePointer Input 6(float)
-              40:     10(int) Constant 3
-              41:             TypePointer Function 6(float)
-              46:             TypePointer Output 7(fvec4)
-47(gl_FragColor):     46(ptr) Variable Output
-              49:             TypeImage 6(float) 2D sampled format:Unknown
-              50:             TypeSampledImage 49
-              51:             TypePointer UniformConstant 50
-52(texSampler2D):     51(ptr) Variable UniformConstant
+              30:     10(int) Constant 0
+              31:             TypePointer Function 6(float)
+              34:     10(int) Constant 1
+              37:     10(int) Constant 2
+              40:     10(int) Constant 16
+              41:             TypeArray 6(float) 40
+              42:             TypePointer Input 41
+       43(alpha):     42(ptr) Variable Input
+              44:     15(int) Constant 12
+              45:             TypePointer Input 6(float)
+              48:     10(int) Constant 3
+              53:             TypePointer Output 7(fvec4)
+54(gl_FragColor):     53(ptr) Variable Output
+              56:             TypeImage 6(float) 2D sampled format:Unknown
+              57:             TypeSampledImage 56
+              58:             TypePointer UniformConstant 57
+59(texSampler2D):     58(ptr) Variable UniformConstant
          4(main):           2 Function None 3
                5:             Label
      9(texColor):      8(ptr) Variable Function
@@ -65,17 +68,23 @@
               27:    7(fvec4) Load 9(texColor)
               28:   23(fvec3) VectorShuffle 27 27 0 1 2
               29:   23(fvec3) FAdd 28 26
-              30:    7(fvec4) Load 9(texColor)
-              31:    7(fvec4) VectorShuffle 30 29 4 5 6 3
-                              Store 9(texColor) 31
-              38:     37(ptr) AccessChain 35(alpha) 36
-              39:    6(float) Load 38
-              42:     41(ptr) AccessChain 9(texColor) 40
-              43:    6(float) Load 42
-              44:    6(float) FAdd 43 39
-              45:     41(ptr) AccessChain 9(texColor) 40
-                              Store 45 44
-              48:    7(fvec4) Load 9(texColor)
-                              Store 47(gl_FragColor) 48
+              32:     31(ptr) AccessChain 9(texColor) 30
+              33:    6(float) CompositeExtract 29 0
+                              Store 32 33
+              35:     31(ptr) AccessChain 9(texColor) 34
+              36:    6(float) CompositeExtract 29 1
+                              Store 35 36
+              38:     31(ptr) AccessChain 9(texColor) 37
+              39:    6(float) CompositeExtract 29 2
+                              Store 38 39
+              46:     45(ptr) AccessChain 43(alpha) 44
+              47:    6(float) Load 46
+              49:     31(ptr) AccessChain 9(texColor) 48
+              50:    6(float) Load 49
+              51:    6(float) FAdd 50 47
+              52:     31(ptr) AccessChain 9(texColor) 48
+                              Store 52 51
+              55:    7(fvec4) Load 9(texColor)
+                              Store 54(gl_FragColor) 55
                               Return
                               FunctionEnd
diff --git a/third_party/vulkan-deps/glslang/src/Test/baseResults/spv.310.bitcast.frag.out b/third_party/vulkan-deps/glslang/src/Test/baseResults/spv.310.bitcast.frag.out
index b7f823d..f4322ab 100644
--- a/third_party/vulkan-deps/glslang/src/Test/baseResults/spv.310.bitcast.frag.out
+++ b/third_party/vulkan-deps/glslang/src/Test/baseResults/spv.310.bitcast.frag.out
@@ -1,71 +1,71 @@
 spv.310.bitcast.frag
 // Module Version 10000
 // Generated by (magic number): 8000a
-// Id's are bound by 153
+// Id's are bound by 179
 
                               Capability Shader
                1:             ExtInstImport  "GLSL.std.450"
                               MemoryModel Logical GLSL450
-                              EntryPoint Fragment 4  "main" 14 26 37 48 89 98 107 116 122 130 139 148
+                              EntryPoint Fragment 4  "main" 14 26 40 56 103 112 123 136 142 150 161 174
                               ExecutionMode 4 OriginUpperLeft
                               Source ESSL 310
                               Name 4  "main"
                               Name 9  "idata"
                               Name 14  "f1"
                               Name 26  "f2"
-                              Name 37  "f3"
-                              Name 48  "f4"
-                              Name 55  "udata"
-                              Name 85  "fdata"
-                              Name 89  "i1"
-                              Name 98  "i2"
-                              Name 107  "i3"
-                              Name 116  "i4"
-                              Name 122  "u1"
-                              Name 130  "u2"
-                              Name 139  "u3"
-                              Name 148  "u4"
+                              Name 40  "f3"
+                              Name 56  "f4"
+                              Name 63  "udata"
+                              Name 99  "fdata"
+                              Name 103  "i1"
+                              Name 112  "i2"
+                              Name 123  "i3"
+                              Name 136  "i4"
+                              Name 142  "u1"
+                              Name 150  "u2"
+                              Name 161  "u3"
+                              Name 174  "u4"
                               Decorate 14(f1) RelaxedPrecision
                               Decorate 14(f1) Location 8
                               Decorate 15 RelaxedPrecision
                               Decorate 26(f2) RelaxedPrecision
                               Decorate 26(f2) Location 9
                               Decorate 27 RelaxedPrecision
-                              Decorate 37(f3) RelaxedPrecision
-                              Decorate 37(f3) Location 10
-                              Decorate 38 RelaxedPrecision
-                              Decorate 48(f4) Location 11
-                              Decorate 57 RelaxedPrecision
-                              Decorate 64 RelaxedPrecision
+                              Decorate 40(f3) RelaxedPrecision
+                              Decorate 40(f3) Location 10
+                              Decorate 41 RelaxedPrecision
+                              Decorate 56(f4) Location 11
+                              Decorate 65 RelaxedPrecision
                               Decorate 72 RelaxedPrecision
-                              Decorate 89(i1) RelaxedPrecision
-                              Decorate 89(i1) Flat
-                              Decorate 89(i1) Location 0
-                              Decorate 90 RelaxedPrecision
-                              Decorate 98(i2) RelaxedPrecision
-                              Decorate 98(i2) Flat
-                              Decorate 98(i2) Location 1
-                              Decorate 99 RelaxedPrecision
-                              Decorate 107(i3) RelaxedPrecision
-                              Decorate 107(i3) Flat
-                              Decorate 107(i3) Location 2
-                              Decorate 108 RelaxedPrecision
-                              Decorate 116(i4) Flat
-                              Decorate 116(i4) Location 3
-                              Decorate 122(u1) RelaxedPrecision
-                              Decorate 122(u1) Flat
-                              Decorate 122(u1) Location 4
-                              Decorate 123 RelaxedPrecision
-                              Decorate 130(u2) RelaxedPrecision
-                              Decorate 130(u2) Flat
-                              Decorate 130(u2) Location 5
-                              Decorate 131 RelaxedPrecision
-                              Decorate 139(u3) RelaxedPrecision
-                              Decorate 139(u3) Flat
-                              Decorate 139(u3) Location 6
-                              Decorate 140 RelaxedPrecision
-                              Decorate 148(u4) Flat
-                              Decorate 148(u4) Location 7
+                              Decorate 82 RelaxedPrecision
+                              Decorate 103(i1) RelaxedPrecision
+                              Decorate 103(i1) Flat
+                              Decorate 103(i1) Location 0
+                              Decorate 104 RelaxedPrecision
+                              Decorate 112(i2) RelaxedPrecision
+                              Decorate 112(i2) Flat
+                              Decorate 112(i2) Location 1
+                              Decorate 113 RelaxedPrecision
+                              Decorate 123(i3) RelaxedPrecision
+                              Decorate 123(i3) Flat
+                              Decorate 123(i3) Location 2
+                              Decorate 124 RelaxedPrecision
+                              Decorate 136(i4) Flat
+                              Decorate 136(i4) Location 3
+                              Decorate 142(u1) RelaxedPrecision
+                              Decorate 142(u1) Flat
+                              Decorate 142(u1) Location 4
+                              Decorate 143 RelaxedPrecision
+                              Decorate 150(u2) RelaxedPrecision
+                              Decorate 150(u2) Flat
+                              Decorate 150(u2) Location 5
+                              Decorate 151 RelaxedPrecision
+                              Decorate 161(u3) RelaxedPrecision
+                              Decorate 161(u3) Flat
+                              Decorate 161(u3) Location 6
+                              Decorate 162 RelaxedPrecision
+                              Decorate 174(u4) Flat
+                              Decorate 174(u4) Location 7
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeInt 32 1
@@ -83,44 +83,46 @@
               25:             TypePointer Input 24(fvec2)
           26(f2):     25(ptr) Variable Input
               28:             TypeVector 6(int) 2
-              35:             TypeVector 12(float) 3
-              36:             TypePointer Input 35(fvec3)
-          37(f3):     36(ptr) Variable Input
-              39:             TypeVector 6(int) 3
-              46:             TypeVector 12(float) 4
-              47:             TypePointer Input 46(fvec4)
-          48(f4):     47(ptr) Variable Input
-              53:             TypeVector 17(int) 4
-              54:             TypePointer Function 53(ivec4)
-              56:   53(ivec4) ConstantComposite 18 18 18 18
-              59:             TypePointer Function 17(int)
-              65:             TypeVector 17(int) 2
-              73:             TypeVector 17(int) 3
-              84:             TypePointer Function 46(fvec4)
-              86:   12(float) Constant 0
-              87:   46(fvec4) ConstantComposite 86 86 86 86
-              88:             TypePointer Input 6(int)
-          89(i1):     88(ptr) Variable Input
-              92:             TypePointer Function 12(float)
-              97:             TypePointer Input 28(ivec2)
-          98(i2):     97(ptr) Variable Input
-             106:             TypePointer Input 39(ivec3)
-         107(i3):    106(ptr) Variable Input
-             115:             TypePointer Input 7(ivec4)
-         116(i4):    115(ptr) Variable Input
-             121:             TypePointer Input 17(int)
-         122(u1):    121(ptr) Variable Input
-             129:             TypePointer Input 65(ivec2)
-         130(u2):    129(ptr) Variable Input
-             138:             TypePointer Input 73(ivec3)
-         139(u3):    138(ptr) Variable Input
-             147:             TypePointer Input 53(ivec4)
-         148(u4):    147(ptr) Variable Input
+              35:     17(int) Constant 1
+              38:             TypeVector 12(float) 3
+              39:             TypePointer Input 38(fvec3)
+          40(f3):     39(ptr) Variable Input
+              42:             TypeVector 6(int) 3
+              51:     17(int) Constant 2
+              54:             TypeVector 12(float) 4
+              55:             TypePointer Input 54(fvec4)
+          56(f4):     55(ptr) Variable Input
+              61:             TypeVector 17(int) 4
+              62:             TypePointer Function 61(ivec4)
+              64:   61(ivec4) ConstantComposite 18 18 18 18
+              67:             TypePointer Function 17(int)
+              73:             TypeVector 17(int) 2
+              83:             TypeVector 17(int) 3
+              98:             TypePointer Function 54(fvec4)
+             100:   12(float) Constant 0
+             101:   54(fvec4) ConstantComposite 100 100 100 100
+             102:             TypePointer Input 6(int)
+         103(i1):    102(ptr) Variable Input
+             106:             TypePointer Function 12(float)
+             111:             TypePointer Input 28(ivec2)
+         112(i2):    111(ptr) Variable Input
+             122:             TypePointer Input 42(ivec3)
+         123(i3):    122(ptr) Variable Input
+             135:             TypePointer Input 7(ivec4)
+         136(i4):    135(ptr) Variable Input
+             141:             TypePointer Input 17(int)
+         142(u1):    141(ptr) Variable Input
+             149:             TypePointer Input 73(ivec2)
+         150(u2):    149(ptr) Variable Input
+             160:             TypePointer Input 83(ivec3)
+         161(u3):    160(ptr) Variable Input
+             173:             TypePointer Input 61(ivec4)
+         174(u4):    173(ptr) Variable Input
          4(main):           2 Function None 3
                5:             Label
         9(idata):      8(ptr) Variable Function
-       55(udata):     54(ptr) Variable Function
-       85(fdata):     84(ptr) Variable Function
+       63(udata):     62(ptr) Variable Function
+       99(fdata):     98(ptr) Variable Function
                               Store 9(idata) 11
               15:   12(float) Load 14(f1)
               16:      6(int) Bitcast 15
@@ -134,107 +136,143 @@
               30:    7(ivec4) Load 9(idata)
               31:   28(ivec2) VectorShuffle 30 30 0 1
               32:   28(ivec2) IAdd 31 29
-              33:    7(ivec4) Load 9(idata)
-              34:    7(ivec4) VectorShuffle 33 32 4 5 2 3
-                              Store 9(idata) 34
-              38:   35(fvec3) Load 37(f3)
-              40:   39(ivec3) Bitcast 38
-              41:    7(ivec4) Load 9(idata)
-              42:   39(ivec3) VectorShuffle 41 41 0 1 2
-              43:   39(ivec3) IAdd 42 40
+              33:     19(ptr) AccessChain 9(idata) 18
+              34:      6(int) CompositeExtract 32 0
+                              Store 33 34
+              36:     19(ptr) AccessChain 9(idata) 35
+              37:      6(int) CompositeExtract 32 1
+                              Store 36 37
+              41:   38(fvec3) Load 40(f3)
+              43:   42(ivec3) Bitcast 41
               44:    7(ivec4) Load 9(idata)
-              45:    7(ivec4) VectorShuffle 44 43 4 5 6 3
-                              Store 9(idata) 45
-              49:   46(fvec4) Load 48(f4)
-              50:    7(ivec4) Bitcast 49
-              51:    7(ivec4) Load 9(idata)
-              52:    7(ivec4) IAdd 51 50
-                              Store 9(idata) 52
-                              Store 55(udata) 56
-              57:   12(float) Load 14(f1)
-              58:     17(int) Bitcast 57
-              60:     59(ptr) AccessChain 55(udata) 18
-              61:     17(int) Load 60
-              62:     17(int) IAdd 61 58
-              63:     59(ptr) AccessChain 55(udata) 18
-                              Store 63 62
-              64:   24(fvec2) Load 26(f2)
-              66:   65(ivec2) Bitcast 64
-              67:   53(ivec4) Load 55(udata)
-              68:   65(ivec2) VectorShuffle 67 67 0 1
-              69:   65(ivec2) IAdd 68 66
-              70:   53(ivec4) Load 55(udata)
-              71:   53(ivec4) VectorShuffle 70 69 4 5 2 3
-                              Store 55(udata) 71
-              72:   35(fvec3) Load 37(f3)
-              74:   73(ivec3) Bitcast 72
-              75:   53(ivec4) Load 55(udata)
-              76:   73(ivec3) VectorShuffle 75 75 0 1 2
-              77:   73(ivec3) IAdd 76 74
-              78:   53(ivec4) Load 55(udata)
-              79:   53(ivec4) VectorShuffle 78 77 4 5 6 3
-                              Store 55(udata) 79
-              80:   46(fvec4) Load 48(f4)
-              81:   53(ivec4) Bitcast 80
-              82:   53(ivec4) Load 55(udata)
-              83:   53(ivec4) IAdd 82 81
-                              Store 55(udata) 83
-                              Store 85(fdata) 87
-              90:      6(int) Load 89(i1)
-              91:   12(float) Bitcast 90
-              93:     92(ptr) AccessChain 85(fdata) 18
-              94:   12(float) Load 93
-              95:   12(float) FAdd 94 91
-              96:     92(ptr) AccessChain 85(fdata) 18
-                              Store 96 95
-              99:   28(ivec2) Load 98(i2)
-             100:   24(fvec2) Bitcast 99
-             101:   46(fvec4) Load 85(fdata)
-             102:   24(fvec2) VectorShuffle 101 101 0 1
-             103:   24(fvec2) FAdd 102 100
-             104:   46(fvec4) Load 85(fdata)
-             105:   46(fvec4) VectorShuffle 104 103 4 5 2 3
-                              Store 85(fdata) 105
-             108:   39(ivec3) Load 107(i3)
-             109:   35(fvec3) Bitcast 108
-             110:   46(fvec4) Load 85(fdata)
-             111:   35(fvec3) VectorShuffle 110 110 0 1 2
-             112:   35(fvec3) FAdd 111 109
-             113:   46(fvec4) Load 85(fdata)
-             114:   46(fvec4) VectorShuffle 113 112 4 5 6 3
-                              Store 85(fdata) 114
-             117:    7(ivec4) Load 116(i4)
-             118:   46(fvec4) Bitcast 117
-             119:   46(fvec4) Load 85(fdata)
-             120:   46(fvec4) FAdd 119 118
-                              Store 85(fdata) 120
-             123:     17(int) Load 122(u1)
-             124:   12(float) Bitcast 123
-             125:     92(ptr) AccessChain 85(fdata) 18
-             126:   12(float) Load 125
-             127:   12(float) FAdd 126 124
-             128:     92(ptr) AccessChain 85(fdata) 18
-                              Store 128 127
-             131:   65(ivec2) Load 130(u2)
-             132:   24(fvec2) Bitcast 131
-             133:   46(fvec4) Load 85(fdata)
-             134:   24(fvec2) VectorShuffle 133 133 0 1
-             135:   24(fvec2) FAdd 134 132
-             136:   46(fvec4) Load 85(fdata)
-             137:   46(fvec4) VectorShuffle 136 135 4 5 2 3
-                              Store 85(fdata) 137
-             140:   73(ivec3) Load 139(u3)
-             141:   35(fvec3) Bitcast 140
-             142:   46(fvec4) Load 85(fdata)
-             143:   35(fvec3) VectorShuffle 142 142 0 1 2
-             144:   35(fvec3) FAdd 143 141
-             145:   46(fvec4) Load 85(fdata)
-             146:   46(fvec4) VectorShuffle 145 144 4 5 6 3
-                              Store 85(fdata) 146
-             149:   53(ivec4) Load 148(u4)
-             150:   46(fvec4) Bitcast 149
-             151:   46(fvec4) Load 85(fdata)
-             152:   46(fvec4) FAdd 151 150
-                              Store 85(fdata) 152
+              45:   42(ivec3) VectorShuffle 44 44 0 1 2
+              46:   42(ivec3) IAdd 45 43
+              47:     19(ptr) AccessChain 9(idata) 18
+              48:      6(int) CompositeExtract 46 0
+                              Store 47 48
+              49:     19(ptr) AccessChain 9(idata) 35
+              50:      6(int) CompositeExtract 46 1
+                              Store 49 50
+              52:     19(ptr) AccessChain 9(idata) 51
+              53:      6(int) CompositeExtract 46 2
+                              Store 52 53
+              57:   54(fvec4) Load 56(f4)
+              58:    7(ivec4) Bitcast 57
+              59:    7(ivec4) Load 9(idata)
+              60:    7(ivec4) IAdd 59 58
+                              Store 9(idata) 60
+                              Store 63(udata) 64
+              65:   12(float) Load 14(f1)
+              66:     17(int) Bitcast 65
+              68:     67(ptr) AccessChain 63(udata) 18
+              69:     17(int) Load 68
+              70:     17(int) IAdd 69 66
+              71:     67(ptr) AccessChain 63(udata) 18
+                              Store 71 70
+              72:   24(fvec2) Load 26(f2)
+              74:   73(ivec2) Bitcast 72
+              75:   61(ivec4) Load 63(udata)
+              76:   73(ivec2) VectorShuffle 75 75 0 1
+              77:   73(ivec2) IAdd 76 74
+              78:     67(ptr) AccessChain 63(udata) 18
+              79:     17(int) CompositeExtract 77 0
+                              Store 78 79
+              80:     67(ptr) AccessChain 63(udata) 35
+              81:     17(int) CompositeExtract 77 1
+                              Store 80 81
+              82:   38(fvec3) Load 40(f3)
+              84:   83(ivec3) Bitcast 82
+              85:   61(ivec4) Load 63(udata)
+              86:   83(ivec3) VectorShuffle 85 85 0 1 2
+              87:   83(ivec3) IAdd 86 84
+              88:     67(ptr) AccessChain 63(udata) 18
+              89:     17(int) CompositeExtract 87 0
+                              Store 88 89
+              90:     67(ptr) AccessChain 63(udata) 35
+              91:     17(int) CompositeExtract 87 1
+                              Store 90 91
+              92:     67(ptr) AccessChain 63(udata) 51
+              93:     17(int) CompositeExtract 87 2
+                              Store 92 93
+              94:   54(fvec4) Load 56(f4)
+              95:   61(ivec4) Bitcast 94
+              96:   61(ivec4) Load 63(udata)
+              97:   61(ivec4) IAdd 96 95
+                              Store 63(udata) 97
+                              Store 99(fdata) 101
+             104:      6(int) Load 103(i1)
+             105:   12(float) Bitcast 104
+             107:    106(ptr) AccessChain 99(fdata) 18
+             108:   12(float) Load 107
+             109:   12(float) FAdd 108 105
+             110:    106(ptr) AccessChain 99(fdata) 18
+                              Store 110 109
+             113:   28(ivec2) Load 112(i2)
+             114:   24(fvec2) Bitcast 113
+             115:   54(fvec4) Load 99(fdata)
+             116:   24(fvec2) VectorShuffle 115 115 0 1
+             117:   24(fvec2) FAdd 116 114
+             118:    106(ptr) AccessChain 99(fdata) 18
+             119:   12(float) CompositeExtract 117 0
+                              Store 118 119
+             120:    106(ptr) AccessChain 99(fdata) 35
+             121:   12(float) CompositeExtract 117 1
+                              Store 120 121
+             124:   42(ivec3) Load 123(i3)
+             125:   38(fvec3) Bitcast 124
+             126:   54(fvec4) Load 99(fdata)
+             127:   38(fvec3) VectorShuffle 126 126 0 1 2
+             128:   38(fvec3) FAdd 127 125
+             129:    106(ptr) AccessChain 99(fdata) 18
+             130:   12(float) CompositeExtract 128 0
+                              Store 129 130
+             131:    106(ptr) AccessChain 99(fdata) 35
+             132:   12(float) CompositeExtract 128 1
+                              Store 131 132
+             133:    106(ptr) AccessChain 99(fdata) 51
+             134:   12(float) CompositeExtract 128 2
+                              Store 133 134
+             137:    7(ivec4) Load 136(i4)
+             138:   54(fvec4) Bitcast 137
+             139:   54(fvec4) Load 99(fdata)
+             140:   54(fvec4) FAdd 139 138
+                              Store 99(fdata) 140
+             143:     17(int) Load 142(u1)
+             144:   12(float) Bitcast 143
+             145:    106(ptr) AccessChain 99(fdata) 18
+             146:   12(float) Load 145
+             147:   12(float) FAdd 146 144
+             148:    106(ptr) AccessChain 99(fdata) 18
+                              Store 148 147
+             151:   73(ivec2) Load 150(u2)
+             152:   24(fvec2) Bitcast 151
+             153:   54(fvec4) Load 99(fdata)
+             154:   24(fvec2) VectorShuffle 153 153 0 1
+             155:   24(fvec2) FAdd 154 152
+             156:    106(ptr) AccessChain 99(fdata) 18
+             157:   12(float) CompositeExtract 155 0
+                              Store 156 157
+             158:    106(ptr) AccessChain 99(fdata) 35
+             159:   12(float) CompositeExtract 155 1
+                              Store 158 159
+             162:   83(ivec3) Load 161(u3)
+             163:   38(fvec3) Bitcast 162
+             164:   54(fvec4) Load 99(fdata)
+             165:   38(fvec3) VectorShuffle 164 164 0 1 2
+             166:   38(fvec3) FAdd 165 163
+             167:    106(ptr) AccessChain 99(fdata) 18
+             168:   12(float) CompositeExtract 166 0
+                              Store 167 168
+             169:    106(ptr) AccessChain 99(fdata) 35
+             170:   12(float) CompositeExtract 166 1
+                              Store 169 170
+             171:    106(ptr) AccessChain 99(fdata) 51
+             172:   12(float) CompositeExtract 166 2
+                              Store 171 172
+             175:   61(ivec4) Load 174(u4)
+             176:   54(fvec4) Bitcast 175
+             177:   54(fvec4) Load 99(fdata)
+             178:   54(fvec4) FAdd 177 176
+                              Store 99(fdata) 178
                               Return
                               FunctionEnd
diff --git a/third_party/vulkan-deps/glslang/src/Test/baseResults/spv.320.meshShaderUserDefined.mesh.out b/third_party/vulkan-deps/glslang/src/Test/baseResults/spv.320.meshShaderUserDefined.mesh.out
index 9bc86d0..a4d8413 100644
--- a/third_party/vulkan-deps/glslang/src/Test/baseResults/spv.320.meshShaderUserDefined.mesh.out
+++ b/third_party/vulkan-deps/glslang/src/Test/baseResults/spv.320.meshShaderUserDefined.mesh.out
@@ -1,13 +1,13 @@
 spv.320.meshShaderUserDefined.mesh
 // Module Version 10000
 // Generated by (magic number): 8000a
-// Id's are bound by 140
+// Id's are bound by 143
 
                               Capability MeshShadingNV
                               Extension  "SPV_NV_mesh_shader"
                1:             ExtInstImport  "GLSL.std.450"
                               MemoryModel Logical GLSL450
-                              EntryPoint MeshNV 4  "main" 12 19 37 103
+                              EntryPoint MeshNV 4  "main" 12 19 37 106
                               ExecutionMode 4 LocalSize 32 1 1
                               ExecutionMode 4 OutputVertices 81
                               ExecutionMode 4 OutputPrimitivesNV 32
@@ -27,11 +27,11 @@
                               MemberName 33(myblock) 4  "m"
                               MemberName 33(myblock) 5  "mArr"
                               Name 37  "blk"
-                              Name 99  "myblock2"
-                              MemberName 99(myblock2) 0  "f"
-                              MemberName 99(myblock2) 1  "pos"
-                              MemberName 99(myblock2) 2  "m"
-                              Name 103  "blk2"
+                              Name 102  "myblock2"
+                              MemberName 102(myblock2) 0  "f"
+                              MemberName 102(myblock2) 1  "pos"
+                              MemberName 102(myblock2) 2  "m"
+                              Name 106  "blk2"
                               Decorate 12(gl_LocalInvocationID) BuiltIn LocalInvocationId
                               Decorate 19(gl_WorkGroupID) BuiltIn WorkgroupId
                               MemberDecorate 33(myblock) 0 PerPrimitiveNV
@@ -42,9 +42,9 @@
                               MemberDecorate 33(myblock) 5 PerPrimitiveNV
                               Decorate 33(myblock) Block
                               Decorate 37(blk) Location 0
-                              Decorate 99(myblock2) Block
-                              Decorate 103(blk2) Location 20
-                              Decorate 139 BuiltIn WorkgroupSize
+                              Decorate 102(myblock2) Block
+                              Decorate 106(blk2) Location 20
+                              Decorate 142 BuiltIn WorkgroupSize
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeInt 32 1
@@ -82,31 +82,31 @@
               57:   26(fvec3) ConstantComposite 54 55 56
               58:             TypePointer Output 26(fvec3)
               64:      6(int) Constant 3
-              69:             TypePointer Output 27(fvec4)
-              74:      6(int) Constant 4
-              76:   23(float) Constant 1098907648
-              77:   27(fvec4) ConstantComposite 56 54 55 76
-              82:      6(int) Constant 5
-              85:      9(int) Constant 3
-              88:      9(int) Constant 1
-              93:   23(float) Constant 1099431936
-              94:   23(float) Constant 1099956224
-              95:   23(float) Constant 1100480512
-              96:   26(fvec3) ConstantComposite 93 94 95
-              98:      9(int) Constant 264
-    99(myblock2):             TypeStruct 23(float) 27(fvec4) 29
-             100:      9(int) Constant 81
-             101:             TypeArray 99(myblock2) 100
-             102:             TypePointer Output 101
-       103(blk2):    102(ptr) Variable Output
-             109:   23(float) Constant 1101004800
-             113:   23(float) Constant 1101529088
-             114:   23(float) Constant 1102053376
-             115:   23(float) Constant 1102577664
-             116:   23(float) Constant 1103101952
-             117:   27(fvec4) ConstantComposite 113 114 115 116
-             129:   23(float) Constant 1105723392
-             139:   10(ivec3) ConstantComposite 34 88 88
+              69:      9(int) Constant 1
+              74:      9(int) Constant 3
+              78:      6(int) Constant 4
+              80:   23(float) Constant 1098907648
+              81:   27(fvec4) ConstantComposite 56 54 55 80
+              82:             TypePointer Output 27(fvec4)
+              87:      6(int) Constant 5
+              96:   23(float) Constant 1099431936
+              97:   23(float) Constant 1099956224
+              98:   23(float) Constant 1100480512
+              99:   26(fvec3) ConstantComposite 96 97 98
+             101:      9(int) Constant 264
+   102(myblock2):             TypeStruct 23(float) 27(fvec4) 29
+             103:      9(int) Constant 81
+             104:             TypeArray 102(myblock2) 103
+             105:             TypePointer Output 104
+       106(blk2):    105(ptr) Variable Output
+             112:   23(float) Constant 1101004800
+             116:   23(float) Constant 1101529088
+             117:   23(float) Constant 1102053376
+             118:   23(float) Constant 1102577664
+             119:   23(float) Constant 1103101952
+             120:   27(fvec4) ConstantComposite 116 117 118 119
+             132:   23(float) Constant 1105723392
+             142:   10(ivec3) ConstantComposite 34 69 69
          4(main):           2 Function None 3
                5:             Label
           8(iid):      7(ptr) Variable Function
@@ -142,64 +142,69 @@
               66:      6(int) SDiv 65 52
               67:     58(ptr) AccessChain 37(blk) 66 52
               68:   26(fvec3) Load 67
-              70:     69(ptr) AccessChain 37(blk) 63 64 44
-              71:   27(fvec4) Load 70
-              72:   27(fvec4) VectorShuffle 71 68 0 4 5 6
-                              Store 70 72
-              73:      6(int) Load 8(iid)
-              75:      6(int) SDiv 73 74
-              78:     69(ptr) AccessChain 37(blk) 75 74 52
-              79:   27(fvec4) Load 78
-              80:   27(fvec4) VectorShuffle 79 77 7 6 5 4
-                              Store 78 80
-              81:      6(int) Load 8(iid)
-              83:      6(int) Load 8(iid)
-              84:      6(int) SDiv 83 74
-              86:     41(ptr) AccessChain 37(blk) 84 74 52 85
-              87:   23(float) Load 86
-              89:     41(ptr) AccessChain 37(blk) 81 82 39 44 88
-                              Store 89 87
-              90:      6(int) Load 8(iid)
-              91:      6(int) IMul 90 74
-              92:      6(int) Load 18(gid)
-              97:     58(ptr) AccessChain 37(blk) 91 82 44 92
-                              Store 97 96
-                              MemoryBarrier 88 98
-                              ControlBarrier 31 31 98
-             104:      6(int) Load 8(iid)
-             105:      6(int) Load 8(iid)
-             106:      6(int) ISub 105 44
-             107:     41(ptr) AccessChain 103(blk2) 106 39
-             108:   23(float) Load 107
-             110:   23(float) FAdd 108 109
-             111:     41(ptr) AccessChain 103(blk2) 104 39
-                              Store 111 110
-             112:      6(int) Load 8(iid)
-             118:     69(ptr) AccessChain 103(blk2) 112 44
-                              Store 118 117
-             119:      6(int) Load 8(iid)
-             120:      6(int) IAdd 119 44
-             121:      6(int) Load 18(gid)
+              70:     41(ptr) AccessChain 37(blk) 63 64 44 69
+              71:   23(float) CompositeExtract 68 0
+                              Store 70 71
+              72:     41(ptr) AccessChain 37(blk) 63 64 44 31
+              73:   23(float) CompositeExtract 68 1
+                              Store 72 73
+              75:     41(ptr) AccessChain 37(blk) 63 64 44 74
+              76:   23(float) CompositeExtract 68 2
+                              Store 75 76
+              77:      6(int) Load 8(iid)
+              79:      6(int) SDiv 77 78
+              83:     82(ptr) AccessChain 37(blk) 79 78 52
+              84:   27(fvec4) Load 83
+              85:   27(fvec4) VectorShuffle 84 81 7 6 5 4
+                              Store 83 85
+              86:      6(int) Load 8(iid)
+              88:      6(int) Load 8(iid)
+              89:      6(int) SDiv 88 78
+              90:     41(ptr) AccessChain 37(blk) 89 78 52 74
+              91:   23(float) Load 90
+              92:     41(ptr) AccessChain 37(blk) 86 87 39 44 69
+                              Store 92 91
+              93:      6(int) Load 8(iid)
+              94:      6(int) IMul 93 78
+              95:      6(int) Load 18(gid)
+             100:     58(ptr) AccessChain 37(blk) 94 87 44 95
+                              Store 100 99
+                              MemoryBarrier 69 101
+                              ControlBarrier 31 31 101
+             107:      6(int) Load 8(iid)
+             108:      6(int) Load 8(iid)
+             109:      6(int) ISub 108 44
+             110:     41(ptr) AccessChain 106(blk2) 109 39
+             111:   23(float) Load 110
+             113:   23(float) FAdd 111 112
+             114:     41(ptr) AccessChain 106(blk2) 107 39
+                              Store 114 113
+             115:      6(int) Load 8(iid)
+             121:     82(ptr) AccessChain 106(blk2) 115 44
+                              Store 121 120
              122:      6(int) Load 8(iid)
-             123:     69(ptr) AccessChain 103(blk2) 122 44
-             124:   27(fvec4) Load 123
-             125:     69(ptr) AccessChain 103(blk2) 120 52 121
-                              Store 125 124
-             126:      6(int) Load 8(iid)
-             127:      6(int) IAdd 126 44
-             128:      6(int) Load 18(gid)
-             130:     41(ptr) AccessChain 103(blk2) 127 52 128 31
-                              Store 130 129
-             131:      6(int) Load 8(iid)
-             132:      6(int) IAdd 131 52
-             133:      6(int) Load 8(iid)
-             134:      6(int) IAdd 133 44
-             135:      6(int) Load 18(gid)
-             136:     69(ptr) AccessChain 103(blk2) 134 52 135
-             137:   27(fvec4) Load 136
-             138:     69(ptr) AccessChain 103(blk2) 132 52 64
-                              Store 138 137
-                              MemoryBarrier 88 98
-                              ControlBarrier 31 31 98
+             123:      6(int) IAdd 122 44
+             124:      6(int) Load 18(gid)
+             125:      6(int) Load 8(iid)
+             126:     82(ptr) AccessChain 106(blk2) 125 44
+             127:   27(fvec4) Load 126
+             128:     82(ptr) AccessChain 106(blk2) 123 52 124
+                              Store 128 127
+             129:      6(int) Load 8(iid)
+             130:      6(int) IAdd 129 44
+             131:      6(int) Load 18(gid)
+             133:     41(ptr) AccessChain 106(blk2) 130 52 131 31
+                              Store 133 132
+             134:      6(int) Load 8(iid)
+             135:      6(int) IAdd 134 52
+             136:      6(int) Load 8(iid)
+             137:      6(int) IAdd 136 44
+             138:      6(int) Load 18(gid)
+             139:     82(ptr) AccessChain 106(blk2) 137 52 138
+             140:   27(fvec4) Load 139
+             141:     82(ptr) AccessChain 106(blk2) 135 52 64
+                              Store 141 140
+                              MemoryBarrier 69 101
+                              ControlBarrier 31 31 101
                               Return
                               FunctionEnd
diff --git a/third_party/vulkan-deps/glslang/src/Test/baseResults/spv.400.frag.nanclamp.out b/third_party/vulkan-deps/glslang/src/Test/baseResults/spv.400.frag.nanclamp.out
index 57f4365..cf1ffb0 100644
--- a/third_party/vulkan-deps/glslang/src/Test/baseResults/spv.400.frag.nanclamp.out
+++ b/third_party/vulkan-deps/glslang/src/Test/baseResults/spv.400.frag.nanclamp.out
@@ -1,7 +1,7 @@
 spv.400.frag
 // Module Version 10000
 // Generated by (magic number): 8000a
-// Id's are bound by 1118
+// Id's are bound by 1122
 
                               Capability Shader
                               Capability Geometry
@@ -11,7 +11,7 @@
                               Capability SampledRect
                1:             ExtInstImport  "GLSL.std.450"
                               MemoryModel Logical GLSL450
-                              EntryPoint Fragment 4  "main" 13 1027 1033 1038 1050 1076 1097 1099 1105 1107 1116
+                              EntryPoint Fragment 4  "main" 13 1027 1033 1038 1054 1080 1101 1103 1109 1111 1120
                               ExecutionMode 4 OriginUpperLeft
                               Source GLSL 400
                               SourceExtension  "GL_ARB_separate_shader_objects"
@@ -42,16 +42,16 @@
                               Name 1027  "i"
                               Name 1033  "c2D"
                               Name 1038  "gl_ClipDistance"
-                              Name 1050  "uoutp"
-                              Name 1054  "samp2dr"
-                              Name 1076  "ioutp"
-                              Name 1080  "isamp2DA"
-                              Name 1097  "gl_FragCoord"
-                              Name 1099  "vl2"
-                              Name 1105  "uo"
-                              Name 1107  "u"
-                              Name 1115  "id"
-                              Name 1116  "gl_PrimitiveID"
+                              Name 1054  "uoutp"
+                              Name 1058  "samp2dr"
+                              Name 1080  "ioutp"
+                              Name 1084  "isamp2DA"
+                              Name 1101  "gl_FragCoord"
+                              Name 1103  "vl2"
+                              Name 1109  "uo"
+                              Name 1111  "u"
+                              Name 1119  "id"
+                              Name 1120  "gl_PrimitiveID"
                               Decorate 13(outp) Location 1
                               Decorate 17(u2drs) DescriptorSet 0
                               Decorate 17(u2drs) Binding 3
@@ -61,19 +61,19 @@
                               Decorate 1027(i) Location 1
                               Decorate 1033(c2D) Location 0
                               Decorate 1038(gl_ClipDistance) BuiltIn ClipDistance
-                              Decorate 1050(uoutp) Location 3
-                              Decorate 1054(samp2dr) DescriptorSet 0
-                              Decorate 1054(samp2dr) Binding 1
-                              Decorate 1076(ioutp) Location 2
-                              Decorate 1080(isamp2DA) DescriptorSet 0
-                              Decorate 1080(isamp2DA) Binding 2
-                              Decorate 1097(gl_FragCoord) BuiltIn FragCoord
-                              Decorate 1099(vl2) Location 6
-                              Decorate 1105(uo) Location 0
-                              Decorate 1107(u) Flat
-                              Decorate 1107(u) Location 2
-                              Decorate 1116(gl_PrimitiveID) Flat
-                              Decorate 1116(gl_PrimitiveID) BuiltIn PrimitiveId
+                              Decorate 1054(uoutp) Location 3
+                              Decorate 1058(samp2dr) DescriptorSet 0
+                              Decorate 1058(samp2dr) Binding 1
+                              Decorate 1080(ioutp) Location 2
+                              Decorate 1084(isamp2DA) DescriptorSet 0
+                              Decorate 1084(isamp2DA) Binding 2
+                              Decorate 1101(gl_FragCoord) BuiltIn FragCoord
+                              Decorate 1103(vl2) Location 6
+                              Decorate 1109(uo) Location 0
+                              Decorate 1111(u) Flat
+                              Decorate 1111(u) Location 2
+                              Decorate 1120(gl_PrimitiveID) Flat
+                              Decorate 1120(gl_PrimitiveID) BuiltIn PrimitiveId
                2:             TypeVoid
                3:             TypeFunction 2
               10:             TypeFloat 32
@@ -161,46 +161,46 @@
 1038(gl_ClipDistance):   1037(ptr) Variable Input
             1039:             TypePointer Input 10(float)
             1043:             TypeVector 10(float) 3
-            1048:             TypeVector 32(int) 4
-            1049:             TypePointer Output 1048(ivec4)
-     1050(uoutp):   1049(ptr) Variable Output
-            1051:             TypeImage 32(int) Rect sampled format:Unknown
-            1052:             TypeSampledImage 1051
-            1053:             TypePointer UniformConstant 1052
-   1054(samp2dr):   1053(ptr) Variable UniformConstant
-            1057:     32(int) Constant 4
-            1058:             TypeArray 24(ivec2) 1057
-            1059:   24(ivec2) ConstantComposite 966 970
-            1060:     23(int) Constant 15
-            1061:     23(int) Constant 16
-            1062:   24(ivec2) ConstantComposite 1060 1061
-            1063:     23(int) Constant 4294967294
-            1064:     23(int) Constant 0
-            1065:   24(ivec2) ConstantComposite 1063 1064
-            1066:        1058 ConstantComposite 1059 27 1062 1065
-            1074:             TypeVector 23(int) 4
-            1075:             TypePointer Output 1074(ivec4)
-     1076(ioutp):   1075(ptr) Variable Output
-            1077:             TypeImage 23(int) 2D array sampled format:Unknown
-            1078:             TypeSampledImage 1077
-            1079:             TypePointer UniformConstant 1078
-  1080(isamp2DA):   1079(ptr) Variable UniformConstant
-            1082:   10(float) Constant 1036831949
-            1083: 1043(fvec3) ConstantComposite 1082 1082 1082
-            1084:   24(ivec2) ConstantComposite 966 966
-            1096:             TypePointer Input 11(fvec4)
-1097(gl_FragCoord):   1096(ptr) Variable Input
-       1099(vl2):   1096(ptr) Variable Input
-            1104:             TypePointer Output 32(int)
-        1105(uo):   1104(ptr) Variable Output
-            1106:             TypePointer Input 32(int)
-         1107(u):   1106(ptr) Variable Input
-            1114:             TypePointer Function 23(int)
-1116(gl_PrimitiveID):   1026(ptr) Variable Input
+            1052:             TypeVector 32(int) 4
+            1053:             TypePointer Output 1052(ivec4)
+     1054(uoutp):   1053(ptr) Variable Output
+            1055:             TypeImage 32(int) Rect sampled format:Unknown
+            1056:             TypeSampledImage 1055
+            1057:             TypePointer UniformConstant 1056
+   1058(samp2dr):   1057(ptr) Variable UniformConstant
+            1061:     32(int) Constant 4
+            1062:             TypeArray 24(ivec2) 1061
+            1063:   24(ivec2) ConstantComposite 966 970
+            1064:     23(int) Constant 15
+            1065:     23(int) Constant 16
+            1066:   24(ivec2) ConstantComposite 1064 1065
+            1067:     23(int) Constant 4294967294
+            1068:     23(int) Constant 0
+            1069:   24(ivec2) ConstantComposite 1067 1068
+            1070:        1062 ConstantComposite 1063 27 1066 1069
+            1078:             TypeVector 23(int) 4
+            1079:             TypePointer Output 1078(ivec4)
+     1080(ioutp):   1079(ptr) Variable Output
+            1081:             TypeImage 23(int) 2D array sampled format:Unknown
+            1082:             TypeSampledImage 1081
+            1083:             TypePointer UniformConstant 1082
+  1084(isamp2DA):   1083(ptr) Variable UniformConstant
+            1086:   10(float) Constant 1036831949
+            1087: 1043(fvec3) ConstantComposite 1086 1086 1086
+            1088:   24(ivec2) ConstantComposite 966 966
+            1100:             TypePointer Input 11(fvec4)
+1101(gl_FragCoord):   1100(ptr) Variable Input
+       1103(vl2):   1100(ptr) Variable Input
+            1108:             TypePointer Output 32(int)
+        1109(uo):   1108(ptr) Variable Output
+            1110:             TypePointer Input 32(int)
+         1111(u):   1110(ptr) Variable Input
+            1118:             TypePointer Function 23(int)
+1120(gl_PrimitiveID):   1026(ptr) Variable Input
          4(main):           2 Function None 3
                5:             Label
          1019(v):   1018(ptr) Variable Function
-        1115(id):   1114(ptr) Variable Function
+        1119(id):   1118(ptr) Variable Function
             1028:     23(int) Load 1027(i)
             1030:   1029(ptr) AccessChain 1025(arrayedSampler) 1028
             1031:        1021 Load 1030
@@ -213,50 +213,56 @@
                               Store 1042 1041
             1044:   11(fvec4) Load 1019(v)
             1045: 1043(fvec3) VectorShuffle 1044 1044 1 2 3
-            1046:   11(fvec4) Load 13(outp)
-            1047:   11(fvec4) VectorShuffle 1046 1045 0 4 5 6
-                              Store 13(outp) 1047
-            1055:        1052 Load 1054(samp2dr)
-            1056:   20(fvec2) Load 1033(c2D)
-            1067: 1048(ivec4) ImageGather 1055 1056 970 ConstOffsets 1066
-                              Store 1050(uoutp) 1067
-            1068:   1029(ptr) AccessChain 1025(arrayedSampler) 1064
-            1069:        1021 Load 1068
-            1070:   20(fvec2) Load 1033(c2D)
-            1071:   11(fvec4) ImageGather 1069 1070 1064
-            1072:   11(fvec4) Load 13(outp)
-            1073:   11(fvec4) FAdd 1072 1071
-                              Store 13(outp) 1073
-            1081:        1078 Load 1080(isamp2DA)
-            1085: 1074(ivec4) ImageGather 1081 1083 25 ConstOffset 1084
-                              Store 1076(ioutp) 1085
-            1086:        1078 Load 1080(isamp2DA)
-            1087: 1074(ivec4) ImageGather 1086 1083 25 ConstOffset 1084
-            1088: 1074(ivec4) Load 1076(ioutp)
-            1089: 1074(ivec4) IAdd 1088 1087
-                              Store 1076(ioutp) 1089
-            1090:        1078 Load 1080(isamp2DA)
-            1091:     23(int) Load 1027(i)
-            1092:   24(ivec2) CompositeConstruct 1091 1091
-            1093: 1074(ivec4) ImageGather 1090 1083 1064 Offset 1092
-            1094: 1074(ivec4) Load 1076(ioutp)
-            1095: 1074(ivec4) IAdd 1094 1093
-                              Store 1076(ioutp) 1095
-            1098:   11(fvec4) Load 1097(gl_FragCoord)
-            1100:   11(fvec4) Load 1099(vl2)
-            1101:   11(fvec4) FAdd 1098 1100
-            1102:   11(fvec4) Load 13(outp)
-            1103:   11(fvec4) FAdd 1102 1101
-                              Store 13(outp) 1103
-            1108:     32(int) Load 1107(u)
-            1109:     23(int) Load 1027(i)
-            1110:     32(int) Bitcast 1109
-            1111:     32(int) UMod 1108 1110
-                              Store 1105(uo) 1111
-            1112:           2 FunctionCall 6(foo23()
-            1113:           2 FunctionCall 8(doubles()
-            1117:     23(int) Load 1116(gl_PrimitiveID)
-                              Store 1115(id) 1117
+            1046:     34(ptr) AccessChain 13(outp) 954
+            1047:   10(float) CompositeExtract 1045 0
+                              Store 1046 1047
+            1048:     34(ptr) AccessChain 13(outp) 958
+            1049:   10(float) CompositeExtract 1045 1
+                              Store 1048 1049
+            1050:     34(ptr) AccessChain 13(outp) 962
+            1051:   10(float) CompositeExtract 1045 2
+                              Store 1050 1051
+            1059:        1056 Load 1058(samp2dr)
+            1060:   20(fvec2) Load 1033(c2D)
+            1071: 1052(ivec4) ImageGather 1059 1060 970 ConstOffsets 1070
+                              Store 1054(uoutp) 1071
+            1072:   1029(ptr) AccessChain 1025(arrayedSampler) 1068
+            1073:        1021 Load 1072
+            1074:   20(fvec2) Load 1033(c2D)
+            1075:   11(fvec4) ImageGather 1073 1074 1068
+            1076:   11(fvec4) Load 13(outp)
+            1077:   11(fvec4) FAdd 1076 1075
+                              Store 13(outp) 1077
+            1085:        1082 Load 1084(isamp2DA)
+            1089: 1078(ivec4) ImageGather 1085 1087 25 ConstOffset 1088
+                              Store 1080(ioutp) 1089
+            1090:        1082 Load 1084(isamp2DA)
+            1091: 1078(ivec4) ImageGather 1090 1087 25 ConstOffset 1088
+            1092: 1078(ivec4) Load 1080(ioutp)
+            1093: 1078(ivec4) IAdd 1092 1091
+                              Store 1080(ioutp) 1093
+            1094:        1082 Load 1084(isamp2DA)
+            1095:     23(int) Load 1027(i)
+            1096:   24(ivec2) CompositeConstruct 1095 1095
+            1097: 1078(ivec4) ImageGather 1094 1087 1068 Offset 1096
+            1098: 1078(ivec4) Load 1080(ioutp)
+            1099: 1078(ivec4) IAdd 1098 1097
+                              Store 1080(ioutp) 1099
+            1102:   11(fvec4) Load 1101(gl_FragCoord)
+            1104:   11(fvec4) Load 1103(vl2)
+            1105:   11(fvec4) FAdd 1102 1104
+            1106:   11(fvec4) Load 13(outp)
+            1107:   11(fvec4) FAdd 1106 1105
+                              Store 13(outp) 1107
+            1112:     32(int) Load 1111(u)
+            1113:     23(int) Load 1027(i)
+            1114:     32(int) Bitcast 1113
+            1115:     32(int) UMod 1112 1114
+                              Store 1109(uo) 1115
+            1116:           2 FunctionCall 6(foo23()
+            1117:           2 FunctionCall 8(doubles()
+            1121:     23(int) Load 1120(gl_PrimitiveID)
+                              Store 1119(id) 1121
                               Return
                               FunctionEnd
        6(foo23():           2 Function None 3
diff --git a/third_party/vulkan-deps/glslang/src/Test/baseResults/spv.400.frag.out b/third_party/vulkan-deps/glslang/src/Test/baseResults/spv.400.frag.out
index 2e7b2f5..6786885 100644
--- a/third_party/vulkan-deps/glslang/src/Test/baseResults/spv.400.frag.out
+++ b/third_party/vulkan-deps/glslang/src/Test/baseResults/spv.400.frag.out
@@ -2,7 +2,7 @@
 Validation failed
 // Module Version 10000
 // Generated by (magic number): 8000a
-// Id's are bound by 1118
+// Id's are bound by 1122
 
                               Capability Shader
                               Capability Geometry
@@ -12,7 +12,7 @@
                               Capability SampledRect
                1:             ExtInstImport  "GLSL.std.450"
                               MemoryModel Logical GLSL450
-                              EntryPoint Fragment 4  "main" 13 1027 1033 1038 1050 1076 1097 1099 1105 1107 1116
+                              EntryPoint Fragment 4  "main" 13 1027 1033 1038 1054 1080 1101 1103 1109 1111 1120
                               ExecutionMode 4 OriginUpperLeft
                               Source GLSL 400
                               SourceExtension  "GL_ARB_separate_shader_objects"
@@ -43,16 +43,16 @@
                               Name 1027  "i"
                               Name 1033  "c2D"
                               Name 1038  "gl_ClipDistance"
-                              Name 1050  "uoutp"
-                              Name 1054  "samp2dr"
-                              Name 1076  "ioutp"
-                              Name 1080  "isamp2DA"
-                              Name 1097  "gl_FragCoord"
-                              Name 1099  "vl2"
-                              Name 1105  "uo"
-                              Name 1107  "u"
-                              Name 1115  "id"
-                              Name 1116  "gl_PrimitiveID"
+                              Name 1054  "uoutp"
+                              Name 1058  "samp2dr"
+                              Name 1080  "ioutp"
+                              Name 1084  "isamp2DA"
+                              Name 1101  "gl_FragCoord"
+                              Name 1103  "vl2"
+                              Name 1109  "uo"
+                              Name 1111  "u"
+                              Name 1119  "id"
+                              Name 1120  "gl_PrimitiveID"
                               Decorate 13(outp) Location 1
                               Decorate 17(u2drs) DescriptorSet 0
                               Decorate 17(u2drs) Binding 3
@@ -62,19 +62,19 @@
                               Decorate 1027(i) Location 1
                               Decorate 1033(c2D) Location 0
                               Decorate 1038(gl_ClipDistance) BuiltIn ClipDistance
-                              Decorate 1050(uoutp) Location 3
-                              Decorate 1054(samp2dr) DescriptorSet 0
-                              Decorate 1054(samp2dr) Binding 1
-                              Decorate 1076(ioutp) Location 2
-                              Decorate 1080(isamp2DA) DescriptorSet 0
-                              Decorate 1080(isamp2DA) Binding 2
-                              Decorate 1097(gl_FragCoord) BuiltIn FragCoord
-                              Decorate 1099(vl2) Location 6
-                              Decorate 1105(uo) Location 0
-                              Decorate 1107(u) Flat
-                              Decorate 1107(u) Location 2
-                              Decorate 1116(gl_PrimitiveID) Flat
-                              Decorate 1116(gl_PrimitiveID) BuiltIn PrimitiveId
+                              Decorate 1054(uoutp) Location 3
+                              Decorate 1058(samp2dr) DescriptorSet 0
+                              Decorate 1058(samp2dr) Binding 1
+                              Decorate 1080(ioutp) Location 2
+                              Decorate 1084(isamp2DA) DescriptorSet 0
+                              Decorate 1084(isamp2DA) Binding 2
+                              Decorate 1101(gl_FragCoord) BuiltIn FragCoord
+                              Decorate 1103(vl2) Location 6
+                              Decorate 1109(uo) Location 0
+                              Decorate 1111(u) Flat
+                              Decorate 1111(u) Location 2
+                              Decorate 1120(gl_PrimitiveID) Flat
+                              Decorate 1120(gl_PrimitiveID) BuiltIn PrimitiveId
                2:             TypeVoid
                3:             TypeFunction 2
               10:             TypeFloat 32
@@ -162,46 +162,46 @@
 1038(gl_ClipDistance):   1037(ptr) Variable Input
             1039:             TypePointer Input 10(float)
             1043:             TypeVector 10(float) 3
-            1048:             TypeVector 32(int) 4
-            1049:             TypePointer Output 1048(ivec4)
-     1050(uoutp):   1049(ptr) Variable Output
-            1051:             TypeImage 32(int) Rect sampled format:Unknown
-            1052:             TypeSampledImage 1051
-            1053:             TypePointer UniformConstant 1052
-   1054(samp2dr):   1053(ptr) Variable UniformConstant
-            1057:     32(int) Constant 4
-            1058:             TypeArray 24(ivec2) 1057
-            1059:   24(ivec2) ConstantComposite 966 970
-            1060:     23(int) Constant 15
-            1061:     23(int) Constant 16
-            1062:   24(ivec2) ConstantComposite 1060 1061
-            1063:     23(int) Constant 4294967294
-            1064:     23(int) Constant 0
-            1065:   24(ivec2) ConstantComposite 1063 1064
-            1066:        1058 ConstantComposite 1059 27 1062 1065
-            1074:             TypeVector 23(int) 4
-            1075:             TypePointer Output 1074(ivec4)
-     1076(ioutp):   1075(ptr) Variable Output
-            1077:             TypeImage 23(int) 2D array sampled format:Unknown
-            1078:             TypeSampledImage 1077
-            1079:             TypePointer UniformConstant 1078
-  1080(isamp2DA):   1079(ptr) Variable UniformConstant
-            1082:   10(float) Constant 1036831949
-            1083: 1043(fvec3) ConstantComposite 1082 1082 1082
-            1084:   24(ivec2) ConstantComposite 966 966
-            1096:             TypePointer Input 11(fvec4)
-1097(gl_FragCoord):   1096(ptr) Variable Input
-       1099(vl2):   1096(ptr) Variable Input
-            1104:             TypePointer Output 32(int)
-        1105(uo):   1104(ptr) Variable Output
-            1106:             TypePointer Input 32(int)
-         1107(u):   1106(ptr) Variable Input
-            1114:             TypePointer Function 23(int)
-1116(gl_PrimitiveID):   1026(ptr) Variable Input
+            1052:             TypeVector 32(int) 4
+            1053:             TypePointer Output 1052(ivec4)
+     1054(uoutp):   1053(ptr) Variable Output
+            1055:             TypeImage 32(int) Rect sampled format:Unknown
+            1056:             TypeSampledImage 1055
+            1057:             TypePointer UniformConstant 1056
+   1058(samp2dr):   1057(ptr) Variable UniformConstant
+            1061:     32(int) Constant 4
+            1062:             TypeArray 24(ivec2) 1061
+            1063:   24(ivec2) ConstantComposite 966 970
+            1064:     23(int) Constant 15
+            1065:     23(int) Constant 16
+            1066:   24(ivec2) ConstantComposite 1064 1065
+            1067:     23(int) Constant 4294967294
+            1068:     23(int) Constant 0
+            1069:   24(ivec2) ConstantComposite 1067 1068
+            1070:        1062 ConstantComposite 1063 27 1066 1069
+            1078:             TypeVector 23(int) 4
+            1079:             TypePointer Output 1078(ivec4)
+     1080(ioutp):   1079(ptr) Variable Output
+            1081:             TypeImage 23(int) 2D array sampled format:Unknown
+            1082:             TypeSampledImage 1081
+            1083:             TypePointer UniformConstant 1082
+  1084(isamp2DA):   1083(ptr) Variable UniformConstant
+            1086:   10(float) Constant 1036831949
+            1087: 1043(fvec3) ConstantComposite 1086 1086 1086
+            1088:   24(ivec2) ConstantComposite 966 966
+            1100:             TypePointer Input 11(fvec4)
+1101(gl_FragCoord):   1100(ptr) Variable Input
+       1103(vl2):   1100(ptr) Variable Input
+            1108:             TypePointer Output 32(int)
+        1109(uo):   1108(ptr) Variable Output
+            1110:             TypePointer Input 32(int)
+         1111(u):   1110(ptr) Variable Input
+            1118:             TypePointer Function 23(int)
+1120(gl_PrimitiveID):   1026(ptr) Variable Input
          4(main):           2 Function None 3
                5:             Label
          1019(v):   1018(ptr) Variable Function
-        1115(id):   1114(ptr) Variable Function
+        1119(id):   1118(ptr) Variable Function
             1028:     23(int) Load 1027(i)
             1030:   1029(ptr) AccessChain 1025(arrayedSampler) 1028
             1031:        1021 Load 1030
@@ -214,50 +214,56 @@
                               Store 1042 1041
             1044:   11(fvec4) Load 1019(v)
             1045: 1043(fvec3) VectorShuffle 1044 1044 1 2 3
-            1046:   11(fvec4) Load 13(outp)
-            1047:   11(fvec4) VectorShuffle 1046 1045 0 4 5 6
-                              Store 13(outp) 1047
-            1055:        1052 Load 1054(samp2dr)
-            1056:   20(fvec2) Load 1033(c2D)
-            1067: 1048(ivec4) ImageGather 1055 1056 970 ConstOffsets 1066
-                              Store 1050(uoutp) 1067
-            1068:   1029(ptr) AccessChain 1025(arrayedSampler) 1064
-            1069:        1021 Load 1068
-            1070:   20(fvec2) Load 1033(c2D)
-            1071:   11(fvec4) ImageGather 1069 1070 1064
-            1072:   11(fvec4) Load 13(outp)
-            1073:   11(fvec4) FAdd 1072 1071
-                              Store 13(outp) 1073
-            1081:        1078 Load 1080(isamp2DA)
-            1085: 1074(ivec4) ImageGather 1081 1083 25 ConstOffset 1084
-                              Store 1076(ioutp) 1085
-            1086:        1078 Load 1080(isamp2DA)
-            1087: 1074(ivec4) ImageGather 1086 1083 25 ConstOffset 1084
-            1088: 1074(ivec4) Load 1076(ioutp)
-            1089: 1074(ivec4) IAdd 1088 1087
-                              Store 1076(ioutp) 1089
-            1090:        1078 Load 1080(isamp2DA)
-            1091:     23(int) Load 1027(i)
-            1092:   24(ivec2) CompositeConstruct 1091 1091
-            1093: 1074(ivec4) ImageGather 1090 1083 1064 Offset 1092
-            1094: 1074(ivec4) Load 1076(ioutp)
-            1095: 1074(ivec4) IAdd 1094 1093
-                              Store 1076(ioutp) 1095
-            1098:   11(fvec4) Load 1097(gl_FragCoord)
-            1100:   11(fvec4) Load 1099(vl2)
-            1101:   11(fvec4) FAdd 1098 1100
-            1102:   11(fvec4) Load 13(outp)
-            1103:   11(fvec4) FAdd 1102 1101
-                              Store 13(outp) 1103
-            1108:     32(int) Load 1107(u)
-            1109:     23(int) Load 1027(i)
-            1110:     32(int) Bitcast 1109
-            1111:     32(int) UMod 1108 1110
-                              Store 1105(uo) 1111
-            1112:           2 FunctionCall 6(foo23()
-            1113:           2 FunctionCall 8(doubles()
-            1117:     23(int) Load 1116(gl_PrimitiveID)
-                              Store 1115(id) 1117
+            1046:     34(ptr) AccessChain 13(outp) 954
+            1047:   10(float) CompositeExtract 1045 0
+                              Store 1046 1047
+            1048:     34(ptr) AccessChain 13(outp) 958
+            1049:   10(float) CompositeExtract 1045 1
+                              Store 1048 1049
+            1050:     34(ptr) AccessChain 13(outp) 962
+            1051:   10(float) CompositeExtract 1045 2
+                              Store 1050 1051
+            1059:        1056 Load 1058(samp2dr)
+            1060:   20(fvec2) Load 1033(c2D)
+            1071: 1052(ivec4) ImageGather 1059 1060 970 ConstOffsets 1070
+                              Store 1054(uoutp) 1071
+            1072:   1029(ptr) AccessChain 1025(arrayedSampler) 1068
+            1073:        1021 Load 1072
+            1074:   20(fvec2) Load 1033(c2D)
+            1075:   11(fvec4) ImageGather 1073 1074 1068
+            1076:   11(fvec4) Load 13(outp)
+            1077:   11(fvec4) FAdd 1076 1075
+                              Store 13(outp) 1077
+            1085:        1082 Load 1084(isamp2DA)
+            1089: 1078(ivec4) ImageGather 1085 1087 25 ConstOffset 1088
+                              Store 1080(ioutp) 1089
+            1090:        1082 Load 1084(isamp2DA)
+            1091: 1078(ivec4) ImageGather 1090 1087 25 ConstOffset 1088
+            1092: 1078(ivec4) Load 1080(ioutp)
+            1093: 1078(ivec4) IAdd 1092 1091
+                              Store 1080(ioutp) 1093
+            1094:        1082 Load 1084(isamp2DA)
+            1095:     23(int) Load 1027(i)
+            1096:   24(ivec2) CompositeConstruct 1095 1095
+            1097: 1078(ivec4) ImageGather 1094 1087 1068 Offset 1096
+            1098: 1078(ivec4) Load 1080(ioutp)
+            1099: 1078(ivec4) IAdd 1098 1097
+                              Store 1080(ioutp) 1099
+            1102:   11(fvec4) Load 1101(gl_FragCoord)
+            1104:   11(fvec4) Load 1103(vl2)
+            1105:   11(fvec4) FAdd 1102 1104
+            1106:   11(fvec4) Load 13(outp)
+            1107:   11(fvec4) FAdd 1106 1105
+                              Store 13(outp) 1107
+            1112:     32(int) Load 1111(u)
+            1113:     23(int) Load 1027(i)
+            1114:     32(int) Bitcast 1113
+            1115:     32(int) UMod 1112 1114
+                              Store 1109(uo) 1115
+            1116:           2 FunctionCall 6(foo23()
+            1117:           2 FunctionCall 8(doubles()
+            1121:     23(int) Load 1120(gl_PrimitiveID)
+                              Store 1119(id) 1121
                               Return
                               FunctionEnd
        6(foo23():           2 Function None 3
diff --git a/third_party/vulkan-deps/glslang/src/Test/baseResults/spv.AnyHitShaderMotion.rahit.out b/third_party/vulkan-deps/glslang/src/Test/baseResults/spv.AnyHitShaderMotion.rahit.out
new file mode 100644
index 0000000..f9e1e1b
--- /dev/null
+++ b/third_party/vulkan-deps/glslang/src/Test/baseResults/spv.AnyHitShaderMotion.rahit.out
@@ -0,0 +1,33 @@
+spv.AnyHitShaderMotion.rahit
+// Module Version 10400
+// Generated by (magic number): 8000a
+// Id's are bound by 14
+
+                              Capability RayTracingKHR
+                              Capability RayTracingMotionBlurNV
+                              Extension  "SPV_KHR_ray_tracing"
+                              Extension  "SPV_NV_ray_tracing_motion_blur"
+               1:             ExtInstImport  "GLSL.std.450"
+                              MemoryModel Logical GLSL450
+                              EntryPoint AnyHitKHR 4  "main" 10
+                              Source GLSL 460
+                              SourceExtension  "GL_NV_ray_tracing_motion_blur"
+                              Name 4  "main"
+                              Name 8  "time"
+                              Name 10  "gl_CurrentRayTimeNV"
+                              Decorate 10(gl_CurrentRayTimeNV) BuiltIn CurrentRayTimeNV
+               2:             TypeVoid
+               3:             TypeFunction 2
+               6:             TypeFloat 32
+               7:             TypePointer Function 6(float)
+               9:             TypePointer Input 6(float)
+10(gl_CurrentRayTimeNV):      9(ptr) Variable Input
+              12:    6(float) Constant 1056964608
+         4(main):           2 Function None 3
+               5:             Label
+         8(time):      7(ptr) Variable Function
+              11:    6(float) Load 10(gl_CurrentRayTimeNV)
+              13:    6(float) FAdd 11 12
+                              Store 8(time) 13
+                              Return
+                              FunctionEnd
diff --git a/third_party/vulkan-deps/glslang/src/Test/baseResults/spv.ClosestHitShaderMotion.rchit.out b/third_party/vulkan-deps/glslang/src/Test/baseResults/spv.ClosestHitShaderMotion.rchit.out
new file mode 100644
index 0000000..e89abb4
--- /dev/null
+++ b/third_party/vulkan-deps/glslang/src/Test/baseResults/spv.ClosestHitShaderMotion.rchit.out
@@ -0,0 +1,59 @@
+spv.ClosestHitShaderMotion.rchit
+// Module Version 10400
+// Generated by (magic number): 8000a
+// Id's are bound by 33
+
+                              Capability RayTracingKHR
+                              Capability RayTracingMotionBlurNV
+                              Extension  "SPV_KHR_ray_tracing"
+                              Extension  "SPV_NV_ray_tracing_motion_blur"
+               1:             ExtInstImport  "GLSL.std.450"
+                              MemoryModel Logical GLSL450
+                              EntryPoint ClosestHitKHR 4  "main" 10 16 32
+                              Source GLSL 460
+                              SourceExtension  "GL_EXT_ray_tracing"
+                              SourceExtension  "GL_NV_ray_tracing_motion_blur"
+                              Name 4  "main"
+                              Name 8  "time"
+                              Name 10  "gl_CurrentRayTimeNV"
+                              Name 16  "accEXT"
+                              Name 32  "incomingPayloadEXT"
+                              Decorate 10(gl_CurrentRayTimeNV) BuiltIn CurrentRayTimeNV
+                              Decorate 16(accEXT) DescriptorSet 0
+                              Decorate 16(accEXT) Binding 0
+                              Decorate 32(incomingPayloadEXT) Location 0
+               2:             TypeVoid
+               3:             TypeFunction 2
+               6:             TypeFloat 32
+               7:             TypePointer Function 6(float)
+               9:             TypePointer Input 6(float)
+10(gl_CurrentRayTimeNV):      9(ptr) Variable Input
+              12:    6(float) Constant 1056964608
+              14:             TypeAccelerationStructureKHR
+              15:             TypePointer UniformConstant 14
+      16(accEXT):     15(ptr) Variable UniformConstant
+              18:             TypeInt 32 0
+              19:     18(int) Constant 0
+              20:     18(int) Constant 1
+              21:     18(int) Constant 2
+              22:     18(int) Constant 3
+              23:             TypeVector 6(float) 3
+              24:   23(fvec3) ConstantComposite 12 12 12
+              25:    6(float) Constant 1065353216
+              26:   23(fvec3) ConstantComposite 25 25 25
+              27:    6(float) Constant 1061158912
+              28:             TypeInt 32 1
+              29:     28(int) Constant 0
+              30:             TypeVector 6(float) 4
+              31:             TypePointer IncomingRayPayloadKHR 30(fvec4)
+32(incomingPayloadEXT):     31(ptr) Variable IncomingRayPayloadKHR
+         4(main):           2 Function None 3
+               5:             Label
+         8(time):      7(ptr) Variable Function
+              11:    6(float) Load 10(gl_CurrentRayTimeNV)
+              13:    6(float) FAdd 11 12
+                              Store 8(time) 13
+              17:          14 Load 16(accEXT)
+                              TraceRayMotionNV 17 19 20 21 22 19 24 12 26 27 25 32(incomingPayloadEXT)
+                              Return
+                              FunctionEnd
diff --git a/third_party/vulkan-deps/glslang/src/Test/baseResults/spv.IntersectShaderMotion.rint.out b/third_party/vulkan-deps/glslang/src/Test/baseResults/spv.IntersectShaderMotion.rint.out
new file mode 100644
index 0000000..f77c9a8
--- /dev/null
+++ b/third_party/vulkan-deps/glslang/src/Test/baseResults/spv.IntersectShaderMotion.rint.out
@@ -0,0 +1,33 @@
+spv.IntersectShaderMotion.rint
+// Module Version 10400
+// Generated by (magic number): 8000a
+// Id's are bound by 14
+
+                              Capability RayTracingKHR
+                              Capability RayTracingMotionBlurNV
+                              Extension  "SPV_KHR_ray_tracing"
+                              Extension  "SPV_NV_ray_tracing_motion_blur"
+               1:             ExtInstImport  "GLSL.std.450"
+                              MemoryModel Logical GLSL450
+                              EntryPoint IntersectionKHR 4  "main" 10
+                              Source GLSL 460
+                              SourceExtension  "GL_NV_ray_tracing_motion_blur"
+                              Name 4  "main"
+                              Name 8  "time"
+                              Name 10  "gl_CurrentRayTimeNV"
+                              Decorate 10(gl_CurrentRayTimeNV) BuiltIn CurrentRayTimeNV
+               2:             TypeVoid
+               3:             TypeFunction 2
+               6:             TypeFloat 32
+               7:             TypePointer Function 6(float)
+               9:             TypePointer Input 6(float)
+10(gl_CurrentRayTimeNV):      9(ptr) Variable Input
+              12:    6(float) Constant 1056964608
+         4(main):           2 Function None 3
+               5:             Label
+         8(time):      7(ptr) Variable Function
+              11:    6(float) Load 10(gl_CurrentRayTimeNV)
+              13:    6(float) FAdd 11 12
+                              Store 8(time) 13
+                              Return
+                              FunctionEnd
diff --git a/third_party/vulkan-deps/glslang/src/Test/baseResults/spv.MissShaderMotion.rmiss.out b/third_party/vulkan-deps/glslang/src/Test/baseResults/spv.MissShaderMotion.rmiss.out
new file mode 100644
index 0000000..2f18338
--- /dev/null
+++ b/third_party/vulkan-deps/glslang/src/Test/baseResults/spv.MissShaderMotion.rmiss.out
@@ -0,0 +1,59 @@
+spv.MissShaderMotion.rmiss
+// Module Version 10400
+// Generated by (magic number): 8000a
+// Id's are bound by 33
+
+                              Capability RayTracingKHR
+                              Capability RayTracingMotionBlurNV
+                              Extension  "SPV_KHR_ray_tracing"
+                              Extension  "SPV_NV_ray_tracing_motion_blur"
+               1:             ExtInstImport  "GLSL.std.450"
+                              MemoryModel Logical GLSL450
+                              EntryPoint MissKHR 4  "main" 10 16 32
+                              Source GLSL 460
+                              SourceExtension  "GL_EXT_ray_tracing"
+                              SourceExtension  "GL_NV_ray_tracing_motion_blur"
+                              Name 4  "main"
+                              Name 8  "time"
+                              Name 10  "gl_CurrentRayTimeNV"
+                              Name 16  "accEXT"
+                              Name 32  "localPayloadEXT"
+                              Decorate 10(gl_CurrentRayTimeNV) BuiltIn CurrentRayTimeNV
+                              Decorate 16(accEXT) DescriptorSet 0
+                              Decorate 16(accEXT) Binding 0
+                              Decorate 32(localPayloadEXT) Location 0
+               2:             TypeVoid
+               3:             TypeFunction 2
+               6:             TypeFloat 32
+               7:             TypePointer Function 6(float)
+               9:             TypePointer Input 6(float)
+10(gl_CurrentRayTimeNV):      9(ptr) Variable Input
+              12:    6(float) Constant 1056964608
+              14:             TypeAccelerationStructureKHR
+              15:             TypePointer UniformConstant 14
+      16(accEXT):     15(ptr) Variable UniformConstant
+              18:             TypeInt 32 0
+              19:     18(int) Constant 0
+              20:     18(int) Constant 1
+              21:     18(int) Constant 2
+              22:     18(int) Constant 3
+              23:             TypeVector 6(float) 3
+              24:   23(fvec3) ConstantComposite 12 12 12
+              25:    6(float) Constant 1065353216
+              26:   23(fvec3) ConstantComposite 25 25 25
+              27:    6(float) Constant 1061158912
+              28:             TypeInt 32 1
+              29:     28(int) Constant 0
+              30:             TypeVector 6(float) 4
+              31:             TypePointer RayPayloadKHR 30(fvec4)
+32(localPayloadEXT):     31(ptr) Variable RayPayloadKHR
+         4(main):           2 Function None 3
+               5:             Label
+         8(time):      7(ptr) Variable Function
+              11:    6(float) Load 10(gl_CurrentRayTimeNV)
+              13:    6(float) FAdd 11 12
+                              Store 8(time) 13
+              17:          14 Load 16(accEXT)
+                              TraceRayMotionNV 17 19 20 21 22 19 24 12 26 27 25 32(localPayloadEXT)
+                              Return
+                              FunctionEnd
diff --git a/third_party/vulkan-deps/glslang/src/Test/baseResults/spv.Operations.frag.out b/third_party/vulkan-deps/glslang/src/Test/baseResults/spv.Operations.frag.out
index a856e6e..fc8e241 100644
--- a/third_party/vulkan-deps/glslang/src/Test/baseResults/spv.Operations.frag.out
+++ b/third_party/vulkan-deps/glslang/src/Test/baseResults/spv.Operations.frag.out
@@ -1,12 +1,12 @@
 spv.Operations.frag
 // Module Version 10000
 // Generated by (magic number): 8000a
-// Id's are bound by 583
+// Id's are bound by 591
 
                               Capability Shader
                1:             ExtInstImport  "GLSL.std.450"
                               MemoryModel Logical GLSL450
-                              EntryPoint Fragment 4  "main" 11 22 220 296 314 539 580
+                              EntryPoint Fragment 4  "main" 11 22 220 296 314 547 588
                               ExecutionMode 4 OriginUpperLeft
                               Source GLSL 450
                               Name 4  "main"
@@ -26,13 +26,13 @@
                               Name 324  "lsb"
                               Name 325  "swizzleTemp"
                               Name 326  "ResType"
-                              Name 359  "b"
-                              Name 396  "ub42"
-                              Name 539  "FragColor"
-                              Name 557  "m1"
-                              Name 564  "m2"
-                              Name 580  "uiv4"
-                              Name 582  "ub"
+                              Name 367  "b"
+                              Name 404  "ub42"
+                              Name 547  "FragColor"
+                              Name 565  "m1"
+                              Name 572  "m2"
+                              Name 588  "uiv4"
+                              Name 590  "ub"
                               Decorate 11(uv4) Location 1
                               Decorate 22(ui) Flat
                               Decorate 22(ui) Location 3
@@ -41,9 +41,9 @@
                               Decorate 296(uui) Location 5
                               Decorate 314(uuv4) Flat
                               Decorate 314(uuv4) Location 4
-                              Decorate 539(FragColor) Location 0
-                              Decorate 580(uiv4) Flat
-                              Decorate 580(uiv4) Location 0
+                              Decorate 547(FragColor) Location 0
+                              Decorate 588(uiv4) Flat
+                              Decorate 588(uiv4) Location 0
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeFloat 32
@@ -74,34 +74,34 @@
              320:             TypePointer Function 312(ivec4)
              322:             TypePointer Function 315(ivec3)
     326(ResType):             TypeStruct 315(ivec3) 315(ivec3)
-             338:    141(int) Constant 1
-             342:    141(int) Constant 2
-             358:             TypePointer Function 186(bool)
-       396(ub42):    188(ptr) Variable Private
-             452:     18(int) Constant 2
-             459:     18(int) Constant 1
-             489:             TypeVector 6(float) 3
-             508:    6(float) Constant 1073741824
-             515:    6(float) Constant 1065353216
-             520:     18(int) Constant 66
-             526:     18(int) Constant 17
-             538:             TypePointer Output 7(fvec4)
-  539(FragColor):    538(ptr) Variable Output
-             555:             TypeMatrix 7(fvec4) 4
-             556:             TypePointer Function 555
-             558:    6(float) Constant 0
-             559:    7(fvec4) ConstantComposite 515 558 558 558
-             560:    7(fvec4) ConstantComposite 558 515 558 558
-             561:    7(fvec4) ConstantComposite 558 558 515 558
-             562:    7(fvec4) ConstantComposite 558 558 558 515
-             563:         555 ConstantComposite 559 560 561 562
-             565:    7(fvec4) ConstantComposite 558 558 558 558
-             566:         555 ConstantComposite 565 565 565 565
-             578:             TypeVector 18(int) 4
-             579:             TypePointer Input 578(ivec4)
-       580(uiv4):    579(ptr) Variable Input
-             581:             TypePointer Private 186(bool)
-         582(ub):    581(ptr) Variable Private
+             333:    141(int) Constant 1
+             336:    141(int) Constant 2
+             366:             TypePointer Function 186(bool)
+       404(ub42):    188(ptr) Variable Private
+             460:     18(int) Constant 2
+             467:     18(int) Constant 1
+             497:             TypeVector 6(float) 3
+             516:    6(float) Constant 1073741824
+             523:    6(float) Constant 1065353216
+             528:     18(int) Constant 66
+             534:     18(int) Constant 17
+             546:             TypePointer Output 7(fvec4)
+  547(FragColor):    546(ptr) Variable Output
+             563:             TypeMatrix 7(fvec4) 4
+             564:             TypePointer Function 563
+             566:    6(float) Constant 0
+             567:    7(fvec4) ConstantComposite 523 566 566 566
+             568:    7(fvec4) ConstantComposite 566 523 566 566
+             569:    7(fvec4) ConstantComposite 566 566 523 566
+             570:    7(fvec4) ConstantComposite 566 566 566 523
+             571:         563 ConstantComposite 567 568 569 570
+             573:    7(fvec4) ConstantComposite 566 566 566 566
+             574:         563 ConstantComposite 573 573 573 573
+             586:             TypeVector 18(int) 4
+             587:             TypePointer Input 586(ivec4)
+       588(uiv4):    587(ptr) Variable Input
+             589:             TypePointer Private 186(bool)
+         590(ub):    589(ptr) Variable Private
          4(main):           2 Function None 3
                5:             Label
             9(v):      8(ptr) Variable Function
@@ -113,11 +113,11 @@
 323(swizzleTemp):    322(ptr) Variable Function
         324(lsb):    320(ptr) Variable Function
 325(swizzleTemp):    322(ptr) Variable Function
-          359(b):    358(ptr) Variable Function
-             541:      8(ptr) Variable Function
-         557(m1):    556(ptr) Variable Function
-         564(m2):    556(ptr) Variable Function
-             568:    556(ptr) Variable Function
+          367(b):    366(ptr) Variable Function
+             549:      8(ptr) Variable Function
+         565(m1):    564(ptr) Variable Function
+         572(m2):    564(ptr) Variable Function
+             576:    564(ptr) Variable Function
               12:    7(fvec4) Load 11(uv4)
               13:    7(fvec4) ExtInst 1(GLSL.std.450) 11(Radians) 12
                               Store 9(v) 13
@@ -469,306 +469,318 @@
              329:  315(ivec3) CompositeExtract 327 1
                               Store 323(swizzleTemp) 329
              330:  315(ivec3) Load 323(swizzleTemp)
-             331:  312(ivec4) Load 321(msb)
-             332:  312(ivec4) VectorShuffle 331 330 4 5 6 3
-                              Store 321(msb) 332
-             333:  315(ivec3) Load 325(swizzleTemp)
-             334:  312(ivec4) Load 324(lsb)
-             335:  312(ivec4) VectorShuffle 334 333 4 5 6 3
-                              Store 324(lsb) 335
-             336:    292(ptr) AccessChain 321(msb) 142
-             337:    141(int) Load 336
-             339:    292(ptr) AccessChain 321(msb) 338
-             340:    141(int) Load 339
-             341:    141(int) IAdd 337 340
-             343:    292(ptr) AccessChain 321(msb) 342
-             344:    141(int) Load 343
-             345:    141(int) IAdd 341 344
-             346:    141(int) Load 293(u)
-             347:    141(int) IAdd 346 345
-                              Store 293(u) 347
-             348:    292(ptr) AccessChain 324(lsb) 142
+             331:    292(ptr) AccessChain 321(msb) 142
+             332:    141(int) CompositeExtract 330 0
+                              Store 331 332
+             334:    292(ptr) AccessChain 321(msb) 333
+             335:    141(int) CompositeExtract 330 1
+                              Store 334 335
+             337:    292(ptr) AccessChain 321(msb) 336
+             338:    141(int) CompositeExtract 330 2
+                              Store 337 338
+             339:  315(ivec3) Load 325(swizzleTemp)
+             340:    292(ptr) AccessChain 324(lsb) 142
+             341:    141(int) CompositeExtract 339 0
+                              Store 340 341
+             342:    292(ptr) AccessChain 324(lsb) 333
+             343:    141(int) CompositeExtract 339 1
+                              Store 342 343
+             344:    292(ptr) AccessChain 324(lsb) 336
+             345:    141(int) CompositeExtract 339 2
+                              Store 344 345
+             346:    292(ptr) AccessChain 321(msb) 142
+             347:    141(int) Load 346
+             348:    292(ptr) AccessChain 321(msb) 333
              349:    141(int) Load 348
-             350:    292(ptr) AccessChain 324(lsb) 338
-             351:    141(int) Load 350
-             352:    141(int) IAdd 349 351
-             353:    292(ptr) AccessChain 324(lsb) 342
-             354:    141(int) Load 353
-             355:    141(int) IAdd 352 354
-             356:    141(int) Load 293(u)
-             357:    141(int) IAdd 356 355
-                              Store 293(u) 357
-             360:    6(float) Load 220(uf)
-             361:   186(bool) IsNan 360
-                              Store 359(b) 361
-             362:    6(float) Load 196(f)
-             363:   186(bool) IsInf 362
-                              Store 359(b) 363
-             364:    7(fvec4) Load 9(v)
-             365:    7(fvec4) Load 11(uv4)
-             366:  187(bvec4) FOrdLessThan 364 365
-             367:   186(bool) Any 366
-                              Store 359(b) 367
-             368:   186(bool) Load 359(b)
-                              SelectionMerge 370 None
-                              BranchConditional 368 369 370
-             369:               Label
-             371:    7(fvec4)   Load 9(v)
-             372:    7(fvec4)   Load 11(uv4)
-             373:  187(bvec4)   FOrdLessThanEqual 371 372
-             374:   186(bool)   Any 373
-                                Branch 370
-             370:             Label
-             375:   186(bool) Phi 368 5 374 369
-                              Store 359(b) 375
-             376:   186(bool) Load 359(b)
+             350:    141(int) IAdd 347 349
+             351:    292(ptr) AccessChain 321(msb) 336
+             352:    141(int) Load 351
+             353:    141(int) IAdd 350 352
+             354:    141(int) Load 293(u)
+             355:    141(int) IAdd 354 353
+                              Store 293(u) 355
+             356:    292(ptr) AccessChain 324(lsb) 142
+             357:    141(int) Load 356
+             358:    292(ptr) AccessChain 324(lsb) 333
+             359:    141(int) Load 358
+             360:    141(int) IAdd 357 359
+             361:    292(ptr) AccessChain 324(lsb) 336
+             362:    141(int) Load 361
+             363:    141(int) IAdd 360 362
+             364:    141(int) Load 293(u)
+             365:    141(int) IAdd 364 363
+                              Store 293(u) 365
+             368:    6(float) Load 220(uf)
+             369:   186(bool) IsNan 368
+                              Store 367(b) 369
+             370:    6(float) Load 196(f)
+             371:   186(bool) IsInf 370
+                              Store 367(b) 371
+             372:    7(fvec4) Load 9(v)
+             373:    7(fvec4) Load 11(uv4)
+             374:  187(bvec4) FOrdLessThan 372 373
+             375:   186(bool) Any 374
+                              Store 367(b) 375
+             376:   186(bool) Load 367(b)
                               SelectionMerge 378 None
                               BranchConditional 376 377 378
              377:               Label
              379:    7(fvec4)   Load 9(v)
              380:    7(fvec4)   Load 11(uv4)
-             381:  187(bvec4)   FOrdGreaterThan 379 380
+             381:  187(bvec4)   FOrdLessThanEqual 379 380
              382:   186(bool)   Any 381
                                 Branch 378
              378:             Label
-             383:   186(bool) Phi 376 370 382 377
-                              Store 359(b) 383
-             384:   186(bool) Load 359(b)
+             383:   186(bool) Phi 376 5 382 377
+                              Store 367(b) 383
+             384:   186(bool) Load 367(b)
                               SelectionMerge 386 None
                               BranchConditional 384 385 386
              385:               Label
              387:    7(fvec4)   Load 9(v)
              388:    7(fvec4)   Load 11(uv4)
-             389:  187(bvec4)   FOrdGreaterThanEqual 387 388
+             389:  187(bvec4)   FOrdGreaterThan 387 388
              390:   186(bool)   Any 389
                                 Branch 386
              386:             Label
              391:   186(bool) Phi 384 378 390 385
-                              Store 359(b) 391
-             392:   186(bool) Load 359(b)
+                              Store 367(b) 391
+             392:   186(bool) Load 367(b)
                               SelectionMerge 394 None
                               BranchConditional 392 393 394
              393:               Label
-             395:  187(bvec4)   Load 189(ub41)
-             397:  187(bvec4)   Load 396(ub42)
-             398:  187(bvec4)   LogicalEqual 395 397
-             399:   186(bool)   Any 398
+             395:    7(fvec4)   Load 9(v)
+             396:    7(fvec4)   Load 11(uv4)
+             397:  187(bvec4)   FOrdGreaterThanEqual 395 396
+             398:   186(bool)   Any 397
                                 Branch 394
              394:             Label
-             400:   186(bool) Phi 392 386 399 393
-                              Store 359(b) 400
-             401:   186(bool) Load 359(b)
-                              SelectionMerge 403 None
-                              BranchConditional 401 402 403
-             402:               Label
-             404:  187(bvec4)   Load 189(ub41)
-             405:  187(bvec4)   Load 396(ub42)
-             406:  187(bvec4)   LogicalNotEqual 404 405
+             399:   186(bool) Phi 392 386 398 393
+                              Store 367(b) 399
+             400:   186(bool) Load 367(b)
+                              SelectionMerge 402 None
+                              BranchConditional 400 401 402
+             401:               Label
+             403:  187(bvec4)   Load 189(ub41)
+             405:  187(bvec4)   Load 404(ub42)
+             406:  187(bvec4)   LogicalEqual 403 405
              407:   186(bool)   Any 406
-                                Branch 403
-             403:             Label
-             408:   186(bool) Phi 401 394 407 402
-                              Store 359(b) 408
-             409:   186(bool) Load 359(b)
-             410:  187(bvec4) Load 189(ub41)
-             411:   186(bool) Any 410
-             412:   186(bool) LogicalAnd 409 411
-                              Store 359(b) 412
-             413:   186(bool) Load 359(b)
-             414:  187(bvec4) Load 189(ub41)
-             415:   186(bool) All 414
-             416:   186(bool) LogicalAnd 413 415
-                              Store 359(b) 416
-             417:   186(bool) Load 359(b)
-                              SelectionMerge 419 None
-                              BranchConditional 417 418 419
-             418:               Label
-             420:  187(bvec4)   Load 189(ub41)
-             421:  187(bvec4)   LogicalNot 420
-             422:   186(bool)   Any 421
-                                Branch 419
-             419:             Label
-             423:   186(bool) Phi 417 403 422 418
-                              Store 359(b) 423
-             424:     18(int) Load 20(i)
-             425:     18(int) Load 22(ui)
-             426:     18(int) IAdd 424 425
-             427:     18(int) Load 20(i)
-             428:     18(int) IMul 426 427
-             429:     18(int) Load 22(ui)
-             430:     18(int) ISub 428 429
-             431:     18(int) Load 20(i)
-             432:     18(int) SDiv 430 431
-                              Store 20(i) 432
-             433:     18(int) Load 20(i)
-             434:     18(int) Load 22(ui)
-             435:     18(int) SMod 433 434
-                              Store 20(i) 435
-             436:     18(int) Load 20(i)
+                                Branch 402
+             402:             Label
+             408:   186(bool) Phi 400 394 407 401
+                              Store 367(b) 408
+             409:   186(bool) Load 367(b)
+                              SelectionMerge 411 None
+                              BranchConditional 409 410 411
+             410:               Label
+             412:  187(bvec4)   Load 189(ub41)
+             413:  187(bvec4)   Load 404(ub42)
+             414:  187(bvec4)   LogicalNotEqual 412 413
+             415:   186(bool)   Any 414
+                                Branch 411
+             411:             Label
+             416:   186(bool) Phi 409 402 415 410
+                              Store 367(b) 416
+             417:   186(bool) Load 367(b)
+             418:  187(bvec4) Load 189(ub41)
+             419:   186(bool) Any 418
+             420:   186(bool) LogicalAnd 417 419
+                              Store 367(b) 420
+             421:   186(bool) Load 367(b)
+             422:  187(bvec4) Load 189(ub41)
+             423:   186(bool) All 422
+             424:   186(bool) LogicalAnd 421 423
+                              Store 367(b) 424
+             425:   186(bool) Load 367(b)
+                              SelectionMerge 427 None
+                              BranchConditional 425 426 427
+             426:               Label
+             428:  187(bvec4)   Load 189(ub41)
+             429:  187(bvec4)   LogicalNot 428
+             430:   186(bool)   Any 429
+                                Branch 427
+             427:             Label
+             431:   186(bool) Phi 425 411 430 426
+                              Store 367(b) 431
+             432:     18(int) Load 20(i)
+             433:     18(int) Load 22(ui)
+             434:     18(int) IAdd 432 433
+             435:     18(int) Load 20(i)
+             436:     18(int) IMul 434 435
              437:     18(int) Load 22(ui)
-             438:   186(bool) IEqual 436 437
-             439:   186(bool) LogicalNot 438
-                              SelectionMerge 441 None
-                              BranchConditional 439 440 441
-             440:               Label
-             442:     18(int)   Load 20(i)
-             443:     18(int)   Load 22(ui)
-             444:   186(bool)   INotEqual 442 443
-                                SelectionMerge 446 None
-                                BranchConditional 444 445 446
-             445:                 Label
-             447:     18(int)     Load 20(i)
-             448:     18(int)     Load 22(ui)
-             449:   186(bool)     IEqual 447 448
-                                  Branch 446
-             446:               Label
-             450:   186(bool)   Phi 444 440 449 445
-             451:     18(int)   Load 20(i)
-             453:   186(bool)   INotEqual 451 452
-             454:   186(bool)   LogicalNotEqual 450 453
-                                Branch 441
-             441:             Label
-             455:   186(bool) Phi 438 419 454 446
-                              SelectionMerge 457 None
-                              BranchConditional 455 456 457
-             456:               Label
-             458:     18(int)   Load 20(i)
-             460:     18(int)   IAdd 458 459
-                                Store 20(i) 460
-                                Branch 457
-             457:             Label
-             461:    6(float) Load 220(uf)
-             462:    6(float) Load 220(uf)
-             463:    6(float) FAdd 461 462
-             464:    6(float) Load 220(uf)
-             465:    6(float) FMul 463 464
-             466:    6(float) Load 220(uf)
-             467:    6(float) FSub 465 466
-             468:    6(float) Load 220(uf)
-             469:    6(float) FDiv 467 468
-                              Store 196(f) 469
-             470:    7(fvec4) Load 9(v)
-             471:    6(float) ExtInst 1(GLSL.std.450) 66(Length) 470
-             472:    6(float) Load 196(f)
-             473:    6(float) FAdd 472 471
-                              Store 196(f) 473
-             474:    7(fvec4) Load 9(v)
-             475:    7(fvec4) Load 9(v)
-             476:    6(float) ExtInst 1(GLSL.std.450) 67(Distance) 474 475
-             477:    6(float) Load 196(f)
-             478:    6(float) FAdd 477 476
-                              Store 196(f) 478
-             479:    7(fvec4) Load 9(v)
-             480:    7(fvec4) Load 9(v)
-             481:    6(float) Dot 479 480
-             482:    6(float) Load 196(f)
-             483:    6(float) FAdd 482 481
-                              Store 196(f) 483
-             484:    6(float) Load 196(f)
-             485:    6(float) Load 220(uf)
-             486:    6(float) FMul 484 485
-             487:    6(float) Load 196(f)
-             488:    6(float) FAdd 487 486
-                              Store 196(f) 488
-             490:    7(fvec4) Load 9(v)
-             491:  489(fvec3) VectorShuffle 490 490 0 1 2
-             492:    7(fvec4) Load 9(v)
-             493:  489(fvec3) VectorShuffle 492 492 0 1 2
-             494:  489(fvec3) ExtInst 1(GLSL.std.450) 68(Cross) 491 493
-             495:    6(float) CompositeExtract 494 0
-             496:    6(float) Load 196(f)
-             497:    6(float) FAdd 496 495
-                              Store 196(f) 497
-             498:    6(float) Load 196(f)
-             499:    6(float) Load 220(uf)
-             500:   186(bool) FOrdEqual 498 499
-             501:   186(bool) LogicalNot 500
-                              SelectionMerge 503 None
-                              BranchConditional 501 502 503
-             502:               Label
-             504:    6(float)   Load 196(f)
-             505:    6(float)   Load 220(uf)
-             506:   186(bool)   FUnordNotEqual 504 505
-             507:    6(float)   Load 196(f)
-             509:   186(bool)   FUnordNotEqual 507 508
-             510:   186(bool)   LogicalAnd 506 509
-                                Branch 503
-             503:             Label
-             511:   186(bool) Phi 500 457 510 502
-                              SelectionMerge 513 None
-                              BranchConditional 511 512 513
-             512:               Label
-             514:    6(float)   Load 196(f)
-             516:    6(float)   FAdd 514 515
-                                Store 196(f) 516
-                                Branch 513
-             513:             Label
-             517:     18(int) Load 22(ui)
-             518:     18(int) Load 20(i)
-             519:     18(int) BitwiseAnd 518 517
-                              Store 20(i) 519
-             521:     18(int) Load 20(i)
-             522:     18(int) BitwiseOr 521 520
-                              Store 20(i) 522
-             523:     18(int) Load 22(ui)
-             524:     18(int) Load 20(i)
-             525:     18(int) BitwiseXor 524 523
-                              Store 20(i) 525
-             527:     18(int) Load 20(i)
-             528:     18(int) SMod 527 526
-                              Store 20(i) 528
+             438:     18(int) ISub 436 437
+             439:     18(int) Load 20(i)
+             440:     18(int) SDiv 438 439
+                              Store 20(i) 440
+             441:     18(int) Load 20(i)
+             442:     18(int) Load 22(ui)
+             443:     18(int) SMod 441 442
+                              Store 20(i) 443
+             444:     18(int) Load 20(i)
+             445:     18(int) Load 22(ui)
+             446:   186(bool) IEqual 444 445
+             447:   186(bool) LogicalNot 446
+                              SelectionMerge 449 None
+                              BranchConditional 447 448 449
+             448:               Label
+             450:     18(int)   Load 20(i)
+             451:     18(int)   Load 22(ui)
+             452:   186(bool)   INotEqual 450 451
+                                SelectionMerge 454 None
+                                BranchConditional 452 453 454
+             453:                 Label
+             455:     18(int)     Load 20(i)
+             456:     18(int)     Load 22(ui)
+             457:   186(bool)     IEqual 455 456
+                                  Branch 454
+             454:               Label
+             458:   186(bool)   Phi 452 448 457 453
+             459:     18(int)   Load 20(i)
+             461:   186(bool)   INotEqual 459 460
+             462:   186(bool)   LogicalNotEqual 458 461
+                                Branch 449
+             449:             Label
+             463:   186(bool) Phi 446 427 462 454
+                              SelectionMerge 465 None
+                              BranchConditional 463 464 465
+             464:               Label
+             466:     18(int)   Load 20(i)
+             468:     18(int)   IAdd 466 467
+                                Store 20(i) 468
+                                Branch 465
+             465:             Label
+             469:    6(float) Load 220(uf)
+             470:    6(float) Load 220(uf)
+             471:    6(float) FAdd 469 470
+             472:    6(float) Load 220(uf)
+             473:    6(float) FMul 471 472
+             474:    6(float) Load 220(uf)
+             475:    6(float) FSub 473 474
+             476:    6(float) Load 220(uf)
+             477:    6(float) FDiv 475 476
+                              Store 196(f) 477
+             478:    7(fvec4) Load 9(v)
+             479:    6(float) ExtInst 1(GLSL.std.450) 66(Length) 478
+             480:    6(float) Load 196(f)
+             481:    6(float) FAdd 480 479
+                              Store 196(f) 481
+             482:    7(fvec4) Load 9(v)
+             483:    7(fvec4) Load 9(v)
+             484:    6(float) ExtInst 1(GLSL.std.450) 67(Distance) 482 483
+             485:    6(float) Load 196(f)
+             486:    6(float) FAdd 485 484
+                              Store 196(f) 486
+             487:    7(fvec4) Load 9(v)
+             488:    7(fvec4) Load 9(v)
+             489:    6(float) Dot 487 488
+             490:    6(float) Load 196(f)
+             491:    6(float) FAdd 490 489
+                              Store 196(f) 491
+             492:    6(float) Load 196(f)
+             493:    6(float) Load 220(uf)
+             494:    6(float) FMul 492 493
+             495:    6(float) Load 196(f)
+             496:    6(float) FAdd 495 494
+                              Store 196(f) 496
+             498:    7(fvec4) Load 9(v)
+             499:  497(fvec3) VectorShuffle 498 498 0 1 2
+             500:    7(fvec4) Load 9(v)
+             501:  497(fvec3) VectorShuffle 500 500 0 1 2
+             502:  497(fvec3) ExtInst 1(GLSL.std.450) 68(Cross) 499 501
+             503:    6(float) CompositeExtract 502 0
+             504:    6(float) Load 196(f)
+             505:    6(float) FAdd 504 503
+                              Store 196(f) 505
+             506:    6(float) Load 196(f)
+             507:    6(float) Load 220(uf)
+             508:   186(bool) FOrdEqual 506 507
+             509:   186(bool) LogicalNot 508
+                              SelectionMerge 511 None
+                              BranchConditional 509 510 511
+             510:               Label
+             512:    6(float)   Load 196(f)
+             513:    6(float)   Load 220(uf)
+             514:   186(bool)   FUnordNotEqual 512 513
+             515:    6(float)   Load 196(f)
+             517:   186(bool)   FUnordNotEqual 515 516
+             518:   186(bool)   LogicalAnd 514 517
+                                Branch 511
+             511:             Label
+             519:   186(bool) Phi 508 465 518 510
+                              SelectionMerge 521 None
+                              BranchConditional 519 520 521
+             520:               Label
+             522:    6(float)   Load 196(f)
+             524:    6(float)   FAdd 522 523
+                                Store 196(f) 524
+                                Branch 521
+             521:             Label
+             525:     18(int) Load 22(ui)
+             526:     18(int) Load 20(i)
+             527:     18(int) BitwiseAnd 526 525
+                              Store 20(i) 527
              529:     18(int) Load 20(i)
-             530:     18(int) ShiftRightArithmetic 529 452
+             530:     18(int) BitwiseOr 529 528
                               Store 20(i) 530
              531:     18(int) Load 22(ui)
              532:     18(int) Load 20(i)
-             533:     18(int) ShiftLeftLogical 532 531
+             533:     18(int) BitwiseXor 532 531
                               Store 20(i) 533
-             534:     18(int) Load 20(i)
-             535:     18(int) Not 534
-                              Store 20(i) 535
-             536:   186(bool) Load 359(b)
-             537:   186(bool) LogicalNot 536
-                              Store 359(b) 537
-             540:   186(bool) Load 359(b)
-                              SelectionMerge 543 None
-                              BranchConditional 540 542 552
-             542:               Label
-             544:     18(int)   Load 20(i)
-             545:    6(float)   ConvertSToF 544
-             546:    7(fvec4)   CompositeConstruct 545 545 545 545
-             547:    6(float)   Load 196(f)
-             548:    7(fvec4)   CompositeConstruct 547 547 547 547
-             549:    7(fvec4)   FAdd 546 548
-             550:    7(fvec4)   Load 9(v)
-             551:    7(fvec4)   FAdd 549 550
-                                Store 541 551
-                                Branch 543
-             552:               Label
-             553:    7(fvec4)   Load 9(v)
-                                Store 541 553
-                                Branch 543
-             543:             Label
-             554:    7(fvec4) Load 541
-                              Store 539(FragColor) 554
-                              Store 557(m1) 563
-                              Store 564(m2) 566
-             567:   186(bool) Load 359(b)
-                              SelectionMerge 570 None
-                              BranchConditional 567 569 572
-             569:               Label
-             571:         555   Load 557(m1)
-                                Store 568 571
-                                Branch 570
-             572:               Label
-             573:         555   Load 564(m2)
-                                Store 568 573
-                                Branch 570
-             570:             Label
-             574:      8(ptr) AccessChain 568 459
-             575:    7(fvec4) Load 574
-             576:    7(fvec4) Load 539(FragColor)
-             577:    7(fvec4) FAdd 576 575
-                              Store 539(FragColor) 577
+             535:     18(int) Load 20(i)
+             536:     18(int) SMod 535 534
+                              Store 20(i) 536
+             537:     18(int) Load 20(i)
+             538:     18(int) ShiftRightArithmetic 537 460
+                              Store 20(i) 538
+             539:     18(int) Load 22(ui)
+             540:     18(int) Load 20(i)
+             541:     18(int) ShiftLeftLogical 540 539
+                              Store 20(i) 541
+             542:     18(int) Load 20(i)
+             543:     18(int) Not 542
+                              Store 20(i) 543
+             544:   186(bool) Load 367(b)
+             545:   186(bool) LogicalNot 544
+                              Store 367(b) 545
+             548:   186(bool) Load 367(b)
+                              SelectionMerge 551 None
+                              BranchConditional 548 550 560
+             550:               Label
+             552:     18(int)   Load 20(i)
+             553:    6(float)   ConvertSToF 552
+             554:    7(fvec4)   CompositeConstruct 553 553 553 553
+             555:    6(float)   Load 196(f)
+             556:    7(fvec4)   CompositeConstruct 555 555 555 555
+             557:    7(fvec4)   FAdd 554 556
+             558:    7(fvec4)   Load 9(v)
+             559:    7(fvec4)   FAdd 557 558
+                                Store 549 559
+                                Branch 551
+             560:               Label
+             561:    7(fvec4)   Load 9(v)
+                                Store 549 561
+                                Branch 551
+             551:             Label
+             562:    7(fvec4) Load 549
+                              Store 547(FragColor) 562
+                              Store 565(m1) 571
+                              Store 572(m2) 574
+             575:   186(bool) Load 367(b)
+                              SelectionMerge 578 None
+                              BranchConditional 575 577 580
+             577:               Label
+             579:         563   Load 565(m1)
+                                Store 576 579
+                                Branch 578
+             580:               Label
+             581:         563   Load 572(m2)
+                                Store 576 581
+                                Branch 578
+             578:             Label
+             582:      8(ptr) AccessChain 576 467
+             583:    7(fvec4) Load 582
+             584:    7(fvec4) Load 547(FragColor)
+             585:    7(fvec4) FAdd 584 583
+                              Store 547(FragColor) 585
                               Return
                               FunctionEnd
diff --git a/third_party/vulkan-deps/glslang/src/Test/baseResults/spv.RayGenShaderMotion.rgen.out b/third_party/vulkan-deps/glslang/src/Test/baseResults/spv.RayGenShaderMotion.rgen.out
new file mode 100644
index 0000000..f9b9fa5
--- /dev/null
+++ b/third_party/vulkan-deps/glslang/src/Test/baseResults/spv.RayGenShaderMotion.rgen.out
@@ -0,0 +1,81 @@
+spv.RayGenShaderMotion.rgen
+// Module Version 10400
+// Generated by (magic number): 8000a
+// Id's are bound by 47
+
+                              Capability RayTracingKHR
+                              Capability RayTracingMotionBlurNV
+                              Extension  "SPV_KHR_ray_tracing"
+                              Extension  "SPV_NV_ray_tracing_motion_blur"
+               1:             ExtInstImport  "GLSL.std.450"
+                              MemoryModel Logical GLSL450
+                              EntryPoint RayGenerationKHR 4  "main" 11 21 29 46
+                              Source GLSL 460
+                              SourceExtension  "GL_EXT_ray_tracing"
+                              SourceExtension  "GL_NV_ray_tracing_motion_blur"
+                              Name 4  "main"
+                              Name 8  "lx"
+                              Name 11  "gl_LaunchIDEXT"
+                              Name 16  "ly"
+                              Name 20  "sx"
+                              Name 21  "gl_LaunchSizeEXT"
+                              Name 24  "sy"
+                              Name 29  "accEXT"
+                              Name 46  "payloadEXT"
+                              Decorate 11(gl_LaunchIDEXT) BuiltIn LaunchIdKHR
+                              Decorate 21(gl_LaunchSizeEXT) BuiltIn LaunchSizeKHR
+                              Decorate 29(accEXT) DescriptorSet 0
+                              Decorate 29(accEXT) Binding 0
+                              Decorate 46(payloadEXT) Location 0
+               2:             TypeVoid
+               3:             TypeFunction 2
+               6:             TypeInt 32 0
+               7:             TypePointer Function 6(int)
+               9:             TypeVector 6(int) 3
+              10:             TypePointer Input 9(ivec3)
+11(gl_LaunchIDEXT):     10(ptr) Variable Input
+              12:      6(int) Constant 0
+              13:             TypePointer Input 6(int)
+              17:      6(int) Constant 1
+21(gl_LaunchSizeEXT):     10(ptr) Variable Input
+              27:             TypeAccelerationStructureKHR
+              28:             TypePointer UniformConstant 27
+      29(accEXT):     28(ptr) Variable UniformConstant
+              35:             TypeFloat 32
+              36:             TypeVector 35(float) 3
+              37:   35(float) Constant 1056964608
+              38:   36(fvec3) ConstantComposite 37 37 37
+              39:   35(float) Constant 1065353216
+              40:   36(fvec3) ConstantComposite 39 39 39
+              41:   35(float) Constant 1061158912
+              42:             TypeInt 32 1
+              43:     42(int) Constant 0
+              44:             TypeVector 35(float) 4
+              45:             TypePointer RayPayloadKHR 44(fvec4)
+  46(payloadEXT):     45(ptr) Variable RayPayloadKHR
+         4(main):           2 Function None 3
+               5:             Label
+           8(lx):      7(ptr) Variable Function
+          16(ly):      7(ptr) Variable Function
+          20(sx):      7(ptr) Variable Function
+          24(sy):      7(ptr) Variable Function
+              14:     13(ptr) AccessChain 11(gl_LaunchIDEXT) 12
+              15:      6(int) Load 14
+                              Store 8(lx) 15
+              18:     13(ptr) AccessChain 11(gl_LaunchIDEXT) 17
+              19:      6(int) Load 18
+                              Store 16(ly) 19
+              22:     13(ptr) AccessChain 21(gl_LaunchSizeEXT) 12
+              23:      6(int) Load 22
+                              Store 20(sx) 23
+              25:     13(ptr) AccessChain 21(gl_LaunchSizeEXT) 17
+              26:      6(int) Load 25
+                              Store 24(sy) 26
+              30:          27 Load 29(accEXT)
+              31:      6(int) Load 8(lx)
+              32:      6(int) Load 16(ly)
+              33:      6(int) Load 20(sx)
+              34:      6(int) Load 24(sy)
+                              TraceRayMotionNV 30 31 32 33 34 12 38 37 40 41 37 46(payloadEXT)
+                              Return
+                              FunctionEnd
diff --git a/third_party/vulkan-deps/glslang/src/Test/baseResults/spv.accessChain.frag.out b/third_party/vulkan-deps/glslang/src/Test/baseResults/spv.accessChain.frag.out
index 753688f..379131b 100644
--- a/third_party/vulkan-deps/glslang/src/Test/baseResults/spv.accessChain.frag.out
+++ b/third_party/vulkan-deps/glslang/src/Test/baseResults/spv.accessChain.frag.out
@@ -1,12 +1,12 @@
 spv.accessChain.frag
 // Module Version 10000
 // Generated by (magic number): 8000a
-// Id's are bound by 222
+// Id's are bound by 228
 
                               Capability Shader
                1:             ExtInstImport  "GLSL.std.450"
                               MemoryModel Logical GLSL450
-                              EntryPoint Fragment 4  "main" 69 170
+                              EntryPoint Fragment 4  "main" 69 176
                               ExecutionMode 4 OriginUpperLeft
                               Source GLSL 420
                               Name 4  "main"
@@ -54,24 +54,24 @@
                               Name 64  "i"
                               Name 65  "comp"
                               Name 69  "OutColor"
-                              Name 165  "s"
-                              Name 170  "u"
-                              Name 171  "param"
-                              Name 175  "param"
-                              Name 179  "param"
-                              Name 183  "param"
-                              Name 187  "param"
-                              Name 191  "param"
-                              Name 195  "param"
-                              Name 199  "param"
-                              Name 203  "param"
-                              Name 207  "param"
-                              Name 211  "param"
-                              Name 215  "param"
-                              Name 219  "param"
+                              Name 171  "s"
+                              Name 176  "u"
+                              Name 177  "param"
+                              Name 181  "param"
+                              Name 185  "param"
+                              Name 189  "param"
+                              Name 193  "param"
+                              Name 197  "param"
+                              Name 201  "param"
+                              Name 205  "param"
+                              Name 209  "param"
+                              Name 213  "param"
+                              Name 217  "param"
+                              Name 221  "param"
+                              Name 225  "param"
                               Decorate 69(OutColor) Location 0
-                              Decorate 170(u) Flat
-                              Decorate 170(u) Location 0
+                              Decorate 176(u) Flat
+                              Decorate 176(u) Location 0
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeFloat 32
@@ -87,89 +87,89 @@
               71:             TypeInt 32 0
               72:     71(int) Constant 0
               99:             TypeVector 6(float) 2
-             113:     71(int) Constant 2
-             140:             TypePointer Output 6(float)
-             147:     71(int) Constant 1
-             148:             TypeVector 71(int) 2
-             149:  148(ivec2) ConstantComposite 113 147
-             158:             TypeVector 71(int) 3
-             159:  158(ivec3) ConstantComposite 113 147 72
-             162:    6(float) Constant 0
-             163:    7(fvec3) ConstantComposite 162 162 162
-             164:             TypePointer Function 8(S)
-             169:             TypePointer Input 13(int)
-          170(u):    169(ptr) Variable Input
+             111:             TypePointer Output 6(float)
+             114:     71(int) Constant 1
+             117:     71(int) Constant 2
+             154:             TypeVector 71(int) 2
+             155:  154(ivec2) ConstantComposite 117 114
+             164:             TypeVector 71(int) 3
+             165:  164(ivec3) ConstantComposite 117 114 72
+             168:    6(float) Constant 0
+             169:    7(fvec3) ConstantComposite 168 168 168
+             170:             TypePointer Function 8(S)
+             175:             TypePointer Input 13(int)
+          176(u):    175(ptr) Variable Input
          4(main):           2 Function None 3
                5:             Label
-          165(s):    164(ptr) Variable Function
-      171(param):     14(ptr) Variable Function
-      175(param):     14(ptr) Variable Function
-      179(param):     14(ptr) Variable Function
-      183(param):     14(ptr) Variable Function
-      187(param):     14(ptr) Variable Function
-      191(param):     14(ptr) Variable Function
-      195(param):     14(ptr) Variable Function
-      199(param):     14(ptr) Variable Function
-      203(param):     14(ptr) Variable Function
-      207(param):     14(ptr) Variable Function
-      211(param):     14(ptr) Variable Function
-      215(param):     14(ptr) Variable Function
-      219(param):     14(ptr) Variable Function
-                              Store 69(OutColor) 163
-             166:        8(S) Load 165(s)
-             167:           2 FunctionCall 11(GetColor1(struct-S-vf31;) 166
-             168:        8(S) Load 165(s)
-             172:     13(int) Load 170(u)
-                              Store 171(param) 172
-             173:           2 FunctionCall 18(GetColor2(struct-S-vf31;i1;) 168 171(param)
-             174:        8(S) Load 165(s)
-             176:     13(int) Load 170(u)
-                              Store 175(param) 176
-             177:           2 FunctionCall 22(GetColor3(struct-S-vf31;i1;) 174 175(param)
-             178:        8(S) Load 165(s)
-             180:     13(int) Load 170(u)
-                              Store 179(param) 180
-             181:           2 FunctionCall 26(GetColor4(struct-S-vf31;i1;) 178 179(param)
-             182:        8(S) Load 165(s)
-             184:     13(int) Load 170(u)
-                              Store 183(param) 184
-             185:           2 FunctionCall 30(GetColor5(struct-S-vf31;i1;) 182 183(param)
-             186:        8(S) Load 165(s)
-             188:     13(int) Load 170(u)
-                              Store 187(param) 188
-             189:           2 FunctionCall 34(GetColor6(struct-S-vf31;i1;) 186 187(param)
-             190:        8(S) Load 165(s)
-             192:     13(int) Load 170(u)
-                              Store 191(param) 192
-             193:           2 FunctionCall 38(GetColor7(struct-S-vf31;i1;) 190 191(param)
-             194:        8(S) Load 165(s)
-             196:     13(int) Load 170(u)
-                              Store 195(param) 196
-             197:           2 FunctionCall 42(GetColor8(struct-S-vf31;i1;) 194 195(param)
-             198:        8(S) Load 165(s)
-             200:     13(int) Load 170(u)
-                              Store 199(param) 200
-             201:           2 FunctionCall 46(GetColor9(struct-S-vf31;i1;) 198 199(param)
-             202:        8(S) Load 165(s)
-             204:     13(int) Load 170(u)
-                              Store 203(param) 204
-             205:           2 FunctionCall 50(GetColor10(struct-S-vf31;i1;) 202 203(param)
-             206:        8(S) Load 165(s)
-             208:     13(int) Load 170(u)
-                              Store 207(param) 208
-             209:           2 FunctionCall 54(GetColor11(struct-S-vf31;i1;) 206 207(param)
-             210:        8(S) Load 165(s)
-             212:     13(int) Load 170(u)
-                              Store 211(param) 212
-             213:           2 FunctionCall 58(GetColor12(struct-S-vf31;i1;) 210 211(param)
-             214:        8(S) Load 165(s)
-             216:     13(int) Load 170(u)
-                              Store 215(param) 216
-             217:           2 FunctionCall 62(GetColor13(struct-S-vf31;i1;) 214 215(param)
-             218:        8(S) Load 165(s)
-             220:     13(int) Load 170(u)
-                              Store 219(param) 220
-             221:           2 FunctionCall 66(GetColor14(struct-S-vf31;i1;) 218 219(param)
+          171(s):    170(ptr) Variable Function
+      177(param):     14(ptr) Variable Function
+      181(param):     14(ptr) Variable Function
+      185(param):     14(ptr) Variable Function
+      189(param):     14(ptr) Variable Function
+      193(param):     14(ptr) Variable Function
+      197(param):     14(ptr) Variable Function
+      201(param):     14(ptr) Variable Function
+      205(param):     14(ptr) Variable Function
+      209(param):     14(ptr) Variable Function
+      213(param):     14(ptr) Variable Function
+      217(param):     14(ptr) Variable Function
+      221(param):     14(ptr) Variable Function
+      225(param):     14(ptr) Variable Function
+                              Store 69(OutColor) 169
+             172:        8(S) Load 171(s)
+             173:           2 FunctionCall 11(GetColor1(struct-S-vf31;) 172
+             174:        8(S) Load 171(s)
+             178:     13(int) Load 176(u)
+                              Store 177(param) 178
+             179:           2 FunctionCall 18(GetColor2(struct-S-vf31;i1;) 174 177(param)
+             180:        8(S) Load 171(s)
+             182:     13(int) Load 176(u)
+                              Store 181(param) 182
+             183:           2 FunctionCall 22(GetColor3(struct-S-vf31;i1;) 180 181(param)
+             184:        8(S) Load 171(s)
+             186:     13(int) Load 176(u)
+                              Store 185(param) 186
+             187:           2 FunctionCall 26(GetColor4(struct-S-vf31;i1;) 184 185(param)
+             188:        8(S) Load 171(s)
+             190:     13(int) Load 176(u)
+                              Store 189(param) 190
+             191:           2 FunctionCall 30(GetColor5(struct-S-vf31;i1;) 188 189(param)
+             192:        8(S) Load 171(s)
+             194:     13(int) Load 176(u)
+                              Store 193(param) 194
+             195:           2 FunctionCall 34(GetColor6(struct-S-vf31;i1;) 192 193(param)
+             196:        8(S) Load 171(s)
+             198:     13(int) Load 176(u)
+                              Store 197(param) 198
+             199:           2 FunctionCall 38(GetColor7(struct-S-vf31;i1;) 196 197(param)
+             200:        8(S) Load 171(s)
+             202:     13(int) Load 176(u)
+                              Store 201(param) 202
+             203:           2 FunctionCall 42(GetColor8(struct-S-vf31;i1;) 200 201(param)
+             204:        8(S) Load 171(s)
+             206:     13(int) Load 176(u)
+                              Store 205(param) 206
+             207:           2 FunctionCall 46(GetColor9(struct-S-vf31;i1;) 204 205(param)
+             208:        8(S) Load 171(s)
+             210:     13(int) Load 176(u)
+                              Store 209(param) 210
+             211:           2 FunctionCall 50(GetColor10(struct-S-vf31;i1;) 208 209(param)
+             212:        8(S) Load 171(s)
+             214:     13(int) Load 176(u)
+                              Store 213(param) 214
+             215:           2 FunctionCall 54(GetColor11(struct-S-vf31;i1;) 212 213(param)
+             216:        8(S) Load 171(s)
+             218:     13(int) Load 176(u)
+                              Store 217(param) 218
+             219:           2 FunctionCall 58(GetColor12(struct-S-vf31;i1;) 216 217(param)
+             220:        8(S) Load 171(s)
+             222:     13(int) Load 176(u)
+                              Store 221(param) 222
+             223:           2 FunctionCall 62(GetColor13(struct-S-vf31;i1;) 220 221(param)
+             224:        8(S) Load 171(s)
+             226:     13(int) Load 176(u)
+                              Store 225(param) 226
+             227:           2 FunctionCall 66(GetColor14(struct-S-vf31;i1;) 224 225(param)
                               Return
                               FunctionEnd
 11(GetColor1(struct-S-vf31;):           2 Function None 9
@@ -254,99 +254,108 @@
              108:    7(fvec3) Load 69(OutColor)
              109:   99(fvec2) VectorShuffle 108 108 0 1
              110:   99(fvec2) FAdd 109 107
-             111:    7(fvec3) Load 69(OutColor)
-             112:    7(fvec3) VectorShuffle 111 110 3 4 2
-                              Store 69(OutColor) 112
+             112:    111(ptr) AccessChain 69(OutColor) 72
+             113:    6(float) CompositeExtract 110 0
+                              Store 112 113
+             115:    111(ptr) AccessChain 69(OutColor) 114
+             116:    6(float) CompositeExtract 110 1
+                              Store 115 116
                               Return
                               FunctionEnd
 42(GetColor8(struct-S-vf31;i1;):           2 Function None 15
            40(i):        8(S) FunctionParameter
         41(comp):     14(ptr) FunctionParameter
               43:             Label
-             114:    6(float) CompositeExtract 40(i) 0 2
-             115:    7(fvec3) Load 69(OutColor)
-             116:    7(fvec3) CompositeConstruct 114 114 114
-             117:    7(fvec3) FAdd 115 116
-                              Store 69(OutColor) 117
+             118:    6(float) CompositeExtract 40(i) 0 2
+             119:    7(fvec3) Load 69(OutColor)
+             120:    7(fvec3) CompositeConstruct 118 118 118
+             121:    7(fvec3) FAdd 119 120
+                              Store 69(OutColor) 121
                               Return
                               FunctionEnd
 46(GetColor9(struct-S-vf31;i1;):           2 Function None 15
            44(i):        8(S) FunctionParameter
         45(comp):     14(ptr) FunctionParameter
               47:             Label
-             118:    7(fvec3) CompositeExtract 44(i) 0
-             119:    7(fvec3) Load 69(OutColor)
-             120:    7(fvec3) VectorShuffle 119 119 2 0 1
-             121:    7(fvec3) FAdd 120 118
-             122:    7(fvec3) Load 69(OutColor)
-             123:    7(fvec3) VectorShuffle 122 121 4 5 3
-                              Store 69(OutColor) 123
+             122:    7(fvec3) CompositeExtract 44(i) 0
+             123:    7(fvec3) Load 69(OutColor)
+             124:    7(fvec3) VectorShuffle 123 123 2 0 1
+             125:    7(fvec3) FAdd 124 122
+             126:    7(fvec3) Load 69(OutColor)
+             127:    7(fvec3) VectorShuffle 126 125 4 5 3
+                              Store 69(OutColor) 127
                               Return
                               FunctionEnd
 50(GetColor10(struct-S-vf31;i1;):           2 Function None 15
            48(i):        8(S) FunctionParameter
         49(comp):     14(ptr) FunctionParameter
               51:             Label
-             124:    7(fvec3) CompositeExtract 48(i) 0
-             125:   99(fvec2) VectorShuffle 124 124 0 1
-             126:    7(fvec3) Load 69(OutColor)
-             127:   99(fvec2) VectorShuffle 126 126 2 1
-             128:   99(fvec2) FAdd 127 125
-             129:    7(fvec3) Load 69(OutColor)
-             130:    7(fvec3) VectorShuffle 129 128 0 4 3
-                              Store 69(OutColor) 130
+             128:    7(fvec3) CompositeExtract 48(i) 0
+             129:   99(fvec2) VectorShuffle 128 128 0 1
+             130:    7(fvec3) Load 69(OutColor)
+             131:   99(fvec2) VectorShuffle 130 130 2 1
+             132:   99(fvec2) FAdd 131 129
+             133:    111(ptr) AccessChain 69(OutColor) 117
+             134:    6(float) CompositeExtract 132 0
+                              Store 133 134
+             135:    111(ptr) AccessChain 69(OutColor) 114
+             136:    6(float) CompositeExtract 132 1
+                              Store 135 136
                               Return
                               FunctionEnd
 54(GetColor11(struct-S-vf31;i1;):           2 Function None 15
            52(i):        8(S) FunctionParameter
         53(comp):     14(ptr) FunctionParameter
               55:             Label
-             131:    7(fvec3) CompositeExtract 52(i) 0
-             132:   99(fvec2) VectorShuffle 131 131 0 1
-             133:    7(fvec3) Load 69(OutColor)
-             134:   99(fvec2) VectorShuffle 133 133 0 2
-             135:   99(fvec2) FAdd 134 132
-             136:    7(fvec3) Load 69(OutColor)
-             137:    7(fvec3) VectorShuffle 136 135 3 1 4
-                              Store 69(OutColor) 137
+             137:    7(fvec3) CompositeExtract 52(i) 0
+             138:   99(fvec2) VectorShuffle 137 137 0 1
+             139:    7(fvec3) Load 69(OutColor)
+             140:   99(fvec2) VectorShuffle 139 139 0 2
+             141:   99(fvec2) FAdd 140 138
+             142:    111(ptr) AccessChain 69(OutColor) 72
+             143:    6(float) CompositeExtract 141 0
+                              Store 142 143
+             144:    111(ptr) AccessChain 69(OutColor) 117
+             145:    6(float) CompositeExtract 141 1
+                              Store 144 145
                               Return
                               FunctionEnd
 58(GetColor12(struct-S-vf31;i1;):           2 Function None 15
            56(i):        8(S) FunctionParameter
         57(comp):     14(ptr) FunctionParameter
               59:             Label
-             138:     13(int) Load 57(comp)
-             139:    6(float) CompositeExtract 56(i) 0 0
-             141:    140(ptr) AccessChain 69(OutColor) 138
-             142:    6(float) Load 141
-             143:    6(float) FAdd 142 139
-             144:    140(ptr) AccessChain 69(OutColor) 138
-                              Store 144 143
+             146:     13(int) Load 57(comp)
+             147:    6(float) CompositeExtract 56(i) 0 0
+             148:    111(ptr) AccessChain 69(OutColor) 146
+             149:    6(float) Load 148
+             150:    6(float) FAdd 149 147
+             151:    111(ptr) AccessChain 69(OutColor) 146
+                              Store 151 150
                               Return
                               FunctionEnd
 62(GetColor13(struct-S-vf31;i1;):           2 Function None 15
            60(i):        8(S) FunctionParameter
         61(comp):     14(ptr) FunctionParameter
               63:             Label
-             145:     13(int) Load 61(comp)
-             146:    6(float) CompositeExtract 60(i) 0 0
-             150:     71(int) VectorExtractDynamic 149 145
-             151:    140(ptr) AccessChain 69(OutColor) 150
-             152:    6(float) Load 151
-             153:    6(float) FAdd 152 146
-             154:     71(int) VectorExtractDynamic 149 145
-             155:    140(ptr) AccessChain 69(OutColor) 154
-                              Store 155 153
+             152:     13(int) Load 61(comp)
+             153:    6(float) CompositeExtract 60(i) 0 0
+             156:     71(int) VectorExtractDynamic 155 152
+             157:    111(ptr) AccessChain 69(OutColor) 156
+             158:    6(float) Load 157
+             159:    6(float) FAdd 158 153
+             160:     71(int) VectorExtractDynamic 155 152
+             161:    111(ptr) AccessChain 69(OutColor) 160
+                              Store 161 159
                               Return
                               FunctionEnd
 66(GetColor14(struct-S-vf31;i1;):           2 Function None 15
            64(i):        8(S) FunctionParameter
         65(comp):     14(ptr) FunctionParameter
               67:             Label
-             156:     13(int) Load 65(comp)
-             157:    6(float) CompositeExtract 64(i) 0 0
-             160:     71(int) VectorExtractDynamic 159 156
-             161:    140(ptr) AccessChain 69(OutColor) 160
-                              Store 161 157
+             162:     13(int) Load 65(comp)
+             163:    6(float) CompositeExtract 64(i) 0 0
+             166:     71(int) VectorExtractDynamic 165 162
+             167:    111(ptr) AccessChain 69(OutColor) 166
+                              Store 167 163
                               Return
                               FunctionEnd
diff --git a/third_party/vulkan-deps/glslang/src/Test/baseResults/spv.atomicAdd.bufferReference.comp.out b/third_party/vulkan-deps/glslang/src/Test/baseResults/spv.atomicAdd.bufferReference.comp.out
new file mode 100644
index 0000000..9ecc742
--- /dev/null
+++ b/third_party/vulkan-deps/glslang/src/Test/baseResults/spv.atomicAdd.bufferReference.comp.out
@@ -0,0 +1,304 @@
+spv.atomicAdd.bufferReference.comp
+// Module Version 10000
+// Generated by (magic number): 8000a
+// Id's are bound by 188
+
+                              Capability Shader
+                              Capability VulkanMemoryModelKHR
+                              Capability VulkanMemoryModelDeviceScopeKHR
+                              Capability PhysicalStorageBufferAddressesEXT
+                              Extension  "SPV_KHR_physical_storage_buffer"
+                              Extension  "SPV_KHR_storage_buffer_storage_class"
+                              Extension  "SPV_KHR_vulkan_memory_model"
+               1:             ExtInstImport  "GLSL.std.450"
+                              MemoryModel PhysicalStorageBuffer64EXT VulkanKHR
+                              EntryPoint GLCompute 4  "main" 37 81 133
+                              ExecutionMode 4 LocalSize 1 1 1
+                              Source GLSL 450
+                              SourceExtension  "GL_ARB_gpu_shader_int64"
+                              SourceExtension  "GL_EXT_buffer_reference"
+                              SourceExtension  "GL_KHR_memory_scope_semantics"
+                              SourceExtension  "GL_KHR_shader_subgroup_ballot"
+                              SourceExtension  "GL_KHR_shader_subgroup_basic"
+                              SourceExtension  "GL_KHR_shader_subgroup_shuffle"
+                              Name 4  "main"
+                              Name 8  "pass"
+                              Name 10  "skip"
+                              Name 13  "sharedSkip"
+                              Name 18  "PayloadRef"
+                              MemberName 18(PayloadRef) 0  "x"
+                              Name 20  "payload"
+                              Name 22  "PC"
+                              MemberName 22(PC) 0  "payloadref"
+                              MemberName 22(PC) 1  "guard"
+                              Name 24  "GuardRef"
+                              MemberName 24(GuardRef) 0  "x"
+                              Name 26  ""
+                              Name 34  "globalId"
+                              Name 37  "gl_GlobalInvocationID"
+                              Name 42  "partnerGlobalId"
+                              Name 43  "DIM"
+                              Name 44  "NUM_WORKGROUP_EACH_DIM"
+                              Name 54  "bufferCoord"
+                              Name 66  "partnerBufferCoord"
+                              Name 75  "imageCoord"
+                              Name 77  "partnerImageCoord"
+                              Name 79  "globalId00"
+                              Name 81  "gl_WorkGroupID"
+                              Name 86  "partnerGlobalId00"
+                              Name 95  "bufferCoord00"
+                              Name 104  "partnerBufferCoord00"
+                              Name 113  "imageCoord00"
+                              Name 115  "partnerImageCoord00"
+                              Name 133  "gl_LocalInvocationID"
+                              Name 163  "r"
+                              Name 179  "Fail"
+                              MemberName 179(Fail) 0  "x"
+                              Name 181  "fail"
+                              Decorate 17 ArrayStride 4
+                              MemberDecorate 18(PayloadRef) 0 Offset 0
+                              Decorate 18(PayloadRef) Block
+                              Decorate 20(payload) DecorationAliasedPointerEXT
+                              MemberDecorate 22(PC) 0 Offset 0
+                              MemberDecorate 22(PC) 1 Offset 8
+                              Decorate 22(PC) Block
+                              Decorate 23 ArrayStride 4
+                              MemberDecorate 24(GuardRef) 0 Offset 0
+                              Decorate 24(GuardRef) Block
+                              Decorate 37(gl_GlobalInvocationID) BuiltIn GlobalInvocationId
+                              Decorate 43(DIM) SpecId 0
+                              Decorate 44(NUM_WORKGROUP_EACH_DIM) SpecId 1
+                              Decorate 81(gl_WorkGroupID) BuiltIn WorkgroupId
+                              Decorate 133(gl_LocalInvocationID) BuiltIn LocalInvocationId
+                              Decorate 178 ArrayStride 4
+                              MemberDecorate 179(Fail) 0 Offset 0
+                              Decorate 179(Fail) Block
+                              Decorate 181(fail) DescriptorSet 0
+                              Decorate 181(fail) Binding 2
+                              Decorate 185 SpecId 0
+                              Decorate 186 SpecId 0
+                              Decorate 187 BuiltIn WorkgroupSize
+               2:             TypeVoid
+               3:             TypeFunction 2
+               6:             TypeBool
+               7:             TypePointer Function 6(bool)
+               9:     6(bool) ConstantTrue
+              11:     6(bool) ConstantFalse
+              12:             TypePointer Workgroup 6(bool)
+  13(sharedSkip):     12(ptr) Variable Workgroup
+              14:             TypeInt 32 0
+              15:     14(int) Constant 2
+                              TypeForwardPointer 16 PhysicalStorageBufferEXT
+              17:             TypeRuntimeArray 14(int)
+  18(PayloadRef):             TypeStruct 17
+              16:             TypePointer PhysicalStorageBufferEXT 18(PayloadRef)
+              19:             TypePointer Function 16(ptr)
+                              TypeForwardPointer 21 PhysicalStorageBufferEXT
+          22(PC):             TypeStruct 16(ptr) 21
+              23:             TypeRuntimeArray 14(int)
+    24(GuardRef):             TypeStruct 23
+              21:             TypePointer PhysicalStorageBufferEXT 24(GuardRef)
+              25:             TypePointer PushConstant 22(PC)
+              26:     25(ptr) Variable PushConstant
+              27:             TypeInt 32 1
+              28:     27(int) Constant 0
+              29:             TypePointer PushConstant 16(ptr)
+              32:             TypeVector 27(int) 2
+              33:             TypePointer Function 32(ivec2)
+              35:             TypeVector 14(int) 3
+              36:             TypePointer Input 35(ivec3)
+37(gl_GlobalInvocationID):     36(ptr) Variable Input
+              38:             TypeVector 14(int) 2
+         43(DIM):     27(int) SpecConstant 1
+44(NUM_WORKGROUP_EACH_DIM):     27(int) SpecConstant 1
+              45:     27(int) SpecConstantOp 132 43(DIM) 44(NUM_WORKGROUP_EACH_DIM)
+              46:     27(int) Constant 1
+              47:     27(int) SpecConstantOp 130 45 46
+              48:   32(ivec2) SpecConstantComposite 47 47
+              53:             TypePointer Function 14(int)
+              55:     14(int) Constant 1
+              56:             TypePointer Function 27(int)
+              61:     14(int) Constant 0
+              80:   32(ivec2) SpecConstantComposite 43(DIM) 43(DIM)
+81(gl_WorkGroupID):     36(ptr) Variable Input
+              87:   32(ivec2) SpecConstantComposite 43(DIM) 43(DIM)
+              88:     27(int) SpecConstantOp 130 44(NUM_WORKGROUP_EACH_DIM) 46
+              89:   32(ivec2) SpecConstantComposite 88 88
+             122:             TypePointer PhysicalStorageBufferEXT 14(int)
+             125:     27(int) Constant 31
+             129:     27(int) Constant 2
+             130:     27(int) Constant 320
+             131:     27(int) Constant 8200
+             132:     14(int) Constant 8520
+133(gl_LocalInvocationID):     36(ptr) Variable Input
+             136:   38(ivec2) ConstantComposite 61 61
+             137:             TypeVector 6(bool) 2
+             142:             TypePointer PushConstant 21(ptr)
+             147:     27(int) Constant 64
+             148:     27(int) Constant 8196
+             149:     14(int) Constant 5
+             150:     14(int) Constant 8260
+             155:     27(int) Constant 16386
+             156:     14(int) Constant 16450
+             160:     27(int) Constant 16392
+             161:     14(int) Constant 16712
+             178:             TypeRuntimeArray 14(int)
+       179(Fail):             TypeStruct 178
+             180:             TypePointer StorageBuffer 179(Fail)
+       181(fail):    180(ptr) Variable StorageBuffer
+             183:             TypePointer StorageBuffer 14(int)
+             185:     14(int) SpecConstant 1
+             186:     14(int) SpecConstant 1
+             187:   35(ivec3) SpecConstantComposite 185 186 55
+         4(main):           2 Function None 3
+               5:             Label
+         8(pass):      7(ptr) Variable Function
+        10(skip):      7(ptr) Variable Function
+     20(payload):     19(ptr) Variable Function
+    34(globalId):     33(ptr) Variable Function
+42(partnerGlobalId):     33(ptr) Variable Function
+ 54(bufferCoord):     53(ptr) Variable Function
+66(partnerBufferCoord):     53(ptr) Variable Function
+  75(imageCoord):     33(ptr) Variable Function
+77(partnerImageCoord):     33(ptr) Variable Function
+  79(globalId00):     33(ptr) Variable Function
+86(partnerGlobalId00):     33(ptr) Variable Function
+95(bufferCoord00):     53(ptr) Variable Function
+104(partnerBufferCoord00):     53(ptr) Variable Function
+113(imageCoord00):     33(ptr) Variable Function
+115(partnerImageCoord00):     33(ptr) Variable Function
+          163(r):     53(ptr) Variable Function
+                              Store 8(pass) 9
+                              Store 10(skip) 11
+                              Store 13(sharedSkip) 11 MakePointerAvailableKHR NonPrivatePointerKHR 15
+              30:     29(ptr) AccessChain 26 28
+              31:     16(ptr) Load 30
+                              Store 20(payload) 31
+              39:   35(ivec3) Load 37(gl_GlobalInvocationID)
+              40:   38(ivec2) VectorShuffle 39 39 0 1
+              41:   32(ivec2) Bitcast 40
+                              Store 34(globalId) 41
+              49:   35(ivec3) Load 37(gl_GlobalInvocationID)
+              50:   38(ivec2) VectorShuffle 49 49 0 1
+              51:   32(ivec2) Bitcast 50
+              52:   32(ivec2) ISub 48 51
+                              Store 42(partnerGlobalId) 52
+              57:     56(ptr) AccessChain 34(globalId) 55
+              58:     27(int) Load 57
+              59:     27(int) IMul 58 43(DIM)
+              60:     27(int) IMul 59 44(NUM_WORKGROUP_EACH_DIM)
+              62:     56(ptr) AccessChain 34(globalId) 61
+              63:     27(int) Load 62
+              64:     27(int) IAdd 60 63
+              65:     14(int) Bitcast 64
+                              Store 54(bufferCoord) 65
+              67:     56(ptr) AccessChain 42(partnerGlobalId) 55
+              68:     27(int) Load 67
+              69:     27(int) IMul 68 43(DIM)
+              70:     27(int) IMul 69 44(NUM_WORKGROUP_EACH_DIM)
+              71:     56(ptr) AccessChain 42(partnerGlobalId) 61
+              72:     27(int) Load 71
+              73:     27(int) IAdd 70 72
+              74:     14(int) Bitcast 73
+                              Store 66(partnerBufferCoord) 74
+              76:   32(ivec2) Load 34(globalId)
+                              Store 75(imageCoord) 76
+              78:   32(ivec2) Load 42(partnerGlobalId)
+                              Store 77(partnerImageCoord) 78
+              82:   35(ivec3) Load 81(gl_WorkGroupID)
+              83:   38(ivec2) VectorShuffle 82 82 0 1
+              84:   32(ivec2) Bitcast 83
+              85:   32(ivec2) IMul 80 84
+                              Store 79(globalId00) 85
+              90:   35(ivec3) Load 81(gl_WorkGroupID)
+              91:   38(ivec2) VectorShuffle 90 90 0 1
+              92:   32(ivec2) Bitcast 91
+              93:   32(ivec2) ISub 89 92
+              94:   32(ivec2) IMul 87 93
+                              Store 86(partnerGlobalId00) 94
+              96:     56(ptr) AccessChain 79(globalId00) 55
+              97:     27(int) Load 96
+              98:     27(int) IMul 97 43(DIM)
+              99:     27(int) IMul 98 44(NUM_WORKGROUP_EACH_DIM)
+             100:     56(ptr) AccessChain 79(globalId00) 61
+             101:     27(int) Load 100
+             102:     27(int) IAdd 99 101
+             103:     14(int) Bitcast 102
+                              Store 95(bufferCoord00) 103
+             105:     56(ptr) AccessChain 86(partnerGlobalId00) 55
+             106:     27(int) Load 105
+             107:     27(int) IMul 106 43(DIM)
+             108:     27(int) IMul 107 44(NUM_WORKGROUP_EACH_DIM)
+             109:     56(ptr) AccessChain 86(partnerGlobalId00) 61
+             110:     27(int) Load 109
+             111:     27(int) IAdd 108 110
+             112:     14(int) Bitcast 111
+                              Store 104(partnerBufferCoord00) 112
+             114:   32(ivec2) Load 79(globalId00)
+                              Store 113(imageCoord00) 114
+             116:   32(ivec2) Load 86(partnerGlobalId00)
+                              Store 115(partnerImageCoord00) 116
+             117:     16(ptr) Load 20(payload)
+             118:     14(int) Load 54(bufferCoord)
+             119:     14(int) Load 54(bufferCoord)
+             120:     16(ptr) Load 20(payload)
+             121:     14(int) Load 66(partnerBufferCoord)
+             123:    122(ptr) AccessChain 120 28 121
+             124:     14(int) Load 123 Aligned NonPrivatePointerKHR 4
+             126:     14(int) ShiftRightLogical 124 125
+             127:     14(int) IAdd 119 126
+             128:    122(ptr) AccessChain 117 28 118
+                              Store 128 127 Aligned NonPrivatePointerKHR 4
+                              ControlBarrier 15 15 132
+             134:   35(ivec3) Load 133(gl_LocalInvocationID)
+             135:   38(ivec2) VectorShuffle 134 134 0 1
+             138:  137(bvec2) IEqual 135 136
+             139:     6(bool) All 138
+                              SelectionMerge 141 None
+                              BranchConditional 139 140 141
+             140:               Label
+             143:    142(ptr)   AccessChain 26 46
+             144:     21(ptr)   Load 143
+             145:     14(int)   Load 54(bufferCoord)
+             146:    122(ptr)   AccessChain 144 28 145
+                                AtomicStore 146 46 150 55
+             151:    142(ptr)   AccessChain 26 46
+             152:     21(ptr)   Load 151
+             153:     14(int)   Load 104(partnerBufferCoord00)
+             154:    122(ptr)   AccessChain 152 28 153
+             157:     14(int)   AtomicLoad 154 46 156
+             158:     6(bool)   IEqual 157 61
+                                Store 10(skip) 158
+             159:     6(bool)   Load 10(skip)
+                                Store 13(sharedSkip) 159 MakePointerAvailableKHR NonPrivatePointerKHR 15
+                                Branch 141
+             141:             Label
+                              ControlBarrier 15 15 161
+             162:     6(bool) Load 13(sharedSkip) MakePointerVisibleKHR NonPrivatePointerKHR 15
+                              Store 10(skip) 162
+             164:     16(ptr) Load 20(payload)
+             165:     14(int) Load 66(partnerBufferCoord)
+             166:    122(ptr) AccessChain 164 28 165
+             167:     14(int) Load 166 Aligned NonPrivatePointerKHR 4
+                              Store 163(r) 167
+             168:     6(bool) Load 10(skip)
+             169:     6(bool) LogicalNot 168
+                              SelectionMerge 171 None
+                              BranchConditional 169 170 171
+             170:               Label
+             172:     14(int)   Load 163(r)
+             173:     14(int)   Load 66(partnerBufferCoord)
+             174:     6(bool)   INotEqual 172 173
+                                Branch 171
+             171:             Label
+             175:     6(bool) Phi 169 141 174 170
+                              SelectionMerge 177 None
+                              BranchConditional 175 176 177
+             176:               Label
+             182:     14(int)   Load 54(bufferCoord)
+             184:    183(ptr)   AccessChain 181(fail) 28 182
+                                Store 184 55
+                                Branch 177
+             177:             Label
+                              Return
+                              FunctionEnd
diff --git a/third_party/vulkan-deps/glslang/src/Test/baseResults/spv.bitCast.frag.out b/third_party/vulkan-deps/glslang/src/Test/baseResults/spv.bitCast.frag.out
index daf7b1d..88b2a09 100644
--- a/third_party/vulkan-deps/glslang/src/Test/baseResults/spv.bitCast.frag.out
+++ b/third_party/vulkan-deps/glslang/src/Test/baseResults/spv.bitCast.frag.out
@@ -1,52 +1,52 @@
 spv.bitCast.frag
 // Module Version 10000
 // Generated by (magic number): 8000a
-// Id's are bound by 172
+// Id's are bound by 198
 
                               Capability Shader
                1:             ExtInstImport  "GLSL.std.450"
                               MemoryModel Logical GLSL450
-                              EntryPoint Fragment 4  "main" 14 26 37 48 89 98 107 116 122 130 139 148 154
+                              EntryPoint Fragment 4  "main" 14 26 40 56 103 112 123 136 142 150 161 174 180
                               ExecutionMode 4 OriginUpperLeft
                               Source GLSL 450
                               Name 4  "main"
                               Name 9  "idata"
                               Name 14  "f1"
                               Name 26  "f2"
-                              Name 37  "f3"
-                              Name 48  "f4"
-                              Name 55  "udata"
-                              Name 85  "fdata"
-                              Name 89  "i1"
-                              Name 98  "i2"
-                              Name 107  "i3"
-                              Name 116  "i4"
-                              Name 122  "u1"
-                              Name 130  "u2"
-                              Name 139  "u3"
-                              Name 148  "u4"
-                              Name 154  "fragColor"
+                              Name 40  "f3"
+                              Name 56  "f4"
+                              Name 63  "udata"
+                              Name 99  "fdata"
+                              Name 103  "i1"
+                              Name 112  "i2"
+                              Name 123  "i3"
+                              Name 136  "i4"
+                              Name 142  "u1"
+                              Name 150  "u2"
+                              Name 161  "u3"
+                              Name 174  "u4"
+                              Name 180  "fragColor"
                               Decorate 14(f1) Location 8
                               Decorate 26(f2) Location 9
-                              Decorate 37(f3) Location 10
-                              Decorate 48(f4) Location 11
-                              Decorate 89(i1) Flat
-                              Decorate 89(i1) Location 0
-                              Decorate 98(i2) Flat
-                              Decorate 98(i2) Location 1
-                              Decorate 107(i3) Flat
-                              Decorate 107(i3) Location 2
-                              Decorate 116(i4) Flat
-                              Decorate 116(i4) Location 3
-                              Decorate 122(u1) Flat
-                              Decorate 122(u1) Location 4
-                              Decorate 130(u2) Flat
-                              Decorate 130(u2) Location 5
-                              Decorate 139(u3) Flat
-                              Decorate 139(u3) Location 6
-                              Decorate 148(u4) Flat
-                              Decorate 148(u4) Location 7
-                              Decorate 154(fragColor) Location 0
+                              Decorate 40(f3) Location 10
+                              Decorate 56(f4) Location 11
+                              Decorate 103(i1) Flat
+                              Decorate 103(i1) Location 0
+                              Decorate 112(i2) Flat
+                              Decorate 112(i2) Location 1
+                              Decorate 123(i3) Flat
+                              Decorate 123(i3) Location 2
+                              Decorate 136(i4) Flat
+                              Decorate 136(i4) Location 3
+                              Decorate 142(u1) Flat
+                              Decorate 142(u1) Location 4
+                              Decorate 150(u2) Flat
+                              Decorate 150(u2) Location 5
+                              Decorate 161(u3) Flat
+                              Decorate 161(u3) Location 6
+                              Decorate 174(u4) Flat
+                              Decorate 174(u4) Location 7
+                              Decorate 180(fragColor) Location 0
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeInt 32 1
@@ -64,51 +64,53 @@
               25:             TypePointer Input 24(fvec2)
           26(f2):     25(ptr) Variable Input
               28:             TypeVector 6(int) 2
-              35:             TypeVector 12(float) 3
-              36:             TypePointer Input 35(fvec3)
-          37(f3):     36(ptr) Variable Input
-              39:             TypeVector 6(int) 3
-              46:             TypeVector 12(float) 4
-              47:             TypePointer Input 46(fvec4)
-          48(f4):     47(ptr) Variable Input
-              53:             TypeVector 17(int) 4
-              54:             TypePointer Function 53(ivec4)
-              56:   53(ivec4) ConstantComposite 18 18 18 18
-              59:             TypePointer Function 17(int)
-              65:             TypeVector 17(int) 2
-              73:             TypeVector 17(int) 3
-              84:             TypePointer Function 46(fvec4)
-              86:   12(float) Constant 0
-              87:   46(fvec4) ConstantComposite 86 86 86 86
-              88:             TypePointer Input 6(int)
-          89(i1):     88(ptr) Variable Input
-              92:             TypePointer Function 12(float)
-              97:             TypePointer Input 28(ivec2)
-          98(i2):     97(ptr) Variable Input
-             106:             TypePointer Input 39(ivec3)
-         107(i3):    106(ptr) Variable Input
-             115:             TypePointer Input 7(ivec4)
-         116(i4):    115(ptr) Variable Input
-             121:             TypePointer Input 17(int)
-         122(u1):    121(ptr) Variable Input
-             129:             TypePointer Input 65(ivec2)
-         130(u2):    129(ptr) Variable Input
-             138:             TypePointer Input 73(ivec3)
-         139(u3):    138(ptr) Variable Input
-             147:             TypePointer Input 53(ivec4)
-         148(u4):    147(ptr) Variable Input
-             153:             TypePointer Output 46(fvec4)
-  154(fragColor):    153(ptr) Variable Output
-             158:             TypeBool
-             159:             TypeVector 158(bool) 4
-             168:   12(float) Constant 1045220557
-             169:   46(fvec4) ConstantComposite 168 168 168 168
+              35:     17(int) Constant 1
+              38:             TypeVector 12(float) 3
+              39:             TypePointer Input 38(fvec3)
+          40(f3):     39(ptr) Variable Input
+              42:             TypeVector 6(int) 3
+              51:     17(int) Constant 2
+              54:             TypeVector 12(float) 4
+              55:             TypePointer Input 54(fvec4)
+          56(f4):     55(ptr) Variable Input
+              61:             TypeVector 17(int) 4
+              62:             TypePointer Function 61(ivec4)
+              64:   61(ivec4) ConstantComposite 18 18 18 18
+              67:             TypePointer Function 17(int)
+              73:             TypeVector 17(int) 2
+              83:             TypeVector 17(int) 3
+              98:             TypePointer Function 54(fvec4)
+             100:   12(float) Constant 0
+             101:   54(fvec4) ConstantComposite 100 100 100 100
+             102:             TypePointer Input 6(int)
+         103(i1):    102(ptr) Variable Input
+             106:             TypePointer Function 12(float)
+             111:             TypePointer Input 28(ivec2)
+         112(i2):    111(ptr) Variable Input
+             122:             TypePointer Input 42(ivec3)
+         123(i3):    122(ptr) Variable Input
+             135:             TypePointer Input 7(ivec4)
+         136(i4):    135(ptr) Variable Input
+             141:             TypePointer Input 17(int)
+         142(u1):    141(ptr) Variable Input
+             149:             TypePointer Input 73(ivec2)
+         150(u2):    149(ptr) Variable Input
+             160:             TypePointer Input 83(ivec3)
+         161(u3):    160(ptr) Variable Input
+             173:             TypePointer Input 61(ivec4)
+         174(u4):    173(ptr) Variable Input
+             179:             TypePointer Output 54(fvec4)
+  180(fragColor):    179(ptr) Variable Output
+             184:             TypeBool
+             185:             TypeVector 184(bool) 4
+             194:   12(float) Constant 1045220557
+             195:   54(fvec4) ConstantComposite 194 194 194 194
          4(main):           2 Function None 3
                5:             Label
         9(idata):      8(ptr) Variable Function
-       55(udata):     54(ptr) Variable Function
-       85(fdata):     84(ptr) Variable Function
-             162:     84(ptr) Variable Function
+       63(udata):     62(ptr) Variable Function
+       99(fdata):     98(ptr) Variable Function
+             188:     98(ptr) Variable Function
                               Store 9(idata) 11
               15:   12(float) Load 14(f1)
               16:      6(int) Bitcast 15
@@ -122,126 +124,162 @@
               30:    7(ivec4) Load 9(idata)
               31:   28(ivec2) VectorShuffle 30 30 0 1
               32:   28(ivec2) IAdd 31 29
-              33:    7(ivec4) Load 9(idata)
-              34:    7(ivec4) VectorShuffle 33 32 4 5 2 3
-                              Store 9(idata) 34
-              38:   35(fvec3) Load 37(f3)
-              40:   39(ivec3) Bitcast 38
-              41:    7(ivec4) Load 9(idata)
-              42:   39(ivec3) VectorShuffle 41 41 0 1 2
-              43:   39(ivec3) IAdd 42 40
+              33:     19(ptr) AccessChain 9(idata) 18
+              34:      6(int) CompositeExtract 32 0
+                              Store 33 34
+              36:     19(ptr) AccessChain 9(idata) 35
+              37:      6(int) CompositeExtract 32 1
+                              Store 36 37
+              41:   38(fvec3) Load 40(f3)
+              43:   42(ivec3) Bitcast 41
               44:    7(ivec4) Load 9(idata)
-              45:    7(ivec4) VectorShuffle 44 43 4 5 6 3
-                              Store 9(idata) 45
-              49:   46(fvec4) Load 48(f4)
-              50:    7(ivec4) Bitcast 49
-              51:    7(ivec4) Load 9(idata)
-              52:    7(ivec4) IAdd 51 50
-                              Store 9(idata) 52
-                              Store 55(udata) 56
-              57:   12(float) Load 14(f1)
-              58:     17(int) Bitcast 57
-              60:     59(ptr) AccessChain 55(udata) 18
-              61:     17(int) Load 60
-              62:     17(int) IAdd 61 58
-              63:     59(ptr) AccessChain 55(udata) 18
-                              Store 63 62
-              64:   24(fvec2) Load 26(f2)
-              66:   65(ivec2) Bitcast 64
-              67:   53(ivec4) Load 55(udata)
-              68:   65(ivec2) VectorShuffle 67 67 0 1
-              69:   65(ivec2) IAdd 68 66
-              70:   53(ivec4) Load 55(udata)
-              71:   53(ivec4) VectorShuffle 70 69 4 5 2 3
-                              Store 55(udata) 71
-              72:   35(fvec3) Load 37(f3)
-              74:   73(ivec3) Bitcast 72
-              75:   53(ivec4) Load 55(udata)
-              76:   73(ivec3) VectorShuffle 75 75 0 1 2
-              77:   73(ivec3) IAdd 76 74
-              78:   53(ivec4) Load 55(udata)
-              79:   53(ivec4) VectorShuffle 78 77 4 5 6 3
-                              Store 55(udata) 79
-              80:   46(fvec4) Load 48(f4)
-              81:   53(ivec4) Bitcast 80
-              82:   53(ivec4) Load 55(udata)
-              83:   53(ivec4) IAdd 82 81
-                              Store 55(udata) 83
-                              Store 85(fdata) 87
-              90:      6(int) Load 89(i1)
-              91:   12(float) Bitcast 90
-              93:     92(ptr) AccessChain 85(fdata) 18
-              94:   12(float) Load 93
-              95:   12(float) FAdd 94 91
-              96:     92(ptr) AccessChain 85(fdata) 18
-                              Store 96 95
-              99:   28(ivec2) Load 98(i2)
-             100:   24(fvec2) Bitcast 99
-             101:   46(fvec4) Load 85(fdata)
-             102:   24(fvec2) VectorShuffle 101 101 0 1
-             103:   24(fvec2) FAdd 102 100
-             104:   46(fvec4) Load 85(fdata)
-             105:   46(fvec4) VectorShuffle 104 103 4 5 2 3
-                              Store 85(fdata) 105
-             108:   39(ivec3) Load 107(i3)
-             109:   35(fvec3) Bitcast 108
-             110:   46(fvec4) Load 85(fdata)
-             111:   35(fvec3) VectorShuffle 110 110 0 1 2
-             112:   35(fvec3) FAdd 111 109
-             113:   46(fvec4) Load 85(fdata)
-             114:   46(fvec4) VectorShuffle 113 112 4 5 6 3
-                              Store 85(fdata) 114
-             117:    7(ivec4) Load 116(i4)
-             118:   46(fvec4) Bitcast 117
-             119:   46(fvec4) Load 85(fdata)
-             120:   46(fvec4) FAdd 119 118
-                              Store 85(fdata) 120
-             123:     17(int) Load 122(u1)
-             124:   12(float) Bitcast 123
-             125:     92(ptr) AccessChain 85(fdata) 18
-             126:   12(float) Load 125
-             127:   12(float) FAdd 126 124
-             128:     92(ptr) AccessChain 85(fdata) 18
-                              Store 128 127
-             131:   65(ivec2) Load 130(u2)
-             132:   24(fvec2) Bitcast 131
-             133:   46(fvec4) Load 85(fdata)
-             134:   24(fvec2) VectorShuffle 133 133 0 1
-             135:   24(fvec2) FAdd 134 132
-             136:   46(fvec4) Load 85(fdata)
-             137:   46(fvec4) VectorShuffle 136 135 4 5 2 3
-                              Store 85(fdata) 137
-             140:   73(ivec3) Load 139(u3)
-             141:   35(fvec3) Bitcast 140
-             142:   46(fvec4) Load 85(fdata)
-             143:   35(fvec3) VectorShuffle 142 142 0 1 2
-             144:   35(fvec3) FAdd 143 141
-             145:   46(fvec4) Load 85(fdata)
-             146:   46(fvec4) VectorShuffle 145 144 4 5 6 3
-                              Store 85(fdata) 146
-             149:   53(ivec4) Load 148(u4)
-             150:   46(fvec4) Bitcast 149
-             151:   46(fvec4) Load 85(fdata)
-             152:   46(fvec4) FAdd 151 150
-                              Store 85(fdata) 152
-             155:    7(ivec4) Load 9(idata)
-             156:   53(ivec4) Bitcast 155
-             157:   53(ivec4) Load 55(udata)
-             160:  159(bvec4) IEqual 156 157
-             161:   158(bool) All 160
-                              SelectionMerge 164 None
-                              BranchConditional 161 163 166
-             163:               Label
-             165:   46(fvec4)   Load 85(fdata)
-                                Store 162 165
-                                Branch 164
-             166:               Label
-             167:   46(fvec4)   Load 85(fdata)
-             170:   46(fvec4)   FAdd 167 169
-                                Store 162 170
-                                Branch 164
-             164:             Label
-             171:   46(fvec4) Load 162
-                              Store 154(fragColor) 171
+              45:   42(ivec3) VectorShuffle 44 44 0 1 2
+              46:   42(ivec3) IAdd 45 43
+              47:     19(ptr) AccessChain 9(idata) 18
+              48:      6(int) CompositeExtract 46 0
+                              Store 47 48
+              49:     19(ptr) AccessChain 9(idata) 35
+              50:      6(int) CompositeExtract 46 1
+                              Store 49 50
+              52:     19(ptr) AccessChain 9(idata) 51
+              53:      6(int) CompositeExtract 46 2
+                              Store 52 53
+              57:   54(fvec4) Load 56(f4)
+              58:    7(ivec4) Bitcast 57
+              59:    7(ivec4) Load 9(idata)
+              60:    7(ivec4) IAdd 59 58
+                              Store 9(idata) 60
+                              Store 63(udata) 64
+              65:   12(float) Load 14(f1)
+              66:     17(int) Bitcast 65
+              68:     67(ptr) AccessChain 63(udata) 18
+              69:     17(int) Load 68
+              70:     17(int) IAdd 69 66
+              71:     67(ptr) AccessChain 63(udata) 18
+                              Store 71 70
+              72:   24(fvec2) Load 26(f2)
+              74:   73(ivec2) Bitcast 72
+              75:   61(ivec4) Load 63(udata)
+              76:   73(ivec2) VectorShuffle 75 75 0 1
+              77:   73(ivec2) IAdd 76 74
+              78:     67(ptr) AccessChain 63(udata) 18
+              79:     17(int) CompositeExtract 77 0
+                              Store 78 79
+              80:     67(ptr) AccessChain 63(udata) 35
+              81:     17(int) CompositeExtract 77 1
+                              Store 80 81
+              82:   38(fvec3) Load 40(f3)
+              84:   83(ivec3) Bitcast 82
+              85:   61(ivec4) Load 63(udata)
+              86:   83(ivec3) VectorShuffle 85 85 0 1 2
+              87:   83(ivec3) IAdd 86 84
+              88:     67(ptr) AccessChain 63(udata) 18
+              89:     17(int) CompositeExtract 87 0
+                              Store 88 89
+              90:     67(ptr) AccessChain 63(udata) 35
+              91:     17(int) CompositeExtract 87 1
+                              Store 90 91
+              92:     67(ptr) AccessChain 63(udata) 51
+              93:     17(int) CompositeExtract 87 2
+                              Store 92 93
+              94:   54(fvec4) Load 56(f4)
+              95:   61(ivec4) Bitcast 94
+              96:   61(ivec4) Load 63(udata)
+              97:   61(ivec4) IAdd 96 95
+                              Store 63(udata) 97
+                              Store 99(fdata) 101
+             104:      6(int) Load 103(i1)
+             105:   12(float) Bitcast 104
+             107:    106(ptr) AccessChain 99(fdata) 18
+             108:   12(float) Load 107
+             109:   12(float) FAdd 108 105
+             110:    106(ptr) AccessChain 99(fdata) 18
+                              Store 110 109
+             113:   28(ivec2) Load 112(i2)
+             114:   24(fvec2) Bitcast 113
+             115:   54(fvec4) Load 99(fdata)
+             116:   24(fvec2) VectorShuffle 115 115 0 1
+             117:   24(fvec2) FAdd 116 114
+             118:    106(ptr) AccessChain 99(fdata) 18
+             119:   12(float) CompositeExtract 117 0
+                              Store 118 119
+             120:    106(ptr) AccessChain 99(fdata) 35
+             121:   12(float) CompositeExtract 117 1
+                              Store 120 121
+             124:   42(ivec3) Load 123(i3)
+             125:   38(fvec3) Bitcast 124
+             126:   54(fvec4) Load 99(fdata)
+             127:   38(fvec3) VectorShuffle 126 126 0 1 2
+             128:   38(fvec3) FAdd 127 125
+             129:    106(ptr) AccessChain 99(fdata) 18
+             130:   12(float) CompositeExtract 128 0
+                              Store 129 130
+             131:    106(ptr) AccessChain 99(fdata) 35
+             132:   12(float) CompositeExtract 128 1
+                              Store 131 132
+             133:    106(ptr) AccessChain 99(fdata) 51
+             134:   12(float) CompositeExtract 128 2
+                              Store 133 134
+             137:    7(ivec4) Load 136(i4)
+             138:   54(fvec4) Bitcast 137
+             139:   54(fvec4) Load 99(fdata)
+             140:   54(fvec4) FAdd 139 138
+                              Store 99(fdata) 140
+             143:     17(int) Load 142(u1)
+             144:   12(float) Bitcast 143
+             145:    106(ptr) AccessChain 99(fdata) 18
+             146:   12(float) Load 145
+             147:   12(float) FAdd 146 144
+             148:    106(ptr) AccessChain 99(fdata) 18
+                              Store 148 147
+             151:   73(ivec2) Load 150(u2)
+             152:   24(fvec2) Bitcast 151
+             153:   54(fvec4) Load 99(fdata)
+             154:   24(fvec2) VectorShuffle 153 153 0 1
+             155:   24(fvec2) FAdd 154 152
+             156:    106(ptr) AccessChain 99(fdata) 18
+             157:   12(float) CompositeExtract 155 0
+                              Store 156 157
+             158:    106(ptr) AccessChain 99(fdata) 35
+             159:   12(float) CompositeExtract 155 1
+                              Store 158 159
+             162:   83(ivec3) Load 161(u3)
+             163:   38(fvec3) Bitcast 162
+             164:   54(fvec4) Load 99(fdata)
+             165:   38(fvec3) VectorShuffle 164 164 0 1 2
+             166:   38(fvec3) FAdd 165 163
+             167:    106(ptr) AccessChain 99(fdata) 18
+             168:   12(float) CompositeExtract 166 0
+                              Store 167 168
+             169:    106(ptr) AccessChain 99(fdata) 35
+             170:   12(float) CompositeExtract 166 1
+                              Store 169 170
+             171:    106(ptr) AccessChain 99(fdata) 51
+             172:   12(float) CompositeExtract 166 2
+                              Store 171 172
+             175:   61(ivec4) Load 174(u4)
+             176:   54(fvec4) Bitcast 175
+             177:   54(fvec4) Load 99(fdata)
+             178:   54(fvec4) FAdd 177 176
+                              Store 99(fdata) 178
+             181:    7(ivec4) Load 9(idata)
+             182:   61(ivec4) Bitcast 181
+             183:   61(ivec4) Load 63(udata)
+             186:  185(bvec4) IEqual 182 183
+             187:   184(bool) All 186
+                              SelectionMerge 190 None
+                              BranchConditional 187 189 192
+             189:               Label
+             191:   54(fvec4)   Load 99(fdata)
+                                Store 188 191
+                                Branch 190
+             192:               Label
+             193:   54(fvec4)   Load 99(fdata)
+             196:   54(fvec4)   FAdd 193 195
+                                Store 188 196
+                                Branch 190
+             190:             Label
+             197:   54(fvec4) Load 188
+                              Store 180(fragColor) 197
                               Return
                               FunctionEnd
diff --git a/third_party/vulkan-deps/glslang/src/Test/baseResults/spv.ext.AnyHitShader.rahit.out b/third_party/vulkan-deps/glslang/src/Test/baseResults/spv.ext.AnyHitShader.rahit.out
index 7bcf812..880be33 100644
--- a/third_party/vulkan-deps/glslang/src/Test/baseResults/spv.ext.AnyHitShader.rahit.out
+++ b/third_party/vulkan-deps/glslang/src/Test/baseResults/spv.ext.AnyHitShader.rahit.out
@@ -73,6 +73,7 @@
                               Decorate 98(gl_SubgroupSize) RelaxedPrecision
                               Decorate 98(gl_SubgroupSize) BuiltIn SubgroupSize
                               Decorate 99 RelaxedPrecision
+                              Decorate 100 RelaxedPrecision
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeInt 32 0
diff --git a/third_party/vulkan-deps/glslang/src/Test/baseResults/spv.ext.ClosestHitShader_Subgroup.rchit.out b/third_party/vulkan-deps/glslang/src/Test/baseResults/spv.ext.ClosestHitShader_Subgroup.rchit.out
index 14ec09b..7f5af89 100644
--- a/third_party/vulkan-deps/glslang/src/Test/baseResults/spv.ext.ClosestHitShader_Subgroup.rchit.out
+++ b/third_party/vulkan-deps/glslang/src/Test/baseResults/spv.ext.ClosestHitShader_Subgroup.rchit.out
@@ -38,10 +38,21 @@
                               Decorate 28(gl_SubgroupInvocationID) RelaxedPrecision
                               Decorate 28(gl_SubgroupInvocationID) BuiltIn SubgroupLocalInvocationId
                               Decorate 29 RelaxedPrecision
+                              Decorate 30 RelaxedPrecision
                               Decorate 34(gl_SubGroupGeMaskARB) BuiltIn SubgroupGeMaskKHR
+                              Decorate 41 RelaxedPrecision
+                              Decorate 42 RelaxedPrecision
                               Decorate 43(gl_SubgroupGtMask) BuiltIn SubgroupGtMaskKHR
+                              Decorate 46 RelaxedPrecision
+                              Decorate 46 RelaxedPrecision
+                              Decorate 47 RelaxedPrecision
                               Decorate 48(gl_SubgroupLeMask) BuiltIn SubgroupLeMaskKHR
+                              Decorate 51 RelaxedPrecision
+                              Decorate 51 RelaxedPrecision
+                              Decorate 52 RelaxedPrecision
                               Decorate 53(gl_SubGroupLtMaskARB) BuiltIn SubgroupLtMaskKHR
+                              Decorate 59 RelaxedPrecision
+                              Decorate 60 RelaxedPrecision
                               Decorate 61(gl_SMIDNV) BuiltIn SMIDNV
                2:             TypeVoid
                3:             TypeFunction 2
diff --git a/third_party/vulkan-deps/glslang/src/Test/baseResults/spv.float16.frag.out b/third_party/vulkan-deps/glslang/src/Test/baseResults/spv.float16.frag.out
index dd677b4..8c33a66 100644
--- a/third_party/vulkan-deps/glslang/src/Test/baseResults/spv.float16.frag.out
+++ b/third_party/vulkan-deps/glslang/src/Test/baseResults/spv.float16.frag.out
@@ -2,7 +2,7 @@
 Validation failed
 // Module Version 10000
 // Generated by (magic number): 8000a
-// Id's are bound by 534
+// Id's are bound by 542
 
                               Capability Shader
                               Capability Float16
@@ -80,87 +80,87 @@
                               Name 445  "f16v2"
                               Name 463  "f16v"
                               Name 465  "if16v"
-                              Name 514  "S"
-                              MemberName 514(S) 0  "x"
-                              MemberName 514(S) 1  "y"
-                              MemberName 514(S) 2  "z"
-                              Name 516  "B1"
-                              MemberName 516(B1) 0  "a"
-                              MemberName 516(B1) 1  "b"
-                              MemberName 516(B1) 2  "c"
-                              MemberName 516(B1) 3  "d"
-                              MemberName 516(B1) 4  "e"
-                              MemberName 516(B1) 5  "f"
-                              MemberName 516(B1) 6  "g"
-                              MemberName 516(B1) 7  "h"
-                              Name 518  ""
-                              Name 521  "S"
-                              MemberName 521(S) 0  "x"
-                              MemberName 521(S) 1  "y"
-                              MemberName 521(S) 2  "z"
-                              Name 523  "B2"
-                              MemberName 523(B2) 0  "o"
-                              MemberName 523(B2) 1  "p"
-                              MemberName 523(B2) 2  "q"
-                              MemberName 523(B2) 3  "r"
-                              MemberName 523(B2) 4  "s"
-                              MemberName 523(B2) 5  "t"
-                              MemberName 523(B2) 6  "u"
-                              MemberName 523(B2) 7  "v"
-                              Name 525  ""
-                              Name 526  "sf16"
-                              Name 527  "sf"
-                              Name 528  "sd"
-                              Name 529  "f16_to_f"
-                              Name 531  "f16_to_d"
-                              Name 532  "f_to_f16"
-                              Name 533  "d_to_f16"
+                              Name 522  "S"
+                              MemberName 522(S) 0  "x"
+                              MemberName 522(S) 1  "y"
+                              MemberName 522(S) 2  "z"
+                              Name 524  "B1"
+                              MemberName 524(B1) 0  "a"
+                              MemberName 524(B1) 1  "b"
+                              MemberName 524(B1) 2  "c"
+                              MemberName 524(B1) 3  "d"
+                              MemberName 524(B1) 4  "e"
+                              MemberName 524(B1) 5  "f"
+                              MemberName 524(B1) 6  "g"
+                              MemberName 524(B1) 7  "h"
+                              Name 526  ""
+                              Name 529  "S"
+                              MemberName 529(S) 0  "x"
+                              MemberName 529(S) 1  "y"
+                              MemberName 529(S) 2  "z"
+                              Name 531  "B2"
+                              MemberName 531(B2) 0  "o"
+                              MemberName 531(B2) 1  "p"
+                              MemberName 531(B2) 2  "q"
+                              MemberName 531(B2) 3  "r"
+                              MemberName 531(B2) 4  "s"
+                              MemberName 531(B2) 5  "t"
+                              MemberName 531(B2) 6  "u"
+                              MemberName 531(B2) 7  "v"
+                              Name 533  ""
+                              Name 534  "sf16"
+                              Name 535  "sf"
+                              Name 536  "sd"
+                              Name 537  "f16_to_f"
+                              Name 539  "f16_to_d"
+                              Name 540  "f_to_f16"
+                              Name 541  "d_to_f16"
                               Decorate 465(if16v) Location 0
-                              Decorate 512 ArrayStride 16
-                              Decorate 513 ArrayStride 32
-                              MemberDecorate 514(S) 0 Offset 0
-                              MemberDecorate 514(S) 1 Offset 4
-                              MemberDecorate 514(S) 2 Offset 8
-                              Decorate 515 ArrayStride 16
-                              MemberDecorate 516(B1) 0 Offset 0
-                              MemberDecorate 516(B1) 1 Offset 4
-                              MemberDecorate 516(B1) 2 Offset 8
-                              MemberDecorate 516(B1) 3 Offset 16
-                              MemberDecorate 516(B1) 4 ColMajor
-                              MemberDecorate 516(B1) 4 Offset 48
-                              MemberDecorate 516(B1) 4 MatrixStride 16
-                              MemberDecorate 516(B1) 5 ColMajor
-                              MemberDecorate 516(B1) 5 Offset 80
-                              MemberDecorate 516(B1) 5 MatrixStride 16
-                              MemberDecorate 516(B1) 6 Offset 144
-                              MemberDecorate 516(B1) 7 Offset 160
-                              Decorate 516(B1) Block
-                              Decorate 518 DescriptorSet 0
-                              Decorate 518 Binding 0
-                              Decorate 519 ArrayStride 2
-                              Decorate 520 ArrayStride 12
-                              MemberDecorate 521(S) 0 Offset 0
-                              MemberDecorate 521(S) 1 Offset 4
-                              MemberDecorate 521(S) 2 Offset 8
-                              Decorate 522 ArrayStride 16
-                              MemberDecorate 523(B2) 0 Offset 0
-                              MemberDecorate 523(B2) 1 Offset 4
-                              MemberDecorate 523(B2) 2 Offset 8
-                              MemberDecorate 523(B2) 3 Offset 14
-                              MemberDecorate 523(B2) 4 RowMajor
-                              MemberDecorate 523(B2) 4 Offset 20
-                              MemberDecorate 523(B2) 4 MatrixStride 4
-                              MemberDecorate 523(B2) 5 RowMajor
-                              MemberDecorate 523(B2) 5 Offset 32
-                              MemberDecorate 523(B2) 5 MatrixStride 4
-                              MemberDecorate 523(B2) 6 Offset 56
-                              MemberDecorate 523(B2) 7 Offset 72
-                              Decorate 523(B2) BufferBlock
-                              Decorate 525 DescriptorSet 0
-                              Decorate 525 Binding 0
-                              Decorate 526(sf16) SpecId 100
-                              Decorate 527(sf) SpecId 101
-                              Decorate 528(sd) SpecId 102
+                              Decorate 520 ArrayStride 16
+                              Decorate 521 ArrayStride 32
+                              MemberDecorate 522(S) 0 Offset 0
+                              MemberDecorate 522(S) 1 Offset 4
+                              MemberDecorate 522(S) 2 Offset 8
+                              Decorate 523 ArrayStride 16
+                              MemberDecorate 524(B1) 0 Offset 0
+                              MemberDecorate 524(B1) 1 Offset 4
+                              MemberDecorate 524(B1) 2 Offset 8
+                              MemberDecorate 524(B1) 3 Offset 16
+                              MemberDecorate 524(B1) 4 ColMajor
+                              MemberDecorate 524(B1) 4 Offset 48
+                              MemberDecorate 524(B1) 4 MatrixStride 16
+                              MemberDecorate 524(B1) 5 ColMajor
+                              MemberDecorate 524(B1) 5 Offset 80
+                              MemberDecorate 524(B1) 5 MatrixStride 16
+                              MemberDecorate 524(B1) 6 Offset 144
+                              MemberDecorate 524(B1) 7 Offset 160
+                              Decorate 524(B1) Block
+                              Decorate 526 DescriptorSet 0
+                              Decorate 526 Binding 0
+                              Decorate 527 ArrayStride 2
+                              Decorate 528 ArrayStride 12
+                              MemberDecorate 529(S) 0 Offset 0
+                              MemberDecorate 529(S) 1 Offset 4
+                              MemberDecorate 529(S) 2 Offset 8
+                              Decorate 530 ArrayStride 16
+                              MemberDecorate 531(B2) 0 Offset 0
+                              MemberDecorate 531(B2) 1 Offset 4
+                              MemberDecorate 531(B2) 2 Offset 8
+                              MemberDecorate 531(B2) 3 Offset 14
+                              MemberDecorate 531(B2) 4 RowMajor
+                              MemberDecorate 531(B2) 4 Offset 20
+                              MemberDecorate 531(B2) 4 MatrixStride 4
+                              MemberDecorate 531(B2) 5 RowMajor
+                              MemberDecorate 531(B2) 5 Offset 32
+                              MemberDecorate 531(B2) 5 MatrixStride 4
+                              MemberDecorate 531(B2) 6 Offset 56
+                              MemberDecorate 531(B2) 7 Offset 72
+                              Decorate 531(B2) BufferBlock
+                              Decorate 533 DescriptorSet 0
+                              Decorate 533 Binding 0
+                              Decorate 534(sf16) SpecId 100
+                              Decorate 535(sf) SpecId 101
+                              Decorate 536(sd) SpecId 102
                2:             TypeVoid
                3:             TypeFunction 2
               28:             TypeFloat 16
@@ -218,32 +218,32 @@
              464:             TypePointer Input 151(f16vec3)
       465(if16v):    464(ptr) Variable Input
              466:             TypePointer Input 28(float16_t)
-             503:    183(int) Constant 1
-             508:28(float16_t) Constant 14336
-             509: 29(f16vec2) ConstantComposite 508 508
-             511:     33(int) Constant 2
-             512:             TypeArray 28(float16_t) 511
-             513:             TypeArray 406 511
-          514(S):             TypeStruct 28(float16_t) 29(f16vec2) 151(f16vec3)
-             515:             TypeArray 514(S) 511
-         516(B1):             TypeStruct 28(float16_t) 29(f16vec2) 151(f16vec3) 512 406 513 514(S) 515
-             517:             TypePointer Uniform 516(B1)
-             518:    517(ptr) Variable Uniform
-             519:             TypeArray 28(float16_t) 511
-             520:             TypeArray 406 511
-          521(S):             TypeStruct 28(float16_t) 29(f16vec2) 151(f16vec3)
-             522:             TypeArray 521(S) 511
-         523(B2):             TypeStruct 28(float16_t) 29(f16vec2) 151(f16vec3) 519 406 520 521(S) 522
-             524:             TypePointer Uniform 523(B2)
-             525:    524(ptr) Variable Uniform
-       526(sf16):28(float16_t) SpecConstant 12288
-         527(sf):  164(float) SpecConstant 1048576000
-         528(sd):172(float64_t) SpecConstant 0 1071644672
-   529(f16_to_f):  164(float) SpecConstantOp 115 526(sf16)
-             530:  164(float) SpecConstantOp 115 526(sf16)
-   531(f16_to_d):172(float64_t) SpecConstantOp 115 530
-   532(f_to_f16):28(float16_t) SpecConstantOp 115 527(sf)
-   533(d_to_f16):28(float16_t) SpecConstantOp 115 528(sd)
+             509:    183(int) Constant 1
+             516:28(float16_t) Constant 14336
+             517: 29(f16vec2) ConstantComposite 516 516
+             519:     33(int) Constant 2
+             520:             TypeArray 28(float16_t) 519
+             521:             TypeArray 406 519
+          522(S):             TypeStruct 28(float16_t) 29(f16vec2) 151(f16vec3)
+             523:             TypeArray 522(S) 519
+         524(B1):             TypeStruct 28(float16_t) 29(f16vec2) 151(f16vec3) 520 406 521 522(S) 523
+             525:             TypePointer Uniform 524(B1)
+             526:    525(ptr) Variable Uniform
+             527:             TypeArray 28(float16_t) 519
+             528:             TypeArray 406 519
+          529(S):             TypeStruct 28(float16_t) 29(f16vec2) 151(f16vec3)
+             530:             TypeArray 529(S) 519
+         531(B2):             TypeStruct 28(float16_t) 29(f16vec2) 151(f16vec3) 527 406 528 529(S) 530
+             532:             TypePointer Uniform 531(B2)
+             533:    532(ptr) Variable Uniform
+       534(sf16):28(float16_t) SpecConstant 12288
+         535(sf):  164(float) SpecConstant 1048576000
+         536(sd):172(float64_t) SpecConstant 0 1071644672
+   537(f16_to_f):  164(float) SpecConstantOp 115 534(sf16)
+             538:  164(float) SpecConstantOp 115 534(sf16)
+   539(f16_to_d):172(float64_t) SpecConstantOp 115 538
+   540(f_to_f16):28(float16_t) SpecConstantOp 115 535(sf)
+   541(d_to_f16):28(float16_t) SpecConstantOp 115 536(sd)
          4(main):           2 Function None 3
                5:             Label
                               Return
@@ -801,45 +801,57 @@
              475:151(f16vec3) Load 465(if16v)
              476: 29(f16vec2) VectorShuffle 475 475 0 1
              477: 29(f16vec2) DPdxFine 476
-             478:151(f16vec3) Load 463(f16v)
-             479:151(f16vec3) VectorShuffle 478 477 3 4 2
-                              Store 463(f16v) 479
-             480:151(f16vec3) Load 465(if16v)
-             481: 29(f16vec2) VectorShuffle 480 480 0 1
-             482: 29(f16vec2) DPdyFine 481
-             483:151(f16vec3) Load 463(f16v)
-             484:151(f16vec3) VectorShuffle 483 482 3 4 2
-                              Store 463(f16v) 484
-             485:151(f16vec3) Load 465(if16v)
-             486:151(f16vec3) DPdxCoarse 485
-                              Store 463(f16v) 486
-             487:151(f16vec3) Load 465(if16v)
-             488:151(f16vec3) DPdxCoarse 487
-                              Store 463(f16v) 488
-             489:    466(ptr) AccessChain 465(if16v) 34
-             490:28(float16_t) Load 489
-             491:28(float16_t) Fwidth 490
-             492:     35(ptr) AccessChain 463(f16v) 34
-                              Store 492 491
-             493:151(f16vec3) Load 465(if16v)
-             494: 29(f16vec2) VectorShuffle 493 493 0 1
-             495: 29(f16vec2) FwidthFine 494
-             496:151(f16vec3) Load 463(f16v)
-             497:151(f16vec3) VectorShuffle 496 495 3 4 2
-                              Store 463(f16v) 497
-             498:151(f16vec3) Load 465(if16v)
-             499:151(f16vec3) FwidthCoarse 498
-                              Store 463(f16v) 499
-             500:    466(ptr) AccessChain 465(if16v) 34
-             501:28(float16_t) ExtInst 1(GLSL.std.450) 76(InterpolateAtCentroid) 500
-             502:     35(ptr) AccessChain 463(f16v) 34
-                              Store 502 501
-             504:151(f16vec3) ExtInst 1(GLSL.std.450) 77(InterpolateAtSample) 465(if16v) 503
-             505: 29(f16vec2) VectorShuffle 504 504 0 1
-             506:151(f16vec3) Load 463(f16v)
-             507:151(f16vec3) VectorShuffle 506 505 3 4 2
-                              Store 463(f16v) 507
-             510:151(f16vec3) ExtInst 1(GLSL.std.450) 78(InterpolateAtOffset) 465(if16v) 509
-                              Store 463(f16v) 510
+             478:     35(ptr) AccessChain 463(f16v) 34
+             479:28(float16_t) CompositeExtract 477 0
+                              Store 478 479
+             480:     35(ptr) AccessChain 463(f16v) 90
+             481:28(float16_t) CompositeExtract 477 1
+                              Store 480 481
+             482:151(f16vec3) Load 465(if16v)
+             483: 29(f16vec2) VectorShuffle 482 482 0 1
+             484: 29(f16vec2) DPdyFine 483
+             485:     35(ptr) AccessChain 463(f16v) 34
+             486:28(float16_t) CompositeExtract 484 0
+                              Store 485 486
+             487:     35(ptr) AccessChain 463(f16v) 90
+             488:28(float16_t) CompositeExtract 484 1
+                              Store 487 488
+             489:151(f16vec3) Load 465(if16v)
+             490:151(f16vec3) DPdxCoarse 489
+                              Store 463(f16v) 490
+             491:151(f16vec3) Load 465(if16v)
+             492:151(f16vec3) DPdxCoarse 491
+                              Store 463(f16v) 492
+             493:    466(ptr) AccessChain 465(if16v) 34
+             494:28(float16_t) Load 493
+             495:28(float16_t) Fwidth 494
+             496:     35(ptr) AccessChain 463(f16v) 34
+                              Store 496 495
+             497:151(f16vec3) Load 465(if16v)
+             498: 29(f16vec2) VectorShuffle 497 497 0 1
+             499: 29(f16vec2) FwidthFine 498
+             500:     35(ptr) AccessChain 463(f16v) 34
+             501:28(float16_t) CompositeExtract 499 0
+                              Store 500 501
+             502:     35(ptr) AccessChain 463(f16v) 90
+             503:28(float16_t) CompositeExtract 499 1
+                              Store 502 503
+             504:151(f16vec3) Load 465(if16v)
+             505:151(f16vec3) FwidthCoarse 504
+                              Store 463(f16v) 505
+             506:    466(ptr) AccessChain 465(if16v) 34
+             507:28(float16_t) ExtInst 1(GLSL.std.450) 76(InterpolateAtCentroid) 506
+             508:     35(ptr) AccessChain 463(f16v) 34
+                              Store 508 507
+             510:151(f16vec3) ExtInst 1(GLSL.std.450) 77(InterpolateAtSample) 465(if16v) 509
+             511: 29(f16vec2) VectorShuffle 510 510 0 1
+             512:     35(ptr) AccessChain 463(f16v) 34
+             513:28(float16_t) CompositeExtract 511 0
+                              Store 512 513
+             514:     35(ptr) AccessChain 463(f16v) 90
+             515:28(float16_t) CompositeExtract 511 1
+                              Store 514 515
+             518:151(f16vec3) ExtInst 1(GLSL.std.450) 78(InterpolateAtOffset) 465(if16v) 517
+                              Store 463(f16v) 518
                               Return
                               FunctionEnd
diff --git a/third_party/vulkan-deps/glslang/src/Test/baseResults/spv.float16Fetch.frag.out b/third_party/vulkan-deps/glslang/src/Test/baseResults/spv.float16Fetch.frag.out
index 3b2c36f..da4aa4d 100644
--- a/third_party/vulkan-deps/glslang/src/Test/baseResults/spv.float16Fetch.frag.out
+++ b/third_party/vulkan-deps/glslang/src/Test/baseResults/spv.float16Fetch.frag.out
@@ -2,7 +2,7 @@
 Validation failed
 // Module Version 10000
 // Generated by (magic number): 8000a
-// Id's are bound by 5933
+// Id's are bound by 5979
 
                               Capability Shader
                               Capability Float16
@@ -29,7 +29,7 @@
                               Extension  "SPV_KHR_16bit_storage"
                1:             ExtInstImport  "GLSL.std.450"
                               MemoryModel Logical GLSL450
-                              EntryPoint Fragment 4  "main" 128 135 137 148 156 169 177 215 251 309 565 572 1393 1401 1409 1417 1425 1433 4267 4274 5923 5932
+                              EntryPoint Fragment 4  "main" 128 135 137 148 156 169 177 215 251 309 565 572 1393 1401 1409 1417 1425 1433 4311 4318 5969 5978
                               ExecutionMode 4 OriginUpperLeft
                               Source GLSL 450
                               SourceExtension  "GL_AMD_gpu_shader_half_float"
@@ -145,68 +145,68 @@
                               Name 2502  "texel"
                               Name 2530  "texel"
                               Name 2559  "size"
-                              Name 2733  "lod"
-                              Name 2869  "levels"
-                              Name 2938  "samples"
-                              Name 2952  "texel"
-                              Name 2955  "i1D"
-                              Name 2964  "i2D"
-                              Name 2973  "i3D"
-                              Name 2982  "i2DRect"
-                              Name 2991  "iCube"
-                              Name 3000  "iBuffer"
-                              Name 3009  "i1DArray"
-                              Name 3018  "i2DArray"
-                              Name 3027  "iCubeArray"
-                              Name 3036  "i2DMS"
-                              Name 3045  "i2DMSArray"
-                              Name 3099  "texel"
-                              Name 3102  "ResType"
-                              Name 3138  "ResType"
-                              Name 3242  "texel"
-                              Name 3322  "texel"
-                              Name 3412  "texel"
-                              Name 3468  "texel"
-                              Name 3628  "texel"
-                              Name 3742  "texel"
-                              Name 3794  "texel"
-                              Name 3832  "texel"
-                              Name 3950  "texel"
-                              Name 4022  "texel"
-                              Name 4104  "texel"
-                              Name 4156  "texel"
-                              Name 4184  "texel"
-                              Name 4212  "texel"
-                              Name 4264  "texel"
-                              Name 4267  "lodClamp"
-                              Name 4274  "f16lodClamp"
-                              Name 4401  "texel"
-                              Name 4608  "texel"
-                              Name 4684  "texel"
-                              Name 4828  "texel"
-                              Name 4972  "texel"
-                              Name 5198  "texel"
-                              Name 5290  "texel"
-                              Name 5462  "texel"
-                              Name 5464  "t1D"
-                              Name 5468  "s"
-                              Name 5484  "t2D"
-                              Name 5501  "t3D"
-                              Name 5518  "tCube"
-                              Name 5535  "sShadow"
-                              Name 5599  "t1DArray"
-                              Name 5616  "t2DArray"
-                              Name 5633  "tCubeArray"
-                              Name 5691  "t2DRect"
-                              Name 5751  "subpass"
-                              Name 5757  "subpassMS"
-                              Name 5763  "result"
-                              Name 5844  "param"
-                              Name 5923  "fragColor"
-                              Name 5927  "tBuffer"
-                              Name 5929  "t2DMS"
-                              Name 5931  "t2DMSArray"
-                              Name 5932  "bias"
+                              Name 2777  "lod"
+                              Name 2913  "levels"
+                              Name 2982  "samples"
+                              Name 2996  "texel"
+                              Name 2999  "i1D"
+                              Name 3008  "i2D"
+                              Name 3017  "i3D"
+                              Name 3026  "i2DRect"
+                              Name 3035  "iCube"
+                              Name 3044  "iBuffer"
+                              Name 3053  "i1DArray"
+                              Name 3062  "i2DArray"
+                              Name 3071  "iCubeArray"
+                              Name 3080  "i2DMS"
+                              Name 3089  "i2DMSArray"
+                              Name 3143  "texel"
+                              Name 3146  "ResType"
+                              Name 3182  "ResType"
+                              Name 3286  "texel"
+                              Name 3366  "texel"
+                              Name 3456  "texel"
+                              Name 3512  "texel"
+                              Name 3672  "texel"
+                              Name 3786  "texel"
+                              Name 3838  "texel"
+                              Name 3876  "texel"
+                              Name 3994  "texel"
+                              Name 4066  "texel"
+                              Name 4148  "texel"
+                              Name 4200  "texel"
+                              Name 4228  "texel"
+                              Name 4256  "texel"
+                              Name 4308  "texel"
+                              Name 4311  "lodClamp"
+                              Name 4318  "f16lodClamp"
+                              Name 4445  "texel"
+                              Name 4652  "texel"
+                              Name 4728  "texel"
+                              Name 4872  "texel"
+                              Name 5016  "texel"
+                              Name 5242  "texel"
+                              Name 5334  "texel"
+                              Name 5506  "texel"
+                              Name 5508  "t1D"
+                              Name 5512  "s"
+                              Name 5528  "t2D"
+                              Name 5545  "t3D"
+                              Name 5562  "tCube"
+                              Name 5579  "sShadow"
+                              Name 5643  "t1DArray"
+                              Name 5660  "t2DArray"
+                              Name 5677  "tCubeArray"
+                              Name 5735  "t2DRect"
+                              Name 5795  "subpass"
+                              Name 5801  "subpassMS"
+                              Name 5807  "result"
+                              Name 5890  "param"
+                              Name 5969  "fragColor"
+                              Name 5973  "tBuffer"
+                              Name 5975  "t2DMS"
+                              Name 5977  "t2DMSArray"
+                              Name 5978  "bias"
                               Decorate 125(s1D) DescriptorSet 0
                               Decorate 125(s1D) Binding 0
                               Decorate 128(c1) Location 0
@@ -261,64 +261,64 @@
                               Decorate 1417(f16dPdxy2) Location 19
                               Decorate 1425(dPdxy3) Location 10
                               Decorate 1433(f16dPdxy3) Location 20
-                              Decorate 2955(i1D) DescriptorSet 1
-                              Decorate 2955(i1D) Binding 0
-                              Decorate 2964(i2D) DescriptorSet 1
-                              Decorate 2964(i2D) Binding 1
-                              Decorate 2973(i3D) DescriptorSet 1
-                              Decorate 2973(i3D) Binding 2
-                              Decorate 2982(i2DRect) DescriptorSet 1
-                              Decorate 2982(i2DRect) Binding 3
-                              Decorate 2991(iCube) DescriptorSet 1
-                              Decorate 2991(iCube) Binding 4
-                              Decorate 3000(iBuffer) DescriptorSet 1
-                              Decorate 3000(iBuffer) Binding 8
-                              Decorate 3009(i1DArray) DescriptorSet 1
-                              Decorate 3009(i1DArray) Binding 5
-                              Decorate 3018(i2DArray) DescriptorSet 1
-                              Decorate 3018(i2DArray) Binding 6
-                              Decorate 3027(iCubeArray) DescriptorSet 1
-                              Decorate 3027(iCubeArray) Binding 7
-                              Decorate 3036(i2DMS) DescriptorSet 1
-                              Decorate 3036(i2DMS) Binding 9
-                              Decorate 3045(i2DMSArray) DescriptorSet 1
-                              Decorate 3045(i2DMSArray) Binding 10
-                              Decorate 4267(lodClamp) Location 7
-                              Decorate 4274(f16lodClamp) Location 17
-                              Decorate 5464(t1D) DescriptorSet 2
-                              Decorate 5464(t1D) Binding 0
-                              Decorate 5468(s) DescriptorSet 2
-                              Decorate 5468(s) Binding 11
-                              Decorate 5484(t2D) DescriptorSet 2
-                              Decorate 5484(t2D) Binding 1
-                              Decorate 5501(t3D) DescriptorSet 2
-                              Decorate 5501(t3D) Binding 2
-                              Decorate 5518(tCube) DescriptorSet 2
-                              Decorate 5518(tCube) Binding 4
-                              Decorate 5535(sShadow) DescriptorSet 2
-                              Decorate 5535(sShadow) Binding 12
-                              Decorate 5599(t1DArray) DescriptorSet 2
-                              Decorate 5599(t1DArray) Binding 5
-                              Decorate 5616(t2DArray) DescriptorSet 2
-                              Decorate 5616(t2DArray) Binding 6
-                              Decorate 5633(tCubeArray) DescriptorSet 2
-                              Decorate 5633(tCubeArray) Binding 7
-                              Decorate 5691(t2DRect) DescriptorSet 2
-                              Decorate 5691(t2DRect) Binding 3
-                              Decorate 5751(subpass) DescriptorSet 3
-                              Decorate 5751(subpass) Binding 0
-                              Decorate 5751(subpass) InputAttachmentIndex 0
-                              Decorate 5757(subpassMS) DescriptorSet 3
-                              Decorate 5757(subpassMS) Binding 1
-                              Decorate 5757(subpassMS) InputAttachmentIndex 0
-                              Decorate 5923(fragColor) Location 0
-                              Decorate 5927(tBuffer) DescriptorSet 2
-                              Decorate 5927(tBuffer) Binding 8
-                              Decorate 5929(t2DMS) DescriptorSet 2
-                              Decorate 5929(t2DMS) Binding 9
-                              Decorate 5931(t2DMSArray) DescriptorSet 2
-                              Decorate 5931(t2DMSArray) Binding 10
-                              Decorate 5932(bias) Location 6
+                              Decorate 2999(i1D) DescriptorSet 1
+                              Decorate 2999(i1D) Binding 0
+                              Decorate 3008(i2D) DescriptorSet 1
+                              Decorate 3008(i2D) Binding 1
+                              Decorate 3017(i3D) DescriptorSet 1
+                              Decorate 3017(i3D) Binding 2
+                              Decorate 3026(i2DRect) DescriptorSet 1
+                              Decorate 3026(i2DRect) Binding 3
+                              Decorate 3035(iCube) DescriptorSet 1
+                              Decorate 3035(iCube) Binding 4
+                              Decorate 3044(iBuffer) DescriptorSet 1
+                              Decorate 3044(iBuffer) Binding 8
+                              Decorate 3053(i1DArray) DescriptorSet 1
+                              Decorate 3053(i1DArray) Binding 5
+                              Decorate 3062(i2DArray) DescriptorSet 1
+                              Decorate 3062(i2DArray) Binding 6
+                              Decorate 3071(iCubeArray) DescriptorSet 1
+                              Decorate 3071(iCubeArray) Binding 7
+                              Decorate 3080(i2DMS) DescriptorSet 1
+                              Decorate 3080(i2DMS) Binding 9
+                              Decorate 3089(i2DMSArray) DescriptorSet 1
+                              Decorate 3089(i2DMSArray) Binding 10
+                              Decorate 4311(lodClamp) Location 7
+                              Decorate 4318(f16lodClamp) Location 17
+                              Decorate 5508(t1D) DescriptorSet 2
+                              Decorate 5508(t1D) Binding 0
+                              Decorate 5512(s) DescriptorSet 2
+                              Decorate 5512(s) Binding 11
+                              Decorate 5528(t2D) DescriptorSet 2
+                              Decorate 5528(t2D) Binding 1
+                              Decorate 5545(t3D) DescriptorSet 2
+                              Decorate 5545(t3D) Binding 2
+                              Decorate 5562(tCube) DescriptorSet 2
+                              Decorate 5562(tCube) Binding 4
+                              Decorate 5579(sShadow) DescriptorSet 2
+                              Decorate 5579(sShadow) Binding 12
+                              Decorate 5643(t1DArray) DescriptorSet 2
+                              Decorate 5643(t1DArray) Binding 5
+                              Decorate 5660(t2DArray) DescriptorSet 2
+                              Decorate 5660(t2DArray) Binding 6
+                              Decorate 5677(tCubeArray) DescriptorSet 2
+                              Decorate 5677(tCubeArray) Binding 7
+                              Decorate 5735(t2DRect) DescriptorSet 2
+                              Decorate 5735(t2DRect) Binding 3
+                              Decorate 5795(subpass) DescriptorSet 3
+                              Decorate 5795(subpass) Binding 0
+                              Decorate 5795(subpass) InputAttachmentIndex 0
+                              Decorate 5801(subpassMS) DescriptorSet 3
+                              Decorate 5801(subpassMS) Binding 1
+                              Decorate 5801(subpassMS) InputAttachmentIndex 0
+                              Decorate 5969(fragColor) Location 0
+                              Decorate 5973(tBuffer) DescriptorSet 2
+                              Decorate 5973(tBuffer) Binding 8
+                              Decorate 5975(t2DMS) DescriptorSet 2
+                              Decorate 5975(t2DMS) Binding 9
+                              Decorate 5977(t2DMSArray) DescriptorSet 2
+                              Decorate 5977(t2DMSArray) Binding 10
+                              Decorate 5978(bias) Location 6
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeFloat 16
@@ -453,306 +453,311 @@
             2558:             TypePointer Function 48(ivec4)
             2560:   48(ivec4) ConstantComposite 2187 2187 2187 2187
             2566:             TypePointer Function 47(int)
-            2732:             TypePointer Function 53(fvec2)
-            2734:   52(float) Constant 0
-            2735:   53(fvec2) ConstantComposite 2734 2734
-            2953:             TypeImage 6(float16_t) 1D nonsampled format:Rgba16f
-            2954:             TypePointer UniformConstant 2953
-       2955(i1D):   2954(ptr) Variable UniformConstant
-            2962:             TypeImage 6(float16_t) 2D nonsampled format:Rgba16f
-            2963:             TypePointer UniformConstant 2962
-       2964(i2D):   2963(ptr) Variable UniformConstant
-            2971:             TypeImage 6(float16_t) 3D nonsampled format:Rgba16f
-            2972:             TypePointer UniformConstant 2971
-       2973(i3D):   2972(ptr) Variable UniformConstant
-            2980:             TypeImage 6(float16_t) Rect nonsampled format:Rgba16f
-            2981:             TypePointer UniformConstant 2980
-   2982(i2DRect):   2981(ptr) Variable UniformConstant
-            2989:             TypeImage 6(float16_t) Cube nonsampled format:Rgba16f
-            2990:             TypePointer UniformConstant 2989
-     2991(iCube):   2990(ptr) Variable UniformConstant
-            2998:             TypeImage 6(float16_t) Buffer nonsampled format:Rgba16f
-            2999:             TypePointer UniformConstant 2998
-   3000(iBuffer):   2999(ptr) Variable UniformConstant
-            3007:             TypeImage 6(float16_t) 1D array nonsampled format:Rgba16f
-            3008:             TypePointer UniformConstant 3007
-  3009(i1DArray):   3008(ptr) Variable UniformConstant
-            3016:             TypeImage 6(float16_t) 2D array nonsampled format:Rgba16f
-            3017:             TypePointer UniformConstant 3016
-  3018(i2DArray):   3017(ptr) Variable UniformConstant
-            3025:             TypeImage 6(float16_t) Cube array nonsampled format:Rgba16f
-            3026:             TypePointer UniformConstant 3025
-3027(iCubeArray):   3026(ptr) Variable UniformConstant
-            3034:             TypeImage 6(float16_t) 2D multi-sampled nonsampled format:Rgba16f
-            3035:             TypePointer UniformConstant 3034
-     3036(i2DMS):   3035(ptr) Variable UniformConstant
-            3043:             TypeImage 6(float16_t) 2D array multi-sampled nonsampled format:Rgba16f
-            3044:             TypePointer UniformConstant 3043
-3045(i2DMSArray):   3044(ptr) Variable UniformConstant
-   3102(ResType):             TypeStruct 47(int) 7(f16vec4)
-   3138(ResType):             TypeStruct 47(int) 6(float16_t)
-            4025:  721(ivec2) ConstantComposite 709 1326
-            4026:     47(int) Constant 3
-            4027:     47(int) Constant 4
-            4028:  721(ivec2) ConstantComposite 4026 4027
-            4029:     47(int) Constant 15
-            4030:     47(int) Constant 16
-            4031:  721(ivec2) ConstantComposite 4029 4030
-            4032:     47(int) Constant 4294967294
-            4033:  721(ivec2) ConstantComposite 4032 2187
-            4034:        2379 ConstantComposite 4025 4028 4031 4033
-  4267(lodClamp):    127(ptr) Variable Input
-4274(f16lodClamp):    134(ptr) Variable Input
-            5463:             TypePointer UniformConstant 122
-       5464(t1D):   5463(ptr) Variable UniformConstant
-            5466:             TypeSampler
-            5467:             TypePointer UniformConstant 5466
-         5468(s):   5467(ptr) Variable UniformConstant
-            5483:             TypePointer UniformConstant 142
-       5484(t2D):   5483(ptr) Variable UniformConstant
-            5500:             TypePointer UniformConstant 162
-       5501(t3D):   5500(ptr) Variable UniformConstant
-            5517:             TypePointer UniformConstant 183
-     5518(tCube):   5517(ptr) Variable UniformConstant
-   5535(sShadow):   5467(ptr) Variable UniformConstant
-            5598:             TypePointer UniformConstant 268
-  5599(t1DArray):   5598(ptr) Variable UniformConstant
-            5615:             TypePointer UniformConstant 283
-  5616(t2DArray):   5615(ptr) Variable UniformConstant
-            5632:             TypePointer UniformConstant 298
-5633(tCubeArray):   5632(ptr) Variable UniformConstant
-            5690:             TypePointer UniformConstant 356
-   5691(t2DRect):   5690(ptr) Variable UniformConstant
-            5749:             TypeImage 6(float16_t) SubpassData nonsampled format:Unknown
-            5750:             TypePointer UniformConstant 5749
-   5751(subpass):   5750(ptr) Variable UniformConstant
-            5753:  721(ivec2) ConstantComposite 2187 2187
-            5755:             TypeImage 6(float16_t) SubpassData multi-sampled nonsampled format:Unknown
-            5756:             TypePointer UniformConstant 5755
- 5757(subpassMS):   5756(ptr) Variable UniformConstant
-            5922:             TypePointer Output 249(fvec4)
- 5923(fragColor):   5922(ptr) Variable Output
-            5926:             TypePointer UniformConstant 1297
-   5927(tBuffer):   5926(ptr) Variable UniformConstant
-            5928:             TypePointer UniformConstant 1308
-     5929(t2DMS):   5928(ptr) Variable UniformConstant
-            5930:             TypePointer UniformConstant 1319
-5931(t2DMSArray):   5930(ptr) Variable UniformConstant
-      5932(bias):    127(ptr) Variable Input
+            2581:    206(int) Constant 1
+            2596:    206(int) Constant 2
+            2776:             TypePointer Function 53(fvec2)
+            2778:   52(float) Constant 0
+            2779:   53(fvec2) ConstantComposite 2778 2778
+            2997:             TypeImage 6(float16_t) 1D nonsampled format:Rgba16f
+            2998:             TypePointer UniformConstant 2997
+       2999(i1D):   2998(ptr) Variable UniformConstant
+            3006:             TypeImage 6(float16_t) 2D nonsampled format:Rgba16f
+            3007:             TypePointer UniformConstant 3006
+       3008(i2D):   3007(ptr) Variable UniformConstant
+            3015:             TypeImage 6(float16_t) 3D nonsampled format:Rgba16f
+            3016:             TypePointer UniformConstant 3015
+       3017(i3D):   3016(ptr) Variable UniformConstant
+            3024:             TypeImage 6(float16_t) Rect nonsampled format:Rgba16f
+            3025:             TypePointer UniformConstant 3024
+   3026(i2DRect):   3025(ptr) Variable UniformConstant
+            3033:             TypeImage 6(float16_t) Cube nonsampled format:Rgba16f
+            3034:             TypePointer UniformConstant 3033
+     3035(iCube):   3034(ptr) Variable UniformConstant
+            3042:             TypeImage 6(float16_t) Buffer nonsampled format:Rgba16f
+            3043:             TypePointer UniformConstant 3042
+   3044(iBuffer):   3043(ptr) Variable UniformConstant
+            3051:             TypeImage 6(float16_t) 1D array nonsampled format:Rgba16f
+            3052:             TypePointer UniformConstant 3051
+  3053(i1DArray):   3052(ptr) Variable UniformConstant
+            3060:             TypeImage 6(float16_t) 2D array nonsampled format:Rgba16f
+            3061:             TypePointer UniformConstant 3060
+  3062(i2DArray):   3061(ptr) Variable UniformConstant
+            3069:             TypeImage 6(float16_t) Cube array nonsampled format:Rgba16f
+            3070:             TypePointer UniformConstant 3069
+3071(iCubeArray):   3070(ptr) Variable UniformConstant
+            3078:             TypeImage 6(float16_t) 2D multi-sampled nonsampled format:Rgba16f
+            3079:             TypePointer UniformConstant 3078
+     3080(i2DMS):   3079(ptr) Variable UniformConstant
+            3087:             TypeImage 6(float16_t) 2D array multi-sampled nonsampled format:Rgba16f
+            3088:             TypePointer UniformConstant 3087
+3089(i2DMSArray):   3088(ptr) Variable UniformConstant
+   3146(ResType):             TypeStruct 47(int) 7(f16vec4)
+   3182(ResType):             TypeStruct 47(int) 6(float16_t)
+            4069:  721(ivec2) ConstantComposite 709 1326
+            4070:     47(int) Constant 3
+            4071:     47(int) Constant 4
+            4072:  721(ivec2) ConstantComposite 4070 4071
+            4073:     47(int) Constant 15
+            4074:     47(int) Constant 16
+            4075:  721(ivec2) ConstantComposite 4073 4074
+            4076:     47(int) Constant 4294967294
+            4077:  721(ivec2) ConstantComposite 4076 2187
+            4078:        2379 ConstantComposite 4069 4072 4075 4077
+  4311(lodClamp):    127(ptr) Variable Input
+4318(f16lodClamp):    134(ptr) Variable Input
+            5507:             TypePointer UniformConstant 122
+       5508(t1D):   5507(ptr) Variable UniformConstant
+            5510:             TypeSampler
+            5511:             TypePointer UniformConstant 5510
+         5512(s):   5511(ptr) Variable UniformConstant
+            5527:             TypePointer UniformConstant 142
+       5528(t2D):   5527(ptr) Variable UniformConstant
+            5544:             TypePointer UniformConstant 162
+       5545(t3D):   5544(ptr) Variable UniformConstant
+            5561:             TypePointer UniformConstant 183
+     5562(tCube):   5561(ptr) Variable UniformConstant
+   5579(sShadow):   5511(ptr) Variable UniformConstant
+            5642:             TypePointer UniformConstant 268
+  5643(t1DArray):   5642(ptr) Variable UniformConstant
+            5659:             TypePointer UniformConstant 283
+  5660(t2DArray):   5659(ptr) Variable UniformConstant
+            5676:             TypePointer UniformConstant 298
+5677(tCubeArray):   5676(ptr) Variable UniformConstant
+            5734:             TypePointer UniformConstant 356
+   5735(t2DRect):   5734(ptr) Variable UniformConstant
+            5793:             TypeImage 6(float16_t) SubpassData nonsampled format:Unknown
+            5794:             TypePointer UniformConstant 5793
+   5795(subpass):   5794(ptr) Variable UniformConstant
+            5797:  721(ivec2) ConstantComposite 2187 2187
+            5799:             TypeImage 6(float16_t) SubpassData multi-sampled nonsampled format:Unknown
+            5800:             TypePointer UniformConstant 5799
+ 5801(subpassMS):   5800(ptr) Variable UniformConstant
+            5968:             TypePointer Output 249(fvec4)
+ 5969(fragColor):   5968(ptr) Variable Output
+            5972:             TypePointer UniformConstant 1297
+   5973(tBuffer):   5972(ptr) Variable UniformConstant
+            5974:             TypePointer UniformConstant 1308
+     5975(t2DMS):   5974(ptr) Variable UniformConstant
+            5976:             TypePointer UniformConstant 1319
+5977(t2DMSArray):   5976(ptr) Variable UniformConstant
+      5978(bias):    127(ptr) Variable Input
          4(main):           2 Function None 3
                5:             Label
-    5763(result):     64(ptr) Variable Function
-     5844(param):     64(ptr) Variable Function
-                              Store 5763(result) 121
-            5764:  7(f16vec4) FunctionCall 9(testTexture()
-            5765:  7(f16vec4) Load 5763(result)
-            5766:  7(f16vec4) FAdd 5765 5764
-                              Store 5763(result) 5766
-            5767:  7(f16vec4) FunctionCall 11(testTextureProj()
-            5768:  7(f16vec4) Load 5763(result)
-            5769:  7(f16vec4) FAdd 5768 5767
-                              Store 5763(result) 5769
-            5770:  7(f16vec4) FunctionCall 13(testTextureLod()
-            5771:  7(f16vec4) Load 5763(result)
-            5772:  7(f16vec4) FAdd 5771 5770
-                              Store 5763(result) 5772
-            5773:  7(f16vec4) FunctionCall 15(testTextureOffset()
-            5774:  7(f16vec4) Load 5763(result)
-            5775:  7(f16vec4) FAdd 5774 5773
-                              Store 5763(result) 5775
-            5776:  7(f16vec4) FunctionCall 19(testTextureLodOffset()
-            5777:  7(f16vec4) Load 5763(result)
-            5778:  7(f16vec4) FAdd 5777 5776
-                              Store 5763(result) 5778
-            5779:  7(f16vec4) FunctionCall 21(testTextureProjLodOffset()
-            5780:  7(f16vec4) Load 5763(result)
-            5781:  7(f16vec4) FAdd 5780 5779
-                              Store 5763(result) 5781
-            5782:  7(f16vec4) FunctionCall 23(testTexelFetch()
-            5783:  7(f16vec4) Load 5763(result)
-            5784:  7(f16vec4) FAdd 5783 5782
-                              Store 5763(result) 5784
-            5785:  7(f16vec4) FunctionCall 25(testTexelFetchOffset()
-            5786:  7(f16vec4) Load 5763(result)
-            5787:  7(f16vec4) FAdd 5786 5785
-                              Store 5763(result) 5787
-            5788:  7(f16vec4) FunctionCall 27(testTextureGrad()
-            5789:  7(f16vec4) Load 5763(result)
-            5790:  7(f16vec4) FAdd 5789 5788
-                              Store 5763(result) 5790
-            5791:  7(f16vec4) FunctionCall 29(testTextureGradOffset()
-            5792:  7(f16vec4) Load 5763(result)
-            5793:  7(f16vec4) FAdd 5792 5791
-                              Store 5763(result) 5793
-            5794:  7(f16vec4) FunctionCall 31(testTextureProjGrad()
-            5795:  7(f16vec4) Load 5763(result)
-            5796:  7(f16vec4) FAdd 5795 5794
-                              Store 5763(result) 5796
-            5797:  7(f16vec4) FunctionCall 33(testTextureProjGradoffset()
-            5798:  7(f16vec4) Load 5763(result)
-            5799:  7(f16vec4) FAdd 5798 5797
-                              Store 5763(result) 5799
-            5800:  7(f16vec4) FunctionCall 35(testTextureGather()
-            5801:  7(f16vec4) Load 5763(result)
-            5802:  7(f16vec4) FAdd 5801 5800
-                              Store 5763(result) 5802
-            5803:  7(f16vec4) FunctionCall 37(testTextureGatherOffset()
-            5804:  7(f16vec4) Load 5763(result)
-            5805:  7(f16vec4) FAdd 5804 5803
-                              Store 5763(result) 5805
-            5806:  7(f16vec4) FunctionCall 39(testTextureGatherOffsets()
-            5807:  7(f16vec4) Load 5763(result)
-            5808:  7(f16vec4) FAdd 5807 5806
-                              Store 5763(result) 5808
-            5809:  7(f16vec4) FunctionCall 41(testTextureGatherLod()
-            5810:  7(f16vec4) Load 5763(result)
-            5811:  7(f16vec4) FAdd 5810 5809
-                              Store 5763(result) 5811
-            5812:  7(f16vec4) FunctionCall 43(testTextureGatherLodOffset()
-            5813:  7(f16vec4) Load 5763(result)
-            5814:  7(f16vec4) FAdd 5813 5812
-                              Store 5763(result) 5814
-            5815:  7(f16vec4) FunctionCall 45(testTextureGatherLodOffsets()
-            5816:  7(f16vec4) Load 5763(result)
-            5817:  7(f16vec4) FAdd 5816 5815
-                              Store 5763(result) 5817
-            5818:   48(ivec4) FunctionCall 50(testTextureSize()
-            5819:  7(f16vec4) ConvertSToF 5818
-            5820:  7(f16vec4) Load 5763(result)
-            5821:  7(f16vec4) FAdd 5820 5819
-                              Store 5763(result) 5821
-            5822:   53(fvec2) FunctionCall 55(testTextureQueryLod()
-            5823:154(f16vec2) FConvert 5822
-            5824:  7(f16vec4) Load 5763(result)
-            5825:154(f16vec2) VectorShuffle 5824 5824 0 1
-            5826:154(f16vec2) FAdd 5825 5823
-            5827:  7(f16vec4) Load 5763(result)
-            5828:  7(f16vec4) VectorShuffle 5827 5826 4 5 2 3
-                              Store 5763(result) 5828
-            5829:     47(int) FunctionCall 58(testTextureQueryLevels()
-            5830:6(float16_t) ConvertSToF 5829
-            5831:    208(ptr) AccessChain 5763(result) 207
-            5832:6(float16_t) Load 5831
-            5833:6(float16_t) FAdd 5832 5830
-            5834:    208(ptr) AccessChain 5763(result) 207
-                              Store 5834 5833
-            5835:     47(int) FunctionCall 60(testTextureSamples()
-            5836:6(float16_t) ConvertSToF 5835
-            5837:    208(ptr) AccessChain 5763(result) 207
-            5838:6(float16_t) Load 5837
-            5839:6(float16_t) FAdd 5838 5836
-            5840:    208(ptr) AccessChain 5763(result) 207
-                              Store 5840 5839
-            5841:  7(f16vec4) FunctionCall 62(testImageLoad()
-            5842:  7(f16vec4) Load 5763(result)
+    5807(result):     64(ptr) Variable Function
+     5890(param):     64(ptr) Variable Function
+                              Store 5807(result) 121
+            5808:  7(f16vec4) FunctionCall 9(testTexture()
+            5809:  7(f16vec4) Load 5807(result)
+            5810:  7(f16vec4) FAdd 5809 5808
+                              Store 5807(result) 5810
+            5811:  7(f16vec4) FunctionCall 11(testTextureProj()
+            5812:  7(f16vec4) Load 5807(result)
+            5813:  7(f16vec4) FAdd 5812 5811
+                              Store 5807(result) 5813
+            5814:  7(f16vec4) FunctionCall 13(testTextureLod()
+            5815:  7(f16vec4) Load 5807(result)
+            5816:  7(f16vec4) FAdd 5815 5814
+                              Store 5807(result) 5816
+            5817:  7(f16vec4) FunctionCall 15(testTextureOffset()
+            5818:  7(f16vec4) Load 5807(result)
+            5819:  7(f16vec4) FAdd 5818 5817
+                              Store 5807(result) 5819
+            5820:  7(f16vec4) FunctionCall 19(testTextureLodOffset()
+            5821:  7(f16vec4) Load 5807(result)
+            5822:  7(f16vec4) FAdd 5821 5820
+                              Store 5807(result) 5822
+            5823:  7(f16vec4) FunctionCall 21(testTextureProjLodOffset()
+            5824:  7(f16vec4) Load 5807(result)
+            5825:  7(f16vec4) FAdd 5824 5823
+                              Store 5807(result) 5825
+            5826:  7(f16vec4) FunctionCall 23(testTexelFetch()
+            5827:  7(f16vec4) Load 5807(result)
+            5828:  7(f16vec4) FAdd 5827 5826
+                              Store 5807(result) 5828
+            5829:  7(f16vec4) FunctionCall 25(testTexelFetchOffset()
+            5830:  7(f16vec4) Load 5807(result)
+            5831:  7(f16vec4) FAdd 5830 5829
+                              Store 5807(result) 5831
+            5832:  7(f16vec4) FunctionCall 27(testTextureGrad()
+            5833:  7(f16vec4) Load 5807(result)
+            5834:  7(f16vec4) FAdd 5833 5832
+                              Store 5807(result) 5834
+            5835:  7(f16vec4) FunctionCall 29(testTextureGradOffset()
+            5836:  7(f16vec4) Load 5807(result)
+            5837:  7(f16vec4) FAdd 5836 5835
+                              Store 5807(result) 5837
+            5838:  7(f16vec4) FunctionCall 31(testTextureProjGrad()
+            5839:  7(f16vec4) Load 5807(result)
+            5840:  7(f16vec4) FAdd 5839 5838
+                              Store 5807(result) 5840
+            5841:  7(f16vec4) FunctionCall 33(testTextureProjGradoffset()
+            5842:  7(f16vec4) Load 5807(result)
             5843:  7(f16vec4) FAdd 5842 5841
-                              Store 5763(result) 5843
-            5845:  7(f16vec4) Load 5763(result)
-                              Store 5844(param) 5845
-            5846:           2 FunctionCall 67(testImageStore(vf164;) 5844(param)
-            5847:  7(f16vec4) FunctionCall 69(testSparseTexture()
-            5848:  7(f16vec4) Load 5763(result)
+                              Store 5807(result) 5843
+            5844:  7(f16vec4) FunctionCall 35(testTextureGather()
+            5845:  7(f16vec4) Load 5807(result)
+            5846:  7(f16vec4) FAdd 5845 5844
+                              Store 5807(result) 5846
+            5847:  7(f16vec4) FunctionCall 37(testTextureGatherOffset()
+            5848:  7(f16vec4) Load 5807(result)
             5849:  7(f16vec4) FAdd 5848 5847
-                              Store 5763(result) 5849
-            5850:  7(f16vec4) FunctionCall 71(testSparseTextureLod()
-            5851:  7(f16vec4) Load 5763(result)
+                              Store 5807(result) 5849
+            5850:  7(f16vec4) FunctionCall 39(testTextureGatherOffsets()
+            5851:  7(f16vec4) Load 5807(result)
             5852:  7(f16vec4) FAdd 5851 5850
-                              Store 5763(result) 5852
-            5853:  7(f16vec4) FunctionCall 73(testSparseTextureOffset()
-            5854:  7(f16vec4) Load 5763(result)
+                              Store 5807(result) 5852
+            5853:  7(f16vec4) FunctionCall 41(testTextureGatherLod()
+            5854:  7(f16vec4) Load 5807(result)
             5855:  7(f16vec4) FAdd 5854 5853
-                              Store 5763(result) 5855
-            5856:  7(f16vec4) FunctionCall 75(testSparseTextureLodOffset()
-            5857:  7(f16vec4) Load 5763(result)
+                              Store 5807(result) 5855
+            5856:  7(f16vec4) FunctionCall 43(testTextureGatherLodOffset()
+            5857:  7(f16vec4) Load 5807(result)
             5858:  7(f16vec4) FAdd 5857 5856
-                              Store 5763(result) 5858
-            5859:  7(f16vec4) FunctionCall 77(testSparseTextureGrad()
-            5860:  7(f16vec4) Load 5763(result)
+                              Store 5807(result) 5858
+            5859:  7(f16vec4) FunctionCall 45(testTextureGatherLodOffsets()
+            5860:  7(f16vec4) Load 5807(result)
             5861:  7(f16vec4) FAdd 5860 5859
-                              Store 5763(result) 5861
-            5862:  7(f16vec4) FunctionCall 79(testSparseTextureGradOffset()
-            5863:  7(f16vec4) Load 5763(result)
-            5864:  7(f16vec4) FAdd 5863 5862
-                              Store 5763(result) 5864
-            5865:  7(f16vec4) FunctionCall 81(testSparseTexelFetch()
-            5866:  7(f16vec4) Load 5763(result)
-            5867:  7(f16vec4) FAdd 5866 5865
-                              Store 5763(result) 5867
-            5868:  7(f16vec4) FunctionCall 83(testSparseTexelFetchOffset()
-            5869:  7(f16vec4) Load 5763(result)
-            5870:  7(f16vec4) FAdd 5869 5868
-                              Store 5763(result) 5870
-            5871:  7(f16vec4) FunctionCall 85(testSparseTextureGather()
-            5872:  7(f16vec4) Load 5763(result)
-            5873:  7(f16vec4) FAdd 5872 5871
-                              Store 5763(result) 5873
-            5874:  7(f16vec4) FunctionCall 87(testSparseTextureGatherOffset()
-            5875:  7(f16vec4) Load 5763(result)
-            5876:  7(f16vec4) FAdd 5875 5874
-                              Store 5763(result) 5876
-            5877:  7(f16vec4) FunctionCall 89(testSparseTextureGatherOffsets()
-            5878:  7(f16vec4) Load 5763(result)
-            5879:  7(f16vec4) FAdd 5878 5877
-                              Store 5763(result) 5879
-            5880:  7(f16vec4) FunctionCall 91(testSparseTextureGatherLod()
-            5881:  7(f16vec4) Load 5763(result)
-            5882:  7(f16vec4) FAdd 5881 5880
-                              Store 5763(result) 5882
-            5883:  7(f16vec4) FunctionCall 93(testSparseTextureGatherLodOffset()
-            5884:  7(f16vec4) Load 5763(result)
-            5885:  7(f16vec4) FAdd 5884 5883
-                              Store 5763(result) 5885
-            5886:  7(f16vec4) FunctionCall 95(testSparseTextureGatherLodOffsets()
-            5887:  7(f16vec4) Load 5763(result)
-            5888:  7(f16vec4) FAdd 5887 5886
-                              Store 5763(result) 5888
-            5889:  7(f16vec4) FunctionCall 97(testSparseImageLoad()
-            5890:  7(f16vec4) Load 5763(result)
-            5891:  7(f16vec4) FAdd 5890 5889
-                              Store 5763(result) 5891
-            5892:  7(f16vec4) FunctionCall 99(testSparseTextureClamp()
-            5893:  7(f16vec4) Load 5763(result)
-            5894:  7(f16vec4) FAdd 5893 5892
-                              Store 5763(result) 5894
-            5895:  7(f16vec4) FunctionCall 101(testTextureClamp()
-            5896:  7(f16vec4) Load 5763(result)
-            5897:  7(f16vec4) FAdd 5896 5895
-                              Store 5763(result) 5897
-            5898:  7(f16vec4) FunctionCall 103(testSparseTextureOffsetClamp()
-            5899:  7(f16vec4) Load 5763(result)
-            5900:  7(f16vec4) FAdd 5899 5898
-                              Store 5763(result) 5900
-            5901:  7(f16vec4) FunctionCall 105(testTextureOffsetClamp()
-            5902:  7(f16vec4) Load 5763(result)
-            5903:  7(f16vec4) FAdd 5902 5901
-                              Store 5763(result) 5903
-            5904:  7(f16vec4) FunctionCall 77(testSparseTextureGrad()
-            5905:  7(f16vec4) Load 5763(result)
-            5906:  7(f16vec4) FAdd 5905 5904
-                              Store 5763(result) 5906
-            5907:  7(f16vec4) FunctionCall 27(testTextureGrad()
-            5908:  7(f16vec4) Load 5763(result)
-            5909:  7(f16vec4) FAdd 5908 5907
-                              Store 5763(result) 5909
-            5910:  7(f16vec4) FunctionCall 111(testSparseTextureGradOffsetClamp()
-            5911:  7(f16vec4) Load 5763(result)
-            5912:  7(f16vec4) FAdd 5911 5910
-                              Store 5763(result) 5912
-            5913:  7(f16vec4) FunctionCall 113(testTextureGradOffsetClamp()
-            5914:  7(f16vec4) Load 5763(result)
-            5915:  7(f16vec4) FAdd 5914 5913
-                              Store 5763(result) 5915
-            5916:  7(f16vec4) FunctionCall 115(testCombinedTextureSampler()
-            5917:  7(f16vec4) Load 5763(result)
-            5918:  7(f16vec4) FAdd 5917 5916
-                              Store 5763(result) 5918
-            5919:  7(f16vec4) FunctionCall 117(testSubpassLoad()
-            5920:  7(f16vec4) Load 5763(result)
-            5921:  7(f16vec4) FAdd 5920 5919
-                              Store 5763(result) 5921
-            5924:  7(f16vec4) Load 5763(result)
-            5925:  249(fvec4) FConvert 5924
-                              Store 5923(fragColor) 5925
+                              Store 5807(result) 5861
+            5862:   48(ivec4) FunctionCall 50(testTextureSize()
+            5863:  7(f16vec4) ConvertSToF 5862
+            5864:  7(f16vec4) Load 5807(result)
+            5865:  7(f16vec4) FAdd 5864 5863
+                              Store 5807(result) 5865
+            5866:   53(fvec2) FunctionCall 55(testTextureQueryLod()
+            5867:154(f16vec2) FConvert 5866
+            5868:  7(f16vec4) Load 5807(result)
+            5869:154(f16vec2) VectorShuffle 5868 5868 0 1
+            5870:154(f16vec2) FAdd 5869 5867
+            5871:    208(ptr) AccessChain 5807(result) 207
+            5872:6(float16_t) CompositeExtract 5870 0
+                              Store 5871 5872
+            5873:    208(ptr) AccessChain 5807(result) 2581
+            5874:6(float16_t) CompositeExtract 5870 1
+                              Store 5873 5874
+            5875:     47(int) FunctionCall 58(testTextureQueryLevels()
+            5876:6(float16_t) ConvertSToF 5875
+            5877:    208(ptr) AccessChain 5807(result) 207
+            5878:6(float16_t) Load 5877
+            5879:6(float16_t) FAdd 5878 5876
+            5880:    208(ptr) AccessChain 5807(result) 207
+                              Store 5880 5879
+            5881:     47(int) FunctionCall 60(testTextureSamples()
+            5882:6(float16_t) ConvertSToF 5881
+            5883:    208(ptr) AccessChain 5807(result) 207
+            5884:6(float16_t) Load 5883
+            5885:6(float16_t) FAdd 5884 5882
+            5886:    208(ptr) AccessChain 5807(result) 207
+                              Store 5886 5885
+            5887:  7(f16vec4) FunctionCall 62(testImageLoad()
+            5888:  7(f16vec4) Load 5807(result)
+            5889:  7(f16vec4) FAdd 5888 5887
+                              Store 5807(result) 5889
+            5891:  7(f16vec4) Load 5807(result)
+                              Store 5890(param) 5891
+            5892:           2 FunctionCall 67(testImageStore(vf164;) 5890(param)
+            5893:  7(f16vec4) FunctionCall 69(testSparseTexture()
+            5894:  7(f16vec4) Load 5807(result)
+            5895:  7(f16vec4) FAdd 5894 5893
+                              Store 5807(result) 5895
+            5896:  7(f16vec4) FunctionCall 71(testSparseTextureLod()
+            5897:  7(f16vec4) Load 5807(result)
+            5898:  7(f16vec4) FAdd 5897 5896
+                              Store 5807(result) 5898
+            5899:  7(f16vec4) FunctionCall 73(testSparseTextureOffset()
+            5900:  7(f16vec4) Load 5807(result)
+            5901:  7(f16vec4) FAdd 5900 5899
+                              Store 5807(result) 5901
+            5902:  7(f16vec4) FunctionCall 75(testSparseTextureLodOffset()
+            5903:  7(f16vec4) Load 5807(result)
+            5904:  7(f16vec4) FAdd 5903 5902
+                              Store 5807(result) 5904
+            5905:  7(f16vec4) FunctionCall 77(testSparseTextureGrad()
+            5906:  7(f16vec4) Load 5807(result)
+            5907:  7(f16vec4) FAdd 5906 5905
+                              Store 5807(result) 5907
+            5908:  7(f16vec4) FunctionCall 79(testSparseTextureGradOffset()
+            5909:  7(f16vec4) Load 5807(result)
+            5910:  7(f16vec4) FAdd 5909 5908
+                              Store 5807(result) 5910
+            5911:  7(f16vec4) FunctionCall 81(testSparseTexelFetch()
+            5912:  7(f16vec4) Load 5807(result)
+            5913:  7(f16vec4) FAdd 5912 5911
+                              Store 5807(result) 5913
+            5914:  7(f16vec4) FunctionCall 83(testSparseTexelFetchOffset()
+            5915:  7(f16vec4) Load 5807(result)
+            5916:  7(f16vec4) FAdd 5915 5914
+                              Store 5807(result) 5916
+            5917:  7(f16vec4) FunctionCall 85(testSparseTextureGather()
+            5918:  7(f16vec4) Load 5807(result)
+            5919:  7(f16vec4) FAdd 5918 5917
+                              Store 5807(result) 5919
+            5920:  7(f16vec4) FunctionCall 87(testSparseTextureGatherOffset()
+            5921:  7(f16vec4) Load 5807(result)
+            5922:  7(f16vec4) FAdd 5921 5920
+                              Store 5807(result) 5922
+            5923:  7(f16vec4) FunctionCall 89(testSparseTextureGatherOffsets()
+            5924:  7(f16vec4) Load 5807(result)
+            5925:  7(f16vec4) FAdd 5924 5923
+                              Store 5807(result) 5925
+            5926:  7(f16vec4) FunctionCall 91(testSparseTextureGatherLod()
+            5927:  7(f16vec4) Load 5807(result)
+            5928:  7(f16vec4) FAdd 5927 5926
+                              Store 5807(result) 5928
+            5929:  7(f16vec4) FunctionCall 93(testSparseTextureGatherLodOffset()
+            5930:  7(f16vec4) Load 5807(result)
+            5931:  7(f16vec4) FAdd 5930 5929
+                              Store 5807(result) 5931
+            5932:  7(f16vec4) FunctionCall 95(testSparseTextureGatherLodOffsets()
+            5933:  7(f16vec4) Load 5807(result)
+            5934:  7(f16vec4) FAdd 5933 5932
+                              Store 5807(result) 5934
+            5935:  7(f16vec4) FunctionCall 97(testSparseImageLoad()
+            5936:  7(f16vec4) Load 5807(result)
+            5937:  7(f16vec4) FAdd 5936 5935
+                              Store 5807(result) 5937
+            5938:  7(f16vec4) FunctionCall 99(testSparseTextureClamp()
+            5939:  7(f16vec4) Load 5807(result)
+            5940:  7(f16vec4) FAdd 5939 5938
+                              Store 5807(result) 5940
+            5941:  7(f16vec4) FunctionCall 101(testTextureClamp()
+            5942:  7(f16vec4) Load 5807(result)
+            5943:  7(f16vec4) FAdd 5942 5941
+                              Store 5807(result) 5943
+            5944:  7(f16vec4) FunctionCall 103(testSparseTextureOffsetClamp()
+            5945:  7(f16vec4) Load 5807(result)
+            5946:  7(f16vec4) FAdd 5945 5944
+                              Store 5807(result) 5946
+            5947:  7(f16vec4) FunctionCall 105(testTextureOffsetClamp()
+            5948:  7(f16vec4) Load 5807(result)
+            5949:  7(f16vec4) FAdd 5948 5947
+                              Store 5807(result) 5949
+            5950:  7(f16vec4) FunctionCall 77(testSparseTextureGrad()
+            5951:  7(f16vec4) Load 5807(result)
+            5952:  7(f16vec4) FAdd 5951 5950
+                              Store 5807(result) 5952
+            5953:  7(f16vec4) FunctionCall 27(testTextureGrad()
+            5954:  7(f16vec4) Load 5807(result)
+            5955:  7(f16vec4) FAdd 5954 5953
+                              Store 5807(result) 5955
+            5956:  7(f16vec4) FunctionCall 111(testSparseTextureGradOffsetClamp()
+            5957:  7(f16vec4) Load 5807(result)
+            5958:  7(f16vec4) FAdd 5957 5956
+                              Store 5807(result) 5958
+            5959:  7(f16vec4) FunctionCall 113(testTextureGradOffsetClamp()
+            5960:  7(f16vec4) Load 5807(result)
+            5961:  7(f16vec4) FAdd 5960 5959
+                              Store 5807(result) 5961
+            5962:  7(f16vec4) FunctionCall 115(testCombinedTextureSampler()
+            5963:  7(f16vec4) Load 5807(result)
+            5964:  7(f16vec4) FAdd 5963 5962
+                              Store 5807(result) 5964
+            5965:  7(f16vec4) FunctionCall 117(testSubpassLoad()
+            5966:  7(f16vec4) Load 5807(result)
+            5967:  7(f16vec4) FAdd 5966 5965
+                              Store 5807(result) 5967
+            5970:  7(f16vec4) Load 5807(result)
+            5971:  249(fvec4) FConvert 5970
+                              Store 5969(fragColor) 5971
                               Return
                               FunctionEnd
  9(testTexture():  7(f16vec4) Function None 8
@@ -3463,3619 +3468,3682 @@
             2576:   48(ivec4) Load 2559(size)
             2577:  721(ivec2) VectorShuffle 2576 2576 0 1
             2578:  721(ivec2) IAdd 2577 2575
-            2579:   48(ivec4) Load 2559(size)
-            2580:   48(ivec4) VectorShuffle 2579 2578 4 5 2 3
-                              Store 2559(size) 2580
-            2581:         163 Load 165(s3D)
-            2582:   52(float) Load 565(lod)
-            2583:     47(int) ConvertFToS 2582
-            2584:         162 Image 2581
-            2585:  734(ivec3) ImageQuerySizeLod 2584 2583
-            2586:   48(ivec4) Load 2559(size)
-            2587:  734(ivec3) VectorShuffle 2586 2586 0 1 2
-            2588:  734(ivec3) IAdd 2587 2585
+            2579:   2566(ptr) AccessChain 2559(size) 207
+            2580:     47(int) CompositeExtract 2578 0
+                              Store 2579 2580
+            2582:   2566(ptr) AccessChain 2559(size) 2581
+            2583:     47(int) CompositeExtract 2578 1
+                              Store 2582 2583
+            2584:         163 Load 165(s3D)
+            2585:   52(float) Load 565(lod)
+            2586:     47(int) ConvertFToS 2585
+            2587:         162 Image 2584
+            2588:  734(ivec3) ImageQuerySizeLod 2587 2586
             2589:   48(ivec4) Load 2559(size)
-            2590:   48(ivec4) VectorShuffle 2589 2588 4 5 6 3
-                              Store 2559(size) 2590
-            2591:         184 Load 186(sCube)
-            2592:   52(float) Load 565(lod)
-            2593:     47(int) ConvertFToS 2592
-            2594:         183 Image 2591
-            2595:  721(ivec2) ImageQuerySizeLod 2594 2593
-            2596:   48(ivec4) Load 2559(size)
-            2597:  721(ivec2) VectorShuffle 2596 2596 0 1
-            2598:  721(ivec2) IAdd 2597 2595
-            2599:   48(ivec4) Load 2559(size)
-            2600:   48(ivec4) VectorShuffle 2599 2598 4 5 2 3
-                              Store 2559(size) 2600
-            2601:         199 Load 201(s1DShadow)
-            2602:   52(float) Load 565(lod)
-            2603:     47(int) ConvertFToS 2602
-            2604:         198 Image 2601
-            2605:     47(int) ImageQuerySizeLod 2604 2603
-            2606:   2566(ptr) AccessChain 2559(size) 207
-            2607:     47(int) Load 2606
-            2608:     47(int) IAdd 2607 2605
-            2609:   2566(ptr) AccessChain 2559(size) 207
-                              Store 2609 2608
-            2610:         224 Load 226(s2DShadow)
-            2611:   52(float) Load 565(lod)
-            2612:     47(int) ConvertFToS 2611
-            2613:         223 Image 2610
-            2614:  721(ivec2) ImageQuerySizeLod 2613 2612
-            2615:   48(ivec4) Load 2559(size)
-            2616:  721(ivec2) VectorShuffle 2615 2615 0 1
-            2617:  721(ivec2) IAdd 2616 2614
-            2618:   48(ivec4) Load 2559(size)
-            2619:   48(ivec4) VectorShuffle 2618 2617 4 5 2 3
-                              Store 2559(size) 2619
-            2620:         245 Load 247(sCubeShadow)
+            2590:  734(ivec3) VectorShuffle 2589 2589 0 1 2
+            2591:  734(ivec3) IAdd 2590 2588
+            2592:   2566(ptr) AccessChain 2559(size) 207
+            2593:     47(int) CompositeExtract 2591 0
+                              Store 2592 2593
+            2594:   2566(ptr) AccessChain 2559(size) 2581
+            2595:     47(int) CompositeExtract 2591 1
+                              Store 2594 2595
+            2597:   2566(ptr) AccessChain 2559(size) 2596
+            2598:     47(int) CompositeExtract 2591 2
+                              Store 2597 2598
+            2599:         184 Load 186(sCube)
+            2600:   52(float) Load 565(lod)
+            2601:     47(int) ConvertFToS 2600
+            2602:         183 Image 2599
+            2603:  721(ivec2) ImageQuerySizeLod 2602 2601
+            2604:   48(ivec4) Load 2559(size)
+            2605:  721(ivec2) VectorShuffle 2604 2604 0 1
+            2606:  721(ivec2) IAdd 2605 2603
+            2607:   2566(ptr) AccessChain 2559(size) 207
+            2608:     47(int) CompositeExtract 2606 0
+                              Store 2607 2608
+            2609:   2566(ptr) AccessChain 2559(size) 2581
+            2610:     47(int) CompositeExtract 2606 1
+                              Store 2609 2610
+            2611:         199 Load 201(s1DShadow)
+            2612:   52(float) Load 565(lod)
+            2613:     47(int) ConvertFToS 2612
+            2614:         198 Image 2611
+            2615:     47(int) ImageQuerySizeLod 2614 2613
+            2616:   2566(ptr) AccessChain 2559(size) 207
+            2617:     47(int) Load 2616
+            2618:     47(int) IAdd 2617 2615
+            2619:   2566(ptr) AccessChain 2559(size) 207
+                              Store 2619 2618
+            2620:         224 Load 226(s2DShadow)
             2621:   52(float) Load 565(lod)
             2622:     47(int) ConvertFToS 2621
-            2623:         244 Image 2620
+            2623:         223 Image 2620
             2624:  721(ivec2) ImageQuerySizeLod 2623 2622
             2625:   48(ivec4) Load 2559(size)
             2626:  721(ivec2) VectorShuffle 2625 2625 0 1
             2627:  721(ivec2) IAdd 2626 2624
-            2628:   48(ivec4) Load 2559(size)
-            2629:   48(ivec4) VectorShuffle 2628 2627 4 5 2 3
-                              Store 2559(size) 2629
-            2630:         299 Load 301(sCubeArray)
-            2631:   52(float) Load 565(lod)
-            2632:     47(int) ConvertFToS 2631
-            2633:         298 Image 2630
-            2634:  734(ivec3) ImageQuerySizeLod 2633 2632
-            2635:   48(ivec4) Load 2559(size)
-            2636:  734(ivec3) VectorShuffle 2635 2635 0 1 2
-            2637:  734(ivec3) IAdd 2636 2634
-            2638:   48(ivec4) Load 2559(size)
-            2639:   48(ivec4) VectorShuffle 2638 2637 4 5 6 3
-                              Store 2559(size) 2639
-            2640:         391 Load 393(sCubeArrayShadow)
-            2641:   52(float) Load 565(lod)
-            2642:     47(int) ConvertFToS 2641
-            2643:         390 Image 2640
-            2644:  734(ivec3) ImageQuerySizeLod 2643 2642
-            2645:   48(ivec4) Load 2559(size)
-            2646:  734(ivec3) VectorShuffle 2645 2645 0 1 2
-            2647:  734(ivec3) IAdd 2646 2644
-            2648:   48(ivec4) Load 2559(size)
-            2649:   48(ivec4) VectorShuffle 2648 2647 4 5 6 3
-                              Store 2559(size) 2649
-            2650:         357 Load 359(s2DRect)
-            2651:         356 Image 2650
-            2652:  721(ivec2) ImageQuerySize 2651
-            2653:   48(ivec4) Load 2559(size)
-            2654:  721(ivec2) VectorShuffle 2653 2653 0 1
-            2655:  721(ivec2) IAdd 2654 2652
-            2656:   48(ivec4) Load 2559(size)
-            2657:   48(ivec4) VectorShuffle 2656 2655 4 5 2 3
-                              Store 2559(size) 2657
-            2658:         371 Load 373(s2DRectShadow)
-            2659:         370 Image 2658
-            2660:  721(ivec2) ImageQuerySize 2659
-            2661:   48(ivec4) Load 2559(size)
-            2662:  721(ivec2) VectorShuffle 2661 2661 0 1
-            2663:  721(ivec2) IAdd 2662 2660
-            2664:   48(ivec4) Load 2559(size)
-            2665:   48(ivec4) VectorShuffle 2664 2663 4 5 2 3
-                              Store 2559(size) 2665
-            2666:         269 Load 271(s1DArray)
-            2667:   52(float) Load 565(lod)
-            2668:     47(int) ConvertFToS 2667
-            2669:         268 Image 2666
-            2670:  721(ivec2) ImageQuerySizeLod 2669 2668
-            2671:   48(ivec4) Load 2559(size)
-            2672:  721(ivec2) VectorShuffle 2671 2671 0 1
-            2673:  721(ivec2) IAdd 2672 2670
-            2674:   48(ivec4) Load 2559(size)
-            2675:   48(ivec4) VectorShuffle 2674 2673 4 5 2 3
-                              Store 2559(size) 2675
-            2676:         284 Load 286(s2DArray)
-            2677:   52(float) Load 565(lod)
-            2678:     47(int) ConvertFToS 2677
-            2679:         283 Image 2676
-            2680:  734(ivec3) ImageQuerySizeLod 2679 2678
-            2681:   48(ivec4) Load 2559(size)
-            2682:  734(ivec3) VectorShuffle 2681 2681 0 1 2
-            2683:  734(ivec3) IAdd 2682 2680
-            2684:   48(ivec4) Load 2559(size)
-            2685:   48(ivec4) VectorShuffle 2684 2683 4 5 6 3
-                              Store 2559(size) 2685
-            2686:         316 Load 318(s1DArrayShadow)
-            2687:   52(float) Load 565(lod)
-            2688:     47(int) ConvertFToS 2687
-            2689:         315 Image 2686
-            2690:  721(ivec2) ImageQuerySizeLod 2689 2688
-            2691:   48(ivec4) Load 2559(size)
-            2692:  721(ivec2) VectorShuffle 2691 2691 0 1
-            2693:  721(ivec2) IAdd 2692 2690
-            2694:   48(ivec4) Load 2559(size)
-            2695:   48(ivec4) VectorShuffle 2694 2693 4 5 2 3
-                              Store 2559(size) 2695
-            2696:         337 Load 339(s2DArrayShadow)
-            2697:   52(float) Load 565(lod)
-            2698:     47(int) ConvertFToS 2697
-            2699:         336 Image 2696
-            2700:  734(ivec3) ImageQuerySizeLod 2699 2698
-            2701:   48(ivec4) Load 2559(size)
-            2702:  734(ivec3) VectorShuffle 2701 2701 0 1 2
-            2703:  734(ivec3) IAdd 2702 2700
-            2704:   48(ivec4) Load 2559(size)
-            2705:   48(ivec4) VectorShuffle 2704 2703 4 5 6 3
-                              Store 2559(size) 2705
-            2706:        1298 Load 1300(sBuffer)
-            2707:        1297 Image 2706
-            2708:     47(int) ImageQuerySize 2707
-            2709:   2566(ptr) AccessChain 2559(size) 207
-            2710:     47(int) Load 2709
-            2711:     47(int) IAdd 2710 2708
+            2628:   2566(ptr) AccessChain 2559(size) 207
+            2629:     47(int) CompositeExtract 2627 0
+                              Store 2628 2629
+            2630:   2566(ptr) AccessChain 2559(size) 2581
+            2631:     47(int) CompositeExtract 2627 1
+                              Store 2630 2631
+            2632:         245 Load 247(sCubeShadow)
+            2633:   52(float) Load 565(lod)
+            2634:     47(int) ConvertFToS 2633
+            2635:         244 Image 2632
+            2636:  721(ivec2) ImageQuerySizeLod 2635 2634
+            2637:   48(ivec4) Load 2559(size)
+            2638:  721(ivec2) VectorShuffle 2637 2637 0 1
+            2639:  721(ivec2) IAdd 2638 2636
+            2640:   2566(ptr) AccessChain 2559(size) 207
+            2641:     47(int) CompositeExtract 2639 0
+                              Store 2640 2641
+            2642:   2566(ptr) AccessChain 2559(size) 2581
+            2643:     47(int) CompositeExtract 2639 1
+                              Store 2642 2643
+            2644:         299 Load 301(sCubeArray)
+            2645:   52(float) Load 565(lod)
+            2646:     47(int) ConvertFToS 2645
+            2647:         298 Image 2644
+            2648:  734(ivec3) ImageQuerySizeLod 2647 2646
+            2649:   48(ivec4) Load 2559(size)
+            2650:  734(ivec3) VectorShuffle 2649 2649 0 1 2
+            2651:  734(ivec3) IAdd 2650 2648
+            2652:   2566(ptr) AccessChain 2559(size) 207
+            2653:     47(int) CompositeExtract 2651 0
+                              Store 2652 2653
+            2654:   2566(ptr) AccessChain 2559(size) 2581
+            2655:     47(int) CompositeExtract 2651 1
+                              Store 2654 2655
+            2656:   2566(ptr) AccessChain 2559(size) 2596
+            2657:     47(int) CompositeExtract 2651 2
+                              Store 2656 2657
+            2658:         391 Load 393(sCubeArrayShadow)
+            2659:   52(float) Load 565(lod)
+            2660:     47(int) ConvertFToS 2659
+            2661:         390 Image 2658
+            2662:  734(ivec3) ImageQuerySizeLod 2661 2660
+            2663:   48(ivec4) Load 2559(size)
+            2664:  734(ivec3) VectorShuffle 2663 2663 0 1 2
+            2665:  734(ivec3) IAdd 2664 2662
+            2666:   2566(ptr) AccessChain 2559(size) 207
+            2667:     47(int) CompositeExtract 2665 0
+                              Store 2666 2667
+            2668:   2566(ptr) AccessChain 2559(size) 2581
+            2669:     47(int) CompositeExtract 2665 1
+                              Store 2668 2669
+            2670:   2566(ptr) AccessChain 2559(size) 2596
+            2671:     47(int) CompositeExtract 2665 2
+                              Store 2670 2671
+            2672:         357 Load 359(s2DRect)
+            2673:         356 Image 2672
+            2674:  721(ivec2) ImageQuerySize 2673
+            2675:   48(ivec4) Load 2559(size)
+            2676:  721(ivec2) VectorShuffle 2675 2675 0 1
+            2677:  721(ivec2) IAdd 2676 2674
+            2678:   2566(ptr) AccessChain 2559(size) 207
+            2679:     47(int) CompositeExtract 2677 0
+                              Store 2678 2679
+            2680:   2566(ptr) AccessChain 2559(size) 2581
+            2681:     47(int) CompositeExtract 2677 1
+                              Store 2680 2681
+            2682:         371 Load 373(s2DRectShadow)
+            2683:         370 Image 2682
+            2684:  721(ivec2) ImageQuerySize 2683
+            2685:   48(ivec4) Load 2559(size)
+            2686:  721(ivec2) VectorShuffle 2685 2685 0 1
+            2687:  721(ivec2) IAdd 2686 2684
+            2688:   2566(ptr) AccessChain 2559(size) 207
+            2689:     47(int) CompositeExtract 2687 0
+                              Store 2688 2689
+            2690:   2566(ptr) AccessChain 2559(size) 2581
+            2691:     47(int) CompositeExtract 2687 1
+                              Store 2690 2691
+            2692:         269 Load 271(s1DArray)
+            2693:   52(float) Load 565(lod)
+            2694:     47(int) ConvertFToS 2693
+            2695:         268 Image 2692
+            2696:  721(ivec2) ImageQuerySizeLod 2695 2694
+            2697:   48(ivec4) Load 2559(size)
+            2698:  721(ivec2) VectorShuffle 2697 2697 0 1
+            2699:  721(ivec2) IAdd 2698 2696
+            2700:   2566(ptr) AccessChain 2559(size) 207
+            2701:     47(int) CompositeExtract 2699 0
+                              Store 2700 2701
+            2702:   2566(ptr) AccessChain 2559(size) 2581
+            2703:     47(int) CompositeExtract 2699 1
+                              Store 2702 2703
+            2704:         284 Load 286(s2DArray)
+            2705:   52(float) Load 565(lod)
+            2706:     47(int) ConvertFToS 2705
+            2707:         283 Image 2704
+            2708:  734(ivec3) ImageQuerySizeLod 2707 2706
+            2709:   48(ivec4) Load 2559(size)
+            2710:  734(ivec3) VectorShuffle 2709 2709 0 1 2
+            2711:  734(ivec3) IAdd 2710 2708
             2712:   2566(ptr) AccessChain 2559(size) 207
-                              Store 2712 2711
-            2713:        1309 Load 1311(s2DMS)
-            2714:        1308 Image 2713
-            2715:  721(ivec2) ImageQuerySize 2714
-            2716:   48(ivec4) Load 2559(size)
-            2717:  721(ivec2) VectorShuffle 2716 2716 0 1
-            2718:  721(ivec2) IAdd 2717 2715
-            2719:   48(ivec4) Load 2559(size)
-            2720:   48(ivec4) VectorShuffle 2719 2718 4 5 2 3
-                              Store 2559(size) 2720
-            2721:        1320 Load 1322(s2DMSArray)
-            2722:        1319 Image 2721
-            2723:  734(ivec3) ImageQuerySize 2722
-            2724:   48(ivec4) Load 2559(size)
-            2725:  734(ivec3) VectorShuffle 2724 2724 0 1 2
-            2726:  734(ivec3) IAdd 2725 2723
-            2727:   48(ivec4) Load 2559(size)
-            2728:   48(ivec4) VectorShuffle 2727 2726 4 5 6 3
-                              Store 2559(size) 2728
-            2729:   48(ivec4) Load 2559(size)
-                              ReturnValue 2729
+            2713:     47(int) CompositeExtract 2711 0
+                              Store 2712 2713
+            2714:   2566(ptr) AccessChain 2559(size) 2581
+            2715:     47(int) CompositeExtract 2711 1
+                              Store 2714 2715
+            2716:   2566(ptr) AccessChain 2559(size) 2596
+            2717:     47(int) CompositeExtract 2711 2
+                              Store 2716 2717
+            2718:         316 Load 318(s1DArrayShadow)
+            2719:   52(float) Load 565(lod)
+            2720:     47(int) ConvertFToS 2719
+            2721:         315 Image 2718
+            2722:  721(ivec2) ImageQuerySizeLod 2721 2720
+            2723:   48(ivec4) Load 2559(size)
+            2724:  721(ivec2) VectorShuffle 2723 2723 0 1
+            2725:  721(ivec2) IAdd 2724 2722
+            2726:   2566(ptr) AccessChain 2559(size) 207
+            2727:     47(int) CompositeExtract 2725 0
+                              Store 2726 2727
+            2728:   2566(ptr) AccessChain 2559(size) 2581
+            2729:     47(int) CompositeExtract 2725 1
+                              Store 2728 2729
+            2730:         337 Load 339(s2DArrayShadow)
+            2731:   52(float) Load 565(lod)
+            2732:     47(int) ConvertFToS 2731
+            2733:         336 Image 2730
+            2734:  734(ivec3) ImageQuerySizeLod 2733 2732
+            2735:   48(ivec4) Load 2559(size)
+            2736:  734(ivec3) VectorShuffle 2735 2735 0 1 2
+            2737:  734(ivec3) IAdd 2736 2734
+            2738:   2566(ptr) AccessChain 2559(size) 207
+            2739:     47(int) CompositeExtract 2737 0
+                              Store 2738 2739
+            2740:   2566(ptr) AccessChain 2559(size) 2581
+            2741:     47(int) CompositeExtract 2737 1
+                              Store 2740 2741
+            2742:   2566(ptr) AccessChain 2559(size) 2596
+            2743:     47(int) CompositeExtract 2737 2
+                              Store 2742 2743
+            2744:        1298 Load 1300(sBuffer)
+            2745:        1297 Image 2744
+            2746:     47(int) ImageQuerySize 2745
+            2747:   2566(ptr) AccessChain 2559(size) 207
+            2748:     47(int) Load 2747
+            2749:     47(int) IAdd 2748 2746
+            2750:   2566(ptr) AccessChain 2559(size) 207
+                              Store 2750 2749
+            2751:        1309 Load 1311(s2DMS)
+            2752:        1308 Image 2751
+            2753:  721(ivec2) ImageQuerySize 2752
+            2754:   48(ivec4) Load 2559(size)
+            2755:  721(ivec2) VectorShuffle 2754 2754 0 1
+            2756:  721(ivec2) IAdd 2755 2753
+            2757:   2566(ptr) AccessChain 2559(size) 207
+            2758:     47(int) CompositeExtract 2756 0
+                              Store 2757 2758
+            2759:   2566(ptr) AccessChain 2559(size) 2581
+            2760:     47(int) CompositeExtract 2756 1
+                              Store 2759 2760
+            2761:        1320 Load 1322(s2DMSArray)
+            2762:        1319 Image 2761
+            2763:  734(ivec3) ImageQuerySize 2762
+            2764:   48(ivec4) Load 2559(size)
+            2765:  734(ivec3) VectorShuffle 2764 2764 0 1 2
+            2766:  734(ivec3) IAdd 2765 2763
+            2767:   2566(ptr) AccessChain 2559(size) 207
+            2768:     47(int) CompositeExtract 2766 0
+                              Store 2767 2768
+            2769:   2566(ptr) AccessChain 2559(size) 2581
+            2770:     47(int) CompositeExtract 2766 1
+                              Store 2769 2770
+            2771:   2566(ptr) AccessChain 2559(size) 2596
+            2772:     47(int) CompositeExtract 2766 2
+                              Store 2771 2772
+            2773:   48(ivec4) Load 2559(size)
+                              ReturnValue 2773
                               FunctionEnd
 55(testTextureQueryLod():   53(fvec2) Function None 54
               56:             Label
-       2733(lod):   2732(ptr) Variable Function
-                              Store 2733(lod) 2735
-            2736:         123 Load 125(s1D)
-            2737:   52(float) Load 128(c1)
-            2738:   53(fvec2) ImageQueryLod 2736 2737
-            2739:   53(fvec2) Load 2733(lod)
-            2740:   53(fvec2) FAdd 2739 2738
-                              Store 2733(lod) 2740
-            2741:         123 Load 125(s1D)
-            2742:6(float16_t) Load 135(f16c1)
-            2743:154(f16vec2) ImageQueryLod 2741 2742
-            2744:   53(fvec2) Load 2733(lod)
-            2745:   53(fvec2) FAdd 2744 2743
-                              Store 2733(lod) 2745
-            2746:         143 Load 145(s2D)
-            2747:   53(fvec2) Load 148(c2)
-            2748:   53(fvec2) ImageQueryLod 2746 2747
-            2749:   53(fvec2) Load 2733(lod)
-            2750:   53(fvec2) FAdd 2749 2748
-                              Store 2733(lod) 2750
-            2751:         143 Load 145(s2D)
-            2752:154(f16vec2) Load 156(f16c2)
-            2753:154(f16vec2) ImageQueryLod 2751 2752
-            2754:   53(fvec2) Load 2733(lod)
-            2755:   53(fvec2) FAdd 2754 2753
-                              Store 2733(lod) 2755
-            2756:         163 Load 165(s3D)
-            2757:  167(fvec3) Load 169(c3)
-            2758:   53(fvec2) ImageQueryLod 2756 2757
-            2759:   53(fvec2) Load 2733(lod)
-            2760:   53(fvec2) FAdd 2759 2758
-                              Store 2733(lod) 2760
-            2761:         163 Load 165(s3D)
-            2762:175(f16vec3) Load 177(f16c3)
-            2763:154(f16vec2) ImageQueryLod 2761 2762
-            2764:   53(fvec2) Load 2733(lod)
-            2765:   53(fvec2) FAdd 2764 2763
-                              Store 2733(lod) 2765
-            2766:         184 Load 186(sCube)
-            2767:  167(fvec3) Load 169(c3)
-            2768:   53(fvec2) ImageQueryLod 2766 2767
-            2769:   53(fvec2) Load 2733(lod)
-            2770:   53(fvec2) FAdd 2769 2768
-                              Store 2733(lod) 2770
-            2771:         184 Load 186(sCube)
-            2772:175(f16vec3) Load 177(f16c3)
-            2773:154(f16vec2) ImageQueryLod 2771 2772
-            2774:   53(fvec2) Load 2733(lod)
-            2775:   53(fvec2) FAdd 2774 2773
-                              Store 2733(lod) 2775
-            2776:         269 Load 271(s1DArray)
-            2777:   52(float) Load 128(c1)
-            2778:   53(fvec2) ImageQueryLod 2776 2777
-            2779:   53(fvec2) Load 2733(lod)
-            2780:   53(fvec2) FAdd 2779 2778
-                              Store 2733(lod) 2780
-            2781:         269 Load 271(s1DArray)
-            2782:6(float16_t) Load 135(f16c1)
-            2783:154(f16vec2) ImageQueryLod 2781 2782
-            2784:   53(fvec2) Load 2733(lod)
-            2785:   53(fvec2) FAdd 2784 2783
-                              Store 2733(lod) 2785
-            2786:         284 Load 286(s2DArray)
-            2787:   53(fvec2) Load 148(c2)
-            2788:   53(fvec2) ImageQueryLod 2786 2787
-            2789:   53(fvec2) Load 2733(lod)
-            2790:   53(fvec2) FAdd 2789 2788
-                              Store 2733(lod) 2790
-            2791:         284 Load 286(s2DArray)
-            2792:154(f16vec2) Load 156(f16c2)
-            2793:154(f16vec2) ImageQueryLod 2791 2792
-            2794:   53(fvec2) Load 2733(lod)
-            2795:   53(fvec2) FAdd 2794 2793
-                              Store 2733(lod) 2795
-            2796:         299 Load 301(sCubeArray)
-            2797:  167(fvec3) Load 169(c3)
-            2798:   53(fvec2) ImageQueryLod 2796 2797
-            2799:   53(fvec2) Load 2733(lod)
-            2800:   53(fvec2) FAdd 2799 2798
-                              Store 2733(lod) 2800
-            2801:         299 Load 301(sCubeArray)
-            2802:175(f16vec3) Load 177(f16c3)
-            2803:154(f16vec2) ImageQueryLod 2801 2802
-            2804:   53(fvec2) Load 2733(lod)
-            2805:   53(fvec2) FAdd 2804 2803
-                              Store 2733(lod) 2805
-            2806:         199 Load 201(s1DShadow)
-            2807:   52(float) Load 128(c1)
-            2808:   53(fvec2) ImageQueryLod 2806 2807
-            2809:   53(fvec2) Load 2733(lod)
-            2810:   53(fvec2) FAdd 2809 2808
-                              Store 2733(lod) 2810
-            2811:         199 Load 201(s1DShadow)
-            2812:6(float16_t) Load 135(f16c1)
-            2813:154(f16vec2) ImageQueryLod 2811 2812
-            2814:   53(fvec2) Load 2733(lod)
-            2815:   53(fvec2) FAdd 2814 2813
-                              Store 2733(lod) 2815
-            2816:         224 Load 226(s2DShadow)
-            2817:   53(fvec2) Load 148(c2)
-            2818:   53(fvec2) ImageQueryLod 2816 2817
-            2819:   53(fvec2) Load 2733(lod)
-            2820:   53(fvec2) FAdd 2819 2818
-                              Store 2733(lod) 2820
-            2821:         224 Load 226(s2DShadow)
-            2822:154(f16vec2) Load 156(f16c2)
-            2823:154(f16vec2) ImageQueryLod 2821 2822
-            2824:   53(fvec2) Load 2733(lod)
-            2825:   53(fvec2) FAdd 2824 2823
-                              Store 2733(lod) 2825
-            2826:         391 Load 393(sCubeArrayShadow)
-            2827:  167(fvec3) Load 169(c3)
-            2828:   53(fvec2) ImageQueryLod 2826 2827
-            2829:   53(fvec2) Load 2733(lod)
-            2830:   53(fvec2) FAdd 2829 2828
-                              Store 2733(lod) 2830
-            2831:         391 Load 393(sCubeArrayShadow)
-            2832:175(f16vec3) Load 177(f16c3)
-            2833:154(f16vec2) ImageQueryLod 2831 2832
-            2834:   53(fvec2) Load 2733(lod)
-            2835:   53(fvec2) FAdd 2834 2833
-                              Store 2733(lod) 2835
-            2836:         316 Load 318(s1DArrayShadow)
-            2837:   52(float) Load 128(c1)
-            2838:   53(fvec2) ImageQueryLod 2836 2837
-            2839:   53(fvec2) Load 2733(lod)
-            2840:   53(fvec2) FAdd 2839 2838
-                              Store 2733(lod) 2840
-            2841:         316 Load 318(s1DArrayShadow)
-            2842:6(float16_t) Load 135(f16c1)
-            2843:154(f16vec2) ImageQueryLod 2841 2842
-            2844:   53(fvec2) Load 2733(lod)
-            2845:   53(fvec2) FAdd 2844 2843
-                              Store 2733(lod) 2845
-            2846:         337 Load 339(s2DArrayShadow)
-            2847:   53(fvec2) Load 148(c2)
-            2848:   53(fvec2) ImageQueryLod 2846 2847
-            2849:   53(fvec2) Load 2733(lod)
-            2850:   53(fvec2) FAdd 2849 2848
-                              Store 2733(lod) 2850
-            2851:         337 Load 339(s2DArrayShadow)
-            2852:154(f16vec2) Load 156(f16c2)
-            2853:154(f16vec2) ImageQueryLod 2851 2852
-            2854:   53(fvec2) Load 2733(lod)
-            2855:   53(fvec2) FAdd 2854 2853
-                              Store 2733(lod) 2855
-            2856:         391 Load 393(sCubeArrayShadow)
-            2857:  167(fvec3) Load 169(c3)
-            2858:   53(fvec2) ImageQueryLod 2856 2857
-            2859:   53(fvec2) Load 2733(lod)
-            2860:   53(fvec2) FAdd 2859 2858
-                              Store 2733(lod) 2860
-            2861:         391 Load 393(sCubeArrayShadow)
-            2862:175(f16vec3) Load 177(f16c3)
-            2863:154(f16vec2) ImageQueryLod 2861 2862
-            2864:   53(fvec2) Load 2733(lod)
-            2865:   53(fvec2) FAdd 2864 2863
-                              Store 2733(lod) 2865
-            2866:   53(fvec2) Load 2733(lod)
-                              ReturnValue 2866
+       2777(lod):   2776(ptr) Variable Function
+                              Store 2777(lod) 2779
+            2780:         123 Load 125(s1D)
+            2781:   52(float) Load 128(c1)
+            2782:   53(fvec2) ImageQueryLod 2780 2781
+            2783:   53(fvec2) Load 2777(lod)
+            2784:   53(fvec2) FAdd 2783 2782
+                              Store 2777(lod) 2784
+            2785:         123 Load 125(s1D)
+            2786:6(float16_t) Load 135(f16c1)
+            2787:154(f16vec2) ImageQueryLod 2785 2786
+            2788:   53(fvec2) Load 2777(lod)
+            2789:   53(fvec2) FAdd 2788 2787
+                              Store 2777(lod) 2789
+            2790:         143 Load 145(s2D)
+            2791:   53(fvec2) Load 148(c2)
+            2792:   53(fvec2) ImageQueryLod 2790 2791
+            2793:   53(fvec2) Load 2777(lod)
+            2794:   53(fvec2) FAdd 2793 2792
+                              Store 2777(lod) 2794
+            2795:         143 Load 145(s2D)
+            2796:154(f16vec2) Load 156(f16c2)
+            2797:154(f16vec2) ImageQueryLod 2795 2796
+            2798:   53(fvec2) Load 2777(lod)
+            2799:   53(fvec2) FAdd 2798 2797
+                              Store 2777(lod) 2799
+            2800:         163 Load 165(s3D)
+            2801:  167(fvec3) Load 169(c3)
+            2802:   53(fvec2) ImageQueryLod 2800 2801
+            2803:   53(fvec2) Load 2777(lod)
+            2804:   53(fvec2) FAdd 2803 2802
+                              Store 2777(lod) 2804
+            2805:         163 Load 165(s3D)
+            2806:175(f16vec3) Load 177(f16c3)
+            2807:154(f16vec2) ImageQueryLod 2805 2806
+            2808:   53(fvec2) Load 2777(lod)
+            2809:   53(fvec2) FAdd 2808 2807
+                              Store 2777(lod) 2809
+            2810:         184 Load 186(sCube)
+            2811:  167(fvec3) Load 169(c3)
+            2812:   53(fvec2) ImageQueryLod 2810 2811
+            2813:   53(fvec2) Load 2777(lod)
+            2814:   53(fvec2) FAdd 2813 2812
+                              Store 2777(lod) 2814
+            2815:         184 Load 186(sCube)
+            2816:175(f16vec3) Load 177(f16c3)
+            2817:154(f16vec2) ImageQueryLod 2815 2816
+            2818:   53(fvec2) Load 2777(lod)
+            2819:   53(fvec2) FAdd 2818 2817
+                              Store 2777(lod) 2819
+            2820:         269 Load 271(s1DArray)
+            2821:   52(float) Load 128(c1)
+            2822:   53(fvec2) ImageQueryLod 2820 2821
+            2823:   53(fvec2) Load 2777(lod)
+            2824:   53(fvec2) FAdd 2823 2822
+                              Store 2777(lod) 2824
+            2825:         269 Load 271(s1DArray)
+            2826:6(float16_t) Load 135(f16c1)
+            2827:154(f16vec2) ImageQueryLod 2825 2826
+            2828:   53(fvec2) Load 2777(lod)
+            2829:   53(fvec2) FAdd 2828 2827
+                              Store 2777(lod) 2829
+            2830:         284 Load 286(s2DArray)
+            2831:   53(fvec2) Load 148(c2)
+            2832:   53(fvec2) ImageQueryLod 2830 2831
+            2833:   53(fvec2) Load 2777(lod)
+            2834:   53(fvec2) FAdd 2833 2832
+                              Store 2777(lod) 2834
+            2835:         284 Load 286(s2DArray)
+            2836:154(f16vec2) Load 156(f16c2)
+            2837:154(f16vec2) ImageQueryLod 2835 2836
+            2838:   53(fvec2) Load 2777(lod)
+            2839:   53(fvec2) FAdd 2838 2837
+                              Store 2777(lod) 2839
+            2840:         299 Load 301(sCubeArray)
+            2841:  167(fvec3) Load 169(c3)
+            2842:   53(fvec2) ImageQueryLod 2840 2841
+            2843:   53(fvec2) Load 2777(lod)
+            2844:   53(fvec2) FAdd 2843 2842
+                              Store 2777(lod) 2844
+            2845:         299 Load 301(sCubeArray)
+            2846:175(f16vec3) Load 177(f16c3)
+            2847:154(f16vec2) ImageQueryLod 2845 2846
+            2848:   53(fvec2) Load 2777(lod)
+            2849:   53(fvec2) FAdd 2848 2847
+                              Store 2777(lod) 2849
+            2850:         199 Load 201(s1DShadow)
+            2851:   52(float) Load 128(c1)
+            2852:   53(fvec2) ImageQueryLod 2850 2851
+            2853:   53(fvec2) Load 2777(lod)
+            2854:   53(fvec2) FAdd 2853 2852
+                              Store 2777(lod) 2854
+            2855:         199 Load 201(s1DShadow)
+            2856:6(float16_t) Load 135(f16c1)
+            2857:154(f16vec2) ImageQueryLod 2855 2856
+            2858:   53(fvec2) Load 2777(lod)
+            2859:   53(fvec2) FAdd 2858 2857
+                              Store 2777(lod) 2859
+            2860:         224 Load 226(s2DShadow)
+            2861:   53(fvec2) Load 148(c2)
+            2862:   53(fvec2) ImageQueryLod 2860 2861
+            2863:   53(fvec2) Load 2777(lod)
+            2864:   53(fvec2) FAdd 2863 2862
+                              Store 2777(lod) 2864
+            2865:         224 Load 226(s2DShadow)
+            2866:154(f16vec2) Load 156(f16c2)
+            2867:154(f16vec2) ImageQueryLod 2865 2866
+            2868:   53(fvec2) Load 2777(lod)
+            2869:   53(fvec2) FAdd 2868 2867
+                              Store 2777(lod) 2869
+            2870:         391 Load 393(sCubeArrayShadow)
+            2871:  167(fvec3) Load 169(c3)
+            2872:   53(fvec2) ImageQueryLod 2870 2871
+            2873:   53(fvec2) Load 2777(lod)
+            2874:   53(fvec2) FAdd 2873 2872
+                              Store 2777(lod) 2874
+            2875:         391 Load 393(sCubeArrayShadow)
+            2876:175(f16vec3) Load 177(f16c3)
+            2877:154(f16vec2) ImageQueryLod 2875 2876
+            2878:   53(fvec2) Load 2777(lod)
+            2879:   53(fvec2) FAdd 2878 2877
+                              Store 2777(lod) 2879
+            2880:         316 Load 318(s1DArrayShadow)
+            2881:   52(float) Load 128(c1)
+            2882:   53(fvec2) ImageQueryLod 2880 2881
+            2883:   53(fvec2) Load 2777(lod)
+            2884:   53(fvec2) FAdd 2883 2882
+                              Store 2777(lod) 2884
+            2885:         316 Load 318(s1DArrayShadow)
+            2886:6(float16_t) Load 135(f16c1)
+            2887:154(f16vec2) ImageQueryLod 2885 2886
+            2888:   53(fvec2) Load 2777(lod)
+            2889:   53(fvec2) FAdd 2888 2887
+                              Store 2777(lod) 2889
+            2890:         337 Load 339(s2DArrayShadow)
+            2891:   53(fvec2) Load 148(c2)
+            2892:   53(fvec2) ImageQueryLod 2890 2891
+            2893:   53(fvec2) Load 2777(lod)
+            2894:   53(fvec2) FAdd 2893 2892
+                              Store 2777(lod) 2894
+            2895:         337 Load 339(s2DArrayShadow)
+            2896:154(f16vec2) Load 156(f16c2)
+            2897:154(f16vec2) ImageQueryLod 2895 2896
+            2898:   53(fvec2) Load 2777(lod)
+            2899:   53(fvec2) FAdd 2898 2897
+                              Store 2777(lod) 2899
+            2900:         391 Load 393(sCubeArrayShadow)
+            2901:  167(fvec3) Load 169(c3)
+            2902:   53(fvec2) ImageQueryLod 2900 2901
+            2903:   53(fvec2) Load 2777(lod)
+            2904:   53(fvec2) FAdd 2903 2902
+                              Store 2777(lod) 2904
+            2905:         391 Load 393(sCubeArrayShadow)
+            2906:175(f16vec3) Load 177(f16c3)
+            2907:154(f16vec2) ImageQueryLod 2905 2906
+            2908:   53(fvec2) Load 2777(lod)
+            2909:   53(fvec2) FAdd 2908 2907
+                              Store 2777(lod) 2909
+            2910:   53(fvec2) Load 2777(lod)
+                              ReturnValue 2910
                               FunctionEnd
 58(testTextureQueryLevels():     47(int) Function None 57
               59:             Label
-    2869(levels):   2566(ptr) Variable Function
-                              Store 2869(levels) 2187
-            2870:         123 Load 125(s1D)
-            2871:         122 Image 2870
-            2872:     47(int) ImageQueryLevels 2871
-            2873:     47(int) Load 2869(levels)
-            2874:     47(int) IAdd 2873 2872
-                              Store 2869(levels) 2874
-            2875:         143 Load 145(s2D)
-            2876:         142 Image 2875
-            2877:     47(int) ImageQueryLevels 2876
-            2878:     47(int) Load 2869(levels)
-            2879:     47(int) IAdd 2878 2877
-                              Store 2869(levels) 2879
-            2880:         163 Load 165(s3D)
-            2881:         162 Image 2880
-            2882:     47(int) ImageQueryLevels 2881
-            2883:     47(int) Load 2869(levels)
-            2884:     47(int) IAdd 2883 2882
-                              Store 2869(levels) 2884
-            2885:         184 Load 186(sCube)
-            2886:         183 Image 2885
-            2887:     47(int) ImageQueryLevels 2886
-            2888:     47(int) Load 2869(levels)
-            2889:     47(int) IAdd 2888 2887
-                              Store 2869(levels) 2889
-            2890:         199 Load 201(s1DShadow)
-            2891:         198 Image 2890
-            2892:     47(int) ImageQueryLevels 2891
-            2893:     47(int) Load 2869(levels)
-            2894:     47(int) IAdd 2893 2892
-                              Store 2869(levels) 2894
-            2895:         224 Load 226(s2DShadow)
-            2896:         223 Image 2895
-            2897:     47(int) ImageQueryLevels 2896
-            2898:     47(int) Load 2869(levels)
-            2899:     47(int) IAdd 2898 2897
-                              Store 2869(levels) 2899
-            2900:         245 Load 247(sCubeShadow)
-            2901:         244 Image 2900
-            2902:     47(int) ImageQueryLevels 2901
-            2903:     47(int) Load 2869(levels)
-            2904:     47(int) IAdd 2903 2902
-                              Store 2869(levels) 2904
-            2905:         299 Load 301(sCubeArray)
-            2906:         298 Image 2905
-            2907:     47(int) ImageQueryLevels 2906
-            2908:     47(int) Load 2869(levels)
-            2909:     47(int) IAdd 2908 2907
-                              Store 2869(levels) 2909
-            2910:         391 Load 393(sCubeArrayShadow)
-            2911:         390 Image 2910
-            2912:     47(int) ImageQueryLevels 2911
-            2913:     47(int) Load 2869(levels)
-            2914:     47(int) IAdd 2913 2912
-                              Store 2869(levels) 2914
-            2915:         269 Load 271(s1DArray)
-            2916:         268 Image 2915
-            2917:     47(int) ImageQueryLevels 2916
-            2918:     47(int) Load 2869(levels)
-            2919:     47(int) IAdd 2918 2917
-                              Store 2869(levels) 2919
-            2920:         284 Load 286(s2DArray)
-            2921:         283 Image 2920
-            2922:     47(int) ImageQueryLevels 2921
-            2923:     47(int) Load 2869(levels)
-            2924:     47(int) IAdd 2923 2922
-                              Store 2869(levels) 2924
-            2925:         316 Load 318(s1DArrayShadow)
-            2926:         315 Image 2925
-            2927:     47(int) ImageQueryLevels 2926
-            2928:     47(int) Load 2869(levels)
-            2929:     47(int) IAdd 2928 2927
-                              Store 2869(levels) 2929
-            2930:         337 Load 339(s2DArrayShadow)
-            2931:         336 Image 2930
-            2932:     47(int) ImageQueryLevels 2931
-            2933:     47(int) Load 2869(levels)
-            2934:     47(int) IAdd 2933 2932
-                              Store 2869(levels) 2934
-            2935:     47(int) Load 2869(levels)
-                              ReturnValue 2935
+    2913(levels):   2566(ptr) Variable Function
+                              Store 2913(levels) 2187
+            2914:         123 Load 125(s1D)
+            2915:         122 Image 2914
+            2916:     47(int) ImageQueryLevels 2915
+            2917:     47(int) Load 2913(levels)
+            2918:     47(int) IAdd 2917 2916
+                              Store 2913(levels) 2918
+            2919:         143 Load 145(s2D)
+            2920:         142 Image 2919
+            2921:     47(int) ImageQueryLevels 2920
+            2922:     47(int) Load 2913(levels)
+            2923:     47(int) IAdd 2922 2921
+                              Store 2913(levels) 2923
+            2924:         163 Load 165(s3D)
+            2925:         162 Image 2924
+            2926:     47(int) ImageQueryLevels 2925
+            2927:     47(int) Load 2913(levels)
+            2928:     47(int) IAdd 2927 2926
+                              Store 2913(levels) 2928
+            2929:         184 Load 186(sCube)
+            2930:         183 Image 2929
+            2931:     47(int) ImageQueryLevels 2930
+            2932:     47(int) Load 2913(levels)
+            2933:     47(int) IAdd 2932 2931
+                              Store 2913(levels) 2933
+            2934:         199 Load 201(s1DShadow)
+            2935:         198 Image 2934
+            2936:     47(int) ImageQueryLevels 2935
+            2937:     47(int) Load 2913(levels)
+            2938:     47(int) IAdd 2937 2936
+                              Store 2913(levels) 2938
+            2939:         224 Load 226(s2DShadow)
+            2940:         223 Image 2939
+            2941:     47(int) ImageQueryLevels 2940
+            2942:     47(int) Load 2913(levels)
+            2943:     47(int) IAdd 2942 2941
+                              Store 2913(levels) 2943
+            2944:         245 Load 247(sCubeShadow)
+            2945:         244 Image 2944
+            2946:     47(int) ImageQueryLevels 2945
+            2947:     47(int) Load 2913(levels)
+            2948:     47(int) IAdd 2947 2946
+                              Store 2913(levels) 2948
+            2949:         299 Load 301(sCubeArray)
+            2950:         298 Image 2949
+            2951:     47(int) ImageQueryLevels 2950
+            2952:     47(int) Load 2913(levels)
+            2953:     47(int) IAdd 2952 2951
+                              Store 2913(levels) 2953
+            2954:         391 Load 393(sCubeArrayShadow)
+            2955:         390 Image 2954
+            2956:     47(int) ImageQueryLevels 2955
+            2957:     47(int) Load 2913(levels)
+            2958:     47(int) IAdd 2957 2956
+                              Store 2913(levels) 2958
+            2959:         269 Load 271(s1DArray)
+            2960:         268 Image 2959
+            2961:     47(int) ImageQueryLevels 2960
+            2962:     47(int) Load 2913(levels)
+            2963:     47(int) IAdd 2962 2961
+                              Store 2913(levels) 2963
+            2964:         284 Load 286(s2DArray)
+            2965:         283 Image 2964
+            2966:     47(int) ImageQueryLevels 2965
+            2967:     47(int) Load 2913(levels)
+            2968:     47(int) IAdd 2967 2966
+                              Store 2913(levels) 2968
+            2969:         316 Load 318(s1DArrayShadow)
+            2970:         315 Image 2969
+            2971:     47(int) ImageQueryLevels 2970
+            2972:     47(int) Load 2913(levels)
+            2973:     47(int) IAdd 2972 2971
+                              Store 2913(levels) 2973
+            2974:         337 Load 339(s2DArrayShadow)
+            2975:         336 Image 2974
+            2976:     47(int) ImageQueryLevels 2975
+            2977:     47(int) Load 2913(levels)
+            2978:     47(int) IAdd 2977 2976
+                              Store 2913(levels) 2978
+            2979:     47(int) Load 2913(levels)
+                              ReturnValue 2979
                               FunctionEnd
 60(testTextureSamples():     47(int) Function None 57
               61:             Label
-   2938(samples):   2566(ptr) Variable Function
-                              Store 2938(samples) 2187
-            2939:        1309 Load 1311(s2DMS)
-            2940:        1308 Image 2939
-            2941:     47(int) ImageQuerySamples 2940
-            2942:     47(int) Load 2938(samples)
-            2943:     47(int) IAdd 2942 2941
-                              Store 2938(samples) 2943
-            2944:        1320 Load 1322(s2DMSArray)
-            2945:        1319 Image 2944
-            2946:     47(int) ImageQuerySamples 2945
-            2947:     47(int) Load 2938(samples)
-            2948:     47(int) IAdd 2947 2946
-                              Store 2938(samples) 2948
-            2949:     47(int) Load 2938(samples)
-                              ReturnValue 2949
+   2982(samples):   2566(ptr) Variable Function
+                              Store 2982(samples) 2187
+            2983:        1309 Load 1311(s2DMS)
+            2984:        1308 Image 2983
+            2985:     47(int) ImageQuerySamples 2984
+            2986:     47(int) Load 2982(samples)
+            2987:     47(int) IAdd 2986 2985
+                              Store 2982(samples) 2987
+            2988:        1320 Load 1322(s2DMSArray)
+            2989:        1319 Image 2988
+            2990:     47(int) ImageQuerySamples 2989
+            2991:     47(int) Load 2982(samples)
+            2992:     47(int) IAdd 2991 2990
+                              Store 2982(samples) 2992
+            2993:     47(int) Load 2982(samples)
+                              ReturnValue 2993
                               FunctionEnd
 62(testImageLoad():  7(f16vec4) Function None 8
               63:             Label
-     2952(texel):     64(ptr) Variable Function
-                              Store 2952(texel) 121
-            2956:        2953 Load 2955(i1D)
-            2957:   52(float) Load 128(c1)
-            2958:     47(int) ConvertFToS 2957
-            2959:  7(f16vec4) ImageRead 2956 2958
-            2960:  7(f16vec4) Load 2952(texel)
-            2961:  7(f16vec4) FAdd 2960 2959
-                              Store 2952(texel) 2961
-            2965:        2962 Load 2964(i2D)
-            2966:   53(fvec2) Load 148(c2)
-            2967:  721(ivec2) ConvertFToS 2966
-            2968:  7(f16vec4) ImageRead 2965 2967
-            2969:  7(f16vec4) Load 2952(texel)
-            2970:  7(f16vec4) FAdd 2969 2968
-                              Store 2952(texel) 2970
-            2974:        2971 Load 2973(i3D)
-            2975:  167(fvec3) Load 169(c3)
-            2976:  734(ivec3) ConvertFToS 2975
-            2977:  7(f16vec4) ImageRead 2974 2976
-            2978:  7(f16vec4) Load 2952(texel)
-            2979:  7(f16vec4) FAdd 2978 2977
-                              Store 2952(texel) 2979
-            2983:        2980 Load 2982(i2DRect)
-            2984:   53(fvec2) Load 148(c2)
-            2985:  721(ivec2) ConvertFToS 2984
-            2986:  7(f16vec4) ImageRead 2983 2985
-            2987:  7(f16vec4) Load 2952(texel)
-            2988:  7(f16vec4) FAdd 2987 2986
-                              Store 2952(texel) 2988
-            2992:        2989 Load 2991(iCube)
-            2993:  167(fvec3) Load 169(c3)
-            2994:  734(ivec3) ConvertFToS 2993
-            2995:  7(f16vec4) ImageRead 2992 2994
-            2996:  7(f16vec4) Load 2952(texel)
-            2997:  7(f16vec4) FAdd 2996 2995
-                              Store 2952(texel) 2997
-            3001:        2998 Load 3000(iBuffer)
-            3002:   52(float) Load 128(c1)
-            3003:     47(int) ConvertFToS 3002
-            3004:  7(f16vec4) ImageRead 3001 3003
-            3005:  7(f16vec4) Load 2952(texel)
-            3006:  7(f16vec4) FAdd 3005 3004
-                              Store 2952(texel) 3006
-            3010:        3007 Load 3009(i1DArray)
-            3011:   53(fvec2) Load 148(c2)
-            3012:  721(ivec2) ConvertFToS 3011
-            3013:  7(f16vec4) ImageRead 3010 3012
-            3014:  7(f16vec4) Load 2952(texel)
-            3015:  7(f16vec4) FAdd 3014 3013
-                              Store 2952(texel) 3015
-            3019:        3016 Load 3018(i2DArray)
-            3020:  167(fvec3) Load 169(c3)
-            3021:  734(ivec3) ConvertFToS 3020
-            3022:  7(f16vec4) ImageRead 3019 3021
-            3023:  7(f16vec4) Load 2952(texel)
-            3024:  7(f16vec4) FAdd 3023 3022
-                              Store 2952(texel) 3024
-            3028:        3025 Load 3027(iCubeArray)
-            3029:  167(fvec3) Load 169(c3)
-            3030:  734(ivec3) ConvertFToS 3029
-            3031:  7(f16vec4) ImageRead 3028 3030
-            3032:  7(f16vec4) Load 2952(texel)
-            3033:  7(f16vec4) FAdd 3032 3031
-                              Store 2952(texel) 3033
-            3037:        3034 Load 3036(i2DMS)
-            3038:   53(fvec2) Load 148(c2)
-            3039:  721(ivec2) ConvertFToS 3038
-            3040:  7(f16vec4) ImageRead 3037 3039 Sample 709
-            3041:  7(f16vec4) Load 2952(texel)
-            3042:  7(f16vec4) FAdd 3041 3040
-                              Store 2952(texel) 3042
-            3046:        3043 Load 3045(i2DMSArray)
-            3047:  167(fvec3) Load 169(c3)
-            3048:  734(ivec3) ConvertFToS 3047
-            3049:  7(f16vec4) ImageRead 3046 3048 Sample 709
-            3050:  7(f16vec4) Load 2952(texel)
-            3051:  7(f16vec4) FAdd 3050 3049
-                              Store 2952(texel) 3051
-            3052:  7(f16vec4) Load 2952(texel)
-                              ReturnValue 3052
+     2996(texel):     64(ptr) Variable Function
+                              Store 2996(texel) 121
+            3000:        2997 Load 2999(i1D)
+            3001:   52(float) Load 128(c1)
+            3002:     47(int) ConvertFToS 3001
+            3003:  7(f16vec4) ImageRead 3000 3002
+            3004:  7(f16vec4) Load 2996(texel)
+            3005:  7(f16vec4) FAdd 3004 3003
+                              Store 2996(texel) 3005
+            3009:        3006 Load 3008(i2D)
+            3010:   53(fvec2) Load 148(c2)
+            3011:  721(ivec2) ConvertFToS 3010
+            3012:  7(f16vec4) ImageRead 3009 3011
+            3013:  7(f16vec4) Load 2996(texel)
+            3014:  7(f16vec4) FAdd 3013 3012
+                              Store 2996(texel) 3014
+            3018:        3015 Load 3017(i3D)
+            3019:  167(fvec3) Load 169(c3)
+            3020:  734(ivec3) ConvertFToS 3019
+            3021:  7(f16vec4) ImageRead 3018 3020
+            3022:  7(f16vec4) Load 2996(texel)
+            3023:  7(f16vec4) FAdd 3022 3021
+                              Store 2996(texel) 3023
+            3027:        3024 Load 3026(i2DRect)
+            3028:   53(fvec2) Load 148(c2)
+            3029:  721(ivec2) ConvertFToS 3028
+            3030:  7(f16vec4) ImageRead 3027 3029
+            3031:  7(f16vec4) Load 2996(texel)
+            3032:  7(f16vec4) FAdd 3031 3030
+                              Store 2996(texel) 3032
+            3036:        3033 Load 3035(iCube)
+            3037:  167(fvec3) Load 169(c3)
+            3038:  734(ivec3) ConvertFToS 3037
+            3039:  7(f16vec4) ImageRead 3036 3038
+            3040:  7(f16vec4) Load 2996(texel)
+            3041:  7(f16vec4) FAdd 3040 3039
+                              Store 2996(texel) 3041
+            3045:        3042 Load 3044(iBuffer)
+            3046:   52(float) Load 128(c1)
+            3047:     47(int) ConvertFToS 3046
+            3048:  7(f16vec4) ImageRead 3045 3047
+            3049:  7(f16vec4) Load 2996(texel)
+            3050:  7(f16vec4) FAdd 3049 3048
+                              Store 2996(texel) 3050
+            3054:        3051 Load 3053(i1DArray)
+            3055:   53(fvec2) Load 148(c2)
+            3056:  721(ivec2) ConvertFToS 3055
+            3057:  7(f16vec4) ImageRead 3054 3056
+            3058:  7(f16vec4) Load 2996(texel)
+            3059:  7(f16vec4) FAdd 3058 3057
+                              Store 2996(texel) 3059
+            3063:        3060 Load 3062(i2DArray)
+            3064:  167(fvec3) Load 169(c3)
+            3065:  734(ivec3) ConvertFToS 3064
+            3066:  7(f16vec4) ImageRead 3063 3065
+            3067:  7(f16vec4) Load 2996(texel)
+            3068:  7(f16vec4) FAdd 3067 3066
+                              Store 2996(texel) 3068
+            3072:        3069 Load 3071(iCubeArray)
+            3073:  167(fvec3) Load 169(c3)
+            3074:  734(ivec3) ConvertFToS 3073
+            3075:  7(f16vec4) ImageRead 3072 3074
+            3076:  7(f16vec4) Load 2996(texel)
+            3077:  7(f16vec4) FAdd 3076 3075
+                              Store 2996(texel) 3077
+            3081:        3078 Load 3080(i2DMS)
+            3082:   53(fvec2) Load 148(c2)
+            3083:  721(ivec2) ConvertFToS 3082
+            3084:  7(f16vec4) ImageRead 3081 3083 Sample 709
+            3085:  7(f16vec4) Load 2996(texel)
+            3086:  7(f16vec4) FAdd 3085 3084
+                              Store 2996(texel) 3086
+            3090:        3087 Load 3089(i2DMSArray)
+            3091:  167(fvec3) Load 169(c3)
+            3092:  734(ivec3) ConvertFToS 3091
+            3093:  7(f16vec4) ImageRead 3090 3092 Sample 709
+            3094:  7(f16vec4) Load 2996(texel)
+            3095:  7(f16vec4) FAdd 3094 3093
+                              Store 2996(texel) 3095
+            3096:  7(f16vec4) Load 2996(texel)
+                              ReturnValue 3096
                               FunctionEnd
 67(testImageStore(vf164;):           2 Function None 65
         66(data):     64(ptr) FunctionParameter
               68:             Label
-            3055:        2953 Load 2955(i1D)
-            3056:   52(float) Load 128(c1)
-            3057:     47(int) ConvertFToS 3056
-            3058:  7(f16vec4) Load 66(data)
-                              ImageWrite 3055 3057 3058
-            3059:        2962 Load 2964(i2D)
-            3060:   53(fvec2) Load 148(c2)
-            3061:  721(ivec2) ConvertFToS 3060
-            3062:  7(f16vec4) Load 66(data)
-                              ImageWrite 3059 3061 3062
-            3063:        2971 Load 2973(i3D)
-            3064:  167(fvec3) Load 169(c3)
-            3065:  734(ivec3) ConvertFToS 3064
-            3066:  7(f16vec4) Load 66(data)
-                              ImageWrite 3063 3065 3066
-            3067:        2980 Load 2982(i2DRect)
-            3068:   53(fvec2) Load 148(c2)
-            3069:  721(ivec2) ConvertFToS 3068
-            3070:  7(f16vec4) Load 66(data)
-                              ImageWrite 3067 3069 3070
-            3071:        2989 Load 2991(iCube)
-            3072:  167(fvec3) Load 169(c3)
-            3073:  734(ivec3) ConvertFToS 3072
-            3074:  7(f16vec4) Load 66(data)
-                              ImageWrite 3071 3073 3074
-            3075:        2998 Load 3000(iBuffer)
-            3076:   52(float) Load 128(c1)
-            3077:     47(int) ConvertFToS 3076
-            3078:  7(f16vec4) Load 66(data)
-                              ImageWrite 3075 3077 3078
-            3079:        3007 Load 3009(i1DArray)
-            3080:   53(fvec2) Load 148(c2)
-            3081:  721(ivec2) ConvertFToS 3080
-            3082:  7(f16vec4) Load 66(data)
-                              ImageWrite 3079 3081 3082
-            3083:        3016 Load 3018(i2DArray)
-            3084:  167(fvec3) Load 169(c3)
-            3085:  734(ivec3) ConvertFToS 3084
-            3086:  7(f16vec4) Load 66(data)
-                              ImageWrite 3083 3085 3086
-            3087:        3025 Load 3027(iCubeArray)
-            3088:  167(fvec3) Load 169(c3)
-            3089:  734(ivec3) ConvertFToS 3088
-            3090:  7(f16vec4) Load 66(data)
-                              ImageWrite 3087 3089 3090
-            3091:        3034 Load 3036(i2DMS)
-            3092:   53(fvec2) Load 148(c2)
-            3093:  721(ivec2) ConvertFToS 3092
-            3094:  7(f16vec4) Load 66(data)
-                              ImageWrite 3091 3093 3094 Sample 709
-            3095:        3043 Load 3045(i2DMSArray)
-            3096:  167(fvec3) Load 169(c3)
-            3097:  734(ivec3) ConvertFToS 3096
-            3098:  7(f16vec4) Load 66(data)
-                              ImageWrite 3095 3097 3098 Sample 709
+            3099:        2997 Load 2999(i1D)
+            3100:   52(float) Load 128(c1)
+            3101:     47(int) ConvertFToS 3100
+            3102:  7(f16vec4) Load 66(data)
+                              ImageWrite 3099 3101 3102
+            3103:        3006 Load 3008(i2D)
+            3104:   53(fvec2) Load 148(c2)
+            3105:  721(ivec2) ConvertFToS 3104
+            3106:  7(f16vec4) Load 66(data)
+                              ImageWrite 3103 3105 3106
+            3107:        3015 Load 3017(i3D)
+            3108:  167(fvec3) Load 169(c3)
+            3109:  734(ivec3) ConvertFToS 3108
+            3110:  7(f16vec4) Load 66(data)
+                              ImageWrite 3107 3109 3110
+            3111:        3024 Load 3026(i2DRect)
+            3112:   53(fvec2) Load 148(c2)
+            3113:  721(ivec2) ConvertFToS 3112
+            3114:  7(f16vec4) Load 66(data)
+                              ImageWrite 3111 3113 3114
+            3115:        3033 Load 3035(iCube)
+            3116:  167(fvec3) Load 169(c3)
+            3117:  734(ivec3) ConvertFToS 3116
+            3118:  7(f16vec4) Load 66(data)
+                              ImageWrite 3115 3117 3118
+            3119:        3042 Load 3044(iBuffer)
+            3120:   52(float) Load 128(c1)
+            3121:     47(int) ConvertFToS 3120
+            3122:  7(f16vec4) Load 66(data)
+                              ImageWrite 3119 3121 3122
+            3123:        3051 Load 3053(i1DArray)
+            3124:   53(fvec2) Load 148(c2)
+            3125:  721(ivec2) ConvertFToS 3124
+            3126:  7(f16vec4) Load 66(data)
+                              ImageWrite 3123 3125 3126
+            3127:        3060 Load 3062(i2DArray)
+            3128:  167(fvec3) Load 169(c3)
+            3129:  734(ivec3) ConvertFToS 3128
+            3130:  7(f16vec4) Load 66(data)
+                              ImageWrite 3127 3129 3130
+            3131:        3069 Load 3071(iCubeArray)
+            3132:  167(fvec3) Load 169(c3)
+            3133:  734(ivec3) ConvertFToS 3132
+            3134:  7(f16vec4) Load 66(data)
+                              ImageWrite 3131 3133 3134
+            3135:        3078 Load 3080(i2DMS)
+            3136:   53(fvec2) Load 148(c2)
+            3137:  721(ivec2) ConvertFToS 3136
+            3138:  7(f16vec4) Load 66(data)
+                              ImageWrite 3135 3137 3138 Sample 709
+            3139:        3087 Load 3089(i2DMSArray)
+            3140:  167(fvec3) Load 169(c3)
+            3141:  734(ivec3) ConvertFToS 3140
+            3142:  7(f16vec4) Load 66(data)
+                              ImageWrite 3139 3141 3142 Sample 709
                               Return
                               FunctionEnd
 69(testSparseTexture():  7(f16vec4) Function None 8
               70:             Label
-     3099(texel):     64(ptr) Variable Function
-                              Store 3099(texel) 121
-            3100:         143 Load 145(s2D)
-            3101:   53(fvec2) Load 148(c2)
-            3103:3102(ResType) ImageSparseSampleImplicitLod 3100 3101
-            3104:  7(f16vec4) CompositeExtract 3103 1
-                              Store 3099(texel) 3104
-            3105:     47(int) CompositeExtract 3103 0
-            3106:         143 Load 145(s2D)
-            3107:154(f16vec2) Load 156(f16c2)
-            3108:6(float16_t) Load 137(f16bias)
-            3109:3102(ResType) ImageSparseSampleImplicitLod 3106 3107 Bias 3108
-            3110:  7(f16vec4) CompositeExtract 3109 1
-                              Store 3099(texel) 3110
-            3111:     47(int) CompositeExtract 3109 0
-            3112:         163 Load 165(s3D)
-            3113:  167(fvec3) Load 169(c3)
-            3114:3102(ResType) ImageSparseSampleImplicitLod 3112 3113
-            3115:  7(f16vec4) CompositeExtract 3114 1
-                              Store 3099(texel) 3115
-            3116:     47(int) CompositeExtract 3114 0
-            3117:         163 Load 165(s3D)
-            3118:175(f16vec3) Load 177(f16c3)
-            3119:6(float16_t) Load 137(f16bias)
-            3120:3102(ResType) ImageSparseSampleImplicitLod 3117 3118 Bias 3119
-            3121:  7(f16vec4) CompositeExtract 3120 1
-                              Store 3099(texel) 3121
-            3122:     47(int) CompositeExtract 3120 0
-            3123:         184 Load 186(sCube)
-            3124:  167(fvec3) Load 169(c3)
-            3125:3102(ResType) ImageSparseSampleImplicitLod 3123 3124
-            3126:  7(f16vec4) CompositeExtract 3125 1
-                              Store 3099(texel) 3126
-            3127:     47(int) CompositeExtract 3125 0
-            3128:         184 Load 186(sCube)
-            3129:175(f16vec3) Load 177(f16c3)
-            3130:6(float16_t) Load 137(f16bias)
-            3131:3102(ResType) ImageSparseSampleImplicitLod 3128 3129 Bias 3130
-            3132:  7(f16vec4) CompositeExtract 3131 1
-                              Store 3099(texel) 3132
-            3133:     47(int) CompositeExtract 3131 0
-            3134:         224 Load 226(s2DShadow)
-            3135:  167(fvec3) Load 169(c3)
-            3136:    208(ptr) AccessChain 3099(texel) 207
-            3137:   52(float) CompositeExtract 3135 2
-            3139:3138(ResType) ImageSparseSampleDrefImplicitLod 3134 3135 3137
-            3140:6(float16_t) CompositeExtract 3139 1
-                              Store 3136 3140
-            3141:     47(int) CompositeExtract 3139 0
-            3142:         224 Load 226(s2DShadow)
-            3143:154(f16vec2) Load 156(f16c2)
-            3144:   52(float) Load 215(compare)
-            3145:    208(ptr) AccessChain 3099(texel) 207
-            3146:6(float16_t) Load 137(f16bias)
-            3147:3138(ResType) ImageSparseSampleDrefImplicitLod 3142 3143 3144 Bias 3146
-            3148:6(float16_t) CompositeExtract 3147 1
-                              Store 3145 3148
+     3143(texel):     64(ptr) Variable Function
+                              Store 3143(texel) 121
+            3144:         143 Load 145(s2D)
+            3145:   53(fvec2) Load 148(c2)
+            3147:3146(ResType) ImageSparseSampleImplicitLod 3144 3145
+            3148:  7(f16vec4) CompositeExtract 3147 1
+                              Store 3143(texel) 3148
             3149:     47(int) CompositeExtract 3147 0
-            3150:         245 Load 247(sCubeShadow)
-            3151:  249(fvec4) Load 251(c4)
-            3152:    208(ptr) AccessChain 3099(texel) 207
-            3153:   52(float) CompositeExtract 3151 3
-            3154:3138(ResType) ImageSparseSampleDrefImplicitLod 3150 3151 3153
-            3155:6(float16_t) CompositeExtract 3154 1
-                              Store 3152 3155
-            3156:     47(int) CompositeExtract 3154 0
-            3157:         245 Load 247(sCubeShadow)
-            3158:175(f16vec3) Load 177(f16c3)
-            3159:   52(float) Load 215(compare)
-            3160:    208(ptr) AccessChain 3099(texel) 207
-            3161:6(float16_t) Load 137(f16bias)
-            3162:3138(ResType) ImageSparseSampleDrefImplicitLod 3157 3158 3159 Bias 3161
-            3163:6(float16_t) CompositeExtract 3162 1
-                              Store 3160 3163
-            3164:     47(int) CompositeExtract 3162 0
-            3165:         284 Load 286(s2DArray)
-            3166:  167(fvec3) Load 169(c3)
-            3167:3102(ResType) ImageSparseSampleImplicitLod 3165 3166
-            3168:  7(f16vec4) CompositeExtract 3167 1
-                              Store 3099(texel) 3168
-            3169:     47(int) CompositeExtract 3167 0
-            3170:         284 Load 286(s2DArray)
-            3171:175(f16vec3) Load 177(f16c3)
-            3172:6(float16_t) Load 137(f16bias)
-            3173:3102(ResType) ImageSparseSampleImplicitLod 3170 3171 Bias 3172
-            3174:  7(f16vec4) CompositeExtract 3173 1
-                              Store 3099(texel) 3174
-            3175:     47(int) CompositeExtract 3173 0
-            3176:         299 Load 301(sCubeArray)
-            3177:  249(fvec4) Load 251(c4)
-            3178:3102(ResType) ImageSparseSampleImplicitLod 3176 3177
-            3179:  7(f16vec4) CompositeExtract 3178 1
-                              Store 3099(texel) 3179
-            3180:     47(int) CompositeExtract 3178 0
-            3181:         299 Load 301(sCubeArray)
-            3182:  7(f16vec4) Load 309(f16c4)
-            3183:6(float16_t) Load 137(f16bias)
-            3184:3102(ResType) ImageSparseSampleImplicitLod 3181 3182 Bias 3183
-            3185:  7(f16vec4) CompositeExtract 3184 1
-                              Store 3099(texel) 3185
-            3186:     47(int) CompositeExtract 3184 0
-            3187:         337 Load 339(s2DArrayShadow)
-            3188:  249(fvec4) Load 251(c4)
-            3189:    208(ptr) AccessChain 3099(texel) 207
-            3190:   52(float) CompositeExtract 3188 3
-            3191:3138(ResType) ImageSparseSampleDrefImplicitLod 3187 3188 3190
+            3150:         143 Load 145(s2D)
+            3151:154(f16vec2) Load 156(f16c2)
+            3152:6(float16_t) Load 137(f16bias)
+            3153:3146(ResType) ImageSparseSampleImplicitLod 3150 3151 Bias 3152
+            3154:  7(f16vec4) CompositeExtract 3153 1
+                              Store 3143(texel) 3154
+            3155:     47(int) CompositeExtract 3153 0
+            3156:         163 Load 165(s3D)
+            3157:  167(fvec3) Load 169(c3)
+            3158:3146(ResType) ImageSparseSampleImplicitLod 3156 3157
+            3159:  7(f16vec4) CompositeExtract 3158 1
+                              Store 3143(texel) 3159
+            3160:     47(int) CompositeExtract 3158 0
+            3161:         163 Load 165(s3D)
+            3162:175(f16vec3) Load 177(f16c3)
+            3163:6(float16_t) Load 137(f16bias)
+            3164:3146(ResType) ImageSparseSampleImplicitLod 3161 3162 Bias 3163
+            3165:  7(f16vec4) CompositeExtract 3164 1
+                              Store 3143(texel) 3165
+            3166:     47(int) CompositeExtract 3164 0
+            3167:         184 Load 186(sCube)
+            3168:  167(fvec3) Load 169(c3)
+            3169:3146(ResType) ImageSparseSampleImplicitLod 3167 3168
+            3170:  7(f16vec4) CompositeExtract 3169 1
+                              Store 3143(texel) 3170
+            3171:     47(int) CompositeExtract 3169 0
+            3172:         184 Load 186(sCube)
+            3173:175(f16vec3) Load 177(f16c3)
+            3174:6(float16_t) Load 137(f16bias)
+            3175:3146(ResType) ImageSparseSampleImplicitLod 3172 3173 Bias 3174
+            3176:  7(f16vec4) CompositeExtract 3175 1
+                              Store 3143(texel) 3176
+            3177:     47(int) CompositeExtract 3175 0
+            3178:         224 Load 226(s2DShadow)
+            3179:  167(fvec3) Load 169(c3)
+            3180:    208(ptr) AccessChain 3143(texel) 207
+            3181:   52(float) CompositeExtract 3179 2
+            3183:3182(ResType) ImageSparseSampleDrefImplicitLod 3178 3179 3181
+            3184:6(float16_t) CompositeExtract 3183 1
+                              Store 3180 3184
+            3185:     47(int) CompositeExtract 3183 0
+            3186:         224 Load 226(s2DShadow)
+            3187:154(f16vec2) Load 156(f16c2)
+            3188:   52(float) Load 215(compare)
+            3189:    208(ptr) AccessChain 3143(texel) 207
+            3190:6(float16_t) Load 137(f16bias)
+            3191:3182(ResType) ImageSparseSampleDrefImplicitLod 3186 3187 3188 Bias 3190
             3192:6(float16_t) CompositeExtract 3191 1
                               Store 3189 3192
             3193:     47(int) CompositeExtract 3191 0
-            3194:         337 Load 339(s2DArrayShadow)
-            3195:175(f16vec3) Load 177(f16c3)
-            3196:   52(float) Load 215(compare)
-            3197:    208(ptr) AccessChain 3099(texel) 207
-            3198:3138(ResType) ImageSparseSampleDrefImplicitLod 3194 3195 3196
+            3194:         245 Load 247(sCubeShadow)
+            3195:  249(fvec4) Load 251(c4)
+            3196:    208(ptr) AccessChain 3143(texel) 207
+            3197:   52(float) CompositeExtract 3195 3
+            3198:3182(ResType) ImageSparseSampleDrefImplicitLod 3194 3195 3197
             3199:6(float16_t) CompositeExtract 3198 1
-                              Store 3197 3199
+                              Store 3196 3199
             3200:     47(int) CompositeExtract 3198 0
-            3201:         357 Load 359(s2DRect)
-            3202:   53(fvec2) Load 148(c2)
-            3203:3102(ResType) ImageSparseSampleImplicitLod 3201 3202
-            3204:  7(f16vec4) CompositeExtract 3203 1
-                              Store 3099(texel) 3204
-            3205:     47(int) CompositeExtract 3203 0
-            3206:         357 Load 359(s2DRect)
-            3207:154(f16vec2) Load 156(f16c2)
-            3208:3102(ResType) ImageSparseSampleImplicitLod 3206 3207
-            3209:  7(f16vec4) CompositeExtract 3208 1
-                              Store 3099(texel) 3209
-            3210:     47(int) CompositeExtract 3208 0
-            3211:         371 Load 373(s2DRectShadow)
-            3212:  167(fvec3) Load 169(c3)
-            3213:    208(ptr) AccessChain 3099(texel) 207
-            3214:   52(float) CompositeExtract 3212 2
-            3215:3138(ResType) ImageSparseSampleDrefImplicitLod 3211 3212 3214
-            3216:6(float16_t) CompositeExtract 3215 1
-                              Store 3213 3216
-            3217:     47(int) CompositeExtract 3215 0
-            3218:         371 Load 373(s2DRectShadow)
-            3219:154(f16vec2) Load 156(f16c2)
-            3220:   52(float) Load 215(compare)
-            3221:    208(ptr) AccessChain 3099(texel) 207
-            3222:3138(ResType) ImageSparseSampleDrefImplicitLod 3218 3219 3220
-            3223:6(float16_t) CompositeExtract 3222 1
-                              Store 3221 3223
+            3201:         245 Load 247(sCubeShadow)
+            3202:175(f16vec3) Load 177(f16c3)
+            3203:   52(float) Load 215(compare)
+            3204:    208(ptr) AccessChain 3143(texel) 207
+            3205:6(float16_t) Load 137(f16bias)
+            3206:3182(ResType) ImageSparseSampleDrefImplicitLod 3201 3202 3203 Bias 3205
+            3207:6(float16_t) CompositeExtract 3206 1
+                              Store 3204 3207
+            3208:     47(int) CompositeExtract 3206 0
+            3209:         284 Load 286(s2DArray)
+            3210:  167(fvec3) Load 169(c3)
+            3211:3146(ResType) ImageSparseSampleImplicitLod 3209 3210
+            3212:  7(f16vec4) CompositeExtract 3211 1
+                              Store 3143(texel) 3212
+            3213:     47(int) CompositeExtract 3211 0
+            3214:         284 Load 286(s2DArray)
+            3215:175(f16vec3) Load 177(f16c3)
+            3216:6(float16_t) Load 137(f16bias)
+            3217:3146(ResType) ImageSparseSampleImplicitLod 3214 3215 Bias 3216
+            3218:  7(f16vec4) CompositeExtract 3217 1
+                              Store 3143(texel) 3218
+            3219:     47(int) CompositeExtract 3217 0
+            3220:         299 Load 301(sCubeArray)
+            3221:  249(fvec4) Load 251(c4)
+            3222:3146(ResType) ImageSparseSampleImplicitLod 3220 3221
+            3223:  7(f16vec4) CompositeExtract 3222 1
+                              Store 3143(texel) 3223
             3224:     47(int) CompositeExtract 3222 0
-            3225:         391 Load 393(sCubeArrayShadow)
-            3226:  249(fvec4) Load 251(c4)
-            3227:   52(float) Load 215(compare)
-            3228:    208(ptr) AccessChain 3099(texel) 207
-            3229:3138(ResType) ImageSparseSampleDrefImplicitLod 3225 3226 3227
-            3230:6(float16_t) CompositeExtract 3229 1
-                              Store 3228 3230
-            3231:     47(int) CompositeExtract 3229 0
-            3232:         391 Load 393(sCubeArrayShadow)
-            3233:  7(f16vec4) Load 309(f16c4)
-            3234:   52(float) Load 215(compare)
-            3235:    208(ptr) AccessChain 3099(texel) 207
-            3236:3138(ResType) ImageSparseSampleDrefImplicitLod 3232 3233 3234
-            3237:6(float16_t) CompositeExtract 3236 1
-                              Store 3235 3237
-            3238:     47(int) CompositeExtract 3236 0
-            3239:  7(f16vec4) Load 3099(texel)
-                              ReturnValue 3239
+            3225:         299 Load 301(sCubeArray)
+            3226:  7(f16vec4) Load 309(f16c4)
+            3227:6(float16_t) Load 137(f16bias)
+            3228:3146(ResType) ImageSparseSampleImplicitLod 3225 3226 Bias 3227
+            3229:  7(f16vec4) CompositeExtract 3228 1
+                              Store 3143(texel) 3229
+            3230:     47(int) CompositeExtract 3228 0
+            3231:         337 Load 339(s2DArrayShadow)
+            3232:  249(fvec4) Load 251(c4)
+            3233:    208(ptr) AccessChain 3143(texel) 207
+            3234:   52(float) CompositeExtract 3232 3
+            3235:3182(ResType) ImageSparseSampleDrefImplicitLod 3231 3232 3234
+            3236:6(float16_t) CompositeExtract 3235 1
+                              Store 3233 3236
+            3237:     47(int) CompositeExtract 3235 0
+            3238:         337 Load 339(s2DArrayShadow)
+            3239:175(f16vec3) Load 177(f16c3)
+            3240:   52(float) Load 215(compare)
+            3241:    208(ptr) AccessChain 3143(texel) 207
+            3242:3182(ResType) ImageSparseSampleDrefImplicitLod 3238 3239 3240
+            3243:6(float16_t) CompositeExtract 3242 1
+                              Store 3241 3243
+            3244:     47(int) CompositeExtract 3242 0
+            3245:         357 Load 359(s2DRect)
+            3246:   53(fvec2) Load 148(c2)
+            3247:3146(ResType) ImageSparseSampleImplicitLod 3245 3246
+            3248:  7(f16vec4) CompositeExtract 3247 1
+                              Store 3143(texel) 3248
+            3249:     47(int) CompositeExtract 3247 0
+            3250:         357 Load 359(s2DRect)
+            3251:154(f16vec2) Load 156(f16c2)
+            3252:3146(ResType) ImageSparseSampleImplicitLod 3250 3251
+            3253:  7(f16vec4) CompositeExtract 3252 1
+                              Store 3143(texel) 3253
+            3254:     47(int) CompositeExtract 3252 0
+            3255:         371 Load 373(s2DRectShadow)
+            3256:  167(fvec3) Load 169(c3)
+            3257:    208(ptr) AccessChain 3143(texel) 207
+            3258:   52(float) CompositeExtract 3256 2
+            3259:3182(ResType) ImageSparseSampleDrefImplicitLod 3255 3256 3258
+            3260:6(float16_t) CompositeExtract 3259 1
+                              Store 3257 3260
+            3261:     47(int) CompositeExtract 3259 0
+            3262:         371 Load 373(s2DRectShadow)
+            3263:154(f16vec2) Load 156(f16c2)
+            3264:   52(float) Load 215(compare)
+            3265:    208(ptr) AccessChain 3143(texel) 207
+            3266:3182(ResType) ImageSparseSampleDrefImplicitLod 3262 3263 3264
+            3267:6(float16_t) CompositeExtract 3266 1
+                              Store 3265 3267
+            3268:     47(int) CompositeExtract 3266 0
+            3269:         391 Load 393(sCubeArrayShadow)
+            3270:  249(fvec4) Load 251(c4)
+            3271:   52(float) Load 215(compare)
+            3272:    208(ptr) AccessChain 3143(texel) 207
+            3273:3182(ResType) ImageSparseSampleDrefImplicitLod 3269 3270 3271
+            3274:6(float16_t) CompositeExtract 3273 1
+                              Store 3272 3274
+            3275:     47(int) CompositeExtract 3273 0
+            3276:         391 Load 393(sCubeArrayShadow)
+            3277:  7(f16vec4) Load 309(f16c4)
+            3278:   52(float) Load 215(compare)
+            3279:    208(ptr) AccessChain 3143(texel) 207
+            3280:3182(ResType) ImageSparseSampleDrefImplicitLod 3276 3277 3278
+            3281:6(float16_t) CompositeExtract 3280 1
+                              Store 3279 3281
+            3282:     47(int) CompositeExtract 3280 0
+            3283:  7(f16vec4) Load 3143(texel)
+                              ReturnValue 3283
                               FunctionEnd
 71(testSparseTextureLod():  7(f16vec4) Function None 8
               72:             Label
-     3242(texel):     64(ptr) Variable Function
-                              Store 3242(texel) 121
-            3243:         143 Load 145(s2D)
-            3244:   53(fvec2) Load 148(c2)
-            3245:   52(float) Load 565(lod)
-            3246:3102(ResType) ImageSparseSampleExplicitLod 3243 3244 Lod 3245
-            3247:  7(f16vec4) CompositeExtract 3246 1
-                              Store 3242(texel) 3247
-            3248:     47(int) CompositeExtract 3246 0
-            3249:         143 Load 145(s2D)
-            3250:154(f16vec2) Load 156(f16c2)
-            3251:6(float16_t) Load 572(f16lod)
-            3252:3102(ResType) ImageSparseSampleExplicitLod 3249 3250 Lod 3251
-            3253:  7(f16vec4) CompositeExtract 3252 1
-                              Store 3242(texel) 3253
-            3254:     47(int) CompositeExtract 3252 0
-            3255:         163 Load 165(s3D)
-            3256:  167(fvec3) Load 169(c3)
-            3257:   52(float) Load 565(lod)
-            3258:3102(ResType) ImageSparseSampleExplicitLod 3255 3256 Lod 3257
-            3259:  7(f16vec4) CompositeExtract 3258 1
-                              Store 3242(texel) 3259
-            3260:     47(int) CompositeExtract 3258 0
-            3261:         163 Load 165(s3D)
-            3262:175(f16vec3) Load 177(f16c3)
-            3263:6(float16_t) Load 572(f16lod)
-            3264:3102(ResType) ImageSparseSampleExplicitLod 3261 3262 Lod 3263
-            3265:  7(f16vec4) CompositeExtract 3264 1
-                              Store 3242(texel) 3265
-            3266:     47(int) CompositeExtract 3264 0
-            3267:         184 Load 186(sCube)
-            3268:  167(fvec3) Load 169(c3)
-            3269:   52(float) Load 565(lod)
-            3270:3102(ResType) ImageSparseSampleExplicitLod 3267 3268 Lod 3269
-            3271:  7(f16vec4) CompositeExtract 3270 1
-                              Store 3242(texel) 3271
-            3272:     47(int) CompositeExtract 3270 0
-            3273:         184 Load 186(sCube)
-            3274:175(f16vec3) Load 177(f16c3)
-            3275:6(float16_t) Load 572(f16lod)
-            3276:3102(ResType) ImageSparseSampleExplicitLod 3273 3274 Lod 3275
-            3277:  7(f16vec4) CompositeExtract 3276 1
-                              Store 3242(texel) 3277
-            3278:     47(int) CompositeExtract 3276 0
-            3279:         224 Load 226(s2DShadow)
-            3280:  167(fvec3) Load 169(c3)
-            3281:   52(float) Load 565(lod)
-            3282:    208(ptr) AccessChain 3242(texel) 207
-            3283:   52(float) CompositeExtract 3280 2
-            3284:3138(ResType) ImageSparseSampleDrefExplicitLod 3279 3280 3283 Lod 3281
-            3285:6(float16_t) CompositeExtract 3284 1
-                              Store 3282 3285
-            3286:     47(int) CompositeExtract 3284 0
-            3287:         224 Load 226(s2DShadow)
-            3288:154(f16vec2) Load 156(f16c2)
-            3289:   52(float) Load 215(compare)
-            3290:6(float16_t) Load 572(f16lod)
-            3291:    208(ptr) AccessChain 3242(texel) 207
-            3292:3138(ResType) ImageSparseSampleDrefExplicitLod 3287 3288 3289 Lod 3290
-            3293:6(float16_t) CompositeExtract 3292 1
-                              Store 3291 3293
-            3294:     47(int) CompositeExtract 3292 0
-            3295:         284 Load 286(s2DArray)
-            3296:  167(fvec3) Load 169(c3)
-            3297:   52(float) Load 565(lod)
-            3298:3102(ResType) ImageSparseSampleExplicitLod 3295 3296 Lod 3297
-            3299:  7(f16vec4) CompositeExtract 3298 1
-                              Store 3242(texel) 3299
-            3300:     47(int) CompositeExtract 3298 0
-            3301:         284 Load 286(s2DArray)
-            3302:175(f16vec3) Load 177(f16c3)
-            3303:6(float16_t) Load 572(f16lod)
-            3304:3102(ResType) ImageSparseSampleExplicitLod 3301 3302 Lod 3303
-            3305:  7(f16vec4) CompositeExtract 3304 1
-                              Store 3242(texel) 3305
-            3306:     47(int) CompositeExtract 3304 0
-            3307:         299 Load 301(sCubeArray)
-            3308:  249(fvec4) Load 251(c4)
-            3309:   52(float) Load 565(lod)
-            3310:3102(ResType) ImageSparseSampleExplicitLod 3307 3308 Lod 3309
-            3311:  7(f16vec4) CompositeExtract 3310 1
-                              Store 3242(texel) 3311
-            3312:     47(int) CompositeExtract 3310 0
-            3313:         299 Load 301(sCubeArray)
-            3314:  7(f16vec4) Load 309(f16c4)
-            3315:6(float16_t) Load 572(f16lod)
-            3316:3102(ResType) ImageSparseSampleExplicitLod 3313 3314 Lod 3315
-            3317:  7(f16vec4) CompositeExtract 3316 1
-                              Store 3242(texel) 3317
-            3318:     47(int) CompositeExtract 3316 0
-            3319:  7(f16vec4) Load 3242(texel)
-                              ReturnValue 3319
+     3286(texel):     64(ptr) Variable Function
+                              Store 3286(texel) 121
+            3287:         143 Load 145(s2D)
+            3288:   53(fvec2) Load 148(c2)
+            3289:   52(float) Load 565(lod)
+            3290:3146(ResType) ImageSparseSampleExplicitLod 3287 3288 Lod 3289
+            3291:  7(f16vec4) CompositeExtract 3290 1
+                              Store 3286(texel) 3291
+            3292:     47(int) CompositeExtract 3290 0
+            3293:         143 Load 145(s2D)
+            3294:154(f16vec2) Load 156(f16c2)
+            3295:6(float16_t) Load 572(f16lod)
+            3296:3146(ResType) ImageSparseSampleExplicitLod 3293 3294 Lod 3295
+            3297:  7(f16vec4) CompositeExtract 3296 1
+                              Store 3286(texel) 3297
+            3298:     47(int) CompositeExtract 3296 0
+            3299:         163 Load 165(s3D)
+            3300:  167(fvec3) Load 169(c3)
+            3301:   52(float) Load 565(lod)
+            3302:3146(ResType) ImageSparseSampleExplicitLod 3299 3300 Lod 3301
+            3303:  7(f16vec4) CompositeExtract 3302 1
+                              Store 3286(texel) 3303
+            3304:     47(int) CompositeExtract 3302 0
+            3305:         163 Load 165(s3D)
+            3306:175(f16vec3) Load 177(f16c3)
+            3307:6(float16_t) Load 572(f16lod)
+            3308:3146(ResType) ImageSparseSampleExplicitLod 3305 3306 Lod 3307
+            3309:  7(f16vec4) CompositeExtract 3308 1
+                              Store 3286(texel) 3309
+            3310:     47(int) CompositeExtract 3308 0
+            3311:         184 Load 186(sCube)
+            3312:  167(fvec3) Load 169(c3)
+            3313:   52(float) Load 565(lod)
+            3314:3146(ResType) ImageSparseSampleExplicitLod 3311 3312 Lod 3313
+            3315:  7(f16vec4) CompositeExtract 3314 1
+                              Store 3286(texel) 3315
+            3316:     47(int) CompositeExtract 3314 0
+            3317:         184 Load 186(sCube)
+            3318:175(f16vec3) Load 177(f16c3)
+            3319:6(float16_t) Load 572(f16lod)
+            3320:3146(ResType) ImageSparseSampleExplicitLod 3317 3318 Lod 3319
+            3321:  7(f16vec4) CompositeExtract 3320 1
+                              Store 3286(texel) 3321
+            3322:     47(int) CompositeExtract 3320 0
+            3323:         224 Load 226(s2DShadow)
+            3324:  167(fvec3) Load 169(c3)
+            3325:   52(float) Load 565(lod)
+            3326:    208(ptr) AccessChain 3286(texel) 207
+            3327:   52(float) CompositeExtract 3324 2
+            3328:3182(ResType) ImageSparseSampleDrefExplicitLod 3323 3324 3327 Lod 3325
+            3329:6(float16_t) CompositeExtract 3328 1
+                              Store 3326 3329
+            3330:     47(int) CompositeExtract 3328 0
+            3331:         224 Load 226(s2DShadow)
+            3332:154(f16vec2) Load 156(f16c2)
+            3333:   52(float) Load 215(compare)
+            3334:6(float16_t) Load 572(f16lod)
+            3335:    208(ptr) AccessChain 3286(texel) 207
+            3336:3182(ResType) ImageSparseSampleDrefExplicitLod 3331 3332 3333 Lod 3334
+            3337:6(float16_t) CompositeExtract 3336 1
+                              Store 3335 3337
+            3338:     47(int) CompositeExtract 3336 0
+            3339:         284 Load 286(s2DArray)
+            3340:  167(fvec3) Load 169(c3)
+            3341:   52(float) Load 565(lod)
+            3342:3146(ResType) ImageSparseSampleExplicitLod 3339 3340 Lod 3341
+            3343:  7(f16vec4) CompositeExtract 3342 1
+                              Store 3286(texel) 3343
+            3344:     47(int) CompositeExtract 3342 0
+            3345:         284 Load 286(s2DArray)
+            3346:175(f16vec3) Load 177(f16c3)
+            3347:6(float16_t) Load 572(f16lod)
+            3348:3146(ResType) ImageSparseSampleExplicitLod 3345 3346 Lod 3347
+            3349:  7(f16vec4) CompositeExtract 3348 1
+                              Store 3286(texel) 3349
+            3350:     47(int) CompositeExtract 3348 0
+            3351:         299 Load 301(sCubeArray)
+            3352:  249(fvec4) Load 251(c4)
+            3353:   52(float) Load 565(lod)
+            3354:3146(ResType) ImageSparseSampleExplicitLod 3351 3352 Lod 3353
+            3355:  7(f16vec4) CompositeExtract 3354 1
+                              Store 3286(texel) 3355
+            3356:     47(int) CompositeExtract 3354 0
+            3357:         299 Load 301(sCubeArray)
+            3358:  7(f16vec4) Load 309(f16c4)
+            3359:6(float16_t) Load 572(f16lod)
+            3360:3146(ResType) ImageSparseSampleExplicitLod 3357 3358 Lod 3359
+            3361:  7(f16vec4) CompositeExtract 3360 1
+                              Store 3286(texel) 3361
+            3362:     47(int) CompositeExtract 3360 0
+            3363:  7(f16vec4) Load 3286(texel)
+                              ReturnValue 3363
                               FunctionEnd
 73(testSparseTextureOffset():  7(f16vec4) Function None 8
               74:             Label
-     3322(texel):     64(ptr) Variable Function
-                              Store 3322(texel) 121
-            3323:         143 Load 145(s2D)
-            3324:   53(fvec2) Load 148(c2)
-            3325:3102(ResType) ImageSparseSampleImplicitLod 3323 3324 ConstOffset 722
-            3326:  7(f16vec4) CompositeExtract 3325 1
-                              Store 3322(texel) 3326
-            3327:     47(int) CompositeExtract 3325 0
-            3328:         143 Load 145(s2D)
-            3329:154(f16vec2) Load 156(f16c2)
-            3330:6(float16_t) Load 137(f16bias)
-            3331:3102(ResType) ImageSparseSampleImplicitLod 3328 3329 Bias ConstOffset 3330 722
-            3332:  7(f16vec4) CompositeExtract 3331 1
-                              Store 3322(texel) 3332
-            3333:     47(int) CompositeExtract 3331 0
-            3334:         163 Load 165(s3D)
-            3335:  167(fvec3) Load 169(c3)
-            3336:3102(ResType) ImageSparseSampleImplicitLod 3334 3335 ConstOffset 735
-            3337:  7(f16vec4) CompositeExtract 3336 1
-                              Store 3322(texel) 3337
-            3338:     47(int) CompositeExtract 3336 0
-            3339:         163 Load 165(s3D)
-            3340:175(f16vec3) Load 177(f16c3)
-            3341:6(float16_t) Load 137(f16bias)
-            3342:3102(ResType) ImageSparseSampleImplicitLod 3339 3340 Bias ConstOffset 3341 735
-            3343:  7(f16vec4) CompositeExtract 3342 1
-                              Store 3322(texel) 3343
-            3344:     47(int) CompositeExtract 3342 0
-            3345:         357 Load 359(s2DRect)
-            3346:   53(fvec2) Load 148(c2)
-            3347:3102(ResType) ImageSparseSampleImplicitLod 3345 3346 ConstOffset 722
-            3348:  7(f16vec4) CompositeExtract 3347 1
-                              Store 3322(texel) 3348
-            3349:     47(int) CompositeExtract 3347 0
-            3350:         357 Load 359(s2DRect)
-            3351:154(f16vec2) Load 156(f16c2)
-            3352:3102(ResType) ImageSparseSampleImplicitLod 3350 3351 ConstOffset 722
-            3353:  7(f16vec4) CompositeExtract 3352 1
-                              Store 3322(texel) 3353
-            3354:     47(int) CompositeExtract 3352 0
-            3355:         371 Load 373(s2DRectShadow)
-            3356:  167(fvec3) Load 169(c3)
-            3357:    208(ptr) AccessChain 3322(texel) 207
-            3358:   52(float) CompositeExtract 3356 2
-            3359:3138(ResType) ImageSparseSampleDrefImplicitLod 3355 3356 3358 ConstOffset 722
-            3360:6(float16_t) CompositeExtract 3359 1
-                              Store 3357 3360
-            3361:     47(int) CompositeExtract 3359 0
-            3362:         371 Load 373(s2DRectShadow)
-            3363:154(f16vec2) Load 156(f16c2)
-            3364:   52(float) Load 215(compare)
-            3365:    208(ptr) AccessChain 3322(texel) 207
-            3366:3138(ResType) ImageSparseSampleDrefImplicitLod 3362 3363 3364 ConstOffset 722
-            3367:6(float16_t) CompositeExtract 3366 1
-                              Store 3365 3367
-            3368:     47(int) CompositeExtract 3366 0
-            3369:         224 Load 226(s2DShadow)
-            3370:  167(fvec3) Load 169(c3)
-            3371:    208(ptr) AccessChain 3322(texel) 207
-            3372:   52(float) CompositeExtract 3370 2
-            3373:3138(ResType) ImageSparseSampleDrefImplicitLod 3369 3370 3372 ConstOffset 722
-            3374:6(float16_t) CompositeExtract 3373 1
-                              Store 3371 3374
-            3375:     47(int) CompositeExtract 3373 0
-            3376:         224 Load 226(s2DShadow)
-            3377:154(f16vec2) Load 156(f16c2)
-            3378:   52(float) Load 215(compare)
-            3379:    208(ptr) AccessChain 3322(texel) 207
-            3380:6(float16_t) Load 137(f16bias)
-            3381:3138(ResType) ImageSparseSampleDrefImplicitLod 3376 3377 3378 Bias ConstOffset 3380 722
-            3382:6(float16_t) CompositeExtract 3381 1
-                              Store 3379 3382
-            3383:     47(int) CompositeExtract 3381 0
-            3384:         284 Load 286(s2DArray)
-            3385:  167(fvec3) Load 169(c3)
-            3386:3102(ResType) ImageSparseSampleImplicitLod 3384 3385 ConstOffset 722
+     3366(texel):     64(ptr) Variable Function
+                              Store 3366(texel) 121
+            3367:         143 Load 145(s2D)
+            3368:   53(fvec2) Load 148(c2)
+            3369:3146(ResType) ImageSparseSampleImplicitLod 3367 3368 ConstOffset 722
+            3370:  7(f16vec4) CompositeExtract 3369 1
+                              Store 3366(texel) 3370
+            3371:     47(int) CompositeExtract 3369 0
+            3372:         143 Load 145(s2D)
+            3373:154(f16vec2) Load 156(f16c2)
+            3374:6(float16_t) Load 137(f16bias)
+            3375:3146(ResType) ImageSparseSampleImplicitLod 3372 3373 Bias ConstOffset 3374 722
+            3376:  7(f16vec4) CompositeExtract 3375 1
+                              Store 3366(texel) 3376
+            3377:     47(int) CompositeExtract 3375 0
+            3378:         163 Load 165(s3D)
+            3379:  167(fvec3) Load 169(c3)
+            3380:3146(ResType) ImageSparseSampleImplicitLod 3378 3379 ConstOffset 735
+            3381:  7(f16vec4) CompositeExtract 3380 1
+                              Store 3366(texel) 3381
+            3382:     47(int) CompositeExtract 3380 0
+            3383:         163 Load 165(s3D)
+            3384:175(f16vec3) Load 177(f16c3)
+            3385:6(float16_t) Load 137(f16bias)
+            3386:3146(ResType) ImageSparseSampleImplicitLod 3383 3384 Bias ConstOffset 3385 735
             3387:  7(f16vec4) CompositeExtract 3386 1
-                              Store 3322(texel) 3387
+                              Store 3366(texel) 3387
             3388:     47(int) CompositeExtract 3386 0
-            3389:         284 Load 286(s2DArray)
-            3390:175(f16vec3) Load 177(f16c3)
-            3391:6(float16_t) Load 137(f16bias)
-            3392:3102(ResType) ImageSparseSampleImplicitLod 3389 3390 Bias ConstOffset 3391 722
-            3393:  7(f16vec4) CompositeExtract 3392 1
-                              Store 3322(texel) 3393
-            3394:     47(int) CompositeExtract 3392 0
-            3395:         337 Load 339(s2DArrayShadow)
-            3396:  249(fvec4) Load 251(c4)
-            3397:    208(ptr) AccessChain 3322(texel) 207
-            3398:   52(float) CompositeExtract 3396 3
-            3399:3138(ResType) ImageSparseSampleDrefImplicitLod 3395 3396 3398 ConstOffset 722
-            3400:6(float16_t) CompositeExtract 3399 1
-                              Store 3397 3400
-            3401:     47(int) CompositeExtract 3399 0
-            3402:         337 Load 339(s2DArrayShadow)
-            3403:175(f16vec3) Load 177(f16c3)
-            3404:   52(float) Load 215(compare)
-            3405:    208(ptr) AccessChain 3322(texel) 207
-            3406:3138(ResType) ImageSparseSampleDrefImplicitLod 3402 3403 3404 ConstOffset 722
-            3407:6(float16_t) CompositeExtract 3406 1
-                              Store 3405 3407
-            3408:     47(int) CompositeExtract 3406 0
-            3409:  7(f16vec4) Load 3322(texel)
-                              ReturnValue 3409
-                              FunctionEnd
-75(testSparseTextureLodOffset():  7(f16vec4) Function None 8
-              76:             Label
-     3412(texel):     64(ptr) Variable Function
-                              Store 3412(texel) 121
-            3413:         143 Load 145(s2D)
-            3414:   53(fvec2) Load 148(c2)
-            3415:   52(float) Load 565(lod)
-            3416:3102(ResType) ImageSparseSampleExplicitLod 3413 3414 Lod ConstOffset 3415 722
-            3417:  7(f16vec4) CompositeExtract 3416 1
-                              Store 3412(texel) 3417
-            3418:     47(int) CompositeExtract 3416 0
-            3419:         143 Load 145(s2D)
-            3420:154(f16vec2) Load 156(f16c2)
-            3421:6(float16_t) Load 572(f16lod)
-            3422:3102(ResType) ImageSparseSampleExplicitLod 3419 3420 Lod ConstOffset 3421 722
-            3423:  7(f16vec4) CompositeExtract 3422 1
-                              Store 3412(texel) 3423
-            3424:     47(int) CompositeExtract 3422 0
-            3425:         163 Load 165(s3D)
-            3426:  167(fvec3) Load 169(c3)
-            3427:   52(float) Load 565(lod)
-            3428:3102(ResType) ImageSparseSampleExplicitLod 3425 3426 Lod ConstOffset 3427 735
-            3429:  7(f16vec4) CompositeExtract 3428 1
-                              Store 3412(texel) 3429
-            3430:     47(int) CompositeExtract 3428 0
-            3431:         163 Load 165(s3D)
-            3432:175(f16vec3) Load 177(f16c3)
-            3433:6(float16_t) Load 572(f16lod)
-            3434:3102(ResType) ImageSparseSampleExplicitLod 3431 3432 Lod ConstOffset 3433 735
-            3435:  7(f16vec4) CompositeExtract 3434 1
-                              Store 3412(texel) 3435
-            3436:     47(int) CompositeExtract 3434 0
-            3437:         224 Load 226(s2DShadow)
-            3438:  167(fvec3) Load 169(c3)
-            3439:   52(float) Load 565(lod)
-            3440:    208(ptr) AccessChain 3412(texel) 207
-            3441:   52(float) CompositeExtract 3438 2
-            3442:3138(ResType) ImageSparseSampleDrefExplicitLod 3437 3438 3441 Lod ConstOffset 3439 722
-            3443:6(float16_t) CompositeExtract 3442 1
-                              Store 3440 3443
-            3444:     47(int) CompositeExtract 3442 0
-            3445:         224 Load 226(s2DShadow)
-            3446:154(f16vec2) Load 156(f16c2)
-            3447:   52(float) Load 215(compare)
-            3448:6(float16_t) Load 572(f16lod)
-            3449:    208(ptr) AccessChain 3412(texel) 207
-            3450:3138(ResType) ImageSparseSampleDrefExplicitLod 3445 3446 3447 Lod ConstOffset 3448 722
+            3389:         357 Load 359(s2DRect)
+            3390:   53(fvec2) Load 148(c2)
+            3391:3146(ResType) ImageSparseSampleImplicitLod 3389 3390 ConstOffset 722
+            3392:  7(f16vec4) CompositeExtract 3391 1
+                              Store 3366(texel) 3392
+            3393:     47(int) CompositeExtract 3391 0
+            3394:         357 Load 359(s2DRect)
+            3395:154(f16vec2) Load 156(f16c2)
+            3396:3146(ResType) ImageSparseSampleImplicitLod 3394 3395 ConstOffset 722
+            3397:  7(f16vec4) CompositeExtract 3396 1
+                              Store 3366(texel) 3397
+            3398:     47(int) CompositeExtract 3396 0
+            3399:         371 Load 373(s2DRectShadow)
+            3400:  167(fvec3) Load 169(c3)
+            3401:    208(ptr) AccessChain 3366(texel) 207
+            3402:   52(float) CompositeExtract 3400 2
+            3403:3182(ResType) ImageSparseSampleDrefImplicitLod 3399 3400 3402 ConstOffset 722
+            3404:6(float16_t) CompositeExtract 3403 1
+                              Store 3401 3404
+            3405:     47(int) CompositeExtract 3403 0
+            3406:         371 Load 373(s2DRectShadow)
+            3407:154(f16vec2) Load 156(f16c2)
+            3408:   52(float) Load 215(compare)
+            3409:    208(ptr) AccessChain 3366(texel) 207
+            3410:3182(ResType) ImageSparseSampleDrefImplicitLod 3406 3407 3408 ConstOffset 722
+            3411:6(float16_t) CompositeExtract 3410 1
+                              Store 3409 3411
+            3412:     47(int) CompositeExtract 3410 0
+            3413:         224 Load 226(s2DShadow)
+            3414:  167(fvec3) Load 169(c3)
+            3415:    208(ptr) AccessChain 3366(texel) 207
+            3416:   52(float) CompositeExtract 3414 2
+            3417:3182(ResType) ImageSparseSampleDrefImplicitLod 3413 3414 3416 ConstOffset 722
+            3418:6(float16_t) CompositeExtract 3417 1
+                              Store 3415 3418
+            3419:     47(int) CompositeExtract 3417 0
+            3420:         224 Load 226(s2DShadow)
+            3421:154(f16vec2) Load 156(f16c2)
+            3422:   52(float) Load 215(compare)
+            3423:    208(ptr) AccessChain 3366(texel) 207
+            3424:6(float16_t) Load 137(f16bias)
+            3425:3182(ResType) ImageSparseSampleDrefImplicitLod 3420 3421 3422 Bias ConstOffset 3424 722
+            3426:6(float16_t) CompositeExtract 3425 1
+                              Store 3423 3426
+            3427:     47(int) CompositeExtract 3425 0
+            3428:         284 Load 286(s2DArray)
+            3429:  167(fvec3) Load 169(c3)
+            3430:3146(ResType) ImageSparseSampleImplicitLod 3428 3429 ConstOffset 722
+            3431:  7(f16vec4) CompositeExtract 3430 1
+                              Store 3366(texel) 3431
+            3432:     47(int) CompositeExtract 3430 0
+            3433:         284 Load 286(s2DArray)
+            3434:175(f16vec3) Load 177(f16c3)
+            3435:6(float16_t) Load 137(f16bias)
+            3436:3146(ResType) ImageSparseSampleImplicitLod 3433 3434 Bias ConstOffset 3435 722
+            3437:  7(f16vec4) CompositeExtract 3436 1
+                              Store 3366(texel) 3437
+            3438:     47(int) CompositeExtract 3436 0
+            3439:         337 Load 339(s2DArrayShadow)
+            3440:  249(fvec4) Load 251(c4)
+            3441:    208(ptr) AccessChain 3366(texel) 207
+            3442:   52(float) CompositeExtract 3440 3
+            3443:3182(ResType) ImageSparseSampleDrefImplicitLod 3439 3440 3442 ConstOffset 722
+            3444:6(float16_t) CompositeExtract 3443 1
+                              Store 3441 3444
+            3445:     47(int) CompositeExtract 3443 0
+            3446:         337 Load 339(s2DArrayShadow)
+            3447:175(f16vec3) Load 177(f16c3)
+            3448:   52(float) Load 215(compare)
+            3449:    208(ptr) AccessChain 3366(texel) 207
+            3450:3182(ResType) ImageSparseSampleDrefImplicitLod 3446 3447 3448 ConstOffset 722
             3451:6(float16_t) CompositeExtract 3450 1
                               Store 3449 3451
             3452:     47(int) CompositeExtract 3450 0
-            3453:         284 Load 286(s2DArray)
-            3454:  167(fvec3) Load 169(c3)
-            3455:   52(float) Load 565(lod)
-            3456:3102(ResType) ImageSparseSampleExplicitLod 3453 3454 Lod ConstOffset 3455 722
-            3457:  7(f16vec4) CompositeExtract 3456 1
-                              Store 3412(texel) 3457
-            3458:     47(int) CompositeExtract 3456 0
-            3459:         284 Load 286(s2DArray)
-            3460:175(f16vec3) Load 177(f16c3)
-            3461:6(float16_t) Load 572(f16lod)
-            3462:3102(ResType) ImageSparseSampleExplicitLod 3459 3460 Lod ConstOffset 3461 722
-            3463:  7(f16vec4) CompositeExtract 3462 1
-                              Store 3412(texel) 3463
-            3464:     47(int) CompositeExtract 3462 0
-            3465:  7(f16vec4) Load 3412(texel)
-                              ReturnValue 3465
+            3453:  7(f16vec4) Load 3366(texel)
+                              ReturnValue 3453
+                              FunctionEnd
+75(testSparseTextureLodOffset():  7(f16vec4) Function None 8
+              76:             Label
+     3456(texel):     64(ptr) Variable Function
+                              Store 3456(texel) 121
+            3457:         143 Load 145(s2D)
+            3458:   53(fvec2) Load 148(c2)
+            3459:   52(float) Load 565(lod)
+            3460:3146(ResType) ImageSparseSampleExplicitLod 3457 3458 Lod ConstOffset 3459 722
+            3461:  7(f16vec4) CompositeExtract 3460 1
+                              Store 3456(texel) 3461
+            3462:     47(int) CompositeExtract 3460 0
+            3463:         143 Load 145(s2D)
+            3464:154(f16vec2) Load 156(f16c2)
+            3465:6(float16_t) Load 572(f16lod)
+            3466:3146(ResType) ImageSparseSampleExplicitLod 3463 3464 Lod ConstOffset 3465 722
+            3467:  7(f16vec4) CompositeExtract 3466 1
+                              Store 3456(texel) 3467
+            3468:     47(int) CompositeExtract 3466 0
+            3469:         163 Load 165(s3D)
+            3470:  167(fvec3) Load 169(c3)
+            3471:   52(float) Load 565(lod)
+            3472:3146(ResType) ImageSparseSampleExplicitLod 3469 3470 Lod ConstOffset 3471 735
+            3473:  7(f16vec4) CompositeExtract 3472 1
+                              Store 3456(texel) 3473
+            3474:     47(int) CompositeExtract 3472 0
+            3475:         163 Load 165(s3D)
+            3476:175(f16vec3) Load 177(f16c3)
+            3477:6(float16_t) Load 572(f16lod)
+            3478:3146(ResType) ImageSparseSampleExplicitLod 3475 3476 Lod ConstOffset 3477 735
+            3479:  7(f16vec4) CompositeExtract 3478 1
+                              Store 3456(texel) 3479
+            3480:     47(int) CompositeExtract 3478 0
+            3481:         224 Load 226(s2DShadow)
+            3482:  167(fvec3) Load 169(c3)
+            3483:   52(float) Load 565(lod)
+            3484:    208(ptr) AccessChain 3456(texel) 207
+            3485:   52(float) CompositeExtract 3482 2
+            3486:3182(ResType) ImageSparseSampleDrefExplicitLod 3481 3482 3485 Lod ConstOffset 3483 722
+            3487:6(float16_t) CompositeExtract 3486 1
+                              Store 3484 3487
+            3488:     47(int) CompositeExtract 3486 0
+            3489:         224 Load 226(s2DShadow)
+            3490:154(f16vec2) Load 156(f16c2)
+            3491:   52(float) Load 215(compare)
+            3492:6(float16_t) Load 572(f16lod)
+            3493:    208(ptr) AccessChain 3456(texel) 207
+            3494:3182(ResType) ImageSparseSampleDrefExplicitLod 3489 3490 3491 Lod ConstOffset 3492 722
+            3495:6(float16_t) CompositeExtract 3494 1
+                              Store 3493 3495
+            3496:     47(int) CompositeExtract 3494 0
+            3497:         284 Load 286(s2DArray)
+            3498:  167(fvec3) Load 169(c3)
+            3499:   52(float) Load 565(lod)
+            3500:3146(ResType) ImageSparseSampleExplicitLod 3497 3498 Lod ConstOffset 3499 722
+            3501:  7(f16vec4) CompositeExtract 3500 1
+                              Store 3456(texel) 3501
+            3502:     47(int) CompositeExtract 3500 0
+            3503:         284 Load 286(s2DArray)
+            3504:175(f16vec3) Load 177(f16c3)
+            3505:6(float16_t) Load 572(f16lod)
+            3506:3146(ResType) ImageSparseSampleExplicitLod 3503 3504 Lod ConstOffset 3505 722
+            3507:  7(f16vec4) CompositeExtract 3506 1
+                              Store 3456(texel) 3507
+            3508:     47(int) CompositeExtract 3506 0
+            3509:  7(f16vec4) Load 3456(texel)
+                              ReturnValue 3509
                               FunctionEnd
 77(testSparseTextureGrad():  7(f16vec4) Function None 8
               78:             Label
-     3468(texel):     64(ptr) Variable Function
-                              Store 3468(texel) 121
-            3469:         143 Load 145(s2D)
-            3470:   53(fvec2) Load 148(c2)
-            3471:   53(fvec2) Load 1409(dPdxy2)
-            3472:   53(fvec2) Load 1409(dPdxy2)
-            3473:3102(ResType) ImageSparseSampleExplicitLod 3469 3470 Grad 3471 3472
-            3474:  7(f16vec4) CompositeExtract 3473 1
-                              Store 3468(texel) 3474
-            3475:     47(int) CompositeExtract 3473 0
-            3476:         143 Load 145(s2D)
-            3477:154(f16vec2) Load 156(f16c2)
-            3478:154(f16vec2) Load 1417(f16dPdxy2)
-            3479:154(f16vec2) Load 1417(f16dPdxy2)
-            3480:3102(ResType) ImageSparseSampleExplicitLod 3476 3477 Grad 3478 3479
-            3481:  7(f16vec4) CompositeExtract 3480 1
-                              Store 3468(texel) 3481
-            3482:     47(int) CompositeExtract 3480 0
-            3483:         163 Load 165(s3D)
-            3484:  167(fvec3) Load 169(c3)
-            3485:  167(fvec3) Load 1425(dPdxy3)
-            3486:  167(fvec3) Load 1425(dPdxy3)
-            3487:3102(ResType) ImageSparseSampleExplicitLod 3483 3484 Grad 3485 3486
-            3488:  7(f16vec4) CompositeExtract 3487 1
-                              Store 3468(texel) 3488
-            3489:     47(int) CompositeExtract 3487 0
-            3490:         163 Load 165(s3D)
-            3491:175(f16vec3) Load 177(f16c3)
-            3492:175(f16vec3) Load 1433(f16dPdxy3)
-            3493:175(f16vec3) Load 1433(f16dPdxy3)
-            3494:3102(ResType) ImageSparseSampleExplicitLod 3490 3491 Grad 3492 3493
-            3495:  7(f16vec4) CompositeExtract 3494 1
-                              Store 3468(texel) 3495
-            3496:     47(int) CompositeExtract 3494 0
-            3497:         184 Load 186(sCube)
-            3498:  167(fvec3) Load 169(c3)
-            3499:  167(fvec3) Load 1425(dPdxy3)
-            3500:  167(fvec3) Load 1425(dPdxy3)
-            3501:3102(ResType) ImageSparseSampleExplicitLod 3497 3498 Grad 3499 3500
-            3502:  7(f16vec4) CompositeExtract 3501 1
-                              Store 3468(texel) 3502
-            3503:     47(int) CompositeExtract 3501 0
-            3504:         184 Load 186(sCube)
-            3505:175(f16vec3) Load 177(f16c3)
-            3506:175(f16vec3) Load 1433(f16dPdxy3)
-            3507:175(f16vec3) Load 1433(f16dPdxy3)
-            3508:3102(ResType) ImageSparseSampleExplicitLod 3504 3505 Grad 3506 3507
-            3509:  7(f16vec4) CompositeExtract 3508 1
-                              Store 3468(texel) 3509
-            3510:     47(int) CompositeExtract 3508 0
-            3511:         357 Load 359(s2DRect)
-            3512:   53(fvec2) Load 148(c2)
-            3513:   53(fvec2) Load 1409(dPdxy2)
-            3514:   53(fvec2) Load 1409(dPdxy2)
-            3515:3102(ResType) ImageSparseSampleExplicitLod 3511 3512 Grad 3513 3514
-            3516:  7(f16vec4) CompositeExtract 3515 1
-                              Store 3468(texel) 3516
-            3517:     47(int) CompositeExtract 3515 0
-            3518:         357 Load 359(s2DRect)
-            3519:154(f16vec2) Load 156(f16c2)
-            3520:154(f16vec2) Load 1417(f16dPdxy2)
-            3521:154(f16vec2) Load 1417(f16dPdxy2)
-            3522:3102(ResType) ImageSparseSampleExplicitLod 3518 3519 Grad 3520 3521
-            3523:  7(f16vec4) CompositeExtract 3522 1
-                              Store 3468(texel) 3523
-            3524:     47(int) CompositeExtract 3522 0
-            3525:         371 Load 373(s2DRectShadow)
-            3526:  167(fvec3) Load 169(c3)
-            3527:   53(fvec2) Load 1409(dPdxy2)
-            3528:   53(fvec2) Load 1409(dPdxy2)
-            3529:    208(ptr) AccessChain 3468(texel) 207
-            3530:   52(float) CompositeExtract 3526 2
-            3531:3138(ResType) ImageSparseSampleDrefExplicitLod 3525 3526 3530 Grad 3527 3528
-            3532:6(float16_t) CompositeExtract 3531 1
-                              Store 3529 3532
+     3512(texel):     64(ptr) Variable Function
+                              Store 3512(texel) 121
+            3513:         143 Load 145(s2D)
+            3514:   53(fvec2) Load 148(c2)
+            3515:   53(fvec2) Load 1409(dPdxy2)
+            3516:   53(fvec2) Load 1409(dPdxy2)
+            3517:3146(ResType) ImageSparseSampleExplicitLod 3513 3514 Grad 3515 3516
+            3518:  7(f16vec4) CompositeExtract 3517 1
+                              Store 3512(texel) 3518
+            3519:     47(int) CompositeExtract 3517 0
+            3520:         143 Load 145(s2D)
+            3521:154(f16vec2) Load 156(f16c2)
+            3522:154(f16vec2) Load 1417(f16dPdxy2)
+            3523:154(f16vec2) Load 1417(f16dPdxy2)
+            3524:3146(ResType) ImageSparseSampleExplicitLod 3520 3521 Grad 3522 3523
+            3525:  7(f16vec4) CompositeExtract 3524 1
+                              Store 3512(texel) 3525
+            3526:     47(int) CompositeExtract 3524 0
+            3527:         163 Load 165(s3D)
+            3528:  167(fvec3) Load 169(c3)
+            3529:  167(fvec3) Load 1425(dPdxy3)
+            3530:  167(fvec3) Load 1425(dPdxy3)
+            3531:3146(ResType) ImageSparseSampleExplicitLod 3527 3528 Grad 3529 3530
+            3532:  7(f16vec4) CompositeExtract 3531 1
+                              Store 3512(texel) 3532
             3533:     47(int) CompositeExtract 3531 0
-            3534:         371 Load 373(s2DRectShadow)
-            3535:154(f16vec2) Load 156(f16c2)
-            3536:   52(float) Load 215(compare)
-            3537:154(f16vec2) Load 1417(f16dPdxy2)
-            3538:154(f16vec2) Load 1417(f16dPdxy2)
-            3539:    208(ptr) AccessChain 3468(texel) 207
-            3540:3138(ResType) ImageSparseSampleDrefExplicitLod 3534 3535 3536 Grad 3537 3538
-            3541:6(float16_t) CompositeExtract 3540 1
-                              Store 3539 3541
-            3542:     47(int) CompositeExtract 3540 0
-            3543:         224 Load 226(s2DShadow)
-            3544:  167(fvec3) Load 169(c3)
-            3545:   53(fvec2) Load 1409(dPdxy2)
-            3546:   53(fvec2) Load 1409(dPdxy2)
-            3547:    208(ptr) AccessChain 3468(texel) 207
-            3548:   52(float) CompositeExtract 3544 2
-            3549:3138(ResType) ImageSparseSampleDrefExplicitLod 3543 3544 3548 Grad 3545 3546
-            3550:6(float16_t) CompositeExtract 3549 1
-                              Store 3547 3550
-            3551:     47(int) CompositeExtract 3549 0
-            3552:         224 Load 226(s2DShadow)
-            3553:154(f16vec2) Load 156(f16c2)
-            3554:   52(float) Load 215(compare)
-            3555:154(f16vec2) Load 1417(f16dPdxy2)
-            3556:154(f16vec2) Load 1417(f16dPdxy2)
-            3557:    208(ptr) AccessChain 3468(texel) 207
-            3558:3138(ResType) ImageSparseSampleDrefExplicitLod 3552 3553 3554 Grad 3555 3556
-            3559:6(float16_t) CompositeExtract 3558 1
-                              Store 3557 3559
-            3560:     47(int) CompositeExtract 3558 0
-            3561:         245 Load 247(sCubeShadow)
-            3562:  249(fvec4) Load 251(c4)
-            3563:  167(fvec3) Load 1425(dPdxy3)
-            3564:  167(fvec3) Load 1425(dPdxy3)
-            3565:    208(ptr) AccessChain 3468(texel) 207
-            3566:   52(float) CompositeExtract 3562 3
-            3567:3138(ResType) ImageSparseSampleDrefExplicitLod 3561 3562 3566 Grad 3563 3564
-            3568:6(float16_t) CompositeExtract 3567 1
-                              Store 3565 3568
-            3569:     47(int) CompositeExtract 3567 0
-            3570:         245 Load 247(sCubeShadow)
-            3571:175(f16vec3) Load 177(f16c3)
-            3572:   52(float) Load 215(compare)
-            3573:175(f16vec3) Load 1433(f16dPdxy3)
-            3574:175(f16vec3) Load 1433(f16dPdxy3)
-            3575:    208(ptr) AccessChain 3468(texel) 207
-            3576:3138(ResType) ImageSparseSampleDrefExplicitLod 3570 3571 3572 Grad 3573 3574
-            3577:6(float16_t) CompositeExtract 3576 1
-                              Store 3575 3577
-            3578:     47(int) CompositeExtract 3576 0
-            3579:         284 Load 286(s2DArray)
-            3580:  167(fvec3) Load 169(c3)
-            3581:   53(fvec2) Load 1409(dPdxy2)
-            3582:   53(fvec2) Load 1409(dPdxy2)
-            3583:3102(ResType) ImageSparseSampleExplicitLod 3579 3580 Grad 3581 3582
-            3584:  7(f16vec4) CompositeExtract 3583 1
-                              Store 3468(texel) 3584
-            3585:     47(int) CompositeExtract 3583 0
-            3586:         284 Load 286(s2DArray)
-            3587:175(f16vec3) Load 177(f16c3)
-            3588:154(f16vec2) Load 1417(f16dPdxy2)
-            3589:154(f16vec2) Load 1417(f16dPdxy2)
-            3590:3102(ResType) ImageSparseSampleExplicitLod 3586 3587 Grad 3588 3589
-            3591:  7(f16vec4) CompositeExtract 3590 1
-                              Store 3468(texel) 3591
-            3592:     47(int) CompositeExtract 3590 0
-            3593:         337 Load 339(s2DArrayShadow)
-            3594:  249(fvec4) Load 251(c4)
-            3595:   53(fvec2) Load 1409(dPdxy2)
-            3596:   53(fvec2) Load 1409(dPdxy2)
-            3597:    208(ptr) AccessChain 3468(texel) 207
-            3598:   52(float) CompositeExtract 3594 3
-            3599:3138(ResType) ImageSparseSampleDrefExplicitLod 3593 3594 3598 Grad 3595 3596
-            3600:6(float16_t) CompositeExtract 3599 1
-                              Store 3597 3600
-            3601:     47(int) CompositeExtract 3599 0
-            3602:         337 Load 339(s2DArrayShadow)
-            3603:175(f16vec3) Load 177(f16c3)
-            3604:   52(float) Load 215(compare)
-            3605:154(f16vec2) Load 1417(f16dPdxy2)
-            3606:154(f16vec2) Load 1417(f16dPdxy2)
-            3607:    208(ptr) AccessChain 3468(texel) 207
-            3608:3138(ResType) ImageSparseSampleDrefExplicitLod 3602 3603 3604 Grad 3605 3606
-            3609:6(float16_t) CompositeExtract 3608 1
-                              Store 3607 3609
-            3610:     47(int) CompositeExtract 3608 0
-            3611:         299 Load 301(sCubeArray)
-            3612:  249(fvec4) Load 251(c4)
-            3613:  167(fvec3) Load 1425(dPdxy3)
-            3614:  167(fvec3) Load 1425(dPdxy3)
-            3615:3102(ResType) ImageSparseSampleExplicitLod 3611 3612 Grad 3613 3614
-            3616:  7(f16vec4) CompositeExtract 3615 1
-                              Store 3468(texel) 3616
-            3617:     47(int) CompositeExtract 3615 0
-            3618:         299 Load 301(sCubeArray)
-            3619:  7(f16vec4) Load 309(f16c4)
-            3620:175(f16vec3) Load 1433(f16dPdxy3)
-            3621:175(f16vec3) Load 1433(f16dPdxy3)
-            3622:3102(ResType) ImageSparseSampleExplicitLod 3618 3619 Grad 3620 3621
-            3623:  7(f16vec4) CompositeExtract 3622 1
-                              Store 3468(texel) 3623
-            3624:     47(int) CompositeExtract 3622 0
-            3625:  7(f16vec4) Load 3468(texel)
-                              ReturnValue 3625
+            3534:         163 Load 165(s3D)
+            3535:175(f16vec3) Load 177(f16c3)
+            3536:175(f16vec3) Load 1433(f16dPdxy3)
+            3537:175(f16vec3) Load 1433(f16dPdxy3)
+            3538:3146(ResType) ImageSparseSampleExplicitLod 3534 3535 Grad 3536 3537
+            3539:  7(f16vec4) CompositeExtract 3538 1
+                              Store 3512(texel) 3539
+            3540:     47(int) CompositeExtract 3538 0
+            3541:         184 Load 186(sCube)
+            3542:  167(fvec3) Load 169(c3)
+            3543:  167(fvec3) Load 1425(dPdxy3)
+            3544:  167(fvec3) Load 1425(dPdxy3)
+            3545:3146(ResType) ImageSparseSampleExplicitLod 3541 3542 Grad 3543 3544
+            3546:  7(f16vec4) CompositeExtract 3545 1
+                              Store 3512(texel) 3546
+            3547:     47(int) CompositeExtract 3545 0
+            3548:         184 Load 186(sCube)
+            3549:175(f16vec3) Load 177(f16c3)
+            3550:175(f16vec3) Load 1433(f16dPdxy3)
+            3551:175(f16vec3) Load 1433(f16dPdxy3)
+            3552:3146(ResType) ImageSparseSampleExplicitLod 3548 3549 Grad 3550 3551
+            3553:  7(f16vec4) CompositeExtract 3552 1
+                              Store 3512(texel) 3553
+            3554:     47(int) CompositeExtract 3552 0
+            3555:         357 Load 359(s2DRect)
+            3556:   53(fvec2) Load 148(c2)
+            3557:   53(fvec2) Load 1409(dPdxy2)
+            3558:   53(fvec2) Load 1409(dPdxy2)
+            3559:3146(ResType) ImageSparseSampleExplicitLod 3555 3556 Grad 3557 3558
+            3560:  7(f16vec4) CompositeExtract 3559 1
+                              Store 3512(texel) 3560
+            3561:     47(int) CompositeExtract 3559 0
+            3562:         357 Load 359(s2DRect)
+            3563:154(f16vec2) Load 156(f16c2)
+            3564:154(f16vec2) Load 1417(f16dPdxy2)
+            3565:154(f16vec2) Load 1417(f16dPdxy2)
+            3566:3146(ResType) ImageSparseSampleExplicitLod 3562 3563 Grad 3564 3565
+            3567:  7(f16vec4) CompositeExtract 3566 1
+                              Store 3512(texel) 3567
+            3568:     47(int) CompositeExtract 3566 0
+            3569:         371 Load 373(s2DRectShadow)
+            3570:  167(fvec3) Load 169(c3)
+            3571:   53(fvec2) Load 1409(dPdxy2)
+            3572:   53(fvec2) Load 1409(dPdxy2)
+            3573:    208(ptr) AccessChain 3512(texel) 207
+            3574:   52(float) CompositeExtract 3570 2
+            3575:3182(ResType) ImageSparseSampleDrefExplicitLod 3569 3570 3574 Grad 3571 3572
+            3576:6(float16_t) CompositeExtract 3575 1
+                              Store 3573 3576
+            3577:     47(int) CompositeExtract 3575 0
+            3578:         371 Load 373(s2DRectShadow)
+            3579:154(f16vec2) Load 156(f16c2)
+            3580:   52(float) Load 215(compare)
+            3581:154(f16vec2) Load 1417(f16dPdxy2)
+            3582:154(f16vec2) Load 1417(f16dPdxy2)
+            3583:    208(ptr) AccessChain 3512(texel) 207
+            3584:3182(ResType) ImageSparseSampleDrefExplicitLod 3578 3579 3580 Grad 3581 3582
+            3585:6(float16_t) CompositeExtract 3584 1
+                              Store 3583 3585
+            3586:     47(int) CompositeExtract 3584 0
+            3587:         224 Load 226(s2DShadow)
+            3588:  167(fvec3) Load 169(c3)
+            3589:   53(fvec2) Load 1409(dPdxy2)
+            3590:   53(fvec2) Load 1409(dPdxy2)
+            3591:    208(ptr) AccessChain 3512(texel) 207
+            3592:   52(float) CompositeExtract 3588 2
+            3593:3182(ResType) ImageSparseSampleDrefExplicitLod 3587 3588 3592 Grad 3589 3590
+            3594:6(float16_t) CompositeExtract 3593 1
+                              Store 3591 3594
+            3595:     47(int) CompositeExtract 3593 0
+            3596:         224 Load 226(s2DShadow)
+            3597:154(f16vec2) Load 156(f16c2)
+            3598:   52(float) Load 215(compare)
+            3599:154(f16vec2) Load 1417(f16dPdxy2)
+            3600:154(f16vec2) Load 1417(f16dPdxy2)
+            3601:    208(ptr) AccessChain 3512(texel) 207
+            3602:3182(ResType) ImageSparseSampleDrefExplicitLod 3596 3597 3598 Grad 3599 3600
+            3603:6(float16_t) CompositeExtract 3602 1
+                              Store 3601 3603
+            3604:     47(int) CompositeExtract 3602 0
+            3605:         245 Load 247(sCubeShadow)
+            3606:  249(fvec4) Load 251(c4)
+            3607:  167(fvec3) Load 1425(dPdxy3)
+            3608:  167(fvec3) Load 1425(dPdxy3)
+            3609:    208(ptr) AccessChain 3512(texel) 207
+            3610:   52(float) CompositeExtract 3606 3
+            3611:3182(ResType) ImageSparseSampleDrefExplicitLod 3605 3606 3610 Grad 3607 3608
+            3612:6(float16_t) CompositeExtract 3611 1
+                              Store 3609 3612
+            3613:     47(int) CompositeExtract 3611 0
+            3614:         245 Load 247(sCubeShadow)
+            3615:175(f16vec3) Load 177(f16c3)
+            3616:   52(float) Load 215(compare)
+            3617:175(f16vec3) Load 1433(f16dPdxy3)
+            3618:175(f16vec3) Load 1433(f16dPdxy3)
+            3619:    208(ptr) AccessChain 3512(texel) 207
+            3620:3182(ResType) ImageSparseSampleDrefExplicitLod 3614 3615 3616 Grad 3617 3618
+            3621:6(float16_t) CompositeExtract 3620 1
+                              Store 3619 3621
+            3622:     47(int) CompositeExtract 3620 0
+            3623:         284 Load 286(s2DArray)
+            3624:  167(fvec3) Load 169(c3)
+            3625:   53(fvec2) Load 1409(dPdxy2)
+            3626:   53(fvec2) Load 1409(dPdxy2)
+            3627:3146(ResType) ImageSparseSampleExplicitLod 3623 3624 Grad 3625 3626
+            3628:  7(f16vec4) CompositeExtract 3627 1
+                              Store 3512(texel) 3628
+            3629:     47(int) CompositeExtract 3627 0
+            3630:         284 Load 286(s2DArray)
+            3631:175(f16vec3) Load 177(f16c3)
+            3632:154(f16vec2) Load 1417(f16dPdxy2)
+            3633:154(f16vec2) Load 1417(f16dPdxy2)
+            3634:3146(ResType) ImageSparseSampleExplicitLod 3630 3631 Grad 3632 3633
+            3635:  7(f16vec4) CompositeExtract 3634 1
+                              Store 3512(texel) 3635
+            3636:     47(int) CompositeExtract 3634 0
+            3637:         337 Load 339(s2DArrayShadow)
+            3638:  249(fvec4) Load 251(c4)
+            3639:   53(fvec2) Load 1409(dPdxy2)
+            3640:   53(fvec2) Load 1409(dPdxy2)
+            3641:    208(ptr) AccessChain 3512(texel) 207
+            3642:   52(float) CompositeExtract 3638 3
+            3643:3182(ResType) ImageSparseSampleDrefExplicitLod 3637 3638 3642 Grad 3639 3640
+            3644:6(float16_t) CompositeExtract 3643 1
+                              Store 3641 3644
+            3645:     47(int) CompositeExtract 3643 0
+            3646:         337 Load 339(s2DArrayShadow)
+            3647:175(f16vec3) Load 177(f16c3)
+            3648:   52(float) Load 215(compare)
+            3649:154(f16vec2) Load 1417(f16dPdxy2)
+            3650:154(f16vec2) Load 1417(f16dPdxy2)
+            3651:    208(ptr) AccessChain 3512(texel) 207
+            3652:3182(ResType) ImageSparseSampleDrefExplicitLod 3646 3647 3648 Grad 3649 3650
+            3653:6(float16_t) CompositeExtract 3652 1
+                              Store 3651 3653
+            3654:     47(int) CompositeExtract 3652 0
+            3655:         299 Load 301(sCubeArray)
+            3656:  249(fvec4) Load 251(c4)
+            3657:  167(fvec3) Load 1425(dPdxy3)
+            3658:  167(fvec3) Load 1425(dPdxy3)
+            3659:3146(ResType) ImageSparseSampleExplicitLod 3655 3656 Grad 3657 3658
+            3660:  7(f16vec4) CompositeExtract 3659 1
+                              Store 3512(texel) 3660
+            3661:     47(int) CompositeExtract 3659 0
+            3662:         299 Load 301(sCubeArray)
+            3663:  7(f16vec4) Load 309(f16c4)
+            3664:175(f16vec3) Load 1433(f16dPdxy3)
+            3665:175(f16vec3) Load 1433(f16dPdxy3)
+            3666:3146(ResType) ImageSparseSampleExplicitLod 3662 3663 Grad 3664 3665
+            3667:  7(f16vec4) CompositeExtract 3666 1
+                              Store 3512(texel) 3667
+            3668:     47(int) CompositeExtract 3666 0
+            3669:  7(f16vec4) Load 3512(texel)
+                              ReturnValue 3669
                               FunctionEnd
 79(testSparseTextureGradOffset():  7(f16vec4) Function None 8
               80:             Label
-     3628(texel):     64(ptr) Variable Function
-                              Store 3628(texel) 121
-            3629:         143 Load 145(s2D)
-            3630:   53(fvec2) Load 148(c2)
-            3631:   53(fvec2) Load 1409(dPdxy2)
-            3632:   53(fvec2) Load 1409(dPdxy2)
-            3633:3102(ResType) ImageSparseSampleExplicitLod 3629 3630 Grad ConstOffset 3631 3632 722
-            3634:  7(f16vec4) CompositeExtract 3633 1
-                              Store 3628(texel) 3634
-            3635:     47(int) CompositeExtract 3633 0
-            3636:         143 Load 145(s2D)
-            3637:154(f16vec2) Load 156(f16c2)
-            3638:154(f16vec2) Load 1417(f16dPdxy2)
-            3639:154(f16vec2) Load 1417(f16dPdxy2)
-            3640:3102(ResType) ImageSparseSampleExplicitLod 3636 3637 Grad ConstOffset 3638 3639 722
-            3641:  7(f16vec4) CompositeExtract 3640 1
-                              Store 3628(texel) 3641
-            3642:     47(int) CompositeExtract 3640 0
-            3643:         163 Load 165(s3D)
-            3644:  167(fvec3) Load 169(c3)
-            3645:  167(fvec3) Load 1425(dPdxy3)
-            3646:  167(fvec3) Load 1425(dPdxy3)
-            3647:3102(ResType) ImageSparseSampleExplicitLod 3643 3644 Grad ConstOffset 3645 3646 735
-            3648:  7(f16vec4) CompositeExtract 3647 1
-                              Store 3628(texel) 3648
-            3649:     47(int) CompositeExtract 3647 0
-            3650:         163 Load 165(s3D)
-            3651:175(f16vec3) Load 177(f16c3)
-            3652:175(f16vec3) Load 1433(f16dPdxy3)
-            3653:175(f16vec3) Load 1433(f16dPdxy3)
-            3654:3102(ResType) ImageSparseSampleExplicitLod 3650 3651 Grad ConstOffset 3652 3653 735
-            3655:  7(f16vec4) CompositeExtract 3654 1
-                              Store 3628(texel) 3655
-            3656:     47(int) CompositeExtract 3654 0
-            3657:         357 Load 359(s2DRect)
-            3658:   53(fvec2) Load 148(c2)
-            3659:   53(fvec2) Load 1409(dPdxy2)
-            3660:   53(fvec2) Load 1409(dPdxy2)
-            3661:3102(ResType) ImageSparseSampleExplicitLod 3657 3658 Grad ConstOffset 3659 3660 722
-            3662:  7(f16vec4) CompositeExtract 3661 1
-                              Store 3628(texel) 3662
-            3663:     47(int) CompositeExtract 3661 0
-            3664:         357 Load 359(s2DRect)
-            3665:154(f16vec2) Load 156(f16c2)
-            3666:154(f16vec2) Load 1417(f16dPdxy2)
-            3667:154(f16vec2) Load 1417(f16dPdxy2)
-            3668:3102(ResType) ImageSparseSampleExplicitLod 3664 3665 Grad ConstOffset 3666 3667 722
-            3669:  7(f16vec4) CompositeExtract 3668 1
-                              Store 3628(texel) 3669
-            3670:     47(int) CompositeExtract 3668 0
-            3671:         371 Load 373(s2DRectShadow)
-            3672:  167(fvec3) Load 169(c3)
-            3673:   53(fvec2) Load 1409(dPdxy2)
-            3674:   53(fvec2) Load 1409(dPdxy2)
-            3675:    208(ptr) AccessChain 3628(texel) 207
-            3676:   52(float) CompositeExtract 3672 2
-            3677:3138(ResType) ImageSparseSampleDrefExplicitLod 3671 3672 3676 Grad ConstOffset 3673 3674 722
-            3678:6(float16_t) CompositeExtract 3677 1
-                              Store 3675 3678
+     3672(texel):     64(ptr) Variable Function
+                              Store 3672(texel) 121
+            3673:         143 Load 145(s2D)
+            3674:   53(fvec2) Load 148(c2)
+            3675:   53(fvec2) Load 1409(dPdxy2)
+            3676:   53(fvec2) Load 1409(dPdxy2)
+            3677:3146(ResType) ImageSparseSampleExplicitLod 3673 3674 Grad ConstOffset 3675 3676 722
+            3678:  7(f16vec4) CompositeExtract 3677 1
+                              Store 3672(texel) 3678
             3679:     47(int) CompositeExtract 3677 0
-            3680:         371 Load 373(s2DRectShadow)
+            3680:         143 Load 145(s2D)
             3681:154(f16vec2) Load 156(f16c2)
-            3682:   52(float) Load 215(compare)
+            3682:154(f16vec2) Load 1417(f16dPdxy2)
             3683:154(f16vec2) Load 1417(f16dPdxy2)
-            3684:154(f16vec2) Load 1417(f16dPdxy2)
-            3685:    208(ptr) AccessChain 3628(texel) 207
-            3686:3138(ResType) ImageSparseSampleDrefExplicitLod 3680 3681 3682 Grad ConstOffset 3683 3684 722
-            3687:6(float16_t) CompositeExtract 3686 1
-                              Store 3685 3687
-            3688:     47(int) CompositeExtract 3686 0
-            3689:         224 Load 226(s2DShadow)
-            3690:  167(fvec3) Load 169(c3)
-            3691:   53(fvec2) Load 1409(dPdxy2)
-            3692:   53(fvec2) Load 1409(dPdxy2)
-            3693:    208(ptr) AccessChain 3628(texel) 207
-            3694:   52(float) CompositeExtract 3690 2
-            3695:3138(ResType) ImageSparseSampleDrefExplicitLod 3689 3690 3694 Grad ConstOffset 3691 3692 722
-            3696:6(float16_t) CompositeExtract 3695 1
-                              Store 3693 3696
-            3697:     47(int) CompositeExtract 3695 0
-            3698:         224 Load 226(s2DShadow)
-            3699:154(f16vec2) Load 156(f16c2)
-            3700:   52(float) Load 215(compare)
-            3701:154(f16vec2) Load 1417(f16dPdxy2)
-            3702:154(f16vec2) Load 1417(f16dPdxy2)
-            3703:    208(ptr) AccessChain 3628(texel) 207
-            3704:3138(ResType) ImageSparseSampleDrefExplicitLod 3698 3699 3700 Grad ConstOffset 3701 3702 722
-            3705:6(float16_t) CompositeExtract 3704 1
-                              Store 3703 3705
-            3706:     47(int) CompositeExtract 3704 0
-            3707:         284 Load 286(s2DArray)
-            3708:  167(fvec3) Load 169(c3)
-            3709:   53(fvec2) Load 1409(dPdxy2)
-            3710:   53(fvec2) Load 1409(dPdxy2)
-            3711:3102(ResType) ImageSparseSampleExplicitLod 3707 3708 Grad ConstOffset 3709 3710 722
-            3712:  7(f16vec4) CompositeExtract 3711 1
-                              Store 3628(texel) 3712
-            3713:     47(int) CompositeExtract 3711 0
-            3714:         284 Load 286(s2DArray)
-            3715:175(f16vec3) Load 177(f16c3)
-            3716:154(f16vec2) Load 1417(f16dPdxy2)
-            3717:154(f16vec2) Load 1417(f16dPdxy2)
-            3718:3102(ResType) ImageSparseSampleExplicitLod 3714 3715 Grad ConstOffset 3716 3717 722
-            3719:  7(f16vec4) CompositeExtract 3718 1
-                              Store 3628(texel) 3719
-            3720:     47(int) CompositeExtract 3718 0
-            3721:         337 Load 339(s2DArrayShadow)
-            3722:  249(fvec4) Load 251(c4)
-            3723:   53(fvec2) Load 1409(dPdxy2)
-            3724:   53(fvec2) Load 1409(dPdxy2)
-            3725:    208(ptr) AccessChain 3628(texel) 207
-            3726:   52(float) CompositeExtract 3722 3
-            3727:3138(ResType) ImageSparseSampleDrefExplicitLod 3721 3722 3726 Grad ConstOffset 3723 3724 722
-            3728:6(float16_t) CompositeExtract 3727 1
-                              Store 3725 3728
-            3729:     47(int) CompositeExtract 3727 0
-            3730:         337 Load 339(s2DArrayShadow)
-            3731:175(f16vec3) Load 177(f16c3)
-            3732:   52(float) Load 215(compare)
-            3733:154(f16vec2) Load 1417(f16dPdxy2)
-            3734:154(f16vec2) Load 1417(f16dPdxy2)
-            3735:    208(ptr) AccessChain 3628(texel) 207
-            3736:3138(ResType) ImageSparseSampleDrefExplicitLod 3730 3731 3732 Grad ConstOffset 3733 3734 722
-            3737:6(float16_t) CompositeExtract 3736 1
-                              Store 3735 3737
-            3738:     47(int) CompositeExtract 3736 0
-            3739:  7(f16vec4) Load 3628(texel)
-                              ReturnValue 3739
+            3684:3146(ResType) ImageSparseSampleExplicitLod 3680 3681 Grad ConstOffset 3682 3683 722
+            3685:  7(f16vec4) CompositeExtract 3684 1
+                              Store 3672(texel) 3685
+            3686:     47(int) CompositeExtract 3684 0
+            3687:         163 Load 165(s3D)
+            3688:  167(fvec3) Load 169(c3)
+            3689:  167(fvec3) Load 1425(dPdxy3)
+            3690:  167(fvec3) Load 1425(dPdxy3)
+            3691:3146(ResType) ImageSparseSampleExplicitLod 3687 3688 Grad ConstOffset 3689 3690 735
+            3692:  7(f16vec4) CompositeExtract 3691 1
+                              Store 3672(texel) 3692
+            3693:     47(int) CompositeExtract 3691 0
+            3694:         163 Load 165(s3D)
+            3695:175(f16vec3) Load 177(f16c3)
+            3696:175(f16vec3) Load 1433(f16dPdxy3)
+            3697:175(f16vec3) Load 1433(f16dPdxy3)
+            3698:3146(ResType) ImageSparseSampleExplicitLod 3694 3695 Grad ConstOffset 3696 3697 735
+            3699:  7(f16vec4) CompositeExtract 3698 1
+                              Store 3672(texel) 3699
+            3700:     47(int) CompositeExtract 3698 0
+            3701:         357 Load 359(s2DRect)
+            3702:   53(fvec2) Load 148(c2)
+            3703:   53(fvec2) Load 1409(dPdxy2)
+            3704:   53(fvec2) Load 1409(dPdxy2)
+            3705:3146(ResType) ImageSparseSampleExplicitLod 3701 3702 Grad ConstOffset 3703 3704 722
+            3706:  7(f16vec4) CompositeExtract 3705 1
+                              Store 3672(texel) 3706
+            3707:     47(int) CompositeExtract 3705 0
+            3708:         357 Load 359(s2DRect)
+            3709:154(f16vec2) Load 156(f16c2)
+            3710:154(f16vec2) Load 1417(f16dPdxy2)
+            3711:154(f16vec2) Load 1417(f16dPdxy2)
+            3712:3146(ResType) ImageSparseSampleExplicitLod 3708 3709 Grad ConstOffset 3710 3711 722
+            3713:  7(f16vec4) CompositeExtract 3712 1
+                              Store 3672(texel) 3713
+            3714:     47(int) CompositeExtract 3712 0
+            3715:         371 Load 373(s2DRectShadow)
+            3716:  167(fvec3) Load 169(c3)
+            3717:   53(fvec2) Load 1409(dPdxy2)
+            3718:   53(fvec2) Load 1409(dPdxy2)
+            3719:    208(ptr) AccessChain 3672(texel) 207
+            3720:   52(float) CompositeExtract 3716 2
+            3721:3182(ResType) ImageSparseSampleDrefExplicitLod 3715 3716 3720 Grad ConstOffset 3717 3718 722
+            3722:6(float16_t) CompositeExtract 3721 1
+                              Store 3719 3722
+            3723:     47(int) CompositeExtract 3721 0
+            3724:         371 Load 373(s2DRectShadow)
+            3725:154(f16vec2) Load 156(f16c2)
+            3726:   52(float) Load 215(compare)
+            3727:154(f16vec2) Load 1417(f16dPdxy2)
+            3728:154(f16vec2) Load 1417(f16dPdxy2)
+            3729:    208(ptr) AccessChain 3672(texel) 207
+            3730:3182(ResType) ImageSparseSampleDrefExplicitLod 3724 3725 3726 Grad ConstOffset 3727 3728 722
+            3731:6(float16_t) CompositeExtract 3730 1
+                              Store 3729 3731
+            3732:     47(int) CompositeExtract 3730 0
+            3733:         224 Load 226(s2DShadow)
+            3734:  167(fvec3) Load 169(c3)
+            3735:   53(fvec2) Load 1409(dPdxy2)
+            3736:   53(fvec2) Load 1409(dPdxy2)
+            3737:    208(ptr) AccessChain 3672(texel) 207
+            3738:   52(float) CompositeExtract 3734 2
+            3739:3182(ResType) ImageSparseSampleDrefExplicitLod 3733 3734 3738 Grad ConstOffset 3735 3736 722
+            3740:6(float16_t) CompositeExtract 3739 1
+                              Store 3737 3740
+            3741:     47(int) CompositeExtract 3739 0
+            3742:         224 Load 226(s2DShadow)
+            3743:154(f16vec2) Load 156(f16c2)
+            3744:   52(float) Load 215(compare)
+            3745:154(f16vec2) Load 1417(f16dPdxy2)
+            3746:154(f16vec2) Load 1417(f16dPdxy2)
+            3747:    208(ptr) AccessChain 3672(texel) 207
+            3748:3182(ResType) ImageSparseSampleDrefExplicitLod 3742 3743 3744 Grad ConstOffset 3745 3746 722
+            3749:6(float16_t) CompositeExtract 3748 1
+                              Store 3747 3749
+            3750:     47(int) CompositeExtract 3748 0
+            3751:         284 Load 286(s2DArray)
+            3752:  167(fvec3) Load 169(c3)
+            3753:   53(fvec2) Load 1409(dPdxy2)
+            3754:   53(fvec2) Load 1409(dPdxy2)
+            3755:3146(ResType) ImageSparseSampleExplicitLod 3751 3752 Grad ConstOffset 3753 3754 722
+            3756:  7(f16vec4) CompositeExtract 3755 1
+                              Store 3672(texel) 3756
+            3757:     47(int) CompositeExtract 3755 0
+            3758:         284 Load 286(s2DArray)
+            3759:175(f16vec3) Load 177(f16c3)
+            3760:154(f16vec2) Load 1417(f16dPdxy2)
+            3761:154(f16vec2) Load 1417(f16dPdxy2)
+            3762:3146(ResType) ImageSparseSampleExplicitLod 3758 3759 Grad ConstOffset 3760 3761 722
+            3763:  7(f16vec4) CompositeExtract 3762 1
+                              Store 3672(texel) 3763
+            3764:     47(int) CompositeExtract 3762 0
+            3765:         337 Load 339(s2DArrayShadow)
+            3766:  249(fvec4) Load 251(c4)
+            3767:   53(fvec2) Load 1409(dPdxy2)
+            3768:   53(fvec2) Load 1409(dPdxy2)
+            3769:    208(ptr) AccessChain 3672(texel) 207
+            3770:   52(float) CompositeExtract 3766 3
+            3771:3182(ResType) ImageSparseSampleDrefExplicitLod 3765 3766 3770 Grad ConstOffset 3767 3768 722
+            3772:6(float16_t) CompositeExtract 3771 1
+                              Store 3769 3772
+            3773:     47(int) CompositeExtract 3771 0
+            3774:         337 Load 339(s2DArrayShadow)
+            3775:175(f16vec3) Load 177(f16c3)
+            3776:   52(float) Load 215(compare)
+            3777:154(f16vec2) Load 1417(f16dPdxy2)
+            3778:154(f16vec2) Load 1417(f16dPdxy2)
+            3779:    208(ptr) AccessChain 3672(texel) 207
+            3780:3182(ResType) ImageSparseSampleDrefExplicitLod 3774 3775 3776 Grad ConstOffset 3777 3778 722
+            3781:6(float16_t) CompositeExtract 3780 1
+                              Store 3779 3781
+            3782:     47(int) CompositeExtract 3780 0
+            3783:  7(f16vec4) Load 3672(texel)
+                              ReturnValue 3783
                               FunctionEnd
 81(testSparseTexelFetch():  7(f16vec4) Function None 8
               82:             Label
-     3742(texel):     64(ptr) Variable Function
-                              Store 3742(texel) 121
-            3743:         143 Load 145(s2D)
-            3744:   53(fvec2) Load 148(c2)
-            3745:  721(ivec2) ConvertFToS 3744
-            3746:   52(float) Load 565(lod)
-            3747:     47(int) ConvertFToS 3746
-            3748:         142 Image 3743
-            3749:3102(ResType) ImageSparseFetch 3748 3745 Lod 3747
-            3750:  7(f16vec4) CompositeExtract 3749 1
-                              Store 3742(texel) 3750
-            3751:     47(int) CompositeExtract 3749 0
-            3752:         163 Load 165(s3D)
-            3753:  167(fvec3) Load 169(c3)
-            3754:  734(ivec3) ConvertFToS 3753
-            3755:   52(float) Load 565(lod)
-            3756:     47(int) ConvertFToS 3755
-            3757:         162 Image 3752
-            3758:3102(ResType) ImageSparseFetch 3757 3754 Lod 3756
-            3759:  7(f16vec4) CompositeExtract 3758 1
-                              Store 3742(texel) 3759
-            3760:     47(int) CompositeExtract 3758 0
-            3761:         357 Load 359(s2DRect)
-            3762:   53(fvec2) Load 148(c2)
-            3763:  721(ivec2) ConvertFToS 3762
-            3764:         356 Image 3761
-            3765:3102(ResType) ImageSparseFetch 3764 3763
-            3766:  7(f16vec4) CompositeExtract 3765 1
-                              Store 3742(texel) 3766
-            3767:     47(int) CompositeExtract 3765 0
-            3768:         284 Load 286(s2DArray)
-            3769:  167(fvec3) Load 169(c3)
-            3770:  734(ivec3) ConvertFToS 3769
-            3771:   52(float) Load 565(lod)
-            3772:     47(int) ConvertFToS 3771
-            3773:         283 Image 3768
-            3774:3102(ResType) ImageSparseFetch 3773 3770 Lod 3772
-            3775:  7(f16vec4) CompositeExtract 3774 1
-                              Store 3742(texel) 3775
-            3776:     47(int) CompositeExtract 3774 0
-            3777:        1309 Load 1311(s2DMS)
-            3778:   53(fvec2) Load 148(c2)
-            3779:  721(ivec2) ConvertFToS 3778
-            3780:        1308 Image 3777
-            3781:3102(ResType) ImageSparseFetch 3780 3779 Sample 709
-            3782:  7(f16vec4) CompositeExtract 3781 1
-                              Store 3742(texel) 3782
-            3783:     47(int) CompositeExtract 3781 0
-            3784:        1320 Load 1322(s2DMSArray)
-            3785:  167(fvec3) Load 169(c3)
-            3786:  734(ivec3) ConvertFToS 3785
-            3787:        1319 Image 3784
-            3788:3102(ResType) ImageSparseFetch 3787 3786 Sample 1326
-            3789:  7(f16vec4) CompositeExtract 3788 1
-                              Store 3742(texel) 3789
-            3790:     47(int) CompositeExtract 3788 0
-            3791:  7(f16vec4) Load 3742(texel)
-                              ReturnValue 3791
+     3786(texel):     64(ptr) Variable Function
+                              Store 3786(texel) 121
+            3787:         143 Load 145(s2D)
+            3788:   53(fvec2) Load 148(c2)
+            3789:  721(ivec2) ConvertFToS 3788
+            3790:   52(float) Load 565(lod)
+            3791:     47(int) ConvertFToS 3790
+            3792:         142 Image 3787
+            3793:3146(ResType) ImageSparseFetch 3792 3789 Lod 3791
+            3794:  7(f16vec4) CompositeExtract 3793 1
+                              Store 3786(texel) 3794
+            3795:     47(int) CompositeExtract 3793 0
+            3796:         163 Load 165(s3D)
+            3797:  167(fvec3) Load 169(c3)
+            3798:  734(ivec3) ConvertFToS 3797
+            3799:   52(float) Load 565(lod)
+            3800:     47(int) ConvertFToS 3799
+            3801:         162 Image 3796
+            3802:3146(ResType) ImageSparseFetch 3801 3798 Lod 3800
+            3803:  7(f16vec4) CompositeExtract 3802 1
+                              Store 3786(texel) 3803
+            3804:     47(int) CompositeExtract 3802 0
+            3805:         357 Load 359(s2DRect)
+            3806:   53(fvec2) Load 148(c2)
+            3807:  721(ivec2) ConvertFToS 3806
+            3808:         356 Image 3805
+            3809:3146(ResType) ImageSparseFetch 3808 3807
+            3810:  7(f16vec4) CompositeExtract 3809 1
+                              Store 3786(texel) 3810
+            3811:     47(int) CompositeExtract 3809 0
+            3812:         284 Load 286(s2DArray)
+            3813:  167(fvec3) Load 169(c3)
+            3814:  734(ivec3) ConvertFToS 3813
+            3815:   52(float) Load 565(lod)
+            3816:     47(int) ConvertFToS 3815
+            3817:         283 Image 3812
+            3818:3146(ResType) ImageSparseFetch 3817 3814 Lod 3816
+            3819:  7(f16vec4) CompositeExtract 3818 1
+                              Store 3786(texel) 3819
+            3820:     47(int) CompositeExtract 3818 0
+            3821:        1309 Load 1311(s2DMS)
+            3822:   53(fvec2) Load 148(c2)
+            3823:  721(ivec2) ConvertFToS 3822
+            3824:        1308 Image 3821
+            3825:3146(ResType) ImageSparseFetch 3824 3823 Sample 709
+            3826:  7(f16vec4) CompositeExtract 3825 1
+                              Store 3786(texel) 3826
+            3827:     47(int) CompositeExtract 3825 0
+            3828:        1320 Load 1322(s2DMSArray)
+            3829:  167(fvec3) Load 169(c3)
+            3830:  734(ivec3) ConvertFToS 3829
+            3831:        1319 Image 3828
+            3832:3146(ResType) ImageSparseFetch 3831 3830 Sample 1326
+            3833:  7(f16vec4) CompositeExtract 3832 1
+                              Store 3786(texel) 3833
+            3834:     47(int) CompositeExtract 3832 0
+            3835:  7(f16vec4) Load 3786(texel)
+                              ReturnValue 3835
                               FunctionEnd
 83(testSparseTexelFetchOffset():  7(f16vec4) Function None 8
               84:             Label
-     3794(texel):     64(ptr) Variable Function
-                              Store 3794(texel) 121
-            3795:         143 Load 145(s2D)
-            3796:   53(fvec2) Load 148(c2)
-            3797:  721(ivec2) ConvertFToS 3796
-            3798:   52(float) Load 565(lod)
-            3799:     47(int) ConvertFToS 3798
-            3800:         142 Image 3795
-            3801:3102(ResType) ImageSparseFetch 3800 3797 Lod ConstOffset 3799 722
-            3802:  7(f16vec4) CompositeExtract 3801 1
-                              Store 3794(texel) 3802
-            3803:     47(int) CompositeExtract 3801 0
-            3804:         163 Load 165(s3D)
-            3805:  167(fvec3) Load 169(c3)
-            3806:  734(ivec3) ConvertFToS 3805
-            3807:   52(float) Load 565(lod)
-            3808:     47(int) ConvertFToS 3807
-            3809:         162 Image 3804
-            3810:3102(ResType) ImageSparseFetch 3809 3806 Lod ConstOffset 3808 735
-            3811:  7(f16vec4) CompositeExtract 3810 1
-                              Store 3794(texel) 3811
-            3812:     47(int) CompositeExtract 3810 0
-            3813:         357 Load 359(s2DRect)
-            3814:   53(fvec2) Load 148(c2)
-            3815:  721(ivec2) ConvertFToS 3814
-            3816:         356 Image 3813
-            3817:3102(ResType) ImageSparseFetch 3816 3815 ConstOffset 722
-            3818:  7(f16vec4) CompositeExtract 3817 1
-                              Store 3794(texel) 3818
-            3819:     47(int) CompositeExtract 3817 0
-            3820:         284 Load 286(s2DArray)
-            3821:  167(fvec3) Load 169(c3)
-            3822:  734(ivec3) ConvertFToS 3821
-            3823:   52(float) Load 565(lod)
-            3824:     47(int) ConvertFToS 3823
-            3825:         283 Image 3820
-            3826:3102(ResType) ImageSparseFetch 3825 3822 Lod ConstOffset 3824 722
-            3827:  7(f16vec4) CompositeExtract 3826 1
-                              Store 3794(texel) 3827
-            3828:     47(int) CompositeExtract 3826 0
-            3829:  7(f16vec4) Load 3794(texel)
-                              ReturnValue 3829
+     3838(texel):     64(ptr) Variable Function
+                              Store 3838(texel) 121
+            3839:         143 Load 145(s2D)
+            3840:   53(fvec2) Load 148(c2)
+            3841:  721(ivec2) ConvertFToS 3840
+            3842:   52(float) Load 565(lod)
+            3843:     47(int) ConvertFToS 3842
+            3844:         142 Image 3839
+            3845:3146(ResType) ImageSparseFetch 3844 3841 Lod ConstOffset 3843 722
+            3846:  7(f16vec4) CompositeExtract 3845 1
+                              Store 3838(texel) 3846
+            3847:     47(int) CompositeExtract 3845 0
+            3848:         163 Load 165(s3D)
+            3849:  167(fvec3) Load 169(c3)
+            3850:  734(ivec3) ConvertFToS 3849
+            3851:   52(float) Load 565(lod)
+            3852:     47(int) ConvertFToS 3851
+            3853:         162 Image 3848
+            3854:3146(ResType) ImageSparseFetch 3853 3850 Lod ConstOffset 3852 735
+            3855:  7(f16vec4) CompositeExtract 3854 1
+                              Store 3838(texel) 3855
+            3856:     47(int) CompositeExtract 3854 0
+            3857:         357 Load 359(s2DRect)
+            3858:   53(fvec2) Load 148(c2)
+            3859:  721(ivec2) ConvertFToS 3858
+            3860:         356 Image 3857
+            3861:3146(ResType) ImageSparseFetch 3860 3859 ConstOffset 722
+            3862:  7(f16vec4) CompositeExtract 3861 1
+                              Store 3838(texel) 3862
+            3863:     47(int) CompositeExtract 3861 0
+            3864:         284 Load 286(s2DArray)
+            3865:  167(fvec3) Load 169(c3)
+            3866:  734(ivec3) ConvertFToS 3865
+            3867:   52(float) Load 565(lod)
+            3868:     47(int) ConvertFToS 3867
+            3869:         283 Image 3864
+            3870:3146(ResType) ImageSparseFetch 3869 3866 Lod ConstOffset 3868 722
+            3871:  7(f16vec4) CompositeExtract 3870 1
+                              Store 3838(texel) 3871
+            3872:     47(int) CompositeExtract 3870 0
+            3873:  7(f16vec4) Load 3838(texel)
+                              ReturnValue 3873
                               FunctionEnd
 85(testSparseTextureGather():  7(f16vec4) Function None 8
               86:             Label
-     3832(texel):     64(ptr) Variable Function
-                              Store 3832(texel) 121
-            3833:         143 Load 145(s2D)
-            3834:   53(fvec2) Load 148(c2)
-            3835:3102(ResType) ImageSparseGather 3833 3834 2187
-            3836:  7(f16vec4) CompositeExtract 3835 1
-                              Store 3832(texel) 3836
-            3837:     47(int) CompositeExtract 3835 0
-            3838:         143 Load 145(s2D)
-            3839:154(f16vec2) Load 156(f16c2)
-            3840:6(float16_t) Load 137(f16bias)
-            3841:3102(ResType) ImageSparseGather 3838 3839 2187 Bias 3840
-            3842:  7(f16vec4) CompositeExtract 3841 1
-                              Store 3832(texel) 3842
-            3843:     47(int) CompositeExtract 3841 0
-            3844:         284 Load 286(s2DArray)
-            3845:  167(fvec3) Load 169(c3)
-            3846:3102(ResType) ImageSparseGather 3844 3845 2187
-            3847:  7(f16vec4) CompositeExtract 3846 1
-                              Store 3832(texel) 3847
-            3848:     47(int) CompositeExtract 3846 0
-            3849:         284 Load 286(s2DArray)
-            3850:175(f16vec3) Load 177(f16c3)
-            3851:6(float16_t) Load 137(f16bias)
-            3852:3102(ResType) ImageSparseGather 3849 3850 2187 Bias 3851
-            3853:  7(f16vec4) CompositeExtract 3852 1
-                              Store 3832(texel) 3853
-            3854:     47(int) CompositeExtract 3852 0
-            3855:         184 Load 186(sCube)
-            3856:  167(fvec3) Load 169(c3)
-            3857:3102(ResType) ImageSparseGather 3855 3856 2187
-            3858:  7(f16vec4) CompositeExtract 3857 1
-                              Store 3832(texel) 3858
-            3859:     47(int) CompositeExtract 3857 0
-            3860:         184 Load 186(sCube)
-            3861:175(f16vec3) Load 177(f16c3)
-            3862:6(float16_t) Load 137(f16bias)
-            3863:3102(ResType) ImageSparseGather 3860 3861 2187 Bias 3862
-            3864:  7(f16vec4) CompositeExtract 3863 1
-                              Store 3832(texel) 3864
-            3865:     47(int) CompositeExtract 3863 0
-            3866:         299 Load 301(sCubeArray)
-            3867:  249(fvec4) Load 251(c4)
-            3868:3102(ResType) ImageSparseGather 3866 3867 2187
-            3869:  7(f16vec4) CompositeExtract 3868 1
-                              Store 3832(texel) 3869
-            3870:     47(int) CompositeExtract 3868 0
-            3871:         299 Load 301(sCubeArray)
-            3872:  7(f16vec4) Load 309(f16c4)
-            3873:6(float16_t) Load 137(f16bias)
-            3874:3102(ResType) ImageSparseGather 3871 3872 2187 Bias 3873
-            3875:  7(f16vec4) CompositeExtract 3874 1
-                              Store 3832(texel) 3875
-            3876:     47(int) CompositeExtract 3874 0
-            3877:         357 Load 359(s2DRect)
+     3876(texel):     64(ptr) Variable Function
+                              Store 3876(texel) 121
+            3877:         143 Load 145(s2D)
             3878:   53(fvec2) Load 148(c2)
-            3879:3102(ResType) ImageSparseGather 3877 3878 2187
+            3879:3146(ResType) ImageSparseGather 3877 3878 2187
             3880:  7(f16vec4) CompositeExtract 3879 1
-                              Store 3832(texel) 3880
+                              Store 3876(texel) 3880
             3881:     47(int) CompositeExtract 3879 0
-            3882:         357 Load 359(s2DRect)
+            3882:         143 Load 145(s2D)
             3883:154(f16vec2) Load 156(f16c2)
-            3884:3102(ResType) ImageSparseGather 3882 3883 2187
-            3885:  7(f16vec4) CompositeExtract 3884 1
-                              Store 3832(texel) 3885
-            3886:     47(int) CompositeExtract 3884 0
-            3887:         224 Load 226(s2DShadow)
-            3888:   53(fvec2) Load 148(c2)
-            3889:   52(float) Load 215(compare)
-            3890:3102(ResType) ImageSparseDrefGather 3887 3888 3889
+            3884:6(float16_t) Load 137(f16bias)
+            3885:3146(ResType) ImageSparseGather 3882 3883 2187 Bias 3884
+            3886:  7(f16vec4) CompositeExtract 3885 1
+                              Store 3876(texel) 3886
+            3887:     47(int) CompositeExtract 3885 0
+            3888:         284 Load 286(s2DArray)
+            3889:  167(fvec3) Load 169(c3)
+            3890:3146(ResType) ImageSparseGather 3888 3889 2187
             3891:  7(f16vec4) CompositeExtract 3890 1
-                              Store 3832(texel) 3891
+                              Store 3876(texel) 3891
             3892:     47(int) CompositeExtract 3890 0
-            3893:         224 Load 226(s2DShadow)
-            3894:154(f16vec2) Load 156(f16c2)
-            3895:   52(float) Load 215(compare)
-            3896:3102(ResType) ImageSparseDrefGather 3893 3894 3895
+            3893:         284 Load 286(s2DArray)
+            3894:175(f16vec3) Load 177(f16c3)
+            3895:6(float16_t) Load 137(f16bias)
+            3896:3146(ResType) ImageSparseGather 3893 3894 2187 Bias 3895
             3897:  7(f16vec4) CompositeExtract 3896 1
-                              Store 3832(texel) 3897
+                              Store 3876(texel) 3897
             3898:     47(int) CompositeExtract 3896 0
-            3899:         337 Load 339(s2DArrayShadow)
+            3899:         184 Load 186(sCube)
             3900:  167(fvec3) Load 169(c3)
-            3901:   52(float) Load 215(compare)
-            3902:3102(ResType) ImageSparseDrefGather 3899 3900 3901
-            3903:  7(f16vec4) CompositeExtract 3902 1
-                              Store 3832(texel) 3903
-            3904:     47(int) CompositeExtract 3902 0
-            3905:         337 Load 339(s2DArrayShadow)
-            3906:175(f16vec3) Load 177(f16c3)
-            3907:   52(float) Load 215(compare)
-            3908:3102(ResType) ImageSparseDrefGather 3905 3906 3907
-            3909:  7(f16vec4) CompositeExtract 3908 1
-                              Store 3832(texel) 3909
-            3910:     47(int) CompositeExtract 3908 0
-            3911:         245 Load 247(sCubeShadow)
-            3912:  167(fvec3) Load 169(c3)
-            3913:   52(float) Load 215(compare)
-            3914:3102(ResType) ImageSparseDrefGather 3911 3912 3913
-            3915:  7(f16vec4) CompositeExtract 3914 1
-                              Store 3832(texel) 3915
-            3916:     47(int) CompositeExtract 3914 0
-            3917:         245 Load 247(sCubeShadow)
-            3918:175(f16vec3) Load 177(f16c3)
-            3919:   52(float) Load 215(compare)
-            3920:3102(ResType) ImageSparseDrefGather 3917 3918 3919
-            3921:  7(f16vec4) CompositeExtract 3920 1
-                              Store 3832(texel) 3921
-            3922:     47(int) CompositeExtract 3920 0
-            3923:         391 Load 393(sCubeArrayShadow)
-            3924:  249(fvec4) Load 251(c4)
-            3925:   52(float) Load 215(compare)
-            3926:3102(ResType) ImageSparseDrefGather 3923 3924 3925
-            3927:  7(f16vec4) CompositeExtract 3926 1
-                              Store 3832(texel) 3927
-            3928:     47(int) CompositeExtract 3926 0
-            3929:         391 Load 393(sCubeArrayShadow)
-            3930:  7(f16vec4) Load 309(f16c4)
-            3931:   52(float) Load 215(compare)
-            3932:3102(ResType) ImageSparseDrefGather 3929 3930 3931
-            3933:  7(f16vec4) CompositeExtract 3932 1
-                              Store 3832(texel) 3933
-            3934:     47(int) CompositeExtract 3932 0
-            3935:         371 Load 373(s2DRectShadow)
-            3936:   53(fvec2) Load 148(c2)
-            3937:   52(float) Load 215(compare)
-            3938:3102(ResType) ImageSparseDrefGather 3935 3936 3937
-            3939:  7(f16vec4) CompositeExtract 3938 1
-                              Store 3832(texel) 3939
-            3940:     47(int) CompositeExtract 3938 0
-            3941:         371 Load 373(s2DRectShadow)
-            3942:154(f16vec2) Load 156(f16c2)
-            3943:   52(float) Load 215(compare)
-            3944:3102(ResType) ImageSparseDrefGather 3941 3942 3943
-            3945:  7(f16vec4) CompositeExtract 3944 1
-                              Store 3832(texel) 3945
-            3946:     47(int) CompositeExtract 3944 0
-            3947:  7(f16vec4) Load 3832(texel)
-                              ReturnValue 3947
+            3901:3146(ResType) ImageSparseGather 3899 3900 2187
+            3902:  7(f16vec4) CompositeExtract 3901 1
+                              Store 3876(texel) 3902
+            3903:     47(int) CompositeExtract 3901 0
+            3904:         184 Load 186(sCube)
+            3905:175(f16vec3) Load 177(f16c3)
+            3906:6(float16_t) Load 137(f16bias)
+            3907:3146(ResType) ImageSparseGather 3904 3905 2187 Bias 3906
+            3908:  7(f16vec4) CompositeExtract 3907 1
+                              Store 3876(texel) 3908
+            3909:     47(int) CompositeExtract 3907 0
+            3910:         299 Load 301(sCubeArray)
+            3911:  249(fvec4) Load 251(c4)
+            3912:3146(ResType) ImageSparseGather 3910 3911 2187
+            3913:  7(f16vec4) CompositeExtract 3912 1
+                              Store 3876(texel) 3913
+            3914:     47(int) CompositeExtract 3912 0
+            3915:         299 Load 301(sCubeArray)
+            3916:  7(f16vec4) Load 309(f16c4)
+            3917:6(float16_t) Load 137(f16bias)
+            3918:3146(ResType) ImageSparseGather 3915 3916 2187 Bias 3917
+            3919:  7(f16vec4) CompositeExtract 3918 1
+                              Store 3876(texel) 3919
+            3920:     47(int) CompositeExtract 3918 0
+            3921:         357 Load 359(s2DRect)
+            3922:   53(fvec2) Load 148(c2)
+            3923:3146(ResType) ImageSparseGather 3921 3922 2187
+            3924:  7(f16vec4) CompositeExtract 3923 1
+                              Store 3876(texel) 3924
+            3925:     47(int) CompositeExtract 3923 0
+            3926:         357 Load 359(s2DRect)
+            3927:154(f16vec2) Load 156(f16c2)
+            3928:3146(ResType) ImageSparseGather 3926 3927 2187
+            3929:  7(f16vec4) CompositeExtract 3928 1
+                              Store 3876(texel) 3929
+            3930:     47(int) CompositeExtract 3928 0
+            3931:         224 Load 226(s2DShadow)
+            3932:   53(fvec2) Load 148(c2)
+            3933:   52(float) Load 215(compare)
+            3934:3146(ResType) ImageSparseDrefGather 3931 3932 3933
+            3935:  7(f16vec4) CompositeExtract 3934 1
+                              Store 3876(texel) 3935
+            3936:     47(int) CompositeExtract 3934 0
+            3937:         224 Load 226(s2DShadow)
+            3938:154(f16vec2) Load 156(f16c2)
+            3939:   52(float) Load 215(compare)
+            3940:3146(ResType) ImageSparseDrefGather 3937 3938 3939
+            3941:  7(f16vec4) CompositeExtract 3940 1
+                              Store 3876(texel) 3941
+            3942:     47(int) CompositeExtract 3940 0
+            3943:         337 Load 339(s2DArrayShadow)
+            3944:  167(fvec3) Load 169(c3)
+            3945:   52(float) Load 215(compare)
+            3946:3146(ResType) ImageSparseDrefGather 3943 3944 3945
+            3947:  7(f16vec4) CompositeExtract 3946 1
+                              Store 3876(texel) 3947
+            3948:     47(int) CompositeExtract 3946 0
+            3949:         337 Load 339(s2DArrayShadow)
+            3950:175(f16vec3) Load 177(f16c3)
+            3951:   52(float) Load 215(compare)
+            3952:3146(ResType) ImageSparseDrefGather 3949 3950 3951
+            3953:  7(f16vec4) CompositeExtract 3952 1
+                              Store 3876(texel) 3953
+            3954:     47(int) CompositeExtract 3952 0
+            3955:         245 Load 247(sCubeShadow)
+            3956:  167(fvec3) Load 169(c3)
+            3957:   52(float) Load 215(compare)
+            3958:3146(ResType) ImageSparseDrefGather 3955 3956 3957
+            3959:  7(f16vec4) CompositeExtract 3958 1
+                              Store 3876(texel) 3959
+            3960:     47(int) CompositeExtract 3958 0
+            3961:         245 Load 247(sCubeShadow)
+            3962:175(f16vec3) Load 177(f16c3)
+            3963:   52(float) Load 215(compare)
+            3964:3146(ResType) ImageSparseDrefGather 3961 3962 3963
+            3965:  7(f16vec4) CompositeExtract 3964 1
+                              Store 3876(texel) 3965
+            3966:     47(int) CompositeExtract 3964 0
+            3967:         391 Load 393(sCubeArrayShadow)
+            3968:  249(fvec4) Load 251(c4)
+            3969:   52(float) Load 215(compare)
+            3970:3146(ResType) ImageSparseDrefGather 3967 3968 3969
+            3971:  7(f16vec4) CompositeExtract 3970 1
+                              Store 3876(texel) 3971
+            3972:     47(int) CompositeExtract 3970 0
+            3973:         391 Load 393(sCubeArrayShadow)
+            3974:  7(f16vec4) Load 309(f16c4)
+            3975:   52(float) Load 215(compare)
+            3976:3146(ResType) ImageSparseDrefGather 3973 3974 3975
+            3977:  7(f16vec4) CompositeExtract 3976 1
+                              Store 3876(texel) 3977
+            3978:     47(int) CompositeExtract 3976 0
+            3979:         371 Load 373(s2DRectShadow)
+            3980:   53(fvec2) Load 148(c2)
+            3981:   52(float) Load 215(compare)
+            3982:3146(ResType) ImageSparseDrefGather 3979 3980 3981
+            3983:  7(f16vec4) CompositeExtract 3982 1
+                              Store 3876(texel) 3983
+            3984:     47(int) CompositeExtract 3982 0
+            3985:         371 Load 373(s2DRectShadow)
+            3986:154(f16vec2) Load 156(f16c2)
+            3987:   52(float) Load 215(compare)
+            3988:3146(ResType) ImageSparseDrefGather 3985 3986 3987
+            3989:  7(f16vec4) CompositeExtract 3988 1
+                              Store 3876(texel) 3989
+            3990:     47(int) CompositeExtract 3988 0
+            3991:  7(f16vec4) Load 3876(texel)
+                              ReturnValue 3991
                               FunctionEnd
 87(testSparseTextureGatherOffset():  7(f16vec4) Function None 8
               88:             Label
-     3950(texel):     64(ptr) Variable Function
-                              Store 3950(texel) 121
-            3951:         143 Load 145(s2D)
-            3952:   53(fvec2) Load 148(c2)
-            3953:3102(ResType) ImageSparseGather 3951 3952 2187 ConstOffset 722
-            3954:  7(f16vec4) CompositeExtract 3953 1
-                              Store 3950(texel) 3954
-            3955:     47(int) CompositeExtract 3953 0
-            3956:         143 Load 145(s2D)
-            3957:154(f16vec2) Load 156(f16c2)
-            3958:6(float16_t) Load 137(f16bias)
-            3959:3102(ResType) ImageSparseGather 3956 3957 2187 Bias ConstOffset 3958 722
-            3960:  7(f16vec4) CompositeExtract 3959 1
-                              Store 3950(texel) 3960
-            3961:     47(int) CompositeExtract 3959 0
-            3962:         284 Load 286(s2DArray)
-            3963:  167(fvec3) Load 169(c3)
-            3964:3102(ResType) ImageSparseGather 3962 3963 2187 ConstOffset 722
-            3965:  7(f16vec4) CompositeExtract 3964 1
-                              Store 3950(texel) 3965
-            3966:     47(int) CompositeExtract 3964 0
-            3967:         284 Load 286(s2DArray)
-            3968:175(f16vec3) Load 177(f16c3)
-            3969:6(float16_t) Load 137(f16bias)
-            3970:3102(ResType) ImageSparseGather 3967 3968 2187 Bias ConstOffset 3969 722
-            3971:  7(f16vec4) CompositeExtract 3970 1
-                              Store 3950(texel) 3971
-            3972:     47(int) CompositeExtract 3970 0
-            3973:         357 Load 359(s2DRect)
-            3974:   53(fvec2) Load 148(c2)
-            3975:3102(ResType) ImageSparseGather 3973 3974 2187 ConstOffset 722
-            3976:  7(f16vec4) CompositeExtract 3975 1
-                              Store 3950(texel) 3976
-            3977:     47(int) CompositeExtract 3975 0
-            3978:         357 Load 359(s2DRect)
-            3979:154(f16vec2) Load 156(f16c2)
-            3980:3102(ResType) ImageSparseGather 3978 3979 2187 ConstOffset 722
-            3981:  7(f16vec4) CompositeExtract 3980 1
-                              Store 3950(texel) 3981
-            3982:     47(int) CompositeExtract 3980 0
-            3983:         224 Load 226(s2DShadow)
-            3984:   53(fvec2) Load 148(c2)
-            3985:   52(float) Load 215(compare)
-            3986:3102(ResType) ImageSparseDrefGather 3983 3984 3985 ConstOffset 722
-            3987:  7(f16vec4) CompositeExtract 3986 1
-                              Store 3950(texel) 3987
-            3988:     47(int) CompositeExtract 3986 0
-            3989:         224 Load 226(s2DShadow)
-            3990:154(f16vec2) Load 156(f16c2)
-            3991:   52(float) Load 215(compare)
-            3992:3102(ResType) ImageSparseDrefGather 3989 3990 3991 ConstOffset 722
-            3993:  7(f16vec4) CompositeExtract 3992 1
-                              Store 3950(texel) 3993
-            3994:     47(int) CompositeExtract 3992 0
-            3995:         337 Load 339(s2DArrayShadow)
-            3996:  167(fvec3) Load 169(c3)
-            3997:   52(float) Load 215(compare)
-            3998:3102(ResType) ImageSparseDrefGather 3995 3996 3997 ConstOffset 722
-            3999:  7(f16vec4) CompositeExtract 3998 1
-                              Store 3950(texel) 3999
-            4000:     47(int) CompositeExtract 3998 0
-            4001:         337 Load 339(s2DArrayShadow)
-            4002:175(f16vec3) Load 177(f16c3)
-            4003:   52(float) Load 215(compare)
-            4004:3102(ResType) ImageSparseDrefGather 4001 4002 4003 ConstOffset 722
-            4005:  7(f16vec4) CompositeExtract 4004 1
-                              Store 3950(texel) 4005
-            4006:     47(int) CompositeExtract 4004 0
-            4007:         371 Load 373(s2DRectShadow)
-            4008:   53(fvec2) Load 148(c2)
-            4009:   52(float) Load 215(compare)
-            4010:3102(ResType) ImageSparseDrefGather 4007 4008 4009 ConstOffset 722
-            4011:  7(f16vec4) CompositeExtract 4010 1
-                              Store 3950(texel) 4011
-            4012:     47(int) CompositeExtract 4010 0
-            4013:         371 Load 373(s2DRectShadow)
-            4014:154(f16vec2) Load 156(f16c2)
-            4015:   52(float) Load 215(compare)
-            4016:3102(ResType) ImageSparseDrefGather 4013 4014 4015 ConstOffset 722
-            4017:  7(f16vec4) CompositeExtract 4016 1
-                              Store 3950(texel) 4017
-            4018:     47(int) CompositeExtract 4016 0
-            4019:  7(f16vec4) Load 3950(texel)
-                              ReturnValue 4019
+     3994(texel):     64(ptr) Variable Function
+                              Store 3994(texel) 121
+            3995:         143 Load 145(s2D)
+            3996:   53(fvec2) Load 148(c2)
+            3997:3146(ResType) ImageSparseGather 3995 3996 2187 ConstOffset 722
+            3998:  7(f16vec4) CompositeExtract 3997 1
+                              Store 3994(texel) 3998
+            3999:     47(int) CompositeExtract 3997 0
+            4000:         143 Load 145(s2D)
+            4001:154(f16vec2) Load 156(f16c2)
+            4002:6(float16_t) Load 137(f16bias)
+            4003:3146(ResType) ImageSparseGather 4000 4001 2187 Bias ConstOffset 4002 722
+            4004:  7(f16vec4) CompositeExtract 4003 1
+                              Store 3994(texel) 4004
+            4005:     47(int) CompositeExtract 4003 0
+            4006:         284 Load 286(s2DArray)
+            4007:  167(fvec3) Load 169(c3)
+            4008:3146(ResType) ImageSparseGather 4006 4007 2187 ConstOffset 722
+            4009:  7(f16vec4) CompositeExtract 4008 1
+                              Store 3994(texel) 4009
+            4010:     47(int) CompositeExtract 4008 0
+            4011:         284 Load 286(s2DArray)
+            4012:175(f16vec3) Load 177(f16c3)
+            4013:6(float16_t) Load 137(f16bias)
+            4014:3146(ResType) ImageSparseGather 4011 4012 2187 Bias ConstOffset 4013 722
+            4015:  7(f16vec4) CompositeExtract 4014 1
+                              Store 3994(texel) 4015
+            4016:     47(int) CompositeExtract 4014 0
+            4017:         357 Load 359(s2DRect)
+            4018:   53(fvec2) Load 148(c2)
+            4019:3146(ResType) ImageSparseGather 4017 4018 2187 ConstOffset 722
+            4020:  7(f16vec4) CompositeExtract 4019 1
+                              Store 3994(texel) 4020
+            4021:     47(int) CompositeExtract 4019 0
+            4022:         357 Load 359(s2DRect)
+            4023:154(f16vec2) Load 156(f16c2)
+            4024:3146(ResType) ImageSparseGather 4022 4023 2187 ConstOffset 722
+            4025:  7(f16vec4) CompositeExtract 4024 1
+                              Store 3994(texel) 4025
+            4026:     47(int) CompositeExtract 4024 0
+            4027:         224 Load 226(s2DShadow)
+            4028:   53(fvec2) Load 148(c2)
+            4029:   52(float) Load 215(compare)
+            4030:3146(ResType) ImageSparseDrefGather 4027 4028 4029 ConstOffset 722
+            4031:  7(f16vec4) CompositeExtract 4030 1
+                              Store 3994(texel) 4031
+            4032:     47(int) CompositeExtract 4030 0
+            4033:         224 Load 226(s2DShadow)
+            4034:154(f16vec2) Load 156(f16c2)
+            4035:   52(float) Load 215(compare)
+            4036:3146(ResType) ImageSparseDrefGather 4033 4034 4035 ConstOffset 722
+            4037:  7(f16vec4) CompositeExtract 4036 1
+                              Store 3994(texel) 4037
+            4038:     47(int) CompositeExtract 4036 0
+            4039:         337 Load 339(s2DArrayShadow)
+            4040:  167(fvec3) Load 169(c3)
+            4041:   52(float) Load 215(compare)
+            4042:3146(ResType) ImageSparseDrefGather 4039 4040 4041 ConstOffset 722
+            4043:  7(f16vec4) CompositeExtract 4042 1
+                              Store 3994(texel) 4043
+            4044:     47(int) CompositeExtract 4042 0
+            4045:         337 Load 339(s2DArrayShadow)
+            4046:175(f16vec3) Load 177(f16c3)
+            4047:   52(float) Load 215(compare)
+            4048:3146(ResType) ImageSparseDrefGather 4045 4046 4047 ConstOffset 722
+            4049:  7(f16vec4) CompositeExtract 4048 1
+                              Store 3994(texel) 4049
+            4050:     47(int) CompositeExtract 4048 0
+            4051:         371 Load 373(s2DRectShadow)
+            4052:   53(fvec2) Load 148(c2)
+            4053:   52(float) Load 215(compare)
+            4054:3146(ResType) ImageSparseDrefGather 4051 4052 4053 ConstOffset 722
+            4055:  7(f16vec4) CompositeExtract 4054 1
+                              Store 3994(texel) 4055
+            4056:     47(int) CompositeExtract 4054 0
+            4057:         371 Load 373(s2DRectShadow)
+            4058:154(f16vec2) Load 156(f16c2)
+            4059:   52(float) Load 215(compare)
+            4060:3146(ResType) ImageSparseDrefGather 4057 4058 4059 ConstOffset 722
+            4061:  7(f16vec4) CompositeExtract 4060 1
+                              Store 3994(texel) 4061
+            4062:     47(int) CompositeExtract 4060 0
+            4063:  7(f16vec4) Load 3994(texel)
+                              ReturnValue 4063
                               FunctionEnd
 89(testSparseTextureGatherOffsets():  7(f16vec4) Function None 8
               90:             Label
-     4022(texel):     64(ptr) Variable Function
-                              Store 4022(texel) 121
-            4023:         143 Load 145(s2D)
-            4024:   53(fvec2) Load 148(c2)
-            4035:3102(ResType) ImageSparseGather 4023 4024 2187 ConstOffsets 4034
-            4036:  7(f16vec4) CompositeExtract 4035 1
-                              Store 4022(texel) 4036
-            4037:     47(int) CompositeExtract 4035 0
-            4038:         143 Load 145(s2D)
-            4039:154(f16vec2) Load 156(f16c2)
-            4040:6(float16_t) Load 137(f16bias)
-            4041:3102(ResType) ImageSparseGather 4038 4039 2187 Bias ConstOffsets 4040 4034
-            4042:  7(f16vec4) CompositeExtract 4041 1
-                              Store 4022(texel) 4042
-            4043:     47(int) CompositeExtract 4041 0
-            4044:         284 Load 286(s2DArray)
-            4045:  167(fvec3) Load 169(c3)
-            4046:3102(ResType) ImageSparseGather 4044 4045 2187 ConstOffsets 4034
-            4047:  7(f16vec4) CompositeExtract 4046 1
-                              Store 4022(texel) 4047
-            4048:     47(int) CompositeExtract 4046 0
-            4049:         284 Load 286(s2DArray)
-            4050:175(f16vec3) Load 177(f16c3)
-            4051:6(float16_t) Load 137(f16bias)
-            4052:3102(ResType) ImageSparseGather 4049 4050 2187 Bias ConstOffsets 4051 4034
-            4053:  7(f16vec4) CompositeExtract 4052 1
-                              Store 4022(texel) 4053
-            4054:     47(int) CompositeExtract 4052 0
-            4055:         357 Load 359(s2DRect)
-            4056:   53(fvec2) Load 148(c2)
-            4057:3102(ResType) ImageSparseGather 4055 4056 2187 ConstOffsets 4034
-            4058:  7(f16vec4) CompositeExtract 4057 1
-                              Store 4022(texel) 4058
-            4059:     47(int) CompositeExtract 4057 0
-            4060:         357 Load 359(s2DRect)
-            4061:154(f16vec2) Load 156(f16c2)
-            4062:3102(ResType) ImageSparseGather 4060 4061 2187 ConstOffsets 4034
-            4063:  7(f16vec4) CompositeExtract 4062 1
-                              Store 4022(texel) 4063
-            4064:     47(int) CompositeExtract 4062 0
-            4065:         224 Load 226(s2DShadow)
-            4066:   53(fvec2) Load 148(c2)
-            4067:   52(float) Load 215(compare)
-            4068:3102(ResType) ImageSparseDrefGather 4065 4066 4067 ConstOffsets 4034
-            4069:  7(f16vec4) CompositeExtract 4068 1
-                              Store 4022(texel) 4069
-            4070:     47(int) CompositeExtract 4068 0
-            4071:         224 Load 226(s2DShadow)
-            4072:154(f16vec2) Load 156(f16c2)
-            4073:   52(float) Load 215(compare)
-            4074:3102(ResType) ImageSparseDrefGather 4071 4072 4073 ConstOffsets 4034
-            4075:  7(f16vec4) CompositeExtract 4074 1
-                              Store 4022(texel) 4075
-            4076:     47(int) CompositeExtract 4074 0
-            4077:         337 Load 339(s2DArrayShadow)
-            4078:  167(fvec3) Load 169(c3)
-            4079:   52(float) Load 215(compare)
-            4080:3102(ResType) ImageSparseDrefGather 4077 4078 4079 ConstOffsets 4034
-            4081:  7(f16vec4) CompositeExtract 4080 1
-                              Store 4022(texel) 4081
-            4082:     47(int) CompositeExtract 4080 0
-            4083:         337 Load 339(s2DArrayShadow)
-            4084:175(f16vec3) Load 177(f16c3)
-            4085:   52(float) Load 215(compare)
-            4086:3102(ResType) ImageSparseDrefGather 4083 4084 4085 ConstOffsets 4034
-            4087:  7(f16vec4) CompositeExtract 4086 1
-                              Store 4022(texel) 4087
-            4088:     47(int) CompositeExtract 4086 0
-            4089:         371 Load 373(s2DRectShadow)
-            4090:   53(fvec2) Load 148(c2)
-            4091:   52(float) Load 215(compare)
-            4092:3102(ResType) ImageSparseDrefGather 4089 4090 4091 ConstOffsets 4034
-            4093:  7(f16vec4) CompositeExtract 4092 1
-                              Store 4022(texel) 4093
-            4094:     47(int) CompositeExtract 4092 0
-            4095:         371 Load 373(s2DRectShadow)
-            4096:154(f16vec2) Load 156(f16c2)
-            4097:   52(float) Load 215(compare)
-            4098:3102(ResType) ImageSparseDrefGather 4095 4096 4097 ConstOffsets 4034
-            4099:  7(f16vec4) CompositeExtract 4098 1
-                              Store 4022(texel) 4099
-            4100:     47(int) CompositeExtract 4098 0
-            4101:  7(f16vec4) Load 4022(texel)
-                              ReturnValue 4101
+     4066(texel):     64(ptr) Variable Function
+                              Store 4066(texel) 121
+            4067:         143 Load 145(s2D)
+            4068:   53(fvec2) Load 148(c2)
+            4079:3146(ResType) ImageSparseGather 4067 4068 2187 ConstOffsets 4078
+            4080:  7(f16vec4) CompositeExtract 4079 1
+                              Store 4066(texel) 4080
+            4081:     47(int) CompositeExtract 4079 0
+            4082:         143 Load 145(s2D)
+            4083:154(f16vec2) Load 156(f16c2)
+            4084:6(float16_t) Load 137(f16bias)
+            4085:3146(ResType) ImageSparseGather 4082 4083 2187 Bias ConstOffsets 4084 4078
+            4086:  7(f16vec4) CompositeExtract 4085 1
+                              Store 4066(texel) 4086
+            4087:     47(int) CompositeExtract 4085 0
+            4088:         284 Load 286(s2DArray)
+            4089:  167(fvec3) Load 169(c3)
+            4090:3146(ResType) ImageSparseGather 4088 4089 2187 ConstOffsets 4078
+            4091:  7(f16vec4) CompositeExtract 4090 1
+                              Store 4066(texel) 4091
+            4092:     47(int) CompositeExtract 4090 0
+            4093:         284 Load 286(s2DArray)
+            4094:175(f16vec3) Load 177(f16c3)
+            4095:6(float16_t) Load 137(f16bias)
+            4096:3146(ResType) ImageSparseGather 4093 4094 2187 Bias ConstOffsets 4095 4078
+            4097:  7(f16vec4) CompositeExtract 4096 1
+                              Store 4066(texel) 4097
+            4098:     47(int) CompositeExtract 4096 0
+            4099:         357 Load 359(s2DRect)
+            4100:   53(fvec2) Load 148(c2)
+            4101:3146(ResType) ImageSparseGather 4099 4100 2187 ConstOffsets 4078
+            4102:  7(f16vec4) CompositeExtract 4101 1
+                              Store 4066(texel) 4102
+            4103:     47(int) CompositeExtract 4101 0
+            4104:         357 Load 359(s2DRect)
+            4105:154(f16vec2) Load 156(f16c2)
+            4106:3146(ResType) ImageSparseGather 4104 4105 2187 ConstOffsets 4078
+            4107:  7(f16vec4) CompositeExtract 4106 1
+                              Store 4066(texel) 4107
+            4108:     47(int) CompositeExtract 4106 0
+            4109:         224 Load 226(s2DShadow)
+            4110:   53(fvec2) Load 148(c2)
+            4111:   52(float) Load 215(compare)
+            4112:3146(ResType) ImageSparseDrefGather 4109 4110 4111 ConstOffsets 4078
+            4113:  7(f16vec4) CompositeExtract 4112 1
+                              Store 4066(texel) 4113
+            4114:     47(int) CompositeExtract 4112 0
+            4115:         224 Load 226(s2DShadow)
+            4116:154(f16vec2) Load 156(f16c2)
+            4117:   52(float) Load 215(compare)
+            4118:3146(ResType) ImageSparseDrefGather 4115 4116 4117 ConstOffsets 4078
+            4119:  7(f16vec4) CompositeExtract 4118 1
+                              Store 4066(texel) 4119
+            4120:     47(int) CompositeExtract 4118 0
+            4121:         337 Load 339(s2DArrayShadow)
+            4122:  167(fvec3) Load 169(c3)
+            4123:   52(float) Load 215(compare)
+            4124:3146(ResType) ImageSparseDrefGather 4121 4122 4123 ConstOffsets 4078
+            4125:  7(f16vec4) CompositeExtract 4124 1
+                              Store 4066(texel) 4125
+            4126:     47(int) CompositeExtract 4124 0
+            4127:         337 Load 339(s2DArrayShadow)
+            4128:175(f16vec3) Load 177(f16c3)
+            4129:   52(float) Load 215(compare)
+            4130:3146(ResType) ImageSparseDrefGather 4127 4128 4129 ConstOffsets 4078
+            4131:  7(f16vec4) CompositeExtract 4130 1
+                              Store 4066(texel) 4131
+            4132:     47(int) CompositeExtract 4130 0
+            4133:         371 Load 373(s2DRectShadow)
+            4134:   53(fvec2) Load 148(c2)
+            4135:   52(float) Load 215(compare)
+            4136:3146(ResType) ImageSparseDrefGather 4133 4134 4135 ConstOffsets 4078
+            4137:  7(f16vec4) CompositeExtract 4136 1
+                              Store 4066(texel) 4137
+            4138:     47(int) CompositeExtract 4136 0
+            4139:         371 Load 373(s2DRectShadow)
+            4140:154(f16vec2) Load 156(f16c2)
+            4141:   52(float) Load 215(compare)
+            4142:3146(ResType) ImageSparseDrefGather 4139 4140 4141 ConstOffsets 4078
+            4143:  7(f16vec4) CompositeExtract 4142 1
+                              Store 4066(texel) 4143
+            4144:     47(int) CompositeExtract 4142 0
+            4145:  7(f16vec4) Load 4066(texel)
+                              ReturnValue 4145
                               FunctionEnd
 91(testSparseTextureGatherLod():  7(f16vec4) Function None 8
               92:             Label
-     4104(texel):     64(ptr) Variable Function
-                              Store 4104(texel) 121
-            4105:         143 Load 145(s2D)
-            4106:   53(fvec2) Load 148(c2)
-            4107:   52(float) Load 565(lod)
-            4108:3102(ResType) ImageSparseGather 4105 4106 2187 Lod 4107
-            4109:  7(f16vec4) CompositeExtract 4108 1
-                              Store 4104(texel) 4109
-            4110:     47(int) CompositeExtract 4108 0
-            4111:         143 Load 145(s2D)
-            4112:154(f16vec2) Load 156(f16c2)
-            4113:6(float16_t) Load 572(f16lod)
-            4114:3102(ResType) ImageSparseGather 4111 4112 2187 Lod 4113
-            4115:  7(f16vec4) CompositeExtract 4114 1
-                              Store 4104(texel) 4115
-            4116:     47(int) CompositeExtract 4114 0
-            4117:         284 Load 286(s2DArray)
-            4118:  167(fvec3) Load 169(c3)
-            4119:   52(float) Load 565(lod)
-            4120:3102(ResType) ImageSparseGather 4117 4118 2187 Lod 4119
-            4121:  7(f16vec4) CompositeExtract 4120 1
-                              Store 4104(texel) 4121
-            4122:     47(int) CompositeExtract 4120 0
-            4123:         284 Load 286(s2DArray)
-            4124:175(f16vec3) Load 177(f16c3)
-            4125:6(float16_t) Load 572(f16lod)
-            4126:3102(ResType) ImageSparseGather 4123 4124 2187 Lod 4125
-            4127:  7(f16vec4) CompositeExtract 4126 1
-                              Store 4104(texel) 4127
-            4128:     47(int) CompositeExtract 4126 0
-            4129:         184 Load 186(sCube)
-            4130:  167(fvec3) Load 169(c3)
-            4131:   52(float) Load 565(lod)
-            4132:3102(ResType) ImageSparseGather 4129 4130 2187 Lod 4131
-            4133:  7(f16vec4) CompositeExtract 4132 1
-                              Store 4104(texel) 4133
-            4134:     47(int) CompositeExtract 4132 0
-            4135:         184 Load 186(sCube)
-            4136:175(f16vec3) Load 177(f16c3)
-            4137:6(float16_t) Load 572(f16lod)
-            4138:3102(ResType) ImageSparseGather 4135 4136 2187 Lod 4137
-            4139:  7(f16vec4) CompositeExtract 4138 1
-                              Store 4104(texel) 4139
-            4140:     47(int) CompositeExtract 4138 0
-            4141:         299 Load 301(sCubeArray)
-            4142:  249(fvec4) Load 251(c4)
-            4143:   52(float) Load 565(lod)
-            4144:3102(ResType) ImageSparseGather 4141 4142 2187 Lod 4143
-            4145:  7(f16vec4) CompositeExtract 4144 1
-                              Store 4104(texel) 4145
-            4146:     47(int) CompositeExtract 4144 0
-            4147:         299 Load 301(sCubeArray)
-            4148:  7(f16vec4) Load 309(f16c4)
-            4149:6(float16_t) Load 572(f16lod)
-            4150:3102(ResType) ImageSparseGather 4147 4148 2187 Lod 4149
-            4151:  7(f16vec4) CompositeExtract 4150 1
-                              Store 4104(texel) 4151
-            4152:     47(int) CompositeExtract 4150 0
-            4153:  7(f16vec4) Load 4104(texel)
-                              ReturnValue 4153
+     4148(texel):     64(ptr) Variable Function
+                              Store 4148(texel) 121
+            4149:         143 Load 145(s2D)
+            4150:   53(fvec2) Load 148(c2)
+            4151:   52(float) Load 565(lod)
+            4152:3146(ResType) ImageSparseGather 4149 4150 2187 Lod 4151
+            4153:  7(f16vec4) CompositeExtract 4152 1
+                              Store 4148(texel) 4153
+            4154:     47(int) CompositeExtract 4152 0
+            4155:         143 Load 145(s2D)
+            4156:154(f16vec2) Load 156(f16c2)
+            4157:6(float16_t) Load 572(f16lod)
+            4158:3146(ResType) ImageSparseGather 4155 4156 2187 Lod 4157
+            4159:  7(f16vec4) CompositeExtract 4158 1
+                              Store 4148(texel) 4159
+            4160:     47(int) CompositeExtract 4158 0
+            4161:         284 Load 286(s2DArray)
+            4162:  167(fvec3) Load 169(c3)
+            4163:   52(float) Load 565(lod)
+            4164:3146(ResType) ImageSparseGather 4161 4162 2187 Lod 4163
+            4165:  7(f16vec4) CompositeExtract 4164 1
+                              Store 4148(texel) 4165
+            4166:     47(int) CompositeExtract 4164 0
+            4167:         284 Load 286(s2DArray)
+            4168:175(f16vec3) Load 177(f16c3)
+            4169:6(float16_t) Load 572(f16lod)
+            4170:3146(ResType) ImageSparseGather 4167 4168 2187 Lod 4169
+            4171:  7(f16vec4) CompositeExtract 4170 1
+                              Store 4148(texel) 4171
+            4172:     47(int) CompositeExtract 4170 0
+            4173:         184 Load 186(sCube)
+            4174:  167(fvec3) Load 169(c3)
+            4175:   52(float) Load 565(lod)
+            4176:3146(ResType) ImageSparseGather 4173 4174 2187 Lod 4175
+            4177:  7(f16vec4) CompositeExtract 4176 1
+                              Store 4148(texel) 4177
+            4178:     47(int) CompositeExtract 4176 0
+            4179:         184 Load 186(sCube)
+            4180:175(f16vec3) Load 177(f16c3)
+            4181:6(float16_t) Load 572(f16lod)
+            4182:3146(ResType) ImageSparseGather 4179 4180 2187 Lod 4181
+            4183:  7(f16vec4) CompositeExtract 4182 1
+                              Store 4148(texel) 4183
+            4184:     47(int) CompositeExtract 4182 0
+            4185:         299 Load 301(sCubeArray)
+            4186:  249(fvec4) Load 251(c4)
+            4187:   52(float) Load 565(lod)
+            4188:3146(ResType) ImageSparseGather 4185 4186 2187 Lod 4187
+            4189:  7(f16vec4) CompositeExtract 4188 1
+                              Store 4148(texel) 4189
+            4190:     47(int) CompositeExtract 4188 0
+            4191:         299 Load 301(sCubeArray)
+            4192:  7(f16vec4) Load 309(f16c4)
+            4193:6(float16_t) Load 572(f16lod)
+            4194:3146(ResType) ImageSparseGather 4191 4192 2187 Lod 4193
+            4195:  7(f16vec4) CompositeExtract 4194 1
+                              Store 4148(texel) 4195
+            4196:     47(int) CompositeExtract 4194 0
+            4197:  7(f16vec4) Load 4148(texel)
+                              ReturnValue 4197
                               FunctionEnd
 93(testSparseTextureGatherLodOffset():  7(f16vec4) Function None 8
               94:             Label
-     4156(texel):     64(ptr) Variable Function
-                              Store 4156(texel) 121
-            4157:         143 Load 145(s2D)
-            4158:   53(fvec2) Load 148(c2)
-            4159:   52(float) Load 565(lod)
-            4160:3102(ResType) ImageSparseGather 4157 4158 2187 Lod ConstOffset 4159 722
-            4161:  7(f16vec4) CompositeExtract 4160 1
-                              Store 4156(texel) 4161
-            4162:     47(int) CompositeExtract 4160 0
-            4163:         143 Load 145(s2D)
-            4164:154(f16vec2) Load 156(f16c2)
-            4165:6(float16_t) Load 572(f16lod)
-            4166:3102(ResType) ImageSparseGather 4163 4164 2187 Lod ConstOffset 4165 722
-            4167:  7(f16vec4) CompositeExtract 4166 1
-                              Store 4156(texel) 4167
-            4168:     47(int) CompositeExtract 4166 0
-            4169:         284 Load 286(s2DArray)
-            4170:  167(fvec3) Load 169(c3)
-            4171:   52(float) Load 565(lod)
-            4172:3102(ResType) ImageSparseGather 4169 4170 2187 Lod ConstOffset 4171 722
-            4173:  7(f16vec4) CompositeExtract 4172 1
-                              Store 4156(texel) 4173
-            4174:     47(int) CompositeExtract 4172 0
-            4175:         284 Load 286(s2DArray)
-            4176:175(f16vec3) Load 177(f16c3)
-            4177:6(float16_t) Load 572(f16lod)
-            4178:3102(ResType) ImageSparseGather 4175 4176 2187 Lod ConstOffset 4177 722
-            4179:  7(f16vec4) CompositeExtract 4178 1
-                              Store 4156(texel) 4179
-            4180:     47(int) CompositeExtract 4178 0
-            4181:  7(f16vec4) Load 4156(texel)
-                              ReturnValue 4181
+     4200(texel):     64(ptr) Variable Function
+                              Store 4200(texel) 121
+            4201:         143 Load 145(s2D)
+            4202:   53(fvec2) Load 148(c2)
+            4203:   52(float) Load 565(lod)
+            4204:3146(ResType) ImageSparseGather 4201 4202 2187 Lod ConstOffset 4203 722
+            4205:  7(f16vec4) CompositeExtract 4204 1
+                              Store 4200(texel) 4205
+            4206:     47(int) CompositeExtract 4204 0
+            4207:         143 Load 145(s2D)
+            4208:154(f16vec2) Load 156(f16c2)
+            4209:6(float16_t) Load 572(f16lod)
+            4210:3146(ResType) ImageSparseGather 4207 4208 2187 Lod ConstOffset 4209 722
+            4211:  7(f16vec4) CompositeExtract 4210 1
+                              Store 4200(texel) 4211
+            4212:     47(int) CompositeExtract 4210 0
+            4213:         284 Load 286(s2DArray)
+            4214:  167(fvec3) Load 169(c3)
+            4215:   52(float) Load 565(lod)
+            4216:3146(ResType) ImageSparseGather 4213 4214 2187 Lod ConstOffset 4215 722
+            4217:  7(f16vec4) CompositeExtract 4216 1
+                              Store 4200(texel) 4217
+            4218:     47(int) CompositeExtract 4216 0
+            4219:         284 Load 286(s2DArray)
+            4220:175(f16vec3) Load 177(f16c3)
+            4221:6(float16_t) Load 572(f16lod)
+            4222:3146(ResType) ImageSparseGather 4219 4220 2187 Lod ConstOffset 4221 722
+            4223:  7(f16vec4) CompositeExtract 4222 1
+                              Store 4200(texel) 4223
+            4224:     47(int) CompositeExtract 4222 0
+            4225:  7(f16vec4) Load 4200(texel)
+                              ReturnValue 4225
                               FunctionEnd
 95(testSparseTextureGatherLodOffsets():  7(f16vec4) Function None 8
               96:             Label
-     4184(texel):     64(ptr) Variable Function
-                              Store 4184(texel) 121
-            4185:         143 Load 145(s2D)
-            4186:   53(fvec2) Load 148(c2)
-            4187:   52(float) Load 565(lod)
-            4188:3102(ResType) ImageSparseGather 4185 4186 2187 Lod ConstOffsets 4187 2380
-            4189:  7(f16vec4) CompositeExtract 4188 1
-                              Store 4184(texel) 4189
-            4190:     47(int) CompositeExtract 4188 0
-            4191:         143 Load 145(s2D)
-            4192:154(f16vec2) Load 156(f16c2)
-            4193:6(float16_t) Load 572(f16lod)
-            4194:3102(ResType) ImageSparseGather 4191 4192 2187 Lod ConstOffsets 4193 2380
-            4195:  7(f16vec4) CompositeExtract 4194 1
-                              Store 4184(texel) 4195
-            4196:     47(int) CompositeExtract 4194 0
-            4197:         284 Load 286(s2DArray)
-            4198:  167(fvec3) Load 169(c3)
-            4199:   52(float) Load 565(lod)
-            4200:3102(ResType) ImageSparseGather 4197 4198 2187 Lod ConstOffsets 4199 2380
-            4201:  7(f16vec4) CompositeExtract 4200 1
-                              Store 4184(texel) 4201
-            4202:     47(int) CompositeExtract 4200 0
-            4203:         284 Load 286(s2DArray)
-            4204:175(f16vec3) Load 177(f16c3)
-            4205:6(float16_t) Load 572(f16lod)
-            4206:3102(ResType) ImageSparseGather 4203 4204 2187 Lod ConstOffsets 4205 2380
-            4207:  7(f16vec4) CompositeExtract 4206 1
-                              Store 4184(texel) 4207
-            4208:     47(int) CompositeExtract 4206 0
-            4209:  7(f16vec4) Load 4184(texel)
-                              ReturnValue 4209
+     4228(texel):     64(ptr) Variable Function
+                              Store 4228(texel) 121
+            4229:         143 Load 145(s2D)
+            4230:   53(fvec2) Load 148(c2)
+            4231:   52(float) Load 565(lod)
+            4232:3146(ResType) ImageSparseGather 4229 4230 2187 Lod ConstOffsets 4231 2380
+            4233:  7(f16vec4) CompositeExtract 4232 1
+                              Store 4228(texel) 4233
+            4234:     47(int) CompositeExtract 4232 0
+            4235:         143 Load 145(s2D)
+            4236:154(f16vec2) Load 156(f16c2)
+            4237:6(float16_t) Load 572(f16lod)
+            4238:3146(ResType) ImageSparseGather 4235 4236 2187 Lod ConstOffsets 4237 2380
+            4239:  7(f16vec4) CompositeExtract 4238 1
+                              Store 4228(texel) 4239
+            4240:     47(int) CompositeExtract 4238 0
+            4241:         284 Load 286(s2DArray)
+            4242:  167(fvec3) Load 169(c3)
+            4243:   52(float) Load 565(lod)
+            4244:3146(ResType) ImageSparseGather 4241 4242 2187 Lod ConstOffsets 4243 2380
+            4245:  7(f16vec4) CompositeExtract 4244 1
+                              Store 4228(texel) 4245
+            4246:     47(int) CompositeExtract 4244 0
+            4247:         284 Load 286(s2DArray)
+            4248:175(f16vec3) Load 177(f16c3)
+            4249:6(float16_t) Load 572(f16lod)
+            4250:3146(ResType) ImageSparseGather 4247 4248 2187 Lod ConstOffsets 4249 2380
+            4251:  7(f16vec4) CompositeExtract 4250 1
+                              Store 4228(texel) 4251
+            4252:     47(int) CompositeExtract 4250 0
+            4253:  7(f16vec4) Load 4228(texel)
+                              ReturnValue 4253
                               FunctionEnd
 97(testSparseImageLoad():  7(f16vec4) Function None 8
               98:             Label
-     4212(texel):     64(ptr) Variable Function
-                              Store 4212(texel) 121
-            4213:        2962 Load 2964(i2D)
-            4214:   53(fvec2) Load 148(c2)
-            4215:  721(ivec2) ConvertFToS 4214
-            4216:3102(ResType) ImageSparseRead 4213 4215
-            4217:  7(f16vec4) CompositeExtract 4216 1
-                              Store 4212(texel) 4217
-            4218:     47(int) CompositeExtract 4216 0
-            4219:        2971 Load 2973(i3D)
-            4220:  167(fvec3) Load 169(c3)
-            4221:  734(ivec3) ConvertFToS 4220
-            4222:3102(ResType) ImageSparseRead 4219 4221
-            4223:  7(f16vec4) CompositeExtract 4222 1
-                              Store 4212(texel) 4223
-            4224:     47(int) CompositeExtract 4222 0
-            4225:        2980 Load 2982(i2DRect)
-            4226:   53(fvec2) Load 148(c2)
-            4227:  721(ivec2) ConvertFToS 4226
-            4228:3102(ResType) ImageSparseRead 4225 4227
-            4229:  7(f16vec4) CompositeExtract 4228 1
-                              Store 4212(texel) 4229
-            4230:     47(int) CompositeExtract 4228 0
-            4231:        2989 Load 2991(iCube)
-            4232:  167(fvec3) Load 169(c3)
-            4233:  734(ivec3) ConvertFToS 4232
-            4234:3102(ResType) ImageSparseRead 4231 4233
-            4235:  7(f16vec4) CompositeExtract 4234 1
-                              Store 4212(texel) 4235
-            4236:     47(int) CompositeExtract 4234 0
-            4237:        3016 Load 3018(i2DArray)
-            4238:  167(fvec3) Load 169(c3)
-            4239:  734(ivec3) ConvertFToS 4238
-            4240:3102(ResType) ImageSparseRead 4237 4239
-            4241:  7(f16vec4) CompositeExtract 4240 1
-                              Store 4212(texel) 4241
-            4242:     47(int) CompositeExtract 4240 0
-            4243:        3025 Load 3027(iCubeArray)
-            4244:  167(fvec3) Load 169(c3)
-            4245:  734(ivec3) ConvertFToS 4244
-            4246:3102(ResType) ImageSparseRead 4243 4245
-            4247:  7(f16vec4) CompositeExtract 4246 1
-                              Store 4212(texel) 4247
-            4248:     47(int) CompositeExtract 4246 0
-            4249:        3034 Load 3036(i2DMS)
-            4250:   53(fvec2) Load 148(c2)
-            4251:  721(ivec2) ConvertFToS 4250
-            4252:3102(ResType) ImageSparseRead 4249 4251 Sample 709
-            4253:  7(f16vec4) CompositeExtract 4252 1
-                              Store 4212(texel) 4253
-            4254:     47(int) CompositeExtract 4252 0
-            4255:        3043 Load 3045(i2DMSArray)
-            4256:  167(fvec3) Load 169(c3)
-            4257:  734(ivec3) ConvertFToS 4256
-            4258:3102(ResType) ImageSparseRead 4255 4257 Sample 1326
-            4259:  7(f16vec4) CompositeExtract 4258 1
-                              Store 4212(texel) 4259
-            4260:     47(int) CompositeExtract 4258 0
-            4261:  7(f16vec4) Load 4212(texel)
-                              ReturnValue 4261
+     4256(texel):     64(ptr) Variable Function
+                              Store 4256(texel) 121
+            4257:        3006 Load 3008(i2D)
+            4258:   53(fvec2) Load 148(c2)
+            4259:  721(ivec2) ConvertFToS 4258
+            4260:3146(ResType) ImageSparseRead 4257 4259
+            4261:  7(f16vec4) CompositeExtract 4260 1
+                              Store 4256(texel) 4261
+            4262:     47(int) CompositeExtract 4260 0
+            4263:        3015 Load 3017(i3D)
+            4264:  167(fvec3) Load 169(c3)
+            4265:  734(ivec3) ConvertFToS 4264
+            4266:3146(ResType) ImageSparseRead 4263 4265
+            4267:  7(f16vec4) CompositeExtract 4266 1
+                              Store 4256(texel) 4267
+            4268:     47(int) CompositeExtract 4266 0
+            4269:        3024 Load 3026(i2DRect)
+            4270:   53(fvec2) Load 148(c2)
+            4271:  721(ivec2) ConvertFToS 4270
+            4272:3146(ResType) ImageSparseRead 4269 4271
+            4273:  7(f16vec4) CompositeExtract 4272 1
+                              Store 4256(texel) 4273
+            4274:     47(int) CompositeExtract 4272 0
+            4275:        3033 Load 3035(iCube)
+            4276:  167(fvec3) Load 169(c3)
+            4277:  734(ivec3) ConvertFToS 4276
+            4278:3146(ResType) ImageSparseRead 4275 4277
+            4279:  7(f16vec4) CompositeExtract 4278 1
+                              Store 4256(texel) 4279
+            4280:     47(int) CompositeExtract 4278 0
+            4281:        3060 Load 3062(i2DArray)
+            4282:  167(fvec3) Load 169(c3)
+            4283:  734(ivec3) ConvertFToS 4282
+            4284:3146(ResType) ImageSparseRead 4281 4283
+            4285:  7(f16vec4) CompositeExtract 4284 1
+                              Store 4256(texel) 4285
+            4286:     47(int) CompositeExtract 4284 0
+            4287:        3069 Load 3071(iCubeArray)
+            4288:  167(fvec3) Load 169(c3)
+            4289:  734(ivec3) ConvertFToS 4288
+            4290:3146(ResType) ImageSparseRead 4287 4289
+            4291:  7(f16vec4) CompositeExtract 4290 1
+                              Store 4256(texel) 4291
+            4292:     47(int) CompositeExtract 4290 0
+            4293:        3078 Load 3080(i2DMS)
+            4294:   53(fvec2) Load 148(c2)
+            4295:  721(ivec2) ConvertFToS 4294
+            4296:3146(ResType) ImageSparseRead 4293 4295 Sample 709
+            4297:  7(f16vec4) CompositeExtract 4296 1
+                              Store 4256(texel) 4297
+            4298:     47(int) CompositeExtract 4296 0
+            4299:        3087 Load 3089(i2DMSArray)
+            4300:  167(fvec3) Load 169(c3)
+            4301:  734(ivec3) ConvertFToS 4300
+            4302:3146(ResType) ImageSparseRead 4299 4301 Sample 1326
+            4303:  7(f16vec4) CompositeExtract 4302 1
+                              Store 4256(texel) 4303
+            4304:     47(int) CompositeExtract 4302 0
+            4305:  7(f16vec4) Load 4256(texel)
+                              ReturnValue 4305
                               FunctionEnd
 99(testSparseTextureClamp():  7(f16vec4) Function None 8
              100:             Label
-     4264(texel):     64(ptr) Variable Function
-                              Store 4264(texel) 121
-            4265:         143 Load 145(s2D)
-            4266:   53(fvec2) Load 148(c2)
-            4268:   52(float) Load 4267(lodClamp)
-            4269:3102(ResType) ImageSparseSampleImplicitLod 4265 4266 MinLod 4268
-            4270:  7(f16vec4) CompositeExtract 4269 1
-                              Store 4264(texel) 4270
-            4271:     47(int) CompositeExtract 4269 0
-            4272:         143 Load 145(s2D)
-            4273:154(f16vec2) Load 156(f16c2)
-            4275:6(float16_t) Load 4274(f16lodClamp)
-            4276:6(float16_t) Load 137(f16bias)
-            4277:3102(ResType) ImageSparseSampleImplicitLod 4272 4273 Bias MinLod 4276 4275
-            4278:  7(f16vec4) CompositeExtract 4277 1
-                              Store 4264(texel) 4278
-            4279:     47(int) CompositeExtract 4277 0
-            4280:         163 Load 165(s3D)
-            4281:  167(fvec3) Load 169(c3)
-            4282:   52(float) Load 4267(lodClamp)
-            4283:3102(ResType) ImageSparseSampleImplicitLod 4280 4281 MinLod 4282
-            4284:  7(f16vec4) CompositeExtract 4283 1
-                              Store 4264(texel) 4284
-            4285:     47(int) CompositeExtract 4283 0
-            4286:         163 Load 165(s3D)
-            4287:175(f16vec3) Load 177(f16c3)
-            4288:6(float16_t) Load 4274(f16lodClamp)
-            4289:6(float16_t) Load 137(f16bias)
-            4290:3102(ResType) ImageSparseSampleImplicitLod 4286 4287 Bias MinLod 4289 4288
-            4291:  7(f16vec4) CompositeExtract 4290 1
-                              Store 4264(texel) 4291
-            4292:     47(int) CompositeExtract 4290 0
-            4293:         184 Load 186(sCube)
-            4294:  167(fvec3) Load 169(c3)
-            4295:   52(float) Load 4267(lodClamp)
-            4296:3102(ResType) ImageSparseSampleImplicitLod 4293 4294 MinLod 4295
-            4297:  7(f16vec4) CompositeExtract 4296 1
-                              Store 4264(texel) 4297
-            4298:     47(int) CompositeExtract 4296 0
-            4299:         184 Load 186(sCube)
-            4300:175(f16vec3) Load 177(f16c3)
-            4301:6(float16_t) Load 4274(f16lodClamp)
-            4302:6(float16_t) Load 137(f16bias)
-            4303:3102(ResType) ImageSparseSampleImplicitLod 4299 4300 Bias MinLod 4302 4301
-            4304:  7(f16vec4) CompositeExtract 4303 1
-                              Store 4264(texel) 4304
-            4305:     47(int) CompositeExtract 4303 0
-            4306:         224 Load 226(s2DShadow)
-            4307:  167(fvec3) Load 169(c3)
-            4308:   52(float) Load 4267(lodClamp)
-            4309:    208(ptr) AccessChain 4264(texel) 207
-            4310:   52(float) CompositeExtract 4307 2
-            4311:3138(ResType) ImageSparseSampleDrefImplicitLod 4306 4307 4310 MinLod 4308
-            4312:6(float16_t) CompositeExtract 4311 1
-                              Store 4309 4312
-            4313:     47(int) CompositeExtract 4311 0
-            4314:         224 Load 226(s2DShadow)
-            4315:154(f16vec2) Load 156(f16c2)
-            4316:   52(float) Load 215(compare)
-            4317:6(float16_t) Load 4274(f16lodClamp)
-            4318:    208(ptr) AccessChain 4264(texel) 207
-            4319:6(float16_t) Load 137(f16bias)
-            4320:3138(ResType) ImageSparseSampleDrefImplicitLod 4314 4315 4316 Bias MinLod 4319 4317
-            4321:6(float16_t) CompositeExtract 4320 1
-                              Store 4318 4321
-            4322:     47(int) CompositeExtract 4320 0
-            4323:         245 Load 247(sCubeShadow)
-            4324:  249(fvec4) Load 251(c4)
-            4325:   52(float) Load 4267(lodClamp)
-            4326:    208(ptr) AccessChain 4264(texel) 207
-            4327:   52(float) CompositeExtract 4324 3
-            4328:3138(ResType) ImageSparseSampleDrefImplicitLod 4323 4324 4327 MinLod 4325
-            4329:6(float16_t) CompositeExtract 4328 1
-                              Store 4326 4329
-            4330:     47(int) CompositeExtract 4328 0
-            4331:         245 Load 247(sCubeShadow)
-            4332:175(f16vec3) Load 177(f16c3)
-            4333:   52(float) Load 215(compare)
-            4334:6(float16_t) Load 4274(f16lodClamp)
-            4335:    208(ptr) AccessChain 4264(texel) 207
-            4336:6(float16_t) Load 137(f16bias)
-            4337:3138(ResType) ImageSparseSampleDrefImplicitLod 4331 4332 4333 Bias MinLod 4336 4334
-            4338:6(float16_t) CompositeExtract 4337 1
-                              Store 4335 4338
-            4339:     47(int) CompositeExtract 4337 0
-            4340:         284 Load 286(s2DArray)
-            4341:  167(fvec3) Load 169(c3)
-            4342:   52(float) Load 4267(lodClamp)
-            4343:3102(ResType) ImageSparseSampleImplicitLod 4340 4341 MinLod 4342
-            4344:  7(f16vec4) CompositeExtract 4343 1
-                              Store 4264(texel) 4344
-            4345:     47(int) CompositeExtract 4343 0
-            4346:         284 Load 286(s2DArray)
-            4347:175(f16vec3) Load 177(f16c3)
-            4348:6(float16_t) Load 4274(f16lodClamp)
-            4349:6(float16_t) Load 137(f16bias)
-            4350:3102(ResType) ImageSparseSampleImplicitLod 4346 4347 Bias MinLod 4349 4348
-            4351:  7(f16vec4) CompositeExtract 4350 1
-                              Store 4264(texel) 4351
-            4352:     47(int) CompositeExtract 4350 0
-            4353:         299 Load 301(sCubeArray)
-            4354:  249(fvec4) Load 251(c4)
-            4355:   52(float) Load 4267(lodClamp)
-            4356:3102(ResType) ImageSparseSampleImplicitLod 4353 4354 MinLod 4355
-            4357:  7(f16vec4) CompositeExtract 4356 1
-                              Store 4264(texel) 4357
-            4358:     47(int) CompositeExtract 4356 0
-            4359:         299 Load 301(sCubeArray)
-            4360:  7(f16vec4) Load 309(f16c4)
-            4361:6(float16_t) Load 4274(f16lodClamp)
-            4362:6(float16_t) Load 137(f16bias)
-            4363:3102(ResType) ImageSparseSampleImplicitLod 4359 4360 Bias MinLod 4362 4361
-            4364:  7(f16vec4) CompositeExtract 4363 1
-                              Store 4264(texel) 4364
-            4365:     47(int) CompositeExtract 4363 0
-            4366:         337 Load 339(s2DArrayShadow)
-            4367:  249(fvec4) Load 251(c4)
-            4368:   52(float) Load 4267(lodClamp)
-            4369:    208(ptr) AccessChain 4264(texel) 207
-            4370:   52(float) CompositeExtract 4367 3
-            4371:3138(ResType) ImageSparseSampleDrefImplicitLod 4366 4367 4370 MinLod 4368
-            4372:6(float16_t) CompositeExtract 4371 1
-                              Store 4369 4372
-            4373:     47(int) CompositeExtract 4371 0
-            4374:         337 Load 339(s2DArrayShadow)
-            4375:175(f16vec3) Load 177(f16c3)
-            4376:   52(float) Load 215(compare)
-            4377:6(float16_t) Load 4274(f16lodClamp)
-            4378:    208(ptr) AccessChain 4264(texel) 207
-            4379:3138(ResType) ImageSparseSampleDrefImplicitLod 4374 4375 4376 MinLod 4377
-            4380:6(float16_t) CompositeExtract 4379 1
-                              Store 4378 4380
-            4381:     47(int) CompositeExtract 4379 0
-            4382:         391 Load 393(sCubeArrayShadow)
-            4383:  249(fvec4) Load 251(c4)
-            4384:   52(float) Load 215(compare)
-            4385:   52(float) Load 4267(lodClamp)
-            4386:    208(ptr) AccessChain 4264(texel) 207
-            4387:3138(ResType) ImageSparseSampleDrefImplicitLod 4382 4383 4384 MinLod 4385
-            4388:6(float16_t) CompositeExtract 4387 1
-                              Store 4386 4388
+     4308(texel):     64(ptr) Variable Function
+                              Store 4308(texel) 121
+            4309:         143 Load 145(s2D)
+            4310:   53(fvec2) Load 148(c2)
+            4312:   52(float) Load 4311(lodClamp)
+            4313:3146(ResType) ImageSparseSampleImplicitLod 4309 4310 MinLod 4312
+            4314:  7(f16vec4) CompositeExtract 4313 1
+                              Store 4308(texel) 4314
+            4315:     47(int) CompositeExtract 4313 0
+            4316:         143 Load 145(s2D)
+            4317:154(f16vec2) Load 156(f16c2)
+            4319:6(float16_t) Load 4318(f16lodClamp)
+            4320:6(float16_t) Load 137(f16bias)
+            4321:3146(ResType) ImageSparseSampleImplicitLod 4316 4317 Bias MinLod 4320 4319
+            4322:  7(f16vec4) CompositeExtract 4321 1
+                              Store 4308(texel) 4322
+            4323:     47(int) CompositeExtract 4321 0
+            4324:         163 Load 165(s3D)
+            4325:  167(fvec3) Load 169(c3)
+            4326:   52(float) Load 4311(lodClamp)
+            4327:3146(ResType) ImageSparseSampleImplicitLod 4324 4325 MinLod 4326
+            4328:  7(f16vec4) CompositeExtract 4327 1
+                              Store 4308(texel) 4328
+            4329:     47(int) CompositeExtract 4327 0
+            4330:         163 Load 165(s3D)
+            4331:175(f16vec3) Load 177(f16c3)
+            4332:6(float16_t) Load 4318(f16lodClamp)
+            4333:6(float16_t) Load 137(f16bias)
+            4334:3146(ResType) ImageSparseSampleImplicitLod 4330 4331 Bias MinLod 4333 4332
+            4335:  7(f16vec4) CompositeExtract 4334 1
+                              Store 4308(texel) 4335
+            4336:     47(int) CompositeExtract 4334 0
+            4337:         184 Load 186(sCube)
+            4338:  167(fvec3) Load 169(c3)
+            4339:   52(float) Load 4311(lodClamp)
+            4340:3146(ResType) ImageSparseSampleImplicitLod 4337 4338 MinLod 4339
+            4341:  7(f16vec4) CompositeExtract 4340 1
+                              Store 4308(texel) 4341
+            4342:     47(int) CompositeExtract 4340 0
+            4343:         184 Load 186(sCube)
+            4344:175(f16vec3) Load 177(f16c3)
+            4345:6(float16_t) Load 4318(f16lodClamp)
+            4346:6(float16_t) Load 137(f16bias)
+            4347:3146(ResType) ImageSparseSampleImplicitLod 4343 4344 Bias MinLod 4346 4345
+            4348:  7(f16vec4) CompositeExtract 4347 1
+                              Store 4308(texel) 4348
+            4349:     47(int) CompositeExtract 4347 0
+            4350:         224 Load 226(s2DShadow)
+            4351:  167(fvec3) Load 169(c3)
+            4352:   52(float) Load 4311(lodClamp)
+            4353:    208(ptr) AccessChain 4308(texel) 207
+            4354:   52(float) CompositeExtract 4351 2
+            4355:3182(ResType) ImageSparseSampleDrefImplicitLod 4350 4351 4354 MinLod 4352
+            4356:6(float16_t) CompositeExtract 4355 1
+                              Store 4353 4356
+            4357:     47(int) CompositeExtract 4355 0
+            4358:         224 Load 226(s2DShadow)
+            4359:154(f16vec2) Load 156(f16c2)
+            4360:   52(float) Load 215(compare)
+            4361:6(float16_t) Load 4318(f16lodClamp)
+            4362:    208(ptr) AccessChain 4308(texel) 207
+            4363:6(float16_t) Load 137(f16bias)
+            4364:3182(ResType) ImageSparseSampleDrefImplicitLod 4358 4359 4360 Bias MinLod 4363 4361
+            4365:6(float16_t) CompositeExtract 4364 1
+                              Store 4362 4365
+            4366:     47(int) CompositeExtract 4364 0
+            4367:         245 Load 247(sCubeShadow)
+            4368:  249(fvec4) Load 251(c4)
+            4369:   52(float) Load 4311(lodClamp)
+            4370:    208(ptr) AccessChain 4308(texel) 207
+            4371:   52(float) CompositeExtract 4368 3
+            4372:3182(ResType) ImageSparseSampleDrefImplicitLod 4367 4368 4371 MinLod 4369
+            4373:6(float16_t) CompositeExtract 4372 1
+                              Store 4370 4373
+            4374:     47(int) CompositeExtract 4372 0
+            4375:         245 Load 247(sCubeShadow)
+            4376:175(f16vec3) Load 177(f16c3)
+            4377:   52(float) Load 215(compare)
+            4378:6(float16_t) Load 4318(f16lodClamp)
+            4379:    208(ptr) AccessChain 4308(texel) 207
+            4380:6(float16_t) Load 137(f16bias)
+            4381:3182(ResType) ImageSparseSampleDrefImplicitLod 4375 4376 4377 Bias MinLod 4380 4378
+            4382:6(float16_t) CompositeExtract 4381 1
+                              Store 4379 4382
+            4383:     47(int) CompositeExtract 4381 0
+            4384:         284 Load 286(s2DArray)
+            4385:  167(fvec3) Load 169(c3)
+            4386:   52(float) Load 4311(lodClamp)
+            4387:3146(ResType) ImageSparseSampleImplicitLod 4384 4385 MinLod 4386
+            4388:  7(f16vec4) CompositeExtract 4387 1
+                              Store 4308(texel) 4388
             4389:     47(int) CompositeExtract 4387 0
-            4390:         391 Load 393(sCubeArrayShadow)
-            4391:  7(f16vec4) Load 309(f16c4)
-            4392:   52(float) Load 215(compare)
-            4393:6(float16_t) Load 4274(f16lodClamp)
-            4394:    208(ptr) AccessChain 4264(texel) 207
-            4395:3138(ResType) ImageSparseSampleDrefImplicitLod 4390 4391 4392 MinLod 4393
-            4396:6(float16_t) CompositeExtract 4395 1
-                              Store 4394 4396
-            4397:     47(int) CompositeExtract 4395 0
-            4398:  7(f16vec4) Load 4264(texel)
-                              ReturnValue 4398
+            4390:         284 Load 286(s2DArray)
+            4391:175(f16vec3) Load 177(f16c3)
+            4392:6(float16_t) Load 4318(f16lodClamp)
+            4393:6(float16_t) Load 137(f16bias)
+            4394:3146(ResType) ImageSparseSampleImplicitLod 4390 4391 Bias MinLod 4393 4392
+            4395:  7(f16vec4) CompositeExtract 4394 1
+                              Store 4308(texel) 4395
+            4396:     47(int) CompositeExtract 4394 0
+            4397:         299 Load 301(sCubeArray)
+            4398:  249(fvec4) Load 251(c4)
+            4399:   52(float) Load 4311(lodClamp)
+            4400:3146(ResType) ImageSparseSampleImplicitLod 4397 4398 MinLod 4399
+            4401:  7(f16vec4) CompositeExtract 4400 1
+                              Store 4308(texel) 4401
+            4402:     47(int) CompositeExtract 4400 0
+            4403:         299 Load 301(sCubeArray)
+            4404:  7(f16vec4) Load 309(f16c4)
+            4405:6(float16_t) Load 4318(f16lodClamp)
+            4406:6(float16_t) Load 137(f16bias)
+            4407:3146(ResType) ImageSparseSampleImplicitLod 4403 4404 Bias MinLod 4406 4405
+            4408:  7(f16vec4) CompositeExtract 4407 1
+                              Store 4308(texel) 4408
+            4409:     47(int) CompositeExtract 4407 0
+            4410:         337 Load 339(s2DArrayShadow)
+            4411:  249(fvec4) Load 251(c4)
+            4412:   52(float) Load 4311(lodClamp)
+            4413:    208(ptr) AccessChain 4308(texel) 207
+            4414:   52(float) CompositeExtract 4411 3
+            4415:3182(ResType) ImageSparseSampleDrefImplicitLod 4410 4411 4414 MinLod 4412
+            4416:6(float16_t) CompositeExtract 4415 1
+                              Store 4413 4416
+            4417:     47(int) CompositeExtract 4415 0
+            4418:         337 Load 339(s2DArrayShadow)
+            4419:175(f16vec3) Load 177(f16c3)
+            4420:   52(float) Load 215(compare)
+            4421:6(float16_t) Load 4318(f16lodClamp)
+            4422:    208(ptr) AccessChain 4308(texel) 207
+            4423:3182(ResType) ImageSparseSampleDrefImplicitLod 4418 4419 4420 MinLod 4421
+            4424:6(float16_t) CompositeExtract 4423 1
+                              Store 4422 4424
+            4425:     47(int) CompositeExtract 4423 0
+            4426:         391 Load 393(sCubeArrayShadow)
+            4427:  249(fvec4) Load 251(c4)
+            4428:   52(float) Load 215(compare)
+            4429:   52(float) Load 4311(lodClamp)
+            4430:    208(ptr) AccessChain 4308(texel) 207
+            4431:3182(ResType) ImageSparseSampleDrefImplicitLod 4426 4427 4428 MinLod 4429
+            4432:6(float16_t) CompositeExtract 4431 1
+                              Store 4430 4432
+            4433:     47(int) CompositeExtract 4431 0
+            4434:         391 Load 393(sCubeArrayShadow)
+            4435:  7(f16vec4) Load 309(f16c4)
+            4436:   52(float) Load 215(compare)
+            4437:6(float16_t) Load 4318(f16lodClamp)
+            4438:    208(ptr) AccessChain 4308(texel) 207
+            4439:3182(ResType) ImageSparseSampleDrefImplicitLod 4434 4435 4436 MinLod 4437
+            4440:6(float16_t) CompositeExtract 4439 1
+                              Store 4438 4440
+            4441:     47(int) CompositeExtract 4439 0
+            4442:  7(f16vec4) Load 4308(texel)
+                              ReturnValue 4442
                               FunctionEnd
 101(testTextureClamp():  7(f16vec4) Function None 8
              102:             Label
-     4401(texel):     64(ptr) Variable Function
-                              Store 4401(texel) 121
-            4402:         123 Load 125(s1D)
-            4403:   52(float) Load 128(c1)
-            4404:   52(float) Load 4267(lodClamp)
-            4405:  7(f16vec4) ImageSampleImplicitLod 4402 4403 MinLod 4404
-            4406:  7(f16vec4) Load 4401(texel)
-            4407:  7(f16vec4) FAdd 4406 4405
-                              Store 4401(texel) 4407
-            4408:         123 Load 125(s1D)
-            4409:6(float16_t) Load 135(f16c1)
-            4410:6(float16_t) Load 4274(f16lodClamp)
-            4411:6(float16_t) Load 137(f16bias)
-            4412:  7(f16vec4) ImageSampleImplicitLod 4408 4409 Bias MinLod 4411 4410
-            4413:  7(f16vec4) Load 4401(texel)
-            4414:  7(f16vec4) FAdd 4413 4412
-                              Store 4401(texel) 4414
-            4415:         143 Load 145(s2D)
-            4416:   53(fvec2) Load 148(c2)
-            4417:   52(float) Load 4267(lodClamp)
-            4418:  7(f16vec4) ImageSampleImplicitLod 4415 4416 MinLod 4417
-            4419:  7(f16vec4) Load 4401(texel)
-            4420:  7(f16vec4) FAdd 4419 4418
-                              Store 4401(texel) 4420
-            4421:         143 Load 145(s2D)
-            4422:154(f16vec2) Load 156(f16c2)
-            4423:6(float16_t) Load 4274(f16lodClamp)
-            4424:6(float16_t) Load 137(f16bias)
-            4425:  7(f16vec4) ImageSampleImplicitLod 4421 4422 Bias MinLod 4424 4423
-            4426:  7(f16vec4) Load 4401(texel)
-            4427:  7(f16vec4) FAdd 4426 4425
-                              Store 4401(texel) 4427
-            4428:         163 Load 165(s3D)
-            4429:  167(fvec3) Load 169(c3)
-            4430:   52(float) Load 4267(lodClamp)
-            4431:  7(f16vec4) ImageSampleImplicitLod 4428 4429 MinLod 4430
-            4432:  7(f16vec4) Load 4401(texel)
-            4433:  7(f16vec4) FAdd 4432 4431
-                              Store 4401(texel) 4433
-            4434:         163 Load 165(s3D)
-            4435:175(f16vec3) Load 177(f16c3)
-            4436:6(float16_t) Load 4274(f16lodClamp)
-            4437:6(float16_t) Load 137(f16bias)
-            4438:  7(f16vec4) ImageSampleImplicitLod 4434 4435 Bias MinLod 4437 4436
-            4439:  7(f16vec4) Load 4401(texel)
-            4440:  7(f16vec4) FAdd 4439 4438
-                              Store 4401(texel) 4440
-            4441:         184 Load 186(sCube)
-            4442:  167(fvec3) Load 169(c3)
-            4443:   52(float) Load 4267(lodClamp)
-            4444:  7(f16vec4) ImageSampleImplicitLod 4441 4442 MinLod 4443
-            4445:  7(f16vec4) Load 4401(texel)
-            4446:  7(f16vec4) FAdd 4445 4444
-                              Store 4401(texel) 4446
-            4447:         184 Load 186(sCube)
-            4448:175(f16vec3) Load 177(f16c3)
-            4449:6(float16_t) Load 4274(f16lodClamp)
-            4450:6(float16_t) Load 137(f16bias)
-            4451:  7(f16vec4) ImageSampleImplicitLod 4447 4448 Bias MinLod 4450 4449
-            4452:  7(f16vec4) Load 4401(texel)
-            4453:  7(f16vec4) FAdd 4452 4451
-                              Store 4401(texel) 4453
-            4454:         199 Load 201(s1DShadow)
-            4455:  167(fvec3) Load 169(c3)
-            4456:   52(float) Load 4267(lodClamp)
-            4457:   52(float) CompositeExtract 4455 2
-            4458:6(float16_t) ImageSampleDrefImplicitLod 4454 4455 4457 MinLod 4456
-            4459:    208(ptr) AccessChain 4401(texel) 207
-            4460:6(float16_t) Load 4459
-            4461:6(float16_t) FAdd 4460 4458
-            4462:    208(ptr) AccessChain 4401(texel) 207
-                              Store 4462 4461
-            4463:         199 Load 201(s1DShadow)
-            4464:154(f16vec2) Load 156(f16c2)
-            4465:   52(float) Load 215(compare)
-            4466:6(float16_t) Load 4274(f16lodClamp)
-            4467:6(float16_t) Load 137(f16bias)
-            4468:6(float16_t) ImageSampleDrefImplicitLod 4463 4464 4465 Bias MinLod 4467 4466
-            4469:    208(ptr) AccessChain 4401(texel) 207
-            4470:6(float16_t) Load 4469
-            4471:6(float16_t) FAdd 4470 4468
-            4472:    208(ptr) AccessChain 4401(texel) 207
-                              Store 4472 4471
-            4473:         224 Load 226(s2DShadow)
-            4474:  167(fvec3) Load 169(c3)
-            4475:   52(float) Load 4267(lodClamp)
-            4476:   52(float) CompositeExtract 4474 2
-            4477:6(float16_t) ImageSampleDrefImplicitLod 4473 4474 4476 MinLod 4475
-            4478:    208(ptr) AccessChain 4401(texel) 207
-            4479:6(float16_t) Load 4478
-            4480:6(float16_t) FAdd 4479 4477
-            4481:    208(ptr) AccessChain 4401(texel) 207
-                              Store 4481 4480
-            4482:         224 Load 226(s2DShadow)
-            4483:154(f16vec2) Load 156(f16c2)
-            4484:   52(float) Load 215(compare)
-            4485:6(float16_t) Load 4274(f16lodClamp)
-            4486:6(float16_t) Load 137(f16bias)
-            4487:6(float16_t) ImageSampleDrefImplicitLod 4482 4483 4484 Bias MinLod 4486 4485
-            4488:    208(ptr) AccessChain 4401(texel) 207
-            4489:6(float16_t) Load 4488
-            4490:6(float16_t) FAdd 4489 4487
-            4491:    208(ptr) AccessChain 4401(texel) 207
-                              Store 4491 4490
-            4492:         245 Load 247(sCubeShadow)
-            4493:  249(fvec4) Load 251(c4)
-            4494:   52(float) Load 4267(lodClamp)
-            4495:   52(float) CompositeExtract 4493 3
-            4496:6(float16_t) ImageSampleDrefImplicitLod 4492 4493 4495 MinLod 4494
-            4497:    208(ptr) AccessChain 4401(texel) 207
-            4498:6(float16_t) Load 4497
-            4499:6(float16_t) FAdd 4498 4496
-            4500:    208(ptr) AccessChain 4401(texel) 207
-                              Store 4500 4499
-            4501:         245 Load 247(sCubeShadow)
-            4502:175(f16vec3) Load 177(f16c3)
-            4503:   52(float) Load 215(compare)
-            4504:6(float16_t) Load 4274(f16lodClamp)
-            4505:6(float16_t) Load 137(f16bias)
-            4506:6(float16_t) ImageSampleDrefImplicitLod 4501 4502 4503 Bias MinLod 4505 4504
-            4507:    208(ptr) AccessChain 4401(texel) 207
-            4508:6(float16_t) Load 4507
-            4509:6(float16_t) FAdd 4508 4506
-            4510:    208(ptr) AccessChain 4401(texel) 207
-                              Store 4510 4509
-            4511:         269 Load 271(s1DArray)
-            4512:   53(fvec2) Load 148(c2)
-            4513:   52(float) Load 4267(lodClamp)
-            4514:  7(f16vec4) ImageSampleImplicitLod 4511 4512 MinLod 4513
-            4515:  7(f16vec4) Load 4401(texel)
-            4516:  7(f16vec4) FAdd 4515 4514
-                              Store 4401(texel) 4516
-            4517:         269 Load 271(s1DArray)
-            4518:154(f16vec2) Load 156(f16c2)
-            4519:6(float16_t) Load 4274(f16lodClamp)
-            4520:6(float16_t) Load 137(f16bias)
-            4521:  7(f16vec4) ImageSampleImplicitLod 4517 4518 Bias MinLod 4520 4519
-            4522:  7(f16vec4) Load 4401(texel)
-            4523:  7(f16vec4) FAdd 4522 4521
-                              Store 4401(texel) 4523
-            4524:         284 Load 286(s2DArray)
-            4525:  167(fvec3) Load 169(c3)
-            4526:   52(float) Load 4267(lodClamp)
-            4527:  7(f16vec4) ImageSampleImplicitLod 4524 4525 MinLod 4526
-            4528:  7(f16vec4) Load 4401(texel)
-            4529:  7(f16vec4) FAdd 4528 4527
-                              Store 4401(texel) 4529
-            4530:         284 Load 286(s2DArray)
-            4531:175(f16vec3) Load 177(f16c3)
-            4532:6(float16_t) Load 4274(f16lodClamp)
-            4533:6(float16_t) Load 137(f16bias)
-            4534:  7(f16vec4) ImageSampleImplicitLod 4530 4531 Bias MinLod 4533 4532
-            4535:  7(f16vec4) Load 4401(texel)
-            4536:  7(f16vec4) FAdd 4535 4534
-                              Store 4401(texel) 4536
-            4537:         299 Load 301(sCubeArray)
-            4538:  249(fvec4) Load 251(c4)
-            4539:   52(float) Load 4267(lodClamp)
-            4540:  7(f16vec4) ImageSampleImplicitLod 4537 4538 MinLod 4539
-            4541:  7(f16vec4) Load 4401(texel)
-            4542:  7(f16vec4) FAdd 4541 4540
-                              Store 4401(texel) 4542
-            4543:         299 Load 301(sCubeArray)
-            4544:  7(f16vec4) Load 309(f16c4)
-            4545:6(float16_t) Load 4274(f16lodClamp)
-            4546:6(float16_t) Load 137(f16bias)
-            4547:  7(f16vec4) ImageSampleImplicitLod 4543 4544 Bias MinLod 4546 4545
-            4548:  7(f16vec4) Load 4401(texel)
-            4549:  7(f16vec4) FAdd 4548 4547
-                              Store 4401(texel) 4549
-            4550:         316 Load 318(s1DArrayShadow)
-            4551:  167(fvec3) Load 169(c3)
-            4552:   52(float) Load 4267(lodClamp)
-            4553:   52(float) CompositeExtract 4551 2
-            4554:6(float16_t) ImageSampleDrefImplicitLod 4550 4551 4553 MinLod 4552
-            4555:    208(ptr) AccessChain 4401(texel) 207
-            4556:6(float16_t) Load 4555
-            4557:6(float16_t) FAdd 4556 4554
-            4558:    208(ptr) AccessChain 4401(texel) 207
-                              Store 4558 4557
-            4559:         316 Load 318(s1DArrayShadow)
-            4560:154(f16vec2) Load 156(f16c2)
-            4561:   52(float) Load 215(compare)
-            4562:6(float16_t) Load 4274(f16lodClamp)
-            4563:6(float16_t) Load 137(f16bias)
-            4564:6(float16_t) ImageSampleDrefImplicitLod 4559 4560 4561 Bias MinLod 4563 4562
-            4565:    208(ptr) AccessChain 4401(texel) 207
-            4566:6(float16_t) Load 4565
-            4567:6(float16_t) FAdd 4566 4564
-            4568:    208(ptr) AccessChain 4401(texel) 207
-                              Store 4568 4567
-            4569:         337 Load 339(s2DArrayShadow)
-            4570:  249(fvec4) Load 251(c4)
-            4571:   52(float) Load 4267(lodClamp)
-            4572:   52(float) CompositeExtract 4570 3
-            4573:6(float16_t) ImageSampleDrefImplicitLod 4569 4570 4572 MinLod 4571
-            4574:    208(ptr) AccessChain 4401(texel) 207
-            4575:6(float16_t) Load 4574
-            4576:6(float16_t) FAdd 4575 4573
-            4577:    208(ptr) AccessChain 4401(texel) 207
-                              Store 4577 4576
-            4578:         337 Load 339(s2DArrayShadow)
-            4579:175(f16vec3) Load 177(f16c3)
-            4580:   52(float) Load 215(compare)
-            4581:6(float16_t) Load 4274(f16lodClamp)
-            4582:6(float16_t) ImageSampleDrefImplicitLod 4578 4579 4580 MinLod 4581
-            4583:    208(ptr) AccessChain 4401(texel) 207
-            4584:6(float16_t) Load 4583
-            4585:6(float16_t) FAdd 4584 4582
-            4586:    208(ptr) AccessChain 4401(texel) 207
-                              Store 4586 4585
-            4587:         391 Load 393(sCubeArrayShadow)
-            4588:  249(fvec4) Load 251(c4)
-            4589:   52(float) Load 215(compare)
-            4590:   52(float) Load 4267(lodClamp)
-            4591:6(float16_t) ImageSampleDrefImplicitLod 4587 4588 4589 MinLod 4590
-            4592:    208(ptr) AccessChain 4401(texel) 207
-            4593:6(float16_t) Load 4592
-            4594:6(float16_t) FAdd 4593 4591
-            4595:    208(ptr) AccessChain 4401(texel) 207
-                              Store 4595 4594
-            4596:         391 Load 393(sCubeArrayShadow)
-            4597:  7(f16vec4) Load 309(f16c4)
-            4598:   52(float) Load 215(compare)
-            4599:6(float16_t) Load 4274(f16lodClamp)
-            4600:6(float16_t) ImageSampleDrefImplicitLod 4596 4597 4598 MinLod 4599
-            4601:    208(ptr) AccessChain 4401(texel) 207
-            4602:6(float16_t) Load 4601
-            4603:6(float16_t) FAdd 4602 4600
-            4604:    208(ptr) AccessChain 4401(texel) 207
-                              Store 4604 4603
-            4605:  7(f16vec4) Load 4401(texel)
-                              ReturnValue 4605
+     4445(texel):     64(ptr) Variable Function
+                              Store 4445(texel) 121
+            4446:         123 Load 125(s1D)
+            4447:   52(float) Load 128(c1)
+            4448:   52(float) Load 4311(lodClamp)
+            4449:  7(f16vec4) ImageSampleImplicitLod 4446 4447 MinLod 4448
+            4450:  7(f16vec4) Load 4445(texel)
+            4451:  7(f16vec4) FAdd 4450 4449
+                              Store 4445(texel) 4451
+            4452:         123 Load 125(s1D)
+            4453:6(float16_t) Load 135(f16c1)
+            4454:6(float16_t) Load 4318(f16lodClamp)
+            4455:6(float16_t) Load 137(f16bias)
+            4456:  7(f16vec4) ImageSampleImplicitLod 4452 4453 Bias MinLod 4455 4454
+            4457:  7(f16vec4) Load 4445(texel)
+            4458:  7(f16vec4) FAdd 4457 4456
+                              Store 4445(texel) 4458
+            4459:         143 Load 145(s2D)
+            4460:   53(fvec2) Load 148(c2)
+            4461:   52(float) Load 4311(lodClamp)
+            4462:  7(f16vec4) ImageSampleImplicitLod 4459 4460 MinLod 4461
+            4463:  7(f16vec4) Load 4445(texel)
+            4464:  7(f16vec4) FAdd 4463 4462
+                              Store 4445(texel) 4464
+            4465:         143 Load 145(s2D)
+            4466:154(f16vec2) Load 156(f16c2)
+            4467:6(float16_t) Load 4318(f16lodClamp)
+            4468:6(float16_t) Load 137(f16bias)
+            4469:  7(f16vec4) ImageSampleImplicitLod 4465 4466 Bias MinLod 4468 4467
+            4470:  7(f16vec4) Load 4445(texel)
+            4471:  7(f16vec4) FAdd 4470 4469
+                              Store 4445(texel) 4471
+            4472:         163 Load 165(s3D)
+            4473:  167(fvec3) Load 169(c3)
+            4474:   52(float) Load 4311(lodClamp)
+            4475:  7(f16vec4) ImageSampleImplicitLod 4472 4473 MinLod 4474
+            4476:  7(f16vec4) Load 4445(texel)
+            4477:  7(f16vec4) FAdd 4476 4475
+                              Store 4445(texel) 4477
+            4478:         163 Load 165(s3D)
+            4479:175(f16vec3) Load 177(f16c3)
+            4480:6(float16_t) Load 4318(f16lodClamp)
+            4481:6(float16_t) Load 137(f16bias)
+            4482:  7(f16vec4) ImageSampleImplicitLod 4478 4479 Bias MinLod 4481 4480
+            4483:  7(f16vec4) Load 4445(texel)
+            4484:  7(f16vec4) FAdd 4483 4482
+                              Store 4445(texel) 4484
+            4485:         184 Load 186(sCube)
+            4486:  167(fvec3) Load 169(c3)
+            4487:   52(float) Load 4311(lodClamp)
+            4488:  7(f16vec4) ImageSampleImplicitLod 4485 4486 MinLod 4487
+            4489:  7(f16vec4) Load 4445(texel)
+            4490:  7(f16vec4) FAdd 4489 4488
+                              Store 4445(texel) 4490
+            4491:         184 Load 186(sCube)
+            4492:175(f16vec3) Load 177(f16c3)
+            4493:6(float16_t) Load 4318(f16lodClamp)
+            4494:6(float16_t) Load 137(f16bias)
+            4495:  7(f16vec4) ImageSampleImplicitLod 4491 4492 Bias MinLod 4494 4493
+            4496:  7(f16vec4) Load 4445(texel)
+            4497:  7(f16vec4) FAdd 4496 4495
+                              Store 4445(texel) 4497
+            4498:         199 Load 201(s1DShadow)
+            4499:  167(fvec3) Load 169(c3)
+            4500:   52(float) Load 4311(lodClamp)
+            4501:   52(float) CompositeExtract 4499 2
+            4502:6(float16_t) ImageSampleDrefImplicitLod 4498 4499 4501 MinLod 4500
+            4503:    208(ptr) AccessChain 4445(texel) 207
+            4504:6(float16_t) Load 4503
+            4505:6(float16_t) FAdd 4504 4502
+            4506:    208(ptr) AccessChain 4445(texel) 207
+                              Store 4506 4505
+            4507:         199 Load 201(s1DShadow)
+            4508:154(f16vec2) Load 156(f16c2)
+            4509:   52(float) Load 215(compare)
+            4510:6(float16_t) Load 4318(f16lodClamp)
+            4511:6(float16_t) Load 137(f16bias)
+            4512:6(float16_t) ImageSampleDrefImplicitLod 4507 4508 4509 Bias MinLod 4511 4510
+            4513:    208(ptr) AccessChain 4445(texel) 207
+            4514:6(float16_t) Load 4513
+            4515:6(float16_t) FAdd 4514 4512
+            4516:    208(ptr) AccessChain 4445(texel) 207
+                              Store 4516 4515
+            4517:         224 Load 226(s2DShadow)
+            4518:  167(fvec3) Load 169(c3)
+            4519:   52(float) Load 4311(lodClamp)
+            4520:   52(float) CompositeExtract 4518 2
+            4521:6(float16_t) ImageSampleDrefImplicitLod 4517 4518 4520 MinLod 4519
+            4522:    208(ptr) AccessChain 4445(texel) 207
+            4523:6(float16_t) Load 4522
+            4524:6(float16_t) FAdd 4523 4521
+            4525:    208(ptr) AccessChain 4445(texel) 207
+                              Store 4525 4524
+            4526:         224 Load 226(s2DShadow)
+            4527:154(f16vec2) Load 156(f16c2)
+            4528:   52(float) Load 215(compare)
+            4529:6(float16_t) Load 4318(f16lodClamp)
+            4530:6(float16_t) Load 137(f16bias)
+            4531:6(float16_t) ImageSampleDrefImplicitLod 4526 4527 4528 Bias MinLod 4530 4529
+            4532:    208(ptr) AccessChain 4445(texel) 207
+            4533:6(float16_t) Load 4532
+            4534:6(float16_t) FAdd 4533 4531
+            4535:    208(ptr) AccessChain 4445(texel) 207
+                              Store 4535 4534
+            4536:         245 Load 247(sCubeShadow)
+            4537:  249(fvec4) Load 251(c4)
+            4538:   52(float) Load 4311(lodClamp)
+            4539:   52(float) CompositeExtract 4537 3
+            4540:6(float16_t) ImageSampleDrefImplicitLod 4536 4537 4539 MinLod 4538
+            4541:    208(ptr) AccessChain 4445(texel) 207
+            4542:6(float16_t) Load 4541
+            4543:6(float16_t) FAdd 4542 4540
+            4544:    208(ptr) AccessChain 4445(texel) 207
+                              Store 4544 4543
+            4545:         245 Load 247(sCubeShadow)
+            4546:175(f16vec3) Load 177(f16c3)
+            4547:   52(float) Load 215(compare)
+            4548:6(float16_t) Load 4318(f16lodClamp)
+            4549:6(float16_t) Load 137(f16bias)
+            4550:6(float16_t) ImageSampleDrefImplicitLod 4545 4546 4547 Bias MinLod 4549 4548
+            4551:    208(ptr) AccessChain 4445(texel) 207
+            4552:6(float16_t) Load 4551
+            4553:6(float16_t) FAdd 4552 4550
+            4554:    208(ptr) AccessChain 4445(texel) 207
+                              Store 4554 4553
+            4555:         269 Load 271(s1DArray)
+            4556:   53(fvec2) Load 148(c2)
+            4557:   52(float) Load 4311(lodClamp)
+            4558:  7(f16vec4) ImageSampleImplicitLod 4555 4556 MinLod 4557
+            4559:  7(f16vec4) Load 4445(texel)
+            4560:  7(f16vec4) FAdd 4559 4558
+                              Store 4445(texel) 4560
+            4561:         269 Load 271(s1DArray)
+            4562:154(f16vec2) Load 156(f16c2)
+            4563:6(float16_t) Load 4318(f16lodClamp)
+            4564:6(float16_t) Load 137(f16bias)
+            4565:  7(f16vec4) ImageSampleImplicitLod 4561 4562 Bias MinLod 4564 4563
+            4566:  7(f16vec4) Load 4445(texel)
+            4567:  7(f16vec4) FAdd 4566 4565
+                              Store 4445(texel) 4567
+            4568:         284 Load 286(s2DArray)
+            4569:  167(fvec3) Load 169(c3)
+            4570:   52(float) Load 4311(lodClamp)
+            4571:  7(f16vec4) ImageSampleImplicitLod 4568 4569 MinLod 4570
+            4572:  7(f16vec4) Load 4445(texel)
+            4573:  7(f16vec4) FAdd 4572 4571
+                              Store 4445(texel) 4573
+            4574:         284 Load 286(s2DArray)
+            4575:175(f16vec3) Load 177(f16c3)
+            4576:6(float16_t) Load 4318(f16lodClamp)
+            4577:6(float16_t) Load 137(f16bias)
+            4578:  7(f16vec4) ImageSampleImplicitLod 4574 4575 Bias MinLod 4577 4576
+            4579:  7(f16vec4) Load 4445(texel)
+            4580:  7(f16vec4) FAdd 4579 4578
+                              Store 4445(texel) 4580
+            4581:         299 Load 301(sCubeArray)
+            4582:  249(fvec4) Load 251(c4)
+            4583:   52(float) Load 4311(lodClamp)
+            4584:  7(f16vec4) ImageSampleImplicitLod 4581 4582 MinLod 4583
+            4585:  7(f16vec4) Load 4445(texel)
+            4586:  7(f16vec4) FAdd 4585 4584
+                              Store 4445(texel) 4586
+            4587:         299 Load 301(sCubeArray)
+            4588:  7(f16vec4) Load 309(f16c4)
+            4589:6(float16_t) Load 4318(f16lodClamp)
+            4590:6(float16_t) Load 137(f16bias)
+            4591:  7(f16vec4) ImageSampleImplicitLod 4587 4588 Bias MinLod 4590 4589
+            4592:  7(f16vec4) Load 4445(texel)
+            4593:  7(f16vec4) FAdd 4592 4591
+                              Store 4445(texel) 4593
+            4594:         316 Load 318(s1DArrayShadow)
+            4595:  167(fvec3) Load 169(c3)
+            4596:   52(float) Load 4311(lodClamp)
+            4597:   52(float) CompositeExtract 4595 2
+            4598:6(float16_t) ImageSampleDrefImplicitLod 4594 4595 4597 MinLod 4596
+            4599:    208(ptr) AccessChain 4445(texel) 207
+            4600:6(float16_t) Load 4599
+            4601:6(float16_t) FAdd 4600 4598
+            4602:    208(ptr) AccessChain 4445(texel) 207
+                              Store 4602 4601
+            4603:         316 Load 318(s1DArrayShadow)
+            4604:154(f16vec2) Load 156(f16c2)
+            4605:   52(float) Load 215(compare)
+            4606:6(float16_t) Load 4318(f16lodClamp)
+            4607:6(float16_t) Load 137(f16bias)
+            4608:6(float16_t) ImageSampleDrefImplicitLod 4603 4604 4605 Bias MinLod 4607 4606
+            4609:    208(ptr) AccessChain 4445(texel) 207
+            4610:6(float16_t) Load 4609
+            4611:6(float16_t) FAdd 4610 4608
+            4612:    208(ptr) AccessChain 4445(texel) 207
+                              Store 4612 4611
+            4613:         337 Load 339(s2DArrayShadow)
+            4614:  249(fvec4) Load 251(c4)
+            4615:   52(float) Load 4311(lodClamp)
+            4616:   52(float) CompositeExtract 4614 3
+            4617:6(float16_t) ImageSampleDrefImplicitLod 4613 4614 4616 MinLod 4615
+            4618:    208(ptr) AccessChain 4445(texel) 207
+            4619:6(float16_t) Load 4618
+            4620:6(float16_t) FAdd 4619 4617
+            4621:    208(ptr) AccessChain 4445(texel) 207
+                              Store 4621 4620
+            4622:         337 Load 339(s2DArrayShadow)
+            4623:175(f16vec3) Load 177(f16c3)
+            4624:   52(float) Load 215(compare)
+            4625:6(float16_t) Load 4318(f16lodClamp)
+            4626:6(float16_t) ImageSampleDrefImplicitLod 4622 4623 4624 MinLod 4625
+            4627:    208(ptr) AccessChain 4445(texel) 207
+            4628:6(float16_t) Load 4627
+            4629:6(float16_t) FAdd 4628 4626
+            4630:    208(ptr) AccessChain 4445(texel) 207
+                              Store 4630 4629
+            4631:         391 Load 393(sCubeArrayShadow)
+            4632:  249(fvec4) Load 251(c4)
+            4633:   52(float) Load 215(compare)
+            4634:   52(float) Load 4311(lodClamp)
+            4635:6(float16_t) ImageSampleDrefImplicitLod 4631 4632 4633 MinLod 4634
+            4636:    208(ptr) AccessChain 4445(texel) 207
+            4637:6(float16_t) Load 4636
+            4638:6(float16_t) FAdd 4637 4635
+            4639:    208(ptr) AccessChain 4445(texel) 207
+                              Store 4639 4638
+            4640:         391 Load 393(sCubeArrayShadow)
+            4641:  7(f16vec4) Load 309(f16c4)
+            4642:   52(float) Load 215(compare)
+            4643:6(float16_t) Load 4318(f16lodClamp)
+            4644:6(float16_t) ImageSampleDrefImplicitLod 4640 4641 4642 MinLod 4643
+            4645:    208(ptr) AccessChain 4445(texel) 207
+            4646:6(float16_t) Load 4645
+            4647:6(float16_t) FAdd 4646 4644
+            4648:    208(ptr) AccessChain 4445(texel) 207
+                              Store 4648 4647
+            4649:  7(f16vec4) Load 4445(texel)
+                              ReturnValue 4649
                               FunctionEnd
 103(testSparseTextureOffsetClamp():  7(f16vec4) Function None 8
              104:             Label
-     4608(texel):     64(ptr) Variable Function
-                              Store 4608(texel) 121
-            4609:         143 Load 145(s2D)
-            4610:   53(fvec2) Load 148(c2)
-            4611:   52(float) Load 4267(lodClamp)
-            4612:3102(ResType) ImageSparseSampleImplicitLod 4609 4610 ConstOffset MinLod 722 4611
-            4613:  7(f16vec4) CompositeExtract 4612 1
-                              Store 4608(texel) 4613
-            4614:     47(int) CompositeExtract 4612 0
-            4615:         143 Load 145(s2D)
-            4616:154(f16vec2) Load 156(f16c2)
-            4617:6(float16_t) Load 4274(f16lodClamp)
-            4618:6(float16_t) Load 137(f16bias)
-            4619:3102(ResType) ImageSparseSampleImplicitLod 4615 4616 Bias ConstOffset MinLod 4618 722 4617
-            4620:  7(f16vec4) CompositeExtract 4619 1
-                              Store 4608(texel) 4620
-            4621:     47(int) CompositeExtract 4619 0
-            4622:         163 Load 165(s3D)
-            4623:  167(fvec3) Load 169(c3)
-            4624:   52(float) Load 4267(lodClamp)
-            4625:3102(ResType) ImageSparseSampleImplicitLod 4622 4623 ConstOffset MinLod 735 4624
-            4626:  7(f16vec4) CompositeExtract 4625 1
-                              Store 4608(texel) 4626
-            4627:     47(int) CompositeExtract 4625 0
-            4628:         163 Load 165(s3D)
-            4629:175(f16vec3) Load 177(f16c3)
-            4630:6(float16_t) Load 4274(f16lodClamp)
-            4631:6(float16_t) Load 137(f16bias)
-            4632:3102(ResType) ImageSparseSampleImplicitLod 4628 4629 Bias ConstOffset MinLod 4631 735 4630
-            4633:  7(f16vec4) CompositeExtract 4632 1
-                              Store 4608(texel) 4633
-            4634:     47(int) CompositeExtract 4632 0
-            4635:         224 Load 226(s2DShadow)
-            4636:  167(fvec3) Load 169(c3)
-            4637:   52(float) Load 4267(lodClamp)
-            4638:    208(ptr) AccessChain 4608(texel) 207
-            4639:   52(float) CompositeExtract 4636 2
-            4640:3138(ResType) ImageSparseSampleDrefImplicitLod 4635 4636 4639 ConstOffset MinLod 722 4637
-            4641:6(float16_t) CompositeExtract 4640 1
-                              Store 4638 4641
-            4642:     47(int) CompositeExtract 4640 0
-            4643:         224 Load 226(s2DShadow)
-            4644:154(f16vec2) Load 156(f16c2)
-            4645:   52(float) Load 215(compare)
-            4646:6(float16_t) Load 4274(f16lodClamp)
-            4647:    208(ptr) AccessChain 4608(texel) 207
-            4648:6(float16_t) Load 137(f16bias)
-            4649:3138(ResType) ImageSparseSampleDrefImplicitLod 4643 4644 4645 Bias ConstOffset MinLod 4648 722 4646
-            4650:6(float16_t) CompositeExtract 4649 1
-                              Store 4647 4650
-            4651:     47(int) CompositeExtract 4649 0
-            4652:         284 Load 286(s2DArray)
-            4653:  167(fvec3) Load 169(c3)
-            4654:   52(float) Load 4267(lodClamp)
-            4655:3102(ResType) ImageSparseSampleImplicitLod 4652 4653 ConstOffset MinLod 722 4654
-            4656:  7(f16vec4) CompositeExtract 4655 1
-                              Store 4608(texel) 4656
-            4657:     47(int) CompositeExtract 4655 0
-            4658:         284 Load 286(s2DArray)
-            4659:175(f16vec3) Load 177(f16c3)
-            4660:6(float16_t) Load 4274(f16lodClamp)
-            4661:6(float16_t) Load 137(f16bias)
-            4662:3102(ResType) ImageSparseSampleImplicitLod 4658 4659 Bias ConstOffset MinLod 4661 722 4660
-            4663:  7(f16vec4) CompositeExtract 4662 1
-                              Store 4608(texel) 4663
-            4664:     47(int) CompositeExtract 4662 0
-            4665:         337 Load 339(s2DArrayShadow)
-            4666:  249(fvec4) Load 251(c4)
-            4667:   52(float) Load 4267(lodClamp)
-            4668:    208(ptr) AccessChain 4608(texel) 207
-            4669:   52(float) CompositeExtract 4666 3
-            4670:3138(ResType) ImageSparseSampleDrefImplicitLod 4665 4666 4669 ConstOffset MinLod 722 4667
-            4671:6(float16_t) CompositeExtract 4670 1
-                              Store 4668 4671
-            4672:     47(int) CompositeExtract 4670 0
-            4673:         337 Load 339(s2DArrayShadow)
-            4674:175(f16vec3) Load 177(f16c3)
-            4675:   52(float) Load 215(compare)
-            4676:6(float16_t) Load 4274(f16lodClamp)
-            4677:    208(ptr) AccessChain 4608(texel) 207
-            4678:3138(ResType) ImageSparseSampleDrefImplicitLod 4673 4674 4675 ConstOffset MinLod 722 4676
-            4679:6(float16_t) CompositeExtract 4678 1
-                              Store 4677 4679
-            4680:     47(int) CompositeExtract 4678 0
-            4681:  7(f16vec4) Load 4608(texel)
-                              ReturnValue 4681
+     4652(texel):     64(ptr) Variable Function
+                              Store 4652(texel) 121
+            4653:         143 Load 145(s2D)
+            4654:   53(fvec2) Load 148(c2)
+            4655:   52(float) Load 4311(lodClamp)
+            4656:3146(ResType) ImageSparseSampleImplicitLod 4653 4654 ConstOffset MinLod 722 4655
+            4657:  7(f16vec4) CompositeExtract 4656 1
+                              Store 4652(texel) 4657
+            4658:     47(int) CompositeExtract 4656 0
+            4659:         143 Load 145(s2D)
+            4660:154(f16vec2) Load 156(f16c2)
+            4661:6(float16_t) Load 4318(f16lodClamp)
+            4662:6(float16_t) Load 137(f16bias)
+            4663:3146(ResType) ImageSparseSampleImplicitLod 4659 4660 Bias ConstOffset MinLod 4662 722 4661
+            4664:  7(f16vec4) CompositeExtract 4663 1
+                              Store 4652(texel) 4664
+            4665:     47(int) CompositeExtract 4663 0
+            4666:         163 Load 165(s3D)
+            4667:  167(fvec3) Load 169(c3)
+            4668:   52(float) Load 4311(lodClamp)
+            4669:3146(ResType) ImageSparseSampleImplicitLod 4666 4667 ConstOffset MinLod 735 4668
+            4670:  7(f16vec4) CompositeExtract 4669 1
+                              Store 4652(texel) 4670
+            4671:     47(int) CompositeExtract 4669 0
+            4672:         163 Load 165(s3D)
+            4673:175(f16vec3) Load 177(f16c3)
+            4674:6(float16_t) Load 4318(f16lodClamp)
+            4675:6(float16_t) Load 137(f16bias)
+            4676:3146(ResType) ImageSparseSampleImplicitLod 4672 4673 Bias ConstOffset MinLod 4675 735 4674
+            4677:  7(f16vec4) CompositeExtract 4676 1
+                              Store 4652(texel) 4677
+            4678:     47(int) CompositeExtract 4676 0
+            4679:         224 Load 226(s2DShadow)
+            4680:  167(fvec3) Load 169(c3)
+            4681:   52(float) Load 4311(lodClamp)
+            4682:    208(ptr) AccessChain 4652(texel) 207
+            4683:   52(float) CompositeExtract 4680 2
+            4684:3182(ResType) ImageSparseSampleDrefImplicitLod 4679 4680 4683 ConstOffset MinLod 722 4681
+            4685:6(float16_t) CompositeExtract 4684 1
+                              Store 4682 4685
+            4686:     47(int) CompositeExtract 4684 0
+            4687:         224 Load 226(s2DShadow)
+            4688:154(f16vec2) Load 156(f16c2)
+            4689:   52(float) Load 215(compare)
+            4690:6(float16_t) Load 4318(f16lodClamp)
+            4691:    208(ptr) AccessChain 4652(texel) 207
+            4692:6(float16_t) Load 137(f16bias)
+            4693:3182(ResType) ImageSparseSampleDrefImplicitLod 4687 4688 4689 Bias ConstOffset MinLod 4692 722 4690
+            4694:6(float16_t) CompositeExtract 4693 1
+                              Store 4691 4694
+            4695:     47(int) CompositeExtract 4693 0
+            4696:         284 Load 286(s2DArray)
+            4697:  167(fvec3) Load 169(c3)
+            4698:   52(float) Load 4311(lodClamp)
+            4699:3146(ResType) ImageSparseSampleImplicitLod 4696 4697 ConstOffset MinLod 722 4698
+            4700:  7(f16vec4) CompositeExtract 4699 1
+                              Store 4652(texel) 4700
+            4701:     47(int) CompositeExtract 4699 0
+            4702:         284 Load 286(s2DArray)
+            4703:175(f16vec3) Load 177(f16c3)
+            4704:6(float16_t) Load 4318(f16lodClamp)
+            4705:6(float16_t) Load 137(f16bias)
+            4706:3146(ResType) ImageSparseSampleImplicitLod 4702 4703 Bias ConstOffset MinLod 4705 722 4704
+            4707:  7(f16vec4) CompositeExtract 4706 1
+                              Store 4652(texel) 4707
+            4708:     47(int) CompositeExtract 4706 0
+            4709:         337 Load 339(s2DArrayShadow)
+            4710:  249(fvec4) Load 251(c4)
+            4711:   52(float) Load 4311(lodClamp)
+            4712:    208(ptr) AccessChain 4652(texel) 207
+            4713:   52(float) CompositeExtract 4710 3
+            4714:3182(ResType) ImageSparseSampleDrefImplicitLod 4709 4710 4713 ConstOffset MinLod 722 4711
+            4715:6(float16_t) CompositeExtract 4714 1
+                              Store 4712 4715
+            4716:     47(int) CompositeExtract 4714 0
+            4717:         337 Load 339(s2DArrayShadow)
+            4718:175(f16vec3) Load 177(f16c3)
+            4719:   52(float) Load 215(compare)
+            4720:6(float16_t) Load 4318(f16lodClamp)
+            4721:    208(ptr) AccessChain 4652(texel) 207
+            4722:3182(ResType) ImageSparseSampleDrefImplicitLod 4717 4718 4719 ConstOffset MinLod 722 4720
+            4723:6(float16_t) CompositeExtract 4722 1
+                              Store 4721 4723
+            4724:     47(int) CompositeExtract 4722 0
+            4725:  7(f16vec4) Load 4652(texel)
+                              ReturnValue 4725
                               FunctionEnd
 105(testTextureOffsetClamp():  7(f16vec4) Function None 8
              106:             Label
-     4684(texel):     64(ptr) Variable Function
-                              Store 4684(texel) 121
-            4685:         123 Load 125(s1D)
-            4686:   52(float) Load 128(c1)
-            4687:   52(float) Load 4267(lodClamp)
-            4688:  7(f16vec4) ImageSampleImplicitLod 4685 4686 ConstOffset MinLod 709 4687
-            4689:  7(f16vec4) Load 4684(texel)
-            4690:  7(f16vec4) FAdd 4689 4688
-                              Store 4684(texel) 4690
-            4691:         123 Load 125(s1D)
-            4692:6(float16_t) Load 135(f16c1)
-            4693:6(float16_t) Load 4274(f16lodClamp)
-            4694:6(float16_t) Load 137(f16bias)
-            4695:  7(f16vec4) ImageSampleImplicitLod 4691 4692 Bias ConstOffset MinLod 4694 709 4693
-            4696:  7(f16vec4) Load 4684(texel)
-            4697:  7(f16vec4) FAdd 4696 4695
-                              Store 4684(texel) 4697
-            4698:         143 Load 145(s2D)
-            4699:   53(fvec2) Load 148(c2)
-            4700:   52(float) Load 4267(lodClamp)
-            4701:  7(f16vec4) ImageSampleImplicitLod 4698 4699 ConstOffset MinLod 722 4700
-            4702:  7(f16vec4) Load 4684(texel)
-            4703:  7(f16vec4) FAdd 4702 4701
-                              Store 4684(texel) 4703
-            4704:         143 Load 145(s2D)
-            4705:154(f16vec2) Load 156(f16c2)
-            4706:6(float16_t) Load 4274(f16lodClamp)
-            4707:6(float16_t) Load 137(f16bias)
-            4708:  7(f16vec4) ImageSampleImplicitLod 4704 4705 Bias ConstOffset MinLod 4707 722 4706
-            4709:  7(f16vec4) Load 4684(texel)
-            4710:  7(f16vec4) FAdd 4709 4708
-                              Store 4684(texel) 4710
-            4711:         163 Load 165(s3D)
-            4712:  167(fvec3) Load 169(c3)
-            4713:   52(float) Load 4267(lodClamp)
-            4714:  7(f16vec4) ImageSampleImplicitLod 4711 4712 ConstOffset MinLod 735 4713
-            4715:  7(f16vec4) Load 4684(texel)
-            4716:  7(f16vec4) FAdd 4715 4714
-                              Store 4684(texel) 4716
-            4717:         163 Load 165(s3D)
-            4718:175(f16vec3) Load 177(f16c3)
-            4719:6(float16_t) Load 4274(f16lodClamp)
-            4720:6(float16_t) Load 137(f16bias)
-            4721:  7(f16vec4) ImageSampleImplicitLod 4717 4718 Bias ConstOffset MinLod 4720 735 4719
-            4722:  7(f16vec4) Load 4684(texel)
-            4723:  7(f16vec4) FAdd 4722 4721
-                              Store 4684(texel) 4723
-            4724:         199 Load 201(s1DShadow)
-            4725:  167(fvec3) Load 169(c3)
-            4726:   52(float) Load 4267(lodClamp)
-            4727:   52(float) CompositeExtract 4725 2
-            4728:6(float16_t) ImageSampleDrefImplicitLod 4724 4725 4727 ConstOffset MinLod 709 4726
-            4729:    208(ptr) AccessChain 4684(texel) 207
-            4730:6(float16_t) Load 4729
-            4731:6(float16_t) FAdd 4730 4728
-            4732:    208(ptr) AccessChain 4684(texel) 207
-                              Store 4732 4731
-            4733:         199 Load 201(s1DShadow)
-            4734:154(f16vec2) Load 156(f16c2)
-            4735:   52(float) Load 215(compare)
-            4736:6(float16_t) Load 4274(f16lodClamp)
-            4737:6(float16_t) Load 137(f16bias)
-            4738:6(float16_t) ImageSampleDrefImplicitLod 4733 4734 4735 Bias ConstOffset MinLod 4737 709 4736
-            4739:    208(ptr) AccessChain 4684(texel) 207
-            4740:6(float16_t) Load 4739
-            4741:6(float16_t) FAdd 4740 4738
-            4742:    208(ptr) AccessChain 4684(texel) 207
-                              Store 4742 4741
-            4743:         224 Load 226(s2DShadow)
-            4744:  167(fvec3) Load 169(c3)
-            4745:   52(float) Load 4267(lodClamp)
-            4746:   52(float) CompositeExtract 4744 2
-            4747:6(float16_t) ImageSampleDrefImplicitLod 4743 4744 4746 ConstOffset MinLod 722 4745
-            4748:    208(ptr) AccessChain 4684(texel) 207
-            4749:6(float16_t) Load 4748
-            4750:6(float16_t) FAdd 4749 4747
-            4751:    208(ptr) AccessChain 4684(texel) 207
-                              Store 4751 4750
-            4752:         224 Load 226(s2DShadow)
-            4753:154(f16vec2) Load 156(f16c2)
-            4754:   52(float) Load 215(compare)
-            4755:6(float16_t) Load 4274(f16lodClamp)
-            4756:6(float16_t) Load 137(f16bias)
-            4757:6(float16_t) ImageSampleDrefImplicitLod 4752 4753 4754 Bias ConstOffset MinLod 4756 722 4755
-            4758:    208(ptr) AccessChain 4684(texel) 207
-            4759:6(float16_t) Load 4758
-            4760:6(float16_t) FAdd 4759 4757
-            4761:    208(ptr) AccessChain 4684(texel) 207
-                              Store 4761 4760
-            4762:         269 Load 271(s1DArray)
-            4763:   53(fvec2) Load 148(c2)
-            4764:   52(float) Load 4267(lodClamp)
-            4765:  7(f16vec4) ImageSampleImplicitLod 4762 4763 ConstOffset MinLod 709 4764
-            4766:  7(f16vec4) Load 4684(texel)
+     4728(texel):     64(ptr) Variable Function
+                              Store 4728(texel) 121
+            4729:         123 Load 125(s1D)
+            4730:   52(float) Load 128(c1)
+            4731:   52(float) Load 4311(lodClamp)
+            4732:  7(f16vec4) ImageSampleImplicitLod 4729 4730 ConstOffset MinLod 709 4731
+            4733:  7(f16vec4) Load 4728(texel)
+            4734:  7(f16vec4) FAdd 4733 4732
+                              Store 4728(texel) 4734
+            4735:         123 Load 125(s1D)
+            4736:6(float16_t) Load 135(f16c1)
+            4737:6(float16_t) Load 4318(f16lodClamp)
+            4738:6(float16_t) Load 137(f16bias)
+            4739:  7(f16vec4) ImageSampleImplicitLod 4735 4736 Bias ConstOffset MinLod 4738 709 4737
+            4740:  7(f16vec4) Load 4728(texel)
+            4741:  7(f16vec4) FAdd 4740 4739
+                              Store 4728(texel) 4741
+            4742:         143 Load 145(s2D)
+            4743:   53(fvec2) Load 148(c2)
+            4744:   52(float) Load 4311(lodClamp)
+            4745:  7(f16vec4) ImageSampleImplicitLod 4742 4743 ConstOffset MinLod 722 4744
+            4746:  7(f16vec4) Load 4728(texel)
+            4747:  7(f16vec4) FAdd 4746 4745
+                              Store 4728(texel) 4747
+            4748:         143 Load 145(s2D)
+            4749:154(f16vec2) Load 156(f16c2)
+            4750:6(float16_t) Load 4318(f16lodClamp)
+            4751:6(float16_t) Load 137(f16bias)
+            4752:  7(f16vec4) ImageSampleImplicitLod 4748 4749 Bias ConstOffset MinLod 4751 722 4750
+            4753:  7(f16vec4) Load 4728(texel)
+            4754:  7(f16vec4) FAdd 4753 4752
+                              Store 4728(texel) 4754
+            4755:         163 Load 165(s3D)
+            4756:  167(fvec3) Load 169(c3)
+            4757:   52(float) Load 4311(lodClamp)
+            4758:  7(f16vec4) ImageSampleImplicitLod 4755 4756 ConstOffset MinLod 735 4757
+            4759:  7(f16vec4) Load 4728(texel)
+            4760:  7(f16vec4) FAdd 4759 4758
+                              Store 4728(texel) 4760
+            4761:         163 Load 165(s3D)
+            4762:175(f16vec3) Load 177(f16c3)
+            4763:6(float16_t) Load 4318(f16lodClamp)
+            4764:6(float16_t) Load 137(f16bias)
+            4765:  7(f16vec4) ImageSampleImplicitLod 4761 4762 Bias ConstOffset MinLod 4764 735 4763
+            4766:  7(f16vec4) Load 4728(texel)
             4767:  7(f16vec4) FAdd 4766 4765
-                              Store 4684(texel) 4767
-            4768:         269 Load 271(s1DArray)
-            4769:154(f16vec2) Load 156(f16c2)
-            4770:6(float16_t) Load 4274(f16lodClamp)
-            4771:6(float16_t) Load 137(f16bias)
-            4772:  7(f16vec4) ImageSampleImplicitLod 4768 4769 Bias ConstOffset MinLod 4771 709 4770
-            4773:  7(f16vec4) Load 4684(texel)
-            4774:  7(f16vec4) FAdd 4773 4772
-                              Store 4684(texel) 4774
-            4775:         284 Load 286(s2DArray)
-            4776:  167(fvec3) Load 169(c3)
-            4777:   52(float) Load 4267(lodClamp)
-            4778:  7(f16vec4) ImageSampleImplicitLod 4775 4776 ConstOffset MinLod 722 4777
-            4779:  7(f16vec4) Load 4684(texel)
-            4780:  7(f16vec4) FAdd 4779 4778
-                              Store 4684(texel) 4780
-            4781:         284 Load 286(s2DArray)
-            4782:175(f16vec3) Load 177(f16c3)
-            4783:6(float16_t) Load 4274(f16lodClamp)
-            4784:6(float16_t) Load 137(f16bias)
-            4785:  7(f16vec4) ImageSampleImplicitLod 4781 4782 Bias ConstOffset MinLod 4784 722 4783
-            4786:  7(f16vec4) Load 4684(texel)
-            4787:  7(f16vec4) FAdd 4786 4785
-                              Store 4684(texel) 4787
-            4788:         316 Load 318(s1DArrayShadow)
-            4789:  167(fvec3) Load 169(c3)
-            4790:   52(float) Load 4267(lodClamp)
-            4791:   52(float) CompositeExtract 4789 2
-            4792:6(float16_t) ImageSampleDrefImplicitLod 4788 4789 4791 ConstOffset MinLod 709 4790
-            4793:    208(ptr) AccessChain 4684(texel) 207
-            4794:6(float16_t) Load 4793
-            4795:6(float16_t) FAdd 4794 4792
-            4796:    208(ptr) AccessChain 4684(texel) 207
-                              Store 4796 4795
-            4797:         316 Load 318(s1DArrayShadow)
-            4798:154(f16vec2) Load 156(f16c2)
-            4799:   52(float) Load 215(compare)
-            4800:6(float16_t) Load 4274(f16lodClamp)
-            4801:6(float16_t) Load 137(f16bias)
-            4802:6(float16_t) ImageSampleDrefImplicitLod 4797 4798 4799 Bias ConstOffset MinLod 4801 709 4800
-            4803:    208(ptr) AccessChain 4684(texel) 207
-            4804:6(float16_t) Load 4803
-            4805:6(float16_t) FAdd 4804 4802
-            4806:    208(ptr) AccessChain 4684(texel) 207
-                              Store 4806 4805
-            4807:         337 Load 339(s2DArrayShadow)
-            4808:  249(fvec4) Load 251(c4)
-            4809:   52(float) Load 4267(lodClamp)
-            4810:   52(float) CompositeExtract 4808 3
-            4811:6(float16_t) ImageSampleDrefImplicitLod 4807 4808 4810 ConstOffset MinLod 722 4809
-            4812:    208(ptr) AccessChain 4684(texel) 207
-            4813:6(float16_t) Load 4812
-            4814:6(float16_t) FAdd 4813 4811
-            4815:    208(ptr) AccessChain 4684(texel) 207
-                              Store 4815 4814
-            4816:         337 Load 339(s2DArrayShadow)
-            4817:175(f16vec3) Load 177(f16c3)
-            4818:   52(float) Load 215(compare)
-            4819:6(float16_t) Load 4274(f16lodClamp)
-            4820:6(float16_t) ImageSampleDrefImplicitLod 4816 4817 4818 ConstOffset MinLod 722 4819
-            4821:    208(ptr) AccessChain 4684(texel) 207
-            4822:6(float16_t) Load 4821
-            4823:6(float16_t) FAdd 4822 4820
-            4824:    208(ptr) AccessChain 4684(texel) 207
-                              Store 4824 4823
-            4825:  7(f16vec4) Load 4684(texel)
-                              ReturnValue 4825
+                              Store 4728(texel) 4767
+            4768:         199 Load 201(s1DShadow)
+            4769:  167(fvec3) Load 169(c3)
+            4770:   52(float) Load 4311(lodClamp)
+            4771:   52(float) CompositeExtract 4769 2
+            4772:6(float16_t) ImageSampleDrefImplicitLod 4768 4769 4771 ConstOffset MinLod 709 4770
+            4773:    208(ptr) AccessChain 4728(texel) 207
+            4774:6(float16_t) Load 4773
+            4775:6(float16_t) FAdd 4774 4772
+            4776:    208(ptr) AccessChain 4728(texel) 207
+                              Store 4776 4775
+            4777:         199 Load 201(s1DShadow)
+            4778:154(f16vec2) Load 156(f16c2)
+            4779:   52(float) Load 215(compare)
+            4780:6(float16_t) Load 4318(f16lodClamp)
+            4781:6(float16_t) Load 137(f16bias)
+            4782:6(float16_t) ImageSampleDrefImplicitLod 4777 4778 4779 Bias ConstOffset MinLod 4781 709 4780
+            4783:    208(ptr) AccessChain 4728(texel) 207
+            4784:6(float16_t) Load 4783
+            4785:6(float16_t) FAdd 4784 4782
+            4786:    208(ptr) AccessChain 4728(texel) 207
+                              Store 4786 4785
+            4787:         224 Load 226(s2DShadow)
+            4788:  167(fvec3) Load 169(c3)
+            4789:   52(float) Load 4311(lodClamp)
+            4790:   52(float) CompositeExtract 4788 2
+            4791:6(float16_t) ImageSampleDrefImplicitLod 4787 4788 4790 ConstOffset MinLod 722 4789
+            4792:    208(ptr) AccessChain 4728(texel) 207
+            4793:6(float16_t) Load 4792
+            4794:6(float16_t) FAdd 4793 4791
+            4795:    208(ptr) AccessChain 4728(texel) 207
+                              Store 4795 4794
+            4796:         224 Load 226(s2DShadow)
+            4797:154(f16vec2) Load 156(f16c2)
+            4798:   52(float) Load 215(compare)
+            4799:6(float16_t) Load 4318(f16lodClamp)
+            4800:6(float16_t) Load 137(f16bias)
+            4801:6(float16_t) ImageSampleDrefImplicitLod 4796 4797 4798 Bias ConstOffset MinLod 4800 722 4799
+            4802:    208(ptr) AccessChain 4728(texel) 207
+            4803:6(float16_t) Load 4802
+            4804:6(float16_t) FAdd 4803 4801
+            4805:    208(ptr) AccessChain 4728(texel) 207
+                              Store 4805 4804
+            4806:         269 Load 271(s1DArray)
+            4807:   53(fvec2) Load 148(c2)
+            4808:   52(float) Load 4311(lodClamp)
+            4809:  7(f16vec4) ImageSampleImplicitLod 4806 4807 ConstOffset MinLod 709 4808
+            4810:  7(f16vec4) Load 4728(texel)
+            4811:  7(f16vec4) FAdd 4810 4809
+                              Store 4728(texel) 4811
+            4812:         269 Load 271(s1DArray)
+            4813:154(f16vec2) Load 156(f16c2)
+            4814:6(float16_t) Load 4318(f16lodClamp)
+            4815:6(float16_t) Load 137(f16bias)
+            4816:  7(f16vec4) ImageSampleImplicitLod 4812 4813 Bias ConstOffset MinLod 4815 709 4814
+            4817:  7(f16vec4) Load 4728(texel)
+            4818:  7(f16vec4) FAdd 4817 4816
+                              Store 4728(texel) 4818
+            4819:         284 Load 286(s2DArray)
+            4820:  167(fvec3) Load 169(c3)
+            4821:   52(float) Load 4311(lodClamp)
+            4822:  7(f16vec4) ImageSampleImplicitLod 4819 4820 ConstOffset MinLod 722 4821
+            4823:  7(f16vec4) Load 4728(texel)
+            4824:  7(f16vec4) FAdd 4823 4822
+                              Store 4728(texel) 4824
+            4825:         284 Load 286(s2DArray)
+            4826:175(f16vec3) Load 177(f16c3)
+            4827:6(float16_t) Load 4318(f16lodClamp)
+            4828:6(float16_t) Load 137(f16bias)
+            4829:  7(f16vec4) ImageSampleImplicitLod 4825 4826 Bias ConstOffset MinLod 4828 722 4827
+            4830:  7(f16vec4) Load 4728(texel)
+            4831:  7(f16vec4) FAdd 4830 4829
+                              Store 4728(texel) 4831
+            4832:         316 Load 318(s1DArrayShadow)
+            4833:  167(fvec3) Load 169(c3)
+            4834:   52(float) Load 4311(lodClamp)
+            4835:   52(float) CompositeExtract 4833 2
+            4836:6(float16_t) ImageSampleDrefImplicitLod 4832 4833 4835 ConstOffset MinLod 709 4834
+            4837:    208(ptr) AccessChain 4728(texel) 207
+            4838:6(float16_t) Load 4837
+            4839:6(float16_t) FAdd 4838 4836
+            4840:    208(ptr) AccessChain 4728(texel) 207
+                              Store 4840 4839
+            4841:         316 Load 318(s1DArrayShadow)
+            4842:154(f16vec2) Load 156(f16c2)
+            4843:   52(float) Load 215(compare)
+            4844:6(float16_t) Load 4318(f16lodClamp)
+            4845:6(float16_t) Load 137(f16bias)
+            4846:6(float16_t) ImageSampleDrefImplicitLod 4841 4842 4843 Bias ConstOffset MinLod 4845 709 4844
+            4847:    208(ptr) AccessChain 4728(texel) 207
+            4848:6(float16_t) Load 4847
+            4849:6(float16_t) FAdd 4848 4846
+            4850:    208(ptr) AccessChain 4728(texel) 207
+                              Store 4850 4849
+            4851:         337 Load 339(s2DArrayShadow)
+            4852:  249(fvec4) Load 251(c4)
+            4853:   52(float) Load 4311(lodClamp)
+            4854:   52(float) CompositeExtract 4852 3
+            4855:6(float16_t) ImageSampleDrefImplicitLod 4851 4852 4854 ConstOffset MinLod 722 4853
+            4856:    208(ptr) AccessChain 4728(texel) 207
+            4857:6(float16_t) Load 4856
+            4858:6(float16_t) FAdd 4857 4855
+            4859:    208(ptr) AccessChain 4728(texel) 207
+                              Store 4859 4858
+            4860:         337 Load 339(s2DArrayShadow)
+            4861:175(f16vec3) Load 177(f16c3)
+            4862:   52(float) Load 215(compare)
+            4863:6(float16_t) Load 4318(f16lodClamp)
+            4864:6(float16_t) ImageSampleDrefImplicitLod 4860 4861 4862 ConstOffset MinLod 722 4863
+            4865:    208(ptr) AccessChain 4728(texel) 207
+            4866:6(float16_t) Load 4865
+            4867:6(float16_t) FAdd 4866 4864
+            4868:    208(ptr) AccessChain 4728(texel) 207
+                              Store 4868 4867
+            4869:  7(f16vec4) Load 4728(texel)
+                              ReturnValue 4869
                               FunctionEnd
 107(testSparseTextureGradClamp():  7(f16vec4) Function None 8
              108:             Label
-     4828(texel):     64(ptr) Variable Function
-                              Store 4828(texel) 121
-            4829:         143 Load 145(s2D)
-            4830:   53(fvec2) Load 148(c2)
-            4831:   53(fvec2) Load 1409(dPdxy2)
-            4832:   53(fvec2) Load 1409(dPdxy2)
-            4833:   52(float) Load 4267(lodClamp)
-            4834:3102(ResType) ImageSparseSampleExplicitLod 4829 4830 Grad MinLod 4831 4832 4833
-            4835:  7(f16vec4) CompositeExtract 4834 1
-                              Store 4828(texel) 4835
-            4836:     47(int) CompositeExtract 4834 0
-            4837:         143 Load 145(s2D)
-            4838:154(f16vec2) Load 156(f16c2)
-            4839:154(f16vec2) Load 1417(f16dPdxy2)
-            4840:154(f16vec2) Load 1417(f16dPdxy2)
-            4841:6(float16_t) Load 4274(f16lodClamp)
-            4842:3102(ResType) ImageSparseSampleExplicitLod 4837 4838 Grad MinLod 4839 4840 4841
-            4843:  7(f16vec4) CompositeExtract 4842 1
-                              Store 4828(texel) 4843
-            4844:     47(int) CompositeExtract 4842 0
-            4845:         163 Load 165(s3D)
-            4846:  167(fvec3) Load 169(c3)
-            4847:  167(fvec3) Load 1425(dPdxy3)
-            4848:  167(fvec3) Load 1425(dPdxy3)
-            4849:   52(float) Load 4267(lodClamp)
-            4850:3102(ResType) ImageSparseSampleExplicitLod 4845 4846 Grad MinLod 4847 4848 4849
-            4851:  7(f16vec4) CompositeExtract 4850 1
-                              Store 4828(texel) 4851
-            4852:     47(int) CompositeExtract 4850 0
-            4853:         163 Load 165(s3D)
-            4854:175(f16vec3) Load 177(f16c3)
-            4855:175(f16vec3) Load 1433(f16dPdxy3)
-            4856:175(f16vec3) Load 1433(f16dPdxy3)
-            4857:6(float16_t) Load 4274(f16lodClamp)
-            4858:3102(ResType) ImageSparseSampleExplicitLod 4853 4854 Grad MinLod 4855 4856 4857
-            4859:  7(f16vec4) CompositeExtract 4858 1
-                              Store 4828(texel) 4859
-            4860:     47(int) CompositeExtract 4858 0
-            4861:         184 Load 186(sCube)
-            4862:  167(fvec3) Load 169(c3)
-            4863:  167(fvec3) Load 1425(dPdxy3)
-            4864:  167(fvec3) Load 1425(dPdxy3)
-            4865:   52(float) Load 4267(lodClamp)
-            4866:3102(ResType) ImageSparseSampleExplicitLod 4861 4862 Grad MinLod 4863 4864 4865
-            4867:  7(f16vec4) CompositeExtract 4866 1
-                              Store 4828(texel) 4867
-            4868:     47(int) CompositeExtract 4866 0
-            4869:         184 Load 186(sCube)
-            4870:175(f16vec3) Load 177(f16c3)
-            4871:175(f16vec3) Load 1433(f16dPdxy3)
-            4872:175(f16vec3) Load 1433(f16dPdxy3)
-            4873:6(float16_t) Load 4274(f16lodClamp)
-            4874:3102(ResType) ImageSparseSampleExplicitLod 4869 4870 Grad MinLod 4871 4872 4873
-            4875:  7(f16vec4) CompositeExtract 4874 1
-                              Store 4828(texel) 4875
-            4876:     47(int) CompositeExtract 4874 0
-            4877:         224 Load 226(s2DShadow)
-            4878:  167(fvec3) Load 169(c3)
-            4879:   53(fvec2) Load 1409(dPdxy2)
-            4880:   53(fvec2) Load 1409(dPdxy2)
-            4881:   52(float) Load 4267(lodClamp)
-            4882:    208(ptr) AccessChain 4828(texel) 207
-            4883:   52(float) CompositeExtract 4878 2
-            4884:3138(ResType) ImageSparseSampleDrefExplicitLod 4877 4878 4883 Grad MinLod 4879 4880 4881
-            4885:6(float16_t) CompositeExtract 4884 1
-                              Store 4882 4885
-            4886:     47(int) CompositeExtract 4884 0
-            4887:         224 Load 226(s2DShadow)
-            4888:154(f16vec2) Load 156(f16c2)
-            4889:   52(float) Load 215(compare)
-            4890:154(f16vec2) Load 1417(f16dPdxy2)
-            4891:154(f16vec2) Load 1417(f16dPdxy2)
-            4892:6(float16_t) Load 4274(f16lodClamp)
-            4893:    208(ptr) AccessChain 4828(texel) 207
-            4894:3138(ResType) ImageSparseSampleDrefExplicitLod 4887 4888 4889 Grad MinLod 4890 4891 4892
-            4895:6(float16_t) CompositeExtract 4894 1
-                              Store 4893 4895
+     4872(texel):     64(ptr) Variable Function
+                              Store 4872(texel) 121
+            4873:         143 Load 145(s2D)
+            4874:   53(fvec2) Load 148(c2)
+            4875:   53(fvec2) Load 1409(dPdxy2)
+            4876:   53(fvec2) Load 1409(dPdxy2)
+            4877:   52(float) Load 4311(lodClamp)
+            4878:3146(ResType) ImageSparseSampleExplicitLod 4873 4874 Grad MinLod 4875 4876 4877
+            4879:  7(f16vec4) CompositeExtract 4878 1
+                              Store 4872(texel) 4879
+            4880:     47(int) CompositeExtract 4878 0
+            4881:         143 Load 145(s2D)
+            4882:154(f16vec2) Load 156(f16c2)
+            4883:154(f16vec2) Load 1417(f16dPdxy2)
+            4884:154(f16vec2) Load 1417(f16dPdxy2)
+            4885:6(float16_t) Load 4318(f16lodClamp)
+            4886:3146(ResType) ImageSparseSampleExplicitLod 4881 4882 Grad MinLod 4883 4884 4885
+            4887:  7(f16vec4) CompositeExtract 4886 1
+                              Store 4872(texel) 4887
+            4888:     47(int) CompositeExtract 4886 0
+            4889:         163 Load 165(s3D)
+            4890:  167(fvec3) Load 169(c3)
+            4891:  167(fvec3) Load 1425(dPdxy3)
+            4892:  167(fvec3) Load 1425(dPdxy3)
+            4893:   52(float) Load 4311(lodClamp)
+            4894:3146(ResType) ImageSparseSampleExplicitLod 4889 4890 Grad MinLod 4891 4892 4893
+            4895:  7(f16vec4) CompositeExtract 4894 1
+                              Store 4872(texel) 4895
             4896:     47(int) CompositeExtract 4894 0
-            4897:         245 Load 247(sCubeShadow)
-            4898:  249(fvec4) Load 251(c4)
-            4899:  167(fvec3) Load 1425(dPdxy3)
-            4900:  167(fvec3) Load 1425(dPdxy3)
-            4901:   52(float) Load 4267(lodClamp)
-            4902:    208(ptr) AccessChain 4828(texel) 207
-            4903:   52(float) CompositeExtract 4898 3
-            4904:3138(ResType) ImageSparseSampleDrefExplicitLod 4897 4898 4903 Grad MinLod 4899 4900 4901
-            4905:6(float16_t) CompositeExtract 4904 1
-                              Store 4902 4905
-            4906:     47(int) CompositeExtract 4904 0
-            4907:         245 Load 247(sCubeShadow)
-            4908:175(f16vec3) Load 177(f16c3)
-            4909:   52(float) Load 215(compare)
-            4910:175(f16vec3) Load 1433(f16dPdxy3)
-            4911:175(f16vec3) Load 1433(f16dPdxy3)
-            4912:6(float16_t) Load 4274(f16lodClamp)
-            4913:    208(ptr) AccessChain 4828(texel) 207
-            4914:3138(ResType) ImageSparseSampleDrefExplicitLod 4907 4908 4909 Grad MinLod 4910 4911 4912
-            4915:6(float16_t) CompositeExtract 4914 1
-                              Store 4913 4915
-            4916:     47(int) CompositeExtract 4914 0
-            4917:         284 Load 286(s2DArray)
-            4918:  167(fvec3) Load 169(c3)
-            4919:   53(fvec2) Load 1409(dPdxy2)
-            4920:   53(fvec2) Load 1409(dPdxy2)
-            4921:   52(float) Load 4267(lodClamp)
-            4922:3102(ResType) ImageSparseSampleExplicitLod 4917 4918 Grad MinLod 4919 4920 4921
-            4923:  7(f16vec4) CompositeExtract 4922 1
-                              Store 4828(texel) 4923
-            4924:     47(int) CompositeExtract 4922 0
-            4925:         284 Load 286(s2DArray)
-            4926:175(f16vec3) Load 177(f16c3)
-            4927:154(f16vec2) Load 1417(f16dPdxy2)
-            4928:154(f16vec2) Load 1417(f16dPdxy2)
-            4929:6(float16_t) Load 4274(f16lodClamp)
-            4930:3102(ResType) ImageSparseSampleExplicitLod 4925 4926 Grad MinLod 4927 4928 4929
-            4931:  7(f16vec4) CompositeExtract 4930 1
-                              Store 4828(texel) 4931
-            4932:     47(int) CompositeExtract 4930 0
-            4933:         337 Load 339(s2DArrayShadow)
-            4934:  249(fvec4) Load 251(c4)
-            4935:   53(fvec2) Load 1409(dPdxy2)
-            4936:   53(fvec2) Load 1409(dPdxy2)
-            4937:   52(float) Load 4267(lodClamp)
-            4938:    208(ptr) AccessChain 4828(texel) 207
-            4939:   52(float) CompositeExtract 4934 3
-            4940:3138(ResType) ImageSparseSampleDrefExplicitLod 4933 4934 4939 Grad MinLod 4935 4936 4937
-            4941:6(float16_t) CompositeExtract 4940 1
-                              Store 4938 4941
-            4942:     47(int) CompositeExtract 4940 0
-            4943:         337 Load 339(s2DArrayShadow)
-            4944:175(f16vec3) Load 177(f16c3)
-            4945:   52(float) Load 215(compare)
-            4946:154(f16vec2) Load 1417(f16dPdxy2)
-            4947:154(f16vec2) Load 1417(f16dPdxy2)
-            4948:6(float16_t) Load 4274(f16lodClamp)
-            4949:    208(ptr) AccessChain 4828(texel) 207
-            4950:3138(ResType) ImageSparseSampleDrefExplicitLod 4943 4944 4945 Grad MinLod 4946 4947 4948
-            4951:6(float16_t) CompositeExtract 4950 1
-                              Store 4949 4951
-            4952:     47(int) CompositeExtract 4950 0
-            4953:         299 Load 301(sCubeArray)
-            4954:  249(fvec4) Load 251(c4)
-            4955:  167(fvec3) Load 1425(dPdxy3)
-            4956:  167(fvec3) Load 1425(dPdxy3)
-            4957:   52(float) Load 4267(lodClamp)
-            4958:3102(ResType) ImageSparseSampleExplicitLod 4953 4954 Grad MinLod 4955 4956 4957
-            4959:  7(f16vec4) CompositeExtract 4958 1
-                              Store 4828(texel) 4959
+            4897:         163 Load 165(s3D)
+            4898:175(f16vec3) Load 177(f16c3)
+            4899:175(f16vec3) Load 1433(f16dPdxy3)
+            4900:175(f16vec3) Load 1433(f16dPdxy3)
+            4901:6(float16_t) Load 4318(f16lodClamp)
+            4902:3146(ResType) ImageSparseSampleExplicitLod 4897 4898 Grad MinLod 4899 4900 4901
+            4903:  7(f16vec4) CompositeExtract 4902 1
+                              Store 4872(texel) 4903
+            4904:     47(int) CompositeExtract 4902 0
+            4905:         184 Load 186(sCube)
+            4906:  167(fvec3) Load 169(c3)
+            4907:  167(fvec3) Load 1425(dPdxy3)
+            4908:  167(fvec3) Load 1425(dPdxy3)
+            4909:   52(float) Load 4311(lodClamp)
+            4910:3146(ResType) ImageSparseSampleExplicitLod 4905 4906 Grad MinLod 4907 4908 4909
+            4911:  7(f16vec4) CompositeExtract 4910 1
+                              Store 4872(texel) 4911
+            4912:     47(int) CompositeExtract 4910 0
+            4913:         184 Load 186(sCube)
+            4914:175(f16vec3) Load 177(f16c3)
+            4915:175(f16vec3) Load 1433(f16dPdxy3)
+            4916:175(f16vec3) Load 1433(f16dPdxy3)
+            4917:6(float16_t) Load 4318(f16lodClamp)
+            4918:3146(ResType) ImageSparseSampleExplicitLod 4913 4914 Grad MinLod 4915 4916 4917
+            4919:  7(f16vec4) CompositeExtract 4918 1
+                              Store 4872(texel) 4919
+            4920:     47(int) CompositeExtract 4918 0
+            4921:         224 Load 226(s2DShadow)
+            4922:  167(fvec3) Load 169(c3)
+            4923:   53(fvec2) Load 1409(dPdxy2)
+            4924:   53(fvec2) Load 1409(dPdxy2)
+            4925:   52(float) Load 4311(lodClamp)
+            4926:    208(ptr) AccessChain 4872(texel) 207
+            4927:   52(float) CompositeExtract 4922 2
+            4928:3182(ResType) ImageSparseSampleDrefExplicitLod 4921 4922 4927 Grad MinLod 4923 4924 4925
+            4929:6(float16_t) CompositeExtract 4928 1
+                              Store 4926 4929
+            4930:     47(int) CompositeExtract 4928 0
+            4931:         224 Load 226(s2DShadow)
+            4932:154(f16vec2) Load 156(f16c2)
+            4933:   52(float) Load 215(compare)
+            4934:154(f16vec2) Load 1417(f16dPdxy2)
+            4935:154(f16vec2) Load 1417(f16dPdxy2)
+            4936:6(float16_t) Load 4318(f16lodClamp)
+            4937:    208(ptr) AccessChain 4872(texel) 207
+            4938:3182(ResType) ImageSparseSampleDrefExplicitLod 4931 4932 4933 Grad MinLod 4934 4935 4936
+            4939:6(float16_t) CompositeExtract 4938 1
+                              Store 4937 4939
+            4940:     47(int) CompositeExtract 4938 0
+            4941:         245 Load 247(sCubeShadow)
+            4942:  249(fvec4) Load 251(c4)
+            4943:  167(fvec3) Load 1425(dPdxy3)
+            4944:  167(fvec3) Load 1425(dPdxy3)
+            4945:   52(float) Load 4311(lodClamp)
+            4946:    208(ptr) AccessChain 4872(texel) 207
+            4947:   52(float) CompositeExtract 4942 3
+            4948:3182(ResType) ImageSparseSampleDrefExplicitLod 4941 4942 4947 Grad MinLod 4943 4944 4945
+            4949:6(float16_t) CompositeExtract 4948 1
+                              Store 4946 4949
+            4950:     47(int) CompositeExtract 4948 0
+            4951:         245 Load 247(sCubeShadow)
+            4952:175(f16vec3) Load 177(f16c3)
+            4953:   52(float) Load 215(compare)
+            4954:175(f16vec3) Load 1433(f16dPdxy3)
+            4955:175(f16vec3) Load 1433(f16dPdxy3)
+            4956:6(float16_t) Load 4318(f16lodClamp)
+            4957:    208(ptr) AccessChain 4872(texel) 207
+            4958:3182(ResType) ImageSparseSampleDrefExplicitLod 4951 4952 4953 Grad MinLod 4954 4955 4956
+            4959:6(float16_t) CompositeExtract 4958 1
+                              Store 4957 4959
             4960:     47(int) CompositeExtract 4958 0
-            4961:         299 Load 301(sCubeArray)
-            4962:  7(f16vec4) Load 309(f16c4)
-            4963:175(f16vec3) Load 1433(f16dPdxy3)
-            4964:175(f16vec3) Load 1433(f16dPdxy3)
-            4965:6(float16_t) Load 4274(f16lodClamp)
-            4966:3102(ResType) ImageSparseSampleExplicitLod 4961 4962 Grad MinLod 4963 4964 4965
+            4961:         284 Load 286(s2DArray)
+            4962:  167(fvec3) Load 169(c3)
+            4963:   53(fvec2) Load 1409(dPdxy2)
+            4964:   53(fvec2) Load 1409(dPdxy2)
+            4965:   52(float) Load 4311(lodClamp)
+            4966:3146(ResType) ImageSparseSampleExplicitLod 4961 4962 Grad MinLod 4963 4964 4965
             4967:  7(f16vec4) CompositeExtract 4966 1
-                              Store 4828(texel) 4967
+                              Store 4872(texel) 4967
             4968:     47(int) CompositeExtract 4966 0
-            4969:  7(f16vec4) Load 4828(texel)
-                              ReturnValue 4969
+            4969:         284 Load 286(s2DArray)
+            4970:175(f16vec3) Load 177(f16c3)
+            4971:154(f16vec2) Load 1417(f16dPdxy2)
+            4972:154(f16vec2) Load 1417(f16dPdxy2)
+            4973:6(float16_t) Load 4318(f16lodClamp)
+            4974:3146(ResType) ImageSparseSampleExplicitLod 4969 4970 Grad MinLod 4971 4972 4973
+            4975:  7(f16vec4) CompositeExtract 4974 1
+                              Store 4872(texel) 4975
+            4976:     47(int) CompositeExtract 4974 0
+            4977:         337 Load 339(s2DArrayShadow)
+            4978:  249(fvec4) Load 251(c4)
+            4979:   53(fvec2) Load 1409(dPdxy2)
+            4980:   53(fvec2) Load 1409(dPdxy2)
+            4981:   52(float) Load 4311(lodClamp)
+            4982:    208(ptr) AccessChain 4872(texel) 207
+            4983:   52(float) CompositeExtract 4978 3
+            4984:3182(ResType) ImageSparseSampleDrefExplicitLod 4977 4978 4983 Grad MinLod 4979 4980 4981
+            4985:6(float16_t) CompositeExtract 4984 1
+                              Store 4982 4985
+            4986:     47(int) CompositeExtract 4984 0
+            4987:         337 Load 339(s2DArrayShadow)
+            4988:175(f16vec3) Load 177(f16c3)
+            4989:   52(float) Load 215(compare)
+            4990:154(f16vec2) Load 1417(f16dPdxy2)
+            4991:154(f16vec2) Load 1417(f16dPdxy2)
+            4992:6(float16_t) Load 4318(f16lodClamp)
+            4993:    208(ptr) AccessChain 4872(texel) 207
+            4994:3182(ResType) ImageSparseSampleDrefExplicitLod 4987 4988 4989 Grad MinLod 4990 4991 4992
+            4995:6(float16_t) CompositeExtract 4994 1
+                              Store 4993 4995
+            4996:     47(int) CompositeExtract 4994 0
+            4997:         299 Load 301(sCubeArray)
+            4998:  249(fvec4) Load 251(c4)
+            4999:  167(fvec3) Load 1425(dPdxy3)
+            5000:  167(fvec3) Load 1425(dPdxy3)
+            5001:   52(float) Load 4311(lodClamp)
+            5002:3146(ResType) ImageSparseSampleExplicitLod 4997 4998 Grad MinLod 4999 5000 5001
+            5003:  7(f16vec4) CompositeExtract 5002 1
+                              Store 4872(texel) 5003
+            5004:     47(int) CompositeExtract 5002 0
+            5005:         299 Load 301(sCubeArray)
+            5006:  7(f16vec4) Load 309(f16c4)
+            5007:175(f16vec3) Load 1433(f16dPdxy3)
+            5008:175(f16vec3) Load 1433(f16dPdxy3)
+            5009:6(float16_t) Load 4318(f16lodClamp)
+            5010:3146(ResType) ImageSparseSampleExplicitLod 5005 5006 Grad MinLod 5007 5008 5009
+            5011:  7(f16vec4) CompositeExtract 5010 1
+                              Store 4872(texel) 5011
+            5012:     47(int) CompositeExtract 5010 0
+            5013:  7(f16vec4) Load 4872(texel)
+                              ReturnValue 5013
                               FunctionEnd
 109(testTextureGradClamp():  7(f16vec4) Function None 8
              110:             Label
-     4972(texel):     64(ptr) Variable Function
-                              Store 4972(texel) 121
-            4973:         123 Load 125(s1D)
-            4974:   52(float) Load 128(c1)
-            4975:   52(float) Load 1393(dPdxy1)
-            4976:   52(float) Load 1393(dPdxy1)
-            4977:   52(float) Load 4267(lodClamp)
-            4978:  7(f16vec4) ImageSampleExplicitLod 4973 4974 Grad MinLod 4975 4976 4977
-            4979:  7(f16vec4) Load 4972(texel)
-            4980:  7(f16vec4) FAdd 4979 4978
-                              Store 4972(texel) 4980
-            4981:         123 Load 125(s1D)
-            4982:6(float16_t) Load 135(f16c1)
-            4983:6(float16_t) Load 1401(f16dPdxy1)
-            4984:6(float16_t) Load 1401(f16dPdxy1)
-            4985:6(float16_t) Load 4274(f16lodClamp)
-            4986:  7(f16vec4) ImageSampleExplicitLod 4981 4982 Grad MinLod 4983 4984 4985
-            4987:  7(f16vec4) Load 4972(texel)
-            4988:  7(f16vec4) FAdd 4987 4986
-                              Store 4972(texel) 4988
-            4989:         143 Load 145(s2D)
-            4990:   53(fvec2) Load 148(c2)
-            4991:   53(fvec2) Load 1409(dPdxy2)
-            4992:   53(fvec2) Load 1409(dPdxy2)
-            4993:   52(float) Load 4267(lodClamp)
-            4994:  7(f16vec4) ImageSampleExplicitLod 4989 4990 Grad MinLod 4991 4992 4993
-            4995:  7(f16vec4) Load 4972(texel)
-            4996:  7(f16vec4) FAdd 4995 4994
-                              Store 4972(texel) 4996
-            4997:         143 Load 145(s2D)
-            4998:154(f16vec2) Load 156(f16c2)
-            4999:154(f16vec2) Load 1417(f16dPdxy2)
-            5000:154(f16vec2) Load 1417(f16dPdxy2)
-            5001:6(float16_t) Load 4274(f16lodClamp)
-            5002:  7(f16vec4) ImageSampleExplicitLod 4997 4998 Grad MinLod 4999 5000 5001
-            5003:  7(f16vec4) Load 4972(texel)
-            5004:  7(f16vec4) FAdd 5003 5002
-                              Store 4972(texel) 5004
-            5005:         163 Load 165(s3D)
-            5006:  167(fvec3) Load 169(c3)
-            5007:  167(fvec3) Load 1425(dPdxy3)
-            5008:  167(fvec3) Load 1425(dPdxy3)
-            5009:   52(float) Load 4267(lodClamp)
-            5010:  7(f16vec4) ImageSampleExplicitLod 5005 5006 Grad MinLod 5007 5008 5009
-            5011:  7(f16vec4) Load 4972(texel)
-            5012:  7(f16vec4) FAdd 5011 5010
-                              Store 4972(texel) 5012
-            5013:         163 Load 165(s3D)
-            5014:175(f16vec3) Load 177(f16c3)
-            5015:175(f16vec3) Load 1433(f16dPdxy3)
-            5016:175(f16vec3) Load 1433(f16dPdxy3)
-            5017:6(float16_t) Load 4274(f16lodClamp)
-            5018:  7(f16vec4) ImageSampleExplicitLod 5013 5014 Grad MinLod 5015 5016 5017
-            5019:  7(f16vec4) Load 4972(texel)
-            5020:  7(f16vec4) FAdd 5019 5018
-                              Store 4972(texel) 5020
-            5021:         184 Load 186(sCube)
-            5022:  167(fvec3) Load 169(c3)
-            5023:  167(fvec3) Load 1425(dPdxy3)
-            5024:  167(fvec3) Load 1425(dPdxy3)
-            5025:   52(float) Load 4267(lodClamp)
-            5026:  7(f16vec4) ImageSampleExplicitLod 5021 5022 Grad MinLod 5023 5024 5025
-            5027:  7(f16vec4) Load 4972(texel)
-            5028:  7(f16vec4) FAdd 5027 5026
-                              Store 4972(texel) 5028
-            5029:         184 Load 186(sCube)
-            5030:175(f16vec3) Load 177(f16c3)
-            5031:175(f16vec3) Load 1433(f16dPdxy3)
-            5032:175(f16vec3) Load 1433(f16dPdxy3)
-            5033:6(float16_t) Load 4274(f16lodClamp)
-            5034:  7(f16vec4) ImageSampleExplicitLod 5029 5030 Grad MinLod 5031 5032 5033
-            5035:  7(f16vec4) Load 4972(texel)
-            5036:  7(f16vec4) FAdd 5035 5034
-                              Store 4972(texel) 5036
-            5037:         199 Load 201(s1DShadow)
-            5038:  167(fvec3) Load 169(c3)
-            5039:   52(float) Load 1393(dPdxy1)
-            5040:   52(float) Load 1393(dPdxy1)
-            5041:   52(float) Load 4267(lodClamp)
-            5042:   52(float) CompositeExtract 5038 2
-            5043:6(float16_t) ImageSampleDrefExplicitLod 5037 5038 5042 Grad MinLod 5039 5040 5041
-            5044:    208(ptr) AccessChain 4972(texel) 207
-            5045:6(float16_t) Load 5044
-            5046:6(float16_t) FAdd 5045 5043
-            5047:    208(ptr) AccessChain 4972(texel) 207
-                              Store 5047 5046
-            5048:         199 Load 201(s1DShadow)
-            5049:154(f16vec2) Load 156(f16c2)
-            5050:   52(float) Load 215(compare)
-            5051:6(float16_t) Load 1401(f16dPdxy1)
-            5052:6(float16_t) Load 1401(f16dPdxy1)
-            5053:6(float16_t) Load 4274(f16lodClamp)
-            5054:6(float16_t) ImageSampleDrefExplicitLod 5048 5049 5050 Grad MinLod 5051 5052 5053
-            5055:    208(ptr) AccessChain 4972(texel) 207
-            5056:6(float16_t) Load 5055
-            5057:6(float16_t) FAdd 5056 5054
-            5058:    208(ptr) AccessChain 4972(texel) 207
-                              Store 5058 5057
-            5059:         224 Load 226(s2DShadow)
-            5060:  167(fvec3) Load 169(c3)
-            5061:   53(fvec2) Load 1409(dPdxy2)
-            5062:   53(fvec2) Load 1409(dPdxy2)
-            5063:   52(float) Load 4267(lodClamp)
-            5064:   52(float) CompositeExtract 5060 2
-            5065:6(float16_t) ImageSampleDrefExplicitLod 5059 5060 5064 Grad MinLod 5061 5062 5063
-            5066:    208(ptr) AccessChain 4972(texel) 207
-            5067:6(float16_t) Load 5066
-            5068:6(float16_t) FAdd 5067 5065
-            5069:    208(ptr) AccessChain 4972(texel) 207
-                              Store 5069 5068
-            5070:         224 Load 226(s2DShadow)
-            5071:154(f16vec2) Load 156(f16c2)
-            5072:   52(float) Load 215(compare)
-            5073:154(f16vec2) Load 1417(f16dPdxy2)
-            5074:154(f16vec2) Load 1417(f16dPdxy2)
-            5075:6(float16_t) Load 4274(f16lodClamp)
-            5076:6(float16_t) ImageSampleDrefExplicitLod 5070 5071 5072 Grad MinLod 5073 5074 5075
-            5077:    208(ptr) AccessChain 4972(texel) 207
-            5078:6(float16_t) Load 5077
-            5079:6(float16_t) FAdd 5078 5076
-            5080:    208(ptr) AccessChain 4972(texel) 207
-                              Store 5080 5079
-            5081:         245 Load 247(sCubeShadow)
-            5082:  249(fvec4) Load 251(c4)
-            5083:  167(fvec3) Load 1425(dPdxy3)
-            5084:  167(fvec3) Load 1425(dPdxy3)
-            5085:   52(float) Load 4267(lodClamp)
-            5086:   52(float) CompositeExtract 5082 3
+     5016(texel):     64(ptr) Variable Function
+                              Store 5016(texel) 121
+            5017:         123 Load 125(s1D)
+            5018:   52(float) Load 128(c1)
+            5019:   52(float) Load 1393(dPdxy1)
+            5020:   52(float) Load 1393(dPdxy1)
+            5021:   52(float) Load 4311(lodClamp)
+            5022:  7(f16vec4) ImageSampleExplicitLod 5017 5018 Grad MinLod 5019 5020 5021
+            5023:  7(f16vec4) Load 5016(texel)
+            5024:  7(f16vec4) FAdd 5023 5022
+                              Store 5016(texel) 5024
+            5025:         123 Load 125(s1D)
+            5026:6(float16_t) Load 135(f16c1)
+            5027:6(float16_t) Load 1401(f16dPdxy1)
+            5028:6(float16_t) Load 1401(f16dPdxy1)
+            5029:6(float16_t) Load 4318(f16lodClamp)
+            5030:  7(f16vec4) ImageSampleExplicitLod 5025 5026 Grad MinLod 5027 5028 5029
+            5031:  7(f16vec4) Load 5016(texel)
+            5032:  7(f16vec4) FAdd 5031 5030
+                              Store 5016(texel) 5032
+            5033:         143 Load 145(s2D)
+            5034:   53(fvec2) Load 148(c2)
+            5035:   53(fvec2) Load 1409(dPdxy2)
+            5036:   53(fvec2) Load 1409(dPdxy2)
+            5037:   52(float) Load 4311(lodClamp)
+            5038:  7(f16vec4) ImageSampleExplicitLod 5033 5034 Grad MinLod 5035 5036 5037
+            5039:  7(f16vec4) Load 5016(texel)
+            5040:  7(f16vec4) FAdd 5039 5038
+                              Store 5016(texel) 5040
+            5041:         143 Load 145(s2D)
+            5042:154(f16vec2) Load 156(f16c2)
+            5043:154(f16vec2) Load 1417(f16dPdxy2)
+            5044:154(f16vec2) Load 1417(f16dPdxy2)
+            5045:6(float16_t) Load 4318(f16lodClamp)
+            5046:  7(f16vec4) ImageSampleExplicitLod 5041 5042 Grad MinLod 5043 5044 5045
+            5047:  7(f16vec4) Load 5016(texel)
+            5048:  7(f16vec4) FAdd 5047 5046
+                              Store 5016(texel) 5048
+            5049:         163 Load 165(s3D)
+            5050:  167(fvec3) Load 169(c3)
+            5051:  167(fvec3) Load 1425(dPdxy3)
+            5052:  167(fvec3) Load 1425(dPdxy3)
+            5053:   52(float) Load 4311(lodClamp)
+            5054:  7(f16vec4) ImageSampleExplicitLod 5049 5050 Grad MinLod 5051 5052 5053
+            5055:  7(f16vec4) Load 5016(texel)
+            5056:  7(f16vec4) FAdd 5055 5054
+                              Store 5016(texel) 5056
+            5057:         163 Load 165(s3D)
+            5058:175(f16vec3) Load 177(f16c3)
+            5059:175(f16vec3) Load 1433(f16dPdxy3)
+            5060:175(f16vec3) Load 1433(f16dPdxy3)
+            5061:6(float16_t) Load 4318(f16lodClamp)
+            5062:  7(f16vec4) ImageSampleExplicitLod 5057 5058 Grad MinLod 5059 5060 5061
+            5063:  7(f16vec4) Load 5016(texel)
+            5064:  7(f16vec4) FAdd 5063 5062
+                              Store 5016(texel) 5064
+            5065:         184 Load 186(sCube)
+            5066:  167(fvec3) Load 169(c3)
+            5067:  167(fvec3) Load 1425(dPdxy3)
+            5068:  167(fvec3) Load 1425(dPdxy3)
+            5069:   52(float) Load 4311(lodClamp)
+            5070:  7(f16vec4) ImageSampleExplicitLod 5065 5066 Grad MinLod 5067 5068 5069
+            5071:  7(f16vec4) Load 5016(texel)
+            5072:  7(f16vec4) FAdd 5071 5070
+                              Store 5016(texel) 5072
+            5073:         184 Load 186(sCube)
+            5074:175(f16vec3) Load 177(f16c3)
+            5075:175(f16vec3) Load 1433(f16dPdxy3)
+            5076:175(f16vec3) Load 1433(f16dPdxy3)
+            5077:6(float16_t) Load 4318(f16lodClamp)
+            5078:  7(f16vec4) ImageSampleExplicitLod 5073 5074 Grad MinLod 5075 5076 5077
+            5079:  7(f16vec4) Load 5016(texel)
+            5080:  7(f16vec4) FAdd 5079 5078
+                              Store 5016(texel) 5080
+            5081:         199 Load 201(s1DShadow)
+            5082:  167(fvec3) Load 169(c3)
+            5083:   52(float) Load 1393(dPdxy1)
+            5084:   52(float) Load 1393(dPdxy1)
+            5085:   52(float) Load 4311(lodClamp)
+            5086:   52(float) CompositeExtract 5082 2
             5087:6(float16_t) ImageSampleDrefExplicitLod 5081 5082 5086 Grad MinLod 5083 5084 5085
-            5088:    208(ptr) AccessChain 4972(texel) 207
+            5088:    208(ptr) AccessChain 5016(texel) 207
             5089:6(float16_t) Load 5088
             5090:6(float16_t) FAdd 5089 5087
-            5091:    208(ptr) AccessChain 4972(texel) 207
+            5091:    208(ptr) AccessChain 5016(texel) 207
                               Store 5091 5090
-            5092:         245 Load 247(sCubeShadow)
-            5093:175(f16vec3) Load 177(f16c3)
+            5092:         199 Load 201(s1DShadow)
+            5093:154(f16vec2) Load 156(f16c2)
             5094:   52(float) Load 215(compare)
-            5095:175(f16vec3) Load 1433(f16dPdxy3)
-            5096:175(f16vec3) Load 1433(f16dPdxy3)
-            5097:6(float16_t) Load 4274(f16lodClamp)
+            5095:6(float16_t) Load 1401(f16dPdxy1)
+            5096:6(float16_t) Load 1401(f16dPdxy1)
+            5097:6(float16_t) Load 4318(f16lodClamp)
             5098:6(float16_t) ImageSampleDrefExplicitLod 5092 5093 5094 Grad MinLod 5095 5096 5097
-            5099:    208(ptr) AccessChain 4972(texel) 207
+            5099:    208(ptr) AccessChain 5016(texel) 207
             5100:6(float16_t) Load 5099
             5101:6(float16_t) FAdd 5100 5098
-            5102:    208(ptr) AccessChain 4972(texel) 207
+            5102:    208(ptr) AccessChain 5016(texel) 207
                               Store 5102 5101
-            5103:         269 Load 271(s1DArray)
-            5104:   53(fvec2) Load 148(c2)
-            5105:   52(float) Load 1393(dPdxy1)
-            5106:   52(float) Load 1393(dPdxy1)
-            5107:   52(float) Load 4267(lodClamp)
-            5108:  7(f16vec4) ImageSampleExplicitLod 5103 5104 Grad MinLod 5105 5106 5107
-            5109:  7(f16vec4) Load 4972(texel)
-            5110:  7(f16vec4) FAdd 5109 5108
-                              Store 4972(texel) 5110
-            5111:         269 Load 271(s1DArray)
-            5112:154(f16vec2) Load 156(f16c2)
-            5113:6(float16_t) Load 1401(f16dPdxy1)
-            5114:6(float16_t) Load 1401(f16dPdxy1)
-            5115:6(float16_t) Load 4274(f16lodClamp)
-            5116:  7(f16vec4) ImageSampleExplicitLod 5111 5112 Grad MinLod 5113 5114 5115
-            5117:  7(f16vec4) Load 4972(texel)
-            5118:  7(f16vec4) FAdd 5117 5116
-                              Store 4972(texel) 5118
-            5119:         284 Load 286(s2DArray)
-            5120:  167(fvec3) Load 169(c3)
-            5121:   53(fvec2) Load 1409(dPdxy2)
-            5122:   53(fvec2) Load 1409(dPdxy2)
-            5123:   52(float) Load 4267(lodClamp)
-            5124:  7(f16vec4) ImageSampleExplicitLod 5119 5120 Grad MinLod 5121 5122 5123
-            5125:  7(f16vec4) Load 4972(texel)
-            5126:  7(f16vec4) FAdd 5125 5124
-                              Store 4972(texel) 5126
-            5127:         284 Load 286(s2DArray)
-            5128:175(f16vec3) Load 177(f16c3)
-            5129:154(f16vec2) Load 1417(f16dPdxy2)
-            5130:154(f16vec2) Load 1417(f16dPdxy2)
-            5131:6(float16_t) Load 4274(f16lodClamp)
-            5132:  7(f16vec4) ImageSampleExplicitLod 5127 5128 Grad MinLod 5129 5130 5131
-            5133:  7(f16vec4) Load 4972(texel)
-            5134:  7(f16vec4) FAdd 5133 5132
-                              Store 4972(texel) 5134
-            5135:         316 Load 318(s1DArrayShadow)
-            5136:  167(fvec3) Load 169(c3)
-            5137:   52(float) Load 1393(dPdxy1)
-            5138:   52(float) Load 1393(dPdxy1)
-            5139:   52(float) Load 4267(lodClamp)
-            5140:   52(float) CompositeExtract 5136 2
-            5141:6(float16_t) ImageSampleDrefExplicitLod 5135 5136 5140 Grad MinLod 5137 5138 5139
-            5142:    208(ptr) AccessChain 4972(texel) 207
-            5143:6(float16_t) Load 5142
-            5144:6(float16_t) FAdd 5143 5141
-            5145:    208(ptr) AccessChain 4972(texel) 207
-                              Store 5145 5144
-            5146:         316 Load 318(s1DArrayShadow)
-            5147:154(f16vec2) Load 156(f16c2)
-            5148:   52(float) Load 215(compare)
-            5149:6(float16_t) Load 1401(f16dPdxy1)
-            5150:6(float16_t) Load 1401(f16dPdxy1)
-            5151:6(float16_t) Load 4274(f16lodClamp)
-            5152:6(float16_t) ImageSampleDrefExplicitLod 5146 5147 5148 Grad MinLod 5149 5150 5151
-            5153:    208(ptr) AccessChain 4972(texel) 207
-            5154:6(float16_t) Load 5153
-            5155:6(float16_t) FAdd 5154 5152
-            5156:    208(ptr) AccessChain 4972(texel) 207
-                              Store 5156 5155
-            5157:         337 Load 339(s2DArrayShadow)
-            5158:  249(fvec4) Load 251(c4)
-            5159:   53(fvec2) Load 1409(dPdxy2)
-            5160:   53(fvec2) Load 1409(dPdxy2)
-            5161:   52(float) Load 4267(lodClamp)
-            5162:   52(float) CompositeExtract 5158 3
-            5163:6(float16_t) ImageSampleDrefExplicitLod 5157 5158 5162 Grad MinLod 5159 5160 5161
-            5164:    208(ptr) AccessChain 4972(texel) 207
-            5165:6(float16_t) Load 5164
-            5166:6(float16_t) FAdd 5165 5163
-            5167:    208(ptr) AccessChain 4972(texel) 207
-                              Store 5167 5166
-            5168:         337 Load 339(s2DArrayShadow)
-            5169:175(f16vec3) Load 177(f16c3)
-            5170:   52(float) Load 215(compare)
-            5171:154(f16vec2) Load 1417(f16dPdxy2)
-            5172:154(f16vec2) Load 1417(f16dPdxy2)
-            5173:6(float16_t) Load 4274(f16lodClamp)
-            5174:6(float16_t) ImageSampleDrefExplicitLod 5168 5169 5170 Grad MinLod 5171 5172 5173
-            5175:    208(ptr) AccessChain 4972(texel) 207
-            5176:6(float16_t) Load 5175
-            5177:6(float16_t) FAdd 5176 5174
-            5178:    208(ptr) AccessChain 4972(texel) 207
-                              Store 5178 5177
-            5179:         299 Load 301(sCubeArray)
-            5180:  249(fvec4) Load 251(c4)
-            5181:  167(fvec3) Load 1425(dPdxy3)
-            5182:  167(fvec3) Load 1425(dPdxy3)
-            5183:   52(float) Load 4267(lodClamp)
-            5184:  7(f16vec4) ImageSampleExplicitLod 5179 5180 Grad MinLod 5181 5182 5183
-            5185:  7(f16vec4) Load 4972(texel)
-            5186:  7(f16vec4) FAdd 5185 5184
-                              Store 4972(texel) 5186
-            5187:         299 Load 301(sCubeArray)
-            5188:  7(f16vec4) Load 309(f16c4)
-            5189:175(f16vec3) Load 1433(f16dPdxy3)
-            5190:175(f16vec3) Load 1433(f16dPdxy3)
-            5191:6(float16_t) Load 4274(f16lodClamp)
-            5192:  7(f16vec4) ImageSampleExplicitLod 5187 5188 Grad MinLod 5189 5190 5191
-            5193:  7(f16vec4) Load 4972(texel)
-            5194:  7(f16vec4) FAdd 5193 5192
-                              Store 4972(texel) 5194
-            5195:  7(f16vec4) Load 4972(texel)
-                              ReturnValue 5195
+            5103:         224 Load 226(s2DShadow)
+            5104:  167(fvec3) Load 169(c3)
+            5105:   53(fvec2) Load 1409(dPdxy2)
+            5106:   53(fvec2) Load 1409(dPdxy2)
+            5107:   52(float) Load 4311(lodClamp)
+            5108:   52(float) CompositeExtract 5104 2
+            5109:6(float16_t) ImageSampleDrefExplicitLod 5103 5104 5108 Grad MinLod 5105 5106 5107
+            5110:    208(ptr) AccessChain 5016(texel) 207
+            5111:6(float16_t) Load 5110
+            5112:6(float16_t) FAdd 5111 5109
+            5113:    208(ptr) AccessChain 5016(texel) 207
+                              Store 5113 5112
+            5114:         224 Load 226(s2DShadow)
+            5115:154(f16vec2) Load 156(f16c2)
+            5116:   52(float) Load 215(compare)
+            5117:154(f16vec2) Load 1417(f16dPdxy2)
+            5118:154(f16vec2) Load 1417(f16dPdxy2)
+            5119:6(float16_t) Load 4318(f16lodClamp)
+            5120:6(float16_t) ImageSampleDrefExplicitLod 5114 5115 5116 Grad MinLod 5117 5118 5119
+            5121:    208(ptr) AccessChain 5016(texel) 207
+            5122:6(float16_t) Load 5121
+            5123:6(float16_t) FAdd 5122 5120
+            5124:    208(ptr) AccessChain 5016(texel) 207
+                              Store 5124 5123
+            5125:         245 Load 247(sCubeShadow)
+            5126:  249(fvec4) Load 251(c4)
+            5127:  167(fvec3) Load 1425(dPdxy3)
+            5128:  167(fvec3) Load 1425(dPdxy3)
+            5129:   52(float) Load 4311(lodClamp)
+            5130:   52(float) CompositeExtract 5126 3
+            5131:6(float16_t) ImageSampleDrefExplicitLod 5125 5126 5130 Grad MinLod 5127 5128 5129
+            5132:    208(ptr) AccessChain 5016(texel) 207
+            5133:6(float16_t) Load 5132
+            5134:6(float16_t) FAdd 5133 5131
+            5135:    208(ptr) AccessChain 5016(texel) 207
+                              Store 5135 5134
+            5136:         245 Load 247(sCubeShadow)
+            5137:175(f16vec3) Load 177(f16c3)
+            5138:   52(float) Load 215(compare)
+            5139:175(f16vec3) Load 1433(f16dPdxy3)
+            5140:175(f16vec3) Load 1433(f16dPdxy3)
+            5141:6(float16_t) Load 4318(f16lodClamp)
+            5142:6(float16_t) ImageSampleDrefExplicitLod 5136 5137 5138 Grad MinLod 5139 5140 5141
+            5143:    208(ptr) AccessChain 5016(texel) 207
+            5144:6(float16_t) Load 5143
+            5145:6(float16_t) FAdd 5144 5142
+            5146:    208(ptr) AccessChain 5016(texel) 207
+                              Store 5146 5145
+            5147:         269 Load 271(s1DArray)
+            5148:   53(fvec2) Load 148(c2)
+            5149:   52(float) Load 1393(dPdxy1)
+            5150:   52(float) Load 1393(dPdxy1)
+            5151:   52(float) Load 4311(lodClamp)
+            5152:  7(f16vec4) ImageSampleExplicitLod 5147 5148 Grad MinLod 5149 5150 5151
+            5153:  7(f16vec4) Load 5016(texel)
+            5154:  7(f16vec4) FAdd 5153 5152
+                              Store 5016(texel) 5154
+            5155:         269 Load 271(s1DArray)
+            5156:154(f16vec2) Load 156(f16c2)
+            5157:6(float16_t) Load 1401(f16dPdxy1)
+            5158:6(float16_t) Load 1401(f16dPdxy1)
+            5159:6(float16_t) Load 4318(f16lodClamp)
+            5160:  7(f16vec4) ImageSampleExplicitLod 5155 5156 Grad MinLod 5157 5158 5159
+            5161:  7(f16vec4) Load 5016(texel)
+            5162:  7(f16vec4) FAdd 5161 5160
+                              Store 5016(texel) 5162
+            5163:         284 Load 286(s2DArray)
+            5164:  167(fvec3) Load 169(c3)
+            5165:   53(fvec2) Load 1409(dPdxy2)
+            5166:   53(fvec2) Load 1409(dPdxy2)
+            5167:   52(float) Load 4311(lodClamp)
+            5168:  7(f16vec4) ImageSampleExplicitLod 5163 5164 Grad MinLod 5165 5166 5167
+            5169:  7(f16vec4) Load 5016(texel)
+            5170:  7(f16vec4) FAdd 5169 5168
+                              Store 5016(texel) 5170
+            5171:         284 Load 286(s2DArray)
+            5172:175(f16vec3) Load 177(f16c3)
+            5173:154(f16vec2) Load 1417(f16dPdxy2)
+            5174:154(f16vec2) Load 1417(f16dPdxy2)
+            5175:6(float16_t) Load 4318(f16lodClamp)
+            5176:  7(f16vec4) ImageSampleExplicitLod 5171 5172 Grad MinLod 5173 5174 5175
+            5177:  7(f16vec4) Load 5016(texel)
+            5178:  7(f16vec4) FAdd 5177 5176
+                              Store 5016(texel) 5178
+            5179:         316 Load 318(s1DArrayShadow)
+            5180:  167(fvec3) Load 169(c3)
+            5181:   52(float) Load 1393(dPdxy1)
+            5182:   52(float) Load 1393(dPdxy1)
+            5183:   52(float) Load 4311(lodClamp)
+            5184:   52(float) CompositeExtract 5180 2
+            5185:6(float16_t) ImageSampleDrefExplicitLod 5179 5180 5184 Grad MinLod 5181 5182 5183
+            5186:    208(ptr) AccessChain 5016(texel) 207
+            5187:6(float16_t) Load 5186
+            5188:6(float16_t) FAdd 5187 5185
+            5189:    208(ptr) AccessChain 5016(texel) 207
+                              Store 5189 5188
+            5190:         316 Load 318(s1DArrayShadow)
+            5191:154(f16vec2) Load 156(f16c2)
+            5192:   52(float) Load 215(compare)
+            5193:6(float16_t) Load 1401(f16dPdxy1)
+            5194:6(float16_t) Load 1401(f16dPdxy1)
+            5195:6(float16_t) Load 4318(f16lodClamp)
+            5196:6(float16_t) ImageSampleDrefExplicitLod 5190 5191 5192 Grad MinLod 5193 5194 5195
+            5197:    208(ptr) AccessChain 5016(texel) 207
+            5198:6(float16_t) Load 5197
+            5199:6(float16_t) FAdd 5198 5196
+            5200:    208(ptr) AccessChain 5016(texel) 207
+                              Store 5200 5199
+            5201:         337 Load 339(s2DArrayShadow)
+            5202:  249(fvec4) Load 251(c4)
+            5203:   53(fvec2) Load 1409(dPdxy2)
+            5204:   53(fvec2) Load 1409(dPdxy2)
+            5205:   52(float) Load 4311(lodClamp)
+            5206:   52(float) CompositeExtract 5202 3
+            5207:6(float16_t) ImageSampleDrefExplicitLod 5201 5202 5206 Grad MinLod 5203 5204 5205
+            5208:    208(ptr) AccessChain 5016(texel) 207
+            5209:6(float16_t) Load 5208
+            5210:6(float16_t) FAdd 5209 5207
+            5211:    208(ptr) AccessChain 5016(texel) 207
+                              Store 5211 5210
+            5212:         337 Load 339(s2DArrayShadow)
+            5213:175(f16vec3) Load 177(f16c3)
+            5214:   52(float) Load 215(compare)
+            5215:154(f16vec2) Load 1417(f16dPdxy2)
+            5216:154(f16vec2) Load 1417(f16dPdxy2)
+            5217:6(float16_t) Load 4318(f16lodClamp)
+            5218:6(float16_t) ImageSampleDrefExplicitLod 5212 5213 5214 Grad MinLod 5215 5216 5217
+            5219:    208(ptr) AccessChain 5016(texel) 207
+            5220:6(float16_t) Load 5219
+            5221:6(float16_t) FAdd 5220 5218
+            5222:    208(ptr) AccessChain 5016(texel) 207
+                              Store 5222 5221
+            5223:         299 Load 301(sCubeArray)
+            5224:  249(fvec4) Load 251(c4)
+            5225:  167(fvec3) Load 1425(dPdxy3)
+            5226:  167(fvec3) Load 1425(dPdxy3)
+            5227:   52(float) Load 4311(lodClamp)
+            5228:  7(f16vec4) ImageSampleExplicitLod 5223 5224 Grad MinLod 5225 5226 5227
+            5229:  7(f16vec4) Load 5016(texel)
+            5230:  7(f16vec4) FAdd 5229 5228
+                              Store 5016(texel) 5230
+            5231:         299 Load 301(sCubeArray)
+            5232:  7(f16vec4) Load 309(f16c4)
+            5233:175(f16vec3) Load 1433(f16dPdxy3)
+            5234:175(f16vec3) Load 1433(f16dPdxy3)
+            5235:6(float16_t) Load 4318(f16lodClamp)
+            5236:  7(f16vec4) ImageSampleExplicitLod 5231 5232 Grad MinLod 5233 5234 5235
+            5237:  7(f16vec4) Load 5016(texel)
+            5238:  7(f16vec4) FAdd 5237 5236
+                              Store 5016(texel) 5238
+            5239:  7(f16vec4) Load 5016(texel)
+                              ReturnValue 5239
                               FunctionEnd
 111(testSparseTextureGradOffsetClamp():  7(f16vec4) Function None 8
              112:             Label
-     5198(texel):     64(ptr) Variable Function
-                              Store 5198(texel) 121
-            5199:         143 Load 145(s2D)
-            5200:   53(fvec2) Load 148(c2)
-            5201:   53(fvec2) Load 1409(dPdxy2)
-            5202:   53(fvec2) Load 1409(dPdxy2)
-            5203:   52(float) Load 4267(lodClamp)
-            5204:3102(ResType) ImageSparseSampleExplicitLod 5199 5200 Grad ConstOffset MinLod 5201 5202 722 5203
-            5205:  7(f16vec4) CompositeExtract 5204 1
-                              Store 5198(texel) 5205
-            5206:     47(int) CompositeExtract 5204 0
-            5207:         143 Load 145(s2D)
-            5208:154(f16vec2) Load 156(f16c2)
-            5209:154(f16vec2) Load 1417(f16dPdxy2)
-            5210:154(f16vec2) Load 1417(f16dPdxy2)
-            5211:6(float16_t) Load 4274(f16lodClamp)
-            5212:3102(ResType) ImageSparseSampleExplicitLod 5207 5208 Grad ConstOffset MinLod 5209 5210 722 5211
-            5213:  7(f16vec4) CompositeExtract 5212 1
-                              Store 5198(texel) 5213
-            5214:     47(int) CompositeExtract 5212 0
-            5215:         163 Load 165(s3D)
-            5216:  167(fvec3) Load 169(c3)
-            5217:  167(fvec3) Load 1425(dPdxy3)
-            5218:  167(fvec3) Load 1425(dPdxy3)
-            5219:   52(float) Load 4267(lodClamp)
-            5220:3102(ResType) ImageSparseSampleExplicitLod 5215 5216 Grad ConstOffset MinLod 5217 5218 735 5219
-            5221:  7(f16vec4) CompositeExtract 5220 1
-                              Store 5198(texel) 5221
-            5222:     47(int) CompositeExtract 5220 0
-            5223:         163 Load 165(s3D)
-            5224:175(f16vec3) Load 177(f16c3)
-            5225:175(f16vec3) Load 1433(f16dPdxy3)
-            5226:175(f16vec3) Load 1433(f16dPdxy3)
-            5227:6(float16_t) Load 4274(f16lodClamp)
-            5228:3102(ResType) ImageSparseSampleExplicitLod 5223 5224 Grad ConstOffset MinLod 5225 5226 735 5227
-            5229:  7(f16vec4) CompositeExtract 5228 1
-                              Store 5198(texel) 5229
-            5230:     47(int) CompositeExtract 5228 0
-            5231:         224 Load 226(s2DShadow)
-            5232:  167(fvec3) Load 169(c3)
-            5233:   53(fvec2) Load 1409(dPdxy2)
-            5234:   53(fvec2) Load 1409(dPdxy2)
-            5235:   52(float) Load 4267(lodClamp)
-            5236:    208(ptr) AccessChain 5198(texel) 207
-            5237:   52(float) CompositeExtract 5232 2
-            5238:3138(ResType) ImageSparseSampleDrefExplicitLod 5231 5232 5237 Grad ConstOffset MinLod 5233 5234 722 5235
-            5239:6(float16_t) CompositeExtract 5238 1
-                              Store 5236 5239
-            5240:     47(int) CompositeExtract 5238 0
-            5241:         224 Load 226(s2DShadow)
-            5242:154(f16vec2) Load 156(f16c2)
-            5243:   52(float) Load 215(compare)
-            5244:154(f16vec2) Load 1417(f16dPdxy2)
-            5245:154(f16vec2) Load 1417(f16dPdxy2)
-            5246:6(float16_t) Load 4274(f16lodClamp)
-            5247:    208(ptr) AccessChain 5198(texel) 207
-            5248:3138(ResType) ImageSparseSampleDrefExplicitLod 5241 5242 5243 Grad ConstOffset MinLod 5244 5245 722 5246
-            5249:6(float16_t) CompositeExtract 5248 1
-                              Store 5247 5249
+     5242(texel):     64(ptr) Variable Function
+                              Store 5242(texel) 121
+            5243:         143 Load 145(s2D)
+            5244:   53(fvec2) Load 148(c2)
+            5245:   53(fvec2) Load 1409(dPdxy2)
+            5246:   53(fvec2) Load 1409(dPdxy2)
+            5247:   52(float) Load 4311(lodClamp)
+            5248:3146(ResType) ImageSparseSampleExplicitLod 5243 5244 Grad ConstOffset MinLod 5245 5246 722 5247
+            5249:  7(f16vec4) CompositeExtract 5248 1
+                              Store 5242(texel) 5249
             5250:     47(int) CompositeExtract 5248 0
-            5251:         284 Load 286(s2DArray)
-            5252:  167(fvec3) Load 169(c3)
-            5253:   53(fvec2) Load 1409(dPdxy2)
-            5254:   53(fvec2) Load 1409(dPdxy2)
-            5255:   52(float) Load 4267(lodClamp)
-            5256:3102(ResType) ImageSparseSampleExplicitLod 5251 5252 Grad ConstOffset MinLod 5253 5254 722 5255
+            5251:         143 Load 145(s2D)
+            5252:154(f16vec2) Load 156(f16c2)
+            5253:154(f16vec2) Load 1417(f16dPdxy2)
+            5254:154(f16vec2) Load 1417(f16dPdxy2)
+            5255:6(float16_t) Load 4318(f16lodClamp)
+            5256:3146(ResType) ImageSparseSampleExplicitLod 5251 5252 Grad ConstOffset MinLod 5253 5254 722 5255
             5257:  7(f16vec4) CompositeExtract 5256 1
-                              Store 5198(texel) 5257
+                              Store 5242(texel) 5257
             5258:     47(int) CompositeExtract 5256 0
-            5259:         284 Load 286(s2DArray)
-            5260:175(f16vec3) Load 177(f16c3)
-            5261:154(f16vec2) Load 1417(f16dPdxy2)
-            5262:154(f16vec2) Load 1417(f16dPdxy2)
-            5263:6(float16_t) Load 4274(f16lodClamp)
-            5264:3102(ResType) ImageSparseSampleExplicitLod 5259 5260 Grad ConstOffset MinLod 5261 5262 722 5263
+            5259:         163 Load 165(s3D)
+            5260:  167(fvec3) Load 169(c3)
+            5261:  167(fvec3) Load 1425(dPdxy3)
+            5262:  167(fvec3) Load 1425(dPdxy3)
+            5263:   52(float) Load 4311(lodClamp)
+            5264:3146(ResType) ImageSparseSampleExplicitLod 5259 5260 Grad ConstOffset MinLod 5261 5262 735 5263
             5265:  7(f16vec4) CompositeExtract 5264 1
-                              Store 5198(texel) 5265
+                              Store 5242(texel) 5265
             5266:     47(int) CompositeExtract 5264 0
-            5267:         337 Load 339(s2DArrayShadow)
-            5268:  249(fvec4) Load 251(c4)
-            5269:   53(fvec2) Load 1409(dPdxy2)
-            5270:   53(fvec2) Load 1409(dPdxy2)
-            5271:   52(float) Load 4267(lodClamp)
-            5272:    208(ptr) AccessChain 5198(texel) 207
-            5273:   52(float) CompositeExtract 5268 3
-            5274:3138(ResType) ImageSparseSampleDrefExplicitLod 5267 5268 5273 Grad ConstOffset MinLod 5269 5270 722 5271
-            5275:6(float16_t) CompositeExtract 5274 1
-                              Store 5272 5275
-            5276:     47(int) CompositeExtract 5274 0
-            5277:         337 Load 339(s2DArrayShadow)
-            5278:175(f16vec3) Load 177(f16c3)
-            5279:   52(float) Load 215(compare)
-            5280:154(f16vec2) Load 1417(f16dPdxy2)
-            5281:154(f16vec2) Load 1417(f16dPdxy2)
-            5282:6(float16_t) Load 4274(f16lodClamp)
-            5283:    208(ptr) AccessChain 5198(texel) 207
-            5284:3138(ResType) ImageSparseSampleDrefExplicitLod 5277 5278 5279 Grad ConstOffset MinLod 5280 5281 722 5282
-            5285:6(float16_t) CompositeExtract 5284 1
-                              Store 5283 5285
-            5286:     47(int) CompositeExtract 5284 0
-            5287:  7(f16vec4) Load 5198(texel)
-                              ReturnValue 5287
+            5267:         163 Load 165(s3D)
+            5268:175(f16vec3) Load 177(f16c3)
+            5269:175(f16vec3) Load 1433(f16dPdxy3)
+            5270:175(f16vec3) Load 1433(f16dPdxy3)
+            5271:6(float16_t) Load 4318(f16lodClamp)
+            5272:3146(ResType) ImageSparseSampleExplicitLod 5267 5268 Grad ConstOffset MinLod 5269 5270 735 5271
+            5273:  7(f16vec4) CompositeExtract 5272 1
+                              Store 5242(texel) 5273
+            5274:     47(int) CompositeExtract 5272 0
+            5275:         224 Load 226(s2DShadow)
+            5276:  167(fvec3) Load 169(c3)
+            5277:   53(fvec2) Load 1409(dPdxy2)
+            5278:   53(fvec2) Load 1409(dPdxy2)
+            5279:   52(float) Load 4311(lodClamp)
+            5280:    208(ptr) AccessChain 5242(texel) 207
+            5281:   52(float) CompositeExtract 5276 2
+            5282:3182(ResType) ImageSparseSampleDrefExplicitLod 5275 5276 5281 Grad ConstOffset MinLod 5277 5278 722 5279
+            5283:6(float16_t) CompositeExtract 5282 1
+                              Store 5280 5283
+            5284:     47(int) CompositeExtract 5282 0
+            5285:         224 Load 226(s2DShadow)
+            5286:154(f16vec2) Load 156(f16c2)
+            5287:   52(float) Load 215(compare)
+            5288:154(f16vec2) Load 1417(f16dPdxy2)
+            5289:154(f16vec2) Load 1417(f16dPdxy2)
+            5290:6(float16_t) Load 4318(f16lodClamp)
+            5291:    208(ptr) AccessChain 5242(texel) 207
+            5292:3182(ResType) ImageSparseSampleDrefExplicitLod 5285 5286 5287 Grad ConstOffset MinLod 5288 5289 722 5290
+            5293:6(float16_t) CompositeExtract 5292 1
+                              Store 5291 5293
+            5294:     47(int) CompositeExtract 5292 0
+            5295:         284 Load 286(s2DArray)
+            5296:  167(fvec3) Load 169(c3)
+            5297:   53(fvec2) Load 1409(dPdxy2)
+            5298:   53(fvec2) Load 1409(dPdxy2)
+            5299:   52(float) Load 4311(lodClamp)
+            5300:3146(ResType) ImageSparseSampleExplicitLod 5295 5296 Grad ConstOffset MinLod 5297 5298 722 5299
+            5301:  7(f16vec4) CompositeExtract 5300 1
+                              Store 5242(texel) 5301
+            5302:     47(int) CompositeExtract 5300 0
+            5303:         284 Load 286(s2DArray)
+            5304:175(f16vec3) Load 177(f16c3)
+            5305:154(f16vec2) Load 1417(f16dPdxy2)
+            5306:154(f16vec2) Load 1417(f16dPdxy2)
+            5307:6(float16_t) Load 4318(f16lodClamp)
+            5308:3146(ResType) ImageSparseSampleExplicitLod 5303 5304 Grad ConstOffset MinLod 5305 5306 722 5307
+            5309:  7(f16vec4) CompositeExtract 5308 1
+                              Store 5242(texel) 5309
+            5310:     47(int) CompositeExtract 5308 0
+            5311:         337 Load 339(s2DArrayShadow)
+            5312:  249(fvec4) Load 251(c4)
+            5313:   53(fvec2) Load 1409(dPdxy2)
+            5314:   53(fvec2) Load 1409(dPdxy2)
+            5315:   52(float) Load 4311(lodClamp)
+            5316:    208(ptr) AccessChain 5242(texel) 207
+            5317:   52(float) CompositeExtract 5312 3
+            5318:3182(ResType) ImageSparseSampleDrefExplicitLod 5311 5312 5317 Grad ConstOffset MinLod 5313 5314 722 5315
+            5319:6(float16_t) CompositeExtract 5318 1
+                              Store 5316 5319
+            5320:     47(int) CompositeExtract 5318 0
+            5321:         337 Load 339(s2DArrayShadow)
+            5322:175(f16vec3) Load 177(f16c3)
+            5323:   52(float) Load 215(compare)
+            5324:154(f16vec2) Load 1417(f16dPdxy2)
+            5325:154(f16vec2) Load 1417(f16dPdxy2)
+            5326:6(float16_t) Load 4318(f16lodClamp)
+            5327:    208(ptr) AccessChain 5242(texel) 207
+            5328:3182(ResType) ImageSparseSampleDrefExplicitLod 5321 5322 5323 Grad ConstOffset MinLod 5324 5325 722 5326
+            5329:6(float16_t) CompositeExtract 5328 1
+                              Store 5327 5329
+            5330:     47(int) CompositeExtract 5328 0
+            5331:  7(f16vec4) Load 5242(texel)
+                              ReturnValue 5331
                               FunctionEnd
 113(testTextureGradOffsetClamp():  7(f16vec4) Function None 8
              114:             Label
-     5290(texel):     64(ptr) Variable Function
-                              Store 5290(texel) 121
-            5291:         123 Load 125(s1D)
-            5292:   52(float) Load 128(c1)
-            5293:   52(float) Load 1393(dPdxy1)
-            5294:   52(float) Load 1393(dPdxy1)
-            5295:   52(float) Load 4267(lodClamp)
-            5296:  7(f16vec4) ImageSampleExplicitLod 5291 5292 Grad ConstOffset MinLod 5293 5294 709 5295
-            5297:  7(f16vec4) Load 5290(texel)
-            5298:  7(f16vec4) FAdd 5297 5296
-                              Store 5290(texel) 5298
-            5299:         123 Load 125(s1D)
-            5300:6(float16_t) Load 135(f16c1)
-            5301:6(float16_t) Load 1401(f16dPdxy1)
-            5302:6(float16_t) Load 1401(f16dPdxy1)
-            5303:6(float16_t) Load 4274(f16lodClamp)
-            5304:  7(f16vec4) ImageSampleExplicitLod 5299 5300 Grad ConstOffset MinLod 5301 5302 709 5303
-            5305:  7(f16vec4) Load 5290(texel)
-            5306:  7(f16vec4) FAdd 5305 5304
-                              Store 5290(texel) 5306
-            5307:         143 Load 145(s2D)
-            5308:   53(fvec2) Load 148(c2)
-            5309:   53(fvec2) Load 1409(dPdxy2)
-            5310:   53(fvec2) Load 1409(dPdxy2)
-            5311:   52(float) Load 4267(lodClamp)
-            5312:  7(f16vec4) ImageSampleExplicitLod 5307 5308 Grad ConstOffset MinLod 5309 5310 722 5311
-            5313:  7(f16vec4) Load 5290(texel)
-            5314:  7(f16vec4) FAdd 5313 5312
-                              Store 5290(texel) 5314
-            5315:         143 Load 145(s2D)
-            5316:154(f16vec2) Load 156(f16c2)
-            5317:154(f16vec2) Load 1417(f16dPdxy2)
-            5318:154(f16vec2) Load 1417(f16dPdxy2)
-            5319:6(float16_t) Load 4274(f16lodClamp)
-            5320:  7(f16vec4) ImageSampleExplicitLod 5315 5316 Grad ConstOffset MinLod 5317 5318 722 5319
-            5321:  7(f16vec4) Load 5290(texel)
-            5322:  7(f16vec4) FAdd 5321 5320
-                              Store 5290(texel) 5322
-            5323:         163 Load 165(s3D)
-            5324:  167(fvec3) Load 169(c3)
-            5325:  167(fvec3) Load 1425(dPdxy3)
-            5326:  167(fvec3) Load 1425(dPdxy3)
-            5327:   52(float) Load 4267(lodClamp)
-            5328:  7(f16vec4) ImageSampleExplicitLod 5323 5324 Grad ConstOffset MinLod 5325 5326 735 5327
-            5329:  7(f16vec4) Load 5290(texel)
-            5330:  7(f16vec4) FAdd 5329 5328
-                              Store 5290(texel) 5330
-            5331:         163 Load 165(s3D)
-            5332:175(f16vec3) Load 177(f16c3)
-            5333:175(f16vec3) Load 1433(f16dPdxy3)
-            5334:175(f16vec3) Load 1433(f16dPdxy3)
-            5335:6(float16_t) Load 4274(f16lodClamp)
-            5336:  7(f16vec4) ImageSampleExplicitLod 5331 5332 Grad ConstOffset MinLod 5333 5334 735 5335
-            5337:  7(f16vec4) Load 5290(texel)
-            5338:  7(f16vec4) FAdd 5337 5336
-                              Store 5290(texel) 5338
-            5339:         199 Load 201(s1DShadow)
-            5340:  167(fvec3) Load 169(c3)
-            5341:   52(float) Load 1393(dPdxy1)
-            5342:   52(float) Load 1393(dPdxy1)
-            5343:   52(float) Load 4267(lodClamp)
-            5344:   52(float) CompositeExtract 5340 2
-            5345:6(float16_t) ImageSampleDrefExplicitLod 5339 5340 5344 Grad ConstOffset MinLod 5341 5342 709 5343
-            5346:    208(ptr) AccessChain 5290(texel) 207
-            5347:6(float16_t) Load 5346
-            5348:6(float16_t) FAdd 5347 5345
-            5349:    208(ptr) AccessChain 5290(texel) 207
-                              Store 5349 5348
-            5350:         199 Load 201(s1DShadow)
-            5351:154(f16vec2) Load 156(f16c2)
-            5352:   52(float) Load 215(compare)
-            5353:6(float16_t) Load 1401(f16dPdxy1)
-            5354:6(float16_t) Load 1401(f16dPdxy1)
-            5355:6(float16_t) Load 4274(f16lodClamp)
-            5356:6(float16_t) ImageSampleDrefExplicitLod 5350 5351 5352 Grad ConstOffset MinLod 5353 5354 709 5355
-            5357:    208(ptr) AccessChain 5290(texel) 207
-            5358:6(float16_t) Load 5357
-            5359:6(float16_t) FAdd 5358 5356
-            5360:    208(ptr) AccessChain 5290(texel) 207
-                              Store 5360 5359
-            5361:         224 Load 226(s2DShadow)
-            5362:  167(fvec3) Load 169(c3)
-            5363:   53(fvec2) Load 1409(dPdxy2)
-            5364:   53(fvec2) Load 1409(dPdxy2)
-            5365:   52(float) Load 4267(lodClamp)
-            5366:   52(float) CompositeExtract 5362 2
-            5367:6(float16_t) ImageSampleDrefExplicitLod 5361 5362 5366 Grad ConstOffset MinLod 5363 5364 722 5365
-            5368:    208(ptr) AccessChain 5290(texel) 207
-            5369:6(float16_t) Load 5368
-            5370:6(float16_t) FAdd 5369 5367
-            5371:    208(ptr) AccessChain 5290(texel) 207
-                              Store 5371 5370
-            5372:         224 Load 226(s2DShadow)
-            5373:154(f16vec2) Load 156(f16c2)
-            5374:   52(float) Load 215(compare)
-            5375:154(f16vec2) Load 1417(f16dPdxy2)
-            5376:154(f16vec2) Load 1417(f16dPdxy2)
-            5377:6(float16_t) Load 4274(f16lodClamp)
-            5378:6(float16_t) ImageSampleDrefExplicitLod 5372 5373 5374 Grad ConstOffset MinLod 5375 5376 722 5377
-            5379:    208(ptr) AccessChain 5290(texel) 207
-            5380:6(float16_t) Load 5379
-            5381:6(float16_t) FAdd 5380 5378
-            5382:    208(ptr) AccessChain 5290(texel) 207
-                              Store 5382 5381
-            5383:         269 Load 271(s1DArray)
-            5384:   53(fvec2) Load 148(c2)
+     5334(texel):     64(ptr) Variable Function
+                              Store 5334(texel) 121
+            5335:         123 Load 125(s1D)
+            5336:   52(float) Load 128(c1)
+            5337:   52(float) Load 1393(dPdxy1)
+            5338:   52(float) Load 1393(dPdxy1)
+            5339:   52(float) Load 4311(lodClamp)
+            5340:  7(f16vec4) ImageSampleExplicitLod 5335 5336 Grad ConstOffset MinLod 5337 5338 709 5339
+            5341:  7(f16vec4) Load 5334(texel)
+            5342:  7(f16vec4) FAdd 5341 5340
+                              Store 5334(texel) 5342
+            5343:         123 Load 125(s1D)
+            5344:6(float16_t) Load 135(f16c1)
+            5345:6(float16_t) Load 1401(f16dPdxy1)
+            5346:6(float16_t) Load 1401(f16dPdxy1)
+            5347:6(float16_t) Load 4318(f16lodClamp)
+            5348:  7(f16vec4) ImageSampleExplicitLod 5343 5344 Grad ConstOffset MinLod 5345 5346 709 5347
+            5349:  7(f16vec4) Load 5334(texel)
+            5350:  7(f16vec4) FAdd 5349 5348
+                              Store 5334(texel) 5350
+            5351:         143 Load 145(s2D)
+            5352:   53(fvec2) Load 148(c2)
+            5353:   53(fvec2) Load 1409(dPdxy2)
+            5354:   53(fvec2) Load 1409(dPdxy2)
+            5355:   52(float) Load 4311(lodClamp)
+            5356:  7(f16vec4) ImageSampleExplicitLod 5351 5352 Grad ConstOffset MinLod 5353 5354 722 5355
+            5357:  7(f16vec4) Load 5334(texel)
+            5358:  7(f16vec4) FAdd 5357 5356
+                              Store 5334(texel) 5358
+            5359:         143 Load 145(s2D)
+            5360:154(f16vec2) Load 156(f16c2)
+            5361:154(f16vec2) Load 1417(f16dPdxy2)
+            5362:154(f16vec2) Load 1417(f16dPdxy2)
+            5363:6(float16_t) Load 4318(f16lodClamp)
+            5364:  7(f16vec4) ImageSampleExplicitLod 5359 5360 Grad ConstOffset MinLod 5361 5362 722 5363
+            5365:  7(f16vec4) Load 5334(texel)
+            5366:  7(f16vec4) FAdd 5365 5364
+                              Store 5334(texel) 5366
+            5367:         163 Load 165(s3D)
+            5368:  167(fvec3) Load 169(c3)
+            5369:  167(fvec3) Load 1425(dPdxy3)
+            5370:  167(fvec3) Load 1425(dPdxy3)
+            5371:   52(float) Load 4311(lodClamp)
+            5372:  7(f16vec4) ImageSampleExplicitLod 5367 5368 Grad ConstOffset MinLod 5369 5370 735 5371
+            5373:  7(f16vec4) Load 5334(texel)
+            5374:  7(f16vec4) FAdd 5373 5372
+                              Store 5334(texel) 5374
+            5375:         163 Load 165(s3D)
+            5376:175(f16vec3) Load 177(f16c3)
+            5377:175(f16vec3) Load 1433(f16dPdxy3)
+            5378:175(f16vec3) Load 1433(f16dPdxy3)
+            5379:6(float16_t) Load 4318(f16lodClamp)
+            5380:  7(f16vec4) ImageSampleExplicitLod 5375 5376 Grad ConstOffset MinLod 5377 5378 735 5379
+            5381:  7(f16vec4) Load 5334(texel)
+            5382:  7(f16vec4) FAdd 5381 5380
+                              Store 5334(texel) 5382
+            5383:         199 Load 201(s1DShadow)
+            5384:  167(fvec3) Load 169(c3)
             5385:   52(float) Load 1393(dPdxy1)
             5386:   52(float) Load 1393(dPdxy1)
-            5387:   52(float) Load 4267(lodClamp)
-            5388:  7(f16vec4) ImageSampleExplicitLod 5383 5384 Grad ConstOffset MinLod 5385 5386 709 5387
-            5389:  7(f16vec4) Load 5290(texel)
-            5390:  7(f16vec4) FAdd 5389 5388
-                              Store 5290(texel) 5390
-            5391:         269 Load 271(s1DArray)
-            5392:154(f16vec2) Load 156(f16c2)
-            5393:6(float16_t) Load 1401(f16dPdxy1)
-            5394:6(float16_t) Load 1401(f16dPdxy1)
-            5395:6(float16_t) Load 4274(f16lodClamp)
-            5396:  7(f16vec4) ImageSampleExplicitLod 5391 5392 Grad ConstOffset MinLod 5393 5394 709 5395
-            5397:  7(f16vec4) Load 5290(texel)
-            5398:  7(f16vec4) FAdd 5397 5396
-                              Store 5290(texel) 5398
-            5399:         284 Load 286(s2DArray)
-            5400:  167(fvec3) Load 169(c3)
-            5401:   53(fvec2) Load 1409(dPdxy2)
-            5402:   53(fvec2) Load 1409(dPdxy2)
-            5403:   52(float) Load 4267(lodClamp)
-            5404:  7(f16vec4) ImageSampleExplicitLod 5399 5400 Grad ConstOffset MinLod 5401 5402 722 5403
-            5405:  7(f16vec4) Load 5290(texel)
-            5406:  7(f16vec4) FAdd 5405 5404
-                              Store 5290(texel) 5406
-            5407:         284 Load 286(s2DArray)
-            5408:175(f16vec3) Load 177(f16c3)
-            5409:154(f16vec2) Load 1417(f16dPdxy2)
-            5410:154(f16vec2) Load 1417(f16dPdxy2)
-            5411:6(float16_t) Load 4274(f16lodClamp)
-            5412:  7(f16vec4) ImageSampleExplicitLod 5407 5408 Grad ConstOffset MinLod 5409 5410 722 5411
-            5413:  7(f16vec4) Load 5290(texel)
-            5414:  7(f16vec4) FAdd 5413 5412
-                              Store 5290(texel) 5414
-            5415:         316 Load 318(s1DArrayShadow)
-            5416:  167(fvec3) Load 169(c3)
-            5417:   52(float) Load 1393(dPdxy1)
-            5418:   52(float) Load 1393(dPdxy1)
-            5419:   52(float) Load 4267(lodClamp)
-            5420:   52(float) CompositeExtract 5416 2
-            5421:6(float16_t) ImageSampleDrefExplicitLod 5415 5416 5420 Grad ConstOffset MinLod 5417 5418 709 5419
-            5422:    208(ptr) AccessChain 5290(texel) 207
-            5423:6(float16_t) Load 5422
-            5424:6(float16_t) FAdd 5423 5421
-            5425:    208(ptr) AccessChain 5290(texel) 207
-                              Store 5425 5424
-            5426:         316 Load 318(s1DArrayShadow)
-            5427:154(f16vec2) Load 156(f16c2)
-            5428:   52(float) Load 215(compare)
-            5429:6(float16_t) Load 1401(f16dPdxy1)
-            5430:6(float16_t) Load 1401(f16dPdxy1)
-            5431:6(float16_t) Load 4274(f16lodClamp)
-            5432:6(float16_t) ImageSampleDrefExplicitLod 5426 5427 5428 Grad ConstOffset MinLod 5429 5430 709 5431
-            5433:    208(ptr) AccessChain 5290(texel) 207
-            5434:6(float16_t) Load 5433
-            5435:6(float16_t) FAdd 5434 5432
-            5436:    208(ptr) AccessChain 5290(texel) 207
-                              Store 5436 5435
-            5437:         337 Load 339(s2DArrayShadow)
-            5438:  249(fvec4) Load 251(c4)
-            5439:   53(fvec2) Load 1409(dPdxy2)
-            5440:   53(fvec2) Load 1409(dPdxy2)
-            5441:   52(float) Load 4267(lodClamp)
-            5442:   52(float) CompositeExtract 5438 3
-            5443:6(float16_t) ImageSampleDrefExplicitLod 5437 5438 5442 Grad ConstOffset MinLod 5439 5440 722 5441
-            5444:    208(ptr) AccessChain 5290(texel) 207
-            5445:6(float16_t) Load 5444
-            5446:6(float16_t) FAdd 5445 5443
-            5447:    208(ptr) AccessChain 5290(texel) 207
-                              Store 5447 5446
-            5448:         337 Load 339(s2DArrayShadow)
-            5449:175(f16vec3) Load 177(f16c3)
-            5450:   52(float) Load 215(compare)
-            5451:154(f16vec2) Load 1417(f16dPdxy2)
-            5452:154(f16vec2) Load 1417(f16dPdxy2)
-            5453:6(float16_t) Load 4274(f16lodClamp)
-            5454:6(float16_t) ImageSampleDrefExplicitLod 5448 5449 5450 Grad ConstOffset MinLod 5451 5452 722 5453
-            5455:    208(ptr) AccessChain 5290(texel) 207
-            5456:6(float16_t) Load 5455
-            5457:6(float16_t) FAdd 5456 5454
-            5458:    208(ptr) AccessChain 5290(texel) 207
-                              Store 5458 5457
-            5459:  7(f16vec4) Load 5290(texel)
-                              ReturnValue 5459
+            5387:   52(float) Load 4311(lodClamp)
+            5388:   52(float) CompositeExtract 5384 2
+            5389:6(float16_t) ImageSampleDrefExplicitLod 5383 5384 5388 Grad ConstOffset MinLod 5385 5386 709 5387
+            5390:    208(ptr) AccessChain 5334(texel) 207
+            5391:6(float16_t) Load 5390
+            5392:6(float16_t) FAdd 5391 5389
+            5393:    208(ptr) AccessChain 5334(texel) 207
+                              Store 5393 5392
+            5394:         199 Load 201(s1DShadow)
+            5395:154(f16vec2) Load 156(f16c2)
+            5396:   52(float) Load 215(compare)
+            5397:6(float16_t) Load 1401(f16dPdxy1)
+            5398:6(float16_t) Load 1401(f16dPdxy1)
+            5399:6(float16_t) Load 4318(f16lodClamp)
+            5400:6(float16_t) ImageSampleDrefExplicitLod 5394 5395 5396 Grad ConstOffset MinLod 5397 5398 709 5399
+            5401:    208(ptr) AccessChain 5334(texel) 207
+            5402:6(float16_t) Load 5401
+            5403:6(float16_t) FAdd 5402 5400
+            5404:    208(ptr) AccessChain 5334(texel) 207
+                              Store 5404 5403
+            5405:         224 Load 226(s2DShadow)
+            5406:  167(fvec3) Load 169(c3)
+            5407:   53(fvec2) Load 1409(dPdxy2)
+            5408:   53(fvec2) Load 1409(dPdxy2)
+            5409:   52(float) Load 4311(lodClamp)
+            5410:   52(float) CompositeExtract 5406 2
+            5411:6(float16_t) ImageSampleDrefExplicitLod 5405 5406 5410 Grad ConstOffset MinLod 5407 5408 722 5409
+            5412:    208(ptr) AccessChain 5334(texel) 207
+            5413:6(float16_t) Load 5412
+            5414:6(float16_t) FAdd 5413 5411
+            5415:    208(ptr) AccessChain 5334(texel) 207
+                              Store 5415 5414
+            5416:         224 Load 226(s2DShadow)
+            5417:154(f16vec2) Load 156(f16c2)
+            5418:   52(float) Load 215(compare)
+            5419:154(f16vec2) Load 1417(f16dPdxy2)
+            5420:154(f16vec2) Load 1417(f16dPdxy2)
+            5421:6(float16_t) Load 4318(f16lodClamp)
+            5422:6(float16_t) ImageSampleDrefExplicitLod 5416 5417 5418 Grad ConstOffset MinLod 5419 5420 722 5421
+            5423:    208(ptr) AccessChain 5334(texel) 207
+            5424:6(float16_t) Load 5423
+            5425:6(float16_t) FAdd 5424 5422
+            5426:    208(ptr) AccessChain 5334(texel) 207
+                              Store 5426 5425
+            5427:         269 Load 271(s1DArray)
+            5428:   53(fvec2) Load 148(c2)
+            5429:   52(float) Load 1393(dPdxy1)
+            5430:   52(float) Load 1393(dPdxy1)
+            5431:   52(float) Load 4311(lodClamp)
+            5432:  7(f16vec4) ImageSampleExplicitLod 5427 5428 Grad ConstOffset MinLod 5429 5430 709 5431
+            5433:  7(f16vec4) Load 5334(texel)
+            5434:  7(f16vec4) FAdd 5433 5432
+                              Store 5334(texel) 5434
+            5435:         269 Load 271(s1DArray)
+            5436:154(f16vec2) Load 156(f16c2)
+            5437:6(float16_t) Load 1401(f16dPdxy1)
+            5438:6(float16_t) Load 1401(f16dPdxy1)
+            5439:6(float16_t) Load 4318(f16lodClamp)
+            5440:  7(f16vec4) ImageSampleExplicitLod 5435 5436 Grad ConstOffset MinLod 5437 5438 709 5439
+            5441:  7(f16vec4) Load 5334(texel)
+            5442:  7(f16vec4) FAdd 5441 5440
+                              Store 5334(texel) 5442
+            5443:         284 Load 286(s2DArray)
+            5444:  167(fvec3) Load 169(c3)
+            5445:   53(fvec2) Load 1409(dPdxy2)
+            5446:   53(fvec2) Load 1409(dPdxy2)
+            5447:   52(float) Load 4311(lodClamp)
+            5448:  7(f16vec4) ImageSampleExplicitLod 5443 5444 Grad ConstOffset MinLod 5445 5446 722 5447
+            5449:  7(f16vec4) Load 5334(texel)
+            5450:  7(f16vec4) FAdd 5449 5448
+                              Store 5334(texel) 5450
+            5451:         284 Load 286(s2DArray)
+            5452:175(f16vec3) Load 177(f16c3)
+            5453:154(f16vec2) Load 1417(f16dPdxy2)
+            5454:154(f16vec2) Load 1417(f16dPdxy2)
+            5455:6(float16_t) Load 4318(f16lodClamp)
+            5456:  7(f16vec4) ImageSampleExplicitLod 5451 5452 Grad ConstOffset MinLod 5453 5454 722 5455
+            5457:  7(f16vec4) Load 5334(texel)
+            5458:  7(f16vec4) FAdd 5457 5456
+                              Store 5334(texel) 5458
+            5459:         316 Load 318(s1DArrayShadow)
+            5460:  167(fvec3) Load 169(c3)
+            5461:   52(float) Load 1393(dPdxy1)
+            5462:   52(float) Load 1393(dPdxy1)
+            5463:   52(float) Load 4311(lodClamp)
+            5464:   52(float) CompositeExtract 5460 2
+            5465:6(float16_t) ImageSampleDrefExplicitLod 5459 5460 5464 Grad ConstOffset MinLod 5461 5462 709 5463
+            5466:    208(ptr) AccessChain 5334(texel) 207
+            5467:6(float16_t) Load 5466
+            5468:6(float16_t) FAdd 5467 5465
+            5469:    208(ptr) AccessChain 5334(texel) 207
+                              Store 5469 5468
+            5470:         316 Load 318(s1DArrayShadow)
+            5471:154(f16vec2) Load 156(f16c2)
+            5472:   52(float) Load 215(compare)
+            5473:6(float16_t) Load 1401(f16dPdxy1)
+            5474:6(float16_t) Load 1401(f16dPdxy1)
+            5475:6(float16_t) Load 4318(f16lodClamp)
+            5476:6(float16_t) ImageSampleDrefExplicitLod 5470 5471 5472 Grad ConstOffset MinLod 5473 5474 709 5475
+            5477:    208(ptr) AccessChain 5334(texel) 207
+            5478:6(float16_t) Load 5477
+            5479:6(float16_t) FAdd 5478 5476
+            5480:    208(ptr) AccessChain 5334(texel) 207
+                              Store 5480 5479
+            5481:         337 Load 339(s2DArrayShadow)
+            5482:  249(fvec4) Load 251(c4)
+            5483:   53(fvec2) Load 1409(dPdxy2)
+            5484:   53(fvec2) Load 1409(dPdxy2)
+            5485:   52(float) Load 4311(lodClamp)
+            5486:   52(float) CompositeExtract 5482 3
+            5487:6(float16_t) ImageSampleDrefExplicitLod 5481 5482 5486 Grad ConstOffset MinLod 5483 5484 722 5485
+            5488:    208(ptr) AccessChain 5334(texel) 207
+            5489:6(float16_t) Load 5488
+            5490:6(float16_t) FAdd 5489 5487
+            5491:    208(ptr) AccessChain 5334(texel) 207
+                              Store 5491 5490
+            5492:         337 Load 339(s2DArrayShadow)
+            5493:175(f16vec3) Load 177(f16c3)
+            5494:   52(float) Load 215(compare)
+            5495:154(f16vec2) Load 1417(f16dPdxy2)
+            5496:154(f16vec2) Load 1417(f16dPdxy2)
+            5497:6(float16_t) Load 4318(f16lodClamp)
+            5498:6(float16_t) ImageSampleDrefExplicitLod 5492 5493 5494 Grad ConstOffset MinLod 5495 5496 722 5497
+            5499:    208(ptr) AccessChain 5334(texel) 207
+            5500:6(float16_t) Load 5499
+            5501:6(float16_t) FAdd 5500 5498
+            5502:    208(ptr) AccessChain 5334(texel) 207
+                              Store 5502 5501
+            5503:  7(f16vec4) Load 5334(texel)
+                              ReturnValue 5503
                               FunctionEnd
 115(testCombinedTextureSampler():  7(f16vec4) Function None 8
              116:             Label
-     5462(texel):     64(ptr) Variable Function
-                              Store 5462(texel) 121
-            5465:         122 Load 5464(t1D)
-            5469:        5466 Load 5468(s)
-            5470:         123 SampledImage 5465 5469
-            5471:   52(float) Load 128(c1)
-            5472:  7(f16vec4) ImageSampleImplicitLod 5470 5471
-            5473:  7(f16vec4) Load 5462(texel)
-            5474:  7(f16vec4) FAdd 5473 5472
-                              Store 5462(texel) 5474
-            5475:         122 Load 5464(t1D)
-            5476:        5466 Load 5468(s)
-            5477:         123 SampledImage 5475 5476
-            5478:6(float16_t) Load 135(f16c1)
-            5479:6(float16_t) Load 137(f16bias)
-            5480:  7(f16vec4) ImageSampleImplicitLod 5477 5478 Bias 5479
-            5481:  7(f16vec4) Load 5462(texel)
-            5482:  7(f16vec4) FAdd 5481 5480
-                              Store 5462(texel) 5482
-            5485:         142 Load 5484(t2D)
-            5486:        5466 Load 5468(s)
-            5487:         143 SampledImage 5485 5486
-            5488:   53(fvec2) Load 148(c2)
-            5489:  7(f16vec4) ImageSampleImplicitLod 5487 5488
-            5490:  7(f16vec4) Load 5462(texel)
-            5491:  7(f16vec4) FAdd 5490 5489
-                              Store 5462(texel) 5491
-            5492:         142 Load 5484(t2D)
-            5493:        5466 Load 5468(s)
-            5494:         143 SampledImage 5492 5493
-            5495:154(f16vec2) Load 156(f16c2)
-            5496:6(float16_t) Load 137(f16bias)
-            5497:  7(f16vec4) ImageSampleImplicitLod 5494 5495 Bias 5496
-            5498:  7(f16vec4) Load 5462(texel)
-            5499:  7(f16vec4) FAdd 5498 5497
-                              Store 5462(texel) 5499
-            5502:         162 Load 5501(t3D)
-            5503:        5466 Load 5468(s)
-            5504:         163 SampledImage 5502 5503
-            5505:  167(fvec3) Load 169(c3)
-            5506:  7(f16vec4) ImageSampleImplicitLod 5504 5505
-            5507:  7(f16vec4) Load 5462(texel)
-            5508:  7(f16vec4) FAdd 5507 5506
-                              Store 5462(texel) 5508
-            5509:         162 Load 5501(t3D)
-            5510:        5466 Load 5468(s)
-            5511:         163 SampledImage 5509 5510
-            5512:175(f16vec3) Load 177(f16c3)
-            5513:6(float16_t) Load 137(f16bias)
-            5514:  7(f16vec4) ImageSampleImplicitLod 5511 5512 Bias 5513
-            5515:  7(f16vec4) Load 5462(texel)
-            5516:  7(f16vec4) FAdd 5515 5514
-                              Store 5462(texel) 5516
-            5519:         183 Load 5518(tCube)
-            5520:        5466 Load 5468(s)
-            5521:         184 SampledImage 5519 5520
-            5522:  167(fvec3) Load 169(c3)
-            5523:  7(f16vec4) ImageSampleImplicitLod 5521 5522
-            5524:  7(f16vec4) Load 5462(texel)
-            5525:  7(f16vec4) FAdd 5524 5523
-                              Store 5462(texel) 5525
-            5526:         183 Load 5518(tCube)
-            5527:        5466 Load 5468(s)
-            5528:         184 SampledImage 5526 5527
-            5529:175(f16vec3) Load 177(f16c3)
-            5530:6(float16_t) Load 137(f16bias)
-            5531:  7(f16vec4) ImageSampleImplicitLod 5528 5529 Bias 5530
-            5532:  7(f16vec4) Load 5462(texel)
-            5533:  7(f16vec4) FAdd 5532 5531
-                              Store 5462(texel) 5533
-            5534:         122 Load 5464(t1D)
-            5536:        5466 Load 5535(sShadow)
-            5537:         199 SampledImage 5534 5536
-            5538:  167(fvec3) Load 169(c3)
-            5539:   52(float) CompositeExtract 5538 2
-            5540:6(float16_t) ImageSampleDrefImplicitLod 5537 5538 5539
-            5541:    208(ptr) AccessChain 5462(texel) 207
-            5542:6(float16_t) Load 5541
-            5543:6(float16_t) FAdd 5542 5540
-            5544:    208(ptr) AccessChain 5462(texel) 207
-                              Store 5544 5543
-            5545:         122 Load 5464(t1D)
-            5546:        5466 Load 5535(sShadow)
-            5547:         199 SampledImage 5545 5546
-            5548:154(f16vec2) Load 156(f16c2)
-            5549:   52(float) Load 215(compare)
-            5550:6(float16_t) Load 137(f16bias)
-            5551:6(float16_t) ImageSampleDrefImplicitLod 5547 5548 5549 Bias 5550
-            5552:    208(ptr) AccessChain 5462(texel) 207
-            5553:6(float16_t) Load 5552
-            5554:6(float16_t) FAdd 5553 5551
-            5555:    208(ptr) AccessChain 5462(texel) 207
-                              Store 5555 5554
-            5556:         142 Load 5484(t2D)
-            5557:        5466 Load 5535(sShadow)
-            5558:         224 SampledImage 5556 5557
-            5559:  167(fvec3) Load 169(c3)
-            5560:   52(float) CompositeExtract 5559 2
-            5561:6(float16_t) ImageSampleDrefImplicitLod 5558 5559 5560
-            5562:    208(ptr) AccessChain 5462(texel) 207
-            5563:6(float16_t) Load 5562
-            5564:6(float16_t) FAdd 5563 5561
-            5565:    208(ptr) AccessChain 5462(texel) 207
-                              Store 5565 5564
-            5566:         142 Load 5484(t2D)
-            5567:        5466 Load 5535(sShadow)
-            5568:         224 SampledImage 5566 5567
-            5569:154(f16vec2) Load 156(f16c2)
-            5570:   52(float) Load 215(compare)
-            5571:6(float16_t) Load 137(f16bias)
-            5572:6(float16_t) ImageSampleDrefImplicitLod 5568 5569 5570 Bias 5571
-            5573:    208(ptr) AccessChain 5462(texel) 207
-            5574:6(float16_t) Load 5573
-            5575:6(float16_t) FAdd 5574 5572
-            5576:    208(ptr) AccessChain 5462(texel) 207
-                              Store 5576 5575
-            5577:         183 Load 5518(tCube)
-            5578:        5466 Load 5535(sShadow)
-            5579:         245 SampledImage 5577 5578
-            5580:  249(fvec4) Load 251(c4)
-            5581:   52(float) CompositeExtract 5580 3
-            5582:6(float16_t) ImageSampleDrefImplicitLod 5579 5580 5581
-            5583:    208(ptr) AccessChain 5462(texel) 207
-            5584:6(float16_t) Load 5583
-            5585:6(float16_t) FAdd 5584 5582
-            5586:    208(ptr) AccessChain 5462(texel) 207
-                              Store 5586 5585
-            5587:         183 Load 5518(tCube)
-            5588:        5466 Load 5535(sShadow)
-            5589:         245 SampledImage 5587 5588
-            5590:175(f16vec3) Load 177(f16c3)
-            5591:   52(float) Load 215(compare)
-            5592:6(float16_t) Load 137(f16bias)
-            5593:6(float16_t) ImageSampleDrefImplicitLod 5589 5590 5591 Bias 5592
-            5594:    208(ptr) AccessChain 5462(texel) 207
-            5595:6(float16_t) Load 5594
-            5596:6(float16_t) FAdd 5595 5593
-            5597:    208(ptr) AccessChain 5462(texel) 207
-                              Store 5597 5596
-            5600:         268 Load 5599(t1DArray)
-            5601:        5466 Load 5468(s)
-            5602:         269 SampledImage 5600 5601
-            5603:   53(fvec2) Load 148(c2)
-            5604:  7(f16vec4) ImageSampleImplicitLod 5602 5603
-            5605:  7(f16vec4) Load 5462(texel)
-            5606:  7(f16vec4) FAdd 5605 5604
-                              Store 5462(texel) 5606
-            5607:         268 Load 5599(t1DArray)
-            5608:        5466 Load 5468(s)
-            5609:         269 SampledImage 5607 5608
-            5610:154(f16vec2) Load 156(f16c2)
-            5611:6(float16_t) Load 137(f16bias)
-            5612:  7(f16vec4) ImageSampleImplicitLod 5609 5610 Bias 5611
-            5613:  7(f16vec4) Load 5462(texel)
-            5614:  7(f16vec4) FAdd 5613 5612
-                              Store 5462(texel) 5614
-            5617:         283 Load 5616(t2DArray)
-            5618:        5466 Load 5468(s)
-            5619:         284 SampledImage 5617 5618
-            5620:  167(fvec3) Load 169(c3)
-            5621:  7(f16vec4) ImageSampleImplicitLod 5619 5620
-            5622:  7(f16vec4) Load 5462(texel)
-            5623:  7(f16vec4) FAdd 5622 5621
-                              Store 5462(texel) 5623
-            5624:         283 Load 5616(t2DArray)
-            5625:        5466 Load 5468(s)
-            5626:         284 SampledImage 5624 5625
-            5627:175(f16vec3) Load 177(f16c3)
-            5628:6(float16_t) Load 137(f16bias)
-            5629:  7(f16vec4) ImageSampleImplicitLod 5626 5627 Bias 5628
-            5630:  7(f16vec4) Load 5462(texel)
-            5631:  7(f16vec4) FAdd 5630 5629
-                              Store 5462(texel) 5631
-            5634:         298 Load 5633(tCubeArray)
-            5635:        5466 Load 5468(s)
-            5636:         299 SampledImage 5634 5635
-            5637:  249(fvec4) Load 251(c4)
-            5638:  7(f16vec4) ImageSampleImplicitLod 5636 5637
-            5639:  7(f16vec4) Load 5462(texel)
-            5640:  7(f16vec4) FAdd 5639 5638
-                              Store 5462(texel) 5640
-            5641:         298 Load 5633(tCubeArray)
-            5642:        5466 Load 5468(s)
-            5643:         299 SampledImage 5641 5642
-            5644:  7(f16vec4) Load 309(f16c4)
-            5645:6(float16_t) Load 137(f16bias)
-            5646:  7(f16vec4) ImageSampleImplicitLod 5643 5644 Bias 5645
-            5647:  7(f16vec4) Load 5462(texel)
-            5648:  7(f16vec4) FAdd 5647 5646
-                              Store 5462(texel) 5648
-            5649:         268 Load 5599(t1DArray)
-            5650:        5466 Load 5535(sShadow)
-            5651:         316 SampledImage 5649 5650
-            5652:  167(fvec3) Load 169(c3)
-            5653:   52(float) CompositeExtract 5652 2
-            5654:6(float16_t) ImageSampleDrefImplicitLod 5651 5652 5653
-            5655:    208(ptr) AccessChain 5462(texel) 207
-            5656:6(float16_t) Load 5655
-            5657:6(float16_t) FAdd 5656 5654
-            5658:    208(ptr) AccessChain 5462(texel) 207
-                              Store 5658 5657
-            5659:         268 Load 5599(t1DArray)
-            5660:        5466 Load 5535(sShadow)
-            5661:         316 SampledImage 5659 5660
-            5662:154(f16vec2) Load 156(f16c2)
-            5663:   52(float) Load 215(compare)
-            5664:6(float16_t) Load 137(f16bias)
-            5665:6(float16_t) ImageSampleDrefImplicitLod 5661 5662 5663 Bias 5664
-            5666:    208(ptr) AccessChain 5462(texel) 207
-            5667:6(float16_t) Load 5666
-            5668:6(float16_t) FAdd 5667 5665
-            5669:    208(ptr) AccessChain 5462(texel) 207
-                              Store 5669 5668
-            5670:         283 Load 5616(t2DArray)
-            5671:        5466 Load 5535(sShadow)
-            5672:         337 SampledImage 5670 5671
-            5673:  249(fvec4) Load 251(c4)
-            5674:   52(float) CompositeExtract 5673 3
-            5675:6(float16_t) ImageSampleDrefImplicitLod 5672 5673 5674
-            5676:    208(ptr) AccessChain 5462(texel) 207
-            5677:6(float16_t) Load 5676
-            5678:6(float16_t) FAdd 5677 5675
-            5679:    208(ptr) AccessChain 5462(texel) 207
-                              Store 5679 5678
-            5680:         283 Load 5616(t2DArray)
-            5681:        5466 Load 5535(sShadow)
-            5682:         337 SampledImage 5680 5681
-            5683:175(f16vec3) Load 177(f16c3)
-            5684:   52(float) Load 215(compare)
-            5685:6(float16_t) ImageSampleDrefImplicitLod 5682 5683 5684
-            5686:    208(ptr) AccessChain 5462(texel) 207
-            5687:6(float16_t) Load 5686
-            5688:6(float16_t) FAdd 5687 5685
-            5689:    208(ptr) AccessChain 5462(texel) 207
-                              Store 5689 5688
-            5692:         356 Load 5691(t2DRect)
-            5693:        5466 Load 5468(s)
-            5694:         357 SampledImage 5692 5693
-            5695:   53(fvec2) Load 148(c2)
-            5696:  7(f16vec4) ImageSampleImplicitLod 5694 5695
-            5697:  7(f16vec4) Load 5462(texel)
-            5698:  7(f16vec4) FAdd 5697 5696
-                              Store 5462(texel) 5698
-            5699:         356 Load 5691(t2DRect)
-            5700:        5466 Load 5468(s)
-            5701:         357 SampledImage 5699 5700
-            5702:154(f16vec2) Load 156(f16c2)
-            5703:  7(f16vec4) ImageSampleImplicitLod 5701 5702
-            5704:  7(f16vec4) Load 5462(texel)
-            5705:  7(f16vec4) FAdd 5704 5703
-                              Store 5462(texel) 5705
-            5706:         356 Load 5691(t2DRect)
-            5707:        5466 Load 5535(sShadow)
-            5708:         371 SampledImage 5706 5707
-            5709:  167(fvec3) Load 169(c3)
-            5710:   52(float) CompositeExtract 5709 2
-            5711:6(float16_t) ImageSampleDrefImplicitLod 5708 5709 5710
-            5712:    208(ptr) AccessChain 5462(texel) 207
-            5713:6(float16_t) Load 5712
-            5714:6(float16_t) FAdd 5713 5711
-            5715:    208(ptr) AccessChain 5462(texel) 207
-                              Store 5715 5714
-            5716:         356 Load 5691(t2DRect)
-            5717:        5466 Load 5535(sShadow)
-            5718:         371 SampledImage 5716 5717
-            5719:154(f16vec2) Load 156(f16c2)
-            5720:   52(float) Load 215(compare)
-            5721:6(float16_t) ImageSampleDrefImplicitLod 5718 5719 5720
-            5722:    208(ptr) AccessChain 5462(texel) 207
-            5723:6(float16_t) Load 5722
-            5724:6(float16_t) FAdd 5723 5721
-            5725:    208(ptr) AccessChain 5462(texel) 207
-                              Store 5725 5724
-            5726:         298 Load 5633(tCubeArray)
-            5727:        5466 Load 5535(sShadow)
-            5728:         391 SampledImage 5726 5727
-            5729:  249(fvec4) Load 251(c4)
-            5730:   52(float) Load 215(compare)
-            5731:6(float16_t) ImageSampleDrefImplicitLod 5728 5729 5730
-            5732:    208(ptr) AccessChain 5462(texel) 207
-            5733:6(float16_t) Load 5732
-            5734:6(float16_t) FAdd 5733 5731
-            5735:    208(ptr) AccessChain 5462(texel) 207
-                              Store 5735 5734
-            5736:         298 Load 5633(tCubeArray)
-            5737:        5466 Load 5535(sShadow)
-            5738:         391 SampledImage 5736 5737
-            5739:  7(f16vec4) Load 309(f16c4)
-            5740:   52(float) Load 215(compare)
-            5741:6(float16_t) ImageSampleDrefImplicitLod 5738 5739 5740
-            5742:    208(ptr) AccessChain 5462(texel) 207
-            5743:6(float16_t) Load 5742
-            5744:6(float16_t) FAdd 5743 5741
-            5745:    208(ptr) AccessChain 5462(texel) 207
-                              Store 5745 5744
-            5746:  7(f16vec4) Load 5462(texel)
-                              ReturnValue 5746
+     5506(texel):     64(ptr) Variable Function
+                              Store 5506(texel) 121
+            5509:         122 Load 5508(t1D)
+            5513:        5510 Load 5512(s)
+            5514:         123 SampledImage 5509 5513
+            5515:   52(float) Load 128(c1)
+            5516:  7(f16vec4) ImageSampleImplicitLod 5514 5515
+            5517:  7(f16vec4) Load 5506(texel)
+            5518:  7(f16vec4) FAdd 5517 5516
+                              Store 5506(texel) 5518
+            5519:         122 Load 5508(t1D)
+            5520:        5510 Load 5512(s)
+            5521:         123 SampledImage 5519 5520
+            5522:6(float16_t) Load 135(f16c1)
+            5523:6(float16_t) Load 137(f16bias)
+            5524:  7(f16vec4) ImageSampleImplicitLod 5521 5522 Bias 5523
+            5525:  7(f16vec4) Load 5506(texel)
+            5526:  7(f16vec4) FAdd 5525 5524
+                              Store 5506(texel) 5526
+            5529:         142 Load 5528(t2D)
+            5530:        5510 Load 5512(s)
+            5531:         143 SampledImage 5529 5530
+            5532:   53(fvec2) Load 148(c2)
+            5533:  7(f16vec4) ImageSampleImplicitLod 5531 5532
+            5534:  7(f16vec4) Load 5506(texel)
+            5535:  7(f16vec4) FAdd 5534 5533
+                              Store 5506(texel) 5535
+            5536:         142 Load 5528(t2D)
+            5537:        5510 Load 5512(s)
+            5538:         143 SampledImage 5536 5537
+            5539:154(f16vec2) Load 156(f16c2)
+            5540:6(float16_t) Load 137(f16bias)
+            5541:  7(f16vec4) ImageSampleImplicitLod 5538 5539 Bias 5540
+            5542:  7(f16vec4) Load 5506(texel)
+            5543:  7(f16vec4) FAdd 5542 5541
+                              Store 5506(texel) 5543
+            5546:         162 Load 5545(t3D)
+            5547:        5510 Load 5512(s)
+            5548:         163 SampledImage 5546 5547
+            5549:  167(fvec3) Load 169(c3)
+            5550:  7(f16vec4) ImageSampleImplicitLod 5548 5549
+            5551:  7(f16vec4) Load 5506(texel)
+            5552:  7(f16vec4) FAdd 5551 5550
+                              Store 5506(texel) 5552
+            5553:         162 Load 5545(t3D)
+            5554:        5510 Load 5512(s)
+            5555:         163 SampledImage 5553 5554
+            5556:175(f16vec3) Load 177(f16c3)
+            5557:6(float16_t) Load 137(f16bias)
+            5558:  7(f16vec4) ImageSampleImplicitLod 5555 5556 Bias 5557
+            5559:  7(f16vec4) Load 5506(texel)
+            5560:  7(f16vec4) FAdd 5559 5558
+                              Store 5506(texel) 5560
+            5563:         183 Load 5562(tCube)
+            5564:        5510 Load 5512(s)
+            5565:         184 SampledImage 5563 5564
+            5566:  167(fvec3) Load 169(c3)
+            5567:  7(f16vec4) ImageSampleImplicitLod 5565 5566
+            5568:  7(f16vec4) Load 5506(texel)
+            5569:  7(f16vec4) FAdd 5568 5567
+                              Store 5506(texel) 5569
+            5570:         183 Load 5562(tCube)
+            5571:        5510 Load 5512(s)
+            5572:         184 SampledImage 5570 5571
+            5573:175(f16vec3) Load 177(f16c3)
+            5574:6(float16_t) Load 137(f16bias)
+            5575:  7(f16vec4) ImageSampleImplicitLod 5572 5573 Bias 5574
+            5576:  7(f16vec4) Load 5506(texel)
+            5577:  7(f16vec4) FAdd 5576 5575
+                              Store 5506(texel) 5577
+            5578:         122 Load 5508(t1D)
+            5580:        5510 Load 5579(sShadow)
+            5581:         199 SampledImage 5578 5580
+            5582:  167(fvec3) Load 169(c3)
+            5583:   52(float) CompositeExtract 5582 2
+            5584:6(float16_t) ImageSampleDrefImplicitLod 5581 5582 5583
+            5585:    208(ptr) AccessChain 5506(texel) 207
+            5586:6(float16_t) Load 5585
+            5587:6(float16_t) FAdd 5586 5584
+            5588:    208(ptr) AccessChain 5506(texel) 207
+                              Store 5588 5587
+            5589:         122 Load 5508(t1D)
+            5590:        5510 Load 5579(sShadow)
+            5591:         199 SampledImage 5589 5590
+            5592:154(f16vec2) Load 156(f16c2)
+            5593:   52(float) Load 215(compare)
+            5594:6(float16_t) Load 137(f16bias)
+            5595:6(float16_t) ImageSampleDrefImplicitLod 5591 5592 5593 Bias 5594
+            5596:    208(ptr) AccessChain 5506(texel) 207
+            5597:6(float16_t) Load 5596
+            5598:6(float16_t) FAdd 5597 5595
+            5599:    208(ptr) AccessChain 5506(texel) 207
+                              Store 5599 5598
+            5600:         142 Load 5528(t2D)
+            5601:        5510 Load 5579(sShadow)
+            5602:         224 SampledImage 5600 5601
+            5603:  167(fvec3) Load 169(c3)
+            5604:   52(float) CompositeExtract 5603 2
+            5605:6(float16_t) ImageSampleDrefImplicitLod 5602 5603 5604
+            5606:    208(ptr) AccessChain 5506(texel) 207
+            5607:6(float16_t) Load 5606
+            5608:6(float16_t) FAdd 5607 5605
+            5609:    208(ptr) AccessChain 5506(texel) 207
+                              Store 5609 5608
+            5610:         142 Load 5528(t2D)
+            5611:        5510 Load 5579(sShadow)
+            5612:         224 SampledImage 5610 5611
+            5613:154(f16vec2) Load 156(f16c2)
+            5614:   52(float) Load 215(compare)
+            5615:6(float16_t) Load 137(f16bias)
+            5616:6(float16_t) ImageSampleDrefImplicitLod 5612 5613 5614 Bias 5615
+            5617:    208(ptr) AccessChain 5506(texel) 207
+            5618:6(float16_t) Load 5617
+            5619:6(float16_t) FAdd 5618 5616
+            5620:    208(ptr) AccessChain 5506(texel) 207
+                              Store 5620 5619
+            5621:         183 Load 5562(tCube)
+            5622:        5510 Load 5579(sShadow)
+            5623:         245 SampledImage 5621 5622
+            5624:  249(fvec4) Load 251(c4)
+            5625:   52(float) CompositeExtract 5624 3
+            5626:6(float16_t) ImageSampleDrefImplicitLod 5623 5624 5625
+            5627:    208(ptr) AccessChain 5506(texel) 207
+            5628:6(float16_t) Load 5627
+            5629:6(float16_t) FAdd 5628 5626
+            5630:    208(ptr) AccessChain 5506(texel) 207
+                              Store 5630 5629
+            5631:         183 Load 5562(tCube)
+            5632:        5510 Load 5579(sShadow)
+            5633:         245 SampledImage 5631 5632
+            5634:175(f16vec3) Load 177(f16c3)
+            5635:   52(float) Load 215(compare)
+            5636:6(float16_t) Load 137(f16bias)
+            5637:6(float16_t) ImageSampleDrefImplicitLod 5633 5634 5635 Bias 5636
+            5638:    208(ptr) AccessChain 5506(texel) 207
+            5639:6(float16_t) Load 5638
+            5640:6(float16_t) FAdd 5639 5637
+            5641:    208(ptr) AccessChain 5506(texel) 207
+                              Store 5641 5640
+            5644:         268 Load 5643(t1DArray)
+            5645:        5510 Load 5512(s)
+            5646:         269 SampledImage 5644 5645
+            5647:   53(fvec2) Load 148(c2)
+            5648:  7(f16vec4) ImageSampleImplicitLod 5646 5647
+            5649:  7(f16vec4) Load 5506(texel)
+            5650:  7(f16vec4) FAdd 5649 5648
+                              Store 5506(texel) 5650
+            5651:         268 Load 5643(t1DArray)
+            5652:        5510 Load 5512(s)
+            5653:         269 SampledImage 5651 5652
+            5654:154(f16vec2) Load 156(f16c2)
+            5655:6(float16_t) Load 137(f16bias)
+            5656:  7(f16vec4) ImageSampleImplicitLod 5653 5654 Bias 5655
+            5657:  7(f16vec4) Load 5506(texel)
+            5658:  7(f16vec4) FAdd 5657 5656
+                              Store 5506(texel) 5658
+            5661:         283 Load 5660(t2DArray)
+            5662:        5510 Load 5512(s)
+            5663:         284 SampledImage 5661 5662
+            5664:  167(fvec3) Load 169(c3)
+            5665:  7(f16vec4) ImageSampleImplicitLod 5663 5664
+            5666:  7(f16vec4) Load 5506(texel)
+            5667:  7(f16vec4) FAdd 5666 5665
+                              Store 5506(texel) 5667
+            5668:         283 Load 5660(t2DArray)
+            5669:        5510 Load 5512(s)
+            5670:         284 SampledImage 5668 5669
+            5671:175(f16vec3) Load 177(f16c3)
+            5672:6(float16_t) Load 137(f16bias)
+            5673:  7(f16vec4) ImageSampleImplicitLod 5670 5671 Bias 5672
+            5674:  7(f16vec4) Load 5506(texel)
+            5675:  7(f16vec4) FAdd 5674 5673
+                              Store 5506(texel) 5675
+            5678:         298 Load 5677(tCubeArray)
+            5679:        5510 Load 5512(s)
+            5680:         299 SampledImage 5678 5679
+            5681:  249(fvec4) Load 251(c4)
+            5682:  7(f16vec4) ImageSampleImplicitLod 5680 5681
+            5683:  7(f16vec4) Load 5506(texel)
+            5684:  7(f16vec4) FAdd 5683 5682
+                              Store 5506(texel) 5684
+            5685:         298 Load 5677(tCubeArray)
+            5686:        5510 Load 5512(s)
+            5687:         299 SampledImage 5685 5686
+            5688:  7(f16vec4) Load 309(f16c4)
+            5689:6(float16_t) Load 137(f16bias)
+            5690:  7(f16vec4) ImageSampleImplicitLod 5687 5688 Bias 5689
+            5691:  7(f16vec4) Load 5506(texel)
+            5692:  7(f16vec4) FAdd 5691 5690
+                              Store 5506(texel) 5692
+            5693:         268 Load 5643(t1DArray)
+            5694:        5510 Load 5579(sShadow)
+            5695:         316 SampledImage 5693 5694
+            5696:  167(fvec3) Load 169(c3)
+            5697:   52(float) CompositeExtract 5696 2
+            5698:6(float16_t) ImageSampleDrefImplicitLod 5695 5696 5697
+            5699:    208(ptr) AccessChain 5506(texel) 207
+            5700:6(float16_t) Load 5699
+            5701:6(float16_t) FAdd 5700 5698
+            5702:    208(ptr) AccessChain 5506(texel) 207
+                              Store 5702 5701
+            5703:         268 Load 5643(t1DArray)
+            5704:        5510 Load 5579(sShadow)
+            5705:         316 SampledImage 5703 5704
+            5706:154(f16vec2) Load 156(f16c2)
+            5707:   52(float) Load 215(compare)
+            5708:6(float16_t) Load 137(f16bias)
+            5709:6(float16_t) ImageSampleDrefImplicitLod 5705 5706 5707 Bias 5708
+            5710:    208(ptr) AccessChain 5506(texel) 207
+            5711:6(float16_t) Load 5710
+            5712:6(float16_t) FAdd 5711 5709
+            5713:    208(ptr) AccessChain 5506(texel) 207
+                              Store 5713 5712
+            5714:         283 Load 5660(t2DArray)
+            5715:        5510 Load 5579(sShadow)
+            5716:         337 SampledImage 5714 5715
+            5717:  249(fvec4) Load 251(c4)
+            5718:   52(float) CompositeExtract 5717 3
+            5719:6(float16_t) ImageSampleDrefImplicitLod 5716 5717 5718
+            5720:    208(ptr) AccessChain 5506(texel) 207
+            5721:6(float16_t) Load 5720
+            5722:6(float16_t) FAdd 5721 5719
+            5723:    208(ptr) AccessChain 5506(texel) 207
+                              Store 5723 5722
+            5724:         283 Load 5660(t2DArray)
+            5725:        5510 Load 5579(sShadow)
+            5726:         337 SampledImage 5724 5725
+            5727:175(f16vec3) Load 177(f16c3)
+            5728:   52(float) Load 215(compare)
+            5729:6(float16_t) ImageSampleDrefImplicitLod 5726 5727 5728
+            5730:    208(ptr) AccessChain 5506(texel) 207
+            5731:6(float16_t) Load 5730
+            5732:6(float16_t) FAdd 5731 5729
+            5733:    208(ptr) AccessChain 5506(texel) 207
+                              Store 5733 5732
+            5736:         356 Load 5735(t2DRect)
+            5737:        5510 Load 5512(s)
+            5738:         357 SampledImage 5736 5737
+            5739:   53(fvec2) Load 148(c2)
+            5740:  7(f16vec4) ImageSampleImplicitLod 5738 5739
+            5741:  7(f16vec4) Load 5506(texel)
+            5742:  7(f16vec4) FAdd 5741 5740
+                              Store 5506(texel) 5742
+            5743:         356 Load 5735(t2DRect)
+            5744:        5510 Load 5512(s)
+            5745:         357 SampledImage 5743 5744
+            5746:154(f16vec2) Load 156(f16c2)
+            5747:  7(f16vec4) ImageSampleImplicitLod 5745 5746
+            5748:  7(f16vec4) Load 5506(texel)
+            5749:  7(f16vec4) FAdd 5748 5747
+                              Store 5506(texel) 5749
+            5750:         356 Load 5735(t2DRect)
+            5751:        5510 Load 5579(sShadow)
+            5752:         371 SampledImage 5750 5751
+            5753:  167(fvec3) Load 169(c3)
+            5754:   52(float) CompositeExtract 5753 2
+            5755:6(float16_t) ImageSampleDrefImplicitLod 5752 5753 5754
+            5756:    208(ptr) AccessChain 5506(texel) 207
+            5757:6(float16_t) Load 5756
+            5758:6(float16_t) FAdd 5757 5755
+            5759:    208(ptr) AccessChain 5506(texel) 207
+                              Store 5759 5758
+            5760:         356 Load 5735(t2DRect)
+            5761:        5510 Load 5579(sShadow)
+            5762:         371 SampledImage 5760 5761
+            5763:154(f16vec2) Load 156(f16c2)
+            5764:   52(float) Load 215(compare)
+            5765:6(float16_t) ImageSampleDrefImplicitLod 5762 5763 5764
+            5766:    208(ptr) AccessChain 5506(texel) 207
+            5767:6(float16_t) Load 5766
+            5768:6(float16_t) FAdd 5767 5765
+            5769:    208(ptr) AccessChain 5506(texel) 207
+                              Store 5769 5768
+            5770:         298 Load 5677(tCubeArray)
+            5771:        5510 Load 5579(sShadow)
+            5772:         391 SampledImage 5770 5771
+            5773:  249(fvec4) Load 251(c4)
+            5774:   52(float) Load 215(compare)
+            5775:6(float16_t) ImageSampleDrefImplicitLod 5772 5773 5774
+            5776:    208(ptr) AccessChain 5506(texel) 207
+            5777:6(float16_t) Load 5776
+            5778:6(float16_t) FAdd 5777 5775
+            5779:    208(ptr) AccessChain 5506(texel) 207
+                              Store 5779 5778
+            5780:         298 Load 5677(tCubeArray)
+            5781:        5510 Load 5579(sShadow)
+            5782:         391 SampledImage 5780 5781
+            5783:  7(f16vec4) Load 309(f16c4)
+            5784:   52(float) Load 215(compare)
+            5785:6(float16_t) ImageSampleDrefImplicitLod 5782 5783 5784
+            5786:    208(ptr) AccessChain 5506(texel) 207
+            5787:6(float16_t) Load 5786
+            5788:6(float16_t) FAdd 5787 5785
+            5789:    208(ptr) AccessChain 5506(texel) 207
+                              Store 5789 5788
+            5790:  7(f16vec4) Load 5506(texel)
+                              ReturnValue 5790
                               FunctionEnd
 117(testSubpassLoad():  7(f16vec4) Function None 8
              118:             Label
-            5752:        5749 Load 5751(subpass)
-            5754:  7(f16vec4) ImageRead 5752 5753
-            5758:        5755 Load 5757(subpassMS)
-            5759:  7(f16vec4) ImageRead 5758 5753 Sample 1326
-            5760:  7(f16vec4) FAdd 5754 5759
-                              ReturnValue 5760
+            5796:        5793 Load 5795(subpass)
+            5798:  7(f16vec4) ImageRead 5796 5797
+            5802:        5799 Load 5801(subpassMS)
+            5803:  7(f16vec4) ImageRead 5802 5797 Sample 1326
+            5804:  7(f16vec4) FAdd 5798 5803
+                              ReturnValue 5804
                               FunctionEnd
diff --git a/third_party/vulkan-deps/glslang/src/Test/baseResults/spv.float32.frag.out b/third_party/vulkan-deps/glslang/src/Test/baseResults/spv.float32.frag.out
index df73497..2ffa231 100644
--- a/third_party/vulkan-deps/glslang/src/Test/baseResults/spv.float32.frag.out
+++ b/third_party/vulkan-deps/glslang/src/Test/baseResults/spv.float32.frag.out
@@ -1,7 +1,7 @@
 spv.float32.frag
 // Module Version 10300
 // Generated by (magic number): 8000a
-// Id's are bound by 533
+// Id's are bound by 541
 
                               Capability Shader
                               Capability Float16
@@ -83,52 +83,52 @@
                               Name 451  "f32v2"
                               Name 469  "f32v"
                               Name 471  "if32v"
-                              Name 520  "S"
-                              MemberName 520(S) 0  "x"
-                              MemberName 520(S) 1  "y"
-                              MemberName 520(S) 2  "z"
-                              Name 522  "B1"
-                              MemberName 522(B1) 0  "a"
-                              MemberName 522(B1) 1  "b"
-                              MemberName 522(B1) 2  "c"
-                              MemberName 522(B1) 3  "d"
-                              MemberName 522(B1) 4  "e"
-                              MemberName 522(B1) 5  "f"
-                              MemberName 522(B1) 6  "g"
-                              MemberName 522(B1) 7  "h"
-                              Name 524  ""
-                              Name 525  "sf16"
-                              Name 526  "sf"
-                              Name 527  "sd"
-                              Name 528  "f16_to_f"
-                              Name 530  "f16_to_d"
-                              Name 531  "f_to_f16"
-                              Name 532  "d_to_f16"
+                              Name 528  "S"
+                              MemberName 528(S) 0  "x"
+                              MemberName 528(S) 1  "y"
+                              MemberName 528(S) 2  "z"
+                              Name 530  "B1"
+                              MemberName 530(B1) 0  "a"
+                              MemberName 530(B1) 1  "b"
+                              MemberName 530(B1) 2  "c"
+                              MemberName 530(B1) 3  "d"
+                              MemberName 530(B1) 4  "e"
+                              MemberName 530(B1) 5  "f"
+                              MemberName 530(B1) 6  "g"
+                              MemberName 530(B1) 7  "h"
+                              Name 532  ""
+                              Name 533  "sf16"
+                              Name 534  "sf"
+                              Name 535  "sd"
+                              Name 536  "f16_to_f"
+                              Name 538  "f16_to_d"
+                              Name 539  "f_to_f16"
+                              Name 540  "d_to_f16"
                               Decorate 471(if32v) Location 0
-                              Decorate 518 ArrayStride 16
-                              Decorate 519 ArrayStride 32
-                              MemberDecorate 520(S) 0 Offset 0
-                              MemberDecorate 520(S) 1 Offset 8
-                              MemberDecorate 520(S) 2 Offset 16
-                              Decorate 521 ArrayStride 32
-                              MemberDecorate 522(B1) 0 Offset 0
-                              MemberDecorate 522(B1) 1 Offset 8
-                              MemberDecorate 522(B1) 2 Offset 16
-                              MemberDecorate 522(B1) 3 Offset 32
-                              MemberDecorate 522(B1) 4 ColMajor
-                              MemberDecorate 522(B1) 4 Offset 64
-                              MemberDecorate 522(B1) 4 MatrixStride 16
-                              MemberDecorate 522(B1) 5 ColMajor
-                              MemberDecorate 522(B1) 5 Offset 96
-                              MemberDecorate 522(B1) 5 MatrixStride 16
-                              MemberDecorate 522(B1) 6 Offset 160
-                              MemberDecorate 522(B1) 7 Offset 192
-                              Decorate 522(B1) Block
-                              Decorate 524 DescriptorSet 0
-                              Decorate 524 Binding 0
-                              Decorate 525(sf16) SpecId 100
-                              Decorate 526(sf) SpecId 101
-                              Decorate 527(sd) SpecId 102
+                              Decorate 526 ArrayStride 16
+                              Decorate 527 ArrayStride 32
+                              MemberDecorate 528(S) 0 Offset 0
+                              MemberDecorate 528(S) 1 Offset 8
+                              MemberDecorate 528(S) 2 Offset 16
+                              Decorate 529 ArrayStride 32
+                              MemberDecorate 530(B1) 0 Offset 0
+                              MemberDecorate 530(B1) 1 Offset 8
+                              MemberDecorate 530(B1) 2 Offset 16
+                              MemberDecorate 530(B1) 3 Offset 32
+                              MemberDecorate 530(B1) 4 ColMajor
+                              MemberDecorate 530(B1) 4 Offset 64
+                              MemberDecorate 530(B1) 4 MatrixStride 16
+                              MemberDecorate 530(B1) 5 ColMajor
+                              MemberDecorate 530(B1) 5 Offset 96
+                              MemberDecorate 530(B1) 5 MatrixStride 16
+                              MemberDecorate 530(B1) 6 Offset 160
+                              MemberDecorate 530(B1) 7 Offset 192
+                              Decorate 530(B1) Block
+                              Decorate 532 DescriptorSet 0
+                              Decorate 532 Binding 0
+                              Decorate 533(sf16) SpecId 100
+                              Decorate 534(sf) SpecId 101
+                              Decorate 535(sd) SpecId 102
                2:             TypeVoid
                3:             TypeFunction 2
               26:             TypeFloat 32
@@ -197,25 +197,25 @@
              470:             TypePointer Input 153(fvec3)
       471(if32v):    470(ptr) Variable Input
              472:             TypePointer Input 26(float)
-             509:    192(int) Constant 1
-             514:   26(float) Constant 1056964608
-             515:   27(fvec2) ConstantComposite 514 514
-             517:     31(int) Constant 2
-             518:             TypeArray 26(float) 517
-             519:             TypeArray 412 517
-          520(S):             TypeStruct 26(float) 27(fvec2) 153(fvec3)
-             521:             TypeArray 520(S) 517
-         522(B1):             TypeStruct 26(float) 27(fvec2) 153(fvec3) 518 412 519 520(S) 521
-             523:             TypePointer Uniform 522(B1)
-             524:    523(ptr) Variable Uniform
-       525(sf16):172(float16_t) SpecConstant 12288
-         526(sf):   26(float) SpecConstant 1048576000
-         527(sd):149(float64_t) SpecConstant 0 1071644672
-   528(f16_to_f):   26(float) SpecConstantOp 115 525(sf16)
-             529:   26(float) SpecConstantOp 115 525(sf16)
-   530(f16_to_d):149(float64_t) SpecConstantOp 115 529
-   531(f_to_f16):172(float16_t) SpecConstantOp 115 526(sf)
-   532(d_to_f16):172(float16_t) SpecConstantOp 115 527(sd)
+             515:    192(int) Constant 1
+             522:   26(float) Constant 1056964608
+             523:   27(fvec2) ConstantComposite 522 522
+             525:     31(int) Constant 2
+             526:             TypeArray 26(float) 525
+             527:             TypeArray 412 525
+          528(S):             TypeStruct 26(float) 27(fvec2) 153(fvec3)
+             529:             TypeArray 528(S) 525
+         530(B1):             TypeStruct 26(float) 27(fvec2) 153(fvec3) 526 412 527 528(S) 529
+             531:             TypePointer Uniform 530(B1)
+             532:    531(ptr) Variable Uniform
+       533(sf16):172(float16_t) SpecConstant 12288
+         534(sf):   26(float) SpecConstant 1048576000
+         535(sd):149(float64_t) SpecConstant 0 1071644672
+   536(f16_to_f):   26(float) SpecConstantOp 115 533(sf16)
+             537:   26(float) SpecConstantOp 115 533(sf16)
+   538(f16_to_d):149(float64_t) SpecConstantOp 115 537
+   539(f_to_f16):172(float16_t) SpecConstantOp 115 534(sf)
+   540(d_to_f16):172(float16_t) SpecConstantOp 115 535(sd)
          4(main):           2 Function None 3
                5:             Label
                               Return
@@ -765,45 +765,57 @@
              481:  153(fvec3) Load 471(if32v)
              482:   27(fvec2) VectorShuffle 481 481 0 1
              483:   27(fvec2) DPdxFine 482
-             484:  153(fvec3) Load 469(f32v)
-             485:  153(fvec3) VectorShuffle 484 483 3 4 2
-                              Store 469(f32v) 485
-             486:  153(fvec3) Load 471(if32v)
-             487:   27(fvec2) VectorShuffle 486 486 0 1
-             488:   27(fvec2) DPdyFine 487
-             489:  153(fvec3) Load 469(f32v)
-             490:  153(fvec3) VectorShuffle 489 488 3 4 2
-                              Store 469(f32v) 490
-             491:  153(fvec3) Load 471(if32v)
-             492:  153(fvec3) DPdxCoarse 491
-                              Store 469(f32v) 492
-             493:  153(fvec3) Load 471(if32v)
-             494:  153(fvec3) DPdxCoarse 493
-                              Store 469(f32v) 494
-             495:    472(ptr) AccessChain 471(if32v) 32
-             496:   26(float) Load 495
-             497:   26(float) Fwidth 496
-             498:     33(ptr) AccessChain 469(f32v) 32
-                              Store 498 497
-             499:  153(fvec3) Load 471(if32v)
-             500:   27(fvec2) VectorShuffle 499 499 0 1
-             501:   27(fvec2) FwidthFine 500
-             502:  153(fvec3) Load 469(f32v)
-             503:  153(fvec3) VectorShuffle 502 501 3 4 2
-                              Store 469(f32v) 503
-             504:  153(fvec3) Load 471(if32v)
-             505:  153(fvec3) FwidthCoarse 504
-                              Store 469(f32v) 505
-             506:    472(ptr) AccessChain 471(if32v) 32
-             507:   26(float) ExtInst 1(GLSL.std.450) 76(InterpolateAtCentroid) 506
-             508:     33(ptr) AccessChain 469(f32v) 32
-                              Store 508 507
-             510:  153(fvec3) ExtInst 1(GLSL.std.450) 77(InterpolateAtSample) 471(if32v) 509
-             511:   27(fvec2) VectorShuffle 510 510 0 1
-             512:  153(fvec3) Load 469(f32v)
-             513:  153(fvec3) VectorShuffle 512 511 3 4 2
-                              Store 469(f32v) 513
-             516:  153(fvec3) ExtInst 1(GLSL.std.450) 78(InterpolateAtOffset) 471(if32v) 515
-                              Store 469(f32v) 516
+             484:     33(ptr) AccessChain 469(f32v) 32
+             485:   26(float) CompositeExtract 483 0
+                              Store 484 485
+             486:     33(ptr) AccessChain 469(f32v) 88
+             487:   26(float) CompositeExtract 483 1
+                              Store 486 487
+             488:  153(fvec3) Load 471(if32v)
+             489:   27(fvec2) VectorShuffle 488 488 0 1
+             490:   27(fvec2) DPdyFine 489
+             491:     33(ptr) AccessChain 469(f32v) 32
+             492:   26(float) CompositeExtract 490 0
+                              Store 491 492
+             493:     33(ptr) AccessChain 469(f32v) 88
+             494:   26(float) CompositeExtract 490 1
+                              Store 493 494
+             495:  153(fvec3) Load 471(if32v)
+             496:  153(fvec3) DPdxCoarse 495
+                              Store 469(f32v) 496
+             497:  153(fvec3) Load 471(if32v)
+             498:  153(fvec3) DPdxCoarse 497
+                              Store 469(f32v) 498
+             499:    472(ptr) AccessChain 471(if32v) 32
+             500:   26(float) Load 499
+             501:   26(float) Fwidth 500
+             502:     33(ptr) AccessChain 469(f32v) 32
+                              Store 502 501
+             503:  153(fvec3) Load 471(if32v)
+             504:   27(fvec2) VectorShuffle 503 503 0 1
+             505:   27(fvec2) FwidthFine 504
+             506:     33(ptr) AccessChain 469(f32v) 32
+             507:   26(float) CompositeExtract 505 0
+                              Store 506 507
+             508:     33(ptr) AccessChain 469(f32v) 88
+             509:   26(float) CompositeExtract 505 1
+                              Store 508 509
+             510:  153(fvec3) Load 471(if32v)
+             511:  153(fvec3) FwidthCoarse 510
+                              Store 469(f32v) 511
+             512:    472(ptr) AccessChain 471(if32v) 32
+             513:   26(float) ExtInst 1(GLSL.std.450) 76(InterpolateAtCentroid) 512
+             514:     33(ptr) AccessChain 469(f32v) 32
+                              Store 514 513
+             516:  153(fvec3) ExtInst 1(GLSL.std.450) 77(InterpolateAtSample) 471(if32v) 515
+             517:   27(fvec2) VectorShuffle 516 516 0 1
+             518:     33(ptr) AccessChain 469(f32v) 32
+             519:   26(float) CompositeExtract 517 0
+                              Store 518 519
+             520:     33(ptr) AccessChain 469(f32v) 88
+             521:   26(float) CompositeExtract 517 1
+                              Store 520 521
+             524:  153(fvec3) ExtInst 1(GLSL.std.450) 78(InterpolateAtOffset) 471(if32v) 523
+                              Store 469(f32v) 524
                               Return
                               FunctionEnd
diff --git a/third_party/vulkan-deps/glslang/src/Test/baseResults/spv.float64.frag.out b/third_party/vulkan-deps/glslang/src/Test/baseResults/spv.float64.frag.out
index 8a69367..dfcfc2d 100644
--- a/third_party/vulkan-deps/glslang/src/Test/baseResults/spv.float64.frag.out
+++ b/third_party/vulkan-deps/glslang/src/Test/baseResults/spv.float64.frag.out
@@ -2,7 +2,7 @@
 Validation failed
 // Module Version 10300
 // Generated by (magic number): 8000a
-// Id's are bound by 524
+// Id's are bound by 532
 
                               Capability Shader
                               Capability Float16
@@ -83,53 +83,53 @@
                               Name 441  "f64v2"
                               Name 459  "f64v"
                               Name 461  "if64v"
-                              Name 510  "S"
-                              MemberName 510(S) 0  "x"
-                              MemberName 510(S) 1  "y"
-                              MemberName 510(S) 2  "z"
-                              Name 512  "B1"
-                              MemberName 512(B1) 0  "a"
-                              MemberName 512(B1) 1  "b"
-                              MemberName 512(B1) 2  "c"
-                              MemberName 512(B1) 3  "d"
-                              MemberName 512(B1) 4  "e"
-                              MemberName 512(B1) 5  "f"
-                              MemberName 512(B1) 6  "g"
-                              MemberName 512(B1) 7  "h"
-                              Name 514  ""
-                              Name 515  "sf16"
-                              Name 517  "sf"
-                              Name 518  "sd"
-                              Name 519  "f16_to_f"
-                              Name 521  "f16_to_d"
-                              Name 522  "f_to_f16"
-                              Name 523  "d_to_f16"
+                              Name 518  "S"
+                              MemberName 518(S) 0  "x"
+                              MemberName 518(S) 1  "y"
+                              MemberName 518(S) 2  "z"
+                              Name 520  "B1"
+                              MemberName 520(B1) 0  "a"
+                              MemberName 520(B1) 1  "b"
+                              MemberName 520(B1) 2  "c"
+                              MemberName 520(B1) 3  "d"
+                              MemberName 520(B1) 4  "e"
+                              MemberName 520(B1) 5  "f"
+                              MemberName 520(B1) 6  "g"
+                              MemberName 520(B1) 7  "h"
+                              Name 522  ""
+                              Name 523  "sf16"
+                              Name 525  "sf"
+                              Name 526  "sd"
+                              Name 527  "f16_to_f"
+                              Name 529  "f16_to_d"
+                              Name 530  "f_to_f16"
+                              Name 531  "d_to_f16"
                               Decorate 461(if64v) Flat
                               Decorate 461(if64v) Location 0
-                              Decorate 508 ArrayStride 16
-                              Decorate 509 ArrayStride 64
-                              MemberDecorate 510(S) 0 Offset 0
-                              MemberDecorate 510(S) 1 Offset 16
-                              MemberDecorate 510(S) 2 Offset 32
-                              Decorate 511 ArrayStride 64
-                              MemberDecorate 512(B1) 0 Offset 0
-                              MemberDecorate 512(B1) 1 Offset 16
-                              MemberDecorate 512(B1) 2 Offset 32
-                              MemberDecorate 512(B1) 3 Offset 64
-                              MemberDecorate 512(B1) 4 ColMajor
-                              MemberDecorate 512(B1) 4 Offset 96
-                              MemberDecorate 512(B1) 4 MatrixStride 32
-                              MemberDecorate 512(B1) 5 ColMajor
-                              MemberDecorate 512(B1) 5 Offset 160
-                              MemberDecorate 512(B1) 5 MatrixStride 32
-                              MemberDecorate 512(B1) 6 Offset 288
-                              MemberDecorate 512(B1) 7 Offset 352
-                              Decorate 512(B1) Block
-                              Decorate 514 DescriptorSet 0
-                              Decorate 514 Binding 0
-                              Decorate 515(sf16) SpecId 100
-                              Decorate 517(sf) SpecId 101
-                              Decorate 518(sd) SpecId 102
+                              Decorate 516 ArrayStride 16
+                              Decorate 517 ArrayStride 64
+                              MemberDecorate 518(S) 0 Offset 0
+                              MemberDecorate 518(S) 1 Offset 16
+                              MemberDecorate 518(S) 2 Offset 32
+                              Decorate 519 ArrayStride 64
+                              MemberDecorate 520(B1) 0 Offset 0
+                              MemberDecorate 520(B1) 1 Offset 16
+                              MemberDecorate 520(B1) 2 Offset 32
+                              MemberDecorate 520(B1) 3 Offset 64
+                              MemberDecorate 520(B1) 4 ColMajor
+                              MemberDecorate 520(B1) 4 Offset 96
+                              MemberDecorate 520(B1) 4 MatrixStride 32
+                              MemberDecorate 520(B1) 5 ColMajor
+                              MemberDecorate 520(B1) 5 Offset 160
+                              MemberDecorate 520(B1) 5 MatrixStride 32
+                              MemberDecorate 520(B1) 6 Offset 288
+                              MemberDecorate 520(B1) 7 Offset 352
+                              Decorate 520(B1) Block
+                              Decorate 522 DescriptorSet 0
+                              Decorate 522 Binding 0
+                              Decorate 523(sf16) SpecId 100
+                              Decorate 525(sf) SpecId 101
+                              Decorate 526(sd) SpecId 102
                2:             TypeVoid
                3:             TypeFunction 2
               26:             TypeFloat 64
@@ -195,26 +195,26 @@
              460:             TypePointer Input 149(f64vec3)
       461(if64v):    460(ptr) Variable Input
              462:             TypePointer Input 26(float64_t)
-             499:    182(int) Constant 1
-             504:26(float64_t) Constant 0 1071644672
-             505: 27(f64vec2) ConstantComposite 504 504
-             507:     31(int) Constant 2
-             508:             TypeArray 26(float64_t) 507
-             509:             TypeArray 402 507
-          510(S):             TypeStruct 26(float64_t) 27(f64vec2) 149(f64vec3)
-             511:             TypeArray 510(S) 507
-         512(B1):             TypeStruct 26(float64_t) 27(f64vec2) 149(f64vec3) 508 402 509 510(S) 511
-             513:             TypePointer Uniform 512(B1)
-             514:    513(ptr) Variable Uniform
-       515(sf16):162(float16_t) SpecConstant 12288
-             516:             TypeFloat 32
-         517(sf):  516(float) SpecConstant 1048576000
-         518(sd):26(float64_t) SpecConstant 0 1071644672
-   519(f16_to_f):  516(float) SpecConstantOp 115 515(sf16)
-             520:  516(float) SpecConstantOp 115 515(sf16)
-   521(f16_to_d):26(float64_t) SpecConstantOp 115 520
-   522(f_to_f16):162(float16_t) SpecConstantOp 115 517(sf)
-   523(d_to_f16):162(float16_t) SpecConstantOp 115 518(sd)
+             505:    182(int) Constant 1
+             512:26(float64_t) Constant 0 1071644672
+             513: 27(f64vec2) ConstantComposite 512 512
+             515:     31(int) Constant 2
+             516:             TypeArray 26(float64_t) 515
+             517:             TypeArray 402 515
+          518(S):             TypeStruct 26(float64_t) 27(f64vec2) 149(f64vec3)
+             519:             TypeArray 518(S) 515
+         520(B1):             TypeStruct 26(float64_t) 27(f64vec2) 149(f64vec3) 516 402 517 518(S) 519
+             521:             TypePointer Uniform 520(B1)
+             522:    521(ptr) Variable Uniform
+       523(sf16):162(float16_t) SpecConstant 12288
+             524:             TypeFloat 32
+         525(sf):  524(float) SpecConstant 1048576000
+         526(sd):26(float64_t) SpecConstant 0 1071644672
+   527(f16_to_f):  524(float) SpecConstantOp 115 523(sf16)
+             528:  524(float) SpecConstantOp 115 523(sf16)
+   529(f16_to_d):26(float64_t) SpecConstantOp 115 528
+   530(f_to_f16):162(float16_t) SpecConstantOp 115 525(sf)
+   531(d_to_f16):162(float16_t) SpecConstantOp 115 526(sd)
          4(main):           2 Function None 3
                5:             Label
                               Return
@@ -754,45 +754,57 @@
              471:149(f64vec3) Load 461(if64v)
              472: 27(f64vec2) VectorShuffle 471 471 0 1
              473: 27(f64vec2) DPdxFine 472
-             474:149(f64vec3) Load 459(f64v)
-             475:149(f64vec3) VectorShuffle 474 473 3 4 2
-                              Store 459(f64v) 475
-             476:149(f64vec3) Load 461(if64v)
-             477: 27(f64vec2) VectorShuffle 476 476 0 1
-             478: 27(f64vec2) DPdyFine 477
-             479:149(f64vec3) Load 459(f64v)
-             480:149(f64vec3) VectorShuffle 479 478 3 4 2
-                              Store 459(f64v) 480
-             481:149(f64vec3) Load 461(if64v)
-             482:149(f64vec3) DPdxCoarse 481
-                              Store 459(f64v) 482
-             483:149(f64vec3) Load 461(if64v)
-             484:149(f64vec3) DPdxCoarse 483
-                              Store 459(f64v) 484
-             485:    462(ptr) AccessChain 461(if64v) 32
-             486:26(float64_t) Load 485
-             487:26(float64_t) Fwidth 486
-             488:     33(ptr) AccessChain 459(f64v) 32
-                              Store 488 487
-             489:149(f64vec3) Load 461(if64v)
-             490: 27(f64vec2) VectorShuffle 489 489 0 1
-             491: 27(f64vec2) FwidthFine 490
-             492:149(f64vec3) Load 459(f64v)
-             493:149(f64vec3) VectorShuffle 492 491 3 4 2
-                              Store 459(f64v) 493
-             494:149(f64vec3) Load 461(if64v)
-             495:149(f64vec3) FwidthCoarse 494
-                              Store 459(f64v) 495
-             496:    462(ptr) AccessChain 461(if64v) 32
-             497:26(float64_t) ExtInst 1(GLSL.std.450) 76(InterpolateAtCentroid) 496
-             498:     33(ptr) AccessChain 459(f64v) 32
-                              Store 498 497
-             500:149(f64vec3) ExtInst 1(GLSL.std.450) 77(InterpolateAtSample) 461(if64v) 499
-             501: 27(f64vec2) VectorShuffle 500 500 0 1
-             502:149(f64vec3) Load 459(f64v)
-             503:149(f64vec3) VectorShuffle 502 501 3 4 2
-                              Store 459(f64v) 503
-             506:149(f64vec3) ExtInst 1(GLSL.std.450) 78(InterpolateAtOffset) 461(if64v) 505
-                              Store 459(f64v) 506
+             474:     33(ptr) AccessChain 459(f64v) 32
+             475:26(float64_t) CompositeExtract 473 0
+                              Store 474 475
+             476:     33(ptr) AccessChain 459(f64v) 88
+             477:26(float64_t) CompositeExtract 473 1
+                              Store 476 477
+             478:149(f64vec3) Load 461(if64v)
+             479: 27(f64vec2) VectorShuffle 478 478 0 1
+             480: 27(f64vec2) DPdyFine 479
+             481:     33(ptr) AccessChain 459(f64v) 32
+             482:26(float64_t) CompositeExtract 480 0
+                              Store 481 482
+             483:     33(ptr) AccessChain 459(f64v) 88
+             484:26(float64_t) CompositeExtract 480 1
+                              Store 483 484
+             485:149(f64vec3) Load 461(if64v)
+             486:149(f64vec3) DPdxCoarse 485
+                              Store 459(f64v) 486
+             487:149(f64vec3) Load 461(if64v)
+             488:149(f64vec3) DPdxCoarse 487
+                              Store 459(f64v) 488
+             489:    462(ptr) AccessChain 461(if64v) 32
+             490:26(float64_t) Load 489
+             491:26(float64_t) Fwidth 490
+             492:     33(ptr) AccessChain 459(f64v) 32
+                              Store 492 491
+             493:149(f64vec3) Load 461(if64v)
+             494: 27(f64vec2) VectorShuffle 493 493 0 1
+             495: 27(f64vec2) FwidthFine 494
+             496:     33(ptr) AccessChain 459(f64v) 32
+             497:26(float64_t) CompositeExtract 495 0
+                              Store 496 497
+             498:     33(ptr) AccessChain 459(f64v) 88
+             499:26(float64_t) CompositeExtract 495 1
+                              Store 498 499
+             500:149(f64vec3) Load 461(if64v)
+             501:149(f64vec3) FwidthCoarse 500
+                              Store 459(f64v) 501
+             502:    462(ptr) AccessChain 461(if64v) 32
+             503:26(float64_t) ExtInst 1(GLSL.std.450) 76(InterpolateAtCentroid) 502
+             504:     33(ptr) AccessChain 459(f64v) 32
+                              Store 504 503
+             506:149(f64vec3) ExtInst 1(GLSL.std.450) 77(InterpolateAtSample) 461(if64v) 505
+             507: 27(f64vec2) VectorShuffle 506 506 0 1
+             508:     33(ptr) AccessChain 459(f64v) 32
+             509:26(float64_t) CompositeExtract 507 0
+                              Store 508 509
+             510:     33(ptr) AccessChain 459(f64v) 88
+             511:26(float64_t) CompositeExtract 507 1
+                              Store 510 511
+             514:149(f64vec3) ExtInst 1(GLSL.std.450) 78(InterpolateAtOffset) 461(if64v) 513
+                              Store 459(f64v) 514
                               Return
                               FunctionEnd
diff --git a/third_party/vulkan-deps/glslang/src/Test/baseResults/spv.forLoop.frag.out b/third_party/vulkan-deps/glslang/src/Test/baseResults/spv.forLoop.frag.out
index 1aac9a6..3a36667 100644
--- a/third_party/vulkan-deps/glslang/src/Test/baseResults/spv.forLoop.frag.out
+++ b/third_party/vulkan-deps/glslang/src/Test/baseResults/spv.forLoop.frag.out
@@ -1,12 +1,12 @@
 spv.forLoop.frag
 // Module Version 10000
 // Generated by (magic number): 8000a
-// Id's are bound by 131
+// Id's are bound by 143
 
                               Capability Shader
                1:             ExtInstImport  "GLSL.std.450"
                               MemoryModel Logical GLSL450
-                              EntryPoint Fragment 4  "main" 11 24 28 36 53 104
+                              EntryPoint Fragment 4  "main" 11 24 28 36 53 111
                               ExecutionMode 4 OriginUpperLeft
                               Source GLSL 140
                               Name 4  "main"
@@ -22,9 +22,9 @@
                               Name 63  "i"
                               Name 71  "tv4"
                               Name 88  "r"
-                              Name 94  "i"
-                              Name 104  "f"
-                              Name 117  "i"
+                              Name 101  "i"
+                              Name 111  "f"
+                              Name 129  "i"
                               Decorate 11(BaseColor) Location 1
                               Decorate 24(Count) Flat
                               Decorate 24(Count) Location 3
@@ -32,7 +32,7 @@
                               Decorate 36(gl_FragColor) Location 0
                               Decorate 53(v4) Flat
                               Decorate 53(v4) Location 4
-                              Decorate 104(f) Location 2
+                              Decorate 111(f) Location 2
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeFloat 32
@@ -60,10 +60,14 @@
               55:             TypePointer Input 50(int)
               76:     50(int) Constant 4
               89:             TypeVector 6(float) 3
-             103:             TypePointer Input 6(float)
-          104(f):    103(ptr) Variable Input
-             106:     50(int) Constant 3
-             124:     13(int) Constant 16
+              92:     50(int) Constant 0
+              95:     50(int) Constant 1
+              98:     50(int) Constant 2
+             110:             TypePointer Input 6(float)
+          111(f):    110(ptr) Variable Input
+             113:     50(int) Constant 3
+             122:             TypePointer Output 6(float)
+             136:     13(int) Constant 16
          4(main):           2 Function None 3
                5:             Label
         9(color):      8(ptr) Variable Function
@@ -73,8 +77,8 @@
            63(i):     14(ptr) Variable Function
          71(tv4):      8(ptr) Variable Function
            88(r):      8(ptr) Variable Function
-           94(i):     14(ptr) Variable Function
-          117(i):     14(ptr) Variable Function
+          101(i):     14(ptr) Variable Function
+          129(i):     14(ptr) Variable Function
               12:    7(fvec4) Load 11(BaseColor)
                               Store 9(color) 12
                               Store 15(i) 16
@@ -160,58 +164,70 @@
                               Store 36(gl_FragColor) 87
               90:    7(fvec4) Load 11(BaseColor)
               91:   89(fvec3) VectorShuffle 90 90 0 1 2
-              92:    7(fvec4) Load 88(r)
-              93:    7(fvec4) VectorShuffle 92 91 4 5 6 3
-                              Store 88(r) 93
-                              Store 94(i) 16
-                              Branch 95
-              95:             Label
-                              LoopMerge 97 98 None
-                              Branch 99
-              99:             Label
-             100:     13(int) Load 94(i)
-             101:     13(int) Load 24(Count)
-             102:    26(bool) SLessThan 100 101
-                              BranchConditional 102 96 97
-              96:               Label
-             105:    6(float)   Load 104(f)
-             107:     38(ptr)   AccessChain 88(r) 106
-                                Store 107 105
-                                Branch 98
-              98:               Label
-             108:     13(int)   Load 94(i)
-             109:     13(int)   IAdd 108 33
-                                Store 94(i) 109
-                                Branch 95
-              97:             Label
-             110:    7(fvec4) Load 88(r)
-             111:   89(fvec3) VectorShuffle 110 110 0 1 2
-             112:    7(fvec4) Load 36(gl_FragColor)
-             113:   89(fvec3) VectorShuffle 112 112 0 1 2
-             114:   89(fvec3) FAdd 113 111
-             115:    7(fvec4) Load 36(gl_FragColor)
-             116:    7(fvec4) VectorShuffle 115 114 4 5 6 3
-                              Store 36(gl_FragColor) 116
-                              Store 117(i) 16
-                              Branch 118
-             118:             Label
-                              LoopMerge 120 121 None
-                              Branch 122
-             122:             Label
-             123:     13(int) Load 117(i)
-             125:    26(bool) SLessThan 123 124
-                              BranchConditional 125 119 120
-             119:               Label
-             126:    6(float)   Load 104(f)
-             127:    7(fvec4)   Load 36(gl_FragColor)
-             128:    7(fvec4)   VectorTimesScalar 127 126
-                                Store 36(gl_FragColor) 128
-                                Branch 121
-             121:               Label
-             129:     13(int)   Load 117(i)
-             130:     13(int)   IAdd 129 48
-                                Store 117(i) 130
-                                Branch 118
-             120:             Label
+              93:     38(ptr) AccessChain 88(r) 92
+              94:    6(float) CompositeExtract 91 0
+                              Store 93 94
+              96:     38(ptr) AccessChain 88(r) 95
+              97:    6(float) CompositeExtract 91 1
+                              Store 96 97
+              99:     38(ptr) AccessChain 88(r) 98
+             100:    6(float) CompositeExtract 91 2
+                              Store 99 100
+                              Store 101(i) 16
+                              Branch 102
+             102:             Label
+                              LoopMerge 104 105 None
+                              Branch 106
+             106:             Label
+             107:     13(int) Load 101(i)
+             108:     13(int) Load 24(Count)
+             109:    26(bool) SLessThan 107 108
+                              BranchConditional 109 103 104
+             103:               Label
+             112:    6(float)   Load 111(f)
+             114:     38(ptr)   AccessChain 88(r) 113
+                                Store 114 112
+                                Branch 105
+             105:               Label
+             115:     13(int)   Load 101(i)
+             116:     13(int)   IAdd 115 33
+                                Store 101(i) 116
+                                Branch 102
+             104:             Label
+             117:    7(fvec4) Load 88(r)
+             118:   89(fvec3) VectorShuffle 117 117 0 1 2
+             119:    7(fvec4) Load 36(gl_FragColor)
+             120:   89(fvec3) VectorShuffle 119 119 0 1 2
+             121:   89(fvec3) FAdd 120 118
+             123:    122(ptr) AccessChain 36(gl_FragColor) 92
+             124:    6(float) CompositeExtract 121 0
+                              Store 123 124
+             125:    122(ptr) AccessChain 36(gl_FragColor) 95
+             126:    6(float) CompositeExtract 121 1
+                              Store 125 126
+             127:    122(ptr) AccessChain 36(gl_FragColor) 98
+             128:    6(float) CompositeExtract 121 2
+                              Store 127 128
+                              Store 129(i) 16
+                              Branch 130
+             130:             Label
+                              LoopMerge 132 133 None
+                              Branch 134
+             134:             Label
+             135:     13(int) Load 129(i)
+             137:    26(bool) SLessThan 135 136
+                              BranchConditional 137 131 132
+             131:               Label
+             138:    6(float)   Load 111(f)
+             139:    7(fvec4)   Load 36(gl_FragColor)
+             140:    7(fvec4)   VectorTimesScalar 139 138
+                                Store 36(gl_FragColor) 140
+                                Branch 133
+             133:               Label
+             141:     13(int)   Load 129(i)
+             142:     13(int)   IAdd 141 48
+                                Store 129(i) 142
+                                Branch 130
+             132:             Label
                               Return
                               FunctionEnd
diff --git a/third_party/vulkan-deps/glslang/src/Test/baseResults/spv.image.frag.out b/third_party/vulkan-deps/glslang/src/Test/baseResults/spv.image.frag.out
index 3e2096d..5fbb922 100644
--- a/third_party/vulkan-deps/glslang/src/Test/baseResults/spv.image.frag.out
+++ b/third_party/vulkan-deps/glslang/src/Test/baseResults/spv.image.frag.out
@@ -2,7 +2,7 @@
 Validation failed
 // Module Version 10000
 // Generated by (magic number): 8000a
-// Id's are bound by 395
+// Id's are bound by 405
 
                               Capability Shader
                               Capability StorageImageMultisample
@@ -16,79 +16,79 @@
                               Capability StorageImageWriteWithoutFormat
                1:             ExtInstImport  "GLSL.std.450"
                               MemoryModel Logical GLSL450
-                              EntryPoint Fragment 4  "main" 132 142 152 248 381 394
+                              EntryPoint Fragment 4  "main" 143 153 163 258 391 404
                               ExecutionMode 4 OriginUpperLeft
                               Source GLSL 450
                               Name 4  "main"
                               Name 9  "iv"
                               Name 15  "i1D"
                               Name 27  "i2D"
-                              Name 38  "i3D"
-                              Name 45  "iCube"
-                              Name 55  "iCubeArray"
-                              Name 62  "i2DRect"
-                              Name 72  "i1DArray"
-                              Name 82  "i2DArray"
-                              Name 89  "iBuffer"
-                              Name 98  "i2DMS"
-                              Name 108  "i2DMSArray"
-                              Name 127  "v"
-                              Name 132  "ic1D"
-                              Name 142  "ic2D"
-                              Name 152  "ic3D"
-                              Name 229  "ui"
-                              Name 232  "ii1D"
-                              Name 245  "ui2D"
-                              Name 248  "value"
-                              Name 357  "ii2DMS"
-                              Name 367  "ui2DMSArray"
-                              Name 376  "wo2D"
-                              Name 381  "fragData"
-                              Name 394  "ic4D"
+                              Name 41  "i3D"
+                              Name 48  "iCube"
+                              Name 60  "iCubeArray"
+                              Name 67  "i2DRect"
+                              Name 79  "i1DArray"
+                              Name 91  "i2DArray"
+                              Name 98  "iBuffer"
+                              Name 107  "i2DMS"
+                              Name 119  "i2DMSArray"
+                              Name 138  "v"
+                              Name 143  "ic1D"
+                              Name 153  "ic2D"
+                              Name 163  "ic3D"
+                              Name 240  "ui"
+                              Name 243  "ii1D"
+                              Name 255  "ui2D"
+                              Name 258  "value"
+                              Name 367  "ii2DMS"
+                              Name 377  "ui2DMSArray"
+                              Name 386  "wo2D"
+                              Name 391  "fragData"
+                              Name 404  "ic4D"
                               Decorate 15(i1D) DescriptorSet 0
                               Decorate 15(i1D) Binding 0
                               Decorate 27(i2D) DescriptorSet 0
                               Decorate 27(i2D) Binding 1
-                              Decorate 38(i3D) DescriptorSet 0
-                              Decorate 38(i3D) Binding 2
-                              Decorate 45(iCube) DescriptorSet 0
-                              Decorate 45(iCube) Binding 3
-                              Decorate 55(iCubeArray) DescriptorSet 0
-                              Decorate 55(iCubeArray) Binding 4
-                              Decorate 62(i2DRect) DescriptorSet 0
-                              Decorate 62(i2DRect) Binding 5
-                              Decorate 72(i1DArray) DescriptorSet 0
-                              Decorate 72(i1DArray) Binding 6
-                              Decorate 82(i2DArray) DescriptorSet 0
-                              Decorate 82(i2DArray) Binding 7
-                              Decorate 89(iBuffer) DescriptorSet 0
-                              Decorate 89(iBuffer) Binding 8
-                              Decorate 98(i2DMS) DescriptorSet 0
-                              Decorate 98(i2DMS) Binding 9
-                              Decorate 108(i2DMSArray) DescriptorSet 0
-                              Decorate 108(i2DMSArray) Binding 10
-                              Decorate 132(ic1D) Flat
-                              Decorate 132(ic1D) Location 0
-                              Decorate 142(ic2D) Flat
-                              Decorate 142(ic2D) Location 1
-                              Decorate 152(ic3D) Flat
-                              Decorate 152(ic3D) Location 2
-                              Decorate 232(ii1D) DescriptorSet 0
-                              Decorate 232(ii1D) Binding 11
-                              Decorate 245(ui2D) DescriptorSet 0
-                              Decorate 245(ui2D) Binding 12
-                              Decorate 248(value) Flat
-                              Decorate 248(value) Location 4
-                              Decorate 357(ii2DMS) DescriptorSet 0
-                              Decorate 357(ii2DMS) Binding 13
-                              Decorate 367(ui2DMSArray) DescriptorSet 0
-                              Decorate 367(ui2DMSArray) Binding 14
-                              Decorate 376(wo2D) DescriptorSet 0
-                              Decorate 376(wo2D) Binding 1
-                              Decorate 376(wo2D) NonReadable
-                              Decorate 381(fragData) Location 0
-                              Decorate 394(ic4D) Flat
-                              Decorate 394(ic4D) Location 3
+                              Decorate 41(i3D) DescriptorSet 0
+                              Decorate 41(i3D) Binding 2
+                              Decorate 48(iCube) DescriptorSet 0
+                              Decorate 48(iCube) Binding 3
+                              Decorate 60(iCubeArray) DescriptorSet 0
+                              Decorate 60(iCubeArray) Binding 4
+                              Decorate 67(i2DRect) DescriptorSet 0
+                              Decorate 67(i2DRect) Binding 5
+                              Decorate 79(i1DArray) DescriptorSet 0
+                              Decorate 79(i1DArray) Binding 6
+                              Decorate 91(i2DArray) DescriptorSet 0
+                              Decorate 91(i2DArray) Binding 7
+                              Decorate 98(iBuffer) DescriptorSet 0
+                              Decorate 98(iBuffer) Binding 8
+                              Decorate 107(i2DMS) DescriptorSet 0
+                              Decorate 107(i2DMS) Binding 9
+                              Decorate 119(i2DMSArray) DescriptorSet 0
+                              Decorate 119(i2DMSArray) Binding 10
+                              Decorate 143(ic1D) Flat
+                              Decorate 143(ic1D) Location 0
+                              Decorate 153(ic2D) Flat
+                              Decorate 153(ic2D) Location 1
+                              Decorate 163(ic3D) Flat
+                              Decorate 163(ic3D) Location 2
+                              Decorate 243(ii1D) DescriptorSet 0
+                              Decorate 243(ii1D) Binding 11
+                              Decorate 255(ui2D) DescriptorSet 0
+                              Decorate 255(ui2D) Binding 12
+                              Decorate 258(value) Flat
+                              Decorate 258(value) Location 4
+                              Decorate 367(ii2DMS) DescriptorSet 0
+                              Decorate 367(ii2DMS) Binding 13
+                              Decorate 377(ui2DMSArray) DescriptorSet 0
+                              Decorate 377(ui2DMSArray) Binding 14
+                              Decorate 386(wo2D) DescriptorSet 0
+                              Decorate 386(wo2D) Binding 1
+                              Decorate 386(wo2D) NonReadable
+                              Decorate 391(fragData) Location 0
+                              Decorate 404(ic4D) Flat
+                              Decorate 404(ic4D) Location 3
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeInt 32 1
@@ -107,90 +107,90 @@
               26:             TypePointer UniformConstant 25
          27(i2D):     26(ptr) Variable UniformConstant
               29:             TypeVector 6(int) 2
-              36:             TypeImage 12(float) 3D nonsampled format:Rgba32f
-              37:             TypePointer UniformConstant 36
-         38(i3D):     37(ptr) Variable UniformConstant
-              43:             TypeImage 12(float) Cube nonsampled format:Rgba32f
-              44:             TypePointer UniformConstant 43
-       45(iCube):     44(ptr) Variable UniformConstant
-              53:             TypeImage 12(float) Cube array nonsampled format:Rgba32f
-              54:             TypePointer UniformConstant 53
-  55(iCubeArray):     54(ptr) Variable UniformConstant
-              60:             TypeImage 12(float) Rect nonsampled format:Rgba32f
-              61:             TypePointer UniformConstant 60
-     62(i2DRect):     61(ptr) Variable UniformConstant
-              70:             TypeImage 12(float) 1D array nonsampled format:Rgba32f
-              71:             TypePointer UniformConstant 70
-    72(i1DArray):     71(ptr) Variable UniformConstant
-              80:             TypeImage 12(float) 2D array nonsampled format:Rg16
-              81:             TypePointer UniformConstant 80
-    82(i2DArray):     81(ptr) Variable UniformConstant
-              87:             TypeImage 12(float) Buffer nonsampled format:Rgba32f
-              88:             TypePointer UniformConstant 87
-     89(iBuffer):     88(ptr) Variable UniformConstant
-              96:             TypeImage 12(float) 2D multi-sampled nonsampled format:Rgba32f
+              36:     18(int) Constant 1
+              39:             TypeImage 12(float) 3D nonsampled format:Rgba32f
+              40:             TypePointer UniformConstant 39
+         41(i3D):     40(ptr) Variable UniformConstant
+              46:             TypeImage 12(float) Cube nonsampled format:Rgba32f
+              47:             TypePointer UniformConstant 46
+       48(iCube):     47(ptr) Variable UniformConstant
+              58:             TypeImage 12(float) Cube array nonsampled format:Rgba32f
+              59:             TypePointer UniformConstant 58
+  60(iCubeArray):     59(ptr) Variable UniformConstant
+              65:             TypeImage 12(float) Rect nonsampled format:Rgba32f
+              66:             TypePointer UniformConstant 65
+     67(i2DRect):     66(ptr) Variable UniformConstant
+              77:             TypeImage 12(float) 1D array nonsampled format:Rgba32f
+              78:             TypePointer UniformConstant 77
+    79(i1DArray):     78(ptr) Variable UniformConstant
+              89:             TypeImage 12(float) 2D array nonsampled format:Rg16
+              90:             TypePointer UniformConstant 89
+    91(i2DArray):     90(ptr) Variable UniformConstant
+              96:             TypeImage 12(float) Buffer nonsampled format:Rgba32f
               97:             TypePointer UniformConstant 96
-       98(i2DMS):     97(ptr) Variable UniformConstant
-             106:             TypeImage 12(float) 2D array multi-sampled nonsampled format:Rgba32f
-             107:             TypePointer UniformConstant 106
- 108(i2DMSArray):    107(ptr) Variable UniformConstant
-             125:             TypeVector 12(float) 4
-             126:             TypePointer Function 125(fvec4)
-             128:   12(float) Constant 0
-             129:  125(fvec4) ConstantComposite 128 128 128 128
-             131:             TypePointer Input 6(int)
-       132(ic1D):    131(ptr) Variable Input
-             141:             TypePointer Input 29(ivec2)
-       142(ic2D):    141(ptr) Variable Input
-             151:             TypePointer Input 7(ivec3)
-       152(ic3D):    151(ptr) Variable Input
-             210:      6(int) Constant 1
-             216:      6(int) Constant 2
-             220:      6(int) Constant 3
-             226:      6(int) Constant 4
-             228:             TypePointer Function 18(int)
-             230:             TypeImage 6(int) 1D nonsampled format:R32i
-             231:             TypePointer UniformConstant 230
-       232(ii1D):    231(ptr) Variable UniformConstant
-             234:      6(int) Constant 10
-             235:             TypePointer Image 6(int)
-             237:     18(int) Constant 1
-             243:             TypeImage 18(int) 2D nonsampled format:R32ui
-             244:             TypePointer UniformConstant 243
-       245(ui2D):    244(ptr) Variable UniformConstant
-             247:             TypePointer Input 18(int)
-      248(value):    247(ptr) Variable Input
-             250:             TypePointer Image 18(int)
-             256:      6(int) Constant 11
-             270:      6(int) Constant 12
-             284:      6(int) Constant 13
-             298:      6(int) Constant 14
-             312:      6(int) Constant 15
-             326:      6(int) Constant 16
-             340:      6(int) Constant 18
-             341:      6(int) Constant 17
-             349:     18(int) Constant 19
-             355:             TypeImage 6(int) 2D multi-sampled nonsampled format:R32i
-             356:             TypePointer UniformConstant 355
-     357(ii2DMS):    356(ptr) Variable UniformConstant
-             365:             TypeImage 18(int) 2D array multi-sampled nonsampled format:R32ui
+     98(iBuffer):     97(ptr) Variable UniformConstant
+             105:             TypeImage 12(float) 2D multi-sampled nonsampled format:Rgba32f
+             106:             TypePointer UniformConstant 105
+      107(i2DMS):    106(ptr) Variable UniformConstant
+             117:             TypeImage 12(float) 2D array multi-sampled nonsampled format:Rgba32f
+             118:             TypePointer UniformConstant 117
+ 119(i2DMSArray):    118(ptr) Variable UniformConstant
+             136:             TypeVector 12(float) 4
+             137:             TypePointer Function 136(fvec4)
+             139:   12(float) Constant 0
+             140:  136(fvec4) ConstantComposite 139 139 139 139
+             142:             TypePointer Input 6(int)
+       143(ic1D):    142(ptr) Variable Input
+             152:             TypePointer Input 29(ivec2)
+       153(ic2D):    152(ptr) Variable Input
+             162:             TypePointer Input 7(ivec3)
+       163(ic3D):    162(ptr) Variable Input
+             221:      6(int) Constant 1
+             227:      6(int) Constant 2
+             231:      6(int) Constant 3
+             237:      6(int) Constant 4
+             239:             TypePointer Function 18(int)
+             241:             TypeImage 6(int) 1D nonsampled format:R32i
+             242:             TypePointer UniformConstant 241
+       243(ii1D):    242(ptr) Variable UniformConstant
+             245:      6(int) Constant 10
+             246:             TypePointer Image 6(int)
+             253:             TypeImage 18(int) 2D nonsampled format:R32ui
+             254:             TypePointer UniformConstant 253
+       255(ui2D):    254(ptr) Variable UniformConstant
+             257:             TypePointer Input 18(int)
+      258(value):    257(ptr) Variable Input
+             260:             TypePointer Image 18(int)
+             266:      6(int) Constant 11
+             280:      6(int) Constant 12
+             294:      6(int) Constant 13
+             308:      6(int) Constant 14
+             322:      6(int) Constant 15
+             336:      6(int) Constant 16
+             350:      6(int) Constant 18
+             351:      6(int) Constant 17
+             359:     18(int) Constant 19
+             365:             TypeImage 6(int) 2D multi-sampled nonsampled format:R32i
              366:             TypePointer UniformConstant 365
-367(ui2DMSArray):    366(ptr) Variable UniformConstant
-             374:             TypeImage 12(float) 2D nonsampled format:Unknown
-             375:             TypePointer UniformConstant 374
-       376(wo2D):    375(ptr) Variable UniformConstant
-             380:             TypePointer Output 125(fvec4)
-   381(fragData):    380(ptr) Variable Output
-             386:             TypeBool
-             389:             TypeVector 386(bool) 4
-             392:             TypeVector 6(int) 4
-             393:             TypePointer Input 392(ivec4)
-       394(ic4D):    393(ptr) Variable Input
+     367(ii2DMS):    366(ptr) Variable UniformConstant
+             375:             TypeImage 18(int) 2D array multi-sampled nonsampled format:R32ui
+             376:             TypePointer UniformConstant 375
+377(ui2DMSArray):    376(ptr) Variable UniformConstant
+             384:             TypeImage 12(float) 2D nonsampled format:Unknown
+             385:             TypePointer UniformConstant 384
+       386(wo2D):    385(ptr) Variable UniformConstant
+             390:             TypePointer Output 136(fvec4)
+   391(fragData):    390(ptr) Variable Output
+             396:             TypeBool
+             399:             TypeVector 396(bool) 4
+             402:             TypeVector 6(int) 4
+             403:             TypePointer Input 402(ivec4)
+       404(ic4D):    403(ptr) Variable Input
          4(main):           2 Function None 3
                5:             Label
            9(iv):      8(ptr) Variable Function
-          127(v):    126(ptr) Variable Function
-         229(ui):    228(ptr) Variable Function
+          138(v):    137(ptr) Variable Function
+         240(ui):    239(ptr) Variable Function
                               Store 9(iv) 11
               16:          13 Load 15(i1D)
               17:      6(int) ImageQuerySize 16
@@ -204,341 +204,356 @@
               31:    7(ivec3) Load 9(iv)
               32:   29(ivec2) VectorShuffle 31 31 0 1
               33:   29(ivec2) IAdd 32 30
-              34:    7(ivec3) Load 9(iv)
-              35:    7(ivec3) VectorShuffle 34 33 3 4 2
-                              Store 9(iv) 35
-              39:          36 Load 38(i3D)
-              40:    7(ivec3) ImageQuerySize 39
-              41:    7(ivec3) Load 9(iv)
-              42:    7(ivec3) IAdd 41 40
-                              Store 9(iv) 42
-              46:          43 Load 45(iCube)
-              47:   29(ivec2) ImageQuerySize 46
-              48:    7(ivec3) Load 9(iv)
-              49:   29(ivec2) VectorShuffle 48 48 0 1
-              50:   29(ivec2) IAdd 49 47
+              34:     20(ptr) AccessChain 9(iv) 19
+              35:      6(int) CompositeExtract 33 0
+                              Store 34 35
+              37:     20(ptr) AccessChain 9(iv) 36
+              38:      6(int) CompositeExtract 33 1
+                              Store 37 38
+              42:          39 Load 41(i3D)
+              43:    7(ivec3) ImageQuerySize 42
+              44:    7(ivec3) Load 9(iv)
+              45:    7(ivec3) IAdd 44 43
+                              Store 9(iv) 45
+              49:          46 Load 48(iCube)
+              50:   29(ivec2) ImageQuerySize 49
               51:    7(ivec3) Load 9(iv)
-              52:    7(ivec3) VectorShuffle 51 50 3 4 2
-                              Store 9(iv) 52
-              56:          53 Load 55(iCubeArray)
-              57:    7(ivec3) ImageQuerySize 56
-              58:    7(ivec3) Load 9(iv)
-              59:    7(ivec3) IAdd 58 57
-                              Store 9(iv) 59
-              63:          60 Load 62(i2DRect)
-              64:   29(ivec2) ImageQuerySize 63
-              65:    7(ivec3) Load 9(iv)
-              66:   29(ivec2) VectorShuffle 65 65 0 1
-              67:   29(ivec2) IAdd 66 64
-              68:    7(ivec3) Load 9(iv)
-              69:    7(ivec3) VectorShuffle 68 67 3 4 2
-                              Store 9(iv) 69
-              73:          70 Load 72(i1DArray)
-              74:   29(ivec2) ImageQuerySize 73
-              75:    7(ivec3) Load 9(iv)
-              76:   29(ivec2) VectorShuffle 75 75 0 1
-              77:   29(ivec2) IAdd 76 74
-              78:    7(ivec3) Load 9(iv)
-              79:    7(ivec3) VectorShuffle 78 77 3 4 2
-                              Store 9(iv) 79
-              83:          80 Load 82(i2DArray)
-              84:    7(ivec3) ImageQuerySize 83
-              85:    7(ivec3) Load 9(iv)
-              86:    7(ivec3) IAdd 85 84
-                              Store 9(iv) 86
-              90:          87 Load 89(iBuffer)
-              91:      6(int) ImageQuerySize 90
-              92:     20(ptr) AccessChain 9(iv) 19
-              93:      6(int) Load 92
-              94:      6(int) IAdd 93 91
-              95:     20(ptr) AccessChain 9(iv) 19
-                              Store 95 94
-              99:          96 Load 98(i2DMS)
-             100:   29(ivec2) ImageQuerySize 99
-             101:    7(ivec3) Load 9(iv)
-             102:   29(ivec2) VectorShuffle 101 101 0 1
-             103:   29(ivec2) IAdd 102 100
-             104:    7(ivec3) Load 9(iv)
-             105:    7(ivec3) VectorShuffle 104 103 3 4 2
-                              Store 9(iv) 105
-             109:         106 Load 108(i2DMSArray)
-             110:    7(ivec3) ImageQuerySize 109
-             111:    7(ivec3) Load 9(iv)
-             112:    7(ivec3) IAdd 111 110
-                              Store 9(iv) 112
-             113:          96 Load 98(i2DMS)
-             114:      6(int) ImageQuerySamples 113
-             115:     20(ptr) AccessChain 9(iv) 19
-             116:      6(int) Load 115
-             117:      6(int) IAdd 116 114
-             118:     20(ptr) AccessChain 9(iv) 19
-                              Store 118 117
-             119:         106 Load 108(i2DMSArray)
-             120:      6(int) ImageQuerySamples 119
-             121:     20(ptr) AccessChain 9(iv) 19
-             122:      6(int) Load 121
-             123:      6(int) IAdd 122 120
-             124:     20(ptr) AccessChain 9(iv) 19
-                              Store 124 123
-                              Store 127(v) 129
-             130:          13 Load 15(i1D)
-             133:      6(int) Load 132(ic1D)
-             134:  125(fvec4) ImageRead 130 133
-             135:  125(fvec4) Load 127(v)
-             136:  125(fvec4) FAdd 135 134
-                              Store 127(v) 136
-             137:          13 Load 15(i1D)
-             138:      6(int) Load 132(ic1D)
-             139:  125(fvec4) Load 127(v)
-                              ImageWrite 137 138 139
-             140:          25 Load 27(i2D)
-             143:   29(ivec2) Load 142(ic2D)
-             144:  125(fvec4) ImageRead 140 143
-             145:  125(fvec4) Load 127(v)
-             146:  125(fvec4) FAdd 145 144
-                              Store 127(v) 146
-             147:          25 Load 27(i2D)
-             148:   29(ivec2) Load 142(ic2D)
-             149:  125(fvec4) Load 127(v)
-                              ImageWrite 147 148 149
-             150:          36 Load 38(i3D)
-             153:    7(ivec3) Load 152(ic3D)
-             154:  125(fvec4) ImageRead 150 153
-             155:  125(fvec4) Load 127(v)
-             156:  125(fvec4) FAdd 155 154
-                              Store 127(v) 156
-             157:          36 Load 38(i3D)
-             158:    7(ivec3) Load 152(ic3D)
-             159:  125(fvec4) Load 127(v)
-                              ImageWrite 157 158 159
-             160:          43 Load 45(iCube)
-             161:    7(ivec3) Load 152(ic3D)
-             162:  125(fvec4) ImageRead 160 161
-             163:  125(fvec4) Load 127(v)
-             164:  125(fvec4) FAdd 163 162
-                              Store 127(v) 164
-             165:          43 Load 45(iCube)
-             166:    7(ivec3) Load 152(ic3D)
-             167:  125(fvec4) Load 127(v)
-                              ImageWrite 165 166 167
-             168:          53 Load 55(iCubeArray)
-             169:    7(ivec3) Load 152(ic3D)
-             170:  125(fvec4) ImageRead 168 169
-             171:  125(fvec4) Load 127(v)
-             172:  125(fvec4) FAdd 171 170
-                              Store 127(v) 172
-             173:          53 Load 55(iCubeArray)
-             174:    7(ivec3) Load 152(ic3D)
-             175:  125(fvec4) Load 127(v)
-                              ImageWrite 173 174 175
-             176:          60 Load 62(i2DRect)
-             177:   29(ivec2) Load 142(ic2D)
-             178:  125(fvec4) ImageRead 176 177
-             179:  125(fvec4) Load 127(v)
-             180:  125(fvec4) FAdd 179 178
-                              Store 127(v) 180
-             181:          60 Load 62(i2DRect)
-             182:   29(ivec2) Load 142(ic2D)
-             183:  125(fvec4) Load 127(v)
-                              ImageWrite 181 182 183
-             184:          70 Load 72(i1DArray)
-             185:   29(ivec2) Load 142(ic2D)
-             186:  125(fvec4) ImageRead 184 185
-             187:  125(fvec4) Load 127(v)
-             188:  125(fvec4) FAdd 187 186
-                              Store 127(v) 188
-             189:          70 Load 72(i1DArray)
-             190:   29(ivec2) Load 142(ic2D)
-             191:  125(fvec4) Load 127(v)
-                              ImageWrite 189 190 191
-             192:          80 Load 82(i2DArray)
-             193:    7(ivec3) Load 152(ic3D)
-             194:  125(fvec4) ImageRead 192 193
-             195:  125(fvec4) Load 127(v)
-             196:  125(fvec4) FAdd 195 194
-                              Store 127(v) 196
-             197:          80 Load 82(i2DArray)
-             198:    7(ivec3) Load 152(ic3D)
-             199:  125(fvec4) Load 127(v)
-                              ImageWrite 197 198 199
-             200:          87 Load 89(iBuffer)
-             201:      6(int) Load 132(ic1D)
-             202:  125(fvec4) ImageRead 200 201
-             203:  125(fvec4) Load 127(v)
-             204:  125(fvec4) FAdd 203 202
-                              Store 127(v) 204
-             205:          87 Load 89(iBuffer)
-             206:      6(int) Load 132(ic1D)
-             207:  125(fvec4) Load 127(v)
-                              ImageWrite 205 206 207
-             208:          96 Load 98(i2DMS)
-             209:   29(ivec2) Load 142(ic2D)
-             211:  125(fvec4) ImageRead 208 209 Sample 210
-             212:  125(fvec4) Load 127(v)
-             213:  125(fvec4) FAdd 212 211
-                              Store 127(v) 213
-             214:          96 Load 98(i2DMS)
-             215:   29(ivec2) Load 142(ic2D)
-             217:  125(fvec4) Load 127(v)
-                              ImageWrite 214 215 217 Sample 216
-             218:         106 Load 108(i2DMSArray)
-             219:    7(ivec3) Load 152(ic3D)
-             221:  125(fvec4) ImageRead 218 219 Sample 220
-             222:  125(fvec4) Load 127(v)
-             223:  125(fvec4) FAdd 222 221
-                              Store 127(v) 223
-             224:         106 Load 108(i2DMSArray)
-             225:    7(ivec3) Load 152(ic3D)
-             227:  125(fvec4) Load 127(v)
-                              ImageWrite 224 225 227 Sample 226
-                              Store 229(ui) 19
-             233:      6(int) Load 132(ic1D)
-             236:    235(ptr) ImageTexelPointer 232(ii1D) 233 19
-             238:      6(int) AtomicIAdd 236 237 19 234
-             239:     20(ptr) AccessChain 9(iv) 19
-             240:      6(int) Load 239
-             241:      6(int) IAdd 240 238
-             242:     20(ptr) AccessChain 9(iv) 19
-                              Store 242 241
-             246:   29(ivec2) Load 142(ic2D)
-             249:     18(int) Load 248(value)
-             251:    250(ptr) ImageTexelPointer 245(ui2D) 246 19
-             252:     18(int) AtomicIAdd 251 237 19 249
-             253:     18(int) Load 229(ui)
-             254:     18(int) IAdd 253 252
-                              Store 229(ui) 254
-             255:      6(int) Load 132(ic1D)
-             257:    235(ptr) ImageTexelPointer 232(ii1D) 255 19
-             258:      6(int) AtomicSMin 257 237 19 256
-             259:     20(ptr) AccessChain 9(iv) 19
-             260:      6(int) Load 259
-             261:      6(int) IAdd 260 258
-             262:     20(ptr) AccessChain 9(iv) 19
-                              Store 262 261
-             263:   29(ivec2) Load 142(ic2D)
-             264:     18(int) Load 248(value)
-             265:    250(ptr) ImageTexelPointer 245(ui2D) 263 19
-             266:     18(int) AtomicUMin 265 237 19 264
-             267:     18(int) Load 229(ui)
-             268:     18(int) IAdd 267 266
-                              Store 229(ui) 268
-             269:      6(int) Load 132(ic1D)
-             271:    235(ptr) ImageTexelPointer 232(ii1D) 269 19
-             272:      6(int) AtomicSMax 271 237 19 270
-             273:     20(ptr) AccessChain 9(iv) 19
-             274:      6(int) Load 273
-             275:      6(int) IAdd 274 272
-             276:     20(ptr) AccessChain 9(iv) 19
-                              Store 276 275
-             277:   29(ivec2) Load 142(ic2D)
-             278:     18(int) Load 248(value)
-             279:    250(ptr) ImageTexelPointer 245(ui2D) 277 19
-             280:     18(int) AtomicUMax 279 237 19 278
-             281:     18(int) Load 229(ui)
-             282:     18(int) IAdd 281 280
-                              Store 229(ui) 282
-             283:      6(int) Load 132(ic1D)
-             285:    235(ptr) ImageTexelPointer 232(ii1D) 283 19
-             286:      6(int) AtomicAnd 285 237 19 284
-             287:     20(ptr) AccessChain 9(iv) 19
-             288:      6(int) Load 287
-             289:      6(int) IAdd 288 286
-             290:     20(ptr) AccessChain 9(iv) 19
-                              Store 290 289
-             291:   29(ivec2) Load 142(ic2D)
-             292:     18(int) Load 248(value)
-             293:    250(ptr) ImageTexelPointer 245(ui2D) 291 19
-             294:     18(int) AtomicAnd 293 237 19 292
-             295:     18(int) Load 229(ui)
-             296:     18(int) IAdd 295 294
-                              Store 229(ui) 296
-             297:      6(int) Load 132(ic1D)
-             299:    235(ptr) ImageTexelPointer 232(ii1D) 297 19
-             300:      6(int) AtomicOr 299 237 19 298
-             301:     20(ptr) AccessChain 9(iv) 19
-             302:      6(int) Load 301
-             303:      6(int) IAdd 302 300
-             304:     20(ptr) AccessChain 9(iv) 19
-                              Store 304 303
-             305:   29(ivec2) Load 142(ic2D)
-             306:     18(int) Load 248(value)
-             307:    250(ptr) ImageTexelPointer 245(ui2D) 305 19
-             308:     18(int) AtomicOr 307 237 19 306
-             309:     18(int) Load 229(ui)
-             310:     18(int) IAdd 309 308
-                              Store 229(ui) 310
-             311:      6(int) Load 132(ic1D)
-             313:    235(ptr) ImageTexelPointer 232(ii1D) 311 19
-             314:      6(int) AtomicXor 313 237 19 312
-             315:     20(ptr) AccessChain 9(iv) 19
-             316:      6(int) Load 315
-             317:      6(int) IAdd 316 314
-             318:     20(ptr) AccessChain 9(iv) 19
-                              Store 318 317
-             319:   29(ivec2) Load 142(ic2D)
-             320:     18(int) Load 248(value)
-             321:    250(ptr) ImageTexelPointer 245(ui2D) 319 19
-             322:     18(int) AtomicXor 321 237 19 320
-             323:     18(int) Load 229(ui)
-             324:     18(int) IAdd 323 322
-                              Store 229(ui) 324
-             325:      6(int) Load 132(ic1D)
-             327:    235(ptr) ImageTexelPointer 232(ii1D) 325 19
-             328:      6(int) AtomicExchange 327 237 19 326
-             329:     20(ptr) AccessChain 9(iv) 19
-             330:      6(int) Load 329
-             331:      6(int) IAdd 330 328
-             332:     20(ptr) AccessChain 9(iv) 19
-                              Store 332 331
-             333:   29(ivec2) Load 142(ic2D)
-             334:     18(int) Load 248(value)
-             335:    250(ptr) ImageTexelPointer 245(ui2D) 333 19
-             336:     18(int) AtomicExchange 335 237 19 334
-             337:     18(int) Load 229(ui)
-             338:     18(int) IAdd 337 336
-                              Store 229(ui) 338
-             339:      6(int) Load 132(ic1D)
-             342:    235(ptr) ImageTexelPointer 232(ii1D) 339 19
-             343:      6(int) AtomicCompareExchange 342 237 19 19 341 340
-             344:     20(ptr) AccessChain 9(iv) 19
-             345:      6(int) Load 344
-             346:      6(int) IAdd 345 343
-             347:     20(ptr) AccessChain 9(iv) 19
-                              Store 347 346
-             348:   29(ivec2) Load 142(ic2D)
-             350:     18(int) Load 248(value)
-             351:    250(ptr) ImageTexelPointer 245(ui2D) 348 19
-             352:     18(int) AtomicCompareExchange 351 237 19 19 350 349
-             353:     18(int) Load 229(ui)
-             354:     18(int) IAdd 353 352
-                              Store 229(ui) 354
-             358:   29(ivec2) Load 142(ic2D)
-             359:    235(ptr) ImageTexelPointer 357(ii2DMS) 358 216
-             360:      6(int) AtomicCompareExchange 359 237 19 19 341 340
-             361:     20(ptr) AccessChain 9(iv) 19
-             362:      6(int) Load 361
-             363:      6(int) IAdd 362 360
-             364:     20(ptr) AccessChain 9(iv) 19
-                              Store 364 363
-             368:    7(ivec3) Load 152(ic3D)
-             369:     18(int) Load 248(value)
-             370:    250(ptr) ImageTexelPointer 367(ui2DMSArray) 368 220
-             371:     18(int) AtomicCompareExchange 370 237 19 19 369 349
-             372:     18(int) Load 229(ui)
-             373:     18(int) IAdd 372 371
-                              Store 229(ui) 373
-             377:         374 Load 376(wo2D)
-             378:   29(ivec2) Load 142(ic2D)
-             379:  125(fvec4) Load 127(v)
-                              ImageWrite 377 378 379
-             382:     18(int) Load 229(ui)
-             383:     20(ptr) AccessChain 9(iv) 237
-             384:      6(int) Load 383
-             385:     18(int) Bitcast 384
-             387:   386(bool) INotEqual 382 385
-             388:  125(fvec4) Load 127(v)
-             390:  389(bvec4) CompositeConstruct 387 387 387 387
-             391:  125(fvec4) Select 390 388 129
-                              Store 381(fragData) 391
+              52:   29(ivec2) VectorShuffle 51 51 0 1
+              53:   29(ivec2) IAdd 52 50
+              54:     20(ptr) AccessChain 9(iv) 19
+              55:      6(int) CompositeExtract 53 0
+                              Store 54 55
+              56:     20(ptr) AccessChain 9(iv) 36
+              57:      6(int) CompositeExtract 53 1
+                              Store 56 57
+              61:          58 Load 60(iCubeArray)
+              62:    7(ivec3) ImageQuerySize 61
+              63:    7(ivec3) Load 9(iv)
+              64:    7(ivec3) IAdd 63 62
+                              Store 9(iv) 64
+              68:          65 Load 67(i2DRect)
+              69:   29(ivec2) ImageQuerySize 68
+              70:    7(ivec3) Load 9(iv)
+              71:   29(ivec2) VectorShuffle 70 70 0 1
+              72:   29(ivec2) IAdd 71 69
+              73:     20(ptr) AccessChain 9(iv) 19
+              74:      6(int) CompositeExtract 72 0
+                              Store 73 74
+              75:     20(ptr) AccessChain 9(iv) 36
+              76:      6(int) CompositeExtract 72 1
+                              Store 75 76
+              80:          77 Load 79(i1DArray)
+              81:   29(ivec2) ImageQuerySize 80
+              82:    7(ivec3) Load 9(iv)
+              83:   29(ivec2) VectorShuffle 82 82 0 1
+              84:   29(ivec2) IAdd 83 81
+              85:     20(ptr) AccessChain 9(iv) 19
+              86:      6(int) CompositeExtract 84 0
+                              Store 85 86
+              87:     20(ptr) AccessChain 9(iv) 36
+              88:      6(int) CompositeExtract 84 1
+                              Store 87 88
+              92:          89 Load 91(i2DArray)
+              93:    7(ivec3) ImageQuerySize 92
+              94:    7(ivec3) Load 9(iv)
+              95:    7(ivec3) IAdd 94 93
+                              Store 9(iv) 95
+              99:          96 Load 98(iBuffer)
+             100:      6(int) ImageQuerySize 99
+             101:     20(ptr) AccessChain 9(iv) 19
+             102:      6(int) Load 101
+             103:      6(int) IAdd 102 100
+             104:     20(ptr) AccessChain 9(iv) 19
+                              Store 104 103
+             108:         105 Load 107(i2DMS)
+             109:   29(ivec2) ImageQuerySize 108
+             110:    7(ivec3) Load 9(iv)
+             111:   29(ivec2) VectorShuffle 110 110 0 1
+             112:   29(ivec2) IAdd 111 109
+             113:     20(ptr) AccessChain 9(iv) 19
+             114:      6(int) CompositeExtract 112 0
+                              Store 113 114
+             115:     20(ptr) AccessChain 9(iv) 36
+             116:      6(int) CompositeExtract 112 1
+                              Store 115 116
+             120:         117 Load 119(i2DMSArray)
+             121:    7(ivec3) ImageQuerySize 120
+             122:    7(ivec3) Load 9(iv)
+             123:    7(ivec3) IAdd 122 121
+                              Store 9(iv) 123
+             124:         105 Load 107(i2DMS)
+             125:      6(int) ImageQuerySamples 124
+             126:     20(ptr) AccessChain 9(iv) 19
+             127:      6(int) Load 126
+             128:      6(int) IAdd 127 125
+             129:     20(ptr) AccessChain 9(iv) 19
+                              Store 129 128
+             130:         117 Load 119(i2DMSArray)
+             131:      6(int) ImageQuerySamples 130
+             132:     20(ptr) AccessChain 9(iv) 19
+             133:      6(int) Load 132
+             134:      6(int) IAdd 133 131
+             135:     20(ptr) AccessChain 9(iv) 19
+                              Store 135 134
+                              Store 138(v) 140
+             141:          13 Load 15(i1D)
+             144:      6(int) Load 143(ic1D)
+             145:  136(fvec4) ImageRead 141 144
+             146:  136(fvec4) Load 138(v)
+             147:  136(fvec4) FAdd 146 145
+                              Store 138(v) 147
+             148:          13 Load 15(i1D)
+             149:      6(int) Load 143(ic1D)
+             150:  136(fvec4) Load 138(v)
+                              ImageWrite 148 149 150
+             151:          25 Load 27(i2D)
+             154:   29(ivec2) Load 153(ic2D)
+             155:  136(fvec4) ImageRead 151 154
+             156:  136(fvec4) Load 138(v)
+             157:  136(fvec4) FAdd 156 155
+                              Store 138(v) 157
+             158:          25 Load 27(i2D)
+             159:   29(ivec2) Load 153(ic2D)
+             160:  136(fvec4) Load 138(v)
+                              ImageWrite 158 159 160
+             161:          39 Load 41(i3D)
+             164:    7(ivec3) Load 163(ic3D)
+             165:  136(fvec4) ImageRead 161 164
+             166:  136(fvec4) Load 138(v)
+             167:  136(fvec4) FAdd 166 165
+                              Store 138(v) 167
+             168:          39 Load 41(i3D)
+             169:    7(ivec3) Load 163(ic3D)
+             170:  136(fvec4) Load 138(v)
+                              ImageWrite 168 169 170
+             171:          46 Load 48(iCube)
+             172:    7(ivec3) Load 163(ic3D)
+             173:  136(fvec4) ImageRead 171 172
+             174:  136(fvec4) Load 138(v)
+             175:  136(fvec4) FAdd 174 173
+                              Store 138(v) 175
+             176:          46 Load 48(iCube)
+             177:    7(ivec3) Load 163(ic3D)
+             178:  136(fvec4) Load 138(v)
+                              ImageWrite 176 177 178
+             179:          58 Load 60(iCubeArray)
+             180:    7(ivec3) Load 163(ic3D)
+             181:  136(fvec4) ImageRead 179 180
+             182:  136(fvec4) Load 138(v)
+             183:  136(fvec4) FAdd 182 181
+                              Store 138(v) 183
+             184:          58 Load 60(iCubeArray)
+             185:    7(ivec3) Load 163(ic3D)
+             186:  136(fvec4) Load 138(v)
+                              ImageWrite 184 185 186
+             187:          65 Load 67(i2DRect)
+             188:   29(ivec2) Load 153(ic2D)
+             189:  136(fvec4) ImageRead 187 188
+             190:  136(fvec4) Load 138(v)
+             191:  136(fvec4) FAdd 190 189
+                              Store 138(v) 191
+             192:          65 Load 67(i2DRect)
+             193:   29(ivec2) Load 153(ic2D)
+             194:  136(fvec4) Load 138(v)
+                              ImageWrite 192 193 194
+             195:          77 Load 79(i1DArray)
+             196:   29(ivec2) Load 153(ic2D)
+             197:  136(fvec4) ImageRead 195 196
+             198:  136(fvec4) Load 138(v)
+             199:  136(fvec4) FAdd 198 197
+                              Store 138(v) 199
+             200:          77 Load 79(i1DArray)
+             201:   29(ivec2) Load 153(ic2D)
+             202:  136(fvec4) Load 138(v)
+                              ImageWrite 200 201 202
+             203:          89 Load 91(i2DArray)
+             204:    7(ivec3) Load 163(ic3D)
+             205:  136(fvec4) ImageRead 203 204
+             206:  136(fvec4) Load 138(v)
+             207:  136(fvec4) FAdd 206 205
+                              Store 138(v) 207
+             208:          89 Load 91(i2DArray)
+             209:    7(ivec3) Load 163(ic3D)
+             210:  136(fvec4) Load 138(v)
+                              ImageWrite 208 209 210
+             211:          96 Load 98(iBuffer)
+             212:      6(int) Load 143(ic1D)
+             213:  136(fvec4) ImageRead 211 212
+             214:  136(fvec4) Load 138(v)
+             215:  136(fvec4) FAdd 214 213
+                              Store 138(v) 215
+             216:          96 Load 98(iBuffer)
+             217:      6(int) Load 143(ic1D)
+             218:  136(fvec4) Load 138(v)
+                              ImageWrite 216 217 218
+             219:         105 Load 107(i2DMS)
+             220:   29(ivec2) Load 153(ic2D)
+             222:  136(fvec4) ImageRead 219 220 Sample 221
+             223:  136(fvec4) Load 138(v)
+             224:  136(fvec4) FAdd 223 222
+                              Store 138(v) 224
+             225:         105 Load 107(i2DMS)
+             226:   29(ivec2) Load 153(ic2D)
+             228:  136(fvec4) Load 138(v)
+                              ImageWrite 225 226 228 Sample 227
+             229:         117 Load 119(i2DMSArray)
+             230:    7(ivec3) Load 163(ic3D)
+             232:  136(fvec4) ImageRead 229 230 Sample 231
+             233:  136(fvec4) Load 138(v)
+             234:  136(fvec4) FAdd 233 232
+                              Store 138(v) 234
+             235:         117 Load 119(i2DMSArray)
+             236:    7(ivec3) Load 163(ic3D)
+             238:  136(fvec4) Load 138(v)
+                              ImageWrite 235 236 238 Sample 237
+                              Store 240(ui) 19
+             244:      6(int) Load 143(ic1D)
+             247:    246(ptr) ImageTexelPointer 243(ii1D) 244 19
+             248:      6(int) AtomicIAdd 247 36 19 245
+             249:     20(ptr) AccessChain 9(iv) 19
+             250:      6(int) Load 249
+             251:      6(int) IAdd 250 248
+             252:     20(ptr) AccessChain 9(iv) 19
+                              Store 252 251
+             256:   29(ivec2) Load 153(ic2D)
+             259:     18(int) Load 258(value)
+             261:    260(ptr) ImageTexelPointer 255(ui2D) 256 19
+             262:     18(int) AtomicIAdd 261 36 19 259
+             263:     18(int) Load 240(ui)
+             264:     18(int) IAdd 263 262
+                              Store 240(ui) 264
+             265:      6(int) Load 143(ic1D)
+             267:    246(ptr) ImageTexelPointer 243(ii1D) 265 19
+             268:      6(int) AtomicSMin 267 36 19 266
+             269:     20(ptr) AccessChain 9(iv) 19
+             270:      6(int) Load 269
+             271:      6(int) IAdd 270 268
+             272:     20(ptr) AccessChain 9(iv) 19
+                              Store 272 271
+             273:   29(ivec2) Load 153(ic2D)
+             274:     18(int) Load 258(value)
+             275:    260(ptr) ImageTexelPointer 255(ui2D) 273 19
+             276:     18(int) AtomicUMin 275 36 19 274
+             277:     18(int) Load 240(ui)
+             278:     18(int) IAdd 277 276
+                              Store 240(ui) 278
+             279:      6(int) Load 143(ic1D)
+             281:    246(ptr) ImageTexelPointer 243(ii1D) 279 19
+             282:      6(int) AtomicSMax 281 36 19 280
+             283:     20(ptr) AccessChain 9(iv) 19
+             284:      6(int) Load 283
+             285:      6(int) IAdd 284 282
+             286:     20(ptr) AccessChain 9(iv) 19
+                              Store 286 285
+             287:   29(ivec2) Load 153(ic2D)
+             288:     18(int) Load 258(value)
+             289:    260(ptr) ImageTexelPointer 255(ui2D) 287 19
+             290:     18(int) AtomicUMax 289 36 19 288
+             291:     18(int) Load 240(ui)
+             292:     18(int) IAdd 291 290
+                              Store 240(ui) 292
+             293:      6(int) Load 143(ic1D)
+             295:    246(ptr) ImageTexelPointer 243(ii1D) 293 19
+             296:      6(int) AtomicAnd 295 36 19 294
+             297:     20(ptr) AccessChain 9(iv) 19
+             298:      6(int) Load 297
+             299:      6(int) IAdd 298 296
+             300:     20(ptr) AccessChain 9(iv) 19
+                              Store 300 299
+             301:   29(ivec2) Load 153(ic2D)
+             302:     18(int) Load 258(value)
+             303:    260(ptr) ImageTexelPointer 255(ui2D) 301 19
+             304:     18(int) AtomicAnd 303 36 19 302
+             305:     18(int) Load 240(ui)
+             306:     18(int) IAdd 305 304
+                              Store 240(ui) 306
+             307:      6(int) Load 143(ic1D)
+             309:    246(ptr) ImageTexelPointer 243(ii1D) 307 19
+             310:      6(int) AtomicOr 309 36 19 308
+             311:     20(ptr) AccessChain 9(iv) 19
+             312:      6(int) Load 311
+             313:      6(int) IAdd 312 310
+             314:     20(ptr) AccessChain 9(iv) 19
+                              Store 314 313
+             315:   29(ivec2) Load 153(ic2D)
+             316:     18(int) Load 258(value)
+             317:    260(ptr) ImageTexelPointer 255(ui2D) 315 19
+             318:     18(int) AtomicOr 317 36 19 316
+             319:     18(int) Load 240(ui)
+             320:     18(int) IAdd 319 318
+                              Store 240(ui) 320
+             321:      6(int) Load 143(ic1D)
+             323:    246(ptr) ImageTexelPointer 243(ii1D) 321 19
+             324:      6(int) AtomicXor 323 36 19 322
+             325:     20(ptr) AccessChain 9(iv) 19
+             326:      6(int) Load 325
+             327:      6(int) IAdd 326 324
+             328:     20(ptr) AccessChain 9(iv) 19
+                              Store 328 327
+             329:   29(ivec2) Load 153(ic2D)
+             330:     18(int) Load 258(value)
+             331:    260(ptr) ImageTexelPointer 255(ui2D) 329 19
+             332:     18(int) AtomicXor 331 36 19 330
+             333:     18(int) Load 240(ui)
+             334:     18(int) IAdd 333 332
+                              Store 240(ui) 334
+             335:      6(int) Load 143(ic1D)
+             337:    246(ptr) ImageTexelPointer 243(ii1D) 335 19
+             338:      6(int) AtomicExchange 337 36 19 336
+             339:     20(ptr) AccessChain 9(iv) 19
+             340:      6(int) Load 339
+             341:      6(int) IAdd 340 338
+             342:     20(ptr) AccessChain 9(iv) 19
+                              Store 342 341
+             343:   29(ivec2) Load 153(ic2D)
+             344:     18(int) Load 258(value)
+             345:    260(ptr) ImageTexelPointer 255(ui2D) 343 19
+             346:     18(int) AtomicExchange 345 36 19 344
+             347:     18(int) Load 240(ui)
+             348:     18(int) IAdd 347 346
+                              Store 240(ui) 348
+             349:      6(int) Load 143(ic1D)
+             352:    246(ptr) ImageTexelPointer 243(ii1D) 349 19
+             353:      6(int) AtomicCompareExchange 352 36 19 19 351 350
+             354:     20(ptr) AccessChain 9(iv) 19
+             355:      6(int) Load 354
+             356:      6(int) IAdd 355 353
+             357:     20(ptr) AccessChain 9(iv) 19
+                              Store 357 356
+             358:   29(ivec2) Load 153(ic2D)
+             360:     18(int) Load 258(value)
+             361:    260(ptr) ImageTexelPointer 255(ui2D) 358 19
+             362:     18(int) AtomicCompareExchange 361 36 19 19 360 359
+             363:     18(int) Load 240(ui)
+             364:     18(int) IAdd 363 362
+                              Store 240(ui) 364
+             368:   29(ivec2) Load 153(ic2D)
+             369:    246(ptr) ImageTexelPointer 367(ii2DMS) 368 227
+             370:      6(int) AtomicCompareExchange 369 36 19 19 351 350
+             371:     20(ptr) AccessChain 9(iv) 19
+             372:      6(int) Load 371
+             373:      6(int) IAdd 372 370
+             374:     20(ptr) AccessChain 9(iv) 19
+                              Store 374 373
+             378:    7(ivec3) Load 163(ic3D)
+             379:     18(int) Load 258(value)
+             380:    260(ptr) ImageTexelPointer 377(ui2DMSArray) 378 231
+             381:     18(int) AtomicCompareExchange 380 36 19 19 379 359
+             382:     18(int) Load 240(ui)
+             383:     18(int) IAdd 382 381
+                              Store 240(ui) 383
+             387:         384 Load 386(wo2D)
+             388:   29(ivec2) Load 153(ic2D)
+             389:  136(fvec4) Load 138(v)
+                              ImageWrite 387 388 389
+             392:     18(int) Load 240(ui)
+             393:     20(ptr) AccessChain 9(iv) 36
+             394:      6(int) Load 393
+             395:     18(int) Bitcast 394
+             397:   396(bool) INotEqual 392 395
+             398:  136(fvec4) Load 138(v)
+             400:  399(bvec4) CompositeConstruct 397 397 397 397
+             401:  136(fvec4) Select 400 398 140
+                              Store 391(fragData) 401
                               Return
                               FunctionEnd
diff --git a/third_party/vulkan-deps/glslang/src/Test/baseResults/spv.int16.amd.frag.out b/third_party/vulkan-deps/glslang/src/Test/baseResults/spv.int16.amd.frag.out
index 50dbe6c..676d99c 100644
--- a/third_party/vulkan-deps/glslang/src/Test/baseResults/spv.int16.amd.frag.out
+++ b/third_party/vulkan-deps/glslang/src/Test/baseResults/spv.int16.amd.frag.out
@@ -1,7 +1,7 @@
 spv.int16.amd.frag
 // Module Version 10000
 // Generated by (magic number): 8000a
-// Id's are bound by 560
+// Id's are bound by 576
 
                               Capability Shader
                               Capability Float16
@@ -14,7 +14,7 @@
                               Extension  "SPV_KHR_16bit_storage"
                1:             ExtInstImport  "GLSL.std.450"
                               MemoryModel Logical GLSL450
-                              EntryPoint Fragment 4  "main" 519 521
+                              EntryPoint Fragment 4  "main" 535 537
                               ExecutionMode 4 OriginUpperLeft
                               Source GLSL 450
                               SourceExtension  "GL_AMD_gpu_shader_half_float"
@@ -54,66 +54,66 @@
                               Name 393  "f16v"
                               Name 396  "exp"
                               Name 397  "ResType"
-                              Name 418  "packi"
-                              Name 423  "packu"
-                              Name 432  "packi64"
-                              Name 441  "packu64"
-                              Name 450  "bv"
-                              Name 515  "Block"
-                              MemberName 515(Block) 0  "i16v"
-                              MemberName 515(Block) 1  "u16"
-                              Name 517  "block"
-                              Name 519  "iu16v"
-                              Name 521  "ii16"
-                              Name 522  "si64"
-                              Name 523  "su64"
-                              Name 524  "si"
-                              Name 525  "su"
-                              Name 526  "sb"
-                              Name 527  "si16"
-                              Name 528  "su16"
-                              Name 529  "i16_to_b"
-                              Name 530  "u16_to_b"
-                              Name 531  "b_to_i16"
-                              Name 532  "b_to_u16"
-                              Name 533  "i16_to_i"
-                              Name 535  "u16_to_i"
-                              Name 536  "i_to_i16"
-                              Name 538  "i_to_u16"
-                              Name 540  "i16_to_u"
-                              Name 541  "u16_to_u"
-                              Name 543  "u_to_i16"
-                              Name 544  "u_to_u16"
-                              Name 545  "i16_to_i64"
-                              Name 548  "u16_to_i64"
-                              Name 549  "i64_to_i16"
-                              Name 551  "i64_to_u16"
-                              Name 553  "i16_to_u64"
-                              Name 554  "u16_to_u64"
-                              Name 556  "u64_to_i16"
-                              Name 557  "u64_to_u16"
-                              Name 558  "i16_to_u16"
-                              Name 559  "u16_to_i16"
+                              Name 420  "packi"
+                              Name 425  "packu"
+                              Name 436  "packi64"
+                              Name 445  "packu64"
+                              Name 454  "bv"
+                              Name 531  "Block"
+                              MemberName 531(Block) 0  "i16v"
+                              MemberName 531(Block) 1  "u16"
+                              Name 533  "block"
+                              Name 535  "iu16v"
+                              Name 537  "ii16"
+                              Name 538  "si64"
+                              Name 539  "su64"
+                              Name 540  "si"
+                              Name 541  "su"
+                              Name 542  "sb"
+                              Name 543  "si16"
+                              Name 544  "su16"
+                              Name 545  "i16_to_b"
+                              Name 546  "u16_to_b"
+                              Name 547  "b_to_i16"
+                              Name 548  "b_to_u16"
+                              Name 549  "i16_to_i"
+                              Name 551  "u16_to_i"
+                              Name 552  "i_to_i16"
+                              Name 554  "i_to_u16"
+                              Name 556  "i16_to_u"
+                              Name 557  "u16_to_u"
+                              Name 559  "u_to_i16"
+                              Name 560  "u_to_u16"
+                              Name 561  "i16_to_i64"
+                              Name 564  "u16_to_i64"
+                              Name 565  "i64_to_i16"
+                              Name 567  "i64_to_u16"
+                              Name 569  "i16_to_u64"
+                              Name 570  "u16_to_u64"
+                              Name 572  "u64_to_i16"
+                              Name 573  "u64_to_u16"
+                              Name 574  "i16_to_u16"
+                              Name 575  "u16_to_i16"
                               MemberDecorate 25(Uniforms) 0 Offset 0
                               Decorate 25(Uniforms) Block
                               Decorate 27 DescriptorSet 0
                               Decorate 27 Binding 0
-                              MemberDecorate 515(Block) 0 Offset 0
-                              MemberDecorate 515(Block) 1 Offset 6
-                              Decorate 515(Block) Block
-                              Decorate 517(block) DescriptorSet 0
-                              Decorate 517(block) Binding 1
-                              Decorate 519(iu16v) Flat
-                              Decorate 519(iu16v) Location 0
-                              Decorate 521(ii16) Flat
-                              Decorate 521(ii16) Location 1
-                              Decorate 522(si64) SpecId 100
-                              Decorate 523(su64) SpecId 101
-                              Decorate 524(si) SpecId 102
-                              Decorate 525(su) SpecId 103
-                              Decorate 526(sb) SpecId 104
-                              Decorate 527(si16) SpecId 105
-                              Decorate 528(su16) SpecId 106
+                              MemberDecorate 531(Block) 0 Offset 0
+                              MemberDecorate 531(Block) 1 Offset 6
+                              Decorate 531(Block) Block
+                              Decorate 533(block) DescriptorSet 0
+                              Decorate 533(block) Binding 1
+                              Decorate 535(iu16v) Flat
+                              Decorate 535(iu16v) Location 0
+                              Decorate 537(ii16) Flat
+                              Decorate 537(ii16) Location 1
+                              Decorate 538(si64) SpecId 100
+                              Decorate 539(su64) SpecId 101
+                              Decorate 540(si) SpecId 102
+                              Decorate 541(su) SpecId 103
+                              Decorate 542(sb) SpecId 104
+                              Decorate 543(si16) SpecId 105
+                              Decorate 544(su16) SpecId 106
                2:             TypeVoid
                3:             TypeFunction 2
               14:             TypeInt 16 0
@@ -194,62 +194,62 @@
              395:             TypePointer Function 54(i16vec3)
     397(ResType):             TypeStruct 391(f16vec3) 54(i16vec3)
              407:             TypePointer Function 261(float16_t)
-             431:             TypePointer Function 273(int64_t)
-             434:             TypeVector 17(int16_t) 4
-             440:             TypePointer Function 285(int64_t)
-             443:             TypeVector 14(int16_t) 4
-             449:             TypePointer Function 388(bvec3)
-      515(Block):             TypeStruct 54(i16vec3) 14(int16_t)
-             516:             TypePointer Uniform 515(Block)
-      517(block):    516(ptr) Variable Uniform
-             518:             TypePointer Input 49(i16vec3)
-      519(iu16v):    518(ptr) Variable Input
-             520:             TypePointer Input 17(int16_t)
-       521(ii16):    520(ptr) Variable Input
-       522(si64):273(int64_t) SpecConstant 4294967286 4294967295
-       523(su64):285(int64_t) SpecConstant 20 0
-         524(si):     28(int) SpecConstant 4294967291
-         525(su):     18(int) SpecConstant 4
-         526(sb):   125(bool) SpecConstantTrue
-       527(si16): 17(int16_t) SpecConstant 4294967291
-       528(su16): 14(int16_t) SpecConstant 4
-   529(i16_to_b):   125(bool) SpecConstantOp 171 527(si16) 202
-   530(u16_to_b):   125(bool) SpecConstantOp 171 528(su16) 202
-   531(b_to_i16): 17(int16_t) SpecConstantOp 169 526(sb) 53 194
-   532(b_to_u16): 14(int16_t) SpecConstantOp 169 526(sb) 203 202
-   533(i16_to_i):     28(int) SpecConstantOp 114 527(si16)
-             534:     18(int) SpecConstantOp 113 528(su16)
-   535(u16_to_i):     28(int) SpecConstantOp 128 534 128
-   536(i_to_i16): 17(int16_t) SpecConstantOp 114 524(si)
-             537: 17(int16_t) SpecConstantOp 114 524(si)
-   538(i_to_u16): 14(int16_t) SpecConstantOp 128 537 202
-             539:     28(int) SpecConstantOp 114 527(si16)
-   540(i16_to_u):     18(int) SpecConstantOp 128 539 128
-   541(u16_to_u):     18(int) SpecConstantOp 113 528(su16)
-             542: 14(int16_t) SpecConstantOp 113 525(su)
-   543(u_to_i16): 17(int16_t) SpecConstantOp 128 542 202
-   544(u_to_u16): 14(int16_t) SpecConstantOp 113 525(su)
- 545(i16_to_i64):273(int64_t) SpecConstantOp 114 527(si16)
-             546:285(int64_t) SpecConstantOp 113 528(su16)
-             547:285(int64_t) Constant 0 0
- 548(u16_to_i64):273(int64_t) SpecConstantOp 128 546 547
- 549(i64_to_i16): 17(int16_t) SpecConstantOp 114 522(si64)
-             550: 17(int16_t) SpecConstantOp 114 522(si64)
- 551(i64_to_u16): 14(int16_t) SpecConstantOp 128 550 202
-             552:273(int64_t) SpecConstantOp 114 527(si16)
- 553(i16_to_u64):285(int64_t) SpecConstantOp 128 552 547
- 554(u16_to_u64):285(int64_t) SpecConstantOp 113 528(su16)
-             555: 14(int16_t) SpecConstantOp 113 523(su64)
- 556(u64_to_i16): 17(int16_t) SpecConstantOp 128 555 202
- 557(u64_to_u16): 14(int16_t) SpecConstantOp 113 523(su64)
- 558(i16_to_u16): 14(int16_t) SpecConstantOp 128 527(si16) 202
- 559(u16_to_i16): 17(int16_t) SpecConstantOp 128 528(su16) 202
+             435:             TypePointer Function 273(int64_t)
+             438:             TypeVector 17(int16_t) 4
+             444:             TypePointer Function 285(int64_t)
+             447:             TypeVector 14(int16_t) 4
+             453:             TypePointer Function 388(bvec3)
+      531(Block):             TypeStruct 54(i16vec3) 14(int16_t)
+             532:             TypePointer Uniform 531(Block)
+      533(block):    532(ptr) Variable Uniform
+             534:             TypePointer Input 49(i16vec3)
+      535(iu16v):    534(ptr) Variable Input
+             536:             TypePointer Input 17(int16_t)
+       537(ii16):    536(ptr) Variable Input
+       538(si64):273(int64_t) SpecConstant 4294967286 4294967295
+       539(su64):285(int64_t) SpecConstant 20 0
+         540(si):     28(int) SpecConstant 4294967291
+         541(su):     18(int) SpecConstant 4
+         542(sb):   125(bool) SpecConstantTrue
+       543(si16): 17(int16_t) SpecConstant 4294967291
+       544(su16): 14(int16_t) SpecConstant 4
+   545(i16_to_b):   125(bool) SpecConstantOp 171 543(si16) 202
+   546(u16_to_b):   125(bool) SpecConstantOp 171 544(su16) 202
+   547(b_to_i16): 17(int16_t) SpecConstantOp 169 542(sb) 53 194
+   548(b_to_u16): 14(int16_t) SpecConstantOp 169 542(sb) 203 202
+   549(i16_to_i):     28(int) SpecConstantOp 114 543(si16)
+             550:     18(int) SpecConstantOp 113 544(su16)
+   551(u16_to_i):     28(int) SpecConstantOp 128 550 128
+   552(i_to_i16): 17(int16_t) SpecConstantOp 114 540(si)
+             553: 17(int16_t) SpecConstantOp 114 540(si)
+   554(i_to_u16): 14(int16_t) SpecConstantOp 128 553 202
+             555:     28(int) SpecConstantOp 114 543(si16)
+   556(i16_to_u):     18(int) SpecConstantOp 128 555 128
+   557(u16_to_u):     18(int) SpecConstantOp 113 544(su16)
+             558: 14(int16_t) SpecConstantOp 113 541(su)
+   559(u_to_i16): 17(int16_t) SpecConstantOp 128 558 202
+   560(u_to_u16): 14(int16_t) SpecConstantOp 113 541(su)
+ 561(i16_to_i64):273(int64_t) SpecConstantOp 114 543(si16)
+             562:285(int64_t) SpecConstantOp 113 544(su16)
+             563:285(int64_t) Constant 0 0
+ 564(u16_to_i64):273(int64_t) SpecConstantOp 128 562 563
+ 565(i64_to_i16): 17(int16_t) SpecConstantOp 114 538(si64)
+             566: 17(int16_t) SpecConstantOp 114 538(si64)
+ 567(i64_to_u16): 14(int16_t) SpecConstantOp 128 566 202
+             568:273(int64_t) SpecConstantOp 114 543(si16)
+ 569(i16_to_u64):285(int64_t) SpecConstantOp 128 568 563
+ 570(u16_to_u64):285(int64_t) SpecConstantOp 113 544(su16)
+             571: 14(int16_t) SpecConstantOp 113 539(su64)
+ 572(u64_to_i16): 17(int16_t) SpecConstantOp 128 571 202
+ 573(u64_to_u16): 14(int16_t) SpecConstantOp 113 539(su64)
+ 574(i16_to_u16): 14(int16_t) SpecConstantOp 128 543(si16) 202
+ 575(u16_to_i16): 17(int16_t) SpecConstantOp 128 544(su16) 202
          4(main):           2 Function None 3
                5:             Label
-             511:           2 FunctionCall 6(literal()
-             512:           2 FunctionCall 8(operators()
-             513:           2 FunctionCall 10(typeCast()
-             514:           2 FunctionCall 12(builtinFuncs()
+             527:           2 FunctionCall 6(literal()
+             528:           2 FunctionCall 8(operators()
+             529:           2 FunctionCall 10(typeCast()
+             530:           2 FunctionCall 12(builtinFuncs()
                               Return
                               FunctionEnd
      6(literal():           2 Function None 3
@@ -568,11 +568,11 @@
         321(u16):     15(ptr) Variable Function
        393(f16v):    392(ptr) Variable Function
         396(exp):    395(ptr) Variable Function
-      418(packi):    158(ptr) Variable Function
-      423(packu):    147(ptr) Variable Function
-    432(packi64):    431(ptr) Variable Function
-    441(packu64):    440(ptr) Variable Function
-         450(bv):    449(ptr) Variable Function
+      420(packi):    158(ptr) Variable Function
+      425(packu):    147(ptr) Variable Function
+    436(packi64):    435(ptr) Variable Function
+    445(packu64):    444(ptr) Variable Function
+         454(bv):    453(ptr) Variable Function
              306:187(i16vec2) Load 305(i16v)
              307:187(i16vec2) ExtInst 1(GLSL.std.450) 5(SAbs) 306
                               Store 305(i16v) 307
@@ -686,114 +686,138 @@
                               Store 411 410
              412:187(i16vec2) Load 305(i16v)
              413:262(f16vec2) Bitcast 412
-             414:391(f16vec3) Load 393(f16v)
-             415:391(f16vec3) VectorShuffle 414 413 3 4 2
-                              Store 393(f16v) 415
-             416: 49(i16vec3) Load 319(u16v)
-             417:391(f16vec3) Bitcast 416
-                              Store 393(f16v) 417
-             419:187(i16vec2) Load 305(i16v)
-             420:     28(int) Bitcast 419
-                              Store 418(packi) 420
-             421:     28(int) Load 418(packi)
-             422:187(i16vec2) Bitcast 421
-                              Store 305(i16v) 422
-             424: 49(i16vec3) Load 319(u16v)
-             425:198(i16vec2) VectorShuffle 424 424 0 1
-             426:     18(int) Bitcast 425
-                              Store 423(packu) 426
-             427:     18(int) Load 423(packu)
-             428:198(i16vec2) Bitcast 427
-             429: 49(i16vec3) Load 319(u16v)
-             430: 49(i16vec3) VectorShuffle 429 428 3 4 2
-                              Store 319(u16v) 430
-             433: 17(int16_t) Load 311(i16)
-             435:434(i16vec4) CompositeConstruct 433 433 433 433
-             436:273(int64_t) Bitcast 435
-                              Store 432(packi64) 436
-             437:273(int64_t) Load 432(packi64)
-             438:434(i16vec4) Bitcast 437
-             439:187(i16vec2) VectorShuffle 438 438 0 1
-                              Store 305(i16v) 439
-             442: 14(int16_t) Load 321(u16)
-             444:443(i16vec4) CompositeConstruct 442 442 442 442
-             445:285(int64_t) Bitcast 444
-                              Store 441(packu64) 445
-             446:285(int64_t) Load 441(packu64)
-             447:443(i16vec4) Bitcast 446
-             448: 49(i16vec3) VectorShuffle 447 447 0 1 2
-                              Store 319(u16v) 448
-             451: 49(i16vec3) Load 319(u16v)
-             452: 14(int16_t) Load 321(u16)
-             453: 49(i16vec3) CompositeConstruct 452 452 452
-             454:  388(bvec3) ULessThan 451 453
-                              Store 450(bv) 454
-             455:187(i16vec2) Load 305(i16v)
-             456: 17(int16_t) Load 311(i16)
-             457:187(i16vec2) CompositeConstruct 456 456
-             458:  190(bvec2) SLessThan 455 457
-             459:  388(bvec3) Load 450(bv)
-             460:  388(bvec3) VectorShuffle 459 458 3 4 2
-                              Store 450(bv) 460
-             461: 49(i16vec3) Load 319(u16v)
-             462: 14(int16_t) Load 321(u16)
-             463: 49(i16vec3) CompositeConstruct 462 462 462
-             464:  388(bvec3) ULessThanEqual 461 463
-                              Store 450(bv) 464
-             465:187(i16vec2) Load 305(i16v)
-             466: 17(int16_t) Load 311(i16)
-             467:187(i16vec2) CompositeConstruct 466 466
-             468:  190(bvec2) SLessThanEqual 465 467
-             469:  388(bvec3) Load 450(bv)
-             470:  388(bvec3) VectorShuffle 469 468 3 4 2
-                              Store 450(bv) 470
-             471: 49(i16vec3) Load 319(u16v)
-             472: 14(int16_t) Load 321(u16)
-             473: 49(i16vec3) CompositeConstruct 472 472 472
-             474:  388(bvec3) UGreaterThan 471 473
-                              Store 450(bv) 474
-             475:187(i16vec2) Load 305(i16v)
-             476: 17(int16_t) Load 311(i16)
-             477:187(i16vec2) CompositeConstruct 476 476
-             478:  190(bvec2) SGreaterThan 475 477
-             479:  388(bvec3) Load 450(bv)
-             480:  388(bvec3) VectorShuffle 479 478 3 4 2
-                              Store 450(bv) 480
-             481: 49(i16vec3) Load 319(u16v)
-             482: 14(int16_t) Load 321(u16)
-             483: 49(i16vec3) CompositeConstruct 482 482 482
-             484:  388(bvec3) UGreaterThanEqual 481 483
-                              Store 450(bv) 484
-             485:187(i16vec2) Load 305(i16v)
-             486: 17(int16_t) Load 311(i16)
-             487:187(i16vec2) CompositeConstruct 486 486
-             488:  190(bvec2) SGreaterThanEqual 485 487
-             489:  388(bvec3) Load 450(bv)
-             490:  388(bvec3) VectorShuffle 489 488 3 4 2
-                              Store 450(bv) 490
+             414:    407(ptr) AccessChain 393(f16v) 128
+             415:261(float16_t) CompositeExtract 413 0
+                              Store 414 415
+             416:    407(ptr) AccessChain 393(f16v) 111
+             417:261(float16_t) CompositeExtract 413 1
+                              Store 416 417
+             418: 49(i16vec3) Load 319(u16v)
+             419:391(f16vec3) Bitcast 418
+                              Store 393(f16v) 419
+             421:187(i16vec2) Load 305(i16v)
+             422:     28(int) Bitcast 421
+                              Store 420(packi) 422
+             423:     28(int) Load 420(packi)
+             424:187(i16vec2) Bitcast 423
+                              Store 305(i16v) 424
+             426: 49(i16vec3) Load 319(u16v)
+             427:198(i16vec2) VectorShuffle 426 426 0 1
+             428:     18(int) Bitcast 427
+                              Store 425(packu) 428
+             429:     18(int) Load 425(packu)
+             430:198(i16vec2) Bitcast 429
+             431:     15(ptr) AccessChain 319(u16v) 128
+             432: 14(int16_t) CompositeExtract 430 0
+                              Store 431 432
+             433:     15(ptr) AccessChain 319(u16v) 111
+             434: 14(int16_t) CompositeExtract 430 1
+                              Store 433 434
+             437: 17(int16_t) Load 311(i16)
+             439:438(i16vec4) CompositeConstruct 437 437 437 437
+             440:273(int64_t) Bitcast 439
+                              Store 436(packi64) 440
+             441:273(int64_t) Load 436(packi64)
+             442:438(i16vec4) Bitcast 441
+             443:187(i16vec2) VectorShuffle 442 442 0 1
+                              Store 305(i16v) 443
+             446: 14(int16_t) Load 321(u16)
+             448:447(i16vec4) CompositeConstruct 446 446 446 446
+             449:285(int64_t) Bitcast 448
+                              Store 445(packu64) 449
+             450:285(int64_t) Load 445(packu64)
+             451:447(i16vec4) Bitcast 450
+             452: 49(i16vec3) VectorShuffle 451 451 0 1 2
+                              Store 319(u16v) 452
+             455: 49(i16vec3) Load 319(u16v)
+             456: 14(int16_t) Load 321(u16)
+             457: 49(i16vec3) CompositeConstruct 456 456 456
+             458:  388(bvec3) ULessThan 455 457
+                              Store 454(bv) 458
+             459:187(i16vec2) Load 305(i16v)
+             460: 17(int16_t) Load 311(i16)
+             461:187(i16vec2) CompositeConstruct 460 460
+             462:  190(bvec2) SLessThan 459 461
+             463:    126(ptr) AccessChain 454(bv) 128
+             464:   125(bool) CompositeExtract 462 0
+                              Store 463 464
+             465:    126(ptr) AccessChain 454(bv) 111
+             466:   125(bool) CompositeExtract 462 1
+                              Store 465 466
+             467: 49(i16vec3) Load 319(u16v)
+             468: 14(int16_t) Load 321(u16)
+             469: 49(i16vec3) CompositeConstruct 468 468 468
+             470:  388(bvec3) ULessThanEqual 467 469
+                              Store 454(bv) 470
+             471:187(i16vec2) Load 305(i16v)
+             472: 17(int16_t) Load 311(i16)
+             473:187(i16vec2) CompositeConstruct 472 472
+             474:  190(bvec2) SLessThanEqual 471 473
+             475:    126(ptr) AccessChain 454(bv) 128
+             476:   125(bool) CompositeExtract 474 0
+                              Store 475 476
+             477:    126(ptr) AccessChain 454(bv) 111
+             478:   125(bool) CompositeExtract 474 1
+                              Store 477 478
+             479: 49(i16vec3) Load 319(u16v)
+             480: 14(int16_t) Load 321(u16)
+             481: 49(i16vec3) CompositeConstruct 480 480 480
+             482:  388(bvec3) UGreaterThan 479 481
+                              Store 454(bv) 482
+             483:187(i16vec2) Load 305(i16v)
+             484: 17(int16_t) Load 311(i16)
+             485:187(i16vec2) CompositeConstruct 484 484
+             486:  190(bvec2) SGreaterThan 483 485
+             487:    126(ptr) AccessChain 454(bv) 128
+             488:   125(bool) CompositeExtract 486 0
+                              Store 487 488
+             489:    126(ptr) AccessChain 454(bv) 111
+             490:   125(bool) CompositeExtract 486 1
+                              Store 489 490
              491: 49(i16vec3) Load 319(u16v)
              492: 14(int16_t) Load 321(u16)
              493: 49(i16vec3) CompositeConstruct 492 492 492
-             494:  388(bvec3) IEqual 491 493
-                              Store 450(bv) 494
+             494:  388(bvec3) UGreaterThanEqual 491 493
+                              Store 454(bv) 494
              495:187(i16vec2) Load 305(i16v)
              496: 17(int16_t) Load 311(i16)
              497:187(i16vec2) CompositeConstruct 496 496
-             498:  190(bvec2) IEqual 495 497
-             499:  388(bvec3) Load 450(bv)
-             500:  388(bvec3) VectorShuffle 499 498 3 4 2
-                              Store 450(bv) 500
-             501: 49(i16vec3) Load 319(u16v)
-             502: 14(int16_t) Load 321(u16)
-             503: 49(i16vec3) CompositeConstruct 502 502 502
-             504:  388(bvec3) INotEqual 501 503
-                              Store 450(bv) 504
-             505:187(i16vec2) Load 305(i16v)
-             506: 17(int16_t) Load 311(i16)
-             507:187(i16vec2) CompositeConstruct 506 506
-             508:  190(bvec2) INotEqual 505 507
-             509:  388(bvec3) Load 450(bv)
-             510:  388(bvec3) VectorShuffle 509 508 3 4 2
-                              Store 450(bv) 510
+             498:  190(bvec2) SGreaterThanEqual 495 497
+             499:    126(ptr) AccessChain 454(bv) 128
+             500:   125(bool) CompositeExtract 498 0
+                              Store 499 500
+             501:    126(ptr) AccessChain 454(bv) 111
+             502:   125(bool) CompositeExtract 498 1
+                              Store 501 502
+             503: 49(i16vec3) Load 319(u16v)
+             504: 14(int16_t) Load 321(u16)
+             505: 49(i16vec3) CompositeConstruct 504 504 504
+             506:  388(bvec3) IEqual 503 505
+                              Store 454(bv) 506
+             507:187(i16vec2) Load 305(i16v)
+             508: 17(int16_t) Load 311(i16)
+             509:187(i16vec2) CompositeConstruct 508 508
+             510:  190(bvec2) IEqual 507 509
+             511:    126(ptr) AccessChain 454(bv) 128
+             512:   125(bool) CompositeExtract 510 0
+                              Store 511 512
+             513:    126(ptr) AccessChain 454(bv) 111
+             514:   125(bool) CompositeExtract 510 1
+                              Store 513 514
+             515: 49(i16vec3) Load 319(u16v)
+             516: 14(int16_t) Load 321(u16)
+             517: 49(i16vec3) CompositeConstruct 516 516 516
+             518:  388(bvec3) INotEqual 515 517
+                              Store 454(bv) 518
+             519:187(i16vec2) Load 305(i16v)
+             520: 17(int16_t) Load 311(i16)
+             521:187(i16vec2) CompositeConstruct 520 520
+             522:  190(bvec2) INotEqual 519 521
+             523:    126(ptr) AccessChain 454(bv) 128
+             524:   125(bool) CompositeExtract 522 0
+                              Store 523 524
+             525:    126(ptr) AccessChain 454(bv) 111
+             526:   125(bool) CompositeExtract 522 1
+                              Store 525 526
                               Return
                               FunctionEnd
diff --git a/third_party/vulkan-deps/glslang/src/Test/baseResults/spv.int16.frag.out b/third_party/vulkan-deps/glslang/src/Test/baseResults/spv.int16.frag.out
index b58e718..43cb09f 100644
--- a/third_party/vulkan-deps/glslang/src/Test/baseResults/spv.int16.frag.out
+++ b/third_party/vulkan-deps/glslang/src/Test/baseResults/spv.int16.frag.out
@@ -1,7 +1,7 @@
 spv.int16.frag
 // Module Version 10000
 // Generated by (magic number): 8000a
-// Id's are bound by 523
+// Id's are bound by 535
 
                               Capability Shader
                               Capability Float16
@@ -66,35 +66,35 @@
                               Name 442  "u64"
                               Name 445  "u16v4"
                               Name 457  "bv"
-                              Name 518  "Block"
-                              MemberName 518(Block) 0  "i16"
-                              MemberName 518(Block) 1  "i16v2"
-                              MemberName 518(Block) 2  "i16v3"
-                              MemberName 518(Block) 3  "i16v4"
-                              MemberName 518(Block) 4  "u16"
-                              MemberName 518(Block) 5  "u16v2"
-                              MemberName 518(Block) 6  "u16v3"
-                              MemberName 518(Block) 7  "u16v4"
-                              Name 520  "block"
-                              Name 521  "si16"
-                              Name 522  "su16"
+                              Name 530  "Block"
+                              MemberName 530(Block) 0  "i16"
+                              MemberName 530(Block) 1  "i16v2"
+                              MemberName 530(Block) 2  "i16v3"
+                              MemberName 530(Block) 3  "i16v4"
+                              MemberName 530(Block) 4  "u16"
+                              MemberName 530(Block) 5  "u16v2"
+                              MemberName 530(Block) 6  "u16v3"
+                              MemberName 530(Block) 7  "u16v4"
+                              Name 532  "block"
+                              Name 533  "si16"
+                              Name 534  "su16"
                               MemberDecorate 24(Uniforms) 0 Offset 0
                               Decorate 24(Uniforms) Block
                               Decorate 26 DescriptorSet 0
                               Decorate 26 Binding 0
-                              MemberDecorate 518(Block) 0 Offset 0
-                              MemberDecorate 518(Block) 1 Offset 4
-                              MemberDecorate 518(Block) 2 Offset 8
-                              MemberDecorate 518(Block) 3 Offset 16
-                              MemberDecorate 518(Block) 4 Offset 24
-                              MemberDecorate 518(Block) 5 Offset 28
-                              MemberDecorate 518(Block) 6 Offset 32
-                              MemberDecorate 518(Block) 7 Offset 40
-                              Decorate 518(Block) Block
-                              Decorate 520(block) DescriptorSet 0
-                              Decorate 520(block) Binding 1
-                              Decorate 521(si16) SpecId 100
-                              Decorate 522(su16) SpecId 101
+                              MemberDecorate 530(Block) 0 Offset 0
+                              MemberDecorate 530(Block) 1 Offset 4
+                              MemberDecorate 530(Block) 2 Offset 8
+                              MemberDecorate 530(Block) 3 Offset 16
+                              MemberDecorate 530(Block) 4 Offset 24
+                              MemberDecorate 530(Block) 5 Offset 28
+                              MemberDecorate 530(Block) 6 Offset 32
+                              MemberDecorate 530(Block) 7 Offset 40
+                              Decorate 530(Block) Block
+                              Decorate 532(block) DescriptorSet 0
+                              Decorate 532(block) Binding 1
+                              Decorate 533(si16) SpecId 100
+                              Decorate 534(su16) SpecId 101
                2:             TypeVoid
                3:             TypeFunction 2
               14:             TypeInt 16 1
@@ -186,11 +186,11 @@
              443:             TypeVector 36(int16_t) 4
              444:             TypePointer Function 443(i16vec4)
              456:             TypePointer Function 425(bvec3)
-      518(Block):             TypeStruct 14(int16_t) 52(i16vec2) 197(i16vec3) 432(i16vec4) 36(int16_t) 57(i16vec2) 193(i16vec3) 443(i16vec4)
-             519:             TypePointer Uniform 518(Block)
-      520(block):    519(ptr) Variable Uniform
-       521(si16): 14(int16_t) SpecConstant 4294967286
-       522(su16): 36(int16_t) SpecConstant 20
+      530(Block):             TypeStruct 14(int16_t) 52(i16vec2) 197(i16vec3) 432(i16vec4) 36(int16_t) 57(i16vec2) 193(i16vec3) 443(i16vec4)
+             531:             TypePointer Uniform 530(Block)
+      532(block):    531(ptr) Variable Uniform
+       533(si16): 14(int16_t) SpecConstant 4294967286
+       534(su16): 36(int16_t) SpecConstant 20
          4(main):           2 Function None 3
                5:             Label
                               Return
@@ -675,68 +675,86 @@
              463: 14(int16_t) Load 346(i16)
              464: 52(i16vec2) CompositeConstruct 463 463
              465:  174(bvec2) SLessThan 462 464
-             466:  425(bvec3) Load 457(bv)
-             467:  425(bvec3) VectorShuffle 466 465 3 4 2
-                              Store 457(bv) 467
-             468:193(i16vec3) Load 356(u16v)
-             469: 36(int16_t) Load 358(u16)
-             470:193(i16vec3) CompositeConstruct 469 469 469
-             471:  425(bvec3) ULessThanEqual 468 470
-                              Store 457(bv) 471
-             472: 52(i16vec2) Load 343(i16v)
-             473: 14(int16_t) Load 346(i16)
-             474: 52(i16vec2) CompositeConstruct 473 473
-             475:  174(bvec2) SLessThanEqual 472 474
-             476:  425(bvec3) Load 457(bv)
-             477:  425(bvec3) VectorShuffle 476 475 3 4 2
-                              Store 457(bv) 477
-             478:193(i16vec3) Load 356(u16v)
-             479: 36(int16_t) Load 358(u16)
-             480:193(i16vec3) CompositeConstruct 479 479 479
-             481:  425(bvec3) UGreaterThan 478 480
-                              Store 457(bv) 481
-             482: 52(i16vec2) Load 343(i16v)
-             483: 14(int16_t) Load 346(i16)
-             484: 52(i16vec2) CompositeConstruct 483 483
-             485:  174(bvec2) SGreaterThan 482 484
-             486:  425(bvec3) Load 457(bv)
-             487:  425(bvec3) VectorShuffle 486 485 3 4 2
-                              Store 457(bv) 487
-             488:193(i16vec3) Load 356(u16v)
-             489: 36(int16_t) Load 358(u16)
-             490:193(i16vec3) CompositeConstruct 489 489 489
-             491:  425(bvec3) UGreaterThanEqual 488 490
-                              Store 457(bv) 491
-             492: 52(i16vec2) Load 343(i16v)
-             493: 14(int16_t) Load 346(i16)
-             494: 52(i16vec2) CompositeConstruct 493 493
-             495:  174(bvec2) SGreaterThanEqual 492 494
-             496:  425(bvec3) Load 457(bv)
-             497:  425(bvec3) VectorShuffle 496 495 3 4 2
+             466:    280(ptr) AccessChain 457(bv) 282
+             467:   173(bool) CompositeExtract 465 0
+                              Store 466 467
+             468:    280(ptr) AccessChain 457(bv) 264
+             469:   173(bool) CompositeExtract 465 1
+                              Store 468 469
+             470:193(i16vec3) Load 356(u16v)
+             471: 36(int16_t) Load 358(u16)
+             472:193(i16vec3) CompositeConstruct 471 471 471
+             473:  425(bvec3) ULessThanEqual 470 472
+                              Store 457(bv) 473
+             474: 52(i16vec2) Load 343(i16v)
+             475: 14(int16_t) Load 346(i16)
+             476: 52(i16vec2) CompositeConstruct 475 475
+             477:  174(bvec2) SLessThanEqual 474 476
+             478:    280(ptr) AccessChain 457(bv) 282
+             479:   173(bool) CompositeExtract 477 0
+                              Store 478 479
+             480:    280(ptr) AccessChain 457(bv) 264
+             481:   173(bool) CompositeExtract 477 1
+                              Store 480 481
+             482:193(i16vec3) Load 356(u16v)
+             483: 36(int16_t) Load 358(u16)
+             484:193(i16vec3) CompositeConstruct 483 483 483
+             485:  425(bvec3) UGreaterThan 482 484
+                              Store 457(bv) 485
+             486: 52(i16vec2) Load 343(i16v)
+             487: 14(int16_t) Load 346(i16)
+             488: 52(i16vec2) CompositeConstruct 487 487
+             489:  174(bvec2) SGreaterThan 486 488
+             490:    280(ptr) AccessChain 457(bv) 282
+             491:   173(bool) CompositeExtract 489 0
+                              Store 490 491
+             492:    280(ptr) AccessChain 457(bv) 264
+             493:   173(bool) CompositeExtract 489 1
+                              Store 492 493
+             494:193(i16vec3) Load 356(u16v)
+             495: 36(int16_t) Load 358(u16)
+             496:193(i16vec3) CompositeConstruct 495 495 495
+             497:  425(bvec3) UGreaterThanEqual 494 496
                               Store 457(bv) 497
-             498:193(i16vec3) Load 356(u16v)
-             499: 36(int16_t) Load 358(u16)
-             500:193(i16vec3) CompositeConstruct 499 499 499
-             501:  425(bvec3) IEqual 498 500
-                              Store 457(bv) 501
-             502: 52(i16vec2) Load 343(i16v)
-             503: 14(int16_t) Load 346(i16)
-             504: 52(i16vec2) CompositeConstruct 503 503
-             505:  174(bvec2) IEqual 502 504
-             506:  425(bvec3) Load 457(bv)
-             507:  425(bvec3) VectorShuffle 506 505 3 4 2
-                              Store 457(bv) 507
-             508:193(i16vec3) Load 356(u16v)
-             509: 36(int16_t) Load 358(u16)
-             510:193(i16vec3) CompositeConstruct 509 509 509
-             511:  425(bvec3) INotEqual 508 510
-                              Store 457(bv) 511
-             512: 52(i16vec2) Load 343(i16v)
-             513: 14(int16_t) Load 346(i16)
-             514: 52(i16vec2) CompositeConstruct 513 513
-             515:  174(bvec2) INotEqual 512 514
-             516:  425(bvec3) Load 457(bv)
-             517:  425(bvec3) VectorShuffle 516 515 3 4 2
-                              Store 457(bv) 517
+             498: 52(i16vec2) Load 343(i16v)
+             499: 14(int16_t) Load 346(i16)
+             500: 52(i16vec2) CompositeConstruct 499 499
+             501:  174(bvec2) SGreaterThanEqual 498 500
+             502:    280(ptr) AccessChain 457(bv) 282
+             503:   173(bool) CompositeExtract 501 0
+                              Store 502 503
+             504:    280(ptr) AccessChain 457(bv) 264
+             505:   173(bool) CompositeExtract 501 1
+                              Store 504 505
+             506:193(i16vec3) Load 356(u16v)
+             507: 36(int16_t) Load 358(u16)
+             508:193(i16vec3) CompositeConstruct 507 507 507
+             509:  425(bvec3) IEqual 506 508
+                              Store 457(bv) 509
+             510: 52(i16vec2) Load 343(i16v)
+             511: 14(int16_t) Load 346(i16)
+             512: 52(i16vec2) CompositeConstruct 511 511
+             513:  174(bvec2) IEqual 510 512
+             514:    280(ptr) AccessChain 457(bv) 282
+             515:   173(bool) CompositeExtract 513 0
+                              Store 514 515
+             516:    280(ptr) AccessChain 457(bv) 264
+             517:   173(bool) CompositeExtract 513 1
+                              Store 516 517
+             518:193(i16vec3) Load 356(u16v)
+             519: 36(int16_t) Load 358(u16)
+             520:193(i16vec3) CompositeConstruct 519 519 519
+             521:  425(bvec3) INotEqual 518 520
+                              Store 457(bv) 521
+             522: 52(i16vec2) Load 343(i16v)
+             523: 14(int16_t) Load 346(i16)
+             524: 52(i16vec2) CompositeConstruct 523 523
+             525:  174(bvec2) INotEqual 522 524
+             526:    280(ptr) AccessChain 457(bv) 282
+             527:   173(bool) CompositeExtract 525 0
+                              Store 526 527
+             528:    280(ptr) AccessChain 457(bv) 264
+             529:   173(bool) CompositeExtract 525 1
+                              Store 528 529
                               Return
                               FunctionEnd
diff --git a/third_party/vulkan-deps/glslang/src/Test/baseResults/spv.int32.frag.out b/third_party/vulkan-deps/glslang/src/Test/baseResults/spv.int32.frag.out
index 0ef51e8..af232ec 100644
--- a/third_party/vulkan-deps/glslang/src/Test/baseResults/spv.int32.frag.out
+++ b/third_party/vulkan-deps/glslang/src/Test/baseResults/spv.int32.frag.out
@@ -1,7 +1,7 @@
 spv.int32.frag
 // Module Version 10300
 // Generated by (magic number): 8000a
-// Id's are bound by 493
+// Id's are bound by 505
 
                               Capability Shader
                               Capability Float16
@@ -65,41 +65,41 @@
                               Name 416  "u32v2"
                               Name 418  "u64"
                               Name 422  "bv"
-                              Name 485  "Block"
-                              MemberName 485(Block) 0  "i32"
-                              MemberName 485(Block) 1  "i32v2"
-                              MemberName 485(Block) 2  "i32v3"
-                              MemberName 485(Block) 3  "i32v4"
-                              MemberName 485(Block) 4  "u32"
-                              MemberName 485(Block) 5  "u32v2"
-                              MemberName 485(Block) 6  "u32v3"
-                              MemberName 485(Block) 7  "u32v4"
-                              Name 487  "block"
-                              Name 488  "si32"
-                              Name 489  "su32"
-                              Name 490  "si"
-                              Name 491  "su"
-                              Name 492  "sb"
+                              Name 497  "Block"
+                              MemberName 497(Block) 0  "i32"
+                              MemberName 497(Block) 1  "i32v2"
+                              MemberName 497(Block) 2  "i32v3"
+                              MemberName 497(Block) 3  "i32v4"
+                              MemberName 497(Block) 4  "u32"
+                              MemberName 497(Block) 5  "u32v2"
+                              MemberName 497(Block) 6  "u32v3"
+                              MemberName 497(Block) 7  "u32v4"
+                              Name 499  "block"
+                              Name 500  "si32"
+                              Name 501  "su32"
+                              Name 502  "si"
+                              Name 503  "su"
+                              Name 504  "sb"
                               MemberDecorate 27(Uniforms) 0 Offset 0
                               Decorate 27(Uniforms) Block
                               Decorate 29 DescriptorSet 0
                               Decorate 29 Binding 0
-                              MemberDecorate 485(Block) 0 Offset 0
-                              MemberDecorate 485(Block) 1 Offset 8
-                              MemberDecorate 485(Block) 2 Offset 16
-                              MemberDecorate 485(Block) 3 Offset 32
-                              MemberDecorate 485(Block) 4 Offset 48
-                              MemberDecorate 485(Block) 5 Offset 56
-                              MemberDecorate 485(Block) 6 Offset 64
-                              MemberDecorate 485(Block) 7 Offset 80
-                              Decorate 485(Block) Block
-                              Decorate 487(block) DescriptorSet 0
-                              Decorate 487(block) Binding 1
-                              Decorate 488(si32) SpecId 100
-                              Decorate 489(su32) SpecId 101
-                              Decorate 490(si) SpecId 102
-                              Decorate 491(su) SpecId 103
-                              Decorate 492(sb) SpecId 104
+                              MemberDecorate 497(Block) 0 Offset 0
+                              MemberDecorate 497(Block) 1 Offset 8
+                              MemberDecorate 497(Block) 2 Offset 16
+                              MemberDecorate 497(Block) 3 Offset 32
+                              MemberDecorate 497(Block) 4 Offset 48
+                              MemberDecorate 497(Block) 5 Offset 56
+                              MemberDecorate 497(Block) 6 Offset 64
+                              MemberDecorate 497(Block) 7 Offset 80
+                              Decorate 497(Block) Block
+                              Decorate 499(block) DescriptorSet 0
+                              Decorate 499(block) Binding 1
+                              Decorate 500(si32) SpecId 100
+                              Decorate 501(su32) SpecId 101
+                              Decorate 502(si) SpecId 102
+                              Decorate 503(su) SpecId 103
+                              Decorate 504(sb) SpecId 104
                2:             TypeVoid
                3:             TypeFunction 2
               14:             TypeInt 32 0
@@ -185,16 +185,16 @@
              406:             TypePointer Function 405(i8vec4)
              417:             TypePointer Function 63(int64_t)
              421:             TypePointer Function 394(bvec3)
-             483:             TypeVector 18(int) 4
-             484:             TypeVector 14(int) 4
-      485(Block):             TypeStruct 18(int) 52(ivec2) 188(ivec3) 483(ivec4) 14(int) 49(ivec2) 184(ivec3) 484(ivec4)
-             486:             TypePointer Uniform 485(Block)
-      487(block):    486(ptr) Variable Uniform
-       488(si32):     18(int) SpecConstant 4294967286
-       489(su32):     14(int) SpecConstant 20
-         490(si):     18(int) SpecConstant 4294967291
-         491(su):     14(int) SpecConstant 4
-         492(sb):   165(bool) SpecConstantTrue
+             495:             TypeVector 18(int) 4
+             496:             TypeVector 14(int) 4
+      497(Block):             TypeStruct 18(int) 52(ivec2) 188(ivec3) 495(ivec4) 14(int) 49(ivec2) 184(ivec3) 496(ivec4)
+             498:             TypePointer Uniform 497(Block)
+      499(block):    498(ptr) Variable Uniform
+       500(si32):     18(int) SpecConstant 4294967286
+       501(su32):     14(int) SpecConstant 20
+         502(si):     18(int) SpecConstant 4294967291
+         503(su):     14(int) SpecConstant 4
+         504(sb):   165(bool) SpecConstantTrue
          4(main):           2 Function None 3
                5:             Label
                               Store 16(u32Max) 17
@@ -645,68 +645,86 @@
              428:     18(int) Load 315(i32)
              429:   52(ivec2) CompositeConstruct 428 428
              430:  166(bvec2) SLessThan 427 429
-             431:  394(bvec3) Load 422(bv)
-             432:  394(bvec3) VectorShuffle 431 430 3 4 2
-                              Store 422(bv) 432
-             433:  184(ivec3) Load 325(u32v)
-             434:     14(int) Load 327(u32)
-             435:  184(ivec3) CompositeConstruct 434 434 434
-             436:  394(bvec3) ULessThanEqual 433 435
-                              Store 422(bv) 436
-             437:   52(ivec2) Load 312(i32v)
-             438:     18(int) Load 315(i32)
-             439:   52(ivec2) CompositeConstruct 438 438
-             440:  166(bvec2) SLessThanEqual 437 439
-             441:  394(bvec3) Load 422(bv)
-             442:  394(bvec3) VectorShuffle 441 440 3 4 2
-                              Store 422(bv) 442
-             443:  184(ivec3) Load 325(u32v)
-             444:     14(int) Load 327(u32)
-             445:  184(ivec3) CompositeConstruct 444 444 444
-             446:  394(bvec3) UGreaterThan 443 445
-                              Store 422(bv) 446
-             447:   52(ivec2) Load 312(i32v)
-             448:     18(int) Load 315(i32)
-             449:   52(ivec2) CompositeConstruct 448 448
-             450:  166(bvec2) SGreaterThan 447 449
-             451:  394(bvec3) Load 422(bv)
-             452:  394(bvec3) VectorShuffle 451 450 3 4 2
-                              Store 422(bv) 452
-             453:  184(ivec3) Load 325(u32v)
-             454:     14(int) Load 327(u32)
-             455:  184(ivec3) CompositeConstruct 454 454 454
-             456:  394(bvec3) UGreaterThanEqual 453 455
-                              Store 422(bv) 456
-             457:   52(ivec2) Load 312(i32v)
-             458:     18(int) Load 315(i32)
-             459:   52(ivec2) CompositeConstruct 458 458
-             460:  166(bvec2) SGreaterThanEqual 457 459
-             461:  394(bvec3) Load 422(bv)
-             462:  394(bvec3) VectorShuffle 461 460 3 4 2
+             431:    259(ptr) AccessChain 422(bv) 175
+             432:   165(bool) CompositeExtract 430 0
+                              Store 431 432
+             433:    259(ptr) AccessChain 422(bv) 176
+             434:   165(bool) CompositeExtract 430 1
+                              Store 433 434
+             435:  184(ivec3) Load 325(u32v)
+             436:     14(int) Load 327(u32)
+             437:  184(ivec3) CompositeConstruct 436 436 436
+             438:  394(bvec3) ULessThanEqual 435 437
+                              Store 422(bv) 438
+             439:   52(ivec2) Load 312(i32v)
+             440:     18(int) Load 315(i32)
+             441:   52(ivec2) CompositeConstruct 440 440
+             442:  166(bvec2) SLessThanEqual 439 441
+             443:    259(ptr) AccessChain 422(bv) 175
+             444:   165(bool) CompositeExtract 442 0
+                              Store 443 444
+             445:    259(ptr) AccessChain 422(bv) 176
+             446:   165(bool) CompositeExtract 442 1
+                              Store 445 446
+             447:  184(ivec3) Load 325(u32v)
+             448:     14(int) Load 327(u32)
+             449:  184(ivec3) CompositeConstruct 448 448 448
+             450:  394(bvec3) UGreaterThan 447 449
+                              Store 422(bv) 450
+             451:   52(ivec2) Load 312(i32v)
+             452:     18(int) Load 315(i32)
+             453:   52(ivec2) CompositeConstruct 452 452
+             454:  166(bvec2) SGreaterThan 451 453
+             455:    259(ptr) AccessChain 422(bv) 175
+             456:   165(bool) CompositeExtract 454 0
+                              Store 455 456
+             457:    259(ptr) AccessChain 422(bv) 176
+             458:   165(bool) CompositeExtract 454 1
+                              Store 457 458
+             459:  184(ivec3) Load 325(u32v)
+             460:     14(int) Load 327(u32)
+             461:  184(ivec3) CompositeConstruct 460 460 460
+             462:  394(bvec3) UGreaterThanEqual 459 461
                               Store 422(bv) 462
-             463:  184(ivec3) Load 325(u32v)
-             464:     14(int) Load 327(u32)
-             465:  184(ivec3) CompositeConstruct 464 464 464
-             466:  394(bvec3) IEqual 463 465
-                              Store 422(bv) 466
-             467:   52(ivec2) Load 312(i32v)
-             468:     18(int) Load 315(i32)
-             469:   52(ivec2) CompositeConstruct 468 468
-             470:  166(bvec2) IEqual 467 469
-             471:  394(bvec3) Load 422(bv)
-             472:  394(bvec3) VectorShuffle 471 470 3 4 2
-                              Store 422(bv) 472
-             473:  184(ivec3) Load 325(u32v)
-             474:     14(int) Load 327(u32)
-             475:  184(ivec3) CompositeConstruct 474 474 474
-             476:  394(bvec3) INotEqual 473 475
-                              Store 422(bv) 476
-             477:   52(ivec2) Load 312(i32v)
-             478:     18(int) Load 315(i32)
-             479:   52(ivec2) CompositeConstruct 478 478
-             480:  166(bvec2) INotEqual 477 479
-             481:  394(bvec3) Load 422(bv)
-             482:  394(bvec3) VectorShuffle 481 480 3 4 2
-                              Store 422(bv) 482
+             463:   52(ivec2) Load 312(i32v)
+             464:     18(int) Load 315(i32)
+             465:   52(ivec2) CompositeConstruct 464 464
+             466:  166(bvec2) SGreaterThanEqual 463 465
+             467:    259(ptr) AccessChain 422(bv) 175
+             468:   165(bool) CompositeExtract 466 0
+                              Store 467 468
+             469:    259(ptr) AccessChain 422(bv) 176
+             470:   165(bool) CompositeExtract 466 1
+                              Store 469 470
+             471:  184(ivec3) Load 325(u32v)
+             472:     14(int) Load 327(u32)
+             473:  184(ivec3) CompositeConstruct 472 472 472
+             474:  394(bvec3) IEqual 471 473
+                              Store 422(bv) 474
+             475:   52(ivec2) Load 312(i32v)
+             476:     18(int) Load 315(i32)
+             477:   52(ivec2) CompositeConstruct 476 476
+             478:  166(bvec2) IEqual 475 477
+             479:    259(ptr) AccessChain 422(bv) 175
+             480:   165(bool) CompositeExtract 478 0
+                              Store 479 480
+             481:    259(ptr) AccessChain 422(bv) 176
+             482:   165(bool) CompositeExtract 478 1
+                              Store 481 482
+             483:  184(ivec3) Load 325(u32v)
+             484:     14(int) Load 327(u32)
+             485:  184(ivec3) CompositeConstruct 484 484 484
+             486:  394(bvec3) INotEqual 483 485
+                              Store 422(bv) 486
+             487:   52(ivec2) Load 312(i32v)
+             488:     18(int) Load 315(i32)
+             489:   52(ivec2) CompositeConstruct 488 488
+             490:  166(bvec2) INotEqual 487 489
+             491:    259(ptr) AccessChain 422(bv) 175
+             492:   165(bool) CompositeExtract 490 0
+                              Store 491 492
+             493:    259(ptr) AccessChain 422(bv) 176
+             494:   165(bool) CompositeExtract 490 1
+                              Store 493 494
                               Return
                               FunctionEnd
diff --git a/third_party/vulkan-deps/glslang/src/Test/baseResults/spv.int64.frag.out b/third_party/vulkan-deps/glslang/src/Test/baseResults/spv.int64.frag.out
index b7a93a5..f2fd600 100644
--- a/third_party/vulkan-deps/glslang/src/Test/baseResults/spv.int64.frag.out
+++ b/third_party/vulkan-deps/glslang/src/Test/baseResults/spv.int64.frag.out
@@ -2,7 +2,7 @@
 Validation failed
 // Module Version 10000
 // Generated by (magic number): 8000a
-// Id's are bound by 499
+// Id's are bound by 513
 
                               Capability Shader
                               Capability Float64
@@ -44,48 +44,48 @@
                               Name 299  "u64v"
                               Name 301  "u64"
                               Name 373  "dv"
-                              Name 392  "iv"
-                              Name 397  "uv"
-                              Name 401  "bv"
-                              Name 472  "Block"
-                              MemberName 472(Block) 0  "i64v"
-                              MemberName 472(Block) 1  "u64"
-                              Name 474  "block"
-                              Name 475  "si64"
-                              Name 476  "su64"
-                              Name 477  "si"
-                              Name 478  "su"
-                              Name 479  "sb"
-                              Name 480  "su64inc"
-                              Name 481  "i64_to_b"
-                              Name 482  "u64_to_b"
-                              Name 483  "b_to_i64"
-                              Name 484  "b_to_u64"
-                              Name 485  "i64_to_i"
-                              Name 486  "i_to_i64"
-                              Name 487  "u64_to_u"
-                              Name 488  "u_to_u64"
-                              Name 489  "u64_to_i64"
-                              Name 490  "i64_to_u64"
-                              Name 492  "u64_to_i"
-                              Name 494  "i_to_u64"
-                              Name 496  "i64_to_u"
-                              Name 498  "u_to_i64"
+                              Name 394  "iv"
+                              Name 399  "uv"
+                              Name 403  "bv"
+                              Name 486  "Block"
+                              MemberName 486(Block) 0  "i64v"
+                              MemberName 486(Block) 1  "u64"
+                              Name 488  "block"
+                              Name 489  "si64"
+                              Name 490  "su64"
+                              Name 491  "si"
+                              Name 492  "su"
+                              Name 493  "sb"
+                              Name 494  "su64inc"
+                              Name 495  "i64_to_b"
+                              Name 496  "u64_to_b"
+                              Name 497  "b_to_i64"
+                              Name 498  "b_to_u64"
+                              Name 499  "i64_to_i"
+                              Name 500  "i_to_i64"
+                              Name 501  "u64_to_u"
+                              Name 502  "u_to_u64"
+                              Name 503  "u64_to_i64"
+                              Name 504  "i64_to_u64"
+                              Name 506  "u64_to_i"
+                              Name 508  "i_to_u64"
+                              Name 510  "i64_to_u"
+                              Name 512  "u_to_i64"
                               MemberDecorate 28(Uniforms) 0 Offset 0
                               Decorate 28(Uniforms) Block
                               Decorate 30 DescriptorSet 0
                               Decorate 30 Binding 0
-                              MemberDecorate 472(Block) 0 Offset 0
-                              MemberDecorate 472(Block) 1 Offset 24
-                              Decorate 472(Block) Block
-                              Decorate 474(block) DescriptorSet 0
-                              Decorate 474(block) Binding 1
-                              Decorate 475(si64) SpecId 100
-                              Decorate 476(su64) SpecId 101
-                              Decorate 477(si) SpecId 102
-                              Decorate 478(su) SpecId 103
-                              Decorate 479(sb) SpecId 104
-                              Decorate 480(su64inc) SpecId 105
+                              MemberDecorate 486(Block) 0 Offset 0
+                              MemberDecorate 486(Block) 1 Offset 24
+                              Decorate 486(Block) Block
+                              Decorate 488(block) DescriptorSet 0
+                              Decorate 488(block) Binding 1
+                              Decorate 489(si64) SpecId 100
+                              Decorate 490(su64) SpecId 101
+                              Decorate 491(si) SpecId 102
+                              Decorate 492(su) SpecId 103
+                              Decorate 493(sb) SpecId 104
+                              Decorate 494(su64inc) SpecId 105
                2:             TypeVoid
                3:             TypeFunction 2
               14:             TypeInt 64 0
@@ -161,38 +161,38 @@
              371:             TypeVector 94(float64_t) 3
              372:             TypePointer Function 371(f64vec3)
              377:             TypePointer Function 94(float64_t)
-             388:     31(int) Constant 1
-             389:     31(int) Constant 2
-             390:   74(ivec2) ConstantComposite 388 389
-             395:   81(ivec2) ConstantComposite 217 22
-             400:             TypePointer Function 368(bvec3)
-      472(Block):             TypeStruct 136(i64vec3) 14(int64_t)
-             473:             TypePointer Uniform 472(Block)
-      474(block):    473(ptr) Variable Uniform
-       475(si64): 18(int64_t) SpecConstant 4294967286 4294967295
-       476(su64): 14(int64_t) SpecConstant 20 0
-         477(si):     31(int) SpecConstant 4294967291
-         478(su):     21(int) SpecConstant 4
-         479(sb):    55(bool) SpecConstantTrue
-    480(su64inc): 14(int64_t) SpecConstantOp 128 476(su64) 70
-   481(i64_to_b):    55(bool) SpecConstantOp 171 475(si64) 69
-   482(u64_to_b):    55(bool) SpecConstantOp 171 476(su64) 69
-   483(b_to_i64): 18(int64_t) SpecConstantOp 169 479(sb) 61 60
-   484(b_to_u64): 14(int64_t) SpecConstantOp 169 479(sb) 70 69
-   485(i64_to_i):     31(int) SpecConstantOp 114 475(si64)
-   486(i_to_i64): 18(int64_t) SpecConstantOp 114 477(si)
-   487(u64_to_u):     21(int) SpecConstantOp 113 476(su64)
-   488(u_to_u64): 14(int64_t) SpecConstantOp 113 478(su)
- 489(u64_to_i64): 18(int64_t) SpecConstantOp 128 476(su64) 69
- 490(i64_to_u64): 14(int64_t) SpecConstantOp 128 475(si64) 69
-             491:     21(int) SpecConstantOp 113 476(su64)
-   492(u64_to_i):     31(int) SpecConstantOp 128 491 227
-             493: 18(int64_t) SpecConstantOp 114 477(si)
-   494(i_to_u64): 14(int64_t) SpecConstantOp 128 493 69
-             495:     31(int) SpecConstantOp 114 475(si64)
-   496(i64_to_u):     21(int) SpecConstantOp 128 495 227
-             497: 14(int64_t) SpecConstantOp 113 478(su)
-   498(u_to_i64): 18(int64_t) SpecConstantOp 128 497 69
+             390:     31(int) Constant 1
+             391:     31(int) Constant 2
+             392:   74(ivec2) ConstantComposite 390 391
+             397:   81(ivec2) ConstantComposite 217 22
+             402:             TypePointer Function 368(bvec3)
+      486(Block):             TypeStruct 136(i64vec3) 14(int64_t)
+             487:             TypePointer Uniform 486(Block)
+      488(block):    487(ptr) Variable Uniform
+       489(si64): 18(int64_t) SpecConstant 4294967286 4294967295
+       490(su64): 14(int64_t) SpecConstant 20 0
+         491(si):     31(int) SpecConstant 4294967291
+         492(su):     21(int) SpecConstant 4
+         493(sb):    55(bool) SpecConstantTrue
+    494(su64inc): 14(int64_t) SpecConstantOp 128 490(su64) 70
+   495(i64_to_b):    55(bool) SpecConstantOp 171 489(si64) 69
+   496(u64_to_b):    55(bool) SpecConstantOp 171 490(su64) 69
+   497(b_to_i64): 18(int64_t) SpecConstantOp 169 493(sb) 61 60
+   498(b_to_u64): 14(int64_t) SpecConstantOp 169 493(sb) 70 69
+   499(i64_to_i):     31(int) SpecConstantOp 114 489(si64)
+   500(i_to_i64): 18(int64_t) SpecConstantOp 114 491(si)
+   501(u64_to_u):     21(int) SpecConstantOp 113 490(su64)
+   502(u_to_u64): 14(int64_t) SpecConstantOp 113 492(su)
+ 503(u64_to_i64): 18(int64_t) SpecConstantOp 128 490(su64) 69
+ 504(i64_to_u64): 14(int64_t) SpecConstantOp 128 489(si64) 69
+             505:     21(int) SpecConstantOp 113 490(su64)
+   506(u64_to_i):     31(int) SpecConstantOp 128 505 227
+             507: 18(int64_t) SpecConstantOp 114 491(si)
+   508(i_to_u64): 14(int64_t) SpecConstantOp 128 507 69
+             509:     31(int) SpecConstantOp 114 489(si64)
+   510(i64_to_u):     21(int) SpecConstantOp 128 509 227
+             511: 14(int64_t) SpecConstantOp 113 492(su)
+   512(u_to_i64): 18(int64_t) SpecConstantOp 128 511 69
          4(main):           2 Function None 3
                5:             Label
                               Store 16(u64Max) 17
@@ -487,9 +487,9 @@
        299(u64v):    133(ptr) Variable Function
         301(u64):     40(ptr) Variable Function
          373(dv):    372(ptr) Variable Function
-         392(iv):     75(ptr) Variable Function
-         397(uv):     82(ptr) Variable Function
-         401(bv):    400(ptr) Variable Function
+         394(iv):     75(ptr) Variable Function
+         399(uv):     82(ptr) Variable Function
+         403(bv):    402(ptr) Variable Function
              287: 52(i64vec2) Load 286(i64v)
              288: 52(i64vec2) ExtInst 1(GLSL.std.450) 5(SAbs) 287
                               Store 286(i64v) 288
@@ -593,107 +593,128 @@
                               Store 381 380
              382: 52(i64vec2) Load 286(i64v)
              383: 95(f64vec2) Bitcast 382
-             384:371(f64vec3) Load 373(dv)
-             385:371(f64vec3) VectorShuffle 384 383 3 4 2
-                              Store 373(dv) 385
-             386:132(i64vec3) Load 299(u64v)
-             387:371(f64vec3) Bitcast 386
-                              Store 373(dv) 387
-             391: 18(int64_t) Bitcast 390
-                              Store 289(i64) 391
-             393: 18(int64_t) Load 289(i64)
-             394:   74(ivec2) Bitcast 393
-                              Store 392(iv) 394
-             396: 14(int64_t) Bitcast 395
-                              Store 301(u64) 396
-             398: 14(int64_t) Load 301(u64)
-             399:   81(ivec2) Bitcast 398
-                              Store 397(uv) 399
-             402:132(i64vec3) Load 299(u64v)
-             403: 14(int64_t) Load 301(u64)
-             404:132(i64vec3) CompositeConstruct 403 403 403
-             405:  368(bvec3) ULessThan 402 404
-                              Store 401(bv) 405
-             406: 52(i64vec2) Load 286(i64v)
-             407: 18(int64_t) Load 289(i64)
-             408: 52(i64vec2) CompositeConstruct 407 407
-             409:   56(bvec2) SLessThan 406 408
-             410:  368(bvec3) Load 401(bv)
-             411:  368(bvec3) VectorShuffle 410 409 3 4 2
-                              Store 401(bv) 411
-             412:132(i64vec3) Load 299(u64v)
-             413: 14(int64_t) Load 301(u64)
-             414:132(i64vec3) CompositeConstruct 413 413 413
-             415:  368(bvec3) ULessThanEqual 412 414
-                              Store 401(bv) 415
-             416: 52(i64vec2) Load 286(i64v)
-             417: 18(int64_t) Load 289(i64)
-             418: 52(i64vec2) CompositeConstruct 417 417
-             419:   56(bvec2) SLessThanEqual 416 418
-             420:  368(bvec3) Load 401(bv)
-             421:  368(bvec3) VectorShuffle 420 419 3 4 2
-                              Store 401(bv) 421
-             422:132(i64vec3) Load 299(u64v)
-             423: 14(int64_t) Load 301(u64)
-             424:132(i64vec3) CompositeConstruct 423 423 423
-             425:  368(bvec3) UGreaterThan 422 424
-                              Store 401(bv) 425
-             426: 52(i64vec2) Load 286(i64v)
-             427: 18(int64_t) Load 289(i64)
-             428: 52(i64vec2) CompositeConstruct 427 427
-             429:   56(bvec2) SGreaterThan 426 428
-             430:  368(bvec3) Load 401(bv)
-             431:  368(bvec3) VectorShuffle 430 429 3 4 2
-                              Store 401(bv) 431
-             432:132(i64vec3) Load 299(u64v)
-             433: 14(int64_t) Load 301(u64)
-             434:132(i64vec3) CompositeConstruct 433 433 433
-             435:  368(bvec3) UGreaterThanEqual 432 434
-                              Store 401(bv) 435
-             436: 52(i64vec2) Load 286(i64v)
-             437: 18(int64_t) Load 289(i64)
-             438: 52(i64vec2) CompositeConstruct 437 437
-             439:   56(bvec2) SGreaterThanEqual 436 438
-             440:  368(bvec3) Load 401(bv)
-             441:  368(bvec3) VectorShuffle 440 439 3 4 2
-                              Store 401(bv) 441
-             442:132(i64vec3) Load 299(u64v)
-             443: 14(int64_t) Load 301(u64)
-             444:132(i64vec3) CompositeConstruct 443 443 443
-             445:  368(bvec3) IEqual 442 444
-                              Store 401(bv) 445
-             446: 52(i64vec2) Load 286(i64v)
-             447: 18(int64_t) Load 289(i64)
-             448: 52(i64vec2) CompositeConstruct 447 447
-             449:   56(bvec2) IEqual 446 448
-             450:  368(bvec3) Load 401(bv)
-             451:  368(bvec3) VectorShuffle 450 449 3 4 2
-                              Store 401(bv) 451
+             384:    377(ptr) AccessChain 373(dv) 227
+             385:94(float64_t) CompositeExtract 383 0
+                              Store 384 385
+             386:    377(ptr) AccessChain 373(dv) 203
+             387:94(float64_t) CompositeExtract 383 1
+                              Store 386 387
+             388:132(i64vec3) Load 299(u64v)
+             389:371(f64vec3) Bitcast 388
+                              Store 373(dv) 389
+             393: 18(int64_t) Bitcast 392
+                              Store 289(i64) 393
+             395: 18(int64_t) Load 289(i64)
+             396:   74(ivec2) Bitcast 395
+                              Store 394(iv) 396
+             398: 14(int64_t) Bitcast 397
+                              Store 301(u64) 398
+             400: 14(int64_t) Load 301(u64)
+             401:   81(ivec2) Bitcast 400
+                              Store 399(uv) 401
+             404:132(i64vec3) Load 299(u64v)
+             405: 14(int64_t) Load 301(u64)
+             406:132(i64vec3) CompositeConstruct 405 405 405
+             407:  368(bvec3) ULessThan 404 406
+                              Store 403(bv) 407
+             408: 52(i64vec2) Load 286(i64v)
+             409: 18(int64_t) Load 289(i64)
+             410: 52(i64vec2) CompositeConstruct 409 409
+             411:   56(bvec2) SLessThan 408 410
+             412:    225(ptr) AccessChain 403(bv) 227
+             413:    55(bool) CompositeExtract 411 0
+                              Store 412 413
+             414:    225(ptr) AccessChain 403(bv) 203
+             415:    55(bool) CompositeExtract 411 1
+                              Store 414 415
+             416:132(i64vec3) Load 299(u64v)
+             417: 14(int64_t) Load 301(u64)
+             418:132(i64vec3) CompositeConstruct 417 417 417
+             419:  368(bvec3) ULessThanEqual 416 418
+                              Store 403(bv) 419
+             420: 52(i64vec2) Load 286(i64v)
+             421: 18(int64_t) Load 289(i64)
+             422: 52(i64vec2) CompositeConstruct 421 421
+             423:   56(bvec2) SLessThanEqual 420 422
+             424:    225(ptr) AccessChain 403(bv) 227
+             425:    55(bool) CompositeExtract 423 0
+                              Store 424 425
+             426:    225(ptr) AccessChain 403(bv) 203
+             427:    55(bool) CompositeExtract 423 1
+                              Store 426 427
+             428:132(i64vec3) Load 299(u64v)
+             429: 14(int64_t) Load 301(u64)
+             430:132(i64vec3) CompositeConstruct 429 429 429
+             431:  368(bvec3) UGreaterThan 428 430
+                              Store 403(bv) 431
+             432: 52(i64vec2) Load 286(i64v)
+             433: 18(int64_t) Load 289(i64)
+             434: 52(i64vec2) CompositeConstruct 433 433
+             435:   56(bvec2) SGreaterThan 432 434
+             436:    225(ptr) AccessChain 403(bv) 227
+             437:    55(bool) CompositeExtract 435 0
+                              Store 436 437
+             438:    225(ptr) AccessChain 403(bv) 203
+             439:    55(bool) CompositeExtract 435 1
+                              Store 438 439
+             440:132(i64vec3) Load 299(u64v)
+             441: 14(int64_t) Load 301(u64)
+             442:132(i64vec3) CompositeConstruct 441 441 441
+             443:  368(bvec3) UGreaterThanEqual 440 442
+                              Store 403(bv) 443
+             444: 52(i64vec2) Load 286(i64v)
+             445: 18(int64_t) Load 289(i64)
+             446: 52(i64vec2) CompositeConstruct 445 445
+             447:   56(bvec2) SGreaterThanEqual 444 446
+             448:    225(ptr) AccessChain 403(bv) 227
+             449:    55(bool) CompositeExtract 447 0
+                              Store 448 449
+             450:    225(ptr) AccessChain 403(bv) 203
+             451:    55(bool) CompositeExtract 447 1
+                              Store 450 451
              452:132(i64vec3) Load 299(u64v)
              453: 14(int64_t) Load 301(u64)
              454:132(i64vec3) CompositeConstruct 453 453 453
-             455:  368(bvec3) INotEqual 452 454
-                              Store 401(bv) 455
+             455:  368(bvec3) IEqual 452 454
+                              Store 403(bv) 455
              456: 52(i64vec2) Load 286(i64v)
              457: 18(int64_t) Load 289(i64)
              458: 52(i64vec2) CompositeConstruct 457 457
-             459:   56(bvec2) INotEqual 456 458
-             460:  368(bvec3) Load 401(bv)
-             461:  368(bvec3) VectorShuffle 460 459 3 4 2
-                              Store 401(bv) 461
-             462: 14(int64_t) Load 301(u64)
-             463: 18(int64_t) ExtInst 1(GLSL.std.450) 73(FindILsb) 462
-                              Store 289(i64) 463
-             464: 14(int64_t) Load 301(u64)
-             465: 65(i64vec2) CompositeConstruct 464 464
-             466: 52(i64vec2) ExtInst 1(GLSL.std.450) 73(FindILsb) 465
-                              Store 286(i64v) 466
-             467: 14(int64_t) Load 301(u64)
-             468: 18(int64_t) BitCount 467
-                              Store 289(i64) 468
-             469: 14(int64_t) Load 301(u64)
-             470: 65(i64vec2) CompositeConstruct 469 469
-             471: 52(i64vec2) BitCount 470
-                              Store 286(i64v) 471
+             459:   56(bvec2) IEqual 456 458
+             460:    225(ptr) AccessChain 403(bv) 227
+             461:    55(bool) CompositeExtract 459 0
+                              Store 460 461
+             462:    225(ptr) AccessChain 403(bv) 203
+             463:    55(bool) CompositeExtract 459 1
+                              Store 462 463
+             464:132(i64vec3) Load 299(u64v)
+             465: 14(int64_t) Load 301(u64)
+             466:132(i64vec3) CompositeConstruct 465 465 465
+             467:  368(bvec3) INotEqual 464 466
+                              Store 403(bv) 467
+             468: 52(i64vec2) Load 286(i64v)
+             469: 18(int64_t) Load 289(i64)
+             470: 52(i64vec2) CompositeConstruct 469 469
+             471:   56(bvec2) INotEqual 468 470
+             472:    225(ptr) AccessChain 403(bv) 227
+             473:    55(bool) CompositeExtract 471 0
+                              Store 472 473
+             474:    225(ptr) AccessChain 403(bv) 203
+             475:    55(bool) CompositeExtract 471 1
+                              Store 474 475
+             476: 14(int64_t) Load 301(u64)
+             477: 18(int64_t) ExtInst 1(GLSL.std.450) 73(FindILsb) 476
+                              Store 289(i64) 477
+             478: 14(int64_t) Load 301(u64)
+             479: 65(i64vec2) CompositeConstruct 478 478
+             480: 52(i64vec2) ExtInst 1(GLSL.std.450) 73(FindILsb) 479
+                              Store 286(i64v) 480
+             481: 14(int64_t) Load 301(u64)
+             482: 18(int64_t) BitCount 481
+                              Store 289(i64) 482
+             483: 14(int64_t) Load 301(u64)
+             484: 65(i64vec2) CompositeConstruct 483 483
+             485: 52(i64vec2) BitCount 484
+                              Store 286(i64v) 485
                               Return
                               FunctionEnd
diff --git a/third_party/vulkan-deps/glslang/src/Test/baseResults/spv.int8.frag.out b/third_party/vulkan-deps/glslang/src/Test/baseResults/spv.int8.frag.out
index e88707d..a0da3e9 100644
--- a/third_party/vulkan-deps/glslang/src/Test/baseResults/spv.int8.frag.out
+++ b/third_party/vulkan-deps/glslang/src/Test/baseResults/spv.int8.frag.out
@@ -1,7 +1,7 @@
 spv.int8.frag
 // Module Version 10300
 // Generated by (magic number): 8000a
-// Id's are bound by 518
+// Id's are bound by 530
 
                               Capability Shader
                               Capability Float16
@@ -66,35 +66,35 @@
                               Name 437  "u32"
                               Name 440  "u8v4"
                               Name 452  "bv"
-                              Name 513  "Block"
-                              MemberName 513(Block) 0  "i8"
-                              MemberName 513(Block) 1  "i8v2"
-                              MemberName 513(Block) 2  "i8v3"
-                              MemberName 513(Block) 3  "i8v4"
-                              MemberName 513(Block) 4  "u8"
-                              MemberName 513(Block) 5  "u8v2"
-                              MemberName 513(Block) 6  "u8v3"
-                              MemberName 513(Block) 7  "u8v4"
-                              Name 515  "block"
-                              Name 516  "si8"
-                              Name 517  "su8"
+                              Name 525  "Block"
+                              MemberName 525(Block) 0  "i8"
+                              MemberName 525(Block) 1  "i8v2"
+                              MemberName 525(Block) 2  "i8v3"
+                              MemberName 525(Block) 3  "i8v4"
+                              MemberName 525(Block) 4  "u8"
+                              MemberName 525(Block) 5  "u8v2"
+                              MemberName 525(Block) 6  "u8v3"
+                              MemberName 525(Block) 7  "u8v4"
+                              Name 527  "block"
+                              Name 528  "si8"
+                              Name 529  "su8"
                               MemberDecorate 24(Uniforms) 0 Offset 0
                               Decorate 24(Uniforms) Block
                               Decorate 26 DescriptorSet 0
                               Decorate 26 Binding 0
-                              MemberDecorate 513(Block) 0 Offset 0
-                              MemberDecorate 513(Block) 1 Offset 2
-                              MemberDecorate 513(Block) 2 Offset 4
-                              MemberDecorate 513(Block) 3 Offset 8
-                              MemberDecorate 513(Block) 4 Offset 12
-                              MemberDecorate 513(Block) 5 Offset 14
-                              MemberDecorate 513(Block) 6 Offset 16
-                              MemberDecorate 513(Block) 7 Offset 20
-                              Decorate 513(Block) Block
-                              Decorate 515(block) DescriptorSet 0
-                              Decorate 515(block) Binding 1
-                              Decorate 516(si8) SpecId 100
-                              Decorate 517(su8) SpecId 101
+                              MemberDecorate 525(Block) 0 Offset 0
+                              MemberDecorate 525(Block) 1 Offset 2
+                              MemberDecorate 525(Block) 2 Offset 4
+                              MemberDecorate 525(Block) 3 Offset 8
+                              MemberDecorate 525(Block) 4 Offset 12
+                              MemberDecorate 525(Block) 5 Offset 14
+                              MemberDecorate 525(Block) 6 Offset 16
+                              MemberDecorate 525(Block) 7 Offset 20
+                              Decorate 525(Block) Block
+                              Decorate 527(block) DescriptorSet 0
+                              Decorate 527(block) Binding 1
+                              Decorate 528(si8) SpecId 100
+                              Decorate 529(su8) SpecId 101
                2:             TypeVoid
                3:             TypeFunction 2
               14:             TypeInt 8 1
@@ -184,11 +184,11 @@
              438:             TypeVector 36(int8_t) 4
              439:             TypePointer Function 438(i8vec4)
              451:             TypePointer Function 420(bvec3)
-      513(Block):             TypeStruct 14(int8_t) 52(i8vec2) 194(i8vec3) 427(i8vec4) 36(int8_t) 49(i8vec2) 190(i8vec3) 438(i8vec4)
-             514:             TypePointer Uniform 513(Block)
-      515(block):    514(ptr) Variable Uniform
-        516(si8):  14(int8_t) SpecConstant 4294967286
-        517(su8):  36(int8_t) SpecConstant 20
+      525(Block):             TypeStruct 14(int8_t) 52(i8vec2) 194(i8vec3) 427(i8vec4) 36(int8_t) 49(i8vec2) 190(i8vec3) 438(i8vec4)
+             526:             TypePointer Uniform 525(Block)
+      527(block):    526(ptr) Variable Uniform
+        528(si8):  14(int8_t) SpecConstant 4294967286
+        529(su8):  36(int8_t) SpecConstant 20
          4(main):           2 Function None 3
                5:             Label
                               Return
@@ -670,68 +670,86 @@
              458:  14(int8_t) Load 341(i8)
              459:  52(i8vec2) CompositeConstruct 458 458
              460:  172(bvec2) SLessThan 457 459
-             461:  420(bvec3) Load 452(bv)
-             462:  420(bvec3) VectorShuffle 461 460 3 4 2
-                              Store 452(bv) 462
-             463: 190(i8vec3) Load 351(u8v)
-             464:  36(int8_t) Load 353(u8)
-             465: 190(i8vec3) CompositeConstruct 464 464 464
-             466:  420(bvec3) ULessThanEqual 463 465
-                              Store 452(bv) 466
-             467:  52(i8vec2) Load 338(i8v)
-             468:  14(int8_t) Load 341(i8)
-             469:  52(i8vec2) CompositeConstruct 468 468
-             470:  172(bvec2) SLessThanEqual 467 469
-             471:  420(bvec3) Load 452(bv)
-             472:  420(bvec3) VectorShuffle 471 470 3 4 2
-                              Store 452(bv) 472
-             473: 190(i8vec3) Load 351(u8v)
-             474:  36(int8_t) Load 353(u8)
-             475: 190(i8vec3) CompositeConstruct 474 474 474
-             476:  420(bvec3) UGreaterThan 473 475
-                              Store 452(bv) 476
-             477:  52(i8vec2) Load 338(i8v)
-             478:  14(int8_t) Load 341(i8)
-             479:  52(i8vec2) CompositeConstruct 478 478
-             480:  172(bvec2) SGreaterThan 477 479
-             481:  420(bvec3) Load 452(bv)
-             482:  420(bvec3) VectorShuffle 481 480 3 4 2
-                              Store 452(bv) 482
-             483: 190(i8vec3) Load 351(u8v)
-             484:  36(int8_t) Load 353(u8)
-             485: 190(i8vec3) CompositeConstruct 484 484 484
-             486:  420(bvec3) UGreaterThanEqual 483 485
-                              Store 452(bv) 486
-             487:  52(i8vec2) Load 338(i8v)
-             488:  14(int8_t) Load 341(i8)
-             489:  52(i8vec2) CompositeConstruct 488 488
-             490:  172(bvec2) SGreaterThanEqual 487 489
-             491:  420(bvec3) Load 452(bv)
-             492:  420(bvec3) VectorShuffle 491 490 3 4 2
+             461:    275(ptr) AccessChain 452(bv) 277
+             462:   171(bool) CompositeExtract 460 0
+                              Store 461 462
+             463:    275(ptr) AccessChain 452(bv) 261
+             464:   171(bool) CompositeExtract 460 1
+                              Store 463 464
+             465: 190(i8vec3) Load 351(u8v)
+             466:  36(int8_t) Load 353(u8)
+             467: 190(i8vec3) CompositeConstruct 466 466 466
+             468:  420(bvec3) ULessThanEqual 465 467
+                              Store 452(bv) 468
+             469:  52(i8vec2) Load 338(i8v)
+             470:  14(int8_t) Load 341(i8)
+             471:  52(i8vec2) CompositeConstruct 470 470
+             472:  172(bvec2) SLessThanEqual 469 471
+             473:    275(ptr) AccessChain 452(bv) 277
+             474:   171(bool) CompositeExtract 472 0
+                              Store 473 474
+             475:    275(ptr) AccessChain 452(bv) 261
+             476:   171(bool) CompositeExtract 472 1
+                              Store 475 476
+             477: 190(i8vec3) Load 351(u8v)
+             478:  36(int8_t) Load 353(u8)
+             479: 190(i8vec3) CompositeConstruct 478 478 478
+             480:  420(bvec3) UGreaterThan 477 479
+                              Store 452(bv) 480
+             481:  52(i8vec2) Load 338(i8v)
+             482:  14(int8_t) Load 341(i8)
+             483:  52(i8vec2) CompositeConstruct 482 482
+             484:  172(bvec2) SGreaterThan 481 483
+             485:    275(ptr) AccessChain 452(bv) 277
+             486:   171(bool) CompositeExtract 484 0
+                              Store 485 486
+             487:    275(ptr) AccessChain 452(bv) 261
+             488:   171(bool) CompositeExtract 484 1
+                              Store 487 488
+             489: 190(i8vec3) Load 351(u8v)
+             490:  36(int8_t) Load 353(u8)
+             491: 190(i8vec3) CompositeConstruct 490 490 490
+             492:  420(bvec3) UGreaterThanEqual 489 491
                               Store 452(bv) 492
-             493: 190(i8vec3) Load 351(u8v)
-             494:  36(int8_t) Load 353(u8)
-             495: 190(i8vec3) CompositeConstruct 494 494 494
-             496:  420(bvec3) IEqual 493 495
-                              Store 452(bv) 496
-             497:  52(i8vec2) Load 338(i8v)
-             498:  14(int8_t) Load 341(i8)
-             499:  52(i8vec2) CompositeConstruct 498 498
-             500:  172(bvec2) IEqual 497 499
-             501:  420(bvec3) Load 452(bv)
-             502:  420(bvec3) VectorShuffle 501 500 3 4 2
-                              Store 452(bv) 502
-             503: 190(i8vec3) Load 351(u8v)
-             504:  36(int8_t) Load 353(u8)
-             505: 190(i8vec3) CompositeConstruct 504 504 504
-             506:  420(bvec3) INotEqual 503 505
-                              Store 452(bv) 506
-             507:  52(i8vec2) Load 338(i8v)
-             508:  14(int8_t) Load 341(i8)
-             509:  52(i8vec2) CompositeConstruct 508 508
-             510:  172(bvec2) INotEqual 507 509
-             511:  420(bvec3) Load 452(bv)
-             512:  420(bvec3) VectorShuffle 511 510 3 4 2
-                              Store 452(bv) 512
+             493:  52(i8vec2) Load 338(i8v)
+             494:  14(int8_t) Load 341(i8)
+             495:  52(i8vec2) CompositeConstruct 494 494
+             496:  172(bvec2) SGreaterThanEqual 493 495
+             497:    275(ptr) AccessChain 452(bv) 277
+             498:   171(bool) CompositeExtract 496 0
+                              Store 497 498
+             499:    275(ptr) AccessChain 452(bv) 261
+             500:   171(bool) CompositeExtract 496 1
+                              Store 499 500
+             501: 190(i8vec3) Load 351(u8v)
+             502:  36(int8_t) Load 353(u8)
+             503: 190(i8vec3) CompositeConstruct 502 502 502
+             504:  420(bvec3) IEqual 501 503
+                              Store 452(bv) 504
+             505:  52(i8vec2) Load 338(i8v)
+             506:  14(int8_t) Load 341(i8)
+             507:  52(i8vec2) CompositeConstruct 506 506
+             508:  172(bvec2) IEqual 505 507
+             509:    275(ptr) AccessChain 452(bv) 277
+             510:   171(bool) CompositeExtract 508 0
+                              Store 509 510
+             511:    275(ptr) AccessChain 452(bv) 261
+             512:   171(bool) CompositeExtract 508 1
+                              Store 511 512
+             513: 190(i8vec3) Load 351(u8v)
+             514:  36(int8_t) Load 353(u8)
+             515: 190(i8vec3) CompositeConstruct 514 514 514
+             516:  420(bvec3) INotEqual 513 515
+                              Store 452(bv) 516
+             517:  52(i8vec2) Load 338(i8v)
+             518:  14(int8_t) Load 341(i8)
+             519:  52(i8vec2) CompositeConstruct 518 518
+             520:  172(bvec2) INotEqual 517 519
+             521:    275(ptr) AccessChain 452(bv) 277
+             522:   171(bool) CompositeExtract 520 0
+                              Store 521 522
+             523:    275(ptr) AccessChain 452(bv) 261
+             524:   171(bool) CompositeExtract 520 1
+                              Store 523 524
                               Return
                               FunctionEnd
diff --git a/third_party/vulkan-deps/glslang/src/Test/baseResults/spv.intOps.vert.out b/third_party/vulkan-deps/glslang/src/Test/baseResults/spv.intOps.vert.out
index d57c306..b57eac2 100644
--- a/third_party/vulkan-deps/glslang/src/Test/baseResults/spv.intOps.vert.out
+++ b/third_party/vulkan-deps/glslang/src/Test/baseResults/spv.intOps.vert.out
@@ -1,12 +1,12 @@
 spv.intOps.vert
 // Module Version 10000
 // Generated by (magic number): 8000a
-// Id's are bound by 268
+// Id's are bound by 302
 
                               Capability Shader
                1:             ExtInstImport  "GLSL.std.450"
                               MemoryModel Logical GLSL450
-                              EntryPoint Vertex 4  "main" 9 15 21 26 47 67 83 100 121 142 146 156 173 182 247
+                              EntryPoint Vertex 4  "main" 9 15 21 26 53 72 88 105 137 156 160 172 189 202 281
                               Source ESSL 310
                               Name 4  "main"
                               Name 9  "iout"
@@ -15,44 +15,44 @@
                               Name 26  "u2"
                               Name 30  "u2out"
                               Name 31  "ResType"
-                              Name 47  "u1"
-                              Name 51  "u1out"
-                              Name 52  "ResType"
-                              Name 67  "u4"
-                              Name 71  "u4outHi"
-                              Name 72  "u4outLow"
-                              Name 73  "ResType"
-                              Name 83  "i4"
-                              Name 87  "i4outHi"
-                              Name 88  "i4outLow"
-                              Name 89  "ResType"
-                              Name 100  "v3"
-                              Name 104  "i3out"
-                              Name 105  "ResType"
-                              Name 121  "v1"
-                              Name 124  "i1out"
-                              Name 125  "ResType"
-                              Name 142  "v2"
-                              Name 146  "i2"
-                              Name 156  "i1"
-                              Name 173  "u3"
-                              Name 182  "i3"
-                              Name 247  "v4"
+                              Name 53  "u1"
+                              Name 57  "u1out"
+                              Name 58  "ResType"
+                              Name 72  "u4"
+                              Name 76  "u4outHi"
+                              Name 77  "u4outLow"
+                              Name 78  "ResType"
+                              Name 88  "i4"
+                              Name 92  "i4outHi"
+                              Name 93  "i4outLow"
+                              Name 94  "ResType"
+                              Name 105  "v3"
+                              Name 109  "i3out"
+                              Name 110  "ResType"
+                              Name 137  "v1"
+                              Name 140  "i1out"
+                              Name 141  "ResType"
+                              Name 156  "v2"
+                              Name 160  "i2"
+                              Name 172  "i1"
+                              Name 189  "u3"
+                              Name 202  "i3"
+                              Name 281  "v4"
                               Decorate 9(iout) Location 1
                               Decorate 15(uout) Location 0
                               Decorate 21(fout) Location 2
                               Decorate 26(u2) Location 1
-                              Decorate 47(u1) Location 0
-                              Decorate 67(u4) Location 3
-                              Decorate 83(i4) Location 11
-                              Decorate 100(v3) Location 6
-                              Decorate 121(v1) Location 4
-                              Decorate 142(v2) Location 5
-                              Decorate 146(i2) Location 9
-                              Decorate 156(i1) Location 8
-                              Decorate 173(u3) Location 2
-                              Decorate 182(i3) Location 10
-                              Decorate 247(v4) Location 7
+                              Decorate 53(u1) Location 0
+                              Decorate 72(u4) Location 3
+                              Decorate 88(i4) Location 11
+                              Decorate 105(v3) Location 6
+                              Decorate 137(v1) Location 4
+                              Decorate 156(v2) Location 5
+                              Decorate 160(i2) Location 9
+                              Decorate 172(i1) Location 8
+                              Decorate 189(u3) Location 2
+                              Decorate 202(i3) Location 10
+                              Decorate 281(v4) Location 7
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeInt 32 1
@@ -78,58 +78,60 @@
           26(u2):     25(ptr) Variable Input
               29:             TypePointer Function 24(ivec2)
      31(ResType):             TypeStruct 24(ivec2) 24(ivec2)
-              46:             TypePointer Input 12(int)
-          47(u1):     46(ptr) Variable Input
-              50:             TypePointer Function 12(int)
-     52(ResType):             TypeStruct 12(int) 12(int)
-              56:             TypePointer Output 12(int)
-              66:             TypePointer Input 13(ivec4)
-          67(u4):     66(ptr) Variable Input
-              70:             TypePointer Function 13(ivec4)
-     73(ResType):             TypeStruct 13(ivec4) 13(ivec4)
-              82:             TypePointer Input 7(ivec4)
-          83(i4):     82(ptr) Variable Input
-              86:             TypePointer Function 7(ivec4)
-     89(ResType):             TypeStruct 7(ivec4) 7(ivec4)
-              98:             TypeVector 18(float) 3
-              99:             TypePointer Input 98(fvec3)
-         100(v3):     99(ptr) Variable Input
-             102:             TypeVector 6(int) 3
-             103:             TypePointer Function 102(ivec3)
-    105(ResType):             TypeStruct 98(fvec3) 102(ivec3)
-             120:             TypePointer Input 18(float)
-         121(v1):    120(ptr) Variable Input
-             123:             TypePointer Function 6(int)
-    125(ResType):             TypeStruct 18(float) 6(int)
-             129:             TypePointer Output 18(float)
-             135:             TypePointer Output 6(int)
-             140:             TypeVector 18(float) 2
-             141:             TypePointer Input 140(fvec2)
-         142(v2):    141(ptr) Variable Input
-             144:             TypeVector 6(int) 2
-             145:             TypePointer Input 144(ivec2)
-         146(i2):    145(ptr) Variable Input
-             155:             TypePointer Input 6(int)
-         156(i1):    155(ptr) Variable Input
-             164:      6(int) Constant 4
-             165:      6(int) Constant 5
-             171:             TypeVector 12(int) 3
-             172:             TypePointer Input 171(ivec3)
-         173(u3):    172(ptr) Variable Input
-             181:             TypePointer Input 102(ivec3)
-         182(i3):    181(ptr) Variable Input
-             246:             TypePointer Input 19(fvec4)
-         247(v4):    246(ptr) Variable Input
+              38:             TypePointer Output 12(int)
+              41:     12(int) Constant 1
+              52:             TypePointer Input 12(int)
+          53(u1):     52(ptr) Variable Input
+              56:             TypePointer Function 12(int)
+     58(ResType):             TypeStruct 12(int) 12(int)
+              71:             TypePointer Input 13(ivec4)
+          72(u4):     71(ptr) Variable Input
+              75:             TypePointer Function 13(ivec4)
+     78(ResType):             TypeStruct 13(ivec4) 13(ivec4)
+              87:             TypePointer Input 7(ivec4)
+          88(i4):     87(ptr) Variable Input
+              91:             TypePointer Function 7(ivec4)
+     94(ResType):             TypeStruct 7(ivec4) 7(ivec4)
+             103:             TypeVector 18(float) 3
+             104:             TypePointer Input 103(fvec3)
+         105(v3):    104(ptr) Variable Input
+             107:             TypeVector 6(int) 3
+             108:             TypePointer Function 107(ivec3)
+    110(ResType):             TypeStruct 103(fvec3) 107(ivec3)
+             117:             TypePointer Output 18(float)
+             122:     12(int) Constant 2
+             129:             TypePointer Output 6(int)
+             136:             TypePointer Input 18(float)
+         137(v1):    136(ptr) Variable Input
+             139:             TypePointer Function 6(int)
+    141(ResType):             TypeStruct 18(float) 6(int)
+             154:             TypeVector 18(float) 2
+             155:             TypePointer Input 154(fvec2)
+         156(v2):    155(ptr) Variable Input
+             158:             TypeVector 6(int) 2
+             159:             TypePointer Input 158(ivec2)
+         160(i2):    159(ptr) Variable Input
+             171:             TypePointer Input 6(int)
+         172(i1):    171(ptr) Variable Input
+             180:      6(int) Constant 4
+             181:      6(int) Constant 5
+             187:             TypeVector 12(int) 3
+             188:             TypePointer Input 187(ivec3)
+         189(u3):    188(ptr) Variable Input
+             201:             TypePointer Input 107(ivec3)
+         202(i3):    201(ptr) Variable Input
+             280:             TypePointer Input 19(fvec4)
+         281(v4):    280(ptr) Variable Input
          4(main):           2 Function None 3
                5:             Label
        30(u2out):     29(ptr) Variable Function
-       51(u1out):     50(ptr) Variable Function
-     71(u4outHi):     70(ptr) Variable Function
-    72(u4outLow):     70(ptr) Variable Function
-     87(i4outHi):     86(ptr) Variable Function
-    88(i4outLow):     86(ptr) Variable Function
-      104(i3out):    103(ptr) Variable Function
-      124(i1out):    123(ptr) Variable Function
+       57(u1out):     56(ptr) Variable Function
+     76(u4outHi):     75(ptr) Variable Function
+    77(u4outLow):     75(ptr) Variable Function
+     92(i4outHi):     91(ptr) Variable Function
+    93(i4outLow):     91(ptr) Variable Function
+      109(i3out):    108(ptr) Variable Function
+      140(i1out):    139(ptr) Variable Function
                               Store 9(iout) 11
                               Store 15(uout) 17
                               Store 21(fout) 23
@@ -142,221 +144,269 @@
               35:   13(ivec4) Load 15(uout)
               36:   24(ivec2) VectorShuffle 35 35 0 1
               37:   24(ivec2) IAdd 36 34
-              38:   13(ivec4) Load 15(uout)
-              39:   13(ivec4) VectorShuffle 38 37 4 5 2 3
-                              Store 15(uout) 39
-              40:   24(ivec2) Load 30(u2out)
-              41:   13(ivec4) Load 15(uout)
-              42:   24(ivec2) VectorShuffle 41 41 0 1
-              43:   24(ivec2) IAdd 42 40
-              44:   13(ivec4) Load 15(uout)
-              45:   13(ivec4) VectorShuffle 44 43 4 5 2 3
-                              Store 15(uout) 45
-              48:     12(int) Load 47(u1)
-              49:     12(int) Load 47(u1)
-              53: 52(ResType) ISubBorrow 48 49
-              54:     12(int) CompositeExtract 53 1
-                              Store 51(u1out) 54
-              55:     12(int) CompositeExtract 53 0
-              57:     56(ptr) AccessChain 15(uout) 16
-              58:     12(int) Load 57
-              59:     12(int) IAdd 58 55
-              60:     56(ptr) AccessChain 15(uout) 16
-                              Store 60 59
-              61:     12(int) Load 51(u1out)
-              62:     56(ptr) AccessChain 15(uout) 16
+              39:     38(ptr) AccessChain 15(uout) 16
+              40:     12(int) CompositeExtract 37 0
+                              Store 39 40
+              42:     38(ptr) AccessChain 15(uout) 41
+              43:     12(int) CompositeExtract 37 1
+                              Store 42 43
+              44:   24(ivec2) Load 30(u2out)
+              45:   13(ivec4) Load 15(uout)
+              46:   24(ivec2) VectorShuffle 45 45 0 1
+              47:   24(ivec2) IAdd 46 44
+              48:     38(ptr) AccessChain 15(uout) 16
+              49:     12(int) CompositeExtract 47 0
+                              Store 48 49
+              50:     38(ptr) AccessChain 15(uout) 41
+              51:     12(int) CompositeExtract 47 1
+                              Store 50 51
+              54:     12(int) Load 53(u1)
+              55:     12(int) Load 53(u1)
+              59: 58(ResType) ISubBorrow 54 55
+              60:     12(int) CompositeExtract 59 1
+                              Store 57(u1out) 60
+              61:     12(int) CompositeExtract 59 0
+              62:     38(ptr) AccessChain 15(uout) 16
               63:     12(int) Load 62
               64:     12(int) IAdd 63 61
-              65:     56(ptr) AccessChain 15(uout) 16
+              65:     38(ptr) AccessChain 15(uout) 16
                               Store 65 64
-              68:   13(ivec4) Load 67(u4)
-              69:   13(ivec4) Load 67(u4)
-              74: 73(ResType) UMulExtended 68 69
-              75:   13(ivec4) CompositeExtract 74 0
-                              Store 72(u4outLow) 75
-              76:   13(ivec4) CompositeExtract 74 1
-                              Store 71(u4outHi) 76
-              77:   13(ivec4) Load 71(u4outHi)
-              78:   13(ivec4) Load 72(u4outLow)
-              79:   13(ivec4) IAdd 77 78
-              80:   13(ivec4) Load 15(uout)
-              81:   13(ivec4) IAdd 80 79
-                              Store 15(uout) 81
-              84:    7(ivec4) Load 83(i4)
-              85:    7(ivec4) Load 83(i4)
-              90: 89(ResType) SMulExtended 84 85
-              91:    7(ivec4) CompositeExtract 90 0
-                              Store 88(i4outLow) 91
-              92:    7(ivec4) CompositeExtract 90 1
-                              Store 87(i4outHi) 92
-              93:    7(ivec4) Load 88(i4outLow)
-              94:    7(ivec4) Load 87(i4outHi)
-              95:    7(ivec4) IAdd 93 94
-              96:    7(ivec4) Load 9(iout)
-              97:    7(ivec4) IAdd 96 95
-                              Store 9(iout) 97
-             101:   98(fvec3) Load 100(v3)
-             106:105(ResType) ExtInst 1(GLSL.std.450) 52(FrexpStruct) 101
-             107:  102(ivec3) CompositeExtract 106 1
-                              Store 104(i3out) 107
-             108:   98(fvec3) CompositeExtract 106 0
-             109:   19(fvec4) Load 21(fout)
-             110:   98(fvec3) VectorShuffle 109 109 0 1 2
-             111:   98(fvec3) FAdd 110 108
-             112:   19(fvec4) Load 21(fout)
-             113:   19(fvec4) VectorShuffle 112 111 4 5 6 3
-                              Store 21(fout) 113
-             114:  102(ivec3) Load 104(i3out)
-             115:    7(ivec4) Load 9(iout)
-             116:  102(ivec3) VectorShuffle 115 115 0 1 2
-             117:  102(ivec3) IAdd 116 114
-             118:    7(ivec4) Load 9(iout)
-             119:    7(ivec4) VectorShuffle 118 117 4 5 6 3
-                              Store 9(iout) 119
-             122:   18(float) Load 121(v1)
-             126:125(ResType) ExtInst 1(GLSL.std.450) 52(FrexpStruct) 122
-             127:      6(int) CompositeExtract 126 1
-                              Store 124(i1out) 127
-             128:   18(float) CompositeExtract 126 0
-             130:    129(ptr) AccessChain 21(fout) 16
-             131:   18(float) Load 130
-             132:   18(float) FAdd 131 128
-             133:    129(ptr) AccessChain 21(fout) 16
-                              Store 133 132
-             134:      6(int) Load 124(i1out)
-             136:    135(ptr) AccessChain 9(iout) 16
-             137:      6(int) Load 136
-             138:      6(int) IAdd 137 134
-             139:    135(ptr) AccessChain 9(iout) 16
-                              Store 139 138
-             143:  140(fvec2) Load 142(v2)
-             147:  144(ivec2) Load 146(i2)
-             148:  140(fvec2) ExtInst 1(GLSL.std.450) 53(Ldexp) 143 147
-             149:   19(fvec4) Load 21(fout)
-             150:  140(fvec2) VectorShuffle 149 149 0 1
-             151:  140(fvec2) FAdd 150 148
-             152:   19(fvec4) Load 21(fout)
-             153:   19(fvec4) VectorShuffle 152 151 4 5 2 3
-                              Store 21(fout) 153
-             154:   18(float) Load 121(v1)
-             157:      6(int) Load 156(i1)
-             158:   18(float) ExtInst 1(GLSL.std.450) 53(Ldexp) 154 157
-             159:    129(ptr) AccessChain 21(fout) 16
-             160:   18(float) Load 159
-             161:   18(float) FAdd 160 158
-             162:    129(ptr) AccessChain 21(fout) 16
-                              Store 162 161
-             163:      6(int) Load 156(i1)
-             166:      6(int) BitFieldSExtract 163 164 165
-             167:    135(ptr) AccessChain 9(iout) 16
-             168:      6(int) Load 167
-             169:      6(int) IAdd 168 166
-             170:    135(ptr) AccessChain 9(iout) 16
-                              Store 170 169
-             174:  171(ivec3) Load 173(u3)
-             175:  171(ivec3) BitFieldUExtract 174 164 165
-             176:   13(ivec4) Load 15(uout)
-             177:  171(ivec3) VectorShuffle 176 176 0 1 2
-             178:  171(ivec3) IAdd 177 175
-             179:   13(ivec4) Load 15(uout)
-             180:   13(ivec4) VectorShuffle 179 178 4 5 6 3
-                              Store 15(uout) 180
-             183:  102(ivec3) Load 182(i3)
-             184:  102(ivec3) Load 182(i3)
-             185:  102(ivec3) BitFieldInsert 183 184 164 165
-             186:    7(ivec4) Load 9(iout)
-             187:  102(ivec3) VectorShuffle 186 186 0 1 2
-             188:  102(ivec3) IAdd 187 185
-             189:    7(ivec4) Load 9(iout)
-             190:    7(ivec4) VectorShuffle 189 188 4 5 6 3
-                              Store 9(iout) 190
-             191:     12(int) Load 47(u1)
-             192:     12(int) Load 47(u1)
-             193:     12(int) BitFieldInsert 191 192 164 165
-             194:     56(ptr) AccessChain 15(uout) 16
-             195:     12(int) Load 194
-             196:     12(int) IAdd 195 193
-             197:     56(ptr) AccessChain 15(uout) 16
-                              Store 197 196
-             198:  144(ivec2) Load 146(i2)
-             199:  144(ivec2) BitReverse 198
-             200:    7(ivec4) Load 9(iout)
-             201:  144(ivec2) VectorShuffle 200 200 0 1
-             202:  144(ivec2) IAdd 201 199
-             203:    7(ivec4) Load 9(iout)
-             204:    7(ivec4) VectorShuffle 203 202 4 5 2 3
-                              Store 9(iout) 204
-             205:   13(ivec4) Load 67(u4)
-             206:   13(ivec4) BitReverse 205
-             207:   13(ivec4) Load 15(uout)
-             208:   13(ivec4) IAdd 207 206
-                              Store 15(uout) 208
-             209:      6(int) Load 156(i1)
-             210:      6(int) BitCount 209
-             211:    135(ptr) AccessChain 9(iout) 16
-             212:      6(int) Load 211
-             213:      6(int) IAdd 212 210
-             214:    135(ptr) AccessChain 9(iout) 16
-                              Store 214 213
-             215:  171(ivec3) Load 173(u3)
-             216:  102(ivec3) BitCount 215
-             217:    7(ivec4) Load 9(iout)
-             218:  102(ivec3) VectorShuffle 217 217 0 1 2
-             219:  102(ivec3) IAdd 218 216
-             220:    7(ivec4) Load 9(iout)
-             221:    7(ivec4) VectorShuffle 220 219 4 5 6 3
-                              Store 9(iout) 221
-             222:  144(ivec2) Load 146(i2)
-             223:  144(ivec2) ExtInst 1(GLSL.std.450) 73(FindILsb) 222
+              66:     12(int) Load 57(u1out)
+              67:     38(ptr) AccessChain 15(uout) 16
+              68:     12(int) Load 67
+              69:     12(int) IAdd 68 66
+              70:     38(ptr) AccessChain 15(uout) 16
+                              Store 70 69
+              73:   13(ivec4) Load 72(u4)
+              74:   13(ivec4) Load 72(u4)
+              79: 78(ResType) UMulExtended 73 74
+              80:   13(ivec4) CompositeExtract 79 0
+                              Store 77(u4outLow) 80
+              81:   13(ivec4) CompositeExtract 79 1
+                              Store 76(u4outHi) 81
+              82:   13(ivec4) Load 76(u4outHi)
+              83:   13(ivec4) Load 77(u4outLow)
+              84:   13(ivec4) IAdd 82 83
+              85:   13(ivec4) Load 15(uout)
+              86:   13(ivec4) IAdd 85 84
+                              Store 15(uout) 86
+              89:    7(ivec4) Load 88(i4)
+              90:    7(ivec4) Load 88(i4)
+              95: 94(ResType) SMulExtended 89 90
+              96:    7(ivec4) CompositeExtract 95 0
+                              Store 93(i4outLow) 96
+              97:    7(ivec4) CompositeExtract 95 1
+                              Store 92(i4outHi) 97
+              98:    7(ivec4) Load 93(i4outLow)
+              99:    7(ivec4) Load 92(i4outHi)
+             100:    7(ivec4) IAdd 98 99
+             101:    7(ivec4) Load 9(iout)
+             102:    7(ivec4) IAdd 101 100
+                              Store 9(iout) 102
+             106:  103(fvec3) Load 105(v3)
+             111:110(ResType) ExtInst 1(GLSL.std.450) 52(FrexpStruct) 106
+             112:  107(ivec3) CompositeExtract 111 1
+                              Store 109(i3out) 112
+             113:  103(fvec3) CompositeExtract 111 0
+             114:   19(fvec4) Load 21(fout)
+             115:  103(fvec3) VectorShuffle 114 114 0 1 2
+             116:  103(fvec3) FAdd 115 113
+             118:    117(ptr) AccessChain 21(fout) 16
+             119:   18(float) CompositeExtract 116 0
+                              Store 118 119
+             120:    117(ptr) AccessChain 21(fout) 41
+             121:   18(float) CompositeExtract 116 1
+                              Store 120 121
+             123:    117(ptr) AccessChain 21(fout) 122
+             124:   18(float) CompositeExtract 116 2
+                              Store 123 124
+             125:  107(ivec3) Load 109(i3out)
+             126:    7(ivec4) Load 9(iout)
+             127:  107(ivec3) VectorShuffle 126 126 0 1 2
+             128:  107(ivec3) IAdd 127 125
+             130:    129(ptr) AccessChain 9(iout) 16
+             131:      6(int) CompositeExtract 128 0
+                              Store 130 131
+             132:    129(ptr) AccessChain 9(iout) 41
+             133:      6(int) CompositeExtract 128 1
+                              Store 132 133
+             134:    129(ptr) AccessChain 9(iout) 122
+             135:      6(int) CompositeExtract 128 2
+                              Store 134 135
+             138:   18(float) Load 137(v1)
+             142:141(ResType) ExtInst 1(GLSL.std.450) 52(FrexpStruct) 138
+             143:      6(int) CompositeExtract 142 1
+                              Store 140(i1out) 143
+             144:   18(float) CompositeExtract 142 0
+             145:    117(ptr) AccessChain 21(fout) 16
+             146:   18(float) Load 145
+             147:   18(float) FAdd 146 144
+             148:    117(ptr) AccessChain 21(fout) 16
+                              Store 148 147
+             149:      6(int) Load 140(i1out)
+             150:    129(ptr) AccessChain 9(iout) 16
+             151:      6(int) Load 150
+             152:      6(int) IAdd 151 149
+             153:    129(ptr) AccessChain 9(iout) 16
+                              Store 153 152
+             157:  154(fvec2) Load 156(v2)
+             161:  158(ivec2) Load 160(i2)
+             162:  154(fvec2) ExtInst 1(GLSL.std.450) 53(Ldexp) 157 161
+             163:   19(fvec4) Load 21(fout)
+             164:  154(fvec2) VectorShuffle 163 163 0 1
+             165:  154(fvec2) FAdd 164 162
+             166:    117(ptr) AccessChain 21(fout) 16
+             167:   18(float) CompositeExtract 165 0
+                              Store 166 167
+             168:    117(ptr) AccessChain 21(fout) 41
+             169:   18(float) CompositeExtract 165 1
+                              Store 168 169
+             170:   18(float) Load 137(v1)
+             173:      6(int) Load 172(i1)
+             174:   18(float) ExtInst 1(GLSL.std.450) 53(Ldexp) 170 173
+             175:    117(ptr) AccessChain 21(fout) 16
+             176:   18(float) Load 175
+             177:   18(float) FAdd 176 174
+             178:    117(ptr) AccessChain 21(fout) 16
+                              Store 178 177
+             179:      6(int) Load 172(i1)
+             182:      6(int) BitFieldSExtract 179 180 181
+             183:    129(ptr) AccessChain 9(iout) 16
+             184:      6(int) Load 183
+             185:      6(int) IAdd 184 182
+             186:    129(ptr) AccessChain 9(iout) 16
+                              Store 186 185
+             190:  187(ivec3) Load 189(u3)
+             191:  187(ivec3) BitFieldUExtract 190 180 181
+             192:   13(ivec4) Load 15(uout)
+             193:  187(ivec3) VectorShuffle 192 192 0 1 2
+             194:  187(ivec3) IAdd 193 191
+             195:     38(ptr) AccessChain 15(uout) 16
+             196:     12(int) CompositeExtract 194 0
+                              Store 195 196
+             197:     38(ptr) AccessChain 15(uout) 41
+             198:     12(int) CompositeExtract 194 1
+                              Store 197 198
+             199:     38(ptr) AccessChain 15(uout) 122
+             200:     12(int) CompositeExtract 194 2
+                              Store 199 200
+             203:  107(ivec3) Load 202(i3)
+             204:  107(ivec3) Load 202(i3)
+             205:  107(ivec3) BitFieldInsert 203 204 180 181
+             206:    7(ivec4) Load 9(iout)
+             207:  107(ivec3) VectorShuffle 206 206 0 1 2
+             208:  107(ivec3) IAdd 207 205
+             209:    129(ptr) AccessChain 9(iout) 16
+             210:      6(int) CompositeExtract 208 0
+                              Store 209 210
+             211:    129(ptr) AccessChain 9(iout) 41
+             212:      6(int) CompositeExtract 208 1
+                              Store 211 212
+             213:    129(ptr) AccessChain 9(iout) 122
+             214:      6(int) CompositeExtract 208 2
+                              Store 213 214
+             215:     12(int) Load 53(u1)
+             216:     12(int) Load 53(u1)
+             217:     12(int) BitFieldInsert 215 216 180 181
+             218:     38(ptr) AccessChain 15(uout) 16
+             219:     12(int) Load 218
+             220:     12(int) IAdd 219 217
+             221:     38(ptr) AccessChain 15(uout) 16
+                              Store 221 220
+             222:  158(ivec2) Load 160(i2)
+             223:  158(ivec2) BitReverse 222
              224:    7(ivec4) Load 9(iout)
-             225:  144(ivec2) VectorShuffle 224 224 0 1
-             226:  144(ivec2) IAdd 225 223
-             227:    7(ivec4) Load 9(iout)
-             228:    7(ivec4) VectorShuffle 227 226 4 5 2 3
-                              Store 9(iout) 228
-             229:   13(ivec4) Load 67(u4)
-             230:    7(ivec4) ExtInst 1(GLSL.std.450) 73(FindILsb) 229
-             231:    7(ivec4) Load 9(iout)
-             232:    7(ivec4) IAdd 231 230
-                              Store 9(iout) 232
-             233:      6(int) Load 156(i1)
-             234:      6(int) ExtInst 1(GLSL.std.450) 74(FindSMsb) 233
-             235:    135(ptr) AccessChain 9(iout) 16
-             236:      6(int) Load 235
-             237:      6(int) IAdd 236 234
-             238:    135(ptr) AccessChain 9(iout) 16
-                              Store 238 237
-             239:   24(ivec2) Load 26(u2)
-             240:  144(ivec2) ExtInst 1(GLSL.std.450) 75(FindUMsb) 239
-             241:    7(ivec4) Load 9(iout)
-             242:  144(ivec2) VectorShuffle 241 241 0 1
-             243:  144(ivec2) IAdd 242 240
-             244:    7(ivec4) Load 9(iout)
-             245:    7(ivec4) VectorShuffle 244 243 4 5 2 3
-                              Store 9(iout) 245
-             248:   19(fvec4) Load 247(v4)
-             249:     12(int) ExtInst 1(GLSL.std.450) 55(PackUnorm4x8) 248
-             250:     56(ptr) AccessChain 15(uout) 16
-             251:     12(int) Load 250
-             252:     12(int) IAdd 251 249
-             253:     56(ptr) AccessChain 15(uout) 16
-                              Store 253 252
-             254:   19(fvec4) Load 247(v4)
-             255:     12(int) ExtInst 1(GLSL.std.450) 54(PackSnorm4x8) 254
-             256:     56(ptr) AccessChain 15(uout) 16
-             257:     12(int) Load 256
-             258:     12(int) IAdd 257 255
-             259:     56(ptr) AccessChain 15(uout) 16
-                              Store 259 258
-             260:     12(int) Load 47(u1)
-             261:   19(fvec4) ExtInst 1(GLSL.std.450) 64(UnpackUnorm4x8) 260
-             262:   19(fvec4) Load 21(fout)
-             263:   19(fvec4) FAdd 262 261
-                              Store 21(fout) 263
-             264:     12(int) Load 47(u1)
-             265:   19(fvec4) ExtInst 1(GLSL.std.450) 63(UnpackSnorm4x8) 264
-             266:   19(fvec4) Load 21(fout)
-             267:   19(fvec4) FAdd 266 265
-                              Store 21(fout) 267
+             225:  158(ivec2) VectorShuffle 224 224 0 1
+             226:  158(ivec2) IAdd 225 223
+             227:    129(ptr) AccessChain 9(iout) 16
+             228:      6(int) CompositeExtract 226 0
+                              Store 227 228
+             229:    129(ptr) AccessChain 9(iout) 41
+             230:      6(int) CompositeExtract 226 1
+                              Store 229 230
+             231:   13(ivec4) Load 72(u4)
+             232:   13(ivec4) BitReverse 231
+             233:   13(ivec4) Load 15(uout)
+             234:   13(ivec4) IAdd 233 232
+                              Store 15(uout) 234
+             235:      6(int) Load 172(i1)
+             236:      6(int) BitCount 235
+             237:    129(ptr) AccessChain 9(iout) 16
+             238:      6(int) Load 237
+             239:      6(int) IAdd 238 236
+             240:    129(ptr) AccessChain 9(iout) 16
+                              Store 240 239
+             241:  187(ivec3) Load 189(u3)
+             242:  107(ivec3) BitCount 241
+             243:    7(ivec4) Load 9(iout)
+             244:  107(ivec3) VectorShuffle 243 243 0 1 2
+             245:  107(ivec3) IAdd 244 242
+             246:    129(ptr) AccessChain 9(iout) 16
+             247:      6(int) CompositeExtract 245 0
+                              Store 246 247
+             248:    129(ptr) AccessChain 9(iout) 41
+             249:      6(int) CompositeExtract 245 1
+                              Store 248 249
+             250:    129(ptr) AccessChain 9(iout) 122
+             251:      6(int) CompositeExtract 245 2
+                              Store 250 251
+             252:  158(ivec2) Load 160(i2)
+             253:  158(ivec2) ExtInst 1(GLSL.std.450) 73(FindILsb) 252
+             254:    7(ivec4) Load 9(iout)
+             255:  158(ivec2) VectorShuffle 254 254 0 1
+             256:  158(ivec2) IAdd 255 253
+             257:    129(ptr) AccessChain 9(iout) 16
+             258:      6(int) CompositeExtract 256 0
+                              Store 257 258
+             259:    129(ptr) AccessChain 9(iout) 41
+             260:      6(int) CompositeExtract 256 1
+                              Store 259 260
+             261:   13(ivec4) Load 72(u4)
+             262:    7(ivec4) ExtInst 1(GLSL.std.450) 73(FindILsb) 261
+             263:    7(ivec4) Load 9(iout)
+             264:    7(ivec4) IAdd 263 262
+                              Store 9(iout) 264
+             265:      6(int) Load 172(i1)
+             266:      6(int) ExtInst 1(GLSL.std.450) 74(FindSMsb) 265
+             267:    129(ptr) AccessChain 9(iout) 16
+             268:      6(int) Load 267
+             269:      6(int) IAdd 268 266
+             270:    129(ptr) AccessChain 9(iout) 16
+                              Store 270 269
+             271:   24(ivec2) Load 26(u2)
+             272:  158(ivec2) ExtInst 1(GLSL.std.450) 75(FindUMsb) 271
+             273:    7(ivec4) Load 9(iout)
+             274:  158(ivec2) VectorShuffle 273 273 0 1
+             275:  158(ivec2) IAdd 274 272
+             276:    129(ptr) AccessChain 9(iout) 16
+             277:      6(int) CompositeExtract 275 0
+                              Store 276 277
+             278:    129(ptr) AccessChain 9(iout) 41
+             279:      6(int) CompositeExtract 275 1
+                              Store 278 279
+             282:   19(fvec4) Load 281(v4)
+             283:     12(int) ExtInst 1(GLSL.std.450) 55(PackUnorm4x8) 282
+             284:     38(ptr) AccessChain 15(uout) 16
+             285:     12(int) Load 284
+             286:     12(int) IAdd 285 283
+             287:     38(ptr) AccessChain 15(uout) 16
+                              Store 287 286
+             288:   19(fvec4) Load 281(v4)
+             289:     12(int) ExtInst 1(GLSL.std.450) 54(PackSnorm4x8) 288
+             290:     38(ptr) AccessChain 15(uout) 16
+             291:     12(int) Load 290
+             292:     12(int) IAdd 291 289
+             293:     38(ptr) AccessChain 15(uout) 16
+                              Store 293 292
+             294:     12(int) Load 53(u1)
+             295:   19(fvec4) ExtInst 1(GLSL.std.450) 64(UnpackUnorm4x8) 294
+             296:   19(fvec4) Load 21(fout)
+             297:   19(fvec4) FAdd 296 295
+                              Store 21(fout) 297
+             298:     12(int) Load 53(u1)
+             299:   19(fvec4) ExtInst 1(GLSL.std.450) 63(UnpackSnorm4x8) 298
+             300:   19(fvec4) Load 21(fout)
+             301:   19(fvec4) FAdd 300 299
+                              Store 21(fout) 301
                               Return
                               FunctionEnd
diff --git a/third_party/vulkan-deps/glslang/src/Test/baseResults/spv.interpOps.frag.out b/third_party/vulkan-deps/glslang/src/Test/baseResults/spv.interpOps.frag.out
index 6c285e7..808c1cd 100644
--- a/third_party/vulkan-deps/glslang/src/Test/baseResults/spv.interpOps.frag.out
+++ b/third_party/vulkan-deps/glslang/src/Test/baseResults/spv.interpOps.frag.out
@@ -1,33 +1,33 @@
 spv.interpOps.frag
 // Module Version 10000
 // Generated by (magic number): 8000a
-// Id's are bound by 100
+// Id's are bound by 120
 
                               Capability Shader
                               Capability InterpolationFunction
                1:             ExtInstImport  "GLSL.std.450"
                               MemoryModel Logical GLSL450
-                              EntryPoint Fragment 4  "main" 13 24 33 41 47 72 98
+                              EntryPoint Fragment 4  "main" 13 24 36 49 55 86 118
                               ExecutionMode 4 OriginUpperLeft
                               Source GLSL 450
                               Name 4  "main"
                               Name 9  "f4"
                               Name 13  "if1"
                               Name 24  "if2"
-                              Name 33  "if3"
-                              Name 41  "if4"
-                              Name 47  "samp"
-                              Name 72  "offset"
-                              Name 98  "fragColor"
+                              Name 36  "if3"
+                              Name 49  "if4"
+                              Name 55  "samp"
+                              Name 86  "offset"
+                              Name 118  "fragColor"
                               Decorate 13(if1) Location 0
                               Decorate 24(if2) Location 1
-                              Decorate 33(if3) Location 2
-                              Decorate 41(if4) Location 3
-                              Decorate 47(samp) Flat
-                              Decorate 47(samp) Location 4
-                              Decorate 72(offset) Flat
-                              Decorate 72(offset) Location 5
-                              Decorate 98(fragColor) Location 0
+                              Decorate 36(if3) Location 2
+                              Decorate 49(if4) Location 3
+                              Decorate 55(samp) Flat
+                              Decorate 55(samp) Location 4
+                              Decorate 86(offset) Flat
+                              Decorate 86(offset) Location 5
+                              Decorate 118(fragColor) Location 0
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeFloat 32
@@ -43,17 +43,19 @@
               22:             TypeVector 6(float) 2
               23:             TypePointer Input 22(fvec2)
          24(if2):     23(ptr) Variable Input
-              31:             TypeVector 6(float) 3
-              32:             TypePointer Input 31(fvec3)
-         33(if3):     32(ptr) Variable Input
-              40:             TypePointer Input 7(fvec4)
-         41(if4):     40(ptr) Variable Input
-              45:             TypeInt 32 1
-              46:             TypePointer Input 45(int)
-        47(samp):     46(ptr) Variable Input
-      72(offset):     23(ptr) Variable Input
-              97:             TypePointer Output 7(fvec4)
-   98(fragColor):     97(ptr) Variable Output
+              31:     15(int) Constant 1
+              34:             TypeVector 6(float) 3
+              35:             TypePointer Input 34(fvec3)
+         36(if3):     35(ptr) Variable Input
+              45:     15(int) Constant 2
+              48:             TypePointer Input 7(fvec4)
+         49(if4):     48(ptr) Variable Input
+              53:             TypeInt 32 1
+              54:             TypePointer Input 53(int)
+        55(samp):     54(ptr) Variable Input
+      86(offset):     23(ptr) Variable Input
+             117:             TypePointer Output 7(fvec4)
+  118(fragColor):    117(ptr) Variable Output
          4(main):           2 Function None 3
                5:             Label
            9(f4):      8(ptr) Variable Function
@@ -68,77 +70,104 @@
               26:    7(fvec4) Load 9(f4)
               27:   22(fvec2) VectorShuffle 26 26 0 1
               28:   22(fvec2) FAdd 27 25
-              29:    7(fvec4) Load 9(f4)
-              30:    7(fvec4) VectorShuffle 29 28 4 5 2 3
-                              Store 9(f4) 30
-              34:   31(fvec3) ExtInst 1(GLSL.std.450) 76(InterpolateAtCentroid) 33(if3)
-              35:    7(fvec4) Load 9(f4)
-              36:   31(fvec3) VectorShuffle 35 35 0 1 2
-              37:   31(fvec3) FAdd 36 34
+              29:     17(ptr) AccessChain 9(f4) 16
+              30:    6(float) CompositeExtract 28 0
+                              Store 29 30
+              32:     17(ptr) AccessChain 9(f4) 31
+              33:    6(float) CompositeExtract 28 1
+                              Store 32 33
+              37:   34(fvec3) ExtInst 1(GLSL.std.450) 76(InterpolateAtCentroid) 36(if3)
               38:    7(fvec4) Load 9(f4)
-              39:    7(fvec4) VectorShuffle 38 37 4 5 6 3
-                              Store 9(f4) 39
-              42:    7(fvec4) ExtInst 1(GLSL.std.450) 76(InterpolateAtCentroid) 41(if4)
-              43:    7(fvec4) Load 9(f4)
-              44:    7(fvec4) FAdd 43 42
-                              Store 9(f4) 44
-              48:     45(int) Load 47(samp)
-              49:    6(float) ExtInst 1(GLSL.std.450) 77(InterpolateAtSample) 13(if1) 48
-              50:     17(ptr) AccessChain 9(f4) 16
-              51:    6(float) Load 50
-              52:    6(float) FAdd 51 49
-              53:     17(ptr) AccessChain 9(f4) 16
-                              Store 53 52
-              54:     45(int) Load 47(samp)
-              55:   22(fvec2) ExtInst 1(GLSL.std.450) 77(InterpolateAtSample) 24(if2) 54
-              56:    7(fvec4) Load 9(f4)
-              57:   22(fvec2) VectorShuffle 56 56 0 1
-              58:   22(fvec2) FAdd 57 55
-              59:    7(fvec4) Load 9(f4)
-              60:    7(fvec4) VectorShuffle 59 58 4 5 2 3
-                              Store 9(f4) 60
-              61:     45(int) Load 47(samp)
-              62:   31(fvec3) ExtInst 1(GLSL.std.450) 77(InterpolateAtSample) 33(if3) 61
-              63:    7(fvec4) Load 9(f4)
-              64:   31(fvec3) VectorShuffle 63 63 0 1 2
-              65:   31(fvec3) FAdd 64 62
-              66:    7(fvec4) Load 9(f4)
-              67:    7(fvec4) VectorShuffle 66 65 4 5 6 3
-                              Store 9(f4) 67
-              68:     45(int) Load 47(samp)
-              69:    7(fvec4) ExtInst 1(GLSL.std.450) 77(InterpolateAtSample) 41(if4) 68
-              70:    7(fvec4) Load 9(f4)
-              71:    7(fvec4) FAdd 70 69
-                              Store 9(f4) 71
-              73:   22(fvec2) Load 72(offset)
-              74:    6(float) ExtInst 1(GLSL.std.450) 78(InterpolateAtOffset) 13(if1) 73
-              75:     17(ptr) AccessChain 9(f4) 16
-              76:    6(float) Load 75
-              77:    6(float) FAdd 76 74
-              78:     17(ptr) AccessChain 9(f4) 16
-                              Store 78 77
-              79:   22(fvec2) Load 72(offset)
-              80:   22(fvec2) ExtInst 1(GLSL.std.450) 78(InterpolateAtOffset) 24(if2) 79
-              81:    7(fvec4) Load 9(f4)
-              82:   22(fvec2) VectorShuffle 81 81 0 1
-              83:   22(fvec2) FAdd 82 80
+              39:   34(fvec3) VectorShuffle 38 38 0 1 2
+              40:   34(fvec3) FAdd 39 37
+              41:     17(ptr) AccessChain 9(f4) 16
+              42:    6(float) CompositeExtract 40 0
+                              Store 41 42
+              43:     17(ptr) AccessChain 9(f4) 31
+              44:    6(float) CompositeExtract 40 1
+                              Store 43 44
+              46:     17(ptr) AccessChain 9(f4) 45
+              47:    6(float) CompositeExtract 40 2
+                              Store 46 47
+              50:    7(fvec4) ExtInst 1(GLSL.std.450) 76(InterpolateAtCentroid) 49(if4)
+              51:    7(fvec4) Load 9(f4)
+              52:    7(fvec4) FAdd 51 50
+                              Store 9(f4) 52
+              56:     53(int) Load 55(samp)
+              57:    6(float) ExtInst 1(GLSL.std.450) 77(InterpolateAtSample) 13(if1) 56
+              58:     17(ptr) AccessChain 9(f4) 16
+              59:    6(float) Load 58
+              60:    6(float) FAdd 59 57
+              61:     17(ptr) AccessChain 9(f4) 16
+                              Store 61 60
+              62:     53(int) Load 55(samp)
+              63:   22(fvec2) ExtInst 1(GLSL.std.450) 77(InterpolateAtSample) 24(if2) 62
+              64:    7(fvec4) Load 9(f4)
+              65:   22(fvec2) VectorShuffle 64 64 0 1
+              66:   22(fvec2) FAdd 65 63
+              67:     17(ptr) AccessChain 9(f4) 16
+              68:    6(float) CompositeExtract 66 0
+                              Store 67 68
+              69:     17(ptr) AccessChain 9(f4) 31
+              70:    6(float) CompositeExtract 66 1
+                              Store 69 70
+              71:     53(int) Load 55(samp)
+              72:   34(fvec3) ExtInst 1(GLSL.std.450) 77(InterpolateAtSample) 36(if3) 71
+              73:    7(fvec4) Load 9(f4)
+              74:   34(fvec3) VectorShuffle 73 73 0 1 2
+              75:   34(fvec3) FAdd 74 72
+              76:     17(ptr) AccessChain 9(f4) 16
+              77:    6(float) CompositeExtract 75 0
+                              Store 76 77
+              78:     17(ptr) AccessChain 9(f4) 31
+              79:    6(float) CompositeExtract 75 1
+                              Store 78 79
+              80:     17(ptr) AccessChain 9(f4) 45
+              81:    6(float) CompositeExtract 75 2
+                              Store 80 81
+              82:     53(int) Load 55(samp)
+              83:    7(fvec4) ExtInst 1(GLSL.std.450) 77(InterpolateAtSample) 49(if4) 82
               84:    7(fvec4) Load 9(f4)
-              85:    7(fvec4) VectorShuffle 84 83 4 5 2 3
+              85:    7(fvec4) FAdd 84 83
                               Store 9(f4) 85
-              86:   22(fvec2) Load 72(offset)
-              87:   31(fvec3) ExtInst 1(GLSL.std.450) 78(InterpolateAtOffset) 33(if3) 86
-              88:    7(fvec4) Load 9(f4)
-              89:   31(fvec3) VectorShuffle 88 88 0 1 2
-              90:   31(fvec3) FAdd 89 87
-              91:    7(fvec4) Load 9(f4)
-              92:    7(fvec4) VectorShuffle 91 90 4 5 6 3
-                              Store 9(f4) 92
-              93:   22(fvec2) Load 72(offset)
-              94:    7(fvec4) ExtInst 1(GLSL.std.450) 78(InterpolateAtOffset) 41(if4) 93
+              87:   22(fvec2) Load 86(offset)
+              88:    6(float) ExtInst 1(GLSL.std.450) 78(InterpolateAtOffset) 13(if1) 87
+              89:     17(ptr) AccessChain 9(f4) 16
+              90:    6(float) Load 89
+              91:    6(float) FAdd 90 88
+              92:     17(ptr) AccessChain 9(f4) 16
+                              Store 92 91
+              93:   22(fvec2) Load 86(offset)
+              94:   22(fvec2) ExtInst 1(GLSL.std.450) 78(InterpolateAtOffset) 24(if2) 93
               95:    7(fvec4) Load 9(f4)
-              96:    7(fvec4) FAdd 95 94
-                              Store 9(f4) 96
-              99:    7(fvec4) Load 9(f4)
-                              Store 98(fragColor) 99
+              96:   22(fvec2) VectorShuffle 95 95 0 1
+              97:   22(fvec2) FAdd 96 94
+              98:     17(ptr) AccessChain 9(f4) 16
+              99:    6(float) CompositeExtract 97 0
+                              Store 98 99
+             100:     17(ptr) AccessChain 9(f4) 31
+             101:    6(float) CompositeExtract 97 1
+                              Store 100 101
+             102:   22(fvec2) Load 86(offset)
+             103:   34(fvec3) ExtInst 1(GLSL.std.450) 78(InterpolateAtOffset) 36(if3) 102
+             104:    7(fvec4) Load 9(f4)
+             105:   34(fvec3) VectorShuffle 104 104 0 1 2
+             106:   34(fvec3) FAdd 105 103
+             107:     17(ptr) AccessChain 9(f4) 16
+             108:    6(float) CompositeExtract 106 0
+                              Store 107 108
+             109:     17(ptr) AccessChain 9(f4) 31
+             110:    6(float) CompositeExtract 106 1
+                              Store 109 110
+             111:     17(ptr) AccessChain 9(f4) 45
+             112:    6(float) CompositeExtract 106 2
+                              Store 111 112
+             113:   22(fvec2) Load 86(offset)
+             114:    7(fvec4) ExtInst 1(GLSL.std.450) 78(InterpolateAtOffset) 49(if4) 113
+             115:    7(fvec4) Load 9(f4)
+             116:    7(fvec4) FAdd 115 114
+                              Store 9(f4) 116
+             119:    7(fvec4) Load 9(f4)
+                              Store 118(fragColor) 119
                               Return
                               FunctionEnd
diff --git a/third_party/vulkan-deps/glslang/src/Test/baseResults/spv.invariantAll.vert.out b/third_party/vulkan-deps/glslang/src/Test/baseResults/spv.invariantAll.vert.out
new file mode 100644
index 0000000..ec5ad30
--- /dev/null
+++ b/third_party/vulkan-deps/glslang/src/Test/baseResults/spv.invariantAll.vert.out
@@ -0,0 +1,55 @@
+spv.invariantAll.vert
+// Module Version 10000
+// Generated by (magic number): 8000a
+// Id's are bound by 25
+
+                              Capability Shader
+               1:             ExtInstImport  "GLSL.std.450"
+                              MemoryModel Logical GLSL450
+                              EntryPoint Vertex 4  "main" 13 17
+                              Source GLSL 450
+                              Name 4  "main"
+                              Name 11  "gl_PerVertex"
+                              MemberName 11(gl_PerVertex) 0  "gl_Position"
+                              MemberName 11(gl_PerVertex) 1  "gl_PointSize"
+                              MemberName 11(gl_PerVertex) 2  "gl_ClipDistance"
+                              MemberName 11(gl_PerVertex) 3  "gl_CullDistance"
+                              Name 13  ""
+                              Name 17  "v"
+                              MemberDecorate 11(gl_PerVertex) 0 Invariant
+                              MemberDecorate 11(gl_PerVertex) 0 BuiltIn Position
+                              MemberDecorate 11(gl_PerVertex) 1 Invariant
+                              MemberDecorate 11(gl_PerVertex) 1 BuiltIn PointSize
+                              MemberDecorate 11(gl_PerVertex) 2 Invariant
+                              MemberDecorate 11(gl_PerVertex) 2 BuiltIn ClipDistance
+                              MemberDecorate 11(gl_PerVertex) 3 Invariant
+                              MemberDecorate 11(gl_PerVertex) 3 BuiltIn CullDistance
+                              Decorate 11(gl_PerVertex) Block
+                              Decorate 17(v) Location 0
+                              Decorate 17(v) Invariant
+               2:             TypeVoid
+               3:             TypeFunction 2
+               6:             TypeFloat 32
+               7:             TypeVector 6(float) 4
+               8:             TypeInt 32 0
+               9:      8(int) Constant 1
+              10:             TypeArray 6(float) 9
+11(gl_PerVertex):             TypeStruct 7(fvec4) 6(float) 10 10
+              12:             TypePointer Output 11(gl_PerVertex)
+              13:     12(ptr) Variable Output
+              14:             TypeInt 32 1
+              15:     14(int) Constant 0
+              16:             TypePointer Output 6(float)
+           17(v):     16(ptr) Variable Output
+              20:    6(float) Constant 0
+              21:    6(float) Constant 1065353216
+              23:             TypePointer Output 7(fvec4)
+         4(main):           2 Function None 3
+               5:             Label
+              18:    6(float) Load 17(v)
+              19:    6(float) Load 17(v)
+              22:    7(fvec4) CompositeConstruct 18 19 20 21
+              24:     23(ptr) AccessChain 13 15
+                              Store 24 22
+                              Return
+                              FunctionEnd
diff --git a/third_party/vulkan-deps/glslang/src/Test/baseResults/spv.memoryQualifier.frag.out b/third_party/vulkan-deps/glslang/src/Test/baseResults/spv.memoryQualifier.frag.out
index 5f0647b..fce8c9c 100644
--- a/third_party/vulkan-deps/glslang/src/Test/baseResults/spv.memoryQualifier.frag.out
+++ b/third_party/vulkan-deps/glslang/src/Test/baseResults/spv.memoryQualifier.frag.out
@@ -2,7 +2,7 @@
 Validation failed
 // Module Version 10000
 // Generated by (magic number): 8000a
-// Id's are bound by 97
+// Id's are bound by 105
 
                               Capability Shader
                               Capability ImageRect
@@ -106,14 +106,16 @@
               58:             TypePointer Uniform 6(float)
               61:             TypePointer Function 6(float)
               63:             TypePointer Uniform 47(fvec2)
-              71:     14(int) Constant 2
-              72:             TypePointer Uniform 48(fvec3)
-              80:     14(int) Constant 5
-              83:             TypeInt 32 0
-              84:     83(int) Constant 1
-              88:     83(int) Constant 3
-              93:     14(int) Constant 3
-              95:             TypePointer Uniform 7(fvec4)
+              69:             TypeInt 32 0
+              70:     69(int) Constant 0
+              73:     69(int) Constant 1
+              76:     14(int) Constant 2
+              77:             TypePointer Uniform 48(fvec3)
+              87:     69(int) Constant 2
+              90:     14(int) Constant 5
+              96:     69(int) Constant 3
+             101:     14(int) Constant 3
+             103:             TypePointer Uniform 7(fvec4)
          4(main):           2 Function None 3
                5:             Label
         9(texel):      8(ptr) Variable Function
@@ -149,29 +151,38 @@
               66:    7(fvec4) Load 9(texel)
               67:   47(fvec2) VectorShuffle 66 66 0 1
               68:   47(fvec2) FAdd 67 65
-              69:    7(fvec4) Load 9(texel)
-              70:    7(fvec4) VectorShuffle 69 68 4 5 2 3
-                              Store 9(texel) 70
-              73:     72(ptr) AccessChain 52 71
-              74:   48(fvec3) Load 73
-              75:    7(fvec4) Load 9(texel)
-              76:   48(fvec3) VectorShuffle 75 75 0 1 2
-              77:   48(fvec3) FSub 76 74
-              78:    7(fvec4) Load 9(texel)
-              79:    7(fvec4) VectorShuffle 78 77 4 5 6 3
-                              Store 9(texel) 79
-              81:     58(ptr) AccessChain 52 80 57
-              82:    6(float) Load 81
-              85:     58(ptr) AccessChain 52 80 15 84
-              86:    6(float) Load 85
-              87:    6(float) FAdd 82 86
-              89:     61(ptr) AccessChain 9(texel) 88
-              90:    6(float) Load 89
-              91:    6(float) FAdd 90 87
-              92:     61(ptr) AccessChain 9(texel) 88
-                              Store 92 91
-              94:    7(fvec4) Load 9(texel)
-              96:     95(ptr) AccessChain 52 93
-                              Store 96 94
+              71:     61(ptr) AccessChain 9(texel) 70
+              72:    6(float) CompositeExtract 68 0
+                              Store 71 72
+              74:     61(ptr) AccessChain 9(texel) 73
+              75:    6(float) CompositeExtract 68 1
+                              Store 74 75
+              78:     77(ptr) AccessChain 52 76
+              79:   48(fvec3) Load 78
+              80:    7(fvec4) Load 9(texel)
+              81:   48(fvec3) VectorShuffle 80 80 0 1 2
+              82:   48(fvec3) FSub 81 79
+              83:     61(ptr) AccessChain 9(texel) 70
+              84:    6(float) CompositeExtract 82 0
+                              Store 83 84
+              85:     61(ptr) AccessChain 9(texel) 73
+              86:    6(float) CompositeExtract 82 1
+                              Store 85 86
+              88:     61(ptr) AccessChain 9(texel) 87
+              89:    6(float) CompositeExtract 82 2
+                              Store 88 89
+              91:     58(ptr) AccessChain 52 90 57
+              92:    6(float) Load 91
+              93:     58(ptr) AccessChain 52 90 15 73
+              94:    6(float) Load 93
+              95:    6(float) FAdd 92 94
+              97:     61(ptr) AccessChain 9(texel) 96
+              98:    6(float) Load 97
+              99:    6(float) FAdd 98 95
+             100:     61(ptr) AccessChain 9(texel) 96
+                              Store 100 99
+             102:    7(fvec4) Load 9(texel)
+             104:    103(ptr) AccessChain 52 101
+                              Store 104 102
                               Return
                               FunctionEnd
diff --git a/third_party/vulkan-deps/glslang/src/Test/baseResults/spv.meshShaderUserDefined.mesh.out b/third_party/vulkan-deps/glslang/src/Test/baseResults/spv.meshShaderUserDefined.mesh.out
index fc2730c..01ee933 100644
--- a/third_party/vulkan-deps/glslang/src/Test/baseResults/spv.meshShaderUserDefined.mesh.out
+++ b/third_party/vulkan-deps/glslang/src/Test/baseResults/spv.meshShaderUserDefined.mesh.out
@@ -1,13 +1,13 @@
 spv.meshShaderUserDefined.mesh
 // Module Version 10000
 // Generated by (magic number): 8000a
-// Id's are bound by 138
+// Id's are bound by 141
 
                               Capability MeshShadingNV
                               Extension  "SPV_NV_mesh_shader"
                1:             ExtInstImport  "GLSL.std.450"
                               MemoryModel Logical GLSL450
-                              EntryPoint MeshNV 4  "main" 11 17 34 101
+                              EntryPoint MeshNV 4  "main" 11 17 34 104
                               ExecutionMode 4 LocalSize 32 1 1
                               ExecutionMode 4 OutputVertices 81
                               ExecutionMode 4 OutputPrimitivesNV 32
@@ -27,11 +27,11 @@
                               MemberName 30(myblock) 4  "m"
                               MemberName 30(myblock) 5  "mArr"
                               Name 34  "blk"
-                              Name 97  "myblock2"
-                              MemberName 97(myblock2) 0  "f"
-                              MemberName 97(myblock2) 1  "pos"
-                              MemberName 97(myblock2) 2  "m"
-                              Name 101  "blk2"
+                              Name 100  "myblock2"
+                              MemberName 100(myblock2) 0  "f"
+                              MemberName 100(myblock2) 1  "pos"
+                              MemberName 100(myblock2) 2  "m"
+                              Name 104  "blk2"
                               Decorate 11(gl_LocalInvocationID) BuiltIn LocalInvocationId
                               Decorate 17(gl_WorkGroupID) BuiltIn WorkgroupId
                               MemberDecorate 30(myblock) 0 PerPrimitiveNV
@@ -42,9 +42,9 @@
                               MemberDecorate 30(myblock) 5 PerPrimitiveNV
                               Decorate 30(myblock) Block
                               Decorate 34(blk) Location 0
-                              Decorate 97(myblock2) Block
-                              Decorate 101(blk2) Location 20
-                              Decorate 137 BuiltIn WorkgroupSize
+                              Decorate 100(myblock2) Block
+                              Decorate 104(blk2) Location 20
+                              Decorate 140 BuiltIn WorkgroupSize
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeInt 32 0
@@ -83,30 +83,30 @@
               56:   23(fvec3) ConstantComposite 53 54 55
               57:             TypePointer Output 23(fvec3)
               63:     36(int) Constant 3
-              68:             TypePointer Output 24(fvec4)
-              74:     36(int) Constant 4
-              75:   20(float) Constant 1098907648
-              76:   24(fvec4) ConstantComposite 55 53 54 75
-              81:     36(int) Constant 5
-              84:      6(int) Constant 3
-              91:   20(float) Constant 1099431936
-              92:   20(float) Constant 1099956224
-              93:   20(float) Constant 1100480512
-              94:   23(fvec3) ConstantComposite 91 92 93
-              96:      6(int) Constant 264
-    97(myblock2):             TypeStruct 20(float) 24(fvec4) 26
-              98:      6(int) Constant 81
-              99:             TypeArray 97(myblock2) 98
-             100:             TypePointer Output 99
-       101(blk2):    100(ptr) Variable Output
-             107:   20(float) Constant 1101004800
-             111:   20(float) Constant 1101529088
-             112:   20(float) Constant 1102053376
-             113:   20(float) Constant 1102577664
-             114:   20(float) Constant 1103101952
-             115:   24(fvec4) ConstantComposite 111 112 113 114
-             127:   20(float) Constant 1105723392
-             137:    9(ivec3) ConstantComposite 31 42 42
+              72:      6(int) Constant 3
+              77:     36(int) Constant 4
+              78:   20(float) Constant 1098907648
+              79:   24(fvec4) ConstantComposite 55 53 54 78
+              80:             TypePointer Output 24(fvec4)
+              85:     36(int) Constant 5
+              94:   20(float) Constant 1099431936
+              95:   20(float) Constant 1099956224
+              96:   20(float) Constant 1100480512
+              97:   23(fvec3) ConstantComposite 94 95 96
+              99:      6(int) Constant 264
+   100(myblock2):             TypeStruct 20(float) 24(fvec4) 26
+             101:      6(int) Constant 81
+             102:             TypeArray 100(myblock2) 101
+             103:             TypePointer Output 102
+       104(blk2):    103(ptr) Variable Output
+             110:   20(float) Constant 1101004800
+             114:   20(float) Constant 1101529088
+             115:   20(float) Constant 1102053376
+             116:   20(float) Constant 1102577664
+             117:   20(float) Constant 1103101952
+             118:   24(fvec4) ConstantComposite 114 115 116 117
+             130:   20(float) Constant 1105723392
+             140:    9(ivec3) ConstantComposite 31 42 42
          4(main):           2 Function None 3
                5:             Label
           8(iid):      7(ptr) Variable Function
@@ -140,64 +140,69 @@
               65:      6(int) UDiv 64 28
               66:     57(ptr) AccessChain 34(blk) 65 52
               67:   23(fvec3) Load 66
-              69:     68(ptr) AccessChain 34(blk) 62 63 44
-              70:   24(fvec4) Load 69
-              71:   24(fvec4) VectorShuffle 70 67 0 4 5 6
-                              Store 69 71
-              72:      6(int) Load 8(iid)
-              73:      6(int) UDiv 72 21
-              77:     68(ptr) AccessChain 34(blk) 73 74 52
-              78:   24(fvec4) Load 77
-              79:   24(fvec4) VectorShuffle 78 76 7 6 5 4
-                              Store 77 79
-              80:      6(int) Load 8(iid)
-              82:      6(int) Load 8(iid)
-              83:      6(int) UDiv 82 21
-              85:     39(ptr) AccessChain 34(blk) 83 74 52 84
-              86:   20(float) Load 85
-              87:     39(ptr) AccessChain 34(blk) 80 81 37 44 42
-                              Store 87 86
-              88:      6(int) Load 8(iid)
-              89:      6(int) IMul 88 21
-              90:      6(int) Load 16(gid)
-              95:     57(ptr) AccessChain 34(blk) 89 81 44 90
-                              Store 95 94
-                              MemoryBarrier 42 96
-                              ControlBarrier 28 28 96
-             102:      6(int) Load 8(iid)
-             103:      6(int) Load 8(iid)
-             104:      6(int) ISub 103 42
-             105:     39(ptr) AccessChain 101(blk2) 104 37
-             106:   20(float) Load 105
-             108:   20(float) FAdd 106 107
-             109:     39(ptr) AccessChain 101(blk2) 102 37
-                              Store 109 108
-             110:      6(int) Load 8(iid)
-             116:     68(ptr) AccessChain 101(blk2) 110 44
-                              Store 116 115
-             117:      6(int) Load 8(iid)
-             118:      6(int) IAdd 117 42
-             119:      6(int) Load 16(gid)
+              68:     39(ptr) AccessChain 34(blk) 62 63 44 42
+              69:   20(float) CompositeExtract 67 0
+                              Store 68 69
+              70:     39(ptr) AccessChain 34(blk) 62 63 44 28
+              71:   20(float) CompositeExtract 67 1
+                              Store 70 71
+              73:     39(ptr) AccessChain 34(blk) 62 63 44 72
+              74:   20(float) CompositeExtract 67 2
+                              Store 73 74
+              75:      6(int) Load 8(iid)
+              76:      6(int) UDiv 75 21
+              81:     80(ptr) AccessChain 34(blk) 76 77 52
+              82:   24(fvec4) Load 81
+              83:   24(fvec4) VectorShuffle 82 79 7 6 5 4
+                              Store 81 83
+              84:      6(int) Load 8(iid)
+              86:      6(int) Load 8(iid)
+              87:      6(int) UDiv 86 21
+              88:     39(ptr) AccessChain 34(blk) 87 77 52 72
+              89:   20(float) Load 88
+              90:     39(ptr) AccessChain 34(blk) 84 85 37 44 42
+                              Store 90 89
+              91:      6(int) Load 8(iid)
+              92:      6(int) IMul 91 21
+              93:      6(int) Load 16(gid)
+              98:     57(ptr) AccessChain 34(blk) 92 85 44 93
+                              Store 98 97
+                              MemoryBarrier 42 99
+                              ControlBarrier 28 28 99
+             105:      6(int) Load 8(iid)
+             106:      6(int) Load 8(iid)
+             107:      6(int) ISub 106 42
+             108:     39(ptr) AccessChain 104(blk2) 107 37
+             109:   20(float) Load 108
+             111:   20(float) FAdd 109 110
+             112:     39(ptr) AccessChain 104(blk2) 105 37
+                              Store 112 111
+             113:      6(int) Load 8(iid)
+             119:     80(ptr) AccessChain 104(blk2) 113 44
+                              Store 119 118
              120:      6(int) Load 8(iid)
-             121:     68(ptr) AccessChain 101(blk2) 120 44
-             122:   24(fvec4) Load 121
-             123:     68(ptr) AccessChain 101(blk2) 118 52 119
-                              Store 123 122
-             124:      6(int) Load 8(iid)
-             125:      6(int) IAdd 124 42
-             126:      6(int) Load 16(gid)
-             128:     39(ptr) AccessChain 101(blk2) 125 52 126 28
-                              Store 128 127
-             129:      6(int) Load 8(iid)
-             130:      6(int) IAdd 129 28
-             131:      6(int) Load 8(iid)
-             132:      6(int) IAdd 131 42
-             133:      6(int) Load 16(gid)
-             134:     68(ptr) AccessChain 101(blk2) 132 52 133
-             135:   24(fvec4) Load 134
-             136:     68(ptr) AccessChain 101(blk2) 130 52 63
-                              Store 136 135
-                              MemoryBarrier 42 96
-                              ControlBarrier 28 28 96
+             121:      6(int) IAdd 120 42
+             122:      6(int) Load 16(gid)
+             123:      6(int) Load 8(iid)
+             124:     80(ptr) AccessChain 104(blk2) 123 44
+             125:   24(fvec4) Load 124
+             126:     80(ptr) AccessChain 104(blk2) 121 52 122
+                              Store 126 125
+             127:      6(int) Load 8(iid)
+             128:      6(int) IAdd 127 42
+             129:      6(int) Load 16(gid)
+             131:     39(ptr) AccessChain 104(blk2) 128 52 129 28
+                              Store 131 130
+             132:      6(int) Load 8(iid)
+             133:      6(int) IAdd 132 28
+             134:      6(int) Load 8(iid)
+             135:      6(int) IAdd 134 42
+             136:      6(int) Load 16(gid)
+             137:     80(ptr) AccessChain 104(blk2) 135 52 136
+             138:   24(fvec4) Load 137
+             139:     80(ptr) AccessChain 104(blk2) 133 52 63
+                              Store 139 138
+                              MemoryBarrier 42 99
+                              ControlBarrier 28 28 99
                               Return
                               FunctionEnd
diff --git a/third_party/vulkan-deps/glslang/src/Test/baseResults/spv.precise.tese.out b/third_party/vulkan-deps/glslang/src/Test/baseResults/spv.precise.tese.out
index a23b073..7db4ed0 100644
--- a/third_party/vulkan-deps/glslang/src/Test/baseResults/spv.precise.tese.out
+++ b/third_party/vulkan-deps/glslang/src/Test/baseResults/spv.precise.tese.out
@@ -36,10 +36,6 @@
                               Decorate 43 NoContraction
                               Decorate 62(in_f_color) RelaxedPrecision
                               Decorate 62(in_f_color) Location 0
-                              Decorate 67 RelaxedPrecision
-                              Decorate 68 RelaxedPrecision
-                              Decorate 69 RelaxedPrecision
-                              Decorate 70 RelaxedPrecision
                               Decorate 97 NoContraction
                               Decorate 99 NoContraction
                               Decorate 101 NoContraction
diff --git a/third_party/vulkan-deps/glslang/src/Test/baseResults/spv.rw.autoassign.frag.out b/third_party/vulkan-deps/glslang/src/Test/baseResults/spv.rw.autoassign.frag.out
index c696c52..27db336 100644
--- a/third_party/vulkan-deps/glslang/src/Test/baseResults/spv.rw.autoassign.frag.out
+++ b/third_party/vulkan-deps/glslang/src/Test/baseResults/spv.rw.autoassign.frag.out
@@ -1,15 +1,14 @@
 spv.rw.autoassign.frag
-Validation failed
 // Module Version 10000
 // Generated by (magic number): 8000a
-// Id's are bound by 42
+// Id's are bound by 45
 
                               Capability Shader
                               Capability Image1D
                               Capability ImageBuffer
                1:             ExtInstImport  "GLSL.std.450"
                               MemoryModel Logical GLSL450
-                              EntryPoint Fragment 4  "main" 39
+                              EntryPoint Fragment 4  "main" 42
                               ExecutionMode 4 OriginUpperLeft
                               Source HLSL 500
                               Name 4  "main"
@@ -18,15 +17,15 @@
                               Name 10  "@main("
                               Name 13  "r00"
                               Name 16  "g_tTex1df1"
-                              Name 23  "r01"
-                              Name 26  "g_tBuf1du1"
-                              Name 30  "psout"
-                              Name 39  "@entryPointOutput.Color"
+                              Name 24  "r01"
+                              Name 27  "g_tBuf1du1"
+                              Name 33  "psout"
+                              Name 42  "@entryPointOutput.Color"
                               Decorate 16(g_tTex1df1) DescriptorSet 0
                               Decorate 16(g_tTex1df1) Binding 20
-                              Decorate 26(g_tBuf1du1) DescriptorSet 0
-                              Decorate 26(g_tBuf1du1) Binding 21
-                              Decorate 39(@entryPointOutput.Color) Location 0
+                              Decorate 27(g_tBuf1du1) DescriptorSet 0
+                              Decorate 27(g_tBuf1du1) Binding 21
+                              Decorate 42(@entryPointOutput.Color) Location 0
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeFloat 32
@@ -39,37 +38,40 @@
   16(g_tTex1df1):     15(ptr) Variable UniformConstant
               18:             TypeInt 32 1
               19:     18(int) Constant 0
-              21:             TypeInt 32 0
-              22:             TypePointer Function 21(int)
-              24:             TypeImage 21(int) Buffer nonsampled format:R32ui
-              25:             TypePointer UniformConstant 24
-  26(g_tBuf1du1):     25(ptr) Variable UniformConstant
-              29:             TypePointer Function 8(PS_OUTPUT)
-              31:    6(float) Constant 0
-              32:    7(fvec4) ConstantComposite 31 31 31 31
-              33:             TypePointer Function 7(fvec4)
-              38:             TypePointer Output 7(fvec4)
-39(@entryPointOutput.Color):     38(ptr) Variable Output
+              22:             TypeInt 32 0
+              23:             TypePointer Function 22(int)
+              25:             TypeImage 22(int) Buffer nonsampled format:R32ui
+              26:             TypePointer UniformConstant 25
+  27(g_tBuf1du1):     26(ptr) Variable UniformConstant
+              29:             TypeVector 22(int) 4
+              32:             TypePointer Function 8(PS_OUTPUT)
+              34:    6(float) Constant 0
+              35:    7(fvec4) ConstantComposite 34 34 34 34
+              36:             TypePointer Function 7(fvec4)
+              41:             TypePointer Output 7(fvec4)
+42(@entryPointOutput.Color):     41(ptr) Variable Output
          4(main):           2 Function None 3
                5:             Label
-              40:8(PS_OUTPUT) FunctionCall 10(@main()
-              41:    7(fvec4) CompositeExtract 40 0
-                              Store 39(@entryPointOutput.Color) 41
+              43:8(PS_OUTPUT) FunctionCall 10(@main()
+              44:    7(fvec4) CompositeExtract 43 0
+                              Store 42(@entryPointOutput.Color) 44
                               Return
                               FunctionEnd
       10(@main():8(PS_OUTPUT) Function None 9
               11:             Label
          13(r00):     12(ptr) Variable Function
-         23(r01):     22(ptr) Variable Function
-       30(psout):     29(ptr) Variable Function
+         24(r01):     23(ptr) Variable Function
+       33(psout):     32(ptr) Variable Function
               17:          14 Load 16(g_tTex1df1)
-              20:    6(float) ImageRead 17 19
-                              Store 13(r00) 20
-              27:          24 Load 26(g_tBuf1du1)
-              28:     21(int) ImageRead 27 19
-                              Store 23(r01) 28
-              34:     33(ptr) AccessChain 30(psout) 19
-                              Store 34 32
-              35:8(PS_OUTPUT) Load 30(psout)
-                              ReturnValue 35
+              20:    7(fvec4) ImageRead 17 19
+              21:    6(float) CompositeExtract 20 0
+                              Store 13(r00) 21
+              28:          25 Load 27(g_tBuf1du1)
+              30:   29(ivec4) ImageRead 28 19
+              31:     22(int) CompositeExtract 30 0
+                              Store 24(r01) 31
+              37:     36(ptr) AccessChain 33(psout) 19
+                              Store 37 35
+              38:8(PS_OUTPUT) Load 33(psout)
+                              ReturnValue 38
                               FunctionEnd
diff --git a/third_party/vulkan-deps/glslang/src/Test/baseResults/spv.shaderBallot.comp.out b/third_party/vulkan-deps/glslang/src/Test/baseResults/spv.shaderBallot.comp.out
index bdbf10f..9338529 100644
--- a/third_party/vulkan-deps/glslang/src/Test/baseResults/spv.shaderBallot.comp.out
+++ b/third_party/vulkan-deps/glslang/src/Test/baseResults/spv.shaderBallot.comp.out
@@ -1,7 +1,7 @@
 spv.shaderBallot.comp
 // Module Version 10000
 // Generated by (magic number): 8000a
-// Id's are bound by 318
+// Id's are bound by 343
 
                               Capability Shader
                               Capability Int64
@@ -42,7 +42,7 @@
                               Decorate 72(Buffers) BufferBlock
                               Decorate 75(data) DescriptorSet 0
                               Decorate 75(data) Binding 0
-                              Decorate 317 BuiltIn WorkgroupSize
+                              Decorate 342 BuiltIn WorkgroupSize
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeInt 32 0
@@ -77,19 +77,20 @@
               86:     70(int) Constant 1
               87:             TypeVector 68(float) 2
               88:             TypePointer Uniform 69(fvec4)
-             102:     70(int) Constant 2
-             103:             TypeVector 68(float) 3
-             119:     70(int) Constant 3
-             134:             TypePointer Uniform 70(int)
-             141:             TypeVector 70(int) 2
-             142:             TypePointer Uniform 71(ivec4)
-             156:             TypeVector 70(int) 3
-             186:             TypePointer Uniform 6(int)
-             193:             TypePointer Uniform 20(ivec4)
-             207:             TypeVector 6(int) 3
-             315:      6(int) Constant 8
-             316:      6(int) Constant 1
-             317:  207(ivec3) ConstantComposite 315 315 316
+             100:      6(int) Constant 1
+             104:     70(int) Constant 2
+             105:             TypeVector 68(float) 3
+             121:      6(int) Constant 2
+             125:     70(int) Constant 3
+             140:             TypePointer Uniform 70(int)
+             147:             TypeVector 70(int) 2
+             148:             TypePointer Uniform 71(ivec4)
+             163:             TypeVector 70(int) 3
+             196:             TypePointer Uniform 6(int)
+             203:             TypePointer Uniform 20(ivec4)
+             218:             TypeVector 6(int) 3
+             341:      6(int) Constant 8
+             342:  218(ivec3) ConstantComposite 341 341 100
          4(main):           2 Function None 3
                5:             Label
    8(invocation):      7(ptr) Variable Function
@@ -137,7 +138,7 @@
               64: 17(int64_t) Bitcast 63
               65:    58(bool) IEqual 57 64
                               SelectionMerge 67 None
-                              BranchConditional 65 66 236
+                              BranchConditional 65 66 250
               66:               Label
               76:      6(int)   Load 8(invocation)
               80:     79(ptr)   AccessChain 75(data) 77 77 78
@@ -156,237 +157,279 @@
               95:   68(float)   CompositeExtract 91 1
               96:   68(float)   SubgroupReadInvocationKHR 95 92
               97:   87(fvec2)   CompositeConstruct 94 96
-              98:     88(ptr)   AccessChain 75(data) 85 77
-              99:   69(fvec4)   Load 98
-             100:   69(fvec4)   VectorShuffle 99 97 4 5 2 3
-                                Store 98 100
-             101:      6(int)   Load 8(invocation)
-             104:     88(ptr)   AccessChain 75(data) 102 77
-             105:   69(fvec4)   Load 104
-             106:  103(fvec3)   VectorShuffle 105 105 0 1 2
-             107:      6(int)   Load 8(invocation)
-             108:   68(float)   CompositeExtract 106 0
-             109:   68(float)   SubgroupReadInvocationKHR 108 107
-             110:   68(float)   CompositeExtract 106 1
-             111:   68(float)   SubgroupReadInvocationKHR 110 107
-             112:   68(float)   CompositeExtract 106 2
-             113:   68(float)   SubgroupReadInvocationKHR 112 107
-             114:  103(fvec3)   CompositeConstruct 109 111 113
-             115:     88(ptr)   AccessChain 75(data) 101 77
-             116:   69(fvec4)   Load 115
-             117:   69(fvec4)   VectorShuffle 116 114 4 5 6 3
-                                Store 115 117
-             118:      6(int)   Load 8(invocation)
-             120:     88(ptr)   AccessChain 75(data) 119 77
-             121:   69(fvec4)   Load 120
-             122:      6(int)   Load 8(invocation)
-             123:   68(float)   CompositeExtract 121 0
-             124:   68(float)   SubgroupReadInvocationKHR 123 122
-             125:   68(float)   CompositeExtract 121 1
-             126:   68(float)   SubgroupReadInvocationKHR 125 122
-             127:   68(float)   CompositeExtract 121 2
-             128:   68(float)   SubgroupReadInvocationKHR 127 122
-             129:   68(float)   CompositeExtract 121 3
-             130:   68(float)   SubgroupReadInvocationKHR 129 122
-             131:   69(fvec4)   CompositeConstruct 124 126 128 130
-             132:     88(ptr)   AccessChain 75(data) 118 77
-                                Store 132 131
-             133:      6(int)   Load 8(invocation)
-             135:    134(ptr)   AccessChain 75(data) 77 86 78
-             136:     70(int)   Load 135
-             137:      6(int)   Load 8(invocation)
-             138:     70(int)   SubgroupReadInvocationKHR 136 137
-             139:    134(ptr)   AccessChain 75(data) 133 86 78
-                                Store 139 138
-             140:      6(int)   Load 8(invocation)
-             143:    142(ptr)   AccessChain 75(data) 86 86
-             144:   71(ivec4)   Load 143
-             145:  141(ivec2)   VectorShuffle 144 144 0 1
+              98:     79(ptr)   AccessChain 75(data) 85 77 78
+              99:   68(float)   CompositeExtract 97 0
+                                Store 98 99
+             101:     79(ptr)   AccessChain 75(data) 85 77 100
+             102:   68(float)   CompositeExtract 97 1
+                                Store 101 102
+             103:      6(int)   Load 8(invocation)
+             106:     88(ptr)   AccessChain 75(data) 104 77
+             107:   69(fvec4)   Load 106
+             108:  105(fvec3)   VectorShuffle 107 107 0 1 2
+             109:      6(int)   Load 8(invocation)
+             110:   68(float)   CompositeExtract 108 0
+             111:   68(float)   SubgroupReadInvocationKHR 110 109
+             112:   68(float)   CompositeExtract 108 1
+             113:   68(float)   SubgroupReadInvocationKHR 112 109
+             114:   68(float)   CompositeExtract 108 2
+             115:   68(float)   SubgroupReadInvocationKHR 114 109
+             116:  105(fvec3)   CompositeConstruct 111 113 115
+             117:     79(ptr)   AccessChain 75(data) 103 77 78
+             118:   68(float)   CompositeExtract 116 0
+                                Store 117 118
+             119:     79(ptr)   AccessChain 75(data) 103 77 100
+             120:   68(float)   CompositeExtract 116 1
+                                Store 119 120
+             122:     79(ptr)   AccessChain 75(data) 103 77 121
+             123:   68(float)   CompositeExtract 116 2
+                                Store 122 123
+             124:      6(int)   Load 8(invocation)
+             126:     88(ptr)   AccessChain 75(data) 125 77
+             127:   69(fvec4)   Load 126
+             128:      6(int)   Load 8(invocation)
+             129:   68(float)   CompositeExtract 127 0
+             130:   68(float)   SubgroupReadInvocationKHR 129 128
+             131:   68(float)   CompositeExtract 127 1
+             132:   68(float)   SubgroupReadInvocationKHR 131 128
+             133:   68(float)   CompositeExtract 127 2
+             134:   68(float)   SubgroupReadInvocationKHR 133 128
+             135:   68(float)   CompositeExtract 127 3
+             136:   68(float)   SubgroupReadInvocationKHR 135 128
+             137:   69(fvec4)   CompositeConstruct 130 132 134 136
+             138:     88(ptr)   AccessChain 75(data) 124 77
+                                Store 138 137
+             139:      6(int)   Load 8(invocation)
+             141:    140(ptr)   AccessChain 75(data) 77 86 78
+             142:     70(int)   Load 141
+             143:      6(int)   Load 8(invocation)
+             144:     70(int)   SubgroupReadInvocationKHR 142 143
+             145:    140(ptr)   AccessChain 75(data) 139 86 78
+                                Store 145 144
              146:      6(int)   Load 8(invocation)
-             147:     70(int)   CompositeExtract 145 0
-             148:     70(int)   SubgroupReadInvocationKHR 147 146
-             149:     70(int)   CompositeExtract 145 1
-             150:     70(int)   SubgroupReadInvocationKHR 149 146
-             151:  141(ivec2)   CompositeConstruct 148 150
-             152:    142(ptr)   AccessChain 75(data) 140 86
-             153:   71(ivec4)   Load 152
-             154:   71(ivec4)   VectorShuffle 153 151 4 5 2 3
-                                Store 152 154
-             155:      6(int)   Load 8(invocation)
-             157:    142(ptr)   AccessChain 75(data) 102 86
-             158:   71(ivec4)   Load 157
-             159:  156(ivec3)   VectorShuffle 158 158 0 1 2
-             160:      6(int)   Load 8(invocation)
-             161:     70(int)   CompositeExtract 159 0
-             162:     70(int)   SubgroupReadInvocationKHR 161 160
-             163:     70(int)   CompositeExtract 159 1
-             164:     70(int)   SubgroupReadInvocationKHR 163 160
-             165:     70(int)   CompositeExtract 159 2
-             166:     70(int)   SubgroupReadInvocationKHR 165 160
-             167:  156(ivec3)   CompositeConstruct 162 164 166
-             168:    142(ptr)   AccessChain 75(data) 155 86
-             169:   71(ivec4)   Load 168
-             170:   71(ivec4)   VectorShuffle 169 167 4 5 6 3
-                                Store 168 170
-             171:      6(int)   Load 8(invocation)
-             172:    142(ptr)   AccessChain 75(data) 119 86
-             173:   71(ivec4)   Load 172
-             174:      6(int)   Load 8(invocation)
-             175:     70(int)   CompositeExtract 173 0
-             176:     70(int)   SubgroupReadInvocationKHR 175 174
-             177:     70(int)   CompositeExtract 173 1
-             178:     70(int)   SubgroupReadInvocationKHR 177 174
-             179:     70(int)   CompositeExtract 173 2
-             180:     70(int)   SubgroupReadInvocationKHR 179 174
-             181:     70(int)   CompositeExtract 173 3
-             182:     70(int)   SubgroupReadInvocationKHR 181 174
-             183:   71(ivec4)   CompositeConstruct 176 178 180 182
-             184:    142(ptr)   AccessChain 75(data) 171 86
-                                Store 184 183
-             185:      6(int)   Load 8(invocation)
-             187:    186(ptr)   AccessChain 75(data) 77 102 78
-             188:      6(int)   Load 187
-             189:      6(int)   Load 8(invocation)
-             190:      6(int)   SubgroupReadInvocationKHR 188 189
-             191:    186(ptr)   AccessChain 75(data) 185 102 78
-                                Store 191 190
-             192:      6(int)   Load 8(invocation)
-             194:    193(ptr)   AccessChain 75(data) 86 102
-             195:   20(ivec4)   Load 194
-             196:   26(ivec2)   VectorShuffle 195 195 0 1
-             197:      6(int)   Load 8(invocation)
-             198:      6(int)   CompositeExtract 196 0
-             199:      6(int)   SubgroupReadInvocationKHR 198 197
-             200:      6(int)   CompositeExtract 196 1
-             201:      6(int)   SubgroupReadInvocationKHR 200 197
-             202:   26(ivec2)   CompositeConstruct 199 201
-             203:    193(ptr)   AccessChain 75(data) 192 102
-             204:   20(ivec4)   Load 203
-             205:   20(ivec4)   VectorShuffle 204 202 4 5 2 3
-                                Store 203 205
-             206:      6(int)   Load 8(invocation)
-             208:    193(ptr)   AccessChain 75(data) 102 102
-             209:   20(ivec4)   Load 208
-             210:  207(ivec3)   VectorShuffle 209 209 0 1 2
-             211:      6(int)   Load 8(invocation)
-             212:      6(int)   CompositeExtract 210 0
-             213:      6(int)   SubgroupReadInvocationKHR 212 211
-             214:      6(int)   CompositeExtract 210 1
-             215:      6(int)   SubgroupReadInvocationKHR 214 211
-             216:      6(int)   CompositeExtract 210 2
-             217:      6(int)   SubgroupReadInvocationKHR 216 211
-             218:  207(ivec3)   CompositeConstruct 213 215 217
-             219:    193(ptr)   AccessChain 75(data) 206 102
+             149:    148(ptr)   AccessChain 75(data) 86 86
+             150:   71(ivec4)   Load 149
+             151:  147(ivec2)   VectorShuffle 150 150 0 1
+             152:      6(int)   Load 8(invocation)
+             153:     70(int)   CompositeExtract 151 0
+             154:     70(int)   SubgroupReadInvocationKHR 153 152
+             155:     70(int)   CompositeExtract 151 1
+             156:     70(int)   SubgroupReadInvocationKHR 155 152
+             157:  147(ivec2)   CompositeConstruct 154 156
+             158:    140(ptr)   AccessChain 75(data) 146 86 78
+             159:     70(int)   CompositeExtract 157 0
+                                Store 158 159
+             160:    140(ptr)   AccessChain 75(data) 146 86 100
+             161:     70(int)   CompositeExtract 157 1
+                                Store 160 161
+             162:      6(int)   Load 8(invocation)
+             164:    148(ptr)   AccessChain 75(data) 104 86
+             165:   71(ivec4)   Load 164
+             166:  163(ivec3)   VectorShuffle 165 165 0 1 2
+             167:      6(int)   Load 8(invocation)
+             168:     70(int)   CompositeExtract 166 0
+             169:     70(int)   SubgroupReadInvocationKHR 168 167
+             170:     70(int)   CompositeExtract 166 1
+             171:     70(int)   SubgroupReadInvocationKHR 170 167
+             172:     70(int)   CompositeExtract 166 2
+             173:     70(int)   SubgroupReadInvocationKHR 172 167
+             174:  163(ivec3)   CompositeConstruct 169 171 173
+             175:    140(ptr)   AccessChain 75(data) 162 86 78
+             176:     70(int)   CompositeExtract 174 0
+                                Store 175 176
+             177:    140(ptr)   AccessChain 75(data) 162 86 100
+             178:     70(int)   CompositeExtract 174 1
+                                Store 177 178
+             179:    140(ptr)   AccessChain 75(data) 162 86 121
+             180:     70(int)   CompositeExtract 174 2
+                                Store 179 180
+             181:      6(int)   Load 8(invocation)
+             182:    148(ptr)   AccessChain 75(data) 125 86
+             183:   71(ivec4)   Load 182
+             184:      6(int)   Load 8(invocation)
+             185:     70(int)   CompositeExtract 183 0
+             186:     70(int)   SubgroupReadInvocationKHR 185 184
+             187:     70(int)   CompositeExtract 183 1
+             188:     70(int)   SubgroupReadInvocationKHR 187 184
+             189:     70(int)   CompositeExtract 183 2
+             190:     70(int)   SubgroupReadInvocationKHR 189 184
+             191:     70(int)   CompositeExtract 183 3
+             192:     70(int)   SubgroupReadInvocationKHR 191 184
+             193:   71(ivec4)   CompositeConstruct 186 188 190 192
+             194:    148(ptr)   AccessChain 75(data) 181 86
+                                Store 194 193
+             195:      6(int)   Load 8(invocation)
+             197:    196(ptr)   AccessChain 75(data) 77 104 78
+             198:      6(int)   Load 197
+             199:      6(int)   Load 8(invocation)
+             200:      6(int)   SubgroupReadInvocationKHR 198 199
+             201:    196(ptr)   AccessChain 75(data) 195 104 78
+                                Store 201 200
+             202:      6(int)   Load 8(invocation)
+             204:    203(ptr)   AccessChain 75(data) 86 104
+             205:   20(ivec4)   Load 204
+             206:   26(ivec2)   VectorShuffle 205 205 0 1
+             207:      6(int)   Load 8(invocation)
+             208:      6(int)   CompositeExtract 206 0
+             209:      6(int)   SubgroupReadInvocationKHR 208 207
+             210:      6(int)   CompositeExtract 206 1
+             211:      6(int)   SubgroupReadInvocationKHR 210 207
+             212:   26(ivec2)   CompositeConstruct 209 211
+             213:    196(ptr)   AccessChain 75(data) 202 104 78
+             214:      6(int)   CompositeExtract 212 0
+                                Store 213 214
+             215:    196(ptr)   AccessChain 75(data) 202 104 100
+             216:      6(int)   CompositeExtract 212 1
+                                Store 215 216
+             217:      6(int)   Load 8(invocation)
+             219:    203(ptr)   AccessChain 75(data) 104 104
              220:   20(ivec4)   Load 219
-             221:   20(ivec4)   VectorShuffle 220 218 4 5 6 3
-                                Store 219 221
+             221:  218(ivec3)   VectorShuffle 220 220 0 1 2
              222:      6(int)   Load 8(invocation)
-             223:    193(ptr)   AccessChain 75(data) 119 102
-             224:   20(ivec4)   Load 223
-             225:      6(int)   Load 8(invocation)
-             226:      6(int)   CompositeExtract 224 0
-             227:      6(int)   SubgroupReadInvocationKHR 226 225
-             228:      6(int)   CompositeExtract 224 1
-             229:      6(int)   SubgroupReadInvocationKHR 228 225
-             230:      6(int)   CompositeExtract 224 2
-             231:      6(int)   SubgroupReadInvocationKHR 230 225
-             232:      6(int)   CompositeExtract 224 3
-             233:      6(int)   SubgroupReadInvocationKHR 232 225
-             234:   20(ivec4)   CompositeConstruct 227 229 231 233
-             235:    193(ptr)   AccessChain 75(data) 222 102
-                                Store 235 234
+             223:      6(int)   CompositeExtract 221 0
+             224:      6(int)   SubgroupReadInvocationKHR 223 222
+             225:      6(int)   CompositeExtract 221 1
+             226:      6(int)   SubgroupReadInvocationKHR 225 222
+             227:      6(int)   CompositeExtract 221 2
+             228:      6(int)   SubgroupReadInvocationKHR 227 222
+             229:  218(ivec3)   CompositeConstruct 224 226 228
+             230:    196(ptr)   AccessChain 75(data) 217 104 78
+             231:      6(int)   CompositeExtract 229 0
+                                Store 230 231
+             232:    196(ptr)   AccessChain 75(data) 217 104 100
+             233:      6(int)   CompositeExtract 229 1
+                                Store 232 233
+             234:    196(ptr)   AccessChain 75(data) 217 104 121
+             235:      6(int)   CompositeExtract 229 2
+                                Store 234 235
+             236:      6(int)   Load 8(invocation)
+             237:    203(ptr)   AccessChain 75(data) 125 104
+             238:   20(ivec4)   Load 237
+             239:      6(int)   Load 8(invocation)
+             240:      6(int)   CompositeExtract 238 0
+             241:      6(int)   SubgroupReadInvocationKHR 240 239
+             242:      6(int)   CompositeExtract 238 1
+             243:      6(int)   SubgroupReadInvocationKHR 242 239
+             244:      6(int)   CompositeExtract 238 2
+             245:      6(int)   SubgroupReadInvocationKHR 244 239
+             246:      6(int)   CompositeExtract 238 3
+             247:      6(int)   SubgroupReadInvocationKHR 246 239
+             248:   20(ivec4)   CompositeConstruct 241 243 245 247
+             249:    203(ptr)   AccessChain 75(data) 236 104
+                                Store 249 248
                                 Branch 67
-             236:               Label
-             237:      6(int)   Load 8(invocation)
-             238:     79(ptr)   AccessChain 75(data) 77 77 78
-             239:   68(float)   Load 238
-             240:   68(float)   SubgroupFirstInvocationKHR 239
-             241:     79(ptr)   AccessChain 75(data) 237 77 78
-                                Store 241 240
-             242:      6(int)   Load 8(invocation)
-             243:     88(ptr)   AccessChain 75(data) 86 77
-             244:   69(fvec4)   Load 243
-             245:   87(fvec2)   VectorShuffle 244 244 0 1
-             246:   87(fvec2)   SubgroupFirstInvocationKHR 245
-             247:     88(ptr)   AccessChain 75(data) 242 77
-             248:   69(fvec4)   Load 247
-             249:   69(fvec4)   VectorShuffle 248 246 4 5 2 3
-                                Store 247 249
-             250:      6(int)   Load 8(invocation)
-             251:     88(ptr)   AccessChain 75(data) 102 77
-             252:   69(fvec4)   Load 251
-             253:  103(fvec3)   VectorShuffle 252 252 0 1 2
-             254:  103(fvec3)   SubgroupFirstInvocationKHR 253
-             255:     88(ptr)   AccessChain 75(data) 250 77
-             256:   69(fvec4)   Load 255
-             257:   69(fvec4)   VectorShuffle 256 254 4 5 6 3
-                                Store 255 257
-             258:      6(int)   Load 8(invocation)
-             259:     88(ptr)   AccessChain 75(data) 119 77
-             260:   69(fvec4)   Load 259
-             261:   69(fvec4)   SubgroupFirstInvocationKHR 260
-             262:     88(ptr)   AccessChain 75(data) 258 77
-                                Store 262 261
-             263:      6(int)   Load 8(invocation)
-             264:    134(ptr)   AccessChain 75(data) 77 86 78
-             265:     70(int)   Load 264
-             266:     70(int)   SubgroupFirstInvocationKHR 265
-             267:    134(ptr)   AccessChain 75(data) 263 86 78
-                                Store 267 266
-             268:      6(int)   Load 8(invocation)
-             269:    142(ptr)   AccessChain 75(data) 86 86
-             270:   71(ivec4)   Load 269
-             271:  141(ivec2)   VectorShuffle 270 270 0 1
-             272:  141(ivec2)   SubgroupFirstInvocationKHR 271
-             273:    142(ptr)   AccessChain 75(data) 268 86
-             274:   71(ivec4)   Load 273
-             275:   71(ivec4)   VectorShuffle 274 272 4 5 2 3
-                                Store 273 275
+             250:               Label
+             251:      6(int)   Load 8(invocation)
+             252:     79(ptr)   AccessChain 75(data) 77 77 78
+             253:   68(float)   Load 252
+             254:   68(float)   SubgroupFirstInvocationKHR 253
+             255:     79(ptr)   AccessChain 75(data) 251 77 78
+                                Store 255 254
+             256:      6(int)   Load 8(invocation)
+             257:     88(ptr)   AccessChain 75(data) 86 77
+             258:   69(fvec4)   Load 257
+             259:   87(fvec2)   VectorShuffle 258 258 0 1
+             260:   87(fvec2)   SubgroupFirstInvocationKHR 259
+             261:     79(ptr)   AccessChain 75(data) 256 77 78
+             262:   68(float)   CompositeExtract 260 0
+                                Store 261 262
+             263:     79(ptr)   AccessChain 75(data) 256 77 100
+             264:   68(float)   CompositeExtract 260 1
+                                Store 263 264
+             265:      6(int)   Load 8(invocation)
+             266:     88(ptr)   AccessChain 75(data) 104 77
+             267:   69(fvec4)   Load 266
+             268:  105(fvec3)   VectorShuffle 267 267 0 1 2
+             269:  105(fvec3)   SubgroupFirstInvocationKHR 268
+             270:     79(ptr)   AccessChain 75(data) 265 77 78
+             271:   68(float)   CompositeExtract 269 0
+                                Store 270 271
+             272:     79(ptr)   AccessChain 75(data) 265 77 100
+             273:   68(float)   CompositeExtract 269 1
+                                Store 272 273
+             274:     79(ptr)   AccessChain 75(data) 265 77 121
+             275:   68(float)   CompositeExtract 269 2
+                                Store 274 275
              276:      6(int)   Load 8(invocation)
-             277:    142(ptr)   AccessChain 75(data) 102 86
-             278:   71(ivec4)   Load 277
-             279:  156(ivec3)   VectorShuffle 278 278 0 1 2
-             280:  156(ivec3)   SubgroupFirstInvocationKHR 279
-             281:    142(ptr)   AccessChain 75(data) 276 86
-             282:   71(ivec4)   Load 281
-             283:   71(ivec4)   VectorShuffle 282 280 4 5 6 3
-                                Store 281 283
-             284:      6(int)   Load 8(invocation)
-             285:    142(ptr)   AccessChain 75(data) 119 86
-             286:   71(ivec4)   Load 285
-             287:   71(ivec4)   SubgroupFirstInvocationKHR 286
-             288:    142(ptr)   AccessChain 75(data) 284 86
-                                Store 288 287
-             289:      6(int)   Load 8(invocation)
-             290:    186(ptr)   AccessChain 75(data) 77 102 78
-             291:      6(int)   Load 290
-             292:      6(int)   SubgroupFirstInvocationKHR 291
-             293:    186(ptr)   AccessChain 75(data) 289 102 78
-                                Store 293 292
-             294:      6(int)   Load 8(invocation)
-             295:    193(ptr)   AccessChain 75(data) 86 102
-             296:   20(ivec4)   Load 295
-             297:   26(ivec2)   VectorShuffle 296 296 0 1
-             298:   26(ivec2)   SubgroupFirstInvocationKHR 297
-             299:    193(ptr)   AccessChain 75(data) 294 102
-             300:   20(ivec4)   Load 299
-             301:   20(ivec4)   VectorShuffle 300 298 4 5 2 3
-                                Store 299 301
-             302:      6(int)   Load 8(invocation)
-             303:    193(ptr)   AccessChain 75(data) 102 102
-             304:   20(ivec4)   Load 303
-             305:  207(ivec3)   VectorShuffle 304 304 0 1 2
-             306:  207(ivec3)   SubgroupFirstInvocationKHR 305
-             307:    193(ptr)   AccessChain 75(data) 302 102
-             308:   20(ivec4)   Load 307
-             309:   20(ivec4)   VectorShuffle 308 306 4 5 6 3
-                                Store 307 309
-             310:      6(int)   Load 8(invocation)
-             311:    193(ptr)   AccessChain 75(data) 119 102
-             312:   20(ivec4)   Load 311
-             313:   20(ivec4)   SubgroupFirstInvocationKHR 312
-             314:    193(ptr)   AccessChain 75(data) 310 102
-                                Store 314 313
+             277:     88(ptr)   AccessChain 75(data) 125 77
+             278:   69(fvec4)   Load 277
+             279:   69(fvec4)   SubgroupFirstInvocationKHR 278
+             280:     88(ptr)   AccessChain 75(data) 276 77
+                                Store 280 279
+             281:      6(int)   Load 8(invocation)
+             282:    140(ptr)   AccessChain 75(data) 77 86 78
+             283:     70(int)   Load 282
+             284:     70(int)   SubgroupFirstInvocationKHR 283
+             285:    140(ptr)   AccessChain 75(data) 281 86 78
+                                Store 285 284
+             286:      6(int)   Load 8(invocation)
+             287:    148(ptr)   AccessChain 75(data) 86 86
+             288:   71(ivec4)   Load 287
+             289:  147(ivec2)   VectorShuffle 288 288 0 1
+             290:  147(ivec2)   SubgroupFirstInvocationKHR 289
+             291:    140(ptr)   AccessChain 75(data) 286 86 78
+             292:     70(int)   CompositeExtract 290 0
+                                Store 291 292
+             293:    140(ptr)   AccessChain 75(data) 286 86 100
+             294:     70(int)   CompositeExtract 290 1
+                                Store 293 294
+             295:      6(int)   Load 8(invocation)
+             296:    148(ptr)   AccessChain 75(data) 104 86
+             297:   71(ivec4)   Load 296
+             298:  163(ivec3)   VectorShuffle 297 297 0 1 2
+             299:  163(ivec3)   SubgroupFirstInvocationKHR 298
+             300:    140(ptr)   AccessChain 75(data) 295 86 78
+             301:     70(int)   CompositeExtract 299 0
+                                Store 300 301
+             302:    140(ptr)   AccessChain 75(data) 295 86 100
+             303:     70(int)   CompositeExtract 299 1
+                                Store 302 303
+             304:    140(ptr)   AccessChain 75(data) 295 86 121
+             305:     70(int)   CompositeExtract 299 2
+                                Store 304 305
+             306:      6(int)   Load 8(invocation)
+             307:    148(ptr)   AccessChain 75(data) 125 86
+             308:   71(ivec4)   Load 307
+             309:   71(ivec4)   SubgroupFirstInvocationKHR 308
+             310:    148(ptr)   AccessChain 75(data) 306 86
+                                Store 310 309
+             311:      6(int)   Load 8(invocation)
+             312:    196(ptr)   AccessChain 75(data) 77 104 78
+             313:      6(int)   Load 312
+             314:      6(int)   SubgroupFirstInvocationKHR 313
+             315:    196(ptr)   AccessChain 75(data) 311 104 78
+                                Store 315 314
+             316:      6(int)   Load 8(invocation)
+             317:    203(ptr)   AccessChain 75(data) 86 104
+             318:   20(ivec4)   Load 317
+             319:   26(ivec2)   VectorShuffle 318 318 0 1
+             320:   26(ivec2)   SubgroupFirstInvocationKHR 319
+             321:    196(ptr)   AccessChain 75(data) 316 104 78
+             322:      6(int)   CompositeExtract 320 0
+                                Store 321 322
+             323:    196(ptr)   AccessChain 75(data) 316 104 100
+             324:      6(int)   CompositeExtract 320 1
+                                Store 323 324
+             325:      6(int)   Load 8(invocation)
+             326:    203(ptr)   AccessChain 75(data) 104 104
+             327:   20(ivec4)   Load 326
+             328:  218(ivec3)   VectorShuffle 327 327 0 1 2
+             329:  218(ivec3)   SubgroupFirstInvocationKHR 328
+             330:    196(ptr)   AccessChain 75(data) 325 104 78
+             331:      6(int)   CompositeExtract 329 0
+                                Store 330 331
+             332:    196(ptr)   AccessChain 75(data) 325 104 100
+             333:      6(int)   CompositeExtract 329 1
+                                Store 332 333
+             334:    196(ptr)   AccessChain 75(data) 325 104 121
+             335:      6(int)   CompositeExtract 329 2
+                                Store 334 335
+             336:      6(int)   Load 8(invocation)
+             337:    203(ptr)   AccessChain 75(data) 125 104
+             338:   20(ivec4)   Load 337
+             339:   20(ivec4)   SubgroupFirstInvocationKHR 338
+             340:    203(ptr)   AccessChain 75(data) 336 104
+                                Store 340 339
                                 Branch 67
               67:             Label
                               Return
diff --git a/third_party/vulkan-deps/glslang/src/Test/baseResults/spv.subgroup.frag.out b/third_party/vulkan-deps/glslang/src/Test/baseResults/spv.subgroup.frag.out
index ad11586..a3e427f 100644
--- a/third_party/vulkan-deps/glslang/src/Test/baseResults/spv.subgroup.frag.out
+++ b/third_party/vulkan-deps/glslang/src/Test/baseResults/spv.subgroup.frag.out
@@ -24,6 +24,7 @@
                               Decorate 13(gl_SubgroupInvocationID) Flat
                               Decorate 13(gl_SubgroupInvocationID) BuiltIn SubgroupLocalInvocationId
                               Decorate 14 RelaxedPrecision
+                              Decorate 16 RelaxedPrecision
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeInt 32 0
diff --git a/third_party/vulkan-deps/glslang/src/Test/baseResults/spv.subgroup.geom.out b/third_party/vulkan-deps/glslang/src/Test/baseResults/spv.subgroup.geom.out
index c866f8e..27f05b2 100644
--- a/third_party/vulkan-deps/glslang/src/Test/baseResults/spv.subgroup.geom.out
+++ b/third_party/vulkan-deps/glslang/src/Test/baseResults/spv.subgroup.geom.out
@@ -33,6 +33,7 @@
                               Decorate 20(gl_SubgroupInvocationID) RelaxedPrecision
                               Decorate 20(gl_SubgroupInvocationID) BuiltIn SubgroupLocalInvocationId
                               Decorate 21 RelaxedPrecision
+                              Decorate 23 RelaxedPrecision
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeInt 32 0
diff --git a/third_party/vulkan-deps/glslang/src/Test/baseResults/spv.subgroup.tesc.out b/third_party/vulkan-deps/glslang/src/Test/baseResults/spv.subgroup.tesc.out
index ed6b5c1..8322a4a 100644
--- a/third_party/vulkan-deps/glslang/src/Test/baseResults/spv.subgroup.tesc.out
+++ b/third_party/vulkan-deps/glslang/src/Test/baseResults/spv.subgroup.tesc.out
@@ -30,6 +30,7 @@
                               Decorate 20(gl_SubgroupInvocationID) RelaxedPrecision
                               Decorate 20(gl_SubgroupInvocationID) BuiltIn SubgroupLocalInvocationId
                               Decorate 21 RelaxedPrecision
+                              Decorate 23 RelaxedPrecision
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeInt 32 0
diff --git a/third_party/vulkan-deps/glslang/src/Test/baseResults/spv.subgroup.tese.out b/third_party/vulkan-deps/glslang/src/Test/baseResults/spv.subgroup.tese.out
index 70cdc96..360f98b 100644
--- a/third_party/vulkan-deps/glslang/src/Test/baseResults/spv.subgroup.tese.out
+++ b/third_party/vulkan-deps/glslang/src/Test/baseResults/spv.subgroup.tese.out
@@ -32,6 +32,7 @@
                               Decorate 20(gl_SubgroupInvocationID) RelaxedPrecision
                               Decorate 20(gl_SubgroupInvocationID) BuiltIn SubgroupLocalInvocationId
                               Decorate 21 RelaxedPrecision
+                              Decorate 23 RelaxedPrecision
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeInt 32 0
diff --git a/third_party/vulkan-deps/glslang/src/Test/baseResults/spv.subgroup.vert.out b/third_party/vulkan-deps/glslang/src/Test/baseResults/spv.subgroup.vert.out
index 34b090d..6de8a0a 100644
--- a/third_party/vulkan-deps/glslang/src/Test/baseResults/spv.subgroup.vert.out
+++ b/third_party/vulkan-deps/glslang/src/Test/baseResults/spv.subgroup.vert.out
@@ -29,6 +29,7 @@
                               Decorate 20(gl_SubgroupInvocationID) RelaxedPrecision
                               Decorate 20(gl_SubgroupInvocationID) BuiltIn SubgroupLocalInvocationId
                               Decorate 21 RelaxedPrecision
+                              Decorate 23 RelaxedPrecision
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeInt 32 0
diff --git a/third_party/vulkan-deps/glslang/src/Test/baseResults/spv.subgroupArithmetic.comp.out b/third_party/vulkan-deps/glslang/src/Test/baseResults/spv.subgroupArithmetic.comp.out
index e531f6f..87bfa31 100644
--- a/third_party/vulkan-deps/glslang/src/Test/baseResults/spv.subgroupArithmetic.comp.out
+++ b/third_party/vulkan-deps/glslang/src/Test/baseResults/spv.subgroupArithmetic.comp.out
@@ -1,7 +1,7 @@
 spv.subgroupArithmetic.comp
 // Module Version 10300
 // Generated by (magic number): 8000a
-// Id's are bound by 2085
+// Id's are bound by 2386
 
                               Capability Shader
                               Capability Float64
@@ -39,7 +39,7 @@
                               Decorate 24(Buffers) Block
                               Decorate 27(data) DescriptorSet 0
                               Decorate 27(data) Binding 0
-                              Decorate 2084 BuiltIn WorkgroupSize
+                              Decorate 2385 BuiltIn WorkgroupSize
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeInt 32 0
@@ -66,34 +66,35 @@
               38:     19(int) Constant 1
               39:             TypeVector 17(float) 2
               40:             TypePointer StorageBuffer 18(fvec4)
-              49:     19(int) Constant 2
-              50:             TypeVector 17(float) 3
-              59:     19(int) Constant 3
-              65:             TypePointer StorageBuffer 19(int)
-              71:             TypeVector 19(int) 2
-              72:             TypePointer StorageBuffer 20(ivec4)
-              81:             TypeVector 19(int) 3
-              95:             TypePointer StorageBuffer 6(int)
-             101:             TypeVector 6(int) 2
-             102:             TypePointer StorageBuffer 21(ivec4)
-             111:             TypeVector 6(int) 3
-             125:             TypePointer StorageBuffer 22(float64_t)
-             131:             TypeVector 22(float64_t) 2
-             132:             TypePointer StorageBuffer 23(f64vec4)
-             141:             TypeVector 22(float64_t) 3
-             521:             TypeBool
-             530:   71(ivec2) ConstantComposite 29 29
-             531:             TypeVector 521(bool) 2
-             534:   71(ivec2) ConstantComposite 38 38
-             543:   81(ivec3) ConstantComposite 29 29 29
-             544:             TypeVector 521(bool) 3
-             547:   81(ivec3) ConstantComposite 38 38 38
-             555:   20(ivec4) ConstantComposite 29 29 29 29
-             556:             TypeVector 521(bool) 4
-             559:   20(ivec4) ConstantComposite 38 38 38 38
-            2082:      6(int) Constant 8
-            2083:      6(int) Constant 1
-            2084:  111(ivec3) ConstantComposite 2082 2083 2083
+              47:      6(int) Constant 1
+              51:     19(int) Constant 2
+              52:             TypeVector 17(float) 3
+              61:      6(int) Constant 2
+              65:     19(int) Constant 3
+              71:             TypePointer StorageBuffer 19(int)
+              77:             TypeVector 19(int) 2
+              78:             TypePointer StorageBuffer 20(ivec4)
+              88:             TypeVector 19(int) 3
+             105:             TypePointer StorageBuffer 6(int)
+             111:             TypeVector 6(int) 2
+             112:             TypePointer StorageBuffer 21(ivec4)
+             122:             TypeVector 6(int) 3
+             139:             TypePointer StorageBuffer 22(float64_t)
+             145:             TypeVector 22(float64_t) 2
+             146:             TypePointer StorageBuffer 23(f64vec4)
+             156:             TypeVector 22(float64_t) 3
+             595:             TypeBool
+             604:   77(ivec2) ConstantComposite 29 29
+             605:             TypeVector 595(bool) 2
+             608:   77(ivec2) ConstantComposite 38 38
+             618:   88(ivec3) ConstantComposite 29 29 29
+             619:             TypeVector 595(bool) 3
+             622:   88(ivec3) ConstantComposite 38 38 38
+             633:   20(ivec4) ConstantComposite 29 29 29 29
+             634:             TypeVector 595(bool) 4
+             637:   20(ivec4) ConstantComposite 38 38 38 38
+            2384:      6(int) Constant 8
+            2385:  122(ivec3) ConstantComposite 2384 47 47
          4(main):           2 Function None 3
                5:             Label
    8(invocation):      7(ptr) Variable Function
@@ -113,2316 +114,2841 @@
               42:   18(fvec4) Load 41
               43:   39(fvec2) VectorShuffle 42 42 0 1
               44:   39(fvec2) GroupNonUniformFAdd 34 Reduce 43
-              45:     40(ptr) AccessChain 27(data) 37 29
-              46:   18(fvec4) Load 45
-              47:   18(fvec4) VectorShuffle 46 44 4 5 2 3
-                              Store 45 47
-              48:      6(int) Load 8(invocation)
-              51:     40(ptr) AccessChain 27(data) 49 29
-              52:   18(fvec4) Load 51
-              53:   50(fvec3) VectorShuffle 52 52 0 1 2
-              54:   50(fvec3) GroupNonUniformFAdd 34 Reduce 53
-              55:     40(ptr) AccessChain 27(data) 48 29
-              56:   18(fvec4) Load 55
-              57:   18(fvec4) VectorShuffle 56 54 4 5 6 3
-                              Store 55 57
-              58:      6(int) Load 8(invocation)
-              60:     40(ptr) AccessChain 27(data) 59 29
-              61:   18(fvec4) Load 60
-              62:   18(fvec4) GroupNonUniformFAdd 34 Reduce 61
-              63:     40(ptr) AccessChain 27(data) 58 29
-                              Store 63 62
+              45:     31(ptr) AccessChain 27(data) 37 29 30
+              46:   17(float) CompositeExtract 44 0
+                              Store 45 46
+              48:     31(ptr) AccessChain 27(data) 37 29 47
+              49:   17(float) CompositeExtract 44 1
+                              Store 48 49
+              50:      6(int) Load 8(invocation)
+              53:     40(ptr) AccessChain 27(data) 51 29
+              54:   18(fvec4) Load 53
+              55:   52(fvec3) VectorShuffle 54 54 0 1 2
+              56:   52(fvec3) GroupNonUniformFAdd 34 Reduce 55
+              57:     31(ptr) AccessChain 27(data) 50 29 30
+              58:   17(float) CompositeExtract 56 0
+                              Store 57 58
+              59:     31(ptr) AccessChain 27(data) 50 29 47
+              60:   17(float) CompositeExtract 56 1
+                              Store 59 60
+              62:     31(ptr) AccessChain 27(data) 50 29 61
+              63:   17(float) CompositeExtract 56 2
+                              Store 62 63
               64:      6(int) Load 8(invocation)
-              66:     65(ptr) AccessChain 27(data) 29 38 30
-              67:     19(int) Load 66
-              68:     19(int) GroupNonUniformIAdd 34 Reduce 67
-              69:     65(ptr) AccessChain 27(data) 64 38 30
+              66:     40(ptr) AccessChain 27(data) 65 29
+              67:   18(fvec4) Load 66
+              68:   18(fvec4) GroupNonUniformFAdd 34 Reduce 67
+              69:     40(ptr) AccessChain 27(data) 64 29
                               Store 69 68
               70:      6(int) Load 8(invocation)
-              73:     72(ptr) AccessChain 27(data) 38 38
-              74:   20(ivec4) Load 73
-              75:   71(ivec2) VectorShuffle 74 74 0 1
-              76:   71(ivec2) GroupNonUniformIAdd 34 Reduce 75
-              77:     72(ptr) AccessChain 27(data) 70 38
-              78:   20(ivec4) Load 77
-              79:   20(ivec4) VectorShuffle 78 76 4 5 2 3
-                              Store 77 79
-              80:      6(int) Load 8(invocation)
-              82:     72(ptr) AccessChain 27(data) 49 38
-              83:   20(ivec4) Load 82
-              84:   81(ivec3) VectorShuffle 83 83 0 1 2
-              85:   81(ivec3) GroupNonUniformIAdd 34 Reduce 84
-              86:     72(ptr) AccessChain 27(data) 80 38
-              87:   20(ivec4) Load 86
-              88:   20(ivec4) VectorShuffle 87 85 4 5 6 3
-                              Store 86 88
-              89:      6(int) Load 8(invocation)
-              90:     72(ptr) AccessChain 27(data) 59 38
-              91:   20(ivec4) Load 90
-              92:   20(ivec4) GroupNonUniformIAdd 34 Reduce 91
-              93:     72(ptr) AccessChain 27(data) 89 38
-                              Store 93 92
-              94:      6(int) Load 8(invocation)
-              96:     95(ptr) AccessChain 27(data) 29 49 30
-              97:      6(int) Load 96
-              98:      6(int) GroupNonUniformIAdd 34 Reduce 97
-              99:     95(ptr) AccessChain 27(data) 94 49 30
-                              Store 99 98
-             100:      6(int) Load 8(invocation)
-             103:    102(ptr) AccessChain 27(data) 38 49
-             104:   21(ivec4) Load 103
-             105:  101(ivec2) VectorShuffle 104 104 0 1
-             106:  101(ivec2) GroupNonUniformIAdd 34 Reduce 105
-             107:    102(ptr) AccessChain 27(data) 100 49
-             108:   21(ivec4) Load 107
-             109:   21(ivec4) VectorShuffle 108 106 4 5 2 3
-                              Store 107 109
+              72:     71(ptr) AccessChain 27(data) 29 38 30
+              73:     19(int) Load 72
+              74:     19(int) GroupNonUniformIAdd 34 Reduce 73
+              75:     71(ptr) AccessChain 27(data) 70 38 30
+                              Store 75 74
+              76:      6(int) Load 8(invocation)
+              79:     78(ptr) AccessChain 27(data) 38 38
+              80:   20(ivec4) Load 79
+              81:   77(ivec2) VectorShuffle 80 80 0 1
+              82:   77(ivec2) GroupNonUniformIAdd 34 Reduce 81
+              83:     71(ptr) AccessChain 27(data) 76 38 30
+              84:     19(int) CompositeExtract 82 0
+                              Store 83 84
+              85:     71(ptr) AccessChain 27(data) 76 38 47
+              86:     19(int) CompositeExtract 82 1
+                              Store 85 86
+              87:      6(int) Load 8(invocation)
+              89:     78(ptr) AccessChain 27(data) 51 38
+              90:   20(ivec4) Load 89
+              91:   88(ivec3) VectorShuffle 90 90 0 1 2
+              92:   88(ivec3) GroupNonUniformIAdd 34 Reduce 91
+              93:     71(ptr) AccessChain 27(data) 87 38 30
+              94:     19(int) CompositeExtract 92 0
+                              Store 93 94
+              95:     71(ptr) AccessChain 27(data) 87 38 47
+              96:     19(int) CompositeExtract 92 1
+                              Store 95 96
+              97:     71(ptr) AccessChain 27(data) 87 38 61
+              98:     19(int) CompositeExtract 92 2
+                              Store 97 98
+              99:      6(int) Load 8(invocation)
+             100:     78(ptr) AccessChain 27(data) 65 38
+             101:   20(ivec4) Load 100
+             102:   20(ivec4) GroupNonUniformIAdd 34 Reduce 101
+             103:     78(ptr) AccessChain 27(data) 99 38
+                              Store 103 102
+             104:      6(int) Load 8(invocation)
+             106:    105(ptr) AccessChain 27(data) 29 51 30
+             107:      6(int) Load 106
+             108:      6(int) GroupNonUniformIAdd 34 Reduce 107
+             109:    105(ptr) AccessChain 27(data) 104 51 30
+                              Store 109 108
              110:      6(int) Load 8(invocation)
-             112:    102(ptr) AccessChain 27(data) 49 49
-             113:   21(ivec4) Load 112
-             114:  111(ivec3) VectorShuffle 113 113 0 1 2
-             115:  111(ivec3) GroupNonUniformIAdd 34 Reduce 114
-             116:    102(ptr) AccessChain 27(data) 110 49
-             117:   21(ivec4) Load 116
-             118:   21(ivec4) VectorShuffle 117 115 4 5 6 3
-                              Store 116 118
-             119:      6(int) Load 8(invocation)
-             120:    102(ptr) AccessChain 27(data) 59 49
-             121:   21(ivec4) Load 120
-             122:   21(ivec4) GroupNonUniformIAdd 34 Reduce 121
-             123:    102(ptr) AccessChain 27(data) 119 49
-                              Store 123 122
-             124:      6(int) Load 8(invocation)
-             126:    125(ptr) AccessChain 27(data) 29 59 30
-             127:22(float64_t) Load 126
-             128:22(float64_t) GroupNonUniformFAdd 34 Reduce 127
-             129:    125(ptr) AccessChain 27(data) 124 59 30
-                              Store 129 128
-             130:      6(int) Load 8(invocation)
-             133:    132(ptr) AccessChain 27(data) 38 59
-             134: 23(f64vec4) Load 133
-             135:131(f64vec2) VectorShuffle 134 134 0 1
-             136:131(f64vec2) GroupNonUniformFAdd 34 Reduce 135
-             137:    132(ptr) AccessChain 27(data) 130 59
-             138: 23(f64vec4) Load 137
-             139: 23(f64vec4) VectorShuffle 138 136 4 5 2 3
-                              Store 137 139
-             140:      6(int) Load 8(invocation)
-             142:    132(ptr) AccessChain 27(data) 49 59
-             143: 23(f64vec4) Load 142
-             144:141(f64vec3) VectorShuffle 143 143 0 1 2
-             145:141(f64vec3) GroupNonUniformFAdd 34 Reduce 144
-             146:    132(ptr) AccessChain 27(data) 140 59
-             147: 23(f64vec4) Load 146
-             148: 23(f64vec4) VectorShuffle 147 145 4 5 6 3
-                              Store 146 148
-             149:      6(int) Load 8(invocation)
-             150:    132(ptr) AccessChain 27(data) 59 59
-             151: 23(f64vec4) Load 150
-             152: 23(f64vec4) GroupNonUniformFAdd 34 Reduce 151
-             153:    132(ptr) AccessChain 27(data) 149 59
-                              Store 153 152
-             154:      6(int) Load 8(invocation)
-             155:     31(ptr) AccessChain 27(data) 29 29 30
-             156:   17(float) Load 155
-             157:   17(float) GroupNonUniformFMul 34 Reduce 156
-             158:     31(ptr) AccessChain 27(data) 154 29 30
-                              Store 158 157
-             159:      6(int) Load 8(invocation)
-             160:     40(ptr) AccessChain 27(data) 38 29
-             161:   18(fvec4) Load 160
-             162:   39(fvec2) VectorShuffle 161 161 0 1
-             163:   39(fvec2) GroupNonUniformFMul 34 Reduce 162
-             164:     40(ptr) AccessChain 27(data) 159 29
-             165:   18(fvec4) Load 164
-             166:   18(fvec4) VectorShuffle 165 163 4 5 2 3
-                              Store 164 166
+             113:    112(ptr) AccessChain 27(data) 38 51
+             114:   21(ivec4) Load 113
+             115:  111(ivec2) VectorShuffle 114 114 0 1
+             116:  111(ivec2) GroupNonUniformIAdd 34 Reduce 115
+             117:    105(ptr) AccessChain 27(data) 110 51 30
+             118:      6(int) CompositeExtract 116 0
+                              Store 117 118
+             119:    105(ptr) AccessChain 27(data) 110 51 47
+             120:      6(int) CompositeExtract 116 1
+                              Store 119 120
+             121:      6(int) Load 8(invocation)
+             123:    112(ptr) AccessChain 27(data) 51 51
+             124:   21(ivec4) Load 123
+             125:  122(ivec3) VectorShuffle 124 124 0 1 2
+             126:  122(ivec3) GroupNonUniformIAdd 34 Reduce 125
+             127:    105(ptr) AccessChain 27(data) 121 51 30
+             128:      6(int) CompositeExtract 126 0
+                              Store 127 128
+             129:    105(ptr) AccessChain 27(data) 121 51 47
+             130:      6(int) CompositeExtract 126 1
+                              Store 129 130
+             131:    105(ptr) AccessChain 27(data) 121 51 61
+             132:      6(int) CompositeExtract 126 2
+                              Store 131 132
+             133:      6(int) Load 8(invocation)
+             134:    112(ptr) AccessChain 27(data) 65 51
+             135:   21(ivec4) Load 134
+             136:   21(ivec4) GroupNonUniformIAdd 34 Reduce 135
+             137:    112(ptr) AccessChain 27(data) 133 51
+                              Store 137 136
+             138:      6(int) Load 8(invocation)
+             140:    139(ptr) AccessChain 27(data) 29 65 30
+             141:22(float64_t) Load 140
+             142:22(float64_t) GroupNonUniformFAdd 34 Reduce 141
+             143:    139(ptr) AccessChain 27(data) 138 65 30
+                              Store 143 142
+             144:      6(int) Load 8(invocation)
+             147:    146(ptr) AccessChain 27(data) 38 65
+             148: 23(f64vec4) Load 147
+             149:145(f64vec2) VectorShuffle 148 148 0 1
+             150:145(f64vec2) GroupNonUniformFAdd 34 Reduce 149
+             151:    139(ptr) AccessChain 27(data) 144 65 30
+             152:22(float64_t) CompositeExtract 150 0
+                              Store 151 152
+             153:    139(ptr) AccessChain 27(data) 144 65 47
+             154:22(float64_t) CompositeExtract 150 1
+                              Store 153 154
+             155:      6(int) Load 8(invocation)
+             157:    146(ptr) AccessChain 27(data) 51 65
+             158: 23(f64vec4) Load 157
+             159:156(f64vec3) VectorShuffle 158 158 0 1 2
+             160:156(f64vec3) GroupNonUniformFAdd 34 Reduce 159
+             161:    139(ptr) AccessChain 27(data) 155 65 30
+             162:22(float64_t) CompositeExtract 160 0
+                              Store 161 162
+             163:    139(ptr) AccessChain 27(data) 155 65 47
+             164:22(float64_t) CompositeExtract 160 1
+                              Store 163 164
+             165:    139(ptr) AccessChain 27(data) 155 65 61
+             166:22(float64_t) CompositeExtract 160 2
+                              Store 165 166
              167:      6(int) Load 8(invocation)
-             168:     40(ptr) AccessChain 27(data) 49 29
-             169:   18(fvec4) Load 168
-             170:   50(fvec3) VectorShuffle 169 169 0 1 2
-             171:   50(fvec3) GroupNonUniformFMul 34 Reduce 170
-             172:     40(ptr) AccessChain 27(data) 167 29
-             173:   18(fvec4) Load 172
-             174:   18(fvec4) VectorShuffle 173 171 4 5 6 3
-                              Store 172 174
-             175:      6(int) Load 8(invocation)
-             176:     40(ptr) AccessChain 27(data) 59 29
-             177:   18(fvec4) Load 176
-             178:   18(fvec4) GroupNonUniformFMul 34 Reduce 177
-             179:     40(ptr) AccessChain 27(data) 175 29
-                              Store 179 178
-             180:      6(int) Load 8(invocation)
-             181:     65(ptr) AccessChain 27(data) 29 38 30
-             182:     19(int) Load 181
-             183:     19(int) GroupNonUniformIMul 34 Reduce 182
-             184:     65(ptr) AccessChain 27(data) 180 38 30
-                              Store 184 183
-             185:      6(int) Load 8(invocation)
-             186:     72(ptr) AccessChain 27(data) 38 38
-             187:   20(ivec4) Load 186
-             188:   71(ivec2) VectorShuffle 187 187 0 1
-             189:   71(ivec2) GroupNonUniformIMul 34 Reduce 188
-             190:     72(ptr) AccessChain 27(data) 185 38
-             191:   20(ivec4) Load 190
-             192:   20(ivec4) VectorShuffle 191 189 4 5 2 3
-                              Store 190 192
-             193:      6(int) Load 8(invocation)
-             194:     72(ptr) AccessChain 27(data) 49 38
-             195:   20(ivec4) Load 194
-             196:   81(ivec3) VectorShuffle 195 195 0 1 2
-             197:   81(ivec3) GroupNonUniformIMul 34 Reduce 196
-             198:     72(ptr) AccessChain 27(data) 193 38
-             199:   20(ivec4) Load 198
-             200:   20(ivec4) VectorShuffle 199 197 4 5 6 3
-                              Store 198 200
-             201:      6(int) Load 8(invocation)
-             202:     72(ptr) AccessChain 27(data) 59 38
-             203:   20(ivec4) Load 202
-             204:   20(ivec4) GroupNonUniformIMul 34 Reduce 203
-             205:     72(ptr) AccessChain 27(data) 201 38
-                              Store 205 204
-             206:      6(int) Load 8(invocation)
-             207:     95(ptr) AccessChain 27(data) 29 49 30
-             208:      6(int) Load 207
-             209:      6(int) GroupNonUniformIMul 34 Reduce 208
-             210:     95(ptr) AccessChain 27(data) 206 49 30
-                              Store 210 209
-             211:      6(int) Load 8(invocation)
-             212:    102(ptr) AccessChain 27(data) 38 49
-             213:   21(ivec4) Load 212
-             214:  101(ivec2) VectorShuffle 213 213 0 1
-             215:  101(ivec2) GroupNonUniformIMul 34 Reduce 214
-             216:    102(ptr) AccessChain 27(data) 211 49
-             217:   21(ivec4) Load 216
-             218:   21(ivec4) VectorShuffle 217 215 4 5 2 3
-                              Store 216 218
-             219:      6(int) Load 8(invocation)
-             220:    102(ptr) AccessChain 27(data) 49 49
-             221:   21(ivec4) Load 220
-             222:  111(ivec3) VectorShuffle 221 221 0 1 2
-             223:  111(ivec3) GroupNonUniformIMul 34 Reduce 222
-             224:    102(ptr) AccessChain 27(data) 219 49
-             225:   21(ivec4) Load 224
-             226:   21(ivec4) VectorShuffle 225 223 4 5 6 3
-                              Store 224 226
+             168:    146(ptr) AccessChain 27(data) 65 65
+             169: 23(f64vec4) Load 168
+             170: 23(f64vec4) GroupNonUniformFAdd 34 Reduce 169
+             171:    146(ptr) AccessChain 27(data) 167 65
+                              Store 171 170
+             172:      6(int) Load 8(invocation)
+             173:     31(ptr) AccessChain 27(data) 29 29 30
+             174:   17(float) Load 173
+             175:   17(float) GroupNonUniformFMul 34 Reduce 174
+             176:     31(ptr) AccessChain 27(data) 172 29 30
+                              Store 176 175
+             177:      6(int) Load 8(invocation)
+             178:     40(ptr) AccessChain 27(data) 38 29
+             179:   18(fvec4) Load 178
+             180:   39(fvec2) VectorShuffle 179 179 0 1
+             181:   39(fvec2) GroupNonUniformFMul 34 Reduce 180
+             182:     31(ptr) AccessChain 27(data) 177 29 30
+             183:   17(float) CompositeExtract 181 0
+                              Store 182 183
+             184:     31(ptr) AccessChain 27(data) 177 29 47
+             185:   17(float) CompositeExtract 181 1
+                              Store 184 185
+             186:      6(int) Load 8(invocation)
+             187:     40(ptr) AccessChain 27(data) 51 29
+             188:   18(fvec4) Load 187
+             189:   52(fvec3) VectorShuffle 188 188 0 1 2
+             190:   52(fvec3) GroupNonUniformFMul 34 Reduce 189
+             191:     31(ptr) AccessChain 27(data) 186 29 30
+             192:   17(float) CompositeExtract 190 0
+                              Store 191 192
+             193:     31(ptr) AccessChain 27(data) 186 29 47
+             194:   17(float) CompositeExtract 190 1
+                              Store 193 194
+             195:     31(ptr) AccessChain 27(data) 186 29 61
+             196:   17(float) CompositeExtract 190 2
+                              Store 195 196
+             197:      6(int) Load 8(invocation)
+             198:     40(ptr) AccessChain 27(data) 65 29
+             199:   18(fvec4) Load 198
+             200:   18(fvec4) GroupNonUniformFMul 34 Reduce 199
+             201:     40(ptr) AccessChain 27(data) 197 29
+                              Store 201 200
+             202:      6(int) Load 8(invocation)
+             203:     71(ptr) AccessChain 27(data) 29 38 30
+             204:     19(int) Load 203
+             205:     19(int) GroupNonUniformIMul 34 Reduce 204
+             206:     71(ptr) AccessChain 27(data) 202 38 30
+                              Store 206 205
+             207:      6(int) Load 8(invocation)
+             208:     78(ptr) AccessChain 27(data) 38 38
+             209:   20(ivec4) Load 208
+             210:   77(ivec2) VectorShuffle 209 209 0 1
+             211:   77(ivec2) GroupNonUniformIMul 34 Reduce 210
+             212:     71(ptr) AccessChain 27(data) 207 38 30
+             213:     19(int) CompositeExtract 211 0
+                              Store 212 213
+             214:     71(ptr) AccessChain 27(data) 207 38 47
+             215:     19(int) CompositeExtract 211 1
+                              Store 214 215
+             216:      6(int) Load 8(invocation)
+             217:     78(ptr) AccessChain 27(data) 51 38
+             218:   20(ivec4) Load 217
+             219:   88(ivec3) VectorShuffle 218 218 0 1 2
+             220:   88(ivec3) GroupNonUniformIMul 34 Reduce 219
+             221:     71(ptr) AccessChain 27(data) 216 38 30
+             222:     19(int) CompositeExtract 220 0
+                              Store 221 222
+             223:     71(ptr) AccessChain 27(data) 216 38 47
+             224:     19(int) CompositeExtract 220 1
+                              Store 223 224
+             225:     71(ptr) AccessChain 27(data) 216 38 61
+             226:     19(int) CompositeExtract 220 2
+                              Store 225 226
              227:      6(int) Load 8(invocation)
-             228:    102(ptr) AccessChain 27(data) 59 49
-             229:   21(ivec4) Load 228
-             230:   21(ivec4) GroupNonUniformIMul 34 Reduce 229
-             231:    102(ptr) AccessChain 27(data) 227 49
+             228:     78(ptr) AccessChain 27(data) 65 38
+             229:   20(ivec4) Load 228
+             230:   20(ivec4) GroupNonUniformIMul 34 Reduce 229
+             231:     78(ptr) AccessChain 27(data) 227 38
                               Store 231 230
              232:      6(int) Load 8(invocation)
-             233:    125(ptr) AccessChain 27(data) 29 59 30
-             234:22(float64_t) Load 233
-             235:22(float64_t) GroupNonUniformFMul 34 Reduce 234
-             236:    125(ptr) AccessChain 27(data) 232 59 30
+             233:    105(ptr) AccessChain 27(data) 29 51 30
+             234:      6(int) Load 233
+             235:      6(int) GroupNonUniformIMul 34 Reduce 234
+             236:    105(ptr) AccessChain 27(data) 232 51 30
                               Store 236 235
              237:      6(int) Load 8(invocation)
-             238:    132(ptr) AccessChain 27(data) 38 59
-             239: 23(f64vec4) Load 238
-             240:131(f64vec2) VectorShuffle 239 239 0 1
-             241:131(f64vec2) GroupNonUniformFMul 34 Reduce 240
-             242:    132(ptr) AccessChain 27(data) 237 59
-             243: 23(f64vec4) Load 242
-             244: 23(f64vec4) VectorShuffle 243 241 4 5 2 3
-                              Store 242 244
-             245:      6(int) Load 8(invocation)
-             246:    132(ptr) AccessChain 27(data) 49 59
-             247: 23(f64vec4) Load 246
-             248:141(f64vec3) VectorShuffle 247 247 0 1 2
-             249:141(f64vec3) GroupNonUniformFMul 34 Reduce 248
-             250:    132(ptr) AccessChain 27(data) 245 59
-             251: 23(f64vec4) Load 250
-             252: 23(f64vec4) VectorShuffle 251 249 4 5 6 3
-                              Store 250 252
-             253:      6(int) Load 8(invocation)
-             254:    132(ptr) AccessChain 27(data) 59 59
-             255: 23(f64vec4) Load 254
-             256: 23(f64vec4) GroupNonUniformFMul 34 Reduce 255
-             257:    132(ptr) AccessChain 27(data) 253 59
-                              Store 257 256
-             258:      6(int) Load 8(invocation)
-             259:     31(ptr) AccessChain 27(data) 29 29 30
-             260:   17(float) Load 259
-             261:   17(float) GroupNonUniformFMin 34 Reduce 260
-             262:     31(ptr) AccessChain 27(data) 258 29 30
-                              Store 262 261
-             263:      6(int) Load 8(invocation)
-             264:     40(ptr) AccessChain 27(data) 38 29
-             265:   18(fvec4) Load 264
-             266:   39(fvec2) VectorShuffle 265 265 0 1
-             267:   39(fvec2) GroupNonUniformFMin 34 Reduce 266
-             268:     40(ptr) AccessChain 27(data) 263 29
-             269:   18(fvec4) Load 268
-             270:   18(fvec4) VectorShuffle 269 267 4 5 2 3
-                              Store 268 270
-             271:      6(int) Load 8(invocation)
-             272:     40(ptr) AccessChain 27(data) 49 29
-             273:   18(fvec4) Load 272
-             274:   50(fvec3) VectorShuffle 273 273 0 1 2
-             275:   50(fvec3) GroupNonUniformFMin 34 Reduce 274
-             276:     40(ptr) AccessChain 27(data) 271 29
-             277:   18(fvec4) Load 276
-             278:   18(fvec4) VectorShuffle 277 275 4 5 6 3
-                              Store 276 278
-             279:      6(int) Load 8(invocation)
-             280:     40(ptr) AccessChain 27(data) 59 29
-             281:   18(fvec4) Load 280
-             282:   18(fvec4) GroupNonUniformFMin 34 Reduce 281
-             283:     40(ptr) AccessChain 27(data) 279 29
-                              Store 283 282
-             284:      6(int) Load 8(invocation)
-             285:     65(ptr) AccessChain 27(data) 29 38 30
-             286:     19(int) Load 285
-             287:     19(int) GroupNonUniformSMin 34 Reduce 286
-             288:     65(ptr) AccessChain 27(data) 284 38 30
-                              Store 288 287
-             289:      6(int) Load 8(invocation)
-             290:     72(ptr) AccessChain 27(data) 38 38
-             291:   20(ivec4) Load 290
-             292:   71(ivec2) VectorShuffle 291 291 0 1
-             293:   71(ivec2) GroupNonUniformSMin 34 Reduce 292
-             294:     72(ptr) AccessChain 27(data) 289 38
-             295:   20(ivec4) Load 294
-             296:   20(ivec4) VectorShuffle 295 293 4 5 2 3
-                              Store 294 296
+             238:    112(ptr) AccessChain 27(data) 38 51
+             239:   21(ivec4) Load 238
+             240:  111(ivec2) VectorShuffle 239 239 0 1
+             241:  111(ivec2) GroupNonUniformIMul 34 Reduce 240
+             242:    105(ptr) AccessChain 27(data) 237 51 30
+             243:      6(int) CompositeExtract 241 0
+                              Store 242 243
+             244:    105(ptr) AccessChain 27(data) 237 51 47
+             245:      6(int) CompositeExtract 241 1
+                              Store 244 245
+             246:      6(int) Load 8(invocation)
+             247:    112(ptr) AccessChain 27(data) 51 51
+             248:   21(ivec4) Load 247
+             249:  122(ivec3) VectorShuffle 248 248 0 1 2
+             250:  122(ivec3) GroupNonUniformIMul 34 Reduce 249
+             251:    105(ptr) AccessChain 27(data) 246 51 30
+             252:      6(int) CompositeExtract 250 0
+                              Store 251 252
+             253:    105(ptr) AccessChain 27(data) 246 51 47
+             254:      6(int) CompositeExtract 250 1
+                              Store 253 254
+             255:    105(ptr) AccessChain 27(data) 246 51 61
+             256:      6(int) CompositeExtract 250 2
+                              Store 255 256
+             257:      6(int) Load 8(invocation)
+             258:    112(ptr) AccessChain 27(data) 65 51
+             259:   21(ivec4) Load 258
+             260:   21(ivec4) GroupNonUniformIMul 34 Reduce 259
+             261:    112(ptr) AccessChain 27(data) 257 51
+                              Store 261 260
+             262:      6(int) Load 8(invocation)
+             263:    139(ptr) AccessChain 27(data) 29 65 30
+             264:22(float64_t) Load 263
+             265:22(float64_t) GroupNonUniformFMul 34 Reduce 264
+             266:    139(ptr) AccessChain 27(data) 262 65 30
+                              Store 266 265
+             267:      6(int) Load 8(invocation)
+             268:    146(ptr) AccessChain 27(data) 38 65
+             269: 23(f64vec4) Load 268
+             270:145(f64vec2) VectorShuffle 269 269 0 1
+             271:145(f64vec2) GroupNonUniformFMul 34 Reduce 270
+             272:    139(ptr) AccessChain 27(data) 267 65 30
+             273:22(float64_t) CompositeExtract 271 0
+                              Store 272 273
+             274:    139(ptr) AccessChain 27(data) 267 65 47
+             275:22(float64_t) CompositeExtract 271 1
+                              Store 274 275
+             276:      6(int) Load 8(invocation)
+             277:    146(ptr) AccessChain 27(data) 51 65
+             278: 23(f64vec4) Load 277
+             279:156(f64vec3) VectorShuffle 278 278 0 1 2
+             280:156(f64vec3) GroupNonUniformFMul 34 Reduce 279
+             281:    139(ptr) AccessChain 27(data) 276 65 30
+             282:22(float64_t) CompositeExtract 280 0
+                              Store 281 282
+             283:    139(ptr) AccessChain 27(data) 276 65 47
+             284:22(float64_t) CompositeExtract 280 1
+                              Store 283 284
+             285:    139(ptr) AccessChain 27(data) 276 65 61
+             286:22(float64_t) CompositeExtract 280 2
+                              Store 285 286
+             287:      6(int) Load 8(invocation)
+             288:    146(ptr) AccessChain 27(data) 65 65
+             289: 23(f64vec4) Load 288
+             290: 23(f64vec4) GroupNonUniformFMul 34 Reduce 289
+             291:    146(ptr) AccessChain 27(data) 287 65
+                              Store 291 290
+             292:      6(int) Load 8(invocation)
+             293:     31(ptr) AccessChain 27(data) 29 29 30
+             294:   17(float) Load 293
+             295:   17(float) GroupNonUniformFMin 34 Reduce 294
+             296:     31(ptr) AccessChain 27(data) 292 29 30
+                              Store 296 295
              297:      6(int) Load 8(invocation)
-             298:     72(ptr) AccessChain 27(data) 49 38
-             299:   20(ivec4) Load 298
-             300:   81(ivec3) VectorShuffle 299 299 0 1 2
-             301:   81(ivec3) GroupNonUniformSMin 34 Reduce 300
-             302:     72(ptr) AccessChain 27(data) 297 38
-             303:   20(ivec4) Load 302
-             304:   20(ivec4) VectorShuffle 303 301 4 5 6 3
-                              Store 302 304
-             305:      6(int) Load 8(invocation)
-             306:     72(ptr) AccessChain 27(data) 59 38
-             307:   20(ivec4) Load 306
-             308:   20(ivec4) GroupNonUniformSMin 34 Reduce 307
-             309:     72(ptr) AccessChain 27(data) 305 38
-                              Store 309 308
-             310:      6(int) Load 8(invocation)
-             311:     95(ptr) AccessChain 27(data) 29 49 30
-             312:      6(int) Load 311
-             313:      6(int) GroupNonUniformUMin 34 Reduce 312
-             314:     95(ptr) AccessChain 27(data) 310 49 30
-                              Store 314 313
-             315:      6(int) Load 8(invocation)
-             316:    102(ptr) AccessChain 27(data) 38 49
-             317:   21(ivec4) Load 316
-             318:  101(ivec2) VectorShuffle 317 317 0 1
-             319:  101(ivec2) GroupNonUniformUMin 34 Reduce 318
-             320:    102(ptr) AccessChain 27(data) 315 49
-             321:   21(ivec4) Load 320
-             322:   21(ivec4) VectorShuffle 321 319 4 5 2 3
-                              Store 320 322
-             323:      6(int) Load 8(invocation)
-             324:    102(ptr) AccessChain 27(data) 49 49
-             325:   21(ivec4) Load 324
-             326:  111(ivec3) VectorShuffle 325 325 0 1 2
-             327:  111(ivec3) GroupNonUniformUMin 34 Reduce 326
-             328:    102(ptr) AccessChain 27(data) 323 49
-             329:   21(ivec4) Load 328
-             330:   21(ivec4) VectorShuffle 329 327 4 5 6 3
-                              Store 328 330
-             331:      6(int) Load 8(invocation)
-             332:    102(ptr) AccessChain 27(data) 59 49
-             333:   21(ivec4) Load 332
-             334:   21(ivec4) GroupNonUniformUMin 34 Reduce 333
-             335:    102(ptr) AccessChain 27(data) 331 49
-                              Store 335 334
+             298:     40(ptr) AccessChain 27(data) 38 29
+             299:   18(fvec4) Load 298
+             300:   39(fvec2) VectorShuffle 299 299 0 1
+             301:   39(fvec2) GroupNonUniformFMin 34 Reduce 300
+             302:     31(ptr) AccessChain 27(data) 297 29 30
+             303:   17(float) CompositeExtract 301 0
+                              Store 302 303
+             304:     31(ptr) AccessChain 27(data) 297 29 47
+             305:   17(float) CompositeExtract 301 1
+                              Store 304 305
+             306:      6(int) Load 8(invocation)
+             307:     40(ptr) AccessChain 27(data) 51 29
+             308:   18(fvec4) Load 307
+             309:   52(fvec3) VectorShuffle 308 308 0 1 2
+             310:   52(fvec3) GroupNonUniformFMin 34 Reduce 309
+             311:     31(ptr) AccessChain 27(data) 306 29 30
+             312:   17(float) CompositeExtract 310 0
+                              Store 311 312
+             313:     31(ptr) AccessChain 27(data) 306 29 47
+             314:   17(float) CompositeExtract 310 1
+                              Store 313 314
+             315:     31(ptr) AccessChain 27(data) 306 29 61
+             316:   17(float) CompositeExtract 310 2
+                              Store 315 316
+             317:      6(int) Load 8(invocation)
+             318:     40(ptr) AccessChain 27(data) 65 29
+             319:   18(fvec4) Load 318
+             320:   18(fvec4) GroupNonUniformFMin 34 Reduce 319
+             321:     40(ptr) AccessChain 27(data) 317 29
+                              Store 321 320
+             322:      6(int) Load 8(invocation)
+             323:     71(ptr) AccessChain 27(data) 29 38 30
+             324:     19(int) Load 323
+             325:     19(int) GroupNonUniformSMin 34 Reduce 324
+             326:     71(ptr) AccessChain 27(data) 322 38 30
+                              Store 326 325
+             327:      6(int) Load 8(invocation)
+             328:     78(ptr) AccessChain 27(data) 38 38
+             329:   20(ivec4) Load 328
+             330:   77(ivec2) VectorShuffle 329 329 0 1
+             331:   77(ivec2) GroupNonUniformSMin 34 Reduce 330
+             332:     71(ptr) AccessChain 27(data) 327 38 30
+             333:     19(int) CompositeExtract 331 0
+                              Store 332 333
+             334:     71(ptr) AccessChain 27(data) 327 38 47
+             335:     19(int) CompositeExtract 331 1
+                              Store 334 335
              336:      6(int) Load 8(invocation)
-             337:    125(ptr) AccessChain 27(data) 29 59 30
-             338:22(float64_t) Load 337
-             339:22(float64_t) GroupNonUniformFMin 34 Reduce 338
-             340:    125(ptr) AccessChain 27(data) 336 59 30
-                              Store 340 339
-             341:      6(int) Load 8(invocation)
-             342:    132(ptr) AccessChain 27(data) 38 59
-             343: 23(f64vec4) Load 342
-             344:131(f64vec2) VectorShuffle 343 343 0 1
-             345:131(f64vec2) GroupNonUniformFMin 34 Reduce 344
-             346:    132(ptr) AccessChain 27(data) 341 59
-             347: 23(f64vec4) Load 346
-             348: 23(f64vec4) VectorShuffle 347 345 4 5 2 3
-                              Store 346 348
-             349:      6(int) Load 8(invocation)
-             350:    132(ptr) AccessChain 27(data) 49 59
-             351: 23(f64vec4) Load 350
-             352:141(f64vec3) VectorShuffle 351 351 0 1 2
-             353:141(f64vec3) GroupNonUniformFMin 34 Reduce 352
-             354:    132(ptr) AccessChain 27(data) 349 59
-             355: 23(f64vec4) Load 354
-             356: 23(f64vec4) VectorShuffle 355 353 4 5 6 3
-                              Store 354 356
+             337:     78(ptr) AccessChain 27(data) 51 38
+             338:   20(ivec4) Load 337
+             339:   88(ivec3) VectorShuffle 338 338 0 1 2
+             340:   88(ivec3) GroupNonUniformSMin 34 Reduce 339
+             341:     71(ptr) AccessChain 27(data) 336 38 30
+             342:     19(int) CompositeExtract 340 0
+                              Store 341 342
+             343:     71(ptr) AccessChain 27(data) 336 38 47
+             344:     19(int) CompositeExtract 340 1
+                              Store 343 344
+             345:     71(ptr) AccessChain 27(data) 336 38 61
+             346:     19(int) CompositeExtract 340 2
+                              Store 345 346
+             347:      6(int) Load 8(invocation)
+             348:     78(ptr) AccessChain 27(data) 65 38
+             349:   20(ivec4) Load 348
+             350:   20(ivec4) GroupNonUniformSMin 34 Reduce 349
+             351:     78(ptr) AccessChain 27(data) 347 38
+                              Store 351 350
+             352:      6(int) Load 8(invocation)
+             353:    105(ptr) AccessChain 27(data) 29 51 30
+             354:      6(int) Load 353
+             355:      6(int) GroupNonUniformUMin 34 Reduce 354
+             356:    105(ptr) AccessChain 27(data) 352 51 30
+                              Store 356 355
              357:      6(int) Load 8(invocation)
-             358:    132(ptr) AccessChain 27(data) 59 59
-             359: 23(f64vec4) Load 358
-             360: 23(f64vec4) GroupNonUniformFMin 34 Reduce 359
-             361:    132(ptr) AccessChain 27(data) 357 59
-                              Store 361 360
-             362:      6(int) Load 8(invocation)
-             363:     31(ptr) AccessChain 27(data) 29 29 30
-             364:   17(float) Load 363
-             365:   17(float) GroupNonUniformFMax 34 Reduce 364
-             366:     31(ptr) AccessChain 27(data) 362 29 30
-                              Store 366 365
-             367:      6(int) Load 8(invocation)
-             368:     40(ptr) AccessChain 27(data) 38 29
-             369:   18(fvec4) Load 368
-             370:   39(fvec2) VectorShuffle 369 369 0 1
-             371:   39(fvec2) GroupNonUniformFMax 34 Reduce 370
-             372:     40(ptr) AccessChain 27(data) 367 29
-             373:   18(fvec4) Load 372
-             374:   18(fvec4) VectorShuffle 373 371 4 5 2 3
-                              Store 372 374
-             375:      6(int) Load 8(invocation)
-             376:     40(ptr) AccessChain 27(data) 49 29
-             377:   18(fvec4) Load 376
-             378:   50(fvec3) VectorShuffle 377 377 0 1 2
-             379:   50(fvec3) GroupNonUniformFMax 34 Reduce 378
-             380:     40(ptr) AccessChain 27(data) 375 29
-             381:   18(fvec4) Load 380
-             382:   18(fvec4) VectorShuffle 381 379 4 5 6 3
-                              Store 380 382
-             383:      6(int) Load 8(invocation)
-             384:     40(ptr) AccessChain 27(data) 59 29
-             385:   18(fvec4) Load 384
-             386:   18(fvec4) GroupNonUniformFMax 34 Reduce 385
-             387:     40(ptr) AccessChain 27(data) 383 29
-                              Store 387 386
-             388:      6(int) Load 8(invocation)
-             389:     65(ptr) AccessChain 27(data) 29 38 30
-             390:     19(int) Load 389
-             391:     19(int) GroupNonUniformSMax 34 Reduce 390
-             392:     65(ptr) AccessChain 27(data) 388 38 30
-                              Store 392 391
-             393:      6(int) Load 8(invocation)
-             394:     72(ptr) AccessChain 27(data) 38 38
-             395:   20(ivec4) Load 394
-             396:   71(ivec2) VectorShuffle 395 395 0 1
-             397:   71(ivec2) GroupNonUniformSMax 34 Reduce 396
-             398:     72(ptr) AccessChain 27(data) 393 38
-             399:   20(ivec4) Load 398
-             400:   20(ivec4) VectorShuffle 399 397 4 5 2 3
-                              Store 398 400
-             401:      6(int) Load 8(invocation)
-             402:     72(ptr) AccessChain 27(data) 49 38
-             403:   20(ivec4) Load 402
-             404:   81(ivec3) VectorShuffle 403 403 0 1 2
-             405:   81(ivec3) GroupNonUniformSMax 34 Reduce 404
-             406:     72(ptr) AccessChain 27(data) 401 38
-             407:   20(ivec4) Load 406
-             408:   20(ivec4) VectorShuffle 407 405 4 5 6 3
-                              Store 406 408
-             409:      6(int) Load 8(invocation)
-             410:     72(ptr) AccessChain 27(data) 59 38
-             411:   20(ivec4) Load 410
-             412:   20(ivec4) GroupNonUniformSMax 34 Reduce 411
-             413:     72(ptr) AccessChain 27(data) 409 38
-                              Store 413 412
-             414:      6(int) Load 8(invocation)
-             415:     95(ptr) AccessChain 27(data) 29 49 30
-             416:      6(int) Load 415
-             417:      6(int) GroupNonUniformUMax 34 Reduce 416
-             418:     95(ptr) AccessChain 27(data) 414 49 30
-                              Store 418 417
-             419:      6(int) Load 8(invocation)
-             420:    102(ptr) AccessChain 27(data) 38 49
-             421:   21(ivec4) Load 420
-             422:  101(ivec2) VectorShuffle 421 421 0 1
-             423:  101(ivec2) GroupNonUniformUMax 34 Reduce 422
-             424:    102(ptr) AccessChain 27(data) 419 49
-             425:   21(ivec4) Load 424
-             426:   21(ivec4) VectorShuffle 425 423 4 5 2 3
-                              Store 424 426
-             427:      6(int) Load 8(invocation)
-             428:    102(ptr) AccessChain 27(data) 49 49
-             429:   21(ivec4) Load 428
-             430:  111(ivec3) VectorShuffle 429 429 0 1 2
-             431:  111(ivec3) GroupNonUniformUMax 34 Reduce 430
-             432:    102(ptr) AccessChain 27(data) 427 49
-             433:   21(ivec4) Load 432
-             434:   21(ivec4) VectorShuffle 433 431 4 5 6 3
-                              Store 432 434
-             435:      6(int) Load 8(invocation)
-             436:    102(ptr) AccessChain 27(data) 59 49
-             437:   21(ivec4) Load 436
-             438:   21(ivec4) GroupNonUniformUMax 34 Reduce 437
-             439:    102(ptr) AccessChain 27(data) 435 49
-                              Store 439 438
-             440:      6(int) Load 8(invocation)
-             441:    125(ptr) AccessChain 27(data) 29 59 30
-             442:22(float64_t) Load 441
-             443:22(float64_t) GroupNonUniformFMax 34 Reduce 442
-             444:    125(ptr) AccessChain 27(data) 440 59 30
-                              Store 444 443
-             445:      6(int) Load 8(invocation)
-             446:    132(ptr) AccessChain 27(data) 38 59
-             447: 23(f64vec4) Load 446
-             448:131(f64vec2) VectorShuffle 447 447 0 1
-             449:131(f64vec2) GroupNonUniformFMax 34 Reduce 448
-             450:    132(ptr) AccessChain 27(data) 445 59
-             451: 23(f64vec4) Load 450
-             452: 23(f64vec4) VectorShuffle 451 449 4 5 2 3
-                              Store 450 452
-             453:      6(int) Load 8(invocation)
-             454:    132(ptr) AccessChain 27(data) 49 59
-             455: 23(f64vec4) Load 454
-             456:141(f64vec3) VectorShuffle 455 455 0 1 2
-             457:141(f64vec3) GroupNonUniformFMax 34 Reduce 456
-             458:    132(ptr) AccessChain 27(data) 453 59
-             459: 23(f64vec4) Load 458
-             460: 23(f64vec4) VectorShuffle 459 457 4 5 6 3
-                              Store 458 460
-             461:      6(int) Load 8(invocation)
-             462:    132(ptr) AccessChain 27(data) 59 59
-             463: 23(f64vec4) Load 462
-             464: 23(f64vec4) GroupNonUniformFMax 34 Reduce 463
-             465:    132(ptr) AccessChain 27(data) 461 59
-                              Store 465 464
-             466:      6(int) Load 8(invocation)
-             467:     65(ptr) AccessChain 27(data) 29 38 30
-             468:     19(int) Load 467
-             469:     19(int) GroupNonUniformBitwiseAnd 34 Reduce 468
-             470:     65(ptr) AccessChain 27(data) 466 38 30
-                              Store 470 469
-             471:      6(int) Load 8(invocation)
-             472:     72(ptr) AccessChain 27(data) 38 38
-             473:   20(ivec4) Load 472
-             474:   71(ivec2) VectorShuffle 473 473 0 1
-             475:   71(ivec2) GroupNonUniformBitwiseAnd 34 Reduce 474
-             476:     72(ptr) AccessChain 27(data) 471 38
-             477:   20(ivec4) Load 476
-             478:   20(ivec4) VectorShuffle 477 475 4 5 2 3
-                              Store 476 478
-             479:      6(int) Load 8(invocation)
-             480:     72(ptr) AccessChain 27(data) 49 38
-             481:   20(ivec4) Load 480
-             482:   81(ivec3) VectorShuffle 481 481 0 1 2
-             483:   81(ivec3) GroupNonUniformBitwiseAnd 34 Reduce 482
-             484:     72(ptr) AccessChain 27(data) 479 38
-             485:   20(ivec4) Load 484
-             486:   20(ivec4) VectorShuffle 485 483 4 5 6 3
-                              Store 484 486
-             487:      6(int) Load 8(invocation)
-             488:     72(ptr) AccessChain 27(data) 59 38
-             489:   20(ivec4) Load 488
-             490:   20(ivec4) GroupNonUniformBitwiseAnd 34 Reduce 489
-             491:     72(ptr) AccessChain 27(data) 487 38
-                              Store 491 490
-             492:      6(int) Load 8(invocation)
-             493:     95(ptr) AccessChain 27(data) 29 49 30
-             494:      6(int) Load 493
-             495:      6(int) GroupNonUniformBitwiseAnd 34 Reduce 494
-             496:     95(ptr) AccessChain 27(data) 492 49 30
-                              Store 496 495
+             358:    112(ptr) AccessChain 27(data) 38 51
+             359:   21(ivec4) Load 358
+             360:  111(ivec2) VectorShuffle 359 359 0 1
+             361:  111(ivec2) GroupNonUniformUMin 34 Reduce 360
+             362:    105(ptr) AccessChain 27(data) 357 51 30
+             363:      6(int) CompositeExtract 361 0
+                              Store 362 363
+             364:    105(ptr) AccessChain 27(data) 357 51 47
+             365:      6(int) CompositeExtract 361 1
+                              Store 364 365
+             366:      6(int) Load 8(invocation)
+             367:    112(ptr) AccessChain 27(data) 51 51
+             368:   21(ivec4) Load 367
+             369:  122(ivec3) VectorShuffle 368 368 0 1 2
+             370:  122(ivec3) GroupNonUniformUMin 34 Reduce 369
+             371:    105(ptr) AccessChain 27(data) 366 51 30
+             372:      6(int) CompositeExtract 370 0
+                              Store 371 372
+             373:    105(ptr) AccessChain 27(data) 366 51 47
+             374:      6(int) CompositeExtract 370 1
+                              Store 373 374
+             375:    105(ptr) AccessChain 27(data) 366 51 61
+             376:      6(int) CompositeExtract 370 2
+                              Store 375 376
+             377:      6(int) Load 8(invocation)
+             378:    112(ptr) AccessChain 27(data) 65 51
+             379:   21(ivec4) Load 378
+             380:   21(ivec4) GroupNonUniformUMin 34 Reduce 379
+             381:    112(ptr) AccessChain 27(data) 377 51
+                              Store 381 380
+             382:      6(int) Load 8(invocation)
+             383:    139(ptr) AccessChain 27(data) 29 65 30
+             384:22(float64_t) Load 383
+             385:22(float64_t) GroupNonUniformFMin 34 Reduce 384
+             386:    139(ptr) AccessChain 27(data) 382 65 30
+                              Store 386 385
+             387:      6(int) Load 8(invocation)
+             388:    146(ptr) AccessChain 27(data) 38 65
+             389: 23(f64vec4) Load 388
+             390:145(f64vec2) VectorShuffle 389 389 0 1
+             391:145(f64vec2) GroupNonUniformFMin 34 Reduce 390
+             392:    139(ptr) AccessChain 27(data) 387 65 30
+             393:22(float64_t) CompositeExtract 391 0
+                              Store 392 393
+             394:    139(ptr) AccessChain 27(data) 387 65 47
+             395:22(float64_t) CompositeExtract 391 1
+                              Store 394 395
+             396:      6(int) Load 8(invocation)
+             397:    146(ptr) AccessChain 27(data) 51 65
+             398: 23(f64vec4) Load 397
+             399:156(f64vec3) VectorShuffle 398 398 0 1 2
+             400:156(f64vec3) GroupNonUniformFMin 34 Reduce 399
+             401:    139(ptr) AccessChain 27(data) 396 65 30
+             402:22(float64_t) CompositeExtract 400 0
+                              Store 401 402
+             403:    139(ptr) AccessChain 27(data) 396 65 47
+             404:22(float64_t) CompositeExtract 400 1
+                              Store 403 404
+             405:    139(ptr) AccessChain 27(data) 396 65 61
+             406:22(float64_t) CompositeExtract 400 2
+                              Store 405 406
+             407:      6(int) Load 8(invocation)
+             408:    146(ptr) AccessChain 27(data) 65 65
+             409: 23(f64vec4) Load 408
+             410: 23(f64vec4) GroupNonUniformFMin 34 Reduce 409
+             411:    146(ptr) AccessChain 27(data) 407 65
+                              Store 411 410
+             412:      6(int) Load 8(invocation)
+             413:     31(ptr) AccessChain 27(data) 29 29 30
+             414:   17(float) Load 413
+             415:   17(float) GroupNonUniformFMax 34 Reduce 414
+             416:     31(ptr) AccessChain 27(data) 412 29 30
+                              Store 416 415
+             417:      6(int) Load 8(invocation)
+             418:     40(ptr) AccessChain 27(data) 38 29
+             419:   18(fvec4) Load 418
+             420:   39(fvec2) VectorShuffle 419 419 0 1
+             421:   39(fvec2) GroupNonUniformFMax 34 Reduce 420
+             422:     31(ptr) AccessChain 27(data) 417 29 30
+             423:   17(float) CompositeExtract 421 0
+                              Store 422 423
+             424:     31(ptr) AccessChain 27(data) 417 29 47
+             425:   17(float) CompositeExtract 421 1
+                              Store 424 425
+             426:      6(int) Load 8(invocation)
+             427:     40(ptr) AccessChain 27(data) 51 29
+             428:   18(fvec4) Load 427
+             429:   52(fvec3) VectorShuffle 428 428 0 1 2
+             430:   52(fvec3) GroupNonUniformFMax 34 Reduce 429
+             431:     31(ptr) AccessChain 27(data) 426 29 30
+             432:   17(float) CompositeExtract 430 0
+                              Store 431 432
+             433:     31(ptr) AccessChain 27(data) 426 29 47
+             434:   17(float) CompositeExtract 430 1
+                              Store 433 434
+             435:     31(ptr) AccessChain 27(data) 426 29 61
+             436:   17(float) CompositeExtract 430 2
+                              Store 435 436
+             437:      6(int) Load 8(invocation)
+             438:     40(ptr) AccessChain 27(data) 65 29
+             439:   18(fvec4) Load 438
+             440:   18(fvec4) GroupNonUniformFMax 34 Reduce 439
+             441:     40(ptr) AccessChain 27(data) 437 29
+                              Store 441 440
+             442:      6(int) Load 8(invocation)
+             443:     71(ptr) AccessChain 27(data) 29 38 30
+             444:     19(int) Load 443
+             445:     19(int) GroupNonUniformSMax 34 Reduce 444
+             446:     71(ptr) AccessChain 27(data) 442 38 30
+                              Store 446 445
+             447:      6(int) Load 8(invocation)
+             448:     78(ptr) AccessChain 27(data) 38 38
+             449:   20(ivec4) Load 448
+             450:   77(ivec2) VectorShuffle 449 449 0 1
+             451:   77(ivec2) GroupNonUniformSMax 34 Reduce 450
+             452:     71(ptr) AccessChain 27(data) 447 38 30
+             453:     19(int) CompositeExtract 451 0
+                              Store 452 453
+             454:     71(ptr) AccessChain 27(data) 447 38 47
+             455:     19(int) CompositeExtract 451 1
+                              Store 454 455
+             456:      6(int) Load 8(invocation)
+             457:     78(ptr) AccessChain 27(data) 51 38
+             458:   20(ivec4) Load 457
+             459:   88(ivec3) VectorShuffle 458 458 0 1 2
+             460:   88(ivec3) GroupNonUniformSMax 34 Reduce 459
+             461:     71(ptr) AccessChain 27(data) 456 38 30
+             462:     19(int) CompositeExtract 460 0
+                              Store 461 462
+             463:     71(ptr) AccessChain 27(data) 456 38 47
+             464:     19(int) CompositeExtract 460 1
+                              Store 463 464
+             465:     71(ptr) AccessChain 27(data) 456 38 61
+             466:     19(int) CompositeExtract 460 2
+                              Store 465 466
+             467:      6(int) Load 8(invocation)
+             468:     78(ptr) AccessChain 27(data) 65 38
+             469:   20(ivec4) Load 468
+             470:   20(ivec4) GroupNonUniformSMax 34 Reduce 469
+             471:     78(ptr) AccessChain 27(data) 467 38
+                              Store 471 470
+             472:      6(int) Load 8(invocation)
+             473:    105(ptr) AccessChain 27(data) 29 51 30
+             474:      6(int) Load 473
+             475:      6(int) GroupNonUniformUMax 34 Reduce 474
+             476:    105(ptr) AccessChain 27(data) 472 51 30
+                              Store 476 475
+             477:      6(int) Load 8(invocation)
+             478:    112(ptr) AccessChain 27(data) 38 51
+             479:   21(ivec4) Load 478
+             480:  111(ivec2) VectorShuffle 479 479 0 1
+             481:  111(ivec2) GroupNonUniformUMax 34 Reduce 480
+             482:    105(ptr) AccessChain 27(data) 477 51 30
+             483:      6(int) CompositeExtract 481 0
+                              Store 482 483
+             484:    105(ptr) AccessChain 27(data) 477 51 47
+             485:      6(int) CompositeExtract 481 1
+                              Store 484 485
+             486:      6(int) Load 8(invocation)
+             487:    112(ptr) AccessChain 27(data) 51 51
+             488:   21(ivec4) Load 487
+             489:  122(ivec3) VectorShuffle 488 488 0 1 2
+             490:  122(ivec3) GroupNonUniformUMax 34 Reduce 489
+             491:    105(ptr) AccessChain 27(data) 486 51 30
+             492:      6(int) CompositeExtract 490 0
+                              Store 491 492
+             493:    105(ptr) AccessChain 27(data) 486 51 47
+             494:      6(int) CompositeExtract 490 1
+                              Store 493 494
+             495:    105(ptr) AccessChain 27(data) 486 51 61
+             496:      6(int) CompositeExtract 490 2
+                              Store 495 496
              497:      6(int) Load 8(invocation)
-             498:    102(ptr) AccessChain 27(data) 38 49
+             498:    112(ptr) AccessChain 27(data) 65 51
              499:   21(ivec4) Load 498
-             500:  101(ivec2) VectorShuffle 499 499 0 1
-             501:  101(ivec2) GroupNonUniformBitwiseAnd 34 Reduce 500
-             502:    102(ptr) AccessChain 27(data) 497 49
-             503:   21(ivec4) Load 502
-             504:   21(ivec4) VectorShuffle 503 501 4 5 2 3
-                              Store 502 504
-             505:      6(int) Load 8(invocation)
-             506:    102(ptr) AccessChain 27(data) 49 49
-             507:   21(ivec4) Load 506
-             508:  111(ivec3) VectorShuffle 507 507 0 1 2
-             509:  111(ivec3) GroupNonUniformBitwiseAnd 34 Reduce 508
-             510:    102(ptr) AccessChain 27(data) 505 49
-             511:   21(ivec4) Load 510
-             512:   21(ivec4) VectorShuffle 511 509 4 5 6 3
-                              Store 510 512
-             513:      6(int) Load 8(invocation)
-             514:    102(ptr) AccessChain 27(data) 59 49
-             515:   21(ivec4) Load 514
-             516:   21(ivec4) GroupNonUniformBitwiseAnd 34 Reduce 515
-             517:    102(ptr) AccessChain 27(data) 513 49
-                              Store 517 516
-             518:      6(int) Load 8(invocation)
-             519:     65(ptr) AccessChain 27(data) 29 38 30
-             520:     19(int) Load 519
-             522:   521(bool) SLessThan 520 29
-             523:   521(bool) GroupNonUniformLogicalAnd 34 Reduce 522
-             524:     19(int) Select 523 38 29
-             525:     65(ptr) AccessChain 27(data) 518 38 30
-                              Store 525 524
-             526:      6(int) Load 8(invocation)
-             527:     72(ptr) AccessChain 27(data) 38 38
-             528:   20(ivec4) Load 527
-             529:   71(ivec2) VectorShuffle 528 528 0 1
-             532:  531(bvec2) SLessThan 529 530
-             533:  531(bvec2) GroupNonUniformLogicalAnd 34 Reduce 532
-             535:   71(ivec2) Select 533 534 530
-             536:     72(ptr) AccessChain 27(data) 526 38
-             537:   20(ivec4) Load 536
-             538:   20(ivec4) VectorShuffle 537 535 4 5 2 3
-                              Store 536 538
-             539:      6(int) Load 8(invocation)
-             540:     72(ptr) AccessChain 27(data) 38 38
-             541:   20(ivec4) Load 540
-             542:   81(ivec3) VectorShuffle 541 541 0 1 2
-             545:  544(bvec3) SLessThan 542 543
-             546:  544(bvec3) GroupNonUniformLogicalAnd 34 Reduce 545
-             548:   81(ivec3) Select 546 547 543
-             549:     72(ptr) AccessChain 27(data) 539 38
-             550:   20(ivec4) Load 549
-             551:   20(ivec4) VectorShuffle 550 548 4 5 6 3
-                              Store 549 551
-             552:      6(int) Load 8(invocation)
-             553:     72(ptr) AccessChain 27(data) 38 38
-             554:   20(ivec4) Load 553
-             557:  556(bvec4) SLessThan 554 555
-             558:  556(bvec4) GroupNonUniformLogicalAnd 34 Reduce 557
-             560:   20(ivec4) Select 558 559 555
-             561:     72(ptr) AccessChain 27(data) 552 38
+             500:   21(ivec4) GroupNonUniformUMax 34 Reduce 499
+             501:    112(ptr) AccessChain 27(data) 497 51
+                              Store 501 500
+             502:      6(int) Load 8(invocation)
+             503:    139(ptr) AccessChain 27(data) 29 65 30
+             504:22(float64_t) Load 503
+             505:22(float64_t) GroupNonUniformFMax 34 Reduce 504
+             506:    139(ptr) AccessChain 27(data) 502 65 30
+                              Store 506 505
+             507:      6(int) Load 8(invocation)
+             508:    146(ptr) AccessChain 27(data) 38 65
+             509: 23(f64vec4) Load 508
+             510:145(f64vec2) VectorShuffle 509 509 0 1
+             511:145(f64vec2) GroupNonUniformFMax 34 Reduce 510
+             512:    139(ptr) AccessChain 27(data) 507 65 30
+             513:22(float64_t) CompositeExtract 511 0
+                              Store 512 513
+             514:    139(ptr) AccessChain 27(data) 507 65 47
+             515:22(float64_t) CompositeExtract 511 1
+                              Store 514 515
+             516:      6(int) Load 8(invocation)
+             517:    146(ptr) AccessChain 27(data) 51 65
+             518: 23(f64vec4) Load 517
+             519:156(f64vec3) VectorShuffle 518 518 0 1 2
+             520:156(f64vec3) GroupNonUniformFMax 34 Reduce 519
+             521:    139(ptr) AccessChain 27(data) 516 65 30
+             522:22(float64_t) CompositeExtract 520 0
+                              Store 521 522
+             523:    139(ptr) AccessChain 27(data) 516 65 47
+             524:22(float64_t) CompositeExtract 520 1
+                              Store 523 524
+             525:    139(ptr) AccessChain 27(data) 516 65 61
+             526:22(float64_t) CompositeExtract 520 2
+                              Store 525 526
+             527:      6(int) Load 8(invocation)
+             528:    146(ptr) AccessChain 27(data) 65 65
+             529: 23(f64vec4) Load 528
+             530: 23(f64vec4) GroupNonUniformFMax 34 Reduce 529
+             531:    146(ptr) AccessChain 27(data) 527 65
+                              Store 531 530
+             532:      6(int) Load 8(invocation)
+             533:     71(ptr) AccessChain 27(data) 29 38 30
+             534:     19(int) Load 533
+             535:     19(int) GroupNonUniformBitwiseAnd 34 Reduce 534
+             536:     71(ptr) AccessChain 27(data) 532 38 30
+                              Store 536 535
+             537:      6(int) Load 8(invocation)
+             538:     78(ptr) AccessChain 27(data) 38 38
+             539:   20(ivec4) Load 538
+             540:   77(ivec2) VectorShuffle 539 539 0 1
+             541:   77(ivec2) GroupNonUniformBitwiseAnd 34 Reduce 540
+             542:     71(ptr) AccessChain 27(data) 537 38 30
+             543:     19(int) CompositeExtract 541 0
+                              Store 542 543
+             544:     71(ptr) AccessChain 27(data) 537 38 47
+             545:     19(int) CompositeExtract 541 1
+                              Store 544 545
+             546:      6(int) Load 8(invocation)
+             547:     78(ptr) AccessChain 27(data) 51 38
+             548:   20(ivec4) Load 547
+             549:   88(ivec3) VectorShuffle 548 548 0 1 2
+             550:   88(ivec3) GroupNonUniformBitwiseAnd 34 Reduce 549
+             551:     71(ptr) AccessChain 27(data) 546 38 30
+             552:     19(int) CompositeExtract 550 0
+                              Store 551 552
+             553:     71(ptr) AccessChain 27(data) 546 38 47
+             554:     19(int) CompositeExtract 550 1
+                              Store 553 554
+             555:     71(ptr) AccessChain 27(data) 546 38 61
+             556:     19(int) CompositeExtract 550 2
+                              Store 555 556
+             557:      6(int) Load 8(invocation)
+             558:     78(ptr) AccessChain 27(data) 65 38
+             559:   20(ivec4) Load 558
+             560:   20(ivec4) GroupNonUniformBitwiseAnd 34 Reduce 559
+             561:     78(ptr) AccessChain 27(data) 557 38
                               Store 561 560
              562:      6(int) Load 8(invocation)
-             563:     65(ptr) AccessChain 27(data) 29 38 30
-             564:     19(int) Load 563
-             565:     19(int) GroupNonUniformBitwiseOr 34 Reduce 564
-             566:     65(ptr) AccessChain 27(data) 562 38 30
+             563:    105(ptr) AccessChain 27(data) 29 51 30
+             564:      6(int) Load 563
+             565:      6(int) GroupNonUniformBitwiseAnd 34 Reduce 564
+             566:    105(ptr) AccessChain 27(data) 562 51 30
                               Store 566 565
              567:      6(int) Load 8(invocation)
-             568:     72(ptr) AccessChain 27(data) 38 38
-             569:   20(ivec4) Load 568
-             570:   71(ivec2) VectorShuffle 569 569 0 1
-             571:   71(ivec2) GroupNonUniformBitwiseOr 34 Reduce 570
-             572:     72(ptr) AccessChain 27(data) 567 38
-             573:   20(ivec4) Load 572
-             574:   20(ivec4) VectorShuffle 573 571 4 5 2 3
-                              Store 572 574
-             575:      6(int) Load 8(invocation)
-             576:     72(ptr) AccessChain 27(data) 49 38
-             577:   20(ivec4) Load 576
-             578:   81(ivec3) VectorShuffle 577 577 0 1 2
-             579:   81(ivec3) GroupNonUniformBitwiseOr 34 Reduce 578
-             580:     72(ptr) AccessChain 27(data) 575 38
-             581:   20(ivec4) Load 580
-             582:   20(ivec4) VectorShuffle 581 579 4 5 6 3
-                              Store 580 582
-             583:      6(int) Load 8(invocation)
-             584:     72(ptr) AccessChain 27(data) 59 38
-             585:   20(ivec4) Load 584
-             586:   20(ivec4) GroupNonUniformBitwiseOr 34 Reduce 585
-             587:     72(ptr) AccessChain 27(data) 583 38
-                              Store 587 586
-             588:      6(int) Load 8(invocation)
-             589:     95(ptr) AccessChain 27(data) 29 49 30
-             590:      6(int) Load 589
-             591:      6(int) GroupNonUniformBitwiseOr 34 Reduce 590
-             592:     95(ptr) AccessChain 27(data) 588 49 30
-                              Store 592 591
-             593:      6(int) Load 8(invocation)
-             594:    102(ptr) AccessChain 27(data) 38 49
-             595:   21(ivec4) Load 594
-             596:  101(ivec2) VectorShuffle 595 595 0 1
-             597:  101(ivec2) GroupNonUniformBitwiseOr 34 Reduce 596
-             598:    102(ptr) AccessChain 27(data) 593 49
-             599:   21(ivec4) Load 598
-             600:   21(ivec4) VectorShuffle 599 597 4 5 2 3
-                              Store 598 600
-             601:      6(int) Load 8(invocation)
-             602:    102(ptr) AccessChain 27(data) 49 49
-             603:   21(ivec4) Load 602
-             604:  111(ivec3) VectorShuffle 603 603 0 1 2
-             605:  111(ivec3) GroupNonUniformBitwiseOr 34 Reduce 604
-             606:    102(ptr) AccessChain 27(data) 601 49
-             607:   21(ivec4) Load 606
-             608:   21(ivec4) VectorShuffle 607 605 4 5 6 3
-                              Store 606 608
-             609:      6(int) Load 8(invocation)
-             610:    102(ptr) AccessChain 27(data) 59 49
-             611:   21(ivec4) Load 610
-             612:   21(ivec4) GroupNonUniformBitwiseOr 34 Reduce 611
-             613:    102(ptr) AccessChain 27(data) 609 49
-                              Store 613 612
+             568:    112(ptr) AccessChain 27(data) 38 51
+             569:   21(ivec4) Load 568
+             570:  111(ivec2) VectorShuffle 569 569 0 1
+             571:  111(ivec2) GroupNonUniformBitwiseAnd 34 Reduce 570
+             572:    105(ptr) AccessChain 27(data) 567 51 30
+             573:      6(int) CompositeExtract 571 0
+                              Store 572 573
+             574:    105(ptr) AccessChain 27(data) 567 51 47
+             575:      6(int) CompositeExtract 571 1
+                              Store 574 575
+             576:      6(int) Load 8(invocation)
+             577:    112(ptr) AccessChain 27(data) 51 51
+             578:   21(ivec4) Load 577
+             579:  122(ivec3) VectorShuffle 578 578 0 1 2
+             580:  122(ivec3) GroupNonUniformBitwiseAnd 34 Reduce 579
+             581:    105(ptr) AccessChain 27(data) 576 51 30
+             582:      6(int) CompositeExtract 580 0
+                              Store 581 582
+             583:    105(ptr) AccessChain 27(data) 576 51 47
+             584:      6(int) CompositeExtract 580 1
+                              Store 583 584
+             585:    105(ptr) AccessChain 27(data) 576 51 61
+             586:      6(int) CompositeExtract 580 2
+                              Store 585 586
+             587:      6(int) Load 8(invocation)
+             588:    112(ptr) AccessChain 27(data) 65 51
+             589:   21(ivec4) Load 588
+             590:   21(ivec4) GroupNonUniformBitwiseAnd 34 Reduce 589
+             591:    112(ptr) AccessChain 27(data) 587 51
+                              Store 591 590
+             592:      6(int) Load 8(invocation)
+             593:     71(ptr) AccessChain 27(data) 29 38 30
+             594:     19(int) Load 593
+             596:   595(bool) SLessThan 594 29
+             597:   595(bool) GroupNonUniformLogicalAnd 34 Reduce 596
+             598:     19(int) Select 597 38 29
+             599:     71(ptr) AccessChain 27(data) 592 38 30
+                              Store 599 598
+             600:      6(int) Load 8(invocation)
+             601:     78(ptr) AccessChain 27(data) 38 38
+             602:   20(ivec4) Load 601
+             603:   77(ivec2) VectorShuffle 602 602 0 1
+             606:  605(bvec2) SLessThan 603 604
+             607:  605(bvec2) GroupNonUniformLogicalAnd 34 Reduce 606
+             609:   77(ivec2) Select 607 608 604
+             610:     71(ptr) AccessChain 27(data) 600 38 30
+             611:     19(int) CompositeExtract 609 0
+                              Store 610 611
+             612:     71(ptr) AccessChain 27(data) 600 38 47
+             613:     19(int) CompositeExtract 609 1
+                              Store 612 613
              614:      6(int) Load 8(invocation)
-             615:     65(ptr) AccessChain 27(data) 29 38 30
-             616:     19(int) Load 615
-             617:   521(bool) SLessThan 616 29
-             618:   521(bool) GroupNonUniformLogicalOr 34 Reduce 617
-             619:     19(int) Select 618 38 29
-             620:     65(ptr) AccessChain 27(data) 614 38 30
-                              Store 620 619
-             621:      6(int) Load 8(invocation)
-             622:     72(ptr) AccessChain 27(data) 38 38
-             623:   20(ivec4) Load 622
-             624:   71(ivec2) VectorShuffle 623 623 0 1
-             625:  531(bvec2) SLessThan 624 530
-             626:  531(bvec2) GroupNonUniformLogicalOr 34 Reduce 625
-             627:   71(ivec2) Select 626 534 530
-             628:     72(ptr) AccessChain 27(data) 621 38
-             629:   20(ivec4) Load 628
-             630:   20(ivec4) VectorShuffle 629 627 4 5 2 3
-                              Store 628 630
-             631:      6(int) Load 8(invocation)
-             632:     72(ptr) AccessChain 27(data) 38 38
-             633:   20(ivec4) Load 632
-             634:   81(ivec3) VectorShuffle 633 633 0 1 2
-             635:  544(bvec3) SLessThan 634 543
-             636:  544(bvec3) GroupNonUniformLogicalOr 34 Reduce 635
-             637:   81(ivec3) Select 636 547 543
-             638:     72(ptr) AccessChain 27(data) 631 38
-             639:   20(ivec4) Load 638
-             640:   20(ivec4) VectorShuffle 639 637 4 5 6 3
-                              Store 638 640
-             641:      6(int) Load 8(invocation)
-             642:     72(ptr) AccessChain 27(data) 38 38
-             643:   20(ivec4) Load 642
-             644:  556(bvec4) SLessThan 643 555
-             645:  556(bvec4) GroupNonUniformLogicalOr 34 Reduce 644
-             646:   20(ivec4) Select 645 559 555
-             647:     72(ptr) AccessChain 27(data) 641 38
-                              Store 647 646
-             648:      6(int) Load 8(invocation)
-             649:     65(ptr) AccessChain 27(data) 29 38 30
-             650:     19(int) Load 649
-             651:     19(int) GroupNonUniformBitwiseXor 34 Reduce 650
-             652:     65(ptr) AccessChain 27(data) 648 38 30
-                              Store 652 651
-             653:      6(int) Load 8(invocation)
-             654:     72(ptr) AccessChain 27(data) 38 38
-             655:   20(ivec4) Load 654
-             656:   71(ivec2) VectorShuffle 655 655 0 1
-             657:   71(ivec2) GroupNonUniformBitwiseXor 34 Reduce 656
-             658:     72(ptr) AccessChain 27(data) 653 38
-             659:   20(ivec4) Load 658
-             660:   20(ivec4) VectorShuffle 659 657 4 5 2 3
-                              Store 658 660
-             661:      6(int) Load 8(invocation)
-             662:     72(ptr) AccessChain 27(data) 49 38
-             663:   20(ivec4) Load 662
-             664:   81(ivec3) VectorShuffle 663 663 0 1 2
-             665:   81(ivec3) GroupNonUniformBitwiseXor 34 Reduce 664
-             666:     72(ptr) AccessChain 27(data) 661 38
+             615:     78(ptr) AccessChain 27(data) 38 38
+             616:   20(ivec4) Load 615
+             617:   88(ivec3) VectorShuffle 616 616 0 1 2
+             620:  619(bvec3) SLessThan 617 618
+             621:  619(bvec3) GroupNonUniformLogicalAnd 34 Reduce 620
+             623:   88(ivec3) Select 621 622 618
+             624:     71(ptr) AccessChain 27(data) 614 38 30
+             625:     19(int) CompositeExtract 623 0
+                              Store 624 625
+             626:     71(ptr) AccessChain 27(data) 614 38 47
+             627:     19(int) CompositeExtract 623 1
+                              Store 626 627
+             628:     71(ptr) AccessChain 27(data) 614 38 61
+             629:     19(int) CompositeExtract 623 2
+                              Store 628 629
+             630:      6(int) Load 8(invocation)
+             631:     78(ptr) AccessChain 27(data) 38 38
+             632:   20(ivec4) Load 631
+             635:  634(bvec4) SLessThan 632 633
+             636:  634(bvec4) GroupNonUniformLogicalAnd 34 Reduce 635
+             638:   20(ivec4) Select 636 637 633
+             639:     78(ptr) AccessChain 27(data) 630 38
+                              Store 639 638
+             640:      6(int) Load 8(invocation)
+             641:     71(ptr) AccessChain 27(data) 29 38 30
+             642:     19(int) Load 641
+             643:     19(int) GroupNonUniformBitwiseOr 34 Reduce 642
+             644:     71(ptr) AccessChain 27(data) 640 38 30
+                              Store 644 643
+             645:      6(int) Load 8(invocation)
+             646:     78(ptr) AccessChain 27(data) 38 38
+             647:   20(ivec4) Load 646
+             648:   77(ivec2) VectorShuffle 647 647 0 1
+             649:   77(ivec2) GroupNonUniformBitwiseOr 34 Reduce 648
+             650:     71(ptr) AccessChain 27(data) 645 38 30
+             651:     19(int) CompositeExtract 649 0
+                              Store 650 651
+             652:     71(ptr) AccessChain 27(data) 645 38 47
+             653:     19(int) CompositeExtract 649 1
+                              Store 652 653
+             654:      6(int) Load 8(invocation)
+             655:     78(ptr) AccessChain 27(data) 51 38
+             656:   20(ivec4) Load 655
+             657:   88(ivec3) VectorShuffle 656 656 0 1 2
+             658:   88(ivec3) GroupNonUniformBitwiseOr 34 Reduce 657
+             659:     71(ptr) AccessChain 27(data) 654 38 30
+             660:     19(int) CompositeExtract 658 0
+                              Store 659 660
+             661:     71(ptr) AccessChain 27(data) 654 38 47
+             662:     19(int) CompositeExtract 658 1
+                              Store 661 662
+             663:     71(ptr) AccessChain 27(data) 654 38 61
+             664:     19(int) CompositeExtract 658 2
+                              Store 663 664
+             665:      6(int) Load 8(invocation)
+             666:     78(ptr) AccessChain 27(data) 65 38
              667:   20(ivec4) Load 666
-             668:   20(ivec4) VectorShuffle 667 665 4 5 6 3
-                              Store 666 668
-             669:      6(int) Load 8(invocation)
-             670:     72(ptr) AccessChain 27(data) 59 38
-             671:   20(ivec4) Load 670
-             672:   20(ivec4) GroupNonUniformBitwiseXor 34 Reduce 671
-             673:     72(ptr) AccessChain 27(data) 669 38
-                              Store 673 672
-             674:      6(int) Load 8(invocation)
-             675:     95(ptr) AccessChain 27(data) 29 49 30
-             676:      6(int) Load 675
-             677:      6(int) GroupNonUniformBitwiseXor 34 Reduce 676
-             678:     95(ptr) AccessChain 27(data) 674 49 30
-                              Store 678 677
-             679:      6(int) Load 8(invocation)
-             680:    102(ptr) AccessChain 27(data) 38 49
-             681:   21(ivec4) Load 680
-             682:  101(ivec2) VectorShuffle 681 681 0 1
-             683:  101(ivec2) GroupNonUniformBitwiseXor 34 Reduce 682
-             684:    102(ptr) AccessChain 27(data) 679 49
-             685:   21(ivec4) Load 684
-             686:   21(ivec4) VectorShuffle 685 683 4 5 2 3
-                              Store 684 686
-             687:      6(int) Load 8(invocation)
-             688:    102(ptr) AccessChain 27(data) 49 49
-             689:   21(ivec4) Load 688
-             690:  111(ivec3) VectorShuffle 689 689 0 1 2
-             691:  111(ivec3) GroupNonUniformBitwiseXor 34 Reduce 690
-             692:    102(ptr) AccessChain 27(data) 687 49
-             693:   21(ivec4) Load 692
-             694:   21(ivec4) VectorShuffle 693 691 4 5 6 3
-                              Store 692 694
+             668:   20(ivec4) GroupNonUniformBitwiseOr 34 Reduce 667
+             669:     78(ptr) AccessChain 27(data) 665 38
+                              Store 669 668
+             670:      6(int) Load 8(invocation)
+             671:    105(ptr) AccessChain 27(data) 29 51 30
+             672:      6(int) Load 671
+             673:      6(int) GroupNonUniformBitwiseOr 34 Reduce 672
+             674:    105(ptr) AccessChain 27(data) 670 51 30
+                              Store 674 673
+             675:      6(int) Load 8(invocation)
+             676:    112(ptr) AccessChain 27(data) 38 51
+             677:   21(ivec4) Load 676
+             678:  111(ivec2) VectorShuffle 677 677 0 1
+             679:  111(ivec2) GroupNonUniformBitwiseOr 34 Reduce 678
+             680:    105(ptr) AccessChain 27(data) 675 51 30
+             681:      6(int) CompositeExtract 679 0
+                              Store 680 681
+             682:    105(ptr) AccessChain 27(data) 675 51 47
+             683:      6(int) CompositeExtract 679 1
+                              Store 682 683
+             684:      6(int) Load 8(invocation)
+             685:    112(ptr) AccessChain 27(data) 51 51
+             686:   21(ivec4) Load 685
+             687:  122(ivec3) VectorShuffle 686 686 0 1 2
+             688:  122(ivec3) GroupNonUniformBitwiseOr 34 Reduce 687
+             689:    105(ptr) AccessChain 27(data) 684 51 30
+             690:      6(int) CompositeExtract 688 0
+                              Store 689 690
+             691:    105(ptr) AccessChain 27(data) 684 51 47
+             692:      6(int) CompositeExtract 688 1
+                              Store 691 692
+             693:    105(ptr) AccessChain 27(data) 684 51 61
+             694:      6(int) CompositeExtract 688 2
+                              Store 693 694
              695:      6(int) Load 8(invocation)
-             696:    102(ptr) AccessChain 27(data) 59 49
+             696:    112(ptr) AccessChain 27(data) 65 51
              697:   21(ivec4) Load 696
-             698:   21(ivec4) GroupNonUniformBitwiseXor 34 Reduce 697
-             699:    102(ptr) AccessChain 27(data) 695 49
+             698:   21(ivec4) GroupNonUniformBitwiseOr 34 Reduce 697
+             699:    112(ptr) AccessChain 27(data) 695 51
                               Store 699 698
              700:      6(int) Load 8(invocation)
-             701:     65(ptr) AccessChain 27(data) 29 38 30
+             701:     71(ptr) AccessChain 27(data) 29 38 30
              702:     19(int) Load 701
-             703:   521(bool) SLessThan 702 29
-             704:   521(bool) GroupNonUniformLogicalXor 34 Reduce 703
+             703:   595(bool) SLessThan 702 29
+             704:   595(bool) GroupNonUniformLogicalOr 34 Reduce 703
              705:     19(int) Select 704 38 29
-             706:     65(ptr) AccessChain 27(data) 700 38 30
+             706:     71(ptr) AccessChain 27(data) 700 38 30
                               Store 706 705
              707:      6(int) Load 8(invocation)
-             708:     72(ptr) AccessChain 27(data) 38 38
+             708:     78(ptr) AccessChain 27(data) 38 38
              709:   20(ivec4) Load 708
-             710:   71(ivec2) VectorShuffle 709 709 0 1
-             711:  531(bvec2) SLessThan 710 530
-             712:  531(bvec2) GroupNonUniformLogicalXor 34 Reduce 711
-             713:   71(ivec2) Select 712 534 530
-             714:     72(ptr) AccessChain 27(data) 707 38
-             715:   20(ivec4) Load 714
-             716:   20(ivec4) VectorShuffle 715 713 4 5 2 3
-                              Store 714 716
-             717:      6(int) Load 8(invocation)
-             718:     72(ptr) AccessChain 27(data) 38 38
-             719:   20(ivec4) Load 718
-             720:   81(ivec3) VectorShuffle 719 719 0 1 2
-             721:  544(bvec3) SLessThan 720 543
-             722:  544(bvec3) GroupNonUniformLogicalXor 34 Reduce 721
-             723:   81(ivec3) Select 722 547 543
-             724:     72(ptr) AccessChain 27(data) 717 38
-             725:   20(ivec4) Load 724
-             726:   20(ivec4) VectorShuffle 725 723 4 5 6 3
-                              Store 724 726
-             727:      6(int) Load 8(invocation)
-             728:     72(ptr) AccessChain 27(data) 38 38
-             729:   20(ivec4) Load 728
-             730:  556(bvec4) SLessThan 729 555
-             731:  556(bvec4) GroupNonUniformLogicalXor 34 Reduce 730
-             732:   20(ivec4) Select 731 559 555
-             733:     72(ptr) AccessChain 27(data) 727 38
-                              Store 733 732
-             734:      6(int) Load 8(invocation)
-             735:     31(ptr) AccessChain 27(data) 29 29 30
-             736:   17(float) Load 735
-             737:   17(float) GroupNonUniformFAdd 34 InclusiveScan 736
-             738:     31(ptr) AccessChain 27(data) 734 29 30
-                              Store 738 737
-             739:      6(int) Load 8(invocation)
-             740:     40(ptr) AccessChain 27(data) 38 29
-             741:   18(fvec4) Load 740
-             742:   39(fvec2) VectorShuffle 741 741 0 1
-             743:   39(fvec2) GroupNonUniformFAdd 34 InclusiveScan 742
-             744:     40(ptr) AccessChain 27(data) 739 29
-             745:   18(fvec4) Load 744
-             746:   18(fvec4) VectorShuffle 745 743 4 5 2 3
-                              Store 744 746
-             747:      6(int) Load 8(invocation)
-             748:     40(ptr) AccessChain 27(data) 49 29
-             749:   18(fvec4) Load 748
-             750:   50(fvec3) VectorShuffle 749 749 0 1 2
-             751:   50(fvec3) GroupNonUniformFAdd 34 InclusiveScan 750
-             752:     40(ptr) AccessChain 27(data) 747 29
-             753:   18(fvec4) Load 752
-             754:   18(fvec4) VectorShuffle 753 751 4 5 6 3
-                              Store 752 754
-             755:      6(int) Load 8(invocation)
-             756:     40(ptr) AccessChain 27(data) 59 29
-             757:   18(fvec4) Load 756
-             758:   18(fvec4) GroupNonUniformFAdd 34 InclusiveScan 757
-             759:     40(ptr) AccessChain 27(data) 755 29
-                              Store 759 758
-             760:      6(int) Load 8(invocation)
-             761:     65(ptr) AccessChain 27(data) 29 38 30
-             762:     19(int) Load 761
-             763:     19(int) GroupNonUniformIAdd 34 InclusiveScan 762
-             764:     65(ptr) AccessChain 27(data) 760 38 30
-                              Store 764 763
-             765:      6(int) Load 8(invocation)
-             766:     72(ptr) AccessChain 27(data) 38 38
-             767:   20(ivec4) Load 766
-             768:   71(ivec2) VectorShuffle 767 767 0 1
-             769:   71(ivec2) GroupNonUniformIAdd 34 InclusiveScan 768
-             770:     72(ptr) AccessChain 27(data) 765 38
-             771:   20(ivec4) Load 770
-             772:   20(ivec4) VectorShuffle 771 769 4 5 2 3
-                              Store 770 772
+             710:   77(ivec2) VectorShuffle 709 709 0 1
+             711:  605(bvec2) SLessThan 710 604
+             712:  605(bvec2) GroupNonUniformLogicalOr 34 Reduce 711
+             713:   77(ivec2) Select 712 608 604
+             714:     71(ptr) AccessChain 27(data) 707 38 30
+             715:     19(int) CompositeExtract 713 0
+                              Store 714 715
+             716:     71(ptr) AccessChain 27(data) 707 38 47
+             717:     19(int) CompositeExtract 713 1
+                              Store 716 717
+             718:      6(int) Load 8(invocation)
+             719:     78(ptr) AccessChain 27(data) 38 38
+             720:   20(ivec4) Load 719
+             721:   88(ivec3) VectorShuffle 720 720 0 1 2
+             722:  619(bvec3) SLessThan 721 618
+             723:  619(bvec3) GroupNonUniformLogicalOr 34 Reduce 722
+             724:   88(ivec3) Select 723 622 618
+             725:     71(ptr) AccessChain 27(data) 718 38 30
+             726:     19(int) CompositeExtract 724 0
+                              Store 725 726
+             727:     71(ptr) AccessChain 27(data) 718 38 47
+             728:     19(int) CompositeExtract 724 1
+                              Store 727 728
+             729:     71(ptr) AccessChain 27(data) 718 38 61
+             730:     19(int) CompositeExtract 724 2
+                              Store 729 730
+             731:      6(int) Load 8(invocation)
+             732:     78(ptr) AccessChain 27(data) 38 38
+             733:   20(ivec4) Load 732
+             734:  634(bvec4) SLessThan 733 633
+             735:  634(bvec4) GroupNonUniformLogicalOr 34 Reduce 734
+             736:   20(ivec4) Select 735 637 633
+             737:     78(ptr) AccessChain 27(data) 731 38
+                              Store 737 736
+             738:      6(int) Load 8(invocation)
+             739:     71(ptr) AccessChain 27(data) 29 38 30
+             740:     19(int) Load 739
+             741:     19(int) GroupNonUniformBitwiseXor 34 Reduce 740
+             742:     71(ptr) AccessChain 27(data) 738 38 30
+                              Store 742 741
+             743:      6(int) Load 8(invocation)
+             744:     78(ptr) AccessChain 27(data) 38 38
+             745:   20(ivec4) Load 744
+             746:   77(ivec2) VectorShuffle 745 745 0 1
+             747:   77(ivec2) GroupNonUniformBitwiseXor 34 Reduce 746
+             748:     71(ptr) AccessChain 27(data) 743 38 30
+             749:     19(int) CompositeExtract 747 0
+                              Store 748 749
+             750:     71(ptr) AccessChain 27(data) 743 38 47
+             751:     19(int) CompositeExtract 747 1
+                              Store 750 751
+             752:      6(int) Load 8(invocation)
+             753:     78(ptr) AccessChain 27(data) 51 38
+             754:   20(ivec4) Load 753
+             755:   88(ivec3) VectorShuffle 754 754 0 1 2
+             756:   88(ivec3) GroupNonUniformBitwiseXor 34 Reduce 755
+             757:     71(ptr) AccessChain 27(data) 752 38 30
+             758:     19(int) CompositeExtract 756 0
+                              Store 757 758
+             759:     71(ptr) AccessChain 27(data) 752 38 47
+             760:     19(int) CompositeExtract 756 1
+                              Store 759 760
+             761:     71(ptr) AccessChain 27(data) 752 38 61
+             762:     19(int) CompositeExtract 756 2
+                              Store 761 762
+             763:      6(int) Load 8(invocation)
+             764:     78(ptr) AccessChain 27(data) 65 38
+             765:   20(ivec4) Load 764
+             766:   20(ivec4) GroupNonUniformBitwiseXor 34 Reduce 765
+             767:     78(ptr) AccessChain 27(data) 763 38
+                              Store 767 766
+             768:      6(int) Load 8(invocation)
+             769:    105(ptr) AccessChain 27(data) 29 51 30
+             770:      6(int) Load 769
+             771:      6(int) GroupNonUniformBitwiseXor 34 Reduce 770
+             772:    105(ptr) AccessChain 27(data) 768 51 30
+                              Store 772 771
              773:      6(int) Load 8(invocation)
-             774:     72(ptr) AccessChain 27(data) 49 38
-             775:   20(ivec4) Load 774
-             776:   81(ivec3) VectorShuffle 775 775 0 1 2
-             777:   81(ivec3) GroupNonUniformIAdd 34 InclusiveScan 776
-             778:     72(ptr) AccessChain 27(data) 773 38
-             779:   20(ivec4) Load 778
-             780:   20(ivec4) VectorShuffle 779 777 4 5 6 3
-                              Store 778 780
-             781:      6(int) Load 8(invocation)
-             782:     72(ptr) AccessChain 27(data) 59 38
-             783:   20(ivec4) Load 782
-             784:   20(ivec4) GroupNonUniformIAdd 34 InclusiveScan 783
-             785:     72(ptr) AccessChain 27(data) 781 38
-                              Store 785 784
-             786:      6(int) Load 8(invocation)
-             787:     95(ptr) AccessChain 27(data) 29 49 30
-             788:      6(int) Load 787
-             789:      6(int) GroupNonUniformIAdd 34 InclusiveScan 788
-             790:     95(ptr) AccessChain 27(data) 786 49 30
-                              Store 790 789
-             791:      6(int) Load 8(invocation)
-             792:    102(ptr) AccessChain 27(data) 38 49
-             793:   21(ivec4) Load 792
-             794:  101(ivec2) VectorShuffle 793 793 0 1
-             795:  101(ivec2) GroupNonUniformIAdd 34 InclusiveScan 794
-             796:    102(ptr) AccessChain 27(data) 791 49
-             797:   21(ivec4) Load 796
-             798:   21(ivec4) VectorShuffle 797 795 4 5 2 3
-                              Store 796 798
-             799:      6(int) Load 8(invocation)
-             800:    102(ptr) AccessChain 27(data) 49 49
-             801:   21(ivec4) Load 800
-             802:  111(ivec3) VectorShuffle 801 801 0 1 2
-             803:  111(ivec3) GroupNonUniformIAdd 34 InclusiveScan 802
-             804:    102(ptr) AccessChain 27(data) 799 49
-             805:   21(ivec4) Load 804
-             806:   21(ivec4) VectorShuffle 805 803 4 5 6 3
-                              Store 804 806
-             807:      6(int) Load 8(invocation)
-             808:    102(ptr) AccessChain 27(data) 59 49
-             809:   21(ivec4) Load 808
-             810:   21(ivec4) GroupNonUniformIAdd 34 InclusiveScan 809
-             811:    102(ptr) AccessChain 27(data) 807 49
-                              Store 811 810
-             812:      6(int) Load 8(invocation)
-             813:    125(ptr) AccessChain 27(data) 29 59 30
-             814:22(float64_t) Load 813
-             815:22(float64_t) GroupNonUniformFAdd 34 InclusiveScan 814
-             816:    125(ptr) AccessChain 27(data) 812 59 30
-                              Store 816 815
-             817:      6(int) Load 8(invocation)
-             818:    132(ptr) AccessChain 27(data) 38 59
-             819: 23(f64vec4) Load 818
-             820:131(f64vec2) VectorShuffle 819 819 0 1
-             821:131(f64vec2) GroupNonUniformFAdd 34 InclusiveScan 820
-             822:    132(ptr) AccessChain 27(data) 817 59
-             823: 23(f64vec4) Load 822
-             824: 23(f64vec4) VectorShuffle 823 821 4 5 2 3
-                              Store 822 824
-             825:      6(int) Load 8(invocation)
-             826:    132(ptr) AccessChain 27(data) 49 59
-             827: 23(f64vec4) Load 826
-             828:141(f64vec3) VectorShuffle 827 827 0 1 2
-             829:141(f64vec3) GroupNonUniformFAdd 34 InclusiveScan 828
-             830:    132(ptr) AccessChain 27(data) 825 59
-             831: 23(f64vec4) Load 830
-             832: 23(f64vec4) VectorShuffle 831 829 4 5 6 3
-                              Store 830 832
-             833:      6(int) Load 8(invocation)
-             834:    132(ptr) AccessChain 27(data) 59 59
-             835: 23(f64vec4) Load 834
-             836: 23(f64vec4) GroupNonUniformFAdd 34 InclusiveScan 835
-             837:    132(ptr) AccessChain 27(data) 833 59
-                              Store 837 836
-             838:      6(int) Load 8(invocation)
-             839:     31(ptr) AccessChain 27(data) 29 29 30
-             840:   17(float) Load 839
-             841:   17(float) GroupNonUniformFMul 34 InclusiveScan 840
-             842:     31(ptr) AccessChain 27(data) 838 29 30
-                              Store 842 841
-             843:      6(int) Load 8(invocation)
-             844:     40(ptr) AccessChain 27(data) 38 29
-             845:   18(fvec4) Load 844
-             846:   39(fvec2) VectorShuffle 845 845 0 1
-             847:   39(fvec2) GroupNonUniformFMul 34 InclusiveScan 846
-             848:     40(ptr) AccessChain 27(data) 843 29
-             849:   18(fvec4) Load 848
-             850:   18(fvec4) VectorShuffle 849 847 4 5 2 3
-                              Store 848 850
-             851:      6(int) Load 8(invocation)
-             852:     40(ptr) AccessChain 27(data) 49 29
-             853:   18(fvec4) Load 852
-             854:   50(fvec3) VectorShuffle 853 853 0 1 2
-             855:   50(fvec3) GroupNonUniformFMul 34 InclusiveScan 854
-             856:     40(ptr) AccessChain 27(data) 851 29
-             857:   18(fvec4) Load 856
-             858:   18(fvec4) VectorShuffle 857 855 4 5 6 3
-                              Store 856 858
-             859:      6(int) Load 8(invocation)
-             860:     40(ptr) AccessChain 27(data) 59 29
-             861:   18(fvec4) Load 860
-             862:   18(fvec4) GroupNonUniformFMul 34 InclusiveScan 861
-             863:     40(ptr) AccessChain 27(data) 859 29
-                              Store 863 862
-             864:      6(int) Load 8(invocation)
-             865:     65(ptr) AccessChain 27(data) 29 38 30
-             866:     19(int) Load 865
-             867:     19(int) GroupNonUniformIMul 34 InclusiveScan 866
-             868:     65(ptr) AccessChain 27(data) 864 38 30
-                              Store 868 867
-             869:      6(int) Load 8(invocation)
-             870:     72(ptr) AccessChain 27(data) 38 38
-             871:   20(ivec4) Load 870
-             872:   71(ivec2) VectorShuffle 871 871 0 1
-             873:   71(ivec2) GroupNonUniformIMul 34 InclusiveScan 872
-             874:     72(ptr) AccessChain 27(data) 869 38
-             875:   20(ivec4) Load 874
-             876:   20(ivec4) VectorShuffle 875 873 4 5 2 3
-                              Store 874 876
-             877:      6(int) Load 8(invocation)
-             878:     72(ptr) AccessChain 27(data) 49 38
-             879:   20(ivec4) Load 878
-             880:   81(ivec3) VectorShuffle 879 879 0 1 2
-             881:   81(ivec3) GroupNonUniformIMul 34 InclusiveScan 880
-             882:     72(ptr) AccessChain 27(data) 877 38
-             883:   20(ivec4) Load 882
-             884:   20(ivec4) VectorShuffle 883 881 4 5 6 3
-                              Store 882 884
-             885:      6(int) Load 8(invocation)
-             886:     72(ptr) AccessChain 27(data) 59 38
-             887:   20(ivec4) Load 886
-             888:   20(ivec4) GroupNonUniformIMul 34 InclusiveScan 887
-             889:     72(ptr) AccessChain 27(data) 885 38
-                              Store 889 888
-             890:      6(int) Load 8(invocation)
-             891:     95(ptr) AccessChain 27(data) 29 49 30
-             892:      6(int) Load 891
-             893:      6(int) GroupNonUniformIMul 34 InclusiveScan 892
-             894:     95(ptr) AccessChain 27(data) 890 49 30
-                              Store 894 893
-             895:      6(int) Load 8(invocation)
-             896:    102(ptr) AccessChain 27(data) 38 49
-             897:   21(ivec4) Load 896
-             898:  101(ivec2) VectorShuffle 897 897 0 1
-             899:  101(ivec2) GroupNonUniformIMul 34 InclusiveScan 898
-             900:    102(ptr) AccessChain 27(data) 895 49
-             901:   21(ivec4) Load 900
-             902:   21(ivec4) VectorShuffle 901 899 4 5 2 3
-                              Store 900 902
-             903:      6(int) Load 8(invocation)
-             904:    102(ptr) AccessChain 27(data) 49 49
-             905:   21(ivec4) Load 904
-             906:  111(ivec3) VectorShuffle 905 905 0 1 2
-             907:  111(ivec3) GroupNonUniformIMul 34 InclusiveScan 906
-             908:    102(ptr) AccessChain 27(data) 903 49
-             909:   21(ivec4) Load 908
-             910:   21(ivec4) VectorShuffle 909 907 4 5 6 3
-                              Store 908 910
-             911:      6(int) Load 8(invocation)
-             912:    102(ptr) AccessChain 27(data) 59 49
-             913:   21(ivec4) Load 912
-             914:   21(ivec4) GroupNonUniformIMul 34 InclusiveScan 913
-             915:    102(ptr) AccessChain 27(data) 911 49
-                              Store 915 914
-             916:      6(int) Load 8(invocation)
-             917:    125(ptr) AccessChain 27(data) 29 59 30
-             918:22(float64_t) Load 917
-             919:22(float64_t) GroupNonUniformFMul 34 InclusiveScan 918
-             920:    125(ptr) AccessChain 27(data) 916 59 30
-                              Store 920 919
+             774:    112(ptr) AccessChain 27(data) 38 51
+             775:   21(ivec4) Load 774
+             776:  111(ivec2) VectorShuffle 775 775 0 1
+             777:  111(ivec2) GroupNonUniformBitwiseXor 34 Reduce 776
+             778:    105(ptr) AccessChain 27(data) 773 51 30
+             779:      6(int) CompositeExtract 777 0
+                              Store 778 779
+             780:    105(ptr) AccessChain 27(data) 773 51 47
+             781:      6(int) CompositeExtract 777 1
+                              Store 780 781
+             782:      6(int) Load 8(invocation)
+             783:    112(ptr) AccessChain 27(data) 51 51
+             784:   21(ivec4) Load 783
+             785:  122(ivec3) VectorShuffle 784 784 0 1 2
+             786:  122(ivec3) GroupNonUniformBitwiseXor 34 Reduce 785
+             787:    105(ptr) AccessChain 27(data) 782 51 30
+             788:      6(int) CompositeExtract 786 0
+                              Store 787 788
+             789:    105(ptr) AccessChain 27(data) 782 51 47
+             790:      6(int) CompositeExtract 786 1
+                              Store 789 790
+             791:    105(ptr) AccessChain 27(data) 782 51 61
+             792:      6(int) CompositeExtract 786 2
+                              Store 791 792
+             793:      6(int) Load 8(invocation)
+             794:    112(ptr) AccessChain 27(data) 65 51
+             795:   21(ivec4) Load 794
+             796:   21(ivec4) GroupNonUniformBitwiseXor 34 Reduce 795
+             797:    112(ptr) AccessChain 27(data) 793 51
+                              Store 797 796
+             798:      6(int) Load 8(invocation)
+             799:     71(ptr) AccessChain 27(data) 29 38 30
+             800:     19(int) Load 799
+             801:   595(bool) SLessThan 800 29
+             802:   595(bool) GroupNonUniformLogicalXor 34 Reduce 801
+             803:     19(int) Select 802 38 29
+             804:     71(ptr) AccessChain 27(data) 798 38 30
+                              Store 804 803
+             805:      6(int) Load 8(invocation)
+             806:     78(ptr) AccessChain 27(data) 38 38
+             807:   20(ivec4) Load 806
+             808:   77(ivec2) VectorShuffle 807 807 0 1
+             809:  605(bvec2) SLessThan 808 604
+             810:  605(bvec2) GroupNonUniformLogicalXor 34 Reduce 809
+             811:   77(ivec2) Select 810 608 604
+             812:     71(ptr) AccessChain 27(data) 805 38 30
+             813:     19(int) CompositeExtract 811 0
+                              Store 812 813
+             814:     71(ptr) AccessChain 27(data) 805 38 47
+             815:     19(int) CompositeExtract 811 1
+                              Store 814 815
+             816:      6(int) Load 8(invocation)
+             817:     78(ptr) AccessChain 27(data) 38 38
+             818:   20(ivec4) Load 817
+             819:   88(ivec3) VectorShuffle 818 818 0 1 2
+             820:  619(bvec3) SLessThan 819 618
+             821:  619(bvec3) GroupNonUniformLogicalXor 34 Reduce 820
+             822:   88(ivec3) Select 821 622 618
+             823:     71(ptr) AccessChain 27(data) 816 38 30
+             824:     19(int) CompositeExtract 822 0
+                              Store 823 824
+             825:     71(ptr) AccessChain 27(data) 816 38 47
+             826:     19(int) CompositeExtract 822 1
+                              Store 825 826
+             827:     71(ptr) AccessChain 27(data) 816 38 61
+             828:     19(int) CompositeExtract 822 2
+                              Store 827 828
+             829:      6(int) Load 8(invocation)
+             830:     78(ptr) AccessChain 27(data) 38 38
+             831:   20(ivec4) Load 830
+             832:  634(bvec4) SLessThan 831 633
+             833:  634(bvec4) GroupNonUniformLogicalXor 34 Reduce 832
+             834:   20(ivec4) Select 833 637 633
+             835:     78(ptr) AccessChain 27(data) 829 38
+                              Store 835 834
+             836:      6(int) Load 8(invocation)
+             837:     31(ptr) AccessChain 27(data) 29 29 30
+             838:   17(float) Load 837
+             839:   17(float) GroupNonUniformFAdd 34 InclusiveScan 838
+             840:     31(ptr) AccessChain 27(data) 836 29 30
+                              Store 840 839
+             841:      6(int) Load 8(invocation)
+             842:     40(ptr) AccessChain 27(data) 38 29
+             843:   18(fvec4) Load 842
+             844:   39(fvec2) VectorShuffle 843 843 0 1
+             845:   39(fvec2) GroupNonUniformFAdd 34 InclusiveScan 844
+             846:     31(ptr) AccessChain 27(data) 841 29 30
+             847:   17(float) CompositeExtract 845 0
+                              Store 846 847
+             848:     31(ptr) AccessChain 27(data) 841 29 47
+             849:   17(float) CompositeExtract 845 1
+                              Store 848 849
+             850:      6(int) Load 8(invocation)
+             851:     40(ptr) AccessChain 27(data) 51 29
+             852:   18(fvec4) Load 851
+             853:   52(fvec3) VectorShuffle 852 852 0 1 2
+             854:   52(fvec3) GroupNonUniformFAdd 34 InclusiveScan 853
+             855:     31(ptr) AccessChain 27(data) 850 29 30
+             856:   17(float) CompositeExtract 854 0
+                              Store 855 856
+             857:     31(ptr) AccessChain 27(data) 850 29 47
+             858:   17(float) CompositeExtract 854 1
+                              Store 857 858
+             859:     31(ptr) AccessChain 27(data) 850 29 61
+             860:   17(float) CompositeExtract 854 2
+                              Store 859 860
+             861:      6(int) Load 8(invocation)
+             862:     40(ptr) AccessChain 27(data) 65 29
+             863:   18(fvec4) Load 862
+             864:   18(fvec4) GroupNonUniformFAdd 34 InclusiveScan 863
+             865:     40(ptr) AccessChain 27(data) 861 29
+                              Store 865 864
+             866:      6(int) Load 8(invocation)
+             867:     71(ptr) AccessChain 27(data) 29 38 30
+             868:     19(int) Load 867
+             869:     19(int) GroupNonUniformIAdd 34 InclusiveScan 868
+             870:     71(ptr) AccessChain 27(data) 866 38 30
+                              Store 870 869
+             871:      6(int) Load 8(invocation)
+             872:     78(ptr) AccessChain 27(data) 38 38
+             873:   20(ivec4) Load 872
+             874:   77(ivec2) VectorShuffle 873 873 0 1
+             875:   77(ivec2) GroupNonUniformIAdd 34 InclusiveScan 874
+             876:     71(ptr) AccessChain 27(data) 871 38 30
+             877:     19(int) CompositeExtract 875 0
+                              Store 876 877
+             878:     71(ptr) AccessChain 27(data) 871 38 47
+             879:     19(int) CompositeExtract 875 1
+                              Store 878 879
+             880:      6(int) Load 8(invocation)
+             881:     78(ptr) AccessChain 27(data) 51 38
+             882:   20(ivec4) Load 881
+             883:   88(ivec3) VectorShuffle 882 882 0 1 2
+             884:   88(ivec3) GroupNonUniformIAdd 34 InclusiveScan 883
+             885:     71(ptr) AccessChain 27(data) 880 38 30
+             886:     19(int) CompositeExtract 884 0
+                              Store 885 886
+             887:     71(ptr) AccessChain 27(data) 880 38 47
+             888:     19(int) CompositeExtract 884 1
+                              Store 887 888
+             889:     71(ptr) AccessChain 27(data) 880 38 61
+             890:     19(int) CompositeExtract 884 2
+                              Store 889 890
+             891:      6(int) Load 8(invocation)
+             892:     78(ptr) AccessChain 27(data) 65 38
+             893:   20(ivec4) Load 892
+             894:   20(ivec4) GroupNonUniformIAdd 34 InclusiveScan 893
+             895:     78(ptr) AccessChain 27(data) 891 38
+                              Store 895 894
+             896:      6(int) Load 8(invocation)
+             897:    105(ptr) AccessChain 27(data) 29 51 30
+             898:      6(int) Load 897
+             899:      6(int) GroupNonUniformIAdd 34 InclusiveScan 898
+             900:    105(ptr) AccessChain 27(data) 896 51 30
+                              Store 900 899
+             901:      6(int) Load 8(invocation)
+             902:    112(ptr) AccessChain 27(data) 38 51
+             903:   21(ivec4) Load 902
+             904:  111(ivec2) VectorShuffle 903 903 0 1
+             905:  111(ivec2) GroupNonUniformIAdd 34 InclusiveScan 904
+             906:    105(ptr) AccessChain 27(data) 901 51 30
+             907:      6(int) CompositeExtract 905 0
+                              Store 906 907
+             908:    105(ptr) AccessChain 27(data) 901 51 47
+             909:      6(int) CompositeExtract 905 1
+                              Store 908 909
+             910:      6(int) Load 8(invocation)
+             911:    112(ptr) AccessChain 27(data) 51 51
+             912:   21(ivec4) Load 911
+             913:  122(ivec3) VectorShuffle 912 912 0 1 2
+             914:  122(ivec3) GroupNonUniformIAdd 34 InclusiveScan 913
+             915:    105(ptr) AccessChain 27(data) 910 51 30
+             916:      6(int) CompositeExtract 914 0
+                              Store 915 916
+             917:    105(ptr) AccessChain 27(data) 910 51 47
+             918:      6(int) CompositeExtract 914 1
+                              Store 917 918
+             919:    105(ptr) AccessChain 27(data) 910 51 61
+             920:      6(int) CompositeExtract 914 2
+                              Store 919 920
              921:      6(int) Load 8(invocation)
-             922:    132(ptr) AccessChain 27(data) 38 59
-             923: 23(f64vec4) Load 922
-             924:131(f64vec2) VectorShuffle 923 923 0 1
-             925:131(f64vec2) GroupNonUniformFMul 34 InclusiveScan 924
-             926:    132(ptr) AccessChain 27(data) 921 59
-             927: 23(f64vec4) Load 926
-             928: 23(f64vec4) VectorShuffle 927 925 4 5 2 3
-                              Store 926 928
-             929:      6(int) Load 8(invocation)
-             930:    132(ptr) AccessChain 27(data) 49 59
-             931: 23(f64vec4) Load 930
-             932:141(f64vec3) VectorShuffle 931 931 0 1 2
-             933:141(f64vec3) GroupNonUniformFMul 34 InclusiveScan 932
-             934:    132(ptr) AccessChain 27(data) 929 59
-             935: 23(f64vec4) Load 934
-             936: 23(f64vec4) VectorShuffle 935 933 4 5 6 3
-                              Store 934 936
-             937:      6(int) Load 8(invocation)
-             938:    132(ptr) AccessChain 27(data) 59 59
-             939: 23(f64vec4) Load 938
-             940: 23(f64vec4) GroupNonUniformFMul 34 InclusiveScan 939
-             941:    132(ptr) AccessChain 27(data) 937 59
-                              Store 941 940
-             942:      6(int) Load 8(invocation)
-             943:     31(ptr) AccessChain 27(data) 29 29 30
-             944:   17(float) Load 943
-             945:   17(float) GroupNonUniformFMin 34 InclusiveScan 944
-             946:     31(ptr) AccessChain 27(data) 942 29 30
-                              Store 946 945
-             947:      6(int) Load 8(invocation)
-             948:     40(ptr) AccessChain 27(data) 38 29
-             949:   18(fvec4) Load 948
-             950:   39(fvec2) VectorShuffle 949 949 0 1
-             951:   39(fvec2) GroupNonUniformFMin 34 InclusiveScan 950
-             952:     40(ptr) AccessChain 27(data) 947 29
-             953:   18(fvec4) Load 952
-             954:   18(fvec4) VectorShuffle 953 951 4 5 2 3
-                              Store 952 954
-             955:      6(int) Load 8(invocation)
-             956:     40(ptr) AccessChain 27(data) 49 29
-             957:   18(fvec4) Load 956
-             958:   50(fvec3) VectorShuffle 957 957 0 1 2
-             959:   50(fvec3) GroupNonUniformFMin 34 InclusiveScan 958
-             960:     40(ptr) AccessChain 27(data) 955 29
-             961:   18(fvec4) Load 960
-             962:   18(fvec4) VectorShuffle 961 959 4 5 6 3
-                              Store 960 962
-             963:      6(int) Load 8(invocation)
-             964:     40(ptr) AccessChain 27(data) 59 29
-             965:   18(fvec4) Load 964
-             966:   18(fvec4) GroupNonUniformFMin 34 InclusiveScan 965
-             967:     40(ptr) AccessChain 27(data) 963 29
-                              Store 967 966
-             968:      6(int) Load 8(invocation)
-             969:     65(ptr) AccessChain 27(data) 29 38 30
-             970:     19(int) Load 969
-             971:     19(int) GroupNonUniformSMin 34 InclusiveScan 970
-             972:     65(ptr) AccessChain 27(data) 968 38 30
-                              Store 972 971
-             973:      6(int) Load 8(invocation)
-             974:     72(ptr) AccessChain 27(data) 38 38
-             975:   20(ivec4) Load 974
-             976:   71(ivec2) VectorShuffle 975 975 0 1
-             977:   71(ivec2) GroupNonUniformSMin 34 InclusiveScan 976
-             978:     72(ptr) AccessChain 27(data) 973 38
-             979:   20(ivec4) Load 978
-             980:   20(ivec4) VectorShuffle 979 977 4 5 2 3
-                              Store 978 980
+             922:    112(ptr) AccessChain 27(data) 65 51
+             923:   21(ivec4) Load 922
+             924:   21(ivec4) GroupNonUniformIAdd 34 InclusiveScan 923
+             925:    112(ptr) AccessChain 27(data) 921 51
+                              Store 925 924
+             926:      6(int) Load 8(invocation)
+             927:    139(ptr) AccessChain 27(data) 29 65 30
+             928:22(float64_t) Load 927
+             929:22(float64_t) GroupNonUniformFAdd 34 InclusiveScan 928
+             930:    139(ptr) AccessChain 27(data) 926 65 30
+                              Store 930 929
+             931:      6(int) Load 8(invocation)
+             932:    146(ptr) AccessChain 27(data) 38 65
+             933: 23(f64vec4) Load 932
+             934:145(f64vec2) VectorShuffle 933 933 0 1
+             935:145(f64vec2) GroupNonUniformFAdd 34 InclusiveScan 934
+             936:    139(ptr) AccessChain 27(data) 931 65 30
+             937:22(float64_t) CompositeExtract 935 0
+                              Store 936 937
+             938:    139(ptr) AccessChain 27(data) 931 65 47
+             939:22(float64_t) CompositeExtract 935 1
+                              Store 938 939
+             940:      6(int) Load 8(invocation)
+             941:    146(ptr) AccessChain 27(data) 51 65
+             942: 23(f64vec4) Load 941
+             943:156(f64vec3) VectorShuffle 942 942 0 1 2
+             944:156(f64vec3) GroupNonUniformFAdd 34 InclusiveScan 943
+             945:    139(ptr) AccessChain 27(data) 940 65 30
+             946:22(float64_t) CompositeExtract 944 0
+                              Store 945 946
+             947:    139(ptr) AccessChain 27(data) 940 65 47
+             948:22(float64_t) CompositeExtract 944 1
+                              Store 947 948
+             949:    139(ptr) AccessChain 27(data) 940 65 61
+             950:22(float64_t) CompositeExtract 944 2
+                              Store 949 950
+             951:      6(int) Load 8(invocation)
+             952:    146(ptr) AccessChain 27(data) 65 65
+             953: 23(f64vec4) Load 952
+             954: 23(f64vec4) GroupNonUniformFAdd 34 InclusiveScan 953
+             955:    146(ptr) AccessChain 27(data) 951 65
+                              Store 955 954
+             956:      6(int) Load 8(invocation)
+             957:     31(ptr) AccessChain 27(data) 29 29 30
+             958:   17(float) Load 957
+             959:   17(float) GroupNonUniformFMul 34 InclusiveScan 958
+             960:     31(ptr) AccessChain 27(data) 956 29 30
+                              Store 960 959
+             961:      6(int) Load 8(invocation)
+             962:     40(ptr) AccessChain 27(data) 38 29
+             963:   18(fvec4) Load 962
+             964:   39(fvec2) VectorShuffle 963 963 0 1
+             965:   39(fvec2) GroupNonUniformFMul 34 InclusiveScan 964
+             966:     31(ptr) AccessChain 27(data) 961 29 30
+             967:   17(float) CompositeExtract 965 0
+                              Store 966 967
+             968:     31(ptr) AccessChain 27(data) 961 29 47
+             969:   17(float) CompositeExtract 965 1
+                              Store 968 969
+             970:      6(int) Load 8(invocation)
+             971:     40(ptr) AccessChain 27(data) 51 29
+             972:   18(fvec4) Load 971
+             973:   52(fvec3) VectorShuffle 972 972 0 1 2
+             974:   52(fvec3) GroupNonUniformFMul 34 InclusiveScan 973
+             975:     31(ptr) AccessChain 27(data) 970 29 30
+             976:   17(float) CompositeExtract 974 0
+                              Store 975 976
+             977:     31(ptr) AccessChain 27(data) 970 29 47
+             978:   17(float) CompositeExtract 974 1
+                              Store 977 978
+             979:     31(ptr) AccessChain 27(data) 970 29 61
+             980:   17(float) CompositeExtract 974 2
+                              Store 979 980
              981:      6(int) Load 8(invocation)
-             982:     72(ptr) AccessChain 27(data) 49 38
-             983:   20(ivec4) Load 982
-             984:   81(ivec3) VectorShuffle 983 983 0 1 2
-             985:   81(ivec3) GroupNonUniformSMin 34 InclusiveScan 984
-             986:     72(ptr) AccessChain 27(data) 981 38
-             987:   20(ivec4) Load 986
-             988:   20(ivec4) VectorShuffle 987 985 4 5 6 3
-                              Store 986 988
-             989:      6(int) Load 8(invocation)
-             990:     72(ptr) AccessChain 27(data) 59 38
-             991:   20(ivec4) Load 990
-             992:   20(ivec4) GroupNonUniformSMin 34 InclusiveScan 991
-             993:     72(ptr) AccessChain 27(data) 989 38
-                              Store 993 992
-             994:      6(int) Load 8(invocation)
-             995:     95(ptr) AccessChain 27(data) 29 49 30
-             996:      6(int) Load 995
-             997:      6(int) GroupNonUniformUMin 34 InclusiveScan 996
-             998:     95(ptr) AccessChain 27(data) 994 49 30
-                              Store 998 997
-             999:      6(int) Load 8(invocation)
-            1000:    102(ptr) AccessChain 27(data) 38 49
-            1001:   21(ivec4) Load 1000
-            1002:  101(ivec2) VectorShuffle 1001 1001 0 1
-            1003:  101(ivec2) GroupNonUniformUMin 34 InclusiveScan 1002
-            1004:    102(ptr) AccessChain 27(data) 999 49
-            1005:   21(ivec4) Load 1004
-            1006:   21(ivec4) VectorShuffle 1005 1003 4 5 2 3
-                              Store 1004 1006
-            1007:      6(int) Load 8(invocation)
-            1008:    102(ptr) AccessChain 27(data) 49 49
-            1009:   21(ivec4) Load 1008
-            1010:  111(ivec3) VectorShuffle 1009 1009 0 1 2
-            1011:  111(ivec3) GroupNonUniformUMin 34 InclusiveScan 1010
-            1012:    102(ptr) AccessChain 27(data) 1007 49
-            1013:   21(ivec4) Load 1012
-            1014:   21(ivec4) VectorShuffle 1013 1011 4 5 6 3
-                              Store 1012 1014
-            1015:      6(int) Load 8(invocation)
-            1016:    102(ptr) AccessChain 27(data) 59 49
-            1017:   21(ivec4) Load 1016
-            1018:   21(ivec4) GroupNonUniformUMin 34 InclusiveScan 1017
-            1019:    102(ptr) AccessChain 27(data) 1015 49
-                              Store 1019 1018
-            1020:      6(int) Load 8(invocation)
-            1021:    125(ptr) AccessChain 27(data) 29 59 30
-            1022:22(float64_t) Load 1021
-            1023:22(float64_t) GroupNonUniformFMin 34 InclusiveScan 1022
-            1024:    125(ptr) AccessChain 27(data) 1020 59 30
-                              Store 1024 1023
-            1025:      6(int) Load 8(invocation)
-            1026:    132(ptr) AccessChain 27(data) 38 59
-            1027: 23(f64vec4) Load 1026
-            1028:131(f64vec2) VectorShuffle 1027 1027 0 1
-            1029:131(f64vec2) GroupNonUniformFMin 34 InclusiveScan 1028
-            1030:    132(ptr) AccessChain 27(data) 1025 59
-            1031: 23(f64vec4) Load 1030
-            1032: 23(f64vec4) VectorShuffle 1031 1029 4 5 2 3
-                              Store 1030 1032
-            1033:      6(int) Load 8(invocation)
-            1034:    132(ptr) AccessChain 27(data) 49 59
-            1035: 23(f64vec4) Load 1034
-            1036:141(f64vec3) VectorShuffle 1035 1035 0 1 2
-            1037:141(f64vec3) GroupNonUniformFMin 34 InclusiveScan 1036
-            1038:    132(ptr) AccessChain 27(data) 1033 59
-            1039: 23(f64vec4) Load 1038
-            1040: 23(f64vec4) VectorShuffle 1039 1037 4 5 6 3
-                              Store 1038 1040
+             982:     40(ptr) AccessChain 27(data) 65 29
+             983:   18(fvec4) Load 982
+             984:   18(fvec4) GroupNonUniformFMul 34 InclusiveScan 983
+             985:     40(ptr) AccessChain 27(data) 981 29
+                              Store 985 984
+             986:      6(int) Load 8(invocation)
+             987:     71(ptr) AccessChain 27(data) 29 38 30
+             988:     19(int) Load 987
+             989:     19(int) GroupNonUniformIMul 34 InclusiveScan 988
+             990:     71(ptr) AccessChain 27(data) 986 38 30
+                              Store 990 989
+             991:      6(int) Load 8(invocation)
+             992:     78(ptr) AccessChain 27(data) 38 38
+             993:   20(ivec4) Load 992
+             994:   77(ivec2) VectorShuffle 993 993 0 1
+             995:   77(ivec2) GroupNonUniformIMul 34 InclusiveScan 994
+             996:     71(ptr) AccessChain 27(data) 991 38 30
+             997:     19(int) CompositeExtract 995 0
+                              Store 996 997
+             998:     71(ptr) AccessChain 27(data) 991 38 47
+             999:     19(int) CompositeExtract 995 1
+                              Store 998 999
+            1000:      6(int) Load 8(invocation)
+            1001:     78(ptr) AccessChain 27(data) 51 38
+            1002:   20(ivec4) Load 1001
+            1003:   88(ivec3) VectorShuffle 1002 1002 0 1 2
+            1004:   88(ivec3) GroupNonUniformIMul 34 InclusiveScan 1003
+            1005:     71(ptr) AccessChain 27(data) 1000 38 30
+            1006:     19(int) CompositeExtract 1004 0
+                              Store 1005 1006
+            1007:     71(ptr) AccessChain 27(data) 1000 38 47
+            1008:     19(int) CompositeExtract 1004 1
+                              Store 1007 1008
+            1009:     71(ptr) AccessChain 27(data) 1000 38 61
+            1010:     19(int) CompositeExtract 1004 2
+                              Store 1009 1010
+            1011:      6(int) Load 8(invocation)
+            1012:     78(ptr) AccessChain 27(data) 65 38
+            1013:   20(ivec4) Load 1012
+            1014:   20(ivec4) GroupNonUniformIMul 34 InclusiveScan 1013
+            1015:     78(ptr) AccessChain 27(data) 1011 38
+                              Store 1015 1014
+            1016:      6(int) Load 8(invocation)
+            1017:    105(ptr) AccessChain 27(data) 29 51 30
+            1018:      6(int) Load 1017
+            1019:      6(int) GroupNonUniformIMul 34 InclusiveScan 1018
+            1020:    105(ptr) AccessChain 27(data) 1016 51 30
+                              Store 1020 1019
+            1021:      6(int) Load 8(invocation)
+            1022:    112(ptr) AccessChain 27(data) 38 51
+            1023:   21(ivec4) Load 1022
+            1024:  111(ivec2) VectorShuffle 1023 1023 0 1
+            1025:  111(ivec2) GroupNonUniformIMul 34 InclusiveScan 1024
+            1026:    105(ptr) AccessChain 27(data) 1021 51 30
+            1027:      6(int) CompositeExtract 1025 0
+                              Store 1026 1027
+            1028:    105(ptr) AccessChain 27(data) 1021 51 47
+            1029:      6(int) CompositeExtract 1025 1
+                              Store 1028 1029
+            1030:      6(int) Load 8(invocation)
+            1031:    112(ptr) AccessChain 27(data) 51 51
+            1032:   21(ivec4) Load 1031
+            1033:  122(ivec3) VectorShuffle 1032 1032 0 1 2
+            1034:  122(ivec3) GroupNonUniformIMul 34 InclusiveScan 1033
+            1035:    105(ptr) AccessChain 27(data) 1030 51 30
+            1036:      6(int) CompositeExtract 1034 0
+                              Store 1035 1036
+            1037:    105(ptr) AccessChain 27(data) 1030 51 47
+            1038:      6(int) CompositeExtract 1034 1
+                              Store 1037 1038
+            1039:    105(ptr) AccessChain 27(data) 1030 51 61
+            1040:      6(int) CompositeExtract 1034 2
+                              Store 1039 1040
             1041:      6(int) Load 8(invocation)
-            1042:    132(ptr) AccessChain 27(data) 59 59
-            1043: 23(f64vec4) Load 1042
-            1044: 23(f64vec4) GroupNonUniformFMin 34 InclusiveScan 1043
-            1045:    132(ptr) AccessChain 27(data) 1041 59
+            1042:    112(ptr) AccessChain 27(data) 65 51
+            1043:   21(ivec4) Load 1042
+            1044:   21(ivec4) GroupNonUniformIMul 34 InclusiveScan 1043
+            1045:    112(ptr) AccessChain 27(data) 1041 51
                               Store 1045 1044
             1046:      6(int) Load 8(invocation)
-            1047:     31(ptr) AccessChain 27(data) 29 29 30
-            1048:   17(float) Load 1047
-            1049:   17(float) GroupNonUniformFMax 34 InclusiveScan 1048
-            1050:     31(ptr) AccessChain 27(data) 1046 29 30
+            1047:    139(ptr) AccessChain 27(data) 29 65 30
+            1048:22(float64_t) Load 1047
+            1049:22(float64_t) GroupNonUniformFMul 34 InclusiveScan 1048
+            1050:    139(ptr) AccessChain 27(data) 1046 65 30
                               Store 1050 1049
             1051:      6(int) Load 8(invocation)
-            1052:     40(ptr) AccessChain 27(data) 38 29
-            1053:   18(fvec4) Load 1052
-            1054:   39(fvec2) VectorShuffle 1053 1053 0 1
-            1055:   39(fvec2) GroupNonUniformFMax 34 InclusiveScan 1054
-            1056:     40(ptr) AccessChain 27(data) 1051 29
-            1057:   18(fvec4) Load 1056
-            1058:   18(fvec4) VectorShuffle 1057 1055 4 5 2 3
-                              Store 1056 1058
-            1059:      6(int) Load 8(invocation)
-            1060:     40(ptr) AccessChain 27(data) 49 29
-            1061:   18(fvec4) Load 1060
-            1062:   50(fvec3) VectorShuffle 1061 1061 0 1 2
-            1063:   50(fvec3) GroupNonUniformFMax 34 InclusiveScan 1062
-            1064:     40(ptr) AccessChain 27(data) 1059 29
-            1065:   18(fvec4) Load 1064
-            1066:   18(fvec4) VectorShuffle 1065 1063 4 5 6 3
-                              Store 1064 1066
-            1067:      6(int) Load 8(invocation)
-            1068:     40(ptr) AccessChain 27(data) 59 29
-            1069:   18(fvec4) Load 1068
-            1070:   18(fvec4) GroupNonUniformFMax 34 InclusiveScan 1069
-            1071:     40(ptr) AccessChain 27(data) 1067 29
-                              Store 1071 1070
-            1072:      6(int) Load 8(invocation)
-            1073:     65(ptr) AccessChain 27(data) 29 38 30
-            1074:     19(int) Load 1073
-            1075:     19(int) GroupNonUniformSMax 34 InclusiveScan 1074
-            1076:     65(ptr) AccessChain 27(data) 1072 38 30
-                              Store 1076 1075
-            1077:      6(int) Load 8(invocation)
-            1078:     72(ptr) AccessChain 27(data) 38 38
-            1079:   20(ivec4) Load 1078
-            1080:   71(ivec2) VectorShuffle 1079 1079 0 1
-            1081:   71(ivec2) GroupNonUniformSMax 34 InclusiveScan 1080
-            1082:     72(ptr) AccessChain 27(data) 1077 38
-            1083:   20(ivec4) Load 1082
-            1084:   20(ivec4) VectorShuffle 1083 1081 4 5 2 3
-                              Store 1082 1084
-            1085:      6(int) Load 8(invocation)
-            1086:     72(ptr) AccessChain 27(data) 49 38
-            1087:   20(ivec4) Load 1086
-            1088:   81(ivec3) VectorShuffle 1087 1087 0 1 2
-            1089:   81(ivec3) GroupNonUniformSMax 34 InclusiveScan 1088
-            1090:     72(ptr) AccessChain 27(data) 1085 38
-            1091:   20(ivec4) Load 1090
-            1092:   20(ivec4) VectorShuffle 1091 1089 4 5 6 3
-                              Store 1090 1092
-            1093:      6(int) Load 8(invocation)
-            1094:     72(ptr) AccessChain 27(data) 59 38
-            1095:   20(ivec4) Load 1094
-            1096:   20(ivec4) GroupNonUniformSMax 34 InclusiveScan 1095
-            1097:     72(ptr) AccessChain 27(data) 1093 38
-                              Store 1097 1096
-            1098:      6(int) Load 8(invocation)
-            1099:     95(ptr) AccessChain 27(data) 29 49 30
-            1100:      6(int) Load 1099
-            1101:      6(int) GroupNonUniformUMax 34 InclusiveScan 1100
-            1102:     95(ptr) AccessChain 27(data) 1098 49 30
-                              Store 1102 1101
-            1103:      6(int) Load 8(invocation)
-            1104:    102(ptr) AccessChain 27(data) 38 49
-            1105:   21(ivec4) Load 1104
-            1106:  101(ivec2) VectorShuffle 1105 1105 0 1
-            1107:  101(ivec2) GroupNonUniformUMax 34 InclusiveScan 1106
-            1108:    102(ptr) AccessChain 27(data) 1103 49
-            1109:   21(ivec4) Load 1108
-            1110:   21(ivec4) VectorShuffle 1109 1107 4 5 2 3
-                              Store 1108 1110
+            1052:    146(ptr) AccessChain 27(data) 38 65
+            1053: 23(f64vec4) Load 1052
+            1054:145(f64vec2) VectorShuffle 1053 1053 0 1
+            1055:145(f64vec2) GroupNonUniformFMul 34 InclusiveScan 1054
+            1056:    139(ptr) AccessChain 27(data) 1051 65 30
+            1057:22(float64_t) CompositeExtract 1055 0
+                              Store 1056 1057
+            1058:    139(ptr) AccessChain 27(data) 1051 65 47
+            1059:22(float64_t) CompositeExtract 1055 1
+                              Store 1058 1059
+            1060:      6(int) Load 8(invocation)
+            1061:    146(ptr) AccessChain 27(data) 51 65
+            1062: 23(f64vec4) Load 1061
+            1063:156(f64vec3) VectorShuffle 1062 1062 0 1 2
+            1064:156(f64vec3) GroupNonUniformFMul 34 InclusiveScan 1063
+            1065:    139(ptr) AccessChain 27(data) 1060 65 30
+            1066:22(float64_t) CompositeExtract 1064 0
+                              Store 1065 1066
+            1067:    139(ptr) AccessChain 27(data) 1060 65 47
+            1068:22(float64_t) CompositeExtract 1064 1
+                              Store 1067 1068
+            1069:    139(ptr) AccessChain 27(data) 1060 65 61
+            1070:22(float64_t) CompositeExtract 1064 2
+                              Store 1069 1070
+            1071:      6(int) Load 8(invocation)
+            1072:    146(ptr) AccessChain 27(data) 65 65
+            1073: 23(f64vec4) Load 1072
+            1074: 23(f64vec4) GroupNonUniformFMul 34 InclusiveScan 1073
+            1075:    146(ptr) AccessChain 27(data) 1071 65
+                              Store 1075 1074
+            1076:      6(int) Load 8(invocation)
+            1077:     31(ptr) AccessChain 27(data) 29 29 30
+            1078:   17(float) Load 1077
+            1079:   17(float) GroupNonUniformFMin 34 InclusiveScan 1078
+            1080:     31(ptr) AccessChain 27(data) 1076 29 30
+                              Store 1080 1079
+            1081:      6(int) Load 8(invocation)
+            1082:     40(ptr) AccessChain 27(data) 38 29
+            1083:   18(fvec4) Load 1082
+            1084:   39(fvec2) VectorShuffle 1083 1083 0 1
+            1085:   39(fvec2) GroupNonUniformFMin 34 InclusiveScan 1084
+            1086:     31(ptr) AccessChain 27(data) 1081 29 30
+            1087:   17(float) CompositeExtract 1085 0
+                              Store 1086 1087
+            1088:     31(ptr) AccessChain 27(data) 1081 29 47
+            1089:   17(float) CompositeExtract 1085 1
+                              Store 1088 1089
+            1090:      6(int) Load 8(invocation)
+            1091:     40(ptr) AccessChain 27(data) 51 29
+            1092:   18(fvec4) Load 1091
+            1093:   52(fvec3) VectorShuffle 1092 1092 0 1 2
+            1094:   52(fvec3) GroupNonUniformFMin 34 InclusiveScan 1093
+            1095:     31(ptr) AccessChain 27(data) 1090 29 30
+            1096:   17(float) CompositeExtract 1094 0
+                              Store 1095 1096
+            1097:     31(ptr) AccessChain 27(data) 1090 29 47
+            1098:   17(float) CompositeExtract 1094 1
+                              Store 1097 1098
+            1099:     31(ptr) AccessChain 27(data) 1090 29 61
+            1100:   17(float) CompositeExtract 1094 2
+                              Store 1099 1100
+            1101:      6(int) Load 8(invocation)
+            1102:     40(ptr) AccessChain 27(data) 65 29
+            1103:   18(fvec4) Load 1102
+            1104:   18(fvec4) GroupNonUniformFMin 34 InclusiveScan 1103
+            1105:     40(ptr) AccessChain 27(data) 1101 29
+                              Store 1105 1104
+            1106:      6(int) Load 8(invocation)
+            1107:     71(ptr) AccessChain 27(data) 29 38 30
+            1108:     19(int) Load 1107
+            1109:     19(int) GroupNonUniformSMin 34 InclusiveScan 1108
+            1110:     71(ptr) AccessChain 27(data) 1106 38 30
+                              Store 1110 1109
             1111:      6(int) Load 8(invocation)
-            1112:    102(ptr) AccessChain 27(data) 49 49
-            1113:   21(ivec4) Load 1112
-            1114:  111(ivec3) VectorShuffle 1113 1113 0 1 2
-            1115:  111(ivec3) GroupNonUniformUMax 34 InclusiveScan 1114
-            1116:    102(ptr) AccessChain 27(data) 1111 49
-            1117:   21(ivec4) Load 1116
-            1118:   21(ivec4) VectorShuffle 1117 1115 4 5 6 3
-                              Store 1116 1118
-            1119:      6(int) Load 8(invocation)
-            1120:    102(ptr) AccessChain 27(data) 59 49
-            1121:   21(ivec4) Load 1120
-            1122:   21(ivec4) GroupNonUniformUMax 34 InclusiveScan 1121
-            1123:    102(ptr) AccessChain 27(data) 1119 49
-                              Store 1123 1122
-            1124:      6(int) Load 8(invocation)
-            1125:    125(ptr) AccessChain 27(data) 29 59 30
-            1126:22(float64_t) Load 1125
-            1127:22(float64_t) GroupNonUniformFMax 34 InclusiveScan 1126
-            1128:    125(ptr) AccessChain 27(data) 1124 59 30
-                              Store 1128 1127
-            1129:      6(int) Load 8(invocation)
-            1130:    132(ptr) AccessChain 27(data) 38 59
-            1131: 23(f64vec4) Load 1130
-            1132:131(f64vec2) VectorShuffle 1131 1131 0 1
-            1133:131(f64vec2) GroupNonUniformFMax 34 InclusiveScan 1132
-            1134:    132(ptr) AccessChain 27(data) 1129 59
-            1135: 23(f64vec4) Load 1134
-            1136: 23(f64vec4) VectorShuffle 1135 1133 4 5 2 3
-                              Store 1134 1136
-            1137:      6(int) Load 8(invocation)
-            1138:    132(ptr) AccessChain 27(data) 49 59
-            1139: 23(f64vec4) Load 1138
-            1140:141(f64vec3) VectorShuffle 1139 1139 0 1 2
-            1141:141(f64vec3) GroupNonUniformFMax 34 InclusiveScan 1140
-            1142:    132(ptr) AccessChain 27(data) 1137 59
-            1143: 23(f64vec4) Load 1142
-            1144: 23(f64vec4) VectorShuffle 1143 1141 4 5 6 3
-                              Store 1142 1144
-            1145:      6(int) Load 8(invocation)
-            1146:    132(ptr) AccessChain 27(data) 59 59
-            1147: 23(f64vec4) Load 1146
-            1148: 23(f64vec4) GroupNonUniformFMax 34 InclusiveScan 1147
-            1149:    132(ptr) AccessChain 27(data) 1145 59
-                              Store 1149 1148
+            1112:     78(ptr) AccessChain 27(data) 38 38
+            1113:   20(ivec4) Load 1112
+            1114:   77(ivec2) VectorShuffle 1113 1113 0 1
+            1115:   77(ivec2) GroupNonUniformSMin 34 InclusiveScan 1114
+            1116:     71(ptr) AccessChain 27(data) 1111 38 30
+            1117:     19(int) CompositeExtract 1115 0
+                              Store 1116 1117
+            1118:     71(ptr) AccessChain 27(data) 1111 38 47
+            1119:     19(int) CompositeExtract 1115 1
+                              Store 1118 1119
+            1120:      6(int) Load 8(invocation)
+            1121:     78(ptr) AccessChain 27(data) 51 38
+            1122:   20(ivec4) Load 1121
+            1123:   88(ivec3) VectorShuffle 1122 1122 0 1 2
+            1124:   88(ivec3) GroupNonUniformSMin 34 InclusiveScan 1123
+            1125:     71(ptr) AccessChain 27(data) 1120 38 30
+            1126:     19(int) CompositeExtract 1124 0
+                              Store 1125 1126
+            1127:     71(ptr) AccessChain 27(data) 1120 38 47
+            1128:     19(int) CompositeExtract 1124 1
+                              Store 1127 1128
+            1129:     71(ptr) AccessChain 27(data) 1120 38 61
+            1130:     19(int) CompositeExtract 1124 2
+                              Store 1129 1130
+            1131:      6(int) Load 8(invocation)
+            1132:     78(ptr) AccessChain 27(data) 65 38
+            1133:   20(ivec4) Load 1132
+            1134:   20(ivec4) GroupNonUniformSMin 34 InclusiveScan 1133
+            1135:     78(ptr) AccessChain 27(data) 1131 38
+                              Store 1135 1134
+            1136:      6(int) Load 8(invocation)
+            1137:    105(ptr) AccessChain 27(data) 29 51 30
+            1138:      6(int) Load 1137
+            1139:      6(int) GroupNonUniformUMin 34 InclusiveScan 1138
+            1140:    105(ptr) AccessChain 27(data) 1136 51 30
+                              Store 1140 1139
+            1141:      6(int) Load 8(invocation)
+            1142:    112(ptr) AccessChain 27(data) 38 51
+            1143:   21(ivec4) Load 1142
+            1144:  111(ivec2) VectorShuffle 1143 1143 0 1
+            1145:  111(ivec2) GroupNonUniformUMin 34 InclusiveScan 1144
+            1146:    105(ptr) AccessChain 27(data) 1141 51 30
+            1147:      6(int) CompositeExtract 1145 0
+                              Store 1146 1147
+            1148:    105(ptr) AccessChain 27(data) 1141 51 47
+            1149:      6(int) CompositeExtract 1145 1
+                              Store 1148 1149
             1150:      6(int) Load 8(invocation)
-            1151:     65(ptr) AccessChain 27(data) 29 38 30
-            1152:     19(int) Load 1151
-            1153:     19(int) GroupNonUniformBitwiseAnd 34 InclusiveScan 1152
-            1154:     65(ptr) AccessChain 27(data) 1150 38 30
-                              Store 1154 1153
-            1155:      6(int) Load 8(invocation)
-            1156:     72(ptr) AccessChain 27(data) 38 38
-            1157:   20(ivec4) Load 1156
-            1158:   71(ivec2) VectorShuffle 1157 1157 0 1
-            1159:   71(ivec2) GroupNonUniformBitwiseAnd 34 InclusiveScan 1158
-            1160:     72(ptr) AccessChain 27(data) 1155 38
-            1161:   20(ivec4) Load 1160
-            1162:   20(ivec4) VectorShuffle 1161 1159 4 5 2 3
-                              Store 1160 1162
-            1163:      6(int) Load 8(invocation)
-            1164:     72(ptr) AccessChain 27(data) 49 38
-            1165:   20(ivec4) Load 1164
-            1166:   81(ivec3) VectorShuffle 1165 1165 0 1 2
-            1167:   81(ivec3) GroupNonUniformBitwiseAnd 34 InclusiveScan 1166
-            1168:     72(ptr) AccessChain 27(data) 1163 38
-            1169:   20(ivec4) Load 1168
-            1170:   20(ivec4) VectorShuffle 1169 1167 4 5 6 3
-                              Store 1168 1170
+            1151:    112(ptr) AccessChain 27(data) 51 51
+            1152:   21(ivec4) Load 1151
+            1153:  122(ivec3) VectorShuffle 1152 1152 0 1 2
+            1154:  122(ivec3) GroupNonUniformUMin 34 InclusiveScan 1153
+            1155:    105(ptr) AccessChain 27(data) 1150 51 30
+            1156:      6(int) CompositeExtract 1154 0
+                              Store 1155 1156
+            1157:    105(ptr) AccessChain 27(data) 1150 51 47
+            1158:      6(int) CompositeExtract 1154 1
+                              Store 1157 1158
+            1159:    105(ptr) AccessChain 27(data) 1150 51 61
+            1160:      6(int) CompositeExtract 1154 2
+                              Store 1159 1160
+            1161:      6(int) Load 8(invocation)
+            1162:    112(ptr) AccessChain 27(data) 65 51
+            1163:   21(ivec4) Load 1162
+            1164:   21(ivec4) GroupNonUniformUMin 34 InclusiveScan 1163
+            1165:    112(ptr) AccessChain 27(data) 1161 51
+                              Store 1165 1164
+            1166:      6(int) Load 8(invocation)
+            1167:    139(ptr) AccessChain 27(data) 29 65 30
+            1168:22(float64_t) Load 1167
+            1169:22(float64_t) GroupNonUniformFMin 34 InclusiveScan 1168
+            1170:    139(ptr) AccessChain 27(data) 1166 65 30
+                              Store 1170 1169
             1171:      6(int) Load 8(invocation)
-            1172:     72(ptr) AccessChain 27(data) 59 38
-            1173:   20(ivec4) Load 1172
-            1174:   20(ivec4) GroupNonUniformBitwiseAnd 34 InclusiveScan 1173
-            1175:     72(ptr) AccessChain 27(data) 1171 38
-                              Store 1175 1174
-            1176:      6(int) Load 8(invocation)
-            1177:     95(ptr) AccessChain 27(data) 29 49 30
-            1178:      6(int) Load 1177
-            1179:      6(int) GroupNonUniformBitwiseAnd 34 InclusiveScan 1178
-            1180:     95(ptr) AccessChain 27(data) 1176 49 30
-                              Store 1180 1179
-            1181:      6(int) Load 8(invocation)
-            1182:    102(ptr) AccessChain 27(data) 38 49
-            1183:   21(ivec4) Load 1182
-            1184:  101(ivec2) VectorShuffle 1183 1183 0 1
-            1185:  101(ivec2) GroupNonUniformBitwiseAnd 34 InclusiveScan 1184
-            1186:    102(ptr) AccessChain 27(data) 1181 49
-            1187:   21(ivec4) Load 1186
-            1188:   21(ivec4) VectorShuffle 1187 1185 4 5 2 3
-                              Store 1186 1188
-            1189:      6(int) Load 8(invocation)
-            1190:    102(ptr) AccessChain 27(data) 49 49
-            1191:   21(ivec4) Load 1190
-            1192:  111(ivec3) VectorShuffle 1191 1191 0 1 2
-            1193:  111(ivec3) GroupNonUniformBitwiseAnd 34 InclusiveScan 1192
-            1194:    102(ptr) AccessChain 27(data) 1189 49
-            1195:   21(ivec4) Load 1194
-            1196:   21(ivec4) VectorShuffle 1195 1193 4 5 6 3
-                              Store 1194 1196
-            1197:      6(int) Load 8(invocation)
-            1198:    102(ptr) AccessChain 27(data) 59 49
-            1199:   21(ivec4) Load 1198
-            1200:   21(ivec4) GroupNonUniformBitwiseAnd 34 InclusiveScan 1199
-            1201:    102(ptr) AccessChain 27(data) 1197 49
-                              Store 1201 1200
-            1202:      6(int) Load 8(invocation)
-            1203:     65(ptr) AccessChain 27(data) 29 38 30
-            1204:     19(int) Load 1203
-            1205:   521(bool) SLessThan 1204 29
-            1206:   521(bool) GroupNonUniformLogicalAnd 34 InclusiveScan 1205
-            1207:     19(int) Select 1206 38 29
-            1208:     65(ptr) AccessChain 27(data) 1202 38 30
-                              Store 1208 1207
-            1209:      6(int) Load 8(invocation)
-            1210:     72(ptr) AccessChain 27(data) 38 38
-            1211:   20(ivec4) Load 1210
-            1212:   71(ivec2) VectorShuffle 1211 1211 0 1
-            1213:  531(bvec2) SLessThan 1212 530
-            1214:  531(bvec2) GroupNonUniformLogicalAnd 34 InclusiveScan 1213
-            1215:   71(ivec2) Select 1214 534 530
-            1216:     72(ptr) AccessChain 27(data) 1209 38
-            1217:   20(ivec4) Load 1216
-            1218:   20(ivec4) VectorShuffle 1217 1215 4 5 2 3
-                              Store 1216 1218
-            1219:      6(int) Load 8(invocation)
-            1220:     72(ptr) AccessChain 27(data) 38 38
-            1221:   20(ivec4) Load 1220
-            1222:   81(ivec3) VectorShuffle 1221 1221 0 1 2
-            1223:  544(bvec3) SLessThan 1222 543
-            1224:  544(bvec3) GroupNonUniformLogicalAnd 34 InclusiveScan 1223
-            1225:   81(ivec3) Select 1224 547 543
-            1226:     72(ptr) AccessChain 27(data) 1219 38
-            1227:   20(ivec4) Load 1226
-            1228:   20(ivec4) VectorShuffle 1227 1225 4 5 6 3
-                              Store 1226 1228
-            1229:      6(int) Load 8(invocation)
-            1230:     72(ptr) AccessChain 27(data) 38 38
-            1231:   20(ivec4) Load 1230
-            1232:  556(bvec4) SLessThan 1231 555
-            1233:  556(bvec4) GroupNonUniformLogicalAnd 34 InclusiveScan 1232
-            1234:   20(ivec4) Select 1233 559 555
-            1235:     72(ptr) AccessChain 27(data) 1229 38
-                              Store 1235 1234
-            1236:      6(int) Load 8(invocation)
-            1237:     65(ptr) AccessChain 27(data) 29 38 30
-            1238:     19(int) Load 1237
-            1239:     19(int) GroupNonUniformBitwiseOr 34 InclusiveScan 1238
-            1240:     65(ptr) AccessChain 27(data) 1236 38 30
-                              Store 1240 1239
-            1241:      6(int) Load 8(invocation)
-            1242:     72(ptr) AccessChain 27(data) 38 38
-            1243:   20(ivec4) Load 1242
-            1244:   71(ivec2) VectorShuffle 1243 1243 0 1
-            1245:   71(ivec2) GroupNonUniformBitwiseOr 34 InclusiveScan 1244
-            1246:     72(ptr) AccessChain 27(data) 1241 38
-            1247:   20(ivec4) Load 1246
-            1248:   20(ivec4) VectorShuffle 1247 1245 4 5 2 3
-                              Store 1246 1248
-            1249:      6(int) Load 8(invocation)
-            1250:     72(ptr) AccessChain 27(data) 49 38
-            1251:   20(ivec4) Load 1250
-            1252:   81(ivec3) VectorShuffle 1251 1251 0 1 2
-            1253:   81(ivec3) GroupNonUniformBitwiseOr 34 InclusiveScan 1252
-            1254:     72(ptr) AccessChain 27(data) 1249 38
-            1255:   20(ivec4) Load 1254
-            1256:   20(ivec4) VectorShuffle 1255 1253 4 5 6 3
-                              Store 1254 1256
-            1257:      6(int) Load 8(invocation)
-            1258:     72(ptr) AccessChain 27(data) 59 38
-            1259:   20(ivec4) Load 1258
-            1260:   20(ivec4) GroupNonUniformBitwiseOr 34 InclusiveScan 1259
-            1261:     72(ptr) AccessChain 27(data) 1257 38
-                              Store 1261 1260
-            1262:      6(int) Load 8(invocation)
-            1263:     95(ptr) AccessChain 27(data) 29 49 30
-            1264:      6(int) Load 1263
-            1265:      6(int) GroupNonUniformBitwiseOr 34 InclusiveScan 1264
-            1266:     95(ptr) AccessChain 27(data) 1262 49 30
-                              Store 1266 1265
-            1267:      6(int) Load 8(invocation)
-            1268:    102(ptr) AccessChain 27(data) 38 49
-            1269:   21(ivec4) Load 1268
-            1270:  101(ivec2) VectorShuffle 1269 1269 0 1
-            1271:  101(ivec2) GroupNonUniformBitwiseOr 34 InclusiveScan 1270
-            1272:    102(ptr) AccessChain 27(data) 1267 49
-            1273:   21(ivec4) Load 1272
-            1274:   21(ivec4) VectorShuffle 1273 1271 4 5 2 3
-                              Store 1272 1274
-            1275:      6(int) Load 8(invocation)
-            1276:    102(ptr) AccessChain 27(data) 49 49
-            1277:   21(ivec4) Load 1276
-            1278:  111(ivec3) VectorShuffle 1277 1277 0 1 2
-            1279:  111(ivec3) GroupNonUniformBitwiseOr 34 InclusiveScan 1278
-            1280:    102(ptr) AccessChain 27(data) 1275 49
-            1281:   21(ivec4) Load 1280
-            1282:   21(ivec4) VectorShuffle 1281 1279 4 5 6 3
-                              Store 1280 1282
-            1283:      6(int) Load 8(invocation)
-            1284:    102(ptr) AccessChain 27(data) 59 49
-            1285:   21(ivec4) Load 1284
-            1286:   21(ivec4) GroupNonUniformBitwiseOr 34 InclusiveScan 1285
-            1287:    102(ptr) AccessChain 27(data) 1283 49
-                              Store 1287 1286
-            1288:      6(int) Load 8(invocation)
-            1289:     65(ptr) AccessChain 27(data) 29 38 30
-            1290:     19(int) Load 1289
-            1291:   521(bool) SLessThan 1290 29
-            1292:   521(bool) GroupNonUniformLogicalOr 34 InclusiveScan 1291
-            1293:     19(int) Select 1292 38 29
-            1294:     65(ptr) AccessChain 27(data) 1288 38 30
-                              Store 1294 1293
-            1295:      6(int) Load 8(invocation)
-            1296:     72(ptr) AccessChain 27(data) 38 38
-            1297:   20(ivec4) Load 1296
-            1298:   71(ivec2) VectorShuffle 1297 1297 0 1
-            1299:  531(bvec2) SLessThan 1298 530
-            1300:  531(bvec2) GroupNonUniformLogicalOr 34 InclusiveScan 1299
-            1301:   71(ivec2) Select 1300 534 530
-            1302:     72(ptr) AccessChain 27(data) 1295 38
-            1303:   20(ivec4) Load 1302
-            1304:   20(ivec4) VectorShuffle 1303 1301 4 5 2 3
-                              Store 1302 1304
-            1305:      6(int) Load 8(invocation)
-            1306:     72(ptr) AccessChain 27(data) 38 38
-            1307:   20(ivec4) Load 1306
-            1308:   81(ivec3) VectorShuffle 1307 1307 0 1 2
-            1309:  544(bvec3) SLessThan 1308 543
-            1310:  544(bvec3) GroupNonUniformLogicalOr 34 InclusiveScan 1309
-            1311:   81(ivec3) Select 1310 547 543
-            1312:     72(ptr) AccessChain 27(data) 1305 38
-            1313:   20(ivec4) Load 1312
-            1314:   20(ivec4) VectorShuffle 1313 1311 4 5 6 3
-                              Store 1312 1314
-            1315:      6(int) Load 8(invocation)
-            1316:     72(ptr) AccessChain 27(data) 38 38
-            1317:   20(ivec4) Load 1316
-            1318:  556(bvec4) SLessThan 1317 555
-            1319:  556(bvec4) GroupNonUniformLogicalOr 34 InclusiveScan 1318
-            1320:   20(ivec4) Select 1319 559 555
-            1321:     72(ptr) AccessChain 27(data) 1315 38
-                              Store 1321 1320
-            1322:      6(int) Load 8(invocation)
-            1323:     65(ptr) AccessChain 27(data) 29 38 30
-            1324:     19(int) Load 1323
-            1325:     19(int) GroupNonUniformBitwiseXor 34 InclusiveScan 1324
-            1326:     65(ptr) AccessChain 27(data) 1322 38 30
-                              Store 1326 1325
-            1327:      6(int) Load 8(invocation)
-            1328:     72(ptr) AccessChain 27(data) 38 38
-            1329:   20(ivec4) Load 1328
-            1330:   71(ivec2) VectorShuffle 1329 1329 0 1
-            1331:   71(ivec2) GroupNonUniformBitwiseXor 34 InclusiveScan 1330
-            1332:     72(ptr) AccessChain 27(data) 1327 38
-            1333:   20(ivec4) Load 1332
-            1334:   20(ivec4) VectorShuffle 1333 1331 4 5 2 3
-                              Store 1332 1334
-            1335:      6(int) Load 8(invocation)
-            1336:     72(ptr) AccessChain 27(data) 49 38
-            1337:   20(ivec4) Load 1336
-            1338:   81(ivec3) VectorShuffle 1337 1337 0 1 2
-            1339:   81(ivec3) GroupNonUniformBitwiseXor 34 InclusiveScan 1338
-            1340:     72(ptr) AccessChain 27(data) 1335 38
-            1341:   20(ivec4) Load 1340
-            1342:   20(ivec4) VectorShuffle 1341 1339 4 5 6 3
-                              Store 1340 1342
-            1343:      6(int) Load 8(invocation)
-            1344:     72(ptr) AccessChain 27(data) 59 38
-            1345:   20(ivec4) Load 1344
-            1346:   20(ivec4) GroupNonUniformBitwiseXor 34 InclusiveScan 1345
-            1347:     72(ptr) AccessChain 27(data) 1343 38
-                              Store 1347 1346
-            1348:      6(int) Load 8(invocation)
-            1349:     95(ptr) AccessChain 27(data) 29 49 30
-            1350:      6(int) Load 1349
-            1351:      6(int) GroupNonUniformBitwiseXor 34 InclusiveScan 1350
-            1352:     95(ptr) AccessChain 27(data) 1348 49 30
-                              Store 1352 1351
-            1353:      6(int) Load 8(invocation)
-            1354:    102(ptr) AccessChain 27(data) 38 49
-            1355:   21(ivec4) Load 1354
-            1356:  101(ivec2) VectorShuffle 1355 1355 0 1
-            1357:  101(ivec2) GroupNonUniformBitwiseXor 34 InclusiveScan 1356
-            1358:    102(ptr) AccessChain 27(data) 1353 49
-            1359:   21(ivec4) Load 1358
-            1360:   21(ivec4) VectorShuffle 1359 1357 4 5 2 3
-                              Store 1358 1360
-            1361:      6(int) Load 8(invocation)
-            1362:    102(ptr) AccessChain 27(data) 49 49
-            1363:   21(ivec4) Load 1362
-            1364:  111(ivec3) VectorShuffle 1363 1363 0 1 2
-            1365:  111(ivec3) GroupNonUniformBitwiseXor 34 InclusiveScan 1364
-            1366:    102(ptr) AccessChain 27(data) 1361 49
-            1367:   21(ivec4) Load 1366
-            1368:   21(ivec4) VectorShuffle 1367 1365 4 5 6 3
-                              Store 1366 1368
-            1369:      6(int) Load 8(invocation)
-            1370:    102(ptr) AccessChain 27(data) 59 49
-            1371:   21(ivec4) Load 1370
-            1372:   21(ivec4) GroupNonUniformBitwiseXor 34 InclusiveScan 1371
-            1373:    102(ptr) AccessChain 27(data) 1369 49
-                              Store 1373 1372
-            1374:      6(int) Load 8(invocation)
-            1375:     65(ptr) AccessChain 27(data) 29 38 30
-            1376:     19(int) Load 1375
-            1377:   521(bool) SLessThan 1376 29
-            1378:   521(bool) GroupNonUniformLogicalXor 34 InclusiveScan 1377
-            1379:     19(int) Select 1378 38 29
-            1380:     65(ptr) AccessChain 27(data) 1374 38 30
-                              Store 1380 1379
-            1381:      6(int) Load 8(invocation)
-            1382:     72(ptr) AccessChain 27(data) 38 38
-            1383:   20(ivec4) Load 1382
-            1384:   71(ivec2) VectorShuffle 1383 1383 0 1
-            1385:  531(bvec2) SLessThan 1384 530
-            1386:  531(bvec2) GroupNonUniformLogicalXor 34 InclusiveScan 1385
-            1387:   71(ivec2) Select 1386 534 530
-            1388:     72(ptr) AccessChain 27(data) 1381 38
-            1389:   20(ivec4) Load 1388
-            1390:   20(ivec4) VectorShuffle 1389 1387 4 5 2 3
-                              Store 1388 1390
-            1391:      6(int) Load 8(invocation)
-            1392:     72(ptr) AccessChain 27(data) 38 38
-            1393:   20(ivec4) Load 1392
-            1394:   81(ivec3) VectorShuffle 1393 1393 0 1 2
-            1395:  544(bvec3) SLessThan 1394 543
-            1396:  544(bvec3) GroupNonUniformLogicalXor 34 InclusiveScan 1395
-            1397:   81(ivec3) Select 1396 547 543
-            1398:     72(ptr) AccessChain 27(data) 1391 38
-            1399:   20(ivec4) Load 1398
-            1400:   20(ivec4) VectorShuffle 1399 1397 4 5 6 3
-                              Store 1398 1400
-            1401:      6(int) Load 8(invocation)
-            1402:     72(ptr) AccessChain 27(data) 38 38
-            1403:   20(ivec4) Load 1402
-            1404:  556(bvec4) SLessThan 1403 555
-            1405:  556(bvec4) GroupNonUniformLogicalXor 34 InclusiveScan 1404
-            1406:   20(ivec4) Select 1405 559 555
-            1407:     72(ptr) AccessChain 27(data) 1401 38
-                              Store 1407 1406
-            1408:      6(int) Load 8(invocation)
-            1409:     31(ptr) AccessChain 27(data) 29 29 30
-            1410:   17(float) Load 1409
-            1411:   17(float) GroupNonUniformFAdd 34 ExclusiveScan 1410
-            1412:     31(ptr) AccessChain 27(data) 1408 29 30
-                              Store 1412 1411
-            1413:      6(int) Load 8(invocation)
-            1414:     40(ptr) AccessChain 27(data) 38 29
-            1415:   18(fvec4) Load 1414
-            1416:   39(fvec2) VectorShuffle 1415 1415 0 1
-            1417:   39(fvec2) GroupNonUniformFAdd 34 ExclusiveScan 1416
-            1418:     40(ptr) AccessChain 27(data) 1413 29
-            1419:   18(fvec4) Load 1418
-            1420:   18(fvec4) VectorShuffle 1419 1417 4 5 2 3
-                              Store 1418 1420
-            1421:      6(int) Load 8(invocation)
-            1422:     40(ptr) AccessChain 27(data) 49 29
-            1423:   18(fvec4) Load 1422
-            1424:   50(fvec3) VectorShuffle 1423 1423 0 1 2
-            1425:   50(fvec3) GroupNonUniformFAdd 34 ExclusiveScan 1424
-            1426:     40(ptr) AccessChain 27(data) 1421 29
-            1427:   18(fvec4) Load 1426
-            1428:   18(fvec4) VectorShuffle 1427 1425 4 5 6 3
-                              Store 1426 1428
-            1429:      6(int) Load 8(invocation)
-            1430:     40(ptr) AccessChain 27(data) 59 29
-            1431:   18(fvec4) Load 1430
-            1432:   18(fvec4) GroupNonUniformFAdd 34 ExclusiveScan 1431
-            1433:     40(ptr) AccessChain 27(data) 1429 29
-                              Store 1433 1432
-            1434:      6(int) Load 8(invocation)
-            1435:     65(ptr) AccessChain 27(data) 29 38 30
-            1436:     19(int) Load 1435
-            1437:     19(int) GroupNonUniformIAdd 34 ExclusiveScan 1436
-            1438:     65(ptr) AccessChain 27(data) 1434 38 30
-                              Store 1438 1437
+            1172:    146(ptr) AccessChain 27(data) 38 65
+            1173: 23(f64vec4) Load 1172
+            1174:145(f64vec2) VectorShuffle 1173 1173 0 1
+            1175:145(f64vec2) GroupNonUniformFMin 34 InclusiveScan 1174
+            1176:    139(ptr) AccessChain 27(data) 1171 65 30
+            1177:22(float64_t) CompositeExtract 1175 0
+                              Store 1176 1177
+            1178:    139(ptr) AccessChain 27(data) 1171 65 47
+            1179:22(float64_t) CompositeExtract 1175 1
+                              Store 1178 1179
+            1180:      6(int) Load 8(invocation)
+            1181:    146(ptr) AccessChain 27(data) 51 65
+            1182: 23(f64vec4) Load 1181
+            1183:156(f64vec3) VectorShuffle 1182 1182 0 1 2
+            1184:156(f64vec3) GroupNonUniformFMin 34 InclusiveScan 1183
+            1185:    139(ptr) AccessChain 27(data) 1180 65 30
+            1186:22(float64_t) CompositeExtract 1184 0
+                              Store 1185 1186
+            1187:    139(ptr) AccessChain 27(data) 1180 65 47
+            1188:22(float64_t) CompositeExtract 1184 1
+                              Store 1187 1188
+            1189:    139(ptr) AccessChain 27(data) 1180 65 61
+            1190:22(float64_t) CompositeExtract 1184 2
+                              Store 1189 1190
+            1191:      6(int) Load 8(invocation)
+            1192:    146(ptr) AccessChain 27(data) 65 65
+            1193: 23(f64vec4) Load 1192
+            1194: 23(f64vec4) GroupNonUniformFMin 34 InclusiveScan 1193
+            1195:    146(ptr) AccessChain 27(data) 1191 65
+                              Store 1195 1194
+            1196:      6(int) Load 8(invocation)
+            1197:     31(ptr) AccessChain 27(data) 29 29 30
+            1198:   17(float) Load 1197
+            1199:   17(float) GroupNonUniformFMax 34 InclusiveScan 1198
+            1200:     31(ptr) AccessChain 27(data) 1196 29 30
+                              Store 1200 1199
+            1201:      6(int) Load 8(invocation)
+            1202:     40(ptr) AccessChain 27(data) 38 29
+            1203:   18(fvec4) Load 1202
+            1204:   39(fvec2) VectorShuffle 1203 1203 0 1
+            1205:   39(fvec2) GroupNonUniformFMax 34 InclusiveScan 1204
+            1206:     31(ptr) AccessChain 27(data) 1201 29 30
+            1207:   17(float) CompositeExtract 1205 0
+                              Store 1206 1207
+            1208:     31(ptr) AccessChain 27(data) 1201 29 47
+            1209:   17(float) CompositeExtract 1205 1
+                              Store 1208 1209
+            1210:      6(int) Load 8(invocation)
+            1211:     40(ptr) AccessChain 27(data) 51 29
+            1212:   18(fvec4) Load 1211
+            1213:   52(fvec3) VectorShuffle 1212 1212 0 1 2
+            1214:   52(fvec3) GroupNonUniformFMax 34 InclusiveScan 1213
+            1215:     31(ptr) AccessChain 27(data) 1210 29 30
+            1216:   17(float) CompositeExtract 1214 0
+                              Store 1215 1216
+            1217:     31(ptr) AccessChain 27(data) 1210 29 47
+            1218:   17(float) CompositeExtract 1214 1
+                              Store 1217 1218
+            1219:     31(ptr) AccessChain 27(data) 1210 29 61
+            1220:   17(float) CompositeExtract 1214 2
+                              Store 1219 1220
+            1221:      6(int) Load 8(invocation)
+            1222:     40(ptr) AccessChain 27(data) 65 29
+            1223:   18(fvec4) Load 1222
+            1224:   18(fvec4) GroupNonUniformFMax 34 InclusiveScan 1223
+            1225:     40(ptr) AccessChain 27(data) 1221 29
+                              Store 1225 1224
+            1226:      6(int) Load 8(invocation)
+            1227:     71(ptr) AccessChain 27(data) 29 38 30
+            1228:     19(int) Load 1227
+            1229:     19(int) GroupNonUniformSMax 34 InclusiveScan 1228
+            1230:     71(ptr) AccessChain 27(data) 1226 38 30
+                              Store 1230 1229
+            1231:      6(int) Load 8(invocation)
+            1232:     78(ptr) AccessChain 27(data) 38 38
+            1233:   20(ivec4) Load 1232
+            1234:   77(ivec2) VectorShuffle 1233 1233 0 1
+            1235:   77(ivec2) GroupNonUniformSMax 34 InclusiveScan 1234
+            1236:     71(ptr) AccessChain 27(data) 1231 38 30
+            1237:     19(int) CompositeExtract 1235 0
+                              Store 1236 1237
+            1238:     71(ptr) AccessChain 27(data) 1231 38 47
+            1239:     19(int) CompositeExtract 1235 1
+                              Store 1238 1239
+            1240:      6(int) Load 8(invocation)
+            1241:     78(ptr) AccessChain 27(data) 51 38
+            1242:   20(ivec4) Load 1241
+            1243:   88(ivec3) VectorShuffle 1242 1242 0 1 2
+            1244:   88(ivec3) GroupNonUniformSMax 34 InclusiveScan 1243
+            1245:     71(ptr) AccessChain 27(data) 1240 38 30
+            1246:     19(int) CompositeExtract 1244 0
+                              Store 1245 1246
+            1247:     71(ptr) AccessChain 27(data) 1240 38 47
+            1248:     19(int) CompositeExtract 1244 1
+                              Store 1247 1248
+            1249:     71(ptr) AccessChain 27(data) 1240 38 61
+            1250:     19(int) CompositeExtract 1244 2
+                              Store 1249 1250
+            1251:      6(int) Load 8(invocation)
+            1252:     78(ptr) AccessChain 27(data) 65 38
+            1253:   20(ivec4) Load 1252
+            1254:   20(ivec4) GroupNonUniformSMax 34 InclusiveScan 1253
+            1255:     78(ptr) AccessChain 27(data) 1251 38
+                              Store 1255 1254
+            1256:      6(int) Load 8(invocation)
+            1257:    105(ptr) AccessChain 27(data) 29 51 30
+            1258:      6(int) Load 1257
+            1259:      6(int) GroupNonUniformUMax 34 InclusiveScan 1258
+            1260:    105(ptr) AccessChain 27(data) 1256 51 30
+                              Store 1260 1259
+            1261:      6(int) Load 8(invocation)
+            1262:    112(ptr) AccessChain 27(data) 38 51
+            1263:   21(ivec4) Load 1262
+            1264:  111(ivec2) VectorShuffle 1263 1263 0 1
+            1265:  111(ivec2) GroupNonUniformUMax 34 InclusiveScan 1264
+            1266:    105(ptr) AccessChain 27(data) 1261 51 30
+            1267:      6(int) CompositeExtract 1265 0
+                              Store 1266 1267
+            1268:    105(ptr) AccessChain 27(data) 1261 51 47
+            1269:      6(int) CompositeExtract 1265 1
+                              Store 1268 1269
+            1270:      6(int) Load 8(invocation)
+            1271:    112(ptr) AccessChain 27(data) 51 51
+            1272:   21(ivec4) Load 1271
+            1273:  122(ivec3) VectorShuffle 1272 1272 0 1 2
+            1274:  122(ivec3) GroupNonUniformUMax 34 InclusiveScan 1273
+            1275:    105(ptr) AccessChain 27(data) 1270 51 30
+            1276:      6(int) CompositeExtract 1274 0
+                              Store 1275 1276
+            1277:    105(ptr) AccessChain 27(data) 1270 51 47
+            1278:      6(int) CompositeExtract 1274 1
+                              Store 1277 1278
+            1279:    105(ptr) AccessChain 27(data) 1270 51 61
+            1280:      6(int) CompositeExtract 1274 2
+                              Store 1279 1280
+            1281:      6(int) Load 8(invocation)
+            1282:    112(ptr) AccessChain 27(data) 65 51
+            1283:   21(ivec4) Load 1282
+            1284:   21(ivec4) GroupNonUniformUMax 34 InclusiveScan 1283
+            1285:    112(ptr) AccessChain 27(data) 1281 51
+                              Store 1285 1284
+            1286:      6(int) Load 8(invocation)
+            1287:    139(ptr) AccessChain 27(data) 29 65 30
+            1288:22(float64_t) Load 1287
+            1289:22(float64_t) GroupNonUniformFMax 34 InclusiveScan 1288
+            1290:    139(ptr) AccessChain 27(data) 1286 65 30
+                              Store 1290 1289
+            1291:      6(int) Load 8(invocation)
+            1292:    146(ptr) AccessChain 27(data) 38 65
+            1293: 23(f64vec4) Load 1292
+            1294:145(f64vec2) VectorShuffle 1293 1293 0 1
+            1295:145(f64vec2) GroupNonUniformFMax 34 InclusiveScan 1294
+            1296:    139(ptr) AccessChain 27(data) 1291 65 30
+            1297:22(float64_t) CompositeExtract 1295 0
+                              Store 1296 1297
+            1298:    139(ptr) AccessChain 27(data) 1291 65 47
+            1299:22(float64_t) CompositeExtract 1295 1
+                              Store 1298 1299
+            1300:      6(int) Load 8(invocation)
+            1301:    146(ptr) AccessChain 27(data) 51 65
+            1302: 23(f64vec4) Load 1301
+            1303:156(f64vec3) VectorShuffle 1302 1302 0 1 2
+            1304:156(f64vec3) GroupNonUniformFMax 34 InclusiveScan 1303
+            1305:    139(ptr) AccessChain 27(data) 1300 65 30
+            1306:22(float64_t) CompositeExtract 1304 0
+                              Store 1305 1306
+            1307:    139(ptr) AccessChain 27(data) 1300 65 47
+            1308:22(float64_t) CompositeExtract 1304 1
+                              Store 1307 1308
+            1309:    139(ptr) AccessChain 27(data) 1300 65 61
+            1310:22(float64_t) CompositeExtract 1304 2
+                              Store 1309 1310
+            1311:      6(int) Load 8(invocation)
+            1312:    146(ptr) AccessChain 27(data) 65 65
+            1313: 23(f64vec4) Load 1312
+            1314: 23(f64vec4) GroupNonUniformFMax 34 InclusiveScan 1313
+            1315:    146(ptr) AccessChain 27(data) 1311 65
+                              Store 1315 1314
+            1316:      6(int) Load 8(invocation)
+            1317:     71(ptr) AccessChain 27(data) 29 38 30
+            1318:     19(int) Load 1317
+            1319:     19(int) GroupNonUniformBitwiseAnd 34 InclusiveScan 1318
+            1320:     71(ptr) AccessChain 27(data) 1316 38 30
+                              Store 1320 1319
+            1321:      6(int) Load 8(invocation)
+            1322:     78(ptr) AccessChain 27(data) 38 38
+            1323:   20(ivec4) Load 1322
+            1324:   77(ivec2) VectorShuffle 1323 1323 0 1
+            1325:   77(ivec2) GroupNonUniformBitwiseAnd 34 InclusiveScan 1324
+            1326:     71(ptr) AccessChain 27(data) 1321 38 30
+            1327:     19(int) CompositeExtract 1325 0
+                              Store 1326 1327
+            1328:     71(ptr) AccessChain 27(data) 1321 38 47
+            1329:     19(int) CompositeExtract 1325 1
+                              Store 1328 1329
+            1330:      6(int) Load 8(invocation)
+            1331:     78(ptr) AccessChain 27(data) 51 38
+            1332:   20(ivec4) Load 1331
+            1333:   88(ivec3) VectorShuffle 1332 1332 0 1 2
+            1334:   88(ivec3) GroupNonUniformBitwiseAnd 34 InclusiveScan 1333
+            1335:     71(ptr) AccessChain 27(data) 1330 38 30
+            1336:     19(int) CompositeExtract 1334 0
+                              Store 1335 1336
+            1337:     71(ptr) AccessChain 27(data) 1330 38 47
+            1338:     19(int) CompositeExtract 1334 1
+                              Store 1337 1338
+            1339:     71(ptr) AccessChain 27(data) 1330 38 61
+            1340:     19(int) CompositeExtract 1334 2
+                              Store 1339 1340
+            1341:      6(int) Load 8(invocation)
+            1342:     78(ptr) AccessChain 27(data) 65 38
+            1343:   20(ivec4) Load 1342
+            1344:   20(ivec4) GroupNonUniformBitwiseAnd 34 InclusiveScan 1343
+            1345:     78(ptr) AccessChain 27(data) 1341 38
+                              Store 1345 1344
+            1346:      6(int) Load 8(invocation)
+            1347:    105(ptr) AccessChain 27(data) 29 51 30
+            1348:      6(int) Load 1347
+            1349:      6(int) GroupNonUniformBitwiseAnd 34 InclusiveScan 1348
+            1350:    105(ptr) AccessChain 27(data) 1346 51 30
+                              Store 1350 1349
+            1351:      6(int) Load 8(invocation)
+            1352:    112(ptr) AccessChain 27(data) 38 51
+            1353:   21(ivec4) Load 1352
+            1354:  111(ivec2) VectorShuffle 1353 1353 0 1
+            1355:  111(ivec2) GroupNonUniformBitwiseAnd 34 InclusiveScan 1354
+            1356:    105(ptr) AccessChain 27(data) 1351 51 30
+            1357:      6(int) CompositeExtract 1355 0
+                              Store 1356 1357
+            1358:    105(ptr) AccessChain 27(data) 1351 51 47
+            1359:      6(int) CompositeExtract 1355 1
+                              Store 1358 1359
+            1360:      6(int) Load 8(invocation)
+            1361:    112(ptr) AccessChain 27(data) 51 51
+            1362:   21(ivec4) Load 1361
+            1363:  122(ivec3) VectorShuffle 1362 1362 0 1 2
+            1364:  122(ivec3) GroupNonUniformBitwiseAnd 34 InclusiveScan 1363
+            1365:    105(ptr) AccessChain 27(data) 1360 51 30
+            1366:      6(int) CompositeExtract 1364 0
+                              Store 1365 1366
+            1367:    105(ptr) AccessChain 27(data) 1360 51 47
+            1368:      6(int) CompositeExtract 1364 1
+                              Store 1367 1368
+            1369:    105(ptr) AccessChain 27(data) 1360 51 61
+            1370:      6(int) CompositeExtract 1364 2
+                              Store 1369 1370
+            1371:      6(int) Load 8(invocation)
+            1372:    112(ptr) AccessChain 27(data) 65 51
+            1373:   21(ivec4) Load 1372
+            1374:   21(ivec4) GroupNonUniformBitwiseAnd 34 InclusiveScan 1373
+            1375:    112(ptr) AccessChain 27(data) 1371 51
+                              Store 1375 1374
+            1376:      6(int) Load 8(invocation)
+            1377:     71(ptr) AccessChain 27(data) 29 38 30
+            1378:     19(int) Load 1377
+            1379:   595(bool) SLessThan 1378 29
+            1380:   595(bool) GroupNonUniformLogicalAnd 34 InclusiveScan 1379
+            1381:     19(int) Select 1380 38 29
+            1382:     71(ptr) AccessChain 27(data) 1376 38 30
+                              Store 1382 1381
+            1383:      6(int) Load 8(invocation)
+            1384:     78(ptr) AccessChain 27(data) 38 38
+            1385:   20(ivec4) Load 1384
+            1386:   77(ivec2) VectorShuffle 1385 1385 0 1
+            1387:  605(bvec2) SLessThan 1386 604
+            1388:  605(bvec2) GroupNonUniformLogicalAnd 34 InclusiveScan 1387
+            1389:   77(ivec2) Select 1388 608 604
+            1390:     71(ptr) AccessChain 27(data) 1383 38 30
+            1391:     19(int) CompositeExtract 1389 0
+                              Store 1390 1391
+            1392:     71(ptr) AccessChain 27(data) 1383 38 47
+            1393:     19(int) CompositeExtract 1389 1
+                              Store 1392 1393
+            1394:      6(int) Load 8(invocation)
+            1395:     78(ptr) AccessChain 27(data) 38 38
+            1396:   20(ivec4) Load 1395
+            1397:   88(ivec3) VectorShuffle 1396 1396 0 1 2
+            1398:  619(bvec3) SLessThan 1397 618
+            1399:  619(bvec3) GroupNonUniformLogicalAnd 34 InclusiveScan 1398
+            1400:   88(ivec3) Select 1399 622 618
+            1401:     71(ptr) AccessChain 27(data) 1394 38 30
+            1402:     19(int) CompositeExtract 1400 0
+                              Store 1401 1402
+            1403:     71(ptr) AccessChain 27(data) 1394 38 47
+            1404:     19(int) CompositeExtract 1400 1
+                              Store 1403 1404
+            1405:     71(ptr) AccessChain 27(data) 1394 38 61
+            1406:     19(int) CompositeExtract 1400 2
+                              Store 1405 1406
+            1407:      6(int) Load 8(invocation)
+            1408:     78(ptr) AccessChain 27(data) 38 38
+            1409:   20(ivec4) Load 1408
+            1410:  634(bvec4) SLessThan 1409 633
+            1411:  634(bvec4) GroupNonUniformLogicalAnd 34 InclusiveScan 1410
+            1412:   20(ivec4) Select 1411 637 633
+            1413:     78(ptr) AccessChain 27(data) 1407 38
+                              Store 1413 1412
+            1414:      6(int) Load 8(invocation)
+            1415:     71(ptr) AccessChain 27(data) 29 38 30
+            1416:     19(int) Load 1415
+            1417:     19(int) GroupNonUniformBitwiseOr 34 InclusiveScan 1416
+            1418:     71(ptr) AccessChain 27(data) 1414 38 30
+                              Store 1418 1417
+            1419:      6(int) Load 8(invocation)
+            1420:     78(ptr) AccessChain 27(data) 38 38
+            1421:   20(ivec4) Load 1420
+            1422:   77(ivec2) VectorShuffle 1421 1421 0 1
+            1423:   77(ivec2) GroupNonUniformBitwiseOr 34 InclusiveScan 1422
+            1424:     71(ptr) AccessChain 27(data) 1419 38 30
+            1425:     19(int) CompositeExtract 1423 0
+                              Store 1424 1425
+            1426:     71(ptr) AccessChain 27(data) 1419 38 47
+            1427:     19(int) CompositeExtract 1423 1
+                              Store 1426 1427
+            1428:      6(int) Load 8(invocation)
+            1429:     78(ptr) AccessChain 27(data) 51 38
+            1430:   20(ivec4) Load 1429
+            1431:   88(ivec3) VectorShuffle 1430 1430 0 1 2
+            1432:   88(ivec3) GroupNonUniformBitwiseOr 34 InclusiveScan 1431
+            1433:     71(ptr) AccessChain 27(data) 1428 38 30
+            1434:     19(int) CompositeExtract 1432 0
+                              Store 1433 1434
+            1435:     71(ptr) AccessChain 27(data) 1428 38 47
+            1436:     19(int) CompositeExtract 1432 1
+                              Store 1435 1436
+            1437:     71(ptr) AccessChain 27(data) 1428 38 61
+            1438:     19(int) CompositeExtract 1432 2
+                              Store 1437 1438
             1439:      6(int) Load 8(invocation)
-            1440:     72(ptr) AccessChain 27(data) 38 38
+            1440:     78(ptr) AccessChain 27(data) 65 38
             1441:   20(ivec4) Load 1440
-            1442:   71(ivec2) VectorShuffle 1441 1441 0 1
-            1443:   71(ivec2) GroupNonUniformIAdd 34 ExclusiveScan 1442
-            1444:     72(ptr) AccessChain 27(data) 1439 38
-            1445:   20(ivec4) Load 1444
-            1446:   20(ivec4) VectorShuffle 1445 1443 4 5 2 3
-                              Store 1444 1446
-            1447:      6(int) Load 8(invocation)
-            1448:     72(ptr) AccessChain 27(data) 49 38
-            1449:   20(ivec4) Load 1448
-            1450:   81(ivec3) VectorShuffle 1449 1449 0 1 2
-            1451:   81(ivec3) GroupNonUniformIAdd 34 ExclusiveScan 1450
-            1452:     72(ptr) AccessChain 27(data) 1447 38
-            1453:   20(ivec4) Load 1452
-            1454:   20(ivec4) VectorShuffle 1453 1451 4 5 6 3
-                              Store 1452 1454
-            1455:      6(int) Load 8(invocation)
-            1456:     72(ptr) AccessChain 27(data) 59 38
-            1457:   20(ivec4) Load 1456
-            1458:   20(ivec4) GroupNonUniformIAdd 34 ExclusiveScan 1457
-            1459:     72(ptr) AccessChain 27(data) 1455 38
-                              Store 1459 1458
-            1460:      6(int) Load 8(invocation)
-            1461:     95(ptr) AccessChain 27(data) 29 49 30
-            1462:      6(int) Load 1461
-            1463:      6(int) GroupNonUniformIAdd 34 ExclusiveScan 1462
-            1464:     95(ptr) AccessChain 27(data) 1460 49 30
-                              Store 1464 1463
-            1465:      6(int) Load 8(invocation)
-            1466:    102(ptr) AccessChain 27(data) 38 49
-            1467:   21(ivec4) Load 1466
-            1468:  101(ivec2) VectorShuffle 1467 1467 0 1
-            1469:  101(ivec2) GroupNonUniformIAdd 34 ExclusiveScan 1468
-            1470:    102(ptr) AccessChain 27(data) 1465 49
+            1442:   20(ivec4) GroupNonUniformBitwiseOr 34 InclusiveScan 1441
+            1443:     78(ptr) AccessChain 27(data) 1439 38
+                              Store 1443 1442
+            1444:      6(int) Load 8(invocation)
+            1445:    105(ptr) AccessChain 27(data) 29 51 30
+            1446:      6(int) Load 1445
+            1447:      6(int) GroupNonUniformBitwiseOr 34 InclusiveScan 1446
+            1448:    105(ptr) AccessChain 27(data) 1444 51 30
+                              Store 1448 1447
+            1449:      6(int) Load 8(invocation)
+            1450:    112(ptr) AccessChain 27(data) 38 51
+            1451:   21(ivec4) Load 1450
+            1452:  111(ivec2) VectorShuffle 1451 1451 0 1
+            1453:  111(ivec2) GroupNonUniformBitwiseOr 34 InclusiveScan 1452
+            1454:    105(ptr) AccessChain 27(data) 1449 51 30
+            1455:      6(int) CompositeExtract 1453 0
+                              Store 1454 1455
+            1456:    105(ptr) AccessChain 27(data) 1449 51 47
+            1457:      6(int) CompositeExtract 1453 1
+                              Store 1456 1457
+            1458:      6(int) Load 8(invocation)
+            1459:    112(ptr) AccessChain 27(data) 51 51
+            1460:   21(ivec4) Load 1459
+            1461:  122(ivec3) VectorShuffle 1460 1460 0 1 2
+            1462:  122(ivec3) GroupNonUniformBitwiseOr 34 InclusiveScan 1461
+            1463:    105(ptr) AccessChain 27(data) 1458 51 30
+            1464:      6(int) CompositeExtract 1462 0
+                              Store 1463 1464
+            1465:    105(ptr) AccessChain 27(data) 1458 51 47
+            1466:      6(int) CompositeExtract 1462 1
+                              Store 1465 1466
+            1467:    105(ptr) AccessChain 27(data) 1458 51 61
+            1468:      6(int) CompositeExtract 1462 2
+                              Store 1467 1468
+            1469:      6(int) Load 8(invocation)
+            1470:    112(ptr) AccessChain 27(data) 65 51
             1471:   21(ivec4) Load 1470
-            1472:   21(ivec4) VectorShuffle 1471 1469 4 5 2 3
-                              Store 1470 1472
-            1473:      6(int) Load 8(invocation)
-            1474:    102(ptr) AccessChain 27(data) 49 49
-            1475:   21(ivec4) Load 1474
-            1476:  111(ivec3) VectorShuffle 1475 1475 0 1 2
-            1477:  111(ivec3) GroupNonUniformIAdd 34 ExclusiveScan 1476
-            1478:    102(ptr) AccessChain 27(data) 1473 49
-            1479:   21(ivec4) Load 1478
-            1480:   21(ivec4) VectorShuffle 1479 1477 4 5 6 3
-                              Store 1478 1480
+            1472:   21(ivec4) GroupNonUniformBitwiseOr 34 InclusiveScan 1471
+            1473:    112(ptr) AccessChain 27(data) 1469 51
+                              Store 1473 1472
+            1474:      6(int) Load 8(invocation)
+            1475:     71(ptr) AccessChain 27(data) 29 38 30
+            1476:     19(int) Load 1475
+            1477:   595(bool) SLessThan 1476 29
+            1478:   595(bool) GroupNonUniformLogicalOr 34 InclusiveScan 1477
+            1479:     19(int) Select 1478 38 29
+            1480:     71(ptr) AccessChain 27(data) 1474 38 30
+                              Store 1480 1479
             1481:      6(int) Load 8(invocation)
-            1482:    102(ptr) AccessChain 27(data) 59 49
-            1483:   21(ivec4) Load 1482
-            1484:   21(ivec4) GroupNonUniformIAdd 34 ExclusiveScan 1483
-            1485:    102(ptr) AccessChain 27(data) 1481 49
-                              Store 1485 1484
-            1486:      6(int) Load 8(invocation)
-            1487:    125(ptr) AccessChain 27(data) 29 59 30
-            1488:22(float64_t) Load 1487
-            1489:22(float64_t) GroupNonUniformFAdd 34 ExclusiveScan 1488
-            1490:    125(ptr) AccessChain 27(data) 1486 59 30
-                              Store 1490 1489
-            1491:      6(int) Load 8(invocation)
-            1492:    132(ptr) AccessChain 27(data) 38 59
-            1493: 23(f64vec4) Load 1492
-            1494:131(f64vec2) VectorShuffle 1493 1493 0 1
-            1495:131(f64vec2) GroupNonUniformFAdd 34 ExclusiveScan 1494
-            1496:    132(ptr) AccessChain 27(data) 1491 59
-            1497: 23(f64vec4) Load 1496
-            1498: 23(f64vec4) VectorShuffle 1497 1495 4 5 2 3
-                              Store 1496 1498
-            1499:      6(int) Load 8(invocation)
-            1500:    132(ptr) AccessChain 27(data) 49 59
-            1501: 23(f64vec4) Load 1500
-            1502:141(f64vec3) VectorShuffle 1501 1501 0 1 2
-            1503:141(f64vec3) GroupNonUniformFAdd 34 ExclusiveScan 1502
-            1504:    132(ptr) AccessChain 27(data) 1499 59
-            1505: 23(f64vec4) Load 1504
-            1506: 23(f64vec4) VectorShuffle 1505 1503 4 5 6 3
-                              Store 1504 1506
-            1507:      6(int) Load 8(invocation)
-            1508:    132(ptr) AccessChain 27(data) 59 59
-            1509: 23(f64vec4) Load 1508
-            1510: 23(f64vec4) GroupNonUniformFAdd 34 ExclusiveScan 1509
-            1511:    132(ptr) AccessChain 27(data) 1507 59
+            1482:     78(ptr) AccessChain 27(data) 38 38
+            1483:   20(ivec4) Load 1482
+            1484:   77(ivec2) VectorShuffle 1483 1483 0 1
+            1485:  605(bvec2) SLessThan 1484 604
+            1486:  605(bvec2) GroupNonUniformLogicalOr 34 InclusiveScan 1485
+            1487:   77(ivec2) Select 1486 608 604
+            1488:     71(ptr) AccessChain 27(data) 1481 38 30
+            1489:     19(int) CompositeExtract 1487 0
+                              Store 1488 1489
+            1490:     71(ptr) AccessChain 27(data) 1481 38 47
+            1491:     19(int) CompositeExtract 1487 1
+                              Store 1490 1491
+            1492:      6(int) Load 8(invocation)
+            1493:     78(ptr) AccessChain 27(data) 38 38
+            1494:   20(ivec4) Load 1493
+            1495:   88(ivec3) VectorShuffle 1494 1494 0 1 2
+            1496:  619(bvec3) SLessThan 1495 618
+            1497:  619(bvec3) GroupNonUniformLogicalOr 34 InclusiveScan 1496
+            1498:   88(ivec3) Select 1497 622 618
+            1499:     71(ptr) AccessChain 27(data) 1492 38 30
+            1500:     19(int) CompositeExtract 1498 0
+                              Store 1499 1500
+            1501:     71(ptr) AccessChain 27(data) 1492 38 47
+            1502:     19(int) CompositeExtract 1498 1
+                              Store 1501 1502
+            1503:     71(ptr) AccessChain 27(data) 1492 38 61
+            1504:     19(int) CompositeExtract 1498 2
+                              Store 1503 1504
+            1505:      6(int) Load 8(invocation)
+            1506:     78(ptr) AccessChain 27(data) 38 38
+            1507:   20(ivec4) Load 1506
+            1508:  634(bvec4) SLessThan 1507 633
+            1509:  634(bvec4) GroupNonUniformLogicalOr 34 InclusiveScan 1508
+            1510:   20(ivec4) Select 1509 637 633
+            1511:     78(ptr) AccessChain 27(data) 1505 38
                               Store 1511 1510
             1512:      6(int) Load 8(invocation)
-            1513:     31(ptr) AccessChain 27(data) 29 29 30
-            1514:   17(float) Load 1513
-            1515:   17(float) GroupNonUniformFMul 34 ExclusiveScan 1514
-            1516:     31(ptr) AccessChain 27(data) 1512 29 30
+            1513:     71(ptr) AccessChain 27(data) 29 38 30
+            1514:     19(int) Load 1513
+            1515:     19(int) GroupNonUniformBitwiseXor 34 InclusiveScan 1514
+            1516:     71(ptr) AccessChain 27(data) 1512 38 30
                               Store 1516 1515
             1517:      6(int) Load 8(invocation)
-            1518:     40(ptr) AccessChain 27(data) 38 29
-            1519:   18(fvec4) Load 1518
-            1520:   39(fvec2) VectorShuffle 1519 1519 0 1
-            1521:   39(fvec2) GroupNonUniformFMul 34 ExclusiveScan 1520
-            1522:     40(ptr) AccessChain 27(data) 1517 29
-            1523:   18(fvec4) Load 1522
-            1524:   18(fvec4) VectorShuffle 1523 1521 4 5 2 3
-                              Store 1522 1524
-            1525:      6(int) Load 8(invocation)
-            1526:     40(ptr) AccessChain 27(data) 49 29
-            1527:   18(fvec4) Load 1526
-            1528:   50(fvec3) VectorShuffle 1527 1527 0 1 2
-            1529:   50(fvec3) GroupNonUniformFMul 34 ExclusiveScan 1528
-            1530:     40(ptr) AccessChain 27(data) 1525 29
-            1531:   18(fvec4) Load 1530
-            1532:   18(fvec4) VectorShuffle 1531 1529 4 5 6 3
-                              Store 1530 1532
-            1533:      6(int) Load 8(invocation)
-            1534:     40(ptr) AccessChain 27(data) 59 29
-            1535:   18(fvec4) Load 1534
-            1536:   18(fvec4) GroupNonUniformFMul 34 ExclusiveScan 1535
-            1537:     40(ptr) AccessChain 27(data) 1533 29
-                              Store 1537 1536
-            1538:      6(int) Load 8(invocation)
-            1539:     65(ptr) AccessChain 27(data) 29 38 30
-            1540:     19(int) Load 1539
-            1541:     19(int) GroupNonUniformIMul 34 ExclusiveScan 1540
-            1542:     65(ptr) AccessChain 27(data) 1538 38 30
-                              Store 1542 1541
-            1543:      6(int) Load 8(invocation)
-            1544:     72(ptr) AccessChain 27(data) 38 38
-            1545:   20(ivec4) Load 1544
-            1546:   71(ivec2) VectorShuffle 1545 1545 0 1
-            1547:   71(ivec2) GroupNonUniformIMul 34 ExclusiveScan 1546
-            1548:     72(ptr) AccessChain 27(data) 1543 38
-            1549:   20(ivec4) Load 1548
-            1550:   20(ivec4) VectorShuffle 1549 1547 4 5 2 3
-                              Store 1548 1550
-            1551:      6(int) Load 8(invocation)
-            1552:     72(ptr) AccessChain 27(data) 49 38
-            1553:   20(ivec4) Load 1552
-            1554:   81(ivec3) VectorShuffle 1553 1553 0 1 2
-            1555:   81(ivec3) GroupNonUniformIMul 34 ExclusiveScan 1554
-            1556:     72(ptr) AccessChain 27(data) 1551 38
-            1557:   20(ivec4) Load 1556
-            1558:   20(ivec4) VectorShuffle 1557 1555 4 5 6 3
-                              Store 1556 1558
-            1559:      6(int) Load 8(invocation)
-            1560:     72(ptr) AccessChain 27(data) 59 38
-            1561:   20(ivec4) Load 1560
-            1562:   20(ivec4) GroupNonUniformIMul 34 ExclusiveScan 1561
-            1563:     72(ptr) AccessChain 27(data) 1559 38
-                              Store 1563 1562
-            1564:      6(int) Load 8(invocation)
-            1565:     95(ptr) AccessChain 27(data) 29 49 30
-            1566:      6(int) Load 1565
-            1567:      6(int) GroupNonUniformIMul 34 ExclusiveScan 1566
-            1568:     95(ptr) AccessChain 27(data) 1564 49 30
-                              Store 1568 1567
-            1569:      6(int) Load 8(invocation)
-            1570:    102(ptr) AccessChain 27(data) 38 49
-            1571:   21(ivec4) Load 1570
-            1572:  101(ivec2) VectorShuffle 1571 1571 0 1
-            1573:  101(ivec2) GroupNonUniformIMul 34 ExclusiveScan 1572
-            1574:    102(ptr) AccessChain 27(data) 1569 49
-            1575:   21(ivec4) Load 1574
-            1576:   21(ivec4) VectorShuffle 1575 1573 4 5 2 3
-                              Store 1574 1576
-            1577:      6(int) Load 8(invocation)
-            1578:    102(ptr) AccessChain 27(data) 49 49
-            1579:   21(ivec4) Load 1578
-            1580:  111(ivec3) VectorShuffle 1579 1579 0 1 2
-            1581:  111(ivec3) GroupNonUniformIMul 34 ExclusiveScan 1580
-            1582:    102(ptr) AccessChain 27(data) 1577 49
-            1583:   21(ivec4) Load 1582
-            1584:   21(ivec4) VectorShuffle 1583 1581 4 5 6 3
-                              Store 1582 1584
-            1585:      6(int) Load 8(invocation)
-            1586:    102(ptr) AccessChain 27(data) 59 49
-            1587:   21(ivec4) Load 1586
-            1588:   21(ivec4) GroupNonUniformIMul 34 ExclusiveScan 1587
-            1589:    102(ptr) AccessChain 27(data) 1585 49
-                              Store 1589 1588
+            1518:     78(ptr) AccessChain 27(data) 38 38
+            1519:   20(ivec4) Load 1518
+            1520:   77(ivec2) VectorShuffle 1519 1519 0 1
+            1521:   77(ivec2) GroupNonUniformBitwiseXor 34 InclusiveScan 1520
+            1522:     71(ptr) AccessChain 27(data) 1517 38 30
+            1523:     19(int) CompositeExtract 1521 0
+                              Store 1522 1523
+            1524:     71(ptr) AccessChain 27(data) 1517 38 47
+            1525:     19(int) CompositeExtract 1521 1
+                              Store 1524 1525
+            1526:      6(int) Load 8(invocation)
+            1527:     78(ptr) AccessChain 27(data) 51 38
+            1528:   20(ivec4) Load 1527
+            1529:   88(ivec3) VectorShuffle 1528 1528 0 1 2
+            1530:   88(ivec3) GroupNonUniformBitwiseXor 34 InclusiveScan 1529
+            1531:     71(ptr) AccessChain 27(data) 1526 38 30
+            1532:     19(int) CompositeExtract 1530 0
+                              Store 1531 1532
+            1533:     71(ptr) AccessChain 27(data) 1526 38 47
+            1534:     19(int) CompositeExtract 1530 1
+                              Store 1533 1534
+            1535:     71(ptr) AccessChain 27(data) 1526 38 61
+            1536:     19(int) CompositeExtract 1530 2
+                              Store 1535 1536
+            1537:      6(int) Load 8(invocation)
+            1538:     78(ptr) AccessChain 27(data) 65 38
+            1539:   20(ivec4) Load 1538
+            1540:   20(ivec4) GroupNonUniformBitwiseXor 34 InclusiveScan 1539
+            1541:     78(ptr) AccessChain 27(data) 1537 38
+                              Store 1541 1540
+            1542:      6(int) Load 8(invocation)
+            1543:    105(ptr) AccessChain 27(data) 29 51 30
+            1544:      6(int) Load 1543
+            1545:      6(int) GroupNonUniformBitwiseXor 34 InclusiveScan 1544
+            1546:    105(ptr) AccessChain 27(data) 1542 51 30
+                              Store 1546 1545
+            1547:      6(int) Load 8(invocation)
+            1548:    112(ptr) AccessChain 27(data) 38 51
+            1549:   21(ivec4) Load 1548
+            1550:  111(ivec2) VectorShuffle 1549 1549 0 1
+            1551:  111(ivec2) GroupNonUniformBitwiseXor 34 InclusiveScan 1550
+            1552:    105(ptr) AccessChain 27(data) 1547 51 30
+            1553:      6(int) CompositeExtract 1551 0
+                              Store 1552 1553
+            1554:    105(ptr) AccessChain 27(data) 1547 51 47
+            1555:      6(int) CompositeExtract 1551 1
+                              Store 1554 1555
+            1556:      6(int) Load 8(invocation)
+            1557:    112(ptr) AccessChain 27(data) 51 51
+            1558:   21(ivec4) Load 1557
+            1559:  122(ivec3) VectorShuffle 1558 1558 0 1 2
+            1560:  122(ivec3) GroupNonUniformBitwiseXor 34 InclusiveScan 1559
+            1561:    105(ptr) AccessChain 27(data) 1556 51 30
+            1562:      6(int) CompositeExtract 1560 0
+                              Store 1561 1562
+            1563:    105(ptr) AccessChain 27(data) 1556 51 47
+            1564:      6(int) CompositeExtract 1560 1
+                              Store 1563 1564
+            1565:    105(ptr) AccessChain 27(data) 1556 51 61
+            1566:      6(int) CompositeExtract 1560 2
+                              Store 1565 1566
+            1567:      6(int) Load 8(invocation)
+            1568:    112(ptr) AccessChain 27(data) 65 51
+            1569:   21(ivec4) Load 1568
+            1570:   21(ivec4) GroupNonUniformBitwiseXor 34 InclusiveScan 1569
+            1571:    112(ptr) AccessChain 27(data) 1567 51
+                              Store 1571 1570
+            1572:      6(int) Load 8(invocation)
+            1573:     71(ptr) AccessChain 27(data) 29 38 30
+            1574:     19(int) Load 1573
+            1575:   595(bool) SLessThan 1574 29
+            1576:   595(bool) GroupNonUniformLogicalXor 34 InclusiveScan 1575
+            1577:     19(int) Select 1576 38 29
+            1578:     71(ptr) AccessChain 27(data) 1572 38 30
+                              Store 1578 1577
+            1579:      6(int) Load 8(invocation)
+            1580:     78(ptr) AccessChain 27(data) 38 38
+            1581:   20(ivec4) Load 1580
+            1582:   77(ivec2) VectorShuffle 1581 1581 0 1
+            1583:  605(bvec2) SLessThan 1582 604
+            1584:  605(bvec2) GroupNonUniformLogicalXor 34 InclusiveScan 1583
+            1585:   77(ivec2) Select 1584 608 604
+            1586:     71(ptr) AccessChain 27(data) 1579 38 30
+            1587:     19(int) CompositeExtract 1585 0
+                              Store 1586 1587
+            1588:     71(ptr) AccessChain 27(data) 1579 38 47
+            1589:     19(int) CompositeExtract 1585 1
+                              Store 1588 1589
             1590:      6(int) Load 8(invocation)
-            1591:    125(ptr) AccessChain 27(data) 29 59 30
-            1592:22(float64_t) Load 1591
-            1593:22(float64_t) GroupNonUniformFMul 34 ExclusiveScan 1592
-            1594:    125(ptr) AccessChain 27(data) 1590 59 30
-                              Store 1594 1593
-            1595:      6(int) Load 8(invocation)
-            1596:    132(ptr) AccessChain 27(data) 38 59
-            1597: 23(f64vec4) Load 1596
-            1598:131(f64vec2) VectorShuffle 1597 1597 0 1
-            1599:131(f64vec2) GroupNonUniformFMul 34 ExclusiveScan 1598
-            1600:    132(ptr) AccessChain 27(data) 1595 59
-            1601: 23(f64vec4) Load 1600
-            1602: 23(f64vec4) VectorShuffle 1601 1599 4 5 2 3
-                              Store 1600 1602
+            1591:     78(ptr) AccessChain 27(data) 38 38
+            1592:   20(ivec4) Load 1591
+            1593:   88(ivec3) VectorShuffle 1592 1592 0 1 2
+            1594:  619(bvec3) SLessThan 1593 618
+            1595:  619(bvec3) GroupNonUniformLogicalXor 34 InclusiveScan 1594
+            1596:   88(ivec3) Select 1595 622 618
+            1597:     71(ptr) AccessChain 27(data) 1590 38 30
+            1598:     19(int) CompositeExtract 1596 0
+                              Store 1597 1598
+            1599:     71(ptr) AccessChain 27(data) 1590 38 47
+            1600:     19(int) CompositeExtract 1596 1
+                              Store 1599 1600
+            1601:     71(ptr) AccessChain 27(data) 1590 38 61
+            1602:     19(int) CompositeExtract 1596 2
+                              Store 1601 1602
             1603:      6(int) Load 8(invocation)
-            1604:    132(ptr) AccessChain 27(data) 49 59
-            1605: 23(f64vec4) Load 1604
-            1606:141(f64vec3) VectorShuffle 1605 1605 0 1 2
-            1607:141(f64vec3) GroupNonUniformFMul 34 ExclusiveScan 1606
-            1608:    132(ptr) AccessChain 27(data) 1603 59
-            1609: 23(f64vec4) Load 1608
-            1610: 23(f64vec4) VectorShuffle 1609 1607 4 5 6 3
-                              Store 1608 1610
-            1611:      6(int) Load 8(invocation)
-            1612:    132(ptr) AccessChain 27(data) 59 59
-            1613: 23(f64vec4) Load 1612
-            1614: 23(f64vec4) GroupNonUniformFMul 34 ExclusiveScan 1613
-            1615:    132(ptr) AccessChain 27(data) 1611 59
-                              Store 1615 1614
-            1616:      6(int) Load 8(invocation)
-            1617:     31(ptr) AccessChain 27(data) 29 29 30
-            1618:   17(float) Load 1617
-            1619:   17(float) GroupNonUniformFMin 34 ExclusiveScan 1618
-            1620:     31(ptr) AccessChain 27(data) 1616 29 30
-                              Store 1620 1619
-            1621:      6(int) Load 8(invocation)
-            1622:     40(ptr) AccessChain 27(data) 38 29
-            1623:   18(fvec4) Load 1622
-            1624:   39(fvec2) VectorShuffle 1623 1623 0 1
-            1625:   39(fvec2) GroupNonUniformFMin 34 ExclusiveScan 1624
-            1626:     40(ptr) AccessChain 27(data) 1621 29
-            1627:   18(fvec4) Load 1626
-            1628:   18(fvec4) VectorShuffle 1627 1625 4 5 2 3
-                              Store 1626 1628
-            1629:      6(int) Load 8(invocation)
-            1630:     40(ptr) AccessChain 27(data) 49 29
-            1631:   18(fvec4) Load 1630
-            1632:   50(fvec3) VectorShuffle 1631 1631 0 1 2
-            1633:   50(fvec3) GroupNonUniformFMin 34 ExclusiveScan 1632
-            1634:     40(ptr) AccessChain 27(data) 1629 29
-            1635:   18(fvec4) Load 1634
-            1636:   18(fvec4) VectorShuffle 1635 1633 4 5 6 3
-                              Store 1634 1636
-            1637:      6(int) Load 8(invocation)
-            1638:     40(ptr) AccessChain 27(data) 59 29
-            1639:   18(fvec4) Load 1638
-            1640:   18(fvec4) GroupNonUniformFMin 34 ExclusiveScan 1639
-            1641:     40(ptr) AccessChain 27(data) 1637 29
-                              Store 1641 1640
-            1642:      6(int) Load 8(invocation)
-            1643:     65(ptr) AccessChain 27(data) 29 38 30
-            1644:     19(int) Load 1643
-            1645:     19(int) GroupNonUniformSMin 34 ExclusiveScan 1644
-            1646:     65(ptr) AccessChain 27(data) 1642 38 30
-                              Store 1646 1645
-            1647:      6(int) Load 8(invocation)
-            1648:     72(ptr) AccessChain 27(data) 38 38
-            1649:   20(ivec4) Load 1648
-            1650:   71(ivec2) VectorShuffle 1649 1649 0 1
-            1651:   71(ivec2) GroupNonUniformSMin 34 ExclusiveScan 1650
-            1652:     72(ptr) AccessChain 27(data) 1647 38
-            1653:   20(ivec4) Load 1652
-            1654:   20(ivec4) VectorShuffle 1653 1651 4 5 2 3
-                              Store 1652 1654
-            1655:      6(int) Load 8(invocation)
-            1656:     72(ptr) AccessChain 27(data) 49 38
-            1657:   20(ivec4) Load 1656
-            1658:   81(ivec3) VectorShuffle 1657 1657 0 1 2
-            1659:   81(ivec3) GroupNonUniformSMin 34 ExclusiveScan 1658
-            1660:     72(ptr) AccessChain 27(data) 1655 38
-            1661:   20(ivec4) Load 1660
-            1662:   20(ivec4) VectorShuffle 1661 1659 4 5 6 3
-                              Store 1660 1662
-            1663:      6(int) Load 8(invocation)
-            1664:     72(ptr) AccessChain 27(data) 59 38
-            1665:   20(ivec4) Load 1664
-            1666:   20(ivec4) GroupNonUniformSMin 34 ExclusiveScan 1665
-            1667:     72(ptr) AccessChain 27(data) 1663 38
-                              Store 1667 1666
-            1668:      6(int) Load 8(invocation)
-            1669:     95(ptr) AccessChain 27(data) 29 49 30
-            1670:      6(int) Load 1669
-            1671:      6(int) GroupNonUniformUMin 34 ExclusiveScan 1670
-            1672:     95(ptr) AccessChain 27(data) 1668 49 30
-                              Store 1672 1671
-            1673:      6(int) Load 8(invocation)
-            1674:    102(ptr) AccessChain 27(data) 38 49
-            1675:   21(ivec4) Load 1674
-            1676:  101(ivec2) VectorShuffle 1675 1675 0 1
-            1677:  101(ivec2) GroupNonUniformUMin 34 ExclusiveScan 1676
-            1678:    102(ptr) AccessChain 27(data) 1673 49
-            1679:   21(ivec4) Load 1678
-            1680:   21(ivec4) VectorShuffle 1679 1677 4 5 2 3
-                              Store 1678 1680
-            1681:      6(int) Load 8(invocation)
-            1682:    102(ptr) AccessChain 27(data) 49 49
-            1683:   21(ivec4) Load 1682
-            1684:  111(ivec3) VectorShuffle 1683 1683 0 1 2
-            1685:  111(ivec3) GroupNonUniformUMin 34 ExclusiveScan 1684
-            1686:    102(ptr) AccessChain 27(data) 1681 49
-            1687:   21(ivec4) Load 1686
-            1688:   21(ivec4) VectorShuffle 1687 1685 4 5 6 3
-                              Store 1686 1688
-            1689:      6(int) Load 8(invocation)
-            1690:    102(ptr) AccessChain 27(data) 59 49
-            1691:   21(ivec4) Load 1690
-            1692:   21(ivec4) GroupNonUniformUMin 34 ExclusiveScan 1691
-            1693:    102(ptr) AccessChain 27(data) 1689 49
-                              Store 1693 1692
-            1694:      6(int) Load 8(invocation)
-            1695:    125(ptr) AccessChain 27(data) 29 59 30
-            1696:22(float64_t) Load 1695
-            1697:22(float64_t) GroupNonUniformFMin 34 ExclusiveScan 1696
-            1698:    125(ptr) AccessChain 27(data) 1694 59 30
-                              Store 1698 1697
-            1699:      6(int) Load 8(invocation)
-            1700:    132(ptr) AccessChain 27(data) 38 59
-            1701: 23(f64vec4) Load 1700
-            1702:131(f64vec2) VectorShuffle 1701 1701 0 1
-            1703:131(f64vec2) GroupNonUniformFMin 34 ExclusiveScan 1702
-            1704:    132(ptr) AccessChain 27(data) 1699 59
-            1705: 23(f64vec4) Load 1704
-            1706: 23(f64vec4) VectorShuffle 1705 1703 4 5 2 3
-                              Store 1704 1706
-            1707:      6(int) Load 8(invocation)
-            1708:    132(ptr) AccessChain 27(data) 49 59
-            1709: 23(f64vec4) Load 1708
-            1710:141(f64vec3) VectorShuffle 1709 1709 0 1 2
-            1711:141(f64vec3) GroupNonUniformFMin 34 ExclusiveScan 1710
-            1712:    132(ptr) AccessChain 27(data) 1707 59
-            1713: 23(f64vec4) Load 1712
-            1714: 23(f64vec4) VectorShuffle 1713 1711 4 5 6 3
-                              Store 1712 1714
-            1715:      6(int) Load 8(invocation)
-            1716:    132(ptr) AccessChain 27(data) 59 59
-            1717: 23(f64vec4) Load 1716
-            1718: 23(f64vec4) GroupNonUniformFMin 34 ExclusiveScan 1717
-            1719:    132(ptr) AccessChain 27(data) 1715 59
-                              Store 1719 1718
-            1720:      6(int) Load 8(invocation)
-            1721:     31(ptr) AccessChain 27(data) 29 29 30
-            1722:   17(float) Load 1721
-            1723:   17(float) GroupNonUniformFMax 34 ExclusiveScan 1722
-            1724:     31(ptr) AccessChain 27(data) 1720 29 30
-                              Store 1724 1723
+            1604:     78(ptr) AccessChain 27(data) 38 38
+            1605:   20(ivec4) Load 1604
+            1606:  634(bvec4) SLessThan 1605 633
+            1607:  634(bvec4) GroupNonUniformLogicalXor 34 InclusiveScan 1606
+            1608:   20(ivec4) Select 1607 637 633
+            1609:     78(ptr) AccessChain 27(data) 1603 38
+                              Store 1609 1608
+            1610:      6(int) Load 8(invocation)
+            1611:     31(ptr) AccessChain 27(data) 29 29 30
+            1612:   17(float) Load 1611
+            1613:   17(float) GroupNonUniformFAdd 34 ExclusiveScan 1612
+            1614:     31(ptr) AccessChain 27(data) 1610 29 30
+                              Store 1614 1613
+            1615:      6(int) Load 8(invocation)
+            1616:     40(ptr) AccessChain 27(data) 38 29
+            1617:   18(fvec4) Load 1616
+            1618:   39(fvec2) VectorShuffle 1617 1617 0 1
+            1619:   39(fvec2) GroupNonUniformFAdd 34 ExclusiveScan 1618
+            1620:     31(ptr) AccessChain 27(data) 1615 29 30
+            1621:   17(float) CompositeExtract 1619 0
+                              Store 1620 1621
+            1622:     31(ptr) AccessChain 27(data) 1615 29 47
+            1623:   17(float) CompositeExtract 1619 1
+                              Store 1622 1623
+            1624:      6(int) Load 8(invocation)
+            1625:     40(ptr) AccessChain 27(data) 51 29
+            1626:   18(fvec4) Load 1625
+            1627:   52(fvec3) VectorShuffle 1626 1626 0 1 2
+            1628:   52(fvec3) GroupNonUniformFAdd 34 ExclusiveScan 1627
+            1629:     31(ptr) AccessChain 27(data) 1624 29 30
+            1630:   17(float) CompositeExtract 1628 0
+                              Store 1629 1630
+            1631:     31(ptr) AccessChain 27(data) 1624 29 47
+            1632:   17(float) CompositeExtract 1628 1
+                              Store 1631 1632
+            1633:     31(ptr) AccessChain 27(data) 1624 29 61
+            1634:   17(float) CompositeExtract 1628 2
+                              Store 1633 1634
+            1635:      6(int) Load 8(invocation)
+            1636:     40(ptr) AccessChain 27(data) 65 29
+            1637:   18(fvec4) Load 1636
+            1638:   18(fvec4) GroupNonUniformFAdd 34 ExclusiveScan 1637
+            1639:     40(ptr) AccessChain 27(data) 1635 29
+                              Store 1639 1638
+            1640:      6(int) Load 8(invocation)
+            1641:     71(ptr) AccessChain 27(data) 29 38 30
+            1642:     19(int) Load 1641
+            1643:     19(int) GroupNonUniformIAdd 34 ExclusiveScan 1642
+            1644:     71(ptr) AccessChain 27(data) 1640 38 30
+                              Store 1644 1643
+            1645:      6(int) Load 8(invocation)
+            1646:     78(ptr) AccessChain 27(data) 38 38
+            1647:   20(ivec4) Load 1646
+            1648:   77(ivec2) VectorShuffle 1647 1647 0 1
+            1649:   77(ivec2) GroupNonUniformIAdd 34 ExclusiveScan 1648
+            1650:     71(ptr) AccessChain 27(data) 1645 38 30
+            1651:     19(int) CompositeExtract 1649 0
+                              Store 1650 1651
+            1652:     71(ptr) AccessChain 27(data) 1645 38 47
+            1653:     19(int) CompositeExtract 1649 1
+                              Store 1652 1653
+            1654:      6(int) Load 8(invocation)
+            1655:     78(ptr) AccessChain 27(data) 51 38
+            1656:   20(ivec4) Load 1655
+            1657:   88(ivec3) VectorShuffle 1656 1656 0 1 2
+            1658:   88(ivec3) GroupNonUniformIAdd 34 ExclusiveScan 1657
+            1659:     71(ptr) AccessChain 27(data) 1654 38 30
+            1660:     19(int) CompositeExtract 1658 0
+                              Store 1659 1660
+            1661:     71(ptr) AccessChain 27(data) 1654 38 47
+            1662:     19(int) CompositeExtract 1658 1
+                              Store 1661 1662
+            1663:     71(ptr) AccessChain 27(data) 1654 38 61
+            1664:     19(int) CompositeExtract 1658 2
+                              Store 1663 1664
+            1665:      6(int) Load 8(invocation)
+            1666:     78(ptr) AccessChain 27(data) 65 38
+            1667:   20(ivec4) Load 1666
+            1668:   20(ivec4) GroupNonUniformIAdd 34 ExclusiveScan 1667
+            1669:     78(ptr) AccessChain 27(data) 1665 38
+                              Store 1669 1668
+            1670:      6(int) Load 8(invocation)
+            1671:    105(ptr) AccessChain 27(data) 29 51 30
+            1672:      6(int) Load 1671
+            1673:      6(int) GroupNonUniformIAdd 34 ExclusiveScan 1672
+            1674:    105(ptr) AccessChain 27(data) 1670 51 30
+                              Store 1674 1673
+            1675:      6(int) Load 8(invocation)
+            1676:    112(ptr) AccessChain 27(data) 38 51
+            1677:   21(ivec4) Load 1676
+            1678:  111(ivec2) VectorShuffle 1677 1677 0 1
+            1679:  111(ivec2) GroupNonUniformIAdd 34 ExclusiveScan 1678
+            1680:    105(ptr) AccessChain 27(data) 1675 51 30
+            1681:      6(int) CompositeExtract 1679 0
+                              Store 1680 1681
+            1682:    105(ptr) AccessChain 27(data) 1675 51 47
+            1683:      6(int) CompositeExtract 1679 1
+                              Store 1682 1683
+            1684:      6(int) Load 8(invocation)
+            1685:    112(ptr) AccessChain 27(data) 51 51
+            1686:   21(ivec4) Load 1685
+            1687:  122(ivec3) VectorShuffle 1686 1686 0 1 2
+            1688:  122(ivec3) GroupNonUniformIAdd 34 ExclusiveScan 1687
+            1689:    105(ptr) AccessChain 27(data) 1684 51 30
+            1690:      6(int) CompositeExtract 1688 0
+                              Store 1689 1690
+            1691:    105(ptr) AccessChain 27(data) 1684 51 47
+            1692:      6(int) CompositeExtract 1688 1
+                              Store 1691 1692
+            1693:    105(ptr) AccessChain 27(data) 1684 51 61
+            1694:      6(int) CompositeExtract 1688 2
+                              Store 1693 1694
+            1695:      6(int) Load 8(invocation)
+            1696:    112(ptr) AccessChain 27(data) 65 51
+            1697:   21(ivec4) Load 1696
+            1698:   21(ivec4) GroupNonUniformIAdd 34 ExclusiveScan 1697
+            1699:    112(ptr) AccessChain 27(data) 1695 51
+                              Store 1699 1698
+            1700:      6(int) Load 8(invocation)
+            1701:    139(ptr) AccessChain 27(data) 29 65 30
+            1702:22(float64_t) Load 1701
+            1703:22(float64_t) GroupNonUniformFAdd 34 ExclusiveScan 1702
+            1704:    139(ptr) AccessChain 27(data) 1700 65 30
+                              Store 1704 1703
+            1705:      6(int) Load 8(invocation)
+            1706:    146(ptr) AccessChain 27(data) 38 65
+            1707: 23(f64vec4) Load 1706
+            1708:145(f64vec2) VectorShuffle 1707 1707 0 1
+            1709:145(f64vec2) GroupNonUniformFAdd 34 ExclusiveScan 1708
+            1710:    139(ptr) AccessChain 27(data) 1705 65 30
+            1711:22(float64_t) CompositeExtract 1709 0
+                              Store 1710 1711
+            1712:    139(ptr) AccessChain 27(data) 1705 65 47
+            1713:22(float64_t) CompositeExtract 1709 1
+                              Store 1712 1713
+            1714:      6(int) Load 8(invocation)
+            1715:    146(ptr) AccessChain 27(data) 51 65
+            1716: 23(f64vec4) Load 1715
+            1717:156(f64vec3) VectorShuffle 1716 1716 0 1 2
+            1718:156(f64vec3) GroupNonUniformFAdd 34 ExclusiveScan 1717
+            1719:    139(ptr) AccessChain 27(data) 1714 65 30
+            1720:22(float64_t) CompositeExtract 1718 0
+                              Store 1719 1720
+            1721:    139(ptr) AccessChain 27(data) 1714 65 47
+            1722:22(float64_t) CompositeExtract 1718 1
+                              Store 1721 1722
+            1723:    139(ptr) AccessChain 27(data) 1714 65 61
+            1724:22(float64_t) CompositeExtract 1718 2
+                              Store 1723 1724
             1725:      6(int) Load 8(invocation)
-            1726:     40(ptr) AccessChain 27(data) 38 29
-            1727:   18(fvec4) Load 1726
-            1728:   39(fvec2) VectorShuffle 1727 1727 0 1
-            1729:   39(fvec2) GroupNonUniformFMax 34 ExclusiveScan 1728
-            1730:     40(ptr) AccessChain 27(data) 1725 29
-            1731:   18(fvec4) Load 1730
-            1732:   18(fvec4) VectorShuffle 1731 1729 4 5 2 3
-                              Store 1730 1732
-            1733:      6(int) Load 8(invocation)
-            1734:     40(ptr) AccessChain 27(data) 49 29
-            1735:   18(fvec4) Load 1734
-            1736:   50(fvec3) VectorShuffle 1735 1735 0 1 2
-            1737:   50(fvec3) GroupNonUniformFMax 34 ExclusiveScan 1736
-            1738:     40(ptr) AccessChain 27(data) 1733 29
-            1739:   18(fvec4) Load 1738
-            1740:   18(fvec4) VectorShuffle 1739 1737 4 5 6 3
-                              Store 1738 1740
-            1741:      6(int) Load 8(invocation)
-            1742:     40(ptr) AccessChain 27(data) 59 29
-            1743:   18(fvec4) Load 1742
-            1744:   18(fvec4) GroupNonUniformFMax 34 ExclusiveScan 1743
-            1745:     40(ptr) AccessChain 27(data) 1741 29
-                              Store 1745 1744
-            1746:      6(int) Load 8(invocation)
-            1747:     65(ptr) AccessChain 27(data) 29 38 30
-            1748:     19(int) Load 1747
-            1749:     19(int) GroupNonUniformSMax 34 ExclusiveScan 1748
-            1750:     65(ptr) AccessChain 27(data) 1746 38 30
-                              Store 1750 1749
-            1751:      6(int) Load 8(invocation)
-            1752:     72(ptr) AccessChain 27(data) 38 38
-            1753:   20(ivec4) Load 1752
-            1754:   71(ivec2) VectorShuffle 1753 1753 0 1
-            1755:   71(ivec2) GroupNonUniformSMax 34 ExclusiveScan 1754
-            1756:     72(ptr) AccessChain 27(data) 1751 38
-            1757:   20(ivec4) Load 1756
-            1758:   20(ivec4) VectorShuffle 1757 1755 4 5 2 3
-                              Store 1756 1758
-            1759:      6(int) Load 8(invocation)
-            1760:     72(ptr) AccessChain 27(data) 49 38
-            1761:   20(ivec4) Load 1760
-            1762:   81(ivec3) VectorShuffle 1761 1761 0 1 2
-            1763:   81(ivec3) GroupNonUniformSMax 34 ExclusiveScan 1762
-            1764:     72(ptr) AccessChain 27(data) 1759 38
-            1765:   20(ivec4) Load 1764
-            1766:   20(ivec4) VectorShuffle 1765 1763 4 5 6 3
-                              Store 1764 1766
-            1767:      6(int) Load 8(invocation)
-            1768:     72(ptr) AccessChain 27(data) 59 38
-            1769:   20(ivec4) Load 1768
-            1770:   20(ivec4) GroupNonUniformSMax 34 ExclusiveScan 1769
-            1771:     72(ptr) AccessChain 27(data) 1767 38
-                              Store 1771 1770
-            1772:      6(int) Load 8(invocation)
-            1773:     95(ptr) AccessChain 27(data) 29 49 30
-            1774:      6(int) Load 1773
-            1775:      6(int) GroupNonUniformUMax 34 ExclusiveScan 1774
-            1776:     95(ptr) AccessChain 27(data) 1772 49 30
-                              Store 1776 1775
-            1777:      6(int) Load 8(invocation)
-            1778:    102(ptr) AccessChain 27(data) 38 49
-            1779:   21(ivec4) Load 1778
-            1780:  101(ivec2) VectorShuffle 1779 1779 0 1
-            1781:  101(ivec2) GroupNonUniformUMax 34 ExclusiveScan 1780
-            1782:    102(ptr) AccessChain 27(data) 1777 49
-            1783:   21(ivec4) Load 1782
-            1784:   21(ivec4) VectorShuffle 1783 1781 4 5 2 3
-                              Store 1782 1784
+            1726:    146(ptr) AccessChain 27(data) 65 65
+            1727: 23(f64vec4) Load 1726
+            1728: 23(f64vec4) GroupNonUniformFAdd 34 ExclusiveScan 1727
+            1729:    146(ptr) AccessChain 27(data) 1725 65
+                              Store 1729 1728
+            1730:      6(int) Load 8(invocation)
+            1731:     31(ptr) AccessChain 27(data) 29 29 30
+            1732:   17(float) Load 1731
+            1733:   17(float) GroupNonUniformFMul 34 ExclusiveScan 1732
+            1734:     31(ptr) AccessChain 27(data) 1730 29 30
+                              Store 1734 1733
+            1735:      6(int) Load 8(invocation)
+            1736:     40(ptr) AccessChain 27(data) 38 29
+            1737:   18(fvec4) Load 1736
+            1738:   39(fvec2) VectorShuffle 1737 1737 0 1
+            1739:   39(fvec2) GroupNonUniformFMul 34 ExclusiveScan 1738
+            1740:     31(ptr) AccessChain 27(data) 1735 29 30
+            1741:   17(float) CompositeExtract 1739 0
+                              Store 1740 1741
+            1742:     31(ptr) AccessChain 27(data) 1735 29 47
+            1743:   17(float) CompositeExtract 1739 1
+                              Store 1742 1743
+            1744:      6(int) Load 8(invocation)
+            1745:     40(ptr) AccessChain 27(data) 51 29
+            1746:   18(fvec4) Load 1745
+            1747:   52(fvec3) VectorShuffle 1746 1746 0 1 2
+            1748:   52(fvec3) GroupNonUniformFMul 34 ExclusiveScan 1747
+            1749:     31(ptr) AccessChain 27(data) 1744 29 30
+            1750:   17(float) CompositeExtract 1748 0
+                              Store 1749 1750
+            1751:     31(ptr) AccessChain 27(data) 1744 29 47
+            1752:   17(float) CompositeExtract 1748 1
+                              Store 1751 1752
+            1753:     31(ptr) AccessChain 27(data) 1744 29 61
+            1754:   17(float) CompositeExtract 1748 2
+                              Store 1753 1754
+            1755:      6(int) Load 8(invocation)
+            1756:     40(ptr) AccessChain 27(data) 65 29
+            1757:   18(fvec4) Load 1756
+            1758:   18(fvec4) GroupNonUniformFMul 34 ExclusiveScan 1757
+            1759:     40(ptr) AccessChain 27(data) 1755 29
+                              Store 1759 1758
+            1760:      6(int) Load 8(invocation)
+            1761:     71(ptr) AccessChain 27(data) 29 38 30
+            1762:     19(int) Load 1761
+            1763:     19(int) GroupNonUniformIMul 34 ExclusiveScan 1762
+            1764:     71(ptr) AccessChain 27(data) 1760 38 30
+                              Store 1764 1763
+            1765:      6(int) Load 8(invocation)
+            1766:     78(ptr) AccessChain 27(data) 38 38
+            1767:   20(ivec4) Load 1766
+            1768:   77(ivec2) VectorShuffle 1767 1767 0 1
+            1769:   77(ivec2) GroupNonUniformIMul 34 ExclusiveScan 1768
+            1770:     71(ptr) AccessChain 27(data) 1765 38 30
+            1771:     19(int) CompositeExtract 1769 0
+                              Store 1770 1771
+            1772:     71(ptr) AccessChain 27(data) 1765 38 47
+            1773:     19(int) CompositeExtract 1769 1
+                              Store 1772 1773
+            1774:      6(int) Load 8(invocation)
+            1775:     78(ptr) AccessChain 27(data) 51 38
+            1776:   20(ivec4) Load 1775
+            1777:   88(ivec3) VectorShuffle 1776 1776 0 1 2
+            1778:   88(ivec3) GroupNonUniformIMul 34 ExclusiveScan 1777
+            1779:     71(ptr) AccessChain 27(data) 1774 38 30
+            1780:     19(int) CompositeExtract 1778 0
+                              Store 1779 1780
+            1781:     71(ptr) AccessChain 27(data) 1774 38 47
+            1782:     19(int) CompositeExtract 1778 1
+                              Store 1781 1782
+            1783:     71(ptr) AccessChain 27(data) 1774 38 61
+            1784:     19(int) CompositeExtract 1778 2
+                              Store 1783 1784
             1785:      6(int) Load 8(invocation)
-            1786:    102(ptr) AccessChain 27(data) 49 49
-            1787:   21(ivec4) Load 1786
-            1788:  111(ivec3) VectorShuffle 1787 1787 0 1 2
-            1789:  111(ivec3) GroupNonUniformUMax 34 ExclusiveScan 1788
-            1790:    102(ptr) AccessChain 27(data) 1785 49
-            1791:   21(ivec4) Load 1790
-            1792:   21(ivec4) VectorShuffle 1791 1789 4 5 6 3
-                              Store 1790 1792
-            1793:      6(int) Load 8(invocation)
-            1794:    102(ptr) AccessChain 27(data) 59 49
-            1795:   21(ivec4) Load 1794
-            1796:   21(ivec4) GroupNonUniformUMax 34 ExclusiveScan 1795
-            1797:    102(ptr) AccessChain 27(data) 1793 49
-                              Store 1797 1796
-            1798:      6(int) Load 8(invocation)
-            1799:    125(ptr) AccessChain 27(data) 29 59 30
-            1800:22(float64_t) Load 1799
-            1801:22(float64_t) GroupNonUniformFMax 34 ExclusiveScan 1800
-            1802:    125(ptr) AccessChain 27(data) 1798 59 30
-                              Store 1802 1801
-            1803:      6(int) Load 8(invocation)
-            1804:    132(ptr) AccessChain 27(data) 38 59
-            1805: 23(f64vec4) Load 1804
-            1806:131(f64vec2) VectorShuffle 1805 1805 0 1
-            1807:131(f64vec2) GroupNonUniformFMax 34 ExclusiveScan 1806
-            1808:    132(ptr) AccessChain 27(data) 1803 59
-            1809: 23(f64vec4) Load 1808
-            1810: 23(f64vec4) VectorShuffle 1809 1807 4 5 2 3
-                              Store 1808 1810
-            1811:      6(int) Load 8(invocation)
-            1812:    132(ptr) AccessChain 27(data) 49 59
-            1813: 23(f64vec4) Load 1812
-            1814:141(f64vec3) VectorShuffle 1813 1813 0 1 2
-            1815:141(f64vec3) GroupNonUniformFMax 34 ExclusiveScan 1814
-            1816:    132(ptr) AccessChain 27(data) 1811 59
-            1817: 23(f64vec4) Load 1816
-            1818: 23(f64vec4) VectorShuffle 1817 1815 4 5 6 3
-                              Store 1816 1818
-            1819:      6(int) Load 8(invocation)
-            1820:    132(ptr) AccessChain 27(data) 59 59
-            1821: 23(f64vec4) Load 1820
-            1822: 23(f64vec4) GroupNonUniformFMax 34 ExclusiveScan 1821
-            1823:    132(ptr) AccessChain 27(data) 1819 59
-                              Store 1823 1822
-            1824:      6(int) Load 8(invocation)
-            1825:     65(ptr) AccessChain 27(data) 29 38 30
-            1826:     19(int) Load 1825
-            1827:     19(int) GroupNonUniformBitwiseAnd 34 ExclusiveScan 1826
-            1828:     65(ptr) AccessChain 27(data) 1824 38 30
-                              Store 1828 1827
-            1829:      6(int) Load 8(invocation)
-            1830:     72(ptr) AccessChain 27(data) 38 38
-            1831:   20(ivec4) Load 1830
-            1832:   71(ivec2) VectorShuffle 1831 1831 0 1
-            1833:   71(ivec2) GroupNonUniformBitwiseAnd 34 ExclusiveScan 1832
-            1834:     72(ptr) AccessChain 27(data) 1829 38
-            1835:   20(ivec4) Load 1834
-            1836:   20(ivec4) VectorShuffle 1835 1833 4 5 2 3
-                              Store 1834 1836
-            1837:      6(int) Load 8(invocation)
-            1838:     72(ptr) AccessChain 27(data) 49 38
-            1839:   20(ivec4) Load 1838
-            1840:   81(ivec3) VectorShuffle 1839 1839 0 1 2
-            1841:   81(ivec3) GroupNonUniformBitwiseAnd 34 ExclusiveScan 1840
-            1842:     72(ptr) AccessChain 27(data) 1837 38
-            1843:   20(ivec4) Load 1842
-            1844:   20(ivec4) VectorShuffle 1843 1841 4 5 6 3
-                              Store 1842 1844
+            1786:     78(ptr) AccessChain 27(data) 65 38
+            1787:   20(ivec4) Load 1786
+            1788:   20(ivec4) GroupNonUniformIMul 34 ExclusiveScan 1787
+            1789:     78(ptr) AccessChain 27(data) 1785 38
+                              Store 1789 1788
+            1790:      6(int) Load 8(invocation)
+            1791:    105(ptr) AccessChain 27(data) 29 51 30
+            1792:      6(int) Load 1791
+            1793:      6(int) GroupNonUniformIMul 34 ExclusiveScan 1792
+            1794:    105(ptr) AccessChain 27(data) 1790 51 30
+                              Store 1794 1793
+            1795:      6(int) Load 8(invocation)
+            1796:    112(ptr) AccessChain 27(data) 38 51
+            1797:   21(ivec4) Load 1796
+            1798:  111(ivec2) VectorShuffle 1797 1797 0 1
+            1799:  111(ivec2) GroupNonUniformIMul 34 ExclusiveScan 1798
+            1800:    105(ptr) AccessChain 27(data) 1795 51 30
+            1801:      6(int) CompositeExtract 1799 0
+                              Store 1800 1801
+            1802:    105(ptr) AccessChain 27(data) 1795 51 47
+            1803:      6(int) CompositeExtract 1799 1
+                              Store 1802 1803
+            1804:      6(int) Load 8(invocation)
+            1805:    112(ptr) AccessChain 27(data) 51 51
+            1806:   21(ivec4) Load 1805
+            1807:  122(ivec3) VectorShuffle 1806 1806 0 1 2
+            1808:  122(ivec3) GroupNonUniformIMul 34 ExclusiveScan 1807
+            1809:    105(ptr) AccessChain 27(data) 1804 51 30
+            1810:      6(int) CompositeExtract 1808 0
+                              Store 1809 1810
+            1811:    105(ptr) AccessChain 27(data) 1804 51 47
+            1812:      6(int) CompositeExtract 1808 1
+                              Store 1811 1812
+            1813:    105(ptr) AccessChain 27(data) 1804 51 61
+            1814:      6(int) CompositeExtract 1808 2
+                              Store 1813 1814
+            1815:      6(int) Load 8(invocation)
+            1816:    112(ptr) AccessChain 27(data) 65 51
+            1817:   21(ivec4) Load 1816
+            1818:   21(ivec4) GroupNonUniformIMul 34 ExclusiveScan 1817
+            1819:    112(ptr) AccessChain 27(data) 1815 51
+                              Store 1819 1818
+            1820:      6(int) Load 8(invocation)
+            1821:    139(ptr) AccessChain 27(data) 29 65 30
+            1822:22(float64_t) Load 1821
+            1823:22(float64_t) GroupNonUniformFMul 34 ExclusiveScan 1822
+            1824:    139(ptr) AccessChain 27(data) 1820 65 30
+                              Store 1824 1823
+            1825:      6(int) Load 8(invocation)
+            1826:    146(ptr) AccessChain 27(data) 38 65
+            1827: 23(f64vec4) Load 1826
+            1828:145(f64vec2) VectorShuffle 1827 1827 0 1
+            1829:145(f64vec2) GroupNonUniformFMul 34 ExclusiveScan 1828
+            1830:    139(ptr) AccessChain 27(data) 1825 65 30
+            1831:22(float64_t) CompositeExtract 1829 0
+                              Store 1830 1831
+            1832:    139(ptr) AccessChain 27(data) 1825 65 47
+            1833:22(float64_t) CompositeExtract 1829 1
+                              Store 1832 1833
+            1834:      6(int) Load 8(invocation)
+            1835:    146(ptr) AccessChain 27(data) 51 65
+            1836: 23(f64vec4) Load 1835
+            1837:156(f64vec3) VectorShuffle 1836 1836 0 1 2
+            1838:156(f64vec3) GroupNonUniformFMul 34 ExclusiveScan 1837
+            1839:    139(ptr) AccessChain 27(data) 1834 65 30
+            1840:22(float64_t) CompositeExtract 1838 0
+                              Store 1839 1840
+            1841:    139(ptr) AccessChain 27(data) 1834 65 47
+            1842:22(float64_t) CompositeExtract 1838 1
+                              Store 1841 1842
+            1843:    139(ptr) AccessChain 27(data) 1834 65 61
+            1844:22(float64_t) CompositeExtract 1838 2
+                              Store 1843 1844
             1845:      6(int) Load 8(invocation)
-            1846:     72(ptr) AccessChain 27(data) 59 38
-            1847:   20(ivec4) Load 1846
-            1848:   20(ivec4) GroupNonUniformBitwiseAnd 34 ExclusiveScan 1847
-            1849:     72(ptr) AccessChain 27(data) 1845 38
+            1846:    146(ptr) AccessChain 27(data) 65 65
+            1847: 23(f64vec4) Load 1846
+            1848: 23(f64vec4) GroupNonUniformFMul 34 ExclusiveScan 1847
+            1849:    146(ptr) AccessChain 27(data) 1845 65
                               Store 1849 1848
             1850:      6(int) Load 8(invocation)
-            1851:     95(ptr) AccessChain 27(data) 29 49 30
-            1852:      6(int) Load 1851
-            1853:      6(int) GroupNonUniformBitwiseAnd 34 ExclusiveScan 1852
-            1854:     95(ptr) AccessChain 27(data) 1850 49 30
+            1851:     31(ptr) AccessChain 27(data) 29 29 30
+            1852:   17(float) Load 1851
+            1853:   17(float) GroupNonUniformFMin 34 ExclusiveScan 1852
+            1854:     31(ptr) AccessChain 27(data) 1850 29 30
                               Store 1854 1853
             1855:      6(int) Load 8(invocation)
-            1856:    102(ptr) AccessChain 27(data) 38 49
-            1857:   21(ivec4) Load 1856
-            1858:  101(ivec2) VectorShuffle 1857 1857 0 1
-            1859:  101(ivec2) GroupNonUniformBitwiseAnd 34 ExclusiveScan 1858
-            1860:    102(ptr) AccessChain 27(data) 1855 49
-            1861:   21(ivec4) Load 1860
-            1862:   21(ivec4) VectorShuffle 1861 1859 4 5 2 3
-                              Store 1860 1862
-            1863:      6(int) Load 8(invocation)
-            1864:    102(ptr) AccessChain 27(data) 49 49
-            1865:   21(ivec4) Load 1864
-            1866:  111(ivec3) VectorShuffle 1865 1865 0 1 2
-            1867:  111(ivec3) GroupNonUniformBitwiseAnd 34 ExclusiveScan 1866
-            1868:    102(ptr) AccessChain 27(data) 1863 49
-            1869:   21(ivec4) Load 1868
-            1870:   21(ivec4) VectorShuffle 1869 1867 4 5 6 3
-                              Store 1868 1870
-            1871:      6(int) Load 8(invocation)
-            1872:    102(ptr) AccessChain 27(data) 59 49
-            1873:   21(ivec4) Load 1872
-            1874:   21(ivec4) GroupNonUniformBitwiseAnd 34 ExclusiveScan 1873
-            1875:    102(ptr) AccessChain 27(data) 1871 49
-                              Store 1875 1874
-            1876:      6(int) Load 8(invocation)
-            1877:     65(ptr) AccessChain 27(data) 29 38 30
-            1878:     19(int) Load 1877
-            1879:   521(bool) SLessThan 1878 29
-            1880:   521(bool) GroupNonUniformLogicalAnd 34 ExclusiveScan 1879
-            1881:     19(int) Select 1880 38 29
-            1882:     65(ptr) AccessChain 27(data) 1876 38 30
-                              Store 1882 1881
-            1883:      6(int) Load 8(invocation)
-            1884:     72(ptr) AccessChain 27(data) 38 38
-            1885:   20(ivec4) Load 1884
-            1886:   71(ivec2) VectorShuffle 1885 1885 0 1
-            1887:  531(bvec2) SLessThan 1886 530
-            1888:  531(bvec2) GroupNonUniformLogicalAnd 34 ExclusiveScan 1887
-            1889:   71(ivec2) Select 1888 534 530
-            1890:     72(ptr) AccessChain 27(data) 1883 38
-            1891:   20(ivec4) Load 1890
-            1892:   20(ivec4) VectorShuffle 1891 1889 4 5 2 3
-                              Store 1890 1892
-            1893:      6(int) Load 8(invocation)
-            1894:     72(ptr) AccessChain 27(data) 38 38
-            1895:   20(ivec4) Load 1894
-            1896:   81(ivec3) VectorShuffle 1895 1895 0 1 2
-            1897:  544(bvec3) SLessThan 1896 543
-            1898:  544(bvec3) GroupNonUniformLogicalAnd 34 ExclusiveScan 1897
-            1899:   81(ivec3) Select 1898 547 543
-            1900:     72(ptr) AccessChain 27(data) 1893 38
-            1901:   20(ivec4) Load 1900
-            1902:   20(ivec4) VectorShuffle 1901 1899 4 5 6 3
-                              Store 1900 1902
-            1903:      6(int) Load 8(invocation)
-            1904:     72(ptr) AccessChain 27(data) 38 38
-            1905:   20(ivec4) Load 1904
-            1906:  556(bvec4) SLessThan 1905 555
-            1907:  556(bvec4) GroupNonUniformLogicalAnd 34 ExclusiveScan 1906
-            1908:   20(ivec4) Select 1907 559 555
-            1909:     72(ptr) AccessChain 27(data) 1903 38
+            1856:     40(ptr) AccessChain 27(data) 38 29
+            1857:   18(fvec4) Load 1856
+            1858:   39(fvec2) VectorShuffle 1857 1857 0 1
+            1859:   39(fvec2) GroupNonUniformFMin 34 ExclusiveScan 1858
+            1860:     31(ptr) AccessChain 27(data) 1855 29 30
+            1861:   17(float) CompositeExtract 1859 0
+                              Store 1860 1861
+            1862:     31(ptr) AccessChain 27(data) 1855 29 47
+            1863:   17(float) CompositeExtract 1859 1
+                              Store 1862 1863
+            1864:      6(int) Load 8(invocation)
+            1865:     40(ptr) AccessChain 27(data) 51 29
+            1866:   18(fvec4) Load 1865
+            1867:   52(fvec3) VectorShuffle 1866 1866 0 1 2
+            1868:   52(fvec3) GroupNonUniformFMin 34 ExclusiveScan 1867
+            1869:     31(ptr) AccessChain 27(data) 1864 29 30
+            1870:   17(float) CompositeExtract 1868 0
+                              Store 1869 1870
+            1871:     31(ptr) AccessChain 27(data) 1864 29 47
+            1872:   17(float) CompositeExtract 1868 1
+                              Store 1871 1872
+            1873:     31(ptr) AccessChain 27(data) 1864 29 61
+            1874:   17(float) CompositeExtract 1868 2
+                              Store 1873 1874
+            1875:      6(int) Load 8(invocation)
+            1876:     40(ptr) AccessChain 27(data) 65 29
+            1877:   18(fvec4) Load 1876
+            1878:   18(fvec4) GroupNonUniformFMin 34 ExclusiveScan 1877
+            1879:     40(ptr) AccessChain 27(data) 1875 29
+                              Store 1879 1878
+            1880:      6(int) Load 8(invocation)
+            1881:     71(ptr) AccessChain 27(data) 29 38 30
+            1882:     19(int) Load 1881
+            1883:     19(int) GroupNonUniformSMin 34 ExclusiveScan 1882
+            1884:     71(ptr) AccessChain 27(data) 1880 38 30
+                              Store 1884 1883
+            1885:      6(int) Load 8(invocation)
+            1886:     78(ptr) AccessChain 27(data) 38 38
+            1887:   20(ivec4) Load 1886
+            1888:   77(ivec2) VectorShuffle 1887 1887 0 1
+            1889:   77(ivec2) GroupNonUniformSMin 34 ExclusiveScan 1888
+            1890:     71(ptr) AccessChain 27(data) 1885 38 30
+            1891:     19(int) CompositeExtract 1889 0
+                              Store 1890 1891
+            1892:     71(ptr) AccessChain 27(data) 1885 38 47
+            1893:     19(int) CompositeExtract 1889 1
+                              Store 1892 1893
+            1894:      6(int) Load 8(invocation)
+            1895:     78(ptr) AccessChain 27(data) 51 38
+            1896:   20(ivec4) Load 1895
+            1897:   88(ivec3) VectorShuffle 1896 1896 0 1 2
+            1898:   88(ivec3) GroupNonUniformSMin 34 ExclusiveScan 1897
+            1899:     71(ptr) AccessChain 27(data) 1894 38 30
+            1900:     19(int) CompositeExtract 1898 0
+                              Store 1899 1900
+            1901:     71(ptr) AccessChain 27(data) 1894 38 47
+            1902:     19(int) CompositeExtract 1898 1
+                              Store 1901 1902
+            1903:     71(ptr) AccessChain 27(data) 1894 38 61
+            1904:     19(int) CompositeExtract 1898 2
+                              Store 1903 1904
+            1905:      6(int) Load 8(invocation)
+            1906:     78(ptr) AccessChain 27(data) 65 38
+            1907:   20(ivec4) Load 1906
+            1908:   20(ivec4) GroupNonUniformSMin 34 ExclusiveScan 1907
+            1909:     78(ptr) AccessChain 27(data) 1905 38
                               Store 1909 1908
             1910:      6(int) Load 8(invocation)
-            1911:     65(ptr) AccessChain 27(data) 29 38 30
-            1912:     19(int) Load 1911
-            1913:     19(int) GroupNonUniformBitwiseOr 34 ExclusiveScan 1912
-            1914:     65(ptr) AccessChain 27(data) 1910 38 30
+            1911:    105(ptr) AccessChain 27(data) 29 51 30
+            1912:      6(int) Load 1911
+            1913:      6(int) GroupNonUniformUMin 34 ExclusiveScan 1912
+            1914:    105(ptr) AccessChain 27(data) 1910 51 30
                               Store 1914 1913
             1915:      6(int) Load 8(invocation)
-            1916:     72(ptr) AccessChain 27(data) 38 38
-            1917:   20(ivec4) Load 1916
-            1918:   71(ivec2) VectorShuffle 1917 1917 0 1
-            1919:   71(ivec2) GroupNonUniformBitwiseOr 34 ExclusiveScan 1918
-            1920:     72(ptr) AccessChain 27(data) 1915 38
-            1921:   20(ivec4) Load 1920
-            1922:   20(ivec4) VectorShuffle 1921 1919 4 5 2 3
-                              Store 1920 1922
-            1923:      6(int) Load 8(invocation)
-            1924:     72(ptr) AccessChain 27(data) 49 38
-            1925:   20(ivec4) Load 1924
-            1926:   81(ivec3) VectorShuffle 1925 1925 0 1 2
-            1927:   81(ivec3) GroupNonUniformBitwiseOr 34 ExclusiveScan 1926
-            1928:     72(ptr) AccessChain 27(data) 1923 38
-            1929:   20(ivec4) Load 1928
-            1930:   20(ivec4) VectorShuffle 1929 1927 4 5 6 3
-                              Store 1928 1930
-            1931:      6(int) Load 8(invocation)
-            1932:     72(ptr) AccessChain 27(data) 59 38
-            1933:   20(ivec4) Load 1932
-            1934:   20(ivec4) GroupNonUniformBitwiseOr 34 ExclusiveScan 1933
-            1935:     72(ptr) AccessChain 27(data) 1931 38
-                              Store 1935 1934
-            1936:      6(int) Load 8(invocation)
-            1937:     95(ptr) AccessChain 27(data) 29 49 30
-            1938:      6(int) Load 1937
-            1939:      6(int) GroupNonUniformBitwiseOr 34 ExclusiveScan 1938
-            1940:     95(ptr) AccessChain 27(data) 1936 49 30
-                              Store 1940 1939
-            1941:      6(int) Load 8(invocation)
-            1942:    102(ptr) AccessChain 27(data) 38 49
-            1943:   21(ivec4) Load 1942
-            1944:  101(ivec2) VectorShuffle 1943 1943 0 1
-            1945:  101(ivec2) GroupNonUniformBitwiseOr 34 ExclusiveScan 1944
-            1946:    102(ptr) AccessChain 27(data) 1941 49
-            1947:   21(ivec4) Load 1946
-            1948:   21(ivec4) VectorShuffle 1947 1945 4 5 2 3
-                              Store 1946 1948
-            1949:      6(int) Load 8(invocation)
-            1950:    102(ptr) AccessChain 27(data) 49 49
-            1951:   21(ivec4) Load 1950
-            1952:  111(ivec3) VectorShuffle 1951 1951 0 1 2
-            1953:  111(ivec3) GroupNonUniformBitwiseOr 34 ExclusiveScan 1952
-            1954:    102(ptr) AccessChain 27(data) 1949 49
-            1955:   21(ivec4) Load 1954
-            1956:   21(ivec4) VectorShuffle 1955 1953 4 5 6 3
-                              Store 1954 1956
-            1957:      6(int) Load 8(invocation)
-            1958:    102(ptr) AccessChain 27(data) 59 49
-            1959:   21(ivec4) Load 1958
-            1960:   21(ivec4) GroupNonUniformBitwiseOr 34 ExclusiveScan 1959
-            1961:    102(ptr) AccessChain 27(data) 1957 49
-                              Store 1961 1960
-            1962:      6(int) Load 8(invocation)
-            1963:     65(ptr) AccessChain 27(data) 29 38 30
-            1964:     19(int) Load 1963
-            1965:   521(bool) SLessThan 1964 29
-            1966:   521(bool) GroupNonUniformLogicalOr 34 ExclusiveScan 1965
-            1967:     19(int) Select 1966 38 29
-            1968:     65(ptr) AccessChain 27(data) 1962 38 30
-                              Store 1968 1967
-            1969:      6(int) Load 8(invocation)
-            1970:     72(ptr) AccessChain 27(data) 38 38
-            1971:   20(ivec4) Load 1970
-            1972:   71(ivec2) VectorShuffle 1971 1971 0 1
-            1973:  531(bvec2) SLessThan 1972 530
-            1974:  531(bvec2) GroupNonUniformLogicalOr 34 ExclusiveScan 1973
-            1975:   71(ivec2) Select 1974 534 530
-            1976:     72(ptr) AccessChain 27(data) 1969 38
-            1977:   20(ivec4) Load 1976
-            1978:   20(ivec4) VectorShuffle 1977 1975 4 5 2 3
-                              Store 1976 1978
-            1979:      6(int) Load 8(invocation)
-            1980:     72(ptr) AccessChain 27(data) 38 38
-            1981:   20(ivec4) Load 1980
-            1982:   81(ivec3) VectorShuffle 1981 1981 0 1 2
-            1983:  544(bvec3) SLessThan 1982 543
-            1984:  544(bvec3) GroupNonUniformLogicalOr 34 ExclusiveScan 1983
-            1985:   81(ivec3) Select 1984 547 543
-            1986:     72(ptr) AccessChain 27(data) 1979 38
-            1987:   20(ivec4) Load 1986
-            1988:   20(ivec4) VectorShuffle 1987 1985 4 5 6 3
-                              Store 1986 1988
-            1989:      6(int) Load 8(invocation)
-            1990:     72(ptr) AccessChain 27(data) 38 38
-            1991:   20(ivec4) Load 1990
-            1992:  556(bvec4) SLessThan 1991 555
-            1993:  556(bvec4) GroupNonUniformLogicalOr 34 ExclusiveScan 1992
-            1994:   20(ivec4) Select 1993 559 555
-            1995:     72(ptr) AccessChain 27(data) 1989 38
-                              Store 1995 1994
-            1996:      6(int) Load 8(invocation)
-            1997:     65(ptr) AccessChain 27(data) 29 38 30
-            1998:     19(int) Load 1997
-            1999:     19(int) GroupNonUniformBitwiseXor 34 ExclusiveScan 1998
-            2000:     65(ptr) AccessChain 27(data) 1996 38 30
-                              Store 2000 1999
-            2001:      6(int) Load 8(invocation)
-            2002:     72(ptr) AccessChain 27(data) 38 38
-            2003:   20(ivec4) Load 2002
-            2004:   71(ivec2) VectorShuffle 2003 2003 0 1
-            2005:   71(ivec2) GroupNonUniformBitwiseXor 34 ExclusiveScan 2004
-            2006:     72(ptr) AccessChain 27(data) 2001 38
+            1916:    112(ptr) AccessChain 27(data) 38 51
+            1917:   21(ivec4) Load 1916
+            1918:  111(ivec2) VectorShuffle 1917 1917 0 1
+            1919:  111(ivec2) GroupNonUniformUMin 34 ExclusiveScan 1918
+            1920:    105(ptr) AccessChain 27(data) 1915 51 30
+            1921:      6(int) CompositeExtract 1919 0
+                              Store 1920 1921
+            1922:    105(ptr) AccessChain 27(data) 1915 51 47
+            1923:      6(int) CompositeExtract 1919 1
+                              Store 1922 1923
+            1924:      6(int) Load 8(invocation)
+            1925:    112(ptr) AccessChain 27(data) 51 51
+            1926:   21(ivec4) Load 1925
+            1927:  122(ivec3) VectorShuffle 1926 1926 0 1 2
+            1928:  122(ivec3) GroupNonUniformUMin 34 ExclusiveScan 1927
+            1929:    105(ptr) AccessChain 27(data) 1924 51 30
+            1930:      6(int) CompositeExtract 1928 0
+                              Store 1929 1930
+            1931:    105(ptr) AccessChain 27(data) 1924 51 47
+            1932:      6(int) CompositeExtract 1928 1
+                              Store 1931 1932
+            1933:    105(ptr) AccessChain 27(data) 1924 51 61
+            1934:      6(int) CompositeExtract 1928 2
+                              Store 1933 1934
+            1935:      6(int) Load 8(invocation)
+            1936:    112(ptr) AccessChain 27(data) 65 51
+            1937:   21(ivec4) Load 1936
+            1938:   21(ivec4) GroupNonUniformUMin 34 ExclusiveScan 1937
+            1939:    112(ptr) AccessChain 27(data) 1935 51
+                              Store 1939 1938
+            1940:      6(int) Load 8(invocation)
+            1941:    139(ptr) AccessChain 27(data) 29 65 30
+            1942:22(float64_t) Load 1941
+            1943:22(float64_t) GroupNonUniformFMin 34 ExclusiveScan 1942
+            1944:    139(ptr) AccessChain 27(data) 1940 65 30
+                              Store 1944 1943
+            1945:      6(int) Load 8(invocation)
+            1946:    146(ptr) AccessChain 27(data) 38 65
+            1947: 23(f64vec4) Load 1946
+            1948:145(f64vec2) VectorShuffle 1947 1947 0 1
+            1949:145(f64vec2) GroupNonUniformFMin 34 ExclusiveScan 1948
+            1950:    139(ptr) AccessChain 27(data) 1945 65 30
+            1951:22(float64_t) CompositeExtract 1949 0
+                              Store 1950 1951
+            1952:    139(ptr) AccessChain 27(data) 1945 65 47
+            1953:22(float64_t) CompositeExtract 1949 1
+                              Store 1952 1953
+            1954:      6(int) Load 8(invocation)
+            1955:    146(ptr) AccessChain 27(data) 51 65
+            1956: 23(f64vec4) Load 1955
+            1957:156(f64vec3) VectorShuffle 1956 1956 0 1 2
+            1958:156(f64vec3) GroupNonUniformFMin 34 ExclusiveScan 1957
+            1959:    139(ptr) AccessChain 27(data) 1954 65 30
+            1960:22(float64_t) CompositeExtract 1958 0
+                              Store 1959 1960
+            1961:    139(ptr) AccessChain 27(data) 1954 65 47
+            1962:22(float64_t) CompositeExtract 1958 1
+                              Store 1961 1962
+            1963:    139(ptr) AccessChain 27(data) 1954 65 61
+            1964:22(float64_t) CompositeExtract 1958 2
+                              Store 1963 1964
+            1965:      6(int) Load 8(invocation)
+            1966:    146(ptr) AccessChain 27(data) 65 65
+            1967: 23(f64vec4) Load 1966
+            1968: 23(f64vec4) GroupNonUniformFMin 34 ExclusiveScan 1967
+            1969:    146(ptr) AccessChain 27(data) 1965 65
+                              Store 1969 1968
+            1970:      6(int) Load 8(invocation)
+            1971:     31(ptr) AccessChain 27(data) 29 29 30
+            1972:   17(float) Load 1971
+            1973:   17(float) GroupNonUniformFMax 34 ExclusiveScan 1972
+            1974:     31(ptr) AccessChain 27(data) 1970 29 30
+                              Store 1974 1973
+            1975:      6(int) Load 8(invocation)
+            1976:     40(ptr) AccessChain 27(data) 38 29
+            1977:   18(fvec4) Load 1976
+            1978:   39(fvec2) VectorShuffle 1977 1977 0 1
+            1979:   39(fvec2) GroupNonUniformFMax 34 ExclusiveScan 1978
+            1980:     31(ptr) AccessChain 27(data) 1975 29 30
+            1981:   17(float) CompositeExtract 1979 0
+                              Store 1980 1981
+            1982:     31(ptr) AccessChain 27(data) 1975 29 47
+            1983:   17(float) CompositeExtract 1979 1
+                              Store 1982 1983
+            1984:      6(int) Load 8(invocation)
+            1985:     40(ptr) AccessChain 27(data) 51 29
+            1986:   18(fvec4) Load 1985
+            1987:   52(fvec3) VectorShuffle 1986 1986 0 1 2
+            1988:   52(fvec3) GroupNonUniformFMax 34 ExclusiveScan 1987
+            1989:     31(ptr) AccessChain 27(data) 1984 29 30
+            1990:   17(float) CompositeExtract 1988 0
+                              Store 1989 1990
+            1991:     31(ptr) AccessChain 27(data) 1984 29 47
+            1992:   17(float) CompositeExtract 1988 1
+                              Store 1991 1992
+            1993:     31(ptr) AccessChain 27(data) 1984 29 61
+            1994:   17(float) CompositeExtract 1988 2
+                              Store 1993 1994
+            1995:      6(int) Load 8(invocation)
+            1996:     40(ptr) AccessChain 27(data) 65 29
+            1997:   18(fvec4) Load 1996
+            1998:   18(fvec4) GroupNonUniformFMax 34 ExclusiveScan 1997
+            1999:     40(ptr) AccessChain 27(data) 1995 29
+                              Store 1999 1998
+            2000:      6(int) Load 8(invocation)
+            2001:     71(ptr) AccessChain 27(data) 29 38 30
+            2002:     19(int) Load 2001
+            2003:     19(int) GroupNonUniformSMax 34 ExclusiveScan 2002
+            2004:     71(ptr) AccessChain 27(data) 2000 38 30
+                              Store 2004 2003
+            2005:      6(int) Load 8(invocation)
+            2006:     78(ptr) AccessChain 27(data) 38 38
             2007:   20(ivec4) Load 2006
-            2008:   20(ivec4) VectorShuffle 2007 2005 4 5 2 3
-                              Store 2006 2008
-            2009:      6(int) Load 8(invocation)
-            2010:     72(ptr) AccessChain 27(data) 49 38
-            2011:   20(ivec4) Load 2010
-            2012:   81(ivec3) VectorShuffle 2011 2011 0 1 2
-            2013:   81(ivec3) GroupNonUniformBitwiseXor 34 ExclusiveScan 2012
-            2014:     72(ptr) AccessChain 27(data) 2009 38
-            2015:   20(ivec4) Load 2014
-            2016:   20(ivec4) VectorShuffle 2015 2013 4 5 6 3
-                              Store 2014 2016
-            2017:      6(int) Load 8(invocation)
-            2018:     72(ptr) AccessChain 27(data) 59 38
-            2019:   20(ivec4) Load 2018
-            2020:   20(ivec4) GroupNonUniformBitwiseXor 34 ExclusiveScan 2019
-            2021:     72(ptr) AccessChain 27(data) 2017 38
-                              Store 2021 2020
-            2022:      6(int) Load 8(invocation)
-            2023:     95(ptr) AccessChain 27(data) 29 49 30
-            2024:      6(int) Load 2023
-            2025:      6(int) GroupNonUniformBitwiseXor 34 ExclusiveScan 2024
-            2026:     95(ptr) AccessChain 27(data) 2022 49 30
-                              Store 2026 2025
-            2027:      6(int) Load 8(invocation)
-            2028:    102(ptr) AccessChain 27(data) 38 49
-            2029:   21(ivec4) Load 2028
-            2030:  101(ivec2) VectorShuffle 2029 2029 0 1
-            2031:  101(ivec2) GroupNonUniformBitwiseXor 34 ExclusiveScan 2030
-            2032:    102(ptr) AccessChain 27(data) 2027 49
-            2033:   21(ivec4) Load 2032
-            2034:   21(ivec4) VectorShuffle 2033 2031 4 5 2 3
-                              Store 2032 2034
+            2008:   77(ivec2) VectorShuffle 2007 2007 0 1
+            2009:   77(ivec2) GroupNonUniformSMax 34 ExclusiveScan 2008
+            2010:     71(ptr) AccessChain 27(data) 2005 38 30
+            2011:     19(int) CompositeExtract 2009 0
+                              Store 2010 2011
+            2012:     71(ptr) AccessChain 27(data) 2005 38 47
+            2013:     19(int) CompositeExtract 2009 1
+                              Store 2012 2013
+            2014:      6(int) Load 8(invocation)
+            2015:     78(ptr) AccessChain 27(data) 51 38
+            2016:   20(ivec4) Load 2015
+            2017:   88(ivec3) VectorShuffle 2016 2016 0 1 2
+            2018:   88(ivec3) GroupNonUniformSMax 34 ExclusiveScan 2017
+            2019:     71(ptr) AccessChain 27(data) 2014 38 30
+            2020:     19(int) CompositeExtract 2018 0
+                              Store 2019 2020
+            2021:     71(ptr) AccessChain 27(data) 2014 38 47
+            2022:     19(int) CompositeExtract 2018 1
+                              Store 2021 2022
+            2023:     71(ptr) AccessChain 27(data) 2014 38 61
+            2024:     19(int) CompositeExtract 2018 2
+                              Store 2023 2024
+            2025:      6(int) Load 8(invocation)
+            2026:     78(ptr) AccessChain 27(data) 65 38
+            2027:   20(ivec4) Load 2026
+            2028:   20(ivec4) GroupNonUniformSMax 34 ExclusiveScan 2027
+            2029:     78(ptr) AccessChain 27(data) 2025 38
+                              Store 2029 2028
+            2030:      6(int) Load 8(invocation)
+            2031:    105(ptr) AccessChain 27(data) 29 51 30
+            2032:      6(int) Load 2031
+            2033:      6(int) GroupNonUniformUMax 34 ExclusiveScan 2032
+            2034:    105(ptr) AccessChain 27(data) 2030 51 30
+                              Store 2034 2033
             2035:      6(int) Load 8(invocation)
-            2036:    102(ptr) AccessChain 27(data) 49 49
+            2036:    112(ptr) AccessChain 27(data) 38 51
             2037:   21(ivec4) Load 2036
-            2038:  111(ivec3) VectorShuffle 2037 2037 0 1 2
-            2039:  111(ivec3) GroupNonUniformBitwiseXor 34 ExclusiveScan 2038
-            2040:    102(ptr) AccessChain 27(data) 2035 49
-            2041:   21(ivec4) Load 2040
-            2042:   21(ivec4) VectorShuffle 2041 2039 4 5 6 3
-                              Store 2040 2042
-            2043:      6(int) Load 8(invocation)
-            2044:    102(ptr) AccessChain 27(data) 59 49
-            2045:   21(ivec4) Load 2044
-            2046:   21(ivec4) GroupNonUniformBitwiseXor 34 ExclusiveScan 2045
-            2047:    102(ptr) AccessChain 27(data) 2043 49
-                              Store 2047 2046
-            2048:      6(int) Load 8(invocation)
-            2049:     65(ptr) AccessChain 27(data) 29 38 30
-            2050:     19(int) Load 2049
-            2051:   521(bool) SLessThan 2050 29
-            2052:   521(bool) GroupNonUniformLogicalXor 34 ExclusiveScan 2051
-            2053:     19(int) Select 2052 38 29
-            2054:     65(ptr) AccessChain 27(data) 2048 38 30
-                              Store 2054 2053
+            2038:  111(ivec2) VectorShuffle 2037 2037 0 1
+            2039:  111(ivec2) GroupNonUniformUMax 34 ExclusiveScan 2038
+            2040:    105(ptr) AccessChain 27(data) 2035 51 30
+            2041:      6(int) CompositeExtract 2039 0
+                              Store 2040 2041
+            2042:    105(ptr) AccessChain 27(data) 2035 51 47
+            2043:      6(int) CompositeExtract 2039 1
+                              Store 2042 2043
+            2044:      6(int) Load 8(invocation)
+            2045:    112(ptr) AccessChain 27(data) 51 51
+            2046:   21(ivec4) Load 2045
+            2047:  122(ivec3) VectorShuffle 2046 2046 0 1 2
+            2048:  122(ivec3) GroupNonUniformUMax 34 ExclusiveScan 2047
+            2049:    105(ptr) AccessChain 27(data) 2044 51 30
+            2050:      6(int) CompositeExtract 2048 0
+                              Store 2049 2050
+            2051:    105(ptr) AccessChain 27(data) 2044 51 47
+            2052:      6(int) CompositeExtract 2048 1
+                              Store 2051 2052
+            2053:    105(ptr) AccessChain 27(data) 2044 51 61
+            2054:      6(int) CompositeExtract 2048 2
+                              Store 2053 2054
             2055:      6(int) Load 8(invocation)
-            2056:     72(ptr) AccessChain 27(data) 38 38
-            2057:   20(ivec4) Load 2056
-            2058:   71(ivec2) VectorShuffle 2057 2057 0 1
-            2059:  531(bvec2) SLessThan 2058 530
-            2060:  531(bvec2) GroupNonUniformLogicalXor 34 ExclusiveScan 2059
-            2061:   71(ivec2) Select 2060 534 530
-            2062:     72(ptr) AccessChain 27(data) 2055 38
-            2063:   20(ivec4) Load 2062
-            2064:   20(ivec4) VectorShuffle 2063 2061 4 5 2 3
-                              Store 2062 2064
+            2056:    112(ptr) AccessChain 27(data) 65 51
+            2057:   21(ivec4) Load 2056
+            2058:   21(ivec4) GroupNonUniformUMax 34 ExclusiveScan 2057
+            2059:    112(ptr) AccessChain 27(data) 2055 51
+                              Store 2059 2058
+            2060:      6(int) Load 8(invocation)
+            2061:    139(ptr) AccessChain 27(data) 29 65 30
+            2062:22(float64_t) Load 2061
+            2063:22(float64_t) GroupNonUniformFMax 34 ExclusiveScan 2062
+            2064:    139(ptr) AccessChain 27(data) 2060 65 30
+                              Store 2064 2063
             2065:      6(int) Load 8(invocation)
-            2066:     72(ptr) AccessChain 27(data) 38 38
-            2067:   20(ivec4) Load 2066
-            2068:   81(ivec3) VectorShuffle 2067 2067 0 1 2
-            2069:  544(bvec3) SLessThan 2068 543
-            2070:  544(bvec3) GroupNonUniformLogicalXor 34 ExclusiveScan 2069
-            2071:   81(ivec3) Select 2070 547 543
-            2072:     72(ptr) AccessChain 27(data) 2065 38
-            2073:   20(ivec4) Load 2072
-            2074:   20(ivec4) VectorShuffle 2073 2071 4 5 6 3
-                              Store 2072 2074
-            2075:      6(int) Load 8(invocation)
-            2076:     72(ptr) AccessChain 27(data) 38 38
-            2077:   20(ivec4) Load 2076
-            2078:  556(bvec4) SLessThan 2077 555
-            2079:  556(bvec4) GroupNonUniformLogicalXor 34 ExclusiveScan 2078
-            2080:   20(ivec4) Select 2079 559 555
-            2081:     72(ptr) AccessChain 27(data) 2075 38
-                              Store 2081 2080
+            2066:    146(ptr) AccessChain 27(data) 38 65
+            2067: 23(f64vec4) Load 2066
+            2068:145(f64vec2) VectorShuffle 2067 2067 0 1
+            2069:145(f64vec2) GroupNonUniformFMax 34 ExclusiveScan 2068
+            2070:    139(ptr) AccessChain 27(data) 2065 65 30
+            2071:22(float64_t) CompositeExtract 2069 0
+                              Store 2070 2071
+            2072:    139(ptr) AccessChain 27(data) 2065 65 47
+            2073:22(float64_t) CompositeExtract 2069 1
+                              Store 2072 2073
+            2074:      6(int) Load 8(invocation)
+            2075:    146(ptr) AccessChain 27(data) 51 65
+            2076: 23(f64vec4) Load 2075
+            2077:156(f64vec3) VectorShuffle 2076 2076 0 1 2
+            2078:156(f64vec3) GroupNonUniformFMax 34 ExclusiveScan 2077
+            2079:    139(ptr) AccessChain 27(data) 2074 65 30
+            2080:22(float64_t) CompositeExtract 2078 0
+                              Store 2079 2080
+            2081:    139(ptr) AccessChain 27(data) 2074 65 47
+            2082:22(float64_t) CompositeExtract 2078 1
+                              Store 2081 2082
+            2083:    139(ptr) AccessChain 27(data) 2074 65 61
+            2084:22(float64_t) CompositeExtract 2078 2
+                              Store 2083 2084
+            2085:      6(int) Load 8(invocation)
+            2086:    146(ptr) AccessChain 27(data) 65 65
+            2087: 23(f64vec4) Load 2086
+            2088: 23(f64vec4) GroupNonUniformFMax 34 ExclusiveScan 2087
+            2089:    146(ptr) AccessChain 27(data) 2085 65
+                              Store 2089 2088
+            2090:      6(int) Load 8(invocation)
+            2091:     71(ptr) AccessChain 27(data) 29 38 30
+            2092:     19(int) Load 2091
+            2093:     19(int) GroupNonUniformBitwiseAnd 34 ExclusiveScan 2092
+            2094:     71(ptr) AccessChain 27(data) 2090 38 30
+                              Store 2094 2093
+            2095:      6(int) Load 8(invocation)
+            2096:     78(ptr) AccessChain 27(data) 38 38
+            2097:   20(ivec4) Load 2096
+            2098:   77(ivec2) VectorShuffle 2097 2097 0 1
+            2099:   77(ivec2) GroupNonUniformBitwiseAnd 34 ExclusiveScan 2098
+            2100:     71(ptr) AccessChain 27(data) 2095 38 30
+            2101:     19(int) CompositeExtract 2099 0
+                              Store 2100 2101
+            2102:     71(ptr) AccessChain 27(data) 2095 38 47
+            2103:     19(int) CompositeExtract 2099 1
+                              Store 2102 2103
+            2104:      6(int) Load 8(invocation)
+            2105:     78(ptr) AccessChain 27(data) 51 38
+            2106:   20(ivec4) Load 2105
+            2107:   88(ivec3) VectorShuffle 2106 2106 0 1 2
+            2108:   88(ivec3) GroupNonUniformBitwiseAnd 34 ExclusiveScan 2107
+            2109:     71(ptr) AccessChain 27(data) 2104 38 30
+            2110:     19(int) CompositeExtract 2108 0
+                              Store 2109 2110
+            2111:     71(ptr) AccessChain 27(data) 2104 38 47
+            2112:     19(int) CompositeExtract 2108 1
+                              Store 2111 2112
+            2113:     71(ptr) AccessChain 27(data) 2104 38 61
+            2114:     19(int) CompositeExtract 2108 2
+                              Store 2113 2114
+            2115:      6(int) Load 8(invocation)
+            2116:     78(ptr) AccessChain 27(data) 65 38
+            2117:   20(ivec4) Load 2116
+            2118:   20(ivec4) GroupNonUniformBitwiseAnd 34 ExclusiveScan 2117
+            2119:     78(ptr) AccessChain 27(data) 2115 38
+                              Store 2119 2118
+            2120:      6(int) Load 8(invocation)
+            2121:    105(ptr) AccessChain 27(data) 29 51 30
+            2122:      6(int) Load 2121
+            2123:      6(int) GroupNonUniformBitwiseAnd 34 ExclusiveScan 2122
+            2124:    105(ptr) AccessChain 27(data) 2120 51 30
+                              Store 2124 2123
+            2125:      6(int) Load 8(invocation)
+            2126:    112(ptr) AccessChain 27(data) 38 51
+            2127:   21(ivec4) Load 2126
+            2128:  111(ivec2) VectorShuffle 2127 2127 0 1
+            2129:  111(ivec2) GroupNonUniformBitwiseAnd 34 ExclusiveScan 2128
+            2130:    105(ptr) AccessChain 27(data) 2125 51 30
+            2131:      6(int) CompositeExtract 2129 0
+                              Store 2130 2131
+            2132:    105(ptr) AccessChain 27(data) 2125 51 47
+            2133:      6(int) CompositeExtract 2129 1
+                              Store 2132 2133
+            2134:      6(int) Load 8(invocation)
+            2135:    112(ptr) AccessChain 27(data) 51 51
+            2136:   21(ivec4) Load 2135
+            2137:  122(ivec3) VectorShuffle 2136 2136 0 1 2
+            2138:  122(ivec3) GroupNonUniformBitwiseAnd 34 ExclusiveScan 2137
+            2139:    105(ptr) AccessChain 27(data) 2134 51 30
+            2140:      6(int) CompositeExtract 2138 0
+                              Store 2139 2140
+            2141:    105(ptr) AccessChain 27(data) 2134 51 47
+            2142:      6(int) CompositeExtract 2138 1
+                              Store 2141 2142
+            2143:    105(ptr) AccessChain 27(data) 2134 51 61
+            2144:      6(int) CompositeExtract 2138 2
+                              Store 2143 2144
+            2145:      6(int) Load 8(invocation)
+            2146:    112(ptr) AccessChain 27(data) 65 51
+            2147:   21(ivec4) Load 2146
+            2148:   21(ivec4) GroupNonUniformBitwiseAnd 34 ExclusiveScan 2147
+            2149:    112(ptr) AccessChain 27(data) 2145 51
+                              Store 2149 2148
+            2150:      6(int) Load 8(invocation)
+            2151:     71(ptr) AccessChain 27(data) 29 38 30
+            2152:     19(int) Load 2151
+            2153:   595(bool) SLessThan 2152 29
+            2154:   595(bool) GroupNonUniformLogicalAnd 34 ExclusiveScan 2153
+            2155:     19(int) Select 2154 38 29
+            2156:     71(ptr) AccessChain 27(data) 2150 38 30
+                              Store 2156 2155
+            2157:      6(int) Load 8(invocation)
+            2158:     78(ptr) AccessChain 27(data) 38 38
+            2159:   20(ivec4) Load 2158
+            2160:   77(ivec2) VectorShuffle 2159 2159 0 1
+            2161:  605(bvec2) SLessThan 2160 604
+            2162:  605(bvec2) GroupNonUniformLogicalAnd 34 ExclusiveScan 2161
+            2163:   77(ivec2) Select 2162 608 604
+            2164:     71(ptr) AccessChain 27(data) 2157 38 30
+            2165:     19(int) CompositeExtract 2163 0
+                              Store 2164 2165
+            2166:     71(ptr) AccessChain 27(data) 2157 38 47
+            2167:     19(int) CompositeExtract 2163 1
+                              Store 2166 2167
+            2168:      6(int) Load 8(invocation)
+            2169:     78(ptr) AccessChain 27(data) 38 38
+            2170:   20(ivec4) Load 2169
+            2171:   88(ivec3) VectorShuffle 2170 2170 0 1 2
+            2172:  619(bvec3) SLessThan 2171 618
+            2173:  619(bvec3) GroupNonUniformLogicalAnd 34 ExclusiveScan 2172
+            2174:   88(ivec3) Select 2173 622 618
+            2175:     71(ptr) AccessChain 27(data) 2168 38 30
+            2176:     19(int) CompositeExtract 2174 0
+                              Store 2175 2176
+            2177:     71(ptr) AccessChain 27(data) 2168 38 47
+            2178:     19(int) CompositeExtract 2174 1
+                              Store 2177 2178
+            2179:     71(ptr) AccessChain 27(data) 2168 38 61
+            2180:     19(int) CompositeExtract 2174 2
+                              Store 2179 2180
+            2181:      6(int) Load 8(invocation)
+            2182:     78(ptr) AccessChain 27(data) 38 38
+            2183:   20(ivec4) Load 2182
+            2184:  634(bvec4) SLessThan 2183 633
+            2185:  634(bvec4) GroupNonUniformLogicalAnd 34 ExclusiveScan 2184
+            2186:   20(ivec4) Select 2185 637 633
+            2187:     78(ptr) AccessChain 27(data) 2181 38
+                              Store 2187 2186
+            2188:      6(int) Load 8(invocation)
+            2189:     71(ptr) AccessChain 27(data) 29 38 30
+            2190:     19(int) Load 2189
+            2191:     19(int) GroupNonUniformBitwiseOr 34 ExclusiveScan 2190
+            2192:     71(ptr) AccessChain 27(data) 2188 38 30
+                              Store 2192 2191
+            2193:      6(int) Load 8(invocation)
+            2194:     78(ptr) AccessChain 27(data) 38 38
+            2195:   20(ivec4) Load 2194
+            2196:   77(ivec2) VectorShuffle 2195 2195 0 1
+            2197:   77(ivec2) GroupNonUniformBitwiseOr 34 ExclusiveScan 2196
+            2198:     71(ptr) AccessChain 27(data) 2193 38 30
+            2199:     19(int) CompositeExtract 2197 0
+                              Store 2198 2199
+            2200:     71(ptr) AccessChain 27(data) 2193 38 47
+            2201:     19(int) CompositeExtract 2197 1
+                              Store 2200 2201
+            2202:      6(int) Load 8(invocation)
+            2203:     78(ptr) AccessChain 27(data) 51 38
+            2204:   20(ivec4) Load 2203
+            2205:   88(ivec3) VectorShuffle 2204 2204 0 1 2
+            2206:   88(ivec3) GroupNonUniformBitwiseOr 34 ExclusiveScan 2205
+            2207:     71(ptr) AccessChain 27(data) 2202 38 30
+            2208:     19(int) CompositeExtract 2206 0
+                              Store 2207 2208
+            2209:     71(ptr) AccessChain 27(data) 2202 38 47
+            2210:     19(int) CompositeExtract 2206 1
+                              Store 2209 2210
+            2211:     71(ptr) AccessChain 27(data) 2202 38 61
+            2212:     19(int) CompositeExtract 2206 2
+                              Store 2211 2212
+            2213:      6(int) Load 8(invocation)
+            2214:     78(ptr) AccessChain 27(data) 65 38
+            2215:   20(ivec4) Load 2214
+            2216:   20(ivec4) GroupNonUniformBitwiseOr 34 ExclusiveScan 2215
+            2217:     78(ptr) AccessChain 27(data) 2213 38
+                              Store 2217 2216
+            2218:      6(int) Load 8(invocation)
+            2219:    105(ptr) AccessChain 27(data) 29 51 30
+            2220:      6(int) Load 2219
+            2221:      6(int) GroupNonUniformBitwiseOr 34 ExclusiveScan 2220
+            2222:    105(ptr) AccessChain 27(data) 2218 51 30
+                              Store 2222 2221
+            2223:      6(int) Load 8(invocation)
+            2224:    112(ptr) AccessChain 27(data) 38 51
+            2225:   21(ivec4) Load 2224
+            2226:  111(ivec2) VectorShuffle 2225 2225 0 1
+            2227:  111(ivec2) GroupNonUniformBitwiseOr 34 ExclusiveScan 2226
+            2228:    105(ptr) AccessChain 27(data) 2223 51 30
+            2229:      6(int) CompositeExtract 2227 0
+                              Store 2228 2229
+            2230:    105(ptr) AccessChain 27(data) 2223 51 47
+            2231:      6(int) CompositeExtract 2227 1
+                              Store 2230 2231
+            2232:      6(int) Load 8(invocation)
+            2233:    112(ptr) AccessChain 27(data) 51 51
+            2234:   21(ivec4) Load 2233
+            2235:  122(ivec3) VectorShuffle 2234 2234 0 1 2
+            2236:  122(ivec3) GroupNonUniformBitwiseOr 34 ExclusiveScan 2235
+            2237:    105(ptr) AccessChain 27(data) 2232 51 30
+            2238:      6(int) CompositeExtract 2236 0
+                              Store 2237 2238
+            2239:    105(ptr) AccessChain 27(data) 2232 51 47
+            2240:      6(int) CompositeExtract 2236 1
+                              Store 2239 2240
+            2241:    105(ptr) AccessChain 27(data) 2232 51 61
+            2242:      6(int) CompositeExtract 2236 2
+                              Store 2241 2242
+            2243:      6(int) Load 8(invocation)
+            2244:    112(ptr) AccessChain 27(data) 65 51
+            2245:   21(ivec4) Load 2244
+            2246:   21(ivec4) GroupNonUniformBitwiseOr 34 ExclusiveScan 2245
+            2247:    112(ptr) AccessChain 27(data) 2243 51
+                              Store 2247 2246
+            2248:      6(int) Load 8(invocation)
+            2249:     71(ptr) AccessChain 27(data) 29 38 30
+            2250:     19(int) Load 2249
+            2251:   595(bool) SLessThan 2250 29
+            2252:   595(bool) GroupNonUniformLogicalOr 34 ExclusiveScan 2251
+            2253:     19(int) Select 2252 38 29
+            2254:     71(ptr) AccessChain 27(data) 2248 38 30
+                              Store 2254 2253
+            2255:      6(int) Load 8(invocation)
+            2256:     78(ptr) AccessChain 27(data) 38 38
+            2257:   20(ivec4) Load 2256
+            2258:   77(ivec2) VectorShuffle 2257 2257 0 1
+            2259:  605(bvec2) SLessThan 2258 604
+            2260:  605(bvec2) GroupNonUniformLogicalOr 34 ExclusiveScan 2259
+            2261:   77(ivec2) Select 2260 608 604
+            2262:     71(ptr) AccessChain 27(data) 2255 38 30
+            2263:     19(int) CompositeExtract 2261 0
+                              Store 2262 2263
+            2264:     71(ptr) AccessChain 27(data) 2255 38 47
+            2265:     19(int) CompositeExtract 2261 1
+                              Store 2264 2265
+            2266:      6(int) Load 8(invocation)
+            2267:     78(ptr) AccessChain 27(data) 38 38
+            2268:   20(ivec4) Load 2267
+            2269:   88(ivec3) VectorShuffle 2268 2268 0 1 2
+            2270:  619(bvec3) SLessThan 2269 618
+            2271:  619(bvec3) GroupNonUniformLogicalOr 34 ExclusiveScan 2270
+            2272:   88(ivec3) Select 2271 622 618
+            2273:     71(ptr) AccessChain 27(data) 2266 38 30
+            2274:     19(int) CompositeExtract 2272 0
+                              Store 2273 2274
+            2275:     71(ptr) AccessChain 27(data) 2266 38 47
+            2276:     19(int) CompositeExtract 2272 1
+                              Store 2275 2276
+            2277:     71(ptr) AccessChain 27(data) 2266 38 61
+            2278:     19(int) CompositeExtract 2272 2
+                              Store 2277 2278
+            2279:      6(int) Load 8(invocation)
+            2280:     78(ptr) AccessChain 27(data) 38 38
+            2281:   20(ivec4) Load 2280
+            2282:  634(bvec4) SLessThan 2281 633
+            2283:  634(bvec4) GroupNonUniformLogicalOr 34 ExclusiveScan 2282
+            2284:   20(ivec4) Select 2283 637 633
+            2285:     78(ptr) AccessChain 27(data) 2279 38
+                              Store 2285 2284
+            2286:      6(int) Load 8(invocation)
+            2287:     71(ptr) AccessChain 27(data) 29 38 30
+            2288:     19(int) Load 2287
+            2289:     19(int) GroupNonUniformBitwiseXor 34 ExclusiveScan 2288
+            2290:     71(ptr) AccessChain 27(data) 2286 38 30
+                              Store 2290 2289
+            2291:      6(int) Load 8(invocation)
+            2292:     78(ptr) AccessChain 27(data) 38 38
+            2293:   20(ivec4) Load 2292
+            2294:   77(ivec2) VectorShuffle 2293 2293 0 1
+            2295:   77(ivec2) GroupNonUniformBitwiseXor 34 ExclusiveScan 2294
+            2296:     71(ptr) AccessChain 27(data) 2291 38 30
+            2297:     19(int) CompositeExtract 2295 0
+                              Store 2296 2297
+            2298:     71(ptr) AccessChain 27(data) 2291 38 47
+            2299:     19(int) CompositeExtract 2295 1
+                              Store 2298 2299
+            2300:      6(int) Load 8(invocation)
+            2301:     78(ptr) AccessChain 27(data) 51 38
+            2302:   20(ivec4) Load 2301
+            2303:   88(ivec3) VectorShuffle 2302 2302 0 1 2
+            2304:   88(ivec3) GroupNonUniformBitwiseXor 34 ExclusiveScan 2303
+            2305:     71(ptr) AccessChain 27(data) 2300 38 30
+            2306:     19(int) CompositeExtract 2304 0
+                              Store 2305 2306
+            2307:     71(ptr) AccessChain 27(data) 2300 38 47
+            2308:     19(int) CompositeExtract 2304 1
+                              Store 2307 2308
+            2309:     71(ptr) AccessChain 27(data) 2300 38 61
+            2310:     19(int) CompositeExtract 2304 2
+                              Store 2309 2310
+            2311:      6(int) Load 8(invocation)
+            2312:     78(ptr) AccessChain 27(data) 65 38
+            2313:   20(ivec4) Load 2312
+            2314:   20(ivec4) GroupNonUniformBitwiseXor 34 ExclusiveScan 2313
+            2315:     78(ptr) AccessChain 27(data) 2311 38
+                              Store 2315 2314
+            2316:      6(int) Load 8(invocation)
+            2317:    105(ptr) AccessChain 27(data) 29 51 30
+            2318:      6(int) Load 2317
+            2319:      6(int) GroupNonUniformBitwiseXor 34 ExclusiveScan 2318
+            2320:    105(ptr) AccessChain 27(data) 2316 51 30
+                              Store 2320 2319
+            2321:      6(int) Load 8(invocation)
+            2322:    112(ptr) AccessChain 27(data) 38 51
+            2323:   21(ivec4) Load 2322
+            2324:  111(ivec2) VectorShuffle 2323 2323 0 1
+            2325:  111(ivec2) GroupNonUniformBitwiseXor 34 ExclusiveScan 2324
+            2326:    105(ptr) AccessChain 27(data) 2321 51 30
+            2327:      6(int) CompositeExtract 2325 0
+                              Store 2326 2327
+            2328:    105(ptr) AccessChain 27(data) 2321 51 47
+            2329:      6(int) CompositeExtract 2325 1
+                              Store 2328 2329
+            2330:      6(int) Load 8(invocation)
+            2331:    112(ptr) AccessChain 27(data) 51 51
+            2332:   21(ivec4) Load 2331
+            2333:  122(ivec3) VectorShuffle 2332 2332 0 1 2
+            2334:  122(ivec3) GroupNonUniformBitwiseXor 34 ExclusiveScan 2333
+            2335:    105(ptr) AccessChain 27(data) 2330 51 30
+            2336:      6(int) CompositeExtract 2334 0
+                              Store 2335 2336
+            2337:    105(ptr) AccessChain 27(data) 2330 51 47
+            2338:      6(int) CompositeExtract 2334 1
+                              Store 2337 2338
+            2339:    105(ptr) AccessChain 27(data) 2330 51 61
+            2340:      6(int) CompositeExtract 2334 2
+                              Store 2339 2340
+            2341:      6(int) Load 8(invocation)
+            2342:    112(ptr) AccessChain 27(data) 65 51
+            2343:   21(ivec4) Load 2342
+            2344:   21(ivec4) GroupNonUniformBitwiseXor 34 ExclusiveScan 2343
+            2345:    112(ptr) AccessChain 27(data) 2341 51
+                              Store 2345 2344
+            2346:      6(int) Load 8(invocation)
+            2347:     71(ptr) AccessChain 27(data) 29 38 30
+            2348:     19(int) Load 2347
+            2349:   595(bool) SLessThan 2348 29
+            2350:   595(bool) GroupNonUniformLogicalXor 34 ExclusiveScan 2349
+            2351:     19(int) Select 2350 38 29
+            2352:     71(ptr) AccessChain 27(data) 2346 38 30
+                              Store 2352 2351
+            2353:      6(int) Load 8(invocation)
+            2354:     78(ptr) AccessChain 27(data) 38 38
+            2355:   20(ivec4) Load 2354
+            2356:   77(ivec2) VectorShuffle 2355 2355 0 1
+            2357:  605(bvec2) SLessThan 2356 604
+            2358:  605(bvec2) GroupNonUniformLogicalXor 34 ExclusiveScan 2357
+            2359:   77(ivec2) Select 2358 608 604
+            2360:     71(ptr) AccessChain 27(data) 2353 38 30
+            2361:     19(int) CompositeExtract 2359 0
+                              Store 2360 2361
+            2362:     71(ptr) AccessChain 27(data) 2353 38 47
+            2363:     19(int) CompositeExtract 2359 1
+                              Store 2362 2363
+            2364:      6(int) Load 8(invocation)
+            2365:     78(ptr) AccessChain 27(data) 38 38
+            2366:   20(ivec4) Load 2365
+            2367:   88(ivec3) VectorShuffle 2366 2366 0 1 2
+            2368:  619(bvec3) SLessThan 2367 618
+            2369:  619(bvec3) GroupNonUniformLogicalXor 34 ExclusiveScan 2368
+            2370:   88(ivec3) Select 2369 622 618
+            2371:     71(ptr) AccessChain 27(data) 2364 38 30
+            2372:     19(int) CompositeExtract 2370 0
+                              Store 2371 2372
+            2373:     71(ptr) AccessChain 27(data) 2364 38 47
+            2374:     19(int) CompositeExtract 2370 1
+                              Store 2373 2374
+            2375:     71(ptr) AccessChain 27(data) 2364 38 61
+            2376:     19(int) CompositeExtract 2370 2
+                              Store 2375 2376
+            2377:      6(int) Load 8(invocation)
+            2378:     78(ptr) AccessChain 27(data) 38 38
+            2379:   20(ivec4) Load 2378
+            2380:  634(bvec4) SLessThan 2379 633
+            2381:  634(bvec4) GroupNonUniformLogicalXor 34 ExclusiveScan 2380
+            2382:   20(ivec4) Select 2381 637 633
+            2383:     78(ptr) AccessChain 27(data) 2377 38
+                              Store 2383 2382
                               Return
                               FunctionEnd
diff --git a/third_party/vulkan-deps/glslang/src/Test/baseResults/spv.subgroupBallot.comp.out b/third_party/vulkan-deps/glslang/src/Test/baseResults/spv.subgroupBallot.comp.out
index 0e83773..65cfa7a 100644
--- a/third_party/vulkan-deps/glslang/src/Test/baseResults/spv.subgroupBallot.comp.out
+++ b/third_party/vulkan-deps/glslang/src/Test/baseResults/spv.subgroupBallot.comp.out
@@ -1,7 +1,7 @@
 spv.subgroupBallot.comp
 // Module Version 10300
 // Generated by (magic number): 8000a
-// Id's are bound by 397
+// Id's are bound by 437
 
                               Capability Shader
                               Capability Float64
@@ -51,7 +51,7 @@
                               Decorate 46(Buffers) Block
                               Decorate 49(data) DescriptorSet 0
                               Decorate 49(data) Binding 0
-                              Decorate 396 BuiltIn WorkgroupSize
+                              Decorate 436 BuiltIn WorkgroupSize
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeInt 32 0
@@ -93,28 +93,28 @@
               96:             TypePointer StorageBuffer 40(float)
              102:             TypeVector 40(float) 2
              103:             TypePointer StorageBuffer 41(fvec4)
-             112:             TypeVector 40(float) 3
-             121:     42(int) Constant 3
-             127:             TypePointer StorageBuffer 42(int)
-             133:             TypeVector 42(int) 2
-             134:             TypePointer StorageBuffer 43(ivec4)
-             143:             TypeVector 42(int) 3
-             162:             TypeVector 6(int) 2
-             171:             TypeVector 6(int) 3
-             185:             TypePointer StorageBuffer 44(float64_t)
-             191:             TypeVector 44(float64_t) 2
-             192:             TypePointer StorageBuffer 45(f64vec4)
-             201:             TypeVector 44(float64_t) 3
-             225:  133(ivec2) ConstantComposite 61 61
-             226:             TypeVector 36(bool) 2
-             229:  133(ivec2) ConstantComposite 60 60
-             238:  143(ivec3) ConstantComposite 61 61 61
-             239:             TypeVector 36(bool) 3
-             242:  143(ivec3) ConstantComposite 60 60 60
-             250:   43(ivec4) ConstantComposite 61 61 61 61
-             253:   43(ivec4) ConstantComposite 60 60 60 60
-             395:      6(int) Constant 8
-             396:  171(ivec3) ConstantComposite 395 395 64
+             113:             TypeVector 40(float) 3
+             125:     42(int) Constant 3
+             131:             TypePointer StorageBuffer 42(int)
+             137:             TypeVector 42(int) 2
+             138:             TypePointer StorageBuffer 43(ivec4)
+             148:             TypeVector 42(int) 3
+             170:             TypeVector 6(int) 2
+             180:             TypeVector 6(int) 3
+             197:             TypePointer StorageBuffer 44(float64_t)
+             203:             TypeVector 44(float64_t) 2
+             204:             TypePointer StorageBuffer 45(f64vec4)
+             214:             TypeVector 44(float64_t) 3
+             241:  137(ivec2) ConstantComposite 61 61
+             242:             TypeVector 36(bool) 2
+             245:  137(ivec2) ConstantComposite 60 60
+             255:  148(ivec3) ConstantComposite 61 61 61
+             256:             TypeVector 36(bool) 3
+             259:  148(ivec3) ConstantComposite 60 60 60
+             270:   43(ivec4) ConstantComposite 61 61 61 61
+             273:   43(ivec4) ConstantComposite 60 60 60 60
+             435:      6(int) Constant 8
+             436:  180(ivec3) ConstantComposite 435 435 64
          4(main):           2 Function None 3
                5:             Label
    8(invocation):      7(ptr) Variable Function
@@ -179,7 +179,7 @@
               87:             Label
               92:    36(bool) Phi 85 5 91 86
                               SelectionMerge 94 None
-                              BranchConditional 92 93 256
+                              BranchConditional 92 93 276
               93:               Label
               95:      6(int)   Load 8(invocation)
               97:     96(ptr)   AccessChain 49(data) 61 61 54
@@ -192,313 +192,383 @@
              105:   41(fvec4)   Load 104
              106:  102(fvec2)   VectorShuffle 105 105 0 1
              107:  102(fvec2)   GroupNonUniformBroadcast 38 106 38
-             108:    103(ptr)   AccessChain 49(data) 101 61
-             109:   41(fvec4)   Load 108
-             110:   41(fvec4)   VectorShuffle 109 107 4 5 2 3
-                                Store 108 110
-             111:      6(int)   Load 8(invocation)
-             113:    103(ptr)   AccessChain 49(data) 51 61
-             114:   41(fvec4)   Load 113
-             115:  112(fvec3)   VectorShuffle 114 114 0 1 2
-             116:  112(fvec3)   GroupNonUniformBroadcast 38 115 38
-             117:    103(ptr)   AccessChain 49(data) 111 61
-             118:   41(fvec4)   Load 117
-             119:   41(fvec4)   VectorShuffle 118 116 4 5 6 3
-                                Store 117 119
-             120:      6(int)   Load 8(invocation)
-             122:    103(ptr)   AccessChain 49(data) 121 61
-             123:   41(fvec4)   Load 122
-             124:   41(fvec4)   GroupNonUniformBroadcast 38 123 38
-             125:    103(ptr)   AccessChain 49(data) 120 61
-                                Store 125 124
-             126:      6(int)   Load 8(invocation)
-             128:    127(ptr)   AccessChain 49(data) 61 60 54
-             129:     42(int)   Load 128
-             130:     42(int)   GroupNonUniformBroadcast 38 129 72
-             131:    127(ptr)   AccessChain 49(data) 126 60 54
-                                Store 131 130
-             132:      6(int)   Load 8(invocation)
-             135:    134(ptr)   AccessChain 49(data) 60 60
-             136:   43(ivec4)   Load 135
-             137:  133(ivec2)   VectorShuffle 136 136 0 1
-             138:  133(ivec2)   GroupNonUniformBroadcast 38 137 72
-             139:    134(ptr)   AccessChain 49(data) 132 60
+             108:     96(ptr)   AccessChain 49(data) 101 61 54
+             109:   40(float)   CompositeExtract 107 0
+                                Store 108 109
+             110:     96(ptr)   AccessChain 49(data) 101 61 64
+             111:   40(float)   CompositeExtract 107 1
+                                Store 110 111
+             112:      6(int)   Load 8(invocation)
+             114:    103(ptr)   AccessChain 49(data) 51 61
+             115:   41(fvec4)   Load 114
+             116:  113(fvec3)   VectorShuffle 115 115 0 1 2
+             117:  113(fvec3)   GroupNonUniformBroadcast 38 116 38
+             118:     96(ptr)   AccessChain 49(data) 112 61 54
+             119:   40(float)   CompositeExtract 117 0
+                                Store 118 119
+             120:     96(ptr)   AccessChain 49(data) 112 61 64
+             121:   40(float)   CompositeExtract 117 1
+                                Store 120 121
+             122:     96(ptr)   AccessChain 49(data) 112 61 72
+             123:   40(float)   CompositeExtract 117 2
+                                Store 122 123
+             124:      6(int)   Load 8(invocation)
+             126:    103(ptr)   AccessChain 49(data) 125 61
+             127:   41(fvec4)   Load 126
+             128:   41(fvec4)   GroupNonUniformBroadcast 38 127 38
+             129:    103(ptr)   AccessChain 49(data) 124 61
+                                Store 129 128
+             130:      6(int)   Load 8(invocation)
+             132:    131(ptr)   AccessChain 49(data) 61 60 54
+             133:     42(int)   Load 132
+             134:     42(int)   GroupNonUniformBroadcast 38 133 72
+             135:    131(ptr)   AccessChain 49(data) 130 60 54
+                                Store 135 134
+             136:      6(int)   Load 8(invocation)
+             139:    138(ptr)   AccessChain 49(data) 60 60
              140:   43(ivec4)   Load 139
-             141:   43(ivec4)   VectorShuffle 140 138 4 5 2 3
-                                Store 139 141
-             142:      6(int)   Load 8(invocation)
-             144:    134(ptr)   AccessChain 49(data) 51 60
-             145:   43(ivec4)   Load 144
-             146:  143(ivec3)   VectorShuffle 145 145 0 1 2
-             147:  143(ivec3)   GroupNonUniformBroadcast 38 146 72
-             148:    134(ptr)   AccessChain 49(data) 142 60
-             149:   43(ivec4)   Load 148
-             150:   43(ivec4)   VectorShuffle 149 147 4 5 6 3
-                                Store 148 150
-             151:      6(int)   Load 8(invocation)
-             152:    134(ptr)   AccessChain 49(data) 121 60
-             153:   43(ivec4)   Load 152
-             154:   43(ivec4)   GroupNonUniformBroadcast 38 153 72
-             155:    134(ptr)   AccessChain 49(data) 151 60
-                                Store 155 154
-             156:      6(int)   Load 8(invocation)
-             157:     55(ptr)   AccessChain 49(data) 61 51 54
-             158:      6(int)   Load 157
-             159:      6(int)   GroupNonUniformBroadcast 38 158 64
-             160:     55(ptr)   AccessChain 49(data) 156 51 54
-                                Store 160 159
-             161:      6(int)   Load 8(invocation)
-             163:     88(ptr)   AccessChain 49(data) 60 51
-             164:   17(ivec4)   Load 163
-             165:  162(ivec2)   VectorShuffle 164 164 0 1
-             166:  162(ivec2)   GroupNonUniformBroadcast 38 165 64
-             167:     88(ptr)   AccessChain 49(data) 161 51
-             168:   17(ivec4)   Load 167
-             169:   17(ivec4)   VectorShuffle 168 166 4 5 2 3
-                                Store 167 169
-             170:      6(int)   Load 8(invocation)
-             172:     88(ptr)   AccessChain 49(data) 51 51
-             173:   17(ivec4)   Load 172
-             174:  171(ivec3)   VectorShuffle 173 173 0 1 2
-             175:  171(ivec3)   GroupNonUniformBroadcast 38 174 64
-             176:     88(ptr)   AccessChain 49(data) 170 51
-             177:   17(ivec4)   Load 176
-             178:   17(ivec4)   VectorShuffle 177 175 4 5 6 3
-                                Store 176 178
+             141:  137(ivec2)   VectorShuffle 140 140 0 1
+             142:  137(ivec2)   GroupNonUniformBroadcast 38 141 72
+             143:    131(ptr)   AccessChain 49(data) 136 60 54
+             144:     42(int)   CompositeExtract 142 0
+                                Store 143 144
+             145:    131(ptr)   AccessChain 49(data) 136 60 64
+             146:     42(int)   CompositeExtract 142 1
+                                Store 145 146
+             147:      6(int)   Load 8(invocation)
+             149:    138(ptr)   AccessChain 49(data) 51 60
+             150:   43(ivec4)   Load 149
+             151:  148(ivec3)   VectorShuffle 150 150 0 1 2
+             152:  148(ivec3)   GroupNonUniformBroadcast 38 151 72
+             153:    131(ptr)   AccessChain 49(data) 147 60 54
+             154:     42(int)   CompositeExtract 152 0
+                                Store 153 154
+             155:    131(ptr)   AccessChain 49(data) 147 60 64
+             156:     42(int)   CompositeExtract 152 1
+                                Store 155 156
+             157:    131(ptr)   AccessChain 49(data) 147 60 72
+             158:     42(int)   CompositeExtract 152 2
+                                Store 157 158
+             159:      6(int)   Load 8(invocation)
+             160:    138(ptr)   AccessChain 49(data) 125 60
+             161:   43(ivec4)   Load 160
+             162:   43(ivec4)   GroupNonUniformBroadcast 38 161 72
+             163:    138(ptr)   AccessChain 49(data) 159 60
+                                Store 163 162
+             164:      6(int)   Load 8(invocation)
+             165:     55(ptr)   AccessChain 49(data) 61 51 54
+             166:      6(int)   Load 165
+             167:      6(int)   GroupNonUniformBroadcast 38 166 64
+             168:     55(ptr)   AccessChain 49(data) 164 51 54
+                                Store 168 167
+             169:      6(int)   Load 8(invocation)
+             171:     88(ptr)   AccessChain 49(data) 60 51
+             172:   17(ivec4)   Load 171
+             173:  170(ivec2)   VectorShuffle 172 172 0 1
+             174:  170(ivec2)   GroupNonUniformBroadcast 38 173 64
+             175:     55(ptr)   AccessChain 49(data) 169 51 54
+             176:      6(int)   CompositeExtract 174 0
+                                Store 175 176
+             177:     55(ptr)   AccessChain 49(data) 169 51 64
+             178:      6(int)   CompositeExtract 174 1
+                                Store 177 178
              179:      6(int)   Load 8(invocation)
-             180:     88(ptr)   AccessChain 49(data) 121 51
-             181:   17(ivec4)   Load 180
-             182:   17(ivec4)   GroupNonUniformBroadcast 38 181 64
-             183:     88(ptr)   AccessChain 49(data) 179 51
-                                Store 183 182
-             184:      6(int)   Load 8(invocation)
-             186:    185(ptr)   AccessChain 49(data) 61 121 54
-             187:44(float64_t)   Load 186
-             188:44(float64_t)   GroupNonUniformBroadcast 38 187 54
-             189:    185(ptr)   AccessChain 49(data) 184 121 54
-                                Store 189 188
-             190:      6(int)   Load 8(invocation)
-             193:    192(ptr)   AccessChain 49(data) 60 121
-             194: 45(f64vec4)   Load 193
-             195:191(f64vec2)   VectorShuffle 194 194 0 1
-             196:191(f64vec2)   GroupNonUniformBroadcast 38 195 54
-             197:    192(ptr)   AccessChain 49(data) 190 121
-             198: 45(f64vec4)   Load 197
-             199: 45(f64vec4)   VectorShuffle 198 196 4 5 2 3
-                                Store 197 199
-             200:      6(int)   Load 8(invocation)
-             202:    192(ptr)   AccessChain 49(data) 51 121
-             203: 45(f64vec4)   Load 202
-             204:201(f64vec3)   VectorShuffle 203 203 0 1 2
-             205:201(f64vec3)   GroupNonUniformBroadcast 38 204 54
-             206:    192(ptr)   AccessChain 49(data) 200 121
-             207: 45(f64vec4)   Load 206
-             208: 45(f64vec4)   VectorShuffle 207 205 4 5 6 3
-                                Store 206 208
-             209:      6(int)   Load 8(invocation)
-             210:    192(ptr)   AccessChain 49(data) 121 121
-             211: 45(f64vec4)   Load 210
-             212: 45(f64vec4)   GroupNonUniformBroadcast 38 211 54
-             213:    192(ptr)   AccessChain 49(data) 209 121
-                                Store 213 212
-             214:      6(int)   Load 8(invocation)
-             215:    127(ptr)   AccessChain 49(data) 61 60 54
-             216:     42(int)   Load 215
-             217:    36(bool)   SLessThan 216 61
-             218:    36(bool)   GroupNonUniformBroadcast 38 217 64
-             219:     42(int)   Select 218 60 61
-             220:    127(ptr)   AccessChain 49(data) 214 60 54
-                                Store 220 219
-             221:      6(int)   Load 8(invocation)
-             222:    134(ptr)   AccessChain 49(data) 60 60
-             223:   43(ivec4)   Load 222
-             224:  133(ivec2)   VectorShuffle 223 223 0 1
-             227:  226(bvec2)   SLessThan 224 225
-             228:  226(bvec2)   GroupNonUniformBroadcast 38 227 64
-             230:  133(ivec2)   Select 228 229 225
-             231:    134(ptr)   AccessChain 49(data) 221 60
-             232:   43(ivec4)   Load 231
-             233:   43(ivec4)   VectorShuffle 232 230 4 5 2 3
-                                Store 231 233
-             234:      6(int)   Load 8(invocation)
-             235:    134(ptr)   AccessChain 49(data) 60 60
-             236:   43(ivec4)   Load 235
-             237:  143(ivec3)   VectorShuffle 236 236 0 1 2
-             240:  239(bvec3)   SLessThan 237 238
-             241:  239(bvec3)   GroupNonUniformBroadcast 38 240 64
-             243:  143(ivec3)   Select 241 242 238
-             244:    134(ptr)   AccessChain 49(data) 234 60
-             245:   43(ivec4)   Load 244
-             246:   43(ivec4)   VectorShuffle 245 243 4 5 6 3
-                                Store 244 246
-             247:      6(int)   Load 8(invocation)
-             248:    134(ptr)   AccessChain 49(data) 60 60
-             249:   43(ivec4)   Load 248
-             251:   83(bvec4)   SLessThan 249 250
-             252:   83(bvec4)   GroupNonUniformBroadcast 38 251 64
-             254:   43(ivec4)   Select 252 253 250
-             255:    134(ptr)   AccessChain 49(data) 247 60
-                                Store 255 254
+             181:     88(ptr)   AccessChain 49(data) 51 51
+             182:   17(ivec4)   Load 181
+             183:  180(ivec3)   VectorShuffle 182 182 0 1 2
+             184:  180(ivec3)   GroupNonUniformBroadcast 38 183 64
+             185:     55(ptr)   AccessChain 49(data) 179 51 54
+             186:      6(int)   CompositeExtract 184 0
+                                Store 185 186
+             187:     55(ptr)   AccessChain 49(data) 179 51 64
+             188:      6(int)   CompositeExtract 184 1
+                                Store 187 188
+             189:     55(ptr)   AccessChain 49(data) 179 51 72
+             190:      6(int)   CompositeExtract 184 2
+                                Store 189 190
+             191:      6(int)   Load 8(invocation)
+             192:     88(ptr)   AccessChain 49(data) 125 51
+             193:   17(ivec4)   Load 192
+             194:   17(ivec4)   GroupNonUniformBroadcast 38 193 64
+             195:     88(ptr)   AccessChain 49(data) 191 51
+                                Store 195 194
+             196:      6(int)   Load 8(invocation)
+             198:    197(ptr)   AccessChain 49(data) 61 125 54
+             199:44(float64_t)   Load 198
+             200:44(float64_t)   GroupNonUniformBroadcast 38 199 54
+             201:    197(ptr)   AccessChain 49(data) 196 125 54
+                                Store 201 200
+             202:      6(int)   Load 8(invocation)
+             205:    204(ptr)   AccessChain 49(data) 60 125
+             206: 45(f64vec4)   Load 205
+             207:203(f64vec2)   VectorShuffle 206 206 0 1
+             208:203(f64vec2)   GroupNonUniformBroadcast 38 207 54
+             209:    197(ptr)   AccessChain 49(data) 202 125 54
+             210:44(float64_t)   CompositeExtract 208 0
+                                Store 209 210
+             211:    197(ptr)   AccessChain 49(data) 202 125 64
+             212:44(float64_t)   CompositeExtract 208 1
+                                Store 211 212
+             213:      6(int)   Load 8(invocation)
+             215:    204(ptr)   AccessChain 49(data) 51 125
+             216: 45(f64vec4)   Load 215
+             217:214(f64vec3)   VectorShuffle 216 216 0 1 2
+             218:214(f64vec3)   GroupNonUniformBroadcast 38 217 54
+             219:    197(ptr)   AccessChain 49(data) 213 125 54
+             220:44(float64_t)   CompositeExtract 218 0
+                                Store 219 220
+             221:    197(ptr)   AccessChain 49(data) 213 125 64
+             222:44(float64_t)   CompositeExtract 218 1
+                                Store 221 222
+             223:    197(ptr)   AccessChain 49(data) 213 125 72
+             224:44(float64_t)   CompositeExtract 218 2
+                                Store 223 224
+             225:      6(int)   Load 8(invocation)
+             226:    204(ptr)   AccessChain 49(data) 125 125
+             227: 45(f64vec4)   Load 226
+             228: 45(f64vec4)   GroupNonUniformBroadcast 38 227 54
+             229:    204(ptr)   AccessChain 49(data) 225 125
+                                Store 229 228
+             230:      6(int)   Load 8(invocation)
+             231:    131(ptr)   AccessChain 49(data) 61 60 54
+             232:     42(int)   Load 231
+             233:    36(bool)   SLessThan 232 61
+             234:    36(bool)   GroupNonUniformBroadcast 38 233 64
+             235:     42(int)   Select 234 60 61
+             236:    131(ptr)   AccessChain 49(data) 230 60 54
+                                Store 236 235
+             237:      6(int)   Load 8(invocation)
+             238:    138(ptr)   AccessChain 49(data) 60 60
+             239:   43(ivec4)   Load 238
+             240:  137(ivec2)   VectorShuffle 239 239 0 1
+             243:  242(bvec2)   SLessThan 240 241
+             244:  242(bvec2)   GroupNonUniformBroadcast 38 243 64
+             246:  137(ivec2)   Select 244 245 241
+             247:    131(ptr)   AccessChain 49(data) 237 60 54
+             248:     42(int)   CompositeExtract 246 0
+                                Store 247 248
+             249:    131(ptr)   AccessChain 49(data) 237 60 64
+             250:     42(int)   CompositeExtract 246 1
+                                Store 249 250
+             251:      6(int)   Load 8(invocation)
+             252:    138(ptr)   AccessChain 49(data) 60 60
+             253:   43(ivec4)   Load 252
+             254:  148(ivec3)   VectorShuffle 253 253 0 1 2
+             257:  256(bvec3)   SLessThan 254 255
+             258:  256(bvec3)   GroupNonUniformBroadcast 38 257 64
+             260:  148(ivec3)   Select 258 259 255
+             261:    131(ptr)   AccessChain 49(data) 251 60 54
+             262:     42(int)   CompositeExtract 260 0
+                                Store 261 262
+             263:    131(ptr)   AccessChain 49(data) 251 60 64
+             264:     42(int)   CompositeExtract 260 1
+                                Store 263 264
+             265:    131(ptr)   AccessChain 49(data) 251 60 72
+             266:     42(int)   CompositeExtract 260 2
+                                Store 265 266
+             267:      6(int)   Load 8(invocation)
+             268:    138(ptr)   AccessChain 49(data) 60 60
+             269:   43(ivec4)   Load 268
+             271:   83(bvec4)   SLessThan 269 270
+             272:   83(bvec4)   GroupNonUniformBroadcast 38 271 64
+             274:   43(ivec4)   Select 272 273 270
+             275:    138(ptr)   AccessChain 49(data) 267 60
+                                Store 275 274
                                 Branch 94
-             256:               Label
-             257:      6(int)   Load 8(invocation)
-             258:     96(ptr)   AccessChain 49(data) 61 61 54
-             259:   40(float)   Load 258
-             260:   40(float)   GroupNonUniformBroadcastFirst 38 259
-             261:     96(ptr)   AccessChain 49(data) 257 61 54
-                                Store 261 260
-             262:      6(int)   Load 8(invocation)
-             263:    103(ptr)   AccessChain 49(data) 60 61
-             264:   41(fvec4)   Load 263
-             265:  102(fvec2)   VectorShuffle 264 264 0 1
-             266:  102(fvec2)   GroupNonUniformBroadcastFirst 38 265
-             267:    103(ptr)   AccessChain 49(data) 262 61
-             268:   41(fvec4)   Load 267
-             269:   41(fvec4)   VectorShuffle 268 266 4 5 2 3
-                                Store 267 269
-             270:      6(int)   Load 8(invocation)
-             271:    103(ptr)   AccessChain 49(data) 51 61
-             272:   41(fvec4)   Load 271
-             273:  112(fvec3)   VectorShuffle 272 272 0 1 2
-             274:  112(fvec3)   GroupNonUniformBroadcastFirst 38 273
-             275:    103(ptr)   AccessChain 49(data) 270 61
-             276:   41(fvec4)   Load 275
-             277:   41(fvec4)   VectorShuffle 276 274 4 5 6 3
-                                Store 275 277
-             278:      6(int)   Load 8(invocation)
-             279:    103(ptr)   AccessChain 49(data) 121 61
-             280:   41(fvec4)   Load 279
-             281:   41(fvec4)   GroupNonUniformBroadcastFirst 38 280
-             282:    103(ptr)   AccessChain 49(data) 278 61
-                                Store 282 281
-             283:      6(int)   Load 8(invocation)
-             284:    127(ptr)   AccessChain 49(data) 61 60 54
-             285:     42(int)   Load 284
-             286:     42(int)   GroupNonUniformBroadcastFirst 38 285
-             287:    127(ptr)   AccessChain 49(data) 283 60 54
-                                Store 287 286
-             288:      6(int)   Load 8(invocation)
-             289:    134(ptr)   AccessChain 49(data) 60 60
-             290:   43(ivec4)   Load 289
-             291:  133(ivec2)   VectorShuffle 290 290 0 1
-             292:  133(ivec2)   GroupNonUniformBroadcastFirst 38 291
-             293:    134(ptr)   AccessChain 49(data) 288 60
-             294:   43(ivec4)   Load 293
-             295:   43(ivec4)   VectorShuffle 294 292 4 5 2 3
-                                Store 293 295
-             296:      6(int)   Load 8(invocation)
-             297:    134(ptr)   AccessChain 49(data) 51 60
-             298:   43(ivec4)   Load 297
-             299:  143(ivec3)   VectorShuffle 298 298 0 1 2
-             300:  143(ivec3)   GroupNonUniformBroadcastFirst 38 299
-             301:    134(ptr)   AccessChain 49(data) 296 60
-             302:   43(ivec4)   Load 301
-             303:   43(ivec4)   VectorShuffle 302 300 4 5 6 3
-                                Store 301 303
-             304:      6(int)   Load 8(invocation)
-             305:    134(ptr)   AccessChain 49(data) 121 60
-             306:   43(ivec4)   Load 305
-             307:   43(ivec4)   GroupNonUniformBroadcastFirst 38 306
-             308:    134(ptr)   AccessChain 49(data) 304 60
-                                Store 308 307
-             309:      6(int)   Load 8(invocation)
-             310:     55(ptr)   AccessChain 49(data) 61 51 54
-             311:      6(int)   Load 310
-             312:      6(int)   GroupNonUniformBroadcastFirst 38 311
-             313:     55(ptr)   AccessChain 49(data) 309 51 54
-                                Store 313 312
-             314:      6(int)   Load 8(invocation)
-             315:     88(ptr)   AccessChain 49(data) 60 51
-             316:   17(ivec4)   Load 315
-             317:  162(ivec2)   VectorShuffle 316 316 0 1
-             318:  162(ivec2)   GroupNonUniformBroadcastFirst 38 317
-             319:     88(ptr)   AccessChain 49(data) 314 51
-             320:   17(ivec4)   Load 319
-             321:   17(ivec4)   VectorShuffle 320 318 4 5 2 3
-                                Store 319 321
-             322:      6(int)   Load 8(invocation)
-             323:     88(ptr)   AccessChain 49(data) 51 51
-             324:   17(ivec4)   Load 323
-             325:  171(ivec3)   VectorShuffle 324 324 0 1 2
-             326:  171(ivec3)   GroupNonUniformBroadcastFirst 38 325
-             327:     88(ptr)   AccessChain 49(data) 322 51
-             328:   17(ivec4)   Load 327
-             329:   17(ivec4)   VectorShuffle 328 326 4 5 6 3
-                                Store 327 329
-             330:      6(int)   Load 8(invocation)
-             331:     88(ptr)   AccessChain 49(data) 121 51
-             332:   17(ivec4)   Load 331
-             333:   17(ivec4)   GroupNonUniformBroadcastFirst 38 332
-             334:     88(ptr)   AccessChain 49(data) 330 51
-                                Store 334 333
-             335:      6(int)   Load 8(invocation)
-             336:    185(ptr)   AccessChain 49(data) 61 121 54
-             337:44(float64_t)   Load 336
-             338:44(float64_t)   GroupNonUniformBroadcastFirst 38 337
-             339:    185(ptr)   AccessChain 49(data) 335 121 54
-                                Store 339 338
-             340:      6(int)   Load 8(invocation)
-             341:    192(ptr)   AccessChain 49(data) 60 121
-             342: 45(f64vec4)   Load 341
-             343:191(f64vec2)   VectorShuffle 342 342 0 1
-             344:191(f64vec2)   GroupNonUniformBroadcastFirst 38 343
-             345:    192(ptr)   AccessChain 49(data) 340 121
-             346: 45(f64vec4)   Load 345
-             347: 45(f64vec4)   VectorShuffle 346 344 4 5 2 3
-                                Store 345 347
-             348:      6(int)   Load 8(invocation)
-             349:    192(ptr)   AccessChain 49(data) 51 121
-             350: 45(f64vec4)   Load 349
-             351:201(f64vec3)   VectorShuffle 350 350 0 1 2
-             352:201(f64vec3)   GroupNonUniformBroadcastFirst 38 351
-             353:    192(ptr)   AccessChain 49(data) 348 121
-             354: 45(f64vec4)   Load 353
-             355: 45(f64vec4)   VectorShuffle 354 352 4 5 6 3
-                                Store 353 355
-             356:      6(int)   Load 8(invocation)
-             357:    192(ptr)   AccessChain 49(data) 121 121
-             358: 45(f64vec4)   Load 357
-             359: 45(f64vec4)   GroupNonUniformBroadcastFirst 38 358
-             360:    192(ptr)   AccessChain 49(data) 356 121
-                                Store 360 359
-             361:      6(int)   Load 8(invocation)
-             362:    127(ptr)   AccessChain 49(data) 61 60 54
-             363:     42(int)   Load 362
-             364:    36(bool)   SLessThan 363 61
-             365:    36(bool)   GroupNonUniformBroadcastFirst 38 364
-             366:     42(int)   Select 365 60 61
-             367:    127(ptr)   AccessChain 49(data) 361 60 54
-                                Store 367 366
-             368:      6(int)   Load 8(invocation)
-             369:    134(ptr)   AccessChain 49(data) 60 60
-             370:   43(ivec4)   Load 369
-             371:  133(ivec2)   VectorShuffle 370 370 0 1
-             372:  226(bvec2)   SLessThan 371 225
-             373:  226(bvec2)   GroupNonUniformBroadcastFirst 38 372
-             374:  133(ivec2)   Select 373 229 225
-             375:    134(ptr)   AccessChain 49(data) 368 60
-             376:   43(ivec4)   Load 375
-             377:   43(ivec4)   VectorShuffle 376 374 4 5 2 3
-                                Store 375 377
-             378:      6(int)   Load 8(invocation)
-             379:    134(ptr)   AccessChain 49(data) 60 60
-             380:   43(ivec4)   Load 379
-             381:  143(ivec3)   VectorShuffle 380 380 0 1 2
-             382:  239(bvec3)   SLessThan 381 238
-             383:  239(bvec3)   GroupNonUniformBroadcastFirst 38 382
-             384:  143(ivec3)   Select 383 242 238
-             385:    134(ptr)   AccessChain 49(data) 378 60
-             386:   43(ivec4)   Load 385
-             387:   43(ivec4)   VectorShuffle 386 384 4 5 6 3
-                                Store 385 387
-             388:      6(int)   Load 8(invocation)
-             389:    134(ptr)   AccessChain 49(data) 60 60
-             390:   43(ivec4)   Load 389
-             391:   83(bvec4)   SLessThan 390 250
-             392:   83(bvec4)   GroupNonUniformBroadcastFirst 38 391
-             393:   43(ivec4)   Select 392 253 250
-             394:    134(ptr)   AccessChain 49(data) 388 60
-                                Store 394 393
+             276:               Label
+             277:      6(int)   Load 8(invocation)
+             278:     96(ptr)   AccessChain 49(data) 61 61 54
+             279:   40(float)   Load 278
+             280:   40(float)   GroupNonUniformBroadcastFirst 38 279
+             281:     96(ptr)   AccessChain 49(data) 277 61 54
+                                Store 281 280
+             282:      6(int)   Load 8(invocation)
+             283:    103(ptr)   AccessChain 49(data) 60 61
+             284:   41(fvec4)   Load 283
+             285:  102(fvec2)   VectorShuffle 284 284 0 1
+             286:  102(fvec2)   GroupNonUniformBroadcastFirst 38 285
+             287:     96(ptr)   AccessChain 49(data) 282 61 54
+             288:   40(float)   CompositeExtract 286 0
+                                Store 287 288
+             289:     96(ptr)   AccessChain 49(data) 282 61 64
+             290:   40(float)   CompositeExtract 286 1
+                                Store 289 290
+             291:      6(int)   Load 8(invocation)
+             292:    103(ptr)   AccessChain 49(data) 51 61
+             293:   41(fvec4)   Load 292
+             294:  113(fvec3)   VectorShuffle 293 293 0 1 2
+             295:  113(fvec3)   GroupNonUniformBroadcastFirst 38 294
+             296:     96(ptr)   AccessChain 49(data) 291 61 54
+             297:   40(float)   CompositeExtract 295 0
+                                Store 296 297
+             298:     96(ptr)   AccessChain 49(data) 291 61 64
+             299:   40(float)   CompositeExtract 295 1
+                                Store 298 299
+             300:     96(ptr)   AccessChain 49(data) 291 61 72
+             301:   40(float)   CompositeExtract 295 2
+                                Store 300 301
+             302:      6(int)   Load 8(invocation)
+             303:    103(ptr)   AccessChain 49(data) 125 61
+             304:   41(fvec4)   Load 303
+             305:   41(fvec4)   GroupNonUniformBroadcastFirst 38 304
+             306:    103(ptr)   AccessChain 49(data) 302 61
+                                Store 306 305
+             307:      6(int)   Load 8(invocation)
+             308:    131(ptr)   AccessChain 49(data) 61 60 54
+             309:     42(int)   Load 308
+             310:     42(int)   GroupNonUniformBroadcastFirst 38 309
+             311:    131(ptr)   AccessChain 49(data) 307 60 54
+                                Store 311 310
+             312:      6(int)   Load 8(invocation)
+             313:    138(ptr)   AccessChain 49(data) 60 60
+             314:   43(ivec4)   Load 313
+             315:  137(ivec2)   VectorShuffle 314 314 0 1
+             316:  137(ivec2)   GroupNonUniformBroadcastFirst 38 315
+             317:    131(ptr)   AccessChain 49(data) 312 60 54
+             318:     42(int)   CompositeExtract 316 0
+                                Store 317 318
+             319:    131(ptr)   AccessChain 49(data) 312 60 64
+             320:     42(int)   CompositeExtract 316 1
+                                Store 319 320
+             321:      6(int)   Load 8(invocation)
+             322:    138(ptr)   AccessChain 49(data) 51 60
+             323:   43(ivec4)   Load 322
+             324:  148(ivec3)   VectorShuffle 323 323 0 1 2
+             325:  148(ivec3)   GroupNonUniformBroadcastFirst 38 324
+             326:    131(ptr)   AccessChain 49(data) 321 60 54
+             327:     42(int)   CompositeExtract 325 0
+                                Store 326 327
+             328:    131(ptr)   AccessChain 49(data) 321 60 64
+             329:     42(int)   CompositeExtract 325 1
+                                Store 328 329
+             330:    131(ptr)   AccessChain 49(data) 321 60 72
+             331:     42(int)   CompositeExtract 325 2
+                                Store 330 331
+             332:      6(int)   Load 8(invocation)
+             333:    138(ptr)   AccessChain 49(data) 125 60
+             334:   43(ivec4)   Load 333
+             335:   43(ivec4)   GroupNonUniformBroadcastFirst 38 334
+             336:    138(ptr)   AccessChain 49(data) 332 60
+                                Store 336 335
+             337:      6(int)   Load 8(invocation)
+             338:     55(ptr)   AccessChain 49(data) 61 51 54
+             339:      6(int)   Load 338
+             340:      6(int)   GroupNonUniformBroadcastFirst 38 339
+             341:     55(ptr)   AccessChain 49(data) 337 51 54
+                                Store 341 340
+             342:      6(int)   Load 8(invocation)
+             343:     88(ptr)   AccessChain 49(data) 60 51
+             344:   17(ivec4)   Load 343
+             345:  170(ivec2)   VectorShuffle 344 344 0 1
+             346:  170(ivec2)   GroupNonUniformBroadcastFirst 38 345
+             347:     55(ptr)   AccessChain 49(data) 342 51 54
+             348:      6(int)   CompositeExtract 346 0
+                                Store 347 348
+             349:     55(ptr)   AccessChain 49(data) 342 51 64
+             350:      6(int)   CompositeExtract 346 1
+                                Store 349 350
+             351:      6(int)   Load 8(invocation)
+             352:     88(ptr)   AccessChain 49(data) 51 51
+             353:   17(ivec4)   Load 352
+             354:  180(ivec3)   VectorShuffle 353 353 0 1 2
+             355:  180(ivec3)   GroupNonUniformBroadcastFirst 38 354
+             356:     55(ptr)   AccessChain 49(data) 351 51 54
+             357:      6(int)   CompositeExtract 355 0
+                                Store 356 357
+             358:     55(ptr)   AccessChain 49(data) 351 51 64
+             359:      6(int)   CompositeExtract 355 1
+                                Store 358 359
+             360:     55(ptr)   AccessChain 49(data) 351 51 72
+             361:      6(int)   CompositeExtract 355 2
+                                Store 360 361
+             362:      6(int)   Load 8(invocation)
+             363:     88(ptr)   AccessChain 49(data) 125 51
+             364:   17(ivec4)   Load 363
+             365:   17(ivec4)   GroupNonUniformBroadcastFirst 38 364
+             366:     88(ptr)   AccessChain 49(data) 362 51
+                                Store 366 365
+             367:      6(int)   Load 8(invocation)
+             368:    197(ptr)   AccessChain 49(data) 61 125 54
+             369:44(float64_t)   Load 368
+             370:44(float64_t)   GroupNonUniformBroadcastFirst 38 369
+             371:    197(ptr)   AccessChain 49(data) 367 125 54
+                                Store 371 370
+             372:      6(int)   Load 8(invocation)
+             373:    204(ptr)   AccessChain 49(data) 60 125
+             374: 45(f64vec4)   Load 373
+             375:203(f64vec2)   VectorShuffle 374 374 0 1
+             376:203(f64vec2)   GroupNonUniformBroadcastFirst 38 375
+             377:    197(ptr)   AccessChain 49(data) 372 125 54
+             378:44(float64_t)   CompositeExtract 376 0
+                                Store 377 378
+             379:    197(ptr)   AccessChain 49(data) 372 125 64
+             380:44(float64_t)   CompositeExtract 376 1
+                                Store 379 380
+             381:      6(int)   Load 8(invocation)
+             382:    204(ptr)   AccessChain 49(data) 51 125
+             383: 45(f64vec4)   Load 382
+             384:214(f64vec3)   VectorShuffle 383 383 0 1 2
+             385:214(f64vec3)   GroupNonUniformBroadcastFirst 38 384
+             386:    197(ptr)   AccessChain 49(data) 381 125 54
+             387:44(float64_t)   CompositeExtract 385 0
+                                Store 386 387
+             388:    197(ptr)   AccessChain 49(data) 381 125 64
+             389:44(float64_t)   CompositeExtract 385 1
+                                Store 388 389
+             390:    197(ptr)   AccessChain 49(data) 381 125 72
+             391:44(float64_t)   CompositeExtract 385 2
+                                Store 390 391
+             392:      6(int)   Load 8(invocation)
+             393:    204(ptr)   AccessChain 49(data) 125 125
+             394: 45(f64vec4)   Load 393
+             395: 45(f64vec4)   GroupNonUniformBroadcastFirst 38 394
+             396:    204(ptr)   AccessChain 49(data) 392 125
+                                Store 396 395
+             397:      6(int)   Load 8(invocation)
+             398:    131(ptr)   AccessChain 49(data) 61 60 54
+             399:     42(int)   Load 398
+             400:    36(bool)   SLessThan 399 61
+             401:    36(bool)   GroupNonUniformBroadcastFirst 38 400
+             402:     42(int)   Select 401 60 61
+             403:    131(ptr)   AccessChain 49(data) 397 60 54
+                                Store 403 402
+             404:      6(int)   Load 8(invocation)
+             405:    138(ptr)   AccessChain 49(data) 60 60
+             406:   43(ivec4)   Load 405
+             407:  137(ivec2)   VectorShuffle 406 406 0 1
+             408:  242(bvec2)   SLessThan 407 241
+             409:  242(bvec2)   GroupNonUniformBroadcastFirst 38 408
+             410:  137(ivec2)   Select 409 245 241
+             411:    131(ptr)   AccessChain 49(data) 404 60 54
+             412:     42(int)   CompositeExtract 410 0
+                                Store 411 412
+             413:    131(ptr)   AccessChain 49(data) 404 60 64
+             414:     42(int)   CompositeExtract 410 1
+                                Store 413 414
+             415:      6(int)   Load 8(invocation)
+             416:    138(ptr)   AccessChain 49(data) 60 60
+             417:   43(ivec4)   Load 416
+             418:  148(ivec3)   VectorShuffle 417 417 0 1 2
+             419:  256(bvec3)   SLessThan 418 255
+             420:  256(bvec3)   GroupNonUniformBroadcastFirst 38 419
+             421:  148(ivec3)   Select 420 259 255
+             422:    131(ptr)   AccessChain 49(data) 415 60 54
+             423:     42(int)   CompositeExtract 421 0
+                                Store 422 423
+             424:    131(ptr)   AccessChain 49(data) 415 60 64
+             425:     42(int)   CompositeExtract 421 1
+                                Store 424 425
+             426:    131(ptr)   AccessChain 49(data) 415 60 72
+             427:     42(int)   CompositeExtract 421 2
+                                Store 426 427
+             428:      6(int)   Load 8(invocation)
+             429:    138(ptr)   AccessChain 49(data) 60 60
+             430:   43(ivec4)   Load 429
+             431:   83(bvec4)   SLessThan 430 270
+             432:   83(bvec4)   GroupNonUniformBroadcastFirst 38 431
+             433:   43(ivec4)   Select 432 273 270
+             434:    138(ptr)   AccessChain 49(data) 428 60
+                                Store 434 433
                                 Branch 94
               94:             Label
                               Return
diff --git a/third_party/vulkan-deps/glslang/src/Test/baseResults/spv.subgroupClustered.comp.out b/third_party/vulkan-deps/glslang/src/Test/baseResults/spv.subgroupClustered.comp.out
index 297fcec..a2e486d 100644
--- a/third_party/vulkan-deps/glslang/src/Test/baseResults/spv.subgroupClustered.comp.out
+++ b/third_party/vulkan-deps/glslang/src/Test/baseResults/spv.subgroupClustered.comp.out
@@ -1,7 +1,7 @@
 spv.subgroupClustered.comp
 // Module Version 10300
 // Generated by (magic number): 8000a
-// Id's are bound by 737
+// Id's are bound by 838
 
                               Capability Shader
                               Capability Float64
@@ -39,7 +39,7 @@
                               Decorate 24(Buffers) Block
                               Decorate 27(data) DescriptorSet 0
                               Decorate 27(data) Binding 0
-                              Decorate 736 BuiltIn WorkgroupSize
+                              Decorate 837 BuiltIn WorkgroupSize
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeInt 32 0
@@ -67,33 +67,34 @@
               39:     19(int) Constant 1
               40:             TypeVector 17(float) 2
               41:             TypePointer StorageBuffer 18(fvec4)
-              50:     19(int) Constant 2
-              51:             TypeVector 17(float) 3
-              60:     19(int) Constant 3
-              66:             TypePointer StorageBuffer 19(int)
-              72:             TypeVector 19(int) 2
-              73:             TypePointer StorageBuffer 20(ivec4)
-              82:             TypeVector 19(int) 3
-              96:             TypePointer StorageBuffer 6(int)
-             102:             TypeVector 6(int) 2
-             103:             TypePointer StorageBuffer 21(ivec4)
-             112:             TypeVector 6(int) 3
-             126:             TypePointer StorageBuffer 22(float64_t)
-             132:             TypeVector 22(float64_t) 2
-             133:             TypePointer StorageBuffer 23(f64vec4)
-             142:             TypeVector 22(float64_t) 3
-             522:             TypeBool
-             531:   72(ivec2) ConstantComposite 29 29
-             532:             TypeVector 522(bool) 2
-             535:   72(ivec2) ConstantComposite 39 39
-             544:   82(ivec3) ConstantComposite 29 29 29
-             545:             TypeVector 522(bool) 3
-             548:   82(ivec3) ConstantComposite 39 39 39
-             556:   20(ivec4) ConstantComposite 29 29 29 29
-             557:             TypeVector 522(bool) 4
-             560:   20(ivec4) ConstantComposite 39 39 39 39
-             735:      6(int) Constant 8
-             736:  112(ivec3) ConstantComposite 735 34 34
+              51:     19(int) Constant 2
+              52:             TypeVector 17(float) 3
+              61:      6(int) Constant 2
+              65:     19(int) Constant 3
+              71:             TypePointer StorageBuffer 19(int)
+              77:             TypeVector 19(int) 2
+              78:             TypePointer StorageBuffer 20(ivec4)
+              88:             TypeVector 19(int) 3
+             105:             TypePointer StorageBuffer 6(int)
+             111:             TypeVector 6(int) 2
+             112:             TypePointer StorageBuffer 21(ivec4)
+             122:             TypeVector 6(int) 3
+             139:             TypePointer StorageBuffer 22(float64_t)
+             145:             TypeVector 22(float64_t) 2
+             146:             TypePointer StorageBuffer 23(f64vec4)
+             156:             TypeVector 22(float64_t) 3
+             595:             TypeBool
+             604:   77(ivec2) ConstantComposite 29 29
+             605:             TypeVector 595(bool) 2
+             608:   77(ivec2) ConstantComposite 39 39
+             618:   88(ivec3) ConstantComposite 29 29 29
+             619:             TypeVector 595(bool) 3
+             622:   88(ivec3) ConstantComposite 39 39 39
+             633:   20(ivec4) ConstantComposite 29 29 29 29
+             634:             TypeVector 595(bool) 4
+             637:   20(ivec4) ConstantComposite 39 39 39 39
+             836:      6(int) Constant 8
+             837:  122(ivec3) ConstantComposite 836 34 34
          4(main):           2 Function None 3
                5:             Label
    8(invocation):      7(ptr) Variable Function
@@ -113,768 +114,943 @@
               43:   18(fvec4) Load 42
               44:   40(fvec2) VectorShuffle 43 43 0 1
               45:   40(fvec2) GroupNonUniformFAdd 35 ClusteredReduce 44 34
-              46:     41(ptr) AccessChain 27(data) 38 29
-              47:   18(fvec4) Load 46
-              48:   18(fvec4) VectorShuffle 47 45 4 5 2 3
-                              Store 46 48
-              49:      6(int) Load 8(invocation)
-              52:     41(ptr) AccessChain 27(data) 50 29
-              53:   18(fvec4) Load 52
-              54:   51(fvec3) VectorShuffle 53 53 0 1 2
-              55:   51(fvec3) GroupNonUniformFAdd 35 ClusteredReduce 54 34
-              56:     41(ptr) AccessChain 27(data) 49 29
-              57:   18(fvec4) Load 56
-              58:   18(fvec4) VectorShuffle 57 55 4 5 6 3
-                              Store 56 58
-              59:      6(int) Load 8(invocation)
-              61:     41(ptr) AccessChain 27(data) 60 29
-              62:   18(fvec4) Load 61
-              63:   18(fvec4) GroupNonUniformFAdd 35 ClusteredReduce 62 34
-              64:     41(ptr) AccessChain 27(data) 59 29
-                              Store 64 63
-              65:      6(int) Load 8(invocation)
-              67:     66(ptr) AccessChain 27(data) 29 39 30
-              68:     19(int) Load 67
-              69:     19(int) GroupNonUniformIAdd 35 ClusteredReduce 68 34
-              70:     66(ptr) AccessChain 27(data) 65 39 30
-                              Store 70 69
-              71:      6(int) Load 8(invocation)
-              74:     73(ptr) AccessChain 27(data) 39 39
-              75:   20(ivec4) Load 74
-              76:   72(ivec2) VectorShuffle 75 75 0 1
-              77:   72(ivec2) GroupNonUniformIAdd 35 ClusteredReduce 76 34
-              78:     73(ptr) AccessChain 27(data) 71 39
-              79:   20(ivec4) Load 78
-              80:   20(ivec4) VectorShuffle 79 77 4 5 2 3
-                              Store 78 80
-              81:      6(int) Load 8(invocation)
-              83:     73(ptr) AccessChain 27(data) 50 39
-              84:   20(ivec4) Load 83
-              85:   82(ivec3) VectorShuffle 84 84 0 1 2
-              86:   82(ivec3) GroupNonUniformIAdd 35 ClusteredReduce 85 34
-              87:     73(ptr) AccessChain 27(data) 81 39
-              88:   20(ivec4) Load 87
-              89:   20(ivec4) VectorShuffle 88 86 4 5 6 3
-                              Store 87 89
-              90:      6(int) Load 8(invocation)
-              91:     73(ptr) AccessChain 27(data) 60 39
-              92:   20(ivec4) Load 91
-              93:   20(ivec4) GroupNonUniformIAdd 35 ClusteredReduce 92 34
-              94:     73(ptr) AccessChain 27(data) 90 39
-                              Store 94 93
-              95:      6(int) Load 8(invocation)
-              97:     96(ptr) AccessChain 27(data) 29 50 30
-              98:      6(int) Load 97
-              99:      6(int) GroupNonUniformIAdd 35 ClusteredReduce 98 34
-             100:     96(ptr) AccessChain 27(data) 95 50 30
-                              Store 100 99
-             101:      6(int) Load 8(invocation)
-             104:    103(ptr) AccessChain 27(data) 39 50
-             105:   21(ivec4) Load 104
-             106:  102(ivec2) VectorShuffle 105 105 0 1
-             107:  102(ivec2) GroupNonUniformIAdd 35 ClusteredReduce 106 34
-             108:    103(ptr) AccessChain 27(data) 101 50
-             109:   21(ivec4) Load 108
-             110:   21(ivec4) VectorShuffle 109 107 4 5 2 3
-                              Store 108 110
-             111:      6(int) Load 8(invocation)
-             113:    103(ptr) AccessChain 27(data) 50 50
+              46:     31(ptr) AccessChain 27(data) 38 29 30
+              47:   17(float) CompositeExtract 45 0
+                              Store 46 47
+              48:     31(ptr) AccessChain 27(data) 38 29 34
+              49:   17(float) CompositeExtract 45 1
+                              Store 48 49
+              50:      6(int) Load 8(invocation)
+              53:     41(ptr) AccessChain 27(data) 51 29
+              54:   18(fvec4) Load 53
+              55:   52(fvec3) VectorShuffle 54 54 0 1 2
+              56:   52(fvec3) GroupNonUniformFAdd 35 ClusteredReduce 55 34
+              57:     31(ptr) AccessChain 27(data) 50 29 30
+              58:   17(float) CompositeExtract 56 0
+                              Store 57 58
+              59:     31(ptr) AccessChain 27(data) 50 29 34
+              60:   17(float) CompositeExtract 56 1
+                              Store 59 60
+              62:     31(ptr) AccessChain 27(data) 50 29 61
+              63:   17(float) CompositeExtract 56 2
+                              Store 62 63
+              64:      6(int) Load 8(invocation)
+              66:     41(ptr) AccessChain 27(data) 65 29
+              67:   18(fvec4) Load 66
+              68:   18(fvec4) GroupNonUniformFAdd 35 ClusteredReduce 67 34
+              69:     41(ptr) AccessChain 27(data) 64 29
+                              Store 69 68
+              70:      6(int) Load 8(invocation)
+              72:     71(ptr) AccessChain 27(data) 29 39 30
+              73:     19(int) Load 72
+              74:     19(int) GroupNonUniformIAdd 35 ClusteredReduce 73 34
+              75:     71(ptr) AccessChain 27(data) 70 39 30
+                              Store 75 74
+              76:      6(int) Load 8(invocation)
+              79:     78(ptr) AccessChain 27(data) 39 39
+              80:   20(ivec4) Load 79
+              81:   77(ivec2) VectorShuffle 80 80 0 1
+              82:   77(ivec2) GroupNonUniformIAdd 35 ClusteredReduce 81 34
+              83:     71(ptr) AccessChain 27(data) 76 39 30
+              84:     19(int) CompositeExtract 82 0
+                              Store 83 84
+              85:     71(ptr) AccessChain 27(data) 76 39 34
+              86:     19(int) CompositeExtract 82 1
+                              Store 85 86
+              87:      6(int) Load 8(invocation)
+              89:     78(ptr) AccessChain 27(data) 51 39
+              90:   20(ivec4) Load 89
+              91:   88(ivec3) VectorShuffle 90 90 0 1 2
+              92:   88(ivec3) GroupNonUniformIAdd 35 ClusteredReduce 91 34
+              93:     71(ptr) AccessChain 27(data) 87 39 30
+              94:     19(int) CompositeExtract 92 0
+                              Store 93 94
+              95:     71(ptr) AccessChain 27(data) 87 39 34
+              96:     19(int) CompositeExtract 92 1
+                              Store 95 96
+              97:     71(ptr) AccessChain 27(data) 87 39 61
+              98:     19(int) CompositeExtract 92 2
+                              Store 97 98
+              99:      6(int) Load 8(invocation)
+             100:     78(ptr) AccessChain 27(data) 65 39
+             101:   20(ivec4) Load 100
+             102:   20(ivec4) GroupNonUniformIAdd 35 ClusteredReduce 101 34
+             103:     78(ptr) AccessChain 27(data) 99 39
+                              Store 103 102
+             104:      6(int) Load 8(invocation)
+             106:    105(ptr) AccessChain 27(data) 29 51 30
+             107:      6(int) Load 106
+             108:      6(int) GroupNonUniformIAdd 35 ClusteredReduce 107 34
+             109:    105(ptr) AccessChain 27(data) 104 51 30
+                              Store 109 108
+             110:      6(int) Load 8(invocation)
+             113:    112(ptr) AccessChain 27(data) 39 51
              114:   21(ivec4) Load 113
-             115:  112(ivec3) VectorShuffle 114 114 0 1 2
-             116:  112(ivec3) GroupNonUniformIAdd 35 ClusteredReduce 115 34
-             117:    103(ptr) AccessChain 27(data) 111 50
-             118:   21(ivec4) Load 117
-             119:   21(ivec4) VectorShuffle 118 116 4 5 6 3
-                              Store 117 119
-             120:      6(int) Load 8(invocation)
-             121:    103(ptr) AccessChain 27(data) 60 50
-             122:   21(ivec4) Load 121
-             123:   21(ivec4) GroupNonUniformIAdd 35 ClusteredReduce 122 34
-             124:    103(ptr) AccessChain 27(data) 120 50
-                              Store 124 123
-             125:      6(int) Load 8(invocation)
-             127:    126(ptr) AccessChain 27(data) 29 60 30
-             128:22(float64_t) Load 127
-             129:22(float64_t) GroupNonUniformFAdd 35 ClusteredReduce 128 34
-             130:    126(ptr) AccessChain 27(data) 125 60 30
-                              Store 130 129
-             131:      6(int) Load 8(invocation)
-             134:    133(ptr) AccessChain 27(data) 39 60
-             135: 23(f64vec4) Load 134
-             136:132(f64vec2) VectorShuffle 135 135 0 1
-             137:132(f64vec2) GroupNonUniformFAdd 35 ClusteredReduce 136 34
-             138:    133(ptr) AccessChain 27(data) 131 60
-             139: 23(f64vec4) Load 138
-             140: 23(f64vec4) VectorShuffle 139 137 4 5 2 3
-                              Store 138 140
-             141:      6(int) Load 8(invocation)
-             143:    133(ptr) AccessChain 27(data) 50 60
-             144: 23(f64vec4) Load 143
-             145:142(f64vec3) VectorShuffle 144 144 0 1 2
-             146:142(f64vec3) GroupNonUniformFAdd 35 ClusteredReduce 145 34
-             147:    133(ptr) AccessChain 27(data) 141 60
+             115:  111(ivec2) VectorShuffle 114 114 0 1
+             116:  111(ivec2) GroupNonUniformIAdd 35 ClusteredReduce 115 34
+             117:    105(ptr) AccessChain 27(data) 110 51 30
+             118:      6(int) CompositeExtract 116 0
+                              Store 117 118
+             119:    105(ptr) AccessChain 27(data) 110 51 34
+             120:      6(int) CompositeExtract 116 1
+                              Store 119 120
+             121:      6(int) Load 8(invocation)
+             123:    112(ptr) AccessChain 27(data) 51 51
+             124:   21(ivec4) Load 123
+             125:  122(ivec3) VectorShuffle 124 124 0 1 2
+             126:  122(ivec3) GroupNonUniformIAdd 35 ClusteredReduce 125 34
+             127:    105(ptr) AccessChain 27(data) 121 51 30
+             128:      6(int) CompositeExtract 126 0
+                              Store 127 128
+             129:    105(ptr) AccessChain 27(data) 121 51 34
+             130:      6(int) CompositeExtract 126 1
+                              Store 129 130
+             131:    105(ptr) AccessChain 27(data) 121 51 61
+             132:      6(int) CompositeExtract 126 2
+                              Store 131 132
+             133:      6(int) Load 8(invocation)
+             134:    112(ptr) AccessChain 27(data) 65 51
+             135:   21(ivec4) Load 134
+             136:   21(ivec4) GroupNonUniformIAdd 35 ClusteredReduce 135 34
+             137:    112(ptr) AccessChain 27(data) 133 51
+                              Store 137 136
+             138:      6(int) Load 8(invocation)
+             140:    139(ptr) AccessChain 27(data) 29 65 30
+             141:22(float64_t) Load 140
+             142:22(float64_t) GroupNonUniformFAdd 35 ClusteredReduce 141 34
+             143:    139(ptr) AccessChain 27(data) 138 65 30
+                              Store 143 142
+             144:      6(int) Load 8(invocation)
+             147:    146(ptr) AccessChain 27(data) 39 65
              148: 23(f64vec4) Load 147
-             149: 23(f64vec4) VectorShuffle 148 146 4 5 6 3
-                              Store 147 149
-             150:      6(int) Load 8(invocation)
-             151:    133(ptr) AccessChain 27(data) 60 60
-             152: 23(f64vec4) Load 151
-             153: 23(f64vec4) GroupNonUniformFAdd 35 ClusteredReduce 152 34
-             154:    133(ptr) AccessChain 27(data) 150 60
-                              Store 154 153
+             149:145(f64vec2) VectorShuffle 148 148 0 1
+             150:145(f64vec2) GroupNonUniformFAdd 35 ClusteredReduce 149 34
+             151:    139(ptr) AccessChain 27(data) 144 65 30
+             152:22(float64_t) CompositeExtract 150 0
+                              Store 151 152
+             153:    139(ptr) AccessChain 27(data) 144 65 34
+             154:22(float64_t) CompositeExtract 150 1
+                              Store 153 154
              155:      6(int) Load 8(invocation)
-             156:     31(ptr) AccessChain 27(data) 29 29 30
-             157:   17(float) Load 156
-             158:   17(float) GroupNonUniformFMul 35 ClusteredReduce 157 34
-             159:     31(ptr) AccessChain 27(data) 155 29 30
-                              Store 159 158
-             160:      6(int) Load 8(invocation)
-             161:     41(ptr) AccessChain 27(data) 39 29
-             162:   18(fvec4) Load 161
-             163:   40(fvec2) VectorShuffle 162 162 0 1
-             164:   40(fvec2) GroupNonUniformFMul 35 ClusteredReduce 163 34
-             165:     41(ptr) AccessChain 27(data) 160 29
-             166:   18(fvec4) Load 165
-             167:   18(fvec4) VectorShuffle 166 164 4 5 2 3
-                              Store 165 167
-             168:      6(int) Load 8(invocation)
-             169:     41(ptr) AccessChain 27(data) 50 29
-             170:   18(fvec4) Load 169
-             171:   51(fvec3) VectorShuffle 170 170 0 1 2
-             172:   51(fvec3) GroupNonUniformFMul 35 ClusteredReduce 171 34
-             173:     41(ptr) AccessChain 27(data) 168 29
-             174:   18(fvec4) Load 173
-             175:   18(fvec4) VectorShuffle 174 172 4 5 6 3
-                              Store 173 175
-             176:      6(int) Load 8(invocation)
-             177:     41(ptr) AccessChain 27(data) 60 29
-             178:   18(fvec4) Load 177
-             179:   18(fvec4) GroupNonUniformFMul 35 ClusteredReduce 178 34
-             180:     41(ptr) AccessChain 27(data) 176 29
-                              Store 180 179
-             181:      6(int) Load 8(invocation)
-             182:     66(ptr) AccessChain 27(data) 29 39 30
-             183:     19(int) Load 182
-             184:     19(int) GroupNonUniformIMul 35 ClusteredReduce 183 34
-             185:     66(ptr) AccessChain 27(data) 181 39 30
-                              Store 185 184
+             157:    146(ptr) AccessChain 27(data) 51 65
+             158: 23(f64vec4) Load 157
+             159:156(f64vec3) VectorShuffle 158 158 0 1 2
+             160:156(f64vec3) GroupNonUniformFAdd 35 ClusteredReduce 159 34
+             161:    139(ptr) AccessChain 27(data) 155 65 30
+             162:22(float64_t) CompositeExtract 160 0
+                              Store 161 162
+             163:    139(ptr) AccessChain 27(data) 155 65 34
+             164:22(float64_t) CompositeExtract 160 1
+                              Store 163 164
+             165:    139(ptr) AccessChain 27(data) 155 65 61
+             166:22(float64_t) CompositeExtract 160 2
+                              Store 165 166
+             167:      6(int) Load 8(invocation)
+             168:    146(ptr) AccessChain 27(data) 65 65
+             169: 23(f64vec4) Load 168
+             170: 23(f64vec4) GroupNonUniformFAdd 35 ClusteredReduce 169 34
+             171:    146(ptr) AccessChain 27(data) 167 65
+                              Store 171 170
+             172:      6(int) Load 8(invocation)
+             173:     31(ptr) AccessChain 27(data) 29 29 30
+             174:   17(float) Load 173
+             175:   17(float) GroupNonUniformFMul 35 ClusteredReduce 174 34
+             176:     31(ptr) AccessChain 27(data) 172 29 30
+                              Store 176 175
+             177:      6(int) Load 8(invocation)
+             178:     41(ptr) AccessChain 27(data) 39 29
+             179:   18(fvec4) Load 178
+             180:   40(fvec2) VectorShuffle 179 179 0 1
+             181:   40(fvec2) GroupNonUniformFMul 35 ClusteredReduce 180 34
+             182:     31(ptr) AccessChain 27(data) 177 29 30
+             183:   17(float) CompositeExtract 181 0
+                              Store 182 183
+             184:     31(ptr) AccessChain 27(data) 177 29 34
+             185:   17(float) CompositeExtract 181 1
+                              Store 184 185
              186:      6(int) Load 8(invocation)
-             187:     73(ptr) AccessChain 27(data) 39 39
-             188:   20(ivec4) Load 187
-             189:   72(ivec2) VectorShuffle 188 188 0 1
-             190:   72(ivec2) GroupNonUniformIMul 35 ClusteredReduce 189 34
-             191:     73(ptr) AccessChain 27(data) 186 39
-             192:   20(ivec4) Load 191
-             193:   20(ivec4) VectorShuffle 192 190 4 5 2 3
-                              Store 191 193
-             194:      6(int) Load 8(invocation)
-             195:     73(ptr) AccessChain 27(data) 50 39
-             196:   20(ivec4) Load 195
-             197:   82(ivec3) VectorShuffle 196 196 0 1 2
-             198:   82(ivec3) GroupNonUniformIMul 35 ClusteredReduce 197 34
-             199:     73(ptr) AccessChain 27(data) 194 39
-             200:   20(ivec4) Load 199
-             201:   20(ivec4) VectorShuffle 200 198 4 5 6 3
-                              Store 199 201
+             187:     41(ptr) AccessChain 27(data) 51 29
+             188:   18(fvec4) Load 187
+             189:   52(fvec3) VectorShuffle 188 188 0 1 2
+             190:   52(fvec3) GroupNonUniformFMul 35 ClusteredReduce 189 34
+             191:     31(ptr) AccessChain 27(data) 186 29 30
+             192:   17(float) CompositeExtract 190 0
+                              Store 191 192
+             193:     31(ptr) AccessChain 27(data) 186 29 34
+             194:   17(float) CompositeExtract 190 1
+                              Store 193 194
+             195:     31(ptr) AccessChain 27(data) 186 29 61
+             196:   17(float) CompositeExtract 190 2
+                              Store 195 196
+             197:      6(int) Load 8(invocation)
+             198:     41(ptr) AccessChain 27(data) 65 29
+             199:   18(fvec4) Load 198
+             200:   18(fvec4) GroupNonUniformFMul 35 ClusteredReduce 199 34
+             201:     41(ptr) AccessChain 27(data) 197 29
+                              Store 201 200
              202:      6(int) Load 8(invocation)
-             203:     73(ptr) AccessChain 27(data) 60 39
-             204:   20(ivec4) Load 203
-             205:   20(ivec4) GroupNonUniformIMul 35 ClusteredReduce 204 34
-             206:     73(ptr) AccessChain 27(data) 202 39
+             203:     71(ptr) AccessChain 27(data) 29 39 30
+             204:     19(int) Load 203
+             205:     19(int) GroupNonUniformIMul 35 ClusteredReduce 204 34
+             206:     71(ptr) AccessChain 27(data) 202 39 30
                               Store 206 205
              207:      6(int) Load 8(invocation)
-             208:     96(ptr) AccessChain 27(data) 29 50 30
-             209:      6(int) Load 208
-             210:      6(int) GroupNonUniformIMul 35 ClusteredReduce 209 34
-             211:     96(ptr) AccessChain 27(data) 207 50 30
-                              Store 211 210
-             212:      6(int) Load 8(invocation)
-             213:    103(ptr) AccessChain 27(data) 39 50
-             214:   21(ivec4) Load 213
-             215:  102(ivec2) VectorShuffle 214 214 0 1
-             216:  102(ivec2) GroupNonUniformIMul 35 ClusteredReduce 215 34
-             217:    103(ptr) AccessChain 27(data) 212 50
-             218:   21(ivec4) Load 217
-             219:   21(ivec4) VectorShuffle 218 216 4 5 2 3
-                              Store 217 219
-             220:      6(int) Load 8(invocation)
-             221:    103(ptr) AccessChain 27(data) 50 50
-             222:   21(ivec4) Load 221
-             223:  112(ivec3) VectorShuffle 222 222 0 1 2
-             224:  112(ivec3) GroupNonUniformIMul 35 ClusteredReduce 223 34
-             225:    103(ptr) AccessChain 27(data) 220 50
-             226:   21(ivec4) Load 225
-             227:   21(ivec4) VectorShuffle 226 224 4 5 6 3
-                              Store 225 227
-             228:      6(int) Load 8(invocation)
-             229:    103(ptr) AccessChain 27(data) 60 50
-             230:   21(ivec4) Load 229
-             231:   21(ivec4) GroupNonUniformIMul 35 ClusteredReduce 230 34
-             232:    103(ptr) AccessChain 27(data) 228 50
-                              Store 232 231
-             233:      6(int) Load 8(invocation)
-             234:    126(ptr) AccessChain 27(data) 29 60 30
-             235:22(float64_t) Load 234
-             236:22(float64_t) GroupNonUniformFMul 35 ClusteredReduce 235 34
-             237:    126(ptr) AccessChain 27(data) 233 60 30
-                              Store 237 236
-             238:      6(int) Load 8(invocation)
-             239:    133(ptr) AccessChain 27(data) 39 60
-             240: 23(f64vec4) Load 239
-             241:132(f64vec2) VectorShuffle 240 240 0 1
-             242:132(f64vec2) GroupNonUniformFMul 35 ClusteredReduce 241 34
-             243:    133(ptr) AccessChain 27(data) 238 60
-             244: 23(f64vec4) Load 243
-             245: 23(f64vec4) VectorShuffle 244 242 4 5 2 3
-                              Store 243 245
+             208:     78(ptr) AccessChain 27(data) 39 39
+             209:   20(ivec4) Load 208
+             210:   77(ivec2) VectorShuffle 209 209 0 1
+             211:   77(ivec2) GroupNonUniformIMul 35 ClusteredReduce 210 34
+             212:     71(ptr) AccessChain 27(data) 207 39 30
+             213:     19(int) CompositeExtract 211 0
+                              Store 212 213
+             214:     71(ptr) AccessChain 27(data) 207 39 34
+             215:     19(int) CompositeExtract 211 1
+                              Store 214 215
+             216:      6(int) Load 8(invocation)
+             217:     78(ptr) AccessChain 27(data) 51 39
+             218:   20(ivec4) Load 217
+             219:   88(ivec3) VectorShuffle 218 218 0 1 2
+             220:   88(ivec3) GroupNonUniformIMul 35 ClusteredReduce 219 34
+             221:     71(ptr) AccessChain 27(data) 216 39 30
+             222:     19(int) CompositeExtract 220 0
+                              Store 221 222
+             223:     71(ptr) AccessChain 27(data) 216 39 34
+             224:     19(int) CompositeExtract 220 1
+                              Store 223 224
+             225:     71(ptr) AccessChain 27(data) 216 39 61
+             226:     19(int) CompositeExtract 220 2
+                              Store 225 226
+             227:      6(int) Load 8(invocation)
+             228:     78(ptr) AccessChain 27(data) 65 39
+             229:   20(ivec4) Load 228
+             230:   20(ivec4) GroupNonUniformIMul 35 ClusteredReduce 229 34
+             231:     78(ptr) AccessChain 27(data) 227 39
+                              Store 231 230
+             232:      6(int) Load 8(invocation)
+             233:    105(ptr) AccessChain 27(data) 29 51 30
+             234:      6(int) Load 233
+             235:      6(int) GroupNonUniformIMul 35 ClusteredReduce 234 34
+             236:    105(ptr) AccessChain 27(data) 232 51 30
+                              Store 236 235
+             237:      6(int) Load 8(invocation)
+             238:    112(ptr) AccessChain 27(data) 39 51
+             239:   21(ivec4) Load 238
+             240:  111(ivec2) VectorShuffle 239 239 0 1
+             241:  111(ivec2) GroupNonUniformIMul 35 ClusteredReduce 240 34
+             242:    105(ptr) AccessChain 27(data) 237 51 30
+             243:      6(int) CompositeExtract 241 0
+                              Store 242 243
+             244:    105(ptr) AccessChain 27(data) 237 51 34
+             245:      6(int) CompositeExtract 241 1
+                              Store 244 245
              246:      6(int) Load 8(invocation)
-             247:    133(ptr) AccessChain 27(data) 50 60
-             248: 23(f64vec4) Load 247
-             249:142(f64vec3) VectorShuffle 248 248 0 1 2
-             250:142(f64vec3) GroupNonUniformFMul 35 ClusteredReduce 249 34
-             251:    133(ptr) AccessChain 27(data) 246 60
-             252: 23(f64vec4) Load 251
-             253: 23(f64vec4) VectorShuffle 252 250 4 5 6 3
-                              Store 251 253
-             254:      6(int) Load 8(invocation)
-             255:    133(ptr) AccessChain 27(data) 60 60
-             256: 23(f64vec4) Load 255
-             257: 23(f64vec4) GroupNonUniformFMul 35 ClusteredReduce 256 34
-             258:    133(ptr) AccessChain 27(data) 254 60
-                              Store 258 257
-             259:      6(int) Load 8(invocation)
-             260:     31(ptr) AccessChain 27(data) 29 29 30
-             261:   17(float) Load 260
-             262:   17(float) GroupNonUniformFMin 35 ClusteredReduce 261 34
-             263:     31(ptr) AccessChain 27(data) 259 29 30
-                              Store 263 262
-             264:      6(int) Load 8(invocation)
-             265:     41(ptr) AccessChain 27(data) 39 29
-             266:   18(fvec4) Load 265
-             267:   40(fvec2) VectorShuffle 266 266 0 1
-             268:   40(fvec2) GroupNonUniformFMin 35 ClusteredReduce 267 34
-             269:     41(ptr) AccessChain 27(data) 264 29
-             270:   18(fvec4) Load 269
-             271:   18(fvec4) VectorShuffle 270 268 4 5 2 3
-                              Store 269 271
-             272:      6(int) Load 8(invocation)
-             273:     41(ptr) AccessChain 27(data) 50 29
-             274:   18(fvec4) Load 273
-             275:   51(fvec3) VectorShuffle 274 274 0 1 2
-             276:   51(fvec3) GroupNonUniformFMin 35 ClusteredReduce 275 34
-             277:     41(ptr) AccessChain 27(data) 272 29
-             278:   18(fvec4) Load 277
-             279:   18(fvec4) VectorShuffle 278 276 4 5 6 3
-                              Store 277 279
-             280:      6(int) Load 8(invocation)
-             281:     41(ptr) AccessChain 27(data) 60 29
-             282:   18(fvec4) Load 281
-             283:   18(fvec4) GroupNonUniformFMin 35 ClusteredReduce 282 34
-             284:     41(ptr) AccessChain 27(data) 280 29
-                              Store 284 283
-             285:      6(int) Load 8(invocation)
-             286:     66(ptr) AccessChain 27(data) 29 39 30
-             287:     19(int) Load 286
-             288:     19(int) GroupNonUniformSMin 35 ClusteredReduce 287 34
-             289:     66(ptr) AccessChain 27(data) 285 39 30
-                              Store 289 288
-             290:      6(int) Load 8(invocation)
-             291:     73(ptr) AccessChain 27(data) 39 39
-             292:   20(ivec4) Load 291
-             293:   72(ivec2) VectorShuffle 292 292 0 1
-             294:   72(ivec2) GroupNonUniformSMin 35 ClusteredReduce 293 34
-             295:     73(ptr) AccessChain 27(data) 290 39
-             296:   20(ivec4) Load 295
-             297:   20(ivec4) VectorShuffle 296 294 4 5 2 3
-                              Store 295 297
-             298:      6(int) Load 8(invocation)
-             299:     73(ptr) AccessChain 27(data) 50 39
-             300:   20(ivec4) Load 299
-             301:   82(ivec3) VectorShuffle 300 300 0 1 2
-             302:   82(ivec3) GroupNonUniformSMin 35 ClusteredReduce 301 34
-             303:     73(ptr) AccessChain 27(data) 298 39
-             304:   20(ivec4) Load 303
-             305:   20(ivec4) VectorShuffle 304 302 4 5 6 3
-                              Store 303 305
+             247:    112(ptr) AccessChain 27(data) 51 51
+             248:   21(ivec4) Load 247
+             249:  122(ivec3) VectorShuffle 248 248 0 1 2
+             250:  122(ivec3) GroupNonUniformIMul 35 ClusteredReduce 249 34
+             251:    105(ptr) AccessChain 27(data) 246 51 30
+             252:      6(int) CompositeExtract 250 0
+                              Store 251 252
+             253:    105(ptr) AccessChain 27(data) 246 51 34
+             254:      6(int) CompositeExtract 250 1
+                              Store 253 254
+             255:    105(ptr) AccessChain 27(data) 246 51 61
+             256:      6(int) CompositeExtract 250 2
+                              Store 255 256
+             257:      6(int) Load 8(invocation)
+             258:    112(ptr) AccessChain 27(data) 65 51
+             259:   21(ivec4) Load 258
+             260:   21(ivec4) GroupNonUniformIMul 35 ClusteredReduce 259 34
+             261:    112(ptr) AccessChain 27(data) 257 51
+                              Store 261 260
+             262:      6(int) Load 8(invocation)
+             263:    139(ptr) AccessChain 27(data) 29 65 30
+             264:22(float64_t) Load 263
+             265:22(float64_t) GroupNonUniformFMul 35 ClusteredReduce 264 34
+             266:    139(ptr) AccessChain 27(data) 262 65 30
+                              Store 266 265
+             267:      6(int) Load 8(invocation)
+             268:    146(ptr) AccessChain 27(data) 39 65
+             269: 23(f64vec4) Load 268
+             270:145(f64vec2) VectorShuffle 269 269 0 1
+             271:145(f64vec2) GroupNonUniformFMul 35 ClusteredReduce 270 34
+             272:    139(ptr) AccessChain 27(data) 267 65 30
+             273:22(float64_t) CompositeExtract 271 0
+                              Store 272 273
+             274:    139(ptr) AccessChain 27(data) 267 65 34
+             275:22(float64_t) CompositeExtract 271 1
+                              Store 274 275
+             276:      6(int) Load 8(invocation)
+             277:    146(ptr) AccessChain 27(data) 51 65
+             278: 23(f64vec4) Load 277
+             279:156(f64vec3) VectorShuffle 278 278 0 1 2
+             280:156(f64vec3) GroupNonUniformFMul 35 ClusteredReduce 279 34
+             281:    139(ptr) AccessChain 27(data) 276 65 30
+             282:22(float64_t) CompositeExtract 280 0
+                              Store 281 282
+             283:    139(ptr) AccessChain 27(data) 276 65 34
+             284:22(float64_t) CompositeExtract 280 1
+                              Store 283 284
+             285:    139(ptr) AccessChain 27(data) 276 65 61
+             286:22(float64_t) CompositeExtract 280 2
+                              Store 285 286
+             287:      6(int) Load 8(invocation)
+             288:    146(ptr) AccessChain 27(data) 65 65
+             289: 23(f64vec4) Load 288
+             290: 23(f64vec4) GroupNonUniformFMul 35 ClusteredReduce 289 34
+             291:    146(ptr) AccessChain 27(data) 287 65
+                              Store 291 290
+             292:      6(int) Load 8(invocation)
+             293:     31(ptr) AccessChain 27(data) 29 29 30
+             294:   17(float) Load 293
+             295:   17(float) GroupNonUniformFMin 35 ClusteredReduce 294 34
+             296:     31(ptr) AccessChain 27(data) 292 29 30
+                              Store 296 295
+             297:      6(int) Load 8(invocation)
+             298:     41(ptr) AccessChain 27(data) 39 29
+             299:   18(fvec4) Load 298
+             300:   40(fvec2) VectorShuffle 299 299 0 1
+             301:   40(fvec2) GroupNonUniformFMin 35 ClusteredReduce 300 34
+             302:     31(ptr) AccessChain 27(data) 297 29 30
+             303:   17(float) CompositeExtract 301 0
+                              Store 302 303
+             304:     31(ptr) AccessChain 27(data) 297 29 34
+             305:   17(float) CompositeExtract 301 1
+                              Store 304 305
              306:      6(int) Load 8(invocation)
-             307:     73(ptr) AccessChain 27(data) 60 39
-             308:   20(ivec4) Load 307
-             309:   20(ivec4) GroupNonUniformSMin 35 ClusteredReduce 308 34
-             310:     73(ptr) AccessChain 27(data) 306 39
-                              Store 310 309
-             311:      6(int) Load 8(invocation)
-             312:     96(ptr) AccessChain 27(data) 29 50 30
-             313:      6(int) Load 312
-             314:      6(int) GroupNonUniformUMin 35 ClusteredReduce 313 34
-             315:     96(ptr) AccessChain 27(data) 311 50 30
-                              Store 315 314
-             316:      6(int) Load 8(invocation)
-             317:    103(ptr) AccessChain 27(data) 39 50
-             318:   21(ivec4) Load 317
-             319:  102(ivec2) VectorShuffle 318 318 0 1
-             320:  102(ivec2) GroupNonUniformUMin 35 ClusteredReduce 319 34
-             321:    103(ptr) AccessChain 27(data) 316 50
-             322:   21(ivec4) Load 321
-             323:   21(ivec4) VectorShuffle 322 320 4 5 2 3
-                              Store 321 323
-             324:      6(int) Load 8(invocation)
-             325:    103(ptr) AccessChain 27(data) 50 50
-             326:   21(ivec4) Load 325
-             327:  112(ivec3) VectorShuffle 326 326 0 1 2
-             328:  112(ivec3) GroupNonUniformUMin 35 ClusteredReduce 327 34
-             329:    103(ptr) AccessChain 27(data) 324 50
-             330:   21(ivec4) Load 329
-             331:   21(ivec4) VectorShuffle 330 328 4 5 6 3
-                              Store 329 331
-             332:      6(int) Load 8(invocation)
-             333:    103(ptr) AccessChain 27(data) 60 50
-             334:   21(ivec4) Load 333
-             335:   21(ivec4) GroupNonUniformUMin 35 ClusteredReduce 334 34
-             336:    103(ptr) AccessChain 27(data) 332 50
-                              Store 336 335
-             337:      6(int) Load 8(invocation)
-             338:    126(ptr) AccessChain 27(data) 29 60 30
-             339:22(float64_t) Load 338
-             340:22(float64_t) GroupNonUniformFMin 35 ClusteredReduce 339 34
-             341:    126(ptr) AccessChain 27(data) 337 60 30
-                              Store 341 340
-             342:      6(int) Load 8(invocation)
-             343:    133(ptr) AccessChain 27(data) 39 60
-             344: 23(f64vec4) Load 343
-             345:132(f64vec2) VectorShuffle 344 344 0 1
-             346:132(f64vec2) GroupNonUniformFMin 35 ClusteredReduce 345 34
-             347:    133(ptr) AccessChain 27(data) 342 60
-             348: 23(f64vec4) Load 347
-             349: 23(f64vec4) VectorShuffle 348 346 4 5 2 3
-                              Store 347 349
-             350:      6(int) Load 8(invocation)
-             351:    133(ptr) AccessChain 27(data) 50 60
-             352: 23(f64vec4) Load 351
-             353:142(f64vec3) VectorShuffle 352 352 0 1 2
-             354:142(f64vec3) GroupNonUniformFMin 35 ClusteredReduce 353 34
-             355:    133(ptr) AccessChain 27(data) 350 60
-             356: 23(f64vec4) Load 355
-             357: 23(f64vec4) VectorShuffle 356 354 4 5 6 3
-                              Store 355 357
-             358:      6(int) Load 8(invocation)
-             359:    133(ptr) AccessChain 27(data) 60 60
-             360: 23(f64vec4) Load 359
-             361: 23(f64vec4) GroupNonUniformFMin 35 ClusteredReduce 360 34
-             362:    133(ptr) AccessChain 27(data) 358 60
-                              Store 362 361
-             363:      6(int) Load 8(invocation)
-             364:     31(ptr) AccessChain 27(data) 29 29 30
-             365:   17(float) Load 364
-             366:   17(float) GroupNonUniformFMax 35 ClusteredReduce 365 34
-             367:     31(ptr) AccessChain 27(data) 363 29 30
-                              Store 367 366
-             368:      6(int) Load 8(invocation)
-             369:     41(ptr) AccessChain 27(data) 39 29
-             370:   18(fvec4) Load 369
-             371:   40(fvec2) VectorShuffle 370 370 0 1
-             372:   40(fvec2) GroupNonUniformFMax 35 ClusteredReduce 371 34
-             373:     41(ptr) AccessChain 27(data) 368 29
-             374:   18(fvec4) Load 373
-             375:   18(fvec4) VectorShuffle 374 372 4 5 2 3
-                              Store 373 375
-             376:      6(int) Load 8(invocation)
-             377:     41(ptr) AccessChain 27(data) 50 29
-             378:   18(fvec4) Load 377
-             379:   51(fvec3) VectorShuffle 378 378 0 1 2
-             380:   51(fvec3) GroupNonUniformFMax 35 ClusteredReduce 379 34
-             381:     41(ptr) AccessChain 27(data) 376 29
-             382:   18(fvec4) Load 381
-             383:   18(fvec4) VectorShuffle 382 380 4 5 6 3
-                              Store 381 383
-             384:      6(int) Load 8(invocation)
-             385:     41(ptr) AccessChain 27(data) 60 29
-             386:   18(fvec4) Load 385
-             387:   18(fvec4) GroupNonUniformFMax 35 ClusteredReduce 386 34
-             388:     41(ptr) AccessChain 27(data) 384 29
-                              Store 388 387
-             389:      6(int) Load 8(invocation)
-             390:     66(ptr) AccessChain 27(data) 29 39 30
-             391:     19(int) Load 390
-             392:     19(int) GroupNonUniformSMax 35 ClusteredReduce 391 34
-             393:     66(ptr) AccessChain 27(data) 389 39 30
-                              Store 393 392
-             394:      6(int) Load 8(invocation)
-             395:     73(ptr) AccessChain 27(data) 39 39
-             396:   20(ivec4) Load 395
-             397:   72(ivec2) VectorShuffle 396 396 0 1
-             398:   72(ivec2) GroupNonUniformSMax 35 ClusteredReduce 397 34
-             399:     73(ptr) AccessChain 27(data) 394 39
-             400:   20(ivec4) Load 399
-             401:   20(ivec4) VectorShuffle 400 398 4 5 2 3
-                              Store 399 401
-             402:      6(int) Load 8(invocation)
-             403:     73(ptr) AccessChain 27(data) 50 39
-             404:   20(ivec4) Load 403
-             405:   82(ivec3) VectorShuffle 404 404 0 1 2
-             406:   82(ivec3) GroupNonUniformSMax 35 ClusteredReduce 405 34
-             407:     73(ptr) AccessChain 27(data) 402 39
-             408:   20(ivec4) Load 407
-             409:   20(ivec4) VectorShuffle 408 406 4 5 6 3
-                              Store 407 409
-             410:      6(int) Load 8(invocation)
-             411:     73(ptr) AccessChain 27(data) 60 39
-             412:   20(ivec4) Load 411
-             413:   20(ivec4) GroupNonUniformSMax 35 ClusteredReduce 412 34
-             414:     73(ptr) AccessChain 27(data) 410 39
-                              Store 414 413
-             415:      6(int) Load 8(invocation)
-             416:     96(ptr) AccessChain 27(data) 29 50 30
-             417:      6(int) Load 416
-             418:      6(int) GroupNonUniformUMax 35 ClusteredReduce 417 34
-             419:     96(ptr) AccessChain 27(data) 415 50 30
-                              Store 419 418
-             420:      6(int) Load 8(invocation)
-             421:    103(ptr) AccessChain 27(data) 39 50
-             422:   21(ivec4) Load 421
-             423:  102(ivec2) VectorShuffle 422 422 0 1
-             424:  102(ivec2) GroupNonUniformUMax 35 ClusteredReduce 423 34
-             425:    103(ptr) AccessChain 27(data) 420 50
-             426:   21(ivec4) Load 425
-             427:   21(ivec4) VectorShuffle 426 424 4 5 2 3
-                              Store 425 427
-             428:      6(int) Load 8(invocation)
-             429:    103(ptr) AccessChain 27(data) 50 50
-             430:   21(ivec4) Load 429
-             431:  112(ivec3) VectorShuffle 430 430 0 1 2
-             432:  112(ivec3) GroupNonUniformUMax 35 ClusteredReduce 431 34
-             433:    103(ptr) AccessChain 27(data) 428 50
-             434:   21(ivec4) Load 433
-             435:   21(ivec4) VectorShuffle 434 432 4 5 6 3
-                              Store 433 435
-             436:      6(int) Load 8(invocation)
-             437:    103(ptr) AccessChain 27(data) 60 50
-             438:   21(ivec4) Load 437
-             439:   21(ivec4) GroupNonUniformUMax 35 ClusteredReduce 438 34
-             440:    103(ptr) AccessChain 27(data) 436 50
-                              Store 440 439
-             441:      6(int) Load 8(invocation)
-             442:    126(ptr) AccessChain 27(data) 29 60 30
-             443:22(float64_t) Load 442
-             444:22(float64_t) GroupNonUniformFMax 35 ClusteredReduce 443 34
-             445:    126(ptr) AccessChain 27(data) 441 60 30
-                              Store 445 444
-             446:      6(int) Load 8(invocation)
-             447:    133(ptr) AccessChain 27(data) 39 60
-             448: 23(f64vec4) Load 447
-             449:132(f64vec2) VectorShuffle 448 448 0 1
-             450:132(f64vec2) GroupNonUniformFMax 35 ClusteredReduce 449 34
-             451:    133(ptr) AccessChain 27(data) 446 60
-             452: 23(f64vec4) Load 451
-             453: 23(f64vec4) VectorShuffle 452 450 4 5 2 3
-                              Store 451 453
-             454:      6(int) Load 8(invocation)
-             455:    133(ptr) AccessChain 27(data) 50 60
-             456: 23(f64vec4) Load 455
-             457:142(f64vec3) VectorShuffle 456 456 0 1 2
-             458:142(f64vec3) GroupNonUniformFMax 35 ClusteredReduce 457 34
-             459:    133(ptr) AccessChain 27(data) 454 60
-             460: 23(f64vec4) Load 459
-             461: 23(f64vec4) VectorShuffle 460 458 4 5 6 3
-                              Store 459 461
-             462:      6(int) Load 8(invocation)
-             463:    133(ptr) AccessChain 27(data) 60 60
-             464: 23(f64vec4) Load 463
-             465: 23(f64vec4) GroupNonUniformFMax 35 ClusteredReduce 464 34
-             466:    133(ptr) AccessChain 27(data) 462 60
-                              Store 466 465
+             307:     41(ptr) AccessChain 27(data) 51 29
+             308:   18(fvec4) Load 307
+             309:   52(fvec3) VectorShuffle 308 308 0 1 2
+             310:   52(fvec3) GroupNonUniformFMin 35 ClusteredReduce 309 34
+             311:     31(ptr) AccessChain 27(data) 306 29 30
+             312:   17(float) CompositeExtract 310 0
+                              Store 311 312
+             313:     31(ptr) AccessChain 27(data) 306 29 34
+             314:   17(float) CompositeExtract 310 1
+                              Store 313 314
+             315:     31(ptr) AccessChain 27(data) 306 29 61
+             316:   17(float) CompositeExtract 310 2
+                              Store 315 316
+             317:      6(int) Load 8(invocation)
+             318:     41(ptr) AccessChain 27(data) 65 29
+             319:   18(fvec4) Load 318
+             320:   18(fvec4) GroupNonUniformFMin 35 ClusteredReduce 319 34
+             321:     41(ptr) AccessChain 27(data) 317 29
+                              Store 321 320
+             322:      6(int) Load 8(invocation)
+             323:     71(ptr) AccessChain 27(data) 29 39 30
+             324:     19(int) Load 323
+             325:     19(int) GroupNonUniformSMin 35 ClusteredReduce 324 34
+             326:     71(ptr) AccessChain 27(data) 322 39 30
+                              Store 326 325
+             327:      6(int) Load 8(invocation)
+             328:     78(ptr) AccessChain 27(data) 39 39
+             329:   20(ivec4) Load 328
+             330:   77(ivec2) VectorShuffle 329 329 0 1
+             331:   77(ivec2) GroupNonUniformSMin 35 ClusteredReduce 330 34
+             332:     71(ptr) AccessChain 27(data) 327 39 30
+             333:     19(int) CompositeExtract 331 0
+                              Store 332 333
+             334:     71(ptr) AccessChain 27(data) 327 39 34
+             335:     19(int) CompositeExtract 331 1
+                              Store 334 335
+             336:      6(int) Load 8(invocation)
+             337:     78(ptr) AccessChain 27(data) 51 39
+             338:   20(ivec4) Load 337
+             339:   88(ivec3) VectorShuffle 338 338 0 1 2
+             340:   88(ivec3) GroupNonUniformSMin 35 ClusteredReduce 339 34
+             341:     71(ptr) AccessChain 27(data) 336 39 30
+             342:     19(int) CompositeExtract 340 0
+                              Store 341 342
+             343:     71(ptr) AccessChain 27(data) 336 39 34
+             344:     19(int) CompositeExtract 340 1
+                              Store 343 344
+             345:     71(ptr) AccessChain 27(data) 336 39 61
+             346:     19(int) CompositeExtract 340 2
+                              Store 345 346
+             347:      6(int) Load 8(invocation)
+             348:     78(ptr) AccessChain 27(data) 65 39
+             349:   20(ivec4) Load 348
+             350:   20(ivec4) GroupNonUniformSMin 35 ClusteredReduce 349 34
+             351:     78(ptr) AccessChain 27(data) 347 39
+                              Store 351 350
+             352:      6(int) Load 8(invocation)
+             353:    105(ptr) AccessChain 27(data) 29 51 30
+             354:      6(int) Load 353
+             355:      6(int) GroupNonUniformUMin 35 ClusteredReduce 354 34
+             356:    105(ptr) AccessChain 27(data) 352 51 30
+                              Store 356 355
+             357:      6(int) Load 8(invocation)
+             358:    112(ptr) AccessChain 27(data) 39 51
+             359:   21(ivec4) Load 358
+             360:  111(ivec2) VectorShuffle 359 359 0 1
+             361:  111(ivec2) GroupNonUniformUMin 35 ClusteredReduce 360 34
+             362:    105(ptr) AccessChain 27(data) 357 51 30
+             363:      6(int) CompositeExtract 361 0
+                              Store 362 363
+             364:    105(ptr) AccessChain 27(data) 357 51 34
+             365:      6(int) CompositeExtract 361 1
+                              Store 364 365
+             366:      6(int) Load 8(invocation)
+             367:    112(ptr) AccessChain 27(data) 51 51
+             368:   21(ivec4) Load 367
+             369:  122(ivec3) VectorShuffle 368 368 0 1 2
+             370:  122(ivec3) GroupNonUniformUMin 35 ClusteredReduce 369 34
+             371:    105(ptr) AccessChain 27(data) 366 51 30
+             372:      6(int) CompositeExtract 370 0
+                              Store 371 372
+             373:    105(ptr) AccessChain 27(data) 366 51 34
+             374:      6(int) CompositeExtract 370 1
+                              Store 373 374
+             375:    105(ptr) AccessChain 27(data) 366 51 61
+             376:      6(int) CompositeExtract 370 2
+                              Store 375 376
+             377:      6(int) Load 8(invocation)
+             378:    112(ptr) AccessChain 27(data) 65 51
+             379:   21(ivec4) Load 378
+             380:   21(ivec4) GroupNonUniformUMin 35 ClusteredReduce 379 34
+             381:    112(ptr) AccessChain 27(data) 377 51
+                              Store 381 380
+             382:      6(int) Load 8(invocation)
+             383:    139(ptr) AccessChain 27(data) 29 65 30
+             384:22(float64_t) Load 383
+             385:22(float64_t) GroupNonUniformFMin 35 ClusteredReduce 384 34
+             386:    139(ptr) AccessChain 27(data) 382 65 30
+                              Store 386 385
+             387:      6(int) Load 8(invocation)
+             388:    146(ptr) AccessChain 27(data) 39 65
+             389: 23(f64vec4) Load 388
+             390:145(f64vec2) VectorShuffle 389 389 0 1
+             391:145(f64vec2) GroupNonUniformFMin 35 ClusteredReduce 390 34
+             392:    139(ptr) AccessChain 27(data) 387 65 30
+             393:22(float64_t) CompositeExtract 391 0
+                              Store 392 393
+             394:    139(ptr) AccessChain 27(data) 387 65 34
+             395:22(float64_t) CompositeExtract 391 1
+                              Store 394 395
+             396:      6(int) Load 8(invocation)
+             397:    146(ptr) AccessChain 27(data) 51 65
+             398: 23(f64vec4) Load 397
+             399:156(f64vec3) VectorShuffle 398 398 0 1 2
+             400:156(f64vec3) GroupNonUniformFMin 35 ClusteredReduce 399 34
+             401:    139(ptr) AccessChain 27(data) 396 65 30
+             402:22(float64_t) CompositeExtract 400 0
+                              Store 401 402
+             403:    139(ptr) AccessChain 27(data) 396 65 34
+             404:22(float64_t) CompositeExtract 400 1
+                              Store 403 404
+             405:    139(ptr) AccessChain 27(data) 396 65 61
+             406:22(float64_t) CompositeExtract 400 2
+                              Store 405 406
+             407:      6(int) Load 8(invocation)
+             408:    146(ptr) AccessChain 27(data) 65 65
+             409: 23(f64vec4) Load 408
+             410: 23(f64vec4) GroupNonUniformFMin 35 ClusteredReduce 409 34
+             411:    146(ptr) AccessChain 27(data) 407 65
+                              Store 411 410
+             412:      6(int) Load 8(invocation)
+             413:     31(ptr) AccessChain 27(data) 29 29 30
+             414:   17(float) Load 413
+             415:   17(float) GroupNonUniformFMax 35 ClusteredReduce 414 34
+             416:     31(ptr) AccessChain 27(data) 412 29 30
+                              Store 416 415
+             417:      6(int) Load 8(invocation)
+             418:     41(ptr) AccessChain 27(data) 39 29
+             419:   18(fvec4) Load 418
+             420:   40(fvec2) VectorShuffle 419 419 0 1
+             421:   40(fvec2) GroupNonUniformFMax 35 ClusteredReduce 420 34
+             422:     31(ptr) AccessChain 27(data) 417 29 30
+             423:   17(float) CompositeExtract 421 0
+                              Store 422 423
+             424:     31(ptr) AccessChain 27(data) 417 29 34
+             425:   17(float) CompositeExtract 421 1
+                              Store 424 425
+             426:      6(int) Load 8(invocation)
+             427:     41(ptr) AccessChain 27(data) 51 29
+             428:   18(fvec4) Load 427
+             429:   52(fvec3) VectorShuffle 428 428 0 1 2
+             430:   52(fvec3) GroupNonUniformFMax 35 ClusteredReduce 429 34
+             431:     31(ptr) AccessChain 27(data) 426 29 30
+             432:   17(float) CompositeExtract 430 0
+                              Store 431 432
+             433:     31(ptr) AccessChain 27(data) 426 29 34
+             434:   17(float) CompositeExtract 430 1
+                              Store 433 434
+             435:     31(ptr) AccessChain 27(data) 426 29 61
+             436:   17(float) CompositeExtract 430 2
+                              Store 435 436
+             437:      6(int) Load 8(invocation)
+             438:     41(ptr) AccessChain 27(data) 65 29
+             439:   18(fvec4) Load 438
+             440:   18(fvec4) GroupNonUniformFMax 35 ClusteredReduce 439 34
+             441:     41(ptr) AccessChain 27(data) 437 29
+                              Store 441 440
+             442:      6(int) Load 8(invocation)
+             443:     71(ptr) AccessChain 27(data) 29 39 30
+             444:     19(int) Load 443
+             445:     19(int) GroupNonUniformSMax 35 ClusteredReduce 444 34
+             446:     71(ptr) AccessChain 27(data) 442 39 30
+                              Store 446 445
+             447:      6(int) Load 8(invocation)
+             448:     78(ptr) AccessChain 27(data) 39 39
+             449:   20(ivec4) Load 448
+             450:   77(ivec2) VectorShuffle 449 449 0 1
+             451:   77(ivec2) GroupNonUniformSMax 35 ClusteredReduce 450 34
+             452:     71(ptr) AccessChain 27(data) 447 39 30
+             453:     19(int) CompositeExtract 451 0
+                              Store 452 453
+             454:     71(ptr) AccessChain 27(data) 447 39 34
+             455:     19(int) CompositeExtract 451 1
+                              Store 454 455
+             456:      6(int) Load 8(invocation)
+             457:     78(ptr) AccessChain 27(data) 51 39
+             458:   20(ivec4) Load 457
+             459:   88(ivec3) VectorShuffle 458 458 0 1 2
+             460:   88(ivec3) GroupNonUniformSMax 35 ClusteredReduce 459 34
+             461:     71(ptr) AccessChain 27(data) 456 39 30
+             462:     19(int) CompositeExtract 460 0
+                              Store 461 462
+             463:     71(ptr) AccessChain 27(data) 456 39 34
+             464:     19(int) CompositeExtract 460 1
+                              Store 463 464
+             465:     71(ptr) AccessChain 27(data) 456 39 61
+             466:     19(int) CompositeExtract 460 2
+                              Store 465 466
              467:      6(int) Load 8(invocation)
-             468:     66(ptr) AccessChain 27(data) 29 39 30
-             469:     19(int) Load 468
-             470:     19(int) GroupNonUniformBitwiseAnd 35 ClusteredReduce 469 34
-             471:     66(ptr) AccessChain 27(data) 467 39 30
+             468:     78(ptr) AccessChain 27(data) 65 39
+             469:   20(ivec4) Load 468
+             470:   20(ivec4) GroupNonUniformSMax 35 ClusteredReduce 469 34
+             471:     78(ptr) AccessChain 27(data) 467 39
                               Store 471 470
              472:      6(int) Load 8(invocation)
-             473:     73(ptr) AccessChain 27(data) 39 39
-             474:   20(ivec4) Load 473
-             475:   72(ivec2) VectorShuffle 474 474 0 1
-             476:   72(ivec2) GroupNonUniformBitwiseAnd 35 ClusteredReduce 475 34
-             477:     73(ptr) AccessChain 27(data) 472 39
-             478:   20(ivec4) Load 477
-             479:   20(ivec4) VectorShuffle 478 476 4 5 2 3
-                              Store 477 479
-             480:      6(int) Load 8(invocation)
-             481:     73(ptr) AccessChain 27(data) 50 39
-             482:   20(ivec4) Load 481
-             483:   82(ivec3) VectorShuffle 482 482 0 1 2
-             484:   82(ivec3) GroupNonUniformBitwiseAnd 35 ClusteredReduce 483 34
-             485:     73(ptr) AccessChain 27(data) 480 39
-             486:   20(ivec4) Load 485
-             487:   20(ivec4) VectorShuffle 486 484 4 5 6 3
-                              Store 485 487
-             488:      6(int) Load 8(invocation)
-             489:     73(ptr) AccessChain 27(data) 60 39
-             490:   20(ivec4) Load 489
-             491:   20(ivec4) GroupNonUniformBitwiseAnd 35 ClusteredReduce 490 34
-             492:     73(ptr) AccessChain 27(data) 488 39
-                              Store 492 491
-             493:      6(int) Load 8(invocation)
-             494:     96(ptr) AccessChain 27(data) 29 50 30
-             495:      6(int) Load 494
-             496:      6(int) GroupNonUniformBitwiseAnd 35 ClusteredReduce 495 34
-             497:     96(ptr) AccessChain 27(data) 493 50 30
-                              Store 497 496
-             498:      6(int) Load 8(invocation)
-             499:    103(ptr) AccessChain 27(data) 39 50
-             500:   21(ivec4) Load 499
-             501:  102(ivec2) VectorShuffle 500 500 0 1
-             502:  102(ivec2) GroupNonUniformBitwiseAnd 35 ClusteredReduce 501 34
-             503:    103(ptr) AccessChain 27(data) 498 50
-             504:   21(ivec4) Load 503
-             505:   21(ivec4) VectorShuffle 504 502 4 5 2 3
-                              Store 503 505
-             506:      6(int) Load 8(invocation)
-             507:    103(ptr) AccessChain 27(data) 50 50
-             508:   21(ivec4) Load 507
-             509:  112(ivec3) VectorShuffle 508 508 0 1 2
-             510:  112(ivec3) GroupNonUniformBitwiseAnd 35 ClusteredReduce 509 34
-             511:    103(ptr) AccessChain 27(data) 506 50
-             512:   21(ivec4) Load 511
-             513:   21(ivec4) VectorShuffle 512 510 4 5 6 3
-                              Store 511 513
-             514:      6(int) Load 8(invocation)
-             515:    103(ptr) AccessChain 27(data) 60 50
-             516:   21(ivec4) Load 515
-             517:   21(ivec4) GroupNonUniformBitwiseAnd 35 ClusteredReduce 516 34
-             518:    103(ptr) AccessChain 27(data) 514 50
-                              Store 518 517
-             519:      6(int) Load 8(invocation)
-             520:     66(ptr) AccessChain 27(data) 29 39 30
-             521:     19(int) Load 520
-             523:   522(bool) SLessThan 521 29
-             524:   522(bool) GroupNonUniformLogicalAnd 35 ClusteredReduce 523 34
-             525:     19(int) Select 524 39 29
-             526:     66(ptr) AccessChain 27(data) 519 39 30
-                              Store 526 525
+             473:    105(ptr) AccessChain 27(data) 29 51 30
+             474:      6(int) Load 473
+             475:      6(int) GroupNonUniformUMax 35 ClusteredReduce 474 34
+             476:    105(ptr) AccessChain 27(data) 472 51 30
+                              Store 476 475
+             477:      6(int) Load 8(invocation)
+             478:    112(ptr) AccessChain 27(data) 39 51
+             479:   21(ivec4) Load 478
+             480:  111(ivec2) VectorShuffle 479 479 0 1
+             481:  111(ivec2) GroupNonUniformUMax 35 ClusteredReduce 480 34
+             482:    105(ptr) AccessChain 27(data) 477 51 30
+             483:      6(int) CompositeExtract 481 0
+                              Store 482 483
+             484:    105(ptr) AccessChain 27(data) 477 51 34
+             485:      6(int) CompositeExtract 481 1
+                              Store 484 485
+             486:      6(int) Load 8(invocation)
+             487:    112(ptr) AccessChain 27(data) 51 51
+             488:   21(ivec4) Load 487
+             489:  122(ivec3) VectorShuffle 488 488 0 1 2
+             490:  122(ivec3) GroupNonUniformUMax 35 ClusteredReduce 489 34
+             491:    105(ptr) AccessChain 27(data) 486 51 30
+             492:      6(int) CompositeExtract 490 0
+                              Store 491 492
+             493:    105(ptr) AccessChain 27(data) 486 51 34
+             494:      6(int) CompositeExtract 490 1
+                              Store 493 494
+             495:    105(ptr) AccessChain 27(data) 486 51 61
+             496:      6(int) CompositeExtract 490 2
+                              Store 495 496
+             497:      6(int) Load 8(invocation)
+             498:    112(ptr) AccessChain 27(data) 65 51
+             499:   21(ivec4) Load 498
+             500:   21(ivec4) GroupNonUniformUMax 35 ClusteredReduce 499 34
+             501:    112(ptr) AccessChain 27(data) 497 51
+                              Store 501 500
+             502:      6(int) Load 8(invocation)
+             503:    139(ptr) AccessChain 27(data) 29 65 30
+             504:22(float64_t) Load 503
+             505:22(float64_t) GroupNonUniformFMax 35 ClusteredReduce 504 34
+             506:    139(ptr) AccessChain 27(data) 502 65 30
+                              Store 506 505
+             507:      6(int) Load 8(invocation)
+             508:    146(ptr) AccessChain 27(data) 39 65
+             509: 23(f64vec4) Load 508
+             510:145(f64vec2) VectorShuffle 509 509 0 1
+             511:145(f64vec2) GroupNonUniformFMax 35 ClusteredReduce 510 34
+             512:    139(ptr) AccessChain 27(data) 507 65 30
+             513:22(float64_t) CompositeExtract 511 0
+                              Store 512 513
+             514:    139(ptr) AccessChain 27(data) 507 65 34
+             515:22(float64_t) CompositeExtract 511 1
+                              Store 514 515
+             516:      6(int) Load 8(invocation)
+             517:    146(ptr) AccessChain 27(data) 51 65
+             518: 23(f64vec4) Load 517
+             519:156(f64vec3) VectorShuffle 518 518 0 1 2
+             520:156(f64vec3) GroupNonUniformFMax 35 ClusteredReduce 519 34
+             521:    139(ptr) AccessChain 27(data) 516 65 30
+             522:22(float64_t) CompositeExtract 520 0
+                              Store 521 522
+             523:    139(ptr) AccessChain 27(data) 516 65 34
+             524:22(float64_t) CompositeExtract 520 1
+                              Store 523 524
+             525:    139(ptr) AccessChain 27(data) 516 65 61
+             526:22(float64_t) CompositeExtract 520 2
+                              Store 525 526
              527:      6(int) Load 8(invocation)
-             528:     73(ptr) AccessChain 27(data) 39 39
-             529:   20(ivec4) Load 528
-             530:   72(ivec2) VectorShuffle 529 529 0 1
-             533:  532(bvec2) SLessThan 530 531
-             534:  532(bvec2) GroupNonUniformLogicalAnd 35 ClusteredReduce 533 34
-             536:   72(ivec2) Select 534 535 531
-             537:     73(ptr) AccessChain 27(data) 527 39
-             538:   20(ivec4) Load 537
-             539:   20(ivec4) VectorShuffle 538 536 4 5 2 3
-                              Store 537 539
-             540:      6(int) Load 8(invocation)
-             541:     73(ptr) AccessChain 27(data) 39 39
-             542:   20(ivec4) Load 541
-             543:   82(ivec3) VectorShuffle 542 542 0 1 2
-             546:  545(bvec3) SLessThan 543 544
-             547:  545(bvec3) GroupNonUniformLogicalAnd 35 ClusteredReduce 546 34
-             549:   82(ivec3) Select 547 548 544
-             550:     73(ptr) AccessChain 27(data) 540 39
-             551:   20(ivec4) Load 550
-             552:   20(ivec4) VectorShuffle 551 549 4 5 6 3
-                              Store 550 552
-             553:      6(int) Load 8(invocation)
-             554:     73(ptr) AccessChain 27(data) 39 39
-             555:   20(ivec4) Load 554
-             558:  557(bvec4) SLessThan 555 556
-             559:  557(bvec4) GroupNonUniformLogicalAnd 35 ClusteredReduce 558 34
-             561:   20(ivec4) Select 559 560 556
-             562:     73(ptr) AccessChain 27(data) 553 39
-                              Store 562 561
-             563:      6(int) Load 8(invocation)
-             564:     66(ptr) AccessChain 27(data) 29 39 30
-             565:     19(int) Load 564
-             566:     19(int) GroupNonUniformBitwiseOr 35 ClusteredReduce 565 34
-             567:     66(ptr) AccessChain 27(data) 563 39 30
-                              Store 567 566
-             568:      6(int) Load 8(invocation)
-             569:     73(ptr) AccessChain 27(data) 39 39
-             570:   20(ivec4) Load 569
-             571:   72(ivec2) VectorShuffle 570 570 0 1
-             572:   72(ivec2) GroupNonUniformBitwiseOr 35 ClusteredReduce 571 34
-             573:     73(ptr) AccessChain 27(data) 568 39
-             574:   20(ivec4) Load 573
-             575:   20(ivec4) VectorShuffle 574 572 4 5 2 3
-                              Store 573 575
+             528:    146(ptr) AccessChain 27(data) 65 65
+             529: 23(f64vec4) Load 528
+             530: 23(f64vec4) GroupNonUniformFMax 35 ClusteredReduce 529 34
+             531:    146(ptr) AccessChain 27(data) 527 65
+                              Store 531 530
+             532:      6(int) Load 8(invocation)
+             533:     71(ptr) AccessChain 27(data) 29 39 30
+             534:     19(int) Load 533
+             535:     19(int) GroupNonUniformBitwiseAnd 35 ClusteredReduce 534 34
+             536:     71(ptr) AccessChain 27(data) 532 39 30
+                              Store 536 535
+             537:      6(int) Load 8(invocation)
+             538:     78(ptr) AccessChain 27(data) 39 39
+             539:   20(ivec4) Load 538
+             540:   77(ivec2) VectorShuffle 539 539 0 1
+             541:   77(ivec2) GroupNonUniformBitwiseAnd 35 ClusteredReduce 540 34
+             542:     71(ptr) AccessChain 27(data) 537 39 30
+             543:     19(int) CompositeExtract 541 0
+                              Store 542 543
+             544:     71(ptr) AccessChain 27(data) 537 39 34
+             545:     19(int) CompositeExtract 541 1
+                              Store 544 545
+             546:      6(int) Load 8(invocation)
+             547:     78(ptr) AccessChain 27(data) 51 39
+             548:   20(ivec4) Load 547
+             549:   88(ivec3) VectorShuffle 548 548 0 1 2
+             550:   88(ivec3) GroupNonUniformBitwiseAnd 35 ClusteredReduce 549 34
+             551:     71(ptr) AccessChain 27(data) 546 39 30
+             552:     19(int) CompositeExtract 550 0
+                              Store 551 552
+             553:     71(ptr) AccessChain 27(data) 546 39 34
+             554:     19(int) CompositeExtract 550 1
+                              Store 553 554
+             555:     71(ptr) AccessChain 27(data) 546 39 61
+             556:     19(int) CompositeExtract 550 2
+                              Store 555 556
+             557:      6(int) Load 8(invocation)
+             558:     78(ptr) AccessChain 27(data) 65 39
+             559:   20(ivec4) Load 558
+             560:   20(ivec4) GroupNonUniformBitwiseAnd 35 ClusteredReduce 559 34
+             561:     78(ptr) AccessChain 27(data) 557 39
+                              Store 561 560
+             562:      6(int) Load 8(invocation)
+             563:    105(ptr) AccessChain 27(data) 29 51 30
+             564:      6(int) Load 563
+             565:      6(int) GroupNonUniformBitwiseAnd 35 ClusteredReduce 564 34
+             566:    105(ptr) AccessChain 27(data) 562 51 30
+                              Store 566 565
+             567:      6(int) Load 8(invocation)
+             568:    112(ptr) AccessChain 27(data) 39 51
+             569:   21(ivec4) Load 568
+             570:  111(ivec2) VectorShuffle 569 569 0 1
+             571:  111(ivec2) GroupNonUniformBitwiseAnd 35 ClusteredReduce 570 34
+             572:    105(ptr) AccessChain 27(data) 567 51 30
+             573:      6(int) CompositeExtract 571 0
+                              Store 572 573
+             574:    105(ptr) AccessChain 27(data) 567 51 34
+             575:      6(int) CompositeExtract 571 1
+                              Store 574 575
              576:      6(int) Load 8(invocation)
-             577:     73(ptr) AccessChain 27(data) 50 39
-             578:   20(ivec4) Load 577
-             579:   82(ivec3) VectorShuffle 578 578 0 1 2
-             580:   82(ivec3) GroupNonUniformBitwiseOr 35 ClusteredReduce 579 34
-             581:     73(ptr) AccessChain 27(data) 576 39
-             582:   20(ivec4) Load 581
-             583:   20(ivec4) VectorShuffle 582 580 4 5 6 3
-                              Store 581 583
-             584:      6(int) Load 8(invocation)
-             585:     73(ptr) AccessChain 27(data) 60 39
-             586:   20(ivec4) Load 585
-             587:   20(ivec4) GroupNonUniformBitwiseOr 35 ClusteredReduce 586 34
-             588:     73(ptr) AccessChain 27(data) 584 39
-                              Store 588 587
-             589:      6(int) Load 8(invocation)
-             590:     96(ptr) AccessChain 27(data) 29 50 30
-             591:      6(int) Load 590
-             592:      6(int) GroupNonUniformBitwiseOr 35 ClusteredReduce 591 34
-             593:     96(ptr) AccessChain 27(data) 589 50 30
-                              Store 593 592
-             594:      6(int) Load 8(invocation)
-             595:    103(ptr) AccessChain 27(data) 39 50
-             596:   21(ivec4) Load 595
-             597:  102(ivec2) VectorShuffle 596 596 0 1
-             598:  102(ivec2) GroupNonUniformBitwiseOr 35 ClusteredReduce 597 34
-             599:    103(ptr) AccessChain 27(data) 594 50
-             600:   21(ivec4) Load 599
-             601:   21(ivec4) VectorShuffle 600 598 4 5 2 3
-                              Store 599 601
-             602:      6(int) Load 8(invocation)
-             603:    103(ptr) AccessChain 27(data) 50 50
-             604:   21(ivec4) Load 603
-             605:  112(ivec3) VectorShuffle 604 604 0 1 2
-             606:  112(ivec3) GroupNonUniformBitwiseOr 35 ClusteredReduce 605 34
-             607:    103(ptr) AccessChain 27(data) 602 50
-             608:   21(ivec4) Load 607
-             609:   21(ivec4) VectorShuffle 608 606 4 5 6 3
-                              Store 607 609
-             610:      6(int) Load 8(invocation)
-             611:    103(ptr) AccessChain 27(data) 60 50
-             612:   21(ivec4) Load 611
-             613:   21(ivec4) GroupNonUniformBitwiseOr 35 ClusteredReduce 612 34
-             614:    103(ptr) AccessChain 27(data) 610 50
-                              Store 614 613
-             615:      6(int) Load 8(invocation)
-             616:     66(ptr) AccessChain 27(data) 29 39 30
-             617:     19(int) Load 616
-             618:   522(bool) SLessThan 617 29
-             619:   522(bool) GroupNonUniformLogicalOr 35 ClusteredReduce 618 34
-             620:     19(int) Select 619 39 29
-             621:     66(ptr) AccessChain 27(data) 615 39 30
-                              Store 621 620
-             622:      6(int) Load 8(invocation)
-             623:     73(ptr) AccessChain 27(data) 39 39
-             624:   20(ivec4) Load 623
-             625:   72(ivec2) VectorShuffle 624 624 0 1
-             626:  532(bvec2) SLessThan 625 531
-             627:  532(bvec2) GroupNonUniformLogicalOr 35 ClusteredReduce 626 34
-             628:   72(ivec2) Select 627 535 531
-             629:     73(ptr) AccessChain 27(data) 622 39
-             630:   20(ivec4) Load 629
-             631:   20(ivec4) VectorShuffle 630 628 4 5 2 3
-                              Store 629 631
-             632:      6(int) Load 8(invocation)
-             633:     73(ptr) AccessChain 27(data) 39 39
-             634:   20(ivec4) Load 633
-             635:   82(ivec3) VectorShuffle 634 634 0 1 2
-             636:  545(bvec3) SLessThan 635 544
-             637:  545(bvec3) GroupNonUniformLogicalOr 35 ClusteredReduce 636 34
-             638:   82(ivec3) Select 637 548 544
-             639:     73(ptr) AccessChain 27(data) 632 39
-             640:   20(ivec4) Load 639
-             641:   20(ivec4) VectorShuffle 640 638 4 5 6 3
-                              Store 639 641
-             642:      6(int) Load 8(invocation)
-             643:     73(ptr) AccessChain 27(data) 39 39
-             644:   20(ivec4) Load 643
-             645:  557(bvec4) SLessThan 644 556
-             646:  557(bvec4) GroupNonUniformLogicalOr 35 ClusteredReduce 645 34
-             647:   20(ivec4) Select 646 560 556
-             648:     73(ptr) AccessChain 27(data) 642 39
-                              Store 648 647
-             649:      6(int) Load 8(invocation)
-             650:     66(ptr) AccessChain 27(data) 29 39 30
-             651:     19(int) Load 650
-             652:     19(int) GroupNonUniformBitwiseXor 35 ClusteredReduce 651 34
-             653:     66(ptr) AccessChain 27(data) 649 39 30
-                              Store 653 652
+             577:    112(ptr) AccessChain 27(data) 51 51
+             578:   21(ivec4) Load 577
+             579:  122(ivec3) VectorShuffle 578 578 0 1 2
+             580:  122(ivec3) GroupNonUniformBitwiseAnd 35 ClusteredReduce 579 34
+             581:    105(ptr) AccessChain 27(data) 576 51 30
+             582:      6(int) CompositeExtract 580 0
+                              Store 581 582
+             583:    105(ptr) AccessChain 27(data) 576 51 34
+             584:      6(int) CompositeExtract 580 1
+                              Store 583 584
+             585:    105(ptr) AccessChain 27(data) 576 51 61
+             586:      6(int) CompositeExtract 580 2
+                              Store 585 586
+             587:      6(int) Load 8(invocation)
+             588:    112(ptr) AccessChain 27(data) 65 51
+             589:   21(ivec4) Load 588
+             590:   21(ivec4) GroupNonUniformBitwiseAnd 35 ClusteredReduce 589 34
+             591:    112(ptr) AccessChain 27(data) 587 51
+                              Store 591 590
+             592:      6(int) Load 8(invocation)
+             593:     71(ptr) AccessChain 27(data) 29 39 30
+             594:     19(int) Load 593
+             596:   595(bool) SLessThan 594 29
+             597:   595(bool) GroupNonUniformLogicalAnd 35 ClusteredReduce 596 34
+             598:     19(int) Select 597 39 29
+             599:     71(ptr) AccessChain 27(data) 592 39 30
+                              Store 599 598
+             600:      6(int) Load 8(invocation)
+             601:     78(ptr) AccessChain 27(data) 39 39
+             602:   20(ivec4) Load 601
+             603:   77(ivec2) VectorShuffle 602 602 0 1
+             606:  605(bvec2) SLessThan 603 604
+             607:  605(bvec2) GroupNonUniformLogicalAnd 35 ClusteredReduce 606 34
+             609:   77(ivec2) Select 607 608 604
+             610:     71(ptr) AccessChain 27(data) 600 39 30
+             611:     19(int) CompositeExtract 609 0
+                              Store 610 611
+             612:     71(ptr) AccessChain 27(data) 600 39 34
+             613:     19(int) CompositeExtract 609 1
+                              Store 612 613
+             614:      6(int) Load 8(invocation)
+             615:     78(ptr) AccessChain 27(data) 39 39
+             616:   20(ivec4) Load 615
+             617:   88(ivec3) VectorShuffle 616 616 0 1 2
+             620:  619(bvec3) SLessThan 617 618
+             621:  619(bvec3) GroupNonUniformLogicalAnd 35 ClusteredReduce 620 34
+             623:   88(ivec3) Select 621 622 618
+             624:     71(ptr) AccessChain 27(data) 614 39 30
+             625:     19(int) CompositeExtract 623 0
+                              Store 624 625
+             626:     71(ptr) AccessChain 27(data) 614 39 34
+             627:     19(int) CompositeExtract 623 1
+                              Store 626 627
+             628:     71(ptr) AccessChain 27(data) 614 39 61
+             629:     19(int) CompositeExtract 623 2
+                              Store 628 629
+             630:      6(int) Load 8(invocation)
+             631:     78(ptr) AccessChain 27(data) 39 39
+             632:   20(ivec4) Load 631
+             635:  634(bvec4) SLessThan 632 633
+             636:  634(bvec4) GroupNonUniformLogicalAnd 35 ClusteredReduce 635 34
+             638:   20(ivec4) Select 636 637 633
+             639:     78(ptr) AccessChain 27(data) 630 39
+                              Store 639 638
+             640:      6(int) Load 8(invocation)
+             641:     71(ptr) AccessChain 27(data) 29 39 30
+             642:     19(int) Load 641
+             643:     19(int) GroupNonUniformBitwiseOr 35 ClusteredReduce 642 34
+             644:     71(ptr) AccessChain 27(data) 640 39 30
+                              Store 644 643
+             645:      6(int) Load 8(invocation)
+             646:     78(ptr) AccessChain 27(data) 39 39
+             647:   20(ivec4) Load 646
+             648:   77(ivec2) VectorShuffle 647 647 0 1
+             649:   77(ivec2) GroupNonUniformBitwiseOr 35 ClusteredReduce 648 34
+             650:     71(ptr) AccessChain 27(data) 645 39 30
+             651:     19(int) CompositeExtract 649 0
+                              Store 650 651
+             652:     71(ptr) AccessChain 27(data) 645 39 34
+             653:     19(int) CompositeExtract 649 1
+                              Store 652 653
              654:      6(int) Load 8(invocation)
-             655:     73(ptr) AccessChain 27(data) 39 39
+             655:     78(ptr) AccessChain 27(data) 51 39
              656:   20(ivec4) Load 655
-             657:   72(ivec2) VectorShuffle 656 656 0 1
-             658:   72(ivec2) GroupNonUniformBitwiseXor 35 ClusteredReduce 657 34
-             659:     73(ptr) AccessChain 27(data) 654 39
-             660:   20(ivec4) Load 659
-             661:   20(ivec4) VectorShuffle 660 658 4 5 2 3
-                              Store 659 661
-             662:      6(int) Load 8(invocation)
-             663:     73(ptr) AccessChain 27(data) 50 39
-             664:   20(ivec4) Load 663
-             665:   82(ivec3) VectorShuffle 664 664 0 1 2
-             666:   82(ivec3) GroupNonUniformBitwiseXor 35 ClusteredReduce 665 34
-             667:     73(ptr) AccessChain 27(data) 662 39
-             668:   20(ivec4) Load 667
-             669:   20(ivec4) VectorShuffle 668 666 4 5 6 3
-                              Store 667 669
+             657:   88(ivec3) VectorShuffle 656 656 0 1 2
+             658:   88(ivec3) GroupNonUniformBitwiseOr 35 ClusteredReduce 657 34
+             659:     71(ptr) AccessChain 27(data) 654 39 30
+             660:     19(int) CompositeExtract 658 0
+                              Store 659 660
+             661:     71(ptr) AccessChain 27(data) 654 39 34
+             662:     19(int) CompositeExtract 658 1
+                              Store 661 662
+             663:     71(ptr) AccessChain 27(data) 654 39 61
+             664:     19(int) CompositeExtract 658 2
+                              Store 663 664
+             665:      6(int) Load 8(invocation)
+             666:     78(ptr) AccessChain 27(data) 65 39
+             667:   20(ivec4) Load 666
+             668:   20(ivec4) GroupNonUniformBitwiseOr 35 ClusteredReduce 667 34
+             669:     78(ptr) AccessChain 27(data) 665 39
+                              Store 669 668
              670:      6(int) Load 8(invocation)
-             671:     73(ptr) AccessChain 27(data) 60 39
-             672:   20(ivec4) Load 671
-             673:   20(ivec4) GroupNonUniformBitwiseXor 35 ClusteredReduce 672 34
-             674:     73(ptr) AccessChain 27(data) 670 39
+             671:    105(ptr) AccessChain 27(data) 29 51 30
+             672:      6(int) Load 671
+             673:      6(int) GroupNonUniformBitwiseOr 35 ClusteredReduce 672 34
+             674:    105(ptr) AccessChain 27(data) 670 51 30
                               Store 674 673
              675:      6(int) Load 8(invocation)
-             676:     96(ptr) AccessChain 27(data) 29 50 30
-             677:      6(int) Load 676
-             678:      6(int) GroupNonUniformBitwiseXor 35 ClusteredReduce 677 34
-             679:     96(ptr) AccessChain 27(data) 675 50 30
-                              Store 679 678
-             680:      6(int) Load 8(invocation)
-             681:    103(ptr) AccessChain 27(data) 39 50
-             682:   21(ivec4) Load 681
-             683:  102(ivec2) VectorShuffle 682 682 0 1
-             684:  102(ivec2) GroupNonUniformBitwiseXor 35 ClusteredReduce 683 34
-             685:    103(ptr) AccessChain 27(data) 680 50
+             676:    112(ptr) AccessChain 27(data) 39 51
+             677:   21(ivec4) Load 676
+             678:  111(ivec2) VectorShuffle 677 677 0 1
+             679:  111(ivec2) GroupNonUniformBitwiseOr 35 ClusteredReduce 678 34
+             680:    105(ptr) AccessChain 27(data) 675 51 30
+             681:      6(int) CompositeExtract 679 0
+                              Store 680 681
+             682:    105(ptr) AccessChain 27(data) 675 51 34
+             683:      6(int) CompositeExtract 679 1
+                              Store 682 683
+             684:      6(int) Load 8(invocation)
+             685:    112(ptr) AccessChain 27(data) 51 51
              686:   21(ivec4) Load 685
-             687:   21(ivec4) VectorShuffle 686 684 4 5 2 3
-                              Store 685 687
-             688:      6(int) Load 8(invocation)
-             689:    103(ptr) AccessChain 27(data) 50 50
-             690:   21(ivec4) Load 689
-             691:  112(ivec3) VectorShuffle 690 690 0 1 2
-             692:  112(ivec3) GroupNonUniformBitwiseXor 35 ClusteredReduce 691 34
-             693:    103(ptr) AccessChain 27(data) 688 50
-             694:   21(ivec4) Load 693
-             695:   21(ivec4) VectorShuffle 694 692 4 5 6 3
-                              Store 693 695
-             696:      6(int) Load 8(invocation)
-             697:    103(ptr) AccessChain 27(data) 60 50
-             698:   21(ivec4) Load 697
-             699:   21(ivec4) GroupNonUniformBitwiseXor 35 ClusteredReduce 698 34
-             700:    103(ptr) AccessChain 27(data) 696 50
-                              Store 700 699
-             701:      6(int) Load 8(invocation)
-             702:     66(ptr) AccessChain 27(data) 29 39 30
-             703:     19(int) Load 702
-             704:   522(bool) SLessThan 703 29
-             705:   522(bool) GroupNonUniformLogicalXor 35 ClusteredReduce 704 34
-             706:     19(int) Select 705 39 29
-             707:     66(ptr) AccessChain 27(data) 701 39 30
-                              Store 707 706
-             708:      6(int) Load 8(invocation)
-             709:     73(ptr) AccessChain 27(data) 39 39
-             710:   20(ivec4) Load 709
-             711:   72(ivec2) VectorShuffle 710 710 0 1
-             712:  532(bvec2) SLessThan 711 531
-             713:  532(bvec2) GroupNonUniformLogicalXor 35 ClusteredReduce 712 34
-             714:   72(ivec2) Select 713 535 531
-             715:     73(ptr) AccessChain 27(data) 708 39
-             716:   20(ivec4) Load 715
-             717:   20(ivec4) VectorShuffle 716 714 4 5 2 3
-                              Store 715 717
+             687:  122(ivec3) VectorShuffle 686 686 0 1 2
+             688:  122(ivec3) GroupNonUniformBitwiseOr 35 ClusteredReduce 687 34
+             689:    105(ptr) AccessChain 27(data) 684 51 30
+             690:      6(int) CompositeExtract 688 0
+                              Store 689 690
+             691:    105(ptr) AccessChain 27(data) 684 51 34
+             692:      6(int) CompositeExtract 688 1
+                              Store 691 692
+             693:    105(ptr) AccessChain 27(data) 684 51 61
+             694:      6(int) CompositeExtract 688 2
+                              Store 693 694
+             695:      6(int) Load 8(invocation)
+             696:    112(ptr) AccessChain 27(data) 65 51
+             697:   21(ivec4) Load 696
+             698:   21(ivec4) GroupNonUniformBitwiseOr 35 ClusteredReduce 697 34
+             699:    112(ptr) AccessChain 27(data) 695 51
+                              Store 699 698
+             700:      6(int) Load 8(invocation)
+             701:     71(ptr) AccessChain 27(data) 29 39 30
+             702:     19(int) Load 701
+             703:   595(bool) SLessThan 702 29
+             704:   595(bool) GroupNonUniformLogicalOr 35 ClusteredReduce 703 34
+             705:     19(int) Select 704 39 29
+             706:     71(ptr) AccessChain 27(data) 700 39 30
+                              Store 706 705
+             707:      6(int) Load 8(invocation)
+             708:     78(ptr) AccessChain 27(data) 39 39
+             709:   20(ivec4) Load 708
+             710:   77(ivec2) VectorShuffle 709 709 0 1
+             711:  605(bvec2) SLessThan 710 604
+             712:  605(bvec2) GroupNonUniformLogicalOr 35 ClusteredReduce 711 34
+             713:   77(ivec2) Select 712 608 604
+             714:     71(ptr) AccessChain 27(data) 707 39 30
+             715:     19(int) CompositeExtract 713 0
+                              Store 714 715
+             716:     71(ptr) AccessChain 27(data) 707 39 34
+             717:     19(int) CompositeExtract 713 1
+                              Store 716 717
              718:      6(int) Load 8(invocation)
-             719:     73(ptr) AccessChain 27(data) 39 39
+             719:     78(ptr) AccessChain 27(data) 39 39
              720:   20(ivec4) Load 719
-             721:   82(ivec3) VectorShuffle 720 720 0 1 2
-             722:  545(bvec3) SLessThan 721 544
-             723:  545(bvec3) GroupNonUniformLogicalXor 35 ClusteredReduce 722 34
-             724:   82(ivec3) Select 723 548 544
-             725:     73(ptr) AccessChain 27(data) 718 39
-             726:   20(ivec4) Load 725
-             727:   20(ivec4) VectorShuffle 726 724 4 5 6 3
-                              Store 725 727
-             728:      6(int) Load 8(invocation)
-             729:     73(ptr) AccessChain 27(data) 39 39
-             730:   20(ivec4) Load 729
-             731:  557(bvec4) SLessThan 730 556
-             732:  557(bvec4) GroupNonUniformLogicalXor 35 ClusteredReduce 731 34
-             733:   20(ivec4) Select 732 560 556
-             734:     73(ptr) AccessChain 27(data) 728 39
-                              Store 734 733
+             721:   88(ivec3) VectorShuffle 720 720 0 1 2
+             722:  619(bvec3) SLessThan 721 618
+             723:  619(bvec3) GroupNonUniformLogicalOr 35 ClusteredReduce 722 34
+             724:   88(ivec3) Select 723 622 618
+             725:     71(ptr) AccessChain 27(data) 718 39 30
+             726:     19(int) CompositeExtract 724 0
+                              Store 725 726
+             727:     71(ptr) AccessChain 27(data) 718 39 34
+             728:     19(int) CompositeExtract 724 1
+                              Store 727 728
+             729:     71(ptr) AccessChain 27(data) 718 39 61
+             730:     19(int) CompositeExtract 724 2
+                              Store 729 730
+             731:      6(int) Load 8(invocation)
+             732:     78(ptr) AccessChain 27(data) 39 39
+             733:   20(ivec4) Load 732
+             734:  634(bvec4) SLessThan 733 633
+             735:  634(bvec4) GroupNonUniformLogicalOr 35 ClusteredReduce 734 34
+             736:   20(ivec4) Select 735 637 633
+             737:     78(ptr) AccessChain 27(data) 731 39
+                              Store 737 736
+             738:      6(int) Load 8(invocation)
+             739:     71(ptr) AccessChain 27(data) 29 39 30
+             740:     19(int) Load 739
+             741:     19(int) GroupNonUniformBitwiseXor 35 ClusteredReduce 740 34
+             742:     71(ptr) AccessChain 27(data) 738 39 30
+                              Store 742 741
+             743:      6(int) Load 8(invocation)
+             744:     78(ptr) AccessChain 27(data) 39 39
+             745:   20(ivec4) Load 744
+             746:   77(ivec2) VectorShuffle 745 745 0 1
+             747:   77(ivec2) GroupNonUniformBitwiseXor 35 ClusteredReduce 746 34
+             748:     71(ptr) AccessChain 27(data) 743 39 30
+             749:     19(int) CompositeExtract 747 0
+                              Store 748 749
+             750:     71(ptr) AccessChain 27(data) 743 39 34
+             751:     19(int) CompositeExtract 747 1
+                              Store 750 751
+             752:      6(int) Load 8(invocation)
+             753:     78(ptr) AccessChain 27(data) 51 39
+             754:   20(ivec4) Load 753
+             755:   88(ivec3) VectorShuffle 754 754 0 1 2
+             756:   88(ivec3) GroupNonUniformBitwiseXor 35 ClusteredReduce 755 34
+             757:     71(ptr) AccessChain 27(data) 752 39 30
+             758:     19(int) CompositeExtract 756 0
+                              Store 757 758
+             759:     71(ptr) AccessChain 27(data) 752 39 34
+             760:     19(int) CompositeExtract 756 1
+                              Store 759 760
+             761:     71(ptr) AccessChain 27(data) 752 39 61
+             762:     19(int) CompositeExtract 756 2
+                              Store 761 762
+             763:      6(int) Load 8(invocation)
+             764:     78(ptr) AccessChain 27(data) 65 39
+             765:   20(ivec4) Load 764
+             766:   20(ivec4) GroupNonUniformBitwiseXor 35 ClusteredReduce 765 34
+             767:     78(ptr) AccessChain 27(data) 763 39
+                              Store 767 766
+             768:      6(int) Load 8(invocation)
+             769:    105(ptr) AccessChain 27(data) 29 51 30
+             770:      6(int) Load 769
+             771:      6(int) GroupNonUniformBitwiseXor 35 ClusteredReduce 770 34
+             772:    105(ptr) AccessChain 27(data) 768 51 30
+                              Store 772 771
+             773:      6(int) Load 8(invocation)
+             774:    112(ptr) AccessChain 27(data) 39 51
+             775:   21(ivec4) Load 774
+             776:  111(ivec2) VectorShuffle 775 775 0 1
+             777:  111(ivec2) GroupNonUniformBitwiseXor 35 ClusteredReduce 776 34
+             778:    105(ptr) AccessChain 27(data) 773 51 30
+             779:      6(int) CompositeExtract 777 0
+                              Store 778 779
+             780:    105(ptr) AccessChain 27(data) 773 51 34
+             781:      6(int) CompositeExtract 777 1
+                              Store 780 781
+             782:      6(int) Load 8(invocation)
+             783:    112(ptr) AccessChain 27(data) 51 51
+             784:   21(ivec4) Load 783
+             785:  122(ivec3) VectorShuffle 784 784 0 1 2
+             786:  122(ivec3) GroupNonUniformBitwiseXor 35 ClusteredReduce 785 34
+             787:    105(ptr) AccessChain 27(data) 782 51 30
+             788:      6(int) CompositeExtract 786 0
+                              Store 787 788
+             789:    105(ptr) AccessChain 27(data) 782 51 34
+             790:      6(int) CompositeExtract 786 1
+                              Store 789 790
+             791:    105(ptr) AccessChain 27(data) 782 51 61
+             792:      6(int) CompositeExtract 786 2
+                              Store 791 792
+             793:      6(int) Load 8(invocation)
+             794:    112(ptr) AccessChain 27(data) 65 51
+             795:   21(ivec4) Load 794
+             796:   21(ivec4) GroupNonUniformBitwiseXor 35 ClusteredReduce 795 34
+             797:    112(ptr) AccessChain 27(data) 793 51
+                              Store 797 796
+             798:      6(int) Load 8(invocation)
+             799:     71(ptr) AccessChain 27(data) 29 39 30
+             800:     19(int) Load 799
+             801:   595(bool) SLessThan 800 29
+             802:   595(bool) GroupNonUniformLogicalXor 35 ClusteredReduce 801 34
+             803:     19(int) Select 802 39 29
+             804:     71(ptr) AccessChain 27(data) 798 39 30
+                              Store 804 803
+             805:      6(int) Load 8(invocation)
+             806:     78(ptr) AccessChain 27(data) 39 39
+             807:   20(ivec4) Load 806
+             808:   77(ivec2) VectorShuffle 807 807 0 1
+             809:  605(bvec2) SLessThan 808 604
+             810:  605(bvec2) GroupNonUniformLogicalXor 35 ClusteredReduce 809 34
+             811:   77(ivec2) Select 810 608 604
+             812:     71(ptr) AccessChain 27(data) 805 39 30
+             813:     19(int) CompositeExtract 811 0
+                              Store 812 813
+             814:     71(ptr) AccessChain 27(data) 805 39 34
+             815:     19(int) CompositeExtract 811 1
+                              Store 814 815
+             816:      6(int) Load 8(invocation)
+             817:     78(ptr) AccessChain 27(data) 39 39
+             818:   20(ivec4) Load 817
+             819:   88(ivec3) VectorShuffle 818 818 0 1 2
+             820:  619(bvec3) SLessThan 819 618
+             821:  619(bvec3) GroupNonUniformLogicalXor 35 ClusteredReduce 820 34
+             822:   88(ivec3) Select 821 622 618
+             823:     71(ptr) AccessChain 27(data) 816 39 30
+             824:     19(int) CompositeExtract 822 0
+                              Store 823 824
+             825:     71(ptr) AccessChain 27(data) 816 39 34
+             826:     19(int) CompositeExtract 822 1
+                              Store 825 826
+             827:     71(ptr) AccessChain 27(data) 816 39 61
+             828:     19(int) CompositeExtract 822 2
+                              Store 827 828
+             829:      6(int) Load 8(invocation)
+             830:     78(ptr) AccessChain 27(data) 39 39
+             831:   20(ivec4) Load 830
+             832:  634(bvec4) SLessThan 831 633
+             833:  634(bvec4) GroupNonUniformLogicalXor 35 ClusteredReduce 832 34
+             834:   20(ivec4) Select 833 637 633
+             835:     78(ptr) AccessChain 27(data) 829 39
+                              Store 835 834
                               Return
                               FunctionEnd
diff --git a/third_party/vulkan-deps/glslang/src/Test/baseResults/spv.subgroupExtendedTypesArithmetic.comp.out b/third_party/vulkan-deps/glslang/src/Test/baseResults/spv.subgroupExtendedTypesArithmetic.comp.out
index 1406bd1..828ce61 100644
--- a/third_party/vulkan-deps/glslang/src/Test/baseResults/spv.subgroupExtendedTypesArithmetic.comp.out
+++ b/third_party/vulkan-deps/glslang/src/Test/baseResults/spv.subgroupExtendedTypesArithmetic.comp.out
@@ -1,7 +1,7 @@
 spv.subgroupExtendedTypesArithmetic.comp
 // Module Version 10300
 // Generated by (magic number): 8000a
-// Id's are bound by 3665
+// Id's are bound by 4218
 
                               Capability Shader
                               Capability Float16
@@ -59,7 +59,7 @@
                               Decorate 31(Buffers) Block
                               Decorate 34(data) DescriptorSet 0
                               Decorate 34(data) Binding 0
-                              Decorate 3664 BuiltIn WorkgroupSize
+                              Decorate 4217 BuiltIn WorkgroupSize
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeInt 32 0
@@ -94,40 +94,41 @@
               46:     36(int) Constant 1
               47:             TypeVector 17(int8_t) 2
               48:             TypePointer StorageBuffer 18(i8vec4)
-              57:     36(int) Constant 2
-              58:             TypeVector 17(int8_t) 3
-              67:     36(int) Constant 3
-             593:             TypePointer StorageBuffer 19(int8_t)
-             599:             TypeVector 19(int8_t) 2
-             600:             TypePointer StorageBuffer 20(i8vec4)
-             609:             TypeVector 19(int8_t) 3
-            1143:             TypePointer StorageBuffer 21(int16_t)
-            1149:             TypeVector 21(int16_t) 2
-            1150:             TypePointer StorageBuffer 22(i16vec4)
-            1159:             TypeVector 21(int16_t) 3
-            1693:             TypePointer StorageBuffer 23(int16_t)
-            1699:             TypeVector 23(int16_t) 2
-            1700:             TypePointer StorageBuffer 24(i16vec4)
-            1709:             TypeVector 23(int16_t) 3
-            2243:     36(int) Constant 4
-            2244:             TypePointer StorageBuffer 25(int64_t)
-            2250:             TypeVector 25(int64_t) 2
-            2251:             TypePointer StorageBuffer 26(i64vec4)
-            2260:             TypeVector 25(int64_t) 3
-            2794:     36(int) Constant 5
-            2795:             TypePointer StorageBuffer 27(int64_t)
-            2801:             TypeVector 27(int64_t) 2
-            2802:             TypePointer StorageBuffer 28(i64vec4)
-            2811:             TypeVector 27(int64_t) 3
-            3345:     36(int) Constant 6
-            3346:             TypePointer StorageBuffer 29(float16_t)
-            3352:             TypeVector 29(float16_t) 2
-            3353:             TypePointer StorageBuffer 30(f16vec4)
-            3362:             TypeVector 29(float16_t) 3
-            3661:             TypeVector 6(int) 3
-            3662:      6(int) Constant 8
-            3663:      6(int) Constant 1
-            3664: 3661(ivec3) ConstantComposite 3662 3663 3663
+              55:      6(int) Constant 1
+              59:     36(int) Constant 2
+              60:             TypeVector 17(int8_t) 3
+              69:      6(int) Constant 2
+              73:     36(int) Constant 3
+             679:             TypePointer StorageBuffer 19(int8_t)
+             685:             TypeVector 19(int8_t) 2
+             686:             TypePointer StorageBuffer 20(i8vec4)
+             696:             TypeVector 19(int8_t) 3
+            1313:             TypePointer StorageBuffer 21(int16_t)
+            1319:             TypeVector 21(int16_t) 2
+            1320:             TypePointer StorageBuffer 22(i16vec4)
+            1330:             TypeVector 21(int16_t) 3
+            1947:             TypePointer StorageBuffer 23(int16_t)
+            1953:             TypeVector 23(int16_t) 2
+            1954:             TypePointer StorageBuffer 24(i16vec4)
+            1964:             TypeVector 23(int16_t) 3
+            2581:     36(int) Constant 4
+            2582:             TypePointer StorageBuffer 25(int64_t)
+            2588:             TypeVector 25(int64_t) 2
+            2589:             TypePointer StorageBuffer 26(i64vec4)
+            2599:             TypeVector 25(int64_t) 3
+            3216:     36(int) Constant 5
+            3217:             TypePointer StorageBuffer 27(int64_t)
+            3223:             TypeVector 27(int64_t) 2
+            3224:             TypePointer StorageBuffer 28(i64vec4)
+            3234:             TypeVector 27(int64_t) 3
+            3851:     36(int) Constant 6
+            3852:             TypePointer StorageBuffer 29(float16_t)
+            3858:             TypeVector 29(float16_t) 2
+            3859:             TypePointer StorageBuffer 30(f16vec4)
+            3869:             TypeVector 29(float16_t) 3
+            4215:             TypeVector 6(int) 3
+            4216:      6(int) Constant 8
+            4217: 4215(ivec3) ConstantComposite 4216 55 55
          4(main):           2 Function None 3
                5:             Label
    8(invocation):      7(ptr) Variable Function
@@ -147,4134 +148,5100 @@
               50:  18(i8vec4) Load 49
               51:  47(i8vec2) VectorShuffle 50 50 0 1
               52:  47(i8vec2) GroupNonUniformIAdd 42 Reduce 51
-              53:     48(ptr) AccessChain 34(data) 45 37
-              54:  18(i8vec4) Load 53
-              55:  18(i8vec4) VectorShuffle 54 52 4 5 2 3
-                              Store 53 55
-              56:      6(int) Load 8(invocation)
-              59:     48(ptr) AccessChain 34(data) 57 37
-              60:  18(i8vec4) Load 59
-              61:  58(i8vec3) VectorShuffle 60 60 0 1 2
-              62:  58(i8vec3) GroupNonUniformIAdd 42 Reduce 61
-              63:     48(ptr) AccessChain 34(data) 56 37
-              64:  18(i8vec4) Load 63
-              65:  18(i8vec4) VectorShuffle 64 62 4 5 6 3
-                              Store 63 65
-              66:      6(int) Load 8(invocation)
-              68:     48(ptr) AccessChain 34(data) 67 37
-              69:  18(i8vec4) Load 68
-              70:  18(i8vec4) GroupNonUniformIAdd 42 Reduce 69
-              71:     48(ptr) AccessChain 34(data) 66 37
-                              Store 71 70
+              53:     39(ptr) AccessChain 34(data) 45 37 38
+              54:  17(int8_t) CompositeExtract 52 0
+                              Store 53 54
+              56:     39(ptr) AccessChain 34(data) 45 37 55
+              57:  17(int8_t) CompositeExtract 52 1
+                              Store 56 57
+              58:      6(int) Load 8(invocation)
+              61:     48(ptr) AccessChain 34(data) 59 37
+              62:  18(i8vec4) Load 61
+              63:  60(i8vec3) VectorShuffle 62 62 0 1 2
+              64:  60(i8vec3) GroupNonUniformIAdd 42 Reduce 63
+              65:     39(ptr) AccessChain 34(data) 58 37 38
+              66:  17(int8_t) CompositeExtract 64 0
+                              Store 65 66
+              67:     39(ptr) AccessChain 34(data) 58 37 55
+              68:  17(int8_t) CompositeExtract 64 1
+                              Store 67 68
+              70:     39(ptr) AccessChain 34(data) 58 37 69
+              71:  17(int8_t) CompositeExtract 64 2
+                              Store 70 71
               72:      6(int) Load 8(invocation)
-              73:     39(ptr) AccessChain 34(data) 37 37 38
-              74:  17(int8_t) Load 73
-              75:  17(int8_t) GroupNonUniformIMul 42 Reduce 74
-              76:     39(ptr) AccessChain 34(data) 72 37 38
-                              Store 76 75
-              77:      6(int) Load 8(invocation)
-              78:     48(ptr) AccessChain 34(data) 46 37
-              79:  18(i8vec4) Load 78
-              80:  47(i8vec2) VectorShuffle 79 79 0 1
-              81:  47(i8vec2) GroupNonUniformIMul 42 Reduce 80
-              82:     48(ptr) AccessChain 34(data) 77 37
-              83:  18(i8vec4) Load 82
-              84:  18(i8vec4) VectorShuffle 83 81 4 5 2 3
-                              Store 82 84
-              85:      6(int) Load 8(invocation)
-              86:     48(ptr) AccessChain 34(data) 57 37
-              87:  18(i8vec4) Load 86
-              88:  58(i8vec3) VectorShuffle 87 87 0 1 2
-              89:  58(i8vec3) GroupNonUniformIMul 42 Reduce 88
-              90:     48(ptr) AccessChain 34(data) 85 37
-              91:  18(i8vec4) Load 90
-              92:  18(i8vec4) VectorShuffle 91 89 4 5 6 3
-                              Store 90 92
-              93:      6(int) Load 8(invocation)
-              94:     48(ptr) AccessChain 34(data) 67 37
-              95:  18(i8vec4) Load 94
-              96:  18(i8vec4) GroupNonUniformIMul 42 Reduce 95
-              97:     48(ptr) AccessChain 34(data) 93 37
-                              Store 97 96
-              98:      6(int) Load 8(invocation)
-              99:     39(ptr) AccessChain 34(data) 37 37 38
-             100:  17(int8_t) Load 99
-             101:  17(int8_t) GroupNonUniformSMin 42 Reduce 100
-             102:     39(ptr) AccessChain 34(data) 98 37 38
-                              Store 102 101
+              74:     48(ptr) AccessChain 34(data) 73 37
+              75:  18(i8vec4) Load 74
+              76:  18(i8vec4) GroupNonUniformIAdd 42 Reduce 75
+              77:     48(ptr) AccessChain 34(data) 72 37
+                              Store 77 76
+              78:      6(int) Load 8(invocation)
+              79:     39(ptr) AccessChain 34(data) 37 37 38
+              80:  17(int8_t) Load 79
+              81:  17(int8_t) GroupNonUniformIMul 42 Reduce 80
+              82:     39(ptr) AccessChain 34(data) 78 37 38
+                              Store 82 81
+              83:      6(int) Load 8(invocation)
+              84:     48(ptr) AccessChain 34(data) 46 37
+              85:  18(i8vec4) Load 84
+              86:  47(i8vec2) VectorShuffle 85 85 0 1
+              87:  47(i8vec2) GroupNonUniformIMul 42 Reduce 86
+              88:     39(ptr) AccessChain 34(data) 83 37 38
+              89:  17(int8_t) CompositeExtract 87 0
+                              Store 88 89
+              90:     39(ptr) AccessChain 34(data) 83 37 55
+              91:  17(int8_t) CompositeExtract 87 1
+                              Store 90 91
+              92:      6(int) Load 8(invocation)
+              93:     48(ptr) AccessChain 34(data) 59 37
+              94:  18(i8vec4) Load 93
+              95:  60(i8vec3) VectorShuffle 94 94 0 1 2
+              96:  60(i8vec3) GroupNonUniformIMul 42 Reduce 95
+              97:     39(ptr) AccessChain 34(data) 92 37 38
+              98:  17(int8_t) CompositeExtract 96 0
+                              Store 97 98
+              99:     39(ptr) AccessChain 34(data) 92 37 55
+             100:  17(int8_t) CompositeExtract 96 1
+                              Store 99 100
+             101:     39(ptr) AccessChain 34(data) 92 37 69
+             102:  17(int8_t) CompositeExtract 96 2
+                              Store 101 102
              103:      6(int) Load 8(invocation)
-             104:     48(ptr) AccessChain 34(data) 46 37
+             104:     48(ptr) AccessChain 34(data) 73 37
              105:  18(i8vec4) Load 104
-             106:  47(i8vec2) VectorShuffle 105 105 0 1
-             107:  47(i8vec2) GroupNonUniformSMin 42 Reduce 106
-             108:     48(ptr) AccessChain 34(data) 103 37
-             109:  18(i8vec4) Load 108
-             110:  18(i8vec4) VectorShuffle 109 107 4 5 2 3
-                              Store 108 110
-             111:      6(int) Load 8(invocation)
-             112:     48(ptr) AccessChain 34(data) 57 37
-             113:  18(i8vec4) Load 112
-             114:  58(i8vec3) VectorShuffle 113 113 0 1 2
-             115:  58(i8vec3) GroupNonUniformSMin 42 Reduce 114
-             116:     48(ptr) AccessChain 34(data) 111 37
-             117:  18(i8vec4) Load 116
-             118:  18(i8vec4) VectorShuffle 117 115 4 5 6 3
-                              Store 116 118
-             119:      6(int) Load 8(invocation)
-             120:     48(ptr) AccessChain 34(data) 67 37
-             121:  18(i8vec4) Load 120
-             122:  18(i8vec4) GroupNonUniformSMin 42 Reduce 121
-             123:     48(ptr) AccessChain 34(data) 119 37
-                              Store 123 122
-             124:      6(int) Load 8(invocation)
-             125:     39(ptr) AccessChain 34(data) 37 37 38
-             126:  17(int8_t) Load 125
-             127:  17(int8_t) GroupNonUniformSMax 42 Reduce 126
-             128:     39(ptr) AccessChain 34(data) 124 37 38
-                              Store 128 127
-             129:      6(int) Load 8(invocation)
-             130:     48(ptr) AccessChain 34(data) 46 37
-             131:  18(i8vec4) Load 130
-             132:  47(i8vec2) VectorShuffle 131 131 0 1
-             133:  47(i8vec2) GroupNonUniformSMax 42 Reduce 132
-             134:     48(ptr) AccessChain 34(data) 129 37
+             106:  18(i8vec4) GroupNonUniformIMul 42 Reduce 105
+             107:     48(ptr) AccessChain 34(data) 103 37
+                              Store 107 106
+             108:      6(int) Load 8(invocation)
+             109:     39(ptr) AccessChain 34(data) 37 37 38
+             110:  17(int8_t) Load 109
+             111:  17(int8_t) GroupNonUniformSMin 42 Reduce 110
+             112:     39(ptr) AccessChain 34(data) 108 37 38
+                              Store 112 111
+             113:      6(int) Load 8(invocation)
+             114:     48(ptr) AccessChain 34(data) 46 37
+             115:  18(i8vec4) Load 114
+             116:  47(i8vec2) VectorShuffle 115 115 0 1
+             117:  47(i8vec2) GroupNonUniformSMin 42 Reduce 116
+             118:     39(ptr) AccessChain 34(data) 113 37 38
+             119:  17(int8_t) CompositeExtract 117 0
+                              Store 118 119
+             120:     39(ptr) AccessChain 34(data) 113 37 55
+             121:  17(int8_t) CompositeExtract 117 1
+                              Store 120 121
+             122:      6(int) Load 8(invocation)
+             123:     48(ptr) AccessChain 34(data) 59 37
+             124:  18(i8vec4) Load 123
+             125:  60(i8vec3) VectorShuffle 124 124 0 1 2
+             126:  60(i8vec3) GroupNonUniformSMin 42 Reduce 125
+             127:     39(ptr) AccessChain 34(data) 122 37 38
+             128:  17(int8_t) CompositeExtract 126 0
+                              Store 127 128
+             129:     39(ptr) AccessChain 34(data) 122 37 55
+             130:  17(int8_t) CompositeExtract 126 1
+                              Store 129 130
+             131:     39(ptr) AccessChain 34(data) 122 37 69
+             132:  17(int8_t) CompositeExtract 126 2
+                              Store 131 132
+             133:      6(int) Load 8(invocation)
+             134:     48(ptr) AccessChain 34(data) 73 37
              135:  18(i8vec4) Load 134
-             136:  18(i8vec4) VectorShuffle 135 133 4 5 2 3
-                              Store 134 136
-             137:      6(int) Load 8(invocation)
-             138:     48(ptr) AccessChain 34(data) 57 37
-             139:  18(i8vec4) Load 138
-             140:  58(i8vec3) VectorShuffle 139 139 0 1 2
-             141:  58(i8vec3) GroupNonUniformSMax 42 Reduce 140
-             142:     48(ptr) AccessChain 34(data) 137 37
-             143:  18(i8vec4) Load 142
-             144:  18(i8vec4) VectorShuffle 143 141 4 5 6 3
-                              Store 142 144
-             145:      6(int) Load 8(invocation)
-             146:     48(ptr) AccessChain 34(data) 67 37
-             147:  18(i8vec4) Load 146
-             148:  18(i8vec4) GroupNonUniformSMax 42 Reduce 147
-             149:     48(ptr) AccessChain 34(data) 145 37
-                              Store 149 148
-             150:      6(int) Load 8(invocation)
-             151:     39(ptr) AccessChain 34(data) 37 37 38
-             152:  17(int8_t) Load 151
-             153:  17(int8_t) GroupNonUniformBitwiseAnd 42 Reduce 152
-             154:     39(ptr) AccessChain 34(data) 150 37 38
-                              Store 154 153
-             155:      6(int) Load 8(invocation)
-             156:     48(ptr) AccessChain 34(data) 46 37
-             157:  18(i8vec4) Load 156
-             158:  47(i8vec2) VectorShuffle 157 157 0 1
-             159:  47(i8vec2) GroupNonUniformBitwiseAnd 42 Reduce 158
-             160:     48(ptr) AccessChain 34(data) 155 37
-             161:  18(i8vec4) Load 160
-             162:  18(i8vec4) VectorShuffle 161 159 4 5 2 3
-                              Store 160 162
+             136:  18(i8vec4) GroupNonUniformSMin 42 Reduce 135
+             137:     48(ptr) AccessChain 34(data) 133 37
+                              Store 137 136
+             138:      6(int) Load 8(invocation)
+             139:     39(ptr) AccessChain 34(data) 37 37 38
+             140:  17(int8_t) Load 139
+             141:  17(int8_t) GroupNonUniformSMax 42 Reduce 140
+             142:     39(ptr) AccessChain 34(data) 138 37 38
+                              Store 142 141
+             143:      6(int) Load 8(invocation)
+             144:     48(ptr) AccessChain 34(data) 46 37
+             145:  18(i8vec4) Load 144
+             146:  47(i8vec2) VectorShuffle 145 145 0 1
+             147:  47(i8vec2) GroupNonUniformSMax 42 Reduce 146
+             148:     39(ptr) AccessChain 34(data) 143 37 38
+             149:  17(int8_t) CompositeExtract 147 0
+                              Store 148 149
+             150:     39(ptr) AccessChain 34(data) 143 37 55
+             151:  17(int8_t) CompositeExtract 147 1
+                              Store 150 151
+             152:      6(int) Load 8(invocation)
+             153:     48(ptr) AccessChain 34(data) 59 37
+             154:  18(i8vec4) Load 153
+             155:  60(i8vec3) VectorShuffle 154 154 0 1 2
+             156:  60(i8vec3) GroupNonUniformSMax 42 Reduce 155
+             157:     39(ptr) AccessChain 34(data) 152 37 38
+             158:  17(int8_t) CompositeExtract 156 0
+                              Store 157 158
+             159:     39(ptr) AccessChain 34(data) 152 37 55
+             160:  17(int8_t) CompositeExtract 156 1
+                              Store 159 160
+             161:     39(ptr) AccessChain 34(data) 152 37 69
+             162:  17(int8_t) CompositeExtract 156 2
+                              Store 161 162
              163:      6(int) Load 8(invocation)
-             164:     48(ptr) AccessChain 34(data) 57 37
+             164:     48(ptr) AccessChain 34(data) 73 37
              165:  18(i8vec4) Load 164
-             166:  58(i8vec3) VectorShuffle 165 165 0 1 2
-             167:  58(i8vec3) GroupNonUniformBitwiseAnd 42 Reduce 166
-             168:     48(ptr) AccessChain 34(data) 163 37
-             169:  18(i8vec4) Load 168
-             170:  18(i8vec4) VectorShuffle 169 167 4 5 6 3
-                              Store 168 170
-             171:      6(int) Load 8(invocation)
-             172:     48(ptr) AccessChain 34(data) 67 37
-             173:  18(i8vec4) Load 172
-             174:  18(i8vec4) GroupNonUniformBitwiseAnd 42 Reduce 173
-             175:     48(ptr) AccessChain 34(data) 171 37
-                              Store 175 174
-             176:      6(int) Load 8(invocation)
-             177:     39(ptr) AccessChain 34(data) 37 37 38
-             178:  17(int8_t) Load 177
-             179:  17(int8_t) GroupNonUniformBitwiseOr 42 Reduce 178
-             180:     39(ptr) AccessChain 34(data) 176 37 38
-                              Store 180 179
-             181:      6(int) Load 8(invocation)
-             182:     48(ptr) AccessChain 34(data) 46 37
-             183:  18(i8vec4) Load 182
-             184:  47(i8vec2) VectorShuffle 183 183 0 1
-             185:  47(i8vec2) GroupNonUniformBitwiseOr 42 Reduce 184
-             186:     48(ptr) AccessChain 34(data) 181 37
-             187:  18(i8vec4) Load 186
-             188:  18(i8vec4) VectorShuffle 187 185 4 5 2 3
-                              Store 186 188
-             189:      6(int) Load 8(invocation)
-             190:     48(ptr) AccessChain 34(data) 57 37
-             191:  18(i8vec4) Load 190
-             192:  58(i8vec3) VectorShuffle 191 191 0 1 2
-             193:  58(i8vec3) GroupNonUniformBitwiseOr 42 Reduce 192
-             194:     48(ptr) AccessChain 34(data) 189 37
+             166:  18(i8vec4) GroupNonUniformSMax 42 Reduce 165
+             167:     48(ptr) AccessChain 34(data) 163 37
+                              Store 167 166
+             168:      6(int) Load 8(invocation)
+             169:     39(ptr) AccessChain 34(data) 37 37 38
+             170:  17(int8_t) Load 169
+             171:  17(int8_t) GroupNonUniformBitwiseAnd 42 Reduce 170
+             172:     39(ptr) AccessChain 34(data) 168 37 38
+                              Store 172 171
+             173:      6(int) Load 8(invocation)
+             174:     48(ptr) AccessChain 34(data) 46 37
+             175:  18(i8vec4) Load 174
+             176:  47(i8vec2) VectorShuffle 175 175 0 1
+             177:  47(i8vec2) GroupNonUniformBitwiseAnd 42 Reduce 176
+             178:     39(ptr) AccessChain 34(data) 173 37 38
+             179:  17(int8_t) CompositeExtract 177 0
+                              Store 178 179
+             180:     39(ptr) AccessChain 34(data) 173 37 55
+             181:  17(int8_t) CompositeExtract 177 1
+                              Store 180 181
+             182:      6(int) Load 8(invocation)
+             183:     48(ptr) AccessChain 34(data) 59 37
+             184:  18(i8vec4) Load 183
+             185:  60(i8vec3) VectorShuffle 184 184 0 1 2
+             186:  60(i8vec3) GroupNonUniformBitwiseAnd 42 Reduce 185
+             187:     39(ptr) AccessChain 34(data) 182 37 38
+             188:  17(int8_t) CompositeExtract 186 0
+                              Store 187 188
+             189:     39(ptr) AccessChain 34(data) 182 37 55
+             190:  17(int8_t) CompositeExtract 186 1
+                              Store 189 190
+             191:     39(ptr) AccessChain 34(data) 182 37 69
+             192:  17(int8_t) CompositeExtract 186 2
+                              Store 191 192
+             193:      6(int) Load 8(invocation)
+             194:     48(ptr) AccessChain 34(data) 73 37
              195:  18(i8vec4) Load 194
-             196:  18(i8vec4) VectorShuffle 195 193 4 5 6 3
-                              Store 194 196
-             197:      6(int) Load 8(invocation)
-             198:     48(ptr) AccessChain 34(data) 67 37
-             199:  18(i8vec4) Load 198
-             200:  18(i8vec4) GroupNonUniformBitwiseOr 42 Reduce 199
-             201:     48(ptr) AccessChain 34(data) 197 37
-                              Store 201 200
-             202:      6(int) Load 8(invocation)
-             203:     39(ptr) AccessChain 34(data) 37 37 38
-             204:  17(int8_t) Load 203
-             205:  17(int8_t) GroupNonUniformBitwiseXor 42 Reduce 204
-             206:     39(ptr) AccessChain 34(data) 202 37 38
-                              Store 206 205
-             207:      6(int) Load 8(invocation)
-             208:     48(ptr) AccessChain 34(data) 46 37
-             209:  18(i8vec4) Load 208
-             210:  47(i8vec2) VectorShuffle 209 209 0 1
-             211:  47(i8vec2) GroupNonUniformBitwiseXor 42 Reduce 210
-             212:     48(ptr) AccessChain 34(data) 207 37
-             213:  18(i8vec4) Load 212
-             214:  18(i8vec4) VectorShuffle 213 211 4 5 2 3
-                              Store 212 214
-             215:      6(int) Load 8(invocation)
-             216:     48(ptr) AccessChain 34(data) 57 37
-             217:  18(i8vec4) Load 216
-             218:  58(i8vec3) VectorShuffle 217 217 0 1 2
-             219:  58(i8vec3) GroupNonUniformBitwiseXor 42 Reduce 218
-             220:     48(ptr) AccessChain 34(data) 215 37
-             221:  18(i8vec4) Load 220
-             222:  18(i8vec4) VectorShuffle 221 219 4 5 6 3
-                              Store 220 222
+             196:  18(i8vec4) GroupNonUniformBitwiseAnd 42 Reduce 195
+             197:     48(ptr) AccessChain 34(data) 193 37
+                              Store 197 196
+             198:      6(int) Load 8(invocation)
+             199:     39(ptr) AccessChain 34(data) 37 37 38
+             200:  17(int8_t) Load 199
+             201:  17(int8_t) GroupNonUniformBitwiseOr 42 Reduce 200
+             202:     39(ptr) AccessChain 34(data) 198 37 38
+                              Store 202 201
+             203:      6(int) Load 8(invocation)
+             204:     48(ptr) AccessChain 34(data) 46 37
+             205:  18(i8vec4) Load 204
+             206:  47(i8vec2) VectorShuffle 205 205 0 1
+             207:  47(i8vec2) GroupNonUniformBitwiseOr 42 Reduce 206
+             208:     39(ptr) AccessChain 34(data) 203 37 38
+             209:  17(int8_t) CompositeExtract 207 0
+                              Store 208 209
+             210:     39(ptr) AccessChain 34(data) 203 37 55
+             211:  17(int8_t) CompositeExtract 207 1
+                              Store 210 211
+             212:      6(int) Load 8(invocation)
+             213:     48(ptr) AccessChain 34(data) 59 37
+             214:  18(i8vec4) Load 213
+             215:  60(i8vec3) VectorShuffle 214 214 0 1 2
+             216:  60(i8vec3) GroupNonUniformBitwiseOr 42 Reduce 215
+             217:     39(ptr) AccessChain 34(data) 212 37 38
+             218:  17(int8_t) CompositeExtract 216 0
+                              Store 217 218
+             219:     39(ptr) AccessChain 34(data) 212 37 55
+             220:  17(int8_t) CompositeExtract 216 1
+                              Store 219 220
+             221:     39(ptr) AccessChain 34(data) 212 37 69
+             222:  17(int8_t) CompositeExtract 216 2
+                              Store 221 222
              223:      6(int) Load 8(invocation)
-             224:     48(ptr) AccessChain 34(data) 67 37
+             224:     48(ptr) AccessChain 34(data) 73 37
              225:  18(i8vec4) Load 224
-             226:  18(i8vec4) GroupNonUniformBitwiseXor 42 Reduce 225
+             226:  18(i8vec4) GroupNonUniformBitwiseOr 42 Reduce 225
              227:     48(ptr) AccessChain 34(data) 223 37
                               Store 227 226
              228:      6(int) Load 8(invocation)
              229:     39(ptr) AccessChain 34(data) 37 37 38
              230:  17(int8_t) Load 229
-             231:  17(int8_t) GroupNonUniformIAdd 42 InclusiveScan 230
+             231:  17(int8_t) GroupNonUniformBitwiseXor 42 Reduce 230
              232:     39(ptr) AccessChain 34(data) 228 37 38
                               Store 232 231
              233:      6(int) Load 8(invocation)
              234:     48(ptr) AccessChain 34(data) 46 37
              235:  18(i8vec4) Load 234
              236:  47(i8vec2) VectorShuffle 235 235 0 1
-             237:  47(i8vec2) GroupNonUniformIAdd 42 InclusiveScan 236
-             238:     48(ptr) AccessChain 34(data) 233 37
-             239:  18(i8vec4) Load 238
-             240:  18(i8vec4) VectorShuffle 239 237 4 5 2 3
-                              Store 238 240
-             241:      6(int) Load 8(invocation)
-             242:     48(ptr) AccessChain 34(data) 57 37
-             243:  18(i8vec4) Load 242
-             244:  58(i8vec3) VectorShuffle 243 243 0 1 2
-             245:  58(i8vec3) GroupNonUniformIAdd 42 InclusiveScan 244
-             246:     48(ptr) AccessChain 34(data) 241 37
-             247:  18(i8vec4) Load 246
-             248:  18(i8vec4) VectorShuffle 247 245 4 5 6 3
-                              Store 246 248
-             249:      6(int) Load 8(invocation)
-             250:     48(ptr) AccessChain 34(data) 67 37
-             251:  18(i8vec4) Load 250
-             252:  18(i8vec4) GroupNonUniformIAdd 42 InclusiveScan 251
-             253:     48(ptr) AccessChain 34(data) 249 37
-                              Store 253 252
-             254:      6(int) Load 8(invocation)
-             255:     39(ptr) AccessChain 34(data) 37 37 38
-             256:  17(int8_t) Load 255
-             257:  17(int8_t) GroupNonUniformIMul 42 InclusiveScan 256
-             258:     39(ptr) AccessChain 34(data) 254 37 38
-                              Store 258 257
-             259:      6(int) Load 8(invocation)
-             260:     48(ptr) AccessChain 34(data) 46 37
-             261:  18(i8vec4) Load 260
-             262:  47(i8vec2) VectorShuffle 261 261 0 1
-             263:  47(i8vec2) GroupNonUniformIMul 42 InclusiveScan 262
-             264:     48(ptr) AccessChain 34(data) 259 37
+             237:  47(i8vec2) GroupNonUniformBitwiseXor 42 Reduce 236
+             238:     39(ptr) AccessChain 34(data) 233 37 38
+             239:  17(int8_t) CompositeExtract 237 0
+                              Store 238 239
+             240:     39(ptr) AccessChain 34(data) 233 37 55
+             241:  17(int8_t) CompositeExtract 237 1
+                              Store 240 241
+             242:      6(int) Load 8(invocation)
+             243:     48(ptr) AccessChain 34(data) 59 37
+             244:  18(i8vec4) Load 243
+             245:  60(i8vec3) VectorShuffle 244 244 0 1 2
+             246:  60(i8vec3) GroupNonUniformBitwiseXor 42 Reduce 245
+             247:     39(ptr) AccessChain 34(data) 242 37 38
+             248:  17(int8_t) CompositeExtract 246 0
+                              Store 247 248
+             249:     39(ptr) AccessChain 34(data) 242 37 55
+             250:  17(int8_t) CompositeExtract 246 1
+                              Store 249 250
+             251:     39(ptr) AccessChain 34(data) 242 37 69
+             252:  17(int8_t) CompositeExtract 246 2
+                              Store 251 252
+             253:      6(int) Load 8(invocation)
+             254:     48(ptr) AccessChain 34(data) 73 37
+             255:  18(i8vec4) Load 254
+             256:  18(i8vec4) GroupNonUniformBitwiseXor 42 Reduce 255
+             257:     48(ptr) AccessChain 34(data) 253 37
+                              Store 257 256
+             258:      6(int) Load 8(invocation)
+             259:     39(ptr) AccessChain 34(data) 37 37 38
+             260:  17(int8_t) Load 259
+             261:  17(int8_t) GroupNonUniformIAdd 42 InclusiveScan 260
+             262:     39(ptr) AccessChain 34(data) 258 37 38
+                              Store 262 261
+             263:      6(int) Load 8(invocation)
+             264:     48(ptr) AccessChain 34(data) 46 37
              265:  18(i8vec4) Load 264
-             266:  18(i8vec4) VectorShuffle 265 263 4 5 2 3
-                              Store 264 266
-             267:      6(int) Load 8(invocation)
-             268:     48(ptr) AccessChain 34(data) 57 37
-             269:  18(i8vec4) Load 268
-             270:  58(i8vec3) VectorShuffle 269 269 0 1 2
-             271:  58(i8vec3) GroupNonUniformIMul 42 InclusiveScan 270
-             272:     48(ptr) AccessChain 34(data) 267 37
-             273:  18(i8vec4) Load 272
-             274:  18(i8vec4) VectorShuffle 273 271 4 5 6 3
-                              Store 272 274
-             275:      6(int) Load 8(invocation)
-             276:     48(ptr) AccessChain 34(data) 67 37
-             277:  18(i8vec4) Load 276
-             278:  18(i8vec4) GroupNonUniformIMul 42 InclusiveScan 277
-             279:     48(ptr) AccessChain 34(data) 275 37
-                              Store 279 278
-             280:      6(int) Load 8(invocation)
-             281:     39(ptr) AccessChain 34(data) 37 37 38
-             282:  17(int8_t) Load 281
-             283:  17(int8_t) GroupNonUniformSMin 42 InclusiveScan 282
-             284:     39(ptr) AccessChain 34(data) 280 37 38
-                              Store 284 283
-             285:      6(int) Load 8(invocation)
-             286:     48(ptr) AccessChain 34(data) 46 37
-             287:  18(i8vec4) Load 286
-             288:  47(i8vec2) VectorShuffle 287 287 0 1
-             289:  47(i8vec2) GroupNonUniformSMin 42 InclusiveScan 288
-             290:     48(ptr) AccessChain 34(data) 285 37
-             291:  18(i8vec4) Load 290
-             292:  18(i8vec4) VectorShuffle 291 289 4 5 2 3
-                              Store 290 292
+             266:  47(i8vec2) VectorShuffle 265 265 0 1
+             267:  47(i8vec2) GroupNonUniformIAdd 42 InclusiveScan 266
+             268:     39(ptr) AccessChain 34(data) 263 37 38
+             269:  17(int8_t) CompositeExtract 267 0
+                              Store 268 269
+             270:     39(ptr) AccessChain 34(data) 263 37 55
+             271:  17(int8_t) CompositeExtract 267 1
+                              Store 270 271
+             272:      6(int) Load 8(invocation)
+             273:     48(ptr) AccessChain 34(data) 59 37
+             274:  18(i8vec4) Load 273
+             275:  60(i8vec3) VectorShuffle 274 274 0 1 2
+             276:  60(i8vec3) GroupNonUniformIAdd 42 InclusiveScan 275
+             277:     39(ptr) AccessChain 34(data) 272 37 38
+             278:  17(int8_t) CompositeExtract 276 0
+                              Store 277 278
+             279:     39(ptr) AccessChain 34(data) 272 37 55
+             280:  17(int8_t) CompositeExtract 276 1
+                              Store 279 280
+             281:     39(ptr) AccessChain 34(data) 272 37 69
+             282:  17(int8_t) CompositeExtract 276 2
+                              Store 281 282
+             283:      6(int) Load 8(invocation)
+             284:     48(ptr) AccessChain 34(data) 73 37
+             285:  18(i8vec4) Load 284
+             286:  18(i8vec4) GroupNonUniformIAdd 42 InclusiveScan 285
+             287:     48(ptr) AccessChain 34(data) 283 37
+                              Store 287 286
+             288:      6(int) Load 8(invocation)
+             289:     39(ptr) AccessChain 34(data) 37 37 38
+             290:  17(int8_t) Load 289
+             291:  17(int8_t) GroupNonUniformIMul 42 InclusiveScan 290
+             292:     39(ptr) AccessChain 34(data) 288 37 38
+                              Store 292 291
              293:      6(int) Load 8(invocation)
-             294:     48(ptr) AccessChain 34(data) 57 37
+             294:     48(ptr) AccessChain 34(data) 46 37
              295:  18(i8vec4) Load 294
-             296:  58(i8vec3) VectorShuffle 295 295 0 1 2
-             297:  58(i8vec3) GroupNonUniformSMin 42 InclusiveScan 296
-             298:     48(ptr) AccessChain 34(data) 293 37
-             299:  18(i8vec4) Load 298
-             300:  18(i8vec4) VectorShuffle 299 297 4 5 6 3
-                              Store 298 300
-             301:      6(int) Load 8(invocation)
-             302:     48(ptr) AccessChain 34(data) 67 37
-             303:  18(i8vec4) Load 302
-             304:  18(i8vec4) GroupNonUniformSMin 42 InclusiveScan 303
-             305:     48(ptr) AccessChain 34(data) 301 37
-                              Store 305 304
-             306:      6(int) Load 8(invocation)
-             307:     39(ptr) AccessChain 34(data) 37 37 38
-             308:  17(int8_t) Load 307
-             309:  17(int8_t) GroupNonUniformSMax 42 InclusiveScan 308
-             310:     39(ptr) AccessChain 34(data) 306 37 38
-                              Store 310 309
-             311:      6(int) Load 8(invocation)
-             312:     48(ptr) AccessChain 34(data) 46 37
-             313:  18(i8vec4) Load 312
-             314:  47(i8vec2) VectorShuffle 313 313 0 1
-             315:  47(i8vec2) GroupNonUniformSMax 42 InclusiveScan 314
-             316:     48(ptr) AccessChain 34(data) 311 37
-             317:  18(i8vec4) Load 316
-             318:  18(i8vec4) VectorShuffle 317 315 4 5 2 3
-                              Store 316 318
-             319:      6(int) Load 8(invocation)
-             320:     48(ptr) AccessChain 34(data) 57 37
-             321:  18(i8vec4) Load 320
-             322:  58(i8vec3) VectorShuffle 321 321 0 1 2
-             323:  58(i8vec3) GroupNonUniformSMax 42 InclusiveScan 322
-             324:     48(ptr) AccessChain 34(data) 319 37
+             296:  47(i8vec2) VectorShuffle 295 295 0 1
+             297:  47(i8vec2) GroupNonUniformIMul 42 InclusiveScan 296
+             298:     39(ptr) AccessChain 34(data) 293 37 38
+             299:  17(int8_t) CompositeExtract 297 0
+                              Store 298 299
+             300:     39(ptr) AccessChain 34(data) 293 37 55
+             301:  17(int8_t) CompositeExtract 297 1
+                              Store 300 301
+             302:      6(int) Load 8(invocation)
+             303:     48(ptr) AccessChain 34(data) 59 37
+             304:  18(i8vec4) Load 303
+             305:  60(i8vec3) VectorShuffle 304 304 0 1 2
+             306:  60(i8vec3) GroupNonUniformIMul 42 InclusiveScan 305
+             307:     39(ptr) AccessChain 34(data) 302 37 38
+             308:  17(int8_t) CompositeExtract 306 0
+                              Store 307 308
+             309:     39(ptr) AccessChain 34(data) 302 37 55
+             310:  17(int8_t) CompositeExtract 306 1
+                              Store 309 310
+             311:     39(ptr) AccessChain 34(data) 302 37 69
+             312:  17(int8_t) CompositeExtract 306 2
+                              Store 311 312
+             313:      6(int) Load 8(invocation)
+             314:     48(ptr) AccessChain 34(data) 73 37
+             315:  18(i8vec4) Load 314
+             316:  18(i8vec4) GroupNonUniformIMul 42 InclusiveScan 315
+             317:     48(ptr) AccessChain 34(data) 313 37
+                              Store 317 316
+             318:      6(int) Load 8(invocation)
+             319:     39(ptr) AccessChain 34(data) 37 37 38
+             320:  17(int8_t) Load 319
+             321:  17(int8_t) GroupNonUniformSMin 42 InclusiveScan 320
+             322:     39(ptr) AccessChain 34(data) 318 37 38
+                              Store 322 321
+             323:      6(int) Load 8(invocation)
+             324:     48(ptr) AccessChain 34(data) 46 37
              325:  18(i8vec4) Load 324
-             326:  18(i8vec4) VectorShuffle 325 323 4 5 6 3
-                              Store 324 326
-             327:      6(int) Load 8(invocation)
-             328:     48(ptr) AccessChain 34(data) 67 37
-             329:  18(i8vec4) Load 328
-             330:  18(i8vec4) GroupNonUniformSMax 42 InclusiveScan 329
-             331:     48(ptr) AccessChain 34(data) 327 37
-                              Store 331 330
+             326:  47(i8vec2) VectorShuffle 325 325 0 1
+             327:  47(i8vec2) GroupNonUniformSMin 42 InclusiveScan 326
+             328:     39(ptr) AccessChain 34(data) 323 37 38
+             329:  17(int8_t) CompositeExtract 327 0
+                              Store 328 329
+             330:     39(ptr) AccessChain 34(data) 323 37 55
+             331:  17(int8_t) CompositeExtract 327 1
+                              Store 330 331
              332:      6(int) Load 8(invocation)
-             333:     39(ptr) AccessChain 34(data) 37 37 38
-             334:  17(int8_t) Load 333
-             335:  17(int8_t) GroupNonUniformBitwiseAnd 42 InclusiveScan 334
-             336:     39(ptr) AccessChain 34(data) 332 37 38
-                              Store 336 335
-             337:      6(int) Load 8(invocation)
-             338:     48(ptr) AccessChain 34(data) 46 37
-             339:  18(i8vec4) Load 338
-             340:  47(i8vec2) VectorShuffle 339 339 0 1
-             341:  47(i8vec2) GroupNonUniformBitwiseAnd 42 InclusiveScan 340
-             342:     48(ptr) AccessChain 34(data) 337 37
-             343:  18(i8vec4) Load 342
-             344:  18(i8vec4) VectorShuffle 343 341 4 5 2 3
-                              Store 342 344
-             345:      6(int) Load 8(invocation)
-             346:     48(ptr) AccessChain 34(data) 57 37
-             347:  18(i8vec4) Load 346
-             348:  58(i8vec3) VectorShuffle 347 347 0 1 2
-             349:  58(i8vec3) GroupNonUniformBitwiseAnd 42 InclusiveScan 348
-             350:     48(ptr) AccessChain 34(data) 345 37
-             351:  18(i8vec4) Load 350
-             352:  18(i8vec4) VectorShuffle 351 349 4 5 6 3
-                              Store 350 352
+             333:     48(ptr) AccessChain 34(data) 59 37
+             334:  18(i8vec4) Load 333
+             335:  60(i8vec3) VectorShuffle 334 334 0 1 2
+             336:  60(i8vec3) GroupNonUniformSMin 42 InclusiveScan 335
+             337:     39(ptr) AccessChain 34(data) 332 37 38
+             338:  17(int8_t) CompositeExtract 336 0
+                              Store 337 338
+             339:     39(ptr) AccessChain 34(data) 332 37 55
+             340:  17(int8_t) CompositeExtract 336 1
+                              Store 339 340
+             341:     39(ptr) AccessChain 34(data) 332 37 69
+             342:  17(int8_t) CompositeExtract 336 2
+                              Store 341 342
+             343:      6(int) Load 8(invocation)
+             344:     48(ptr) AccessChain 34(data) 73 37
+             345:  18(i8vec4) Load 344
+             346:  18(i8vec4) GroupNonUniformSMin 42 InclusiveScan 345
+             347:     48(ptr) AccessChain 34(data) 343 37
+                              Store 347 346
+             348:      6(int) Load 8(invocation)
+             349:     39(ptr) AccessChain 34(data) 37 37 38
+             350:  17(int8_t) Load 349
+             351:  17(int8_t) GroupNonUniformSMax 42 InclusiveScan 350
+             352:     39(ptr) AccessChain 34(data) 348 37 38
+                              Store 352 351
              353:      6(int) Load 8(invocation)
-             354:     48(ptr) AccessChain 34(data) 67 37
+             354:     48(ptr) AccessChain 34(data) 46 37
              355:  18(i8vec4) Load 354
-             356:  18(i8vec4) GroupNonUniformBitwiseAnd 42 InclusiveScan 355
-             357:     48(ptr) AccessChain 34(data) 353 37
-                              Store 357 356
-             358:      6(int) Load 8(invocation)
-             359:     39(ptr) AccessChain 34(data) 37 37 38
-             360:  17(int8_t) Load 359
-             361:  17(int8_t) GroupNonUniformBitwiseOr 42 InclusiveScan 360
-             362:     39(ptr) AccessChain 34(data) 358 37 38
-                              Store 362 361
-             363:      6(int) Load 8(invocation)
-             364:     48(ptr) AccessChain 34(data) 46 37
-             365:  18(i8vec4) Load 364
-             366:  47(i8vec2) VectorShuffle 365 365 0 1
-             367:  47(i8vec2) GroupNonUniformBitwiseOr 42 InclusiveScan 366
-             368:     48(ptr) AccessChain 34(data) 363 37
-             369:  18(i8vec4) Load 368
-             370:  18(i8vec4) VectorShuffle 369 367 4 5 2 3
-                              Store 368 370
-             371:      6(int) Load 8(invocation)
-             372:     48(ptr) AccessChain 34(data) 57 37
-             373:  18(i8vec4) Load 372
-             374:  58(i8vec3) VectorShuffle 373 373 0 1 2
-             375:  58(i8vec3) GroupNonUniformBitwiseOr 42 InclusiveScan 374
-             376:     48(ptr) AccessChain 34(data) 371 37
-             377:  18(i8vec4) Load 376
-             378:  18(i8vec4) VectorShuffle 377 375 4 5 6 3
-                              Store 376 378
-             379:      6(int) Load 8(invocation)
-             380:     48(ptr) AccessChain 34(data) 67 37
-             381:  18(i8vec4) Load 380
-             382:  18(i8vec4) GroupNonUniformBitwiseOr 42 InclusiveScan 381
-             383:     48(ptr) AccessChain 34(data) 379 37
-                              Store 383 382
-             384:      6(int) Load 8(invocation)
-             385:     39(ptr) AccessChain 34(data) 37 37 38
-             386:  17(int8_t) Load 385
-             387:  17(int8_t) GroupNonUniformBitwiseXor 42 InclusiveScan 386
-             388:     39(ptr) AccessChain 34(data) 384 37 38
-                              Store 388 387
-             389:      6(int) Load 8(invocation)
-             390:     48(ptr) AccessChain 34(data) 46 37
-             391:  18(i8vec4) Load 390
-             392:  47(i8vec2) VectorShuffle 391 391 0 1
-             393:  47(i8vec2) GroupNonUniformBitwiseXor 42 InclusiveScan 392
-             394:     48(ptr) AccessChain 34(data) 389 37
-             395:  18(i8vec4) Load 394
-             396:  18(i8vec4) VectorShuffle 395 393 4 5 2 3
-                              Store 394 396
-             397:      6(int) Load 8(invocation)
-             398:     48(ptr) AccessChain 34(data) 57 37
-             399:  18(i8vec4) Load 398
-             400:  58(i8vec3) VectorShuffle 399 399 0 1 2
-             401:  58(i8vec3) GroupNonUniformBitwiseXor 42 InclusiveScan 400
-             402:     48(ptr) AccessChain 34(data) 397 37
-             403:  18(i8vec4) Load 402
-             404:  18(i8vec4) VectorShuffle 403 401 4 5 6 3
-                              Store 402 404
-             405:      6(int) Load 8(invocation)
-             406:     48(ptr) AccessChain 34(data) 67 37
-             407:  18(i8vec4) Load 406
-             408:  18(i8vec4) GroupNonUniformBitwiseXor 42 InclusiveScan 407
-             409:     48(ptr) AccessChain 34(data) 405 37
-                              Store 409 408
-             410:      6(int) Load 8(invocation)
-             411:     39(ptr) AccessChain 34(data) 37 37 38
-             412:  17(int8_t) Load 411
-             413:  17(int8_t) GroupNonUniformIAdd 42 ExclusiveScan 412
-             414:     39(ptr) AccessChain 34(data) 410 37 38
-                              Store 414 413
-             415:      6(int) Load 8(invocation)
-             416:     48(ptr) AccessChain 34(data) 46 37
-             417:  18(i8vec4) Load 416
-             418:  47(i8vec2) VectorShuffle 417 417 0 1
-             419:  47(i8vec2) GroupNonUniformIAdd 42 ExclusiveScan 418
-             420:     48(ptr) AccessChain 34(data) 415 37
-             421:  18(i8vec4) Load 420
-             422:  18(i8vec4) VectorShuffle 421 419 4 5 2 3
-                              Store 420 422
-             423:      6(int) Load 8(invocation)
-             424:     48(ptr) AccessChain 34(data) 57 37
-             425:  18(i8vec4) Load 424
-             426:  58(i8vec3) VectorShuffle 425 425 0 1 2
-             427:  58(i8vec3) GroupNonUniformIAdd 42 ExclusiveScan 426
-             428:     48(ptr) AccessChain 34(data) 423 37
-             429:  18(i8vec4) Load 428
-             430:  18(i8vec4) VectorShuffle 429 427 4 5 6 3
-                              Store 428 430
-             431:      6(int) Load 8(invocation)
-             432:     48(ptr) AccessChain 34(data) 67 37
-             433:  18(i8vec4) Load 432
-             434:  18(i8vec4) GroupNonUniformIAdd 42 ExclusiveScan 433
-             435:     48(ptr) AccessChain 34(data) 431 37
-                              Store 435 434
-             436:      6(int) Load 8(invocation)
-             437:     39(ptr) AccessChain 34(data) 37 37 38
-             438:  17(int8_t) Load 437
-             439:  17(int8_t) GroupNonUniformIMul 42 ExclusiveScan 438
-             440:     39(ptr) AccessChain 34(data) 436 37 38
-                              Store 440 439
-             441:      6(int) Load 8(invocation)
-             442:     48(ptr) AccessChain 34(data) 46 37
-             443:  18(i8vec4) Load 442
-             444:  47(i8vec2) VectorShuffle 443 443 0 1
-             445:  47(i8vec2) GroupNonUniformIMul 42 ExclusiveScan 444
-             446:     48(ptr) AccessChain 34(data) 441 37
-             447:  18(i8vec4) Load 446
-             448:  18(i8vec4) VectorShuffle 447 445 4 5 2 3
-                              Store 446 448
-             449:      6(int) Load 8(invocation)
-             450:     48(ptr) AccessChain 34(data) 57 37
-             451:  18(i8vec4) Load 450
-             452:  58(i8vec3) VectorShuffle 451 451 0 1 2
-             453:  58(i8vec3) GroupNonUniformIMul 42 ExclusiveScan 452
-             454:     48(ptr) AccessChain 34(data) 449 37
-             455:  18(i8vec4) Load 454
-             456:  18(i8vec4) VectorShuffle 455 453 4 5 6 3
-                              Store 454 456
-             457:      6(int) Load 8(invocation)
-             458:     48(ptr) AccessChain 34(data) 67 37
-             459:  18(i8vec4) Load 458
-             460:  18(i8vec4) GroupNonUniformIMul 42 ExclusiveScan 459
-             461:     48(ptr) AccessChain 34(data) 457 37
-                              Store 461 460
-             462:      6(int) Load 8(invocation)
-             463:     39(ptr) AccessChain 34(data) 37 37 38
-             464:  17(int8_t) Load 463
-             465:  17(int8_t) GroupNonUniformSMin 42 ExclusiveScan 464
-             466:     39(ptr) AccessChain 34(data) 462 37 38
-                              Store 466 465
-             467:      6(int) Load 8(invocation)
-             468:     48(ptr) AccessChain 34(data) 46 37
-             469:  18(i8vec4) Load 468
-             470:  47(i8vec2) VectorShuffle 469 469 0 1
-             471:  47(i8vec2) GroupNonUniformSMin 42 ExclusiveScan 470
-             472:     48(ptr) AccessChain 34(data) 467 37
-             473:  18(i8vec4) Load 472
-             474:  18(i8vec4) VectorShuffle 473 471 4 5 2 3
-                              Store 472 474
-             475:      6(int) Load 8(invocation)
-             476:     48(ptr) AccessChain 34(data) 57 37
-             477:  18(i8vec4) Load 476
-             478:  58(i8vec3) VectorShuffle 477 477 0 1 2
-             479:  58(i8vec3) GroupNonUniformSMin 42 ExclusiveScan 478
-             480:     48(ptr) AccessChain 34(data) 475 37
-             481:  18(i8vec4) Load 480
-             482:  18(i8vec4) VectorShuffle 481 479 4 5 6 3
-                              Store 480 482
-             483:      6(int) Load 8(invocation)
-             484:     48(ptr) AccessChain 34(data) 67 37
-             485:  18(i8vec4) Load 484
-             486:  18(i8vec4) GroupNonUniformSMin 42 ExclusiveScan 485
-             487:     48(ptr) AccessChain 34(data) 483 37
-                              Store 487 486
-             488:      6(int) Load 8(invocation)
-             489:     39(ptr) AccessChain 34(data) 37 37 38
-             490:  17(int8_t) Load 489
-             491:  17(int8_t) GroupNonUniformSMax 42 ExclusiveScan 490
-             492:     39(ptr) AccessChain 34(data) 488 37 38
-                              Store 492 491
+             356:  47(i8vec2) VectorShuffle 355 355 0 1
+             357:  47(i8vec2) GroupNonUniformSMax 42 InclusiveScan 356
+             358:     39(ptr) AccessChain 34(data) 353 37 38
+             359:  17(int8_t) CompositeExtract 357 0
+                              Store 358 359
+             360:     39(ptr) AccessChain 34(data) 353 37 55
+             361:  17(int8_t) CompositeExtract 357 1
+                              Store 360 361
+             362:      6(int) Load 8(invocation)
+             363:     48(ptr) AccessChain 34(data) 59 37
+             364:  18(i8vec4) Load 363
+             365:  60(i8vec3) VectorShuffle 364 364 0 1 2
+             366:  60(i8vec3) GroupNonUniformSMax 42 InclusiveScan 365
+             367:     39(ptr) AccessChain 34(data) 362 37 38
+             368:  17(int8_t) CompositeExtract 366 0
+                              Store 367 368
+             369:     39(ptr) AccessChain 34(data) 362 37 55
+             370:  17(int8_t) CompositeExtract 366 1
+                              Store 369 370
+             371:     39(ptr) AccessChain 34(data) 362 37 69
+             372:  17(int8_t) CompositeExtract 366 2
+                              Store 371 372
+             373:      6(int) Load 8(invocation)
+             374:     48(ptr) AccessChain 34(data) 73 37
+             375:  18(i8vec4) Load 374
+             376:  18(i8vec4) GroupNonUniformSMax 42 InclusiveScan 375
+             377:     48(ptr) AccessChain 34(data) 373 37
+                              Store 377 376
+             378:      6(int) Load 8(invocation)
+             379:     39(ptr) AccessChain 34(data) 37 37 38
+             380:  17(int8_t) Load 379
+             381:  17(int8_t) GroupNonUniformBitwiseAnd 42 InclusiveScan 380
+             382:     39(ptr) AccessChain 34(data) 378 37 38
+                              Store 382 381
+             383:      6(int) Load 8(invocation)
+             384:     48(ptr) AccessChain 34(data) 46 37
+             385:  18(i8vec4) Load 384
+             386:  47(i8vec2) VectorShuffle 385 385 0 1
+             387:  47(i8vec2) GroupNonUniformBitwiseAnd 42 InclusiveScan 386
+             388:     39(ptr) AccessChain 34(data) 383 37 38
+             389:  17(int8_t) CompositeExtract 387 0
+                              Store 388 389
+             390:     39(ptr) AccessChain 34(data) 383 37 55
+             391:  17(int8_t) CompositeExtract 387 1
+                              Store 390 391
+             392:      6(int) Load 8(invocation)
+             393:     48(ptr) AccessChain 34(data) 59 37
+             394:  18(i8vec4) Load 393
+             395:  60(i8vec3) VectorShuffle 394 394 0 1 2
+             396:  60(i8vec3) GroupNonUniformBitwiseAnd 42 InclusiveScan 395
+             397:     39(ptr) AccessChain 34(data) 392 37 38
+             398:  17(int8_t) CompositeExtract 396 0
+                              Store 397 398
+             399:     39(ptr) AccessChain 34(data) 392 37 55
+             400:  17(int8_t) CompositeExtract 396 1
+                              Store 399 400
+             401:     39(ptr) AccessChain 34(data) 392 37 69
+             402:  17(int8_t) CompositeExtract 396 2
+                              Store 401 402
+             403:      6(int) Load 8(invocation)
+             404:     48(ptr) AccessChain 34(data) 73 37
+             405:  18(i8vec4) Load 404
+             406:  18(i8vec4) GroupNonUniformBitwiseAnd 42 InclusiveScan 405
+             407:     48(ptr) AccessChain 34(data) 403 37
+                              Store 407 406
+             408:      6(int) Load 8(invocation)
+             409:     39(ptr) AccessChain 34(data) 37 37 38
+             410:  17(int8_t) Load 409
+             411:  17(int8_t) GroupNonUniformBitwiseOr 42 InclusiveScan 410
+             412:     39(ptr) AccessChain 34(data) 408 37 38
+                              Store 412 411
+             413:      6(int) Load 8(invocation)
+             414:     48(ptr) AccessChain 34(data) 46 37
+             415:  18(i8vec4) Load 414
+             416:  47(i8vec2) VectorShuffle 415 415 0 1
+             417:  47(i8vec2) GroupNonUniformBitwiseOr 42 InclusiveScan 416
+             418:     39(ptr) AccessChain 34(data) 413 37 38
+             419:  17(int8_t) CompositeExtract 417 0
+                              Store 418 419
+             420:     39(ptr) AccessChain 34(data) 413 37 55
+             421:  17(int8_t) CompositeExtract 417 1
+                              Store 420 421
+             422:      6(int) Load 8(invocation)
+             423:     48(ptr) AccessChain 34(data) 59 37
+             424:  18(i8vec4) Load 423
+             425:  60(i8vec3) VectorShuffle 424 424 0 1 2
+             426:  60(i8vec3) GroupNonUniformBitwiseOr 42 InclusiveScan 425
+             427:     39(ptr) AccessChain 34(data) 422 37 38
+             428:  17(int8_t) CompositeExtract 426 0
+                              Store 427 428
+             429:     39(ptr) AccessChain 34(data) 422 37 55
+             430:  17(int8_t) CompositeExtract 426 1
+                              Store 429 430
+             431:     39(ptr) AccessChain 34(data) 422 37 69
+             432:  17(int8_t) CompositeExtract 426 2
+                              Store 431 432
+             433:      6(int) Load 8(invocation)
+             434:     48(ptr) AccessChain 34(data) 73 37
+             435:  18(i8vec4) Load 434
+             436:  18(i8vec4) GroupNonUniformBitwiseOr 42 InclusiveScan 435
+             437:     48(ptr) AccessChain 34(data) 433 37
+                              Store 437 436
+             438:      6(int) Load 8(invocation)
+             439:     39(ptr) AccessChain 34(data) 37 37 38
+             440:  17(int8_t) Load 439
+             441:  17(int8_t) GroupNonUniformBitwiseXor 42 InclusiveScan 440
+             442:     39(ptr) AccessChain 34(data) 438 37 38
+                              Store 442 441
+             443:      6(int) Load 8(invocation)
+             444:     48(ptr) AccessChain 34(data) 46 37
+             445:  18(i8vec4) Load 444
+             446:  47(i8vec2) VectorShuffle 445 445 0 1
+             447:  47(i8vec2) GroupNonUniformBitwiseXor 42 InclusiveScan 446
+             448:     39(ptr) AccessChain 34(data) 443 37 38
+             449:  17(int8_t) CompositeExtract 447 0
+                              Store 448 449
+             450:     39(ptr) AccessChain 34(data) 443 37 55
+             451:  17(int8_t) CompositeExtract 447 1
+                              Store 450 451
+             452:      6(int) Load 8(invocation)
+             453:     48(ptr) AccessChain 34(data) 59 37
+             454:  18(i8vec4) Load 453
+             455:  60(i8vec3) VectorShuffle 454 454 0 1 2
+             456:  60(i8vec3) GroupNonUniformBitwiseXor 42 InclusiveScan 455
+             457:     39(ptr) AccessChain 34(data) 452 37 38
+             458:  17(int8_t) CompositeExtract 456 0
+                              Store 457 458
+             459:     39(ptr) AccessChain 34(data) 452 37 55
+             460:  17(int8_t) CompositeExtract 456 1
+                              Store 459 460
+             461:     39(ptr) AccessChain 34(data) 452 37 69
+             462:  17(int8_t) CompositeExtract 456 2
+                              Store 461 462
+             463:      6(int) Load 8(invocation)
+             464:     48(ptr) AccessChain 34(data) 73 37
+             465:  18(i8vec4) Load 464
+             466:  18(i8vec4) GroupNonUniformBitwiseXor 42 InclusiveScan 465
+             467:     48(ptr) AccessChain 34(data) 463 37
+                              Store 467 466
+             468:      6(int) Load 8(invocation)
+             469:     39(ptr) AccessChain 34(data) 37 37 38
+             470:  17(int8_t) Load 469
+             471:  17(int8_t) GroupNonUniformIAdd 42 ExclusiveScan 470
+             472:     39(ptr) AccessChain 34(data) 468 37 38
+                              Store 472 471
+             473:      6(int) Load 8(invocation)
+             474:     48(ptr) AccessChain 34(data) 46 37
+             475:  18(i8vec4) Load 474
+             476:  47(i8vec2) VectorShuffle 475 475 0 1
+             477:  47(i8vec2) GroupNonUniformIAdd 42 ExclusiveScan 476
+             478:     39(ptr) AccessChain 34(data) 473 37 38
+             479:  17(int8_t) CompositeExtract 477 0
+                              Store 478 479
+             480:     39(ptr) AccessChain 34(data) 473 37 55
+             481:  17(int8_t) CompositeExtract 477 1
+                              Store 480 481
+             482:      6(int) Load 8(invocation)
+             483:     48(ptr) AccessChain 34(data) 59 37
+             484:  18(i8vec4) Load 483
+             485:  60(i8vec3) VectorShuffle 484 484 0 1 2
+             486:  60(i8vec3) GroupNonUniformIAdd 42 ExclusiveScan 485
+             487:     39(ptr) AccessChain 34(data) 482 37 38
+             488:  17(int8_t) CompositeExtract 486 0
+                              Store 487 488
+             489:     39(ptr) AccessChain 34(data) 482 37 55
+             490:  17(int8_t) CompositeExtract 486 1
+                              Store 489 490
+             491:     39(ptr) AccessChain 34(data) 482 37 69
+             492:  17(int8_t) CompositeExtract 486 2
+                              Store 491 492
              493:      6(int) Load 8(invocation)
-             494:     48(ptr) AccessChain 34(data) 46 37
+             494:     48(ptr) AccessChain 34(data) 73 37
              495:  18(i8vec4) Load 494
-             496:  47(i8vec2) VectorShuffle 495 495 0 1
-             497:  47(i8vec2) GroupNonUniformSMax 42 ExclusiveScan 496
-             498:     48(ptr) AccessChain 34(data) 493 37
-             499:  18(i8vec4) Load 498
-             500:  18(i8vec4) VectorShuffle 499 497 4 5 2 3
-                              Store 498 500
-             501:      6(int) Load 8(invocation)
-             502:     48(ptr) AccessChain 34(data) 57 37
-             503:  18(i8vec4) Load 502
-             504:  58(i8vec3) VectorShuffle 503 503 0 1 2
-             505:  58(i8vec3) GroupNonUniformSMax 42 ExclusiveScan 504
-             506:     48(ptr) AccessChain 34(data) 501 37
-             507:  18(i8vec4) Load 506
-             508:  18(i8vec4) VectorShuffle 507 505 4 5 6 3
-                              Store 506 508
-             509:      6(int) Load 8(invocation)
-             510:     48(ptr) AccessChain 34(data) 67 37
-             511:  18(i8vec4) Load 510
-             512:  18(i8vec4) GroupNonUniformSMax 42 ExclusiveScan 511
-             513:     48(ptr) AccessChain 34(data) 509 37
-                              Store 513 512
-             514:      6(int) Load 8(invocation)
-             515:     39(ptr) AccessChain 34(data) 37 37 38
-             516:  17(int8_t) Load 515
-             517:  17(int8_t) GroupNonUniformBitwiseAnd 42 ExclusiveScan 516
-             518:     39(ptr) AccessChain 34(data) 514 37 38
-                              Store 518 517
-             519:      6(int) Load 8(invocation)
-             520:     48(ptr) AccessChain 34(data) 46 37
-             521:  18(i8vec4) Load 520
-             522:  47(i8vec2) VectorShuffle 521 521 0 1
-             523:  47(i8vec2) GroupNonUniformBitwiseAnd 42 ExclusiveScan 522
-             524:     48(ptr) AccessChain 34(data) 519 37
+             496:  18(i8vec4) GroupNonUniformIAdd 42 ExclusiveScan 495
+             497:     48(ptr) AccessChain 34(data) 493 37
+                              Store 497 496
+             498:      6(int) Load 8(invocation)
+             499:     39(ptr) AccessChain 34(data) 37 37 38
+             500:  17(int8_t) Load 499
+             501:  17(int8_t) GroupNonUniformIMul 42 ExclusiveScan 500
+             502:     39(ptr) AccessChain 34(data) 498 37 38
+                              Store 502 501
+             503:      6(int) Load 8(invocation)
+             504:     48(ptr) AccessChain 34(data) 46 37
+             505:  18(i8vec4) Load 504
+             506:  47(i8vec2) VectorShuffle 505 505 0 1
+             507:  47(i8vec2) GroupNonUniformIMul 42 ExclusiveScan 506
+             508:     39(ptr) AccessChain 34(data) 503 37 38
+             509:  17(int8_t) CompositeExtract 507 0
+                              Store 508 509
+             510:     39(ptr) AccessChain 34(data) 503 37 55
+             511:  17(int8_t) CompositeExtract 507 1
+                              Store 510 511
+             512:      6(int) Load 8(invocation)
+             513:     48(ptr) AccessChain 34(data) 59 37
+             514:  18(i8vec4) Load 513
+             515:  60(i8vec3) VectorShuffle 514 514 0 1 2
+             516:  60(i8vec3) GroupNonUniformIMul 42 ExclusiveScan 515
+             517:     39(ptr) AccessChain 34(data) 512 37 38
+             518:  17(int8_t) CompositeExtract 516 0
+                              Store 517 518
+             519:     39(ptr) AccessChain 34(data) 512 37 55
+             520:  17(int8_t) CompositeExtract 516 1
+                              Store 519 520
+             521:     39(ptr) AccessChain 34(data) 512 37 69
+             522:  17(int8_t) CompositeExtract 516 2
+                              Store 521 522
+             523:      6(int) Load 8(invocation)
+             524:     48(ptr) AccessChain 34(data) 73 37
              525:  18(i8vec4) Load 524
-             526:  18(i8vec4) VectorShuffle 525 523 4 5 2 3
-                              Store 524 526
-             527:      6(int) Load 8(invocation)
-             528:     48(ptr) AccessChain 34(data) 57 37
-             529:  18(i8vec4) Load 528
-             530:  58(i8vec3) VectorShuffle 529 529 0 1 2
-             531:  58(i8vec3) GroupNonUniformBitwiseAnd 42 ExclusiveScan 530
-             532:     48(ptr) AccessChain 34(data) 527 37
-             533:  18(i8vec4) Load 532
-             534:  18(i8vec4) VectorShuffle 533 531 4 5 6 3
-                              Store 532 534
-             535:      6(int) Load 8(invocation)
-             536:     48(ptr) AccessChain 34(data) 67 37
-             537:  18(i8vec4) Load 536
-             538:  18(i8vec4) GroupNonUniformBitwiseAnd 42 ExclusiveScan 537
-             539:     48(ptr) AccessChain 34(data) 535 37
-                              Store 539 538
-             540:      6(int) Load 8(invocation)
-             541:     39(ptr) AccessChain 34(data) 37 37 38
-             542:  17(int8_t) Load 541
-             543:  17(int8_t) GroupNonUniformBitwiseOr 42 ExclusiveScan 542
-             544:     39(ptr) AccessChain 34(data) 540 37 38
-                              Store 544 543
-             545:      6(int) Load 8(invocation)
-             546:     48(ptr) AccessChain 34(data) 46 37
-             547:  18(i8vec4) Load 546
-             548:  47(i8vec2) VectorShuffle 547 547 0 1
-             549:  47(i8vec2) GroupNonUniformBitwiseOr 42 ExclusiveScan 548
-             550:     48(ptr) AccessChain 34(data) 545 37
-             551:  18(i8vec4) Load 550
-             552:  18(i8vec4) VectorShuffle 551 549 4 5 2 3
-                              Store 550 552
+             526:  18(i8vec4) GroupNonUniformIMul 42 ExclusiveScan 525
+             527:     48(ptr) AccessChain 34(data) 523 37
+                              Store 527 526
+             528:      6(int) Load 8(invocation)
+             529:     39(ptr) AccessChain 34(data) 37 37 38
+             530:  17(int8_t) Load 529
+             531:  17(int8_t) GroupNonUniformSMin 42 ExclusiveScan 530
+             532:     39(ptr) AccessChain 34(data) 528 37 38
+                              Store 532 531
+             533:      6(int) Load 8(invocation)
+             534:     48(ptr) AccessChain 34(data) 46 37
+             535:  18(i8vec4) Load 534
+             536:  47(i8vec2) VectorShuffle 535 535 0 1
+             537:  47(i8vec2) GroupNonUniformSMin 42 ExclusiveScan 536
+             538:     39(ptr) AccessChain 34(data) 533 37 38
+             539:  17(int8_t) CompositeExtract 537 0
+                              Store 538 539
+             540:     39(ptr) AccessChain 34(data) 533 37 55
+             541:  17(int8_t) CompositeExtract 537 1
+                              Store 540 541
+             542:      6(int) Load 8(invocation)
+             543:     48(ptr) AccessChain 34(data) 59 37
+             544:  18(i8vec4) Load 543
+             545:  60(i8vec3) VectorShuffle 544 544 0 1 2
+             546:  60(i8vec3) GroupNonUniformSMin 42 ExclusiveScan 545
+             547:     39(ptr) AccessChain 34(data) 542 37 38
+             548:  17(int8_t) CompositeExtract 546 0
+                              Store 547 548
+             549:     39(ptr) AccessChain 34(data) 542 37 55
+             550:  17(int8_t) CompositeExtract 546 1
+                              Store 549 550
+             551:     39(ptr) AccessChain 34(data) 542 37 69
+             552:  17(int8_t) CompositeExtract 546 2
+                              Store 551 552
              553:      6(int) Load 8(invocation)
-             554:     48(ptr) AccessChain 34(data) 57 37
+             554:     48(ptr) AccessChain 34(data) 73 37
              555:  18(i8vec4) Load 554
-             556:  58(i8vec3) VectorShuffle 555 555 0 1 2
-             557:  58(i8vec3) GroupNonUniformBitwiseOr 42 ExclusiveScan 556
-             558:     48(ptr) AccessChain 34(data) 553 37
-             559:  18(i8vec4) Load 558
-             560:  18(i8vec4) VectorShuffle 559 557 4 5 6 3
-                              Store 558 560
-             561:      6(int) Load 8(invocation)
-             562:     48(ptr) AccessChain 34(data) 67 37
-             563:  18(i8vec4) Load 562
-             564:  18(i8vec4) GroupNonUniformBitwiseOr 42 ExclusiveScan 563
-             565:     48(ptr) AccessChain 34(data) 561 37
-                              Store 565 564
-             566:      6(int) Load 8(invocation)
-             567:     39(ptr) AccessChain 34(data) 37 37 38
-             568:  17(int8_t) Load 567
-             569:  17(int8_t) GroupNonUniformBitwiseXor 42 ExclusiveScan 568
-             570:     39(ptr) AccessChain 34(data) 566 37 38
-                              Store 570 569
-             571:      6(int) Load 8(invocation)
-             572:     48(ptr) AccessChain 34(data) 46 37
-             573:  18(i8vec4) Load 572
-             574:  47(i8vec2) VectorShuffle 573 573 0 1
-             575:  47(i8vec2) GroupNonUniformBitwiseXor 42 ExclusiveScan 574
-             576:     48(ptr) AccessChain 34(data) 571 37
-             577:  18(i8vec4) Load 576
-             578:  18(i8vec4) VectorShuffle 577 575 4 5 2 3
-                              Store 576 578
-             579:      6(int) Load 8(invocation)
-             580:     48(ptr) AccessChain 34(data) 57 37
-             581:  18(i8vec4) Load 580
-             582:  58(i8vec3) VectorShuffle 581 581 0 1 2
-             583:  58(i8vec3) GroupNonUniformBitwiseXor 42 ExclusiveScan 582
-             584:     48(ptr) AccessChain 34(data) 579 37
+             556:  18(i8vec4) GroupNonUniformSMin 42 ExclusiveScan 555
+             557:     48(ptr) AccessChain 34(data) 553 37
+                              Store 557 556
+             558:      6(int) Load 8(invocation)
+             559:     39(ptr) AccessChain 34(data) 37 37 38
+             560:  17(int8_t) Load 559
+             561:  17(int8_t) GroupNonUniformSMax 42 ExclusiveScan 560
+             562:     39(ptr) AccessChain 34(data) 558 37 38
+                              Store 562 561
+             563:      6(int) Load 8(invocation)
+             564:     48(ptr) AccessChain 34(data) 46 37
+             565:  18(i8vec4) Load 564
+             566:  47(i8vec2) VectorShuffle 565 565 0 1
+             567:  47(i8vec2) GroupNonUniformSMax 42 ExclusiveScan 566
+             568:     39(ptr) AccessChain 34(data) 563 37 38
+             569:  17(int8_t) CompositeExtract 567 0
+                              Store 568 569
+             570:     39(ptr) AccessChain 34(data) 563 37 55
+             571:  17(int8_t) CompositeExtract 567 1
+                              Store 570 571
+             572:      6(int) Load 8(invocation)
+             573:     48(ptr) AccessChain 34(data) 59 37
+             574:  18(i8vec4) Load 573
+             575:  60(i8vec3) VectorShuffle 574 574 0 1 2
+             576:  60(i8vec3) GroupNonUniformSMax 42 ExclusiveScan 575
+             577:     39(ptr) AccessChain 34(data) 572 37 38
+             578:  17(int8_t) CompositeExtract 576 0
+                              Store 577 578
+             579:     39(ptr) AccessChain 34(data) 572 37 55
+             580:  17(int8_t) CompositeExtract 576 1
+                              Store 579 580
+             581:     39(ptr) AccessChain 34(data) 572 37 69
+             582:  17(int8_t) CompositeExtract 576 2
+                              Store 581 582
+             583:      6(int) Load 8(invocation)
+             584:     48(ptr) AccessChain 34(data) 73 37
              585:  18(i8vec4) Load 584
-             586:  18(i8vec4) VectorShuffle 585 583 4 5 6 3
-                              Store 584 586
-             587:      6(int) Load 8(invocation)
-             588:     48(ptr) AccessChain 34(data) 67 37
-             589:  18(i8vec4) Load 588
-             590:  18(i8vec4) GroupNonUniformBitwiseXor 42 ExclusiveScan 589
-             591:     48(ptr) AccessChain 34(data) 587 37
-                              Store 591 590
-             592:      6(int) Load 8(invocation)
-             594:    593(ptr) AccessChain 34(data) 37 46 38
-             595:  19(int8_t) Load 594
-             596:  19(int8_t) GroupNonUniformIAdd 42 Reduce 595
-             597:    593(ptr) AccessChain 34(data) 592 46 38
-                              Store 597 596
-             598:      6(int) Load 8(invocation)
-             601:    600(ptr) AccessChain 34(data) 46 46
-             602:  20(i8vec4) Load 601
-             603: 599(i8vec2) VectorShuffle 602 602 0 1
-             604: 599(i8vec2) GroupNonUniformIAdd 42 Reduce 603
-             605:    600(ptr) AccessChain 34(data) 598 46
-             606:  20(i8vec4) Load 605
-             607:  20(i8vec4) VectorShuffle 606 604 4 5 2 3
-                              Store 605 607
-             608:      6(int) Load 8(invocation)
-             610:    600(ptr) AccessChain 34(data) 57 46
-             611:  20(i8vec4) Load 610
-             612: 609(i8vec3) VectorShuffle 611 611 0 1 2
-             613: 609(i8vec3) GroupNonUniformIAdd 42 Reduce 612
-             614:    600(ptr) AccessChain 34(data) 608 46
-             615:  20(i8vec4) Load 614
-             616:  20(i8vec4) VectorShuffle 615 613 4 5 6 3
-                              Store 614 616
-             617:      6(int) Load 8(invocation)
-             618:    600(ptr) AccessChain 34(data) 67 46
-             619:  20(i8vec4) Load 618
-             620:  20(i8vec4) GroupNonUniformIAdd 42 Reduce 619
-             621:    600(ptr) AccessChain 34(data) 617 46
-                              Store 621 620
-             622:      6(int) Load 8(invocation)
-             623:    593(ptr) AccessChain 34(data) 37 46 38
-             624:  19(int8_t) Load 623
-             625:  19(int8_t) GroupNonUniformIMul 42 Reduce 624
-             626:    593(ptr) AccessChain 34(data) 622 46 38
-                              Store 626 625
-             627:      6(int) Load 8(invocation)
-             628:    600(ptr) AccessChain 34(data) 46 46
-             629:  20(i8vec4) Load 628
-             630: 599(i8vec2) VectorShuffle 629 629 0 1
-             631: 599(i8vec2) GroupNonUniformIMul 42 Reduce 630
-             632:    600(ptr) AccessChain 34(data) 627 46
-             633:  20(i8vec4) Load 632
-             634:  20(i8vec4) VectorShuffle 633 631 4 5 2 3
-                              Store 632 634
-             635:      6(int) Load 8(invocation)
-             636:    600(ptr) AccessChain 34(data) 57 46
-             637:  20(i8vec4) Load 636
-             638: 609(i8vec3) VectorShuffle 637 637 0 1 2
-             639: 609(i8vec3) GroupNonUniformIMul 42 Reduce 638
-             640:    600(ptr) AccessChain 34(data) 635 46
-             641:  20(i8vec4) Load 640
-             642:  20(i8vec4) VectorShuffle 641 639 4 5 6 3
-                              Store 640 642
+             586:  18(i8vec4) GroupNonUniformSMax 42 ExclusiveScan 585
+             587:     48(ptr) AccessChain 34(data) 583 37
+                              Store 587 586
+             588:      6(int) Load 8(invocation)
+             589:     39(ptr) AccessChain 34(data) 37 37 38
+             590:  17(int8_t) Load 589
+             591:  17(int8_t) GroupNonUniformBitwiseAnd 42 ExclusiveScan 590
+             592:     39(ptr) AccessChain 34(data) 588 37 38
+                              Store 592 591
+             593:      6(int) Load 8(invocation)
+             594:     48(ptr) AccessChain 34(data) 46 37
+             595:  18(i8vec4) Load 594
+             596:  47(i8vec2) VectorShuffle 595 595 0 1
+             597:  47(i8vec2) GroupNonUniformBitwiseAnd 42 ExclusiveScan 596
+             598:     39(ptr) AccessChain 34(data) 593 37 38
+             599:  17(int8_t) CompositeExtract 597 0
+                              Store 598 599
+             600:     39(ptr) AccessChain 34(data) 593 37 55
+             601:  17(int8_t) CompositeExtract 597 1
+                              Store 600 601
+             602:      6(int) Load 8(invocation)
+             603:     48(ptr) AccessChain 34(data) 59 37
+             604:  18(i8vec4) Load 603
+             605:  60(i8vec3) VectorShuffle 604 604 0 1 2
+             606:  60(i8vec3) GroupNonUniformBitwiseAnd 42 ExclusiveScan 605
+             607:     39(ptr) AccessChain 34(data) 602 37 38
+             608:  17(int8_t) CompositeExtract 606 0
+                              Store 607 608
+             609:     39(ptr) AccessChain 34(data) 602 37 55
+             610:  17(int8_t) CompositeExtract 606 1
+                              Store 609 610
+             611:     39(ptr) AccessChain 34(data) 602 37 69
+             612:  17(int8_t) CompositeExtract 606 2
+                              Store 611 612
+             613:      6(int) Load 8(invocation)
+             614:     48(ptr) AccessChain 34(data) 73 37
+             615:  18(i8vec4) Load 614
+             616:  18(i8vec4) GroupNonUniformBitwiseAnd 42 ExclusiveScan 615
+             617:     48(ptr) AccessChain 34(data) 613 37
+                              Store 617 616
+             618:      6(int) Load 8(invocation)
+             619:     39(ptr) AccessChain 34(data) 37 37 38
+             620:  17(int8_t) Load 619
+             621:  17(int8_t) GroupNonUniformBitwiseOr 42 ExclusiveScan 620
+             622:     39(ptr) AccessChain 34(data) 618 37 38
+                              Store 622 621
+             623:      6(int) Load 8(invocation)
+             624:     48(ptr) AccessChain 34(data) 46 37
+             625:  18(i8vec4) Load 624
+             626:  47(i8vec2) VectorShuffle 625 625 0 1
+             627:  47(i8vec2) GroupNonUniformBitwiseOr 42 ExclusiveScan 626
+             628:     39(ptr) AccessChain 34(data) 623 37 38
+             629:  17(int8_t) CompositeExtract 627 0
+                              Store 628 629
+             630:     39(ptr) AccessChain 34(data) 623 37 55
+             631:  17(int8_t) CompositeExtract 627 1
+                              Store 630 631
+             632:      6(int) Load 8(invocation)
+             633:     48(ptr) AccessChain 34(data) 59 37
+             634:  18(i8vec4) Load 633
+             635:  60(i8vec3) VectorShuffle 634 634 0 1 2
+             636:  60(i8vec3) GroupNonUniformBitwiseOr 42 ExclusiveScan 635
+             637:     39(ptr) AccessChain 34(data) 632 37 38
+             638:  17(int8_t) CompositeExtract 636 0
+                              Store 637 638
+             639:     39(ptr) AccessChain 34(data) 632 37 55
+             640:  17(int8_t) CompositeExtract 636 1
+                              Store 639 640
+             641:     39(ptr) AccessChain 34(data) 632 37 69
+             642:  17(int8_t) CompositeExtract 636 2
+                              Store 641 642
              643:      6(int) Load 8(invocation)
-             644:    600(ptr) AccessChain 34(data) 67 46
-             645:  20(i8vec4) Load 644
-             646:  20(i8vec4) GroupNonUniformIMul 42 Reduce 645
-             647:    600(ptr) AccessChain 34(data) 643 46
+             644:     48(ptr) AccessChain 34(data) 73 37
+             645:  18(i8vec4) Load 644
+             646:  18(i8vec4) GroupNonUniformBitwiseOr 42 ExclusiveScan 645
+             647:     48(ptr) AccessChain 34(data) 643 37
                               Store 647 646
              648:      6(int) Load 8(invocation)
-             649:    593(ptr) AccessChain 34(data) 37 46 38
-             650:  19(int8_t) Load 649
-             651:  19(int8_t) GroupNonUniformUMin 42 Reduce 650
-             652:    593(ptr) AccessChain 34(data) 648 46 38
+             649:     39(ptr) AccessChain 34(data) 37 37 38
+             650:  17(int8_t) Load 649
+             651:  17(int8_t) GroupNonUniformBitwiseXor 42 ExclusiveScan 650
+             652:     39(ptr) AccessChain 34(data) 648 37 38
                               Store 652 651
              653:      6(int) Load 8(invocation)
-             654:    600(ptr) AccessChain 34(data) 46 46
-             655:  20(i8vec4) Load 654
-             656: 599(i8vec2) VectorShuffle 655 655 0 1
-             657: 599(i8vec2) GroupNonUniformUMin 42 Reduce 656
-             658:    600(ptr) AccessChain 34(data) 653 46
-             659:  20(i8vec4) Load 658
-             660:  20(i8vec4) VectorShuffle 659 657 4 5 2 3
-                              Store 658 660
-             661:      6(int) Load 8(invocation)
-             662:    600(ptr) AccessChain 34(data) 57 46
-             663:  20(i8vec4) Load 662
-             664: 609(i8vec3) VectorShuffle 663 663 0 1 2
-             665: 609(i8vec3) GroupNonUniformUMin 42 Reduce 664
-             666:    600(ptr) AccessChain 34(data) 661 46
-             667:  20(i8vec4) Load 666
-             668:  20(i8vec4) VectorShuffle 667 665 4 5 6 3
-                              Store 666 668
-             669:      6(int) Load 8(invocation)
-             670:    600(ptr) AccessChain 34(data) 67 46
-             671:  20(i8vec4) Load 670
-             672:  20(i8vec4) GroupNonUniformUMin 42 Reduce 671
-             673:    600(ptr) AccessChain 34(data) 669 46
-                              Store 673 672
-             674:      6(int) Load 8(invocation)
-             675:    593(ptr) AccessChain 34(data) 37 46 38
-             676:  19(int8_t) Load 675
-             677:  19(int8_t) GroupNonUniformUMax 42 Reduce 676
-             678:    593(ptr) AccessChain 34(data) 674 46 38
-                              Store 678 677
-             679:      6(int) Load 8(invocation)
-             680:    600(ptr) AccessChain 34(data) 46 46
-             681:  20(i8vec4) Load 680
-             682: 599(i8vec2) VectorShuffle 681 681 0 1
-             683: 599(i8vec2) GroupNonUniformUMax 42 Reduce 682
-             684:    600(ptr) AccessChain 34(data) 679 46
-             685:  20(i8vec4) Load 684
-             686:  20(i8vec4) VectorShuffle 685 683 4 5 2 3
-                              Store 684 686
-             687:      6(int) Load 8(invocation)
-             688:    600(ptr) AccessChain 34(data) 57 46
-             689:  20(i8vec4) Load 688
-             690: 609(i8vec3) VectorShuffle 689 689 0 1 2
-             691: 609(i8vec3) GroupNonUniformUMax 42 Reduce 690
-             692:    600(ptr) AccessChain 34(data) 687 46
-             693:  20(i8vec4) Load 692
-             694:  20(i8vec4) VectorShuffle 693 691 4 5 6 3
-                              Store 692 694
+             654:     48(ptr) AccessChain 34(data) 46 37
+             655:  18(i8vec4) Load 654
+             656:  47(i8vec2) VectorShuffle 655 655 0 1
+             657:  47(i8vec2) GroupNonUniformBitwiseXor 42 ExclusiveScan 656
+             658:     39(ptr) AccessChain 34(data) 653 37 38
+             659:  17(int8_t) CompositeExtract 657 0
+                              Store 658 659
+             660:     39(ptr) AccessChain 34(data) 653 37 55
+             661:  17(int8_t) CompositeExtract 657 1
+                              Store 660 661
+             662:      6(int) Load 8(invocation)
+             663:     48(ptr) AccessChain 34(data) 59 37
+             664:  18(i8vec4) Load 663
+             665:  60(i8vec3) VectorShuffle 664 664 0 1 2
+             666:  60(i8vec3) GroupNonUniformBitwiseXor 42 ExclusiveScan 665
+             667:     39(ptr) AccessChain 34(data) 662 37 38
+             668:  17(int8_t) CompositeExtract 666 0
+                              Store 667 668
+             669:     39(ptr) AccessChain 34(data) 662 37 55
+             670:  17(int8_t) CompositeExtract 666 1
+                              Store 669 670
+             671:     39(ptr) AccessChain 34(data) 662 37 69
+             672:  17(int8_t) CompositeExtract 666 2
+                              Store 671 672
+             673:      6(int) Load 8(invocation)
+             674:     48(ptr) AccessChain 34(data) 73 37
+             675:  18(i8vec4) Load 674
+             676:  18(i8vec4) GroupNonUniformBitwiseXor 42 ExclusiveScan 675
+             677:     48(ptr) AccessChain 34(data) 673 37
+                              Store 677 676
+             678:      6(int) Load 8(invocation)
+             680:    679(ptr) AccessChain 34(data) 37 46 38
+             681:  19(int8_t) Load 680
+             682:  19(int8_t) GroupNonUniformIAdd 42 Reduce 681
+             683:    679(ptr) AccessChain 34(data) 678 46 38
+                              Store 683 682
+             684:      6(int) Load 8(invocation)
+             687:    686(ptr) AccessChain 34(data) 46 46
+             688:  20(i8vec4) Load 687
+             689: 685(i8vec2) VectorShuffle 688 688 0 1
+             690: 685(i8vec2) GroupNonUniformIAdd 42 Reduce 689
+             691:    679(ptr) AccessChain 34(data) 684 46 38
+             692:  19(int8_t) CompositeExtract 690 0
+                              Store 691 692
+             693:    679(ptr) AccessChain 34(data) 684 46 55
+             694:  19(int8_t) CompositeExtract 690 1
+                              Store 693 694
              695:      6(int) Load 8(invocation)
-             696:    600(ptr) AccessChain 34(data) 67 46
-             697:  20(i8vec4) Load 696
-             698:  20(i8vec4) GroupNonUniformUMax 42 Reduce 697
-             699:    600(ptr) AccessChain 34(data) 695 46
-                              Store 699 698
-             700:      6(int) Load 8(invocation)
-             701:    593(ptr) AccessChain 34(data) 37 46 38
-             702:  19(int8_t) Load 701
-             703:  19(int8_t) GroupNonUniformBitwiseAnd 42 Reduce 702
-             704:    593(ptr) AccessChain 34(data) 700 46 38
-                              Store 704 703
-             705:      6(int) Load 8(invocation)
-             706:    600(ptr) AccessChain 34(data) 46 46
-             707:  20(i8vec4) Load 706
-             708: 599(i8vec2) VectorShuffle 707 707 0 1
-             709: 599(i8vec2) GroupNonUniformBitwiseAnd 42 Reduce 708
-             710:    600(ptr) AccessChain 34(data) 705 46
-             711:  20(i8vec4) Load 710
-             712:  20(i8vec4) VectorShuffle 711 709 4 5 2 3
-                              Store 710 712
-             713:      6(int) Load 8(invocation)
-             714:    600(ptr) AccessChain 34(data) 57 46
-             715:  20(i8vec4) Load 714
-             716: 609(i8vec3) VectorShuffle 715 715 0 1 2
-             717: 609(i8vec3) GroupNonUniformBitwiseAnd 42 Reduce 716
-             718:    600(ptr) AccessChain 34(data) 713 46
+             697:    686(ptr) AccessChain 34(data) 59 46
+             698:  20(i8vec4) Load 697
+             699: 696(i8vec3) VectorShuffle 698 698 0 1 2
+             700: 696(i8vec3) GroupNonUniformIAdd 42 Reduce 699
+             701:    679(ptr) AccessChain 34(data) 695 46 38
+             702:  19(int8_t) CompositeExtract 700 0
+                              Store 701 702
+             703:    679(ptr) AccessChain 34(data) 695 46 55
+             704:  19(int8_t) CompositeExtract 700 1
+                              Store 703 704
+             705:    679(ptr) AccessChain 34(data) 695 46 69
+             706:  19(int8_t) CompositeExtract 700 2
+                              Store 705 706
+             707:      6(int) Load 8(invocation)
+             708:    686(ptr) AccessChain 34(data) 73 46
+             709:  20(i8vec4) Load 708
+             710:  20(i8vec4) GroupNonUniformIAdd 42 Reduce 709
+             711:    686(ptr) AccessChain 34(data) 707 46
+                              Store 711 710
+             712:      6(int) Load 8(invocation)
+             713:    679(ptr) AccessChain 34(data) 37 46 38
+             714:  19(int8_t) Load 713
+             715:  19(int8_t) GroupNonUniformIMul 42 Reduce 714
+             716:    679(ptr) AccessChain 34(data) 712 46 38
+                              Store 716 715
+             717:      6(int) Load 8(invocation)
+             718:    686(ptr) AccessChain 34(data) 46 46
              719:  20(i8vec4) Load 718
-             720:  20(i8vec4) VectorShuffle 719 717 4 5 6 3
-                              Store 718 720
-             721:      6(int) Load 8(invocation)
-             722:    600(ptr) AccessChain 34(data) 67 46
-             723:  20(i8vec4) Load 722
-             724:  20(i8vec4) GroupNonUniformBitwiseAnd 42 Reduce 723
-             725:    600(ptr) AccessChain 34(data) 721 46
-                              Store 725 724
+             720: 685(i8vec2) VectorShuffle 719 719 0 1
+             721: 685(i8vec2) GroupNonUniformIMul 42 Reduce 720
+             722:    679(ptr) AccessChain 34(data) 717 46 38
+             723:  19(int8_t) CompositeExtract 721 0
+                              Store 722 723
+             724:    679(ptr) AccessChain 34(data) 717 46 55
+             725:  19(int8_t) CompositeExtract 721 1
+                              Store 724 725
              726:      6(int) Load 8(invocation)
-             727:    593(ptr) AccessChain 34(data) 37 46 38
-             728:  19(int8_t) Load 727
-             729:  19(int8_t) GroupNonUniformBitwiseOr 42 Reduce 728
-             730:    593(ptr) AccessChain 34(data) 726 46 38
-                              Store 730 729
-             731:      6(int) Load 8(invocation)
-             732:    600(ptr) AccessChain 34(data) 46 46
-             733:  20(i8vec4) Load 732
-             734: 599(i8vec2) VectorShuffle 733 733 0 1
-             735: 599(i8vec2) GroupNonUniformBitwiseOr 42 Reduce 734
-             736:    600(ptr) AccessChain 34(data) 731 46
-             737:  20(i8vec4) Load 736
-             738:  20(i8vec4) VectorShuffle 737 735 4 5 2 3
-                              Store 736 738
-             739:      6(int) Load 8(invocation)
-             740:    600(ptr) AccessChain 34(data) 57 46
-             741:  20(i8vec4) Load 740
-             742: 609(i8vec3) VectorShuffle 741 741 0 1 2
-             743: 609(i8vec3) GroupNonUniformBitwiseOr 42 Reduce 742
-             744:    600(ptr) AccessChain 34(data) 739 46
-             745:  20(i8vec4) Load 744
-             746:  20(i8vec4) VectorShuffle 745 743 4 5 6 3
-                              Store 744 746
+             727:    686(ptr) AccessChain 34(data) 59 46
+             728:  20(i8vec4) Load 727
+             729: 696(i8vec3) VectorShuffle 728 728 0 1 2
+             730: 696(i8vec3) GroupNonUniformIMul 42 Reduce 729
+             731:    679(ptr) AccessChain 34(data) 726 46 38
+             732:  19(int8_t) CompositeExtract 730 0
+                              Store 731 732
+             733:    679(ptr) AccessChain 34(data) 726 46 55
+             734:  19(int8_t) CompositeExtract 730 1
+                              Store 733 734
+             735:    679(ptr) AccessChain 34(data) 726 46 69
+             736:  19(int8_t) CompositeExtract 730 2
+                              Store 735 736
+             737:      6(int) Load 8(invocation)
+             738:    686(ptr) AccessChain 34(data) 73 46
+             739:  20(i8vec4) Load 738
+             740:  20(i8vec4) GroupNonUniformIMul 42 Reduce 739
+             741:    686(ptr) AccessChain 34(data) 737 46
+                              Store 741 740
+             742:      6(int) Load 8(invocation)
+             743:    679(ptr) AccessChain 34(data) 37 46 38
+             744:  19(int8_t) Load 743
+             745:  19(int8_t) GroupNonUniformUMin 42 Reduce 744
+             746:    679(ptr) AccessChain 34(data) 742 46 38
+                              Store 746 745
              747:      6(int) Load 8(invocation)
-             748:    600(ptr) AccessChain 34(data) 67 46
+             748:    686(ptr) AccessChain 34(data) 46 46
              749:  20(i8vec4) Load 748
-             750:  20(i8vec4) GroupNonUniformBitwiseOr 42 Reduce 749
-             751:    600(ptr) AccessChain 34(data) 747 46
-                              Store 751 750
-             752:      6(int) Load 8(invocation)
-             753:    593(ptr) AccessChain 34(data) 37 46 38
-             754:  19(int8_t) Load 753
-             755:  19(int8_t) GroupNonUniformBitwiseXor 42 Reduce 754
-             756:    593(ptr) AccessChain 34(data) 752 46 38
-                              Store 756 755
-             757:      6(int) Load 8(invocation)
-             758:    600(ptr) AccessChain 34(data) 46 46
-             759:  20(i8vec4) Load 758
-             760: 599(i8vec2) VectorShuffle 759 759 0 1
-             761: 599(i8vec2) GroupNonUniformBitwiseXor 42 Reduce 760
-             762:    600(ptr) AccessChain 34(data) 757 46
-             763:  20(i8vec4) Load 762
-             764:  20(i8vec4) VectorShuffle 763 761 4 5 2 3
-                              Store 762 764
-             765:      6(int) Load 8(invocation)
-             766:    600(ptr) AccessChain 34(data) 57 46
-             767:  20(i8vec4) Load 766
-             768: 609(i8vec3) VectorShuffle 767 767 0 1 2
-             769: 609(i8vec3) GroupNonUniformBitwiseXor 42 Reduce 768
-             770:    600(ptr) AccessChain 34(data) 765 46
-             771:  20(i8vec4) Load 770
-             772:  20(i8vec4) VectorShuffle 771 769 4 5 6 3
-                              Store 770 772
-             773:      6(int) Load 8(invocation)
-             774:    600(ptr) AccessChain 34(data) 67 46
-             775:  20(i8vec4) Load 774
-             776:  20(i8vec4) GroupNonUniformBitwiseXor 42 Reduce 775
-             777:    600(ptr) AccessChain 34(data) 773 46
-                              Store 777 776
-             778:      6(int) Load 8(invocation)
-             779:    593(ptr) AccessChain 34(data) 37 46 38
-             780:  19(int8_t) Load 779
-             781:  19(int8_t) GroupNonUniformIAdd 42 InclusiveScan 780
-             782:    593(ptr) AccessChain 34(data) 778 46 38
-                              Store 782 781
-             783:      6(int) Load 8(invocation)
-             784:    600(ptr) AccessChain 34(data) 46 46
-             785:  20(i8vec4) Load 784
-             786: 599(i8vec2) VectorShuffle 785 785 0 1
-             787: 599(i8vec2) GroupNonUniformIAdd 42 InclusiveScan 786
-             788:    600(ptr) AccessChain 34(data) 783 46
-             789:  20(i8vec4) Load 788
-             790:  20(i8vec4) VectorShuffle 789 787 4 5 2 3
-                              Store 788 790
-             791:      6(int) Load 8(invocation)
-             792:    600(ptr) AccessChain 34(data) 57 46
-             793:  20(i8vec4) Load 792
-             794: 609(i8vec3) VectorShuffle 793 793 0 1 2
-             795: 609(i8vec3) GroupNonUniformIAdd 42 InclusiveScan 794
-             796:    600(ptr) AccessChain 34(data) 791 46
-             797:  20(i8vec4) Load 796
-             798:  20(i8vec4) VectorShuffle 797 795 4 5 6 3
-                              Store 796 798
-             799:      6(int) Load 8(invocation)
-             800:    600(ptr) AccessChain 34(data) 67 46
-             801:  20(i8vec4) Load 800
-             802:  20(i8vec4) GroupNonUniformIAdd 42 InclusiveScan 801
-             803:    600(ptr) AccessChain 34(data) 799 46
-                              Store 803 802
-             804:      6(int) Load 8(invocation)
-             805:    593(ptr) AccessChain 34(data) 37 46 38
-             806:  19(int8_t) Load 805
-             807:  19(int8_t) GroupNonUniformIMul 42 InclusiveScan 806
-             808:    593(ptr) AccessChain 34(data) 804 46 38
-                              Store 808 807
-             809:      6(int) Load 8(invocation)
-             810:    600(ptr) AccessChain 34(data) 46 46
-             811:  20(i8vec4) Load 810
-             812: 599(i8vec2) VectorShuffle 811 811 0 1
-             813: 599(i8vec2) GroupNonUniformIMul 42 InclusiveScan 812
-             814:    600(ptr) AccessChain 34(data) 809 46
-             815:  20(i8vec4) Load 814
-             816:  20(i8vec4) VectorShuffle 815 813 4 5 2 3
-                              Store 814 816
-             817:      6(int) Load 8(invocation)
-             818:    600(ptr) AccessChain 34(data) 57 46
-             819:  20(i8vec4) Load 818
-             820: 609(i8vec3) VectorShuffle 819 819 0 1 2
-             821: 609(i8vec3) GroupNonUniformIMul 42 InclusiveScan 820
-             822:    600(ptr) AccessChain 34(data) 817 46
-             823:  20(i8vec4) Load 822
-             824:  20(i8vec4) VectorShuffle 823 821 4 5 6 3
-                              Store 822 824
-             825:      6(int) Load 8(invocation)
-             826:    600(ptr) AccessChain 34(data) 67 46
-             827:  20(i8vec4) Load 826
-             828:  20(i8vec4) GroupNonUniformIMul 42 InclusiveScan 827
-             829:    600(ptr) AccessChain 34(data) 825 46
-                              Store 829 828
-             830:      6(int) Load 8(invocation)
-             831:    593(ptr) AccessChain 34(data) 37 46 38
-             832:  19(int8_t) Load 831
-             833:  19(int8_t) GroupNonUniformUMin 42 InclusiveScan 832
-             834:    593(ptr) AccessChain 34(data) 830 46 38
-                              Store 834 833
-             835:      6(int) Load 8(invocation)
-             836:    600(ptr) AccessChain 34(data) 46 46
-             837:  20(i8vec4) Load 836
-             838: 599(i8vec2) VectorShuffle 837 837 0 1
-             839: 599(i8vec2) GroupNonUniformUMin 42 InclusiveScan 838
-             840:    600(ptr) AccessChain 34(data) 835 46
-             841:  20(i8vec4) Load 840
-             842:  20(i8vec4) VectorShuffle 841 839 4 5 2 3
-                              Store 840 842
-             843:      6(int) Load 8(invocation)
-             844:    600(ptr) AccessChain 34(data) 57 46
-             845:  20(i8vec4) Load 844
-             846: 609(i8vec3) VectorShuffle 845 845 0 1 2
-             847: 609(i8vec3) GroupNonUniformUMin 42 InclusiveScan 846
-             848:    600(ptr) AccessChain 34(data) 843 46
-             849:  20(i8vec4) Load 848
-             850:  20(i8vec4) VectorShuffle 849 847 4 5 6 3
-                              Store 848 850
-             851:      6(int) Load 8(invocation)
-             852:    600(ptr) AccessChain 34(data) 67 46
-             853:  20(i8vec4) Load 852
-             854:  20(i8vec4) GroupNonUniformUMin 42 InclusiveScan 853
-             855:    600(ptr) AccessChain 34(data) 851 46
-                              Store 855 854
-             856:      6(int) Load 8(invocation)
-             857:    593(ptr) AccessChain 34(data) 37 46 38
-             858:  19(int8_t) Load 857
-             859:  19(int8_t) GroupNonUniformUMax 42 InclusiveScan 858
-             860:    593(ptr) AccessChain 34(data) 856 46 38
-                              Store 860 859
-             861:      6(int) Load 8(invocation)
-             862:    600(ptr) AccessChain 34(data) 46 46
-             863:  20(i8vec4) Load 862
-             864: 599(i8vec2) VectorShuffle 863 863 0 1
-             865: 599(i8vec2) GroupNonUniformUMax 42 InclusiveScan 864
-             866:    600(ptr) AccessChain 34(data) 861 46
-             867:  20(i8vec4) Load 866
-             868:  20(i8vec4) VectorShuffle 867 865 4 5 2 3
-                              Store 866 868
-             869:      6(int) Load 8(invocation)
-             870:    600(ptr) AccessChain 34(data) 57 46
-             871:  20(i8vec4) Load 870
-             872: 609(i8vec3) VectorShuffle 871 871 0 1 2
-             873: 609(i8vec3) GroupNonUniformUMax 42 InclusiveScan 872
-             874:    600(ptr) AccessChain 34(data) 869 46
-             875:  20(i8vec4) Load 874
-             876:  20(i8vec4) VectorShuffle 875 873 4 5 6 3
-                              Store 874 876
-             877:      6(int) Load 8(invocation)
-             878:    600(ptr) AccessChain 34(data) 67 46
-             879:  20(i8vec4) Load 878
-             880:  20(i8vec4) GroupNonUniformUMax 42 InclusiveScan 879
-             881:    600(ptr) AccessChain 34(data) 877 46
-                              Store 881 880
-             882:      6(int) Load 8(invocation)
-             883:    593(ptr) AccessChain 34(data) 37 46 38
-             884:  19(int8_t) Load 883
-             885:  19(int8_t) GroupNonUniformBitwiseAnd 42 InclusiveScan 884
-             886:    593(ptr) AccessChain 34(data) 882 46 38
-                              Store 886 885
+             750: 685(i8vec2) VectorShuffle 749 749 0 1
+             751: 685(i8vec2) GroupNonUniformUMin 42 Reduce 750
+             752:    679(ptr) AccessChain 34(data) 747 46 38
+             753:  19(int8_t) CompositeExtract 751 0
+                              Store 752 753
+             754:    679(ptr) AccessChain 34(data) 747 46 55
+             755:  19(int8_t) CompositeExtract 751 1
+                              Store 754 755
+             756:      6(int) Load 8(invocation)
+             757:    686(ptr) AccessChain 34(data) 59 46
+             758:  20(i8vec4) Load 757
+             759: 696(i8vec3) VectorShuffle 758 758 0 1 2
+             760: 696(i8vec3) GroupNonUniformUMin 42 Reduce 759
+             761:    679(ptr) AccessChain 34(data) 756 46 38
+             762:  19(int8_t) CompositeExtract 760 0
+                              Store 761 762
+             763:    679(ptr) AccessChain 34(data) 756 46 55
+             764:  19(int8_t) CompositeExtract 760 1
+                              Store 763 764
+             765:    679(ptr) AccessChain 34(data) 756 46 69
+             766:  19(int8_t) CompositeExtract 760 2
+                              Store 765 766
+             767:      6(int) Load 8(invocation)
+             768:    686(ptr) AccessChain 34(data) 73 46
+             769:  20(i8vec4) Load 768
+             770:  20(i8vec4) GroupNonUniformUMin 42 Reduce 769
+             771:    686(ptr) AccessChain 34(data) 767 46
+                              Store 771 770
+             772:      6(int) Load 8(invocation)
+             773:    679(ptr) AccessChain 34(data) 37 46 38
+             774:  19(int8_t) Load 773
+             775:  19(int8_t) GroupNonUniformUMax 42 Reduce 774
+             776:    679(ptr) AccessChain 34(data) 772 46 38
+                              Store 776 775
+             777:      6(int) Load 8(invocation)
+             778:    686(ptr) AccessChain 34(data) 46 46
+             779:  20(i8vec4) Load 778
+             780: 685(i8vec2) VectorShuffle 779 779 0 1
+             781: 685(i8vec2) GroupNonUniformUMax 42 Reduce 780
+             782:    679(ptr) AccessChain 34(data) 777 46 38
+             783:  19(int8_t) CompositeExtract 781 0
+                              Store 782 783
+             784:    679(ptr) AccessChain 34(data) 777 46 55
+             785:  19(int8_t) CompositeExtract 781 1
+                              Store 784 785
+             786:      6(int) Load 8(invocation)
+             787:    686(ptr) AccessChain 34(data) 59 46
+             788:  20(i8vec4) Load 787
+             789: 696(i8vec3) VectorShuffle 788 788 0 1 2
+             790: 696(i8vec3) GroupNonUniformUMax 42 Reduce 789
+             791:    679(ptr) AccessChain 34(data) 786 46 38
+             792:  19(int8_t) CompositeExtract 790 0
+                              Store 791 792
+             793:    679(ptr) AccessChain 34(data) 786 46 55
+             794:  19(int8_t) CompositeExtract 790 1
+                              Store 793 794
+             795:    679(ptr) AccessChain 34(data) 786 46 69
+             796:  19(int8_t) CompositeExtract 790 2
+                              Store 795 796
+             797:      6(int) Load 8(invocation)
+             798:    686(ptr) AccessChain 34(data) 73 46
+             799:  20(i8vec4) Load 798
+             800:  20(i8vec4) GroupNonUniformUMax 42 Reduce 799
+             801:    686(ptr) AccessChain 34(data) 797 46
+                              Store 801 800
+             802:      6(int) Load 8(invocation)
+             803:    679(ptr) AccessChain 34(data) 37 46 38
+             804:  19(int8_t) Load 803
+             805:  19(int8_t) GroupNonUniformBitwiseAnd 42 Reduce 804
+             806:    679(ptr) AccessChain 34(data) 802 46 38
+                              Store 806 805
+             807:      6(int) Load 8(invocation)
+             808:    686(ptr) AccessChain 34(data) 46 46
+             809:  20(i8vec4) Load 808
+             810: 685(i8vec2) VectorShuffle 809 809 0 1
+             811: 685(i8vec2) GroupNonUniformBitwiseAnd 42 Reduce 810
+             812:    679(ptr) AccessChain 34(data) 807 46 38
+             813:  19(int8_t) CompositeExtract 811 0
+                              Store 812 813
+             814:    679(ptr) AccessChain 34(data) 807 46 55
+             815:  19(int8_t) CompositeExtract 811 1
+                              Store 814 815
+             816:      6(int) Load 8(invocation)
+             817:    686(ptr) AccessChain 34(data) 59 46
+             818:  20(i8vec4) Load 817
+             819: 696(i8vec3) VectorShuffle 818 818 0 1 2
+             820: 696(i8vec3) GroupNonUniformBitwiseAnd 42 Reduce 819
+             821:    679(ptr) AccessChain 34(data) 816 46 38
+             822:  19(int8_t) CompositeExtract 820 0
+                              Store 821 822
+             823:    679(ptr) AccessChain 34(data) 816 46 55
+             824:  19(int8_t) CompositeExtract 820 1
+                              Store 823 824
+             825:    679(ptr) AccessChain 34(data) 816 46 69
+             826:  19(int8_t) CompositeExtract 820 2
+                              Store 825 826
+             827:      6(int) Load 8(invocation)
+             828:    686(ptr) AccessChain 34(data) 73 46
+             829:  20(i8vec4) Load 828
+             830:  20(i8vec4) GroupNonUniformBitwiseAnd 42 Reduce 829
+             831:    686(ptr) AccessChain 34(data) 827 46
+                              Store 831 830
+             832:      6(int) Load 8(invocation)
+             833:    679(ptr) AccessChain 34(data) 37 46 38
+             834:  19(int8_t) Load 833
+             835:  19(int8_t) GroupNonUniformBitwiseOr 42 Reduce 834
+             836:    679(ptr) AccessChain 34(data) 832 46 38
+                              Store 836 835
+             837:      6(int) Load 8(invocation)
+             838:    686(ptr) AccessChain 34(data) 46 46
+             839:  20(i8vec4) Load 838
+             840: 685(i8vec2) VectorShuffle 839 839 0 1
+             841: 685(i8vec2) GroupNonUniformBitwiseOr 42 Reduce 840
+             842:    679(ptr) AccessChain 34(data) 837 46 38
+             843:  19(int8_t) CompositeExtract 841 0
+                              Store 842 843
+             844:    679(ptr) AccessChain 34(data) 837 46 55
+             845:  19(int8_t) CompositeExtract 841 1
+                              Store 844 845
+             846:      6(int) Load 8(invocation)
+             847:    686(ptr) AccessChain 34(data) 59 46
+             848:  20(i8vec4) Load 847
+             849: 696(i8vec3) VectorShuffle 848 848 0 1 2
+             850: 696(i8vec3) GroupNonUniformBitwiseOr 42 Reduce 849
+             851:    679(ptr) AccessChain 34(data) 846 46 38
+             852:  19(int8_t) CompositeExtract 850 0
+                              Store 851 852
+             853:    679(ptr) AccessChain 34(data) 846 46 55
+             854:  19(int8_t) CompositeExtract 850 1
+                              Store 853 854
+             855:    679(ptr) AccessChain 34(data) 846 46 69
+             856:  19(int8_t) CompositeExtract 850 2
+                              Store 855 856
+             857:      6(int) Load 8(invocation)
+             858:    686(ptr) AccessChain 34(data) 73 46
+             859:  20(i8vec4) Load 858
+             860:  20(i8vec4) GroupNonUniformBitwiseOr 42 Reduce 859
+             861:    686(ptr) AccessChain 34(data) 857 46
+                              Store 861 860
+             862:      6(int) Load 8(invocation)
+             863:    679(ptr) AccessChain 34(data) 37 46 38
+             864:  19(int8_t) Load 863
+             865:  19(int8_t) GroupNonUniformBitwiseXor 42 Reduce 864
+             866:    679(ptr) AccessChain 34(data) 862 46 38
+                              Store 866 865
+             867:      6(int) Load 8(invocation)
+             868:    686(ptr) AccessChain 34(data) 46 46
+             869:  20(i8vec4) Load 868
+             870: 685(i8vec2) VectorShuffle 869 869 0 1
+             871: 685(i8vec2) GroupNonUniformBitwiseXor 42 Reduce 870
+             872:    679(ptr) AccessChain 34(data) 867 46 38
+             873:  19(int8_t) CompositeExtract 871 0
+                              Store 872 873
+             874:    679(ptr) AccessChain 34(data) 867 46 55
+             875:  19(int8_t) CompositeExtract 871 1
+                              Store 874 875
+             876:      6(int) Load 8(invocation)
+             877:    686(ptr) AccessChain 34(data) 59 46
+             878:  20(i8vec4) Load 877
+             879: 696(i8vec3) VectorShuffle 878 878 0 1 2
+             880: 696(i8vec3) GroupNonUniformBitwiseXor 42 Reduce 879
+             881:    679(ptr) AccessChain 34(data) 876 46 38
+             882:  19(int8_t) CompositeExtract 880 0
+                              Store 881 882
+             883:    679(ptr) AccessChain 34(data) 876 46 55
+             884:  19(int8_t) CompositeExtract 880 1
+                              Store 883 884
+             885:    679(ptr) AccessChain 34(data) 876 46 69
+             886:  19(int8_t) CompositeExtract 880 2
+                              Store 885 886
              887:      6(int) Load 8(invocation)
-             888:    600(ptr) AccessChain 34(data) 46 46
+             888:    686(ptr) AccessChain 34(data) 73 46
              889:  20(i8vec4) Load 888
-             890: 599(i8vec2) VectorShuffle 889 889 0 1
-             891: 599(i8vec2) GroupNonUniformBitwiseAnd 42 InclusiveScan 890
-             892:    600(ptr) AccessChain 34(data) 887 46
-             893:  20(i8vec4) Load 892
-             894:  20(i8vec4) VectorShuffle 893 891 4 5 2 3
-                              Store 892 894
-             895:      6(int) Load 8(invocation)
-             896:    600(ptr) AccessChain 34(data) 57 46
-             897:  20(i8vec4) Load 896
-             898: 609(i8vec3) VectorShuffle 897 897 0 1 2
-             899: 609(i8vec3) GroupNonUniformBitwiseAnd 42 InclusiveScan 898
-             900:    600(ptr) AccessChain 34(data) 895 46
-             901:  20(i8vec4) Load 900
-             902:  20(i8vec4) VectorShuffle 901 899 4 5 6 3
-                              Store 900 902
-             903:      6(int) Load 8(invocation)
-             904:    600(ptr) AccessChain 34(data) 67 46
-             905:  20(i8vec4) Load 904
-             906:  20(i8vec4) GroupNonUniformBitwiseAnd 42 InclusiveScan 905
-             907:    600(ptr) AccessChain 34(data) 903 46
-                              Store 907 906
-             908:      6(int) Load 8(invocation)
-             909:    593(ptr) AccessChain 34(data) 37 46 38
-             910:  19(int8_t) Load 909
-             911:  19(int8_t) GroupNonUniformBitwiseOr 42 InclusiveScan 910
-             912:    593(ptr) AccessChain 34(data) 908 46 38
-                              Store 912 911
-             913:      6(int) Load 8(invocation)
-             914:    600(ptr) AccessChain 34(data) 46 46
-             915:  20(i8vec4) Load 914
-             916: 599(i8vec2) VectorShuffle 915 915 0 1
-             917: 599(i8vec2) GroupNonUniformBitwiseOr 42 InclusiveScan 916
-             918:    600(ptr) AccessChain 34(data) 913 46
+             890:  20(i8vec4) GroupNonUniformBitwiseXor 42 Reduce 889
+             891:    686(ptr) AccessChain 34(data) 887 46
+                              Store 891 890
+             892:      6(int) Load 8(invocation)
+             893:    679(ptr) AccessChain 34(data) 37 46 38
+             894:  19(int8_t) Load 893
+             895:  19(int8_t) GroupNonUniformIAdd 42 InclusiveScan 894
+             896:    679(ptr) AccessChain 34(data) 892 46 38
+                              Store 896 895
+             897:      6(int) Load 8(invocation)
+             898:    686(ptr) AccessChain 34(data) 46 46
+             899:  20(i8vec4) Load 898
+             900: 685(i8vec2) VectorShuffle 899 899 0 1
+             901: 685(i8vec2) GroupNonUniformIAdd 42 InclusiveScan 900
+             902:    679(ptr) AccessChain 34(data) 897 46 38
+             903:  19(int8_t) CompositeExtract 901 0
+                              Store 902 903
+             904:    679(ptr) AccessChain 34(data) 897 46 55
+             905:  19(int8_t) CompositeExtract 901 1
+                              Store 904 905
+             906:      6(int) Load 8(invocation)
+             907:    686(ptr) AccessChain 34(data) 59 46
+             908:  20(i8vec4) Load 907
+             909: 696(i8vec3) VectorShuffle 908 908 0 1 2
+             910: 696(i8vec3) GroupNonUniformIAdd 42 InclusiveScan 909
+             911:    679(ptr) AccessChain 34(data) 906 46 38
+             912:  19(int8_t) CompositeExtract 910 0
+                              Store 911 912
+             913:    679(ptr) AccessChain 34(data) 906 46 55
+             914:  19(int8_t) CompositeExtract 910 1
+                              Store 913 914
+             915:    679(ptr) AccessChain 34(data) 906 46 69
+             916:  19(int8_t) CompositeExtract 910 2
+                              Store 915 916
+             917:      6(int) Load 8(invocation)
+             918:    686(ptr) AccessChain 34(data) 73 46
              919:  20(i8vec4) Load 918
-             920:  20(i8vec4) VectorShuffle 919 917 4 5 2 3
-                              Store 918 920
-             921:      6(int) Load 8(invocation)
-             922:    600(ptr) AccessChain 34(data) 57 46
-             923:  20(i8vec4) Load 922
-             924: 609(i8vec3) VectorShuffle 923 923 0 1 2
-             925: 609(i8vec3) GroupNonUniformBitwiseOr 42 InclusiveScan 924
-             926:    600(ptr) AccessChain 34(data) 921 46
-             927:  20(i8vec4) Load 926
-             928:  20(i8vec4) VectorShuffle 927 925 4 5 6 3
-                              Store 926 928
-             929:      6(int) Load 8(invocation)
-             930:    600(ptr) AccessChain 34(data) 67 46
-             931:  20(i8vec4) Load 930
-             932:  20(i8vec4) GroupNonUniformBitwiseOr 42 InclusiveScan 931
-             933:    600(ptr) AccessChain 34(data) 929 46
-                              Store 933 932
-             934:      6(int) Load 8(invocation)
-             935:    593(ptr) AccessChain 34(data) 37 46 38
-             936:  19(int8_t) Load 935
-             937:  19(int8_t) GroupNonUniformBitwiseXor 42 InclusiveScan 936
-             938:    593(ptr) AccessChain 34(data) 934 46 38
-                              Store 938 937
-             939:      6(int) Load 8(invocation)
-             940:    600(ptr) AccessChain 34(data) 46 46
-             941:  20(i8vec4) Load 940
-             942: 599(i8vec2) VectorShuffle 941 941 0 1
-             943: 599(i8vec2) GroupNonUniformBitwiseXor 42 InclusiveScan 942
-             944:    600(ptr) AccessChain 34(data) 939 46
-             945:  20(i8vec4) Load 944
-             946:  20(i8vec4) VectorShuffle 945 943 4 5 2 3
-                              Store 944 946
+             920:  20(i8vec4) GroupNonUniformIAdd 42 InclusiveScan 919
+             921:    686(ptr) AccessChain 34(data) 917 46
+                              Store 921 920
+             922:      6(int) Load 8(invocation)
+             923:    679(ptr) AccessChain 34(data) 37 46 38
+             924:  19(int8_t) Load 923
+             925:  19(int8_t) GroupNonUniformIMul 42 InclusiveScan 924
+             926:    679(ptr) AccessChain 34(data) 922 46 38
+                              Store 926 925
+             927:      6(int) Load 8(invocation)
+             928:    686(ptr) AccessChain 34(data) 46 46
+             929:  20(i8vec4) Load 928
+             930: 685(i8vec2) VectorShuffle 929 929 0 1
+             931: 685(i8vec2) GroupNonUniformIMul 42 InclusiveScan 930
+             932:    679(ptr) AccessChain 34(data) 927 46 38
+             933:  19(int8_t) CompositeExtract 931 0
+                              Store 932 933
+             934:    679(ptr) AccessChain 34(data) 927 46 55
+             935:  19(int8_t) CompositeExtract 931 1
+                              Store 934 935
+             936:      6(int) Load 8(invocation)
+             937:    686(ptr) AccessChain 34(data) 59 46
+             938:  20(i8vec4) Load 937
+             939: 696(i8vec3) VectorShuffle 938 938 0 1 2
+             940: 696(i8vec3) GroupNonUniformIMul 42 InclusiveScan 939
+             941:    679(ptr) AccessChain 34(data) 936 46 38
+             942:  19(int8_t) CompositeExtract 940 0
+                              Store 941 942
+             943:    679(ptr) AccessChain 34(data) 936 46 55
+             944:  19(int8_t) CompositeExtract 940 1
+                              Store 943 944
+             945:    679(ptr) AccessChain 34(data) 936 46 69
+             946:  19(int8_t) CompositeExtract 940 2
+                              Store 945 946
              947:      6(int) Load 8(invocation)
-             948:    600(ptr) AccessChain 34(data) 57 46
+             948:    686(ptr) AccessChain 34(data) 73 46
              949:  20(i8vec4) Load 948
-             950: 609(i8vec3) VectorShuffle 949 949 0 1 2
-             951: 609(i8vec3) GroupNonUniformBitwiseXor 42 InclusiveScan 950
-             952:    600(ptr) AccessChain 34(data) 947 46
-             953:  20(i8vec4) Load 952
-             954:  20(i8vec4) VectorShuffle 953 951 4 5 6 3
-                              Store 952 954
-             955:      6(int) Load 8(invocation)
-             956:    600(ptr) AccessChain 34(data) 67 46
-             957:  20(i8vec4) Load 956
-             958:  20(i8vec4) GroupNonUniformBitwiseXor 42 InclusiveScan 957
-             959:    600(ptr) AccessChain 34(data) 955 46
-                              Store 959 958
-             960:      6(int) Load 8(invocation)
-             961:    593(ptr) AccessChain 34(data) 37 46 38
-             962:  19(int8_t) Load 961
-             963:  19(int8_t) GroupNonUniformIAdd 42 ExclusiveScan 962
-             964:    593(ptr) AccessChain 34(data) 960 46 38
-                              Store 964 963
-             965:      6(int) Load 8(invocation)
-             966:    600(ptr) AccessChain 34(data) 46 46
-             967:  20(i8vec4) Load 966
-             968: 599(i8vec2) VectorShuffle 967 967 0 1
-             969: 599(i8vec2) GroupNonUniformIAdd 42 ExclusiveScan 968
-             970:    600(ptr) AccessChain 34(data) 965 46
-             971:  20(i8vec4) Load 970
-             972:  20(i8vec4) VectorShuffle 971 969 4 5 2 3
-                              Store 970 972
-             973:      6(int) Load 8(invocation)
-             974:    600(ptr) AccessChain 34(data) 57 46
-             975:  20(i8vec4) Load 974
-             976: 609(i8vec3) VectorShuffle 975 975 0 1 2
-             977: 609(i8vec3) GroupNonUniformIAdd 42 ExclusiveScan 976
-             978:    600(ptr) AccessChain 34(data) 973 46
+             950:  20(i8vec4) GroupNonUniformIMul 42 InclusiveScan 949
+             951:    686(ptr) AccessChain 34(data) 947 46
+                              Store 951 950
+             952:      6(int) Load 8(invocation)
+             953:    679(ptr) AccessChain 34(data) 37 46 38
+             954:  19(int8_t) Load 953
+             955:  19(int8_t) GroupNonUniformUMin 42 InclusiveScan 954
+             956:    679(ptr) AccessChain 34(data) 952 46 38
+                              Store 956 955
+             957:      6(int) Load 8(invocation)
+             958:    686(ptr) AccessChain 34(data) 46 46
+             959:  20(i8vec4) Load 958
+             960: 685(i8vec2) VectorShuffle 959 959 0 1
+             961: 685(i8vec2) GroupNonUniformUMin 42 InclusiveScan 960
+             962:    679(ptr) AccessChain 34(data) 957 46 38
+             963:  19(int8_t) CompositeExtract 961 0
+                              Store 962 963
+             964:    679(ptr) AccessChain 34(data) 957 46 55
+             965:  19(int8_t) CompositeExtract 961 1
+                              Store 964 965
+             966:      6(int) Load 8(invocation)
+             967:    686(ptr) AccessChain 34(data) 59 46
+             968:  20(i8vec4) Load 967
+             969: 696(i8vec3) VectorShuffle 968 968 0 1 2
+             970: 696(i8vec3) GroupNonUniformUMin 42 InclusiveScan 969
+             971:    679(ptr) AccessChain 34(data) 966 46 38
+             972:  19(int8_t) CompositeExtract 970 0
+                              Store 971 972
+             973:    679(ptr) AccessChain 34(data) 966 46 55
+             974:  19(int8_t) CompositeExtract 970 1
+                              Store 973 974
+             975:    679(ptr) AccessChain 34(data) 966 46 69
+             976:  19(int8_t) CompositeExtract 970 2
+                              Store 975 976
+             977:      6(int) Load 8(invocation)
+             978:    686(ptr) AccessChain 34(data) 73 46
              979:  20(i8vec4) Load 978
-             980:  20(i8vec4) VectorShuffle 979 977 4 5 6 3
-                              Store 978 980
-             981:      6(int) Load 8(invocation)
-             982:    600(ptr) AccessChain 34(data) 67 46
-             983:  20(i8vec4) Load 982
-             984:  20(i8vec4) GroupNonUniformIAdd 42 ExclusiveScan 983
-             985:    600(ptr) AccessChain 34(data) 981 46
-                              Store 985 984
-             986:      6(int) Load 8(invocation)
-             987:    593(ptr) AccessChain 34(data) 37 46 38
-             988:  19(int8_t) Load 987
-             989:  19(int8_t) GroupNonUniformIMul 42 ExclusiveScan 988
-             990:    593(ptr) AccessChain 34(data) 986 46 38
-                              Store 990 989
-             991:      6(int) Load 8(invocation)
-             992:    600(ptr) AccessChain 34(data) 46 46
-             993:  20(i8vec4) Load 992
-             994: 599(i8vec2) VectorShuffle 993 993 0 1
-             995: 599(i8vec2) GroupNonUniformIMul 42 ExclusiveScan 994
-             996:    600(ptr) AccessChain 34(data) 991 46
-             997:  20(i8vec4) Load 996
-             998:  20(i8vec4) VectorShuffle 997 995 4 5 2 3
-                              Store 996 998
-             999:      6(int) Load 8(invocation)
-            1000:    600(ptr) AccessChain 34(data) 57 46
-            1001:  20(i8vec4) Load 1000
-            1002: 609(i8vec3) VectorShuffle 1001 1001 0 1 2
-            1003: 609(i8vec3) GroupNonUniformIMul 42 ExclusiveScan 1002
-            1004:    600(ptr) AccessChain 34(data) 999 46
-            1005:  20(i8vec4) Load 1004
-            1006:  20(i8vec4) VectorShuffle 1005 1003 4 5 6 3
-                              Store 1004 1006
+             980:  20(i8vec4) GroupNonUniformUMin 42 InclusiveScan 979
+             981:    686(ptr) AccessChain 34(data) 977 46
+                              Store 981 980
+             982:      6(int) Load 8(invocation)
+             983:    679(ptr) AccessChain 34(data) 37 46 38
+             984:  19(int8_t) Load 983
+             985:  19(int8_t) GroupNonUniformUMax 42 InclusiveScan 984
+             986:    679(ptr) AccessChain 34(data) 982 46 38
+                              Store 986 985
+             987:      6(int) Load 8(invocation)
+             988:    686(ptr) AccessChain 34(data) 46 46
+             989:  20(i8vec4) Load 988
+             990: 685(i8vec2) VectorShuffle 989 989 0 1
+             991: 685(i8vec2) GroupNonUniformUMax 42 InclusiveScan 990
+             992:    679(ptr) AccessChain 34(data) 987 46 38
+             993:  19(int8_t) CompositeExtract 991 0
+                              Store 992 993
+             994:    679(ptr) AccessChain 34(data) 987 46 55
+             995:  19(int8_t) CompositeExtract 991 1
+                              Store 994 995
+             996:      6(int) Load 8(invocation)
+             997:    686(ptr) AccessChain 34(data) 59 46
+             998:  20(i8vec4) Load 997
+             999: 696(i8vec3) VectorShuffle 998 998 0 1 2
+            1000: 696(i8vec3) GroupNonUniformUMax 42 InclusiveScan 999
+            1001:    679(ptr) AccessChain 34(data) 996 46 38
+            1002:  19(int8_t) CompositeExtract 1000 0
+                              Store 1001 1002
+            1003:    679(ptr) AccessChain 34(data) 996 46 55
+            1004:  19(int8_t) CompositeExtract 1000 1
+                              Store 1003 1004
+            1005:    679(ptr) AccessChain 34(data) 996 46 69
+            1006:  19(int8_t) CompositeExtract 1000 2
+                              Store 1005 1006
             1007:      6(int) Load 8(invocation)
-            1008:    600(ptr) AccessChain 34(data) 67 46
+            1008:    686(ptr) AccessChain 34(data) 73 46
             1009:  20(i8vec4) Load 1008
-            1010:  20(i8vec4) GroupNonUniformIMul 42 ExclusiveScan 1009
-            1011:    600(ptr) AccessChain 34(data) 1007 46
+            1010:  20(i8vec4) GroupNonUniformUMax 42 InclusiveScan 1009
+            1011:    686(ptr) AccessChain 34(data) 1007 46
                               Store 1011 1010
             1012:      6(int) Load 8(invocation)
-            1013:    593(ptr) AccessChain 34(data) 37 46 38
+            1013:    679(ptr) AccessChain 34(data) 37 46 38
             1014:  19(int8_t) Load 1013
-            1015:  19(int8_t) GroupNonUniformUMin 42 ExclusiveScan 1014
-            1016:    593(ptr) AccessChain 34(data) 1012 46 38
+            1015:  19(int8_t) GroupNonUniformBitwiseAnd 42 InclusiveScan 1014
+            1016:    679(ptr) AccessChain 34(data) 1012 46 38
                               Store 1016 1015
             1017:      6(int) Load 8(invocation)
-            1018:    600(ptr) AccessChain 34(data) 46 46
+            1018:    686(ptr) AccessChain 34(data) 46 46
             1019:  20(i8vec4) Load 1018
-            1020: 599(i8vec2) VectorShuffle 1019 1019 0 1
-            1021: 599(i8vec2) GroupNonUniformUMin 42 ExclusiveScan 1020
-            1022:    600(ptr) AccessChain 34(data) 1017 46
-            1023:  20(i8vec4) Load 1022
-            1024:  20(i8vec4) VectorShuffle 1023 1021 4 5 2 3
-                              Store 1022 1024
-            1025:      6(int) Load 8(invocation)
-            1026:    600(ptr) AccessChain 34(data) 57 46
-            1027:  20(i8vec4) Load 1026
-            1028: 609(i8vec3) VectorShuffle 1027 1027 0 1 2
-            1029: 609(i8vec3) GroupNonUniformUMin 42 ExclusiveScan 1028
-            1030:    600(ptr) AccessChain 34(data) 1025 46
-            1031:  20(i8vec4) Load 1030
-            1032:  20(i8vec4) VectorShuffle 1031 1029 4 5 6 3
-                              Store 1030 1032
-            1033:      6(int) Load 8(invocation)
-            1034:    600(ptr) AccessChain 34(data) 67 46
-            1035:  20(i8vec4) Load 1034
-            1036:  20(i8vec4) GroupNonUniformUMin 42 ExclusiveScan 1035
-            1037:    600(ptr) AccessChain 34(data) 1033 46
-                              Store 1037 1036
-            1038:      6(int) Load 8(invocation)
-            1039:    593(ptr) AccessChain 34(data) 37 46 38
-            1040:  19(int8_t) Load 1039
-            1041:  19(int8_t) GroupNonUniformUMax 42 ExclusiveScan 1040
-            1042:    593(ptr) AccessChain 34(data) 1038 46 38
-                              Store 1042 1041
-            1043:      6(int) Load 8(invocation)
-            1044:    600(ptr) AccessChain 34(data) 46 46
-            1045:  20(i8vec4) Load 1044
-            1046: 599(i8vec2) VectorShuffle 1045 1045 0 1
-            1047: 599(i8vec2) GroupNonUniformUMax 42 ExclusiveScan 1046
-            1048:    600(ptr) AccessChain 34(data) 1043 46
+            1020: 685(i8vec2) VectorShuffle 1019 1019 0 1
+            1021: 685(i8vec2) GroupNonUniformBitwiseAnd 42 InclusiveScan 1020
+            1022:    679(ptr) AccessChain 34(data) 1017 46 38
+            1023:  19(int8_t) CompositeExtract 1021 0
+                              Store 1022 1023
+            1024:    679(ptr) AccessChain 34(data) 1017 46 55
+            1025:  19(int8_t) CompositeExtract 1021 1
+                              Store 1024 1025
+            1026:      6(int) Load 8(invocation)
+            1027:    686(ptr) AccessChain 34(data) 59 46
+            1028:  20(i8vec4) Load 1027
+            1029: 696(i8vec3) VectorShuffle 1028 1028 0 1 2
+            1030: 696(i8vec3) GroupNonUniformBitwiseAnd 42 InclusiveScan 1029
+            1031:    679(ptr) AccessChain 34(data) 1026 46 38
+            1032:  19(int8_t) CompositeExtract 1030 0
+                              Store 1031 1032
+            1033:    679(ptr) AccessChain 34(data) 1026 46 55
+            1034:  19(int8_t) CompositeExtract 1030 1
+                              Store 1033 1034
+            1035:    679(ptr) AccessChain 34(data) 1026 46 69
+            1036:  19(int8_t) CompositeExtract 1030 2
+                              Store 1035 1036
+            1037:      6(int) Load 8(invocation)
+            1038:    686(ptr) AccessChain 34(data) 73 46
+            1039:  20(i8vec4) Load 1038
+            1040:  20(i8vec4) GroupNonUniformBitwiseAnd 42 InclusiveScan 1039
+            1041:    686(ptr) AccessChain 34(data) 1037 46
+                              Store 1041 1040
+            1042:      6(int) Load 8(invocation)
+            1043:    679(ptr) AccessChain 34(data) 37 46 38
+            1044:  19(int8_t) Load 1043
+            1045:  19(int8_t) GroupNonUniformBitwiseOr 42 InclusiveScan 1044
+            1046:    679(ptr) AccessChain 34(data) 1042 46 38
+                              Store 1046 1045
+            1047:      6(int) Load 8(invocation)
+            1048:    686(ptr) AccessChain 34(data) 46 46
             1049:  20(i8vec4) Load 1048
-            1050:  20(i8vec4) VectorShuffle 1049 1047 4 5 2 3
-                              Store 1048 1050
-            1051:      6(int) Load 8(invocation)
-            1052:    600(ptr) AccessChain 34(data) 57 46
-            1053:  20(i8vec4) Load 1052
-            1054: 609(i8vec3) VectorShuffle 1053 1053 0 1 2
-            1055: 609(i8vec3) GroupNonUniformUMax 42 ExclusiveScan 1054
-            1056:    600(ptr) AccessChain 34(data) 1051 46
-            1057:  20(i8vec4) Load 1056
-            1058:  20(i8vec4) VectorShuffle 1057 1055 4 5 6 3
-                              Store 1056 1058
-            1059:      6(int) Load 8(invocation)
-            1060:    600(ptr) AccessChain 34(data) 67 46
-            1061:  20(i8vec4) Load 1060
-            1062:  20(i8vec4) GroupNonUniformUMax 42 ExclusiveScan 1061
-            1063:    600(ptr) AccessChain 34(data) 1059 46
-                              Store 1063 1062
-            1064:      6(int) Load 8(invocation)
-            1065:    593(ptr) AccessChain 34(data) 37 46 38
-            1066:  19(int8_t) Load 1065
-            1067:  19(int8_t) GroupNonUniformBitwiseAnd 42 ExclusiveScan 1066
-            1068:    593(ptr) AccessChain 34(data) 1064 46 38
-                              Store 1068 1067
-            1069:      6(int) Load 8(invocation)
-            1070:    600(ptr) AccessChain 34(data) 46 46
-            1071:  20(i8vec4) Load 1070
-            1072: 599(i8vec2) VectorShuffle 1071 1071 0 1
-            1073: 599(i8vec2) GroupNonUniformBitwiseAnd 42 ExclusiveScan 1072
-            1074:    600(ptr) AccessChain 34(data) 1069 46
-            1075:  20(i8vec4) Load 1074
-            1076:  20(i8vec4) VectorShuffle 1075 1073 4 5 2 3
-                              Store 1074 1076
+            1050: 685(i8vec2) VectorShuffle 1049 1049 0 1
+            1051: 685(i8vec2) GroupNonUniformBitwiseOr 42 InclusiveScan 1050
+            1052:    679(ptr) AccessChain 34(data) 1047 46 38
+            1053:  19(int8_t) CompositeExtract 1051 0
+                              Store 1052 1053
+            1054:    679(ptr) AccessChain 34(data) 1047 46 55
+            1055:  19(int8_t) CompositeExtract 1051 1
+                              Store 1054 1055
+            1056:      6(int) Load 8(invocation)
+            1057:    686(ptr) AccessChain 34(data) 59 46
+            1058:  20(i8vec4) Load 1057
+            1059: 696(i8vec3) VectorShuffle 1058 1058 0 1 2
+            1060: 696(i8vec3) GroupNonUniformBitwiseOr 42 InclusiveScan 1059
+            1061:    679(ptr) AccessChain 34(data) 1056 46 38
+            1062:  19(int8_t) CompositeExtract 1060 0
+                              Store 1061 1062
+            1063:    679(ptr) AccessChain 34(data) 1056 46 55
+            1064:  19(int8_t) CompositeExtract 1060 1
+                              Store 1063 1064
+            1065:    679(ptr) AccessChain 34(data) 1056 46 69
+            1066:  19(int8_t) CompositeExtract 1060 2
+                              Store 1065 1066
+            1067:      6(int) Load 8(invocation)
+            1068:    686(ptr) AccessChain 34(data) 73 46
+            1069:  20(i8vec4) Load 1068
+            1070:  20(i8vec4) GroupNonUniformBitwiseOr 42 InclusiveScan 1069
+            1071:    686(ptr) AccessChain 34(data) 1067 46
+                              Store 1071 1070
+            1072:      6(int) Load 8(invocation)
+            1073:    679(ptr) AccessChain 34(data) 37 46 38
+            1074:  19(int8_t) Load 1073
+            1075:  19(int8_t) GroupNonUniformBitwiseXor 42 InclusiveScan 1074
+            1076:    679(ptr) AccessChain 34(data) 1072 46 38
+                              Store 1076 1075
             1077:      6(int) Load 8(invocation)
-            1078:    600(ptr) AccessChain 34(data) 57 46
+            1078:    686(ptr) AccessChain 34(data) 46 46
             1079:  20(i8vec4) Load 1078
-            1080: 609(i8vec3) VectorShuffle 1079 1079 0 1 2
-            1081: 609(i8vec3) GroupNonUniformBitwiseAnd 42 ExclusiveScan 1080
-            1082:    600(ptr) AccessChain 34(data) 1077 46
-            1083:  20(i8vec4) Load 1082
-            1084:  20(i8vec4) VectorShuffle 1083 1081 4 5 6 3
-                              Store 1082 1084
-            1085:      6(int) Load 8(invocation)
-            1086:    600(ptr) AccessChain 34(data) 67 46
-            1087:  20(i8vec4) Load 1086
-            1088:  20(i8vec4) GroupNonUniformBitwiseAnd 42 ExclusiveScan 1087
-            1089:    600(ptr) AccessChain 34(data) 1085 46
-                              Store 1089 1088
-            1090:      6(int) Load 8(invocation)
-            1091:    593(ptr) AccessChain 34(data) 37 46 38
-            1092:  19(int8_t) Load 1091
-            1093:  19(int8_t) GroupNonUniformBitwiseOr 42 ExclusiveScan 1092
-            1094:    593(ptr) AccessChain 34(data) 1090 46 38
-                              Store 1094 1093
-            1095:      6(int) Load 8(invocation)
-            1096:    600(ptr) AccessChain 34(data) 46 46
-            1097:  20(i8vec4) Load 1096
-            1098: 599(i8vec2) VectorShuffle 1097 1097 0 1
-            1099: 599(i8vec2) GroupNonUniformBitwiseOr 42 ExclusiveScan 1098
-            1100:    600(ptr) AccessChain 34(data) 1095 46
-            1101:  20(i8vec4) Load 1100
-            1102:  20(i8vec4) VectorShuffle 1101 1099 4 5 2 3
-                              Store 1100 1102
-            1103:      6(int) Load 8(invocation)
-            1104:    600(ptr) AccessChain 34(data) 57 46
-            1105:  20(i8vec4) Load 1104
-            1106: 609(i8vec3) VectorShuffle 1105 1105 0 1 2
-            1107: 609(i8vec3) GroupNonUniformBitwiseOr 42 ExclusiveScan 1106
-            1108:    600(ptr) AccessChain 34(data) 1103 46
+            1080: 685(i8vec2) VectorShuffle 1079 1079 0 1
+            1081: 685(i8vec2) GroupNonUniformBitwiseXor 42 InclusiveScan 1080
+            1082:    679(ptr) AccessChain 34(data) 1077 46 38
+            1083:  19(int8_t) CompositeExtract 1081 0
+                              Store 1082 1083
+            1084:    679(ptr) AccessChain 34(data) 1077 46 55
+            1085:  19(int8_t) CompositeExtract 1081 1
+                              Store 1084 1085
+            1086:      6(int) Load 8(invocation)
+            1087:    686(ptr) AccessChain 34(data) 59 46
+            1088:  20(i8vec4) Load 1087
+            1089: 696(i8vec3) VectorShuffle 1088 1088 0 1 2
+            1090: 696(i8vec3) GroupNonUniformBitwiseXor 42 InclusiveScan 1089
+            1091:    679(ptr) AccessChain 34(data) 1086 46 38
+            1092:  19(int8_t) CompositeExtract 1090 0
+                              Store 1091 1092
+            1093:    679(ptr) AccessChain 34(data) 1086 46 55
+            1094:  19(int8_t) CompositeExtract 1090 1
+                              Store 1093 1094
+            1095:    679(ptr) AccessChain 34(data) 1086 46 69
+            1096:  19(int8_t) CompositeExtract 1090 2
+                              Store 1095 1096
+            1097:      6(int) Load 8(invocation)
+            1098:    686(ptr) AccessChain 34(data) 73 46
+            1099:  20(i8vec4) Load 1098
+            1100:  20(i8vec4) GroupNonUniformBitwiseXor 42 InclusiveScan 1099
+            1101:    686(ptr) AccessChain 34(data) 1097 46
+                              Store 1101 1100
+            1102:      6(int) Load 8(invocation)
+            1103:    679(ptr) AccessChain 34(data) 37 46 38
+            1104:  19(int8_t) Load 1103
+            1105:  19(int8_t) GroupNonUniformIAdd 42 ExclusiveScan 1104
+            1106:    679(ptr) AccessChain 34(data) 1102 46 38
+                              Store 1106 1105
+            1107:      6(int) Load 8(invocation)
+            1108:    686(ptr) AccessChain 34(data) 46 46
             1109:  20(i8vec4) Load 1108
-            1110:  20(i8vec4) VectorShuffle 1109 1107 4 5 6 3
-                              Store 1108 1110
-            1111:      6(int) Load 8(invocation)
-            1112:    600(ptr) AccessChain 34(data) 67 46
-            1113:  20(i8vec4) Load 1112
-            1114:  20(i8vec4) GroupNonUniformBitwiseOr 42 ExclusiveScan 1113
-            1115:    600(ptr) AccessChain 34(data) 1111 46
-                              Store 1115 1114
+            1110: 685(i8vec2) VectorShuffle 1109 1109 0 1
+            1111: 685(i8vec2) GroupNonUniformIAdd 42 ExclusiveScan 1110
+            1112:    679(ptr) AccessChain 34(data) 1107 46 38
+            1113:  19(int8_t) CompositeExtract 1111 0
+                              Store 1112 1113
+            1114:    679(ptr) AccessChain 34(data) 1107 46 55
+            1115:  19(int8_t) CompositeExtract 1111 1
+                              Store 1114 1115
             1116:      6(int) Load 8(invocation)
-            1117:    593(ptr) AccessChain 34(data) 37 46 38
-            1118:  19(int8_t) Load 1117
-            1119:  19(int8_t) GroupNonUniformBitwiseXor 42 ExclusiveScan 1118
-            1120:    593(ptr) AccessChain 34(data) 1116 46 38
-                              Store 1120 1119
-            1121:      6(int) Load 8(invocation)
-            1122:    600(ptr) AccessChain 34(data) 46 46
-            1123:  20(i8vec4) Load 1122
-            1124: 599(i8vec2) VectorShuffle 1123 1123 0 1
-            1125: 599(i8vec2) GroupNonUniformBitwiseXor 42 ExclusiveScan 1124
-            1126:    600(ptr) AccessChain 34(data) 1121 46
-            1127:  20(i8vec4) Load 1126
-            1128:  20(i8vec4) VectorShuffle 1127 1125 4 5 2 3
-                              Store 1126 1128
-            1129:      6(int) Load 8(invocation)
-            1130:    600(ptr) AccessChain 34(data) 57 46
-            1131:  20(i8vec4) Load 1130
-            1132: 609(i8vec3) VectorShuffle 1131 1131 0 1 2
-            1133: 609(i8vec3) GroupNonUniformBitwiseXor 42 ExclusiveScan 1132
-            1134:    600(ptr) AccessChain 34(data) 1129 46
-            1135:  20(i8vec4) Load 1134
-            1136:  20(i8vec4) VectorShuffle 1135 1133 4 5 6 3
-                              Store 1134 1136
+            1117:    686(ptr) AccessChain 34(data) 59 46
+            1118:  20(i8vec4) Load 1117
+            1119: 696(i8vec3) VectorShuffle 1118 1118 0 1 2
+            1120: 696(i8vec3) GroupNonUniformIAdd 42 ExclusiveScan 1119
+            1121:    679(ptr) AccessChain 34(data) 1116 46 38
+            1122:  19(int8_t) CompositeExtract 1120 0
+                              Store 1121 1122
+            1123:    679(ptr) AccessChain 34(data) 1116 46 55
+            1124:  19(int8_t) CompositeExtract 1120 1
+                              Store 1123 1124
+            1125:    679(ptr) AccessChain 34(data) 1116 46 69
+            1126:  19(int8_t) CompositeExtract 1120 2
+                              Store 1125 1126
+            1127:      6(int) Load 8(invocation)
+            1128:    686(ptr) AccessChain 34(data) 73 46
+            1129:  20(i8vec4) Load 1128
+            1130:  20(i8vec4) GroupNonUniformIAdd 42 ExclusiveScan 1129
+            1131:    686(ptr) AccessChain 34(data) 1127 46
+                              Store 1131 1130
+            1132:      6(int) Load 8(invocation)
+            1133:    679(ptr) AccessChain 34(data) 37 46 38
+            1134:  19(int8_t) Load 1133
+            1135:  19(int8_t) GroupNonUniformIMul 42 ExclusiveScan 1134
+            1136:    679(ptr) AccessChain 34(data) 1132 46 38
+                              Store 1136 1135
             1137:      6(int) Load 8(invocation)
-            1138:    600(ptr) AccessChain 34(data) 67 46
+            1138:    686(ptr) AccessChain 34(data) 46 46
             1139:  20(i8vec4) Load 1138
-            1140:  20(i8vec4) GroupNonUniformBitwiseXor 42 ExclusiveScan 1139
-            1141:    600(ptr) AccessChain 34(data) 1137 46
-                              Store 1141 1140
-            1142:      6(int) Load 8(invocation)
-            1144:   1143(ptr) AccessChain 34(data) 37 57 38
-            1145: 21(int16_t) Load 1144
-            1146: 21(int16_t) GroupNonUniformIAdd 42 Reduce 1145
-            1147:   1143(ptr) AccessChain 34(data) 1142 57 38
-                              Store 1147 1146
-            1148:      6(int) Load 8(invocation)
-            1151:   1150(ptr) AccessChain 34(data) 46 57
-            1152: 22(i16vec4) Load 1151
-            1153:1149(i16vec2) VectorShuffle 1152 1152 0 1
-            1154:1149(i16vec2) GroupNonUniformIAdd 42 Reduce 1153
-            1155:   1150(ptr) AccessChain 34(data) 1148 57
-            1156: 22(i16vec4) Load 1155
-            1157: 22(i16vec4) VectorShuffle 1156 1154 4 5 2 3
-                              Store 1155 1157
-            1158:      6(int) Load 8(invocation)
-            1160:   1150(ptr) AccessChain 34(data) 57 57
-            1161: 22(i16vec4) Load 1160
-            1162:1159(i16vec3) VectorShuffle 1161 1161 0 1 2
-            1163:1159(i16vec3) GroupNonUniformIAdd 42 Reduce 1162
-            1164:   1150(ptr) AccessChain 34(data) 1158 57
-            1165: 22(i16vec4) Load 1164
-            1166: 22(i16vec4) VectorShuffle 1165 1163 4 5 6 3
-                              Store 1164 1166
+            1140: 685(i8vec2) VectorShuffle 1139 1139 0 1
+            1141: 685(i8vec2) GroupNonUniformIMul 42 ExclusiveScan 1140
+            1142:    679(ptr) AccessChain 34(data) 1137 46 38
+            1143:  19(int8_t) CompositeExtract 1141 0
+                              Store 1142 1143
+            1144:    679(ptr) AccessChain 34(data) 1137 46 55
+            1145:  19(int8_t) CompositeExtract 1141 1
+                              Store 1144 1145
+            1146:      6(int) Load 8(invocation)
+            1147:    686(ptr) AccessChain 34(data) 59 46
+            1148:  20(i8vec4) Load 1147
+            1149: 696(i8vec3) VectorShuffle 1148 1148 0 1 2
+            1150: 696(i8vec3) GroupNonUniformIMul 42 ExclusiveScan 1149
+            1151:    679(ptr) AccessChain 34(data) 1146 46 38
+            1152:  19(int8_t) CompositeExtract 1150 0
+                              Store 1151 1152
+            1153:    679(ptr) AccessChain 34(data) 1146 46 55
+            1154:  19(int8_t) CompositeExtract 1150 1
+                              Store 1153 1154
+            1155:    679(ptr) AccessChain 34(data) 1146 46 69
+            1156:  19(int8_t) CompositeExtract 1150 2
+                              Store 1155 1156
+            1157:      6(int) Load 8(invocation)
+            1158:    686(ptr) AccessChain 34(data) 73 46
+            1159:  20(i8vec4) Load 1158
+            1160:  20(i8vec4) GroupNonUniformIMul 42 ExclusiveScan 1159
+            1161:    686(ptr) AccessChain 34(data) 1157 46
+                              Store 1161 1160
+            1162:      6(int) Load 8(invocation)
+            1163:    679(ptr) AccessChain 34(data) 37 46 38
+            1164:  19(int8_t) Load 1163
+            1165:  19(int8_t) GroupNonUniformUMin 42 ExclusiveScan 1164
+            1166:    679(ptr) AccessChain 34(data) 1162 46 38
+                              Store 1166 1165
             1167:      6(int) Load 8(invocation)
-            1168:   1150(ptr) AccessChain 34(data) 67 57
-            1169: 22(i16vec4) Load 1168
-            1170: 22(i16vec4) GroupNonUniformIAdd 42 Reduce 1169
-            1171:   1150(ptr) AccessChain 34(data) 1167 57
-                              Store 1171 1170
-            1172:      6(int) Load 8(invocation)
-            1173:   1143(ptr) AccessChain 34(data) 37 57 38
-            1174: 21(int16_t) Load 1173
-            1175: 21(int16_t) GroupNonUniformIMul 42 Reduce 1174
-            1176:   1143(ptr) AccessChain 34(data) 1172 57 38
-                              Store 1176 1175
-            1177:      6(int) Load 8(invocation)
-            1178:   1150(ptr) AccessChain 34(data) 46 57
-            1179: 22(i16vec4) Load 1178
-            1180:1149(i16vec2) VectorShuffle 1179 1179 0 1
-            1181:1149(i16vec2) GroupNonUniformIMul 42 Reduce 1180
-            1182:   1150(ptr) AccessChain 34(data) 1177 57
-            1183: 22(i16vec4) Load 1182
-            1184: 22(i16vec4) VectorShuffle 1183 1181 4 5 2 3
-                              Store 1182 1184
-            1185:      6(int) Load 8(invocation)
-            1186:   1150(ptr) AccessChain 34(data) 57 57
-            1187: 22(i16vec4) Load 1186
-            1188:1159(i16vec3) VectorShuffle 1187 1187 0 1 2
-            1189:1159(i16vec3) GroupNonUniformIMul 42 Reduce 1188
-            1190:   1150(ptr) AccessChain 34(data) 1185 57
-            1191: 22(i16vec4) Load 1190
-            1192: 22(i16vec4) VectorShuffle 1191 1189 4 5 6 3
-                              Store 1190 1192
-            1193:      6(int) Load 8(invocation)
-            1194:   1150(ptr) AccessChain 34(data) 67 57
-            1195: 22(i16vec4) Load 1194
-            1196: 22(i16vec4) GroupNonUniformIMul 42 Reduce 1195
-            1197:   1150(ptr) AccessChain 34(data) 1193 57
-                              Store 1197 1196
-            1198:      6(int) Load 8(invocation)
-            1199:   1143(ptr) AccessChain 34(data) 37 57 38
-            1200: 21(int16_t) Load 1199
-            1201: 21(int16_t) GroupNonUniformSMin 42 Reduce 1200
-            1202:   1143(ptr) AccessChain 34(data) 1198 57 38
-                              Store 1202 1201
-            1203:      6(int) Load 8(invocation)
-            1204:   1150(ptr) AccessChain 34(data) 46 57
-            1205: 22(i16vec4) Load 1204
-            1206:1149(i16vec2) VectorShuffle 1205 1205 0 1
-            1207:1149(i16vec2) GroupNonUniformSMin 42 Reduce 1206
-            1208:   1150(ptr) AccessChain 34(data) 1203 57
-            1209: 22(i16vec4) Load 1208
-            1210: 22(i16vec4) VectorShuffle 1209 1207 4 5 2 3
-                              Store 1208 1210
-            1211:      6(int) Load 8(invocation)
-            1212:   1150(ptr) AccessChain 34(data) 57 57
-            1213: 22(i16vec4) Load 1212
-            1214:1159(i16vec3) VectorShuffle 1213 1213 0 1 2
-            1215:1159(i16vec3) GroupNonUniformSMin 42 Reduce 1214
-            1216:   1150(ptr) AccessChain 34(data) 1211 57
-            1217: 22(i16vec4) Load 1216
-            1218: 22(i16vec4) VectorShuffle 1217 1215 4 5 6 3
-                              Store 1216 1218
-            1219:      6(int) Load 8(invocation)
-            1220:   1150(ptr) AccessChain 34(data) 67 57
-            1221: 22(i16vec4) Load 1220
-            1222: 22(i16vec4) GroupNonUniformSMin 42 Reduce 1221
-            1223:   1150(ptr) AccessChain 34(data) 1219 57
-                              Store 1223 1222
-            1224:      6(int) Load 8(invocation)
-            1225:   1143(ptr) AccessChain 34(data) 37 57 38
-            1226: 21(int16_t) Load 1225
-            1227: 21(int16_t) GroupNonUniformSMax 42 Reduce 1226
-            1228:   1143(ptr) AccessChain 34(data) 1224 57 38
-                              Store 1228 1227
-            1229:      6(int) Load 8(invocation)
-            1230:   1150(ptr) AccessChain 34(data) 46 57
-            1231: 22(i16vec4) Load 1230
-            1232:1149(i16vec2) VectorShuffle 1231 1231 0 1
-            1233:1149(i16vec2) GroupNonUniformSMax 42 Reduce 1232
-            1234:   1150(ptr) AccessChain 34(data) 1229 57
-            1235: 22(i16vec4) Load 1234
-            1236: 22(i16vec4) VectorShuffle 1235 1233 4 5 2 3
-                              Store 1234 1236
-            1237:      6(int) Load 8(invocation)
-            1238:   1150(ptr) AccessChain 34(data) 57 57
-            1239: 22(i16vec4) Load 1238
-            1240:1159(i16vec3) VectorShuffle 1239 1239 0 1 2
-            1241:1159(i16vec3) GroupNonUniformSMax 42 Reduce 1240
-            1242:   1150(ptr) AccessChain 34(data) 1237 57
-            1243: 22(i16vec4) Load 1242
-            1244: 22(i16vec4) VectorShuffle 1243 1241 4 5 6 3
-                              Store 1242 1244
-            1245:      6(int) Load 8(invocation)
-            1246:   1150(ptr) AccessChain 34(data) 67 57
-            1247: 22(i16vec4) Load 1246
-            1248: 22(i16vec4) GroupNonUniformSMax 42 Reduce 1247
-            1249:   1150(ptr) AccessChain 34(data) 1245 57
-                              Store 1249 1248
-            1250:      6(int) Load 8(invocation)
-            1251:   1143(ptr) AccessChain 34(data) 37 57 38
-            1252: 21(int16_t) Load 1251
-            1253: 21(int16_t) GroupNonUniformBitwiseAnd 42 Reduce 1252
-            1254:   1143(ptr) AccessChain 34(data) 1250 57 38
-                              Store 1254 1253
-            1255:      6(int) Load 8(invocation)
-            1256:   1150(ptr) AccessChain 34(data) 46 57
-            1257: 22(i16vec4) Load 1256
-            1258:1149(i16vec2) VectorShuffle 1257 1257 0 1
-            1259:1149(i16vec2) GroupNonUniformBitwiseAnd 42 Reduce 1258
-            1260:   1150(ptr) AccessChain 34(data) 1255 57
-            1261: 22(i16vec4) Load 1260
-            1262: 22(i16vec4) VectorShuffle 1261 1259 4 5 2 3
-                              Store 1260 1262
-            1263:      6(int) Load 8(invocation)
-            1264:   1150(ptr) AccessChain 34(data) 57 57
-            1265: 22(i16vec4) Load 1264
-            1266:1159(i16vec3) VectorShuffle 1265 1265 0 1 2
-            1267:1159(i16vec3) GroupNonUniformBitwiseAnd 42 Reduce 1266
-            1268:   1150(ptr) AccessChain 34(data) 1263 57
-            1269: 22(i16vec4) Load 1268
-            1270: 22(i16vec4) VectorShuffle 1269 1267 4 5 6 3
-                              Store 1268 1270
-            1271:      6(int) Load 8(invocation)
-            1272:   1150(ptr) AccessChain 34(data) 67 57
-            1273: 22(i16vec4) Load 1272
-            1274: 22(i16vec4) GroupNonUniformBitwiseAnd 42 Reduce 1273
-            1275:   1150(ptr) AccessChain 34(data) 1271 57
-                              Store 1275 1274
-            1276:      6(int) Load 8(invocation)
-            1277:   1143(ptr) AccessChain 34(data) 37 57 38
-            1278: 21(int16_t) Load 1277
-            1279: 21(int16_t) GroupNonUniformBitwiseOr 42 Reduce 1278
-            1280:   1143(ptr) AccessChain 34(data) 1276 57 38
-                              Store 1280 1279
-            1281:      6(int) Load 8(invocation)
-            1282:   1150(ptr) AccessChain 34(data) 46 57
-            1283: 22(i16vec4) Load 1282
-            1284:1149(i16vec2) VectorShuffle 1283 1283 0 1
-            1285:1149(i16vec2) GroupNonUniformBitwiseOr 42 Reduce 1284
-            1286:   1150(ptr) AccessChain 34(data) 1281 57
-            1287: 22(i16vec4) Load 1286
-            1288: 22(i16vec4) VectorShuffle 1287 1285 4 5 2 3
-                              Store 1286 1288
-            1289:      6(int) Load 8(invocation)
-            1290:   1150(ptr) AccessChain 34(data) 57 57
-            1291: 22(i16vec4) Load 1290
-            1292:1159(i16vec3) VectorShuffle 1291 1291 0 1 2
-            1293:1159(i16vec3) GroupNonUniformBitwiseOr 42 Reduce 1292
-            1294:   1150(ptr) AccessChain 34(data) 1289 57
-            1295: 22(i16vec4) Load 1294
-            1296: 22(i16vec4) VectorShuffle 1295 1293 4 5 6 3
-                              Store 1294 1296
-            1297:      6(int) Load 8(invocation)
-            1298:   1150(ptr) AccessChain 34(data) 67 57
-            1299: 22(i16vec4) Load 1298
-            1300: 22(i16vec4) GroupNonUniformBitwiseOr 42 Reduce 1299
-            1301:   1150(ptr) AccessChain 34(data) 1297 57
-                              Store 1301 1300
-            1302:      6(int) Load 8(invocation)
-            1303:   1143(ptr) AccessChain 34(data) 37 57 38
-            1304: 21(int16_t) Load 1303
-            1305: 21(int16_t) GroupNonUniformBitwiseXor 42 Reduce 1304
-            1306:   1143(ptr) AccessChain 34(data) 1302 57 38
-                              Store 1306 1305
+            1168:    686(ptr) AccessChain 34(data) 46 46
+            1169:  20(i8vec4) Load 1168
+            1170: 685(i8vec2) VectorShuffle 1169 1169 0 1
+            1171: 685(i8vec2) GroupNonUniformUMin 42 ExclusiveScan 1170
+            1172:    679(ptr) AccessChain 34(data) 1167 46 38
+            1173:  19(int8_t) CompositeExtract 1171 0
+                              Store 1172 1173
+            1174:    679(ptr) AccessChain 34(data) 1167 46 55
+            1175:  19(int8_t) CompositeExtract 1171 1
+                              Store 1174 1175
+            1176:      6(int) Load 8(invocation)
+            1177:    686(ptr) AccessChain 34(data) 59 46
+            1178:  20(i8vec4) Load 1177
+            1179: 696(i8vec3) VectorShuffle 1178 1178 0 1 2
+            1180: 696(i8vec3) GroupNonUniformUMin 42 ExclusiveScan 1179
+            1181:    679(ptr) AccessChain 34(data) 1176 46 38
+            1182:  19(int8_t) CompositeExtract 1180 0
+                              Store 1181 1182
+            1183:    679(ptr) AccessChain 34(data) 1176 46 55
+            1184:  19(int8_t) CompositeExtract 1180 1
+                              Store 1183 1184
+            1185:    679(ptr) AccessChain 34(data) 1176 46 69
+            1186:  19(int8_t) CompositeExtract 1180 2
+                              Store 1185 1186
+            1187:      6(int) Load 8(invocation)
+            1188:    686(ptr) AccessChain 34(data) 73 46
+            1189:  20(i8vec4) Load 1188
+            1190:  20(i8vec4) GroupNonUniformUMin 42 ExclusiveScan 1189
+            1191:    686(ptr) AccessChain 34(data) 1187 46
+                              Store 1191 1190
+            1192:      6(int) Load 8(invocation)
+            1193:    679(ptr) AccessChain 34(data) 37 46 38
+            1194:  19(int8_t) Load 1193
+            1195:  19(int8_t) GroupNonUniformUMax 42 ExclusiveScan 1194
+            1196:    679(ptr) AccessChain 34(data) 1192 46 38
+                              Store 1196 1195
+            1197:      6(int) Load 8(invocation)
+            1198:    686(ptr) AccessChain 34(data) 46 46
+            1199:  20(i8vec4) Load 1198
+            1200: 685(i8vec2) VectorShuffle 1199 1199 0 1
+            1201: 685(i8vec2) GroupNonUniformUMax 42 ExclusiveScan 1200
+            1202:    679(ptr) AccessChain 34(data) 1197 46 38
+            1203:  19(int8_t) CompositeExtract 1201 0
+                              Store 1202 1203
+            1204:    679(ptr) AccessChain 34(data) 1197 46 55
+            1205:  19(int8_t) CompositeExtract 1201 1
+                              Store 1204 1205
+            1206:      6(int) Load 8(invocation)
+            1207:    686(ptr) AccessChain 34(data) 59 46
+            1208:  20(i8vec4) Load 1207
+            1209: 696(i8vec3) VectorShuffle 1208 1208 0 1 2
+            1210: 696(i8vec3) GroupNonUniformUMax 42 ExclusiveScan 1209
+            1211:    679(ptr) AccessChain 34(data) 1206 46 38
+            1212:  19(int8_t) CompositeExtract 1210 0
+                              Store 1211 1212
+            1213:    679(ptr) AccessChain 34(data) 1206 46 55
+            1214:  19(int8_t) CompositeExtract 1210 1
+                              Store 1213 1214
+            1215:    679(ptr) AccessChain 34(data) 1206 46 69
+            1216:  19(int8_t) CompositeExtract 1210 2
+                              Store 1215 1216
+            1217:      6(int) Load 8(invocation)
+            1218:    686(ptr) AccessChain 34(data) 73 46
+            1219:  20(i8vec4) Load 1218
+            1220:  20(i8vec4) GroupNonUniformUMax 42 ExclusiveScan 1219
+            1221:    686(ptr) AccessChain 34(data) 1217 46
+                              Store 1221 1220
+            1222:      6(int) Load 8(invocation)
+            1223:    679(ptr) AccessChain 34(data) 37 46 38
+            1224:  19(int8_t) Load 1223
+            1225:  19(int8_t) GroupNonUniformBitwiseAnd 42 ExclusiveScan 1224
+            1226:    679(ptr) AccessChain 34(data) 1222 46 38
+                              Store 1226 1225
+            1227:      6(int) Load 8(invocation)
+            1228:    686(ptr) AccessChain 34(data) 46 46
+            1229:  20(i8vec4) Load 1228
+            1230: 685(i8vec2) VectorShuffle 1229 1229 0 1
+            1231: 685(i8vec2) GroupNonUniformBitwiseAnd 42 ExclusiveScan 1230
+            1232:    679(ptr) AccessChain 34(data) 1227 46 38
+            1233:  19(int8_t) CompositeExtract 1231 0
+                              Store 1232 1233
+            1234:    679(ptr) AccessChain 34(data) 1227 46 55
+            1235:  19(int8_t) CompositeExtract 1231 1
+                              Store 1234 1235
+            1236:      6(int) Load 8(invocation)
+            1237:    686(ptr) AccessChain 34(data) 59 46
+            1238:  20(i8vec4) Load 1237
+            1239: 696(i8vec3) VectorShuffle 1238 1238 0 1 2
+            1240: 696(i8vec3) GroupNonUniformBitwiseAnd 42 ExclusiveScan 1239
+            1241:    679(ptr) AccessChain 34(data) 1236 46 38
+            1242:  19(int8_t) CompositeExtract 1240 0
+                              Store 1241 1242
+            1243:    679(ptr) AccessChain 34(data) 1236 46 55
+            1244:  19(int8_t) CompositeExtract 1240 1
+                              Store 1243 1244
+            1245:    679(ptr) AccessChain 34(data) 1236 46 69
+            1246:  19(int8_t) CompositeExtract 1240 2
+                              Store 1245 1246
+            1247:      6(int) Load 8(invocation)
+            1248:    686(ptr) AccessChain 34(data) 73 46
+            1249:  20(i8vec4) Load 1248
+            1250:  20(i8vec4) GroupNonUniformBitwiseAnd 42 ExclusiveScan 1249
+            1251:    686(ptr) AccessChain 34(data) 1247 46
+                              Store 1251 1250
+            1252:      6(int) Load 8(invocation)
+            1253:    679(ptr) AccessChain 34(data) 37 46 38
+            1254:  19(int8_t) Load 1253
+            1255:  19(int8_t) GroupNonUniformBitwiseOr 42 ExclusiveScan 1254
+            1256:    679(ptr) AccessChain 34(data) 1252 46 38
+                              Store 1256 1255
+            1257:      6(int) Load 8(invocation)
+            1258:    686(ptr) AccessChain 34(data) 46 46
+            1259:  20(i8vec4) Load 1258
+            1260: 685(i8vec2) VectorShuffle 1259 1259 0 1
+            1261: 685(i8vec2) GroupNonUniformBitwiseOr 42 ExclusiveScan 1260
+            1262:    679(ptr) AccessChain 34(data) 1257 46 38
+            1263:  19(int8_t) CompositeExtract 1261 0
+                              Store 1262 1263
+            1264:    679(ptr) AccessChain 34(data) 1257 46 55
+            1265:  19(int8_t) CompositeExtract 1261 1
+                              Store 1264 1265
+            1266:      6(int) Load 8(invocation)
+            1267:    686(ptr) AccessChain 34(data) 59 46
+            1268:  20(i8vec4) Load 1267
+            1269: 696(i8vec3) VectorShuffle 1268 1268 0 1 2
+            1270: 696(i8vec3) GroupNonUniformBitwiseOr 42 ExclusiveScan 1269
+            1271:    679(ptr) AccessChain 34(data) 1266 46 38
+            1272:  19(int8_t) CompositeExtract 1270 0
+                              Store 1271 1272
+            1273:    679(ptr) AccessChain 34(data) 1266 46 55
+            1274:  19(int8_t) CompositeExtract 1270 1
+                              Store 1273 1274
+            1275:    679(ptr) AccessChain 34(data) 1266 46 69
+            1276:  19(int8_t) CompositeExtract 1270 2
+                              Store 1275 1276
+            1277:      6(int) Load 8(invocation)
+            1278:    686(ptr) AccessChain 34(data) 73 46
+            1279:  20(i8vec4) Load 1278
+            1280:  20(i8vec4) GroupNonUniformBitwiseOr 42 ExclusiveScan 1279
+            1281:    686(ptr) AccessChain 34(data) 1277 46
+                              Store 1281 1280
+            1282:      6(int) Load 8(invocation)
+            1283:    679(ptr) AccessChain 34(data) 37 46 38
+            1284:  19(int8_t) Load 1283
+            1285:  19(int8_t) GroupNonUniformBitwiseXor 42 ExclusiveScan 1284
+            1286:    679(ptr) AccessChain 34(data) 1282 46 38
+                              Store 1286 1285
+            1287:      6(int) Load 8(invocation)
+            1288:    686(ptr) AccessChain 34(data) 46 46
+            1289:  20(i8vec4) Load 1288
+            1290: 685(i8vec2) VectorShuffle 1289 1289 0 1
+            1291: 685(i8vec2) GroupNonUniformBitwiseXor 42 ExclusiveScan 1290
+            1292:    679(ptr) AccessChain 34(data) 1287 46 38
+            1293:  19(int8_t) CompositeExtract 1291 0
+                              Store 1292 1293
+            1294:    679(ptr) AccessChain 34(data) 1287 46 55
+            1295:  19(int8_t) CompositeExtract 1291 1
+                              Store 1294 1295
+            1296:      6(int) Load 8(invocation)
+            1297:    686(ptr) AccessChain 34(data) 59 46
+            1298:  20(i8vec4) Load 1297
+            1299: 696(i8vec3) VectorShuffle 1298 1298 0 1 2
+            1300: 696(i8vec3) GroupNonUniformBitwiseXor 42 ExclusiveScan 1299
+            1301:    679(ptr) AccessChain 34(data) 1296 46 38
+            1302:  19(int8_t) CompositeExtract 1300 0
+                              Store 1301 1302
+            1303:    679(ptr) AccessChain 34(data) 1296 46 55
+            1304:  19(int8_t) CompositeExtract 1300 1
+                              Store 1303 1304
+            1305:    679(ptr) AccessChain 34(data) 1296 46 69
+            1306:  19(int8_t) CompositeExtract 1300 2
+                              Store 1305 1306
             1307:      6(int) Load 8(invocation)
-            1308:   1150(ptr) AccessChain 34(data) 46 57
-            1309: 22(i16vec4) Load 1308
-            1310:1149(i16vec2) VectorShuffle 1309 1309 0 1
-            1311:1149(i16vec2) GroupNonUniformBitwiseXor 42 Reduce 1310
-            1312:   1150(ptr) AccessChain 34(data) 1307 57
-            1313: 22(i16vec4) Load 1312
-            1314: 22(i16vec4) VectorShuffle 1313 1311 4 5 2 3
-                              Store 1312 1314
-            1315:      6(int) Load 8(invocation)
-            1316:   1150(ptr) AccessChain 34(data) 57 57
-            1317: 22(i16vec4) Load 1316
-            1318:1159(i16vec3) VectorShuffle 1317 1317 0 1 2
-            1319:1159(i16vec3) GroupNonUniformBitwiseXor 42 Reduce 1318
-            1320:   1150(ptr) AccessChain 34(data) 1315 57
-            1321: 22(i16vec4) Load 1320
-            1322: 22(i16vec4) VectorShuffle 1321 1319 4 5 6 3
-                              Store 1320 1322
-            1323:      6(int) Load 8(invocation)
-            1324:   1150(ptr) AccessChain 34(data) 67 57
-            1325: 22(i16vec4) Load 1324
-            1326: 22(i16vec4) GroupNonUniformBitwiseXor 42 Reduce 1325
-            1327:   1150(ptr) AccessChain 34(data) 1323 57
-                              Store 1327 1326
-            1328:      6(int) Load 8(invocation)
-            1329:   1143(ptr) AccessChain 34(data) 37 57 38
-            1330: 21(int16_t) Load 1329
-            1331: 21(int16_t) GroupNonUniformIAdd 42 InclusiveScan 1330
-            1332:   1143(ptr) AccessChain 34(data) 1328 57 38
-                              Store 1332 1331
-            1333:      6(int) Load 8(invocation)
-            1334:   1150(ptr) AccessChain 34(data) 46 57
-            1335: 22(i16vec4) Load 1334
-            1336:1149(i16vec2) VectorShuffle 1335 1335 0 1
-            1337:1149(i16vec2) GroupNonUniformIAdd 42 InclusiveScan 1336
-            1338:   1150(ptr) AccessChain 34(data) 1333 57
-            1339: 22(i16vec4) Load 1338
-            1340: 22(i16vec4) VectorShuffle 1339 1337 4 5 2 3
-                              Store 1338 1340
+            1308:    686(ptr) AccessChain 34(data) 73 46
+            1309:  20(i8vec4) Load 1308
+            1310:  20(i8vec4) GroupNonUniformBitwiseXor 42 ExclusiveScan 1309
+            1311:    686(ptr) AccessChain 34(data) 1307 46
+                              Store 1311 1310
+            1312:      6(int) Load 8(invocation)
+            1314:   1313(ptr) AccessChain 34(data) 37 59 38
+            1315: 21(int16_t) Load 1314
+            1316: 21(int16_t) GroupNonUniformIAdd 42 Reduce 1315
+            1317:   1313(ptr) AccessChain 34(data) 1312 59 38
+                              Store 1317 1316
+            1318:      6(int) Load 8(invocation)
+            1321:   1320(ptr) AccessChain 34(data) 46 59
+            1322: 22(i16vec4) Load 1321
+            1323:1319(i16vec2) VectorShuffle 1322 1322 0 1
+            1324:1319(i16vec2) GroupNonUniformIAdd 42 Reduce 1323
+            1325:   1313(ptr) AccessChain 34(data) 1318 59 38
+            1326: 21(int16_t) CompositeExtract 1324 0
+                              Store 1325 1326
+            1327:   1313(ptr) AccessChain 34(data) 1318 59 55
+            1328: 21(int16_t) CompositeExtract 1324 1
+                              Store 1327 1328
+            1329:      6(int) Load 8(invocation)
+            1331:   1320(ptr) AccessChain 34(data) 59 59
+            1332: 22(i16vec4) Load 1331
+            1333:1330(i16vec3) VectorShuffle 1332 1332 0 1 2
+            1334:1330(i16vec3) GroupNonUniformIAdd 42 Reduce 1333
+            1335:   1313(ptr) AccessChain 34(data) 1329 59 38
+            1336: 21(int16_t) CompositeExtract 1334 0
+                              Store 1335 1336
+            1337:   1313(ptr) AccessChain 34(data) 1329 59 55
+            1338: 21(int16_t) CompositeExtract 1334 1
+                              Store 1337 1338
+            1339:   1313(ptr) AccessChain 34(data) 1329 59 69
+            1340: 21(int16_t) CompositeExtract 1334 2
+                              Store 1339 1340
             1341:      6(int) Load 8(invocation)
-            1342:   1150(ptr) AccessChain 34(data) 57 57
+            1342:   1320(ptr) AccessChain 34(data) 73 59
             1343: 22(i16vec4) Load 1342
-            1344:1159(i16vec3) VectorShuffle 1343 1343 0 1 2
-            1345:1159(i16vec3) GroupNonUniformIAdd 42 InclusiveScan 1344
-            1346:   1150(ptr) AccessChain 34(data) 1341 57
-            1347: 22(i16vec4) Load 1346
-            1348: 22(i16vec4) VectorShuffle 1347 1345 4 5 6 3
-                              Store 1346 1348
-            1349:      6(int) Load 8(invocation)
-            1350:   1150(ptr) AccessChain 34(data) 67 57
-            1351: 22(i16vec4) Load 1350
-            1352: 22(i16vec4) GroupNonUniformIAdd 42 InclusiveScan 1351
-            1353:   1150(ptr) AccessChain 34(data) 1349 57
-                              Store 1353 1352
-            1354:      6(int) Load 8(invocation)
-            1355:   1143(ptr) AccessChain 34(data) 37 57 38
-            1356: 21(int16_t) Load 1355
-            1357: 21(int16_t) GroupNonUniformIMul 42 InclusiveScan 1356
-            1358:   1143(ptr) AccessChain 34(data) 1354 57 38
-                              Store 1358 1357
-            1359:      6(int) Load 8(invocation)
-            1360:   1150(ptr) AccessChain 34(data) 46 57
-            1361: 22(i16vec4) Load 1360
-            1362:1149(i16vec2) VectorShuffle 1361 1361 0 1
-            1363:1149(i16vec2) GroupNonUniformIMul 42 InclusiveScan 1362
-            1364:   1150(ptr) AccessChain 34(data) 1359 57
-            1365: 22(i16vec4) Load 1364
-            1366: 22(i16vec4) VectorShuffle 1365 1363 4 5 2 3
-                              Store 1364 1366
-            1367:      6(int) Load 8(invocation)
-            1368:   1150(ptr) AccessChain 34(data) 57 57
-            1369: 22(i16vec4) Load 1368
-            1370:1159(i16vec3) VectorShuffle 1369 1369 0 1 2
-            1371:1159(i16vec3) GroupNonUniformIMul 42 InclusiveScan 1370
-            1372:   1150(ptr) AccessChain 34(data) 1367 57
+            1344: 22(i16vec4) GroupNonUniformIAdd 42 Reduce 1343
+            1345:   1320(ptr) AccessChain 34(data) 1341 59
+                              Store 1345 1344
+            1346:      6(int) Load 8(invocation)
+            1347:   1313(ptr) AccessChain 34(data) 37 59 38
+            1348: 21(int16_t) Load 1347
+            1349: 21(int16_t) GroupNonUniformIMul 42 Reduce 1348
+            1350:   1313(ptr) AccessChain 34(data) 1346 59 38
+                              Store 1350 1349
+            1351:      6(int) Load 8(invocation)
+            1352:   1320(ptr) AccessChain 34(data) 46 59
+            1353: 22(i16vec4) Load 1352
+            1354:1319(i16vec2) VectorShuffle 1353 1353 0 1
+            1355:1319(i16vec2) GroupNonUniformIMul 42 Reduce 1354
+            1356:   1313(ptr) AccessChain 34(data) 1351 59 38
+            1357: 21(int16_t) CompositeExtract 1355 0
+                              Store 1356 1357
+            1358:   1313(ptr) AccessChain 34(data) 1351 59 55
+            1359: 21(int16_t) CompositeExtract 1355 1
+                              Store 1358 1359
+            1360:      6(int) Load 8(invocation)
+            1361:   1320(ptr) AccessChain 34(data) 59 59
+            1362: 22(i16vec4) Load 1361
+            1363:1330(i16vec3) VectorShuffle 1362 1362 0 1 2
+            1364:1330(i16vec3) GroupNonUniformIMul 42 Reduce 1363
+            1365:   1313(ptr) AccessChain 34(data) 1360 59 38
+            1366: 21(int16_t) CompositeExtract 1364 0
+                              Store 1365 1366
+            1367:   1313(ptr) AccessChain 34(data) 1360 59 55
+            1368: 21(int16_t) CompositeExtract 1364 1
+                              Store 1367 1368
+            1369:   1313(ptr) AccessChain 34(data) 1360 59 69
+            1370: 21(int16_t) CompositeExtract 1364 2
+                              Store 1369 1370
+            1371:      6(int) Load 8(invocation)
+            1372:   1320(ptr) AccessChain 34(data) 73 59
             1373: 22(i16vec4) Load 1372
-            1374: 22(i16vec4) VectorShuffle 1373 1371 4 5 6 3
-                              Store 1372 1374
-            1375:      6(int) Load 8(invocation)
-            1376:   1150(ptr) AccessChain 34(data) 67 57
-            1377: 22(i16vec4) Load 1376
-            1378: 22(i16vec4) GroupNonUniformIMul 42 InclusiveScan 1377
-            1379:   1150(ptr) AccessChain 34(data) 1375 57
-                              Store 1379 1378
-            1380:      6(int) Load 8(invocation)
-            1381:   1143(ptr) AccessChain 34(data) 37 57 38
-            1382: 21(int16_t) Load 1381
-            1383: 21(int16_t) GroupNonUniformSMin 42 InclusiveScan 1382
-            1384:   1143(ptr) AccessChain 34(data) 1380 57 38
-                              Store 1384 1383
-            1385:      6(int) Load 8(invocation)
-            1386:   1150(ptr) AccessChain 34(data) 46 57
-            1387: 22(i16vec4) Load 1386
-            1388:1149(i16vec2) VectorShuffle 1387 1387 0 1
-            1389:1149(i16vec2) GroupNonUniformSMin 42 InclusiveScan 1388
-            1390:   1150(ptr) AccessChain 34(data) 1385 57
-            1391: 22(i16vec4) Load 1390
-            1392: 22(i16vec4) VectorShuffle 1391 1389 4 5 2 3
-                              Store 1390 1392
-            1393:      6(int) Load 8(invocation)
-            1394:   1150(ptr) AccessChain 34(data) 57 57
-            1395: 22(i16vec4) Load 1394
-            1396:1159(i16vec3) VectorShuffle 1395 1395 0 1 2
-            1397:1159(i16vec3) GroupNonUniformSMin 42 InclusiveScan 1396
-            1398:   1150(ptr) AccessChain 34(data) 1393 57
-            1399: 22(i16vec4) Load 1398
-            1400: 22(i16vec4) VectorShuffle 1399 1397 4 5 6 3
-                              Store 1398 1400
+            1374: 22(i16vec4) GroupNonUniformIMul 42 Reduce 1373
+            1375:   1320(ptr) AccessChain 34(data) 1371 59
+                              Store 1375 1374
+            1376:      6(int) Load 8(invocation)
+            1377:   1313(ptr) AccessChain 34(data) 37 59 38
+            1378: 21(int16_t) Load 1377
+            1379: 21(int16_t) GroupNonUniformSMin 42 Reduce 1378
+            1380:   1313(ptr) AccessChain 34(data) 1376 59 38
+                              Store 1380 1379
+            1381:      6(int) Load 8(invocation)
+            1382:   1320(ptr) AccessChain 34(data) 46 59
+            1383: 22(i16vec4) Load 1382
+            1384:1319(i16vec2) VectorShuffle 1383 1383 0 1
+            1385:1319(i16vec2) GroupNonUniformSMin 42 Reduce 1384
+            1386:   1313(ptr) AccessChain 34(data) 1381 59 38
+            1387: 21(int16_t) CompositeExtract 1385 0
+                              Store 1386 1387
+            1388:   1313(ptr) AccessChain 34(data) 1381 59 55
+            1389: 21(int16_t) CompositeExtract 1385 1
+                              Store 1388 1389
+            1390:      6(int) Load 8(invocation)
+            1391:   1320(ptr) AccessChain 34(data) 59 59
+            1392: 22(i16vec4) Load 1391
+            1393:1330(i16vec3) VectorShuffle 1392 1392 0 1 2
+            1394:1330(i16vec3) GroupNonUniformSMin 42 Reduce 1393
+            1395:   1313(ptr) AccessChain 34(data) 1390 59 38
+            1396: 21(int16_t) CompositeExtract 1394 0
+                              Store 1395 1396
+            1397:   1313(ptr) AccessChain 34(data) 1390 59 55
+            1398: 21(int16_t) CompositeExtract 1394 1
+                              Store 1397 1398
+            1399:   1313(ptr) AccessChain 34(data) 1390 59 69
+            1400: 21(int16_t) CompositeExtract 1394 2
+                              Store 1399 1400
             1401:      6(int) Load 8(invocation)
-            1402:   1150(ptr) AccessChain 34(data) 67 57
+            1402:   1320(ptr) AccessChain 34(data) 73 59
             1403: 22(i16vec4) Load 1402
-            1404: 22(i16vec4) GroupNonUniformSMin 42 InclusiveScan 1403
-            1405:   1150(ptr) AccessChain 34(data) 1401 57
+            1404: 22(i16vec4) GroupNonUniformSMin 42 Reduce 1403
+            1405:   1320(ptr) AccessChain 34(data) 1401 59
                               Store 1405 1404
             1406:      6(int) Load 8(invocation)
-            1407:   1143(ptr) AccessChain 34(data) 37 57 38
+            1407:   1313(ptr) AccessChain 34(data) 37 59 38
             1408: 21(int16_t) Load 1407
-            1409: 21(int16_t) GroupNonUniformSMax 42 InclusiveScan 1408
-            1410:   1143(ptr) AccessChain 34(data) 1406 57 38
+            1409: 21(int16_t) GroupNonUniformSMax 42 Reduce 1408
+            1410:   1313(ptr) AccessChain 34(data) 1406 59 38
                               Store 1410 1409
             1411:      6(int) Load 8(invocation)
-            1412:   1150(ptr) AccessChain 34(data) 46 57
+            1412:   1320(ptr) AccessChain 34(data) 46 59
             1413: 22(i16vec4) Load 1412
-            1414:1149(i16vec2) VectorShuffle 1413 1413 0 1
-            1415:1149(i16vec2) GroupNonUniformSMax 42 InclusiveScan 1414
-            1416:   1150(ptr) AccessChain 34(data) 1411 57
-            1417: 22(i16vec4) Load 1416
-            1418: 22(i16vec4) VectorShuffle 1417 1415 4 5 2 3
-                              Store 1416 1418
-            1419:      6(int) Load 8(invocation)
-            1420:   1150(ptr) AccessChain 34(data) 57 57
-            1421: 22(i16vec4) Load 1420
-            1422:1159(i16vec3) VectorShuffle 1421 1421 0 1 2
-            1423:1159(i16vec3) GroupNonUniformSMax 42 InclusiveScan 1422
-            1424:   1150(ptr) AccessChain 34(data) 1419 57
-            1425: 22(i16vec4) Load 1424
-            1426: 22(i16vec4) VectorShuffle 1425 1423 4 5 6 3
-                              Store 1424 1426
-            1427:      6(int) Load 8(invocation)
-            1428:   1150(ptr) AccessChain 34(data) 67 57
-            1429: 22(i16vec4) Load 1428
-            1430: 22(i16vec4) GroupNonUniformSMax 42 InclusiveScan 1429
-            1431:   1150(ptr) AccessChain 34(data) 1427 57
-                              Store 1431 1430
-            1432:      6(int) Load 8(invocation)
-            1433:   1143(ptr) AccessChain 34(data) 37 57 38
-            1434: 21(int16_t) Load 1433
-            1435: 21(int16_t) GroupNonUniformBitwiseAnd 42 InclusiveScan 1434
-            1436:   1143(ptr) AccessChain 34(data) 1432 57 38
-                              Store 1436 1435
-            1437:      6(int) Load 8(invocation)
-            1438:   1150(ptr) AccessChain 34(data) 46 57
-            1439: 22(i16vec4) Load 1438
-            1440:1149(i16vec2) VectorShuffle 1439 1439 0 1
-            1441:1149(i16vec2) GroupNonUniformBitwiseAnd 42 InclusiveScan 1440
-            1442:   1150(ptr) AccessChain 34(data) 1437 57
+            1414:1319(i16vec2) VectorShuffle 1413 1413 0 1
+            1415:1319(i16vec2) GroupNonUniformSMax 42 Reduce 1414
+            1416:   1313(ptr) AccessChain 34(data) 1411 59 38
+            1417: 21(int16_t) CompositeExtract 1415 0
+                              Store 1416 1417
+            1418:   1313(ptr) AccessChain 34(data) 1411 59 55
+            1419: 21(int16_t) CompositeExtract 1415 1
+                              Store 1418 1419
+            1420:      6(int) Load 8(invocation)
+            1421:   1320(ptr) AccessChain 34(data) 59 59
+            1422: 22(i16vec4) Load 1421
+            1423:1330(i16vec3) VectorShuffle 1422 1422 0 1 2
+            1424:1330(i16vec3) GroupNonUniformSMax 42 Reduce 1423
+            1425:   1313(ptr) AccessChain 34(data) 1420 59 38
+            1426: 21(int16_t) CompositeExtract 1424 0
+                              Store 1425 1426
+            1427:   1313(ptr) AccessChain 34(data) 1420 59 55
+            1428: 21(int16_t) CompositeExtract 1424 1
+                              Store 1427 1428
+            1429:   1313(ptr) AccessChain 34(data) 1420 59 69
+            1430: 21(int16_t) CompositeExtract 1424 2
+                              Store 1429 1430
+            1431:      6(int) Load 8(invocation)
+            1432:   1320(ptr) AccessChain 34(data) 73 59
+            1433: 22(i16vec4) Load 1432
+            1434: 22(i16vec4) GroupNonUniformSMax 42 Reduce 1433
+            1435:   1320(ptr) AccessChain 34(data) 1431 59
+                              Store 1435 1434
+            1436:      6(int) Load 8(invocation)
+            1437:   1313(ptr) AccessChain 34(data) 37 59 38
+            1438: 21(int16_t) Load 1437
+            1439: 21(int16_t) GroupNonUniformBitwiseAnd 42 Reduce 1438
+            1440:   1313(ptr) AccessChain 34(data) 1436 59 38
+                              Store 1440 1439
+            1441:      6(int) Load 8(invocation)
+            1442:   1320(ptr) AccessChain 34(data) 46 59
             1443: 22(i16vec4) Load 1442
-            1444: 22(i16vec4) VectorShuffle 1443 1441 4 5 2 3
-                              Store 1442 1444
-            1445:      6(int) Load 8(invocation)
-            1446:   1150(ptr) AccessChain 34(data) 57 57
-            1447: 22(i16vec4) Load 1446
-            1448:1159(i16vec3) VectorShuffle 1447 1447 0 1 2
-            1449:1159(i16vec3) GroupNonUniformBitwiseAnd 42 InclusiveScan 1448
-            1450:   1150(ptr) AccessChain 34(data) 1445 57
-            1451: 22(i16vec4) Load 1450
-            1452: 22(i16vec4) VectorShuffle 1451 1449 4 5 6 3
-                              Store 1450 1452
-            1453:      6(int) Load 8(invocation)
-            1454:   1150(ptr) AccessChain 34(data) 67 57
-            1455: 22(i16vec4) Load 1454
-            1456: 22(i16vec4) GroupNonUniformBitwiseAnd 42 InclusiveScan 1455
-            1457:   1150(ptr) AccessChain 34(data) 1453 57
-                              Store 1457 1456
-            1458:      6(int) Load 8(invocation)
-            1459:   1143(ptr) AccessChain 34(data) 37 57 38
-            1460: 21(int16_t) Load 1459
-            1461: 21(int16_t) GroupNonUniformBitwiseOr 42 InclusiveScan 1460
-            1462:   1143(ptr) AccessChain 34(data) 1458 57 38
-                              Store 1462 1461
-            1463:      6(int) Load 8(invocation)
-            1464:   1150(ptr) AccessChain 34(data) 46 57
-            1465: 22(i16vec4) Load 1464
-            1466:1149(i16vec2) VectorShuffle 1465 1465 0 1
-            1467:1149(i16vec2) GroupNonUniformBitwiseOr 42 InclusiveScan 1466
-            1468:   1150(ptr) AccessChain 34(data) 1463 57
-            1469: 22(i16vec4) Load 1468
-            1470: 22(i16vec4) VectorShuffle 1469 1467 4 5 2 3
-                              Store 1468 1470
+            1444:1319(i16vec2) VectorShuffle 1443 1443 0 1
+            1445:1319(i16vec2) GroupNonUniformBitwiseAnd 42 Reduce 1444
+            1446:   1313(ptr) AccessChain 34(data) 1441 59 38
+            1447: 21(int16_t) CompositeExtract 1445 0
+                              Store 1446 1447
+            1448:   1313(ptr) AccessChain 34(data) 1441 59 55
+            1449: 21(int16_t) CompositeExtract 1445 1
+                              Store 1448 1449
+            1450:      6(int) Load 8(invocation)
+            1451:   1320(ptr) AccessChain 34(data) 59 59
+            1452: 22(i16vec4) Load 1451
+            1453:1330(i16vec3) VectorShuffle 1452 1452 0 1 2
+            1454:1330(i16vec3) GroupNonUniformBitwiseAnd 42 Reduce 1453
+            1455:   1313(ptr) AccessChain 34(data) 1450 59 38
+            1456: 21(int16_t) CompositeExtract 1454 0
+                              Store 1455 1456
+            1457:   1313(ptr) AccessChain 34(data) 1450 59 55
+            1458: 21(int16_t) CompositeExtract 1454 1
+                              Store 1457 1458
+            1459:   1313(ptr) AccessChain 34(data) 1450 59 69
+            1460: 21(int16_t) CompositeExtract 1454 2
+                              Store 1459 1460
+            1461:      6(int) Load 8(invocation)
+            1462:   1320(ptr) AccessChain 34(data) 73 59
+            1463: 22(i16vec4) Load 1462
+            1464: 22(i16vec4) GroupNonUniformBitwiseAnd 42 Reduce 1463
+            1465:   1320(ptr) AccessChain 34(data) 1461 59
+                              Store 1465 1464
+            1466:      6(int) Load 8(invocation)
+            1467:   1313(ptr) AccessChain 34(data) 37 59 38
+            1468: 21(int16_t) Load 1467
+            1469: 21(int16_t) GroupNonUniformBitwiseOr 42 Reduce 1468
+            1470:   1313(ptr) AccessChain 34(data) 1466 59 38
+                              Store 1470 1469
             1471:      6(int) Load 8(invocation)
-            1472:   1150(ptr) AccessChain 34(data) 57 57
+            1472:   1320(ptr) AccessChain 34(data) 46 59
             1473: 22(i16vec4) Load 1472
-            1474:1159(i16vec3) VectorShuffle 1473 1473 0 1 2
-            1475:1159(i16vec3) GroupNonUniformBitwiseOr 42 InclusiveScan 1474
-            1476:   1150(ptr) AccessChain 34(data) 1471 57
-            1477: 22(i16vec4) Load 1476
-            1478: 22(i16vec4) VectorShuffle 1477 1475 4 5 6 3
-                              Store 1476 1478
-            1479:      6(int) Load 8(invocation)
-            1480:   1150(ptr) AccessChain 34(data) 67 57
-            1481: 22(i16vec4) Load 1480
-            1482: 22(i16vec4) GroupNonUniformBitwiseOr 42 InclusiveScan 1481
-            1483:   1150(ptr) AccessChain 34(data) 1479 57
-                              Store 1483 1482
-            1484:      6(int) Load 8(invocation)
-            1485:   1143(ptr) AccessChain 34(data) 37 57 38
-            1486: 21(int16_t) Load 1485
-            1487: 21(int16_t) GroupNonUniformBitwiseXor 42 InclusiveScan 1486
-            1488:   1143(ptr) AccessChain 34(data) 1484 57 38
-                              Store 1488 1487
-            1489:      6(int) Load 8(invocation)
-            1490:   1150(ptr) AccessChain 34(data) 46 57
-            1491: 22(i16vec4) Load 1490
-            1492:1149(i16vec2) VectorShuffle 1491 1491 0 1
-            1493:1149(i16vec2) GroupNonUniformBitwiseXor 42 InclusiveScan 1492
-            1494:   1150(ptr) AccessChain 34(data) 1489 57
-            1495: 22(i16vec4) Load 1494
-            1496: 22(i16vec4) VectorShuffle 1495 1493 4 5 2 3
-                              Store 1494 1496
-            1497:      6(int) Load 8(invocation)
-            1498:   1150(ptr) AccessChain 34(data) 57 57
-            1499: 22(i16vec4) Load 1498
-            1500:1159(i16vec3) VectorShuffle 1499 1499 0 1 2
-            1501:1159(i16vec3) GroupNonUniformBitwiseXor 42 InclusiveScan 1500
-            1502:   1150(ptr) AccessChain 34(data) 1497 57
+            1474:1319(i16vec2) VectorShuffle 1473 1473 0 1
+            1475:1319(i16vec2) GroupNonUniformBitwiseOr 42 Reduce 1474
+            1476:   1313(ptr) AccessChain 34(data) 1471 59 38
+            1477: 21(int16_t) CompositeExtract 1475 0
+                              Store 1476 1477
+            1478:   1313(ptr) AccessChain 34(data) 1471 59 55
+            1479: 21(int16_t) CompositeExtract 1475 1
+                              Store 1478 1479
+            1480:      6(int) Load 8(invocation)
+            1481:   1320(ptr) AccessChain 34(data) 59 59
+            1482: 22(i16vec4) Load 1481
+            1483:1330(i16vec3) VectorShuffle 1482 1482 0 1 2
+            1484:1330(i16vec3) GroupNonUniformBitwiseOr 42 Reduce 1483
+            1485:   1313(ptr) AccessChain 34(data) 1480 59 38
+            1486: 21(int16_t) CompositeExtract 1484 0
+                              Store 1485 1486
+            1487:   1313(ptr) AccessChain 34(data) 1480 59 55
+            1488: 21(int16_t) CompositeExtract 1484 1
+                              Store 1487 1488
+            1489:   1313(ptr) AccessChain 34(data) 1480 59 69
+            1490: 21(int16_t) CompositeExtract 1484 2
+                              Store 1489 1490
+            1491:      6(int) Load 8(invocation)
+            1492:   1320(ptr) AccessChain 34(data) 73 59
+            1493: 22(i16vec4) Load 1492
+            1494: 22(i16vec4) GroupNonUniformBitwiseOr 42 Reduce 1493
+            1495:   1320(ptr) AccessChain 34(data) 1491 59
+                              Store 1495 1494
+            1496:      6(int) Load 8(invocation)
+            1497:   1313(ptr) AccessChain 34(data) 37 59 38
+            1498: 21(int16_t) Load 1497
+            1499: 21(int16_t) GroupNonUniformBitwiseXor 42 Reduce 1498
+            1500:   1313(ptr) AccessChain 34(data) 1496 59 38
+                              Store 1500 1499
+            1501:      6(int) Load 8(invocation)
+            1502:   1320(ptr) AccessChain 34(data) 46 59
             1503: 22(i16vec4) Load 1502
-            1504: 22(i16vec4) VectorShuffle 1503 1501 4 5 6 3
-                              Store 1502 1504
-            1505:      6(int) Load 8(invocation)
-            1506:   1150(ptr) AccessChain 34(data) 67 57
-            1507: 22(i16vec4) Load 1506
-            1508: 22(i16vec4) GroupNonUniformBitwiseXor 42 InclusiveScan 1507
-            1509:   1150(ptr) AccessChain 34(data) 1505 57
-                              Store 1509 1508
+            1504:1319(i16vec2) VectorShuffle 1503 1503 0 1
+            1505:1319(i16vec2) GroupNonUniformBitwiseXor 42 Reduce 1504
+            1506:   1313(ptr) AccessChain 34(data) 1501 59 38
+            1507: 21(int16_t) CompositeExtract 1505 0
+                              Store 1506 1507
+            1508:   1313(ptr) AccessChain 34(data) 1501 59 55
+            1509: 21(int16_t) CompositeExtract 1505 1
+                              Store 1508 1509
             1510:      6(int) Load 8(invocation)
-            1511:   1143(ptr) AccessChain 34(data) 37 57 38
-            1512: 21(int16_t) Load 1511
-            1513: 21(int16_t) GroupNonUniformIAdd 42 ExclusiveScan 1512
-            1514:   1143(ptr) AccessChain 34(data) 1510 57 38
-                              Store 1514 1513
-            1515:      6(int) Load 8(invocation)
-            1516:   1150(ptr) AccessChain 34(data) 46 57
-            1517: 22(i16vec4) Load 1516
-            1518:1149(i16vec2) VectorShuffle 1517 1517 0 1
-            1519:1149(i16vec2) GroupNonUniformIAdd 42 ExclusiveScan 1518
-            1520:   1150(ptr) AccessChain 34(data) 1515 57
-            1521: 22(i16vec4) Load 1520
-            1522: 22(i16vec4) VectorShuffle 1521 1519 4 5 2 3
-                              Store 1520 1522
-            1523:      6(int) Load 8(invocation)
-            1524:   1150(ptr) AccessChain 34(data) 57 57
-            1525: 22(i16vec4) Load 1524
-            1526:1159(i16vec3) VectorShuffle 1525 1525 0 1 2
-            1527:1159(i16vec3) GroupNonUniformIAdd 42 ExclusiveScan 1526
-            1528:   1150(ptr) AccessChain 34(data) 1523 57
-            1529: 22(i16vec4) Load 1528
-            1530: 22(i16vec4) VectorShuffle 1529 1527 4 5 6 3
-                              Store 1528 1530
+            1511:   1320(ptr) AccessChain 34(data) 59 59
+            1512: 22(i16vec4) Load 1511
+            1513:1330(i16vec3) VectorShuffle 1512 1512 0 1 2
+            1514:1330(i16vec3) GroupNonUniformBitwiseXor 42 Reduce 1513
+            1515:   1313(ptr) AccessChain 34(data) 1510 59 38
+            1516: 21(int16_t) CompositeExtract 1514 0
+                              Store 1515 1516
+            1517:   1313(ptr) AccessChain 34(data) 1510 59 55
+            1518: 21(int16_t) CompositeExtract 1514 1
+                              Store 1517 1518
+            1519:   1313(ptr) AccessChain 34(data) 1510 59 69
+            1520: 21(int16_t) CompositeExtract 1514 2
+                              Store 1519 1520
+            1521:      6(int) Load 8(invocation)
+            1522:   1320(ptr) AccessChain 34(data) 73 59
+            1523: 22(i16vec4) Load 1522
+            1524: 22(i16vec4) GroupNonUniformBitwiseXor 42 Reduce 1523
+            1525:   1320(ptr) AccessChain 34(data) 1521 59
+                              Store 1525 1524
+            1526:      6(int) Load 8(invocation)
+            1527:   1313(ptr) AccessChain 34(data) 37 59 38
+            1528: 21(int16_t) Load 1527
+            1529: 21(int16_t) GroupNonUniformIAdd 42 InclusiveScan 1528
+            1530:   1313(ptr) AccessChain 34(data) 1526 59 38
+                              Store 1530 1529
             1531:      6(int) Load 8(invocation)
-            1532:   1150(ptr) AccessChain 34(data) 67 57
+            1532:   1320(ptr) AccessChain 34(data) 46 59
             1533: 22(i16vec4) Load 1532
-            1534: 22(i16vec4) GroupNonUniformIAdd 42 ExclusiveScan 1533
-            1535:   1150(ptr) AccessChain 34(data) 1531 57
-                              Store 1535 1534
-            1536:      6(int) Load 8(invocation)
-            1537:   1143(ptr) AccessChain 34(data) 37 57 38
-            1538: 21(int16_t) Load 1537
-            1539: 21(int16_t) GroupNonUniformIMul 42 ExclusiveScan 1538
-            1540:   1143(ptr) AccessChain 34(data) 1536 57 38
-                              Store 1540 1539
-            1541:      6(int) Load 8(invocation)
-            1542:   1150(ptr) AccessChain 34(data) 46 57
-            1543: 22(i16vec4) Load 1542
-            1544:1149(i16vec2) VectorShuffle 1543 1543 0 1
-            1545:1149(i16vec2) GroupNonUniformIMul 42 ExclusiveScan 1544
-            1546:   1150(ptr) AccessChain 34(data) 1541 57
-            1547: 22(i16vec4) Load 1546
-            1548: 22(i16vec4) VectorShuffle 1547 1545 4 5 2 3
-                              Store 1546 1548
-            1549:      6(int) Load 8(invocation)
-            1550:   1150(ptr) AccessChain 34(data) 57 57
-            1551: 22(i16vec4) Load 1550
-            1552:1159(i16vec3) VectorShuffle 1551 1551 0 1 2
-            1553:1159(i16vec3) GroupNonUniformIMul 42 ExclusiveScan 1552
-            1554:   1150(ptr) AccessChain 34(data) 1549 57
-            1555: 22(i16vec4) Load 1554
-            1556: 22(i16vec4) VectorShuffle 1555 1553 4 5 6 3
-                              Store 1554 1556
-            1557:      6(int) Load 8(invocation)
-            1558:   1150(ptr) AccessChain 34(data) 67 57
-            1559: 22(i16vec4) Load 1558
-            1560: 22(i16vec4) GroupNonUniformIMul 42 ExclusiveScan 1559
-            1561:   1150(ptr) AccessChain 34(data) 1557 57
-                              Store 1561 1560
-            1562:      6(int) Load 8(invocation)
-            1563:   1143(ptr) AccessChain 34(data) 37 57 38
-            1564: 21(int16_t) Load 1563
-            1565: 21(int16_t) GroupNonUniformSMin 42 ExclusiveScan 1564
-            1566:   1143(ptr) AccessChain 34(data) 1562 57 38
-                              Store 1566 1565
-            1567:      6(int) Load 8(invocation)
-            1568:   1150(ptr) AccessChain 34(data) 46 57
-            1569: 22(i16vec4) Load 1568
-            1570:1149(i16vec2) VectorShuffle 1569 1569 0 1
-            1571:1149(i16vec2) GroupNonUniformSMin 42 ExclusiveScan 1570
-            1572:   1150(ptr) AccessChain 34(data) 1567 57
-            1573: 22(i16vec4) Load 1572
-            1574: 22(i16vec4) VectorShuffle 1573 1571 4 5 2 3
-                              Store 1572 1574
-            1575:      6(int) Load 8(invocation)
-            1576:   1150(ptr) AccessChain 34(data) 57 57
-            1577: 22(i16vec4) Load 1576
-            1578:1159(i16vec3) VectorShuffle 1577 1577 0 1 2
-            1579:1159(i16vec3) GroupNonUniformSMin 42 ExclusiveScan 1578
-            1580:   1150(ptr) AccessChain 34(data) 1575 57
-            1581: 22(i16vec4) Load 1580
-            1582: 22(i16vec4) VectorShuffle 1581 1579 4 5 6 3
-                              Store 1580 1582
-            1583:      6(int) Load 8(invocation)
-            1584:   1150(ptr) AccessChain 34(data) 67 57
-            1585: 22(i16vec4) Load 1584
-            1586: 22(i16vec4) GroupNonUniformSMin 42 ExclusiveScan 1585
-            1587:   1150(ptr) AccessChain 34(data) 1583 57
-                              Store 1587 1586
-            1588:      6(int) Load 8(invocation)
-            1589:   1143(ptr) AccessChain 34(data) 37 57 38
-            1590: 21(int16_t) Load 1589
-            1591: 21(int16_t) GroupNonUniformSMax 42 ExclusiveScan 1590
-            1592:   1143(ptr) AccessChain 34(data) 1588 57 38
-                              Store 1592 1591
-            1593:      6(int) Load 8(invocation)
-            1594:   1150(ptr) AccessChain 34(data) 46 57
-            1595: 22(i16vec4) Load 1594
-            1596:1149(i16vec2) VectorShuffle 1595 1595 0 1
-            1597:1149(i16vec2) GroupNonUniformSMax 42 ExclusiveScan 1596
-            1598:   1150(ptr) AccessChain 34(data) 1593 57
-            1599: 22(i16vec4) Load 1598
-            1600: 22(i16vec4) VectorShuffle 1599 1597 4 5 2 3
-                              Store 1598 1600
-            1601:      6(int) Load 8(invocation)
-            1602:   1150(ptr) AccessChain 34(data) 57 57
-            1603: 22(i16vec4) Load 1602
-            1604:1159(i16vec3) VectorShuffle 1603 1603 0 1 2
-            1605:1159(i16vec3) GroupNonUniformSMax 42 ExclusiveScan 1604
-            1606:   1150(ptr) AccessChain 34(data) 1601 57
-            1607: 22(i16vec4) Load 1606
-            1608: 22(i16vec4) VectorShuffle 1607 1605 4 5 6 3
-                              Store 1606 1608
-            1609:      6(int) Load 8(invocation)
-            1610:   1150(ptr) AccessChain 34(data) 67 57
-            1611: 22(i16vec4) Load 1610
-            1612: 22(i16vec4) GroupNonUniformSMax 42 ExclusiveScan 1611
-            1613:   1150(ptr) AccessChain 34(data) 1609 57
-                              Store 1613 1612
-            1614:      6(int) Load 8(invocation)
-            1615:   1143(ptr) AccessChain 34(data) 37 57 38
-            1616: 21(int16_t) Load 1615
-            1617: 21(int16_t) GroupNonUniformBitwiseAnd 42 ExclusiveScan 1616
-            1618:   1143(ptr) AccessChain 34(data) 1614 57 38
-                              Store 1618 1617
-            1619:      6(int) Load 8(invocation)
-            1620:   1150(ptr) AccessChain 34(data) 46 57
-            1621: 22(i16vec4) Load 1620
-            1622:1149(i16vec2) VectorShuffle 1621 1621 0 1
-            1623:1149(i16vec2) GroupNonUniformBitwiseAnd 42 ExclusiveScan 1622
-            1624:   1150(ptr) AccessChain 34(data) 1619 57
-            1625: 22(i16vec4) Load 1624
-            1626: 22(i16vec4) VectorShuffle 1625 1623 4 5 2 3
-                              Store 1624 1626
-            1627:      6(int) Load 8(invocation)
-            1628:   1150(ptr) AccessChain 34(data) 57 57
-            1629: 22(i16vec4) Load 1628
-            1630:1159(i16vec3) VectorShuffle 1629 1629 0 1 2
-            1631:1159(i16vec3) GroupNonUniformBitwiseAnd 42 ExclusiveScan 1630
-            1632:   1150(ptr) AccessChain 34(data) 1627 57
-            1633: 22(i16vec4) Load 1632
-            1634: 22(i16vec4) VectorShuffle 1633 1631 4 5 6 3
-                              Store 1632 1634
-            1635:      6(int) Load 8(invocation)
-            1636:   1150(ptr) AccessChain 34(data) 67 57
-            1637: 22(i16vec4) Load 1636
-            1638: 22(i16vec4) GroupNonUniformBitwiseAnd 42 ExclusiveScan 1637
-            1639:   1150(ptr) AccessChain 34(data) 1635 57
-                              Store 1639 1638
-            1640:      6(int) Load 8(invocation)
-            1641:   1143(ptr) AccessChain 34(data) 37 57 38
-            1642: 21(int16_t) Load 1641
-            1643: 21(int16_t) GroupNonUniformBitwiseOr 42 ExclusiveScan 1642
-            1644:   1143(ptr) AccessChain 34(data) 1640 57 38
-                              Store 1644 1643
-            1645:      6(int) Load 8(invocation)
-            1646:   1150(ptr) AccessChain 34(data) 46 57
-            1647: 22(i16vec4) Load 1646
-            1648:1149(i16vec2) VectorShuffle 1647 1647 0 1
-            1649:1149(i16vec2) GroupNonUniformBitwiseOr 42 ExclusiveScan 1648
-            1650:   1150(ptr) AccessChain 34(data) 1645 57
-            1651: 22(i16vec4) Load 1650
-            1652: 22(i16vec4) VectorShuffle 1651 1649 4 5 2 3
-                              Store 1650 1652
-            1653:      6(int) Load 8(invocation)
-            1654:   1150(ptr) AccessChain 34(data) 57 57
-            1655: 22(i16vec4) Load 1654
-            1656:1159(i16vec3) VectorShuffle 1655 1655 0 1 2
-            1657:1159(i16vec3) GroupNonUniformBitwiseOr 42 ExclusiveScan 1656
-            1658:   1150(ptr) AccessChain 34(data) 1653 57
-            1659: 22(i16vec4) Load 1658
-            1660: 22(i16vec4) VectorShuffle 1659 1657 4 5 6 3
-                              Store 1658 1660
-            1661:      6(int) Load 8(invocation)
-            1662:   1150(ptr) AccessChain 34(data) 67 57
-            1663: 22(i16vec4) Load 1662
-            1664: 22(i16vec4) GroupNonUniformBitwiseOr 42 ExclusiveScan 1663
-            1665:   1150(ptr) AccessChain 34(data) 1661 57
-                              Store 1665 1664
-            1666:      6(int) Load 8(invocation)
-            1667:   1143(ptr) AccessChain 34(data) 37 57 38
-            1668: 21(int16_t) Load 1667
-            1669: 21(int16_t) GroupNonUniformBitwiseXor 42 ExclusiveScan 1668
-            1670:   1143(ptr) AccessChain 34(data) 1666 57 38
-                              Store 1670 1669
+            1534:1319(i16vec2) VectorShuffle 1533 1533 0 1
+            1535:1319(i16vec2) GroupNonUniformIAdd 42 InclusiveScan 1534
+            1536:   1313(ptr) AccessChain 34(data) 1531 59 38
+            1537: 21(int16_t) CompositeExtract 1535 0
+                              Store 1536 1537
+            1538:   1313(ptr) AccessChain 34(data) 1531 59 55
+            1539: 21(int16_t) CompositeExtract 1535 1
+                              Store 1538 1539
+            1540:      6(int) Load 8(invocation)
+            1541:   1320(ptr) AccessChain 34(data) 59 59
+            1542: 22(i16vec4) Load 1541
+            1543:1330(i16vec3) VectorShuffle 1542 1542 0 1 2
+            1544:1330(i16vec3) GroupNonUniformIAdd 42 InclusiveScan 1543
+            1545:   1313(ptr) AccessChain 34(data) 1540 59 38
+            1546: 21(int16_t) CompositeExtract 1544 0
+                              Store 1545 1546
+            1547:   1313(ptr) AccessChain 34(data) 1540 59 55
+            1548: 21(int16_t) CompositeExtract 1544 1
+                              Store 1547 1548
+            1549:   1313(ptr) AccessChain 34(data) 1540 59 69
+            1550: 21(int16_t) CompositeExtract 1544 2
+                              Store 1549 1550
+            1551:      6(int) Load 8(invocation)
+            1552:   1320(ptr) AccessChain 34(data) 73 59
+            1553: 22(i16vec4) Load 1552
+            1554: 22(i16vec4) GroupNonUniformIAdd 42 InclusiveScan 1553
+            1555:   1320(ptr) AccessChain 34(data) 1551 59
+                              Store 1555 1554
+            1556:      6(int) Load 8(invocation)
+            1557:   1313(ptr) AccessChain 34(data) 37 59 38
+            1558: 21(int16_t) Load 1557
+            1559: 21(int16_t) GroupNonUniformIMul 42 InclusiveScan 1558
+            1560:   1313(ptr) AccessChain 34(data) 1556 59 38
+                              Store 1560 1559
+            1561:      6(int) Load 8(invocation)
+            1562:   1320(ptr) AccessChain 34(data) 46 59
+            1563: 22(i16vec4) Load 1562
+            1564:1319(i16vec2) VectorShuffle 1563 1563 0 1
+            1565:1319(i16vec2) GroupNonUniformIMul 42 InclusiveScan 1564
+            1566:   1313(ptr) AccessChain 34(data) 1561 59 38
+            1567: 21(int16_t) CompositeExtract 1565 0
+                              Store 1566 1567
+            1568:   1313(ptr) AccessChain 34(data) 1561 59 55
+            1569: 21(int16_t) CompositeExtract 1565 1
+                              Store 1568 1569
+            1570:      6(int) Load 8(invocation)
+            1571:   1320(ptr) AccessChain 34(data) 59 59
+            1572: 22(i16vec4) Load 1571
+            1573:1330(i16vec3) VectorShuffle 1572 1572 0 1 2
+            1574:1330(i16vec3) GroupNonUniformIMul 42 InclusiveScan 1573
+            1575:   1313(ptr) AccessChain 34(data) 1570 59 38
+            1576: 21(int16_t) CompositeExtract 1574 0
+                              Store 1575 1576
+            1577:   1313(ptr) AccessChain 34(data) 1570 59 55
+            1578: 21(int16_t) CompositeExtract 1574 1
+                              Store 1577 1578
+            1579:   1313(ptr) AccessChain 34(data) 1570 59 69
+            1580: 21(int16_t) CompositeExtract 1574 2
+                              Store 1579 1580
+            1581:      6(int) Load 8(invocation)
+            1582:   1320(ptr) AccessChain 34(data) 73 59
+            1583: 22(i16vec4) Load 1582
+            1584: 22(i16vec4) GroupNonUniformIMul 42 InclusiveScan 1583
+            1585:   1320(ptr) AccessChain 34(data) 1581 59
+                              Store 1585 1584
+            1586:      6(int) Load 8(invocation)
+            1587:   1313(ptr) AccessChain 34(data) 37 59 38
+            1588: 21(int16_t) Load 1587
+            1589: 21(int16_t) GroupNonUniformSMin 42 InclusiveScan 1588
+            1590:   1313(ptr) AccessChain 34(data) 1586 59 38
+                              Store 1590 1589
+            1591:      6(int) Load 8(invocation)
+            1592:   1320(ptr) AccessChain 34(data) 46 59
+            1593: 22(i16vec4) Load 1592
+            1594:1319(i16vec2) VectorShuffle 1593 1593 0 1
+            1595:1319(i16vec2) GroupNonUniformSMin 42 InclusiveScan 1594
+            1596:   1313(ptr) AccessChain 34(data) 1591 59 38
+            1597: 21(int16_t) CompositeExtract 1595 0
+                              Store 1596 1597
+            1598:   1313(ptr) AccessChain 34(data) 1591 59 55
+            1599: 21(int16_t) CompositeExtract 1595 1
+                              Store 1598 1599
+            1600:      6(int) Load 8(invocation)
+            1601:   1320(ptr) AccessChain 34(data) 59 59
+            1602: 22(i16vec4) Load 1601
+            1603:1330(i16vec3) VectorShuffle 1602 1602 0 1 2
+            1604:1330(i16vec3) GroupNonUniformSMin 42 InclusiveScan 1603
+            1605:   1313(ptr) AccessChain 34(data) 1600 59 38
+            1606: 21(int16_t) CompositeExtract 1604 0
+                              Store 1605 1606
+            1607:   1313(ptr) AccessChain 34(data) 1600 59 55
+            1608: 21(int16_t) CompositeExtract 1604 1
+                              Store 1607 1608
+            1609:   1313(ptr) AccessChain 34(data) 1600 59 69
+            1610: 21(int16_t) CompositeExtract 1604 2
+                              Store 1609 1610
+            1611:      6(int) Load 8(invocation)
+            1612:   1320(ptr) AccessChain 34(data) 73 59
+            1613: 22(i16vec4) Load 1612
+            1614: 22(i16vec4) GroupNonUniformSMin 42 InclusiveScan 1613
+            1615:   1320(ptr) AccessChain 34(data) 1611 59
+                              Store 1615 1614
+            1616:      6(int) Load 8(invocation)
+            1617:   1313(ptr) AccessChain 34(data) 37 59 38
+            1618: 21(int16_t) Load 1617
+            1619: 21(int16_t) GroupNonUniformSMax 42 InclusiveScan 1618
+            1620:   1313(ptr) AccessChain 34(data) 1616 59 38
+                              Store 1620 1619
+            1621:      6(int) Load 8(invocation)
+            1622:   1320(ptr) AccessChain 34(data) 46 59
+            1623: 22(i16vec4) Load 1622
+            1624:1319(i16vec2) VectorShuffle 1623 1623 0 1
+            1625:1319(i16vec2) GroupNonUniformSMax 42 InclusiveScan 1624
+            1626:   1313(ptr) AccessChain 34(data) 1621 59 38
+            1627: 21(int16_t) CompositeExtract 1625 0
+                              Store 1626 1627
+            1628:   1313(ptr) AccessChain 34(data) 1621 59 55
+            1629: 21(int16_t) CompositeExtract 1625 1
+                              Store 1628 1629
+            1630:      6(int) Load 8(invocation)
+            1631:   1320(ptr) AccessChain 34(data) 59 59
+            1632: 22(i16vec4) Load 1631
+            1633:1330(i16vec3) VectorShuffle 1632 1632 0 1 2
+            1634:1330(i16vec3) GroupNonUniformSMax 42 InclusiveScan 1633
+            1635:   1313(ptr) AccessChain 34(data) 1630 59 38
+            1636: 21(int16_t) CompositeExtract 1634 0
+                              Store 1635 1636
+            1637:   1313(ptr) AccessChain 34(data) 1630 59 55
+            1638: 21(int16_t) CompositeExtract 1634 1
+                              Store 1637 1638
+            1639:   1313(ptr) AccessChain 34(data) 1630 59 69
+            1640: 21(int16_t) CompositeExtract 1634 2
+                              Store 1639 1640
+            1641:      6(int) Load 8(invocation)
+            1642:   1320(ptr) AccessChain 34(data) 73 59
+            1643: 22(i16vec4) Load 1642
+            1644: 22(i16vec4) GroupNonUniformSMax 42 InclusiveScan 1643
+            1645:   1320(ptr) AccessChain 34(data) 1641 59
+                              Store 1645 1644
+            1646:      6(int) Load 8(invocation)
+            1647:   1313(ptr) AccessChain 34(data) 37 59 38
+            1648: 21(int16_t) Load 1647
+            1649: 21(int16_t) GroupNonUniformBitwiseAnd 42 InclusiveScan 1648
+            1650:   1313(ptr) AccessChain 34(data) 1646 59 38
+                              Store 1650 1649
+            1651:      6(int) Load 8(invocation)
+            1652:   1320(ptr) AccessChain 34(data) 46 59
+            1653: 22(i16vec4) Load 1652
+            1654:1319(i16vec2) VectorShuffle 1653 1653 0 1
+            1655:1319(i16vec2) GroupNonUniformBitwiseAnd 42 InclusiveScan 1654
+            1656:   1313(ptr) AccessChain 34(data) 1651 59 38
+            1657: 21(int16_t) CompositeExtract 1655 0
+                              Store 1656 1657
+            1658:   1313(ptr) AccessChain 34(data) 1651 59 55
+            1659: 21(int16_t) CompositeExtract 1655 1
+                              Store 1658 1659
+            1660:      6(int) Load 8(invocation)
+            1661:   1320(ptr) AccessChain 34(data) 59 59
+            1662: 22(i16vec4) Load 1661
+            1663:1330(i16vec3) VectorShuffle 1662 1662 0 1 2
+            1664:1330(i16vec3) GroupNonUniformBitwiseAnd 42 InclusiveScan 1663
+            1665:   1313(ptr) AccessChain 34(data) 1660 59 38
+            1666: 21(int16_t) CompositeExtract 1664 0
+                              Store 1665 1666
+            1667:   1313(ptr) AccessChain 34(data) 1660 59 55
+            1668: 21(int16_t) CompositeExtract 1664 1
+                              Store 1667 1668
+            1669:   1313(ptr) AccessChain 34(data) 1660 59 69
+            1670: 21(int16_t) CompositeExtract 1664 2
+                              Store 1669 1670
             1671:      6(int) Load 8(invocation)
-            1672:   1150(ptr) AccessChain 34(data) 46 57
+            1672:   1320(ptr) AccessChain 34(data) 73 59
             1673: 22(i16vec4) Load 1672
-            1674:1149(i16vec2) VectorShuffle 1673 1673 0 1
-            1675:1149(i16vec2) GroupNonUniformBitwiseXor 42 ExclusiveScan 1674
-            1676:   1150(ptr) AccessChain 34(data) 1671 57
-            1677: 22(i16vec4) Load 1676
-            1678: 22(i16vec4) VectorShuffle 1677 1675 4 5 2 3
-                              Store 1676 1678
-            1679:      6(int) Load 8(invocation)
-            1680:   1150(ptr) AccessChain 34(data) 57 57
-            1681: 22(i16vec4) Load 1680
-            1682:1159(i16vec3) VectorShuffle 1681 1681 0 1 2
-            1683:1159(i16vec3) GroupNonUniformBitwiseXor 42 ExclusiveScan 1682
-            1684:   1150(ptr) AccessChain 34(data) 1679 57
-            1685: 22(i16vec4) Load 1684
-            1686: 22(i16vec4) VectorShuffle 1685 1683 4 5 6 3
-                              Store 1684 1686
-            1687:      6(int) Load 8(invocation)
-            1688:   1150(ptr) AccessChain 34(data) 67 57
-            1689: 22(i16vec4) Load 1688
-            1690: 22(i16vec4) GroupNonUniformBitwiseXor 42 ExclusiveScan 1689
-            1691:   1150(ptr) AccessChain 34(data) 1687 57
-                              Store 1691 1690
-            1692:      6(int) Load 8(invocation)
-            1694:   1693(ptr) AccessChain 34(data) 37 67 38
-            1695: 23(int16_t) Load 1694
-            1696: 23(int16_t) GroupNonUniformIAdd 42 Reduce 1695
-            1697:   1693(ptr) AccessChain 34(data) 1692 67 38
-                              Store 1697 1696
-            1698:      6(int) Load 8(invocation)
-            1701:   1700(ptr) AccessChain 34(data) 46 67
-            1702: 24(i16vec4) Load 1701
-            1703:1699(i16vec2) VectorShuffle 1702 1702 0 1
-            1704:1699(i16vec2) GroupNonUniformIAdd 42 Reduce 1703
-            1705:   1700(ptr) AccessChain 34(data) 1698 67
-            1706: 24(i16vec4) Load 1705
-            1707: 24(i16vec4) VectorShuffle 1706 1704 4 5 2 3
-                              Store 1705 1707
-            1708:      6(int) Load 8(invocation)
-            1710:   1700(ptr) AccessChain 34(data) 57 67
-            1711: 24(i16vec4) Load 1710
-            1712:1709(i16vec3) VectorShuffle 1711 1711 0 1 2
-            1713:1709(i16vec3) GroupNonUniformIAdd 42 Reduce 1712
-            1714:   1700(ptr) AccessChain 34(data) 1708 67
-            1715: 24(i16vec4) Load 1714
-            1716: 24(i16vec4) VectorShuffle 1715 1713 4 5 6 3
-                              Store 1714 1716
-            1717:      6(int) Load 8(invocation)
-            1718:   1700(ptr) AccessChain 34(data) 67 67
-            1719: 24(i16vec4) Load 1718
-            1720: 24(i16vec4) GroupNonUniformIAdd 42 Reduce 1719
-            1721:   1700(ptr) AccessChain 34(data) 1717 67
-                              Store 1721 1720
-            1722:      6(int) Load 8(invocation)
-            1723:   1693(ptr) AccessChain 34(data) 37 67 38
-            1724: 23(int16_t) Load 1723
-            1725: 23(int16_t) GroupNonUniformIMul 42 Reduce 1724
-            1726:   1693(ptr) AccessChain 34(data) 1722 67 38
-                              Store 1726 1725
-            1727:      6(int) Load 8(invocation)
-            1728:   1700(ptr) AccessChain 34(data) 46 67
-            1729: 24(i16vec4) Load 1728
-            1730:1699(i16vec2) VectorShuffle 1729 1729 0 1
-            1731:1699(i16vec2) GroupNonUniformIMul 42 Reduce 1730
-            1732:   1700(ptr) AccessChain 34(data) 1727 67
-            1733: 24(i16vec4) Load 1732
-            1734: 24(i16vec4) VectorShuffle 1733 1731 4 5 2 3
-                              Store 1732 1734
-            1735:      6(int) Load 8(invocation)
-            1736:   1700(ptr) AccessChain 34(data) 57 67
-            1737: 24(i16vec4) Load 1736
-            1738:1709(i16vec3) VectorShuffle 1737 1737 0 1 2
-            1739:1709(i16vec3) GroupNonUniformIMul 42 Reduce 1738
-            1740:   1700(ptr) AccessChain 34(data) 1735 67
-            1741: 24(i16vec4) Load 1740
-            1742: 24(i16vec4) VectorShuffle 1741 1739 4 5 6 3
-                              Store 1740 1742
-            1743:      6(int) Load 8(invocation)
-            1744:   1700(ptr) AccessChain 34(data) 67 67
-            1745: 24(i16vec4) Load 1744
-            1746: 24(i16vec4) GroupNonUniformIMul 42 Reduce 1745
-            1747:   1700(ptr) AccessChain 34(data) 1743 67
-                              Store 1747 1746
-            1748:      6(int) Load 8(invocation)
-            1749:   1693(ptr) AccessChain 34(data) 37 67 38
-            1750: 23(int16_t) Load 1749
-            1751: 23(int16_t) GroupNonUniformUMin 42 Reduce 1750
-            1752:   1693(ptr) AccessChain 34(data) 1748 67 38
-                              Store 1752 1751
-            1753:      6(int) Load 8(invocation)
-            1754:   1700(ptr) AccessChain 34(data) 46 67
-            1755: 24(i16vec4) Load 1754
-            1756:1699(i16vec2) VectorShuffle 1755 1755 0 1
-            1757:1699(i16vec2) GroupNonUniformUMin 42 Reduce 1756
-            1758:   1700(ptr) AccessChain 34(data) 1753 67
-            1759: 24(i16vec4) Load 1758
-            1760: 24(i16vec4) VectorShuffle 1759 1757 4 5 2 3
-                              Store 1758 1760
+            1674: 22(i16vec4) GroupNonUniformBitwiseAnd 42 InclusiveScan 1673
+            1675:   1320(ptr) AccessChain 34(data) 1671 59
+                              Store 1675 1674
+            1676:      6(int) Load 8(invocation)
+            1677:   1313(ptr) AccessChain 34(data) 37 59 38
+            1678: 21(int16_t) Load 1677
+            1679: 21(int16_t) GroupNonUniformBitwiseOr 42 InclusiveScan 1678
+            1680:   1313(ptr) AccessChain 34(data) 1676 59 38
+                              Store 1680 1679
+            1681:      6(int) Load 8(invocation)
+            1682:   1320(ptr) AccessChain 34(data) 46 59
+            1683: 22(i16vec4) Load 1682
+            1684:1319(i16vec2) VectorShuffle 1683 1683 0 1
+            1685:1319(i16vec2) GroupNonUniformBitwiseOr 42 InclusiveScan 1684
+            1686:   1313(ptr) AccessChain 34(data) 1681 59 38
+            1687: 21(int16_t) CompositeExtract 1685 0
+                              Store 1686 1687
+            1688:   1313(ptr) AccessChain 34(data) 1681 59 55
+            1689: 21(int16_t) CompositeExtract 1685 1
+                              Store 1688 1689
+            1690:      6(int) Load 8(invocation)
+            1691:   1320(ptr) AccessChain 34(data) 59 59
+            1692: 22(i16vec4) Load 1691
+            1693:1330(i16vec3) VectorShuffle 1692 1692 0 1 2
+            1694:1330(i16vec3) GroupNonUniformBitwiseOr 42 InclusiveScan 1693
+            1695:   1313(ptr) AccessChain 34(data) 1690 59 38
+            1696: 21(int16_t) CompositeExtract 1694 0
+                              Store 1695 1696
+            1697:   1313(ptr) AccessChain 34(data) 1690 59 55
+            1698: 21(int16_t) CompositeExtract 1694 1
+                              Store 1697 1698
+            1699:   1313(ptr) AccessChain 34(data) 1690 59 69
+            1700: 21(int16_t) CompositeExtract 1694 2
+                              Store 1699 1700
+            1701:      6(int) Load 8(invocation)
+            1702:   1320(ptr) AccessChain 34(data) 73 59
+            1703: 22(i16vec4) Load 1702
+            1704: 22(i16vec4) GroupNonUniformBitwiseOr 42 InclusiveScan 1703
+            1705:   1320(ptr) AccessChain 34(data) 1701 59
+                              Store 1705 1704
+            1706:      6(int) Load 8(invocation)
+            1707:   1313(ptr) AccessChain 34(data) 37 59 38
+            1708: 21(int16_t) Load 1707
+            1709: 21(int16_t) GroupNonUniformBitwiseXor 42 InclusiveScan 1708
+            1710:   1313(ptr) AccessChain 34(data) 1706 59 38
+                              Store 1710 1709
+            1711:      6(int) Load 8(invocation)
+            1712:   1320(ptr) AccessChain 34(data) 46 59
+            1713: 22(i16vec4) Load 1712
+            1714:1319(i16vec2) VectorShuffle 1713 1713 0 1
+            1715:1319(i16vec2) GroupNonUniformBitwiseXor 42 InclusiveScan 1714
+            1716:   1313(ptr) AccessChain 34(data) 1711 59 38
+            1717: 21(int16_t) CompositeExtract 1715 0
+                              Store 1716 1717
+            1718:   1313(ptr) AccessChain 34(data) 1711 59 55
+            1719: 21(int16_t) CompositeExtract 1715 1
+                              Store 1718 1719
+            1720:      6(int) Load 8(invocation)
+            1721:   1320(ptr) AccessChain 34(data) 59 59
+            1722: 22(i16vec4) Load 1721
+            1723:1330(i16vec3) VectorShuffle 1722 1722 0 1 2
+            1724:1330(i16vec3) GroupNonUniformBitwiseXor 42 InclusiveScan 1723
+            1725:   1313(ptr) AccessChain 34(data) 1720 59 38
+            1726: 21(int16_t) CompositeExtract 1724 0
+                              Store 1725 1726
+            1727:   1313(ptr) AccessChain 34(data) 1720 59 55
+            1728: 21(int16_t) CompositeExtract 1724 1
+                              Store 1727 1728
+            1729:   1313(ptr) AccessChain 34(data) 1720 59 69
+            1730: 21(int16_t) CompositeExtract 1724 2
+                              Store 1729 1730
+            1731:      6(int) Load 8(invocation)
+            1732:   1320(ptr) AccessChain 34(data) 73 59
+            1733: 22(i16vec4) Load 1732
+            1734: 22(i16vec4) GroupNonUniformBitwiseXor 42 InclusiveScan 1733
+            1735:   1320(ptr) AccessChain 34(data) 1731 59
+                              Store 1735 1734
+            1736:      6(int) Load 8(invocation)
+            1737:   1313(ptr) AccessChain 34(data) 37 59 38
+            1738: 21(int16_t) Load 1737
+            1739: 21(int16_t) GroupNonUniformIAdd 42 ExclusiveScan 1738
+            1740:   1313(ptr) AccessChain 34(data) 1736 59 38
+                              Store 1740 1739
+            1741:      6(int) Load 8(invocation)
+            1742:   1320(ptr) AccessChain 34(data) 46 59
+            1743: 22(i16vec4) Load 1742
+            1744:1319(i16vec2) VectorShuffle 1743 1743 0 1
+            1745:1319(i16vec2) GroupNonUniformIAdd 42 ExclusiveScan 1744
+            1746:   1313(ptr) AccessChain 34(data) 1741 59 38
+            1747: 21(int16_t) CompositeExtract 1745 0
+                              Store 1746 1747
+            1748:   1313(ptr) AccessChain 34(data) 1741 59 55
+            1749: 21(int16_t) CompositeExtract 1745 1
+                              Store 1748 1749
+            1750:      6(int) Load 8(invocation)
+            1751:   1320(ptr) AccessChain 34(data) 59 59
+            1752: 22(i16vec4) Load 1751
+            1753:1330(i16vec3) VectorShuffle 1752 1752 0 1 2
+            1754:1330(i16vec3) GroupNonUniformIAdd 42 ExclusiveScan 1753
+            1755:   1313(ptr) AccessChain 34(data) 1750 59 38
+            1756: 21(int16_t) CompositeExtract 1754 0
+                              Store 1755 1756
+            1757:   1313(ptr) AccessChain 34(data) 1750 59 55
+            1758: 21(int16_t) CompositeExtract 1754 1
+                              Store 1757 1758
+            1759:   1313(ptr) AccessChain 34(data) 1750 59 69
+            1760: 21(int16_t) CompositeExtract 1754 2
+                              Store 1759 1760
             1761:      6(int) Load 8(invocation)
-            1762:   1700(ptr) AccessChain 34(data) 57 67
-            1763: 24(i16vec4) Load 1762
-            1764:1709(i16vec3) VectorShuffle 1763 1763 0 1 2
-            1765:1709(i16vec3) GroupNonUniformUMin 42 Reduce 1764
-            1766:   1700(ptr) AccessChain 34(data) 1761 67
-            1767: 24(i16vec4) Load 1766
-            1768: 24(i16vec4) VectorShuffle 1767 1765 4 5 6 3
-                              Store 1766 1768
-            1769:      6(int) Load 8(invocation)
-            1770:   1700(ptr) AccessChain 34(data) 67 67
-            1771: 24(i16vec4) Load 1770
-            1772: 24(i16vec4) GroupNonUniformUMin 42 Reduce 1771
-            1773:   1700(ptr) AccessChain 34(data) 1769 67
-                              Store 1773 1772
-            1774:      6(int) Load 8(invocation)
-            1775:   1693(ptr) AccessChain 34(data) 37 67 38
-            1776: 23(int16_t) Load 1775
-            1777: 23(int16_t) GroupNonUniformUMax 42 Reduce 1776
-            1778:   1693(ptr) AccessChain 34(data) 1774 67 38
-                              Store 1778 1777
-            1779:      6(int) Load 8(invocation)
-            1780:   1700(ptr) AccessChain 34(data) 46 67
-            1781: 24(i16vec4) Load 1780
-            1782:1699(i16vec2) VectorShuffle 1781 1781 0 1
-            1783:1699(i16vec2) GroupNonUniformUMax 42 Reduce 1782
-            1784:   1700(ptr) AccessChain 34(data) 1779 67
-            1785: 24(i16vec4) Load 1784
-            1786: 24(i16vec4) VectorShuffle 1785 1783 4 5 2 3
-                              Store 1784 1786
-            1787:      6(int) Load 8(invocation)
-            1788:   1700(ptr) AccessChain 34(data) 57 67
-            1789: 24(i16vec4) Load 1788
-            1790:1709(i16vec3) VectorShuffle 1789 1789 0 1 2
-            1791:1709(i16vec3) GroupNonUniformUMax 42 Reduce 1790
-            1792:   1700(ptr) AccessChain 34(data) 1787 67
-            1793: 24(i16vec4) Load 1792
-            1794: 24(i16vec4) VectorShuffle 1793 1791 4 5 6 3
-                              Store 1792 1794
-            1795:      6(int) Load 8(invocation)
-            1796:   1700(ptr) AccessChain 34(data) 67 67
-            1797: 24(i16vec4) Load 1796
-            1798: 24(i16vec4) GroupNonUniformUMax 42 Reduce 1797
-            1799:   1700(ptr) AccessChain 34(data) 1795 67
-                              Store 1799 1798
-            1800:      6(int) Load 8(invocation)
-            1801:   1693(ptr) AccessChain 34(data) 37 67 38
-            1802: 23(int16_t) Load 1801
-            1803: 23(int16_t) GroupNonUniformBitwiseAnd 42 Reduce 1802
-            1804:   1693(ptr) AccessChain 34(data) 1800 67 38
-                              Store 1804 1803
-            1805:      6(int) Load 8(invocation)
-            1806:   1700(ptr) AccessChain 34(data) 46 67
-            1807: 24(i16vec4) Load 1806
-            1808:1699(i16vec2) VectorShuffle 1807 1807 0 1
-            1809:1699(i16vec2) GroupNonUniformBitwiseAnd 42 Reduce 1808
-            1810:   1700(ptr) AccessChain 34(data) 1805 67
-            1811: 24(i16vec4) Load 1810
-            1812: 24(i16vec4) VectorShuffle 1811 1809 4 5 2 3
-                              Store 1810 1812
-            1813:      6(int) Load 8(invocation)
-            1814:   1700(ptr) AccessChain 34(data) 57 67
-            1815: 24(i16vec4) Load 1814
-            1816:1709(i16vec3) VectorShuffle 1815 1815 0 1 2
-            1817:1709(i16vec3) GroupNonUniformBitwiseAnd 42 Reduce 1816
-            1818:   1700(ptr) AccessChain 34(data) 1813 67
-            1819: 24(i16vec4) Load 1818
-            1820: 24(i16vec4) VectorShuffle 1819 1817 4 5 6 3
-                              Store 1818 1820
+            1762:   1320(ptr) AccessChain 34(data) 73 59
+            1763: 22(i16vec4) Load 1762
+            1764: 22(i16vec4) GroupNonUniformIAdd 42 ExclusiveScan 1763
+            1765:   1320(ptr) AccessChain 34(data) 1761 59
+                              Store 1765 1764
+            1766:      6(int) Load 8(invocation)
+            1767:   1313(ptr) AccessChain 34(data) 37 59 38
+            1768: 21(int16_t) Load 1767
+            1769: 21(int16_t) GroupNonUniformIMul 42 ExclusiveScan 1768
+            1770:   1313(ptr) AccessChain 34(data) 1766 59 38
+                              Store 1770 1769
+            1771:      6(int) Load 8(invocation)
+            1772:   1320(ptr) AccessChain 34(data) 46 59
+            1773: 22(i16vec4) Load 1772
+            1774:1319(i16vec2) VectorShuffle 1773 1773 0 1
+            1775:1319(i16vec2) GroupNonUniformIMul 42 ExclusiveScan 1774
+            1776:   1313(ptr) AccessChain 34(data) 1771 59 38
+            1777: 21(int16_t) CompositeExtract 1775 0
+                              Store 1776 1777
+            1778:   1313(ptr) AccessChain 34(data) 1771 59 55
+            1779: 21(int16_t) CompositeExtract 1775 1
+                              Store 1778 1779
+            1780:      6(int) Load 8(invocation)
+            1781:   1320(ptr) AccessChain 34(data) 59 59
+            1782: 22(i16vec4) Load 1781
+            1783:1330(i16vec3) VectorShuffle 1782 1782 0 1 2
+            1784:1330(i16vec3) GroupNonUniformIMul 42 ExclusiveScan 1783
+            1785:   1313(ptr) AccessChain 34(data) 1780 59 38
+            1786: 21(int16_t) CompositeExtract 1784 0
+                              Store 1785 1786
+            1787:   1313(ptr) AccessChain 34(data) 1780 59 55
+            1788: 21(int16_t) CompositeExtract 1784 1
+                              Store 1787 1788
+            1789:   1313(ptr) AccessChain 34(data) 1780 59 69
+            1790: 21(int16_t) CompositeExtract 1784 2
+                              Store 1789 1790
+            1791:      6(int) Load 8(invocation)
+            1792:   1320(ptr) AccessChain 34(data) 73 59
+            1793: 22(i16vec4) Load 1792
+            1794: 22(i16vec4) GroupNonUniformIMul 42 ExclusiveScan 1793
+            1795:   1320(ptr) AccessChain 34(data) 1791 59
+                              Store 1795 1794
+            1796:      6(int) Load 8(invocation)
+            1797:   1313(ptr) AccessChain 34(data) 37 59 38
+            1798: 21(int16_t) Load 1797
+            1799: 21(int16_t) GroupNonUniformSMin 42 ExclusiveScan 1798
+            1800:   1313(ptr) AccessChain 34(data) 1796 59 38
+                              Store 1800 1799
+            1801:      6(int) Load 8(invocation)
+            1802:   1320(ptr) AccessChain 34(data) 46 59
+            1803: 22(i16vec4) Load 1802
+            1804:1319(i16vec2) VectorShuffle 1803 1803 0 1
+            1805:1319(i16vec2) GroupNonUniformSMin 42 ExclusiveScan 1804
+            1806:   1313(ptr) AccessChain 34(data) 1801 59 38
+            1807: 21(int16_t) CompositeExtract 1805 0
+                              Store 1806 1807
+            1808:   1313(ptr) AccessChain 34(data) 1801 59 55
+            1809: 21(int16_t) CompositeExtract 1805 1
+                              Store 1808 1809
+            1810:      6(int) Load 8(invocation)
+            1811:   1320(ptr) AccessChain 34(data) 59 59
+            1812: 22(i16vec4) Load 1811
+            1813:1330(i16vec3) VectorShuffle 1812 1812 0 1 2
+            1814:1330(i16vec3) GroupNonUniformSMin 42 ExclusiveScan 1813
+            1815:   1313(ptr) AccessChain 34(data) 1810 59 38
+            1816: 21(int16_t) CompositeExtract 1814 0
+                              Store 1815 1816
+            1817:   1313(ptr) AccessChain 34(data) 1810 59 55
+            1818: 21(int16_t) CompositeExtract 1814 1
+                              Store 1817 1818
+            1819:   1313(ptr) AccessChain 34(data) 1810 59 69
+            1820: 21(int16_t) CompositeExtract 1814 2
+                              Store 1819 1820
             1821:      6(int) Load 8(invocation)
-            1822:   1700(ptr) AccessChain 34(data) 67 67
-            1823: 24(i16vec4) Load 1822
-            1824: 24(i16vec4) GroupNonUniformBitwiseAnd 42 Reduce 1823
-            1825:   1700(ptr) AccessChain 34(data) 1821 67
+            1822:   1320(ptr) AccessChain 34(data) 73 59
+            1823: 22(i16vec4) Load 1822
+            1824: 22(i16vec4) GroupNonUniformSMin 42 ExclusiveScan 1823
+            1825:   1320(ptr) AccessChain 34(data) 1821 59
                               Store 1825 1824
             1826:      6(int) Load 8(invocation)
-            1827:   1693(ptr) AccessChain 34(data) 37 67 38
-            1828: 23(int16_t) Load 1827
-            1829: 23(int16_t) GroupNonUniformBitwiseOr 42 Reduce 1828
-            1830:   1693(ptr) AccessChain 34(data) 1826 67 38
+            1827:   1313(ptr) AccessChain 34(data) 37 59 38
+            1828: 21(int16_t) Load 1827
+            1829: 21(int16_t) GroupNonUniformSMax 42 ExclusiveScan 1828
+            1830:   1313(ptr) AccessChain 34(data) 1826 59 38
                               Store 1830 1829
             1831:      6(int) Load 8(invocation)
-            1832:   1700(ptr) AccessChain 34(data) 46 67
-            1833: 24(i16vec4) Load 1832
-            1834:1699(i16vec2) VectorShuffle 1833 1833 0 1
-            1835:1699(i16vec2) GroupNonUniformBitwiseOr 42 Reduce 1834
-            1836:   1700(ptr) AccessChain 34(data) 1831 67
-            1837: 24(i16vec4) Load 1836
-            1838: 24(i16vec4) VectorShuffle 1837 1835 4 5 2 3
-                              Store 1836 1838
-            1839:      6(int) Load 8(invocation)
-            1840:   1700(ptr) AccessChain 34(data) 57 67
-            1841: 24(i16vec4) Load 1840
-            1842:1709(i16vec3) VectorShuffle 1841 1841 0 1 2
-            1843:1709(i16vec3) GroupNonUniformBitwiseOr 42 Reduce 1842
-            1844:   1700(ptr) AccessChain 34(data) 1839 67
-            1845: 24(i16vec4) Load 1844
-            1846: 24(i16vec4) VectorShuffle 1845 1843 4 5 6 3
-                              Store 1844 1846
-            1847:      6(int) Load 8(invocation)
-            1848:   1700(ptr) AccessChain 34(data) 67 67
-            1849: 24(i16vec4) Load 1848
-            1850: 24(i16vec4) GroupNonUniformBitwiseOr 42 Reduce 1849
-            1851:   1700(ptr) AccessChain 34(data) 1847 67
-                              Store 1851 1850
-            1852:      6(int) Load 8(invocation)
-            1853:   1693(ptr) AccessChain 34(data) 37 67 38
-            1854: 23(int16_t) Load 1853
-            1855: 23(int16_t) GroupNonUniformBitwiseXor 42 Reduce 1854
-            1856:   1693(ptr) AccessChain 34(data) 1852 67 38
-                              Store 1856 1855
-            1857:      6(int) Load 8(invocation)
-            1858:   1700(ptr) AccessChain 34(data) 46 67
-            1859: 24(i16vec4) Load 1858
-            1860:1699(i16vec2) VectorShuffle 1859 1859 0 1
-            1861:1699(i16vec2) GroupNonUniformBitwiseXor 42 Reduce 1860
-            1862:   1700(ptr) AccessChain 34(data) 1857 67
-            1863: 24(i16vec4) Load 1862
-            1864: 24(i16vec4) VectorShuffle 1863 1861 4 5 2 3
-                              Store 1862 1864
-            1865:      6(int) Load 8(invocation)
-            1866:   1700(ptr) AccessChain 34(data) 57 67
-            1867: 24(i16vec4) Load 1866
-            1868:1709(i16vec3) VectorShuffle 1867 1867 0 1 2
-            1869:1709(i16vec3) GroupNonUniformBitwiseXor 42 Reduce 1868
-            1870:   1700(ptr) AccessChain 34(data) 1865 67
-            1871: 24(i16vec4) Load 1870
-            1872: 24(i16vec4) VectorShuffle 1871 1869 4 5 6 3
-                              Store 1870 1872
-            1873:      6(int) Load 8(invocation)
-            1874:   1700(ptr) AccessChain 34(data) 67 67
-            1875: 24(i16vec4) Load 1874
-            1876: 24(i16vec4) GroupNonUniformBitwiseXor 42 Reduce 1875
-            1877:   1700(ptr) AccessChain 34(data) 1873 67
-                              Store 1877 1876
-            1878:      6(int) Load 8(invocation)
-            1879:   1693(ptr) AccessChain 34(data) 37 67 38
-            1880: 23(int16_t) Load 1879
-            1881: 23(int16_t) GroupNonUniformIAdd 42 InclusiveScan 1880
-            1882:   1693(ptr) AccessChain 34(data) 1878 67 38
-                              Store 1882 1881
-            1883:      6(int) Load 8(invocation)
-            1884:   1700(ptr) AccessChain 34(data) 46 67
-            1885: 24(i16vec4) Load 1884
-            1886:1699(i16vec2) VectorShuffle 1885 1885 0 1
-            1887:1699(i16vec2) GroupNonUniformIAdd 42 InclusiveScan 1886
-            1888:   1700(ptr) AccessChain 34(data) 1883 67
-            1889: 24(i16vec4) Load 1888
-            1890: 24(i16vec4) VectorShuffle 1889 1887 4 5 2 3
-                              Store 1888 1890
+            1832:   1320(ptr) AccessChain 34(data) 46 59
+            1833: 22(i16vec4) Load 1832
+            1834:1319(i16vec2) VectorShuffle 1833 1833 0 1
+            1835:1319(i16vec2) GroupNonUniformSMax 42 ExclusiveScan 1834
+            1836:   1313(ptr) AccessChain 34(data) 1831 59 38
+            1837: 21(int16_t) CompositeExtract 1835 0
+                              Store 1836 1837
+            1838:   1313(ptr) AccessChain 34(data) 1831 59 55
+            1839: 21(int16_t) CompositeExtract 1835 1
+                              Store 1838 1839
+            1840:      6(int) Load 8(invocation)
+            1841:   1320(ptr) AccessChain 34(data) 59 59
+            1842: 22(i16vec4) Load 1841
+            1843:1330(i16vec3) VectorShuffle 1842 1842 0 1 2
+            1844:1330(i16vec3) GroupNonUniformSMax 42 ExclusiveScan 1843
+            1845:   1313(ptr) AccessChain 34(data) 1840 59 38
+            1846: 21(int16_t) CompositeExtract 1844 0
+                              Store 1845 1846
+            1847:   1313(ptr) AccessChain 34(data) 1840 59 55
+            1848: 21(int16_t) CompositeExtract 1844 1
+                              Store 1847 1848
+            1849:   1313(ptr) AccessChain 34(data) 1840 59 69
+            1850: 21(int16_t) CompositeExtract 1844 2
+                              Store 1849 1850
+            1851:      6(int) Load 8(invocation)
+            1852:   1320(ptr) AccessChain 34(data) 73 59
+            1853: 22(i16vec4) Load 1852
+            1854: 22(i16vec4) GroupNonUniformSMax 42 ExclusiveScan 1853
+            1855:   1320(ptr) AccessChain 34(data) 1851 59
+                              Store 1855 1854
+            1856:      6(int) Load 8(invocation)
+            1857:   1313(ptr) AccessChain 34(data) 37 59 38
+            1858: 21(int16_t) Load 1857
+            1859: 21(int16_t) GroupNonUniformBitwiseAnd 42 ExclusiveScan 1858
+            1860:   1313(ptr) AccessChain 34(data) 1856 59 38
+                              Store 1860 1859
+            1861:      6(int) Load 8(invocation)
+            1862:   1320(ptr) AccessChain 34(data) 46 59
+            1863: 22(i16vec4) Load 1862
+            1864:1319(i16vec2) VectorShuffle 1863 1863 0 1
+            1865:1319(i16vec2) GroupNonUniformBitwiseAnd 42 ExclusiveScan 1864
+            1866:   1313(ptr) AccessChain 34(data) 1861 59 38
+            1867: 21(int16_t) CompositeExtract 1865 0
+                              Store 1866 1867
+            1868:   1313(ptr) AccessChain 34(data) 1861 59 55
+            1869: 21(int16_t) CompositeExtract 1865 1
+                              Store 1868 1869
+            1870:      6(int) Load 8(invocation)
+            1871:   1320(ptr) AccessChain 34(data) 59 59
+            1872: 22(i16vec4) Load 1871
+            1873:1330(i16vec3) VectorShuffle 1872 1872 0 1 2
+            1874:1330(i16vec3) GroupNonUniformBitwiseAnd 42 ExclusiveScan 1873
+            1875:   1313(ptr) AccessChain 34(data) 1870 59 38
+            1876: 21(int16_t) CompositeExtract 1874 0
+                              Store 1875 1876
+            1877:   1313(ptr) AccessChain 34(data) 1870 59 55
+            1878: 21(int16_t) CompositeExtract 1874 1
+                              Store 1877 1878
+            1879:   1313(ptr) AccessChain 34(data) 1870 59 69
+            1880: 21(int16_t) CompositeExtract 1874 2
+                              Store 1879 1880
+            1881:      6(int) Load 8(invocation)
+            1882:   1320(ptr) AccessChain 34(data) 73 59
+            1883: 22(i16vec4) Load 1882
+            1884: 22(i16vec4) GroupNonUniformBitwiseAnd 42 ExclusiveScan 1883
+            1885:   1320(ptr) AccessChain 34(data) 1881 59
+                              Store 1885 1884
+            1886:      6(int) Load 8(invocation)
+            1887:   1313(ptr) AccessChain 34(data) 37 59 38
+            1888: 21(int16_t) Load 1887
+            1889: 21(int16_t) GroupNonUniformBitwiseOr 42 ExclusiveScan 1888
+            1890:   1313(ptr) AccessChain 34(data) 1886 59 38
+                              Store 1890 1889
             1891:      6(int) Load 8(invocation)
-            1892:   1700(ptr) AccessChain 34(data) 57 67
-            1893: 24(i16vec4) Load 1892
-            1894:1709(i16vec3) VectorShuffle 1893 1893 0 1 2
-            1895:1709(i16vec3) GroupNonUniformIAdd 42 InclusiveScan 1894
-            1896:   1700(ptr) AccessChain 34(data) 1891 67
-            1897: 24(i16vec4) Load 1896
-            1898: 24(i16vec4) VectorShuffle 1897 1895 4 5 6 3
-                              Store 1896 1898
-            1899:      6(int) Load 8(invocation)
-            1900:   1700(ptr) AccessChain 34(data) 67 67
-            1901: 24(i16vec4) Load 1900
-            1902: 24(i16vec4) GroupNonUniformIAdd 42 InclusiveScan 1901
-            1903:   1700(ptr) AccessChain 34(data) 1899 67
-                              Store 1903 1902
-            1904:      6(int) Load 8(invocation)
-            1905:   1693(ptr) AccessChain 34(data) 37 67 38
-            1906: 23(int16_t) Load 1905
-            1907: 23(int16_t) GroupNonUniformIMul 42 InclusiveScan 1906
-            1908:   1693(ptr) AccessChain 34(data) 1904 67 38
-                              Store 1908 1907
-            1909:      6(int) Load 8(invocation)
-            1910:   1700(ptr) AccessChain 34(data) 46 67
-            1911: 24(i16vec4) Load 1910
-            1912:1699(i16vec2) VectorShuffle 1911 1911 0 1
-            1913:1699(i16vec2) GroupNonUniformIMul 42 InclusiveScan 1912
-            1914:   1700(ptr) AccessChain 34(data) 1909 67
-            1915: 24(i16vec4) Load 1914
-            1916: 24(i16vec4) VectorShuffle 1915 1913 4 5 2 3
-                              Store 1914 1916
-            1917:      6(int) Load 8(invocation)
-            1918:   1700(ptr) AccessChain 34(data) 57 67
-            1919: 24(i16vec4) Load 1918
-            1920:1709(i16vec3) VectorShuffle 1919 1919 0 1 2
-            1921:1709(i16vec3) GroupNonUniformIMul 42 InclusiveScan 1920
-            1922:   1700(ptr) AccessChain 34(data) 1917 67
-            1923: 24(i16vec4) Load 1922
-            1924: 24(i16vec4) VectorShuffle 1923 1921 4 5 6 3
-                              Store 1922 1924
-            1925:      6(int) Load 8(invocation)
-            1926:   1700(ptr) AccessChain 34(data) 67 67
-            1927: 24(i16vec4) Load 1926
-            1928: 24(i16vec4) GroupNonUniformIMul 42 InclusiveScan 1927
-            1929:   1700(ptr) AccessChain 34(data) 1925 67
-                              Store 1929 1928
+            1892:   1320(ptr) AccessChain 34(data) 46 59
+            1893: 22(i16vec4) Load 1892
+            1894:1319(i16vec2) VectorShuffle 1893 1893 0 1
+            1895:1319(i16vec2) GroupNonUniformBitwiseOr 42 ExclusiveScan 1894
+            1896:   1313(ptr) AccessChain 34(data) 1891 59 38
+            1897: 21(int16_t) CompositeExtract 1895 0
+                              Store 1896 1897
+            1898:   1313(ptr) AccessChain 34(data) 1891 59 55
+            1899: 21(int16_t) CompositeExtract 1895 1
+                              Store 1898 1899
+            1900:      6(int) Load 8(invocation)
+            1901:   1320(ptr) AccessChain 34(data) 59 59
+            1902: 22(i16vec4) Load 1901
+            1903:1330(i16vec3) VectorShuffle 1902 1902 0 1 2
+            1904:1330(i16vec3) GroupNonUniformBitwiseOr 42 ExclusiveScan 1903
+            1905:   1313(ptr) AccessChain 34(data) 1900 59 38
+            1906: 21(int16_t) CompositeExtract 1904 0
+                              Store 1905 1906
+            1907:   1313(ptr) AccessChain 34(data) 1900 59 55
+            1908: 21(int16_t) CompositeExtract 1904 1
+                              Store 1907 1908
+            1909:   1313(ptr) AccessChain 34(data) 1900 59 69
+            1910: 21(int16_t) CompositeExtract 1904 2
+                              Store 1909 1910
+            1911:      6(int) Load 8(invocation)
+            1912:   1320(ptr) AccessChain 34(data) 73 59
+            1913: 22(i16vec4) Load 1912
+            1914: 22(i16vec4) GroupNonUniformBitwiseOr 42 ExclusiveScan 1913
+            1915:   1320(ptr) AccessChain 34(data) 1911 59
+                              Store 1915 1914
+            1916:      6(int) Load 8(invocation)
+            1917:   1313(ptr) AccessChain 34(data) 37 59 38
+            1918: 21(int16_t) Load 1917
+            1919: 21(int16_t) GroupNonUniformBitwiseXor 42 ExclusiveScan 1918
+            1920:   1313(ptr) AccessChain 34(data) 1916 59 38
+                              Store 1920 1919
+            1921:      6(int) Load 8(invocation)
+            1922:   1320(ptr) AccessChain 34(data) 46 59
+            1923: 22(i16vec4) Load 1922
+            1924:1319(i16vec2) VectorShuffle 1923 1923 0 1
+            1925:1319(i16vec2) GroupNonUniformBitwiseXor 42 ExclusiveScan 1924
+            1926:   1313(ptr) AccessChain 34(data) 1921 59 38
+            1927: 21(int16_t) CompositeExtract 1925 0
+                              Store 1926 1927
+            1928:   1313(ptr) AccessChain 34(data) 1921 59 55
+            1929: 21(int16_t) CompositeExtract 1925 1
+                              Store 1928 1929
             1930:      6(int) Load 8(invocation)
-            1931:   1693(ptr) AccessChain 34(data) 37 67 38
-            1932: 23(int16_t) Load 1931
-            1933: 23(int16_t) GroupNonUniformUMin 42 InclusiveScan 1932
-            1934:   1693(ptr) AccessChain 34(data) 1930 67 38
-                              Store 1934 1933
-            1935:      6(int) Load 8(invocation)
-            1936:   1700(ptr) AccessChain 34(data) 46 67
-            1937: 24(i16vec4) Load 1936
-            1938:1699(i16vec2) VectorShuffle 1937 1937 0 1
-            1939:1699(i16vec2) GroupNonUniformUMin 42 InclusiveScan 1938
-            1940:   1700(ptr) AccessChain 34(data) 1935 67
-            1941: 24(i16vec4) Load 1940
-            1942: 24(i16vec4) VectorShuffle 1941 1939 4 5 2 3
-                              Store 1940 1942
-            1943:      6(int) Load 8(invocation)
-            1944:   1700(ptr) AccessChain 34(data) 57 67
-            1945: 24(i16vec4) Load 1944
-            1946:1709(i16vec3) VectorShuffle 1945 1945 0 1 2
-            1947:1709(i16vec3) GroupNonUniformUMin 42 InclusiveScan 1946
-            1948:   1700(ptr) AccessChain 34(data) 1943 67
-            1949: 24(i16vec4) Load 1948
-            1950: 24(i16vec4) VectorShuffle 1949 1947 4 5 6 3
-                              Store 1948 1950
-            1951:      6(int) Load 8(invocation)
-            1952:   1700(ptr) AccessChain 34(data) 67 67
-            1953: 24(i16vec4) Load 1952
-            1954: 24(i16vec4) GroupNonUniformUMin 42 InclusiveScan 1953
-            1955:   1700(ptr) AccessChain 34(data) 1951 67
-                              Store 1955 1954
-            1956:      6(int) Load 8(invocation)
-            1957:   1693(ptr) AccessChain 34(data) 37 67 38
-            1958: 23(int16_t) Load 1957
-            1959: 23(int16_t) GroupNonUniformUMax 42 InclusiveScan 1958
-            1960:   1693(ptr) AccessChain 34(data) 1956 67 38
-                              Store 1960 1959
-            1961:      6(int) Load 8(invocation)
-            1962:   1700(ptr) AccessChain 34(data) 46 67
-            1963: 24(i16vec4) Load 1962
-            1964:1699(i16vec2) VectorShuffle 1963 1963 0 1
-            1965:1699(i16vec2) GroupNonUniformUMax 42 InclusiveScan 1964
-            1966:   1700(ptr) AccessChain 34(data) 1961 67
-            1967: 24(i16vec4) Load 1966
-            1968: 24(i16vec4) VectorShuffle 1967 1965 4 5 2 3
-                              Store 1966 1968
-            1969:      6(int) Load 8(invocation)
-            1970:   1700(ptr) AccessChain 34(data) 57 67
-            1971: 24(i16vec4) Load 1970
-            1972:1709(i16vec3) VectorShuffle 1971 1971 0 1 2
-            1973:1709(i16vec3) GroupNonUniformUMax 42 InclusiveScan 1972
-            1974:   1700(ptr) AccessChain 34(data) 1969 67
-            1975: 24(i16vec4) Load 1974
-            1976: 24(i16vec4) VectorShuffle 1975 1973 4 5 6 3
-                              Store 1974 1976
-            1977:      6(int) Load 8(invocation)
-            1978:   1700(ptr) AccessChain 34(data) 67 67
-            1979: 24(i16vec4) Load 1978
-            1980: 24(i16vec4) GroupNonUniformUMax 42 InclusiveScan 1979
-            1981:   1700(ptr) AccessChain 34(data) 1977 67
-                              Store 1981 1980
-            1982:      6(int) Load 8(invocation)
-            1983:   1693(ptr) AccessChain 34(data) 37 67 38
-            1984: 23(int16_t) Load 1983
-            1985: 23(int16_t) GroupNonUniformBitwiseAnd 42 InclusiveScan 1984
-            1986:   1693(ptr) AccessChain 34(data) 1982 67 38
-                              Store 1986 1985
-            1987:      6(int) Load 8(invocation)
-            1988:   1700(ptr) AccessChain 34(data) 46 67
-            1989: 24(i16vec4) Load 1988
-            1990:1699(i16vec2) VectorShuffle 1989 1989 0 1
-            1991:1699(i16vec2) GroupNonUniformBitwiseAnd 42 InclusiveScan 1990
-            1992:   1700(ptr) AccessChain 34(data) 1987 67
-            1993: 24(i16vec4) Load 1992
-            1994: 24(i16vec4) VectorShuffle 1993 1991 4 5 2 3
-                              Store 1992 1994
-            1995:      6(int) Load 8(invocation)
-            1996:   1700(ptr) AccessChain 34(data) 57 67
-            1997: 24(i16vec4) Load 1996
-            1998:1709(i16vec3) VectorShuffle 1997 1997 0 1 2
-            1999:1709(i16vec3) GroupNonUniformBitwiseAnd 42 InclusiveScan 1998
-            2000:   1700(ptr) AccessChain 34(data) 1995 67
-            2001: 24(i16vec4) Load 2000
-            2002: 24(i16vec4) VectorShuffle 2001 1999 4 5 6 3
-                              Store 2000 2002
-            2003:      6(int) Load 8(invocation)
-            2004:   1700(ptr) AccessChain 34(data) 67 67
-            2005: 24(i16vec4) Load 2004
-            2006: 24(i16vec4) GroupNonUniformBitwiseAnd 42 InclusiveScan 2005
-            2007:   1700(ptr) AccessChain 34(data) 2003 67
-                              Store 2007 2006
-            2008:      6(int) Load 8(invocation)
-            2009:   1693(ptr) AccessChain 34(data) 37 67 38
-            2010: 23(int16_t) Load 2009
-            2011: 23(int16_t) GroupNonUniformBitwiseOr 42 InclusiveScan 2010
-            2012:   1693(ptr) AccessChain 34(data) 2008 67 38
-                              Store 2012 2011
-            2013:      6(int) Load 8(invocation)
-            2014:   1700(ptr) AccessChain 34(data) 46 67
-            2015: 24(i16vec4) Load 2014
-            2016:1699(i16vec2) VectorShuffle 2015 2015 0 1
-            2017:1699(i16vec2) GroupNonUniformBitwiseOr 42 InclusiveScan 2016
-            2018:   1700(ptr) AccessChain 34(data) 2013 67
-            2019: 24(i16vec4) Load 2018
-            2020: 24(i16vec4) VectorShuffle 2019 2017 4 5 2 3
-                              Store 2018 2020
-            2021:      6(int) Load 8(invocation)
-            2022:   1700(ptr) AccessChain 34(data) 57 67
-            2023: 24(i16vec4) Load 2022
-            2024:1709(i16vec3) VectorShuffle 2023 2023 0 1 2
-            2025:1709(i16vec3) GroupNonUniformBitwiseOr 42 InclusiveScan 2024
-            2026:   1700(ptr) AccessChain 34(data) 2021 67
-            2027: 24(i16vec4) Load 2026
-            2028: 24(i16vec4) VectorShuffle 2027 2025 4 5 6 3
-                              Store 2026 2028
-            2029:      6(int) Load 8(invocation)
-            2030:   1700(ptr) AccessChain 34(data) 67 67
-            2031: 24(i16vec4) Load 2030
-            2032: 24(i16vec4) GroupNonUniformBitwiseOr 42 InclusiveScan 2031
-            2033:   1700(ptr) AccessChain 34(data) 2029 67
-                              Store 2033 2032
-            2034:      6(int) Load 8(invocation)
-            2035:   1693(ptr) AccessChain 34(data) 37 67 38
-            2036: 23(int16_t) Load 2035
-            2037: 23(int16_t) GroupNonUniformBitwiseXor 42 InclusiveScan 2036
-            2038:   1693(ptr) AccessChain 34(data) 2034 67 38
-                              Store 2038 2037
-            2039:      6(int) Load 8(invocation)
-            2040:   1700(ptr) AccessChain 34(data) 46 67
-            2041: 24(i16vec4) Load 2040
-            2042:1699(i16vec2) VectorShuffle 2041 2041 0 1
-            2043:1699(i16vec2) GroupNonUniformBitwiseXor 42 InclusiveScan 2042
-            2044:   1700(ptr) AccessChain 34(data) 2039 67
-            2045: 24(i16vec4) Load 2044
-            2046: 24(i16vec4) VectorShuffle 2045 2043 4 5 2 3
-                              Store 2044 2046
-            2047:      6(int) Load 8(invocation)
-            2048:   1700(ptr) AccessChain 34(data) 57 67
-            2049: 24(i16vec4) Load 2048
-            2050:1709(i16vec3) VectorShuffle 2049 2049 0 1 2
-            2051:1709(i16vec3) GroupNonUniformBitwiseXor 42 InclusiveScan 2050
-            2052:   1700(ptr) AccessChain 34(data) 2047 67
-            2053: 24(i16vec4) Load 2052
-            2054: 24(i16vec4) VectorShuffle 2053 2051 4 5 6 3
-                              Store 2052 2054
-            2055:      6(int) Load 8(invocation)
-            2056:   1700(ptr) AccessChain 34(data) 67 67
-            2057: 24(i16vec4) Load 2056
-            2058: 24(i16vec4) GroupNonUniformBitwiseXor 42 InclusiveScan 2057
-            2059:   1700(ptr) AccessChain 34(data) 2055 67
-                              Store 2059 2058
-            2060:      6(int) Load 8(invocation)
-            2061:   1693(ptr) AccessChain 34(data) 37 67 38
-            2062: 23(int16_t) Load 2061
-            2063: 23(int16_t) GroupNonUniformIAdd 42 ExclusiveScan 2062
-            2064:   1693(ptr) AccessChain 34(data) 2060 67 38
-                              Store 2064 2063
+            1931:   1320(ptr) AccessChain 34(data) 59 59
+            1932: 22(i16vec4) Load 1931
+            1933:1330(i16vec3) VectorShuffle 1932 1932 0 1 2
+            1934:1330(i16vec3) GroupNonUniformBitwiseXor 42 ExclusiveScan 1933
+            1935:   1313(ptr) AccessChain 34(data) 1930 59 38
+            1936: 21(int16_t) CompositeExtract 1934 0
+                              Store 1935 1936
+            1937:   1313(ptr) AccessChain 34(data) 1930 59 55
+            1938: 21(int16_t) CompositeExtract 1934 1
+                              Store 1937 1938
+            1939:   1313(ptr) AccessChain 34(data) 1930 59 69
+            1940: 21(int16_t) CompositeExtract 1934 2
+                              Store 1939 1940
+            1941:      6(int) Load 8(invocation)
+            1942:   1320(ptr) AccessChain 34(data) 73 59
+            1943: 22(i16vec4) Load 1942
+            1944: 22(i16vec4) GroupNonUniformBitwiseXor 42 ExclusiveScan 1943
+            1945:   1320(ptr) AccessChain 34(data) 1941 59
+                              Store 1945 1944
+            1946:      6(int) Load 8(invocation)
+            1948:   1947(ptr) AccessChain 34(data) 37 73 38
+            1949: 23(int16_t) Load 1948
+            1950: 23(int16_t) GroupNonUniformIAdd 42 Reduce 1949
+            1951:   1947(ptr) AccessChain 34(data) 1946 73 38
+                              Store 1951 1950
+            1952:      6(int) Load 8(invocation)
+            1955:   1954(ptr) AccessChain 34(data) 46 73
+            1956: 24(i16vec4) Load 1955
+            1957:1953(i16vec2) VectorShuffle 1956 1956 0 1
+            1958:1953(i16vec2) GroupNonUniformIAdd 42 Reduce 1957
+            1959:   1947(ptr) AccessChain 34(data) 1952 73 38
+            1960: 23(int16_t) CompositeExtract 1958 0
+                              Store 1959 1960
+            1961:   1947(ptr) AccessChain 34(data) 1952 73 55
+            1962: 23(int16_t) CompositeExtract 1958 1
+                              Store 1961 1962
+            1963:      6(int) Load 8(invocation)
+            1965:   1954(ptr) AccessChain 34(data) 59 73
+            1966: 24(i16vec4) Load 1965
+            1967:1964(i16vec3) VectorShuffle 1966 1966 0 1 2
+            1968:1964(i16vec3) GroupNonUniformIAdd 42 Reduce 1967
+            1969:   1947(ptr) AccessChain 34(data) 1963 73 38
+            1970: 23(int16_t) CompositeExtract 1968 0
+                              Store 1969 1970
+            1971:   1947(ptr) AccessChain 34(data) 1963 73 55
+            1972: 23(int16_t) CompositeExtract 1968 1
+                              Store 1971 1972
+            1973:   1947(ptr) AccessChain 34(data) 1963 73 69
+            1974: 23(int16_t) CompositeExtract 1968 2
+                              Store 1973 1974
+            1975:      6(int) Load 8(invocation)
+            1976:   1954(ptr) AccessChain 34(data) 73 73
+            1977: 24(i16vec4) Load 1976
+            1978: 24(i16vec4) GroupNonUniformIAdd 42 Reduce 1977
+            1979:   1954(ptr) AccessChain 34(data) 1975 73
+                              Store 1979 1978
+            1980:      6(int) Load 8(invocation)
+            1981:   1947(ptr) AccessChain 34(data) 37 73 38
+            1982: 23(int16_t) Load 1981
+            1983: 23(int16_t) GroupNonUniformIMul 42 Reduce 1982
+            1984:   1947(ptr) AccessChain 34(data) 1980 73 38
+                              Store 1984 1983
+            1985:      6(int) Load 8(invocation)
+            1986:   1954(ptr) AccessChain 34(data) 46 73
+            1987: 24(i16vec4) Load 1986
+            1988:1953(i16vec2) VectorShuffle 1987 1987 0 1
+            1989:1953(i16vec2) GroupNonUniformIMul 42 Reduce 1988
+            1990:   1947(ptr) AccessChain 34(data) 1985 73 38
+            1991: 23(int16_t) CompositeExtract 1989 0
+                              Store 1990 1991
+            1992:   1947(ptr) AccessChain 34(data) 1985 73 55
+            1993: 23(int16_t) CompositeExtract 1989 1
+                              Store 1992 1993
+            1994:      6(int) Load 8(invocation)
+            1995:   1954(ptr) AccessChain 34(data) 59 73
+            1996: 24(i16vec4) Load 1995
+            1997:1964(i16vec3) VectorShuffle 1996 1996 0 1 2
+            1998:1964(i16vec3) GroupNonUniformIMul 42 Reduce 1997
+            1999:   1947(ptr) AccessChain 34(data) 1994 73 38
+            2000: 23(int16_t) CompositeExtract 1998 0
+                              Store 1999 2000
+            2001:   1947(ptr) AccessChain 34(data) 1994 73 55
+            2002: 23(int16_t) CompositeExtract 1998 1
+                              Store 2001 2002
+            2003:   1947(ptr) AccessChain 34(data) 1994 73 69
+            2004: 23(int16_t) CompositeExtract 1998 2
+                              Store 2003 2004
+            2005:      6(int) Load 8(invocation)
+            2006:   1954(ptr) AccessChain 34(data) 73 73
+            2007: 24(i16vec4) Load 2006
+            2008: 24(i16vec4) GroupNonUniformIMul 42 Reduce 2007
+            2009:   1954(ptr) AccessChain 34(data) 2005 73
+                              Store 2009 2008
+            2010:      6(int) Load 8(invocation)
+            2011:   1947(ptr) AccessChain 34(data) 37 73 38
+            2012: 23(int16_t) Load 2011
+            2013: 23(int16_t) GroupNonUniformUMin 42 Reduce 2012
+            2014:   1947(ptr) AccessChain 34(data) 2010 73 38
+                              Store 2014 2013
+            2015:      6(int) Load 8(invocation)
+            2016:   1954(ptr) AccessChain 34(data) 46 73
+            2017: 24(i16vec4) Load 2016
+            2018:1953(i16vec2) VectorShuffle 2017 2017 0 1
+            2019:1953(i16vec2) GroupNonUniformUMin 42 Reduce 2018
+            2020:   1947(ptr) AccessChain 34(data) 2015 73 38
+            2021: 23(int16_t) CompositeExtract 2019 0
+                              Store 2020 2021
+            2022:   1947(ptr) AccessChain 34(data) 2015 73 55
+            2023: 23(int16_t) CompositeExtract 2019 1
+                              Store 2022 2023
+            2024:      6(int) Load 8(invocation)
+            2025:   1954(ptr) AccessChain 34(data) 59 73
+            2026: 24(i16vec4) Load 2025
+            2027:1964(i16vec3) VectorShuffle 2026 2026 0 1 2
+            2028:1964(i16vec3) GroupNonUniformUMin 42 Reduce 2027
+            2029:   1947(ptr) AccessChain 34(data) 2024 73 38
+            2030: 23(int16_t) CompositeExtract 2028 0
+                              Store 2029 2030
+            2031:   1947(ptr) AccessChain 34(data) 2024 73 55
+            2032: 23(int16_t) CompositeExtract 2028 1
+                              Store 2031 2032
+            2033:   1947(ptr) AccessChain 34(data) 2024 73 69
+            2034: 23(int16_t) CompositeExtract 2028 2
+                              Store 2033 2034
+            2035:      6(int) Load 8(invocation)
+            2036:   1954(ptr) AccessChain 34(data) 73 73
+            2037: 24(i16vec4) Load 2036
+            2038: 24(i16vec4) GroupNonUniformUMin 42 Reduce 2037
+            2039:   1954(ptr) AccessChain 34(data) 2035 73
+                              Store 2039 2038
+            2040:      6(int) Load 8(invocation)
+            2041:   1947(ptr) AccessChain 34(data) 37 73 38
+            2042: 23(int16_t) Load 2041
+            2043: 23(int16_t) GroupNonUniformUMax 42 Reduce 2042
+            2044:   1947(ptr) AccessChain 34(data) 2040 73 38
+                              Store 2044 2043
+            2045:      6(int) Load 8(invocation)
+            2046:   1954(ptr) AccessChain 34(data) 46 73
+            2047: 24(i16vec4) Load 2046
+            2048:1953(i16vec2) VectorShuffle 2047 2047 0 1
+            2049:1953(i16vec2) GroupNonUniformUMax 42 Reduce 2048
+            2050:   1947(ptr) AccessChain 34(data) 2045 73 38
+            2051: 23(int16_t) CompositeExtract 2049 0
+                              Store 2050 2051
+            2052:   1947(ptr) AccessChain 34(data) 2045 73 55
+            2053: 23(int16_t) CompositeExtract 2049 1
+                              Store 2052 2053
+            2054:      6(int) Load 8(invocation)
+            2055:   1954(ptr) AccessChain 34(data) 59 73
+            2056: 24(i16vec4) Load 2055
+            2057:1964(i16vec3) VectorShuffle 2056 2056 0 1 2
+            2058:1964(i16vec3) GroupNonUniformUMax 42 Reduce 2057
+            2059:   1947(ptr) AccessChain 34(data) 2054 73 38
+            2060: 23(int16_t) CompositeExtract 2058 0
+                              Store 2059 2060
+            2061:   1947(ptr) AccessChain 34(data) 2054 73 55
+            2062: 23(int16_t) CompositeExtract 2058 1
+                              Store 2061 2062
+            2063:   1947(ptr) AccessChain 34(data) 2054 73 69
+            2064: 23(int16_t) CompositeExtract 2058 2
+                              Store 2063 2064
             2065:      6(int) Load 8(invocation)
-            2066:   1700(ptr) AccessChain 34(data) 46 67
+            2066:   1954(ptr) AccessChain 34(data) 73 73
             2067: 24(i16vec4) Load 2066
-            2068:1699(i16vec2) VectorShuffle 2067 2067 0 1
-            2069:1699(i16vec2) GroupNonUniformIAdd 42 ExclusiveScan 2068
-            2070:   1700(ptr) AccessChain 34(data) 2065 67
-            2071: 24(i16vec4) Load 2070
-            2072: 24(i16vec4) VectorShuffle 2071 2069 4 5 2 3
-                              Store 2070 2072
-            2073:      6(int) Load 8(invocation)
-            2074:   1700(ptr) AccessChain 34(data) 57 67
-            2075: 24(i16vec4) Load 2074
-            2076:1709(i16vec3) VectorShuffle 2075 2075 0 1 2
-            2077:1709(i16vec3) GroupNonUniformIAdd 42 ExclusiveScan 2076
-            2078:   1700(ptr) AccessChain 34(data) 2073 67
-            2079: 24(i16vec4) Load 2078
-            2080: 24(i16vec4) VectorShuffle 2079 2077 4 5 6 3
-                              Store 2078 2080
-            2081:      6(int) Load 8(invocation)
-            2082:   1700(ptr) AccessChain 34(data) 67 67
-            2083: 24(i16vec4) Load 2082
-            2084: 24(i16vec4) GroupNonUniformIAdd 42 ExclusiveScan 2083
-            2085:   1700(ptr) AccessChain 34(data) 2081 67
-                              Store 2085 2084
-            2086:      6(int) Load 8(invocation)
-            2087:   1693(ptr) AccessChain 34(data) 37 67 38
-            2088: 23(int16_t) Load 2087
-            2089: 23(int16_t) GroupNonUniformIMul 42 ExclusiveScan 2088
-            2090:   1693(ptr) AccessChain 34(data) 2086 67 38
-                              Store 2090 2089
-            2091:      6(int) Load 8(invocation)
-            2092:   1700(ptr) AccessChain 34(data) 46 67
-            2093: 24(i16vec4) Load 2092
-            2094:1699(i16vec2) VectorShuffle 2093 2093 0 1
-            2095:1699(i16vec2) GroupNonUniformIMul 42 ExclusiveScan 2094
-            2096:   1700(ptr) AccessChain 34(data) 2091 67
+            2068: 24(i16vec4) GroupNonUniformUMax 42 Reduce 2067
+            2069:   1954(ptr) AccessChain 34(data) 2065 73
+                              Store 2069 2068
+            2070:      6(int) Load 8(invocation)
+            2071:   1947(ptr) AccessChain 34(data) 37 73 38
+            2072: 23(int16_t) Load 2071
+            2073: 23(int16_t) GroupNonUniformBitwiseAnd 42 Reduce 2072
+            2074:   1947(ptr) AccessChain 34(data) 2070 73 38
+                              Store 2074 2073
+            2075:      6(int) Load 8(invocation)
+            2076:   1954(ptr) AccessChain 34(data) 46 73
+            2077: 24(i16vec4) Load 2076
+            2078:1953(i16vec2) VectorShuffle 2077 2077 0 1
+            2079:1953(i16vec2) GroupNonUniformBitwiseAnd 42 Reduce 2078
+            2080:   1947(ptr) AccessChain 34(data) 2075 73 38
+            2081: 23(int16_t) CompositeExtract 2079 0
+                              Store 2080 2081
+            2082:   1947(ptr) AccessChain 34(data) 2075 73 55
+            2083: 23(int16_t) CompositeExtract 2079 1
+                              Store 2082 2083
+            2084:      6(int) Load 8(invocation)
+            2085:   1954(ptr) AccessChain 34(data) 59 73
+            2086: 24(i16vec4) Load 2085
+            2087:1964(i16vec3) VectorShuffle 2086 2086 0 1 2
+            2088:1964(i16vec3) GroupNonUniformBitwiseAnd 42 Reduce 2087
+            2089:   1947(ptr) AccessChain 34(data) 2084 73 38
+            2090: 23(int16_t) CompositeExtract 2088 0
+                              Store 2089 2090
+            2091:   1947(ptr) AccessChain 34(data) 2084 73 55
+            2092: 23(int16_t) CompositeExtract 2088 1
+                              Store 2091 2092
+            2093:   1947(ptr) AccessChain 34(data) 2084 73 69
+            2094: 23(int16_t) CompositeExtract 2088 2
+                              Store 2093 2094
+            2095:      6(int) Load 8(invocation)
+            2096:   1954(ptr) AccessChain 34(data) 73 73
             2097: 24(i16vec4) Load 2096
-            2098: 24(i16vec4) VectorShuffle 2097 2095 4 5 2 3
-                              Store 2096 2098
-            2099:      6(int) Load 8(invocation)
-            2100:   1700(ptr) AccessChain 34(data) 57 67
-            2101: 24(i16vec4) Load 2100
-            2102:1709(i16vec3) VectorShuffle 2101 2101 0 1 2
-            2103:1709(i16vec3) GroupNonUniformIMul 42 ExclusiveScan 2102
-            2104:   1700(ptr) AccessChain 34(data) 2099 67
-            2105: 24(i16vec4) Load 2104
-            2106: 24(i16vec4) VectorShuffle 2105 2103 4 5 6 3
-                              Store 2104 2106
-            2107:      6(int) Load 8(invocation)
-            2108:   1700(ptr) AccessChain 34(data) 67 67
-            2109: 24(i16vec4) Load 2108
-            2110: 24(i16vec4) GroupNonUniformIMul 42 ExclusiveScan 2109
-            2111:   1700(ptr) AccessChain 34(data) 2107 67
-                              Store 2111 2110
-            2112:      6(int) Load 8(invocation)
-            2113:   1693(ptr) AccessChain 34(data) 37 67 38
-            2114: 23(int16_t) Load 2113
-            2115: 23(int16_t) GroupNonUniformUMin 42 ExclusiveScan 2114
-            2116:   1693(ptr) AccessChain 34(data) 2112 67 38
-                              Store 2116 2115
-            2117:      6(int) Load 8(invocation)
-            2118:   1700(ptr) AccessChain 34(data) 46 67
-            2119: 24(i16vec4) Load 2118
-            2120:1699(i16vec2) VectorShuffle 2119 2119 0 1
-            2121:1699(i16vec2) GroupNonUniformUMin 42 ExclusiveScan 2120
-            2122:   1700(ptr) AccessChain 34(data) 2117 67
-            2123: 24(i16vec4) Load 2122
-            2124: 24(i16vec4) VectorShuffle 2123 2121 4 5 2 3
-                              Store 2122 2124
+            2098: 24(i16vec4) GroupNonUniformBitwiseAnd 42 Reduce 2097
+            2099:   1954(ptr) AccessChain 34(data) 2095 73
+                              Store 2099 2098
+            2100:      6(int) Load 8(invocation)
+            2101:   1947(ptr) AccessChain 34(data) 37 73 38
+            2102: 23(int16_t) Load 2101
+            2103: 23(int16_t) GroupNonUniformBitwiseOr 42 Reduce 2102
+            2104:   1947(ptr) AccessChain 34(data) 2100 73 38
+                              Store 2104 2103
+            2105:      6(int) Load 8(invocation)
+            2106:   1954(ptr) AccessChain 34(data) 46 73
+            2107: 24(i16vec4) Load 2106
+            2108:1953(i16vec2) VectorShuffle 2107 2107 0 1
+            2109:1953(i16vec2) GroupNonUniformBitwiseOr 42 Reduce 2108
+            2110:   1947(ptr) AccessChain 34(data) 2105 73 38
+            2111: 23(int16_t) CompositeExtract 2109 0
+                              Store 2110 2111
+            2112:   1947(ptr) AccessChain 34(data) 2105 73 55
+            2113: 23(int16_t) CompositeExtract 2109 1
+                              Store 2112 2113
+            2114:      6(int) Load 8(invocation)
+            2115:   1954(ptr) AccessChain 34(data) 59 73
+            2116: 24(i16vec4) Load 2115
+            2117:1964(i16vec3) VectorShuffle 2116 2116 0 1 2
+            2118:1964(i16vec3) GroupNonUniformBitwiseOr 42 Reduce 2117
+            2119:   1947(ptr) AccessChain 34(data) 2114 73 38
+            2120: 23(int16_t) CompositeExtract 2118 0
+                              Store 2119 2120
+            2121:   1947(ptr) AccessChain 34(data) 2114 73 55
+            2122: 23(int16_t) CompositeExtract 2118 1
+                              Store 2121 2122
+            2123:   1947(ptr) AccessChain 34(data) 2114 73 69
+            2124: 23(int16_t) CompositeExtract 2118 2
+                              Store 2123 2124
             2125:      6(int) Load 8(invocation)
-            2126:   1700(ptr) AccessChain 34(data) 57 67
+            2126:   1954(ptr) AccessChain 34(data) 73 73
             2127: 24(i16vec4) Load 2126
-            2128:1709(i16vec3) VectorShuffle 2127 2127 0 1 2
-            2129:1709(i16vec3) GroupNonUniformUMin 42 ExclusiveScan 2128
-            2130:   1700(ptr) AccessChain 34(data) 2125 67
-            2131: 24(i16vec4) Load 2130
-            2132: 24(i16vec4) VectorShuffle 2131 2129 4 5 6 3
-                              Store 2130 2132
-            2133:      6(int) Load 8(invocation)
-            2134:   1700(ptr) AccessChain 34(data) 67 67
-            2135: 24(i16vec4) Load 2134
-            2136: 24(i16vec4) GroupNonUniformUMin 42 ExclusiveScan 2135
-            2137:   1700(ptr) AccessChain 34(data) 2133 67
-                              Store 2137 2136
-            2138:      6(int) Load 8(invocation)
-            2139:   1693(ptr) AccessChain 34(data) 37 67 38
-            2140: 23(int16_t) Load 2139
-            2141: 23(int16_t) GroupNonUniformUMax 42 ExclusiveScan 2140
-            2142:   1693(ptr) AccessChain 34(data) 2138 67 38
-                              Store 2142 2141
-            2143:      6(int) Load 8(invocation)
-            2144:   1700(ptr) AccessChain 34(data) 46 67
-            2145: 24(i16vec4) Load 2144
-            2146:1699(i16vec2) VectorShuffle 2145 2145 0 1
-            2147:1699(i16vec2) GroupNonUniformUMax 42 ExclusiveScan 2146
-            2148:   1700(ptr) AccessChain 34(data) 2143 67
-            2149: 24(i16vec4) Load 2148
-            2150: 24(i16vec4) VectorShuffle 2149 2147 4 5 2 3
-                              Store 2148 2150
-            2151:      6(int) Load 8(invocation)
-            2152:   1700(ptr) AccessChain 34(data) 57 67
-            2153: 24(i16vec4) Load 2152
-            2154:1709(i16vec3) VectorShuffle 2153 2153 0 1 2
-            2155:1709(i16vec3) GroupNonUniformUMax 42 ExclusiveScan 2154
-            2156:   1700(ptr) AccessChain 34(data) 2151 67
+            2128: 24(i16vec4) GroupNonUniformBitwiseOr 42 Reduce 2127
+            2129:   1954(ptr) AccessChain 34(data) 2125 73
+                              Store 2129 2128
+            2130:      6(int) Load 8(invocation)
+            2131:   1947(ptr) AccessChain 34(data) 37 73 38
+            2132: 23(int16_t) Load 2131
+            2133: 23(int16_t) GroupNonUniformBitwiseXor 42 Reduce 2132
+            2134:   1947(ptr) AccessChain 34(data) 2130 73 38
+                              Store 2134 2133
+            2135:      6(int) Load 8(invocation)
+            2136:   1954(ptr) AccessChain 34(data) 46 73
+            2137: 24(i16vec4) Load 2136
+            2138:1953(i16vec2) VectorShuffle 2137 2137 0 1
+            2139:1953(i16vec2) GroupNonUniformBitwiseXor 42 Reduce 2138
+            2140:   1947(ptr) AccessChain 34(data) 2135 73 38
+            2141: 23(int16_t) CompositeExtract 2139 0
+                              Store 2140 2141
+            2142:   1947(ptr) AccessChain 34(data) 2135 73 55
+            2143: 23(int16_t) CompositeExtract 2139 1
+                              Store 2142 2143
+            2144:      6(int) Load 8(invocation)
+            2145:   1954(ptr) AccessChain 34(data) 59 73
+            2146: 24(i16vec4) Load 2145
+            2147:1964(i16vec3) VectorShuffle 2146 2146 0 1 2
+            2148:1964(i16vec3) GroupNonUniformBitwiseXor 42 Reduce 2147
+            2149:   1947(ptr) AccessChain 34(data) 2144 73 38
+            2150: 23(int16_t) CompositeExtract 2148 0
+                              Store 2149 2150
+            2151:   1947(ptr) AccessChain 34(data) 2144 73 55
+            2152: 23(int16_t) CompositeExtract 2148 1
+                              Store 2151 2152
+            2153:   1947(ptr) AccessChain 34(data) 2144 73 69
+            2154: 23(int16_t) CompositeExtract 2148 2
+                              Store 2153 2154
+            2155:      6(int) Load 8(invocation)
+            2156:   1954(ptr) AccessChain 34(data) 73 73
             2157: 24(i16vec4) Load 2156
-            2158: 24(i16vec4) VectorShuffle 2157 2155 4 5 6 3
-                              Store 2156 2158
-            2159:      6(int) Load 8(invocation)
-            2160:   1700(ptr) AccessChain 34(data) 67 67
-            2161: 24(i16vec4) Load 2160
-            2162: 24(i16vec4) GroupNonUniformUMax 42 ExclusiveScan 2161
-            2163:   1700(ptr) AccessChain 34(data) 2159 67
-                              Store 2163 2162
-            2164:      6(int) Load 8(invocation)
-            2165:   1693(ptr) AccessChain 34(data) 37 67 38
-            2166: 23(int16_t) Load 2165
-            2167: 23(int16_t) GroupNonUniformBitwiseAnd 42 ExclusiveScan 2166
-            2168:   1693(ptr) AccessChain 34(data) 2164 67 38
-                              Store 2168 2167
-            2169:      6(int) Load 8(invocation)
-            2170:   1700(ptr) AccessChain 34(data) 46 67
-            2171: 24(i16vec4) Load 2170
-            2172:1699(i16vec2) VectorShuffle 2171 2171 0 1
-            2173:1699(i16vec2) GroupNonUniformBitwiseAnd 42 ExclusiveScan 2172
-            2174:   1700(ptr) AccessChain 34(data) 2169 67
-            2175: 24(i16vec4) Load 2174
-            2176: 24(i16vec4) VectorShuffle 2175 2173 4 5 2 3
-                              Store 2174 2176
-            2177:      6(int) Load 8(invocation)
-            2178:   1700(ptr) AccessChain 34(data) 57 67
-            2179: 24(i16vec4) Load 2178
-            2180:1709(i16vec3) VectorShuffle 2179 2179 0 1 2
-            2181:1709(i16vec3) GroupNonUniformBitwiseAnd 42 ExclusiveScan 2180
-            2182:   1700(ptr) AccessChain 34(data) 2177 67
-            2183: 24(i16vec4) Load 2182
-            2184: 24(i16vec4) VectorShuffle 2183 2181 4 5 6 3
-                              Store 2182 2184
+            2158: 24(i16vec4) GroupNonUniformBitwiseXor 42 Reduce 2157
+            2159:   1954(ptr) AccessChain 34(data) 2155 73
+                              Store 2159 2158
+            2160:      6(int) Load 8(invocation)
+            2161:   1947(ptr) AccessChain 34(data) 37 73 38
+            2162: 23(int16_t) Load 2161
+            2163: 23(int16_t) GroupNonUniformIAdd 42 InclusiveScan 2162
+            2164:   1947(ptr) AccessChain 34(data) 2160 73 38
+                              Store 2164 2163
+            2165:      6(int) Load 8(invocation)
+            2166:   1954(ptr) AccessChain 34(data) 46 73
+            2167: 24(i16vec4) Load 2166
+            2168:1953(i16vec2) VectorShuffle 2167 2167 0 1
+            2169:1953(i16vec2) GroupNonUniformIAdd 42 InclusiveScan 2168
+            2170:   1947(ptr) AccessChain 34(data) 2165 73 38
+            2171: 23(int16_t) CompositeExtract 2169 0
+                              Store 2170 2171
+            2172:   1947(ptr) AccessChain 34(data) 2165 73 55
+            2173: 23(int16_t) CompositeExtract 2169 1
+                              Store 2172 2173
+            2174:      6(int) Load 8(invocation)
+            2175:   1954(ptr) AccessChain 34(data) 59 73
+            2176: 24(i16vec4) Load 2175
+            2177:1964(i16vec3) VectorShuffle 2176 2176 0 1 2
+            2178:1964(i16vec3) GroupNonUniformIAdd 42 InclusiveScan 2177
+            2179:   1947(ptr) AccessChain 34(data) 2174 73 38
+            2180: 23(int16_t) CompositeExtract 2178 0
+                              Store 2179 2180
+            2181:   1947(ptr) AccessChain 34(data) 2174 73 55
+            2182: 23(int16_t) CompositeExtract 2178 1
+                              Store 2181 2182
+            2183:   1947(ptr) AccessChain 34(data) 2174 73 69
+            2184: 23(int16_t) CompositeExtract 2178 2
+                              Store 2183 2184
             2185:      6(int) Load 8(invocation)
-            2186:   1700(ptr) AccessChain 34(data) 67 67
+            2186:   1954(ptr) AccessChain 34(data) 73 73
             2187: 24(i16vec4) Load 2186
-            2188: 24(i16vec4) GroupNonUniformBitwiseAnd 42 ExclusiveScan 2187
-            2189:   1700(ptr) AccessChain 34(data) 2185 67
+            2188: 24(i16vec4) GroupNonUniformIAdd 42 InclusiveScan 2187
+            2189:   1954(ptr) AccessChain 34(data) 2185 73
                               Store 2189 2188
             2190:      6(int) Load 8(invocation)
-            2191:   1693(ptr) AccessChain 34(data) 37 67 38
+            2191:   1947(ptr) AccessChain 34(data) 37 73 38
             2192: 23(int16_t) Load 2191
-            2193: 23(int16_t) GroupNonUniformBitwiseOr 42 ExclusiveScan 2192
-            2194:   1693(ptr) AccessChain 34(data) 2190 67 38
+            2193: 23(int16_t) GroupNonUniformIMul 42 InclusiveScan 2192
+            2194:   1947(ptr) AccessChain 34(data) 2190 73 38
                               Store 2194 2193
             2195:      6(int) Load 8(invocation)
-            2196:   1700(ptr) AccessChain 34(data) 46 67
+            2196:   1954(ptr) AccessChain 34(data) 46 73
             2197: 24(i16vec4) Load 2196
-            2198:1699(i16vec2) VectorShuffle 2197 2197 0 1
-            2199:1699(i16vec2) GroupNonUniformBitwiseOr 42 ExclusiveScan 2198
-            2200:   1700(ptr) AccessChain 34(data) 2195 67
-            2201: 24(i16vec4) Load 2200
-            2202: 24(i16vec4) VectorShuffle 2201 2199 4 5 2 3
-                              Store 2200 2202
-            2203:      6(int) Load 8(invocation)
-            2204:   1700(ptr) AccessChain 34(data) 57 67
-            2205: 24(i16vec4) Load 2204
-            2206:1709(i16vec3) VectorShuffle 2205 2205 0 1 2
-            2207:1709(i16vec3) GroupNonUniformBitwiseOr 42 ExclusiveScan 2206
-            2208:   1700(ptr) AccessChain 34(data) 2203 67
-            2209: 24(i16vec4) Load 2208
-            2210: 24(i16vec4) VectorShuffle 2209 2207 4 5 6 3
-                              Store 2208 2210
-            2211:      6(int) Load 8(invocation)
-            2212:   1700(ptr) AccessChain 34(data) 67 67
-            2213: 24(i16vec4) Load 2212
-            2214: 24(i16vec4) GroupNonUniformBitwiseOr 42 ExclusiveScan 2213
-            2215:   1700(ptr) AccessChain 34(data) 2211 67
-                              Store 2215 2214
-            2216:      6(int) Load 8(invocation)
-            2217:   1693(ptr) AccessChain 34(data) 37 67 38
-            2218: 23(int16_t) Load 2217
-            2219: 23(int16_t) GroupNonUniformBitwiseXor 42 ExclusiveScan 2218
-            2220:   1693(ptr) AccessChain 34(data) 2216 67 38
-                              Store 2220 2219
-            2221:      6(int) Load 8(invocation)
-            2222:   1700(ptr) AccessChain 34(data) 46 67
-            2223: 24(i16vec4) Load 2222
-            2224:1699(i16vec2) VectorShuffle 2223 2223 0 1
-            2225:1699(i16vec2) GroupNonUniformBitwiseXor 42 ExclusiveScan 2224
-            2226:   1700(ptr) AccessChain 34(data) 2221 67
+            2198:1953(i16vec2) VectorShuffle 2197 2197 0 1
+            2199:1953(i16vec2) GroupNonUniformIMul 42 InclusiveScan 2198
+            2200:   1947(ptr) AccessChain 34(data) 2195 73 38
+            2201: 23(int16_t) CompositeExtract 2199 0
+                              Store 2200 2201
+            2202:   1947(ptr) AccessChain 34(data) 2195 73 55
+            2203: 23(int16_t) CompositeExtract 2199 1
+                              Store 2202 2203
+            2204:      6(int) Load 8(invocation)
+            2205:   1954(ptr) AccessChain 34(data) 59 73
+            2206: 24(i16vec4) Load 2205
+            2207:1964(i16vec3) VectorShuffle 2206 2206 0 1 2
+            2208:1964(i16vec3) GroupNonUniformIMul 42 InclusiveScan 2207
+            2209:   1947(ptr) AccessChain 34(data) 2204 73 38
+            2210: 23(int16_t) CompositeExtract 2208 0
+                              Store 2209 2210
+            2211:   1947(ptr) AccessChain 34(data) 2204 73 55
+            2212: 23(int16_t) CompositeExtract 2208 1
+                              Store 2211 2212
+            2213:   1947(ptr) AccessChain 34(data) 2204 73 69
+            2214: 23(int16_t) CompositeExtract 2208 2
+                              Store 2213 2214
+            2215:      6(int) Load 8(invocation)
+            2216:   1954(ptr) AccessChain 34(data) 73 73
+            2217: 24(i16vec4) Load 2216
+            2218: 24(i16vec4) GroupNonUniformIMul 42 InclusiveScan 2217
+            2219:   1954(ptr) AccessChain 34(data) 2215 73
+                              Store 2219 2218
+            2220:      6(int) Load 8(invocation)
+            2221:   1947(ptr) AccessChain 34(data) 37 73 38
+            2222: 23(int16_t) Load 2221
+            2223: 23(int16_t) GroupNonUniformUMin 42 InclusiveScan 2222
+            2224:   1947(ptr) AccessChain 34(data) 2220 73 38
+                              Store 2224 2223
+            2225:      6(int) Load 8(invocation)
+            2226:   1954(ptr) AccessChain 34(data) 46 73
             2227: 24(i16vec4) Load 2226
-            2228: 24(i16vec4) VectorShuffle 2227 2225 4 5 2 3
-                              Store 2226 2228
-            2229:      6(int) Load 8(invocation)
-            2230:   1700(ptr) AccessChain 34(data) 57 67
-            2231: 24(i16vec4) Load 2230
-            2232:1709(i16vec3) VectorShuffle 2231 2231 0 1 2
-            2233:1709(i16vec3) GroupNonUniformBitwiseXor 42 ExclusiveScan 2232
-            2234:   1700(ptr) AccessChain 34(data) 2229 67
-            2235: 24(i16vec4) Load 2234
-            2236: 24(i16vec4) VectorShuffle 2235 2233 4 5 6 3
-                              Store 2234 2236
-            2237:      6(int) Load 8(invocation)
-            2238:   1700(ptr) AccessChain 34(data) 67 67
-            2239: 24(i16vec4) Load 2238
-            2240: 24(i16vec4) GroupNonUniformBitwiseXor 42 ExclusiveScan 2239
-            2241:   1700(ptr) AccessChain 34(data) 2237 67
-                              Store 2241 2240
-            2242:      6(int) Load 8(invocation)
-            2245:   2244(ptr) AccessChain 34(data) 37 2243 38
-            2246: 25(int64_t) Load 2245
-            2247: 25(int64_t) GroupNonUniformIAdd 42 Reduce 2246
-            2248:   2244(ptr) AccessChain 34(data) 2242 2243 38
-                              Store 2248 2247
-            2249:      6(int) Load 8(invocation)
-            2252:   2251(ptr) AccessChain 34(data) 46 2243
-            2253: 26(i64vec4) Load 2252
-            2254:2250(i64vec2) VectorShuffle 2253 2253 0 1
-            2255:2250(i64vec2) GroupNonUniformIAdd 42 Reduce 2254
-            2256:   2251(ptr) AccessChain 34(data) 2249 2243
-            2257: 26(i64vec4) Load 2256
-            2258: 26(i64vec4) VectorShuffle 2257 2255 4 5 2 3
-                              Store 2256 2258
-            2259:      6(int) Load 8(invocation)
-            2261:   2251(ptr) AccessChain 34(data) 57 2243
-            2262: 26(i64vec4) Load 2261
-            2263:2260(i64vec3) VectorShuffle 2262 2262 0 1 2
-            2264:2260(i64vec3) GroupNonUniformIAdd 42 Reduce 2263
-            2265:   2251(ptr) AccessChain 34(data) 2259 2243
-            2266: 26(i64vec4) Load 2265
-            2267: 26(i64vec4) VectorShuffle 2266 2264 4 5 6 3
-                              Store 2265 2267
-            2268:      6(int) Load 8(invocation)
-            2269:   2251(ptr) AccessChain 34(data) 67 2243
-            2270: 26(i64vec4) Load 2269
-            2271: 26(i64vec4) GroupNonUniformIAdd 42 Reduce 2270
-            2272:   2251(ptr) AccessChain 34(data) 2268 2243
-                              Store 2272 2271
-            2273:      6(int) Load 8(invocation)
-            2274:   2244(ptr) AccessChain 34(data) 37 2243 38
-            2275: 25(int64_t) Load 2274
-            2276: 25(int64_t) GroupNonUniformIMul 42 Reduce 2275
-            2277:   2244(ptr) AccessChain 34(data) 2273 2243 38
-                              Store 2277 2276
-            2278:      6(int) Load 8(invocation)
-            2279:   2251(ptr) AccessChain 34(data) 46 2243
-            2280: 26(i64vec4) Load 2279
-            2281:2250(i64vec2) VectorShuffle 2280 2280 0 1
-            2282:2250(i64vec2) GroupNonUniformIMul 42 Reduce 2281
-            2283:   2251(ptr) AccessChain 34(data) 2278 2243
-            2284: 26(i64vec4) Load 2283
-            2285: 26(i64vec4) VectorShuffle 2284 2282 4 5 2 3
-                              Store 2283 2285
-            2286:      6(int) Load 8(invocation)
-            2287:   2251(ptr) AccessChain 34(data) 57 2243
-            2288: 26(i64vec4) Load 2287
-            2289:2260(i64vec3) VectorShuffle 2288 2288 0 1 2
-            2290:2260(i64vec3) GroupNonUniformIMul 42 Reduce 2289
-            2291:   2251(ptr) AccessChain 34(data) 2286 2243
-            2292: 26(i64vec4) Load 2291
-            2293: 26(i64vec4) VectorShuffle 2292 2290 4 5 6 3
-                              Store 2291 2293
+            2228:1953(i16vec2) VectorShuffle 2227 2227 0 1
+            2229:1953(i16vec2) GroupNonUniformUMin 42 InclusiveScan 2228
+            2230:   1947(ptr) AccessChain 34(data) 2225 73 38
+            2231: 23(int16_t) CompositeExtract 2229 0
+                              Store 2230 2231
+            2232:   1947(ptr) AccessChain 34(data) 2225 73 55
+            2233: 23(int16_t) CompositeExtract 2229 1
+                              Store 2232 2233
+            2234:      6(int) Load 8(invocation)
+            2235:   1954(ptr) AccessChain 34(data) 59 73
+            2236: 24(i16vec4) Load 2235
+            2237:1964(i16vec3) VectorShuffle 2236 2236 0 1 2
+            2238:1964(i16vec3) GroupNonUniformUMin 42 InclusiveScan 2237
+            2239:   1947(ptr) AccessChain 34(data) 2234 73 38
+            2240: 23(int16_t) CompositeExtract 2238 0
+                              Store 2239 2240
+            2241:   1947(ptr) AccessChain 34(data) 2234 73 55
+            2242: 23(int16_t) CompositeExtract 2238 1
+                              Store 2241 2242
+            2243:   1947(ptr) AccessChain 34(data) 2234 73 69
+            2244: 23(int16_t) CompositeExtract 2238 2
+                              Store 2243 2244
+            2245:      6(int) Load 8(invocation)
+            2246:   1954(ptr) AccessChain 34(data) 73 73
+            2247: 24(i16vec4) Load 2246
+            2248: 24(i16vec4) GroupNonUniformUMin 42 InclusiveScan 2247
+            2249:   1954(ptr) AccessChain 34(data) 2245 73
+                              Store 2249 2248
+            2250:      6(int) Load 8(invocation)
+            2251:   1947(ptr) AccessChain 34(data) 37 73 38
+            2252: 23(int16_t) Load 2251
+            2253: 23(int16_t) GroupNonUniformUMax 42 InclusiveScan 2252
+            2254:   1947(ptr) AccessChain 34(data) 2250 73 38
+                              Store 2254 2253
+            2255:      6(int) Load 8(invocation)
+            2256:   1954(ptr) AccessChain 34(data) 46 73
+            2257: 24(i16vec4) Load 2256
+            2258:1953(i16vec2) VectorShuffle 2257 2257 0 1
+            2259:1953(i16vec2) GroupNonUniformUMax 42 InclusiveScan 2258
+            2260:   1947(ptr) AccessChain 34(data) 2255 73 38
+            2261: 23(int16_t) CompositeExtract 2259 0
+                              Store 2260 2261
+            2262:   1947(ptr) AccessChain 34(data) 2255 73 55
+            2263: 23(int16_t) CompositeExtract 2259 1
+                              Store 2262 2263
+            2264:      6(int) Load 8(invocation)
+            2265:   1954(ptr) AccessChain 34(data) 59 73
+            2266: 24(i16vec4) Load 2265
+            2267:1964(i16vec3) VectorShuffle 2266 2266 0 1 2
+            2268:1964(i16vec3) GroupNonUniformUMax 42 InclusiveScan 2267
+            2269:   1947(ptr) AccessChain 34(data) 2264 73 38
+            2270: 23(int16_t) CompositeExtract 2268 0
+                              Store 2269 2270
+            2271:   1947(ptr) AccessChain 34(data) 2264 73 55
+            2272: 23(int16_t) CompositeExtract 2268 1
+                              Store 2271 2272
+            2273:   1947(ptr) AccessChain 34(data) 2264 73 69
+            2274: 23(int16_t) CompositeExtract 2268 2
+                              Store 2273 2274
+            2275:      6(int) Load 8(invocation)
+            2276:   1954(ptr) AccessChain 34(data) 73 73
+            2277: 24(i16vec4) Load 2276
+            2278: 24(i16vec4) GroupNonUniformUMax 42 InclusiveScan 2277
+            2279:   1954(ptr) AccessChain 34(data) 2275 73
+                              Store 2279 2278
+            2280:      6(int) Load 8(invocation)
+            2281:   1947(ptr) AccessChain 34(data) 37 73 38
+            2282: 23(int16_t) Load 2281
+            2283: 23(int16_t) GroupNonUniformBitwiseAnd 42 InclusiveScan 2282
+            2284:   1947(ptr) AccessChain 34(data) 2280 73 38
+                              Store 2284 2283
+            2285:      6(int) Load 8(invocation)
+            2286:   1954(ptr) AccessChain 34(data) 46 73
+            2287: 24(i16vec4) Load 2286
+            2288:1953(i16vec2) VectorShuffle 2287 2287 0 1
+            2289:1953(i16vec2) GroupNonUniformBitwiseAnd 42 InclusiveScan 2288
+            2290:   1947(ptr) AccessChain 34(data) 2285 73 38
+            2291: 23(int16_t) CompositeExtract 2289 0
+                              Store 2290 2291
+            2292:   1947(ptr) AccessChain 34(data) 2285 73 55
+            2293: 23(int16_t) CompositeExtract 2289 1
+                              Store 2292 2293
             2294:      6(int) Load 8(invocation)
-            2295:   2251(ptr) AccessChain 34(data) 67 2243
-            2296: 26(i64vec4) Load 2295
-            2297: 26(i64vec4) GroupNonUniformIMul 42 Reduce 2296
-            2298:   2251(ptr) AccessChain 34(data) 2294 2243
-                              Store 2298 2297
-            2299:      6(int) Load 8(invocation)
-            2300:   2244(ptr) AccessChain 34(data) 37 2243 38
-            2301: 25(int64_t) Load 2300
-            2302: 25(int64_t) GroupNonUniformSMin 42 Reduce 2301
-            2303:   2244(ptr) AccessChain 34(data) 2299 2243 38
-                              Store 2303 2302
-            2304:      6(int) Load 8(invocation)
-            2305:   2251(ptr) AccessChain 34(data) 46 2243
-            2306: 26(i64vec4) Load 2305
-            2307:2250(i64vec2) VectorShuffle 2306 2306 0 1
-            2308:2250(i64vec2) GroupNonUniformSMin 42 Reduce 2307
-            2309:   2251(ptr) AccessChain 34(data) 2304 2243
-            2310: 26(i64vec4) Load 2309
-            2311: 26(i64vec4) VectorShuffle 2310 2308 4 5 2 3
-                              Store 2309 2311
-            2312:      6(int) Load 8(invocation)
-            2313:   2251(ptr) AccessChain 34(data) 57 2243
-            2314: 26(i64vec4) Load 2313
-            2315:2260(i64vec3) VectorShuffle 2314 2314 0 1 2
-            2316:2260(i64vec3) GroupNonUniformSMin 42 Reduce 2315
-            2317:   2251(ptr) AccessChain 34(data) 2312 2243
-            2318: 26(i64vec4) Load 2317
-            2319: 26(i64vec4) VectorShuffle 2318 2316 4 5 6 3
-                              Store 2317 2319
-            2320:      6(int) Load 8(invocation)
-            2321:   2251(ptr) AccessChain 34(data) 67 2243
-            2322: 26(i64vec4) Load 2321
-            2323: 26(i64vec4) GroupNonUniformSMin 42 Reduce 2322
-            2324:   2251(ptr) AccessChain 34(data) 2320 2243
-                              Store 2324 2323
-            2325:      6(int) Load 8(invocation)
-            2326:   2244(ptr) AccessChain 34(data) 37 2243 38
-            2327: 25(int64_t) Load 2326
-            2328: 25(int64_t) GroupNonUniformSMax 42 Reduce 2327
-            2329:   2244(ptr) AccessChain 34(data) 2325 2243 38
-                              Store 2329 2328
-            2330:      6(int) Load 8(invocation)
-            2331:   2251(ptr) AccessChain 34(data) 46 2243
-            2332: 26(i64vec4) Load 2331
-            2333:2250(i64vec2) VectorShuffle 2332 2332 0 1
-            2334:2250(i64vec2) GroupNonUniformSMax 42 Reduce 2333
-            2335:   2251(ptr) AccessChain 34(data) 2330 2243
-            2336: 26(i64vec4) Load 2335
-            2337: 26(i64vec4) VectorShuffle 2336 2334 4 5 2 3
-                              Store 2335 2337
-            2338:      6(int) Load 8(invocation)
-            2339:   2251(ptr) AccessChain 34(data) 57 2243
-            2340: 26(i64vec4) Load 2339
-            2341:2260(i64vec3) VectorShuffle 2340 2340 0 1 2
-            2342:2260(i64vec3) GroupNonUniformSMax 42 Reduce 2341
-            2343:   2251(ptr) AccessChain 34(data) 2338 2243
-            2344: 26(i64vec4) Load 2343
-            2345: 26(i64vec4) VectorShuffle 2344 2342 4 5 6 3
-                              Store 2343 2345
-            2346:      6(int) Load 8(invocation)
-            2347:   2251(ptr) AccessChain 34(data) 67 2243
-            2348: 26(i64vec4) Load 2347
-            2349: 26(i64vec4) GroupNonUniformSMax 42 Reduce 2348
-            2350:   2251(ptr) AccessChain 34(data) 2346 2243
-                              Store 2350 2349
-            2351:      6(int) Load 8(invocation)
-            2352:   2244(ptr) AccessChain 34(data) 37 2243 38
-            2353: 25(int64_t) Load 2352
-            2354: 25(int64_t) GroupNonUniformBitwiseAnd 42 Reduce 2353
-            2355:   2244(ptr) AccessChain 34(data) 2351 2243 38
-                              Store 2355 2354
-            2356:      6(int) Load 8(invocation)
-            2357:   2251(ptr) AccessChain 34(data) 46 2243
-            2358: 26(i64vec4) Load 2357
-            2359:2250(i64vec2) VectorShuffle 2358 2358 0 1
-            2360:2250(i64vec2) GroupNonUniformBitwiseAnd 42 Reduce 2359
-            2361:   2251(ptr) AccessChain 34(data) 2356 2243
-            2362: 26(i64vec4) Load 2361
-            2363: 26(i64vec4) VectorShuffle 2362 2360 4 5 2 3
-                              Store 2361 2363
-            2364:      6(int) Load 8(invocation)
-            2365:   2251(ptr) AccessChain 34(data) 57 2243
-            2366: 26(i64vec4) Load 2365
-            2367:2260(i64vec3) VectorShuffle 2366 2366 0 1 2
-            2368:2260(i64vec3) GroupNonUniformBitwiseAnd 42 Reduce 2367
-            2369:   2251(ptr) AccessChain 34(data) 2364 2243
-            2370: 26(i64vec4) Load 2369
-            2371: 26(i64vec4) VectorShuffle 2370 2368 4 5 6 3
-                              Store 2369 2371
-            2372:      6(int) Load 8(invocation)
-            2373:   2251(ptr) AccessChain 34(data) 67 2243
-            2374: 26(i64vec4) Load 2373
-            2375: 26(i64vec4) GroupNonUniformBitwiseAnd 42 Reduce 2374
-            2376:   2251(ptr) AccessChain 34(data) 2372 2243
-                              Store 2376 2375
-            2377:      6(int) Load 8(invocation)
-            2378:   2244(ptr) AccessChain 34(data) 37 2243 38
-            2379: 25(int64_t) Load 2378
-            2380: 25(int64_t) GroupNonUniformBitwiseOr 42 Reduce 2379
-            2381:   2244(ptr) AccessChain 34(data) 2377 2243 38
-                              Store 2381 2380
-            2382:      6(int) Load 8(invocation)
-            2383:   2251(ptr) AccessChain 34(data) 46 2243
-            2384: 26(i64vec4) Load 2383
-            2385:2250(i64vec2) VectorShuffle 2384 2384 0 1
-            2386:2250(i64vec2) GroupNonUniformBitwiseOr 42 Reduce 2385
-            2387:   2251(ptr) AccessChain 34(data) 2382 2243
-            2388: 26(i64vec4) Load 2387
-            2389: 26(i64vec4) VectorShuffle 2388 2386 4 5 2 3
-                              Store 2387 2389
-            2390:      6(int) Load 8(invocation)
-            2391:   2251(ptr) AccessChain 34(data) 57 2243
-            2392: 26(i64vec4) Load 2391
-            2393:2260(i64vec3) VectorShuffle 2392 2392 0 1 2
-            2394:2260(i64vec3) GroupNonUniformBitwiseOr 42 Reduce 2393
-            2395:   2251(ptr) AccessChain 34(data) 2390 2243
-            2396: 26(i64vec4) Load 2395
-            2397: 26(i64vec4) VectorShuffle 2396 2394 4 5 6 3
-                              Store 2395 2397
-            2398:      6(int) Load 8(invocation)
-            2399:   2251(ptr) AccessChain 34(data) 67 2243
-            2400: 26(i64vec4) Load 2399
-            2401: 26(i64vec4) GroupNonUniformBitwiseOr 42 Reduce 2400
-            2402:   2251(ptr) AccessChain 34(data) 2398 2243
-                              Store 2402 2401
-            2403:      6(int) Load 8(invocation)
-            2404:   2244(ptr) AccessChain 34(data) 37 2243 38
-            2405: 25(int64_t) Load 2404
-            2406: 25(int64_t) GroupNonUniformBitwiseXor 42 Reduce 2405
-            2407:   2244(ptr) AccessChain 34(data) 2403 2243 38
-                              Store 2407 2406
-            2408:      6(int) Load 8(invocation)
-            2409:   2251(ptr) AccessChain 34(data) 46 2243
-            2410: 26(i64vec4) Load 2409
-            2411:2250(i64vec2) VectorShuffle 2410 2410 0 1
-            2412:2250(i64vec2) GroupNonUniformBitwiseXor 42 Reduce 2411
-            2413:   2251(ptr) AccessChain 34(data) 2408 2243
-            2414: 26(i64vec4) Load 2413
-            2415: 26(i64vec4) VectorShuffle 2414 2412 4 5 2 3
-                              Store 2413 2415
-            2416:      6(int) Load 8(invocation)
-            2417:   2251(ptr) AccessChain 34(data) 57 2243
-            2418: 26(i64vec4) Load 2417
-            2419:2260(i64vec3) VectorShuffle 2418 2418 0 1 2
-            2420:2260(i64vec3) GroupNonUniformBitwiseXor 42 Reduce 2419
-            2421:   2251(ptr) AccessChain 34(data) 2416 2243
-            2422: 26(i64vec4) Load 2421
-            2423: 26(i64vec4) VectorShuffle 2422 2420 4 5 6 3
-                              Store 2421 2423
-            2424:      6(int) Load 8(invocation)
-            2425:   2251(ptr) AccessChain 34(data) 67 2243
-            2426: 26(i64vec4) Load 2425
-            2427: 26(i64vec4) GroupNonUniformBitwiseXor 42 Reduce 2426
-            2428:   2251(ptr) AccessChain 34(data) 2424 2243
-                              Store 2428 2427
-            2429:      6(int) Load 8(invocation)
-            2430:   2244(ptr) AccessChain 34(data) 37 2243 38
-            2431: 25(int64_t) Load 2430
-            2432: 25(int64_t) GroupNonUniformIAdd 42 InclusiveScan 2431
-            2433:   2244(ptr) AccessChain 34(data) 2429 2243 38
-                              Store 2433 2432
-            2434:      6(int) Load 8(invocation)
-            2435:   2251(ptr) AccessChain 34(data) 46 2243
-            2436: 26(i64vec4) Load 2435
-            2437:2250(i64vec2) VectorShuffle 2436 2436 0 1
-            2438:2250(i64vec2) GroupNonUniformIAdd 42 InclusiveScan 2437
-            2439:   2251(ptr) AccessChain 34(data) 2434 2243
-            2440: 26(i64vec4) Load 2439
-            2441: 26(i64vec4) VectorShuffle 2440 2438 4 5 2 3
-                              Store 2439 2441
-            2442:      6(int) Load 8(invocation)
-            2443:   2251(ptr) AccessChain 34(data) 57 2243
-            2444: 26(i64vec4) Load 2443
-            2445:2260(i64vec3) VectorShuffle 2444 2444 0 1 2
-            2446:2260(i64vec3) GroupNonUniformIAdd 42 InclusiveScan 2445
-            2447:   2251(ptr) AccessChain 34(data) 2442 2243
-            2448: 26(i64vec4) Load 2447
-            2449: 26(i64vec4) VectorShuffle 2448 2446 4 5 6 3
-                              Store 2447 2449
-            2450:      6(int) Load 8(invocation)
-            2451:   2251(ptr) AccessChain 34(data) 67 2243
-            2452: 26(i64vec4) Load 2451
-            2453: 26(i64vec4) GroupNonUniformIAdd 42 InclusiveScan 2452
-            2454:   2251(ptr) AccessChain 34(data) 2450 2243
-                              Store 2454 2453
+            2295:   1954(ptr) AccessChain 34(data) 59 73
+            2296: 24(i16vec4) Load 2295
+            2297:1964(i16vec3) VectorShuffle 2296 2296 0 1 2
+            2298:1964(i16vec3) GroupNonUniformBitwiseAnd 42 InclusiveScan 2297
+            2299:   1947(ptr) AccessChain 34(data) 2294 73 38
+            2300: 23(int16_t) CompositeExtract 2298 0
+                              Store 2299 2300
+            2301:   1947(ptr) AccessChain 34(data) 2294 73 55
+            2302: 23(int16_t) CompositeExtract 2298 1
+                              Store 2301 2302
+            2303:   1947(ptr) AccessChain 34(data) 2294 73 69
+            2304: 23(int16_t) CompositeExtract 2298 2
+                              Store 2303 2304
+            2305:      6(int) Load 8(invocation)
+            2306:   1954(ptr) AccessChain 34(data) 73 73
+            2307: 24(i16vec4) Load 2306
+            2308: 24(i16vec4) GroupNonUniformBitwiseAnd 42 InclusiveScan 2307
+            2309:   1954(ptr) AccessChain 34(data) 2305 73
+                              Store 2309 2308
+            2310:      6(int) Load 8(invocation)
+            2311:   1947(ptr) AccessChain 34(data) 37 73 38
+            2312: 23(int16_t) Load 2311
+            2313: 23(int16_t) GroupNonUniformBitwiseOr 42 InclusiveScan 2312
+            2314:   1947(ptr) AccessChain 34(data) 2310 73 38
+                              Store 2314 2313
+            2315:      6(int) Load 8(invocation)
+            2316:   1954(ptr) AccessChain 34(data) 46 73
+            2317: 24(i16vec4) Load 2316
+            2318:1953(i16vec2) VectorShuffle 2317 2317 0 1
+            2319:1953(i16vec2) GroupNonUniformBitwiseOr 42 InclusiveScan 2318
+            2320:   1947(ptr) AccessChain 34(data) 2315 73 38
+            2321: 23(int16_t) CompositeExtract 2319 0
+                              Store 2320 2321
+            2322:   1947(ptr) AccessChain 34(data) 2315 73 55
+            2323: 23(int16_t) CompositeExtract 2319 1
+                              Store 2322 2323
+            2324:      6(int) Load 8(invocation)
+            2325:   1954(ptr) AccessChain 34(data) 59 73
+            2326: 24(i16vec4) Load 2325
+            2327:1964(i16vec3) VectorShuffle 2326 2326 0 1 2
+            2328:1964(i16vec3) GroupNonUniformBitwiseOr 42 InclusiveScan 2327
+            2329:   1947(ptr) AccessChain 34(data) 2324 73 38
+            2330: 23(int16_t) CompositeExtract 2328 0
+                              Store 2329 2330
+            2331:   1947(ptr) AccessChain 34(data) 2324 73 55
+            2332: 23(int16_t) CompositeExtract 2328 1
+                              Store 2331 2332
+            2333:   1947(ptr) AccessChain 34(data) 2324 73 69
+            2334: 23(int16_t) CompositeExtract 2328 2
+                              Store 2333 2334
+            2335:      6(int) Load 8(invocation)
+            2336:   1954(ptr) AccessChain 34(data) 73 73
+            2337: 24(i16vec4) Load 2336
+            2338: 24(i16vec4) GroupNonUniformBitwiseOr 42 InclusiveScan 2337
+            2339:   1954(ptr) AccessChain 34(data) 2335 73
+                              Store 2339 2338
+            2340:      6(int) Load 8(invocation)
+            2341:   1947(ptr) AccessChain 34(data) 37 73 38
+            2342: 23(int16_t) Load 2341
+            2343: 23(int16_t) GroupNonUniformBitwiseXor 42 InclusiveScan 2342
+            2344:   1947(ptr) AccessChain 34(data) 2340 73 38
+                              Store 2344 2343
+            2345:      6(int) Load 8(invocation)
+            2346:   1954(ptr) AccessChain 34(data) 46 73
+            2347: 24(i16vec4) Load 2346
+            2348:1953(i16vec2) VectorShuffle 2347 2347 0 1
+            2349:1953(i16vec2) GroupNonUniformBitwiseXor 42 InclusiveScan 2348
+            2350:   1947(ptr) AccessChain 34(data) 2345 73 38
+            2351: 23(int16_t) CompositeExtract 2349 0
+                              Store 2350 2351
+            2352:   1947(ptr) AccessChain 34(data) 2345 73 55
+            2353: 23(int16_t) CompositeExtract 2349 1
+                              Store 2352 2353
+            2354:      6(int) Load 8(invocation)
+            2355:   1954(ptr) AccessChain 34(data) 59 73
+            2356: 24(i16vec4) Load 2355
+            2357:1964(i16vec3) VectorShuffle 2356 2356 0 1 2
+            2358:1964(i16vec3) GroupNonUniformBitwiseXor 42 InclusiveScan 2357
+            2359:   1947(ptr) AccessChain 34(data) 2354 73 38
+            2360: 23(int16_t) CompositeExtract 2358 0
+                              Store 2359 2360
+            2361:   1947(ptr) AccessChain 34(data) 2354 73 55
+            2362: 23(int16_t) CompositeExtract 2358 1
+                              Store 2361 2362
+            2363:   1947(ptr) AccessChain 34(data) 2354 73 69
+            2364: 23(int16_t) CompositeExtract 2358 2
+                              Store 2363 2364
+            2365:      6(int) Load 8(invocation)
+            2366:   1954(ptr) AccessChain 34(data) 73 73
+            2367: 24(i16vec4) Load 2366
+            2368: 24(i16vec4) GroupNonUniformBitwiseXor 42 InclusiveScan 2367
+            2369:   1954(ptr) AccessChain 34(data) 2365 73
+                              Store 2369 2368
+            2370:      6(int) Load 8(invocation)
+            2371:   1947(ptr) AccessChain 34(data) 37 73 38
+            2372: 23(int16_t) Load 2371
+            2373: 23(int16_t) GroupNonUniformIAdd 42 ExclusiveScan 2372
+            2374:   1947(ptr) AccessChain 34(data) 2370 73 38
+                              Store 2374 2373
+            2375:      6(int) Load 8(invocation)
+            2376:   1954(ptr) AccessChain 34(data) 46 73
+            2377: 24(i16vec4) Load 2376
+            2378:1953(i16vec2) VectorShuffle 2377 2377 0 1
+            2379:1953(i16vec2) GroupNonUniformIAdd 42 ExclusiveScan 2378
+            2380:   1947(ptr) AccessChain 34(data) 2375 73 38
+            2381: 23(int16_t) CompositeExtract 2379 0
+                              Store 2380 2381
+            2382:   1947(ptr) AccessChain 34(data) 2375 73 55
+            2383: 23(int16_t) CompositeExtract 2379 1
+                              Store 2382 2383
+            2384:      6(int) Load 8(invocation)
+            2385:   1954(ptr) AccessChain 34(data) 59 73
+            2386: 24(i16vec4) Load 2385
+            2387:1964(i16vec3) VectorShuffle 2386 2386 0 1 2
+            2388:1964(i16vec3) GroupNonUniformIAdd 42 ExclusiveScan 2387
+            2389:   1947(ptr) AccessChain 34(data) 2384 73 38
+            2390: 23(int16_t) CompositeExtract 2388 0
+                              Store 2389 2390
+            2391:   1947(ptr) AccessChain 34(data) 2384 73 55
+            2392: 23(int16_t) CompositeExtract 2388 1
+                              Store 2391 2392
+            2393:   1947(ptr) AccessChain 34(data) 2384 73 69
+            2394: 23(int16_t) CompositeExtract 2388 2
+                              Store 2393 2394
+            2395:      6(int) Load 8(invocation)
+            2396:   1954(ptr) AccessChain 34(data) 73 73
+            2397: 24(i16vec4) Load 2396
+            2398: 24(i16vec4) GroupNonUniformIAdd 42 ExclusiveScan 2397
+            2399:   1954(ptr) AccessChain 34(data) 2395 73
+                              Store 2399 2398
+            2400:      6(int) Load 8(invocation)
+            2401:   1947(ptr) AccessChain 34(data) 37 73 38
+            2402: 23(int16_t) Load 2401
+            2403: 23(int16_t) GroupNonUniformIMul 42 ExclusiveScan 2402
+            2404:   1947(ptr) AccessChain 34(data) 2400 73 38
+                              Store 2404 2403
+            2405:      6(int) Load 8(invocation)
+            2406:   1954(ptr) AccessChain 34(data) 46 73
+            2407: 24(i16vec4) Load 2406
+            2408:1953(i16vec2) VectorShuffle 2407 2407 0 1
+            2409:1953(i16vec2) GroupNonUniformIMul 42 ExclusiveScan 2408
+            2410:   1947(ptr) AccessChain 34(data) 2405 73 38
+            2411: 23(int16_t) CompositeExtract 2409 0
+                              Store 2410 2411
+            2412:   1947(ptr) AccessChain 34(data) 2405 73 55
+            2413: 23(int16_t) CompositeExtract 2409 1
+                              Store 2412 2413
+            2414:      6(int) Load 8(invocation)
+            2415:   1954(ptr) AccessChain 34(data) 59 73
+            2416: 24(i16vec4) Load 2415
+            2417:1964(i16vec3) VectorShuffle 2416 2416 0 1 2
+            2418:1964(i16vec3) GroupNonUniformIMul 42 ExclusiveScan 2417
+            2419:   1947(ptr) AccessChain 34(data) 2414 73 38
+            2420: 23(int16_t) CompositeExtract 2418 0
+                              Store 2419 2420
+            2421:   1947(ptr) AccessChain 34(data) 2414 73 55
+            2422: 23(int16_t) CompositeExtract 2418 1
+                              Store 2421 2422
+            2423:   1947(ptr) AccessChain 34(data) 2414 73 69
+            2424: 23(int16_t) CompositeExtract 2418 2
+                              Store 2423 2424
+            2425:      6(int) Load 8(invocation)
+            2426:   1954(ptr) AccessChain 34(data) 73 73
+            2427: 24(i16vec4) Load 2426
+            2428: 24(i16vec4) GroupNonUniformIMul 42 ExclusiveScan 2427
+            2429:   1954(ptr) AccessChain 34(data) 2425 73
+                              Store 2429 2428
+            2430:      6(int) Load 8(invocation)
+            2431:   1947(ptr) AccessChain 34(data) 37 73 38
+            2432: 23(int16_t) Load 2431
+            2433: 23(int16_t) GroupNonUniformUMin 42 ExclusiveScan 2432
+            2434:   1947(ptr) AccessChain 34(data) 2430 73 38
+                              Store 2434 2433
+            2435:      6(int) Load 8(invocation)
+            2436:   1954(ptr) AccessChain 34(data) 46 73
+            2437: 24(i16vec4) Load 2436
+            2438:1953(i16vec2) VectorShuffle 2437 2437 0 1
+            2439:1953(i16vec2) GroupNonUniformUMin 42 ExclusiveScan 2438
+            2440:   1947(ptr) AccessChain 34(data) 2435 73 38
+            2441: 23(int16_t) CompositeExtract 2439 0
+                              Store 2440 2441
+            2442:   1947(ptr) AccessChain 34(data) 2435 73 55
+            2443: 23(int16_t) CompositeExtract 2439 1
+                              Store 2442 2443
+            2444:      6(int) Load 8(invocation)
+            2445:   1954(ptr) AccessChain 34(data) 59 73
+            2446: 24(i16vec4) Load 2445
+            2447:1964(i16vec3) VectorShuffle 2446 2446 0 1 2
+            2448:1964(i16vec3) GroupNonUniformUMin 42 ExclusiveScan 2447
+            2449:   1947(ptr) AccessChain 34(data) 2444 73 38
+            2450: 23(int16_t) CompositeExtract 2448 0
+                              Store 2449 2450
+            2451:   1947(ptr) AccessChain 34(data) 2444 73 55
+            2452: 23(int16_t) CompositeExtract 2448 1
+                              Store 2451 2452
+            2453:   1947(ptr) AccessChain 34(data) 2444 73 69
+            2454: 23(int16_t) CompositeExtract 2448 2
+                              Store 2453 2454
             2455:      6(int) Load 8(invocation)
-            2456:   2244(ptr) AccessChain 34(data) 37 2243 38
-            2457: 25(int64_t) Load 2456
-            2458: 25(int64_t) GroupNonUniformIMul 42 InclusiveScan 2457
-            2459:   2244(ptr) AccessChain 34(data) 2455 2243 38
+            2456:   1954(ptr) AccessChain 34(data) 73 73
+            2457: 24(i16vec4) Load 2456
+            2458: 24(i16vec4) GroupNonUniformUMin 42 ExclusiveScan 2457
+            2459:   1954(ptr) AccessChain 34(data) 2455 73
                               Store 2459 2458
             2460:      6(int) Load 8(invocation)
-            2461:   2251(ptr) AccessChain 34(data) 46 2243
-            2462: 26(i64vec4) Load 2461
-            2463:2250(i64vec2) VectorShuffle 2462 2462 0 1
-            2464:2250(i64vec2) GroupNonUniformIMul 42 InclusiveScan 2463
-            2465:   2251(ptr) AccessChain 34(data) 2460 2243
-            2466: 26(i64vec4) Load 2465
-            2467: 26(i64vec4) VectorShuffle 2466 2464 4 5 2 3
-                              Store 2465 2467
-            2468:      6(int) Load 8(invocation)
-            2469:   2251(ptr) AccessChain 34(data) 57 2243
-            2470: 26(i64vec4) Load 2469
-            2471:2260(i64vec3) VectorShuffle 2470 2470 0 1 2
-            2472:2260(i64vec3) GroupNonUniformIMul 42 InclusiveScan 2471
-            2473:   2251(ptr) AccessChain 34(data) 2468 2243
-            2474: 26(i64vec4) Load 2473
-            2475: 26(i64vec4) VectorShuffle 2474 2472 4 5 6 3
-                              Store 2473 2475
-            2476:      6(int) Load 8(invocation)
-            2477:   2251(ptr) AccessChain 34(data) 67 2243
-            2478: 26(i64vec4) Load 2477
-            2479: 26(i64vec4) GroupNonUniformIMul 42 InclusiveScan 2478
-            2480:   2251(ptr) AccessChain 34(data) 2476 2243
-                              Store 2480 2479
-            2481:      6(int) Load 8(invocation)
-            2482:   2244(ptr) AccessChain 34(data) 37 2243 38
-            2483: 25(int64_t) Load 2482
-            2484: 25(int64_t) GroupNonUniformSMin 42 InclusiveScan 2483
-            2485:   2244(ptr) AccessChain 34(data) 2481 2243 38
-                              Store 2485 2484
-            2486:      6(int) Load 8(invocation)
-            2487:   2251(ptr) AccessChain 34(data) 46 2243
-            2488: 26(i64vec4) Load 2487
-            2489:2250(i64vec2) VectorShuffle 2488 2488 0 1
-            2490:2250(i64vec2) GroupNonUniformSMin 42 InclusiveScan 2489
-            2491:   2251(ptr) AccessChain 34(data) 2486 2243
-            2492: 26(i64vec4) Load 2491
-            2493: 26(i64vec4) VectorShuffle 2492 2490 4 5 2 3
-                              Store 2491 2493
-            2494:      6(int) Load 8(invocation)
-            2495:   2251(ptr) AccessChain 34(data) 57 2243
-            2496: 26(i64vec4) Load 2495
-            2497:2260(i64vec3) VectorShuffle 2496 2496 0 1 2
-            2498:2260(i64vec3) GroupNonUniformSMin 42 InclusiveScan 2497
-            2499:   2251(ptr) AccessChain 34(data) 2494 2243
-            2500: 26(i64vec4) Load 2499
-            2501: 26(i64vec4) VectorShuffle 2500 2498 4 5 6 3
-                              Store 2499 2501
-            2502:      6(int) Load 8(invocation)
-            2503:   2251(ptr) AccessChain 34(data) 67 2243
-            2504: 26(i64vec4) Load 2503
-            2505: 26(i64vec4) GroupNonUniformSMin 42 InclusiveScan 2504
-            2506:   2251(ptr) AccessChain 34(data) 2502 2243
-                              Store 2506 2505
-            2507:      6(int) Load 8(invocation)
-            2508:   2244(ptr) AccessChain 34(data) 37 2243 38
-            2509: 25(int64_t) Load 2508
-            2510: 25(int64_t) GroupNonUniformSMax 42 InclusiveScan 2509
-            2511:   2244(ptr) AccessChain 34(data) 2507 2243 38
-                              Store 2511 2510
-            2512:      6(int) Load 8(invocation)
-            2513:   2251(ptr) AccessChain 34(data) 46 2243
-            2514: 26(i64vec4) Load 2513
-            2515:2250(i64vec2) VectorShuffle 2514 2514 0 1
-            2516:2250(i64vec2) GroupNonUniformSMax 42 InclusiveScan 2515
-            2517:   2251(ptr) AccessChain 34(data) 2512 2243
-            2518: 26(i64vec4) Load 2517
-            2519: 26(i64vec4) VectorShuffle 2518 2516 4 5 2 3
-                              Store 2517 2519
+            2461:   1947(ptr) AccessChain 34(data) 37 73 38
+            2462: 23(int16_t) Load 2461
+            2463: 23(int16_t) GroupNonUniformUMax 42 ExclusiveScan 2462
+            2464:   1947(ptr) AccessChain 34(data) 2460 73 38
+                              Store 2464 2463
+            2465:      6(int) Load 8(invocation)
+            2466:   1954(ptr) AccessChain 34(data) 46 73
+            2467: 24(i16vec4) Load 2466
+            2468:1953(i16vec2) VectorShuffle 2467 2467 0 1
+            2469:1953(i16vec2) GroupNonUniformUMax 42 ExclusiveScan 2468
+            2470:   1947(ptr) AccessChain 34(data) 2465 73 38
+            2471: 23(int16_t) CompositeExtract 2469 0
+                              Store 2470 2471
+            2472:   1947(ptr) AccessChain 34(data) 2465 73 55
+            2473: 23(int16_t) CompositeExtract 2469 1
+                              Store 2472 2473
+            2474:      6(int) Load 8(invocation)
+            2475:   1954(ptr) AccessChain 34(data) 59 73
+            2476: 24(i16vec4) Load 2475
+            2477:1964(i16vec3) VectorShuffle 2476 2476 0 1 2
+            2478:1964(i16vec3) GroupNonUniformUMax 42 ExclusiveScan 2477
+            2479:   1947(ptr) AccessChain 34(data) 2474 73 38
+            2480: 23(int16_t) CompositeExtract 2478 0
+                              Store 2479 2480
+            2481:   1947(ptr) AccessChain 34(data) 2474 73 55
+            2482: 23(int16_t) CompositeExtract 2478 1
+                              Store 2481 2482
+            2483:   1947(ptr) AccessChain 34(data) 2474 73 69
+            2484: 23(int16_t) CompositeExtract 2478 2
+                              Store 2483 2484
+            2485:      6(int) Load 8(invocation)
+            2486:   1954(ptr) AccessChain 34(data) 73 73
+            2487: 24(i16vec4) Load 2486
+            2488: 24(i16vec4) GroupNonUniformUMax 42 ExclusiveScan 2487
+            2489:   1954(ptr) AccessChain 34(data) 2485 73
+                              Store 2489 2488
+            2490:      6(int) Load 8(invocation)
+            2491:   1947(ptr) AccessChain 34(data) 37 73 38
+            2492: 23(int16_t) Load 2491
+            2493: 23(int16_t) GroupNonUniformBitwiseAnd 42 ExclusiveScan 2492
+            2494:   1947(ptr) AccessChain 34(data) 2490 73 38
+                              Store 2494 2493
+            2495:      6(int) Load 8(invocation)
+            2496:   1954(ptr) AccessChain 34(data) 46 73
+            2497: 24(i16vec4) Load 2496
+            2498:1953(i16vec2) VectorShuffle 2497 2497 0 1
+            2499:1953(i16vec2) GroupNonUniformBitwiseAnd 42 ExclusiveScan 2498
+            2500:   1947(ptr) AccessChain 34(data) 2495 73 38
+            2501: 23(int16_t) CompositeExtract 2499 0
+                              Store 2500 2501
+            2502:   1947(ptr) AccessChain 34(data) 2495 73 55
+            2503: 23(int16_t) CompositeExtract 2499 1
+                              Store 2502 2503
+            2504:      6(int) Load 8(invocation)
+            2505:   1954(ptr) AccessChain 34(data) 59 73
+            2506: 24(i16vec4) Load 2505
+            2507:1964(i16vec3) VectorShuffle 2506 2506 0 1 2
+            2508:1964(i16vec3) GroupNonUniformBitwiseAnd 42 ExclusiveScan 2507
+            2509:   1947(ptr) AccessChain 34(data) 2504 73 38
+            2510: 23(int16_t) CompositeExtract 2508 0
+                              Store 2509 2510
+            2511:   1947(ptr) AccessChain 34(data) 2504 73 55
+            2512: 23(int16_t) CompositeExtract 2508 1
+                              Store 2511 2512
+            2513:   1947(ptr) AccessChain 34(data) 2504 73 69
+            2514: 23(int16_t) CompositeExtract 2508 2
+                              Store 2513 2514
+            2515:      6(int) Load 8(invocation)
+            2516:   1954(ptr) AccessChain 34(data) 73 73
+            2517: 24(i16vec4) Load 2516
+            2518: 24(i16vec4) GroupNonUniformBitwiseAnd 42 ExclusiveScan 2517
+            2519:   1954(ptr) AccessChain 34(data) 2515 73
+                              Store 2519 2518
             2520:      6(int) Load 8(invocation)
-            2521:   2251(ptr) AccessChain 34(data) 57 2243
-            2522: 26(i64vec4) Load 2521
-            2523:2260(i64vec3) VectorShuffle 2522 2522 0 1 2
-            2524:2260(i64vec3) GroupNonUniformSMax 42 InclusiveScan 2523
-            2525:   2251(ptr) AccessChain 34(data) 2520 2243
-            2526: 26(i64vec4) Load 2525
-            2527: 26(i64vec4) VectorShuffle 2526 2524 4 5 6 3
-                              Store 2525 2527
-            2528:      6(int) Load 8(invocation)
-            2529:   2251(ptr) AccessChain 34(data) 67 2243
-            2530: 26(i64vec4) Load 2529
-            2531: 26(i64vec4) GroupNonUniformSMax 42 InclusiveScan 2530
-            2532:   2251(ptr) AccessChain 34(data) 2528 2243
-                              Store 2532 2531
-            2533:      6(int) Load 8(invocation)
-            2534:   2244(ptr) AccessChain 34(data) 37 2243 38
-            2535: 25(int64_t) Load 2534
-            2536: 25(int64_t) GroupNonUniformBitwiseAnd 42 InclusiveScan 2535
-            2537:   2244(ptr) AccessChain 34(data) 2533 2243 38
-                              Store 2537 2536
-            2538:      6(int) Load 8(invocation)
-            2539:   2251(ptr) AccessChain 34(data) 46 2243
-            2540: 26(i64vec4) Load 2539
-            2541:2250(i64vec2) VectorShuffle 2540 2540 0 1
-            2542:2250(i64vec2) GroupNonUniformBitwiseAnd 42 InclusiveScan 2541
-            2543:   2251(ptr) AccessChain 34(data) 2538 2243
-            2544: 26(i64vec4) Load 2543
-            2545: 26(i64vec4) VectorShuffle 2544 2542 4 5 2 3
-                              Store 2543 2545
-            2546:      6(int) Load 8(invocation)
-            2547:   2251(ptr) AccessChain 34(data) 57 2243
-            2548: 26(i64vec4) Load 2547
-            2549:2260(i64vec3) VectorShuffle 2548 2548 0 1 2
-            2550:2260(i64vec3) GroupNonUniformBitwiseAnd 42 InclusiveScan 2549
-            2551:   2251(ptr) AccessChain 34(data) 2546 2243
-            2552: 26(i64vec4) Load 2551
-            2553: 26(i64vec4) VectorShuffle 2552 2550 4 5 6 3
-                              Store 2551 2553
-            2554:      6(int) Load 8(invocation)
-            2555:   2251(ptr) AccessChain 34(data) 67 2243
-            2556: 26(i64vec4) Load 2555
-            2557: 26(i64vec4) GroupNonUniformBitwiseAnd 42 InclusiveScan 2556
-            2558:   2251(ptr) AccessChain 34(data) 2554 2243
-                              Store 2558 2557
-            2559:      6(int) Load 8(invocation)
-            2560:   2244(ptr) AccessChain 34(data) 37 2243 38
-            2561: 25(int64_t) Load 2560
-            2562: 25(int64_t) GroupNonUniformBitwiseOr 42 InclusiveScan 2561
-            2563:   2244(ptr) AccessChain 34(data) 2559 2243 38
-                              Store 2563 2562
+            2521:   1947(ptr) AccessChain 34(data) 37 73 38
+            2522: 23(int16_t) Load 2521
+            2523: 23(int16_t) GroupNonUniformBitwiseOr 42 ExclusiveScan 2522
+            2524:   1947(ptr) AccessChain 34(data) 2520 73 38
+                              Store 2524 2523
+            2525:      6(int) Load 8(invocation)
+            2526:   1954(ptr) AccessChain 34(data) 46 73
+            2527: 24(i16vec4) Load 2526
+            2528:1953(i16vec2) VectorShuffle 2527 2527 0 1
+            2529:1953(i16vec2) GroupNonUniformBitwiseOr 42 ExclusiveScan 2528
+            2530:   1947(ptr) AccessChain 34(data) 2525 73 38
+            2531: 23(int16_t) CompositeExtract 2529 0
+                              Store 2530 2531
+            2532:   1947(ptr) AccessChain 34(data) 2525 73 55
+            2533: 23(int16_t) CompositeExtract 2529 1
+                              Store 2532 2533
+            2534:      6(int) Load 8(invocation)
+            2535:   1954(ptr) AccessChain 34(data) 59 73
+            2536: 24(i16vec4) Load 2535
+            2537:1964(i16vec3) VectorShuffle 2536 2536 0 1 2
+            2538:1964(i16vec3) GroupNonUniformBitwiseOr 42 ExclusiveScan 2537
+            2539:   1947(ptr) AccessChain 34(data) 2534 73 38
+            2540: 23(int16_t) CompositeExtract 2538 0
+                              Store 2539 2540
+            2541:   1947(ptr) AccessChain 34(data) 2534 73 55
+            2542: 23(int16_t) CompositeExtract 2538 1
+                              Store 2541 2542
+            2543:   1947(ptr) AccessChain 34(data) 2534 73 69
+            2544: 23(int16_t) CompositeExtract 2538 2
+                              Store 2543 2544
+            2545:      6(int) Load 8(invocation)
+            2546:   1954(ptr) AccessChain 34(data) 73 73
+            2547: 24(i16vec4) Load 2546
+            2548: 24(i16vec4) GroupNonUniformBitwiseOr 42 ExclusiveScan 2547
+            2549:   1954(ptr) AccessChain 34(data) 2545 73
+                              Store 2549 2548
+            2550:      6(int) Load 8(invocation)
+            2551:   1947(ptr) AccessChain 34(data) 37 73 38
+            2552: 23(int16_t) Load 2551
+            2553: 23(int16_t) GroupNonUniformBitwiseXor 42 ExclusiveScan 2552
+            2554:   1947(ptr) AccessChain 34(data) 2550 73 38
+                              Store 2554 2553
+            2555:      6(int) Load 8(invocation)
+            2556:   1954(ptr) AccessChain 34(data) 46 73
+            2557: 24(i16vec4) Load 2556
+            2558:1953(i16vec2) VectorShuffle 2557 2557 0 1
+            2559:1953(i16vec2) GroupNonUniformBitwiseXor 42 ExclusiveScan 2558
+            2560:   1947(ptr) AccessChain 34(data) 2555 73 38
+            2561: 23(int16_t) CompositeExtract 2559 0
+                              Store 2560 2561
+            2562:   1947(ptr) AccessChain 34(data) 2555 73 55
+            2563: 23(int16_t) CompositeExtract 2559 1
+                              Store 2562 2563
             2564:      6(int) Load 8(invocation)
-            2565:   2251(ptr) AccessChain 34(data) 46 2243
-            2566: 26(i64vec4) Load 2565
-            2567:2250(i64vec2) VectorShuffle 2566 2566 0 1
-            2568:2250(i64vec2) GroupNonUniformBitwiseOr 42 InclusiveScan 2567
-            2569:   2251(ptr) AccessChain 34(data) 2564 2243
-            2570: 26(i64vec4) Load 2569
-            2571: 26(i64vec4) VectorShuffle 2570 2568 4 5 2 3
-                              Store 2569 2571
-            2572:      6(int) Load 8(invocation)
-            2573:   2251(ptr) AccessChain 34(data) 57 2243
-            2574: 26(i64vec4) Load 2573
-            2575:2260(i64vec3) VectorShuffle 2574 2574 0 1 2
-            2576:2260(i64vec3) GroupNonUniformBitwiseOr 42 InclusiveScan 2575
-            2577:   2251(ptr) AccessChain 34(data) 2572 2243
-            2578: 26(i64vec4) Load 2577
-            2579: 26(i64vec4) VectorShuffle 2578 2576 4 5 6 3
-                              Store 2577 2579
+            2565:   1954(ptr) AccessChain 34(data) 59 73
+            2566: 24(i16vec4) Load 2565
+            2567:1964(i16vec3) VectorShuffle 2566 2566 0 1 2
+            2568:1964(i16vec3) GroupNonUniformBitwiseXor 42 ExclusiveScan 2567
+            2569:   1947(ptr) AccessChain 34(data) 2564 73 38
+            2570: 23(int16_t) CompositeExtract 2568 0
+                              Store 2569 2570
+            2571:   1947(ptr) AccessChain 34(data) 2564 73 55
+            2572: 23(int16_t) CompositeExtract 2568 1
+                              Store 2571 2572
+            2573:   1947(ptr) AccessChain 34(data) 2564 73 69
+            2574: 23(int16_t) CompositeExtract 2568 2
+                              Store 2573 2574
+            2575:      6(int) Load 8(invocation)
+            2576:   1954(ptr) AccessChain 34(data) 73 73
+            2577: 24(i16vec4) Load 2576
+            2578: 24(i16vec4) GroupNonUniformBitwiseXor 42 ExclusiveScan 2577
+            2579:   1954(ptr) AccessChain 34(data) 2575 73
+                              Store 2579 2578
             2580:      6(int) Load 8(invocation)
-            2581:   2251(ptr) AccessChain 34(data) 67 2243
-            2582: 26(i64vec4) Load 2581
-            2583: 26(i64vec4) GroupNonUniformBitwiseOr 42 InclusiveScan 2582
-            2584:   2251(ptr) AccessChain 34(data) 2580 2243
-                              Store 2584 2583
-            2585:      6(int) Load 8(invocation)
-            2586:   2244(ptr) AccessChain 34(data) 37 2243 38
-            2587: 25(int64_t) Load 2586
-            2588: 25(int64_t) GroupNonUniformBitwiseXor 42 InclusiveScan 2587
-            2589:   2244(ptr) AccessChain 34(data) 2585 2243 38
-                              Store 2589 2588
-            2590:      6(int) Load 8(invocation)
-            2591:   2251(ptr) AccessChain 34(data) 46 2243
-            2592: 26(i64vec4) Load 2591
-            2593:2250(i64vec2) VectorShuffle 2592 2592 0 1
-            2594:2250(i64vec2) GroupNonUniformBitwiseXor 42 InclusiveScan 2593
-            2595:   2251(ptr) AccessChain 34(data) 2590 2243
-            2596: 26(i64vec4) Load 2595
-            2597: 26(i64vec4) VectorShuffle 2596 2594 4 5 2 3
-                              Store 2595 2597
+            2583:   2582(ptr) AccessChain 34(data) 37 2581 38
+            2584: 25(int64_t) Load 2583
+            2585: 25(int64_t) GroupNonUniformIAdd 42 Reduce 2584
+            2586:   2582(ptr) AccessChain 34(data) 2580 2581 38
+                              Store 2586 2585
+            2587:      6(int) Load 8(invocation)
+            2590:   2589(ptr) AccessChain 34(data) 46 2581
+            2591: 26(i64vec4) Load 2590
+            2592:2588(i64vec2) VectorShuffle 2591 2591 0 1
+            2593:2588(i64vec2) GroupNonUniformIAdd 42 Reduce 2592
+            2594:   2582(ptr) AccessChain 34(data) 2587 2581 38
+            2595: 25(int64_t) CompositeExtract 2593 0
+                              Store 2594 2595
+            2596:   2582(ptr) AccessChain 34(data) 2587 2581 55
+            2597: 25(int64_t) CompositeExtract 2593 1
+                              Store 2596 2597
             2598:      6(int) Load 8(invocation)
-            2599:   2251(ptr) AccessChain 34(data) 57 2243
-            2600: 26(i64vec4) Load 2599
-            2601:2260(i64vec3) VectorShuffle 2600 2600 0 1 2
-            2602:2260(i64vec3) GroupNonUniformBitwiseXor 42 InclusiveScan 2601
-            2603:   2251(ptr) AccessChain 34(data) 2598 2243
-            2604: 26(i64vec4) Load 2603
-            2605: 26(i64vec4) VectorShuffle 2604 2602 4 5 6 3
-                              Store 2603 2605
-            2606:      6(int) Load 8(invocation)
-            2607:   2251(ptr) AccessChain 34(data) 67 2243
-            2608: 26(i64vec4) Load 2607
-            2609: 26(i64vec4) GroupNonUniformBitwiseXor 42 InclusiveScan 2608
-            2610:   2251(ptr) AccessChain 34(data) 2606 2243
-                              Store 2610 2609
-            2611:      6(int) Load 8(invocation)
-            2612:   2244(ptr) AccessChain 34(data) 37 2243 38
-            2613: 25(int64_t) Load 2612
-            2614: 25(int64_t) GroupNonUniformIAdd 42 ExclusiveScan 2613
-            2615:   2244(ptr) AccessChain 34(data) 2611 2243 38
-                              Store 2615 2614
-            2616:      6(int) Load 8(invocation)
-            2617:   2251(ptr) AccessChain 34(data) 46 2243
-            2618: 26(i64vec4) Load 2617
-            2619:2250(i64vec2) VectorShuffle 2618 2618 0 1
-            2620:2250(i64vec2) GroupNonUniformIAdd 42 ExclusiveScan 2619
-            2621:   2251(ptr) AccessChain 34(data) 2616 2243
+            2600:   2589(ptr) AccessChain 34(data) 59 2581
+            2601: 26(i64vec4) Load 2600
+            2602:2599(i64vec3) VectorShuffle 2601 2601 0 1 2
+            2603:2599(i64vec3) GroupNonUniformIAdd 42 Reduce 2602
+            2604:   2582(ptr) AccessChain 34(data) 2598 2581 38
+            2605: 25(int64_t) CompositeExtract 2603 0
+                              Store 2604 2605
+            2606:   2582(ptr) AccessChain 34(data) 2598 2581 55
+            2607: 25(int64_t) CompositeExtract 2603 1
+                              Store 2606 2607
+            2608:   2582(ptr) AccessChain 34(data) 2598 2581 69
+            2609: 25(int64_t) CompositeExtract 2603 2
+                              Store 2608 2609
+            2610:      6(int) Load 8(invocation)
+            2611:   2589(ptr) AccessChain 34(data) 73 2581
+            2612: 26(i64vec4) Load 2611
+            2613: 26(i64vec4) GroupNonUniformIAdd 42 Reduce 2612
+            2614:   2589(ptr) AccessChain 34(data) 2610 2581
+                              Store 2614 2613
+            2615:      6(int) Load 8(invocation)
+            2616:   2582(ptr) AccessChain 34(data) 37 2581 38
+            2617: 25(int64_t) Load 2616
+            2618: 25(int64_t) GroupNonUniformIMul 42 Reduce 2617
+            2619:   2582(ptr) AccessChain 34(data) 2615 2581 38
+                              Store 2619 2618
+            2620:      6(int) Load 8(invocation)
+            2621:   2589(ptr) AccessChain 34(data) 46 2581
             2622: 26(i64vec4) Load 2621
-            2623: 26(i64vec4) VectorShuffle 2622 2620 4 5 2 3
-                              Store 2621 2623
-            2624:      6(int) Load 8(invocation)
-            2625:   2251(ptr) AccessChain 34(data) 57 2243
-            2626: 26(i64vec4) Load 2625
-            2627:2260(i64vec3) VectorShuffle 2626 2626 0 1 2
-            2628:2260(i64vec3) GroupNonUniformIAdd 42 ExclusiveScan 2627
-            2629:   2251(ptr) AccessChain 34(data) 2624 2243
-            2630: 26(i64vec4) Load 2629
-            2631: 26(i64vec4) VectorShuffle 2630 2628 4 5 6 3
-                              Store 2629 2631
-            2632:      6(int) Load 8(invocation)
-            2633:   2251(ptr) AccessChain 34(data) 67 2243
-            2634: 26(i64vec4) Load 2633
-            2635: 26(i64vec4) GroupNonUniformIAdd 42 ExclusiveScan 2634
-            2636:   2251(ptr) AccessChain 34(data) 2632 2243
-                              Store 2636 2635
-            2637:      6(int) Load 8(invocation)
-            2638:   2244(ptr) AccessChain 34(data) 37 2243 38
-            2639: 25(int64_t) Load 2638
-            2640: 25(int64_t) GroupNonUniformIMul 42 ExclusiveScan 2639
-            2641:   2244(ptr) AccessChain 34(data) 2637 2243 38
-                              Store 2641 2640
-            2642:      6(int) Load 8(invocation)
-            2643:   2251(ptr) AccessChain 34(data) 46 2243
-            2644: 26(i64vec4) Load 2643
-            2645:2250(i64vec2) VectorShuffle 2644 2644 0 1
-            2646:2250(i64vec2) GroupNonUniformIMul 42 ExclusiveScan 2645
-            2647:   2251(ptr) AccessChain 34(data) 2642 2243
-            2648: 26(i64vec4) Load 2647
-            2649: 26(i64vec4) VectorShuffle 2648 2646 4 5 2 3
-                              Store 2647 2649
+            2623:2588(i64vec2) VectorShuffle 2622 2622 0 1
+            2624:2588(i64vec2) GroupNonUniformIMul 42 Reduce 2623
+            2625:   2582(ptr) AccessChain 34(data) 2620 2581 38
+            2626: 25(int64_t) CompositeExtract 2624 0
+                              Store 2625 2626
+            2627:   2582(ptr) AccessChain 34(data) 2620 2581 55
+            2628: 25(int64_t) CompositeExtract 2624 1
+                              Store 2627 2628
+            2629:      6(int) Load 8(invocation)
+            2630:   2589(ptr) AccessChain 34(data) 59 2581
+            2631: 26(i64vec4) Load 2630
+            2632:2599(i64vec3) VectorShuffle 2631 2631 0 1 2
+            2633:2599(i64vec3) GroupNonUniformIMul 42 Reduce 2632
+            2634:   2582(ptr) AccessChain 34(data) 2629 2581 38
+            2635: 25(int64_t) CompositeExtract 2633 0
+                              Store 2634 2635
+            2636:   2582(ptr) AccessChain 34(data) 2629 2581 55
+            2637: 25(int64_t) CompositeExtract 2633 1
+                              Store 2636 2637
+            2638:   2582(ptr) AccessChain 34(data) 2629 2581 69
+            2639: 25(int64_t) CompositeExtract 2633 2
+                              Store 2638 2639
+            2640:      6(int) Load 8(invocation)
+            2641:   2589(ptr) AccessChain 34(data) 73 2581
+            2642: 26(i64vec4) Load 2641
+            2643: 26(i64vec4) GroupNonUniformIMul 42 Reduce 2642
+            2644:   2589(ptr) AccessChain 34(data) 2640 2581
+                              Store 2644 2643
+            2645:      6(int) Load 8(invocation)
+            2646:   2582(ptr) AccessChain 34(data) 37 2581 38
+            2647: 25(int64_t) Load 2646
+            2648: 25(int64_t) GroupNonUniformSMin 42 Reduce 2647
+            2649:   2582(ptr) AccessChain 34(data) 2645 2581 38
+                              Store 2649 2648
             2650:      6(int) Load 8(invocation)
-            2651:   2251(ptr) AccessChain 34(data) 57 2243
+            2651:   2589(ptr) AccessChain 34(data) 46 2581
             2652: 26(i64vec4) Load 2651
-            2653:2260(i64vec3) VectorShuffle 2652 2652 0 1 2
-            2654:2260(i64vec3) GroupNonUniformIMul 42 ExclusiveScan 2653
-            2655:   2251(ptr) AccessChain 34(data) 2650 2243
-            2656: 26(i64vec4) Load 2655
-            2657: 26(i64vec4) VectorShuffle 2656 2654 4 5 6 3
-                              Store 2655 2657
-            2658:      6(int) Load 8(invocation)
-            2659:   2251(ptr) AccessChain 34(data) 67 2243
-            2660: 26(i64vec4) Load 2659
-            2661: 26(i64vec4) GroupNonUniformIMul 42 ExclusiveScan 2660
-            2662:   2251(ptr) AccessChain 34(data) 2658 2243
-                              Store 2662 2661
-            2663:      6(int) Load 8(invocation)
-            2664:   2244(ptr) AccessChain 34(data) 37 2243 38
-            2665: 25(int64_t) Load 2664
-            2666: 25(int64_t) GroupNonUniformSMin 42 ExclusiveScan 2665
-            2667:   2244(ptr) AccessChain 34(data) 2663 2243 38
-                              Store 2667 2666
-            2668:      6(int) Load 8(invocation)
-            2669:   2251(ptr) AccessChain 34(data) 46 2243
-            2670: 26(i64vec4) Load 2669
-            2671:2250(i64vec2) VectorShuffle 2670 2670 0 1
-            2672:2250(i64vec2) GroupNonUniformSMin 42 ExclusiveScan 2671
-            2673:   2251(ptr) AccessChain 34(data) 2668 2243
-            2674: 26(i64vec4) Load 2673
-            2675: 26(i64vec4) VectorShuffle 2674 2672 4 5 2 3
-                              Store 2673 2675
-            2676:      6(int) Load 8(invocation)
-            2677:   2251(ptr) AccessChain 34(data) 57 2243
-            2678: 26(i64vec4) Load 2677
-            2679:2260(i64vec3) VectorShuffle 2678 2678 0 1 2
-            2680:2260(i64vec3) GroupNonUniformSMin 42 ExclusiveScan 2679
-            2681:   2251(ptr) AccessChain 34(data) 2676 2243
+            2653:2588(i64vec2) VectorShuffle 2652 2652 0 1
+            2654:2588(i64vec2) GroupNonUniformSMin 42 Reduce 2653
+            2655:   2582(ptr) AccessChain 34(data) 2650 2581 38
+            2656: 25(int64_t) CompositeExtract 2654 0
+                              Store 2655 2656
+            2657:   2582(ptr) AccessChain 34(data) 2650 2581 55
+            2658: 25(int64_t) CompositeExtract 2654 1
+                              Store 2657 2658
+            2659:      6(int) Load 8(invocation)
+            2660:   2589(ptr) AccessChain 34(data) 59 2581
+            2661: 26(i64vec4) Load 2660
+            2662:2599(i64vec3) VectorShuffle 2661 2661 0 1 2
+            2663:2599(i64vec3) GroupNonUniformSMin 42 Reduce 2662
+            2664:   2582(ptr) AccessChain 34(data) 2659 2581 38
+            2665: 25(int64_t) CompositeExtract 2663 0
+                              Store 2664 2665
+            2666:   2582(ptr) AccessChain 34(data) 2659 2581 55
+            2667: 25(int64_t) CompositeExtract 2663 1
+                              Store 2666 2667
+            2668:   2582(ptr) AccessChain 34(data) 2659 2581 69
+            2669: 25(int64_t) CompositeExtract 2663 2
+                              Store 2668 2669
+            2670:      6(int) Load 8(invocation)
+            2671:   2589(ptr) AccessChain 34(data) 73 2581
+            2672: 26(i64vec4) Load 2671
+            2673: 26(i64vec4) GroupNonUniformSMin 42 Reduce 2672
+            2674:   2589(ptr) AccessChain 34(data) 2670 2581
+                              Store 2674 2673
+            2675:      6(int) Load 8(invocation)
+            2676:   2582(ptr) AccessChain 34(data) 37 2581 38
+            2677: 25(int64_t) Load 2676
+            2678: 25(int64_t) GroupNonUniformSMax 42 Reduce 2677
+            2679:   2582(ptr) AccessChain 34(data) 2675 2581 38
+                              Store 2679 2678
+            2680:      6(int) Load 8(invocation)
+            2681:   2589(ptr) AccessChain 34(data) 46 2581
             2682: 26(i64vec4) Load 2681
-            2683: 26(i64vec4) VectorShuffle 2682 2680 4 5 6 3
-                              Store 2681 2683
-            2684:      6(int) Load 8(invocation)
-            2685:   2251(ptr) AccessChain 34(data) 67 2243
-            2686: 26(i64vec4) Load 2685
-            2687: 26(i64vec4) GroupNonUniformSMin 42 ExclusiveScan 2686
-            2688:   2251(ptr) AccessChain 34(data) 2684 2243
-                              Store 2688 2687
+            2683:2588(i64vec2) VectorShuffle 2682 2682 0 1
+            2684:2588(i64vec2) GroupNonUniformSMax 42 Reduce 2683
+            2685:   2582(ptr) AccessChain 34(data) 2680 2581 38
+            2686: 25(int64_t) CompositeExtract 2684 0
+                              Store 2685 2686
+            2687:   2582(ptr) AccessChain 34(data) 2680 2581 55
+            2688: 25(int64_t) CompositeExtract 2684 1
+                              Store 2687 2688
             2689:      6(int) Load 8(invocation)
-            2690:   2244(ptr) AccessChain 34(data) 37 2243 38
-            2691: 25(int64_t) Load 2690
-            2692: 25(int64_t) GroupNonUniformSMax 42 ExclusiveScan 2691
-            2693:   2244(ptr) AccessChain 34(data) 2689 2243 38
-                              Store 2693 2692
-            2694:      6(int) Load 8(invocation)
-            2695:   2251(ptr) AccessChain 34(data) 46 2243
-            2696: 26(i64vec4) Load 2695
-            2697:2250(i64vec2) VectorShuffle 2696 2696 0 1
-            2698:2250(i64vec2) GroupNonUniformSMax 42 ExclusiveScan 2697
-            2699:   2251(ptr) AccessChain 34(data) 2694 2243
-            2700: 26(i64vec4) Load 2699
-            2701: 26(i64vec4) VectorShuffle 2700 2698 4 5 2 3
-                              Store 2699 2701
-            2702:      6(int) Load 8(invocation)
-            2703:   2251(ptr) AccessChain 34(data) 57 2243
-            2704: 26(i64vec4) Load 2703
-            2705:2260(i64vec3) VectorShuffle 2704 2704 0 1 2
-            2706:2260(i64vec3) GroupNonUniformSMax 42 ExclusiveScan 2705
-            2707:   2251(ptr) AccessChain 34(data) 2702 2243
-            2708: 26(i64vec4) Load 2707
-            2709: 26(i64vec4) VectorShuffle 2708 2706 4 5 6 3
-                              Store 2707 2709
+            2690:   2589(ptr) AccessChain 34(data) 59 2581
+            2691: 26(i64vec4) Load 2690
+            2692:2599(i64vec3) VectorShuffle 2691 2691 0 1 2
+            2693:2599(i64vec3) GroupNonUniformSMax 42 Reduce 2692
+            2694:   2582(ptr) AccessChain 34(data) 2689 2581 38
+            2695: 25(int64_t) CompositeExtract 2693 0
+                              Store 2694 2695
+            2696:   2582(ptr) AccessChain 34(data) 2689 2581 55
+            2697: 25(int64_t) CompositeExtract 2693 1
+                              Store 2696 2697
+            2698:   2582(ptr) AccessChain 34(data) 2689 2581 69
+            2699: 25(int64_t) CompositeExtract 2693 2
+                              Store 2698 2699
+            2700:      6(int) Load 8(invocation)
+            2701:   2589(ptr) AccessChain 34(data) 73 2581
+            2702: 26(i64vec4) Load 2701
+            2703: 26(i64vec4) GroupNonUniformSMax 42 Reduce 2702
+            2704:   2589(ptr) AccessChain 34(data) 2700 2581
+                              Store 2704 2703
+            2705:      6(int) Load 8(invocation)
+            2706:   2582(ptr) AccessChain 34(data) 37 2581 38
+            2707: 25(int64_t) Load 2706
+            2708: 25(int64_t) GroupNonUniformBitwiseAnd 42 Reduce 2707
+            2709:   2582(ptr) AccessChain 34(data) 2705 2581 38
+                              Store 2709 2708
             2710:      6(int) Load 8(invocation)
-            2711:   2251(ptr) AccessChain 34(data) 67 2243
+            2711:   2589(ptr) AccessChain 34(data) 46 2581
             2712: 26(i64vec4) Load 2711
-            2713: 26(i64vec4) GroupNonUniformSMax 42 ExclusiveScan 2712
-            2714:   2251(ptr) AccessChain 34(data) 2710 2243
-                              Store 2714 2713
-            2715:      6(int) Load 8(invocation)
-            2716:   2244(ptr) AccessChain 34(data) 37 2243 38
-            2717: 25(int64_t) Load 2716
-            2718: 25(int64_t) GroupNonUniformBitwiseAnd 42 ExclusiveScan 2717
-            2719:   2244(ptr) AccessChain 34(data) 2715 2243 38
-                              Store 2719 2718
-            2720:      6(int) Load 8(invocation)
-            2721:   2251(ptr) AccessChain 34(data) 46 2243
-            2722: 26(i64vec4) Load 2721
-            2723:2250(i64vec2) VectorShuffle 2722 2722 0 1
-            2724:2250(i64vec2) GroupNonUniformBitwiseAnd 42 ExclusiveScan 2723
-            2725:   2251(ptr) AccessChain 34(data) 2720 2243
-            2726: 26(i64vec4) Load 2725
-            2727: 26(i64vec4) VectorShuffle 2726 2724 4 5 2 3
-                              Store 2725 2727
-            2728:      6(int) Load 8(invocation)
-            2729:   2251(ptr) AccessChain 34(data) 57 2243
-            2730: 26(i64vec4) Load 2729
-            2731:2260(i64vec3) VectorShuffle 2730 2730 0 1 2
-            2732:2260(i64vec3) GroupNonUniformBitwiseAnd 42 ExclusiveScan 2731
-            2733:   2251(ptr) AccessChain 34(data) 2728 2243
-            2734: 26(i64vec4) Load 2733
-            2735: 26(i64vec4) VectorShuffle 2734 2732 4 5 6 3
-                              Store 2733 2735
-            2736:      6(int) Load 8(invocation)
-            2737:   2251(ptr) AccessChain 34(data) 67 2243
-            2738: 26(i64vec4) Load 2737
-            2739: 26(i64vec4) GroupNonUniformBitwiseAnd 42 ExclusiveScan 2738
-            2740:   2251(ptr) AccessChain 34(data) 2736 2243
-                              Store 2740 2739
-            2741:      6(int) Load 8(invocation)
-            2742:   2244(ptr) AccessChain 34(data) 37 2243 38
-            2743: 25(int64_t) Load 2742
-            2744: 25(int64_t) GroupNonUniformBitwiseOr 42 ExclusiveScan 2743
-            2745:   2244(ptr) AccessChain 34(data) 2741 2243 38
-                              Store 2745 2744
-            2746:      6(int) Load 8(invocation)
-            2747:   2251(ptr) AccessChain 34(data) 46 2243
-            2748: 26(i64vec4) Load 2747
-            2749:2250(i64vec2) VectorShuffle 2748 2748 0 1
-            2750:2250(i64vec2) GroupNonUniformBitwiseOr 42 ExclusiveScan 2749
-            2751:   2251(ptr) AccessChain 34(data) 2746 2243
-            2752: 26(i64vec4) Load 2751
-            2753: 26(i64vec4) VectorShuffle 2752 2750 4 5 2 3
-                              Store 2751 2753
-            2754:      6(int) Load 8(invocation)
-            2755:   2251(ptr) AccessChain 34(data) 57 2243
-            2756: 26(i64vec4) Load 2755
-            2757:2260(i64vec3) VectorShuffle 2756 2756 0 1 2
-            2758:2260(i64vec3) GroupNonUniformBitwiseOr 42 ExclusiveScan 2757
-            2759:   2251(ptr) AccessChain 34(data) 2754 2243
-            2760: 26(i64vec4) Load 2759
-            2761: 26(i64vec4) VectorShuffle 2760 2758 4 5 6 3
-                              Store 2759 2761
-            2762:      6(int) Load 8(invocation)
-            2763:   2251(ptr) AccessChain 34(data) 67 2243
-            2764: 26(i64vec4) Load 2763
-            2765: 26(i64vec4) GroupNonUniformBitwiseOr 42 ExclusiveScan 2764
-            2766:   2251(ptr) AccessChain 34(data) 2762 2243
-                              Store 2766 2765
-            2767:      6(int) Load 8(invocation)
-            2768:   2244(ptr) AccessChain 34(data) 37 2243 38
-            2769: 25(int64_t) Load 2768
-            2770: 25(int64_t) GroupNonUniformBitwiseXor 42 ExclusiveScan 2769
-            2771:   2244(ptr) AccessChain 34(data) 2767 2243 38
-                              Store 2771 2770
-            2772:      6(int) Load 8(invocation)
-            2773:   2251(ptr) AccessChain 34(data) 46 2243
-            2774: 26(i64vec4) Load 2773
-            2775:2250(i64vec2) VectorShuffle 2774 2774 0 1
-            2776:2250(i64vec2) GroupNonUniformBitwiseXor 42 ExclusiveScan 2775
-            2777:   2251(ptr) AccessChain 34(data) 2772 2243
-            2778: 26(i64vec4) Load 2777
-            2779: 26(i64vec4) VectorShuffle 2778 2776 4 5 2 3
-                              Store 2777 2779
-            2780:      6(int) Load 8(invocation)
-            2781:   2251(ptr) AccessChain 34(data) 57 2243
-            2782: 26(i64vec4) Load 2781
-            2783:2260(i64vec3) VectorShuffle 2782 2782 0 1 2
-            2784:2260(i64vec3) GroupNonUniformBitwiseXor 42 ExclusiveScan 2783
-            2785:   2251(ptr) AccessChain 34(data) 2780 2243
-            2786: 26(i64vec4) Load 2785
-            2787: 26(i64vec4) VectorShuffle 2786 2784 4 5 6 3
-                              Store 2785 2787
-            2788:      6(int) Load 8(invocation)
-            2789:   2251(ptr) AccessChain 34(data) 67 2243
-            2790: 26(i64vec4) Load 2789
-            2791: 26(i64vec4) GroupNonUniformBitwiseXor 42 ExclusiveScan 2790
-            2792:   2251(ptr) AccessChain 34(data) 2788 2243
-                              Store 2792 2791
-            2793:      6(int) Load 8(invocation)
-            2796:   2795(ptr) AccessChain 34(data) 37 2794 38
-            2797: 27(int64_t) Load 2796
-            2798: 27(int64_t) GroupNonUniformIAdd 42 Reduce 2797
-            2799:   2795(ptr) AccessChain 34(data) 2793 2794 38
+            2713:2588(i64vec2) VectorShuffle 2712 2712 0 1
+            2714:2588(i64vec2) GroupNonUniformBitwiseAnd 42 Reduce 2713
+            2715:   2582(ptr) AccessChain 34(data) 2710 2581 38
+            2716: 25(int64_t) CompositeExtract 2714 0
+                              Store 2715 2716
+            2717:   2582(ptr) AccessChain 34(data) 2710 2581 55
+            2718: 25(int64_t) CompositeExtract 2714 1
+                              Store 2717 2718
+            2719:      6(int) Load 8(invocation)
+            2720:   2589(ptr) AccessChain 34(data) 59 2581
+            2721: 26(i64vec4) Load 2720
+            2722:2599(i64vec3) VectorShuffle 2721 2721 0 1 2
+            2723:2599(i64vec3) GroupNonUniformBitwiseAnd 42 Reduce 2722
+            2724:   2582(ptr) AccessChain 34(data) 2719 2581 38
+            2725: 25(int64_t) CompositeExtract 2723 0
+                              Store 2724 2725
+            2726:   2582(ptr) AccessChain 34(data) 2719 2581 55
+            2727: 25(int64_t) CompositeExtract 2723 1
+                              Store 2726 2727
+            2728:   2582(ptr) AccessChain 34(data) 2719 2581 69
+            2729: 25(int64_t) CompositeExtract 2723 2
+                              Store 2728 2729
+            2730:      6(int) Load 8(invocation)
+            2731:   2589(ptr) AccessChain 34(data) 73 2581
+            2732: 26(i64vec4) Load 2731
+            2733: 26(i64vec4) GroupNonUniformBitwiseAnd 42 Reduce 2732
+            2734:   2589(ptr) AccessChain 34(data) 2730 2581
+                              Store 2734 2733
+            2735:      6(int) Load 8(invocation)
+            2736:   2582(ptr) AccessChain 34(data) 37 2581 38
+            2737: 25(int64_t) Load 2736
+            2738: 25(int64_t) GroupNonUniformBitwiseOr 42 Reduce 2737
+            2739:   2582(ptr) AccessChain 34(data) 2735 2581 38
+                              Store 2739 2738
+            2740:      6(int) Load 8(invocation)
+            2741:   2589(ptr) AccessChain 34(data) 46 2581
+            2742: 26(i64vec4) Load 2741
+            2743:2588(i64vec2) VectorShuffle 2742 2742 0 1
+            2744:2588(i64vec2) GroupNonUniformBitwiseOr 42 Reduce 2743
+            2745:   2582(ptr) AccessChain 34(data) 2740 2581 38
+            2746: 25(int64_t) CompositeExtract 2744 0
+                              Store 2745 2746
+            2747:   2582(ptr) AccessChain 34(data) 2740 2581 55
+            2748: 25(int64_t) CompositeExtract 2744 1
+                              Store 2747 2748
+            2749:      6(int) Load 8(invocation)
+            2750:   2589(ptr) AccessChain 34(data) 59 2581
+            2751: 26(i64vec4) Load 2750
+            2752:2599(i64vec3) VectorShuffle 2751 2751 0 1 2
+            2753:2599(i64vec3) GroupNonUniformBitwiseOr 42 Reduce 2752
+            2754:   2582(ptr) AccessChain 34(data) 2749 2581 38
+            2755: 25(int64_t) CompositeExtract 2753 0
+                              Store 2754 2755
+            2756:   2582(ptr) AccessChain 34(data) 2749 2581 55
+            2757: 25(int64_t) CompositeExtract 2753 1
+                              Store 2756 2757
+            2758:   2582(ptr) AccessChain 34(data) 2749 2581 69
+            2759: 25(int64_t) CompositeExtract 2753 2
+                              Store 2758 2759
+            2760:      6(int) Load 8(invocation)
+            2761:   2589(ptr) AccessChain 34(data) 73 2581
+            2762: 26(i64vec4) Load 2761
+            2763: 26(i64vec4) GroupNonUniformBitwiseOr 42 Reduce 2762
+            2764:   2589(ptr) AccessChain 34(data) 2760 2581
+                              Store 2764 2763
+            2765:      6(int) Load 8(invocation)
+            2766:   2582(ptr) AccessChain 34(data) 37 2581 38
+            2767: 25(int64_t) Load 2766
+            2768: 25(int64_t) GroupNonUniformBitwiseXor 42 Reduce 2767
+            2769:   2582(ptr) AccessChain 34(data) 2765 2581 38
+                              Store 2769 2768
+            2770:      6(int) Load 8(invocation)
+            2771:   2589(ptr) AccessChain 34(data) 46 2581
+            2772: 26(i64vec4) Load 2771
+            2773:2588(i64vec2) VectorShuffle 2772 2772 0 1
+            2774:2588(i64vec2) GroupNonUniformBitwiseXor 42 Reduce 2773
+            2775:   2582(ptr) AccessChain 34(data) 2770 2581 38
+            2776: 25(int64_t) CompositeExtract 2774 0
+                              Store 2775 2776
+            2777:   2582(ptr) AccessChain 34(data) 2770 2581 55
+            2778: 25(int64_t) CompositeExtract 2774 1
+                              Store 2777 2778
+            2779:      6(int) Load 8(invocation)
+            2780:   2589(ptr) AccessChain 34(data) 59 2581
+            2781: 26(i64vec4) Load 2780
+            2782:2599(i64vec3) VectorShuffle 2781 2781 0 1 2
+            2783:2599(i64vec3) GroupNonUniformBitwiseXor 42 Reduce 2782
+            2784:   2582(ptr) AccessChain 34(data) 2779 2581 38
+            2785: 25(int64_t) CompositeExtract 2783 0
+                              Store 2784 2785
+            2786:   2582(ptr) AccessChain 34(data) 2779 2581 55
+            2787: 25(int64_t) CompositeExtract 2783 1
+                              Store 2786 2787
+            2788:   2582(ptr) AccessChain 34(data) 2779 2581 69
+            2789: 25(int64_t) CompositeExtract 2783 2
+                              Store 2788 2789
+            2790:      6(int) Load 8(invocation)
+            2791:   2589(ptr) AccessChain 34(data) 73 2581
+            2792: 26(i64vec4) Load 2791
+            2793: 26(i64vec4) GroupNonUniformBitwiseXor 42 Reduce 2792
+            2794:   2589(ptr) AccessChain 34(data) 2790 2581
+                              Store 2794 2793
+            2795:      6(int) Load 8(invocation)
+            2796:   2582(ptr) AccessChain 34(data) 37 2581 38
+            2797: 25(int64_t) Load 2796
+            2798: 25(int64_t) GroupNonUniformIAdd 42 InclusiveScan 2797
+            2799:   2582(ptr) AccessChain 34(data) 2795 2581 38
                               Store 2799 2798
             2800:      6(int) Load 8(invocation)
-            2803:   2802(ptr) AccessChain 34(data) 46 2794
-            2804: 28(i64vec4) Load 2803
-            2805:2801(i64vec2) VectorShuffle 2804 2804 0 1
-            2806:2801(i64vec2) GroupNonUniformIAdd 42 Reduce 2805
-            2807:   2802(ptr) AccessChain 34(data) 2800 2794
-            2808: 28(i64vec4) Load 2807
-            2809: 28(i64vec4) VectorShuffle 2808 2806 4 5 2 3
-                              Store 2807 2809
-            2810:      6(int) Load 8(invocation)
-            2812:   2802(ptr) AccessChain 34(data) 57 2794
-            2813: 28(i64vec4) Load 2812
-            2814:2811(i64vec3) VectorShuffle 2813 2813 0 1 2
-            2815:2811(i64vec3) GroupNonUniformIAdd 42 Reduce 2814
-            2816:   2802(ptr) AccessChain 34(data) 2810 2794
-            2817: 28(i64vec4) Load 2816
-            2818: 28(i64vec4) VectorShuffle 2817 2815 4 5 6 3
-                              Store 2816 2818
-            2819:      6(int) Load 8(invocation)
-            2820:   2802(ptr) AccessChain 34(data) 67 2794
-            2821: 28(i64vec4) Load 2820
-            2822: 28(i64vec4) GroupNonUniformIAdd 42 Reduce 2821
-            2823:   2802(ptr) AccessChain 34(data) 2819 2794
-                              Store 2823 2822
-            2824:      6(int) Load 8(invocation)
-            2825:   2795(ptr) AccessChain 34(data) 37 2794 38
-            2826: 27(int64_t) Load 2825
-            2827: 27(int64_t) GroupNonUniformIMul 42 Reduce 2826
-            2828:   2795(ptr) AccessChain 34(data) 2824 2794 38
-                              Store 2828 2827
-            2829:      6(int) Load 8(invocation)
-            2830:   2802(ptr) AccessChain 34(data) 46 2794
-            2831: 28(i64vec4) Load 2830
-            2832:2801(i64vec2) VectorShuffle 2831 2831 0 1
-            2833:2801(i64vec2) GroupNonUniformIMul 42 Reduce 2832
-            2834:   2802(ptr) AccessChain 34(data) 2829 2794
-            2835: 28(i64vec4) Load 2834
-            2836: 28(i64vec4) VectorShuffle 2835 2833 4 5 2 3
-                              Store 2834 2836
-            2837:      6(int) Load 8(invocation)
-            2838:   2802(ptr) AccessChain 34(data) 57 2794
-            2839: 28(i64vec4) Load 2838
-            2840:2811(i64vec3) VectorShuffle 2839 2839 0 1 2
-            2841:2811(i64vec3) GroupNonUniformIMul 42 Reduce 2840
-            2842:   2802(ptr) AccessChain 34(data) 2837 2794
-            2843: 28(i64vec4) Load 2842
-            2844: 28(i64vec4) VectorShuffle 2843 2841 4 5 6 3
-                              Store 2842 2844
-            2845:      6(int) Load 8(invocation)
-            2846:   2802(ptr) AccessChain 34(data) 67 2794
-            2847: 28(i64vec4) Load 2846
-            2848: 28(i64vec4) GroupNonUniformIMul 42 Reduce 2847
-            2849:   2802(ptr) AccessChain 34(data) 2845 2794
-                              Store 2849 2848
+            2801:   2589(ptr) AccessChain 34(data) 46 2581
+            2802: 26(i64vec4) Load 2801
+            2803:2588(i64vec2) VectorShuffle 2802 2802 0 1
+            2804:2588(i64vec2) GroupNonUniformIAdd 42 InclusiveScan 2803
+            2805:   2582(ptr) AccessChain 34(data) 2800 2581 38
+            2806: 25(int64_t) CompositeExtract 2804 0
+                              Store 2805 2806
+            2807:   2582(ptr) AccessChain 34(data) 2800 2581 55
+            2808: 25(int64_t) CompositeExtract 2804 1
+                              Store 2807 2808
+            2809:      6(int) Load 8(invocation)
+            2810:   2589(ptr) AccessChain 34(data) 59 2581
+            2811: 26(i64vec4) Load 2810
+            2812:2599(i64vec3) VectorShuffle 2811 2811 0 1 2
+            2813:2599(i64vec3) GroupNonUniformIAdd 42 InclusiveScan 2812
+            2814:   2582(ptr) AccessChain 34(data) 2809 2581 38
+            2815: 25(int64_t) CompositeExtract 2813 0
+                              Store 2814 2815
+            2816:   2582(ptr) AccessChain 34(data) 2809 2581 55
+            2817: 25(int64_t) CompositeExtract 2813 1
+                              Store 2816 2817
+            2818:   2582(ptr) AccessChain 34(data) 2809 2581 69
+            2819: 25(int64_t) CompositeExtract 2813 2
+                              Store 2818 2819
+            2820:      6(int) Load 8(invocation)
+            2821:   2589(ptr) AccessChain 34(data) 73 2581
+            2822: 26(i64vec4) Load 2821
+            2823: 26(i64vec4) GroupNonUniformIAdd 42 InclusiveScan 2822
+            2824:   2589(ptr) AccessChain 34(data) 2820 2581
+                              Store 2824 2823
+            2825:      6(int) Load 8(invocation)
+            2826:   2582(ptr) AccessChain 34(data) 37 2581 38
+            2827: 25(int64_t) Load 2826
+            2828: 25(int64_t) GroupNonUniformIMul 42 InclusiveScan 2827
+            2829:   2582(ptr) AccessChain 34(data) 2825 2581 38
+                              Store 2829 2828
+            2830:      6(int) Load 8(invocation)
+            2831:   2589(ptr) AccessChain 34(data) 46 2581
+            2832: 26(i64vec4) Load 2831
+            2833:2588(i64vec2) VectorShuffle 2832 2832 0 1
+            2834:2588(i64vec2) GroupNonUniformIMul 42 InclusiveScan 2833
+            2835:   2582(ptr) AccessChain 34(data) 2830 2581 38
+            2836: 25(int64_t) CompositeExtract 2834 0
+                              Store 2835 2836
+            2837:   2582(ptr) AccessChain 34(data) 2830 2581 55
+            2838: 25(int64_t) CompositeExtract 2834 1
+                              Store 2837 2838
+            2839:      6(int) Load 8(invocation)
+            2840:   2589(ptr) AccessChain 34(data) 59 2581
+            2841: 26(i64vec4) Load 2840
+            2842:2599(i64vec3) VectorShuffle 2841 2841 0 1 2
+            2843:2599(i64vec3) GroupNonUniformIMul 42 InclusiveScan 2842
+            2844:   2582(ptr) AccessChain 34(data) 2839 2581 38
+            2845: 25(int64_t) CompositeExtract 2843 0
+                              Store 2844 2845
+            2846:   2582(ptr) AccessChain 34(data) 2839 2581 55
+            2847: 25(int64_t) CompositeExtract 2843 1
+                              Store 2846 2847
+            2848:   2582(ptr) AccessChain 34(data) 2839 2581 69
+            2849: 25(int64_t) CompositeExtract 2843 2
+                              Store 2848 2849
             2850:      6(int) Load 8(invocation)
-            2851:   2795(ptr) AccessChain 34(data) 37 2794 38
-            2852: 27(int64_t) Load 2851
-            2853: 27(int64_t) GroupNonUniformUMin 42 Reduce 2852
-            2854:   2795(ptr) AccessChain 34(data) 2850 2794 38
+            2851:   2589(ptr) AccessChain 34(data) 73 2581
+            2852: 26(i64vec4) Load 2851
+            2853: 26(i64vec4) GroupNonUniformIMul 42 InclusiveScan 2852
+            2854:   2589(ptr) AccessChain 34(data) 2850 2581
                               Store 2854 2853
             2855:      6(int) Load 8(invocation)
-            2856:   2802(ptr) AccessChain 34(data) 46 2794
-            2857: 28(i64vec4) Load 2856
-            2858:2801(i64vec2) VectorShuffle 2857 2857 0 1
-            2859:2801(i64vec2) GroupNonUniformUMin 42 Reduce 2858
-            2860:   2802(ptr) AccessChain 34(data) 2855 2794
-            2861: 28(i64vec4) Load 2860
-            2862: 28(i64vec4) VectorShuffle 2861 2859 4 5 2 3
-                              Store 2860 2862
-            2863:      6(int) Load 8(invocation)
-            2864:   2802(ptr) AccessChain 34(data) 57 2794
-            2865: 28(i64vec4) Load 2864
-            2866:2811(i64vec3) VectorShuffle 2865 2865 0 1 2
-            2867:2811(i64vec3) GroupNonUniformUMin 42 Reduce 2866
-            2868:   2802(ptr) AccessChain 34(data) 2863 2794
-            2869: 28(i64vec4) Load 2868
-            2870: 28(i64vec4) VectorShuffle 2869 2867 4 5 6 3
-                              Store 2868 2870
-            2871:      6(int) Load 8(invocation)
-            2872:   2802(ptr) AccessChain 34(data) 67 2794
-            2873: 28(i64vec4) Load 2872
-            2874: 28(i64vec4) GroupNonUniformUMin 42 Reduce 2873
-            2875:   2802(ptr) AccessChain 34(data) 2871 2794
-                              Store 2875 2874
-            2876:      6(int) Load 8(invocation)
-            2877:   2795(ptr) AccessChain 34(data) 37 2794 38
-            2878: 27(int64_t) Load 2877
-            2879: 27(int64_t) GroupNonUniformUMax 42 Reduce 2878
-            2880:   2795(ptr) AccessChain 34(data) 2876 2794 38
-                              Store 2880 2879
-            2881:      6(int) Load 8(invocation)
-            2882:   2802(ptr) AccessChain 34(data) 46 2794
-            2883: 28(i64vec4) Load 2882
-            2884:2801(i64vec2) VectorShuffle 2883 2883 0 1
-            2885:2801(i64vec2) GroupNonUniformUMax 42 Reduce 2884
-            2886:   2802(ptr) AccessChain 34(data) 2881 2794
-            2887: 28(i64vec4) Load 2886
-            2888: 28(i64vec4) VectorShuffle 2887 2885 4 5 2 3
-                              Store 2886 2888
-            2889:      6(int) Load 8(invocation)
-            2890:   2802(ptr) AccessChain 34(data) 57 2794
-            2891: 28(i64vec4) Load 2890
-            2892:2811(i64vec3) VectorShuffle 2891 2891 0 1 2
-            2893:2811(i64vec3) GroupNonUniformUMax 42 Reduce 2892
-            2894:   2802(ptr) AccessChain 34(data) 2889 2794
-            2895: 28(i64vec4) Load 2894
-            2896: 28(i64vec4) VectorShuffle 2895 2893 4 5 6 3
-                              Store 2894 2896
-            2897:      6(int) Load 8(invocation)
-            2898:   2802(ptr) AccessChain 34(data) 67 2794
-            2899: 28(i64vec4) Load 2898
-            2900: 28(i64vec4) GroupNonUniformUMax 42 Reduce 2899
-            2901:   2802(ptr) AccessChain 34(data) 2897 2794
-                              Store 2901 2900
-            2902:      6(int) Load 8(invocation)
-            2903:   2795(ptr) AccessChain 34(data) 37 2794 38
-            2904: 27(int64_t) Load 2903
-            2905: 27(int64_t) GroupNonUniformBitwiseAnd 42 Reduce 2904
-            2906:   2795(ptr) AccessChain 34(data) 2902 2794 38
-                              Store 2906 2905
-            2907:      6(int) Load 8(invocation)
-            2908:   2802(ptr) AccessChain 34(data) 46 2794
-            2909: 28(i64vec4) Load 2908
-            2910:2801(i64vec2) VectorShuffle 2909 2909 0 1
-            2911:2801(i64vec2) GroupNonUniformBitwiseAnd 42 Reduce 2910
-            2912:   2802(ptr) AccessChain 34(data) 2907 2794
-            2913: 28(i64vec4) Load 2912
-            2914: 28(i64vec4) VectorShuffle 2913 2911 4 5 2 3
-                              Store 2912 2914
+            2856:   2582(ptr) AccessChain 34(data) 37 2581 38
+            2857: 25(int64_t) Load 2856
+            2858: 25(int64_t) GroupNonUniformSMin 42 InclusiveScan 2857
+            2859:   2582(ptr) AccessChain 34(data) 2855 2581 38
+                              Store 2859 2858
+            2860:      6(int) Load 8(invocation)
+            2861:   2589(ptr) AccessChain 34(data) 46 2581
+            2862: 26(i64vec4) Load 2861
+            2863:2588(i64vec2) VectorShuffle 2862 2862 0 1
+            2864:2588(i64vec2) GroupNonUniformSMin 42 InclusiveScan 2863
+            2865:   2582(ptr) AccessChain 34(data) 2860 2581 38
+            2866: 25(int64_t) CompositeExtract 2864 0
+                              Store 2865 2866
+            2867:   2582(ptr) AccessChain 34(data) 2860 2581 55
+            2868: 25(int64_t) CompositeExtract 2864 1
+                              Store 2867 2868
+            2869:      6(int) Load 8(invocation)
+            2870:   2589(ptr) AccessChain 34(data) 59 2581
+            2871: 26(i64vec4) Load 2870
+            2872:2599(i64vec3) VectorShuffle 2871 2871 0 1 2
+            2873:2599(i64vec3) GroupNonUniformSMin 42 InclusiveScan 2872
+            2874:   2582(ptr) AccessChain 34(data) 2869 2581 38
+            2875: 25(int64_t) CompositeExtract 2873 0
+                              Store 2874 2875
+            2876:   2582(ptr) AccessChain 34(data) 2869 2581 55
+            2877: 25(int64_t) CompositeExtract 2873 1
+                              Store 2876 2877
+            2878:   2582(ptr) AccessChain 34(data) 2869 2581 69
+            2879: 25(int64_t) CompositeExtract 2873 2
+                              Store 2878 2879
+            2880:      6(int) Load 8(invocation)
+            2881:   2589(ptr) AccessChain 34(data) 73 2581
+            2882: 26(i64vec4) Load 2881
+            2883: 26(i64vec4) GroupNonUniformSMin 42 InclusiveScan 2882
+            2884:   2589(ptr) AccessChain 34(data) 2880 2581
+                              Store 2884 2883
+            2885:      6(int) Load 8(invocation)
+            2886:   2582(ptr) AccessChain 34(data) 37 2581 38
+            2887: 25(int64_t) Load 2886
+            2888: 25(int64_t) GroupNonUniformSMax 42 InclusiveScan 2887
+            2889:   2582(ptr) AccessChain 34(data) 2885 2581 38
+                              Store 2889 2888
+            2890:      6(int) Load 8(invocation)
+            2891:   2589(ptr) AccessChain 34(data) 46 2581
+            2892: 26(i64vec4) Load 2891
+            2893:2588(i64vec2) VectorShuffle 2892 2892 0 1
+            2894:2588(i64vec2) GroupNonUniformSMax 42 InclusiveScan 2893
+            2895:   2582(ptr) AccessChain 34(data) 2890 2581 38
+            2896: 25(int64_t) CompositeExtract 2894 0
+                              Store 2895 2896
+            2897:   2582(ptr) AccessChain 34(data) 2890 2581 55
+            2898: 25(int64_t) CompositeExtract 2894 1
+                              Store 2897 2898
+            2899:      6(int) Load 8(invocation)
+            2900:   2589(ptr) AccessChain 34(data) 59 2581
+            2901: 26(i64vec4) Load 2900
+            2902:2599(i64vec3) VectorShuffle 2901 2901 0 1 2
+            2903:2599(i64vec3) GroupNonUniformSMax 42 InclusiveScan 2902
+            2904:   2582(ptr) AccessChain 34(data) 2899 2581 38
+            2905: 25(int64_t) CompositeExtract 2903 0
+                              Store 2904 2905
+            2906:   2582(ptr) AccessChain 34(data) 2899 2581 55
+            2907: 25(int64_t) CompositeExtract 2903 1
+                              Store 2906 2907
+            2908:   2582(ptr) AccessChain 34(data) 2899 2581 69
+            2909: 25(int64_t) CompositeExtract 2903 2
+                              Store 2908 2909
+            2910:      6(int) Load 8(invocation)
+            2911:   2589(ptr) AccessChain 34(data) 73 2581
+            2912: 26(i64vec4) Load 2911
+            2913: 26(i64vec4) GroupNonUniformSMax 42 InclusiveScan 2912
+            2914:   2589(ptr) AccessChain 34(data) 2910 2581
+                              Store 2914 2913
             2915:      6(int) Load 8(invocation)
-            2916:   2802(ptr) AccessChain 34(data) 57 2794
-            2917: 28(i64vec4) Load 2916
-            2918:2811(i64vec3) VectorShuffle 2917 2917 0 1 2
-            2919:2811(i64vec3) GroupNonUniformBitwiseAnd 42 Reduce 2918
-            2920:   2802(ptr) AccessChain 34(data) 2915 2794
-            2921: 28(i64vec4) Load 2920
-            2922: 28(i64vec4) VectorShuffle 2921 2919 4 5 6 3
-                              Store 2920 2922
-            2923:      6(int) Load 8(invocation)
-            2924:   2802(ptr) AccessChain 34(data) 67 2794
-            2925: 28(i64vec4) Load 2924
-            2926: 28(i64vec4) GroupNonUniformBitwiseAnd 42 Reduce 2925
-            2927:   2802(ptr) AccessChain 34(data) 2923 2794
-                              Store 2927 2926
-            2928:      6(int) Load 8(invocation)
-            2929:   2795(ptr) AccessChain 34(data) 37 2794 38
-            2930: 27(int64_t) Load 2929
-            2931: 27(int64_t) GroupNonUniformBitwiseOr 42 Reduce 2930
-            2932:   2795(ptr) AccessChain 34(data) 2928 2794 38
-                              Store 2932 2931
-            2933:      6(int) Load 8(invocation)
-            2934:   2802(ptr) AccessChain 34(data) 46 2794
-            2935: 28(i64vec4) Load 2934
-            2936:2801(i64vec2) VectorShuffle 2935 2935 0 1
-            2937:2801(i64vec2) GroupNonUniformBitwiseOr 42 Reduce 2936
-            2938:   2802(ptr) AccessChain 34(data) 2933 2794
-            2939: 28(i64vec4) Load 2938
-            2940: 28(i64vec4) VectorShuffle 2939 2937 4 5 2 3
-                              Store 2938 2940
-            2941:      6(int) Load 8(invocation)
-            2942:   2802(ptr) AccessChain 34(data) 57 2794
-            2943: 28(i64vec4) Load 2942
-            2944:2811(i64vec3) VectorShuffle 2943 2943 0 1 2
-            2945:2811(i64vec3) GroupNonUniformBitwiseOr 42 Reduce 2944
-            2946:   2802(ptr) AccessChain 34(data) 2941 2794
-            2947: 28(i64vec4) Load 2946
-            2948: 28(i64vec4) VectorShuffle 2947 2945 4 5 6 3
-                              Store 2946 2948
-            2949:      6(int) Load 8(invocation)
-            2950:   2802(ptr) AccessChain 34(data) 67 2794
-            2951: 28(i64vec4) Load 2950
-            2952: 28(i64vec4) GroupNonUniformBitwiseOr 42 Reduce 2951
-            2953:   2802(ptr) AccessChain 34(data) 2949 2794
-                              Store 2953 2952
-            2954:      6(int) Load 8(invocation)
-            2955:   2795(ptr) AccessChain 34(data) 37 2794 38
-            2956: 27(int64_t) Load 2955
-            2957: 27(int64_t) GroupNonUniformBitwiseXor 42 Reduce 2956
-            2958:   2795(ptr) AccessChain 34(data) 2954 2794 38
-                              Store 2958 2957
+            2916:   2582(ptr) AccessChain 34(data) 37 2581 38
+            2917: 25(int64_t) Load 2916
+            2918: 25(int64_t) GroupNonUniformBitwiseAnd 42 InclusiveScan 2917
+            2919:   2582(ptr) AccessChain 34(data) 2915 2581 38
+                              Store 2919 2918
+            2920:      6(int) Load 8(invocation)
+            2921:   2589(ptr) AccessChain 34(data) 46 2581
+            2922: 26(i64vec4) Load 2921
+            2923:2588(i64vec2) VectorShuffle 2922 2922 0 1
+            2924:2588(i64vec2) GroupNonUniformBitwiseAnd 42 InclusiveScan 2923
+            2925:   2582(ptr) AccessChain 34(data) 2920 2581 38
+            2926: 25(int64_t) CompositeExtract 2924 0
+                              Store 2925 2926
+            2927:   2582(ptr) AccessChain 34(data) 2920 2581 55
+            2928: 25(int64_t) CompositeExtract 2924 1
+                              Store 2927 2928
+            2929:      6(int) Load 8(invocation)
+            2930:   2589(ptr) AccessChain 34(data) 59 2581
+            2931: 26(i64vec4) Load 2930
+            2932:2599(i64vec3) VectorShuffle 2931 2931 0 1 2
+            2933:2599(i64vec3) GroupNonUniformBitwiseAnd 42 InclusiveScan 2932
+            2934:   2582(ptr) AccessChain 34(data) 2929 2581 38
+            2935: 25(int64_t) CompositeExtract 2933 0
+                              Store 2934 2935
+            2936:   2582(ptr) AccessChain 34(data) 2929 2581 55
+            2937: 25(int64_t) CompositeExtract 2933 1
+                              Store 2936 2937
+            2938:   2582(ptr) AccessChain 34(data) 2929 2581 69
+            2939: 25(int64_t) CompositeExtract 2933 2
+                              Store 2938 2939
+            2940:      6(int) Load 8(invocation)
+            2941:   2589(ptr) AccessChain 34(data) 73 2581
+            2942: 26(i64vec4) Load 2941
+            2943: 26(i64vec4) GroupNonUniformBitwiseAnd 42 InclusiveScan 2942
+            2944:   2589(ptr) AccessChain 34(data) 2940 2581
+                              Store 2944 2943
+            2945:      6(int) Load 8(invocation)
+            2946:   2582(ptr) AccessChain 34(data) 37 2581 38
+            2947: 25(int64_t) Load 2946
+            2948: 25(int64_t) GroupNonUniformBitwiseOr 42 InclusiveScan 2947
+            2949:   2582(ptr) AccessChain 34(data) 2945 2581 38
+                              Store 2949 2948
+            2950:      6(int) Load 8(invocation)
+            2951:   2589(ptr) AccessChain 34(data) 46 2581
+            2952: 26(i64vec4) Load 2951
+            2953:2588(i64vec2) VectorShuffle 2952 2952 0 1
+            2954:2588(i64vec2) GroupNonUniformBitwiseOr 42 InclusiveScan 2953
+            2955:   2582(ptr) AccessChain 34(data) 2950 2581 38
+            2956: 25(int64_t) CompositeExtract 2954 0
+                              Store 2955 2956
+            2957:   2582(ptr) AccessChain 34(data) 2950 2581 55
+            2958: 25(int64_t) CompositeExtract 2954 1
+                              Store 2957 2958
             2959:      6(int) Load 8(invocation)
-            2960:   2802(ptr) AccessChain 34(data) 46 2794
-            2961: 28(i64vec4) Load 2960
-            2962:2801(i64vec2) VectorShuffle 2961 2961 0 1
-            2963:2801(i64vec2) GroupNonUniformBitwiseXor 42 Reduce 2962
-            2964:   2802(ptr) AccessChain 34(data) 2959 2794
-            2965: 28(i64vec4) Load 2964
-            2966: 28(i64vec4) VectorShuffle 2965 2963 4 5 2 3
-                              Store 2964 2966
-            2967:      6(int) Load 8(invocation)
-            2968:   2802(ptr) AccessChain 34(data) 57 2794
-            2969: 28(i64vec4) Load 2968
-            2970:2811(i64vec3) VectorShuffle 2969 2969 0 1 2
-            2971:2811(i64vec3) GroupNonUniformBitwiseXor 42 Reduce 2970
-            2972:   2802(ptr) AccessChain 34(data) 2967 2794
-            2973: 28(i64vec4) Load 2972
-            2974: 28(i64vec4) VectorShuffle 2973 2971 4 5 6 3
-                              Store 2972 2974
+            2960:   2589(ptr) AccessChain 34(data) 59 2581
+            2961: 26(i64vec4) Load 2960
+            2962:2599(i64vec3) VectorShuffle 2961 2961 0 1 2
+            2963:2599(i64vec3) GroupNonUniformBitwiseOr 42 InclusiveScan 2962
+            2964:   2582(ptr) AccessChain 34(data) 2959 2581 38
+            2965: 25(int64_t) CompositeExtract 2963 0
+                              Store 2964 2965
+            2966:   2582(ptr) AccessChain 34(data) 2959 2581 55
+            2967: 25(int64_t) CompositeExtract 2963 1
+                              Store 2966 2967
+            2968:   2582(ptr) AccessChain 34(data) 2959 2581 69
+            2969: 25(int64_t) CompositeExtract 2963 2
+                              Store 2968 2969
+            2970:      6(int) Load 8(invocation)
+            2971:   2589(ptr) AccessChain 34(data) 73 2581
+            2972: 26(i64vec4) Load 2971
+            2973: 26(i64vec4) GroupNonUniformBitwiseOr 42 InclusiveScan 2972
+            2974:   2589(ptr) AccessChain 34(data) 2970 2581
+                              Store 2974 2973
             2975:      6(int) Load 8(invocation)
-            2976:   2802(ptr) AccessChain 34(data) 67 2794
-            2977: 28(i64vec4) Load 2976
-            2978: 28(i64vec4) GroupNonUniformBitwiseXor 42 Reduce 2977
-            2979:   2802(ptr) AccessChain 34(data) 2975 2794
+            2976:   2582(ptr) AccessChain 34(data) 37 2581 38
+            2977: 25(int64_t) Load 2976
+            2978: 25(int64_t) GroupNonUniformBitwiseXor 42 InclusiveScan 2977
+            2979:   2582(ptr) AccessChain 34(data) 2975 2581 38
                               Store 2979 2978
             2980:      6(int) Load 8(invocation)
-            2981:   2795(ptr) AccessChain 34(data) 37 2794 38
-            2982: 27(int64_t) Load 2981
-            2983: 27(int64_t) GroupNonUniformIAdd 42 InclusiveScan 2982
-            2984:   2795(ptr) AccessChain 34(data) 2980 2794 38
-                              Store 2984 2983
-            2985:      6(int) Load 8(invocation)
-            2986:   2802(ptr) AccessChain 34(data) 46 2794
-            2987: 28(i64vec4) Load 2986
-            2988:2801(i64vec2) VectorShuffle 2987 2987 0 1
-            2989:2801(i64vec2) GroupNonUniformIAdd 42 InclusiveScan 2988
-            2990:   2802(ptr) AccessChain 34(data) 2985 2794
-            2991: 28(i64vec4) Load 2990
-            2992: 28(i64vec4) VectorShuffle 2991 2989 4 5 2 3
-                              Store 2990 2992
-            2993:      6(int) Load 8(invocation)
-            2994:   2802(ptr) AccessChain 34(data) 57 2794
-            2995: 28(i64vec4) Load 2994
-            2996:2811(i64vec3) VectorShuffle 2995 2995 0 1 2
-            2997:2811(i64vec3) GroupNonUniformIAdd 42 InclusiveScan 2996
-            2998:   2802(ptr) AccessChain 34(data) 2993 2794
-            2999: 28(i64vec4) Load 2998
-            3000: 28(i64vec4) VectorShuffle 2999 2997 4 5 6 3
-                              Store 2998 3000
-            3001:      6(int) Load 8(invocation)
-            3002:   2802(ptr) AccessChain 34(data) 67 2794
-            3003: 28(i64vec4) Load 3002
-            3004: 28(i64vec4) GroupNonUniformIAdd 42 InclusiveScan 3003
-            3005:   2802(ptr) AccessChain 34(data) 3001 2794
-                              Store 3005 3004
-            3006:      6(int) Load 8(invocation)
-            3007:   2795(ptr) AccessChain 34(data) 37 2794 38
-            3008: 27(int64_t) Load 3007
-            3009: 27(int64_t) GroupNonUniformIMul 42 InclusiveScan 3008
-            3010:   2795(ptr) AccessChain 34(data) 3006 2794 38
-                              Store 3010 3009
-            3011:      6(int) Load 8(invocation)
-            3012:   2802(ptr) AccessChain 34(data) 46 2794
-            3013: 28(i64vec4) Load 3012
-            3014:2801(i64vec2) VectorShuffle 3013 3013 0 1
-            3015:2801(i64vec2) GroupNonUniformIMul 42 InclusiveScan 3014
-            3016:   2802(ptr) AccessChain 34(data) 3011 2794
-            3017: 28(i64vec4) Load 3016
-            3018: 28(i64vec4) VectorShuffle 3017 3015 4 5 2 3
-                              Store 3016 3018
+            2981:   2589(ptr) AccessChain 34(data) 46 2581
+            2982: 26(i64vec4) Load 2981
+            2983:2588(i64vec2) VectorShuffle 2982 2982 0 1
+            2984:2588(i64vec2) GroupNonUniformBitwiseXor 42 InclusiveScan 2983
+            2985:   2582(ptr) AccessChain 34(data) 2980 2581 38
+            2986: 25(int64_t) CompositeExtract 2984 0
+                              Store 2985 2986
+            2987:   2582(ptr) AccessChain 34(data) 2980 2581 55
+            2988: 25(int64_t) CompositeExtract 2984 1
+                              Store 2987 2988
+            2989:      6(int) Load 8(invocation)
+            2990:   2589(ptr) AccessChain 34(data) 59 2581
+            2991: 26(i64vec4) Load 2990
+            2992:2599(i64vec3) VectorShuffle 2991 2991 0 1 2
+            2993:2599(i64vec3) GroupNonUniformBitwiseXor 42 InclusiveScan 2992
+            2994:   2582(ptr) AccessChain 34(data) 2989 2581 38
+            2995: 25(int64_t) CompositeExtract 2993 0
+                              Store 2994 2995
+            2996:   2582(ptr) AccessChain 34(data) 2989 2581 55
+            2997: 25(int64_t) CompositeExtract 2993 1
+                              Store 2996 2997
+            2998:   2582(ptr) AccessChain 34(data) 2989 2581 69
+            2999: 25(int64_t) CompositeExtract 2993 2
+                              Store 2998 2999
+            3000:      6(int) Load 8(invocation)
+            3001:   2589(ptr) AccessChain 34(data) 73 2581
+            3002: 26(i64vec4) Load 3001
+            3003: 26(i64vec4) GroupNonUniformBitwiseXor 42 InclusiveScan 3002
+            3004:   2589(ptr) AccessChain 34(data) 3000 2581
+                              Store 3004 3003
+            3005:      6(int) Load 8(invocation)
+            3006:   2582(ptr) AccessChain 34(data) 37 2581 38
+            3007: 25(int64_t) Load 3006
+            3008: 25(int64_t) GroupNonUniformIAdd 42 ExclusiveScan 3007
+            3009:   2582(ptr) AccessChain 34(data) 3005 2581 38
+                              Store 3009 3008
+            3010:      6(int) Load 8(invocation)
+            3011:   2589(ptr) AccessChain 34(data) 46 2581
+            3012: 26(i64vec4) Load 3011
+            3013:2588(i64vec2) VectorShuffle 3012 3012 0 1
+            3014:2588(i64vec2) GroupNonUniformIAdd 42 ExclusiveScan 3013
+            3015:   2582(ptr) AccessChain 34(data) 3010 2581 38
+            3016: 25(int64_t) CompositeExtract 3014 0
+                              Store 3015 3016
+            3017:   2582(ptr) AccessChain 34(data) 3010 2581 55
+            3018: 25(int64_t) CompositeExtract 3014 1
+                              Store 3017 3018
             3019:      6(int) Load 8(invocation)
-            3020:   2802(ptr) AccessChain 34(data) 57 2794
-            3021: 28(i64vec4) Load 3020
-            3022:2811(i64vec3) VectorShuffle 3021 3021 0 1 2
-            3023:2811(i64vec3) GroupNonUniformIMul 42 InclusiveScan 3022
-            3024:   2802(ptr) AccessChain 34(data) 3019 2794
-            3025: 28(i64vec4) Load 3024
-            3026: 28(i64vec4) VectorShuffle 3025 3023 4 5 6 3
-                              Store 3024 3026
-            3027:      6(int) Load 8(invocation)
-            3028:   2802(ptr) AccessChain 34(data) 67 2794
-            3029: 28(i64vec4) Load 3028
-            3030: 28(i64vec4) GroupNonUniformIMul 42 InclusiveScan 3029
-            3031:   2802(ptr) AccessChain 34(data) 3027 2794
-                              Store 3031 3030
-            3032:      6(int) Load 8(invocation)
-            3033:   2795(ptr) AccessChain 34(data) 37 2794 38
-            3034: 27(int64_t) Load 3033
-            3035: 27(int64_t) GroupNonUniformUMin 42 InclusiveScan 3034
-            3036:   2795(ptr) AccessChain 34(data) 3032 2794 38
-                              Store 3036 3035
-            3037:      6(int) Load 8(invocation)
-            3038:   2802(ptr) AccessChain 34(data) 46 2794
-            3039: 28(i64vec4) Load 3038
-            3040:2801(i64vec2) VectorShuffle 3039 3039 0 1
-            3041:2801(i64vec2) GroupNonUniformUMin 42 InclusiveScan 3040
-            3042:   2802(ptr) AccessChain 34(data) 3037 2794
-            3043: 28(i64vec4) Load 3042
-            3044: 28(i64vec4) VectorShuffle 3043 3041 4 5 2 3
-                              Store 3042 3044
-            3045:      6(int) Load 8(invocation)
-            3046:   2802(ptr) AccessChain 34(data) 57 2794
-            3047: 28(i64vec4) Load 3046
-            3048:2811(i64vec3) VectorShuffle 3047 3047 0 1 2
-            3049:2811(i64vec3) GroupNonUniformUMin 42 InclusiveScan 3048
-            3050:   2802(ptr) AccessChain 34(data) 3045 2794
-            3051: 28(i64vec4) Load 3050
-            3052: 28(i64vec4) VectorShuffle 3051 3049 4 5 6 3
-                              Store 3050 3052
-            3053:      6(int) Load 8(invocation)
-            3054:   2802(ptr) AccessChain 34(data) 67 2794
-            3055: 28(i64vec4) Load 3054
-            3056: 28(i64vec4) GroupNonUniformUMin 42 InclusiveScan 3055
-            3057:   2802(ptr) AccessChain 34(data) 3053 2794
-                              Store 3057 3056
-            3058:      6(int) Load 8(invocation)
-            3059:   2795(ptr) AccessChain 34(data) 37 2794 38
-            3060: 27(int64_t) Load 3059
-            3061: 27(int64_t) GroupNonUniformUMax 42 InclusiveScan 3060
-            3062:   2795(ptr) AccessChain 34(data) 3058 2794 38
-                              Store 3062 3061
-            3063:      6(int) Load 8(invocation)
-            3064:   2802(ptr) AccessChain 34(data) 46 2794
-            3065: 28(i64vec4) Load 3064
-            3066:2801(i64vec2) VectorShuffle 3065 3065 0 1
-            3067:2801(i64vec2) GroupNonUniformUMax 42 InclusiveScan 3066
-            3068:   2802(ptr) AccessChain 34(data) 3063 2794
-            3069: 28(i64vec4) Load 3068
-            3070: 28(i64vec4) VectorShuffle 3069 3067 4 5 2 3
-                              Store 3068 3070
-            3071:      6(int) Load 8(invocation)
-            3072:   2802(ptr) AccessChain 34(data) 57 2794
-            3073: 28(i64vec4) Load 3072
-            3074:2811(i64vec3) VectorShuffle 3073 3073 0 1 2
-            3075:2811(i64vec3) GroupNonUniformUMax 42 InclusiveScan 3074
-            3076:   2802(ptr) AccessChain 34(data) 3071 2794
-            3077: 28(i64vec4) Load 3076
-            3078: 28(i64vec4) VectorShuffle 3077 3075 4 5 6 3
-                              Store 3076 3078
+            3020:   2589(ptr) AccessChain 34(data) 59 2581
+            3021: 26(i64vec4) Load 3020
+            3022:2599(i64vec3) VectorShuffle 3021 3021 0 1 2
+            3023:2599(i64vec3) GroupNonUniformIAdd 42 ExclusiveScan 3022
+            3024:   2582(ptr) AccessChain 34(data) 3019 2581 38
+            3025: 25(int64_t) CompositeExtract 3023 0
+                              Store 3024 3025
+            3026:   2582(ptr) AccessChain 34(data) 3019 2581 55
+            3027: 25(int64_t) CompositeExtract 3023 1
+                              Store 3026 3027
+            3028:   2582(ptr) AccessChain 34(data) 3019 2581 69
+            3029: 25(int64_t) CompositeExtract 3023 2
+                              Store 3028 3029
+            3030:      6(int) Load 8(invocation)
+            3031:   2589(ptr) AccessChain 34(data) 73 2581
+            3032: 26(i64vec4) Load 3031
+            3033: 26(i64vec4) GroupNonUniformIAdd 42 ExclusiveScan 3032
+            3034:   2589(ptr) AccessChain 34(data) 3030 2581
+                              Store 3034 3033
+            3035:      6(int) Load 8(invocation)
+            3036:   2582(ptr) AccessChain 34(data) 37 2581 38
+            3037: 25(int64_t) Load 3036
+            3038: 25(int64_t) GroupNonUniformIMul 42 ExclusiveScan 3037
+            3039:   2582(ptr) AccessChain 34(data) 3035 2581 38
+                              Store 3039 3038
+            3040:      6(int) Load 8(invocation)
+            3041:   2589(ptr) AccessChain 34(data) 46 2581
+            3042: 26(i64vec4) Load 3041
+            3043:2588(i64vec2) VectorShuffle 3042 3042 0 1
+            3044:2588(i64vec2) GroupNonUniformIMul 42 ExclusiveScan 3043
+            3045:   2582(ptr) AccessChain 34(data) 3040 2581 38
+            3046: 25(int64_t) CompositeExtract 3044 0
+                              Store 3045 3046
+            3047:   2582(ptr) AccessChain 34(data) 3040 2581 55
+            3048: 25(int64_t) CompositeExtract 3044 1
+                              Store 3047 3048
+            3049:      6(int) Load 8(invocation)
+            3050:   2589(ptr) AccessChain 34(data) 59 2581
+            3051: 26(i64vec4) Load 3050
+            3052:2599(i64vec3) VectorShuffle 3051 3051 0 1 2
+            3053:2599(i64vec3) GroupNonUniformIMul 42 ExclusiveScan 3052
+            3054:   2582(ptr) AccessChain 34(data) 3049 2581 38
+            3055: 25(int64_t) CompositeExtract 3053 0
+                              Store 3054 3055
+            3056:   2582(ptr) AccessChain 34(data) 3049 2581 55
+            3057: 25(int64_t) CompositeExtract 3053 1
+                              Store 3056 3057
+            3058:   2582(ptr) AccessChain 34(data) 3049 2581 69
+            3059: 25(int64_t) CompositeExtract 3053 2
+                              Store 3058 3059
+            3060:      6(int) Load 8(invocation)
+            3061:   2589(ptr) AccessChain 34(data) 73 2581
+            3062: 26(i64vec4) Load 3061
+            3063: 26(i64vec4) GroupNonUniformIMul 42 ExclusiveScan 3062
+            3064:   2589(ptr) AccessChain 34(data) 3060 2581
+                              Store 3064 3063
+            3065:      6(int) Load 8(invocation)
+            3066:   2582(ptr) AccessChain 34(data) 37 2581 38
+            3067: 25(int64_t) Load 3066
+            3068: 25(int64_t) GroupNonUniformSMin 42 ExclusiveScan 3067
+            3069:   2582(ptr) AccessChain 34(data) 3065 2581 38
+                              Store 3069 3068
+            3070:      6(int) Load 8(invocation)
+            3071:   2589(ptr) AccessChain 34(data) 46 2581
+            3072: 26(i64vec4) Load 3071
+            3073:2588(i64vec2) VectorShuffle 3072 3072 0 1
+            3074:2588(i64vec2) GroupNonUniformSMin 42 ExclusiveScan 3073
+            3075:   2582(ptr) AccessChain 34(data) 3070 2581 38
+            3076: 25(int64_t) CompositeExtract 3074 0
+                              Store 3075 3076
+            3077:   2582(ptr) AccessChain 34(data) 3070 2581 55
+            3078: 25(int64_t) CompositeExtract 3074 1
+                              Store 3077 3078
             3079:      6(int) Load 8(invocation)
-            3080:   2802(ptr) AccessChain 34(data) 67 2794
-            3081: 28(i64vec4) Load 3080
-            3082: 28(i64vec4) GroupNonUniformUMax 42 InclusiveScan 3081
-            3083:   2802(ptr) AccessChain 34(data) 3079 2794
-                              Store 3083 3082
-            3084:      6(int) Load 8(invocation)
-            3085:   2795(ptr) AccessChain 34(data) 37 2794 38
-            3086: 27(int64_t) Load 3085
-            3087: 27(int64_t) GroupNonUniformBitwiseAnd 42 InclusiveScan 3086
-            3088:   2795(ptr) AccessChain 34(data) 3084 2794 38
-                              Store 3088 3087
-            3089:      6(int) Load 8(invocation)
-            3090:   2802(ptr) AccessChain 34(data) 46 2794
-            3091: 28(i64vec4) Load 3090
-            3092:2801(i64vec2) VectorShuffle 3091 3091 0 1
-            3093:2801(i64vec2) GroupNonUniformBitwiseAnd 42 InclusiveScan 3092
-            3094:   2802(ptr) AccessChain 34(data) 3089 2794
-            3095: 28(i64vec4) Load 3094
-            3096: 28(i64vec4) VectorShuffle 3095 3093 4 5 2 3
-                              Store 3094 3096
-            3097:      6(int) Load 8(invocation)
-            3098:   2802(ptr) AccessChain 34(data) 57 2794
-            3099: 28(i64vec4) Load 3098
-            3100:2811(i64vec3) VectorShuffle 3099 3099 0 1 2
-            3101:2811(i64vec3) GroupNonUniformBitwiseAnd 42 InclusiveScan 3100
-            3102:   2802(ptr) AccessChain 34(data) 3097 2794
-            3103: 28(i64vec4) Load 3102
-            3104: 28(i64vec4) VectorShuffle 3103 3101 4 5 6 3
-                              Store 3102 3104
-            3105:      6(int) Load 8(invocation)
-            3106:   2802(ptr) AccessChain 34(data) 67 2794
-            3107: 28(i64vec4) Load 3106
-            3108: 28(i64vec4) GroupNonUniformBitwiseAnd 42 InclusiveScan 3107
-            3109:   2802(ptr) AccessChain 34(data) 3105 2794
-                              Store 3109 3108
-            3110:      6(int) Load 8(invocation)
-            3111:   2795(ptr) AccessChain 34(data) 37 2794 38
-            3112: 27(int64_t) Load 3111
-            3113: 27(int64_t) GroupNonUniformBitwiseOr 42 InclusiveScan 3112
-            3114:   2795(ptr) AccessChain 34(data) 3110 2794 38
-                              Store 3114 3113
-            3115:      6(int) Load 8(invocation)
-            3116:   2802(ptr) AccessChain 34(data) 46 2794
-            3117: 28(i64vec4) Load 3116
-            3118:2801(i64vec2) VectorShuffle 3117 3117 0 1
-            3119:2801(i64vec2) GroupNonUniformBitwiseOr 42 InclusiveScan 3118
-            3120:   2802(ptr) AccessChain 34(data) 3115 2794
-            3121: 28(i64vec4) Load 3120
-            3122: 28(i64vec4) VectorShuffle 3121 3119 4 5 2 3
-                              Store 3120 3122
-            3123:      6(int) Load 8(invocation)
-            3124:   2802(ptr) AccessChain 34(data) 57 2794
-            3125: 28(i64vec4) Load 3124
-            3126:2811(i64vec3) VectorShuffle 3125 3125 0 1 2
-            3127:2811(i64vec3) GroupNonUniformBitwiseOr 42 InclusiveScan 3126
-            3128:   2802(ptr) AccessChain 34(data) 3123 2794
-            3129: 28(i64vec4) Load 3128
-            3130: 28(i64vec4) VectorShuffle 3129 3127 4 5 6 3
-                              Store 3128 3130
-            3131:      6(int) Load 8(invocation)
-            3132:   2802(ptr) AccessChain 34(data) 67 2794
-            3133: 28(i64vec4) Load 3132
-            3134: 28(i64vec4) GroupNonUniformBitwiseOr 42 InclusiveScan 3133
-            3135:   2802(ptr) AccessChain 34(data) 3131 2794
-                              Store 3135 3134
-            3136:      6(int) Load 8(invocation)
-            3137:   2795(ptr) AccessChain 34(data) 37 2794 38
-            3138: 27(int64_t) Load 3137
-            3139: 27(int64_t) GroupNonUniformBitwiseXor 42 InclusiveScan 3138
-            3140:   2795(ptr) AccessChain 34(data) 3136 2794 38
-                              Store 3140 3139
-            3141:      6(int) Load 8(invocation)
-            3142:   2802(ptr) AccessChain 34(data) 46 2794
-            3143: 28(i64vec4) Load 3142
-            3144:2801(i64vec2) VectorShuffle 3143 3143 0 1
-            3145:2801(i64vec2) GroupNonUniformBitwiseXor 42 InclusiveScan 3144
-            3146:   2802(ptr) AccessChain 34(data) 3141 2794
-            3147: 28(i64vec4) Load 3146
-            3148: 28(i64vec4) VectorShuffle 3147 3145 4 5 2 3
-                              Store 3146 3148
-            3149:      6(int) Load 8(invocation)
-            3150:   2802(ptr) AccessChain 34(data) 57 2794
-            3151: 28(i64vec4) Load 3150
-            3152:2811(i64vec3) VectorShuffle 3151 3151 0 1 2
-            3153:2811(i64vec3) GroupNonUniformBitwiseXor 42 InclusiveScan 3152
-            3154:   2802(ptr) AccessChain 34(data) 3149 2794
-            3155: 28(i64vec4) Load 3154
-            3156: 28(i64vec4) VectorShuffle 3155 3153 4 5 6 3
-                              Store 3154 3156
-            3157:      6(int) Load 8(invocation)
-            3158:   2802(ptr) AccessChain 34(data) 67 2794
-            3159: 28(i64vec4) Load 3158
-            3160: 28(i64vec4) GroupNonUniformBitwiseXor 42 InclusiveScan 3159
-            3161:   2802(ptr) AccessChain 34(data) 3157 2794
-                              Store 3161 3160
-            3162:      6(int) Load 8(invocation)
-            3163:   2795(ptr) AccessChain 34(data) 37 2794 38
-            3164: 27(int64_t) Load 3163
-            3165: 27(int64_t) GroupNonUniformIAdd 42 ExclusiveScan 3164
-            3166:   2795(ptr) AccessChain 34(data) 3162 2794 38
-                              Store 3166 3165
-            3167:      6(int) Load 8(invocation)
-            3168:   2802(ptr) AccessChain 34(data) 46 2794
-            3169: 28(i64vec4) Load 3168
-            3170:2801(i64vec2) VectorShuffle 3169 3169 0 1
-            3171:2801(i64vec2) GroupNonUniformIAdd 42 ExclusiveScan 3170
-            3172:   2802(ptr) AccessChain 34(data) 3167 2794
-            3173: 28(i64vec4) Load 3172
-            3174: 28(i64vec4) VectorShuffle 3173 3171 4 5 2 3
-                              Store 3172 3174
-            3175:      6(int) Load 8(invocation)
-            3176:   2802(ptr) AccessChain 34(data) 57 2794
-            3177: 28(i64vec4) Load 3176
-            3178:2811(i64vec3) VectorShuffle 3177 3177 0 1 2
-            3179:2811(i64vec3) GroupNonUniformIAdd 42 ExclusiveScan 3178
-            3180:   2802(ptr) AccessChain 34(data) 3175 2794
-            3181: 28(i64vec4) Load 3180
-            3182: 28(i64vec4) VectorShuffle 3181 3179 4 5 6 3
-                              Store 3180 3182
-            3183:      6(int) Load 8(invocation)
-            3184:   2802(ptr) AccessChain 34(data) 67 2794
-            3185: 28(i64vec4) Load 3184
-            3186: 28(i64vec4) GroupNonUniformIAdd 42 ExclusiveScan 3185
-            3187:   2802(ptr) AccessChain 34(data) 3183 2794
-                              Store 3187 3186
-            3188:      6(int) Load 8(invocation)
-            3189:   2795(ptr) AccessChain 34(data) 37 2794 38
-            3190: 27(int64_t) Load 3189
-            3191: 27(int64_t) GroupNonUniformIMul 42 ExclusiveScan 3190
-            3192:   2795(ptr) AccessChain 34(data) 3188 2794 38
-                              Store 3192 3191
-            3193:      6(int) Load 8(invocation)
-            3194:   2802(ptr) AccessChain 34(data) 46 2794
-            3195: 28(i64vec4) Load 3194
-            3196:2801(i64vec2) VectorShuffle 3195 3195 0 1
-            3197:2801(i64vec2) GroupNonUniformIMul 42 ExclusiveScan 3196
-            3198:   2802(ptr) AccessChain 34(data) 3193 2794
-            3199: 28(i64vec4) Load 3198
-            3200: 28(i64vec4) VectorShuffle 3199 3197 4 5 2 3
-                              Store 3198 3200
-            3201:      6(int) Load 8(invocation)
-            3202:   2802(ptr) AccessChain 34(data) 57 2794
-            3203: 28(i64vec4) Load 3202
-            3204:2811(i64vec3) VectorShuffle 3203 3203 0 1 2
-            3205:2811(i64vec3) GroupNonUniformIMul 42 ExclusiveScan 3204
-            3206:   2802(ptr) AccessChain 34(data) 3201 2794
-            3207: 28(i64vec4) Load 3206
-            3208: 28(i64vec4) VectorShuffle 3207 3205 4 5 6 3
-                              Store 3206 3208
-            3209:      6(int) Load 8(invocation)
-            3210:   2802(ptr) AccessChain 34(data) 67 2794
-            3211: 28(i64vec4) Load 3210
-            3212: 28(i64vec4) GroupNonUniformIMul 42 ExclusiveScan 3211
-            3213:   2802(ptr) AccessChain 34(data) 3209 2794
-                              Store 3213 3212
-            3214:      6(int) Load 8(invocation)
-            3215:   2795(ptr) AccessChain 34(data) 37 2794 38
-            3216: 27(int64_t) Load 3215
-            3217: 27(int64_t) GroupNonUniformUMin 42 ExclusiveScan 3216
-            3218:   2795(ptr) AccessChain 34(data) 3214 2794 38
-                              Store 3218 3217
-            3219:      6(int) Load 8(invocation)
-            3220:   2802(ptr) AccessChain 34(data) 46 2794
-            3221: 28(i64vec4) Load 3220
-            3222:2801(i64vec2) VectorShuffle 3221 3221 0 1
-            3223:2801(i64vec2) GroupNonUniformUMin 42 ExclusiveScan 3222
-            3224:   2802(ptr) AccessChain 34(data) 3219 2794
-            3225: 28(i64vec4) Load 3224
-            3226: 28(i64vec4) VectorShuffle 3225 3223 4 5 2 3
-                              Store 3224 3226
-            3227:      6(int) Load 8(invocation)
-            3228:   2802(ptr) AccessChain 34(data) 57 2794
-            3229: 28(i64vec4) Load 3228
-            3230:2811(i64vec3) VectorShuffle 3229 3229 0 1 2
-            3231:2811(i64vec3) GroupNonUniformUMin 42 ExclusiveScan 3230
-            3232:   2802(ptr) AccessChain 34(data) 3227 2794
-            3233: 28(i64vec4) Load 3232
-            3234: 28(i64vec4) VectorShuffle 3233 3231 4 5 6 3
-                              Store 3232 3234
-            3235:      6(int) Load 8(invocation)
-            3236:   2802(ptr) AccessChain 34(data) 67 2794
-            3237: 28(i64vec4) Load 3236
-            3238: 28(i64vec4) GroupNonUniformUMin 42 ExclusiveScan 3237
-            3239:   2802(ptr) AccessChain 34(data) 3235 2794
-                              Store 3239 3238
-            3240:      6(int) Load 8(invocation)
-            3241:   2795(ptr) AccessChain 34(data) 37 2794 38
-            3242: 27(int64_t) Load 3241
-            3243: 27(int64_t) GroupNonUniformUMax 42 ExclusiveScan 3242
-            3244:   2795(ptr) AccessChain 34(data) 3240 2794 38
-                              Store 3244 3243
+            3080:   2589(ptr) AccessChain 34(data) 59 2581
+            3081: 26(i64vec4) Load 3080
+            3082:2599(i64vec3) VectorShuffle 3081 3081 0 1 2
+            3083:2599(i64vec3) GroupNonUniformSMin 42 ExclusiveScan 3082
+            3084:   2582(ptr) AccessChain 34(data) 3079 2581 38
+            3085: 25(int64_t) CompositeExtract 3083 0
+                              Store 3084 3085
+            3086:   2582(ptr) AccessChain 34(data) 3079 2581 55
+            3087: 25(int64_t) CompositeExtract 3083 1
+                              Store 3086 3087
+            3088:   2582(ptr) AccessChain 34(data) 3079 2581 69
+            3089: 25(int64_t) CompositeExtract 3083 2
+                              Store 3088 3089
+            3090:      6(int) Load 8(invocation)
+            3091:   2589(ptr) AccessChain 34(data) 73 2581
+            3092: 26(i64vec4) Load 3091
+            3093: 26(i64vec4) GroupNonUniformSMin 42 ExclusiveScan 3092
+            3094:   2589(ptr) AccessChain 34(data) 3090 2581
+                              Store 3094 3093
+            3095:      6(int) Load 8(invocation)
+            3096:   2582(ptr) AccessChain 34(data) 37 2581 38
+            3097: 25(int64_t) Load 3096
+            3098: 25(int64_t) GroupNonUniformSMax 42 ExclusiveScan 3097
+            3099:   2582(ptr) AccessChain 34(data) 3095 2581 38
+                              Store 3099 3098
+            3100:      6(int) Load 8(invocation)
+            3101:   2589(ptr) AccessChain 34(data) 46 2581
+            3102: 26(i64vec4) Load 3101
+            3103:2588(i64vec2) VectorShuffle 3102 3102 0 1
+            3104:2588(i64vec2) GroupNonUniformSMax 42 ExclusiveScan 3103
+            3105:   2582(ptr) AccessChain 34(data) 3100 2581 38
+            3106: 25(int64_t) CompositeExtract 3104 0
+                              Store 3105 3106
+            3107:   2582(ptr) AccessChain 34(data) 3100 2581 55
+            3108: 25(int64_t) CompositeExtract 3104 1
+                              Store 3107 3108
+            3109:      6(int) Load 8(invocation)
+            3110:   2589(ptr) AccessChain 34(data) 59 2581
+            3111: 26(i64vec4) Load 3110
+            3112:2599(i64vec3) VectorShuffle 3111 3111 0 1 2
+            3113:2599(i64vec3) GroupNonUniformSMax 42 ExclusiveScan 3112
+            3114:   2582(ptr) AccessChain 34(data) 3109 2581 38
+            3115: 25(int64_t) CompositeExtract 3113 0
+                              Store 3114 3115
+            3116:   2582(ptr) AccessChain 34(data) 3109 2581 55
+            3117: 25(int64_t) CompositeExtract 3113 1
+                              Store 3116 3117
+            3118:   2582(ptr) AccessChain 34(data) 3109 2581 69
+            3119: 25(int64_t) CompositeExtract 3113 2
+                              Store 3118 3119
+            3120:      6(int) Load 8(invocation)
+            3121:   2589(ptr) AccessChain 34(data) 73 2581
+            3122: 26(i64vec4) Load 3121
+            3123: 26(i64vec4) GroupNonUniformSMax 42 ExclusiveScan 3122
+            3124:   2589(ptr) AccessChain 34(data) 3120 2581
+                              Store 3124 3123
+            3125:      6(int) Load 8(invocation)
+            3126:   2582(ptr) AccessChain 34(data) 37 2581 38
+            3127: 25(int64_t) Load 3126
+            3128: 25(int64_t) GroupNonUniformBitwiseAnd 42 ExclusiveScan 3127
+            3129:   2582(ptr) AccessChain 34(data) 3125 2581 38
+                              Store 3129 3128
+            3130:      6(int) Load 8(invocation)
+            3131:   2589(ptr) AccessChain 34(data) 46 2581
+            3132: 26(i64vec4) Load 3131
+            3133:2588(i64vec2) VectorShuffle 3132 3132 0 1
+            3134:2588(i64vec2) GroupNonUniformBitwiseAnd 42 ExclusiveScan 3133
+            3135:   2582(ptr) AccessChain 34(data) 3130 2581 38
+            3136: 25(int64_t) CompositeExtract 3134 0
+                              Store 3135 3136
+            3137:   2582(ptr) AccessChain 34(data) 3130 2581 55
+            3138: 25(int64_t) CompositeExtract 3134 1
+                              Store 3137 3138
+            3139:      6(int) Load 8(invocation)
+            3140:   2589(ptr) AccessChain 34(data) 59 2581
+            3141: 26(i64vec4) Load 3140
+            3142:2599(i64vec3) VectorShuffle 3141 3141 0 1 2
+            3143:2599(i64vec3) GroupNonUniformBitwiseAnd 42 ExclusiveScan 3142
+            3144:   2582(ptr) AccessChain 34(data) 3139 2581 38
+            3145: 25(int64_t) CompositeExtract 3143 0
+                              Store 3144 3145
+            3146:   2582(ptr) AccessChain 34(data) 3139 2581 55
+            3147: 25(int64_t) CompositeExtract 3143 1
+                              Store 3146 3147
+            3148:   2582(ptr) AccessChain 34(data) 3139 2581 69
+            3149: 25(int64_t) CompositeExtract 3143 2
+                              Store 3148 3149
+            3150:      6(int) Load 8(invocation)
+            3151:   2589(ptr) AccessChain 34(data) 73 2581
+            3152: 26(i64vec4) Load 3151
+            3153: 26(i64vec4) GroupNonUniformBitwiseAnd 42 ExclusiveScan 3152
+            3154:   2589(ptr) AccessChain 34(data) 3150 2581
+                              Store 3154 3153
+            3155:      6(int) Load 8(invocation)
+            3156:   2582(ptr) AccessChain 34(data) 37 2581 38
+            3157: 25(int64_t) Load 3156
+            3158: 25(int64_t) GroupNonUniformBitwiseOr 42 ExclusiveScan 3157
+            3159:   2582(ptr) AccessChain 34(data) 3155 2581 38
+                              Store 3159 3158
+            3160:      6(int) Load 8(invocation)
+            3161:   2589(ptr) AccessChain 34(data) 46 2581
+            3162: 26(i64vec4) Load 3161
+            3163:2588(i64vec2) VectorShuffle 3162 3162 0 1
+            3164:2588(i64vec2) GroupNonUniformBitwiseOr 42 ExclusiveScan 3163
+            3165:   2582(ptr) AccessChain 34(data) 3160 2581 38
+            3166: 25(int64_t) CompositeExtract 3164 0
+                              Store 3165 3166
+            3167:   2582(ptr) AccessChain 34(data) 3160 2581 55
+            3168: 25(int64_t) CompositeExtract 3164 1
+                              Store 3167 3168
+            3169:      6(int) Load 8(invocation)
+            3170:   2589(ptr) AccessChain 34(data) 59 2581
+            3171: 26(i64vec4) Load 3170
+            3172:2599(i64vec3) VectorShuffle 3171 3171 0 1 2
+            3173:2599(i64vec3) GroupNonUniformBitwiseOr 42 ExclusiveScan 3172
+            3174:   2582(ptr) AccessChain 34(data) 3169 2581 38
+            3175: 25(int64_t) CompositeExtract 3173 0
+                              Store 3174 3175
+            3176:   2582(ptr) AccessChain 34(data) 3169 2581 55
+            3177: 25(int64_t) CompositeExtract 3173 1
+                              Store 3176 3177
+            3178:   2582(ptr) AccessChain 34(data) 3169 2581 69
+            3179: 25(int64_t) CompositeExtract 3173 2
+                              Store 3178 3179
+            3180:      6(int) Load 8(invocation)
+            3181:   2589(ptr) AccessChain 34(data) 73 2581
+            3182: 26(i64vec4) Load 3181
+            3183: 26(i64vec4) GroupNonUniformBitwiseOr 42 ExclusiveScan 3182
+            3184:   2589(ptr) AccessChain 34(data) 3180 2581
+                              Store 3184 3183
+            3185:      6(int) Load 8(invocation)
+            3186:   2582(ptr) AccessChain 34(data) 37 2581 38
+            3187: 25(int64_t) Load 3186
+            3188: 25(int64_t) GroupNonUniformBitwiseXor 42 ExclusiveScan 3187
+            3189:   2582(ptr) AccessChain 34(data) 3185 2581 38
+                              Store 3189 3188
+            3190:      6(int) Load 8(invocation)
+            3191:   2589(ptr) AccessChain 34(data) 46 2581
+            3192: 26(i64vec4) Load 3191
+            3193:2588(i64vec2) VectorShuffle 3192 3192 0 1
+            3194:2588(i64vec2) GroupNonUniformBitwiseXor 42 ExclusiveScan 3193
+            3195:   2582(ptr) AccessChain 34(data) 3190 2581 38
+            3196: 25(int64_t) CompositeExtract 3194 0
+                              Store 3195 3196
+            3197:   2582(ptr) AccessChain 34(data) 3190 2581 55
+            3198: 25(int64_t) CompositeExtract 3194 1
+                              Store 3197 3198
+            3199:      6(int) Load 8(invocation)
+            3200:   2589(ptr) AccessChain 34(data) 59 2581
+            3201: 26(i64vec4) Load 3200
+            3202:2599(i64vec3) VectorShuffle 3201 3201 0 1 2
+            3203:2599(i64vec3) GroupNonUniformBitwiseXor 42 ExclusiveScan 3202
+            3204:   2582(ptr) AccessChain 34(data) 3199 2581 38
+            3205: 25(int64_t) CompositeExtract 3203 0
+                              Store 3204 3205
+            3206:   2582(ptr) AccessChain 34(data) 3199 2581 55
+            3207: 25(int64_t) CompositeExtract 3203 1
+                              Store 3206 3207
+            3208:   2582(ptr) AccessChain 34(data) 3199 2581 69
+            3209: 25(int64_t) CompositeExtract 3203 2
+                              Store 3208 3209
+            3210:      6(int) Load 8(invocation)
+            3211:   2589(ptr) AccessChain 34(data) 73 2581
+            3212: 26(i64vec4) Load 3211
+            3213: 26(i64vec4) GroupNonUniformBitwiseXor 42 ExclusiveScan 3212
+            3214:   2589(ptr) AccessChain 34(data) 3210 2581
+                              Store 3214 3213
+            3215:      6(int) Load 8(invocation)
+            3218:   3217(ptr) AccessChain 34(data) 37 3216 38
+            3219: 27(int64_t) Load 3218
+            3220: 27(int64_t) GroupNonUniformIAdd 42 Reduce 3219
+            3221:   3217(ptr) AccessChain 34(data) 3215 3216 38
+                              Store 3221 3220
+            3222:      6(int) Load 8(invocation)
+            3225:   3224(ptr) AccessChain 34(data) 46 3216
+            3226: 28(i64vec4) Load 3225
+            3227:3223(i64vec2) VectorShuffle 3226 3226 0 1
+            3228:3223(i64vec2) GroupNonUniformIAdd 42 Reduce 3227
+            3229:   3217(ptr) AccessChain 34(data) 3222 3216 38
+            3230: 27(int64_t) CompositeExtract 3228 0
+                              Store 3229 3230
+            3231:   3217(ptr) AccessChain 34(data) 3222 3216 55
+            3232: 27(int64_t) CompositeExtract 3228 1
+                              Store 3231 3232
+            3233:      6(int) Load 8(invocation)
+            3235:   3224(ptr) AccessChain 34(data) 59 3216
+            3236: 28(i64vec4) Load 3235
+            3237:3234(i64vec3) VectorShuffle 3236 3236 0 1 2
+            3238:3234(i64vec3) GroupNonUniformIAdd 42 Reduce 3237
+            3239:   3217(ptr) AccessChain 34(data) 3233 3216 38
+            3240: 27(int64_t) CompositeExtract 3238 0
+                              Store 3239 3240
+            3241:   3217(ptr) AccessChain 34(data) 3233 3216 55
+            3242: 27(int64_t) CompositeExtract 3238 1
+                              Store 3241 3242
+            3243:   3217(ptr) AccessChain 34(data) 3233 3216 69
+            3244: 27(int64_t) CompositeExtract 3238 2
+                              Store 3243 3244
             3245:      6(int) Load 8(invocation)
-            3246:   2802(ptr) AccessChain 34(data) 46 2794
+            3246:   3224(ptr) AccessChain 34(data) 73 3216
             3247: 28(i64vec4) Load 3246
-            3248:2801(i64vec2) VectorShuffle 3247 3247 0 1
-            3249:2801(i64vec2) GroupNonUniformUMax 42 ExclusiveScan 3248
-            3250:   2802(ptr) AccessChain 34(data) 3245 2794
-            3251: 28(i64vec4) Load 3250
-            3252: 28(i64vec4) VectorShuffle 3251 3249 4 5 2 3
-                              Store 3250 3252
-            3253:      6(int) Load 8(invocation)
-            3254:   2802(ptr) AccessChain 34(data) 57 2794
-            3255: 28(i64vec4) Load 3254
-            3256:2811(i64vec3) VectorShuffle 3255 3255 0 1 2
-            3257:2811(i64vec3) GroupNonUniformUMax 42 ExclusiveScan 3256
-            3258:   2802(ptr) AccessChain 34(data) 3253 2794
-            3259: 28(i64vec4) Load 3258
-            3260: 28(i64vec4) VectorShuffle 3259 3257 4 5 6 3
-                              Store 3258 3260
-            3261:      6(int) Load 8(invocation)
-            3262:   2802(ptr) AccessChain 34(data) 67 2794
-            3263: 28(i64vec4) Load 3262
-            3264: 28(i64vec4) GroupNonUniformUMax 42 ExclusiveScan 3263
-            3265:   2802(ptr) AccessChain 34(data) 3261 2794
-                              Store 3265 3264
-            3266:      6(int) Load 8(invocation)
-            3267:   2795(ptr) AccessChain 34(data) 37 2794 38
-            3268: 27(int64_t) Load 3267
-            3269: 27(int64_t) GroupNonUniformBitwiseAnd 42 ExclusiveScan 3268
-            3270:   2795(ptr) AccessChain 34(data) 3266 2794 38
-                              Store 3270 3269
-            3271:      6(int) Load 8(invocation)
-            3272:   2802(ptr) AccessChain 34(data) 46 2794
-            3273: 28(i64vec4) Load 3272
-            3274:2801(i64vec2) VectorShuffle 3273 3273 0 1
-            3275:2801(i64vec2) GroupNonUniformBitwiseAnd 42 ExclusiveScan 3274
-            3276:   2802(ptr) AccessChain 34(data) 3271 2794
+            3248: 28(i64vec4) GroupNonUniformIAdd 42 Reduce 3247
+            3249:   3224(ptr) AccessChain 34(data) 3245 3216
+                              Store 3249 3248
+            3250:      6(int) Load 8(invocation)
+            3251:   3217(ptr) AccessChain 34(data) 37 3216 38
+            3252: 27(int64_t) Load 3251
+            3253: 27(int64_t) GroupNonUniformIMul 42 Reduce 3252
+            3254:   3217(ptr) AccessChain 34(data) 3250 3216 38
+                              Store 3254 3253
+            3255:      6(int) Load 8(invocation)
+            3256:   3224(ptr) AccessChain 34(data) 46 3216
+            3257: 28(i64vec4) Load 3256
+            3258:3223(i64vec2) VectorShuffle 3257 3257 0 1
+            3259:3223(i64vec2) GroupNonUniformIMul 42 Reduce 3258
+            3260:   3217(ptr) AccessChain 34(data) 3255 3216 38
+            3261: 27(int64_t) CompositeExtract 3259 0
+                              Store 3260 3261
+            3262:   3217(ptr) AccessChain 34(data) 3255 3216 55
+            3263: 27(int64_t) CompositeExtract 3259 1
+                              Store 3262 3263
+            3264:      6(int) Load 8(invocation)
+            3265:   3224(ptr) AccessChain 34(data) 59 3216
+            3266: 28(i64vec4) Load 3265
+            3267:3234(i64vec3) VectorShuffle 3266 3266 0 1 2
+            3268:3234(i64vec3) GroupNonUniformIMul 42 Reduce 3267
+            3269:   3217(ptr) AccessChain 34(data) 3264 3216 38
+            3270: 27(int64_t) CompositeExtract 3268 0
+                              Store 3269 3270
+            3271:   3217(ptr) AccessChain 34(data) 3264 3216 55
+            3272: 27(int64_t) CompositeExtract 3268 1
+                              Store 3271 3272
+            3273:   3217(ptr) AccessChain 34(data) 3264 3216 69
+            3274: 27(int64_t) CompositeExtract 3268 2
+                              Store 3273 3274
+            3275:      6(int) Load 8(invocation)
+            3276:   3224(ptr) AccessChain 34(data) 73 3216
             3277: 28(i64vec4) Load 3276
-            3278: 28(i64vec4) VectorShuffle 3277 3275 4 5 2 3
-                              Store 3276 3278
-            3279:      6(int) Load 8(invocation)
-            3280:   2802(ptr) AccessChain 34(data) 57 2794
-            3281: 28(i64vec4) Load 3280
-            3282:2811(i64vec3) VectorShuffle 3281 3281 0 1 2
-            3283:2811(i64vec3) GroupNonUniformBitwiseAnd 42 ExclusiveScan 3282
-            3284:   2802(ptr) AccessChain 34(data) 3279 2794
-            3285: 28(i64vec4) Load 3284
-            3286: 28(i64vec4) VectorShuffle 3285 3283 4 5 6 3
-                              Store 3284 3286
-            3287:      6(int) Load 8(invocation)
-            3288:   2802(ptr) AccessChain 34(data) 67 2794
-            3289: 28(i64vec4) Load 3288
-            3290: 28(i64vec4) GroupNonUniformBitwiseAnd 42 ExclusiveScan 3289
-            3291:   2802(ptr) AccessChain 34(data) 3287 2794
-                              Store 3291 3290
-            3292:      6(int) Load 8(invocation)
-            3293:   2795(ptr) AccessChain 34(data) 37 2794 38
-            3294: 27(int64_t) Load 3293
-            3295: 27(int64_t) GroupNonUniformBitwiseOr 42 ExclusiveScan 3294
-            3296:   2795(ptr) AccessChain 34(data) 3292 2794 38
-                              Store 3296 3295
-            3297:      6(int) Load 8(invocation)
-            3298:   2802(ptr) AccessChain 34(data) 46 2794
-            3299: 28(i64vec4) Load 3298
-            3300:2801(i64vec2) VectorShuffle 3299 3299 0 1
-            3301:2801(i64vec2) GroupNonUniformBitwiseOr 42 ExclusiveScan 3300
-            3302:   2802(ptr) AccessChain 34(data) 3297 2794
-            3303: 28(i64vec4) Load 3302
-            3304: 28(i64vec4) VectorShuffle 3303 3301 4 5 2 3
-                              Store 3302 3304
+            3278: 28(i64vec4) GroupNonUniformIMul 42 Reduce 3277
+            3279:   3224(ptr) AccessChain 34(data) 3275 3216
+                              Store 3279 3278
+            3280:      6(int) Load 8(invocation)
+            3281:   3217(ptr) AccessChain 34(data) 37 3216 38
+            3282: 27(int64_t) Load 3281
+            3283: 27(int64_t) GroupNonUniformUMin 42 Reduce 3282
+            3284:   3217(ptr) AccessChain 34(data) 3280 3216 38
+                              Store 3284 3283
+            3285:      6(int) Load 8(invocation)
+            3286:   3224(ptr) AccessChain 34(data) 46 3216
+            3287: 28(i64vec4) Load 3286
+            3288:3223(i64vec2) VectorShuffle 3287 3287 0 1
+            3289:3223(i64vec2) GroupNonUniformUMin 42 Reduce 3288
+            3290:   3217(ptr) AccessChain 34(data) 3285 3216 38
+            3291: 27(int64_t) CompositeExtract 3289 0
+                              Store 3290 3291
+            3292:   3217(ptr) AccessChain 34(data) 3285 3216 55
+            3293: 27(int64_t) CompositeExtract 3289 1
+                              Store 3292 3293
+            3294:      6(int) Load 8(invocation)
+            3295:   3224(ptr) AccessChain 34(data) 59 3216
+            3296: 28(i64vec4) Load 3295
+            3297:3234(i64vec3) VectorShuffle 3296 3296 0 1 2
+            3298:3234(i64vec3) GroupNonUniformUMin 42 Reduce 3297
+            3299:   3217(ptr) AccessChain 34(data) 3294 3216 38
+            3300: 27(int64_t) CompositeExtract 3298 0
+                              Store 3299 3300
+            3301:   3217(ptr) AccessChain 34(data) 3294 3216 55
+            3302: 27(int64_t) CompositeExtract 3298 1
+                              Store 3301 3302
+            3303:   3217(ptr) AccessChain 34(data) 3294 3216 69
+            3304: 27(int64_t) CompositeExtract 3298 2
+                              Store 3303 3304
             3305:      6(int) Load 8(invocation)
-            3306:   2802(ptr) AccessChain 34(data) 57 2794
+            3306:   3224(ptr) AccessChain 34(data) 73 3216
             3307: 28(i64vec4) Load 3306
-            3308:2811(i64vec3) VectorShuffle 3307 3307 0 1 2
-            3309:2811(i64vec3) GroupNonUniformBitwiseOr 42 ExclusiveScan 3308
-            3310:   2802(ptr) AccessChain 34(data) 3305 2794
-            3311: 28(i64vec4) Load 3310
-            3312: 28(i64vec4) VectorShuffle 3311 3309 4 5 6 3
-                              Store 3310 3312
-            3313:      6(int) Load 8(invocation)
-            3314:   2802(ptr) AccessChain 34(data) 67 2794
-            3315: 28(i64vec4) Load 3314
-            3316: 28(i64vec4) GroupNonUniformBitwiseOr 42 ExclusiveScan 3315
-            3317:   2802(ptr) AccessChain 34(data) 3313 2794
-                              Store 3317 3316
-            3318:      6(int) Load 8(invocation)
-            3319:   2795(ptr) AccessChain 34(data) 37 2794 38
-            3320: 27(int64_t) Load 3319
-            3321: 27(int64_t) GroupNonUniformBitwiseXor 42 ExclusiveScan 3320
-            3322:   2795(ptr) AccessChain 34(data) 3318 2794 38
-                              Store 3322 3321
-            3323:      6(int) Load 8(invocation)
-            3324:   2802(ptr) AccessChain 34(data) 46 2794
-            3325: 28(i64vec4) Load 3324
-            3326:2801(i64vec2) VectorShuffle 3325 3325 0 1
-            3327:2801(i64vec2) GroupNonUniformBitwiseXor 42 ExclusiveScan 3326
-            3328:   2802(ptr) AccessChain 34(data) 3323 2794
-            3329: 28(i64vec4) Load 3328
-            3330: 28(i64vec4) VectorShuffle 3329 3327 4 5 2 3
-                              Store 3328 3330
-            3331:      6(int) Load 8(invocation)
-            3332:   2802(ptr) AccessChain 34(data) 57 2794
-            3333: 28(i64vec4) Load 3332
-            3334:2811(i64vec3) VectorShuffle 3333 3333 0 1 2
-            3335:2811(i64vec3) GroupNonUniformBitwiseXor 42 ExclusiveScan 3334
-            3336:   2802(ptr) AccessChain 34(data) 3331 2794
+            3308: 28(i64vec4) GroupNonUniformUMin 42 Reduce 3307
+            3309:   3224(ptr) AccessChain 34(data) 3305 3216
+                              Store 3309 3308
+            3310:      6(int) Load 8(invocation)
+            3311:   3217(ptr) AccessChain 34(data) 37 3216 38
+            3312: 27(int64_t) Load 3311
+            3313: 27(int64_t) GroupNonUniformUMax 42 Reduce 3312
+            3314:   3217(ptr) AccessChain 34(data) 3310 3216 38
+                              Store 3314 3313
+            3315:      6(int) Load 8(invocation)
+            3316:   3224(ptr) AccessChain 34(data) 46 3216
+            3317: 28(i64vec4) Load 3316
+            3318:3223(i64vec2) VectorShuffle 3317 3317 0 1
+            3319:3223(i64vec2) GroupNonUniformUMax 42 Reduce 3318
+            3320:   3217(ptr) AccessChain 34(data) 3315 3216 38
+            3321: 27(int64_t) CompositeExtract 3319 0
+                              Store 3320 3321
+            3322:   3217(ptr) AccessChain 34(data) 3315 3216 55
+            3323: 27(int64_t) CompositeExtract 3319 1
+                              Store 3322 3323
+            3324:      6(int) Load 8(invocation)
+            3325:   3224(ptr) AccessChain 34(data) 59 3216
+            3326: 28(i64vec4) Load 3325
+            3327:3234(i64vec3) VectorShuffle 3326 3326 0 1 2
+            3328:3234(i64vec3) GroupNonUniformUMax 42 Reduce 3327
+            3329:   3217(ptr) AccessChain 34(data) 3324 3216 38
+            3330: 27(int64_t) CompositeExtract 3328 0
+                              Store 3329 3330
+            3331:   3217(ptr) AccessChain 34(data) 3324 3216 55
+            3332: 27(int64_t) CompositeExtract 3328 1
+                              Store 3331 3332
+            3333:   3217(ptr) AccessChain 34(data) 3324 3216 69
+            3334: 27(int64_t) CompositeExtract 3328 2
+                              Store 3333 3334
+            3335:      6(int) Load 8(invocation)
+            3336:   3224(ptr) AccessChain 34(data) 73 3216
             3337: 28(i64vec4) Load 3336
-            3338: 28(i64vec4) VectorShuffle 3337 3335 4 5 6 3
-                              Store 3336 3338
-            3339:      6(int) Load 8(invocation)
-            3340:   2802(ptr) AccessChain 34(data) 67 2794
-            3341: 28(i64vec4) Load 3340
-            3342: 28(i64vec4) GroupNonUniformBitwiseXor 42 ExclusiveScan 3341
-            3343:   2802(ptr) AccessChain 34(data) 3339 2794
-                              Store 3343 3342
-            3344:      6(int) Load 8(invocation)
-            3347:   3346(ptr) AccessChain 34(data) 37 3345 38
-            3348:29(float16_t) Load 3347
-            3349:29(float16_t) GroupNonUniformFAdd 42 Reduce 3348
-            3350:   3346(ptr) AccessChain 34(data) 3344 3345 38
-                              Store 3350 3349
-            3351:      6(int) Load 8(invocation)
-            3354:   3353(ptr) AccessChain 34(data) 46 3345
-            3355: 30(f16vec4) Load 3354
-            3356:3352(f16vec2) VectorShuffle 3355 3355 0 1
-            3357:3352(f16vec2) GroupNonUniformFAdd 42 Reduce 3356
-            3358:   3353(ptr) AccessChain 34(data) 3351 3345
-            3359: 30(f16vec4) Load 3358
-            3360: 30(f16vec4) VectorShuffle 3359 3357 4 5 2 3
-                              Store 3358 3360
-            3361:      6(int) Load 8(invocation)
-            3363:   3353(ptr) AccessChain 34(data) 57 3345
-            3364: 30(f16vec4) Load 3363
-            3365:3362(f16vec3) VectorShuffle 3364 3364 0 1 2
-            3366:3362(f16vec3) GroupNonUniformFAdd 42 Reduce 3365
-            3367:   3353(ptr) AccessChain 34(data) 3361 3345
-            3368: 30(f16vec4) Load 3367
-            3369: 30(f16vec4) VectorShuffle 3368 3366 4 5 6 3
-                              Store 3367 3369
+            3338: 28(i64vec4) GroupNonUniformUMax 42 Reduce 3337
+            3339:   3224(ptr) AccessChain 34(data) 3335 3216
+                              Store 3339 3338
+            3340:      6(int) Load 8(invocation)
+            3341:   3217(ptr) AccessChain 34(data) 37 3216 38
+            3342: 27(int64_t) Load 3341
+            3343: 27(int64_t) GroupNonUniformBitwiseAnd 42 Reduce 3342
+            3344:   3217(ptr) AccessChain 34(data) 3340 3216 38
+                              Store 3344 3343
+            3345:      6(int) Load 8(invocation)
+            3346:   3224(ptr) AccessChain 34(data) 46 3216
+            3347: 28(i64vec4) Load 3346
+            3348:3223(i64vec2) VectorShuffle 3347 3347 0 1
+            3349:3223(i64vec2) GroupNonUniformBitwiseAnd 42 Reduce 3348
+            3350:   3217(ptr) AccessChain 34(data) 3345 3216 38
+            3351: 27(int64_t) CompositeExtract 3349 0
+                              Store 3350 3351
+            3352:   3217(ptr) AccessChain 34(data) 3345 3216 55
+            3353: 27(int64_t) CompositeExtract 3349 1
+                              Store 3352 3353
+            3354:      6(int) Load 8(invocation)
+            3355:   3224(ptr) AccessChain 34(data) 59 3216
+            3356: 28(i64vec4) Load 3355
+            3357:3234(i64vec3) VectorShuffle 3356 3356 0 1 2
+            3358:3234(i64vec3) GroupNonUniformBitwiseAnd 42 Reduce 3357
+            3359:   3217(ptr) AccessChain 34(data) 3354 3216 38
+            3360: 27(int64_t) CompositeExtract 3358 0
+                              Store 3359 3360
+            3361:   3217(ptr) AccessChain 34(data) 3354 3216 55
+            3362: 27(int64_t) CompositeExtract 3358 1
+                              Store 3361 3362
+            3363:   3217(ptr) AccessChain 34(data) 3354 3216 69
+            3364: 27(int64_t) CompositeExtract 3358 2
+                              Store 3363 3364
+            3365:      6(int) Load 8(invocation)
+            3366:   3224(ptr) AccessChain 34(data) 73 3216
+            3367: 28(i64vec4) Load 3366
+            3368: 28(i64vec4) GroupNonUniformBitwiseAnd 42 Reduce 3367
+            3369:   3224(ptr) AccessChain 34(data) 3365 3216
+                              Store 3369 3368
             3370:      6(int) Load 8(invocation)
-            3371:   3353(ptr) AccessChain 34(data) 67 3345
-            3372: 30(f16vec4) Load 3371
-            3373: 30(f16vec4) GroupNonUniformFAdd 42 Reduce 3372
-            3374:   3353(ptr) AccessChain 34(data) 3370 3345
+            3371:   3217(ptr) AccessChain 34(data) 37 3216 38
+            3372: 27(int64_t) Load 3371
+            3373: 27(int64_t) GroupNonUniformBitwiseOr 42 Reduce 3372
+            3374:   3217(ptr) AccessChain 34(data) 3370 3216 38
                               Store 3374 3373
             3375:      6(int) Load 8(invocation)
-            3376:   3346(ptr) AccessChain 34(data) 37 3345 38
-            3377:29(float16_t) Load 3376
-            3378:29(float16_t) GroupNonUniformFMul 42 Reduce 3377
-            3379:   3346(ptr) AccessChain 34(data) 3375 3345 38
-                              Store 3379 3378
-            3380:      6(int) Load 8(invocation)
-            3381:   3353(ptr) AccessChain 34(data) 46 3345
-            3382: 30(f16vec4) Load 3381
-            3383:3352(f16vec2) VectorShuffle 3382 3382 0 1
-            3384:3352(f16vec2) GroupNonUniformFMul 42 Reduce 3383
-            3385:   3353(ptr) AccessChain 34(data) 3380 3345
-            3386: 30(f16vec4) Load 3385
-            3387: 30(f16vec4) VectorShuffle 3386 3384 4 5 2 3
-                              Store 3385 3387
-            3388:      6(int) Load 8(invocation)
-            3389:   3353(ptr) AccessChain 34(data) 57 3345
-            3390: 30(f16vec4) Load 3389
-            3391:3362(f16vec3) VectorShuffle 3390 3390 0 1 2
-            3392:3362(f16vec3) GroupNonUniformFMul 42 Reduce 3391
-            3393:   3353(ptr) AccessChain 34(data) 3388 3345
-            3394: 30(f16vec4) Load 3393
-            3395: 30(f16vec4) VectorShuffle 3394 3392 4 5 6 3
-                              Store 3393 3395
-            3396:      6(int) Load 8(invocation)
-            3397:   3353(ptr) AccessChain 34(data) 67 3345
-            3398: 30(f16vec4) Load 3397
-            3399: 30(f16vec4) GroupNonUniformFMul 42 Reduce 3398
-            3400:   3353(ptr) AccessChain 34(data) 3396 3345
-                              Store 3400 3399
-            3401:      6(int) Load 8(invocation)
-            3402:   3346(ptr) AccessChain 34(data) 37 3345 38
-            3403:29(float16_t) Load 3402
-            3404:29(float16_t) GroupNonUniformFMin 42 Reduce 3403
-            3405:   3346(ptr) AccessChain 34(data) 3401 3345 38
-                              Store 3405 3404
-            3406:      6(int) Load 8(invocation)
-            3407:   3353(ptr) AccessChain 34(data) 46 3345
-            3408: 30(f16vec4) Load 3407
-            3409:3352(f16vec2) VectorShuffle 3408 3408 0 1
-            3410:3352(f16vec2) GroupNonUniformFMin 42 Reduce 3409
-            3411:   3353(ptr) AccessChain 34(data) 3406 3345
-            3412: 30(f16vec4) Load 3411
-            3413: 30(f16vec4) VectorShuffle 3412 3410 4 5 2 3
-                              Store 3411 3413
+            3376:   3224(ptr) AccessChain 34(data) 46 3216
+            3377: 28(i64vec4) Load 3376
+            3378:3223(i64vec2) VectorShuffle 3377 3377 0 1
+            3379:3223(i64vec2) GroupNonUniformBitwiseOr 42 Reduce 3378
+            3380:   3217(ptr) AccessChain 34(data) 3375 3216 38
+            3381: 27(int64_t) CompositeExtract 3379 0
+                              Store 3380 3381
+            3382:   3217(ptr) AccessChain 34(data) 3375 3216 55
+            3383: 27(int64_t) CompositeExtract 3379 1
+                              Store 3382 3383
+            3384:      6(int) Load 8(invocation)
+            3385:   3224(ptr) AccessChain 34(data) 59 3216
+            3386: 28(i64vec4) Load 3385
+            3387:3234(i64vec3) VectorShuffle 3386 3386 0 1 2
+            3388:3234(i64vec3) GroupNonUniformBitwiseOr 42 Reduce 3387
+            3389:   3217(ptr) AccessChain 34(data) 3384 3216 38
+            3390: 27(int64_t) CompositeExtract 3388 0
+                              Store 3389 3390
+            3391:   3217(ptr) AccessChain 34(data) 3384 3216 55
+            3392: 27(int64_t) CompositeExtract 3388 1
+                              Store 3391 3392
+            3393:   3217(ptr) AccessChain 34(data) 3384 3216 69
+            3394: 27(int64_t) CompositeExtract 3388 2
+                              Store 3393 3394
+            3395:      6(int) Load 8(invocation)
+            3396:   3224(ptr) AccessChain 34(data) 73 3216
+            3397: 28(i64vec4) Load 3396
+            3398: 28(i64vec4) GroupNonUniformBitwiseOr 42 Reduce 3397
+            3399:   3224(ptr) AccessChain 34(data) 3395 3216
+                              Store 3399 3398
+            3400:      6(int) Load 8(invocation)
+            3401:   3217(ptr) AccessChain 34(data) 37 3216 38
+            3402: 27(int64_t) Load 3401
+            3403: 27(int64_t) GroupNonUniformBitwiseXor 42 Reduce 3402
+            3404:   3217(ptr) AccessChain 34(data) 3400 3216 38
+                              Store 3404 3403
+            3405:      6(int) Load 8(invocation)
+            3406:   3224(ptr) AccessChain 34(data) 46 3216
+            3407: 28(i64vec4) Load 3406
+            3408:3223(i64vec2) VectorShuffle 3407 3407 0 1
+            3409:3223(i64vec2) GroupNonUniformBitwiseXor 42 Reduce 3408
+            3410:   3217(ptr) AccessChain 34(data) 3405 3216 38
+            3411: 27(int64_t) CompositeExtract 3409 0
+                              Store 3410 3411
+            3412:   3217(ptr) AccessChain 34(data) 3405 3216 55
+            3413: 27(int64_t) CompositeExtract 3409 1
+                              Store 3412 3413
             3414:      6(int) Load 8(invocation)
-            3415:   3353(ptr) AccessChain 34(data) 57 3345
-            3416: 30(f16vec4) Load 3415
-            3417:3362(f16vec3) VectorShuffle 3416 3416 0 1 2
-            3418:3362(f16vec3) GroupNonUniformFMin 42 Reduce 3417
-            3419:   3353(ptr) AccessChain 34(data) 3414 3345
-            3420: 30(f16vec4) Load 3419
-            3421: 30(f16vec4) VectorShuffle 3420 3418 4 5 6 3
-                              Store 3419 3421
-            3422:      6(int) Load 8(invocation)
-            3423:   3353(ptr) AccessChain 34(data) 67 3345
-            3424: 30(f16vec4) Load 3423
-            3425: 30(f16vec4) GroupNonUniformFMin 42 Reduce 3424
-            3426:   3353(ptr) AccessChain 34(data) 3422 3345
-                              Store 3426 3425
-            3427:      6(int) Load 8(invocation)
-            3428:   3346(ptr) AccessChain 34(data) 37 3345 38
-            3429:29(float16_t) Load 3428
-            3430:29(float16_t) GroupNonUniformFMax 42 Reduce 3429
-            3431:   3346(ptr) AccessChain 34(data) 3427 3345 38
-                              Store 3431 3430
-            3432:      6(int) Load 8(invocation)
-            3433:   3353(ptr) AccessChain 34(data) 46 3345
-            3434: 30(f16vec4) Load 3433
-            3435:3352(f16vec2) VectorShuffle 3434 3434 0 1
-            3436:3352(f16vec2) GroupNonUniformFMax 42 Reduce 3435
-            3437:   3353(ptr) AccessChain 34(data) 3432 3345
-            3438: 30(f16vec4) Load 3437
-            3439: 30(f16vec4) VectorShuffle 3438 3436 4 5 2 3
-                              Store 3437 3439
-            3440:      6(int) Load 8(invocation)
-            3441:   3353(ptr) AccessChain 34(data) 57 3345
-            3442: 30(f16vec4) Load 3441
-            3443:3362(f16vec3) VectorShuffle 3442 3442 0 1 2
-            3444:3362(f16vec3) GroupNonUniformFMax 42 Reduce 3443
-            3445:   3353(ptr) AccessChain 34(data) 3440 3345
-            3446: 30(f16vec4) Load 3445
-            3447: 30(f16vec4) VectorShuffle 3446 3444 4 5 6 3
-                              Store 3445 3447
-            3448:      6(int) Load 8(invocation)
-            3449:   3353(ptr) AccessChain 34(data) 67 3345
-            3450: 30(f16vec4) Load 3449
-            3451: 30(f16vec4) GroupNonUniformFMax 42 Reduce 3450
-            3452:   3353(ptr) AccessChain 34(data) 3448 3345
-                              Store 3452 3451
-            3453:      6(int) Load 8(invocation)
-            3454:   3346(ptr) AccessChain 34(data) 37 3345 38
-            3455:29(float16_t) Load 3454
-            3456:29(float16_t) GroupNonUniformFAdd 42 InclusiveScan 3455
-            3457:   3346(ptr) AccessChain 34(data) 3453 3345 38
-                              Store 3457 3456
-            3458:      6(int) Load 8(invocation)
-            3459:   3353(ptr) AccessChain 34(data) 46 3345
-            3460: 30(f16vec4) Load 3459
-            3461:3352(f16vec2) VectorShuffle 3460 3460 0 1
-            3462:3352(f16vec2) GroupNonUniformFAdd 42 InclusiveScan 3461
-            3463:   3353(ptr) AccessChain 34(data) 3458 3345
-            3464: 30(f16vec4) Load 3463
-            3465: 30(f16vec4) VectorShuffle 3464 3462 4 5 2 3
-                              Store 3463 3465
-            3466:      6(int) Load 8(invocation)
-            3467:   3353(ptr) AccessChain 34(data) 57 3345
-            3468: 30(f16vec4) Load 3467
-            3469:3362(f16vec3) VectorShuffle 3468 3468 0 1 2
-            3470:3362(f16vec3) GroupNonUniformFAdd 42 InclusiveScan 3469
-            3471:   3353(ptr) AccessChain 34(data) 3466 3345
-            3472: 30(f16vec4) Load 3471
-            3473: 30(f16vec4) VectorShuffle 3472 3470 4 5 6 3
-                              Store 3471 3473
+            3415:   3224(ptr) AccessChain 34(data) 59 3216
+            3416: 28(i64vec4) Load 3415
+            3417:3234(i64vec3) VectorShuffle 3416 3416 0 1 2
+            3418:3234(i64vec3) GroupNonUniformBitwiseXor 42 Reduce 3417
+            3419:   3217(ptr) AccessChain 34(data) 3414 3216 38
+            3420: 27(int64_t) CompositeExtract 3418 0
+                              Store 3419 3420
+            3421:   3217(ptr) AccessChain 34(data) 3414 3216 55
+            3422: 27(int64_t) CompositeExtract 3418 1
+                              Store 3421 3422
+            3423:   3217(ptr) AccessChain 34(data) 3414 3216 69
+            3424: 27(int64_t) CompositeExtract 3418 2
+                              Store 3423 3424
+            3425:      6(int) Load 8(invocation)
+            3426:   3224(ptr) AccessChain 34(data) 73 3216
+            3427: 28(i64vec4) Load 3426
+            3428: 28(i64vec4) GroupNonUniformBitwiseXor 42 Reduce 3427
+            3429:   3224(ptr) AccessChain 34(data) 3425 3216
+                              Store 3429 3428
+            3430:      6(int) Load 8(invocation)
+            3431:   3217(ptr) AccessChain 34(data) 37 3216 38
+            3432: 27(int64_t) Load 3431
+            3433: 27(int64_t) GroupNonUniformIAdd 42 InclusiveScan 3432
+            3434:   3217(ptr) AccessChain 34(data) 3430 3216 38
+                              Store 3434 3433
+            3435:      6(int) Load 8(invocation)
+            3436:   3224(ptr) AccessChain 34(data) 46 3216
+            3437: 28(i64vec4) Load 3436
+            3438:3223(i64vec2) VectorShuffle 3437 3437 0 1
+            3439:3223(i64vec2) GroupNonUniformIAdd 42 InclusiveScan 3438
+            3440:   3217(ptr) AccessChain 34(data) 3435 3216 38
+            3441: 27(int64_t) CompositeExtract 3439 0
+                              Store 3440 3441
+            3442:   3217(ptr) AccessChain 34(data) 3435 3216 55
+            3443: 27(int64_t) CompositeExtract 3439 1
+                              Store 3442 3443
+            3444:      6(int) Load 8(invocation)
+            3445:   3224(ptr) AccessChain 34(data) 59 3216
+            3446: 28(i64vec4) Load 3445
+            3447:3234(i64vec3) VectorShuffle 3446 3446 0 1 2
+            3448:3234(i64vec3) GroupNonUniformIAdd 42 InclusiveScan 3447
+            3449:   3217(ptr) AccessChain 34(data) 3444 3216 38
+            3450: 27(int64_t) CompositeExtract 3448 0
+                              Store 3449 3450
+            3451:   3217(ptr) AccessChain 34(data) 3444 3216 55
+            3452: 27(int64_t) CompositeExtract 3448 1
+                              Store 3451 3452
+            3453:   3217(ptr) AccessChain 34(data) 3444 3216 69
+            3454: 27(int64_t) CompositeExtract 3448 2
+                              Store 3453 3454
+            3455:      6(int) Load 8(invocation)
+            3456:   3224(ptr) AccessChain 34(data) 73 3216
+            3457: 28(i64vec4) Load 3456
+            3458: 28(i64vec4) GroupNonUniformIAdd 42 InclusiveScan 3457
+            3459:   3224(ptr) AccessChain 34(data) 3455 3216
+                              Store 3459 3458
+            3460:      6(int) Load 8(invocation)
+            3461:   3217(ptr) AccessChain 34(data) 37 3216 38
+            3462: 27(int64_t) Load 3461
+            3463: 27(int64_t) GroupNonUniformIMul 42 InclusiveScan 3462
+            3464:   3217(ptr) AccessChain 34(data) 3460 3216 38
+                              Store 3464 3463
+            3465:      6(int) Load 8(invocation)
+            3466:   3224(ptr) AccessChain 34(data) 46 3216
+            3467: 28(i64vec4) Load 3466
+            3468:3223(i64vec2) VectorShuffle 3467 3467 0 1
+            3469:3223(i64vec2) GroupNonUniformIMul 42 InclusiveScan 3468
+            3470:   3217(ptr) AccessChain 34(data) 3465 3216 38
+            3471: 27(int64_t) CompositeExtract 3469 0
+                              Store 3470 3471
+            3472:   3217(ptr) AccessChain 34(data) 3465 3216 55
+            3473: 27(int64_t) CompositeExtract 3469 1
+                              Store 3472 3473
             3474:      6(int) Load 8(invocation)
-            3475:   3353(ptr) AccessChain 34(data) 67 3345
-            3476: 30(f16vec4) Load 3475
-            3477: 30(f16vec4) GroupNonUniformFAdd 42 InclusiveScan 3476
-            3478:   3353(ptr) AccessChain 34(data) 3474 3345
-                              Store 3478 3477
-            3479:      6(int) Load 8(invocation)
-            3480:   3346(ptr) AccessChain 34(data) 37 3345 38
-            3481:29(float16_t) Load 3480
-            3482:29(float16_t) GroupNonUniformFMul 42 InclusiveScan 3481
-            3483:   3346(ptr) AccessChain 34(data) 3479 3345 38
-                              Store 3483 3482
-            3484:      6(int) Load 8(invocation)
-            3485:   3353(ptr) AccessChain 34(data) 46 3345
-            3486: 30(f16vec4) Load 3485
-            3487:3352(f16vec2) VectorShuffle 3486 3486 0 1
-            3488:3352(f16vec2) GroupNonUniformFMul 42 InclusiveScan 3487
-            3489:   3353(ptr) AccessChain 34(data) 3484 3345
-            3490: 30(f16vec4) Load 3489
-            3491: 30(f16vec4) VectorShuffle 3490 3488 4 5 2 3
-                              Store 3489 3491
-            3492:      6(int) Load 8(invocation)
-            3493:   3353(ptr) AccessChain 34(data) 57 3345
-            3494: 30(f16vec4) Load 3493
-            3495:3362(f16vec3) VectorShuffle 3494 3494 0 1 2
-            3496:3362(f16vec3) GroupNonUniformFMul 42 InclusiveScan 3495
-            3497:   3353(ptr) AccessChain 34(data) 3492 3345
-            3498: 30(f16vec4) Load 3497
-            3499: 30(f16vec4) VectorShuffle 3498 3496 4 5 6 3
-                              Store 3497 3499
-            3500:      6(int) Load 8(invocation)
-            3501:   3353(ptr) AccessChain 34(data) 67 3345
-            3502: 30(f16vec4) Load 3501
-            3503: 30(f16vec4) GroupNonUniformFMul 42 InclusiveScan 3502
-            3504:   3353(ptr) AccessChain 34(data) 3500 3345
-                              Store 3504 3503
-            3505:      6(int) Load 8(invocation)
-            3506:   3346(ptr) AccessChain 34(data) 37 3345 38
-            3507:29(float16_t) Load 3506
-            3508:29(float16_t) GroupNonUniformFMin 42 InclusiveScan 3507
-            3509:   3346(ptr) AccessChain 34(data) 3505 3345 38
-                              Store 3509 3508
-            3510:      6(int) Load 8(invocation)
-            3511:   3353(ptr) AccessChain 34(data) 46 3345
-            3512: 30(f16vec4) Load 3511
-            3513:3352(f16vec2) VectorShuffle 3512 3512 0 1
-            3514:3352(f16vec2) GroupNonUniformFMin 42 InclusiveScan 3513
-            3515:   3353(ptr) AccessChain 34(data) 3510 3345
-            3516: 30(f16vec4) Load 3515
-            3517: 30(f16vec4) VectorShuffle 3516 3514 4 5 2 3
-                              Store 3515 3517
-            3518:      6(int) Load 8(invocation)
-            3519:   3353(ptr) AccessChain 34(data) 57 3345
-            3520: 30(f16vec4) Load 3519
-            3521:3362(f16vec3) VectorShuffle 3520 3520 0 1 2
-            3522:3362(f16vec3) GroupNonUniformFMin 42 InclusiveScan 3521
-            3523:   3353(ptr) AccessChain 34(data) 3518 3345
-            3524: 30(f16vec4) Load 3523
-            3525: 30(f16vec4) VectorShuffle 3524 3522 4 5 6 3
-                              Store 3523 3525
-            3526:      6(int) Load 8(invocation)
-            3527:   3353(ptr) AccessChain 34(data) 67 3345
-            3528: 30(f16vec4) Load 3527
-            3529: 30(f16vec4) GroupNonUniformFMin 42 InclusiveScan 3528
-            3530:   3353(ptr) AccessChain 34(data) 3526 3345
-                              Store 3530 3529
-            3531:      6(int) Load 8(invocation)
-            3532:   3346(ptr) AccessChain 34(data) 37 3345 38
-            3533:29(float16_t) Load 3532
-            3534:29(float16_t) GroupNonUniformFMax 42 InclusiveScan 3533
-            3535:   3346(ptr) AccessChain 34(data) 3531 3345 38
-                              Store 3535 3534
-            3536:      6(int) Load 8(invocation)
-            3537:   3353(ptr) AccessChain 34(data) 46 3345
-            3538: 30(f16vec4) Load 3537
-            3539:3352(f16vec2) VectorShuffle 3538 3538 0 1
-            3540:3352(f16vec2) GroupNonUniformFMax 42 InclusiveScan 3539
-            3541:   3353(ptr) AccessChain 34(data) 3536 3345
-            3542: 30(f16vec4) Load 3541
-            3543: 30(f16vec4) VectorShuffle 3542 3540 4 5 2 3
-                              Store 3541 3543
-            3544:      6(int) Load 8(invocation)
-            3545:   3353(ptr) AccessChain 34(data) 57 3345
-            3546: 30(f16vec4) Load 3545
-            3547:3362(f16vec3) VectorShuffle 3546 3546 0 1 2
-            3548:3362(f16vec3) GroupNonUniformFMax 42 InclusiveScan 3547
-            3549:   3353(ptr) AccessChain 34(data) 3544 3345
-            3550: 30(f16vec4) Load 3549
-            3551: 30(f16vec4) VectorShuffle 3550 3548 4 5 6 3
-                              Store 3549 3551
-            3552:      6(int) Load 8(invocation)
-            3553:   3353(ptr) AccessChain 34(data) 67 3345
-            3554: 30(f16vec4) Load 3553
-            3555: 30(f16vec4) GroupNonUniformFMax 42 InclusiveScan 3554
-            3556:   3353(ptr) AccessChain 34(data) 3552 3345
-                              Store 3556 3555
-            3557:      6(int) Load 8(invocation)
-            3558:   3346(ptr) AccessChain 34(data) 37 3345 38
-            3559:29(float16_t) Load 3558
-            3560:29(float16_t) GroupNonUniformFAdd 42 ExclusiveScan 3559
-            3561:   3346(ptr) AccessChain 34(data) 3557 3345 38
-                              Store 3561 3560
-            3562:      6(int) Load 8(invocation)
-            3563:   3353(ptr) AccessChain 34(data) 46 3345
-            3564: 30(f16vec4) Load 3563
-            3565:3352(f16vec2) VectorShuffle 3564 3564 0 1
-            3566:3352(f16vec2) GroupNonUniformFAdd 42 ExclusiveScan 3565
-            3567:   3353(ptr) AccessChain 34(data) 3562 3345
-            3568: 30(f16vec4) Load 3567
-            3569: 30(f16vec4) VectorShuffle 3568 3566 4 5 2 3
-                              Store 3567 3569
-            3570:      6(int) Load 8(invocation)
-            3571:   3353(ptr) AccessChain 34(data) 57 3345
-            3572: 30(f16vec4) Load 3571
-            3573:3362(f16vec3) VectorShuffle 3572 3572 0 1 2
-            3574:3362(f16vec3) GroupNonUniformFAdd 42 ExclusiveScan 3573
-            3575:   3353(ptr) AccessChain 34(data) 3570 3345
-            3576: 30(f16vec4) Load 3575
-            3577: 30(f16vec4) VectorShuffle 3576 3574 4 5 6 3
-                              Store 3575 3577
-            3578:      6(int) Load 8(invocation)
-            3579:   3353(ptr) AccessChain 34(data) 67 3345
-            3580: 30(f16vec4) Load 3579
-            3581: 30(f16vec4) GroupNonUniformFAdd 42 ExclusiveScan 3580
-            3582:   3353(ptr) AccessChain 34(data) 3578 3345
-                              Store 3582 3581
-            3583:      6(int) Load 8(invocation)
-            3584:   3346(ptr) AccessChain 34(data) 37 3345 38
-            3585:29(float16_t) Load 3584
-            3586:29(float16_t) GroupNonUniformFMul 42 ExclusiveScan 3585
-            3587:   3346(ptr) AccessChain 34(data) 3583 3345 38
-                              Store 3587 3586
-            3588:      6(int) Load 8(invocation)
-            3589:   3353(ptr) AccessChain 34(data) 46 3345
-            3590: 30(f16vec4) Load 3589
-            3591:3352(f16vec2) VectorShuffle 3590 3590 0 1
-            3592:3352(f16vec2) GroupNonUniformFMul 42 ExclusiveScan 3591
-            3593:   3353(ptr) AccessChain 34(data) 3588 3345
-            3594: 30(f16vec4) Load 3593
-            3595: 30(f16vec4) VectorShuffle 3594 3592 4 5 2 3
-                              Store 3593 3595
-            3596:      6(int) Load 8(invocation)
-            3597:   3353(ptr) AccessChain 34(data) 57 3345
-            3598: 30(f16vec4) Load 3597
-            3599:3362(f16vec3) VectorShuffle 3598 3598 0 1 2
-            3600:3362(f16vec3) GroupNonUniformFMul 42 ExclusiveScan 3599
-            3601:   3353(ptr) AccessChain 34(data) 3596 3345
-            3602: 30(f16vec4) Load 3601
-            3603: 30(f16vec4) VectorShuffle 3602 3600 4 5 6 3
-                              Store 3601 3603
-            3604:      6(int) Load 8(invocation)
-            3605:   3353(ptr) AccessChain 34(data) 67 3345
-            3606: 30(f16vec4) Load 3605
-            3607: 30(f16vec4) GroupNonUniformFMul 42 ExclusiveScan 3606
-            3608:   3353(ptr) AccessChain 34(data) 3604 3345
-                              Store 3608 3607
-            3609:      6(int) Load 8(invocation)
-            3610:   3346(ptr) AccessChain 34(data) 37 3345 38
-            3611:29(float16_t) Load 3610
-            3612:29(float16_t) GroupNonUniformFMin 42 ExclusiveScan 3611
-            3613:   3346(ptr) AccessChain 34(data) 3609 3345 38
-                              Store 3613 3612
-            3614:      6(int) Load 8(invocation)
-            3615:   3353(ptr) AccessChain 34(data) 46 3345
-            3616: 30(f16vec4) Load 3615
-            3617:3352(f16vec2) VectorShuffle 3616 3616 0 1
-            3618:3352(f16vec2) GroupNonUniformFMin 42 ExclusiveScan 3617
-            3619:   3353(ptr) AccessChain 34(data) 3614 3345
-            3620: 30(f16vec4) Load 3619
-            3621: 30(f16vec4) VectorShuffle 3620 3618 4 5 2 3
-                              Store 3619 3621
-            3622:      6(int) Load 8(invocation)
-            3623:   3353(ptr) AccessChain 34(data) 57 3345
-            3624: 30(f16vec4) Load 3623
-            3625:3362(f16vec3) VectorShuffle 3624 3624 0 1 2
-            3626:3362(f16vec3) GroupNonUniformFMin 42 ExclusiveScan 3625
-            3627:   3353(ptr) AccessChain 34(data) 3622 3345
-            3628: 30(f16vec4) Load 3627
-            3629: 30(f16vec4) VectorShuffle 3628 3626 4 5 6 3
-                              Store 3627 3629
-            3630:      6(int) Load 8(invocation)
-            3631:   3353(ptr) AccessChain 34(data) 67 3345
-            3632: 30(f16vec4) Load 3631
-            3633: 30(f16vec4) GroupNonUniformFMin 42 ExclusiveScan 3632
-            3634:   3353(ptr) AccessChain 34(data) 3630 3345
-                              Store 3634 3633
+            3475:   3224(ptr) AccessChain 34(data) 59 3216
+            3476: 28(i64vec4) Load 3475
+            3477:3234(i64vec3) VectorShuffle 3476 3476 0 1 2
+            3478:3234(i64vec3) GroupNonUniformIMul 42 InclusiveScan 3477
+            3479:   3217(ptr) AccessChain 34(data) 3474 3216 38
+            3480: 27(int64_t) CompositeExtract 3478 0
+                              Store 3479 3480
+            3481:   3217(ptr) AccessChain 34(data) 3474 3216 55
+            3482: 27(int64_t) CompositeExtract 3478 1
+                              Store 3481 3482
+            3483:   3217(ptr) AccessChain 34(data) 3474 3216 69
+            3484: 27(int64_t) CompositeExtract 3478 2
+                              Store 3483 3484
+            3485:      6(int) Load 8(invocation)
+            3486:   3224(ptr) AccessChain 34(data) 73 3216
+            3487: 28(i64vec4) Load 3486
+            3488: 28(i64vec4) GroupNonUniformIMul 42 InclusiveScan 3487
+            3489:   3224(ptr) AccessChain 34(data) 3485 3216
+                              Store 3489 3488
+            3490:      6(int) Load 8(invocation)
+            3491:   3217(ptr) AccessChain 34(data) 37 3216 38
+            3492: 27(int64_t) Load 3491
+            3493: 27(int64_t) GroupNonUniformUMin 42 InclusiveScan 3492
+            3494:   3217(ptr) AccessChain 34(data) 3490 3216 38
+                              Store 3494 3493
+            3495:      6(int) Load 8(invocation)
+            3496:   3224(ptr) AccessChain 34(data) 46 3216
+            3497: 28(i64vec4) Load 3496
+            3498:3223(i64vec2) VectorShuffle 3497 3497 0 1
+            3499:3223(i64vec2) GroupNonUniformUMin 42 InclusiveScan 3498
+            3500:   3217(ptr) AccessChain 34(data) 3495 3216 38
+            3501: 27(int64_t) CompositeExtract 3499 0
+                              Store 3500 3501
+            3502:   3217(ptr) AccessChain 34(data) 3495 3216 55
+            3503: 27(int64_t) CompositeExtract 3499 1
+                              Store 3502 3503
+            3504:      6(int) Load 8(invocation)
+            3505:   3224(ptr) AccessChain 34(data) 59 3216
+            3506: 28(i64vec4) Load 3505
+            3507:3234(i64vec3) VectorShuffle 3506 3506 0 1 2
+            3508:3234(i64vec3) GroupNonUniformUMin 42 InclusiveScan 3507
+            3509:   3217(ptr) AccessChain 34(data) 3504 3216 38
+            3510: 27(int64_t) CompositeExtract 3508 0
+                              Store 3509 3510
+            3511:   3217(ptr) AccessChain 34(data) 3504 3216 55
+            3512: 27(int64_t) CompositeExtract 3508 1
+                              Store 3511 3512
+            3513:   3217(ptr) AccessChain 34(data) 3504 3216 69
+            3514: 27(int64_t) CompositeExtract 3508 2
+                              Store 3513 3514
+            3515:      6(int) Load 8(invocation)
+            3516:   3224(ptr) AccessChain 34(data) 73 3216
+            3517: 28(i64vec4) Load 3516
+            3518: 28(i64vec4) GroupNonUniformUMin 42 InclusiveScan 3517
+            3519:   3224(ptr) AccessChain 34(data) 3515 3216
+                              Store 3519 3518
+            3520:      6(int) Load 8(invocation)
+            3521:   3217(ptr) AccessChain 34(data) 37 3216 38
+            3522: 27(int64_t) Load 3521
+            3523: 27(int64_t) GroupNonUniformUMax 42 InclusiveScan 3522
+            3524:   3217(ptr) AccessChain 34(data) 3520 3216 38
+                              Store 3524 3523
+            3525:      6(int) Load 8(invocation)
+            3526:   3224(ptr) AccessChain 34(data) 46 3216
+            3527: 28(i64vec4) Load 3526
+            3528:3223(i64vec2) VectorShuffle 3527 3527 0 1
+            3529:3223(i64vec2) GroupNonUniformUMax 42 InclusiveScan 3528
+            3530:   3217(ptr) AccessChain 34(data) 3525 3216 38
+            3531: 27(int64_t) CompositeExtract 3529 0
+                              Store 3530 3531
+            3532:   3217(ptr) AccessChain 34(data) 3525 3216 55
+            3533: 27(int64_t) CompositeExtract 3529 1
+                              Store 3532 3533
+            3534:      6(int) Load 8(invocation)
+            3535:   3224(ptr) AccessChain 34(data) 59 3216
+            3536: 28(i64vec4) Load 3535
+            3537:3234(i64vec3) VectorShuffle 3536 3536 0 1 2
+            3538:3234(i64vec3) GroupNonUniformUMax 42 InclusiveScan 3537
+            3539:   3217(ptr) AccessChain 34(data) 3534 3216 38
+            3540: 27(int64_t) CompositeExtract 3538 0
+                              Store 3539 3540
+            3541:   3217(ptr) AccessChain 34(data) 3534 3216 55
+            3542: 27(int64_t) CompositeExtract 3538 1
+                              Store 3541 3542
+            3543:   3217(ptr) AccessChain 34(data) 3534 3216 69
+            3544: 27(int64_t) CompositeExtract 3538 2
+                              Store 3543 3544
+            3545:      6(int) Load 8(invocation)
+            3546:   3224(ptr) AccessChain 34(data) 73 3216
+            3547: 28(i64vec4) Load 3546
+            3548: 28(i64vec4) GroupNonUniformUMax 42 InclusiveScan 3547
+            3549:   3224(ptr) AccessChain 34(data) 3545 3216
+                              Store 3549 3548
+            3550:      6(int) Load 8(invocation)
+            3551:   3217(ptr) AccessChain 34(data) 37 3216 38
+            3552: 27(int64_t) Load 3551
+            3553: 27(int64_t) GroupNonUniformBitwiseAnd 42 InclusiveScan 3552
+            3554:   3217(ptr) AccessChain 34(data) 3550 3216 38
+                              Store 3554 3553
+            3555:      6(int) Load 8(invocation)
+            3556:   3224(ptr) AccessChain 34(data) 46 3216
+            3557: 28(i64vec4) Load 3556
+            3558:3223(i64vec2) VectorShuffle 3557 3557 0 1
+            3559:3223(i64vec2) GroupNonUniformBitwiseAnd 42 InclusiveScan 3558
+            3560:   3217(ptr) AccessChain 34(data) 3555 3216 38
+            3561: 27(int64_t) CompositeExtract 3559 0
+                              Store 3560 3561
+            3562:   3217(ptr) AccessChain 34(data) 3555 3216 55
+            3563: 27(int64_t) CompositeExtract 3559 1
+                              Store 3562 3563
+            3564:      6(int) Load 8(invocation)
+            3565:   3224(ptr) AccessChain 34(data) 59 3216
+            3566: 28(i64vec4) Load 3565
+            3567:3234(i64vec3) VectorShuffle 3566 3566 0 1 2
+            3568:3234(i64vec3) GroupNonUniformBitwiseAnd 42 InclusiveScan 3567
+            3569:   3217(ptr) AccessChain 34(data) 3564 3216 38
+            3570: 27(int64_t) CompositeExtract 3568 0
+                              Store 3569 3570
+            3571:   3217(ptr) AccessChain 34(data) 3564 3216 55
+            3572: 27(int64_t) CompositeExtract 3568 1
+                              Store 3571 3572
+            3573:   3217(ptr) AccessChain 34(data) 3564 3216 69
+            3574: 27(int64_t) CompositeExtract 3568 2
+                              Store 3573 3574
+            3575:      6(int) Load 8(invocation)
+            3576:   3224(ptr) AccessChain 34(data) 73 3216
+            3577: 28(i64vec4) Load 3576
+            3578: 28(i64vec4) GroupNonUniformBitwiseAnd 42 InclusiveScan 3577
+            3579:   3224(ptr) AccessChain 34(data) 3575 3216
+                              Store 3579 3578
+            3580:      6(int) Load 8(invocation)
+            3581:   3217(ptr) AccessChain 34(data) 37 3216 38
+            3582: 27(int64_t) Load 3581
+            3583: 27(int64_t) GroupNonUniformBitwiseOr 42 InclusiveScan 3582
+            3584:   3217(ptr) AccessChain 34(data) 3580 3216 38
+                              Store 3584 3583
+            3585:      6(int) Load 8(invocation)
+            3586:   3224(ptr) AccessChain 34(data) 46 3216
+            3587: 28(i64vec4) Load 3586
+            3588:3223(i64vec2) VectorShuffle 3587 3587 0 1
+            3589:3223(i64vec2) GroupNonUniformBitwiseOr 42 InclusiveScan 3588
+            3590:   3217(ptr) AccessChain 34(data) 3585 3216 38
+            3591: 27(int64_t) CompositeExtract 3589 0
+                              Store 3590 3591
+            3592:   3217(ptr) AccessChain 34(data) 3585 3216 55
+            3593: 27(int64_t) CompositeExtract 3589 1
+                              Store 3592 3593
+            3594:      6(int) Load 8(invocation)
+            3595:   3224(ptr) AccessChain 34(data) 59 3216
+            3596: 28(i64vec4) Load 3595
+            3597:3234(i64vec3) VectorShuffle 3596 3596 0 1 2
+            3598:3234(i64vec3) GroupNonUniformBitwiseOr 42 InclusiveScan 3597
+            3599:   3217(ptr) AccessChain 34(data) 3594 3216 38
+            3600: 27(int64_t) CompositeExtract 3598 0
+                              Store 3599 3600
+            3601:   3217(ptr) AccessChain 34(data) 3594 3216 55
+            3602: 27(int64_t) CompositeExtract 3598 1
+                              Store 3601 3602
+            3603:   3217(ptr) AccessChain 34(data) 3594 3216 69
+            3604: 27(int64_t) CompositeExtract 3598 2
+                              Store 3603 3604
+            3605:      6(int) Load 8(invocation)
+            3606:   3224(ptr) AccessChain 34(data) 73 3216
+            3607: 28(i64vec4) Load 3606
+            3608: 28(i64vec4) GroupNonUniformBitwiseOr 42 InclusiveScan 3607
+            3609:   3224(ptr) AccessChain 34(data) 3605 3216
+                              Store 3609 3608
+            3610:      6(int) Load 8(invocation)
+            3611:   3217(ptr) AccessChain 34(data) 37 3216 38
+            3612: 27(int64_t) Load 3611
+            3613: 27(int64_t) GroupNonUniformBitwiseXor 42 InclusiveScan 3612
+            3614:   3217(ptr) AccessChain 34(data) 3610 3216 38
+                              Store 3614 3613
+            3615:      6(int) Load 8(invocation)
+            3616:   3224(ptr) AccessChain 34(data) 46 3216
+            3617: 28(i64vec4) Load 3616
+            3618:3223(i64vec2) VectorShuffle 3617 3617 0 1
+            3619:3223(i64vec2) GroupNonUniformBitwiseXor 42 InclusiveScan 3618
+            3620:   3217(ptr) AccessChain 34(data) 3615 3216 38
+            3621: 27(int64_t) CompositeExtract 3619 0
+                              Store 3620 3621
+            3622:   3217(ptr) AccessChain 34(data) 3615 3216 55
+            3623: 27(int64_t) CompositeExtract 3619 1
+                              Store 3622 3623
+            3624:      6(int) Load 8(invocation)
+            3625:   3224(ptr) AccessChain 34(data) 59 3216
+            3626: 28(i64vec4) Load 3625
+            3627:3234(i64vec3) VectorShuffle 3626 3626 0 1 2
+            3628:3234(i64vec3) GroupNonUniformBitwiseXor 42 InclusiveScan 3627
+            3629:   3217(ptr) AccessChain 34(data) 3624 3216 38
+            3630: 27(int64_t) CompositeExtract 3628 0
+                              Store 3629 3630
+            3631:   3217(ptr) AccessChain 34(data) 3624 3216 55
+            3632: 27(int64_t) CompositeExtract 3628 1
+                              Store 3631 3632
+            3633:   3217(ptr) AccessChain 34(data) 3624 3216 69
+            3634: 27(int64_t) CompositeExtract 3628 2
+                              Store 3633 3634
             3635:      6(int) Load 8(invocation)
-            3636:   3346(ptr) AccessChain 34(data) 37 3345 38
-            3637:29(float16_t) Load 3636
-            3638:29(float16_t) GroupNonUniformFMax 42 ExclusiveScan 3637
-            3639:   3346(ptr) AccessChain 34(data) 3635 3345 38
+            3636:   3224(ptr) AccessChain 34(data) 73 3216
+            3637: 28(i64vec4) Load 3636
+            3638: 28(i64vec4) GroupNonUniformBitwiseXor 42 InclusiveScan 3637
+            3639:   3224(ptr) AccessChain 34(data) 3635 3216
                               Store 3639 3638
             3640:      6(int) Load 8(invocation)
-            3641:   3353(ptr) AccessChain 34(data) 46 3345
-            3642: 30(f16vec4) Load 3641
-            3643:3352(f16vec2) VectorShuffle 3642 3642 0 1
-            3644:3352(f16vec2) GroupNonUniformFMax 42 ExclusiveScan 3643
-            3645:   3353(ptr) AccessChain 34(data) 3640 3345
-            3646: 30(f16vec4) Load 3645
-            3647: 30(f16vec4) VectorShuffle 3646 3644 4 5 2 3
-                              Store 3645 3647
-            3648:      6(int) Load 8(invocation)
-            3649:   3353(ptr) AccessChain 34(data) 57 3345
-            3650: 30(f16vec4) Load 3649
-            3651:3362(f16vec3) VectorShuffle 3650 3650 0 1 2
-            3652:3362(f16vec3) GroupNonUniformFMax 42 ExclusiveScan 3651
-            3653:   3353(ptr) AccessChain 34(data) 3648 3345
-            3654: 30(f16vec4) Load 3653
-            3655: 30(f16vec4) VectorShuffle 3654 3652 4 5 6 3
-                              Store 3653 3655
-            3656:      6(int) Load 8(invocation)
-            3657:   3353(ptr) AccessChain 34(data) 67 3345
-            3658: 30(f16vec4) Load 3657
-            3659: 30(f16vec4) GroupNonUniformFMax 42 ExclusiveScan 3658
-            3660:   3353(ptr) AccessChain 34(data) 3656 3345
-                              Store 3660 3659
+            3641:   3217(ptr) AccessChain 34(data) 37 3216 38
+            3642: 27(int64_t) Load 3641
+            3643: 27(int64_t) GroupNonUniformIAdd 42 ExclusiveScan 3642
+            3644:   3217(ptr) AccessChain 34(data) 3640 3216 38
+                              Store 3644 3643
+            3645:      6(int) Load 8(invocation)
+            3646:   3224(ptr) AccessChain 34(data) 46 3216
+            3647: 28(i64vec4) Load 3646
+            3648:3223(i64vec2) VectorShuffle 3647 3647 0 1
+            3649:3223(i64vec2) GroupNonUniformIAdd 42 ExclusiveScan 3648
+            3650:   3217(ptr) AccessChain 34(data) 3645 3216 38
+            3651: 27(int64_t) CompositeExtract 3649 0
+                              Store 3650 3651
+            3652:   3217(ptr) AccessChain 34(data) 3645 3216 55
+            3653: 27(int64_t) CompositeExtract 3649 1
+                              Store 3652 3653
+            3654:      6(int) Load 8(invocation)
+            3655:   3224(ptr) AccessChain 34(data) 59 3216
+            3656: 28(i64vec4) Load 3655
+            3657:3234(i64vec3) VectorShuffle 3656 3656 0 1 2
+            3658:3234(i64vec3) GroupNonUniformIAdd 42 ExclusiveScan 3657
+            3659:   3217(ptr) AccessChain 34(data) 3654 3216 38
+            3660: 27(int64_t) CompositeExtract 3658 0
+                              Store 3659 3660
+            3661:   3217(ptr) AccessChain 34(data) 3654 3216 55
+            3662: 27(int64_t) CompositeExtract 3658 1
+                              Store 3661 3662
+            3663:   3217(ptr) AccessChain 34(data) 3654 3216 69
+            3664: 27(int64_t) CompositeExtract 3658 2
+                              Store 3663 3664
+            3665:      6(int) Load 8(invocation)
+            3666:   3224(ptr) AccessChain 34(data) 73 3216
+            3667: 28(i64vec4) Load 3666
+            3668: 28(i64vec4) GroupNonUniformIAdd 42 ExclusiveScan 3667
+            3669:   3224(ptr) AccessChain 34(data) 3665 3216
+                              Store 3669 3668
+            3670:      6(int) Load 8(invocation)
+            3671:   3217(ptr) AccessChain 34(data) 37 3216 38
+            3672: 27(int64_t) Load 3671
+            3673: 27(int64_t) GroupNonUniformIMul 42 ExclusiveScan 3672
+            3674:   3217(ptr) AccessChain 34(data) 3670 3216 38
+                              Store 3674 3673
+            3675:      6(int) Load 8(invocation)
+            3676:   3224(ptr) AccessChain 34(data) 46 3216
+            3677: 28(i64vec4) Load 3676
+            3678:3223(i64vec2) VectorShuffle 3677 3677 0 1
+            3679:3223(i64vec2) GroupNonUniformIMul 42 ExclusiveScan 3678
+            3680:   3217(ptr) AccessChain 34(data) 3675 3216 38
+            3681: 27(int64_t) CompositeExtract 3679 0
+                              Store 3680 3681
+            3682:   3217(ptr) AccessChain 34(data) 3675 3216 55
+            3683: 27(int64_t) CompositeExtract 3679 1
+                              Store 3682 3683
+            3684:      6(int) Load 8(invocation)
+            3685:   3224(ptr) AccessChain 34(data) 59 3216
+            3686: 28(i64vec4) Load 3685
+            3687:3234(i64vec3) VectorShuffle 3686 3686 0 1 2
+            3688:3234(i64vec3) GroupNonUniformIMul 42 ExclusiveScan 3687
+            3689:   3217(ptr) AccessChain 34(data) 3684 3216 38
+            3690: 27(int64_t) CompositeExtract 3688 0
+                              Store 3689 3690
+            3691:   3217(ptr) AccessChain 34(data) 3684 3216 55
+            3692: 27(int64_t) CompositeExtract 3688 1
+                              Store 3691 3692
+            3693:   3217(ptr) AccessChain 34(data) 3684 3216 69
+            3694: 27(int64_t) CompositeExtract 3688 2
+                              Store 3693 3694
+            3695:      6(int) Load 8(invocation)
+            3696:   3224(ptr) AccessChain 34(data) 73 3216
+            3697: 28(i64vec4) Load 3696
+            3698: 28(i64vec4) GroupNonUniformIMul 42 ExclusiveScan 3697
+            3699:   3224(ptr) AccessChain 34(data) 3695 3216
+                              Store 3699 3698
+            3700:      6(int) Load 8(invocation)
+            3701:   3217(ptr) AccessChain 34(data) 37 3216 38
+            3702: 27(int64_t) Load 3701
+            3703: 27(int64_t) GroupNonUniformUMin 42 ExclusiveScan 3702
+            3704:   3217(ptr) AccessChain 34(data) 3700 3216 38
+                              Store 3704 3703
+            3705:      6(int) Load 8(invocation)
+            3706:   3224(ptr) AccessChain 34(data) 46 3216
+            3707: 28(i64vec4) Load 3706
+            3708:3223(i64vec2) VectorShuffle 3707 3707 0 1
+            3709:3223(i64vec2) GroupNonUniformUMin 42 ExclusiveScan 3708
+            3710:   3217(ptr) AccessChain 34(data) 3705 3216 38
+            3711: 27(int64_t) CompositeExtract 3709 0
+                              Store 3710 3711
+            3712:   3217(ptr) AccessChain 34(data) 3705 3216 55
+            3713: 27(int64_t) CompositeExtract 3709 1
+                              Store 3712 3713
+            3714:      6(int) Load 8(invocation)
+            3715:   3224(ptr) AccessChain 34(data) 59 3216
+            3716: 28(i64vec4) Load 3715
+            3717:3234(i64vec3) VectorShuffle 3716 3716 0 1 2
+            3718:3234(i64vec3) GroupNonUniformUMin 42 ExclusiveScan 3717
+            3719:   3217(ptr) AccessChain 34(data) 3714 3216 38
+            3720: 27(int64_t) CompositeExtract 3718 0
+                              Store 3719 3720
+            3721:   3217(ptr) AccessChain 34(data) 3714 3216 55
+            3722: 27(int64_t) CompositeExtract 3718 1
+                              Store 3721 3722
+            3723:   3217(ptr) AccessChain 34(data) 3714 3216 69
+            3724: 27(int64_t) CompositeExtract 3718 2
+                              Store 3723 3724
+            3725:      6(int) Load 8(invocation)
+            3726:   3224(ptr) AccessChain 34(data) 73 3216
+            3727: 28(i64vec4) Load 3726
+            3728: 28(i64vec4) GroupNonUniformUMin 42 ExclusiveScan 3727
+            3729:   3224(ptr) AccessChain 34(data) 3725 3216
+                              Store 3729 3728
+            3730:      6(int) Load 8(invocation)
+            3731:   3217(ptr) AccessChain 34(data) 37 3216 38
+            3732: 27(int64_t) Load 3731
+            3733: 27(int64_t) GroupNonUniformUMax 42 ExclusiveScan 3732
+            3734:   3217(ptr) AccessChain 34(data) 3730 3216 38
+                              Store 3734 3733
+            3735:      6(int) Load 8(invocation)
+            3736:   3224(ptr) AccessChain 34(data) 46 3216
+            3737: 28(i64vec4) Load 3736
+            3738:3223(i64vec2) VectorShuffle 3737 3737 0 1
+            3739:3223(i64vec2) GroupNonUniformUMax 42 ExclusiveScan 3738
+            3740:   3217(ptr) AccessChain 34(data) 3735 3216 38
+            3741: 27(int64_t) CompositeExtract 3739 0
+                              Store 3740 3741
+            3742:   3217(ptr) AccessChain 34(data) 3735 3216 55
+            3743: 27(int64_t) CompositeExtract 3739 1
+                              Store 3742 3743
+            3744:      6(int) Load 8(invocation)
+            3745:   3224(ptr) AccessChain 34(data) 59 3216
+            3746: 28(i64vec4) Load 3745
+            3747:3234(i64vec3) VectorShuffle 3746 3746 0 1 2
+            3748:3234(i64vec3) GroupNonUniformUMax 42 ExclusiveScan 3747
+            3749:   3217(ptr) AccessChain 34(data) 3744 3216 38
+            3750: 27(int64_t) CompositeExtract 3748 0
+                              Store 3749 3750
+            3751:   3217(ptr) AccessChain 34(data) 3744 3216 55
+            3752: 27(int64_t) CompositeExtract 3748 1
+                              Store 3751 3752
+            3753:   3217(ptr) AccessChain 34(data) 3744 3216 69
+            3754: 27(int64_t) CompositeExtract 3748 2
+                              Store 3753 3754
+            3755:      6(int) Load 8(invocation)
+            3756:   3224(ptr) AccessChain 34(data) 73 3216
+            3757: 28(i64vec4) Load 3756
+            3758: 28(i64vec4) GroupNonUniformUMax 42 ExclusiveScan 3757
+            3759:   3224(ptr) AccessChain 34(data) 3755 3216
+                              Store 3759 3758
+            3760:      6(int) Load 8(invocation)
+            3761:   3217(ptr) AccessChain 34(data) 37 3216 38
+            3762: 27(int64_t) Load 3761
+            3763: 27(int64_t) GroupNonUniformBitwiseAnd 42 ExclusiveScan 3762
+            3764:   3217(ptr) AccessChain 34(data) 3760 3216 38
+                              Store 3764 3763
+            3765:      6(int) Load 8(invocation)
+            3766:   3224(ptr) AccessChain 34(data) 46 3216
+            3767: 28(i64vec4) Load 3766
+            3768:3223(i64vec2) VectorShuffle 3767 3767 0 1
+            3769:3223(i64vec2) GroupNonUniformBitwiseAnd 42 ExclusiveScan 3768
+            3770:   3217(ptr) AccessChain 34(data) 3765 3216 38
+            3771: 27(int64_t) CompositeExtract 3769 0
+                              Store 3770 3771
+            3772:   3217(ptr) AccessChain 34(data) 3765 3216 55
+            3773: 27(int64_t) CompositeExtract 3769 1
+                              Store 3772 3773
+            3774:      6(int) Load 8(invocation)
+            3775:   3224(ptr) AccessChain 34(data) 59 3216
+            3776: 28(i64vec4) Load 3775
+            3777:3234(i64vec3) VectorShuffle 3776 3776 0 1 2
+            3778:3234(i64vec3) GroupNonUniformBitwiseAnd 42 ExclusiveScan 3777
+            3779:   3217(ptr) AccessChain 34(data) 3774 3216 38
+            3780: 27(int64_t) CompositeExtract 3778 0
+                              Store 3779 3780
+            3781:   3217(ptr) AccessChain 34(data) 3774 3216 55
+            3782: 27(int64_t) CompositeExtract 3778 1
+                              Store 3781 3782
+            3783:   3217(ptr) AccessChain 34(data) 3774 3216 69
+            3784: 27(int64_t) CompositeExtract 3778 2
+                              Store 3783 3784
+            3785:      6(int) Load 8(invocation)
+            3786:   3224(ptr) AccessChain 34(data) 73 3216
+            3787: 28(i64vec4) Load 3786
+            3788: 28(i64vec4) GroupNonUniformBitwiseAnd 42 ExclusiveScan 3787
+            3789:   3224(ptr) AccessChain 34(data) 3785 3216
+                              Store 3789 3788
+            3790:      6(int) Load 8(invocation)
+            3791:   3217(ptr) AccessChain 34(data) 37 3216 38
+            3792: 27(int64_t) Load 3791
+            3793: 27(int64_t) GroupNonUniformBitwiseOr 42 ExclusiveScan 3792
+            3794:   3217(ptr) AccessChain 34(data) 3790 3216 38
+                              Store 3794 3793
+            3795:      6(int) Load 8(invocation)
+            3796:   3224(ptr) AccessChain 34(data) 46 3216
+            3797: 28(i64vec4) Load 3796
+            3798:3223(i64vec2) VectorShuffle 3797 3797 0 1
+            3799:3223(i64vec2) GroupNonUniformBitwiseOr 42 ExclusiveScan 3798
+            3800:   3217(ptr) AccessChain 34(data) 3795 3216 38
+            3801: 27(int64_t) CompositeExtract 3799 0
+                              Store 3800 3801
+            3802:   3217(ptr) AccessChain 34(data) 3795 3216 55
+            3803: 27(int64_t) CompositeExtract 3799 1
+                              Store 3802 3803
+            3804:      6(int) Load 8(invocation)
+            3805:   3224(ptr) AccessChain 34(data) 59 3216
+            3806: 28(i64vec4) Load 3805
+            3807:3234(i64vec3) VectorShuffle 3806 3806 0 1 2
+            3808:3234(i64vec3) GroupNonUniformBitwiseOr 42 ExclusiveScan 3807
+            3809:   3217(ptr) AccessChain 34(data) 3804 3216 38
+            3810: 27(int64_t) CompositeExtract 3808 0
+                              Store 3809 3810
+            3811:   3217(ptr) AccessChain 34(data) 3804 3216 55
+            3812: 27(int64_t) CompositeExtract 3808 1
+                              Store 3811 3812
+            3813:   3217(ptr) AccessChain 34(data) 3804 3216 69
+            3814: 27(int64_t) CompositeExtract 3808 2
+                              Store 3813 3814
+            3815:      6(int) Load 8(invocation)
+            3816:   3224(ptr) AccessChain 34(data) 73 3216
+            3817: 28(i64vec4) Load 3816
+            3818: 28(i64vec4) GroupNonUniformBitwiseOr 42 ExclusiveScan 3817
+            3819:   3224(ptr) AccessChain 34(data) 3815 3216
+                              Store 3819 3818
+            3820:      6(int) Load 8(invocation)
+            3821:   3217(ptr) AccessChain 34(data) 37 3216 38
+            3822: 27(int64_t) Load 3821
+            3823: 27(int64_t) GroupNonUniformBitwiseXor 42 ExclusiveScan 3822
+            3824:   3217(ptr) AccessChain 34(data) 3820 3216 38
+                              Store 3824 3823
+            3825:      6(int) Load 8(invocation)
+            3826:   3224(ptr) AccessChain 34(data) 46 3216
+            3827: 28(i64vec4) Load 3826
+            3828:3223(i64vec2) VectorShuffle 3827 3827 0 1
+            3829:3223(i64vec2) GroupNonUniformBitwiseXor 42 ExclusiveScan 3828
+            3830:   3217(ptr) AccessChain 34(data) 3825 3216 38
+            3831: 27(int64_t) CompositeExtract 3829 0
+                              Store 3830 3831
+            3832:   3217(ptr) AccessChain 34(data) 3825 3216 55
+            3833: 27(int64_t) CompositeExtract 3829 1
+                              Store 3832 3833
+            3834:      6(int) Load 8(invocation)
+            3835:   3224(ptr) AccessChain 34(data) 59 3216
+            3836: 28(i64vec4) Load 3835
+            3837:3234(i64vec3) VectorShuffle 3836 3836 0 1 2
+            3838:3234(i64vec3) GroupNonUniformBitwiseXor 42 ExclusiveScan 3837
+            3839:   3217(ptr) AccessChain 34(data) 3834 3216 38
+            3840: 27(int64_t) CompositeExtract 3838 0
+                              Store 3839 3840
+            3841:   3217(ptr) AccessChain 34(data) 3834 3216 55
+            3842: 27(int64_t) CompositeExtract 3838 1
+                              Store 3841 3842
+            3843:   3217(ptr) AccessChain 34(data) 3834 3216 69
+            3844: 27(int64_t) CompositeExtract 3838 2
+                              Store 3843 3844
+            3845:      6(int) Load 8(invocation)
+            3846:   3224(ptr) AccessChain 34(data) 73 3216
+            3847: 28(i64vec4) Load 3846
+            3848: 28(i64vec4) GroupNonUniformBitwiseXor 42 ExclusiveScan 3847
+            3849:   3224(ptr) AccessChain 34(data) 3845 3216
+                              Store 3849 3848
+            3850:      6(int) Load 8(invocation)
+            3853:   3852(ptr) AccessChain 34(data) 37 3851 38
+            3854:29(float16_t) Load 3853
+            3855:29(float16_t) GroupNonUniformFAdd 42 Reduce 3854
+            3856:   3852(ptr) AccessChain 34(data) 3850 3851 38
+                              Store 3856 3855
+            3857:      6(int) Load 8(invocation)
+            3860:   3859(ptr) AccessChain 34(data) 46 3851
+            3861: 30(f16vec4) Load 3860
+            3862:3858(f16vec2) VectorShuffle 3861 3861 0 1
+            3863:3858(f16vec2) GroupNonUniformFAdd 42 Reduce 3862
+            3864:   3852(ptr) AccessChain 34(data) 3857 3851 38
+            3865:29(float16_t) CompositeExtract 3863 0
+                              Store 3864 3865
+            3866:   3852(ptr) AccessChain 34(data) 3857 3851 55
+            3867:29(float16_t) CompositeExtract 3863 1
+                              Store 3866 3867
+            3868:      6(int) Load 8(invocation)
+            3870:   3859(ptr) AccessChain 34(data) 59 3851
+            3871: 30(f16vec4) Load 3870
+            3872:3869(f16vec3) VectorShuffle 3871 3871 0 1 2
+            3873:3869(f16vec3) GroupNonUniformFAdd 42 Reduce 3872
+            3874:   3852(ptr) AccessChain 34(data) 3868 3851 38
+            3875:29(float16_t) CompositeExtract 3873 0
+                              Store 3874 3875
+            3876:   3852(ptr) AccessChain 34(data) 3868 3851 55
+            3877:29(float16_t) CompositeExtract 3873 1
+                              Store 3876 3877
+            3878:   3852(ptr) AccessChain 34(data) 3868 3851 69
+            3879:29(float16_t) CompositeExtract 3873 2
+                              Store 3878 3879
+            3880:      6(int) Load 8(invocation)
+            3881:   3859(ptr) AccessChain 34(data) 73 3851
+            3882: 30(f16vec4) Load 3881
+            3883: 30(f16vec4) GroupNonUniformFAdd 42 Reduce 3882
+            3884:   3859(ptr) AccessChain 34(data) 3880 3851
+                              Store 3884 3883
+            3885:      6(int) Load 8(invocation)
+            3886:   3852(ptr) AccessChain 34(data) 37 3851 38
+            3887:29(float16_t) Load 3886
+            3888:29(float16_t) GroupNonUniformFMul 42 Reduce 3887
+            3889:   3852(ptr) AccessChain 34(data) 3885 3851 38
+                              Store 3889 3888
+            3890:      6(int) Load 8(invocation)
+            3891:   3859(ptr) AccessChain 34(data) 46 3851
+            3892: 30(f16vec4) Load 3891
+            3893:3858(f16vec2) VectorShuffle 3892 3892 0 1
+            3894:3858(f16vec2) GroupNonUniformFMul 42 Reduce 3893
+            3895:   3852(ptr) AccessChain 34(data) 3890 3851 38
+            3896:29(float16_t) CompositeExtract 3894 0
+                              Store 3895 3896
+            3897:   3852(ptr) AccessChain 34(data) 3890 3851 55
+            3898:29(float16_t) CompositeExtract 3894 1
+                              Store 3897 3898
+            3899:      6(int) Load 8(invocation)
+            3900:   3859(ptr) AccessChain 34(data) 59 3851
+            3901: 30(f16vec4) Load 3900
+            3902:3869(f16vec3) VectorShuffle 3901 3901 0 1 2
+            3903:3869(f16vec3) GroupNonUniformFMul 42 Reduce 3902
+            3904:   3852(ptr) AccessChain 34(data) 3899 3851 38
+            3905:29(float16_t) CompositeExtract 3903 0
+                              Store 3904 3905
+            3906:   3852(ptr) AccessChain 34(data) 3899 3851 55
+            3907:29(float16_t) CompositeExtract 3903 1
+                              Store 3906 3907
+            3908:   3852(ptr) AccessChain 34(data) 3899 3851 69
+            3909:29(float16_t) CompositeExtract 3903 2
+                              Store 3908 3909
+            3910:      6(int) Load 8(invocation)
+            3911:   3859(ptr) AccessChain 34(data) 73 3851
+            3912: 30(f16vec4) Load 3911
+            3913: 30(f16vec4) GroupNonUniformFMul 42 Reduce 3912
+            3914:   3859(ptr) AccessChain 34(data) 3910 3851
+                              Store 3914 3913
+            3915:      6(int) Load 8(invocation)
+            3916:   3852(ptr) AccessChain 34(data) 37 3851 38
+            3917:29(float16_t) Load 3916
+            3918:29(float16_t) GroupNonUniformFMin 42 Reduce 3917
+            3919:   3852(ptr) AccessChain 34(data) 3915 3851 38
+                              Store 3919 3918
+            3920:      6(int) Load 8(invocation)
+            3921:   3859(ptr) AccessChain 34(data) 46 3851
+            3922: 30(f16vec4) Load 3921
+            3923:3858(f16vec2) VectorShuffle 3922 3922 0 1
+            3924:3858(f16vec2) GroupNonUniformFMin 42 Reduce 3923
+            3925:   3852(ptr) AccessChain 34(data) 3920 3851 38
+            3926:29(float16_t) CompositeExtract 3924 0
+                              Store 3925 3926
+            3927:   3852(ptr) AccessChain 34(data) 3920 3851 55
+            3928:29(float16_t) CompositeExtract 3924 1
+                              Store 3927 3928
+            3929:      6(int) Load 8(invocation)
+            3930:   3859(ptr) AccessChain 34(data) 59 3851
+            3931: 30(f16vec4) Load 3930
+            3932:3869(f16vec3) VectorShuffle 3931 3931 0 1 2
+            3933:3869(f16vec3) GroupNonUniformFMin 42 Reduce 3932
+            3934:   3852(ptr) AccessChain 34(data) 3929 3851 38
+            3935:29(float16_t) CompositeExtract 3933 0
+                              Store 3934 3935
+            3936:   3852(ptr) AccessChain 34(data) 3929 3851 55
+            3937:29(float16_t) CompositeExtract 3933 1
+                              Store 3936 3937
+            3938:   3852(ptr) AccessChain 34(data) 3929 3851 69
+            3939:29(float16_t) CompositeExtract 3933 2
+                              Store 3938 3939
+            3940:      6(int) Load 8(invocation)
+            3941:   3859(ptr) AccessChain 34(data) 73 3851
+            3942: 30(f16vec4) Load 3941
+            3943: 30(f16vec4) GroupNonUniformFMin 42 Reduce 3942
+            3944:   3859(ptr) AccessChain 34(data) 3940 3851
+                              Store 3944 3943
+            3945:      6(int) Load 8(invocation)
+            3946:   3852(ptr) AccessChain 34(data) 37 3851 38
+            3947:29(float16_t) Load 3946
+            3948:29(float16_t) GroupNonUniformFMax 42 Reduce 3947
+            3949:   3852(ptr) AccessChain 34(data) 3945 3851 38
+                              Store 3949 3948
+            3950:      6(int) Load 8(invocation)
+            3951:   3859(ptr) AccessChain 34(data) 46 3851
+            3952: 30(f16vec4) Load 3951
+            3953:3858(f16vec2) VectorShuffle 3952 3952 0 1
+            3954:3858(f16vec2) GroupNonUniformFMax 42 Reduce 3953
+            3955:   3852(ptr) AccessChain 34(data) 3950 3851 38
+            3956:29(float16_t) CompositeExtract 3954 0
+                              Store 3955 3956
+            3957:   3852(ptr) AccessChain 34(data) 3950 3851 55
+            3958:29(float16_t) CompositeExtract 3954 1
+                              Store 3957 3958
+            3959:      6(int) Load 8(invocation)
+            3960:   3859(ptr) AccessChain 34(data) 59 3851
+            3961: 30(f16vec4) Load 3960
+            3962:3869(f16vec3) VectorShuffle 3961 3961 0 1 2
+            3963:3869(f16vec3) GroupNonUniformFMax 42 Reduce 3962
+            3964:   3852(ptr) AccessChain 34(data) 3959 3851 38
+            3965:29(float16_t) CompositeExtract 3963 0
+                              Store 3964 3965
+            3966:   3852(ptr) AccessChain 34(data) 3959 3851 55
+            3967:29(float16_t) CompositeExtract 3963 1
+                              Store 3966 3967
+            3968:   3852(ptr) AccessChain 34(data) 3959 3851 69
+            3969:29(float16_t) CompositeExtract 3963 2
+                              Store 3968 3969
+            3970:      6(int) Load 8(invocation)
+            3971:   3859(ptr) AccessChain 34(data) 73 3851
+            3972: 30(f16vec4) Load 3971
+            3973: 30(f16vec4) GroupNonUniformFMax 42 Reduce 3972
+            3974:   3859(ptr) AccessChain 34(data) 3970 3851
+                              Store 3974 3973
+            3975:      6(int) Load 8(invocation)
+            3976:   3852(ptr) AccessChain 34(data) 37 3851 38
+            3977:29(float16_t) Load 3976
+            3978:29(float16_t) GroupNonUniformFAdd 42 InclusiveScan 3977
+            3979:   3852(ptr) AccessChain 34(data) 3975 3851 38
+                              Store 3979 3978
+            3980:      6(int) Load 8(invocation)
+            3981:   3859(ptr) AccessChain 34(data) 46 3851
+            3982: 30(f16vec4) Load 3981
+            3983:3858(f16vec2) VectorShuffle 3982 3982 0 1
+            3984:3858(f16vec2) GroupNonUniformFAdd 42 InclusiveScan 3983
+            3985:   3852(ptr) AccessChain 34(data) 3980 3851 38
+            3986:29(float16_t) CompositeExtract 3984 0
+                              Store 3985 3986
+            3987:   3852(ptr) AccessChain 34(data) 3980 3851 55
+            3988:29(float16_t) CompositeExtract 3984 1
+                              Store 3987 3988
+            3989:      6(int) Load 8(invocation)
+            3990:   3859(ptr) AccessChain 34(data) 59 3851
+            3991: 30(f16vec4) Load 3990
+            3992:3869(f16vec3) VectorShuffle 3991 3991 0 1 2
+            3993:3869(f16vec3) GroupNonUniformFAdd 42 InclusiveScan 3992
+            3994:   3852(ptr) AccessChain 34(data) 3989 3851 38
+            3995:29(float16_t) CompositeExtract 3993 0
+                              Store 3994 3995
+            3996:   3852(ptr) AccessChain 34(data) 3989 3851 55
+            3997:29(float16_t) CompositeExtract 3993 1
+                              Store 3996 3997
+            3998:   3852(ptr) AccessChain 34(data) 3989 3851 69
+            3999:29(float16_t) CompositeExtract 3993 2
+                              Store 3998 3999
+            4000:      6(int) Load 8(invocation)
+            4001:   3859(ptr) AccessChain 34(data) 73 3851
+            4002: 30(f16vec4) Load 4001
+            4003: 30(f16vec4) GroupNonUniformFAdd 42 InclusiveScan 4002
+            4004:   3859(ptr) AccessChain 34(data) 4000 3851
+                              Store 4004 4003
+            4005:      6(int) Load 8(invocation)
+            4006:   3852(ptr) AccessChain 34(data) 37 3851 38
+            4007:29(float16_t) Load 4006
+            4008:29(float16_t) GroupNonUniformFMul 42 InclusiveScan 4007
+            4009:   3852(ptr) AccessChain 34(data) 4005 3851 38
+                              Store 4009 4008
+            4010:      6(int) Load 8(invocation)
+            4011:   3859(ptr) AccessChain 34(data) 46 3851
+            4012: 30(f16vec4) Load 4011
+            4013:3858(f16vec2) VectorShuffle 4012 4012 0 1
+            4014:3858(f16vec2) GroupNonUniformFMul 42 InclusiveScan 4013
+            4015:   3852(ptr) AccessChain 34(data) 4010 3851 38
+            4016:29(float16_t) CompositeExtract 4014 0
+                              Store 4015 4016
+            4017:   3852(ptr) AccessChain 34(data) 4010 3851 55
+            4018:29(float16_t) CompositeExtract 4014 1
+                              Store 4017 4018
+            4019:      6(int) Load 8(invocation)
+            4020:   3859(ptr) AccessChain 34(data) 59 3851
+            4021: 30(f16vec4) Load 4020
+            4022:3869(f16vec3) VectorShuffle 4021 4021 0 1 2
+            4023:3869(f16vec3) GroupNonUniformFMul 42 InclusiveScan 4022
+            4024:   3852(ptr) AccessChain 34(data) 4019 3851 38
+            4025:29(float16_t) CompositeExtract 4023 0
+                              Store 4024 4025
+            4026:   3852(ptr) AccessChain 34(data) 4019 3851 55
+            4027:29(float16_t) CompositeExtract 4023 1
+                              Store 4026 4027
+            4028:   3852(ptr) AccessChain 34(data) 4019 3851 69
+            4029:29(float16_t) CompositeExtract 4023 2
+                              Store 4028 4029
+            4030:      6(int) Load 8(invocation)
+            4031:   3859(ptr) AccessChain 34(data) 73 3851
+            4032: 30(f16vec4) Load 4031
+            4033: 30(f16vec4) GroupNonUniformFMul 42 InclusiveScan 4032
+            4034:   3859(ptr) AccessChain 34(data) 4030 3851
+                              Store 4034 4033
+            4035:      6(int) Load 8(invocation)
+            4036:   3852(ptr) AccessChain 34(data) 37 3851 38
+            4037:29(float16_t) Load 4036
+            4038:29(float16_t) GroupNonUniformFMin 42 InclusiveScan 4037
+            4039:   3852(ptr) AccessChain 34(data) 4035 3851 38
+                              Store 4039 4038
+            4040:      6(int) Load 8(invocation)
+            4041:   3859(ptr) AccessChain 34(data) 46 3851
+            4042: 30(f16vec4) Load 4041
+            4043:3858(f16vec2) VectorShuffle 4042 4042 0 1
+            4044:3858(f16vec2) GroupNonUniformFMin 42 InclusiveScan 4043
+            4045:   3852(ptr) AccessChain 34(data) 4040 3851 38
+            4046:29(float16_t) CompositeExtract 4044 0
+                              Store 4045 4046
+            4047:   3852(ptr) AccessChain 34(data) 4040 3851 55
+            4048:29(float16_t) CompositeExtract 4044 1
+                              Store 4047 4048
+            4049:      6(int) Load 8(invocation)
+            4050:   3859(ptr) AccessChain 34(data) 59 3851
+            4051: 30(f16vec4) Load 4050
+            4052:3869(f16vec3) VectorShuffle 4051 4051 0 1 2
+            4053:3869(f16vec3) GroupNonUniformFMin 42 InclusiveScan 4052
+            4054:   3852(ptr) AccessChain 34(data) 4049 3851 38
+            4055:29(float16_t) CompositeExtract 4053 0
+                              Store 4054 4055
+            4056:   3852(ptr) AccessChain 34(data) 4049 3851 55
+            4057:29(float16_t) CompositeExtract 4053 1
+                              Store 4056 4057
+            4058:   3852(ptr) AccessChain 34(data) 4049 3851 69
+            4059:29(float16_t) CompositeExtract 4053 2
+                              Store 4058 4059
+            4060:      6(int) Load 8(invocation)
+            4061:   3859(ptr) AccessChain 34(data) 73 3851
+            4062: 30(f16vec4) Load 4061
+            4063: 30(f16vec4) GroupNonUniformFMin 42 InclusiveScan 4062
+            4064:   3859(ptr) AccessChain 34(data) 4060 3851
+                              Store 4064 4063
+            4065:      6(int) Load 8(invocation)
+            4066:   3852(ptr) AccessChain 34(data) 37 3851 38
+            4067:29(float16_t) Load 4066
+            4068:29(float16_t) GroupNonUniformFMax 42 InclusiveScan 4067
+            4069:   3852(ptr) AccessChain 34(data) 4065 3851 38
+                              Store 4069 4068
+            4070:      6(int) Load 8(invocation)
+            4071:   3859(ptr) AccessChain 34(data) 46 3851
+            4072: 30(f16vec4) Load 4071
+            4073:3858(f16vec2) VectorShuffle 4072 4072 0 1
+            4074:3858(f16vec2) GroupNonUniformFMax 42 InclusiveScan 4073
+            4075:   3852(ptr) AccessChain 34(data) 4070 3851 38
+            4076:29(float16_t) CompositeExtract 4074 0
+                              Store 4075 4076
+            4077:   3852(ptr) AccessChain 34(data) 4070 3851 55
+            4078:29(float16_t) CompositeExtract 4074 1
+                              Store 4077 4078
+            4079:      6(int) Load 8(invocation)
+            4080:   3859(ptr) AccessChain 34(data) 59 3851
+            4081: 30(f16vec4) Load 4080
+            4082:3869(f16vec3) VectorShuffle 4081 4081 0 1 2
+            4083:3869(f16vec3) GroupNonUniformFMax 42 InclusiveScan 4082
+            4084:   3852(ptr) AccessChain 34(data) 4079 3851 38
+            4085:29(float16_t) CompositeExtract 4083 0
+                              Store 4084 4085
+            4086:   3852(ptr) AccessChain 34(data) 4079 3851 55
+            4087:29(float16_t) CompositeExtract 4083 1
+                              Store 4086 4087
+            4088:   3852(ptr) AccessChain 34(data) 4079 3851 69
+            4089:29(float16_t) CompositeExtract 4083 2
+                              Store 4088 4089
+            4090:      6(int) Load 8(invocation)
+            4091:   3859(ptr) AccessChain 34(data) 73 3851
+            4092: 30(f16vec4) Load 4091
+            4093: 30(f16vec4) GroupNonUniformFMax 42 InclusiveScan 4092
+            4094:   3859(ptr) AccessChain 34(data) 4090 3851
+                              Store 4094 4093
+            4095:      6(int) Load 8(invocation)
+            4096:   3852(ptr) AccessChain 34(data) 37 3851 38
+            4097:29(float16_t) Load 4096
+            4098:29(float16_t) GroupNonUniformFAdd 42 ExclusiveScan 4097
+            4099:   3852(ptr) AccessChain 34(data) 4095 3851 38
+                              Store 4099 4098
+            4100:      6(int) Load 8(invocation)
+            4101:   3859(ptr) AccessChain 34(data) 46 3851
+            4102: 30(f16vec4) Load 4101
+            4103:3858(f16vec2) VectorShuffle 4102 4102 0 1
+            4104:3858(f16vec2) GroupNonUniformFAdd 42 ExclusiveScan 4103
+            4105:   3852(ptr) AccessChain 34(data) 4100 3851 38
+            4106:29(float16_t) CompositeExtract 4104 0
+                              Store 4105 4106
+            4107:   3852(ptr) AccessChain 34(data) 4100 3851 55
+            4108:29(float16_t) CompositeExtract 4104 1
+                              Store 4107 4108
+            4109:      6(int) Load 8(invocation)
+            4110:   3859(ptr) AccessChain 34(data) 59 3851
+            4111: 30(f16vec4) Load 4110
+            4112:3869(f16vec3) VectorShuffle 4111 4111 0 1 2
+            4113:3869(f16vec3) GroupNonUniformFAdd 42 ExclusiveScan 4112
+            4114:   3852(ptr) AccessChain 34(data) 4109 3851 38
+            4115:29(float16_t) CompositeExtract 4113 0
+                              Store 4114 4115
+            4116:   3852(ptr) AccessChain 34(data) 4109 3851 55
+            4117:29(float16_t) CompositeExtract 4113 1
+                              Store 4116 4117
+            4118:   3852(ptr) AccessChain 34(data) 4109 3851 69
+            4119:29(float16_t) CompositeExtract 4113 2
+                              Store 4118 4119
+            4120:      6(int) Load 8(invocation)
+            4121:   3859(ptr) AccessChain 34(data) 73 3851
+            4122: 30(f16vec4) Load 4121
+            4123: 30(f16vec4) GroupNonUniformFAdd 42 ExclusiveScan 4122
+            4124:   3859(ptr) AccessChain 34(data) 4120 3851
+                              Store 4124 4123
+            4125:      6(int) Load 8(invocation)
+            4126:   3852(ptr) AccessChain 34(data) 37 3851 38
+            4127:29(float16_t) Load 4126
+            4128:29(float16_t) GroupNonUniformFMul 42 ExclusiveScan 4127
+            4129:   3852(ptr) AccessChain 34(data) 4125 3851 38
+                              Store 4129 4128
+            4130:      6(int) Load 8(invocation)
+            4131:   3859(ptr) AccessChain 34(data) 46 3851
+            4132: 30(f16vec4) Load 4131
+            4133:3858(f16vec2) VectorShuffle 4132 4132 0 1
+            4134:3858(f16vec2) GroupNonUniformFMul 42 ExclusiveScan 4133
+            4135:   3852(ptr) AccessChain 34(data) 4130 3851 38
+            4136:29(float16_t) CompositeExtract 4134 0
+                              Store 4135 4136
+            4137:   3852(ptr) AccessChain 34(data) 4130 3851 55
+            4138:29(float16_t) CompositeExtract 4134 1
+                              Store 4137 4138
+            4139:      6(int) Load 8(invocation)
+            4140:   3859(ptr) AccessChain 34(data) 59 3851
+            4141: 30(f16vec4) Load 4140
+            4142:3869(f16vec3) VectorShuffle 4141 4141 0 1 2
+            4143:3869(f16vec3) GroupNonUniformFMul 42 ExclusiveScan 4142
+            4144:   3852(ptr) AccessChain 34(data) 4139 3851 38
+            4145:29(float16_t) CompositeExtract 4143 0
+                              Store 4144 4145
+            4146:   3852(ptr) AccessChain 34(data) 4139 3851 55
+            4147:29(float16_t) CompositeExtract 4143 1
+                              Store 4146 4147
+            4148:   3852(ptr) AccessChain 34(data) 4139 3851 69
+            4149:29(float16_t) CompositeExtract 4143 2
+                              Store 4148 4149
+            4150:      6(int) Load 8(invocation)
+            4151:   3859(ptr) AccessChain 34(data) 73 3851
+            4152: 30(f16vec4) Load 4151
+            4153: 30(f16vec4) GroupNonUniformFMul 42 ExclusiveScan 4152
+            4154:   3859(ptr) AccessChain 34(data) 4150 3851
+                              Store 4154 4153
+            4155:      6(int) Load 8(invocation)
+            4156:   3852(ptr) AccessChain 34(data) 37 3851 38
+            4157:29(float16_t) Load 4156
+            4158:29(float16_t) GroupNonUniformFMin 42 ExclusiveScan 4157
+            4159:   3852(ptr) AccessChain 34(data) 4155 3851 38
+                              Store 4159 4158
+            4160:      6(int) Load 8(invocation)
+            4161:   3859(ptr) AccessChain 34(data) 46 3851
+            4162: 30(f16vec4) Load 4161
+            4163:3858(f16vec2) VectorShuffle 4162 4162 0 1
+            4164:3858(f16vec2) GroupNonUniformFMin 42 ExclusiveScan 4163
+            4165:   3852(ptr) AccessChain 34(data) 4160 3851 38
+            4166:29(float16_t) CompositeExtract 4164 0
+                              Store 4165 4166
+            4167:   3852(ptr) AccessChain 34(data) 4160 3851 55
+            4168:29(float16_t) CompositeExtract 4164 1
+                              Store 4167 4168
+            4169:      6(int) Load 8(invocation)
+            4170:   3859(ptr) AccessChain 34(data) 59 3851
+            4171: 30(f16vec4) Load 4170
+            4172:3869(f16vec3) VectorShuffle 4171 4171 0 1 2
+            4173:3869(f16vec3) GroupNonUniformFMin 42 ExclusiveScan 4172
+            4174:   3852(ptr) AccessChain 34(data) 4169 3851 38
+            4175:29(float16_t) CompositeExtract 4173 0
+                              Store 4174 4175
+            4176:   3852(ptr) AccessChain 34(data) 4169 3851 55
+            4177:29(float16_t) CompositeExtract 4173 1
+                              Store 4176 4177
+            4178:   3852(ptr) AccessChain 34(data) 4169 3851 69
+            4179:29(float16_t) CompositeExtract 4173 2
+                              Store 4178 4179
+            4180:      6(int) Load 8(invocation)
+            4181:   3859(ptr) AccessChain 34(data) 73 3851
+            4182: 30(f16vec4) Load 4181
+            4183: 30(f16vec4) GroupNonUniformFMin 42 ExclusiveScan 4182
+            4184:   3859(ptr) AccessChain 34(data) 4180 3851
+                              Store 4184 4183
+            4185:      6(int) Load 8(invocation)
+            4186:   3852(ptr) AccessChain 34(data) 37 3851 38
+            4187:29(float16_t) Load 4186
+            4188:29(float16_t) GroupNonUniformFMax 42 ExclusiveScan 4187
+            4189:   3852(ptr) AccessChain 34(data) 4185 3851 38
+                              Store 4189 4188
+            4190:      6(int) Load 8(invocation)
+            4191:   3859(ptr) AccessChain 34(data) 46 3851
+            4192: 30(f16vec4) Load 4191
+            4193:3858(f16vec2) VectorShuffle 4192 4192 0 1
+            4194:3858(f16vec2) GroupNonUniformFMax 42 ExclusiveScan 4193
+            4195:   3852(ptr) AccessChain 34(data) 4190 3851 38
+            4196:29(float16_t) CompositeExtract 4194 0
+                              Store 4195 4196
+            4197:   3852(ptr) AccessChain 34(data) 4190 3851 55
+            4198:29(float16_t) CompositeExtract 4194 1
+                              Store 4197 4198
+            4199:      6(int) Load 8(invocation)
+            4200:   3859(ptr) AccessChain 34(data) 59 3851
+            4201: 30(f16vec4) Load 4200
+            4202:3869(f16vec3) VectorShuffle 4201 4201 0 1 2
+            4203:3869(f16vec3) GroupNonUniformFMax 42 ExclusiveScan 4202
+            4204:   3852(ptr) AccessChain 34(data) 4199 3851 38
+            4205:29(float16_t) CompositeExtract 4203 0
+                              Store 4204 4205
+            4206:   3852(ptr) AccessChain 34(data) 4199 3851 55
+            4207:29(float16_t) CompositeExtract 4203 1
+                              Store 4206 4207
+            4208:   3852(ptr) AccessChain 34(data) 4199 3851 69
+            4209:29(float16_t) CompositeExtract 4203 2
+                              Store 4208 4209
+            4210:      6(int) Load 8(invocation)
+            4211:   3859(ptr) AccessChain 34(data) 73 3851
+            4212: 30(f16vec4) Load 4211
+            4213: 30(f16vec4) GroupNonUniformFMax 42 ExclusiveScan 4212
+            4214:   3859(ptr) AccessChain 34(data) 4210 3851
+                              Store 4214 4213
                               Return
                               FunctionEnd
diff --git a/third_party/vulkan-deps/glslang/src/Test/baseResults/spv.subgroupExtendedTypesBallot.comp.out b/third_party/vulkan-deps/glslang/src/Test/baseResults/spv.subgroupExtendedTypesBallot.comp.out
index f503f8c..60f01bc 100644
--- a/third_party/vulkan-deps/glslang/src/Test/baseResults/spv.subgroupExtendedTypesBallot.comp.out
+++ b/third_party/vulkan-deps/glslang/src/Test/baseResults/spv.subgroupExtendedTypesBallot.comp.out
@@ -1,7 +1,7 @@
 spv.subgroupExtendedTypesBallot.comp
 // Module Version 10300
 // Generated by (magic number): 8000a
-// Id's are bound by 441
+// Id's are bound by 498
 
                               Capability Shader
                               Capability Float16
@@ -59,7 +59,7 @@
                               Decorate 31(Buffers) Block
                               Decorate 34(data) DescriptorSet 0
                               Decorate 34(data) Binding 0
-                              Decorate 440 BuiltIn WorkgroupSize
+                              Decorate 497 BuiltIn WorkgroupSize
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeInt 32 0
@@ -94,40 +94,41 @@
               46:     36(int) Constant 1
               47:             TypeVector 17(int8_t) 2
               48:             TypePointer StorageBuffer 18(i8vec4)
-              57:     36(int) Constant 2
-              58:             TypeVector 17(int8_t) 3
-              67:     36(int) Constant 3
-              99:             TypePointer StorageBuffer 19(int8_t)
-             105:             TypeVector 19(int8_t) 2
-             106:             TypePointer StorageBuffer 20(i8vec4)
-             115:             TypeVector 19(int8_t) 3
-             155:             TypePointer StorageBuffer 21(int16_t)
-             161:             TypeVector 21(int16_t) 2
-             162:             TypePointer StorageBuffer 22(i16vec4)
-             171:             TypeVector 21(int16_t) 3
-             211:             TypePointer StorageBuffer 23(int16_t)
-             217:             TypeVector 23(int16_t) 2
-             218:             TypePointer StorageBuffer 24(i16vec4)
-             227:             TypeVector 23(int16_t) 3
-             267:     36(int) Constant 4
-             268:             TypePointer StorageBuffer 25(int64_t)
-             274:             TypeVector 25(int64_t) 2
-             275:             TypePointer StorageBuffer 26(i64vec4)
-             284:             TypeVector 25(int64_t) 3
-             324:     36(int) Constant 5
-             325:             TypePointer StorageBuffer 27(int64_t)
-             331:             TypeVector 27(int64_t) 2
-             332:             TypePointer StorageBuffer 28(i64vec4)
-             341:             TypeVector 27(int64_t) 3
-             381:     36(int) Constant 6
-             382:             TypePointer StorageBuffer 29(float16_t)
-             388:             TypeVector 29(float16_t) 2
-             389:             TypePointer StorageBuffer 30(f16vec4)
-             398:             TypeVector 29(float16_t) 3
-             437:             TypeVector 6(int) 3
-             438:      6(int) Constant 8
-             439:      6(int) Constant 1
-             440:  437(ivec3) ConstantComposite 438 439 439
+              55:      6(int) Constant 1
+              59:     36(int) Constant 2
+              60:             TypeVector 17(int8_t) 3
+              69:      6(int) Constant 2
+              73:     36(int) Constant 3
+             109:             TypePointer StorageBuffer 19(int8_t)
+             115:             TypeVector 19(int8_t) 2
+             116:             TypePointer StorageBuffer 20(i8vec4)
+             126:             TypeVector 19(int8_t) 3
+             173:             TypePointer StorageBuffer 21(int16_t)
+             179:             TypeVector 21(int16_t) 2
+             180:             TypePointer StorageBuffer 22(i16vec4)
+             190:             TypeVector 21(int16_t) 3
+             237:             TypePointer StorageBuffer 23(int16_t)
+             243:             TypeVector 23(int16_t) 2
+             244:             TypePointer StorageBuffer 24(i16vec4)
+             254:             TypeVector 23(int16_t) 3
+             301:     36(int) Constant 4
+             302:             TypePointer StorageBuffer 25(int64_t)
+             308:             TypeVector 25(int64_t) 2
+             309:             TypePointer StorageBuffer 26(i64vec4)
+             319:             TypeVector 25(int64_t) 3
+             366:     36(int) Constant 5
+             367:             TypePointer StorageBuffer 27(int64_t)
+             373:             TypeVector 27(int64_t) 2
+             374:             TypePointer StorageBuffer 28(i64vec4)
+             384:             TypeVector 27(int64_t) 3
+             431:     36(int) Constant 6
+             432:             TypePointer StorageBuffer 29(float16_t)
+             438:             TypeVector 29(float16_t) 2
+             439:             TypePointer StorageBuffer 30(f16vec4)
+             449:             TypeVector 29(float16_t) 3
+             495:             TypeVector 6(int) 3
+             496:      6(int) Constant 8
+             497:  495(ivec3) ConstantComposite 496 55 55
          4(main):           2 Function None 3
                5:             Label
    8(invocation):      7(ptr) Variable Function
@@ -147,414 +148,512 @@
               50:  18(i8vec4) Load 49
               51:  47(i8vec2) VectorShuffle 50 50 0 1
               52:  47(i8vec2) GroupNonUniformBroadcast 42 51 42
-              53:     48(ptr) AccessChain 34(data) 45 37
-              54:  18(i8vec4) Load 53
-              55:  18(i8vec4) VectorShuffle 54 52 4 5 2 3
-                              Store 53 55
-              56:      6(int) Load 8(invocation)
-              59:     48(ptr) AccessChain 34(data) 57 37
-              60:  18(i8vec4) Load 59
-              61:  58(i8vec3) VectorShuffle 60 60 0 1 2
-              62:  58(i8vec3) GroupNonUniformBroadcast 42 61 42
-              63:     48(ptr) AccessChain 34(data) 56 37
-              64:  18(i8vec4) Load 63
-              65:  18(i8vec4) VectorShuffle 64 62 4 5 6 3
-                              Store 63 65
-              66:      6(int) Load 8(invocation)
-              68:     48(ptr) AccessChain 34(data) 67 37
-              69:  18(i8vec4) Load 68
-              70:  18(i8vec4) GroupNonUniformBroadcast 42 69 42
-              71:     48(ptr) AccessChain 34(data) 66 37
-                              Store 71 70
+              53:     39(ptr) AccessChain 34(data) 45 37 38
+              54:  17(int8_t) CompositeExtract 52 0
+                              Store 53 54
+              56:     39(ptr) AccessChain 34(data) 45 37 55
+              57:  17(int8_t) CompositeExtract 52 1
+                              Store 56 57
+              58:      6(int) Load 8(invocation)
+              61:     48(ptr) AccessChain 34(data) 59 37
+              62:  18(i8vec4) Load 61
+              63:  60(i8vec3) VectorShuffle 62 62 0 1 2
+              64:  60(i8vec3) GroupNonUniformBroadcast 42 63 42
+              65:     39(ptr) AccessChain 34(data) 58 37 38
+              66:  17(int8_t) CompositeExtract 64 0
+                              Store 65 66
+              67:     39(ptr) AccessChain 34(data) 58 37 55
+              68:  17(int8_t) CompositeExtract 64 1
+                              Store 67 68
+              70:     39(ptr) AccessChain 34(data) 58 37 69
+              71:  17(int8_t) CompositeExtract 64 2
+                              Store 70 71
               72:      6(int) Load 8(invocation)
-              73:     39(ptr) AccessChain 34(data) 37 37 38
-              74:  17(int8_t) Load 73
-              75:  17(int8_t) GroupNonUniformBroadcastFirst 42 74
-              76:     39(ptr) AccessChain 34(data) 72 37 38
-                              Store 76 75
-              77:      6(int) Load 8(invocation)
-              78:     48(ptr) AccessChain 34(data) 46 37
-              79:  18(i8vec4) Load 78
-              80:  47(i8vec2) VectorShuffle 79 79 0 1
-              81:  47(i8vec2) GroupNonUniformBroadcastFirst 42 80
-              82:     48(ptr) AccessChain 34(data) 77 37
-              83:  18(i8vec4) Load 82
-              84:  18(i8vec4) VectorShuffle 83 81 4 5 2 3
-                              Store 82 84
-              85:      6(int) Load 8(invocation)
-              86:     48(ptr) AccessChain 34(data) 57 37
-              87:  18(i8vec4) Load 86
-              88:  58(i8vec3) VectorShuffle 87 87 0 1 2
-              89:  58(i8vec3) GroupNonUniformBroadcastFirst 42 88
-              90:     48(ptr) AccessChain 34(data) 85 37
-              91:  18(i8vec4) Load 90
-              92:  18(i8vec4) VectorShuffle 91 89 4 5 6 3
-                              Store 90 92
-              93:      6(int) Load 8(invocation)
-              94:     48(ptr) AccessChain 34(data) 67 37
-              95:  18(i8vec4) Load 94
-              96:  18(i8vec4) GroupNonUniformBroadcastFirst 42 95
-              97:     48(ptr) AccessChain 34(data) 93 37
-                              Store 97 96
-              98:      6(int) Load 8(invocation)
-             100:     99(ptr) AccessChain 34(data) 37 46 38
-             101:  19(int8_t) Load 100
-             102:  19(int8_t) GroupNonUniformBroadcast 42 101 42
-             103:     99(ptr) AccessChain 34(data) 98 46 38
-                              Store 103 102
-             104:      6(int) Load 8(invocation)
-             107:    106(ptr) AccessChain 34(data) 46 46
-             108:  20(i8vec4) Load 107
-             109: 105(i8vec2) VectorShuffle 108 108 0 1
-             110: 105(i8vec2) GroupNonUniformBroadcast 42 109 42
-             111:    106(ptr) AccessChain 34(data) 104 46
-             112:  20(i8vec4) Load 111
-             113:  20(i8vec4) VectorShuffle 112 110 4 5 2 3
-                              Store 111 113
+              74:     48(ptr) AccessChain 34(data) 73 37
+              75:  18(i8vec4) Load 74
+              76:  18(i8vec4) GroupNonUniformBroadcast 42 75 42
+              77:     48(ptr) AccessChain 34(data) 72 37
+                              Store 77 76
+              78:      6(int) Load 8(invocation)
+              79:     39(ptr) AccessChain 34(data) 37 37 38
+              80:  17(int8_t) Load 79
+              81:  17(int8_t) GroupNonUniformBroadcastFirst 42 80
+              82:     39(ptr) AccessChain 34(data) 78 37 38
+                              Store 82 81
+              83:      6(int) Load 8(invocation)
+              84:     48(ptr) AccessChain 34(data) 46 37
+              85:  18(i8vec4) Load 84
+              86:  47(i8vec2) VectorShuffle 85 85 0 1
+              87:  47(i8vec2) GroupNonUniformBroadcastFirst 42 86
+              88:     39(ptr) AccessChain 34(data) 83 37 38
+              89:  17(int8_t) CompositeExtract 87 0
+                              Store 88 89
+              90:     39(ptr) AccessChain 34(data) 83 37 55
+              91:  17(int8_t) CompositeExtract 87 1
+                              Store 90 91
+              92:      6(int) Load 8(invocation)
+              93:     48(ptr) AccessChain 34(data) 59 37
+              94:  18(i8vec4) Load 93
+              95:  60(i8vec3) VectorShuffle 94 94 0 1 2
+              96:  60(i8vec3) GroupNonUniformBroadcastFirst 42 95
+              97:     39(ptr) AccessChain 34(data) 92 37 38
+              98:  17(int8_t) CompositeExtract 96 0
+                              Store 97 98
+              99:     39(ptr) AccessChain 34(data) 92 37 55
+             100:  17(int8_t) CompositeExtract 96 1
+                              Store 99 100
+             101:     39(ptr) AccessChain 34(data) 92 37 69
+             102:  17(int8_t) CompositeExtract 96 2
+                              Store 101 102
+             103:      6(int) Load 8(invocation)
+             104:     48(ptr) AccessChain 34(data) 73 37
+             105:  18(i8vec4) Load 104
+             106:  18(i8vec4) GroupNonUniformBroadcastFirst 42 105
+             107:     48(ptr) AccessChain 34(data) 103 37
+                              Store 107 106
+             108:      6(int) Load 8(invocation)
+             110:    109(ptr) AccessChain 34(data) 37 46 38
+             111:  19(int8_t) Load 110
+             112:  19(int8_t) GroupNonUniformBroadcast 42 111 42
+             113:    109(ptr) AccessChain 34(data) 108 46 38
+                              Store 113 112
              114:      6(int) Load 8(invocation)
-             116:    106(ptr) AccessChain 34(data) 57 46
-             117:  20(i8vec4) Load 116
-             118: 115(i8vec3) VectorShuffle 117 117 0 1 2
-             119: 115(i8vec3) GroupNonUniformBroadcast 42 118 42
-             120:    106(ptr) AccessChain 34(data) 114 46
-             121:  20(i8vec4) Load 120
-             122:  20(i8vec4) VectorShuffle 121 119 4 5 6 3
-                              Store 120 122
-             123:      6(int) Load 8(invocation)
-             124:    106(ptr) AccessChain 34(data) 67 46
-             125:  20(i8vec4) Load 124
-             126:  20(i8vec4) GroupNonUniformBroadcast 42 125 42
-             127:    106(ptr) AccessChain 34(data) 123 46
-                              Store 127 126
-             128:      6(int) Load 8(invocation)
-             129:     99(ptr) AccessChain 34(data) 37 46 38
-             130:  19(int8_t) Load 129
-             131:  19(int8_t) GroupNonUniformBroadcastFirst 42 130
-             132:     99(ptr) AccessChain 34(data) 128 46 38
-                              Store 132 131
-             133:      6(int) Load 8(invocation)
-             134:    106(ptr) AccessChain 34(data) 46 46
-             135:  20(i8vec4) Load 134
-             136: 105(i8vec2) VectorShuffle 135 135 0 1
-             137: 105(i8vec2) GroupNonUniformBroadcastFirst 42 136
-             138:    106(ptr) AccessChain 34(data) 133 46
+             117:    116(ptr) AccessChain 34(data) 46 46
+             118:  20(i8vec4) Load 117
+             119: 115(i8vec2) VectorShuffle 118 118 0 1
+             120: 115(i8vec2) GroupNonUniformBroadcast 42 119 42
+             121:    109(ptr) AccessChain 34(data) 114 46 38
+             122:  19(int8_t) CompositeExtract 120 0
+                              Store 121 122
+             123:    109(ptr) AccessChain 34(data) 114 46 55
+             124:  19(int8_t) CompositeExtract 120 1
+                              Store 123 124
+             125:      6(int) Load 8(invocation)
+             127:    116(ptr) AccessChain 34(data) 59 46
+             128:  20(i8vec4) Load 127
+             129: 126(i8vec3) VectorShuffle 128 128 0 1 2
+             130: 126(i8vec3) GroupNonUniformBroadcast 42 129 42
+             131:    109(ptr) AccessChain 34(data) 125 46 38
+             132:  19(int8_t) CompositeExtract 130 0
+                              Store 131 132
+             133:    109(ptr) AccessChain 34(data) 125 46 55
+             134:  19(int8_t) CompositeExtract 130 1
+                              Store 133 134
+             135:    109(ptr) AccessChain 34(data) 125 46 69
+             136:  19(int8_t) CompositeExtract 130 2
+                              Store 135 136
+             137:      6(int) Load 8(invocation)
+             138:    116(ptr) AccessChain 34(data) 73 46
              139:  20(i8vec4) Load 138
-             140:  20(i8vec4) VectorShuffle 139 137 4 5 2 3
-                              Store 138 140
-             141:      6(int) Load 8(invocation)
-             142:    106(ptr) AccessChain 34(data) 57 46
-             143:  20(i8vec4) Load 142
-             144: 115(i8vec3) VectorShuffle 143 143 0 1 2
-             145: 115(i8vec3) GroupNonUniformBroadcastFirst 42 144
-             146:    106(ptr) AccessChain 34(data) 141 46
-             147:  20(i8vec4) Load 146
-             148:  20(i8vec4) VectorShuffle 147 145 4 5 6 3
-                              Store 146 148
-             149:      6(int) Load 8(invocation)
-             150:    106(ptr) AccessChain 34(data) 67 46
-             151:  20(i8vec4) Load 150
-             152:  20(i8vec4) GroupNonUniformBroadcastFirst 42 151
-             153:    106(ptr) AccessChain 34(data) 149 46
-                              Store 153 152
-             154:      6(int) Load 8(invocation)
-             156:    155(ptr) AccessChain 34(data) 37 57 38
-             157: 21(int16_t) Load 156
-             158: 21(int16_t) GroupNonUniformBroadcast 42 157 42
-             159:    155(ptr) AccessChain 34(data) 154 57 38
-                              Store 159 158
-             160:      6(int) Load 8(invocation)
-             163:    162(ptr) AccessChain 34(data) 46 57
-             164: 22(i16vec4) Load 163
-             165:161(i16vec2) VectorShuffle 164 164 0 1
-             166:161(i16vec2) GroupNonUniformBroadcast 42 165 42
-             167:    162(ptr) AccessChain 34(data) 160 57
-             168: 22(i16vec4) Load 167
-             169: 22(i16vec4) VectorShuffle 168 166 4 5 2 3
-                              Store 167 169
-             170:      6(int) Load 8(invocation)
-             172:    162(ptr) AccessChain 34(data) 57 57
-             173: 22(i16vec4) Load 172
-             174:171(i16vec3) VectorShuffle 173 173 0 1 2
-             175:171(i16vec3) GroupNonUniformBroadcast 42 174 42
-             176:    162(ptr) AccessChain 34(data) 170 57
-             177: 22(i16vec4) Load 176
-             178: 22(i16vec4) VectorShuffle 177 175 4 5 6 3
-                              Store 176 178
-             179:      6(int) Load 8(invocation)
-             180:    162(ptr) AccessChain 34(data) 67 57
-             181: 22(i16vec4) Load 180
-             182: 22(i16vec4) GroupNonUniformBroadcast 42 181 42
-             183:    162(ptr) AccessChain 34(data) 179 57
-                              Store 183 182
-             184:      6(int) Load 8(invocation)
-             185:    155(ptr) AccessChain 34(data) 37 57 38
-             186: 21(int16_t) Load 185
-             187: 21(int16_t) GroupNonUniformBroadcastFirst 42 186
-             188:    155(ptr) AccessChain 34(data) 184 57 38
-                              Store 188 187
+             140:  20(i8vec4) GroupNonUniformBroadcast 42 139 42
+             141:    116(ptr) AccessChain 34(data) 137 46
+                              Store 141 140
+             142:      6(int) Load 8(invocation)
+             143:    109(ptr) AccessChain 34(data) 37 46 38
+             144:  19(int8_t) Load 143
+             145:  19(int8_t) GroupNonUniformBroadcastFirst 42 144
+             146:    109(ptr) AccessChain 34(data) 142 46 38
+                              Store 146 145
+             147:      6(int) Load 8(invocation)
+             148:    116(ptr) AccessChain 34(data) 46 46
+             149:  20(i8vec4) Load 148
+             150: 115(i8vec2) VectorShuffle 149 149 0 1
+             151: 115(i8vec2) GroupNonUniformBroadcastFirst 42 150
+             152:    109(ptr) AccessChain 34(data) 147 46 38
+             153:  19(int8_t) CompositeExtract 151 0
+                              Store 152 153
+             154:    109(ptr) AccessChain 34(data) 147 46 55
+             155:  19(int8_t) CompositeExtract 151 1
+                              Store 154 155
+             156:      6(int) Load 8(invocation)
+             157:    116(ptr) AccessChain 34(data) 59 46
+             158:  20(i8vec4) Load 157
+             159: 126(i8vec3) VectorShuffle 158 158 0 1 2
+             160: 126(i8vec3) GroupNonUniformBroadcastFirst 42 159
+             161:    109(ptr) AccessChain 34(data) 156 46 38
+             162:  19(int8_t) CompositeExtract 160 0
+                              Store 161 162
+             163:    109(ptr) AccessChain 34(data) 156 46 55
+             164:  19(int8_t) CompositeExtract 160 1
+                              Store 163 164
+             165:    109(ptr) AccessChain 34(data) 156 46 69
+             166:  19(int8_t) CompositeExtract 160 2
+                              Store 165 166
+             167:      6(int) Load 8(invocation)
+             168:    116(ptr) AccessChain 34(data) 73 46
+             169:  20(i8vec4) Load 168
+             170:  20(i8vec4) GroupNonUniformBroadcastFirst 42 169
+             171:    116(ptr) AccessChain 34(data) 167 46
+                              Store 171 170
+             172:      6(int) Load 8(invocation)
+             174:    173(ptr) AccessChain 34(data) 37 59 38
+             175: 21(int16_t) Load 174
+             176: 21(int16_t) GroupNonUniformBroadcast 42 175 42
+             177:    173(ptr) AccessChain 34(data) 172 59 38
+                              Store 177 176
+             178:      6(int) Load 8(invocation)
+             181:    180(ptr) AccessChain 34(data) 46 59
+             182: 22(i16vec4) Load 181
+             183:179(i16vec2) VectorShuffle 182 182 0 1
+             184:179(i16vec2) GroupNonUniformBroadcast 42 183 42
+             185:    173(ptr) AccessChain 34(data) 178 59 38
+             186: 21(int16_t) CompositeExtract 184 0
+                              Store 185 186
+             187:    173(ptr) AccessChain 34(data) 178 59 55
+             188: 21(int16_t) CompositeExtract 184 1
+                              Store 187 188
              189:      6(int) Load 8(invocation)
-             190:    162(ptr) AccessChain 34(data) 46 57
-             191: 22(i16vec4) Load 190
-             192:161(i16vec2) VectorShuffle 191 191 0 1
-             193:161(i16vec2) GroupNonUniformBroadcastFirst 42 192
-             194:    162(ptr) AccessChain 34(data) 189 57
-             195: 22(i16vec4) Load 194
-             196: 22(i16vec4) VectorShuffle 195 193 4 5 2 3
-                              Store 194 196
-             197:      6(int) Load 8(invocation)
-             198:    162(ptr) AccessChain 34(data) 57 57
-             199: 22(i16vec4) Load 198
-             200:171(i16vec3) VectorShuffle 199 199 0 1 2
-             201:171(i16vec3) GroupNonUniformBroadcastFirst 42 200
-             202:    162(ptr) AccessChain 34(data) 197 57
+             191:    180(ptr) AccessChain 34(data) 59 59
+             192: 22(i16vec4) Load 191
+             193:190(i16vec3) VectorShuffle 192 192 0 1 2
+             194:190(i16vec3) GroupNonUniformBroadcast 42 193 42
+             195:    173(ptr) AccessChain 34(data) 189 59 38
+             196: 21(int16_t) CompositeExtract 194 0
+                              Store 195 196
+             197:    173(ptr) AccessChain 34(data) 189 59 55
+             198: 21(int16_t) CompositeExtract 194 1
+                              Store 197 198
+             199:    173(ptr) AccessChain 34(data) 189 59 69
+             200: 21(int16_t) CompositeExtract 194 2
+                              Store 199 200
+             201:      6(int) Load 8(invocation)
+             202:    180(ptr) AccessChain 34(data) 73 59
              203: 22(i16vec4) Load 202
-             204: 22(i16vec4) VectorShuffle 203 201 4 5 6 3
-                              Store 202 204
-             205:      6(int) Load 8(invocation)
-             206:    162(ptr) AccessChain 34(data) 67 57
-             207: 22(i16vec4) Load 206
-             208: 22(i16vec4) GroupNonUniformBroadcastFirst 42 207
-             209:    162(ptr) AccessChain 34(data) 205 57
-                              Store 209 208
-             210:      6(int) Load 8(invocation)
-             212:    211(ptr) AccessChain 34(data) 37 67 38
-             213: 23(int16_t) Load 212
-             214: 23(int16_t) GroupNonUniformBroadcast 42 213 42
-             215:    211(ptr) AccessChain 34(data) 210 67 38
-                              Store 215 214
-             216:      6(int) Load 8(invocation)
-             219:    218(ptr) AccessChain 34(data) 46 67
-             220: 24(i16vec4) Load 219
-             221:217(i16vec2) VectorShuffle 220 220 0 1
-             222:217(i16vec2) GroupNonUniformBroadcast 42 221 42
-             223:    218(ptr) AccessChain 34(data) 216 67
-             224: 24(i16vec4) Load 223
-             225: 24(i16vec4) VectorShuffle 224 222 4 5 2 3
-                              Store 223 225
-             226:      6(int) Load 8(invocation)
-             228:    218(ptr) AccessChain 34(data) 57 67
-             229: 24(i16vec4) Load 228
-             230:227(i16vec3) VectorShuffle 229 229 0 1 2
-             231:227(i16vec3) GroupNonUniformBroadcast 42 230 42
-             232:    218(ptr) AccessChain 34(data) 226 67
-             233: 24(i16vec4) Load 232
-             234: 24(i16vec4) VectorShuffle 233 231 4 5 6 3
-                              Store 232 234
-             235:      6(int) Load 8(invocation)
-             236:    218(ptr) AccessChain 34(data) 67 67
-             237: 24(i16vec4) Load 236
-             238: 24(i16vec4) GroupNonUniformBroadcast 42 237 42
-             239:    218(ptr) AccessChain 34(data) 235 67
-                              Store 239 238
-             240:      6(int) Load 8(invocation)
-             241:    211(ptr) AccessChain 34(data) 37 67 38
-             242: 23(int16_t) Load 241
-             243: 23(int16_t) GroupNonUniformBroadcastFirst 42 242
-             244:    211(ptr) AccessChain 34(data) 240 67 38
-                              Store 244 243
-             245:      6(int) Load 8(invocation)
-             246:    218(ptr) AccessChain 34(data) 46 67
-             247: 24(i16vec4) Load 246
-             248:217(i16vec2) VectorShuffle 247 247 0 1
-             249:217(i16vec2) GroupNonUniformBroadcastFirst 42 248
-             250:    218(ptr) AccessChain 34(data) 245 67
-             251: 24(i16vec4) Load 250
-             252: 24(i16vec4) VectorShuffle 251 249 4 5 2 3
-                              Store 250 252
+             204: 22(i16vec4) GroupNonUniformBroadcast 42 203 42
+             205:    180(ptr) AccessChain 34(data) 201 59
+                              Store 205 204
+             206:      6(int) Load 8(invocation)
+             207:    173(ptr) AccessChain 34(data) 37 59 38
+             208: 21(int16_t) Load 207
+             209: 21(int16_t) GroupNonUniformBroadcastFirst 42 208
+             210:    173(ptr) AccessChain 34(data) 206 59 38
+                              Store 210 209
+             211:      6(int) Load 8(invocation)
+             212:    180(ptr) AccessChain 34(data) 46 59
+             213: 22(i16vec4) Load 212
+             214:179(i16vec2) VectorShuffle 213 213 0 1
+             215:179(i16vec2) GroupNonUniformBroadcastFirst 42 214
+             216:    173(ptr) AccessChain 34(data) 211 59 38
+             217: 21(int16_t) CompositeExtract 215 0
+                              Store 216 217
+             218:    173(ptr) AccessChain 34(data) 211 59 55
+             219: 21(int16_t) CompositeExtract 215 1
+                              Store 218 219
+             220:      6(int) Load 8(invocation)
+             221:    180(ptr) AccessChain 34(data) 59 59
+             222: 22(i16vec4) Load 221
+             223:190(i16vec3) VectorShuffle 222 222 0 1 2
+             224:190(i16vec3) GroupNonUniformBroadcastFirst 42 223
+             225:    173(ptr) AccessChain 34(data) 220 59 38
+             226: 21(int16_t) CompositeExtract 224 0
+                              Store 225 226
+             227:    173(ptr) AccessChain 34(data) 220 59 55
+             228: 21(int16_t) CompositeExtract 224 1
+                              Store 227 228
+             229:    173(ptr) AccessChain 34(data) 220 59 69
+             230: 21(int16_t) CompositeExtract 224 2
+                              Store 229 230
+             231:      6(int) Load 8(invocation)
+             232:    180(ptr) AccessChain 34(data) 73 59
+             233: 22(i16vec4) Load 232
+             234: 22(i16vec4) GroupNonUniformBroadcastFirst 42 233
+             235:    180(ptr) AccessChain 34(data) 231 59
+                              Store 235 234
+             236:      6(int) Load 8(invocation)
+             238:    237(ptr) AccessChain 34(data) 37 73 38
+             239: 23(int16_t) Load 238
+             240: 23(int16_t) GroupNonUniformBroadcast 42 239 42
+             241:    237(ptr) AccessChain 34(data) 236 73 38
+                              Store 241 240
+             242:      6(int) Load 8(invocation)
+             245:    244(ptr) AccessChain 34(data) 46 73
+             246: 24(i16vec4) Load 245
+             247:243(i16vec2) VectorShuffle 246 246 0 1
+             248:243(i16vec2) GroupNonUniformBroadcast 42 247 42
+             249:    237(ptr) AccessChain 34(data) 242 73 38
+             250: 23(int16_t) CompositeExtract 248 0
+                              Store 249 250
+             251:    237(ptr) AccessChain 34(data) 242 73 55
+             252: 23(int16_t) CompositeExtract 248 1
+                              Store 251 252
              253:      6(int) Load 8(invocation)
-             254:    218(ptr) AccessChain 34(data) 57 67
-             255: 24(i16vec4) Load 254
-             256:227(i16vec3) VectorShuffle 255 255 0 1 2
-             257:227(i16vec3) GroupNonUniformBroadcastFirst 42 256
-             258:    218(ptr) AccessChain 34(data) 253 67
-             259: 24(i16vec4) Load 258
-             260: 24(i16vec4) VectorShuffle 259 257 4 5 6 3
-                              Store 258 260
-             261:      6(int) Load 8(invocation)
-             262:    218(ptr) AccessChain 34(data) 67 67
-             263: 24(i16vec4) Load 262
-             264: 24(i16vec4) GroupNonUniformBroadcastFirst 42 263
-             265:    218(ptr) AccessChain 34(data) 261 67
-                              Store 265 264
-             266:      6(int) Load 8(invocation)
-             269:    268(ptr) AccessChain 34(data) 37 267 38
-             270: 25(int64_t) Load 269
-             271: 25(int64_t) GroupNonUniformBroadcast 42 270 42
-             272:    268(ptr) AccessChain 34(data) 266 267 38
-                              Store 272 271
-             273:      6(int) Load 8(invocation)
-             276:    275(ptr) AccessChain 34(data) 46 267
-             277: 26(i64vec4) Load 276
-             278:274(i64vec2) VectorShuffle 277 277 0 1
-             279:274(i64vec2) GroupNonUniformBroadcast 42 278 42
-             280:    275(ptr) AccessChain 34(data) 273 267
-             281: 26(i64vec4) Load 280
-             282: 26(i64vec4) VectorShuffle 281 279 4 5 2 3
-                              Store 280 282
-             283:      6(int) Load 8(invocation)
-             285:    275(ptr) AccessChain 34(data) 57 267
-             286: 26(i64vec4) Load 285
-             287:284(i64vec3) VectorShuffle 286 286 0 1 2
-             288:284(i64vec3) GroupNonUniformBroadcast 42 287 42
-             289:    275(ptr) AccessChain 34(data) 283 267
-             290: 26(i64vec4) Load 289
-             291: 26(i64vec4) VectorShuffle 290 288 4 5 6 3
-                              Store 289 291
-             292:      6(int) Load 8(invocation)
-             293:    275(ptr) AccessChain 34(data) 67 267
-             294: 26(i64vec4) Load 293
-             295: 26(i64vec4) GroupNonUniformBroadcast 42 294 42
-             296:    275(ptr) AccessChain 34(data) 292 267
-                              Store 296 295
-             297:      6(int) Load 8(invocation)
-             298:    268(ptr) AccessChain 34(data) 37 267 38
-             299: 25(int64_t) Load 298
-             300: 25(int64_t) GroupNonUniformBroadcastFirst 42 299
-             301:    268(ptr) AccessChain 34(data) 297 267 38
-                              Store 301 300
-             302:      6(int) Load 8(invocation)
-             303:    275(ptr) AccessChain 34(data) 46 267
-             304: 26(i64vec4) Load 303
-             305:274(i64vec2) VectorShuffle 304 304 0 1
-             306:274(i64vec2) GroupNonUniformBroadcastFirst 42 305
-             307:    275(ptr) AccessChain 34(data) 302 267
-             308: 26(i64vec4) Load 307
-             309: 26(i64vec4) VectorShuffle 308 306 4 5 2 3
-                              Store 307 309
-             310:      6(int) Load 8(invocation)
-             311:    275(ptr) AccessChain 34(data) 57 267
-             312: 26(i64vec4) Load 311
-             313:284(i64vec3) VectorShuffle 312 312 0 1 2
-             314:284(i64vec3) GroupNonUniformBroadcastFirst 42 313
-             315:    275(ptr) AccessChain 34(data) 310 267
-             316: 26(i64vec4) Load 315
-             317: 26(i64vec4) VectorShuffle 316 314 4 5 6 3
-                              Store 315 317
+             255:    244(ptr) AccessChain 34(data) 59 73
+             256: 24(i16vec4) Load 255
+             257:254(i16vec3) VectorShuffle 256 256 0 1 2
+             258:254(i16vec3) GroupNonUniformBroadcast 42 257 42
+             259:    237(ptr) AccessChain 34(data) 253 73 38
+             260: 23(int16_t) CompositeExtract 258 0
+                              Store 259 260
+             261:    237(ptr) AccessChain 34(data) 253 73 55
+             262: 23(int16_t) CompositeExtract 258 1
+                              Store 261 262
+             263:    237(ptr) AccessChain 34(data) 253 73 69
+             264: 23(int16_t) CompositeExtract 258 2
+                              Store 263 264
+             265:      6(int) Load 8(invocation)
+             266:    244(ptr) AccessChain 34(data) 73 73
+             267: 24(i16vec4) Load 266
+             268: 24(i16vec4) GroupNonUniformBroadcast 42 267 42
+             269:    244(ptr) AccessChain 34(data) 265 73
+                              Store 269 268
+             270:      6(int) Load 8(invocation)
+             271:    237(ptr) AccessChain 34(data) 37 73 38
+             272: 23(int16_t) Load 271
+             273: 23(int16_t) GroupNonUniformBroadcastFirst 42 272
+             274:    237(ptr) AccessChain 34(data) 270 73 38
+                              Store 274 273
+             275:      6(int) Load 8(invocation)
+             276:    244(ptr) AccessChain 34(data) 46 73
+             277: 24(i16vec4) Load 276
+             278:243(i16vec2) VectorShuffle 277 277 0 1
+             279:243(i16vec2) GroupNonUniformBroadcastFirst 42 278
+             280:    237(ptr) AccessChain 34(data) 275 73 38
+             281: 23(int16_t) CompositeExtract 279 0
+                              Store 280 281
+             282:    237(ptr) AccessChain 34(data) 275 73 55
+             283: 23(int16_t) CompositeExtract 279 1
+                              Store 282 283
+             284:      6(int) Load 8(invocation)
+             285:    244(ptr) AccessChain 34(data) 59 73
+             286: 24(i16vec4) Load 285
+             287:254(i16vec3) VectorShuffle 286 286 0 1 2
+             288:254(i16vec3) GroupNonUniformBroadcastFirst 42 287
+             289:    237(ptr) AccessChain 34(data) 284 73 38
+             290: 23(int16_t) CompositeExtract 288 0
+                              Store 289 290
+             291:    237(ptr) AccessChain 34(data) 284 73 55
+             292: 23(int16_t) CompositeExtract 288 1
+                              Store 291 292
+             293:    237(ptr) AccessChain 34(data) 284 73 69
+             294: 23(int16_t) CompositeExtract 288 2
+                              Store 293 294
+             295:      6(int) Load 8(invocation)
+             296:    244(ptr) AccessChain 34(data) 73 73
+             297: 24(i16vec4) Load 296
+             298: 24(i16vec4) GroupNonUniformBroadcastFirst 42 297
+             299:    244(ptr) AccessChain 34(data) 295 73
+                              Store 299 298
+             300:      6(int) Load 8(invocation)
+             303:    302(ptr) AccessChain 34(data) 37 301 38
+             304: 25(int64_t) Load 303
+             305: 25(int64_t) GroupNonUniformBroadcast 42 304 42
+             306:    302(ptr) AccessChain 34(data) 300 301 38
+                              Store 306 305
+             307:      6(int) Load 8(invocation)
+             310:    309(ptr) AccessChain 34(data) 46 301
+             311: 26(i64vec4) Load 310
+             312:308(i64vec2) VectorShuffle 311 311 0 1
+             313:308(i64vec2) GroupNonUniformBroadcast 42 312 42
+             314:    302(ptr) AccessChain 34(data) 307 301 38
+             315: 25(int64_t) CompositeExtract 313 0
+                              Store 314 315
+             316:    302(ptr) AccessChain 34(data) 307 301 55
+             317: 25(int64_t) CompositeExtract 313 1
+                              Store 316 317
              318:      6(int) Load 8(invocation)
-             319:    275(ptr) AccessChain 34(data) 67 267
-             320: 26(i64vec4) Load 319
-             321: 26(i64vec4) GroupNonUniformBroadcastFirst 42 320
-             322:    275(ptr) AccessChain 34(data) 318 267
-                              Store 322 321
-             323:      6(int) Load 8(invocation)
-             326:    325(ptr) AccessChain 34(data) 37 324 38
-             327: 27(int64_t) Load 326
-             328: 27(int64_t) GroupNonUniformBroadcast 42 327 42
-             329:    325(ptr) AccessChain 34(data) 323 324 38
-                              Store 329 328
+             320:    309(ptr) AccessChain 34(data) 59 301
+             321: 26(i64vec4) Load 320
+             322:319(i64vec3) VectorShuffle 321 321 0 1 2
+             323:319(i64vec3) GroupNonUniformBroadcast 42 322 42
+             324:    302(ptr) AccessChain 34(data) 318 301 38
+             325: 25(int64_t) CompositeExtract 323 0
+                              Store 324 325
+             326:    302(ptr) AccessChain 34(data) 318 301 55
+             327: 25(int64_t) CompositeExtract 323 1
+                              Store 326 327
+             328:    302(ptr) AccessChain 34(data) 318 301 69
+             329: 25(int64_t) CompositeExtract 323 2
+                              Store 328 329
              330:      6(int) Load 8(invocation)
-             333:    332(ptr) AccessChain 34(data) 46 324
-             334: 28(i64vec4) Load 333
-             335:331(i64vec2) VectorShuffle 334 334 0 1
-             336:331(i64vec2) GroupNonUniformBroadcast 42 335 42
-             337:    332(ptr) AccessChain 34(data) 330 324
-             338: 28(i64vec4) Load 337
-             339: 28(i64vec4) VectorShuffle 338 336 4 5 2 3
-                              Store 337 339
+             331:    309(ptr) AccessChain 34(data) 73 301
+             332: 26(i64vec4) Load 331
+             333: 26(i64vec4) GroupNonUniformBroadcast 42 332 42
+             334:    309(ptr) AccessChain 34(data) 330 301
+                              Store 334 333
+             335:      6(int) Load 8(invocation)
+             336:    302(ptr) AccessChain 34(data) 37 301 38
+             337: 25(int64_t) Load 336
+             338: 25(int64_t) GroupNonUniformBroadcastFirst 42 337
+             339:    302(ptr) AccessChain 34(data) 335 301 38
+                              Store 339 338
              340:      6(int) Load 8(invocation)
-             342:    332(ptr) AccessChain 34(data) 57 324
-             343: 28(i64vec4) Load 342
-             344:341(i64vec3) VectorShuffle 343 343 0 1 2
-             345:341(i64vec3) GroupNonUniformBroadcast 42 344 42
-             346:    332(ptr) AccessChain 34(data) 340 324
-             347: 28(i64vec4) Load 346
-             348: 28(i64vec4) VectorShuffle 347 345 4 5 6 3
-                              Store 346 348
+             341:    309(ptr) AccessChain 34(data) 46 301
+             342: 26(i64vec4) Load 341
+             343:308(i64vec2) VectorShuffle 342 342 0 1
+             344:308(i64vec2) GroupNonUniformBroadcastFirst 42 343
+             345:    302(ptr) AccessChain 34(data) 340 301 38
+             346: 25(int64_t) CompositeExtract 344 0
+                              Store 345 346
+             347:    302(ptr) AccessChain 34(data) 340 301 55
+             348: 25(int64_t) CompositeExtract 344 1
+                              Store 347 348
              349:      6(int) Load 8(invocation)
-             350:    332(ptr) AccessChain 34(data) 67 324
-             351: 28(i64vec4) Load 350
-             352: 28(i64vec4) GroupNonUniformBroadcast 42 351 42
-             353:    332(ptr) AccessChain 34(data) 349 324
-                              Store 353 352
-             354:      6(int) Load 8(invocation)
-             355:    325(ptr) AccessChain 34(data) 37 324 38
-             356: 27(int64_t) Load 355
-             357: 27(int64_t) GroupNonUniformBroadcastFirst 42 356
-             358:    325(ptr) AccessChain 34(data) 354 324 38
-                              Store 358 357
-             359:      6(int) Load 8(invocation)
-             360:    332(ptr) AccessChain 34(data) 46 324
-             361: 28(i64vec4) Load 360
-             362:331(i64vec2) VectorShuffle 361 361 0 1
-             363:331(i64vec2) GroupNonUniformBroadcastFirst 42 362
-             364:    332(ptr) AccessChain 34(data) 359 324
-             365: 28(i64vec4) Load 364
-             366: 28(i64vec4) VectorShuffle 365 363 4 5 2 3
-                              Store 364 366
-             367:      6(int) Load 8(invocation)
-             368:    332(ptr) AccessChain 34(data) 57 324
-             369: 28(i64vec4) Load 368
-             370:341(i64vec3) VectorShuffle 369 369 0 1 2
-             371:341(i64vec3) GroupNonUniformBroadcastFirst 42 370
-             372:    332(ptr) AccessChain 34(data) 367 324
-             373: 28(i64vec4) Load 372
-             374: 28(i64vec4) VectorShuffle 373 371 4 5 6 3
-                              Store 372 374
-             375:      6(int) Load 8(invocation)
-             376:    332(ptr) AccessChain 34(data) 67 324
-             377: 28(i64vec4) Load 376
-             378: 28(i64vec4) GroupNonUniformBroadcastFirst 42 377
-             379:    332(ptr) AccessChain 34(data) 375 324
-                              Store 379 378
-             380:      6(int) Load 8(invocation)
-             383:    382(ptr) AccessChain 34(data) 37 381 38
-             384:29(float16_t) Load 383
-             385:29(float16_t) GroupNonUniformBroadcast 42 384 42
-             386:    382(ptr) AccessChain 34(data) 380 381 38
-                              Store 386 385
-             387:      6(int) Load 8(invocation)
-             390:    389(ptr) AccessChain 34(data) 46 381
-             391: 30(f16vec4) Load 390
-             392:388(f16vec2) VectorShuffle 391 391 0 1
-             393:388(f16vec2) GroupNonUniformBroadcast 42 392 42
-             394:    389(ptr) AccessChain 34(data) 387 381
-             395: 30(f16vec4) Load 394
-             396: 30(f16vec4) VectorShuffle 395 393 4 5 2 3
-                              Store 394 396
-             397:      6(int) Load 8(invocation)
-             399:    389(ptr) AccessChain 34(data) 57 381
-             400: 30(f16vec4) Load 399
-             401:398(f16vec3) VectorShuffle 400 400 0 1 2
-             402:398(f16vec3) GroupNonUniformBroadcast 42 401 42
-             403:    389(ptr) AccessChain 34(data) 397 381
-             404: 30(f16vec4) Load 403
-             405: 30(f16vec4) VectorShuffle 404 402 4 5 6 3
-                              Store 403 405
-             406:      6(int) Load 8(invocation)
-             407:    389(ptr) AccessChain 34(data) 67 381
-             408: 30(f16vec4) Load 407
-             409: 30(f16vec4) GroupNonUniformBroadcast 42 408 42
-             410:    389(ptr) AccessChain 34(data) 406 381
-                              Store 410 409
-             411:      6(int) Load 8(invocation)
-             412:    382(ptr) AccessChain 34(data) 37 381 38
-             413:29(float16_t) Load 412
-             414:29(float16_t) GroupNonUniformBroadcastFirst 42 413
-             415:    382(ptr) AccessChain 34(data) 411 381 38
-                              Store 415 414
-             416:      6(int) Load 8(invocation)
-             417:    389(ptr) AccessChain 34(data) 46 381
-             418: 30(f16vec4) Load 417
-             419:388(f16vec2) VectorShuffle 418 418 0 1
-             420:388(f16vec2) GroupNonUniformBroadcastFirst 42 419
-             421:    389(ptr) AccessChain 34(data) 416 381
-             422: 30(f16vec4) Load 421
-             423: 30(f16vec4) VectorShuffle 422 420 4 5 2 3
-                              Store 421 423
-             424:      6(int) Load 8(invocation)
-             425:    389(ptr) AccessChain 34(data) 57 381
-             426: 30(f16vec4) Load 425
-             427:398(f16vec3) VectorShuffle 426 426 0 1 2
-             428:398(f16vec3) GroupNonUniformBroadcastFirst 42 427
-             429:    389(ptr) AccessChain 34(data) 424 381
-             430: 30(f16vec4) Load 429
-             431: 30(f16vec4) VectorShuffle 430 428 4 5 6 3
-                              Store 429 431
-             432:      6(int) Load 8(invocation)
-             433:    389(ptr) AccessChain 34(data) 67 381
-             434: 30(f16vec4) Load 433
-             435: 30(f16vec4) GroupNonUniformBroadcastFirst 42 434
-             436:    389(ptr) AccessChain 34(data) 432 381
+             350:    309(ptr) AccessChain 34(data) 59 301
+             351: 26(i64vec4) Load 350
+             352:319(i64vec3) VectorShuffle 351 351 0 1 2
+             353:319(i64vec3) GroupNonUniformBroadcastFirst 42 352
+             354:    302(ptr) AccessChain 34(data) 349 301 38
+             355: 25(int64_t) CompositeExtract 353 0
+                              Store 354 355
+             356:    302(ptr) AccessChain 34(data) 349 301 55
+             357: 25(int64_t) CompositeExtract 353 1
+                              Store 356 357
+             358:    302(ptr) AccessChain 34(data) 349 301 69
+             359: 25(int64_t) CompositeExtract 353 2
+                              Store 358 359
+             360:      6(int) Load 8(invocation)
+             361:    309(ptr) AccessChain 34(data) 73 301
+             362: 26(i64vec4) Load 361
+             363: 26(i64vec4) GroupNonUniformBroadcastFirst 42 362
+             364:    309(ptr) AccessChain 34(data) 360 301
+                              Store 364 363
+             365:      6(int) Load 8(invocation)
+             368:    367(ptr) AccessChain 34(data) 37 366 38
+             369: 27(int64_t) Load 368
+             370: 27(int64_t) GroupNonUniformBroadcast 42 369 42
+             371:    367(ptr) AccessChain 34(data) 365 366 38
+                              Store 371 370
+             372:      6(int) Load 8(invocation)
+             375:    374(ptr) AccessChain 34(data) 46 366
+             376: 28(i64vec4) Load 375
+             377:373(i64vec2) VectorShuffle 376 376 0 1
+             378:373(i64vec2) GroupNonUniformBroadcast 42 377 42
+             379:    367(ptr) AccessChain 34(data) 372 366 38
+             380: 27(int64_t) CompositeExtract 378 0
+                              Store 379 380
+             381:    367(ptr) AccessChain 34(data) 372 366 55
+             382: 27(int64_t) CompositeExtract 378 1
+                              Store 381 382
+             383:      6(int) Load 8(invocation)
+             385:    374(ptr) AccessChain 34(data) 59 366
+             386: 28(i64vec4) Load 385
+             387:384(i64vec3) VectorShuffle 386 386 0 1 2
+             388:384(i64vec3) GroupNonUniformBroadcast 42 387 42
+             389:    367(ptr) AccessChain 34(data) 383 366 38
+             390: 27(int64_t) CompositeExtract 388 0
+                              Store 389 390
+             391:    367(ptr) AccessChain 34(data) 383 366 55
+             392: 27(int64_t) CompositeExtract 388 1
+                              Store 391 392
+             393:    367(ptr) AccessChain 34(data) 383 366 69
+             394: 27(int64_t) CompositeExtract 388 2
+                              Store 393 394
+             395:      6(int) Load 8(invocation)
+             396:    374(ptr) AccessChain 34(data) 73 366
+             397: 28(i64vec4) Load 396
+             398: 28(i64vec4) GroupNonUniformBroadcast 42 397 42
+             399:    374(ptr) AccessChain 34(data) 395 366
+                              Store 399 398
+             400:      6(int) Load 8(invocation)
+             401:    367(ptr) AccessChain 34(data) 37 366 38
+             402: 27(int64_t) Load 401
+             403: 27(int64_t) GroupNonUniformBroadcastFirst 42 402
+             404:    367(ptr) AccessChain 34(data) 400 366 38
+                              Store 404 403
+             405:      6(int) Load 8(invocation)
+             406:    374(ptr) AccessChain 34(data) 46 366
+             407: 28(i64vec4) Load 406
+             408:373(i64vec2) VectorShuffle 407 407 0 1
+             409:373(i64vec2) GroupNonUniformBroadcastFirst 42 408
+             410:    367(ptr) AccessChain 34(data) 405 366 38
+             411: 27(int64_t) CompositeExtract 409 0
+                              Store 410 411
+             412:    367(ptr) AccessChain 34(data) 405 366 55
+             413: 27(int64_t) CompositeExtract 409 1
+                              Store 412 413
+             414:      6(int) Load 8(invocation)
+             415:    374(ptr) AccessChain 34(data) 59 366
+             416: 28(i64vec4) Load 415
+             417:384(i64vec3) VectorShuffle 416 416 0 1 2
+             418:384(i64vec3) GroupNonUniformBroadcastFirst 42 417
+             419:    367(ptr) AccessChain 34(data) 414 366 38
+             420: 27(int64_t) CompositeExtract 418 0
+                              Store 419 420
+             421:    367(ptr) AccessChain 34(data) 414 366 55
+             422: 27(int64_t) CompositeExtract 418 1
+                              Store 421 422
+             423:    367(ptr) AccessChain 34(data) 414 366 69
+             424: 27(int64_t) CompositeExtract 418 2
+                              Store 423 424
+             425:      6(int) Load 8(invocation)
+             426:    374(ptr) AccessChain 34(data) 73 366
+             427: 28(i64vec4) Load 426
+             428: 28(i64vec4) GroupNonUniformBroadcastFirst 42 427
+             429:    374(ptr) AccessChain 34(data) 425 366
+                              Store 429 428
+             430:      6(int) Load 8(invocation)
+             433:    432(ptr) AccessChain 34(data) 37 431 38
+             434:29(float16_t) Load 433
+             435:29(float16_t) GroupNonUniformBroadcast 42 434 42
+             436:    432(ptr) AccessChain 34(data) 430 431 38
                               Store 436 435
+             437:      6(int) Load 8(invocation)
+             440:    439(ptr) AccessChain 34(data) 46 431
+             441: 30(f16vec4) Load 440
+             442:438(f16vec2) VectorShuffle 441 441 0 1
+             443:438(f16vec2) GroupNonUniformBroadcast 42 442 42
+             444:    432(ptr) AccessChain 34(data) 437 431 38
+             445:29(float16_t) CompositeExtract 443 0
+                              Store 444 445
+             446:    432(ptr) AccessChain 34(data) 437 431 55
+             447:29(float16_t) CompositeExtract 443 1
+                              Store 446 447
+             448:      6(int) Load 8(invocation)
+             450:    439(ptr) AccessChain 34(data) 59 431
+             451: 30(f16vec4) Load 450
+             452:449(f16vec3) VectorShuffle 451 451 0 1 2
+             453:449(f16vec3) GroupNonUniformBroadcast 42 452 42
+             454:    432(ptr) AccessChain 34(data) 448 431 38
+             455:29(float16_t) CompositeExtract 453 0
+                              Store 454 455
+             456:    432(ptr) AccessChain 34(data) 448 431 55
+             457:29(float16_t) CompositeExtract 453 1
+                              Store 456 457
+             458:    432(ptr) AccessChain 34(data) 448 431 69
+             459:29(float16_t) CompositeExtract 453 2
+                              Store 458 459
+             460:      6(int) Load 8(invocation)
+             461:    439(ptr) AccessChain 34(data) 73 431
+             462: 30(f16vec4) Load 461
+             463: 30(f16vec4) GroupNonUniformBroadcast 42 462 42
+             464:    439(ptr) AccessChain 34(data) 460 431
+                              Store 464 463
+             465:      6(int) Load 8(invocation)
+             466:    432(ptr) AccessChain 34(data) 37 431 38
+             467:29(float16_t) Load 466
+             468:29(float16_t) GroupNonUniformBroadcastFirst 42 467
+             469:    432(ptr) AccessChain 34(data) 465 431 38
+                              Store 469 468
+             470:      6(int) Load 8(invocation)
+             471:    439(ptr) AccessChain 34(data) 46 431
+             472: 30(f16vec4) Load 471
+             473:438(f16vec2) VectorShuffle 472 472 0 1
+             474:438(f16vec2) GroupNonUniformBroadcastFirst 42 473
+             475:    432(ptr) AccessChain 34(data) 470 431 38
+             476:29(float16_t) CompositeExtract 474 0
+                              Store 475 476
+             477:    432(ptr) AccessChain 34(data) 470 431 55
+             478:29(float16_t) CompositeExtract 474 1
+                              Store 477 478
+             479:      6(int) Load 8(invocation)
+             480:    439(ptr) AccessChain 34(data) 59 431
+             481: 30(f16vec4) Load 480
+             482:449(f16vec3) VectorShuffle 481 481 0 1 2
+             483:449(f16vec3) GroupNonUniformBroadcastFirst 42 482
+             484:    432(ptr) AccessChain 34(data) 479 431 38
+             485:29(float16_t) CompositeExtract 483 0
+                              Store 484 485
+             486:    432(ptr) AccessChain 34(data) 479 431 55
+             487:29(float16_t) CompositeExtract 483 1
+                              Store 486 487
+             488:    432(ptr) AccessChain 34(data) 479 431 69
+             489:29(float16_t) CompositeExtract 483 2
+                              Store 488 489
+             490:      6(int) Load 8(invocation)
+             491:    439(ptr) AccessChain 34(data) 73 431
+             492: 30(f16vec4) Load 491
+             493: 30(f16vec4) GroupNonUniformBroadcastFirst 42 492
+             494:    439(ptr) AccessChain 34(data) 490 431
+                              Store 494 493
                               Return
                               FunctionEnd
diff --git a/third_party/vulkan-deps/glslang/src/Test/baseResults/spv.subgroupExtendedTypesClustered.comp.out b/third_party/vulkan-deps/glslang/src/Test/baseResults/spv.subgroupExtendedTypesClustered.comp.out
index 2f4393a..98a7a89 100644
--- a/third_party/vulkan-deps/glslang/src/Test/baseResults/spv.subgroupExtendedTypesClustered.comp.out
+++ b/third_party/vulkan-deps/glslang/src/Test/baseResults/spv.subgroupExtendedTypesClustered.comp.out
@@ -1,7 +1,7 @@
 spv.subgroupExtendedTypesClustered.comp
 // Module Version 10300
 // Generated by (magic number): 8000a
-// Id's are bound by 1273
+// Id's are bound by 1458
 
                               Capability Shader
                               Capability Float16
@@ -59,7 +59,7 @@
                               Decorate 31(Buffers) Block
                               Decorate 34(data) DescriptorSet 0
                               Decorate 34(data) Binding 0
-                              Decorate 1272 BuiltIn WorkgroupSize
+                              Decorate 1457 BuiltIn WorkgroupSize
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeInt 32 0
@@ -95,39 +95,40 @@
               47:     36(int) Constant 1
               48:             TypeVector 17(int8_t) 2
               49:             TypePointer StorageBuffer 18(i8vec4)
-              58:     36(int) Constant 2
-              59:             TypeVector 17(int8_t) 3
-              68:     36(int) Constant 3
-             230:             TypePointer StorageBuffer 19(int8_t)
-             236:             TypeVector 19(int8_t) 2
-             237:             TypePointer StorageBuffer 20(i8vec4)
-             246:             TypeVector 19(int8_t) 3
-             416:             TypePointer StorageBuffer 21(int16_t)
-             422:             TypeVector 21(int16_t) 2
-             423:             TypePointer StorageBuffer 22(i16vec4)
-             432:             TypeVector 21(int16_t) 3
-             602:             TypePointer StorageBuffer 23(int16_t)
-             608:             TypeVector 23(int16_t) 2
-             609:             TypePointer StorageBuffer 24(i16vec4)
-             618:             TypeVector 23(int16_t) 3
-             788:     36(int) Constant 4
-             789:             TypePointer StorageBuffer 25(int64_t)
-             795:             TypeVector 25(int64_t) 2
-             796:             TypePointer StorageBuffer 26(i64vec4)
-             805:             TypeVector 25(int64_t) 3
-             975:     36(int) Constant 5
-             976:             TypePointer StorageBuffer 27(int64_t)
-             982:             TypeVector 27(int64_t) 2
-             983:             TypePointer StorageBuffer 28(i64vec4)
-             992:             TypeVector 27(int64_t) 3
-            1162:     36(int) Constant 6
-            1163:             TypePointer StorageBuffer 29(float16_t)
-            1169:             TypeVector 29(float16_t) 2
-            1170:             TypePointer StorageBuffer 30(f16vec4)
-            1179:             TypeVector 29(float16_t) 3
-            1270:             TypeVector 6(int) 3
-            1271:      6(int) Constant 8
-            1272: 1270(ivec3) ConstantComposite 1271 42 42
+              59:     36(int) Constant 2
+              60:             TypeVector 17(int8_t) 3
+              69:      6(int) Constant 2
+              73:     36(int) Constant 3
+             259:             TypePointer StorageBuffer 19(int8_t)
+             265:             TypeVector 19(int8_t) 2
+             266:             TypePointer StorageBuffer 20(i8vec4)
+             276:             TypeVector 19(int8_t) 3
+             473:             TypePointer StorageBuffer 21(int16_t)
+             479:             TypeVector 21(int16_t) 2
+             480:             TypePointer StorageBuffer 22(i16vec4)
+             490:             TypeVector 21(int16_t) 3
+             687:             TypePointer StorageBuffer 23(int16_t)
+             693:             TypeVector 23(int16_t) 2
+             694:             TypePointer StorageBuffer 24(i16vec4)
+             704:             TypeVector 23(int16_t) 3
+             901:     36(int) Constant 4
+             902:             TypePointer StorageBuffer 25(int64_t)
+             908:             TypeVector 25(int64_t) 2
+             909:             TypePointer StorageBuffer 26(i64vec4)
+             919:             TypeVector 25(int64_t) 3
+            1116:     36(int) Constant 5
+            1117:             TypePointer StorageBuffer 27(int64_t)
+            1123:             TypeVector 27(int64_t) 2
+            1124:             TypePointer StorageBuffer 28(i64vec4)
+            1134:             TypeVector 27(int64_t) 3
+            1331:     36(int) Constant 6
+            1332:             TypePointer StorageBuffer 29(float16_t)
+            1338:             TypeVector 29(float16_t) 2
+            1339:             TypePointer StorageBuffer 30(f16vec4)
+            1349:             TypeVector 29(float16_t) 3
+            1455:             TypeVector 6(int) 3
+            1456:      6(int) Constant 8
+            1457: 1455(ivec3) ConstantComposite 1456 42 42
          4(main):           2 Function None 3
                5:             Label
    8(invocation):      7(ptr) Variable Function
@@ -147,1374 +148,1696 @@
               51:  18(i8vec4) Load 50
               52:  48(i8vec2) VectorShuffle 51 51 0 1
               53:  48(i8vec2) GroupNonUniformIAdd 43 ClusteredReduce 52 42
-              54:     49(ptr) AccessChain 34(data) 46 37
-              55:  18(i8vec4) Load 54
-              56:  18(i8vec4) VectorShuffle 55 53 4 5 2 3
-                              Store 54 56
-              57:      6(int) Load 8(invocation)
-              60:     49(ptr) AccessChain 34(data) 58 37
-              61:  18(i8vec4) Load 60
-              62:  59(i8vec3) VectorShuffle 61 61 0 1 2
-              63:  59(i8vec3) GroupNonUniformIAdd 43 ClusteredReduce 62 42
-              64:     49(ptr) AccessChain 34(data) 57 37
-              65:  18(i8vec4) Load 64
-              66:  18(i8vec4) VectorShuffle 65 63 4 5 6 3
-                              Store 64 66
-              67:      6(int) Load 8(invocation)
-              69:     49(ptr) AccessChain 34(data) 68 37
-              70:  18(i8vec4) Load 69
-              71:  18(i8vec4) GroupNonUniformIAdd 43 ClusteredReduce 70 42
-              72:     49(ptr) AccessChain 34(data) 67 37
-                              Store 72 71
-              73:      6(int) Load 8(invocation)
-              74:     39(ptr) AccessChain 34(data) 37 37 38
-              75:  17(int8_t) Load 74
-              76:  17(int8_t) GroupNonUniformIMul 43 ClusteredReduce 75 42
-              77:     39(ptr) AccessChain 34(data) 73 37 38
+              54:     39(ptr) AccessChain 34(data) 46 37 38
+              55:  17(int8_t) CompositeExtract 53 0
+                              Store 54 55
+              56:     39(ptr) AccessChain 34(data) 46 37 42
+              57:  17(int8_t) CompositeExtract 53 1
+                              Store 56 57
+              58:      6(int) Load 8(invocation)
+              61:     49(ptr) AccessChain 34(data) 59 37
+              62:  18(i8vec4) Load 61
+              63:  60(i8vec3) VectorShuffle 62 62 0 1 2
+              64:  60(i8vec3) GroupNonUniformIAdd 43 ClusteredReduce 63 42
+              65:     39(ptr) AccessChain 34(data) 58 37 38
+              66:  17(int8_t) CompositeExtract 64 0
+                              Store 65 66
+              67:     39(ptr) AccessChain 34(data) 58 37 42
+              68:  17(int8_t) CompositeExtract 64 1
+                              Store 67 68
+              70:     39(ptr) AccessChain 34(data) 58 37 69
+              71:  17(int8_t) CompositeExtract 64 2
+                              Store 70 71
+              72:      6(int) Load 8(invocation)
+              74:     49(ptr) AccessChain 34(data) 73 37
+              75:  18(i8vec4) Load 74
+              76:  18(i8vec4) GroupNonUniformIAdd 43 ClusteredReduce 75 42
+              77:     49(ptr) AccessChain 34(data) 72 37
                               Store 77 76
               78:      6(int) Load 8(invocation)
-              79:     49(ptr) AccessChain 34(data) 47 37
-              80:  18(i8vec4) Load 79
-              81:  48(i8vec2) VectorShuffle 80 80 0 1
-              82:  48(i8vec2) GroupNonUniformIMul 43 ClusteredReduce 81 42
-              83:     49(ptr) AccessChain 34(data) 78 37
-              84:  18(i8vec4) Load 83
-              85:  18(i8vec4) VectorShuffle 84 82 4 5 2 3
-                              Store 83 85
-              86:      6(int) Load 8(invocation)
-              87:     49(ptr) AccessChain 34(data) 58 37
-              88:  18(i8vec4) Load 87
-              89:  59(i8vec3) VectorShuffle 88 88 0 1 2
-              90:  59(i8vec3) GroupNonUniformIMul 43 ClusteredReduce 89 42
-              91:     49(ptr) AccessChain 34(data) 86 37
-              92:  18(i8vec4) Load 91
-              93:  18(i8vec4) VectorShuffle 92 90 4 5 6 3
-                              Store 91 93
-              94:      6(int) Load 8(invocation)
-              95:     49(ptr) AccessChain 34(data) 68 37
-              96:  18(i8vec4) Load 95
-              97:  18(i8vec4) GroupNonUniformIMul 43 ClusteredReduce 96 42
-              98:     49(ptr) AccessChain 34(data) 94 37
-                              Store 98 97
-              99:      6(int) Load 8(invocation)
-             100:     39(ptr) AccessChain 34(data) 37 37 38
-             101:  17(int8_t) Load 100
-             102:  17(int8_t) GroupNonUniformSMin 43 ClusteredReduce 101 42
-             103:     39(ptr) AccessChain 34(data) 99 37 38
-                              Store 103 102
-             104:      6(int) Load 8(invocation)
-             105:     49(ptr) AccessChain 34(data) 47 37
-             106:  18(i8vec4) Load 105
-             107:  48(i8vec2) VectorShuffle 106 106 0 1
-             108:  48(i8vec2) GroupNonUniformSMin 43 ClusteredReduce 107 42
-             109:     49(ptr) AccessChain 34(data) 104 37
-             110:  18(i8vec4) Load 109
-             111:  18(i8vec4) VectorShuffle 110 108 4 5 2 3
-                              Store 109 111
-             112:      6(int) Load 8(invocation)
-             113:     49(ptr) AccessChain 34(data) 58 37
-             114:  18(i8vec4) Load 113
-             115:  59(i8vec3) VectorShuffle 114 114 0 1 2
-             116:  59(i8vec3) GroupNonUniformSMin 43 ClusteredReduce 115 42
-             117:     49(ptr) AccessChain 34(data) 112 37
-             118:  18(i8vec4) Load 117
-             119:  18(i8vec4) VectorShuffle 118 116 4 5 6 3
-                              Store 117 119
-             120:      6(int) Load 8(invocation)
-             121:     49(ptr) AccessChain 34(data) 68 37
-             122:  18(i8vec4) Load 121
-             123:  18(i8vec4) GroupNonUniformSMin 43 ClusteredReduce 122 42
-             124:     49(ptr) AccessChain 34(data) 120 37
-                              Store 124 123
-             125:      6(int) Load 8(invocation)
-             126:     39(ptr) AccessChain 34(data) 37 37 38
-             127:  17(int8_t) Load 126
-             128:  17(int8_t) GroupNonUniformSMax 43 ClusteredReduce 127 42
-             129:     39(ptr) AccessChain 34(data) 125 37 38
-                              Store 129 128
-             130:      6(int) Load 8(invocation)
-             131:     49(ptr) AccessChain 34(data) 47 37
-             132:  18(i8vec4) Load 131
-             133:  48(i8vec2) VectorShuffle 132 132 0 1
-             134:  48(i8vec2) GroupNonUniformSMax 43 ClusteredReduce 133 42
-             135:     49(ptr) AccessChain 34(data) 130 37
-             136:  18(i8vec4) Load 135
-             137:  18(i8vec4) VectorShuffle 136 134 4 5 2 3
-                              Store 135 137
+              79:     39(ptr) AccessChain 34(data) 37 37 38
+              80:  17(int8_t) Load 79
+              81:  17(int8_t) GroupNonUniformIMul 43 ClusteredReduce 80 42
+              82:     39(ptr) AccessChain 34(data) 78 37 38
+                              Store 82 81
+              83:      6(int) Load 8(invocation)
+              84:     49(ptr) AccessChain 34(data) 47 37
+              85:  18(i8vec4) Load 84
+              86:  48(i8vec2) VectorShuffle 85 85 0 1
+              87:  48(i8vec2) GroupNonUniformIMul 43 ClusteredReduce 86 42
+              88:     39(ptr) AccessChain 34(data) 83 37 38
+              89:  17(int8_t) CompositeExtract 87 0
+                              Store 88 89
+              90:     39(ptr) AccessChain 34(data) 83 37 42
+              91:  17(int8_t) CompositeExtract 87 1
+                              Store 90 91
+              92:      6(int) Load 8(invocation)
+              93:     49(ptr) AccessChain 34(data) 59 37
+              94:  18(i8vec4) Load 93
+              95:  60(i8vec3) VectorShuffle 94 94 0 1 2
+              96:  60(i8vec3) GroupNonUniformIMul 43 ClusteredReduce 95 42
+              97:     39(ptr) AccessChain 34(data) 92 37 38
+              98:  17(int8_t) CompositeExtract 96 0
+                              Store 97 98
+              99:     39(ptr) AccessChain 34(data) 92 37 42
+             100:  17(int8_t) CompositeExtract 96 1
+                              Store 99 100
+             101:     39(ptr) AccessChain 34(data) 92 37 69
+             102:  17(int8_t) CompositeExtract 96 2
+                              Store 101 102
+             103:      6(int) Load 8(invocation)
+             104:     49(ptr) AccessChain 34(data) 73 37
+             105:  18(i8vec4) Load 104
+             106:  18(i8vec4) GroupNonUniformIMul 43 ClusteredReduce 105 42
+             107:     49(ptr) AccessChain 34(data) 103 37
+                              Store 107 106
+             108:      6(int) Load 8(invocation)
+             109:     39(ptr) AccessChain 34(data) 37 37 38
+             110:  17(int8_t) Load 109
+             111:  17(int8_t) GroupNonUniformSMin 43 ClusteredReduce 110 42
+             112:     39(ptr) AccessChain 34(data) 108 37 38
+                              Store 112 111
+             113:      6(int) Load 8(invocation)
+             114:     49(ptr) AccessChain 34(data) 47 37
+             115:  18(i8vec4) Load 114
+             116:  48(i8vec2) VectorShuffle 115 115 0 1
+             117:  48(i8vec2) GroupNonUniformSMin 43 ClusteredReduce 116 42
+             118:     39(ptr) AccessChain 34(data) 113 37 38
+             119:  17(int8_t) CompositeExtract 117 0
+                              Store 118 119
+             120:     39(ptr) AccessChain 34(data) 113 37 42
+             121:  17(int8_t) CompositeExtract 117 1
+                              Store 120 121
+             122:      6(int) Load 8(invocation)
+             123:     49(ptr) AccessChain 34(data) 59 37
+             124:  18(i8vec4) Load 123
+             125:  60(i8vec3) VectorShuffle 124 124 0 1 2
+             126:  60(i8vec3) GroupNonUniformSMin 43 ClusteredReduce 125 42
+             127:     39(ptr) AccessChain 34(data) 122 37 38
+             128:  17(int8_t) CompositeExtract 126 0
+                              Store 127 128
+             129:     39(ptr) AccessChain 34(data) 122 37 42
+             130:  17(int8_t) CompositeExtract 126 1
+                              Store 129 130
+             131:     39(ptr) AccessChain 34(data) 122 37 69
+             132:  17(int8_t) CompositeExtract 126 2
+                              Store 131 132
+             133:      6(int) Load 8(invocation)
+             134:     49(ptr) AccessChain 34(data) 73 37
+             135:  18(i8vec4) Load 134
+             136:  18(i8vec4) GroupNonUniformSMin 43 ClusteredReduce 135 42
+             137:     49(ptr) AccessChain 34(data) 133 37
+                              Store 137 136
              138:      6(int) Load 8(invocation)
-             139:     49(ptr) AccessChain 34(data) 58 37
-             140:  18(i8vec4) Load 139
-             141:  59(i8vec3) VectorShuffle 140 140 0 1 2
-             142:  59(i8vec3) GroupNonUniformSMax 43 ClusteredReduce 141 42
-             143:     49(ptr) AccessChain 34(data) 138 37
-             144:  18(i8vec4) Load 143
-             145:  18(i8vec4) VectorShuffle 144 142 4 5 6 3
-                              Store 143 145
-             146:      6(int) Load 8(invocation)
-             147:     49(ptr) AccessChain 34(data) 68 37
-             148:  18(i8vec4) Load 147
-             149:  18(i8vec4) GroupNonUniformSMax 43 ClusteredReduce 148 42
-             150:     49(ptr) AccessChain 34(data) 146 37
-                              Store 150 149
-             151:      6(int) Load 8(invocation)
-             152:     39(ptr) AccessChain 34(data) 37 37 38
-             153:  17(int8_t) Load 152
-             154:  17(int8_t) GroupNonUniformBitwiseAnd 43 ClusteredReduce 153 42
-             155:     39(ptr) AccessChain 34(data) 151 37 38
-                              Store 155 154
-             156:      6(int) Load 8(invocation)
-             157:     49(ptr) AccessChain 34(data) 47 37
-             158:  18(i8vec4) Load 157
-             159:  48(i8vec2) VectorShuffle 158 158 0 1
-             160:  48(i8vec2) GroupNonUniformBitwiseAnd 43 ClusteredReduce 159 42
-             161:     49(ptr) AccessChain 34(data) 156 37
-             162:  18(i8vec4) Load 161
-             163:  18(i8vec4) VectorShuffle 162 160 4 5 2 3
-                              Store 161 163
-             164:      6(int) Load 8(invocation)
-             165:     49(ptr) AccessChain 34(data) 58 37
-             166:  18(i8vec4) Load 165
-             167:  59(i8vec3) VectorShuffle 166 166 0 1 2
-             168:  59(i8vec3) GroupNonUniformBitwiseAnd 43 ClusteredReduce 167 42
-             169:     49(ptr) AccessChain 34(data) 164 37
-             170:  18(i8vec4) Load 169
-             171:  18(i8vec4) VectorShuffle 170 168 4 5 6 3
-                              Store 169 171
-             172:      6(int) Load 8(invocation)
-             173:     49(ptr) AccessChain 34(data) 68 37
-             174:  18(i8vec4) Load 173
-             175:  18(i8vec4) GroupNonUniformBitwiseAnd 43 ClusteredReduce 174 42
-             176:     49(ptr) AccessChain 34(data) 172 37
-                              Store 176 175
-             177:      6(int) Load 8(invocation)
-             178:     39(ptr) AccessChain 34(data) 37 37 38
-             179:  17(int8_t) Load 178
-             180:  17(int8_t) GroupNonUniformBitwiseOr 43 ClusteredReduce 179 42
-             181:     39(ptr) AccessChain 34(data) 177 37 38
-                              Store 181 180
+             139:     39(ptr) AccessChain 34(data) 37 37 38
+             140:  17(int8_t) Load 139
+             141:  17(int8_t) GroupNonUniformSMax 43 ClusteredReduce 140 42
+             142:     39(ptr) AccessChain 34(data) 138 37 38
+                              Store 142 141
+             143:      6(int) Load 8(invocation)
+             144:     49(ptr) AccessChain 34(data) 47 37
+             145:  18(i8vec4) Load 144
+             146:  48(i8vec2) VectorShuffle 145 145 0 1
+             147:  48(i8vec2) GroupNonUniformSMax 43 ClusteredReduce 146 42
+             148:     39(ptr) AccessChain 34(data) 143 37 38
+             149:  17(int8_t) CompositeExtract 147 0
+                              Store 148 149
+             150:     39(ptr) AccessChain 34(data) 143 37 42
+             151:  17(int8_t) CompositeExtract 147 1
+                              Store 150 151
+             152:      6(int) Load 8(invocation)
+             153:     49(ptr) AccessChain 34(data) 59 37
+             154:  18(i8vec4) Load 153
+             155:  60(i8vec3) VectorShuffle 154 154 0 1 2
+             156:  60(i8vec3) GroupNonUniformSMax 43 ClusteredReduce 155 42
+             157:     39(ptr) AccessChain 34(data) 152 37 38
+             158:  17(int8_t) CompositeExtract 156 0
+                              Store 157 158
+             159:     39(ptr) AccessChain 34(data) 152 37 42
+             160:  17(int8_t) CompositeExtract 156 1
+                              Store 159 160
+             161:     39(ptr) AccessChain 34(data) 152 37 69
+             162:  17(int8_t) CompositeExtract 156 2
+                              Store 161 162
+             163:      6(int) Load 8(invocation)
+             164:     49(ptr) AccessChain 34(data) 73 37
+             165:  18(i8vec4) Load 164
+             166:  18(i8vec4) GroupNonUniformSMax 43 ClusteredReduce 165 42
+             167:     49(ptr) AccessChain 34(data) 163 37
+                              Store 167 166
+             168:      6(int) Load 8(invocation)
+             169:     39(ptr) AccessChain 34(data) 37 37 38
+             170:  17(int8_t) Load 169
+             171:  17(int8_t) GroupNonUniformBitwiseAnd 43 ClusteredReduce 170 42
+             172:     39(ptr) AccessChain 34(data) 168 37 38
+                              Store 172 171
+             173:      6(int) Load 8(invocation)
+             174:     49(ptr) AccessChain 34(data) 47 37
+             175:  18(i8vec4) Load 174
+             176:  48(i8vec2) VectorShuffle 175 175 0 1
+             177:  48(i8vec2) GroupNonUniformBitwiseAnd 43 ClusteredReduce 176 42
+             178:     39(ptr) AccessChain 34(data) 173 37 38
+             179:  17(int8_t) CompositeExtract 177 0
+                              Store 178 179
+             180:     39(ptr) AccessChain 34(data) 173 37 42
+             181:  17(int8_t) CompositeExtract 177 1
+                              Store 180 181
              182:      6(int) Load 8(invocation)
-             183:     49(ptr) AccessChain 34(data) 47 37
+             183:     49(ptr) AccessChain 34(data) 59 37
              184:  18(i8vec4) Load 183
-             185:  48(i8vec2) VectorShuffle 184 184 0 1
-             186:  48(i8vec2) GroupNonUniformBitwiseOr 43 ClusteredReduce 185 42
-             187:     49(ptr) AccessChain 34(data) 182 37
-             188:  18(i8vec4) Load 187
-             189:  18(i8vec4) VectorShuffle 188 186 4 5 2 3
-                              Store 187 189
-             190:      6(int) Load 8(invocation)
-             191:     49(ptr) AccessChain 34(data) 58 37
-             192:  18(i8vec4) Load 191
-             193:  59(i8vec3) VectorShuffle 192 192 0 1 2
-             194:  59(i8vec3) GroupNonUniformBitwiseOr 43 ClusteredReduce 193 42
-             195:     49(ptr) AccessChain 34(data) 190 37
-             196:  18(i8vec4) Load 195
-             197:  18(i8vec4) VectorShuffle 196 194 4 5 6 3
-                              Store 195 197
+             185:  60(i8vec3) VectorShuffle 184 184 0 1 2
+             186:  60(i8vec3) GroupNonUniformBitwiseAnd 43 ClusteredReduce 185 42
+             187:     39(ptr) AccessChain 34(data) 182 37 38
+             188:  17(int8_t) CompositeExtract 186 0
+                              Store 187 188
+             189:     39(ptr) AccessChain 34(data) 182 37 42
+             190:  17(int8_t) CompositeExtract 186 1
+                              Store 189 190
+             191:     39(ptr) AccessChain 34(data) 182 37 69
+             192:  17(int8_t) CompositeExtract 186 2
+                              Store 191 192
+             193:      6(int) Load 8(invocation)
+             194:     49(ptr) AccessChain 34(data) 73 37
+             195:  18(i8vec4) Load 194
+             196:  18(i8vec4) GroupNonUniformBitwiseAnd 43 ClusteredReduce 195 42
+             197:     49(ptr) AccessChain 34(data) 193 37
+                              Store 197 196
              198:      6(int) Load 8(invocation)
-             199:     49(ptr) AccessChain 34(data) 68 37
-             200:  18(i8vec4) Load 199
-             201:  18(i8vec4) GroupNonUniformBitwiseOr 43 ClusteredReduce 200 42
-             202:     49(ptr) AccessChain 34(data) 198 37
+             199:     39(ptr) AccessChain 34(data) 37 37 38
+             200:  17(int8_t) Load 199
+             201:  17(int8_t) GroupNonUniformBitwiseOr 43 ClusteredReduce 200 42
+             202:     39(ptr) AccessChain 34(data) 198 37 38
                               Store 202 201
              203:      6(int) Load 8(invocation)
-             204:     39(ptr) AccessChain 34(data) 37 37 38
-             205:  17(int8_t) Load 204
-             206:  17(int8_t) GroupNonUniformBitwiseXor 43 ClusteredReduce 205 42
-             207:     39(ptr) AccessChain 34(data) 203 37 38
-                              Store 207 206
-             208:      6(int) Load 8(invocation)
-             209:     49(ptr) AccessChain 34(data) 47 37
-             210:  18(i8vec4) Load 209
-             211:  48(i8vec2) VectorShuffle 210 210 0 1
-             212:  48(i8vec2) GroupNonUniformBitwiseXor 43 ClusteredReduce 211 42
-             213:     49(ptr) AccessChain 34(data) 208 37
+             204:     49(ptr) AccessChain 34(data) 47 37
+             205:  18(i8vec4) Load 204
+             206:  48(i8vec2) VectorShuffle 205 205 0 1
+             207:  48(i8vec2) GroupNonUniformBitwiseOr 43 ClusteredReduce 206 42
+             208:     39(ptr) AccessChain 34(data) 203 37 38
+             209:  17(int8_t) CompositeExtract 207 0
+                              Store 208 209
+             210:     39(ptr) AccessChain 34(data) 203 37 42
+             211:  17(int8_t) CompositeExtract 207 1
+                              Store 210 211
+             212:      6(int) Load 8(invocation)
+             213:     49(ptr) AccessChain 34(data) 59 37
              214:  18(i8vec4) Load 213
-             215:  18(i8vec4) VectorShuffle 214 212 4 5 2 3
-                              Store 213 215
-             216:      6(int) Load 8(invocation)
-             217:     49(ptr) AccessChain 34(data) 58 37
-             218:  18(i8vec4) Load 217
-             219:  59(i8vec3) VectorShuffle 218 218 0 1 2
-             220:  59(i8vec3) GroupNonUniformBitwiseXor 43 ClusteredReduce 219 42
-             221:     49(ptr) AccessChain 34(data) 216 37
-             222:  18(i8vec4) Load 221
-             223:  18(i8vec4) VectorShuffle 222 220 4 5 6 3
-                              Store 221 223
-             224:      6(int) Load 8(invocation)
-             225:     49(ptr) AccessChain 34(data) 68 37
-             226:  18(i8vec4) Load 225
-             227:  18(i8vec4) GroupNonUniformBitwiseXor 43 ClusteredReduce 226 42
-             228:     49(ptr) AccessChain 34(data) 224 37
-                              Store 228 227
-             229:      6(int) Load 8(invocation)
-             231:    230(ptr) AccessChain 34(data) 37 47 38
-             232:  19(int8_t) Load 231
-             233:  19(int8_t) GroupNonUniformIAdd 43 ClusteredReduce 232 42
-             234:    230(ptr) AccessChain 34(data) 229 47 38
-                              Store 234 233
-             235:      6(int) Load 8(invocation)
-             238:    237(ptr) AccessChain 34(data) 47 47
-             239:  20(i8vec4) Load 238
-             240: 236(i8vec2) VectorShuffle 239 239 0 1
-             241: 236(i8vec2) GroupNonUniformIAdd 43 ClusteredReduce 240 42
-             242:    237(ptr) AccessChain 34(data) 235 47
-             243:  20(i8vec4) Load 242
-             244:  20(i8vec4) VectorShuffle 243 241 4 5 2 3
-                              Store 242 244
-             245:      6(int) Load 8(invocation)
-             247:    237(ptr) AccessChain 34(data) 58 47
-             248:  20(i8vec4) Load 247
-             249: 246(i8vec3) VectorShuffle 248 248 0 1 2
-             250: 246(i8vec3) GroupNonUniformIAdd 43 ClusteredReduce 249 42
-             251:    237(ptr) AccessChain 34(data) 245 47
-             252:  20(i8vec4) Load 251
-             253:  20(i8vec4) VectorShuffle 252 250 4 5 6 3
-                              Store 251 253
-             254:      6(int) Load 8(invocation)
-             255:    237(ptr) AccessChain 34(data) 68 47
-             256:  20(i8vec4) Load 255
-             257:  20(i8vec4) GroupNonUniformIAdd 43 ClusteredReduce 256 42
-             258:    237(ptr) AccessChain 34(data) 254 47
-                              Store 258 257
-             259:      6(int) Load 8(invocation)
-             260:    230(ptr) AccessChain 34(data) 37 47 38
+             215:  60(i8vec3) VectorShuffle 214 214 0 1 2
+             216:  60(i8vec3) GroupNonUniformBitwiseOr 43 ClusteredReduce 215 42
+             217:     39(ptr) AccessChain 34(data) 212 37 38
+             218:  17(int8_t) CompositeExtract 216 0
+                              Store 217 218
+             219:     39(ptr) AccessChain 34(data) 212 37 42
+             220:  17(int8_t) CompositeExtract 216 1
+                              Store 219 220
+             221:     39(ptr) AccessChain 34(data) 212 37 69
+             222:  17(int8_t) CompositeExtract 216 2
+                              Store 221 222
+             223:      6(int) Load 8(invocation)
+             224:     49(ptr) AccessChain 34(data) 73 37
+             225:  18(i8vec4) Load 224
+             226:  18(i8vec4) GroupNonUniformBitwiseOr 43 ClusteredReduce 225 42
+             227:     49(ptr) AccessChain 34(data) 223 37
+                              Store 227 226
+             228:      6(int) Load 8(invocation)
+             229:     39(ptr) AccessChain 34(data) 37 37 38
+             230:  17(int8_t) Load 229
+             231:  17(int8_t) GroupNonUniformBitwiseXor 43 ClusteredReduce 230 42
+             232:     39(ptr) AccessChain 34(data) 228 37 38
+                              Store 232 231
+             233:      6(int) Load 8(invocation)
+             234:     49(ptr) AccessChain 34(data) 47 37
+             235:  18(i8vec4) Load 234
+             236:  48(i8vec2) VectorShuffle 235 235 0 1
+             237:  48(i8vec2) GroupNonUniformBitwiseXor 43 ClusteredReduce 236 42
+             238:     39(ptr) AccessChain 34(data) 233 37 38
+             239:  17(int8_t) CompositeExtract 237 0
+                              Store 238 239
+             240:     39(ptr) AccessChain 34(data) 233 37 42
+             241:  17(int8_t) CompositeExtract 237 1
+                              Store 240 241
+             242:      6(int) Load 8(invocation)
+             243:     49(ptr) AccessChain 34(data) 59 37
+             244:  18(i8vec4) Load 243
+             245:  60(i8vec3) VectorShuffle 244 244 0 1 2
+             246:  60(i8vec3) GroupNonUniformBitwiseXor 43 ClusteredReduce 245 42
+             247:     39(ptr) AccessChain 34(data) 242 37 38
+             248:  17(int8_t) CompositeExtract 246 0
+                              Store 247 248
+             249:     39(ptr) AccessChain 34(data) 242 37 42
+             250:  17(int8_t) CompositeExtract 246 1
+                              Store 249 250
+             251:     39(ptr) AccessChain 34(data) 242 37 69
+             252:  17(int8_t) CompositeExtract 246 2
+                              Store 251 252
+             253:      6(int) Load 8(invocation)
+             254:     49(ptr) AccessChain 34(data) 73 37
+             255:  18(i8vec4) Load 254
+             256:  18(i8vec4) GroupNonUniformBitwiseXor 43 ClusteredReduce 255 42
+             257:     49(ptr) AccessChain 34(data) 253 37
+                              Store 257 256
+             258:      6(int) Load 8(invocation)
+             260:    259(ptr) AccessChain 34(data) 37 47 38
              261:  19(int8_t) Load 260
-             262:  19(int8_t) GroupNonUniformIMul 43 ClusteredReduce 261 42
-             263:    230(ptr) AccessChain 34(data) 259 47 38
+             262:  19(int8_t) GroupNonUniformIAdd 43 ClusteredReduce 261 42
+             263:    259(ptr) AccessChain 34(data) 258 47 38
                               Store 263 262
              264:      6(int) Load 8(invocation)
-             265:    237(ptr) AccessChain 34(data) 47 47
-             266:  20(i8vec4) Load 265
-             267: 236(i8vec2) VectorShuffle 266 266 0 1
-             268: 236(i8vec2) GroupNonUniformIMul 43 ClusteredReduce 267 42
-             269:    237(ptr) AccessChain 34(data) 264 47
-             270:  20(i8vec4) Load 269
-             271:  20(i8vec4) VectorShuffle 270 268 4 5 2 3
-                              Store 269 271
-             272:      6(int) Load 8(invocation)
-             273:    237(ptr) AccessChain 34(data) 58 47
-             274:  20(i8vec4) Load 273
-             275: 246(i8vec3) VectorShuffle 274 274 0 1 2
-             276: 246(i8vec3) GroupNonUniformIMul 43 ClusteredReduce 275 42
-             277:    237(ptr) AccessChain 34(data) 272 47
+             267:    266(ptr) AccessChain 34(data) 47 47
+             268:  20(i8vec4) Load 267
+             269: 265(i8vec2) VectorShuffle 268 268 0 1
+             270: 265(i8vec2) GroupNonUniformIAdd 43 ClusteredReduce 269 42
+             271:    259(ptr) AccessChain 34(data) 264 47 38
+             272:  19(int8_t) CompositeExtract 270 0
+                              Store 271 272
+             273:    259(ptr) AccessChain 34(data) 264 47 42
+             274:  19(int8_t) CompositeExtract 270 1
+                              Store 273 274
+             275:      6(int) Load 8(invocation)
+             277:    266(ptr) AccessChain 34(data) 59 47
              278:  20(i8vec4) Load 277
-             279:  20(i8vec4) VectorShuffle 278 276 4 5 6 3
-                              Store 277 279
-             280:      6(int) Load 8(invocation)
-             281:    237(ptr) AccessChain 34(data) 68 47
-             282:  20(i8vec4) Load 281
-             283:  20(i8vec4) GroupNonUniformIMul 43 ClusteredReduce 282 42
-             284:    237(ptr) AccessChain 34(data) 280 47
-                              Store 284 283
-             285:      6(int) Load 8(invocation)
-             286:    230(ptr) AccessChain 34(data) 37 47 38
-             287:  19(int8_t) Load 286
-             288:  19(int8_t) GroupNonUniformUMin 43 ClusteredReduce 287 42
-             289:    230(ptr) AccessChain 34(data) 285 47 38
-                              Store 289 288
-             290:      6(int) Load 8(invocation)
-             291:    237(ptr) AccessChain 34(data) 47 47
-             292:  20(i8vec4) Load 291
-             293: 236(i8vec2) VectorShuffle 292 292 0 1
-             294: 236(i8vec2) GroupNonUniformUMin 43 ClusteredReduce 293 42
-             295:    237(ptr) AccessChain 34(data) 290 47
-             296:  20(i8vec4) Load 295
-             297:  20(i8vec4) VectorShuffle 296 294 4 5 2 3
-                              Store 295 297
-             298:      6(int) Load 8(invocation)
-             299:    237(ptr) AccessChain 34(data) 58 47
-             300:  20(i8vec4) Load 299
-             301: 246(i8vec3) VectorShuffle 300 300 0 1 2
-             302: 246(i8vec3) GroupNonUniformUMin 43 ClusteredReduce 301 42
-             303:    237(ptr) AccessChain 34(data) 298 47
-             304:  20(i8vec4) Load 303
-             305:  20(i8vec4) VectorShuffle 304 302 4 5 6 3
-                              Store 303 305
+             279: 276(i8vec3) VectorShuffle 278 278 0 1 2
+             280: 276(i8vec3) GroupNonUniformIAdd 43 ClusteredReduce 279 42
+             281:    259(ptr) AccessChain 34(data) 275 47 38
+             282:  19(int8_t) CompositeExtract 280 0
+                              Store 281 282
+             283:    259(ptr) AccessChain 34(data) 275 47 42
+             284:  19(int8_t) CompositeExtract 280 1
+                              Store 283 284
+             285:    259(ptr) AccessChain 34(data) 275 47 69
+             286:  19(int8_t) CompositeExtract 280 2
+                              Store 285 286
+             287:      6(int) Load 8(invocation)
+             288:    266(ptr) AccessChain 34(data) 73 47
+             289:  20(i8vec4) Load 288
+             290:  20(i8vec4) GroupNonUniformIAdd 43 ClusteredReduce 289 42
+             291:    266(ptr) AccessChain 34(data) 287 47
+                              Store 291 290
+             292:      6(int) Load 8(invocation)
+             293:    259(ptr) AccessChain 34(data) 37 47 38
+             294:  19(int8_t) Load 293
+             295:  19(int8_t) GroupNonUniformIMul 43 ClusteredReduce 294 42
+             296:    259(ptr) AccessChain 34(data) 292 47 38
+                              Store 296 295
+             297:      6(int) Load 8(invocation)
+             298:    266(ptr) AccessChain 34(data) 47 47
+             299:  20(i8vec4) Load 298
+             300: 265(i8vec2) VectorShuffle 299 299 0 1
+             301: 265(i8vec2) GroupNonUniformIMul 43 ClusteredReduce 300 42
+             302:    259(ptr) AccessChain 34(data) 297 47 38
+             303:  19(int8_t) CompositeExtract 301 0
+                              Store 302 303
+             304:    259(ptr) AccessChain 34(data) 297 47 42
+             305:  19(int8_t) CompositeExtract 301 1
+                              Store 304 305
              306:      6(int) Load 8(invocation)
-             307:    237(ptr) AccessChain 34(data) 68 47
+             307:    266(ptr) AccessChain 34(data) 59 47
              308:  20(i8vec4) Load 307
-             309:  20(i8vec4) GroupNonUniformUMin 43 ClusteredReduce 308 42
-             310:    237(ptr) AccessChain 34(data) 306 47
-                              Store 310 309
-             311:      6(int) Load 8(invocation)
-             312:    230(ptr) AccessChain 34(data) 37 47 38
-             313:  19(int8_t) Load 312
-             314:  19(int8_t) GroupNonUniformUMax 43 ClusteredReduce 313 42
-             315:    230(ptr) AccessChain 34(data) 311 47 38
-                              Store 315 314
-             316:      6(int) Load 8(invocation)
-             317:    237(ptr) AccessChain 34(data) 47 47
-             318:  20(i8vec4) Load 317
-             319: 236(i8vec2) VectorShuffle 318 318 0 1
-             320: 236(i8vec2) GroupNonUniformUMax 43 ClusteredReduce 319 42
-             321:    237(ptr) AccessChain 34(data) 316 47
-             322:  20(i8vec4) Load 321
-             323:  20(i8vec4) VectorShuffle 322 320 4 5 2 3
-                              Store 321 323
-             324:      6(int) Load 8(invocation)
-             325:    237(ptr) AccessChain 34(data) 58 47
-             326:  20(i8vec4) Load 325
-             327: 246(i8vec3) VectorShuffle 326 326 0 1 2
-             328: 246(i8vec3) GroupNonUniformUMax 43 ClusteredReduce 327 42
-             329:    237(ptr) AccessChain 34(data) 324 47
-             330:  20(i8vec4) Load 329
-             331:  20(i8vec4) VectorShuffle 330 328 4 5 6 3
-                              Store 329 331
-             332:      6(int) Load 8(invocation)
-             333:    237(ptr) AccessChain 34(data) 68 47
-             334:  20(i8vec4) Load 333
-             335:  20(i8vec4) GroupNonUniformUMax 43 ClusteredReduce 334 42
-             336:    237(ptr) AccessChain 34(data) 332 47
-                              Store 336 335
-             337:      6(int) Load 8(invocation)
-             338:    230(ptr) AccessChain 34(data) 37 47 38
-             339:  19(int8_t) Load 338
-             340:  19(int8_t) GroupNonUniformBitwiseAnd 43 ClusteredReduce 339 42
-             341:    230(ptr) AccessChain 34(data) 337 47 38
-                              Store 341 340
-             342:      6(int) Load 8(invocation)
-             343:    237(ptr) AccessChain 34(data) 47 47
-             344:  20(i8vec4) Load 343
-             345: 236(i8vec2) VectorShuffle 344 344 0 1
-             346: 236(i8vec2) GroupNonUniformBitwiseAnd 43 ClusteredReduce 345 42
-             347:    237(ptr) AccessChain 34(data) 342 47
-             348:  20(i8vec4) Load 347
-             349:  20(i8vec4) VectorShuffle 348 346 4 5 2 3
-                              Store 347 349
-             350:      6(int) Load 8(invocation)
-             351:    237(ptr) AccessChain 34(data) 58 47
-             352:  20(i8vec4) Load 351
-             353: 246(i8vec3) VectorShuffle 352 352 0 1 2
-             354: 246(i8vec3) GroupNonUniformBitwiseAnd 43 ClusteredReduce 353 42
-             355:    237(ptr) AccessChain 34(data) 350 47
-             356:  20(i8vec4) Load 355
-             357:  20(i8vec4) VectorShuffle 356 354 4 5 6 3
-                              Store 355 357
-             358:      6(int) Load 8(invocation)
-             359:    237(ptr) AccessChain 34(data) 68 47
-             360:  20(i8vec4) Load 359
-             361:  20(i8vec4) GroupNonUniformBitwiseAnd 43 ClusteredReduce 360 42
-             362:    237(ptr) AccessChain 34(data) 358 47
-                              Store 362 361
-             363:      6(int) Load 8(invocation)
-             364:    230(ptr) AccessChain 34(data) 37 47 38
-             365:  19(int8_t) Load 364
-             366:  19(int8_t) GroupNonUniformBitwiseOr 43 ClusteredReduce 365 42
-             367:    230(ptr) AccessChain 34(data) 363 47 38
-                              Store 367 366
-             368:      6(int) Load 8(invocation)
-             369:    237(ptr) AccessChain 34(data) 47 47
-             370:  20(i8vec4) Load 369
-             371: 236(i8vec2) VectorShuffle 370 370 0 1
-             372: 236(i8vec2) GroupNonUniformBitwiseOr 43 ClusteredReduce 371 42
-             373:    237(ptr) AccessChain 34(data) 368 47
-             374:  20(i8vec4) Load 373
-             375:  20(i8vec4) VectorShuffle 374 372 4 5 2 3
-                              Store 373 375
-             376:      6(int) Load 8(invocation)
-             377:    237(ptr) AccessChain 34(data) 58 47
-             378:  20(i8vec4) Load 377
-             379: 246(i8vec3) VectorShuffle 378 378 0 1 2
-             380: 246(i8vec3) GroupNonUniformBitwiseOr 43 ClusteredReduce 379 42
-             381:    237(ptr) AccessChain 34(data) 376 47
-             382:  20(i8vec4) Load 381
-             383:  20(i8vec4) VectorShuffle 382 380 4 5 6 3
-                              Store 381 383
-             384:      6(int) Load 8(invocation)
-             385:    237(ptr) AccessChain 34(data) 68 47
-             386:  20(i8vec4) Load 385
-             387:  20(i8vec4) GroupNonUniformBitwiseOr 43 ClusteredReduce 386 42
-             388:    237(ptr) AccessChain 34(data) 384 47
-                              Store 388 387
-             389:      6(int) Load 8(invocation)
-             390:    230(ptr) AccessChain 34(data) 37 47 38
-             391:  19(int8_t) Load 390
-             392:  19(int8_t) GroupNonUniformBitwiseXor 43 ClusteredReduce 391 42
-             393:    230(ptr) AccessChain 34(data) 389 47 38
-                              Store 393 392
-             394:      6(int) Load 8(invocation)
-             395:    237(ptr) AccessChain 34(data) 47 47
-             396:  20(i8vec4) Load 395
-             397: 236(i8vec2) VectorShuffle 396 396 0 1
-             398: 236(i8vec2) GroupNonUniformBitwiseXor 43 ClusteredReduce 397 42
-             399:    237(ptr) AccessChain 34(data) 394 47
-             400:  20(i8vec4) Load 399
-             401:  20(i8vec4) VectorShuffle 400 398 4 5 2 3
-                              Store 399 401
-             402:      6(int) Load 8(invocation)
-             403:    237(ptr) AccessChain 34(data) 58 47
-             404:  20(i8vec4) Load 403
-             405: 246(i8vec3) VectorShuffle 404 404 0 1 2
-             406: 246(i8vec3) GroupNonUniformBitwiseXor 43 ClusteredReduce 405 42
-             407:    237(ptr) AccessChain 34(data) 402 47
-             408:  20(i8vec4) Load 407
-             409:  20(i8vec4) VectorShuffle 408 406 4 5 6 3
-                              Store 407 409
-             410:      6(int) Load 8(invocation)
-             411:    237(ptr) AccessChain 34(data) 68 47
-             412:  20(i8vec4) Load 411
-             413:  20(i8vec4) GroupNonUniformBitwiseXor 43 ClusteredReduce 412 42
-             414:    237(ptr) AccessChain 34(data) 410 47
-                              Store 414 413
-             415:      6(int) Load 8(invocation)
-             417:    416(ptr) AccessChain 34(data) 37 58 38
-             418: 21(int16_t) Load 417
-             419: 21(int16_t) GroupNonUniformIAdd 43 ClusteredReduce 418 42
-             420:    416(ptr) AccessChain 34(data) 415 58 38
-                              Store 420 419
-             421:      6(int) Load 8(invocation)
-             424:    423(ptr) AccessChain 34(data) 47 58
-             425: 22(i16vec4) Load 424
-             426:422(i16vec2) VectorShuffle 425 425 0 1
-             427:422(i16vec2) GroupNonUniformIAdd 43 ClusteredReduce 426 42
-             428:    423(ptr) AccessChain 34(data) 421 58
-             429: 22(i16vec4) Load 428
-             430: 22(i16vec4) VectorShuffle 429 427 4 5 2 3
-                              Store 428 430
-             431:      6(int) Load 8(invocation)
-             433:    423(ptr) AccessChain 34(data) 58 58
-             434: 22(i16vec4) Load 433
-             435:432(i16vec3) VectorShuffle 434 434 0 1 2
-             436:432(i16vec3) GroupNonUniformIAdd 43 ClusteredReduce 435 42
-             437:    423(ptr) AccessChain 34(data) 431 58
-             438: 22(i16vec4) Load 437
-             439: 22(i16vec4) VectorShuffle 438 436 4 5 6 3
-                              Store 437 439
-             440:      6(int) Load 8(invocation)
-             441:    423(ptr) AccessChain 34(data) 68 58
-             442: 22(i16vec4) Load 441
-             443: 22(i16vec4) GroupNonUniformIAdd 43 ClusteredReduce 442 42
-             444:    423(ptr) AccessChain 34(data) 440 58
-                              Store 444 443
-             445:      6(int) Load 8(invocation)
-             446:    416(ptr) AccessChain 34(data) 37 58 38
-             447: 21(int16_t) Load 446
-             448: 21(int16_t) GroupNonUniformIMul 43 ClusteredReduce 447 42
-             449:    416(ptr) AccessChain 34(data) 445 58 38
-                              Store 449 448
-             450:      6(int) Load 8(invocation)
-             451:    423(ptr) AccessChain 34(data) 47 58
-             452: 22(i16vec4) Load 451
-             453:422(i16vec2) VectorShuffle 452 452 0 1
-             454:422(i16vec2) GroupNonUniformIMul 43 ClusteredReduce 453 42
-             455:    423(ptr) AccessChain 34(data) 450 58
-             456: 22(i16vec4) Load 455
-             457: 22(i16vec4) VectorShuffle 456 454 4 5 2 3
-                              Store 455 457
-             458:      6(int) Load 8(invocation)
-             459:    423(ptr) AccessChain 34(data) 58 58
-             460: 22(i16vec4) Load 459
-             461:432(i16vec3) VectorShuffle 460 460 0 1 2
-             462:432(i16vec3) GroupNonUniformIMul 43 ClusteredReduce 461 42
-             463:    423(ptr) AccessChain 34(data) 458 58
-             464: 22(i16vec4) Load 463
-             465: 22(i16vec4) VectorShuffle 464 462 4 5 6 3
-                              Store 463 465
-             466:      6(int) Load 8(invocation)
-             467:    423(ptr) AccessChain 34(data) 68 58
-             468: 22(i16vec4) Load 467
-             469: 22(i16vec4) GroupNonUniformIMul 43 ClusteredReduce 468 42
-             470:    423(ptr) AccessChain 34(data) 466 58
-                              Store 470 469
-             471:      6(int) Load 8(invocation)
-             472:    416(ptr) AccessChain 34(data) 37 58 38
-             473: 21(int16_t) Load 472
-             474: 21(int16_t) GroupNonUniformSMin 43 ClusteredReduce 473 42
-             475:    416(ptr) AccessChain 34(data) 471 58 38
-                              Store 475 474
-             476:      6(int) Load 8(invocation)
-             477:    423(ptr) AccessChain 34(data) 47 58
-             478: 22(i16vec4) Load 477
-             479:422(i16vec2) VectorShuffle 478 478 0 1
-             480:422(i16vec2) GroupNonUniformSMin 43 ClusteredReduce 479 42
-             481:    423(ptr) AccessChain 34(data) 476 58
+             309: 276(i8vec3) VectorShuffle 308 308 0 1 2
+             310: 276(i8vec3) GroupNonUniformIMul 43 ClusteredReduce 309 42
+             311:    259(ptr) AccessChain 34(data) 306 47 38
+             312:  19(int8_t) CompositeExtract 310 0
+                              Store 311 312
+             313:    259(ptr) AccessChain 34(data) 306 47 42
+             314:  19(int8_t) CompositeExtract 310 1
+                              Store 313 314
+             315:    259(ptr) AccessChain 34(data) 306 47 69
+             316:  19(int8_t) CompositeExtract 310 2
+                              Store 315 316
+             317:      6(int) Load 8(invocation)
+             318:    266(ptr) AccessChain 34(data) 73 47
+             319:  20(i8vec4) Load 318
+             320:  20(i8vec4) GroupNonUniformIMul 43 ClusteredReduce 319 42
+             321:    266(ptr) AccessChain 34(data) 317 47
+                              Store 321 320
+             322:      6(int) Load 8(invocation)
+             323:    259(ptr) AccessChain 34(data) 37 47 38
+             324:  19(int8_t) Load 323
+             325:  19(int8_t) GroupNonUniformUMin 43 ClusteredReduce 324 42
+             326:    259(ptr) AccessChain 34(data) 322 47 38
+                              Store 326 325
+             327:      6(int) Load 8(invocation)
+             328:    266(ptr) AccessChain 34(data) 47 47
+             329:  20(i8vec4) Load 328
+             330: 265(i8vec2) VectorShuffle 329 329 0 1
+             331: 265(i8vec2) GroupNonUniformUMin 43 ClusteredReduce 330 42
+             332:    259(ptr) AccessChain 34(data) 327 47 38
+             333:  19(int8_t) CompositeExtract 331 0
+                              Store 332 333
+             334:    259(ptr) AccessChain 34(data) 327 47 42
+             335:  19(int8_t) CompositeExtract 331 1
+                              Store 334 335
+             336:      6(int) Load 8(invocation)
+             337:    266(ptr) AccessChain 34(data) 59 47
+             338:  20(i8vec4) Load 337
+             339: 276(i8vec3) VectorShuffle 338 338 0 1 2
+             340: 276(i8vec3) GroupNonUniformUMin 43 ClusteredReduce 339 42
+             341:    259(ptr) AccessChain 34(data) 336 47 38
+             342:  19(int8_t) CompositeExtract 340 0
+                              Store 341 342
+             343:    259(ptr) AccessChain 34(data) 336 47 42
+             344:  19(int8_t) CompositeExtract 340 1
+                              Store 343 344
+             345:    259(ptr) AccessChain 34(data) 336 47 69
+             346:  19(int8_t) CompositeExtract 340 2
+                              Store 345 346
+             347:      6(int) Load 8(invocation)
+             348:    266(ptr) AccessChain 34(data) 73 47
+             349:  20(i8vec4) Load 348
+             350:  20(i8vec4) GroupNonUniformUMin 43 ClusteredReduce 349 42
+             351:    266(ptr) AccessChain 34(data) 347 47
+                              Store 351 350
+             352:      6(int) Load 8(invocation)
+             353:    259(ptr) AccessChain 34(data) 37 47 38
+             354:  19(int8_t) Load 353
+             355:  19(int8_t) GroupNonUniformUMax 43 ClusteredReduce 354 42
+             356:    259(ptr) AccessChain 34(data) 352 47 38
+                              Store 356 355
+             357:      6(int) Load 8(invocation)
+             358:    266(ptr) AccessChain 34(data) 47 47
+             359:  20(i8vec4) Load 358
+             360: 265(i8vec2) VectorShuffle 359 359 0 1
+             361: 265(i8vec2) GroupNonUniformUMax 43 ClusteredReduce 360 42
+             362:    259(ptr) AccessChain 34(data) 357 47 38
+             363:  19(int8_t) CompositeExtract 361 0
+                              Store 362 363
+             364:    259(ptr) AccessChain 34(data) 357 47 42
+             365:  19(int8_t) CompositeExtract 361 1
+                              Store 364 365
+             366:      6(int) Load 8(invocation)
+             367:    266(ptr) AccessChain 34(data) 59 47
+             368:  20(i8vec4) Load 367
+             369: 276(i8vec3) VectorShuffle 368 368 0 1 2
+             370: 276(i8vec3) GroupNonUniformUMax 43 ClusteredReduce 369 42
+             371:    259(ptr) AccessChain 34(data) 366 47 38
+             372:  19(int8_t) CompositeExtract 370 0
+                              Store 371 372
+             373:    259(ptr) AccessChain 34(data) 366 47 42
+             374:  19(int8_t) CompositeExtract 370 1
+                              Store 373 374
+             375:    259(ptr) AccessChain 34(data) 366 47 69
+             376:  19(int8_t) CompositeExtract 370 2
+                              Store 375 376
+             377:      6(int) Load 8(invocation)
+             378:    266(ptr) AccessChain 34(data) 73 47
+             379:  20(i8vec4) Load 378
+             380:  20(i8vec4) GroupNonUniformUMax 43 ClusteredReduce 379 42
+             381:    266(ptr) AccessChain 34(data) 377 47
+                              Store 381 380
+             382:      6(int) Load 8(invocation)
+             383:    259(ptr) AccessChain 34(data) 37 47 38
+             384:  19(int8_t) Load 383
+             385:  19(int8_t) GroupNonUniformBitwiseAnd 43 ClusteredReduce 384 42
+             386:    259(ptr) AccessChain 34(data) 382 47 38
+                              Store 386 385
+             387:      6(int) Load 8(invocation)
+             388:    266(ptr) AccessChain 34(data) 47 47
+             389:  20(i8vec4) Load 388
+             390: 265(i8vec2) VectorShuffle 389 389 0 1
+             391: 265(i8vec2) GroupNonUniformBitwiseAnd 43 ClusteredReduce 390 42
+             392:    259(ptr) AccessChain 34(data) 387 47 38
+             393:  19(int8_t) CompositeExtract 391 0
+                              Store 392 393
+             394:    259(ptr) AccessChain 34(data) 387 47 42
+             395:  19(int8_t) CompositeExtract 391 1
+                              Store 394 395
+             396:      6(int) Load 8(invocation)
+             397:    266(ptr) AccessChain 34(data) 59 47
+             398:  20(i8vec4) Load 397
+             399: 276(i8vec3) VectorShuffle 398 398 0 1 2
+             400: 276(i8vec3) GroupNonUniformBitwiseAnd 43 ClusteredReduce 399 42
+             401:    259(ptr) AccessChain 34(data) 396 47 38
+             402:  19(int8_t) CompositeExtract 400 0
+                              Store 401 402
+             403:    259(ptr) AccessChain 34(data) 396 47 42
+             404:  19(int8_t) CompositeExtract 400 1
+                              Store 403 404
+             405:    259(ptr) AccessChain 34(data) 396 47 69
+             406:  19(int8_t) CompositeExtract 400 2
+                              Store 405 406
+             407:      6(int) Load 8(invocation)
+             408:    266(ptr) AccessChain 34(data) 73 47
+             409:  20(i8vec4) Load 408
+             410:  20(i8vec4) GroupNonUniformBitwiseAnd 43 ClusteredReduce 409 42
+             411:    266(ptr) AccessChain 34(data) 407 47
+                              Store 411 410
+             412:      6(int) Load 8(invocation)
+             413:    259(ptr) AccessChain 34(data) 37 47 38
+             414:  19(int8_t) Load 413
+             415:  19(int8_t) GroupNonUniformBitwiseOr 43 ClusteredReduce 414 42
+             416:    259(ptr) AccessChain 34(data) 412 47 38
+                              Store 416 415
+             417:      6(int) Load 8(invocation)
+             418:    266(ptr) AccessChain 34(data) 47 47
+             419:  20(i8vec4) Load 418
+             420: 265(i8vec2) VectorShuffle 419 419 0 1
+             421: 265(i8vec2) GroupNonUniformBitwiseOr 43 ClusteredReduce 420 42
+             422:    259(ptr) AccessChain 34(data) 417 47 38
+             423:  19(int8_t) CompositeExtract 421 0
+                              Store 422 423
+             424:    259(ptr) AccessChain 34(data) 417 47 42
+             425:  19(int8_t) CompositeExtract 421 1
+                              Store 424 425
+             426:      6(int) Load 8(invocation)
+             427:    266(ptr) AccessChain 34(data) 59 47
+             428:  20(i8vec4) Load 427
+             429: 276(i8vec3) VectorShuffle 428 428 0 1 2
+             430: 276(i8vec3) GroupNonUniformBitwiseOr 43 ClusteredReduce 429 42
+             431:    259(ptr) AccessChain 34(data) 426 47 38
+             432:  19(int8_t) CompositeExtract 430 0
+                              Store 431 432
+             433:    259(ptr) AccessChain 34(data) 426 47 42
+             434:  19(int8_t) CompositeExtract 430 1
+                              Store 433 434
+             435:    259(ptr) AccessChain 34(data) 426 47 69
+             436:  19(int8_t) CompositeExtract 430 2
+                              Store 435 436
+             437:      6(int) Load 8(invocation)
+             438:    266(ptr) AccessChain 34(data) 73 47
+             439:  20(i8vec4) Load 438
+             440:  20(i8vec4) GroupNonUniformBitwiseOr 43 ClusteredReduce 439 42
+             441:    266(ptr) AccessChain 34(data) 437 47
+                              Store 441 440
+             442:      6(int) Load 8(invocation)
+             443:    259(ptr) AccessChain 34(data) 37 47 38
+             444:  19(int8_t) Load 443
+             445:  19(int8_t) GroupNonUniformBitwiseXor 43 ClusteredReduce 444 42
+             446:    259(ptr) AccessChain 34(data) 442 47 38
+                              Store 446 445
+             447:      6(int) Load 8(invocation)
+             448:    266(ptr) AccessChain 34(data) 47 47
+             449:  20(i8vec4) Load 448
+             450: 265(i8vec2) VectorShuffle 449 449 0 1
+             451: 265(i8vec2) GroupNonUniformBitwiseXor 43 ClusteredReduce 450 42
+             452:    259(ptr) AccessChain 34(data) 447 47 38
+             453:  19(int8_t) CompositeExtract 451 0
+                              Store 452 453
+             454:    259(ptr) AccessChain 34(data) 447 47 42
+             455:  19(int8_t) CompositeExtract 451 1
+                              Store 454 455
+             456:      6(int) Load 8(invocation)
+             457:    266(ptr) AccessChain 34(data) 59 47
+             458:  20(i8vec4) Load 457
+             459: 276(i8vec3) VectorShuffle 458 458 0 1 2
+             460: 276(i8vec3) GroupNonUniformBitwiseXor 43 ClusteredReduce 459 42
+             461:    259(ptr) AccessChain 34(data) 456 47 38
+             462:  19(int8_t) CompositeExtract 460 0
+                              Store 461 462
+             463:    259(ptr) AccessChain 34(data) 456 47 42
+             464:  19(int8_t) CompositeExtract 460 1
+                              Store 463 464
+             465:    259(ptr) AccessChain 34(data) 456 47 69
+             466:  19(int8_t) CompositeExtract 460 2
+                              Store 465 466
+             467:      6(int) Load 8(invocation)
+             468:    266(ptr) AccessChain 34(data) 73 47
+             469:  20(i8vec4) Load 468
+             470:  20(i8vec4) GroupNonUniformBitwiseXor 43 ClusteredReduce 469 42
+             471:    266(ptr) AccessChain 34(data) 467 47
+                              Store 471 470
+             472:      6(int) Load 8(invocation)
+             474:    473(ptr) AccessChain 34(data) 37 59 38
+             475: 21(int16_t) Load 474
+             476: 21(int16_t) GroupNonUniformIAdd 43 ClusteredReduce 475 42
+             477:    473(ptr) AccessChain 34(data) 472 59 38
+                              Store 477 476
+             478:      6(int) Load 8(invocation)
+             481:    480(ptr) AccessChain 34(data) 47 59
              482: 22(i16vec4) Load 481
-             483: 22(i16vec4) VectorShuffle 482 480 4 5 2 3
-                              Store 481 483
-             484:      6(int) Load 8(invocation)
-             485:    423(ptr) AccessChain 34(data) 58 58
-             486: 22(i16vec4) Load 485
-             487:432(i16vec3) VectorShuffle 486 486 0 1 2
-             488:432(i16vec3) GroupNonUniformSMin 43 ClusteredReduce 487 42
-             489:    423(ptr) AccessChain 34(data) 484 58
-             490: 22(i16vec4) Load 489
-             491: 22(i16vec4) VectorShuffle 490 488 4 5 6 3
-                              Store 489 491
-             492:      6(int) Load 8(invocation)
-             493:    423(ptr) AccessChain 34(data) 68 58
-             494: 22(i16vec4) Load 493
-             495: 22(i16vec4) GroupNonUniformSMin 43 ClusteredReduce 494 42
-             496:    423(ptr) AccessChain 34(data) 492 58
-                              Store 496 495
-             497:      6(int) Load 8(invocation)
-             498:    416(ptr) AccessChain 34(data) 37 58 38
-             499: 21(int16_t) Load 498
-             500: 21(int16_t) GroupNonUniformSMax 43 ClusteredReduce 499 42
-             501:    416(ptr) AccessChain 34(data) 497 58 38
-                              Store 501 500
-             502:      6(int) Load 8(invocation)
-             503:    423(ptr) AccessChain 34(data) 47 58
-             504: 22(i16vec4) Load 503
-             505:422(i16vec2) VectorShuffle 504 504 0 1
-             506:422(i16vec2) GroupNonUniformSMax 43 ClusteredReduce 505 42
-             507:    423(ptr) AccessChain 34(data) 502 58
-             508: 22(i16vec4) Load 507
-             509: 22(i16vec4) VectorShuffle 508 506 4 5 2 3
-                              Store 507 509
-             510:      6(int) Load 8(invocation)
-             511:    423(ptr) AccessChain 34(data) 58 58
-             512: 22(i16vec4) Load 511
-             513:432(i16vec3) VectorShuffle 512 512 0 1 2
-             514:432(i16vec3) GroupNonUniformSMax 43 ClusteredReduce 513 42
-             515:    423(ptr) AccessChain 34(data) 510 58
-             516: 22(i16vec4) Load 515
-             517: 22(i16vec4) VectorShuffle 516 514 4 5 6 3
-                              Store 515 517
-             518:      6(int) Load 8(invocation)
-             519:    423(ptr) AccessChain 34(data) 68 58
-             520: 22(i16vec4) Load 519
-             521: 22(i16vec4) GroupNonUniformSMax 43 ClusteredReduce 520 42
-             522:    423(ptr) AccessChain 34(data) 518 58
-                              Store 522 521
-             523:      6(int) Load 8(invocation)
-             524:    416(ptr) AccessChain 34(data) 37 58 38
-             525: 21(int16_t) Load 524
-             526: 21(int16_t) GroupNonUniformBitwiseAnd 43 ClusteredReduce 525 42
-             527:    416(ptr) AccessChain 34(data) 523 58 38
-                              Store 527 526
-             528:      6(int) Load 8(invocation)
-             529:    423(ptr) AccessChain 34(data) 47 58
-             530: 22(i16vec4) Load 529
-             531:422(i16vec2) VectorShuffle 530 530 0 1
-             532:422(i16vec2) GroupNonUniformBitwiseAnd 43 ClusteredReduce 531 42
-             533:    423(ptr) AccessChain 34(data) 528 58
-             534: 22(i16vec4) Load 533
-             535: 22(i16vec4) VectorShuffle 534 532 4 5 2 3
-                              Store 533 535
+             483:479(i16vec2) VectorShuffle 482 482 0 1
+             484:479(i16vec2) GroupNonUniformIAdd 43 ClusteredReduce 483 42
+             485:    473(ptr) AccessChain 34(data) 478 59 38
+             486: 21(int16_t) CompositeExtract 484 0
+                              Store 485 486
+             487:    473(ptr) AccessChain 34(data) 478 59 42
+             488: 21(int16_t) CompositeExtract 484 1
+                              Store 487 488
+             489:      6(int) Load 8(invocation)
+             491:    480(ptr) AccessChain 34(data) 59 59
+             492: 22(i16vec4) Load 491
+             493:490(i16vec3) VectorShuffle 492 492 0 1 2
+             494:490(i16vec3) GroupNonUniformIAdd 43 ClusteredReduce 493 42
+             495:    473(ptr) AccessChain 34(data) 489 59 38
+             496: 21(int16_t) CompositeExtract 494 0
+                              Store 495 496
+             497:    473(ptr) AccessChain 34(data) 489 59 42
+             498: 21(int16_t) CompositeExtract 494 1
+                              Store 497 498
+             499:    473(ptr) AccessChain 34(data) 489 59 69
+             500: 21(int16_t) CompositeExtract 494 2
+                              Store 499 500
+             501:      6(int) Load 8(invocation)
+             502:    480(ptr) AccessChain 34(data) 73 59
+             503: 22(i16vec4) Load 502
+             504: 22(i16vec4) GroupNonUniformIAdd 43 ClusteredReduce 503 42
+             505:    480(ptr) AccessChain 34(data) 501 59
+                              Store 505 504
+             506:      6(int) Load 8(invocation)
+             507:    473(ptr) AccessChain 34(data) 37 59 38
+             508: 21(int16_t) Load 507
+             509: 21(int16_t) GroupNonUniformIMul 43 ClusteredReduce 508 42
+             510:    473(ptr) AccessChain 34(data) 506 59 38
+                              Store 510 509
+             511:      6(int) Load 8(invocation)
+             512:    480(ptr) AccessChain 34(data) 47 59
+             513: 22(i16vec4) Load 512
+             514:479(i16vec2) VectorShuffle 513 513 0 1
+             515:479(i16vec2) GroupNonUniformIMul 43 ClusteredReduce 514 42
+             516:    473(ptr) AccessChain 34(data) 511 59 38
+             517: 21(int16_t) CompositeExtract 515 0
+                              Store 516 517
+             518:    473(ptr) AccessChain 34(data) 511 59 42
+             519: 21(int16_t) CompositeExtract 515 1
+                              Store 518 519
+             520:      6(int) Load 8(invocation)
+             521:    480(ptr) AccessChain 34(data) 59 59
+             522: 22(i16vec4) Load 521
+             523:490(i16vec3) VectorShuffle 522 522 0 1 2
+             524:490(i16vec3) GroupNonUniformIMul 43 ClusteredReduce 523 42
+             525:    473(ptr) AccessChain 34(data) 520 59 38
+             526: 21(int16_t) CompositeExtract 524 0
+                              Store 525 526
+             527:    473(ptr) AccessChain 34(data) 520 59 42
+             528: 21(int16_t) CompositeExtract 524 1
+                              Store 527 528
+             529:    473(ptr) AccessChain 34(data) 520 59 69
+             530: 21(int16_t) CompositeExtract 524 2
+                              Store 529 530
+             531:      6(int) Load 8(invocation)
+             532:    480(ptr) AccessChain 34(data) 73 59
+             533: 22(i16vec4) Load 532
+             534: 22(i16vec4) GroupNonUniformIMul 43 ClusteredReduce 533 42
+             535:    480(ptr) AccessChain 34(data) 531 59
+                              Store 535 534
              536:      6(int) Load 8(invocation)
-             537:    423(ptr) AccessChain 34(data) 58 58
-             538: 22(i16vec4) Load 537
-             539:432(i16vec3) VectorShuffle 538 538 0 1 2
-             540:432(i16vec3) GroupNonUniformBitwiseAnd 43 ClusteredReduce 539 42
-             541:    423(ptr) AccessChain 34(data) 536 58
-             542: 22(i16vec4) Load 541
-             543: 22(i16vec4) VectorShuffle 542 540 4 5 6 3
-                              Store 541 543
-             544:      6(int) Load 8(invocation)
-             545:    423(ptr) AccessChain 34(data) 68 58
-             546: 22(i16vec4) Load 545
-             547: 22(i16vec4) GroupNonUniformBitwiseAnd 43 ClusteredReduce 546 42
-             548:    423(ptr) AccessChain 34(data) 544 58
-                              Store 548 547
-             549:      6(int) Load 8(invocation)
-             550:    416(ptr) AccessChain 34(data) 37 58 38
-             551: 21(int16_t) Load 550
-             552: 21(int16_t) GroupNonUniformBitwiseOr 43 ClusteredReduce 551 42
-             553:    416(ptr) AccessChain 34(data) 549 58 38
-                              Store 553 552
-             554:      6(int) Load 8(invocation)
-             555:    423(ptr) AccessChain 34(data) 47 58
-             556: 22(i16vec4) Load 555
-             557:422(i16vec2) VectorShuffle 556 556 0 1
-             558:422(i16vec2) GroupNonUniformBitwiseOr 43 ClusteredReduce 557 42
-             559:    423(ptr) AccessChain 34(data) 554 58
-             560: 22(i16vec4) Load 559
-             561: 22(i16vec4) VectorShuffle 560 558 4 5 2 3
-                              Store 559 561
-             562:      6(int) Load 8(invocation)
-             563:    423(ptr) AccessChain 34(data) 58 58
-             564: 22(i16vec4) Load 563
-             565:432(i16vec3) VectorShuffle 564 564 0 1 2
-             566:432(i16vec3) GroupNonUniformBitwiseOr 43 ClusteredReduce 565 42
-             567:    423(ptr) AccessChain 34(data) 562 58
-             568: 22(i16vec4) Load 567
-             569: 22(i16vec4) VectorShuffle 568 566 4 5 6 3
-                              Store 567 569
-             570:      6(int) Load 8(invocation)
-             571:    423(ptr) AccessChain 34(data) 68 58
-             572: 22(i16vec4) Load 571
-             573: 22(i16vec4) GroupNonUniformBitwiseOr 43 ClusteredReduce 572 42
-             574:    423(ptr) AccessChain 34(data) 570 58
-                              Store 574 573
-             575:      6(int) Load 8(invocation)
-             576:    416(ptr) AccessChain 34(data) 37 58 38
-             577: 21(int16_t) Load 576
-             578: 21(int16_t) GroupNonUniformBitwiseXor 43 ClusteredReduce 577 42
-             579:    416(ptr) AccessChain 34(data) 575 58 38
-                              Store 579 578
+             537:    473(ptr) AccessChain 34(data) 37 59 38
+             538: 21(int16_t) Load 537
+             539: 21(int16_t) GroupNonUniformSMin 43 ClusteredReduce 538 42
+             540:    473(ptr) AccessChain 34(data) 536 59 38
+                              Store 540 539
+             541:      6(int) Load 8(invocation)
+             542:    480(ptr) AccessChain 34(data) 47 59
+             543: 22(i16vec4) Load 542
+             544:479(i16vec2) VectorShuffle 543 543 0 1
+             545:479(i16vec2) GroupNonUniformSMin 43 ClusteredReduce 544 42
+             546:    473(ptr) AccessChain 34(data) 541 59 38
+             547: 21(int16_t) CompositeExtract 545 0
+                              Store 546 547
+             548:    473(ptr) AccessChain 34(data) 541 59 42
+             549: 21(int16_t) CompositeExtract 545 1
+                              Store 548 549
+             550:      6(int) Load 8(invocation)
+             551:    480(ptr) AccessChain 34(data) 59 59
+             552: 22(i16vec4) Load 551
+             553:490(i16vec3) VectorShuffle 552 552 0 1 2
+             554:490(i16vec3) GroupNonUniformSMin 43 ClusteredReduce 553 42
+             555:    473(ptr) AccessChain 34(data) 550 59 38
+             556: 21(int16_t) CompositeExtract 554 0
+                              Store 555 556
+             557:    473(ptr) AccessChain 34(data) 550 59 42
+             558: 21(int16_t) CompositeExtract 554 1
+                              Store 557 558
+             559:    473(ptr) AccessChain 34(data) 550 59 69
+             560: 21(int16_t) CompositeExtract 554 2
+                              Store 559 560
+             561:      6(int) Load 8(invocation)
+             562:    480(ptr) AccessChain 34(data) 73 59
+             563: 22(i16vec4) Load 562
+             564: 22(i16vec4) GroupNonUniformSMin 43 ClusteredReduce 563 42
+             565:    480(ptr) AccessChain 34(data) 561 59
+                              Store 565 564
+             566:      6(int) Load 8(invocation)
+             567:    473(ptr) AccessChain 34(data) 37 59 38
+             568: 21(int16_t) Load 567
+             569: 21(int16_t) GroupNonUniformSMax 43 ClusteredReduce 568 42
+             570:    473(ptr) AccessChain 34(data) 566 59 38
+                              Store 570 569
+             571:      6(int) Load 8(invocation)
+             572:    480(ptr) AccessChain 34(data) 47 59
+             573: 22(i16vec4) Load 572
+             574:479(i16vec2) VectorShuffle 573 573 0 1
+             575:479(i16vec2) GroupNonUniformSMax 43 ClusteredReduce 574 42
+             576:    473(ptr) AccessChain 34(data) 571 59 38
+             577: 21(int16_t) CompositeExtract 575 0
+                              Store 576 577
+             578:    473(ptr) AccessChain 34(data) 571 59 42
+             579: 21(int16_t) CompositeExtract 575 1
+                              Store 578 579
              580:      6(int) Load 8(invocation)
-             581:    423(ptr) AccessChain 34(data) 47 58
+             581:    480(ptr) AccessChain 34(data) 59 59
              582: 22(i16vec4) Load 581
-             583:422(i16vec2) VectorShuffle 582 582 0 1
-             584:422(i16vec2) GroupNonUniformBitwiseXor 43 ClusteredReduce 583 42
-             585:    423(ptr) AccessChain 34(data) 580 58
-             586: 22(i16vec4) Load 585
-             587: 22(i16vec4) VectorShuffle 586 584 4 5 2 3
-                              Store 585 587
-             588:      6(int) Load 8(invocation)
-             589:    423(ptr) AccessChain 34(data) 58 58
-             590: 22(i16vec4) Load 589
-             591:432(i16vec3) VectorShuffle 590 590 0 1 2
-             592:432(i16vec3) GroupNonUniformBitwiseXor 43 ClusteredReduce 591 42
-             593:    423(ptr) AccessChain 34(data) 588 58
-             594: 22(i16vec4) Load 593
-             595: 22(i16vec4) VectorShuffle 594 592 4 5 6 3
-                              Store 593 595
+             583:490(i16vec3) VectorShuffle 582 582 0 1 2
+             584:490(i16vec3) GroupNonUniformSMax 43 ClusteredReduce 583 42
+             585:    473(ptr) AccessChain 34(data) 580 59 38
+             586: 21(int16_t) CompositeExtract 584 0
+                              Store 585 586
+             587:    473(ptr) AccessChain 34(data) 580 59 42
+             588: 21(int16_t) CompositeExtract 584 1
+                              Store 587 588
+             589:    473(ptr) AccessChain 34(data) 580 59 69
+             590: 21(int16_t) CompositeExtract 584 2
+                              Store 589 590
+             591:      6(int) Load 8(invocation)
+             592:    480(ptr) AccessChain 34(data) 73 59
+             593: 22(i16vec4) Load 592
+             594: 22(i16vec4) GroupNonUniformSMax 43 ClusteredReduce 593 42
+             595:    480(ptr) AccessChain 34(data) 591 59
+                              Store 595 594
              596:      6(int) Load 8(invocation)
-             597:    423(ptr) AccessChain 34(data) 68 58
-             598: 22(i16vec4) Load 597
-             599: 22(i16vec4) GroupNonUniformBitwiseXor 43 ClusteredReduce 598 42
-             600:    423(ptr) AccessChain 34(data) 596 58
+             597:    473(ptr) AccessChain 34(data) 37 59 38
+             598: 21(int16_t) Load 597
+             599: 21(int16_t) GroupNonUniformBitwiseAnd 43 ClusteredReduce 598 42
+             600:    473(ptr) AccessChain 34(data) 596 59 38
                               Store 600 599
              601:      6(int) Load 8(invocation)
-             603:    602(ptr) AccessChain 34(data) 37 68 38
-             604: 23(int16_t) Load 603
-             605: 23(int16_t) GroupNonUniformIAdd 43 ClusteredReduce 604 42
-             606:    602(ptr) AccessChain 34(data) 601 68 38
-                              Store 606 605
-             607:      6(int) Load 8(invocation)
-             610:    609(ptr) AccessChain 34(data) 47 68
-             611: 24(i16vec4) Load 610
-             612:608(i16vec2) VectorShuffle 611 611 0 1
-             613:608(i16vec2) GroupNonUniformIAdd 43 ClusteredReduce 612 42
-             614:    609(ptr) AccessChain 34(data) 607 68
-             615: 24(i16vec4) Load 614
-             616: 24(i16vec4) VectorShuffle 615 613 4 5 2 3
-                              Store 614 616
-             617:      6(int) Load 8(invocation)
-             619:    609(ptr) AccessChain 34(data) 58 68
-             620: 24(i16vec4) Load 619
-             621:618(i16vec3) VectorShuffle 620 620 0 1 2
-             622:618(i16vec3) GroupNonUniformIAdd 43 ClusteredReduce 621 42
-             623:    609(ptr) AccessChain 34(data) 617 68
-             624: 24(i16vec4) Load 623
-             625: 24(i16vec4) VectorShuffle 624 622 4 5 6 3
-                              Store 623 625
+             602:    480(ptr) AccessChain 34(data) 47 59
+             603: 22(i16vec4) Load 602
+             604:479(i16vec2) VectorShuffle 603 603 0 1
+             605:479(i16vec2) GroupNonUniformBitwiseAnd 43 ClusteredReduce 604 42
+             606:    473(ptr) AccessChain 34(data) 601 59 38
+             607: 21(int16_t) CompositeExtract 605 0
+                              Store 606 607
+             608:    473(ptr) AccessChain 34(data) 601 59 42
+             609: 21(int16_t) CompositeExtract 605 1
+                              Store 608 609
+             610:      6(int) Load 8(invocation)
+             611:    480(ptr) AccessChain 34(data) 59 59
+             612: 22(i16vec4) Load 611
+             613:490(i16vec3) VectorShuffle 612 612 0 1 2
+             614:490(i16vec3) GroupNonUniformBitwiseAnd 43 ClusteredReduce 613 42
+             615:    473(ptr) AccessChain 34(data) 610 59 38
+             616: 21(int16_t) CompositeExtract 614 0
+                              Store 615 616
+             617:    473(ptr) AccessChain 34(data) 610 59 42
+             618: 21(int16_t) CompositeExtract 614 1
+                              Store 617 618
+             619:    473(ptr) AccessChain 34(data) 610 59 69
+             620: 21(int16_t) CompositeExtract 614 2
+                              Store 619 620
+             621:      6(int) Load 8(invocation)
+             622:    480(ptr) AccessChain 34(data) 73 59
+             623: 22(i16vec4) Load 622
+             624: 22(i16vec4) GroupNonUniformBitwiseAnd 43 ClusteredReduce 623 42
+             625:    480(ptr) AccessChain 34(data) 621 59
+                              Store 625 624
              626:      6(int) Load 8(invocation)
-             627:    609(ptr) AccessChain 34(data) 68 68
-             628: 24(i16vec4) Load 627
-             629: 24(i16vec4) GroupNonUniformIAdd 43 ClusteredReduce 628 42
-             630:    609(ptr) AccessChain 34(data) 626 68
+             627:    473(ptr) AccessChain 34(data) 37 59 38
+             628: 21(int16_t) Load 627
+             629: 21(int16_t) GroupNonUniformBitwiseOr 43 ClusteredReduce 628 42
+             630:    473(ptr) AccessChain 34(data) 626 59 38
                               Store 630 629
              631:      6(int) Load 8(invocation)
-             632:    602(ptr) AccessChain 34(data) 37 68 38
-             633: 23(int16_t) Load 632
-             634: 23(int16_t) GroupNonUniformIMul 43 ClusteredReduce 633 42
-             635:    602(ptr) AccessChain 34(data) 631 68 38
-                              Store 635 634
-             636:      6(int) Load 8(invocation)
-             637:    609(ptr) AccessChain 34(data) 47 68
-             638: 24(i16vec4) Load 637
-             639:608(i16vec2) VectorShuffle 638 638 0 1
-             640:608(i16vec2) GroupNonUniformIMul 43 ClusteredReduce 639 42
-             641:    609(ptr) AccessChain 34(data) 636 68
-             642: 24(i16vec4) Load 641
-             643: 24(i16vec4) VectorShuffle 642 640 4 5 2 3
-                              Store 641 643
-             644:      6(int) Load 8(invocation)
-             645:    609(ptr) AccessChain 34(data) 58 68
-             646: 24(i16vec4) Load 645
-             647:618(i16vec3) VectorShuffle 646 646 0 1 2
-             648:618(i16vec3) GroupNonUniformIMul 43 ClusteredReduce 647 42
-             649:    609(ptr) AccessChain 34(data) 644 68
-             650: 24(i16vec4) Load 649
-             651: 24(i16vec4) VectorShuffle 650 648 4 5 6 3
-                              Store 649 651
-             652:      6(int) Load 8(invocation)
-             653:    609(ptr) AccessChain 34(data) 68 68
-             654: 24(i16vec4) Load 653
-             655: 24(i16vec4) GroupNonUniformIMul 43 ClusteredReduce 654 42
-             656:    609(ptr) AccessChain 34(data) 652 68
-                              Store 656 655
-             657:      6(int) Load 8(invocation)
-             658:    602(ptr) AccessChain 34(data) 37 68 38
-             659: 23(int16_t) Load 658
-             660: 23(int16_t) GroupNonUniformUMin 43 ClusteredReduce 659 42
-             661:    602(ptr) AccessChain 34(data) 657 68 38
-                              Store 661 660
-             662:      6(int) Load 8(invocation)
-             663:    609(ptr) AccessChain 34(data) 47 68
-             664: 24(i16vec4) Load 663
-             665:608(i16vec2) VectorShuffle 664 664 0 1
-             666:608(i16vec2) GroupNonUniformUMin 43 ClusteredReduce 665 42
-             667:    609(ptr) AccessChain 34(data) 662 68
-             668: 24(i16vec4) Load 667
-             669: 24(i16vec4) VectorShuffle 668 666 4 5 2 3
-                              Store 667 669
+             632:    480(ptr) AccessChain 34(data) 47 59
+             633: 22(i16vec4) Load 632
+             634:479(i16vec2) VectorShuffle 633 633 0 1
+             635:479(i16vec2) GroupNonUniformBitwiseOr 43 ClusteredReduce 634 42
+             636:    473(ptr) AccessChain 34(data) 631 59 38
+             637: 21(int16_t) CompositeExtract 635 0
+                              Store 636 637
+             638:    473(ptr) AccessChain 34(data) 631 59 42
+             639: 21(int16_t) CompositeExtract 635 1
+                              Store 638 639
+             640:      6(int) Load 8(invocation)
+             641:    480(ptr) AccessChain 34(data) 59 59
+             642: 22(i16vec4) Load 641
+             643:490(i16vec3) VectorShuffle 642 642 0 1 2
+             644:490(i16vec3) GroupNonUniformBitwiseOr 43 ClusteredReduce 643 42
+             645:    473(ptr) AccessChain 34(data) 640 59 38
+             646: 21(int16_t) CompositeExtract 644 0
+                              Store 645 646
+             647:    473(ptr) AccessChain 34(data) 640 59 42
+             648: 21(int16_t) CompositeExtract 644 1
+                              Store 647 648
+             649:    473(ptr) AccessChain 34(data) 640 59 69
+             650: 21(int16_t) CompositeExtract 644 2
+                              Store 649 650
+             651:      6(int) Load 8(invocation)
+             652:    480(ptr) AccessChain 34(data) 73 59
+             653: 22(i16vec4) Load 652
+             654: 22(i16vec4) GroupNonUniformBitwiseOr 43 ClusteredReduce 653 42
+             655:    480(ptr) AccessChain 34(data) 651 59
+                              Store 655 654
+             656:      6(int) Load 8(invocation)
+             657:    473(ptr) AccessChain 34(data) 37 59 38
+             658: 21(int16_t) Load 657
+             659: 21(int16_t) GroupNonUniformBitwiseXor 43 ClusteredReduce 658 42
+             660:    473(ptr) AccessChain 34(data) 656 59 38
+                              Store 660 659
+             661:      6(int) Load 8(invocation)
+             662:    480(ptr) AccessChain 34(data) 47 59
+             663: 22(i16vec4) Load 662
+             664:479(i16vec2) VectorShuffle 663 663 0 1
+             665:479(i16vec2) GroupNonUniformBitwiseXor 43 ClusteredReduce 664 42
+             666:    473(ptr) AccessChain 34(data) 661 59 38
+             667: 21(int16_t) CompositeExtract 665 0
+                              Store 666 667
+             668:    473(ptr) AccessChain 34(data) 661 59 42
+             669: 21(int16_t) CompositeExtract 665 1
+                              Store 668 669
              670:      6(int) Load 8(invocation)
-             671:    609(ptr) AccessChain 34(data) 58 68
-             672: 24(i16vec4) Load 671
-             673:618(i16vec3) VectorShuffle 672 672 0 1 2
-             674:618(i16vec3) GroupNonUniformUMin 43 ClusteredReduce 673 42
-             675:    609(ptr) AccessChain 34(data) 670 68
-             676: 24(i16vec4) Load 675
-             677: 24(i16vec4) VectorShuffle 676 674 4 5 6 3
-                              Store 675 677
-             678:      6(int) Load 8(invocation)
-             679:    609(ptr) AccessChain 34(data) 68 68
-             680: 24(i16vec4) Load 679
-             681: 24(i16vec4) GroupNonUniformUMin 43 ClusteredReduce 680 42
-             682:    609(ptr) AccessChain 34(data) 678 68
-                              Store 682 681
-             683:      6(int) Load 8(invocation)
-             684:    602(ptr) AccessChain 34(data) 37 68 38
-             685: 23(int16_t) Load 684
-             686: 23(int16_t) GroupNonUniformUMax 43 ClusteredReduce 685 42
-             687:    602(ptr) AccessChain 34(data) 683 68 38
-                              Store 687 686
-             688:      6(int) Load 8(invocation)
-             689:    609(ptr) AccessChain 34(data) 47 68
-             690: 24(i16vec4) Load 689
-             691:608(i16vec2) VectorShuffle 690 690 0 1
-             692:608(i16vec2) GroupNonUniformUMax 43 ClusteredReduce 691 42
-             693:    609(ptr) AccessChain 34(data) 688 68
-             694: 24(i16vec4) Load 693
-             695: 24(i16vec4) VectorShuffle 694 692 4 5 2 3
-                              Store 693 695
-             696:      6(int) Load 8(invocation)
-             697:    609(ptr) AccessChain 34(data) 58 68
-             698: 24(i16vec4) Load 697
-             699:618(i16vec3) VectorShuffle 698 698 0 1 2
-             700:618(i16vec3) GroupNonUniformUMax 43 ClusteredReduce 699 42
-             701:    609(ptr) AccessChain 34(data) 696 68
-             702: 24(i16vec4) Load 701
-             703: 24(i16vec4) VectorShuffle 702 700 4 5 6 3
-                              Store 701 703
-             704:      6(int) Load 8(invocation)
-             705:    609(ptr) AccessChain 34(data) 68 68
+             671:    480(ptr) AccessChain 34(data) 59 59
+             672: 22(i16vec4) Load 671
+             673:490(i16vec3) VectorShuffle 672 672 0 1 2
+             674:490(i16vec3) GroupNonUniformBitwiseXor 43 ClusteredReduce 673 42
+             675:    473(ptr) AccessChain 34(data) 670 59 38
+             676: 21(int16_t) CompositeExtract 674 0
+                              Store 675 676
+             677:    473(ptr) AccessChain 34(data) 670 59 42
+             678: 21(int16_t) CompositeExtract 674 1
+                              Store 677 678
+             679:    473(ptr) AccessChain 34(data) 670 59 69
+             680: 21(int16_t) CompositeExtract 674 2
+                              Store 679 680
+             681:      6(int) Load 8(invocation)
+             682:    480(ptr) AccessChain 34(data) 73 59
+             683: 22(i16vec4) Load 682
+             684: 22(i16vec4) GroupNonUniformBitwiseXor 43 ClusteredReduce 683 42
+             685:    480(ptr) AccessChain 34(data) 681 59
+                              Store 685 684
+             686:      6(int) Load 8(invocation)
+             688:    687(ptr) AccessChain 34(data) 37 73 38
+             689: 23(int16_t) Load 688
+             690: 23(int16_t) GroupNonUniformIAdd 43 ClusteredReduce 689 42
+             691:    687(ptr) AccessChain 34(data) 686 73 38
+                              Store 691 690
+             692:      6(int) Load 8(invocation)
+             695:    694(ptr) AccessChain 34(data) 47 73
+             696: 24(i16vec4) Load 695
+             697:693(i16vec2) VectorShuffle 696 696 0 1
+             698:693(i16vec2) GroupNonUniformIAdd 43 ClusteredReduce 697 42
+             699:    687(ptr) AccessChain 34(data) 692 73 38
+             700: 23(int16_t) CompositeExtract 698 0
+                              Store 699 700
+             701:    687(ptr) AccessChain 34(data) 692 73 42
+             702: 23(int16_t) CompositeExtract 698 1
+                              Store 701 702
+             703:      6(int) Load 8(invocation)
+             705:    694(ptr) AccessChain 34(data) 59 73
              706: 24(i16vec4) Load 705
-             707: 24(i16vec4) GroupNonUniformUMax 43 ClusteredReduce 706 42
-             708:    609(ptr) AccessChain 34(data) 704 68
-                              Store 708 707
-             709:      6(int) Load 8(invocation)
-             710:    602(ptr) AccessChain 34(data) 37 68 38
-             711: 23(int16_t) Load 710
-             712: 23(int16_t) GroupNonUniformBitwiseAnd 43 ClusteredReduce 711 42
-             713:    602(ptr) AccessChain 34(data) 709 68 38
-                              Store 713 712
-             714:      6(int) Load 8(invocation)
-             715:    609(ptr) AccessChain 34(data) 47 68
-             716: 24(i16vec4) Load 715
-             717:608(i16vec2) VectorShuffle 716 716 0 1
-             718:608(i16vec2) GroupNonUniformBitwiseAnd 43 ClusteredReduce 717 42
-             719:    609(ptr) AccessChain 34(data) 714 68
-             720: 24(i16vec4) Load 719
-             721: 24(i16vec4) VectorShuffle 720 718 4 5 2 3
-                              Store 719 721
-             722:      6(int) Load 8(invocation)
-             723:    609(ptr) AccessChain 34(data) 58 68
-             724: 24(i16vec4) Load 723
-             725:618(i16vec3) VectorShuffle 724 724 0 1 2
-             726:618(i16vec3) GroupNonUniformBitwiseAnd 43 ClusteredReduce 725 42
-             727:    609(ptr) AccessChain 34(data) 722 68
-             728: 24(i16vec4) Load 727
-             729: 24(i16vec4) VectorShuffle 728 726 4 5 6 3
-                              Store 727 729
-             730:      6(int) Load 8(invocation)
-             731:    609(ptr) AccessChain 34(data) 68 68
-             732: 24(i16vec4) Load 731
-             733: 24(i16vec4) GroupNonUniformBitwiseAnd 43 ClusteredReduce 732 42
-             734:    609(ptr) AccessChain 34(data) 730 68
-                              Store 734 733
-             735:      6(int) Load 8(invocation)
-             736:    602(ptr) AccessChain 34(data) 37 68 38
-             737: 23(int16_t) Load 736
-             738: 23(int16_t) GroupNonUniformBitwiseOr 43 ClusteredReduce 737 42
-             739:    602(ptr) AccessChain 34(data) 735 68 38
-                              Store 739 738
-             740:      6(int) Load 8(invocation)
-             741:    609(ptr) AccessChain 34(data) 47 68
-             742: 24(i16vec4) Load 741
-             743:608(i16vec2) VectorShuffle 742 742 0 1
-             744:608(i16vec2) GroupNonUniformBitwiseOr 43 ClusteredReduce 743 42
-             745:    609(ptr) AccessChain 34(data) 740 68
-             746: 24(i16vec4) Load 745
-             747: 24(i16vec4) VectorShuffle 746 744 4 5 2 3
-                              Store 745 747
-             748:      6(int) Load 8(invocation)
-             749:    609(ptr) AccessChain 34(data) 58 68
-             750: 24(i16vec4) Load 749
-             751:618(i16vec3) VectorShuffle 750 750 0 1 2
-             752:618(i16vec3) GroupNonUniformBitwiseOr 43 ClusteredReduce 751 42
-             753:    609(ptr) AccessChain 34(data) 748 68
-             754: 24(i16vec4) Load 753
-             755: 24(i16vec4) VectorShuffle 754 752 4 5 6 3
-                              Store 753 755
-             756:      6(int) Load 8(invocation)
-             757:    609(ptr) AccessChain 34(data) 68 68
-             758: 24(i16vec4) Load 757
-             759: 24(i16vec4) GroupNonUniformBitwiseOr 43 ClusteredReduce 758 42
-             760:    609(ptr) AccessChain 34(data) 756 68
-                              Store 760 759
-             761:      6(int) Load 8(invocation)
-             762:    602(ptr) AccessChain 34(data) 37 68 38
-             763: 23(int16_t) Load 762
-             764: 23(int16_t) GroupNonUniformBitwiseXor 43 ClusteredReduce 763 42
-             765:    602(ptr) AccessChain 34(data) 761 68 38
-                              Store 765 764
-             766:      6(int) Load 8(invocation)
-             767:    609(ptr) AccessChain 34(data) 47 68
-             768: 24(i16vec4) Load 767
-             769:608(i16vec2) VectorShuffle 768 768 0 1
-             770:608(i16vec2) GroupNonUniformBitwiseXor 43 ClusteredReduce 769 42
-             771:    609(ptr) AccessChain 34(data) 766 68
-             772: 24(i16vec4) Load 771
-             773: 24(i16vec4) VectorShuffle 772 770 4 5 2 3
-                              Store 771 773
-             774:      6(int) Load 8(invocation)
-             775:    609(ptr) AccessChain 34(data) 58 68
-             776: 24(i16vec4) Load 775
-             777:618(i16vec3) VectorShuffle 776 776 0 1 2
-             778:618(i16vec3) GroupNonUniformBitwiseXor 43 ClusteredReduce 777 42
-             779:    609(ptr) AccessChain 34(data) 774 68
-             780: 24(i16vec4) Load 779
-             781: 24(i16vec4) VectorShuffle 780 778 4 5 6 3
-                              Store 779 781
-             782:      6(int) Load 8(invocation)
-             783:    609(ptr) AccessChain 34(data) 68 68
-             784: 24(i16vec4) Load 783
-             785: 24(i16vec4) GroupNonUniformBitwiseXor 43 ClusteredReduce 784 42
-             786:    609(ptr) AccessChain 34(data) 782 68
-                              Store 786 785
-             787:      6(int) Load 8(invocation)
-             790:    789(ptr) AccessChain 34(data) 37 788 38
-             791: 25(int64_t) Load 790
-             792: 25(int64_t) GroupNonUniformIAdd 43 ClusteredReduce 791 42
-             793:    789(ptr) AccessChain 34(data) 787 788 38
-                              Store 793 792
+             707:704(i16vec3) VectorShuffle 706 706 0 1 2
+             708:704(i16vec3) GroupNonUniformIAdd 43 ClusteredReduce 707 42
+             709:    687(ptr) AccessChain 34(data) 703 73 38
+             710: 23(int16_t) CompositeExtract 708 0
+                              Store 709 710
+             711:    687(ptr) AccessChain 34(data) 703 73 42
+             712: 23(int16_t) CompositeExtract 708 1
+                              Store 711 712
+             713:    687(ptr) AccessChain 34(data) 703 73 69
+             714: 23(int16_t) CompositeExtract 708 2
+                              Store 713 714
+             715:      6(int) Load 8(invocation)
+             716:    694(ptr) AccessChain 34(data) 73 73
+             717: 24(i16vec4) Load 716
+             718: 24(i16vec4) GroupNonUniformIAdd 43 ClusteredReduce 717 42
+             719:    694(ptr) AccessChain 34(data) 715 73
+                              Store 719 718
+             720:      6(int) Load 8(invocation)
+             721:    687(ptr) AccessChain 34(data) 37 73 38
+             722: 23(int16_t) Load 721
+             723: 23(int16_t) GroupNonUniformIMul 43 ClusteredReduce 722 42
+             724:    687(ptr) AccessChain 34(data) 720 73 38
+                              Store 724 723
+             725:      6(int) Load 8(invocation)
+             726:    694(ptr) AccessChain 34(data) 47 73
+             727: 24(i16vec4) Load 726
+             728:693(i16vec2) VectorShuffle 727 727 0 1
+             729:693(i16vec2) GroupNonUniformIMul 43 ClusteredReduce 728 42
+             730:    687(ptr) AccessChain 34(data) 725 73 38
+             731: 23(int16_t) CompositeExtract 729 0
+                              Store 730 731
+             732:    687(ptr) AccessChain 34(data) 725 73 42
+             733: 23(int16_t) CompositeExtract 729 1
+                              Store 732 733
+             734:      6(int) Load 8(invocation)
+             735:    694(ptr) AccessChain 34(data) 59 73
+             736: 24(i16vec4) Load 735
+             737:704(i16vec3) VectorShuffle 736 736 0 1 2
+             738:704(i16vec3) GroupNonUniformIMul 43 ClusteredReduce 737 42
+             739:    687(ptr) AccessChain 34(data) 734 73 38
+             740: 23(int16_t) CompositeExtract 738 0
+                              Store 739 740
+             741:    687(ptr) AccessChain 34(data) 734 73 42
+             742: 23(int16_t) CompositeExtract 738 1
+                              Store 741 742
+             743:    687(ptr) AccessChain 34(data) 734 73 69
+             744: 23(int16_t) CompositeExtract 738 2
+                              Store 743 744
+             745:      6(int) Load 8(invocation)
+             746:    694(ptr) AccessChain 34(data) 73 73
+             747: 24(i16vec4) Load 746
+             748: 24(i16vec4) GroupNonUniformIMul 43 ClusteredReduce 747 42
+             749:    694(ptr) AccessChain 34(data) 745 73
+                              Store 749 748
+             750:      6(int) Load 8(invocation)
+             751:    687(ptr) AccessChain 34(data) 37 73 38
+             752: 23(int16_t) Load 751
+             753: 23(int16_t) GroupNonUniformUMin 43 ClusteredReduce 752 42
+             754:    687(ptr) AccessChain 34(data) 750 73 38
+                              Store 754 753
+             755:      6(int) Load 8(invocation)
+             756:    694(ptr) AccessChain 34(data) 47 73
+             757: 24(i16vec4) Load 756
+             758:693(i16vec2) VectorShuffle 757 757 0 1
+             759:693(i16vec2) GroupNonUniformUMin 43 ClusteredReduce 758 42
+             760:    687(ptr) AccessChain 34(data) 755 73 38
+             761: 23(int16_t) CompositeExtract 759 0
+                              Store 760 761
+             762:    687(ptr) AccessChain 34(data) 755 73 42
+             763: 23(int16_t) CompositeExtract 759 1
+                              Store 762 763
+             764:      6(int) Load 8(invocation)
+             765:    694(ptr) AccessChain 34(data) 59 73
+             766: 24(i16vec4) Load 765
+             767:704(i16vec3) VectorShuffle 766 766 0 1 2
+             768:704(i16vec3) GroupNonUniformUMin 43 ClusteredReduce 767 42
+             769:    687(ptr) AccessChain 34(data) 764 73 38
+             770: 23(int16_t) CompositeExtract 768 0
+                              Store 769 770
+             771:    687(ptr) AccessChain 34(data) 764 73 42
+             772: 23(int16_t) CompositeExtract 768 1
+                              Store 771 772
+             773:    687(ptr) AccessChain 34(data) 764 73 69
+             774: 23(int16_t) CompositeExtract 768 2
+                              Store 773 774
+             775:      6(int) Load 8(invocation)
+             776:    694(ptr) AccessChain 34(data) 73 73
+             777: 24(i16vec4) Load 776
+             778: 24(i16vec4) GroupNonUniformUMin 43 ClusteredReduce 777 42
+             779:    694(ptr) AccessChain 34(data) 775 73
+                              Store 779 778
+             780:      6(int) Load 8(invocation)
+             781:    687(ptr) AccessChain 34(data) 37 73 38
+             782: 23(int16_t) Load 781
+             783: 23(int16_t) GroupNonUniformUMax 43 ClusteredReduce 782 42
+             784:    687(ptr) AccessChain 34(data) 780 73 38
+                              Store 784 783
+             785:      6(int) Load 8(invocation)
+             786:    694(ptr) AccessChain 34(data) 47 73
+             787: 24(i16vec4) Load 786
+             788:693(i16vec2) VectorShuffle 787 787 0 1
+             789:693(i16vec2) GroupNonUniformUMax 43 ClusteredReduce 788 42
+             790:    687(ptr) AccessChain 34(data) 785 73 38
+             791: 23(int16_t) CompositeExtract 789 0
+                              Store 790 791
+             792:    687(ptr) AccessChain 34(data) 785 73 42
+             793: 23(int16_t) CompositeExtract 789 1
+                              Store 792 793
              794:      6(int) Load 8(invocation)
-             797:    796(ptr) AccessChain 34(data) 47 788
-             798: 26(i64vec4) Load 797
-             799:795(i64vec2) VectorShuffle 798 798 0 1
-             800:795(i64vec2) GroupNonUniformIAdd 43 ClusteredReduce 799 42
-             801:    796(ptr) AccessChain 34(data) 794 788
-             802: 26(i64vec4) Load 801
-             803: 26(i64vec4) VectorShuffle 802 800 4 5 2 3
-                              Store 801 803
-             804:      6(int) Load 8(invocation)
-             806:    796(ptr) AccessChain 34(data) 58 788
-             807: 26(i64vec4) Load 806
-             808:805(i64vec3) VectorShuffle 807 807 0 1 2
-             809:805(i64vec3) GroupNonUniformIAdd 43 ClusteredReduce 808 42
-             810:    796(ptr) AccessChain 34(data) 804 788
-             811: 26(i64vec4) Load 810
-             812: 26(i64vec4) VectorShuffle 811 809 4 5 6 3
-                              Store 810 812
-             813:      6(int) Load 8(invocation)
-             814:    796(ptr) AccessChain 34(data) 68 788
-             815: 26(i64vec4) Load 814
-             816: 26(i64vec4) GroupNonUniformIAdd 43 ClusteredReduce 815 42
-             817:    796(ptr) AccessChain 34(data) 813 788
-                              Store 817 816
-             818:      6(int) Load 8(invocation)
-             819:    789(ptr) AccessChain 34(data) 37 788 38
-             820: 25(int64_t) Load 819
-             821: 25(int64_t) GroupNonUniformIMul 43 ClusteredReduce 820 42
-             822:    789(ptr) AccessChain 34(data) 818 788 38
-                              Store 822 821
-             823:      6(int) Load 8(invocation)
-             824:    796(ptr) AccessChain 34(data) 47 788
-             825: 26(i64vec4) Load 824
-             826:795(i64vec2) VectorShuffle 825 825 0 1
-             827:795(i64vec2) GroupNonUniformIMul 43 ClusteredReduce 826 42
-             828:    796(ptr) AccessChain 34(data) 823 788
-             829: 26(i64vec4) Load 828
-             830: 26(i64vec4) VectorShuffle 829 827 4 5 2 3
-                              Store 828 830
-             831:      6(int) Load 8(invocation)
-             832:    796(ptr) AccessChain 34(data) 58 788
-             833: 26(i64vec4) Load 832
-             834:805(i64vec3) VectorShuffle 833 833 0 1 2
-             835:805(i64vec3) GroupNonUniformIMul 43 ClusteredReduce 834 42
-             836:    796(ptr) AccessChain 34(data) 831 788
-             837: 26(i64vec4) Load 836
-             838: 26(i64vec4) VectorShuffle 837 835 4 5 6 3
-                              Store 836 838
-             839:      6(int) Load 8(invocation)
-             840:    796(ptr) AccessChain 34(data) 68 788
-             841: 26(i64vec4) Load 840
-             842: 26(i64vec4) GroupNonUniformIMul 43 ClusteredReduce 841 42
-             843:    796(ptr) AccessChain 34(data) 839 788
-                              Store 843 842
-             844:      6(int) Load 8(invocation)
-             845:    789(ptr) AccessChain 34(data) 37 788 38
-             846: 25(int64_t) Load 845
-             847: 25(int64_t) GroupNonUniformSMin 43 ClusteredReduce 846 42
-             848:    789(ptr) AccessChain 34(data) 844 788 38
-                              Store 848 847
-             849:      6(int) Load 8(invocation)
-             850:    796(ptr) AccessChain 34(data) 47 788
-             851: 26(i64vec4) Load 850
-             852:795(i64vec2) VectorShuffle 851 851 0 1
-             853:795(i64vec2) GroupNonUniformSMin 43 ClusteredReduce 852 42
-             854:    796(ptr) AccessChain 34(data) 849 788
-             855: 26(i64vec4) Load 854
-             856: 26(i64vec4) VectorShuffle 855 853 4 5 2 3
-                              Store 854 856
-             857:      6(int) Load 8(invocation)
-             858:    796(ptr) AccessChain 34(data) 58 788
-             859: 26(i64vec4) Load 858
-             860:805(i64vec3) VectorShuffle 859 859 0 1 2
-             861:805(i64vec3) GroupNonUniformSMin 43 ClusteredReduce 860 42
-             862:    796(ptr) AccessChain 34(data) 857 788
-             863: 26(i64vec4) Load 862
-             864: 26(i64vec4) VectorShuffle 863 861 4 5 6 3
-                              Store 862 864
+             795:    694(ptr) AccessChain 34(data) 59 73
+             796: 24(i16vec4) Load 795
+             797:704(i16vec3) VectorShuffle 796 796 0 1 2
+             798:704(i16vec3) GroupNonUniformUMax 43 ClusteredReduce 797 42
+             799:    687(ptr) AccessChain 34(data) 794 73 38
+             800: 23(int16_t) CompositeExtract 798 0
+                              Store 799 800
+             801:    687(ptr) AccessChain 34(data) 794 73 42
+             802: 23(int16_t) CompositeExtract 798 1
+                              Store 801 802
+             803:    687(ptr) AccessChain 34(data) 794 73 69
+             804: 23(int16_t) CompositeExtract 798 2
+                              Store 803 804
+             805:      6(int) Load 8(invocation)
+             806:    694(ptr) AccessChain 34(data) 73 73
+             807: 24(i16vec4) Load 806
+             808: 24(i16vec4) GroupNonUniformUMax 43 ClusteredReduce 807 42
+             809:    694(ptr) AccessChain 34(data) 805 73
+                              Store 809 808
+             810:      6(int) Load 8(invocation)
+             811:    687(ptr) AccessChain 34(data) 37 73 38
+             812: 23(int16_t) Load 811
+             813: 23(int16_t) GroupNonUniformBitwiseAnd 43 ClusteredReduce 812 42
+             814:    687(ptr) AccessChain 34(data) 810 73 38
+                              Store 814 813
+             815:      6(int) Load 8(invocation)
+             816:    694(ptr) AccessChain 34(data) 47 73
+             817: 24(i16vec4) Load 816
+             818:693(i16vec2) VectorShuffle 817 817 0 1
+             819:693(i16vec2) GroupNonUniformBitwiseAnd 43 ClusteredReduce 818 42
+             820:    687(ptr) AccessChain 34(data) 815 73 38
+             821: 23(int16_t) CompositeExtract 819 0
+                              Store 820 821
+             822:    687(ptr) AccessChain 34(data) 815 73 42
+             823: 23(int16_t) CompositeExtract 819 1
+                              Store 822 823
+             824:      6(int) Load 8(invocation)
+             825:    694(ptr) AccessChain 34(data) 59 73
+             826: 24(i16vec4) Load 825
+             827:704(i16vec3) VectorShuffle 826 826 0 1 2
+             828:704(i16vec3) GroupNonUniformBitwiseAnd 43 ClusteredReduce 827 42
+             829:    687(ptr) AccessChain 34(data) 824 73 38
+             830: 23(int16_t) CompositeExtract 828 0
+                              Store 829 830
+             831:    687(ptr) AccessChain 34(data) 824 73 42
+             832: 23(int16_t) CompositeExtract 828 1
+                              Store 831 832
+             833:    687(ptr) AccessChain 34(data) 824 73 69
+             834: 23(int16_t) CompositeExtract 828 2
+                              Store 833 834
+             835:      6(int) Load 8(invocation)
+             836:    694(ptr) AccessChain 34(data) 73 73
+             837: 24(i16vec4) Load 836
+             838: 24(i16vec4) GroupNonUniformBitwiseAnd 43 ClusteredReduce 837 42
+             839:    694(ptr) AccessChain 34(data) 835 73
+                              Store 839 838
+             840:      6(int) Load 8(invocation)
+             841:    687(ptr) AccessChain 34(data) 37 73 38
+             842: 23(int16_t) Load 841
+             843: 23(int16_t) GroupNonUniformBitwiseOr 43 ClusteredReduce 842 42
+             844:    687(ptr) AccessChain 34(data) 840 73 38
+                              Store 844 843
+             845:      6(int) Load 8(invocation)
+             846:    694(ptr) AccessChain 34(data) 47 73
+             847: 24(i16vec4) Load 846
+             848:693(i16vec2) VectorShuffle 847 847 0 1
+             849:693(i16vec2) GroupNonUniformBitwiseOr 43 ClusteredReduce 848 42
+             850:    687(ptr) AccessChain 34(data) 845 73 38
+             851: 23(int16_t) CompositeExtract 849 0
+                              Store 850 851
+             852:    687(ptr) AccessChain 34(data) 845 73 42
+             853: 23(int16_t) CompositeExtract 849 1
+                              Store 852 853
+             854:      6(int) Load 8(invocation)
+             855:    694(ptr) AccessChain 34(data) 59 73
+             856: 24(i16vec4) Load 855
+             857:704(i16vec3) VectorShuffle 856 856 0 1 2
+             858:704(i16vec3) GroupNonUniformBitwiseOr 43 ClusteredReduce 857 42
+             859:    687(ptr) AccessChain 34(data) 854 73 38
+             860: 23(int16_t) CompositeExtract 858 0
+                              Store 859 860
+             861:    687(ptr) AccessChain 34(data) 854 73 42
+             862: 23(int16_t) CompositeExtract 858 1
+                              Store 861 862
+             863:    687(ptr) AccessChain 34(data) 854 73 69
+             864: 23(int16_t) CompositeExtract 858 2
+                              Store 863 864
              865:      6(int) Load 8(invocation)
-             866:    796(ptr) AccessChain 34(data) 68 788
-             867: 26(i64vec4) Load 866
-             868: 26(i64vec4) GroupNonUniformSMin 43 ClusteredReduce 867 42
-             869:    796(ptr) AccessChain 34(data) 865 788
+             866:    694(ptr) AccessChain 34(data) 73 73
+             867: 24(i16vec4) Load 866
+             868: 24(i16vec4) GroupNonUniformBitwiseOr 43 ClusteredReduce 867 42
+             869:    694(ptr) AccessChain 34(data) 865 73
                               Store 869 868
              870:      6(int) Load 8(invocation)
-             871:    789(ptr) AccessChain 34(data) 37 788 38
-             872: 25(int64_t) Load 871
-             873: 25(int64_t) GroupNonUniformSMax 43 ClusteredReduce 872 42
-             874:    789(ptr) AccessChain 34(data) 870 788 38
+             871:    687(ptr) AccessChain 34(data) 37 73 38
+             872: 23(int16_t) Load 871
+             873: 23(int16_t) GroupNonUniformBitwiseXor 43 ClusteredReduce 872 42
+             874:    687(ptr) AccessChain 34(data) 870 73 38
                               Store 874 873
              875:      6(int) Load 8(invocation)
-             876:    796(ptr) AccessChain 34(data) 47 788
-             877: 26(i64vec4) Load 876
-             878:795(i64vec2) VectorShuffle 877 877 0 1
-             879:795(i64vec2) GroupNonUniformSMax 43 ClusteredReduce 878 42
-             880:    796(ptr) AccessChain 34(data) 875 788
-             881: 26(i64vec4) Load 880
-             882: 26(i64vec4) VectorShuffle 881 879 4 5 2 3
-                              Store 880 882
-             883:      6(int) Load 8(invocation)
-             884:    796(ptr) AccessChain 34(data) 58 788
-             885: 26(i64vec4) Load 884
-             886:805(i64vec3) VectorShuffle 885 885 0 1 2
-             887:805(i64vec3) GroupNonUniformSMax 43 ClusteredReduce 886 42
-             888:    796(ptr) AccessChain 34(data) 883 788
-             889: 26(i64vec4) Load 888
-             890: 26(i64vec4) VectorShuffle 889 887 4 5 6 3
-                              Store 888 890
-             891:      6(int) Load 8(invocation)
-             892:    796(ptr) AccessChain 34(data) 68 788
-             893: 26(i64vec4) Load 892
-             894: 26(i64vec4) GroupNonUniformSMax 43 ClusteredReduce 893 42
-             895:    796(ptr) AccessChain 34(data) 891 788
-                              Store 895 894
-             896:      6(int) Load 8(invocation)
-             897:    789(ptr) AccessChain 34(data) 37 788 38
-             898: 25(int64_t) Load 897
-             899: 25(int64_t) GroupNonUniformBitwiseAnd 43 ClusteredReduce 898 42
-             900:    789(ptr) AccessChain 34(data) 896 788 38
-                              Store 900 899
-             901:      6(int) Load 8(invocation)
-             902:    796(ptr) AccessChain 34(data) 47 788
-             903: 26(i64vec4) Load 902
-             904:795(i64vec2) VectorShuffle 903 903 0 1
-             905:795(i64vec2) GroupNonUniformBitwiseAnd 43 ClusteredReduce 904 42
-             906:    796(ptr) AccessChain 34(data) 901 788
-             907: 26(i64vec4) Load 906
-             908: 26(i64vec4) VectorShuffle 907 905 4 5 2 3
-                              Store 906 908
-             909:      6(int) Load 8(invocation)
-             910:    796(ptr) AccessChain 34(data) 58 788
+             876:    694(ptr) AccessChain 34(data) 47 73
+             877: 24(i16vec4) Load 876
+             878:693(i16vec2) VectorShuffle 877 877 0 1
+             879:693(i16vec2) GroupNonUniformBitwiseXor 43 ClusteredReduce 878 42
+             880:    687(ptr) AccessChain 34(data) 875 73 38
+             881: 23(int16_t) CompositeExtract 879 0
+                              Store 880 881
+             882:    687(ptr) AccessChain 34(data) 875 73 42
+             883: 23(int16_t) CompositeExtract 879 1
+                              Store 882 883
+             884:      6(int) Load 8(invocation)
+             885:    694(ptr) AccessChain 34(data) 59 73
+             886: 24(i16vec4) Load 885
+             887:704(i16vec3) VectorShuffle 886 886 0 1 2
+             888:704(i16vec3) GroupNonUniformBitwiseXor 43 ClusteredReduce 887 42
+             889:    687(ptr) AccessChain 34(data) 884 73 38
+             890: 23(int16_t) CompositeExtract 888 0
+                              Store 889 890
+             891:    687(ptr) AccessChain 34(data) 884 73 42
+             892: 23(int16_t) CompositeExtract 888 1
+                              Store 891 892
+             893:    687(ptr) AccessChain 34(data) 884 73 69
+             894: 23(int16_t) CompositeExtract 888 2
+                              Store 893 894
+             895:      6(int) Load 8(invocation)
+             896:    694(ptr) AccessChain 34(data) 73 73
+             897: 24(i16vec4) Load 896
+             898: 24(i16vec4) GroupNonUniformBitwiseXor 43 ClusteredReduce 897 42
+             899:    694(ptr) AccessChain 34(data) 895 73
+                              Store 899 898
+             900:      6(int) Load 8(invocation)
+             903:    902(ptr) AccessChain 34(data) 37 901 38
+             904: 25(int64_t) Load 903
+             905: 25(int64_t) GroupNonUniformIAdd 43 ClusteredReduce 904 42
+             906:    902(ptr) AccessChain 34(data) 900 901 38
+                              Store 906 905
+             907:      6(int) Load 8(invocation)
+             910:    909(ptr) AccessChain 34(data) 47 901
              911: 26(i64vec4) Load 910
-             912:805(i64vec3) VectorShuffle 911 911 0 1 2
-             913:805(i64vec3) GroupNonUniformBitwiseAnd 43 ClusteredReduce 912 42
-             914:    796(ptr) AccessChain 34(data) 909 788
-             915: 26(i64vec4) Load 914
-             916: 26(i64vec4) VectorShuffle 915 913 4 5 6 3
-                              Store 914 916
-             917:      6(int) Load 8(invocation)
-             918:    796(ptr) AccessChain 34(data) 68 788
-             919: 26(i64vec4) Load 918
-             920: 26(i64vec4) GroupNonUniformBitwiseAnd 43 ClusteredReduce 919 42
-             921:    796(ptr) AccessChain 34(data) 917 788
-                              Store 921 920
-             922:      6(int) Load 8(invocation)
-             923:    789(ptr) AccessChain 34(data) 37 788 38
-             924: 25(int64_t) Load 923
-             925: 25(int64_t) GroupNonUniformBitwiseOr 43 ClusteredReduce 924 42
-             926:    789(ptr) AccessChain 34(data) 922 788 38
-                              Store 926 925
-             927:      6(int) Load 8(invocation)
-             928:    796(ptr) AccessChain 34(data) 47 788
-             929: 26(i64vec4) Load 928
-             930:795(i64vec2) VectorShuffle 929 929 0 1
-             931:795(i64vec2) GroupNonUniformBitwiseOr 43 ClusteredReduce 930 42
-             932:    796(ptr) AccessChain 34(data) 927 788
-             933: 26(i64vec4) Load 932
-             934: 26(i64vec4) VectorShuffle 933 931 4 5 2 3
-                              Store 932 934
+             912:908(i64vec2) VectorShuffle 911 911 0 1
+             913:908(i64vec2) GroupNonUniformIAdd 43 ClusteredReduce 912 42
+             914:    902(ptr) AccessChain 34(data) 907 901 38
+             915: 25(int64_t) CompositeExtract 913 0
+                              Store 914 915
+             916:    902(ptr) AccessChain 34(data) 907 901 42
+             917: 25(int64_t) CompositeExtract 913 1
+                              Store 916 917
+             918:      6(int) Load 8(invocation)
+             920:    909(ptr) AccessChain 34(data) 59 901
+             921: 26(i64vec4) Load 920
+             922:919(i64vec3) VectorShuffle 921 921 0 1 2
+             923:919(i64vec3) GroupNonUniformIAdd 43 ClusteredReduce 922 42
+             924:    902(ptr) AccessChain 34(data) 918 901 38
+             925: 25(int64_t) CompositeExtract 923 0
+                              Store 924 925
+             926:    902(ptr) AccessChain 34(data) 918 901 42
+             927: 25(int64_t) CompositeExtract 923 1
+                              Store 926 927
+             928:    902(ptr) AccessChain 34(data) 918 901 69
+             929: 25(int64_t) CompositeExtract 923 2
+                              Store 928 929
+             930:      6(int) Load 8(invocation)
+             931:    909(ptr) AccessChain 34(data) 73 901
+             932: 26(i64vec4) Load 931
+             933: 26(i64vec4) GroupNonUniformIAdd 43 ClusteredReduce 932 42
+             934:    909(ptr) AccessChain 34(data) 930 901
+                              Store 934 933
              935:      6(int) Load 8(invocation)
-             936:    796(ptr) AccessChain 34(data) 58 788
-             937: 26(i64vec4) Load 936
-             938:805(i64vec3) VectorShuffle 937 937 0 1 2
-             939:805(i64vec3) GroupNonUniformBitwiseOr 43 ClusteredReduce 938 42
-             940:    796(ptr) AccessChain 34(data) 935 788
-             941: 26(i64vec4) Load 940
-             942: 26(i64vec4) VectorShuffle 941 939 4 5 6 3
-                              Store 940 942
-             943:      6(int) Load 8(invocation)
-             944:    796(ptr) AccessChain 34(data) 68 788
-             945: 26(i64vec4) Load 944
-             946: 26(i64vec4) GroupNonUniformBitwiseOr 43 ClusteredReduce 945 42
-             947:    796(ptr) AccessChain 34(data) 943 788
-                              Store 947 946
-             948:      6(int) Load 8(invocation)
-             949:    789(ptr) AccessChain 34(data) 37 788 38
-             950: 25(int64_t) Load 949
-             951: 25(int64_t) GroupNonUniformBitwiseXor 43 ClusteredReduce 950 42
-             952:    789(ptr) AccessChain 34(data) 948 788 38
-                              Store 952 951
-             953:      6(int) Load 8(invocation)
-             954:    796(ptr) AccessChain 34(data) 47 788
-             955: 26(i64vec4) Load 954
-             956:795(i64vec2) VectorShuffle 955 955 0 1
-             957:795(i64vec2) GroupNonUniformBitwiseXor 43 ClusteredReduce 956 42
-             958:    796(ptr) AccessChain 34(data) 953 788
-             959: 26(i64vec4) Load 958
-             960: 26(i64vec4) VectorShuffle 959 957 4 5 2 3
-                              Store 958 960
-             961:      6(int) Load 8(invocation)
-             962:    796(ptr) AccessChain 34(data) 58 788
-             963: 26(i64vec4) Load 962
-             964:805(i64vec3) VectorShuffle 963 963 0 1 2
-             965:805(i64vec3) GroupNonUniformBitwiseXor 43 ClusteredReduce 964 42
-             966:    796(ptr) AccessChain 34(data) 961 788
-             967: 26(i64vec4) Load 966
-             968: 26(i64vec4) VectorShuffle 967 965 4 5 6 3
-                              Store 966 968
-             969:      6(int) Load 8(invocation)
-             970:    796(ptr) AccessChain 34(data) 68 788
-             971: 26(i64vec4) Load 970
-             972: 26(i64vec4) GroupNonUniformBitwiseXor 43 ClusteredReduce 971 42
-             973:    796(ptr) AccessChain 34(data) 969 788
-                              Store 973 972
-             974:      6(int) Load 8(invocation)
-             977:    976(ptr) AccessChain 34(data) 37 975 38
-             978: 27(int64_t) Load 977
-             979: 27(int64_t) GroupNonUniformIAdd 43 ClusteredReduce 978 42
-             980:    976(ptr) AccessChain 34(data) 974 975 38
-                              Store 980 979
-             981:      6(int) Load 8(invocation)
-             984:    983(ptr) AccessChain 34(data) 47 975
-             985: 28(i64vec4) Load 984
-             986:982(i64vec2) VectorShuffle 985 985 0 1
-             987:982(i64vec2) GroupNonUniformIAdd 43 ClusteredReduce 986 42
-             988:    983(ptr) AccessChain 34(data) 981 975
-             989: 28(i64vec4) Load 988
-             990: 28(i64vec4) VectorShuffle 989 987 4 5 2 3
-                              Store 988 990
-             991:      6(int) Load 8(invocation)
-             993:    983(ptr) AccessChain 34(data) 58 975
-             994: 28(i64vec4) Load 993
-             995:992(i64vec3) VectorShuffle 994 994 0 1 2
-             996:992(i64vec3) GroupNonUniformIAdd 43 ClusteredReduce 995 42
-             997:    983(ptr) AccessChain 34(data) 991 975
-             998: 28(i64vec4) Load 997
-             999: 28(i64vec4) VectorShuffle 998 996 4 5 6 3
-                              Store 997 999
+             936:    902(ptr) AccessChain 34(data) 37 901 38
+             937: 25(int64_t) Load 936
+             938: 25(int64_t) GroupNonUniformIMul 43 ClusteredReduce 937 42
+             939:    902(ptr) AccessChain 34(data) 935 901 38
+                              Store 939 938
+             940:      6(int) Load 8(invocation)
+             941:    909(ptr) AccessChain 34(data) 47 901
+             942: 26(i64vec4) Load 941
+             943:908(i64vec2) VectorShuffle 942 942 0 1
+             944:908(i64vec2) GroupNonUniformIMul 43 ClusteredReduce 943 42
+             945:    902(ptr) AccessChain 34(data) 940 901 38
+             946: 25(int64_t) CompositeExtract 944 0
+                              Store 945 946
+             947:    902(ptr) AccessChain 34(data) 940 901 42
+             948: 25(int64_t) CompositeExtract 944 1
+                              Store 947 948
+             949:      6(int) Load 8(invocation)
+             950:    909(ptr) AccessChain 34(data) 59 901
+             951: 26(i64vec4) Load 950
+             952:919(i64vec3) VectorShuffle 951 951 0 1 2
+             953:919(i64vec3) GroupNonUniformIMul 43 ClusteredReduce 952 42
+             954:    902(ptr) AccessChain 34(data) 949 901 38
+             955: 25(int64_t) CompositeExtract 953 0
+                              Store 954 955
+             956:    902(ptr) AccessChain 34(data) 949 901 42
+             957: 25(int64_t) CompositeExtract 953 1
+                              Store 956 957
+             958:    902(ptr) AccessChain 34(data) 949 901 69
+             959: 25(int64_t) CompositeExtract 953 2
+                              Store 958 959
+             960:      6(int) Load 8(invocation)
+             961:    909(ptr) AccessChain 34(data) 73 901
+             962: 26(i64vec4) Load 961
+             963: 26(i64vec4) GroupNonUniformIMul 43 ClusteredReduce 962 42
+             964:    909(ptr) AccessChain 34(data) 960 901
+                              Store 964 963
+             965:      6(int) Load 8(invocation)
+             966:    902(ptr) AccessChain 34(data) 37 901 38
+             967: 25(int64_t) Load 966
+             968: 25(int64_t) GroupNonUniformSMin 43 ClusteredReduce 967 42
+             969:    902(ptr) AccessChain 34(data) 965 901 38
+                              Store 969 968
+             970:      6(int) Load 8(invocation)
+             971:    909(ptr) AccessChain 34(data) 47 901
+             972: 26(i64vec4) Load 971
+             973:908(i64vec2) VectorShuffle 972 972 0 1
+             974:908(i64vec2) GroupNonUniformSMin 43 ClusteredReduce 973 42
+             975:    902(ptr) AccessChain 34(data) 970 901 38
+             976: 25(int64_t) CompositeExtract 974 0
+                              Store 975 976
+             977:    902(ptr) AccessChain 34(data) 970 901 42
+             978: 25(int64_t) CompositeExtract 974 1
+                              Store 977 978
+             979:      6(int) Load 8(invocation)
+             980:    909(ptr) AccessChain 34(data) 59 901
+             981: 26(i64vec4) Load 980
+             982:919(i64vec3) VectorShuffle 981 981 0 1 2
+             983:919(i64vec3) GroupNonUniformSMin 43 ClusteredReduce 982 42
+             984:    902(ptr) AccessChain 34(data) 979 901 38
+             985: 25(int64_t) CompositeExtract 983 0
+                              Store 984 985
+             986:    902(ptr) AccessChain 34(data) 979 901 42
+             987: 25(int64_t) CompositeExtract 983 1
+                              Store 986 987
+             988:    902(ptr) AccessChain 34(data) 979 901 69
+             989: 25(int64_t) CompositeExtract 983 2
+                              Store 988 989
+             990:      6(int) Load 8(invocation)
+             991:    909(ptr) AccessChain 34(data) 73 901
+             992: 26(i64vec4) Load 991
+             993: 26(i64vec4) GroupNonUniformSMin 43 ClusteredReduce 992 42
+             994:    909(ptr) AccessChain 34(data) 990 901
+                              Store 994 993
+             995:      6(int) Load 8(invocation)
+             996:    902(ptr) AccessChain 34(data) 37 901 38
+             997: 25(int64_t) Load 996
+             998: 25(int64_t) GroupNonUniformSMax 43 ClusteredReduce 997 42
+             999:    902(ptr) AccessChain 34(data) 995 901 38
+                              Store 999 998
             1000:      6(int) Load 8(invocation)
-            1001:    983(ptr) AccessChain 34(data) 68 975
-            1002: 28(i64vec4) Load 1001
-            1003: 28(i64vec4) GroupNonUniformIAdd 43 ClusteredReduce 1002 42
-            1004:    983(ptr) AccessChain 34(data) 1000 975
-                              Store 1004 1003
-            1005:      6(int) Load 8(invocation)
-            1006:    976(ptr) AccessChain 34(data) 37 975 38
-            1007: 27(int64_t) Load 1006
-            1008: 27(int64_t) GroupNonUniformIMul 43 ClusteredReduce 1007 42
-            1009:    976(ptr) AccessChain 34(data) 1005 975 38
-                              Store 1009 1008
-            1010:      6(int) Load 8(invocation)
-            1011:    983(ptr) AccessChain 34(data) 47 975
-            1012: 28(i64vec4) Load 1011
-            1013:982(i64vec2) VectorShuffle 1012 1012 0 1
-            1014:982(i64vec2) GroupNonUniformIMul 43 ClusteredReduce 1013 42
-            1015:    983(ptr) AccessChain 34(data) 1010 975
-            1016: 28(i64vec4) Load 1015
-            1017: 28(i64vec4) VectorShuffle 1016 1014 4 5 2 3
-                              Store 1015 1017
-            1018:      6(int) Load 8(invocation)
-            1019:    983(ptr) AccessChain 34(data) 58 975
-            1020: 28(i64vec4) Load 1019
-            1021:992(i64vec3) VectorShuffle 1020 1020 0 1 2
-            1022:992(i64vec3) GroupNonUniformIMul 43 ClusteredReduce 1021 42
-            1023:    983(ptr) AccessChain 34(data) 1018 975
-            1024: 28(i64vec4) Load 1023
-            1025: 28(i64vec4) VectorShuffle 1024 1022 4 5 6 3
-                              Store 1023 1025
-            1026:      6(int) Load 8(invocation)
-            1027:    983(ptr) AccessChain 34(data) 68 975
-            1028: 28(i64vec4) Load 1027
-            1029: 28(i64vec4) GroupNonUniformIMul 43 ClusteredReduce 1028 42
-            1030:    983(ptr) AccessChain 34(data) 1026 975
-                              Store 1030 1029
-            1031:      6(int) Load 8(invocation)
-            1032:    976(ptr) AccessChain 34(data) 37 975 38
-            1033: 27(int64_t) Load 1032
-            1034: 27(int64_t) GroupNonUniformUMin 43 ClusteredReduce 1033 42
-            1035:    976(ptr) AccessChain 34(data) 1031 975 38
-                              Store 1035 1034
-            1036:      6(int) Load 8(invocation)
-            1037:    983(ptr) AccessChain 34(data) 47 975
-            1038: 28(i64vec4) Load 1037
-            1039:982(i64vec2) VectorShuffle 1038 1038 0 1
-            1040:982(i64vec2) GroupNonUniformUMin 43 ClusteredReduce 1039 42
-            1041:    983(ptr) AccessChain 34(data) 1036 975
-            1042: 28(i64vec4) Load 1041
-            1043: 28(i64vec4) VectorShuffle 1042 1040 4 5 2 3
-                              Store 1041 1043
-            1044:      6(int) Load 8(invocation)
-            1045:    983(ptr) AccessChain 34(data) 58 975
-            1046: 28(i64vec4) Load 1045
-            1047:992(i64vec3) VectorShuffle 1046 1046 0 1 2
-            1048:992(i64vec3) GroupNonUniformUMin 43 ClusteredReduce 1047 42
-            1049:    983(ptr) AccessChain 34(data) 1044 975
-            1050: 28(i64vec4) Load 1049
-            1051: 28(i64vec4) VectorShuffle 1050 1048 4 5 6 3
-                              Store 1049 1051
-            1052:      6(int) Load 8(invocation)
-            1053:    983(ptr) AccessChain 34(data) 68 975
-            1054: 28(i64vec4) Load 1053
-            1055: 28(i64vec4) GroupNonUniformUMin 43 ClusteredReduce 1054 42
-            1056:    983(ptr) AccessChain 34(data) 1052 975
-                              Store 1056 1055
-            1057:      6(int) Load 8(invocation)
-            1058:    976(ptr) AccessChain 34(data) 37 975 38
-            1059: 27(int64_t) Load 1058
-            1060: 27(int64_t) GroupNonUniformUMax 43 ClusteredReduce 1059 42
-            1061:    976(ptr) AccessChain 34(data) 1057 975 38
-                              Store 1061 1060
-            1062:      6(int) Load 8(invocation)
-            1063:    983(ptr) AccessChain 34(data) 47 975
-            1064: 28(i64vec4) Load 1063
-            1065:982(i64vec2) VectorShuffle 1064 1064 0 1
-            1066:982(i64vec2) GroupNonUniformUMax 43 ClusteredReduce 1065 42
-            1067:    983(ptr) AccessChain 34(data) 1062 975
-            1068: 28(i64vec4) Load 1067
-            1069: 28(i64vec4) VectorShuffle 1068 1066 4 5 2 3
-                              Store 1067 1069
-            1070:      6(int) Load 8(invocation)
-            1071:    983(ptr) AccessChain 34(data) 58 975
-            1072: 28(i64vec4) Load 1071
-            1073:992(i64vec3) VectorShuffle 1072 1072 0 1 2
-            1074:992(i64vec3) GroupNonUniformUMax 43 ClusteredReduce 1073 42
-            1075:    983(ptr) AccessChain 34(data) 1070 975
-            1076: 28(i64vec4) Load 1075
-            1077: 28(i64vec4) VectorShuffle 1076 1074 4 5 6 3
-                              Store 1075 1077
-            1078:      6(int) Load 8(invocation)
-            1079:    983(ptr) AccessChain 34(data) 68 975
-            1080: 28(i64vec4) Load 1079
-            1081: 28(i64vec4) GroupNonUniformUMax 43 ClusteredReduce 1080 42
-            1082:    983(ptr) AccessChain 34(data) 1078 975
-                              Store 1082 1081
-            1083:      6(int) Load 8(invocation)
-            1084:    976(ptr) AccessChain 34(data) 37 975 38
-            1085: 27(int64_t) Load 1084
-            1086: 27(int64_t) GroupNonUniformBitwiseAnd 43 ClusteredReduce 1085 42
-            1087:    976(ptr) AccessChain 34(data) 1083 975 38
-                              Store 1087 1086
-            1088:      6(int) Load 8(invocation)
-            1089:    983(ptr) AccessChain 34(data) 47 975
-            1090: 28(i64vec4) Load 1089
-            1091:982(i64vec2) VectorShuffle 1090 1090 0 1
-            1092:982(i64vec2) GroupNonUniformBitwiseAnd 43 ClusteredReduce 1091 42
-            1093:    983(ptr) AccessChain 34(data) 1088 975
-            1094: 28(i64vec4) Load 1093
-            1095: 28(i64vec4) VectorShuffle 1094 1092 4 5 2 3
-                              Store 1093 1095
-            1096:      6(int) Load 8(invocation)
-            1097:    983(ptr) AccessChain 34(data) 58 975
-            1098: 28(i64vec4) Load 1097
-            1099:992(i64vec3) VectorShuffle 1098 1098 0 1 2
-            1100:992(i64vec3) GroupNonUniformBitwiseAnd 43 ClusteredReduce 1099 42
-            1101:    983(ptr) AccessChain 34(data) 1096 975
-            1102: 28(i64vec4) Load 1101
-            1103: 28(i64vec4) VectorShuffle 1102 1100 4 5 6 3
-                              Store 1101 1103
-            1104:      6(int) Load 8(invocation)
-            1105:    983(ptr) AccessChain 34(data) 68 975
-            1106: 28(i64vec4) Load 1105
-            1107: 28(i64vec4) GroupNonUniformBitwiseAnd 43 ClusteredReduce 1106 42
-            1108:    983(ptr) AccessChain 34(data) 1104 975
-                              Store 1108 1107
-            1109:      6(int) Load 8(invocation)
-            1110:    976(ptr) AccessChain 34(data) 37 975 38
-            1111: 27(int64_t) Load 1110
-            1112: 27(int64_t) GroupNonUniformBitwiseOr 43 ClusteredReduce 1111 42
-            1113:    976(ptr) AccessChain 34(data) 1109 975 38
-                              Store 1113 1112
-            1114:      6(int) Load 8(invocation)
-            1115:    983(ptr) AccessChain 34(data) 47 975
-            1116: 28(i64vec4) Load 1115
-            1117:982(i64vec2) VectorShuffle 1116 1116 0 1
-            1118:982(i64vec2) GroupNonUniformBitwiseOr 43 ClusteredReduce 1117 42
-            1119:    983(ptr) AccessChain 34(data) 1114 975
-            1120: 28(i64vec4) Load 1119
-            1121: 28(i64vec4) VectorShuffle 1120 1118 4 5 2 3
-                              Store 1119 1121
+            1001:    909(ptr) AccessChain 34(data) 47 901
+            1002: 26(i64vec4) Load 1001
+            1003:908(i64vec2) VectorShuffle 1002 1002 0 1
+            1004:908(i64vec2) GroupNonUniformSMax 43 ClusteredReduce 1003 42
+            1005:    902(ptr) AccessChain 34(data) 1000 901 38
+            1006: 25(int64_t) CompositeExtract 1004 0
+                              Store 1005 1006
+            1007:    902(ptr) AccessChain 34(data) 1000 901 42
+            1008: 25(int64_t) CompositeExtract 1004 1
+                              Store 1007 1008
+            1009:      6(int) Load 8(invocation)
+            1010:    909(ptr) AccessChain 34(data) 59 901
+            1011: 26(i64vec4) Load 1010
+            1012:919(i64vec3) VectorShuffle 1011 1011 0 1 2
+            1013:919(i64vec3) GroupNonUniformSMax 43 ClusteredReduce 1012 42
+            1014:    902(ptr) AccessChain 34(data) 1009 901 38
+            1015: 25(int64_t) CompositeExtract 1013 0
+                              Store 1014 1015
+            1016:    902(ptr) AccessChain 34(data) 1009 901 42
+            1017: 25(int64_t) CompositeExtract 1013 1
+                              Store 1016 1017
+            1018:    902(ptr) AccessChain 34(data) 1009 901 69
+            1019: 25(int64_t) CompositeExtract 1013 2
+                              Store 1018 1019
+            1020:      6(int) Load 8(invocation)
+            1021:    909(ptr) AccessChain 34(data) 73 901
+            1022: 26(i64vec4) Load 1021
+            1023: 26(i64vec4) GroupNonUniformSMax 43 ClusteredReduce 1022 42
+            1024:    909(ptr) AccessChain 34(data) 1020 901
+                              Store 1024 1023
+            1025:      6(int) Load 8(invocation)
+            1026:    902(ptr) AccessChain 34(data) 37 901 38
+            1027: 25(int64_t) Load 1026
+            1028: 25(int64_t) GroupNonUniformBitwiseAnd 43 ClusteredReduce 1027 42
+            1029:    902(ptr) AccessChain 34(data) 1025 901 38
+                              Store 1029 1028
+            1030:      6(int) Load 8(invocation)
+            1031:    909(ptr) AccessChain 34(data) 47 901
+            1032: 26(i64vec4) Load 1031
+            1033:908(i64vec2) VectorShuffle 1032 1032 0 1
+            1034:908(i64vec2) GroupNonUniformBitwiseAnd 43 ClusteredReduce 1033 42
+            1035:    902(ptr) AccessChain 34(data) 1030 901 38
+            1036: 25(int64_t) CompositeExtract 1034 0
+                              Store 1035 1036
+            1037:    902(ptr) AccessChain 34(data) 1030 901 42
+            1038: 25(int64_t) CompositeExtract 1034 1
+                              Store 1037 1038
+            1039:      6(int) Load 8(invocation)
+            1040:    909(ptr) AccessChain 34(data) 59 901
+            1041: 26(i64vec4) Load 1040
+            1042:919(i64vec3) VectorShuffle 1041 1041 0 1 2
+            1043:919(i64vec3) GroupNonUniformBitwiseAnd 43 ClusteredReduce 1042 42
+            1044:    902(ptr) AccessChain 34(data) 1039 901 38
+            1045: 25(int64_t) CompositeExtract 1043 0
+                              Store 1044 1045
+            1046:    902(ptr) AccessChain 34(data) 1039 901 42
+            1047: 25(int64_t) CompositeExtract 1043 1
+                              Store 1046 1047
+            1048:    902(ptr) AccessChain 34(data) 1039 901 69
+            1049: 25(int64_t) CompositeExtract 1043 2
+                              Store 1048 1049
+            1050:      6(int) Load 8(invocation)
+            1051:    909(ptr) AccessChain 34(data) 73 901
+            1052: 26(i64vec4) Load 1051
+            1053: 26(i64vec4) GroupNonUniformBitwiseAnd 43 ClusteredReduce 1052 42
+            1054:    909(ptr) AccessChain 34(data) 1050 901
+                              Store 1054 1053
+            1055:      6(int) Load 8(invocation)
+            1056:    902(ptr) AccessChain 34(data) 37 901 38
+            1057: 25(int64_t) Load 1056
+            1058: 25(int64_t) GroupNonUniformBitwiseOr 43 ClusteredReduce 1057 42
+            1059:    902(ptr) AccessChain 34(data) 1055 901 38
+                              Store 1059 1058
+            1060:      6(int) Load 8(invocation)
+            1061:    909(ptr) AccessChain 34(data) 47 901
+            1062: 26(i64vec4) Load 1061
+            1063:908(i64vec2) VectorShuffle 1062 1062 0 1
+            1064:908(i64vec2) GroupNonUniformBitwiseOr 43 ClusteredReduce 1063 42
+            1065:    902(ptr) AccessChain 34(data) 1060 901 38
+            1066: 25(int64_t) CompositeExtract 1064 0
+                              Store 1065 1066
+            1067:    902(ptr) AccessChain 34(data) 1060 901 42
+            1068: 25(int64_t) CompositeExtract 1064 1
+                              Store 1067 1068
+            1069:      6(int) Load 8(invocation)
+            1070:    909(ptr) AccessChain 34(data) 59 901
+            1071: 26(i64vec4) Load 1070
+            1072:919(i64vec3) VectorShuffle 1071 1071 0 1 2
+            1073:919(i64vec3) GroupNonUniformBitwiseOr 43 ClusteredReduce 1072 42
+            1074:    902(ptr) AccessChain 34(data) 1069 901 38
+            1075: 25(int64_t) CompositeExtract 1073 0
+                              Store 1074 1075
+            1076:    902(ptr) AccessChain 34(data) 1069 901 42
+            1077: 25(int64_t) CompositeExtract 1073 1
+                              Store 1076 1077
+            1078:    902(ptr) AccessChain 34(data) 1069 901 69
+            1079: 25(int64_t) CompositeExtract 1073 2
+                              Store 1078 1079
+            1080:      6(int) Load 8(invocation)
+            1081:    909(ptr) AccessChain 34(data) 73 901
+            1082: 26(i64vec4) Load 1081
+            1083: 26(i64vec4) GroupNonUniformBitwiseOr 43 ClusteredReduce 1082 42
+            1084:    909(ptr) AccessChain 34(data) 1080 901
+                              Store 1084 1083
+            1085:      6(int) Load 8(invocation)
+            1086:    902(ptr) AccessChain 34(data) 37 901 38
+            1087: 25(int64_t) Load 1086
+            1088: 25(int64_t) GroupNonUniformBitwiseXor 43 ClusteredReduce 1087 42
+            1089:    902(ptr) AccessChain 34(data) 1085 901 38
+                              Store 1089 1088
+            1090:      6(int) Load 8(invocation)
+            1091:    909(ptr) AccessChain 34(data) 47 901
+            1092: 26(i64vec4) Load 1091
+            1093:908(i64vec2) VectorShuffle 1092 1092 0 1
+            1094:908(i64vec2) GroupNonUniformBitwiseXor 43 ClusteredReduce 1093 42
+            1095:    902(ptr) AccessChain 34(data) 1090 901 38
+            1096: 25(int64_t) CompositeExtract 1094 0
+                              Store 1095 1096
+            1097:    902(ptr) AccessChain 34(data) 1090 901 42
+            1098: 25(int64_t) CompositeExtract 1094 1
+                              Store 1097 1098
+            1099:      6(int) Load 8(invocation)
+            1100:    909(ptr) AccessChain 34(data) 59 901
+            1101: 26(i64vec4) Load 1100
+            1102:919(i64vec3) VectorShuffle 1101 1101 0 1 2
+            1103:919(i64vec3) GroupNonUniformBitwiseXor 43 ClusteredReduce 1102 42
+            1104:    902(ptr) AccessChain 34(data) 1099 901 38
+            1105: 25(int64_t) CompositeExtract 1103 0
+                              Store 1104 1105
+            1106:    902(ptr) AccessChain 34(data) 1099 901 42
+            1107: 25(int64_t) CompositeExtract 1103 1
+                              Store 1106 1107
+            1108:    902(ptr) AccessChain 34(data) 1099 901 69
+            1109: 25(int64_t) CompositeExtract 1103 2
+                              Store 1108 1109
+            1110:      6(int) Load 8(invocation)
+            1111:    909(ptr) AccessChain 34(data) 73 901
+            1112: 26(i64vec4) Load 1111
+            1113: 26(i64vec4) GroupNonUniformBitwiseXor 43 ClusteredReduce 1112 42
+            1114:    909(ptr) AccessChain 34(data) 1110 901
+                              Store 1114 1113
+            1115:      6(int) Load 8(invocation)
+            1118:   1117(ptr) AccessChain 34(data) 37 1116 38
+            1119: 27(int64_t) Load 1118
+            1120: 27(int64_t) GroupNonUniformIAdd 43 ClusteredReduce 1119 42
+            1121:   1117(ptr) AccessChain 34(data) 1115 1116 38
+                              Store 1121 1120
             1122:      6(int) Load 8(invocation)
-            1123:    983(ptr) AccessChain 34(data) 58 975
-            1124: 28(i64vec4) Load 1123
-            1125:992(i64vec3) VectorShuffle 1124 1124 0 1 2
-            1126:992(i64vec3) GroupNonUniformBitwiseOr 43 ClusteredReduce 1125 42
-            1127:    983(ptr) AccessChain 34(data) 1122 975
-            1128: 28(i64vec4) Load 1127
-            1129: 28(i64vec4) VectorShuffle 1128 1126 4 5 6 3
-                              Store 1127 1129
-            1130:      6(int) Load 8(invocation)
-            1131:    983(ptr) AccessChain 34(data) 68 975
-            1132: 28(i64vec4) Load 1131
-            1133: 28(i64vec4) GroupNonUniformBitwiseOr 43 ClusteredReduce 1132 42
-            1134:    983(ptr) AccessChain 34(data) 1130 975
-                              Store 1134 1133
-            1135:      6(int) Load 8(invocation)
-            1136:    976(ptr) AccessChain 34(data) 37 975 38
-            1137: 27(int64_t) Load 1136
-            1138: 27(int64_t) GroupNonUniformBitwiseXor 43 ClusteredReduce 1137 42
-            1139:    976(ptr) AccessChain 34(data) 1135 975 38
-                              Store 1139 1138
-            1140:      6(int) Load 8(invocation)
-            1141:    983(ptr) AccessChain 34(data) 47 975
-            1142: 28(i64vec4) Load 1141
-            1143:982(i64vec2) VectorShuffle 1142 1142 0 1
-            1144:982(i64vec2) GroupNonUniformBitwiseXor 43 ClusteredReduce 1143 42
-            1145:    983(ptr) AccessChain 34(data) 1140 975
-            1146: 28(i64vec4) Load 1145
-            1147: 28(i64vec4) VectorShuffle 1146 1144 4 5 2 3
-                              Store 1145 1147
-            1148:      6(int) Load 8(invocation)
-            1149:    983(ptr) AccessChain 34(data) 58 975
-            1150: 28(i64vec4) Load 1149
-            1151:992(i64vec3) VectorShuffle 1150 1150 0 1 2
-            1152:992(i64vec3) GroupNonUniformBitwiseXor 43 ClusteredReduce 1151 42
-            1153:    983(ptr) AccessChain 34(data) 1148 975
-            1154: 28(i64vec4) Load 1153
-            1155: 28(i64vec4) VectorShuffle 1154 1152 4 5 6 3
-                              Store 1153 1155
-            1156:      6(int) Load 8(invocation)
-            1157:    983(ptr) AccessChain 34(data) 68 975
-            1158: 28(i64vec4) Load 1157
-            1159: 28(i64vec4) GroupNonUniformBitwiseXor 43 ClusteredReduce 1158 42
-            1160:    983(ptr) AccessChain 34(data) 1156 975
-                              Store 1160 1159
-            1161:      6(int) Load 8(invocation)
-            1164:   1163(ptr) AccessChain 34(data) 37 1162 38
-            1165:29(float16_t) Load 1164
-            1166:29(float16_t) GroupNonUniformFAdd 43 ClusteredReduce 1165 42
-            1167:   1163(ptr) AccessChain 34(data) 1161 1162 38
-                              Store 1167 1166
-            1168:      6(int) Load 8(invocation)
-            1171:   1170(ptr) AccessChain 34(data) 47 1162
-            1172: 30(f16vec4) Load 1171
-            1173:1169(f16vec2) VectorShuffle 1172 1172 0 1
-            1174:1169(f16vec2) GroupNonUniformFAdd 43 ClusteredReduce 1173 42
-            1175:   1170(ptr) AccessChain 34(data) 1168 1162
-            1176: 30(f16vec4) Load 1175
-            1177: 30(f16vec4) VectorShuffle 1176 1174 4 5 2 3
-                              Store 1175 1177
-            1178:      6(int) Load 8(invocation)
-            1180:   1170(ptr) AccessChain 34(data) 58 1162
-            1181: 30(f16vec4) Load 1180
-            1182:1179(f16vec3) VectorShuffle 1181 1181 0 1 2
-            1183:1179(f16vec3) GroupNonUniformFAdd 43 ClusteredReduce 1182 42
-            1184:   1170(ptr) AccessChain 34(data) 1178 1162
-            1185: 30(f16vec4) Load 1184
-            1186: 30(f16vec4) VectorShuffle 1185 1183 4 5 6 3
-                              Store 1184 1186
-            1187:      6(int) Load 8(invocation)
-            1188:   1170(ptr) AccessChain 34(data) 68 1162
-            1189: 30(f16vec4) Load 1188
-            1190: 30(f16vec4) GroupNonUniformFAdd 43 ClusteredReduce 1189 42
-            1191:   1170(ptr) AccessChain 34(data) 1187 1162
-                              Store 1191 1190
-            1192:      6(int) Load 8(invocation)
-            1193:   1163(ptr) AccessChain 34(data) 37 1162 38
-            1194:29(float16_t) Load 1193
-            1195:29(float16_t) GroupNonUniformFMul 43 ClusteredReduce 1194 42
-            1196:   1163(ptr) AccessChain 34(data) 1192 1162 38
-                              Store 1196 1195
-            1197:      6(int) Load 8(invocation)
-            1198:   1170(ptr) AccessChain 34(data) 47 1162
-            1199: 30(f16vec4) Load 1198
-            1200:1169(f16vec2) VectorShuffle 1199 1199 0 1
-            1201:1169(f16vec2) GroupNonUniformFMul 43 ClusteredReduce 1200 42
-            1202:   1170(ptr) AccessChain 34(data) 1197 1162
-            1203: 30(f16vec4) Load 1202
-            1204: 30(f16vec4) VectorShuffle 1203 1201 4 5 2 3
-                              Store 1202 1204
+            1125:   1124(ptr) AccessChain 34(data) 47 1116
+            1126: 28(i64vec4) Load 1125
+            1127:1123(i64vec2) VectorShuffle 1126 1126 0 1
+            1128:1123(i64vec2) GroupNonUniformIAdd 43 ClusteredReduce 1127 42
+            1129:   1117(ptr) AccessChain 34(data) 1122 1116 38
+            1130: 27(int64_t) CompositeExtract 1128 0
+                              Store 1129 1130
+            1131:   1117(ptr) AccessChain 34(data) 1122 1116 42
+            1132: 27(int64_t) CompositeExtract 1128 1
+                              Store 1131 1132
+            1133:      6(int) Load 8(invocation)
+            1135:   1124(ptr) AccessChain 34(data) 59 1116
+            1136: 28(i64vec4) Load 1135
+            1137:1134(i64vec3) VectorShuffle 1136 1136 0 1 2
+            1138:1134(i64vec3) GroupNonUniformIAdd 43 ClusteredReduce 1137 42
+            1139:   1117(ptr) AccessChain 34(data) 1133 1116 38
+            1140: 27(int64_t) CompositeExtract 1138 0
+                              Store 1139 1140
+            1141:   1117(ptr) AccessChain 34(data) 1133 1116 42
+            1142: 27(int64_t) CompositeExtract 1138 1
+                              Store 1141 1142
+            1143:   1117(ptr) AccessChain 34(data) 1133 1116 69
+            1144: 27(int64_t) CompositeExtract 1138 2
+                              Store 1143 1144
+            1145:      6(int) Load 8(invocation)
+            1146:   1124(ptr) AccessChain 34(data) 73 1116
+            1147: 28(i64vec4) Load 1146
+            1148: 28(i64vec4) GroupNonUniformIAdd 43 ClusteredReduce 1147 42
+            1149:   1124(ptr) AccessChain 34(data) 1145 1116
+                              Store 1149 1148
+            1150:      6(int) Load 8(invocation)
+            1151:   1117(ptr) AccessChain 34(data) 37 1116 38
+            1152: 27(int64_t) Load 1151
+            1153: 27(int64_t) GroupNonUniformIMul 43 ClusteredReduce 1152 42
+            1154:   1117(ptr) AccessChain 34(data) 1150 1116 38
+                              Store 1154 1153
+            1155:      6(int) Load 8(invocation)
+            1156:   1124(ptr) AccessChain 34(data) 47 1116
+            1157: 28(i64vec4) Load 1156
+            1158:1123(i64vec2) VectorShuffle 1157 1157 0 1
+            1159:1123(i64vec2) GroupNonUniformIMul 43 ClusteredReduce 1158 42
+            1160:   1117(ptr) AccessChain 34(data) 1155 1116 38
+            1161: 27(int64_t) CompositeExtract 1159 0
+                              Store 1160 1161
+            1162:   1117(ptr) AccessChain 34(data) 1155 1116 42
+            1163: 27(int64_t) CompositeExtract 1159 1
+                              Store 1162 1163
+            1164:      6(int) Load 8(invocation)
+            1165:   1124(ptr) AccessChain 34(data) 59 1116
+            1166: 28(i64vec4) Load 1165
+            1167:1134(i64vec3) VectorShuffle 1166 1166 0 1 2
+            1168:1134(i64vec3) GroupNonUniformIMul 43 ClusteredReduce 1167 42
+            1169:   1117(ptr) AccessChain 34(data) 1164 1116 38
+            1170: 27(int64_t) CompositeExtract 1168 0
+                              Store 1169 1170
+            1171:   1117(ptr) AccessChain 34(data) 1164 1116 42
+            1172: 27(int64_t) CompositeExtract 1168 1
+                              Store 1171 1172
+            1173:   1117(ptr) AccessChain 34(data) 1164 1116 69
+            1174: 27(int64_t) CompositeExtract 1168 2
+                              Store 1173 1174
+            1175:      6(int) Load 8(invocation)
+            1176:   1124(ptr) AccessChain 34(data) 73 1116
+            1177: 28(i64vec4) Load 1176
+            1178: 28(i64vec4) GroupNonUniformIMul 43 ClusteredReduce 1177 42
+            1179:   1124(ptr) AccessChain 34(data) 1175 1116
+                              Store 1179 1178
+            1180:      6(int) Load 8(invocation)
+            1181:   1117(ptr) AccessChain 34(data) 37 1116 38
+            1182: 27(int64_t) Load 1181
+            1183: 27(int64_t) GroupNonUniformUMin 43 ClusteredReduce 1182 42
+            1184:   1117(ptr) AccessChain 34(data) 1180 1116 38
+                              Store 1184 1183
+            1185:      6(int) Load 8(invocation)
+            1186:   1124(ptr) AccessChain 34(data) 47 1116
+            1187: 28(i64vec4) Load 1186
+            1188:1123(i64vec2) VectorShuffle 1187 1187 0 1
+            1189:1123(i64vec2) GroupNonUniformUMin 43 ClusteredReduce 1188 42
+            1190:   1117(ptr) AccessChain 34(data) 1185 1116 38
+            1191: 27(int64_t) CompositeExtract 1189 0
+                              Store 1190 1191
+            1192:   1117(ptr) AccessChain 34(data) 1185 1116 42
+            1193: 27(int64_t) CompositeExtract 1189 1
+                              Store 1192 1193
+            1194:      6(int) Load 8(invocation)
+            1195:   1124(ptr) AccessChain 34(data) 59 1116
+            1196: 28(i64vec4) Load 1195
+            1197:1134(i64vec3) VectorShuffle 1196 1196 0 1 2
+            1198:1134(i64vec3) GroupNonUniformUMin 43 ClusteredReduce 1197 42
+            1199:   1117(ptr) AccessChain 34(data) 1194 1116 38
+            1200: 27(int64_t) CompositeExtract 1198 0
+                              Store 1199 1200
+            1201:   1117(ptr) AccessChain 34(data) 1194 1116 42
+            1202: 27(int64_t) CompositeExtract 1198 1
+                              Store 1201 1202
+            1203:   1117(ptr) AccessChain 34(data) 1194 1116 69
+            1204: 27(int64_t) CompositeExtract 1198 2
+                              Store 1203 1204
             1205:      6(int) Load 8(invocation)
-            1206:   1170(ptr) AccessChain 34(data) 58 1162
-            1207: 30(f16vec4) Load 1206
-            1208:1179(f16vec3) VectorShuffle 1207 1207 0 1 2
-            1209:1179(f16vec3) GroupNonUniformFMul 43 ClusteredReduce 1208 42
-            1210:   1170(ptr) AccessChain 34(data) 1205 1162
-            1211: 30(f16vec4) Load 1210
-            1212: 30(f16vec4) VectorShuffle 1211 1209 4 5 6 3
-                              Store 1210 1212
-            1213:      6(int) Load 8(invocation)
-            1214:   1170(ptr) AccessChain 34(data) 68 1162
-            1215: 30(f16vec4) Load 1214
-            1216: 30(f16vec4) GroupNonUniformFMul 43 ClusteredReduce 1215 42
-            1217:   1170(ptr) AccessChain 34(data) 1213 1162
-                              Store 1217 1216
-            1218:      6(int) Load 8(invocation)
-            1219:   1163(ptr) AccessChain 34(data) 37 1162 38
-            1220:29(float16_t) Load 1219
-            1221:29(float16_t) GroupNonUniformFMin 43 ClusteredReduce 1220 42
-            1222:   1163(ptr) AccessChain 34(data) 1218 1162 38
-                              Store 1222 1221
-            1223:      6(int) Load 8(invocation)
-            1224:   1170(ptr) AccessChain 34(data) 47 1162
-            1225: 30(f16vec4) Load 1224
-            1226:1169(f16vec2) VectorShuffle 1225 1225 0 1
-            1227:1169(f16vec2) GroupNonUniformFMin 43 ClusteredReduce 1226 42
-            1228:   1170(ptr) AccessChain 34(data) 1223 1162
-            1229: 30(f16vec4) Load 1228
-            1230: 30(f16vec4) VectorShuffle 1229 1227 4 5 2 3
-                              Store 1228 1230
-            1231:      6(int) Load 8(invocation)
-            1232:   1170(ptr) AccessChain 34(data) 58 1162
-            1233: 30(f16vec4) Load 1232
-            1234:1179(f16vec3) VectorShuffle 1233 1233 0 1 2
-            1235:1179(f16vec3) GroupNonUniformFMin 43 ClusteredReduce 1234 42
-            1236:   1170(ptr) AccessChain 34(data) 1231 1162
-            1237: 30(f16vec4) Load 1236
-            1238: 30(f16vec4) VectorShuffle 1237 1235 4 5 6 3
-                              Store 1236 1238
-            1239:      6(int) Load 8(invocation)
-            1240:   1170(ptr) AccessChain 34(data) 68 1162
-            1241: 30(f16vec4) Load 1240
-            1242: 30(f16vec4) GroupNonUniformFMin 43 ClusteredReduce 1241 42
-            1243:   1170(ptr) AccessChain 34(data) 1239 1162
-                              Store 1243 1242
-            1244:      6(int) Load 8(invocation)
-            1245:   1163(ptr) AccessChain 34(data) 37 1162 38
-            1246:29(float16_t) Load 1245
-            1247:29(float16_t) GroupNonUniformFMax 43 ClusteredReduce 1246 42
-            1248:   1163(ptr) AccessChain 34(data) 1244 1162 38
-                              Store 1248 1247
-            1249:      6(int) Load 8(invocation)
-            1250:   1170(ptr) AccessChain 34(data) 47 1162
-            1251: 30(f16vec4) Load 1250
-            1252:1169(f16vec2) VectorShuffle 1251 1251 0 1
-            1253:1169(f16vec2) GroupNonUniformFMax 43 ClusteredReduce 1252 42
-            1254:   1170(ptr) AccessChain 34(data) 1249 1162
-            1255: 30(f16vec4) Load 1254
-            1256: 30(f16vec4) VectorShuffle 1255 1253 4 5 2 3
-                              Store 1254 1256
-            1257:      6(int) Load 8(invocation)
-            1258:   1170(ptr) AccessChain 34(data) 58 1162
-            1259: 30(f16vec4) Load 1258
-            1260:1179(f16vec3) VectorShuffle 1259 1259 0 1 2
-            1261:1179(f16vec3) GroupNonUniformFMax 43 ClusteredReduce 1260 42
-            1262:   1170(ptr) AccessChain 34(data) 1257 1162
-            1263: 30(f16vec4) Load 1262
-            1264: 30(f16vec4) VectorShuffle 1263 1261 4 5 6 3
-                              Store 1262 1264
+            1206:   1124(ptr) AccessChain 34(data) 73 1116
+            1207: 28(i64vec4) Load 1206
+            1208: 28(i64vec4) GroupNonUniformUMin 43 ClusteredReduce 1207 42
+            1209:   1124(ptr) AccessChain 34(data) 1205 1116
+                              Store 1209 1208
+            1210:      6(int) Load 8(invocation)
+            1211:   1117(ptr) AccessChain 34(data) 37 1116 38
+            1212: 27(int64_t) Load 1211
+            1213: 27(int64_t) GroupNonUniformUMax 43 ClusteredReduce 1212 42
+            1214:   1117(ptr) AccessChain 34(data) 1210 1116 38
+                              Store 1214 1213
+            1215:      6(int) Load 8(invocation)
+            1216:   1124(ptr) AccessChain 34(data) 47 1116
+            1217: 28(i64vec4) Load 1216
+            1218:1123(i64vec2) VectorShuffle 1217 1217 0 1
+            1219:1123(i64vec2) GroupNonUniformUMax 43 ClusteredReduce 1218 42
+            1220:   1117(ptr) AccessChain 34(data) 1215 1116 38
+            1221: 27(int64_t) CompositeExtract 1219 0
+                              Store 1220 1221
+            1222:   1117(ptr) AccessChain 34(data) 1215 1116 42
+            1223: 27(int64_t) CompositeExtract 1219 1
+                              Store 1222 1223
+            1224:      6(int) Load 8(invocation)
+            1225:   1124(ptr) AccessChain 34(data) 59 1116
+            1226: 28(i64vec4) Load 1225
+            1227:1134(i64vec3) VectorShuffle 1226 1226 0 1 2
+            1228:1134(i64vec3) GroupNonUniformUMax 43 ClusteredReduce 1227 42
+            1229:   1117(ptr) AccessChain 34(data) 1224 1116 38
+            1230: 27(int64_t) CompositeExtract 1228 0
+                              Store 1229 1230
+            1231:   1117(ptr) AccessChain 34(data) 1224 1116 42
+            1232: 27(int64_t) CompositeExtract 1228 1
+                              Store 1231 1232
+            1233:   1117(ptr) AccessChain 34(data) 1224 1116 69
+            1234: 27(int64_t) CompositeExtract 1228 2
+                              Store 1233 1234
+            1235:      6(int) Load 8(invocation)
+            1236:   1124(ptr) AccessChain 34(data) 73 1116
+            1237: 28(i64vec4) Load 1236
+            1238: 28(i64vec4) GroupNonUniformUMax 43 ClusteredReduce 1237 42
+            1239:   1124(ptr) AccessChain 34(data) 1235 1116
+                              Store 1239 1238
+            1240:      6(int) Load 8(invocation)
+            1241:   1117(ptr) AccessChain 34(data) 37 1116 38
+            1242: 27(int64_t) Load 1241
+            1243: 27(int64_t) GroupNonUniformBitwiseAnd 43 ClusteredReduce 1242 42
+            1244:   1117(ptr) AccessChain 34(data) 1240 1116 38
+                              Store 1244 1243
+            1245:      6(int) Load 8(invocation)
+            1246:   1124(ptr) AccessChain 34(data) 47 1116
+            1247: 28(i64vec4) Load 1246
+            1248:1123(i64vec2) VectorShuffle 1247 1247 0 1
+            1249:1123(i64vec2) GroupNonUniformBitwiseAnd 43 ClusteredReduce 1248 42
+            1250:   1117(ptr) AccessChain 34(data) 1245 1116 38
+            1251: 27(int64_t) CompositeExtract 1249 0
+                              Store 1250 1251
+            1252:   1117(ptr) AccessChain 34(data) 1245 1116 42
+            1253: 27(int64_t) CompositeExtract 1249 1
+                              Store 1252 1253
+            1254:      6(int) Load 8(invocation)
+            1255:   1124(ptr) AccessChain 34(data) 59 1116
+            1256: 28(i64vec4) Load 1255
+            1257:1134(i64vec3) VectorShuffle 1256 1256 0 1 2
+            1258:1134(i64vec3) GroupNonUniformBitwiseAnd 43 ClusteredReduce 1257 42
+            1259:   1117(ptr) AccessChain 34(data) 1254 1116 38
+            1260: 27(int64_t) CompositeExtract 1258 0
+                              Store 1259 1260
+            1261:   1117(ptr) AccessChain 34(data) 1254 1116 42
+            1262: 27(int64_t) CompositeExtract 1258 1
+                              Store 1261 1262
+            1263:   1117(ptr) AccessChain 34(data) 1254 1116 69
+            1264: 27(int64_t) CompositeExtract 1258 2
+                              Store 1263 1264
             1265:      6(int) Load 8(invocation)
-            1266:   1170(ptr) AccessChain 34(data) 68 1162
-            1267: 30(f16vec4) Load 1266
-            1268: 30(f16vec4) GroupNonUniformFMax 43 ClusteredReduce 1267 42
-            1269:   1170(ptr) AccessChain 34(data) 1265 1162
+            1266:   1124(ptr) AccessChain 34(data) 73 1116
+            1267: 28(i64vec4) Load 1266
+            1268: 28(i64vec4) GroupNonUniformBitwiseAnd 43 ClusteredReduce 1267 42
+            1269:   1124(ptr) AccessChain 34(data) 1265 1116
                               Store 1269 1268
+            1270:      6(int) Load 8(invocation)
+            1271:   1117(ptr) AccessChain 34(data) 37 1116 38
+            1272: 27(int64_t) Load 1271
+            1273: 27(int64_t) GroupNonUniformBitwiseOr 43 ClusteredReduce 1272 42
+            1274:   1117(ptr) AccessChain 34(data) 1270 1116 38
+                              Store 1274 1273
+            1275:      6(int) Load 8(invocation)
+            1276:   1124(ptr) AccessChain 34(data) 47 1116
+            1277: 28(i64vec4) Load 1276
+            1278:1123(i64vec2) VectorShuffle 1277 1277 0 1
+            1279:1123(i64vec2) GroupNonUniformBitwiseOr 43 ClusteredReduce 1278 42
+            1280:   1117(ptr) AccessChain 34(data) 1275 1116 38
+            1281: 27(int64_t) CompositeExtract 1279 0
+                              Store 1280 1281
+            1282:   1117(ptr) AccessChain 34(data) 1275 1116 42
+            1283: 27(int64_t) CompositeExtract 1279 1
+                              Store 1282 1283
+            1284:      6(int) Load 8(invocation)
+            1285:   1124(ptr) AccessChain 34(data) 59 1116
+            1286: 28(i64vec4) Load 1285
+            1287:1134(i64vec3) VectorShuffle 1286 1286 0 1 2
+            1288:1134(i64vec3) GroupNonUniformBitwiseOr 43 ClusteredReduce 1287 42
+            1289:   1117(ptr) AccessChain 34(data) 1284 1116 38
+            1290: 27(int64_t) CompositeExtract 1288 0
+                              Store 1289 1290
+            1291:   1117(ptr) AccessChain 34(data) 1284 1116 42
+            1292: 27(int64_t) CompositeExtract 1288 1
+                              Store 1291 1292
+            1293:   1117(ptr) AccessChain 34(data) 1284 1116 69
+            1294: 27(int64_t) CompositeExtract 1288 2
+                              Store 1293 1294
+            1295:      6(int) Load 8(invocation)
+            1296:   1124(ptr) AccessChain 34(data) 73 1116
+            1297: 28(i64vec4) Load 1296
+            1298: 28(i64vec4) GroupNonUniformBitwiseOr 43 ClusteredReduce 1297 42
+            1299:   1124(ptr) AccessChain 34(data) 1295 1116
+                              Store 1299 1298
+            1300:      6(int) Load 8(invocation)
+            1301:   1117(ptr) AccessChain 34(data) 37 1116 38
+            1302: 27(int64_t) Load 1301
+            1303: 27(int64_t) GroupNonUniformBitwiseXor 43 ClusteredReduce 1302 42
+            1304:   1117(ptr) AccessChain 34(data) 1300 1116 38
+                              Store 1304 1303
+            1305:      6(int) Load 8(invocation)
+            1306:   1124(ptr) AccessChain 34(data) 47 1116
+            1307: 28(i64vec4) Load 1306
+            1308:1123(i64vec2) VectorShuffle 1307 1307 0 1
+            1309:1123(i64vec2) GroupNonUniformBitwiseXor 43 ClusteredReduce 1308 42
+            1310:   1117(ptr) AccessChain 34(data) 1305 1116 38
+            1311: 27(int64_t) CompositeExtract 1309 0
+                              Store 1310 1311
+            1312:   1117(ptr) AccessChain 34(data) 1305 1116 42
+            1313: 27(int64_t) CompositeExtract 1309 1
+                              Store 1312 1313
+            1314:      6(int) Load 8(invocation)
+            1315:   1124(ptr) AccessChain 34(data) 59 1116
+            1316: 28(i64vec4) Load 1315
+            1317:1134(i64vec3) VectorShuffle 1316 1316 0 1 2
+            1318:1134(i64vec3) GroupNonUniformBitwiseXor 43 ClusteredReduce 1317 42
+            1319:   1117(ptr) AccessChain 34(data) 1314 1116 38
+            1320: 27(int64_t) CompositeExtract 1318 0
+                              Store 1319 1320
+            1321:   1117(ptr) AccessChain 34(data) 1314 1116 42
+            1322: 27(int64_t) CompositeExtract 1318 1
+                              Store 1321 1322
+            1323:   1117(ptr) AccessChain 34(data) 1314 1116 69
+            1324: 27(int64_t) CompositeExtract 1318 2
+                              Store 1323 1324
+            1325:      6(int) Load 8(invocation)
+            1326:   1124(ptr) AccessChain 34(data) 73 1116
+            1327: 28(i64vec4) Load 1326
+            1328: 28(i64vec4) GroupNonUniformBitwiseXor 43 ClusteredReduce 1327 42
+            1329:   1124(ptr) AccessChain 34(data) 1325 1116
+                              Store 1329 1328
+            1330:      6(int) Load 8(invocation)
+            1333:   1332(ptr) AccessChain 34(data) 37 1331 38
+            1334:29(float16_t) Load 1333
+            1335:29(float16_t) GroupNonUniformFAdd 43 ClusteredReduce 1334 42
+            1336:   1332(ptr) AccessChain 34(data) 1330 1331 38
+                              Store 1336 1335
+            1337:      6(int) Load 8(invocation)
+            1340:   1339(ptr) AccessChain 34(data) 47 1331
+            1341: 30(f16vec4) Load 1340
+            1342:1338(f16vec2) VectorShuffle 1341 1341 0 1
+            1343:1338(f16vec2) GroupNonUniformFAdd 43 ClusteredReduce 1342 42
+            1344:   1332(ptr) AccessChain 34(data) 1337 1331 38
+            1345:29(float16_t) CompositeExtract 1343 0
+                              Store 1344 1345
+            1346:   1332(ptr) AccessChain 34(data) 1337 1331 42
+            1347:29(float16_t) CompositeExtract 1343 1
+                              Store 1346 1347
+            1348:      6(int) Load 8(invocation)
+            1350:   1339(ptr) AccessChain 34(data) 59 1331
+            1351: 30(f16vec4) Load 1350
+            1352:1349(f16vec3) VectorShuffle 1351 1351 0 1 2
+            1353:1349(f16vec3) GroupNonUniformFAdd 43 ClusteredReduce 1352 42
+            1354:   1332(ptr) AccessChain 34(data) 1348 1331 38
+            1355:29(float16_t) CompositeExtract 1353 0
+                              Store 1354 1355
+            1356:   1332(ptr) AccessChain 34(data) 1348 1331 42
+            1357:29(float16_t) CompositeExtract 1353 1
+                              Store 1356 1357
+            1358:   1332(ptr) AccessChain 34(data) 1348 1331 69
+            1359:29(float16_t) CompositeExtract 1353 2
+                              Store 1358 1359
+            1360:      6(int) Load 8(invocation)
+            1361:   1339(ptr) AccessChain 34(data) 73 1331
+            1362: 30(f16vec4) Load 1361
+            1363: 30(f16vec4) GroupNonUniformFAdd 43 ClusteredReduce 1362 42
+            1364:   1339(ptr) AccessChain 34(data) 1360 1331
+                              Store 1364 1363
+            1365:      6(int) Load 8(invocation)
+            1366:   1332(ptr) AccessChain 34(data) 37 1331 38
+            1367:29(float16_t) Load 1366
+            1368:29(float16_t) GroupNonUniformFMul 43 ClusteredReduce 1367 42
+            1369:   1332(ptr) AccessChain 34(data) 1365 1331 38
+                              Store 1369 1368
+            1370:      6(int) Load 8(invocation)
+            1371:   1339(ptr) AccessChain 34(data) 47 1331
+            1372: 30(f16vec4) Load 1371
+            1373:1338(f16vec2) VectorShuffle 1372 1372 0 1
+            1374:1338(f16vec2) GroupNonUniformFMul 43 ClusteredReduce 1373 42
+            1375:   1332(ptr) AccessChain 34(data) 1370 1331 38
+            1376:29(float16_t) CompositeExtract 1374 0
+                              Store 1375 1376
+            1377:   1332(ptr) AccessChain 34(data) 1370 1331 42
+            1378:29(float16_t) CompositeExtract 1374 1
+                              Store 1377 1378
+            1379:      6(int) Load 8(invocation)
+            1380:   1339(ptr) AccessChain 34(data) 59 1331
+            1381: 30(f16vec4) Load 1380
+            1382:1349(f16vec3) VectorShuffle 1381 1381 0 1 2
+            1383:1349(f16vec3) GroupNonUniformFMul 43 ClusteredReduce 1382 42
+            1384:   1332(ptr) AccessChain 34(data) 1379 1331 38
+            1385:29(float16_t) CompositeExtract 1383 0
+                              Store 1384 1385
+            1386:   1332(ptr) AccessChain 34(data) 1379 1331 42
+            1387:29(float16_t) CompositeExtract 1383 1
+                              Store 1386 1387
+            1388:   1332(ptr) AccessChain 34(data) 1379 1331 69
+            1389:29(float16_t) CompositeExtract 1383 2
+                              Store 1388 1389
+            1390:      6(int) Load 8(invocation)
+            1391:   1339(ptr) AccessChain 34(data) 73 1331
+            1392: 30(f16vec4) Load 1391
+            1393: 30(f16vec4) GroupNonUniformFMul 43 ClusteredReduce 1392 42
+            1394:   1339(ptr) AccessChain 34(data) 1390 1331
+                              Store 1394 1393
+            1395:      6(int) Load 8(invocation)
+            1396:   1332(ptr) AccessChain 34(data) 37 1331 38
+            1397:29(float16_t) Load 1396
+            1398:29(float16_t) GroupNonUniformFMin 43 ClusteredReduce 1397 42
+            1399:   1332(ptr) AccessChain 34(data) 1395 1331 38
+                              Store 1399 1398
+            1400:      6(int) Load 8(invocation)
+            1401:   1339(ptr) AccessChain 34(data) 47 1331
+            1402: 30(f16vec4) Load 1401
+            1403:1338(f16vec2) VectorShuffle 1402 1402 0 1
+            1404:1338(f16vec2) GroupNonUniformFMin 43 ClusteredReduce 1403 42
+            1405:   1332(ptr) AccessChain 34(data) 1400 1331 38
+            1406:29(float16_t) CompositeExtract 1404 0
+                              Store 1405 1406
+            1407:   1332(ptr) AccessChain 34(data) 1400 1331 42
+            1408:29(float16_t) CompositeExtract 1404 1
+                              Store 1407 1408
+            1409:      6(int) Load 8(invocation)
+            1410:   1339(ptr) AccessChain 34(data) 59 1331
+            1411: 30(f16vec4) Load 1410
+            1412:1349(f16vec3) VectorShuffle 1411 1411 0 1 2
+            1413:1349(f16vec3) GroupNonUniformFMin 43 ClusteredReduce 1412 42
+            1414:   1332(ptr) AccessChain 34(data) 1409 1331 38
+            1415:29(float16_t) CompositeExtract 1413 0
+                              Store 1414 1415
+            1416:   1332(ptr) AccessChain 34(data) 1409 1331 42
+            1417:29(float16_t) CompositeExtract 1413 1
+                              Store 1416 1417
+            1418:   1332(ptr) AccessChain 34(data) 1409 1331 69
+            1419:29(float16_t) CompositeExtract 1413 2
+                              Store 1418 1419
+            1420:      6(int) Load 8(invocation)
+            1421:   1339(ptr) AccessChain 34(data) 73 1331
+            1422: 30(f16vec4) Load 1421
+            1423: 30(f16vec4) GroupNonUniformFMin 43 ClusteredReduce 1422 42
+            1424:   1339(ptr) AccessChain 34(data) 1420 1331
+                              Store 1424 1423
+            1425:      6(int) Load 8(invocation)
+            1426:   1332(ptr) AccessChain 34(data) 37 1331 38
+            1427:29(float16_t) Load 1426
+            1428:29(float16_t) GroupNonUniformFMax 43 ClusteredReduce 1427 42
+            1429:   1332(ptr) AccessChain 34(data) 1425 1331 38
+                              Store 1429 1428
+            1430:      6(int) Load 8(invocation)
+            1431:   1339(ptr) AccessChain 34(data) 47 1331
+            1432: 30(f16vec4) Load 1431
+            1433:1338(f16vec2) VectorShuffle 1432 1432 0 1
+            1434:1338(f16vec2) GroupNonUniformFMax 43 ClusteredReduce 1433 42
+            1435:   1332(ptr) AccessChain 34(data) 1430 1331 38
+            1436:29(float16_t) CompositeExtract 1434 0
+                              Store 1435 1436
+            1437:   1332(ptr) AccessChain 34(data) 1430 1331 42
+            1438:29(float16_t) CompositeExtract 1434 1
+                              Store 1437 1438
+            1439:      6(int) Load 8(invocation)
+            1440:   1339(ptr) AccessChain 34(data) 59 1331
+            1441: 30(f16vec4) Load 1440
+            1442:1349(f16vec3) VectorShuffle 1441 1441 0 1 2
+            1443:1349(f16vec3) GroupNonUniformFMax 43 ClusteredReduce 1442 42
+            1444:   1332(ptr) AccessChain 34(data) 1439 1331 38
+            1445:29(float16_t) CompositeExtract 1443 0
+                              Store 1444 1445
+            1446:   1332(ptr) AccessChain 34(data) 1439 1331 42
+            1447:29(float16_t) CompositeExtract 1443 1
+                              Store 1446 1447
+            1448:   1332(ptr) AccessChain 34(data) 1439 1331 69
+            1449:29(float16_t) CompositeExtract 1443 2
+                              Store 1448 1449
+            1450:      6(int) Load 8(invocation)
+            1451:   1339(ptr) AccessChain 34(data) 73 1331
+            1452: 30(f16vec4) Load 1451
+            1453: 30(f16vec4) GroupNonUniformFMax 43 ClusteredReduce 1452 42
+            1454:   1339(ptr) AccessChain 34(data) 1450 1331
+                              Store 1454 1453
                               Return
                               FunctionEnd
diff --git a/third_party/vulkan-deps/glslang/src/Test/baseResults/spv.subgroupExtendedTypesPartitioned.comp.out b/third_party/vulkan-deps/glslang/src/Test/baseResults/spv.subgroupExtendedTypesPartitioned.comp.out
index ccfbacc..47576d9 100644
--- a/third_party/vulkan-deps/glslang/src/Test/baseResults/spv.subgroupExtendedTypesPartitioned.comp.out
+++ b/third_party/vulkan-deps/glslang/src/Test/baseResults/spv.subgroupExtendedTypesPartitioned.comp.out
@@ -1,7 +1,7 @@
 spv.subgroupExtendedTypesPartitioned.comp
 // Module Version 10300
 // Generated by (magic number): 8000a
-// Id's are bound by 1558
+// Id's are bound by 1743
 
                               Capability Shader
                               Capability Float16
@@ -61,7 +61,7 @@
                               Decorate 34(Buffers) Block
                               Decorate 37(data) DescriptorSet 0
                               Decorate 37(data) Binding 0
-                              Decorate 1557 BuiltIn WorkgroupSize
+                              Decorate 1742 BuiltIn WorkgroupSize
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeInt 32 0
@@ -128,10 +128,11 @@
              160:             TypePointer StorageBuffer 33(f16vec4)
              165:             TypeVector 32(float16_t) 3
              177:      6(int) Constant 3
-            1554:             TypeVector 6(int) 3
-            1555:      6(int) Constant 8
-            1556:      6(int) Constant 1
-            1557: 1554(ivec3) ConstantComposite 1555 1556 1556
+             188:      6(int) Constant 1
+             201:      6(int) Constant 2
+            1740:             TypeVector 6(int) 3
+            1741:      6(int) Constant 8
+            1742: 1740(ivec3) ConstantComposite 1741 188 188
          4(main):           2 Function None 3
                5:             Label
    8(invocation):      7(ptr) Variable Function
@@ -280,270 +281,285 @@
              183:  46(i8vec2) VectorShuffle 182 182 0 1
              184:   17(ivec4) Load 19(ballot)
              185:  46(i8vec2) GroupNonUniformIAdd 177 PartitionedReduceNV 183 184
-             186:     47(ptr) AccessChain 37(data) 180 39
-             187:  21(i8vec4) Load 186
-             188:  21(i8vec4) VectorShuffle 187 185 4 5 2 3
-                              Store 186 188
-             189:      6(int) Load 8(invocation)
-             190:     47(ptr) AccessChain 37(data) 52 39
-             191:  21(i8vec4) Load 190
-             192:  53(i8vec3) VectorShuffle 191 191 0 1 2
-             193:   17(ivec4) Load 19(ballot)
-             194:  53(i8vec3) GroupNonUniformIAdd 177 PartitionedReduceNV 192 193
-             195:     47(ptr) AccessChain 37(data) 189 39
-             196:  21(i8vec4) Load 195
-             197:  21(i8vec4) VectorShuffle 196 194 4 5 6 3
-                              Store 195 197
-             198:      6(int) Load 8(invocation)
-             199:     47(ptr) AccessChain 37(data) 58 39
-             200:  21(i8vec4) Load 199
-             201:   17(ivec4) Load 19(ballot)
-             202:  21(i8vec4) GroupNonUniformIAdd 177 PartitionedReduceNV 200 201
-             203:     47(ptr) AccessChain 37(data) 198 39
-                              Store 203 202
+             186:     41(ptr) AccessChain 37(data) 180 39 40
+             187:  20(int8_t) CompositeExtract 185 0
+                              Store 186 187
+             189:     41(ptr) AccessChain 37(data) 180 39 188
+             190:  20(int8_t) CompositeExtract 185 1
+                              Store 189 190
+             191:      6(int) Load 8(invocation)
+             192:     47(ptr) AccessChain 37(data) 52 39
+             193:  21(i8vec4) Load 192
+             194:  53(i8vec3) VectorShuffle 193 193 0 1 2
+             195:   17(ivec4) Load 19(ballot)
+             196:  53(i8vec3) GroupNonUniformIAdd 177 PartitionedReduceNV 194 195
+             197:     41(ptr) AccessChain 37(data) 191 39 40
+             198:  20(int8_t) CompositeExtract 196 0
+                              Store 197 198
+             199:     41(ptr) AccessChain 37(data) 191 39 188
+             200:  20(int8_t) CompositeExtract 196 1
+                              Store 199 200
+             202:     41(ptr) AccessChain 37(data) 191 39 201
+             203:  20(int8_t) CompositeExtract 196 2
+                              Store 202 203
              204:      6(int) Load 8(invocation)
-             205:     41(ptr) AccessChain 37(data) 39 39 40
-             206:  20(int8_t) Load 205
+             205:     47(ptr) AccessChain 37(data) 58 39
+             206:  21(i8vec4) Load 205
              207:   17(ivec4) Load 19(ballot)
-             208:  20(int8_t) GroupNonUniformIMul 177 PartitionedReduceNV 206 207
-             209:     41(ptr) AccessChain 37(data) 204 39 40
+             208:  21(i8vec4) GroupNonUniformIAdd 177 PartitionedReduceNV 206 207
+             209:     47(ptr) AccessChain 37(data) 204 39
                               Store 209 208
              210:      6(int) Load 8(invocation)
-             211:     47(ptr) AccessChain 37(data) 45 39
-             212:  21(i8vec4) Load 211
-             213:  46(i8vec2) VectorShuffle 212 212 0 1
-             214:   17(ivec4) Load 19(ballot)
-             215:  46(i8vec2) GroupNonUniformIMul 177 PartitionedReduceNV 213 214
-             216:     47(ptr) AccessChain 37(data) 210 39
-             217:  21(i8vec4) Load 216
-             218:  21(i8vec4) VectorShuffle 217 215 4 5 2 3
-                              Store 216 218
-             219:      6(int) Load 8(invocation)
-             220:     47(ptr) AccessChain 37(data) 52 39
-             221:  21(i8vec4) Load 220
-             222:  53(i8vec3) VectorShuffle 221 221 0 1 2
-             223:   17(ivec4) Load 19(ballot)
-             224:  53(i8vec3) GroupNonUniformIMul 177 PartitionedReduceNV 222 223
-             225:     47(ptr) AccessChain 37(data) 219 39
-             226:  21(i8vec4) Load 225
-             227:  21(i8vec4) VectorShuffle 226 224 4 5 6 3
-                              Store 225 227
-             228:      6(int) Load 8(invocation)
-             229:     47(ptr) AccessChain 37(data) 58 39
-             230:  21(i8vec4) Load 229
-             231:   17(ivec4) Load 19(ballot)
-             232:  21(i8vec4) GroupNonUniformIMul 177 PartitionedReduceNV 230 231
-             233:     47(ptr) AccessChain 37(data) 228 39
-                              Store 233 232
-             234:      6(int) Load 8(invocation)
-             235:     41(ptr) AccessChain 37(data) 39 39 40
-             236:  20(int8_t) Load 235
-             237:   17(ivec4) Load 19(ballot)
-             238:  20(int8_t) GroupNonUniformSMin 177 PartitionedReduceNV 236 237
-             239:     41(ptr) AccessChain 37(data) 234 39 40
-                              Store 239 238
-             240:      6(int) Load 8(invocation)
-             241:     47(ptr) AccessChain 37(data) 45 39
-             242:  21(i8vec4) Load 241
-             243:  46(i8vec2) VectorShuffle 242 242 0 1
-             244:   17(ivec4) Load 19(ballot)
-             245:  46(i8vec2) GroupNonUniformSMin 177 PartitionedReduceNV 243 244
-             246:     47(ptr) AccessChain 37(data) 240 39
-             247:  21(i8vec4) Load 246
-             248:  21(i8vec4) VectorShuffle 247 245 4 5 2 3
-                              Store 246 248
-             249:      6(int) Load 8(invocation)
-             250:     47(ptr) AccessChain 37(data) 52 39
-             251:  21(i8vec4) Load 250
-             252:  53(i8vec3) VectorShuffle 251 251 0 1 2
-             253:   17(ivec4) Load 19(ballot)
-             254:  53(i8vec3) GroupNonUniformSMin 177 PartitionedReduceNV 252 253
-             255:     47(ptr) AccessChain 37(data) 249 39
-             256:  21(i8vec4) Load 255
-             257:  21(i8vec4) VectorShuffle 256 254 4 5 6 3
-                              Store 255 257
-             258:      6(int) Load 8(invocation)
-             259:     47(ptr) AccessChain 37(data) 58 39
-             260:  21(i8vec4) Load 259
-             261:   17(ivec4) Load 19(ballot)
-             262:  21(i8vec4) GroupNonUniformSMin 177 PartitionedReduceNV 260 261
-             263:     47(ptr) AccessChain 37(data) 258 39
-                              Store 263 262
-             264:      6(int) Load 8(invocation)
-             265:     41(ptr) AccessChain 37(data) 39 39 40
-             266:  20(int8_t) Load 265
-             267:   17(ivec4) Load 19(ballot)
-             268:  20(int8_t) GroupNonUniformSMax 177 PartitionedReduceNV 266 267
-             269:     41(ptr) AccessChain 37(data) 264 39 40
-                              Store 269 268
-             270:      6(int) Load 8(invocation)
-             271:     47(ptr) AccessChain 37(data) 45 39
-             272:  21(i8vec4) Load 271
-             273:  46(i8vec2) VectorShuffle 272 272 0 1
-             274:   17(ivec4) Load 19(ballot)
-             275:  46(i8vec2) GroupNonUniformSMax 177 PartitionedReduceNV 273 274
-             276:     47(ptr) AccessChain 37(data) 270 39
-             277:  21(i8vec4) Load 276
-             278:  21(i8vec4) VectorShuffle 277 275 4 5 2 3
-                              Store 276 278
-             279:      6(int) Load 8(invocation)
-             280:     47(ptr) AccessChain 37(data) 52 39
-             281:  21(i8vec4) Load 280
-             282:  53(i8vec3) VectorShuffle 281 281 0 1 2
-             283:   17(ivec4) Load 19(ballot)
-             284:  53(i8vec3) GroupNonUniformSMax 177 PartitionedReduceNV 282 283
-             285:     47(ptr) AccessChain 37(data) 279 39
+             211:     41(ptr) AccessChain 37(data) 39 39 40
+             212:  20(int8_t) Load 211
+             213:   17(ivec4) Load 19(ballot)
+             214:  20(int8_t) GroupNonUniformIMul 177 PartitionedReduceNV 212 213
+             215:     41(ptr) AccessChain 37(data) 210 39 40
+                              Store 215 214
+             216:      6(int) Load 8(invocation)
+             217:     47(ptr) AccessChain 37(data) 45 39
+             218:  21(i8vec4) Load 217
+             219:  46(i8vec2) VectorShuffle 218 218 0 1
+             220:   17(ivec4) Load 19(ballot)
+             221:  46(i8vec2) GroupNonUniformIMul 177 PartitionedReduceNV 219 220
+             222:     41(ptr) AccessChain 37(data) 216 39 40
+             223:  20(int8_t) CompositeExtract 221 0
+                              Store 222 223
+             224:     41(ptr) AccessChain 37(data) 216 39 188
+             225:  20(int8_t) CompositeExtract 221 1
+                              Store 224 225
+             226:      6(int) Load 8(invocation)
+             227:     47(ptr) AccessChain 37(data) 52 39
+             228:  21(i8vec4) Load 227
+             229:  53(i8vec3) VectorShuffle 228 228 0 1 2
+             230:   17(ivec4) Load 19(ballot)
+             231:  53(i8vec3) GroupNonUniformIMul 177 PartitionedReduceNV 229 230
+             232:     41(ptr) AccessChain 37(data) 226 39 40
+             233:  20(int8_t) CompositeExtract 231 0
+                              Store 232 233
+             234:     41(ptr) AccessChain 37(data) 226 39 188
+             235:  20(int8_t) CompositeExtract 231 1
+                              Store 234 235
+             236:     41(ptr) AccessChain 37(data) 226 39 201
+             237:  20(int8_t) CompositeExtract 231 2
+                              Store 236 237
+             238:      6(int) Load 8(invocation)
+             239:     47(ptr) AccessChain 37(data) 58 39
+             240:  21(i8vec4) Load 239
+             241:   17(ivec4) Load 19(ballot)
+             242:  21(i8vec4) GroupNonUniformIMul 177 PartitionedReduceNV 240 241
+             243:     47(ptr) AccessChain 37(data) 238 39
+                              Store 243 242
+             244:      6(int) Load 8(invocation)
+             245:     41(ptr) AccessChain 37(data) 39 39 40
+             246:  20(int8_t) Load 245
+             247:   17(ivec4) Load 19(ballot)
+             248:  20(int8_t) GroupNonUniformSMin 177 PartitionedReduceNV 246 247
+             249:     41(ptr) AccessChain 37(data) 244 39 40
+                              Store 249 248
+             250:      6(int) Load 8(invocation)
+             251:     47(ptr) AccessChain 37(data) 45 39
+             252:  21(i8vec4) Load 251
+             253:  46(i8vec2) VectorShuffle 252 252 0 1
+             254:   17(ivec4) Load 19(ballot)
+             255:  46(i8vec2) GroupNonUniformSMin 177 PartitionedReduceNV 253 254
+             256:     41(ptr) AccessChain 37(data) 250 39 40
+             257:  20(int8_t) CompositeExtract 255 0
+                              Store 256 257
+             258:     41(ptr) AccessChain 37(data) 250 39 188
+             259:  20(int8_t) CompositeExtract 255 1
+                              Store 258 259
+             260:      6(int) Load 8(invocation)
+             261:     47(ptr) AccessChain 37(data) 52 39
+             262:  21(i8vec4) Load 261
+             263:  53(i8vec3) VectorShuffle 262 262 0 1 2
+             264:   17(ivec4) Load 19(ballot)
+             265:  53(i8vec3) GroupNonUniformSMin 177 PartitionedReduceNV 263 264
+             266:     41(ptr) AccessChain 37(data) 260 39 40
+             267:  20(int8_t) CompositeExtract 265 0
+                              Store 266 267
+             268:     41(ptr) AccessChain 37(data) 260 39 188
+             269:  20(int8_t) CompositeExtract 265 1
+                              Store 268 269
+             270:     41(ptr) AccessChain 37(data) 260 39 201
+             271:  20(int8_t) CompositeExtract 265 2
+                              Store 270 271
+             272:      6(int) Load 8(invocation)
+             273:     47(ptr) AccessChain 37(data) 58 39
+             274:  21(i8vec4) Load 273
+             275:   17(ivec4) Load 19(ballot)
+             276:  21(i8vec4) GroupNonUniformSMin 177 PartitionedReduceNV 274 275
+             277:     47(ptr) AccessChain 37(data) 272 39
+                              Store 277 276
+             278:      6(int) Load 8(invocation)
+             279:     41(ptr) AccessChain 37(data) 39 39 40
+             280:  20(int8_t) Load 279
+             281:   17(ivec4) Load 19(ballot)
+             282:  20(int8_t) GroupNonUniformSMax 177 PartitionedReduceNV 280 281
+             283:     41(ptr) AccessChain 37(data) 278 39 40
+                              Store 283 282
+             284:      6(int) Load 8(invocation)
+             285:     47(ptr) AccessChain 37(data) 45 39
              286:  21(i8vec4) Load 285
-             287:  21(i8vec4) VectorShuffle 286 284 4 5 6 3
-                              Store 285 287
-             288:      6(int) Load 8(invocation)
-             289:     47(ptr) AccessChain 37(data) 58 39
-             290:  21(i8vec4) Load 289
-             291:   17(ivec4) Load 19(ballot)
-             292:  21(i8vec4) GroupNonUniformSMax 177 PartitionedReduceNV 290 291
-             293:     47(ptr) AccessChain 37(data) 288 39
-                              Store 293 292
+             287:  46(i8vec2) VectorShuffle 286 286 0 1
+             288:   17(ivec4) Load 19(ballot)
+             289:  46(i8vec2) GroupNonUniformSMax 177 PartitionedReduceNV 287 288
+             290:     41(ptr) AccessChain 37(data) 284 39 40
+             291:  20(int8_t) CompositeExtract 289 0
+                              Store 290 291
+             292:     41(ptr) AccessChain 37(data) 284 39 188
+             293:  20(int8_t) CompositeExtract 289 1
+                              Store 292 293
              294:      6(int) Load 8(invocation)
-             295:     41(ptr) AccessChain 37(data) 39 39 40
-             296:  20(int8_t) Load 295
-             297:   17(ivec4) Load 19(ballot)
-             298:  20(int8_t) GroupNonUniformBitwiseAnd 177 PartitionedReduceNV 296 297
-             299:     41(ptr) AccessChain 37(data) 294 39 40
-                              Store 299 298
-             300:      6(int) Load 8(invocation)
-             301:     47(ptr) AccessChain 37(data) 45 39
-             302:  21(i8vec4) Load 301
-             303:  46(i8vec2) VectorShuffle 302 302 0 1
-             304:   17(ivec4) Load 19(ballot)
-             305:  46(i8vec2) GroupNonUniformBitwiseAnd 177 PartitionedReduceNV 303 304
-             306:     47(ptr) AccessChain 37(data) 300 39
-             307:  21(i8vec4) Load 306
-             308:  21(i8vec4) VectorShuffle 307 305 4 5 2 3
-                              Store 306 308
-             309:      6(int) Load 8(invocation)
-             310:     47(ptr) AccessChain 37(data) 52 39
-             311:  21(i8vec4) Load 310
-             312:  53(i8vec3) VectorShuffle 311 311 0 1 2
-             313:   17(ivec4) Load 19(ballot)
-             314:  53(i8vec3) GroupNonUniformBitwiseAnd 177 PartitionedReduceNV 312 313
-             315:     47(ptr) AccessChain 37(data) 309 39
-             316:  21(i8vec4) Load 315
-             317:  21(i8vec4) VectorShuffle 316 314 4 5 6 3
-                              Store 315 317
+             295:     47(ptr) AccessChain 37(data) 52 39
+             296:  21(i8vec4) Load 295
+             297:  53(i8vec3) VectorShuffle 296 296 0 1 2
+             298:   17(ivec4) Load 19(ballot)
+             299:  53(i8vec3) GroupNonUniformSMax 177 PartitionedReduceNV 297 298
+             300:     41(ptr) AccessChain 37(data) 294 39 40
+             301:  20(int8_t) CompositeExtract 299 0
+                              Store 300 301
+             302:     41(ptr) AccessChain 37(data) 294 39 188
+             303:  20(int8_t) CompositeExtract 299 1
+                              Store 302 303
+             304:     41(ptr) AccessChain 37(data) 294 39 201
+             305:  20(int8_t) CompositeExtract 299 2
+                              Store 304 305
+             306:      6(int) Load 8(invocation)
+             307:     47(ptr) AccessChain 37(data) 58 39
+             308:  21(i8vec4) Load 307
+             309:   17(ivec4) Load 19(ballot)
+             310:  21(i8vec4) GroupNonUniformSMax 177 PartitionedReduceNV 308 309
+             311:     47(ptr) AccessChain 37(data) 306 39
+                              Store 311 310
+             312:      6(int) Load 8(invocation)
+             313:     41(ptr) AccessChain 37(data) 39 39 40
+             314:  20(int8_t) Load 313
+             315:   17(ivec4) Load 19(ballot)
+             316:  20(int8_t) GroupNonUniformBitwiseAnd 177 PartitionedReduceNV 314 315
+             317:     41(ptr) AccessChain 37(data) 312 39 40
+                              Store 317 316
              318:      6(int) Load 8(invocation)
-             319:     47(ptr) AccessChain 37(data) 58 39
+             319:     47(ptr) AccessChain 37(data) 45 39
              320:  21(i8vec4) Load 319
-             321:   17(ivec4) Load 19(ballot)
-             322:  21(i8vec4) GroupNonUniformBitwiseAnd 177 PartitionedReduceNV 320 321
-             323:     47(ptr) AccessChain 37(data) 318 39
-                              Store 323 322
-             324:      6(int) Load 8(invocation)
-             325:     41(ptr) AccessChain 37(data) 39 39 40
-             326:  20(int8_t) Load 325
-             327:   17(ivec4) Load 19(ballot)
-             328:  20(int8_t) GroupNonUniformBitwiseOr 177 PartitionedReduceNV 326 327
-             329:     41(ptr) AccessChain 37(data) 324 39 40
-                              Store 329 328
-             330:      6(int) Load 8(invocation)
-             331:     47(ptr) AccessChain 37(data) 45 39
-             332:  21(i8vec4) Load 331
-             333:  46(i8vec2) VectorShuffle 332 332 0 1
-             334:   17(ivec4) Load 19(ballot)
-             335:  46(i8vec2) GroupNonUniformBitwiseOr 177 PartitionedReduceNV 333 334
-             336:     47(ptr) AccessChain 37(data) 330 39
-             337:  21(i8vec4) Load 336
-             338:  21(i8vec4) VectorShuffle 337 335 4 5 2 3
-                              Store 336 338
-             339:      6(int) Load 8(invocation)
-             340:     47(ptr) AccessChain 37(data) 52 39
-             341:  21(i8vec4) Load 340
-             342:  53(i8vec3) VectorShuffle 341 341 0 1 2
+             321:  46(i8vec2) VectorShuffle 320 320 0 1
+             322:   17(ivec4) Load 19(ballot)
+             323:  46(i8vec2) GroupNonUniformBitwiseAnd 177 PartitionedReduceNV 321 322
+             324:     41(ptr) AccessChain 37(data) 318 39 40
+             325:  20(int8_t) CompositeExtract 323 0
+                              Store 324 325
+             326:     41(ptr) AccessChain 37(data) 318 39 188
+             327:  20(int8_t) CompositeExtract 323 1
+                              Store 326 327
+             328:      6(int) Load 8(invocation)
+             329:     47(ptr) AccessChain 37(data) 52 39
+             330:  21(i8vec4) Load 329
+             331:  53(i8vec3) VectorShuffle 330 330 0 1 2
+             332:   17(ivec4) Load 19(ballot)
+             333:  53(i8vec3) GroupNonUniformBitwiseAnd 177 PartitionedReduceNV 331 332
+             334:     41(ptr) AccessChain 37(data) 328 39 40
+             335:  20(int8_t) CompositeExtract 333 0
+                              Store 334 335
+             336:     41(ptr) AccessChain 37(data) 328 39 188
+             337:  20(int8_t) CompositeExtract 333 1
+                              Store 336 337
+             338:     41(ptr) AccessChain 37(data) 328 39 201
+             339:  20(int8_t) CompositeExtract 333 2
+                              Store 338 339
+             340:      6(int) Load 8(invocation)
+             341:     47(ptr) AccessChain 37(data) 58 39
+             342:  21(i8vec4) Load 341
              343:   17(ivec4) Load 19(ballot)
-             344:  53(i8vec3) GroupNonUniformBitwiseOr 177 PartitionedReduceNV 342 343
-             345:     47(ptr) AccessChain 37(data) 339 39
-             346:  21(i8vec4) Load 345
-             347:  21(i8vec4) VectorShuffle 346 344 4 5 6 3
-                              Store 345 347
-             348:      6(int) Load 8(invocation)
-             349:     47(ptr) AccessChain 37(data) 58 39
-             350:  21(i8vec4) Load 349
-             351:   17(ivec4) Load 19(ballot)
-             352:  21(i8vec4) GroupNonUniformBitwiseOr 177 PartitionedReduceNV 350 351
-             353:     47(ptr) AccessChain 37(data) 348 39
-                              Store 353 352
-             354:      6(int) Load 8(invocation)
-             355:     41(ptr) AccessChain 37(data) 39 39 40
-             356:  20(int8_t) Load 355
-             357:   17(ivec4) Load 19(ballot)
-             358:  20(int8_t) GroupNonUniformBitwiseXor 177 PartitionedReduceNV 356 357
-             359:     41(ptr) AccessChain 37(data) 354 39 40
-                              Store 359 358
-             360:      6(int) Load 8(invocation)
-             361:     47(ptr) AccessChain 37(data) 45 39
-             362:  21(i8vec4) Load 361
-             363:  46(i8vec2) VectorShuffle 362 362 0 1
-             364:   17(ivec4) Load 19(ballot)
-             365:  46(i8vec2) GroupNonUniformBitwiseXor 177 PartitionedReduceNV 363 364
-             366:     47(ptr) AccessChain 37(data) 360 39
-             367:  21(i8vec4) Load 366
-             368:  21(i8vec4) VectorShuffle 367 365 4 5 2 3
-                              Store 366 368
-             369:      6(int) Load 8(invocation)
-             370:     47(ptr) AccessChain 37(data) 52 39
-             371:  21(i8vec4) Load 370
-             372:  53(i8vec3) VectorShuffle 371 371 0 1 2
-             373:   17(ivec4) Load 19(ballot)
-             374:  53(i8vec3) GroupNonUniformBitwiseXor 177 PartitionedReduceNV 372 373
-             375:     47(ptr) AccessChain 37(data) 369 39
+             344:  21(i8vec4) GroupNonUniformBitwiseAnd 177 PartitionedReduceNV 342 343
+             345:     47(ptr) AccessChain 37(data) 340 39
+                              Store 345 344
+             346:      6(int) Load 8(invocation)
+             347:     41(ptr) AccessChain 37(data) 39 39 40
+             348:  20(int8_t) Load 347
+             349:   17(ivec4) Load 19(ballot)
+             350:  20(int8_t) GroupNonUniformBitwiseOr 177 PartitionedReduceNV 348 349
+             351:     41(ptr) AccessChain 37(data) 346 39 40
+                              Store 351 350
+             352:      6(int) Load 8(invocation)
+             353:     47(ptr) AccessChain 37(data) 45 39
+             354:  21(i8vec4) Load 353
+             355:  46(i8vec2) VectorShuffle 354 354 0 1
+             356:   17(ivec4) Load 19(ballot)
+             357:  46(i8vec2) GroupNonUniformBitwiseOr 177 PartitionedReduceNV 355 356
+             358:     41(ptr) AccessChain 37(data) 352 39 40
+             359:  20(int8_t) CompositeExtract 357 0
+                              Store 358 359
+             360:     41(ptr) AccessChain 37(data) 352 39 188
+             361:  20(int8_t) CompositeExtract 357 1
+                              Store 360 361
+             362:      6(int) Load 8(invocation)
+             363:     47(ptr) AccessChain 37(data) 52 39
+             364:  21(i8vec4) Load 363
+             365:  53(i8vec3) VectorShuffle 364 364 0 1 2
+             366:   17(ivec4) Load 19(ballot)
+             367:  53(i8vec3) GroupNonUniformBitwiseOr 177 PartitionedReduceNV 365 366
+             368:     41(ptr) AccessChain 37(data) 362 39 40
+             369:  20(int8_t) CompositeExtract 367 0
+                              Store 368 369
+             370:     41(ptr) AccessChain 37(data) 362 39 188
+             371:  20(int8_t) CompositeExtract 367 1
+                              Store 370 371
+             372:     41(ptr) AccessChain 37(data) 362 39 201
+             373:  20(int8_t) CompositeExtract 367 2
+                              Store 372 373
+             374:      6(int) Load 8(invocation)
+             375:     47(ptr) AccessChain 37(data) 58 39
              376:  21(i8vec4) Load 375
-             377:  21(i8vec4) VectorShuffle 376 374 4 5 6 3
-                              Store 375 377
-             378:      6(int) Load 8(invocation)
-             379:     47(ptr) AccessChain 37(data) 58 39
-             380:  21(i8vec4) Load 379
-             381:   17(ivec4) Load 19(ballot)
-             382:  21(i8vec4) GroupNonUniformBitwiseXor 177 PartitionedReduceNV 380 381
-             383:     47(ptr) AccessChain 37(data) 378 39
-                              Store 383 382
-             384:      6(int) Load 8(invocation)
-             385:     62(ptr) AccessChain 37(data) 39 45 40
-             386:  22(int8_t) Load 385
-             387:   17(ivec4) Load 19(ballot)
-             388:  22(int8_t) GroupNonUniformIAdd 177 PartitionedReduceNV 386 387
-             389:     62(ptr) AccessChain 37(data) 384 45 40
-                              Store 389 388
-             390:      6(int) Load 8(invocation)
-             391:     67(ptr) AccessChain 37(data) 45 45
-             392:  23(i8vec4) Load 391
-             393:  66(i8vec2) VectorShuffle 392 392 0 1
-             394:   17(ivec4) Load 19(ballot)
-             395:  66(i8vec2) GroupNonUniformIAdd 177 PartitionedReduceNV 393 394
-             396:     67(ptr) AccessChain 37(data) 390 45
-             397:  23(i8vec4) Load 396
-             398:  23(i8vec4) VectorShuffle 397 395 4 5 2 3
-                              Store 396 398
-             399:      6(int) Load 8(invocation)
-             400:     67(ptr) AccessChain 37(data) 52 45
-             401:  23(i8vec4) Load 400
-             402:  72(i8vec3) VectorShuffle 401 401 0 1 2
-             403:   17(ivec4) Load 19(ballot)
-             404:  72(i8vec3) GroupNonUniformIAdd 177 PartitionedReduceNV 402 403
-             405:     67(ptr) AccessChain 37(data) 399 45
-             406:  23(i8vec4) Load 405
-             407:  23(i8vec4) VectorShuffle 406 404 4 5 6 3
-                              Store 405 407
+             377:   17(ivec4) Load 19(ballot)
+             378:  21(i8vec4) GroupNonUniformBitwiseOr 177 PartitionedReduceNV 376 377
+             379:     47(ptr) AccessChain 37(data) 374 39
+                              Store 379 378
+             380:      6(int) Load 8(invocation)
+             381:     41(ptr) AccessChain 37(data) 39 39 40
+             382:  20(int8_t) Load 381
+             383:   17(ivec4) Load 19(ballot)
+             384:  20(int8_t) GroupNonUniformBitwiseXor 177 PartitionedReduceNV 382 383
+             385:     41(ptr) AccessChain 37(data) 380 39 40
+                              Store 385 384
+             386:      6(int) Load 8(invocation)
+             387:     47(ptr) AccessChain 37(data) 45 39
+             388:  21(i8vec4) Load 387
+             389:  46(i8vec2) VectorShuffle 388 388 0 1
+             390:   17(ivec4) Load 19(ballot)
+             391:  46(i8vec2) GroupNonUniformBitwiseXor 177 PartitionedReduceNV 389 390
+             392:     41(ptr) AccessChain 37(data) 386 39 40
+             393:  20(int8_t) CompositeExtract 391 0
+                              Store 392 393
+             394:     41(ptr) AccessChain 37(data) 386 39 188
+             395:  20(int8_t) CompositeExtract 391 1
+                              Store 394 395
+             396:      6(int) Load 8(invocation)
+             397:     47(ptr) AccessChain 37(data) 52 39
+             398:  21(i8vec4) Load 397
+             399:  53(i8vec3) VectorShuffle 398 398 0 1 2
+             400:   17(ivec4) Load 19(ballot)
+             401:  53(i8vec3) GroupNonUniformBitwiseXor 177 PartitionedReduceNV 399 400
+             402:     41(ptr) AccessChain 37(data) 396 39 40
+             403:  20(int8_t) CompositeExtract 401 0
+                              Store 402 403
+             404:     41(ptr) AccessChain 37(data) 396 39 188
+             405:  20(int8_t) CompositeExtract 401 1
+                              Store 404 405
+             406:     41(ptr) AccessChain 37(data) 396 39 201
+             407:  20(int8_t) CompositeExtract 401 2
+                              Store 406 407
              408:      6(int) Load 8(invocation)
-             409:     67(ptr) AccessChain 37(data) 58 45
-             410:  23(i8vec4) Load 409
+             409:     47(ptr) AccessChain 37(data) 58 39
+             410:  21(i8vec4) Load 409
              411:   17(ivec4) Load 19(ballot)
-             412:  23(i8vec4) GroupNonUniformIAdd 177 PartitionedReduceNV 410 411
-             413:     67(ptr) AccessChain 37(data) 408 45
+             412:  21(i8vec4) GroupNonUniformBitwiseXor 177 PartitionedReduceNV 410 411
+             413:     47(ptr) AccessChain 37(data) 408 39
                               Store 413 412
              414:      6(int) Load 8(invocation)
              415:     62(ptr) AccessChain 37(data) 39 45 40
              416:  22(int8_t) Load 415
              417:   17(ivec4) Load 19(ballot)
-             418:  22(int8_t) GroupNonUniformIMul 177 PartitionedReduceNV 416 417
+             418:  22(int8_t) GroupNonUniformIAdd 177 PartitionedReduceNV 416 417
              419:     62(ptr) AccessChain 37(data) 414 45 40
                               Store 419 418
              420:      6(int) Load 8(invocation)
@@ -551,577 +567,614 @@
              422:  23(i8vec4) Load 421
              423:  66(i8vec2) VectorShuffle 422 422 0 1
              424:   17(ivec4) Load 19(ballot)
-             425:  66(i8vec2) GroupNonUniformIMul 177 PartitionedReduceNV 423 424
-             426:     67(ptr) AccessChain 37(data) 420 45
-             427:  23(i8vec4) Load 426
-             428:  23(i8vec4) VectorShuffle 427 425 4 5 2 3
-                              Store 426 428
-             429:      6(int) Load 8(invocation)
-             430:     67(ptr) AccessChain 37(data) 52 45
-             431:  23(i8vec4) Load 430
-             432:  72(i8vec3) VectorShuffle 431 431 0 1 2
-             433:   17(ivec4) Load 19(ballot)
-             434:  72(i8vec3) GroupNonUniformIMul 177 PartitionedReduceNV 432 433
-             435:     67(ptr) AccessChain 37(data) 429 45
-             436:  23(i8vec4) Load 435
-             437:  23(i8vec4) VectorShuffle 436 434 4 5 6 3
-                              Store 435 437
-             438:      6(int) Load 8(invocation)
-             439:     67(ptr) AccessChain 37(data) 58 45
-             440:  23(i8vec4) Load 439
-             441:   17(ivec4) Load 19(ballot)
-             442:  23(i8vec4) GroupNonUniformIMul 177 PartitionedReduceNV 440 441
-             443:     67(ptr) AccessChain 37(data) 438 45
-                              Store 443 442
-             444:      6(int) Load 8(invocation)
-             445:     62(ptr) AccessChain 37(data) 39 45 40
-             446:  22(int8_t) Load 445
-             447:   17(ivec4) Load 19(ballot)
-             448:  22(int8_t) GroupNonUniformUMin 177 PartitionedReduceNV 446 447
-             449:     62(ptr) AccessChain 37(data) 444 45 40
-                              Store 449 448
-             450:      6(int) Load 8(invocation)
-             451:     67(ptr) AccessChain 37(data) 45 45
-             452:  23(i8vec4) Load 451
-             453:  66(i8vec2) VectorShuffle 452 452 0 1
-             454:   17(ivec4) Load 19(ballot)
-             455:  66(i8vec2) GroupNonUniformUMin 177 PartitionedReduceNV 453 454
-             456:     67(ptr) AccessChain 37(data) 450 45
-             457:  23(i8vec4) Load 456
-             458:  23(i8vec4) VectorShuffle 457 455 4 5 2 3
-                              Store 456 458
-             459:      6(int) Load 8(invocation)
-             460:     67(ptr) AccessChain 37(data) 52 45
-             461:  23(i8vec4) Load 460
-             462:  72(i8vec3) VectorShuffle 461 461 0 1 2
-             463:   17(ivec4) Load 19(ballot)
-             464:  72(i8vec3) GroupNonUniformUMin 177 PartitionedReduceNV 462 463
-             465:     67(ptr) AccessChain 37(data) 459 45
+             425:  66(i8vec2) GroupNonUniformIAdd 177 PartitionedReduceNV 423 424
+             426:     62(ptr) AccessChain 37(data) 420 45 40
+             427:  22(int8_t) CompositeExtract 425 0
+                              Store 426 427
+             428:     62(ptr) AccessChain 37(data) 420 45 188
+             429:  22(int8_t) CompositeExtract 425 1
+                              Store 428 429
+             430:      6(int) Load 8(invocation)
+             431:     67(ptr) AccessChain 37(data) 52 45
+             432:  23(i8vec4) Load 431
+             433:  72(i8vec3) VectorShuffle 432 432 0 1 2
+             434:   17(ivec4) Load 19(ballot)
+             435:  72(i8vec3) GroupNonUniformIAdd 177 PartitionedReduceNV 433 434
+             436:     62(ptr) AccessChain 37(data) 430 45 40
+             437:  22(int8_t) CompositeExtract 435 0
+                              Store 436 437
+             438:     62(ptr) AccessChain 37(data) 430 45 188
+             439:  22(int8_t) CompositeExtract 435 1
+                              Store 438 439
+             440:     62(ptr) AccessChain 37(data) 430 45 201
+             441:  22(int8_t) CompositeExtract 435 2
+                              Store 440 441
+             442:      6(int) Load 8(invocation)
+             443:     67(ptr) AccessChain 37(data) 58 45
+             444:  23(i8vec4) Load 443
+             445:   17(ivec4) Load 19(ballot)
+             446:  23(i8vec4) GroupNonUniformIAdd 177 PartitionedReduceNV 444 445
+             447:     67(ptr) AccessChain 37(data) 442 45
+                              Store 447 446
+             448:      6(int) Load 8(invocation)
+             449:     62(ptr) AccessChain 37(data) 39 45 40
+             450:  22(int8_t) Load 449
+             451:   17(ivec4) Load 19(ballot)
+             452:  22(int8_t) GroupNonUniformIMul 177 PartitionedReduceNV 450 451
+             453:     62(ptr) AccessChain 37(data) 448 45 40
+                              Store 453 452
+             454:      6(int) Load 8(invocation)
+             455:     67(ptr) AccessChain 37(data) 45 45
+             456:  23(i8vec4) Load 455
+             457:  66(i8vec2) VectorShuffle 456 456 0 1
+             458:   17(ivec4) Load 19(ballot)
+             459:  66(i8vec2) GroupNonUniformIMul 177 PartitionedReduceNV 457 458
+             460:     62(ptr) AccessChain 37(data) 454 45 40
+             461:  22(int8_t) CompositeExtract 459 0
+                              Store 460 461
+             462:     62(ptr) AccessChain 37(data) 454 45 188
+             463:  22(int8_t) CompositeExtract 459 1
+                              Store 462 463
+             464:      6(int) Load 8(invocation)
+             465:     67(ptr) AccessChain 37(data) 52 45
              466:  23(i8vec4) Load 465
-             467:  23(i8vec4) VectorShuffle 466 464 4 5 6 3
-                              Store 465 467
-             468:      6(int) Load 8(invocation)
-             469:     67(ptr) AccessChain 37(data) 58 45
-             470:  23(i8vec4) Load 469
-             471:   17(ivec4) Load 19(ballot)
-             472:  23(i8vec4) GroupNonUniformUMin 177 PartitionedReduceNV 470 471
-             473:     67(ptr) AccessChain 37(data) 468 45
-                              Store 473 472
-             474:      6(int) Load 8(invocation)
-             475:     62(ptr) AccessChain 37(data) 39 45 40
-             476:  22(int8_t) Load 475
-             477:   17(ivec4) Load 19(ballot)
-             478:  22(int8_t) GroupNonUniformUMax 177 PartitionedReduceNV 476 477
-             479:     62(ptr) AccessChain 37(data) 474 45 40
-                              Store 479 478
-             480:      6(int) Load 8(invocation)
-             481:     67(ptr) AccessChain 37(data) 45 45
-             482:  23(i8vec4) Load 481
-             483:  66(i8vec2) VectorShuffle 482 482 0 1
-             484:   17(ivec4) Load 19(ballot)
-             485:  66(i8vec2) GroupNonUniformUMax 177 PartitionedReduceNV 483 484
-             486:     67(ptr) AccessChain 37(data) 480 45
-             487:  23(i8vec4) Load 486
-             488:  23(i8vec4) VectorShuffle 487 485 4 5 2 3
-                              Store 486 488
-             489:      6(int) Load 8(invocation)
-             490:     67(ptr) AccessChain 37(data) 52 45
-             491:  23(i8vec4) Load 490
-             492:  72(i8vec3) VectorShuffle 491 491 0 1 2
-             493:   17(ivec4) Load 19(ballot)
-             494:  72(i8vec3) GroupNonUniformUMax 177 PartitionedReduceNV 492 493
-             495:     67(ptr) AccessChain 37(data) 489 45
-             496:  23(i8vec4) Load 495
-             497:  23(i8vec4) VectorShuffle 496 494 4 5 6 3
-                              Store 495 497
+             467:  72(i8vec3) VectorShuffle 466 466 0 1 2
+             468:   17(ivec4) Load 19(ballot)
+             469:  72(i8vec3) GroupNonUniformIMul 177 PartitionedReduceNV 467 468
+             470:     62(ptr) AccessChain 37(data) 464 45 40
+             471:  22(int8_t) CompositeExtract 469 0
+                              Store 470 471
+             472:     62(ptr) AccessChain 37(data) 464 45 188
+             473:  22(int8_t) CompositeExtract 469 1
+                              Store 472 473
+             474:     62(ptr) AccessChain 37(data) 464 45 201
+             475:  22(int8_t) CompositeExtract 469 2
+                              Store 474 475
+             476:      6(int) Load 8(invocation)
+             477:     67(ptr) AccessChain 37(data) 58 45
+             478:  23(i8vec4) Load 477
+             479:   17(ivec4) Load 19(ballot)
+             480:  23(i8vec4) GroupNonUniformIMul 177 PartitionedReduceNV 478 479
+             481:     67(ptr) AccessChain 37(data) 476 45
+                              Store 481 480
+             482:      6(int) Load 8(invocation)
+             483:     62(ptr) AccessChain 37(data) 39 45 40
+             484:  22(int8_t) Load 483
+             485:   17(ivec4) Load 19(ballot)
+             486:  22(int8_t) GroupNonUniformUMin 177 PartitionedReduceNV 484 485
+             487:     62(ptr) AccessChain 37(data) 482 45 40
+                              Store 487 486
+             488:      6(int) Load 8(invocation)
+             489:     67(ptr) AccessChain 37(data) 45 45
+             490:  23(i8vec4) Load 489
+             491:  66(i8vec2) VectorShuffle 490 490 0 1
+             492:   17(ivec4) Load 19(ballot)
+             493:  66(i8vec2) GroupNonUniformUMin 177 PartitionedReduceNV 491 492
+             494:     62(ptr) AccessChain 37(data) 488 45 40
+             495:  22(int8_t) CompositeExtract 493 0
+                              Store 494 495
+             496:     62(ptr) AccessChain 37(data) 488 45 188
+             497:  22(int8_t) CompositeExtract 493 1
+                              Store 496 497
              498:      6(int) Load 8(invocation)
-             499:     67(ptr) AccessChain 37(data) 58 45
+             499:     67(ptr) AccessChain 37(data) 52 45
              500:  23(i8vec4) Load 499
-             501:   17(ivec4) Load 19(ballot)
-             502:  23(i8vec4) GroupNonUniformUMax 177 PartitionedReduceNV 500 501
-             503:     67(ptr) AccessChain 37(data) 498 45
-                              Store 503 502
-             504:      6(int) Load 8(invocation)
-             505:     62(ptr) AccessChain 37(data) 39 45 40
-             506:  22(int8_t) Load 505
-             507:   17(ivec4) Load 19(ballot)
-             508:  22(int8_t) GroupNonUniformBitwiseAnd 177 PartitionedReduceNV 506 507
-             509:     62(ptr) AccessChain 37(data) 504 45 40
-                              Store 509 508
+             501:  72(i8vec3) VectorShuffle 500 500 0 1 2
+             502:   17(ivec4) Load 19(ballot)
+             503:  72(i8vec3) GroupNonUniformUMin 177 PartitionedReduceNV 501 502
+             504:     62(ptr) AccessChain 37(data) 498 45 40
+             505:  22(int8_t) CompositeExtract 503 0
+                              Store 504 505
+             506:     62(ptr) AccessChain 37(data) 498 45 188
+             507:  22(int8_t) CompositeExtract 503 1
+                              Store 506 507
+             508:     62(ptr) AccessChain 37(data) 498 45 201
+             509:  22(int8_t) CompositeExtract 503 2
+                              Store 508 509
              510:      6(int) Load 8(invocation)
-             511:     67(ptr) AccessChain 37(data) 45 45
+             511:     67(ptr) AccessChain 37(data) 58 45
              512:  23(i8vec4) Load 511
-             513:  66(i8vec2) VectorShuffle 512 512 0 1
-             514:   17(ivec4) Load 19(ballot)
-             515:  66(i8vec2) GroupNonUniformBitwiseAnd 177 PartitionedReduceNV 513 514
-             516:     67(ptr) AccessChain 37(data) 510 45
-             517:  23(i8vec4) Load 516
-             518:  23(i8vec4) VectorShuffle 517 515 4 5 2 3
-                              Store 516 518
-             519:      6(int) Load 8(invocation)
-             520:     67(ptr) AccessChain 37(data) 52 45
-             521:  23(i8vec4) Load 520
-             522:  72(i8vec3) VectorShuffle 521 521 0 1 2
-             523:   17(ivec4) Load 19(ballot)
-             524:  72(i8vec3) GroupNonUniformBitwiseAnd 177 PartitionedReduceNV 522 523
-             525:     67(ptr) AccessChain 37(data) 519 45
-             526:  23(i8vec4) Load 525
-             527:  23(i8vec4) VectorShuffle 526 524 4 5 6 3
-                              Store 525 527
-             528:      6(int) Load 8(invocation)
-             529:     67(ptr) AccessChain 37(data) 58 45
-             530:  23(i8vec4) Load 529
-             531:   17(ivec4) Load 19(ballot)
-             532:  23(i8vec4) GroupNonUniformBitwiseAnd 177 PartitionedReduceNV 530 531
-             533:     67(ptr) AccessChain 37(data) 528 45
-                              Store 533 532
-             534:      6(int) Load 8(invocation)
-             535:     62(ptr) AccessChain 37(data) 39 45 40
-             536:  22(int8_t) Load 535
-             537:   17(ivec4) Load 19(ballot)
-             538:  22(int8_t) GroupNonUniformBitwiseOr 177 PartitionedReduceNV 536 537
-             539:     62(ptr) AccessChain 37(data) 534 45 40
-                              Store 539 538
-             540:      6(int) Load 8(invocation)
-             541:     67(ptr) AccessChain 37(data) 45 45
-             542:  23(i8vec4) Load 541
-             543:  66(i8vec2) VectorShuffle 542 542 0 1
-             544:   17(ivec4) Load 19(ballot)
-             545:  66(i8vec2) GroupNonUniformBitwiseOr 177 PartitionedReduceNV 543 544
-             546:     67(ptr) AccessChain 37(data) 540 45
-             547:  23(i8vec4) Load 546
-             548:  23(i8vec4) VectorShuffle 547 545 4 5 2 3
-                              Store 546 548
-             549:      6(int) Load 8(invocation)
-             550:     67(ptr) AccessChain 37(data) 52 45
-             551:  23(i8vec4) Load 550
-             552:  72(i8vec3) VectorShuffle 551 551 0 1 2
+             513:   17(ivec4) Load 19(ballot)
+             514:  23(i8vec4) GroupNonUniformUMin 177 PartitionedReduceNV 512 513
+             515:     67(ptr) AccessChain 37(data) 510 45
+                              Store 515 514
+             516:      6(int) Load 8(invocation)
+             517:     62(ptr) AccessChain 37(data) 39 45 40
+             518:  22(int8_t) Load 517
+             519:   17(ivec4) Load 19(ballot)
+             520:  22(int8_t) GroupNonUniformUMax 177 PartitionedReduceNV 518 519
+             521:     62(ptr) AccessChain 37(data) 516 45 40
+                              Store 521 520
+             522:      6(int) Load 8(invocation)
+             523:     67(ptr) AccessChain 37(data) 45 45
+             524:  23(i8vec4) Load 523
+             525:  66(i8vec2) VectorShuffle 524 524 0 1
+             526:   17(ivec4) Load 19(ballot)
+             527:  66(i8vec2) GroupNonUniformUMax 177 PartitionedReduceNV 525 526
+             528:     62(ptr) AccessChain 37(data) 522 45 40
+             529:  22(int8_t) CompositeExtract 527 0
+                              Store 528 529
+             530:     62(ptr) AccessChain 37(data) 522 45 188
+             531:  22(int8_t) CompositeExtract 527 1
+                              Store 530 531
+             532:      6(int) Load 8(invocation)
+             533:     67(ptr) AccessChain 37(data) 52 45
+             534:  23(i8vec4) Load 533
+             535:  72(i8vec3) VectorShuffle 534 534 0 1 2
+             536:   17(ivec4) Load 19(ballot)
+             537:  72(i8vec3) GroupNonUniformUMax 177 PartitionedReduceNV 535 536
+             538:     62(ptr) AccessChain 37(data) 532 45 40
+             539:  22(int8_t) CompositeExtract 537 0
+                              Store 538 539
+             540:     62(ptr) AccessChain 37(data) 532 45 188
+             541:  22(int8_t) CompositeExtract 537 1
+                              Store 540 541
+             542:     62(ptr) AccessChain 37(data) 532 45 201
+             543:  22(int8_t) CompositeExtract 537 2
+                              Store 542 543
+             544:      6(int) Load 8(invocation)
+             545:     67(ptr) AccessChain 37(data) 58 45
+             546:  23(i8vec4) Load 545
+             547:   17(ivec4) Load 19(ballot)
+             548:  23(i8vec4) GroupNonUniformUMax 177 PartitionedReduceNV 546 547
+             549:     67(ptr) AccessChain 37(data) 544 45
+                              Store 549 548
+             550:      6(int) Load 8(invocation)
+             551:     62(ptr) AccessChain 37(data) 39 45 40
+             552:  22(int8_t) Load 551
              553:   17(ivec4) Load 19(ballot)
-             554:  72(i8vec3) GroupNonUniformBitwiseOr 177 PartitionedReduceNV 552 553
-             555:     67(ptr) AccessChain 37(data) 549 45
-             556:  23(i8vec4) Load 555
-             557:  23(i8vec4) VectorShuffle 556 554 4 5 6 3
-                              Store 555 557
-             558:      6(int) Load 8(invocation)
-             559:     67(ptr) AccessChain 37(data) 58 45
-             560:  23(i8vec4) Load 559
-             561:   17(ivec4) Load 19(ballot)
-             562:  23(i8vec4) GroupNonUniformBitwiseOr 177 PartitionedReduceNV 560 561
-             563:     67(ptr) AccessChain 37(data) 558 45
-                              Store 563 562
-             564:      6(int) Load 8(invocation)
-             565:     62(ptr) AccessChain 37(data) 39 45 40
-             566:  22(int8_t) Load 565
-             567:   17(ivec4) Load 19(ballot)
-             568:  22(int8_t) GroupNonUniformBitwiseXor 177 PartitionedReduceNV 566 567
-             569:     62(ptr) AccessChain 37(data) 564 45 40
-                              Store 569 568
-             570:      6(int) Load 8(invocation)
-             571:     67(ptr) AccessChain 37(data) 45 45
-             572:  23(i8vec4) Load 571
-             573:  66(i8vec2) VectorShuffle 572 572 0 1
-             574:   17(ivec4) Load 19(ballot)
-             575:  66(i8vec2) GroupNonUniformBitwiseXor 177 PartitionedReduceNV 573 574
-             576:     67(ptr) AccessChain 37(data) 570 45
-             577:  23(i8vec4) Load 576
-             578:  23(i8vec4) VectorShuffle 577 575 4 5 2 3
-                              Store 576 578
-             579:      6(int) Load 8(invocation)
-             580:     67(ptr) AccessChain 37(data) 52 45
-             581:  23(i8vec4) Load 580
-             582:  72(i8vec3) VectorShuffle 581 581 0 1 2
-             583:   17(ivec4) Load 19(ballot)
-             584:  72(i8vec3) GroupNonUniformBitwiseXor 177 PartitionedReduceNV 582 583
-             585:     67(ptr) AccessChain 37(data) 579 45
-             586:  23(i8vec4) Load 585
-             587:  23(i8vec4) VectorShuffle 586 584 4 5 6 3
-                              Store 585 587
-             588:      6(int) Load 8(invocation)
-             589:     67(ptr) AccessChain 37(data) 58 45
-             590:  23(i8vec4) Load 589
-             591:   17(ivec4) Load 19(ballot)
-             592:  23(i8vec4) GroupNonUniformBitwiseXor 177 PartitionedReduceNV 590 591
-             593:     67(ptr) AccessChain 37(data) 588 45
-                              Store 593 592
-             594:      6(int) Load 8(invocation)
-             595:     80(ptr) AccessChain 37(data) 39 52 40
-             596: 24(int16_t) Load 595
-             597:   17(ivec4) Load 19(ballot)
-             598: 24(int16_t) GroupNonUniformIAdd 177 PartitionedReduceNV 596 597
-             599:     80(ptr) AccessChain 37(data) 594 52 40
-                              Store 599 598
+             554:  22(int8_t) GroupNonUniformBitwiseAnd 177 PartitionedReduceNV 552 553
+             555:     62(ptr) AccessChain 37(data) 550 45 40
+                              Store 555 554
+             556:      6(int) Load 8(invocation)
+             557:     67(ptr) AccessChain 37(data) 45 45
+             558:  23(i8vec4) Load 557
+             559:  66(i8vec2) VectorShuffle 558 558 0 1
+             560:   17(ivec4) Load 19(ballot)
+             561:  66(i8vec2) GroupNonUniformBitwiseAnd 177 PartitionedReduceNV 559 560
+             562:     62(ptr) AccessChain 37(data) 556 45 40
+             563:  22(int8_t) CompositeExtract 561 0
+                              Store 562 563
+             564:     62(ptr) AccessChain 37(data) 556 45 188
+             565:  22(int8_t) CompositeExtract 561 1
+                              Store 564 565
+             566:      6(int) Load 8(invocation)
+             567:     67(ptr) AccessChain 37(data) 52 45
+             568:  23(i8vec4) Load 567
+             569:  72(i8vec3) VectorShuffle 568 568 0 1 2
+             570:   17(ivec4) Load 19(ballot)
+             571:  72(i8vec3) GroupNonUniformBitwiseAnd 177 PartitionedReduceNV 569 570
+             572:     62(ptr) AccessChain 37(data) 566 45 40
+             573:  22(int8_t) CompositeExtract 571 0
+                              Store 572 573
+             574:     62(ptr) AccessChain 37(data) 566 45 188
+             575:  22(int8_t) CompositeExtract 571 1
+                              Store 574 575
+             576:     62(ptr) AccessChain 37(data) 566 45 201
+             577:  22(int8_t) CompositeExtract 571 2
+                              Store 576 577
+             578:      6(int) Load 8(invocation)
+             579:     67(ptr) AccessChain 37(data) 58 45
+             580:  23(i8vec4) Load 579
+             581:   17(ivec4) Load 19(ballot)
+             582:  23(i8vec4) GroupNonUniformBitwiseAnd 177 PartitionedReduceNV 580 581
+             583:     67(ptr) AccessChain 37(data) 578 45
+                              Store 583 582
+             584:      6(int) Load 8(invocation)
+             585:     62(ptr) AccessChain 37(data) 39 45 40
+             586:  22(int8_t) Load 585
+             587:   17(ivec4) Load 19(ballot)
+             588:  22(int8_t) GroupNonUniformBitwiseOr 177 PartitionedReduceNV 586 587
+             589:     62(ptr) AccessChain 37(data) 584 45 40
+                              Store 589 588
+             590:      6(int) Load 8(invocation)
+             591:     67(ptr) AccessChain 37(data) 45 45
+             592:  23(i8vec4) Load 591
+             593:  66(i8vec2) VectorShuffle 592 592 0 1
+             594:   17(ivec4) Load 19(ballot)
+             595:  66(i8vec2) GroupNonUniformBitwiseOr 177 PartitionedReduceNV 593 594
+             596:     62(ptr) AccessChain 37(data) 590 45 40
+             597:  22(int8_t) CompositeExtract 595 0
+                              Store 596 597
+             598:     62(ptr) AccessChain 37(data) 590 45 188
+             599:  22(int8_t) CompositeExtract 595 1
+                              Store 598 599
              600:      6(int) Load 8(invocation)
-             601:     85(ptr) AccessChain 37(data) 45 52
-             602: 25(i16vec4) Load 601
-             603: 84(i16vec2) VectorShuffle 602 602 0 1
+             601:     67(ptr) AccessChain 37(data) 52 45
+             602:  23(i8vec4) Load 601
+             603:  72(i8vec3) VectorShuffle 602 602 0 1 2
              604:   17(ivec4) Load 19(ballot)
-             605: 84(i16vec2) GroupNonUniformIAdd 177 PartitionedReduceNV 603 604
-             606:     85(ptr) AccessChain 37(data) 600 52
-             607: 25(i16vec4) Load 606
-             608: 25(i16vec4) VectorShuffle 607 605 4 5 2 3
-                              Store 606 608
-             609:      6(int) Load 8(invocation)
-             610:     85(ptr) AccessChain 37(data) 52 52
-             611: 25(i16vec4) Load 610
-             612: 90(i16vec3) VectorShuffle 611 611 0 1 2
-             613:   17(ivec4) Load 19(ballot)
-             614: 90(i16vec3) GroupNonUniformIAdd 177 PartitionedReduceNV 612 613
-             615:     85(ptr) AccessChain 37(data) 609 52
-             616: 25(i16vec4) Load 615
-             617: 25(i16vec4) VectorShuffle 616 614 4 5 6 3
-                              Store 615 617
+             605:  72(i8vec3) GroupNonUniformBitwiseOr 177 PartitionedReduceNV 603 604
+             606:     62(ptr) AccessChain 37(data) 600 45 40
+             607:  22(int8_t) CompositeExtract 605 0
+                              Store 606 607
+             608:     62(ptr) AccessChain 37(data) 600 45 188
+             609:  22(int8_t) CompositeExtract 605 1
+                              Store 608 609
+             610:     62(ptr) AccessChain 37(data) 600 45 201
+             611:  22(int8_t) CompositeExtract 605 2
+                              Store 610 611
+             612:      6(int) Load 8(invocation)
+             613:     67(ptr) AccessChain 37(data) 58 45
+             614:  23(i8vec4) Load 613
+             615:   17(ivec4) Load 19(ballot)
+             616:  23(i8vec4) GroupNonUniformBitwiseOr 177 PartitionedReduceNV 614 615
+             617:     67(ptr) AccessChain 37(data) 612 45
+                              Store 617 616
              618:      6(int) Load 8(invocation)
-             619:     85(ptr) AccessChain 37(data) 58 52
-             620: 25(i16vec4) Load 619
+             619:     62(ptr) AccessChain 37(data) 39 45 40
+             620:  22(int8_t) Load 619
              621:   17(ivec4) Load 19(ballot)
-             622: 25(i16vec4) GroupNonUniformIAdd 177 PartitionedReduceNV 620 621
-             623:     85(ptr) AccessChain 37(data) 618 52
+             622:  22(int8_t) GroupNonUniformBitwiseXor 177 PartitionedReduceNV 620 621
+             623:     62(ptr) AccessChain 37(data) 618 45 40
                               Store 623 622
              624:      6(int) Load 8(invocation)
-             625:     80(ptr) AccessChain 37(data) 39 52 40
-             626: 24(int16_t) Load 625
-             627:   17(ivec4) Load 19(ballot)
-             628: 24(int16_t) GroupNonUniformIMul 177 PartitionedReduceNV 626 627
-             629:     80(ptr) AccessChain 37(data) 624 52 40
-                              Store 629 628
-             630:      6(int) Load 8(invocation)
-             631:     85(ptr) AccessChain 37(data) 45 52
-             632: 25(i16vec4) Load 631
-             633: 84(i16vec2) VectorShuffle 632 632 0 1
-             634:   17(ivec4) Load 19(ballot)
-             635: 84(i16vec2) GroupNonUniformIMul 177 PartitionedReduceNV 633 634
-             636:     85(ptr) AccessChain 37(data) 630 52
-             637: 25(i16vec4) Load 636
-             638: 25(i16vec4) VectorShuffle 637 635 4 5 2 3
-                              Store 636 638
-             639:      6(int) Load 8(invocation)
-             640:     85(ptr) AccessChain 37(data) 52 52
-             641: 25(i16vec4) Load 640
-             642: 90(i16vec3) VectorShuffle 641 641 0 1 2
-             643:   17(ivec4) Load 19(ballot)
-             644: 90(i16vec3) GroupNonUniformIMul 177 PartitionedReduceNV 642 643
-             645:     85(ptr) AccessChain 37(data) 639 52
-             646: 25(i16vec4) Load 645
-             647: 25(i16vec4) VectorShuffle 646 644 4 5 6 3
-                              Store 645 647
-             648:      6(int) Load 8(invocation)
-             649:     85(ptr) AccessChain 37(data) 58 52
-             650: 25(i16vec4) Load 649
-             651:   17(ivec4) Load 19(ballot)
-             652: 25(i16vec4) GroupNonUniformIMul 177 PartitionedReduceNV 650 651
-             653:     85(ptr) AccessChain 37(data) 648 52
-                              Store 653 652
-             654:      6(int) Load 8(invocation)
-             655:     80(ptr) AccessChain 37(data) 39 52 40
-             656: 24(int16_t) Load 655
-             657:   17(ivec4) Load 19(ballot)
-             658: 24(int16_t) GroupNonUniformSMin 177 PartitionedReduceNV 656 657
-             659:     80(ptr) AccessChain 37(data) 654 52 40
-                              Store 659 658
-             660:      6(int) Load 8(invocation)
-             661:     85(ptr) AccessChain 37(data) 45 52
-             662: 25(i16vec4) Load 661
-             663: 84(i16vec2) VectorShuffle 662 662 0 1
-             664:   17(ivec4) Load 19(ballot)
-             665: 84(i16vec2) GroupNonUniformSMin 177 PartitionedReduceNV 663 664
-             666:     85(ptr) AccessChain 37(data) 660 52
-             667: 25(i16vec4) Load 666
-             668: 25(i16vec4) VectorShuffle 667 665 4 5 2 3
-                              Store 666 668
-             669:      6(int) Load 8(invocation)
-             670:     85(ptr) AccessChain 37(data) 52 52
-             671: 25(i16vec4) Load 670
-             672: 90(i16vec3) VectorShuffle 671 671 0 1 2
-             673:   17(ivec4) Load 19(ballot)
-             674: 90(i16vec3) GroupNonUniformSMin 177 PartitionedReduceNV 672 673
-             675:     85(ptr) AccessChain 37(data) 669 52
-             676: 25(i16vec4) Load 675
-             677: 25(i16vec4) VectorShuffle 676 674 4 5 6 3
-                              Store 675 677
-             678:      6(int) Load 8(invocation)
-             679:     85(ptr) AccessChain 37(data) 58 52
-             680: 25(i16vec4) Load 679
-             681:   17(ivec4) Load 19(ballot)
-             682: 25(i16vec4) GroupNonUniformSMin 177 PartitionedReduceNV 680 681
-             683:     85(ptr) AccessChain 37(data) 678 52
-                              Store 683 682
-             684:      6(int) Load 8(invocation)
-             685:     80(ptr) AccessChain 37(data) 39 52 40
-             686: 24(int16_t) Load 685
-             687:   17(ivec4) Load 19(ballot)
-             688: 24(int16_t) GroupNonUniformSMax 177 PartitionedReduceNV 686 687
-             689:     80(ptr) AccessChain 37(data) 684 52 40
-                              Store 689 688
-             690:      6(int) Load 8(invocation)
-             691:     85(ptr) AccessChain 37(data) 45 52
-             692: 25(i16vec4) Load 691
-             693: 84(i16vec2) VectorShuffle 692 692 0 1
-             694:   17(ivec4) Load 19(ballot)
-             695: 84(i16vec2) GroupNonUniformSMax 177 PartitionedReduceNV 693 694
-             696:     85(ptr) AccessChain 37(data) 690 52
-             697: 25(i16vec4) Load 696
-             698: 25(i16vec4) VectorShuffle 697 695 4 5 2 3
-                              Store 696 698
-             699:      6(int) Load 8(invocation)
-             700:     85(ptr) AccessChain 37(data) 52 52
-             701: 25(i16vec4) Load 700
-             702: 90(i16vec3) VectorShuffle 701 701 0 1 2
-             703:   17(ivec4) Load 19(ballot)
-             704: 90(i16vec3) GroupNonUniformSMax 177 PartitionedReduceNV 702 703
-             705:     85(ptr) AccessChain 37(data) 699 52
-             706: 25(i16vec4) Load 705
-             707: 25(i16vec4) VectorShuffle 706 704 4 5 6 3
-                              Store 705 707
-             708:      6(int) Load 8(invocation)
-             709:     85(ptr) AccessChain 37(data) 58 52
-             710: 25(i16vec4) Load 709
-             711:   17(ivec4) Load 19(ballot)
-             712: 25(i16vec4) GroupNonUniformSMax 177 PartitionedReduceNV 710 711
-             713:     85(ptr) AccessChain 37(data) 708 52
-                              Store 713 712
+             625:     67(ptr) AccessChain 37(data) 45 45
+             626:  23(i8vec4) Load 625
+             627:  66(i8vec2) VectorShuffle 626 626 0 1
+             628:   17(ivec4) Load 19(ballot)
+             629:  66(i8vec2) GroupNonUniformBitwiseXor 177 PartitionedReduceNV 627 628
+             630:     62(ptr) AccessChain 37(data) 624 45 40
+             631:  22(int8_t) CompositeExtract 629 0
+                              Store 630 631
+             632:     62(ptr) AccessChain 37(data) 624 45 188
+             633:  22(int8_t) CompositeExtract 629 1
+                              Store 632 633
+             634:      6(int) Load 8(invocation)
+             635:     67(ptr) AccessChain 37(data) 52 45
+             636:  23(i8vec4) Load 635
+             637:  72(i8vec3) VectorShuffle 636 636 0 1 2
+             638:   17(ivec4) Load 19(ballot)
+             639:  72(i8vec3) GroupNonUniformBitwiseXor 177 PartitionedReduceNV 637 638
+             640:     62(ptr) AccessChain 37(data) 634 45 40
+             641:  22(int8_t) CompositeExtract 639 0
+                              Store 640 641
+             642:     62(ptr) AccessChain 37(data) 634 45 188
+             643:  22(int8_t) CompositeExtract 639 1
+                              Store 642 643
+             644:     62(ptr) AccessChain 37(data) 634 45 201
+             645:  22(int8_t) CompositeExtract 639 2
+                              Store 644 645
+             646:      6(int) Load 8(invocation)
+             647:     67(ptr) AccessChain 37(data) 58 45
+             648:  23(i8vec4) Load 647
+             649:   17(ivec4) Load 19(ballot)
+             650:  23(i8vec4) GroupNonUniformBitwiseXor 177 PartitionedReduceNV 648 649
+             651:     67(ptr) AccessChain 37(data) 646 45
+                              Store 651 650
+             652:      6(int) Load 8(invocation)
+             653:     80(ptr) AccessChain 37(data) 39 52 40
+             654: 24(int16_t) Load 653
+             655:   17(ivec4) Load 19(ballot)
+             656: 24(int16_t) GroupNonUniformIAdd 177 PartitionedReduceNV 654 655
+             657:     80(ptr) AccessChain 37(data) 652 52 40
+                              Store 657 656
+             658:      6(int) Load 8(invocation)
+             659:     85(ptr) AccessChain 37(data) 45 52
+             660: 25(i16vec4) Load 659
+             661: 84(i16vec2) VectorShuffle 660 660 0 1
+             662:   17(ivec4) Load 19(ballot)
+             663: 84(i16vec2) GroupNonUniformIAdd 177 PartitionedReduceNV 661 662
+             664:     80(ptr) AccessChain 37(data) 658 52 40
+             665: 24(int16_t) CompositeExtract 663 0
+                              Store 664 665
+             666:     80(ptr) AccessChain 37(data) 658 52 188
+             667: 24(int16_t) CompositeExtract 663 1
+                              Store 666 667
+             668:      6(int) Load 8(invocation)
+             669:     85(ptr) AccessChain 37(data) 52 52
+             670: 25(i16vec4) Load 669
+             671: 90(i16vec3) VectorShuffle 670 670 0 1 2
+             672:   17(ivec4) Load 19(ballot)
+             673: 90(i16vec3) GroupNonUniformIAdd 177 PartitionedReduceNV 671 672
+             674:     80(ptr) AccessChain 37(data) 668 52 40
+             675: 24(int16_t) CompositeExtract 673 0
+                              Store 674 675
+             676:     80(ptr) AccessChain 37(data) 668 52 188
+             677: 24(int16_t) CompositeExtract 673 1
+                              Store 676 677
+             678:     80(ptr) AccessChain 37(data) 668 52 201
+             679: 24(int16_t) CompositeExtract 673 2
+                              Store 678 679
+             680:      6(int) Load 8(invocation)
+             681:     85(ptr) AccessChain 37(data) 58 52
+             682: 25(i16vec4) Load 681
+             683:   17(ivec4) Load 19(ballot)
+             684: 25(i16vec4) GroupNonUniformIAdd 177 PartitionedReduceNV 682 683
+             685:     85(ptr) AccessChain 37(data) 680 52
+                              Store 685 684
+             686:      6(int) Load 8(invocation)
+             687:     80(ptr) AccessChain 37(data) 39 52 40
+             688: 24(int16_t) Load 687
+             689:   17(ivec4) Load 19(ballot)
+             690: 24(int16_t) GroupNonUniformIMul 177 PartitionedReduceNV 688 689
+             691:     80(ptr) AccessChain 37(data) 686 52 40
+                              Store 691 690
+             692:      6(int) Load 8(invocation)
+             693:     85(ptr) AccessChain 37(data) 45 52
+             694: 25(i16vec4) Load 693
+             695: 84(i16vec2) VectorShuffle 694 694 0 1
+             696:   17(ivec4) Load 19(ballot)
+             697: 84(i16vec2) GroupNonUniformIMul 177 PartitionedReduceNV 695 696
+             698:     80(ptr) AccessChain 37(data) 692 52 40
+             699: 24(int16_t) CompositeExtract 697 0
+                              Store 698 699
+             700:     80(ptr) AccessChain 37(data) 692 52 188
+             701: 24(int16_t) CompositeExtract 697 1
+                              Store 700 701
+             702:      6(int) Load 8(invocation)
+             703:     85(ptr) AccessChain 37(data) 52 52
+             704: 25(i16vec4) Load 703
+             705: 90(i16vec3) VectorShuffle 704 704 0 1 2
+             706:   17(ivec4) Load 19(ballot)
+             707: 90(i16vec3) GroupNonUniformIMul 177 PartitionedReduceNV 705 706
+             708:     80(ptr) AccessChain 37(data) 702 52 40
+             709: 24(int16_t) CompositeExtract 707 0
+                              Store 708 709
+             710:     80(ptr) AccessChain 37(data) 702 52 188
+             711: 24(int16_t) CompositeExtract 707 1
+                              Store 710 711
+             712:     80(ptr) AccessChain 37(data) 702 52 201
+             713: 24(int16_t) CompositeExtract 707 2
+                              Store 712 713
              714:      6(int) Load 8(invocation)
-             715:     80(ptr) AccessChain 37(data) 39 52 40
-             716: 24(int16_t) Load 715
+             715:     85(ptr) AccessChain 37(data) 58 52
+             716: 25(i16vec4) Load 715
              717:   17(ivec4) Load 19(ballot)
-             718: 24(int16_t) GroupNonUniformBitwiseAnd 177 PartitionedReduceNV 716 717
-             719:     80(ptr) AccessChain 37(data) 714 52 40
+             718: 25(i16vec4) GroupNonUniformIMul 177 PartitionedReduceNV 716 717
+             719:     85(ptr) AccessChain 37(data) 714 52
                               Store 719 718
              720:      6(int) Load 8(invocation)
-             721:     85(ptr) AccessChain 37(data) 45 52
-             722: 25(i16vec4) Load 721
-             723: 84(i16vec2) VectorShuffle 722 722 0 1
-             724:   17(ivec4) Load 19(ballot)
-             725: 84(i16vec2) GroupNonUniformBitwiseAnd 177 PartitionedReduceNV 723 724
-             726:     85(ptr) AccessChain 37(data) 720 52
-             727: 25(i16vec4) Load 726
-             728: 25(i16vec4) VectorShuffle 727 725 4 5 2 3
-                              Store 726 728
-             729:      6(int) Load 8(invocation)
-             730:     85(ptr) AccessChain 37(data) 52 52
-             731: 25(i16vec4) Load 730
-             732: 90(i16vec3) VectorShuffle 731 731 0 1 2
-             733:   17(ivec4) Load 19(ballot)
-             734: 90(i16vec3) GroupNonUniformBitwiseAnd 177 PartitionedReduceNV 732 733
-             735:     85(ptr) AccessChain 37(data) 729 52
-             736: 25(i16vec4) Load 735
-             737: 25(i16vec4) VectorShuffle 736 734 4 5 6 3
-                              Store 735 737
-             738:      6(int) Load 8(invocation)
-             739:     85(ptr) AccessChain 37(data) 58 52
-             740: 25(i16vec4) Load 739
-             741:   17(ivec4) Load 19(ballot)
-             742: 25(i16vec4) GroupNonUniformBitwiseAnd 177 PartitionedReduceNV 740 741
-             743:     85(ptr) AccessChain 37(data) 738 52
-                              Store 743 742
-             744:      6(int) Load 8(invocation)
-             745:     80(ptr) AccessChain 37(data) 39 52 40
-             746: 24(int16_t) Load 745
-             747:   17(ivec4) Load 19(ballot)
-             748: 24(int16_t) GroupNonUniformBitwiseOr 177 PartitionedReduceNV 746 747
-             749:     80(ptr) AccessChain 37(data) 744 52 40
-                              Store 749 748
-             750:      6(int) Load 8(invocation)
-             751:     85(ptr) AccessChain 37(data) 45 52
-             752: 25(i16vec4) Load 751
-             753: 84(i16vec2) VectorShuffle 752 752 0 1
-             754:   17(ivec4) Load 19(ballot)
-             755: 84(i16vec2) GroupNonUniformBitwiseOr 177 PartitionedReduceNV 753 754
-             756:     85(ptr) AccessChain 37(data) 750 52
-             757: 25(i16vec4) Load 756
-             758: 25(i16vec4) VectorShuffle 757 755 4 5 2 3
-                              Store 756 758
-             759:      6(int) Load 8(invocation)
-             760:     85(ptr) AccessChain 37(data) 52 52
-             761: 25(i16vec4) Load 760
-             762: 90(i16vec3) VectorShuffle 761 761 0 1 2
-             763:   17(ivec4) Load 19(ballot)
-             764: 90(i16vec3) GroupNonUniformBitwiseOr 177 PartitionedReduceNV 762 763
-             765:     85(ptr) AccessChain 37(data) 759 52
-             766: 25(i16vec4) Load 765
-             767: 25(i16vec4) VectorShuffle 766 764 4 5 6 3
-                              Store 765 767
-             768:      6(int) Load 8(invocation)
-             769:     85(ptr) AccessChain 37(data) 58 52
-             770: 25(i16vec4) Load 769
-             771:   17(ivec4) Load 19(ballot)
-             772: 25(i16vec4) GroupNonUniformBitwiseOr 177 PartitionedReduceNV 770 771
-             773:     85(ptr) AccessChain 37(data) 768 52
-                              Store 773 772
-             774:      6(int) Load 8(invocation)
-             775:     80(ptr) AccessChain 37(data) 39 52 40
-             776: 24(int16_t) Load 775
-             777:   17(ivec4) Load 19(ballot)
-             778: 24(int16_t) GroupNonUniformBitwiseXor 177 PartitionedReduceNV 776 777
-             779:     80(ptr) AccessChain 37(data) 774 52 40
-                              Store 779 778
-             780:      6(int) Load 8(invocation)
-             781:     85(ptr) AccessChain 37(data) 45 52
-             782: 25(i16vec4) Load 781
-             783: 84(i16vec2) VectorShuffle 782 782 0 1
-             784:   17(ivec4) Load 19(ballot)
-             785: 84(i16vec2) GroupNonUniformBitwiseXor 177 PartitionedReduceNV 783 784
-             786:     85(ptr) AccessChain 37(data) 780 52
-             787: 25(i16vec4) Load 786
-             788: 25(i16vec4) VectorShuffle 787 785 4 5 2 3
-                              Store 786 788
-             789:      6(int) Load 8(invocation)
-             790:     85(ptr) AccessChain 37(data) 52 52
-             791: 25(i16vec4) Load 790
-             792: 90(i16vec3) VectorShuffle 791 791 0 1 2
-             793:   17(ivec4) Load 19(ballot)
-             794: 90(i16vec3) GroupNonUniformBitwiseXor 177 PartitionedReduceNV 792 793
-             795:     85(ptr) AccessChain 37(data) 789 52
+             721:     80(ptr) AccessChain 37(data) 39 52 40
+             722: 24(int16_t) Load 721
+             723:   17(ivec4) Load 19(ballot)
+             724: 24(int16_t) GroupNonUniformSMin 177 PartitionedReduceNV 722 723
+             725:     80(ptr) AccessChain 37(data) 720 52 40
+                              Store 725 724
+             726:      6(int) Load 8(invocation)
+             727:     85(ptr) AccessChain 37(data) 45 52
+             728: 25(i16vec4) Load 727
+             729: 84(i16vec2) VectorShuffle 728 728 0 1
+             730:   17(ivec4) Load 19(ballot)
+             731: 84(i16vec2) GroupNonUniformSMin 177 PartitionedReduceNV 729 730
+             732:     80(ptr) AccessChain 37(data) 726 52 40
+             733: 24(int16_t) CompositeExtract 731 0
+                              Store 732 733
+             734:     80(ptr) AccessChain 37(data) 726 52 188
+             735: 24(int16_t) CompositeExtract 731 1
+                              Store 734 735
+             736:      6(int) Load 8(invocation)
+             737:     85(ptr) AccessChain 37(data) 52 52
+             738: 25(i16vec4) Load 737
+             739: 90(i16vec3) VectorShuffle 738 738 0 1 2
+             740:   17(ivec4) Load 19(ballot)
+             741: 90(i16vec3) GroupNonUniformSMin 177 PartitionedReduceNV 739 740
+             742:     80(ptr) AccessChain 37(data) 736 52 40
+             743: 24(int16_t) CompositeExtract 741 0
+                              Store 742 743
+             744:     80(ptr) AccessChain 37(data) 736 52 188
+             745: 24(int16_t) CompositeExtract 741 1
+                              Store 744 745
+             746:     80(ptr) AccessChain 37(data) 736 52 201
+             747: 24(int16_t) CompositeExtract 741 2
+                              Store 746 747
+             748:      6(int) Load 8(invocation)
+             749:     85(ptr) AccessChain 37(data) 58 52
+             750: 25(i16vec4) Load 749
+             751:   17(ivec4) Load 19(ballot)
+             752: 25(i16vec4) GroupNonUniformSMin 177 PartitionedReduceNV 750 751
+             753:     85(ptr) AccessChain 37(data) 748 52
+                              Store 753 752
+             754:      6(int) Load 8(invocation)
+             755:     80(ptr) AccessChain 37(data) 39 52 40
+             756: 24(int16_t) Load 755
+             757:   17(ivec4) Load 19(ballot)
+             758: 24(int16_t) GroupNonUniformSMax 177 PartitionedReduceNV 756 757
+             759:     80(ptr) AccessChain 37(data) 754 52 40
+                              Store 759 758
+             760:      6(int) Load 8(invocation)
+             761:     85(ptr) AccessChain 37(data) 45 52
+             762: 25(i16vec4) Load 761
+             763: 84(i16vec2) VectorShuffle 762 762 0 1
+             764:   17(ivec4) Load 19(ballot)
+             765: 84(i16vec2) GroupNonUniformSMax 177 PartitionedReduceNV 763 764
+             766:     80(ptr) AccessChain 37(data) 760 52 40
+             767: 24(int16_t) CompositeExtract 765 0
+                              Store 766 767
+             768:     80(ptr) AccessChain 37(data) 760 52 188
+             769: 24(int16_t) CompositeExtract 765 1
+                              Store 768 769
+             770:      6(int) Load 8(invocation)
+             771:     85(ptr) AccessChain 37(data) 52 52
+             772: 25(i16vec4) Load 771
+             773: 90(i16vec3) VectorShuffle 772 772 0 1 2
+             774:   17(ivec4) Load 19(ballot)
+             775: 90(i16vec3) GroupNonUniformSMax 177 PartitionedReduceNV 773 774
+             776:     80(ptr) AccessChain 37(data) 770 52 40
+             777: 24(int16_t) CompositeExtract 775 0
+                              Store 776 777
+             778:     80(ptr) AccessChain 37(data) 770 52 188
+             779: 24(int16_t) CompositeExtract 775 1
+                              Store 778 779
+             780:     80(ptr) AccessChain 37(data) 770 52 201
+             781: 24(int16_t) CompositeExtract 775 2
+                              Store 780 781
+             782:      6(int) Load 8(invocation)
+             783:     85(ptr) AccessChain 37(data) 58 52
+             784: 25(i16vec4) Load 783
+             785:   17(ivec4) Load 19(ballot)
+             786: 25(i16vec4) GroupNonUniformSMax 177 PartitionedReduceNV 784 785
+             787:     85(ptr) AccessChain 37(data) 782 52
+                              Store 787 786
+             788:      6(int) Load 8(invocation)
+             789:     80(ptr) AccessChain 37(data) 39 52 40
+             790: 24(int16_t) Load 789
+             791:   17(ivec4) Load 19(ballot)
+             792: 24(int16_t) GroupNonUniformBitwiseAnd 177 PartitionedReduceNV 790 791
+             793:     80(ptr) AccessChain 37(data) 788 52 40
+                              Store 793 792
+             794:      6(int) Load 8(invocation)
+             795:     85(ptr) AccessChain 37(data) 45 52
              796: 25(i16vec4) Load 795
-             797: 25(i16vec4) VectorShuffle 796 794 4 5 6 3
-                              Store 795 797
-             798:      6(int) Load 8(invocation)
-             799:     85(ptr) AccessChain 37(data) 58 52
-             800: 25(i16vec4) Load 799
-             801:   17(ivec4) Load 19(ballot)
-             802: 25(i16vec4) GroupNonUniformBitwiseXor 177 PartitionedReduceNV 800 801
-             803:     85(ptr) AccessChain 37(data) 798 52
-                              Store 803 802
+             797: 84(i16vec2) VectorShuffle 796 796 0 1
+             798:   17(ivec4) Load 19(ballot)
+             799: 84(i16vec2) GroupNonUniformBitwiseAnd 177 PartitionedReduceNV 797 798
+             800:     80(ptr) AccessChain 37(data) 794 52 40
+             801: 24(int16_t) CompositeExtract 799 0
+                              Store 800 801
+             802:     80(ptr) AccessChain 37(data) 794 52 188
+             803: 24(int16_t) CompositeExtract 799 1
+                              Store 802 803
              804:      6(int) Load 8(invocation)
-             805:     98(ptr) AccessChain 37(data) 39 58 40
-             806: 26(int16_t) Load 805
-             807:   17(ivec4) Load 19(ballot)
-             808: 26(int16_t) GroupNonUniformIAdd 177 PartitionedReduceNV 806 807
-             809:     98(ptr) AccessChain 37(data) 804 58 40
-                              Store 809 808
-             810:      6(int) Load 8(invocation)
-             811:    103(ptr) AccessChain 37(data) 45 58
-             812: 27(i16vec4) Load 811
-             813:102(i16vec2) VectorShuffle 812 812 0 1
-             814:   17(ivec4) Load 19(ballot)
-             815:102(i16vec2) GroupNonUniformIAdd 177 PartitionedReduceNV 813 814
-             816:    103(ptr) AccessChain 37(data) 810 58
-             817: 27(i16vec4) Load 816
-             818: 27(i16vec4) VectorShuffle 817 815 4 5 2 3
-                              Store 816 818
-             819:      6(int) Load 8(invocation)
-             820:    103(ptr) AccessChain 37(data) 52 58
-             821: 27(i16vec4) Load 820
-             822:108(i16vec3) VectorShuffle 821 821 0 1 2
-             823:   17(ivec4) Load 19(ballot)
-             824:108(i16vec3) GroupNonUniformIAdd 177 PartitionedReduceNV 822 823
-             825:    103(ptr) AccessChain 37(data) 819 58
-             826: 27(i16vec4) Load 825
-             827: 27(i16vec4) VectorShuffle 826 824 4 5 6 3
-                              Store 825 827
+             805:     85(ptr) AccessChain 37(data) 52 52
+             806: 25(i16vec4) Load 805
+             807: 90(i16vec3) VectorShuffle 806 806 0 1 2
+             808:   17(ivec4) Load 19(ballot)
+             809: 90(i16vec3) GroupNonUniformBitwiseAnd 177 PartitionedReduceNV 807 808
+             810:     80(ptr) AccessChain 37(data) 804 52 40
+             811: 24(int16_t) CompositeExtract 809 0
+                              Store 810 811
+             812:     80(ptr) AccessChain 37(data) 804 52 188
+             813: 24(int16_t) CompositeExtract 809 1
+                              Store 812 813
+             814:     80(ptr) AccessChain 37(data) 804 52 201
+             815: 24(int16_t) CompositeExtract 809 2
+                              Store 814 815
+             816:      6(int) Load 8(invocation)
+             817:     85(ptr) AccessChain 37(data) 58 52
+             818: 25(i16vec4) Load 817
+             819:   17(ivec4) Load 19(ballot)
+             820: 25(i16vec4) GroupNonUniformBitwiseAnd 177 PartitionedReduceNV 818 819
+             821:     85(ptr) AccessChain 37(data) 816 52
+                              Store 821 820
+             822:      6(int) Load 8(invocation)
+             823:     80(ptr) AccessChain 37(data) 39 52 40
+             824: 24(int16_t) Load 823
+             825:   17(ivec4) Load 19(ballot)
+             826: 24(int16_t) GroupNonUniformBitwiseOr 177 PartitionedReduceNV 824 825
+             827:     80(ptr) AccessChain 37(data) 822 52 40
+                              Store 827 826
              828:      6(int) Load 8(invocation)
-             829:    103(ptr) AccessChain 37(data) 58 58
-             830: 27(i16vec4) Load 829
-             831:   17(ivec4) Load 19(ballot)
-             832: 27(i16vec4) GroupNonUniformIAdd 177 PartitionedReduceNV 830 831
-             833:    103(ptr) AccessChain 37(data) 828 58
-                              Store 833 832
-             834:      6(int) Load 8(invocation)
-             835:     98(ptr) AccessChain 37(data) 39 58 40
-             836: 26(int16_t) Load 835
-             837:   17(ivec4) Load 19(ballot)
-             838: 26(int16_t) GroupNonUniformIMul 177 PartitionedReduceNV 836 837
-             839:     98(ptr) AccessChain 37(data) 834 58 40
-                              Store 839 838
-             840:      6(int) Load 8(invocation)
-             841:    103(ptr) AccessChain 37(data) 45 58
-             842: 27(i16vec4) Load 841
-             843:102(i16vec2) VectorShuffle 842 842 0 1
-             844:   17(ivec4) Load 19(ballot)
-             845:102(i16vec2) GroupNonUniformIMul 177 PartitionedReduceNV 843 844
-             846:    103(ptr) AccessChain 37(data) 840 58
-             847: 27(i16vec4) Load 846
-             848: 27(i16vec4) VectorShuffle 847 845 4 5 2 3
-                              Store 846 848
-             849:      6(int) Load 8(invocation)
-             850:    103(ptr) AccessChain 37(data) 52 58
-             851: 27(i16vec4) Load 850
-             852:108(i16vec3) VectorShuffle 851 851 0 1 2
+             829:     85(ptr) AccessChain 37(data) 45 52
+             830: 25(i16vec4) Load 829
+             831: 84(i16vec2) VectorShuffle 830 830 0 1
+             832:   17(ivec4) Load 19(ballot)
+             833: 84(i16vec2) GroupNonUniformBitwiseOr 177 PartitionedReduceNV 831 832
+             834:     80(ptr) AccessChain 37(data) 828 52 40
+             835: 24(int16_t) CompositeExtract 833 0
+                              Store 834 835
+             836:     80(ptr) AccessChain 37(data) 828 52 188
+             837: 24(int16_t) CompositeExtract 833 1
+                              Store 836 837
+             838:      6(int) Load 8(invocation)
+             839:     85(ptr) AccessChain 37(data) 52 52
+             840: 25(i16vec4) Load 839
+             841: 90(i16vec3) VectorShuffle 840 840 0 1 2
+             842:   17(ivec4) Load 19(ballot)
+             843: 90(i16vec3) GroupNonUniformBitwiseOr 177 PartitionedReduceNV 841 842
+             844:     80(ptr) AccessChain 37(data) 838 52 40
+             845: 24(int16_t) CompositeExtract 843 0
+                              Store 844 845
+             846:     80(ptr) AccessChain 37(data) 838 52 188
+             847: 24(int16_t) CompositeExtract 843 1
+                              Store 846 847
+             848:     80(ptr) AccessChain 37(data) 838 52 201
+             849: 24(int16_t) CompositeExtract 843 2
+                              Store 848 849
+             850:      6(int) Load 8(invocation)
+             851:     85(ptr) AccessChain 37(data) 58 52
+             852: 25(i16vec4) Load 851
              853:   17(ivec4) Load 19(ballot)
-             854:108(i16vec3) GroupNonUniformIMul 177 PartitionedReduceNV 852 853
-             855:    103(ptr) AccessChain 37(data) 849 58
-             856: 27(i16vec4) Load 855
-             857: 27(i16vec4) VectorShuffle 856 854 4 5 6 3
-                              Store 855 857
-             858:      6(int) Load 8(invocation)
-             859:    103(ptr) AccessChain 37(data) 58 58
-             860: 27(i16vec4) Load 859
-             861:   17(ivec4) Load 19(ballot)
-             862: 27(i16vec4) GroupNonUniformIMul 177 PartitionedReduceNV 860 861
-             863:    103(ptr) AccessChain 37(data) 858 58
-                              Store 863 862
-             864:      6(int) Load 8(invocation)
-             865:     98(ptr) AccessChain 37(data) 39 58 40
-             866: 26(int16_t) Load 865
-             867:   17(ivec4) Load 19(ballot)
-             868: 26(int16_t) GroupNonUniformUMin 177 PartitionedReduceNV 866 867
-             869:     98(ptr) AccessChain 37(data) 864 58 40
-                              Store 869 868
-             870:      6(int) Load 8(invocation)
-             871:    103(ptr) AccessChain 37(data) 45 58
-             872: 27(i16vec4) Load 871
-             873:102(i16vec2) VectorShuffle 872 872 0 1
-             874:   17(ivec4) Load 19(ballot)
-             875:102(i16vec2) GroupNonUniformUMin 177 PartitionedReduceNV 873 874
-             876:    103(ptr) AccessChain 37(data) 870 58
-             877: 27(i16vec4) Load 876
-             878: 27(i16vec4) VectorShuffle 877 875 4 5 2 3
-                              Store 876 878
-             879:      6(int) Load 8(invocation)
-             880:    103(ptr) AccessChain 37(data) 52 58
-             881: 27(i16vec4) Load 880
-             882:108(i16vec3) VectorShuffle 881 881 0 1 2
-             883:   17(ivec4) Load 19(ballot)
-             884:108(i16vec3) GroupNonUniformUMin 177 PartitionedReduceNV 882 883
-             885:    103(ptr) AccessChain 37(data) 879 58
-             886: 27(i16vec4) Load 885
-             887: 27(i16vec4) VectorShuffle 886 884 4 5 6 3
-                              Store 885 887
-             888:      6(int) Load 8(invocation)
-             889:    103(ptr) AccessChain 37(data) 58 58
-             890: 27(i16vec4) Load 889
-             891:   17(ivec4) Load 19(ballot)
-             892: 27(i16vec4) GroupNonUniformUMin 177 PartitionedReduceNV 890 891
-             893:    103(ptr) AccessChain 37(data) 888 58
-                              Store 893 892
-             894:      6(int) Load 8(invocation)
-             895:     98(ptr) AccessChain 37(data) 39 58 40
-             896: 26(int16_t) Load 895
-             897:   17(ivec4) Load 19(ballot)
-             898: 26(int16_t) GroupNonUniformUMax 177 PartitionedReduceNV 896 897
-             899:     98(ptr) AccessChain 37(data) 894 58 40
-                              Store 899 898
-             900:      6(int) Load 8(invocation)
-             901:    103(ptr) AccessChain 37(data) 45 58
-             902: 27(i16vec4) Load 901
-             903:102(i16vec2) VectorShuffle 902 902 0 1
-             904:   17(ivec4) Load 19(ballot)
-             905:102(i16vec2) GroupNonUniformUMax 177 PartitionedReduceNV 903 904
-             906:    103(ptr) AccessChain 37(data) 900 58
-             907: 27(i16vec4) Load 906
-             908: 27(i16vec4) VectorShuffle 907 905 4 5 2 3
-                              Store 906 908
-             909:      6(int) Load 8(invocation)
-             910:    103(ptr) AccessChain 37(data) 52 58
-             911: 27(i16vec4) Load 910
-             912:108(i16vec3) VectorShuffle 911 911 0 1 2
-             913:   17(ivec4) Load 19(ballot)
-             914:108(i16vec3) GroupNonUniformUMax 177 PartitionedReduceNV 912 913
-             915:    103(ptr) AccessChain 37(data) 909 58
-             916: 27(i16vec4) Load 915
-             917: 27(i16vec4) VectorShuffle 916 914 4 5 6 3
-                              Store 915 917
+             854: 25(i16vec4) GroupNonUniformBitwiseOr 177 PartitionedReduceNV 852 853
+             855:     85(ptr) AccessChain 37(data) 850 52
+                              Store 855 854
+             856:      6(int) Load 8(invocation)
+             857:     80(ptr) AccessChain 37(data) 39 52 40
+             858: 24(int16_t) Load 857
+             859:   17(ivec4) Load 19(ballot)
+             860: 24(int16_t) GroupNonUniformBitwiseXor 177 PartitionedReduceNV 858 859
+             861:     80(ptr) AccessChain 37(data) 856 52 40
+                              Store 861 860
+             862:      6(int) Load 8(invocation)
+             863:     85(ptr) AccessChain 37(data) 45 52
+             864: 25(i16vec4) Load 863
+             865: 84(i16vec2) VectorShuffle 864 864 0 1
+             866:   17(ivec4) Load 19(ballot)
+             867: 84(i16vec2) GroupNonUniformBitwiseXor 177 PartitionedReduceNV 865 866
+             868:     80(ptr) AccessChain 37(data) 862 52 40
+             869: 24(int16_t) CompositeExtract 867 0
+                              Store 868 869
+             870:     80(ptr) AccessChain 37(data) 862 52 188
+             871: 24(int16_t) CompositeExtract 867 1
+                              Store 870 871
+             872:      6(int) Load 8(invocation)
+             873:     85(ptr) AccessChain 37(data) 52 52
+             874: 25(i16vec4) Load 873
+             875: 90(i16vec3) VectorShuffle 874 874 0 1 2
+             876:   17(ivec4) Load 19(ballot)
+             877: 90(i16vec3) GroupNonUniformBitwiseXor 177 PartitionedReduceNV 875 876
+             878:     80(ptr) AccessChain 37(data) 872 52 40
+             879: 24(int16_t) CompositeExtract 877 0
+                              Store 878 879
+             880:     80(ptr) AccessChain 37(data) 872 52 188
+             881: 24(int16_t) CompositeExtract 877 1
+                              Store 880 881
+             882:     80(ptr) AccessChain 37(data) 872 52 201
+             883: 24(int16_t) CompositeExtract 877 2
+                              Store 882 883
+             884:      6(int) Load 8(invocation)
+             885:     85(ptr) AccessChain 37(data) 58 52
+             886: 25(i16vec4) Load 885
+             887:   17(ivec4) Load 19(ballot)
+             888: 25(i16vec4) GroupNonUniformBitwiseXor 177 PartitionedReduceNV 886 887
+             889:     85(ptr) AccessChain 37(data) 884 52
+                              Store 889 888
+             890:      6(int) Load 8(invocation)
+             891:     98(ptr) AccessChain 37(data) 39 58 40
+             892: 26(int16_t) Load 891
+             893:   17(ivec4) Load 19(ballot)
+             894: 26(int16_t) GroupNonUniformIAdd 177 PartitionedReduceNV 892 893
+             895:     98(ptr) AccessChain 37(data) 890 58 40
+                              Store 895 894
+             896:      6(int) Load 8(invocation)
+             897:    103(ptr) AccessChain 37(data) 45 58
+             898: 27(i16vec4) Load 897
+             899:102(i16vec2) VectorShuffle 898 898 0 1
+             900:   17(ivec4) Load 19(ballot)
+             901:102(i16vec2) GroupNonUniformIAdd 177 PartitionedReduceNV 899 900
+             902:     98(ptr) AccessChain 37(data) 896 58 40
+             903: 26(int16_t) CompositeExtract 901 0
+                              Store 902 903
+             904:     98(ptr) AccessChain 37(data) 896 58 188
+             905: 26(int16_t) CompositeExtract 901 1
+                              Store 904 905
+             906:      6(int) Load 8(invocation)
+             907:    103(ptr) AccessChain 37(data) 52 58
+             908: 27(i16vec4) Load 907
+             909:108(i16vec3) VectorShuffle 908 908 0 1 2
+             910:   17(ivec4) Load 19(ballot)
+             911:108(i16vec3) GroupNonUniformIAdd 177 PartitionedReduceNV 909 910
+             912:     98(ptr) AccessChain 37(data) 906 58 40
+             913: 26(int16_t) CompositeExtract 911 0
+                              Store 912 913
+             914:     98(ptr) AccessChain 37(data) 906 58 188
+             915: 26(int16_t) CompositeExtract 911 1
+                              Store 914 915
+             916:     98(ptr) AccessChain 37(data) 906 58 201
+             917: 26(int16_t) CompositeExtract 911 2
+                              Store 916 917
              918:      6(int) Load 8(invocation)
              919:    103(ptr) AccessChain 37(data) 58 58
              920: 27(i16vec4) Load 919
              921:   17(ivec4) Load 19(ballot)
-             922: 27(i16vec4) GroupNonUniformUMax 177 PartitionedReduceNV 920 921
+             922: 27(i16vec4) GroupNonUniformIAdd 177 PartitionedReduceNV 920 921
              923:    103(ptr) AccessChain 37(data) 918 58
                               Store 923 922
              924:      6(int) Load 8(invocation)
              925:     98(ptr) AccessChain 37(data) 39 58 40
              926: 26(int16_t) Load 925
              927:   17(ivec4) Load 19(ballot)
-             928: 26(int16_t) GroupNonUniformBitwiseAnd 177 PartitionedReduceNV 926 927
+             928: 26(int16_t) GroupNonUniformIMul 177 PartitionedReduceNV 926 927
              929:     98(ptr) AccessChain 37(data) 924 58 40
                               Store 929 928
              930:      6(int) Load 8(invocation)
@@ -1129,707 +1182,977 @@
              932: 27(i16vec4) Load 931
              933:102(i16vec2) VectorShuffle 932 932 0 1
              934:   17(ivec4) Load 19(ballot)
-             935:102(i16vec2) GroupNonUniformBitwiseAnd 177 PartitionedReduceNV 933 934
-             936:    103(ptr) AccessChain 37(data) 930 58
-             937: 27(i16vec4) Load 936
-             938: 27(i16vec4) VectorShuffle 937 935 4 5 2 3
-                              Store 936 938
-             939:      6(int) Load 8(invocation)
-             940:    103(ptr) AccessChain 37(data) 52 58
-             941: 27(i16vec4) Load 940
-             942:108(i16vec3) VectorShuffle 941 941 0 1 2
-             943:   17(ivec4) Load 19(ballot)
-             944:108(i16vec3) GroupNonUniformBitwiseAnd 177 PartitionedReduceNV 942 943
-             945:    103(ptr) AccessChain 37(data) 939 58
-             946: 27(i16vec4) Load 945
-             947: 27(i16vec4) VectorShuffle 946 944 4 5 6 3
-                              Store 945 947
-             948:      6(int) Load 8(invocation)
-             949:    103(ptr) AccessChain 37(data) 58 58
-             950: 27(i16vec4) Load 949
-             951:   17(ivec4) Load 19(ballot)
-             952: 27(i16vec4) GroupNonUniformBitwiseAnd 177 PartitionedReduceNV 950 951
-             953:    103(ptr) AccessChain 37(data) 948 58
-                              Store 953 952
-             954:      6(int) Load 8(invocation)
-             955:     98(ptr) AccessChain 37(data) 39 58 40
-             956: 26(int16_t) Load 955
-             957:   17(ivec4) Load 19(ballot)
-             958: 26(int16_t) GroupNonUniformBitwiseOr 177 PartitionedReduceNV 956 957
-             959:     98(ptr) AccessChain 37(data) 954 58 40
-                              Store 959 958
-             960:      6(int) Load 8(invocation)
-             961:    103(ptr) AccessChain 37(data) 45 58
-             962: 27(i16vec4) Load 961
-             963:102(i16vec2) VectorShuffle 962 962 0 1
-             964:   17(ivec4) Load 19(ballot)
-             965:102(i16vec2) GroupNonUniformBitwiseOr 177 PartitionedReduceNV 963 964
-             966:    103(ptr) AccessChain 37(data) 960 58
-             967: 27(i16vec4) Load 966
-             968: 27(i16vec4) VectorShuffle 967 965 4 5 2 3
-                              Store 966 968
-             969:      6(int) Load 8(invocation)
-             970:    103(ptr) AccessChain 37(data) 52 58
-             971: 27(i16vec4) Load 970
-             972:108(i16vec3) VectorShuffle 971 971 0 1 2
-             973:   17(ivec4) Load 19(ballot)
-             974:108(i16vec3) GroupNonUniformBitwiseOr 177 PartitionedReduceNV 972 973
-             975:    103(ptr) AccessChain 37(data) 969 58
+             935:102(i16vec2) GroupNonUniformIMul 177 PartitionedReduceNV 933 934
+             936:     98(ptr) AccessChain 37(data) 930 58 40
+             937: 26(int16_t) CompositeExtract 935 0
+                              Store 936 937
+             938:     98(ptr) AccessChain 37(data) 930 58 188
+             939: 26(int16_t) CompositeExtract 935 1
+                              Store 938 939
+             940:      6(int) Load 8(invocation)
+             941:    103(ptr) AccessChain 37(data) 52 58
+             942: 27(i16vec4) Load 941
+             943:108(i16vec3) VectorShuffle 942 942 0 1 2
+             944:   17(ivec4) Load 19(ballot)
+             945:108(i16vec3) GroupNonUniformIMul 177 PartitionedReduceNV 943 944
+             946:     98(ptr) AccessChain 37(data) 940 58 40
+             947: 26(int16_t) CompositeExtract 945 0
+                              Store 946 947
+             948:     98(ptr) AccessChain 37(data) 940 58 188
+             949: 26(int16_t) CompositeExtract 945 1
+                              Store 948 949
+             950:     98(ptr) AccessChain 37(data) 940 58 201
+             951: 26(int16_t) CompositeExtract 945 2
+                              Store 950 951
+             952:      6(int) Load 8(invocation)
+             953:    103(ptr) AccessChain 37(data) 58 58
+             954: 27(i16vec4) Load 953
+             955:   17(ivec4) Load 19(ballot)
+             956: 27(i16vec4) GroupNonUniformIMul 177 PartitionedReduceNV 954 955
+             957:    103(ptr) AccessChain 37(data) 952 58
+                              Store 957 956
+             958:      6(int) Load 8(invocation)
+             959:     98(ptr) AccessChain 37(data) 39 58 40
+             960: 26(int16_t) Load 959
+             961:   17(ivec4) Load 19(ballot)
+             962: 26(int16_t) GroupNonUniformUMin 177 PartitionedReduceNV 960 961
+             963:     98(ptr) AccessChain 37(data) 958 58 40
+                              Store 963 962
+             964:      6(int) Load 8(invocation)
+             965:    103(ptr) AccessChain 37(data) 45 58
+             966: 27(i16vec4) Load 965
+             967:102(i16vec2) VectorShuffle 966 966 0 1
+             968:   17(ivec4) Load 19(ballot)
+             969:102(i16vec2) GroupNonUniformUMin 177 PartitionedReduceNV 967 968
+             970:     98(ptr) AccessChain 37(data) 964 58 40
+             971: 26(int16_t) CompositeExtract 969 0
+                              Store 970 971
+             972:     98(ptr) AccessChain 37(data) 964 58 188
+             973: 26(int16_t) CompositeExtract 969 1
+                              Store 972 973
+             974:      6(int) Load 8(invocation)
+             975:    103(ptr) AccessChain 37(data) 52 58
              976: 27(i16vec4) Load 975
-             977: 27(i16vec4) VectorShuffle 976 974 4 5 6 3
-                              Store 975 977
-             978:      6(int) Load 8(invocation)
-             979:    103(ptr) AccessChain 37(data) 58 58
-             980: 27(i16vec4) Load 979
-             981:   17(ivec4) Load 19(ballot)
-             982: 27(i16vec4) GroupNonUniformBitwiseOr 177 PartitionedReduceNV 980 981
-             983:    103(ptr) AccessChain 37(data) 978 58
-                              Store 983 982
-             984:      6(int) Load 8(invocation)
-             985:     98(ptr) AccessChain 37(data) 39 58 40
-             986: 26(int16_t) Load 985
-             987:   17(ivec4) Load 19(ballot)
-             988: 26(int16_t) GroupNonUniformBitwiseXor 177 PartitionedReduceNV 986 987
-             989:     98(ptr) AccessChain 37(data) 984 58 40
-                              Store 989 988
-             990:      6(int) Load 8(invocation)
-             991:    103(ptr) AccessChain 37(data) 45 58
-             992: 27(i16vec4) Load 991
-             993:102(i16vec2) VectorShuffle 992 992 0 1
-             994:   17(ivec4) Load 19(ballot)
-             995:102(i16vec2) GroupNonUniformBitwiseXor 177 PartitionedReduceNV 993 994
-             996:    103(ptr) AccessChain 37(data) 990 58
-             997: 27(i16vec4) Load 996
-             998: 27(i16vec4) VectorShuffle 997 995 4 5 2 3
-                              Store 996 998
-             999:      6(int) Load 8(invocation)
-            1000:    103(ptr) AccessChain 37(data) 52 58
-            1001: 27(i16vec4) Load 1000
-            1002:108(i16vec3) VectorShuffle 1001 1001 0 1 2
-            1003:   17(ivec4) Load 19(ballot)
-            1004:108(i16vec3) GroupNonUniformBitwiseXor 177 PartitionedReduceNV 1002 1003
-            1005:    103(ptr) AccessChain 37(data) 999 58
-            1006: 27(i16vec4) Load 1005
-            1007: 27(i16vec4) VectorShuffle 1006 1004 4 5 6 3
-                              Store 1005 1007
+             977:108(i16vec3) VectorShuffle 976 976 0 1 2
+             978:   17(ivec4) Load 19(ballot)
+             979:108(i16vec3) GroupNonUniformUMin 177 PartitionedReduceNV 977 978
+             980:     98(ptr) AccessChain 37(data) 974 58 40
+             981: 26(int16_t) CompositeExtract 979 0
+                              Store 980 981
+             982:     98(ptr) AccessChain 37(data) 974 58 188
+             983: 26(int16_t) CompositeExtract 979 1
+                              Store 982 983
+             984:     98(ptr) AccessChain 37(data) 974 58 201
+             985: 26(int16_t) CompositeExtract 979 2
+                              Store 984 985
+             986:      6(int) Load 8(invocation)
+             987:    103(ptr) AccessChain 37(data) 58 58
+             988: 27(i16vec4) Load 987
+             989:   17(ivec4) Load 19(ballot)
+             990: 27(i16vec4) GroupNonUniformUMin 177 PartitionedReduceNV 988 989
+             991:    103(ptr) AccessChain 37(data) 986 58
+                              Store 991 990
+             992:      6(int) Load 8(invocation)
+             993:     98(ptr) AccessChain 37(data) 39 58 40
+             994: 26(int16_t) Load 993
+             995:   17(ivec4) Load 19(ballot)
+             996: 26(int16_t) GroupNonUniformUMax 177 PartitionedReduceNV 994 995
+             997:     98(ptr) AccessChain 37(data) 992 58 40
+                              Store 997 996
+             998:      6(int) Load 8(invocation)
+             999:    103(ptr) AccessChain 37(data) 45 58
+            1000: 27(i16vec4) Load 999
+            1001:102(i16vec2) VectorShuffle 1000 1000 0 1
+            1002:   17(ivec4) Load 19(ballot)
+            1003:102(i16vec2) GroupNonUniformUMax 177 PartitionedReduceNV 1001 1002
+            1004:     98(ptr) AccessChain 37(data) 998 58 40
+            1005: 26(int16_t) CompositeExtract 1003 0
+                              Store 1004 1005
+            1006:     98(ptr) AccessChain 37(data) 998 58 188
+            1007: 26(int16_t) CompositeExtract 1003 1
+                              Store 1006 1007
             1008:      6(int) Load 8(invocation)
-            1009:    103(ptr) AccessChain 37(data) 58 58
+            1009:    103(ptr) AccessChain 37(data) 52 58
             1010: 27(i16vec4) Load 1009
-            1011:   17(ivec4) Load 19(ballot)
-            1012: 27(i16vec4) GroupNonUniformBitwiseXor 177 PartitionedReduceNV 1010 1011
-            1013:    103(ptr) AccessChain 37(data) 1008 58
-                              Store 1013 1012
-            1014:      6(int) Load 8(invocation)
-            1015:    117(ptr) AccessChain 37(data) 39 116 40
-            1016: 28(int64_t) Load 1015
-            1017:   17(ivec4) Load 19(ballot)
-            1018: 28(int64_t) GroupNonUniformIAdd 177 PartitionedReduceNV 1016 1017
-            1019:    117(ptr) AccessChain 37(data) 1014 116 40
-                              Store 1019 1018
+            1011:108(i16vec3) VectorShuffle 1010 1010 0 1 2
+            1012:   17(ivec4) Load 19(ballot)
+            1013:108(i16vec3) GroupNonUniformUMax 177 PartitionedReduceNV 1011 1012
+            1014:     98(ptr) AccessChain 37(data) 1008 58 40
+            1015: 26(int16_t) CompositeExtract 1013 0
+                              Store 1014 1015
+            1016:     98(ptr) AccessChain 37(data) 1008 58 188
+            1017: 26(int16_t) CompositeExtract 1013 1
+                              Store 1016 1017
+            1018:     98(ptr) AccessChain 37(data) 1008 58 201
+            1019: 26(int16_t) CompositeExtract 1013 2
+                              Store 1018 1019
             1020:      6(int) Load 8(invocation)
-            1021:    122(ptr) AccessChain 37(data) 45 116
-            1022: 29(i64vec4) Load 1021
-            1023:121(i64vec2) VectorShuffle 1022 1022 0 1
-            1024:   17(ivec4) Load 19(ballot)
-            1025:121(i64vec2) GroupNonUniformIAdd 177 PartitionedReduceNV 1023 1024
-            1026:    122(ptr) AccessChain 37(data) 1020 116
-            1027: 29(i64vec4) Load 1026
-            1028: 29(i64vec4) VectorShuffle 1027 1025 4 5 2 3
-                              Store 1026 1028
-            1029:      6(int) Load 8(invocation)
-            1030:    122(ptr) AccessChain 37(data) 52 116
-            1031: 29(i64vec4) Load 1030
-            1032:127(i64vec3) VectorShuffle 1031 1031 0 1 2
-            1033:   17(ivec4) Load 19(ballot)
-            1034:127(i64vec3) GroupNonUniformIAdd 177 PartitionedReduceNV 1032 1033
-            1035:    122(ptr) AccessChain 37(data) 1029 116
-            1036: 29(i64vec4) Load 1035
-            1037: 29(i64vec4) VectorShuffle 1036 1034 4 5 6 3
-                              Store 1035 1037
-            1038:      6(int) Load 8(invocation)
-            1039:    122(ptr) AccessChain 37(data) 58 116
-            1040: 29(i64vec4) Load 1039
-            1041:   17(ivec4) Load 19(ballot)
-            1042: 29(i64vec4) GroupNonUniformIAdd 177 PartitionedReduceNV 1040 1041
-            1043:    122(ptr) AccessChain 37(data) 1038 116
-                              Store 1043 1042
-            1044:      6(int) Load 8(invocation)
-            1045:    117(ptr) AccessChain 37(data) 39 116 40
-            1046: 28(int64_t) Load 1045
-            1047:   17(ivec4) Load 19(ballot)
-            1048: 28(int64_t) GroupNonUniformIMul 177 PartitionedReduceNV 1046 1047
-            1049:    117(ptr) AccessChain 37(data) 1044 116 40
-                              Store 1049 1048
-            1050:      6(int) Load 8(invocation)
-            1051:    122(ptr) AccessChain 37(data) 45 116
-            1052: 29(i64vec4) Load 1051
-            1053:121(i64vec2) VectorShuffle 1052 1052 0 1
-            1054:   17(ivec4) Load 19(ballot)
-            1055:121(i64vec2) GroupNonUniformIMul 177 PartitionedReduceNV 1053 1054
-            1056:    122(ptr) AccessChain 37(data) 1050 116
-            1057: 29(i64vec4) Load 1056
-            1058: 29(i64vec4) VectorShuffle 1057 1055 4 5 2 3
-                              Store 1056 1058
-            1059:      6(int) Load 8(invocation)
-            1060:    122(ptr) AccessChain 37(data) 52 116
-            1061: 29(i64vec4) Load 1060
-            1062:127(i64vec3) VectorShuffle 1061 1061 0 1 2
+            1021:    103(ptr) AccessChain 37(data) 58 58
+            1022: 27(i16vec4) Load 1021
+            1023:   17(ivec4) Load 19(ballot)
+            1024: 27(i16vec4) GroupNonUniformUMax 177 PartitionedReduceNV 1022 1023
+            1025:    103(ptr) AccessChain 37(data) 1020 58
+                              Store 1025 1024
+            1026:      6(int) Load 8(invocation)
+            1027:     98(ptr) AccessChain 37(data) 39 58 40
+            1028: 26(int16_t) Load 1027
+            1029:   17(ivec4) Load 19(ballot)
+            1030: 26(int16_t) GroupNonUniformBitwiseAnd 177 PartitionedReduceNV 1028 1029
+            1031:     98(ptr) AccessChain 37(data) 1026 58 40
+                              Store 1031 1030
+            1032:      6(int) Load 8(invocation)
+            1033:    103(ptr) AccessChain 37(data) 45 58
+            1034: 27(i16vec4) Load 1033
+            1035:102(i16vec2) VectorShuffle 1034 1034 0 1
+            1036:   17(ivec4) Load 19(ballot)
+            1037:102(i16vec2) GroupNonUniformBitwiseAnd 177 PartitionedReduceNV 1035 1036
+            1038:     98(ptr) AccessChain 37(data) 1032 58 40
+            1039: 26(int16_t) CompositeExtract 1037 0
+                              Store 1038 1039
+            1040:     98(ptr) AccessChain 37(data) 1032 58 188
+            1041: 26(int16_t) CompositeExtract 1037 1
+                              Store 1040 1041
+            1042:      6(int) Load 8(invocation)
+            1043:    103(ptr) AccessChain 37(data) 52 58
+            1044: 27(i16vec4) Load 1043
+            1045:108(i16vec3) VectorShuffle 1044 1044 0 1 2
+            1046:   17(ivec4) Load 19(ballot)
+            1047:108(i16vec3) GroupNonUniformBitwiseAnd 177 PartitionedReduceNV 1045 1046
+            1048:     98(ptr) AccessChain 37(data) 1042 58 40
+            1049: 26(int16_t) CompositeExtract 1047 0
+                              Store 1048 1049
+            1050:     98(ptr) AccessChain 37(data) 1042 58 188
+            1051: 26(int16_t) CompositeExtract 1047 1
+                              Store 1050 1051
+            1052:     98(ptr) AccessChain 37(data) 1042 58 201
+            1053: 26(int16_t) CompositeExtract 1047 2
+                              Store 1052 1053
+            1054:      6(int) Load 8(invocation)
+            1055:    103(ptr) AccessChain 37(data) 58 58
+            1056: 27(i16vec4) Load 1055
+            1057:   17(ivec4) Load 19(ballot)
+            1058: 27(i16vec4) GroupNonUniformBitwiseAnd 177 PartitionedReduceNV 1056 1057
+            1059:    103(ptr) AccessChain 37(data) 1054 58
+                              Store 1059 1058
+            1060:      6(int) Load 8(invocation)
+            1061:     98(ptr) AccessChain 37(data) 39 58 40
+            1062: 26(int16_t) Load 1061
             1063:   17(ivec4) Load 19(ballot)
-            1064:127(i64vec3) GroupNonUniformIMul 177 PartitionedReduceNV 1062 1063
-            1065:    122(ptr) AccessChain 37(data) 1059 116
-            1066: 29(i64vec4) Load 1065
-            1067: 29(i64vec4) VectorShuffle 1066 1064 4 5 6 3
-                              Store 1065 1067
-            1068:      6(int) Load 8(invocation)
-            1069:    122(ptr) AccessChain 37(data) 58 116
-            1070: 29(i64vec4) Load 1069
-            1071:   17(ivec4) Load 19(ballot)
-            1072: 29(i64vec4) GroupNonUniformIMul 177 PartitionedReduceNV 1070 1071
-            1073:    122(ptr) AccessChain 37(data) 1068 116
-                              Store 1073 1072
-            1074:      6(int) Load 8(invocation)
-            1075:    117(ptr) AccessChain 37(data) 39 116 40
-            1076: 28(int64_t) Load 1075
-            1077:   17(ivec4) Load 19(ballot)
-            1078: 28(int64_t) GroupNonUniformSMin 177 PartitionedReduceNV 1076 1077
-            1079:    117(ptr) AccessChain 37(data) 1074 116 40
-                              Store 1079 1078
-            1080:      6(int) Load 8(invocation)
-            1081:    122(ptr) AccessChain 37(data) 45 116
-            1082: 29(i64vec4) Load 1081
-            1083:121(i64vec2) VectorShuffle 1082 1082 0 1
-            1084:   17(ivec4) Load 19(ballot)
-            1085:121(i64vec2) GroupNonUniformSMin 177 PartitionedReduceNV 1083 1084
-            1086:    122(ptr) AccessChain 37(data) 1080 116
-            1087: 29(i64vec4) Load 1086
-            1088: 29(i64vec4) VectorShuffle 1087 1085 4 5 2 3
-                              Store 1086 1088
-            1089:      6(int) Load 8(invocation)
-            1090:    122(ptr) AccessChain 37(data) 52 116
-            1091: 29(i64vec4) Load 1090
-            1092:127(i64vec3) VectorShuffle 1091 1091 0 1 2
-            1093:   17(ivec4) Load 19(ballot)
-            1094:127(i64vec3) GroupNonUniformSMin 177 PartitionedReduceNV 1092 1093
-            1095:    122(ptr) AccessChain 37(data) 1089 116
-            1096: 29(i64vec4) Load 1095
-            1097: 29(i64vec4) VectorShuffle 1096 1094 4 5 6 3
-                              Store 1095 1097
-            1098:      6(int) Load 8(invocation)
-            1099:    122(ptr) AccessChain 37(data) 58 116
-            1100: 29(i64vec4) Load 1099
-            1101:   17(ivec4) Load 19(ballot)
-            1102: 29(i64vec4) GroupNonUniformSMin 177 PartitionedReduceNV 1100 1101
-            1103:    122(ptr) AccessChain 37(data) 1098 116
-                              Store 1103 1102
-            1104:      6(int) Load 8(invocation)
-            1105:    117(ptr) AccessChain 37(data) 39 116 40
-            1106: 28(int64_t) Load 1105
-            1107:   17(ivec4) Load 19(ballot)
-            1108: 28(int64_t) GroupNonUniformSMax 177 PartitionedReduceNV 1106 1107
-            1109:    117(ptr) AccessChain 37(data) 1104 116 40
-                              Store 1109 1108
+            1064: 26(int16_t) GroupNonUniformBitwiseOr 177 PartitionedReduceNV 1062 1063
+            1065:     98(ptr) AccessChain 37(data) 1060 58 40
+                              Store 1065 1064
+            1066:      6(int) Load 8(invocation)
+            1067:    103(ptr) AccessChain 37(data) 45 58
+            1068: 27(i16vec4) Load 1067
+            1069:102(i16vec2) VectorShuffle 1068 1068 0 1
+            1070:   17(ivec4) Load 19(ballot)
+            1071:102(i16vec2) GroupNonUniformBitwiseOr 177 PartitionedReduceNV 1069 1070
+            1072:     98(ptr) AccessChain 37(data) 1066 58 40
+            1073: 26(int16_t) CompositeExtract 1071 0
+                              Store 1072 1073
+            1074:     98(ptr) AccessChain 37(data) 1066 58 188
+            1075: 26(int16_t) CompositeExtract 1071 1
+                              Store 1074 1075
+            1076:      6(int) Load 8(invocation)
+            1077:    103(ptr) AccessChain 37(data) 52 58
+            1078: 27(i16vec4) Load 1077
+            1079:108(i16vec3) VectorShuffle 1078 1078 0 1 2
+            1080:   17(ivec4) Load 19(ballot)
+            1081:108(i16vec3) GroupNonUniformBitwiseOr 177 PartitionedReduceNV 1079 1080
+            1082:     98(ptr) AccessChain 37(data) 1076 58 40
+            1083: 26(int16_t) CompositeExtract 1081 0
+                              Store 1082 1083
+            1084:     98(ptr) AccessChain 37(data) 1076 58 188
+            1085: 26(int16_t) CompositeExtract 1081 1
+                              Store 1084 1085
+            1086:     98(ptr) AccessChain 37(data) 1076 58 201
+            1087: 26(int16_t) CompositeExtract 1081 2
+                              Store 1086 1087
+            1088:      6(int) Load 8(invocation)
+            1089:    103(ptr) AccessChain 37(data) 58 58
+            1090: 27(i16vec4) Load 1089
+            1091:   17(ivec4) Load 19(ballot)
+            1092: 27(i16vec4) GroupNonUniformBitwiseOr 177 PartitionedReduceNV 1090 1091
+            1093:    103(ptr) AccessChain 37(data) 1088 58
+                              Store 1093 1092
+            1094:      6(int) Load 8(invocation)
+            1095:     98(ptr) AccessChain 37(data) 39 58 40
+            1096: 26(int16_t) Load 1095
+            1097:   17(ivec4) Load 19(ballot)
+            1098: 26(int16_t) GroupNonUniformBitwiseXor 177 PartitionedReduceNV 1096 1097
+            1099:     98(ptr) AccessChain 37(data) 1094 58 40
+                              Store 1099 1098
+            1100:      6(int) Load 8(invocation)
+            1101:    103(ptr) AccessChain 37(data) 45 58
+            1102: 27(i16vec4) Load 1101
+            1103:102(i16vec2) VectorShuffle 1102 1102 0 1
+            1104:   17(ivec4) Load 19(ballot)
+            1105:102(i16vec2) GroupNonUniformBitwiseXor 177 PartitionedReduceNV 1103 1104
+            1106:     98(ptr) AccessChain 37(data) 1100 58 40
+            1107: 26(int16_t) CompositeExtract 1105 0
+                              Store 1106 1107
+            1108:     98(ptr) AccessChain 37(data) 1100 58 188
+            1109: 26(int16_t) CompositeExtract 1105 1
+                              Store 1108 1109
             1110:      6(int) Load 8(invocation)
-            1111:    122(ptr) AccessChain 37(data) 45 116
-            1112: 29(i64vec4) Load 1111
-            1113:121(i64vec2) VectorShuffle 1112 1112 0 1
+            1111:    103(ptr) AccessChain 37(data) 52 58
+            1112: 27(i16vec4) Load 1111
+            1113:108(i16vec3) VectorShuffle 1112 1112 0 1 2
             1114:   17(ivec4) Load 19(ballot)
-            1115:121(i64vec2) GroupNonUniformSMax 177 PartitionedReduceNV 1113 1114
-            1116:    122(ptr) AccessChain 37(data) 1110 116
-            1117: 29(i64vec4) Load 1116
-            1118: 29(i64vec4) VectorShuffle 1117 1115 4 5 2 3
-                              Store 1116 1118
-            1119:      6(int) Load 8(invocation)
-            1120:    122(ptr) AccessChain 37(data) 52 116
-            1121: 29(i64vec4) Load 1120
-            1122:127(i64vec3) VectorShuffle 1121 1121 0 1 2
-            1123:   17(ivec4) Load 19(ballot)
-            1124:127(i64vec3) GroupNonUniformSMax 177 PartitionedReduceNV 1122 1123
-            1125:    122(ptr) AccessChain 37(data) 1119 116
-            1126: 29(i64vec4) Load 1125
-            1127: 29(i64vec4) VectorShuffle 1126 1124 4 5 6 3
-                              Store 1125 1127
+            1115:108(i16vec3) GroupNonUniformBitwiseXor 177 PartitionedReduceNV 1113 1114
+            1116:     98(ptr) AccessChain 37(data) 1110 58 40
+            1117: 26(int16_t) CompositeExtract 1115 0
+                              Store 1116 1117
+            1118:     98(ptr) AccessChain 37(data) 1110 58 188
+            1119: 26(int16_t) CompositeExtract 1115 1
+                              Store 1118 1119
+            1120:     98(ptr) AccessChain 37(data) 1110 58 201
+            1121: 26(int16_t) CompositeExtract 1115 2
+                              Store 1120 1121
+            1122:      6(int) Load 8(invocation)
+            1123:    103(ptr) AccessChain 37(data) 58 58
+            1124: 27(i16vec4) Load 1123
+            1125:   17(ivec4) Load 19(ballot)
+            1126: 27(i16vec4) GroupNonUniformBitwiseXor 177 PartitionedReduceNV 1124 1125
+            1127:    103(ptr) AccessChain 37(data) 1122 58
+                              Store 1127 1126
             1128:      6(int) Load 8(invocation)
-            1129:    122(ptr) AccessChain 37(data) 58 116
-            1130: 29(i64vec4) Load 1129
+            1129:    117(ptr) AccessChain 37(data) 39 116 40
+            1130: 28(int64_t) Load 1129
             1131:   17(ivec4) Load 19(ballot)
-            1132: 29(i64vec4) GroupNonUniformSMax 177 PartitionedReduceNV 1130 1131
-            1133:    122(ptr) AccessChain 37(data) 1128 116
+            1132: 28(int64_t) GroupNonUniformIAdd 177 PartitionedReduceNV 1130 1131
+            1133:    117(ptr) AccessChain 37(data) 1128 116 40
                               Store 1133 1132
             1134:      6(int) Load 8(invocation)
-            1135:    117(ptr) AccessChain 37(data) 39 116 40
-            1136: 28(int64_t) Load 1135
-            1137:   17(ivec4) Load 19(ballot)
-            1138: 28(int64_t) GroupNonUniformBitwiseAnd 177 PartitionedReduceNV 1136 1137
-            1139:    117(ptr) AccessChain 37(data) 1134 116 40
-                              Store 1139 1138
-            1140:      6(int) Load 8(invocation)
-            1141:    122(ptr) AccessChain 37(data) 45 116
-            1142: 29(i64vec4) Load 1141
-            1143:121(i64vec2) VectorShuffle 1142 1142 0 1
-            1144:   17(ivec4) Load 19(ballot)
-            1145:121(i64vec2) GroupNonUniformBitwiseAnd 177 PartitionedReduceNV 1143 1144
-            1146:    122(ptr) AccessChain 37(data) 1140 116
-            1147: 29(i64vec4) Load 1146
-            1148: 29(i64vec4) VectorShuffle 1147 1145 4 5 2 3
-                              Store 1146 1148
-            1149:      6(int) Load 8(invocation)
-            1150:    122(ptr) AccessChain 37(data) 52 116
-            1151: 29(i64vec4) Load 1150
-            1152:127(i64vec3) VectorShuffle 1151 1151 0 1 2
-            1153:   17(ivec4) Load 19(ballot)
-            1154:127(i64vec3) GroupNonUniformBitwiseAnd 177 PartitionedReduceNV 1152 1153
-            1155:    122(ptr) AccessChain 37(data) 1149 116
-            1156: 29(i64vec4) Load 1155
-            1157: 29(i64vec4) VectorShuffle 1156 1154 4 5 6 3
-                              Store 1155 1157
-            1158:      6(int) Load 8(invocation)
-            1159:    122(ptr) AccessChain 37(data) 58 116
-            1160: 29(i64vec4) Load 1159
-            1161:   17(ivec4) Load 19(ballot)
-            1162: 29(i64vec4) GroupNonUniformBitwiseAnd 177 PartitionedReduceNV 1160 1161
-            1163:    122(ptr) AccessChain 37(data) 1158 116
-                              Store 1163 1162
-            1164:      6(int) Load 8(invocation)
-            1165:    117(ptr) AccessChain 37(data) 39 116 40
-            1166: 28(int64_t) Load 1165
-            1167:   17(ivec4) Load 19(ballot)
-            1168: 28(int64_t) GroupNonUniformBitwiseOr 177 PartitionedReduceNV 1166 1167
-            1169:    117(ptr) AccessChain 37(data) 1164 116 40
-                              Store 1169 1168
-            1170:      6(int) Load 8(invocation)
-            1171:    122(ptr) AccessChain 37(data) 45 116
-            1172: 29(i64vec4) Load 1171
-            1173:121(i64vec2) VectorShuffle 1172 1172 0 1
-            1174:   17(ivec4) Load 19(ballot)
-            1175:121(i64vec2) GroupNonUniformBitwiseOr 177 PartitionedReduceNV 1173 1174
-            1176:    122(ptr) AccessChain 37(data) 1170 116
-            1177: 29(i64vec4) Load 1176
-            1178: 29(i64vec4) VectorShuffle 1177 1175 4 5 2 3
-                              Store 1176 1178
-            1179:      6(int) Load 8(invocation)
-            1180:    122(ptr) AccessChain 37(data) 52 116
-            1181: 29(i64vec4) Load 1180
-            1182:127(i64vec3) VectorShuffle 1181 1181 0 1 2
-            1183:   17(ivec4) Load 19(ballot)
-            1184:127(i64vec3) GroupNonUniformBitwiseOr 177 PartitionedReduceNV 1182 1183
-            1185:    122(ptr) AccessChain 37(data) 1179 116
-            1186: 29(i64vec4) Load 1185
-            1187: 29(i64vec4) VectorShuffle 1186 1184 4 5 6 3
-                              Store 1185 1187
-            1188:      6(int) Load 8(invocation)
-            1189:    122(ptr) AccessChain 37(data) 58 116
-            1190: 29(i64vec4) Load 1189
-            1191:   17(ivec4) Load 19(ballot)
-            1192: 29(i64vec4) GroupNonUniformBitwiseOr 177 PartitionedReduceNV 1190 1191
-            1193:    122(ptr) AccessChain 37(data) 1188 116
-                              Store 1193 1192
-            1194:      6(int) Load 8(invocation)
-            1195:    117(ptr) AccessChain 37(data) 39 116 40
-            1196: 28(int64_t) Load 1195
-            1197:   17(ivec4) Load 19(ballot)
-            1198: 28(int64_t) GroupNonUniformBitwiseXor 177 PartitionedReduceNV 1196 1197
-            1199:    117(ptr) AccessChain 37(data) 1194 116 40
-                              Store 1199 1198
-            1200:      6(int) Load 8(invocation)
-            1201:    122(ptr) AccessChain 37(data) 45 116
-            1202: 29(i64vec4) Load 1201
-            1203:121(i64vec2) VectorShuffle 1202 1202 0 1
-            1204:   17(ivec4) Load 19(ballot)
-            1205:121(i64vec2) GroupNonUniformBitwiseXor 177 PartitionedReduceNV 1203 1204
-            1206:    122(ptr) AccessChain 37(data) 1200 116
-            1207: 29(i64vec4) Load 1206
-            1208: 29(i64vec4) VectorShuffle 1207 1205 4 5 2 3
-                              Store 1206 1208
-            1209:      6(int) Load 8(invocation)
-            1210:    122(ptr) AccessChain 37(data) 52 116
-            1211: 29(i64vec4) Load 1210
-            1212:127(i64vec3) VectorShuffle 1211 1211 0 1 2
-            1213:   17(ivec4) Load 19(ballot)
-            1214:127(i64vec3) GroupNonUniformBitwiseXor 177 PartitionedReduceNV 1212 1213
-            1215:    122(ptr) AccessChain 37(data) 1209 116
-            1216: 29(i64vec4) Load 1215
-            1217: 29(i64vec4) VectorShuffle 1216 1214 4 5 6 3
-                              Store 1215 1217
-            1218:      6(int) Load 8(invocation)
-            1219:    122(ptr) AccessChain 37(data) 58 116
-            1220: 29(i64vec4) Load 1219
-            1221:   17(ivec4) Load 19(ballot)
-            1222: 29(i64vec4) GroupNonUniformBitwiseXor 177 PartitionedReduceNV 1220 1221
-            1223:    122(ptr) AccessChain 37(data) 1218 116
-                              Store 1223 1222
+            1135:    122(ptr) AccessChain 37(data) 45 116
+            1136: 29(i64vec4) Load 1135
+            1137:121(i64vec2) VectorShuffle 1136 1136 0 1
+            1138:   17(ivec4) Load 19(ballot)
+            1139:121(i64vec2) GroupNonUniformIAdd 177 PartitionedReduceNV 1137 1138
+            1140:    117(ptr) AccessChain 37(data) 1134 116 40
+            1141: 28(int64_t) CompositeExtract 1139 0
+                              Store 1140 1141
+            1142:    117(ptr) AccessChain 37(data) 1134 116 188
+            1143: 28(int64_t) CompositeExtract 1139 1
+                              Store 1142 1143
+            1144:      6(int) Load 8(invocation)
+            1145:    122(ptr) AccessChain 37(data) 52 116
+            1146: 29(i64vec4) Load 1145
+            1147:127(i64vec3) VectorShuffle 1146 1146 0 1 2
+            1148:   17(ivec4) Load 19(ballot)
+            1149:127(i64vec3) GroupNonUniformIAdd 177 PartitionedReduceNV 1147 1148
+            1150:    117(ptr) AccessChain 37(data) 1144 116 40
+            1151: 28(int64_t) CompositeExtract 1149 0
+                              Store 1150 1151
+            1152:    117(ptr) AccessChain 37(data) 1144 116 188
+            1153: 28(int64_t) CompositeExtract 1149 1
+                              Store 1152 1153
+            1154:    117(ptr) AccessChain 37(data) 1144 116 201
+            1155: 28(int64_t) CompositeExtract 1149 2
+                              Store 1154 1155
+            1156:      6(int) Load 8(invocation)
+            1157:    122(ptr) AccessChain 37(data) 58 116
+            1158: 29(i64vec4) Load 1157
+            1159:   17(ivec4) Load 19(ballot)
+            1160: 29(i64vec4) GroupNonUniformIAdd 177 PartitionedReduceNV 1158 1159
+            1161:    122(ptr) AccessChain 37(data) 1156 116
+                              Store 1161 1160
+            1162:      6(int) Load 8(invocation)
+            1163:    117(ptr) AccessChain 37(data) 39 116 40
+            1164: 28(int64_t) Load 1163
+            1165:   17(ivec4) Load 19(ballot)
+            1166: 28(int64_t) GroupNonUniformIMul 177 PartitionedReduceNV 1164 1165
+            1167:    117(ptr) AccessChain 37(data) 1162 116 40
+                              Store 1167 1166
+            1168:      6(int) Load 8(invocation)
+            1169:    122(ptr) AccessChain 37(data) 45 116
+            1170: 29(i64vec4) Load 1169
+            1171:121(i64vec2) VectorShuffle 1170 1170 0 1
+            1172:   17(ivec4) Load 19(ballot)
+            1173:121(i64vec2) GroupNonUniformIMul 177 PartitionedReduceNV 1171 1172
+            1174:    117(ptr) AccessChain 37(data) 1168 116 40
+            1175: 28(int64_t) CompositeExtract 1173 0
+                              Store 1174 1175
+            1176:    117(ptr) AccessChain 37(data) 1168 116 188
+            1177: 28(int64_t) CompositeExtract 1173 1
+                              Store 1176 1177
+            1178:      6(int) Load 8(invocation)
+            1179:    122(ptr) AccessChain 37(data) 52 116
+            1180: 29(i64vec4) Load 1179
+            1181:127(i64vec3) VectorShuffle 1180 1180 0 1 2
+            1182:   17(ivec4) Load 19(ballot)
+            1183:127(i64vec3) GroupNonUniformIMul 177 PartitionedReduceNV 1181 1182
+            1184:    117(ptr) AccessChain 37(data) 1178 116 40
+            1185: 28(int64_t) CompositeExtract 1183 0
+                              Store 1184 1185
+            1186:    117(ptr) AccessChain 37(data) 1178 116 188
+            1187: 28(int64_t) CompositeExtract 1183 1
+                              Store 1186 1187
+            1188:    117(ptr) AccessChain 37(data) 1178 116 201
+            1189: 28(int64_t) CompositeExtract 1183 2
+                              Store 1188 1189
+            1190:      6(int) Load 8(invocation)
+            1191:    122(ptr) AccessChain 37(data) 58 116
+            1192: 29(i64vec4) Load 1191
+            1193:   17(ivec4) Load 19(ballot)
+            1194: 29(i64vec4) GroupNonUniformIMul 177 PartitionedReduceNV 1192 1193
+            1195:    122(ptr) AccessChain 37(data) 1190 116
+                              Store 1195 1194
+            1196:      6(int) Load 8(invocation)
+            1197:    117(ptr) AccessChain 37(data) 39 116 40
+            1198: 28(int64_t) Load 1197
+            1199:   17(ivec4) Load 19(ballot)
+            1200: 28(int64_t) GroupNonUniformSMin 177 PartitionedReduceNV 1198 1199
+            1201:    117(ptr) AccessChain 37(data) 1196 116 40
+                              Store 1201 1200
+            1202:      6(int) Load 8(invocation)
+            1203:    122(ptr) AccessChain 37(data) 45 116
+            1204: 29(i64vec4) Load 1203
+            1205:121(i64vec2) VectorShuffle 1204 1204 0 1
+            1206:   17(ivec4) Load 19(ballot)
+            1207:121(i64vec2) GroupNonUniformSMin 177 PartitionedReduceNV 1205 1206
+            1208:    117(ptr) AccessChain 37(data) 1202 116 40
+            1209: 28(int64_t) CompositeExtract 1207 0
+                              Store 1208 1209
+            1210:    117(ptr) AccessChain 37(data) 1202 116 188
+            1211: 28(int64_t) CompositeExtract 1207 1
+                              Store 1210 1211
+            1212:      6(int) Load 8(invocation)
+            1213:    122(ptr) AccessChain 37(data) 52 116
+            1214: 29(i64vec4) Load 1213
+            1215:127(i64vec3) VectorShuffle 1214 1214 0 1 2
+            1216:   17(ivec4) Load 19(ballot)
+            1217:127(i64vec3) GroupNonUniformSMin 177 PartitionedReduceNV 1215 1216
+            1218:    117(ptr) AccessChain 37(data) 1212 116 40
+            1219: 28(int64_t) CompositeExtract 1217 0
+                              Store 1218 1219
+            1220:    117(ptr) AccessChain 37(data) 1212 116 188
+            1221: 28(int64_t) CompositeExtract 1217 1
+                              Store 1220 1221
+            1222:    117(ptr) AccessChain 37(data) 1212 116 201
+            1223: 28(int64_t) CompositeExtract 1217 2
+                              Store 1222 1223
             1224:      6(int) Load 8(invocation)
-            1225:    136(ptr) AccessChain 37(data) 39 135 40
-            1226: 30(int64_t) Load 1225
+            1225:    122(ptr) AccessChain 37(data) 58 116
+            1226: 29(i64vec4) Load 1225
             1227:   17(ivec4) Load 19(ballot)
-            1228: 30(int64_t) GroupNonUniformIAdd 177 PartitionedReduceNV 1226 1227
-            1229:    136(ptr) AccessChain 37(data) 1224 135 40
+            1228: 29(i64vec4) GroupNonUniformSMin 177 PartitionedReduceNV 1226 1227
+            1229:    122(ptr) AccessChain 37(data) 1224 116
                               Store 1229 1228
             1230:      6(int) Load 8(invocation)
-            1231:    141(ptr) AccessChain 37(data) 45 135
-            1232: 31(i64vec4) Load 1231
-            1233:140(i64vec2) VectorShuffle 1232 1232 0 1
-            1234:   17(ivec4) Load 19(ballot)
-            1235:140(i64vec2) GroupNonUniformIAdd 177 PartitionedReduceNV 1233 1234
-            1236:    141(ptr) AccessChain 37(data) 1230 135
-            1237: 31(i64vec4) Load 1236
-            1238: 31(i64vec4) VectorShuffle 1237 1235 4 5 2 3
-                              Store 1236 1238
-            1239:      6(int) Load 8(invocation)
-            1240:    141(ptr) AccessChain 37(data) 52 135
-            1241: 31(i64vec4) Load 1240
-            1242:146(i64vec3) VectorShuffle 1241 1241 0 1 2
-            1243:   17(ivec4) Load 19(ballot)
-            1244:146(i64vec3) GroupNonUniformIAdd 177 PartitionedReduceNV 1242 1243
-            1245:    141(ptr) AccessChain 37(data) 1239 135
-            1246: 31(i64vec4) Load 1245
-            1247: 31(i64vec4) VectorShuffle 1246 1244 4 5 6 3
-                              Store 1245 1247
-            1248:      6(int) Load 8(invocation)
-            1249:    141(ptr) AccessChain 37(data) 58 135
-            1250: 31(i64vec4) Load 1249
-            1251:   17(ivec4) Load 19(ballot)
-            1252: 31(i64vec4) GroupNonUniformIAdd 177 PartitionedReduceNV 1250 1251
-            1253:    141(ptr) AccessChain 37(data) 1248 135
-                              Store 1253 1252
-            1254:      6(int) Load 8(invocation)
-            1255:    136(ptr) AccessChain 37(data) 39 135 40
-            1256: 30(int64_t) Load 1255
-            1257:   17(ivec4) Load 19(ballot)
-            1258: 30(int64_t) GroupNonUniformIMul 177 PartitionedReduceNV 1256 1257
-            1259:    136(ptr) AccessChain 37(data) 1254 135 40
-                              Store 1259 1258
-            1260:      6(int) Load 8(invocation)
-            1261:    141(ptr) AccessChain 37(data) 45 135
-            1262: 31(i64vec4) Load 1261
-            1263:140(i64vec2) VectorShuffle 1262 1262 0 1
-            1264:   17(ivec4) Load 19(ballot)
-            1265:140(i64vec2) GroupNonUniformIMul 177 PartitionedReduceNV 1263 1264
-            1266:    141(ptr) AccessChain 37(data) 1260 135
-            1267: 31(i64vec4) Load 1266
-            1268: 31(i64vec4) VectorShuffle 1267 1265 4 5 2 3
-                              Store 1266 1268
-            1269:      6(int) Load 8(invocation)
-            1270:    141(ptr) AccessChain 37(data) 52 135
-            1271: 31(i64vec4) Load 1270
-            1272:146(i64vec3) VectorShuffle 1271 1271 0 1 2
-            1273:   17(ivec4) Load 19(ballot)
-            1274:146(i64vec3) GroupNonUniformIMul 177 PartitionedReduceNV 1272 1273
-            1275:    141(ptr) AccessChain 37(data) 1269 135
-            1276: 31(i64vec4) Load 1275
-            1277: 31(i64vec4) VectorShuffle 1276 1274 4 5 6 3
-                              Store 1275 1277
-            1278:      6(int) Load 8(invocation)
-            1279:    141(ptr) AccessChain 37(data) 58 135
-            1280: 31(i64vec4) Load 1279
-            1281:   17(ivec4) Load 19(ballot)
-            1282: 31(i64vec4) GroupNonUniformIMul 177 PartitionedReduceNV 1280 1281
-            1283:    141(ptr) AccessChain 37(data) 1278 135
-                              Store 1283 1282
-            1284:      6(int) Load 8(invocation)
-            1285:    136(ptr) AccessChain 37(data) 39 135 40
-            1286: 30(int64_t) Load 1285
-            1287:   17(ivec4) Load 19(ballot)
-            1288: 30(int64_t) GroupNonUniformUMin 177 PartitionedReduceNV 1286 1287
-            1289:    136(ptr) AccessChain 37(data) 1284 135 40
-                              Store 1289 1288
-            1290:      6(int) Load 8(invocation)
-            1291:    141(ptr) AccessChain 37(data) 45 135
-            1292: 31(i64vec4) Load 1291
-            1293:140(i64vec2) VectorShuffle 1292 1292 0 1
-            1294:   17(ivec4) Load 19(ballot)
-            1295:140(i64vec2) GroupNonUniformUMin 177 PartitionedReduceNV 1293 1294
-            1296:    141(ptr) AccessChain 37(data) 1290 135
-            1297: 31(i64vec4) Load 1296
-            1298: 31(i64vec4) VectorShuffle 1297 1295 4 5 2 3
-                              Store 1296 1298
-            1299:      6(int) Load 8(invocation)
-            1300:    141(ptr) AccessChain 37(data) 52 135
-            1301: 31(i64vec4) Load 1300
-            1302:146(i64vec3) VectorShuffle 1301 1301 0 1 2
-            1303:   17(ivec4) Load 19(ballot)
-            1304:146(i64vec3) GroupNonUniformUMin 177 PartitionedReduceNV 1302 1303
-            1305:    141(ptr) AccessChain 37(data) 1299 135
-            1306: 31(i64vec4) Load 1305
-            1307: 31(i64vec4) VectorShuffle 1306 1304 4 5 6 3
-                              Store 1305 1307
-            1308:      6(int) Load 8(invocation)
-            1309:    141(ptr) AccessChain 37(data) 58 135
-            1310: 31(i64vec4) Load 1309
-            1311:   17(ivec4) Load 19(ballot)
-            1312: 31(i64vec4) GroupNonUniformUMin 177 PartitionedReduceNV 1310 1311
-            1313:    141(ptr) AccessChain 37(data) 1308 135
-                              Store 1313 1312
+            1231:    117(ptr) AccessChain 37(data) 39 116 40
+            1232: 28(int64_t) Load 1231
+            1233:   17(ivec4) Load 19(ballot)
+            1234: 28(int64_t) GroupNonUniformSMax 177 PartitionedReduceNV 1232 1233
+            1235:    117(ptr) AccessChain 37(data) 1230 116 40
+                              Store 1235 1234
+            1236:      6(int) Load 8(invocation)
+            1237:    122(ptr) AccessChain 37(data) 45 116
+            1238: 29(i64vec4) Load 1237
+            1239:121(i64vec2) VectorShuffle 1238 1238 0 1
+            1240:   17(ivec4) Load 19(ballot)
+            1241:121(i64vec2) GroupNonUniformSMax 177 PartitionedReduceNV 1239 1240
+            1242:    117(ptr) AccessChain 37(data) 1236 116 40
+            1243: 28(int64_t) CompositeExtract 1241 0
+                              Store 1242 1243
+            1244:    117(ptr) AccessChain 37(data) 1236 116 188
+            1245: 28(int64_t) CompositeExtract 1241 1
+                              Store 1244 1245
+            1246:      6(int) Load 8(invocation)
+            1247:    122(ptr) AccessChain 37(data) 52 116
+            1248: 29(i64vec4) Load 1247
+            1249:127(i64vec3) VectorShuffle 1248 1248 0 1 2
+            1250:   17(ivec4) Load 19(ballot)
+            1251:127(i64vec3) GroupNonUniformSMax 177 PartitionedReduceNV 1249 1250
+            1252:    117(ptr) AccessChain 37(data) 1246 116 40
+            1253: 28(int64_t) CompositeExtract 1251 0
+                              Store 1252 1253
+            1254:    117(ptr) AccessChain 37(data) 1246 116 188
+            1255: 28(int64_t) CompositeExtract 1251 1
+                              Store 1254 1255
+            1256:    117(ptr) AccessChain 37(data) 1246 116 201
+            1257: 28(int64_t) CompositeExtract 1251 2
+                              Store 1256 1257
+            1258:      6(int) Load 8(invocation)
+            1259:    122(ptr) AccessChain 37(data) 58 116
+            1260: 29(i64vec4) Load 1259
+            1261:   17(ivec4) Load 19(ballot)
+            1262: 29(i64vec4) GroupNonUniformSMax 177 PartitionedReduceNV 1260 1261
+            1263:    122(ptr) AccessChain 37(data) 1258 116
+                              Store 1263 1262
+            1264:      6(int) Load 8(invocation)
+            1265:    117(ptr) AccessChain 37(data) 39 116 40
+            1266: 28(int64_t) Load 1265
+            1267:   17(ivec4) Load 19(ballot)
+            1268: 28(int64_t) GroupNonUniformBitwiseAnd 177 PartitionedReduceNV 1266 1267
+            1269:    117(ptr) AccessChain 37(data) 1264 116 40
+                              Store 1269 1268
+            1270:      6(int) Load 8(invocation)
+            1271:    122(ptr) AccessChain 37(data) 45 116
+            1272: 29(i64vec4) Load 1271
+            1273:121(i64vec2) VectorShuffle 1272 1272 0 1
+            1274:   17(ivec4) Load 19(ballot)
+            1275:121(i64vec2) GroupNonUniformBitwiseAnd 177 PartitionedReduceNV 1273 1274
+            1276:    117(ptr) AccessChain 37(data) 1270 116 40
+            1277: 28(int64_t) CompositeExtract 1275 0
+                              Store 1276 1277
+            1278:    117(ptr) AccessChain 37(data) 1270 116 188
+            1279: 28(int64_t) CompositeExtract 1275 1
+                              Store 1278 1279
+            1280:      6(int) Load 8(invocation)
+            1281:    122(ptr) AccessChain 37(data) 52 116
+            1282: 29(i64vec4) Load 1281
+            1283:127(i64vec3) VectorShuffle 1282 1282 0 1 2
+            1284:   17(ivec4) Load 19(ballot)
+            1285:127(i64vec3) GroupNonUniformBitwiseAnd 177 PartitionedReduceNV 1283 1284
+            1286:    117(ptr) AccessChain 37(data) 1280 116 40
+            1287: 28(int64_t) CompositeExtract 1285 0
+                              Store 1286 1287
+            1288:    117(ptr) AccessChain 37(data) 1280 116 188
+            1289: 28(int64_t) CompositeExtract 1285 1
+                              Store 1288 1289
+            1290:    117(ptr) AccessChain 37(data) 1280 116 201
+            1291: 28(int64_t) CompositeExtract 1285 2
+                              Store 1290 1291
+            1292:      6(int) Load 8(invocation)
+            1293:    122(ptr) AccessChain 37(data) 58 116
+            1294: 29(i64vec4) Load 1293
+            1295:   17(ivec4) Load 19(ballot)
+            1296: 29(i64vec4) GroupNonUniformBitwiseAnd 177 PartitionedReduceNV 1294 1295
+            1297:    122(ptr) AccessChain 37(data) 1292 116
+                              Store 1297 1296
+            1298:      6(int) Load 8(invocation)
+            1299:    117(ptr) AccessChain 37(data) 39 116 40
+            1300: 28(int64_t) Load 1299
+            1301:   17(ivec4) Load 19(ballot)
+            1302: 28(int64_t) GroupNonUniformBitwiseOr 177 PartitionedReduceNV 1300 1301
+            1303:    117(ptr) AccessChain 37(data) 1298 116 40
+                              Store 1303 1302
+            1304:      6(int) Load 8(invocation)
+            1305:    122(ptr) AccessChain 37(data) 45 116
+            1306: 29(i64vec4) Load 1305
+            1307:121(i64vec2) VectorShuffle 1306 1306 0 1
+            1308:   17(ivec4) Load 19(ballot)
+            1309:121(i64vec2) GroupNonUniformBitwiseOr 177 PartitionedReduceNV 1307 1308
+            1310:    117(ptr) AccessChain 37(data) 1304 116 40
+            1311: 28(int64_t) CompositeExtract 1309 0
+                              Store 1310 1311
+            1312:    117(ptr) AccessChain 37(data) 1304 116 188
+            1313: 28(int64_t) CompositeExtract 1309 1
+                              Store 1312 1313
             1314:      6(int) Load 8(invocation)
-            1315:    136(ptr) AccessChain 37(data) 39 135 40
-            1316: 30(int64_t) Load 1315
-            1317:   17(ivec4) Load 19(ballot)
-            1318: 30(int64_t) GroupNonUniformUMax 177 PartitionedReduceNV 1316 1317
-            1319:    136(ptr) AccessChain 37(data) 1314 135 40
-                              Store 1319 1318
-            1320:      6(int) Load 8(invocation)
-            1321:    141(ptr) AccessChain 37(data) 45 135
-            1322: 31(i64vec4) Load 1321
-            1323:140(i64vec2) VectorShuffle 1322 1322 0 1
-            1324:   17(ivec4) Load 19(ballot)
-            1325:140(i64vec2) GroupNonUniformUMax 177 PartitionedReduceNV 1323 1324
-            1326:    141(ptr) AccessChain 37(data) 1320 135
-            1327: 31(i64vec4) Load 1326
-            1328: 31(i64vec4) VectorShuffle 1327 1325 4 5 2 3
-                              Store 1326 1328
-            1329:      6(int) Load 8(invocation)
-            1330:    141(ptr) AccessChain 37(data) 52 135
-            1331: 31(i64vec4) Load 1330
-            1332:146(i64vec3) VectorShuffle 1331 1331 0 1 2
-            1333:   17(ivec4) Load 19(ballot)
-            1334:146(i64vec3) GroupNonUniformUMax 177 PartitionedReduceNV 1332 1333
-            1335:    141(ptr) AccessChain 37(data) 1329 135
-            1336: 31(i64vec4) Load 1335
-            1337: 31(i64vec4) VectorShuffle 1336 1334 4 5 6 3
-                              Store 1335 1337
+            1315:    122(ptr) AccessChain 37(data) 52 116
+            1316: 29(i64vec4) Load 1315
+            1317:127(i64vec3) VectorShuffle 1316 1316 0 1 2
+            1318:   17(ivec4) Load 19(ballot)
+            1319:127(i64vec3) GroupNonUniformBitwiseOr 177 PartitionedReduceNV 1317 1318
+            1320:    117(ptr) AccessChain 37(data) 1314 116 40
+            1321: 28(int64_t) CompositeExtract 1319 0
+                              Store 1320 1321
+            1322:    117(ptr) AccessChain 37(data) 1314 116 188
+            1323: 28(int64_t) CompositeExtract 1319 1
+                              Store 1322 1323
+            1324:    117(ptr) AccessChain 37(data) 1314 116 201
+            1325: 28(int64_t) CompositeExtract 1319 2
+                              Store 1324 1325
+            1326:      6(int) Load 8(invocation)
+            1327:    122(ptr) AccessChain 37(data) 58 116
+            1328: 29(i64vec4) Load 1327
+            1329:   17(ivec4) Load 19(ballot)
+            1330: 29(i64vec4) GroupNonUniformBitwiseOr 177 PartitionedReduceNV 1328 1329
+            1331:    122(ptr) AccessChain 37(data) 1326 116
+                              Store 1331 1330
+            1332:      6(int) Load 8(invocation)
+            1333:    117(ptr) AccessChain 37(data) 39 116 40
+            1334: 28(int64_t) Load 1333
+            1335:   17(ivec4) Load 19(ballot)
+            1336: 28(int64_t) GroupNonUniformBitwiseXor 177 PartitionedReduceNV 1334 1335
+            1337:    117(ptr) AccessChain 37(data) 1332 116 40
+                              Store 1337 1336
             1338:      6(int) Load 8(invocation)
-            1339:    141(ptr) AccessChain 37(data) 58 135
-            1340: 31(i64vec4) Load 1339
-            1341:   17(ivec4) Load 19(ballot)
-            1342: 31(i64vec4) GroupNonUniformUMax 177 PartitionedReduceNV 1340 1341
-            1343:    141(ptr) AccessChain 37(data) 1338 135
-                              Store 1343 1342
-            1344:      6(int) Load 8(invocation)
-            1345:    136(ptr) AccessChain 37(data) 39 135 40
-            1346: 30(int64_t) Load 1345
-            1347:   17(ivec4) Load 19(ballot)
-            1348: 30(int64_t) GroupNonUniformBitwiseAnd 177 PartitionedReduceNV 1346 1347
-            1349:    136(ptr) AccessChain 37(data) 1344 135 40
-                              Store 1349 1348
-            1350:      6(int) Load 8(invocation)
-            1351:    141(ptr) AccessChain 37(data) 45 135
-            1352: 31(i64vec4) Load 1351
-            1353:140(i64vec2) VectorShuffle 1352 1352 0 1
-            1354:   17(ivec4) Load 19(ballot)
-            1355:140(i64vec2) GroupNonUniformBitwiseAnd 177 PartitionedReduceNV 1353 1354
-            1356:    141(ptr) AccessChain 37(data) 1350 135
-            1357: 31(i64vec4) Load 1356
-            1358: 31(i64vec4) VectorShuffle 1357 1355 4 5 2 3
-                              Store 1356 1358
-            1359:      6(int) Load 8(invocation)
-            1360:    141(ptr) AccessChain 37(data) 52 135
-            1361: 31(i64vec4) Load 1360
-            1362:146(i64vec3) VectorShuffle 1361 1361 0 1 2
+            1339:    122(ptr) AccessChain 37(data) 45 116
+            1340: 29(i64vec4) Load 1339
+            1341:121(i64vec2) VectorShuffle 1340 1340 0 1
+            1342:   17(ivec4) Load 19(ballot)
+            1343:121(i64vec2) GroupNonUniformBitwiseXor 177 PartitionedReduceNV 1341 1342
+            1344:    117(ptr) AccessChain 37(data) 1338 116 40
+            1345: 28(int64_t) CompositeExtract 1343 0
+                              Store 1344 1345
+            1346:    117(ptr) AccessChain 37(data) 1338 116 188
+            1347: 28(int64_t) CompositeExtract 1343 1
+                              Store 1346 1347
+            1348:      6(int) Load 8(invocation)
+            1349:    122(ptr) AccessChain 37(data) 52 116
+            1350: 29(i64vec4) Load 1349
+            1351:127(i64vec3) VectorShuffle 1350 1350 0 1 2
+            1352:   17(ivec4) Load 19(ballot)
+            1353:127(i64vec3) GroupNonUniformBitwiseXor 177 PartitionedReduceNV 1351 1352
+            1354:    117(ptr) AccessChain 37(data) 1348 116 40
+            1355: 28(int64_t) CompositeExtract 1353 0
+                              Store 1354 1355
+            1356:    117(ptr) AccessChain 37(data) 1348 116 188
+            1357: 28(int64_t) CompositeExtract 1353 1
+                              Store 1356 1357
+            1358:    117(ptr) AccessChain 37(data) 1348 116 201
+            1359: 28(int64_t) CompositeExtract 1353 2
+                              Store 1358 1359
+            1360:      6(int) Load 8(invocation)
+            1361:    122(ptr) AccessChain 37(data) 58 116
+            1362: 29(i64vec4) Load 1361
             1363:   17(ivec4) Load 19(ballot)
-            1364:146(i64vec3) GroupNonUniformBitwiseAnd 177 PartitionedReduceNV 1362 1363
-            1365:    141(ptr) AccessChain 37(data) 1359 135
-            1366: 31(i64vec4) Load 1365
-            1367: 31(i64vec4) VectorShuffle 1366 1364 4 5 6 3
-                              Store 1365 1367
-            1368:      6(int) Load 8(invocation)
-            1369:    141(ptr) AccessChain 37(data) 58 135
-            1370: 31(i64vec4) Load 1369
-            1371:   17(ivec4) Load 19(ballot)
-            1372: 31(i64vec4) GroupNonUniformBitwiseAnd 177 PartitionedReduceNV 1370 1371
-            1373:    141(ptr) AccessChain 37(data) 1368 135
-                              Store 1373 1372
-            1374:      6(int) Load 8(invocation)
-            1375:    136(ptr) AccessChain 37(data) 39 135 40
-            1376: 30(int64_t) Load 1375
-            1377:   17(ivec4) Load 19(ballot)
-            1378: 30(int64_t) GroupNonUniformBitwiseOr 177 PartitionedReduceNV 1376 1377
-            1379:    136(ptr) AccessChain 37(data) 1374 135 40
-                              Store 1379 1378
-            1380:      6(int) Load 8(invocation)
-            1381:    141(ptr) AccessChain 37(data) 45 135
-            1382: 31(i64vec4) Load 1381
-            1383:140(i64vec2) VectorShuffle 1382 1382 0 1
-            1384:   17(ivec4) Load 19(ballot)
-            1385:140(i64vec2) GroupNonUniformBitwiseOr 177 PartitionedReduceNV 1383 1384
-            1386:    141(ptr) AccessChain 37(data) 1380 135
-            1387: 31(i64vec4) Load 1386
-            1388: 31(i64vec4) VectorShuffle 1387 1385 4 5 2 3
-                              Store 1386 1388
-            1389:      6(int) Load 8(invocation)
-            1390:    141(ptr) AccessChain 37(data) 52 135
-            1391: 31(i64vec4) Load 1390
-            1392:146(i64vec3) VectorShuffle 1391 1391 0 1 2
-            1393:   17(ivec4) Load 19(ballot)
-            1394:146(i64vec3) GroupNonUniformBitwiseOr 177 PartitionedReduceNV 1392 1393
-            1395:    141(ptr) AccessChain 37(data) 1389 135
+            1364: 29(i64vec4) GroupNonUniformBitwiseXor 177 PartitionedReduceNV 1362 1363
+            1365:    122(ptr) AccessChain 37(data) 1360 116
+                              Store 1365 1364
+            1366:      6(int) Load 8(invocation)
+            1367:    136(ptr) AccessChain 37(data) 39 135 40
+            1368: 30(int64_t) Load 1367
+            1369:   17(ivec4) Load 19(ballot)
+            1370: 30(int64_t) GroupNonUniformIAdd 177 PartitionedReduceNV 1368 1369
+            1371:    136(ptr) AccessChain 37(data) 1366 135 40
+                              Store 1371 1370
+            1372:      6(int) Load 8(invocation)
+            1373:    141(ptr) AccessChain 37(data) 45 135
+            1374: 31(i64vec4) Load 1373
+            1375:140(i64vec2) VectorShuffle 1374 1374 0 1
+            1376:   17(ivec4) Load 19(ballot)
+            1377:140(i64vec2) GroupNonUniformIAdd 177 PartitionedReduceNV 1375 1376
+            1378:    136(ptr) AccessChain 37(data) 1372 135 40
+            1379: 30(int64_t) CompositeExtract 1377 0
+                              Store 1378 1379
+            1380:    136(ptr) AccessChain 37(data) 1372 135 188
+            1381: 30(int64_t) CompositeExtract 1377 1
+                              Store 1380 1381
+            1382:      6(int) Load 8(invocation)
+            1383:    141(ptr) AccessChain 37(data) 52 135
+            1384: 31(i64vec4) Load 1383
+            1385:146(i64vec3) VectorShuffle 1384 1384 0 1 2
+            1386:   17(ivec4) Load 19(ballot)
+            1387:146(i64vec3) GroupNonUniformIAdd 177 PartitionedReduceNV 1385 1386
+            1388:    136(ptr) AccessChain 37(data) 1382 135 40
+            1389: 30(int64_t) CompositeExtract 1387 0
+                              Store 1388 1389
+            1390:    136(ptr) AccessChain 37(data) 1382 135 188
+            1391: 30(int64_t) CompositeExtract 1387 1
+                              Store 1390 1391
+            1392:    136(ptr) AccessChain 37(data) 1382 135 201
+            1393: 30(int64_t) CompositeExtract 1387 2
+                              Store 1392 1393
+            1394:      6(int) Load 8(invocation)
+            1395:    141(ptr) AccessChain 37(data) 58 135
             1396: 31(i64vec4) Load 1395
-            1397: 31(i64vec4) VectorShuffle 1396 1394 4 5 6 3
-                              Store 1395 1397
-            1398:      6(int) Load 8(invocation)
-            1399:    141(ptr) AccessChain 37(data) 58 135
-            1400: 31(i64vec4) Load 1399
-            1401:   17(ivec4) Load 19(ballot)
-            1402: 31(i64vec4) GroupNonUniformBitwiseOr 177 PartitionedReduceNV 1400 1401
-            1403:    141(ptr) AccessChain 37(data) 1398 135
-                              Store 1403 1402
-            1404:      6(int) Load 8(invocation)
-            1405:    136(ptr) AccessChain 37(data) 39 135 40
-            1406: 30(int64_t) Load 1405
-            1407:   17(ivec4) Load 19(ballot)
-            1408: 30(int64_t) GroupNonUniformBitwiseXor 177 PartitionedReduceNV 1406 1407
-            1409:    136(ptr) AccessChain 37(data) 1404 135 40
-                              Store 1409 1408
-            1410:      6(int) Load 8(invocation)
-            1411:    141(ptr) AccessChain 37(data) 45 135
-            1412: 31(i64vec4) Load 1411
-            1413:140(i64vec2) VectorShuffle 1412 1412 0 1
-            1414:   17(ivec4) Load 19(ballot)
-            1415:140(i64vec2) GroupNonUniformBitwiseXor 177 PartitionedReduceNV 1413 1414
-            1416:    141(ptr) AccessChain 37(data) 1410 135
-            1417: 31(i64vec4) Load 1416
-            1418: 31(i64vec4) VectorShuffle 1417 1415 4 5 2 3
-                              Store 1416 1418
-            1419:      6(int) Load 8(invocation)
-            1420:    141(ptr) AccessChain 37(data) 52 135
-            1421: 31(i64vec4) Load 1420
-            1422:146(i64vec3) VectorShuffle 1421 1421 0 1 2
-            1423:   17(ivec4) Load 19(ballot)
-            1424:146(i64vec3) GroupNonUniformBitwiseXor 177 PartitionedReduceNV 1422 1423
-            1425:    141(ptr) AccessChain 37(data) 1419 135
-            1426: 31(i64vec4) Load 1425
-            1427: 31(i64vec4) VectorShuffle 1426 1424 4 5 6 3
-                              Store 1425 1427
+            1397:   17(ivec4) Load 19(ballot)
+            1398: 31(i64vec4) GroupNonUniformIAdd 177 PartitionedReduceNV 1396 1397
+            1399:    141(ptr) AccessChain 37(data) 1394 135
+                              Store 1399 1398
+            1400:      6(int) Load 8(invocation)
+            1401:    136(ptr) AccessChain 37(data) 39 135 40
+            1402: 30(int64_t) Load 1401
+            1403:   17(ivec4) Load 19(ballot)
+            1404: 30(int64_t) GroupNonUniformIMul 177 PartitionedReduceNV 1402 1403
+            1405:    136(ptr) AccessChain 37(data) 1400 135 40
+                              Store 1405 1404
+            1406:      6(int) Load 8(invocation)
+            1407:    141(ptr) AccessChain 37(data) 45 135
+            1408: 31(i64vec4) Load 1407
+            1409:140(i64vec2) VectorShuffle 1408 1408 0 1
+            1410:   17(ivec4) Load 19(ballot)
+            1411:140(i64vec2) GroupNonUniformIMul 177 PartitionedReduceNV 1409 1410
+            1412:    136(ptr) AccessChain 37(data) 1406 135 40
+            1413: 30(int64_t) CompositeExtract 1411 0
+                              Store 1412 1413
+            1414:    136(ptr) AccessChain 37(data) 1406 135 188
+            1415: 30(int64_t) CompositeExtract 1411 1
+                              Store 1414 1415
+            1416:      6(int) Load 8(invocation)
+            1417:    141(ptr) AccessChain 37(data) 52 135
+            1418: 31(i64vec4) Load 1417
+            1419:146(i64vec3) VectorShuffle 1418 1418 0 1 2
+            1420:   17(ivec4) Load 19(ballot)
+            1421:146(i64vec3) GroupNonUniformIMul 177 PartitionedReduceNV 1419 1420
+            1422:    136(ptr) AccessChain 37(data) 1416 135 40
+            1423: 30(int64_t) CompositeExtract 1421 0
+                              Store 1422 1423
+            1424:    136(ptr) AccessChain 37(data) 1416 135 188
+            1425: 30(int64_t) CompositeExtract 1421 1
+                              Store 1424 1425
+            1426:    136(ptr) AccessChain 37(data) 1416 135 201
+            1427: 30(int64_t) CompositeExtract 1421 2
+                              Store 1426 1427
             1428:      6(int) Load 8(invocation)
             1429:    141(ptr) AccessChain 37(data) 58 135
             1430: 31(i64vec4) Load 1429
             1431:   17(ivec4) Load 19(ballot)
-            1432: 31(i64vec4) GroupNonUniformBitwiseXor 177 PartitionedReduceNV 1430 1431
+            1432: 31(i64vec4) GroupNonUniformIMul 177 PartitionedReduceNV 1430 1431
             1433:    141(ptr) AccessChain 37(data) 1428 135
                               Store 1433 1432
             1434:      6(int) Load 8(invocation)
-            1435:    155(ptr) AccessChain 37(data) 39 154 40
-            1436:32(float16_t) Load 1435
+            1435:    136(ptr) AccessChain 37(data) 39 135 40
+            1436: 30(int64_t) Load 1435
             1437:   17(ivec4) Load 19(ballot)
-            1438:32(float16_t) GroupNonUniformFAdd 177 PartitionedReduceNV 1436 1437
-            1439:    155(ptr) AccessChain 37(data) 1434 154 40
+            1438: 30(int64_t) GroupNonUniformUMin 177 PartitionedReduceNV 1436 1437
+            1439:    136(ptr) AccessChain 37(data) 1434 135 40
                               Store 1439 1438
             1440:      6(int) Load 8(invocation)
-            1441:    160(ptr) AccessChain 37(data) 45 154
-            1442: 33(f16vec4) Load 1441
-            1443:159(f16vec2) VectorShuffle 1442 1442 0 1
+            1441:    141(ptr) AccessChain 37(data) 45 135
+            1442: 31(i64vec4) Load 1441
+            1443:140(i64vec2) VectorShuffle 1442 1442 0 1
             1444:   17(ivec4) Load 19(ballot)
-            1445:159(f16vec2) GroupNonUniformFAdd 177 PartitionedReduceNV 1443 1444
-            1446:    160(ptr) AccessChain 37(data) 1440 154
-            1447: 33(f16vec4) Load 1446
-            1448: 33(f16vec4) VectorShuffle 1447 1445 4 5 2 3
-                              Store 1446 1448
-            1449:      6(int) Load 8(invocation)
-            1450:    160(ptr) AccessChain 37(data) 52 154
-            1451: 33(f16vec4) Load 1450
-            1452:165(f16vec3) VectorShuffle 1451 1451 0 1 2
-            1453:   17(ivec4) Load 19(ballot)
-            1454:165(f16vec3) GroupNonUniformFAdd 177 PartitionedReduceNV 1452 1453
-            1455:    160(ptr) AccessChain 37(data) 1449 154
-            1456: 33(f16vec4) Load 1455
-            1457: 33(f16vec4) VectorShuffle 1456 1454 4 5 6 3
-                              Store 1455 1457
-            1458:      6(int) Load 8(invocation)
-            1459:    160(ptr) AccessChain 37(data) 58 154
-            1460: 33(f16vec4) Load 1459
-            1461:   17(ivec4) Load 19(ballot)
-            1462: 33(f16vec4) GroupNonUniformFAdd 177 PartitionedReduceNV 1460 1461
-            1463:    160(ptr) AccessChain 37(data) 1458 154
-                              Store 1463 1462
-            1464:      6(int) Load 8(invocation)
-            1465:    155(ptr) AccessChain 37(data) 39 154 40
-            1466:32(float16_t) Load 1465
-            1467:   17(ivec4) Load 19(ballot)
-            1468:32(float16_t) GroupNonUniformFMul 177 PartitionedReduceNV 1466 1467
-            1469:    155(ptr) AccessChain 37(data) 1464 154 40
-                              Store 1469 1468
-            1470:      6(int) Load 8(invocation)
-            1471:    160(ptr) AccessChain 37(data) 45 154
-            1472: 33(f16vec4) Load 1471
-            1473:159(f16vec2) VectorShuffle 1472 1472 0 1
-            1474:   17(ivec4) Load 19(ballot)
-            1475:159(f16vec2) GroupNonUniformFMul 177 PartitionedReduceNV 1473 1474
-            1476:    160(ptr) AccessChain 37(data) 1470 154
-            1477: 33(f16vec4) Load 1476
-            1478: 33(f16vec4) VectorShuffle 1477 1475 4 5 2 3
-                              Store 1476 1478
-            1479:      6(int) Load 8(invocation)
-            1480:    160(ptr) AccessChain 37(data) 52 154
-            1481: 33(f16vec4) Load 1480
-            1482:165(f16vec3) VectorShuffle 1481 1481 0 1 2
-            1483:   17(ivec4) Load 19(ballot)
-            1484:165(f16vec3) GroupNonUniformFMul 177 PartitionedReduceNV 1482 1483
-            1485:    160(ptr) AccessChain 37(data) 1479 154
-            1486: 33(f16vec4) Load 1485
-            1487: 33(f16vec4) VectorShuffle 1486 1484 4 5 6 3
-                              Store 1485 1487
-            1488:      6(int) Load 8(invocation)
-            1489:    160(ptr) AccessChain 37(data) 58 154
-            1490: 33(f16vec4) Load 1489
-            1491:   17(ivec4) Load 19(ballot)
-            1492: 33(f16vec4) GroupNonUniformFMul 177 PartitionedReduceNV 1490 1491
-            1493:    160(ptr) AccessChain 37(data) 1488 154
-                              Store 1493 1492
-            1494:      6(int) Load 8(invocation)
-            1495:    155(ptr) AccessChain 37(data) 39 154 40
-            1496:32(float16_t) Load 1495
-            1497:   17(ivec4) Load 19(ballot)
-            1498:32(float16_t) GroupNonUniformFMin 177 PartitionedReduceNV 1496 1497
-            1499:    155(ptr) AccessChain 37(data) 1494 154 40
-                              Store 1499 1498
-            1500:      6(int) Load 8(invocation)
-            1501:    160(ptr) AccessChain 37(data) 45 154
-            1502: 33(f16vec4) Load 1501
-            1503:159(f16vec2) VectorShuffle 1502 1502 0 1
-            1504:   17(ivec4) Load 19(ballot)
-            1505:159(f16vec2) GroupNonUniformFMin 177 PartitionedReduceNV 1503 1504
-            1506:    160(ptr) AccessChain 37(data) 1500 154
-            1507: 33(f16vec4) Load 1506
-            1508: 33(f16vec4) VectorShuffle 1507 1505 4 5 2 3
-                              Store 1506 1508
-            1509:      6(int) Load 8(invocation)
-            1510:    160(ptr) AccessChain 37(data) 52 154
-            1511: 33(f16vec4) Load 1510
-            1512:165(f16vec3) VectorShuffle 1511 1511 0 1 2
-            1513:   17(ivec4) Load 19(ballot)
-            1514:165(f16vec3) GroupNonUniformFMin 177 PartitionedReduceNV 1512 1513
-            1515:    160(ptr) AccessChain 37(data) 1509 154
-            1516: 33(f16vec4) Load 1515
-            1517: 33(f16vec4) VectorShuffle 1516 1514 4 5 6 3
-                              Store 1515 1517
+            1445:140(i64vec2) GroupNonUniformUMin 177 PartitionedReduceNV 1443 1444
+            1446:    136(ptr) AccessChain 37(data) 1440 135 40
+            1447: 30(int64_t) CompositeExtract 1445 0
+                              Store 1446 1447
+            1448:    136(ptr) AccessChain 37(data) 1440 135 188
+            1449: 30(int64_t) CompositeExtract 1445 1
+                              Store 1448 1449
+            1450:      6(int) Load 8(invocation)
+            1451:    141(ptr) AccessChain 37(data) 52 135
+            1452: 31(i64vec4) Load 1451
+            1453:146(i64vec3) VectorShuffle 1452 1452 0 1 2
+            1454:   17(ivec4) Load 19(ballot)
+            1455:146(i64vec3) GroupNonUniformUMin 177 PartitionedReduceNV 1453 1454
+            1456:    136(ptr) AccessChain 37(data) 1450 135 40
+            1457: 30(int64_t) CompositeExtract 1455 0
+                              Store 1456 1457
+            1458:    136(ptr) AccessChain 37(data) 1450 135 188
+            1459: 30(int64_t) CompositeExtract 1455 1
+                              Store 1458 1459
+            1460:    136(ptr) AccessChain 37(data) 1450 135 201
+            1461: 30(int64_t) CompositeExtract 1455 2
+                              Store 1460 1461
+            1462:      6(int) Load 8(invocation)
+            1463:    141(ptr) AccessChain 37(data) 58 135
+            1464: 31(i64vec4) Load 1463
+            1465:   17(ivec4) Load 19(ballot)
+            1466: 31(i64vec4) GroupNonUniformUMin 177 PartitionedReduceNV 1464 1465
+            1467:    141(ptr) AccessChain 37(data) 1462 135
+                              Store 1467 1466
+            1468:      6(int) Load 8(invocation)
+            1469:    136(ptr) AccessChain 37(data) 39 135 40
+            1470: 30(int64_t) Load 1469
+            1471:   17(ivec4) Load 19(ballot)
+            1472: 30(int64_t) GroupNonUniformUMax 177 PartitionedReduceNV 1470 1471
+            1473:    136(ptr) AccessChain 37(data) 1468 135 40
+                              Store 1473 1472
+            1474:      6(int) Load 8(invocation)
+            1475:    141(ptr) AccessChain 37(data) 45 135
+            1476: 31(i64vec4) Load 1475
+            1477:140(i64vec2) VectorShuffle 1476 1476 0 1
+            1478:   17(ivec4) Load 19(ballot)
+            1479:140(i64vec2) GroupNonUniformUMax 177 PartitionedReduceNV 1477 1478
+            1480:    136(ptr) AccessChain 37(data) 1474 135 40
+            1481: 30(int64_t) CompositeExtract 1479 0
+                              Store 1480 1481
+            1482:    136(ptr) AccessChain 37(data) 1474 135 188
+            1483: 30(int64_t) CompositeExtract 1479 1
+                              Store 1482 1483
+            1484:      6(int) Load 8(invocation)
+            1485:    141(ptr) AccessChain 37(data) 52 135
+            1486: 31(i64vec4) Load 1485
+            1487:146(i64vec3) VectorShuffle 1486 1486 0 1 2
+            1488:   17(ivec4) Load 19(ballot)
+            1489:146(i64vec3) GroupNonUniformUMax 177 PartitionedReduceNV 1487 1488
+            1490:    136(ptr) AccessChain 37(data) 1484 135 40
+            1491: 30(int64_t) CompositeExtract 1489 0
+                              Store 1490 1491
+            1492:    136(ptr) AccessChain 37(data) 1484 135 188
+            1493: 30(int64_t) CompositeExtract 1489 1
+                              Store 1492 1493
+            1494:    136(ptr) AccessChain 37(data) 1484 135 201
+            1495: 30(int64_t) CompositeExtract 1489 2
+                              Store 1494 1495
+            1496:      6(int) Load 8(invocation)
+            1497:    141(ptr) AccessChain 37(data) 58 135
+            1498: 31(i64vec4) Load 1497
+            1499:   17(ivec4) Load 19(ballot)
+            1500: 31(i64vec4) GroupNonUniformUMax 177 PartitionedReduceNV 1498 1499
+            1501:    141(ptr) AccessChain 37(data) 1496 135
+                              Store 1501 1500
+            1502:      6(int) Load 8(invocation)
+            1503:    136(ptr) AccessChain 37(data) 39 135 40
+            1504: 30(int64_t) Load 1503
+            1505:   17(ivec4) Load 19(ballot)
+            1506: 30(int64_t) GroupNonUniformBitwiseAnd 177 PartitionedReduceNV 1504 1505
+            1507:    136(ptr) AccessChain 37(data) 1502 135 40
+                              Store 1507 1506
+            1508:      6(int) Load 8(invocation)
+            1509:    141(ptr) AccessChain 37(data) 45 135
+            1510: 31(i64vec4) Load 1509
+            1511:140(i64vec2) VectorShuffle 1510 1510 0 1
+            1512:   17(ivec4) Load 19(ballot)
+            1513:140(i64vec2) GroupNonUniformBitwiseAnd 177 PartitionedReduceNV 1511 1512
+            1514:    136(ptr) AccessChain 37(data) 1508 135 40
+            1515: 30(int64_t) CompositeExtract 1513 0
+                              Store 1514 1515
+            1516:    136(ptr) AccessChain 37(data) 1508 135 188
+            1517: 30(int64_t) CompositeExtract 1513 1
+                              Store 1516 1517
             1518:      6(int) Load 8(invocation)
-            1519:    160(ptr) AccessChain 37(data) 58 154
-            1520: 33(f16vec4) Load 1519
-            1521:   17(ivec4) Load 19(ballot)
-            1522: 33(f16vec4) GroupNonUniformFMin 177 PartitionedReduceNV 1520 1521
-            1523:    160(ptr) AccessChain 37(data) 1518 154
-                              Store 1523 1522
-            1524:      6(int) Load 8(invocation)
-            1525:    155(ptr) AccessChain 37(data) 39 154 40
-            1526:32(float16_t) Load 1525
-            1527:   17(ivec4) Load 19(ballot)
-            1528:32(float16_t) GroupNonUniformFMax 177 PartitionedReduceNV 1526 1527
-            1529:    155(ptr) AccessChain 37(data) 1524 154 40
-                              Store 1529 1528
+            1519:    141(ptr) AccessChain 37(data) 52 135
+            1520: 31(i64vec4) Load 1519
+            1521:146(i64vec3) VectorShuffle 1520 1520 0 1 2
+            1522:   17(ivec4) Load 19(ballot)
+            1523:146(i64vec3) GroupNonUniformBitwiseAnd 177 PartitionedReduceNV 1521 1522
+            1524:    136(ptr) AccessChain 37(data) 1518 135 40
+            1525: 30(int64_t) CompositeExtract 1523 0
+                              Store 1524 1525
+            1526:    136(ptr) AccessChain 37(data) 1518 135 188
+            1527: 30(int64_t) CompositeExtract 1523 1
+                              Store 1526 1527
+            1528:    136(ptr) AccessChain 37(data) 1518 135 201
+            1529: 30(int64_t) CompositeExtract 1523 2
+                              Store 1528 1529
             1530:      6(int) Load 8(invocation)
-            1531:    160(ptr) AccessChain 37(data) 45 154
-            1532: 33(f16vec4) Load 1531
-            1533:159(f16vec2) VectorShuffle 1532 1532 0 1
-            1534:   17(ivec4) Load 19(ballot)
-            1535:159(f16vec2) GroupNonUniformFMax 177 PartitionedReduceNV 1533 1534
-            1536:    160(ptr) AccessChain 37(data) 1530 154
-            1537: 33(f16vec4) Load 1536
-            1538: 33(f16vec4) VectorShuffle 1537 1535 4 5 2 3
-                              Store 1536 1538
-            1539:      6(int) Load 8(invocation)
-            1540:    160(ptr) AccessChain 37(data) 52 154
-            1541: 33(f16vec4) Load 1540
-            1542:165(f16vec3) VectorShuffle 1541 1541 0 1 2
-            1543:   17(ivec4) Load 19(ballot)
-            1544:165(f16vec3) GroupNonUniformFMax 177 PartitionedReduceNV 1542 1543
-            1545:    160(ptr) AccessChain 37(data) 1539 154
-            1546: 33(f16vec4) Load 1545
-            1547: 33(f16vec4) VectorShuffle 1546 1544 4 5 6 3
-                              Store 1545 1547
-            1548:      6(int) Load 8(invocation)
-            1549:    160(ptr) AccessChain 37(data) 58 154
-            1550: 33(f16vec4) Load 1549
-            1551:   17(ivec4) Load 19(ballot)
-            1552: 33(f16vec4) GroupNonUniformFMax 177 PartitionedReduceNV 1550 1551
-            1553:    160(ptr) AccessChain 37(data) 1548 154
-                              Store 1553 1552
+            1531:    141(ptr) AccessChain 37(data) 58 135
+            1532: 31(i64vec4) Load 1531
+            1533:   17(ivec4) Load 19(ballot)
+            1534: 31(i64vec4) GroupNonUniformBitwiseAnd 177 PartitionedReduceNV 1532 1533
+            1535:    141(ptr) AccessChain 37(data) 1530 135
+                              Store 1535 1534
+            1536:      6(int) Load 8(invocation)
+            1537:    136(ptr) AccessChain 37(data) 39 135 40
+            1538: 30(int64_t) Load 1537
+            1539:   17(ivec4) Load 19(ballot)
+            1540: 30(int64_t) GroupNonUniformBitwiseOr 177 PartitionedReduceNV 1538 1539
+            1541:    136(ptr) AccessChain 37(data) 1536 135 40
+                              Store 1541 1540
+            1542:      6(int) Load 8(invocation)
+            1543:    141(ptr) AccessChain 37(data) 45 135
+            1544: 31(i64vec4) Load 1543
+            1545:140(i64vec2) VectorShuffle 1544 1544 0 1
+            1546:   17(ivec4) Load 19(ballot)
+            1547:140(i64vec2) GroupNonUniformBitwiseOr 177 PartitionedReduceNV 1545 1546
+            1548:    136(ptr) AccessChain 37(data) 1542 135 40
+            1549: 30(int64_t) CompositeExtract 1547 0
+                              Store 1548 1549
+            1550:    136(ptr) AccessChain 37(data) 1542 135 188
+            1551: 30(int64_t) CompositeExtract 1547 1
+                              Store 1550 1551
+            1552:      6(int) Load 8(invocation)
+            1553:    141(ptr) AccessChain 37(data) 52 135
+            1554: 31(i64vec4) Load 1553
+            1555:146(i64vec3) VectorShuffle 1554 1554 0 1 2
+            1556:   17(ivec4) Load 19(ballot)
+            1557:146(i64vec3) GroupNonUniformBitwiseOr 177 PartitionedReduceNV 1555 1556
+            1558:    136(ptr) AccessChain 37(data) 1552 135 40
+            1559: 30(int64_t) CompositeExtract 1557 0
+                              Store 1558 1559
+            1560:    136(ptr) AccessChain 37(data) 1552 135 188
+            1561: 30(int64_t) CompositeExtract 1557 1
+                              Store 1560 1561
+            1562:    136(ptr) AccessChain 37(data) 1552 135 201
+            1563: 30(int64_t) CompositeExtract 1557 2
+                              Store 1562 1563
+            1564:      6(int) Load 8(invocation)
+            1565:    141(ptr) AccessChain 37(data) 58 135
+            1566: 31(i64vec4) Load 1565
+            1567:   17(ivec4) Load 19(ballot)
+            1568: 31(i64vec4) GroupNonUniformBitwiseOr 177 PartitionedReduceNV 1566 1567
+            1569:    141(ptr) AccessChain 37(data) 1564 135
+                              Store 1569 1568
+            1570:      6(int) Load 8(invocation)
+            1571:    136(ptr) AccessChain 37(data) 39 135 40
+            1572: 30(int64_t) Load 1571
+            1573:   17(ivec4) Load 19(ballot)
+            1574: 30(int64_t) GroupNonUniformBitwiseXor 177 PartitionedReduceNV 1572 1573
+            1575:    136(ptr) AccessChain 37(data) 1570 135 40
+                              Store 1575 1574
+            1576:      6(int) Load 8(invocation)
+            1577:    141(ptr) AccessChain 37(data) 45 135
+            1578: 31(i64vec4) Load 1577
+            1579:140(i64vec2) VectorShuffle 1578 1578 0 1
+            1580:   17(ivec4) Load 19(ballot)
+            1581:140(i64vec2) GroupNonUniformBitwiseXor 177 PartitionedReduceNV 1579 1580
+            1582:    136(ptr) AccessChain 37(data) 1576 135 40
+            1583: 30(int64_t) CompositeExtract 1581 0
+                              Store 1582 1583
+            1584:    136(ptr) AccessChain 37(data) 1576 135 188
+            1585: 30(int64_t) CompositeExtract 1581 1
+                              Store 1584 1585
+            1586:      6(int) Load 8(invocation)
+            1587:    141(ptr) AccessChain 37(data) 52 135
+            1588: 31(i64vec4) Load 1587
+            1589:146(i64vec3) VectorShuffle 1588 1588 0 1 2
+            1590:   17(ivec4) Load 19(ballot)
+            1591:146(i64vec3) GroupNonUniformBitwiseXor 177 PartitionedReduceNV 1589 1590
+            1592:    136(ptr) AccessChain 37(data) 1586 135 40
+            1593: 30(int64_t) CompositeExtract 1591 0
+                              Store 1592 1593
+            1594:    136(ptr) AccessChain 37(data) 1586 135 188
+            1595: 30(int64_t) CompositeExtract 1591 1
+                              Store 1594 1595
+            1596:    136(ptr) AccessChain 37(data) 1586 135 201
+            1597: 30(int64_t) CompositeExtract 1591 2
+                              Store 1596 1597
+            1598:      6(int) Load 8(invocation)
+            1599:    141(ptr) AccessChain 37(data) 58 135
+            1600: 31(i64vec4) Load 1599
+            1601:   17(ivec4) Load 19(ballot)
+            1602: 31(i64vec4) GroupNonUniformBitwiseXor 177 PartitionedReduceNV 1600 1601
+            1603:    141(ptr) AccessChain 37(data) 1598 135
+                              Store 1603 1602
+            1604:      6(int) Load 8(invocation)
+            1605:    155(ptr) AccessChain 37(data) 39 154 40
+            1606:32(float16_t) Load 1605
+            1607:   17(ivec4) Load 19(ballot)
+            1608:32(float16_t) GroupNonUniformFAdd 177 PartitionedReduceNV 1606 1607
+            1609:    155(ptr) AccessChain 37(data) 1604 154 40
+                              Store 1609 1608
+            1610:      6(int) Load 8(invocation)
+            1611:    160(ptr) AccessChain 37(data) 45 154
+            1612: 33(f16vec4) Load 1611
+            1613:159(f16vec2) VectorShuffle 1612 1612 0 1
+            1614:   17(ivec4) Load 19(ballot)
+            1615:159(f16vec2) GroupNonUniformFAdd 177 PartitionedReduceNV 1613 1614
+            1616:    155(ptr) AccessChain 37(data) 1610 154 40
+            1617:32(float16_t) CompositeExtract 1615 0
+                              Store 1616 1617
+            1618:    155(ptr) AccessChain 37(data) 1610 154 188
+            1619:32(float16_t) CompositeExtract 1615 1
+                              Store 1618 1619
+            1620:      6(int) Load 8(invocation)
+            1621:    160(ptr) AccessChain 37(data) 52 154
+            1622: 33(f16vec4) Load 1621
+            1623:165(f16vec3) VectorShuffle 1622 1622 0 1 2
+            1624:   17(ivec4) Load 19(ballot)
+            1625:165(f16vec3) GroupNonUniformFAdd 177 PartitionedReduceNV 1623 1624
+            1626:    155(ptr) AccessChain 37(data) 1620 154 40
+            1627:32(float16_t) CompositeExtract 1625 0
+                              Store 1626 1627
+            1628:    155(ptr) AccessChain 37(data) 1620 154 188
+            1629:32(float16_t) CompositeExtract 1625 1
+                              Store 1628 1629
+            1630:    155(ptr) AccessChain 37(data) 1620 154 201
+            1631:32(float16_t) CompositeExtract 1625 2
+                              Store 1630 1631
+            1632:      6(int) Load 8(invocation)
+            1633:    160(ptr) AccessChain 37(data) 58 154
+            1634: 33(f16vec4) Load 1633
+            1635:   17(ivec4) Load 19(ballot)
+            1636: 33(f16vec4) GroupNonUniformFAdd 177 PartitionedReduceNV 1634 1635
+            1637:    160(ptr) AccessChain 37(data) 1632 154
+                              Store 1637 1636
+            1638:      6(int) Load 8(invocation)
+            1639:    155(ptr) AccessChain 37(data) 39 154 40
+            1640:32(float16_t) Load 1639
+            1641:   17(ivec4) Load 19(ballot)
+            1642:32(float16_t) GroupNonUniformFMul 177 PartitionedReduceNV 1640 1641
+            1643:    155(ptr) AccessChain 37(data) 1638 154 40
+                              Store 1643 1642
+            1644:      6(int) Load 8(invocation)
+            1645:    160(ptr) AccessChain 37(data) 45 154
+            1646: 33(f16vec4) Load 1645
+            1647:159(f16vec2) VectorShuffle 1646 1646 0 1
+            1648:   17(ivec4) Load 19(ballot)
+            1649:159(f16vec2) GroupNonUniformFMul 177 PartitionedReduceNV 1647 1648
+            1650:    155(ptr) AccessChain 37(data) 1644 154 40
+            1651:32(float16_t) CompositeExtract 1649 0
+                              Store 1650 1651
+            1652:    155(ptr) AccessChain 37(data) 1644 154 188
+            1653:32(float16_t) CompositeExtract 1649 1
+                              Store 1652 1653
+            1654:      6(int) Load 8(invocation)
+            1655:    160(ptr) AccessChain 37(data) 52 154
+            1656: 33(f16vec4) Load 1655
+            1657:165(f16vec3) VectorShuffle 1656 1656 0 1 2
+            1658:   17(ivec4) Load 19(ballot)
+            1659:165(f16vec3) GroupNonUniformFMul 177 PartitionedReduceNV 1657 1658
+            1660:    155(ptr) AccessChain 37(data) 1654 154 40
+            1661:32(float16_t) CompositeExtract 1659 0
+                              Store 1660 1661
+            1662:    155(ptr) AccessChain 37(data) 1654 154 188
+            1663:32(float16_t) CompositeExtract 1659 1
+                              Store 1662 1663
+            1664:    155(ptr) AccessChain 37(data) 1654 154 201
+            1665:32(float16_t) CompositeExtract 1659 2
+                              Store 1664 1665
+            1666:      6(int) Load 8(invocation)
+            1667:    160(ptr) AccessChain 37(data) 58 154
+            1668: 33(f16vec4) Load 1667
+            1669:   17(ivec4) Load 19(ballot)
+            1670: 33(f16vec4) GroupNonUniformFMul 177 PartitionedReduceNV 1668 1669
+            1671:    160(ptr) AccessChain 37(data) 1666 154
+                              Store 1671 1670
+            1672:      6(int) Load 8(invocation)
+            1673:    155(ptr) AccessChain 37(data) 39 154 40
+            1674:32(float16_t) Load 1673
+            1675:   17(ivec4) Load 19(ballot)
+            1676:32(float16_t) GroupNonUniformFMin 177 PartitionedReduceNV 1674 1675
+            1677:    155(ptr) AccessChain 37(data) 1672 154 40
+                              Store 1677 1676
+            1678:      6(int) Load 8(invocation)
+            1679:    160(ptr) AccessChain 37(data) 45 154
+            1680: 33(f16vec4) Load 1679
+            1681:159(f16vec2) VectorShuffle 1680 1680 0 1
+            1682:   17(ivec4) Load 19(ballot)
+            1683:159(f16vec2) GroupNonUniformFMin 177 PartitionedReduceNV 1681 1682
+            1684:    155(ptr) AccessChain 37(data) 1678 154 40
+            1685:32(float16_t) CompositeExtract 1683 0
+                              Store 1684 1685
+            1686:    155(ptr) AccessChain 37(data) 1678 154 188
+            1687:32(float16_t) CompositeExtract 1683 1
+                              Store 1686 1687
+            1688:      6(int) Load 8(invocation)
+            1689:    160(ptr) AccessChain 37(data) 52 154
+            1690: 33(f16vec4) Load 1689
+            1691:165(f16vec3) VectorShuffle 1690 1690 0 1 2
+            1692:   17(ivec4) Load 19(ballot)
+            1693:165(f16vec3) GroupNonUniformFMin 177 PartitionedReduceNV 1691 1692
+            1694:    155(ptr) AccessChain 37(data) 1688 154 40
+            1695:32(float16_t) CompositeExtract 1693 0
+                              Store 1694 1695
+            1696:    155(ptr) AccessChain 37(data) 1688 154 188
+            1697:32(float16_t) CompositeExtract 1693 1
+                              Store 1696 1697
+            1698:    155(ptr) AccessChain 37(data) 1688 154 201
+            1699:32(float16_t) CompositeExtract 1693 2
+                              Store 1698 1699
+            1700:      6(int) Load 8(invocation)
+            1701:    160(ptr) AccessChain 37(data) 58 154
+            1702: 33(f16vec4) Load 1701
+            1703:   17(ivec4) Load 19(ballot)
+            1704: 33(f16vec4) GroupNonUniformFMin 177 PartitionedReduceNV 1702 1703
+            1705:    160(ptr) AccessChain 37(data) 1700 154
+                              Store 1705 1704
+            1706:      6(int) Load 8(invocation)
+            1707:    155(ptr) AccessChain 37(data) 39 154 40
+            1708:32(float16_t) Load 1707
+            1709:   17(ivec4) Load 19(ballot)
+            1710:32(float16_t) GroupNonUniformFMax 177 PartitionedReduceNV 1708 1709
+            1711:    155(ptr) AccessChain 37(data) 1706 154 40
+                              Store 1711 1710
+            1712:      6(int) Load 8(invocation)
+            1713:    160(ptr) AccessChain 37(data) 45 154
+            1714: 33(f16vec4) Load 1713
+            1715:159(f16vec2) VectorShuffle 1714 1714 0 1
+            1716:   17(ivec4) Load 19(ballot)
+            1717:159(f16vec2) GroupNonUniformFMax 177 PartitionedReduceNV 1715 1716
+            1718:    155(ptr) AccessChain 37(data) 1712 154 40
+            1719:32(float16_t) CompositeExtract 1717 0
+                              Store 1718 1719
+            1720:    155(ptr) AccessChain 37(data) 1712 154 188
+            1721:32(float16_t) CompositeExtract 1717 1
+                              Store 1720 1721
+            1722:      6(int) Load 8(invocation)
+            1723:    160(ptr) AccessChain 37(data) 52 154
+            1724: 33(f16vec4) Load 1723
+            1725:165(f16vec3) VectorShuffle 1724 1724 0 1 2
+            1726:   17(ivec4) Load 19(ballot)
+            1727:165(f16vec3) GroupNonUniformFMax 177 PartitionedReduceNV 1725 1726
+            1728:    155(ptr) AccessChain 37(data) 1722 154 40
+            1729:32(float16_t) CompositeExtract 1727 0
+                              Store 1728 1729
+            1730:    155(ptr) AccessChain 37(data) 1722 154 188
+            1731:32(float16_t) CompositeExtract 1727 1
+                              Store 1730 1731
+            1732:    155(ptr) AccessChain 37(data) 1722 154 201
+            1733:32(float16_t) CompositeExtract 1727 2
+                              Store 1732 1733
+            1734:      6(int) Load 8(invocation)
+            1735:    160(ptr) AccessChain 37(data) 58 154
+            1736: 33(f16vec4) Load 1735
+            1737:   17(ivec4) Load 19(ballot)
+            1738: 33(f16vec4) GroupNonUniformFMax 177 PartitionedReduceNV 1736 1737
+            1739:    160(ptr) AccessChain 37(data) 1734 154
+                              Store 1739 1738
                               Return
                               FunctionEnd
diff --git a/third_party/vulkan-deps/glslang/src/Test/baseResults/spv.subgroupExtendedTypesQuad.comp.out b/third_party/vulkan-deps/glslang/src/Test/baseResults/spv.subgroupExtendedTypesQuad.comp.out
index beec1ac..f385545 100644
--- a/third_party/vulkan-deps/glslang/src/Test/baseResults/spv.subgroupExtendedTypesQuad.comp.out
+++ b/third_party/vulkan-deps/glslang/src/Test/baseResults/spv.subgroupExtendedTypesQuad.comp.out
@@ -1,7 +1,7 @@
 spv.subgroupExtendedTypesQuad.comp
 // Module Version 10300
 // Generated by (magic number): 8000a
-// Id's are bound by 806
+// Id's are bound by 918
 
                               Capability Shader
                               Capability Float16
@@ -59,7 +59,7 @@
                               Decorate 31(Buffers) Block
                               Decorate 34(data) DescriptorSet 0
                               Decorate 34(data) Binding 0
-                              Decorate 805 BuiltIn WorkgroupSize
+                              Decorate 917 BuiltIn WorkgroupSize
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeInt 32 0
@@ -95,40 +95,40 @@
               47:     36(int) Constant 1
               48:             TypeVector 17(int8_t) 2
               49:             TypePointer StorageBuffer 18(i8vec4)
-              58:     36(int) Constant 2
-              59:             TypeVector 17(int8_t) 3
-              68:     36(int) Constant 3
-             128:      6(int) Constant 2
-             153:             TypePointer StorageBuffer 19(int8_t)
-             159:             TypeVector 19(int8_t) 2
-             160:             TypePointer StorageBuffer 20(i8vec4)
-             169:             TypeVector 19(int8_t) 3
-             261:             TypePointer StorageBuffer 21(int16_t)
-             267:             TypeVector 21(int16_t) 2
-             268:             TypePointer StorageBuffer 22(i16vec4)
-             277:             TypeVector 21(int16_t) 3
-             369:             TypePointer StorageBuffer 23(int16_t)
-             375:             TypeVector 23(int16_t) 2
-             376:             TypePointer StorageBuffer 24(i16vec4)
-             385:             TypeVector 23(int16_t) 3
-             477:     36(int) Constant 4
-             478:             TypePointer StorageBuffer 25(int64_t)
-             484:             TypeVector 25(int64_t) 2
-             485:             TypePointer StorageBuffer 26(i64vec4)
-             494:             TypeVector 25(int64_t) 3
-             586:     36(int) Constant 5
-             587:             TypePointer StorageBuffer 27(int64_t)
-             593:             TypeVector 27(int64_t) 2
-             594:             TypePointer StorageBuffer 28(i64vec4)
-             603:             TypeVector 27(int64_t) 3
-             695:     36(int) Constant 6
-             696:             TypePointer StorageBuffer 29(float16_t)
-             702:             TypeVector 29(float16_t) 2
-             703:             TypePointer StorageBuffer 30(f16vec4)
-             712:             TypeVector 29(float16_t) 3
-             803:             TypeVector 6(int) 3
-             804:      6(int) Constant 8
-             805:  803(ivec3) ConstantComposite 804 42 42
+              59:     36(int) Constant 2
+              60:             TypeVector 17(int8_t) 3
+              69:      6(int) Constant 2
+              73:     36(int) Constant 3
+             169:             TypePointer StorageBuffer 19(int8_t)
+             175:             TypeVector 19(int8_t) 2
+             176:             TypePointer StorageBuffer 20(i8vec4)
+             186:             TypeVector 19(int8_t) 3
+             293:             TypePointer StorageBuffer 21(int16_t)
+             299:             TypeVector 21(int16_t) 2
+             300:             TypePointer StorageBuffer 22(i16vec4)
+             310:             TypeVector 21(int16_t) 3
+             417:             TypePointer StorageBuffer 23(int16_t)
+             423:             TypeVector 23(int16_t) 2
+             424:             TypePointer StorageBuffer 24(i16vec4)
+             434:             TypeVector 23(int16_t) 3
+             541:     36(int) Constant 4
+             542:             TypePointer StorageBuffer 25(int64_t)
+             548:             TypeVector 25(int64_t) 2
+             549:             TypePointer StorageBuffer 26(i64vec4)
+             559:             TypeVector 25(int64_t) 3
+             666:     36(int) Constant 5
+             667:             TypePointer StorageBuffer 27(int64_t)
+             673:             TypeVector 27(int64_t) 2
+             674:             TypePointer StorageBuffer 28(i64vec4)
+             684:             TypeVector 27(int64_t) 3
+             791:     36(int) Constant 6
+             792:             TypePointer StorageBuffer 29(float16_t)
+             798:             TypeVector 29(float16_t) 2
+             799:             TypePointer StorageBuffer 30(f16vec4)
+             809:             TypeVector 29(float16_t) 3
+             915:             TypeVector 6(int) 3
+             916:      6(int) Constant 8
+             917:  915(ivec3) ConstantComposite 916 42 42
          4(main):           2 Function None 3
                5:             Label
    8(invocation):      7(ptr) Variable Function
@@ -148,834 +148,1030 @@
               51:  18(i8vec4) Load 50
               52:  48(i8vec2) VectorShuffle 51 51 0 1
               53:  48(i8vec2) GroupNonUniformQuadBroadcast 43 52 42
-              54:     49(ptr) AccessChain 34(data) 46 37
-              55:  18(i8vec4) Load 54
-              56:  18(i8vec4) VectorShuffle 55 53 4 5 2 3
-                              Store 54 56
-              57:      6(int) Load 8(invocation)
-              60:     49(ptr) AccessChain 34(data) 58 37
-              61:  18(i8vec4) Load 60
-              62:  59(i8vec3) VectorShuffle 61 61 0 1 2
-              63:  59(i8vec3) GroupNonUniformQuadBroadcast 43 62 42
-              64:     49(ptr) AccessChain 34(data) 57 37
-              65:  18(i8vec4) Load 64
-              66:  18(i8vec4) VectorShuffle 65 63 4 5 6 3
-                              Store 64 66
-              67:      6(int) Load 8(invocation)
-              69:     49(ptr) AccessChain 34(data) 68 37
-              70:  18(i8vec4) Load 69
-              71:  18(i8vec4) GroupNonUniformQuadBroadcast 43 70 42
-              72:     49(ptr) AccessChain 34(data) 67 37
-                              Store 72 71
-              73:      6(int) Load 8(invocation)
-              74:     39(ptr) AccessChain 34(data) 37 37 38
-              75:  17(int8_t) Load 74
-              76:  17(int8_t) GroupNonUniformQuadSwap 43 75 38
-              77:     39(ptr) AccessChain 34(data) 73 37 38
+              54:     39(ptr) AccessChain 34(data) 46 37 38
+              55:  17(int8_t) CompositeExtract 53 0
+                              Store 54 55
+              56:     39(ptr) AccessChain 34(data) 46 37 42
+              57:  17(int8_t) CompositeExtract 53 1
+                              Store 56 57
+              58:      6(int) Load 8(invocation)
+              61:     49(ptr) AccessChain 34(data) 59 37
+              62:  18(i8vec4) Load 61
+              63:  60(i8vec3) VectorShuffle 62 62 0 1 2
+              64:  60(i8vec3) GroupNonUniformQuadBroadcast 43 63 42
+              65:     39(ptr) AccessChain 34(data) 58 37 38
+              66:  17(int8_t) CompositeExtract 64 0
+                              Store 65 66
+              67:     39(ptr) AccessChain 34(data) 58 37 42
+              68:  17(int8_t) CompositeExtract 64 1
+                              Store 67 68
+              70:     39(ptr) AccessChain 34(data) 58 37 69
+              71:  17(int8_t) CompositeExtract 64 2
+                              Store 70 71
+              72:      6(int) Load 8(invocation)
+              74:     49(ptr) AccessChain 34(data) 73 37
+              75:  18(i8vec4) Load 74
+              76:  18(i8vec4) GroupNonUniformQuadBroadcast 43 75 42
+              77:     49(ptr) AccessChain 34(data) 72 37
                               Store 77 76
               78:      6(int) Load 8(invocation)
-              79:     49(ptr) AccessChain 34(data) 47 37
-              80:  18(i8vec4) Load 79
-              81:  48(i8vec2) VectorShuffle 80 80 0 1
-              82:  48(i8vec2) GroupNonUniformQuadSwap 43 81 38
-              83:     49(ptr) AccessChain 34(data) 78 37
-              84:  18(i8vec4) Load 83
-              85:  18(i8vec4) VectorShuffle 84 82 4 5 2 3
-                              Store 83 85
-              86:      6(int) Load 8(invocation)
-              87:     49(ptr) AccessChain 34(data) 58 37
-              88:  18(i8vec4) Load 87
-              89:  59(i8vec3) VectorShuffle 88 88 0 1 2
-              90:  59(i8vec3) GroupNonUniformQuadSwap 43 89 38
-              91:     49(ptr) AccessChain 34(data) 86 37
-              92:  18(i8vec4) Load 91
-              93:  18(i8vec4) VectorShuffle 92 90 4 5 6 3
-                              Store 91 93
-              94:      6(int) Load 8(invocation)
-              95:     49(ptr) AccessChain 34(data) 68 37
-              96:  18(i8vec4) Load 95
-              97:  18(i8vec4) GroupNonUniformQuadSwap 43 96 38
-              98:     49(ptr) AccessChain 34(data) 94 37
-                              Store 98 97
-              99:      6(int) Load 8(invocation)
-             100:     39(ptr) AccessChain 34(data) 37 37 38
-             101:  17(int8_t) Load 100
-             102:  17(int8_t) GroupNonUniformQuadSwap 43 101 42
-             103:     39(ptr) AccessChain 34(data) 99 37 38
-                              Store 103 102
-             104:      6(int) Load 8(invocation)
-             105:     49(ptr) AccessChain 34(data) 47 37
-             106:  18(i8vec4) Load 105
-             107:  48(i8vec2) VectorShuffle 106 106 0 1
-             108:  48(i8vec2) GroupNonUniformQuadSwap 43 107 42
-             109:     49(ptr) AccessChain 34(data) 104 37
-             110:  18(i8vec4) Load 109
-             111:  18(i8vec4) VectorShuffle 110 108 4 5 2 3
-                              Store 109 111
-             112:      6(int) Load 8(invocation)
-             113:     49(ptr) AccessChain 34(data) 58 37
-             114:  18(i8vec4) Load 113
-             115:  59(i8vec3) VectorShuffle 114 114 0 1 2
-             116:  59(i8vec3) GroupNonUniformQuadSwap 43 115 42
-             117:     49(ptr) AccessChain 34(data) 112 37
-             118:  18(i8vec4) Load 117
-             119:  18(i8vec4) VectorShuffle 118 116 4 5 6 3
-                              Store 117 119
-             120:      6(int) Load 8(invocation)
-             121:     49(ptr) AccessChain 34(data) 68 37
-             122:  18(i8vec4) Load 121
-             123:  18(i8vec4) GroupNonUniformQuadSwap 43 122 42
-             124:     49(ptr) AccessChain 34(data) 120 37
-                              Store 124 123
-             125:      6(int) Load 8(invocation)
-             126:     39(ptr) AccessChain 34(data) 37 37 38
-             127:  17(int8_t) Load 126
-             129:  17(int8_t) GroupNonUniformQuadSwap 43 127 128
-             130:     39(ptr) AccessChain 34(data) 125 37 38
-                              Store 130 129
-             131:      6(int) Load 8(invocation)
-             132:     49(ptr) AccessChain 34(data) 47 37
-             133:  18(i8vec4) Load 132
-             134:  48(i8vec2) VectorShuffle 133 133 0 1
-             135:  48(i8vec2) GroupNonUniformQuadSwap 43 134 128
-             136:     49(ptr) AccessChain 34(data) 131 37
-             137:  18(i8vec4) Load 136
-             138:  18(i8vec4) VectorShuffle 137 135 4 5 2 3
-                              Store 136 138
-             139:      6(int) Load 8(invocation)
-             140:     49(ptr) AccessChain 34(data) 58 37
-             141:  18(i8vec4) Load 140
-             142:  59(i8vec3) VectorShuffle 141 141 0 1 2
-             143:  59(i8vec3) GroupNonUniformQuadSwap 43 142 128
-             144:     49(ptr) AccessChain 34(data) 139 37
+              79:     39(ptr) AccessChain 34(data) 37 37 38
+              80:  17(int8_t) Load 79
+              81:  17(int8_t) GroupNonUniformQuadSwap 43 80 38
+              82:     39(ptr) AccessChain 34(data) 78 37 38
+                              Store 82 81
+              83:      6(int) Load 8(invocation)
+              84:     49(ptr) AccessChain 34(data) 47 37
+              85:  18(i8vec4) Load 84
+              86:  48(i8vec2) VectorShuffle 85 85 0 1
+              87:  48(i8vec2) GroupNonUniformQuadSwap 43 86 38
+              88:     39(ptr) AccessChain 34(data) 83 37 38
+              89:  17(int8_t) CompositeExtract 87 0
+                              Store 88 89
+              90:     39(ptr) AccessChain 34(data) 83 37 42
+              91:  17(int8_t) CompositeExtract 87 1
+                              Store 90 91
+              92:      6(int) Load 8(invocation)
+              93:     49(ptr) AccessChain 34(data) 59 37
+              94:  18(i8vec4) Load 93
+              95:  60(i8vec3) VectorShuffle 94 94 0 1 2
+              96:  60(i8vec3) GroupNonUniformQuadSwap 43 95 38
+              97:     39(ptr) AccessChain 34(data) 92 37 38
+              98:  17(int8_t) CompositeExtract 96 0
+                              Store 97 98
+              99:     39(ptr) AccessChain 34(data) 92 37 42
+             100:  17(int8_t) CompositeExtract 96 1
+                              Store 99 100
+             101:     39(ptr) AccessChain 34(data) 92 37 69
+             102:  17(int8_t) CompositeExtract 96 2
+                              Store 101 102
+             103:      6(int) Load 8(invocation)
+             104:     49(ptr) AccessChain 34(data) 73 37
+             105:  18(i8vec4) Load 104
+             106:  18(i8vec4) GroupNonUniformQuadSwap 43 105 38
+             107:     49(ptr) AccessChain 34(data) 103 37
+                              Store 107 106
+             108:      6(int) Load 8(invocation)
+             109:     39(ptr) AccessChain 34(data) 37 37 38
+             110:  17(int8_t) Load 109
+             111:  17(int8_t) GroupNonUniformQuadSwap 43 110 42
+             112:     39(ptr) AccessChain 34(data) 108 37 38
+                              Store 112 111
+             113:      6(int) Load 8(invocation)
+             114:     49(ptr) AccessChain 34(data) 47 37
+             115:  18(i8vec4) Load 114
+             116:  48(i8vec2) VectorShuffle 115 115 0 1
+             117:  48(i8vec2) GroupNonUniformQuadSwap 43 116 42
+             118:     39(ptr) AccessChain 34(data) 113 37 38
+             119:  17(int8_t) CompositeExtract 117 0
+                              Store 118 119
+             120:     39(ptr) AccessChain 34(data) 113 37 42
+             121:  17(int8_t) CompositeExtract 117 1
+                              Store 120 121
+             122:      6(int) Load 8(invocation)
+             123:     49(ptr) AccessChain 34(data) 59 37
+             124:  18(i8vec4) Load 123
+             125:  60(i8vec3) VectorShuffle 124 124 0 1 2
+             126:  60(i8vec3) GroupNonUniformQuadSwap 43 125 42
+             127:     39(ptr) AccessChain 34(data) 122 37 38
+             128:  17(int8_t) CompositeExtract 126 0
+                              Store 127 128
+             129:     39(ptr) AccessChain 34(data) 122 37 42
+             130:  17(int8_t) CompositeExtract 126 1
+                              Store 129 130
+             131:     39(ptr) AccessChain 34(data) 122 37 69
+             132:  17(int8_t) CompositeExtract 126 2
+                              Store 131 132
+             133:      6(int) Load 8(invocation)
+             134:     49(ptr) AccessChain 34(data) 73 37
+             135:  18(i8vec4) Load 134
+             136:  18(i8vec4) GroupNonUniformQuadSwap 43 135 42
+             137:     49(ptr) AccessChain 34(data) 133 37
+                              Store 137 136
+             138:      6(int) Load 8(invocation)
+             139:     39(ptr) AccessChain 34(data) 37 37 38
+             140:  17(int8_t) Load 139
+             141:  17(int8_t) GroupNonUniformQuadSwap 43 140 69
+             142:     39(ptr) AccessChain 34(data) 138 37 38
+                              Store 142 141
+             143:      6(int) Load 8(invocation)
+             144:     49(ptr) AccessChain 34(data) 47 37
              145:  18(i8vec4) Load 144
-             146:  18(i8vec4) VectorShuffle 145 143 4 5 6 3
-                              Store 144 146
-             147:      6(int) Load 8(invocation)
-             148:     49(ptr) AccessChain 34(data) 68 37
-             149:  18(i8vec4) Load 148
-             150:  18(i8vec4) GroupNonUniformQuadSwap 43 149 128
-             151:     49(ptr) AccessChain 34(data) 147 37
-                              Store 151 150
+             146:  48(i8vec2) VectorShuffle 145 145 0 1
+             147:  48(i8vec2) GroupNonUniformQuadSwap 43 146 69
+             148:     39(ptr) AccessChain 34(data) 143 37 38
+             149:  17(int8_t) CompositeExtract 147 0
+                              Store 148 149
+             150:     39(ptr) AccessChain 34(data) 143 37 42
+             151:  17(int8_t) CompositeExtract 147 1
+                              Store 150 151
              152:      6(int) Load 8(invocation)
-             154:    153(ptr) AccessChain 34(data) 37 47 38
-             155:  19(int8_t) Load 154
-             156:  19(int8_t) GroupNonUniformQuadBroadcast 43 155 42
-             157:    153(ptr) AccessChain 34(data) 152 47 38
-                              Store 157 156
-             158:      6(int) Load 8(invocation)
-             161:    160(ptr) AccessChain 34(data) 47 47
-             162:  20(i8vec4) Load 161
-             163: 159(i8vec2) VectorShuffle 162 162 0 1
-             164: 159(i8vec2) GroupNonUniformQuadBroadcast 43 163 42
-             165:    160(ptr) AccessChain 34(data) 158 47
-             166:  20(i8vec4) Load 165
-             167:  20(i8vec4) VectorShuffle 166 164 4 5 2 3
-                              Store 165 167
+             153:     49(ptr) AccessChain 34(data) 59 37
+             154:  18(i8vec4) Load 153
+             155:  60(i8vec3) VectorShuffle 154 154 0 1 2
+             156:  60(i8vec3) GroupNonUniformQuadSwap 43 155 69
+             157:     39(ptr) AccessChain 34(data) 152 37 38
+             158:  17(int8_t) CompositeExtract 156 0
+                              Store 157 158
+             159:     39(ptr) AccessChain 34(data) 152 37 42
+             160:  17(int8_t) CompositeExtract 156 1
+                              Store 159 160
+             161:     39(ptr) AccessChain 34(data) 152 37 69
+             162:  17(int8_t) CompositeExtract 156 2
+                              Store 161 162
+             163:      6(int) Load 8(invocation)
+             164:     49(ptr) AccessChain 34(data) 73 37
+             165:  18(i8vec4) Load 164
+             166:  18(i8vec4) GroupNonUniformQuadSwap 43 165 69
+             167:     49(ptr) AccessChain 34(data) 163 37
+                              Store 167 166
              168:      6(int) Load 8(invocation)
-             170:    160(ptr) AccessChain 34(data) 58 47
-             171:  20(i8vec4) Load 170
-             172: 169(i8vec3) VectorShuffle 171 171 0 1 2
-             173: 169(i8vec3) GroupNonUniformQuadBroadcast 43 172 42
-             174:    160(ptr) AccessChain 34(data) 168 47
-             175:  20(i8vec4) Load 174
-             176:  20(i8vec4) VectorShuffle 175 173 4 5 6 3
-                              Store 174 176
-             177:      6(int) Load 8(invocation)
-             178:    160(ptr) AccessChain 34(data) 68 47
-             179:  20(i8vec4) Load 178
-             180:  20(i8vec4) GroupNonUniformQuadBroadcast 43 179 42
-             181:    160(ptr) AccessChain 34(data) 177 47
-                              Store 181 180
-             182:      6(int) Load 8(invocation)
-             183:    153(ptr) AccessChain 34(data) 37 47 38
-             184:  19(int8_t) Load 183
-             185:  19(int8_t) GroupNonUniformQuadSwap 43 184 38
-             186:    153(ptr) AccessChain 34(data) 182 47 38
-                              Store 186 185
-             187:      6(int) Load 8(invocation)
-             188:    160(ptr) AccessChain 34(data) 47 47
-             189:  20(i8vec4) Load 188
-             190: 159(i8vec2) VectorShuffle 189 189 0 1
-             191: 159(i8vec2) GroupNonUniformQuadSwap 43 190 38
-             192:    160(ptr) AccessChain 34(data) 187 47
-             193:  20(i8vec4) Load 192
-             194:  20(i8vec4) VectorShuffle 193 191 4 5 2 3
-                              Store 192 194
-             195:      6(int) Load 8(invocation)
-             196:    160(ptr) AccessChain 34(data) 58 47
-             197:  20(i8vec4) Load 196
-             198: 169(i8vec3) VectorShuffle 197 197 0 1 2
-             199: 169(i8vec3) GroupNonUniformQuadSwap 43 198 38
-             200:    160(ptr) AccessChain 34(data) 195 47
-             201:  20(i8vec4) Load 200
-             202:  20(i8vec4) VectorShuffle 201 199 4 5 6 3
-                              Store 200 202
-             203:      6(int) Load 8(invocation)
-             204:    160(ptr) AccessChain 34(data) 68 47
-             205:  20(i8vec4) Load 204
-             206:  20(i8vec4) GroupNonUniformQuadSwap 43 205 38
-             207:    160(ptr) AccessChain 34(data) 203 47
-                              Store 207 206
-             208:      6(int) Load 8(invocation)
-             209:    153(ptr) AccessChain 34(data) 37 47 38
-             210:  19(int8_t) Load 209
-             211:  19(int8_t) GroupNonUniformQuadSwap 43 210 42
-             212:    153(ptr) AccessChain 34(data) 208 47 38
-                              Store 212 211
-             213:      6(int) Load 8(invocation)
-             214:    160(ptr) AccessChain 34(data) 47 47
-             215:  20(i8vec4) Load 214
-             216: 159(i8vec2) VectorShuffle 215 215 0 1
-             217: 159(i8vec2) GroupNonUniformQuadSwap 43 216 42
-             218:    160(ptr) AccessChain 34(data) 213 47
-             219:  20(i8vec4) Load 218
-             220:  20(i8vec4) VectorShuffle 219 217 4 5 2 3
-                              Store 218 220
-             221:      6(int) Load 8(invocation)
-             222:    160(ptr) AccessChain 34(data) 58 47
-             223:  20(i8vec4) Load 222
-             224: 169(i8vec3) VectorShuffle 223 223 0 1 2
-             225: 169(i8vec3) GroupNonUniformQuadSwap 43 224 42
-             226:    160(ptr) AccessChain 34(data) 221 47
-             227:  20(i8vec4) Load 226
-             228:  20(i8vec4) VectorShuffle 227 225 4 5 6 3
-                              Store 226 228
-             229:      6(int) Load 8(invocation)
-             230:    160(ptr) AccessChain 34(data) 68 47
-             231:  20(i8vec4) Load 230
-             232:  20(i8vec4) GroupNonUniformQuadSwap 43 231 42
-             233:    160(ptr) AccessChain 34(data) 229 47
-                              Store 233 232
-             234:      6(int) Load 8(invocation)
-             235:    153(ptr) AccessChain 34(data) 37 47 38
-             236:  19(int8_t) Load 235
-             237:  19(int8_t) GroupNonUniformQuadSwap 43 236 128
-             238:    153(ptr) AccessChain 34(data) 234 47 38
-                              Store 238 237
-             239:      6(int) Load 8(invocation)
-             240:    160(ptr) AccessChain 34(data) 47 47
-             241:  20(i8vec4) Load 240
-             242: 159(i8vec2) VectorShuffle 241 241 0 1
-             243: 159(i8vec2) GroupNonUniformQuadSwap 43 242 128
-             244:    160(ptr) AccessChain 34(data) 239 47
-             245:  20(i8vec4) Load 244
-             246:  20(i8vec4) VectorShuffle 245 243 4 5 2 3
-                              Store 244 246
-             247:      6(int) Load 8(invocation)
-             248:    160(ptr) AccessChain 34(data) 58 47
-             249:  20(i8vec4) Load 248
-             250: 169(i8vec3) VectorShuffle 249 249 0 1 2
-             251: 169(i8vec3) GroupNonUniformQuadSwap 43 250 128
-             252:    160(ptr) AccessChain 34(data) 247 47
-             253:  20(i8vec4) Load 252
-             254:  20(i8vec4) VectorShuffle 253 251 4 5 6 3
-                              Store 252 254
-             255:      6(int) Load 8(invocation)
-             256:    160(ptr) AccessChain 34(data) 68 47
-             257:  20(i8vec4) Load 256
-             258:  20(i8vec4) GroupNonUniformQuadSwap 43 257 128
-             259:    160(ptr) AccessChain 34(data) 255 47
-                              Store 259 258
-             260:      6(int) Load 8(invocation)
-             262:    261(ptr) AccessChain 34(data) 37 58 38
-             263: 21(int16_t) Load 262
-             264: 21(int16_t) GroupNonUniformQuadBroadcast 43 263 42
-             265:    261(ptr) AccessChain 34(data) 260 58 38
-                              Store 265 264
-             266:      6(int) Load 8(invocation)
-             269:    268(ptr) AccessChain 34(data) 47 58
-             270: 22(i16vec4) Load 269
-             271:267(i16vec2) VectorShuffle 270 270 0 1
-             272:267(i16vec2) GroupNonUniformQuadBroadcast 43 271 42
-             273:    268(ptr) AccessChain 34(data) 266 58
-             274: 22(i16vec4) Load 273
-             275: 22(i16vec4) VectorShuffle 274 272 4 5 2 3
-                              Store 273 275
+             170:    169(ptr) AccessChain 34(data) 37 47 38
+             171:  19(int8_t) Load 170
+             172:  19(int8_t) GroupNonUniformQuadBroadcast 43 171 42
+             173:    169(ptr) AccessChain 34(data) 168 47 38
+                              Store 173 172
+             174:      6(int) Load 8(invocation)
+             177:    176(ptr) AccessChain 34(data) 47 47
+             178:  20(i8vec4) Load 177
+             179: 175(i8vec2) VectorShuffle 178 178 0 1
+             180: 175(i8vec2) GroupNonUniformQuadBroadcast 43 179 42
+             181:    169(ptr) AccessChain 34(data) 174 47 38
+             182:  19(int8_t) CompositeExtract 180 0
+                              Store 181 182
+             183:    169(ptr) AccessChain 34(data) 174 47 42
+             184:  19(int8_t) CompositeExtract 180 1
+                              Store 183 184
+             185:      6(int) Load 8(invocation)
+             187:    176(ptr) AccessChain 34(data) 59 47
+             188:  20(i8vec4) Load 187
+             189: 186(i8vec3) VectorShuffle 188 188 0 1 2
+             190: 186(i8vec3) GroupNonUniformQuadBroadcast 43 189 42
+             191:    169(ptr) AccessChain 34(data) 185 47 38
+             192:  19(int8_t) CompositeExtract 190 0
+                              Store 191 192
+             193:    169(ptr) AccessChain 34(data) 185 47 42
+             194:  19(int8_t) CompositeExtract 190 1
+                              Store 193 194
+             195:    169(ptr) AccessChain 34(data) 185 47 69
+             196:  19(int8_t) CompositeExtract 190 2
+                              Store 195 196
+             197:      6(int) Load 8(invocation)
+             198:    176(ptr) AccessChain 34(data) 73 47
+             199:  20(i8vec4) Load 198
+             200:  20(i8vec4) GroupNonUniformQuadBroadcast 43 199 42
+             201:    176(ptr) AccessChain 34(data) 197 47
+                              Store 201 200
+             202:      6(int) Load 8(invocation)
+             203:    169(ptr) AccessChain 34(data) 37 47 38
+             204:  19(int8_t) Load 203
+             205:  19(int8_t) GroupNonUniformQuadSwap 43 204 38
+             206:    169(ptr) AccessChain 34(data) 202 47 38
+                              Store 206 205
+             207:      6(int) Load 8(invocation)
+             208:    176(ptr) AccessChain 34(data) 47 47
+             209:  20(i8vec4) Load 208
+             210: 175(i8vec2) VectorShuffle 209 209 0 1
+             211: 175(i8vec2) GroupNonUniformQuadSwap 43 210 38
+             212:    169(ptr) AccessChain 34(data) 207 47 38
+             213:  19(int8_t) CompositeExtract 211 0
+                              Store 212 213
+             214:    169(ptr) AccessChain 34(data) 207 47 42
+             215:  19(int8_t) CompositeExtract 211 1
+                              Store 214 215
+             216:      6(int) Load 8(invocation)
+             217:    176(ptr) AccessChain 34(data) 59 47
+             218:  20(i8vec4) Load 217
+             219: 186(i8vec3) VectorShuffle 218 218 0 1 2
+             220: 186(i8vec3) GroupNonUniformQuadSwap 43 219 38
+             221:    169(ptr) AccessChain 34(data) 216 47 38
+             222:  19(int8_t) CompositeExtract 220 0
+                              Store 221 222
+             223:    169(ptr) AccessChain 34(data) 216 47 42
+             224:  19(int8_t) CompositeExtract 220 1
+                              Store 223 224
+             225:    169(ptr) AccessChain 34(data) 216 47 69
+             226:  19(int8_t) CompositeExtract 220 2
+                              Store 225 226
+             227:      6(int) Load 8(invocation)
+             228:    176(ptr) AccessChain 34(data) 73 47
+             229:  20(i8vec4) Load 228
+             230:  20(i8vec4) GroupNonUniformQuadSwap 43 229 38
+             231:    176(ptr) AccessChain 34(data) 227 47
+                              Store 231 230
+             232:      6(int) Load 8(invocation)
+             233:    169(ptr) AccessChain 34(data) 37 47 38
+             234:  19(int8_t) Load 233
+             235:  19(int8_t) GroupNonUniformQuadSwap 43 234 42
+             236:    169(ptr) AccessChain 34(data) 232 47 38
+                              Store 236 235
+             237:      6(int) Load 8(invocation)
+             238:    176(ptr) AccessChain 34(data) 47 47
+             239:  20(i8vec4) Load 238
+             240: 175(i8vec2) VectorShuffle 239 239 0 1
+             241: 175(i8vec2) GroupNonUniformQuadSwap 43 240 42
+             242:    169(ptr) AccessChain 34(data) 237 47 38
+             243:  19(int8_t) CompositeExtract 241 0
+                              Store 242 243
+             244:    169(ptr) AccessChain 34(data) 237 47 42
+             245:  19(int8_t) CompositeExtract 241 1
+                              Store 244 245
+             246:      6(int) Load 8(invocation)
+             247:    176(ptr) AccessChain 34(data) 59 47
+             248:  20(i8vec4) Load 247
+             249: 186(i8vec3) VectorShuffle 248 248 0 1 2
+             250: 186(i8vec3) GroupNonUniformQuadSwap 43 249 42
+             251:    169(ptr) AccessChain 34(data) 246 47 38
+             252:  19(int8_t) CompositeExtract 250 0
+                              Store 251 252
+             253:    169(ptr) AccessChain 34(data) 246 47 42
+             254:  19(int8_t) CompositeExtract 250 1
+                              Store 253 254
+             255:    169(ptr) AccessChain 34(data) 246 47 69
+             256:  19(int8_t) CompositeExtract 250 2
+                              Store 255 256
+             257:      6(int) Load 8(invocation)
+             258:    176(ptr) AccessChain 34(data) 73 47
+             259:  20(i8vec4) Load 258
+             260:  20(i8vec4) GroupNonUniformQuadSwap 43 259 42
+             261:    176(ptr) AccessChain 34(data) 257 47
+                              Store 261 260
+             262:      6(int) Load 8(invocation)
+             263:    169(ptr) AccessChain 34(data) 37 47 38
+             264:  19(int8_t) Load 263
+             265:  19(int8_t) GroupNonUniformQuadSwap 43 264 69
+             266:    169(ptr) AccessChain 34(data) 262 47 38
+                              Store 266 265
+             267:      6(int) Load 8(invocation)
+             268:    176(ptr) AccessChain 34(data) 47 47
+             269:  20(i8vec4) Load 268
+             270: 175(i8vec2) VectorShuffle 269 269 0 1
+             271: 175(i8vec2) GroupNonUniformQuadSwap 43 270 69
+             272:    169(ptr) AccessChain 34(data) 267 47 38
+             273:  19(int8_t) CompositeExtract 271 0
+                              Store 272 273
+             274:    169(ptr) AccessChain 34(data) 267 47 42
+             275:  19(int8_t) CompositeExtract 271 1
+                              Store 274 275
              276:      6(int) Load 8(invocation)
-             278:    268(ptr) AccessChain 34(data) 58 58
-             279: 22(i16vec4) Load 278
-             280:277(i16vec3) VectorShuffle 279 279 0 1 2
-             281:277(i16vec3) GroupNonUniformQuadBroadcast 43 280 42
-             282:    268(ptr) AccessChain 34(data) 276 58
-             283: 22(i16vec4) Load 282
-             284: 22(i16vec4) VectorShuffle 283 281 4 5 6 3
-                              Store 282 284
-             285:      6(int) Load 8(invocation)
-             286:    268(ptr) AccessChain 34(data) 68 58
-             287: 22(i16vec4) Load 286
-             288: 22(i16vec4) GroupNonUniformQuadBroadcast 43 287 42
-             289:    268(ptr) AccessChain 34(data) 285 58
-                              Store 289 288
-             290:      6(int) Load 8(invocation)
-             291:    261(ptr) AccessChain 34(data) 37 58 38
-             292: 21(int16_t) Load 291
-             293: 21(int16_t) GroupNonUniformQuadSwap 43 292 38
-             294:    261(ptr) AccessChain 34(data) 290 58 38
-                              Store 294 293
-             295:      6(int) Load 8(invocation)
-             296:    268(ptr) AccessChain 34(data) 47 58
-             297: 22(i16vec4) Load 296
-             298:267(i16vec2) VectorShuffle 297 297 0 1
-             299:267(i16vec2) GroupNonUniformQuadSwap 43 298 38
-             300:    268(ptr) AccessChain 34(data) 295 58
-             301: 22(i16vec4) Load 300
-             302: 22(i16vec4) VectorShuffle 301 299 4 5 2 3
-                              Store 300 302
-             303:      6(int) Load 8(invocation)
-             304:    268(ptr) AccessChain 34(data) 58 58
-             305: 22(i16vec4) Load 304
-             306:277(i16vec3) VectorShuffle 305 305 0 1 2
-             307:277(i16vec3) GroupNonUniformQuadSwap 43 306 38
-             308:    268(ptr) AccessChain 34(data) 303 58
-             309: 22(i16vec4) Load 308
-             310: 22(i16vec4) VectorShuffle 309 307 4 5 6 3
-                              Store 308 310
-             311:      6(int) Load 8(invocation)
-             312:    268(ptr) AccessChain 34(data) 68 58
-             313: 22(i16vec4) Load 312
-             314: 22(i16vec4) GroupNonUniformQuadSwap 43 313 38
-             315:    268(ptr) AccessChain 34(data) 311 58
-                              Store 315 314
-             316:      6(int) Load 8(invocation)
-             317:    261(ptr) AccessChain 34(data) 37 58 38
-             318: 21(int16_t) Load 317
-             319: 21(int16_t) GroupNonUniformQuadSwap 43 318 42
-             320:    261(ptr) AccessChain 34(data) 316 58 38
-                              Store 320 319
+             277:    176(ptr) AccessChain 34(data) 59 47
+             278:  20(i8vec4) Load 277
+             279: 186(i8vec3) VectorShuffle 278 278 0 1 2
+             280: 186(i8vec3) GroupNonUniformQuadSwap 43 279 69
+             281:    169(ptr) AccessChain 34(data) 276 47 38
+             282:  19(int8_t) CompositeExtract 280 0
+                              Store 281 282
+             283:    169(ptr) AccessChain 34(data) 276 47 42
+             284:  19(int8_t) CompositeExtract 280 1
+                              Store 283 284
+             285:    169(ptr) AccessChain 34(data) 276 47 69
+             286:  19(int8_t) CompositeExtract 280 2
+                              Store 285 286
+             287:      6(int) Load 8(invocation)
+             288:    176(ptr) AccessChain 34(data) 73 47
+             289:  20(i8vec4) Load 288
+             290:  20(i8vec4) GroupNonUniformQuadSwap 43 289 69
+             291:    176(ptr) AccessChain 34(data) 287 47
+                              Store 291 290
+             292:      6(int) Load 8(invocation)
+             294:    293(ptr) AccessChain 34(data) 37 59 38
+             295: 21(int16_t) Load 294
+             296: 21(int16_t) GroupNonUniformQuadBroadcast 43 295 42
+             297:    293(ptr) AccessChain 34(data) 292 59 38
+                              Store 297 296
+             298:      6(int) Load 8(invocation)
+             301:    300(ptr) AccessChain 34(data) 47 59
+             302: 22(i16vec4) Load 301
+             303:299(i16vec2) VectorShuffle 302 302 0 1
+             304:299(i16vec2) GroupNonUniformQuadBroadcast 43 303 42
+             305:    293(ptr) AccessChain 34(data) 298 59 38
+             306: 21(int16_t) CompositeExtract 304 0
+                              Store 305 306
+             307:    293(ptr) AccessChain 34(data) 298 59 42
+             308: 21(int16_t) CompositeExtract 304 1
+                              Store 307 308
+             309:      6(int) Load 8(invocation)
+             311:    300(ptr) AccessChain 34(data) 59 59
+             312: 22(i16vec4) Load 311
+             313:310(i16vec3) VectorShuffle 312 312 0 1 2
+             314:310(i16vec3) GroupNonUniformQuadBroadcast 43 313 42
+             315:    293(ptr) AccessChain 34(data) 309 59 38
+             316: 21(int16_t) CompositeExtract 314 0
+                              Store 315 316
+             317:    293(ptr) AccessChain 34(data) 309 59 42
+             318: 21(int16_t) CompositeExtract 314 1
+                              Store 317 318
+             319:    293(ptr) AccessChain 34(data) 309 59 69
+             320: 21(int16_t) CompositeExtract 314 2
+                              Store 319 320
              321:      6(int) Load 8(invocation)
-             322:    268(ptr) AccessChain 34(data) 47 58
+             322:    300(ptr) AccessChain 34(data) 73 59
              323: 22(i16vec4) Load 322
-             324:267(i16vec2) VectorShuffle 323 323 0 1
-             325:267(i16vec2) GroupNonUniformQuadSwap 43 324 42
-             326:    268(ptr) AccessChain 34(data) 321 58
-             327: 22(i16vec4) Load 326
-             328: 22(i16vec4) VectorShuffle 327 325 4 5 2 3
-                              Store 326 328
-             329:      6(int) Load 8(invocation)
-             330:    268(ptr) AccessChain 34(data) 58 58
-             331: 22(i16vec4) Load 330
-             332:277(i16vec3) VectorShuffle 331 331 0 1 2
-             333:277(i16vec3) GroupNonUniformQuadSwap 43 332 42
-             334:    268(ptr) AccessChain 34(data) 329 58
-             335: 22(i16vec4) Load 334
-             336: 22(i16vec4) VectorShuffle 335 333 4 5 6 3
-                              Store 334 336
-             337:      6(int) Load 8(invocation)
-             338:    268(ptr) AccessChain 34(data) 68 58
-             339: 22(i16vec4) Load 338
-             340: 22(i16vec4) GroupNonUniformQuadSwap 43 339 42
-             341:    268(ptr) AccessChain 34(data) 337 58
-                              Store 341 340
-             342:      6(int) Load 8(invocation)
-             343:    261(ptr) AccessChain 34(data) 37 58 38
-             344: 21(int16_t) Load 343
-             345: 21(int16_t) GroupNonUniformQuadSwap 43 344 128
-             346:    261(ptr) AccessChain 34(data) 342 58 38
-                              Store 346 345
-             347:      6(int) Load 8(invocation)
-             348:    268(ptr) AccessChain 34(data) 47 58
-             349: 22(i16vec4) Load 348
-             350:267(i16vec2) VectorShuffle 349 349 0 1
-             351:267(i16vec2) GroupNonUniformQuadSwap 43 350 128
-             352:    268(ptr) AccessChain 34(data) 347 58
+             324: 22(i16vec4) GroupNonUniformQuadBroadcast 43 323 42
+             325:    300(ptr) AccessChain 34(data) 321 59
+                              Store 325 324
+             326:      6(int) Load 8(invocation)
+             327:    293(ptr) AccessChain 34(data) 37 59 38
+             328: 21(int16_t) Load 327
+             329: 21(int16_t) GroupNonUniformQuadSwap 43 328 38
+             330:    293(ptr) AccessChain 34(data) 326 59 38
+                              Store 330 329
+             331:      6(int) Load 8(invocation)
+             332:    300(ptr) AccessChain 34(data) 47 59
+             333: 22(i16vec4) Load 332
+             334:299(i16vec2) VectorShuffle 333 333 0 1
+             335:299(i16vec2) GroupNonUniformQuadSwap 43 334 38
+             336:    293(ptr) AccessChain 34(data) 331 59 38
+             337: 21(int16_t) CompositeExtract 335 0
+                              Store 336 337
+             338:    293(ptr) AccessChain 34(data) 331 59 42
+             339: 21(int16_t) CompositeExtract 335 1
+                              Store 338 339
+             340:      6(int) Load 8(invocation)
+             341:    300(ptr) AccessChain 34(data) 59 59
+             342: 22(i16vec4) Load 341
+             343:310(i16vec3) VectorShuffle 342 342 0 1 2
+             344:310(i16vec3) GroupNonUniformQuadSwap 43 343 38
+             345:    293(ptr) AccessChain 34(data) 340 59 38
+             346: 21(int16_t) CompositeExtract 344 0
+                              Store 345 346
+             347:    293(ptr) AccessChain 34(data) 340 59 42
+             348: 21(int16_t) CompositeExtract 344 1
+                              Store 347 348
+             349:    293(ptr) AccessChain 34(data) 340 59 69
+             350: 21(int16_t) CompositeExtract 344 2
+                              Store 349 350
+             351:      6(int) Load 8(invocation)
+             352:    300(ptr) AccessChain 34(data) 73 59
              353: 22(i16vec4) Load 352
-             354: 22(i16vec4) VectorShuffle 353 351 4 5 2 3
-                              Store 352 354
-             355:      6(int) Load 8(invocation)
-             356:    268(ptr) AccessChain 34(data) 58 58
-             357: 22(i16vec4) Load 356
-             358:277(i16vec3) VectorShuffle 357 357 0 1 2
-             359:277(i16vec3) GroupNonUniformQuadSwap 43 358 128
-             360:    268(ptr) AccessChain 34(data) 355 58
-             361: 22(i16vec4) Load 360
-             362: 22(i16vec4) VectorShuffle 361 359 4 5 6 3
-                              Store 360 362
-             363:      6(int) Load 8(invocation)
-             364:    268(ptr) AccessChain 34(data) 68 58
-             365: 22(i16vec4) Load 364
-             366: 22(i16vec4) GroupNonUniformQuadSwap 43 365 128
-             367:    268(ptr) AccessChain 34(data) 363 58
-                              Store 367 366
-             368:      6(int) Load 8(invocation)
-             370:    369(ptr) AccessChain 34(data) 37 68 38
-             371: 23(int16_t) Load 370
-             372: 23(int16_t) GroupNonUniformQuadBroadcast 43 371 42
-             373:    369(ptr) AccessChain 34(data) 368 68 38
-                              Store 373 372
-             374:      6(int) Load 8(invocation)
-             377:    376(ptr) AccessChain 34(data) 47 68
-             378: 24(i16vec4) Load 377
-             379:375(i16vec2) VectorShuffle 378 378 0 1
-             380:375(i16vec2) GroupNonUniformQuadBroadcast 43 379 42
-             381:    376(ptr) AccessChain 34(data) 374 68
-             382: 24(i16vec4) Load 381
-             383: 24(i16vec4) VectorShuffle 382 380 4 5 2 3
-                              Store 381 383
-             384:      6(int) Load 8(invocation)
-             386:    376(ptr) AccessChain 34(data) 58 68
-             387: 24(i16vec4) Load 386
-             388:385(i16vec3) VectorShuffle 387 387 0 1 2
-             389:385(i16vec3) GroupNonUniformQuadBroadcast 43 388 42
-             390:    376(ptr) AccessChain 34(data) 384 68
-             391: 24(i16vec4) Load 390
-             392: 24(i16vec4) VectorShuffle 391 389 4 5 6 3
-                              Store 390 392
-             393:      6(int) Load 8(invocation)
-             394:    376(ptr) AccessChain 34(data) 68 68
-             395: 24(i16vec4) Load 394
-             396: 24(i16vec4) GroupNonUniformQuadBroadcast 43 395 42
-             397:    376(ptr) AccessChain 34(data) 393 68
-                              Store 397 396
-             398:      6(int) Load 8(invocation)
-             399:    369(ptr) AccessChain 34(data) 37 68 38
-             400: 23(int16_t) Load 399
-             401: 23(int16_t) GroupNonUniformQuadSwap 43 400 38
-             402:    369(ptr) AccessChain 34(data) 398 68 38
-                              Store 402 401
-             403:      6(int) Load 8(invocation)
-             404:    376(ptr) AccessChain 34(data) 47 68
-             405: 24(i16vec4) Load 404
-             406:375(i16vec2) VectorShuffle 405 405 0 1
-             407:375(i16vec2) GroupNonUniformQuadSwap 43 406 38
-             408:    376(ptr) AccessChain 34(data) 403 68
-             409: 24(i16vec4) Load 408
-             410: 24(i16vec4) VectorShuffle 409 407 4 5 2 3
-                              Store 408 410
+             354: 22(i16vec4) GroupNonUniformQuadSwap 43 353 38
+             355:    300(ptr) AccessChain 34(data) 351 59
+                              Store 355 354
+             356:      6(int) Load 8(invocation)
+             357:    293(ptr) AccessChain 34(data) 37 59 38
+             358: 21(int16_t) Load 357
+             359: 21(int16_t) GroupNonUniformQuadSwap 43 358 42
+             360:    293(ptr) AccessChain 34(data) 356 59 38
+                              Store 360 359
+             361:      6(int) Load 8(invocation)
+             362:    300(ptr) AccessChain 34(data) 47 59
+             363: 22(i16vec4) Load 362
+             364:299(i16vec2) VectorShuffle 363 363 0 1
+             365:299(i16vec2) GroupNonUniformQuadSwap 43 364 42
+             366:    293(ptr) AccessChain 34(data) 361 59 38
+             367: 21(int16_t) CompositeExtract 365 0
+                              Store 366 367
+             368:    293(ptr) AccessChain 34(data) 361 59 42
+             369: 21(int16_t) CompositeExtract 365 1
+                              Store 368 369
+             370:      6(int) Load 8(invocation)
+             371:    300(ptr) AccessChain 34(data) 59 59
+             372: 22(i16vec4) Load 371
+             373:310(i16vec3) VectorShuffle 372 372 0 1 2
+             374:310(i16vec3) GroupNonUniformQuadSwap 43 373 42
+             375:    293(ptr) AccessChain 34(data) 370 59 38
+             376: 21(int16_t) CompositeExtract 374 0
+                              Store 375 376
+             377:    293(ptr) AccessChain 34(data) 370 59 42
+             378: 21(int16_t) CompositeExtract 374 1
+                              Store 377 378
+             379:    293(ptr) AccessChain 34(data) 370 59 69
+             380: 21(int16_t) CompositeExtract 374 2
+                              Store 379 380
+             381:      6(int) Load 8(invocation)
+             382:    300(ptr) AccessChain 34(data) 73 59
+             383: 22(i16vec4) Load 382
+             384: 22(i16vec4) GroupNonUniformQuadSwap 43 383 42
+             385:    300(ptr) AccessChain 34(data) 381 59
+                              Store 385 384
+             386:      6(int) Load 8(invocation)
+             387:    293(ptr) AccessChain 34(data) 37 59 38
+             388: 21(int16_t) Load 387
+             389: 21(int16_t) GroupNonUniformQuadSwap 43 388 69
+             390:    293(ptr) AccessChain 34(data) 386 59 38
+                              Store 390 389
+             391:      6(int) Load 8(invocation)
+             392:    300(ptr) AccessChain 34(data) 47 59
+             393: 22(i16vec4) Load 392
+             394:299(i16vec2) VectorShuffle 393 393 0 1
+             395:299(i16vec2) GroupNonUniformQuadSwap 43 394 69
+             396:    293(ptr) AccessChain 34(data) 391 59 38
+             397: 21(int16_t) CompositeExtract 395 0
+                              Store 396 397
+             398:    293(ptr) AccessChain 34(data) 391 59 42
+             399: 21(int16_t) CompositeExtract 395 1
+                              Store 398 399
+             400:      6(int) Load 8(invocation)
+             401:    300(ptr) AccessChain 34(data) 59 59
+             402: 22(i16vec4) Load 401
+             403:310(i16vec3) VectorShuffle 402 402 0 1 2
+             404:310(i16vec3) GroupNonUniformQuadSwap 43 403 69
+             405:    293(ptr) AccessChain 34(data) 400 59 38
+             406: 21(int16_t) CompositeExtract 404 0
+                              Store 405 406
+             407:    293(ptr) AccessChain 34(data) 400 59 42
+             408: 21(int16_t) CompositeExtract 404 1
+                              Store 407 408
+             409:    293(ptr) AccessChain 34(data) 400 59 69
+             410: 21(int16_t) CompositeExtract 404 2
+                              Store 409 410
              411:      6(int) Load 8(invocation)
-             412:    376(ptr) AccessChain 34(data) 58 68
-             413: 24(i16vec4) Load 412
-             414:385(i16vec3) VectorShuffle 413 413 0 1 2
-             415:385(i16vec3) GroupNonUniformQuadSwap 43 414 38
-             416:    376(ptr) AccessChain 34(data) 411 68
-             417: 24(i16vec4) Load 416
-             418: 24(i16vec4) VectorShuffle 417 415 4 5 6 3
-                              Store 416 418
-             419:      6(int) Load 8(invocation)
-             420:    376(ptr) AccessChain 34(data) 68 68
-             421: 24(i16vec4) Load 420
-             422: 24(i16vec4) GroupNonUniformQuadSwap 43 421 38
-             423:    376(ptr) AccessChain 34(data) 419 68
-                              Store 423 422
-             424:      6(int) Load 8(invocation)
-             425:    369(ptr) AccessChain 34(data) 37 68 38
-             426: 23(int16_t) Load 425
-             427: 23(int16_t) GroupNonUniformQuadSwap 43 426 42
-             428:    369(ptr) AccessChain 34(data) 424 68 38
-                              Store 428 427
-             429:      6(int) Load 8(invocation)
-             430:    376(ptr) AccessChain 34(data) 47 68
-             431: 24(i16vec4) Load 430
-             432:375(i16vec2) VectorShuffle 431 431 0 1
-             433:375(i16vec2) GroupNonUniformQuadSwap 43 432 42
-             434:    376(ptr) AccessChain 34(data) 429 68
-             435: 24(i16vec4) Load 434
-             436: 24(i16vec4) VectorShuffle 435 433 4 5 2 3
-                              Store 434 436
-             437:      6(int) Load 8(invocation)
-             438:    376(ptr) AccessChain 34(data) 58 68
-             439: 24(i16vec4) Load 438
-             440:385(i16vec3) VectorShuffle 439 439 0 1 2
-             441:385(i16vec3) GroupNonUniformQuadSwap 43 440 42
-             442:    376(ptr) AccessChain 34(data) 437 68
-             443: 24(i16vec4) Load 442
-             444: 24(i16vec4) VectorShuffle 443 441 4 5 6 3
-                              Store 442 444
+             412:    300(ptr) AccessChain 34(data) 73 59
+             413: 22(i16vec4) Load 412
+             414: 22(i16vec4) GroupNonUniformQuadSwap 43 413 69
+             415:    300(ptr) AccessChain 34(data) 411 59
+                              Store 415 414
+             416:      6(int) Load 8(invocation)
+             418:    417(ptr) AccessChain 34(data) 37 73 38
+             419: 23(int16_t) Load 418
+             420: 23(int16_t) GroupNonUniformQuadBroadcast 43 419 42
+             421:    417(ptr) AccessChain 34(data) 416 73 38
+                              Store 421 420
+             422:      6(int) Load 8(invocation)
+             425:    424(ptr) AccessChain 34(data) 47 73
+             426: 24(i16vec4) Load 425
+             427:423(i16vec2) VectorShuffle 426 426 0 1
+             428:423(i16vec2) GroupNonUniformQuadBroadcast 43 427 42
+             429:    417(ptr) AccessChain 34(data) 422 73 38
+             430: 23(int16_t) CompositeExtract 428 0
+                              Store 429 430
+             431:    417(ptr) AccessChain 34(data) 422 73 42
+             432: 23(int16_t) CompositeExtract 428 1
+                              Store 431 432
+             433:      6(int) Load 8(invocation)
+             435:    424(ptr) AccessChain 34(data) 59 73
+             436: 24(i16vec4) Load 435
+             437:434(i16vec3) VectorShuffle 436 436 0 1 2
+             438:434(i16vec3) GroupNonUniformQuadBroadcast 43 437 42
+             439:    417(ptr) AccessChain 34(data) 433 73 38
+             440: 23(int16_t) CompositeExtract 438 0
+                              Store 439 440
+             441:    417(ptr) AccessChain 34(data) 433 73 42
+             442: 23(int16_t) CompositeExtract 438 1
+                              Store 441 442
+             443:    417(ptr) AccessChain 34(data) 433 73 69
+             444: 23(int16_t) CompositeExtract 438 2
+                              Store 443 444
              445:      6(int) Load 8(invocation)
-             446:    376(ptr) AccessChain 34(data) 68 68
+             446:    424(ptr) AccessChain 34(data) 73 73
              447: 24(i16vec4) Load 446
-             448: 24(i16vec4) GroupNonUniformQuadSwap 43 447 42
-             449:    376(ptr) AccessChain 34(data) 445 68
+             448: 24(i16vec4) GroupNonUniformQuadBroadcast 43 447 42
+             449:    424(ptr) AccessChain 34(data) 445 73
                               Store 449 448
              450:      6(int) Load 8(invocation)
-             451:    369(ptr) AccessChain 34(data) 37 68 38
+             451:    417(ptr) AccessChain 34(data) 37 73 38
              452: 23(int16_t) Load 451
-             453: 23(int16_t) GroupNonUniformQuadSwap 43 452 128
-             454:    369(ptr) AccessChain 34(data) 450 68 38
+             453: 23(int16_t) GroupNonUniformQuadSwap 43 452 38
+             454:    417(ptr) AccessChain 34(data) 450 73 38
                               Store 454 453
              455:      6(int) Load 8(invocation)
-             456:    376(ptr) AccessChain 34(data) 47 68
+             456:    424(ptr) AccessChain 34(data) 47 73
              457: 24(i16vec4) Load 456
-             458:375(i16vec2) VectorShuffle 457 457 0 1
-             459:375(i16vec2) GroupNonUniformQuadSwap 43 458 128
-             460:    376(ptr) AccessChain 34(data) 455 68
-             461: 24(i16vec4) Load 460
-             462: 24(i16vec4) VectorShuffle 461 459 4 5 2 3
-                              Store 460 462
-             463:      6(int) Load 8(invocation)
-             464:    376(ptr) AccessChain 34(data) 58 68
-             465: 24(i16vec4) Load 464
-             466:385(i16vec3) VectorShuffle 465 465 0 1 2
-             467:385(i16vec3) GroupNonUniformQuadSwap 43 466 128
-             468:    376(ptr) AccessChain 34(data) 463 68
-             469: 24(i16vec4) Load 468
-             470: 24(i16vec4) VectorShuffle 469 467 4 5 6 3
-                              Store 468 470
-             471:      6(int) Load 8(invocation)
-             472:    376(ptr) AccessChain 34(data) 68 68
-             473: 24(i16vec4) Load 472
-             474: 24(i16vec4) GroupNonUniformQuadSwap 43 473 128
-             475:    376(ptr) AccessChain 34(data) 471 68
-                              Store 475 474
-             476:      6(int) Load 8(invocation)
-             479:    478(ptr) AccessChain 34(data) 37 477 38
-             480: 25(int64_t) Load 479
-             481: 25(int64_t) GroupNonUniformQuadBroadcast 43 480 42
-             482:    478(ptr) AccessChain 34(data) 476 477 38
-                              Store 482 481
-             483:      6(int) Load 8(invocation)
-             486:    485(ptr) AccessChain 34(data) 47 477
-             487: 26(i64vec4) Load 486
-             488:484(i64vec2) VectorShuffle 487 487 0 1
-             489:484(i64vec2) GroupNonUniformQuadBroadcast 43 488 42
-             490:    485(ptr) AccessChain 34(data) 483 477
-             491: 26(i64vec4) Load 490
-             492: 26(i64vec4) VectorShuffle 491 489 4 5 2 3
-                              Store 490 492
-             493:      6(int) Load 8(invocation)
-             495:    485(ptr) AccessChain 34(data) 58 477
-             496: 26(i64vec4) Load 495
-             497:494(i64vec3) VectorShuffle 496 496 0 1 2
-             498:494(i64vec3) GroupNonUniformQuadBroadcast 43 497 42
-             499:    485(ptr) AccessChain 34(data) 493 477
-             500: 26(i64vec4) Load 499
-             501: 26(i64vec4) VectorShuffle 500 498 4 5 6 3
-                              Store 499 501
-             502:      6(int) Load 8(invocation)
-             503:    485(ptr) AccessChain 34(data) 68 477
-             504: 26(i64vec4) Load 503
-             505: 26(i64vec4) GroupNonUniformQuadBroadcast 43 504 42
-             506:    485(ptr) AccessChain 34(data) 502 477
-                              Store 506 505
-             507:      6(int) Load 8(invocation)
-             508:    478(ptr) AccessChain 34(data) 37 477 38
-             509: 25(int64_t) Load 508
-             510: 25(int64_t) GroupNonUniformQuadSwap 43 509 38
-             511:    478(ptr) AccessChain 34(data) 507 477 38
-                              Store 511 510
-             512:      6(int) Load 8(invocation)
-             513:    485(ptr) AccessChain 34(data) 47 477
-             514: 26(i64vec4) Load 513
-             515:484(i64vec2) VectorShuffle 514 514 0 1
-             516:484(i64vec2) GroupNonUniformQuadSwap 43 515 38
-             517:    485(ptr) AccessChain 34(data) 512 477
-             518: 26(i64vec4) Load 517
-             519: 26(i64vec4) VectorShuffle 518 516 4 5 2 3
-                              Store 517 519
-             520:      6(int) Load 8(invocation)
-             521:    485(ptr) AccessChain 34(data) 58 477
-             522: 26(i64vec4) Load 521
-             523:494(i64vec3) VectorShuffle 522 522 0 1 2
-             524:494(i64vec3) GroupNonUniformQuadSwap 43 523 38
-             525:    485(ptr) AccessChain 34(data) 520 477
-             526: 26(i64vec4) Load 525
-             527: 26(i64vec4) VectorShuffle 526 524 4 5 6 3
-                              Store 525 527
-             528:      6(int) Load 8(invocation)
-             529:    485(ptr) AccessChain 34(data) 68 477
-             530: 26(i64vec4) Load 529
-             531: 26(i64vec4) GroupNonUniformQuadSwap 43 530 38
-             532:    485(ptr) AccessChain 34(data) 528 477
-                              Store 532 531
-             533:      6(int) Load 8(invocation)
-             534:    478(ptr) AccessChain 34(data) 37 477 38
-             535: 25(int64_t) Load 534
-             536: 25(int64_t) GroupNonUniformQuadSwap 43 535 42
-             537:    478(ptr) AccessChain 34(data) 533 477 38
-                              Store 537 536
-             538:      6(int) Load 8(invocation)
-             539:    485(ptr) AccessChain 34(data) 47 477
-             540: 26(i64vec4) Load 539
-             541:484(i64vec2) VectorShuffle 540 540 0 1
-             542:484(i64vec2) GroupNonUniformQuadSwap 43 541 42
-             543:    485(ptr) AccessChain 34(data) 538 477
-             544: 26(i64vec4) Load 543
-             545: 26(i64vec4) VectorShuffle 544 542 4 5 2 3
-                              Store 543 545
-             546:      6(int) Load 8(invocation)
-             547:    485(ptr) AccessChain 34(data) 58 477
-             548: 26(i64vec4) Load 547
-             549:494(i64vec3) VectorShuffle 548 548 0 1 2
-             550:494(i64vec3) GroupNonUniformQuadSwap 43 549 42
-             551:    485(ptr) AccessChain 34(data) 546 477
-             552: 26(i64vec4) Load 551
-             553: 26(i64vec4) VectorShuffle 552 550 4 5 6 3
-                              Store 551 553
-             554:      6(int) Load 8(invocation)
-             555:    485(ptr) AccessChain 34(data) 68 477
-             556: 26(i64vec4) Load 555
-             557: 26(i64vec4) GroupNonUniformQuadSwap 43 556 42
-             558:    485(ptr) AccessChain 34(data) 554 477
-                              Store 558 557
-             559:      6(int) Load 8(invocation)
-             560:    478(ptr) AccessChain 34(data) 37 477 38
-             561: 25(int64_t) Load 560
-             562: 25(int64_t) GroupNonUniformQuadSwap 43 561 128
-             563:    478(ptr) AccessChain 34(data) 559 477 38
-                              Store 563 562
-             564:      6(int) Load 8(invocation)
-             565:    485(ptr) AccessChain 34(data) 47 477
-             566: 26(i64vec4) Load 565
-             567:484(i64vec2) VectorShuffle 566 566 0 1
-             568:484(i64vec2) GroupNonUniformQuadSwap 43 567 128
-             569:    485(ptr) AccessChain 34(data) 564 477
-             570: 26(i64vec4) Load 569
-             571: 26(i64vec4) VectorShuffle 570 568 4 5 2 3
-                              Store 569 571
-             572:      6(int) Load 8(invocation)
-             573:    485(ptr) AccessChain 34(data) 58 477
-             574: 26(i64vec4) Load 573
-             575:494(i64vec3) VectorShuffle 574 574 0 1 2
-             576:494(i64vec3) GroupNonUniformQuadSwap 43 575 128
-             577:    485(ptr) AccessChain 34(data) 572 477
-             578: 26(i64vec4) Load 577
-             579: 26(i64vec4) VectorShuffle 578 576 4 5 6 3
-                              Store 577 579
+             458:423(i16vec2) VectorShuffle 457 457 0 1
+             459:423(i16vec2) GroupNonUniformQuadSwap 43 458 38
+             460:    417(ptr) AccessChain 34(data) 455 73 38
+             461: 23(int16_t) CompositeExtract 459 0
+                              Store 460 461
+             462:    417(ptr) AccessChain 34(data) 455 73 42
+             463: 23(int16_t) CompositeExtract 459 1
+                              Store 462 463
+             464:      6(int) Load 8(invocation)
+             465:    424(ptr) AccessChain 34(data) 59 73
+             466: 24(i16vec4) Load 465
+             467:434(i16vec3) VectorShuffle 466 466 0 1 2
+             468:434(i16vec3) GroupNonUniformQuadSwap 43 467 38
+             469:    417(ptr) AccessChain 34(data) 464 73 38
+             470: 23(int16_t) CompositeExtract 468 0
+                              Store 469 470
+             471:    417(ptr) AccessChain 34(data) 464 73 42
+             472: 23(int16_t) CompositeExtract 468 1
+                              Store 471 472
+             473:    417(ptr) AccessChain 34(data) 464 73 69
+             474: 23(int16_t) CompositeExtract 468 2
+                              Store 473 474
+             475:      6(int) Load 8(invocation)
+             476:    424(ptr) AccessChain 34(data) 73 73
+             477: 24(i16vec4) Load 476
+             478: 24(i16vec4) GroupNonUniformQuadSwap 43 477 38
+             479:    424(ptr) AccessChain 34(data) 475 73
+                              Store 479 478
+             480:      6(int) Load 8(invocation)
+             481:    417(ptr) AccessChain 34(data) 37 73 38
+             482: 23(int16_t) Load 481
+             483: 23(int16_t) GroupNonUniformQuadSwap 43 482 42
+             484:    417(ptr) AccessChain 34(data) 480 73 38
+                              Store 484 483
+             485:      6(int) Load 8(invocation)
+             486:    424(ptr) AccessChain 34(data) 47 73
+             487: 24(i16vec4) Load 486
+             488:423(i16vec2) VectorShuffle 487 487 0 1
+             489:423(i16vec2) GroupNonUniformQuadSwap 43 488 42
+             490:    417(ptr) AccessChain 34(data) 485 73 38
+             491: 23(int16_t) CompositeExtract 489 0
+                              Store 490 491
+             492:    417(ptr) AccessChain 34(data) 485 73 42
+             493: 23(int16_t) CompositeExtract 489 1
+                              Store 492 493
+             494:      6(int) Load 8(invocation)
+             495:    424(ptr) AccessChain 34(data) 59 73
+             496: 24(i16vec4) Load 495
+             497:434(i16vec3) VectorShuffle 496 496 0 1 2
+             498:434(i16vec3) GroupNonUniformQuadSwap 43 497 42
+             499:    417(ptr) AccessChain 34(data) 494 73 38
+             500: 23(int16_t) CompositeExtract 498 0
+                              Store 499 500
+             501:    417(ptr) AccessChain 34(data) 494 73 42
+             502: 23(int16_t) CompositeExtract 498 1
+                              Store 501 502
+             503:    417(ptr) AccessChain 34(data) 494 73 69
+             504: 23(int16_t) CompositeExtract 498 2
+                              Store 503 504
+             505:      6(int) Load 8(invocation)
+             506:    424(ptr) AccessChain 34(data) 73 73
+             507: 24(i16vec4) Load 506
+             508: 24(i16vec4) GroupNonUniformQuadSwap 43 507 42
+             509:    424(ptr) AccessChain 34(data) 505 73
+                              Store 509 508
+             510:      6(int) Load 8(invocation)
+             511:    417(ptr) AccessChain 34(data) 37 73 38
+             512: 23(int16_t) Load 511
+             513: 23(int16_t) GroupNonUniformQuadSwap 43 512 69
+             514:    417(ptr) AccessChain 34(data) 510 73 38
+                              Store 514 513
+             515:      6(int) Load 8(invocation)
+             516:    424(ptr) AccessChain 34(data) 47 73
+             517: 24(i16vec4) Load 516
+             518:423(i16vec2) VectorShuffle 517 517 0 1
+             519:423(i16vec2) GroupNonUniformQuadSwap 43 518 69
+             520:    417(ptr) AccessChain 34(data) 515 73 38
+             521: 23(int16_t) CompositeExtract 519 0
+                              Store 520 521
+             522:    417(ptr) AccessChain 34(data) 515 73 42
+             523: 23(int16_t) CompositeExtract 519 1
+                              Store 522 523
+             524:      6(int) Load 8(invocation)
+             525:    424(ptr) AccessChain 34(data) 59 73
+             526: 24(i16vec4) Load 525
+             527:434(i16vec3) VectorShuffle 526 526 0 1 2
+             528:434(i16vec3) GroupNonUniformQuadSwap 43 527 69
+             529:    417(ptr) AccessChain 34(data) 524 73 38
+             530: 23(int16_t) CompositeExtract 528 0
+                              Store 529 530
+             531:    417(ptr) AccessChain 34(data) 524 73 42
+             532: 23(int16_t) CompositeExtract 528 1
+                              Store 531 532
+             533:    417(ptr) AccessChain 34(data) 524 73 69
+             534: 23(int16_t) CompositeExtract 528 2
+                              Store 533 534
+             535:      6(int) Load 8(invocation)
+             536:    424(ptr) AccessChain 34(data) 73 73
+             537: 24(i16vec4) Load 536
+             538: 24(i16vec4) GroupNonUniformQuadSwap 43 537 69
+             539:    424(ptr) AccessChain 34(data) 535 73
+                              Store 539 538
+             540:      6(int) Load 8(invocation)
+             543:    542(ptr) AccessChain 34(data) 37 541 38
+             544: 25(int64_t) Load 543
+             545: 25(int64_t) GroupNonUniformQuadBroadcast 43 544 42
+             546:    542(ptr) AccessChain 34(data) 540 541 38
+                              Store 546 545
+             547:      6(int) Load 8(invocation)
+             550:    549(ptr) AccessChain 34(data) 47 541
+             551: 26(i64vec4) Load 550
+             552:548(i64vec2) VectorShuffle 551 551 0 1
+             553:548(i64vec2) GroupNonUniformQuadBroadcast 43 552 42
+             554:    542(ptr) AccessChain 34(data) 547 541 38
+             555: 25(int64_t) CompositeExtract 553 0
+                              Store 554 555
+             556:    542(ptr) AccessChain 34(data) 547 541 42
+             557: 25(int64_t) CompositeExtract 553 1
+                              Store 556 557
+             558:      6(int) Load 8(invocation)
+             560:    549(ptr) AccessChain 34(data) 59 541
+             561: 26(i64vec4) Load 560
+             562:559(i64vec3) VectorShuffle 561 561 0 1 2
+             563:559(i64vec3) GroupNonUniformQuadBroadcast 43 562 42
+             564:    542(ptr) AccessChain 34(data) 558 541 38
+             565: 25(int64_t) CompositeExtract 563 0
+                              Store 564 565
+             566:    542(ptr) AccessChain 34(data) 558 541 42
+             567: 25(int64_t) CompositeExtract 563 1
+                              Store 566 567
+             568:    542(ptr) AccessChain 34(data) 558 541 69
+             569: 25(int64_t) CompositeExtract 563 2
+                              Store 568 569
+             570:      6(int) Load 8(invocation)
+             571:    549(ptr) AccessChain 34(data) 73 541
+             572: 26(i64vec4) Load 571
+             573: 26(i64vec4) GroupNonUniformQuadBroadcast 43 572 42
+             574:    549(ptr) AccessChain 34(data) 570 541
+                              Store 574 573
+             575:      6(int) Load 8(invocation)
+             576:    542(ptr) AccessChain 34(data) 37 541 38
+             577: 25(int64_t) Load 576
+             578: 25(int64_t) GroupNonUniformQuadSwap 43 577 38
+             579:    542(ptr) AccessChain 34(data) 575 541 38
+                              Store 579 578
              580:      6(int) Load 8(invocation)
-             581:    485(ptr) AccessChain 34(data) 68 477
+             581:    549(ptr) AccessChain 34(data) 47 541
              582: 26(i64vec4) Load 581
-             583: 26(i64vec4) GroupNonUniformQuadSwap 43 582 128
-             584:    485(ptr) AccessChain 34(data) 580 477
-                              Store 584 583
-             585:      6(int) Load 8(invocation)
-             588:    587(ptr) AccessChain 34(data) 37 586 38
-             589: 27(int64_t) Load 588
-             590: 27(int64_t) GroupNonUniformQuadBroadcast 43 589 42
-             591:    587(ptr) AccessChain 34(data) 585 586 38
-                              Store 591 590
-             592:      6(int) Load 8(invocation)
-             595:    594(ptr) AccessChain 34(data) 47 586
-             596: 28(i64vec4) Load 595
-             597:593(i64vec2) VectorShuffle 596 596 0 1
-             598:593(i64vec2) GroupNonUniformQuadBroadcast 43 597 42
-             599:    594(ptr) AccessChain 34(data) 592 586
-             600: 28(i64vec4) Load 599
-             601: 28(i64vec4) VectorShuffle 600 598 4 5 2 3
-                              Store 599 601
-             602:      6(int) Load 8(invocation)
-             604:    594(ptr) AccessChain 34(data) 58 586
-             605: 28(i64vec4) Load 604
-             606:603(i64vec3) VectorShuffle 605 605 0 1 2
-             607:603(i64vec3) GroupNonUniformQuadBroadcast 43 606 42
-             608:    594(ptr) AccessChain 34(data) 602 586
-             609: 28(i64vec4) Load 608
-             610: 28(i64vec4) VectorShuffle 609 607 4 5 6 3
-                              Store 608 610
-             611:      6(int) Load 8(invocation)
-             612:    594(ptr) AccessChain 34(data) 68 586
-             613: 28(i64vec4) Load 612
-             614: 28(i64vec4) GroupNonUniformQuadBroadcast 43 613 42
-             615:    594(ptr) AccessChain 34(data) 611 586
-                              Store 615 614
-             616:      6(int) Load 8(invocation)
-             617:    587(ptr) AccessChain 34(data) 37 586 38
-             618: 27(int64_t) Load 617
-             619: 27(int64_t) GroupNonUniformQuadSwap 43 618 38
-             620:    587(ptr) AccessChain 34(data) 616 586 38
-                              Store 620 619
-             621:      6(int) Load 8(invocation)
-             622:    594(ptr) AccessChain 34(data) 47 586
-             623: 28(i64vec4) Load 622
-             624:593(i64vec2) VectorShuffle 623 623 0 1
-             625:593(i64vec2) GroupNonUniformQuadSwap 43 624 38
-             626:    594(ptr) AccessChain 34(data) 621 586
-             627: 28(i64vec4) Load 626
-             628: 28(i64vec4) VectorShuffle 627 625 4 5 2 3
-                              Store 626 628
-             629:      6(int) Load 8(invocation)
-             630:    594(ptr) AccessChain 34(data) 58 586
-             631: 28(i64vec4) Load 630
-             632:603(i64vec3) VectorShuffle 631 631 0 1 2
-             633:603(i64vec3) GroupNonUniformQuadSwap 43 632 38
-             634:    594(ptr) AccessChain 34(data) 629 586
-             635: 28(i64vec4) Load 634
-             636: 28(i64vec4) VectorShuffle 635 633 4 5 6 3
-                              Store 634 636
-             637:      6(int) Load 8(invocation)
-             638:    594(ptr) AccessChain 34(data) 68 586
-             639: 28(i64vec4) Load 638
-             640: 28(i64vec4) GroupNonUniformQuadSwap 43 639 38
-             641:    594(ptr) AccessChain 34(data) 637 586
-                              Store 641 640
-             642:      6(int) Load 8(invocation)
-             643:    587(ptr) AccessChain 34(data) 37 586 38
-             644: 27(int64_t) Load 643
-             645: 27(int64_t) GroupNonUniformQuadSwap 43 644 42
-             646:    587(ptr) AccessChain 34(data) 642 586 38
-                              Store 646 645
-             647:      6(int) Load 8(invocation)
-             648:    594(ptr) AccessChain 34(data) 47 586
-             649: 28(i64vec4) Load 648
-             650:593(i64vec2) VectorShuffle 649 649 0 1
-             651:593(i64vec2) GroupNonUniformQuadSwap 43 650 42
-             652:    594(ptr) AccessChain 34(data) 647 586
-             653: 28(i64vec4) Load 652
-             654: 28(i64vec4) VectorShuffle 653 651 4 5 2 3
-                              Store 652 654
-             655:      6(int) Load 8(invocation)
-             656:    594(ptr) AccessChain 34(data) 58 586
-             657: 28(i64vec4) Load 656
-             658:603(i64vec3) VectorShuffle 657 657 0 1 2
-             659:603(i64vec3) GroupNonUniformQuadSwap 43 658 42
-             660:    594(ptr) AccessChain 34(data) 655 586
-             661: 28(i64vec4) Load 660
-             662: 28(i64vec4) VectorShuffle 661 659 4 5 6 3
-                              Store 660 662
-             663:      6(int) Load 8(invocation)
-             664:    594(ptr) AccessChain 34(data) 68 586
-             665: 28(i64vec4) Load 664
-             666: 28(i64vec4) GroupNonUniformQuadSwap 43 665 42
-             667:    594(ptr) AccessChain 34(data) 663 586
-                              Store 667 666
-             668:      6(int) Load 8(invocation)
-             669:    587(ptr) AccessChain 34(data) 37 586 38
-             670: 27(int64_t) Load 669
-             671: 27(int64_t) GroupNonUniformQuadSwap 43 670 128
-             672:    587(ptr) AccessChain 34(data) 668 586 38
-                              Store 672 671
-             673:      6(int) Load 8(invocation)
-             674:    594(ptr) AccessChain 34(data) 47 586
-             675: 28(i64vec4) Load 674
-             676:593(i64vec2) VectorShuffle 675 675 0 1
-             677:593(i64vec2) GroupNonUniformQuadSwap 43 676 128
-             678:    594(ptr) AccessChain 34(data) 673 586
-             679: 28(i64vec4) Load 678
-             680: 28(i64vec4) VectorShuffle 679 677 4 5 2 3
-                              Store 678 680
-             681:      6(int) Load 8(invocation)
-             682:    594(ptr) AccessChain 34(data) 58 586
-             683: 28(i64vec4) Load 682
-             684:603(i64vec3) VectorShuffle 683 683 0 1 2
-             685:603(i64vec3) GroupNonUniformQuadSwap 43 684 128
-             686:    594(ptr) AccessChain 34(data) 681 586
-             687: 28(i64vec4) Load 686
-             688: 28(i64vec4) VectorShuffle 687 685 4 5 6 3
-                              Store 686 688
-             689:      6(int) Load 8(invocation)
-             690:    594(ptr) AccessChain 34(data) 68 586
-             691: 28(i64vec4) Load 690
-             692: 28(i64vec4) GroupNonUniformQuadSwap 43 691 128
-             693:    594(ptr) AccessChain 34(data) 689 586
-                              Store 693 692
-             694:      6(int) Load 8(invocation)
-             697:    696(ptr) AccessChain 34(data) 37 695 38
-             698:29(float16_t) Load 697
-             699:29(float16_t) GroupNonUniformQuadBroadcast 43 698 42
-             700:    696(ptr) AccessChain 34(data) 694 695 38
-                              Store 700 699
-             701:      6(int) Load 8(invocation)
-             704:    703(ptr) AccessChain 34(data) 47 695
-             705: 30(f16vec4) Load 704
-             706:702(f16vec2) VectorShuffle 705 705 0 1
-             707:702(f16vec2) GroupNonUniformQuadBroadcast 43 706 42
-             708:    703(ptr) AccessChain 34(data) 701 695
-             709: 30(f16vec4) Load 708
-             710: 30(f16vec4) VectorShuffle 709 707 4 5 2 3
-                              Store 708 710
-             711:      6(int) Load 8(invocation)
-             713:    703(ptr) AccessChain 34(data) 58 695
-             714: 30(f16vec4) Load 713
-             715:712(f16vec3) VectorShuffle 714 714 0 1 2
-             716:712(f16vec3) GroupNonUniformQuadBroadcast 43 715 42
-             717:    703(ptr) AccessChain 34(data) 711 695
-             718: 30(f16vec4) Load 717
-             719: 30(f16vec4) VectorShuffle 718 716 4 5 6 3
-                              Store 717 719
-             720:      6(int) Load 8(invocation)
-             721:    703(ptr) AccessChain 34(data) 68 695
-             722: 30(f16vec4) Load 721
-             723: 30(f16vec4) GroupNonUniformQuadBroadcast 43 722 42
-             724:    703(ptr) AccessChain 34(data) 720 695
-                              Store 724 723
+             583:548(i64vec2) VectorShuffle 582 582 0 1
+             584:548(i64vec2) GroupNonUniformQuadSwap 43 583 38
+             585:    542(ptr) AccessChain 34(data) 580 541 38
+             586: 25(int64_t) CompositeExtract 584 0
+                              Store 585 586
+             587:    542(ptr) AccessChain 34(data) 580 541 42
+             588: 25(int64_t) CompositeExtract 584 1
+                              Store 587 588
+             589:      6(int) Load 8(invocation)
+             590:    549(ptr) AccessChain 34(data) 59 541
+             591: 26(i64vec4) Load 590
+             592:559(i64vec3) VectorShuffle 591 591 0 1 2
+             593:559(i64vec3) GroupNonUniformQuadSwap 43 592 38
+             594:    542(ptr) AccessChain 34(data) 589 541 38
+             595: 25(int64_t) CompositeExtract 593 0
+                              Store 594 595
+             596:    542(ptr) AccessChain 34(data) 589 541 42
+             597: 25(int64_t) CompositeExtract 593 1
+                              Store 596 597
+             598:    542(ptr) AccessChain 34(data) 589 541 69
+             599: 25(int64_t) CompositeExtract 593 2
+                              Store 598 599
+             600:      6(int) Load 8(invocation)
+             601:    549(ptr) AccessChain 34(data) 73 541
+             602: 26(i64vec4) Load 601
+             603: 26(i64vec4) GroupNonUniformQuadSwap 43 602 38
+             604:    549(ptr) AccessChain 34(data) 600 541
+                              Store 604 603
+             605:      6(int) Load 8(invocation)
+             606:    542(ptr) AccessChain 34(data) 37 541 38
+             607: 25(int64_t) Load 606
+             608: 25(int64_t) GroupNonUniformQuadSwap 43 607 42
+             609:    542(ptr) AccessChain 34(data) 605 541 38
+                              Store 609 608
+             610:      6(int) Load 8(invocation)
+             611:    549(ptr) AccessChain 34(data) 47 541
+             612: 26(i64vec4) Load 611
+             613:548(i64vec2) VectorShuffle 612 612 0 1
+             614:548(i64vec2) GroupNonUniformQuadSwap 43 613 42
+             615:    542(ptr) AccessChain 34(data) 610 541 38
+             616: 25(int64_t) CompositeExtract 614 0
+                              Store 615 616
+             617:    542(ptr) AccessChain 34(data) 610 541 42
+             618: 25(int64_t) CompositeExtract 614 1
+                              Store 617 618
+             619:      6(int) Load 8(invocation)
+             620:    549(ptr) AccessChain 34(data) 59 541
+             621: 26(i64vec4) Load 620
+             622:559(i64vec3) VectorShuffle 621 621 0 1 2
+             623:559(i64vec3) GroupNonUniformQuadSwap 43 622 42
+             624:    542(ptr) AccessChain 34(data) 619 541 38
+             625: 25(int64_t) CompositeExtract 623 0
+                              Store 624 625
+             626:    542(ptr) AccessChain 34(data) 619 541 42
+             627: 25(int64_t) CompositeExtract 623 1
+                              Store 626 627
+             628:    542(ptr) AccessChain 34(data) 619 541 69
+             629: 25(int64_t) CompositeExtract 623 2
+                              Store 628 629
+             630:      6(int) Load 8(invocation)
+             631:    549(ptr) AccessChain 34(data) 73 541
+             632: 26(i64vec4) Load 631
+             633: 26(i64vec4) GroupNonUniformQuadSwap 43 632 42
+             634:    549(ptr) AccessChain 34(data) 630 541
+                              Store 634 633
+             635:      6(int) Load 8(invocation)
+             636:    542(ptr) AccessChain 34(data) 37 541 38
+             637: 25(int64_t) Load 636
+             638: 25(int64_t) GroupNonUniformQuadSwap 43 637 69
+             639:    542(ptr) AccessChain 34(data) 635 541 38
+                              Store 639 638
+             640:      6(int) Load 8(invocation)
+             641:    549(ptr) AccessChain 34(data) 47 541
+             642: 26(i64vec4) Load 641
+             643:548(i64vec2) VectorShuffle 642 642 0 1
+             644:548(i64vec2) GroupNonUniformQuadSwap 43 643 69
+             645:    542(ptr) AccessChain 34(data) 640 541 38
+             646: 25(int64_t) CompositeExtract 644 0
+                              Store 645 646
+             647:    542(ptr) AccessChain 34(data) 640 541 42
+             648: 25(int64_t) CompositeExtract 644 1
+                              Store 647 648
+             649:      6(int) Load 8(invocation)
+             650:    549(ptr) AccessChain 34(data) 59 541
+             651: 26(i64vec4) Load 650
+             652:559(i64vec3) VectorShuffle 651 651 0 1 2
+             653:559(i64vec3) GroupNonUniformQuadSwap 43 652 69
+             654:    542(ptr) AccessChain 34(data) 649 541 38
+             655: 25(int64_t) CompositeExtract 653 0
+                              Store 654 655
+             656:    542(ptr) AccessChain 34(data) 649 541 42
+             657: 25(int64_t) CompositeExtract 653 1
+                              Store 656 657
+             658:    542(ptr) AccessChain 34(data) 649 541 69
+             659: 25(int64_t) CompositeExtract 653 2
+                              Store 658 659
+             660:      6(int) Load 8(invocation)
+             661:    549(ptr) AccessChain 34(data) 73 541
+             662: 26(i64vec4) Load 661
+             663: 26(i64vec4) GroupNonUniformQuadSwap 43 662 69
+             664:    549(ptr) AccessChain 34(data) 660 541
+                              Store 664 663
+             665:      6(int) Load 8(invocation)
+             668:    667(ptr) AccessChain 34(data) 37 666 38
+             669: 27(int64_t) Load 668
+             670: 27(int64_t) GroupNonUniformQuadBroadcast 43 669 42
+             671:    667(ptr) AccessChain 34(data) 665 666 38
+                              Store 671 670
+             672:      6(int) Load 8(invocation)
+             675:    674(ptr) AccessChain 34(data) 47 666
+             676: 28(i64vec4) Load 675
+             677:673(i64vec2) VectorShuffle 676 676 0 1
+             678:673(i64vec2) GroupNonUniformQuadBroadcast 43 677 42
+             679:    667(ptr) AccessChain 34(data) 672 666 38
+             680: 27(int64_t) CompositeExtract 678 0
+                              Store 679 680
+             681:    667(ptr) AccessChain 34(data) 672 666 42
+             682: 27(int64_t) CompositeExtract 678 1
+                              Store 681 682
+             683:      6(int) Load 8(invocation)
+             685:    674(ptr) AccessChain 34(data) 59 666
+             686: 28(i64vec4) Load 685
+             687:684(i64vec3) VectorShuffle 686 686 0 1 2
+             688:684(i64vec3) GroupNonUniformQuadBroadcast 43 687 42
+             689:    667(ptr) AccessChain 34(data) 683 666 38
+             690: 27(int64_t) CompositeExtract 688 0
+                              Store 689 690
+             691:    667(ptr) AccessChain 34(data) 683 666 42
+             692: 27(int64_t) CompositeExtract 688 1
+                              Store 691 692
+             693:    667(ptr) AccessChain 34(data) 683 666 69
+             694: 27(int64_t) CompositeExtract 688 2
+                              Store 693 694
+             695:      6(int) Load 8(invocation)
+             696:    674(ptr) AccessChain 34(data) 73 666
+             697: 28(i64vec4) Load 696
+             698: 28(i64vec4) GroupNonUniformQuadBroadcast 43 697 42
+             699:    674(ptr) AccessChain 34(data) 695 666
+                              Store 699 698
+             700:      6(int) Load 8(invocation)
+             701:    667(ptr) AccessChain 34(data) 37 666 38
+             702: 27(int64_t) Load 701
+             703: 27(int64_t) GroupNonUniformQuadSwap 43 702 38
+             704:    667(ptr) AccessChain 34(data) 700 666 38
+                              Store 704 703
+             705:      6(int) Load 8(invocation)
+             706:    674(ptr) AccessChain 34(data) 47 666
+             707: 28(i64vec4) Load 706
+             708:673(i64vec2) VectorShuffle 707 707 0 1
+             709:673(i64vec2) GroupNonUniformQuadSwap 43 708 38
+             710:    667(ptr) AccessChain 34(data) 705 666 38
+             711: 27(int64_t) CompositeExtract 709 0
+                              Store 710 711
+             712:    667(ptr) AccessChain 34(data) 705 666 42
+             713: 27(int64_t) CompositeExtract 709 1
+                              Store 712 713
+             714:      6(int) Load 8(invocation)
+             715:    674(ptr) AccessChain 34(data) 59 666
+             716: 28(i64vec4) Load 715
+             717:684(i64vec3) VectorShuffle 716 716 0 1 2
+             718:684(i64vec3) GroupNonUniformQuadSwap 43 717 38
+             719:    667(ptr) AccessChain 34(data) 714 666 38
+             720: 27(int64_t) CompositeExtract 718 0
+                              Store 719 720
+             721:    667(ptr) AccessChain 34(data) 714 666 42
+             722: 27(int64_t) CompositeExtract 718 1
+                              Store 721 722
+             723:    667(ptr) AccessChain 34(data) 714 666 69
+             724: 27(int64_t) CompositeExtract 718 2
+                              Store 723 724
              725:      6(int) Load 8(invocation)
-             726:    696(ptr) AccessChain 34(data) 37 695 38
-             727:29(float16_t) Load 726
-             728:29(float16_t) GroupNonUniformQuadSwap 43 727 38
-             729:    696(ptr) AccessChain 34(data) 725 695 38
+             726:    674(ptr) AccessChain 34(data) 73 666
+             727: 28(i64vec4) Load 726
+             728: 28(i64vec4) GroupNonUniformQuadSwap 43 727 38
+             729:    674(ptr) AccessChain 34(data) 725 666
                               Store 729 728
              730:      6(int) Load 8(invocation)
-             731:    703(ptr) AccessChain 34(data) 47 695
-             732: 30(f16vec4) Load 731
-             733:702(f16vec2) VectorShuffle 732 732 0 1
-             734:702(f16vec2) GroupNonUniformQuadSwap 43 733 38
-             735:    703(ptr) AccessChain 34(data) 730 695
-             736: 30(f16vec4) Load 735
-             737: 30(f16vec4) VectorShuffle 736 734 4 5 2 3
-                              Store 735 737
-             738:      6(int) Load 8(invocation)
-             739:    703(ptr) AccessChain 34(data) 58 695
-             740: 30(f16vec4) Load 739
-             741:712(f16vec3) VectorShuffle 740 740 0 1 2
-             742:712(f16vec3) GroupNonUniformQuadSwap 43 741 38
-             743:    703(ptr) AccessChain 34(data) 738 695
-             744: 30(f16vec4) Load 743
-             745: 30(f16vec4) VectorShuffle 744 742 4 5 6 3
-                              Store 743 745
-             746:      6(int) Load 8(invocation)
-             747:    703(ptr) AccessChain 34(data) 68 695
-             748: 30(f16vec4) Load 747
-             749: 30(f16vec4) GroupNonUniformQuadSwap 43 748 38
-             750:    703(ptr) AccessChain 34(data) 746 695
-                              Store 750 749
-             751:      6(int) Load 8(invocation)
-             752:    696(ptr) AccessChain 34(data) 37 695 38
-             753:29(float16_t) Load 752
-             754:29(float16_t) GroupNonUniformQuadSwap 43 753 42
-             755:    696(ptr) AccessChain 34(data) 751 695 38
-                              Store 755 754
-             756:      6(int) Load 8(invocation)
-             757:    703(ptr) AccessChain 34(data) 47 695
-             758: 30(f16vec4) Load 757
-             759:702(f16vec2) VectorShuffle 758 758 0 1
-             760:702(f16vec2) GroupNonUniformQuadSwap 43 759 42
-             761:    703(ptr) AccessChain 34(data) 756 695
-             762: 30(f16vec4) Load 761
-             763: 30(f16vec4) VectorShuffle 762 760 4 5 2 3
-                              Store 761 763
-             764:      6(int) Load 8(invocation)
-             765:    703(ptr) AccessChain 34(data) 58 695
-             766: 30(f16vec4) Load 765
-             767:712(f16vec3) VectorShuffle 766 766 0 1 2
-             768:712(f16vec3) GroupNonUniformQuadSwap 43 767 42
-             769:    703(ptr) AccessChain 34(data) 764 695
-             770: 30(f16vec4) Load 769
-             771: 30(f16vec4) VectorShuffle 770 768 4 5 6 3
-                              Store 769 771
-             772:      6(int) Load 8(invocation)
-             773:    703(ptr) AccessChain 34(data) 68 695
-             774: 30(f16vec4) Load 773
-             775: 30(f16vec4) GroupNonUniformQuadSwap 43 774 42
-             776:    703(ptr) AccessChain 34(data) 772 695
-                              Store 776 775
-             777:      6(int) Load 8(invocation)
-             778:    696(ptr) AccessChain 34(data) 37 695 38
-             779:29(float16_t) Load 778
-             780:29(float16_t) GroupNonUniformQuadSwap 43 779 128
-             781:    696(ptr) AccessChain 34(data) 777 695 38
-                              Store 781 780
-             782:      6(int) Load 8(invocation)
-             783:    703(ptr) AccessChain 34(data) 47 695
-             784: 30(f16vec4) Load 783
-             785:702(f16vec2) VectorShuffle 784 784 0 1
-             786:702(f16vec2) GroupNonUniformQuadSwap 43 785 128
-             787:    703(ptr) AccessChain 34(data) 782 695
-             788: 30(f16vec4) Load 787
-             789: 30(f16vec4) VectorShuffle 788 786 4 5 2 3
-                              Store 787 789
+             731:    667(ptr) AccessChain 34(data) 37 666 38
+             732: 27(int64_t) Load 731
+             733: 27(int64_t) GroupNonUniformQuadSwap 43 732 42
+             734:    667(ptr) AccessChain 34(data) 730 666 38
+                              Store 734 733
+             735:      6(int) Load 8(invocation)
+             736:    674(ptr) AccessChain 34(data) 47 666
+             737: 28(i64vec4) Load 736
+             738:673(i64vec2) VectorShuffle 737 737 0 1
+             739:673(i64vec2) GroupNonUniformQuadSwap 43 738 42
+             740:    667(ptr) AccessChain 34(data) 735 666 38
+             741: 27(int64_t) CompositeExtract 739 0
+                              Store 740 741
+             742:    667(ptr) AccessChain 34(data) 735 666 42
+             743: 27(int64_t) CompositeExtract 739 1
+                              Store 742 743
+             744:      6(int) Load 8(invocation)
+             745:    674(ptr) AccessChain 34(data) 59 666
+             746: 28(i64vec4) Load 745
+             747:684(i64vec3) VectorShuffle 746 746 0 1 2
+             748:684(i64vec3) GroupNonUniformQuadSwap 43 747 42
+             749:    667(ptr) AccessChain 34(data) 744 666 38
+             750: 27(int64_t) CompositeExtract 748 0
+                              Store 749 750
+             751:    667(ptr) AccessChain 34(data) 744 666 42
+             752: 27(int64_t) CompositeExtract 748 1
+                              Store 751 752
+             753:    667(ptr) AccessChain 34(data) 744 666 69
+             754: 27(int64_t) CompositeExtract 748 2
+                              Store 753 754
+             755:      6(int) Load 8(invocation)
+             756:    674(ptr) AccessChain 34(data) 73 666
+             757: 28(i64vec4) Load 756
+             758: 28(i64vec4) GroupNonUniformQuadSwap 43 757 42
+             759:    674(ptr) AccessChain 34(data) 755 666
+                              Store 759 758
+             760:      6(int) Load 8(invocation)
+             761:    667(ptr) AccessChain 34(data) 37 666 38
+             762: 27(int64_t) Load 761
+             763: 27(int64_t) GroupNonUniformQuadSwap 43 762 69
+             764:    667(ptr) AccessChain 34(data) 760 666 38
+                              Store 764 763
+             765:      6(int) Load 8(invocation)
+             766:    674(ptr) AccessChain 34(data) 47 666
+             767: 28(i64vec4) Load 766
+             768:673(i64vec2) VectorShuffle 767 767 0 1
+             769:673(i64vec2) GroupNonUniformQuadSwap 43 768 69
+             770:    667(ptr) AccessChain 34(data) 765 666 38
+             771: 27(int64_t) CompositeExtract 769 0
+                              Store 770 771
+             772:    667(ptr) AccessChain 34(data) 765 666 42
+             773: 27(int64_t) CompositeExtract 769 1
+                              Store 772 773
+             774:      6(int) Load 8(invocation)
+             775:    674(ptr) AccessChain 34(data) 59 666
+             776: 28(i64vec4) Load 775
+             777:684(i64vec3) VectorShuffle 776 776 0 1 2
+             778:684(i64vec3) GroupNonUniformQuadSwap 43 777 69
+             779:    667(ptr) AccessChain 34(data) 774 666 38
+             780: 27(int64_t) CompositeExtract 778 0
+                              Store 779 780
+             781:    667(ptr) AccessChain 34(data) 774 666 42
+             782: 27(int64_t) CompositeExtract 778 1
+                              Store 781 782
+             783:    667(ptr) AccessChain 34(data) 774 666 69
+             784: 27(int64_t) CompositeExtract 778 2
+                              Store 783 784
+             785:      6(int) Load 8(invocation)
+             786:    674(ptr) AccessChain 34(data) 73 666
+             787: 28(i64vec4) Load 786
+             788: 28(i64vec4) GroupNonUniformQuadSwap 43 787 69
+             789:    674(ptr) AccessChain 34(data) 785 666
+                              Store 789 788
              790:      6(int) Load 8(invocation)
-             791:    703(ptr) AccessChain 34(data) 58 695
-             792: 30(f16vec4) Load 791
-             793:712(f16vec3) VectorShuffle 792 792 0 1 2
-             794:712(f16vec3) GroupNonUniformQuadSwap 43 793 128
-             795:    703(ptr) AccessChain 34(data) 790 695
-             796: 30(f16vec4) Load 795
-             797: 30(f16vec4) VectorShuffle 796 794 4 5 6 3
-                              Store 795 797
-             798:      6(int) Load 8(invocation)
-             799:    703(ptr) AccessChain 34(data) 68 695
-             800: 30(f16vec4) Load 799
-             801: 30(f16vec4) GroupNonUniformQuadSwap 43 800 128
-             802:    703(ptr) AccessChain 34(data) 798 695
-                              Store 802 801
+             793:    792(ptr) AccessChain 34(data) 37 791 38
+             794:29(float16_t) Load 793
+             795:29(float16_t) GroupNonUniformQuadBroadcast 43 794 42
+             796:    792(ptr) AccessChain 34(data) 790 791 38
+                              Store 796 795
+             797:      6(int) Load 8(invocation)
+             800:    799(ptr) AccessChain 34(data) 47 791
+             801: 30(f16vec4) Load 800
+             802:798(f16vec2) VectorShuffle 801 801 0 1
+             803:798(f16vec2) GroupNonUniformQuadBroadcast 43 802 42
+             804:    792(ptr) AccessChain 34(data) 797 791 38
+             805:29(float16_t) CompositeExtract 803 0
+                              Store 804 805
+             806:    792(ptr) AccessChain 34(data) 797 791 42
+             807:29(float16_t) CompositeExtract 803 1
+                              Store 806 807
+             808:      6(int) Load 8(invocation)
+             810:    799(ptr) AccessChain 34(data) 59 791
+             811: 30(f16vec4) Load 810
+             812:809(f16vec3) VectorShuffle 811 811 0 1 2
+             813:809(f16vec3) GroupNonUniformQuadBroadcast 43 812 42
+             814:    792(ptr) AccessChain 34(data) 808 791 38
+             815:29(float16_t) CompositeExtract 813 0
+                              Store 814 815
+             816:    792(ptr) AccessChain 34(data) 808 791 42
+             817:29(float16_t) CompositeExtract 813 1
+                              Store 816 817
+             818:    792(ptr) AccessChain 34(data) 808 791 69
+             819:29(float16_t) CompositeExtract 813 2
+                              Store 818 819
+             820:      6(int) Load 8(invocation)
+             821:    799(ptr) AccessChain 34(data) 73 791
+             822: 30(f16vec4) Load 821
+             823: 30(f16vec4) GroupNonUniformQuadBroadcast 43 822 42
+             824:    799(ptr) AccessChain 34(data) 820 791
+                              Store 824 823
+             825:      6(int) Load 8(invocation)
+             826:    792(ptr) AccessChain 34(data) 37 791 38
+             827:29(float16_t) Load 826
+             828:29(float16_t) GroupNonUniformQuadSwap 43 827 38
+             829:    792(ptr) AccessChain 34(data) 825 791 38
+                              Store 829 828
+             830:      6(int) Load 8(invocation)
+             831:    799(ptr) AccessChain 34(data) 47 791
+             832: 30(f16vec4) Load 831
+             833:798(f16vec2) VectorShuffle 832 832 0 1
+             834:798(f16vec2) GroupNonUniformQuadSwap 43 833 38
+             835:    792(ptr) AccessChain 34(data) 830 791 38
+             836:29(float16_t) CompositeExtract 834 0
+                              Store 835 836
+             837:    792(ptr) AccessChain 34(data) 830 791 42
+             838:29(float16_t) CompositeExtract 834 1
+                              Store 837 838
+             839:      6(int) Load 8(invocation)
+             840:    799(ptr) AccessChain 34(data) 59 791
+             841: 30(f16vec4) Load 840
+             842:809(f16vec3) VectorShuffle 841 841 0 1 2
+             843:809(f16vec3) GroupNonUniformQuadSwap 43 842 38
+             844:    792(ptr) AccessChain 34(data) 839 791 38
+             845:29(float16_t) CompositeExtract 843 0
+                              Store 844 845
+             846:    792(ptr) AccessChain 34(data) 839 791 42
+             847:29(float16_t) CompositeExtract 843 1
+                              Store 846 847
+             848:    792(ptr) AccessChain 34(data) 839 791 69
+             849:29(float16_t) CompositeExtract 843 2
+                              Store 848 849
+             850:      6(int) Load 8(invocation)
+             851:    799(ptr) AccessChain 34(data) 73 791
+             852: 30(f16vec4) Load 851
+             853: 30(f16vec4) GroupNonUniformQuadSwap 43 852 38
+             854:    799(ptr) AccessChain 34(data) 850 791
+                              Store 854 853
+             855:      6(int) Load 8(invocation)
+             856:    792(ptr) AccessChain 34(data) 37 791 38
+             857:29(float16_t) Load 856
+             858:29(float16_t) GroupNonUniformQuadSwap 43 857 42
+             859:    792(ptr) AccessChain 34(data) 855 791 38
+                              Store 859 858
+             860:      6(int) Load 8(invocation)
+             861:    799(ptr) AccessChain 34(data) 47 791
+             862: 30(f16vec4) Load 861
+             863:798(f16vec2) VectorShuffle 862 862 0 1
+             864:798(f16vec2) GroupNonUniformQuadSwap 43 863 42
+             865:    792(ptr) AccessChain 34(data) 860 791 38
+             866:29(float16_t) CompositeExtract 864 0
+                              Store 865 866
+             867:    792(ptr) AccessChain 34(data) 860 791 42
+             868:29(float16_t) CompositeExtract 864 1
+                              Store 867 868
+             869:      6(int) Load 8(invocation)
+             870:    799(ptr) AccessChain 34(data) 59 791
+             871: 30(f16vec4) Load 870
+             872:809(f16vec3) VectorShuffle 871 871 0 1 2
+             873:809(f16vec3) GroupNonUniformQuadSwap 43 872 42
+             874:    792(ptr) AccessChain 34(data) 869 791 38
+             875:29(float16_t) CompositeExtract 873 0
+                              Store 874 875
+             876:    792(ptr) AccessChain 34(data) 869 791 42
+             877:29(float16_t) CompositeExtract 873 1
+                              Store 876 877
+             878:    792(ptr) AccessChain 34(data) 869 791 69
+             879:29(float16_t) CompositeExtract 873 2
+                              Store 878 879
+             880:      6(int) Load 8(invocation)
+             881:    799(ptr) AccessChain 34(data) 73 791
+             882: 30(f16vec4) Load 881
+             883: 30(f16vec4) GroupNonUniformQuadSwap 43 882 42
+             884:    799(ptr) AccessChain 34(data) 880 791
+                              Store 884 883
+             885:      6(int) Load 8(invocation)
+             886:    792(ptr) AccessChain 34(data) 37 791 38
+             887:29(float16_t) Load 886
+             888:29(float16_t) GroupNonUniformQuadSwap 43 887 69
+             889:    792(ptr) AccessChain 34(data) 885 791 38
+                              Store 889 888
+             890:      6(int) Load 8(invocation)
+             891:    799(ptr) AccessChain 34(data) 47 791
+             892: 30(f16vec4) Load 891
+             893:798(f16vec2) VectorShuffle 892 892 0 1
+             894:798(f16vec2) GroupNonUniformQuadSwap 43 893 69
+             895:    792(ptr) AccessChain 34(data) 890 791 38
+             896:29(float16_t) CompositeExtract 894 0
+                              Store 895 896
+             897:    792(ptr) AccessChain 34(data) 890 791 42
+             898:29(float16_t) CompositeExtract 894 1
+                              Store 897 898
+             899:      6(int) Load 8(invocation)
+             900:    799(ptr) AccessChain 34(data) 59 791
+             901: 30(f16vec4) Load 900
+             902:809(f16vec3) VectorShuffle 901 901 0 1 2
+             903:809(f16vec3) GroupNonUniformQuadSwap 43 902 69
+             904:    792(ptr) AccessChain 34(data) 899 791 38
+             905:29(float16_t) CompositeExtract 903 0
+                              Store 904 905
+             906:    792(ptr) AccessChain 34(data) 899 791 42
+             907:29(float16_t) CompositeExtract 903 1
+                              Store 906 907
+             908:    792(ptr) AccessChain 34(data) 899 791 69
+             909:29(float16_t) CompositeExtract 903 2
+                              Store 908 909
+             910:      6(int) Load 8(invocation)
+             911:    799(ptr) AccessChain 34(data) 73 791
+             912: 30(f16vec4) Load 911
+             913: 30(f16vec4) GroupNonUniformQuadSwap 43 912 69
+             914:    799(ptr) AccessChain 34(data) 910 791
+                              Store 914 913
                               Return
                               FunctionEnd
diff --git a/third_party/vulkan-deps/glslang/src/Test/baseResults/spv.subgroupExtendedTypesShuffle.comp.out b/third_party/vulkan-deps/glslang/src/Test/baseResults/spv.subgroupExtendedTypesShuffle.comp.out
index b798bae..eaea708 100644
--- a/third_party/vulkan-deps/glslang/src/Test/baseResults/spv.subgroupExtendedTypesShuffle.comp.out
+++ b/third_party/vulkan-deps/glslang/src/Test/baseResults/spv.subgroupExtendedTypesShuffle.comp.out
@@ -1,7 +1,7 @@
 spv.subgroupExtendedTypesShuffle.comp
 // Module Version 10300
 // Generated by (magic number): 8000a
-// Id's are bound by 497
+// Id's are bound by 554
 
                               Capability Shader
                               Capability Float16
@@ -59,7 +59,7 @@
                               Decorate 31(Buffers) Block
                               Decorate 34(data) DescriptorSet 0
                               Decorate 34(data) Binding 0
-                              Decorate 496 BuiltIn WorkgroupSize
+                              Decorate 553 BuiltIn WorkgroupSize
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeInt 32 0
@@ -94,40 +94,41 @@
               47:     36(int) Constant 1
               48:             TypeVector 17(int8_t) 2
               49:             TypePointer StorageBuffer 18(i8vec4)
-              59:     36(int) Constant 2
-              60:             TypeVector 17(int8_t) 3
-              70:     36(int) Constant 3
-             107:             TypePointer StorageBuffer 19(int8_t)
-             114:             TypeVector 19(int8_t) 2
-             115:             TypePointer StorageBuffer 20(i8vec4)
-             125:             TypeVector 19(int8_t) 3
-             171:             TypePointer StorageBuffer 21(int16_t)
-             178:             TypeVector 21(int16_t) 2
-             179:             TypePointer StorageBuffer 22(i16vec4)
-             189:             TypeVector 21(int16_t) 3
-             235:             TypePointer StorageBuffer 23(int16_t)
-             242:             TypeVector 23(int16_t) 2
-             243:             TypePointer StorageBuffer 24(i16vec4)
-             253:             TypeVector 23(int16_t) 3
-             299:     36(int) Constant 4
-             300:             TypePointer StorageBuffer 25(int64_t)
-             307:             TypeVector 25(int64_t) 2
-             308:             TypePointer StorageBuffer 26(i64vec4)
-             318:             TypeVector 25(int64_t) 3
-             364:     36(int) Constant 5
-             365:             TypePointer StorageBuffer 27(int64_t)
-             372:             TypeVector 27(int64_t) 2
-             373:             TypePointer StorageBuffer 28(i64vec4)
-             383:             TypeVector 27(int64_t) 3
-             429:     36(int) Constant 6
-             430:             TypePointer StorageBuffer 29(float16_t)
-             437:             TypeVector 29(float16_t) 2
-             438:             TypePointer StorageBuffer 30(f16vec4)
-             448:             TypeVector 29(float16_t) 3
-             493:             TypeVector 6(int) 3
-             494:      6(int) Constant 8
-             495:      6(int) Constant 1
-             496:  493(ivec3) ConstantComposite 494 495 495
+              57:      6(int) Constant 1
+              61:     36(int) Constant 2
+              62:             TypeVector 17(int8_t) 3
+              72:      6(int) Constant 2
+              76:     36(int) Constant 3
+             117:             TypePointer StorageBuffer 19(int8_t)
+             124:             TypeVector 19(int8_t) 2
+             125:             TypePointer StorageBuffer 20(i8vec4)
+             136:             TypeVector 19(int8_t) 3
+             189:             TypePointer StorageBuffer 21(int16_t)
+             196:             TypeVector 21(int16_t) 2
+             197:             TypePointer StorageBuffer 22(i16vec4)
+             208:             TypeVector 21(int16_t) 3
+             261:             TypePointer StorageBuffer 23(int16_t)
+             268:             TypeVector 23(int16_t) 2
+             269:             TypePointer StorageBuffer 24(i16vec4)
+             280:             TypeVector 23(int16_t) 3
+             333:     36(int) Constant 4
+             334:             TypePointer StorageBuffer 25(int64_t)
+             341:             TypeVector 25(int64_t) 2
+             342:             TypePointer StorageBuffer 26(i64vec4)
+             353:             TypeVector 25(int64_t) 3
+             406:     36(int) Constant 5
+             407:             TypePointer StorageBuffer 27(int64_t)
+             414:             TypeVector 27(int64_t) 2
+             415:             TypePointer StorageBuffer 28(i64vec4)
+             426:             TypeVector 27(int64_t) 3
+             479:     36(int) Constant 6
+             480:             TypePointer StorageBuffer 29(float16_t)
+             487:             TypeVector 29(float16_t) 2
+             488:             TypePointer StorageBuffer 30(f16vec4)
+             499:             TypeVector 29(float16_t) 3
+             551:             TypeVector 6(int) 3
+             552:      6(int) Constant 8
+             553:  551(ivec3) ConstantComposite 552 57 57
          4(main):           2 Function None 3
                5:             Label
    8(invocation):      7(ptr) Variable Function
@@ -149,468 +150,566 @@
               52:  48(i8vec2) VectorShuffle 51 51 0 1
               53:      6(int) Load 8(invocation)
               54:  48(i8vec2) GroupNonUniformShuffle 43 52 53
-              55:     49(ptr) AccessChain 34(data) 46 37
-              56:  18(i8vec4) Load 55
-              57:  18(i8vec4) VectorShuffle 56 54 4 5 2 3
-                              Store 55 57
-              58:      6(int) Load 8(invocation)
-              61:     49(ptr) AccessChain 34(data) 59 37
-              62:  18(i8vec4) Load 61
-              63:  60(i8vec3) VectorShuffle 62 62 0 1 2
-              64:      6(int) Load 8(invocation)
-              65:  60(i8vec3) GroupNonUniformShuffle 43 63 64
-              66:     49(ptr) AccessChain 34(data) 58 37
-              67:  18(i8vec4) Load 66
-              68:  18(i8vec4) VectorShuffle 67 65 4 5 6 3
-                              Store 66 68
-              69:      6(int) Load 8(invocation)
-              71:     49(ptr) AccessChain 34(data) 70 37
-              72:  18(i8vec4) Load 71
-              73:      6(int) Load 8(invocation)
-              74:  18(i8vec4) GroupNonUniformShuffle 43 72 73
-              75:     49(ptr) AccessChain 34(data) 69 37
-                              Store 75 74
-              76:      6(int) Load 8(invocation)
-              77:     39(ptr) AccessChain 34(data) 37 37 38
-              78:  17(int8_t) Load 77
+              55:     39(ptr) AccessChain 34(data) 46 37 38
+              56:  17(int8_t) CompositeExtract 54 0
+                              Store 55 56
+              58:     39(ptr) AccessChain 34(data) 46 37 57
+              59:  17(int8_t) CompositeExtract 54 1
+                              Store 58 59
+              60:      6(int) Load 8(invocation)
+              63:     49(ptr) AccessChain 34(data) 61 37
+              64:  18(i8vec4) Load 63
+              65:  62(i8vec3) VectorShuffle 64 64 0 1 2
+              66:      6(int) Load 8(invocation)
+              67:  62(i8vec3) GroupNonUniformShuffle 43 65 66
+              68:     39(ptr) AccessChain 34(data) 60 37 38
+              69:  17(int8_t) CompositeExtract 67 0
+                              Store 68 69
+              70:     39(ptr) AccessChain 34(data) 60 37 57
+              71:  17(int8_t) CompositeExtract 67 1
+                              Store 70 71
+              73:     39(ptr) AccessChain 34(data) 60 37 72
+              74:  17(int8_t) CompositeExtract 67 2
+                              Store 73 74
+              75:      6(int) Load 8(invocation)
+              77:     49(ptr) AccessChain 34(data) 76 37
+              78:  18(i8vec4) Load 77
               79:      6(int) Load 8(invocation)
-              80:  17(int8_t) GroupNonUniformShuffleXor 43 78 79
-              81:     39(ptr) AccessChain 34(data) 76 37 38
+              80:  18(i8vec4) GroupNonUniformShuffle 43 78 79
+              81:     49(ptr) AccessChain 34(data) 75 37
                               Store 81 80
               82:      6(int) Load 8(invocation)
-              83:     49(ptr) AccessChain 34(data) 47 37
-              84:  18(i8vec4) Load 83
-              85:  48(i8vec2) VectorShuffle 84 84 0 1
-              86:      6(int) Load 8(invocation)
-              87:  48(i8vec2) GroupNonUniformShuffleXor 43 85 86
-              88:     49(ptr) AccessChain 34(data) 82 37
-              89:  18(i8vec4) Load 88
-              90:  18(i8vec4) VectorShuffle 89 87 4 5 2 3
-                              Store 88 90
-              91:      6(int) Load 8(invocation)
-              92:     49(ptr) AccessChain 34(data) 59 37
-              93:  18(i8vec4) Load 92
-              94:  60(i8vec3) VectorShuffle 93 93 0 1 2
-              95:      6(int) Load 8(invocation)
-              96:  60(i8vec3) GroupNonUniformShuffleXor 43 94 95
-              97:     49(ptr) AccessChain 34(data) 91 37
-              98:  18(i8vec4) Load 97
-              99:  18(i8vec4) VectorShuffle 98 96 4 5 6 3
-                              Store 97 99
-             100:      6(int) Load 8(invocation)
-             101:     49(ptr) AccessChain 34(data) 70 37
-             102:  18(i8vec4) Load 101
-             103:      6(int) Load 8(invocation)
-             104:  18(i8vec4) GroupNonUniformShuffleXor 43 102 103
-             105:     49(ptr) AccessChain 34(data) 100 37
-                              Store 105 104
-             106:      6(int) Load 8(invocation)
-             108:    107(ptr) AccessChain 34(data) 37 47 38
-             109:  19(int8_t) Load 108
+              83:     39(ptr) AccessChain 34(data) 37 37 38
+              84:  17(int8_t) Load 83
+              85:      6(int) Load 8(invocation)
+              86:  17(int8_t) GroupNonUniformShuffleXor 43 84 85
+              87:     39(ptr) AccessChain 34(data) 82 37 38
+                              Store 87 86
+              88:      6(int) Load 8(invocation)
+              89:     49(ptr) AccessChain 34(data) 47 37
+              90:  18(i8vec4) Load 89
+              91:  48(i8vec2) VectorShuffle 90 90 0 1
+              92:      6(int) Load 8(invocation)
+              93:  48(i8vec2) GroupNonUniformShuffleXor 43 91 92
+              94:     39(ptr) AccessChain 34(data) 88 37 38
+              95:  17(int8_t) CompositeExtract 93 0
+                              Store 94 95
+              96:     39(ptr) AccessChain 34(data) 88 37 57
+              97:  17(int8_t) CompositeExtract 93 1
+                              Store 96 97
+              98:      6(int) Load 8(invocation)
+              99:     49(ptr) AccessChain 34(data) 61 37
+             100:  18(i8vec4) Load 99
+             101:  62(i8vec3) VectorShuffle 100 100 0 1 2
+             102:      6(int) Load 8(invocation)
+             103:  62(i8vec3) GroupNonUniformShuffleXor 43 101 102
+             104:     39(ptr) AccessChain 34(data) 98 37 38
+             105:  17(int8_t) CompositeExtract 103 0
+                              Store 104 105
+             106:     39(ptr) AccessChain 34(data) 98 37 57
+             107:  17(int8_t) CompositeExtract 103 1
+                              Store 106 107
+             108:     39(ptr) AccessChain 34(data) 98 37 72
+             109:  17(int8_t) CompositeExtract 103 2
+                              Store 108 109
              110:      6(int) Load 8(invocation)
-             111:  19(int8_t) GroupNonUniformShuffle 43 109 110
-             112:    107(ptr) AccessChain 34(data) 106 47 38
-                              Store 112 111
+             111:     49(ptr) AccessChain 34(data) 76 37
+             112:  18(i8vec4) Load 111
              113:      6(int) Load 8(invocation)
-             116:    115(ptr) AccessChain 34(data) 47 47
-             117:  20(i8vec4) Load 116
-             118: 114(i8vec2) VectorShuffle 117 117 0 1
-             119:      6(int) Load 8(invocation)
-             120: 114(i8vec2) GroupNonUniformShuffle 43 118 119
-             121:    115(ptr) AccessChain 34(data) 113 47
-             122:  20(i8vec4) Load 121
-             123:  20(i8vec4) VectorShuffle 122 120 4 5 2 3
-                              Store 121 123
-             124:      6(int) Load 8(invocation)
-             126:    115(ptr) AccessChain 34(data) 59 47
+             114:  18(i8vec4) GroupNonUniformShuffleXor 43 112 113
+             115:     49(ptr) AccessChain 34(data) 110 37
+                              Store 115 114
+             116:      6(int) Load 8(invocation)
+             118:    117(ptr) AccessChain 34(data) 37 47 38
+             119:  19(int8_t) Load 118
+             120:      6(int) Load 8(invocation)
+             121:  19(int8_t) GroupNonUniformShuffle 43 119 120
+             122:    117(ptr) AccessChain 34(data) 116 47 38
+                              Store 122 121
+             123:      6(int) Load 8(invocation)
+             126:    125(ptr) AccessChain 34(data) 47 47
              127:  20(i8vec4) Load 126
-             128: 125(i8vec3) VectorShuffle 127 127 0 1 2
+             128: 124(i8vec2) VectorShuffle 127 127 0 1
              129:      6(int) Load 8(invocation)
-             130: 125(i8vec3) GroupNonUniformShuffle 43 128 129
-             131:    115(ptr) AccessChain 34(data) 124 47
-             132:  20(i8vec4) Load 131
-             133:  20(i8vec4) VectorShuffle 132 130 4 5 6 3
-                              Store 131 133
-             134:      6(int) Load 8(invocation)
-             135:    115(ptr) AccessChain 34(data) 70 47
-             136:  20(i8vec4) Load 135
-             137:      6(int) Load 8(invocation)
-             138:  20(i8vec4) GroupNonUniformShuffle 43 136 137
-             139:    115(ptr) AccessChain 34(data) 134 47
-                              Store 139 138
+             130: 124(i8vec2) GroupNonUniformShuffle 43 128 129
+             131:    117(ptr) AccessChain 34(data) 123 47 38
+             132:  19(int8_t) CompositeExtract 130 0
+                              Store 131 132
+             133:    117(ptr) AccessChain 34(data) 123 47 57
+             134:  19(int8_t) CompositeExtract 130 1
+                              Store 133 134
+             135:      6(int) Load 8(invocation)
+             137:    125(ptr) AccessChain 34(data) 61 47
+             138:  20(i8vec4) Load 137
+             139: 136(i8vec3) VectorShuffle 138 138 0 1 2
              140:      6(int) Load 8(invocation)
-             141:    107(ptr) AccessChain 34(data) 37 47 38
-             142:  19(int8_t) Load 141
-             143:      6(int) Load 8(invocation)
-             144:  19(int8_t) GroupNonUniformShuffleXor 43 142 143
-             145:    107(ptr) AccessChain 34(data) 140 47 38
-                              Store 145 144
-             146:      6(int) Load 8(invocation)
-             147:    115(ptr) AccessChain 34(data) 47 47
-             148:  20(i8vec4) Load 147
-             149: 114(i8vec2) VectorShuffle 148 148 0 1
-             150:      6(int) Load 8(invocation)
-             151: 114(i8vec2) GroupNonUniformShuffleXor 43 149 150
-             152:    115(ptr) AccessChain 34(data) 146 47
-             153:  20(i8vec4) Load 152
-             154:  20(i8vec4) VectorShuffle 153 151 4 5 2 3
-                              Store 152 154
-             155:      6(int) Load 8(invocation)
-             156:    115(ptr) AccessChain 34(data) 59 47
-             157:  20(i8vec4) Load 156
-             158: 125(i8vec3) VectorShuffle 157 157 0 1 2
-             159:      6(int) Load 8(invocation)
-             160: 125(i8vec3) GroupNonUniformShuffleXor 43 158 159
-             161:    115(ptr) AccessChain 34(data) 155 47
+             141: 136(i8vec3) GroupNonUniformShuffle 43 139 140
+             142:    117(ptr) AccessChain 34(data) 135 47 38
+             143:  19(int8_t) CompositeExtract 141 0
+                              Store 142 143
+             144:    117(ptr) AccessChain 34(data) 135 47 57
+             145:  19(int8_t) CompositeExtract 141 1
+                              Store 144 145
+             146:    117(ptr) AccessChain 34(data) 135 47 72
+             147:  19(int8_t) CompositeExtract 141 2
+                              Store 146 147
+             148:      6(int) Load 8(invocation)
+             149:    125(ptr) AccessChain 34(data) 76 47
+             150:  20(i8vec4) Load 149
+             151:      6(int) Load 8(invocation)
+             152:  20(i8vec4) GroupNonUniformShuffle 43 150 151
+             153:    125(ptr) AccessChain 34(data) 148 47
+                              Store 153 152
+             154:      6(int) Load 8(invocation)
+             155:    117(ptr) AccessChain 34(data) 37 47 38
+             156:  19(int8_t) Load 155
+             157:      6(int) Load 8(invocation)
+             158:  19(int8_t) GroupNonUniformShuffleXor 43 156 157
+             159:    117(ptr) AccessChain 34(data) 154 47 38
+                              Store 159 158
+             160:      6(int) Load 8(invocation)
+             161:    125(ptr) AccessChain 34(data) 47 47
              162:  20(i8vec4) Load 161
-             163:  20(i8vec4) VectorShuffle 162 160 4 5 6 3
-                              Store 161 163
+             163: 124(i8vec2) VectorShuffle 162 162 0 1
              164:      6(int) Load 8(invocation)
-             165:    115(ptr) AccessChain 34(data) 70 47
-             166:  20(i8vec4) Load 165
-             167:      6(int) Load 8(invocation)
-             168:  20(i8vec4) GroupNonUniformShuffleXor 43 166 167
-             169:    115(ptr) AccessChain 34(data) 164 47
-                              Store 169 168
+             165: 124(i8vec2) GroupNonUniformShuffleXor 43 163 164
+             166:    117(ptr) AccessChain 34(data) 160 47 38
+             167:  19(int8_t) CompositeExtract 165 0
+                              Store 166 167
+             168:    117(ptr) AccessChain 34(data) 160 47 57
+             169:  19(int8_t) CompositeExtract 165 1
+                              Store 168 169
              170:      6(int) Load 8(invocation)
-             172:    171(ptr) AccessChain 34(data) 37 59 38
-             173: 21(int16_t) Load 172
+             171:    125(ptr) AccessChain 34(data) 61 47
+             172:  20(i8vec4) Load 171
+             173: 136(i8vec3) VectorShuffle 172 172 0 1 2
              174:      6(int) Load 8(invocation)
-             175: 21(int16_t) GroupNonUniformShuffle 43 173 174
-             176:    171(ptr) AccessChain 34(data) 170 59 38
-                              Store 176 175
-             177:      6(int) Load 8(invocation)
-             180:    179(ptr) AccessChain 34(data) 47 59
-             181: 22(i16vec4) Load 180
-             182:178(i16vec2) VectorShuffle 181 181 0 1
-             183:      6(int) Load 8(invocation)
-             184:178(i16vec2) GroupNonUniformShuffle 43 182 183
-             185:    179(ptr) AccessChain 34(data) 177 59
-             186: 22(i16vec4) Load 185
-             187: 22(i16vec4) VectorShuffle 186 184 4 5 2 3
-                              Store 185 187
+             175: 136(i8vec3) GroupNonUniformShuffleXor 43 173 174
+             176:    117(ptr) AccessChain 34(data) 170 47 38
+             177:  19(int8_t) CompositeExtract 175 0
+                              Store 176 177
+             178:    117(ptr) AccessChain 34(data) 170 47 57
+             179:  19(int8_t) CompositeExtract 175 1
+                              Store 178 179
+             180:    117(ptr) AccessChain 34(data) 170 47 72
+             181:  19(int8_t) CompositeExtract 175 2
+                              Store 180 181
+             182:      6(int) Load 8(invocation)
+             183:    125(ptr) AccessChain 34(data) 76 47
+             184:  20(i8vec4) Load 183
+             185:      6(int) Load 8(invocation)
+             186:  20(i8vec4) GroupNonUniformShuffleXor 43 184 185
+             187:    125(ptr) AccessChain 34(data) 182 47
+                              Store 187 186
              188:      6(int) Load 8(invocation)
-             190:    179(ptr) AccessChain 34(data) 59 59
-             191: 22(i16vec4) Load 190
-             192:189(i16vec3) VectorShuffle 191 191 0 1 2
-             193:      6(int) Load 8(invocation)
-             194:189(i16vec3) GroupNonUniformShuffle 43 192 193
-             195:    179(ptr) AccessChain 34(data) 188 59
-             196: 22(i16vec4) Load 195
-             197: 22(i16vec4) VectorShuffle 196 194 4 5 6 3
-                              Store 195 197
-             198:      6(int) Load 8(invocation)
-             199:    179(ptr) AccessChain 34(data) 70 59
-             200: 22(i16vec4) Load 199
+             190:    189(ptr) AccessChain 34(data) 37 61 38
+             191: 21(int16_t) Load 190
+             192:      6(int) Load 8(invocation)
+             193: 21(int16_t) GroupNonUniformShuffle 43 191 192
+             194:    189(ptr) AccessChain 34(data) 188 61 38
+                              Store 194 193
+             195:      6(int) Load 8(invocation)
+             198:    197(ptr) AccessChain 34(data) 47 61
+             199: 22(i16vec4) Load 198
+             200:196(i16vec2) VectorShuffle 199 199 0 1
              201:      6(int) Load 8(invocation)
-             202: 22(i16vec4) GroupNonUniformShuffle 43 200 201
-             203:    179(ptr) AccessChain 34(data) 198 59
-                              Store 203 202
-             204:      6(int) Load 8(invocation)
-             205:    171(ptr) AccessChain 34(data) 37 59 38
-             206: 21(int16_t) Load 205
+             202:196(i16vec2) GroupNonUniformShuffle 43 200 201
+             203:    189(ptr) AccessChain 34(data) 195 61 38
+             204: 21(int16_t) CompositeExtract 202 0
+                              Store 203 204
+             205:    189(ptr) AccessChain 34(data) 195 61 57
+             206: 21(int16_t) CompositeExtract 202 1
+                              Store 205 206
              207:      6(int) Load 8(invocation)
-             208: 21(int16_t) GroupNonUniformShuffleXor 43 206 207
-             209:    171(ptr) AccessChain 34(data) 204 59 38
-                              Store 209 208
-             210:      6(int) Load 8(invocation)
-             211:    179(ptr) AccessChain 34(data) 47 59
-             212: 22(i16vec4) Load 211
-             213:178(i16vec2) VectorShuffle 212 212 0 1
-             214:      6(int) Load 8(invocation)
-             215:178(i16vec2) GroupNonUniformShuffleXor 43 213 214
-             216:    179(ptr) AccessChain 34(data) 210 59
-             217: 22(i16vec4) Load 216
-             218: 22(i16vec4) VectorShuffle 217 215 4 5 2 3
-                              Store 216 218
-             219:      6(int) Load 8(invocation)
-             220:    179(ptr) AccessChain 34(data) 59 59
-             221: 22(i16vec4) Load 220
-             222:189(i16vec3) VectorShuffle 221 221 0 1 2
+             209:    197(ptr) AccessChain 34(data) 61 61
+             210: 22(i16vec4) Load 209
+             211:208(i16vec3) VectorShuffle 210 210 0 1 2
+             212:      6(int) Load 8(invocation)
+             213:208(i16vec3) GroupNonUniformShuffle 43 211 212
+             214:    189(ptr) AccessChain 34(data) 207 61 38
+             215: 21(int16_t) CompositeExtract 213 0
+                              Store 214 215
+             216:    189(ptr) AccessChain 34(data) 207 61 57
+             217: 21(int16_t) CompositeExtract 213 1
+                              Store 216 217
+             218:    189(ptr) AccessChain 34(data) 207 61 72
+             219: 21(int16_t) CompositeExtract 213 2
+                              Store 218 219
+             220:      6(int) Load 8(invocation)
+             221:    197(ptr) AccessChain 34(data) 76 61
+             222: 22(i16vec4) Load 221
              223:      6(int) Load 8(invocation)
-             224:189(i16vec3) GroupNonUniformShuffleXor 43 222 223
-             225:    179(ptr) AccessChain 34(data) 219 59
-             226: 22(i16vec4) Load 225
-             227: 22(i16vec4) VectorShuffle 226 224 4 5 6 3
-                              Store 225 227
-             228:      6(int) Load 8(invocation)
-             229:    179(ptr) AccessChain 34(data) 70 59
-             230: 22(i16vec4) Load 229
-             231:      6(int) Load 8(invocation)
-             232: 22(i16vec4) GroupNonUniformShuffleXor 43 230 231
-             233:    179(ptr) AccessChain 34(data) 228 59
-                              Store 233 232
-             234:      6(int) Load 8(invocation)
-             236:    235(ptr) AccessChain 34(data) 37 70 38
-             237: 23(int16_t) Load 236
-             238:      6(int) Load 8(invocation)
-             239: 23(int16_t) GroupNonUniformShuffle 43 237 238
-             240:    235(ptr) AccessChain 34(data) 234 70 38
-                              Store 240 239
-             241:      6(int) Load 8(invocation)
-             244:    243(ptr) AccessChain 34(data) 47 70
-             245: 24(i16vec4) Load 244
-             246:242(i16vec2) VectorShuffle 245 245 0 1
-             247:      6(int) Load 8(invocation)
-             248:242(i16vec2) GroupNonUniformShuffle 43 246 247
-             249:    243(ptr) AccessChain 34(data) 241 70
-             250: 24(i16vec4) Load 249
-             251: 24(i16vec4) VectorShuffle 250 248 4 5 2 3
-                              Store 249 251
-             252:      6(int) Load 8(invocation)
-             254:    243(ptr) AccessChain 34(data) 59 70
-             255: 24(i16vec4) Load 254
-             256:253(i16vec3) VectorShuffle 255 255 0 1 2
+             224: 22(i16vec4) GroupNonUniformShuffle 43 222 223
+             225:    197(ptr) AccessChain 34(data) 220 61
+                              Store 225 224
+             226:      6(int) Load 8(invocation)
+             227:    189(ptr) AccessChain 34(data) 37 61 38
+             228: 21(int16_t) Load 227
+             229:      6(int) Load 8(invocation)
+             230: 21(int16_t) GroupNonUniformShuffleXor 43 228 229
+             231:    189(ptr) AccessChain 34(data) 226 61 38
+                              Store 231 230
+             232:      6(int) Load 8(invocation)
+             233:    197(ptr) AccessChain 34(data) 47 61
+             234: 22(i16vec4) Load 233
+             235:196(i16vec2) VectorShuffle 234 234 0 1
+             236:      6(int) Load 8(invocation)
+             237:196(i16vec2) GroupNonUniformShuffleXor 43 235 236
+             238:    189(ptr) AccessChain 34(data) 232 61 38
+             239: 21(int16_t) CompositeExtract 237 0
+                              Store 238 239
+             240:    189(ptr) AccessChain 34(data) 232 61 57
+             241: 21(int16_t) CompositeExtract 237 1
+                              Store 240 241
+             242:      6(int) Load 8(invocation)
+             243:    197(ptr) AccessChain 34(data) 61 61
+             244: 22(i16vec4) Load 243
+             245:208(i16vec3) VectorShuffle 244 244 0 1 2
+             246:      6(int) Load 8(invocation)
+             247:208(i16vec3) GroupNonUniformShuffleXor 43 245 246
+             248:    189(ptr) AccessChain 34(data) 242 61 38
+             249: 21(int16_t) CompositeExtract 247 0
+                              Store 248 249
+             250:    189(ptr) AccessChain 34(data) 242 61 57
+             251: 21(int16_t) CompositeExtract 247 1
+                              Store 250 251
+             252:    189(ptr) AccessChain 34(data) 242 61 72
+             253: 21(int16_t) CompositeExtract 247 2
+                              Store 252 253
+             254:      6(int) Load 8(invocation)
+             255:    197(ptr) AccessChain 34(data) 76 61
+             256: 22(i16vec4) Load 255
              257:      6(int) Load 8(invocation)
-             258:253(i16vec3) GroupNonUniformShuffle 43 256 257
-             259:    243(ptr) AccessChain 34(data) 252 70
-             260: 24(i16vec4) Load 259
-             261: 24(i16vec4) VectorShuffle 260 258 4 5 6 3
-                              Store 259 261
-             262:      6(int) Load 8(invocation)
-             263:    243(ptr) AccessChain 34(data) 70 70
-             264: 24(i16vec4) Load 263
-             265:      6(int) Load 8(invocation)
-             266: 24(i16vec4) GroupNonUniformShuffle 43 264 265
-             267:    243(ptr) AccessChain 34(data) 262 70
-                              Store 267 266
-             268:      6(int) Load 8(invocation)
-             269:    235(ptr) AccessChain 34(data) 37 70 38
-             270: 23(int16_t) Load 269
-             271:      6(int) Load 8(invocation)
-             272: 23(int16_t) GroupNonUniformShuffleXor 43 270 271
-             273:    235(ptr) AccessChain 34(data) 268 70 38
-                              Store 273 272
-             274:      6(int) Load 8(invocation)
-             275:    243(ptr) AccessChain 34(data) 47 70
-             276: 24(i16vec4) Load 275
-             277:242(i16vec2) VectorShuffle 276 276 0 1
-             278:      6(int) Load 8(invocation)
-             279:242(i16vec2) GroupNonUniformShuffleXor 43 277 278
-             280:    243(ptr) AccessChain 34(data) 274 70
-             281: 24(i16vec4) Load 280
-             282: 24(i16vec4) VectorShuffle 281 279 4 5 2 3
-                              Store 280 282
-             283:      6(int) Load 8(invocation)
-             284:    243(ptr) AccessChain 34(data) 59 70
-             285: 24(i16vec4) Load 284
-             286:253(i16vec3) VectorShuffle 285 285 0 1 2
-             287:      6(int) Load 8(invocation)
-             288:253(i16vec3) GroupNonUniformShuffleXor 43 286 287
-             289:    243(ptr) AccessChain 34(data) 283 70
-             290: 24(i16vec4) Load 289
-             291: 24(i16vec4) VectorShuffle 290 288 4 5 6 3
-                              Store 289 291
+             258: 22(i16vec4) GroupNonUniformShuffleXor 43 256 257
+             259:    197(ptr) AccessChain 34(data) 254 61
+                              Store 259 258
+             260:      6(int) Load 8(invocation)
+             262:    261(ptr) AccessChain 34(data) 37 76 38
+             263: 23(int16_t) Load 262
+             264:      6(int) Load 8(invocation)
+             265: 23(int16_t) GroupNonUniformShuffle 43 263 264
+             266:    261(ptr) AccessChain 34(data) 260 76 38
+                              Store 266 265
+             267:      6(int) Load 8(invocation)
+             270:    269(ptr) AccessChain 34(data) 47 76
+             271: 24(i16vec4) Load 270
+             272:268(i16vec2) VectorShuffle 271 271 0 1
+             273:      6(int) Load 8(invocation)
+             274:268(i16vec2) GroupNonUniformShuffle 43 272 273
+             275:    261(ptr) AccessChain 34(data) 267 76 38
+             276: 23(int16_t) CompositeExtract 274 0
+                              Store 275 276
+             277:    261(ptr) AccessChain 34(data) 267 76 57
+             278: 23(int16_t) CompositeExtract 274 1
+                              Store 277 278
+             279:      6(int) Load 8(invocation)
+             281:    269(ptr) AccessChain 34(data) 61 76
+             282: 24(i16vec4) Load 281
+             283:280(i16vec3) VectorShuffle 282 282 0 1 2
+             284:      6(int) Load 8(invocation)
+             285:280(i16vec3) GroupNonUniformShuffle 43 283 284
+             286:    261(ptr) AccessChain 34(data) 279 76 38
+             287: 23(int16_t) CompositeExtract 285 0
+                              Store 286 287
+             288:    261(ptr) AccessChain 34(data) 279 76 57
+             289: 23(int16_t) CompositeExtract 285 1
+                              Store 288 289
+             290:    261(ptr) AccessChain 34(data) 279 76 72
+             291: 23(int16_t) CompositeExtract 285 2
+                              Store 290 291
              292:      6(int) Load 8(invocation)
-             293:    243(ptr) AccessChain 34(data) 70 70
+             293:    269(ptr) AccessChain 34(data) 76 76
              294: 24(i16vec4) Load 293
              295:      6(int) Load 8(invocation)
-             296: 24(i16vec4) GroupNonUniformShuffleXor 43 294 295
-             297:    243(ptr) AccessChain 34(data) 292 70
+             296: 24(i16vec4) GroupNonUniformShuffle 43 294 295
+             297:    269(ptr) AccessChain 34(data) 292 76
                               Store 297 296
              298:      6(int) Load 8(invocation)
-             301:    300(ptr) AccessChain 34(data) 37 299 38
-             302: 25(int64_t) Load 301
-             303:      6(int) Load 8(invocation)
-             304: 25(int64_t) GroupNonUniformShuffle 43 302 303
-             305:    300(ptr) AccessChain 34(data) 298 299 38
-                              Store 305 304
-             306:      6(int) Load 8(invocation)
-             309:    308(ptr) AccessChain 34(data) 47 299
-             310: 26(i64vec4) Load 309
-             311:307(i64vec2) VectorShuffle 310 310 0 1
-             312:      6(int) Load 8(invocation)
-             313:307(i64vec2) GroupNonUniformShuffle 43 311 312
-             314:    308(ptr) AccessChain 34(data) 306 299
-             315: 26(i64vec4) Load 314
-             316: 26(i64vec4) VectorShuffle 315 313 4 5 2 3
-                              Store 314 316
-             317:      6(int) Load 8(invocation)
-             319:    308(ptr) AccessChain 34(data) 59 299
-             320: 26(i64vec4) Load 319
-             321:318(i64vec3) VectorShuffle 320 320 0 1 2
-             322:      6(int) Load 8(invocation)
-             323:318(i64vec3) GroupNonUniformShuffle 43 321 322
-             324:    308(ptr) AccessChain 34(data) 317 299
-             325: 26(i64vec4) Load 324
-             326: 26(i64vec4) VectorShuffle 325 323 4 5 6 3
-                              Store 324 326
-             327:      6(int) Load 8(invocation)
-             328:    308(ptr) AccessChain 34(data) 70 299
-             329: 26(i64vec4) Load 328
-             330:      6(int) Load 8(invocation)
-             331: 26(i64vec4) GroupNonUniformShuffle 43 329 330
-             332:    308(ptr) AccessChain 34(data) 327 299
-                              Store 332 331
-             333:      6(int) Load 8(invocation)
-             334:    300(ptr) AccessChain 34(data) 37 299 38
-             335: 25(int64_t) Load 334
-             336:      6(int) Load 8(invocation)
-             337: 25(int64_t) GroupNonUniformShuffleXor 43 335 336
-             338:    300(ptr) AccessChain 34(data) 333 299 38
-                              Store 338 337
-             339:      6(int) Load 8(invocation)
-             340:    308(ptr) AccessChain 34(data) 47 299
-             341: 26(i64vec4) Load 340
-             342:307(i64vec2) VectorShuffle 341 341 0 1
-             343:      6(int) Load 8(invocation)
-             344:307(i64vec2) GroupNonUniformShuffleXor 43 342 343
-             345:    308(ptr) AccessChain 34(data) 339 299
-             346: 26(i64vec4) Load 345
-             347: 26(i64vec4) VectorShuffle 346 344 4 5 2 3
-                              Store 345 347
-             348:      6(int) Load 8(invocation)
-             349:    308(ptr) AccessChain 34(data) 59 299
-             350: 26(i64vec4) Load 349
-             351:318(i64vec3) VectorShuffle 350 350 0 1 2
+             299:    261(ptr) AccessChain 34(data) 37 76 38
+             300: 23(int16_t) Load 299
+             301:      6(int) Load 8(invocation)
+             302: 23(int16_t) GroupNonUniformShuffleXor 43 300 301
+             303:    261(ptr) AccessChain 34(data) 298 76 38
+                              Store 303 302
+             304:      6(int) Load 8(invocation)
+             305:    269(ptr) AccessChain 34(data) 47 76
+             306: 24(i16vec4) Load 305
+             307:268(i16vec2) VectorShuffle 306 306 0 1
+             308:      6(int) Load 8(invocation)
+             309:268(i16vec2) GroupNonUniformShuffleXor 43 307 308
+             310:    261(ptr) AccessChain 34(data) 304 76 38
+             311: 23(int16_t) CompositeExtract 309 0
+                              Store 310 311
+             312:    261(ptr) AccessChain 34(data) 304 76 57
+             313: 23(int16_t) CompositeExtract 309 1
+                              Store 312 313
+             314:      6(int) Load 8(invocation)
+             315:    269(ptr) AccessChain 34(data) 61 76
+             316: 24(i16vec4) Load 315
+             317:280(i16vec3) VectorShuffle 316 316 0 1 2
+             318:      6(int) Load 8(invocation)
+             319:280(i16vec3) GroupNonUniformShuffleXor 43 317 318
+             320:    261(ptr) AccessChain 34(data) 314 76 38
+             321: 23(int16_t) CompositeExtract 319 0
+                              Store 320 321
+             322:    261(ptr) AccessChain 34(data) 314 76 57
+             323: 23(int16_t) CompositeExtract 319 1
+                              Store 322 323
+             324:    261(ptr) AccessChain 34(data) 314 76 72
+             325: 23(int16_t) CompositeExtract 319 2
+                              Store 324 325
+             326:      6(int) Load 8(invocation)
+             327:    269(ptr) AccessChain 34(data) 76 76
+             328: 24(i16vec4) Load 327
+             329:      6(int) Load 8(invocation)
+             330: 24(i16vec4) GroupNonUniformShuffleXor 43 328 329
+             331:    269(ptr) AccessChain 34(data) 326 76
+                              Store 331 330
+             332:      6(int) Load 8(invocation)
+             335:    334(ptr) AccessChain 34(data) 37 333 38
+             336: 25(int64_t) Load 335
+             337:      6(int) Load 8(invocation)
+             338: 25(int64_t) GroupNonUniformShuffle 43 336 337
+             339:    334(ptr) AccessChain 34(data) 332 333 38
+                              Store 339 338
+             340:      6(int) Load 8(invocation)
+             343:    342(ptr) AccessChain 34(data) 47 333
+             344: 26(i64vec4) Load 343
+             345:341(i64vec2) VectorShuffle 344 344 0 1
+             346:      6(int) Load 8(invocation)
+             347:341(i64vec2) GroupNonUniformShuffle 43 345 346
+             348:    334(ptr) AccessChain 34(data) 340 333 38
+             349: 25(int64_t) CompositeExtract 347 0
+                              Store 348 349
+             350:    334(ptr) AccessChain 34(data) 340 333 57
+             351: 25(int64_t) CompositeExtract 347 1
+                              Store 350 351
              352:      6(int) Load 8(invocation)
-             353:318(i64vec3) GroupNonUniformShuffleXor 43 351 352
-             354:    308(ptr) AccessChain 34(data) 348 299
+             354:    342(ptr) AccessChain 34(data) 61 333
              355: 26(i64vec4) Load 354
-             356: 26(i64vec4) VectorShuffle 355 353 4 5 6 3
-                              Store 354 356
+             356:353(i64vec3) VectorShuffle 355 355 0 1 2
              357:      6(int) Load 8(invocation)
-             358:    308(ptr) AccessChain 34(data) 70 299
-             359: 26(i64vec4) Load 358
-             360:      6(int) Load 8(invocation)
-             361: 26(i64vec4) GroupNonUniformShuffleXor 43 359 360
-             362:    308(ptr) AccessChain 34(data) 357 299
-                              Store 362 361
-             363:      6(int) Load 8(invocation)
-             366:    365(ptr) AccessChain 34(data) 37 364 38
-             367: 27(int64_t) Load 366
+             358:353(i64vec3) GroupNonUniformShuffle 43 356 357
+             359:    334(ptr) AccessChain 34(data) 352 333 38
+             360: 25(int64_t) CompositeExtract 358 0
+                              Store 359 360
+             361:    334(ptr) AccessChain 34(data) 352 333 57
+             362: 25(int64_t) CompositeExtract 358 1
+                              Store 361 362
+             363:    334(ptr) AccessChain 34(data) 352 333 72
+             364: 25(int64_t) CompositeExtract 358 2
+                              Store 363 364
+             365:      6(int) Load 8(invocation)
+             366:    342(ptr) AccessChain 34(data) 76 333
+             367: 26(i64vec4) Load 366
              368:      6(int) Load 8(invocation)
-             369: 27(int64_t) GroupNonUniformShuffle 43 367 368
-             370:    365(ptr) AccessChain 34(data) 363 364 38
+             369: 26(i64vec4) GroupNonUniformShuffle 43 367 368
+             370:    342(ptr) AccessChain 34(data) 365 333
                               Store 370 369
              371:      6(int) Load 8(invocation)
-             374:    373(ptr) AccessChain 34(data) 47 364
-             375: 28(i64vec4) Load 374
-             376:372(i64vec2) VectorShuffle 375 375 0 1
+             372:    334(ptr) AccessChain 34(data) 37 333 38
+             373: 25(int64_t) Load 372
+             374:      6(int) Load 8(invocation)
+             375: 25(int64_t) GroupNonUniformShuffleXor 43 373 374
+             376:    334(ptr) AccessChain 34(data) 371 333 38
+                              Store 376 375
              377:      6(int) Load 8(invocation)
-             378:372(i64vec2) GroupNonUniformShuffle 43 376 377
-             379:    373(ptr) AccessChain 34(data) 371 364
-             380: 28(i64vec4) Load 379
-             381: 28(i64vec4) VectorShuffle 380 378 4 5 2 3
-                              Store 379 381
-             382:      6(int) Load 8(invocation)
-             384:    373(ptr) AccessChain 34(data) 59 364
-             385: 28(i64vec4) Load 384
-             386:383(i64vec3) VectorShuffle 385 385 0 1 2
+             378:    342(ptr) AccessChain 34(data) 47 333
+             379: 26(i64vec4) Load 378
+             380:341(i64vec2) VectorShuffle 379 379 0 1
+             381:      6(int) Load 8(invocation)
+             382:341(i64vec2) GroupNonUniformShuffleXor 43 380 381
+             383:    334(ptr) AccessChain 34(data) 377 333 38
+             384: 25(int64_t) CompositeExtract 382 0
+                              Store 383 384
+             385:    334(ptr) AccessChain 34(data) 377 333 57
+             386: 25(int64_t) CompositeExtract 382 1
+                              Store 385 386
              387:      6(int) Load 8(invocation)
-             388:383(i64vec3) GroupNonUniformShuffle 43 386 387
-             389:    373(ptr) AccessChain 34(data) 382 364
-             390: 28(i64vec4) Load 389
-             391: 28(i64vec4) VectorShuffle 390 388 4 5 6 3
-                              Store 389 391
-             392:      6(int) Load 8(invocation)
-             393:    373(ptr) AccessChain 34(data) 70 364
-             394: 28(i64vec4) Load 393
-             395:      6(int) Load 8(invocation)
-             396: 28(i64vec4) GroupNonUniformShuffle 43 394 395
-             397:    373(ptr) AccessChain 34(data) 392 364
-                              Store 397 396
-             398:      6(int) Load 8(invocation)
-             399:    365(ptr) AccessChain 34(data) 37 364 38
-             400: 27(int64_t) Load 399
-             401:      6(int) Load 8(invocation)
-             402: 27(int64_t) GroupNonUniformShuffleXor 43 400 401
-             403:    365(ptr) AccessChain 34(data) 398 364 38
-                              Store 403 402
-             404:      6(int) Load 8(invocation)
-             405:    373(ptr) AccessChain 34(data) 47 364
-             406: 28(i64vec4) Load 405
-             407:372(i64vec2) VectorShuffle 406 406 0 1
-             408:      6(int) Load 8(invocation)
-             409:372(i64vec2) GroupNonUniformShuffleXor 43 407 408
-             410:    373(ptr) AccessChain 34(data) 404 364
-             411: 28(i64vec4) Load 410
-             412: 28(i64vec4) VectorShuffle 411 409 4 5 2 3
-                              Store 410 412
+             388:    342(ptr) AccessChain 34(data) 61 333
+             389: 26(i64vec4) Load 388
+             390:353(i64vec3) VectorShuffle 389 389 0 1 2
+             391:      6(int) Load 8(invocation)
+             392:353(i64vec3) GroupNonUniformShuffleXor 43 390 391
+             393:    334(ptr) AccessChain 34(data) 387 333 38
+             394: 25(int64_t) CompositeExtract 392 0
+                              Store 393 394
+             395:    334(ptr) AccessChain 34(data) 387 333 57
+             396: 25(int64_t) CompositeExtract 392 1
+                              Store 395 396
+             397:    334(ptr) AccessChain 34(data) 387 333 72
+             398: 25(int64_t) CompositeExtract 392 2
+                              Store 397 398
+             399:      6(int) Load 8(invocation)
+             400:    342(ptr) AccessChain 34(data) 76 333
+             401: 26(i64vec4) Load 400
+             402:      6(int) Load 8(invocation)
+             403: 26(i64vec4) GroupNonUniformShuffleXor 43 401 402
+             404:    342(ptr) AccessChain 34(data) 399 333
+                              Store 404 403
+             405:      6(int) Load 8(invocation)
+             408:    407(ptr) AccessChain 34(data) 37 406 38
+             409: 27(int64_t) Load 408
+             410:      6(int) Load 8(invocation)
+             411: 27(int64_t) GroupNonUniformShuffle 43 409 410
+             412:    407(ptr) AccessChain 34(data) 405 406 38
+                              Store 412 411
              413:      6(int) Load 8(invocation)
-             414:    373(ptr) AccessChain 34(data) 59 364
-             415: 28(i64vec4) Load 414
-             416:383(i64vec3) VectorShuffle 415 415 0 1 2
-             417:      6(int) Load 8(invocation)
-             418:383(i64vec3) GroupNonUniformShuffleXor 43 416 417
-             419:    373(ptr) AccessChain 34(data) 413 364
-             420: 28(i64vec4) Load 419
-             421: 28(i64vec4) VectorShuffle 420 418 4 5 6 3
-                              Store 419 421
-             422:      6(int) Load 8(invocation)
-             423:    373(ptr) AccessChain 34(data) 70 364
-             424: 28(i64vec4) Load 423
+             416:    415(ptr) AccessChain 34(data) 47 406
+             417: 28(i64vec4) Load 416
+             418:414(i64vec2) VectorShuffle 417 417 0 1
+             419:      6(int) Load 8(invocation)
+             420:414(i64vec2) GroupNonUniformShuffle 43 418 419
+             421:    407(ptr) AccessChain 34(data) 413 406 38
+             422: 27(int64_t) CompositeExtract 420 0
+                              Store 421 422
+             423:    407(ptr) AccessChain 34(data) 413 406 57
+             424: 27(int64_t) CompositeExtract 420 1
+                              Store 423 424
              425:      6(int) Load 8(invocation)
-             426: 28(i64vec4) GroupNonUniformShuffleXor 43 424 425
-             427:    373(ptr) AccessChain 34(data) 422 364
-                              Store 427 426
-             428:      6(int) Load 8(invocation)
-             431:    430(ptr) AccessChain 34(data) 37 429 38
-             432:29(float16_t) Load 431
-             433:      6(int) Load 8(invocation)
-             434:29(float16_t) GroupNonUniformShuffle 43 432 433
-             435:    430(ptr) AccessChain 34(data) 428 429 38
-                              Store 435 434
-             436:      6(int) Load 8(invocation)
-             439:    438(ptr) AccessChain 34(data) 47 429
-             440: 30(f16vec4) Load 439
-             441:437(f16vec2) VectorShuffle 440 440 0 1
-             442:      6(int) Load 8(invocation)
-             443:437(f16vec2) GroupNonUniformShuffle 43 441 442
-             444:    438(ptr) AccessChain 34(data) 436 429
-             445: 30(f16vec4) Load 444
-             446: 30(f16vec4) VectorShuffle 445 443 4 5 2 3
-                              Store 444 446
+             427:    415(ptr) AccessChain 34(data) 61 406
+             428: 28(i64vec4) Load 427
+             429:426(i64vec3) VectorShuffle 428 428 0 1 2
+             430:      6(int) Load 8(invocation)
+             431:426(i64vec3) GroupNonUniformShuffle 43 429 430
+             432:    407(ptr) AccessChain 34(data) 425 406 38
+             433: 27(int64_t) CompositeExtract 431 0
+                              Store 432 433
+             434:    407(ptr) AccessChain 34(data) 425 406 57
+             435: 27(int64_t) CompositeExtract 431 1
+                              Store 434 435
+             436:    407(ptr) AccessChain 34(data) 425 406 72
+             437: 27(int64_t) CompositeExtract 431 2
+                              Store 436 437
+             438:      6(int) Load 8(invocation)
+             439:    415(ptr) AccessChain 34(data) 76 406
+             440: 28(i64vec4) Load 439
+             441:      6(int) Load 8(invocation)
+             442: 28(i64vec4) GroupNonUniformShuffle 43 440 441
+             443:    415(ptr) AccessChain 34(data) 438 406
+                              Store 443 442
+             444:      6(int) Load 8(invocation)
+             445:    407(ptr) AccessChain 34(data) 37 406 38
+             446: 27(int64_t) Load 445
              447:      6(int) Load 8(invocation)
-             449:    438(ptr) AccessChain 34(data) 59 429
-             450: 30(f16vec4) Load 449
-             451:448(f16vec3) VectorShuffle 450 450 0 1 2
-             452:      6(int) Load 8(invocation)
-             453:448(f16vec3) GroupNonUniformShuffle 43 451 452
-             454:    438(ptr) AccessChain 34(data) 447 429
-             455: 30(f16vec4) Load 454
-             456: 30(f16vec4) VectorShuffle 455 453 4 5 6 3
-                              Store 454 456
-             457:      6(int) Load 8(invocation)
-             458:    438(ptr) AccessChain 34(data) 70 429
-             459: 30(f16vec4) Load 458
+             448: 27(int64_t) GroupNonUniformShuffleXor 43 446 447
+             449:    407(ptr) AccessChain 34(data) 444 406 38
+                              Store 449 448
+             450:      6(int) Load 8(invocation)
+             451:    415(ptr) AccessChain 34(data) 47 406
+             452: 28(i64vec4) Load 451
+             453:414(i64vec2) VectorShuffle 452 452 0 1
+             454:      6(int) Load 8(invocation)
+             455:414(i64vec2) GroupNonUniformShuffleXor 43 453 454
+             456:    407(ptr) AccessChain 34(data) 450 406 38
+             457: 27(int64_t) CompositeExtract 455 0
+                              Store 456 457
+             458:    407(ptr) AccessChain 34(data) 450 406 57
+             459: 27(int64_t) CompositeExtract 455 1
+                              Store 458 459
              460:      6(int) Load 8(invocation)
-             461: 30(f16vec4) GroupNonUniformShuffle 43 459 460
-             462:    438(ptr) AccessChain 34(data) 457 429
-                              Store 462 461
-             463:      6(int) Load 8(invocation)
-             464:    430(ptr) AccessChain 34(data) 37 429 38
-             465:29(float16_t) Load 464
-             466:      6(int) Load 8(invocation)
-             467:29(float16_t) GroupNonUniformShuffleXor 43 465 466
-             468:    430(ptr) AccessChain 34(data) 463 429 38
-                              Store 468 467
-             469:      6(int) Load 8(invocation)
-             470:    438(ptr) AccessChain 34(data) 47 429
-             471: 30(f16vec4) Load 470
-             472:437(f16vec2) VectorShuffle 471 471 0 1
-             473:      6(int) Load 8(invocation)
-             474:437(f16vec2) GroupNonUniformShuffleXor 43 472 473
-             475:    438(ptr) AccessChain 34(data) 469 429
-             476: 30(f16vec4) Load 475
-             477: 30(f16vec4) VectorShuffle 476 474 4 5 2 3
-                              Store 475 477
+             461:    415(ptr) AccessChain 34(data) 61 406
+             462: 28(i64vec4) Load 461
+             463:426(i64vec3) VectorShuffle 462 462 0 1 2
+             464:      6(int) Load 8(invocation)
+             465:426(i64vec3) GroupNonUniformShuffleXor 43 463 464
+             466:    407(ptr) AccessChain 34(data) 460 406 38
+             467: 27(int64_t) CompositeExtract 465 0
+                              Store 466 467
+             468:    407(ptr) AccessChain 34(data) 460 406 57
+             469: 27(int64_t) CompositeExtract 465 1
+                              Store 468 469
+             470:    407(ptr) AccessChain 34(data) 460 406 72
+             471: 27(int64_t) CompositeExtract 465 2
+                              Store 470 471
+             472:      6(int) Load 8(invocation)
+             473:    415(ptr) AccessChain 34(data) 76 406
+             474: 28(i64vec4) Load 473
+             475:      6(int) Load 8(invocation)
+             476: 28(i64vec4) GroupNonUniformShuffleXor 43 474 475
+             477:    415(ptr) AccessChain 34(data) 472 406
+                              Store 477 476
              478:      6(int) Load 8(invocation)
-             479:    438(ptr) AccessChain 34(data) 59 429
-             480: 30(f16vec4) Load 479
-             481:448(f16vec3) VectorShuffle 480 480 0 1 2
-             482:      6(int) Load 8(invocation)
-             483:448(f16vec3) GroupNonUniformShuffleXor 43 481 482
-             484:    438(ptr) AccessChain 34(data) 478 429
-             485: 30(f16vec4) Load 484
-             486: 30(f16vec4) VectorShuffle 485 483 4 5 6 3
-                              Store 484 486
-             487:      6(int) Load 8(invocation)
-             488:    438(ptr) AccessChain 34(data) 70 429
-             489: 30(f16vec4) Load 488
-             490:      6(int) Load 8(invocation)
-             491: 30(f16vec4) GroupNonUniformShuffleXor 43 489 490
-             492:    438(ptr) AccessChain 34(data) 487 429
-                              Store 492 491
+             481:    480(ptr) AccessChain 34(data) 37 479 38
+             482:29(float16_t) Load 481
+             483:      6(int) Load 8(invocation)
+             484:29(float16_t) GroupNonUniformShuffle 43 482 483
+             485:    480(ptr) AccessChain 34(data) 478 479 38
+                              Store 485 484
+             486:      6(int) Load 8(invocation)
+             489:    488(ptr) AccessChain 34(data) 47 479
+             490: 30(f16vec4) Load 489
+             491:487(f16vec2) VectorShuffle 490 490 0 1
+             492:      6(int) Load 8(invocation)
+             493:487(f16vec2) GroupNonUniformShuffle 43 491 492
+             494:    480(ptr) AccessChain 34(data) 486 479 38
+             495:29(float16_t) CompositeExtract 493 0
+                              Store 494 495
+             496:    480(ptr) AccessChain 34(data) 486 479 57
+             497:29(float16_t) CompositeExtract 493 1
+                              Store 496 497
+             498:      6(int) Load 8(invocation)
+             500:    488(ptr) AccessChain 34(data) 61 479
+             501: 30(f16vec4) Load 500
+             502:499(f16vec3) VectorShuffle 501 501 0 1 2
+             503:      6(int) Load 8(invocation)
+             504:499(f16vec3) GroupNonUniformShuffle 43 502 503
+             505:    480(ptr) AccessChain 34(data) 498 479 38
+             506:29(float16_t) CompositeExtract 504 0
+                              Store 505 506
+             507:    480(ptr) AccessChain 34(data) 498 479 57
+             508:29(float16_t) CompositeExtract 504 1
+                              Store 507 508
+             509:    480(ptr) AccessChain 34(data) 498 479 72
+             510:29(float16_t) CompositeExtract 504 2
+                              Store 509 510
+             511:      6(int) Load 8(invocation)
+             512:    488(ptr) AccessChain 34(data) 76 479
+             513: 30(f16vec4) Load 512
+             514:      6(int) Load 8(invocation)
+             515: 30(f16vec4) GroupNonUniformShuffle 43 513 514
+             516:    488(ptr) AccessChain 34(data) 511 479
+                              Store 516 515
+             517:      6(int) Load 8(invocation)
+             518:    480(ptr) AccessChain 34(data) 37 479 38
+             519:29(float16_t) Load 518
+             520:      6(int) Load 8(invocation)
+             521:29(float16_t) GroupNonUniformShuffleXor 43 519 520
+             522:    480(ptr) AccessChain 34(data) 517 479 38
+                              Store 522 521
+             523:      6(int) Load 8(invocation)
+             524:    488(ptr) AccessChain 34(data) 47 479
+             525: 30(f16vec4) Load 524
+             526:487(f16vec2) VectorShuffle 525 525 0 1
+             527:      6(int) Load 8(invocation)
+             528:487(f16vec2) GroupNonUniformShuffleXor 43 526 527
+             529:    480(ptr) AccessChain 34(data) 523 479 38
+             530:29(float16_t) CompositeExtract 528 0
+                              Store 529 530
+             531:    480(ptr) AccessChain 34(data) 523 479 57
+             532:29(float16_t) CompositeExtract 528 1
+                              Store 531 532
+             533:      6(int) Load 8(invocation)
+             534:    488(ptr) AccessChain 34(data) 61 479
+             535: 30(f16vec4) Load 534
+             536:499(f16vec3) VectorShuffle 535 535 0 1 2
+             537:      6(int) Load 8(invocation)
+             538:499(f16vec3) GroupNonUniformShuffleXor 43 536 537
+             539:    480(ptr) AccessChain 34(data) 533 479 38
+             540:29(float16_t) CompositeExtract 538 0
+                              Store 539 540
+             541:    480(ptr) AccessChain 34(data) 533 479 57
+             542:29(float16_t) CompositeExtract 538 1
+                              Store 541 542
+             543:    480(ptr) AccessChain 34(data) 533 479 72
+             544:29(float16_t) CompositeExtract 538 2
+                              Store 543 544
+             545:      6(int) Load 8(invocation)
+             546:    488(ptr) AccessChain 34(data) 76 479
+             547: 30(f16vec4) Load 546
+             548:      6(int) Load 8(invocation)
+             549: 30(f16vec4) GroupNonUniformShuffleXor 43 547 548
+             550:    488(ptr) AccessChain 34(data) 545 479
+                              Store 550 549
                               Return
                               FunctionEnd
diff --git a/third_party/vulkan-deps/glslang/src/Test/baseResults/spv.subgroupExtendedTypesShuffleRelative.comp.out b/third_party/vulkan-deps/glslang/src/Test/baseResults/spv.subgroupExtendedTypesShuffleRelative.comp.out
index d847be5..8665c46 100644
--- a/third_party/vulkan-deps/glslang/src/Test/baseResults/spv.subgroupExtendedTypesShuffleRelative.comp.out
+++ b/third_party/vulkan-deps/glslang/src/Test/baseResults/spv.subgroupExtendedTypesShuffleRelative.comp.out
@@ -1,7 +1,7 @@
 spv.subgroupExtendedTypesShuffleRelative.comp
 // Module Version 10300
 // Generated by (magic number): 8000a
-// Id's are bound by 497
+// Id's are bound by 554
 
                               Capability Shader
                               Capability Float16
@@ -59,7 +59,7 @@
                               Decorate 31(Buffers) Block
                               Decorate 34(data) DescriptorSet 0
                               Decorate 34(data) Binding 0
-                              Decorate 496 BuiltIn WorkgroupSize
+                              Decorate 553 BuiltIn WorkgroupSize
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeInt 32 0
@@ -94,40 +94,41 @@
               47:     36(int) Constant 1
               48:             TypeVector 17(int8_t) 2
               49:             TypePointer StorageBuffer 18(i8vec4)
-              59:     36(int) Constant 2
-              60:             TypeVector 17(int8_t) 3
-              70:     36(int) Constant 3
-             107:             TypePointer StorageBuffer 19(int8_t)
-             114:             TypeVector 19(int8_t) 2
-             115:             TypePointer StorageBuffer 20(i8vec4)
-             125:             TypeVector 19(int8_t) 3
-             171:             TypePointer StorageBuffer 21(int16_t)
-             178:             TypeVector 21(int16_t) 2
-             179:             TypePointer StorageBuffer 22(i16vec4)
-             189:             TypeVector 21(int16_t) 3
-             235:             TypePointer StorageBuffer 23(int16_t)
-             242:             TypeVector 23(int16_t) 2
-             243:             TypePointer StorageBuffer 24(i16vec4)
-             253:             TypeVector 23(int16_t) 3
-             299:     36(int) Constant 4
-             300:             TypePointer StorageBuffer 25(int64_t)
-             307:             TypeVector 25(int64_t) 2
-             308:             TypePointer StorageBuffer 26(i64vec4)
-             318:             TypeVector 25(int64_t) 3
-             364:     36(int) Constant 5
-             365:             TypePointer StorageBuffer 27(int64_t)
-             372:             TypeVector 27(int64_t) 2
-             373:             TypePointer StorageBuffer 28(i64vec4)
-             383:             TypeVector 27(int64_t) 3
-             429:     36(int) Constant 6
-             430:             TypePointer StorageBuffer 29(float16_t)
-             437:             TypeVector 29(float16_t) 2
-             438:             TypePointer StorageBuffer 30(f16vec4)
-             448:             TypeVector 29(float16_t) 3
-             493:             TypeVector 6(int) 3
-             494:      6(int) Constant 8
-             495:      6(int) Constant 1
-             496:  493(ivec3) ConstantComposite 494 495 495
+              57:      6(int) Constant 1
+              61:     36(int) Constant 2
+              62:             TypeVector 17(int8_t) 3
+              72:      6(int) Constant 2
+              76:     36(int) Constant 3
+             117:             TypePointer StorageBuffer 19(int8_t)
+             124:             TypeVector 19(int8_t) 2
+             125:             TypePointer StorageBuffer 20(i8vec4)
+             136:             TypeVector 19(int8_t) 3
+             189:             TypePointer StorageBuffer 21(int16_t)
+             196:             TypeVector 21(int16_t) 2
+             197:             TypePointer StorageBuffer 22(i16vec4)
+             208:             TypeVector 21(int16_t) 3
+             261:             TypePointer StorageBuffer 23(int16_t)
+             268:             TypeVector 23(int16_t) 2
+             269:             TypePointer StorageBuffer 24(i16vec4)
+             280:             TypeVector 23(int16_t) 3
+             333:     36(int) Constant 4
+             334:             TypePointer StorageBuffer 25(int64_t)
+             341:             TypeVector 25(int64_t) 2
+             342:             TypePointer StorageBuffer 26(i64vec4)
+             353:             TypeVector 25(int64_t) 3
+             406:     36(int) Constant 5
+             407:             TypePointer StorageBuffer 27(int64_t)
+             414:             TypeVector 27(int64_t) 2
+             415:             TypePointer StorageBuffer 28(i64vec4)
+             426:             TypeVector 27(int64_t) 3
+             479:     36(int) Constant 6
+             480:             TypePointer StorageBuffer 29(float16_t)
+             487:             TypeVector 29(float16_t) 2
+             488:             TypePointer StorageBuffer 30(f16vec4)
+             499:             TypeVector 29(float16_t) 3
+             551:             TypeVector 6(int) 3
+             552:      6(int) Constant 8
+             553:  551(ivec3) ConstantComposite 552 57 57
          4(main):           2 Function None 3
                5:             Label
    8(invocation):      7(ptr) Variable Function
@@ -149,468 +150,566 @@
               52:  48(i8vec2) VectorShuffle 51 51 0 1
               53:      6(int) Load 8(invocation)
               54:  48(i8vec2) GroupNonUniformShuffleUp 43 52 53
-              55:     49(ptr) AccessChain 34(data) 46 37
-              56:  18(i8vec4) Load 55
-              57:  18(i8vec4) VectorShuffle 56 54 4 5 2 3
-                              Store 55 57
-              58:      6(int) Load 8(invocation)
-              61:     49(ptr) AccessChain 34(data) 59 37
-              62:  18(i8vec4) Load 61
-              63:  60(i8vec3) VectorShuffle 62 62 0 1 2
-              64:      6(int) Load 8(invocation)
-              65:  60(i8vec3) GroupNonUniformShuffleUp 43 63 64
-              66:     49(ptr) AccessChain 34(data) 58 37
-              67:  18(i8vec4) Load 66
-              68:  18(i8vec4) VectorShuffle 67 65 4 5 6 3
-                              Store 66 68
-              69:      6(int) Load 8(invocation)
-              71:     49(ptr) AccessChain 34(data) 70 37
-              72:  18(i8vec4) Load 71
-              73:      6(int) Load 8(invocation)
-              74:  18(i8vec4) GroupNonUniformShuffleUp 43 72 73
-              75:     49(ptr) AccessChain 34(data) 69 37
-                              Store 75 74
-              76:      6(int) Load 8(invocation)
-              77:     39(ptr) AccessChain 34(data) 37 37 38
-              78:  17(int8_t) Load 77
+              55:     39(ptr) AccessChain 34(data) 46 37 38
+              56:  17(int8_t) CompositeExtract 54 0
+                              Store 55 56
+              58:     39(ptr) AccessChain 34(data) 46 37 57
+              59:  17(int8_t) CompositeExtract 54 1
+                              Store 58 59
+              60:      6(int) Load 8(invocation)
+              63:     49(ptr) AccessChain 34(data) 61 37
+              64:  18(i8vec4) Load 63
+              65:  62(i8vec3) VectorShuffle 64 64 0 1 2
+              66:      6(int) Load 8(invocation)
+              67:  62(i8vec3) GroupNonUniformShuffleUp 43 65 66
+              68:     39(ptr) AccessChain 34(data) 60 37 38
+              69:  17(int8_t) CompositeExtract 67 0
+                              Store 68 69
+              70:     39(ptr) AccessChain 34(data) 60 37 57
+              71:  17(int8_t) CompositeExtract 67 1
+                              Store 70 71
+              73:     39(ptr) AccessChain 34(data) 60 37 72
+              74:  17(int8_t) CompositeExtract 67 2
+                              Store 73 74
+              75:      6(int) Load 8(invocation)
+              77:     49(ptr) AccessChain 34(data) 76 37
+              78:  18(i8vec4) Load 77
               79:      6(int) Load 8(invocation)
-              80:  17(int8_t) GroupNonUniformShuffleDown 43 78 79
-              81:     39(ptr) AccessChain 34(data) 76 37 38
+              80:  18(i8vec4) GroupNonUniformShuffleUp 43 78 79
+              81:     49(ptr) AccessChain 34(data) 75 37
                               Store 81 80
               82:      6(int) Load 8(invocation)
-              83:     49(ptr) AccessChain 34(data) 47 37
-              84:  18(i8vec4) Load 83
-              85:  48(i8vec2) VectorShuffle 84 84 0 1
-              86:      6(int) Load 8(invocation)
-              87:  48(i8vec2) GroupNonUniformShuffleDown 43 85 86
-              88:     49(ptr) AccessChain 34(data) 82 37
-              89:  18(i8vec4) Load 88
-              90:  18(i8vec4) VectorShuffle 89 87 4 5 2 3
-                              Store 88 90
-              91:      6(int) Load 8(invocation)
-              92:     49(ptr) AccessChain 34(data) 59 37
-              93:  18(i8vec4) Load 92
-              94:  60(i8vec3) VectorShuffle 93 93 0 1 2
-              95:      6(int) Load 8(invocation)
-              96:  60(i8vec3) GroupNonUniformShuffleDown 43 94 95
-              97:     49(ptr) AccessChain 34(data) 91 37
-              98:  18(i8vec4) Load 97
-              99:  18(i8vec4) VectorShuffle 98 96 4 5 6 3
-                              Store 97 99
-             100:      6(int) Load 8(invocation)
-             101:     49(ptr) AccessChain 34(data) 70 37
-             102:  18(i8vec4) Load 101
-             103:      6(int) Load 8(invocation)
-             104:  18(i8vec4) GroupNonUniformShuffleDown 43 102 103
-             105:     49(ptr) AccessChain 34(data) 100 37
-                              Store 105 104
-             106:      6(int) Load 8(invocation)
-             108:    107(ptr) AccessChain 34(data) 37 47 38
-             109:  19(int8_t) Load 108
+              83:     39(ptr) AccessChain 34(data) 37 37 38
+              84:  17(int8_t) Load 83
+              85:      6(int) Load 8(invocation)
+              86:  17(int8_t) GroupNonUniformShuffleDown 43 84 85
+              87:     39(ptr) AccessChain 34(data) 82 37 38
+                              Store 87 86
+              88:      6(int) Load 8(invocation)
+              89:     49(ptr) AccessChain 34(data) 47 37
+              90:  18(i8vec4) Load 89
+              91:  48(i8vec2) VectorShuffle 90 90 0 1
+              92:      6(int) Load 8(invocation)
+              93:  48(i8vec2) GroupNonUniformShuffleDown 43 91 92
+              94:     39(ptr) AccessChain 34(data) 88 37 38
+              95:  17(int8_t) CompositeExtract 93 0
+                              Store 94 95
+              96:     39(ptr) AccessChain 34(data) 88 37 57
+              97:  17(int8_t) CompositeExtract 93 1
+                              Store 96 97
+              98:      6(int) Load 8(invocation)
+              99:     49(ptr) AccessChain 34(data) 61 37
+             100:  18(i8vec4) Load 99
+             101:  62(i8vec3) VectorShuffle 100 100 0 1 2
+             102:      6(int) Load 8(invocation)
+             103:  62(i8vec3) GroupNonUniformShuffleDown 43 101 102
+             104:     39(ptr) AccessChain 34(data) 98 37 38
+             105:  17(int8_t) CompositeExtract 103 0
+                              Store 104 105
+             106:     39(ptr) AccessChain 34(data) 98 37 57
+             107:  17(int8_t) CompositeExtract 103 1
+                              Store 106 107
+             108:     39(ptr) AccessChain 34(data) 98 37 72
+             109:  17(int8_t) CompositeExtract 103 2
+                              Store 108 109
              110:      6(int) Load 8(invocation)
-             111:  19(int8_t) GroupNonUniformShuffleUp 43 109 110
-             112:    107(ptr) AccessChain 34(data) 106 47 38
-                              Store 112 111
+             111:     49(ptr) AccessChain 34(data) 76 37
+             112:  18(i8vec4) Load 111
              113:      6(int) Load 8(invocation)
-             116:    115(ptr) AccessChain 34(data) 47 47
-             117:  20(i8vec4) Load 116
-             118: 114(i8vec2) VectorShuffle 117 117 0 1
-             119:      6(int) Load 8(invocation)
-             120: 114(i8vec2) GroupNonUniformShuffleUp 43 118 119
-             121:    115(ptr) AccessChain 34(data) 113 47
-             122:  20(i8vec4) Load 121
-             123:  20(i8vec4) VectorShuffle 122 120 4 5 2 3
-                              Store 121 123
-             124:      6(int) Load 8(invocation)
-             126:    115(ptr) AccessChain 34(data) 59 47
+             114:  18(i8vec4) GroupNonUniformShuffleDown 43 112 113
+             115:     49(ptr) AccessChain 34(data) 110 37
+                              Store 115 114
+             116:      6(int) Load 8(invocation)
+             118:    117(ptr) AccessChain 34(data) 37 47 38
+             119:  19(int8_t) Load 118
+             120:      6(int) Load 8(invocation)
+             121:  19(int8_t) GroupNonUniformShuffleUp 43 119 120
+             122:    117(ptr) AccessChain 34(data) 116 47 38
+                              Store 122 121
+             123:      6(int) Load 8(invocation)
+             126:    125(ptr) AccessChain 34(data) 47 47
              127:  20(i8vec4) Load 126
-             128: 125(i8vec3) VectorShuffle 127 127 0 1 2
+             128: 124(i8vec2) VectorShuffle 127 127 0 1
              129:      6(int) Load 8(invocation)
-             130: 125(i8vec3) GroupNonUniformShuffleUp 43 128 129
-             131:    115(ptr) AccessChain 34(data) 124 47
-             132:  20(i8vec4) Load 131
-             133:  20(i8vec4) VectorShuffle 132 130 4 5 6 3
-                              Store 131 133
-             134:      6(int) Load 8(invocation)
-             135:    115(ptr) AccessChain 34(data) 70 47
-             136:  20(i8vec4) Load 135
-             137:      6(int) Load 8(invocation)
-             138:  20(i8vec4) GroupNonUniformShuffleUp 43 136 137
-             139:    115(ptr) AccessChain 34(data) 134 47
-                              Store 139 138
+             130: 124(i8vec2) GroupNonUniformShuffleUp 43 128 129
+             131:    117(ptr) AccessChain 34(data) 123 47 38
+             132:  19(int8_t) CompositeExtract 130 0
+                              Store 131 132
+             133:    117(ptr) AccessChain 34(data) 123 47 57
+             134:  19(int8_t) CompositeExtract 130 1
+                              Store 133 134
+             135:      6(int) Load 8(invocation)
+             137:    125(ptr) AccessChain 34(data) 61 47
+             138:  20(i8vec4) Load 137
+             139: 136(i8vec3) VectorShuffle 138 138 0 1 2
              140:      6(int) Load 8(invocation)
-             141:    107(ptr) AccessChain 34(data) 37 47 38
-             142:  19(int8_t) Load 141
-             143:      6(int) Load 8(invocation)
-             144:  19(int8_t) GroupNonUniformShuffleDown 43 142 143
-             145:    107(ptr) AccessChain 34(data) 140 47 38
-                              Store 145 144
-             146:      6(int) Load 8(invocation)
-             147:    115(ptr) AccessChain 34(data) 47 47
-             148:  20(i8vec4) Load 147
-             149: 114(i8vec2) VectorShuffle 148 148 0 1
-             150:      6(int) Load 8(invocation)
-             151: 114(i8vec2) GroupNonUniformShuffleDown 43 149 150
-             152:    115(ptr) AccessChain 34(data) 146 47
-             153:  20(i8vec4) Load 152
-             154:  20(i8vec4) VectorShuffle 153 151 4 5 2 3
-                              Store 152 154
-             155:      6(int) Load 8(invocation)
-             156:    115(ptr) AccessChain 34(data) 59 47
-             157:  20(i8vec4) Load 156
-             158: 125(i8vec3) VectorShuffle 157 157 0 1 2
-             159:      6(int) Load 8(invocation)
-             160: 125(i8vec3) GroupNonUniformShuffleDown 43 158 159
-             161:    115(ptr) AccessChain 34(data) 155 47
+             141: 136(i8vec3) GroupNonUniformShuffleUp 43 139 140
+             142:    117(ptr) AccessChain 34(data) 135 47 38
+             143:  19(int8_t) CompositeExtract 141 0
+                              Store 142 143
+             144:    117(ptr) AccessChain 34(data) 135 47 57
+             145:  19(int8_t) CompositeExtract 141 1
+                              Store 144 145
+             146:    117(ptr) AccessChain 34(data) 135 47 72
+             147:  19(int8_t) CompositeExtract 141 2
+                              Store 146 147
+             148:      6(int) Load 8(invocation)
+             149:    125(ptr) AccessChain 34(data) 76 47
+             150:  20(i8vec4) Load 149
+             151:      6(int) Load 8(invocation)
+             152:  20(i8vec4) GroupNonUniformShuffleUp 43 150 151
+             153:    125(ptr) AccessChain 34(data) 148 47
+                              Store 153 152
+             154:      6(int) Load 8(invocation)
+             155:    117(ptr) AccessChain 34(data) 37 47 38
+             156:  19(int8_t) Load 155
+             157:      6(int) Load 8(invocation)
+             158:  19(int8_t) GroupNonUniformShuffleDown 43 156 157
+             159:    117(ptr) AccessChain 34(data) 154 47 38
+                              Store 159 158
+             160:      6(int) Load 8(invocation)
+             161:    125(ptr) AccessChain 34(data) 47 47
              162:  20(i8vec4) Load 161
-             163:  20(i8vec4) VectorShuffle 162 160 4 5 6 3
-                              Store 161 163
+             163: 124(i8vec2) VectorShuffle 162 162 0 1
              164:      6(int) Load 8(invocation)
-             165:    115(ptr) AccessChain 34(data) 70 47
-             166:  20(i8vec4) Load 165
-             167:      6(int) Load 8(invocation)
-             168:  20(i8vec4) GroupNonUniformShuffleDown 43 166 167
-             169:    115(ptr) AccessChain 34(data) 164 47
-                              Store 169 168
+             165: 124(i8vec2) GroupNonUniformShuffleDown 43 163 164
+             166:    117(ptr) AccessChain 34(data) 160 47 38
+             167:  19(int8_t) CompositeExtract 165 0
+                              Store 166 167
+             168:    117(ptr) AccessChain 34(data) 160 47 57
+             169:  19(int8_t) CompositeExtract 165 1
+                              Store 168 169
              170:      6(int) Load 8(invocation)
-             172:    171(ptr) AccessChain 34(data) 37 59 38
-             173: 21(int16_t) Load 172
+             171:    125(ptr) AccessChain 34(data) 61 47
+             172:  20(i8vec4) Load 171
+             173: 136(i8vec3) VectorShuffle 172 172 0 1 2
              174:      6(int) Load 8(invocation)
-             175: 21(int16_t) GroupNonUniformShuffleUp 43 173 174
-             176:    171(ptr) AccessChain 34(data) 170 59 38
-                              Store 176 175
-             177:      6(int) Load 8(invocation)
-             180:    179(ptr) AccessChain 34(data) 47 59
-             181: 22(i16vec4) Load 180
-             182:178(i16vec2) VectorShuffle 181 181 0 1
-             183:      6(int) Load 8(invocation)
-             184:178(i16vec2) GroupNonUniformShuffleUp 43 182 183
-             185:    179(ptr) AccessChain 34(data) 177 59
-             186: 22(i16vec4) Load 185
-             187: 22(i16vec4) VectorShuffle 186 184 4 5 2 3
-                              Store 185 187
+             175: 136(i8vec3) GroupNonUniformShuffleDown 43 173 174
+             176:    117(ptr) AccessChain 34(data) 170 47 38
+             177:  19(int8_t) CompositeExtract 175 0
+                              Store 176 177
+             178:    117(ptr) AccessChain 34(data) 170 47 57
+             179:  19(int8_t) CompositeExtract 175 1
+                              Store 178 179
+             180:    117(ptr) AccessChain 34(data) 170 47 72
+             181:  19(int8_t) CompositeExtract 175 2
+                              Store 180 181
+             182:      6(int) Load 8(invocation)
+             183:    125(ptr) AccessChain 34(data) 76 47
+             184:  20(i8vec4) Load 183
+             185:      6(int) Load 8(invocation)
+             186:  20(i8vec4) GroupNonUniformShuffleDown 43 184 185
+             187:    125(ptr) AccessChain 34(data) 182 47
+                              Store 187 186
              188:      6(int) Load 8(invocation)
-             190:    179(ptr) AccessChain 34(data) 59 59
-             191: 22(i16vec4) Load 190
-             192:189(i16vec3) VectorShuffle 191 191 0 1 2
-             193:      6(int) Load 8(invocation)
-             194:189(i16vec3) GroupNonUniformShuffleUp 43 192 193
-             195:    179(ptr) AccessChain 34(data) 188 59
-             196: 22(i16vec4) Load 195
-             197: 22(i16vec4) VectorShuffle 196 194 4 5 6 3
-                              Store 195 197
-             198:      6(int) Load 8(invocation)
-             199:    179(ptr) AccessChain 34(data) 70 59
-             200: 22(i16vec4) Load 199
+             190:    189(ptr) AccessChain 34(data) 37 61 38
+             191: 21(int16_t) Load 190
+             192:      6(int) Load 8(invocation)
+             193: 21(int16_t) GroupNonUniformShuffleUp 43 191 192
+             194:    189(ptr) AccessChain 34(data) 188 61 38
+                              Store 194 193
+             195:      6(int) Load 8(invocation)
+             198:    197(ptr) AccessChain 34(data) 47 61
+             199: 22(i16vec4) Load 198
+             200:196(i16vec2) VectorShuffle 199 199 0 1
              201:      6(int) Load 8(invocation)
-             202: 22(i16vec4) GroupNonUniformShuffleUp 43 200 201
-             203:    179(ptr) AccessChain 34(data) 198 59
-                              Store 203 202
-             204:      6(int) Load 8(invocation)
-             205:    171(ptr) AccessChain 34(data) 37 59 38
-             206: 21(int16_t) Load 205
+             202:196(i16vec2) GroupNonUniformShuffleUp 43 200 201
+             203:    189(ptr) AccessChain 34(data) 195 61 38
+             204: 21(int16_t) CompositeExtract 202 0
+                              Store 203 204
+             205:    189(ptr) AccessChain 34(data) 195 61 57
+             206: 21(int16_t) CompositeExtract 202 1
+                              Store 205 206
              207:      6(int) Load 8(invocation)
-             208: 21(int16_t) GroupNonUniformShuffleDown 43 206 207
-             209:    171(ptr) AccessChain 34(data) 204 59 38
-                              Store 209 208
-             210:      6(int) Load 8(invocation)
-             211:    179(ptr) AccessChain 34(data) 47 59
-             212: 22(i16vec4) Load 211
-             213:178(i16vec2) VectorShuffle 212 212 0 1
-             214:      6(int) Load 8(invocation)
-             215:178(i16vec2) GroupNonUniformShuffleDown 43 213 214
-             216:    179(ptr) AccessChain 34(data) 210 59
-             217: 22(i16vec4) Load 216
-             218: 22(i16vec4) VectorShuffle 217 215 4 5 2 3
-                              Store 216 218
-             219:      6(int) Load 8(invocation)
-             220:    179(ptr) AccessChain 34(data) 59 59
-             221: 22(i16vec4) Load 220
-             222:189(i16vec3) VectorShuffle 221 221 0 1 2
+             209:    197(ptr) AccessChain 34(data) 61 61
+             210: 22(i16vec4) Load 209
+             211:208(i16vec3) VectorShuffle 210 210 0 1 2
+             212:      6(int) Load 8(invocation)
+             213:208(i16vec3) GroupNonUniformShuffleUp 43 211 212
+             214:    189(ptr) AccessChain 34(data) 207 61 38
+             215: 21(int16_t) CompositeExtract 213 0
+                              Store 214 215
+             216:    189(ptr) AccessChain 34(data) 207 61 57
+             217: 21(int16_t) CompositeExtract 213 1
+                              Store 216 217
+             218:    189(ptr) AccessChain 34(data) 207 61 72
+             219: 21(int16_t) CompositeExtract 213 2
+                              Store 218 219
+             220:      6(int) Load 8(invocation)
+             221:    197(ptr) AccessChain 34(data) 76 61
+             222: 22(i16vec4) Load 221
              223:      6(int) Load 8(invocation)
-             224:189(i16vec3) GroupNonUniformShuffleDown 43 222 223
-             225:    179(ptr) AccessChain 34(data) 219 59
-             226: 22(i16vec4) Load 225
-             227: 22(i16vec4) VectorShuffle 226 224 4 5 6 3
-                              Store 225 227
-             228:      6(int) Load 8(invocation)
-             229:    179(ptr) AccessChain 34(data) 70 59
-             230: 22(i16vec4) Load 229
-             231:      6(int) Load 8(invocation)
-             232: 22(i16vec4) GroupNonUniformShuffleDown 43 230 231
-             233:    179(ptr) AccessChain 34(data) 228 59
-                              Store 233 232
-             234:      6(int) Load 8(invocation)
-             236:    235(ptr) AccessChain 34(data) 37 70 38
-             237: 23(int16_t) Load 236
-             238:      6(int) Load 8(invocation)
-             239: 23(int16_t) GroupNonUniformShuffleUp 43 237 238
-             240:    235(ptr) AccessChain 34(data) 234 70 38
-                              Store 240 239
-             241:      6(int) Load 8(invocation)
-             244:    243(ptr) AccessChain 34(data) 47 70
-             245: 24(i16vec4) Load 244
-             246:242(i16vec2) VectorShuffle 245 245 0 1
-             247:      6(int) Load 8(invocation)
-             248:242(i16vec2) GroupNonUniformShuffleUp 43 246 247
-             249:    243(ptr) AccessChain 34(data) 241 70
-             250: 24(i16vec4) Load 249
-             251: 24(i16vec4) VectorShuffle 250 248 4 5 2 3
-                              Store 249 251
-             252:      6(int) Load 8(invocation)
-             254:    243(ptr) AccessChain 34(data) 59 70
-             255: 24(i16vec4) Load 254
-             256:253(i16vec3) VectorShuffle 255 255 0 1 2
+             224: 22(i16vec4) GroupNonUniformShuffleUp 43 222 223
+             225:    197(ptr) AccessChain 34(data) 220 61
+                              Store 225 224
+             226:      6(int) Load 8(invocation)
+             227:    189(ptr) AccessChain 34(data) 37 61 38
+             228: 21(int16_t) Load 227
+             229:      6(int) Load 8(invocation)
+             230: 21(int16_t) GroupNonUniformShuffleDown 43 228 229
+             231:    189(ptr) AccessChain 34(data) 226 61 38
+                              Store 231 230
+             232:      6(int) Load 8(invocation)
+             233:    197(ptr) AccessChain 34(data) 47 61
+             234: 22(i16vec4) Load 233
+             235:196(i16vec2) VectorShuffle 234 234 0 1
+             236:      6(int) Load 8(invocation)
+             237:196(i16vec2) GroupNonUniformShuffleDown 43 235 236
+             238:    189(ptr) AccessChain 34(data) 232 61 38
+             239: 21(int16_t) CompositeExtract 237 0
+                              Store 238 239
+             240:    189(ptr) AccessChain 34(data) 232 61 57
+             241: 21(int16_t) CompositeExtract 237 1
+                              Store 240 241
+             242:      6(int) Load 8(invocation)
+             243:    197(ptr) AccessChain 34(data) 61 61
+             244: 22(i16vec4) Load 243
+             245:208(i16vec3) VectorShuffle 244 244 0 1 2
+             246:      6(int) Load 8(invocation)
+             247:208(i16vec3) GroupNonUniformShuffleDown 43 245 246
+             248:    189(ptr) AccessChain 34(data) 242 61 38
+             249: 21(int16_t) CompositeExtract 247 0
+                              Store 248 249
+             250:    189(ptr) AccessChain 34(data) 242 61 57
+             251: 21(int16_t) CompositeExtract 247 1
+                              Store 250 251
+             252:    189(ptr) AccessChain 34(data) 242 61 72
+             253: 21(int16_t) CompositeExtract 247 2
+                              Store 252 253
+             254:      6(int) Load 8(invocation)
+             255:    197(ptr) AccessChain 34(data) 76 61
+             256: 22(i16vec4) Load 255
              257:      6(int) Load 8(invocation)
-             258:253(i16vec3) GroupNonUniformShuffleUp 43 256 257
-             259:    243(ptr) AccessChain 34(data) 252 70
-             260: 24(i16vec4) Load 259
-             261: 24(i16vec4) VectorShuffle 260 258 4 5 6 3
-                              Store 259 261
-             262:      6(int) Load 8(invocation)
-             263:    243(ptr) AccessChain 34(data) 70 70
-             264: 24(i16vec4) Load 263
-             265:      6(int) Load 8(invocation)
-             266: 24(i16vec4) GroupNonUniformShuffleUp 43 264 265
-             267:    243(ptr) AccessChain 34(data) 262 70
-                              Store 267 266
-             268:      6(int) Load 8(invocation)
-             269:    235(ptr) AccessChain 34(data) 37 70 38
-             270: 23(int16_t) Load 269
-             271:      6(int) Load 8(invocation)
-             272: 23(int16_t) GroupNonUniformShuffleDown 43 270 271
-             273:    235(ptr) AccessChain 34(data) 268 70 38
-                              Store 273 272
-             274:      6(int) Load 8(invocation)
-             275:    243(ptr) AccessChain 34(data) 47 70
-             276: 24(i16vec4) Load 275
-             277:242(i16vec2) VectorShuffle 276 276 0 1
-             278:      6(int) Load 8(invocation)
-             279:242(i16vec2) GroupNonUniformShuffleDown 43 277 278
-             280:    243(ptr) AccessChain 34(data) 274 70
-             281: 24(i16vec4) Load 280
-             282: 24(i16vec4) VectorShuffle 281 279 4 5 2 3
-                              Store 280 282
-             283:      6(int) Load 8(invocation)
-             284:    243(ptr) AccessChain 34(data) 59 70
-             285: 24(i16vec4) Load 284
-             286:253(i16vec3) VectorShuffle 285 285 0 1 2
-             287:      6(int) Load 8(invocation)
-             288:253(i16vec3) GroupNonUniformShuffleDown 43 286 287
-             289:    243(ptr) AccessChain 34(data) 283 70
-             290: 24(i16vec4) Load 289
-             291: 24(i16vec4) VectorShuffle 290 288 4 5 6 3
-                              Store 289 291
+             258: 22(i16vec4) GroupNonUniformShuffleDown 43 256 257
+             259:    197(ptr) AccessChain 34(data) 254 61
+                              Store 259 258
+             260:      6(int) Load 8(invocation)
+             262:    261(ptr) AccessChain 34(data) 37 76 38
+             263: 23(int16_t) Load 262
+             264:      6(int) Load 8(invocation)
+             265: 23(int16_t) GroupNonUniformShuffleUp 43 263 264
+             266:    261(ptr) AccessChain 34(data) 260 76 38
+                              Store 266 265
+             267:      6(int) Load 8(invocation)
+             270:    269(ptr) AccessChain 34(data) 47 76
+             271: 24(i16vec4) Load 270
+             272:268(i16vec2) VectorShuffle 271 271 0 1
+             273:      6(int) Load 8(invocation)
+             274:268(i16vec2) GroupNonUniformShuffleUp 43 272 273
+             275:    261(ptr) AccessChain 34(data) 267 76 38
+             276: 23(int16_t) CompositeExtract 274 0
+                              Store 275 276
+             277:    261(ptr) AccessChain 34(data) 267 76 57
+             278: 23(int16_t) CompositeExtract 274 1
+                              Store 277 278
+             279:      6(int) Load 8(invocation)
+             281:    269(ptr) AccessChain 34(data) 61 76
+             282: 24(i16vec4) Load 281
+             283:280(i16vec3) VectorShuffle 282 282 0 1 2
+             284:      6(int) Load 8(invocation)
+             285:280(i16vec3) GroupNonUniformShuffleUp 43 283 284
+             286:    261(ptr) AccessChain 34(data) 279 76 38
+             287: 23(int16_t) CompositeExtract 285 0
+                              Store 286 287
+             288:    261(ptr) AccessChain 34(data) 279 76 57
+             289: 23(int16_t) CompositeExtract 285 1
+                              Store 288 289
+             290:    261(ptr) AccessChain 34(data) 279 76 72
+             291: 23(int16_t) CompositeExtract 285 2
+                              Store 290 291
              292:      6(int) Load 8(invocation)
-             293:    243(ptr) AccessChain 34(data) 70 70
+             293:    269(ptr) AccessChain 34(data) 76 76
              294: 24(i16vec4) Load 293
              295:      6(int) Load 8(invocation)
-             296: 24(i16vec4) GroupNonUniformShuffleDown 43 294 295
-             297:    243(ptr) AccessChain 34(data) 292 70
+             296: 24(i16vec4) GroupNonUniformShuffleUp 43 294 295
+             297:    269(ptr) AccessChain 34(data) 292 76
                               Store 297 296
              298:      6(int) Load 8(invocation)
-             301:    300(ptr) AccessChain 34(data) 37 299 38
-             302: 25(int64_t) Load 301
-             303:      6(int) Load 8(invocation)
-             304: 25(int64_t) GroupNonUniformShuffleUp 43 302 303
-             305:    300(ptr) AccessChain 34(data) 298 299 38
-                              Store 305 304
-             306:      6(int) Load 8(invocation)
-             309:    308(ptr) AccessChain 34(data) 47 299
-             310: 26(i64vec4) Load 309
-             311:307(i64vec2) VectorShuffle 310 310 0 1
-             312:      6(int) Load 8(invocation)
-             313:307(i64vec2) GroupNonUniformShuffleUp 43 311 312
-             314:    308(ptr) AccessChain 34(data) 306 299
-             315: 26(i64vec4) Load 314
-             316: 26(i64vec4) VectorShuffle 315 313 4 5 2 3
-                              Store 314 316
-             317:      6(int) Load 8(invocation)
-             319:    308(ptr) AccessChain 34(data) 59 299
-             320: 26(i64vec4) Load 319
-             321:318(i64vec3) VectorShuffle 320 320 0 1 2
-             322:      6(int) Load 8(invocation)
-             323:318(i64vec3) GroupNonUniformShuffleUp 43 321 322
-             324:    308(ptr) AccessChain 34(data) 317 299
-             325: 26(i64vec4) Load 324
-             326: 26(i64vec4) VectorShuffle 325 323 4 5 6 3
-                              Store 324 326
-             327:      6(int) Load 8(invocation)
-             328:    308(ptr) AccessChain 34(data) 70 299
-             329: 26(i64vec4) Load 328
-             330:      6(int) Load 8(invocation)
-             331: 26(i64vec4) GroupNonUniformShuffleUp 43 329 330
-             332:    308(ptr) AccessChain 34(data) 327 299
-                              Store 332 331
-             333:      6(int) Load 8(invocation)
-             334:    300(ptr) AccessChain 34(data) 37 299 38
-             335: 25(int64_t) Load 334
-             336:      6(int) Load 8(invocation)
-             337: 25(int64_t) GroupNonUniformShuffleDown 43 335 336
-             338:    300(ptr) AccessChain 34(data) 333 299 38
-                              Store 338 337
-             339:      6(int) Load 8(invocation)
-             340:    308(ptr) AccessChain 34(data) 47 299
-             341: 26(i64vec4) Load 340
-             342:307(i64vec2) VectorShuffle 341 341 0 1
-             343:      6(int) Load 8(invocation)
-             344:307(i64vec2) GroupNonUniformShuffleDown 43 342 343
-             345:    308(ptr) AccessChain 34(data) 339 299
-             346: 26(i64vec4) Load 345
-             347: 26(i64vec4) VectorShuffle 346 344 4 5 2 3
-                              Store 345 347
-             348:      6(int) Load 8(invocation)
-             349:    308(ptr) AccessChain 34(data) 59 299
-             350: 26(i64vec4) Load 349
-             351:318(i64vec3) VectorShuffle 350 350 0 1 2
+             299:    261(ptr) AccessChain 34(data) 37 76 38
+             300: 23(int16_t) Load 299
+             301:      6(int) Load 8(invocation)
+             302: 23(int16_t) GroupNonUniformShuffleDown 43 300 301
+             303:    261(ptr) AccessChain 34(data) 298 76 38
+                              Store 303 302
+             304:      6(int) Load 8(invocation)
+             305:    269(ptr) AccessChain 34(data) 47 76
+             306: 24(i16vec4) Load 305
+             307:268(i16vec2) VectorShuffle 306 306 0 1
+             308:      6(int) Load 8(invocation)
+             309:268(i16vec2) GroupNonUniformShuffleDown 43 307 308
+             310:    261(ptr) AccessChain 34(data) 304 76 38
+             311: 23(int16_t) CompositeExtract 309 0
+                              Store 310 311
+             312:    261(ptr) AccessChain 34(data) 304 76 57
+             313: 23(int16_t) CompositeExtract 309 1
+                              Store 312 313
+             314:      6(int) Load 8(invocation)
+             315:    269(ptr) AccessChain 34(data) 61 76
+             316: 24(i16vec4) Load 315
+             317:280(i16vec3) VectorShuffle 316 316 0 1 2
+             318:      6(int) Load 8(invocation)
+             319:280(i16vec3) GroupNonUniformShuffleDown 43 317 318
+             320:    261(ptr) AccessChain 34(data) 314 76 38
+             321: 23(int16_t) CompositeExtract 319 0
+                              Store 320 321
+             322:    261(ptr) AccessChain 34(data) 314 76 57
+             323: 23(int16_t) CompositeExtract 319 1
+                              Store 322 323
+             324:    261(ptr) AccessChain 34(data) 314 76 72
+             325: 23(int16_t) CompositeExtract 319 2
+                              Store 324 325
+             326:      6(int) Load 8(invocation)
+             327:    269(ptr) AccessChain 34(data) 76 76
+             328: 24(i16vec4) Load 327
+             329:      6(int) Load 8(invocation)
+             330: 24(i16vec4) GroupNonUniformShuffleDown 43 328 329
+             331:    269(ptr) AccessChain 34(data) 326 76
+                              Store 331 330
+             332:      6(int) Load 8(invocation)
+             335:    334(ptr) AccessChain 34(data) 37 333 38
+             336: 25(int64_t) Load 335
+             337:      6(int) Load 8(invocation)
+             338: 25(int64_t) GroupNonUniformShuffleUp 43 336 337
+             339:    334(ptr) AccessChain 34(data) 332 333 38
+                              Store 339 338
+             340:      6(int) Load 8(invocation)
+             343:    342(ptr) AccessChain 34(data) 47 333
+             344: 26(i64vec4) Load 343
+             345:341(i64vec2) VectorShuffle 344 344 0 1
+             346:      6(int) Load 8(invocation)
+             347:341(i64vec2) GroupNonUniformShuffleUp 43 345 346
+             348:    334(ptr) AccessChain 34(data) 340 333 38
+             349: 25(int64_t) CompositeExtract 347 0
+                              Store 348 349
+             350:    334(ptr) AccessChain 34(data) 340 333 57
+             351: 25(int64_t) CompositeExtract 347 1
+                              Store 350 351
              352:      6(int) Load 8(invocation)
-             353:318(i64vec3) GroupNonUniformShuffleDown 43 351 352
-             354:    308(ptr) AccessChain 34(data) 348 299
+             354:    342(ptr) AccessChain 34(data) 61 333
              355: 26(i64vec4) Load 354
-             356: 26(i64vec4) VectorShuffle 355 353 4 5 6 3
-                              Store 354 356
+             356:353(i64vec3) VectorShuffle 355 355 0 1 2
              357:      6(int) Load 8(invocation)
-             358:    308(ptr) AccessChain 34(data) 70 299
-             359: 26(i64vec4) Load 358
-             360:      6(int) Load 8(invocation)
-             361: 26(i64vec4) GroupNonUniformShuffleDown 43 359 360
-             362:    308(ptr) AccessChain 34(data) 357 299
-                              Store 362 361
-             363:      6(int) Load 8(invocation)
-             366:    365(ptr) AccessChain 34(data) 37 364 38
-             367: 27(int64_t) Load 366
+             358:353(i64vec3) GroupNonUniformShuffleUp 43 356 357
+             359:    334(ptr) AccessChain 34(data) 352 333 38
+             360: 25(int64_t) CompositeExtract 358 0
+                              Store 359 360
+             361:    334(ptr) AccessChain 34(data) 352 333 57
+             362: 25(int64_t) CompositeExtract 358 1
+                              Store 361 362
+             363:    334(ptr) AccessChain 34(data) 352 333 72
+             364: 25(int64_t) CompositeExtract 358 2
+                              Store 363 364
+             365:      6(int) Load 8(invocation)
+             366:    342(ptr) AccessChain 34(data) 76 333
+             367: 26(i64vec4) Load 366
              368:      6(int) Load 8(invocation)
-             369: 27(int64_t) GroupNonUniformShuffleUp 43 367 368
-             370:    365(ptr) AccessChain 34(data) 363 364 38
+             369: 26(i64vec4) GroupNonUniformShuffleUp 43 367 368
+             370:    342(ptr) AccessChain 34(data) 365 333
                               Store 370 369
              371:      6(int) Load 8(invocation)
-             374:    373(ptr) AccessChain 34(data) 47 364
-             375: 28(i64vec4) Load 374
-             376:372(i64vec2) VectorShuffle 375 375 0 1
+             372:    334(ptr) AccessChain 34(data) 37 333 38
+             373: 25(int64_t) Load 372
+             374:      6(int) Load 8(invocation)
+             375: 25(int64_t) GroupNonUniformShuffleDown 43 373 374
+             376:    334(ptr) AccessChain 34(data) 371 333 38
+                              Store 376 375
              377:      6(int) Load 8(invocation)
-             378:372(i64vec2) GroupNonUniformShuffleUp 43 376 377
-             379:    373(ptr) AccessChain 34(data) 371 364
-             380: 28(i64vec4) Load 379
-             381: 28(i64vec4) VectorShuffle 380 378 4 5 2 3
-                              Store 379 381
-             382:      6(int) Load 8(invocation)
-             384:    373(ptr) AccessChain 34(data) 59 364
-             385: 28(i64vec4) Load 384
-             386:383(i64vec3) VectorShuffle 385 385 0 1 2
+             378:    342(ptr) AccessChain 34(data) 47 333
+             379: 26(i64vec4) Load 378
+             380:341(i64vec2) VectorShuffle 379 379 0 1
+             381:      6(int) Load 8(invocation)
+             382:341(i64vec2) GroupNonUniformShuffleDown 43 380 381
+             383:    334(ptr) AccessChain 34(data) 377 333 38
+             384: 25(int64_t) CompositeExtract 382 0
+                              Store 383 384
+             385:    334(ptr) AccessChain 34(data) 377 333 57
+             386: 25(int64_t) CompositeExtract 382 1
+                              Store 385 386
              387:      6(int) Load 8(invocation)
-             388:383(i64vec3) GroupNonUniformShuffleUp 43 386 387
-             389:    373(ptr) AccessChain 34(data) 382 364
-             390: 28(i64vec4) Load 389
-             391: 28(i64vec4) VectorShuffle 390 388 4 5 6 3
-                              Store 389 391
-             392:      6(int) Load 8(invocation)
-             393:    373(ptr) AccessChain 34(data) 70 364
-             394: 28(i64vec4) Load 393
-             395:      6(int) Load 8(invocation)
-             396: 28(i64vec4) GroupNonUniformShuffleUp 43 394 395
-             397:    373(ptr) AccessChain 34(data) 392 364
-                              Store 397 396
-             398:      6(int) Load 8(invocation)
-             399:    365(ptr) AccessChain 34(data) 37 364 38
-             400: 27(int64_t) Load 399
-             401:      6(int) Load 8(invocation)
-             402: 27(int64_t) GroupNonUniformShuffleDown 43 400 401
-             403:    365(ptr) AccessChain 34(data) 398 364 38
-                              Store 403 402
-             404:      6(int) Load 8(invocation)
-             405:    373(ptr) AccessChain 34(data) 47 364
-             406: 28(i64vec4) Load 405
-             407:372(i64vec2) VectorShuffle 406 406 0 1
-             408:      6(int) Load 8(invocation)
-             409:372(i64vec2) GroupNonUniformShuffleDown 43 407 408
-             410:    373(ptr) AccessChain 34(data) 404 364
-             411: 28(i64vec4) Load 410
-             412: 28(i64vec4) VectorShuffle 411 409 4 5 2 3
-                              Store 410 412
+             388:    342(ptr) AccessChain 34(data) 61 333
+             389: 26(i64vec4) Load 388
+             390:353(i64vec3) VectorShuffle 389 389 0 1 2
+             391:      6(int) Load 8(invocation)
+             392:353(i64vec3) GroupNonUniformShuffleDown 43 390 391
+             393:    334(ptr) AccessChain 34(data) 387 333 38
+             394: 25(int64_t) CompositeExtract 392 0
+                              Store 393 394
+             395:    334(ptr) AccessChain 34(data) 387 333 57
+             396: 25(int64_t) CompositeExtract 392 1
+                              Store 395 396
+             397:    334(ptr) AccessChain 34(data) 387 333 72
+             398: 25(int64_t) CompositeExtract 392 2
+                              Store 397 398
+             399:      6(int) Load 8(invocation)
+             400:    342(ptr) AccessChain 34(data) 76 333
+             401: 26(i64vec4) Load 400
+             402:      6(int) Load 8(invocation)
+             403: 26(i64vec4) GroupNonUniformShuffleDown 43 401 402
+             404:    342(ptr) AccessChain 34(data) 399 333
+                              Store 404 403
+             405:      6(int) Load 8(invocation)
+             408:    407(ptr) AccessChain 34(data) 37 406 38
+             409: 27(int64_t) Load 408
+             410:      6(int) Load 8(invocation)
+             411: 27(int64_t) GroupNonUniformShuffleUp 43 409 410
+             412:    407(ptr) AccessChain 34(data) 405 406 38
+                              Store 412 411
              413:      6(int) Load 8(invocation)
-             414:    373(ptr) AccessChain 34(data) 59 364
-             415: 28(i64vec4) Load 414
-             416:383(i64vec3) VectorShuffle 415 415 0 1 2
-             417:      6(int) Load 8(invocation)
-             418:383(i64vec3) GroupNonUniformShuffleDown 43 416 417
-             419:    373(ptr) AccessChain 34(data) 413 364
-             420: 28(i64vec4) Load 419
-             421: 28(i64vec4) VectorShuffle 420 418 4 5 6 3
-                              Store 419 421
-             422:      6(int) Load 8(invocation)
-             423:    373(ptr) AccessChain 34(data) 70 364
-             424: 28(i64vec4) Load 423
+             416:    415(ptr) AccessChain 34(data) 47 406
+             417: 28(i64vec4) Load 416
+             418:414(i64vec2) VectorShuffle 417 417 0 1
+             419:      6(int) Load 8(invocation)
+             420:414(i64vec2) GroupNonUniformShuffleUp 43 418 419
+             421:    407(ptr) AccessChain 34(data) 413 406 38
+             422: 27(int64_t) CompositeExtract 420 0
+                              Store 421 422
+             423:    407(ptr) AccessChain 34(data) 413 406 57
+             424: 27(int64_t) CompositeExtract 420 1
+                              Store 423 424
              425:      6(int) Load 8(invocation)
-             426: 28(i64vec4) GroupNonUniformShuffleDown 43 424 425
-             427:    373(ptr) AccessChain 34(data) 422 364
-                              Store 427 426
-             428:      6(int) Load 8(invocation)
-             431:    430(ptr) AccessChain 34(data) 37 429 38
-             432:29(float16_t) Load 431
-             433:      6(int) Load 8(invocation)
-             434:29(float16_t) GroupNonUniformShuffleUp 43 432 433
-             435:    430(ptr) AccessChain 34(data) 428 429 38
-                              Store 435 434
-             436:      6(int) Load 8(invocation)
-             439:    438(ptr) AccessChain 34(data) 47 429
-             440: 30(f16vec4) Load 439
-             441:437(f16vec2) VectorShuffle 440 440 0 1
-             442:      6(int) Load 8(invocation)
-             443:437(f16vec2) GroupNonUniformShuffleUp 43 441 442
-             444:    438(ptr) AccessChain 34(data) 436 429
-             445: 30(f16vec4) Load 444
-             446: 30(f16vec4) VectorShuffle 445 443 4 5 2 3
-                              Store 444 446
+             427:    415(ptr) AccessChain 34(data) 61 406
+             428: 28(i64vec4) Load 427
+             429:426(i64vec3) VectorShuffle 428 428 0 1 2
+             430:      6(int) Load 8(invocation)
+             431:426(i64vec3) GroupNonUniformShuffleUp 43 429 430
+             432:    407(ptr) AccessChain 34(data) 425 406 38
+             433: 27(int64_t) CompositeExtract 431 0
+                              Store 432 433
+             434:    407(ptr) AccessChain 34(data) 425 406 57
+             435: 27(int64_t) CompositeExtract 431 1
+                              Store 434 435
+             436:    407(ptr) AccessChain 34(data) 425 406 72
+             437: 27(int64_t) CompositeExtract 431 2
+                              Store 436 437
+             438:      6(int) Load 8(invocation)
+             439:    415(ptr) AccessChain 34(data) 76 406
+             440: 28(i64vec4) Load 439
+             441:      6(int) Load 8(invocation)
+             442: 28(i64vec4) GroupNonUniformShuffleUp 43 440 441
+             443:    415(ptr) AccessChain 34(data) 438 406
+                              Store 443 442
+             444:      6(int) Load 8(invocation)
+             445:    407(ptr) AccessChain 34(data) 37 406 38
+             446: 27(int64_t) Load 445
              447:      6(int) Load 8(invocation)
-             449:    438(ptr) AccessChain 34(data) 59 429
-             450: 30(f16vec4) Load 449
-             451:448(f16vec3) VectorShuffle 450 450 0 1 2
-             452:      6(int) Load 8(invocation)
-             453:448(f16vec3) GroupNonUniformShuffleUp 43 451 452
-             454:    438(ptr) AccessChain 34(data) 447 429
-             455: 30(f16vec4) Load 454
-             456: 30(f16vec4) VectorShuffle 455 453 4 5 6 3
-                              Store 454 456
-             457:      6(int) Load 8(invocation)
-             458:    438(ptr) AccessChain 34(data) 70 429
-             459: 30(f16vec4) Load 458
+             448: 27(int64_t) GroupNonUniformShuffleDown 43 446 447
+             449:    407(ptr) AccessChain 34(data) 444 406 38
+                              Store 449 448
+             450:      6(int) Load 8(invocation)
+             451:    415(ptr) AccessChain 34(data) 47 406
+             452: 28(i64vec4) Load 451
+             453:414(i64vec2) VectorShuffle 452 452 0 1
+             454:      6(int) Load 8(invocation)
+             455:414(i64vec2) GroupNonUniformShuffleDown 43 453 454
+             456:    407(ptr) AccessChain 34(data) 450 406 38
+             457: 27(int64_t) CompositeExtract 455 0
+                              Store 456 457
+             458:    407(ptr) AccessChain 34(data) 450 406 57
+             459: 27(int64_t) CompositeExtract 455 1
+                              Store 458 459
              460:      6(int) Load 8(invocation)
-             461: 30(f16vec4) GroupNonUniformShuffleUp 43 459 460
-             462:    438(ptr) AccessChain 34(data) 457 429
-                              Store 462 461
-             463:      6(int) Load 8(invocation)
-             464:    430(ptr) AccessChain 34(data) 37 429 38
-             465:29(float16_t) Load 464
-             466:      6(int) Load 8(invocation)
-             467:29(float16_t) GroupNonUniformShuffleDown 43 465 466
-             468:    430(ptr) AccessChain 34(data) 463 429 38
-                              Store 468 467
-             469:      6(int) Load 8(invocation)
-             470:    438(ptr) AccessChain 34(data) 47 429
-             471: 30(f16vec4) Load 470
-             472:437(f16vec2) VectorShuffle 471 471 0 1
-             473:      6(int) Load 8(invocation)
-             474:437(f16vec2) GroupNonUniformShuffleDown 43 472 473
-             475:    438(ptr) AccessChain 34(data) 469 429
-             476: 30(f16vec4) Load 475
-             477: 30(f16vec4) VectorShuffle 476 474 4 5 2 3
-                              Store 475 477
+             461:    415(ptr) AccessChain 34(data) 61 406
+             462: 28(i64vec4) Load 461
+             463:426(i64vec3) VectorShuffle 462 462 0 1 2
+             464:      6(int) Load 8(invocation)
+             465:426(i64vec3) GroupNonUniformShuffleDown 43 463 464
+             466:    407(ptr) AccessChain 34(data) 460 406 38
+             467: 27(int64_t) CompositeExtract 465 0
+                              Store 466 467
+             468:    407(ptr) AccessChain 34(data) 460 406 57
+             469: 27(int64_t) CompositeExtract 465 1
+                              Store 468 469
+             470:    407(ptr) AccessChain 34(data) 460 406 72
+             471: 27(int64_t) CompositeExtract 465 2
+                              Store 470 471
+             472:      6(int) Load 8(invocation)
+             473:    415(ptr) AccessChain 34(data) 76 406
+             474: 28(i64vec4) Load 473
+             475:      6(int) Load 8(invocation)
+             476: 28(i64vec4) GroupNonUniformShuffleDown 43 474 475
+             477:    415(ptr) AccessChain 34(data) 472 406
+                              Store 477 476
              478:      6(int) Load 8(invocation)
-             479:    438(ptr) AccessChain 34(data) 59 429
-             480: 30(f16vec4) Load 479
-             481:448(f16vec3) VectorShuffle 480 480 0 1 2
-             482:      6(int) Load 8(invocation)
-             483:448(f16vec3) GroupNonUniformShuffleDown 43 481 482
-             484:    438(ptr) AccessChain 34(data) 478 429
-             485: 30(f16vec4) Load 484
-             486: 30(f16vec4) VectorShuffle 485 483 4 5 6 3
-                              Store 484 486
-             487:      6(int) Load 8(invocation)
-             488:    438(ptr) AccessChain 34(data) 70 429
-             489: 30(f16vec4) Load 488
-             490:      6(int) Load 8(invocation)
-             491: 30(f16vec4) GroupNonUniformShuffleDown 43 489 490
-             492:    438(ptr) AccessChain 34(data) 487 429
-                              Store 492 491
+             481:    480(ptr) AccessChain 34(data) 37 479 38
+             482:29(float16_t) Load 481
+             483:      6(int) Load 8(invocation)
+             484:29(float16_t) GroupNonUniformShuffleUp 43 482 483
+             485:    480(ptr) AccessChain 34(data) 478 479 38
+                              Store 485 484
+             486:      6(int) Load 8(invocation)
+             489:    488(ptr) AccessChain 34(data) 47 479
+             490: 30(f16vec4) Load 489
+             491:487(f16vec2) VectorShuffle 490 490 0 1
+             492:      6(int) Load 8(invocation)
+             493:487(f16vec2) GroupNonUniformShuffleUp 43 491 492
+             494:    480(ptr) AccessChain 34(data) 486 479 38
+             495:29(float16_t) CompositeExtract 493 0
+                              Store 494 495
+             496:    480(ptr) AccessChain 34(data) 486 479 57
+             497:29(float16_t) CompositeExtract 493 1
+                              Store 496 497
+             498:      6(int) Load 8(invocation)
+             500:    488(ptr) AccessChain 34(data) 61 479
+             501: 30(f16vec4) Load 500
+             502:499(f16vec3) VectorShuffle 501 501 0 1 2
+             503:      6(int) Load 8(invocation)
+             504:499(f16vec3) GroupNonUniformShuffleUp 43 502 503
+             505:    480(ptr) AccessChain 34(data) 498 479 38
+             506:29(float16_t) CompositeExtract 504 0
+                              Store 505 506
+             507:    480(ptr) AccessChain 34(data) 498 479 57
+             508:29(float16_t) CompositeExtract 504 1
+                              Store 507 508
+             509:    480(ptr) AccessChain 34(data) 498 479 72
+             510:29(float16_t) CompositeExtract 504 2
+                              Store 509 510
+             511:      6(int) Load 8(invocation)
+             512:    488(ptr) AccessChain 34(data) 76 479
+             513: 30(f16vec4) Load 512
+             514:      6(int) Load 8(invocation)
+             515: 30(f16vec4) GroupNonUniformShuffleUp 43 513 514
+             516:    488(ptr) AccessChain 34(data) 511 479
+                              Store 516 515
+             517:      6(int) Load 8(invocation)
+             518:    480(ptr) AccessChain 34(data) 37 479 38
+             519:29(float16_t) Load 518
+             520:      6(int) Load 8(invocation)
+             521:29(float16_t) GroupNonUniformShuffleDown 43 519 520
+             522:    480(ptr) AccessChain 34(data) 517 479 38
+                              Store 522 521
+             523:      6(int) Load 8(invocation)
+             524:    488(ptr) AccessChain 34(data) 47 479
+             525: 30(f16vec4) Load 524
+             526:487(f16vec2) VectorShuffle 525 525 0 1
+             527:      6(int) Load 8(invocation)
+             528:487(f16vec2) GroupNonUniformShuffleDown 43 526 527
+             529:    480(ptr) AccessChain 34(data) 523 479 38
+             530:29(float16_t) CompositeExtract 528 0
+                              Store 529 530
+             531:    480(ptr) AccessChain 34(data) 523 479 57
+             532:29(float16_t) CompositeExtract 528 1
+                              Store 531 532
+             533:      6(int) Load 8(invocation)
+             534:    488(ptr) AccessChain 34(data) 61 479
+             535: 30(f16vec4) Load 534
+             536:499(f16vec3) VectorShuffle 535 535 0 1 2
+             537:      6(int) Load 8(invocation)
+             538:499(f16vec3) GroupNonUniformShuffleDown 43 536 537
+             539:    480(ptr) AccessChain 34(data) 533 479 38
+             540:29(float16_t) CompositeExtract 538 0
+                              Store 539 540
+             541:    480(ptr) AccessChain 34(data) 533 479 57
+             542:29(float16_t) CompositeExtract 538 1
+                              Store 541 542
+             543:    480(ptr) AccessChain 34(data) 533 479 72
+             544:29(float16_t) CompositeExtract 538 2
+                              Store 543 544
+             545:      6(int) Load 8(invocation)
+             546:    488(ptr) AccessChain 34(data) 76 479
+             547: 30(f16vec4) Load 546
+             548:      6(int) Load 8(invocation)
+             549: 30(f16vec4) GroupNonUniformShuffleDown 43 547 548
+             550:    488(ptr) AccessChain 34(data) 545 479
+                              Store 550 549
                               Return
                               FunctionEnd
diff --git a/third_party/vulkan-deps/glslang/src/Test/baseResults/spv.subgroupPartitioned.comp.out b/third_party/vulkan-deps/glslang/src/Test/baseResults/spv.subgroupPartitioned.comp.out
index 7c7a0f9..0e7b7ef 100644
--- a/third_party/vulkan-deps/glslang/src/Test/baseResults/spv.subgroupPartitioned.comp.out
+++ b/third_party/vulkan-deps/glslang/src/Test/baseResults/spv.subgroupPartitioned.comp.out
@@ -1,7 +1,7 @@
 spv.subgroupPartitioned.comp
 // Module Version 10300
 // Generated by (magic number): 8000a
-// Id's are bound by 2506
+// Id's are bound by 2807
 
                               Capability Shader
                               Capability Float64
@@ -41,7 +41,7 @@
                               Decorate 28(Buffers) Block
                               Decorate 31(data) DescriptorSet 0
                               Decorate 31(data) Binding 0
-                              Decorate 2505 BuiltIn WorkgroupSize
+                              Decorate 2806 BuiltIn WorkgroupSize
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeInt 32 0
@@ -91,15 +91,16 @@
              169:             TypeVector 144(bool) 4
              170:   17(ivec4) ConstantComposite 35 35 35 35
              178:      6(int) Constant 3
-             727:   70(ivec2) ConstantComposite 34 34
-             731:   70(ivec2) ConstantComposite 63 63
-             740:   78(ivec3) ConstantComposite 34 34 34
-             744:   78(ivec3) ConstantComposite 63 63 63
-             752:   25(ivec4) ConstantComposite 34 34 34 34
-             756:   25(ivec4) ConstantComposite 63 63 63 63
-            2503:      6(int) Constant 8
-            2504:      6(int) Constant 1
-            2505:  103(ivec3) ConstantComposite 2503 2504 2504
+             189:      6(int) Constant 1
+             202:      6(int) Constant 2
+             801:   70(ivec2) ConstantComposite 34 34
+             805:   70(ivec2) ConstantComposite 63 63
+             815:   78(ivec3) ConstantComposite 34 34 34
+             819:   78(ivec3) ConstantComposite 63 63 63
+             830:   25(ivec4) ConstantComposite 34 34 34 34
+             834:   25(ivec4) ConstantComposite 63 63 63 63
+            2805:      6(int) Constant 8
+            2806:  103(ivec3) ConstantComposite 2805 189 189
          4(main):           2 Function None 3
                5:             Label
    8(invocation):      7(ptr) Variable Function
@@ -259,2614 +260,3139 @@
              184:   43(fvec2) VectorShuffle 183 183 0 1
              185:   17(ivec4) Load 19(ballot)
              186:   43(fvec2) GroupNonUniformFAdd 178 PartitionedReduceNV 184 185
-             187:     44(ptr) AccessChain 31(data) 181 34
-             188:   23(fvec4) Load 187
-             189:   23(fvec4) VectorShuffle 188 186 4 5 2 3
-                              Store 187 189
-             190:      6(int) Load 8(invocation)
-             191:     44(ptr) AccessChain 31(data) 33 34
-             192:   23(fvec4) Load 191
-             193:   51(fvec3) VectorShuffle 192 192 0 1 2
-             194:   17(ivec4) Load 19(ballot)
-             195:   51(fvec3) GroupNonUniformFAdd 178 PartitionedReduceNV 193 194
-             196:     44(ptr) AccessChain 31(data) 190 34
-             197:   23(fvec4) Load 196
-             198:   23(fvec4) VectorShuffle 197 195 4 5 6 3
-                              Store 196 198
-             199:      6(int) Load 8(invocation)
-             200:     44(ptr) AccessChain 31(data) 115 34
-             201:   23(fvec4) Load 200
-             202:   17(ivec4) Load 19(ballot)
-             203:   23(fvec4) GroupNonUniformFAdd 178 PartitionedReduceNV 201 202
-             204:     44(ptr) AccessChain 31(data) 199 34
-                              Store 204 203
+             187:     36(ptr) AccessChain 31(data) 181 34 35
+             188:   22(float) CompositeExtract 186 0
+                              Store 187 188
+             190:     36(ptr) AccessChain 31(data) 181 34 189
+             191:   22(float) CompositeExtract 186 1
+                              Store 190 191
+             192:      6(int) Load 8(invocation)
+             193:     44(ptr) AccessChain 31(data) 33 34
+             194:   23(fvec4) Load 193
+             195:   51(fvec3) VectorShuffle 194 194 0 1 2
+             196:   17(ivec4) Load 19(ballot)
+             197:   51(fvec3) GroupNonUniformFAdd 178 PartitionedReduceNV 195 196
+             198:     36(ptr) AccessChain 31(data) 192 34 35
+             199:   22(float) CompositeExtract 197 0
+                              Store 198 199
+             200:     36(ptr) AccessChain 31(data) 192 34 189
+             201:   22(float) CompositeExtract 197 1
+                              Store 200 201
+             203:     36(ptr) AccessChain 31(data) 192 34 202
+             204:   22(float) CompositeExtract 197 2
+                              Store 203 204
              205:      6(int) Load 8(invocation)
-             206:     64(ptr) AccessChain 31(data) 34 63 35
-             207:     24(int) Load 206
+             206:     44(ptr) AccessChain 31(data) 115 34
+             207:   23(fvec4) Load 206
              208:   17(ivec4) Load 19(ballot)
-             209:     24(int) GroupNonUniformIAdd 178 PartitionedReduceNV 207 208
-             210:     64(ptr) AccessChain 31(data) 205 63 35
+             209:   23(fvec4) GroupNonUniformFAdd 178 PartitionedReduceNV 207 208
+             210:     44(ptr) AccessChain 31(data) 205 34
                               Store 210 209
              211:      6(int) Load 8(invocation)
-             212:     71(ptr) AccessChain 31(data) 63 63
-             213:   25(ivec4) Load 212
-             214:   70(ivec2) VectorShuffle 213 213 0 1
-             215:   17(ivec4) Load 19(ballot)
-             216:   70(ivec2) GroupNonUniformIAdd 178 PartitionedReduceNV 214 215
-             217:     71(ptr) AccessChain 31(data) 211 63
-             218:   25(ivec4) Load 217
-             219:   25(ivec4) VectorShuffle 218 216 4 5 2 3
-                              Store 217 219
-             220:      6(int) Load 8(invocation)
-             221:     71(ptr) AccessChain 31(data) 33 63
-             222:   25(ivec4) Load 221
-             223:   78(ivec3) VectorShuffle 222 222 0 1 2
-             224:   17(ivec4) Load 19(ballot)
-             225:   78(ivec3) GroupNonUniformIAdd 178 PartitionedReduceNV 223 224
-             226:     71(ptr) AccessChain 31(data) 220 63
-             227:   25(ivec4) Load 226
-             228:   25(ivec4) VectorShuffle 227 225 4 5 6 3
-                              Store 226 228
-             229:      6(int) Load 8(invocation)
-             230:     71(ptr) AccessChain 31(data) 115 63
-             231:   25(ivec4) Load 230
-             232:   17(ivec4) Load 19(ballot)
-             233:   25(ivec4) GroupNonUniformIAdd 178 PartitionedReduceNV 231 232
-             234:     71(ptr) AccessChain 31(data) 229 63
-                              Store 234 233
-             235:      6(int) Load 8(invocation)
-             236:     90(ptr) AccessChain 31(data) 34 33 35
-             237:      6(int) Load 236
-             238:   17(ivec4) Load 19(ballot)
-             239:      6(int) GroupNonUniformIAdd 178 PartitionedReduceNV 237 238
-             240:     90(ptr) AccessChain 31(data) 235 33 35
-                              Store 240 239
-             241:      6(int) Load 8(invocation)
-             242:     40(ptr) AccessChain 31(data) 63 33
-             243:   17(ivec4) Load 242
-             244:   96(ivec2) VectorShuffle 243 243 0 1
-             245:   17(ivec4) Load 19(ballot)
-             246:   96(ivec2) GroupNonUniformIAdd 178 PartitionedReduceNV 244 245
-             247:     40(ptr) AccessChain 31(data) 241 33
-             248:   17(ivec4) Load 247
-             249:   17(ivec4) VectorShuffle 248 246 4 5 2 3
-                              Store 247 249
-             250:      6(int) Load 8(invocation)
-             251:     40(ptr) AccessChain 31(data) 33 33
-             252:   17(ivec4) Load 251
-             253:  103(ivec3) VectorShuffle 252 252 0 1 2
-             254:   17(ivec4) Load 19(ballot)
-             255:  103(ivec3) GroupNonUniformIAdd 178 PartitionedReduceNV 253 254
-             256:     40(ptr) AccessChain 31(data) 250 33
-             257:   17(ivec4) Load 256
-             258:   17(ivec4) VectorShuffle 257 255 4 5 6 3
-                              Store 256 258
-             259:      6(int) Load 8(invocation)
-             260:     40(ptr) AccessChain 31(data) 115 33
-             261:   17(ivec4) Load 260
-             262:   17(ivec4) Load 19(ballot)
-             263:   17(ivec4) GroupNonUniformIAdd 178 PartitionedReduceNV 261 262
-             264:     40(ptr) AccessChain 31(data) 259 33
-                              Store 264 263
-             265:      6(int) Load 8(invocation)
-             266:    116(ptr) AccessChain 31(data) 34 115 35
-             267:26(float64_t) Load 266
-             268:   17(ivec4) Load 19(ballot)
-             269:26(float64_t) GroupNonUniformFAdd 178 PartitionedReduceNV 267 268
-             270:    116(ptr) AccessChain 31(data) 265 115 35
-                              Store 270 269
-             271:      6(int) Load 8(invocation)
-             272:    123(ptr) AccessChain 31(data) 63 115
-             273: 27(f64vec4) Load 272
-             274:122(f64vec2) VectorShuffle 273 273 0 1
-             275:   17(ivec4) Load 19(ballot)
-             276:122(f64vec2) GroupNonUniformFAdd 178 PartitionedReduceNV 274 275
-             277:    123(ptr) AccessChain 31(data) 271 115
-             278: 27(f64vec4) Load 277
-             279: 27(f64vec4) VectorShuffle 278 276 4 5 2 3
-                              Store 277 279
-             280:      6(int) Load 8(invocation)
-             281:    123(ptr) AccessChain 31(data) 33 115
-             282: 27(f64vec4) Load 281
-             283:130(f64vec3) VectorShuffle 282 282 0 1 2
-             284:   17(ivec4) Load 19(ballot)
-             285:130(f64vec3) GroupNonUniformFAdd 178 PartitionedReduceNV 283 284
-             286:    123(ptr) AccessChain 31(data) 280 115
+             212:     64(ptr) AccessChain 31(data) 34 63 35
+             213:     24(int) Load 212
+             214:   17(ivec4) Load 19(ballot)
+             215:     24(int) GroupNonUniformIAdd 178 PartitionedReduceNV 213 214
+             216:     64(ptr) AccessChain 31(data) 211 63 35
+                              Store 216 215
+             217:      6(int) Load 8(invocation)
+             218:     71(ptr) AccessChain 31(data) 63 63
+             219:   25(ivec4) Load 218
+             220:   70(ivec2) VectorShuffle 219 219 0 1
+             221:   17(ivec4) Load 19(ballot)
+             222:   70(ivec2) GroupNonUniformIAdd 178 PartitionedReduceNV 220 221
+             223:     64(ptr) AccessChain 31(data) 217 63 35
+             224:     24(int) CompositeExtract 222 0
+                              Store 223 224
+             225:     64(ptr) AccessChain 31(data) 217 63 189
+             226:     24(int) CompositeExtract 222 1
+                              Store 225 226
+             227:      6(int) Load 8(invocation)
+             228:     71(ptr) AccessChain 31(data) 33 63
+             229:   25(ivec4) Load 228
+             230:   78(ivec3) VectorShuffle 229 229 0 1 2
+             231:   17(ivec4) Load 19(ballot)
+             232:   78(ivec3) GroupNonUniformIAdd 178 PartitionedReduceNV 230 231
+             233:     64(ptr) AccessChain 31(data) 227 63 35
+             234:     24(int) CompositeExtract 232 0
+                              Store 233 234
+             235:     64(ptr) AccessChain 31(data) 227 63 189
+             236:     24(int) CompositeExtract 232 1
+                              Store 235 236
+             237:     64(ptr) AccessChain 31(data) 227 63 202
+             238:     24(int) CompositeExtract 232 2
+                              Store 237 238
+             239:      6(int) Load 8(invocation)
+             240:     71(ptr) AccessChain 31(data) 115 63
+             241:   25(ivec4) Load 240
+             242:   17(ivec4) Load 19(ballot)
+             243:   25(ivec4) GroupNonUniformIAdd 178 PartitionedReduceNV 241 242
+             244:     71(ptr) AccessChain 31(data) 239 63
+                              Store 244 243
+             245:      6(int) Load 8(invocation)
+             246:     90(ptr) AccessChain 31(data) 34 33 35
+             247:      6(int) Load 246
+             248:   17(ivec4) Load 19(ballot)
+             249:      6(int) GroupNonUniformIAdd 178 PartitionedReduceNV 247 248
+             250:     90(ptr) AccessChain 31(data) 245 33 35
+                              Store 250 249
+             251:      6(int) Load 8(invocation)
+             252:     40(ptr) AccessChain 31(data) 63 33
+             253:   17(ivec4) Load 252
+             254:   96(ivec2) VectorShuffle 253 253 0 1
+             255:   17(ivec4) Load 19(ballot)
+             256:   96(ivec2) GroupNonUniformIAdd 178 PartitionedReduceNV 254 255
+             257:     90(ptr) AccessChain 31(data) 251 33 35
+             258:      6(int) CompositeExtract 256 0
+                              Store 257 258
+             259:     90(ptr) AccessChain 31(data) 251 33 189
+             260:      6(int) CompositeExtract 256 1
+                              Store 259 260
+             261:      6(int) Load 8(invocation)
+             262:     40(ptr) AccessChain 31(data) 33 33
+             263:   17(ivec4) Load 262
+             264:  103(ivec3) VectorShuffle 263 263 0 1 2
+             265:   17(ivec4) Load 19(ballot)
+             266:  103(ivec3) GroupNonUniformIAdd 178 PartitionedReduceNV 264 265
+             267:     90(ptr) AccessChain 31(data) 261 33 35
+             268:      6(int) CompositeExtract 266 0
+                              Store 267 268
+             269:     90(ptr) AccessChain 31(data) 261 33 189
+             270:      6(int) CompositeExtract 266 1
+                              Store 269 270
+             271:     90(ptr) AccessChain 31(data) 261 33 202
+             272:      6(int) CompositeExtract 266 2
+                              Store 271 272
+             273:      6(int) Load 8(invocation)
+             274:     40(ptr) AccessChain 31(data) 115 33
+             275:   17(ivec4) Load 274
+             276:   17(ivec4) Load 19(ballot)
+             277:   17(ivec4) GroupNonUniformIAdd 178 PartitionedReduceNV 275 276
+             278:     40(ptr) AccessChain 31(data) 273 33
+                              Store 278 277
+             279:      6(int) Load 8(invocation)
+             280:    116(ptr) AccessChain 31(data) 34 115 35
+             281:26(float64_t) Load 280
+             282:   17(ivec4) Load 19(ballot)
+             283:26(float64_t) GroupNonUniformFAdd 178 PartitionedReduceNV 281 282
+             284:    116(ptr) AccessChain 31(data) 279 115 35
+                              Store 284 283
+             285:      6(int) Load 8(invocation)
+             286:    123(ptr) AccessChain 31(data) 63 115
              287: 27(f64vec4) Load 286
-             288: 27(f64vec4) VectorShuffle 287 285 4 5 6 3
-                              Store 286 288
-             289:      6(int) Load 8(invocation)
-             290:    123(ptr) AccessChain 31(data) 115 115
-             291: 27(f64vec4) Load 290
-             292:   17(ivec4) Load 19(ballot)
-             293: 27(f64vec4) GroupNonUniformFAdd 178 PartitionedReduceNV 291 292
-             294:    123(ptr) AccessChain 31(data) 289 115
-                              Store 294 293
+             288:122(f64vec2) VectorShuffle 287 287 0 1
+             289:   17(ivec4) Load 19(ballot)
+             290:122(f64vec2) GroupNonUniformFAdd 178 PartitionedReduceNV 288 289
+             291:    116(ptr) AccessChain 31(data) 285 115 35
+             292:26(float64_t) CompositeExtract 290 0
+                              Store 291 292
+             293:    116(ptr) AccessChain 31(data) 285 115 189
+             294:26(float64_t) CompositeExtract 290 1
+                              Store 293 294
              295:      6(int) Load 8(invocation)
-             296:     36(ptr) AccessChain 31(data) 34 34 35
-             297:   22(float) Load 296
-             298:   17(ivec4) Load 19(ballot)
-             299:   22(float) GroupNonUniformFMul 178 PartitionedReduceNV 297 298
-             300:     36(ptr) AccessChain 31(data) 295 34 35
-                              Store 300 299
-             301:      6(int) Load 8(invocation)
-             302:     44(ptr) AccessChain 31(data) 63 34
-             303:   23(fvec4) Load 302
-             304:   43(fvec2) VectorShuffle 303 303 0 1
-             305:   17(ivec4) Load 19(ballot)
-             306:   43(fvec2) GroupNonUniformFMul 178 PartitionedReduceNV 304 305
-             307:     44(ptr) AccessChain 31(data) 301 34
-             308:   23(fvec4) Load 307
-             309:   23(fvec4) VectorShuffle 308 306 4 5 2 3
-                              Store 307 309
-             310:      6(int) Load 8(invocation)
-             311:     44(ptr) AccessChain 31(data) 33 34
-             312:   23(fvec4) Load 311
-             313:   51(fvec3) VectorShuffle 312 312 0 1 2
-             314:   17(ivec4) Load 19(ballot)
-             315:   51(fvec3) GroupNonUniformFMul 178 PartitionedReduceNV 313 314
-             316:     44(ptr) AccessChain 31(data) 310 34
-             317:   23(fvec4) Load 316
-             318:   23(fvec4) VectorShuffle 317 315 4 5 6 3
-                              Store 316 318
+             296:    123(ptr) AccessChain 31(data) 33 115
+             297: 27(f64vec4) Load 296
+             298:130(f64vec3) VectorShuffle 297 297 0 1 2
+             299:   17(ivec4) Load 19(ballot)
+             300:130(f64vec3) GroupNonUniformFAdd 178 PartitionedReduceNV 298 299
+             301:    116(ptr) AccessChain 31(data) 295 115 35
+             302:26(float64_t) CompositeExtract 300 0
+                              Store 301 302
+             303:    116(ptr) AccessChain 31(data) 295 115 189
+             304:26(float64_t) CompositeExtract 300 1
+                              Store 303 304
+             305:    116(ptr) AccessChain 31(data) 295 115 202
+             306:26(float64_t) CompositeExtract 300 2
+                              Store 305 306
+             307:      6(int) Load 8(invocation)
+             308:    123(ptr) AccessChain 31(data) 115 115
+             309: 27(f64vec4) Load 308
+             310:   17(ivec4) Load 19(ballot)
+             311: 27(f64vec4) GroupNonUniformFAdd 178 PartitionedReduceNV 309 310
+             312:    123(ptr) AccessChain 31(data) 307 115
+                              Store 312 311
+             313:      6(int) Load 8(invocation)
+             314:     36(ptr) AccessChain 31(data) 34 34 35
+             315:   22(float) Load 314
+             316:   17(ivec4) Load 19(ballot)
+             317:   22(float) GroupNonUniformFMul 178 PartitionedReduceNV 315 316
+             318:     36(ptr) AccessChain 31(data) 313 34 35
+                              Store 318 317
              319:      6(int) Load 8(invocation)
-             320:     44(ptr) AccessChain 31(data) 115 34
+             320:     44(ptr) AccessChain 31(data) 63 34
              321:   23(fvec4) Load 320
-             322:   17(ivec4) Load 19(ballot)
-             323:   23(fvec4) GroupNonUniformFMul 178 PartitionedReduceNV 321 322
-             324:     44(ptr) AccessChain 31(data) 319 34
-                              Store 324 323
-             325:      6(int) Load 8(invocation)
-             326:     64(ptr) AccessChain 31(data) 34 63 35
-             327:     24(int) Load 326
-             328:   17(ivec4) Load 19(ballot)
-             329:     24(int) GroupNonUniformIMul 178 PartitionedReduceNV 327 328
-             330:     64(ptr) AccessChain 31(data) 325 63 35
-                              Store 330 329
-             331:      6(int) Load 8(invocation)
-             332:     71(ptr) AccessChain 31(data) 63 63
-             333:   25(ivec4) Load 332
-             334:   70(ivec2) VectorShuffle 333 333 0 1
-             335:   17(ivec4) Load 19(ballot)
-             336:   70(ivec2) GroupNonUniformIMul 178 PartitionedReduceNV 334 335
-             337:     71(ptr) AccessChain 31(data) 331 63
-             338:   25(ivec4) Load 337
-             339:   25(ivec4) VectorShuffle 338 336 4 5 2 3
-                              Store 337 339
-             340:      6(int) Load 8(invocation)
-             341:     71(ptr) AccessChain 31(data) 33 63
-             342:   25(ivec4) Load 341
-             343:   78(ivec3) VectorShuffle 342 342 0 1 2
+             322:   43(fvec2) VectorShuffle 321 321 0 1
+             323:   17(ivec4) Load 19(ballot)
+             324:   43(fvec2) GroupNonUniformFMul 178 PartitionedReduceNV 322 323
+             325:     36(ptr) AccessChain 31(data) 319 34 35
+             326:   22(float) CompositeExtract 324 0
+                              Store 325 326
+             327:     36(ptr) AccessChain 31(data) 319 34 189
+             328:   22(float) CompositeExtract 324 1
+                              Store 327 328
+             329:      6(int) Load 8(invocation)
+             330:     44(ptr) AccessChain 31(data) 33 34
+             331:   23(fvec4) Load 330
+             332:   51(fvec3) VectorShuffle 331 331 0 1 2
+             333:   17(ivec4) Load 19(ballot)
+             334:   51(fvec3) GroupNonUniformFMul 178 PartitionedReduceNV 332 333
+             335:     36(ptr) AccessChain 31(data) 329 34 35
+             336:   22(float) CompositeExtract 334 0
+                              Store 335 336
+             337:     36(ptr) AccessChain 31(data) 329 34 189
+             338:   22(float) CompositeExtract 334 1
+                              Store 337 338
+             339:     36(ptr) AccessChain 31(data) 329 34 202
+             340:   22(float) CompositeExtract 334 2
+                              Store 339 340
+             341:      6(int) Load 8(invocation)
+             342:     44(ptr) AccessChain 31(data) 115 34
+             343:   23(fvec4) Load 342
              344:   17(ivec4) Load 19(ballot)
-             345:   78(ivec3) GroupNonUniformIMul 178 PartitionedReduceNV 343 344
-             346:     71(ptr) AccessChain 31(data) 340 63
-             347:   25(ivec4) Load 346
-             348:   25(ivec4) VectorShuffle 347 345 4 5 6 3
-                              Store 346 348
-             349:      6(int) Load 8(invocation)
-             350:     71(ptr) AccessChain 31(data) 115 63
-             351:   25(ivec4) Load 350
-             352:   17(ivec4) Load 19(ballot)
-             353:   25(ivec4) GroupNonUniformIMul 178 PartitionedReduceNV 351 352
-             354:     71(ptr) AccessChain 31(data) 349 63
-                              Store 354 353
-             355:      6(int) Load 8(invocation)
-             356:     90(ptr) AccessChain 31(data) 34 33 35
-             357:      6(int) Load 356
-             358:   17(ivec4) Load 19(ballot)
-             359:      6(int) GroupNonUniformIMul 178 PartitionedReduceNV 357 358
-             360:     90(ptr) AccessChain 31(data) 355 33 35
-                              Store 360 359
-             361:      6(int) Load 8(invocation)
-             362:     40(ptr) AccessChain 31(data) 63 33
-             363:   17(ivec4) Load 362
-             364:   96(ivec2) VectorShuffle 363 363 0 1
-             365:   17(ivec4) Load 19(ballot)
-             366:   96(ivec2) GroupNonUniformIMul 178 PartitionedReduceNV 364 365
-             367:     40(ptr) AccessChain 31(data) 361 33
-             368:   17(ivec4) Load 367
-             369:   17(ivec4) VectorShuffle 368 366 4 5 2 3
-                              Store 367 369
-             370:      6(int) Load 8(invocation)
-             371:     40(ptr) AccessChain 31(data) 33 33
-             372:   17(ivec4) Load 371
-             373:  103(ivec3) VectorShuffle 372 372 0 1 2
-             374:   17(ivec4) Load 19(ballot)
-             375:  103(ivec3) GroupNonUniformIMul 178 PartitionedReduceNV 373 374
-             376:     40(ptr) AccessChain 31(data) 370 33
-             377:   17(ivec4) Load 376
-             378:   17(ivec4) VectorShuffle 377 375 4 5 6 3
-                              Store 376 378
-             379:      6(int) Load 8(invocation)
-             380:     40(ptr) AccessChain 31(data) 115 33
-             381:   17(ivec4) Load 380
-             382:   17(ivec4) Load 19(ballot)
-             383:   17(ivec4) GroupNonUniformIMul 178 PartitionedReduceNV 381 382
-             384:     40(ptr) AccessChain 31(data) 379 33
-                              Store 384 383
-             385:      6(int) Load 8(invocation)
-             386:    116(ptr) AccessChain 31(data) 34 115 35
-             387:26(float64_t) Load 386
-             388:   17(ivec4) Load 19(ballot)
-             389:26(float64_t) GroupNonUniformFMul 178 PartitionedReduceNV 387 388
-             390:    116(ptr) AccessChain 31(data) 385 115 35
-                              Store 390 389
-             391:      6(int) Load 8(invocation)
-             392:    123(ptr) AccessChain 31(data) 63 115
-             393: 27(f64vec4) Load 392
-             394:122(f64vec2) VectorShuffle 393 393 0 1
-             395:   17(ivec4) Load 19(ballot)
-             396:122(f64vec2) GroupNonUniformFMul 178 PartitionedReduceNV 394 395
-             397:    123(ptr) AccessChain 31(data) 391 115
-             398: 27(f64vec4) Load 397
-             399: 27(f64vec4) VectorShuffle 398 396 4 5 2 3
-                              Store 397 399
-             400:      6(int) Load 8(invocation)
-             401:    123(ptr) AccessChain 31(data) 33 115
-             402: 27(f64vec4) Load 401
-             403:130(f64vec3) VectorShuffle 402 402 0 1 2
-             404:   17(ivec4) Load 19(ballot)
-             405:130(f64vec3) GroupNonUniformFMul 178 PartitionedReduceNV 403 404
-             406:    123(ptr) AccessChain 31(data) 400 115
-             407: 27(f64vec4) Load 406
-             408: 27(f64vec4) VectorShuffle 407 405 4 5 6 3
-                              Store 406 408
+             345:   23(fvec4) GroupNonUniformFMul 178 PartitionedReduceNV 343 344
+             346:     44(ptr) AccessChain 31(data) 341 34
+                              Store 346 345
+             347:      6(int) Load 8(invocation)
+             348:     64(ptr) AccessChain 31(data) 34 63 35
+             349:     24(int) Load 348
+             350:   17(ivec4) Load 19(ballot)
+             351:     24(int) GroupNonUniformIMul 178 PartitionedReduceNV 349 350
+             352:     64(ptr) AccessChain 31(data) 347 63 35
+                              Store 352 351
+             353:      6(int) Load 8(invocation)
+             354:     71(ptr) AccessChain 31(data) 63 63
+             355:   25(ivec4) Load 354
+             356:   70(ivec2) VectorShuffle 355 355 0 1
+             357:   17(ivec4) Load 19(ballot)
+             358:   70(ivec2) GroupNonUniformIMul 178 PartitionedReduceNV 356 357
+             359:     64(ptr) AccessChain 31(data) 353 63 35
+             360:     24(int) CompositeExtract 358 0
+                              Store 359 360
+             361:     64(ptr) AccessChain 31(data) 353 63 189
+             362:     24(int) CompositeExtract 358 1
+                              Store 361 362
+             363:      6(int) Load 8(invocation)
+             364:     71(ptr) AccessChain 31(data) 33 63
+             365:   25(ivec4) Load 364
+             366:   78(ivec3) VectorShuffle 365 365 0 1 2
+             367:   17(ivec4) Load 19(ballot)
+             368:   78(ivec3) GroupNonUniformIMul 178 PartitionedReduceNV 366 367
+             369:     64(ptr) AccessChain 31(data) 363 63 35
+             370:     24(int) CompositeExtract 368 0
+                              Store 369 370
+             371:     64(ptr) AccessChain 31(data) 363 63 189
+             372:     24(int) CompositeExtract 368 1
+                              Store 371 372
+             373:     64(ptr) AccessChain 31(data) 363 63 202
+             374:     24(int) CompositeExtract 368 2
+                              Store 373 374
+             375:      6(int) Load 8(invocation)
+             376:     71(ptr) AccessChain 31(data) 115 63
+             377:   25(ivec4) Load 376
+             378:   17(ivec4) Load 19(ballot)
+             379:   25(ivec4) GroupNonUniformIMul 178 PartitionedReduceNV 377 378
+             380:     71(ptr) AccessChain 31(data) 375 63
+                              Store 380 379
+             381:      6(int) Load 8(invocation)
+             382:     90(ptr) AccessChain 31(data) 34 33 35
+             383:      6(int) Load 382
+             384:   17(ivec4) Load 19(ballot)
+             385:      6(int) GroupNonUniformIMul 178 PartitionedReduceNV 383 384
+             386:     90(ptr) AccessChain 31(data) 381 33 35
+                              Store 386 385
+             387:      6(int) Load 8(invocation)
+             388:     40(ptr) AccessChain 31(data) 63 33
+             389:   17(ivec4) Load 388
+             390:   96(ivec2) VectorShuffle 389 389 0 1
+             391:   17(ivec4) Load 19(ballot)
+             392:   96(ivec2) GroupNonUniformIMul 178 PartitionedReduceNV 390 391
+             393:     90(ptr) AccessChain 31(data) 387 33 35
+             394:      6(int) CompositeExtract 392 0
+                              Store 393 394
+             395:     90(ptr) AccessChain 31(data) 387 33 189
+             396:      6(int) CompositeExtract 392 1
+                              Store 395 396
+             397:      6(int) Load 8(invocation)
+             398:     40(ptr) AccessChain 31(data) 33 33
+             399:   17(ivec4) Load 398
+             400:  103(ivec3) VectorShuffle 399 399 0 1 2
+             401:   17(ivec4) Load 19(ballot)
+             402:  103(ivec3) GroupNonUniformIMul 178 PartitionedReduceNV 400 401
+             403:     90(ptr) AccessChain 31(data) 397 33 35
+             404:      6(int) CompositeExtract 402 0
+                              Store 403 404
+             405:     90(ptr) AccessChain 31(data) 397 33 189
+             406:      6(int) CompositeExtract 402 1
+                              Store 405 406
+             407:     90(ptr) AccessChain 31(data) 397 33 202
+             408:      6(int) CompositeExtract 402 2
+                              Store 407 408
              409:      6(int) Load 8(invocation)
-             410:    123(ptr) AccessChain 31(data) 115 115
-             411: 27(f64vec4) Load 410
+             410:     40(ptr) AccessChain 31(data) 115 33
+             411:   17(ivec4) Load 410
              412:   17(ivec4) Load 19(ballot)
-             413: 27(f64vec4) GroupNonUniformFMul 178 PartitionedReduceNV 411 412
-             414:    123(ptr) AccessChain 31(data) 409 115
+             413:   17(ivec4) GroupNonUniformIMul 178 PartitionedReduceNV 411 412
+             414:     40(ptr) AccessChain 31(data) 409 33
                               Store 414 413
              415:      6(int) Load 8(invocation)
-             416:     36(ptr) AccessChain 31(data) 34 34 35
-             417:   22(float) Load 416
+             416:    116(ptr) AccessChain 31(data) 34 115 35
+             417:26(float64_t) Load 416
              418:   17(ivec4) Load 19(ballot)
-             419:   22(float) GroupNonUniformFMin 178 PartitionedReduceNV 417 418
-             420:     36(ptr) AccessChain 31(data) 415 34 35
+             419:26(float64_t) GroupNonUniformFMul 178 PartitionedReduceNV 417 418
+             420:    116(ptr) AccessChain 31(data) 415 115 35
                               Store 420 419
              421:      6(int) Load 8(invocation)
-             422:     44(ptr) AccessChain 31(data) 63 34
-             423:   23(fvec4) Load 422
-             424:   43(fvec2) VectorShuffle 423 423 0 1
+             422:    123(ptr) AccessChain 31(data) 63 115
+             423: 27(f64vec4) Load 422
+             424:122(f64vec2) VectorShuffle 423 423 0 1
              425:   17(ivec4) Load 19(ballot)
-             426:   43(fvec2) GroupNonUniformFMin 178 PartitionedReduceNV 424 425
-             427:     44(ptr) AccessChain 31(data) 421 34
-             428:   23(fvec4) Load 427
-             429:   23(fvec4) VectorShuffle 428 426 4 5 2 3
-                              Store 427 429
-             430:      6(int) Load 8(invocation)
-             431:     44(ptr) AccessChain 31(data) 33 34
-             432:   23(fvec4) Load 431
-             433:   51(fvec3) VectorShuffle 432 432 0 1 2
-             434:   17(ivec4) Load 19(ballot)
-             435:   51(fvec3) GroupNonUniformFMin 178 PartitionedReduceNV 433 434
-             436:     44(ptr) AccessChain 31(data) 430 34
-             437:   23(fvec4) Load 436
-             438:   23(fvec4) VectorShuffle 437 435 4 5 6 3
-                              Store 436 438
-             439:      6(int) Load 8(invocation)
-             440:     44(ptr) AccessChain 31(data) 115 34
-             441:   23(fvec4) Load 440
-             442:   17(ivec4) Load 19(ballot)
-             443:   23(fvec4) GroupNonUniformFMin 178 PartitionedReduceNV 441 442
-             444:     44(ptr) AccessChain 31(data) 439 34
-                              Store 444 443
-             445:      6(int) Load 8(invocation)
-             446:     64(ptr) AccessChain 31(data) 34 63 35
-             447:     24(int) Load 446
-             448:   17(ivec4) Load 19(ballot)
-             449:     24(int) GroupNonUniformSMin 178 PartitionedReduceNV 447 448
-             450:     64(ptr) AccessChain 31(data) 445 63 35
-                              Store 450 449
-             451:      6(int) Load 8(invocation)
-             452:     71(ptr) AccessChain 31(data) 63 63
-             453:   25(ivec4) Load 452
-             454:   70(ivec2) VectorShuffle 453 453 0 1
-             455:   17(ivec4) Load 19(ballot)
-             456:   70(ivec2) GroupNonUniformSMin 178 PartitionedReduceNV 454 455
-             457:     71(ptr) AccessChain 31(data) 451 63
-             458:   25(ivec4) Load 457
-             459:   25(ivec4) VectorShuffle 458 456 4 5 2 3
-                              Store 457 459
-             460:      6(int) Load 8(invocation)
-             461:     71(ptr) AccessChain 31(data) 33 63
-             462:   25(ivec4) Load 461
-             463:   78(ivec3) VectorShuffle 462 462 0 1 2
-             464:   17(ivec4) Load 19(ballot)
-             465:   78(ivec3) GroupNonUniformSMin 178 PartitionedReduceNV 463 464
-             466:     71(ptr) AccessChain 31(data) 460 63
-             467:   25(ivec4) Load 466
-             468:   25(ivec4) VectorShuffle 467 465 4 5 6 3
-                              Store 466 468
-             469:      6(int) Load 8(invocation)
-             470:     71(ptr) AccessChain 31(data) 115 63
-             471:   25(ivec4) Load 470
-             472:   17(ivec4) Load 19(ballot)
-             473:   25(ivec4) GroupNonUniformSMin 178 PartitionedReduceNV 471 472
-             474:     71(ptr) AccessChain 31(data) 469 63
-                              Store 474 473
-             475:      6(int) Load 8(invocation)
-             476:     90(ptr) AccessChain 31(data) 34 33 35
-             477:      6(int) Load 476
-             478:   17(ivec4) Load 19(ballot)
-             479:      6(int) GroupNonUniformUMin 178 PartitionedReduceNV 477 478
-             480:     90(ptr) AccessChain 31(data) 475 33 35
-                              Store 480 479
-             481:      6(int) Load 8(invocation)
-             482:     40(ptr) AccessChain 31(data) 63 33
-             483:   17(ivec4) Load 482
-             484:   96(ivec2) VectorShuffle 483 483 0 1
-             485:   17(ivec4) Load 19(ballot)
-             486:   96(ivec2) GroupNonUniformUMin 178 PartitionedReduceNV 484 485
-             487:     40(ptr) AccessChain 31(data) 481 33
-             488:   17(ivec4) Load 487
-             489:   17(ivec4) VectorShuffle 488 486 4 5 2 3
-                              Store 487 489
-             490:      6(int) Load 8(invocation)
-             491:     40(ptr) AccessChain 31(data) 33 33
-             492:   17(ivec4) Load 491
-             493:  103(ivec3) VectorShuffle 492 492 0 1 2
-             494:   17(ivec4) Load 19(ballot)
-             495:  103(ivec3) GroupNonUniformUMin 178 PartitionedReduceNV 493 494
-             496:     40(ptr) AccessChain 31(data) 490 33
-             497:   17(ivec4) Load 496
-             498:   17(ivec4) VectorShuffle 497 495 4 5 6 3
-                              Store 496 498
+             426:122(f64vec2) GroupNonUniformFMul 178 PartitionedReduceNV 424 425
+             427:    116(ptr) AccessChain 31(data) 421 115 35
+             428:26(float64_t) CompositeExtract 426 0
+                              Store 427 428
+             429:    116(ptr) AccessChain 31(data) 421 115 189
+             430:26(float64_t) CompositeExtract 426 1
+                              Store 429 430
+             431:      6(int) Load 8(invocation)
+             432:    123(ptr) AccessChain 31(data) 33 115
+             433: 27(f64vec4) Load 432
+             434:130(f64vec3) VectorShuffle 433 433 0 1 2
+             435:   17(ivec4) Load 19(ballot)
+             436:130(f64vec3) GroupNonUniformFMul 178 PartitionedReduceNV 434 435
+             437:    116(ptr) AccessChain 31(data) 431 115 35
+             438:26(float64_t) CompositeExtract 436 0
+                              Store 437 438
+             439:    116(ptr) AccessChain 31(data) 431 115 189
+             440:26(float64_t) CompositeExtract 436 1
+                              Store 439 440
+             441:    116(ptr) AccessChain 31(data) 431 115 202
+             442:26(float64_t) CompositeExtract 436 2
+                              Store 441 442
+             443:      6(int) Load 8(invocation)
+             444:    123(ptr) AccessChain 31(data) 115 115
+             445: 27(f64vec4) Load 444
+             446:   17(ivec4) Load 19(ballot)
+             447: 27(f64vec4) GroupNonUniformFMul 178 PartitionedReduceNV 445 446
+             448:    123(ptr) AccessChain 31(data) 443 115
+                              Store 448 447
+             449:      6(int) Load 8(invocation)
+             450:     36(ptr) AccessChain 31(data) 34 34 35
+             451:   22(float) Load 450
+             452:   17(ivec4) Load 19(ballot)
+             453:   22(float) GroupNonUniformFMin 178 PartitionedReduceNV 451 452
+             454:     36(ptr) AccessChain 31(data) 449 34 35
+                              Store 454 453
+             455:      6(int) Load 8(invocation)
+             456:     44(ptr) AccessChain 31(data) 63 34
+             457:   23(fvec4) Load 456
+             458:   43(fvec2) VectorShuffle 457 457 0 1
+             459:   17(ivec4) Load 19(ballot)
+             460:   43(fvec2) GroupNonUniformFMin 178 PartitionedReduceNV 458 459
+             461:     36(ptr) AccessChain 31(data) 455 34 35
+             462:   22(float) CompositeExtract 460 0
+                              Store 461 462
+             463:     36(ptr) AccessChain 31(data) 455 34 189
+             464:   22(float) CompositeExtract 460 1
+                              Store 463 464
+             465:      6(int) Load 8(invocation)
+             466:     44(ptr) AccessChain 31(data) 33 34
+             467:   23(fvec4) Load 466
+             468:   51(fvec3) VectorShuffle 467 467 0 1 2
+             469:   17(ivec4) Load 19(ballot)
+             470:   51(fvec3) GroupNonUniformFMin 178 PartitionedReduceNV 468 469
+             471:     36(ptr) AccessChain 31(data) 465 34 35
+             472:   22(float) CompositeExtract 470 0
+                              Store 471 472
+             473:     36(ptr) AccessChain 31(data) 465 34 189
+             474:   22(float) CompositeExtract 470 1
+                              Store 473 474
+             475:     36(ptr) AccessChain 31(data) 465 34 202
+             476:   22(float) CompositeExtract 470 2
+                              Store 475 476
+             477:      6(int) Load 8(invocation)
+             478:     44(ptr) AccessChain 31(data) 115 34
+             479:   23(fvec4) Load 478
+             480:   17(ivec4) Load 19(ballot)
+             481:   23(fvec4) GroupNonUniformFMin 178 PartitionedReduceNV 479 480
+             482:     44(ptr) AccessChain 31(data) 477 34
+                              Store 482 481
+             483:      6(int) Load 8(invocation)
+             484:     64(ptr) AccessChain 31(data) 34 63 35
+             485:     24(int) Load 484
+             486:   17(ivec4) Load 19(ballot)
+             487:     24(int) GroupNonUniformSMin 178 PartitionedReduceNV 485 486
+             488:     64(ptr) AccessChain 31(data) 483 63 35
+                              Store 488 487
+             489:      6(int) Load 8(invocation)
+             490:     71(ptr) AccessChain 31(data) 63 63
+             491:   25(ivec4) Load 490
+             492:   70(ivec2) VectorShuffle 491 491 0 1
+             493:   17(ivec4) Load 19(ballot)
+             494:   70(ivec2) GroupNonUniformSMin 178 PartitionedReduceNV 492 493
+             495:     64(ptr) AccessChain 31(data) 489 63 35
+             496:     24(int) CompositeExtract 494 0
+                              Store 495 496
+             497:     64(ptr) AccessChain 31(data) 489 63 189
+             498:     24(int) CompositeExtract 494 1
+                              Store 497 498
              499:      6(int) Load 8(invocation)
-             500:     40(ptr) AccessChain 31(data) 115 33
-             501:   17(ivec4) Load 500
-             502:   17(ivec4) Load 19(ballot)
-             503:   17(ivec4) GroupNonUniformUMin 178 PartitionedReduceNV 501 502
-             504:     40(ptr) AccessChain 31(data) 499 33
-                              Store 504 503
-             505:      6(int) Load 8(invocation)
-             506:    116(ptr) AccessChain 31(data) 34 115 35
-             507:26(float64_t) Load 506
-             508:   17(ivec4) Load 19(ballot)
-             509:26(float64_t) GroupNonUniformFMin 178 PartitionedReduceNV 507 508
-             510:    116(ptr) AccessChain 31(data) 505 115 35
-                              Store 510 509
+             500:     71(ptr) AccessChain 31(data) 33 63
+             501:   25(ivec4) Load 500
+             502:   78(ivec3) VectorShuffle 501 501 0 1 2
+             503:   17(ivec4) Load 19(ballot)
+             504:   78(ivec3) GroupNonUniformSMin 178 PartitionedReduceNV 502 503
+             505:     64(ptr) AccessChain 31(data) 499 63 35
+             506:     24(int) CompositeExtract 504 0
+                              Store 505 506
+             507:     64(ptr) AccessChain 31(data) 499 63 189
+             508:     24(int) CompositeExtract 504 1
+                              Store 507 508
+             509:     64(ptr) AccessChain 31(data) 499 63 202
+             510:     24(int) CompositeExtract 504 2
+                              Store 509 510
              511:      6(int) Load 8(invocation)
-             512:    123(ptr) AccessChain 31(data) 63 115
-             513: 27(f64vec4) Load 512
-             514:122(f64vec2) VectorShuffle 513 513 0 1
-             515:   17(ivec4) Load 19(ballot)
-             516:122(f64vec2) GroupNonUniformFMin 178 PartitionedReduceNV 514 515
-             517:    123(ptr) AccessChain 31(data) 511 115
-             518: 27(f64vec4) Load 517
-             519: 27(f64vec4) VectorShuffle 518 516 4 5 2 3
-                              Store 517 519
-             520:      6(int) Load 8(invocation)
-             521:    123(ptr) AccessChain 31(data) 33 115
-             522: 27(f64vec4) Load 521
-             523:130(f64vec3) VectorShuffle 522 522 0 1 2
-             524:   17(ivec4) Load 19(ballot)
-             525:130(f64vec3) GroupNonUniformFMin 178 PartitionedReduceNV 523 524
-             526:    123(ptr) AccessChain 31(data) 520 115
-             527: 27(f64vec4) Load 526
-             528: 27(f64vec4) VectorShuffle 527 525 4 5 6 3
-                              Store 526 528
-             529:      6(int) Load 8(invocation)
-             530:    123(ptr) AccessChain 31(data) 115 115
-             531: 27(f64vec4) Load 530
-             532:   17(ivec4) Load 19(ballot)
-             533: 27(f64vec4) GroupNonUniformFMin 178 PartitionedReduceNV 531 532
-             534:    123(ptr) AccessChain 31(data) 529 115
-                              Store 534 533
-             535:      6(int) Load 8(invocation)
-             536:     36(ptr) AccessChain 31(data) 34 34 35
-             537:   22(float) Load 536
-             538:   17(ivec4) Load 19(ballot)
-             539:   22(float) GroupNonUniformFMax 178 PartitionedReduceNV 537 538
-             540:     36(ptr) AccessChain 31(data) 535 34 35
-                              Store 540 539
-             541:      6(int) Load 8(invocation)
-             542:     44(ptr) AccessChain 31(data) 63 34
-             543:   23(fvec4) Load 542
-             544:   43(fvec2) VectorShuffle 543 543 0 1
-             545:   17(ivec4) Load 19(ballot)
-             546:   43(fvec2) GroupNonUniformFMax 178 PartitionedReduceNV 544 545
-             547:     44(ptr) AccessChain 31(data) 541 34
-             548:   23(fvec4) Load 547
-             549:   23(fvec4) VectorShuffle 548 546 4 5 2 3
-                              Store 547 549
-             550:      6(int) Load 8(invocation)
-             551:     44(ptr) AccessChain 31(data) 33 34
-             552:   23(fvec4) Load 551
-             553:   51(fvec3) VectorShuffle 552 552 0 1 2
+             512:     71(ptr) AccessChain 31(data) 115 63
+             513:   25(ivec4) Load 512
+             514:   17(ivec4) Load 19(ballot)
+             515:   25(ivec4) GroupNonUniformSMin 178 PartitionedReduceNV 513 514
+             516:     71(ptr) AccessChain 31(data) 511 63
+                              Store 516 515
+             517:      6(int) Load 8(invocation)
+             518:     90(ptr) AccessChain 31(data) 34 33 35
+             519:      6(int) Load 518
+             520:   17(ivec4) Load 19(ballot)
+             521:      6(int) GroupNonUniformUMin 178 PartitionedReduceNV 519 520
+             522:     90(ptr) AccessChain 31(data) 517 33 35
+                              Store 522 521
+             523:      6(int) Load 8(invocation)
+             524:     40(ptr) AccessChain 31(data) 63 33
+             525:   17(ivec4) Load 524
+             526:   96(ivec2) VectorShuffle 525 525 0 1
+             527:   17(ivec4) Load 19(ballot)
+             528:   96(ivec2) GroupNonUniformUMin 178 PartitionedReduceNV 526 527
+             529:     90(ptr) AccessChain 31(data) 523 33 35
+             530:      6(int) CompositeExtract 528 0
+                              Store 529 530
+             531:     90(ptr) AccessChain 31(data) 523 33 189
+             532:      6(int) CompositeExtract 528 1
+                              Store 531 532
+             533:      6(int) Load 8(invocation)
+             534:     40(ptr) AccessChain 31(data) 33 33
+             535:   17(ivec4) Load 534
+             536:  103(ivec3) VectorShuffle 535 535 0 1 2
+             537:   17(ivec4) Load 19(ballot)
+             538:  103(ivec3) GroupNonUniformUMin 178 PartitionedReduceNV 536 537
+             539:     90(ptr) AccessChain 31(data) 533 33 35
+             540:      6(int) CompositeExtract 538 0
+                              Store 539 540
+             541:     90(ptr) AccessChain 31(data) 533 33 189
+             542:      6(int) CompositeExtract 538 1
+                              Store 541 542
+             543:     90(ptr) AccessChain 31(data) 533 33 202
+             544:      6(int) CompositeExtract 538 2
+                              Store 543 544
+             545:      6(int) Load 8(invocation)
+             546:     40(ptr) AccessChain 31(data) 115 33
+             547:   17(ivec4) Load 546
+             548:   17(ivec4) Load 19(ballot)
+             549:   17(ivec4) GroupNonUniformUMin 178 PartitionedReduceNV 547 548
+             550:     40(ptr) AccessChain 31(data) 545 33
+                              Store 550 549
+             551:      6(int) Load 8(invocation)
+             552:    116(ptr) AccessChain 31(data) 34 115 35
+             553:26(float64_t) Load 552
              554:   17(ivec4) Load 19(ballot)
-             555:   51(fvec3) GroupNonUniformFMax 178 PartitionedReduceNV 553 554
-             556:     44(ptr) AccessChain 31(data) 550 34
-             557:   23(fvec4) Load 556
-             558:   23(fvec4) VectorShuffle 557 555 4 5 6 3
-                              Store 556 558
-             559:      6(int) Load 8(invocation)
-             560:     44(ptr) AccessChain 31(data) 115 34
-             561:   23(fvec4) Load 560
-             562:   17(ivec4) Load 19(ballot)
-             563:   23(fvec4) GroupNonUniformFMax 178 PartitionedReduceNV 561 562
-             564:     44(ptr) AccessChain 31(data) 559 34
-                              Store 564 563
-             565:      6(int) Load 8(invocation)
-             566:     64(ptr) AccessChain 31(data) 34 63 35
-             567:     24(int) Load 566
-             568:   17(ivec4) Load 19(ballot)
-             569:     24(int) GroupNonUniformSMax 178 PartitionedReduceNV 567 568
-             570:     64(ptr) AccessChain 31(data) 565 63 35
-                              Store 570 569
-             571:      6(int) Load 8(invocation)
-             572:     71(ptr) AccessChain 31(data) 63 63
-             573:   25(ivec4) Load 572
-             574:   70(ivec2) VectorShuffle 573 573 0 1
-             575:   17(ivec4) Load 19(ballot)
-             576:   70(ivec2) GroupNonUniformSMax 178 PartitionedReduceNV 574 575
-             577:     71(ptr) AccessChain 31(data) 571 63
-             578:   25(ivec4) Load 577
-             579:   25(ivec4) VectorShuffle 578 576 4 5 2 3
-                              Store 577 579
-             580:      6(int) Load 8(invocation)
-             581:     71(ptr) AccessChain 31(data) 33 63
-             582:   25(ivec4) Load 581
-             583:   78(ivec3) VectorShuffle 582 582 0 1 2
-             584:   17(ivec4) Load 19(ballot)
-             585:   78(ivec3) GroupNonUniformSMax 178 PartitionedReduceNV 583 584
-             586:     71(ptr) AccessChain 31(data) 580 63
-             587:   25(ivec4) Load 586
-             588:   25(ivec4) VectorShuffle 587 585 4 5 6 3
-                              Store 586 588
-             589:      6(int) Load 8(invocation)
-             590:     71(ptr) AccessChain 31(data) 115 63
-             591:   25(ivec4) Load 590
-             592:   17(ivec4) Load 19(ballot)
-             593:   25(ivec4) GroupNonUniformSMax 178 PartitionedReduceNV 591 592
-             594:     71(ptr) AccessChain 31(data) 589 63
-                              Store 594 593
-             595:      6(int) Load 8(invocation)
-             596:     90(ptr) AccessChain 31(data) 34 33 35
-             597:      6(int) Load 596
-             598:   17(ivec4) Load 19(ballot)
-             599:      6(int) GroupNonUniformUMax 178 PartitionedReduceNV 597 598
-             600:     90(ptr) AccessChain 31(data) 595 33 35
-                              Store 600 599
+             555:26(float64_t) GroupNonUniformFMin 178 PartitionedReduceNV 553 554
+             556:    116(ptr) AccessChain 31(data) 551 115 35
+                              Store 556 555
+             557:      6(int) Load 8(invocation)
+             558:    123(ptr) AccessChain 31(data) 63 115
+             559: 27(f64vec4) Load 558
+             560:122(f64vec2) VectorShuffle 559 559 0 1
+             561:   17(ivec4) Load 19(ballot)
+             562:122(f64vec2) GroupNonUniformFMin 178 PartitionedReduceNV 560 561
+             563:    116(ptr) AccessChain 31(data) 557 115 35
+             564:26(float64_t) CompositeExtract 562 0
+                              Store 563 564
+             565:    116(ptr) AccessChain 31(data) 557 115 189
+             566:26(float64_t) CompositeExtract 562 1
+                              Store 565 566
+             567:      6(int) Load 8(invocation)
+             568:    123(ptr) AccessChain 31(data) 33 115
+             569: 27(f64vec4) Load 568
+             570:130(f64vec3) VectorShuffle 569 569 0 1 2
+             571:   17(ivec4) Load 19(ballot)
+             572:130(f64vec3) GroupNonUniformFMin 178 PartitionedReduceNV 570 571
+             573:    116(ptr) AccessChain 31(data) 567 115 35
+             574:26(float64_t) CompositeExtract 572 0
+                              Store 573 574
+             575:    116(ptr) AccessChain 31(data) 567 115 189
+             576:26(float64_t) CompositeExtract 572 1
+                              Store 575 576
+             577:    116(ptr) AccessChain 31(data) 567 115 202
+             578:26(float64_t) CompositeExtract 572 2
+                              Store 577 578
+             579:      6(int) Load 8(invocation)
+             580:    123(ptr) AccessChain 31(data) 115 115
+             581: 27(f64vec4) Load 580
+             582:   17(ivec4) Load 19(ballot)
+             583: 27(f64vec4) GroupNonUniformFMin 178 PartitionedReduceNV 581 582
+             584:    123(ptr) AccessChain 31(data) 579 115
+                              Store 584 583
+             585:      6(int) Load 8(invocation)
+             586:     36(ptr) AccessChain 31(data) 34 34 35
+             587:   22(float) Load 586
+             588:   17(ivec4) Load 19(ballot)
+             589:   22(float) GroupNonUniformFMax 178 PartitionedReduceNV 587 588
+             590:     36(ptr) AccessChain 31(data) 585 34 35
+                              Store 590 589
+             591:      6(int) Load 8(invocation)
+             592:     44(ptr) AccessChain 31(data) 63 34
+             593:   23(fvec4) Load 592
+             594:   43(fvec2) VectorShuffle 593 593 0 1
+             595:   17(ivec4) Load 19(ballot)
+             596:   43(fvec2) GroupNonUniformFMax 178 PartitionedReduceNV 594 595
+             597:     36(ptr) AccessChain 31(data) 591 34 35
+             598:   22(float) CompositeExtract 596 0
+                              Store 597 598
+             599:     36(ptr) AccessChain 31(data) 591 34 189
+             600:   22(float) CompositeExtract 596 1
+                              Store 599 600
              601:      6(int) Load 8(invocation)
-             602:     40(ptr) AccessChain 31(data) 63 33
-             603:   17(ivec4) Load 602
-             604:   96(ivec2) VectorShuffle 603 603 0 1
+             602:     44(ptr) AccessChain 31(data) 33 34
+             603:   23(fvec4) Load 602
+             604:   51(fvec3) VectorShuffle 603 603 0 1 2
              605:   17(ivec4) Load 19(ballot)
-             606:   96(ivec2) GroupNonUniformUMax 178 PartitionedReduceNV 604 605
-             607:     40(ptr) AccessChain 31(data) 601 33
-             608:   17(ivec4) Load 607
-             609:   17(ivec4) VectorShuffle 608 606 4 5 2 3
-                              Store 607 609
-             610:      6(int) Load 8(invocation)
-             611:     40(ptr) AccessChain 31(data) 33 33
-             612:   17(ivec4) Load 611
-             613:  103(ivec3) VectorShuffle 612 612 0 1 2
-             614:   17(ivec4) Load 19(ballot)
-             615:  103(ivec3) GroupNonUniformUMax 178 PartitionedReduceNV 613 614
-             616:     40(ptr) AccessChain 31(data) 610 33
-             617:   17(ivec4) Load 616
-             618:   17(ivec4) VectorShuffle 617 615 4 5 6 3
-                              Store 616 618
+             606:   51(fvec3) GroupNonUniformFMax 178 PartitionedReduceNV 604 605
+             607:     36(ptr) AccessChain 31(data) 601 34 35
+             608:   22(float) CompositeExtract 606 0
+                              Store 607 608
+             609:     36(ptr) AccessChain 31(data) 601 34 189
+             610:   22(float) CompositeExtract 606 1
+                              Store 609 610
+             611:     36(ptr) AccessChain 31(data) 601 34 202
+             612:   22(float) CompositeExtract 606 2
+                              Store 611 612
+             613:      6(int) Load 8(invocation)
+             614:     44(ptr) AccessChain 31(data) 115 34
+             615:   23(fvec4) Load 614
+             616:   17(ivec4) Load 19(ballot)
+             617:   23(fvec4) GroupNonUniformFMax 178 PartitionedReduceNV 615 616
+             618:     44(ptr) AccessChain 31(data) 613 34
+                              Store 618 617
              619:      6(int) Load 8(invocation)
-             620:     40(ptr) AccessChain 31(data) 115 33
-             621:   17(ivec4) Load 620
+             620:     64(ptr) AccessChain 31(data) 34 63 35
+             621:     24(int) Load 620
              622:   17(ivec4) Load 19(ballot)
-             623:   17(ivec4) GroupNonUniformUMax 178 PartitionedReduceNV 621 622
-             624:     40(ptr) AccessChain 31(data) 619 33
+             623:     24(int) GroupNonUniformSMax 178 PartitionedReduceNV 621 622
+             624:     64(ptr) AccessChain 31(data) 619 63 35
                               Store 624 623
              625:      6(int) Load 8(invocation)
-             626:    116(ptr) AccessChain 31(data) 34 115 35
-             627:26(float64_t) Load 626
-             628:   17(ivec4) Load 19(ballot)
-             629:26(float64_t) GroupNonUniformFMax 178 PartitionedReduceNV 627 628
-             630:    116(ptr) AccessChain 31(data) 625 115 35
-                              Store 630 629
-             631:      6(int) Load 8(invocation)
-             632:    123(ptr) AccessChain 31(data) 63 115
-             633: 27(f64vec4) Load 632
-             634:122(f64vec2) VectorShuffle 633 633 0 1
-             635:   17(ivec4) Load 19(ballot)
-             636:122(f64vec2) GroupNonUniformFMax 178 PartitionedReduceNV 634 635
-             637:    123(ptr) AccessChain 31(data) 631 115
-             638: 27(f64vec4) Load 637
-             639: 27(f64vec4) VectorShuffle 638 636 4 5 2 3
-                              Store 637 639
-             640:      6(int) Load 8(invocation)
-             641:    123(ptr) AccessChain 31(data) 33 115
-             642: 27(f64vec4) Load 641
-             643:130(f64vec3) VectorShuffle 642 642 0 1 2
-             644:   17(ivec4) Load 19(ballot)
-             645:130(f64vec3) GroupNonUniformFMax 178 PartitionedReduceNV 643 644
-             646:    123(ptr) AccessChain 31(data) 640 115
-             647: 27(f64vec4) Load 646
-             648: 27(f64vec4) VectorShuffle 647 645 4 5 6 3
-                              Store 646 648
-             649:      6(int) Load 8(invocation)
-             650:    123(ptr) AccessChain 31(data) 115 115
-             651: 27(f64vec4) Load 650
-             652:   17(ivec4) Load 19(ballot)
-             653: 27(f64vec4) GroupNonUniformFMax 178 PartitionedReduceNV 651 652
-             654:    123(ptr) AccessChain 31(data) 649 115
-                              Store 654 653
-             655:      6(int) Load 8(invocation)
-             656:     64(ptr) AccessChain 31(data) 34 63 35
-             657:     24(int) Load 656
-             658:   17(ivec4) Load 19(ballot)
-             659:     24(int) GroupNonUniformBitwiseAnd 178 PartitionedReduceNV 657 658
-             660:     64(ptr) AccessChain 31(data) 655 63 35
-                              Store 660 659
-             661:      6(int) Load 8(invocation)
-             662:     71(ptr) AccessChain 31(data) 63 63
-             663:   25(ivec4) Load 662
-             664:   70(ivec2) VectorShuffle 663 663 0 1
-             665:   17(ivec4) Load 19(ballot)
-             666:   70(ivec2) GroupNonUniformBitwiseAnd 178 PartitionedReduceNV 664 665
-             667:     71(ptr) AccessChain 31(data) 661 63
-             668:   25(ivec4) Load 667
-             669:   25(ivec4) VectorShuffle 668 666 4 5 2 3
-                              Store 667 669
-             670:      6(int) Load 8(invocation)
-             671:     71(ptr) AccessChain 31(data) 33 63
-             672:   25(ivec4) Load 671
-             673:   78(ivec3) VectorShuffle 672 672 0 1 2
-             674:   17(ivec4) Load 19(ballot)
-             675:   78(ivec3) GroupNonUniformBitwiseAnd 178 PartitionedReduceNV 673 674
-             676:     71(ptr) AccessChain 31(data) 670 63
-             677:   25(ivec4) Load 676
-             678:   25(ivec4) VectorShuffle 677 675 4 5 6 3
-                              Store 676 678
-             679:      6(int) Load 8(invocation)
-             680:     71(ptr) AccessChain 31(data) 115 63
-             681:   25(ivec4) Load 680
-             682:   17(ivec4) Load 19(ballot)
-             683:   25(ivec4) GroupNonUniformBitwiseAnd 178 PartitionedReduceNV 681 682
-             684:     71(ptr) AccessChain 31(data) 679 63
-                              Store 684 683
-             685:      6(int) Load 8(invocation)
-             686:     90(ptr) AccessChain 31(data) 34 33 35
-             687:      6(int) Load 686
-             688:   17(ivec4) Load 19(ballot)
-             689:      6(int) GroupNonUniformBitwiseAnd 178 PartitionedReduceNV 687 688
-             690:     90(ptr) AccessChain 31(data) 685 33 35
-                              Store 690 689
-             691:      6(int) Load 8(invocation)
-             692:     40(ptr) AccessChain 31(data) 63 33
-             693:   17(ivec4) Load 692
-             694:   96(ivec2) VectorShuffle 693 693 0 1
-             695:   17(ivec4) Load 19(ballot)
-             696:   96(ivec2) GroupNonUniformBitwiseAnd 178 PartitionedReduceNV 694 695
-             697:     40(ptr) AccessChain 31(data) 691 33
-             698:   17(ivec4) Load 697
-             699:   17(ivec4) VectorShuffle 698 696 4 5 2 3
-                              Store 697 699
-             700:      6(int) Load 8(invocation)
-             701:     40(ptr) AccessChain 31(data) 33 33
-             702:   17(ivec4) Load 701
-             703:  103(ivec3) VectorShuffle 702 702 0 1 2
-             704:   17(ivec4) Load 19(ballot)
-             705:  103(ivec3) GroupNonUniformBitwiseAnd 178 PartitionedReduceNV 703 704
-             706:     40(ptr) AccessChain 31(data) 700 33
-             707:   17(ivec4) Load 706
-             708:   17(ivec4) VectorShuffle 707 705 4 5 6 3
-                              Store 706 708
-             709:      6(int) Load 8(invocation)
-             710:     40(ptr) AccessChain 31(data) 115 33
-             711:   17(ivec4) Load 710
-             712:   17(ivec4) Load 19(ballot)
-             713:   17(ivec4) GroupNonUniformBitwiseAnd 178 PartitionedReduceNV 711 712
-             714:     40(ptr) AccessChain 31(data) 709 33
-                              Store 714 713
+             626:     71(ptr) AccessChain 31(data) 63 63
+             627:   25(ivec4) Load 626
+             628:   70(ivec2) VectorShuffle 627 627 0 1
+             629:   17(ivec4) Load 19(ballot)
+             630:   70(ivec2) GroupNonUniformSMax 178 PartitionedReduceNV 628 629
+             631:     64(ptr) AccessChain 31(data) 625 63 35
+             632:     24(int) CompositeExtract 630 0
+                              Store 631 632
+             633:     64(ptr) AccessChain 31(data) 625 63 189
+             634:     24(int) CompositeExtract 630 1
+                              Store 633 634
+             635:      6(int) Load 8(invocation)
+             636:     71(ptr) AccessChain 31(data) 33 63
+             637:   25(ivec4) Load 636
+             638:   78(ivec3) VectorShuffle 637 637 0 1 2
+             639:   17(ivec4) Load 19(ballot)
+             640:   78(ivec3) GroupNonUniformSMax 178 PartitionedReduceNV 638 639
+             641:     64(ptr) AccessChain 31(data) 635 63 35
+             642:     24(int) CompositeExtract 640 0
+                              Store 641 642
+             643:     64(ptr) AccessChain 31(data) 635 63 189
+             644:     24(int) CompositeExtract 640 1
+                              Store 643 644
+             645:     64(ptr) AccessChain 31(data) 635 63 202
+             646:     24(int) CompositeExtract 640 2
+                              Store 645 646
+             647:      6(int) Load 8(invocation)
+             648:     71(ptr) AccessChain 31(data) 115 63
+             649:   25(ivec4) Load 648
+             650:   17(ivec4) Load 19(ballot)
+             651:   25(ivec4) GroupNonUniformSMax 178 PartitionedReduceNV 649 650
+             652:     71(ptr) AccessChain 31(data) 647 63
+                              Store 652 651
+             653:      6(int) Load 8(invocation)
+             654:     90(ptr) AccessChain 31(data) 34 33 35
+             655:      6(int) Load 654
+             656:   17(ivec4) Load 19(ballot)
+             657:      6(int) GroupNonUniformUMax 178 PartitionedReduceNV 655 656
+             658:     90(ptr) AccessChain 31(data) 653 33 35
+                              Store 658 657
+             659:      6(int) Load 8(invocation)
+             660:     40(ptr) AccessChain 31(data) 63 33
+             661:   17(ivec4) Load 660
+             662:   96(ivec2) VectorShuffle 661 661 0 1
+             663:   17(ivec4) Load 19(ballot)
+             664:   96(ivec2) GroupNonUniformUMax 178 PartitionedReduceNV 662 663
+             665:     90(ptr) AccessChain 31(data) 659 33 35
+             666:      6(int) CompositeExtract 664 0
+                              Store 665 666
+             667:     90(ptr) AccessChain 31(data) 659 33 189
+             668:      6(int) CompositeExtract 664 1
+                              Store 667 668
+             669:      6(int) Load 8(invocation)
+             670:     40(ptr) AccessChain 31(data) 33 33
+             671:   17(ivec4) Load 670
+             672:  103(ivec3) VectorShuffle 671 671 0 1 2
+             673:   17(ivec4) Load 19(ballot)
+             674:  103(ivec3) GroupNonUniformUMax 178 PartitionedReduceNV 672 673
+             675:     90(ptr) AccessChain 31(data) 669 33 35
+             676:      6(int) CompositeExtract 674 0
+                              Store 675 676
+             677:     90(ptr) AccessChain 31(data) 669 33 189
+             678:      6(int) CompositeExtract 674 1
+                              Store 677 678
+             679:     90(ptr) AccessChain 31(data) 669 33 202
+             680:      6(int) CompositeExtract 674 2
+                              Store 679 680
+             681:      6(int) Load 8(invocation)
+             682:     40(ptr) AccessChain 31(data) 115 33
+             683:   17(ivec4) Load 682
+             684:   17(ivec4) Load 19(ballot)
+             685:   17(ivec4) GroupNonUniformUMax 178 PartitionedReduceNV 683 684
+             686:     40(ptr) AccessChain 31(data) 681 33
+                              Store 686 685
+             687:      6(int) Load 8(invocation)
+             688:    116(ptr) AccessChain 31(data) 34 115 35
+             689:26(float64_t) Load 688
+             690:   17(ivec4) Load 19(ballot)
+             691:26(float64_t) GroupNonUniformFMax 178 PartitionedReduceNV 689 690
+             692:    116(ptr) AccessChain 31(data) 687 115 35
+                              Store 692 691
+             693:      6(int) Load 8(invocation)
+             694:    123(ptr) AccessChain 31(data) 63 115
+             695: 27(f64vec4) Load 694
+             696:122(f64vec2) VectorShuffle 695 695 0 1
+             697:   17(ivec4) Load 19(ballot)
+             698:122(f64vec2) GroupNonUniformFMax 178 PartitionedReduceNV 696 697
+             699:    116(ptr) AccessChain 31(data) 693 115 35
+             700:26(float64_t) CompositeExtract 698 0
+                              Store 699 700
+             701:    116(ptr) AccessChain 31(data) 693 115 189
+             702:26(float64_t) CompositeExtract 698 1
+                              Store 701 702
+             703:      6(int) Load 8(invocation)
+             704:    123(ptr) AccessChain 31(data) 33 115
+             705: 27(f64vec4) Load 704
+             706:130(f64vec3) VectorShuffle 705 705 0 1 2
+             707:   17(ivec4) Load 19(ballot)
+             708:130(f64vec3) GroupNonUniformFMax 178 PartitionedReduceNV 706 707
+             709:    116(ptr) AccessChain 31(data) 703 115 35
+             710:26(float64_t) CompositeExtract 708 0
+                              Store 709 710
+             711:    116(ptr) AccessChain 31(data) 703 115 189
+             712:26(float64_t) CompositeExtract 708 1
+                              Store 711 712
+             713:    116(ptr) AccessChain 31(data) 703 115 202
+             714:26(float64_t) CompositeExtract 708 2
+                              Store 713 714
              715:      6(int) Load 8(invocation)
-             716:     64(ptr) AccessChain 31(data) 34 63 35
-             717:     24(int) Load 716
-             718:   144(bool) SLessThan 717 34
-             719:   17(ivec4) Load 19(ballot)
-             720:   144(bool) GroupNonUniformLogicalAnd 178 PartitionedReduceNV 718 719
-             721:     24(int) Select 720 63 34
-             722:     64(ptr) AccessChain 31(data) 715 63 35
-                              Store 722 721
-             723:      6(int) Load 8(invocation)
-             724:     71(ptr) AccessChain 31(data) 63 63
-             725:   25(ivec4) Load 724
-             726:   70(ivec2) VectorShuffle 725 725 0 1
-             728:  152(bvec2) SLessThan 726 727
-             729:   17(ivec4) Load 19(ballot)
-             730:  152(bvec2) GroupNonUniformLogicalAnd 178 PartitionedReduceNV 728 729
-             732:   70(ivec2) Select 730 731 727
-             733:     71(ptr) AccessChain 31(data) 723 63
-             734:   25(ivec4) Load 733
-             735:   25(ivec4) VectorShuffle 734 732 4 5 2 3
-                              Store 733 735
-             736:      6(int) Load 8(invocation)
-             737:     71(ptr) AccessChain 31(data) 63 63
-             738:   25(ivec4) Load 737
-             739:   78(ivec3) VectorShuffle 738 738 0 1 2
-             741:  161(bvec3) SLessThan 739 740
-             742:   17(ivec4) Load 19(ballot)
-             743:  161(bvec3) GroupNonUniformLogicalAnd 178 PartitionedReduceNV 741 742
-             745:   78(ivec3) Select 743 744 740
-             746:     71(ptr) AccessChain 31(data) 736 63
-             747:   25(ivec4) Load 746
-             748:   25(ivec4) VectorShuffle 747 745 4 5 6 3
-                              Store 746 748
+             716:    123(ptr) AccessChain 31(data) 115 115
+             717: 27(f64vec4) Load 716
+             718:   17(ivec4) Load 19(ballot)
+             719: 27(f64vec4) GroupNonUniformFMax 178 PartitionedReduceNV 717 718
+             720:    123(ptr) AccessChain 31(data) 715 115
+                              Store 720 719
+             721:      6(int) Load 8(invocation)
+             722:     64(ptr) AccessChain 31(data) 34 63 35
+             723:     24(int) Load 722
+             724:   17(ivec4) Load 19(ballot)
+             725:     24(int) GroupNonUniformBitwiseAnd 178 PartitionedReduceNV 723 724
+             726:     64(ptr) AccessChain 31(data) 721 63 35
+                              Store 726 725
+             727:      6(int) Load 8(invocation)
+             728:     71(ptr) AccessChain 31(data) 63 63
+             729:   25(ivec4) Load 728
+             730:   70(ivec2) VectorShuffle 729 729 0 1
+             731:   17(ivec4) Load 19(ballot)
+             732:   70(ivec2) GroupNonUniformBitwiseAnd 178 PartitionedReduceNV 730 731
+             733:     64(ptr) AccessChain 31(data) 727 63 35
+             734:     24(int) CompositeExtract 732 0
+                              Store 733 734
+             735:     64(ptr) AccessChain 31(data) 727 63 189
+             736:     24(int) CompositeExtract 732 1
+                              Store 735 736
+             737:      6(int) Load 8(invocation)
+             738:     71(ptr) AccessChain 31(data) 33 63
+             739:   25(ivec4) Load 738
+             740:   78(ivec3) VectorShuffle 739 739 0 1 2
+             741:   17(ivec4) Load 19(ballot)
+             742:   78(ivec3) GroupNonUniformBitwiseAnd 178 PartitionedReduceNV 740 741
+             743:     64(ptr) AccessChain 31(data) 737 63 35
+             744:     24(int) CompositeExtract 742 0
+                              Store 743 744
+             745:     64(ptr) AccessChain 31(data) 737 63 189
+             746:     24(int) CompositeExtract 742 1
+                              Store 745 746
+             747:     64(ptr) AccessChain 31(data) 737 63 202
+             748:     24(int) CompositeExtract 742 2
+                              Store 747 748
              749:      6(int) Load 8(invocation)
-             750:     71(ptr) AccessChain 31(data) 63 63
+             750:     71(ptr) AccessChain 31(data) 115 63
              751:   25(ivec4) Load 750
-             753:  169(bvec4) SLessThan 751 752
-             754:   17(ivec4) Load 19(ballot)
-             755:  169(bvec4) GroupNonUniformLogicalAnd 178 PartitionedReduceNV 753 754
-             757:   25(ivec4) Select 755 756 752
-             758:     71(ptr) AccessChain 31(data) 749 63
-                              Store 758 757
-             759:      6(int) Load 8(invocation)
-             760:     64(ptr) AccessChain 31(data) 34 63 35
-             761:     24(int) Load 760
-             762:   17(ivec4) Load 19(ballot)
-             763:     24(int) GroupNonUniformBitwiseOr 178 PartitionedReduceNV 761 762
-             764:     64(ptr) AccessChain 31(data) 759 63 35
-                              Store 764 763
-             765:      6(int) Load 8(invocation)
-             766:     71(ptr) AccessChain 31(data) 63 63
-             767:   25(ivec4) Load 766
-             768:   70(ivec2) VectorShuffle 767 767 0 1
-             769:   17(ivec4) Load 19(ballot)
-             770:   70(ivec2) GroupNonUniformBitwiseOr 178 PartitionedReduceNV 768 769
-             771:     71(ptr) AccessChain 31(data) 765 63
-             772:   25(ivec4) Load 771
-             773:   25(ivec4) VectorShuffle 772 770 4 5 2 3
-                              Store 771 773
-             774:      6(int) Load 8(invocation)
-             775:     71(ptr) AccessChain 31(data) 33 63
-             776:   25(ivec4) Load 775
-             777:   78(ivec3) VectorShuffle 776 776 0 1 2
-             778:   17(ivec4) Load 19(ballot)
-             779:   78(ivec3) GroupNonUniformBitwiseOr 178 PartitionedReduceNV 777 778
-             780:     71(ptr) AccessChain 31(data) 774 63
-             781:   25(ivec4) Load 780
-             782:   25(ivec4) VectorShuffle 781 779 4 5 6 3
-                              Store 780 782
+             752:   17(ivec4) Load 19(ballot)
+             753:   25(ivec4) GroupNonUniformBitwiseAnd 178 PartitionedReduceNV 751 752
+             754:     71(ptr) AccessChain 31(data) 749 63
+                              Store 754 753
+             755:      6(int) Load 8(invocation)
+             756:     90(ptr) AccessChain 31(data) 34 33 35
+             757:      6(int) Load 756
+             758:   17(ivec4) Load 19(ballot)
+             759:      6(int) GroupNonUniformBitwiseAnd 178 PartitionedReduceNV 757 758
+             760:     90(ptr) AccessChain 31(data) 755 33 35
+                              Store 760 759
+             761:      6(int) Load 8(invocation)
+             762:     40(ptr) AccessChain 31(data) 63 33
+             763:   17(ivec4) Load 762
+             764:   96(ivec2) VectorShuffle 763 763 0 1
+             765:   17(ivec4) Load 19(ballot)
+             766:   96(ivec2) GroupNonUniformBitwiseAnd 178 PartitionedReduceNV 764 765
+             767:     90(ptr) AccessChain 31(data) 761 33 35
+             768:      6(int) CompositeExtract 766 0
+                              Store 767 768
+             769:     90(ptr) AccessChain 31(data) 761 33 189
+             770:      6(int) CompositeExtract 766 1
+                              Store 769 770
+             771:      6(int) Load 8(invocation)
+             772:     40(ptr) AccessChain 31(data) 33 33
+             773:   17(ivec4) Load 772
+             774:  103(ivec3) VectorShuffle 773 773 0 1 2
+             775:   17(ivec4) Load 19(ballot)
+             776:  103(ivec3) GroupNonUniformBitwiseAnd 178 PartitionedReduceNV 774 775
+             777:     90(ptr) AccessChain 31(data) 771 33 35
+             778:      6(int) CompositeExtract 776 0
+                              Store 777 778
+             779:     90(ptr) AccessChain 31(data) 771 33 189
+             780:      6(int) CompositeExtract 776 1
+                              Store 779 780
+             781:     90(ptr) AccessChain 31(data) 771 33 202
+             782:      6(int) CompositeExtract 776 2
+                              Store 781 782
              783:      6(int) Load 8(invocation)
-             784:     71(ptr) AccessChain 31(data) 115 63
-             785:   25(ivec4) Load 784
+             784:     40(ptr) AccessChain 31(data) 115 33
+             785:   17(ivec4) Load 784
              786:   17(ivec4) Load 19(ballot)
-             787:   25(ivec4) GroupNonUniformBitwiseOr 178 PartitionedReduceNV 785 786
-             788:     71(ptr) AccessChain 31(data) 783 63
+             787:   17(ivec4) GroupNonUniformBitwiseAnd 178 PartitionedReduceNV 785 786
+             788:     40(ptr) AccessChain 31(data) 783 33
                               Store 788 787
              789:      6(int) Load 8(invocation)
-             790:     90(ptr) AccessChain 31(data) 34 33 35
-             791:      6(int) Load 790
-             792:   17(ivec4) Load 19(ballot)
-             793:      6(int) GroupNonUniformBitwiseOr 178 PartitionedReduceNV 791 792
-             794:     90(ptr) AccessChain 31(data) 789 33 35
-                              Store 794 793
-             795:      6(int) Load 8(invocation)
-             796:     40(ptr) AccessChain 31(data) 63 33
-             797:   17(ivec4) Load 796
-             798:   96(ivec2) VectorShuffle 797 797 0 1
-             799:   17(ivec4) Load 19(ballot)
-             800:   96(ivec2) GroupNonUniformBitwiseOr 178 PartitionedReduceNV 798 799
-             801:     40(ptr) AccessChain 31(data) 795 33
-             802:   17(ivec4) Load 801
-             803:   17(ivec4) VectorShuffle 802 800 4 5 2 3
-                              Store 801 803
-             804:      6(int) Load 8(invocation)
-             805:     40(ptr) AccessChain 31(data) 33 33
-             806:   17(ivec4) Load 805
-             807:  103(ivec3) VectorShuffle 806 806 0 1 2
-             808:   17(ivec4) Load 19(ballot)
-             809:  103(ivec3) GroupNonUniformBitwiseOr 178 PartitionedReduceNV 807 808
-             810:     40(ptr) AccessChain 31(data) 804 33
-             811:   17(ivec4) Load 810
-             812:   17(ivec4) VectorShuffle 811 809 4 5 6 3
-                              Store 810 812
-             813:      6(int) Load 8(invocation)
-             814:     40(ptr) AccessChain 31(data) 115 33
-             815:   17(ivec4) Load 814
-             816:   17(ivec4) Load 19(ballot)
-             817:   17(ivec4) GroupNonUniformBitwiseOr 178 PartitionedReduceNV 815 816
-             818:     40(ptr) AccessChain 31(data) 813 33
-                              Store 818 817
-             819:      6(int) Load 8(invocation)
-             820:     64(ptr) AccessChain 31(data) 34 63 35
-             821:     24(int) Load 820
-             822:   144(bool) SLessThan 821 34
-             823:   17(ivec4) Load 19(ballot)
-             824:   144(bool) GroupNonUniformLogicalOr 178 PartitionedReduceNV 822 823
-             825:     24(int) Select 824 63 34
-             826:     64(ptr) AccessChain 31(data) 819 63 35
-                              Store 826 825
+             790:     64(ptr) AccessChain 31(data) 34 63 35
+             791:     24(int) Load 790
+             792:   144(bool) SLessThan 791 34
+             793:   17(ivec4) Load 19(ballot)
+             794:   144(bool) GroupNonUniformLogicalAnd 178 PartitionedReduceNV 792 793
+             795:     24(int) Select 794 63 34
+             796:     64(ptr) AccessChain 31(data) 789 63 35
+                              Store 796 795
+             797:      6(int) Load 8(invocation)
+             798:     71(ptr) AccessChain 31(data) 63 63
+             799:   25(ivec4) Load 798
+             800:   70(ivec2) VectorShuffle 799 799 0 1
+             802:  152(bvec2) SLessThan 800 801
+             803:   17(ivec4) Load 19(ballot)
+             804:  152(bvec2) GroupNonUniformLogicalAnd 178 PartitionedReduceNV 802 803
+             806:   70(ivec2) Select 804 805 801
+             807:     64(ptr) AccessChain 31(data) 797 63 35
+             808:     24(int) CompositeExtract 806 0
+                              Store 807 808
+             809:     64(ptr) AccessChain 31(data) 797 63 189
+             810:     24(int) CompositeExtract 806 1
+                              Store 809 810
+             811:      6(int) Load 8(invocation)
+             812:     71(ptr) AccessChain 31(data) 63 63
+             813:   25(ivec4) Load 812
+             814:   78(ivec3) VectorShuffle 813 813 0 1 2
+             816:  161(bvec3) SLessThan 814 815
+             817:   17(ivec4) Load 19(ballot)
+             818:  161(bvec3) GroupNonUniformLogicalAnd 178 PartitionedReduceNV 816 817
+             820:   78(ivec3) Select 818 819 815
+             821:     64(ptr) AccessChain 31(data) 811 63 35
+             822:     24(int) CompositeExtract 820 0
+                              Store 821 822
+             823:     64(ptr) AccessChain 31(data) 811 63 189
+             824:     24(int) CompositeExtract 820 1
+                              Store 823 824
+             825:     64(ptr) AccessChain 31(data) 811 63 202
+             826:     24(int) CompositeExtract 820 2
+                              Store 825 826
              827:      6(int) Load 8(invocation)
              828:     71(ptr) AccessChain 31(data) 63 63
              829:   25(ivec4) Load 828
-             830:   70(ivec2) VectorShuffle 829 829 0 1
-             831:  152(bvec2) SLessThan 830 727
+             831:  169(bvec4) SLessThan 829 830
              832:   17(ivec4) Load 19(ballot)
-             833:  152(bvec2) GroupNonUniformLogicalOr 178 PartitionedReduceNV 831 832
-             834:   70(ivec2) Select 833 731 727
-             835:     71(ptr) AccessChain 31(data) 827 63
-             836:   25(ivec4) Load 835
-             837:   25(ivec4) VectorShuffle 836 834 4 5 2 3
-                              Store 835 837
-             838:      6(int) Load 8(invocation)
-             839:     71(ptr) AccessChain 31(data) 63 63
-             840:   25(ivec4) Load 839
-             841:   78(ivec3) VectorShuffle 840 840 0 1 2
-             842:  161(bvec3) SLessThan 841 740
-             843:   17(ivec4) Load 19(ballot)
-             844:  161(bvec3) GroupNonUniformLogicalOr 178 PartitionedReduceNV 842 843
-             845:   78(ivec3) Select 844 744 740
-             846:     71(ptr) AccessChain 31(data) 838 63
-             847:   25(ivec4) Load 846
-             848:   25(ivec4) VectorShuffle 847 845 4 5 6 3
-                              Store 846 848
-             849:      6(int) Load 8(invocation)
-             850:     71(ptr) AccessChain 31(data) 63 63
-             851:   25(ivec4) Load 850
-             852:  169(bvec4) SLessThan 851 752
-             853:   17(ivec4) Load 19(ballot)
-             854:  169(bvec4) GroupNonUniformLogicalOr 178 PartitionedReduceNV 852 853
-             855:   25(ivec4) Select 854 756 752
-             856:     71(ptr) AccessChain 31(data) 849 63
-                              Store 856 855
-             857:      6(int) Load 8(invocation)
-             858:     64(ptr) AccessChain 31(data) 34 63 35
-             859:     24(int) Load 858
-             860:   17(ivec4) Load 19(ballot)
-             861:     24(int) GroupNonUniformBitwiseXor 178 PartitionedReduceNV 859 860
-             862:     64(ptr) AccessChain 31(data) 857 63 35
-                              Store 862 861
-             863:      6(int) Load 8(invocation)
-             864:     71(ptr) AccessChain 31(data) 63 63
-             865:   25(ivec4) Load 864
-             866:   70(ivec2) VectorShuffle 865 865 0 1
-             867:   17(ivec4) Load 19(ballot)
-             868:   70(ivec2) GroupNonUniformBitwiseXor 178 PartitionedReduceNV 866 867
-             869:     71(ptr) AccessChain 31(data) 863 63
-             870:   25(ivec4) Load 869
-             871:   25(ivec4) VectorShuffle 870 868 4 5 2 3
-                              Store 869 871
-             872:      6(int) Load 8(invocation)
-             873:     71(ptr) AccessChain 31(data) 33 63
-             874:   25(ivec4) Load 873
-             875:   78(ivec3) VectorShuffle 874 874 0 1 2
-             876:   17(ivec4) Load 19(ballot)
-             877:   78(ivec3) GroupNonUniformBitwiseXor 178 PartitionedReduceNV 875 876
-             878:     71(ptr) AccessChain 31(data) 872 63
-             879:   25(ivec4) Load 878
-             880:   25(ivec4) VectorShuffle 879 877 4 5 6 3
-                              Store 878 880
-             881:      6(int) Load 8(invocation)
-             882:     71(ptr) AccessChain 31(data) 115 63
-             883:   25(ivec4) Load 882
-             884:   17(ivec4) Load 19(ballot)
-             885:   25(ivec4) GroupNonUniformBitwiseXor 178 PartitionedReduceNV 883 884
-             886:     71(ptr) AccessChain 31(data) 881 63
-                              Store 886 885
+             833:  169(bvec4) GroupNonUniformLogicalAnd 178 PartitionedReduceNV 831 832
+             835:   25(ivec4) Select 833 834 830
+             836:     71(ptr) AccessChain 31(data) 827 63
+                              Store 836 835
+             837:      6(int) Load 8(invocation)
+             838:     64(ptr) AccessChain 31(data) 34 63 35
+             839:     24(int) Load 838
+             840:   17(ivec4) Load 19(ballot)
+             841:     24(int) GroupNonUniformBitwiseOr 178 PartitionedReduceNV 839 840
+             842:     64(ptr) AccessChain 31(data) 837 63 35
+                              Store 842 841
+             843:      6(int) Load 8(invocation)
+             844:     71(ptr) AccessChain 31(data) 63 63
+             845:   25(ivec4) Load 844
+             846:   70(ivec2) VectorShuffle 845 845 0 1
+             847:   17(ivec4) Load 19(ballot)
+             848:   70(ivec2) GroupNonUniformBitwiseOr 178 PartitionedReduceNV 846 847
+             849:     64(ptr) AccessChain 31(data) 843 63 35
+             850:     24(int) CompositeExtract 848 0
+                              Store 849 850
+             851:     64(ptr) AccessChain 31(data) 843 63 189
+             852:     24(int) CompositeExtract 848 1
+                              Store 851 852
+             853:      6(int) Load 8(invocation)
+             854:     71(ptr) AccessChain 31(data) 33 63
+             855:   25(ivec4) Load 854
+             856:   78(ivec3) VectorShuffle 855 855 0 1 2
+             857:   17(ivec4) Load 19(ballot)
+             858:   78(ivec3) GroupNonUniformBitwiseOr 178 PartitionedReduceNV 856 857
+             859:     64(ptr) AccessChain 31(data) 853 63 35
+             860:     24(int) CompositeExtract 858 0
+                              Store 859 860
+             861:     64(ptr) AccessChain 31(data) 853 63 189
+             862:     24(int) CompositeExtract 858 1
+                              Store 861 862
+             863:     64(ptr) AccessChain 31(data) 853 63 202
+             864:     24(int) CompositeExtract 858 2
+                              Store 863 864
+             865:      6(int) Load 8(invocation)
+             866:     71(ptr) AccessChain 31(data) 115 63
+             867:   25(ivec4) Load 866
+             868:   17(ivec4) Load 19(ballot)
+             869:   25(ivec4) GroupNonUniformBitwiseOr 178 PartitionedReduceNV 867 868
+             870:     71(ptr) AccessChain 31(data) 865 63
+                              Store 870 869
+             871:      6(int) Load 8(invocation)
+             872:     90(ptr) AccessChain 31(data) 34 33 35
+             873:      6(int) Load 872
+             874:   17(ivec4) Load 19(ballot)
+             875:      6(int) GroupNonUniformBitwiseOr 178 PartitionedReduceNV 873 874
+             876:     90(ptr) AccessChain 31(data) 871 33 35
+                              Store 876 875
+             877:      6(int) Load 8(invocation)
+             878:     40(ptr) AccessChain 31(data) 63 33
+             879:   17(ivec4) Load 878
+             880:   96(ivec2) VectorShuffle 879 879 0 1
+             881:   17(ivec4) Load 19(ballot)
+             882:   96(ivec2) GroupNonUniformBitwiseOr 178 PartitionedReduceNV 880 881
+             883:     90(ptr) AccessChain 31(data) 877 33 35
+             884:      6(int) CompositeExtract 882 0
+                              Store 883 884
+             885:     90(ptr) AccessChain 31(data) 877 33 189
+             886:      6(int) CompositeExtract 882 1
+                              Store 885 886
              887:      6(int) Load 8(invocation)
-             888:     90(ptr) AccessChain 31(data) 34 33 35
-             889:      6(int) Load 888
-             890:   17(ivec4) Load 19(ballot)
-             891:      6(int) GroupNonUniformBitwiseXor 178 PartitionedReduceNV 889 890
-             892:     90(ptr) AccessChain 31(data) 887 33 35
-                              Store 892 891
-             893:      6(int) Load 8(invocation)
-             894:     40(ptr) AccessChain 31(data) 63 33
-             895:   17(ivec4) Load 894
-             896:   96(ivec2) VectorShuffle 895 895 0 1
-             897:   17(ivec4) Load 19(ballot)
-             898:   96(ivec2) GroupNonUniformBitwiseXor 178 PartitionedReduceNV 896 897
-             899:     40(ptr) AccessChain 31(data) 893 33
-             900:   17(ivec4) Load 899
-             901:   17(ivec4) VectorShuffle 900 898 4 5 2 3
-                              Store 899 901
-             902:      6(int) Load 8(invocation)
-             903:     40(ptr) AccessChain 31(data) 33 33
-             904:   17(ivec4) Load 903
-             905:  103(ivec3) VectorShuffle 904 904 0 1 2
-             906:   17(ivec4) Load 19(ballot)
-             907:  103(ivec3) GroupNonUniformBitwiseXor 178 PartitionedReduceNV 905 906
-             908:     40(ptr) AccessChain 31(data) 902 33
-             909:   17(ivec4) Load 908
-             910:   17(ivec4) VectorShuffle 909 907 4 5 6 3
-                              Store 908 910
-             911:      6(int) Load 8(invocation)
-             912:     40(ptr) AccessChain 31(data) 115 33
-             913:   17(ivec4) Load 912
-             914:   17(ivec4) Load 19(ballot)
-             915:   17(ivec4) GroupNonUniformBitwiseXor 178 PartitionedReduceNV 913 914
-             916:     40(ptr) AccessChain 31(data) 911 33
-                              Store 916 915
-             917:      6(int) Load 8(invocation)
-             918:     64(ptr) AccessChain 31(data) 34 63 35
-             919:     24(int) Load 918
-             920:   144(bool) SLessThan 919 34
-             921:   17(ivec4) Load 19(ballot)
-             922:   144(bool) GroupNonUniformLogicalXor 178 PartitionedReduceNV 920 921
-             923:     24(int) Select 922 63 34
-             924:     64(ptr) AccessChain 31(data) 917 63 35
-                              Store 924 923
+             888:     40(ptr) AccessChain 31(data) 33 33
+             889:   17(ivec4) Load 888
+             890:  103(ivec3) VectorShuffle 889 889 0 1 2
+             891:   17(ivec4) Load 19(ballot)
+             892:  103(ivec3) GroupNonUniformBitwiseOr 178 PartitionedReduceNV 890 891
+             893:     90(ptr) AccessChain 31(data) 887 33 35
+             894:      6(int) CompositeExtract 892 0
+                              Store 893 894
+             895:     90(ptr) AccessChain 31(data) 887 33 189
+             896:      6(int) CompositeExtract 892 1
+                              Store 895 896
+             897:     90(ptr) AccessChain 31(data) 887 33 202
+             898:      6(int) CompositeExtract 892 2
+                              Store 897 898
+             899:      6(int) Load 8(invocation)
+             900:     40(ptr) AccessChain 31(data) 115 33
+             901:   17(ivec4) Load 900
+             902:   17(ivec4) Load 19(ballot)
+             903:   17(ivec4) GroupNonUniformBitwiseOr 178 PartitionedReduceNV 901 902
+             904:     40(ptr) AccessChain 31(data) 899 33
+                              Store 904 903
+             905:      6(int) Load 8(invocation)
+             906:     64(ptr) AccessChain 31(data) 34 63 35
+             907:     24(int) Load 906
+             908:   144(bool) SLessThan 907 34
+             909:   17(ivec4) Load 19(ballot)
+             910:   144(bool) GroupNonUniformLogicalOr 178 PartitionedReduceNV 908 909
+             911:     24(int) Select 910 63 34
+             912:     64(ptr) AccessChain 31(data) 905 63 35
+                              Store 912 911
+             913:      6(int) Load 8(invocation)
+             914:     71(ptr) AccessChain 31(data) 63 63
+             915:   25(ivec4) Load 914
+             916:   70(ivec2) VectorShuffle 915 915 0 1
+             917:  152(bvec2) SLessThan 916 801
+             918:   17(ivec4) Load 19(ballot)
+             919:  152(bvec2) GroupNonUniformLogicalOr 178 PartitionedReduceNV 917 918
+             920:   70(ivec2) Select 919 805 801
+             921:     64(ptr) AccessChain 31(data) 913 63 35
+             922:     24(int) CompositeExtract 920 0
+                              Store 921 922
+             923:     64(ptr) AccessChain 31(data) 913 63 189
+             924:     24(int) CompositeExtract 920 1
+                              Store 923 924
              925:      6(int) Load 8(invocation)
              926:     71(ptr) AccessChain 31(data) 63 63
              927:   25(ivec4) Load 926
-             928:   70(ivec2) VectorShuffle 927 927 0 1
-             929:  152(bvec2) SLessThan 928 727
+             928:   78(ivec3) VectorShuffle 927 927 0 1 2
+             929:  161(bvec3) SLessThan 928 815
              930:   17(ivec4) Load 19(ballot)
-             931:  152(bvec2) GroupNonUniformLogicalXor 178 PartitionedReduceNV 929 930
-             932:   70(ivec2) Select 931 731 727
-             933:     71(ptr) AccessChain 31(data) 925 63
-             934:   25(ivec4) Load 933
-             935:   25(ivec4) VectorShuffle 934 932 4 5 2 3
-                              Store 933 935
-             936:      6(int) Load 8(invocation)
-             937:     71(ptr) AccessChain 31(data) 63 63
-             938:   25(ivec4) Load 937
-             939:   78(ivec3) VectorShuffle 938 938 0 1 2
-             940:  161(bvec3) SLessThan 939 740
-             941:   17(ivec4) Load 19(ballot)
-             942:  161(bvec3) GroupNonUniformLogicalXor 178 PartitionedReduceNV 940 941
-             943:   78(ivec3) Select 942 744 740
-             944:     71(ptr) AccessChain 31(data) 936 63
-             945:   25(ivec4) Load 944
-             946:   25(ivec4) VectorShuffle 945 943 4 5 6 3
-                              Store 944 946
+             931:  161(bvec3) GroupNonUniformLogicalOr 178 PartitionedReduceNV 929 930
+             932:   78(ivec3) Select 931 819 815
+             933:     64(ptr) AccessChain 31(data) 925 63 35
+             934:     24(int) CompositeExtract 932 0
+                              Store 933 934
+             935:     64(ptr) AccessChain 31(data) 925 63 189
+             936:     24(int) CompositeExtract 932 1
+                              Store 935 936
+             937:     64(ptr) AccessChain 31(data) 925 63 202
+             938:     24(int) CompositeExtract 932 2
+                              Store 937 938
+             939:      6(int) Load 8(invocation)
+             940:     71(ptr) AccessChain 31(data) 63 63
+             941:   25(ivec4) Load 940
+             942:  169(bvec4) SLessThan 941 830
+             943:   17(ivec4) Load 19(ballot)
+             944:  169(bvec4) GroupNonUniformLogicalOr 178 PartitionedReduceNV 942 943
+             945:   25(ivec4) Select 944 834 830
+             946:     71(ptr) AccessChain 31(data) 939 63
+                              Store 946 945
              947:      6(int) Load 8(invocation)
-             948:     71(ptr) AccessChain 31(data) 63 63
-             949:   25(ivec4) Load 948
-             950:  169(bvec4) SLessThan 949 752
-             951:   17(ivec4) Load 19(ballot)
-             952:  169(bvec4) GroupNonUniformLogicalXor 178 PartitionedReduceNV 950 951
-             953:   25(ivec4) Select 952 756 752
-             954:     71(ptr) AccessChain 31(data) 947 63
-                              Store 954 953
-             955:      6(int) Load 8(invocation)
-             956:     36(ptr) AccessChain 31(data) 34 34 35
-             957:   22(float) Load 956
-             958:   17(ivec4) Load 19(ballot)
-             959:   22(float) GroupNonUniformFAdd 178 PartitionedInclusiveScanNV 957 958
-             960:     36(ptr) AccessChain 31(data) 955 34 35
-                              Store 960 959
-             961:      6(int) Load 8(invocation)
-             962:     44(ptr) AccessChain 31(data) 63 34
-             963:   23(fvec4) Load 962
-             964:   43(fvec2) VectorShuffle 963 963 0 1
-             965:   17(ivec4) Load 19(ballot)
-             966:   43(fvec2) GroupNonUniformFAdd 178 PartitionedInclusiveScanNV 964 965
-             967:     44(ptr) AccessChain 31(data) 961 34
-             968:   23(fvec4) Load 967
-             969:   23(fvec4) VectorShuffle 968 966 4 5 2 3
-                              Store 967 969
-             970:      6(int) Load 8(invocation)
-             971:     44(ptr) AccessChain 31(data) 33 34
-             972:   23(fvec4) Load 971
-             973:   51(fvec3) VectorShuffle 972 972 0 1 2
-             974:   17(ivec4) Load 19(ballot)
-             975:   51(fvec3) GroupNonUniformFAdd 178 PartitionedInclusiveScanNV 973 974
-             976:     44(ptr) AccessChain 31(data) 970 34
-             977:   23(fvec4) Load 976
-             978:   23(fvec4) VectorShuffle 977 975 4 5 6 3
-                              Store 976 978
-             979:      6(int) Load 8(invocation)
-             980:     44(ptr) AccessChain 31(data) 115 34
-             981:   23(fvec4) Load 980
-             982:   17(ivec4) Load 19(ballot)
-             983:   23(fvec4) GroupNonUniformFAdd 178 PartitionedInclusiveScanNV 981 982
-             984:     44(ptr) AccessChain 31(data) 979 34
-                              Store 984 983
-             985:      6(int) Load 8(invocation)
-             986:     64(ptr) AccessChain 31(data) 34 63 35
-             987:     24(int) Load 986
-             988:   17(ivec4) Load 19(ballot)
-             989:     24(int) GroupNonUniformIAdd 178 PartitionedInclusiveScanNV 987 988
-             990:     64(ptr) AccessChain 31(data) 985 63 35
-                              Store 990 989
-             991:      6(int) Load 8(invocation)
-             992:     71(ptr) AccessChain 31(data) 63 63
-             993:   25(ivec4) Load 992
-             994:   70(ivec2) VectorShuffle 993 993 0 1
-             995:   17(ivec4) Load 19(ballot)
-             996:   70(ivec2) GroupNonUniformIAdd 178 PartitionedInclusiveScanNV 994 995
-             997:     71(ptr) AccessChain 31(data) 991 63
-             998:   25(ivec4) Load 997
-             999:   25(ivec4) VectorShuffle 998 996 4 5 2 3
-                              Store 997 999
-            1000:      6(int) Load 8(invocation)
-            1001:     71(ptr) AccessChain 31(data) 33 63
-            1002:   25(ivec4) Load 1001
-            1003:   78(ivec3) VectorShuffle 1002 1002 0 1 2
-            1004:   17(ivec4) Load 19(ballot)
-            1005:   78(ivec3) GroupNonUniformIAdd 178 PartitionedInclusiveScanNV 1003 1004
-            1006:     71(ptr) AccessChain 31(data) 1000 63
-            1007:   25(ivec4) Load 1006
-            1008:   25(ivec4) VectorShuffle 1007 1005 4 5 6 3
-                              Store 1006 1008
+             948:     64(ptr) AccessChain 31(data) 34 63 35
+             949:     24(int) Load 948
+             950:   17(ivec4) Load 19(ballot)
+             951:     24(int) GroupNonUniformBitwiseXor 178 PartitionedReduceNV 949 950
+             952:     64(ptr) AccessChain 31(data) 947 63 35
+                              Store 952 951
+             953:      6(int) Load 8(invocation)
+             954:     71(ptr) AccessChain 31(data) 63 63
+             955:   25(ivec4) Load 954
+             956:   70(ivec2) VectorShuffle 955 955 0 1
+             957:   17(ivec4) Load 19(ballot)
+             958:   70(ivec2) GroupNonUniformBitwiseXor 178 PartitionedReduceNV 956 957
+             959:     64(ptr) AccessChain 31(data) 953 63 35
+             960:     24(int) CompositeExtract 958 0
+                              Store 959 960
+             961:     64(ptr) AccessChain 31(data) 953 63 189
+             962:     24(int) CompositeExtract 958 1
+                              Store 961 962
+             963:      6(int) Load 8(invocation)
+             964:     71(ptr) AccessChain 31(data) 33 63
+             965:   25(ivec4) Load 964
+             966:   78(ivec3) VectorShuffle 965 965 0 1 2
+             967:   17(ivec4) Load 19(ballot)
+             968:   78(ivec3) GroupNonUniformBitwiseXor 178 PartitionedReduceNV 966 967
+             969:     64(ptr) AccessChain 31(data) 963 63 35
+             970:     24(int) CompositeExtract 968 0
+                              Store 969 970
+             971:     64(ptr) AccessChain 31(data) 963 63 189
+             972:     24(int) CompositeExtract 968 1
+                              Store 971 972
+             973:     64(ptr) AccessChain 31(data) 963 63 202
+             974:     24(int) CompositeExtract 968 2
+                              Store 973 974
+             975:      6(int) Load 8(invocation)
+             976:     71(ptr) AccessChain 31(data) 115 63
+             977:   25(ivec4) Load 976
+             978:   17(ivec4) Load 19(ballot)
+             979:   25(ivec4) GroupNonUniformBitwiseXor 178 PartitionedReduceNV 977 978
+             980:     71(ptr) AccessChain 31(data) 975 63
+                              Store 980 979
+             981:      6(int) Load 8(invocation)
+             982:     90(ptr) AccessChain 31(data) 34 33 35
+             983:      6(int) Load 982
+             984:   17(ivec4) Load 19(ballot)
+             985:      6(int) GroupNonUniformBitwiseXor 178 PartitionedReduceNV 983 984
+             986:     90(ptr) AccessChain 31(data) 981 33 35
+                              Store 986 985
+             987:      6(int) Load 8(invocation)
+             988:     40(ptr) AccessChain 31(data) 63 33
+             989:   17(ivec4) Load 988
+             990:   96(ivec2) VectorShuffle 989 989 0 1
+             991:   17(ivec4) Load 19(ballot)
+             992:   96(ivec2) GroupNonUniformBitwiseXor 178 PartitionedReduceNV 990 991
+             993:     90(ptr) AccessChain 31(data) 987 33 35
+             994:      6(int) CompositeExtract 992 0
+                              Store 993 994
+             995:     90(ptr) AccessChain 31(data) 987 33 189
+             996:      6(int) CompositeExtract 992 1
+                              Store 995 996
+             997:      6(int) Load 8(invocation)
+             998:     40(ptr) AccessChain 31(data) 33 33
+             999:   17(ivec4) Load 998
+            1000:  103(ivec3) VectorShuffle 999 999 0 1 2
+            1001:   17(ivec4) Load 19(ballot)
+            1002:  103(ivec3) GroupNonUniformBitwiseXor 178 PartitionedReduceNV 1000 1001
+            1003:     90(ptr) AccessChain 31(data) 997 33 35
+            1004:      6(int) CompositeExtract 1002 0
+                              Store 1003 1004
+            1005:     90(ptr) AccessChain 31(data) 997 33 189
+            1006:      6(int) CompositeExtract 1002 1
+                              Store 1005 1006
+            1007:     90(ptr) AccessChain 31(data) 997 33 202
+            1008:      6(int) CompositeExtract 1002 2
+                              Store 1007 1008
             1009:      6(int) Load 8(invocation)
-            1010:     71(ptr) AccessChain 31(data) 115 63
-            1011:   25(ivec4) Load 1010
+            1010:     40(ptr) AccessChain 31(data) 115 33
+            1011:   17(ivec4) Load 1010
             1012:   17(ivec4) Load 19(ballot)
-            1013:   25(ivec4) GroupNonUniformIAdd 178 PartitionedInclusiveScanNV 1011 1012
-            1014:     71(ptr) AccessChain 31(data) 1009 63
+            1013:   17(ivec4) GroupNonUniformBitwiseXor 178 PartitionedReduceNV 1011 1012
+            1014:     40(ptr) AccessChain 31(data) 1009 33
                               Store 1014 1013
             1015:      6(int) Load 8(invocation)
-            1016:     90(ptr) AccessChain 31(data) 34 33 35
-            1017:      6(int) Load 1016
-            1018:   17(ivec4) Load 19(ballot)
-            1019:      6(int) GroupNonUniformIAdd 178 PartitionedInclusiveScanNV 1017 1018
-            1020:     90(ptr) AccessChain 31(data) 1015 33 35
-                              Store 1020 1019
-            1021:      6(int) Load 8(invocation)
-            1022:     40(ptr) AccessChain 31(data) 63 33
-            1023:   17(ivec4) Load 1022
-            1024:   96(ivec2) VectorShuffle 1023 1023 0 1
-            1025:   17(ivec4) Load 19(ballot)
-            1026:   96(ivec2) GroupNonUniformIAdd 178 PartitionedInclusiveScanNV 1024 1025
-            1027:     40(ptr) AccessChain 31(data) 1021 33
-            1028:   17(ivec4) Load 1027
-            1029:   17(ivec4) VectorShuffle 1028 1026 4 5 2 3
-                              Store 1027 1029
-            1030:      6(int) Load 8(invocation)
-            1031:     40(ptr) AccessChain 31(data) 33 33
-            1032:   17(ivec4) Load 1031
-            1033:  103(ivec3) VectorShuffle 1032 1032 0 1 2
-            1034:   17(ivec4) Load 19(ballot)
-            1035:  103(ivec3) GroupNonUniformIAdd 178 PartitionedInclusiveScanNV 1033 1034
-            1036:     40(ptr) AccessChain 31(data) 1030 33
-            1037:   17(ivec4) Load 1036
-            1038:   17(ivec4) VectorShuffle 1037 1035 4 5 6 3
-                              Store 1036 1038
-            1039:      6(int) Load 8(invocation)
-            1040:     40(ptr) AccessChain 31(data) 115 33
-            1041:   17(ivec4) Load 1040
-            1042:   17(ivec4) Load 19(ballot)
-            1043:   17(ivec4) GroupNonUniformIAdd 178 PartitionedInclusiveScanNV 1041 1042
-            1044:     40(ptr) AccessChain 31(data) 1039 33
-                              Store 1044 1043
-            1045:      6(int) Load 8(invocation)
-            1046:    116(ptr) AccessChain 31(data) 34 115 35
-            1047:26(float64_t) Load 1046
-            1048:   17(ivec4) Load 19(ballot)
-            1049:26(float64_t) GroupNonUniformFAdd 178 PartitionedInclusiveScanNV 1047 1048
-            1050:    116(ptr) AccessChain 31(data) 1045 115 35
-                              Store 1050 1049
-            1051:      6(int) Load 8(invocation)
-            1052:    123(ptr) AccessChain 31(data) 63 115
-            1053: 27(f64vec4) Load 1052
-            1054:122(f64vec2) VectorShuffle 1053 1053 0 1
-            1055:   17(ivec4) Load 19(ballot)
-            1056:122(f64vec2) GroupNonUniformFAdd 178 PartitionedInclusiveScanNV 1054 1055
-            1057:    123(ptr) AccessChain 31(data) 1051 115
-            1058: 27(f64vec4) Load 1057
-            1059: 27(f64vec4) VectorShuffle 1058 1056 4 5 2 3
-                              Store 1057 1059
-            1060:      6(int) Load 8(invocation)
-            1061:    123(ptr) AccessChain 31(data) 33 115
-            1062: 27(f64vec4) Load 1061
-            1063:130(f64vec3) VectorShuffle 1062 1062 0 1 2
-            1064:   17(ivec4) Load 19(ballot)
-            1065:130(f64vec3) GroupNonUniformFAdd 178 PartitionedInclusiveScanNV 1063 1064
-            1066:    123(ptr) AccessChain 31(data) 1060 115
-            1067: 27(f64vec4) Load 1066
-            1068: 27(f64vec4) VectorShuffle 1067 1065 4 5 6 3
-                              Store 1066 1068
-            1069:      6(int) Load 8(invocation)
-            1070:    123(ptr) AccessChain 31(data) 115 115
-            1071: 27(f64vec4) Load 1070
-            1072:   17(ivec4) Load 19(ballot)
-            1073: 27(f64vec4) GroupNonUniformFAdd 178 PartitionedInclusiveScanNV 1071 1072
-            1074:    123(ptr) AccessChain 31(data) 1069 115
-                              Store 1074 1073
-            1075:      6(int) Load 8(invocation)
-            1076:     36(ptr) AccessChain 31(data) 34 34 35
-            1077:   22(float) Load 1076
-            1078:   17(ivec4) Load 19(ballot)
-            1079:   22(float) GroupNonUniformFMul 178 PartitionedInclusiveScanNV 1077 1078
-            1080:     36(ptr) AccessChain 31(data) 1075 34 35
-                              Store 1080 1079
-            1081:      6(int) Load 8(invocation)
-            1082:     44(ptr) AccessChain 31(data) 63 34
-            1083:   23(fvec4) Load 1082
-            1084:   43(fvec2) VectorShuffle 1083 1083 0 1
-            1085:   17(ivec4) Load 19(ballot)
-            1086:   43(fvec2) GroupNonUniformFMul 178 PartitionedInclusiveScanNV 1084 1085
-            1087:     44(ptr) AccessChain 31(data) 1081 34
-            1088:   23(fvec4) Load 1087
-            1089:   23(fvec4) VectorShuffle 1088 1086 4 5 2 3
-                              Store 1087 1089
-            1090:      6(int) Load 8(invocation)
-            1091:     44(ptr) AccessChain 31(data) 33 34
-            1092:   23(fvec4) Load 1091
-            1093:   51(fvec3) VectorShuffle 1092 1092 0 1 2
+            1016:     64(ptr) AccessChain 31(data) 34 63 35
+            1017:     24(int) Load 1016
+            1018:   144(bool) SLessThan 1017 34
+            1019:   17(ivec4) Load 19(ballot)
+            1020:   144(bool) GroupNonUniformLogicalXor 178 PartitionedReduceNV 1018 1019
+            1021:     24(int) Select 1020 63 34
+            1022:     64(ptr) AccessChain 31(data) 1015 63 35
+                              Store 1022 1021
+            1023:      6(int) Load 8(invocation)
+            1024:     71(ptr) AccessChain 31(data) 63 63
+            1025:   25(ivec4) Load 1024
+            1026:   70(ivec2) VectorShuffle 1025 1025 0 1
+            1027:  152(bvec2) SLessThan 1026 801
+            1028:   17(ivec4) Load 19(ballot)
+            1029:  152(bvec2) GroupNonUniformLogicalXor 178 PartitionedReduceNV 1027 1028
+            1030:   70(ivec2) Select 1029 805 801
+            1031:     64(ptr) AccessChain 31(data) 1023 63 35
+            1032:     24(int) CompositeExtract 1030 0
+                              Store 1031 1032
+            1033:     64(ptr) AccessChain 31(data) 1023 63 189
+            1034:     24(int) CompositeExtract 1030 1
+                              Store 1033 1034
+            1035:      6(int) Load 8(invocation)
+            1036:     71(ptr) AccessChain 31(data) 63 63
+            1037:   25(ivec4) Load 1036
+            1038:   78(ivec3) VectorShuffle 1037 1037 0 1 2
+            1039:  161(bvec3) SLessThan 1038 815
+            1040:   17(ivec4) Load 19(ballot)
+            1041:  161(bvec3) GroupNonUniformLogicalXor 178 PartitionedReduceNV 1039 1040
+            1042:   78(ivec3) Select 1041 819 815
+            1043:     64(ptr) AccessChain 31(data) 1035 63 35
+            1044:     24(int) CompositeExtract 1042 0
+                              Store 1043 1044
+            1045:     64(ptr) AccessChain 31(data) 1035 63 189
+            1046:     24(int) CompositeExtract 1042 1
+                              Store 1045 1046
+            1047:     64(ptr) AccessChain 31(data) 1035 63 202
+            1048:     24(int) CompositeExtract 1042 2
+                              Store 1047 1048
+            1049:      6(int) Load 8(invocation)
+            1050:     71(ptr) AccessChain 31(data) 63 63
+            1051:   25(ivec4) Load 1050
+            1052:  169(bvec4) SLessThan 1051 830
+            1053:   17(ivec4) Load 19(ballot)
+            1054:  169(bvec4) GroupNonUniformLogicalXor 178 PartitionedReduceNV 1052 1053
+            1055:   25(ivec4) Select 1054 834 830
+            1056:     71(ptr) AccessChain 31(data) 1049 63
+                              Store 1056 1055
+            1057:      6(int) Load 8(invocation)
+            1058:     36(ptr) AccessChain 31(data) 34 34 35
+            1059:   22(float) Load 1058
+            1060:   17(ivec4) Load 19(ballot)
+            1061:   22(float) GroupNonUniformFAdd 178 PartitionedInclusiveScanNV 1059 1060
+            1062:     36(ptr) AccessChain 31(data) 1057 34 35
+                              Store 1062 1061
+            1063:      6(int) Load 8(invocation)
+            1064:     44(ptr) AccessChain 31(data) 63 34
+            1065:   23(fvec4) Load 1064
+            1066:   43(fvec2) VectorShuffle 1065 1065 0 1
+            1067:   17(ivec4) Load 19(ballot)
+            1068:   43(fvec2) GroupNonUniformFAdd 178 PartitionedInclusiveScanNV 1066 1067
+            1069:     36(ptr) AccessChain 31(data) 1063 34 35
+            1070:   22(float) CompositeExtract 1068 0
+                              Store 1069 1070
+            1071:     36(ptr) AccessChain 31(data) 1063 34 189
+            1072:   22(float) CompositeExtract 1068 1
+                              Store 1071 1072
+            1073:      6(int) Load 8(invocation)
+            1074:     44(ptr) AccessChain 31(data) 33 34
+            1075:   23(fvec4) Load 1074
+            1076:   51(fvec3) VectorShuffle 1075 1075 0 1 2
+            1077:   17(ivec4) Load 19(ballot)
+            1078:   51(fvec3) GroupNonUniformFAdd 178 PartitionedInclusiveScanNV 1076 1077
+            1079:     36(ptr) AccessChain 31(data) 1073 34 35
+            1080:   22(float) CompositeExtract 1078 0
+                              Store 1079 1080
+            1081:     36(ptr) AccessChain 31(data) 1073 34 189
+            1082:   22(float) CompositeExtract 1078 1
+                              Store 1081 1082
+            1083:     36(ptr) AccessChain 31(data) 1073 34 202
+            1084:   22(float) CompositeExtract 1078 2
+                              Store 1083 1084
+            1085:      6(int) Load 8(invocation)
+            1086:     44(ptr) AccessChain 31(data) 115 34
+            1087:   23(fvec4) Load 1086
+            1088:   17(ivec4) Load 19(ballot)
+            1089:   23(fvec4) GroupNonUniformFAdd 178 PartitionedInclusiveScanNV 1087 1088
+            1090:     44(ptr) AccessChain 31(data) 1085 34
+                              Store 1090 1089
+            1091:      6(int) Load 8(invocation)
+            1092:     64(ptr) AccessChain 31(data) 34 63 35
+            1093:     24(int) Load 1092
             1094:   17(ivec4) Load 19(ballot)
-            1095:   51(fvec3) GroupNonUniformFMul 178 PartitionedInclusiveScanNV 1093 1094
-            1096:     44(ptr) AccessChain 31(data) 1090 34
-            1097:   23(fvec4) Load 1096
-            1098:   23(fvec4) VectorShuffle 1097 1095 4 5 6 3
-                              Store 1096 1098
-            1099:      6(int) Load 8(invocation)
-            1100:     44(ptr) AccessChain 31(data) 115 34
-            1101:   23(fvec4) Load 1100
-            1102:   17(ivec4) Load 19(ballot)
-            1103:   23(fvec4) GroupNonUniformFMul 178 PartitionedInclusiveScanNV 1101 1102
-            1104:     44(ptr) AccessChain 31(data) 1099 34
-                              Store 1104 1103
-            1105:      6(int) Load 8(invocation)
-            1106:     64(ptr) AccessChain 31(data) 34 63 35
-            1107:     24(int) Load 1106
-            1108:   17(ivec4) Load 19(ballot)
-            1109:     24(int) GroupNonUniformIMul 178 PartitionedInclusiveScanNV 1107 1108
-            1110:     64(ptr) AccessChain 31(data) 1105 63 35
-                              Store 1110 1109
-            1111:      6(int) Load 8(invocation)
-            1112:     71(ptr) AccessChain 31(data) 63 63
-            1113:   25(ivec4) Load 1112
-            1114:   70(ivec2) VectorShuffle 1113 1113 0 1
-            1115:   17(ivec4) Load 19(ballot)
-            1116:   70(ivec2) GroupNonUniformIMul 178 PartitionedInclusiveScanNV 1114 1115
-            1117:     71(ptr) AccessChain 31(data) 1111 63
-            1118:   25(ivec4) Load 1117
-            1119:   25(ivec4) VectorShuffle 1118 1116 4 5 2 3
-                              Store 1117 1119
-            1120:      6(int) Load 8(invocation)
-            1121:     71(ptr) AccessChain 31(data) 33 63
-            1122:   25(ivec4) Load 1121
-            1123:   78(ivec3) VectorShuffle 1122 1122 0 1 2
-            1124:   17(ivec4) Load 19(ballot)
-            1125:   78(ivec3) GroupNonUniformIMul 178 PartitionedInclusiveScanNV 1123 1124
-            1126:     71(ptr) AccessChain 31(data) 1120 63
-            1127:   25(ivec4) Load 1126
-            1128:   25(ivec4) VectorShuffle 1127 1125 4 5 6 3
-                              Store 1126 1128
-            1129:      6(int) Load 8(invocation)
-            1130:     71(ptr) AccessChain 31(data) 115 63
-            1131:   25(ivec4) Load 1130
-            1132:   17(ivec4) Load 19(ballot)
-            1133:   25(ivec4) GroupNonUniformIMul 178 PartitionedInclusiveScanNV 1131 1132
-            1134:     71(ptr) AccessChain 31(data) 1129 63
-                              Store 1134 1133
-            1135:      6(int) Load 8(invocation)
-            1136:     90(ptr) AccessChain 31(data) 34 33 35
-            1137:      6(int) Load 1136
-            1138:   17(ivec4) Load 19(ballot)
-            1139:      6(int) GroupNonUniformIMul 178 PartitionedInclusiveScanNV 1137 1138
-            1140:     90(ptr) AccessChain 31(data) 1135 33 35
-                              Store 1140 1139
+            1095:     24(int) GroupNonUniformIAdd 178 PartitionedInclusiveScanNV 1093 1094
+            1096:     64(ptr) AccessChain 31(data) 1091 63 35
+                              Store 1096 1095
+            1097:      6(int) Load 8(invocation)
+            1098:     71(ptr) AccessChain 31(data) 63 63
+            1099:   25(ivec4) Load 1098
+            1100:   70(ivec2) VectorShuffle 1099 1099 0 1
+            1101:   17(ivec4) Load 19(ballot)
+            1102:   70(ivec2) GroupNonUniformIAdd 178 PartitionedInclusiveScanNV 1100 1101
+            1103:     64(ptr) AccessChain 31(data) 1097 63 35
+            1104:     24(int) CompositeExtract 1102 0
+                              Store 1103 1104
+            1105:     64(ptr) AccessChain 31(data) 1097 63 189
+            1106:     24(int) CompositeExtract 1102 1
+                              Store 1105 1106
+            1107:      6(int) Load 8(invocation)
+            1108:     71(ptr) AccessChain 31(data) 33 63
+            1109:   25(ivec4) Load 1108
+            1110:   78(ivec3) VectorShuffle 1109 1109 0 1 2
+            1111:   17(ivec4) Load 19(ballot)
+            1112:   78(ivec3) GroupNonUniformIAdd 178 PartitionedInclusiveScanNV 1110 1111
+            1113:     64(ptr) AccessChain 31(data) 1107 63 35
+            1114:     24(int) CompositeExtract 1112 0
+                              Store 1113 1114
+            1115:     64(ptr) AccessChain 31(data) 1107 63 189
+            1116:     24(int) CompositeExtract 1112 1
+                              Store 1115 1116
+            1117:     64(ptr) AccessChain 31(data) 1107 63 202
+            1118:     24(int) CompositeExtract 1112 2
+                              Store 1117 1118
+            1119:      6(int) Load 8(invocation)
+            1120:     71(ptr) AccessChain 31(data) 115 63
+            1121:   25(ivec4) Load 1120
+            1122:   17(ivec4) Load 19(ballot)
+            1123:   25(ivec4) GroupNonUniformIAdd 178 PartitionedInclusiveScanNV 1121 1122
+            1124:     71(ptr) AccessChain 31(data) 1119 63
+                              Store 1124 1123
+            1125:      6(int) Load 8(invocation)
+            1126:     90(ptr) AccessChain 31(data) 34 33 35
+            1127:      6(int) Load 1126
+            1128:   17(ivec4) Load 19(ballot)
+            1129:      6(int) GroupNonUniformIAdd 178 PartitionedInclusiveScanNV 1127 1128
+            1130:     90(ptr) AccessChain 31(data) 1125 33 35
+                              Store 1130 1129
+            1131:      6(int) Load 8(invocation)
+            1132:     40(ptr) AccessChain 31(data) 63 33
+            1133:   17(ivec4) Load 1132
+            1134:   96(ivec2) VectorShuffle 1133 1133 0 1
+            1135:   17(ivec4) Load 19(ballot)
+            1136:   96(ivec2) GroupNonUniformIAdd 178 PartitionedInclusiveScanNV 1134 1135
+            1137:     90(ptr) AccessChain 31(data) 1131 33 35
+            1138:      6(int) CompositeExtract 1136 0
+                              Store 1137 1138
+            1139:     90(ptr) AccessChain 31(data) 1131 33 189
+            1140:      6(int) CompositeExtract 1136 1
+                              Store 1139 1140
             1141:      6(int) Load 8(invocation)
-            1142:     40(ptr) AccessChain 31(data) 63 33
+            1142:     40(ptr) AccessChain 31(data) 33 33
             1143:   17(ivec4) Load 1142
-            1144:   96(ivec2) VectorShuffle 1143 1143 0 1
+            1144:  103(ivec3) VectorShuffle 1143 1143 0 1 2
             1145:   17(ivec4) Load 19(ballot)
-            1146:   96(ivec2) GroupNonUniformIMul 178 PartitionedInclusiveScanNV 1144 1145
-            1147:     40(ptr) AccessChain 31(data) 1141 33
-            1148:   17(ivec4) Load 1147
-            1149:   17(ivec4) VectorShuffle 1148 1146 4 5 2 3
-                              Store 1147 1149
-            1150:      6(int) Load 8(invocation)
-            1151:     40(ptr) AccessChain 31(data) 33 33
-            1152:   17(ivec4) Load 1151
-            1153:  103(ivec3) VectorShuffle 1152 1152 0 1 2
-            1154:   17(ivec4) Load 19(ballot)
-            1155:  103(ivec3) GroupNonUniformIMul 178 PartitionedInclusiveScanNV 1153 1154
-            1156:     40(ptr) AccessChain 31(data) 1150 33
-            1157:   17(ivec4) Load 1156
-            1158:   17(ivec4) VectorShuffle 1157 1155 4 5 6 3
-                              Store 1156 1158
+            1146:  103(ivec3) GroupNonUniformIAdd 178 PartitionedInclusiveScanNV 1144 1145
+            1147:     90(ptr) AccessChain 31(data) 1141 33 35
+            1148:      6(int) CompositeExtract 1146 0
+                              Store 1147 1148
+            1149:     90(ptr) AccessChain 31(data) 1141 33 189
+            1150:      6(int) CompositeExtract 1146 1
+                              Store 1149 1150
+            1151:     90(ptr) AccessChain 31(data) 1141 33 202
+            1152:      6(int) CompositeExtract 1146 2
+                              Store 1151 1152
+            1153:      6(int) Load 8(invocation)
+            1154:     40(ptr) AccessChain 31(data) 115 33
+            1155:   17(ivec4) Load 1154
+            1156:   17(ivec4) Load 19(ballot)
+            1157:   17(ivec4) GroupNonUniformIAdd 178 PartitionedInclusiveScanNV 1155 1156
+            1158:     40(ptr) AccessChain 31(data) 1153 33
+                              Store 1158 1157
             1159:      6(int) Load 8(invocation)
-            1160:     40(ptr) AccessChain 31(data) 115 33
-            1161:   17(ivec4) Load 1160
+            1160:    116(ptr) AccessChain 31(data) 34 115 35
+            1161:26(float64_t) Load 1160
             1162:   17(ivec4) Load 19(ballot)
-            1163:   17(ivec4) GroupNonUniformIMul 178 PartitionedInclusiveScanNV 1161 1162
-            1164:     40(ptr) AccessChain 31(data) 1159 33
+            1163:26(float64_t) GroupNonUniformFAdd 178 PartitionedInclusiveScanNV 1161 1162
+            1164:    116(ptr) AccessChain 31(data) 1159 115 35
                               Store 1164 1163
             1165:      6(int) Load 8(invocation)
-            1166:    116(ptr) AccessChain 31(data) 34 115 35
-            1167:26(float64_t) Load 1166
-            1168:   17(ivec4) Load 19(ballot)
-            1169:26(float64_t) GroupNonUniformFMul 178 PartitionedInclusiveScanNV 1167 1168
-            1170:    116(ptr) AccessChain 31(data) 1165 115 35
-                              Store 1170 1169
-            1171:      6(int) Load 8(invocation)
-            1172:    123(ptr) AccessChain 31(data) 63 115
-            1173: 27(f64vec4) Load 1172
-            1174:122(f64vec2) VectorShuffle 1173 1173 0 1
-            1175:   17(ivec4) Load 19(ballot)
-            1176:122(f64vec2) GroupNonUniformFMul 178 PartitionedInclusiveScanNV 1174 1175
-            1177:    123(ptr) AccessChain 31(data) 1171 115
-            1178: 27(f64vec4) Load 1177
-            1179: 27(f64vec4) VectorShuffle 1178 1176 4 5 2 3
-                              Store 1177 1179
-            1180:      6(int) Load 8(invocation)
-            1181:    123(ptr) AccessChain 31(data) 33 115
-            1182: 27(f64vec4) Load 1181
-            1183:130(f64vec3) VectorShuffle 1182 1182 0 1 2
-            1184:   17(ivec4) Load 19(ballot)
-            1185:130(f64vec3) GroupNonUniformFMul 178 PartitionedInclusiveScanNV 1183 1184
-            1186:    123(ptr) AccessChain 31(data) 1180 115
-            1187: 27(f64vec4) Load 1186
-            1188: 27(f64vec4) VectorShuffle 1187 1185 4 5 6 3
-                              Store 1186 1188
-            1189:      6(int) Load 8(invocation)
-            1190:    123(ptr) AccessChain 31(data) 115 115
-            1191: 27(f64vec4) Load 1190
-            1192:   17(ivec4) Load 19(ballot)
-            1193: 27(f64vec4) GroupNonUniformFMul 178 PartitionedInclusiveScanNV 1191 1192
-            1194:    123(ptr) AccessChain 31(data) 1189 115
-                              Store 1194 1193
-            1195:      6(int) Load 8(invocation)
-            1196:     36(ptr) AccessChain 31(data) 34 34 35
-            1197:   22(float) Load 1196
-            1198:   17(ivec4) Load 19(ballot)
-            1199:   22(float) GroupNonUniformFMin 178 PartitionedInclusiveScanNV 1197 1198
-            1200:     36(ptr) AccessChain 31(data) 1195 34 35
-                              Store 1200 1199
-            1201:      6(int) Load 8(invocation)
-            1202:     44(ptr) AccessChain 31(data) 63 34
-            1203:   23(fvec4) Load 1202
-            1204:   43(fvec2) VectorShuffle 1203 1203 0 1
-            1205:   17(ivec4) Load 19(ballot)
-            1206:   43(fvec2) GroupNonUniformFMin 178 PartitionedInclusiveScanNV 1204 1205
-            1207:     44(ptr) AccessChain 31(data) 1201 34
-            1208:   23(fvec4) Load 1207
-            1209:   23(fvec4) VectorShuffle 1208 1206 4 5 2 3
-                              Store 1207 1209
-            1210:      6(int) Load 8(invocation)
-            1211:     44(ptr) AccessChain 31(data) 33 34
-            1212:   23(fvec4) Load 1211
-            1213:   51(fvec3) VectorShuffle 1212 1212 0 1 2
-            1214:   17(ivec4) Load 19(ballot)
-            1215:   51(fvec3) GroupNonUniformFMin 178 PartitionedInclusiveScanNV 1213 1214
-            1216:     44(ptr) AccessChain 31(data) 1210 34
-            1217:   23(fvec4) Load 1216
-            1218:   23(fvec4) VectorShuffle 1217 1215 4 5 6 3
-                              Store 1216 1218
-            1219:      6(int) Load 8(invocation)
-            1220:     44(ptr) AccessChain 31(data) 115 34
-            1221:   23(fvec4) Load 1220
-            1222:   17(ivec4) Load 19(ballot)
-            1223:   23(fvec4) GroupNonUniformFMin 178 PartitionedInclusiveScanNV 1221 1222
-            1224:     44(ptr) AccessChain 31(data) 1219 34
-                              Store 1224 1223
-            1225:      6(int) Load 8(invocation)
-            1226:     64(ptr) AccessChain 31(data) 34 63 35
-            1227:     24(int) Load 1226
-            1228:   17(ivec4) Load 19(ballot)
-            1229:     24(int) GroupNonUniformSMin 178 PartitionedInclusiveScanNV 1227 1228
-            1230:     64(ptr) AccessChain 31(data) 1225 63 35
-                              Store 1230 1229
-            1231:      6(int) Load 8(invocation)
-            1232:     71(ptr) AccessChain 31(data) 63 63
-            1233:   25(ivec4) Load 1232
-            1234:   70(ivec2) VectorShuffle 1233 1233 0 1
-            1235:   17(ivec4) Load 19(ballot)
-            1236:   70(ivec2) GroupNonUniformSMin 178 PartitionedInclusiveScanNV 1234 1235
-            1237:     71(ptr) AccessChain 31(data) 1231 63
-            1238:   25(ivec4) Load 1237
-            1239:   25(ivec4) VectorShuffle 1238 1236 4 5 2 3
-                              Store 1237 1239
-            1240:      6(int) Load 8(invocation)
-            1241:     71(ptr) AccessChain 31(data) 33 63
-            1242:   25(ivec4) Load 1241
-            1243:   78(ivec3) VectorShuffle 1242 1242 0 1 2
-            1244:   17(ivec4) Load 19(ballot)
-            1245:   78(ivec3) GroupNonUniformSMin 178 PartitionedInclusiveScanNV 1243 1244
-            1246:     71(ptr) AccessChain 31(data) 1240 63
-            1247:   25(ivec4) Load 1246
-            1248:   25(ivec4) VectorShuffle 1247 1245 4 5 6 3
-                              Store 1246 1248
-            1249:      6(int) Load 8(invocation)
-            1250:     71(ptr) AccessChain 31(data) 115 63
-            1251:   25(ivec4) Load 1250
-            1252:   17(ivec4) Load 19(ballot)
-            1253:   25(ivec4) GroupNonUniformSMin 178 PartitionedInclusiveScanNV 1251 1252
-            1254:     71(ptr) AccessChain 31(data) 1249 63
-                              Store 1254 1253
+            1166:    123(ptr) AccessChain 31(data) 63 115
+            1167: 27(f64vec4) Load 1166
+            1168:122(f64vec2) VectorShuffle 1167 1167 0 1
+            1169:   17(ivec4) Load 19(ballot)
+            1170:122(f64vec2) GroupNonUniformFAdd 178 PartitionedInclusiveScanNV 1168 1169
+            1171:    116(ptr) AccessChain 31(data) 1165 115 35
+            1172:26(float64_t) CompositeExtract 1170 0
+                              Store 1171 1172
+            1173:    116(ptr) AccessChain 31(data) 1165 115 189
+            1174:26(float64_t) CompositeExtract 1170 1
+                              Store 1173 1174
+            1175:      6(int) Load 8(invocation)
+            1176:    123(ptr) AccessChain 31(data) 33 115
+            1177: 27(f64vec4) Load 1176
+            1178:130(f64vec3) VectorShuffle 1177 1177 0 1 2
+            1179:   17(ivec4) Load 19(ballot)
+            1180:130(f64vec3) GroupNonUniformFAdd 178 PartitionedInclusiveScanNV 1178 1179
+            1181:    116(ptr) AccessChain 31(data) 1175 115 35
+            1182:26(float64_t) CompositeExtract 1180 0
+                              Store 1181 1182
+            1183:    116(ptr) AccessChain 31(data) 1175 115 189
+            1184:26(float64_t) CompositeExtract 1180 1
+                              Store 1183 1184
+            1185:    116(ptr) AccessChain 31(data) 1175 115 202
+            1186:26(float64_t) CompositeExtract 1180 2
+                              Store 1185 1186
+            1187:      6(int) Load 8(invocation)
+            1188:    123(ptr) AccessChain 31(data) 115 115
+            1189: 27(f64vec4) Load 1188
+            1190:   17(ivec4) Load 19(ballot)
+            1191: 27(f64vec4) GroupNonUniformFAdd 178 PartitionedInclusiveScanNV 1189 1190
+            1192:    123(ptr) AccessChain 31(data) 1187 115
+                              Store 1192 1191
+            1193:      6(int) Load 8(invocation)
+            1194:     36(ptr) AccessChain 31(data) 34 34 35
+            1195:   22(float) Load 1194
+            1196:   17(ivec4) Load 19(ballot)
+            1197:   22(float) GroupNonUniformFMul 178 PartitionedInclusiveScanNV 1195 1196
+            1198:     36(ptr) AccessChain 31(data) 1193 34 35
+                              Store 1198 1197
+            1199:      6(int) Load 8(invocation)
+            1200:     44(ptr) AccessChain 31(data) 63 34
+            1201:   23(fvec4) Load 1200
+            1202:   43(fvec2) VectorShuffle 1201 1201 0 1
+            1203:   17(ivec4) Load 19(ballot)
+            1204:   43(fvec2) GroupNonUniformFMul 178 PartitionedInclusiveScanNV 1202 1203
+            1205:     36(ptr) AccessChain 31(data) 1199 34 35
+            1206:   22(float) CompositeExtract 1204 0
+                              Store 1205 1206
+            1207:     36(ptr) AccessChain 31(data) 1199 34 189
+            1208:   22(float) CompositeExtract 1204 1
+                              Store 1207 1208
+            1209:      6(int) Load 8(invocation)
+            1210:     44(ptr) AccessChain 31(data) 33 34
+            1211:   23(fvec4) Load 1210
+            1212:   51(fvec3) VectorShuffle 1211 1211 0 1 2
+            1213:   17(ivec4) Load 19(ballot)
+            1214:   51(fvec3) GroupNonUniformFMul 178 PartitionedInclusiveScanNV 1212 1213
+            1215:     36(ptr) AccessChain 31(data) 1209 34 35
+            1216:   22(float) CompositeExtract 1214 0
+                              Store 1215 1216
+            1217:     36(ptr) AccessChain 31(data) 1209 34 189
+            1218:   22(float) CompositeExtract 1214 1
+                              Store 1217 1218
+            1219:     36(ptr) AccessChain 31(data) 1209 34 202
+            1220:   22(float) CompositeExtract 1214 2
+                              Store 1219 1220
+            1221:      6(int) Load 8(invocation)
+            1222:     44(ptr) AccessChain 31(data) 115 34
+            1223:   23(fvec4) Load 1222
+            1224:   17(ivec4) Load 19(ballot)
+            1225:   23(fvec4) GroupNonUniformFMul 178 PartitionedInclusiveScanNV 1223 1224
+            1226:     44(ptr) AccessChain 31(data) 1221 34
+                              Store 1226 1225
+            1227:      6(int) Load 8(invocation)
+            1228:     64(ptr) AccessChain 31(data) 34 63 35
+            1229:     24(int) Load 1228
+            1230:   17(ivec4) Load 19(ballot)
+            1231:     24(int) GroupNonUniformIMul 178 PartitionedInclusiveScanNV 1229 1230
+            1232:     64(ptr) AccessChain 31(data) 1227 63 35
+                              Store 1232 1231
+            1233:      6(int) Load 8(invocation)
+            1234:     71(ptr) AccessChain 31(data) 63 63
+            1235:   25(ivec4) Load 1234
+            1236:   70(ivec2) VectorShuffle 1235 1235 0 1
+            1237:   17(ivec4) Load 19(ballot)
+            1238:   70(ivec2) GroupNonUniformIMul 178 PartitionedInclusiveScanNV 1236 1237
+            1239:     64(ptr) AccessChain 31(data) 1233 63 35
+            1240:     24(int) CompositeExtract 1238 0
+                              Store 1239 1240
+            1241:     64(ptr) AccessChain 31(data) 1233 63 189
+            1242:     24(int) CompositeExtract 1238 1
+                              Store 1241 1242
+            1243:      6(int) Load 8(invocation)
+            1244:     71(ptr) AccessChain 31(data) 33 63
+            1245:   25(ivec4) Load 1244
+            1246:   78(ivec3) VectorShuffle 1245 1245 0 1 2
+            1247:   17(ivec4) Load 19(ballot)
+            1248:   78(ivec3) GroupNonUniformIMul 178 PartitionedInclusiveScanNV 1246 1247
+            1249:     64(ptr) AccessChain 31(data) 1243 63 35
+            1250:     24(int) CompositeExtract 1248 0
+                              Store 1249 1250
+            1251:     64(ptr) AccessChain 31(data) 1243 63 189
+            1252:     24(int) CompositeExtract 1248 1
+                              Store 1251 1252
+            1253:     64(ptr) AccessChain 31(data) 1243 63 202
+            1254:     24(int) CompositeExtract 1248 2
+                              Store 1253 1254
             1255:      6(int) Load 8(invocation)
-            1256:     90(ptr) AccessChain 31(data) 34 33 35
-            1257:      6(int) Load 1256
+            1256:     71(ptr) AccessChain 31(data) 115 63
+            1257:   25(ivec4) Load 1256
             1258:   17(ivec4) Load 19(ballot)
-            1259:      6(int) GroupNonUniformUMin 178 PartitionedInclusiveScanNV 1257 1258
-            1260:     90(ptr) AccessChain 31(data) 1255 33 35
+            1259:   25(ivec4) GroupNonUniformIMul 178 PartitionedInclusiveScanNV 1257 1258
+            1260:     71(ptr) AccessChain 31(data) 1255 63
                               Store 1260 1259
             1261:      6(int) Load 8(invocation)
-            1262:     40(ptr) AccessChain 31(data) 63 33
-            1263:   17(ivec4) Load 1262
-            1264:   96(ivec2) VectorShuffle 1263 1263 0 1
-            1265:   17(ivec4) Load 19(ballot)
-            1266:   96(ivec2) GroupNonUniformUMin 178 PartitionedInclusiveScanNV 1264 1265
-            1267:     40(ptr) AccessChain 31(data) 1261 33
-            1268:   17(ivec4) Load 1267
-            1269:   17(ivec4) VectorShuffle 1268 1266 4 5 2 3
-                              Store 1267 1269
-            1270:      6(int) Load 8(invocation)
-            1271:     40(ptr) AccessChain 31(data) 33 33
-            1272:   17(ivec4) Load 1271
-            1273:  103(ivec3) VectorShuffle 1272 1272 0 1 2
-            1274:   17(ivec4) Load 19(ballot)
-            1275:  103(ivec3) GroupNonUniformUMin 178 PartitionedInclusiveScanNV 1273 1274
-            1276:     40(ptr) AccessChain 31(data) 1270 33
-            1277:   17(ivec4) Load 1276
-            1278:   17(ivec4) VectorShuffle 1277 1275 4 5 6 3
-                              Store 1276 1278
-            1279:      6(int) Load 8(invocation)
-            1280:     40(ptr) AccessChain 31(data) 115 33
-            1281:   17(ivec4) Load 1280
-            1282:   17(ivec4) Load 19(ballot)
-            1283:   17(ivec4) GroupNonUniformUMin 178 PartitionedInclusiveScanNV 1281 1282
-            1284:     40(ptr) AccessChain 31(data) 1279 33
-                              Store 1284 1283
-            1285:      6(int) Load 8(invocation)
-            1286:    116(ptr) AccessChain 31(data) 34 115 35
-            1287:26(float64_t) Load 1286
-            1288:   17(ivec4) Load 19(ballot)
-            1289:26(float64_t) GroupNonUniformFMin 178 PartitionedInclusiveScanNV 1287 1288
-            1290:    116(ptr) AccessChain 31(data) 1285 115 35
-                              Store 1290 1289
-            1291:      6(int) Load 8(invocation)
-            1292:    123(ptr) AccessChain 31(data) 63 115
-            1293: 27(f64vec4) Load 1292
-            1294:122(f64vec2) VectorShuffle 1293 1293 0 1
-            1295:   17(ivec4) Load 19(ballot)
-            1296:122(f64vec2) GroupNonUniformFMin 178 PartitionedInclusiveScanNV 1294 1295
-            1297:    123(ptr) AccessChain 31(data) 1291 115
-            1298: 27(f64vec4) Load 1297
-            1299: 27(f64vec4) VectorShuffle 1298 1296 4 5 2 3
-                              Store 1297 1299
-            1300:      6(int) Load 8(invocation)
-            1301:    123(ptr) AccessChain 31(data) 33 115
-            1302: 27(f64vec4) Load 1301
-            1303:130(f64vec3) VectorShuffle 1302 1302 0 1 2
-            1304:   17(ivec4) Load 19(ballot)
-            1305:130(f64vec3) GroupNonUniformFMin 178 PartitionedInclusiveScanNV 1303 1304
-            1306:    123(ptr) AccessChain 31(data) 1300 115
-            1307: 27(f64vec4) Load 1306
-            1308: 27(f64vec4) VectorShuffle 1307 1305 4 5 6 3
-                              Store 1306 1308
-            1309:      6(int) Load 8(invocation)
-            1310:    123(ptr) AccessChain 31(data) 115 115
-            1311: 27(f64vec4) Load 1310
-            1312:   17(ivec4) Load 19(ballot)
-            1313: 27(f64vec4) GroupNonUniformFMin 178 PartitionedInclusiveScanNV 1311 1312
-            1314:    123(ptr) AccessChain 31(data) 1309 115
-                              Store 1314 1313
-            1315:      6(int) Load 8(invocation)
-            1316:     36(ptr) AccessChain 31(data) 34 34 35
-            1317:   22(float) Load 1316
-            1318:   17(ivec4) Load 19(ballot)
-            1319:   22(float) GroupNonUniformFMax 178 PartitionedInclusiveScanNV 1317 1318
-            1320:     36(ptr) AccessChain 31(data) 1315 34 35
-                              Store 1320 1319
-            1321:      6(int) Load 8(invocation)
-            1322:     44(ptr) AccessChain 31(data) 63 34
-            1323:   23(fvec4) Load 1322
-            1324:   43(fvec2) VectorShuffle 1323 1323 0 1
-            1325:   17(ivec4) Load 19(ballot)
-            1326:   43(fvec2) GroupNonUniformFMax 178 PartitionedInclusiveScanNV 1324 1325
-            1327:     44(ptr) AccessChain 31(data) 1321 34
-            1328:   23(fvec4) Load 1327
-            1329:   23(fvec4) VectorShuffle 1328 1326 4 5 2 3
-                              Store 1327 1329
-            1330:      6(int) Load 8(invocation)
-            1331:     44(ptr) AccessChain 31(data) 33 34
-            1332:   23(fvec4) Load 1331
-            1333:   51(fvec3) VectorShuffle 1332 1332 0 1 2
-            1334:   17(ivec4) Load 19(ballot)
-            1335:   51(fvec3) GroupNonUniformFMax 178 PartitionedInclusiveScanNV 1333 1334
-            1336:     44(ptr) AccessChain 31(data) 1330 34
+            1262:     90(ptr) AccessChain 31(data) 34 33 35
+            1263:      6(int) Load 1262
+            1264:   17(ivec4) Load 19(ballot)
+            1265:      6(int) GroupNonUniformIMul 178 PartitionedInclusiveScanNV 1263 1264
+            1266:     90(ptr) AccessChain 31(data) 1261 33 35
+                              Store 1266 1265
+            1267:      6(int) Load 8(invocation)
+            1268:     40(ptr) AccessChain 31(data) 63 33
+            1269:   17(ivec4) Load 1268
+            1270:   96(ivec2) VectorShuffle 1269 1269 0 1
+            1271:   17(ivec4) Load 19(ballot)
+            1272:   96(ivec2) GroupNonUniformIMul 178 PartitionedInclusiveScanNV 1270 1271
+            1273:     90(ptr) AccessChain 31(data) 1267 33 35
+            1274:      6(int) CompositeExtract 1272 0
+                              Store 1273 1274
+            1275:     90(ptr) AccessChain 31(data) 1267 33 189
+            1276:      6(int) CompositeExtract 1272 1
+                              Store 1275 1276
+            1277:      6(int) Load 8(invocation)
+            1278:     40(ptr) AccessChain 31(data) 33 33
+            1279:   17(ivec4) Load 1278
+            1280:  103(ivec3) VectorShuffle 1279 1279 0 1 2
+            1281:   17(ivec4) Load 19(ballot)
+            1282:  103(ivec3) GroupNonUniformIMul 178 PartitionedInclusiveScanNV 1280 1281
+            1283:     90(ptr) AccessChain 31(data) 1277 33 35
+            1284:      6(int) CompositeExtract 1282 0
+                              Store 1283 1284
+            1285:     90(ptr) AccessChain 31(data) 1277 33 189
+            1286:      6(int) CompositeExtract 1282 1
+                              Store 1285 1286
+            1287:     90(ptr) AccessChain 31(data) 1277 33 202
+            1288:      6(int) CompositeExtract 1282 2
+                              Store 1287 1288
+            1289:      6(int) Load 8(invocation)
+            1290:     40(ptr) AccessChain 31(data) 115 33
+            1291:   17(ivec4) Load 1290
+            1292:   17(ivec4) Load 19(ballot)
+            1293:   17(ivec4) GroupNonUniformIMul 178 PartitionedInclusiveScanNV 1291 1292
+            1294:     40(ptr) AccessChain 31(data) 1289 33
+                              Store 1294 1293
+            1295:      6(int) Load 8(invocation)
+            1296:    116(ptr) AccessChain 31(data) 34 115 35
+            1297:26(float64_t) Load 1296
+            1298:   17(ivec4) Load 19(ballot)
+            1299:26(float64_t) GroupNonUniformFMul 178 PartitionedInclusiveScanNV 1297 1298
+            1300:    116(ptr) AccessChain 31(data) 1295 115 35
+                              Store 1300 1299
+            1301:      6(int) Load 8(invocation)
+            1302:    123(ptr) AccessChain 31(data) 63 115
+            1303: 27(f64vec4) Load 1302
+            1304:122(f64vec2) VectorShuffle 1303 1303 0 1
+            1305:   17(ivec4) Load 19(ballot)
+            1306:122(f64vec2) GroupNonUniformFMul 178 PartitionedInclusiveScanNV 1304 1305
+            1307:    116(ptr) AccessChain 31(data) 1301 115 35
+            1308:26(float64_t) CompositeExtract 1306 0
+                              Store 1307 1308
+            1309:    116(ptr) AccessChain 31(data) 1301 115 189
+            1310:26(float64_t) CompositeExtract 1306 1
+                              Store 1309 1310
+            1311:      6(int) Load 8(invocation)
+            1312:    123(ptr) AccessChain 31(data) 33 115
+            1313: 27(f64vec4) Load 1312
+            1314:130(f64vec3) VectorShuffle 1313 1313 0 1 2
+            1315:   17(ivec4) Load 19(ballot)
+            1316:130(f64vec3) GroupNonUniformFMul 178 PartitionedInclusiveScanNV 1314 1315
+            1317:    116(ptr) AccessChain 31(data) 1311 115 35
+            1318:26(float64_t) CompositeExtract 1316 0
+                              Store 1317 1318
+            1319:    116(ptr) AccessChain 31(data) 1311 115 189
+            1320:26(float64_t) CompositeExtract 1316 1
+                              Store 1319 1320
+            1321:    116(ptr) AccessChain 31(data) 1311 115 202
+            1322:26(float64_t) CompositeExtract 1316 2
+                              Store 1321 1322
+            1323:      6(int) Load 8(invocation)
+            1324:    123(ptr) AccessChain 31(data) 115 115
+            1325: 27(f64vec4) Load 1324
+            1326:   17(ivec4) Load 19(ballot)
+            1327: 27(f64vec4) GroupNonUniformFMul 178 PartitionedInclusiveScanNV 1325 1326
+            1328:    123(ptr) AccessChain 31(data) 1323 115
+                              Store 1328 1327
+            1329:      6(int) Load 8(invocation)
+            1330:     36(ptr) AccessChain 31(data) 34 34 35
+            1331:   22(float) Load 1330
+            1332:   17(ivec4) Load 19(ballot)
+            1333:   22(float) GroupNonUniformFMin 178 PartitionedInclusiveScanNV 1331 1332
+            1334:     36(ptr) AccessChain 31(data) 1329 34 35
+                              Store 1334 1333
+            1335:      6(int) Load 8(invocation)
+            1336:     44(ptr) AccessChain 31(data) 63 34
             1337:   23(fvec4) Load 1336
-            1338:   23(fvec4) VectorShuffle 1337 1335 4 5 6 3
-                              Store 1336 1338
-            1339:      6(int) Load 8(invocation)
-            1340:     44(ptr) AccessChain 31(data) 115 34
-            1341:   23(fvec4) Load 1340
-            1342:   17(ivec4) Load 19(ballot)
-            1343:   23(fvec4) GroupNonUniformFMax 178 PartitionedInclusiveScanNV 1341 1342
-            1344:     44(ptr) AccessChain 31(data) 1339 34
-                              Store 1344 1343
+            1338:   43(fvec2) VectorShuffle 1337 1337 0 1
+            1339:   17(ivec4) Load 19(ballot)
+            1340:   43(fvec2) GroupNonUniformFMin 178 PartitionedInclusiveScanNV 1338 1339
+            1341:     36(ptr) AccessChain 31(data) 1335 34 35
+            1342:   22(float) CompositeExtract 1340 0
+                              Store 1341 1342
+            1343:     36(ptr) AccessChain 31(data) 1335 34 189
+            1344:   22(float) CompositeExtract 1340 1
+                              Store 1343 1344
             1345:      6(int) Load 8(invocation)
-            1346:     64(ptr) AccessChain 31(data) 34 63 35
-            1347:     24(int) Load 1346
-            1348:   17(ivec4) Load 19(ballot)
-            1349:     24(int) GroupNonUniformSMax 178 PartitionedInclusiveScanNV 1347 1348
-            1350:     64(ptr) AccessChain 31(data) 1345 63 35
-                              Store 1350 1349
-            1351:      6(int) Load 8(invocation)
-            1352:     71(ptr) AccessChain 31(data) 63 63
-            1353:   25(ivec4) Load 1352
-            1354:   70(ivec2) VectorShuffle 1353 1353 0 1
-            1355:   17(ivec4) Load 19(ballot)
-            1356:   70(ivec2) GroupNonUniformSMax 178 PartitionedInclusiveScanNV 1354 1355
-            1357:     71(ptr) AccessChain 31(data) 1351 63
-            1358:   25(ivec4) Load 1357
-            1359:   25(ivec4) VectorShuffle 1358 1356 4 5 2 3
-                              Store 1357 1359
-            1360:      6(int) Load 8(invocation)
-            1361:     71(ptr) AccessChain 31(data) 33 63
-            1362:   25(ivec4) Load 1361
-            1363:   78(ivec3) VectorShuffle 1362 1362 0 1 2
-            1364:   17(ivec4) Load 19(ballot)
-            1365:   78(ivec3) GroupNonUniformSMax 178 PartitionedInclusiveScanNV 1363 1364
-            1366:     71(ptr) AccessChain 31(data) 1360 63
-            1367:   25(ivec4) Load 1366
-            1368:   25(ivec4) VectorShuffle 1367 1365 4 5 6 3
-                              Store 1366 1368
+            1346:     44(ptr) AccessChain 31(data) 33 34
+            1347:   23(fvec4) Load 1346
+            1348:   51(fvec3) VectorShuffle 1347 1347 0 1 2
+            1349:   17(ivec4) Load 19(ballot)
+            1350:   51(fvec3) GroupNonUniformFMin 178 PartitionedInclusiveScanNV 1348 1349
+            1351:     36(ptr) AccessChain 31(data) 1345 34 35
+            1352:   22(float) CompositeExtract 1350 0
+                              Store 1351 1352
+            1353:     36(ptr) AccessChain 31(data) 1345 34 189
+            1354:   22(float) CompositeExtract 1350 1
+                              Store 1353 1354
+            1355:     36(ptr) AccessChain 31(data) 1345 34 202
+            1356:   22(float) CompositeExtract 1350 2
+                              Store 1355 1356
+            1357:      6(int) Load 8(invocation)
+            1358:     44(ptr) AccessChain 31(data) 115 34
+            1359:   23(fvec4) Load 1358
+            1360:   17(ivec4) Load 19(ballot)
+            1361:   23(fvec4) GroupNonUniformFMin 178 PartitionedInclusiveScanNV 1359 1360
+            1362:     44(ptr) AccessChain 31(data) 1357 34
+                              Store 1362 1361
+            1363:      6(int) Load 8(invocation)
+            1364:     64(ptr) AccessChain 31(data) 34 63 35
+            1365:     24(int) Load 1364
+            1366:   17(ivec4) Load 19(ballot)
+            1367:     24(int) GroupNonUniformSMin 178 PartitionedInclusiveScanNV 1365 1366
+            1368:     64(ptr) AccessChain 31(data) 1363 63 35
+                              Store 1368 1367
             1369:      6(int) Load 8(invocation)
-            1370:     71(ptr) AccessChain 31(data) 115 63
+            1370:     71(ptr) AccessChain 31(data) 63 63
             1371:   25(ivec4) Load 1370
-            1372:   17(ivec4) Load 19(ballot)
-            1373:   25(ivec4) GroupNonUniformSMax 178 PartitionedInclusiveScanNV 1371 1372
-            1374:     71(ptr) AccessChain 31(data) 1369 63
-                              Store 1374 1373
-            1375:      6(int) Load 8(invocation)
-            1376:     90(ptr) AccessChain 31(data) 34 33 35
-            1377:      6(int) Load 1376
-            1378:   17(ivec4) Load 19(ballot)
-            1379:      6(int) GroupNonUniformUMax 178 PartitionedInclusiveScanNV 1377 1378
-            1380:     90(ptr) AccessChain 31(data) 1375 33 35
-                              Store 1380 1379
-            1381:      6(int) Load 8(invocation)
-            1382:     40(ptr) AccessChain 31(data) 63 33
-            1383:   17(ivec4) Load 1382
-            1384:   96(ivec2) VectorShuffle 1383 1383 0 1
-            1385:   17(ivec4) Load 19(ballot)
-            1386:   96(ivec2) GroupNonUniformUMax 178 PartitionedInclusiveScanNV 1384 1385
-            1387:     40(ptr) AccessChain 31(data) 1381 33
-            1388:   17(ivec4) Load 1387
-            1389:   17(ivec4) VectorShuffle 1388 1386 4 5 2 3
-                              Store 1387 1389
-            1390:      6(int) Load 8(invocation)
-            1391:     40(ptr) AccessChain 31(data) 33 33
-            1392:   17(ivec4) Load 1391
-            1393:  103(ivec3) VectorShuffle 1392 1392 0 1 2
+            1372:   70(ivec2) VectorShuffle 1371 1371 0 1
+            1373:   17(ivec4) Load 19(ballot)
+            1374:   70(ivec2) GroupNonUniformSMin 178 PartitionedInclusiveScanNV 1372 1373
+            1375:     64(ptr) AccessChain 31(data) 1369 63 35
+            1376:     24(int) CompositeExtract 1374 0
+                              Store 1375 1376
+            1377:     64(ptr) AccessChain 31(data) 1369 63 189
+            1378:     24(int) CompositeExtract 1374 1
+                              Store 1377 1378
+            1379:      6(int) Load 8(invocation)
+            1380:     71(ptr) AccessChain 31(data) 33 63
+            1381:   25(ivec4) Load 1380
+            1382:   78(ivec3) VectorShuffle 1381 1381 0 1 2
+            1383:   17(ivec4) Load 19(ballot)
+            1384:   78(ivec3) GroupNonUniformSMin 178 PartitionedInclusiveScanNV 1382 1383
+            1385:     64(ptr) AccessChain 31(data) 1379 63 35
+            1386:     24(int) CompositeExtract 1384 0
+                              Store 1385 1386
+            1387:     64(ptr) AccessChain 31(data) 1379 63 189
+            1388:     24(int) CompositeExtract 1384 1
+                              Store 1387 1388
+            1389:     64(ptr) AccessChain 31(data) 1379 63 202
+            1390:     24(int) CompositeExtract 1384 2
+                              Store 1389 1390
+            1391:      6(int) Load 8(invocation)
+            1392:     71(ptr) AccessChain 31(data) 115 63
+            1393:   25(ivec4) Load 1392
             1394:   17(ivec4) Load 19(ballot)
-            1395:  103(ivec3) GroupNonUniformUMax 178 PartitionedInclusiveScanNV 1393 1394
-            1396:     40(ptr) AccessChain 31(data) 1390 33
-            1397:   17(ivec4) Load 1396
-            1398:   17(ivec4) VectorShuffle 1397 1395 4 5 6 3
-                              Store 1396 1398
-            1399:      6(int) Load 8(invocation)
-            1400:     40(ptr) AccessChain 31(data) 115 33
-            1401:   17(ivec4) Load 1400
-            1402:   17(ivec4) Load 19(ballot)
-            1403:   17(ivec4) GroupNonUniformUMax 178 PartitionedInclusiveScanNV 1401 1402
-            1404:     40(ptr) AccessChain 31(data) 1399 33
-                              Store 1404 1403
-            1405:      6(int) Load 8(invocation)
-            1406:    116(ptr) AccessChain 31(data) 34 115 35
-            1407:26(float64_t) Load 1406
-            1408:   17(ivec4) Load 19(ballot)
-            1409:26(float64_t) GroupNonUniformFMax 178 PartitionedInclusiveScanNV 1407 1408
-            1410:    116(ptr) AccessChain 31(data) 1405 115 35
-                              Store 1410 1409
-            1411:      6(int) Load 8(invocation)
-            1412:    123(ptr) AccessChain 31(data) 63 115
-            1413: 27(f64vec4) Load 1412
-            1414:122(f64vec2) VectorShuffle 1413 1413 0 1
-            1415:   17(ivec4) Load 19(ballot)
-            1416:122(f64vec2) GroupNonUniformFMax 178 PartitionedInclusiveScanNV 1414 1415
-            1417:    123(ptr) AccessChain 31(data) 1411 115
-            1418: 27(f64vec4) Load 1417
-            1419: 27(f64vec4) VectorShuffle 1418 1416 4 5 2 3
-                              Store 1417 1419
-            1420:      6(int) Load 8(invocation)
-            1421:    123(ptr) AccessChain 31(data) 33 115
-            1422: 27(f64vec4) Load 1421
-            1423:130(f64vec3) VectorShuffle 1422 1422 0 1 2
-            1424:   17(ivec4) Load 19(ballot)
-            1425:130(f64vec3) GroupNonUniformFMax 178 PartitionedInclusiveScanNV 1423 1424
-            1426:    123(ptr) AccessChain 31(data) 1420 115
-            1427: 27(f64vec4) Load 1426
-            1428: 27(f64vec4) VectorShuffle 1427 1425 4 5 6 3
-                              Store 1426 1428
-            1429:      6(int) Load 8(invocation)
-            1430:    123(ptr) AccessChain 31(data) 115 115
-            1431: 27(f64vec4) Load 1430
-            1432:   17(ivec4) Load 19(ballot)
-            1433: 27(f64vec4) GroupNonUniformFMax 178 PartitionedInclusiveScanNV 1431 1432
-            1434:    123(ptr) AccessChain 31(data) 1429 115
-                              Store 1434 1433
-            1435:      6(int) Load 8(invocation)
-            1436:     64(ptr) AccessChain 31(data) 34 63 35
-            1437:     24(int) Load 1436
-            1438:   17(ivec4) Load 19(ballot)
-            1439:     24(int) GroupNonUniformBitwiseAnd 178 PartitionedInclusiveScanNV 1437 1438
-            1440:     64(ptr) AccessChain 31(data) 1435 63 35
-                              Store 1440 1439
-            1441:      6(int) Load 8(invocation)
-            1442:     71(ptr) AccessChain 31(data) 63 63
-            1443:   25(ivec4) Load 1442
-            1444:   70(ivec2) VectorShuffle 1443 1443 0 1
-            1445:   17(ivec4) Load 19(ballot)
-            1446:   70(ivec2) GroupNonUniformBitwiseAnd 178 PartitionedInclusiveScanNV 1444 1445
-            1447:     71(ptr) AccessChain 31(data) 1441 63
-            1448:   25(ivec4) Load 1447
-            1449:   25(ivec4) VectorShuffle 1448 1446 4 5 2 3
-                              Store 1447 1449
-            1450:      6(int) Load 8(invocation)
-            1451:     71(ptr) AccessChain 31(data) 33 63
-            1452:   25(ivec4) Load 1451
-            1453:   78(ivec3) VectorShuffle 1452 1452 0 1 2
-            1454:   17(ivec4) Load 19(ballot)
-            1455:   78(ivec3) GroupNonUniformBitwiseAnd 178 PartitionedInclusiveScanNV 1453 1454
-            1456:     71(ptr) AccessChain 31(data) 1450 63
-            1457:   25(ivec4) Load 1456
-            1458:   25(ivec4) VectorShuffle 1457 1455 4 5 6 3
-                              Store 1456 1458
+            1395:   25(ivec4) GroupNonUniformSMin 178 PartitionedInclusiveScanNV 1393 1394
+            1396:     71(ptr) AccessChain 31(data) 1391 63
+                              Store 1396 1395
+            1397:      6(int) Load 8(invocation)
+            1398:     90(ptr) AccessChain 31(data) 34 33 35
+            1399:      6(int) Load 1398
+            1400:   17(ivec4) Load 19(ballot)
+            1401:      6(int) GroupNonUniformUMin 178 PartitionedInclusiveScanNV 1399 1400
+            1402:     90(ptr) AccessChain 31(data) 1397 33 35
+                              Store 1402 1401
+            1403:      6(int) Load 8(invocation)
+            1404:     40(ptr) AccessChain 31(data) 63 33
+            1405:   17(ivec4) Load 1404
+            1406:   96(ivec2) VectorShuffle 1405 1405 0 1
+            1407:   17(ivec4) Load 19(ballot)
+            1408:   96(ivec2) GroupNonUniformUMin 178 PartitionedInclusiveScanNV 1406 1407
+            1409:     90(ptr) AccessChain 31(data) 1403 33 35
+            1410:      6(int) CompositeExtract 1408 0
+                              Store 1409 1410
+            1411:     90(ptr) AccessChain 31(data) 1403 33 189
+            1412:      6(int) CompositeExtract 1408 1
+                              Store 1411 1412
+            1413:      6(int) Load 8(invocation)
+            1414:     40(ptr) AccessChain 31(data) 33 33
+            1415:   17(ivec4) Load 1414
+            1416:  103(ivec3) VectorShuffle 1415 1415 0 1 2
+            1417:   17(ivec4) Load 19(ballot)
+            1418:  103(ivec3) GroupNonUniformUMin 178 PartitionedInclusiveScanNV 1416 1417
+            1419:     90(ptr) AccessChain 31(data) 1413 33 35
+            1420:      6(int) CompositeExtract 1418 0
+                              Store 1419 1420
+            1421:     90(ptr) AccessChain 31(data) 1413 33 189
+            1422:      6(int) CompositeExtract 1418 1
+                              Store 1421 1422
+            1423:     90(ptr) AccessChain 31(data) 1413 33 202
+            1424:      6(int) CompositeExtract 1418 2
+                              Store 1423 1424
+            1425:      6(int) Load 8(invocation)
+            1426:     40(ptr) AccessChain 31(data) 115 33
+            1427:   17(ivec4) Load 1426
+            1428:   17(ivec4) Load 19(ballot)
+            1429:   17(ivec4) GroupNonUniformUMin 178 PartitionedInclusiveScanNV 1427 1428
+            1430:     40(ptr) AccessChain 31(data) 1425 33
+                              Store 1430 1429
+            1431:      6(int) Load 8(invocation)
+            1432:    116(ptr) AccessChain 31(data) 34 115 35
+            1433:26(float64_t) Load 1432
+            1434:   17(ivec4) Load 19(ballot)
+            1435:26(float64_t) GroupNonUniformFMin 178 PartitionedInclusiveScanNV 1433 1434
+            1436:    116(ptr) AccessChain 31(data) 1431 115 35
+                              Store 1436 1435
+            1437:      6(int) Load 8(invocation)
+            1438:    123(ptr) AccessChain 31(data) 63 115
+            1439: 27(f64vec4) Load 1438
+            1440:122(f64vec2) VectorShuffle 1439 1439 0 1
+            1441:   17(ivec4) Load 19(ballot)
+            1442:122(f64vec2) GroupNonUniformFMin 178 PartitionedInclusiveScanNV 1440 1441
+            1443:    116(ptr) AccessChain 31(data) 1437 115 35
+            1444:26(float64_t) CompositeExtract 1442 0
+                              Store 1443 1444
+            1445:    116(ptr) AccessChain 31(data) 1437 115 189
+            1446:26(float64_t) CompositeExtract 1442 1
+                              Store 1445 1446
+            1447:      6(int) Load 8(invocation)
+            1448:    123(ptr) AccessChain 31(data) 33 115
+            1449: 27(f64vec4) Load 1448
+            1450:130(f64vec3) VectorShuffle 1449 1449 0 1 2
+            1451:   17(ivec4) Load 19(ballot)
+            1452:130(f64vec3) GroupNonUniformFMin 178 PartitionedInclusiveScanNV 1450 1451
+            1453:    116(ptr) AccessChain 31(data) 1447 115 35
+            1454:26(float64_t) CompositeExtract 1452 0
+                              Store 1453 1454
+            1455:    116(ptr) AccessChain 31(data) 1447 115 189
+            1456:26(float64_t) CompositeExtract 1452 1
+                              Store 1455 1456
+            1457:    116(ptr) AccessChain 31(data) 1447 115 202
+            1458:26(float64_t) CompositeExtract 1452 2
+                              Store 1457 1458
             1459:      6(int) Load 8(invocation)
-            1460:     71(ptr) AccessChain 31(data) 115 63
-            1461:   25(ivec4) Load 1460
+            1460:    123(ptr) AccessChain 31(data) 115 115
+            1461: 27(f64vec4) Load 1460
             1462:   17(ivec4) Load 19(ballot)
-            1463:   25(ivec4) GroupNonUniformBitwiseAnd 178 PartitionedInclusiveScanNV 1461 1462
-            1464:     71(ptr) AccessChain 31(data) 1459 63
+            1463: 27(f64vec4) GroupNonUniformFMin 178 PartitionedInclusiveScanNV 1461 1462
+            1464:    123(ptr) AccessChain 31(data) 1459 115
                               Store 1464 1463
             1465:      6(int) Load 8(invocation)
-            1466:     90(ptr) AccessChain 31(data) 34 33 35
-            1467:      6(int) Load 1466
+            1466:     36(ptr) AccessChain 31(data) 34 34 35
+            1467:   22(float) Load 1466
             1468:   17(ivec4) Load 19(ballot)
-            1469:      6(int) GroupNonUniformBitwiseAnd 178 PartitionedInclusiveScanNV 1467 1468
-            1470:     90(ptr) AccessChain 31(data) 1465 33 35
+            1469:   22(float) GroupNonUniformFMax 178 PartitionedInclusiveScanNV 1467 1468
+            1470:     36(ptr) AccessChain 31(data) 1465 34 35
                               Store 1470 1469
             1471:      6(int) Load 8(invocation)
-            1472:     40(ptr) AccessChain 31(data) 63 33
-            1473:   17(ivec4) Load 1472
-            1474:   96(ivec2) VectorShuffle 1473 1473 0 1
+            1472:     44(ptr) AccessChain 31(data) 63 34
+            1473:   23(fvec4) Load 1472
+            1474:   43(fvec2) VectorShuffle 1473 1473 0 1
             1475:   17(ivec4) Load 19(ballot)
-            1476:   96(ivec2) GroupNonUniformBitwiseAnd 178 PartitionedInclusiveScanNV 1474 1475
-            1477:     40(ptr) AccessChain 31(data) 1471 33
-            1478:   17(ivec4) Load 1477
-            1479:   17(ivec4) VectorShuffle 1478 1476 4 5 2 3
-                              Store 1477 1479
-            1480:      6(int) Load 8(invocation)
-            1481:     40(ptr) AccessChain 31(data) 33 33
-            1482:   17(ivec4) Load 1481
-            1483:  103(ivec3) VectorShuffle 1482 1482 0 1 2
-            1484:   17(ivec4) Load 19(ballot)
-            1485:  103(ivec3) GroupNonUniformBitwiseAnd 178 PartitionedInclusiveScanNV 1483 1484
-            1486:     40(ptr) AccessChain 31(data) 1480 33
-            1487:   17(ivec4) Load 1486
-            1488:   17(ivec4) VectorShuffle 1487 1485 4 5 6 3
-                              Store 1486 1488
-            1489:      6(int) Load 8(invocation)
-            1490:     40(ptr) AccessChain 31(data) 115 33
-            1491:   17(ivec4) Load 1490
-            1492:   17(ivec4) Load 19(ballot)
-            1493:   17(ivec4) GroupNonUniformBitwiseAnd 178 PartitionedInclusiveScanNV 1491 1492
-            1494:     40(ptr) AccessChain 31(data) 1489 33
-                              Store 1494 1493
-            1495:      6(int) Load 8(invocation)
-            1496:     64(ptr) AccessChain 31(data) 34 63 35
-            1497:     24(int) Load 1496
-            1498:   144(bool) SLessThan 1497 34
-            1499:   17(ivec4) Load 19(ballot)
-            1500:   144(bool) GroupNonUniformLogicalAnd 178 PartitionedInclusiveScanNV 1498 1499
-            1501:     24(int) Select 1500 63 34
-            1502:     64(ptr) AccessChain 31(data) 1495 63 35
-                              Store 1502 1501
-            1503:      6(int) Load 8(invocation)
-            1504:     71(ptr) AccessChain 31(data) 63 63
-            1505:   25(ivec4) Load 1504
-            1506:   70(ivec2) VectorShuffle 1505 1505 0 1
-            1507:  152(bvec2) SLessThan 1506 727
-            1508:   17(ivec4) Load 19(ballot)
-            1509:  152(bvec2) GroupNonUniformLogicalAnd 178 PartitionedInclusiveScanNV 1507 1508
-            1510:   70(ivec2) Select 1509 731 727
-            1511:     71(ptr) AccessChain 31(data) 1503 63
-            1512:   25(ivec4) Load 1511
-            1513:   25(ivec4) VectorShuffle 1512 1510 4 5 2 3
-                              Store 1511 1513
-            1514:      6(int) Load 8(invocation)
-            1515:     71(ptr) AccessChain 31(data) 63 63
-            1516:   25(ivec4) Load 1515
-            1517:   78(ivec3) VectorShuffle 1516 1516 0 1 2
-            1518:  161(bvec3) SLessThan 1517 740
+            1476:   43(fvec2) GroupNonUniformFMax 178 PartitionedInclusiveScanNV 1474 1475
+            1477:     36(ptr) AccessChain 31(data) 1471 34 35
+            1478:   22(float) CompositeExtract 1476 0
+                              Store 1477 1478
+            1479:     36(ptr) AccessChain 31(data) 1471 34 189
+            1480:   22(float) CompositeExtract 1476 1
+                              Store 1479 1480
+            1481:      6(int) Load 8(invocation)
+            1482:     44(ptr) AccessChain 31(data) 33 34
+            1483:   23(fvec4) Load 1482
+            1484:   51(fvec3) VectorShuffle 1483 1483 0 1 2
+            1485:   17(ivec4) Load 19(ballot)
+            1486:   51(fvec3) GroupNonUniformFMax 178 PartitionedInclusiveScanNV 1484 1485
+            1487:     36(ptr) AccessChain 31(data) 1481 34 35
+            1488:   22(float) CompositeExtract 1486 0
+                              Store 1487 1488
+            1489:     36(ptr) AccessChain 31(data) 1481 34 189
+            1490:   22(float) CompositeExtract 1486 1
+                              Store 1489 1490
+            1491:     36(ptr) AccessChain 31(data) 1481 34 202
+            1492:   22(float) CompositeExtract 1486 2
+                              Store 1491 1492
+            1493:      6(int) Load 8(invocation)
+            1494:     44(ptr) AccessChain 31(data) 115 34
+            1495:   23(fvec4) Load 1494
+            1496:   17(ivec4) Load 19(ballot)
+            1497:   23(fvec4) GroupNonUniformFMax 178 PartitionedInclusiveScanNV 1495 1496
+            1498:     44(ptr) AccessChain 31(data) 1493 34
+                              Store 1498 1497
+            1499:      6(int) Load 8(invocation)
+            1500:     64(ptr) AccessChain 31(data) 34 63 35
+            1501:     24(int) Load 1500
+            1502:   17(ivec4) Load 19(ballot)
+            1503:     24(int) GroupNonUniformSMax 178 PartitionedInclusiveScanNV 1501 1502
+            1504:     64(ptr) AccessChain 31(data) 1499 63 35
+                              Store 1504 1503
+            1505:      6(int) Load 8(invocation)
+            1506:     71(ptr) AccessChain 31(data) 63 63
+            1507:   25(ivec4) Load 1506
+            1508:   70(ivec2) VectorShuffle 1507 1507 0 1
+            1509:   17(ivec4) Load 19(ballot)
+            1510:   70(ivec2) GroupNonUniformSMax 178 PartitionedInclusiveScanNV 1508 1509
+            1511:     64(ptr) AccessChain 31(data) 1505 63 35
+            1512:     24(int) CompositeExtract 1510 0
+                              Store 1511 1512
+            1513:     64(ptr) AccessChain 31(data) 1505 63 189
+            1514:     24(int) CompositeExtract 1510 1
+                              Store 1513 1514
+            1515:      6(int) Load 8(invocation)
+            1516:     71(ptr) AccessChain 31(data) 33 63
+            1517:   25(ivec4) Load 1516
+            1518:   78(ivec3) VectorShuffle 1517 1517 0 1 2
             1519:   17(ivec4) Load 19(ballot)
-            1520:  161(bvec3) GroupNonUniformLogicalAnd 178 PartitionedInclusiveScanNV 1518 1519
-            1521:   78(ivec3) Select 1520 744 740
-            1522:     71(ptr) AccessChain 31(data) 1514 63
-            1523:   25(ivec4) Load 1522
-            1524:   25(ivec4) VectorShuffle 1523 1521 4 5 6 3
-                              Store 1522 1524
-            1525:      6(int) Load 8(invocation)
-            1526:     71(ptr) AccessChain 31(data) 63 63
-            1527:   25(ivec4) Load 1526
-            1528:  169(bvec4) SLessThan 1527 752
-            1529:   17(ivec4) Load 19(ballot)
-            1530:  169(bvec4) GroupNonUniformLogicalAnd 178 PartitionedInclusiveScanNV 1528 1529
-            1531:   25(ivec4) Select 1530 756 752
-            1532:     71(ptr) AccessChain 31(data) 1525 63
+            1520:   78(ivec3) GroupNonUniformSMax 178 PartitionedInclusiveScanNV 1518 1519
+            1521:     64(ptr) AccessChain 31(data) 1515 63 35
+            1522:     24(int) CompositeExtract 1520 0
+                              Store 1521 1522
+            1523:     64(ptr) AccessChain 31(data) 1515 63 189
+            1524:     24(int) CompositeExtract 1520 1
+                              Store 1523 1524
+            1525:     64(ptr) AccessChain 31(data) 1515 63 202
+            1526:     24(int) CompositeExtract 1520 2
+                              Store 1525 1526
+            1527:      6(int) Load 8(invocation)
+            1528:     71(ptr) AccessChain 31(data) 115 63
+            1529:   25(ivec4) Load 1528
+            1530:   17(ivec4) Load 19(ballot)
+            1531:   25(ivec4) GroupNonUniformSMax 178 PartitionedInclusiveScanNV 1529 1530
+            1532:     71(ptr) AccessChain 31(data) 1527 63
                               Store 1532 1531
             1533:      6(int) Load 8(invocation)
-            1534:     64(ptr) AccessChain 31(data) 34 63 35
-            1535:     24(int) Load 1534
+            1534:     90(ptr) AccessChain 31(data) 34 33 35
+            1535:      6(int) Load 1534
             1536:   17(ivec4) Load 19(ballot)
-            1537:     24(int) GroupNonUniformBitwiseOr 178 PartitionedInclusiveScanNV 1535 1536
-            1538:     64(ptr) AccessChain 31(data) 1533 63 35
+            1537:      6(int) GroupNonUniformUMax 178 PartitionedInclusiveScanNV 1535 1536
+            1538:     90(ptr) AccessChain 31(data) 1533 33 35
                               Store 1538 1537
             1539:      6(int) Load 8(invocation)
-            1540:     71(ptr) AccessChain 31(data) 63 63
-            1541:   25(ivec4) Load 1540
-            1542:   70(ivec2) VectorShuffle 1541 1541 0 1
+            1540:     40(ptr) AccessChain 31(data) 63 33
+            1541:   17(ivec4) Load 1540
+            1542:   96(ivec2) VectorShuffle 1541 1541 0 1
             1543:   17(ivec4) Load 19(ballot)
-            1544:   70(ivec2) GroupNonUniformBitwiseOr 178 PartitionedInclusiveScanNV 1542 1543
-            1545:     71(ptr) AccessChain 31(data) 1539 63
-            1546:   25(ivec4) Load 1545
-            1547:   25(ivec4) VectorShuffle 1546 1544 4 5 2 3
-                              Store 1545 1547
-            1548:      6(int) Load 8(invocation)
-            1549:     71(ptr) AccessChain 31(data) 33 63
-            1550:   25(ivec4) Load 1549
-            1551:   78(ivec3) VectorShuffle 1550 1550 0 1 2
-            1552:   17(ivec4) Load 19(ballot)
-            1553:   78(ivec3) GroupNonUniformBitwiseOr 178 PartitionedInclusiveScanNV 1551 1552
-            1554:     71(ptr) AccessChain 31(data) 1548 63
-            1555:   25(ivec4) Load 1554
-            1556:   25(ivec4) VectorShuffle 1555 1553 4 5 6 3
-                              Store 1554 1556
-            1557:      6(int) Load 8(invocation)
-            1558:     71(ptr) AccessChain 31(data) 115 63
-            1559:   25(ivec4) Load 1558
-            1560:   17(ivec4) Load 19(ballot)
-            1561:   25(ivec4) GroupNonUniformBitwiseOr 178 PartitionedInclusiveScanNV 1559 1560
-            1562:     71(ptr) AccessChain 31(data) 1557 63
-                              Store 1562 1561
-            1563:      6(int) Load 8(invocation)
-            1564:     90(ptr) AccessChain 31(data) 34 33 35
-            1565:      6(int) Load 1564
-            1566:   17(ivec4) Load 19(ballot)
-            1567:      6(int) GroupNonUniformBitwiseOr 178 PartitionedInclusiveScanNV 1565 1566
-            1568:     90(ptr) AccessChain 31(data) 1563 33 35
-                              Store 1568 1567
-            1569:      6(int) Load 8(invocation)
-            1570:     40(ptr) AccessChain 31(data) 63 33
-            1571:   17(ivec4) Load 1570
-            1572:   96(ivec2) VectorShuffle 1571 1571 0 1
-            1573:   17(ivec4) Load 19(ballot)
-            1574:   96(ivec2) GroupNonUniformBitwiseOr 178 PartitionedInclusiveScanNV 1572 1573
-            1575:     40(ptr) AccessChain 31(data) 1569 33
-            1576:   17(ivec4) Load 1575
-            1577:   17(ivec4) VectorShuffle 1576 1574 4 5 2 3
-                              Store 1575 1577
-            1578:      6(int) Load 8(invocation)
-            1579:     40(ptr) AccessChain 31(data) 33 33
-            1580:   17(ivec4) Load 1579
-            1581:  103(ivec3) VectorShuffle 1580 1580 0 1 2
-            1582:   17(ivec4) Load 19(ballot)
-            1583:  103(ivec3) GroupNonUniformBitwiseOr 178 PartitionedInclusiveScanNV 1581 1582
-            1584:     40(ptr) AccessChain 31(data) 1578 33
-            1585:   17(ivec4) Load 1584
-            1586:   17(ivec4) VectorShuffle 1585 1583 4 5 6 3
-                              Store 1584 1586
-            1587:      6(int) Load 8(invocation)
-            1588:     40(ptr) AccessChain 31(data) 115 33
-            1589:   17(ivec4) Load 1588
-            1590:   17(ivec4) Load 19(ballot)
-            1591:   17(ivec4) GroupNonUniformBitwiseOr 178 PartitionedInclusiveScanNV 1589 1590
-            1592:     40(ptr) AccessChain 31(data) 1587 33
-                              Store 1592 1591
-            1593:      6(int) Load 8(invocation)
-            1594:     64(ptr) AccessChain 31(data) 34 63 35
-            1595:     24(int) Load 1594
-            1596:   144(bool) SLessThan 1595 34
-            1597:   17(ivec4) Load 19(ballot)
-            1598:   144(bool) GroupNonUniformLogicalOr 178 PartitionedInclusiveScanNV 1596 1597
-            1599:     24(int) Select 1598 63 34
-            1600:     64(ptr) AccessChain 31(data) 1593 63 35
+            1544:   96(ivec2) GroupNonUniformUMax 178 PartitionedInclusiveScanNV 1542 1543
+            1545:     90(ptr) AccessChain 31(data) 1539 33 35
+            1546:      6(int) CompositeExtract 1544 0
+                              Store 1545 1546
+            1547:     90(ptr) AccessChain 31(data) 1539 33 189
+            1548:      6(int) CompositeExtract 1544 1
+                              Store 1547 1548
+            1549:      6(int) Load 8(invocation)
+            1550:     40(ptr) AccessChain 31(data) 33 33
+            1551:   17(ivec4) Load 1550
+            1552:  103(ivec3) VectorShuffle 1551 1551 0 1 2
+            1553:   17(ivec4) Load 19(ballot)
+            1554:  103(ivec3) GroupNonUniformUMax 178 PartitionedInclusiveScanNV 1552 1553
+            1555:     90(ptr) AccessChain 31(data) 1549 33 35
+            1556:      6(int) CompositeExtract 1554 0
+                              Store 1555 1556
+            1557:     90(ptr) AccessChain 31(data) 1549 33 189
+            1558:      6(int) CompositeExtract 1554 1
+                              Store 1557 1558
+            1559:     90(ptr) AccessChain 31(data) 1549 33 202
+            1560:      6(int) CompositeExtract 1554 2
+                              Store 1559 1560
+            1561:      6(int) Load 8(invocation)
+            1562:     40(ptr) AccessChain 31(data) 115 33
+            1563:   17(ivec4) Load 1562
+            1564:   17(ivec4) Load 19(ballot)
+            1565:   17(ivec4) GroupNonUniformUMax 178 PartitionedInclusiveScanNV 1563 1564
+            1566:     40(ptr) AccessChain 31(data) 1561 33
+                              Store 1566 1565
+            1567:      6(int) Load 8(invocation)
+            1568:    116(ptr) AccessChain 31(data) 34 115 35
+            1569:26(float64_t) Load 1568
+            1570:   17(ivec4) Load 19(ballot)
+            1571:26(float64_t) GroupNonUniformFMax 178 PartitionedInclusiveScanNV 1569 1570
+            1572:    116(ptr) AccessChain 31(data) 1567 115 35
+                              Store 1572 1571
+            1573:      6(int) Load 8(invocation)
+            1574:    123(ptr) AccessChain 31(data) 63 115
+            1575: 27(f64vec4) Load 1574
+            1576:122(f64vec2) VectorShuffle 1575 1575 0 1
+            1577:   17(ivec4) Load 19(ballot)
+            1578:122(f64vec2) GroupNonUniformFMax 178 PartitionedInclusiveScanNV 1576 1577
+            1579:    116(ptr) AccessChain 31(data) 1573 115 35
+            1580:26(float64_t) CompositeExtract 1578 0
+                              Store 1579 1580
+            1581:    116(ptr) AccessChain 31(data) 1573 115 189
+            1582:26(float64_t) CompositeExtract 1578 1
+                              Store 1581 1582
+            1583:      6(int) Load 8(invocation)
+            1584:    123(ptr) AccessChain 31(data) 33 115
+            1585: 27(f64vec4) Load 1584
+            1586:130(f64vec3) VectorShuffle 1585 1585 0 1 2
+            1587:   17(ivec4) Load 19(ballot)
+            1588:130(f64vec3) GroupNonUniformFMax 178 PartitionedInclusiveScanNV 1586 1587
+            1589:    116(ptr) AccessChain 31(data) 1583 115 35
+            1590:26(float64_t) CompositeExtract 1588 0
+                              Store 1589 1590
+            1591:    116(ptr) AccessChain 31(data) 1583 115 189
+            1592:26(float64_t) CompositeExtract 1588 1
+                              Store 1591 1592
+            1593:    116(ptr) AccessChain 31(data) 1583 115 202
+            1594:26(float64_t) CompositeExtract 1588 2
+                              Store 1593 1594
+            1595:      6(int) Load 8(invocation)
+            1596:    123(ptr) AccessChain 31(data) 115 115
+            1597: 27(f64vec4) Load 1596
+            1598:   17(ivec4) Load 19(ballot)
+            1599: 27(f64vec4) GroupNonUniformFMax 178 PartitionedInclusiveScanNV 1597 1598
+            1600:    123(ptr) AccessChain 31(data) 1595 115
                               Store 1600 1599
             1601:      6(int) Load 8(invocation)
-            1602:     71(ptr) AccessChain 31(data) 63 63
-            1603:   25(ivec4) Load 1602
-            1604:   70(ivec2) VectorShuffle 1603 1603 0 1
-            1605:  152(bvec2) SLessThan 1604 727
-            1606:   17(ivec4) Load 19(ballot)
-            1607:  152(bvec2) GroupNonUniformLogicalOr 178 PartitionedInclusiveScanNV 1605 1606
-            1608:   70(ivec2) Select 1607 731 727
-            1609:     71(ptr) AccessChain 31(data) 1601 63
-            1610:   25(ivec4) Load 1609
-            1611:   25(ivec4) VectorShuffle 1610 1608 4 5 2 3
-                              Store 1609 1611
-            1612:      6(int) Load 8(invocation)
-            1613:     71(ptr) AccessChain 31(data) 63 63
-            1614:   25(ivec4) Load 1613
-            1615:   78(ivec3) VectorShuffle 1614 1614 0 1 2
-            1616:  161(bvec3) SLessThan 1615 740
-            1617:   17(ivec4) Load 19(ballot)
-            1618:  161(bvec3) GroupNonUniformLogicalOr 178 PartitionedInclusiveScanNV 1616 1617
-            1619:   78(ivec3) Select 1618 744 740
-            1620:     71(ptr) AccessChain 31(data) 1612 63
-            1621:   25(ivec4) Load 1620
-            1622:   25(ivec4) VectorShuffle 1621 1619 4 5 6 3
-                              Store 1620 1622
-            1623:      6(int) Load 8(invocation)
-            1624:     71(ptr) AccessChain 31(data) 63 63
-            1625:   25(ivec4) Load 1624
-            1626:  169(bvec4) SLessThan 1625 752
-            1627:   17(ivec4) Load 19(ballot)
-            1628:  169(bvec4) GroupNonUniformLogicalOr 178 PartitionedInclusiveScanNV 1626 1627
-            1629:   25(ivec4) Select 1628 756 752
-            1630:     71(ptr) AccessChain 31(data) 1623 63
-                              Store 1630 1629
-            1631:      6(int) Load 8(invocation)
-            1632:     64(ptr) AccessChain 31(data) 34 63 35
-            1633:     24(int) Load 1632
-            1634:   17(ivec4) Load 19(ballot)
-            1635:     24(int) GroupNonUniformBitwiseXor 178 PartitionedInclusiveScanNV 1633 1634
-            1636:     64(ptr) AccessChain 31(data) 1631 63 35
-                              Store 1636 1635
-            1637:      6(int) Load 8(invocation)
-            1638:     71(ptr) AccessChain 31(data) 63 63
-            1639:   25(ivec4) Load 1638
-            1640:   70(ivec2) VectorShuffle 1639 1639 0 1
-            1641:   17(ivec4) Load 19(ballot)
-            1642:   70(ivec2) GroupNonUniformBitwiseXor 178 PartitionedInclusiveScanNV 1640 1641
-            1643:     71(ptr) AccessChain 31(data) 1637 63
-            1644:   25(ivec4) Load 1643
-            1645:   25(ivec4) VectorShuffle 1644 1642 4 5 2 3
-                              Store 1643 1645
-            1646:      6(int) Load 8(invocation)
-            1647:     71(ptr) AccessChain 31(data) 33 63
-            1648:   25(ivec4) Load 1647
-            1649:   78(ivec3) VectorShuffle 1648 1648 0 1 2
-            1650:   17(ivec4) Load 19(ballot)
-            1651:   78(ivec3) GroupNonUniformBitwiseXor 178 PartitionedInclusiveScanNV 1649 1650
-            1652:     71(ptr) AccessChain 31(data) 1646 63
-            1653:   25(ivec4) Load 1652
-            1654:   25(ivec4) VectorShuffle 1653 1651 4 5 6 3
-                              Store 1652 1654
-            1655:      6(int) Load 8(invocation)
-            1656:     71(ptr) AccessChain 31(data) 115 63
-            1657:   25(ivec4) Load 1656
-            1658:   17(ivec4) Load 19(ballot)
-            1659:   25(ivec4) GroupNonUniformBitwiseXor 178 PartitionedInclusiveScanNV 1657 1658
-            1660:     71(ptr) AccessChain 31(data) 1655 63
-                              Store 1660 1659
-            1661:      6(int) Load 8(invocation)
-            1662:     90(ptr) AccessChain 31(data) 34 33 35
-            1663:      6(int) Load 1662
-            1664:   17(ivec4) Load 19(ballot)
-            1665:      6(int) GroupNonUniformBitwiseXor 178 PartitionedInclusiveScanNV 1663 1664
-            1666:     90(ptr) AccessChain 31(data) 1661 33 35
-                              Store 1666 1665
-            1667:      6(int) Load 8(invocation)
-            1668:     40(ptr) AccessChain 31(data) 63 33
-            1669:   17(ivec4) Load 1668
-            1670:   96(ivec2) VectorShuffle 1669 1669 0 1
-            1671:   17(ivec4) Load 19(ballot)
-            1672:   96(ivec2) GroupNonUniformBitwiseXor 178 PartitionedInclusiveScanNV 1670 1671
-            1673:     40(ptr) AccessChain 31(data) 1667 33
-            1674:   17(ivec4) Load 1673
-            1675:   17(ivec4) VectorShuffle 1674 1672 4 5 2 3
-                              Store 1673 1675
-            1676:      6(int) Load 8(invocation)
-            1677:     40(ptr) AccessChain 31(data) 33 33
-            1678:   17(ivec4) Load 1677
-            1679:  103(ivec3) VectorShuffle 1678 1678 0 1 2
-            1680:   17(ivec4) Load 19(ballot)
-            1681:  103(ivec3) GroupNonUniformBitwiseXor 178 PartitionedInclusiveScanNV 1679 1680
-            1682:     40(ptr) AccessChain 31(data) 1676 33
-            1683:   17(ivec4) Load 1682
-            1684:   17(ivec4) VectorShuffle 1683 1681 4 5 6 3
-                              Store 1682 1684
-            1685:      6(int) Load 8(invocation)
-            1686:     40(ptr) AccessChain 31(data) 115 33
-            1687:   17(ivec4) Load 1686
-            1688:   17(ivec4) Load 19(ballot)
-            1689:   17(ivec4) GroupNonUniformBitwiseXor 178 PartitionedInclusiveScanNV 1687 1688
-            1690:     40(ptr) AccessChain 31(data) 1685 33
-                              Store 1690 1689
-            1691:      6(int) Load 8(invocation)
-            1692:     64(ptr) AccessChain 31(data) 34 63 35
-            1693:     24(int) Load 1692
-            1694:   144(bool) SLessThan 1693 34
-            1695:   17(ivec4) Load 19(ballot)
-            1696:   144(bool) GroupNonUniformLogicalXor 178 PartitionedInclusiveScanNV 1694 1695
-            1697:     24(int) Select 1696 63 34
-            1698:     64(ptr) AccessChain 31(data) 1691 63 35
-                              Store 1698 1697
-            1699:      6(int) Load 8(invocation)
-            1700:     71(ptr) AccessChain 31(data) 63 63
-            1701:   25(ivec4) Load 1700
-            1702:   70(ivec2) VectorShuffle 1701 1701 0 1
-            1703:  152(bvec2) SLessThan 1702 727
-            1704:   17(ivec4) Load 19(ballot)
-            1705:  152(bvec2) GroupNonUniformLogicalXor 178 PartitionedInclusiveScanNV 1703 1704
-            1706:   70(ivec2) Select 1705 731 727
-            1707:     71(ptr) AccessChain 31(data) 1699 63
-            1708:   25(ivec4) Load 1707
-            1709:   25(ivec4) VectorShuffle 1708 1706 4 5 2 3
-                              Store 1707 1709
-            1710:      6(int) Load 8(invocation)
-            1711:     71(ptr) AccessChain 31(data) 63 63
-            1712:   25(ivec4) Load 1711
-            1713:   78(ivec3) VectorShuffle 1712 1712 0 1 2
-            1714:  161(bvec3) SLessThan 1713 740
-            1715:   17(ivec4) Load 19(ballot)
-            1716:  161(bvec3) GroupNonUniformLogicalXor 178 PartitionedInclusiveScanNV 1714 1715
-            1717:   78(ivec3) Select 1716 744 740
-            1718:     71(ptr) AccessChain 31(data) 1710 63
+            1602:     64(ptr) AccessChain 31(data) 34 63 35
+            1603:     24(int) Load 1602
+            1604:   17(ivec4) Load 19(ballot)
+            1605:     24(int) GroupNonUniformBitwiseAnd 178 PartitionedInclusiveScanNV 1603 1604
+            1606:     64(ptr) AccessChain 31(data) 1601 63 35
+                              Store 1606 1605
+            1607:      6(int) Load 8(invocation)
+            1608:     71(ptr) AccessChain 31(data) 63 63
+            1609:   25(ivec4) Load 1608
+            1610:   70(ivec2) VectorShuffle 1609 1609 0 1
+            1611:   17(ivec4) Load 19(ballot)
+            1612:   70(ivec2) GroupNonUniformBitwiseAnd 178 PartitionedInclusiveScanNV 1610 1611
+            1613:     64(ptr) AccessChain 31(data) 1607 63 35
+            1614:     24(int) CompositeExtract 1612 0
+                              Store 1613 1614
+            1615:     64(ptr) AccessChain 31(data) 1607 63 189
+            1616:     24(int) CompositeExtract 1612 1
+                              Store 1615 1616
+            1617:      6(int) Load 8(invocation)
+            1618:     71(ptr) AccessChain 31(data) 33 63
+            1619:   25(ivec4) Load 1618
+            1620:   78(ivec3) VectorShuffle 1619 1619 0 1 2
+            1621:   17(ivec4) Load 19(ballot)
+            1622:   78(ivec3) GroupNonUniformBitwiseAnd 178 PartitionedInclusiveScanNV 1620 1621
+            1623:     64(ptr) AccessChain 31(data) 1617 63 35
+            1624:     24(int) CompositeExtract 1622 0
+                              Store 1623 1624
+            1625:     64(ptr) AccessChain 31(data) 1617 63 189
+            1626:     24(int) CompositeExtract 1622 1
+                              Store 1625 1626
+            1627:     64(ptr) AccessChain 31(data) 1617 63 202
+            1628:     24(int) CompositeExtract 1622 2
+                              Store 1627 1628
+            1629:      6(int) Load 8(invocation)
+            1630:     71(ptr) AccessChain 31(data) 115 63
+            1631:   25(ivec4) Load 1630
+            1632:   17(ivec4) Load 19(ballot)
+            1633:   25(ivec4) GroupNonUniformBitwiseAnd 178 PartitionedInclusiveScanNV 1631 1632
+            1634:     71(ptr) AccessChain 31(data) 1629 63
+                              Store 1634 1633
+            1635:      6(int) Load 8(invocation)
+            1636:     90(ptr) AccessChain 31(data) 34 33 35
+            1637:      6(int) Load 1636
+            1638:   17(ivec4) Load 19(ballot)
+            1639:      6(int) GroupNonUniformBitwiseAnd 178 PartitionedInclusiveScanNV 1637 1638
+            1640:     90(ptr) AccessChain 31(data) 1635 33 35
+                              Store 1640 1639
+            1641:      6(int) Load 8(invocation)
+            1642:     40(ptr) AccessChain 31(data) 63 33
+            1643:   17(ivec4) Load 1642
+            1644:   96(ivec2) VectorShuffle 1643 1643 0 1
+            1645:   17(ivec4) Load 19(ballot)
+            1646:   96(ivec2) GroupNonUniformBitwiseAnd 178 PartitionedInclusiveScanNV 1644 1645
+            1647:     90(ptr) AccessChain 31(data) 1641 33 35
+            1648:      6(int) CompositeExtract 1646 0
+                              Store 1647 1648
+            1649:     90(ptr) AccessChain 31(data) 1641 33 189
+            1650:      6(int) CompositeExtract 1646 1
+                              Store 1649 1650
+            1651:      6(int) Load 8(invocation)
+            1652:     40(ptr) AccessChain 31(data) 33 33
+            1653:   17(ivec4) Load 1652
+            1654:  103(ivec3) VectorShuffle 1653 1653 0 1 2
+            1655:   17(ivec4) Load 19(ballot)
+            1656:  103(ivec3) GroupNonUniformBitwiseAnd 178 PartitionedInclusiveScanNV 1654 1655
+            1657:     90(ptr) AccessChain 31(data) 1651 33 35
+            1658:      6(int) CompositeExtract 1656 0
+                              Store 1657 1658
+            1659:     90(ptr) AccessChain 31(data) 1651 33 189
+            1660:      6(int) CompositeExtract 1656 1
+                              Store 1659 1660
+            1661:     90(ptr) AccessChain 31(data) 1651 33 202
+            1662:      6(int) CompositeExtract 1656 2
+                              Store 1661 1662
+            1663:      6(int) Load 8(invocation)
+            1664:     40(ptr) AccessChain 31(data) 115 33
+            1665:   17(ivec4) Load 1664
+            1666:   17(ivec4) Load 19(ballot)
+            1667:   17(ivec4) GroupNonUniformBitwiseAnd 178 PartitionedInclusiveScanNV 1665 1666
+            1668:     40(ptr) AccessChain 31(data) 1663 33
+                              Store 1668 1667
+            1669:      6(int) Load 8(invocation)
+            1670:     64(ptr) AccessChain 31(data) 34 63 35
+            1671:     24(int) Load 1670
+            1672:   144(bool) SLessThan 1671 34
+            1673:   17(ivec4) Load 19(ballot)
+            1674:   144(bool) GroupNonUniformLogicalAnd 178 PartitionedInclusiveScanNV 1672 1673
+            1675:     24(int) Select 1674 63 34
+            1676:     64(ptr) AccessChain 31(data) 1669 63 35
+                              Store 1676 1675
+            1677:      6(int) Load 8(invocation)
+            1678:     71(ptr) AccessChain 31(data) 63 63
+            1679:   25(ivec4) Load 1678
+            1680:   70(ivec2) VectorShuffle 1679 1679 0 1
+            1681:  152(bvec2) SLessThan 1680 801
+            1682:   17(ivec4) Load 19(ballot)
+            1683:  152(bvec2) GroupNonUniformLogicalAnd 178 PartitionedInclusiveScanNV 1681 1682
+            1684:   70(ivec2) Select 1683 805 801
+            1685:     64(ptr) AccessChain 31(data) 1677 63 35
+            1686:     24(int) CompositeExtract 1684 0
+                              Store 1685 1686
+            1687:     64(ptr) AccessChain 31(data) 1677 63 189
+            1688:     24(int) CompositeExtract 1684 1
+                              Store 1687 1688
+            1689:      6(int) Load 8(invocation)
+            1690:     71(ptr) AccessChain 31(data) 63 63
+            1691:   25(ivec4) Load 1690
+            1692:   78(ivec3) VectorShuffle 1691 1691 0 1 2
+            1693:  161(bvec3) SLessThan 1692 815
+            1694:   17(ivec4) Load 19(ballot)
+            1695:  161(bvec3) GroupNonUniformLogicalAnd 178 PartitionedInclusiveScanNV 1693 1694
+            1696:   78(ivec3) Select 1695 819 815
+            1697:     64(ptr) AccessChain 31(data) 1689 63 35
+            1698:     24(int) CompositeExtract 1696 0
+                              Store 1697 1698
+            1699:     64(ptr) AccessChain 31(data) 1689 63 189
+            1700:     24(int) CompositeExtract 1696 1
+                              Store 1699 1700
+            1701:     64(ptr) AccessChain 31(data) 1689 63 202
+            1702:     24(int) CompositeExtract 1696 2
+                              Store 1701 1702
+            1703:      6(int) Load 8(invocation)
+            1704:     71(ptr) AccessChain 31(data) 63 63
+            1705:   25(ivec4) Load 1704
+            1706:  169(bvec4) SLessThan 1705 830
+            1707:   17(ivec4) Load 19(ballot)
+            1708:  169(bvec4) GroupNonUniformLogicalAnd 178 PartitionedInclusiveScanNV 1706 1707
+            1709:   25(ivec4) Select 1708 834 830
+            1710:     71(ptr) AccessChain 31(data) 1703 63
+                              Store 1710 1709
+            1711:      6(int) Load 8(invocation)
+            1712:     64(ptr) AccessChain 31(data) 34 63 35
+            1713:     24(int) Load 1712
+            1714:   17(ivec4) Load 19(ballot)
+            1715:     24(int) GroupNonUniformBitwiseOr 178 PartitionedInclusiveScanNV 1713 1714
+            1716:     64(ptr) AccessChain 31(data) 1711 63 35
+                              Store 1716 1715
+            1717:      6(int) Load 8(invocation)
+            1718:     71(ptr) AccessChain 31(data) 63 63
             1719:   25(ivec4) Load 1718
-            1720:   25(ivec4) VectorShuffle 1719 1717 4 5 6 3
-                              Store 1718 1720
-            1721:      6(int) Load 8(invocation)
-            1722:     71(ptr) AccessChain 31(data) 63 63
-            1723:   25(ivec4) Load 1722
-            1724:  169(bvec4) SLessThan 1723 752
-            1725:   17(ivec4) Load 19(ballot)
-            1726:  169(bvec4) GroupNonUniformLogicalXor 178 PartitionedInclusiveScanNV 1724 1725
-            1727:   25(ivec4) Select 1726 756 752
-            1728:     71(ptr) AccessChain 31(data) 1721 63
-                              Store 1728 1727
-            1729:      6(int) Load 8(invocation)
-            1730:     36(ptr) AccessChain 31(data) 34 34 35
-            1731:   22(float) Load 1730
-            1732:   17(ivec4) Load 19(ballot)
-            1733:   22(float) GroupNonUniformFAdd 178 PartitionedExclusiveScanNV 1731 1732
-            1734:     36(ptr) AccessChain 31(data) 1729 34 35
-                              Store 1734 1733
-            1735:      6(int) Load 8(invocation)
-            1736:     44(ptr) AccessChain 31(data) 63 34
-            1737:   23(fvec4) Load 1736
-            1738:   43(fvec2) VectorShuffle 1737 1737 0 1
-            1739:   17(ivec4) Load 19(ballot)
-            1740:   43(fvec2) GroupNonUniformFAdd 178 PartitionedExclusiveScanNV 1738 1739
-            1741:     44(ptr) AccessChain 31(data) 1735 34
-            1742:   23(fvec4) Load 1741
-            1743:   23(fvec4) VectorShuffle 1742 1740 4 5 2 3
-                              Store 1741 1743
-            1744:      6(int) Load 8(invocation)
-            1745:     44(ptr) AccessChain 31(data) 33 34
-            1746:   23(fvec4) Load 1745
-            1747:   51(fvec3) VectorShuffle 1746 1746 0 1 2
+            1720:   70(ivec2) VectorShuffle 1719 1719 0 1
+            1721:   17(ivec4) Load 19(ballot)
+            1722:   70(ivec2) GroupNonUniformBitwiseOr 178 PartitionedInclusiveScanNV 1720 1721
+            1723:     64(ptr) AccessChain 31(data) 1717 63 35
+            1724:     24(int) CompositeExtract 1722 0
+                              Store 1723 1724
+            1725:     64(ptr) AccessChain 31(data) 1717 63 189
+            1726:     24(int) CompositeExtract 1722 1
+                              Store 1725 1726
+            1727:      6(int) Load 8(invocation)
+            1728:     71(ptr) AccessChain 31(data) 33 63
+            1729:   25(ivec4) Load 1728
+            1730:   78(ivec3) VectorShuffle 1729 1729 0 1 2
+            1731:   17(ivec4) Load 19(ballot)
+            1732:   78(ivec3) GroupNonUniformBitwiseOr 178 PartitionedInclusiveScanNV 1730 1731
+            1733:     64(ptr) AccessChain 31(data) 1727 63 35
+            1734:     24(int) CompositeExtract 1732 0
+                              Store 1733 1734
+            1735:     64(ptr) AccessChain 31(data) 1727 63 189
+            1736:     24(int) CompositeExtract 1732 1
+                              Store 1735 1736
+            1737:     64(ptr) AccessChain 31(data) 1727 63 202
+            1738:     24(int) CompositeExtract 1732 2
+                              Store 1737 1738
+            1739:      6(int) Load 8(invocation)
+            1740:     71(ptr) AccessChain 31(data) 115 63
+            1741:   25(ivec4) Load 1740
+            1742:   17(ivec4) Load 19(ballot)
+            1743:   25(ivec4) GroupNonUniformBitwiseOr 178 PartitionedInclusiveScanNV 1741 1742
+            1744:     71(ptr) AccessChain 31(data) 1739 63
+                              Store 1744 1743
+            1745:      6(int) Load 8(invocation)
+            1746:     90(ptr) AccessChain 31(data) 34 33 35
+            1747:      6(int) Load 1746
             1748:   17(ivec4) Load 19(ballot)
-            1749:   51(fvec3) GroupNonUniformFAdd 178 PartitionedExclusiveScanNV 1747 1748
-            1750:     44(ptr) AccessChain 31(data) 1744 34
-            1751:   23(fvec4) Load 1750
-            1752:   23(fvec4) VectorShuffle 1751 1749 4 5 6 3
-                              Store 1750 1752
-            1753:      6(int) Load 8(invocation)
-            1754:     44(ptr) AccessChain 31(data) 115 34
-            1755:   23(fvec4) Load 1754
-            1756:   17(ivec4) Load 19(ballot)
-            1757:   23(fvec4) GroupNonUniformFAdd 178 PartitionedExclusiveScanNV 1755 1756
-            1758:     44(ptr) AccessChain 31(data) 1753 34
-                              Store 1758 1757
-            1759:      6(int) Load 8(invocation)
-            1760:     64(ptr) AccessChain 31(data) 34 63 35
-            1761:     24(int) Load 1760
-            1762:   17(ivec4) Load 19(ballot)
-            1763:     24(int) GroupNonUniformIAdd 178 PartitionedExclusiveScanNV 1761 1762
-            1764:     64(ptr) AccessChain 31(data) 1759 63 35
-                              Store 1764 1763
-            1765:      6(int) Load 8(invocation)
-            1766:     71(ptr) AccessChain 31(data) 63 63
-            1767:   25(ivec4) Load 1766
-            1768:   70(ivec2) VectorShuffle 1767 1767 0 1
-            1769:   17(ivec4) Load 19(ballot)
-            1770:   70(ivec2) GroupNonUniformIAdd 178 PartitionedExclusiveScanNV 1768 1769
-            1771:     71(ptr) AccessChain 31(data) 1765 63
-            1772:   25(ivec4) Load 1771
-            1773:   25(ivec4) VectorShuffle 1772 1770 4 5 2 3
-                              Store 1771 1773
-            1774:      6(int) Load 8(invocation)
-            1775:     71(ptr) AccessChain 31(data) 33 63
-            1776:   25(ivec4) Load 1775
-            1777:   78(ivec3) VectorShuffle 1776 1776 0 1 2
-            1778:   17(ivec4) Load 19(ballot)
-            1779:   78(ivec3) GroupNonUniformIAdd 178 PartitionedExclusiveScanNV 1777 1778
-            1780:     71(ptr) AccessChain 31(data) 1774 63
-            1781:   25(ivec4) Load 1780
-            1782:   25(ivec4) VectorShuffle 1781 1779 4 5 6 3
-                              Store 1780 1782
-            1783:      6(int) Load 8(invocation)
-            1784:     71(ptr) AccessChain 31(data) 115 63
-            1785:   25(ivec4) Load 1784
-            1786:   17(ivec4) Load 19(ballot)
-            1787:   25(ivec4) GroupNonUniformIAdd 178 PartitionedExclusiveScanNV 1785 1786
-            1788:     71(ptr) AccessChain 31(data) 1783 63
-                              Store 1788 1787
-            1789:      6(int) Load 8(invocation)
-            1790:     90(ptr) AccessChain 31(data) 34 33 35
-            1791:      6(int) Load 1790
+            1749:      6(int) GroupNonUniformBitwiseOr 178 PartitionedInclusiveScanNV 1747 1748
+            1750:     90(ptr) AccessChain 31(data) 1745 33 35
+                              Store 1750 1749
+            1751:      6(int) Load 8(invocation)
+            1752:     40(ptr) AccessChain 31(data) 63 33
+            1753:   17(ivec4) Load 1752
+            1754:   96(ivec2) VectorShuffle 1753 1753 0 1
+            1755:   17(ivec4) Load 19(ballot)
+            1756:   96(ivec2) GroupNonUniformBitwiseOr 178 PartitionedInclusiveScanNV 1754 1755
+            1757:     90(ptr) AccessChain 31(data) 1751 33 35
+            1758:      6(int) CompositeExtract 1756 0
+                              Store 1757 1758
+            1759:     90(ptr) AccessChain 31(data) 1751 33 189
+            1760:      6(int) CompositeExtract 1756 1
+                              Store 1759 1760
+            1761:      6(int) Load 8(invocation)
+            1762:     40(ptr) AccessChain 31(data) 33 33
+            1763:   17(ivec4) Load 1762
+            1764:  103(ivec3) VectorShuffle 1763 1763 0 1 2
+            1765:   17(ivec4) Load 19(ballot)
+            1766:  103(ivec3) GroupNonUniformBitwiseOr 178 PartitionedInclusiveScanNV 1764 1765
+            1767:     90(ptr) AccessChain 31(data) 1761 33 35
+            1768:      6(int) CompositeExtract 1766 0
+                              Store 1767 1768
+            1769:     90(ptr) AccessChain 31(data) 1761 33 189
+            1770:      6(int) CompositeExtract 1766 1
+                              Store 1769 1770
+            1771:     90(ptr) AccessChain 31(data) 1761 33 202
+            1772:      6(int) CompositeExtract 1766 2
+                              Store 1771 1772
+            1773:      6(int) Load 8(invocation)
+            1774:     40(ptr) AccessChain 31(data) 115 33
+            1775:   17(ivec4) Load 1774
+            1776:   17(ivec4) Load 19(ballot)
+            1777:   17(ivec4) GroupNonUniformBitwiseOr 178 PartitionedInclusiveScanNV 1775 1776
+            1778:     40(ptr) AccessChain 31(data) 1773 33
+                              Store 1778 1777
+            1779:      6(int) Load 8(invocation)
+            1780:     64(ptr) AccessChain 31(data) 34 63 35
+            1781:     24(int) Load 1780
+            1782:   144(bool) SLessThan 1781 34
+            1783:   17(ivec4) Load 19(ballot)
+            1784:   144(bool) GroupNonUniformLogicalOr 178 PartitionedInclusiveScanNV 1782 1783
+            1785:     24(int) Select 1784 63 34
+            1786:     64(ptr) AccessChain 31(data) 1779 63 35
+                              Store 1786 1785
+            1787:      6(int) Load 8(invocation)
+            1788:     71(ptr) AccessChain 31(data) 63 63
+            1789:   25(ivec4) Load 1788
+            1790:   70(ivec2) VectorShuffle 1789 1789 0 1
+            1791:  152(bvec2) SLessThan 1790 801
             1792:   17(ivec4) Load 19(ballot)
-            1793:      6(int) GroupNonUniformIAdd 178 PartitionedExclusiveScanNV 1791 1792
-            1794:     90(ptr) AccessChain 31(data) 1789 33 35
-                              Store 1794 1793
-            1795:      6(int) Load 8(invocation)
-            1796:     40(ptr) AccessChain 31(data) 63 33
-            1797:   17(ivec4) Load 1796
-            1798:   96(ivec2) VectorShuffle 1797 1797 0 1
-            1799:   17(ivec4) Load 19(ballot)
-            1800:   96(ivec2) GroupNonUniformIAdd 178 PartitionedExclusiveScanNV 1798 1799
-            1801:     40(ptr) AccessChain 31(data) 1795 33
-            1802:   17(ivec4) Load 1801
-            1803:   17(ivec4) VectorShuffle 1802 1800 4 5 2 3
-                              Store 1801 1803
-            1804:      6(int) Load 8(invocation)
-            1805:     40(ptr) AccessChain 31(data) 33 33
-            1806:   17(ivec4) Load 1805
-            1807:  103(ivec3) VectorShuffle 1806 1806 0 1 2
-            1808:   17(ivec4) Load 19(ballot)
-            1809:  103(ivec3) GroupNonUniformIAdd 178 PartitionedExclusiveScanNV 1807 1808
-            1810:     40(ptr) AccessChain 31(data) 1804 33
-            1811:   17(ivec4) Load 1810
-            1812:   17(ivec4) VectorShuffle 1811 1809 4 5 6 3
-                              Store 1810 1812
+            1793:  152(bvec2) GroupNonUniformLogicalOr 178 PartitionedInclusiveScanNV 1791 1792
+            1794:   70(ivec2) Select 1793 805 801
+            1795:     64(ptr) AccessChain 31(data) 1787 63 35
+            1796:     24(int) CompositeExtract 1794 0
+                              Store 1795 1796
+            1797:     64(ptr) AccessChain 31(data) 1787 63 189
+            1798:     24(int) CompositeExtract 1794 1
+                              Store 1797 1798
+            1799:      6(int) Load 8(invocation)
+            1800:     71(ptr) AccessChain 31(data) 63 63
+            1801:   25(ivec4) Load 1800
+            1802:   78(ivec3) VectorShuffle 1801 1801 0 1 2
+            1803:  161(bvec3) SLessThan 1802 815
+            1804:   17(ivec4) Load 19(ballot)
+            1805:  161(bvec3) GroupNonUniformLogicalOr 178 PartitionedInclusiveScanNV 1803 1804
+            1806:   78(ivec3) Select 1805 819 815
+            1807:     64(ptr) AccessChain 31(data) 1799 63 35
+            1808:     24(int) CompositeExtract 1806 0
+                              Store 1807 1808
+            1809:     64(ptr) AccessChain 31(data) 1799 63 189
+            1810:     24(int) CompositeExtract 1806 1
+                              Store 1809 1810
+            1811:     64(ptr) AccessChain 31(data) 1799 63 202
+            1812:     24(int) CompositeExtract 1806 2
+                              Store 1811 1812
             1813:      6(int) Load 8(invocation)
-            1814:     40(ptr) AccessChain 31(data) 115 33
-            1815:   17(ivec4) Load 1814
-            1816:   17(ivec4) Load 19(ballot)
-            1817:   17(ivec4) GroupNonUniformIAdd 178 PartitionedExclusiveScanNV 1815 1816
-            1818:     40(ptr) AccessChain 31(data) 1813 33
-                              Store 1818 1817
-            1819:      6(int) Load 8(invocation)
-            1820:    116(ptr) AccessChain 31(data) 34 115 35
-            1821:26(float64_t) Load 1820
-            1822:   17(ivec4) Load 19(ballot)
-            1823:26(float64_t) GroupNonUniformFAdd 178 PartitionedExclusiveScanNV 1821 1822
-            1824:    116(ptr) AccessChain 31(data) 1819 115 35
-                              Store 1824 1823
-            1825:      6(int) Load 8(invocation)
-            1826:    123(ptr) AccessChain 31(data) 63 115
-            1827: 27(f64vec4) Load 1826
-            1828:122(f64vec2) VectorShuffle 1827 1827 0 1
-            1829:   17(ivec4) Load 19(ballot)
-            1830:122(f64vec2) GroupNonUniformFAdd 178 PartitionedExclusiveScanNV 1828 1829
-            1831:    123(ptr) AccessChain 31(data) 1825 115
-            1832: 27(f64vec4) Load 1831
-            1833: 27(f64vec4) VectorShuffle 1832 1830 4 5 2 3
-                              Store 1831 1833
-            1834:      6(int) Load 8(invocation)
-            1835:    123(ptr) AccessChain 31(data) 33 115
-            1836: 27(f64vec4) Load 1835
-            1837:130(f64vec3) VectorShuffle 1836 1836 0 1 2
-            1838:   17(ivec4) Load 19(ballot)
-            1839:130(f64vec3) GroupNonUniformFAdd 178 PartitionedExclusiveScanNV 1837 1838
-            1840:    123(ptr) AccessChain 31(data) 1834 115
-            1841: 27(f64vec4) Load 1840
-            1842: 27(f64vec4) VectorShuffle 1841 1839 4 5 6 3
-                              Store 1840 1842
-            1843:      6(int) Load 8(invocation)
-            1844:    123(ptr) AccessChain 31(data) 115 115
-            1845: 27(f64vec4) Load 1844
-            1846:   17(ivec4) Load 19(ballot)
-            1847: 27(f64vec4) GroupNonUniformFAdd 178 PartitionedExclusiveScanNV 1845 1846
-            1848:    123(ptr) AccessChain 31(data) 1843 115
-                              Store 1848 1847
+            1814:     71(ptr) AccessChain 31(data) 63 63
+            1815:   25(ivec4) Load 1814
+            1816:  169(bvec4) SLessThan 1815 830
+            1817:   17(ivec4) Load 19(ballot)
+            1818:  169(bvec4) GroupNonUniformLogicalOr 178 PartitionedInclusiveScanNV 1816 1817
+            1819:   25(ivec4) Select 1818 834 830
+            1820:     71(ptr) AccessChain 31(data) 1813 63
+                              Store 1820 1819
+            1821:      6(int) Load 8(invocation)
+            1822:     64(ptr) AccessChain 31(data) 34 63 35
+            1823:     24(int) Load 1822
+            1824:   17(ivec4) Load 19(ballot)
+            1825:     24(int) GroupNonUniformBitwiseXor 178 PartitionedInclusiveScanNV 1823 1824
+            1826:     64(ptr) AccessChain 31(data) 1821 63 35
+                              Store 1826 1825
+            1827:      6(int) Load 8(invocation)
+            1828:     71(ptr) AccessChain 31(data) 63 63
+            1829:   25(ivec4) Load 1828
+            1830:   70(ivec2) VectorShuffle 1829 1829 0 1
+            1831:   17(ivec4) Load 19(ballot)
+            1832:   70(ivec2) GroupNonUniformBitwiseXor 178 PartitionedInclusiveScanNV 1830 1831
+            1833:     64(ptr) AccessChain 31(data) 1827 63 35
+            1834:     24(int) CompositeExtract 1832 0
+                              Store 1833 1834
+            1835:     64(ptr) AccessChain 31(data) 1827 63 189
+            1836:     24(int) CompositeExtract 1832 1
+                              Store 1835 1836
+            1837:      6(int) Load 8(invocation)
+            1838:     71(ptr) AccessChain 31(data) 33 63
+            1839:   25(ivec4) Load 1838
+            1840:   78(ivec3) VectorShuffle 1839 1839 0 1 2
+            1841:   17(ivec4) Load 19(ballot)
+            1842:   78(ivec3) GroupNonUniformBitwiseXor 178 PartitionedInclusiveScanNV 1840 1841
+            1843:     64(ptr) AccessChain 31(data) 1837 63 35
+            1844:     24(int) CompositeExtract 1842 0
+                              Store 1843 1844
+            1845:     64(ptr) AccessChain 31(data) 1837 63 189
+            1846:     24(int) CompositeExtract 1842 1
+                              Store 1845 1846
+            1847:     64(ptr) AccessChain 31(data) 1837 63 202
+            1848:     24(int) CompositeExtract 1842 2
+                              Store 1847 1848
             1849:      6(int) Load 8(invocation)
-            1850:     36(ptr) AccessChain 31(data) 34 34 35
-            1851:   22(float) Load 1850
+            1850:     71(ptr) AccessChain 31(data) 115 63
+            1851:   25(ivec4) Load 1850
             1852:   17(ivec4) Load 19(ballot)
-            1853:   22(float) GroupNonUniformFMul 178 PartitionedExclusiveScanNV 1851 1852
-            1854:     36(ptr) AccessChain 31(data) 1849 34 35
+            1853:   25(ivec4) GroupNonUniformBitwiseXor 178 PartitionedInclusiveScanNV 1851 1852
+            1854:     71(ptr) AccessChain 31(data) 1849 63
                               Store 1854 1853
             1855:      6(int) Load 8(invocation)
-            1856:     44(ptr) AccessChain 31(data) 63 34
-            1857:   23(fvec4) Load 1856
-            1858:   43(fvec2) VectorShuffle 1857 1857 0 1
-            1859:   17(ivec4) Load 19(ballot)
-            1860:   43(fvec2) GroupNonUniformFMul 178 PartitionedExclusiveScanNV 1858 1859
-            1861:     44(ptr) AccessChain 31(data) 1855 34
-            1862:   23(fvec4) Load 1861
-            1863:   23(fvec4) VectorShuffle 1862 1860 4 5 2 3
-                              Store 1861 1863
-            1864:      6(int) Load 8(invocation)
-            1865:     44(ptr) AccessChain 31(data) 33 34
-            1866:   23(fvec4) Load 1865
-            1867:   51(fvec3) VectorShuffle 1866 1866 0 1 2
-            1868:   17(ivec4) Load 19(ballot)
-            1869:   51(fvec3) GroupNonUniformFMul 178 PartitionedExclusiveScanNV 1867 1868
-            1870:     44(ptr) AccessChain 31(data) 1864 34
-            1871:   23(fvec4) Load 1870
-            1872:   23(fvec4) VectorShuffle 1871 1869 4 5 6 3
-                              Store 1870 1872
-            1873:      6(int) Load 8(invocation)
-            1874:     44(ptr) AccessChain 31(data) 115 34
-            1875:   23(fvec4) Load 1874
-            1876:   17(ivec4) Load 19(ballot)
-            1877:   23(fvec4) GroupNonUniformFMul 178 PartitionedExclusiveScanNV 1875 1876
-            1878:     44(ptr) AccessChain 31(data) 1873 34
-                              Store 1878 1877
-            1879:      6(int) Load 8(invocation)
-            1880:     64(ptr) AccessChain 31(data) 34 63 35
-            1881:     24(int) Load 1880
-            1882:   17(ivec4) Load 19(ballot)
-            1883:     24(int) GroupNonUniformIMul 178 PartitionedExclusiveScanNV 1881 1882
-            1884:     64(ptr) AccessChain 31(data) 1879 63 35
-                              Store 1884 1883
-            1885:      6(int) Load 8(invocation)
-            1886:     71(ptr) AccessChain 31(data) 63 63
-            1887:   25(ivec4) Load 1886
-            1888:   70(ivec2) VectorShuffle 1887 1887 0 1
-            1889:   17(ivec4) Load 19(ballot)
-            1890:   70(ivec2) GroupNonUniformIMul 178 PartitionedExclusiveScanNV 1888 1889
-            1891:     71(ptr) AccessChain 31(data) 1885 63
-            1892:   25(ivec4) Load 1891
-            1893:   25(ivec4) VectorShuffle 1892 1890 4 5 2 3
-                              Store 1891 1893
-            1894:      6(int) Load 8(invocation)
-            1895:     71(ptr) AccessChain 31(data) 33 63
-            1896:   25(ivec4) Load 1895
-            1897:   78(ivec3) VectorShuffle 1896 1896 0 1 2
-            1898:   17(ivec4) Load 19(ballot)
-            1899:   78(ivec3) GroupNonUniformIMul 178 PartitionedExclusiveScanNV 1897 1898
-            1900:     71(ptr) AccessChain 31(data) 1894 63
-            1901:   25(ivec4) Load 1900
-            1902:   25(ivec4) VectorShuffle 1901 1899 4 5 6 3
-                              Store 1900 1902
-            1903:      6(int) Load 8(invocation)
-            1904:     71(ptr) AccessChain 31(data) 115 63
-            1905:   25(ivec4) Load 1904
-            1906:   17(ivec4) Load 19(ballot)
-            1907:   25(ivec4) GroupNonUniformIMul 178 PartitionedExclusiveScanNV 1905 1906
-            1908:     71(ptr) AccessChain 31(data) 1903 63
-                              Store 1908 1907
+            1856:     90(ptr) AccessChain 31(data) 34 33 35
+            1857:      6(int) Load 1856
+            1858:   17(ivec4) Load 19(ballot)
+            1859:      6(int) GroupNonUniformBitwiseXor 178 PartitionedInclusiveScanNV 1857 1858
+            1860:     90(ptr) AccessChain 31(data) 1855 33 35
+                              Store 1860 1859
+            1861:      6(int) Load 8(invocation)
+            1862:     40(ptr) AccessChain 31(data) 63 33
+            1863:   17(ivec4) Load 1862
+            1864:   96(ivec2) VectorShuffle 1863 1863 0 1
+            1865:   17(ivec4) Load 19(ballot)
+            1866:   96(ivec2) GroupNonUniformBitwiseXor 178 PartitionedInclusiveScanNV 1864 1865
+            1867:     90(ptr) AccessChain 31(data) 1861 33 35
+            1868:      6(int) CompositeExtract 1866 0
+                              Store 1867 1868
+            1869:     90(ptr) AccessChain 31(data) 1861 33 189
+            1870:      6(int) CompositeExtract 1866 1
+                              Store 1869 1870
+            1871:      6(int) Load 8(invocation)
+            1872:     40(ptr) AccessChain 31(data) 33 33
+            1873:   17(ivec4) Load 1872
+            1874:  103(ivec3) VectorShuffle 1873 1873 0 1 2
+            1875:   17(ivec4) Load 19(ballot)
+            1876:  103(ivec3) GroupNonUniformBitwiseXor 178 PartitionedInclusiveScanNV 1874 1875
+            1877:     90(ptr) AccessChain 31(data) 1871 33 35
+            1878:      6(int) CompositeExtract 1876 0
+                              Store 1877 1878
+            1879:     90(ptr) AccessChain 31(data) 1871 33 189
+            1880:      6(int) CompositeExtract 1876 1
+                              Store 1879 1880
+            1881:     90(ptr) AccessChain 31(data) 1871 33 202
+            1882:      6(int) CompositeExtract 1876 2
+                              Store 1881 1882
+            1883:      6(int) Load 8(invocation)
+            1884:     40(ptr) AccessChain 31(data) 115 33
+            1885:   17(ivec4) Load 1884
+            1886:   17(ivec4) Load 19(ballot)
+            1887:   17(ivec4) GroupNonUniformBitwiseXor 178 PartitionedInclusiveScanNV 1885 1886
+            1888:     40(ptr) AccessChain 31(data) 1883 33
+                              Store 1888 1887
+            1889:      6(int) Load 8(invocation)
+            1890:     64(ptr) AccessChain 31(data) 34 63 35
+            1891:     24(int) Load 1890
+            1892:   144(bool) SLessThan 1891 34
+            1893:   17(ivec4) Load 19(ballot)
+            1894:   144(bool) GroupNonUniformLogicalXor 178 PartitionedInclusiveScanNV 1892 1893
+            1895:     24(int) Select 1894 63 34
+            1896:     64(ptr) AccessChain 31(data) 1889 63 35
+                              Store 1896 1895
+            1897:      6(int) Load 8(invocation)
+            1898:     71(ptr) AccessChain 31(data) 63 63
+            1899:   25(ivec4) Load 1898
+            1900:   70(ivec2) VectorShuffle 1899 1899 0 1
+            1901:  152(bvec2) SLessThan 1900 801
+            1902:   17(ivec4) Load 19(ballot)
+            1903:  152(bvec2) GroupNonUniformLogicalXor 178 PartitionedInclusiveScanNV 1901 1902
+            1904:   70(ivec2) Select 1903 805 801
+            1905:     64(ptr) AccessChain 31(data) 1897 63 35
+            1906:     24(int) CompositeExtract 1904 0
+                              Store 1905 1906
+            1907:     64(ptr) AccessChain 31(data) 1897 63 189
+            1908:     24(int) CompositeExtract 1904 1
+                              Store 1907 1908
             1909:      6(int) Load 8(invocation)
-            1910:     90(ptr) AccessChain 31(data) 34 33 35
-            1911:      6(int) Load 1910
-            1912:   17(ivec4) Load 19(ballot)
-            1913:      6(int) GroupNonUniformIMul 178 PartitionedExclusiveScanNV 1911 1912
-            1914:     90(ptr) AccessChain 31(data) 1909 33 35
-                              Store 1914 1913
-            1915:      6(int) Load 8(invocation)
-            1916:     40(ptr) AccessChain 31(data) 63 33
-            1917:   17(ivec4) Load 1916
-            1918:   96(ivec2) VectorShuffle 1917 1917 0 1
-            1919:   17(ivec4) Load 19(ballot)
-            1920:   96(ivec2) GroupNonUniformIMul 178 PartitionedExclusiveScanNV 1918 1919
-            1921:     40(ptr) AccessChain 31(data) 1915 33
-            1922:   17(ivec4) Load 1921
-            1923:   17(ivec4) VectorShuffle 1922 1920 4 5 2 3
-                              Store 1921 1923
-            1924:      6(int) Load 8(invocation)
-            1925:     40(ptr) AccessChain 31(data) 33 33
-            1926:   17(ivec4) Load 1925
-            1927:  103(ivec3) VectorShuffle 1926 1926 0 1 2
-            1928:   17(ivec4) Load 19(ballot)
-            1929:  103(ivec3) GroupNonUniformIMul 178 PartitionedExclusiveScanNV 1927 1928
-            1930:     40(ptr) AccessChain 31(data) 1924 33
-            1931:   17(ivec4) Load 1930
-            1932:   17(ivec4) VectorShuffle 1931 1929 4 5 6 3
-                              Store 1930 1932
-            1933:      6(int) Load 8(invocation)
-            1934:     40(ptr) AccessChain 31(data) 115 33
-            1935:   17(ivec4) Load 1934
-            1936:   17(ivec4) Load 19(ballot)
-            1937:   17(ivec4) GroupNonUniformIMul 178 PartitionedExclusiveScanNV 1935 1936
-            1938:     40(ptr) AccessChain 31(data) 1933 33
-                              Store 1938 1937
-            1939:      6(int) Load 8(invocation)
-            1940:    116(ptr) AccessChain 31(data) 34 115 35
-            1941:26(float64_t) Load 1940
-            1942:   17(ivec4) Load 19(ballot)
-            1943:26(float64_t) GroupNonUniformFMul 178 PartitionedExclusiveScanNV 1941 1942
-            1944:    116(ptr) AccessChain 31(data) 1939 115 35
-                              Store 1944 1943
-            1945:      6(int) Load 8(invocation)
-            1946:    123(ptr) AccessChain 31(data) 63 115
-            1947: 27(f64vec4) Load 1946
-            1948:122(f64vec2) VectorShuffle 1947 1947 0 1
-            1949:   17(ivec4) Load 19(ballot)
-            1950:122(f64vec2) GroupNonUniformFMul 178 PartitionedExclusiveScanNV 1948 1949
-            1951:    123(ptr) AccessChain 31(data) 1945 115
-            1952: 27(f64vec4) Load 1951
-            1953: 27(f64vec4) VectorShuffle 1952 1950 4 5 2 3
-                              Store 1951 1953
-            1954:      6(int) Load 8(invocation)
-            1955:    123(ptr) AccessChain 31(data) 33 115
-            1956: 27(f64vec4) Load 1955
-            1957:130(f64vec3) VectorShuffle 1956 1956 0 1 2
-            1958:   17(ivec4) Load 19(ballot)
-            1959:130(f64vec3) GroupNonUniformFMul 178 PartitionedExclusiveScanNV 1957 1958
-            1960:    123(ptr) AccessChain 31(data) 1954 115
-            1961: 27(f64vec4) Load 1960
-            1962: 27(f64vec4) VectorShuffle 1961 1959 4 5 6 3
-                              Store 1960 1962
-            1963:      6(int) Load 8(invocation)
-            1964:    123(ptr) AccessChain 31(data) 115 115
-            1965: 27(f64vec4) Load 1964
-            1966:   17(ivec4) Load 19(ballot)
-            1967: 27(f64vec4) GroupNonUniformFMul 178 PartitionedExclusiveScanNV 1965 1966
-            1968:    123(ptr) AccessChain 31(data) 1963 115
-                              Store 1968 1967
-            1969:      6(int) Load 8(invocation)
-            1970:     36(ptr) AccessChain 31(data) 34 34 35
-            1971:   22(float) Load 1970
-            1972:   17(ivec4) Load 19(ballot)
-            1973:   22(float) GroupNonUniformFMin 178 PartitionedExclusiveScanNV 1971 1972
-            1974:     36(ptr) AccessChain 31(data) 1969 34 35
-                              Store 1974 1973
-            1975:      6(int) Load 8(invocation)
-            1976:     44(ptr) AccessChain 31(data) 63 34
-            1977:   23(fvec4) Load 1976
-            1978:   43(fvec2) VectorShuffle 1977 1977 0 1
-            1979:   17(ivec4) Load 19(ballot)
-            1980:   43(fvec2) GroupNonUniformFMin 178 PartitionedExclusiveScanNV 1978 1979
-            1981:     44(ptr) AccessChain 31(data) 1975 34
-            1982:   23(fvec4) Load 1981
-            1983:   23(fvec4) VectorShuffle 1982 1980 4 5 2 3
-                              Store 1981 1983
-            1984:      6(int) Load 8(invocation)
-            1985:     44(ptr) AccessChain 31(data) 33 34
-            1986:   23(fvec4) Load 1985
-            1987:   51(fvec3) VectorShuffle 1986 1986 0 1 2
-            1988:   17(ivec4) Load 19(ballot)
-            1989:   51(fvec3) GroupNonUniformFMin 178 PartitionedExclusiveScanNV 1987 1988
-            1990:     44(ptr) AccessChain 31(data) 1984 34
-            1991:   23(fvec4) Load 1990
-            1992:   23(fvec4) VectorShuffle 1991 1989 4 5 6 3
-                              Store 1990 1992
+            1910:     71(ptr) AccessChain 31(data) 63 63
+            1911:   25(ivec4) Load 1910
+            1912:   78(ivec3) VectorShuffle 1911 1911 0 1 2
+            1913:  161(bvec3) SLessThan 1912 815
+            1914:   17(ivec4) Load 19(ballot)
+            1915:  161(bvec3) GroupNonUniformLogicalXor 178 PartitionedInclusiveScanNV 1913 1914
+            1916:   78(ivec3) Select 1915 819 815
+            1917:     64(ptr) AccessChain 31(data) 1909 63 35
+            1918:     24(int) CompositeExtract 1916 0
+                              Store 1917 1918
+            1919:     64(ptr) AccessChain 31(data) 1909 63 189
+            1920:     24(int) CompositeExtract 1916 1
+                              Store 1919 1920
+            1921:     64(ptr) AccessChain 31(data) 1909 63 202
+            1922:     24(int) CompositeExtract 1916 2
+                              Store 1921 1922
+            1923:      6(int) Load 8(invocation)
+            1924:     71(ptr) AccessChain 31(data) 63 63
+            1925:   25(ivec4) Load 1924
+            1926:  169(bvec4) SLessThan 1925 830
+            1927:   17(ivec4) Load 19(ballot)
+            1928:  169(bvec4) GroupNonUniformLogicalXor 178 PartitionedInclusiveScanNV 1926 1927
+            1929:   25(ivec4) Select 1928 834 830
+            1930:     71(ptr) AccessChain 31(data) 1923 63
+                              Store 1930 1929
+            1931:      6(int) Load 8(invocation)
+            1932:     36(ptr) AccessChain 31(data) 34 34 35
+            1933:   22(float) Load 1932
+            1934:   17(ivec4) Load 19(ballot)
+            1935:   22(float) GroupNonUniformFAdd 178 PartitionedExclusiveScanNV 1933 1934
+            1936:     36(ptr) AccessChain 31(data) 1931 34 35
+                              Store 1936 1935
+            1937:      6(int) Load 8(invocation)
+            1938:     44(ptr) AccessChain 31(data) 63 34
+            1939:   23(fvec4) Load 1938
+            1940:   43(fvec2) VectorShuffle 1939 1939 0 1
+            1941:   17(ivec4) Load 19(ballot)
+            1942:   43(fvec2) GroupNonUniformFAdd 178 PartitionedExclusiveScanNV 1940 1941
+            1943:     36(ptr) AccessChain 31(data) 1937 34 35
+            1944:   22(float) CompositeExtract 1942 0
+                              Store 1943 1944
+            1945:     36(ptr) AccessChain 31(data) 1937 34 189
+            1946:   22(float) CompositeExtract 1942 1
+                              Store 1945 1946
+            1947:      6(int) Load 8(invocation)
+            1948:     44(ptr) AccessChain 31(data) 33 34
+            1949:   23(fvec4) Load 1948
+            1950:   51(fvec3) VectorShuffle 1949 1949 0 1 2
+            1951:   17(ivec4) Load 19(ballot)
+            1952:   51(fvec3) GroupNonUniformFAdd 178 PartitionedExclusiveScanNV 1950 1951
+            1953:     36(ptr) AccessChain 31(data) 1947 34 35
+            1954:   22(float) CompositeExtract 1952 0
+                              Store 1953 1954
+            1955:     36(ptr) AccessChain 31(data) 1947 34 189
+            1956:   22(float) CompositeExtract 1952 1
+                              Store 1955 1956
+            1957:     36(ptr) AccessChain 31(data) 1947 34 202
+            1958:   22(float) CompositeExtract 1952 2
+                              Store 1957 1958
+            1959:      6(int) Load 8(invocation)
+            1960:     44(ptr) AccessChain 31(data) 115 34
+            1961:   23(fvec4) Load 1960
+            1962:   17(ivec4) Load 19(ballot)
+            1963:   23(fvec4) GroupNonUniformFAdd 178 PartitionedExclusiveScanNV 1961 1962
+            1964:     44(ptr) AccessChain 31(data) 1959 34
+                              Store 1964 1963
+            1965:      6(int) Load 8(invocation)
+            1966:     64(ptr) AccessChain 31(data) 34 63 35
+            1967:     24(int) Load 1966
+            1968:   17(ivec4) Load 19(ballot)
+            1969:     24(int) GroupNonUniformIAdd 178 PartitionedExclusiveScanNV 1967 1968
+            1970:     64(ptr) AccessChain 31(data) 1965 63 35
+                              Store 1970 1969
+            1971:      6(int) Load 8(invocation)
+            1972:     71(ptr) AccessChain 31(data) 63 63
+            1973:   25(ivec4) Load 1972
+            1974:   70(ivec2) VectorShuffle 1973 1973 0 1
+            1975:   17(ivec4) Load 19(ballot)
+            1976:   70(ivec2) GroupNonUniformIAdd 178 PartitionedExclusiveScanNV 1974 1975
+            1977:     64(ptr) AccessChain 31(data) 1971 63 35
+            1978:     24(int) CompositeExtract 1976 0
+                              Store 1977 1978
+            1979:     64(ptr) AccessChain 31(data) 1971 63 189
+            1980:     24(int) CompositeExtract 1976 1
+                              Store 1979 1980
+            1981:      6(int) Load 8(invocation)
+            1982:     71(ptr) AccessChain 31(data) 33 63
+            1983:   25(ivec4) Load 1982
+            1984:   78(ivec3) VectorShuffle 1983 1983 0 1 2
+            1985:   17(ivec4) Load 19(ballot)
+            1986:   78(ivec3) GroupNonUniformIAdd 178 PartitionedExclusiveScanNV 1984 1985
+            1987:     64(ptr) AccessChain 31(data) 1981 63 35
+            1988:     24(int) CompositeExtract 1986 0
+                              Store 1987 1988
+            1989:     64(ptr) AccessChain 31(data) 1981 63 189
+            1990:     24(int) CompositeExtract 1986 1
+                              Store 1989 1990
+            1991:     64(ptr) AccessChain 31(data) 1981 63 202
+            1992:     24(int) CompositeExtract 1986 2
+                              Store 1991 1992
             1993:      6(int) Load 8(invocation)
-            1994:     44(ptr) AccessChain 31(data) 115 34
-            1995:   23(fvec4) Load 1994
+            1994:     71(ptr) AccessChain 31(data) 115 63
+            1995:   25(ivec4) Load 1994
             1996:   17(ivec4) Load 19(ballot)
-            1997:   23(fvec4) GroupNonUniformFMin 178 PartitionedExclusiveScanNV 1995 1996
-            1998:     44(ptr) AccessChain 31(data) 1993 34
+            1997:   25(ivec4) GroupNonUniformIAdd 178 PartitionedExclusiveScanNV 1995 1996
+            1998:     71(ptr) AccessChain 31(data) 1993 63
                               Store 1998 1997
             1999:      6(int) Load 8(invocation)
-            2000:     64(ptr) AccessChain 31(data) 34 63 35
-            2001:     24(int) Load 2000
+            2000:     90(ptr) AccessChain 31(data) 34 33 35
+            2001:      6(int) Load 2000
             2002:   17(ivec4) Load 19(ballot)
-            2003:     24(int) GroupNonUniformSMin 178 PartitionedExclusiveScanNV 2001 2002
-            2004:     64(ptr) AccessChain 31(data) 1999 63 35
+            2003:      6(int) GroupNonUniformIAdd 178 PartitionedExclusiveScanNV 2001 2002
+            2004:     90(ptr) AccessChain 31(data) 1999 33 35
                               Store 2004 2003
             2005:      6(int) Load 8(invocation)
-            2006:     71(ptr) AccessChain 31(data) 63 63
-            2007:   25(ivec4) Load 2006
-            2008:   70(ivec2) VectorShuffle 2007 2007 0 1
+            2006:     40(ptr) AccessChain 31(data) 63 33
+            2007:   17(ivec4) Load 2006
+            2008:   96(ivec2) VectorShuffle 2007 2007 0 1
             2009:   17(ivec4) Load 19(ballot)
-            2010:   70(ivec2) GroupNonUniformSMin 178 PartitionedExclusiveScanNV 2008 2009
-            2011:     71(ptr) AccessChain 31(data) 2005 63
-            2012:   25(ivec4) Load 2011
-            2013:   25(ivec4) VectorShuffle 2012 2010 4 5 2 3
-                              Store 2011 2013
-            2014:      6(int) Load 8(invocation)
-            2015:     71(ptr) AccessChain 31(data) 33 63
-            2016:   25(ivec4) Load 2015
-            2017:   78(ivec3) VectorShuffle 2016 2016 0 1 2
-            2018:   17(ivec4) Load 19(ballot)
-            2019:   78(ivec3) GroupNonUniformSMin 178 PartitionedExclusiveScanNV 2017 2018
-            2020:     71(ptr) AccessChain 31(data) 2014 63
-            2021:   25(ivec4) Load 2020
-            2022:   25(ivec4) VectorShuffle 2021 2019 4 5 6 3
-                              Store 2020 2022
-            2023:      6(int) Load 8(invocation)
-            2024:     71(ptr) AccessChain 31(data) 115 63
-            2025:   25(ivec4) Load 2024
-            2026:   17(ivec4) Load 19(ballot)
-            2027:   25(ivec4) GroupNonUniformSMin 178 PartitionedExclusiveScanNV 2025 2026
-            2028:     71(ptr) AccessChain 31(data) 2023 63
-                              Store 2028 2027
-            2029:      6(int) Load 8(invocation)
-            2030:     90(ptr) AccessChain 31(data) 34 33 35
-            2031:      6(int) Load 2030
-            2032:   17(ivec4) Load 19(ballot)
-            2033:      6(int) GroupNonUniformUMin 178 PartitionedExclusiveScanNV 2031 2032
-            2034:     90(ptr) AccessChain 31(data) 2029 33 35
-                              Store 2034 2033
-            2035:      6(int) Load 8(invocation)
-            2036:     40(ptr) AccessChain 31(data) 63 33
-            2037:   17(ivec4) Load 2036
-            2038:   96(ivec2) VectorShuffle 2037 2037 0 1
-            2039:   17(ivec4) Load 19(ballot)
-            2040:   96(ivec2) GroupNonUniformUMin 178 PartitionedExclusiveScanNV 2038 2039
-            2041:     40(ptr) AccessChain 31(data) 2035 33
-            2042:   17(ivec4) Load 2041
-            2043:   17(ivec4) VectorShuffle 2042 2040 4 5 2 3
-                              Store 2041 2043
-            2044:      6(int) Load 8(invocation)
-            2045:     40(ptr) AccessChain 31(data) 33 33
-            2046:   17(ivec4) Load 2045
-            2047:  103(ivec3) VectorShuffle 2046 2046 0 1 2
-            2048:   17(ivec4) Load 19(ballot)
-            2049:  103(ivec3) GroupNonUniformUMin 178 PartitionedExclusiveScanNV 2047 2048
-            2050:     40(ptr) AccessChain 31(data) 2044 33
-            2051:   17(ivec4) Load 2050
-            2052:   17(ivec4) VectorShuffle 2051 2049 4 5 6 3
-                              Store 2050 2052
-            2053:      6(int) Load 8(invocation)
-            2054:     40(ptr) AccessChain 31(data) 115 33
-            2055:   17(ivec4) Load 2054
-            2056:   17(ivec4) Load 19(ballot)
-            2057:   17(ivec4) GroupNonUniformUMin 178 PartitionedExclusiveScanNV 2055 2056
-            2058:     40(ptr) AccessChain 31(data) 2053 33
-                              Store 2058 2057
-            2059:      6(int) Load 8(invocation)
-            2060:    116(ptr) AccessChain 31(data) 34 115 35
-            2061:26(float64_t) Load 2060
-            2062:   17(ivec4) Load 19(ballot)
-            2063:26(float64_t) GroupNonUniformFMin 178 PartitionedExclusiveScanNV 2061 2062
-            2064:    116(ptr) AccessChain 31(data) 2059 115 35
-                              Store 2064 2063
-            2065:      6(int) Load 8(invocation)
-            2066:    123(ptr) AccessChain 31(data) 63 115
-            2067: 27(f64vec4) Load 2066
-            2068:122(f64vec2) VectorShuffle 2067 2067 0 1
-            2069:   17(ivec4) Load 19(ballot)
-            2070:122(f64vec2) GroupNonUniformFMin 178 PartitionedExclusiveScanNV 2068 2069
-            2071:    123(ptr) AccessChain 31(data) 2065 115
-            2072: 27(f64vec4) Load 2071
-            2073: 27(f64vec4) VectorShuffle 2072 2070 4 5 2 3
-                              Store 2071 2073
-            2074:      6(int) Load 8(invocation)
-            2075:    123(ptr) AccessChain 31(data) 33 115
-            2076: 27(f64vec4) Load 2075
-            2077:130(f64vec3) VectorShuffle 2076 2076 0 1 2
-            2078:   17(ivec4) Load 19(ballot)
-            2079:130(f64vec3) GroupNonUniformFMin 178 PartitionedExclusiveScanNV 2077 2078
-            2080:    123(ptr) AccessChain 31(data) 2074 115
-            2081: 27(f64vec4) Load 2080
-            2082: 27(f64vec4) VectorShuffle 2081 2079 4 5 6 3
-                              Store 2080 2082
+            2010:   96(ivec2) GroupNonUniformIAdd 178 PartitionedExclusiveScanNV 2008 2009
+            2011:     90(ptr) AccessChain 31(data) 2005 33 35
+            2012:      6(int) CompositeExtract 2010 0
+                              Store 2011 2012
+            2013:     90(ptr) AccessChain 31(data) 2005 33 189
+            2014:      6(int) CompositeExtract 2010 1
+                              Store 2013 2014
+            2015:      6(int) Load 8(invocation)
+            2016:     40(ptr) AccessChain 31(data) 33 33
+            2017:   17(ivec4) Load 2016
+            2018:  103(ivec3) VectorShuffle 2017 2017 0 1 2
+            2019:   17(ivec4) Load 19(ballot)
+            2020:  103(ivec3) GroupNonUniformIAdd 178 PartitionedExclusiveScanNV 2018 2019
+            2021:     90(ptr) AccessChain 31(data) 2015 33 35
+            2022:      6(int) CompositeExtract 2020 0
+                              Store 2021 2022
+            2023:     90(ptr) AccessChain 31(data) 2015 33 189
+            2024:      6(int) CompositeExtract 2020 1
+                              Store 2023 2024
+            2025:     90(ptr) AccessChain 31(data) 2015 33 202
+            2026:      6(int) CompositeExtract 2020 2
+                              Store 2025 2026
+            2027:      6(int) Load 8(invocation)
+            2028:     40(ptr) AccessChain 31(data) 115 33
+            2029:   17(ivec4) Load 2028
+            2030:   17(ivec4) Load 19(ballot)
+            2031:   17(ivec4) GroupNonUniformIAdd 178 PartitionedExclusiveScanNV 2029 2030
+            2032:     40(ptr) AccessChain 31(data) 2027 33
+                              Store 2032 2031
+            2033:      6(int) Load 8(invocation)
+            2034:    116(ptr) AccessChain 31(data) 34 115 35
+            2035:26(float64_t) Load 2034
+            2036:   17(ivec4) Load 19(ballot)
+            2037:26(float64_t) GroupNonUniformFAdd 178 PartitionedExclusiveScanNV 2035 2036
+            2038:    116(ptr) AccessChain 31(data) 2033 115 35
+                              Store 2038 2037
+            2039:      6(int) Load 8(invocation)
+            2040:    123(ptr) AccessChain 31(data) 63 115
+            2041: 27(f64vec4) Load 2040
+            2042:122(f64vec2) VectorShuffle 2041 2041 0 1
+            2043:   17(ivec4) Load 19(ballot)
+            2044:122(f64vec2) GroupNonUniformFAdd 178 PartitionedExclusiveScanNV 2042 2043
+            2045:    116(ptr) AccessChain 31(data) 2039 115 35
+            2046:26(float64_t) CompositeExtract 2044 0
+                              Store 2045 2046
+            2047:    116(ptr) AccessChain 31(data) 2039 115 189
+            2048:26(float64_t) CompositeExtract 2044 1
+                              Store 2047 2048
+            2049:      6(int) Load 8(invocation)
+            2050:    123(ptr) AccessChain 31(data) 33 115
+            2051: 27(f64vec4) Load 2050
+            2052:130(f64vec3) VectorShuffle 2051 2051 0 1 2
+            2053:   17(ivec4) Load 19(ballot)
+            2054:130(f64vec3) GroupNonUniformFAdd 178 PartitionedExclusiveScanNV 2052 2053
+            2055:    116(ptr) AccessChain 31(data) 2049 115 35
+            2056:26(float64_t) CompositeExtract 2054 0
+                              Store 2055 2056
+            2057:    116(ptr) AccessChain 31(data) 2049 115 189
+            2058:26(float64_t) CompositeExtract 2054 1
+                              Store 2057 2058
+            2059:    116(ptr) AccessChain 31(data) 2049 115 202
+            2060:26(float64_t) CompositeExtract 2054 2
+                              Store 2059 2060
+            2061:      6(int) Load 8(invocation)
+            2062:    123(ptr) AccessChain 31(data) 115 115
+            2063: 27(f64vec4) Load 2062
+            2064:   17(ivec4) Load 19(ballot)
+            2065: 27(f64vec4) GroupNonUniformFAdd 178 PartitionedExclusiveScanNV 2063 2064
+            2066:    123(ptr) AccessChain 31(data) 2061 115
+                              Store 2066 2065
+            2067:      6(int) Load 8(invocation)
+            2068:     36(ptr) AccessChain 31(data) 34 34 35
+            2069:   22(float) Load 2068
+            2070:   17(ivec4) Load 19(ballot)
+            2071:   22(float) GroupNonUniformFMul 178 PartitionedExclusiveScanNV 2069 2070
+            2072:     36(ptr) AccessChain 31(data) 2067 34 35
+                              Store 2072 2071
+            2073:      6(int) Load 8(invocation)
+            2074:     44(ptr) AccessChain 31(data) 63 34
+            2075:   23(fvec4) Load 2074
+            2076:   43(fvec2) VectorShuffle 2075 2075 0 1
+            2077:   17(ivec4) Load 19(ballot)
+            2078:   43(fvec2) GroupNonUniformFMul 178 PartitionedExclusiveScanNV 2076 2077
+            2079:     36(ptr) AccessChain 31(data) 2073 34 35
+            2080:   22(float) CompositeExtract 2078 0
+                              Store 2079 2080
+            2081:     36(ptr) AccessChain 31(data) 2073 34 189
+            2082:   22(float) CompositeExtract 2078 1
+                              Store 2081 2082
             2083:      6(int) Load 8(invocation)
-            2084:    123(ptr) AccessChain 31(data) 115 115
-            2085: 27(f64vec4) Load 2084
-            2086:   17(ivec4) Load 19(ballot)
-            2087: 27(f64vec4) GroupNonUniformFMin 178 PartitionedExclusiveScanNV 2085 2086
-            2088:    123(ptr) AccessChain 31(data) 2083 115
-                              Store 2088 2087
-            2089:      6(int) Load 8(invocation)
-            2090:     36(ptr) AccessChain 31(data) 34 34 35
-            2091:   22(float) Load 2090
-            2092:   17(ivec4) Load 19(ballot)
-            2093:   22(float) GroupNonUniformFMax 178 PartitionedExclusiveScanNV 2091 2092
-            2094:     36(ptr) AccessChain 31(data) 2089 34 35
-                              Store 2094 2093
+            2084:     44(ptr) AccessChain 31(data) 33 34
+            2085:   23(fvec4) Load 2084
+            2086:   51(fvec3) VectorShuffle 2085 2085 0 1 2
+            2087:   17(ivec4) Load 19(ballot)
+            2088:   51(fvec3) GroupNonUniformFMul 178 PartitionedExclusiveScanNV 2086 2087
+            2089:     36(ptr) AccessChain 31(data) 2083 34 35
+            2090:   22(float) CompositeExtract 2088 0
+                              Store 2089 2090
+            2091:     36(ptr) AccessChain 31(data) 2083 34 189
+            2092:   22(float) CompositeExtract 2088 1
+                              Store 2091 2092
+            2093:     36(ptr) AccessChain 31(data) 2083 34 202
+            2094:   22(float) CompositeExtract 2088 2
+                              Store 2093 2094
             2095:      6(int) Load 8(invocation)
-            2096:     44(ptr) AccessChain 31(data) 63 34
+            2096:     44(ptr) AccessChain 31(data) 115 34
             2097:   23(fvec4) Load 2096
-            2098:   43(fvec2) VectorShuffle 2097 2097 0 1
-            2099:   17(ivec4) Load 19(ballot)
-            2100:   43(fvec2) GroupNonUniformFMax 178 PartitionedExclusiveScanNV 2098 2099
-            2101:     44(ptr) AccessChain 31(data) 2095 34
-            2102:   23(fvec4) Load 2101
-            2103:   23(fvec4) VectorShuffle 2102 2100 4 5 2 3
-                              Store 2101 2103
-            2104:      6(int) Load 8(invocation)
-            2105:     44(ptr) AccessChain 31(data) 33 34
-            2106:   23(fvec4) Load 2105
-            2107:   51(fvec3) VectorShuffle 2106 2106 0 1 2
-            2108:   17(ivec4) Load 19(ballot)
-            2109:   51(fvec3) GroupNonUniformFMax 178 PartitionedExclusiveScanNV 2107 2108
-            2110:     44(ptr) AccessChain 31(data) 2104 34
-            2111:   23(fvec4) Load 2110
-            2112:   23(fvec4) VectorShuffle 2111 2109 4 5 6 3
-                              Store 2110 2112
-            2113:      6(int) Load 8(invocation)
-            2114:     44(ptr) AccessChain 31(data) 115 34
-            2115:   23(fvec4) Load 2114
-            2116:   17(ivec4) Load 19(ballot)
-            2117:   23(fvec4) GroupNonUniformFMax 178 PartitionedExclusiveScanNV 2115 2116
-            2118:     44(ptr) AccessChain 31(data) 2113 34
-                              Store 2118 2117
-            2119:      6(int) Load 8(invocation)
-            2120:     64(ptr) AccessChain 31(data) 34 63 35
-            2121:     24(int) Load 2120
-            2122:   17(ivec4) Load 19(ballot)
-            2123:     24(int) GroupNonUniformSMax 178 PartitionedExclusiveScanNV 2121 2122
-            2124:     64(ptr) AccessChain 31(data) 2119 63 35
-                              Store 2124 2123
-            2125:      6(int) Load 8(invocation)
-            2126:     71(ptr) AccessChain 31(data) 63 63
-            2127:   25(ivec4) Load 2126
-            2128:   70(ivec2) VectorShuffle 2127 2127 0 1
-            2129:   17(ivec4) Load 19(ballot)
-            2130:   70(ivec2) GroupNonUniformSMax 178 PartitionedExclusiveScanNV 2128 2129
-            2131:     71(ptr) AccessChain 31(data) 2125 63
-            2132:   25(ivec4) Load 2131
-            2133:   25(ivec4) VectorShuffle 2132 2130 4 5 2 3
-                              Store 2131 2133
-            2134:      6(int) Load 8(invocation)
-            2135:     71(ptr) AccessChain 31(data) 33 63
-            2136:   25(ivec4) Load 2135
-            2137:   78(ivec3) VectorShuffle 2136 2136 0 1 2
+            2098:   17(ivec4) Load 19(ballot)
+            2099:   23(fvec4) GroupNonUniformFMul 178 PartitionedExclusiveScanNV 2097 2098
+            2100:     44(ptr) AccessChain 31(data) 2095 34
+                              Store 2100 2099
+            2101:      6(int) Load 8(invocation)
+            2102:     64(ptr) AccessChain 31(data) 34 63 35
+            2103:     24(int) Load 2102
+            2104:   17(ivec4) Load 19(ballot)
+            2105:     24(int) GroupNonUniformIMul 178 PartitionedExclusiveScanNV 2103 2104
+            2106:     64(ptr) AccessChain 31(data) 2101 63 35
+                              Store 2106 2105
+            2107:      6(int) Load 8(invocation)
+            2108:     71(ptr) AccessChain 31(data) 63 63
+            2109:   25(ivec4) Load 2108
+            2110:   70(ivec2) VectorShuffle 2109 2109 0 1
+            2111:   17(ivec4) Load 19(ballot)
+            2112:   70(ivec2) GroupNonUniformIMul 178 PartitionedExclusiveScanNV 2110 2111
+            2113:     64(ptr) AccessChain 31(data) 2107 63 35
+            2114:     24(int) CompositeExtract 2112 0
+                              Store 2113 2114
+            2115:     64(ptr) AccessChain 31(data) 2107 63 189
+            2116:     24(int) CompositeExtract 2112 1
+                              Store 2115 2116
+            2117:      6(int) Load 8(invocation)
+            2118:     71(ptr) AccessChain 31(data) 33 63
+            2119:   25(ivec4) Load 2118
+            2120:   78(ivec3) VectorShuffle 2119 2119 0 1 2
+            2121:   17(ivec4) Load 19(ballot)
+            2122:   78(ivec3) GroupNonUniformIMul 178 PartitionedExclusiveScanNV 2120 2121
+            2123:     64(ptr) AccessChain 31(data) 2117 63 35
+            2124:     24(int) CompositeExtract 2122 0
+                              Store 2123 2124
+            2125:     64(ptr) AccessChain 31(data) 2117 63 189
+            2126:     24(int) CompositeExtract 2122 1
+                              Store 2125 2126
+            2127:     64(ptr) AccessChain 31(data) 2117 63 202
+            2128:     24(int) CompositeExtract 2122 2
+                              Store 2127 2128
+            2129:      6(int) Load 8(invocation)
+            2130:     71(ptr) AccessChain 31(data) 115 63
+            2131:   25(ivec4) Load 2130
+            2132:   17(ivec4) Load 19(ballot)
+            2133:   25(ivec4) GroupNonUniformIMul 178 PartitionedExclusiveScanNV 2131 2132
+            2134:     71(ptr) AccessChain 31(data) 2129 63
+                              Store 2134 2133
+            2135:      6(int) Load 8(invocation)
+            2136:     90(ptr) AccessChain 31(data) 34 33 35
+            2137:      6(int) Load 2136
             2138:   17(ivec4) Load 19(ballot)
-            2139:   78(ivec3) GroupNonUniformSMax 178 PartitionedExclusiveScanNV 2137 2138
-            2140:     71(ptr) AccessChain 31(data) 2134 63
-            2141:   25(ivec4) Load 2140
-            2142:   25(ivec4) VectorShuffle 2141 2139 4 5 6 3
-                              Store 2140 2142
-            2143:      6(int) Load 8(invocation)
-            2144:     71(ptr) AccessChain 31(data) 115 63
-            2145:   25(ivec4) Load 2144
-            2146:   17(ivec4) Load 19(ballot)
-            2147:   25(ivec4) GroupNonUniformSMax 178 PartitionedExclusiveScanNV 2145 2146
-            2148:     71(ptr) AccessChain 31(data) 2143 63
-                              Store 2148 2147
-            2149:      6(int) Load 8(invocation)
-            2150:     90(ptr) AccessChain 31(data) 34 33 35
-            2151:      6(int) Load 2150
-            2152:   17(ivec4) Load 19(ballot)
-            2153:      6(int) GroupNonUniformUMax 178 PartitionedExclusiveScanNV 2151 2152
-            2154:     90(ptr) AccessChain 31(data) 2149 33 35
-                              Store 2154 2153
-            2155:      6(int) Load 8(invocation)
-            2156:     40(ptr) AccessChain 31(data) 63 33
-            2157:   17(ivec4) Load 2156
-            2158:   96(ivec2) VectorShuffle 2157 2157 0 1
-            2159:   17(ivec4) Load 19(ballot)
-            2160:   96(ivec2) GroupNonUniformUMax 178 PartitionedExclusiveScanNV 2158 2159
-            2161:     40(ptr) AccessChain 31(data) 2155 33
-            2162:   17(ivec4) Load 2161
-            2163:   17(ivec4) VectorShuffle 2162 2160 4 5 2 3
-                              Store 2161 2163
-            2164:      6(int) Load 8(invocation)
-            2165:     40(ptr) AccessChain 31(data) 33 33
-            2166:   17(ivec4) Load 2165
-            2167:  103(ivec3) VectorShuffle 2166 2166 0 1 2
-            2168:   17(ivec4) Load 19(ballot)
-            2169:  103(ivec3) GroupNonUniformUMax 178 PartitionedExclusiveScanNV 2167 2168
-            2170:     40(ptr) AccessChain 31(data) 2164 33
-            2171:   17(ivec4) Load 2170
-            2172:   17(ivec4) VectorShuffle 2171 2169 4 5 6 3
-                              Store 2170 2172
-            2173:      6(int) Load 8(invocation)
-            2174:     40(ptr) AccessChain 31(data) 115 33
-            2175:   17(ivec4) Load 2174
-            2176:   17(ivec4) Load 19(ballot)
-            2177:   17(ivec4) GroupNonUniformUMax 178 PartitionedExclusiveScanNV 2175 2176
-            2178:     40(ptr) AccessChain 31(data) 2173 33
-                              Store 2178 2177
-            2179:      6(int) Load 8(invocation)
-            2180:    116(ptr) AccessChain 31(data) 34 115 35
-            2181:26(float64_t) Load 2180
-            2182:   17(ivec4) Load 19(ballot)
-            2183:26(float64_t) GroupNonUniformFMax 178 PartitionedExclusiveScanNV 2181 2182
-            2184:    116(ptr) AccessChain 31(data) 2179 115 35
-                              Store 2184 2183
+            2139:      6(int) GroupNonUniformIMul 178 PartitionedExclusiveScanNV 2137 2138
+            2140:     90(ptr) AccessChain 31(data) 2135 33 35
+                              Store 2140 2139
+            2141:      6(int) Load 8(invocation)
+            2142:     40(ptr) AccessChain 31(data) 63 33
+            2143:   17(ivec4) Load 2142
+            2144:   96(ivec2) VectorShuffle 2143 2143 0 1
+            2145:   17(ivec4) Load 19(ballot)
+            2146:   96(ivec2) GroupNonUniformIMul 178 PartitionedExclusiveScanNV 2144 2145
+            2147:     90(ptr) AccessChain 31(data) 2141 33 35
+            2148:      6(int) CompositeExtract 2146 0
+                              Store 2147 2148
+            2149:     90(ptr) AccessChain 31(data) 2141 33 189
+            2150:      6(int) CompositeExtract 2146 1
+                              Store 2149 2150
+            2151:      6(int) Load 8(invocation)
+            2152:     40(ptr) AccessChain 31(data) 33 33
+            2153:   17(ivec4) Load 2152
+            2154:  103(ivec3) VectorShuffle 2153 2153 0 1 2
+            2155:   17(ivec4) Load 19(ballot)
+            2156:  103(ivec3) GroupNonUniformIMul 178 PartitionedExclusiveScanNV 2154 2155
+            2157:     90(ptr) AccessChain 31(data) 2151 33 35
+            2158:      6(int) CompositeExtract 2156 0
+                              Store 2157 2158
+            2159:     90(ptr) AccessChain 31(data) 2151 33 189
+            2160:      6(int) CompositeExtract 2156 1
+                              Store 2159 2160
+            2161:     90(ptr) AccessChain 31(data) 2151 33 202
+            2162:      6(int) CompositeExtract 2156 2
+                              Store 2161 2162
+            2163:      6(int) Load 8(invocation)
+            2164:     40(ptr) AccessChain 31(data) 115 33
+            2165:   17(ivec4) Load 2164
+            2166:   17(ivec4) Load 19(ballot)
+            2167:   17(ivec4) GroupNonUniformIMul 178 PartitionedExclusiveScanNV 2165 2166
+            2168:     40(ptr) AccessChain 31(data) 2163 33
+                              Store 2168 2167
+            2169:      6(int) Load 8(invocation)
+            2170:    116(ptr) AccessChain 31(data) 34 115 35
+            2171:26(float64_t) Load 2170
+            2172:   17(ivec4) Load 19(ballot)
+            2173:26(float64_t) GroupNonUniformFMul 178 PartitionedExclusiveScanNV 2171 2172
+            2174:    116(ptr) AccessChain 31(data) 2169 115 35
+                              Store 2174 2173
+            2175:      6(int) Load 8(invocation)
+            2176:    123(ptr) AccessChain 31(data) 63 115
+            2177: 27(f64vec4) Load 2176
+            2178:122(f64vec2) VectorShuffle 2177 2177 0 1
+            2179:   17(ivec4) Load 19(ballot)
+            2180:122(f64vec2) GroupNonUniformFMul 178 PartitionedExclusiveScanNV 2178 2179
+            2181:    116(ptr) AccessChain 31(data) 2175 115 35
+            2182:26(float64_t) CompositeExtract 2180 0
+                              Store 2181 2182
+            2183:    116(ptr) AccessChain 31(data) 2175 115 189
+            2184:26(float64_t) CompositeExtract 2180 1
+                              Store 2183 2184
             2185:      6(int) Load 8(invocation)
-            2186:    123(ptr) AccessChain 31(data) 63 115
+            2186:    123(ptr) AccessChain 31(data) 33 115
             2187: 27(f64vec4) Load 2186
-            2188:122(f64vec2) VectorShuffle 2187 2187 0 1
+            2188:130(f64vec3) VectorShuffle 2187 2187 0 1 2
             2189:   17(ivec4) Load 19(ballot)
-            2190:122(f64vec2) GroupNonUniformFMax 178 PartitionedExclusiveScanNV 2188 2189
-            2191:    123(ptr) AccessChain 31(data) 2185 115
-            2192: 27(f64vec4) Load 2191
-            2193: 27(f64vec4) VectorShuffle 2192 2190 4 5 2 3
-                              Store 2191 2193
-            2194:      6(int) Load 8(invocation)
-            2195:    123(ptr) AccessChain 31(data) 33 115
-            2196: 27(f64vec4) Load 2195
-            2197:130(f64vec3) VectorShuffle 2196 2196 0 1 2
-            2198:   17(ivec4) Load 19(ballot)
-            2199:130(f64vec3) GroupNonUniformFMax 178 PartitionedExclusiveScanNV 2197 2198
-            2200:    123(ptr) AccessChain 31(data) 2194 115
-            2201: 27(f64vec4) Load 2200
-            2202: 27(f64vec4) VectorShuffle 2201 2199 4 5 6 3
-                              Store 2200 2202
+            2190:130(f64vec3) GroupNonUniformFMul 178 PartitionedExclusiveScanNV 2188 2189
+            2191:    116(ptr) AccessChain 31(data) 2185 115 35
+            2192:26(float64_t) CompositeExtract 2190 0
+                              Store 2191 2192
+            2193:    116(ptr) AccessChain 31(data) 2185 115 189
+            2194:26(float64_t) CompositeExtract 2190 1
+                              Store 2193 2194
+            2195:    116(ptr) AccessChain 31(data) 2185 115 202
+            2196:26(float64_t) CompositeExtract 2190 2
+                              Store 2195 2196
+            2197:      6(int) Load 8(invocation)
+            2198:    123(ptr) AccessChain 31(data) 115 115
+            2199: 27(f64vec4) Load 2198
+            2200:   17(ivec4) Load 19(ballot)
+            2201: 27(f64vec4) GroupNonUniformFMul 178 PartitionedExclusiveScanNV 2199 2200
+            2202:    123(ptr) AccessChain 31(data) 2197 115
+                              Store 2202 2201
             2203:      6(int) Load 8(invocation)
-            2204:    123(ptr) AccessChain 31(data) 115 115
-            2205: 27(f64vec4) Load 2204
+            2204:     36(ptr) AccessChain 31(data) 34 34 35
+            2205:   22(float) Load 2204
             2206:   17(ivec4) Load 19(ballot)
-            2207: 27(f64vec4) GroupNonUniformFMax 178 PartitionedExclusiveScanNV 2205 2206
-            2208:    123(ptr) AccessChain 31(data) 2203 115
+            2207:   22(float) GroupNonUniformFMin 178 PartitionedExclusiveScanNV 2205 2206
+            2208:     36(ptr) AccessChain 31(data) 2203 34 35
                               Store 2208 2207
             2209:      6(int) Load 8(invocation)
-            2210:     64(ptr) AccessChain 31(data) 34 63 35
-            2211:     24(int) Load 2210
-            2212:   17(ivec4) Load 19(ballot)
-            2213:     24(int) GroupNonUniformBitwiseAnd 178 PartitionedExclusiveScanNV 2211 2212
-            2214:     64(ptr) AccessChain 31(data) 2209 63 35
-                              Store 2214 2213
-            2215:      6(int) Load 8(invocation)
-            2216:     71(ptr) AccessChain 31(data) 63 63
-            2217:   25(ivec4) Load 2216
-            2218:   70(ivec2) VectorShuffle 2217 2217 0 1
-            2219:   17(ivec4) Load 19(ballot)
-            2220:   70(ivec2) GroupNonUniformBitwiseAnd 178 PartitionedExclusiveScanNV 2218 2219
-            2221:     71(ptr) AccessChain 31(data) 2215 63
-            2222:   25(ivec4) Load 2221
-            2223:   25(ivec4) VectorShuffle 2222 2220 4 5 2 3
-                              Store 2221 2223
-            2224:      6(int) Load 8(invocation)
-            2225:     71(ptr) AccessChain 31(data) 33 63
-            2226:   25(ivec4) Load 2225
-            2227:   78(ivec3) VectorShuffle 2226 2226 0 1 2
-            2228:   17(ivec4) Load 19(ballot)
-            2229:   78(ivec3) GroupNonUniformBitwiseAnd 178 PartitionedExclusiveScanNV 2227 2228
-            2230:     71(ptr) AccessChain 31(data) 2224 63
-            2231:   25(ivec4) Load 2230
-            2232:   25(ivec4) VectorShuffle 2231 2229 4 5 6 3
-                              Store 2230 2232
-            2233:      6(int) Load 8(invocation)
-            2234:     71(ptr) AccessChain 31(data) 115 63
-            2235:   25(ivec4) Load 2234
-            2236:   17(ivec4) Load 19(ballot)
-            2237:   25(ivec4) GroupNonUniformBitwiseAnd 178 PartitionedExclusiveScanNV 2235 2236
-            2238:     71(ptr) AccessChain 31(data) 2233 63
-                              Store 2238 2237
-            2239:      6(int) Load 8(invocation)
-            2240:     90(ptr) AccessChain 31(data) 34 33 35
-            2241:      6(int) Load 2240
-            2242:   17(ivec4) Load 19(ballot)
-            2243:      6(int) GroupNonUniformBitwiseAnd 178 PartitionedExclusiveScanNV 2241 2242
-            2244:     90(ptr) AccessChain 31(data) 2239 33 35
-                              Store 2244 2243
-            2245:      6(int) Load 8(invocation)
-            2246:     40(ptr) AccessChain 31(data) 63 33
-            2247:   17(ivec4) Load 2246
-            2248:   96(ivec2) VectorShuffle 2247 2247 0 1
-            2249:   17(ivec4) Load 19(ballot)
-            2250:   96(ivec2) GroupNonUniformBitwiseAnd 178 PartitionedExclusiveScanNV 2248 2249
-            2251:     40(ptr) AccessChain 31(data) 2245 33
-            2252:   17(ivec4) Load 2251
-            2253:   17(ivec4) VectorShuffle 2252 2250 4 5 2 3
-                              Store 2251 2253
-            2254:      6(int) Load 8(invocation)
-            2255:     40(ptr) AccessChain 31(data) 33 33
-            2256:   17(ivec4) Load 2255
-            2257:  103(ivec3) VectorShuffle 2256 2256 0 1 2
-            2258:   17(ivec4) Load 19(ballot)
-            2259:  103(ivec3) GroupNonUniformBitwiseAnd 178 PartitionedExclusiveScanNV 2257 2258
-            2260:     40(ptr) AccessChain 31(data) 2254 33
-            2261:   17(ivec4) Load 2260
-            2262:   17(ivec4) VectorShuffle 2261 2259 4 5 6 3
-                              Store 2260 2262
-            2263:      6(int) Load 8(invocation)
-            2264:     40(ptr) AccessChain 31(data) 115 33
-            2265:   17(ivec4) Load 2264
-            2266:   17(ivec4) Load 19(ballot)
-            2267:   17(ivec4) GroupNonUniformBitwiseAnd 178 PartitionedExclusiveScanNV 2265 2266
-            2268:     40(ptr) AccessChain 31(data) 2263 33
-                              Store 2268 2267
-            2269:      6(int) Load 8(invocation)
-            2270:     64(ptr) AccessChain 31(data) 34 63 35
-            2271:     24(int) Load 2270
-            2272:   144(bool) SLessThan 2271 34
-            2273:   17(ivec4) Load 19(ballot)
-            2274:   144(bool) GroupNonUniformLogicalAnd 178 PartitionedExclusiveScanNV 2272 2273
-            2275:     24(int) Select 2274 63 34
-            2276:     64(ptr) AccessChain 31(data) 2269 63 35
+            2210:     44(ptr) AccessChain 31(data) 63 34
+            2211:   23(fvec4) Load 2210
+            2212:   43(fvec2) VectorShuffle 2211 2211 0 1
+            2213:   17(ivec4) Load 19(ballot)
+            2214:   43(fvec2) GroupNonUniformFMin 178 PartitionedExclusiveScanNV 2212 2213
+            2215:     36(ptr) AccessChain 31(data) 2209 34 35
+            2216:   22(float) CompositeExtract 2214 0
+                              Store 2215 2216
+            2217:     36(ptr) AccessChain 31(data) 2209 34 189
+            2218:   22(float) CompositeExtract 2214 1
+                              Store 2217 2218
+            2219:      6(int) Load 8(invocation)
+            2220:     44(ptr) AccessChain 31(data) 33 34
+            2221:   23(fvec4) Load 2220
+            2222:   51(fvec3) VectorShuffle 2221 2221 0 1 2
+            2223:   17(ivec4) Load 19(ballot)
+            2224:   51(fvec3) GroupNonUniformFMin 178 PartitionedExclusiveScanNV 2222 2223
+            2225:     36(ptr) AccessChain 31(data) 2219 34 35
+            2226:   22(float) CompositeExtract 2224 0
+                              Store 2225 2226
+            2227:     36(ptr) AccessChain 31(data) 2219 34 189
+            2228:   22(float) CompositeExtract 2224 1
+                              Store 2227 2228
+            2229:     36(ptr) AccessChain 31(data) 2219 34 202
+            2230:   22(float) CompositeExtract 2224 2
+                              Store 2229 2230
+            2231:      6(int) Load 8(invocation)
+            2232:     44(ptr) AccessChain 31(data) 115 34
+            2233:   23(fvec4) Load 2232
+            2234:   17(ivec4) Load 19(ballot)
+            2235:   23(fvec4) GroupNonUniformFMin 178 PartitionedExclusiveScanNV 2233 2234
+            2236:     44(ptr) AccessChain 31(data) 2231 34
+                              Store 2236 2235
+            2237:      6(int) Load 8(invocation)
+            2238:     64(ptr) AccessChain 31(data) 34 63 35
+            2239:     24(int) Load 2238
+            2240:   17(ivec4) Load 19(ballot)
+            2241:     24(int) GroupNonUniformSMin 178 PartitionedExclusiveScanNV 2239 2240
+            2242:     64(ptr) AccessChain 31(data) 2237 63 35
+                              Store 2242 2241
+            2243:      6(int) Load 8(invocation)
+            2244:     71(ptr) AccessChain 31(data) 63 63
+            2245:   25(ivec4) Load 2244
+            2246:   70(ivec2) VectorShuffle 2245 2245 0 1
+            2247:   17(ivec4) Load 19(ballot)
+            2248:   70(ivec2) GroupNonUniformSMin 178 PartitionedExclusiveScanNV 2246 2247
+            2249:     64(ptr) AccessChain 31(data) 2243 63 35
+            2250:     24(int) CompositeExtract 2248 0
+                              Store 2249 2250
+            2251:     64(ptr) AccessChain 31(data) 2243 63 189
+            2252:     24(int) CompositeExtract 2248 1
+                              Store 2251 2252
+            2253:      6(int) Load 8(invocation)
+            2254:     71(ptr) AccessChain 31(data) 33 63
+            2255:   25(ivec4) Load 2254
+            2256:   78(ivec3) VectorShuffle 2255 2255 0 1 2
+            2257:   17(ivec4) Load 19(ballot)
+            2258:   78(ivec3) GroupNonUniformSMin 178 PartitionedExclusiveScanNV 2256 2257
+            2259:     64(ptr) AccessChain 31(data) 2253 63 35
+            2260:     24(int) CompositeExtract 2258 0
+                              Store 2259 2260
+            2261:     64(ptr) AccessChain 31(data) 2253 63 189
+            2262:     24(int) CompositeExtract 2258 1
+                              Store 2261 2262
+            2263:     64(ptr) AccessChain 31(data) 2253 63 202
+            2264:     24(int) CompositeExtract 2258 2
+                              Store 2263 2264
+            2265:      6(int) Load 8(invocation)
+            2266:     71(ptr) AccessChain 31(data) 115 63
+            2267:   25(ivec4) Load 2266
+            2268:   17(ivec4) Load 19(ballot)
+            2269:   25(ivec4) GroupNonUniformSMin 178 PartitionedExclusiveScanNV 2267 2268
+            2270:     71(ptr) AccessChain 31(data) 2265 63
+                              Store 2270 2269
+            2271:      6(int) Load 8(invocation)
+            2272:     90(ptr) AccessChain 31(data) 34 33 35
+            2273:      6(int) Load 2272
+            2274:   17(ivec4) Load 19(ballot)
+            2275:      6(int) GroupNonUniformUMin 178 PartitionedExclusiveScanNV 2273 2274
+            2276:     90(ptr) AccessChain 31(data) 2271 33 35
                               Store 2276 2275
             2277:      6(int) Load 8(invocation)
-            2278:     71(ptr) AccessChain 31(data) 63 63
-            2279:   25(ivec4) Load 2278
-            2280:   70(ivec2) VectorShuffle 2279 2279 0 1
-            2281:  152(bvec2) SLessThan 2280 727
-            2282:   17(ivec4) Load 19(ballot)
-            2283:  152(bvec2) GroupNonUniformLogicalAnd 178 PartitionedExclusiveScanNV 2281 2282
-            2284:   70(ivec2) Select 2283 731 727
-            2285:     71(ptr) AccessChain 31(data) 2277 63
-            2286:   25(ivec4) Load 2285
-            2287:   25(ivec4) VectorShuffle 2286 2284 4 5 2 3
-                              Store 2285 2287
-            2288:      6(int) Load 8(invocation)
-            2289:     71(ptr) AccessChain 31(data) 63 63
-            2290:   25(ivec4) Load 2289
-            2291:   78(ivec3) VectorShuffle 2290 2290 0 1 2
-            2292:  161(bvec3) SLessThan 2291 740
-            2293:   17(ivec4) Load 19(ballot)
-            2294:  161(bvec3) GroupNonUniformLogicalAnd 178 PartitionedExclusiveScanNV 2292 2293
-            2295:   78(ivec3) Select 2294 744 740
-            2296:     71(ptr) AccessChain 31(data) 2288 63
-            2297:   25(ivec4) Load 2296
-            2298:   25(ivec4) VectorShuffle 2297 2295 4 5 6 3
-                              Store 2296 2298
+            2278:     40(ptr) AccessChain 31(data) 63 33
+            2279:   17(ivec4) Load 2278
+            2280:   96(ivec2) VectorShuffle 2279 2279 0 1
+            2281:   17(ivec4) Load 19(ballot)
+            2282:   96(ivec2) GroupNonUniformUMin 178 PartitionedExclusiveScanNV 2280 2281
+            2283:     90(ptr) AccessChain 31(data) 2277 33 35
+            2284:      6(int) CompositeExtract 2282 0
+                              Store 2283 2284
+            2285:     90(ptr) AccessChain 31(data) 2277 33 189
+            2286:      6(int) CompositeExtract 2282 1
+                              Store 2285 2286
+            2287:      6(int) Load 8(invocation)
+            2288:     40(ptr) AccessChain 31(data) 33 33
+            2289:   17(ivec4) Load 2288
+            2290:  103(ivec3) VectorShuffle 2289 2289 0 1 2
+            2291:   17(ivec4) Load 19(ballot)
+            2292:  103(ivec3) GroupNonUniformUMin 178 PartitionedExclusiveScanNV 2290 2291
+            2293:     90(ptr) AccessChain 31(data) 2287 33 35
+            2294:      6(int) CompositeExtract 2292 0
+                              Store 2293 2294
+            2295:     90(ptr) AccessChain 31(data) 2287 33 189
+            2296:      6(int) CompositeExtract 2292 1
+                              Store 2295 2296
+            2297:     90(ptr) AccessChain 31(data) 2287 33 202
+            2298:      6(int) CompositeExtract 2292 2
+                              Store 2297 2298
             2299:      6(int) Load 8(invocation)
-            2300:     71(ptr) AccessChain 31(data) 63 63
-            2301:   25(ivec4) Load 2300
-            2302:  169(bvec4) SLessThan 2301 752
-            2303:   17(ivec4) Load 19(ballot)
-            2304:  169(bvec4) GroupNonUniformLogicalAnd 178 PartitionedExclusiveScanNV 2302 2303
-            2305:   25(ivec4) Select 2304 756 752
-            2306:     71(ptr) AccessChain 31(data) 2299 63
-                              Store 2306 2305
-            2307:      6(int) Load 8(invocation)
-            2308:     64(ptr) AccessChain 31(data) 34 63 35
-            2309:     24(int) Load 2308
-            2310:   17(ivec4) Load 19(ballot)
-            2311:     24(int) GroupNonUniformBitwiseOr 178 PartitionedExclusiveScanNV 2309 2310
-            2312:     64(ptr) AccessChain 31(data) 2307 63 35
-                              Store 2312 2311
-            2313:      6(int) Load 8(invocation)
-            2314:     71(ptr) AccessChain 31(data) 63 63
-            2315:   25(ivec4) Load 2314
-            2316:   70(ivec2) VectorShuffle 2315 2315 0 1
-            2317:   17(ivec4) Load 19(ballot)
-            2318:   70(ivec2) GroupNonUniformBitwiseOr 178 PartitionedExclusiveScanNV 2316 2317
-            2319:     71(ptr) AccessChain 31(data) 2313 63
-            2320:   25(ivec4) Load 2319
-            2321:   25(ivec4) VectorShuffle 2320 2318 4 5 2 3
-                              Store 2319 2321
-            2322:      6(int) Load 8(invocation)
-            2323:     71(ptr) AccessChain 31(data) 33 63
-            2324:   25(ivec4) Load 2323
-            2325:   78(ivec3) VectorShuffle 2324 2324 0 1 2
-            2326:   17(ivec4) Load 19(ballot)
-            2327:   78(ivec3) GroupNonUniformBitwiseOr 178 PartitionedExclusiveScanNV 2325 2326
-            2328:     71(ptr) AccessChain 31(data) 2322 63
-            2329:   25(ivec4) Load 2328
-            2330:   25(ivec4) VectorShuffle 2329 2327 4 5 6 3
-                              Store 2328 2330
-            2331:      6(int) Load 8(invocation)
-            2332:     71(ptr) AccessChain 31(data) 115 63
-            2333:   25(ivec4) Load 2332
-            2334:   17(ivec4) Load 19(ballot)
-            2335:   25(ivec4) GroupNonUniformBitwiseOr 178 PartitionedExclusiveScanNV 2333 2334
-            2336:     71(ptr) AccessChain 31(data) 2331 63
-                              Store 2336 2335
-            2337:      6(int) Load 8(invocation)
-            2338:     90(ptr) AccessChain 31(data) 34 33 35
-            2339:      6(int) Load 2338
-            2340:   17(ivec4) Load 19(ballot)
-            2341:      6(int) GroupNonUniformBitwiseOr 178 PartitionedExclusiveScanNV 2339 2340
-            2342:     90(ptr) AccessChain 31(data) 2337 33 35
-                              Store 2342 2341
-            2343:      6(int) Load 8(invocation)
-            2344:     40(ptr) AccessChain 31(data) 63 33
-            2345:   17(ivec4) Load 2344
-            2346:   96(ivec2) VectorShuffle 2345 2345 0 1
-            2347:   17(ivec4) Load 19(ballot)
-            2348:   96(ivec2) GroupNonUniformBitwiseOr 178 PartitionedExclusiveScanNV 2346 2347
-            2349:     40(ptr) AccessChain 31(data) 2343 33
-            2350:   17(ivec4) Load 2349
-            2351:   17(ivec4) VectorShuffle 2350 2348 4 5 2 3
-                              Store 2349 2351
-            2352:      6(int) Load 8(invocation)
-            2353:     40(ptr) AccessChain 31(data) 33 33
-            2354:   17(ivec4) Load 2353
-            2355:  103(ivec3) VectorShuffle 2354 2354 0 1 2
-            2356:   17(ivec4) Load 19(ballot)
-            2357:  103(ivec3) GroupNonUniformBitwiseOr 178 PartitionedExclusiveScanNV 2355 2356
-            2358:     40(ptr) AccessChain 31(data) 2352 33
-            2359:   17(ivec4) Load 2358
-            2360:   17(ivec4) VectorShuffle 2359 2357 4 5 6 3
-                              Store 2358 2360
-            2361:      6(int) Load 8(invocation)
-            2362:     40(ptr) AccessChain 31(data) 115 33
-            2363:   17(ivec4) Load 2362
-            2364:   17(ivec4) Load 19(ballot)
-            2365:   17(ivec4) GroupNonUniformBitwiseOr 178 PartitionedExclusiveScanNV 2363 2364
-            2366:     40(ptr) AccessChain 31(data) 2361 33
-                              Store 2366 2365
+            2300:     40(ptr) AccessChain 31(data) 115 33
+            2301:   17(ivec4) Load 2300
+            2302:   17(ivec4) Load 19(ballot)
+            2303:   17(ivec4) GroupNonUniformUMin 178 PartitionedExclusiveScanNV 2301 2302
+            2304:     40(ptr) AccessChain 31(data) 2299 33
+                              Store 2304 2303
+            2305:      6(int) Load 8(invocation)
+            2306:    116(ptr) AccessChain 31(data) 34 115 35
+            2307:26(float64_t) Load 2306
+            2308:   17(ivec4) Load 19(ballot)
+            2309:26(float64_t) GroupNonUniformFMin 178 PartitionedExclusiveScanNV 2307 2308
+            2310:    116(ptr) AccessChain 31(data) 2305 115 35
+                              Store 2310 2309
+            2311:      6(int) Load 8(invocation)
+            2312:    123(ptr) AccessChain 31(data) 63 115
+            2313: 27(f64vec4) Load 2312
+            2314:122(f64vec2) VectorShuffle 2313 2313 0 1
+            2315:   17(ivec4) Load 19(ballot)
+            2316:122(f64vec2) GroupNonUniformFMin 178 PartitionedExclusiveScanNV 2314 2315
+            2317:    116(ptr) AccessChain 31(data) 2311 115 35
+            2318:26(float64_t) CompositeExtract 2316 0
+                              Store 2317 2318
+            2319:    116(ptr) AccessChain 31(data) 2311 115 189
+            2320:26(float64_t) CompositeExtract 2316 1
+                              Store 2319 2320
+            2321:      6(int) Load 8(invocation)
+            2322:    123(ptr) AccessChain 31(data) 33 115
+            2323: 27(f64vec4) Load 2322
+            2324:130(f64vec3) VectorShuffle 2323 2323 0 1 2
+            2325:   17(ivec4) Load 19(ballot)
+            2326:130(f64vec3) GroupNonUniformFMin 178 PartitionedExclusiveScanNV 2324 2325
+            2327:    116(ptr) AccessChain 31(data) 2321 115 35
+            2328:26(float64_t) CompositeExtract 2326 0
+                              Store 2327 2328
+            2329:    116(ptr) AccessChain 31(data) 2321 115 189
+            2330:26(float64_t) CompositeExtract 2326 1
+                              Store 2329 2330
+            2331:    116(ptr) AccessChain 31(data) 2321 115 202
+            2332:26(float64_t) CompositeExtract 2326 2
+                              Store 2331 2332
+            2333:      6(int) Load 8(invocation)
+            2334:    123(ptr) AccessChain 31(data) 115 115
+            2335: 27(f64vec4) Load 2334
+            2336:   17(ivec4) Load 19(ballot)
+            2337: 27(f64vec4) GroupNonUniformFMin 178 PartitionedExclusiveScanNV 2335 2336
+            2338:    123(ptr) AccessChain 31(data) 2333 115
+                              Store 2338 2337
+            2339:      6(int) Load 8(invocation)
+            2340:     36(ptr) AccessChain 31(data) 34 34 35
+            2341:   22(float) Load 2340
+            2342:   17(ivec4) Load 19(ballot)
+            2343:   22(float) GroupNonUniformFMax 178 PartitionedExclusiveScanNV 2341 2342
+            2344:     36(ptr) AccessChain 31(data) 2339 34 35
+                              Store 2344 2343
+            2345:      6(int) Load 8(invocation)
+            2346:     44(ptr) AccessChain 31(data) 63 34
+            2347:   23(fvec4) Load 2346
+            2348:   43(fvec2) VectorShuffle 2347 2347 0 1
+            2349:   17(ivec4) Load 19(ballot)
+            2350:   43(fvec2) GroupNonUniformFMax 178 PartitionedExclusiveScanNV 2348 2349
+            2351:     36(ptr) AccessChain 31(data) 2345 34 35
+            2352:   22(float) CompositeExtract 2350 0
+                              Store 2351 2352
+            2353:     36(ptr) AccessChain 31(data) 2345 34 189
+            2354:   22(float) CompositeExtract 2350 1
+                              Store 2353 2354
+            2355:      6(int) Load 8(invocation)
+            2356:     44(ptr) AccessChain 31(data) 33 34
+            2357:   23(fvec4) Load 2356
+            2358:   51(fvec3) VectorShuffle 2357 2357 0 1 2
+            2359:   17(ivec4) Load 19(ballot)
+            2360:   51(fvec3) GroupNonUniformFMax 178 PartitionedExclusiveScanNV 2358 2359
+            2361:     36(ptr) AccessChain 31(data) 2355 34 35
+            2362:   22(float) CompositeExtract 2360 0
+                              Store 2361 2362
+            2363:     36(ptr) AccessChain 31(data) 2355 34 189
+            2364:   22(float) CompositeExtract 2360 1
+                              Store 2363 2364
+            2365:     36(ptr) AccessChain 31(data) 2355 34 202
+            2366:   22(float) CompositeExtract 2360 2
+                              Store 2365 2366
             2367:      6(int) Load 8(invocation)
-            2368:     64(ptr) AccessChain 31(data) 34 63 35
-            2369:     24(int) Load 2368
-            2370:   144(bool) SLessThan 2369 34
-            2371:   17(ivec4) Load 19(ballot)
-            2372:   144(bool) GroupNonUniformLogicalOr 178 PartitionedExclusiveScanNV 2370 2371
-            2373:     24(int) Select 2372 63 34
-            2374:     64(ptr) AccessChain 31(data) 2367 63 35
-                              Store 2374 2373
-            2375:      6(int) Load 8(invocation)
-            2376:     71(ptr) AccessChain 31(data) 63 63
-            2377:   25(ivec4) Load 2376
-            2378:   70(ivec2) VectorShuffle 2377 2377 0 1
-            2379:  152(bvec2) SLessThan 2378 727
-            2380:   17(ivec4) Load 19(ballot)
-            2381:  152(bvec2) GroupNonUniformLogicalOr 178 PartitionedExclusiveScanNV 2379 2380
-            2382:   70(ivec2) Select 2381 731 727
-            2383:     71(ptr) AccessChain 31(data) 2375 63
-            2384:   25(ivec4) Load 2383
-            2385:   25(ivec4) VectorShuffle 2384 2382 4 5 2 3
-                              Store 2383 2385
-            2386:      6(int) Load 8(invocation)
-            2387:     71(ptr) AccessChain 31(data) 63 63
-            2388:   25(ivec4) Load 2387
-            2389:   78(ivec3) VectorShuffle 2388 2388 0 1 2
-            2390:  161(bvec3) SLessThan 2389 740
-            2391:   17(ivec4) Load 19(ballot)
-            2392:  161(bvec3) GroupNonUniformLogicalOr 178 PartitionedExclusiveScanNV 2390 2391
-            2393:   78(ivec3) Select 2392 744 740
-            2394:     71(ptr) AccessChain 31(data) 2386 63
-            2395:   25(ivec4) Load 2394
-            2396:   25(ivec4) VectorShuffle 2395 2393 4 5 6 3
-                              Store 2394 2396
-            2397:      6(int) Load 8(invocation)
-            2398:     71(ptr) AccessChain 31(data) 63 63
-            2399:   25(ivec4) Load 2398
-            2400:  169(bvec4) SLessThan 2399 752
-            2401:   17(ivec4) Load 19(ballot)
-            2402:  169(bvec4) GroupNonUniformLogicalOr 178 PartitionedExclusiveScanNV 2400 2401
-            2403:   25(ivec4) Select 2402 756 752
-            2404:     71(ptr) AccessChain 31(data) 2397 63
-                              Store 2404 2403
-            2405:      6(int) Load 8(invocation)
-            2406:     64(ptr) AccessChain 31(data) 34 63 35
-            2407:     24(int) Load 2406
-            2408:   17(ivec4) Load 19(ballot)
-            2409:     24(int) GroupNonUniformBitwiseXor 178 PartitionedExclusiveScanNV 2407 2408
-            2410:     64(ptr) AccessChain 31(data) 2405 63 35
-                              Store 2410 2409
-            2411:      6(int) Load 8(invocation)
-            2412:     71(ptr) AccessChain 31(data) 63 63
-            2413:   25(ivec4) Load 2412
-            2414:   70(ivec2) VectorShuffle 2413 2413 0 1
-            2415:   17(ivec4) Load 19(ballot)
-            2416:   70(ivec2) GroupNonUniformBitwiseXor 178 PartitionedExclusiveScanNV 2414 2415
-            2417:     71(ptr) AccessChain 31(data) 2411 63
-            2418:   25(ivec4) Load 2417
-            2419:   25(ivec4) VectorShuffle 2418 2416 4 5 2 3
-                              Store 2417 2419
-            2420:      6(int) Load 8(invocation)
-            2421:     71(ptr) AccessChain 31(data) 33 63
-            2422:   25(ivec4) Load 2421
-            2423:   78(ivec3) VectorShuffle 2422 2422 0 1 2
-            2424:   17(ivec4) Load 19(ballot)
-            2425:   78(ivec3) GroupNonUniformBitwiseXor 178 PartitionedExclusiveScanNV 2423 2424
-            2426:     71(ptr) AccessChain 31(data) 2420 63
-            2427:   25(ivec4) Load 2426
-            2428:   25(ivec4) VectorShuffle 2427 2425 4 5 6 3
-                              Store 2426 2428
-            2429:      6(int) Load 8(invocation)
-            2430:     71(ptr) AccessChain 31(data) 115 63
-            2431:   25(ivec4) Load 2430
-            2432:   17(ivec4) Load 19(ballot)
-            2433:   25(ivec4) GroupNonUniformBitwiseXor 178 PartitionedExclusiveScanNV 2431 2432
-            2434:     71(ptr) AccessChain 31(data) 2429 63
-                              Store 2434 2433
+            2368:     44(ptr) AccessChain 31(data) 115 34
+            2369:   23(fvec4) Load 2368
+            2370:   17(ivec4) Load 19(ballot)
+            2371:   23(fvec4) GroupNonUniformFMax 178 PartitionedExclusiveScanNV 2369 2370
+            2372:     44(ptr) AccessChain 31(data) 2367 34
+                              Store 2372 2371
+            2373:      6(int) Load 8(invocation)
+            2374:     64(ptr) AccessChain 31(data) 34 63 35
+            2375:     24(int) Load 2374
+            2376:   17(ivec4) Load 19(ballot)
+            2377:     24(int) GroupNonUniformSMax 178 PartitionedExclusiveScanNV 2375 2376
+            2378:     64(ptr) AccessChain 31(data) 2373 63 35
+                              Store 2378 2377
+            2379:      6(int) Load 8(invocation)
+            2380:     71(ptr) AccessChain 31(data) 63 63
+            2381:   25(ivec4) Load 2380
+            2382:   70(ivec2) VectorShuffle 2381 2381 0 1
+            2383:   17(ivec4) Load 19(ballot)
+            2384:   70(ivec2) GroupNonUniformSMax 178 PartitionedExclusiveScanNV 2382 2383
+            2385:     64(ptr) AccessChain 31(data) 2379 63 35
+            2386:     24(int) CompositeExtract 2384 0
+                              Store 2385 2386
+            2387:     64(ptr) AccessChain 31(data) 2379 63 189
+            2388:     24(int) CompositeExtract 2384 1
+                              Store 2387 2388
+            2389:      6(int) Load 8(invocation)
+            2390:     71(ptr) AccessChain 31(data) 33 63
+            2391:   25(ivec4) Load 2390
+            2392:   78(ivec3) VectorShuffle 2391 2391 0 1 2
+            2393:   17(ivec4) Load 19(ballot)
+            2394:   78(ivec3) GroupNonUniformSMax 178 PartitionedExclusiveScanNV 2392 2393
+            2395:     64(ptr) AccessChain 31(data) 2389 63 35
+            2396:     24(int) CompositeExtract 2394 0
+                              Store 2395 2396
+            2397:     64(ptr) AccessChain 31(data) 2389 63 189
+            2398:     24(int) CompositeExtract 2394 1
+                              Store 2397 2398
+            2399:     64(ptr) AccessChain 31(data) 2389 63 202
+            2400:     24(int) CompositeExtract 2394 2
+                              Store 2399 2400
+            2401:      6(int) Load 8(invocation)
+            2402:     71(ptr) AccessChain 31(data) 115 63
+            2403:   25(ivec4) Load 2402
+            2404:   17(ivec4) Load 19(ballot)
+            2405:   25(ivec4) GroupNonUniformSMax 178 PartitionedExclusiveScanNV 2403 2404
+            2406:     71(ptr) AccessChain 31(data) 2401 63
+                              Store 2406 2405
+            2407:      6(int) Load 8(invocation)
+            2408:     90(ptr) AccessChain 31(data) 34 33 35
+            2409:      6(int) Load 2408
+            2410:   17(ivec4) Load 19(ballot)
+            2411:      6(int) GroupNonUniformUMax 178 PartitionedExclusiveScanNV 2409 2410
+            2412:     90(ptr) AccessChain 31(data) 2407 33 35
+                              Store 2412 2411
+            2413:      6(int) Load 8(invocation)
+            2414:     40(ptr) AccessChain 31(data) 63 33
+            2415:   17(ivec4) Load 2414
+            2416:   96(ivec2) VectorShuffle 2415 2415 0 1
+            2417:   17(ivec4) Load 19(ballot)
+            2418:   96(ivec2) GroupNonUniformUMax 178 PartitionedExclusiveScanNV 2416 2417
+            2419:     90(ptr) AccessChain 31(data) 2413 33 35
+            2420:      6(int) CompositeExtract 2418 0
+                              Store 2419 2420
+            2421:     90(ptr) AccessChain 31(data) 2413 33 189
+            2422:      6(int) CompositeExtract 2418 1
+                              Store 2421 2422
+            2423:      6(int) Load 8(invocation)
+            2424:     40(ptr) AccessChain 31(data) 33 33
+            2425:   17(ivec4) Load 2424
+            2426:  103(ivec3) VectorShuffle 2425 2425 0 1 2
+            2427:   17(ivec4) Load 19(ballot)
+            2428:  103(ivec3) GroupNonUniformUMax 178 PartitionedExclusiveScanNV 2426 2427
+            2429:     90(ptr) AccessChain 31(data) 2423 33 35
+            2430:      6(int) CompositeExtract 2428 0
+                              Store 2429 2430
+            2431:     90(ptr) AccessChain 31(data) 2423 33 189
+            2432:      6(int) CompositeExtract 2428 1
+                              Store 2431 2432
+            2433:     90(ptr) AccessChain 31(data) 2423 33 202
+            2434:      6(int) CompositeExtract 2428 2
+                              Store 2433 2434
             2435:      6(int) Load 8(invocation)
-            2436:     90(ptr) AccessChain 31(data) 34 33 35
-            2437:      6(int) Load 2436
+            2436:     40(ptr) AccessChain 31(data) 115 33
+            2437:   17(ivec4) Load 2436
             2438:   17(ivec4) Load 19(ballot)
-            2439:      6(int) GroupNonUniformBitwiseXor 178 PartitionedExclusiveScanNV 2437 2438
-            2440:     90(ptr) AccessChain 31(data) 2435 33 35
+            2439:   17(ivec4) GroupNonUniformUMax 178 PartitionedExclusiveScanNV 2437 2438
+            2440:     40(ptr) AccessChain 31(data) 2435 33
                               Store 2440 2439
             2441:      6(int) Load 8(invocation)
-            2442:     40(ptr) AccessChain 31(data) 63 33
-            2443:   17(ivec4) Load 2442
-            2444:   96(ivec2) VectorShuffle 2443 2443 0 1
-            2445:   17(ivec4) Load 19(ballot)
-            2446:   96(ivec2) GroupNonUniformBitwiseXor 178 PartitionedExclusiveScanNV 2444 2445
-            2447:     40(ptr) AccessChain 31(data) 2441 33
-            2448:   17(ivec4) Load 2447
-            2449:   17(ivec4) VectorShuffle 2448 2446 4 5 2 3
-                              Store 2447 2449
-            2450:      6(int) Load 8(invocation)
-            2451:     40(ptr) AccessChain 31(data) 33 33
-            2452:   17(ivec4) Load 2451
-            2453:  103(ivec3) VectorShuffle 2452 2452 0 1 2
-            2454:   17(ivec4) Load 19(ballot)
-            2455:  103(ivec3) GroupNonUniformBitwiseXor 178 PartitionedExclusiveScanNV 2453 2454
-            2456:     40(ptr) AccessChain 31(data) 2450 33
-            2457:   17(ivec4) Load 2456
-            2458:   17(ivec4) VectorShuffle 2457 2455 4 5 6 3
-                              Store 2456 2458
-            2459:      6(int) Load 8(invocation)
-            2460:     40(ptr) AccessChain 31(data) 115 33
-            2461:   17(ivec4) Load 2460
-            2462:   17(ivec4) Load 19(ballot)
-            2463:   17(ivec4) GroupNonUniformBitwiseXor 178 PartitionedExclusiveScanNV 2461 2462
-            2464:     40(ptr) AccessChain 31(data) 2459 33
-                              Store 2464 2463
-            2465:      6(int) Load 8(invocation)
-            2466:     64(ptr) AccessChain 31(data) 34 63 35
-            2467:     24(int) Load 2466
-            2468:   144(bool) SLessThan 2467 34
-            2469:   17(ivec4) Load 19(ballot)
-            2470:   144(bool) GroupNonUniformLogicalXor 178 PartitionedExclusiveScanNV 2468 2469
-            2471:     24(int) Select 2470 63 34
-            2472:     64(ptr) AccessChain 31(data) 2465 63 35
-                              Store 2472 2471
-            2473:      6(int) Load 8(invocation)
-            2474:     71(ptr) AccessChain 31(data) 63 63
-            2475:   25(ivec4) Load 2474
-            2476:   70(ivec2) VectorShuffle 2475 2475 0 1
-            2477:  152(bvec2) SLessThan 2476 727
+            2442:    116(ptr) AccessChain 31(data) 34 115 35
+            2443:26(float64_t) Load 2442
+            2444:   17(ivec4) Load 19(ballot)
+            2445:26(float64_t) GroupNonUniformFMax 178 PartitionedExclusiveScanNV 2443 2444
+            2446:    116(ptr) AccessChain 31(data) 2441 115 35
+                              Store 2446 2445
+            2447:      6(int) Load 8(invocation)
+            2448:    123(ptr) AccessChain 31(data) 63 115
+            2449: 27(f64vec4) Load 2448
+            2450:122(f64vec2) VectorShuffle 2449 2449 0 1
+            2451:   17(ivec4) Load 19(ballot)
+            2452:122(f64vec2) GroupNonUniformFMax 178 PartitionedExclusiveScanNV 2450 2451
+            2453:    116(ptr) AccessChain 31(data) 2447 115 35
+            2454:26(float64_t) CompositeExtract 2452 0
+                              Store 2453 2454
+            2455:    116(ptr) AccessChain 31(data) 2447 115 189
+            2456:26(float64_t) CompositeExtract 2452 1
+                              Store 2455 2456
+            2457:      6(int) Load 8(invocation)
+            2458:    123(ptr) AccessChain 31(data) 33 115
+            2459: 27(f64vec4) Load 2458
+            2460:130(f64vec3) VectorShuffle 2459 2459 0 1 2
+            2461:   17(ivec4) Load 19(ballot)
+            2462:130(f64vec3) GroupNonUniformFMax 178 PartitionedExclusiveScanNV 2460 2461
+            2463:    116(ptr) AccessChain 31(data) 2457 115 35
+            2464:26(float64_t) CompositeExtract 2462 0
+                              Store 2463 2464
+            2465:    116(ptr) AccessChain 31(data) 2457 115 189
+            2466:26(float64_t) CompositeExtract 2462 1
+                              Store 2465 2466
+            2467:    116(ptr) AccessChain 31(data) 2457 115 202
+            2468:26(float64_t) CompositeExtract 2462 2
+                              Store 2467 2468
+            2469:      6(int) Load 8(invocation)
+            2470:    123(ptr) AccessChain 31(data) 115 115
+            2471: 27(f64vec4) Load 2470
+            2472:   17(ivec4) Load 19(ballot)
+            2473: 27(f64vec4) GroupNonUniformFMax 178 PartitionedExclusiveScanNV 2471 2472
+            2474:    123(ptr) AccessChain 31(data) 2469 115
+                              Store 2474 2473
+            2475:      6(int) Load 8(invocation)
+            2476:     64(ptr) AccessChain 31(data) 34 63 35
+            2477:     24(int) Load 2476
             2478:   17(ivec4) Load 19(ballot)
-            2479:  152(bvec2) GroupNonUniformLogicalXor 178 PartitionedExclusiveScanNV 2477 2478
-            2480:   70(ivec2) Select 2479 731 727
-            2481:     71(ptr) AccessChain 31(data) 2473 63
-            2482:   25(ivec4) Load 2481
-            2483:   25(ivec4) VectorShuffle 2482 2480 4 5 2 3
-                              Store 2481 2483
-            2484:      6(int) Load 8(invocation)
-            2485:     71(ptr) AccessChain 31(data) 63 63
-            2486:   25(ivec4) Load 2485
-            2487:   78(ivec3) VectorShuffle 2486 2486 0 1 2
-            2488:  161(bvec3) SLessThan 2487 740
-            2489:   17(ivec4) Load 19(ballot)
-            2490:  161(bvec3) GroupNonUniformLogicalXor 178 PartitionedExclusiveScanNV 2488 2489
-            2491:   78(ivec3) Select 2490 744 740
-            2492:     71(ptr) AccessChain 31(data) 2484 63
+            2479:     24(int) GroupNonUniformBitwiseAnd 178 PartitionedExclusiveScanNV 2477 2478
+            2480:     64(ptr) AccessChain 31(data) 2475 63 35
+                              Store 2480 2479
+            2481:      6(int) Load 8(invocation)
+            2482:     71(ptr) AccessChain 31(data) 63 63
+            2483:   25(ivec4) Load 2482
+            2484:   70(ivec2) VectorShuffle 2483 2483 0 1
+            2485:   17(ivec4) Load 19(ballot)
+            2486:   70(ivec2) GroupNonUniformBitwiseAnd 178 PartitionedExclusiveScanNV 2484 2485
+            2487:     64(ptr) AccessChain 31(data) 2481 63 35
+            2488:     24(int) CompositeExtract 2486 0
+                              Store 2487 2488
+            2489:     64(ptr) AccessChain 31(data) 2481 63 189
+            2490:     24(int) CompositeExtract 2486 1
+                              Store 2489 2490
+            2491:      6(int) Load 8(invocation)
+            2492:     71(ptr) AccessChain 31(data) 33 63
             2493:   25(ivec4) Load 2492
-            2494:   25(ivec4) VectorShuffle 2493 2491 4 5 6 3
-                              Store 2492 2494
-            2495:      6(int) Load 8(invocation)
-            2496:     71(ptr) AccessChain 31(data) 63 63
-            2497:   25(ivec4) Load 2496
-            2498:  169(bvec4) SLessThan 2497 752
-            2499:   17(ivec4) Load 19(ballot)
-            2500:  169(bvec4) GroupNonUniformLogicalXor 178 PartitionedExclusiveScanNV 2498 2499
-            2501:   25(ivec4) Select 2500 756 752
-            2502:     71(ptr) AccessChain 31(data) 2495 63
-                              Store 2502 2501
+            2494:   78(ivec3) VectorShuffle 2493 2493 0 1 2
+            2495:   17(ivec4) Load 19(ballot)
+            2496:   78(ivec3) GroupNonUniformBitwiseAnd 178 PartitionedExclusiveScanNV 2494 2495
+            2497:     64(ptr) AccessChain 31(data) 2491 63 35
+            2498:     24(int) CompositeExtract 2496 0
+                              Store 2497 2498
+            2499:     64(ptr) AccessChain 31(data) 2491 63 189
+            2500:     24(int) CompositeExtract 2496 1
+                              Store 2499 2500
+            2501:     64(ptr) AccessChain 31(data) 2491 63 202
+            2502:     24(int) CompositeExtract 2496 2
+                              Store 2501 2502
+            2503:      6(int) Load 8(invocation)
+            2504:     71(ptr) AccessChain 31(data) 115 63
+            2505:   25(ivec4) Load 2504
+            2506:   17(ivec4) Load 19(ballot)
+            2507:   25(ivec4) GroupNonUniformBitwiseAnd 178 PartitionedExclusiveScanNV 2505 2506
+            2508:     71(ptr) AccessChain 31(data) 2503 63
+                              Store 2508 2507
+            2509:      6(int) Load 8(invocation)
+            2510:     90(ptr) AccessChain 31(data) 34 33 35
+            2511:      6(int) Load 2510
+            2512:   17(ivec4) Load 19(ballot)
+            2513:      6(int) GroupNonUniformBitwiseAnd 178 PartitionedExclusiveScanNV 2511 2512
+            2514:     90(ptr) AccessChain 31(data) 2509 33 35
+                              Store 2514 2513
+            2515:      6(int) Load 8(invocation)
+            2516:     40(ptr) AccessChain 31(data) 63 33
+            2517:   17(ivec4) Load 2516
+            2518:   96(ivec2) VectorShuffle 2517 2517 0 1
+            2519:   17(ivec4) Load 19(ballot)
+            2520:   96(ivec2) GroupNonUniformBitwiseAnd 178 PartitionedExclusiveScanNV 2518 2519
+            2521:     90(ptr) AccessChain 31(data) 2515 33 35
+            2522:      6(int) CompositeExtract 2520 0
+                              Store 2521 2522
+            2523:     90(ptr) AccessChain 31(data) 2515 33 189
+            2524:      6(int) CompositeExtract 2520 1
+                              Store 2523 2524
+            2525:      6(int) Load 8(invocation)
+            2526:     40(ptr) AccessChain 31(data) 33 33
+            2527:   17(ivec4) Load 2526
+            2528:  103(ivec3) VectorShuffle 2527 2527 0 1 2
+            2529:   17(ivec4) Load 19(ballot)
+            2530:  103(ivec3) GroupNonUniformBitwiseAnd 178 PartitionedExclusiveScanNV 2528 2529
+            2531:     90(ptr) AccessChain 31(data) 2525 33 35
+            2532:      6(int) CompositeExtract 2530 0
+                              Store 2531 2532
+            2533:     90(ptr) AccessChain 31(data) 2525 33 189
+            2534:      6(int) CompositeExtract 2530 1
+                              Store 2533 2534
+            2535:     90(ptr) AccessChain 31(data) 2525 33 202
+            2536:      6(int) CompositeExtract 2530 2
+                              Store 2535 2536
+            2537:      6(int) Load 8(invocation)
+            2538:     40(ptr) AccessChain 31(data) 115 33
+            2539:   17(ivec4) Load 2538
+            2540:   17(ivec4) Load 19(ballot)
+            2541:   17(ivec4) GroupNonUniformBitwiseAnd 178 PartitionedExclusiveScanNV 2539 2540
+            2542:     40(ptr) AccessChain 31(data) 2537 33
+                              Store 2542 2541
+            2543:      6(int) Load 8(invocation)
+            2544:     64(ptr) AccessChain 31(data) 34 63 35
+            2545:     24(int) Load 2544
+            2546:   144(bool) SLessThan 2545 34
+            2547:   17(ivec4) Load 19(ballot)
+            2548:   144(bool) GroupNonUniformLogicalAnd 178 PartitionedExclusiveScanNV 2546 2547
+            2549:     24(int) Select 2548 63 34
+            2550:     64(ptr) AccessChain 31(data) 2543 63 35
+                              Store 2550 2549
+            2551:      6(int) Load 8(invocation)
+            2552:     71(ptr) AccessChain 31(data) 63 63
+            2553:   25(ivec4) Load 2552
+            2554:   70(ivec2) VectorShuffle 2553 2553 0 1
+            2555:  152(bvec2) SLessThan 2554 801
+            2556:   17(ivec4) Load 19(ballot)
+            2557:  152(bvec2) GroupNonUniformLogicalAnd 178 PartitionedExclusiveScanNV 2555 2556
+            2558:   70(ivec2) Select 2557 805 801
+            2559:     64(ptr) AccessChain 31(data) 2551 63 35
+            2560:     24(int) CompositeExtract 2558 0
+                              Store 2559 2560
+            2561:     64(ptr) AccessChain 31(data) 2551 63 189
+            2562:     24(int) CompositeExtract 2558 1
+                              Store 2561 2562
+            2563:      6(int) Load 8(invocation)
+            2564:     71(ptr) AccessChain 31(data) 63 63
+            2565:   25(ivec4) Load 2564
+            2566:   78(ivec3) VectorShuffle 2565 2565 0 1 2
+            2567:  161(bvec3) SLessThan 2566 815
+            2568:   17(ivec4) Load 19(ballot)
+            2569:  161(bvec3) GroupNonUniformLogicalAnd 178 PartitionedExclusiveScanNV 2567 2568
+            2570:   78(ivec3) Select 2569 819 815
+            2571:     64(ptr) AccessChain 31(data) 2563 63 35
+            2572:     24(int) CompositeExtract 2570 0
+                              Store 2571 2572
+            2573:     64(ptr) AccessChain 31(data) 2563 63 189
+            2574:     24(int) CompositeExtract 2570 1
+                              Store 2573 2574
+            2575:     64(ptr) AccessChain 31(data) 2563 63 202
+            2576:     24(int) CompositeExtract 2570 2
+                              Store 2575 2576
+            2577:      6(int) Load 8(invocation)
+            2578:     71(ptr) AccessChain 31(data) 63 63
+            2579:   25(ivec4) Load 2578
+            2580:  169(bvec4) SLessThan 2579 830
+            2581:   17(ivec4) Load 19(ballot)
+            2582:  169(bvec4) GroupNonUniformLogicalAnd 178 PartitionedExclusiveScanNV 2580 2581
+            2583:   25(ivec4) Select 2582 834 830
+            2584:     71(ptr) AccessChain 31(data) 2577 63
+                              Store 2584 2583
+            2585:      6(int) Load 8(invocation)
+            2586:     64(ptr) AccessChain 31(data) 34 63 35
+            2587:     24(int) Load 2586
+            2588:   17(ivec4) Load 19(ballot)
+            2589:     24(int) GroupNonUniformBitwiseOr 178 PartitionedExclusiveScanNV 2587 2588
+            2590:     64(ptr) AccessChain 31(data) 2585 63 35
+                              Store 2590 2589
+            2591:      6(int) Load 8(invocation)
+            2592:     71(ptr) AccessChain 31(data) 63 63
+            2593:   25(ivec4) Load 2592
+            2594:   70(ivec2) VectorShuffle 2593 2593 0 1
+            2595:   17(ivec4) Load 19(ballot)
+            2596:   70(ivec2) GroupNonUniformBitwiseOr 178 PartitionedExclusiveScanNV 2594 2595
+            2597:     64(ptr) AccessChain 31(data) 2591 63 35
+            2598:     24(int) CompositeExtract 2596 0
+                              Store 2597 2598
+            2599:     64(ptr) AccessChain 31(data) 2591 63 189
+            2600:     24(int) CompositeExtract 2596 1
+                              Store 2599 2600
+            2601:      6(int) Load 8(invocation)
+            2602:     71(ptr) AccessChain 31(data) 33 63
+            2603:   25(ivec4) Load 2602
+            2604:   78(ivec3) VectorShuffle 2603 2603 0 1 2
+            2605:   17(ivec4) Load 19(ballot)
+            2606:   78(ivec3) GroupNonUniformBitwiseOr 178 PartitionedExclusiveScanNV 2604 2605
+            2607:     64(ptr) AccessChain 31(data) 2601 63 35
+            2608:     24(int) CompositeExtract 2606 0
+                              Store 2607 2608
+            2609:     64(ptr) AccessChain 31(data) 2601 63 189
+            2610:     24(int) CompositeExtract 2606 1
+                              Store 2609 2610
+            2611:     64(ptr) AccessChain 31(data) 2601 63 202
+            2612:     24(int) CompositeExtract 2606 2
+                              Store 2611 2612
+            2613:      6(int) Load 8(invocation)
+            2614:     71(ptr) AccessChain 31(data) 115 63
+            2615:   25(ivec4) Load 2614
+            2616:   17(ivec4) Load 19(ballot)
+            2617:   25(ivec4) GroupNonUniformBitwiseOr 178 PartitionedExclusiveScanNV 2615 2616
+            2618:     71(ptr) AccessChain 31(data) 2613 63
+                              Store 2618 2617
+            2619:      6(int) Load 8(invocation)
+            2620:     90(ptr) AccessChain 31(data) 34 33 35
+            2621:      6(int) Load 2620
+            2622:   17(ivec4) Load 19(ballot)
+            2623:      6(int) GroupNonUniformBitwiseOr 178 PartitionedExclusiveScanNV 2621 2622
+            2624:     90(ptr) AccessChain 31(data) 2619 33 35
+                              Store 2624 2623
+            2625:      6(int) Load 8(invocation)
+            2626:     40(ptr) AccessChain 31(data) 63 33
+            2627:   17(ivec4) Load 2626
+            2628:   96(ivec2) VectorShuffle 2627 2627 0 1
+            2629:   17(ivec4) Load 19(ballot)
+            2630:   96(ivec2) GroupNonUniformBitwiseOr 178 PartitionedExclusiveScanNV 2628 2629
+            2631:     90(ptr) AccessChain 31(data) 2625 33 35
+            2632:      6(int) CompositeExtract 2630 0
+                              Store 2631 2632
+            2633:     90(ptr) AccessChain 31(data) 2625 33 189
+            2634:      6(int) CompositeExtract 2630 1
+                              Store 2633 2634
+            2635:      6(int) Load 8(invocation)
+            2636:     40(ptr) AccessChain 31(data) 33 33
+            2637:   17(ivec4) Load 2636
+            2638:  103(ivec3) VectorShuffle 2637 2637 0 1 2
+            2639:   17(ivec4) Load 19(ballot)
+            2640:  103(ivec3) GroupNonUniformBitwiseOr 178 PartitionedExclusiveScanNV 2638 2639
+            2641:     90(ptr) AccessChain 31(data) 2635 33 35
+            2642:      6(int) CompositeExtract 2640 0
+                              Store 2641 2642
+            2643:     90(ptr) AccessChain 31(data) 2635 33 189
+            2644:      6(int) CompositeExtract 2640 1
+                              Store 2643 2644
+            2645:     90(ptr) AccessChain 31(data) 2635 33 202
+            2646:      6(int) CompositeExtract 2640 2
+                              Store 2645 2646
+            2647:      6(int) Load 8(invocation)
+            2648:     40(ptr) AccessChain 31(data) 115 33
+            2649:   17(ivec4) Load 2648
+            2650:   17(ivec4) Load 19(ballot)
+            2651:   17(ivec4) GroupNonUniformBitwiseOr 178 PartitionedExclusiveScanNV 2649 2650
+            2652:     40(ptr) AccessChain 31(data) 2647 33
+                              Store 2652 2651
+            2653:      6(int) Load 8(invocation)
+            2654:     64(ptr) AccessChain 31(data) 34 63 35
+            2655:     24(int) Load 2654
+            2656:   144(bool) SLessThan 2655 34
+            2657:   17(ivec4) Load 19(ballot)
+            2658:   144(bool) GroupNonUniformLogicalOr 178 PartitionedExclusiveScanNV 2656 2657
+            2659:     24(int) Select 2658 63 34
+            2660:     64(ptr) AccessChain 31(data) 2653 63 35
+                              Store 2660 2659
+            2661:      6(int) Load 8(invocation)
+            2662:     71(ptr) AccessChain 31(data) 63 63
+            2663:   25(ivec4) Load 2662
+            2664:   70(ivec2) VectorShuffle 2663 2663 0 1
+            2665:  152(bvec2) SLessThan 2664 801
+            2666:   17(ivec4) Load 19(ballot)
+            2667:  152(bvec2) GroupNonUniformLogicalOr 178 PartitionedExclusiveScanNV 2665 2666
+            2668:   70(ivec2) Select 2667 805 801
+            2669:     64(ptr) AccessChain 31(data) 2661 63 35
+            2670:     24(int) CompositeExtract 2668 0
+                              Store 2669 2670
+            2671:     64(ptr) AccessChain 31(data) 2661 63 189
+            2672:     24(int) CompositeExtract 2668 1
+                              Store 2671 2672
+            2673:      6(int) Load 8(invocation)
+            2674:     71(ptr) AccessChain 31(data) 63 63
+            2675:   25(ivec4) Load 2674
+            2676:   78(ivec3) VectorShuffle 2675 2675 0 1 2
+            2677:  161(bvec3) SLessThan 2676 815
+            2678:   17(ivec4) Load 19(ballot)
+            2679:  161(bvec3) GroupNonUniformLogicalOr 178 PartitionedExclusiveScanNV 2677 2678
+            2680:   78(ivec3) Select 2679 819 815
+            2681:     64(ptr) AccessChain 31(data) 2673 63 35
+            2682:     24(int) CompositeExtract 2680 0
+                              Store 2681 2682
+            2683:     64(ptr) AccessChain 31(data) 2673 63 189
+            2684:     24(int) CompositeExtract 2680 1
+                              Store 2683 2684
+            2685:     64(ptr) AccessChain 31(data) 2673 63 202
+            2686:     24(int) CompositeExtract 2680 2
+                              Store 2685 2686
+            2687:      6(int) Load 8(invocation)
+            2688:     71(ptr) AccessChain 31(data) 63 63
+            2689:   25(ivec4) Load 2688
+            2690:  169(bvec4) SLessThan 2689 830
+            2691:   17(ivec4) Load 19(ballot)
+            2692:  169(bvec4) GroupNonUniformLogicalOr 178 PartitionedExclusiveScanNV 2690 2691
+            2693:   25(ivec4) Select 2692 834 830
+            2694:     71(ptr) AccessChain 31(data) 2687 63
+                              Store 2694 2693
+            2695:      6(int) Load 8(invocation)
+            2696:     64(ptr) AccessChain 31(data) 34 63 35
+            2697:     24(int) Load 2696
+            2698:   17(ivec4) Load 19(ballot)
+            2699:     24(int) GroupNonUniformBitwiseXor 178 PartitionedExclusiveScanNV 2697 2698
+            2700:     64(ptr) AccessChain 31(data) 2695 63 35
+                              Store 2700 2699
+            2701:      6(int) Load 8(invocation)
+            2702:     71(ptr) AccessChain 31(data) 63 63
+            2703:   25(ivec4) Load 2702
+            2704:   70(ivec2) VectorShuffle 2703 2703 0 1
+            2705:   17(ivec4) Load 19(ballot)
+            2706:   70(ivec2) GroupNonUniformBitwiseXor 178 PartitionedExclusiveScanNV 2704 2705
+            2707:     64(ptr) AccessChain 31(data) 2701 63 35
+            2708:     24(int) CompositeExtract 2706 0
+                              Store 2707 2708
+            2709:     64(ptr) AccessChain 31(data) 2701 63 189
+            2710:     24(int) CompositeExtract 2706 1
+                              Store 2709 2710
+            2711:      6(int) Load 8(invocation)
+            2712:     71(ptr) AccessChain 31(data) 33 63
+            2713:   25(ivec4) Load 2712
+            2714:   78(ivec3) VectorShuffle 2713 2713 0 1 2
+            2715:   17(ivec4) Load 19(ballot)
+            2716:   78(ivec3) GroupNonUniformBitwiseXor 178 PartitionedExclusiveScanNV 2714 2715
+            2717:     64(ptr) AccessChain 31(data) 2711 63 35
+            2718:     24(int) CompositeExtract 2716 0
+                              Store 2717 2718
+            2719:     64(ptr) AccessChain 31(data) 2711 63 189
+            2720:     24(int) CompositeExtract 2716 1
+                              Store 2719 2720
+            2721:     64(ptr) AccessChain 31(data) 2711 63 202
+            2722:     24(int) CompositeExtract 2716 2
+                              Store 2721 2722
+            2723:      6(int) Load 8(invocation)
+            2724:     71(ptr) AccessChain 31(data) 115 63
+            2725:   25(ivec4) Load 2724
+            2726:   17(ivec4) Load 19(ballot)
+            2727:   25(ivec4) GroupNonUniformBitwiseXor 178 PartitionedExclusiveScanNV 2725 2726
+            2728:     71(ptr) AccessChain 31(data) 2723 63
+                              Store 2728 2727
+            2729:      6(int) Load 8(invocation)
+            2730:     90(ptr) AccessChain 31(data) 34 33 35
+            2731:      6(int) Load 2730
+            2732:   17(ivec4) Load 19(ballot)
+            2733:      6(int) GroupNonUniformBitwiseXor 178 PartitionedExclusiveScanNV 2731 2732
+            2734:     90(ptr) AccessChain 31(data) 2729 33 35
+                              Store 2734 2733
+            2735:      6(int) Load 8(invocation)
+            2736:     40(ptr) AccessChain 31(data) 63 33
+            2737:   17(ivec4) Load 2736
+            2738:   96(ivec2) VectorShuffle 2737 2737 0 1
+            2739:   17(ivec4) Load 19(ballot)
+            2740:   96(ivec2) GroupNonUniformBitwiseXor 178 PartitionedExclusiveScanNV 2738 2739
+            2741:     90(ptr) AccessChain 31(data) 2735 33 35
+            2742:      6(int) CompositeExtract 2740 0
+                              Store 2741 2742
+            2743:     90(ptr) AccessChain 31(data) 2735 33 189
+            2744:      6(int) CompositeExtract 2740 1
+                              Store 2743 2744
+            2745:      6(int) Load 8(invocation)
+            2746:     40(ptr) AccessChain 31(data) 33 33
+            2747:   17(ivec4) Load 2746
+            2748:  103(ivec3) VectorShuffle 2747 2747 0 1 2
+            2749:   17(ivec4) Load 19(ballot)
+            2750:  103(ivec3) GroupNonUniformBitwiseXor 178 PartitionedExclusiveScanNV 2748 2749
+            2751:     90(ptr) AccessChain 31(data) 2745 33 35
+            2752:      6(int) CompositeExtract 2750 0
+                              Store 2751 2752
+            2753:     90(ptr) AccessChain 31(data) 2745 33 189
+            2754:      6(int) CompositeExtract 2750 1
+                              Store 2753 2754
+            2755:     90(ptr) AccessChain 31(data) 2745 33 202
+            2756:      6(int) CompositeExtract 2750 2
+                              Store 2755 2756
+            2757:      6(int) Load 8(invocation)
+            2758:     40(ptr) AccessChain 31(data) 115 33
+            2759:   17(ivec4) Load 2758
+            2760:   17(ivec4) Load 19(ballot)
+            2761:   17(ivec4) GroupNonUniformBitwiseXor 178 PartitionedExclusiveScanNV 2759 2760
+            2762:     40(ptr) AccessChain 31(data) 2757 33
+                              Store 2762 2761
+            2763:      6(int) Load 8(invocation)
+            2764:     64(ptr) AccessChain 31(data) 34 63 35
+            2765:     24(int) Load 2764
+            2766:   144(bool) SLessThan 2765 34
+            2767:   17(ivec4) Load 19(ballot)
+            2768:   144(bool) GroupNonUniformLogicalXor 178 PartitionedExclusiveScanNV 2766 2767
+            2769:     24(int) Select 2768 63 34
+            2770:     64(ptr) AccessChain 31(data) 2763 63 35
+                              Store 2770 2769
+            2771:      6(int) Load 8(invocation)
+            2772:     71(ptr) AccessChain 31(data) 63 63
+            2773:   25(ivec4) Load 2772
+            2774:   70(ivec2) VectorShuffle 2773 2773 0 1
+            2775:  152(bvec2) SLessThan 2774 801
+            2776:   17(ivec4) Load 19(ballot)
+            2777:  152(bvec2) GroupNonUniformLogicalXor 178 PartitionedExclusiveScanNV 2775 2776
+            2778:   70(ivec2) Select 2777 805 801
+            2779:     64(ptr) AccessChain 31(data) 2771 63 35
+            2780:     24(int) CompositeExtract 2778 0
+                              Store 2779 2780
+            2781:     64(ptr) AccessChain 31(data) 2771 63 189
+            2782:     24(int) CompositeExtract 2778 1
+                              Store 2781 2782
+            2783:      6(int) Load 8(invocation)
+            2784:     71(ptr) AccessChain 31(data) 63 63
+            2785:   25(ivec4) Load 2784
+            2786:   78(ivec3) VectorShuffle 2785 2785 0 1 2
+            2787:  161(bvec3) SLessThan 2786 815
+            2788:   17(ivec4) Load 19(ballot)
+            2789:  161(bvec3) GroupNonUniformLogicalXor 178 PartitionedExclusiveScanNV 2787 2788
+            2790:   78(ivec3) Select 2789 819 815
+            2791:     64(ptr) AccessChain 31(data) 2783 63 35
+            2792:     24(int) CompositeExtract 2790 0
+                              Store 2791 2792
+            2793:     64(ptr) AccessChain 31(data) 2783 63 189
+            2794:     24(int) CompositeExtract 2790 1
+                              Store 2793 2794
+            2795:     64(ptr) AccessChain 31(data) 2783 63 202
+            2796:     24(int) CompositeExtract 2790 2
+                              Store 2795 2796
+            2797:      6(int) Load 8(invocation)
+            2798:     71(ptr) AccessChain 31(data) 63 63
+            2799:   25(ivec4) Load 2798
+            2800:  169(bvec4) SLessThan 2799 830
+            2801:   17(ivec4) Load 19(ballot)
+            2802:  169(bvec4) GroupNonUniformLogicalXor 178 PartitionedExclusiveScanNV 2800 2801
+            2803:   25(ivec4) Select 2802 834 830
+            2804:     71(ptr) AccessChain 31(data) 2797 63
+                              Store 2804 2803
                               Return
                               FunctionEnd
diff --git a/third_party/vulkan-deps/glslang/src/Test/baseResults/spv.subgroupQuad.comp.out b/third_party/vulkan-deps/glslang/src/Test/baseResults/spv.subgroupQuad.comp.out
index 644fa72..143d01d 100644
--- a/third_party/vulkan-deps/glslang/src/Test/baseResults/spv.subgroupQuad.comp.out
+++ b/third_party/vulkan-deps/glslang/src/Test/baseResults/spv.subgroupQuad.comp.out
@@ -1,7 +1,7 @@
 spv.subgroupQuad.comp
 // Module Version 10300
 // Generated by (magic number): 8000a
-// Id's are bound by 616
+// Id's are bound by 696
 
                               Capability Shader
                               Capability Float64
@@ -39,7 +39,7 @@
                               Decorate 24(Buffers) Block
                               Decorate 27(data) DescriptorSet 0
                               Decorate 27(data) Binding 0
-                              Decorate 615 BuiltIn WorkgroupSize
+                              Decorate 695 BuiltIn WorkgroupSize
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeInt 32 0
@@ -67,34 +67,34 @@
               39:     19(int) Constant 1
               40:             TypeVector 17(float) 2
               41:             TypePointer StorageBuffer 18(fvec4)
-              50:     19(int) Constant 2
-              51:             TypeVector 17(float) 3
-              60:     19(int) Constant 3
-              66:             TypePointer StorageBuffer 19(int)
-              72:             TypeVector 19(int) 2
-              73:             TypePointer StorageBuffer 20(ivec4)
-              82:             TypeVector 19(int) 3
-              96:             TypePointer StorageBuffer 6(int)
-             102:             TypeVector 6(int) 2
-             103:             TypePointer StorageBuffer 21(ivec4)
-             112:             TypeVector 6(int) 3
-             126:             TypePointer StorageBuffer 22(float64_t)
-             132:             TypeVector 22(float64_t) 2
-             133:             TypePointer StorageBuffer 23(f64vec4)
-             142:             TypeVector 22(float64_t) 3
-             158:             TypeBool
-             167:   72(ivec2) ConstantComposite 29 29
-             168:             TypeVector 158(bool) 2
-             171:   72(ivec2) ConstantComposite 39 39
-             180:   82(ivec3) ConstantComposite 29 29 29
-             181:             TypeVector 158(bool) 3
-             184:   82(ivec3) ConstantComposite 39 39 39
-             192:   20(ivec4) ConstantComposite 29 29 29 29
-             193:             TypeVector 158(bool) 4
-             196:   20(ivec4) ConstantComposite 39 39 39 39
-             478:      6(int) Constant 2
-             614:      6(int) Constant 8
-             615:  112(ivec3) ConstantComposite 614 34 34
+              51:     19(int) Constant 2
+              52:             TypeVector 17(float) 3
+              61:      6(int) Constant 2
+              65:     19(int) Constant 3
+              71:             TypePointer StorageBuffer 19(int)
+              77:             TypeVector 19(int) 2
+              78:             TypePointer StorageBuffer 20(ivec4)
+              88:             TypeVector 19(int) 3
+             105:             TypePointer StorageBuffer 6(int)
+             111:             TypeVector 6(int) 2
+             112:             TypePointer StorageBuffer 21(ivec4)
+             122:             TypeVector 6(int) 3
+             139:             TypePointer StorageBuffer 22(float64_t)
+             145:             TypeVector 22(float64_t) 2
+             146:             TypePointer StorageBuffer 23(f64vec4)
+             156:             TypeVector 22(float64_t) 3
+             175:             TypeBool
+             184:   77(ivec2) ConstantComposite 29 29
+             185:             TypeVector 175(bool) 2
+             188:   77(ivec2) ConstantComposite 39 39
+             198:   88(ivec3) ConstantComposite 29 29 29
+             199:             TypeVector 175(bool) 3
+             202:   88(ivec3) ConstantComposite 39 39 39
+             213:   20(ivec4) ConstantComposite 29 29 29 29
+             214:             TypeVector 175(bool) 4
+             217:   20(ivec4) ConstantComposite 39 39 39 39
+             694:      6(int) Constant 8
+             695:  122(ivec3) ConstantComposite 694 34 34
          4(main):           2 Function None 3
                5:             Label
    8(invocation):      7(ptr) Variable Function
@@ -114,626 +114,766 @@
               43:   18(fvec4) Load 42
               44:   40(fvec2) VectorShuffle 43 43 0 1
               45:   40(fvec2) GroupNonUniformQuadBroadcast 35 44 34
-              46:     41(ptr) AccessChain 27(data) 38 29
-              47:   18(fvec4) Load 46
-              48:   18(fvec4) VectorShuffle 47 45 4 5 2 3
-                              Store 46 48
-              49:      6(int) Load 8(invocation)
-              52:     41(ptr) AccessChain 27(data) 50 29
-              53:   18(fvec4) Load 52
-              54:   51(fvec3) VectorShuffle 53 53 0 1 2
-              55:   51(fvec3) GroupNonUniformQuadBroadcast 35 54 34
-              56:     41(ptr) AccessChain 27(data) 49 29
-              57:   18(fvec4) Load 56
-              58:   18(fvec4) VectorShuffle 57 55 4 5 6 3
-                              Store 56 58
-              59:      6(int) Load 8(invocation)
-              61:     41(ptr) AccessChain 27(data) 60 29
-              62:   18(fvec4) Load 61
-              63:   18(fvec4) GroupNonUniformQuadBroadcast 35 62 34
-              64:     41(ptr) AccessChain 27(data) 59 29
-                              Store 64 63
-              65:      6(int) Load 8(invocation)
-              67:     66(ptr) AccessChain 27(data) 29 39 30
-              68:     19(int) Load 67
-              69:     19(int) GroupNonUniformQuadBroadcast 35 68 34
-              70:     66(ptr) AccessChain 27(data) 65 39 30
-                              Store 70 69
-              71:      6(int) Load 8(invocation)
-              74:     73(ptr) AccessChain 27(data) 39 39
-              75:   20(ivec4) Load 74
-              76:   72(ivec2) VectorShuffle 75 75 0 1
-              77:   72(ivec2) GroupNonUniformQuadBroadcast 35 76 34
-              78:     73(ptr) AccessChain 27(data) 71 39
-              79:   20(ivec4) Load 78
-              80:   20(ivec4) VectorShuffle 79 77 4 5 2 3
-                              Store 78 80
-              81:      6(int) Load 8(invocation)
-              83:     73(ptr) AccessChain 27(data) 50 39
-              84:   20(ivec4) Load 83
-              85:   82(ivec3) VectorShuffle 84 84 0 1 2
-              86:   82(ivec3) GroupNonUniformQuadBroadcast 35 85 34
-              87:     73(ptr) AccessChain 27(data) 81 39
-              88:   20(ivec4) Load 87
-              89:   20(ivec4) VectorShuffle 88 86 4 5 6 3
-                              Store 87 89
-              90:      6(int) Load 8(invocation)
-              91:     73(ptr) AccessChain 27(data) 60 39
-              92:   20(ivec4) Load 91
-              93:   20(ivec4) GroupNonUniformQuadBroadcast 35 92 34
-              94:     73(ptr) AccessChain 27(data) 90 39
-                              Store 94 93
-              95:      6(int) Load 8(invocation)
-              97:     96(ptr) AccessChain 27(data) 29 50 30
-              98:      6(int) Load 97
-              99:      6(int) GroupNonUniformQuadBroadcast 35 98 34
-             100:     96(ptr) AccessChain 27(data) 95 50 30
-                              Store 100 99
-             101:      6(int) Load 8(invocation)
-             104:    103(ptr) AccessChain 27(data) 39 50
-             105:   21(ivec4) Load 104
-             106:  102(ivec2) VectorShuffle 105 105 0 1
-             107:  102(ivec2) GroupNonUniformQuadBroadcast 35 106 34
-             108:    103(ptr) AccessChain 27(data) 101 50
-             109:   21(ivec4) Load 108
-             110:   21(ivec4) VectorShuffle 109 107 4 5 2 3
-                              Store 108 110
-             111:      6(int) Load 8(invocation)
-             113:    103(ptr) AccessChain 27(data) 50 50
+              46:     31(ptr) AccessChain 27(data) 38 29 30
+              47:   17(float) CompositeExtract 45 0
+                              Store 46 47
+              48:     31(ptr) AccessChain 27(data) 38 29 34
+              49:   17(float) CompositeExtract 45 1
+                              Store 48 49
+              50:      6(int) Load 8(invocation)
+              53:     41(ptr) AccessChain 27(data) 51 29
+              54:   18(fvec4) Load 53
+              55:   52(fvec3) VectorShuffle 54 54 0 1 2
+              56:   52(fvec3) GroupNonUniformQuadBroadcast 35 55 34
+              57:     31(ptr) AccessChain 27(data) 50 29 30
+              58:   17(float) CompositeExtract 56 0
+                              Store 57 58
+              59:     31(ptr) AccessChain 27(data) 50 29 34
+              60:   17(float) CompositeExtract 56 1
+                              Store 59 60
+              62:     31(ptr) AccessChain 27(data) 50 29 61
+              63:   17(float) CompositeExtract 56 2
+                              Store 62 63
+              64:      6(int) Load 8(invocation)
+              66:     41(ptr) AccessChain 27(data) 65 29
+              67:   18(fvec4) Load 66
+              68:   18(fvec4) GroupNonUniformQuadBroadcast 35 67 34
+              69:     41(ptr) AccessChain 27(data) 64 29
+                              Store 69 68
+              70:      6(int) Load 8(invocation)
+              72:     71(ptr) AccessChain 27(data) 29 39 30
+              73:     19(int) Load 72
+              74:     19(int) GroupNonUniformQuadBroadcast 35 73 34
+              75:     71(ptr) AccessChain 27(data) 70 39 30
+                              Store 75 74
+              76:      6(int) Load 8(invocation)
+              79:     78(ptr) AccessChain 27(data) 39 39
+              80:   20(ivec4) Load 79
+              81:   77(ivec2) VectorShuffle 80 80 0 1
+              82:   77(ivec2) GroupNonUniformQuadBroadcast 35 81 34
+              83:     71(ptr) AccessChain 27(data) 76 39 30
+              84:     19(int) CompositeExtract 82 0
+                              Store 83 84
+              85:     71(ptr) AccessChain 27(data) 76 39 34
+              86:     19(int) CompositeExtract 82 1
+                              Store 85 86
+              87:      6(int) Load 8(invocation)
+              89:     78(ptr) AccessChain 27(data) 51 39
+              90:   20(ivec4) Load 89
+              91:   88(ivec3) VectorShuffle 90 90 0 1 2
+              92:   88(ivec3) GroupNonUniformQuadBroadcast 35 91 34
+              93:     71(ptr) AccessChain 27(data) 87 39 30
+              94:     19(int) CompositeExtract 92 0
+                              Store 93 94
+              95:     71(ptr) AccessChain 27(data) 87 39 34
+              96:     19(int) CompositeExtract 92 1
+                              Store 95 96
+              97:     71(ptr) AccessChain 27(data) 87 39 61
+              98:     19(int) CompositeExtract 92 2
+                              Store 97 98
+              99:      6(int) Load 8(invocation)
+             100:     78(ptr) AccessChain 27(data) 65 39
+             101:   20(ivec4) Load 100
+             102:   20(ivec4) GroupNonUniformQuadBroadcast 35 101 34
+             103:     78(ptr) AccessChain 27(data) 99 39
+                              Store 103 102
+             104:      6(int) Load 8(invocation)
+             106:    105(ptr) AccessChain 27(data) 29 51 30
+             107:      6(int) Load 106
+             108:      6(int) GroupNonUniformQuadBroadcast 35 107 34
+             109:    105(ptr) AccessChain 27(data) 104 51 30
+                              Store 109 108
+             110:      6(int) Load 8(invocation)
+             113:    112(ptr) AccessChain 27(data) 39 51
              114:   21(ivec4) Load 113
-             115:  112(ivec3) VectorShuffle 114 114 0 1 2
-             116:  112(ivec3) GroupNonUniformQuadBroadcast 35 115 34
-             117:    103(ptr) AccessChain 27(data) 111 50
-             118:   21(ivec4) Load 117
-             119:   21(ivec4) VectorShuffle 118 116 4 5 6 3
-                              Store 117 119
-             120:      6(int) Load 8(invocation)
-             121:    103(ptr) AccessChain 27(data) 60 50
-             122:   21(ivec4) Load 121
-             123:   21(ivec4) GroupNonUniformQuadBroadcast 35 122 34
-             124:    103(ptr) AccessChain 27(data) 120 50
-                              Store 124 123
-             125:      6(int) Load 8(invocation)
-             127:    126(ptr) AccessChain 27(data) 29 60 30
-             128:22(float64_t) Load 127
-             129:22(float64_t) GroupNonUniformQuadBroadcast 35 128 34
-             130:    126(ptr) AccessChain 27(data) 125 60 30
-                              Store 130 129
-             131:      6(int) Load 8(invocation)
-             134:    133(ptr) AccessChain 27(data) 39 60
-             135: 23(f64vec4) Load 134
-             136:132(f64vec2) VectorShuffle 135 135 0 1
-             137:132(f64vec2) GroupNonUniformQuadBroadcast 35 136 34
-             138:    133(ptr) AccessChain 27(data) 131 60
-             139: 23(f64vec4) Load 138
-             140: 23(f64vec4) VectorShuffle 139 137 4 5 2 3
-                              Store 138 140
-             141:      6(int) Load 8(invocation)
-             143:    133(ptr) AccessChain 27(data) 50 60
-             144: 23(f64vec4) Load 143
-             145:142(f64vec3) VectorShuffle 144 144 0 1 2
-             146:142(f64vec3) GroupNonUniformQuadBroadcast 35 145 34
-             147:    133(ptr) AccessChain 27(data) 141 60
+             115:  111(ivec2) VectorShuffle 114 114 0 1
+             116:  111(ivec2) GroupNonUniformQuadBroadcast 35 115 34
+             117:    105(ptr) AccessChain 27(data) 110 51 30
+             118:      6(int) CompositeExtract 116 0
+                              Store 117 118
+             119:    105(ptr) AccessChain 27(data) 110 51 34
+             120:      6(int) CompositeExtract 116 1
+                              Store 119 120
+             121:      6(int) Load 8(invocation)
+             123:    112(ptr) AccessChain 27(data) 51 51
+             124:   21(ivec4) Load 123
+             125:  122(ivec3) VectorShuffle 124 124 0 1 2
+             126:  122(ivec3) GroupNonUniformQuadBroadcast 35 125 34
+             127:    105(ptr) AccessChain 27(data) 121 51 30
+             128:      6(int) CompositeExtract 126 0
+                              Store 127 128
+             129:    105(ptr) AccessChain 27(data) 121 51 34
+             130:      6(int) CompositeExtract 126 1
+                              Store 129 130
+             131:    105(ptr) AccessChain 27(data) 121 51 61
+             132:      6(int) CompositeExtract 126 2
+                              Store 131 132
+             133:      6(int) Load 8(invocation)
+             134:    112(ptr) AccessChain 27(data) 65 51
+             135:   21(ivec4) Load 134
+             136:   21(ivec4) GroupNonUniformQuadBroadcast 35 135 34
+             137:    112(ptr) AccessChain 27(data) 133 51
+                              Store 137 136
+             138:      6(int) Load 8(invocation)
+             140:    139(ptr) AccessChain 27(data) 29 65 30
+             141:22(float64_t) Load 140
+             142:22(float64_t) GroupNonUniformQuadBroadcast 35 141 34
+             143:    139(ptr) AccessChain 27(data) 138 65 30
+                              Store 143 142
+             144:      6(int) Load 8(invocation)
+             147:    146(ptr) AccessChain 27(data) 39 65
              148: 23(f64vec4) Load 147
-             149: 23(f64vec4) VectorShuffle 148 146 4 5 6 3
-                              Store 147 149
-             150:      6(int) Load 8(invocation)
-             151:    133(ptr) AccessChain 27(data) 60 60
-             152: 23(f64vec4) Load 151
-             153: 23(f64vec4) GroupNonUniformQuadBroadcast 35 152 34
-             154:    133(ptr) AccessChain 27(data) 150 60
-                              Store 154 153
+             149:145(f64vec2) VectorShuffle 148 148 0 1
+             150:145(f64vec2) GroupNonUniformQuadBroadcast 35 149 34
+             151:    139(ptr) AccessChain 27(data) 144 65 30
+             152:22(float64_t) CompositeExtract 150 0
+                              Store 151 152
+             153:    139(ptr) AccessChain 27(data) 144 65 34
+             154:22(float64_t) CompositeExtract 150 1
+                              Store 153 154
              155:      6(int) Load 8(invocation)
-             156:     66(ptr) AccessChain 27(data) 29 39 30
-             157:     19(int) Load 156
-             159:   158(bool) SLessThan 157 29
-             160:   158(bool) GroupNonUniformQuadBroadcast 35 159 34
-             161:     19(int) Select 160 39 29
-             162:     66(ptr) AccessChain 27(data) 155 39 30
-                              Store 162 161
-             163:      6(int) Load 8(invocation)
-             164:     73(ptr) AccessChain 27(data) 39 39
-             165:   20(ivec4) Load 164
-             166:   72(ivec2) VectorShuffle 165 165 0 1
-             169:  168(bvec2) SLessThan 166 167
-             170:  168(bvec2) GroupNonUniformQuadBroadcast 35 169 34
-             172:   72(ivec2) Select 170 171 167
-             173:     73(ptr) AccessChain 27(data) 163 39
-             174:   20(ivec4) Load 173
-             175:   20(ivec4) VectorShuffle 174 172 4 5 2 3
-                              Store 173 175
-             176:      6(int) Load 8(invocation)
-             177:     73(ptr) AccessChain 27(data) 39 39
-             178:   20(ivec4) Load 177
-             179:   82(ivec3) VectorShuffle 178 178 0 1 2
-             182:  181(bvec3) SLessThan 179 180
-             183:  181(bvec3) GroupNonUniformQuadBroadcast 35 182 34
-             185:   82(ivec3) Select 183 184 180
-             186:     73(ptr) AccessChain 27(data) 176 39
-             187:   20(ivec4) Load 186
-             188:   20(ivec4) VectorShuffle 187 185 4 5 6 3
-                              Store 186 188
-             189:      6(int) Load 8(invocation)
-             190:     73(ptr) AccessChain 27(data) 39 39
-             191:   20(ivec4) Load 190
-             194:  193(bvec4) SLessThan 191 192
-             195:  193(bvec4) GroupNonUniformQuadBroadcast 35 194 34
-             197:   20(ivec4) Select 195 196 192
-             198:     73(ptr) AccessChain 27(data) 189 39
-                              Store 198 197
-             199:      6(int) Load 8(invocation)
-             200:     31(ptr) AccessChain 27(data) 29 29 30
-             201:   17(float) Load 200
-             202:   17(float) GroupNonUniformQuadSwap 35 201 30
-             203:     31(ptr) AccessChain 27(data) 199 29 30
-                              Store 203 202
-             204:      6(int) Load 8(invocation)
-             205:     41(ptr) AccessChain 27(data) 39 29
-             206:   18(fvec4) Load 205
-             207:   40(fvec2) VectorShuffle 206 206 0 1
-             208:   40(fvec2) GroupNonUniformQuadSwap 35 207 30
-             209:     41(ptr) AccessChain 27(data) 204 29
-             210:   18(fvec4) Load 209
-             211:   18(fvec4) VectorShuffle 210 208 4 5 2 3
-                              Store 209 211
-             212:      6(int) Load 8(invocation)
-             213:     41(ptr) AccessChain 27(data) 50 29
-             214:   18(fvec4) Load 213
-             215:   51(fvec3) VectorShuffle 214 214 0 1 2
-             216:   51(fvec3) GroupNonUniformQuadSwap 35 215 30
-             217:     41(ptr) AccessChain 27(data) 212 29
-             218:   18(fvec4) Load 217
-             219:   18(fvec4) VectorShuffle 218 216 4 5 6 3
-                              Store 217 219
+             157:    146(ptr) AccessChain 27(data) 51 65
+             158: 23(f64vec4) Load 157
+             159:156(f64vec3) VectorShuffle 158 158 0 1 2
+             160:156(f64vec3) GroupNonUniformQuadBroadcast 35 159 34
+             161:    139(ptr) AccessChain 27(data) 155 65 30
+             162:22(float64_t) CompositeExtract 160 0
+                              Store 161 162
+             163:    139(ptr) AccessChain 27(data) 155 65 34
+             164:22(float64_t) CompositeExtract 160 1
+                              Store 163 164
+             165:    139(ptr) AccessChain 27(data) 155 65 61
+             166:22(float64_t) CompositeExtract 160 2
+                              Store 165 166
+             167:      6(int) Load 8(invocation)
+             168:    146(ptr) AccessChain 27(data) 65 65
+             169: 23(f64vec4) Load 168
+             170: 23(f64vec4) GroupNonUniformQuadBroadcast 35 169 34
+             171:    146(ptr) AccessChain 27(data) 167 65
+                              Store 171 170
+             172:      6(int) Load 8(invocation)
+             173:     71(ptr) AccessChain 27(data) 29 39 30
+             174:     19(int) Load 173
+             176:   175(bool) SLessThan 174 29
+             177:   175(bool) GroupNonUniformQuadBroadcast 35 176 34
+             178:     19(int) Select 177 39 29
+             179:     71(ptr) AccessChain 27(data) 172 39 30
+                              Store 179 178
+             180:      6(int) Load 8(invocation)
+             181:     78(ptr) AccessChain 27(data) 39 39
+             182:   20(ivec4) Load 181
+             183:   77(ivec2) VectorShuffle 182 182 0 1
+             186:  185(bvec2) SLessThan 183 184
+             187:  185(bvec2) GroupNonUniformQuadBroadcast 35 186 34
+             189:   77(ivec2) Select 187 188 184
+             190:     71(ptr) AccessChain 27(data) 180 39 30
+             191:     19(int) CompositeExtract 189 0
+                              Store 190 191
+             192:     71(ptr) AccessChain 27(data) 180 39 34
+             193:     19(int) CompositeExtract 189 1
+                              Store 192 193
+             194:      6(int) Load 8(invocation)
+             195:     78(ptr) AccessChain 27(data) 39 39
+             196:   20(ivec4) Load 195
+             197:   88(ivec3) VectorShuffle 196 196 0 1 2
+             200:  199(bvec3) SLessThan 197 198
+             201:  199(bvec3) GroupNonUniformQuadBroadcast 35 200 34
+             203:   88(ivec3) Select 201 202 198
+             204:     71(ptr) AccessChain 27(data) 194 39 30
+             205:     19(int) CompositeExtract 203 0
+                              Store 204 205
+             206:     71(ptr) AccessChain 27(data) 194 39 34
+             207:     19(int) CompositeExtract 203 1
+                              Store 206 207
+             208:     71(ptr) AccessChain 27(data) 194 39 61
+             209:     19(int) CompositeExtract 203 2
+                              Store 208 209
+             210:      6(int) Load 8(invocation)
+             211:     78(ptr) AccessChain 27(data) 39 39
+             212:   20(ivec4) Load 211
+             215:  214(bvec4) SLessThan 212 213
+             216:  214(bvec4) GroupNonUniformQuadBroadcast 35 215 34
+             218:   20(ivec4) Select 216 217 213
+             219:     78(ptr) AccessChain 27(data) 210 39
+                              Store 219 218
              220:      6(int) Load 8(invocation)
-             221:     41(ptr) AccessChain 27(data) 60 29
-             222:   18(fvec4) Load 221
-             223:   18(fvec4) GroupNonUniformQuadSwap 35 222 30
-             224:     41(ptr) AccessChain 27(data) 220 29
+             221:     31(ptr) AccessChain 27(data) 29 29 30
+             222:   17(float) Load 221
+             223:   17(float) GroupNonUniformQuadSwap 35 222 30
+             224:     31(ptr) AccessChain 27(data) 220 29 30
                               Store 224 223
              225:      6(int) Load 8(invocation)
-             226:     66(ptr) AccessChain 27(data) 29 39 30
-             227:     19(int) Load 226
-             228:     19(int) GroupNonUniformQuadSwap 35 227 30
-             229:     66(ptr) AccessChain 27(data) 225 39 30
-                              Store 229 228
-             230:      6(int) Load 8(invocation)
-             231:     73(ptr) AccessChain 27(data) 39 39
-             232:   20(ivec4) Load 231
-             233:   72(ivec2) VectorShuffle 232 232 0 1
-             234:   72(ivec2) GroupNonUniformQuadSwap 35 233 30
-             235:     73(ptr) AccessChain 27(data) 230 39
-             236:   20(ivec4) Load 235
-             237:   20(ivec4) VectorShuffle 236 234 4 5 2 3
-                              Store 235 237
-             238:      6(int) Load 8(invocation)
-             239:     73(ptr) AccessChain 27(data) 50 39
-             240:   20(ivec4) Load 239
-             241:   82(ivec3) VectorShuffle 240 240 0 1 2
-             242:   82(ivec3) GroupNonUniformQuadSwap 35 241 30
-             243:     73(ptr) AccessChain 27(data) 238 39
-             244:   20(ivec4) Load 243
-             245:   20(ivec4) VectorShuffle 244 242 4 5 6 3
-                              Store 243 245
-             246:      6(int) Load 8(invocation)
-             247:     73(ptr) AccessChain 27(data) 60 39
-             248:   20(ivec4) Load 247
-             249:   20(ivec4) GroupNonUniformQuadSwap 35 248 30
-             250:     73(ptr) AccessChain 27(data) 246 39
-                              Store 250 249
-             251:      6(int) Load 8(invocation)
-             252:     96(ptr) AccessChain 27(data) 29 50 30
-             253:      6(int) Load 252
-             254:      6(int) GroupNonUniformQuadSwap 35 253 30
-             255:     96(ptr) AccessChain 27(data) 251 50 30
-                              Store 255 254
-             256:      6(int) Load 8(invocation)
-             257:    103(ptr) AccessChain 27(data) 39 50
-             258:   21(ivec4) Load 257
-             259:  102(ivec2) VectorShuffle 258 258 0 1
-             260:  102(ivec2) GroupNonUniformQuadSwap 35 259 30
-             261:    103(ptr) AccessChain 27(data) 256 50
-             262:   21(ivec4) Load 261
-             263:   21(ivec4) VectorShuffle 262 260 4 5 2 3
-                              Store 261 263
+             226:     41(ptr) AccessChain 27(data) 39 29
+             227:   18(fvec4) Load 226
+             228:   40(fvec2) VectorShuffle 227 227 0 1
+             229:   40(fvec2) GroupNonUniformQuadSwap 35 228 30
+             230:     31(ptr) AccessChain 27(data) 225 29 30
+             231:   17(float) CompositeExtract 229 0
+                              Store 230 231
+             232:     31(ptr) AccessChain 27(data) 225 29 34
+             233:   17(float) CompositeExtract 229 1
+                              Store 232 233
+             234:      6(int) Load 8(invocation)
+             235:     41(ptr) AccessChain 27(data) 51 29
+             236:   18(fvec4) Load 235
+             237:   52(fvec3) VectorShuffle 236 236 0 1 2
+             238:   52(fvec3) GroupNonUniformQuadSwap 35 237 30
+             239:     31(ptr) AccessChain 27(data) 234 29 30
+             240:   17(float) CompositeExtract 238 0
+                              Store 239 240
+             241:     31(ptr) AccessChain 27(data) 234 29 34
+             242:   17(float) CompositeExtract 238 1
+                              Store 241 242
+             243:     31(ptr) AccessChain 27(data) 234 29 61
+             244:   17(float) CompositeExtract 238 2
+                              Store 243 244
+             245:      6(int) Load 8(invocation)
+             246:     41(ptr) AccessChain 27(data) 65 29
+             247:   18(fvec4) Load 246
+             248:   18(fvec4) GroupNonUniformQuadSwap 35 247 30
+             249:     41(ptr) AccessChain 27(data) 245 29
+                              Store 249 248
+             250:      6(int) Load 8(invocation)
+             251:     71(ptr) AccessChain 27(data) 29 39 30
+             252:     19(int) Load 251
+             253:     19(int) GroupNonUniformQuadSwap 35 252 30
+             254:     71(ptr) AccessChain 27(data) 250 39 30
+                              Store 254 253
+             255:      6(int) Load 8(invocation)
+             256:     78(ptr) AccessChain 27(data) 39 39
+             257:   20(ivec4) Load 256
+             258:   77(ivec2) VectorShuffle 257 257 0 1
+             259:   77(ivec2) GroupNonUniformQuadSwap 35 258 30
+             260:     71(ptr) AccessChain 27(data) 255 39 30
+             261:     19(int) CompositeExtract 259 0
+                              Store 260 261
+             262:     71(ptr) AccessChain 27(data) 255 39 34
+             263:     19(int) CompositeExtract 259 1
+                              Store 262 263
              264:      6(int) Load 8(invocation)
-             265:    103(ptr) AccessChain 27(data) 50 50
-             266:   21(ivec4) Load 265
-             267:  112(ivec3) VectorShuffle 266 266 0 1 2
-             268:  112(ivec3) GroupNonUniformQuadSwap 35 267 30
-             269:    103(ptr) AccessChain 27(data) 264 50
-             270:   21(ivec4) Load 269
-             271:   21(ivec4) VectorShuffle 270 268 4 5 6 3
-                              Store 269 271
-             272:      6(int) Load 8(invocation)
-             273:    103(ptr) AccessChain 27(data) 60 50
-             274:   21(ivec4) Load 273
-             275:   21(ivec4) GroupNonUniformQuadSwap 35 274 30
-             276:    103(ptr) AccessChain 27(data) 272 50
-                              Store 276 275
-             277:      6(int) Load 8(invocation)
-             278:    126(ptr) AccessChain 27(data) 29 60 30
-             279:22(float64_t) Load 278
-             280:22(float64_t) GroupNonUniformQuadSwap 35 279 30
-             281:    126(ptr) AccessChain 27(data) 277 60 30
-                              Store 281 280
-             282:      6(int) Load 8(invocation)
-             283:    133(ptr) AccessChain 27(data) 39 60
-             284: 23(f64vec4) Load 283
-             285:132(f64vec2) VectorShuffle 284 284 0 1
-             286:132(f64vec2) GroupNonUniformQuadSwap 35 285 30
-             287:    133(ptr) AccessChain 27(data) 282 60
-             288: 23(f64vec4) Load 287
-             289: 23(f64vec4) VectorShuffle 288 286 4 5 2 3
-                              Store 287 289
-             290:      6(int) Load 8(invocation)
-             291:    133(ptr) AccessChain 27(data) 50 60
-             292: 23(f64vec4) Load 291
-             293:142(f64vec3) VectorShuffle 292 292 0 1 2
-             294:142(f64vec3) GroupNonUniformQuadSwap 35 293 30
-             295:    133(ptr) AccessChain 27(data) 290 60
-             296: 23(f64vec4) Load 295
-             297: 23(f64vec4) VectorShuffle 296 294 4 5 6 3
-                              Store 295 297
-             298:      6(int) Load 8(invocation)
-             299:    133(ptr) AccessChain 27(data) 60 60
-             300: 23(f64vec4) Load 299
-             301: 23(f64vec4) GroupNonUniformQuadSwap 35 300 30
-             302:    133(ptr) AccessChain 27(data) 298 60
-                              Store 302 301
-             303:      6(int) Load 8(invocation)
-             304:     66(ptr) AccessChain 27(data) 29 39 30
-             305:     19(int) Load 304
-             306:   158(bool) SLessThan 305 29
-             307:   158(bool) GroupNonUniformQuadSwap 35 306 30
-             308:     19(int) Select 307 39 29
-             309:     66(ptr) AccessChain 27(data) 303 39 30
+             265:     78(ptr) AccessChain 27(data) 51 39
+             266:   20(ivec4) Load 265
+             267:   88(ivec3) VectorShuffle 266 266 0 1 2
+             268:   88(ivec3) GroupNonUniformQuadSwap 35 267 30
+             269:     71(ptr) AccessChain 27(data) 264 39 30
+             270:     19(int) CompositeExtract 268 0
+                              Store 269 270
+             271:     71(ptr) AccessChain 27(data) 264 39 34
+             272:     19(int) CompositeExtract 268 1
+                              Store 271 272
+             273:     71(ptr) AccessChain 27(data) 264 39 61
+             274:     19(int) CompositeExtract 268 2
+                              Store 273 274
+             275:      6(int) Load 8(invocation)
+             276:     78(ptr) AccessChain 27(data) 65 39
+             277:   20(ivec4) Load 276
+             278:   20(ivec4) GroupNonUniformQuadSwap 35 277 30
+             279:     78(ptr) AccessChain 27(data) 275 39
+                              Store 279 278
+             280:      6(int) Load 8(invocation)
+             281:    105(ptr) AccessChain 27(data) 29 51 30
+             282:      6(int) Load 281
+             283:      6(int) GroupNonUniformQuadSwap 35 282 30
+             284:    105(ptr) AccessChain 27(data) 280 51 30
+                              Store 284 283
+             285:      6(int) Load 8(invocation)
+             286:    112(ptr) AccessChain 27(data) 39 51
+             287:   21(ivec4) Load 286
+             288:  111(ivec2) VectorShuffle 287 287 0 1
+             289:  111(ivec2) GroupNonUniformQuadSwap 35 288 30
+             290:    105(ptr) AccessChain 27(data) 285 51 30
+             291:      6(int) CompositeExtract 289 0
+                              Store 290 291
+             292:    105(ptr) AccessChain 27(data) 285 51 34
+             293:      6(int) CompositeExtract 289 1
+                              Store 292 293
+             294:      6(int) Load 8(invocation)
+             295:    112(ptr) AccessChain 27(data) 51 51
+             296:   21(ivec4) Load 295
+             297:  122(ivec3) VectorShuffle 296 296 0 1 2
+             298:  122(ivec3) GroupNonUniformQuadSwap 35 297 30
+             299:    105(ptr) AccessChain 27(data) 294 51 30
+             300:      6(int) CompositeExtract 298 0
+                              Store 299 300
+             301:    105(ptr) AccessChain 27(data) 294 51 34
+             302:      6(int) CompositeExtract 298 1
+                              Store 301 302
+             303:    105(ptr) AccessChain 27(data) 294 51 61
+             304:      6(int) CompositeExtract 298 2
+                              Store 303 304
+             305:      6(int) Load 8(invocation)
+             306:    112(ptr) AccessChain 27(data) 65 51
+             307:   21(ivec4) Load 306
+             308:   21(ivec4) GroupNonUniformQuadSwap 35 307 30
+             309:    112(ptr) AccessChain 27(data) 305 51
                               Store 309 308
              310:      6(int) Load 8(invocation)
-             311:     73(ptr) AccessChain 27(data) 39 39
-             312:   20(ivec4) Load 311
-             313:   72(ivec2) VectorShuffle 312 312 0 1
-             314:  168(bvec2) SLessThan 313 167
-             315:  168(bvec2) GroupNonUniformQuadSwap 35 314 30
-             316:   72(ivec2) Select 315 171 167
-             317:     73(ptr) AccessChain 27(data) 310 39
-             318:   20(ivec4) Load 317
-             319:   20(ivec4) VectorShuffle 318 316 4 5 2 3
-                              Store 317 319
-             320:      6(int) Load 8(invocation)
-             321:     73(ptr) AccessChain 27(data) 39 39
-             322:   20(ivec4) Load 321
-             323:   82(ivec3) VectorShuffle 322 322 0 1 2
-             324:  181(bvec3) SLessThan 323 180
-             325:  181(bvec3) GroupNonUniformQuadSwap 35 324 30
-             326:   82(ivec3) Select 325 184 180
-             327:     73(ptr) AccessChain 27(data) 320 39
-             328:   20(ivec4) Load 327
-             329:   20(ivec4) VectorShuffle 328 326 4 5 6 3
-                              Store 327 329
-             330:      6(int) Load 8(invocation)
-             331:     73(ptr) AccessChain 27(data) 39 39
-             332:   20(ivec4) Load 331
-             333:  193(bvec4) SLessThan 332 192
-             334:  193(bvec4) GroupNonUniformQuadSwap 35 333 30
-             335:   20(ivec4) Select 334 196 192
-             336:     73(ptr) AccessChain 27(data) 330 39
-                              Store 336 335
-             337:      6(int) Load 8(invocation)
-             338:     31(ptr) AccessChain 27(data) 29 29 30
-             339:   17(float) Load 338
-             340:   17(float) GroupNonUniformQuadSwap 35 339 34
-             341:     31(ptr) AccessChain 27(data) 337 29 30
-                              Store 341 340
-             342:      6(int) Load 8(invocation)
-             343:     41(ptr) AccessChain 27(data) 39 29
-             344:   18(fvec4) Load 343
-             345:   40(fvec2) VectorShuffle 344 344 0 1
-             346:   40(fvec2) GroupNonUniformQuadSwap 35 345 34
-             347:     41(ptr) AccessChain 27(data) 342 29
-             348:   18(fvec4) Load 347
-             349:   18(fvec4) VectorShuffle 348 346 4 5 2 3
-                              Store 347 349
-             350:      6(int) Load 8(invocation)
-             351:     41(ptr) AccessChain 27(data) 50 29
-             352:   18(fvec4) Load 351
-             353:   51(fvec3) VectorShuffle 352 352 0 1 2
-             354:   51(fvec3) GroupNonUniformQuadSwap 35 353 34
-             355:     41(ptr) AccessChain 27(data) 350 29
-             356:   18(fvec4) Load 355
-             357:   18(fvec4) VectorShuffle 356 354 4 5 6 3
-                              Store 355 357
+             311:    139(ptr) AccessChain 27(data) 29 65 30
+             312:22(float64_t) Load 311
+             313:22(float64_t) GroupNonUniformQuadSwap 35 312 30
+             314:    139(ptr) AccessChain 27(data) 310 65 30
+                              Store 314 313
+             315:      6(int) Load 8(invocation)
+             316:    146(ptr) AccessChain 27(data) 39 65
+             317: 23(f64vec4) Load 316
+             318:145(f64vec2) VectorShuffle 317 317 0 1
+             319:145(f64vec2) GroupNonUniformQuadSwap 35 318 30
+             320:    139(ptr) AccessChain 27(data) 315 65 30
+             321:22(float64_t) CompositeExtract 319 0
+                              Store 320 321
+             322:    139(ptr) AccessChain 27(data) 315 65 34
+             323:22(float64_t) CompositeExtract 319 1
+                              Store 322 323
+             324:      6(int) Load 8(invocation)
+             325:    146(ptr) AccessChain 27(data) 51 65
+             326: 23(f64vec4) Load 325
+             327:156(f64vec3) VectorShuffle 326 326 0 1 2
+             328:156(f64vec3) GroupNonUniformQuadSwap 35 327 30
+             329:    139(ptr) AccessChain 27(data) 324 65 30
+             330:22(float64_t) CompositeExtract 328 0
+                              Store 329 330
+             331:    139(ptr) AccessChain 27(data) 324 65 34
+             332:22(float64_t) CompositeExtract 328 1
+                              Store 331 332
+             333:    139(ptr) AccessChain 27(data) 324 65 61
+             334:22(float64_t) CompositeExtract 328 2
+                              Store 333 334
+             335:      6(int) Load 8(invocation)
+             336:    146(ptr) AccessChain 27(data) 65 65
+             337: 23(f64vec4) Load 336
+             338: 23(f64vec4) GroupNonUniformQuadSwap 35 337 30
+             339:    146(ptr) AccessChain 27(data) 335 65
+                              Store 339 338
+             340:      6(int) Load 8(invocation)
+             341:     71(ptr) AccessChain 27(data) 29 39 30
+             342:     19(int) Load 341
+             343:   175(bool) SLessThan 342 29
+             344:   175(bool) GroupNonUniformQuadSwap 35 343 30
+             345:     19(int) Select 344 39 29
+             346:     71(ptr) AccessChain 27(data) 340 39 30
+                              Store 346 345
+             347:      6(int) Load 8(invocation)
+             348:     78(ptr) AccessChain 27(data) 39 39
+             349:   20(ivec4) Load 348
+             350:   77(ivec2) VectorShuffle 349 349 0 1
+             351:  185(bvec2) SLessThan 350 184
+             352:  185(bvec2) GroupNonUniformQuadSwap 35 351 30
+             353:   77(ivec2) Select 352 188 184
+             354:     71(ptr) AccessChain 27(data) 347 39 30
+             355:     19(int) CompositeExtract 353 0
+                              Store 354 355
+             356:     71(ptr) AccessChain 27(data) 347 39 34
+             357:     19(int) CompositeExtract 353 1
+                              Store 356 357
              358:      6(int) Load 8(invocation)
-             359:     41(ptr) AccessChain 27(data) 60 29
-             360:   18(fvec4) Load 359
-             361:   18(fvec4) GroupNonUniformQuadSwap 35 360 34
-             362:     41(ptr) AccessChain 27(data) 358 29
-                              Store 362 361
-             363:      6(int) Load 8(invocation)
-             364:     66(ptr) AccessChain 27(data) 29 39 30
-             365:     19(int) Load 364
-             366:     19(int) GroupNonUniformQuadSwap 35 365 34
-             367:     66(ptr) AccessChain 27(data) 363 39 30
-                              Store 367 366
-             368:      6(int) Load 8(invocation)
-             369:     73(ptr) AccessChain 27(data) 39 39
-             370:   20(ivec4) Load 369
-             371:   72(ivec2) VectorShuffle 370 370 0 1
-             372:   72(ivec2) GroupNonUniformQuadSwap 35 371 34
-             373:     73(ptr) AccessChain 27(data) 368 39
-             374:   20(ivec4) Load 373
-             375:   20(ivec4) VectorShuffle 374 372 4 5 2 3
-                              Store 373 375
-             376:      6(int) Load 8(invocation)
-             377:     73(ptr) AccessChain 27(data) 50 39
-             378:   20(ivec4) Load 377
-             379:   82(ivec3) VectorShuffle 378 378 0 1 2
-             380:   82(ivec3) GroupNonUniformQuadSwap 35 379 34
-             381:     73(ptr) AccessChain 27(data) 376 39
-             382:   20(ivec4) Load 381
-             383:   20(ivec4) VectorShuffle 382 380 4 5 6 3
-                              Store 381 383
-             384:      6(int) Load 8(invocation)
-             385:     73(ptr) AccessChain 27(data) 60 39
-             386:   20(ivec4) Load 385
-             387:   20(ivec4) GroupNonUniformQuadSwap 35 386 34
-             388:     73(ptr) AccessChain 27(data) 384 39
-                              Store 388 387
-             389:      6(int) Load 8(invocation)
-             390:     96(ptr) AccessChain 27(data) 29 50 30
-             391:      6(int) Load 390
-             392:      6(int) GroupNonUniformQuadSwap 35 391 34
-             393:     96(ptr) AccessChain 27(data) 389 50 30
-                              Store 393 392
-             394:      6(int) Load 8(invocation)
-             395:    103(ptr) AccessChain 27(data) 39 50
-             396:   21(ivec4) Load 395
-             397:  102(ivec2) VectorShuffle 396 396 0 1
-             398:  102(ivec2) GroupNonUniformQuadSwap 35 397 34
-             399:    103(ptr) AccessChain 27(data) 394 50
-             400:   21(ivec4) Load 399
-             401:   21(ivec4) VectorShuffle 400 398 4 5 2 3
-                              Store 399 401
-             402:      6(int) Load 8(invocation)
-             403:    103(ptr) AccessChain 27(data) 50 50
-             404:   21(ivec4) Load 403
-             405:  112(ivec3) VectorShuffle 404 404 0 1 2
-             406:  112(ivec3) GroupNonUniformQuadSwap 35 405 34
-             407:    103(ptr) AccessChain 27(data) 402 50
-             408:   21(ivec4) Load 407
-             409:   21(ivec4) VectorShuffle 408 406 4 5 6 3
-                              Store 407 409
-             410:      6(int) Load 8(invocation)
-             411:    103(ptr) AccessChain 27(data) 60 50
-             412:   21(ivec4) Load 411
-             413:   21(ivec4) GroupNonUniformQuadSwap 35 412 34
-             414:    103(ptr) AccessChain 27(data) 410 50
-                              Store 414 413
-             415:      6(int) Load 8(invocation)
-             416:    126(ptr) AccessChain 27(data) 29 60 30
-             417:22(float64_t) Load 416
-             418:22(float64_t) GroupNonUniformQuadSwap 35 417 34
-             419:    126(ptr) AccessChain 27(data) 415 60 30
-                              Store 419 418
-             420:      6(int) Load 8(invocation)
-             421:    133(ptr) AccessChain 27(data) 39 60
-             422: 23(f64vec4) Load 421
-             423:132(f64vec2) VectorShuffle 422 422 0 1
-             424:132(f64vec2) GroupNonUniformQuadSwap 35 423 34
-             425:    133(ptr) AccessChain 27(data) 420 60
-             426: 23(f64vec4) Load 425
-             427: 23(f64vec4) VectorShuffle 426 424 4 5 2 3
-                              Store 425 427
-             428:      6(int) Load 8(invocation)
-             429:    133(ptr) AccessChain 27(data) 50 60
-             430: 23(f64vec4) Load 429
-             431:142(f64vec3) VectorShuffle 430 430 0 1 2
-             432:142(f64vec3) GroupNonUniformQuadSwap 35 431 34
-             433:    133(ptr) AccessChain 27(data) 428 60
-             434: 23(f64vec4) Load 433
-             435: 23(f64vec4) VectorShuffle 434 432 4 5 6 3
-                              Store 433 435
-             436:      6(int) Load 8(invocation)
-             437:    133(ptr) AccessChain 27(data) 60 60
-             438: 23(f64vec4) Load 437
-             439: 23(f64vec4) GroupNonUniformQuadSwap 35 438 34
-             440:    133(ptr) AccessChain 27(data) 436 60
-                              Store 440 439
-             441:      6(int) Load 8(invocation)
-             442:     66(ptr) AccessChain 27(data) 29 39 30
-             443:     19(int) Load 442
-             444:   158(bool) SLessThan 443 29
-             445:   158(bool) GroupNonUniformQuadSwap 35 444 34
-             446:     19(int) Select 445 39 29
-             447:     66(ptr) AccessChain 27(data) 441 39 30
-                              Store 447 446
-             448:      6(int) Load 8(invocation)
-             449:     73(ptr) AccessChain 27(data) 39 39
-             450:   20(ivec4) Load 449
-             451:   72(ivec2) VectorShuffle 450 450 0 1
-             452:  168(bvec2) SLessThan 451 167
-             453:  168(bvec2) GroupNonUniformQuadSwap 35 452 34
-             454:   72(ivec2) Select 453 171 167
-             455:     73(ptr) AccessChain 27(data) 448 39
-             456:   20(ivec4) Load 455
-             457:   20(ivec4) VectorShuffle 456 454 4 5 2 3
-                              Store 455 457
-             458:      6(int) Load 8(invocation)
-             459:     73(ptr) AccessChain 27(data) 39 39
-             460:   20(ivec4) Load 459
-             461:   82(ivec3) VectorShuffle 460 460 0 1 2
-             462:  181(bvec3) SLessThan 461 180
-             463:  181(bvec3) GroupNonUniformQuadSwap 35 462 34
-             464:   82(ivec3) Select 463 184 180
-             465:     73(ptr) AccessChain 27(data) 458 39
-             466:   20(ivec4) Load 465
-             467:   20(ivec4) VectorShuffle 466 464 4 5 6 3
-                              Store 465 467
+             359:     78(ptr) AccessChain 27(data) 39 39
+             360:   20(ivec4) Load 359
+             361:   88(ivec3) VectorShuffle 360 360 0 1 2
+             362:  199(bvec3) SLessThan 361 198
+             363:  199(bvec3) GroupNonUniformQuadSwap 35 362 30
+             364:   88(ivec3) Select 363 202 198
+             365:     71(ptr) AccessChain 27(data) 358 39 30
+             366:     19(int) CompositeExtract 364 0
+                              Store 365 366
+             367:     71(ptr) AccessChain 27(data) 358 39 34
+             368:     19(int) CompositeExtract 364 1
+                              Store 367 368
+             369:     71(ptr) AccessChain 27(data) 358 39 61
+             370:     19(int) CompositeExtract 364 2
+                              Store 369 370
+             371:      6(int) Load 8(invocation)
+             372:     78(ptr) AccessChain 27(data) 39 39
+             373:   20(ivec4) Load 372
+             374:  214(bvec4) SLessThan 373 213
+             375:  214(bvec4) GroupNonUniformQuadSwap 35 374 30
+             376:   20(ivec4) Select 375 217 213
+             377:     78(ptr) AccessChain 27(data) 371 39
+                              Store 377 376
+             378:      6(int) Load 8(invocation)
+             379:     31(ptr) AccessChain 27(data) 29 29 30
+             380:   17(float) Load 379
+             381:   17(float) GroupNonUniformQuadSwap 35 380 34
+             382:     31(ptr) AccessChain 27(data) 378 29 30
+                              Store 382 381
+             383:      6(int) Load 8(invocation)
+             384:     41(ptr) AccessChain 27(data) 39 29
+             385:   18(fvec4) Load 384
+             386:   40(fvec2) VectorShuffle 385 385 0 1
+             387:   40(fvec2) GroupNonUniformQuadSwap 35 386 34
+             388:     31(ptr) AccessChain 27(data) 383 29 30
+             389:   17(float) CompositeExtract 387 0
+                              Store 388 389
+             390:     31(ptr) AccessChain 27(data) 383 29 34
+             391:   17(float) CompositeExtract 387 1
+                              Store 390 391
+             392:      6(int) Load 8(invocation)
+             393:     41(ptr) AccessChain 27(data) 51 29
+             394:   18(fvec4) Load 393
+             395:   52(fvec3) VectorShuffle 394 394 0 1 2
+             396:   52(fvec3) GroupNonUniformQuadSwap 35 395 34
+             397:     31(ptr) AccessChain 27(data) 392 29 30
+             398:   17(float) CompositeExtract 396 0
+                              Store 397 398
+             399:     31(ptr) AccessChain 27(data) 392 29 34
+             400:   17(float) CompositeExtract 396 1
+                              Store 399 400
+             401:     31(ptr) AccessChain 27(data) 392 29 61
+             402:   17(float) CompositeExtract 396 2
+                              Store 401 402
+             403:      6(int) Load 8(invocation)
+             404:     41(ptr) AccessChain 27(data) 65 29
+             405:   18(fvec4) Load 404
+             406:   18(fvec4) GroupNonUniformQuadSwap 35 405 34
+             407:     41(ptr) AccessChain 27(data) 403 29
+                              Store 407 406
+             408:      6(int) Load 8(invocation)
+             409:     71(ptr) AccessChain 27(data) 29 39 30
+             410:     19(int) Load 409
+             411:     19(int) GroupNonUniformQuadSwap 35 410 34
+             412:     71(ptr) AccessChain 27(data) 408 39 30
+                              Store 412 411
+             413:      6(int) Load 8(invocation)
+             414:     78(ptr) AccessChain 27(data) 39 39
+             415:   20(ivec4) Load 414
+             416:   77(ivec2) VectorShuffle 415 415 0 1
+             417:   77(ivec2) GroupNonUniformQuadSwap 35 416 34
+             418:     71(ptr) AccessChain 27(data) 413 39 30
+             419:     19(int) CompositeExtract 417 0
+                              Store 418 419
+             420:     71(ptr) AccessChain 27(data) 413 39 34
+             421:     19(int) CompositeExtract 417 1
+                              Store 420 421
+             422:      6(int) Load 8(invocation)
+             423:     78(ptr) AccessChain 27(data) 51 39
+             424:   20(ivec4) Load 423
+             425:   88(ivec3) VectorShuffle 424 424 0 1 2
+             426:   88(ivec3) GroupNonUniformQuadSwap 35 425 34
+             427:     71(ptr) AccessChain 27(data) 422 39 30
+             428:     19(int) CompositeExtract 426 0
+                              Store 427 428
+             429:     71(ptr) AccessChain 27(data) 422 39 34
+             430:     19(int) CompositeExtract 426 1
+                              Store 429 430
+             431:     71(ptr) AccessChain 27(data) 422 39 61
+             432:     19(int) CompositeExtract 426 2
+                              Store 431 432
+             433:      6(int) Load 8(invocation)
+             434:     78(ptr) AccessChain 27(data) 65 39
+             435:   20(ivec4) Load 434
+             436:   20(ivec4) GroupNonUniformQuadSwap 35 435 34
+             437:     78(ptr) AccessChain 27(data) 433 39
+                              Store 437 436
+             438:      6(int) Load 8(invocation)
+             439:    105(ptr) AccessChain 27(data) 29 51 30
+             440:      6(int) Load 439
+             441:      6(int) GroupNonUniformQuadSwap 35 440 34
+             442:    105(ptr) AccessChain 27(data) 438 51 30
+                              Store 442 441
+             443:      6(int) Load 8(invocation)
+             444:    112(ptr) AccessChain 27(data) 39 51
+             445:   21(ivec4) Load 444
+             446:  111(ivec2) VectorShuffle 445 445 0 1
+             447:  111(ivec2) GroupNonUniformQuadSwap 35 446 34
+             448:    105(ptr) AccessChain 27(data) 443 51 30
+             449:      6(int) CompositeExtract 447 0
+                              Store 448 449
+             450:    105(ptr) AccessChain 27(data) 443 51 34
+             451:      6(int) CompositeExtract 447 1
+                              Store 450 451
+             452:      6(int) Load 8(invocation)
+             453:    112(ptr) AccessChain 27(data) 51 51
+             454:   21(ivec4) Load 453
+             455:  122(ivec3) VectorShuffle 454 454 0 1 2
+             456:  122(ivec3) GroupNonUniformQuadSwap 35 455 34
+             457:    105(ptr) AccessChain 27(data) 452 51 30
+             458:      6(int) CompositeExtract 456 0
+                              Store 457 458
+             459:    105(ptr) AccessChain 27(data) 452 51 34
+             460:      6(int) CompositeExtract 456 1
+                              Store 459 460
+             461:    105(ptr) AccessChain 27(data) 452 51 61
+             462:      6(int) CompositeExtract 456 2
+                              Store 461 462
+             463:      6(int) Load 8(invocation)
+             464:    112(ptr) AccessChain 27(data) 65 51
+             465:   21(ivec4) Load 464
+             466:   21(ivec4) GroupNonUniformQuadSwap 35 465 34
+             467:    112(ptr) AccessChain 27(data) 463 51
+                              Store 467 466
              468:      6(int) Load 8(invocation)
-             469:     73(ptr) AccessChain 27(data) 39 39
-             470:   20(ivec4) Load 469
-             471:  193(bvec4) SLessThan 470 192
-             472:  193(bvec4) GroupNonUniformQuadSwap 35 471 34
-             473:   20(ivec4) Select 472 196 192
-             474:     73(ptr) AccessChain 27(data) 468 39
-                              Store 474 473
-             475:      6(int) Load 8(invocation)
-             476:     31(ptr) AccessChain 27(data) 29 29 30
-             477:   17(float) Load 476
-             479:   17(float) GroupNonUniformQuadSwap 35 477 478
-             480:     31(ptr) AccessChain 27(data) 475 29 30
-                              Store 480 479
-             481:      6(int) Load 8(invocation)
-             482:     41(ptr) AccessChain 27(data) 39 29
-             483:   18(fvec4) Load 482
-             484:   40(fvec2) VectorShuffle 483 483 0 1
-             485:   40(fvec2) GroupNonUniformQuadSwap 35 484 478
-             486:     41(ptr) AccessChain 27(data) 481 29
-             487:   18(fvec4) Load 486
-             488:   18(fvec4) VectorShuffle 487 485 4 5 2 3
-                              Store 486 488
-             489:      6(int) Load 8(invocation)
-             490:     41(ptr) AccessChain 27(data) 50 29
-             491:   18(fvec4) Load 490
-             492:   51(fvec3) VectorShuffle 491 491 0 1 2
-             493:   51(fvec3) GroupNonUniformQuadSwap 35 492 478
-             494:     41(ptr) AccessChain 27(data) 489 29
-             495:   18(fvec4) Load 494
-             496:   18(fvec4) VectorShuffle 495 493 4 5 6 3
-                              Store 494 496
-             497:      6(int) Load 8(invocation)
-             498:     41(ptr) AccessChain 27(data) 60 29
-             499:   18(fvec4) Load 498
-             500:   18(fvec4) GroupNonUniformQuadSwap 35 499 478
-             501:     41(ptr) AccessChain 27(data) 497 29
-                              Store 501 500
-             502:      6(int) Load 8(invocation)
-             503:     66(ptr) AccessChain 27(data) 29 39 30
-             504:     19(int) Load 503
-             505:     19(int) GroupNonUniformQuadSwap 35 504 478
-             506:     66(ptr) AccessChain 27(data) 502 39 30
-                              Store 506 505
-             507:      6(int) Load 8(invocation)
-             508:     73(ptr) AccessChain 27(data) 39 39
-             509:   20(ivec4) Load 508
-             510:   72(ivec2) VectorShuffle 509 509 0 1
-             511:   72(ivec2) GroupNonUniformQuadSwap 35 510 478
-             512:     73(ptr) AccessChain 27(data) 507 39
-             513:   20(ivec4) Load 512
-             514:   20(ivec4) VectorShuffle 513 511 4 5 2 3
-                              Store 512 514
-             515:      6(int) Load 8(invocation)
-             516:     73(ptr) AccessChain 27(data) 50 39
-             517:   20(ivec4) Load 516
-             518:   82(ivec3) VectorShuffle 517 517 0 1 2
-             519:   82(ivec3) GroupNonUniformQuadSwap 35 518 478
-             520:     73(ptr) AccessChain 27(data) 515 39
-             521:   20(ivec4) Load 520
-             522:   20(ivec4) VectorShuffle 521 519 4 5 6 3
-                              Store 520 522
-             523:      6(int) Load 8(invocation)
-             524:     73(ptr) AccessChain 27(data) 60 39
-             525:   20(ivec4) Load 524
-             526:   20(ivec4) GroupNonUniformQuadSwap 35 525 478
-             527:     73(ptr) AccessChain 27(data) 523 39
-                              Store 527 526
-             528:      6(int) Load 8(invocation)
-             529:     96(ptr) AccessChain 27(data) 29 50 30
-             530:      6(int) Load 529
-             531:      6(int) GroupNonUniformQuadSwap 35 530 478
-             532:     96(ptr) AccessChain 27(data) 528 50 30
-                              Store 532 531
-             533:      6(int) Load 8(invocation)
-             534:    103(ptr) AccessChain 27(data) 39 50
-             535:   21(ivec4) Load 534
-             536:  102(ivec2) VectorShuffle 535 535 0 1
-             537:  102(ivec2) GroupNonUniformQuadSwap 35 536 478
-             538:    103(ptr) AccessChain 27(data) 533 50
-             539:   21(ivec4) Load 538
-             540:   21(ivec4) VectorShuffle 539 537 4 5 2 3
-                              Store 538 540
+             469:    139(ptr) AccessChain 27(data) 29 65 30
+             470:22(float64_t) Load 469
+             471:22(float64_t) GroupNonUniformQuadSwap 35 470 34
+             472:    139(ptr) AccessChain 27(data) 468 65 30
+                              Store 472 471
+             473:      6(int) Load 8(invocation)
+             474:    146(ptr) AccessChain 27(data) 39 65
+             475: 23(f64vec4) Load 474
+             476:145(f64vec2) VectorShuffle 475 475 0 1
+             477:145(f64vec2) GroupNonUniformQuadSwap 35 476 34
+             478:    139(ptr) AccessChain 27(data) 473 65 30
+             479:22(float64_t) CompositeExtract 477 0
+                              Store 478 479
+             480:    139(ptr) AccessChain 27(data) 473 65 34
+             481:22(float64_t) CompositeExtract 477 1
+                              Store 480 481
+             482:      6(int) Load 8(invocation)
+             483:    146(ptr) AccessChain 27(data) 51 65
+             484: 23(f64vec4) Load 483
+             485:156(f64vec3) VectorShuffle 484 484 0 1 2
+             486:156(f64vec3) GroupNonUniformQuadSwap 35 485 34
+             487:    139(ptr) AccessChain 27(data) 482 65 30
+             488:22(float64_t) CompositeExtract 486 0
+                              Store 487 488
+             489:    139(ptr) AccessChain 27(data) 482 65 34
+             490:22(float64_t) CompositeExtract 486 1
+                              Store 489 490
+             491:    139(ptr) AccessChain 27(data) 482 65 61
+             492:22(float64_t) CompositeExtract 486 2
+                              Store 491 492
+             493:      6(int) Load 8(invocation)
+             494:    146(ptr) AccessChain 27(data) 65 65
+             495: 23(f64vec4) Load 494
+             496: 23(f64vec4) GroupNonUniformQuadSwap 35 495 34
+             497:    146(ptr) AccessChain 27(data) 493 65
+                              Store 497 496
+             498:      6(int) Load 8(invocation)
+             499:     71(ptr) AccessChain 27(data) 29 39 30
+             500:     19(int) Load 499
+             501:   175(bool) SLessThan 500 29
+             502:   175(bool) GroupNonUniformQuadSwap 35 501 34
+             503:     19(int) Select 502 39 29
+             504:     71(ptr) AccessChain 27(data) 498 39 30
+                              Store 504 503
+             505:      6(int) Load 8(invocation)
+             506:     78(ptr) AccessChain 27(data) 39 39
+             507:   20(ivec4) Load 506
+             508:   77(ivec2) VectorShuffle 507 507 0 1
+             509:  185(bvec2) SLessThan 508 184
+             510:  185(bvec2) GroupNonUniformQuadSwap 35 509 34
+             511:   77(ivec2) Select 510 188 184
+             512:     71(ptr) AccessChain 27(data) 505 39 30
+             513:     19(int) CompositeExtract 511 0
+                              Store 512 513
+             514:     71(ptr) AccessChain 27(data) 505 39 34
+             515:     19(int) CompositeExtract 511 1
+                              Store 514 515
+             516:      6(int) Load 8(invocation)
+             517:     78(ptr) AccessChain 27(data) 39 39
+             518:   20(ivec4) Load 517
+             519:   88(ivec3) VectorShuffle 518 518 0 1 2
+             520:  199(bvec3) SLessThan 519 198
+             521:  199(bvec3) GroupNonUniformQuadSwap 35 520 34
+             522:   88(ivec3) Select 521 202 198
+             523:     71(ptr) AccessChain 27(data) 516 39 30
+             524:     19(int) CompositeExtract 522 0
+                              Store 523 524
+             525:     71(ptr) AccessChain 27(data) 516 39 34
+             526:     19(int) CompositeExtract 522 1
+                              Store 525 526
+             527:     71(ptr) AccessChain 27(data) 516 39 61
+             528:     19(int) CompositeExtract 522 2
+                              Store 527 528
+             529:      6(int) Load 8(invocation)
+             530:     78(ptr) AccessChain 27(data) 39 39
+             531:   20(ivec4) Load 530
+             532:  214(bvec4) SLessThan 531 213
+             533:  214(bvec4) GroupNonUniformQuadSwap 35 532 34
+             534:   20(ivec4) Select 533 217 213
+             535:     78(ptr) AccessChain 27(data) 529 39
+                              Store 535 534
+             536:      6(int) Load 8(invocation)
+             537:     31(ptr) AccessChain 27(data) 29 29 30
+             538:   17(float) Load 537
+             539:   17(float) GroupNonUniformQuadSwap 35 538 61
+             540:     31(ptr) AccessChain 27(data) 536 29 30
+                              Store 540 539
              541:      6(int) Load 8(invocation)
-             542:    103(ptr) AccessChain 27(data) 50 50
-             543:   21(ivec4) Load 542
-             544:  112(ivec3) VectorShuffle 543 543 0 1 2
-             545:  112(ivec3) GroupNonUniformQuadSwap 35 544 478
-             546:    103(ptr) AccessChain 27(data) 541 50
-             547:   21(ivec4) Load 546
-             548:   21(ivec4) VectorShuffle 547 545 4 5 6 3
-                              Store 546 548
-             549:      6(int) Load 8(invocation)
-             550:    103(ptr) AccessChain 27(data) 60 50
-             551:   21(ivec4) Load 550
-             552:   21(ivec4) GroupNonUniformQuadSwap 35 551 478
-             553:    103(ptr) AccessChain 27(data) 549 50
-                              Store 553 552
-             554:      6(int) Load 8(invocation)
-             555:    126(ptr) AccessChain 27(data) 29 60 30
-             556:22(float64_t) Load 555
-             557:22(float64_t) GroupNonUniformQuadSwap 35 556 478
-             558:    126(ptr) AccessChain 27(data) 554 60 30
-                              Store 558 557
-             559:      6(int) Load 8(invocation)
-             560:    133(ptr) AccessChain 27(data) 39 60
-             561: 23(f64vec4) Load 560
-             562:132(f64vec2) VectorShuffle 561 561 0 1
-             563:132(f64vec2) GroupNonUniformQuadSwap 35 562 478
-             564:    133(ptr) AccessChain 27(data) 559 60
-             565: 23(f64vec4) Load 564
-             566: 23(f64vec4) VectorShuffle 565 563 4 5 2 3
-                              Store 564 566
-             567:      6(int) Load 8(invocation)
-             568:    133(ptr) AccessChain 27(data) 50 60
-             569: 23(f64vec4) Load 568
-             570:142(f64vec3) VectorShuffle 569 569 0 1 2
-             571:142(f64vec3) GroupNonUniformQuadSwap 35 570 478
-             572:    133(ptr) AccessChain 27(data) 567 60
-             573: 23(f64vec4) Load 572
-             574: 23(f64vec4) VectorShuffle 573 571 4 5 6 3
-                              Store 572 574
-             575:      6(int) Load 8(invocation)
-             576:    133(ptr) AccessChain 27(data) 60 60
-             577: 23(f64vec4) Load 576
-             578: 23(f64vec4) GroupNonUniformQuadSwap 35 577 478
-             579:    133(ptr) AccessChain 27(data) 575 60
-                              Store 579 578
+             542:     41(ptr) AccessChain 27(data) 39 29
+             543:   18(fvec4) Load 542
+             544:   40(fvec2) VectorShuffle 543 543 0 1
+             545:   40(fvec2) GroupNonUniformQuadSwap 35 544 61
+             546:     31(ptr) AccessChain 27(data) 541 29 30
+             547:   17(float) CompositeExtract 545 0
+                              Store 546 547
+             548:     31(ptr) AccessChain 27(data) 541 29 34
+             549:   17(float) CompositeExtract 545 1
+                              Store 548 549
+             550:      6(int) Load 8(invocation)
+             551:     41(ptr) AccessChain 27(data) 51 29
+             552:   18(fvec4) Load 551
+             553:   52(fvec3) VectorShuffle 552 552 0 1 2
+             554:   52(fvec3) GroupNonUniformQuadSwap 35 553 61
+             555:     31(ptr) AccessChain 27(data) 550 29 30
+             556:   17(float) CompositeExtract 554 0
+                              Store 555 556
+             557:     31(ptr) AccessChain 27(data) 550 29 34
+             558:   17(float) CompositeExtract 554 1
+                              Store 557 558
+             559:     31(ptr) AccessChain 27(data) 550 29 61
+             560:   17(float) CompositeExtract 554 2
+                              Store 559 560
+             561:      6(int) Load 8(invocation)
+             562:     41(ptr) AccessChain 27(data) 65 29
+             563:   18(fvec4) Load 562
+             564:   18(fvec4) GroupNonUniformQuadSwap 35 563 61
+             565:     41(ptr) AccessChain 27(data) 561 29
+                              Store 565 564
+             566:      6(int) Load 8(invocation)
+             567:     71(ptr) AccessChain 27(data) 29 39 30
+             568:     19(int) Load 567
+             569:     19(int) GroupNonUniformQuadSwap 35 568 61
+             570:     71(ptr) AccessChain 27(data) 566 39 30
+                              Store 570 569
+             571:      6(int) Load 8(invocation)
+             572:     78(ptr) AccessChain 27(data) 39 39
+             573:   20(ivec4) Load 572
+             574:   77(ivec2) VectorShuffle 573 573 0 1
+             575:   77(ivec2) GroupNonUniformQuadSwap 35 574 61
+             576:     71(ptr) AccessChain 27(data) 571 39 30
+             577:     19(int) CompositeExtract 575 0
+                              Store 576 577
+             578:     71(ptr) AccessChain 27(data) 571 39 34
+             579:     19(int) CompositeExtract 575 1
+                              Store 578 579
              580:      6(int) Load 8(invocation)
-             581:     66(ptr) AccessChain 27(data) 29 39 30
-             582:     19(int) Load 581
-             583:   158(bool) SLessThan 582 29
-             584:   158(bool) GroupNonUniformQuadSwap 35 583 478
-             585:     19(int) Select 584 39 29
-             586:     66(ptr) AccessChain 27(data) 580 39 30
-                              Store 586 585
-             587:      6(int) Load 8(invocation)
-             588:     73(ptr) AccessChain 27(data) 39 39
-             589:   20(ivec4) Load 588
-             590:   72(ivec2) VectorShuffle 589 589 0 1
-             591:  168(bvec2) SLessThan 590 167
-             592:  168(bvec2) GroupNonUniformQuadSwap 35 591 478
-             593:   72(ivec2) Select 592 171 167
-             594:     73(ptr) AccessChain 27(data) 587 39
-             595:   20(ivec4) Load 594
-             596:   20(ivec4) VectorShuffle 595 593 4 5 2 3
-                              Store 594 596
-             597:      6(int) Load 8(invocation)
-             598:     73(ptr) AccessChain 27(data) 39 39
-             599:   20(ivec4) Load 598
-             600:   82(ivec3) VectorShuffle 599 599 0 1 2
-             601:  181(bvec3) SLessThan 600 180
-             602:  181(bvec3) GroupNonUniformQuadSwap 35 601 478
-             603:   82(ivec3) Select 602 184 180
-             604:     73(ptr) AccessChain 27(data) 597 39
-             605:   20(ivec4) Load 604
-             606:   20(ivec4) VectorShuffle 605 603 4 5 6 3
-                              Store 604 606
-             607:      6(int) Load 8(invocation)
-             608:     73(ptr) AccessChain 27(data) 39 39
-             609:   20(ivec4) Load 608
-             610:  193(bvec4) SLessThan 609 192
-             611:  193(bvec4) GroupNonUniformQuadSwap 35 610 478
-             612:   20(ivec4) Select 611 196 192
-             613:     73(ptr) AccessChain 27(data) 607 39
-                              Store 613 612
+             581:     78(ptr) AccessChain 27(data) 51 39
+             582:   20(ivec4) Load 581
+             583:   88(ivec3) VectorShuffle 582 582 0 1 2
+             584:   88(ivec3) GroupNonUniformQuadSwap 35 583 61
+             585:     71(ptr) AccessChain 27(data) 580 39 30
+             586:     19(int) CompositeExtract 584 0
+                              Store 585 586
+             587:     71(ptr) AccessChain 27(data) 580 39 34
+             588:     19(int) CompositeExtract 584 1
+                              Store 587 588
+             589:     71(ptr) AccessChain 27(data) 580 39 61
+             590:     19(int) CompositeExtract 584 2
+                              Store 589 590
+             591:      6(int) Load 8(invocation)
+             592:     78(ptr) AccessChain 27(data) 65 39
+             593:   20(ivec4) Load 592
+             594:   20(ivec4) GroupNonUniformQuadSwap 35 593 61
+             595:     78(ptr) AccessChain 27(data) 591 39
+                              Store 595 594
+             596:      6(int) Load 8(invocation)
+             597:    105(ptr) AccessChain 27(data) 29 51 30
+             598:      6(int) Load 597
+             599:      6(int) GroupNonUniformQuadSwap 35 598 61
+             600:    105(ptr) AccessChain 27(data) 596 51 30
+                              Store 600 599
+             601:      6(int) Load 8(invocation)
+             602:    112(ptr) AccessChain 27(data) 39 51
+             603:   21(ivec4) Load 602
+             604:  111(ivec2) VectorShuffle 603 603 0 1
+             605:  111(ivec2) GroupNonUniformQuadSwap 35 604 61
+             606:    105(ptr) AccessChain 27(data) 601 51 30
+             607:      6(int) CompositeExtract 605 0
+                              Store 606 607
+             608:    105(ptr) AccessChain 27(data) 601 51 34
+             609:      6(int) CompositeExtract 605 1
+                              Store 608 609
+             610:      6(int) Load 8(invocation)
+             611:    112(ptr) AccessChain 27(data) 51 51
+             612:   21(ivec4) Load 611
+             613:  122(ivec3) VectorShuffle 612 612 0 1 2
+             614:  122(ivec3) GroupNonUniformQuadSwap 35 613 61
+             615:    105(ptr) AccessChain 27(data) 610 51 30
+             616:      6(int) CompositeExtract 614 0
+                              Store 615 616
+             617:    105(ptr) AccessChain 27(data) 610 51 34
+             618:      6(int) CompositeExtract 614 1
+                              Store 617 618
+             619:    105(ptr) AccessChain 27(data) 610 51 61
+             620:      6(int) CompositeExtract 614 2
+                              Store 619 620
+             621:      6(int) Load 8(invocation)
+             622:    112(ptr) AccessChain 27(data) 65 51
+             623:   21(ivec4) Load 622
+             624:   21(ivec4) GroupNonUniformQuadSwap 35 623 61
+             625:    112(ptr) AccessChain 27(data) 621 51
+                              Store 625 624
+             626:      6(int) Load 8(invocation)
+             627:    139(ptr) AccessChain 27(data) 29 65 30
+             628:22(float64_t) Load 627
+             629:22(float64_t) GroupNonUniformQuadSwap 35 628 61
+             630:    139(ptr) AccessChain 27(data) 626 65 30
+                              Store 630 629
+             631:      6(int) Load 8(invocation)
+             632:    146(ptr) AccessChain 27(data) 39 65
+             633: 23(f64vec4) Load 632
+             634:145(f64vec2) VectorShuffle 633 633 0 1
+             635:145(f64vec2) GroupNonUniformQuadSwap 35 634 61
+             636:    139(ptr) AccessChain 27(data) 631 65 30
+             637:22(float64_t) CompositeExtract 635 0
+                              Store 636 637
+             638:    139(ptr) AccessChain 27(data) 631 65 34
+             639:22(float64_t) CompositeExtract 635 1
+                              Store 638 639
+             640:      6(int) Load 8(invocation)
+             641:    146(ptr) AccessChain 27(data) 51 65
+             642: 23(f64vec4) Load 641
+             643:156(f64vec3) VectorShuffle 642 642 0 1 2
+             644:156(f64vec3) GroupNonUniformQuadSwap 35 643 61
+             645:    139(ptr) AccessChain 27(data) 640 65 30
+             646:22(float64_t) CompositeExtract 644 0
+                              Store 645 646
+             647:    139(ptr) AccessChain 27(data) 640 65 34
+             648:22(float64_t) CompositeExtract 644 1
+                              Store 647 648
+             649:    139(ptr) AccessChain 27(data) 640 65 61
+             650:22(float64_t) CompositeExtract 644 2
+                              Store 649 650
+             651:      6(int) Load 8(invocation)
+             652:    146(ptr) AccessChain 27(data) 65 65
+             653: 23(f64vec4) Load 652
+             654: 23(f64vec4) GroupNonUniformQuadSwap 35 653 61
+             655:    146(ptr) AccessChain 27(data) 651 65
+                              Store 655 654
+             656:      6(int) Load 8(invocation)
+             657:     71(ptr) AccessChain 27(data) 29 39 30
+             658:     19(int) Load 657
+             659:   175(bool) SLessThan 658 29
+             660:   175(bool) GroupNonUniformQuadSwap 35 659 61
+             661:     19(int) Select 660 39 29
+             662:     71(ptr) AccessChain 27(data) 656 39 30
+                              Store 662 661
+             663:      6(int) Load 8(invocation)
+             664:     78(ptr) AccessChain 27(data) 39 39
+             665:   20(ivec4) Load 664
+             666:   77(ivec2) VectorShuffle 665 665 0 1
+             667:  185(bvec2) SLessThan 666 184
+             668:  185(bvec2) GroupNonUniformQuadSwap 35 667 61
+             669:   77(ivec2) Select 668 188 184
+             670:     71(ptr) AccessChain 27(data) 663 39 30
+             671:     19(int) CompositeExtract 669 0
+                              Store 670 671
+             672:     71(ptr) AccessChain 27(data) 663 39 34
+             673:     19(int) CompositeExtract 669 1
+                              Store 672 673
+             674:      6(int) Load 8(invocation)
+             675:     78(ptr) AccessChain 27(data) 39 39
+             676:   20(ivec4) Load 675
+             677:   88(ivec3) VectorShuffle 676 676 0 1 2
+             678:  199(bvec3) SLessThan 677 198
+             679:  199(bvec3) GroupNonUniformQuadSwap 35 678 61
+             680:   88(ivec3) Select 679 202 198
+             681:     71(ptr) AccessChain 27(data) 674 39 30
+             682:     19(int) CompositeExtract 680 0
+                              Store 681 682
+             683:     71(ptr) AccessChain 27(data) 674 39 34
+             684:     19(int) CompositeExtract 680 1
+                              Store 683 684
+             685:     71(ptr) AccessChain 27(data) 674 39 61
+             686:     19(int) CompositeExtract 680 2
+                              Store 685 686
+             687:      6(int) Load 8(invocation)
+             688:     78(ptr) AccessChain 27(data) 39 39
+             689:   20(ivec4) Load 688
+             690:  214(bvec4) SLessThan 689 213
+             691:  214(bvec4) GroupNonUniformQuadSwap 35 690 61
+             692:   20(ivec4) Select 691 217 213
+             693:     78(ptr) AccessChain 27(data) 687 39
+                              Store 693 692
                               Return
                               FunctionEnd
diff --git a/third_party/vulkan-deps/glslang/src/Test/baseResults/spv.subgroupShuffle.comp.out b/third_party/vulkan-deps/glslang/src/Test/baseResults/spv.subgroupShuffle.comp.out
index b160c5f..02cf89f 100644
--- a/third_party/vulkan-deps/glslang/src/Test/baseResults/spv.subgroupShuffle.comp.out
+++ b/third_party/vulkan-deps/glslang/src/Test/baseResults/spv.subgroupShuffle.comp.out
@@ -1,7 +1,7 @@
 spv.subgroupShuffle.comp
 // Module Version 10300
 // Generated by (magic number): 8000a
-// Id's are bound by 379
+// Id's are bound by 420
 
                               Capability Shader
                               Capability Float64
@@ -39,7 +39,7 @@
                               Decorate 24(Buffers) Block
                               Decorate 27(data) DescriptorSet 0
                               Decorate 27(data) Binding 0
-                              Decorate 378 BuiltIn WorkgroupSize
+                              Decorate 419 BuiltIn WorkgroupSize
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeInt 32 0
@@ -66,34 +66,35 @@
               39:     19(int) Constant 1
               40:             TypeVector 17(float) 2
               41:             TypePointer StorageBuffer 18(fvec4)
-              51:     19(int) Constant 2
-              52:             TypeVector 17(float) 3
-              62:     19(int) Constant 3
-              69:             TypePointer StorageBuffer 19(int)
-              76:             TypeVector 19(int) 2
-              77:             TypePointer StorageBuffer 20(ivec4)
-              87:             TypeVector 19(int) 3
-             103:             TypePointer StorageBuffer 6(int)
-             110:             TypeVector 6(int) 2
-             111:             TypePointer StorageBuffer 21(ivec4)
-             121:             TypeVector 6(int) 3
-             137:             TypePointer StorageBuffer 22(float64_t)
-             144:             TypeVector 22(float64_t) 2
-             145:             TypePointer StorageBuffer 23(f64vec4)
-             155:             TypeVector 22(float64_t) 3
-             173:             TypeBool
-             183:   76(ivec2) ConstantComposite 29 29
-             184:             TypeVector 173(bool) 2
-             188:   76(ivec2) ConstantComposite 39 39
-             197:   87(ivec3) ConstantComposite 29 29 29
-             198:             TypeVector 173(bool) 3
-             202:   87(ivec3) ConstantComposite 39 39 39
-             210:   20(ivec4) ConstantComposite 29 29 29 29
-             211:             TypeVector 173(bool) 4
-             215:   20(ivec4) ConstantComposite 39 39 39 39
-             376:      6(int) Constant 8
-             377:      6(int) Constant 1
-             378:  121(ivec3) ConstantComposite 376 376 377
+              49:      6(int) Constant 1
+              53:     19(int) Constant 2
+              54:             TypeVector 17(float) 3
+              64:      6(int) Constant 2
+              68:     19(int) Constant 3
+              75:             TypePointer StorageBuffer 19(int)
+              82:             TypeVector 19(int) 2
+              83:             TypePointer StorageBuffer 20(ivec4)
+              94:             TypeVector 19(int) 3
+             113:             TypePointer StorageBuffer 6(int)
+             120:             TypeVector 6(int) 2
+             121:             TypePointer StorageBuffer 21(ivec4)
+             132:             TypeVector 6(int) 3
+             151:             TypePointer StorageBuffer 22(float64_t)
+             158:             TypeVector 22(float64_t) 2
+             159:             TypePointer StorageBuffer 23(f64vec4)
+             170:             TypeVector 22(float64_t) 3
+             191:             TypeBool
+             201:   82(ivec2) ConstantComposite 29 29
+             202:             TypeVector 191(bool) 2
+             206:   82(ivec2) ConstantComposite 39 39
+             216:   94(ivec3) ConstantComposite 29 29 29
+             217:             TypeVector 191(bool) 3
+             221:   94(ivec3) ConstantComposite 39 39 39
+             232:   20(ivec4) ConstantComposite 29 29 29 29
+             233:             TypeVector 191(bool) 4
+             237:   20(ivec4) ConstantComposite 39 39 39 39
+             418:      6(int) Constant 8
+             419:  132(ivec3) ConstantComposite 418 418 49
          4(main):           2 Function None 3
                5:             Label
    8(invocation):      7(ptr) Variable Function
@@ -115,348 +116,418 @@
               44:   40(fvec2) VectorShuffle 43 43 0 1
               45:      6(int) Load 8(invocation)
               46:   40(fvec2) GroupNonUniformShuffle 35 44 45
-              47:     41(ptr) AccessChain 27(data) 38 29
-              48:   18(fvec4) Load 47
-              49:   18(fvec4) VectorShuffle 48 46 4 5 2 3
-                              Store 47 49
-              50:      6(int) Load 8(invocation)
-              53:     41(ptr) AccessChain 27(data) 51 29
-              54:   18(fvec4) Load 53
-              55:   52(fvec3) VectorShuffle 54 54 0 1 2
-              56:      6(int) Load 8(invocation)
-              57:   52(fvec3) GroupNonUniformShuffle 35 55 56
-              58:     41(ptr) AccessChain 27(data) 50 29
-              59:   18(fvec4) Load 58
-              60:   18(fvec4) VectorShuffle 59 57 4 5 6 3
-                              Store 58 60
-              61:      6(int) Load 8(invocation)
-              63:     41(ptr) AccessChain 27(data) 62 29
-              64:   18(fvec4) Load 63
-              65:      6(int) Load 8(invocation)
-              66:   18(fvec4) GroupNonUniformShuffle 35 64 65
-              67:     41(ptr) AccessChain 27(data) 61 29
-                              Store 67 66
-              68:      6(int) Load 8(invocation)
-              70:     69(ptr) AccessChain 27(data) 29 39 30
-              71:     19(int) Load 70
-              72:      6(int) Load 8(invocation)
-              73:     19(int) GroupNonUniformShuffle 35 71 72
-              74:     69(ptr) AccessChain 27(data) 68 39 30
-                              Store 74 73
-              75:      6(int) Load 8(invocation)
-              78:     77(ptr) AccessChain 27(data) 39 39
-              79:   20(ivec4) Load 78
-              80:   76(ivec2) VectorShuffle 79 79 0 1
+              47:     31(ptr) AccessChain 27(data) 38 29 30
+              48:   17(float) CompositeExtract 46 0
+                              Store 47 48
+              50:     31(ptr) AccessChain 27(data) 38 29 49
+              51:   17(float) CompositeExtract 46 1
+                              Store 50 51
+              52:      6(int) Load 8(invocation)
+              55:     41(ptr) AccessChain 27(data) 53 29
+              56:   18(fvec4) Load 55
+              57:   54(fvec3) VectorShuffle 56 56 0 1 2
+              58:      6(int) Load 8(invocation)
+              59:   54(fvec3) GroupNonUniformShuffle 35 57 58
+              60:     31(ptr) AccessChain 27(data) 52 29 30
+              61:   17(float) CompositeExtract 59 0
+                              Store 60 61
+              62:     31(ptr) AccessChain 27(data) 52 29 49
+              63:   17(float) CompositeExtract 59 1
+                              Store 62 63
+              65:     31(ptr) AccessChain 27(data) 52 29 64
+              66:   17(float) CompositeExtract 59 2
+                              Store 65 66
+              67:      6(int) Load 8(invocation)
+              69:     41(ptr) AccessChain 27(data) 68 29
+              70:   18(fvec4) Load 69
+              71:      6(int) Load 8(invocation)
+              72:   18(fvec4) GroupNonUniformShuffle 35 70 71
+              73:     41(ptr) AccessChain 27(data) 67 29
+                              Store 73 72
+              74:      6(int) Load 8(invocation)
+              76:     75(ptr) AccessChain 27(data) 29 39 30
+              77:     19(int) Load 76
+              78:      6(int) Load 8(invocation)
+              79:     19(int) GroupNonUniformShuffle 35 77 78
+              80:     75(ptr) AccessChain 27(data) 74 39 30
+                              Store 80 79
               81:      6(int) Load 8(invocation)
-              82:   76(ivec2) GroupNonUniformShuffle 35 80 81
-              83:     77(ptr) AccessChain 27(data) 75 39
-              84:   20(ivec4) Load 83
-              85:   20(ivec4) VectorShuffle 84 82 4 5 2 3
-                              Store 83 85
-              86:      6(int) Load 8(invocation)
-              88:     77(ptr) AccessChain 27(data) 51 39
-              89:   20(ivec4) Load 88
-              90:   87(ivec3) VectorShuffle 89 89 0 1 2
-              91:      6(int) Load 8(invocation)
-              92:   87(ivec3) GroupNonUniformShuffle 35 90 91
-              93:     77(ptr) AccessChain 27(data) 86 39
-              94:   20(ivec4) Load 93
-              95:   20(ivec4) VectorShuffle 94 92 4 5 6 3
-                              Store 93 95
-              96:      6(int) Load 8(invocation)
-              97:     77(ptr) AccessChain 27(data) 62 39
-              98:   20(ivec4) Load 97
-              99:      6(int) Load 8(invocation)
-             100:   20(ivec4) GroupNonUniformShuffle 35 98 99
-             101:     77(ptr) AccessChain 27(data) 96 39
-                              Store 101 100
-             102:      6(int) Load 8(invocation)
-             104:    103(ptr) AccessChain 27(data) 29 51 30
-             105:      6(int) Load 104
+              84:     83(ptr) AccessChain 27(data) 39 39
+              85:   20(ivec4) Load 84
+              86:   82(ivec2) VectorShuffle 85 85 0 1
+              87:      6(int) Load 8(invocation)
+              88:   82(ivec2) GroupNonUniformShuffle 35 86 87
+              89:     75(ptr) AccessChain 27(data) 81 39 30
+              90:     19(int) CompositeExtract 88 0
+                              Store 89 90
+              91:     75(ptr) AccessChain 27(data) 81 39 49
+              92:     19(int) CompositeExtract 88 1
+                              Store 91 92
+              93:      6(int) Load 8(invocation)
+              95:     83(ptr) AccessChain 27(data) 53 39
+              96:   20(ivec4) Load 95
+              97:   94(ivec3) VectorShuffle 96 96 0 1 2
+              98:      6(int) Load 8(invocation)
+              99:   94(ivec3) GroupNonUniformShuffle 35 97 98
+             100:     75(ptr) AccessChain 27(data) 93 39 30
+             101:     19(int) CompositeExtract 99 0
+                              Store 100 101
+             102:     75(ptr) AccessChain 27(data) 93 39 49
+             103:     19(int) CompositeExtract 99 1
+                              Store 102 103
+             104:     75(ptr) AccessChain 27(data) 93 39 64
+             105:     19(int) CompositeExtract 99 2
+                              Store 104 105
              106:      6(int) Load 8(invocation)
-             107:      6(int) GroupNonUniformShuffle 35 105 106
-             108:    103(ptr) AccessChain 27(data) 102 51 30
-                              Store 108 107
+             107:     83(ptr) AccessChain 27(data) 68 39
+             108:   20(ivec4) Load 107
              109:      6(int) Load 8(invocation)
-             112:    111(ptr) AccessChain 27(data) 39 51
-             113:   21(ivec4) Load 112
-             114:  110(ivec2) VectorShuffle 113 113 0 1
-             115:      6(int) Load 8(invocation)
-             116:  110(ivec2) GroupNonUniformShuffle 35 114 115
-             117:    111(ptr) AccessChain 27(data) 109 51
-             118:   21(ivec4) Load 117
-             119:   21(ivec4) VectorShuffle 118 116 4 5 2 3
-                              Store 117 119
-             120:      6(int) Load 8(invocation)
-             122:    111(ptr) AccessChain 27(data) 51 51
+             110:   20(ivec4) GroupNonUniformShuffle 35 108 109
+             111:     83(ptr) AccessChain 27(data) 106 39
+                              Store 111 110
+             112:      6(int) Load 8(invocation)
+             114:    113(ptr) AccessChain 27(data) 29 53 30
+             115:      6(int) Load 114
+             116:      6(int) Load 8(invocation)
+             117:      6(int) GroupNonUniformShuffle 35 115 116
+             118:    113(ptr) AccessChain 27(data) 112 53 30
+                              Store 118 117
+             119:      6(int) Load 8(invocation)
+             122:    121(ptr) AccessChain 27(data) 39 53
              123:   21(ivec4) Load 122
-             124:  121(ivec3) VectorShuffle 123 123 0 1 2
+             124:  120(ivec2) VectorShuffle 123 123 0 1
              125:      6(int) Load 8(invocation)
-             126:  121(ivec3) GroupNonUniformShuffle 35 124 125
-             127:    111(ptr) AccessChain 27(data) 120 51
-             128:   21(ivec4) Load 127
-             129:   21(ivec4) VectorShuffle 128 126 4 5 6 3
-                              Store 127 129
-             130:      6(int) Load 8(invocation)
-             131:    111(ptr) AccessChain 27(data) 62 51
-             132:   21(ivec4) Load 131
-             133:      6(int) Load 8(invocation)
-             134:   21(ivec4) GroupNonUniformShuffle 35 132 133
-             135:    111(ptr) AccessChain 27(data) 130 51
-                              Store 135 134
+             126:  120(ivec2) GroupNonUniformShuffle 35 124 125
+             127:    113(ptr) AccessChain 27(data) 119 53 30
+             128:      6(int) CompositeExtract 126 0
+                              Store 127 128
+             129:    113(ptr) AccessChain 27(data) 119 53 49
+             130:      6(int) CompositeExtract 126 1
+                              Store 129 130
+             131:      6(int) Load 8(invocation)
+             133:    121(ptr) AccessChain 27(data) 53 53
+             134:   21(ivec4) Load 133
+             135:  132(ivec3) VectorShuffle 134 134 0 1 2
              136:      6(int) Load 8(invocation)
-             138:    137(ptr) AccessChain 27(data) 29 62 30
-             139:22(float64_t) Load 138
-             140:      6(int) Load 8(invocation)
-             141:22(float64_t) GroupNonUniformShuffle 35 139 140
-             142:    137(ptr) AccessChain 27(data) 136 62 30
-                              Store 142 141
-             143:      6(int) Load 8(invocation)
-             146:    145(ptr) AccessChain 27(data) 39 62
-             147: 23(f64vec4) Load 146
-             148:144(f64vec2) VectorShuffle 147 147 0 1
-             149:      6(int) Load 8(invocation)
-             150:144(f64vec2) GroupNonUniformShuffle 35 148 149
-             151:    145(ptr) AccessChain 27(data) 143 62
-             152: 23(f64vec4) Load 151
-             153: 23(f64vec4) VectorShuffle 152 150 4 5 2 3
-                              Store 151 153
+             137:  132(ivec3) GroupNonUniformShuffle 35 135 136
+             138:    113(ptr) AccessChain 27(data) 131 53 30
+             139:      6(int) CompositeExtract 137 0
+                              Store 138 139
+             140:    113(ptr) AccessChain 27(data) 131 53 49
+             141:      6(int) CompositeExtract 137 1
+                              Store 140 141
+             142:    113(ptr) AccessChain 27(data) 131 53 64
+             143:      6(int) CompositeExtract 137 2
+                              Store 142 143
+             144:      6(int) Load 8(invocation)
+             145:    121(ptr) AccessChain 27(data) 68 53
+             146:   21(ivec4) Load 145
+             147:      6(int) Load 8(invocation)
+             148:   21(ivec4) GroupNonUniformShuffle 35 146 147
+             149:    121(ptr) AccessChain 27(data) 144 53
+                              Store 149 148
+             150:      6(int) Load 8(invocation)
+             152:    151(ptr) AccessChain 27(data) 29 68 30
+             153:22(float64_t) Load 152
              154:      6(int) Load 8(invocation)
-             156:    145(ptr) AccessChain 27(data) 51 62
-             157: 23(f64vec4) Load 156
-             158:155(f64vec3) VectorShuffle 157 157 0 1 2
-             159:      6(int) Load 8(invocation)
-             160:155(f64vec3) GroupNonUniformShuffle 35 158 159
-             161:    145(ptr) AccessChain 27(data) 154 62
-             162: 23(f64vec4) Load 161
-             163: 23(f64vec4) VectorShuffle 162 160 4 5 6 3
-                              Store 161 163
-             164:      6(int) Load 8(invocation)
-             165:    145(ptr) AccessChain 27(data) 62 62
-             166: 23(f64vec4) Load 165
-             167:      6(int) Load 8(invocation)
-             168: 23(f64vec4) GroupNonUniformShuffle 35 166 167
-             169:    145(ptr) AccessChain 27(data) 164 62
-                              Store 169 168
-             170:      6(int) Load 8(invocation)
-             171:     69(ptr) AccessChain 27(data) 29 39 30
-             172:     19(int) Load 171
-             174:   173(bool) SLessThan 172 29
-             175:      6(int) Load 8(invocation)
-             176:   173(bool) GroupNonUniformShuffle 35 174 175
-             177:     19(int) Select 176 39 29
-             178:     69(ptr) AccessChain 27(data) 170 39 30
-                              Store 178 177
-             179:      6(int) Load 8(invocation)
-             180:     77(ptr) AccessChain 27(data) 39 39
-             181:   20(ivec4) Load 180
-             182:   76(ivec2) VectorShuffle 181 181 0 1
-             185:  184(bvec2) SLessThan 182 183
-             186:      6(int) Load 8(invocation)
-             187:  184(bvec2) GroupNonUniformShuffle 35 185 186
-             189:   76(ivec2) Select 187 188 183
-             190:     77(ptr) AccessChain 27(data) 179 39
-             191:   20(ivec4) Load 190
-             192:   20(ivec4) VectorShuffle 191 189 4 5 2 3
-                              Store 190 192
+             155:22(float64_t) GroupNonUniformShuffle 35 153 154
+             156:    151(ptr) AccessChain 27(data) 150 68 30
+                              Store 156 155
+             157:      6(int) Load 8(invocation)
+             160:    159(ptr) AccessChain 27(data) 39 68
+             161: 23(f64vec4) Load 160
+             162:158(f64vec2) VectorShuffle 161 161 0 1
+             163:      6(int) Load 8(invocation)
+             164:158(f64vec2) GroupNonUniformShuffle 35 162 163
+             165:    151(ptr) AccessChain 27(data) 157 68 30
+             166:22(float64_t) CompositeExtract 164 0
+                              Store 165 166
+             167:    151(ptr) AccessChain 27(data) 157 68 49
+             168:22(float64_t) CompositeExtract 164 1
+                              Store 167 168
+             169:      6(int) Load 8(invocation)
+             171:    159(ptr) AccessChain 27(data) 53 68
+             172: 23(f64vec4) Load 171
+             173:170(f64vec3) VectorShuffle 172 172 0 1 2
+             174:      6(int) Load 8(invocation)
+             175:170(f64vec3) GroupNonUniformShuffle 35 173 174
+             176:    151(ptr) AccessChain 27(data) 169 68 30
+             177:22(float64_t) CompositeExtract 175 0
+                              Store 176 177
+             178:    151(ptr) AccessChain 27(data) 169 68 49
+             179:22(float64_t) CompositeExtract 175 1
+                              Store 178 179
+             180:    151(ptr) AccessChain 27(data) 169 68 64
+             181:22(float64_t) CompositeExtract 175 2
+                              Store 180 181
+             182:      6(int) Load 8(invocation)
+             183:    159(ptr) AccessChain 27(data) 68 68
+             184: 23(f64vec4) Load 183
+             185:      6(int) Load 8(invocation)
+             186: 23(f64vec4) GroupNonUniformShuffle 35 184 185
+             187:    159(ptr) AccessChain 27(data) 182 68
+                              Store 187 186
+             188:      6(int) Load 8(invocation)
+             189:     75(ptr) AccessChain 27(data) 29 39 30
+             190:     19(int) Load 189
+             192:   191(bool) SLessThan 190 29
              193:      6(int) Load 8(invocation)
-             194:     77(ptr) AccessChain 27(data) 39 39
-             195:   20(ivec4) Load 194
-             196:   87(ivec3) VectorShuffle 195 195 0 1 2
-             199:  198(bvec3) SLessThan 196 197
-             200:      6(int) Load 8(invocation)
-             201:  198(bvec3) GroupNonUniformShuffle 35 199 200
-             203:   87(ivec3) Select 201 202 197
-             204:     77(ptr) AccessChain 27(data) 193 39
-             205:   20(ivec4) Load 204
-             206:   20(ivec4) VectorShuffle 205 203 4 5 6 3
-                              Store 204 206
-             207:      6(int) Load 8(invocation)
-             208:     77(ptr) AccessChain 27(data) 39 39
-             209:   20(ivec4) Load 208
-             212:  211(bvec4) SLessThan 209 210
-             213:      6(int) Load 8(invocation)
-             214:  211(bvec4) GroupNonUniformShuffle 35 212 213
-             216:   20(ivec4) Select 214 215 210
-             217:     77(ptr) AccessChain 27(data) 207 39
-                              Store 217 216
-             218:      6(int) Load 8(invocation)
-             219:     31(ptr) AccessChain 27(data) 29 29 30
-             220:   17(float) Load 219
-             221:      6(int) Load 8(invocation)
-             222:   17(float) GroupNonUniformShuffleXor 35 220 221
-             223:     31(ptr) AccessChain 27(data) 218 29 30
-                              Store 223 222
-             224:      6(int) Load 8(invocation)
-             225:     41(ptr) AccessChain 27(data) 39 29
-             226:   18(fvec4) Load 225
-             227:   40(fvec2) VectorShuffle 226 226 0 1
-             228:      6(int) Load 8(invocation)
-             229:   40(fvec2) GroupNonUniformShuffleXor 35 227 228
-             230:     41(ptr) AccessChain 27(data) 224 29
-             231:   18(fvec4) Load 230
-             232:   18(fvec4) VectorShuffle 231 229 4 5 2 3
-                              Store 230 232
-             233:      6(int) Load 8(invocation)
-             234:     41(ptr) AccessChain 27(data) 51 29
-             235:   18(fvec4) Load 234
-             236:   52(fvec3) VectorShuffle 235 235 0 1 2
-             237:      6(int) Load 8(invocation)
-             238:   52(fvec3) GroupNonUniformShuffleXor 35 236 237
-             239:     41(ptr) AccessChain 27(data) 233 29
-             240:   18(fvec4) Load 239
-             241:   18(fvec4) VectorShuffle 240 238 4 5 6 3
-                              Store 239 241
-             242:      6(int) Load 8(invocation)
-             243:     41(ptr) AccessChain 27(data) 62 29
-             244:   18(fvec4) Load 243
-             245:      6(int) Load 8(invocation)
-             246:   18(fvec4) GroupNonUniformShuffleXor 35 244 245
-             247:     41(ptr) AccessChain 27(data) 242 29
-                              Store 247 246
-             248:      6(int) Load 8(invocation)
-             249:     69(ptr) AccessChain 27(data) 29 39 30
-             250:     19(int) Load 249
-             251:      6(int) Load 8(invocation)
-             252:     19(int) GroupNonUniformShuffleXor 35 250 251
-             253:     69(ptr) AccessChain 27(data) 248 39 30
-                              Store 253 252
-             254:      6(int) Load 8(invocation)
-             255:     77(ptr) AccessChain 27(data) 39 39
-             256:   20(ivec4) Load 255
-             257:   76(ivec2) VectorShuffle 256 256 0 1
-             258:      6(int) Load 8(invocation)
-             259:   76(ivec2) GroupNonUniformShuffleXor 35 257 258
-             260:     77(ptr) AccessChain 27(data) 254 39
-             261:   20(ivec4) Load 260
-             262:   20(ivec4) VectorShuffle 261 259 4 5 2 3
-                              Store 260 262
-             263:      6(int) Load 8(invocation)
-             264:     77(ptr) AccessChain 27(data) 51 39
-             265:   20(ivec4) Load 264
-             266:   87(ivec3) VectorShuffle 265 265 0 1 2
-             267:      6(int) Load 8(invocation)
-             268:   87(ivec3) GroupNonUniformShuffleXor 35 266 267
-             269:     77(ptr) AccessChain 27(data) 263 39
-             270:   20(ivec4) Load 269
-             271:   20(ivec4) VectorShuffle 270 268 4 5 6 3
-                              Store 269 271
-             272:      6(int) Load 8(invocation)
-             273:     77(ptr) AccessChain 27(data) 62 39
-             274:   20(ivec4) Load 273
-             275:      6(int) Load 8(invocation)
-             276:   20(ivec4) GroupNonUniformShuffleXor 35 274 275
-             277:     77(ptr) AccessChain 27(data) 272 39
-                              Store 277 276
-             278:      6(int) Load 8(invocation)
-             279:    103(ptr) AccessChain 27(data) 29 51 30
-             280:      6(int) Load 279
-             281:      6(int) Load 8(invocation)
-             282:      6(int) GroupNonUniformShuffleXor 35 280 281
-             283:    103(ptr) AccessChain 27(data) 278 51 30
-                              Store 283 282
+             194:   191(bool) GroupNonUniformShuffle 35 192 193
+             195:     19(int) Select 194 39 29
+             196:     75(ptr) AccessChain 27(data) 188 39 30
+                              Store 196 195
+             197:      6(int) Load 8(invocation)
+             198:     83(ptr) AccessChain 27(data) 39 39
+             199:   20(ivec4) Load 198
+             200:   82(ivec2) VectorShuffle 199 199 0 1
+             203:  202(bvec2) SLessThan 200 201
+             204:      6(int) Load 8(invocation)
+             205:  202(bvec2) GroupNonUniformShuffle 35 203 204
+             207:   82(ivec2) Select 205 206 201
+             208:     75(ptr) AccessChain 27(data) 197 39 30
+             209:     19(int) CompositeExtract 207 0
+                              Store 208 209
+             210:     75(ptr) AccessChain 27(data) 197 39 49
+             211:     19(int) CompositeExtract 207 1
+                              Store 210 211
+             212:      6(int) Load 8(invocation)
+             213:     83(ptr) AccessChain 27(data) 39 39
+             214:   20(ivec4) Load 213
+             215:   94(ivec3) VectorShuffle 214 214 0 1 2
+             218:  217(bvec3) SLessThan 215 216
+             219:      6(int) Load 8(invocation)
+             220:  217(bvec3) GroupNonUniformShuffle 35 218 219
+             222:   94(ivec3) Select 220 221 216
+             223:     75(ptr) AccessChain 27(data) 212 39 30
+             224:     19(int) CompositeExtract 222 0
+                              Store 223 224
+             225:     75(ptr) AccessChain 27(data) 212 39 49
+             226:     19(int) CompositeExtract 222 1
+                              Store 225 226
+             227:     75(ptr) AccessChain 27(data) 212 39 64
+             228:     19(int) CompositeExtract 222 2
+                              Store 227 228
+             229:      6(int) Load 8(invocation)
+             230:     83(ptr) AccessChain 27(data) 39 39
+             231:   20(ivec4) Load 230
+             234:  233(bvec4) SLessThan 231 232
+             235:      6(int) Load 8(invocation)
+             236:  233(bvec4) GroupNonUniformShuffle 35 234 235
+             238:   20(ivec4) Select 236 237 232
+             239:     83(ptr) AccessChain 27(data) 229 39
+                              Store 239 238
+             240:      6(int) Load 8(invocation)
+             241:     31(ptr) AccessChain 27(data) 29 29 30
+             242:   17(float) Load 241
+             243:      6(int) Load 8(invocation)
+             244:   17(float) GroupNonUniformShuffleXor 35 242 243
+             245:     31(ptr) AccessChain 27(data) 240 29 30
+                              Store 245 244
+             246:      6(int) Load 8(invocation)
+             247:     41(ptr) AccessChain 27(data) 39 29
+             248:   18(fvec4) Load 247
+             249:   40(fvec2) VectorShuffle 248 248 0 1
+             250:      6(int) Load 8(invocation)
+             251:   40(fvec2) GroupNonUniformShuffleXor 35 249 250
+             252:     31(ptr) AccessChain 27(data) 246 29 30
+             253:   17(float) CompositeExtract 251 0
+                              Store 252 253
+             254:     31(ptr) AccessChain 27(data) 246 29 49
+             255:   17(float) CompositeExtract 251 1
+                              Store 254 255
+             256:      6(int) Load 8(invocation)
+             257:     41(ptr) AccessChain 27(data) 53 29
+             258:   18(fvec4) Load 257
+             259:   54(fvec3) VectorShuffle 258 258 0 1 2
+             260:      6(int) Load 8(invocation)
+             261:   54(fvec3) GroupNonUniformShuffleXor 35 259 260
+             262:     31(ptr) AccessChain 27(data) 256 29 30
+             263:   17(float) CompositeExtract 261 0
+                              Store 262 263
+             264:     31(ptr) AccessChain 27(data) 256 29 49
+             265:   17(float) CompositeExtract 261 1
+                              Store 264 265
+             266:     31(ptr) AccessChain 27(data) 256 29 64
+             267:   17(float) CompositeExtract 261 2
+                              Store 266 267
+             268:      6(int) Load 8(invocation)
+             269:     41(ptr) AccessChain 27(data) 68 29
+             270:   18(fvec4) Load 269
+             271:      6(int) Load 8(invocation)
+             272:   18(fvec4) GroupNonUniformShuffleXor 35 270 271
+             273:     41(ptr) AccessChain 27(data) 268 29
+                              Store 273 272
+             274:      6(int) Load 8(invocation)
+             275:     75(ptr) AccessChain 27(data) 29 39 30
+             276:     19(int) Load 275
+             277:      6(int) Load 8(invocation)
+             278:     19(int) GroupNonUniformShuffleXor 35 276 277
+             279:     75(ptr) AccessChain 27(data) 274 39 30
+                              Store 279 278
+             280:      6(int) Load 8(invocation)
+             281:     83(ptr) AccessChain 27(data) 39 39
+             282:   20(ivec4) Load 281
+             283:   82(ivec2) VectorShuffle 282 282 0 1
              284:      6(int) Load 8(invocation)
-             285:    111(ptr) AccessChain 27(data) 39 51
-             286:   21(ivec4) Load 285
-             287:  110(ivec2) VectorShuffle 286 286 0 1
-             288:      6(int) Load 8(invocation)
-             289:  110(ivec2) GroupNonUniformShuffleXor 35 287 288
-             290:    111(ptr) AccessChain 27(data) 284 51
-             291:   21(ivec4) Load 290
-             292:   21(ivec4) VectorShuffle 291 289 4 5 2 3
-                              Store 290 292
-             293:      6(int) Load 8(invocation)
-             294:    111(ptr) AccessChain 27(data) 51 51
-             295:   21(ivec4) Load 294
-             296:  121(ivec3) VectorShuffle 295 295 0 1 2
-             297:      6(int) Load 8(invocation)
-             298:  121(ivec3) GroupNonUniformShuffleXor 35 296 297
-             299:    111(ptr) AccessChain 27(data) 293 51
-             300:   21(ivec4) Load 299
-             301:   21(ivec4) VectorShuffle 300 298 4 5 6 3
-                              Store 299 301
+             285:   82(ivec2) GroupNonUniformShuffleXor 35 283 284
+             286:     75(ptr) AccessChain 27(data) 280 39 30
+             287:     19(int) CompositeExtract 285 0
+                              Store 286 287
+             288:     75(ptr) AccessChain 27(data) 280 39 49
+             289:     19(int) CompositeExtract 285 1
+                              Store 288 289
+             290:      6(int) Load 8(invocation)
+             291:     83(ptr) AccessChain 27(data) 53 39
+             292:   20(ivec4) Load 291
+             293:   94(ivec3) VectorShuffle 292 292 0 1 2
+             294:      6(int) Load 8(invocation)
+             295:   94(ivec3) GroupNonUniformShuffleXor 35 293 294
+             296:     75(ptr) AccessChain 27(data) 290 39 30
+             297:     19(int) CompositeExtract 295 0
+                              Store 296 297
+             298:     75(ptr) AccessChain 27(data) 290 39 49
+             299:     19(int) CompositeExtract 295 1
+                              Store 298 299
+             300:     75(ptr) AccessChain 27(data) 290 39 64
+             301:     19(int) CompositeExtract 295 2
+                              Store 300 301
              302:      6(int) Load 8(invocation)
-             303:    111(ptr) AccessChain 27(data) 62 51
-             304:   21(ivec4) Load 303
+             303:     83(ptr) AccessChain 27(data) 68 39
+             304:   20(ivec4) Load 303
              305:      6(int) Load 8(invocation)
-             306:   21(ivec4) GroupNonUniformShuffleXor 35 304 305
-             307:    111(ptr) AccessChain 27(data) 302 51
+             306:   20(ivec4) GroupNonUniformShuffleXor 35 304 305
+             307:     83(ptr) AccessChain 27(data) 302 39
                               Store 307 306
              308:      6(int) Load 8(invocation)
-             309:    137(ptr) AccessChain 27(data) 29 62 30
-             310:22(float64_t) Load 309
+             309:    113(ptr) AccessChain 27(data) 29 53 30
+             310:      6(int) Load 309
              311:      6(int) Load 8(invocation)
-             312:22(float64_t) GroupNonUniformShuffleXor 35 310 311
-             313:    137(ptr) AccessChain 27(data) 308 62 30
+             312:      6(int) GroupNonUniformShuffleXor 35 310 311
+             313:    113(ptr) AccessChain 27(data) 308 53 30
                               Store 313 312
              314:      6(int) Load 8(invocation)
-             315:    145(ptr) AccessChain 27(data) 39 62
-             316: 23(f64vec4) Load 315
-             317:144(f64vec2) VectorShuffle 316 316 0 1
+             315:    121(ptr) AccessChain 27(data) 39 53
+             316:   21(ivec4) Load 315
+             317:  120(ivec2) VectorShuffle 316 316 0 1
              318:      6(int) Load 8(invocation)
-             319:144(f64vec2) GroupNonUniformShuffleXor 35 317 318
-             320:    145(ptr) AccessChain 27(data) 314 62
-             321: 23(f64vec4) Load 320
-             322: 23(f64vec4) VectorShuffle 321 319 4 5 2 3
-                              Store 320 322
-             323:      6(int) Load 8(invocation)
-             324:    145(ptr) AccessChain 27(data) 51 62
-             325: 23(f64vec4) Load 324
-             326:155(f64vec3) VectorShuffle 325 325 0 1 2
-             327:      6(int) Load 8(invocation)
-             328:155(f64vec3) GroupNonUniformShuffleXor 35 326 327
-             329:    145(ptr) AccessChain 27(data) 323 62
-             330: 23(f64vec4) Load 329
-             331: 23(f64vec4) VectorShuffle 330 328 4 5 6 3
-                              Store 329 331
-             332:      6(int) Load 8(invocation)
-             333:    145(ptr) AccessChain 27(data) 62 62
-             334: 23(f64vec4) Load 333
-             335:      6(int) Load 8(invocation)
-             336: 23(f64vec4) GroupNonUniformShuffleXor 35 334 335
-             337:    145(ptr) AccessChain 27(data) 332 62
-                              Store 337 336
-             338:      6(int) Load 8(invocation)
-             339:     69(ptr) AccessChain 27(data) 29 39 30
-             340:     19(int) Load 339
-             341:   173(bool) SLessThan 340 29
+             319:  120(ivec2) GroupNonUniformShuffleXor 35 317 318
+             320:    113(ptr) AccessChain 27(data) 314 53 30
+             321:      6(int) CompositeExtract 319 0
+                              Store 320 321
+             322:    113(ptr) AccessChain 27(data) 314 53 49
+             323:      6(int) CompositeExtract 319 1
+                              Store 322 323
+             324:      6(int) Load 8(invocation)
+             325:    121(ptr) AccessChain 27(data) 53 53
+             326:   21(ivec4) Load 325
+             327:  132(ivec3) VectorShuffle 326 326 0 1 2
+             328:      6(int) Load 8(invocation)
+             329:  132(ivec3) GroupNonUniformShuffleXor 35 327 328
+             330:    113(ptr) AccessChain 27(data) 324 53 30
+             331:      6(int) CompositeExtract 329 0
+                              Store 330 331
+             332:    113(ptr) AccessChain 27(data) 324 53 49
+             333:      6(int) CompositeExtract 329 1
+                              Store 332 333
+             334:    113(ptr) AccessChain 27(data) 324 53 64
+             335:      6(int) CompositeExtract 329 2
+                              Store 334 335
+             336:      6(int) Load 8(invocation)
+             337:    121(ptr) AccessChain 27(data) 68 53
+             338:   21(ivec4) Load 337
+             339:      6(int) Load 8(invocation)
+             340:   21(ivec4) GroupNonUniformShuffleXor 35 338 339
+             341:    121(ptr) AccessChain 27(data) 336 53
+                              Store 341 340
              342:      6(int) Load 8(invocation)
-             343:   173(bool) GroupNonUniformShuffleXor 35 341 342
-             344:     19(int) Select 343 39 29
-             345:     69(ptr) AccessChain 27(data) 338 39 30
-                              Store 345 344
-             346:      6(int) Load 8(invocation)
-             347:     77(ptr) AccessChain 27(data) 39 39
-             348:   20(ivec4) Load 347
-             349:   76(ivec2) VectorShuffle 348 348 0 1
-             350:  184(bvec2) SLessThan 349 183
-             351:      6(int) Load 8(invocation)
-             352:  184(bvec2) GroupNonUniformShuffleXor 35 350 351
-             353:   76(ivec2) Select 352 188 183
-             354:     77(ptr) AccessChain 27(data) 346 39
-             355:   20(ivec4) Load 354
-             356:   20(ivec4) VectorShuffle 355 353 4 5 2 3
-                              Store 354 356
-             357:      6(int) Load 8(invocation)
-             358:     77(ptr) AccessChain 27(data) 39 39
-             359:   20(ivec4) Load 358
-             360:   87(ivec3) VectorShuffle 359 359 0 1 2
-             361:  198(bvec3) SLessThan 360 197
+             343:    151(ptr) AccessChain 27(data) 29 68 30
+             344:22(float64_t) Load 343
+             345:      6(int) Load 8(invocation)
+             346:22(float64_t) GroupNonUniformShuffleXor 35 344 345
+             347:    151(ptr) AccessChain 27(data) 342 68 30
+                              Store 347 346
+             348:      6(int) Load 8(invocation)
+             349:    159(ptr) AccessChain 27(data) 39 68
+             350: 23(f64vec4) Load 349
+             351:158(f64vec2) VectorShuffle 350 350 0 1
+             352:      6(int) Load 8(invocation)
+             353:158(f64vec2) GroupNonUniformShuffleXor 35 351 352
+             354:    151(ptr) AccessChain 27(data) 348 68 30
+             355:22(float64_t) CompositeExtract 353 0
+                              Store 354 355
+             356:    151(ptr) AccessChain 27(data) 348 68 49
+             357:22(float64_t) CompositeExtract 353 1
+                              Store 356 357
+             358:      6(int) Load 8(invocation)
+             359:    159(ptr) AccessChain 27(data) 53 68
+             360: 23(f64vec4) Load 359
+             361:170(f64vec3) VectorShuffle 360 360 0 1 2
              362:      6(int) Load 8(invocation)
-             363:  198(bvec3) GroupNonUniformShuffleXor 35 361 362
-             364:   87(ivec3) Select 363 202 197
-             365:     77(ptr) AccessChain 27(data) 357 39
-             366:   20(ivec4) Load 365
-             367:   20(ivec4) VectorShuffle 366 364 4 5 6 3
-                              Store 365 367
-             368:      6(int) Load 8(invocation)
-             369:     77(ptr) AccessChain 27(data) 39 39
-             370:   20(ivec4) Load 369
-             371:  211(bvec4) SLessThan 370 210
-             372:      6(int) Load 8(invocation)
-             373:  211(bvec4) GroupNonUniformShuffleXor 35 371 372
-             374:   20(ivec4) Select 373 215 210
-             375:     77(ptr) AccessChain 27(data) 368 39
+             363:170(f64vec3) GroupNonUniformShuffleXor 35 361 362
+             364:    151(ptr) AccessChain 27(data) 358 68 30
+             365:22(float64_t) CompositeExtract 363 0
+                              Store 364 365
+             366:    151(ptr) AccessChain 27(data) 358 68 49
+             367:22(float64_t) CompositeExtract 363 1
+                              Store 366 367
+             368:    151(ptr) AccessChain 27(data) 358 68 64
+             369:22(float64_t) CompositeExtract 363 2
+                              Store 368 369
+             370:      6(int) Load 8(invocation)
+             371:    159(ptr) AccessChain 27(data) 68 68
+             372: 23(f64vec4) Load 371
+             373:      6(int) Load 8(invocation)
+             374: 23(f64vec4) GroupNonUniformShuffleXor 35 372 373
+             375:    159(ptr) AccessChain 27(data) 370 68
                               Store 375 374
+             376:      6(int) Load 8(invocation)
+             377:     75(ptr) AccessChain 27(data) 29 39 30
+             378:     19(int) Load 377
+             379:   191(bool) SLessThan 378 29
+             380:      6(int) Load 8(invocation)
+             381:   191(bool) GroupNonUniformShuffleXor 35 379 380
+             382:     19(int) Select 381 39 29
+             383:     75(ptr) AccessChain 27(data) 376 39 30
+                              Store 383 382
+             384:      6(int) Load 8(invocation)
+             385:     83(ptr) AccessChain 27(data) 39 39
+             386:   20(ivec4) Load 385
+             387:   82(ivec2) VectorShuffle 386 386 0 1
+             388:  202(bvec2) SLessThan 387 201
+             389:      6(int) Load 8(invocation)
+             390:  202(bvec2) GroupNonUniformShuffleXor 35 388 389
+             391:   82(ivec2) Select 390 206 201
+             392:     75(ptr) AccessChain 27(data) 384 39 30
+             393:     19(int) CompositeExtract 391 0
+                              Store 392 393
+             394:     75(ptr) AccessChain 27(data) 384 39 49
+             395:     19(int) CompositeExtract 391 1
+                              Store 394 395
+             396:      6(int) Load 8(invocation)
+             397:     83(ptr) AccessChain 27(data) 39 39
+             398:   20(ivec4) Load 397
+             399:   94(ivec3) VectorShuffle 398 398 0 1 2
+             400:  217(bvec3) SLessThan 399 216
+             401:      6(int) Load 8(invocation)
+             402:  217(bvec3) GroupNonUniformShuffleXor 35 400 401
+             403:   94(ivec3) Select 402 221 216
+             404:     75(ptr) AccessChain 27(data) 396 39 30
+             405:     19(int) CompositeExtract 403 0
+                              Store 404 405
+             406:     75(ptr) AccessChain 27(data) 396 39 49
+             407:     19(int) CompositeExtract 403 1
+                              Store 406 407
+             408:     75(ptr) AccessChain 27(data) 396 39 64
+             409:     19(int) CompositeExtract 403 2
+                              Store 408 409
+             410:      6(int) Load 8(invocation)
+             411:     83(ptr) AccessChain 27(data) 39 39
+             412:   20(ivec4) Load 411
+             413:  233(bvec4) SLessThan 412 232
+             414:      6(int) Load 8(invocation)
+             415:  233(bvec4) GroupNonUniformShuffleXor 35 413 414
+             416:   20(ivec4) Select 415 237 232
+             417:     83(ptr) AccessChain 27(data) 410 39
+                              Store 417 416
                               Return
                               FunctionEnd
diff --git a/third_party/vulkan-deps/glslang/src/Test/baseResults/spv.subgroupShuffleRelative.comp.out b/third_party/vulkan-deps/glslang/src/Test/baseResults/spv.subgroupShuffleRelative.comp.out
index 68cd101..e8486b6 100644
--- a/third_party/vulkan-deps/glslang/src/Test/baseResults/spv.subgroupShuffleRelative.comp.out
+++ b/third_party/vulkan-deps/glslang/src/Test/baseResults/spv.subgroupShuffleRelative.comp.out
@@ -1,7 +1,7 @@
 spv.subgroupShuffleRelative.comp
 // Module Version 10300
 // Generated by (magic number): 8000a
-// Id's are bound by 379
+// Id's are bound by 420
 
                               Capability Shader
                               Capability Float64
@@ -39,7 +39,7 @@
                               Decorate 24(Buffers) Block
                               Decorate 27(data) DescriptorSet 0
                               Decorate 27(data) Binding 0
-                              Decorate 378 BuiltIn WorkgroupSize
+                              Decorate 419 BuiltIn WorkgroupSize
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeInt 32 0
@@ -66,34 +66,35 @@
               39:     19(int) Constant 1
               40:             TypeVector 17(float) 2
               41:             TypePointer StorageBuffer 18(fvec4)
-              51:     19(int) Constant 2
-              52:             TypeVector 17(float) 3
-              62:     19(int) Constant 3
-              69:             TypePointer StorageBuffer 19(int)
-              76:             TypeVector 19(int) 2
-              77:             TypePointer StorageBuffer 20(ivec4)
-              87:             TypeVector 19(int) 3
-             103:             TypePointer StorageBuffer 6(int)
-             110:             TypeVector 6(int) 2
-             111:             TypePointer StorageBuffer 21(ivec4)
-             121:             TypeVector 6(int) 3
-             137:             TypePointer StorageBuffer 22(float64_t)
-             144:             TypeVector 22(float64_t) 2
-             145:             TypePointer StorageBuffer 23(f64vec4)
-             155:             TypeVector 22(float64_t) 3
-             173:             TypeBool
-             183:   76(ivec2) ConstantComposite 29 29
-             184:             TypeVector 173(bool) 2
-             188:   76(ivec2) ConstantComposite 39 39
-             197:   87(ivec3) ConstantComposite 29 29 29
-             198:             TypeVector 173(bool) 3
-             202:   87(ivec3) ConstantComposite 39 39 39
-             210:   20(ivec4) ConstantComposite 29 29 29 29
-             211:             TypeVector 173(bool) 4
-             215:   20(ivec4) ConstantComposite 39 39 39 39
-             376:      6(int) Constant 8
-             377:      6(int) Constant 1
-             378:  121(ivec3) ConstantComposite 376 376 377
+              49:      6(int) Constant 1
+              53:     19(int) Constant 2
+              54:             TypeVector 17(float) 3
+              64:      6(int) Constant 2
+              68:     19(int) Constant 3
+              75:             TypePointer StorageBuffer 19(int)
+              82:             TypeVector 19(int) 2
+              83:             TypePointer StorageBuffer 20(ivec4)
+              94:             TypeVector 19(int) 3
+             113:             TypePointer StorageBuffer 6(int)
+             120:             TypeVector 6(int) 2
+             121:             TypePointer StorageBuffer 21(ivec4)
+             132:             TypeVector 6(int) 3
+             151:             TypePointer StorageBuffer 22(float64_t)
+             158:             TypeVector 22(float64_t) 2
+             159:             TypePointer StorageBuffer 23(f64vec4)
+             170:             TypeVector 22(float64_t) 3
+             191:             TypeBool
+             201:   82(ivec2) ConstantComposite 29 29
+             202:             TypeVector 191(bool) 2
+             206:   82(ivec2) ConstantComposite 39 39
+             216:   94(ivec3) ConstantComposite 29 29 29
+             217:             TypeVector 191(bool) 3
+             221:   94(ivec3) ConstantComposite 39 39 39
+             232:   20(ivec4) ConstantComposite 29 29 29 29
+             233:             TypeVector 191(bool) 4
+             237:   20(ivec4) ConstantComposite 39 39 39 39
+             418:      6(int) Constant 8
+             419:  132(ivec3) ConstantComposite 418 418 49
          4(main):           2 Function None 3
                5:             Label
    8(invocation):      7(ptr) Variable Function
@@ -115,348 +116,418 @@
               44:   40(fvec2) VectorShuffle 43 43 0 1
               45:      6(int) Load 8(invocation)
               46:   40(fvec2) GroupNonUniformShuffleUp 35 44 45
-              47:     41(ptr) AccessChain 27(data) 38 29
-              48:   18(fvec4) Load 47
-              49:   18(fvec4) VectorShuffle 48 46 4 5 2 3
-                              Store 47 49
-              50:      6(int) Load 8(invocation)
-              53:     41(ptr) AccessChain 27(data) 51 29
-              54:   18(fvec4) Load 53
-              55:   52(fvec3) VectorShuffle 54 54 0 1 2
-              56:      6(int) Load 8(invocation)
-              57:   52(fvec3) GroupNonUniformShuffleUp 35 55 56
-              58:     41(ptr) AccessChain 27(data) 50 29
-              59:   18(fvec4) Load 58
-              60:   18(fvec4) VectorShuffle 59 57 4 5 6 3
-                              Store 58 60
-              61:      6(int) Load 8(invocation)
-              63:     41(ptr) AccessChain 27(data) 62 29
-              64:   18(fvec4) Load 63
-              65:      6(int) Load 8(invocation)
-              66:   18(fvec4) GroupNonUniformShuffleUp 35 64 65
-              67:     41(ptr) AccessChain 27(data) 61 29
-                              Store 67 66
-              68:      6(int) Load 8(invocation)
-              70:     69(ptr) AccessChain 27(data) 29 39 30
-              71:     19(int) Load 70
-              72:      6(int) Load 8(invocation)
-              73:     19(int) GroupNonUniformShuffleUp 35 71 72
-              74:     69(ptr) AccessChain 27(data) 68 39 30
-                              Store 74 73
-              75:      6(int) Load 8(invocation)
-              78:     77(ptr) AccessChain 27(data) 39 39
-              79:   20(ivec4) Load 78
-              80:   76(ivec2) VectorShuffle 79 79 0 1
+              47:     31(ptr) AccessChain 27(data) 38 29 30
+              48:   17(float) CompositeExtract 46 0
+                              Store 47 48
+              50:     31(ptr) AccessChain 27(data) 38 29 49
+              51:   17(float) CompositeExtract 46 1
+                              Store 50 51
+              52:      6(int) Load 8(invocation)
+              55:     41(ptr) AccessChain 27(data) 53 29
+              56:   18(fvec4) Load 55
+              57:   54(fvec3) VectorShuffle 56 56 0 1 2
+              58:      6(int) Load 8(invocation)
+              59:   54(fvec3) GroupNonUniformShuffleUp 35 57 58
+              60:     31(ptr) AccessChain 27(data) 52 29 30
+              61:   17(float) CompositeExtract 59 0
+                              Store 60 61
+              62:     31(ptr) AccessChain 27(data) 52 29 49
+              63:   17(float) CompositeExtract 59 1
+                              Store 62 63
+              65:     31(ptr) AccessChain 27(data) 52 29 64
+              66:   17(float) CompositeExtract 59 2
+                              Store 65 66
+              67:      6(int) Load 8(invocation)
+              69:     41(ptr) AccessChain 27(data) 68 29
+              70:   18(fvec4) Load 69
+              71:      6(int) Load 8(invocation)
+              72:   18(fvec4) GroupNonUniformShuffleUp 35 70 71
+              73:     41(ptr) AccessChain 27(data) 67 29
+                              Store 73 72
+              74:      6(int) Load 8(invocation)
+              76:     75(ptr) AccessChain 27(data) 29 39 30
+              77:     19(int) Load 76
+              78:      6(int) Load 8(invocation)
+              79:     19(int) GroupNonUniformShuffleUp 35 77 78
+              80:     75(ptr) AccessChain 27(data) 74 39 30
+                              Store 80 79
               81:      6(int) Load 8(invocation)
-              82:   76(ivec2) GroupNonUniformShuffleUp 35 80 81
-              83:     77(ptr) AccessChain 27(data) 75 39
-              84:   20(ivec4) Load 83
-              85:   20(ivec4) VectorShuffle 84 82 4 5 2 3
-                              Store 83 85
-              86:      6(int) Load 8(invocation)
-              88:     77(ptr) AccessChain 27(data) 51 39
-              89:   20(ivec4) Load 88
-              90:   87(ivec3) VectorShuffle 89 89 0 1 2
-              91:      6(int) Load 8(invocation)
-              92:   87(ivec3) GroupNonUniformShuffleUp 35 90 91
-              93:     77(ptr) AccessChain 27(data) 86 39
-              94:   20(ivec4) Load 93
-              95:   20(ivec4) VectorShuffle 94 92 4 5 6 3
-                              Store 93 95
-              96:      6(int) Load 8(invocation)
-              97:     77(ptr) AccessChain 27(data) 62 39
-              98:   20(ivec4) Load 97
-              99:      6(int) Load 8(invocation)
-             100:   20(ivec4) GroupNonUniformShuffleUp 35 98 99
-             101:     77(ptr) AccessChain 27(data) 96 39
-                              Store 101 100
-             102:      6(int) Load 8(invocation)
-             104:    103(ptr) AccessChain 27(data) 29 51 30
-             105:      6(int) Load 104
+              84:     83(ptr) AccessChain 27(data) 39 39
+              85:   20(ivec4) Load 84
+              86:   82(ivec2) VectorShuffle 85 85 0 1
+              87:      6(int) Load 8(invocation)
+              88:   82(ivec2) GroupNonUniformShuffleUp 35 86 87
+              89:     75(ptr) AccessChain 27(data) 81 39 30
+              90:     19(int) CompositeExtract 88 0
+                              Store 89 90
+              91:     75(ptr) AccessChain 27(data) 81 39 49
+              92:     19(int) CompositeExtract 88 1
+                              Store 91 92
+              93:      6(int) Load 8(invocation)
+              95:     83(ptr) AccessChain 27(data) 53 39
+              96:   20(ivec4) Load 95
+              97:   94(ivec3) VectorShuffle 96 96 0 1 2
+              98:      6(int) Load 8(invocation)
+              99:   94(ivec3) GroupNonUniformShuffleUp 35 97 98
+             100:     75(ptr) AccessChain 27(data) 93 39 30
+             101:     19(int) CompositeExtract 99 0
+                              Store 100 101
+             102:     75(ptr) AccessChain 27(data) 93 39 49
+             103:     19(int) CompositeExtract 99 1
+                              Store 102 103
+             104:     75(ptr) AccessChain 27(data) 93 39 64
+             105:     19(int) CompositeExtract 99 2
+                              Store 104 105
              106:      6(int) Load 8(invocation)
-             107:      6(int) GroupNonUniformShuffleUp 35 105 106
-             108:    103(ptr) AccessChain 27(data) 102 51 30
-                              Store 108 107
+             107:     83(ptr) AccessChain 27(data) 68 39
+             108:   20(ivec4) Load 107
              109:      6(int) Load 8(invocation)
-             112:    111(ptr) AccessChain 27(data) 39 51
-             113:   21(ivec4) Load 112
-             114:  110(ivec2) VectorShuffle 113 113 0 1
-             115:      6(int) Load 8(invocation)
-             116:  110(ivec2) GroupNonUniformShuffleUp 35 114 115
-             117:    111(ptr) AccessChain 27(data) 109 51
-             118:   21(ivec4) Load 117
-             119:   21(ivec4) VectorShuffle 118 116 4 5 2 3
-                              Store 117 119
-             120:      6(int) Load 8(invocation)
-             122:    111(ptr) AccessChain 27(data) 51 51
+             110:   20(ivec4) GroupNonUniformShuffleUp 35 108 109
+             111:     83(ptr) AccessChain 27(data) 106 39
+                              Store 111 110
+             112:      6(int) Load 8(invocation)
+             114:    113(ptr) AccessChain 27(data) 29 53 30
+             115:      6(int) Load 114
+             116:      6(int) Load 8(invocation)
+             117:      6(int) GroupNonUniformShuffleUp 35 115 116
+             118:    113(ptr) AccessChain 27(data) 112 53 30
+                              Store 118 117
+             119:      6(int) Load 8(invocation)
+             122:    121(ptr) AccessChain 27(data) 39 53
              123:   21(ivec4) Load 122
-             124:  121(ivec3) VectorShuffle 123 123 0 1 2
+             124:  120(ivec2) VectorShuffle 123 123 0 1
              125:      6(int) Load 8(invocation)
-             126:  121(ivec3) GroupNonUniformShuffleUp 35 124 125
-             127:    111(ptr) AccessChain 27(data) 120 51
-             128:   21(ivec4) Load 127
-             129:   21(ivec4) VectorShuffle 128 126 4 5 6 3
-                              Store 127 129
-             130:      6(int) Load 8(invocation)
-             131:    111(ptr) AccessChain 27(data) 62 51
-             132:   21(ivec4) Load 131
-             133:      6(int) Load 8(invocation)
-             134:   21(ivec4) GroupNonUniformShuffleUp 35 132 133
-             135:    111(ptr) AccessChain 27(data) 130 51
-                              Store 135 134
+             126:  120(ivec2) GroupNonUniformShuffleUp 35 124 125
+             127:    113(ptr) AccessChain 27(data) 119 53 30
+             128:      6(int) CompositeExtract 126 0
+                              Store 127 128
+             129:    113(ptr) AccessChain 27(data) 119 53 49
+             130:      6(int) CompositeExtract 126 1
+                              Store 129 130
+             131:      6(int) Load 8(invocation)
+             133:    121(ptr) AccessChain 27(data) 53 53
+             134:   21(ivec4) Load 133
+             135:  132(ivec3) VectorShuffle 134 134 0 1 2
              136:      6(int) Load 8(invocation)
-             138:    137(ptr) AccessChain 27(data) 29 62 30
-             139:22(float64_t) Load 138
-             140:      6(int) Load 8(invocation)
-             141:22(float64_t) GroupNonUniformShuffleUp 35 139 140
-             142:    137(ptr) AccessChain 27(data) 136 62 30
-                              Store 142 141
-             143:      6(int) Load 8(invocation)
-             146:    145(ptr) AccessChain 27(data) 39 62
-             147: 23(f64vec4) Load 146
-             148:144(f64vec2) VectorShuffle 147 147 0 1
-             149:      6(int) Load 8(invocation)
-             150:144(f64vec2) GroupNonUniformShuffleUp 35 148 149
-             151:    145(ptr) AccessChain 27(data) 143 62
-             152: 23(f64vec4) Load 151
-             153: 23(f64vec4) VectorShuffle 152 150 4 5 2 3
-                              Store 151 153
+             137:  132(ivec3) GroupNonUniformShuffleUp 35 135 136
+             138:    113(ptr) AccessChain 27(data) 131 53 30
+             139:      6(int) CompositeExtract 137 0
+                              Store 138 139
+             140:    113(ptr) AccessChain 27(data) 131 53 49
+             141:      6(int) CompositeExtract 137 1
+                              Store 140 141
+             142:    113(ptr) AccessChain 27(data) 131 53 64
+             143:      6(int) CompositeExtract 137 2
+                              Store 142 143
+             144:      6(int) Load 8(invocation)
+             145:    121(ptr) AccessChain 27(data) 68 53
+             146:   21(ivec4) Load 145
+             147:      6(int) Load 8(invocation)
+             148:   21(ivec4) GroupNonUniformShuffleUp 35 146 147
+             149:    121(ptr) AccessChain 27(data) 144 53
+                              Store 149 148
+             150:      6(int) Load 8(invocation)
+             152:    151(ptr) AccessChain 27(data) 29 68 30
+             153:22(float64_t) Load 152
              154:      6(int) Load 8(invocation)
-             156:    145(ptr) AccessChain 27(data) 51 62
-             157: 23(f64vec4) Load 156
-             158:155(f64vec3) VectorShuffle 157 157 0 1 2
-             159:      6(int) Load 8(invocation)
-             160:155(f64vec3) GroupNonUniformShuffleUp 35 158 159
-             161:    145(ptr) AccessChain 27(data) 154 62
-             162: 23(f64vec4) Load 161
-             163: 23(f64vec4) VectorShuffle 162 160 4 5 6 3
-                              Store 161 163
-             164:      6(int) Load 8(invocation)
-             165:    145(ptr) AccessChain 27(data) 62 62
-             166: 23(f64vec4) Load 165
-             167:      6(int) Load 8(invocation)
-             168: 23(f64vec4) GroupNonUniformShuffleUp 35 166 167
-             169:    145(ptr) AccessChain 27(data) 164 62
-                              Store 169 168
-             170:      6(int) Load 8(invocation)
-             171:     69(ptr) AccessChain 27(data) 29 39 30
-             172:     19(int) Load 171
-             174:   173(bool) SLessThan 172 29
-             175:      6(int) Load 8(invocation)
-             176:   173(bool) GroupNonUniformShuffleUp 35 174 175
-             177:     19(int) Select 176 39 29
-             178:     69(ptr) AccessChain 27(data) 170 39 30
-                              Store 178 177
-             179:      6(int) Load 8(invocation)
-             180:     77(ptr) AccessChain 27(data) 39 39
-             181:   20(ivec4) Load 180
-             182:   76(ivec2) VectorShuffle 181 181 0 1
-             185:  184(bvec2) SLessThan 182 183
-             186:      6(int) Load 8(invocation)
-             187:  184(bvec2) GroupNonUniformShuffleUp 35 185 186
-             189:   76(ivec2) Select 187 188 183
-             190:     77(ptr) AccessChain 27(data) 179 39
-             191:   20(ivec4) Load 190
-             192:   20(ivec4) VectorShuffle 191 189 4 5 2 3
-                              Store 190 192
+             155:22(float64_t) GroupNonUniformShuffleUp 35 153 154
+             156:    151(ptr) AccessChain 27(data) 150 68 30
+                              Store 156 155
+             157:      6(int) Load 8(invocation)
+             160:    159(ptr) AccessChain 27(data) 39 68
+             161: 23(f64vec4) Load 160
+             162:158(f64vec2) VectorShuffle 161 161 0 1
+             163:      6(int) Load 8(invocation)
+             164:158(f64vec2) GroupNonUniformShuffleUp 35 162 163
+             165:    151(ptr) AccessChain 27(data) 157 68 30
+             166:22(float64_t) CompositeExtract 164 0
+                              Store 165 166
+             167:    151(ptr) AccessChain 27(data) 157 68 49
+             168:22(float64_t) CompositeExtract 164 1
+                              Store 167 168
+             169:      6(int) Load 8(invocation)
+             171:    159(ptr) AccessChain 27(data) 53 68
+             172: 23(f64vec4) Load 171
+             173:170(f64vec3) VectorShuffle 172 172 0 1 2
+             174:      6(int) Load 8(invocation)
+             175:170(f64vec3) GroupNonUniformShuffleUp 35 173 174
+             176:    151(ptr) AccessChain 27(data) 169 68 30
+             177:22(float64_t) CompositeExtract 175 0
+                              Store 176 177
+             178:    151(ptr) AccessChain 27(data) 169 68 49
+             179:22(float64_t) CompositeExtract 175 1
+                              Store 178 179
+             180:    151(ptr) AccessChain 27(data) 169 68 64
+             181:22(float64_t) CompositeExtract 175 2
+                              Store 180 181
+             182:      6(int) Load 8(invocation)
+             183:    159(ptr) AccessChain 27(data) 68 68
+             184: 23(f64vec4) Load 183
+             185:      6(int) Load 8(invocation)
+             186: 23(f64vec4) GroupNonUniformShuffleUp 35 184 185
+             187:    159(ptr) AccessChain 27(data) 182 68
+                              Store 187 186
+             188:      6(int) Load 8(invocation)
+             189:     75(ptr) AccessChain 27(data) 29 39 30
+             190:     19(int) Load 189
+             192:   191(bool) SLessThan 190 29
              193:      6(int) Load 8(invocation)
-             194:     77(ptr) AccessChain 27(data) 39 39
-             195:   20(ivec4) Load 194
-             196:   87(ivec3) VectorShuffle 195 195 0 1 2
-             199:  198(bvec3) SLessThan 196 197
-             200:      6(int) Load 8(invocation)
-             201:  198(bvec3) GroupNonUniformShuffleUp 35 199 200
-             203:   87(ivec3) Select 201 202 197
-             204:     77(ptr) AccessChain 27(data) 193 39
-             205:   20(ivec4) Load 204
-             206:   20(ivec4) VectorShuffle 205 203 4 5 6 3
-                              Store 204 206
-             207:      6(int) Load 8(invocation)
-             208:     77(ptr) AccessChain 27(data) 39 39
-             209:   20(ivec4) Load 208
-             212:  211(bvec4) SLessThan 209 210
-             213:      6(int) Load 8(invocation)
-             214:  211(bvec4) GroupNonUniformShuffleUp 35 212 213
-             216:   20(ivec4) Select 214 215 210
-             217:     77(ptr) AccessChain 27(data) 207 39
-                              Store 217 216
-             218:      6(int) Load 8(invocation)
-             219:     31(ptr) AccessChain 27(data) 29 29 30
-             220:   17(float) Load 219
-             221:      6(int) Load 8(invocation)
-             222:   17(float) GroupNonUniformShuffleDown 35 220 221
-             223:     31(ptr) AccessChain 27(data) 218 29 30
-                              Store 223 222
-             224:      6(int) Load 8(invocation)
-             225:     41(ptr) AccessChain 27(data) 39 29
-             226:   18(fvec4) Load 225
-             227:   40(fvec2) VectorShuffle 226 226 0 1
-             228:      6(int) Load 8(invocation)
-             229:   40(fvec2) GroupNonUniformShuffleDown 35 227 228
-             230:     41(ptr) AccessChain 27(data) 224 29
-             231:   18(fvec4) Load 230
-             232:   18(fvec4) VectorShuffle 231 229 4 5 2 3
-                              Store 230 232
-             233:      6(int) Load 8(invocation)
-             234:     41(ptr) AccessChain 27(data) 51 29
-             235:   18(fvec4) Load 234
-             236:   52(fvec3) VectorShuffle 235 235 0 1 2
-             237:      6(int) Load 8(invocation)
-             238:   52(fvec3) GroupNonUniformShuffleDown 35 236 237
-             239:     41(ptr) AccessChain 27(data) 233 29
-             240:   18(fvec4) Load 239
-             241:   18(fvec4) VectorShuffle 240 238 4 5 6 3
-                              Store 239 241
-             242:      6(int) Load 8(invocation)
-             243:     41(ptr) AccessChain 27(data) 62 29
-             244:   18(fvec4) Load 243
-             245:      6(int) Load 8(invocation)
-             246:   18(fvec4) GroupNonUniformShuffleDown 35 244 245
-             247:     41(ptr) AccessChain 27(data) 242 29
-                              Store 247 246
-             248:      6(int) Load 8(invocation)
-             249:     69(ptr) AccessChain 27(data) 29 39 30
-             250:     19(int) Load 249
-             251:      6(int) Load 8(invocation)
-             252:     19(int) GroupNonUniformShuffleDown 35 250 251
-             253:     69(ptr) AccessChain 27(data) 248 39 30
-                              Store 253 252
-             254:      6(int) Load 8(invocation)
-             255:     77(ptr) AccessChain 27(data) 39 39
-             256:   20(ivec4) Load 255
-             257:   76(ivec2) VectorShuffle 256 256 0 1
-             258:      6(int) Load 8(invocation)
-             259:   76(ivec2) GroupNonUniformShuffleDown 35 257 258
-             260:     77(ptr) AccessChain 27(data) 254 39
-             261:   20(ivec4) Load 260
-             262:   20(ivec4) VectorShuffle 261 259 4 5 2 3
-                              Store 260 262
-             263:      6(int) Load 8(invocation)
-             264:     77(ptr) AccessChain 27(data) 51 39
-             265:   20(ivec4) Load 264
-             266:   87(ivec3) VectorShuffle 265 265 0 1 2
-             267:      6(int) Load 8(invocation)
-             268:   87(ivec3) GroupNonUniformShuffleDown 35 266 267
-             269:     77(ptr) AccessChain 27(data) 263 39
-             270:   20(ivec4) Load 269
-             271:   20(ivec4) VectorShuffle 270 268 4 5 6 3
-                              Store 269 271
-             272:      6(int) Load 8(invocation)
-             273:     77(ptr) AccessChain 27(data) 62 39
-             274:   20(ivec4) Load 273
-             275:      6(int) Load 8(invocation)
-             276:   20(ivec4) GroupNonUniformShuffleDown 35 274 275
-             277:     77(ptr) AccessChain 27(data) 272 39
-                              Store 277 276
-             278:      6(int) Load 8(invocation)
-             279:    103(ptr) AccessChain 27(data) 29 51 30
-             280:      6(int) Load 279
-             281:      6(int) Load 8(invocation)
-             282:      6(int) GroupNonUniformShuffleDown 35 280 281
-             283:    103(ptr) AccessChain 27(data) 278 51 30
-                              Store 283 282
+             194:   191(bool) GroupNonUniformShuffleUp 35 192 193
+             195:     19(int) Select 194 39 29
+             196:     75(ptr) AccessChain 27(data) 188 39 30
+                              Store 196 195
+             197:      6(int) Load 8(invocation)
+             198:     83(ptr) AccessChain 27(data) 39 39
+             199:   20(ivec4) Load 198
+             200:   82(ivec2) VectorShuffle 199 199 0 1
+             203:  202(bvec2) SLessThan 200 201
+             204:      6(int) Load 8(invocation)
+             205:  202(bvec2) GroupNonUniformShuffleUp 35 203 204
+             207:   82(ivec2) Select 205 206 201
+             208:     75(ptr) AccessChain 27(data) 197 39 30
+             209:     19(int) CompositeExtract 207 0
+                              Store 208 209
+             210:     75(ptr) AccessChain 27(data) 197 39 49
+             211:     19(int) CompositeExtract 207 1
+                              Store 210 211
+             212:      6(int) Load 8(invocation)
+             213:     83(ptr) AccessChain 27(data) 39 39
+             214:   20(ivec4) Load 213
+             215:   94(ivec3) VectorShuffle 214 214 0 1 2
+             218:  217(bvec3) SLessThan 215 216
+             219:      6(int) Load 8(invocation)
+             220:  217(bvec3) GroupNonUniformShuffleUp 35 218 219
+             222:   94(ivec3) Select 220 221 216
+             223:     75(ptr) AccessChain 27(data) 212 39 30
+             224:     19(int) CompositeExtract 222 0
+                              Store 223 224
+             225:     75(ptr) AccessChain 27(data) 212 39 49
+             226:     19(int) CompositeExtract 222 1
+                              Store 225 226
+             227:     75(ptr) AccessChain 27(data) 212 39 64
+             228:     19(int) CompositeExtract 222 2
+                              Store 227 228
+             229:      6(int) Load 8(invocation)
+             230:     83(ptr) AccessChain 27(data) 39 39
+             231:   20(ivec4) Load 230
+             234:  233(bvec4) SLessThan 231 232
+             235:      6(int) Load 8(invocation)
+             236:  233(bvec4) GroupNonUniformShuffleUp 35 234 235
+             238:   20(ivec4) Select 236 237 232
+             239:     83(ptr) AccessChain 27(data) 229 39
+                              Store 239 238
+             240:      6(int) Load 8(invocation)
+             241:     31(ptr) AccessChain 27(data) 29 29 30
+             242:   17(float) Load 241
+             243:      6(int) Load 8(invocation)
+             244:   17(float) GroupNonUniformShuffleDown 35 242 243
+             245:     31(ptr) AccessChain 27(data) 240 29 30
+                              Store 245 244
+             246:      6(int) Load 8(invocation)
+             247:     41(ptr) AccessChain 27(data) 39 29
+             248:   18(fvec4) Load 247
+             249:   40(fvec2) VectorShuffle 248 248 0 1
+             250:      6(int) Load 8(invocation)
+             251:   40(fvec2) GroupNonUniformShuffleDown 35 249 250
+             252:     31(ptr) AccessChain 27(data) 246 29 30
+             253:   17(float) CompositeExtract 251 0
+                              Store 252 253
+             254:     31(ptr) AccessChain 27(data) 246 29 49
+             255:   17(float) CompositeExtract 251 1
+                              Store 254 255
+             256:      6(int) Load 8(invocation)
+             257:     41(ptr) AccessChain 27(data) 53 29
+             258:   18(fvec4) Load 257
+             259:   54(fvec3) VectorShuffle 258 258 0 1 2
+             260:      6(int) Load 8(invocation)
+             261:   54(fvec3) GroupNonUniformShuffleDown 35 259 260
+             262:     31(ptr) AccessChain 27(data) 256 29 30
+             263:   17(float) CompositeExtract 261 0
+                              Store 262 263
+             264:     31(ptr) AccessChain 27(data) 256 29 49
+             265:   17(float) CompositeExtract 261 1
+                              Store 264 265
+             266:     31(ptr) AccessChain 27(data) 256 29 64
+             267:   17(float) CompositeExtract 261 2
+                              Store 266 267
+             268:      6(int) Load 8(invocation)
+             269:     41(ptr) AccessChain 27(data) 68 29
+             270:   18(fvec4) Load 269
+             271:      6(int) Load 8(invocation)
+             272:   18(fvec4) GroupNonUniformShuffleDown 35 270 271
+             273:     41(ptr) AccessChain 27(data) 268 29
+                              Store 273 272
+             274:      6(int) Load 8(invocation)
+             275:     75(ptr) AccessChain 27(data) 29 39 30
+             276:     19(int) Load 275
+             277:      6(int) Load 8(invocation)
+             278:     19(int) GroupNonUniformShuffleDown 35 276 277
+             279:     75(ptr) AccessChain 27(data) 274 39 30
+                              Store 279 278
+             280:      6(int) Load 8(invocation)
+             281:     83(ptr) AccessChain 27(data) 39 39
+             282:   20(ivec4) Load 281
+             283:   82(ivec2) VectorShuffle 282 282 0 1
              284:      6(int) Load 8(invocation)
-             285:    111(ptr) AccessChain 27(data) 39 51
-             286:   21(ivec4) Load 285
-             287:  110(ivec2) VectorShuffle 286 286 0 1
-             288:      6(int) Load 8(invocation)
-             289:  110(ivec2) GroupNonUniformShuffleDown 35 287 288
-             290:    111(ptr) AccessChain 27(data) 284 51
-             291:   21(ivec4) Load 290
-             292:   21(ivec4) VectorShuffle 291 289 4 5 2 3
-                              Store 290 292
-             293:      6(int) Load 8(invocation)
-             294:    111(ptr) AccessChain 27(data) 51 51
-             295:   21(ivec4) Load 294
-             296:  121(ivec3) VectorShuffle 295 295 0 1 2
-             297:      6(int) Load 8(invocation)
-             298:  121(ivec3) GroupNonUniformShuffleDown 35 296 297
-             299:    111(ptr) AccessChain 27(data) 293 51
-             300:   21(ivec4) Load 299
-             301:   21(ivec4) VectorShuffle 300 298 4 5 6 3
-                              Store 299 301
+             285:   82(ivec2) GroupNonUniformShuffleDown 35 283 284
+             286:     75(ptr) AccessChain 27(data) 280 39 30
+             287:     19(int) CompositeExtract 285 0
+                              Store 286 287
+             288:     75(ptr) AccessChain 27(data) 280 39 49
+             289:     19(int) CompositeExtract 285 1
+                              Store 288 289
+             290:      6(int) Load 8(invocation)
+             291:     83(ptr) AccessChain 27(data) 53 39
+             292:   20(ivec4) Load 291
+             293:   94(ivec3) VectorShuffle 292 292 0 1 2
+             294:      6(int) Load 8(invocation)
+             295:   94(ivec3) GroupNonUniformShuffleDown 35 293 294
+             296:     75(ptr) AccessChain 27(data) 290 39 30
+             297:     19(int) CompositeExtract 295 0
+                              Store 296 297
+             298:     75(ptr) AccessChain 27(data) 290 39 49
+             299:     19(int) CompositeExtract 295 1
+                              Store 298 299
+             300:     75(ptr) AccessChain 27(data) 290 39 64
+             301:     19(int) CompositeExtract 295 2
+                              Store 300 301
              302:      6(int) Load 8(invocation)
-             303:    111(ptr) AccessChain 27(data) 62 51
-             304:   21(ivec4) Load 303
+             303:     83(ptr) AccessChain 27(data) 68 39
+             304:   20(ivec4) Load 303
              305:      6(int) Load 8(invocation)
-             306:   21(ivec4) GroupNonUniformShuffleDown 35 304 305
-             307:    111(ptr) AccessChain 27(data) 302 51
+             306:   20(ivec4) GroupNonUniformShuffleDown 35 304 305
+             307:     83(ptr) AccessChain 27(data) 302 39
                               Store 307 306
              308:      6(int) Load 8(invocation)
-             309:    137(ptr) AccessChain 27(data) 29 62 30
-             310:22(float64_t) Load 309
+             309:    113(ptr) AccessChain 27(data) 29 53 30
+             310:      6(int) Load 309
              311:      6(int) Load 8(invocation)
-             312:22(float64_t) GroupNonUniformShuffleDown 35 310 311
-             313:    137(ptr) AccessChain 27(data) 308 62 30
+             312:      6(int) GroupNonUniformShuffleDown 35 310 311
+             313:    113(ptr) AccessChain 27(data) 308 53 30
                               Store 313 312
              314:      6(int) Load 8(invocation)
-             315:    145(ptr) AccessChain 27(data) 39 62
-             316: 23(f64vec4) Load 315
-             317:144(f64vec2) VectorShuffle 316 316 0 1
+             315:    121(ptr) AccessChain 27(data) 39 53
+             316:   21(ivec4) Load 315
+             317:  120(ivec2) VectorShuffle 316 316 0 1
              318:      6(int) Load 8(invocation)
-             319:144(f64vec2) GroupNonUniformShuffleDown 35 317 318
-             320:    145(ptr) AccessChain 27(data) 314 62
-             321: 23(f64vec4) Load 320
-             322: 23(f64vec4) VectorShuffle 321 319 4 5 2 3
-                              Store 320 322
-             323:      6(int) Load 8(invocation)
-             324:    145(ptr) AccessChain 27(data) 51 62
-             325: 23(f64vec4) Load 324
-             326:155(f64vec3) VectorShuffle 325 325 0 1 2
-             327:      6(int) Load 8(invocation)
-             328:155(f64vec3) GroupNonUniformShuffleDown 35 326 327
-             329:    145(ptr) AccessChain 27(data) 323 62
-             330: 23(f64vec4) Load 329
-             331: 23(f64vec4) VectorShuffle 330 328 4 5 6 3
-                              Store 329 331
-             332:      6(int) Load 8(invocation)
-             333:    145(ptr) AccessChain 27(data) 62 62
-             334: 23(f64vec4) Load 333
-             335:      6(int) Load 8(invocation)
-             336: 23(f64vec4) GroupNonUniformShuffleDown 35 334 335
-             337:    145(ptr) AccessChain 27(data) 332 62
-                              Store 337 336
-             338:      6(int) Load 8(invocation)
-             339:     69(ptr) AccessChain 27(data) 29 39 30
-             340:     19(int) Load 339
-             341:   173(bool) SLessThan 340 29
+             319:  120(ivec2) GroupNonUniformShuffleDown 35 317 318
+             320:    113(ptr) AccessChain 27(data) 314 53 30
+             321:      6(int) CompositeExtract 319 0
+                              Store 320 321
+             322:    113(ptr) AccessChain 27(data) 314 53 49
+             323:      6(int) CompositeExtract 319 1
+                              Store 322 323
+             324:      6(int) Load 8(invocation)
+             325:    121(ptr) AccessChain 27(data) 53 53
+             326:   21(ivec4) Load 325
+             327:  132(ivec3) VectorShuffle 326 326 0 1 2
+             328:      6(int) Load 8(invocation)
+             329:  132(ivec3) GroupNonUniformShuffleDown 35 327 328
+             330:    113(ptr) AccessChain 27(data) 324 53 30
+             331:      6(int) CompositeExtract 329 0
+                              Store 330 331
+             332:    113(ptr) AccessChain 27(data) 324 53 49
+             333:      6(int) CompositeExtract 329 1
+                              Store 332 333
+             334:    113(ptr) AccessChain 27(data) 324 53 64
+             335:      6(int) CompositeExtract 329 2
+                              Store 334 335
+             336:      6(int) Load 8(invocation)
+             337:    121(ptr) AccessChain 27(data) 68 53
+             338:   21(ivec4) Load 337
+             339:      6(int) Load 8(invocation)
+             340:   21(ivec4) GroupNonUniformShuffleDown 35 338 339
+             341:    121(ptr) AccessChain 27(data) 336 53
+                              Store 341 340
              342:      6(int) Load 8(invocation)
-             343:   173(bool) GroupNonUniformShuffleDown 35 341 342
-             344:     19(int) Select 343 39 29
-             345:     69(ptr) AccessChain 27(data) 338 39 30
-                              Store 345 344
-             346:      6(int) Load 8(invocation)
-             347:     77(ptr) AccessChain 27(data) 39 39
-             348:   20(ivec4) Load 347
-             349:   76(ivec2) VectorShuffle 348 348 0 1
-             350:  184(bvec2) SLessThan 349 183
-             351:      6(int) Load 8(invocation)
-             352:  184(bvec2) GroupNonUniformShuffleDown 35 350 351
-             353:   76(ivec2) Select 352 188 183
-             354:     77(ptr) AccessChain 27(data) 346 39
-             355:   20(ivec4) Load 354
-             356:   20(ivec4) VectorShuffle 355 353 4 5 2 3
-                              Store 354 356
-             357:      6(int) Load 8(invocation)
-             358:     77(ptr) AccessChain 27(data) 39 39
-             359:   20(ivec4) Load 358
-             360:   87(ivec3) VectorShuffle 359 359 0 1 2
-             361:  198(bvec3) SLessThan 360 197
+             343:    151(ptr) AccessChain 27(data) 29 68 30
+             344:22(float64_t) Load 343
+             345:      6(int) Load 8(invocation)
+             346:22(float64_t) GroupNonUniformShuffleDown 35 344 345
+             347:    151(ptr) AccessChain 27(data) 342 68 30
+                              Store 347 346
+             348:      6(int) Load 8(invocation)
+             349:    159(ptr) AccessChain 27(data) 39 68
+             350: 23(f64vec4) Load 349
+             351:158(f64vec2) VectorShuffle 350 350 0 1
+             352:      6(int) Load 8(invocation)
+             353:158(f64vec2) GroupNonUniformShuffleDown 35 351 352
+             354:    151(ptr) AccessChain 27(data) 348 68 30
+             355:22(float64_t) CompositeExtract 353 0
+                              Store 354 355
+             356:    151(ptr) AccessChain 27(data) 348 68 49
+             357:22(float64_t) CompositeExtract 353 1
+                              Store 356 357
+             358:      6(int) Load 8(invocation)
+             359:    159(ptr) AccessChain 27(data) 53 68
+             360: 23(f64vec4) Load 359
+             361:170(f64vec3) VectorShuffle 360 360 0 1 2
              362:      6(int) Load 8(invocation)
-             363:  198(bvec3) GroupNonUniformShuffleDown 35 361 362
-             364:   87(ivec3) Select 363 202 197
-             365:     77(ptr) AccessChain 27(data) 357 39
-             366:   20(ivec4) Load 365
-             367:   20(ivec4) VectorShuffle 366 364 4 5 6 3
-                              Store 365 367
-             368:      6(int) Load 8(invocation)
-             369:     77(ptr) AccessChain 27(data) 39 39
-             370:   20(ivec4) Load 369
-             371:  211(bvec4) SLessThan 370 210
-             372:      6(int) Load 8(invocation)
-             373:  211(bvec4) GroupNonUniformShuffleDown 35 371 372
-             374:   20(ivec4) Select 373 215 210
-             375:     77(ptr) AccessChain 27(data) 368 39
+             363:170(f64vec3) GroupNonUniformShuffleDown 35 361 362
+             364:    151(ptr) AccessChain 27(data) 358 68 30
+             365:22(float64_t) CompositeExtract 363 0
+                              Store 364 365
+             366:    151(ptr) AccessChain 27(data) 358 68 49
+             367:22(float64_t) CompositeExtract 363 1
+                              Store 366 367
+             368:    151(ptr) AccessChain 27(data) 358 68 64
+             369:22(float64_t) CompositeExtract 363 2
+                              Store 368 369
+             370:      6(int) Load 8(invocation)
+             371:    159(ptr) AccessChain 27(data) 68 68
+             372: 23(f64vec4) Load 371
+             373:      6(int) Load 8(invocation)
+             374: 23(f64vec4) GroupNonUniformShuffleDown 35 372 373
+             375:    159(ptr) AccessChain 27(data) 370 68
                               Store 375 374
+             376:      6(int) Load 8(invocation)
+             377:     75(ptr) AccessChain 27(data) 29 39 30
+             378:     19(int) Load 377
+             379:   191(bool) SLessThan 378 29
+             380:      6(int) Load 8(invocation)
+             381:   191(bool) GroupNonUniformShuffleDown 35 379 380
+             382:     19(int) Select 381 39 29
+             383:     75(ptr) AccessChain 27(data) 376 39 30
+                              Store 383 382
+             384:      6(int) Load 8(invocation)
+             385:     83(ptr) AccessChain 27(data) 39 39
+             386:   20(ivec4) Load 385
+             387:   82(ivec2) VectorShuffle 386 386 0 1
+             388:  202(bvec2) SLessThan 387 201
+             389:      6(int) Load 8(invocation)
+             390:  202(bvec2) GroupNonUniformShuffleDown 35 388 389
+             391:   82(ivec2) Select 390 206 201
+             392:     75(ptr) AccessChain 27(data) 384 39 30
+             393:     19(int) CompositeExtract 391 0
+                              Store 392 393
+             394:     75(ptr) AccessChain 27(data) 384 39 49
+             395:     19(int) CompositeExtract 391 1
+                              Store 394 395
+             396:      6(int) Load 8(invocation)
+             397:     83(ptr) AccessChain 27(data) 39 39
+             398:   20(ivec4) Load 397
+             399:   94(ivec3) VectorShuffle 398 398 0 1 2
+             400:  217(bvec3) SLessThan 399 216
+             401:      6(int) Load 8(invocation)
+             402:  217(bvec3) GroupNonUniformShuffleDown 35 400 401
+             403:   94(ivec3) Select 402 221 216
+             404:     75(ptr) AccessChain 27(data) 396 39 30
+             405:     19(int) CompositeExtract 403 0
+                              Store 404 405
+             406:     75(ptr) AccessChain 27(data) 396 39 49
+             407:     19(int) CompositeExtract 403 1
+                              Store 406 407
+             408:     75(ptr) AccessChain 27(data) 396 39 64
+             409:     19(int) CompositeExtract 403 2
+                              Store 408 409
+             410:      6(int) Load 8(invocation)
+             411:     83(ptr) AccessChain 27(data) 39 39
+             412:   20(ivec4) Load 411
+             413:  233(bvec4) SLessThan 412 232
+             414:      6(int) Load 8(invocation)
+             415:  233(bvec4) GroupNonUniformShuffleDown 35 413 414
+             416:   20(ivec4) Select 415 237 232
+             417:     83(ptr) AccessChain 27(data) 410 39
+                              Store 417 416
                               Return
                               FunctionEnd
diff --git a/third_party/vulkan-deps/glslang/src/Test/baseResults/spv.swizzle.frag.out b/third_party/vulkan-deps/glslang/src/Test/baseResults/spv.swizzle.frag.out
index 7e42c3e..2aa31e8 100644
--- a/third_party/vulkan-deps/glslang/src/Test/baseResults/spv.swizzle.frag.out
+++ b/third_party/vulkan-deps/glslang/src/Test/baseResults/spv.swizzle.frag.out
@@ -1,12 +1,12 @@
 spv.swizzle.frag
 // Module Version 10000
 // Generated by (magic number): 8000a
-// Id's are bound by 108
+// Id's are bound by 117
 
                               Capability Shader
                1:             ExtInstImport  "GLSL.std.450"
                               MemoryModel Logical GLSL450
-                              EntryPoint Fragment 4  "main" 14 30 69 107
+                              EntryPoint Fragment 4  "main" 14 30 78 116
                               ExecutionMode 4 OriginUpperLeft
                               Source GLSL 140
                               Name 4  "main"
@@ -18,16 +18,16 @@
                               Name 20  "w2"
                               Name 22  "w_flow"
                               Name 30  "t"
-                              Name 49  "w_undef"
-                              Name 56  "p"
-                              Name 69  "gl_FragColor"
-                              Name 81  "c"
-                              Name 83  "rep"
-                              Name 107  "blend"
+                              Name 56  "w_undef"
+                              Name 65  "p"
+                              Name 78  "gl_FragColor"
+                              Name 90  "c"
+                              Name 92  "rep"
+                              Name 116  "blend"
                               Decorate 14(u) Location 1
                               Decorate 30(t) Location 2
-                              Decorate 69(gl_FragColor) Location 0
-                              Decorate 107(blend) Location 0
+                              Decorate 78(gl_FragColor) Location 0
+                              Decorate 116(blend) Location 0
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeFloat 32
@@ -42,21 +42,22 @@
               28:             TypeVector 6(float) 2
               29:             TypePointer Input 28(fvec2)
            30(t):     29(ptr) Variable Input
-              35:     25(int) Constant 0
-              40:     25(int) Constant 1
-              54:             TypeBool
-              55:             TypePointer Private 54(bool)
-           56(p):     55(ptr) Variable Private
-              60:             TypePointer Input 6(float)
-              68:             TypePointer Output 10(fvec4)
-69(gl_FragColor):     68(ptr) Variable Output
-              80:             TypePointer Function 28(fvec2)
-              84:    6(float) Constant 0
-              85:    6(float) Constant 1065353216
-              86:   10(fvec4) ConstantComposite 84 84 84 85
-              92:    6(float) Constant 3212836864
-             102:    6(float) Constant 1079613850
-      107(blend):     60(ptr) Variable Input
+              32:     25(int) Constant 3
+              35:     25(int) Constant 1
+              39:     25(int) Constant 0
+              63:             TypeBool
+              64:             TypePointer Private 63(bool)
+           65(p):     64(ptr) Variable Private
+              69:             TypePointer Input 6(float)
+              77:             TypePointer Output 10(fvec4)
+78(gl_FragColor):     77(ptr) Variable Output
+              89:             TypePointer Function 28(fvec2)
+              93:    6(float) Constant 0
+              94:    6(float) Constant 1065353216
+              95:   10(fvec4) ConstantComposite 93 93 93 94
+             101:    6(float) Constant 3212836864
+             111:    6(float) Constant 1079613850
+      116(blend):     69(ptr) Variable Input
          4(main):           2 Function None 3
                5:             Label
    8(blendscale):      7(ptr) Variable Function
@@ -65,9 +66,9 @@
    18(w_reorder):     11(ptr) Variable Function
           20(w2):     11(ptr) Variable Function
       22(w_flow):     11(ptr) Variable Function
-     49(w_undef):     11(ptr) Variable Function
-           81(c):     80(ptr) Variable Function
-         83(rep):     11(ptr) Variable Function
+     56(w_undef):     11(ptr) Variable Function
+           90(c):     89(ptr) Variable Function
+         92(rep):     11(ptr) Variable Function
                               Store 8(blendscale) 9
               15:   10(fvec4) Load 14(u)
                               Store 12(w) 15
@@ -83,88 +84,100 @@
               27:      7(ptr) AccessChain 18(w_reorder) 26
                               Store 27 24
               31:   28(fvec2) Load 30(t)
-              32:   10(fvec4) Load 12(w)
-              33:   10(fvec4) VectorShuffle 32 31 0 5 2 4
-                              Store 12(w) 33
-              34:    6(float) Load 8(blendscale)
-              36:      7(ptr) AccessChain 18(w_reorder) 35
-                              Store 36 34
-              37:   10(fvec4) Load 14(u)
-              38:   10(fvec4) VectorShuffle 37 37 2 3 0 1
-                              Store 20(w2) 38
-              39:    6(float) Load 8(blendscale)
-              41:      7(ptr) AccessChain 18(w_reorder) 40
-                              Store 41 39
-              42:   10(fvec4) Load 20(w2)
-              43:   28(fvec2) VectorShuffle 42 42 0 2
-              44:   10(fvec4) Load 16(w_dep)
-              45:   10(fvec4) VectorShuffle 44 43 4 5 2 3
-                              Store 16(w_dep) 45
-              46:   28(fvec2) Load 30(t)
-              47:   10(fvec4) Load 16(w_dep)
-              48:   10(fvec4) VectorShuffle 47 46 0 1 4 5
-                              Store 16(w_dep) 48
-              50:   10(fvec4) Load 14(u)
-              51:   28(fvec2) VectorShuffle 50 50 2 3
-              52:   10(fvec4) Load 49(w_undef)
-              53:   10(fvec4) VectorShuffle 52 51 4 5 2 3
-                              Store 49(w_undef) 53
-              57:    54(bool) Load 56(p)
-                              SelectionMerge 59 None
-                              BranchConditional 57 58 64
-              58:               Label
-              61:     60(ptr)   AccessChain 30(t) 35
-              62:    6(float)   Load 61
-              63:      7(ptr)   AccessChain 22(w_flow) 35
-                                Store 63 62
-                                Branch 59
-              64:               Label
-              65:     60(ptr)   AccessChain 30(t) 40
-              66:    6(float)   Load 65
-              67:      7(ptr)   AccessChain 22(w_flow) 35
-                                Store 67 66
-                                Branch 59
-              59:             Label
-              70:   10(fvec4) Load 18(w_reorder)
-              71:   10(fvec4) Load 49(w_undef)
-              72:   10(fvec4) Load 12(w)
-              73:   10(fvec4) Load 20(w2)
-              74:   10(fvec4) FMul 72 73
-              75:   10(fvec4) Load 16(w_dep)
-              76:   10(fvec4) FMul 74 75
-              77:   10(fvec4) Load 22(w_flow)
-              78:   10(fvec4) FMul 76 77
-              79:   10(fvec4) ExtInst 1(GLSL.std.450) 46(FMix) 70 71 78
-                              Store 69(gl_FragColor) 79
-              82:   28(fvec2) Load 30(t)
-                              Store 81(c) 82
-                              Store 83(rep) 86
-              87:      7(ptr) AccessChain 81(c) 35
-              88:    6(float) Load 87
-              89:    54(bool) FOrdLessThan 88 84
-                              SelectionMerge 91 None
-                              BranchConditional 89 90 91
-              90:               Label
-              93:      7(ptr)   AccessChain 81(c) 35
-              94:    6(float)   Load 93
-              95:    6(float)   FMul 94 92
-              96:      7(ptr)   AccessChain 81(c) 35
-                                Store 96 95
-                                Branch 91
-              91:             Label
-              97:      7(ptr) AccessChain 81(c) 35
-              98:    6(float) Load 97
-              99:    54(bool) FOrdLessThanEqual 98 85
-                              SelectionMerge 101 None
-                              BranchConditional 99 100 101
-             100:               Label
-             103:      7(ptr)   AccessChain 83(rep) 35
-                                Store 103 102
-                                Branch 101
-             101:             Label
-             104:   10(fvec4) Load 83(rep)
-             105:   10(fvec4) Load 69(gl_FragColor)
-             106:   10(fvec4) FAdd 105 104
-                              Store 69(gl_FragColor) 106
+              33:      7(ptr) AccessChain 12(w) 32
+              34:    6(float) CompositeExtract 31 0
+                              Store 33 34
+              36:      7(ptr) AccessChain 12(w) 35
+              37:    6(float) CompositeExtract 31 1
+                              Store 36 37
+              38:    6(float) Load 8(blendscale)
+              40:      7(ptr) AccessChain 18(w_reorder) 39
+                              Store 40 38
+              41:   10(fvec4) Load 14(u)
+              42:   10(fvec4) VectorShuffle 41 41 2 3 0 1
+                              Store 20(w2) 42
+              43:    6(float) Load 8(blendscale)
+              44:      7(ptr) AccessChain 18(w_reorder) 35
+                              Store 44 43
+              45:   10(fvec4) Load 20(w2)
+              46:   28(fvec2) VectorShuffle 45 45 0 2
+              47:      7(ptr) AccessChain 16(w_dep) 39
+              48:    6(float) CompositeExtract 46 0
+                              Store 47 48
+              49:      7(ptr) AccessChain 16(w_dep) 35
+              50:    6(float) CompositeExtract 46 1
+                              Store 49 50
+              51:   28(fvec2) Load 30(t)
+              52:      7(ptr) AccessChain 16(w_dep) 26
+              53:    6(float) CompositeExtract 51 0
+                              Store 52 53
+              54:      7(ptr) AccessChain 16(w_dep) 32
+              55:    6(float) CompositeExtract 51 1
+                              Store 54 55
+              57:   10(fvec4) Load 14(u)
+              58:   28(fvec2) VectorShuffle 57 57 2 3
+              59:      7(ptr) AccessChain 56(w_undef) 39
+              60:    6(float) CompositeExtract 58 0
+                              Store 59 60
+              61:      7(ptr) AccessChain 56(w_undef) 35
+              62:    6(float) CompositeExtract 58 1
+                              Store 61 62
+              66:    63(bool) Load 65(p)
+                              SelectionMerge 68 None
+                              BranchConditional 66 67 73
+              67:               Label
+              70:     69(ptr)   AccessChain 30(t) 39
+              71:    6(float)   Load 70
+              72:      7(ptr)   AccessChain 22(w_flow) 39
+                                Store 72 71
+                                Branch 68
+              73:               Label
+              74:     69(ptr)   AccessChain 30(t) 35
+              75:    6(float)   Load 74
+              76:      7(ptr)   AccessChain 22(w_flow) 39
+                                Store 76 75
+                                Branch 68
+              68:             Label
+              79:   10(fvec4) Load 18(w_reorder)
+              80:   10(fvec4) Load 56(w_undef)
+              81:   10(fvec4) Load 12(w)
+              82:   10(fvec4) Load 20(w2)
+              83:   10(fvec4) FMul 81 82
+              84:   10(fvec4) Load 16(w_dep)
+              85:   10(fvec4) FMul 83 84
+              86:   10(fvec4) Load 22(w_flow)
+              87:   10(fvec4) FMul 85 86
+              88:   10(fvec4) ExtInst 1(GLSL.std.450) 46(FMix) 79 80 87
+                              Store 78(gl_FragColor) 88
+              91:   28(fvec2) Load 30(t)
+                              Store 90(c) 91
+                              Store 92(rep) 95
+              96:      7(ptr) AccessChain 90(c) 39
+              97:    6(float) Load 96
+              98:    63(bool) FOrdLessThan 97 93
+                              SelectionMerge 100 None
+                              BranchConditional 98 99 100
+              99:               Label
+             102:      7(ptr)   AccessChain 90(c) 39
+             103:    6(float)   Load 102
+             104:    6(float)   FMul 103 101
+             105:      7(ptr)   AccessChain 90(c) 39
+                                Store 105 104
+                                Branch 100
+             100:             Label
+             106:      7(ptr) AccessChain 90(c) 39
+             107:    6(float) Load 106
+             108:    63(bool) FOrdLessThanEqual 107 94
+                              SelectionMerge 110 None
+                              BranchConditional 108 109 110
+             109:               Label
+             112:      7(ptr)   AccessChain 92(rep) 39
+                                Store 112 111
+                                Branch 110
+             110:             Label
+             113:   10(fvec4) Load 92(rep)
+             114:   10(fvec4) Load 78(gl_FragColor)
+             115:   10(fvec4) FAdd 114 113
+                              Store 78(gl_FragColor) 115
                               Return
                               FunctionEnd
diff --git a/third_party/vulkan-deps/glslang/src/Test/baseResults/spv.uint.frag.out b/third_party/vulkan-deps/glslang/src/Test/baseResults/spv.uint.frag.out
index c19064d..7dbc3b3 100644
--- a/third_party/vulkan-deps/glslang/src/Test/baseResults/spv.uint.frag.out
+++ b/third_party/vulkan-deps/glslang/src/Test/baseResults/spv.uint.frag.out
@@ -75,6 +75,7 @@
                               Decorate 90 RelaxedPrecision
                               Decorate 91 RelaxedPrecision
                               Decorate 92 RelaxedPrecision
+                              Decorate 93 RelaxedPrecision
                               Decorate 97 RelaxedPrecision
                               Decorate 98 RelaxedPrecision
                               Decorate 101 RelaxedPrecision
diff --git a/third_party/vulkan-deps/glslang/src/Test/baseResults/spv.uniformArray.frag.out b/third_party/vulkan-deps/glslang/src/Test/baseResults/spv.uniformArray.frag.out
index 8134383..fa66f2b 100644
--- a/third_party/vulkan-deps/glslang/src/Test/baseResults/spv.uniformArray.frag.out
+++ b/third_party/vulkan-deps/glslang/src/Test/baseResults/spv.uniformArray.frag.out
@@ -1,27 +1,27 @@
 spv.uniformArray.frag
 // Module Version 10000
 // Generated by (magic number): 8000a
-// Id's are bound by 53
+// Id's are bound by 60
 
                               Capability Shader
                1:             ExtInstImport  "GLSL.std.450"
                               MemoryModel Logical GLSL450
-                              EntryPoint Fragment 4  "main" 14 25 35 47
+                              EntryPoint Fragment 4  "main" 14 25 43 54
                               ExecutionMode 4 OriginUpperLeft
                               Source GLSL 140
                               Name 4  "main"
                               Name 9  "texColor"
                               Name 14  "color"
                               Name 25  "inColor"
-                              Name 35  "alpha"
-                              Name 47  "gl_FragColor"
-                              Name 52  "texSampler2D"
+                              Name 43  "alpha"
+                              Name 54  "gl_FragColor"
+                              Name 59  "texSampler2D"
                               Decorate 14(color) Location 1
                               Decorate 25(inColor) Location 0
-                              Decorate 35(alpha) Location 7
-                              Decorate 47(gl_FragColor) Location 0
-                              Decorate 52(texSampler2D) DescriptorSet 0
-                              Decorate 52(texSampler2D) Binding 0
+                              Decorate 43(alpha) Location 7
+                              Decorate 54(gl_FragColor) Location 0
+                              Decorate 59(texSampler2D) DescriptorSet 0
+                              Decorate 59(texSampler2D) Binding 0
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeFloat 32
@@ -38,20 +38,23 @@
               23:             TypeVector 6(float) 3
               24:             TypePointer Input 23(fvec3)
      25(inColor):     24(ptr) Variable Input
-              32:     10(int) Constant 16
-              33:             TypeArray 6(float) 32
-              34:             TypePointer Input 33
-       35(alpha):     34(ptr) Variable Input
-              36:     15(int) Constant 12
-              37:             TypePointer Input 6(float)
-              40:     10(int) Constant 3
-              41:             TypePointer Function 6(float)
-              46:             TypePointer Output 7(fvec4)
-47(gl_FragColor):     46(ptr) Variable Output
-              49:             TypeImage 6(float) 2D sampled format:Unknown
-              50:             TypeSampledImage 49
-              51:             TypePointer UniformConstant 50
-52(texSampler2D):     51(ptr) Variable UniformConstant
+              30:     10(int) Constant 0
+              31:             TypePointer Function 6(float)
+              34:     10(int) Constant 1
+              37:     10(int) Constant 2
+              40:     10(int) Constant 16
+              41:             TypeArray 6(float) 40
+              42:             TypePointer Input 41
+       43(alpha):     42(ptr) Variable Input
+              44:     15(int) Constant 12
+              45:             TypePointer Input 6(float)
+              48:     10(int) Constant 3
+              53:             TypePointer Output 7(fvec4)
+54(gl_FragColor):     53(ptr) Variable Output
+              56:             TypeImage 6(float) 2D sampled format:Unknown
+              57:             TypeSampledImage 56
+              58:             TypePointer UniformConstant 57
+59(texSampler2D):     58(ptr) Variable UniformConstant
          4(main):           2 Function None 3
                5:             Label
      9(texColor):      8(ptr) Variable Function
@@ -65,17 +68,23 @@
               27:    7(fvec4) Load 9(texColor)
               28:   23(fvec3) VectorShuffle 27 27 0 1 2
               29:   23(fvec3) FAdd 28 26
-              30:    7(fvec4) Load 9(texColor)
-              31:    7(fvec4) VectorShuffle 30 29 4 5 6 3
-                              Store 9(texColor) 31
-              38:     37(ptr) AccessChain 35(alpha) 36
-              39:    6(float) Load 38
-              42:     41(ptr) AccessChain 9(texColor) 40
-              43:    6(float) Load 42
-              44:    6(float) FAdd 43 39
-              45:     41(ptr) AccessChain 9(texColor) 40
-                              Store 45 44
-              48:    7(fvec4) Load 9(texColor)
-                              Store 47(gl_FragColor) 48
+              32:     31(ptr) AccessChain 9(texColor) 30
+              33:    6(float) CompositeExtract 29 0
+                              Store 32 33
+              35:     31(ptr) AccessChain 9(texColor) 34
+              36:    6(float) CompositeExtract 29 1
+                              Store 35 36
+              38:     31(ptr) AccessChain 9(texColor) 37
+              39:    6(float) CompositeExtract 29 2
+                              Store 38 39
+              46:     45(ptr) AccessChain 43(alpha) 44
+              47:    6(float) Load 46
+              49:     31(ptr) AccessChain 9(texColor) 48
+              50:    6(float) Load 49
+              51:    6(float) FAdd 50 47
+              52:     31(ptr) AccessChain 9(texColor) 48
+                              Store 52 51
+              55:    7(fvec4) Load 9(texColor)
+                              Store 54(gl_FragColor) 55
                               Return
                               FunctionEnd
diff --git a/third_party/vulkan-deps/glslang/src/Test/baseResults/spv.vulkan110.int16.frag.out b/third_party/vulkan-deps/glslang/src/Test/baseResults/spv.vulkan110.int16.frag.out
index 39b36cb..47388a2 100644
--- a/third_party/vulkan-deps/glslang/src/Test/baseResults/spv.vulkan110.int16.frag.out
+++ b/third_party/vulkan-deps/glslang/src/Test/baseResults/spv.vulkan110.int16.frag.out
@@ -1,7 +1,7 @@
 spv.vulkan110.int16.frag
 // Module Version 10300
 // Generated by (magic number): 8000a
-// Id's are bound by 523
+// Id's are bound by 535
 
                               Capability Shader
                               Capability Float16
@@ -65,35 +65,35 @@
                               Name 442  "u64"
                               Name 445  "u16v4"
                               Name 457  "bv"
-                              Name 518  "Block"
-                              MemberName 518(Block) 0  "i16"
-                              MemberName 518(Block) 1  "i16v2"
-                              MemberName 518(Block) 2  "i16v3"
-                              MemberName 518(Block) 3  "i16v4"
-                              MemberName 518(Block) 4  "u16"
-                              MemberName 518(Block) 5  "u16v2"
-                              MemberName 518(Block) 6  "u16v3"
-                              MemberName 518(Block) 7  "u16v4"
-                              Name 520  "block"
-                              Name 521  "si16"
-                              Name 522  "su16"
+                              Name 530  "Block"
+                              MemberName 530(Block) 0  "i16"
+                              MemberName 530(Block) 1  "i16v2"
+                              MemberName 530(Block) 2  "i16v3"
+                              MemberName 530(Block) 3  "i16v4"
+                              MemberName 530(Block) 4  "u16"
+                              MemberName 530(Block) 5  "u16v2"
+                              MemberName 530(Block) 6  "u16v3"
+                              MemberName 530(Block) 7  "u16v4"
+                              Name 532  "block"
+                              Name 533  "si16"
+                              Name 534  "su16"
                               MemberDecorate 24(Uniforms) 0 Offset 0
                               Decorate 24(Uniforms) Block
                               Decorate 26 DescriptorSet 0
                               Decorate 26 Binding 0
-                              MemberDecorate 518(Block) 0 Offset 0
-                              MemberDecorate 518(Block) 1 Offset 4
-                              MemberDecorate 518(Block) 2 Offset 8
-                              MemberDecorate 518(Block) 3 Offset 16
-                              MemberDecorate 518(Block) 4 Offset 24
-                              MemberDecorate 518(Block) 5 Offset 28
-                              MemberDecorate 518(Block) 6 Offset 32
-                              MemberDecorate 518(Block) 7 Offset 40
-                              Decorate 518(Block) Block
-                              Decorate 520(block) DescriptorSet 0
-                              Decorate 520(block) Binding 1
-                              Decorate 521(si16) SpecId 100
-                              Decorate 522(su16) SpecId 101
+                              MemberDecorate 530(Block) 0 Offset 0
+                              MemberDecorate 530(Block) 1 Offset 4
+                              MemberDecorate 530(Block) 2 Offset 8
+                              MemberDecorate 530(Block) 3 Offset 16
+                              MemberDecorate 530(Block) 4 Offset 24
+                              MemberDecorate 530(Block) 5 Offset 28
+                              MemberDecorate 530(Block) 6 Offset 32
+                              MemberDecorate 530(Block) 7 Offset 40
+                              Decorate 530(Block) Block
+                              Decorate 532(block) DescriptorSet 0
+                              Decorate 532(block) Binding 1
+                              Decorate 533(si16) SpecId 100
+                              Decorate 534(su16) SpecId 101
                2:             TypeVoid
                3:             TypeFunction 2
               14:             TypeInt 16 1
@@ -185,11 +185,11 @@
              443:             TypeVector 36(int16_t) 4
              444:             TypePointer Function 443(i16vec4)
              456:             TypePointer Function 425(bvec3)
-      518(Block):             TypeStruct 14(int16_t) 52(i16vec2) 197(i16vec3) 432(i16vec4) 36(int16_t) 57(i16vec2) 193(i16vec3) 443(i16vec4)
-             519:             TypePointer Uniform 518(Block)
-      520(block):    519(ptr) Variable Uniform
-       521(si16): 14(int16_t) SpecConstant 4294967286
-       522(su16): 36(int16_t) SpecConstant 20
+      530(Block):             TypeStruct 14(int16_t) 52(i16vec2) 197(i16vec3) 432(i16vec4) 36(int16_t) 57(i16vec2) 193(i16vec3) 443(i16vec4)
+             531:             TypePointer Uniform 530(Block)
+      532(block):    531(ptr) Variable Uniform
+       533(si16): 14(int16_t) SpecConstant 4294967286
+       534(su16): 36(int16_t) SpecConstant 20
          4(main):           2 Function None 3
                5:             Label
                               Return
@@ -674,68 +674,86 @@
              463: 14(int16_t) Load 346(i16)
              464: 52(i16vec2) CompositeConstruct 463 463
              465:  174(bvec2) SLessThan 462 464
-             466:  425(bvec3) Load 457(bv)
-             467:  425(bvec3) VectorShuffle 466 465 3 4 2
-                              Store 457(bv) 467
-             468:193(i16vec3) Load 356(u16v)
-             469: 36(int16_t) Load 358(u16)
-             470:193(i16vec3) CompositeConstruct 469 469 469
-             471:  425(bvec3) ULessThanEqual 468 470
-                              Store 457(bv) 471
-             472: 52(i16vec2) Load 343(i16v)
-             473: 14(int16_t) Load 346(i16)
-             474: 52(i16vec2) CompositeConstruct 473 473
-             475:  174(bvec2) SLessThanEqual 472 474
-             476:  425(bvec3) Load 457(bv)
-             477:  425(bvec3) VectorShuffle 476 475 3 4 2
-                              Store 457(bv) 477
-             478:193(i16vec3) Load 356(u16v)
-             479: 36(int16_t) Load 358(u16)
-             480:193(i16vec3) CompositeConstruct 479 479 479
-             481:  425(bvec3) UGreaterThan 478 480
-                              Store 457(bv) 481
-             482: 52(i16vec2) Load 343(i16v)
-             483: 14(int16_t) Load 346(i16)
-             484: 52(i16vec2) CompositeConstruct 483 483
-             485:  174(bvec2) SGreaterThan 482 484
-             486:  425(bvec3) Load 457(bv)
-             487:  425(bvec3) VectorShuffle 486 485 3 4 2
-                              Store 457(bv) 487
-             488:193(i16vec3) Load 356(u16v)
-             489: 36(int16_t) Load 358(u16)
-             490:193(i16vec3) CompositeConstruct 489 489 489
-             491:  425(bvec3) UGreaterThanEqual 488 490
-                              Store 457(bv) 491
-             492: 52(i16vec2) Load 343(i16v)
-             493: 14(int16_t) Load 346(i16)
-             494: 52(i16vec2) CompositeConstruct 493 493
-             495:  174(bvec2) SGreaterThanEqual 492 494
-             496:  425(bvec3) Load 457(bv)
-             497:  425(bvec3) VectorShuffle 496 495 3 4 2
+             466:    280(ptr) AccessChain 457(bv) 282
+             467:   173(bool) CompositeExtract 465 0
+                              Store 466 467
+             468:    280(ptr) AccessChain 457(bv) 264
+             469:   173(bool) CompositeExtract 465 1
+                              Store 468 469
+             470:193(i16vec3) Load 356(u16v)
+             471: 36(int16_t) Load 358(u16)
+             472:193(i16vec3) CompositeConstruct 471 471 471
+             473:  425(bvec3) ULessThanEqual 470 472
+                              Store 457(bv) 473
+             474: 52(i16vec2) Load 343(i16v)
+             475: 14(int16_t) Load 346(i16)
+             476: 52(i16vec2) CompositeConstruct 475 475
+             477:  174(bvec2) SLessThanEqual 474 476
+             478:    280(ptr) AccessChain 457(bv) 282
+             479:   173(bool) CompositeExtract 477 0
+                              Store 478 479
+             480:    280(ptr) AccessChain 457(bv) 264
+             481:   173(bool) CompositeExtract 477 1
+                              Store 480 481
+             482:193(i16vec3) Load 356(u16v)
+             483: 36(int16_t) Load 358(u16)
+             484:193(i16vec3) CompositeConstruct 483 483 483
+             485:  425(bvec3) UGreaterThan 482 484
+                              Store 457(bv) 485
+             486: 52(i16vec2) Load 343(i16v)
+             487: 14(int16_t) Load 346(i16)
+             488: 52(i16vec2) CompositeConstruct 487 487
+             489:  174(bvec2) SGreaterThan 486 488
+             490:    280(ptr) AccessChain 457(bv) 282
+             491:   173(bool) CompositeExtract 489 0
+                              Store 490 491
+             492:    280(ptr) AccessChain 457(bv) 264
+             493:   173(bool) CompositeExtract 489 1
+                              Store 492 493
+             494:193(i16vec3) Load 356(u16v)
+             495: 36(int16_t) Load 358(u16)
+             496:193(i16vec3) CompositeConstruct 495 495 495
+             497:  425(bvec3) UGreaterThanEqual 494 496
                               Store 457(bv) 497
-             498:193(i16vec3) Load 356(u16v)
-             499: 36(int16_t) Load 358(u16)
-             500:193(i16vec3) CompositeConstruct 499 499 499
-             501:  425(bvec3) IEqual 498 500
-                              Store 457(bv) 501
-             502: 52(i16vec2) Load 343(i16v)
-             503: 14(int16_t) Load 346(i16)
-             504: 52(i16vec2) CompositeConstruct 503 503
-             505:  174(bvec2) IEqual 502 504
-             506:  425(bvec3) Load 457(bv)
-             507:  425(bvec3) VectorShuffle 506 505 3 4 2
-                              Store 457(bv) 507
-             508:193(i16vec3) Load 356(u16v)
-             509: 36(int16_t) Load 358(u16)
-             510:193(i16vec3) CompositeConstruct 509 509 509
-             511:  425(bvec3) INotEqual 508 510
-                              Store 457(bv) 511
-             512: 52(i16vec2) Load 343(i16v)
-             513: 14(int16_t) Load 346(i16)
-             514: 52(i16vec2) CompositeConstruct 513 513
-             515:  174(bvec2) INotEqual 512 514
-             516:  425(bvec3) Load 457(bv)
-             517:  425(bvec3) VectorShuffle 516 515 3 4 2
-                              Store 457(bv) 517
+             498: 52(i16vec2) Load 343(i16v)
+             499: 14(int16_t) Load 346(i16)
+             500: 52(i16vec2) CompositeConstruct 499 499
+             501:  174(bvec2) SGreaterThanEqual 498 500
+             502:    280(ptr) AccessChain 457(bv) 282
+             503:   173(bool) CompositeExtract 501 0
+                              Store 502 503
+             504:    280(ptr) AccessChain 457(bv) 264
+             505:   173(bool) CompositeExtract 501 1
+                              Store 504 505
+             506:193(i16vec3) Load 356(u16v)
+             507: 36(int16_t) Load 358(u16)
+             508:193(i16vec3) CompositeConstruct 507 507 507
+             509:  425(bvec3) IEqual 506 508
+                              Store 457(bv) 509
+             510: 52(i16vec2) Load 343(i16v)
+             511: 14(int16_t) Load 346(i16)
+             512: 52(i16vec2) CompositeConstruct 511 511
+             513:  174(bvec2) IEqual 510 512
+             514:    280(ptr) AccessChain 457(bv) 282
+             515:   173(bool) CompositeExtract 513 0
+                              Store 514 515
+             516:    280(ptr) AccessChain 457(bv) 264
+             517:   173(bool) CompositeExtract 513 1
+                              Store 516 517
+             518:193(i16vec3) Load 356(u16v)
+             519: 36(int16_t) Load 358(u16)
+             520:193(i16vec3) CompositeConstruct 519 519 519
+             521:  425(bvec3) INotEqual 518 520
+                              Store 457(bv) 521
+             522: 52(i16vec2) Load 343(i16v)
+             523: 14(int16_t) Load 346(i16)
+             524: 52(i16vec2) CompositeConstruct 523 523
+             525:  174(bvec2) INotEqual 522 524
+             526:    280(ptr) AccessChain 457(bv) 282
+             527:   173(bool) CompositeExtract 525 0
+                              Store 526 527
+             528:    280(ptr) AccessChain 457(bv) 264
+             529:   173(bool) CompositeExtract 525 1
+                              Store 528 529
                               Return
                               FunctionEnd
diff --git a/third_party/vulkan-deps/glslang/src/Test/baseResults/uint.frag.out b/third_party/vulkan-deps/glslang/src/Test/baseResults/uint.frag.out
index 3a12d6b..ce6d02d 100644
--- a/third_party/vulkan-deps/glslang/src/Test/baseResults/uint.frag.out
+++ b/third_party/vulkan-deps/glslang/src/Test/baseResults/uint.frag.out
@@ -134,7 +134,7 @@
 0:59        Condition
 0:59        Compare Equal ( temp bool)
 0:59          'shiftedii' ( temp mediump int)
-0:59          Convert uint to int ( temp int)
+0:59          Convert uint to int ( temp mediump int)
 0:59            'shiftedui' ( temp mediump uint)
 0:59        true case
 0:60        move second child to first child ( temp mediump 4-component vector of uint)
@@ -433,7 +433,7 @@
 0:59        Condition
 0:59        Compare Equal ( temp bool)
 0:59          'shiftedii' ( temp mediump int)
-0:59          Convert uint to int ( temp int)
+0:59          Convert uint to int ( temp mediump int)
 0:59            'shiftedui' ( temp mediump uint)
 0:59        true case
 0:60        move second child to first child ( temp mediump 4-component vector of uint)
diff --git a/third_party/vulkan-deps/glslang/src/Test/baseResults/vulkan.ast.vert.out b/third_party/vulkan-deps/glslang/src/Test/baseResults/vulkan.ast.vert.out
index 05a6355..68e892b 100644
--- a/third_party/vulkan-deps/glslang/src/Test/baseResults/vulkan.ast.vert.out
+++ b/third_party/vulkan-deps/glslang/src/Test/baseResults/vulkan.ast.vert.out
@@ -19,10 +19,10 @@
 0:14      Convert bool to float ( temp float)
 0:14        'scbt' ( specialization-constant const bool)
 0:14          true (const bool)
-0:15      Convert int to float ( temp float)
+0:15      Convert int to float ( temp highp float)
 0:15        'sci2' ( specialization-constant const highp int)
 0:15          2 (const int)
-0:17      Convert float to int ( temp int)
+0:17      Convert float to int ( temp highp int)
 0:17        'scf1' ( specialization-constant const highp float)
 0:17          1.000000
 0:18      Convert bool to int ( specialization-constant const int)
@@ -86,34 +86,34 @@
 0:35          2 (const int)
 0:35        'sci2' ( specialization-constant const highp int)
 0:35          2 (const int)
-0:37      Construct ivec2 ( specialization-constant const 2-component vector of int)
+0:37      Construct ivec2 ( specialization-constant const highp 2-component vector of int)
 0:37        'sci2' ( specialization-constant const highp int)
 0:37          2 (const int)
 0:37        'sci2' ( specialization-constant const highp int)
 0:37          2 (const int)
-0:38      Construct ivec2 ( temp 2-element array of 2-component vector of int)
-0:38        Construct ivec2 ( specialization-constant const 2-component vector of int)
+0:38      Construct ivec2 ( temp 2-element array of highp 2-component vector of int)
+0:38        Construct ivec2 ( specialization-constant const highp 2-component vector of int)
 0:38          'sci2' ( specialization-constant const highp int)
 0:38            2 (const int)
 0:38          'sci2' ( specialization-constant const highp int)
 0:38            2 (const int)
-0:38        Construct ivec2 ( specialization-constant const 2-component vector of int)
+0:38        Construct ivec2 ( specialization-constant const highp 2-component vector of int)
 0:38          'sci2' ( specialization-constant const highp int)
 0:38            2 (const int)
 0:38          'sci2' ( specialization-constant const highp int)
 0:38            2 (const int)
-0:40      Construct vec2 ( specialization-constant const 2-component vector of float)
+0:40      Construct vec2 ( specialization-constant const highp 2-component vector of float)
 0:40        'scf1' ( specialization-constant const highp float)
 0:40          1.000000
 0:40        'scf1' ( specialization-constant const highp float)
 0:40          1.000000
-0:41      Construct vec2 ( temp 2-element array of 2-component vector of float)
-0:41        Construct vec2 ( specialization-constant const 2-component vector of float)
+0:41      Construct vec2 ( temp 2-element array of highp 2-component vector of float)
+0:41        Construct vec2 ( specialization-constant const highp 2-component vector of float)
 0:41          'scf1' ( specialization-constant const highp float)
 0:41            1.000000
 0:41          'scf1' ( specialization-constant const highp float)
 0:41            1.000000
-0:41        Construct vec2 ( specialization-constant const 2-component vector of float)
+0:41        Construct vec2 ( specialization-constant const highp 2-component vector of float)
 0:41          'scf1' ( specialization-constant const highp float)
 0:41            1.000000
 0:41          'scf1' ( specialization-constant const highp float)
@@ -150,10 +150,10 @@
 0:14      Convert bool to float ( temp float)
 0:14        'scbt' ( specialization-constant const bool)
 0:14          true (const bool)
-0:15      Convert int to float ( temp float)
+0:15      Convert int to float ( temp highp float)
 0:15        'sci2' ( specialization-constant const highp int)
 0:15          2 (const int)
-0:17      Convert float to int ( temp int)
+0:17      Convert float to int ( temp highp int)
 0:17        'scf1' ( specialization-constant const highp float)
 0:17          1.000000
 0:18      Convert bool to int ( specialization-constant const int)
@@ -217,34 +217,34 @@
 0:35          2 (const int)
 0:35        'sci2' ( specialization-constant const highp int)
 0:35          2 (const int)
-0:37      Construct ivec2 ( specialization-constant const 2-component vector of int)
+0:37      Construct ivec2 ( specialization-constant const highp 2-component vector of int)
 0:37        'sci2' ( specialization-constant const highp int)
 0:37          2 (const int)
 0:37        'sci2' ( specialization-constant const highp int)
 0:37          2 (const int)
-0:38      Construct ivec2 ( temp 2-element array of 2-component vector of int)
-0:38        Construct ivec2 ( specialization-constant const 2-component vector of int)
+0:38      Construct ivec2 ( temp 2-element array of highp 2-component vector of int)
+0:38        Construct ivec2 ( specialization-constant const highp 2-component vector of int)
 0:38          'sci2' ( specialization-constant const highp int)
 0:38            2 (const int)
 0:38          'sci2' ( specialization-constant const highp int)
 0:38            2 (const int)
-0:38        Construct ivec2 ( specialization-constant const 2-component vector of int)
+0:38        Construct ivec2 ( specialization-constant const highp 2-component vector of int)
 0:38          'sci2' ( specialization-constant const highp int)
 0:38            2 (const int)
 0:38          'sci2' ( specialization-constant const highp int)
 0:38            2 (const int)
-0:40      Construct vec2 ( specialization-constant const 2-component vector of float)
+0:40      Construct vec2 ( specialization-constant const highp 2-component vector of float)
 0:40        'scf1' ( specialization-constant const highp float)
 0:40          1.000000
 0:40        'scf1' ( specialization-constant const highp float)
 0:40          1.000000
-0:41      Construct vec2 ( temp 2-element array of 2-component vector of float)
-0:41        Construct vec2 ( specialization-constant const 2-component vector of float)
+0:41      Construct vec2 ( temp 2-element array of highp 2-component vector of float)
+0:41        Construct vec2 ( specialization-constant const highp 2-component vector of float)
 0:41          'scf1' ( specialization-constant const highp float)
 0:41            1.000000
 0:41          'scf1' ( specialization-constant const highp float)
 0:41            1.000000
-0:41        Construct vec2 ( specialization-constant const 2-component vector of float)
+0:41        Construct vec2 ( specialization-constant const highp 2-component vector of float)
 0:41          'scf1' ( specialization-constant const highp float)
 0:41            1.000000
 0:41          'scf1' ( specialization-constant const highp float)
diff --git a/third_party/vulkan-deps/glslang/src/Test/hlsl.imagefetch-subvec4.comp b/third_party/vulkan-deps/glslang/src/Test/hlsl.imagefetch-subvec4.comp
index 2a83dd2..a5d70c2 100644
--- a/third_party/vulkan-deps/glslang/src/Test/hlsl.imagefetch-subvec4.comp
+++ b/third_party/vulkan-deps/glslang/src/Test/hlsl.imagefetch-subvec4.comp
@@ -1,8 +1,41 @@
-Texture3D<int> IN: register(t0);
-RWTexture3D<uint> OUT: register(u1);
+Texture1D<float>            i1D:            register(t0);
+Texture2D<float>            i2D:            register(t1);
+Texture3D<float>            i3D:            register(t2);
+Texture1DArray<float>       i1DArray:       register(t3);
+Texture2DArray<float>       i2DArray:       register(t4);
+Texture2DMS<float>          i2DMS:          register(t5);
+Texture2DMSArray<float>     i2DMSArray:     register(t6);
+
+Texture1D<int>              ii1D:           register(t7);
+Texture2D<int>              ii2D:           register(t8);
+Texture3D<int>              ii3D:           register(t9);
+Texture1DArray<int>         ii1DArray:      register(t10);
+Texture2DArray<int>         ii2DArray:      register(t11);
+Texture2DMS<int>            ii2DMS:         register(t12);
+Texture2DMSArray<int>       ii2DMSArray:    register(t13);
+
+RWTexture3D<float> OUT: register(u0);
 
 [numthreads(8,8,8)]
 void main(uint3 tid: SV_DispatchThreadID)
 {
-    OUT[tid] = IN[tid];
+    float f = 0.0;
+    f += i1D[tid.x];
+    f += i2D[tid.xy];
+    f += i3D[tid];
+    f += i1DArray[tid.xy];
+    f += i2DArray[tid];
+    f += i2DMS.Load(tid.xy, 1);
+    f += i2DMSArray.Load(tid, 3);
+
+    int i = 0.0;
+    i += ii1D[tid.x];
+    i += ii2D[tid.xy];
+    i += ii3D[tid];
+    i += ii1DArray[tid.xy];
+    i += ii2DArray[tid];
+    i += ii2DMS.Load(tid.xy, 1);
+    i += ii2DMSArray.Load(tid, 3);
+
+    OUT[tid] = f + float(i);
 }
diff --git a/third_party/vulkan-deps/glslang/src/Test/hlsl.imageload-subvec4.comp b/third_party/vulkan-deps/glslang/src/Test/hlsl.imageload-subvec4.comp
new file mode 100644
index 0000000..b465cdb
--- /dev/null
+++ b/third_party/vulkan-deps/glslang/src/Test/hlsl.imageload-subvec4.comp
@@ -0,0 +1,33 @@
+RWTexture1D<float>          i1D:            register(u0);
+RWTexture2D<float>          i2D:            register(u1);
+RWTexture3D<float>          i3D:            register(u2);
+RWTexture1DArray<float>     i1DArray:       register(u3);
+RWTexture2DArray<float>     i2DArray:       register(u4);
+
+RWTexture1D<int>            ii1D:           register(u5);
+RWTexture2D<int>            ii2D:           register(u6);
+RWTexture3D<int>            ii3D:           register(u7);
+RWTexture1DArray<int>       ii1DArray:      register(u8);
+RWTexture2DArray<int>       ii2DArray:      register(u9);
+
+RWTexture3D<float> OUT: register(u10);
+
+[numthreads(8,8,8)]
+void main(uint3 tid: SV_DispatchThreadID)
+{
+    float f = 0.0;
+    f += i1D[tid.x];
+    f += i2D[tid.xy];
+    f += i3D[tid];
+    f += i1DArray[tid.xy];
+    f += i2DArray[tid];
+
+    int i = 0.0;
+    i += ii1D[tid.x];
+    i += ii2D[tid.xy];
+    i += ii3D[tid];
+    i += ii1DArray[tid.xy];
+    i += ii2DArray[tid];
+
+    OUT[tid] = f + float(i);
+}
diff --git a/third_party/vulkan-deps/glslang/src/Test/spv.AnyHitShaderMotion.rahit b/third_party/vulkan-deps/glslang/src/Test/spv.AnyHitShaderMotion.rahit
new file mode 100644
index 0000000..6972577
--- /dev/null
+++ b/third_party/vulkan-deps/glslang/src/Test/spv.AnyHitShaderMotion.rahit
@@ -0,0 +1,6 @@
+#version 460
+#extension GL_NV_ray_tracing_motion_blur : enable
+void main()
+{
+	float time = gl_CurrentRayTimeNV + 0.5f;
+}
diff --git a/third_party/vulkan-deps/glslang/src/Test/spv.ClosestHitShaderMotion.rchit b/third_party/vulkan-deps/glslang/src/Test/spv.ClosestHitShaderMotion.rchit
new file mode 100644
index 0000000..42a1838
--- /dev/null
+++ b/third_party/vulkan-deps/glslang/src/Test/spv.ClosestHitShaderMotion.rchit
@@ -0,0 +1,10 @@
+#version 460
+#extension GL_EXT_ray_tracing : enable
+#extension GL_NV_ray_tracing_motion_blur : enable
+layout(binding = 0, set = 0) uniform accelerationStructureEXT accEXT;
+layout(location = 0) rayPayloadInEXT vec4 incomingPayloadEXT;
+void main()
+{
+	float time = gl_CurrentRayTimeNV + 0.5f;
+	traceRayMotionNV(accEXT, 0u, 1u, 2u, 3u, 0u, vec3(0.5f), 0.5f, vec3(1.0f), 0.75f, 1.0, 0);
+}
diff --git a/third_party/vulkan-deps/glslang/src/Test/spv.IntersectShaderMotion.rint b/third_party/vulkan-deps/glslang/src/Test/spv.IntersectShaderMotion.rint
new file mode 100644
index 0000000..6972577
--- /dev/null
+++ b/third_party/vulkan-deps/glslang/src/Test/spv.IntersectShaderMotion.rint
@@ -0,0 +1,6 @@
+#version 460
+#extension GL_NV_ray_tracing_motion_blur : enable
+void main()
+{
+	float time = gl_CurrentRayTimeNV + 0.5f;
+}
diff --git a/third_party/vulkan-deps/glslang/src/Test/spv.MissShaderMotion.rmiss b/third_party/vulkan-deps/glslang/src/Test/spv.MissShaderMotion.rmiss
new file mode 100644
index 0000000..3a3dcb1
--- /dev/null
+++ b/third_party/vulkan-deps/glslang/src/Test/spv.MissShaderMotion.rmiss
@@ -0,0 +1,10 @@
+#version 460
+#extension GL_EXT_ray_tracing : enable
+#extension GL_NV_ray_tracing_motion_blur : enable
+layout(binding = 0, set = 0) uniform accelerationStructureEXT accEXT;
+layout(location = 0) rayPayloadEXT vec4  localPayloadEXT;
+void main()
+{
+	float time = gl_CurrentRayTimeNV + 0.5f;
+	traceRayMotionNV(accEXT, 0u, 1u, 2u, 3u, 0u, vec3(0.5f), 0.5f, vec3(1.0f), 0.75f, 1.0f, 0);
+}
diff --git a/third_party/vulkan-deps/glslang/src/Test/spv.RayGenShaderMotion.rgen b/third_party/vulkan-deps/glslang/src/Test/spv.RayGenShaderMotion.rgen
new file mode 100644
index 0000000..c38fffe
--- /dev/null
+++ b/third_party/vulkan-deps/glslang/src/Test/spv.RayGenShaderMotion.rgen
@@ -0,0 +1,13 @@
+#version 460
+#extension GL_EXT_ray_tracing : enable
+#extension GL_NV_ray_tracing_motion_blur : enable
+layout(binding = 0, set = 0) uniform accelerationStructureEXT accEXT;
+layout(location = 0) rayPayloadEXT vec4 payloadEXT;
+void main()
+{
+    uint lx = gl_LaunchIDEXT.x;
+    uint ly = gl_LaunchIDEXT.y;
+    uint sx = gl_LaunchSizeEXT.x;
+    uint sy = gl_LaunchSizeEXT.y;
+    traceRayMotionNV(accEXT,  lx, ly, sx, sy, 0u, vec3(0.5), 0.5f, vec3(1.0), 0.75f, 0.5, 0);
+}
diff --git a/third_party/vulkan-deps/glslang/src/Test/spv.atomicAdd.bufferReference.comp b/third_party/vulkan-deps/glslang/src/Test/spv.atomicAdd.bufferReference.comp
new file mode 100644
index 0000000..fdd031d
--- /dev/null
+++ b/third_party/vulkan-deps/glslang/src/Test/spv.atomicAdd.bufferReference.comp
@@ -0,0 +1,50 @@
+#version 450 core
+#pragma use_vulkan_memory_model
+#extension GL_KHR_shader_subgroup_basic : enable
+#extension GL_KHR_shader_subgroup_shuffle : enable
+#extension GL_KHR_shader_subgroup_ballot : enable
+#extension GL_KHR_memory_scope_semantics : enable
+#extension GL_ARB_gpu_shader_int64 : enable
+#extension GL_EXT_buffer_reference : enable
+// DIM/NUM_WORKGROUP_EACH_DIM overriden by spec constants
+layout(constant_id = 0) const int DIM = 1;
+layout(constant_id = 1) const int NUM_WORKGROUP_EACH_DIM = 1;
+shared bool sharedSkip;
+layout(local_size_x_id = 0, local_size_y_id = 0, local_size_z = 1) in;
+layout(buffer_reference) buffer PayloadRef { uint x[]; };
+layout(buffer_reference) buffer GuardRef { uint x[]; };
+layout(set=0, binding=2) buffer Fail { uint x[]; } fail;
+layout (push_constant, std430) uniform PC {
+   layout(offset = 0) PayloadRef payloadref;
+layout(offset = 8) GuardRef guard;
+};
+void main()
+{
+   bool pass = true;
+   bool skip = false;
+   sharedSkip = false;
+   nonprivate PayloadRef payload = payloadref;
+   ivec2 globalId          = ivec2(gl_GlobalInvocationID.xy);
+   ivec2 partnerGlobalId   = ivec2(DIM*NUM_WORKGROUP_EACH_DIM-1) - ivec2(gl_GlobalInvocationID.xy);
+   uint bufferCoord        = globalId.y * DIM*NUM_WORKGROUP_EACH_DIM + globalId.x;
+   uint partnerBufferCoord = partnerGlobalId.y * DIM*NUM_WORKGROUP_EACH_DIM + partnerGlobalId.x;
+   ivec2 imageCoord        = globalId;
+   ivec2 partnerImageCoord = partnerGlobalId;
+   ivec2 globalId00          = ivec2(DIM) * ivec2(gl_WorkGroupID.xy);
+   ivec2 partnerGlobalId00   = ivec2(DIM) * (ivec2(NUM_WORKGROUP_EACH_DIM-1) - ivec2(gl_WorkGroupID.xy));
+   uint bufferCoord00        = globalId00.y * DIM*NUM_WORKGROUP_EACH_DIM + globalId00.x;
+   uint partnerBufferCoord00 = partnerGlobalId00.y * DIM*NUM_WORKGROUP_EACH_DIM + partnerGlobalId00.x;
+   ivec2 imageCoord00        = globalId00;
+   ivec2 partnerImageCoord00 = partnerGlobalId00;
+   payload.x[bufferCoord] = bufferCoord + (payload.x[partnerBufferCoord]>>31);
+   controlBarrier(gl_ScopeWorkgroup, gl_ScopeWorkgroup, gl_StorageSemanticsBuffer | gl_StorageSemanticsShared, gl_SemanticsAcquireRelease | gl_SemanticsMakeAvailable);
+   if (all(equal(gl_LocalInvocationID.xy, ivec2(0,0)))) {
+       atomicStore(guard.x[bufferCoord], uint(1u), gl_ScopeDevice, gl_StorageSemanticsBuffer, gl_SemanticsRelease | gl_SemanticsMakeAvailable);
+       skip = atomicLoad(guard.x[partnerBufferCoord00], gl_ScopeDevice, gl_StorageSemanticsBuffer, gl_SemanticsAcquire | gl_SemanticsMakeVisible) == 0;
+       sharedSkip = skip;
+   }
+   controlBarrier(gl_ScopeWorkgroup, gl_ScopeWorkgroup, gl_StorageSemanticsBuffer | gl_StorageSemanticsShared, gl_SemanticsAcquireRelease | gl_SemanticsMakeVisible);
+   skip = sharedSkip;
+   uint r = payload.x[partnerBufferCoord];
+   if (!skip && r != uint(partnerBufferCoord)) { fail.x[bufferCoord] = 1; }
+}
\ No newline at end of file
diff --git a/third_party/vulkan-deps/glslang/src/Test/spv.invariantAll.vert b/third_party/vulkan-deps/glslang/src/Test/spv.invariantAll.vert
new file mode 100644
index 0000000..e094aa0
--- /dev/null
+++ b/third_party/vulkan-deps/glslang/src/Test/spv.invariantAll.vert
@@ -0,0 +1,10 @@
+#version 450 core
+#pragma STDGL invariant(all)
+
+layout(location=0) out highp float v;
+
+void main()
+{
+    gl_Position = vec4(v, v, 0, 1);
+}
+
diff --git a/third_party/vulkan-deps/glslang/src/Test/spv.scalarlayout.frag b/third_party/vulkan-deps/glslang/src/Test/spv.scalarlayout.frag
index c7ecf50..e0e1b18 100644
--- a/third_party/vulkan-deps/glslang/src/Test/spv.scalarlayout.frag
+++ b/third_party/vulkan-deps/glslang/src/Test/spv.scalarlayout.frag
@@ -27,6 +27,8 @@
     S          i[2];  // offset = 160 (aligned to multiple of 8) stride = 48

 };

 

+layout (std430) uniform;

+

 void main()

 {

 }

diff --git a/third_party/vulkan-deps/glslang/src/glslang/HLSL/hlslParseHelper.cpp b/third_party/vulkan-deps/glslang/src/glslang/HLSL/hlslParseHelper.cpp
index d62f392..02aac3c 100644
--- a/third_party/vulkan-deps/glslang/src/glslang/HLSL/hlslParseHelper.cpp
+++ b/third_party/vulkan-deps/glslang/src/glslang/HLSL/hlslParseHelper.cpp
@@ -6689,12 +6689,6 @@
 
 //
 // Merge characteristics of the 'src' qualifier into the 'dst'.
-// If there is duplication, issue error messages, unless 'force'
-// is specified, which means to just override default settings.
-//
-// Also, when force is false, it will be assumed that 'src' follows
-// 'dst', for the purpose of error checking order for versions
-// that require specific orderings of qualifiers.
 //
 void HlslParseContext::mergeQualifiers(TQualifier& dst, const TQualifier& src)
 {
@@ -6712,8 +6706,7 @@
     mergeObjectLayoutQualifiers(dst, src, false);
 
     // individual qualifiers
-    bool repeated = false;
-#define MERGE_SINGLETON(field) repeated |= dst.field && src.field; dst.field |= src.field;
+#define MERGE_SINGLETON(field) dst.field |= src.field;
     MERGE_SINGLETON(invariant);
     MERGE_SINGLETON(noContraction);
     MERGE_SINGLETON(centroid);
diff --git a/third_party/vulkan-deps/glslang/src/glslang/Include/BaseTypes.h b/third_party/vulkan-deps/glslang/src/glslang/Include/BaseTypes.h
index 1d9da12..c8203c2 100644
--- a/third_party/vulkan-deps/glslang/src/glslang/Include/BaseTypes.h
+++ b/third_party/vulkan-deps/glslang/src/glslang/Include/BaseTypes.h
@@ -270,6 +270,7 @@
     EbvWorldToObject,
     EbvWorldToObject3x4,
     EbvIncomingRayFlags,
+    EbvCurrentRayTimeNV,
     // barycentrics
     EbvBaryCoordNV,
     EbvBaryCoordNoPerspNV,
@@ -475,6 +476,7 @@
     case EbvIncomingRayFlags:           return "IncomingRayFlagsNV";
     case EbvObjectToWorld:              return "ObjectToWorldNV";
     case EbvWorldToObject:              return "WorldToObjectNV";
+    case EbvCurrentRayTimeNV:           return "CurrentRayTimeNV";
 
     case EbvBaryCoordNV:                return "BaryCoordNV";
     case EbvBaryCoordNoPerspNV:         return "BaryCoordNoPerspNV";
diff --git a/third_party/vulkan-deps/glslang/src/glslang/Include/intermediate.h b/third_party/vulkan-deps/glslang/src/glslang/Include/intermediate.h
index 172c09c..595bd62 100644
--- a/third_party/vulkan-deps/glslang/src/glslang/Include/intermediate.h
+++ b/third_party/vulkan-deps/glslang/src/glslang/Include/intermediate.h
@@ -926,6 +926,7 @@
     EOpMul32x16,
 
     EOpTraceNV,
+    EOpTraceRayMotionNV,
     EOpTraceKHR,
     EOpReportIntersection,
     EOpIgnoreIntersectionNV,
@@ -1642,6 +1643,7 @@
     ~TIntermAggregate() { delete pragmaTable; }
     virtual       TIntermAggregate* getAsAggregate()       { return this; }
     virtual const TIntermAggregate* getAsAggregate() const { return this; }
+    virtual void updatePrecision();
     virtual void setOperator(TOperator o) { op = o; }
     virtual       TIntermSequence& getSequence()       { return sequence; }
     virtual const TIntermSequence& getSequence() const { return sequence; }
diff --git a/third_party/vulkan-deps/glslang/src/glslang/MachineIndependent/Initialize.cpp b/third_party/vulkan-deps/glslang/src/glslang/MachineIndependent/Initialize.cpp
index a79925d..823406c 100644
--- a/third_party/vulkan-deps/glslang/src/glslang/MachineIndependent/Initialize.cpp
+++ b/third_party/vulkan-deps/glslang/src/glslang/MachineIndependent/Initialize.cpp
@@ -1864,6 +1864,22 @@
 
                 "\n");
         }
+        if (profile != EEsProfile && version == 450) {
+            commonBuiltins.append(
+                "uint atomicCounterAddARB(atomic_uint, uint);"
+                "uint atomicCounterSubtractARB(atomic_uint, uint);"
+                "uint atomicCounterMinARB(atomic_uint, uint);"
+                "uint atomicCounterMaxARB(atomic_uint, uint);"
+                "uint atomicCounterAndARB(atomic_uint, uint);"
+                "uint atomicCounterOrARB(atomic_uint, uint);"
+                "uint atomicCounterXorARB(atomic_uint, uint);"
+                "uint atomicCounterExchangeARB(atomic_uint, uint);"
+                "uint atomicCounterCompSwapARB(atomic_uint, uint, uint);"
+
+                "\n");
+        }
+
+
         if (profile != EEsProfile && version >= 460) {
             commonBuiltins.append(
                 "uint atomicCounterAdd(atomic_uint, uint);"
@@ -4661,7 +4677,7 @@
             "\n");
         }
 
-    // Builtins for GL_NV_ray_tracing/GL_EXT_ray_tracing/GL_EXT_ray_query
+    // Builtins for GL_NV_ray_tracing/GL_NV_ray_tracing_motion_blur/GL_EXT_ray_tracing/GL_EXT_ray_query
     if (profile != EEsProfile && version >= 460) {
          commonBuiltins.append("void rayQueryInitializeEXT(rayQueryEXT, accelerationStructureEXT, uint, uint, vec3, float, vec3, float);"
             "void rayQueryTerminateEXT(rayQueryEXT);"
@@ -4690,6 +4706,7 @@
 
         stageBuiltins[EShLangRayGen].append(
             "void traceNV(accelerationStructureNV,uint,uint,uint,uint,uint,vec3,float,vec3,float,int);"
+            "void traceRayMotionNV(accelerationStructureNV,uint,uint,uint,uint,uint,vec3,float,vec3,float,float,int);"
             "void traceRayEXT(accelerationStructureEXT,uint,uint,uint,uint,uint,vec3,float,vec3,float,int);"
             "void executeCallableNV(uint, int);"
             "void executeCallableEXT(uint, int);"
@@ -4704,12 +4721,14 @@
             "\n");
         stageBuiltins[EShLangClosestHit].append(
             "void traceNV(accelerationStructureNV,uint,uint,uint,uint,uint,vec3,float,vec3,float,int);"
+            "void traceRayMotionNV(accelerationStructureNV,uint,uint,uint,uint,uint,vec3,float,vec3,float,float,int);"
             "void traceRayEXT(accelerationStructureEXT,uint,uint,uint,uint,uint,vec3,float,vec3,float,int);"
             "void executeCallableNV(uint, int);"
             "void executeCallableEXT(uint, int);"
             "\n");
         stageBuiltins[EShLangMiss].append(
             "void traceNV(accelerationStructureNV,uint,uint,uint,uint,uint,vec3,float,vec3,float,int);"
+            "void traceRayMotionNV(accelerationStructureNV,uint,uint,uint,uint,uint,vec3,float,vec3,float,float,int);"
             "void traceRayEXT(accelerationStructureEXT,uint,uint,uint,uint,uint,vec3,float,vec3,float,int);"
             "void executeCallableNV(uint, int);"
             "void executeCallableEXT(uint, int);"
@@ -5918,6 +5937,7 @@
             "in    mat3x4 gl_WorldToObject3x4EXT;"
             "in    uint   gl_IncomingRayFlagsNV;"
             "in    uint   gl_IncomingRayFlagsEXT;"
+            "in    float  gl_CurrentRayTimeNV;"
             "\n";
         const char *hitDecls =
             "in    uvec3  gl_LaunchIDNV;"
@@ -5953,6 +5973,7 @@
             "in    mat3x4 gl_WorldToObject3x4EXT;"
             "in    uint   gl_IncomingRayFlagsNV;"
             "in    uint   gl_IncomingRayFlagsEXT;"
+            "in    float  gl_CurrentRayTimeNV;"
             "\n";
         const char *missDecls =
             "in    uvec3  gl_LaunchIDNV;"
@@ -5971,6 +5992,7 @@
             "in    float  gl_RayTmaxEXT;"
             "in    uint   gl_IncomingRayFlagsNV;"
             "in    uint   gl_IncomingRayFlagsEXT;"
+            "in    float  gl_CurrentRayTimeNV;"
             "\n";
 
         const char *callableDecls =
@@ -8261,6 +8283,19 @@
             symbolTable.setFunctionExtensions("atomicCounter"         , 1, &E_GL_ARB_shader_atomic_counters);
         }
 
+        // E_GL_ARB_shader_atomic_counter_ops
+        if (profile != EEsProfile && version == 450) {
+            symbolTable.setFunctionExtensions("atomicCounterAddARB"     , 1, &E_GL_ARB_shader_atomic_counter_ops);
+            symbolTable.setFunctionExtensions("atomicCounterSubtractARB", 1, &E_GL_ARB_shader_atomic_counter_ops);
+            symbolTable.setFunctionExtensions("atomicCounterMinARB"     , 1, &E_GL_ARB_shader_atomic_counter_ops);
+            symbolTable.setFunctionExtensions("atomicCounterMaxARB"     , 1, &E_GL_ARB_shader_atomic_counter_ops);
+            symbolTable.setFunctionExtensions("atomicCounterAndARB"     , 1, &E_GL_ARB_shader_atomic_counter_ops);
+            symbolTable.setFunctionExtensions("atomicCounterOrARB"      , 1, &E_GL_ARB_shader_atomic_counter_ops);
+            symbolTable.setFunctionExtensions("atomicCounterXorARB"     , 1, &E_GL_ARB_shader_atomic_counter_ops);
+            symbolTable.setFunctionExtensions("atomicCounterExchangeARB", 1, &E_GL_ARB_shader_atomic_counter_ops);
+            symbolTable.setFunctionExtensions("atomicCounterCompSwapARB", 1, &E_GL_ARB_shader_atomic_counter_ops);
+        }
+
         // E_GL_ARB_derivative_control
         if (profile != EEsProfile && version < 450) {
             symbolTable.setFunctionExtensions("dFdxFine",     1, &E_GL_ARB_derivative_control);
@@ -8789,11 +8824,13 @@
             symbolTable.setVariableExtensions("gl_WorldToObject3x4EXT", 1, &E_GL_EXT_ray_tracing);
             symbolTable.setVariableExtensions("gl_IncomingRayFlagsNV", 1, &E_GL_NV_ray_tracing);
             symbolTable.setVariableExtensions("gl_IncomingRayFlagsEXT", 1, &E_GL_EXT_ray_tracing);
+            symbolTable.setVariableExtensions("gl_CurrentRayTimeNV", 1, &E_GL_NV_ray_tracing_motion_blur);
 
             symbolTable.setVariableExtensions("gl_DeviceIndex", 1, &E_GL_EXT_device_group);
 
 
             symbolTable.setFunctionExtensions("traceNV", 1, &E_GL_NV_ray_tracing);
+            symbolTable.setFunctionExtensions("traceRayMotionNV", 1, &E_GL_NV_ray_tracing_motion_blur);
             symbolTable.setFunctionExtensions("traceRayEXT", 1, &E_GL_EXT_ray_tracing);
             symbolTable.setFunctionExtensions("reportIntersectionNV", 1, &E_GL_NV_ray_tracing);
             symbolTable.setFunctionExtensions("reportIntersectionEXT", 1, &E_GL_EXT_ray_tracing);
@@ -8837,6 +8874,7 @@
             BuiltInVariable("gl_IncomingRayFlagsNV",     EbvIncomingRayFlags,   symbolTable);
             BuiltInVariable("gl_IncomingRayFlagsEXT",    EbvIncomingRayFlags,   symbolTable);
             BuiltInVariable("gl_DeviceIndex",            EbvDeviceIndex,        symbolTable);
+            BuiltInVariable("gl_CurrentRayTimeNV",       EbvCurrentRayTimeNV,   symbolTable);
 
             // GL_ARB_shader_ballot
             symbolTable.setVariableExtensions("gl_SubGroupSizeARB",       1, &E_GL_ARB_shader_ballot);
@@ -9261,6 +9299,18 @@
     symbolTable.relateToOperator("clockRealtimeEXT",     EOpReadClockDeviceKHR);
     symbolTable.relateToOperator("clockRealtime2x32EXT", EOpReadClockDeviceKHR);
 
+    if (profile != EEsProfile && version == 450) {
+        symbolTable.relateToOperator("atomicCounterAddARB",      EOpAtomicCounterAdd);
+        symbolTable.relateToOperator("atomicCounterSubtractARB", EOpAtomicCounterSubtract);
+        symbolTable.relateToOperator("atomicCounterMinARB",      EOpAtomicCounterMin);
+        symbolTable.relateToOperator("atomicCounterMaxARB",      EOpAtomicCounterMax);
+        symbolTable.relateToOperator("atomicCounterAndARB",      EOpAtomicCounterAnd);
+        symbolTable.relateToOperator("atomicCounterOrARB",       EOpAtomicCounterOr);
+        symbolTable.relateToOperator("atomicCounterXorARB",      EOpAtomicCounterXor);
+        symbolTable.relateToOperator("atomicCounterExchangeARB", EOpAtomicCounterExchange);
+        symbolTable.relateToOperator("atomicCounterCompSwapARB", EOpAtomicCounterCompSwap);
+    }
+
     if (profile != EEsProfile && version >= 460) {
         symbolTable.relateToOperator("atomicCounterAdd",      EOpAtomicCounterAdd);
         symbolTable.relateToOperator("atomicCounterSubtract", EOpAtomicCounterSubtract);
@@ -9668,6 +9718,7 @@
     case EShLangMiss:
         if (profile != EEsProfile && version >= 460) {
             symbolTable.relateToOperator("traceNV", EOpTraceNV);
+            symbolTable.relateToOperator("traceRayMotionNV", EOpTraceRayMotionNV);
             symbolTable.relateToOperator("traceRayEXT", EOpTraceKHR);
             symbolTable.relateToOperator("executeCallableNV", EOpExecuteCallableNV);
             symbolTable.relateToOperator("executeCallableEXT", EOpExecuteCallableKHR);
diff --git a/third_party/vulkan-deps/glslang/src/glslang/MachineIndependent/Intermediate.cpp b/third_party/vulkan-deps/glslang/src/glslang/MachineIndependent/Intermediate.cpp
index d1123d4..1283f44 100644
--- a/third_party/vulkan-deps/glslang/src/glslang/MachineIndependent/Intermediate.cpp
+++ b/third_party/vulkan-deps/glslang/src/glslang/MachineIndependent/Intermediate.cpp
@@ -416,20 +416,24 @@
     // TODO: but, did this bypass constant folding?
     //
     switch (op) {
-    case EOpConstructInt8:
-    case EOpConstructUint8:
-    case EOpConstructInt16:
-    case EOpConstructUint16:
-    case EOpConstructInt:
-    case EOpConstructUint:
-    case EOpConstructInt64:
-    case EOpConstructUint64:
-    case EOpConstructBool:
-    case EOpConstructFloat:
-    case EOpConstructDouble:
-    case EOpConstructFloat16:
-        return child;
-    default: break; // some compilers want this
+        case EOpConstructInt8:
+        case EOpConstructUint8:
+        case EOpConstructInt16:
+        case EOpConstructUint16:
+        case EOpConstructInt:
+        case EOpConstructUint:
+        case EOpConstructInt64:
+        case EOpConstructUint64:
+        case EOpConstructBool:
+        case EOpConstructFloat:
+        case EOpConstructDouble:
+        case EOpConstructFloat16: {
+            TIntermUnary* unary_node = child->getAsUnaryNode();
+            if (unary_node != nullptr)
+                unary_node->updatePrecision();
+            return child;
+        }
+        default: break; // some compilers want this
     }
 
     //
@@ -1739,7 +1743,7 @@
         case EbtUint:
             switch (from) {
             case EbtInt:
-                return version >= 400 || getSource() == EShSourceHlsl;
+                return version >= 400 || getSource() == EShSourceHlsl || IsRequestedExtension(E_GL_ARB_gpu_shader5);
             case EbtBool:
                 return getSource() == EShSourceHlsl;
             case EbtInt16:
@@ -2676,7 +2680,11 @@
 // 'swizzleOkay' says whether or not it is okay to consider a swizzle
 // a valid part of the dereference chain.
 //
-const TIntermTyped* TIntermediate::findLValueBase(const TIntermTyped* node, bool swizzleOkay)
+// 'BufferReferenceOk' says if type is buffer_reference, the routine stop to find the most left node.
+//
+//
+
+const TIntermTyped* TIntermediate::findLValueBase(const TIntermTyped* node, bool swizzleOkay , bool bufferReferenceOk)
 {
     do {
         const TIntermBinary* binary = node->getAsBinaryNode();
@@ -2694,6 +2702,8 @@
                 return nullptr;
         }
         node = node->getAsBinaryNode()->getLeft();
+        if (bufferReferenceOk && node->isReference())
+            return node;
     } while (true);
 }
 
@@ -3772,6 +3782,28 @@
 
 // Propagate precision qualifiers *up* from children to parent, and then
 // back *down* again to the children's subtrees.
+void TIntermAggregate::updatePrecision()
+{
+    if (getBasicType() == EbtInt || getBasicType() == EbtUint ||
+        getBasicType() == EbtFloat || getBasicType() == EbtFloat16) {
+        TPrecisionQualifier maxPrecision = EpqNone;
+        TIntermSequence operands = getSequence();
+        for (unsigned int i = 0; i < operands.size(); ++i) {
+            TIntermTyped* typedNode = operands[i]->getAsTyped();
+            assert(typedNode);
+            maxPrecision = std::max(maxPrecision, typedNode->getQualifier().precision);
+        }
+        getQualifier().precision = maxPrecision;
+        for (unsigned int i = 0; i < operands.size(); ++i) {
+          TIntermTyped* typedNode = operands[i]->getAsTyped();
+          assert(typedNode);
+          typedNode->propagatePrecision(maxPrecision);
+        }
+    }
+}
+
+// Propagate precision qualifiers *up* from children to parent, and then
+// back *down* again to the children's subtrees.
 void TIntermBinary::updatePrecision()
 {
      if (getBasicType() == EbtInt || getBasicType() == EbtUint ||
diff --git a/third_party/vulkan-deps/glslang/src/glslang/MachineIndependent/ParseHelper.cpp b/third_party/vulkan-deps/glslang/src/glslang/MachineIndependent/ParseHelper.cpp
index c2b9edc..a2dd5a6 100644
--- a/third_party/vulkan-deps/glslang/src/glslang/MachineIndependent/ParseHelper.cpp
+++ b/third_party/vulkan-deps/glslang/src/glslang/MachineIndependent/ParseHelper.cpp
@@ -327,6 +327,16 @@
     block.getQualifier().layoutMatrix = ElmRowMajor;
 }
 
+void TParseContext::setInvariant(const TSourceLoc& loc, const char* builtin) {
+    TSymbol* symbol = symbolTable.find(builtin);
+    if (symbol && symbol->getType().getQualifier().isPipeOutput()) {
+        if (intermediate.inIoAccessed(builtin))
+            warn(loc, "changing qualification after use", "invariant", builtin);
+        TSymbol* csymbol = symbolTable.copyUp(symbol);
+        csymbol->getWritableType().getQualifier().invariant = true;
+    }
+}
+
 void TParseContext::handlePragma(const TSourceLoc& loc, const TVector<TString>& tokens)
 {
 #ifndef GLSLANG_WEB
@@ -404,8 +414,33 @@
         intermediate.setUseVariablePointers();
     } else if (tokens[0].compare("once") == 0) {
         warn(loc, "not implemented", "#pragma once", "");
-    } else if (tokens[0].compare("glslang_binary_double_output") == 0)
+    } else if (tokens[0].compare("glslang_binary_double_output") == 0) {
         intermediate.setBinaryDoubleOutput();
+    } else if (spvVersion.spv > 0 && tokens[0].compare("STDGL") == 0 &&
+               tokens[1].compare("invariant") == 0 && tokens[3].compare("all") == 0) {
+        intermediate.setInvariantAll();
+        // Set all builtin out variables invariant if declared
+        setInvariant(loc, "gl_Position");
+        setInvariant(loc, "gl_PointSize");
+        setInvariant(loc, "gl_ClipDistance");
+        setInvariant(loc, "gl_CullDistance");
+        setInvariant(loc, "gl_TessLevelOuter");
+        setInvariant(loc, "gl_TessLevelInner");
+        setInvariant(loc, "gl_PrimitiveID");
+        setInvariant(loc, "gl_Layer");
+        setInvariant(loc, "gl_ViewportIndex");
+        setInvariant(loc, "gl_FragDepth");
+        setInvariant(loc, "gl_SampleMask");
+        setInvariant(loc, "gl_ClipVertex");
+        setInvariant(loc, "gl_FrontColor");
+        setInvariant(loc, "gl_BackColor");
+        setInvariant(loc, "gl_FrontSecondaryColor");
+        setInvariant(loc, "gl_BackSecondaryColor");
+        setInvariant(loc, "gl_TexCoord");
+        setInvariant(loc, "gl_FogFragCoord");
+        setInvariant(loc, "gl_FragColor");
+        setInvariant(loc, "gl_FragData");
+    }
 #endif
 }
 
@@ -2273,6 +2308,10 @@
         if (!(*argp)[10]->getAsConstantUnion())
             error(loc, "argument must be compile-time constant", "payload number", "a");
         break;
+    case EOpTraceRayMotionNV:
+        if (!(*argp)[11]->getAsConstantUnion())
+            error(loc, "argument must be compile-time constant", "payload number", "a");
+        break;
     case EOpTraceKHR:
         if (!(*argp)[10]->getAsConstantUnion())
             error(loc, "argument must be compile-time constant", "payload number", "a");
@@ -2409,6 +2448,14 @@
                    arg0->getType().isFloatingDomain()) {
             requireExtensions(loc, 1, &E_GL_EXT_shader_atomic_float2, fnCandidate.getName().c_str());
         }
+
+        const TIntermTyped* base = TIntermediate::findLValueBase(arg0, true , true);
+        const TType* refType = (base->getType().isReference()) ? base->getType().getReferentType() : nullptr;
+        const TQualifier& qualifier = (refType != nullptr) ? refType->getQualifier() : base->getType().getQualifier();
+        if (qualifier.storage != EvqShared && qualifier.storage != EvqBuffer)
+            error(loc,"Atomic memory function can only be used for shader storage block member or shared variable.",
+            fnCandidate.getName().c_str(), "");
+
         break;
     }
 
@@ -3651,6 +3698,8 @@
         profileRequires(loc, ENoProfile, 130, nullptr, "out for stage outputs");
         profileRequires(loc, EEsProfile, 300, nullptr, "out for stage outputs");
         qualifier.storage = EvqVaryingOut;
+        if (intermediate.isInvariantAll())
+            qualifier.invariant = true;
         break;
     case EvqInOut:
         qualifier.storage = EvqVaryingIn;
@@ -3667,7 +3716,7 @@
         if (blockName == nullptr &&
             qualifier.layoutPacking == ElpStd430)
         {
-            error(loc, "it is invalid to declare std430 qualifier on uniform", "", "");
+            requireExtensions(loc, 1, &E_GL_EXT_scalar_block_layout, "default std430 layout for uniform");
         }
         break;
     default:
@@ -7642,7 +7691,13 @@
             return nullptr;
     }
 
-    return intermediate.setAggregateOperator(aggrNode, op, type, loc);
+    TIntermTyped *ret_node = intermediate.setAggregateOperator(aggrNode, op, type, loc);
+
+    TIntermAggregate *agg_node = ret_node->getAsAggregate();
+    if (agg_node && agg_node->isVector()) 
+        agg_node->updatePrecision();
+
+    return ret_node;
 }
 
 // Function for constructor implementation. Calls addUnaryMath with appropriate EOp value
diff --git a/third_party/vulkan-deps/glslang/src/glslang/MachineIndependent/ParseHelper.h b/third_party/vulkan-deps/glslang/src/glslang/MachineIndependent/ParseHelper.h
index c9e6334..de44884 100644
--- a/third_party/vulkan-deps/glslang/src/glslang/MachineIndependent/ParseHelper.h
+++ b/third_party/vulkan-deps/glslang/src/glslang/MachineIndependent/ParseHelper.h
@@ -241,6 +241,7 @@
     // override this to set the language-specific name
     virtual const char* getAtomicCounterBlockName() const { return ""; }
     virtual void setAtomicCounterBlockDefaults(TType&) const {}
+    virtual void setInvariant(const TSourceLoc& loc, const char* builtin) {}
     virtual void finalizeAtomicCounterBlockLayout(TVariable&) {}
     bool isAtomicCounterBlock(const TSymbol& symbol) {
         const TVariable* var = symbol.getAsVariable();
@@ -511,6 +512,7 @@
     virtual const char* getAtomicCounterBlockName() const override;
     virtual void finalizeAtomicCounterBlockLayout(TVariable&) override;
     virtual void setAtomicCounterBlockDefaults(TType& block) const override;
+    virtual void setInvariant(const TSourceLoc& loc, const char* builtin) override;
 
 public:
     //
diff --git a/third_party/vulkan-deps/glslang/src/glslang/MachineIndependent/Versions.cpp b/third_party/vulkan-deps/glslang/src/glslang/MachineIndependent/Versions.cpp
index 2698dd9..097ee84 100644
--- a/third_party/vulkan-deps/glslang/src/glslang/MachineIndependent/Versions.cpp
+++ b/third_party/vulkan-deps/glslang/src/glslang/MachineIndependent/Versions.cpp
@@ -165,7 +165,9 @@
         EShTargetLanguageVersion minSpvVersion;
     } extensionData;
 
-    const extensionData exts[] = { {E_GL_EXT_ray_tracing, EShTargetSpv_1_4} };
+    const extensionData exts[] = { {E_GL_EXT_ray_tracing, EShTargetSpv_1_4},
+                                   {E_GL_NV_ray_tracing_motion_blur, EShTargetSpv_1_4}
+                                 };
 
     for (size_t ii = 0; ii < sizeof(exts) / sizeof(exts[0]); ii++) {
         // Add only extensions which require > spv1.0 to save space in map
@@ -198,6 +200,7 @@
     extensionBehavior[E_GL_ARB_explicit_uniform_location]    = EBhDisable;
     extensionBehavior[E_GL_ARB_shader_image_load_store]      = EBhDisable;
     extensionBehavior[E_GL_ARB_shader_atomic_counters]       = EBhDisable;
+    extensionBehavior[E_GL_ARB_shader_atomic_counter_ops]    = EBhDisable;
     extensionBehavior[E_GL_ARB_shader_draw_parameters]       = EBhDisable;
     extensionBehavior[E_GL_ARB_shader_group_vote]            = EBhDisable;
     extensionBehavior[E_GL_ARB_derivative_control]           = EBhDisable;
@@ -281,6 +284,7 @@
     extensionBehavior[E_GL_NV_shader_subgroup_partitioned]           = EBhDisable;
     extensionBehavior[E_GL_NV_shading_rate_image]                    = EBhDisable;
     extensionBehavior[E_GL_NV_ray_tracing]                           = EBhDisable;
+    extensionBehavior[E_GL_NV_ray_tracing_motion_blur]               = EBhDisable;
     extensionBehavior[E_GL_NV_fragment_shader_barycentric]           = EBhDisable;
     extensionBehavior[E_GL_NV_compute_shader_derivatives]            = EBhDisable;
     extensionBehavior[E_GL_NV_shader_texture_footprint]              = EBhDisable;
@@ -518,6 +522,7 @@
             "#define GL_NV_shader_subgroup_partitioned 1\n"
             "#define GL_NV_shading_rate_image 1\n"
             "#define GL_NV_ray_tracing 1\n"
+            "#define GL_NV_ray_tracing_motion_blur 1\n"
             "#define GL_NV_fragment_shader_barycentric 1\n"
             "#define GL_NV_compute_shader_derivatives 1\n"
             "#define GL_NV_shader_texture_footprint 1\n"
diff --git a/third_party/vulkan-deps/glslang/src/glslang/MachineIndependent/Versions.h b/third_party/vulkan-deps/glslang/src/glslang/MachineIndependent/Versions.h
index 2e8cc29..949a7a1 100644
--- a/third_party/vulkan-deps/glslang/src/glslang/MachineIndependent/Versions.h
+++ b/third_party/vulkan-deps/glslang/src/glslang/MachineIndependent/Versions.h
@@ -136,6 +136,7 @@
 const char* const E_GL_ARB_explicit_uniform_location    = "GL_ARB_explicit_uniform_location";
 const char* const E_GL_ARB_shader_image_load_store      = "GL_ARB_shader_image_load_store";
 const char* const E_GL_ARB_shader_atomic_counters       = "GL_ARB_shader_atomic_counters";
+const char* const E_GL_ARB_shader_atomic_counter_ops    = "GL_ARB_shader_atomic_counter_ops";
 const char* const E_GL_ARB_shader_draw_parameters       = "GL_ARB_shader_draw_parameters";
 const char* const E_GL_ARB_shader_group_vote            = "GL_ARB_shader_group_vote";
 const char* const E_GL_ARB_derivative_control           = "GL_ARB_derivative_control";
@@ -247,6 +248,7 @@
 const char* const E_GL_NV_shader_subgroup_partitioned           = "GL_NV_shader_subgroup_partitioned";
 const char* const E_GL_NV_shading_rate_image                    = "GL_NV_shading_rate_image";
 const char* const E_GL_NV_ray_tracing                           = "GL_NV_ray_tracing";
+const char* const E_GL_NV_ray_tracing_motion_blur               = "GL_NV_ray_tracing_motion_blur";
 const char* const E_GL_NV_fragment_shader_barycentric           = "GL_NV_fragment_shader_barycentric";
 const char* const E_GL_NV_compute_shader_derivatives            = "GL_NV_compute_shader_derivatives";
 const char* const E_GL_NV_shader_texture_footprint              = "GL_NV_shader_texture_footprint";
diff --git a/third_party/vulkan-deps/glslang/src/glslang/MachineIndependent/intermOut.cpp b/third_party/vulkan-deps/glslang/src/glslang/MachineIndependent/intermOut.cpp
index 105adc4..a0fade1 100644
--- a/third_party/vulkan-deps/glslang/src/glslang/MachineIndependent/intermOut.cpp
+++ b/third_party/vulkan-deps/glslang/src/glslang/MachineIndependent/intermOut.cpp
@@ -1089,6 +1089,7 @@
     case EOpSubpassLoadMS: out.debug << "subpassLoadMS"; break;
 
     case EOpTraceNV:                          out.debug << "traceNV"; break;
+    case EOpTraceRayMotionNV:                 out.debug << "traceRayMotionNV"; break;
     case EOpTraceKHR:                         out.debug << "traceRayKHR"; break;
     case EOpReportIntersection:               out.debug << "reportIntersectionNV"; break;
     case EOpIgnoreIntersectionNV:             out.debug << "ignoreIntersectionNV"; break;
diff --git a/third_party/vulkan-deps/glslang/src/glslang/MachineIndependent/linkValidate.cpp b/third_party/vulkan-deps/glslang/src/glslang/MachineIndependent/linkValidate.cpp
index 42b416d..9656e2e 100644
--- a/third_party/vulkan-deps/glslang/src/glslang/MachineIndependent/linkValidate.cpp
+++ b/third_party/vulkan-deps/glslang/src/glslang/MachineIndependent/linkValidate.cpp
@@ -316,6 +316,7 @@
     MERGE_TRUE(useUnknownFormat);
     MERGE_TRUE(hlslOffsets);
     MERGE_TRUE(useStorageBuffer);
+    MERGE_TRUE(invariantAll);
     MERGE_TRUE(hlslIoMapping);
 
     // TODO: sourceFile
diff --git a/third_party/vulkan-deps/glslang/src/glslang/MachineIndependent/localintermediate.h b/third_party/vulkan-deps/glslang/src/glslang/MachineIndependent/localintermediate.h
index 5cc9930..6aa9399 100644
--- a/third_party/vulkan-deps/glslang/src/glslang/MachineIndependent/localintermediate.h
+++ b/third_party/vulkan-deps/glslang/src/glslang/MachineIndependent/localintermediate.h
@@ -291,6 +291,7 @@
         numEntryPoints(0), numErrors(0), numPushConstants(0), recursive(false),
         invertY(false),
         useStorageBuffer(false),
+        invariantAll(false),
         nanMinMaxClamp(false),
         depthReplacing(false),
         uniqueId(0),
@@ -538,7 +539,7 @@
     TIntermTyped* foldSwizzle(TIntermTyped* node, TSwizzleSelectors<TVectorSelector>& fields, const TSourceLoc&);
 
     // Tree ops
-    static const TIntermTyped* findLValueBase(const TIntermTyped*, bool swizzleOkay);
+    static const TIntermTyped* findLValueBase(const TIntermTyped*, bool swizzleOkay , bool BufferReferenceOk = false);
 
     // Linkage related
     void addSymbolLinkageNodes(TIntermAggregate*& linkage, EShLanguage, TSymbolTable&);
@@ -560,6 +561,8 @@
 
     void setUseStorageBuffer() { useStorageBuffer = true; }
     bool usingStorageBuffer() const { return useStorageBuffer; }
+    void setInvariantAll() { invariantAll = true; }
+    bool isInvariantAll() const { return invariantAll; }
     void setDepthReplacing() { depthReplacing = true; }
     bool isDepthReplacing() const { return depthReplacing; }
     bool setLocalSize(int dim, int size)
@@ -926,6 +929,11 @@
         return false;
     }
 
+    bool IsRequestedExtension(const char* extension) const
+    {
+        return (requestedExtensions.find(extension) != requestedExtensions.end());
+    }
+
     void addToCallGraph(TInfoSink&, const TString& caller, const TString& callee);
     void merge(TInfoSink&, TIntermediate&);
     void finalCheck(TInfoSink&, bool keepUncalled);
@@ -1063,6 +1071,7 @@
     bool recursive;
     bool invertY;
     bool useStorageBuffer;
+    bool invariantAll;
     bool nanMinMaxClamp;            // true if desiring min/max/clamp to favor non-NaN over NaN
     bool depthReplacing;
     int localSize[3];
diff --git a/third_party/vulkan-deps/glslang/src/gtests/AST.FromFile.cpp b/third_party/vulkan-deps/glslang/src/gtests/AST.FromFile.cpp
index 77f0aaf..6e7a659 100644
--- a/third_party/vulkan-deps/glslang/src/gtests/AST.FromFile.cpp
+++ b/third_party/vulkan-deps/glslang/src/gtests/AST.FromFile.cpp
@@ -282,6 +282,9 @@
         "terminate.vert",
         "negativeWorkGroupSize.comp",
         "textureoffset_sampler2darrayshadow.vert",
+        "atomicAdd.comp",
+        "GL_ARB_gpu_shader5.u2i.vert",
+        "atomicCounterARBOps.vert"
     })),
     FileNameAsCustomTestSuffix
 );
diff --git a/third_party/vulkan-deps/glslang/src/gtests/Hlsl.FromFile.cpp b/third_party/vulkan-deps/glslang/src/gtests/Hlsl.FromFile.cpp
index 33deef5..5e1cbda 100644
--- a/third_party/vulkan-deps/glslang/src/gtests/Hlsl.FromFile.cpp
+++ b/third_party/vulkan-deps/glslang/src/gtests/Hlsl.FromFile.cpp
@@ -235,6 +235,7 @@
         {"hlsl.groupid.comp", "main"},
         {"hlsl.identifier.sample.frag", "main"},
         {"hlsl.if.frag", "PixelShaderFunction"},
+        {"hlsl.imageload-subvec4.comp", "main"},
         {"hlsl.imagefetch-subvec4.comp", "main"},
         {"hlsl.implicitBool.frag", "main"},
         {"hlsl.inf.vert", "main"},
diff --git a/third_party/vulkan-deps/glslang/src/gtests/Spv.FromFile.cpp b/third_party/vulkan-deps/glslang/src/gtests/Spv.FromFile.cpp
index 80ce0b1..29740f3 100644
--- a/third_party/vulkan-deps/glslang/src/gtests/Spv.FromFile.cpp
+++ b/third_party/vulkan-deps/glslang/src/gtests/Spv.FromFile.cpp
@@ -77,6 +77,7 @@
 using GlslIoMap = GlslangTest<::testing::TestWithParam<IoMapData>>;
 using CompileVulkanToSpirvTestAMD = GlslangTest<::testing::TestWithParam<std::string>>;
 using CompileVulkanToSpirvTestNV = GlslangTest<::testing::TestWithParam<std::string>>;
+using CompileVulkanToSpirv14TestNV = GlslangTest<::testing::TestWithParam<std::string>>;
 using CompileUpgradeTextureToSampledTextureAndDropSamplersTest = GlslangTest<::testing::TestWithParam<std::string>>;
 
 // Compiling GLSL to SPIR-V under Vulkan semantics. Expected to successfully
@@ -204,6 +205,13 @@
                             Target::Spv);
 }
 
+TEST_P(CompileVulkanToSpirv14TestNV, FromFile)
+{
+    loadFileCompileAndCheck(GlobalTestSettings.testRoot, GetParam(),
+                            Source::GLSL, Semantics::Vulkan, glslang::EShTargetVulkan_1_1, glslang::EShTargetSpv_1_4,
+                            Target::Spv);
+}
+
 TEST_P(CompileUpgradeTextureToSampledTextureAndDropSamplersTest, FromFile)
 {
     loadCompileUpgradeTextureToSampledTextureAndDropSamplersAndCheck(GlobalTestSettings.testRoot,
@@ -364,6 +372,7 @@
         "spv.intrinsicsSpirvLiteral.vert",
         "spv.intrinsicsSpirvStorageClass.rchit",
         "spv.intrinsicsSpirvType.rgen",
+        "spv.invariantAll.vert",
         "spv.layer.tese",
         "spv.layoutNested.vert",
         "spv.length.frag",
@@ -466,6 +475,7 @@
         "spv.smBuiltins.frag",
         "spv.builtin.PrimitiveShadingRateEXT.vert",
         "spv.builtin.ShadingRateEXT.frag",
+        "spv.atomicAdd.bufferReference.comp"
     })),
     FileNameAsCustomTestSuffix
 );
@@ -764,6 +774,17 @@
 );
 
 INSTANTIATE_TEST_SUITE_P(
+    Glsl, CompileVulkanToSpirv14TestNV,
+    ::testing::ValuesIn(std::vector<std::string>({
+    "spv.RayGenShaderMotion.rgen",
+    "spv.IntersectShaderMotion.rint",
+    "spv.AnyHitShaderMotion.rahit",
+    "spv.ClosestHitShaderMotion.rchit",
+    "spv.MissShaderMotion.rmiss",
+})),
+FileNameAsCustomTestSuffix
+);
+INSTANTIATE_TEST_SUITE_P(
     Glsl, CompileUpgradeTextureToSampledTextureAndDropSamplersTest,
     ::testing::ValuesIn(std::vector<std::string>({
       "spv.texture.sampler.transform.frag",
diff --git a/third_party/vulkan-deps/glslang/src/known_good.json b/third_party/vulkan-deps/glslang/src/known_good.json
index c6fd4ff..e1c2ce8 100644
--- a/third_party/vulkan-deps/glslang/src/known_good.json
+++ b/third_party/vulkan-deps/glslang/src/known_good.json
@@ -5,14 +5,14 @@
       "site" : "github",
       "subrepo" : "KhronosGroup/SPIRV-Tools",
       "subdir" : "External/spirv-tools",
-      "commit" : "5dd2f76918bb2d0d67628e338f60f724f3e02e13"
+      "commit" : "1fbed83c8aab8517d821fcb4164c08567951938f"
     },
     {
       "name" : "spirv-tools/external/spirv-headers",
       "site" : "github",
       "subrepo" : "KhronosGroup/SPIRV-Headers",
       "subdir" : "External/spirv-tools/external/spirv-headers",
-      "commit" : "07f259e68af3a540038fa32df522554e74f53ed5"
+      "commit" : "449bc986ba6f4c5e10e32828783f9daef2a77644"
     }
   ]
 }
diff --git a/third_party/vulkan-deps/spirv-headers/src/BUILD.bazel b/third_party/vulkan-deps/spirv-headers/src/BUILD.bazel
index 9cb46bf..c898ade 100644
--- a/third_party/vulkan-deps/spirv-headers/src/BUILD.bazel
+++ b/third_party/vulkan-deps/spirv-headers/src/BUILD.bazel
@@ -92,6 +92,11 @@
 )
 
 filegroup(
+    name = "spirv_ext_inst_nonsemantic_shader_debuginfo_100_grammar_unified1",
+    srcs = ["include/spirv/unified1/extinst.nonsemantic.shader.debuginfo.100.grammar.json"],
+)
+
+filegroup(
     name = "spirv_ext_inst_spv_amd_gcn_shader_grammar_unified1",
     srcs = ["include/spirv/unified1/extinst.spv-amd-gcn-shader.grammar.json"],
 )
diff --git a/third_party/vulkan-deps/spirv-headers/src/include/spirv/spir-v.xml b/third_party/vulkan-deps/spirv-headers/src/include/spirv/spir-v.xml
index 75cba89..525c97d 100644
--- a/third_party/vulkan-deps/spirv-headers/src/include/spirv/spir-v.xml
+++ b/third_party/vulkan-deps/spirv-headers/src/include/spirv/spir-v.xml
@@ -69,7 +69,7 @@
         <id value="16"  vendor="X-LEGEND"   tool="Mesa-IR/SPIR-V Translator" comment="Contact Metora Wang, github:metora/MesaGLSLCompiler"/>
         <id value="17"  vendor="Khronos" tool="SPIR-V Tools Linker" comment="Contact David Neto, dneto@google.com"/>
         <id value="18"  vendor="Wine" tool="VKD3D Shader Compiler" comment="Contact wine-devel@winehq.org"/>
-        <id value="19"  vendor="Clay" tool="Clay Shader Compiler" comment="Contact info@clayengine.com"/>
+        <id value="19"  vendor="Tellusim" tool="Clay Shader Compiler" comment="Contact info@tellusim.com"/>
         <id value="20"  vendor="W3C WebGPU Group" tool="WHLSL Shader Translator" comment="https://github.com/gpuweb/WHLSL"/>
         <id value="21"  vendor="Google" tool="Clspv" comment="Contact David Neto, dneto@google.com"/>
         <id value="22"  vendor="Google" tool="MLIR SPIR-V Serializer" comment="Contact Lei Zhang, antiagainst@google.com"/>
diff --git a/third_party/vulkan-deps/spirv-headers/src/include/spirv/unified1/spirv.core.grammar.json b/third_party/vulkan-deps/spirv-headers/src/include/spirv/unified1/spirv.core.grammar.json
index 1d19c4a..33ca872 100644
--- a/third_party/vulkan-deps/spirv-headers/src/include/spirv/unified1/spirv.core.grammar.json
+++ b/third_party/vulkan-deps/spirv-headers/src/include/spirv/unified1/spirv.core.grammar.json
@@ -4754,6 +4754,52 @@
       "version" : "None"
     },
     {
+      "opname" : "OpTraceMotionNV",
+      "class"  : "Reserved",
+      "opcode" : 5338,
+      "operands" : [
+
+        { "kind" : "IdRef", "name" : "'Accel'" },
+        { "kind" : "IdRef", "name" : "'Ray Flags'" },
+        { "kind" : "IdRef", "name" : "'Cull Mask'" },
+        { "kind" : "IdRef", "name" : "'SBT Offset'" },
+        { "kind" : "IdRef", "name" : "'SBT Stride'" },
+        { "kind" : "IdRef", "name" : "'Miss Index'" },
+        { "kind" : "IdRef", "name" : "'Ray Origin'" },
+        { "kind" : "IdRef", "name" : "'Ray Tmin'" },
+        { "kind" : "IdRef", "name" : "'Ray Direction'" },
+        { "kind" : "IdRef", "name" : "'Ray Tmax'" },
+        { "kind" : "IdRef", "name" : "'Time'" },
+        { "kind" : "IdRef", "name" : "'PayloadId'" }
+      ],
+      "capabilities" : [ "RayTracingMotionBlurNV" ],
+      "extensions" : [ "SPV_NV_ray_tracing_motion_blur" ],
+      "version" : "None"
+    },
+    {
+      "opname" : "OpTraceRayMotionNV",
+      "class"  : "Reserved",
+      "opcode" : 5339,
+      "operands" : [
+
+        { "kind" : "IdRef", "name" : "'Accel'" },
+        { "kind" : "IdRef", "name" : "'Ray Flags'" },
+        { "kind" : "IdRef", "name" : "'Cull Mask'" },
+        { "kind" : "IdRef", "name" : "'SBT Offset'" },
+        { "kind" : "IdRef", "name" : "'SBT Stride'" },
+        { "kind" : "IdRef", "name" : "'Miss Index'" },
+        { "kind" : "IdRef", "name" : "'Ray Origin'" },
+        { "kind" : "IdRef", "name" : "'Ray Tmin'" },
+        { "kind" : "IdRef", "name" : "'Ray Direction'" },
+        { "kind" : "IdRef", "name" : "'Ray Tmax'" },
+        { "kind" : "IdRef", "name" : "'Time'" },
+        { "kind" : "IdRef", "name" : "'Payload'" }
+      ],
+      "capabilities" : [ "RayTracingMotionBlurNV" ],
+      "extensions" : [ "SPV_NV_ray_tracing_motion_blur" ],
+      "version" : "None"
+    },
+    {
       "opname" : "OpTypeAccelerationStructureNV",
       "class"  : "Reserved",
       "opcode" : 5341,
@@ -7631,24 +7677,6 @@
       "version" : "None"
     },
     {
-      "opname" : "OpArbitraryFloatPowNINTEL",
-      "class"  : "@exclude",
-      "opcode" : 5882,
-      "operands" : [
-        { "kind" : "IdResultType" },
-        { "kind" : "IdResult" },
-        { "kind" : "IdRef", "name" : "'A'" },
-        { "kind" : "LiteralInteger", "name" : "'M1'" },
-        { "kind" : "IdRef", "name" : "'B'" },
-        { "kind" : "LiteralInteger", "name" : "'Mout'" },
-        { "kind" : "LiteralInteger", "name" : "'EnableSubnormals'" },
-        { "kind" : "LiteralInteger", "name" : "'RoundingMode'" },
-        { "kind" : "LiteralInteger", "name" : "'RoundingAccuracy'" }
-      ],
-      "capabilities" : [ "ArbitraryPrecisionFloatingPointINTEL" ],
-      "version" : "None"
-    },
-    {
       "opname" : "OpLoopControlINTEL",
       "class"  : "Reserved",
       "opcode" : 5887,
@@ -8689,6 +8717,12 @@
         {
           "enumerant" : "Const",
           "value" : "0x0008"
+        },
+        {
+          "enumerant" : "OptNoneINTEL",
+          "value" : "0x10000",
+          "capabilities" : [  "OptNoneINTEL" ],
+          "version" : "None"
         }
       ]
     },
@@ -9445,7 +9479,9 @@
           "value" : 39,
           "capabilities" : [ "Kernel" ],
           "parameters" : [
-            { "kind" : "IdRef", "name" : "'Local Size Hint'" }
+            { "kind" : "IdRef", "name" : "'x size hint'" },
+            { "kind" : "IdRef", "name" : "'y size hint'" },
+            { "kind" : "IdRef", "name" : "'z size hint'" }
           ],
           "version" : "1.2"
         },
@@ -12047,6 +12083,13 @@
           "version" : "None"
         },
         {
+          "enumerant" : "CurrentRayTimeNV",
+          "value" : 5334,
+          "capabilities" : [ "RayTracingMotionBlurNV" ],
+          "extensions" : [ "SPV_NV_ray_tracing_motion_blur" ],
+          "version" : "None"
+        },
+        {
           "enumerant" : "IncomingRayFlagsNV",
           "value" : 5351,
           "capabilities" : [ "RayTracingNV" , "RayTracingKHR" ],
@@ -13079,6 +13122,13 @@
           "version" : "None"
         },
         {
+          "enumerant" : "RayTracingMotionBlurNV",
+          "value" : 5341,
+          "capabilities" : [ "Shader" ],
+          "extensions" : [ "SPV_NV_ray_tracing_motion_blur" ],
+          "version" : "None"
+        },
+        {
           "enumerant" : "VulkanMemoryModel",
           "value" : 5345,
           "version" : "1.5"
@@ -13452,6 +13502,12 @@
           "version" : "None"
         },
         {
+          "enumerant" : "OptNoneINTEL",
+          "value" : 6094,
+          "extensions" : [ "SPV_INTEL_optnone" ],
+          "version" : "None"
+        },
+        {
           "enumerant" : "AtomicFloat16AddEXT",
           "value" : 6095,
           "capabilities" : [ "Shader" ],
diff --git a/third_party/vulkan-deps/spirv-headers/src/include/spirv/unified1/spirv.cs b/third_party/vulkan-deps/spirv-headers/src/include/spirv/unified1/spirv.cs
index 859f0e7..b2ca3f0 100644
--- a/third_party/vulkan-deps/spirv-headers/src/include/spirv/unified1/spirv.cs
+++ b/third_party/vulkan-deps/spirv-headers/src/include/spirv/unified1/spirv.cs
@@ -651,6 +651,7 @@
             HitTNV = 5332,
             HitKindKHR = 5333,
             HitKindNV = 5333,
+            CurrentRayTimeNV = 5334,
             IncomingRayFlagsKHR = 5351,
             IncomingRayFlagsNV = 5351,
             RayGeometryIndexKHR = 5352,
@@ -722,6 +723,7 @@
             DontInline = 1,
             Pure = 2,
             Const = 3,
+            OptNoneINTEL = 16,
         }
 
         public enum FunctionControlMask
@@ -731,6 +733,7 @@
             DontInline = 0x00000002,
             Pure = 0x00000004,
             Const = 0x00000008,
+            OptNoneINTEL = 0x00010000,
         }
 
         public enum MemorySemanticsShift
@@ -993,6 +996,7 @@
             StorageTexelBufferArrayNonUniformIndexing = 5312,
             StorageTexelBufferArrayNonUniformIndexingEXT = 5312,
             RayTracingNV = 5340,
+            RayTracingMotionBlurNV = 5341,
             VulkanMemoryModel = 5345,
             VulkanMemoryModelKHR = 5345,
             VulkanMemoryModelDeviceScope = 5346,
@@ -1053,6 +1057,7 @@
             AtomicFloat32AddEXT = 6033,
             AtomicFloat64AddEXT = 6034,
             LongConstantCompositeINTEL = 6089,
+            OptNoneINTEL = 6094,
             AtomicFloat16AddEXT = 6095,
             DebugInfoModuleINTEL = 6114,
         }
@@ -1549,6 +1554,8 @@
             OpIgnoreIntersectionNV = 5335,
             OpTerminateRayNV = 5336,
             OpTraceNV = 5337,
+            OpTraceMotionNV = 5338,
+            OpTraceRayMotionNV = 5339,
             OpTypeAccelerationStructureKHR = 5341,
             OpTypeAccelerationStructureNV = 5341,
             OpExecuteCallableNV = 5344,
diff --git a/third_party/vulkan-deps/spirv-headers/src/include/spirv/unified1/spirv.h b/third_party/vulkan-deps/spirv-headers/src/include/spirv/unified1/spirv.h
index 34f90d3..1443963 100644
--- a/third_party/vulkan-deps/spirv-headers/src/include/spirv/unified1/spirv.h
+++ b/third_party/vulkan-deps/spirv-headers/src/include/spirv/unified1/spirv.h
@@ -657,6 +657,7 @@
     SpvBuiltInHitTNV = 5332,
     SpvBuiltInHitKindKHR = 5333,
     SpvBuiltInHitKindNV = 5333,
+    SpvBuiltInCurrentRayTimeNV = 5334,
     SpvBuiltInIncomingRayFlagsKHR = 5351,
     SpvBuiltInIncomingRayFlagsNV = 5351,
     SpvBuiltInRayGeometryIndexKHR = 5352,
@@ -726,6 +727,7 @@
     SpvFunctionControlDontInlineShift = 1,
     SpvFunctionControlPureShift = 2,
     SpvFunctionControlConstShift = 3,
+    SpvFunctionControlOptNoneINTELShift = 16,
     SpvFunctionControlMax = 0x7fffffff,
 } SpvFunctionControlShift;
 
@@ -735,6 +737,7 @@
     SpvFunctionControlDontInlineMask = 0x00000002,
     SpvFunctionControlPureMask = 0x00000004,
     SpvFunctionControlConstMask = 0x00000008,
+    SpvFunctionControlOptNoneINTELMask = 0x00010000,
 } SpvFunctionControlMask;
 
 typedef enum SpvMemorySemanticsShift_ {
@@ -993,6 +996,7 @@
     SpvCapabilityStorageTexelBufferArrayNonUniformIndexing = 5312,
     SpvCapabilityStorageTexelBufferArrayNonUniformIndexingEXT = 5312,
     SpvCapabilityRayTracingNV = 5340,
+    SpvCapabilityRayTracingMotionBlurNV = 5341,
     SpvCapabilityVulkanMemoryModel = 5345,
     SpvCapabilityVulkanMemoryModelKHR = 5345,
     SpvCapabilityVulkanMemoryModelDeviceScope = 5346,
@@ -1053,6 +1057,7 @@
     SpvCapabilityAtomicFloat32AddEXT = 6033,
     SpvCapabilityAtomicFloat64AddEXT = 6034,
     SpvCapabilityLongConstantCompositeINTEL = 6089,
+    SpvCapabilityOptNoneINTEL = 6094,
     SpvCapabilityAtomicFloat16AddEXT = 6095,
     SpvCapabilityDebugInfoModuleINTEL = 6114,
     SpvCapabilityMax = 0x7fffffff,
@@ -1547,6 +1552,8 @@
     SpvOpIgnoreIntersectionNV = 5335,
     SpvOpTerminateRayNV = 5336,
     SpvOpTraceNV = 5337,
+    SpvOpTraceMotionNV = 5338,
+    SpvOpTraceRayMotionNV = 5339,
     SpvOpTypeAccelerationStructureKHR = 5341,
     SpvOpTypeAccelerationStructureNV = 5341,
     SpvOpExecuteCallableNV = 5344,
@@ -2192,6 +2199,8 @@
     case SpvOpIgnoreIntersectionNV: *hasResult = false; *hasResultType = false; break;
     case SpvOpTerminateRayNV: *hasResult = false; *hasResultType = false; break;
     case SpvOpTraceNV: *hasResult = false; *hasResultType = false; break;
+    case SpvOpTraceMotionNV: *hasResult = false; *hasResultType = false; break;
+    case SpvOpTraceRayMotionNV: *hasResult = false; *hasResultType = false; break;
     case SpvOpTypeAccelerationStructureNV: *hasResult = true; *hasResultType = false; break;
     case SpvOpExecuteCallableNV: *hasResult = false; *hasResultType = false; break;
     case SpvOpTypeCooperativeMatrixNV: *hasResult = true; *hasResultType = false; break;
diff --git a/third_party/vulkan-deps/spirv-headers/src/include/spirv/unified1/spirv.hpp b/third_party/vulkan-deps/spirv-headers/src/include/spirv/unified1/spirv.hpp
index a0b35b3..5180457 100644
--- a/third_party/vulkan-deps/spirv-headers/src/include/spirv/unified1/spirv.hpp
+++ b/third_party/vulkan-deps/spirv-headers/src/include/spirv/unified1/spirv.hpp
@@ -653,6 +653,7 @@
     BuiltInHitTNV = 5332,
     BuiltInHitKindKHR = 5333,
     BuiltInHitKindNV = 5333,
+    BuiltInCurrentRayTimeNV = 5334,
     BuiltInIncomingRayFlagsKHR = 5351,
     BuiltInIncomingRayFlagsNV = 5351,
     BuiltInRayGeometryIndexKHR = 5352,
@@ -722,6 +723,7 @@
     FunctionControlDontInlineShift = 1,
     FunctionControlPureShift = 2,
     FunctionControlConstShift = 3,
+    FunctionControlOptNoneINTELShift = 16,
     FunctionControlMax = 0x7fffffff,
 };
 
@@ -731,6 +733,7 @@
     FunctionControlDontInlineMask = 0x00000002,
     FunctionControlPureMask = 0x00000004,
     FunctionControlConstMask = 0x00000008,
+    FunctionControlOptNoneINTELMask = 0x00010000,
 };
 
 enum MemorySemanticsShift {
@@ -989,6 +992,7 @@
     CapabilityStorageTexelBufferArrayNonUniformIndexing = 5312,
     CapabilityStorageTexelBufferArrayNonUniformIndexingEXT = 5312,
     CapabilityRayTracingNV = 5340,
+    CapabilityRayTracingMotionBlurNV = 5341,
     CapabilityVulkanMemoryModel = 5345,
     CapabilityVulkanMemoryModelKHR = 5345,
     CapabilityVulkanMemoryModelDeviceScope = 5346,
@@ -1049,6 +1053,7 @@
     CapabilityAtomicFloat32AddEXT = 6033,
     CapabilityAtomicFloat64AddEXT = 6034,
     CapabilityLongConstantCompositeINTEL = 6089,
+    CapabilityOptNoneINTEL = 6094,
     CapabilityAtomicFloat16AddEXT = 6095,
     CapabilityDebugInfoModuleINTEL = 6114,
     CapabilityMax = 0x7fffffff,
@@ -1543,6 +1548,8 @@
     OpIgnoreIntersectionNV = 5335,
     OpTerminateRayNV = 5336,
     OpTraceNV = 5337,
+    OpTraceMotionNV = 5338,
+    OpTraceRayMotionNV = 5339,
     OpTypeAccelerationStructureKHR = 5341,
     OpTypeAccelerationStructureNV = 5341,
     OpExecuteCallableNV = 5344,
@@ -2188,6 +2195,8 @@
     case OpIgnoreIntersectionNV: *hasResult = false; *hasResultType = false; break;
     case OpTerminateRayNV: *hasResult = false; *hasResultType = false; break;
     case OpTraceNV: *hasResult = false; *hasResultType = false; break;
+    case OpTraceMotionNV: *hasResult = false; *hasResultType = false; break;
+    case OpTraceRayMotionNV: *hasResult = false; *hasResultType = false; break;
     case OpTypeAccelerationStructureNV: *hasResult = true; *hasResultType = false; break;
     case OpExecuteCallableNV: *hasResult = false; *hasResultType = false; break;
     case OpTypeCooperativeMatrixNV: *hasResult = true; *hasResultType = false; break;
diff --git a/third_party/vulkan-deps/spirv-headers/src/include/spirv/unified1/spirv.hpp11 b/third_party/vulkan-deps/spirv-headers/src/include/spirv/unified1/spirv.hpp11
index e17c6c6..51e9024 100644
--- a/third_party/vulkan-deps/spirv-headers/src/include/spirv/unified1/spirv.hpp11
+++ b/third_party/vulkan-deps/spirv-headers/src/include/spirv/unified1/spirv.hpp11
@@ -653,6 +653,7 @@
     HitTNV = 5332,
     HitKindKHR = 5333,
     HitKindNV = 5333,
+    CurrentRayTimeNV = 5334,
     IncomingRayFlagsKHR = 5351,
     IncomingRayFlagsNV = 5351,
     RayGeometryIndexKHR = 5352,
@@ -722,6 +723,7 @@
     DontInline = 1,
     Pure = 2,
     Const = 3,
+    OptNoneINTEL = 16,
     Max = 0x7fffffff,
 };
 
@@ -731,6 +733,7 @@
     DontInline = 0x00000002,
     Pure = 0x00000004,
     Const = 0x00000008,
+    OptNoneINTEL = 0x00010000,
 };
 
 enum class MemorySemanticsShift : unsigned {
@@ -989,6 +992,7 @@
     StorageTexelBufferArrayNonUniformIndexing = 5312,
     StorageTexelBufferArrayNonUniformIndexingEXT = 5312,
     RayTracingNV = 5340,
+    RayTracingMotionBlurNV = 5341,
     VulkanMemoryModel = 5345,
     VulkanMemoryModelKHR = 5345,
     VulkanMemoryModelDeviceScope = 5346,
@@ -1049,6 +1053,7 @@
     AtomicFloat32AddEXT = 6033,
     AtomicFloat64AddEXT = 6034,
     LongConstantCompositeINTEL = 6089,
+    OptNoneINTEL = 6094,
     AtomicFloat16AddEXT = 6095,
     DebugInfoModuleINTEL = 6114,
     Max = 0x7fffffff,
@@ -1543,6 +1548,8 @@
     OpIgnoreIntersectionNV = 5335,
     OpTerminateRayNV = 5336,
     OpTraceNV = 5337,
+    OpTraceMotionNV = 5338,
+    OpTraceRayMotionNV = 5339,
     OpTypeAccelerationStructureKHR = 5341,
     OpTypeAccelerationStructureNV = 5341,
     OpExecuteCallableNV = 5344,
@@ -2188,6 +2195,8 @@
     case Op::OpIgnoreIntersectionNV: *hasResult = false; *hasResultType = false; break;
     case Op::OpTerminateRayNV: *hasResult = false; *hasResultType = false; break;
     case Op::OpTraceNV: *hasResult = false; *hasResultType = false; break;
+    case Op::OpTraceMotionNV: *hasResult = false; *hasResultType = false; break;
+    case Op::OpTraceRayMotionNV: *hasResult = false; *hasResultType = false; break;
     case Op::OpTypeAccelerationStructureNV: *hasResult = true; *hasResultType = false; break;
     case Op::OpExecuteCallableNV: *hasResult = false; *hasResultType = false; break;
     case Op::OpTypeCooperativeMatrixNV: *hasResult = true; *hasResultType = false; break;
diff --git a/third_party/vulkan-deps/spirv-headers/src/include/spirv/unified1/spirv.json b/third_party/vulkan-deps/spirv-headers/src/include/spirv/unified1/spirv.json
index 1c63036..017b842 100644
--- a/third_party/vulkan-deps/spirv-headers/src/include/spirv/unified1/spirv.json
+++ b/third_party/vulkan-deps/spirv-headers/src/include/spirv/unified1/spirv.json
@@ -684,6 +684,7 @@
                     "HitTNV": 5332,
                     "HitKindKHR": 5333,
                     "HitKindNV": 5333,
+                    "CurrentRayTimeNV": 5334,
                     "IncomingRayFlagsKHR": 5351,
                     "IncomingRayFlagsNV": 5351,
                     "RayGeometryIndexKHR": 5352,
@@ -734,7 +735,8 @@
                     "Inline": 0,
                     "DontInline": 1,
                     "Pure": 2,
-                    "Const": 3
+                    "Const": 3,
+                    "OptNoneINTEL": 16
                 }
             },
             {
@@ -976,6 +978,7 @@
                     "StorageTexelBufferArrayNonUniformIndexing": 5312,
                     "StorageTexelBufferArrayNonUniformIndexingEXT": 5312,
                     "RayTracingNV": 5340,
+                    "RayTracingMotionBlurNV": 5341,
                     "VulkanMemoryModel": 5345,
                     "VulkanMemoryModelKHR": 5345,
                     "VulkanMemoryModelDeviceScope": 5346,
@@ -1036,6 +1039,7 @@
                     "AtomicFloat32AddEXT": 6033,
                     "AtomicFloat64AddEXT": 6034,
                     "LongConstantCompositeINTEL": 6089,
+                    "OptNoneINTEL": 6094,
                     "AtomicFloat16AddEXT": 6095,
                     "DebugInfoModuleINTEL": 6114
                 }
@@ -1541,6 +1545,8 @@
                     "OpIgnoreIntersectionNV": 5335,
                     "OpTerminateRayNV": 5336,
                     "OpTraceNV": 5337,
+                    "OpTraceMotionNV": 5338,
+                    "OpTraceRayMotionNV": 5339,
                     "OpTypeAccelerationStructureKHR": 5341,
                     "OpTypeAccelerationStructureNV": 5341,
                     "OpExecuteCallableNV": 5344,
diff --git a/third_party/vulkan-deps/spirv-headers/src/include/spirv/unified1/spirv.lua b/third_party/vulkan-deps/spirv-headers/src/include/spirv/unified1/spirv.lua
index afdaec9..46665d8 100644
--- a/third_party/vulkan-deps/spirv-headers/src/include/spirv/unified1/spirv.lua
+++ b/third_party/vulkan-deps/spirv-headers/src/include/spirv/unified1/spirv.lua
@@ -625,6 +625,7 @@
         HitTNV = 5332,
         HitKindKHR = 5333,
         HitKindNV = 5333,
+        CurrentRayTimeNV = 5334,
         IncomingRayFlagsKHR = 5351,
         IncomingRayFlagsNV = 5351,
         RayGeometryIndexKHR = 5352,
@@ -691,6 +692,7 @@
         DontInline = 1,
         Pure = 2,
         Const = 3,
+        OptNoneINTEL = 16,
     },
 
     FunctionControlMask = {
@@ -699,6 +701,7 @@
         DontInline = 0x00000002,
         Pure = 0x00000004,
         Const = 0x00000008,
+        OptNoneINTEL = 0x00010000,
     },
 
     MemorySemanticsShift = {
@@ -951,6 +954,7 @@
         StorageTexelBufferArrayNonUniformIndexing = 5312,
         StorageTexelBufferArrayNonUniformIndexingEXT = 5312,
         RayTracingNV = 5340,
+        RayTracingMotionBlurNV = 5341,
         VulkanMemoryModel = 5345,
         VulkanMemoryModelKHR = 5345,
         VulkanMemoryModelDeviceScope = 5346,
@@ -1011,6 +1015,7 @@
         AtomicFloat32AddEXT = 6033,
         AtomicFloat64AddEXT = 6034,
         LongConstantCompositeINTEL = 6089,
+        OptNoneINTEL = 6094,
         AtomicFloat16AddEXT = 6095,
         DebugInfoModuleINTEL = 6114,
     },
@@ -1494,6 +1499,8 @@
         OpIgnoreIntersectionNV = 5335,
         OpTerminateRayNV = 5336,
         OpTraceNV = 5337,
+        OpTraceMotionNV = 5338,
+        OpTraceRayMotionNV = 5339,
         OpTypeAccelerationStructureKHR = 5341,
         OpTypeAccelerationStructureNV = 5341,
         OpExecuteCallableNV = 5344,
diff --git a/third_party/vulkan-deps/spirv-headers/src/include/spirv/unified1/spirv.py b/third_party/vulkan-deps/spirv-headers/src/include/spirv/unified1/spirv.py
index 09755a2..a780191 100644
--- a/third_party/vulkan-deps/spirv-headers/src/include/spirv/unified1/spirv.py
+++ b/third_party/vulkan-deps/spirv-headers/src/include/spirv/unified1/spirv.py
@@ -625,6 +625,7 @@
         'HitTNV' : 5332,
         'HitKindKHR' : 5333,
         'HitKindNV' : 5333,
+        'CurrentRayTimeNV' : 5334,
         'IncomingRayFlagsKHR' : 5351,
         'IncomingRayFlagsNV' : 5351,
         'RayGeometryIndexKHR' : 5352,
@@ -691,6 +692,7 @@
         'DontInline' : 1,
         'Pure' : 2,
         'Const' : 3,
+        'OptNoneINTEL' : 16,
     },
 
     'FunctionControlMask' : {
@@ -699,6 +701,7 @@
         'DontInline' : 0x00000002,
         'Pure' : 0x00000004,
         'Const' : 0x00000008,
+        'OptNoneINTEL' : 0x00010000,
     },
 
     'MemorySemanticsShift' : {
@@ -951,6 +954,7 @@
         'StorageTexelBufferArrayNonUniformIndexing' : 5312,
         'StorageTexelBufferArrayNonUniformIndexingEXT' : 5312,
         'RayTracingNV' : 5340,
+        'RayTracingMotionBlurNV' : 5341,
         'VulkanMemoryModel' : 5345,
         'VulkanMemoryModelKHR' : 5345,
         'VulkanMemoryModelDeviceScope' : 5346,
@@ -1011,6 +1015,7 @@
         'AtomicFloat32AddEXT' : 6033,
         'AtomicFloat64AddEXT' : 6034,
         'LongConstantCompositeINTEL' : 6089,
+        'OptNoneINTEL' : 6094,
         'AtomicFloat16AddEXT' : 6095,
         'DebugInfoModuleINTEL' : 6114,
     },
@@ -1494,6 +1499,8 @@
         'OpIgnoreIntersectionNV' : 5335,
         'OpTerminateRayNV' : 5336,
         'OpTraceNV' : 5337,
+        'OpTraceMotionNV' : 5338,
+        'OpTraceRayMotionNV' : 5339,
         'OpTypeAccelerationStructureKHR' : 5341,
         'OpTypeAccelerationStructureNV' : 5341,
         'OpExecuteCallableNV' : 5344,
diff --git a/third_party/vulkan-deps/spirv-headers/src/include/spirv/unified1/spv.d b/third_party/vulkan-deps/spirv-headers/src/include/spirv/unified1/spv.d
index 179a6b1..b85517a 100644
--- a/third_party/vulkan-deps/spirv-headers/src/include/spirv/unified1/spv.d
+++ b/third_party/vulkan-deps/spirv-headers/src/include/spirv/unified1/spv.d
@@ -654,6 +654,7 @@
     HitTNV = 5332,
     HitKindKHR = 5333,
     HitKindNV = 5333,
+    CurrentRayTimeNV = 5334,
     IncomingRayFlagsKHR = 5351,
     IncomingRayFlagsNV = 5351,
     RayGeometryIndexKHR = 5352,
@@ -725,6 +726,7 @@
     DontInline = 1,
     Pure = 2,
     Const = 3,
+    OptNoneINTEL = 16,
 }
 
 enum FunctionControlMask : uint
@@ -734,6 +736,7 @@
     DontInline = 0x00000002,
     Pure = 0x00000004,
     Const = 0x00000008,
+    OptNoneINTEL = 0x00010000,
 }
 
 enum MemorySemanticsShift : uint
@@ -996,6 +999,7 @@
     StorageTexelBufferArrayNonUniformIndexing = 5312,
     StorageTexelBufferArrayNonUniformIndexingEXT = 5312,
     RayTracingNV = 5340,
+    RayTracingMotionBlurNV = 5341,
     VulkanMemoryModel = 5345,
     VulkanMemoryModelKHR = 5345,
     VulkanMemoryModelDeviceScope = 5346,
@@ -1056,6 +1060,7 @@
     AtomicFloat32AddEXT = 6033,
     AtomicFloat64AddEXT = 6034,
     LongConstantCompositeINTEL = 6089,
+    OptNoneINTEL = 6094,
     AtomicFloat16AddEXT = 6095,
     DebugInfoModuleINTEL = 6114,
 }
@@ -1552,6 +1557,8 @@
     OpIgnoreIntersectionNV = 5335,
     OpTerminateRayNV = 5336,
     OpTraceNV = 5337,
+    OpTraceMotionNV = 5338,
+    OpTraceRayMotionNV = 5339,
     OpTypeAccelerationStructureKHR = 5341,
     OpTypeAccelerationStructureNV = 5341,
     OpExecuteCallableNV = 5344,
diff --git a/third_party/vulkan-deps/spirv-tools/src/BUILD.bazel b/third_party/vulkan-deps/spirv-tools/src/BUILD.bazel
index 4075441..68e612a 100644
--- a/third_party/vulkan-deps/spirv-tools/src/BUILD.bazel
+++ b/third_party/vulkan-deps/spirv-tools/src/BUILD.bazel
@@ -14,6 +14,7 @@
     "generate_vendor_tables",
     "generate_vendor_tables_local",
     "link_test",
+    "lint_test",
     "opt_test",
     "reduce_test",
     "util_test",
@@ -234,6 +235,19 @@
 )
 
 cc_library(
+    name = "spirv_tools_lint",
+    srcs = glob(["source/lint/*.cpp", "source/lint/*.h"]),
+    hdrs = ["include/spirv-tools/linter.hpp"],
+    copts = COMMON_COPTS,
+    linkstatic = 1,
+    visibility = ["//visibility:public"],
+    deps = [
+        ":spirv_tools",
+        ":spirv_tools_opt",
+    ],
+)
+
+cc_library(
     name = "tools_util",
     srcs = glob(["tools/util/*.cpp"]),
     hdrs = glob(["tools/util/*.h"]),
@@ -331,6 +345,21 @@
 )
 
 cc_binary(
+    name = "spirv-lint",
+    srcs = [
+        "tools/io.h",
+        "tools/lint/lint.cpp",
+    ],
+    copts = COMMON_COPTS,
+    visibility = ["//visibility:public"],
+    deps = [
+        ":spirv_tools",
+        ":spirv_tools_lint",
+        ":tools_util",
+    ],
+)
+
+cc_binary(
     name = "spirv-cfg",
     srcs = [
         "tools/cfg/bin_to_dot.cpp",
@@ -473,6 +502,13 @@
     ["test/link/*.cpp"],
 )]
 
+[lint_test(
+    name = f[10:-4],  # strip test/lint/, .cpp
+    srcs = [f],
+) for f in glob(
+    ["test/lint/*.cpp"],
+)]
+
 [opt_test(
     name = f[9:-4],  # strip test/opt/, .cpp
     srcs = [f],
diff --git a/third_party/vulkan-deps/spirv-tools/src/BUILD.gn b/third_party/vulkan-deps/spirv-tools/src/BUILD.gn
index 270814f..20fdeed 100644
--- a/third_party/vulkan-deps/spirv-tools/src/BUILD.gn
+++ b/third_party/vulkan-deps/spirv-tools/src/BUILD.gn
@@ -358,20 +358,28 @@
   include_dirs = [ "include" ]
 }
 
+config("spvtools_include_gen_dirs") {
+  include_dirs = [ "$target_gen_dir" ]
+}
+
 config("spvtools_internal_config") {
   include_dirs = [
     ".",
-    "$target_gen_dir",
     "${spirv_headers}/include",
   ]
 
-  configs = [ ":spvtools_public_config" ]
+  configs = [
+    ":spvtools_public_config",
+    ":spvtools_include_gen_dirs",
+  ]
 
   cflags = []
   if (is_clang) {
     cflags += [
       "-Wno-implicit-fallthrough",
       "-Wno-newline-eof",
+      "-Wno-unreachable-code-break",
+      "-Wno-unreachable-code-return",
     ]
   } else if (!is_win) {
     # Work around a false-positive on a Skia GCC 10 builder.
@@ -391,6 +399,14 @@
   public_configs = [ ":spvtools_public_config" ]
 }
 
+group("spvtools_language_headers") {
+  public_deps = [
+    ":spvtools_language_header_cldebuginfo100",
+    ":spvtools_language_header_debuginfo",
+    ":spvtools_language_header_vkdebuginfo100",
+  ]
+}
+
 static_library("spvtools") {
   deps = [
     ":spvtools_core_tables_unified1",
@@ -592,10 +608,16 @@
     "source/opt/const_folding_rules.h",
     "source/opt/constants.cpp",
     "source/opt/constants.h",
+    "source/opt/control_dependence.cpp",
+    "source/opt/control_dependence.h",
+    "source/opt/convert_to_sampled_image_pass.cpp",
+    "source/opt/convert_to_sampled_image_pass.h",
     "source/opt/convert_to_half_pass.cpp",
     "source/opt/convert_to_half_pass.h",
     "source/opt/copy_prop_arrays.cpp",
     "source/opt/copy_prop_arrays.h",
+    "source/opt/dataflow.h",
+    "source/opt/dataflow.cpp",
     "source/opt/dead_branch_elim_pass.cpp",
     "source/opt/dead_branch_elim_pass.h",
     "source/opt/dead_insert_elim_pass.cpp",
@@ -772,12 +794,14 @@
 
   deps = [
     ":spvtools",
-    ":spvtools_language_header_cldebuginfo100",
     ":spvtools_language_header_debuginfo",
-    ":spvtools_language_header_vkdebuginfo100",
     ":spvtools_vendor_tables_spv-amd-shader-ballot",
   ]
-  public_deps = [ ":spvtools_headers" ]
+  public_deps = [
+    ":spvtools_headers",
+    ":spvtools_language_header_cldebuginfo100",
+    ":spvtools_language_header_vkdebuginfo100",
+  ]
 
   if (build_with_chromium) {
     configs -= [ "//build/config/compiler:chromium_code" ]
@@ -1062,6 +1086,8 @@
       "source/fuzz/fuzzer_pass_toggle_access_chain_instruction.h",
       "source/fuzz/fuzzer_pass_wrap_regions_in_selections.cpp",
       "source/fuzz/fuzzer_pass_wrap_regions_in_selections.h",
+      "source/fuzz/fuzzer_pass_wrap_vector_synonym.cpp",
+      "source/fuzz/fuzzer_pass_wrap_vector_synonym.h",
       "source/fuzz/fuzzer_util.cpp",
       "source/fuzz/fuzzer_util.h",
       "source/fuzz/id_use_descriptor.cpp",
@@ -1272,6 +1298,8 @@
       "source/fuzz/transformation_wrap_early_terminator_in_function.h",
       "source/fuzz/transformation_wrap_region_in_selection.cpp",
       "source/fuzz/transformation_wrap_region_in_selection.h",
+      "source/fuzz/transformation_wrap_vector_synonym.cpp",
+      "source/fuzz/transformation_wrap_vector_synonym.h",
       "source/fuzz/uniform_buffer_element_descriptor.cpp",
       "source/fuzz/uniform_buffer_element_descriptor.h",
     ]
diff --git a/third_party/vulkan-deps/spirv-tools/src/CHANGES b/third_party/vulkan-deps/spirv-tools/src/CHANGES
index 467655c..0364c25 100644
--- a/third_party/vulkan-deps/spirv-tools/src/CHANGES
+++ b/third_party/vulkan-deps/spirv-tools/src/CHANGES
@@ -1,7 +1,33 @@
 Revision history for SPIRV-Tools
 
-v2021.3-dev 2021-06-22
- - Start v2021.3-dev
+v2021.4-dev 2021-08-25
+   - Start v2021.4-dev
+
+v2021.3 2021-08-24
+ - General
+    - Initial support for SPV_KHR_integer_dot_product (#4327)
+    - Add non-semantic vulkan extended instruction set (#4362)
+    - Add common enum for debug info instructions from either opencl or vulkan (#4377)
+ - Validator
+    - Add validation for SPV_EXT_shader_atomic_float16_add (#4325)
+    - Disallow loading a runtime-sized array (#4473)
+    - spirv-val: Validate vulkan debug info similarly to opencl debug info (#4466)
+ - Optimizer
+    - spirv-opt: support SPV_EXT_shader_image_int64 (#4379)
+    - spirv-opt: Add dataflow analysis framework (#4402)
+    - Add control dependence analysis to opt (#4380)
+    - Add spirv-opt convert-to-sampled-image pass (#4340)
+    - spirv-opt: Add handling of vulkan debug info to DebugInfoManager (#4423)
+ - Fuzz
+    - spirv-fuzz: support AtomicLoad (#4330)
+    - spirv-fuzz: Support AtomicStore (#4440)
+    - spirv-fuzz: TransformationWrapVectorSynonym that rewrites scalar operations using vectors (#4376)
+    - spirv-fuzz: Add minimal SPIR-V example to test shaders (#4415)
+    - spirv-fuzz: support building using gn (#4365)
+ - Linter
+    - Add new target for spirv-lint (#4446)
+    - spirv-lint: add basic CLI argument handling (#4478)
+    - Add divergence analysis to linter (#4465)
 
 v2021.2 2021-06-18
  - General
diff --git a/third_party/vulkan-deps/spirv-tools/src/CMakeLists.txt b/third_party/vulkan-deps/spirv-tools/src/CMakeLists.txt
index 84a7bb7..01e3b16 100644
--- a/third_party/vulkan-deps/spirv-tools/src/CMakeLists.txt
+++ b/third_party/vulkan-deps/spirv-tools/src/CMakeLists.txt
@@ -84,6 +84,10 @@
 
 option(SPIRV_BUILD_FUZZER "Build spirv-fuzz" OFF)
 
+set(SPIRV_LIB_FUZZING_ENGINE_LINK_OPTIONS "" CACHE STRING "Used by OSS-Fuzz to control, via link options, which fuzzing engine should be used")
+
+option(SPIRV_BUILD_LIBFUZZER_TARGETS "Build libFuzzer targets" OFF)
+
 option(SPIRV_WERROR "Enable error on warning" ON)
 if(("${CMAKE_CXX_COMPILER_ID}" MATCHES "GNU") OR (("${CMAKE_CXX_COMPILER_ID}" MATCHES "Clang") AND (NOT CMAKE_CXX_SIMULATE_ID STREQUAL "MSVC")))
   set(COMPILER_IS_LIKE_GNU TRUE)
@@ -292,7 +296,7 @@
 # Turn off if they take too long.
 option(SPIRV_CHECK_CONTEXT "In a debug build, check if the IR context is in a valid state." ON)
 if (${SPIRV_CHECK_CONTEXT})
-  add_definitions(-DSPIRV_CHECK_CONTEXT)
+  add_compile_options($<$<CONFIG:Debug>:-DSPIRV_CHECK_CONTEXT>)
 endif()
 
 # Precompiled header macro. Parameters are source file list and filename for pch cpp file.
diff --git a/third_party/vulkan-deps/spirv-tools/src/DEPS b/third_party/vulkan-deps/spirv-tools/src/DEPS
index 718927d..92c67e0 100644
--- a/third_party/vulkan-deps/spirv-tools/src/DEPS
+++ b/third_party/vulkan-deps/spirv-tools/src/DEPS
@@ -6,7 +6,7 @@
   'effcee_revision': '2ec8f8738118cc483b67c04a759fee53496c5659',
   'googletest_revision': 'b7d472f1225c5a64943821d8483fecb469d3f382',
   're2_revision': 'f8e389f3acdc2517562924239e2a188037393683',
-  'spirv_headers_revision': 'ddf3230c14c71e81fc0eae9b781cc4bcc2d1f0f5',
+  'spirv_headers_revision': 'e71feddb3f17c5586ff7f4cfb5ed1258b800574b',
 }
 
 deps = {
diff --git a/third_party/vulkan-deps/spirv-tools/src/README.md b/third_party/vulkan-deps/spirv-tools/src/README.md
index 804b763..9230fd1 100644
--- a/third_party/vulkan-deps/spirv-tools/src/README.md
+++ b/third_party/vulkan-deps/spirv-tools/src/README.md
@@ -45,6 +45,20 @@
 Use the `--version` option on each command line tool to see the software
 version.  An API call reports the software version as a C-style string.
 
+## Releases
+
+Some versions of SPIRV-Tools are tagged as stable releases (see
+[tags](https://github.com/KhronosGroup/SPIRV-Tools/tags) on github).
+These versions undergo extra testing.
+Releases are not directly related to releases (or versions) of
+[SPIRV-Headers][spirv-headers].
+Releases of SPIRV-Tools are tested against the version of SPIRV-Headers listed
+in the DEPS file.
+The release generally uses the most recent compatible version of SPIRV-Headers
+available at the time of release.
+No version of SPIRV-Headers other than the one listed in the DEPS file is
+guaranteed to work with the SPIRV-Tools release.
+
 ## Supported features
 
 ### Assembler, binary parser, and disassembler
diff --git a/third_party/vulkan-deps/spirv-tools/src/build_defs.bzl b/third_party/vulkan-deps/spirv-tools/src/build_defs.bzl
index 638b16d..519fa19 100644
--- a/third_party/vulkan-deps/spirv-tools/src/build_defs.bzl
+++ b/third_party/vulkan-deps/spirv-tools/src/build_defs.bzl
@@ -224,6 +224,23 @@
         ] + deps,
     )
 
+def lint_test(name, srcs, deps = []):
+    if name[-5:] != "_test":
+        name = name + "_test"
+    native.cc_test(
+        name = "lint_" + name,
+        srcs = srcs,
+        compatible_with = [],
+        copts = TEST_COPTS,
+        size = "large",
+        deps = [
+            ":spirv_tools_lint",
+            "@com_google_googletest//:gtest_main",
+            "@com_google_googletest//:gtest",
+            "@com_google_effcee//:effcee",
+        ] + deps,
+    )
+
 def link_test(name, srcs, deps = []):
     if name[-5:] != "_test":
         name = name + "_test"
diff --git a/third_party/vulkan-deps/spirv-tools/src/include/spirv-tools/libspirv.h b/third_party/vulkan-deps/spirv-tools/src/include/spirv-tools/libspirv.h
index 999589e..1cd40cc 100644
--- a/third_party/vulkan-deps/spirv-tools/src/include/spirv-tools/libspirv.h
+++ b/third_party/vulkan-deps/spirv-tools/src/include/spirv-tools/libspirv.h
@@ -659,6 +659,11 @@
 SPIRV_TOOLS_EXPORT void spvValidatorOptionsSetSkipBlockLayout(
     spv_validator_options options, bool val);
 
+// Records whether or not the validator should allow the LocalSizeId
+// decoration where the environment otherwise would not allow it.
+SPIRV_TOOLS_EXPORT void spvValidatorOptionsSetAllowLocalSizeId(
+    spv_validator_options options, bool val);
+
 // Creates an optimizer options object with default options. Returns a valid
 // options object. The object remains valid until it is passed into
 // |spvOptimizerOptionsDestroy|.
diff --git a/third_party/vulkan-deps/spirv-tools/src/include/spirv-tools/libspirv.hpp b/third_party/vulkan-deps/spirv-tools/src/include/spirv-tools/libspirv.hpp
index 0c31a18..8dfb46b 100644
--- a/third_party/vulkan-deps/spirv-tools/src/include/spirv-tools/libspirv.hpp
+++ b/third_party/vulkan-deps/spirv-tools/src/include/spirv-tools/libspirv.hpp
@@ -115,6 +115,12 @@
     spvValidatorOptionsSetSkipBlockLayout(options_, val);
   }
 
+  // Enables LocalSizeId decorations where the environment would not otherwise
+  // allow them.
+  void SetAllowLocalSizeId(bool val) {
+    spvValidatorOptionsSetAllowLocalSizeId(options_, val);
+  }
+
   // Records whether or not the validator should relax the rules on pointer
   // usage in logical addressing mode.
   //
diff --git a/third_party/vulkan-deps/spirv-tools/src/include/spirv-tools/linter.hpp b/third_party/vulkan-deps/spirv-tools/src/include/spirv-tools/linter.hpp
new file mode 100644
index 0000000..52ed5a4
--- /dev/null
+++ b/third_party/vulkan-deps/spirv-tools/src/include/spirv-tools/linter.hpp
@@ -0,0 +1,48 @@
+// Copyright (c) 2021 Google LLC.
+//
+// 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.
+
+#ifndef INCLUDE_SPIRV_TOOLS_LINTER_HPP_
+#define INCLUDE_SPIRV_TOOLS_LINTER_HPP_
+
+#include "libspirv.hpp"
+
+namespace spvtools {
+
+// C++ interface for SPIR-V linting functionalities. It wraps the context
+// (including target environment and the corresponding SPIR-V grammar) and
+// provides a method for linting.
+//
+// Instances of this class provides basic thread-safety guarantee.
+class Linter {
+ public:
+  explicit Linter(spv_target_env env);
+
+  ~Linter();
+
+  // Sets the message consumer to the given |consumer|. The |consumer| will be
+  // invoked once for each message communicated from the library.
+  void SetMessageConsumer(MessageConsumer consumer);
+
+  // Returns a reference to the registered message consumer.
+  const MessageConsumer& Consumer() const;
+
+  bool Run(const uint32_t* binary, size_t binary_size);
+
+ private:
+  struct Impl;
+  std::unique_ptr<Impl> impl_;
+};
+}  // namespace spvtools
+
+#endif  // INCLUDE_SPIRV_TOOLS_LINTER_HPP_
diff --git a/third_party/vulkan-deps/spirv-tools/src/include/spirv-tools/optimizer.hpp b/third_party/vulkan-deps/spirv-tools/src/include/spirv-tools/optimizer.hpp
index 700f59f..8141ec8 100644
--- a/third_party/vulkan-deps/spirv-tools/src/include/spirv-tools/optimizer.hpp
+++ b/third_party/vulkan-deps/spirv-tools/src/include/spirv-tools/optimizer.hpp
@@ -19,6 +19,7 @@
 #include <ostream>
 #include <string>
 #include <unordered_map>
+#include <utility>
 #include <vector>
 
 #include "libspirv.hpp"
@@ -27,6 +28,7 @@
 
 namespace opt {
 class Pass;
+struct DescriptorSetAndBinding;
 }
 
 // C++ interface for SPIR-V optimization functionalities. It wraps the context
@@ -699,8 +701,11 @@
 // Create a pass to reduce the size of loads.
 // This pass looks for loads of structures where only a few of its members are
 // used.  It replaces the loads feeding an OpExtract with an OpAccessChain and
-// a load of the specific elements.
-Optimizer::PassToken CreateReduceLoadSizePass();
+// a load of the specific elements.  The parameter is a threshold to determine
+// whether we have to replace the load or not.  If the ratio of the used
+// components of the load is less than the threshold, we replace the load.
+Optimizer::PassToken CreateReduceLoadSizePass(
+    double load_replacement_threshold = 0.9);
 
 // Create a pass to combine chained access chains.
 // This pass looks for access chains fed by other access chains and combines
@@ -854,6 +859,16 @@
 // propagated into their final positions.
 Optimizer::PassToken CreateInterpolateFixupPass();
 
+// Creates a convert-to-sampled-image pass to convert images and/or
+// samplers with given pairs of descriptor set and binding to sampled image.
+// If a pair of an image and a sampler have the same pair of descriptor set and
+// binding that is one of the given pairs, they will be converted to a sampled
+// image. In addition, if only an image has the descriptor set and binding that
+// is one of the given pairs, it will be converted to a sampled image as well.
+Optimizer::PassToken CreateConvertToSampledImagePass(
+    const std::vector<opt::DescriptorSetAndBinding>&
+        descriptor_set_binding_pairs);
+
 }  // namespace spvtools
 
 #endif  // INCLUDE_SPIRV_TOOLS_OPTIMIZER_HPP_
diff --git a/third_party/vulkan-deps/spirv-tools/src/kokoro/scripts/linux/build-docker.sh b/third_party/vulkan-deps/spirv-tools/src/kokoro/scripts/linux/build-docker.sh
index 553f075..c6bbe95 100755
--- a/third_party/vulkan-deps/spirv-tools/src/kokoro/scripts/linux/build-docker.sh
+++ b/third_party/vulkan-deps/spirv-tools/src/kokoro/scripts/linux/build-docker.sh
@@ -79,6 +79,10 @@
     SKIP_TESTS="True"
   fi
 
+  if [ $COMPILER = "clang" ]; then
+    ADDITIONAL_CMAKE_FLAGS="$ADDITIONAL_CMAKE_FLAGS -DSPIRV_BUILD_LIBFUZZER_TARGETS=ON"
+  fi
+
   clean_dir "$ROOT_DIR/build"
   cd "$ROOT_DIR/build"
 
diff --git a/third_party/vulkan-deps/spirv-tools/src/source/CMakeLists.txt b/third_party/vulkan-deps/spirv-tools/src/source/CMakeLists.txt
index e4568e3..6530f06 100644
--- a/third_party/vulkan-deps/spirv-tools/src/source/CMakeLists.txt
+++ b/third_party/vulkan-deps/spirv-tools/src/source/CMakeLists.txt
@@ -219,6 +219,7 @@
 add_subdirectory(reduce)
 add_subdirectory(fuzz)
 add_subdirectory(link)
+add_subdirectory(lint)
 
 set(SPIRV_SOURCES
   ${spirv-tools_SOURCE_DIR}/include/spirv-tools/libspirv.h
diff --git a/third_party/vulkan-deps/spirv-tools/src/source/ext_inst.cpp b/third_party/vulkan-deps/spirv-tools/src/source/ext_inst.cpp
index f5f4331..8246c20 100644
--- a/third_party/vulkan-deps/spirv-tools/src/source/ext_inst.cpp
+++ b/third_party/vulkan-deps/spirv-tools/src/source/ext_inst.cpp
@@ -155,6 +155,7 @@
 
 bool spvExtInstIsDebugInfo(const spv_ext_inst_type_t type) {
   if (type == SPV_EXT_INST_TYPE_OPENCL_DEBUGINFO_100 ||
+      type == SPV_EXT_INST_TYPE_NONSEMANTIC_VULKAN_DEBUGINFO_100 ||
       type == SPV_EXT_INST_TYPE_DEBUGINFO) {
     return true;
   }
diff --git a/third_party/vulkan-deps/spirv-tools/src/source/extinst.nonsemantic.vulkan.debuginfo.100.grammar.json b/third_party/vulkan-deps/spirv-tools/src/source/extinst.nonsemantic.vulkan.debuginfo.100.grammar.json
index 371aa42..1d7914d 100644
--- a/third_party/vulkan-deps/spirv-tools/src/source/extinst.nonsemantic.vulkan.debuginfo.100.grammar.json
+++ b/third_party/vulkan-deps/spirv-tools/src/source/extinst.nonsemantic.vulkan.debuginfo.100.grammar.json
@@ -47,7 +47,8 @@
       "operands" : [
         { "kind" : "IdRef", "name" : "'Name'" },
         { "kind" : "IdRef", "name" : "'Size'" },
-        { "kind" : "IdRef", "name" : "'Encoding'" }
+        { "kind" : "IdRef", "name" : "'Encoding'" },
+        { "kind" : "IdRef", "name" : "'Flags'" }
       ]
     },
     {
diff --git a/third_party/vulkan-deps/spirv-tools/src/source/fuzz/CMakeLists.txt b/third_party/vulkan-deps/spirv-tools/src/source/fuzz/CMakeLists.txt
index a806166..dd674dd 100644
--- a/third_party/vulkan-deps/spirv-tools/src/source/fuzz/CMakeLists.txt
+++ b/third_party/vulkan-deps/spirv-tools/src/source/fuzz/CMakeLists.txt
@@ -124,6 +124,7 @@
         fuzzer_pass_swap_functions.h
         fuzzer_pass_toggle_access_chain_instruction.h
         fuzzer_pass_wrap_regions_in_selections.h
+        fuzzer_pass_wrap_vector_synonym.h
         fuzzer_util.h
         id_use_descriptor.h
         instruction_descriptor.h
@@ -230,6 +231,7 @@
         transformation_vector_shuffle.h
         transformation_wrap_early_terminator_in_function.h
         transformation_wrap_region_in_selection.h
+        transformation_wrap_vector_synonym.h
         uniform_buffer_element_descriptor.h
         ${CMAKE_CURRENT_BINARY_DIR}/protobufs/spvtoolsfuzz.pb.h
 
@@ -319,6 +321,7 @@
         fuzzer_pass_swap_functions.cpp
         fuzzer_pass_toggle_access_chain_instruction.cpp
         fuzzer_pass_wrap_regions_in_selections.cpp
+        fuzzer_pass_wrap_vector_synonym.cpp
         fuzzer_util.cpp
         id_use_descriptor.cpp
         instruction_descriptor.cpp
@@ -423,6 +426,7 @@
         transformation_vector_shuffle.cpp
         transformation_wrap_early_terminator_in_function.cpp
         transformation_wrap_region_in_selection.cpp
+        transformation_wrap_vector_synonym.cpp
         uniform_buffer_element_descriptor.cpp
         ${CMAKE_CURRENT_BINARY_DIR}/protobufs/spvtoolsfuzz.pb.cc
         )
diff --git a/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer.cpp b/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer.cpp
index fe88a55..9838e64 100644
--- a/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer.cpp
+++ b/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer.cpp
@@ -90,6 +90,7 @@
 #include "source/fuzz/fuzzer_pass_swap_functions.h"
 #include "source/fuzz/fuzzer_pass_toggle_access_chain_instruction.h"
 #include "source/fuzz/fuzzer_pass_wrap_regions_in_selections.h"
+#include "source/fuzz/fuzzer_pass_wrap_vector_synonym.h"
 #include "source/fuzz/pass_management/repeated_pass_manager.h"
 #include "source/fuzz/pass_management/repeated_pass_recommender_standard.h"
 #include "source/fuzz/protobufs/spirvfuzz_protobufs.h"
@@ -109,7 +110,8 @@
                bool enable_all_passes,
                RepeatedPassStrategy repeated_pass_strategy,
                bool validate_after_each_fuzzer_pass,
-               spv_validator_options validator_options)
+               spv_validator_options validator_options,
+               bool ignore_inapplicable_transformations /* = true */)
     : consumer_(std::move(consumer)),
       enable_all_passes_(enable_all_passes),
       validate_after_each_fuzzer_pass_(validate_after_each_fuzzer_pass),
@@ -123,7 +125,9 @@
       pass_instances_(),
       repeated_pass_recommender_(nullptr),
       repeated_pass_manager_(nullptr),
-      final_passes_() {
+      final_passes_(),
+      ignore_inapplicable_transformations_(
+          ignore_inapplicable_transformations) {
   assert(ir_context_ && "IRContext is not initialized");
   assert(fuzzer_context_ && "FuzzerContext is not initialized");
   assert(transformation_context_ && "TransformationContext is not initialized");
@@ -214,6 +218,7 @@
     MaybeAddRepeatedPass<FuzzerPassSwapBranchConditionalOperands>(
         &pass_instances_);
     MaybeAddRepeatedPass<FuzzerPassWrapRegionsInSelections>(&pass_instances_);
+    MaybeAddRepeatedPass<FuzzerPassWrapVectorSynonym>(&pass_instances_);
     // There is a theoretical possibility that no pass instances were created
     // until now; loop again if so.
   } while (pass_instances_.GetPasses().empty());
@@ -255,7 +260,8 @@
       fuzzer_context_->ChoosePercentage(percentage_chance_of_adding_pass)) {
     pass_instances->SetPass(MakeUnique<FuzzerPassT>(
         ir_context_.get(), transformation_context_.get(), fuzzer_context_.get(),
-        &transformation_sequence_out_, std::forward<Args>(extra_args)...));
+        &transformation_sequence_out_, ignore_inapplicable_transformations_,
+        std::forward<Args>(extra_args)...));
   }
 }
 
@@ -265,7 +271,8 @@
   if (enable_all_passes_ || fuzzer_context_->ChooseEven()) {
     passes->push_back(MakeUnique<FuzzerPassT>(
         ir_context_.get(), transformation_context_.get(), fuzzer_context_.get(),
-        &transformation_sequence_out_, std::forward<Args>(extra_args)...));
+        &transformation_sequence_out_, ignore_inapplicable_transformations_,
+        std::forward<Args>(extra_args)...));
   }
 }
 
diff --git a/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer.h b/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer.h
index 1e7d686..4c38977 100644
--- a/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer.h
+++ b/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer.h
@@ -62,7 +62,8 @@
          const std::vector<fuzzerutil::ModuleSupplier>& donor_suppliers,
          bool enable_all_passes, RepeatedPassStrategy repeated_pass_strategy,
          bool validate_after_each_fuzzer_pass,
-         spv_validator_options validator_options);
+         spv_validator_options validator_options,
+         bool ignore_inapplicable_transformations = true);
 
   // Disables copy/move constructor/assignment operations.
   Fuzzer(const Fuzzer&) = delete;
@@ -187,6 +188,12 @@
   // Some passes that it does not make sense to apply repeatedly, as they do not
   // unlock other passes.
   std::vector<std::unique_ptr<FuzzerPass>> final_passes_;
+
+  // When set, this flag causes inapplicable transformations that should be
+  // applicable by construction to be ignored. This is useful when the fuzzer
+  // is being deployed at scale to test a SPIR-V processing tool, and where it
+  // is desirable to ignore bugs in the fuzzer itself.
+  const bool ignore_inapplicable_transformations_;
 };
 
 }  // namespace fuzz
diff --git a/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_context.cpp b/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_context.cpp
index 9e9650f..c217542 100644
--- a/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_context.cpp
+++ b/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_context.cpp
@@ -42,6 +42,8 @@
 const std::pair<uint32_t, uint32_t> kChanceOfAddingAnotherStructField = {20,
                                                                          90};
 const std::pair<uint32_t, uint32_t> kChanceOfAddingArrayOrStructType = {20, 90};
+const std::pair<uint32_t, uint32_t> KChanceOfAddingAtomicLoad = {30, 90};
+const std::pair<uint32_t, uint32_t> KChanceOfAddingAtomicStore = {20, 90};
 const std::pair<uint32_t, uint32_t> kChanceOfAddingBitInstructionSynonym = {5,
                                                                             20};
 const std::pair<uint32_t, uint32_t>
@@ -162,6 +164,7 @@
     20, 90};
 const std::pair<uint32_t, uint32_t> kChanceOfWrappingRegionInSelection = {70,
                                                                           90};
+const std::pair<uint32_t, uint32_t> kChanceOfWrappingVectorSynonym = {10, 90};
 
 // Default limits for various quantities that are chosen during fuzzing.
 // Keep them in alphabetical order.
@@ -215,6 +218,10 @@
       ChooseBetweenMinAndMax(kChanceOfAddingAnotherStructField);
   chance_of_adding_array_or_struct_type_ =
       ChooseBetweenMinAndMax(kChanceOfAddingArrayOrStructType);
+  chance_of_adding_atomic_load_ =
+      ChooseBetweenMinAndMax(KChanceOfAddingAtomicLoad);
+  chance_of_adding_atomic_store_ =
+      ChooseBetweenMinAndMax(KChanceOfAddingAtomicStore);
   chance_of_adding_bit_instruction_synonym_ =
       ChooseBetweenMinAndMax(kChanceOfAddingBitInstructionSynonym);
   chance_of_adding_both_branches_when_replacing_opselect_ =
@@ -369,6 +376,8 @@
       ChooseBetweenMinAndMax(kChanceOfTogglingAccessChainInstruction);
   chance_of_wrapping_region_in_selection_ =
       ChooseBetweenMinAndMax(kChanceOfWrappingRegionInSelection);
+  chance_of_wrapping_vector_synonym_ =
+      ChooseBetweenMinAndMax(kChanceOfWrappingVectorSynonym);
 }
 
 FuzzerContext::~FuzzerContext() = default;
diff --git a/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_context.h b/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_context.h
index ef2cc2c..77a5d40 100644
--- a/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_context.h
+++ b/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_context.h
@@ -142,6 +142,12 @@
   uint32_t GetChanceOfAddingArrayOrStructType() const {
     return chance_of_adding_array_or_struct_type_;
   }
+  uint32_t GetChanceOfAddingAtomicLoad() const {
+    return chance_of_adding_atomic_load_;
+  }
+  uint32_t GetChanceOfAddingAtomicStore() const {
+    return chance_of_adding_atomic_store_;
+  }
   uint32_t GetChanceOfAddingBitInstructionSynonym() const {
     return chance_of_adding_bit_instruction_synonym_;
   }
@@ -381,6 +387,10 @@
     return chance_of_wrapping_region_in_selection_;
   }
 
+  uint32_t GetChanceOfWrappingVectorSynonym() const {
+    return chance_of_wrapping_vector_synonym_;
+  }
+
   // Other functions to control transformations. Keep them in alphabetical
   // order.
   uint32_t GetMaximumEquivalenceClassSizeForDataSynonymFactClosure() const {
@@ -425,6 +435,9 @@
   uint32_t GetRandomIndexForCompositeInsert(uint32_t number_of_components) {
     return random_generator_->RandomUint32(number_of_components);
   }
+  uint32_t GetRandomIndexForWrappingVector(uint32_t vector_width) {
+    return random_generator_->RandomUint32(vector_width);
+  }
   int64_t GetRandomValueForStepConstantInLoop() {
     return random_generator_->RandomUint64(UINT64_MAX);
   }
@@ -462,6 +475,9 @@
     // Ensure that the number of unused components is non-zero.
     return random_generator_->RandomUint32(max_unused_component_count) + 1;
   }
+  uint32_t GetWidthOfWrappingVector() {
+    return 2 + random_generator_->RandomUint32(3);
+  }
   bool GoDeeperInConstantObfuscation(uint32_t depth) {
     return go_deeper_in_constant_obfuscation_(depth, random_generator_.get());
   }
@@ -482,6 +498,8 @@
   uint32_t chance_of_adding_another_pass_to_pass_loop_;
   uint32_t chance_of_adding_another_struct_field_;
   uint32_t chance_of_adding_array_or_struct_type_;
+  uint32_t chance_of_adding_atomic_load_;
+  uint32_t chance_of_adding_atomic_store_;
   uint32_t chance_of_adding_bit_instruction_synonym_;
   uint32_t chance_of_adding_both_branches_when_replacing_opselect_;
   uint32_t chance_of_adding_composite_extract_;
@@ -562,6 +580,7 @@
   uint32_t chance_of_swapping_functions_;
   uint32_t chance_of_toggling_access_chain_instruction_;
   uint32_t chance_of_wrapping_region_in_selection_;
+  uint32_t chance_of_wrapping_vector_synonym_;
 
   // Limits associated with various quantities for which random values are
   // chosen during fuzzing.
diff --git a/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass.cpp b/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass.cpp
index 9e95190..d91482c 100644
--- a/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass.cpp
+++ b/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass.cpp
@@ -43,11 +43,14 @@
 FuzzerPass::FuzzerPass(opt::IRContext* ir_context,
                        TransformationContext* transformation_context,
                        FuzzerContext* fuzzer_context,
-                       protobufs::TransformationSequence* transformations)
+                       protobufs::TransformationSequence* transformations,
+                       bool ignore_inapplicable_transformations)
     : ir_context_(ir_context),
       transformation_context_(transformation_context),
       fuzzer_context_(fuzzer_context),
-      transformations_(transformations) {}
+      transformations_(transformations),
+      ignore_inapplicable_transformations_(
+          ignore_inapplicable_transformations) {}
 
 FuzzerPass::~FuzzerPass() = default;
 
@@ -183,9 +186,23 @@
 }
 
 void FuzzerPass::ApplyTransformation(const Transformation& transformation) {
-  assert(transformation.IsApplicable(GetIRContext(),
-                                     *GetTransformationContext()) &&
-         "Transformation should be applicable by construction.");
+  if (ignore_inapplicable_transformations_) {
+    // If an applicable-by-construction transformation turns out to be
+    // inapplicable, this is a bug in the fuzzer. However, when deploying the
+    // fuzzer at scale for finding bugs in SPIR-V processing tools it is
+    // desirable to silently ignore such bugs. This code path caters for that
+    // scenario.
+    if (!transformation.IsApplicable(GetIRContext(),
+                                     *GetTransformationContext())) {
+      return;
+    }
+  } else {
+    // This code path caters for debugging bugs in the fuzzer, where an
+    // applicable-by-construction transformation turns out to be inapplicable.
+    assert(transformation.IsApplicable(GetIRContext(),
+                                       *GetTransformationContext()) &&
+           "Transformation should be applicable by construction.");
+  }
   transformation.Apply(GetIRContext(), GetTransformationContext());
   auto transformation_message = transformation.ToMessage();
   assert(transformation_message.transformation_case() !=
diff --git a/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass.h b/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass.h
index ec25485..2655b54 100644
--- a/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass.h
+++ b/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass.h
@@ -33,7 +33,8 @@
   FuzzerPass(opt::IRContext* ir_context,
              TransformationContext* transformation_context,
              FuzzerContext* fuzzer_context,
-             protobufs::TransformationSequence* transformations);
+             protobufs::TransformationSequence* transformations,
+             bool ignore_inapplicable_transformations);
 
   virtual ~FuzzerPass();
 
@@ -321,6 +322,10 @@
   TransformationContext* transformation_context_;
   FuzzerContext* fuzzer_context_;
   protobufs::TransformationSequence* transformations_;
+  // If set, then transformations that should be applicable by construction are
+  // still tested for applicability, and ignored if they turn out to be
+  // inapplicable. Otherwise, applicability by construction is asserted.
+  const bool ignore_inapplicable_transformations_;
 };
 
 }  // namespace fuzz
diff --git a/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_add_access_chains.cpp b/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_add_access_chains.cpp
index c498642..39f193d 100644
--- a/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_add_access_chains.cpp
+++ b/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_add_access_chains.cpp
@@ -23,9 +23,10 @@
 FuzzerPassAddAccessChains::FuzzerPassAddAccessChains(
     opt::IRContext* ir_context, TransformationContext* transformation_context,
     FuzzerContext* fuzzer_context,
-    protobufs::TransformationSequence* transformations)
+    protobufs::TransformationSequence* transformations,
+    bool ignore_inapplicable_transformations)
     : FuzzerPass(ir_context, transformation_context, fuzzer_context,
-                 transformations) {}
+                 transformations, ignore_inapplicable_transformations) {}
 
 void FuzzerPassAddAccessChains::Apply() {
   ForEachInstructionWithInstructionDescriptor(
diff --git a/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_add_access_chains.h b/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_add_access_chains.h
index e80c2c6..5e209cd 100644
--- a/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_add_access_chains.h
+++ b/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_add_access_chains.h
@@ -28,7 +28,8 @@
   FuzzerPassAddAccessChains(opt::IRContext* ir_context,
                             TransformationContext* transformation_context,
                             FuzzerContext* fuzzer_context,
-                            protobufs::TransformationSequence* transformations);
+                            protobufs::TransformationSequence* transformations,
+                            bool ignore_inapplicable_transformations);
 
   void Apply() override;
 };
diff --git a/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_add_bit_instruction_synonyms.cpp b/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_add_bit_instruction_synonyms.cpp
index 78abf5b..1b0d7b1 100644
--- a/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_add_bit_instruction_synonyms.cpp
+++ b/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_add_bit_instruction_synonyms.cpp
@@ -24,9 +24,10 @@
 FuzzerPassAddBitInstructionSynonyms::FuzzerPassAddBitInstructionSynonyms(
     opt::IRContext* ir_context, TransformationContext* transformation_context,
     FuzzerContext* fuzzer_context,
-    protobufs::TransformationSequence* transformations)
+    protobufs::TransformationSequence* transformations,
+    bool ignore_inapplicable_transformations)
     : FuzzerPass(ir_context, transformation_context, fuzzer_context,
-                 transformations) {}
+                 transformations, ignore_inapplicable_transformations) {}
 
 void FuzzerPassAddBitInstructionSynonyms::Apply() {
   for (auto& function : *GetIRContext()->module()) {
diff --git a/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_add_bit_instruction_synonyms.h b/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_add_bit_instruction_synonyms.h
index 28f9577..38d81aa 100644
--- a/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_add_bit_instruction_synonyms.h
+++ b/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_add_bit_instruction_synonyms.h
@@ -28,7 +28,8 @@
   FuzzerPassAddBitInstructionSynonyms(
       opt::IRContext* ir_context, TransformationContext* transformation_context,
       FuzzerContext* fuzzer_context,
-      protobufs::TransformationSequence* transformations);
+      protobufs::TransformationSequence* transformations,
+      bool ignore_inapplicable_transformations);
 
   void Apply() override;
 };
diff --git a/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_add_composite_extract.cpp b/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_add_composite_extract.cpp
index 19f9902..dbbec0c 100644
--- a/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_add_composite_extract.cpp
+++ b/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_add_composite_extract.cpp
@@ -26,9 +26,10 @@
 FuzzerPassAddCompositeExtract::FuzzerPassAddCompositeExtract(
     opt::IRContext* ir_context, TransformationContext* transformation_context,
     FuzzerContext* fuzzer_context,
-    protobufs::TransformationSequence* transformations)
+    protobufs::TransformationSequence* transformations,
+    bool ignore_inapplicable_transformations)
     : FuzzerPass(ir_context, transformation_context, fuzzer_context,
-                 transformations) {}
+                 transformations, ignore_inapplicable_transformations) {}
 
 void FuzzerPassAddCompositeExtract::Apply() {
   std::vector<const protobufs::DataDescriptor*> composite_synonyms;
diff --git a/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_add_composite_extract.h b/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_add_composite_extract.h
index 32ac190..e7ed18a 100644
--- a/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_add_composite_extract.h
+++ b/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_add_composite_extract.h
@@ -27,7 +27,8 @@
   FuzzerPassAddCompositeExtract(
       opt::IRContext* ir_context, TransformationContext* transformation_context,
       FuzzerContext* fuzzer_context,
-      protobufs::TransformationSequence* transformations);
+      protobufs::TransformationSequence* transformations,
+      bool ignore_inapplicable_transformations);
 
   void Apply() override;
 };
diff --git a/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_add_composite_inserts.cpp b/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_add_composite_inserts.cpp
index cf314d3..2ac12de 100644
--- a/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_add_composite_inserts.cpp
+++ b/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_add_composite_inserts.cpp
@@ -25,9 +25,10 @@
 FuzzerPassAddCompositeInserts::FuzzerPassAddCompositeInserts(
     opt::IRContext* ir_context, TransformationContext* transformation_context,
     FuzzerContext* fuzzer_context,
-    protobufs::TransformationSequence* transformations)
+    protobufs::TransformationSequence* transformations,
+    bool ignore_inapplicable_transformations)
     : FuzzerPass(ir_context, transformation_context, fuzzer_context,
-                 transformations) {}
+                 transformations, ignore_inapplicable_transformations) {}
 
 void FuzzerPassAddCompositeInserts::Apply() {
   ForEachInstructionWithInstructionDescriptor(
diff --git a/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_add_composite_inserts.h b/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_add_composite_inserts.h
index 4d511f6..d9f42d5 100644
--- a/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_add_composite_inserts.h
+++ b/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_add_composite_inserts.h
@@ -27,7 +27,8 @@
   FuzzerPassAddCompositeInserts(
       opt::IRContext* ir_context, TransformationContext* transformation_context,
       FuzzerContext* fuzzer_context,
-      protobufs::TransformationSequence* transformations);
+      protobufs::TransformationSequence* transformations,
+      bool ignore_inapplicable_transformations);
 
   void Apply() override;
 
diff --git a/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_add_composite_types.cpp b/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_add_composite_types.cpp
index 3dfbd69..af36ad0 100644
--- a/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_add_composite_types.cpp
+++ b/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_add_composite_types.cpp
@@ -24,9 +24,10 @@
 FuzzerPassAddCompositeTypes::FuzzerPassAddCompositeTypes(
     opt::IRContext* ir_context, TransformationContext* transformation_context,
     FuzzerContext* fuzzer_context,
-    protobufs::TransformationSequence* transformations)
+    protobufs::TransformationSequence* transformations,
+    bool ignore_inapplicable_transformations)
     : FuzzerPass(ir_context, transformation_context, fuzzer_context,
-                 transformations) {}
+                 transformations, ignore_inapplicable_transformations) {}
 
 void FuzzerPassAddCompositeTypes::Apply() {
   MaybeAddMissingVectorTypes();
diff --git a/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_add_composite_types.h b/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_add_composite_types.h
index 89d48f8..f16c79e 100644
--- a/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_add_composite_types.h
+++ b/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_add_composite_types.h
@@ -27,7 +27,8 @@
   FuzzerPassAddCompositeTypes(
       opt::IRContext* ir_context, TransformationContext* transformation_context,
       FuzzerContext* fuzzer_context,
-      protobufs::TransformationSequence* transformations);
+      protobufs::TransformationSequence* transformations,
+      bool ignore_inapplicable_transformations);
 
   void Apply() override;
 
diff --git a/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_add_copy_memory.cpp b/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_add_copy_memory.cpp
index b654927..6551f49 100644
--- a/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_add_copy_memory.cpp
+++ b/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_add_copy_memory.cpp
@@ -25,9 +25,10 @@
 FuzzerPassAddCopyMemory::FuzzerPassAddCopyMemory(
     opt::IRContext* ir_context, TransformationContext* transformation_context,
     FuzzerContext* fuzzer_context,
-    protobufs::TransformationSequence* transformations)
+    protobufs::TransformationSequence* transformations,
+    bool ignore_inapplicable_transformations)
     : FuzzerPass(ir_context, transformation_context, fuzzer_context,
-                 transformations) {}
+                 transformations, ignore_inapplicable_transformations) {}
 
 void FuzzerPassAddCopyMemory::Apply() {
   ForEachInstructionWithInstructionDescriptor(
diff --git a/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_add_copy_memory.h b/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_add_copy_memory.h
index 0f7db0c..e258752 100644
--- a/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_add_copy_memory.h
+++ b/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_add_copy_memory.h
@@ -27,7 +27,8 @@
   FuzzerPassAddCopyMemory(opt::IRContext* ir_context,
                           TransformationContext* transformation_context,
                           FuzzerContext* fuzzer_context,
-                          protobufs::TransformationSequence* transformations);
+                          protobufs::TransformationSequence* transformations,
+                          bool ignore_inapplicable_transformations);
 
   void Apply() override;
 };
diff --git a/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_add_dead_blocks.cpp b/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_add_dead_blocks.cpp
index 8c166a2..82d53eb 100644
--- a/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_add_dead_blocks.cpp
+++ b/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_add_dead_blocks.cpp
@@ -31,9 +31,10 @@
 FuzzerPassAddDeadBlocks::FuzzerPassAddDeadBlocks(
     opt::IRContext* ir_context, TransformationContext* transformation_context,
     FuzzerContext* fuzzer_context,
-    protobufs::TransformationSequence* transformations)
+    protobufs::TransformationSequence* transformations,
+    bool ignore_inapplicable_transformations)
     : FuzzerPass(ir_context, transformation_context, fuzzer_context,
-                 transformations) {}
+                 transformations, ignore_inapplicable_transformations) {}
 
 void FuzzerPassAddDeadBlocks::Apply() {
   // We iterate over all blocks in the module collecting up those at which we
diff --git a/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_add_dead_blocks.h b/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_add_dead_blocks.h
index a87c05c..4567e87 100644
--- a/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_add_dead_blocks.h
+++ b/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_add_dead_blocks.h
@@ -27,7 +27,8 @@
   FuzzerPassAddDeadBlocks(opt::IRContext* ir_context,
                           TransformationContext* transformation_context,
                           FuzzerContext* fuzzer_context,
-                          protobufs::TransformationSequence* transformations);
+                          protobufs::TransformationSequence* transformations,
+                          bool ignore_inapplicable_transformations);
 
   void Apply() override;
 };
diff --git a/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_add_dead_breaks.cpp b/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_add_dead_breaks.cpp
index 0c18da9..c3664c8 100644
--- a/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_add_dead_breaks.cpp
+++ b/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_add_dead_breaks.cpp
@@ -24,9 +24,10 @@
 FuzzerPassAddDeadBreaks::FuzzerPassAddDeadBreaks(
     opt::IRContext* ir_context, TransformationContext* transformation_context,
     FuzzerContext* fuzzer_context,
-    protobufs::TransformationSequence* transformations)
+    protobufs::TransformationSequence* transformations,
+    bool ignore_inapplicable_transformations)
     : FuzzerPass(ir_context, transformation_context, fuzzer_context,
-                 transformations) {}
+                 transformations, ignore_inapplicable_transformations) {}
 
 void FuzzerPassAddDeadBreaks::Apply() {
   // We first collect up lots of possibly-applicable transformations.
diff --git a/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_add_dead_breaks.h b/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_add_dead_breaks.h
index d1086fc..361c346 100644
--- a/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_add_dead_breaks.h
+++ b/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_add_dead_breaks.h
@@ -26,7 +26,8 @@
   FuzzerPassAddDeadBreaks(opt::IRContext* ir_context,
                           TransformationContext* transformation_context,
                           FuzzerContext* fuzzer_context,
-                          protobufs::TransformationSequence* transformations);
+                          protobufs::TransformationSequence* transformations,
+                          bool ignore_inapplicable_transformations);
 
   void Apply() override;
 };
diff --git a/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_add_dead_continues.cpp b/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_add_dead_continues.cpp
index 1ab40b7..3881481 100644
--- a/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_add_dead_continues.cpp
+++ b/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_add_dead_continues.cpp
@@ -24,9 +24,10 @@
 FuzzerPassAddDeadContinues::FuzzerPassAddDeadContinues(
     opt::IRContext* ir_context, TransformationContext* transformation_context,
     FuzzerContext* fuzzer_context,
-    protobufs::TransformationSequence* transformations)
+    protobufs::TransformationSequence* transformations,
+    bool ignore_inapplicable_transformations)
     : FuzzerPass(ir_context, transformation_context, fuzzer_context,
-                 transformations) {}
+                 transformations, ignore_inapplicable_transformations) {}
 
 void FuzzerPassAddDeadContinues::Apply() {
   // Consider every block in every function.
diff --git a/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_add_dead_continues.h b/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_add_dead_continues.h
index bf0009e..4f1bd60 100644
--- a/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_add_dead_continues.h
+++ b/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_add_dead_continues.h
@@ -23,10 +23,11 @@
 // A fuzzer pass for adding dead continue edges to the module.
 class FuzzerPassAddDeadContinues : public FuzzerPass {
  public:
-  FuzzerPassAddDeadContinues(
-      opt::IRContext* ir_context, TransformationContext* transformation_context,
-      FuzzerContext* fuzzer_context,
-      protobufs::TransformationSequence* transformations);
+  FuzzerPassAddDeadContinues(opt::IRContext* ir_context,
+                             TransformationContext* transformation_context,
+                             FuzzerContext* fuzzer_context,
+                             protobufs::TransformationSequence* transformations,
+                             bool ignore_inapplicable_transformations);
 
   void Apply() override;
 };
diff --git a/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_add_equation_instructions.cpp b/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_add_equation_instructions.cpp
index 15554b7..4bbded8 100644
--- a/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_add_equation_instructions.cpp
+++ b/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_add_equation_instructions.cpp
@@ -45,9 +45,10 @@
 FuzzerPassAddEquationInstructions::FuzzerPassAddEquationInstructions(
     opt::IRContext* ir_context, TransformationContext* transformation_context,
     FuzzerContext* fuzzer_context,
-    protobufs::TransformationSequence* transformations)
+    protobufs::TransformationSequence* transformations,
+    bool ignore_inapplicable_transformations)
     : FuzzerPass(ir_context, transformation_context, fuzzer_context,
-                 transformations) {}
+                 transformations, ignore_inapplicable_transformations) {}
 
 void FuzzerPassAddEquationInstructions::Apply() {
   ForEachInstructionWithInstructionDescriptor(
diff --git a/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_add_equation_instructions.h b/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_add_equation_instructions.h
index dbec5ba..dc9a27b 100644
--- a/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_add_equation_instructions.h
+++ b/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_add_equation_instructions.h
@@ -29,7 +29,8 @@
   FuzzerPassAddEquationInstructions(
       opt::IRContext* ir_context, TransformationContext* transformation_context,
       FuzzerContext* fuzzer_context,
-      protobufs::TransformationSequence* transformations);
+      protobufs::TransformationSequence* transformations,
+      bool ignore_inapplicable_transformations);
 
   void Apply() override;
 
diff --git a/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_add_function_calls.cpp b/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_add_function_calls.cpp
index 2240696..033f4a2 100644
--- a/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_add_function_calls.cpp
+++ b/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_add_function_calls.cpp
@@ -26,9 +26,10 @@
 FuzzerPassAddFunctionCalls::FuzzerPassAddFunctionCalls(
     opt::IRContext* ir_context, TransformationContext* transformation_context,
     FuzzerContext* fuzzer_context,
-    protobufs::TransformationSequence* transformations)
+    protobufs::TransformationSequence* transformations,
+    bool ignore_inapplicable_transformations)
     : FuzzerPass(ir_context, transformation_context, fuzzer_context,
-                 transformations) {}
+                 transformations, ignore_inapplicable_transformations) {}
 
 void FuzzerPassAddFunctionCalls::Apply() {
   ForEachInstructionWithInstructionDescriptor(
diff --git a/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_add_function_calls.h b/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_add_function_calls.h
index 081510c..80b03d7 100644
--- a/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_add_function_calls.h
+++ b/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_add_function_calls.h
@@ -24,10 +24,11 @@
 // anywhere, and (b) any functions, from dead blocks.
 class FuzzerPassAddFunctionCalls : public FuzzerPass {
  public:
-  FuzzerPassAddFunctionCalls(
-      opt::IRContext* ir_context, TransformationContext* transformation_context,
-      FuzzerContext* fuzzer_context,
-      protobufs::TransformationSequence* transformations);
+  FuzzerPassAddFunctionCalls(opt::IRContext* ir_context,
+                             TransformationContext* transformation_context,
+                             FuzzerContext* fuzzer_context,
+                             protobufs::TransformationSequence* transformations,
+                             bool ignore_inapplicable_transformations);
 
   void Apply() override;
 
diff --git a/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_add_global_variables.cpp b/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_add_global_variables.cpp
index 0679741..061f44d 100644
--- a/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_add_global_variables.cpp
+++ b/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_add_global_variables.cpp
@@ -23,9 +23,10 @@
 FuzzerPassAddGlobalVariables::FuzzerPassAddGlobalVariables(
     opt::IRContext* ir_context, TransformationContext* transformation_context,
     FuzzerContext* fuzzer_context,
-    protobufs::TransformationSequence* transformations)
+    protobufs::TransformationSequence* transformations,
+    bool ignore_inapplicable_transformations)
     : FuzzerPass(ir_context, transformation_context, fuzzer_context,
-                 transformations) {}
+                 transformations, ignore_inapplicable_transformations) {}
 
 void FuzzerPassAddGlobalVariables::Apply() {
   SpvStorageClass variable_storage_class = SpvStorageClassPrivate;
@@ -47,6 +48,10 @@
 
   // These are the basic types that are available to this fuzzer pass.
   auto& basic_types = basic_type_ids_and_pointers.first;
+  if (basic_types.empty()) {
+    // There are no basic types, so there is nothing this fuzzer pass can do.
+    return;
+  }
 
   // These are the pointers to those basic types that are *initially* available
   // to the fuzzer pass.  The fuzzer pass might add pointer types in cases where
diff --git a/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_add_global_variables.h b/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_add_global_variables.h
index 3745c5c..1496646 100644
--- a/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_add_global_variables.h
+++ b/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_add_global_variables.h
@@ -27,7 +27,8 @@
   FuzzerPassAddGlobalVariables(
       opt::IRContext* ir_context, TransformationContext* transformation_context,
       FuzzerContext* fuzzer_context,
-      protobufs::TransformationSequence* transformations);
+      protobufs::TransformationSequence* transformations,
+      bool ignore_inapplicable_transformations);
 
   void Apply() override;
 };
diff --git a/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_add_image_sample_unused_components.cpp b/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_add_image_sample_unused_components.cpp
index c10db72..19661d1 100644
--- a/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_add_image_sample_unused_components.cpp
+++ b/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_add_image_sample_unused_components.cpp
@@ -27,9 +27,10 @@
         opt::IRContext* ir_context,
         TransformationContext* transformation_context,
         FuzzerContext* fuzzer_context,
-        protobufs::TransformationSequence* transformations)
+        protobufs::TransformationSequence* transformations,
+        bool ignore_inapplicable_transformations)
     : FuzzerPass(ir_context, transformation_context, fuzzer_context,
-                 transformations) {}
+                 transformations, ignore_inapplicable_transformations) {}
 
 void FuzzerPassAddImageSampleUnusedComponents::Apply() {
   // SPIR-V module to help understand the transformation.
diff --git a/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_add_image_sample_unused_components.h b/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_add_image_sample_unused_components.h
index f5dea8b..1a27893 100644
--- a/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_add_image_sample_unused_components.h
+++ b/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_add_image_sample_unused_components.h
@@ -28,7 +28,8 @@
   FuzzerPassAddImageSampleUnusedComponents(
       opt::IRContext* ir_context, TransformationContext* transformation_context,
       FuzzerContext* fuzzer_context,
-      protobufs::TransformationSequence* transformations);
+      protobufs::TransformationSequence* transformations,
+      bool ignore_inapplicable_transformations);
 
   void Apply() override;
 };
diff --git a/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_add_loads.cpp b/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_add_loads.cpp
index 2e50da2..ab91543 100644
--- a/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_add_loads.cpp
+++ b/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_add_loads.cpp
@@ -23,9 +23,10 @@
 FuzzerPassAddLoads::FuzzerPassAddLoads(
     opt::IRContext* ir_context, TransformationContext* transformation_context,
     FuzzerContext* fuzzer_context,
-    protobufs::TransformationSequence* transformations)
+    protobufs::TransformationSequence* transformations,
+    bool ignore_inapplicable_transformations)
     : FuzzerPass(ir_context, transformation_context, fuzzer_context,
-                 transformations) {}
+                 transformations, ignore_inapplicable_transformations) {}
 
 void FuzzerPassAddLoads::Apply() {
   ForEachInstructionWithInstructionDescriptor(
@@ -38,18 +39,22 @@
                "The opcode of the instruction we might insert before must be "
                "the same as the opcode in the descriptor for the instruction");
 
-        // Check whether it is legitimate to insert a load before this
-        // instruction.
-        if (!fuzzerutil::CanInsertOpcodeBeforeInstruction(SpvOpLoad, inst_it)) {
-          return;
-        }
-
         // Randomly decide whether to try inserting a load here.
         if (!GetFuzzerContext()->ChoosePercentage(
                 GetFuzzerContext()->GetChanceOfAddingLoad())) {
           return;
         }
 
+        // Check whether it is legitimate to insert a load or atomic load before
+        // this instruction.
+        if (!fuzzerutil::CanInsertOpcodeBeforeInstruction(SpvOpLoad, inst_it)) {
+          return;
+        }
+        if (!fuzzerutil::CanInsertOpcodeBeforeInstruction(SpvOpAtomicLoad,
+                                                          inst_it)) {
+          return;
+        }
+
         std::vector<opt::Instruction*> relevant_instructions =
             FindAvailableInstructions(
                 function, block, inst_it,
@@ -79,13 +84,53 @@
           return;
         }
 
-        // Choose a pointer at random, and create and apply a loading
-        // transformation based on it.
-        ApplyTransformation(TransformationLoad(
-            GetFuzzerContext()->GetFreshId(),
+        auto chosen_instruction =
             relevant_instructions[GetFuzzerContext()->RandomIndex(
-                                      relevant_instructions)]
-                ->result_id(),
+                relevant_instructions)];
+
+        bool is_atomic_load = false;
+        uint32_t memory_scope_id = 0;
+        uint32_t memory_semantics_id = 0;
+
+        auto storage_class = static_cast<SpvStorageClass>(
+            GetIRContext()
+                ->get_def_use_mgr()
+                ->GetDef(chosen_instruction->type_id())
+                ->GetSingleWordInOperand(0));
+
+        switch (storage_class) {
+          case SpvStorageClassStorageBuffer:
+          case SpvStorageClassPhysicalStorageBuffer:
+          case SpvStorageClassWorkgroup:
+          case SpvStorageClassCrossWorkgroup:
+          case SpvStorageClassAtomicCounter:
+          case SpvStorageClassImage:
+            if (GetFuzzerContext()->ChoosePercentage(
+                    GetFuzzerContext()->GetChanceOfAddingAtomicLoad())) {
+              is_atomic_load = true;
+
+              memory_scope_id = FindOrCreateConstant(
+                  {SpvScopeInvocation},
+                  FindOrCreateIntegerType(32, GetFuzzerContext()->ChooseEven()),
+                  false);
+
+              memory_semantics_id = FindOrCreateConstant(
+                  {static_cast<uint32_t>(
+                      fuzzerutil::GetMemorySemanticsForStorageClass(
+                          storage_class))},
+                  FindOrCreateIntegerType(32, GetFuzzerContext()->ChooseEven()),
+                  false);
+            }
+            break;
+
+          default:
+            break;
+        }
+
+        // Create and apply the transformation.
+        ApplyTransformation(TransformationLoad(
+            GetFuzzerContext()->GetFreshId(), chosen_instruction->result_id(),
+            is_atomic_load, memory_scope_id, memory_semantics_id,
             instruction_descriptor));
       });
 }
diff --git a/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_add_loads.h b/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_add_loads.h
index 3913c62..14460e7 100644
--- a/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_add_loads.h
+++ b/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_add_loads.h
@@ -26,7 +26,8 @@
   FuzzerPassAddLoads(opt::IRContext* ir_context,
                      TransformationContext* transformation_context,
                      FuzzerContext* fuzzer_context,
-                     protobufs::TransformationSequence* transformations);
+                     protobufs::TransformationSequence* transformations,
+                     bool ignore_inapplicable_transformations);
 
   void Apply() override;
 };
diff --git a/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_add_local_variables.cpp b/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_add_local_variables.cpp
index a50b0b0..a4e739f 100644
--- a/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_add_local_variables.cpp
+++ b/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_add_local_variables.cpp
@@ -24,9 +24,10 @@
 FuzzerPassAddLocalVariables::FuzzerPassAddLocalVariables(
     opt::IRContext* ir_context, TransformationContext* transformation_context,
     FuzzerContext* fuzzer_context,
-    protobufs::TransformationSequence* transformations)
+    protobufs::TransformationSequence* transformations,
+    bool ignore_inapplicable_transformations)
     : FuzzerPass(ir_context, transformation_context, fuzzer_context,
-                 transformations) {}
+                 transformations, ignore_inapplicable_transformations) {}
 
 void FuzzerPassAddLocalVariables::Apply() {
   auto basic_type_ids_and_pointers =
@@ -34,6 +35,10 @@
 
   // These are the basic types that are available to this fuzzer pass.
   auto& basic_types = basic_type_ids_and_pointers.first;
+  if (basic_types.empty()) {
+    // The pass cannot do anything if there are no basic types.
+    return;
+  }
 
   // These are the pointers to those basic types that are *initially* available
   // to the fuzzer pass.  The fuzzer pass might add pointer types in cases where
diff --git a/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_add_local_variables.h b/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_add_local_variables.h
index d73dae2..c969ba0 100644
--- a/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_add_local_variables.h
+++ b/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_add_local_variables.h
@@ -27,7 +27,8 @@
   FuzzerPassAddLocalVariables(
       opt::IRContext* ir_context, TransformationContext* transformation_context,
       FuzzerContext* fuzzer_context,
-      protobufs::TransformationSequence* transformations);
+      protobufs::TransformationSequence* transformations,
+      bool ignore_inapplicable_transformations);
 
   void Apply() override;
 };
diff --git a/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_add_loop_preheaders.cpp b/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_add_loop_preheaders.cpp
index 1cfed86..e8c9e96 100644
--- a/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_add_loop_preheaders.cpp
+++ b/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_add_loop_preheaders.cpp
@@ -23,9 +23,10 @@
 FuzzerPassAddLoopPreheaders::FuzzerPassAddLoopPreheaders(
     opt::IRContext* ir_context, TransformationContext* transformation_context,
     FuzzerContext* fuzzer_context,
-    protobufs::TransformationSequence* transformations)
+    protobufs::TransformationSequence* transformations,
+    bool ignore_inapplicable_transformations)
     : FuzzerPass(ir_context, transformation_context, fuzzer_context,
-                 transformations) {}
+                 transformations, ignore_inapplicable_transformations) {}
 
 void FuzzerPassAddLoopPreheaders::Apply() {
   for (auto& function : *GetIRContext()->module()) {
diff --git a/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_add_loop_preheaders.h b/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_add_loop_preheaders.h
index 8ac2dac..2a13dba 100644
--- a/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_add_loop_preheaders.h
+++ b/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_add_loop_preheaders.h
@@ -30,7 +30,8 @@
   FuzzerPassAddLoopPreheaders(
       opt::IRContext* ir_context, TransformationContext* transformation_context,
       FuzzerContext* fuzzer_context,
-      protobufs::TransformationSequence* transformations);
+      protobufs::TransformationSequence* transformations,
+      bool ignore_inapplicable_transformations);
 
   void Apply() override;
 };
diff --git a/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_add_loops_to_create_int_constant_synonyms.cpp b/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_add_loops_to_create_int_constant_synonyms.cpp
index 69e0697..1a65ef6 100644
--- a/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_add_loops_to_create_int_constant_synonyms.cpp
+++ b/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_add_loops_to_create_int_constant_synonyms.cpp
@@ -29,9 +29,10 @@
         opt::IRContext* ir_context,
         TransformationContext* transformation_context,
         FuzzerContext* fuzzer_context,
-        protobufs::TransformationSequence* transformations)
+        protobufs::TransformationSequence* transformations,
+        bool ignore_inapplicable_transformations)
     : FuzzerPass(ir_context, transformation_context, fuzzer_context,
-                 transformations) {}
+                 transformations, ignore_inapplicable_transformations) {}
 
 void FuzzerPassAddLoopsToCreateIntConstantSynonyms::Apply() {
   std::vector<uint32_t> constants;
diff --git a/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_add_loops_to_create_int_constant_synonyms.h b/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_add_loops_to_create_int_constant_synonyms.h
index 2eacef5..14e1754 100644
--- a/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_add_loops_to_create_int_constant_synonyms.h
+++ b/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_add_loops_to_create_int_constant_synonyms.h
@@ -28,7 +28,8 @@
   FuzzerPassAddLoopsToCreateIntConstantSynonyms(
       opt::IRContext* ir_context, TransformationContext* transformation_context,
       FuzzerContext* fuzzer_context,
-      protobufs::TransformationSequence* transformations);
+      protobufs::TransformationSequence* transformations,
+      bool ignore_inapplicable_transformations);
 
   void Apply() override;
 
diff --git a/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_add_no_contraction_decorations.cpp b/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_add_no_contraction_decorations.cpp
index d075310..8ae6e90 100644
--- a/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_add_no_contraction_decorations.cpp
+++ b/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_add_no_contraction_decorations.cpp
@@ -22,9 +22,10 @@
 FuzzerPassAddNoContractionDecorations::FuzzerPassAddNoContractionDecorations(
     opt::IRContext* ir_context, TransformationContext* transformation_context,
     FuzzerContext* fuzzer_context,
-    protobufs::TransformationSequence* transformations)
+    protobufs::TransformationSequence* transformations,
+    bool ignore_inapplicable_transformations)
     : FuzzerPass(ir_context, transformation_context, fuzzer_context,
-                 transformations) {}
+                 transformations, ignore_inapplicable_transformations) {}
 
 void FuzzerPassAddNoContractionDecorations::Apply() {
   // Consider every instruction in every block in every function.
diff --git a/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_add_no_contraction_decorations.h b/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_add_no_contraction_decorations.h
index 74212d8..7aeb26d 100644
--- a/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_add_no_contraction_decorations.h
+++ b/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_add_no_contraction_decorations.h
@@ -26,7 +26,8 @@
   FuzzerPassAddNoContractionDecorations(
       opt::IRContext* ir_context, TransformationContext* transformation_context,
       FuzzerContext* fuzzer_context,
-      protobufs::TransformationSequence* transformations);
+      protobufs::TransformationSequence* transformations,
+      bool ignore_inapplicable_transformations);
 
   void Apply() override;
 };
diff --git a/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_add_opphi_synonyms.cpp b/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_add_opphi_synonyms.cpp
index be6e7ea..73b6b0a 100644
--- a/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_add_opphi_synonyms.cpp
+++ b/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_add_opphi_synonyms.cpp
@@ -23,9 +23,10 @@
 FuzzerPassAddOpPhiSynonyms::FuzzerPassAddOpPhiSynonyms(
     opt::IRContext* ir_context, TransformationContext* transformation_context,
     FuzzerContext* fuzzer_context,
-    protobufs::TransformationSequence* transformations)
+    protobufs::TransformationSequence* transformations,
+    bool ignore_inapplicable_transformations)
     : FuzzerPass(ir_context, transformation_context, fuzzer_context,
-                 transformations) {}
+                 transformations, ignore_inapplicable_transformations) {}
 
 void FuzzerPassAddOpPhiSynonyms::Apply() {
   // Get a list of synonymous ids with the same type that can be used in the
diff --git a/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_add_opphi_synonyms.h b/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_add_opphi_synonyms.h
index 9077118..c45c9a8 100644
--- a/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_add_opphi_synonyms.h
+++ b/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_add_opphi_synonyms.h
@@ -25,10 +25,11 @@
 // synonymous with the others.
 class FuzzerPassAddOpPhiSynonyms : public FuzzerPass {
  public:
-  FuzzerPassAddOpPhiSynonyms(
-      opt::IRContext* ir_context, TransformationContext* transformation_context,
-      FuzzerContext* fuzzer_context,
-      protobufs::TransformationSequence* transformations);
+  FuzzerPassAddOpPhiSynonyms(opt::IRContext* ir_context,
+                             TransformationContext* transformation_context,
+                             FuzzerContext* fuzzer_context,
+                             protobufs::TransformationSequence* transformations,
+                             bool ignore_inapplicable_transformations);
 
   void Apply() override;
 
diff --git a/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_add_parameters.cpp b/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_add_parameters.cpp
index 784653d..1cb6a79 100644
--- a/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_add_parameters.cpp
+++ b/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_add_parameters.cpp
@@ -25,9 +25,10 @@
 FuzzerPassAddParameters::FuzzerPassAddParameters(
     opt::IRContext* ir_context, TransformationContext* transformation_context,
     FuzzerContext* fuzzer_context,
-    protobufs::TransformationSequence* transformations)
+    protobufs::TransformationSequence* transformations,
+    bool ignore_inapplicable_transformations)
     : FuzzerPass(ir_context, transformation_context, fuzzer_context,
-                 transformations) {}
+                 transformations, ignore_inapplicable_transformations) {}
 
 void FuzzerPassAddParameters::Apply() {
   // Compute type candidates for the new parameter.
diff --git a/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_add_parameters.h b/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_add_parameters.h
index 47dde39..c79f0e0 100644
--- a/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_add_parameters.h
+++ b/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_add_parameters.h
@@ -30,7 +30,8 @@
   FuzzerPassAddParameters(opt::IRContext* ir_context,
                           TransformationContext* transformation_context,
                           FuzzerContext* fuzzer_context,
-                          protobufs::TransformationSequence* transformations);
+                          protobufs::TransformationSequence* transformations,
+                          bool ignore_inapplicable_transformations);
 
   void Apply() override;
 
diff --git a/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_add_relaxed_decorations.cpp b/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_add_relaxed_decorations.cpp
index 58c6d1b..b8c2b55 100644
--- a/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_add_relaxed_decorations.cpp
+++ b/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_add_relaxed_decorations.cpp
@@ -22,9 +22,10 @@
 FuzzerPassAddRelaxedDecorations::FuzzerPassAddRelaxedDecorations(
     opt::IRContext* ir_context, TransformationContext* transformation_context,
     FuzzerContext* fuzzer_context,
-    protobufs::TransformationSequence* transformations)
+    protobufs::TransformationSequence* transformations,
+    bool ignore_inapplicable_transformations)
     : FuzzerPass(ir_context, transformation_context, fuzzer_context,
-                 transformations) {}
+                 transformations, ignore_inapplicable_transformations) {}
 
 void FuzzerPassAddRelaxedDecorations::Apply() {
   // Consider every instruction in every block in every function.
diff --git a/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_add_relaxed_decorations.h b/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_add_relaxed_decorations.h
index 723c4a0..51eb594 100644
--- a/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_add_relaxed_decorations.h
+++ b/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_add_relaxed_decorations.h
@@ -26,7 +26,8 @@
   FuzzerPassAddRelaxedDecorations(
       opt::IRContext* ir_context, TransformationContext* transformation_context,
       FuzzerContext* fuzzer_context,
-      protobufs::TransformationSequence* transformations);
+      protobufs::TransformationSequence* transformations,
+      bool ignore_inapplicable_transformations);
 
   void Apply() override;
 };
diff --git a/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_add_stores.cpp b/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_add_stores.cpp
index f89428d..606e4a6 100644
--- a/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_add_stores.cpp
+++ b/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_add_stores.cpp
@@ -23,9 +23,10 @@
 FuzzerPassAddStores::FuzzerPassAddStores(
     opt::IRContext* ir_context, TransformationContext* transformation_context,
     FuzzerContext* fuzzer_context,
-    protobufs::TransformationSequence* transformations)
+    protobufs::TransformationSequence* transformations,
+    bool ignore_inapplicable_transformations)
     : FuzzerPass(ir_context, transformation_context, fuzzer_context,
-                 transformations) {}
+                 transformations, ignore_inapplicable_transformations) {}
 
 void FuzzerPassAddStores::Apply() {
   ForEachInstructionWithInstructionDescriptor(
@@ -38,16 +39,20 @@
                "The opcode of the instruction we might insert before must be "
                "the same as the opcode in the descriptor for the instruction");
 
+        // Randomly decide whether to try inserting a store here.
+        if (!GetFuzzerContext()->ChoosePercentage(
+                GetFuzzerContext()->GetChanceOfAddingStore())) {
+          return;
+        }
+
         // Check whether it is legitimate to insert a store before this
         // instruction.
         if (!fuzzerutil::CanInsertOpcodeBeforeInstruction(SpvOpStore,
                                                           inst_it)) {
           return;
         }
-
-        // Randomly decide whether to try inserting a store here.
-        if (!GetFuzzerContext()->ChoosePercentage(
-                GetFuzzerContext()->GetChanceOfAddingStore())) {
+        if (!fuzzerutil::CanInsertOpcodeBeforeInstruction(SpvOpAtomicStore,
+                                                          inst_it)) {
           return;
         }
 
@@ -116,10 +121,49 @@
           return;
         }
 
-        // Choose a value at random, and create and apply a storing
-        // transformation based on it and the pointer.
+        bool is_atomic_store = false;
+        uint32_t memory_scope_id = 0;
+        uint32_t memory_semantics_id = 0;
+
+        auto storage_class =
+            static_cast<SpvStorageClass>(GetIRContext()
+                                             ->get_def_use_mgr()
+                                             ->GetDef(pointer->type_id())
+                                             ->GetSingleWordInOperand(0));
+
+        switch (storage_class) {
+          case SpvStorageClassStorageBuffer:
+          case SpvStorageClassPhysicalStorageBuffer:
+          case SpvStorageClassWorkgroup:
+          case SpvStorageClassCrossWorkgroup:
+          case SpvStorageClassAtomicCounter:
+          case SpvStorageClassImage:
+            if (GetFuzzerContext()->ChoosePercentage(
+                    GetFuzzerContext()->GetChanceOfAddingAtomicStore())) {
+              is_atomic_store = true;
+
+              memory_scope_id = FindOrCreateConstant(
+                  {SpvScopeInvocation},
+                  FindOrCreateIntegerType(32, GetFuzzerContext()->ChooseEven()),
+                  false);
+
+              memory_semantics_id = FindOrCreateConstant(
+                  {static_cast<uint32_t>(
+                      fuzzerutil::GetMemorySemanticsForStorageClass(
+                          storage_class))},
+                  FindOrCreateIntegerType(32, GetFuzzerContext()->ChooseEven()),
+                  false);
+            }
+            break;
+
+          default:
+            break;
+        }
+
+        // Create and apply the transformation.
         ApplyTransformation(TransformationStore(
-            pointer->result_id(),
+            pointer->result_id(), is_atomic_store, memory_scope_id,
+            memory_semantics_id,
             relevant_values[GetFuzzerContext()->RandomIndex(relevant_values)]
                 ->result_id(),
             instruction_descriptor));
diff --git a/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_add_stores.h b/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_add_stores.h
index 9519c38..b18dde1 100644
--- a/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_add_stores.h
+++ b/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_add_stores.h
@@ -28,7 +28,8 @@
   FuzzerPassAddStores(opt::IRContext* ir_context,
                       TransformationContext* transformation_context,
                       FuzzerContext* fuzzer_context,
-                      protobufs::TransformationSequence* transformations);
+                      protobufs::TransformationSequence* transformations,
+                      bool ignore_inapplicable_transformations);
 
   void Apply() override;
 };
diff --git a/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_add_synonyms.cpp b/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_add_synonyms.cpp
index fd866f9..1d188de 100644
--- a/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_add_synonyms.cpp
+++ b/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_add_synonyms.cpp
@@ -25,9 +25,10 @@
 FuzzerPassAddSynonyms::FuzzerPassAddSynonyms(
     opt::IRContext* ir_context, TransformationContext* transformation_context,
     FuzzerContext* fuzzer_context,
-    protobufs::TransformationSequence* transformations)
+    protobufs::TransformationSequence* transformations,
+    bool ignore_inapplicable_transformations)
     : FuzzerPass(ir_context, transformation_context, fuzzer_context,
-                 transformations) {}
+                 transformations, ignore_inapplicable_transformations) {}
 
 void FuzzerPassAddSynonyms::Apply() {
   ForEachInstructionWithInstructionDescriptor(
diff --git a/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_add_synonyms.h b/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_add_synonyms.h
index ccf4a88..b0c174b 100644
--- a/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_add_synonyms.h
+++ b/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_add_synonyms.h
@@ -27,7 +27,8 @@
   FuzzerPassAddSynonyms(opt::IRContext* ir_context,
                         TransformationContext* transformation_context,
                         FuzzerContext* fuzzer_context,
-                        protobufs::TransformationSequence* transformations);
+                        protobufs::TransformationSequence* transformations,
+                        bool ignore_inapplicable_transformations);
 
   void Apply() override;
 };
diff --git a/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_add_vector_shuffle_instructions.cpp b/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_add_vector_shuffle_instructions.cpp
index e2eaaa0..a29d1d3 100644
--- a/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_add_vector_shuffle_instructions.cpp
+++ b/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_add_vector_shuffle_instructions.cpp
@@ -24,9 +24,10 @@
 FuzzerPassAddVectorShuffleInstructions::FuzzerPassAddVectorShuffleInstructions(
     opt::IRContext* ir_context, TransformationContext* transformation_context,
     FuzzerContext* fuzzer_context,
-    protobufs::TransformationSequence* transformations)
+    protobufs::TransformationSequence* transformations,
+    bool ignore_inapplicable_transformations)
     : FuzzerPass(ir_context, transformation_context, fuzzer_context,
-                 transformations) {}
+                 transformations, ignore_inapplicable_transformations) {}
 
 void FuzzerPassAddVectorShuffleInstructions::Apply() {
   ForEachInstructionWithInstructionDescriptor(
@@ -75,7 +76,7 @@
                            ->IdIsIrrelevant(instruction->result_id()) &&
                       !fuzzerutil::CanMakeSynonymOf(ir_context,
                                                     *GetTransformationContext(),
-                                                    instruction)) {
+                                                    *instruction)) {
                     // If the id is irrelevant, we can use it since it will not
                     // participate in DataSynonym fact. Otherwise, we should be
                     // able to produce a synonym out of the id.
diff --git a/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_add_vector_shuffle_instructions.h b/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_add_vector_shuffle_instructions.h
index c5af374..64d6608 100644
--- a/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_add_vector_shuffle_instructions.h
+++ b/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_add_vector_shuffle_instructions.h
@@ -26,7 +26,8 @@
   FuzzerPassAddVectorShuffleInstructions(
       opt::IRContext* ir_context, TransformationContext* transformation_context,
       FuzzerContext* fuzzer_context,
-      protobufs::TransformationSequence* transformations);
+      protobufs::TransformationSequence* transformations,
+      bool ignore_inapplicable_transformations);
 
   void Apply() override;
 };
diff --git a/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_adjust_branch_weights.cpp b/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_adjust_branch_weights.cpp
index 3c4f380..94428f7 100644
--- a/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_adjust_branch_weights.cpp
+++ b/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_adjust_branch_weights.cpp
@@ -24,9 +24,10 @@
 FuzzerPassAdjustBranchWeights::FuzzerPassAdjustBranchWeights(
     opt::IRContext* ir_context, TransformationContext* transformation_context,
     FuzzerContext* fuzzer_context,
-    protobufs::TransformationSequence* transformations)
+    protobufs::TransformationSequence* transformations,
+    bool ignore_inapplicable_transformations)
     : FuzzerPass(ir_context, transformation_context, fuzzer_context,
-                 transformations) {}
+                 transformations, ignore_inapplicable_transformations) {}
 
 void FuzzerPassAdjustBranchWeights::Apply() {
   // For all OpBranchConditional instructions,
diff --git a/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_adjust_branch_weights.h b/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_adjust_branch_weights.h
index de2f33d..ae1ea34 100644
--- a/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_adjust_branch_weights.h
+++ b/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_adjust_branch_weights.h
@@ -28,7 +28,8 @@
   FuzzerPassAdjustBranchWeights(
       opt::IRContext* ir_context, TransformationContext* transformation_context,
       FuzzerContext* fuzzer_context,
-      protobufs::TransformationSequence* transformations);
+      protobufs::TransformationSequence* transformations,
+      bool ignore_inapplicable_transformations);
 
   void Apply() override;
 };
diff --git a/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_adjust_function_controls.cpp b/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_adjust_function_controls.cpp
index b38bd21..1c2bc8c 100644
--- a/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_adjust_function_controls.cpp
+++ b/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_adjust_function_controls.cpp
@@ -22,9 +22,10 @@
 FuzzerPassAdjustFunctionControls::FuzzerPassAdjustFunctionControls(
     opt::IRContext* ir_context, TransformationContext* transformation_context,
     FuzzerContext* fuzzer_context,
-    protobufs::TransformationSequence* transformations)
+    protobufs::TransformationSequence* transformations,
+    bool ignore_inapplicable_transformations)
     : FuzzerPass(ir_context, transformation_context, fuzzer_context,
-                 transformations) {}
+                 transformations, ignore_inapplicable_transformations) {}
 
 void FuzzerPassAdjustFunctionControls::Apply() {
   // Consider every function in the module.
diff --git a/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_adjust_function_controls.h b/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_adjust_function_controls.h
index 5ef32a1..7a8c492 100644
--- a/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_adjust_function_controls.h
+++ b/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_adjust_function_controls.h
@@ -26,7 +26,8 @@
   FuzzerPassAdjustFunctionControls(
       opt::IRContext* ir_context, TransformationContext* transformation_context,
       FuzzerContext* fuzzer_context,
-      protobufs::TransformationSequence* transformations);
+      protobufs::TransformationSequence* transformations,
+      bool ignore_inapplicable_transformations);
 
   void Apply() override;
 };
diff --git a/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_adjust_loop_controls.cpp b/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_adjust_loop_controls.cpp
index 0f7cf03..fe855ca 100644
--- a/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_adjust_loop_controls.cpp
+++ b/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_adjust_loop_controls.cpp
@@ -22,9 +22,10 @@
 FuzzerPassAdjustLoopControls::FuzzerPassAdjustLoopControls(
     opt::IRContext* ir_context, TransformationContext* transformation_context,
     FuzzerContext* fuzzer_context,
-    protobufs::TransformationSequence* transformations)
+    protobufs::TransformationSequence* transformations,
+    bool ignore_inapplicable_transformations)
     : FuzzerPass(ir_context, transformation_context, fuzzer_context,
-                 transformations) {}
+                 transformations, ignore_inapplicable_transformations) {}
 
 void FuzzerPassAdjustLoopControls::Apply() {
   // Consider every merge instruction in the module (via looking through all
diff --git a/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_adjust_loop_controls.h b/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_adjust_loop_controls.h
index 4ca670b..25e8304 100644
--- a/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_adjust_loop_controls.h
+++ b/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_adjust_loop_controls.h
@@ -26,7 +26,8 @@
   FuzzerPassAdjustLoopControls(
       opt::IRContext* ir_context, TransformationContext* transformation_context,
       FuzzerContext* fuzzer_context,
-      protobufs::TransformationSequence* transformations);
+      protobufs::TransformationSequence* transformations,
+      bool ignore_inapplicable_transformations);
 
   void Apply() override;
 };
diff --git a/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_adjust_memory_operands_masks.cpp b/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_adjust_memory_operands_masks.cpp
index 778d43f..d2ff40e 100644
--- a/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_adjust_memory_operands_masks.cpp
+++ b/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_adjust_memory_operands_masks.cpp
@@ -23,9 +23,10 @@
 FuzzerPassAdjustMemoryOperandsMasks::FuzzerPassAdjustMemoryOperandsMasks(
     opt::IRContext* ir_context, TransformationContext* transformation_context,
     FuzzerContext* fuzzer_context,
-    protobufs::TransformationSequence* transformations)
+    protobufs::TransformationSequence* transformations,
+    bool ignore_inapplicable_transformations)
     : FuzzerPass(ir_context, transformation_context, fuzzer_context,
-                 transformations) {}
+                 transformations, ignore_inapplicable_transformations) {}
 
 void FuzzerPassAdjustMemoryOperandsMasks::Apply() {
   // Consider every block in every function.
diff --git a/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_adjust_memory_operands_masks.h b/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_adjust_memory_operands_masks.h
index a068b8d..3197f91 100644
--- a/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_adjust_memory_operands_masks.h
+++ b/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_adjust_memory_operands_masks.h
@@ -27,7 +27,8 @@
   FuzzerPassAdjustMemoryOperandsMasks(
       opt::IRContext* ir_context, TransformationContext* transformation_context,
       FuzzerContext* fuzzer_context,
-      protobufs::TransformationSequence* transformations);
+      protobufs::TransformationSequence* transformations,
+      bool ignore_inapplicable_transformations);
 
   void Apply() override;
 };
diff --git a/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_adjust_selection_controls.cpp b/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_adjust_selection_controls.cpp
index d9b4e29..7d8e6b5 100644
--- a/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_adjust_selection_controls.cpp
+++ b/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_adjust_selection_controls.cpp
@@ -22,9 +22,10 @@
 FuzzerPassAdjustSelectionControls::FuzzerPassAdjustSelectionControls(
     opt::IRContext* ir_context, TransformationContext* transformation_context,
     FuzzerContext* fuzzer_context,
-    protobufs::TransformationSequence* transformations)
+    protobufs::TransformationSequence* transformations,
+    bool ignore_inapplicable_transformations)
     : FuzzerPass(ir_context, transformation_context, fuzzer_context,
-                 transformations) {}
+                 transformations, ignore_inapplicable_transformations) {}
 
 void FuzzerPassAdjustSelectionControls::Apply() {
   // Consider every merge instruction in the module (via looking through all
diff --git a/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_adjust_selection_controls.h b/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_adjust_selection_controls.h
index 6931f94..ac55de7 100644
--- a/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_adjust_selection_controls.h
+++ b/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_adjust_selection_controls.h
@@ -26,7 +26,8 @@
   FuzzerPassAdjustSelectionControls(
       opt::IRContext* ir_context, TransformationContext* transformation_context,
       FuzzerContext* fuzzer_context,
-      protobufs::TransformationSequence* transformations);
+      protobufs::TransformationSequence* transformations,
+      bool ignore_inapplicable_transformations);
 
   void Apply() override;
 };
diff --git a/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_apply_id_synonyms.cpp b/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_apply_id_synonyms.cpp
index 7120831..8965c15 100644
--- a/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_apply_id_synonyms.cpp
+++ b/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_apply_id_synonyms.cpp
@@ -28,9 +28,10 @@
 FuzzerPassApplyIdSynonyms::FuzzerPassApplyIdSynonyms(
     opt::IRContext* ir_context, TransformationContext* transformation_context,
     FuzzerContext* fuzzer_context,
-    protobufs::TransformationSequence* transformations)
+    protobufs::TransformationSequence* transformations,
+    bool ignore_inapplicable_transformations)
     : FuzzerPass(ir_context, transformation_context, fuzzer_context,
-                 transformations) {}
+                 transformations, ignore_inapplicable_transformations) {}
 
 void FuzzerPassApplyIdSynonyms::Apply() {
   // Compute a closure of data synonym facts, to enrich the pool of synonyms
diff --git a/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_apply_id_synonyms.h b/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_apply_id_synonyms.h
index b402b50..3da9c5d 100644
--- a/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_apply_id_synonyms.h
+++ b/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_apply_id_synonyms.h
@@ -28,7 +28,8 @@
   FuzzerPassApplyIdSynonyms(opt::IRContext* ir_context,
                             TransformationContext* transformation_context,
                             FuzzerContext* fuzzer_context,
-                            protobufs::TransformationSequence* transformations);
+                            protobufs::TransformationSequence* transformations,
+                            bool ignore_inapplicable_transformations);
 
   void Apply() override;
 
diff --git a/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_construct_composites.cpp b/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_construct_composites.cpp
index 1a174cf..ff022fc 100644
--- a/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_construct_composites.cpp
+++ b/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_construct_composites.cpp
@@ -26,9 +26,10 @@
 FuzzerPassConstructComposites::FuzzerPassConstructComposites(
     opt::IRContext* ir_context, TransformationContext* transformation_context,
     FuzzerContext* fuzzer_context,
-    protobufs::TransformationSequence* transformations)
+    protobufs::TransformationSequence* transformations,
+    bool ignore_inapplicable_transformations)
     : FuzzerPass(ir_context, transformation_context, fuzzer_context,
-                 transformations) {}
+                 transformations, ignore_inapplicable_transformations) {}
 
 void FuzzerPassConstructComposites::Apply() {
   // Gather up the ids of all composite types, but skip block-/buffer
@@ -61,7 +62,7 @@
         return GetTransformationContext()->GetFactManager()->IdIsIrrelevant(
                    inst->result_id()) ||
                fuzzerutil::CanMakeSynonymOf(ir_context,
-                                            *GetTransformationContext(), inst);
+                                            *GetTransformationContext(), *inst);
       });
 
   ForEachInstructionWithInstructionDescriptor(
diff --git a/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_construct_composites.h b/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_construct_composites.h
index 333ac93..8141398 100644
--- a/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_construct_composites.h
+++ b/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_construct_composites.h
@@ -29,7 +29,8 @@
   FuzzerPassConstructComposites(
       opt::IRContext* ir_context, TransformationContext* transformation_context,
       FuzzerContext* fuzzer_context,
-      protobufs::TransformationSequence* transformations);
+      protobufs::TransformationSequence* transformations,
+      bool ignore_inapplicable_transformations);
 
   void Apply() override;
 
diff --git a/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_copy_objects.cpp b/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_copy_objects.cpp
index 09b5368..80cc2a5 100644
--- a/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_copy_objects.cpp
+++ b/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_copy_objects.cpp
@@ -24,9 +24,10 @@
 FuzzerPassCopyObjects::FuzzerPassCopyObjects(
     opt::IRContext* ir_context, TransformationContext* transformation_context,
     FuzzerContext* fuzzer_context,
-    protobufs::TransformationSequence* transformations)
+    protobufs::TransformationSequence* transformations,
+    bool ignore_inapplicable_transformations)
     : FuzzerPass(ir_context, transformation_context, fuzzer_context,
-                 transformations) {}
+                 transformations, ignore_inapplicable_transformations) {}
 
 void FuzzerPassCopyObjects::Apply() {
   ForEachInstructionWithInstructionDescriptor(
diff --git a/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_copy_objects.h b/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_copy_objects.h
index 461cd97..2fb5a53 100644
--- a/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_copy_objects.h
+++ b/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_copy_objects.h
@@ -26,7 +26,8 @@
   FuzzerPassCopyObjects(opt::IRContext* ir_context,
                         TransformationContext* transformation_context,
                         FuzzerContext* fuzzer_context,
-                        protobufs::TransformationSequence* transformations);
+                        protobufs::TransformationSequence* transformations,
+                        bool ignore_inapplicable_transformations);
 
   void Apply() override;
 };
diff --git a/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_donate_modules.cpp b/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_donate_modules.cpp
index 2f2ed50..5bdf697 100644
--- a/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_donate_modules.cpp
+++ b/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_donate_modules.cpp
@@ -45,10 +45,11 @@
     opt::IRContext* ir_context, TransformationContext* transformation_context,
     FuzzerContext* fuzzer_context,
     protobufs::TransformationSequence* transformations,
-    const std::vector<fuzzerutil::ModuleSupplier>& donor_suppliers)
+    bool ignore_inapplicable_transformations,
+    std::vector<fuzzerutil::ModuleSupplier> donor_suppliers)
     : FuzzerPass(ir_context, transformation_context, fuzzer_context,
-                 transformations),
-      donor_suppliers_(donor_suppliers) {}
+                 transformations, ignore_inapplicable_transformations),
+      donor_suppliers_(std::move(donor_suppliers)) {}
 
 void FuzzerPassDonateModules::Apply() {
   // If there are no donor suppliers, this fuzzer pass is a no-op.
diff --git a/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_donate_modules.h b/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_donate_modules.h
index 1581a8a..924dd35 100644
--- a/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_donate_modules.h
+++ b/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_donate_modules.h
@@ -31,7 +31,8 @@
       opt::IRContext* ir_context, TransformationContext* transformation_context,
       FuzzerContext* fuzzer_context,
       protobufs::TransformationSequence* transformations,
-      const std::vector<fuzzerutil::ModuleSupplier>& donor_suppliers);
+      bool ignore_inapplicable_transformations,
+      std::vector<fuzzerutil::ModuleSupplier> donor_suppliers);
 
   void Apply() override;
 
diff --git a/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_duplicate_regions_with_selections.cpp b/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_duplicate_regions_with_selections.cpp
index e08d65b..3a9a7e6 100644
--- a/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_duplicate_regions_with_selections.cpp
+++ b/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_duplicate_regions_with_selections.cpp
@@ -25,9 +25,10 @@
         opt::IRContext* ir_context,
         TransformationContext* transformation_context,
         FuzzerContext* fuzzer_context,
-        protobufs::TransformationSequence* transformations)
+        protobufs::TransformationSequence* transformations,
+        bool ignore_inapplicable_transformations)
     : FuzzerPass(ir_context, transformation_context, fuzzer_context,
-                 transformations) {}
+                 transformations, ignore_inapplicable_transformations) {}
 
 void FuzzerPassDuplicateRegionsWithSelections::Apply() {
   // Iterate over all of the functions in the module.
diff --git a/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_duplicate_regions_with_selections.h b/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_duplicate_regions_with_selections.h
index 7cb1197..74343a6 100644
--- a/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_duplicate_regions_with_selections.h
+++ b/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_duplicate_regions_with_selections.h
@@ -29,7 +29,8 @@
   FuzzerPassDuplicateRegionsWithSelections(
       opt::IRContext* ir_context, TransformationContext* transformation_context,
       FuzzerContext* fuzzer_context,
-      protobufs::TransformationSequence* transformations);
+      protobufs::TransformationSequence* transformations,
+      bool ignore_inapplicable_transformations);
 
   void Apply() override;
 };
diff --git a/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_expand_vector_reductions.cpp b/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_expand_vector_reductions.cpp
index e25dcbc..5bf0461 100644
--- a/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_expand_vector_reductions.cpp
+++ b/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_expand_vector_reductions.cpp
@@ -24,9 +24,10 @@
 FuzzerPassExpandVectorReductions::FuzzerPassExpandVectorReductions(
     opt::IRContext* ir_context, TransformationContext* transformation_context,
     FuzzerContext* fuzzer_context,
-    protobufs::TransformationSequence* transformations)
+    protobufs::TransformationSequence* transformations,
+    bool ignore_inapplicable_transformations)
     : FuzzerPass(ir_context, transformation_context, fuzzer_context,
-                 transformations) {}
+                 transformations, ignore_inapplicable_transformations) {}
 
 void FuzzerPassExpandVectorReductions::Apply() {
   for (auto& function : *GetIRContext()->module()) {
@@ -46,7 +47,7 @@
 
         // It must be able to make a synonym of |instruction|.
         if (!fuzzerutil::CanMakeSynonymOf(
-                GetIRContext(), *GetTransformationContext(), &instruction)) {
+                GetIRContext(), *GetTransformationContext(), instruction)) {
           continue;
         }
 
diff --git a/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_expand_vector_reductions.h b/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_expand_vector_reductions.h
index ed0225d..c0673e1 100644
--- a/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_expand_vector_reductions.h
+++ b/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_expand_vector_reductions.h
@@ -28,7 +28,8 @@
   FuzzerPassExpandVectorReductions(
       opt::IRContext* ir_context, TransformationContext* transformation_context,
       FuzzerContext* fuzzer_context,
-      protobufs::TransformationSequence* transformations);
+      protobufs::TransformationSequence* transformations,
+      bool ignore_inapplicable_transformations);
 
   void Apply() override;
 };
diff --git a/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_flatten_conditional_branches.cpp b/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_flatten_conditional_branches.cpp
index 84da7a7..70fa6a1 100644
--- a/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_flatten_conditional_branches.cpp
+++ b/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_flatten_conditional_branches.cpp
@@ -26,9 +26,10 @@
 FuzzerPassFlattenConditionalBranches::FuzzerPassFlattenConditionalBranches(
     opt::IRContext* ir_context, TransformationContext* transformation_context,
     FuzzerContext* fuzzer_context,
-    protobufs::TransformationSequence* transformations)
+    protobufs::TransformationSequence* transformations,
+    bool ignore_inapplicable_transformations)
     : FuzzerPass(ir_context, transformation_context, fuzzer_context,
-                 transformations) {}
+                 transformations, ignore_inapplicable_transformations) {}
 
 void FuzzerPassFlattenConditionalBranches::Apply() {
   for (auto& function : *GetIRContext()->module()) {
diff --git a/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_flatten_conditional_branches.h b/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_flatten_conditional_branches.h
index e7d7dc3..abfbc3c 100644
--- a/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_flatten_conditional_branches.h
+++ b/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_flatten_conditional_branches.h
@@ -25,7 +25,8 @@
   FuzzerPassFlattenConditionalBranches(
       opt::IRContext* ir_context, TransformationContext* transformation_context,
       FuzzerContext* fuzzer_context,
-      protobufs::TransformationSequence* transformations);
+      protobufs::TransformationSequence* transformations,
+      bool ignore_inapplicable_transformations);
 
   void Apply() override;
 
diff --git a/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_inline_functions.cpp b/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_inline_functions.cpp
index 405afd8..4024096 100644
--- a/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_inline_functions.cpp
+++ b/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_inline_functions.cpp
@@ -25,9 +25,10 @@
 FuzzerPassInlineFunctions::FuzzerPassInlineFunctions(
     opt::IRContext* ir_context, TransformationContext* transformation_context,
     FuzzerContext* fuzzer_context,
-    protobufs::TransformationSequence* transformations)
+    protobufs::TransformationSequence* transformations,
+    bool ignore_inapplicable_transformations)
     : FuzzerPass(ir_context, transformation_context, fuzzer_context,
-                 transformations) {}
+                 transformations, ignore_inapplicable_transformations) {}
 
 void FuzzerPassInlineFunctions::Apply() {
   // |function_call_instructions| are the instructions that will be inlined.
diff --git a/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_inline_functions.h b/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_inline_functions.h
index a6ed8ca..c4e0b83 100644
--- a/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_inline_functions.h
+++ b/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_inline_functions.h
@@ -28,7 +28,8 @@
   FuzzerPassInlineFunctions(opt::IRContext* ir_context,
                             TransformationContext* transformation_context,
                             FuzzerContext* fuzzer_context,
-                            protobufs::TransformationSequence* transformations);
+                            protobufs::TransformationSequence* transformations,
+                            bool ignore_inapplicable_transformations);
 
   void Apply() override;
 };
diff --git a/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_interchange_signedness_of_integer_operands.cpp b/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_interchange_signedness_of_integer_operands.cpp
index 675cae9..d8780ff 100644
--- a/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_interchange_signedness_of_integer_operands.cpp
+++ b/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_interchange_signedness_of_integer_operands.cpp
@@ -27,9 +27,10 @@
         opt::IRContext* ir_context,
         TransformationContext* transformation_context,
         FuzzerContext* fuzzer_context,
-        protobufs::TransformationSequence* transformations)
+        protobufs::TransformationSequence* transformations,
+        bool ignore_inapplicable_transformations)
     : FuzzerPass(ir_context, transformation_context, fuzzer_context,
-                 transformations) {}
+                 transformations, ignore_inapplicable_transformations) {}
 
 void FuzzerPassInterchangeSignednessOfIntegerOperands::Apply() {
   assert(!GetFuzzerContext()->IsWgslCompatible() &&
diff --git a/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_interchange_signedness_of_integer_operands.h b/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_interchange_signedness_of_integer_operands.h
index 11b8fb6..6a10e89 100644
--- a/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_interchange_signedness_of_integer_operands.h
+++ b/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_interchange_signedness_of_integer_operands.h
@@ -32,7 +32,8 @@
   FuzzerPassInterchangeSignednessOfIntegerOperands(
       opt::IRContext* ir_context, TransformationContext* transformation_context,
       FuzzerContext* fuzzer_context,
-      protobufs::TransformationSequence* transformations);
+      protobufs::TransformationSequence* transformations,
+      bool ignore_inapplicable_transformations);
 
   void Apply() override;
 
diff --git a/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_interchange_zero_like_constants.cpp b/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_interchange_zero_like_constants.cpp
index 5d0a222..2c16cd5 100644
--- a/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_interchange_zero_like_constants.cpp
+++ b/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_interchange_zero_like_constants.cpp
@@ -25,9 +25,10 @@
 FuzzerPassInterchangeZeroLikeConstants::FuzzerPassInterchangeZeroLikeConstants(
     opt::IRContext* ir_context, TransformationContext* transformation_context,
     FuzzerContext* fuzzer_context,
-    protobufs::TransformationSequence* transformations)
+    protobufs::TransformationSequence* transformations,
+    bool ignore_inapplicable_transformations)
     : FuzzerPass(ir_context, transformation_context, fuzzer_context,
-                 transformations) {}
+                 transformations, ignore_inapplicable_transformations) {}
 
 uint32_t FuzzerPassInterchangeZeroLikeConstants::FindOrCreateToggledConstant(
     opt::Instruction* declaration) {
diff --git a/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_interchange_zero_like_constants.h b/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_interchange_zero_like_constants.h
index 012f03d..bb4a4dc 100644
--- a/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_interchange_zero_like_constants.h
+++ b/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_interchange_zero_like_constants.h
@@ -33,7 +33,8 @@
   FuzzerPassInterchangeZeroLikeConstants(
       opt::IRContext* ir_context, TransformationContext* transformation_context,
       FuzzerContext* fuzzer_context,
-      protobufs::TransformationSequence* transformations);
+      protobufs::TransformationSequence* transformations,
+      bool ignore_inapplicable_transformations);
 
   void Apply() override;
 
diff --git a/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_invert_comparison_operators.cpp b/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_invert_comparison_operators.cpp
index 542748e..130f750 100644
--- a/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_invert_comparison_operators.cpp
+++ b/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_invert_comparison_operators.cpp
@@ -24,9 +24,10 @@
 FuzzerPassInvertComparisonOperators::FuzzerPassInvertComparisonOperators(
     opt::IRContext* ir_context, TransformationContext* transformation_context,
     FuzzerContext* fuzzer_context,
-    protobufs::TransformationSequence* transformations)
+    protobufs::TransformationSequence* transformations,
+    bool ignore_inapplicable_transformations)
     : FuzzerPass(ir_context, transformation_context, fuzzer_context,
-                 transformations) {}
+                 transformations, ignore_inapplicable_transformations) {}
 
 void FuzzerPassInvertComparisonOperators::Apply() {
   GetIRContext()->module()->ForEachInst([this](const opt::Instruction* inst) {
diff --git a/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_invert_comparison_operators.h b/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_invert_comparison_operators.h
index 5f015c2..d0d09ed 100644
--- a/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_invert_comparison_operators.h
+++ b/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_invert_comparison_operators.h
@@ -27,7 +27,8 @@
   FuzzerPassInvertComparisonOperators(
       opt::IRContext* ir_context, TransformationContext* transformation_context,
       FuzzerContext* fuzzer_context,
-      protobufs::TransformationSequence* transformations);
+      protobufs::TransformationSequence* transformations,
+      bool ignore_inapplicable_transformations);
 
   void Apply() override;
 };
diff --git a/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_make_vector_operations_dynamic.cpp b/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_make_vector_operations_dynamic.cpp
index 7bf07a4..b755d23 100644
--- a/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_make_vector_operations_dynamic.cpp
+++ b/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_make_vector_operations_dynamic.cpp
@@ -24,9 +24,10 @@
 FuzzerPassMakeVectorOperationsDynamic::FuzzerPassMakeVectorOperationsDynamic(
     opt::IRContext* ir_context, TransformationContext* transformation_context,
     FuzzerContext* fuzzer_context,
-    protobufs::TransformationSequence* transformations)
+    protobufs::TransformationSequence* transformations,
+    bool ignore_inapplicable_transformations)
     : FuzzerPass(ir_context, transformation_context, fuzzer_context,
-                 transformations) {}
+                 transformations, ignore_inapplicable_transformations) {}
 
 void FuzzerPassMakeVectorOperationsDynamic::Apply() {
   for (auto& function : *GetIRContext()->module()) {
diff --git a/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_make_vector_operations_dynamic.h b/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_make_vector_operations_dynamic.h
index da27825..b6a46c7 100644
--- a/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_make_vector_operations_dynamic.h
+++ b/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_make_vector_operations_dynamic.h
@@ -27,7 +27,8 @@
   FuzzerPassMakeVectorOperationsDynamic(
       opt::IRContext* ir_context, TransformationContext* transformation_context,
       FuzzerContext* fuzzer_context,
-      protobufs::TransformationSequence* transformations);
+      protobufs::TransformationSequence* transformations,
+      bool ignore_inapplicable_transformations);
 
   void Apply() override;
 };
diff --git a/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_merge_blocks.cpp b/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_merge_blocks.cpp
index a8ec784..7020062 100644
--- a/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_merge_blocks.cpp
+++ b/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_merge_blocks.cpp
@@ -24,9 +24,10 @@
 FuzzerPassMergeBlocks::FuzzerPassMergeBlocks(
     opt::IRContext* ir_context, TransformationContext* transformation_context,
     FuzzerContext* fuzzer_context,
-    protobufs::TransformationSequence* transformations)
+    protobufs::TransformationSequence* transformations,
+    bool ignore_inapplicable_transformations)
     : FuzzerPass(ir_context, transformation_context, fuzzer_context,
-                 transformations) {}
+                 transformations, ignore_inapplicable_transformations) {}
 
 void FuzzerPassMergeBlocks::Apply() {
   // First we populate a sequence of transformations that we might consider
diff --git a/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_merge_blocks.h b/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_merge_blocks.h
index 66cf4c6..46e257f 100644
--- a/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_merge_blocks.h
+++ b/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_merge_blocks.h
@@ -26,7 +26,8 @@
   FuzzerPassMergeBlocks(opt::IRContext* ir_context,
                         TransformationContext* transformation_context,
                         FuzzerContext* fuzzer_context,
-                        protobufs::TransformationSequence* transformations);
+                        protobufs::TransformationSequence* transformations,
+                        bool ignore_inapplicable_transformations);
 
   void Apply() override;
 };
diff --git a/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_merge_function_returns.cpp b/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_merge_function_returns.cpp
index ee82eca..220f707 100644
--- a/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_merge_function_returns.cpp
+++ b/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_merge_function_returns.cpp
@@ -26,9 +26,10 @@
 FuzzerPassMergeFunctionReturns::FuzzerPassMergeFunctionReturns(
     opt::IRContext* ir_context, TransformationContext* transformation_context,
     FuzzerContext* fuzzer_context,
-    protobufs::TransformationSequence* transformations)
+    protobufs::TransformationSequence* transformations,
+    bool ignore_inapplicable_transformations)
     : FuzzerPass(ir_context, transformation_context, fuzzer_context,
-                 transformations) {}
+                 transformations, ignore_inapplicable_transformations) {}
 
 void FuzzerPassMergeFunctionReturns::Apply() {
   // The pass might add new functions to the module (due to wrapping early
diff --git a/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_merge_function_returns.h b/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_merge_function_returns.h
index ddd2c9d..a799b8b 100644
--- a/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_merge_function_returns.h
+++ b/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_merge_function_returns.h
@@ -31,7 +31,8 @@
   FuzzerPassMergeFunctionReturns(
       opt::IRContext* ir_context, TransformationContext* transformation_context,
       FuzzerContext* fuzzer_context,
-      protobufs::TransformationSequence* transformations);
+      protobufs::TransformationSequence* transformations,
+      bool ignore_inapplicable_transformations);
 
   void Apply() override;
 
diff --git a/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_mutate_pointers.cpp b/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_mutate_pointers.cpp
index f021a97..bbe0540 100644
--- a/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_mutate_pointers.cpp
+++ b/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_mutate_pointers.cpp
@@ -24,9 +24,10 @@
 FuzzerPassMutatePointers::FuzzerPassMutatePointers(
     opt::IRContext* ir_context, TransformationContext* transformation_context,
     FuzzerContext* fuzzer_context,
-    protobufs::TransformationSequence* transformations)
+    protobufs::TransformationSequence* transformations,
+    bool ignore_inapplicable_transformations)
     : FuzzerPass(ir_context, transformation_context, fuzzer_context,
-                 transformations) {}
+                 transformations, ignore_inapplicable_transformations) {}
 
 void FuzzerPassMutatePointers::Apply() {
   ForEachInstructionWithInstructionDescriptor(
diff --git a/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_mutate_pointers.h b/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_mutate_pointers.h
index 5ef6a2a..45c6a7c 100644
--- a/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_mutate_pointers.h
+++ b/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_mutate_pointers.h
@@ -26,7 +26,8 @@
   FuzzerPassMutatePointers(opt::IRContext* ir_context,
                            TransformationContext* transformation_context,
                            FuzzerContext* fuzzer_context,
-                           protobufs::TransformationSequence* transformations);
+                           protobufs::TransformationSequence* transformations,
+                           bool ignore_inapplicable_transformations);
 
   void Apply() override;
 };
diff --git a/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_obfuscate_constants.cpp b/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_obfuscate_constants.cpp
index 32318e8..f60c1b4 100644
--- a/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_obfuscate_constants.cpp
+++ b/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_obfuscate_constants.cpp
@@ -30,9 +30,10 @@
 FuzzerPassObfuscateConstants::FuzzerPassObfuscateConstants(
     opt::IRContext* ir_context, TransformationContext* transformation_context,
     FuzzerContext* fuzzer_context,
-    protobufs::TransformationSequence* transformations)
+    protobufs::TransformationSequence* transformations,
+    bool ignore_inapplicable_transformations)
     : FuzzerPass(ir_context, transformation_context, fuzzer_context,
-                 transformations) {}
+                 transformations, ignore_inapplicable_transformations) {}
 
 void FuzzerPassObfuscateConstants::ObfuscateBoolConstantViaConstantPair(
     uint32_t depth, const protobufs::IdUseDescriptor& bool_constant_use,
diff --git a/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_obfuscate_constants.h b/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_obfuscate_constants.h
index 82b1092..30e64d2 100644
--- a/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_obfuscate_constants.h
+++ b/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_obfuscate_constants.h
@@ -30,7 +30,8 @@
   FuzzerPassObfuscateConstants(
       opt::IRContext* ir_context, TransformationContext* transformation_context,
       FuzzerContext* fuzzer_context,
-      protobufs::TransformationSequence* transformations);
+      protobufs::TransformationSequence* transformations,
+      bool ignore_inapplicable_transformations);
 
   void Apply() override;
 
diff --git a/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_outline_functions.cpp b/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_outline_functions.cpp
index bfde61f..b90c12d 100644
--- a/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_outline_functions.cpp
+++ b/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_outline_functions.cpp
@@ -27,9 +27,10 @@
 FuzzerPassOutlineFunctions::FuzzerPassOutlineFunctions(
     opt::IRContext* ir_context, TransformationContext* transformation_context,
     FuzzerContext* fuzzer_context,
-    protobufs::TransformationSequence* transformations)
+    protobufs::TransformationSequence* transformations,
+    bool ignore_inapplicable_transformations)
     : FuzzerPass(ir_context, transformation_context, fuzzer_context,
-                 transformations) {}
+                 transformations, ignore_inapplicable_transformations) {}
 
 void FuzzerPassOutlineFunctions::Apply() {
   std::vector<opt::Function*> original_functions;
diff --git a/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_outline_functions.h b/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_outline_functions.h
index 45e52ff..d80dc4a 100644
--- a/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_outline_functions.h
+++ b/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_outline_functions.h
@@ -24,10 +24,11 @@
 // flow graph into their own functions.
 class FuzzerPassOutlineFunctions : public FuzzerPass {
  public:
-  FuzzerPassOutlineFunctions(
-      opt::IRContext* ir_context, TransformationContext* transformation_context,
-      FuzzerContext* fuzzer_context,
-      protobufs::TransformationSequence* transformations);
+  FuzzerPassOutlineFunctions(opt::IRContext* ir_context,
+                             TransformationContext* transformation_context,
+                             FuzzerContext* fuzzer_context,
+                             protobufs::TransformationSequence* transformations,
+                             bool ignore_inapplicable_transformations);
 
   void Apply() override;
 
diff --git a/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_permute_blocks.cpp b/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_permute_blocks.cpp
index 769c49f..e55fae3 100644
--- a/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_permute_blocks.cpp
+++ b/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_permute_blocks.cpp
@@ -22,9 +22,10 @@
 FuzzerPassPermuteBlocks::FuzzerPassPermuteBlocks(
     opt::IRContext* ir_context, TransformationContext* transformation_context,
     FuzzerContext* fuzzer_context,
-    protobufs::TransformationSequence* transformations)
+    protobufs::TransformationSequence* transformations,
+    bool ignore_inapplicable_transformations)
     : FuzzerPass(ir_context, transformation_context, fuzzer_context,
-                 transformations) {}
+                 transformations, ignore_inapplicable_transformations) {}
 
 void FuzzerPassPermuteBlocks::Apply() {
   // For now we do something very simple: we randomly decide whether to move a
diff --git a/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_permute_blocks.h b/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_permute_blocks.h
index e40178e..39326c2 100644
--- a/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_permute_blocks.h
+++ b/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_permute_blocks.h
@@ -27,7 +27,8 @@
   FuzzerPassPermuteBlocks(opt::IRContext* ir_context,
                           TransformationContext* transformation_context,
                           FuzzerContext* fuzzer_context,
-                          protobufs::TransformationSequence* transformations);
+                          protobufs::TransformationSequence* transformations,
+                          bool ignore_inapplicable_transformations);
 
   void Apply() override;
 };
diff --git a/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_permute_function_parameters.cpp b/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_permute_function_parameters.cpp
index 9a61bea..a8035b9 100644
--- a/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_permute_function_parameters.cpp
+++ b/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_permute_function_parameters.cpp
@@ -28,9 +28,10 @@
 FuzzerPassPermuteFunctionParameters::FuzzerPassPermuteFunctionParameters(
     opt::IRContext* ir_context, TransformationContext* transformation_context,
     FuzzerContext* fuzzer_context,
-    protobufs::TransformationSequence* transformations)
+    protobufs::TransformationSequence* transformations,
+    bool ignore_inapplicable_transformations)
     : FuzzerPass(ir_context, transformation_context, fuzzer_context,
-                 transformations) {}
+                 transformations, ignore_inapplicable_transformations) {}
 
 void FuzzerPassPermuteFunctionParameters::Apply() {
   for (const auto& function : *GetIRContext()->module()) {
diff --git a/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_permute_function_parameters.h b/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_permute_function_parameters.h
index a4bf2ca..c5b6ad4 100644
--- a/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_permute_function_parameters.h
+++ b/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_permute_function_parameters.h
@@ -32,7 +32,8 @@
   FuzzerPassPermuteFunctionParameters(
       opt::IRContext* ir_context, TransformationContext* transformation_context,
       FuzzerContext* fuzzer_context,
-      protobufs::TransformationSequence* transformations);
+      protobufs::TransformationSequence* transformations,
+      bool ignore_inapplicable_transformations);
 
   void Apply() override;
 };
diff --git a/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_permute_function_variables.cpp b/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_permute_function_variables.cpp
index a4e19e3..f8b9b45 100644
--- a/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_permute_function_variables.cpp
+++ b/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_permute_function_variables.cpp
@@ -29,9 +29,11 @@
 FuzzerPassPermuteFunctionVariables::FuzzerPassPermuteFunctionVariables(
     opt::IRContext* ir_context, TransformationContext* transformation_context,
     FuzzerContext* fuzzer_context,
-    protobufs::TransformationSequence* transformations)
+    protobufs::TransformationSequence* transformations,
+    bool ignore_inapplicable_transformations)
     : FuzzerPass(ir_context, transformation_context, fuzzer_context,
-                 transformations) {}  // Here we call parent constructor.
+                 transformations, ignore_inapplicable_transformations) {
+}  // Here we call parent constructor.
 
 void FuzzerPassPermuteFunctionVariables::Apply() {
   // Permuting OpVariable instructions in each function.
diff --git a/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_permute_function_variables.h b/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_permute_function_variables.h
index 47f1de2..2ebc15f 100644
--- a/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_permute_function_variables.h
+++ b/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_permute_function_variables.h
@@ -26,7 +26,8 @@
   FuzzerPassPermuteFunctionVariables(
       opt::IRContext* ir_context, TransformationContext* transformation_context,
       FuzzerContext* fuzzer_context,
-      protobufs::TransformationSequence* transformations);
+      protobufs::TransformationSequence* transformations,
+      bool ignore_inapplicable_transformations);
 
   void Apply() override;
 };
diff --git a/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_permute_instructions.cpp b/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_permute_instructions.cpp
index f17e018..3ef76be 100644
--- a/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_permute_instructions.cpp
+++ b/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_permute_instructions.cpp
@@ -25,9 +25,10 @@
 FuzzerPassPermuteInstructions::FuzzerPassPermuteInstructions(
     opt::IRContext* ir_context, TransformationContext* transformation_context,
     FuzzerContext* fuzzer_context,
-    protobufs::TransformationSequence* transformations)
+    protobufs::TransformationSequence* transformations,
+    bool ignore_inapplicable_transformations)
     : FuzzerPass(ir_context, transformation_context, fuzzer_context,
-                 transformations) {}
+                 transformations, ignore_inapplicable_transformations) {}
 
 void FuzzerPassPermuteInstructions::Apply() {
   // We are iterating over all instructions in all basic blocks.
diff --git a/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_permute_instructions.h b/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_permute_instructions.h
index 027101d..b7ccbcc 100644
--- a/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_permute_instructions.h
+++ b/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_permute_instructions.h
@@ -27,7 +27,8 @@
   FuzzerPassPermuteInstructions(
       opt::IRContext* ir_context, TransformationContext* transformation_context,
       FuzzerContext* fuzzer_context,
-      protobufs::TransformationSequence* transformations);
+      protobufs::TransformationSequence* transformations,
+      bool ignore_inapplicable_transformations);
 
   void Apply() override;
 };
diff --git a/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_permute_phi_operands.cpp b/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_permute_phi_operands.cpp
index f2cc523..5fac981 100644
--- a/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_permute_phi_operands.cpp
+++ b/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_permute_phi_operands.cpp
@@ -28,9 +28,10 @@
 FuzzerPassPermutePhiOperands::FuzzerPassPermutePhiOperands(
     opt::IRContext* ir_context, TransformationContext* transformation_context,
     FuzzerContext* fuzzer_context,
-    protobufs::TransformationSequence* transformations)
+    protobufs::TransformationSequence* transformations,
+    bool ignore_inapplicable_transformations)
     : FuzzerPass(ir_context, transformation_context, fuzzer_context,
-                 transformations) {}
+                 transformations, ignore_inapplicable_transformations) {}
 
 void FuzzerPassPermutePhiOperands::Apply() {
   ForEachInstructionWithInstructionDescriptor(
diff --git a/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_permute_phi_operands.h b/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_permute_phi_operands.h
index 7999956..30a9d4f 100644
--- a/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_permute_phi_operands.h
+++ b/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_permute_phi_operands.h
@@ -27,7 +27,8 @@
   FuzzerPassPermutePhiOperands(
       opt::IRContext* ir_context, TransformationContext* transformation_context,
       FuzzerContext* fuzzer_context,
-      protobufs::TransformationSequence* transformations);
+      protobufs::TransformationSequence* transformations,
+      bool ignore_inapplicable_transformations);
 
   void Apply() override;
 };
diff --git a/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_propagate_instructions_down.cpp b/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_propagate_instructions_down.cpp
index 89e1437..4c46dcd 100644
--- a/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_propagate_instructions_down.cpp
+++ b/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_propagate_instructions_down.cpp
@@ -23,9 +23,10 @@
 FuzzerPassPropagateInstructionsDown::FuzzerPassPropagateInstructionsDown(
     opt::IRContext* ir_context, TransformationContext* transformation_context,
     FuzzerContext* fuzzer_context,
-    protobufs::TransformationSequence* transformations)
+    protobufs::TransformationSequence* transformations,
+    bool ignore_inapplicable_transformations)
     : FuzzerPass(ir_context, transformation_context, fuzzer_context,
-                 transformations) {}
+                 transformations, ignore_inapplicable_transformations) {}
 
 void FuzzerPassPropagateInstructionsDown::Apply() {
   for (const auto& function : *GetIRContext()->module()) {
diff --git a/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_propagate_instructions_down.h b/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_propagate_instructions_down.h
index a2a0aac..18f0165 100644
--- a/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_propagate_instructions_down.h
+++ b/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_propagate_instructions_down.h
@@ -26,7 +26,8 @@
   FuzzerPassPropagateInstructionsDown(
       opt::IRContext* ir_context, TransformationContext* transformation_context,
       FuzzerContext* fuzzer_context,
-      protobufs::TransformationSequence* transformations);
+      protobufs::TransformationSequence* transformations,
+      bool ignore_inapplicable_transformations);
 
   void Apply() override;
 };
diff --git a/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_propagate_instructions_up.cpp b/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_propagate_instructions_up.cpp
index 8cd7437..5e45da8 100644
--- a/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_propagate_instructions_up.cpp
+++ b/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_propagate_instructions_up.cpp
@@ -25,9 +25,10 @@
 FuzzerPassPropagateInstructionsUp::FuzzerPassPropagateInstructionsUp(
     opt::IRContext* ir_context, TransformationContext* transformation_context,
     FuzzerContext* fuzzer_context,
-    protobufs::TransformationSequence* transformations)
+    protobufs::TransformationSequence* transformations,
+    bool ignore_inapplicable_transformations)
     : FuzzerPass(ir_context, transformation_context, fuzzer_context,
-                 transformations) {}
+                 transformations, ignore_inapplicable_transformations) {}
 
 void FuzzerPassPropagateInstructionsUp::Apply() {
   for (const auto& function : *GetIRContext()->module()) {
diff --git a/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_propagate_instructions_up.h b/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_propagate_instructions_up.h
index b89be48..0cb8396 100644
--- a/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_propagate_instructions_up.h
+++ b/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_propagate_instructions_up.h
@@ -27,7 +27,8 @@
   FuzzerPassPropagateInstructionsUp(
       opt::IRContext* ir_context, TransformationContext* transformation_context,
       FuzzerContext* fuzzer_context,
-      protobufs::TransformationSequence* transformations);
+      protobufs::TransformationSequence* transformations,
+      bool ignore_inapplicable_transformations);
 
   void Apply() override;
 };
diff --git a/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_push_ids_through_variables.cpp b/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_push_ids_through_variables.cpp
index 6aebac6..a6c07b4 100644
--- a/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_push_ids_through_variables.cpp
+++ b/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_push_ids_through_variables.cpp
@@ -24,9 +24,10 @@
 FuzzerPassPushIdsThroughVariables::FuzzerPassPushIdsThroughVariables(
     opt::IRContext* ir_context, TransformationContext* transformation_context,
     FuzzerContext* fuzzer_context,
-    protobufs::TransformationSequence* transformations)
+    protobufs::TransformationSequence* transformations,
+    bool ignore_inapplicable_transformations)
     : FuzzerPass(ir_context, transformation_context, fuzzer_context,
-                 transformations) {}
+                 transformations, ignore_inapplicable_transformations) {}
 
 void FuzzerPassPushIdsThroughVariables::Apply() {
   ForEachInstructionWithInstructionDescriptor(
@@ -102,7 +103,7 @@
                            ->IdIsIrrelevant(instruction->result_id()) &&
                       !fuzzerutil::CanMakeSynonymOf(ir_context,
                                                     *GetTransformationContext(),
-                                                    instruction)) {
+                                                    *instruction)) {
                     return false;
                   }
 
diff --git a/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_push_ids_through_variables.h b/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_push_ids_through_variables.h
index 53008ee..71b6949 100644
--- a/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_push_ids_through_variables.h
+++ b/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_push_ids_through_variables.h
@@ -28,7 +28,8 @@
   FuzzerPassPushIdsThroughVariables(
       opt::IRContext* ir_context, TransformationContext* transformation_context,
       FuzzerContext* fuzzer_context,
-      protobufs::TransformationSequence* transformations);
+      protobufs::TransformationSequence* transformations,
+      bool ignore_inapplicable_transformations);
 
   void Apply() override;
 };
diff --git a/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_replace_adds_subs_muls_with_carrying_extended.cpp b/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_replace_adds_subs_muls_with_carrying_extended.cpp
index 8a83d3b..467e613 100644
--- a/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_replace_adds_subs_muls_with_carrying_extended.cpp
+++ b/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_replace_adds_subs_muls_with_carrying_extended.cpp
@@ -29,9 +29,10 @@
         opt::IRContext* ir_context,
         TransformationContext* transformation_context,
         FuzzerContext* fuzzer_context,
-        protobufs::TransformationSequence* transformations)
+        protobufs::TransformationSequence* transformations,
+        bool ignore_inapplicable_transformations)
     : FuzzerPass(ir_context, transformation_context, fuzzer_context,
-                 transformations) {}
+                 transformations, ignore_inapplicable_transformations) {}
 
 void FuzzerPassReplaceAddsSubsMulsWithCarryingExtended::Apply() {
   std::vector<opt::Instruction> instructions_for_transformation;
diff --git a/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_replace_adds_subs_muls_with_carrying_extended.h b/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_replace_adds_subs_muls_with_carrying_extended.h
index 0e29a6c..268655f 100644
--- a/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_replace_adds_subs_muls_with_carrying_extended.h
+++ b/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_replace_adds_subs_muls_with_carrying_extended.h
@@ -29,7 +29,8 @@
   FuzzerPassReplaceAddsSubsMulsWithCarryingExtended(
       opt::IRContext* ir_context, TransformationContext* transformation_context,
       FuzzerContext* fuzzer_context,
-      protobufs::TransformationSequence* transformations);
+      protobufs::TransformationSequence* transformations,
+      bool ignore_inapplicable_transformations);
 
   void Apply() override;
 };
diff --git a/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_replace_branches_from_dead_blocks_with_exits.cpp b/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_replace_branches_from_dead_blocks_with_exits.cpp
index a516f3d..995657c 100644
--- a/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_replace_branches_from_dead_blocks_with_exits.cpp
+++ b/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_replace_branches_from_dead_blocks_with_exits.cpp
@@ -28,9 +28,10 @@
         opt::IRContext* ir_context,
         TransformationContext* transformation_context,
         FuzzerContext* fuzzer_context,
-        protobufs::TransformationSequence* transformations)
+        protobufs::TransformationSequence* transformations,
+        bool ignore_inapplicable_transformations)
     : FuzzerPass(ir_context, transformation_context, fuzzer_context,
-                 transformations) {}
+                 transformations, ignore_inapplicable_transformations) {}
 
 void FuzzerPassReplaceBranchesFromDeadBlocksWithExits::Apply() {
   // OpKill can only be used as a terminator in a function that is guaranteed
diff --git a/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_replace_branches_from_dead_blocks_with_exits.h b/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_replace_branches_from_dead_blocks_with_exits.h
index ab7e00e..cdbb66f 100644
--- a/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_replace_branches_from_dead_blocks_with_exits.h
+++ b/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_replace_branches_from_dead_blocks_with_exits.h
@@ -28,7 +28,8 @@
   FuzzerPassReplaceBranchesFromDeadBlocksWithExits(
       opt::IRContext* ir_context, TransformationContext* transformation_context,
       FuzzerContext* fuzzer_context,
-      protobufs::TransformationSequence* transformations);
+      protobufs::TransformationSequence* transformations,
+      bool ignore_inapplicable_transformations);
 
   void Apply() override;
 };
diff --git a/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_replace_copy_memories_with_loads_stores.cpp b/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_replace_copy_memories_with_loads_stores.cpp
index f17339a..af1aace 100644
--- a/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_replace_copy_memories_with_loads_stores.cpp
+++ b/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_replace_copy_memories_with_loads_stores.cpp
@@ -26,9 +26,10 @@
         opt::IRContext* ir_context,
         TransformationContext* transformation_context,
         FuzzerContext* fuzzer_context,
-        protobufs::TransformationSequence* transformations)
+        protobufs::TransformationSequence* transformations,
+        bool ignore_inapplicable_transformations)
     : FuzzerPass(ir_context, transformation_context, fuzzer_context,
-                 transformations) {}
+                 transformations, ignore_inapplicable_transformations) {}
 
 void FuzzerPassReplaceCopyMemoriesWithLoadsStores::Apply() {
   GetIRContext()->module()->ForEachInst([this](opt::Instruction* instruction) {
diff --git a/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_replace_copy_memories_with_loads_stores.h b/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_replace_copy_memories_with_loads_stores.h
index cffe1cb..7d954ab 100644
--- a/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_replace_copy_memories_with_loads_stores.h
+++ b/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_replace_copy_memories_with_loads_stores.h
@@ -28,7 +28,8 @@
   FuzzerPassReplaceCopyMemoriesWithLoadsStores(
       opt::IRContext* ir_context, TransformationContext* transformation_context,
       FuzzerContext* fuzzer_context,
-      protobufs::TransformationSequence* transformations);
+      protobufs::TransformationSequence* transformations,
+      bool ignore_inapplicable_transformations);
 
   void Apply() override;
 };
diff --git a/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_replace_copy_objects_with_stores_loads.cpp b/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_replace_copy_objects_with_stores_loads.cpp
index 24f2255..d0992a3 100644
--- a/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_replace_copy_objects_with_stores_loads.cpp
+++ b/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_replace_copy_objects_with_stores_loads.cpp
@@ -26,9 +26,10 @@
         opt::IRContext* ir_context,
         TransformationContext* transformation_context,
         FuzzerContext* fuzzer_context,
-        protobufs::TransformationSequence* transformations)
+        protobufs::TransformationSequence* transformations,
+        bool ignore_inapplicable_transformations)
     : FuzzerPass(ir_context, transformation_context, fuzzer_context,
-                 transformations) {}
+                 transformations, ignore_inapplicable_transformations) {}
 
 void FuzzerPassReplaceCopyObjectsWithStoresLoads::Apply() {
   GetIRContext()->module()->ForEachInst([this](opt::Instruction* instruction) {
diff --git a/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_replace_copy_objects_with_stores_loads.h b/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_replace_copy_objects_with_stores_loads.h
index e7b11ce..2ffc00b 100644
--- a/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_replace_copy_objects_with_stores_loads.h
+++ b/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_replace_copy_objects_with_stores_loads.h
@@ -28,7 +28,8 @@
   FuzzerPassReplaceCopyObjectsWithStoresLoads(
       opt::IRContext* ir_context, TransformationContext* transformation_context,
       FuzzerContext* fuzzer_context,
-      protobufs::TransformationSequence* transformations);
+      protobufs::TransformationSequence* transformations,
+      bool ignore_inapplicable_transformations);
 
   void Apply() override;
 };
diff --git a/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_replace_irrelevant_ids.cpp b/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_replace_irrelevant_ids.cpp
index 7e9d7ba..4d55ae8 100644
--- a/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_replace_irrelevant_ids.cpp
+++ b/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_replace_irrelevant_ids.cpp
@@ -27,9 +27,10 @@
 FuzzerPassReplaceIrrelevantIds::FuzzerPassReplaceIrrelevantIds(
     opt::IRContext* ir_context, TransformationContext* transformation_context,
     FuzzerContext* fuzzer_context,
-    protobufs::TransformationSequence* transformations)
+    protobufs::TransformationSequence* transformations,
+    bool ignore_inapplicable_transformations)
     : FuzzerPass(ir_context, transformation_context, fuzzer_context,
-                 transformations) {}
+                 transformations, ignore_inapplicable_transformations) {}
 
 void FuzzerPassReplaceIrrelevantIds::Apply() {
   // Keep track of the irrelevant ids. This includes all the ids that are
diff --git a/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_replace_irrelevant_ids.h b/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_replace_irrelevant_ids.h
index 1dc6b5d..80f8eb8 100644
--- a/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_replace_irrelevant_ids.h
+++ b/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_replace_irrelevant_ids.h
@@ -28,7 +28,8 @@
   FuzzerPassReplaceIrrelevantIds(
       opt::IRContext* ir_context, TransformationContext* transformation_context,
       FuzzerContext* fuzzer_context,
-      protobufs::TransformationSequence* transformations);
+      protobufs::TransformationSequence* transformations,
+      bool ignore_inapplicable_transformations);
 
   void Apply() override;
 };
diff --git a/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_replace_linear_algebra_instructions.cpp b/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_replace_linear_algebra_instructions.cpp
index 0890c2f..445dbfe 100644
--- a/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_replace_linear_algebra_instructions.cpp
+++ b/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_replace_linear_algebra_instructions.cpp
@@ -26,9 +26,10 @@
         opt::IRContext* ir_context,
         TransformationContext* transformation_context,
         FuzzerContext* fuzzer_context,
-        protobufs::TransformationSequence* transformations)
+        protobufs::TransformationSequence* transformations,
+        bool ignore_inapplicable_transformations)
     : FuzzerPass(ir_context, transformation_context, fuzzer_context,
-                 transformations) {}
+                 transformations, ignore_inapplicable_transformations) {}
 
 void FuzzerPassReplaceLinearAlgebraInstructions::Apply() {
   // For each instruction, checks whether it is a linear algebra instruction. In
diff --git a/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_replace_linear_algebra_instructions.h b/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_replace_linear_algebra_instructions.h
index 5d2f204..5734bf1 100644
--- a/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_replace_linear_algebra_instructions.h
+++ b/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_replace_linear_algebra_instructions.h
@@ -27,7 +27,8 @@
   FuzzerPassReplaceLinearAlgebraInstructions(
       opt::IRContext* ir_context, TransformationContext* transformation_context,
       FuzzerContext* fuzzer_context,
-      protobufs::TransformationSequence* transformations);
+      protobufs::TransformationSequence* transformations,
+      bool ignore_inapplicable_transformations);
 
   void Apply() override;
 };
diff --git a/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_replace_loads_stores_with_copy_memories.cpp b/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_replace_loads_stores_with_copy_memories.cpp
index f2cf80f..38ac048 100644
--- a/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_replace_loads_stores_with_copy_memories.cpp
+++ b/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_replace_loads_stores_with_copy_memories.cpp
@@ -27,9 +27,10 @@
         opt::IRContext* ir_context,
         TransformationContext* transformation_context,
         FuzzerContext* fuzzer_context,
-        protobufs::TransformationSequence* transformations)
+        protobufs::TransformationSequence* transformations,
+        bool ignore_inapplicable_transformations)
     : FuzzerPass(ir_context, transformation_context, fuzzer_context,
-                 transformations) {}
+                 transformations, ignore_inapplicable_transformations) {}
 
 void FuzzerPassReplaceLoadsStoresWithCopyMemories::Apply() {
   // We look for matching pairs of instructions OpLoad and
diff --git a/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_replace_loads_stores_with_copy_memories.h b/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_replace_loads_stores_with_copy_memories.h
index f30fc2b..f6209fc 100644
--- a/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_replace_loads_stores_with_copy_memories.h
+++ b/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_replace_loads_stores_with_copy_memories.h
@@ -28,7 +28,8 @@
   FuzzerPassReplaceLoadsStoresWithCopyMemories(
       opt::IRContext* ir_context, TransformationContext* transformation_context,
       FuzzerContext* fuzzer_context,
-      protobufs::TransformationSequence* transformations);
+      protobufs::TransformationSequence* transformations,
+      bool ignore_inapplicable_transformations);
 
   void Apply() override;
 };
diff --git a/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_replace_opphi_ids_from_dead_predecessors.cpp b/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_replace_opphi_ids_from_dead_predecessors.cpp
index b0a3d57..ea90a7a 100644
--- a/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_replace_opphi_ids_from_dead_predecessors.cpp
+++ b/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_replace_opphi_ids_from_dead_predecessors.cpp
@@ -24,9 +24,10 @@
         opt::IRContext* ir_context,
         TransformationContext* transformation_context,
         FuzzerContext* fuzzer_context,
-        protobufs::TransformationSequence* transformations)
+        protobufs::TransformationSequence* transformations,
+        bool ignore_inapplicable_transformations)
     : FuzzerPass(ir_context, transformation_context, fuzzer_context,
-                 transformations) {}
+                 transformations, ignore_inapplicable_transformations) {}
 
 void FuzzerPassReplaceOpPhiIdsFromDeadPredecessors::Apply() {
   // Keep a vector of the transformations to apply.
diff --git a/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_replace_opphi_ids_from_dead_predecessors.h b/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_replace_opphi_ids_from_dead_predecessors.h
index a2bc188..b01e242 100644
--- a/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_replace_opphi_ids_from_dead_predecessors.h
+++ b/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_replace_opphi_ids_from_dead_predecessors.h
@@ -27,7 +27,8 @@
   FuzzerPassReplaceOpPhiIdsFromDeadPredecessors(
       opt::IRContext* ir_context, TransformationContext* transformation_context,
       FuzzerContext* fuzzer_context,
-      protobufs::TransformationSequence* transformations);
+      protobufs::TransformationSequence* transformations,
+      bool ignore_inapplicable_transformations);
 
   void Apply() override;
 };
diff --git a/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_replace_opselects_with_conditional_branches.cpp b/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_replace_opselects_with_conditional_branches.cpp
index 10bb90a..72ed093 100644
--- a/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_replace_opselects_with_conditional_branches.cpp
+++ b/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_replace_opselects_with_conditional_branches.cpp
@@ -27,9 +27,10 @@
         opt::IRContext* ir_context,
         TransformationContext* transformation_context,
         FuzzerContext* fuzzer_context,
-        protobufs::TransformationSequence* transformations)
+        protobufs::TransformationSequence* transformations,
+        bool ignore_inapplicable_transformations)
     : FuzzerPass(ir_context, transformation_context, fuzzer_context,
-                 transformations) {}
+                 transformations, ignore_inapplicable_transformations) {}
 
 void FuzzerPassReplaceOpSelectsWithConditionalBranches::Apply() {
   // Keep track of the instructions that we want to replace. We need to collect
diff --git a/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_replace_opselects_with_conditional_branches.h b/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_replace_opselects_with_conditional_branches.h
index ec74389..174962e 100644
--- a/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_replace_opselects_with_conditional_branches.h
+++ b/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_replace_opselects_with_conditional_branches.h
@@ -27,7 +27,8 @@
   FuzzerPassReplaceOpSelectsWithConditionalBranches(
       opt::IRContext* ir_context, TransformationContext* transformation_context,
       FuzzerContext* fuzzer_context,
-      protobufs::TransformationSequence* transformations);
+      protobufs::TransformationSequence* transformations,
+      bool ignore_inapplicable_transformations);
 
   void Apply() override;
 
diff --git a/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_replace_parameter_with_global.cpp b/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_replace_parameter_with_global.cpp
index 5c256bb..7fb7b0d 100644
--- a/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_replace_parameter_with_global.cpp
+++ b/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_replace_parameter_with_global.cpp
@@ -27,9 +27,10 @@
 FuzzerPassReplaceParameterWithGlobal::FuzzerPassReplaceParameterWithGlobal(
     opt::IRContext* ir_context, TransformationContext* transformation_context,
     FuzzerContext* fuzzer_context,
-    protobufs::TransformationSequence* transformations)
+    protobufs::TransformationSequence* transformations,
+    bool ignore_inapplicable_transformations)
     : FuzzerPass(ir_context, transformation_context, fuzzer_context,
-                 transformations) {}
+                 transformations, ignore_inapplicable_transformations) {}
 
 void FuzzerPassReplaceParameterWithGlobal::Apply() {
   for (const auto& function : *GetIRContext()->module()) {
diff --git a/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_replace_parameter_with_global.h b/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_replace_parameter_with_global.h
index 2ae4946..4eb5086 100644
--- a/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_replace_parameter_with_global.h
+++ b/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_replace_parameter_with_global.h
@@ -27,7 +27,8 @@
   FuzzerPassReplaceParameterWithGlobal(
       opt::IRContext* ir_context, TransformationContext* transformation_context,
       FuzzerContext* fuzzer_context,
-      protobufs::TransformationSequence* transformations);
+      protobufs::TransformationSequence* transformations,
+      bool ignore_inapplicable_transformations);
 
   void Apply() override;
 };
diff --git a/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_replace_params_with_struct.cpp b/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_replace_params_with_struct.cpp
index c045e19..f029316 100644
--- a/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_replace_params_with_struct.cpp
+++ b/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_replace_params_with_struct.cpp
@@ -27,9 +27,10 @@
 FuzzerPassReplaceParamsWithStruct::FuzzerPassReplaceParamsWithStruct(
     opt::IRContext* ir_context, TransformationContext* transformation_context,
     FuzzerContext* fuzzer_context,
-    protobufs::TransformationSequence* transformations)
+    protobufs::TransformationSequence* transformations,
+    bool ignore_inapplicable_transformations)
     : FuzzerPass(ir_context, transformation_context, fuzzer_context,
-                 transformations) {}
+                 transformations, ignore_inapplicable_transformations) {}
 
 void FuzzerPassReplaceParamsWithStruct::Apply() {
   for (const auto& function : *GetIRContext()->module()) {
diff --git a/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_replace_params_with_struct.h b/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_replace_params_with_struct.h
index f17f520..3af7367 100644
--- a/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_replace_params_with_struct.h
+++ b/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_replace_params_with_struct.h
@@ -27,7 +27,8 @@
   FuzzerPassReplaceParamsWithStruct(
       opt::IRContext* ir_context, TransformationContext* transformation_context,
       FuzzerContext* fuzzer_context,
-      protobufs::TransformationSequence* transformations);
+      protobufs::TransformationSequence* transformations,
+      bool ignore_inapplicable_transformations);
 
   void Apply() override;
 };
diff --git a/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_split_blocks.cpp b/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_split_blocks.cpp
index 7b49355..40a4151 100644
--- a/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_split_blocks.cpp
+++ b/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_split_blocks.cpp
@@ -25,9 +25,10 @@
 FuzzerPassSplitBlocks::FuzzerPassSplitBlocks(
     opt::IRContext* ir_context, TransformationContext* transformation_context,
     FuzzerContext* fuzzer_context,
-    protobufs::TransformationSequence* transformations)
+    protobufs::TransformationSequence* transformations,
+    bool ignore_inapplicable_transformations)
     : FuzzerPass(ir_context, transformation_context, fuzzer_context,
-                 transformations) {}
+                 transformations, ignore_inapplicable_transformations) {}
 
 void FuzzerPassSplitBlocks::Apply() {
   // Gather up pointers to all the blocks in the module.  We are then able to
diff --git a/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_split_blocks.h b/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_split_blocks.h
index 58f10dd..b1b9424 100644
--- a/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_split_blocks.h
+++ b/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_split_blocks.h
@@ -27,7 +27,8 @@
   FuzzerPassSplitBlocks(opt::IRContext* ir_context,
                         TransformationContext* transformation_context,
                         FuzzerContext* fuzzer_context,
-                        protobufs::TransformationSequence* transformations);
+                        protobufs::TransformationSequence* transformations,
+                        bool ignore_inapplicable_transformations);
 
   void Apply() override;
 };
diff --git a/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_swap_commutable_operands.cpp b/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_swap_commutable_operands.cpp
index 27fadd1..dce65f0 100644
--- a/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_swap_commutable_operands.cpp
+++ b/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_swap_commutable_operands.cpp
@@ -24,9 +24,10 @@
 FuzzerPassSwapCommutableOperands::FuzzerPassSwapCommutableOperands(
     opt::IRContext* ir_context, TransformationContext* transformation_context,
     FuzzerContext* fuzzer_context,
-    protobufs::TransformationSequence* transformations)
+    protobufs::TransformationSequence* transformations,
+    bool ignore_inapplicable_transformations)
     : FuzzerPass(ir_context, transformation_context, fuzzer_context,
-                 transformations) {}
+                 transformations, ignore_inapplicable_transformations) {}
 
 void FuzzerPassSwapCommutableOperands::Apply() {
   auto context = GetIRContext();
diff --git a/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_swap_commutable_operands.h b/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_swap_commutable_operands.h
index 93de172..13d8fb6 100644
--- a/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_swap_commutable_operands.h
+++ b/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_swap_commutable_operands.h
@@ -28,7 +28,8 @@
   FuzzerPassSwapCommutableOperands(
       opt::IRContext* ir_context, TransformationContext* transformation_context,
       FuzzerContext* fuzzer_context,
-      protobufs::TransformationSequence* transformations);
+      protobufs::TransformationSequence* transformations,
+      bool ignore_inapplicable_transformations);
 
   void Apply() override;
 };
diff --git a/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_swap_conditional_branch_operands.cpp b/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_swap_conditional_branch_operands.cpp
index b145b3b..f8bf111 100644
--- a/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_swap_conditional_branch_operands.cpp
+++ b/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_swap_conditional_branch_operands.cpp
@@ -27,9 +27,10 @@
         opt::IRContext* ir_context,
         TransformationContext* transformation_context,
         FuzzerContext* fuzzer_context,
-        protobufs::TransformationSequence* transformations)
+        protobufs::TransformationSequence* transformations,
+        bool ignore_inapplicable_transformations)
     : FuzzerPass(ir_context, transformation_context, fuzzer_context,
-                 transformations) {}
+                 transformations, ignore_inapplicable_transformations) {}
 
 void FuzzerPassSwapBranchConditionalOperands::Apply() {
   ForEachInstructionWithInstructionDescriptor(
diff --git a/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_swap_conditional_branch_operands.h b/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_swap_conditional_branch_operands.h
index 0137f38..7f71f9b 100644
--- a/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_swap_conditional_branch_operands.h
+++ b/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_swap_conditional_branch_operands.h
@@ -27,7 +27,8 @@
   FuzzerPassSwapBranchConditionalOperands(
       opt::IRContext* ir_context, TransformationContext* transformation_context,
       FuzzerContext* fuzzer_context,
-      protobufs::TransformationSequence* transformations);
+      protobufs::TransformationSequence* transformations,
+      bool ignore_inapplicable_transformations);
 
   void Apply() override;
 };
diff --git a/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_swap_functions.cpp b/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_swap_functions.cpp
index 171f6cb..8eeec85 100644
--- a/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_swap_functions.cpp
+++ b/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_swap_functions.cpp
@@ -23,9 +23,10 @@
 FuzzerPassSwapFunctions::FuzzerPassSwapFunctions(
     opt::IRContext* ir_context, TransformationContext* transformation_context,
     FuzzerContext* fuzzer_context,
-    protobufs::TransformationSequence* transformations)
+    protobufs::TransformationSequence* transformations,
+    bool ignore_inapplicable_transformations)
     : FuzzerPass(ir_context, transformation_context, fuzzer_context,
-                 transformations) {}
+                 transformations, ignore_inapplicable_transformations) {}
 
 void FuzzerPassSwapFunctions::Apply() {
   // Collect all function ids in a module.
diff --git a/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_swap_functions.h b/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_swap_functions.h
index ac551f6..7af527f 100644
--- a/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_swap_functions.h
+++ b/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_swap_functions.h
@@ -26,7 +26,8 @@
   FuzzerPassSwapFunctions(opt::IRContext* ir_context,
                           TransformationContext* transformation_context,
                           FuzzerContext* fuzzer_context,
-                          protobufs::TransformationSequence* transformations);
+                          protobufs::TransformationSequence* transformations,
+                          bool ignore_inapplicable_transformations);
 
   void Apply() override;
 };
diff --git a/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_toggle_access_chain_instruction.cpp b/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_toggle_access_chain_instruction.cpp
index e5afd9e..ac2b156 100644
--- a/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_toggle_access_chain_instruction.cpp
+++ b/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_toggle_access_chain_instruction.cpp
@@ -24,9 +24,10 @@
 FuzzerPassToggleAccessChainInstruction::FuzzerPassToggleAccessChainInstruction(
     opt::IRContext* ir_context, TransformationContext* transformation_context,
     FuzzerContext* fuzzer_context,
-    protobufs::TransformationSequence* transformations)
+    protobufs::TransformationSequence* transformations,
+    bool ignore_inapplicable_transformations)
     : FuzzerPass(ir_context, transformation_context, fuzzer_context,
-                 transformations) {}
+                 transformations, ignore_inapplicable_transformations) {}
 
 void FuzzerPassToggleAccessChainInstruction::Apply() {
   auto context = GetIRContext();
diff --git a/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_toggle_access_chain_instruction.h b/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_toggle_access_chain_instruction.h
index ff2f5d4..f0b6166 100644
--- a/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_toggle_access_chain_instruction.h
+++ b/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_toggle_access_chain_instruction.h
@@ -27,7 +27,8 @@
   FuzzerPassToggleAccessChainInstruction(
       opt::IRContext* ir_context, TransformationContext* transformation_context,
       FuzzerContext* fuzzer_context,
-      protobufs::TransformationSequence* transformations);
+      protobufs::TransformationSequence* transformations,
+      bool ignore_inapplicable_transformations);
 
   void Apply() override;
 };
diff --git a/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_wrap_regions_in_selections.cpp b/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_wrap_regions_in_selections.cpp
index 66bbcd8..3a3b12c 100644
--- a/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_wrap_regions_in_selections.cpp
+++ b/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_wrap_regions_in_selections.cpp
@@ -25,9 +25,10 @@
 FuzzerPassWrapRegionsInSelections::FuzzerPassWrapRegionsInSelections(
     opt::IRContext* ir_context, TransformationContext* transformation_context,
     FuzzerContext* fuzzer_context,
-    protobufs::TransformationSequence* transformations)
+    protobufs::TransformationSequence* transformations,
+    bool ignore_inapplicable_transformations)
     : FuzzerPass(ir_context, transformation_context, fuzzer_context,
-                 transformations) {}
+                 transformations, ignore_inapplicable_transformations) {}
 
 void FuzzerPassWrapRegionsInSelections::Apply() {
   for (auto& function : *GetIRContext()->module()) {
diff --git a/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_wrap_regions_in_selections.h b/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_wrap_regions_in_selections.h
index 822c308..fc3d7df 100644
--- a/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_wrap_regions_in_selections.h
+++ b/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_wrap_regions_in_selections.h
@@ -27,7 +27,8 @@
   FuzzerPassWrapRegionsInSelections(
       opt::IRContext* ir_context, TransformationContext* transformation_context,
       FuzzerContext* fuzzer_context,
-      protobufs::TransformationSequence* transformations);
+      protobufs::TransformationSequence* transformations,
+      bool ignore_inapplicable_transformations);
 
   void Apply() override;
 
diff --git a/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_wrap_vector_synonym.cpp b/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_wrap_vector_synonym.cpp
new file mode 100644
index 0000000..37c93b3
--- /dev/null
+++ b/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_wrap_vector_synonym.cpp
@@ -0,0 +1,137 @@
+// Copyright (c) 2021 Shiyu Liu
+//
+// 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.
+
+#include "source/fuzz/fuzzer_pass_wrap_vector_synonym.h"
+#include "source/fuzz/fuzzer_context.h"
+#include "source/fuzz/fuzzer_util.h"
+#include "source/fuzz/transformation_composite_construct.h"
+#include "source/fuzz/transformation_wrap_vector_synonym.h"
+
+namespace spvtools {
+namespace fuzz {
+
+FuzzerPassWrapVectorSynonym::FuzzerPassWrapVectorSynonym(
+    opt::IRContext* ir_context, TransformationContext* transformation_context,
+    FuzzerContext* fuzzer_context,
+    protobufs::TransformationSequence* transformations,
+    bool ignore_inapplicable_transformations)
+    : FuzzerPass(ir_context, transformation_context, fuzzer_context,
+                 transformations, ignore_inapplicable_transformations) {}
+
+void FuzzerPassWrapVectorSynonym::Apply() {
+  ForEachInstructionWithInstructionDescriptor(
+      [this](opt::Function* /*unused*/, opt::BasicBlock* /*unused*/,
+             opt::BasicBlock::iterator instruction_iterator,
+             const protobufs::InstructionDescriptor& instruction_descriptor)
+          -> void {
+
+        // Randomly decide whether to wrap it to a vector operation.
+        if (!GetFuzzerContext()->ChoosePercentage(
+                GetFuzzerContext()->GetChanceOfWrappingVectorSynonym())) {
+          return;
+        }
+
+        // The transformation is not applicable if the instruction has missing
+        // result id, type id, or is not supported type.
+        if (!TransformationWrapVectorSynonym::IsInstructionSupported(
+                GetIRContext(), *instruction_iterator)) {
+          return;
+        }
+
+        // It must be valid to insert an OpCompositeConstruct instruction
+        // before |instruction_iterator|.
+        if (!fuzzerutil::CanInsertOpcodeBeforeInstruction(
+                SpvOpCompositeConstruct, instruction_iterator)) {
+          return;
+        }
+        // Get the scalar type represented by the targeted instruction id.
+        uint32_t operand_type_id = instruction_iterator->type_id();
+
+        // Get a random vector size from 2 to 4.
+        uint32_t vector_size = GetFuzzerContext()->GetWidthOfWrappingVector();
+
+        // Randomly choose a position that target ids should be placed at.
+        // The position is in range [0, n - 1], where n is the size of the
+        // vector.
+        uint32_t position =
+            GetFuzzerContext()->GetRandomIndexForWrappingVector(vector_size);
+
+        // Target ids are the two scalar ids from the original instruction.
+        uint32_t target_id1 = instruction_iterator->GetSingleWordInOperand(0);
+        uint32_t target_id2 = instruction_iterator->GetSingleWordInOperand(1);
+
+        // We need to be able to make a synonym of the scalar operation's result
+        // id, as well as the operand ids (for example, they cannot be
+        // irrelevant).
+        if (!fuzzerutil::CanMakeSynonymOf(GetIRContext(),
+                                          *GetTransformationContext(),
+                                          *instruction_iterator)) {
+          return;
+        }
+        if (!fuzzerutil::CanMakeSynonymOf(
+                GetIRContext(), *GetTransformationContext(),
+                *GetIRContext()->get_def_use_mgr()->GetDef(target_id1))) {
+          return;
+        }
+        if (!fuzzerutil::CanMakeSynonymOf(
+                GetIRContext(), *GetTransformationContext(),
+                *GetIRContext()->get_def_use_mgr()->GetDef(target_id2))) {
+          return;
+        }
+
+        // Stores the ids of scalar constants.
+        std::vector<uint32_t> vec1_components;
+        std::vector<uint32_t> vec2_components;
+
+        // Populate components based on vector type and size.
+        for (uint32_t i = 0; i < vector_size; ++i) {
+          if (i == position) {
+            vec1_components.emplace_back(target_id1);
+            vec2_components.emplace_back(target_id2);
+          } else {
+            vec1_components.emplace_back(
+                FindOrCreateZeroConstant(operand_type_id, true));
+            vec2_components.emplace_back(
+                FindOrCreateZeroConstant(operand_type_id, true));
+          }
+        }
+
+        // Add two OpCompositeConstruct to the module with result id returned.
+        const uint32_t vector_type_id =
+            FindOrCreateVectorType(operand_type_id, vector_size);
+
+        // Add the first OpCompositeConstruct that wraps the id of the first
+        // operand.
+        uint32_t result_id1 = GetFuzzerContext()->GetFreshId();
+        ApplyTransformation(TransformationCompositeConstruct(
+            vector_type_id, vec1_components, instruction_descriptor,
+            result_id1));
+
+        // Add the second OpCompositeConstruct that wraps the id of the second
+        // operand.
+        uint32_t result_id2 = GetFuzzerContext()->GetFreshId();
+        ApplyTransformation(TransformationCompositeConstruct(
+            vector_type_id, vec2_components, instruction_descriptor,
+            result_id2));
+
+        // Apply transformation to do vector operation and add synonym between
+        // the result vector id and the id of the original instruction.
+        ApplyTransformation(TransformationWrapVectorSynonym(
+            instruction_iterator->result_id(), result_id1, result_id2,
+            GetFuzzerContext()->GetFreshId(), position));
+      });
+}
+
+}  // namespace fuzz
+}  // namespace spvtools
diff --git a/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_wrap_vector_synonym.h b/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_wrap_vector_synonym.h
new file mode 100644
index 0000000..5145838
--- /dev/null
+++ b/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_pass_wrap_vector_synonym.h
@@ -0,0 +1,38 @@
+// Copyright (c) 2021 Shiyu Liu
+//
+// 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.
+
+#ifndef SOURCE_FUZZ_FUZZER_PASS_WRAP_VECTOR_SYNONYM_H_
+#define SOURCE_FUZZ_FUZZER_PASS_WRAP_VECTOR_SYNONYM_H_
+
+#include "source/fuzz/fuzzer_pass.h"
+
+namespace spvtools {
+namespace fuzz {
+
+// Randomly wrap a scalar operation into a vector operation.
+class FuzzerPassWrapVectorSynonym : public FuzzerPass {
+ public:
+  FuzzerPassWrapVectorSynonym(
+      opt::IRContext* ir_context, TransformationContext* transformation_context,
+      FuzzerContext* fuzzer_context,
+      protobufs::TransformationSequence* transformations,
+      bool ignore_inapplicable_transformations);
+
+  void Apply() override;
+};
+
+}  // namespace fuzz
+}  // namespace spvtools
+
+#endif  // SOURCE_FUZZ_FUZZER_PASS_WRAP_VECTOR_SYNONYM_H_
diff --git a/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_util.cpp b/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_util.cpp
index eaa6225..ea7cde7 100644
--- a/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_util.cpp
+++ b/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_util.cpp
@@ -305,34 +305,34 @@
 
 bool CanMakeSynonymOf(opt::IRContext* ir_context,
                       const TransformationContext& transformation_context,
-                      opt::Instruction* inst) {
-  if (inst->opcode() == SpvOpSampledImage) {
+                      const opt::Instruction& inst) {
+  if (inst.opcode() == SpvOpSampledImage) {
     // The SPIR-V data rules say that only very specific instructions may
     // may consume the result id of an OpSampledImage, and this excludes the
     // instructions that are used for making synonyms.
     return false;
   }
-  if (!inst->HasResultId()) {
+  if (!inst.HasResultId()) {
     // We can only make a synonym of an instruction that generates an id.
     return false;
   }
   if (transformation_context.GetFactManager()->IdIsIrrelevant(
-          inst->result_id())) {
+          inst.result_id())) {
     // An irrelevant id can't be a synonym of anything.
     return false;
   }
-  if (!inst->type_id()) {
+  if (!inst.type_id()) {
     // We can only make a synonym of an instruction that has a type.
     return false;
   }
-  auto type_inst = ir_context->get_def_use_mgr()->GetDef(inst->type_id());
+  auto type_inst = ir_context->get_def_use_mgr()->GetDef(inst.type_id());
   if (type_inst->opcode() == SpvOpTypeVoid) {
     // We only make synonyms of instructions that define objects, and an object
     // cannot have void type.
     return false;
   }
   if (type_inst->opcode() == SpvOpTypePointer) {
-    switch (inst->opcode()) {
+    switch (inst.opcode()) {
       case SpvOpConstantNull:
       case SpvOpUndef:
         // We disallow making synonyms of null or undefined pointers.  This is
@@ -348,7 +348,7 @@
   // not decorated analogously, using the original object vs. its synonymous
   // form may not be equivalent.
   return ir_context->get_decoration_mgr()
-      ->GetDecorationsFor(inst->result_id(), true)
+      ->GetDecorationsFor(inst.result_id(), true)
       .empty();
 }
 
@@ -455,6 +455,30 @@
   }
 }
 
+SpvMemorySemanticsMask GetMemorySemanticsForStorageClass(
+    SpvStorageClass storage_class) {
+  switch (storage_class) {
+    case SpvStorageClassWorkgroup:
+      return SpvMemorySemanticsWorkgroupMemoryMask;
+
+    case SpvStorageClassStorageBuffer:
+    case SpvStorageClassPhysicalStorageBuffer:
+      return SpvMemorySemanticsUniformMemoryMask;
+
+    case SpvStorageClassCrossWorkgroup:
+      return SpvMemorySemanticsCrossWorkgroupMemoryMask;
+
+    case SpvStorageClassAtomicCounter:
+      return SpvMemorySemanticsAtomicCounterMemoryMask;
+
+    case SpvStorageClassImage:
+      return SpvMemorySemanticsImageMemoryMask;
+
+    default:
+      return SpvMemorySemanticsMaskNone;
+  }
+}
+
 bool IsValid(const opt::IRContext* context,
              spv_validator_options validator_options,
              MessageConsumer consumer) {
@@ -502,8 +526,12 @@
   // this is a useful aid to debugging.
   std::unordered_map<uint32_t, opt::Instruction*> unique_ids;
   bool found_duplicate = false;
-  ir_context->module()->ForEachInst([&consumer, &found_duplicate,
+  ir_context->module()->ForEachInst([&consumer, &found_duplicate, ir_context,
                                      &unique_ids](opt::Instruction* inst) {
+    (void)ir_context;  // Only used in an assertion; keep release-mode compilers
+                       // happy.
+    assert(inst->context() == ir_context &&
+           "Instruction has wrong IR context.");
     if (unique_ids.count(inst->unique_id()) != 0) {
       consumer(SPV_MSG_INFO, nullptr, {},
                "Two instructions have the same unique id (set a breakpoint to "
@@ -787,11 +815,38 @@
   return absolute_index - inst.NumOperands() + inst.NumInOperands();
 }
 
-bool IsNullConstantSupported(const opt::analysis::Type& type) {
-  return type.AsBool() || type.AsInteger() || type.AsFloat() ||
-         type.AsMatrix() || type.AsVector() || type.AsArray() ||
-         type.AsStruct() || type.AsPointer() || type.AsEvent() ||
-         type.AsDeviceEvent() || type.AsReserveId() || type.AsQueue();
+bool IsNullConstantSupported(opt::IRContext* ir_context,
+                             const opt::Instruction& type_inst) {
+  switch (type_inst.opcode()) {
+    case SpvOpTypeArray:
+    case SpvOpTypeBool:
+    case SpvOpTypeDeviceEvent:
+    case SpvOpTypeEvent:
+    case SpvOpTypeFloat:
+    case SpvOpTypeInt:
+    case SpvOpTypeMatrix:
+    case SpvOpTypeQueue:
+    case SpvOpTypeReserveId:
+    case SpvOpTypeVector:
+    case SpvOpTypeStruct:
+      return true;
+    case SpvOpTypePointer:
+      // Null pointers are allowed if the VariablePointers capability is
+      // enabled, or if the VariablePointersStorageBuffer capability is enabled
+      // and the pointer type has StorageBuffer as its storage class.
+      if (ir_context->get_feature_mgr()->HasCapability(
+              SpvCapabilityVariablePointers)) {
+        return true;
+      }
+      if (ir_context->get_feature_mgr()->HasCapability(
+              SpvCapabilityVariablePointersStorageBuffer)) {
+        return type_inst.GetSingleWordInOperand(0) ==
+               SpvStorageClassStorageBuffer;
+      }
+      return false;
+    default:
+      return false;
+  }
 }
 
 bool GlobalVariablesMustBeDeclaredInEntryPointInterfaces(
diff --git a/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_util.h b/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_util.h
index b956507..e4697a1 100644
--- a/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_util.h
+++ b/third_party/vulkan-deps/spirv-tools/src/source/fuzz/fuzzer_util.h
@@ -118,7 +118,7 @@
 // does not participate in IdIsIrrelevant fact.
 bool CanMakeSynonymOf(opt::IRContext* ir_context,
                       const TransformationContext& transformation_context,
-                      opt::Instruction* inst);
+                      const opt::Instruction& inst);
 
 // Determines whether the given type is a composite; that is: an array, matrix,
 // struct or vector.
@@ -169,6 +169,10 @@
 uint32_t GetBoundForCompositeIndex(const opt::Instruction& composite_type_inst,
                                    opt::IRContext* ir_context);
 
+// Returns memory semantics mask for specific storage class.
+SpvMemorySemanticsMask GetMemorySemanticsForStorageClass(
+    SpvStorageClass storage_class);
+
 // Returns true if and only if |context| is valid, according to the validator
 // instantiated with |validator_options|.  |consumer| is used for error
 // reporting.
@@ -273,8 +277,10 @@
                                         uint32_t absolute_index);
 
 // Returns true if and only if |type| is one of the types for which it is legal
-// to have an OpConstantNull value.
-bool IsNullConstantSupported(const opt::analysis::Type& type);
+// to have an OpConstantNull value. This may depend on the capabilities declared
+// in |context|.
+bool IsNullConstantSupported(opt::IRContext* context,
+                             const opt::Instruction& type);
 
 // Returns true if and only if the SPIR-V version being used requires that
 // global variables accessed in the static call graph of an entry point need
diff --git a/third_party/vulkan-deps/spirv-tools/src/source/fuzz/pass_management/repeated_pass_instances.h b/third_party/vulkan-deps/spirv-tools/src/source/fuzz/pass_management/repeated_pass_instances.h
index 80ac087..da61fda 100644
--- a/third_party/vulkan-deps/spirv-tools/src/source/fuzz/pass_management/repeated_pass_instances.h
+++ b/third_party/vulkan-deps/spirv-tools/src/source/fuzz/pass_management/repeated_pass_instances.h
@@ -73,6 +73,7 @@
 #include "source/fuzz/fuzzer_pass_split_blocks.h"
 #include "source/fuzz/fuzzer_pass_swap_conditional_branch_operands.h"
 #include "source/fuzz/fuzzer_pass_wrap_regions_in_selections.h"
+#include "source/fuzz/fuzzer_pass_wrap_vector_synonym.h"
 
 namespace spvtools {
 namespace fuzz {
@@ -168,6 +169,7 @@
   REPEATED_PASS_INSTANCE(SplitBlocks);
   REPEATED_PASS_INSTANCE(SwapBranchConditionalOperands);
   REPEATED_PASS_INSTANCE(WrapRegionsInSelections);
+  REPEATED_PASS_INSTANCE(WrapVectorSynonym);
 #undef REPEATED_PASS_INSTANCE
 
  public:
diff --git a/third_party/vulkan-deps/spirv-tools/src/source/fuzz/pass_management/repeated_pass_recommender_standard.cpp b/third_party/vulkan-deps/spirv-tools/src/source/fuzz/pass_management/repeated_pass_recommender_standard.cpp
index a933848..6c61c0d 100644
--- a/third_party/vulkan-deps/spirv-tools/src/source/fuzz/pass_management/repeated_pass_recommender_standard.cpp
+++ b/third_party/vulkan-deps/spirv-tools/src/source/fuzz/pass_management/repeated_pass_recommender_standard.cpp
@@ -351,6 +351,12 @@
          pass_instances_->GetReplaceIrrelevantIds(),
          pass_instances_->GetFlattenConditionalBranches()});
   }
+  if (&pass == pass_instances_->GetWrapVectorSynonym()) {
+    // This transformation introduces synonym facts and irrelevant ids.
+    return RandomOrderAndNonNull({pass_instances_->GetApplyIdSynonyms(),
+                                  pass_instances_->GetReplaceIrrelevantIds()});
+  }
+
   assert(false && "Unreachable: every fuzzer pass should be dealt with.");
   return {};
 }
diff --git a/third_party/vulkan-deps/spirv-tools/src/source/fuzz/protobufs/spirvfuzz_protobufs.h b/third_party/vulkan-deps/spirv-tools/src/source/fuzz/protobufs/spirvfuzz_protobufs.h
index eb8cb14..429f341 100644
--- a/third_party/vulkan-deps/spirv-tools/src/source/fuzz/protobufs/spirvfuzz_protobufs.h
+++ b/third_party/vulkan-deps/spirv-tools/src/source/fuzz/protobufs/spirvfuzz_protobufs.h
@@ -23,8 +23,10 @@
 
 #if defined(__clang__)
 #pragma clang diagnostic push
-#pragma clang diagnostic ignored "-Wunused-parameter"
+#pragma clang diagnostic ignored "-Wunknown-warning-option"  // Must come first
 #pragma clang diagnostic ignored "-Wshadow"
+#pragma clang diagnostic ignored "-Wsuggest-destructor-override"
+#pragma clang diagnostic ignored "-Wunused-parameter"
 #elif defined(__GNUC__)
 #pragma GCC diagnostic push
 #pragma GCC diagnostic ignored "-Wconversion"
diff --git a/third_party/vulkan-deps/spirv-tools/src/source/fuzz/protobufs/spvtoolsfuzz.proto b/third_party/vulkan-deps/spirv-tools/src/source/fuzz/protobufs/spvtoolsfuzz.proto
index 657e807..cba9397 100644
--- a/third_party/vulkan-deps/spirv-tools/src/source/fuzz/protobufs/spvtoolsfuzz.proto
+++ b/third_party/vulkan-deps/spirv-tools/src/source/fuzz/protobufs/spvtoolsfuzz.proto
@@ -559,6 +559,7 @@
     TransformationExpandVectorReduction expand_vector_reduction = 85;
     TransformationSwapFunctionVariables swap_function_variables = 86;
     TransformationSwapTwoFunctions swap_two_functions = 87;
+    TransformationWrapVectorSynonym wrap_vector_synonym = 88;
     // Add additional option using the next available number.
   }
 }
@@ -1568,17 +1569,26 @@
 
 message TransformationLoad {
 
-  // Transformation that adds an OpLoad instruction from a pointer into an id.
+  // Transformation that adds an OpLoad or OpAtomicLoad instruction from a pointer into an id.
 
-  // The result of the load instruction
+  // The result of the load instruction.
   uint32 fresh_id = 1;
 
-  // The pointer to be loaded from
+  // The pointer to be loaded from.
   uint32 pointer_id = 2;
 
+  // True if and only if the load should be atomic.
+  bool is_atomic = 3;
+
+  // The memory scope for the atomic load. Ignored unless |is_atomic| is true.
+  uint32 memory_scope_id = 4;
+
+  // The memory semantics for the atomic load. Ignored unless |is_atomic| is true.
+  uint32 memory_semantics_id = 5;
+
   // A descriptor for an instruction in a block before which the new OpLoad
-  // instruction should be inserted
-  InstructionDescriptor instruction_to_insert_before = 3;
+  // instruction should be inserted.
+  InstructionDescriptor instruction_to_insert_before = 6;
 
 }
 
@@ -2235,17 +2245,26 @@
 
 message TransformationStore {
 
-  // Transformation that adds an OpStore instruction of an id to a pointer.
+  // Transformation that adds an OpStore or OpAtomicStore instruction of an id to a pointer.
 
-  // The pointer to be stored to
+  // The pointer to be stored to.
   uint32 pointer_id = 1;
 
-  // The value to be stored
-  uint32 value_id = 2;
+  // True if and only if the load should be atomic.
+  bool is_atomic = 2;
+
+  // The memory scope for the atomic load. Ignored unless |is_atomic| is true.
+  uint32 memory_scope_id = 3;
+
+  // The memory semantics for the atomic load. Ignored unless |is_atomic| is true.
+  uint32 memory_semantics_id = 4;
+
+  // The value to be stored.
+  uint32 value_id = 5;
 
   // A descriptor for an instruction in a block before which the new OpStore
-  // instruction should be inserted
-  InstructionDescriptor instruction_to_insert_before = 3;
+  // instruction should be inserted.
+  InstructionDescriptor instruction_to_insert_before = 6;
 
 }
 
@@ -2371,3 +2390,39 @@
   bool branch_condition = 3;
 
 }
+
+message TransformationWrapVectorSynonym {
+  // A transformation that wraps an arithmetic operation into a vector operation
+  // and get the result of the original operation from the corresponding index.
+  // For instance, for this transformation, an scalar operation between two scalars:
+  // define op ∈ {+, -, *}
+  // c = a op b
+  //
+  // requires the availability of two vectors:
+  //
+  // va = vector(..., a, ...)
+  // vb = vector(..., b, ...)
+  //
+  // where a and b are in the same position i in each of their correponding vector
+  // and a is synonymous with va[i] and b is synonymous with vb[i].
+  //
+  // The transformation then add an instruction vc = va op vb where c is synonymous
+  // with vc[i].
+
+  // The result if of the original scalar operation instruction.
+  uint32 instruction_id = 1;
+
+  // The result id for the first vector that contains the first value of the scalar operation.
+  uint32 vector_operand1 = 2;
+
+  // The result id for the second vector that contains the second value of the scalar operation.
+  uint32 vector_operand2 = 3;
+
+  // A fresh id for the resulted vector from the addition of the first and second vector.
+  uint32 fresh_id = 4;
+
+  // The position in the vector where the value of original instruction is located. Must be in
+  // the corresponding vector range.
+  uint32 scalar_position = 5;
+
+}
diff --git a/third_party/vulkan-deps/spirv-tools/src/source/fuzz/transformation.cpp b/third_party/vulkan-deps/spirv-tools/src/source/fuzz/transformation.cpp
index 4ea0c77..70a302b 100644
--- a/third_party/vulkan-deps/spirv-tools/src/source/fuzz/transformation.cpp
+++ b/third_party/vulkan-deps/spirv-tools/src/source/fuzz/transformation.cpp
@@ -104,6 +104,7 @@
 #include "source/fuzz/transformation_vector_shuffle.h"
 #include "source/fuzz/transformation_wrap_early_terminator_in_function.h"
 #include "source/fuzz/transformation_wrap_region_in_selection.h"
+#include "source/fuzz/transformation_wrap_vector_synonym.h"
 #include "source/util/make_unique.h"
 
 namespace spvtools {
@@ -382,6 +383,9 @@
     case protobufs::Transformation::TransformationCase::kWrapRegionInSelection:
       return MakeUnique<TransformationWrapRegionInSelection>(
           message.wrap_region_in_selection());
+    case protobufs::Transformation::TransformationCase::kWrapVectorSynonym:
+      return MakeUnique<TransformationWrapVectorSynonym>(
+          message.wrap_vector_synonym());
     case protobufs::Transformation::TRANSFORMATION_NOT_SET:
       assert(false && "An unset transformation was encountered.");
       return nullptr;
diff --git a/third_party/vulkan-deps/spirv-tools/src/source/fuzz/transformation_add_constant_null.cpp b/third_party/vulkan-deps/spirv-tools/src/source/fuzz/transformation_add_constant_null.cpp
index 32544e6..c0f7367 100644
--- a/third_party/vulkan-deps/spirv-tools/src/source/fuzz/transformation_add_constant_null.cpp
+++ b/third_party/vulkan-deps/spirv-tools/src/source/fuzz/transformation_add_constant_null.cpp
@@ -35,14 +35,14 @@
   if (!fuzzerutil::IsFreshId(context, message_.fresh_id())) {
     return false;
   }
-  auto type = context->get_type_mgr()->GetType(message_.type_id());
+  auto type = context->get_def_use_mgr()->GetDef(message_.type_id());
   // The type must exist.
   if (!type) {
     return false;
   }
   // The type must be one of the types for which null constants are allowed,
   // according to the SPIR-V spec.
-  return fuzzerutil::IsNullConstantSupported(*type);
+  return fuzzerutil::IsNullConstantSupported(context, *type);
 }
 
 void TransformationAddConstantNull::Apply(
diff --git a/third_party/vulkan-deps/spirv-tools/src/source/fuzz/transformation_add_global_undef.cpp b/third_party/vulkan-deps/spirv-tools/src/source/fuzz/transformation_add_global_undef.cpp
index eb390ea..ec0574a 100644
--- a/third_party/vulkan-deps/spirv-tools/src/source/fuzz/transformation_add_global_undef.cpp
+++ b/third_party/vulkan-deps/spirv-tools/src/source/fuzz/transformation_add_global_undef.cpp
@@ -15,6 +15,7 @@
 #include "source/fuzz/transformation_add_global_undef.h"
 
 #include "source/fuzz/fuzzer_util.h"
+#include "source/opt/reflect.h"
 
 namespace spvtools {
 namespace fuzz {
@@ -35,9 +36,11 @@
   if (!fuzzerutil::IsFreshId(ir_context, message_.fresh_id())) {
     return false;
   }
-  auto type = ir_context->get_type_mgr()->GetType(message_.type_id());
-  // The type must exist, and must not be a function type.
-  return type && !type->AsFunction();
+  auto type = ir_context->get_def_use_mgr()->GetDef(message_.type_id());
+  // The type must exist, and must not be a function or pointer type.
+  return type != nullptr && opt::IsTypeInst(type->opcode()) &&
+         type->opcode() != SpvOpTypeFunction &&
+         type->opcode() != SpvOpTypePointer;
 }
 
 void TransformationAddGlobalUndef::Apply(
diff --git a/third_party/vulkan-deps/spirv-tools/src/source/fuzz/transformation_add_global_undef.h b/third_party/vulkan-deps/spirv-tools/src/source/fuzz/transformation_add_global_undef.h
index 37542c3..fff1ad9 100644
--- a/third_party/vulkan-deps/spirv-tools/src/source/fuzz/transformation_add_global_undef.h
+++ b/third_party/vulkan-deps/spirv-tools/src/source/fuzz/transformation_add_global_undef.h
@@ -31,7 +31,7 @@
   TransformationAddGlobalUndef(uint32_t fresh_id, uint32_t type_id);
 
   // - |message_.fresh_id| must be fresh
-  // - |message_.type_id| must be the id of a non-function type
+  // - |message_.type_id| must be the id of a non-function, non-pointer type
   bool IsApplicable(
       opt::IRContext* ir_context,
       const TransformationContext& transformation_context) const override;
diff --git a/third_party/vulkan-deps/spirv-tools/src/source/fuzz/transformation_add_synonym.cpp b/third_party/vulkan-deps/spirv-tools/src/source/fuzz/transformation_add_synonym.cpp
index a1949fb..69269e5 100644
--- a/third_party/vulkan-deps/spirv-tools/src/source/fuzz/transformation_add_synonym.cpp
+++ b/third_party/vulkan-deps/spirv-tools/src/source/fuzz/transformation_add_synonym.cpp
@@ -151,7 +151,8 @@
     return false;
   }
 
-  if (!fuzzerutil::CanMakeSynonymOf(ir_context, transformation_context, inst)) {
+  if (!fuzzerutil::CanMakeSynonymOf(ir_context, transformation_context,
+                                    *inst)) {
     return false;
   }
 
diff --git a/third_party/vulkan-deps/spirv-tools/src/source/fuzz/transformation_composite_construct.cpp b/third_party/vulkan-deps/spirv-tools/src/source/fuzz/transformation_composite_construct.cpp
index 0cd2308..2d8e599 100644
--- a/third_party/vulkan-deps/spirv-tools/src/source/fuzz/transformation_composite_construct.cpp
+++ b/third_party/vulkan-deps/spirv-tools/src/source/fuzz/transformation_composite_construct.cpp
@@ -297,7 +297,7 @@
         composite_type->AsVector() && component_type->AsVector();
     if (!fuzzerutil::CanMakeSynonymOf(
             ir_context, *transformation_context,
-            ir_context->get_def_use_mgr()->GetDef(component))) {
+            *ir_context->get_def_use_mgr()->GetDef(component))) {
       // We can't make a synonym of this component, so we skip on to the next
       // component.  In the case where we're packing a vector into a vector we
       // have to skip as many components of the resulting vectors as there are
diff --git a/third_party/vulkan-deps/spirv-tools/src/source/fuzz/transformation_composite_extract.cpp b/third_party/vulkan-deps/spirv-tools/src/source/fuzz/transformation_composite_extract.cpp
index 647cd74..0fbd4e1 100644
--- a/third_party/vulkan-deps/spirv-tools/src/source/fuzz/transformation_composite_extract.cpp
+++ b/third_party/vulkan-deps/spirv-tools/src/source/fuzz/transformation_composite_extract.cpp
@@ -125,7 +125,7 @@
   // or if the result id into which we are extracting is irrelevant.
   if (!fuzzerutil::CanMakeSynonymOf(
           ir_context, *transformation_context,
-          ir_context->get_def_use_mgr()->GetDef(message_.composite_id())) ||
+          *ir_context->get_def_use_mgr()->GetDef(message_.composite_id())) ||
       transformation_context->GetFactManager()->IdIsIrrelevant(
           message_.fresh_id())) {
     return;
diff --git a/third_party/vulkan-deps/spirv-tools/src/source/fuzz/transformation_composite_insert.cpp b/third_party/vulkan-deps/spirv-tools/src/source/fuzz/transformation_composite_insert.cpp
index 05162bf..60fa562 100644
--- a/third_party/vulkan-deps/spirv-tools/src/source/fuzz/transformation_composite_insert.cpp
+++ b/third_party/vulkan-deps/spirv-tools/src/source/fuzz/transformation_composite_insert.cpp
@@ -219,9 +219,9 @@
         continue;
       }
       current_index.push_back(i);
-      if (fuzzerutil::CanMakeSynonymOf(
-              ir_context, *transformation_context,
-              ir_context->get_def_use_mgr()->GetDef(message_.composite_id()))) {
+      if (fuzzerutil::CanMakeSynonymOf(ir_context, *transformation_context,
+                                       *ir_context->get_def_use_mgr()->GetDef(
+                                           message_.composite_id()))) {
         transformation_context->GetFactManager()->AddFactDataSynonym(
             MakeDataDescriptor(message_.fresh_id(), current_index),
             MakeDataDescriptor(message_.composite_id(), current_index));
@@ -235,7 +235,7 @@
   // synonymous with the result of the insert instruction at the given index.
   if (fuzzerutil::CanMakeSynonymOf(
           ir_context, *transformation_context,
-          ir_context->get_def_use_mgr()->GetDef(message_.object_id()))) {
+          *ir_context->get_def_use_mgr()->GetDef(message_.object_id()))) {
     transformation_context->GetFactManager()->AddFactDataSynonym(
         MakeDataDescriptor(message_.object_id(), {}),
         MakeDataDescriptor(message_.fresh_id(), index));
diff --git a/third_party/vulkan-deps/spirv-tools/src/source/fuzz/transformation_duplicate_region_with_selection.cpp b/third_party/vulkan-deps/spirv-tools/src/source/fuzz/transformation_duplicate_region_with_selection.cpp
index dee1207..a80becd 100644
--- a/third_party/vulkan-deps/spirv-tools/src/source/fuzz/transformation_duplicate_region_with_selection.cpp
+++ b/third_party/vulkan-deps/spirv-tools/src/source/fuzz/transformation_duplicate_region_with_selection.cpp
@@ -309,9 +309,9 @@
 
   // Construct the merge block.
   std::unique_ptr<opt::BasicBlock> merge_block =
-      MakeUnique<opt::BasicBlock>(MakeUnique<opt::Instruction>(opt::Instruction(
+      MakeUnique<opt::BasicBlock>(MakeUnique<opt::Instruction>(
           ir_context, SpvOpLabel, 0, message_.merge_label_fresh_id(),
-          opt::Instruction::OperandList())));
+          opt::Instruction::OperandList()));
 
   // Get the maps from the protobuf.
   std::map<uint32_t, uint32_t> original_label_to_duplicate_label =
diff --git a/third_party/vulkan-deps/spirv-tools/src/source/fuzz/transformation_expand_vector_reduction.cpp b/third_party/vulkan-deps/spirv-tools/src/source/fuzz/transformation_expand_vector_reduction.cpp
index 9938706..bafcf92 100644
--- a/third_party/vulkan-deps/spirv-tools/src/source/fuzz/transformation_expand_vector_reduction.cpp
+++ b/third_party/vulkan-deps/spirv-tools/src/source/fuzz/transformation_expand_vector_reduction.cpp
@@ -129,7 +129,7 @@
   // If it's possible to make a synonym of |instruction|, then add the fact that
   // the last |logical_instruction| is a synonym of |instruction|.
   if (fuzzerutil::CanMakeSynonymOf(ir_context, *transformation_context,
-                                   instruction)) {
+                                   *instruction)) {
     transformation_context->GetFactManager()->AddFactDataSynonym(
         MakeDataDescriptor(logical_instruction.result_id(), {}),
         MakeDataDescriptor(instruction->result_id(), {}));
diff --git a/third_party/vulkan-deps/spirv-tools/src/source/fuzz/transformation_load.cpp b/third_party/vulkan-deps/spirv-tools/src/source/fuzz/transformation_load.cpp
index e22f8dd..bf48d99 100644
--- a/third_party/vulkan-deps/spirv-tools/src/source/fuzz/transformation_load.cpp
+++ b/third_party/vulkan-deps/spirv-tools/src/source/fuzz/transformation_load.cpp
@@ -24,10 +24,15 @@
     : message_(std::move(message)) {}
 
 TransformationLoad::TransformationLoad(
-    uint32_t fresh_id, uint32_t pointer_id,
+    uint32_t fresh_id, uint32_t pointer_id, bool is_atomic,
+    uint32_t memory_scope, uint32_t memory_semantics,
     const protobufs::InstructionDescriptor& instruction_to_insert_before) {
   message_.set_fresh_id(fresh_id);
   message_.set_pointer_id(pointer_id);
+  message_.set_is_atomic(is_atomic);
+  message_.set_memory_scope_id(memory_scope);
+  message_.set_memory_semantics_id(memory_semantics);
+
   *message_.mutable_instruction_to_insert_before() =
       instruction_to_insert_before;
 }
@@ -68,11 +73,98 @@
   if (!insert_before) {
     return false;
   }
-  // ... and it must be legitimate to insert a store before it.
-  if (!fuzzerutil::CanInsertOpcodeBeforeInstruction(SpvOpLoad, insert_before)) {
+  // ... and it must be legitimate to insert a load before it.
+  if (!message_.is_atomic() &&
+      !fuzzerutil::CanInsertOpcodeBeforeInstruction(SpvOpLoad, insert_before)) {
     return false;
   }
 
+  if (message_.is_atomic() && !fuzzerutil::CanInsertOpcodeBeforeInstruction(
+                                  SpvOpAtomicLoad, insert_before)) {
+    return false;
+  }
+
+  if (message_.is_atomic()) {
+    // Check the exists of memory scope and memory semantics ids.
+    auto memory_scope_instruction =
+        ir_context->get_def_use_mgr()->GetDef(message_.memory_scope_id());
+    auto memory_semantics_instruction =
+        ir_context->get_def_use_mgr()->GetDef(message_.memory_semantics_id());
+
+    if (!memory_scope_instruction) {
+      return false;
+    }
+    if (!memory_semantics_instruction) {
+      return false;
+    }
+    // The memory scope and memory semantics instructions must have the
+    // 'OpConstant' opcode.
+    if (memory_scope_instruction->opcode() != SpvOpConstant) {
+      return false;
+    }
+    if (memory_semantics_instruction->opcode() != SpvOpConstant) {
+      return false;
+    }
+    // The memory scope and memory semantics need to be available before
+    // |insert_before|.
+    if (!fuzzerutil::IdIsAvailableBeforeInstruction(
+            ir_context, insert_before, message_.memory_scope_id())) {
+      return false;
+    }
+    if (!fuzzerutil::IdIsAvailableBeforeInstruction(
+            ir_context, insert_before, message_.memory_semantics_id())) {
+      return false;
+    }
+    // The memory scope and memory semantics instructions must have an Integer
+    // operand type with signedness does not matters.
+    if (ir_context->get_def_use_mgr()
+            ->GetDef(memory_scope_instruction->type_id())
+            ->opcode() != SpvOpTypeInt) {
+      return false;
+    }
+    if (ir_context->get_def_use_mgr()
+            ->GetDef(memory_semantics_instruction->type_id())
+            ->opcode() != SpvOpTypeInt) {
+      return false;
+    }
+
+    // The size of the integer for memory scope and memory semantics
+    // instructions must be equal to 32 bits.
+    auto memory_scope_int_width =
+        ir_context->get_def_use_mgr()
+            ->GetDef(memory_scope_instruction->type_id())
+            ->GetSingleWordInOperand(0);
+    auto memory_semantics_int_width =
+        ir_context->get_def_use_mgr()
+            ->GetDef(memory_semantics_instruction->type_id())
+            ->GetSingleWordInOperand(0);
+
+    if (memory_scope_int_width != 32) {
+      return false;
+    }
+    if (memory_semantics_int_width != 32) {
+      return false;
+    }
+
+    // The memory scope constant value must be that of SpvScopeInvocation.
+    auto memory_scope_const_value =
+        memory_scope_instruction->GetSingleWordInOperand(0);
+    if (memory_scope_const_value != SpvScopeInvocation) {
+      return false;
+    }
+
+    // The memory semantics constant value must match the storage class of the
+    // pointer being loaded from.
+    auto memory_semantics_const_value = static_cast<SpvMemorySemanticsMask>(
+        memory_semantics_instruction->GetSingleWordInOperand(0));
+    if (memory_semantics_const_value !=
+        fuzzerutil::GetMemorySemanticsForStorageClass(
+            static_cast<SpvStorageClass>(
+                pointer_type->GetSingleWordInOperand(0)))) {
+      return false;
+    }
+  }
+
   // The pointer needs to be available at the insertion point.
   return fuzzerutil::IdIsAvailableBeforeInstruction(ir_context, insert_before,
                                                     message_.pointer_id());
@@ -80,22 +172,46 @@
 
 void TransformationLoad::Apply(opt::IRContext* ir_context,
                                TransformationContext* /*unused*/) const {
-  uint32_t result_type = fuzzerutil::GetPointeeTypeIdFromPointerType(
-      ir_context, fuzzerutil::GetTypeId(ir_context, message_.pointer_id()));
-  fuzzerutil::UpdateModuleIdBound(ir_context, message_.fresh_id());
-  auto insert_before =
-      FindInstruction(message_.instruction_to_insert_before(), ir_context);
-  auto new_instruction = MakeUnique<opt::Instruction>(
-      ir_context, SpvOpLoad, result_type, message_.fresh_id(),
-      opt::Instruction::OperandList(
-          {{SPV_OPERAND_TYPE_ID, {message_.pointer_id()}}}));
-  auto new_instruction_ptr = new_instruction.get();
-  insert_before->InsertBefore(std::move(new_instruction));
-  // Inform the def-use manager about the new instruction and record its basic
-  // block.
-  ir_context->get_def_use_mgr()->AnalyzeInstDefUse(new_instruction_ptr);
-  ir_context->set_instr_block(new_instruction_ptr,
-                              ir_context->get_instr_block(insert_before));
+  if (message_.is_atomic()) {
+    // OpAtomicLoad instruction.
+    uint32_t result_type = fuzzerutil::GetPointeeTypeIdFromPointerType(
+        ir_context, fuzzerutil::GetTypeId(ir_context, message_.pointer_id()));
+    fuzzerutil::UpdateModuleIdBound(ir_context, message_.fresh_id());
+    auto insert_before =
+        FindInstruction(message_.instruction_to_insert_before(), ir_context);
+    auto new_instruction = MakeUnique<opt::Instruction>(
+        ir_context, SpvOpAtomicLoad, result_type, message_.fresh_id(),
+        opt::Instruction::OperandList(
+            {{SPV_OPERAND_TYPE_ID, {message_.pointer_id()}},
+             {SPV_OPERAND_TYPE_SCOPE_ID, {message_.memory_scope_id()}},
+             {SPV_OPERAND_TYPE_MEMORY_SEMANTICS_ID,
+              {message_.memory_semantics_id()}}}));
+    auto new_instruction_ptr = new_instruction.get();
+    insert_before->InsertBefore(std::move(new_instruction));
+    // Inform the def-use manager about the new instruction and record its basic
+    // block.
+    ir_context->get_def_use_mgr()->AnalyzeInstDefUse(new_instruction_ptr);
+    ir_context->set_instr_block(new_instruction_ptr,
+                                ir_context->get_instr_block(insert_before));
+  } else {
+    // OpLoad instruction.
+    uint32_t result_type = fuzzerutil::GetPointeeTypeIdFromPointerType(
+        ir_context, fuzzerutil::GetTypeId(ir_context, message_.pointer_id()));
+    fuzzerutil::UpdateModuleIdBound(ir_context, message_.fresh_id());
+    auto insert_before =
+        FindInstruction(message_.instruction_to_insert_before(), ir_context);
+    auto new_instruction = MakeUnique<opt::Instruction>(
+        ir_context, SpvOpLoad, result_type, message_.fresh_id(),
+        opt::Instruction::OperandList(
+            {{SPV_OPERAND_TYPE_ID, {message_.pointer_id()}}}));
+    auto new_instruction_ptr = new_instruction.get();
+    insert_before->InsertBefore(std::move(new_instruction));
+    // Inform the def-use manager about the new instruction and record its basic
+    // block.
+    ir_context->get_def_use_mgr()->AnalyzeInstDefUse(new_instruction_ptr);
+    ir_context->set_instr_block(new_instruction_ptr,
+                                ir_context->get_instr_block(insert_before));
+  }
 }
 
 protobufs::Transformation TransformationLoad::ToMessage() const {
diff --git a/third_party/vulkan-deps/spirv-tools/src/source/fuzz/transformation_load.h b/third_party/vulkan-deps/spirv-tools/src/source/fuzz/transformation_load.h
index d10b007..57b4a53 100644
--- a/third_party/vulkan-deps/spirv-tools/src/source/fuzz/transformation_load.h
+++ b/third_party/vulkan-deps/spirv-tools/src/source/fuzz/transformation_load.h
@@ -28,11 +28,20 @@
   explicit TransformationLoad(protobufs::TransformationLoad message);
 
   TransformationLoad(
-      uint32_t fresh_id, uint32_t pointer_id,
+      uint32_t fresh_id, uint32_t pointer_id, bool is_atomic,
+      uint32_t memory_scope, uint32_t memory_semantics,
       const protobufs::InstructionDescriptor& instruction_to_insert_before);
 
   // - |message_.fresh_id| must be fresh
   // - |message_.pointer_id| must be the id of a pointer
+  // - |message_.is_atomic| must be true if want to work with OpAtomicLoad
+  // - If |is_atomic| is true then |message_memory_scope_id| must be the id of
+  //   an OpConstant 32 bit integer instruction with the value
+  //   SpvScopeInvocation.
+  // - If |is_atomic| is true then |message_.memory_semantics_id| must be the id
+  //   of an OpConstant 32 bit integer instruction with the values
+  //   SpvMemorySemanticsWorkgroupMemoryMask or
+  //   SpvMemorySemanticsUniformMemoryMask.
   // - The pointer must not be OpConstantNull or OpUndef
   // - |message_.instruction_to_insert_before| must identify an instruction
   //   before which it is valid to insert an OpLoad, and where
diff --git a/third_party/vulkan-deps/spirv-tools/src/source/fuzz/transformation_push_id_through_variable.cpp b/third_party/vulkan-deps/spirv-tools/src/source/fuzz/transformation_push_id_through_variable.cpp
index ff52516..55a57a1 100644
--- a/third_party/vulkan-deps/spirv-tools/src/source/fuzz/transformation_push_id_through_variable.cpp
+++ b/third_party/vulkan-deps/spirv-tools/src/source/fuzz/transformation_push_id_through_variable.cpp
@@ -155,7 +155,7 @@
 
   // We should be able to create a synonym of |value_id| if it's not irrelevant.
   if (fuzzerutil::CanMakeSynonymOf(ir_context, *transformation_context,
-                                   value_instruction) &&
+                                   *value_instruction) &&
       !transformation_context->GetFactManager()->IdIsIrrelevant(
           message_.value_synonym_id())) {
     // Adds the fact that |message_.value_synonym_id|
diff --git a/third_party/vulkan-deps/spirv-tools/src/source/fuzz/transformation_store.cpp b/third_party/vulkan-deps/spirv-tools/src/source/fuzz/transformation_store.cpp
index f8c6d01..c00cd34 100644
--- a/third_party/vulkan-deps/spirv-tools/src/source/fuzz/transformation_store.cpp
+++ b/third_party/vulkan-deps/spirv-tools/src/source/fuzz/transformation_store.cpp
@@ -24,9 +24,13 @@
     : message_(std::move(message)) {}
 
 TransformationStore::TransformationStore(
-    uint32_t pointer_id, uint32_t value_id,
+    uint32_t pointer_id, bool is_atomic, uint32_t memory_scope,
+    uint32_t memory_semantics, uint32_t value_id,
     const protobufs::InstructionDescriptor& instruction_to_insert_before) {
   message_.set_pointer_id(pointer_id);
+  message_.set_is_atomic(is_atomic);
+  message_.set_memory_scope_id(memory_scope);
+  message_.set_memory_semantics_id(memory_semantics);
   message_.set_value_id(value_id);
   *message_.mutable_instruction_to_insert_before() =
       instruction_to_insert_before;
@@ -70,8 +74,12 @@
     return false;
   }
   // ... and it must be legitimate to insert a store before it.
-  if (!fuzzerutil::CanInsertOpcodeBeforeInstruction(SpvOpStore,
-                                                    insert_before)) {
+  if (!message_.is_atomic() && !fuzzerutil::CanInsertOpcodeBeforeInstruction(
+                                   SpvOpStore, insert_before)) {
+    return false;
+  }
+  if (message_.is_atomic() && !fuzzerutil::CanInsertOpcodeBeforeInstruction(
+                                  SpvOpAtomicStore, insert_before)) {
     return false;
   }
 
@@ -102,6 +110,87 @@
     return false;
   }
 
+  if (message_.is_atomic()) {
+    // Check the exists of memory scope and memory semantics ids.
+    auto memory_scope_instruction =
+        ir_context->get_def_use_mgr()->GetDef(message_.memory_scope_id());
+    auto memory_semantics_instruction =
+        ir_context->get_def_use_mgr()->GetDef(message_.memory_semantics_id());
+
+    if (!memory_scope_instruction) {
+      return false;
+    }
+    if (!memory_semantics_instruction) {
+      return false;
+    }
+    // The memory scope and memory semantics instructions must have the
+    // 'OpConstant' opcode.
+    if (memory_scope_instruction->opcode() != SpvOpConstant) {
+      return false;
+    }
+    if (memory_semantics_instruction->opcode() != SpvOpConstant) {
+      return false;
+    }
+    // The memory scope and memory semantics need to be available before
+    // |insert_before|.
+    if (!fuzzerutil::IdIsAvailableBeforeInstruction(
+            ir_context, insert_before, message_.memory_scope_id())) {
+      return false;
+    }
+    if (!fuzzerutil::IdIsAvailableBeforeInstruction(
+            ir_context, insert_before, message_.memory_semantics_id())) {
+      return false;
+    }
+    // The memory scope and memory semantics instructions must have an Integer
+    // operand type with signedness does not matters.
+    if (ir_context->get_def_use_mgr()
+            ->GetDef(memory_scope_instruction->type_id())
+            ->opcode() != SpvOpTypeInt) {
+      return false;
+    }
+    if (ir_context->get_def_use_mgr()
+            ->GetDef(memory_semantics_instruction->type_id())
+            ->opcode() != SpvOpTypeInt) {
+      return false;
+    }
+
+    // The size of the integer for memory scope and memory semantics
+    // instructions must be equal to 32 bits.
+    auto memory_scope_int_width =
+        ir_context->get_def_use_mgr()
+            ->GetDef(memory_scope_instruction->type_id())
+            ->GetSingleWordInOperand(0);
+    auto memory_semantics_int_width =
+        ir_context->get_def_use_mgr()
+            ->GetDef(memory_semantics_instruction->type_id())
+            ->GetSingleWordInOperand(0);
+
+    if (memory_scope_int_width != 32) {
+      return false;
+    }
+    if (memory_semantics_int_width != 32) {
+      return false;
+    }
+
+    // The memory scope constant value must be that of SpvScopeInvocation.
+    auto memory_scope_const_value =
+        memory_scope_instruction->GetSingleWordInOperand(0);
+    if (memory_scope_const_value != SpvScopeInvocation) {
+      return false;
+    }
+
+    // The memory semantics constant value must match the storage class of the
+    // pointer being loaded from.
+    auto memory_semantics_const_value = static_cast<SpvMemorySemanticsMask>(
+        memory_semantics_instruction->GetSingleWordInOperand(0));
+    if (memory_semantics_const_value !=
+        fuzzerutil::GetMemorySemanticsForStorageClass(
+            static_cast<SpvStorageClass>(
+                pointer_type->GetSingleWordInOperand(0)))) {
+      return false;
+    }
+  }
+
   // The value needs to be available at the insertion point.
   return fuzzerutil::IdIsAvailableBeforeInstruction(ir_context, insert_before,
                                                     message_.value_id());
@@ -109,20 +198,43 @@
 
 void TransformationStore::Apply(opt::IRContext* ir_context,
                                 TransformationContext* /*unused*/) const {
-  auto insert_before =
-      FindInstruction(message_.instruction_to_insert_before(), ir_context);
-  auto new_instruction = MakeUnique<opt::Instruction>(
-      ir_context, SpvOpStore, 0, 0,
-      opt::Instruction::OperandList(
-          {{SPV_OPERAND_TYPE_ID, {message_.pointer_id()}},
-           {SPV_OPERAND_TYPE_ID, {message_.value_id()}}}));
-  auto new_instruction_ptr = new_instruction.get();
-  insert_before->InsertBefore(std::move(new_instruction));
-  // Inform the def-use manager about the new instruction and record its basic
-  // block.
-  ir_context->get_def_use_mgr()->AnalyzeInstDefUse(new_instruction_ptr);
-  ir_context->set_instr_block(new_instruction_ptr,
-                              ir_context->get_instr_block(insert_before));
+  if (message_.is_atomic()) {
+    // OpAtomicStore instruction.
+    auto insert_before =
+        FindInstruction(message_.instruction_to_insert_before(), ir_context);
+    auto new_instruction = MakeUnique<opt::Instruction>(
+        ir_context, SpvOpAtomicStore, 0, 0,
+        opt::Instruction::OperandList(
+            {{SPV_OPERAND_TYPE_ID, {message_.pointer_id()}},
+             {SPV_OPERAND_TYPE_SCOPE_ID, {message_.memory_scope_id()}},
+             {SPV_OPERAND_TYPE_MEMORY_SEMANTICS_ID,
+              {message_.memory_semantics_id()}},
+             {SPV_OPERAND_TYPE_ID, {message_.value_id()}}}));
+    auto new_instruction_ptr = new_instruction.get();
+    insert_before->InsertBefore(std::move(new_instruction));
+    // Inform the def-use manager about the new instruction and record its basic
+    // block.
+    ir_context->get_def_use_mgr()->AnalyzeInstDefUse(new_instruction_ptr);
+    ir_context->set_instr_block(new_instruction_ptr,
+                                ir_context->get_instr_block(insert_before));
+
+  } else {
+    // OpStore instruction.
+    auto insert_before =
+        FindInstruction(message_.instruction_to_insert_before(), ir_context);
+    auto new_instruction = MakeUnique<opt::Instruction>(
+        ir_context, SpvOpStore, 0, 0,
+        opt::Instruction::OperandList(
+            {{SPV_OPERAND_TYPE_ID, {message_.pointer_id()}},
+             {SPV_OPERAND_TYPE_ID, {message_.value_id()}}}));
+    auto new_instruction_ptr = new_instruction.get();
+    insert_before->InsertBefore(std::move(new_instruction));
+    // Inform the def-use manager about the new instruction and record its basic
+    // block.
+    ir_context->get_def_use_mgr()->AnalyzeInstDefUse(new_instruction_ptr);
+    ir_context->set_instr_block(new_instruction_ptr,
+                                ir_context->get_instr_block(insert_before));
+  }
 }
 
 protobufs::Transformation TransformationStore::ToMessage() const {
diff --git a/third_party/vulkan-deps/spirv-tools/src/source/fuzz/transformation_store.h b/third_party/vulkan-deps/spirv-tools/src/source/fuzz/transformation_store.h
index 18ba1d7..638713b 100644
--- a/third_party/vulkan-deps/spirv-tools/src/source/fuzz/transformation_store.h
+++ b/third_party/vulkan-deps/spirv-tools/src/source/fuzz/transformation_store.h
@@ -28,12 +28,21 @@
   explicit TransformationStore(protobufs::TransformationStore message);
 
   TransformationStore(
-      uint32_t pointer_id, uint32_t value_id,
+      uint32_t pointer_id, bool is_atomic, uint32_t memory_scope,
+      uint32_t memory_semantics, uint32_t value_id,
       const protobufs::InstructionDescriptor& instruction_to_insert_before);
 
   // - |message_.pointer_id| must be the id of a pointer
   // - The pointer type must not have read-only storage class
   // - The pointer must not be OpConstantNull or OpUndef
+  // - |message_.is_atomic| must be true if want to work with OpAtomicStore.
+  // - If |is_atomic| is true then |message_memory_scope_id| must be the id of
+  //   an OpConstant 32 bit integer instruction with the value
+  //   SpvScopeInvocation.
+  // - If |is_atomic| is true then |message_.memory_semantics_id| must be the id
+  //   of an OpConstant 32 bit integer instruction with the values
+  //   SpvMemorySemanticsWorkgroupMemoryMask or
+  //   SpvMemorySemanticsUniformMemoryMask.
   // - |message_.value_id| must be an instruction result id that has the same
   //   type as the pointee type of |message_.pointer_id|
   // - |message_.instruction_to_insert_before| must identify an instruction
diff --git a/third_party/vulkan-deps/spirv-tools/src/source/fuzz/transformation_vector_shuffle.cpp b/third_party/vulkan-deps/spirv-tools/src/source/fuzz/transformation_vector_shuffle.cpp
index ac0e3cc..742a2c8 100644
--- a/third_party/vulkan-deps/spirv-tools/src/source/fuzz/transformation_vector_shuffle.cpp
+++ b/third_party/vulkan-deps/spirv-tools/src/source/fuzz/transformation_vector_shuffle.cpp
@@ -204,7 +204,7 @@
       // Check that the first vector can participate in data synonym facts.
       if (!fuzzerutil::CanMakeSynonymOf(
               ir_context, *transformation_context,
-              ir_context->get_def_use_mgr()->GetDef(message_.vector1()))) {
+              *ir_context->get_def_use_mgr()->GetDef(message_.vector1()))) {
         continue;
       }
       descriptor_for_source_component =
@@ -213,7 +213,7 @@
       // Check that the second vector can participate in data synonym facts.
       if (!fuzzerutil::CanMakeSynonymOf(
               ir_context, *transformation_context,
-              ir_context->get_def_use_mgr()->GetDef(message_.vector2()))) {
+              *ir_context->get_def_use_mgr()->GetDef(message_.vector2()))) {
         continue;
       }
       auto index_into_vector_2 =
diff --git a/third_party/vulkan-deps/spirv-tools/src/source/fuzz/transformation_wrap_vector_synonym.cpp b/third_party/vulkan-deps/spirv-tools/src/source/fuzz/transformation_wrap_vector_synonym.cpp
new file mode 100644
index 0000000..d0eddd4
--- /dev/null
+++ b/third_party/vulkan-deps/spirv-tools/src/source/fuzz/transformation_wrap_vector_synonym.cpp
@@ -0,0 +1,185 @@
+// Copyright (c) 2021 Shiyu Liu
+//
+// 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.
+
+#include "source/fuzz/transformation_wrap_vector_synonym.h"
+
+#include "source/fuzz/data_descriptor.h"
+#include "source/fuzz/fuzzer_util.h"
+#include "source/opt/instruction.h"
+
+namespace spvtools {
+namespace fuzz {
+
+TransformationWrapVectorSynonym::TransformationWrapVectorSynonym(
+    protobufs::TransformationWrapVectorSynonym message)
+    : message_(std::move(message)) {}
+
+TransformationWrapVectorSynonym::TransformationWrapVectorSynonym(
+    uint32_t instruction_id, uint32_t vector_operand1, uint32_t vector_operand2,
+    uint32_t fresh_id, uint32_t pos) {
+  message_.set_instruction_id(instruction_id);
+  message_.set_vector_operand1(vector_operand1);
+  message_.set_vector_operand2(vector_operand2);
+  message_.set_fresh_id(fresh_id);
+  message_.set_scalar_position(pos);
+}
+
+bool TransformationWrapVectorSynonym::IsApplicable(
+    opt::IRContext* ir_context,
+    const TransformationContext& transformation_context) const {
+  // |fresh_id| must be fresh.
+  if (!fuzzerutil::IsFreshId(ir_context, message_.fresh_id())) {
+    return false;
+  }
+
+  const opt::Instruction* instruction =
+      ir_context->get_def_use_mgr()->GetDef(message_.instruction_id());
+
+  // |instruction_id| must refer to an existing instruction.
+  if (instruction == nullptr) {
+    return false;
+  }
+
+  if (!IsInstructionSupported(ir_context, *instruction)) {
+    return false;
+  }
+
+  // It must be possible to make a synonym of the result id of the scalar
+  // operation
+  if (!fuzzerutil::CanMakeSynonymOf(ir_context, transformation_context,
+                                    *instruction)) {
+    return false;
+  }
+
+  // |vector_operand1| and |vector_operand2| must exist.
+  auto vec1 = ir_context->get_def_use_mgr()->GetDef(message_.vector_operand1());
+  auto vec2 = ir_context->get_def_use_mgr()->GetDef(message_.vector_operand2());
+
+  if (vec1 == nullptr || vec2 == nullptr) {
+    return false;
+  }
+
+  // The 2 vectors must be the same valid vector type.
+  auto vec1_type_id = vec1->type_id();
+  auto vec2_type_id = vec2->type_id();
+
+  if (vec1_type_id != vec2_type_id) {
+    return false;
+  }
+
+  if (ir_context->get_def_use_mgr()->GetDef(vec1_type_id)->opcode() !=
+      SpvOpTypeVector) {
+    return false;
+  }
+
+  // |scalar_position| needs to be a non-negative integer less than the vector
+  // length.
+  // OpTypeVector instruction has the component count at index 2.
+  if (message_.scalar_position() >= ir_context->get_def_use_mgr()
+                                        ->GetDef(vec1_type_id)
+                                        ->GetSingleWordInOperand(1)) {
+    return false;
+  }
+
+  if (!transformation_context.GetFactManager()->IsSynonymous(
+          MakeDataDescriptor(message_.vector_operand1(),
+                             {message_.scalar_position()}),
+          MakeDataDescriptor(instruction->GetSingleWordInOperand(0), {}))) {
+    return false;
+  }
+
+  if (!transformation_context.GetFactManager()->IsSynonymous(
+          MakeDataDescriptor(message_.vector_operand2(),
+                             {message_.scalar_position()}),
+          MakeDataDescriptor(instruction->GetSingleWordInOperand(1), {}))) {
+    return false;
+  }
+
+  return true;
+}
+
+void TransformationWrapVectorSynonym::Apply(
+    opt::IRContext* ir_context,
+    TransformationContext* transformation_context) const {
+  // Create an instruction descriptor for the original instruction.
+  auto instruction =
+      ir_context->get_def_use_mgr()->GetDef(message_.instruction_id());
+  auto destination_block = ir_context->get_instr_block(instruction);
+
+  //  Populate input operand list with two vectors for vector operation.
+  opt::Instruction::OperandList in_operands;
+  in_operands.push_back({SPV_OPERAND_TYPE_ID, {message_.vector_operand1()}});
+  in_operands.push_back({SPV_OPERAND_TYPE_ID, {message_.vector_operand2()}});
+
+  // Make a new arithmetic instruction: %fresh_id = OpXX %type_id %result_id1
+  // %result_id2.
+  auto vec_type_id = ir_context->get_def_use_mgr()
+                         ->GetDef(message_.vector_operand1())
+                         ->type_id();
+  auto new_instruction = MakeUnique<opt::Instruction>(
+      ir_context, instruction->opcode(), vec_type_id, message_.fresh_id(),
+      std::move(in_operands));
+  auto new_instruction_ptr = new_instruction.get();
+  instruction->InsertBefore(std::move(new_instruction));
+  ir_context->get_def_use_mgr()->AnalyzeInstDefUse(new_instruction_ptr);
+  ir_context->set_instr_block(new_instruction_ptr, destination_block);
+
+  // Add |fresh_id| to id bound.
+  fuzzerutil::UpdateModuleIdBound(ir_context, message_.fresh_id());
+
+  // Add synonyms between |fresh_id| and |instruction_id|.
+  transformation_context->GetFactManager()->AddFactDataSynonym(
+      MakeDataDescriptor(message_.fresh_id(), {message_.scalar_position()}),
+      MakeDataDescriptor(message_.instruction_id(), {}));
+}
+
+protobufs::Transformation TransformationWrapVectorSynonym::ToMessage() const {
+  protobufs::Transformation result;
+  *result.mutable_wrap_vector_synonym() = message_;
+  return result;
+}
+
+std::unordered_set<uint32_t> TransformationWrapVectorSynonym::GetFreshIds()
+    const {
+  return std::unordered_set<uint32_t>{message_.fresh_id()};
+}
+
+bool TransformationWrapVectorSynonym::IsInstructionSupported(
+    opt::IRContext* ir_context, const opt::Instruction& instruction) {
+  if (!instruction.result_id() || !instruction.type_id()) {
+    return false;
+  }
+  auto type_instruction =
+      ir_context->get_def_use_mgr()->GetDef(instruction.type_id());
+
+  if ((type_instruction->opcode() != SpvOpTypeInt &&
+       type_instruction->opcode() != SpvOpTypeFloat)) {
+    return false;
+  }
+
+  switch (instruction.opcode()) {
+    case SpvOpIAdd:
+    case SpvOpISub:
+    case SpvOpIMul:
+    case SpvOpFAdd:
+    case SpvOpFSub:
+    case SpvOpFMul:
+      return true;
+    default:
+      return false;
+  }
+}
+
+}  // namespace fuzz
+}  // namespace spvtools
diff --git a/third_party/vulkan-deps/spirv-tools/src/source/fuzz/transformation_wrap_vector_synonym.h b/third_party/vulkan-deps/spirv-tools/src/source/fuzz/transformation_wrap_vector_synonym.h
new file mode 100644
index 0000000..008211a
--- /dev/null
+++ b/third_party/vulkan-deps/spirv-tools/src/source/fuzz/transformation_wrap_vector_synonym.h
@@ -0,0 +1,77 @@
+// Copyright (c) 2021 Shiyu Liu
+//
+// 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.
+
+#ifndef SOURCE_FUZZ_TRANSFORMATION_WRAP_VECTOR_SYNONYM_H_
+#define SOURCE_FUZZ_TRANSFORMATION_WRAP_VECTOR_SYNONYM_H_
+
+#include "source/fuzz/protobufs/spirvfuzz_protobufs.h"
+#include "source/fuzz/transformation.h"
+#include "source/fuzz/transformation_context.h"
+#include "source/opt/ir_context.h"
+
+namespace spvtools {
+namespace fuzz {
+
+class TransformationWrapVectorSynonym : public Transformation {
+ public:
+  explicit TransformationWrapVectorSynonym(
+      protobufs::TransformationWrapVectorSynonym message);
+
+  TransformationWrapVectorSynonym(uint32_t instruction_id,
+                                  uint32_t vector_operand1,
+                                  uint32_t vector_operand2, uint32_t fresh_id,
+                                  uint32_t pos);
+  // - |instruction_id| must be the id of a supported arithmetic operation
+  //   and must be relevant.
+  // - |vector_operand1| and |vector_operand2| represents the result ids of the
+  //   two vector operands.
+  // - |fresh_id| is an unused id that will be used as a result id of the
+  //   created instruction.
+  // - |vector_operand1| and |vector_operand2| must have the same vector type
+  //   that is supported by this transformation.
+  // - |pos| is an index of the operands of |instruction_id| in the
+  //   |vector_operand1| and |vector_operand2|. It must be less than the size
+  //   of those vector operands.
+  bool IsApplicable(
+      opt::IRContext* ir_context,
+      const TransformationContext& transformation_context) const override;
+
+  // Adds a new instruction before the |instruction_id| with |fresh_id|
+  // result id and |instruction_id|'s opcode. The added instruction has
+  // two operands: |vector_operand1| and |vector_operand2| and its type
+  // id is equal to the type ids of those operands. A new fact is added
+  // to the fact manager specifying that |fresh_id[pos]| is synonymous
+  // to |instruction_id|.
+  void Apply(opt::IRContext* ir_context,
+             TransformationContext* transformation_context) const override;
+
+  std::unordered_set<uint32_t> GetFreshIds() const override;
+  protobufs::Transformation ToMessage() const override;
+
+  // Checks whether the instruction given is supported by the transformation.
+  // A valid instruction must:
+  // - has both result id and type id.
+  // - is a supported scalar operation instruction.
+  // - has a supported type that is either int or float.
+  static bool IsInstructionSupported(opt::IRContext* ir_context,
+                                     const opt::Instruction& instruction);
+
+ private:
+  protobufs::TransformationWrapVectorSynonym message_;
+};
+
+}  // namespace fuzz
+}  // namespace spvtools
+
+#endif  // SOURCE_FUZZ_TRANSFORMATION_WRAP_VECTOR_SYNONYM_H_
diff --git a/third_party/vulkan-deps/spirv-tools/src/source/lint/CMakeLists.txt b/third_party/vulkan-deps/spirv-tools/src/source/lint/CMakeLists.txt
new file mode 100644
index 0000000..1feae3f
--- /dev/null
+++ b/third_party/vulkan-deps/spirv-tools/src/source/lint/CMakeLists.txt
@@ -0,0 +1,61 @@
+# Copyright (c) 2021 Google LLC.
+
+# 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.
+set(SPIRV_TOOLS_LINT_SOURCES
+  divergence_analysis.h
+  lints.h
+
+  linter.cpp
+  divergence_analysis.cpp
+  lint_divergent_derivatives.cpp
+)
+
+if(MSVC AND (NOT ("${CMAKE_CXX_COMPILER_ID}" MATCHES "Clang")))
+  # Enable parallel builds across four cores for this lib.
+  add_definitions(/MP4)
+endif()
+
+add_library(SPIRV-Tools-lint ${SPIRV_TOOLS_LIBRARY_TYPE} ${SPIRV_TOOLS_LINT_SOURCES})
+
+spvtools_default_compile_options(SPIRV-Tools-lint)
+target_include_directories(SPIRV-Tools-lint
+  PUBLIC
+	$<BUILD_INTERFACE:${spirv-tools_SOURCE_DIR}/include>
+	$<BUILD_INTERFACE:${SPIRV_HEADER_INCLUDE_DIR}>
+	$<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>
+  PRIVATE ${spirv-tools_BINARY_DIR}
+)
+# We need the assembling and disassembling functionalities in the main library.
+target_link_libraries(SPIRV-Tools-lint
+  PUBLIC ${SPIRV_TOOLS_FULL_VISIBILITY})
+# We need the internals of spirv-opt.
+target_link_libraries(SPIRV-Tools-lint
+  PUBLIC SPIRV-Tools-opt)
+
+set_property(TARGET SPIRV-Tools-lint PROPERTY FOLDER "SPIRV-Tools libraries")
+spvtools_check_symbol_exports(SPIRV-Tools-lint)
+
+if(ENABLE_SPIRV_TOOLS_INSTALL)
+  install(TARGETS SPIRV-Tools-lint EXPORT SPIRV-Tools-lintTargets
+    RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
+    LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
+    ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR})
+  export(EXPORT SPIRV-Tools-lintTargets FILE SPIRV-Tools-lintTargets.cmake)
+
+  spvtools_config_package_dir(SPIRV-Tools-lint PACKAGE_DIR)
+  install(EXPORT SPIRV-Tools-lintTargets FILE SPIRV-Tools-lintTargets.cmake
+  	DESTINATION ${PACKAGE_DIR})
+
+  spvtools_generate_config_file(SPIRV-Tools-lint)
+  install(FILES ${CMAKE_BINARY_DIR}/SPIRV-Tools-lintConfig.cmake DESTINATION ${PACKAGE_DIR})
+endif(ENABLE_SPIRV_TOOLS_INSTALL)
diff --git a/third_party/vulkan-deps/spirv-tools/src/source/lint/divergence_analysis.cpp b/third_party/vulkan-deps/spirv-tools/src/source/lint/divergence_analysis.cpp
new file mode 100644
index 0000000..b5a72b4
--- /dev/null
+++ b/third_party/vulkan-deps/spirv-tools/src/source/lint/divergence_analysis.cpp
@@ -0,0 +1,245 @@
+// Copyright (c) 2021 Google LLC.
+//
+// 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.
+
+#include "source/lint/divergence_analysis.h"
+
+#include "source/opt/basic_block.h"
+#include "source/opt/control_dependence.h"
+#include "source/opt/dataflow.h"
+#include "source/opt/function.h"
+#include "source/opt/instruction.h"
+#include "spirv/unified1/spirv.h"
+
+namespace spvtools {
+namespace lint {
+
+void DivergenceAnalysis::EnqueueSuccessors(opt::Instruction* inst) {
+  // Enqueue control dependents of block, if applicable.
+  // There are two ways for a dependence source to be updated:
+  // 1. control -> control: source block is marked divergent.
+  // 2. data -> control: branch condition is marked divergent.
+  uint32_t block_id;
+  if (inst->IsBlockTerminator()) {
+    block_id = context().get_instr_block(inst)->id();
+  } else if (inst->opcode() == SpvOpLabel) {
+    block_id = inst->result_id();
+    opt::BasicBlock* bb = context().cfg()->block(block_id);
+    // Only enqueue phi instructions, as other uses don't affect divergence.
+    bb->ForEachPhiInst([this](opt::Instruction* phi) { Enqueue(phi); });
+  } else {
+    opt::ForwardDataFlowAnalysis::EnqueueUsers(inst);
+    return;
+  }
+  if (!cd_.HasBlock(block_id)) {
+    return;
+  }
+  for (const spvtools::opt::ControlDependence& dep :
+       cd_.GetDependenceTargets(block_id)) {
+    opt::Instruction* target_inst =
+        context().cfg()->block(dep.target_bb_id())->GetLabelInst();
+    Enqueue(target_inst);
+  }
+}
+
+opt::DataFlowAnalysis::VisitResult DivergenceAnalysis::Visit(
+    opt::Instruction* inst) {
+  if (inst->opcode() == SpvOpLabel) {
+    return VisitBlock(inst->result_id());
+  } else {
+    return VisitInstruction(inst);
+  }
+}
+
+opt::DataFlowAnalysis::VisitResult DivergenceAnalysis::VisitBlock(uint32_t id) {
+  if (!cd_.HasBlock(id)) {
+    return opt::DataFlowAnalysis::VisitResult::kResultFixed;
+  }
+  DivergenceLevel& cur_level = divergence_[id];
+  if (cur_level == DivergenceLevel::kDivergent) {
+    return opt::DataFlowAnalysis::VisitResult::kResultFixed;
+  }
+  DivergenceLevel orig = cur_level;
+  for (const spvtools::opt::ControlDependence& dep :
+       cd_.GetDependenceSources(id)) {
+    if (divergence_[dep.source_bb_id()] > cur_level) {
+      cur_level = divergence_[dep.source_bb_id()];
+      divergence_source_[id] = dep.source_bb_id();
+    } else if (dep.source_bb_id() != 0) {
+      uint32_t condition_id = dep.GetConditionID(*context().cfg());
+      DivergenceLevel dep_level = divergence_[condition_id];
+      // Check if we are along the chain of unconditional branches starting from
+      // the branch target.
+      if (follow_unconditional_branches_[dep.branch_target_bb_id()] !=
+          follow_unconditional_branches_[dep.target_bb_id()]) {
+        // We must have reconverged in order to reach this block.
+        // Promote partially uniform to divergent.
+        if (dep_level == DivergenceLevel::kPartiallyUniform) {
+          dep_level = DivergenceLevel::kDivergent;
+        }
+      }
+      if (dep_level > cur_level) {
+        cur_level = dep_level;
+        divergence_source_[id] = condition_id;
+        divergence_dependence_source_[id] = dep.source_bb_id();
+      }
+    }
+  }
+  return cur_level > orig ? VisitResult::kResultChanged
+                          : VisitResult::kResultFixed;
+}
+
+opt::DataFlowAnalysis::VisitResult DivergenceAnalysis::VisitInstruction(
+    opt::Instruction* inst) {
+  if (inst->IsBlockTerminator()) {
+    // This is called only when the condition has changed, so return changed.
+    return VisitResult::kResultChanged;
+  }
+  if (!inst->HasResultId()) {
+    return VisitResult::kResultFixed;
+  }
+  uint32_t id = inst->result_id();
+  DivergenceLevel& cur_level = divergence_[id];
+  if (cur_level == DivergenceLevel::kDivergent) {
+    return opt::DataFlowAnalysis::VisitResult::kResultFixed;
+  }
+  DivergenceLevel orig = cur_level;
+  cur_level = ComputeInstructionDivergence(inst);
+  return cur_level > orig ? VisitResult::kResultChanged
+                          : VisitResult::kResultFixed;
+}
+
+DivergenceAnalysis::DivergenceLevel
+DivergenceAnalysis::ComputeInstructionDivergence(opt::Instruction* inst) {
+  // TODO(kuhar): Check to see if inst is decorated with Uniform or UniformId
+  // and use that to short circuit other checks. Uniform is for subgroups which
+  // would satisfy derivative groups too. UniformId takes a scope, so if it is
+  // subgroup or greater it could satisfy derivative group and
+  // Device/QueueFamily could satisfy fully uniform.
+  uint32_t id = inst->result_id();
+  // Handle divergence roots.
+  if (inst->opcode() == SpvOpFunctionParameter) {
+    divergence_source_[id] = 0;
+    return divergence_[id] = DivergenceLevel::kDivergent;
+  } else if (inst->IsLoad()) {
+    spvtools::opt::Instruction* var = inst->GetBaseAddress();
+    if (var->opcode() != SpvOpVariable) {
+      // Assume divergent.
+      divergence_source_[id] = 0;
+      return DivergenceLevel::kDivergent;
+    }
+    DivergenceLevel ret = ComputeVariableDivergence(var);
+    if (ret > DivergenceLevel::kUniform) {
+      divergence_source_[inst->result_id()] = 0;
+    }
+    return divergence_[id] = ret;
+  }
+  // Get the maximum divergence of the operands.
+  DivergenceLevel ret = DivergenceLevel::kUniform;
+  inst->ForEachInId([this, inst, &ret](const uint32_t* op) {
+    if (!op) return;
+    if (divergence_[*op] > ret) {
+      divergence_source_[inst->result_id()] = *op;
+      ret = divergence_[*op];
+    }
+  });
+  divergence_[inst->result_id()] = ret;
+  return ret;
+}
+
+DivergenceAnalysis::DivergenceLevel
+DivergenceAnalysis::ComputeVariableDivergence(opt::Instruction* var) {
+  uint32_t type_id = var->type_id();
+  spvtools::opt::analysis::Pointer* type =
+      context().get_type_mgr()->GetType(type_id)->AsPointer();
+  assert(type != nullptr);
+  uint32_t def_id = var->result_id();
+  DivergenceLevel ret;
+  switch (type->storage_class()) {
+    case SpvStorageClassFunction:
+    case SpvStorageClassGeneric:
+    case SpvStorageClassAtomicCounter:
+    case SpvStorageClassStorageBuffer:
+    case SpvStorageClassPhysicalStorageBuffer:
+    case SpvStorageClassOutput:
+    case SpvStorageClassWorkgroup:
+    case SpvStorageClassImage:  // Image atomics probably aren't uniform.
+    case SpvStorageClassPrivate:
+      ret = DivergenceLevel::kDivergent;
+      break;
+    case SpvStorageClassInput:
+      ret = DivergenceLevel::kDivergent;
+      // If this variable has a Flat decoration, it is partially uniform.
+      // TODO(kuhar): Track access chain indices and also consider Flat members
+      // of a structure.
+      context().get_decoration_mgr()->WhileEachDecoration(
+          def_id, SpvDecorationFlat, [&ret](const opt::Instruction&) {
+            ret = DivergenceLevel::kPartiallyUniform;
+            return false;
+          });
+      break;
+    case SpvStorageClassUniformConstant:
+      // May be a storage image which is also written to; mark those as
+      // divergent.
+      if (!var->IsVulkanStorageImage() || var->IsReadOnlyPointer()) {
+        ret = DivergenceLevel::kUniform;
+      } else {
+        ret = DivergenceLevel::kDivergent;
+      }
+      break;
+    case SpvStorageClassUniform:
+    case SpvStorageClassPushConstant:
+    case SpvStorageClassCrossWorkgroup:  // Not for shaders; default uniform.
+    default:
+      ret = DivergenceLevel::kUniform;
+      break;
+  }
+  return ret;
+}
+
+void DivergenceAnalysis::Setup(opt::Function* function) {
+  // TODO(kuhar): Run functions called by |function| so we can detect
+  // reconvergence caused by multiple returns.
+  cd_.ComputeControlDependenceGraph(
+      *context().cfg(), *context().GetPostDominatorAnalysis(function));
+  context().cfg()->ForEachBlockInPostOrder(
+      function->entry().get(), [this](const opt::BasicBlock* bb) {
+        uint32_t id = bb->id();
+        if (bb->terminator() == nullptr ||
+            bb->terminator()->opcode() != SpvOpBranch) {
+          follow_unconditional_branches_[id] = id;
+        } else {
+          uint32_t target_id = bb->terminator()->GetSingleWordInOperand(0);
+          // Target is guaranteed to have been visited before us in postorder.
+          follow_unconditional_branches_[id] =
+              follow_unconditional_branches_[target_id];
+        }
+      });
+}
+
+std::ostream& operator<<(std::ostream& os,
+                         DivergenceAnalysis::DivergenceLevel level) {
+  switch (level) {
+    case DivergenceAnalysis::DivergenceLevel::kUniform:
+      return os << "uniform";
+    case DivergenceAnalysis::DivergenceLevel::kPartiallyUniform:
+      return os << "partially uniform";
+    case DivergenceAnalysis::DivergenceLevel::kDivergent:
+      return os << "divergent";
+    default:
+      return os << "<invalid divergence level>";
+  }
+}
+
+}  // namespace lint
+}  // namespace spvtools
diff --git a/third_party/vulkan-deps/spirv-tools/src/source/lint/divergence_analysis.h b/third_party/vulkan-deps/spirv-tools/src/source/lint/divergence_analysis.h
new file mode 100644
index 0000000..4d595ec
--- /dev/null
+++ b/third_party/vulkan-deps/spirv-tools/src/source/lint/divergence_analysis.h
@@ -0,0 +1,163 @@
+// Copyright (c) 2021 Google LLC.
+//
+// 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.
+
+#ifndef SOURCE_LINT_DIVERGENCE_ANALYSIS_H_
+#define SOURCE_LINT_DIVERGENCE_ANALYSIS_H_
+
+#include <cstdint>
+#include <ostream>
+#include <unordered_map>
+
+#include "source/opt/basic_block.h"
+#include "source/opt/control_dependence.h"
+#include "source/opt/dataflow.h"
+#include "source/opt/function.h"
+#include "source/opt/instruction.h"
+
+namespace spvtools {
+namespace lint {
+
+// Computes the static divergence level for blocks (control flow) and values.
+//
+// A value is uniform if all threads that execute it are guaranteed to have the
+// same value. Similarly, a value is partially uniform if this is true only
+// within each derivative group. If neither apply, it is divergent.
+//
+// Control flow through a block is uniform if for any possible execution and
+// point in time, all threads are executing it, or no threads are executing it.
+// In particular, it is never possible for some threads to be inside the block
+// and some threads not executing.
+// TODO(kuhar): Clarify the difference between uniform, divergent, and
+// partially-uniform execution in this analysis.
+//
+// Caveat:
+// As we use control dependence to determine how divergence is propagated, this
+// analysis can be overly permissive when the merge block for a conditional
+// branch or switch is later than (strictly postdominates) the expected merge
+// block, which is the immediate postdominator. However, this is not expected to
+// be a problem in practice, given that SPIR-V is generally output by compilers
+// and other automated tools, which would assign the earliest possible merge
+// block, rather than written by hand.
+// TODO(kuhar): Handle late merges.
+class DivergenceAnalysis : public opt::ForwardDataFlowAnalysis {
+ public:
+  // The tightest (most uniform) level of divergence that can be determined
+  // statically for a value or control flow for a block.
+  //
+  // The values are ordered such that A > B means that A is potentially more
+  // divergent than B.
+  // TODO(kuhar): Rename |PartiallyUniform' to something less confusing. For
+  // example, the enum could be based on scopes.
+  enum class DivergenceLevel {
+    // The value or control flow is uniform across the entire invocation group.
+    kUniform = 0,
+    // The value or control flow is uniform across the derivative group, but not
+    // the invocation group.
+    kPartiallyUniform = 1,
+    // The value or control flow is not statically uniform.
+    kDivergent = 2,
+  };
+
+  DivergenceAnalysis(opt::IRContext& context)
+      : ForwardDataFlowAnalysis(context, LabelPosition::kLabelsAtEnd) {}
+
+  // Returns the divergence level for the given value (non-label instructions),
+  // or control flow for the given block.
+  DivergenceLevel GetDivergenceLevel(uint32_t id) {
+    auto it = divergence_.find(id);
+    if (it == divergence_.end()) {
+      return DivergenceLevel::kUniform;
+    }
+    return it->second;
+  }
+
+  // Returns the divergence source for the given id. The following types of
+  // divergence flows from A to B are possible:
+  //
+  // data -> data: A is used as an operand in the definition of B.
+  // data -> control: B is control-dependent on a branch with condition A.
+  // control -> data: B is a OpPhi instruction in which A is a block operand.
+  // control -> control: B is control-dependent on A.
+  uint32_t GetDivergenceSource(uint32_t id) {
+    auto it = divergence_source_.find(id);
+    if (it == divergence_source_.end()) {
+      return 0;
+    }
+    return it->second;
+  }
+
+  // Returns the dependence source for the control dependence for the given id.
+  // This only exists for data -> control edges.
+  //
+  // In other words, if block 2 is dependent on block 1 due to value 3 (e.g.
+  // block 1 terminates with OpBranchConditional %3 %2 %4):
+  // * GetDivergenceSource(2) = 3
+  // * GetDivergenceDependenceSource(2) = 1
+  //
+  // Returns 0 if not applicable.
+  uint32_t GetDivergenceDependenceSource(uint32_t id) {
+    auto it = divergence_dependence_source_.find(id);
+    if (it == divergence_dependence_source_.end()) {
+      return 0;
+    }
+    return it->second;
+  }
+
+  void InitializeWorklist(opt::Function* function,
+                          bool is_first_iteration) override {
+    // Since |EnqueueSuccessors| is complete, we only need one pass.
+    if (is_first_iteration) {
+      Setup(function);
+      opt::ForwardDataFlowAnalysis::InitializeWorklist(function, true);
+    }
+  }
+
+  void EnqueueSuccessors(opt::Instruction* inst) override;
+
+  VisitResult Visit(opt::Instruction* inst) override;
+
+ private:
+  VisitResult VisitBlock(uint32_t id);
+  VisitResult VisitInstruction(opt::Instruction* inst);
+
+  // Computes the divergence level for the result of the given instruction
+  // based on the current state of the analysis. This is always an
+  // underapproximation, which will be improved as the analysis proceeds.
+  DivergenceLevel ComputeInstructionDivergence(opt::Instruction* inst);
+
+  // Computes the divergence level for a variable, which is used for loads.
+  DivergenceLevel ComputeVariableDivergence(opt::Instruction* var);
+
+  // Initializes data structures for performing dataflow on the given function.
+  void Setup(opt::Function* function);
+
+  std::unordered_map<uint32_t, DivergenceLevel> divergence_;
+  std::unordered_map<uint32_t, uint32_t> divergence_source_;
+  std::unordered_map<uint32_t, uint32_t> divergence_dependence_source_;
+
+  // Stores the result of following unconditional branches starting from the
+  // given block. This is used to detect when reconvergence needs to be
+  // accounted for.
+  std::unordered_map<uint32_t, uint32_t> follow_unconditional_branches_;
+
+  opt::ControlDependenceAnalysis cd_;
+};
+
+std::ostream& operator<<(std::ostream& os,
+                         DivergenceAnalysis::DivergenceLevel level);
+
+}  // namespace lint
+}  // namespace spvtools
+
+#endif  // SOURCE_LINT_DIVERGENCE_ANALYSIS_H_
diff --git a/third_party/vulkan-deps/spirv-tools/src/source/lint/lint_divergent_derivatives.cpp b/third_party/vulkan-deps/spirv-tools/src/source/lint/lint_divergent_derivatives.cpp
new file mode 100644
index 0000000..512847b
--- /dev/null
+++ b/third_party/vulkan-deps/spirv-tools/src/source/lint/lint_divergent_derivatives.cpp
@@ -0,0 +1,169 @@
+// Copyright (c) 2021 Google LLC.
+//
+// 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.
+
+#include <cassert>
+#include <sstream>
+#include <string>
+
+#include "source/diagnostic.h"
+#include "source/lint/divergence_analysis.h"
+#include "source/lint/lints.h"
+#include "source/opt/basic_block.h"
+#include "source/opt/cfg.h"
+#include "source/opt/control_dependence.h"
+#include "source/opt/def_use_manager.h"
+#include "source/opt/dominator_analysis.h"
+#include "source/opt/instruction.h"
+#include "source/opt/ir_context.h"
+#include "spirv-tools/libspirv.h"
+#include "spirv/unified1/spirv.h"
+
+namespace spvtools {
+namespace lint {
+namespace lints {
+namespace {
+// Returns the %name[id], where `name` is the first name associated with the
+// given id, or just %id if one is not found.
+std::string GetFriendlyName(opt::IRContext* context, uint32_t id) {
+  auto names = context->GetNames(id);
+  std::stringstream ss;
+  ss << "%";
+  if (names.empty()) {
+    ss << id;
+  } else {
+    opt::Instruction* inst_name = names.begin()->second;
+    if (inst_name->opcode() == SpvOpName) {
+      ss << names.begin()->second->GetInOperand(0).AsString();
+      ss << "[" << id << "]";
+    } else {
+      ss << id;
+    }
+  }
+  return ss.str();
+}
+
+bool InstructionHasDerivative(const opt::Instruction& inst) {
+  static const SpvOp derivative_opcodes[] = {
+      // Implicit derivatives.
+      SpvOpImageSampleImplicitLod,
+      SpvOpImageSampleDrefImplicitLod,
+      SpvOpImageSampleProjImplicitLod,
+      SpvOpImageSampleProjDrefImplicitLod,
+      SpvOpImageSparseSampleImplicitLod,
+      SpvOpImageSparseSampleDrefImplicitLod,
+      SpvOpImageSparseSampleProjImplicitLod,
+      SpvOpImageSparseSampleProjDrefImplicitLod,
+      // Explicit derivatives.
+      SpvOpDPdx,
+      SpvOpDPdy,
+      SpvOpFwidth,
+      SpvOpDPdxFine,
+      SpvOpDPdyFine,
+      SpvOpFwidthFine,
+      SpvOpDPdxCoarse,
+      SpvOpDPdyCoarse,
+      SpvOpFwidthCoarse,
+  };
+  return std::find(std::begin(derivative_opcodes), std::end(derivative_opcodes),
+                   inst.opcode()) != std::end(derivative_opcodes);
+}
+
+spvtools::DiagnosticStream Warn(opt::IRContext* context,
+                                opt::Instruction* inst) {
+  if (inst == nullptr) {
+    return DiagnosticStream({0, 0, 0}, context->consumer(), "", SPV_WARNING);
+  } else {
+    // TODO(kuhar): Use line numbers based on debug info.
+    return DiagnosticStream(
+        {0, 0, 0}, context->consumer(),
+        inst->PrettyPrint(SPV_BINARY_TO_TEXT_OPTION_FRIENDLY_NAMES),
+        SPV_WARNING);
+  }
+}
+
+void PrintDivergenceFlow(opt::IRContext* context, DivergenceAnalysis div,
+                         uint32_t id) {
+  opt::analysis::DefUseManager* def_use = context->get_def_use_mgr();
+  opt::CFG* cfg = context->cfg();
+  while (id != 0) {
+    bool is_block = def_use->GetDef(id)->opcode() == SpvOpLabel;
+    if (is_block) {
+      Warn(context, nullptr)
+          << "block " << GetFriendlyName(context, id) << " is divergent";
+      uint32_t source = div.GetDivergenceSource(id);
+      // Skip intermediate blocks.
+      while (source != 0 && def_use->GetDef(source)->opcode() == SpvOpLabel) {
+        id = source;
+        source = div.GetDivergenceSource(id);
+      }
+      if (source == 0) break;
+      spvtools::opt::Instruction* branch =
+          cfg->block(div.GetDivergenceDependenceSource(id))->terminator();
+      Warn(context, branch)
+          << "because it depends on a conditional branch on divergent value "
+          << GetFriendlyName(context, source) << "";
+      id = source;
+    } else {
+      Warn(context, nullptr)
+          << "value " << GetFriendlyName(context, id) << " is divergent";
+      uint32_t source = div.GetDivergenceSource(id);
+      opt::Instruction* def = def_use->GetDef(id);
+      opt::Instruction* source_def =
+          source == 0 ? nullptr : def_use->GetDef(source);
+      // First print data -> data dependencies.
+      while (source != 0 && source_def->opcode() != SpvOpLabel) {
+        Warn(context, def_use->GetDef(id))
+            << "because " << GetFriendlyName(context, id) << " uses value "
+            << GetFriendlyName(context, source)
+            << "in its definition, which is divergent";
+        id = source;
+        def = source_def;
+        source = div.GetDivergenceSource(id);
+        source_def = def_use->GetDef(source);
+      }
+      if (source == 0) {
+        Warn(context, def) << "because it has a divergent definition";
+        break;
+      }
+      Warn(context, def) << "because it is conditionally set in block "
+                         << GetFriendlyName(context, source);
+      id = source;
+    }
+  }
+}
+}  // namespace
+
+bool CheckDivergentDerivatives(opt::IRContext* context) {
+  DivergenceAnalysis div(*context);
+  for (opt::Function& func : *context->module()) {
+    div.Run(&func);
+    for (const opt::BasicBlock& bb : func) {
+      for (const opt::Instruction& inst : bb) {
+        if (InstructionHasDerivative(inst) &&
+            div.GetDivergenceLevel(bb.id()) >
+                DivergenceAnalysis::DivergenceLevel::kPartiallyUniform) {
+          Warn(context, nullptr)
+              << "derivative with divergent control flow"
+              << " located in block " << GetFriendlyName(context, bb.id());
+          PrintDivergenceFlow(context, div, bb.id());
+        }
+      }
+    }
+  }
+  return true;
+}
+
+}  // namespace lints
+}  // namespace lint
+}  // namespace spvtools
diff --git a/third_party/vulkan-deps/spirv-tools/src/source/lint/linter.cpp b/third_party/vulkan-deps/spirv-tools/src/source/lint/linter.cpp
new file mode 100644
index 0000000..e4ed04e
--- /dev/null
+++ b/third_party/vulkan-deps/spirv-tools/src/source/lint/linter.cpp
@@ -0,0 +1,60 @@
+// Copyright (c) 2021 Google LLC.
+//
+// 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.
+
+#include "spirv-tools/linter.hpp"
+
+#include "source/lint/lints.h"
+#include "source/opt/build_module.h"
+#include "source/opt/ir_context.h"
+#include "spirv-tools/libspirv.h"
+#include "spirv-tools/libspirv.hpp"
+#include "spirv/unified1/spirv.h"
+
+namespace spvtools {
+
+struct Linter::Impl {
+  explicit Impl(spv_target_env env) : target_env(env) {
+    message_consumer = [](spv_message_level_t /*level*/, const char* /*source*/,
+                          const spv_position_t& /*position*/,
+                          const char* /*message*/) {};
+  }
+
+  spv_target_env target_env;         // Target environment.
+  MessageConsumer message_consumer;  // Message consumer.
+};
+
+Linter::Linter(spv_target_env env) : impl_(new Impl(env)) {}
+
+Linter::~Linter() {}
+
+void Linter::SetMessageConsumer(MessageConsumer consumer) {
+  impl_->message_consumer = std::move(consumer);
+}
+
+const MessageConsumer& Linter::Consumer() const {
+  return impl_->message_consumer;
+}
+
+bool Linter::Run(const uint32_t* binary, size_t binary_size) {
+  std::unique_ptr<opt::IRContext> context =
+      BuildModule(SPV_ENV_VULKAN_1_2, Consumer(), binary, binary_size);
+  if (context == nullptr) return false;
+
+  bool result = true;
+  result &= lint::lints::CheckDivergentDerivatives(context.get());
+
+  return result;
+}
+
+}  // namespace spvtools
diff --git a/third_party/vulkan-deps/spirv-tools/src/source/lint/lints.h b/third_party/vulkan-deps/spirv-tools/src/source/lint/lints.h
new file mode 100644
index 0000000..a1995d2
--- /dev/null
+++ b/third_party/vulkan-deps/spirv-tools/src/source/lint/lints.h
@@ -0,0 +1,34 @@
+// Copyright (c) 2021 Google LLC.
+//
+// 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.
+
+#ifndef SOURCE_LINT_LINTS_H_
+#define SOURCE_LINT_LINTS_H_
+
+#include "source/opt/ir_context.h"
+
+namespace spvtools {
+namespace lint {
+
+// All of the functions in this namespace output to the error consumer in the
+// |context| argument and return |true| if no errors are found. They do not
+// modify the IR.
+namespace lints {
+
+bool CheckDivergentDerivatives(opt::IRContext* context);
+
+}  // namespace lints
+}  // namespace lint
+}  // namespace spvtools
+
+#endif  // SOURCE_LINT_LINTS_H_
diff --git a/third_party/vulkan-deps/spirv-tools/src/source/operand.cpp b/third_party/vulkan-deps/spirv-tools/src/source/operand.cpp
index c00c9b6..bff36a2 100644
--- a/third_party/vulkan-deps/spirv-tools/src/source/operand.cpp
+++ b/third_party/vulkan-deps/spirv-tools/src/source/operand.cpp
@@ -578,6 +578,12 @@
 
 std::function<bool(unsigned)> spvDbgInfoExtOperandCanBeForwardDeclaredFunction(
     spv_ext_inst_type_t ext_type, uint32_t key) {
+  // The Vulkan debug info extended instruction set is non-semantic so allows no
+  // forward references ever.
+  if (ext_type == SPV_EXT_INST_TYPE_NONSEMANTIC_VULKAN_DEBUGINFO_100) {
+    return [](unsigned) { return false; };
+  }
+
   // TODO(https://gitlab.khronos.org/spirv/SPIR-V/issues/532): Forward
   // references for debug info instructions are still in discussion. We must
   // update the following lines of code when we conclude the spec.
diff --git a/third_party/vulkan-deps/spirv-tools/src/source/opt/CMakeLists.txt b/third_party/vulkan-deps/spirv-tools/src/source/opt/CMakeLists.txt
index 0e41b20..63af5c1 100644
--- a/third_party/vulkan-deps/spirv-tools/src/source/opt/CMakeLists.txt
+++ b/third_party/vulkan-deps/spirv-tools/src/source/opt/CMakeLists.txt
@@ -27,8 +27,11 @@
   composite.h
   const_folding_rules.h
   constants.h
+  control_dependence.h
+  convert_to_sampled_image_pass.h
   convert_to_half_pass.h
   copy_prop_arrays.h
+  dataflow.h
   dead_branch_elim_pass.h
   dead_insert_elim_pass.h
   dead_variable_elimination.h
@@ -133,8 +136,11 @@
   composite.cpp
   const_folding_rules.cpp
   constants.cpp
+  control_dependence.cpp
+  convert_to_sampled_image_pass.cpp
   convert_to_half_pass.cpp
   copy_prop_arrays.cpp
+  dataflow.cpp
   dead_branch_elim_pass.cpp
   dead_insert_elim_pass.cpp
   dead_variable_elimination.cpp
diff --git a/third_party/vulkan-deps/spirv-tools/src/source/opt/aggressive_dead_code_elim_pass.cpp b/third_party/vulkan-deps/spirv-tools/src/source/opt/aggressive_dead_code_elim_pass.cpp
index 8c248b3..a55e221 100644
--- a/third_party/vulkan-deps/spirv-tools/src/source/opt/aggressive_dead_code_elim_pass.cpp
+++ b/third_party/vulkan-deps/spirv-tools/src/source/opt/aggressive_dead_code_elim_pass.cpp
@@ -440,6 +440,11 @@
     if (liveInst->type_id() != 0) {
       AddToWorklist(get_def_use_mgr()->GetDef(liveInst->type_id()));
     }
+    BasicBlock* basic_block = context()->get_instr_block(liveInst);
+    if (basic_block != nullptr) {
+      AddToWorklist(basic_block->GetLabelInst());
+    }
+
     // If in a structured if or loop construct, add the controlling
     // conditional branch and its merge.
     BasicBlock* blk = context()->get_instr_block(liveInst);
@@ -474,14 +479,13 @@
         ProcessLoad(func, varId);
       }
       // If DebugDeclare, process as load of variable
-    } else if (liveInst->GetOpenCL100DebugOpcode() ==
-               OpenCLDebugInfo100DebugDeclare) {
+    } else if (liveInst->GetCommonDebugOpcode() ==
+               CommonDebugInfoDebugDeclare) {
       uint32_t varId =
           liveInst->GetSingleWordOperand(kDebugDeclareOperandVariableIndex);
       ProcessLoad(func, varId);
       // If DebugValue with Deref, process as load of variable
-    } else if (liveInst->GetOpenCL100DebugOpcode() ==
-               OpenCLDebugInfo100DebugValue) {
+    } else if (liveInst->GetCommonDebugOpcode() == CommonDebugInfoDebugValue) {
       uint32_t varId = context()
                            ->get_debug_info_mgr()
                            ->GetVariableIdOfDebugValueUsedForDeclare(liveInst);
@@ -652,7 +656,7 @@
   // For each DebugInfo GlobalVariable keep all operands except the Variable.
   // Later, if the variable is dead, we will set the operand to DebugInfoNone.
   for (auto& dbg : get_module()->ext_inst_debuginfo()) {
-    if (dbg.GetOpenCL100DebugOpcode() != OpenCLDebugInfo100DebugGlobalVariable)
+    if (dbg.GetCommonDebugOpcode() != CommonDebugInfoDebugGlobalVariable)
       continue;
     dbg.ForEachInId([this](const uint32_t* iid) {
       Instruction* inInst = get_def_use_mgr()->GetDef(*iid);
@@ -691,7 +695,7 @@
 
   // Process all entry point functions.
   ProcessFunction pfn = [this](Function* fp) { return AggressiveDCE(fp); };
-  modified |= context()->ProcessEntryPointCallTree(pfn);
+  modified |= context()->ProcessReachableCallTree(pfn);
 
   // If the decoration manager is kept live then the context will try to keep it
   // up to date.  ADCE deals with group decorations by changing the operands in
@@ -718,21 +722,20 @@
 
   // Cleanup all CFG including all unreachable blocks.
   ProcessFunction cleanup = [this](Function* f) { return CFGCleanup(f); };
-  modified |= context()->ProcessEntryPointCallTree(cleanup);
+  modified |= context()->ProcessReachableCallTree(cleanup);
 
   return modified ? Status::SuccessWithChange : Status::SuccessWithoutChange;
 }
 
 bool AggressiveDCEPass::EliminateDeadFunctions() {
   // Identify live functions first. Those that are not live
-  // are dead. ADCE is disabled for non-shaders so we do not check for exported
-  // functions here.
+  // are dead.
   std::unordered_set<const Function*> live_function_set;
   ProcessFunction mark_live = [&live_function_set](Function* fp) {
     live_function_set.insert(fp);
     return false;
   };
-  context()->ProcessEntryPointCallTree(mark_live);
+  context()->ProcessReachableCallTree(mark_live);
 
   bool modified = false;
   for (auto funcIter = get_module()->begin();
@@ -877,8 +880,7 @@
     if (!IsDead(&dbg)) continue;
     // Save GlobalVariable if its variable is live, otherwise null out variable
     // index
-    if (dbg.GetOpenCL100DebugOpcode() ==
-        OpenCLDebugInfo100DebugGlobalVariable) {
+    if (dbg.GetCommonDebugOpcode() == CommonDebugInfoDebugGlobalVariable) {
       auto var_id = dbg.GetSingleWordOperand(kGlobalVariableVariableIndex);
       Instruction* var_inst = get_def_use_mgr()->GetDef(var_id);
       if (!IsDead(var_inst)) continue;
diff --git a/third_party/vulkan-deps/spirv-tools/src/source/opt/const_folding_rules.cpp b/third_party/vulkan-deps/spirv-tools/src/source/opt/const_folding_rules.cpp
index d262a7e..515a3ed 100644
--- a/third_party/vulkan-deps/spirv-tools/src/source/opt/const_folding_rules.cpp
+++ b/third_party/vulkan-deps/spirv-tools/src/source/opt/const_folding_rules.cpp
@@ -1002,7 +1002,7 @@
          "Expecting a GLSLstd450 extended instruction.");
 
   // Make sure all Clamp operands are constants.
-  for (uint32_t i = 1; i < 3; i++) {
+  for (uint32_t i = 1; i < 4; i++) {
     if (constants[i] == nullptr) {
       return nullptr;
     }
@@ -1017,7 +1017,7 @@
                         context);
 }
 
-// Fold a clamp instruction when |x >= min_val|.
+// Fold a clamp instruction when |x <= min_val|.
 const analysis::Constant* FoldClamp2(
     IRContext* context, Instruction* inst,
     const std::vector<const analysis::Constant*>& constants) {
diff --git a/third_party/vulkan-deps/spirv-tools/src/source/opt/constants.cpp b/third_party/vulkan-deps/spirv-tools/src/source/opt/constants.cpp
index 19ca600..a3dac5d 100644
--- a/third_party/vulkan-deps/spirv-tools/src/source/opt/constants.cpp
+++ b/third_party/vulkan-deps/spirv-tools/src/source/opt/constants.cpp
@@ -432,6 +432,12 @@
   return GetDefiningInstruction(c)->result_id();
 }
 
+uint32_t ConstantManager::GetUIntConst(uint32_t val) {
+  Type* uint_type = context()->get_type_mgr()->GetUIntType();
+  const Constant* c = GetConstant(uint_type, {val});
+  return GetDefiningInstruction(c)->result_id();
+}
+
 std::vector<const analysis::Constant*> Constant::GetVectorComponents(
     analysis::ConstantManager* const_mgr) const {
   std::vector<const analysis::Constant*> components;
diff --git a/third_party/vulkan-deps/spirv-tools/src/source/opt/constants.h b/third_party/vulkan-deps/spirv-tools/src/source/opt/constants.h
index 95d984f..52bd809 100644
--- a/third_party/vulkan-deps/spirv-tools/src/source/opt/constants.h
+++ b/third_party/vulkan-deps/spirv-tools/src/source/opt/constants.h
@@ -642,6 +642,9 @@
   // Returns the id of a 32-bit signed integer constant with value |val|.
   uint32_t GetSIntConst(int32_t val);
 
+  // Returns the id of a 32-bit unsigned integer constant with value |val|.
+  uint32_t GetUIntConst(uint32_t val);
+
  private:
   // Creates a Constant instance with the given type and a vector of constant
   // defining words. Returns a unique pointer to the created Constant instance
diff --git a/third_party/vulkan-deps/spirv-tools/src/source/opt/control_dependence.cpp b/third_party/vulkan-deps/spirv-tools/src/source/opt/control_dependence.cpp
new file mode 100644
index 0000000..f4879e0
--- /dev/null
+++ b/third_party/vulkan-deps/spirv-tools/src/source/opt/control_dependence.cpp
@@ -0,0 +1,156 @@
+// Copyright (c) 2021 Google LLC.
+//
+// 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.
+
+#include "source/opt/control_dependence.h"
+
+#include <cassert>
+#include <tuple>
+#include <utility>
+#include <vector>
+
+#include "source/opt/basic_block.h"
+#include "source/opt/cfg.h"
+#include "source/opt/dominator_analysis.h"
+#include "source/opt/function.h"
+#include "source/opt/instruction.h"
+#include "spirv/unified1/spirv.h"
+
+// Computes the control dependence graph (CDG) using the algorithm in Cytron
+// 1991, "Efficiently Computing Static Single Assignment Form and the Control
+// Dependence Graph." It relies on the fact that the control dependence sources
+// (blocks on which a block is control dependent) are exactly the post-dominance
+// frontier for that block. The explanation and proofs are given in Section 6 of
+// that paper.
+// Link: https://www.cs.utexas.edu/~pingali/CS380C/2010/papers/ssaCytron.pdf
+//
+// The algorithm in Section 4.2 of the same paper is used to construct the
+// dominance frontier. It uses the post-dominance tree, which is available in
+// the IR context.
+
+namespace spvtools {
+namespace opt {
+constexpr uint32_t ControlDependenceAnalysis::kPseudoEntryBlock;
+
+uint32_t ControlDependence::GetConditionID(const CFG& cfg) const {
+  if (source_bb_id() == 0) {
+    // Entry dependence; return 0.
+    return 0;
+  }
+  const BasicBlock* source_bb = cfg.block(source_bb_id());
+  const Instruction* branch = source_bb->terminator();
+  assert((branch->opcode() == SpvOpBranchConditional ||
+          branch->opcode() == SpvOpSwitch) &&
+         "invalid control dependence; last instruction must be conditional "
+         "branch or switch");
+  return branch->GetSingleWordInOperand(0);
+}
+
+bool ControlDependence::operator<(const ControlDependence& other) const {
+  return std::tie(source_bb_id_, target_bb_id_, branch_target_bb_id_) <
+         std::tie(other.source_bb_id_, other.target_bb_id_,
+                  other.branch_target_bb_id_);
+}
+
+bool ControlDependence::operator==(const ControlDependence& other) const {
+  return std::tie(source_bb_id_, target_bb_id_, branch_target_bb_id_) ==
+         std::tie(other.source_bb_id_, other.target_bb_id_,
+                  other.branch_target_bb_id_);
+}
+
+std::ostream& operator<<(std::ostream& os, const ControlDependence& dep) {
+  os << dep.source_bb_id() << "->" << dep.target_bb_id();
+  if (dep.branch_target_bb_id() != dep.target_bb_id()) {
+    os << " through " << dep.branch_target_bb_id();
+  }
+  return os;
+}
+
+void ControlDependenceAnalysis::ComputePostDominanceFrontiers(
+    const CFG& cfg, const PostDominatorAnalysis& pdom) {
+  // Compute post-dominance frontiers (reverse graph).
+  // The dominance frontier for a block X is equal to (Equation 4)
+  //   DF_local(X) U { B in DF_up(Z) | X = ipdom(Z) }
+  //   (ipdom(Z) is the immediate post-dominator of Z.)
+  // where
+  //   DF_local(X) = { Y | X -> Y in CFG, X does not strictly post-dominate Y }
+  //     represents the contribution of X's predecessors to the DF, and
+  //   DF_up(Z) = { Y | Y in DF(Z), ipdom(Z) does not strictly post-dominate Y }
+  //     (note: ipdom(Z) = X.)
+  //     represents the contribution of a block to its immediate post-
+  //     dominator's DF.
+  // This is computed in one pass through a post-order traversal of the
+  // post-dominator tree.
+
+  // Assert that there is a block other than the pseudo exit in the pdom tree,
+  // as we need one to get the function entry point (as the pseudo exit is not
+  // actually part of the function.)
+  assert(!cfg.IsPseudoExitBlock(pdom.GetDomTree().post_begin()->bb_));
+  Function* function = pdom.GetDomTree().post_begin()->bb_->GetParent();
+  uint32_t function_entry = function->entry()->id();
+  // Explicitly initialize pseudo-entry block, as it doesn't depend on anything,
+  // so it won't be initialized in the following loop.
+  reverse_nodes_[kPseudoEntryBlock] = {};
+  for (auto it = pdom.GetDomTree().post_cbegin();
+       it != pdom.GetDomTree().post_cend(); ++it) {
+    ComputePostDominanceFrontierForNode(cfg, pdom, function_entry, *it);
+  }
+}
+
+void ControlDependenceAnalysis::ComputePostDominanceFrontierForNode(
+    const CFG& cfg, const PostDominatorAnalysis& pdom, uint32_t function_entry,
+    const DominatorTreeNode& pdom_node) {
+  const uint32_t label = pdom_node.id();
+  ControlDependenceList& edges = reverse_nodes_[label];
+  for (uint32_t pred : cfg.preds(label)) {
+    if (!pdom.StrictlyDominates(label, pred)) {
+      edges.push_back(ControlDependence(pred, label));
+    }
+  }
+  if (label == function_entry) {
+    // Add edge from pseudo-entry to entry.
+    // In CDG construction, an edge is added from entry to exit, so only the
+    // exit node can post-dominate entry.
+    edges.push_back(ControlDependence(kPseudoEntryBlock, label));
+  }
+  for (DominatorTreeNode* child : pdom_node) {
+    // Note: iterate dependences by value, as we need a copy.
+    for (const ControlDependence& dep : reverse_nodes_[child->id()]) {
+      // Special-case pseudo-entry, as above.
+      if (dep.source_bb_id() == kPseudoEntryBlock ||
+          !pdom.StrictlyDominates(label, dep.source_bb_id())) {
+        edges.push_back(ControlDependence(dep.source_bb_id(), label,
+                                          dep.branch_target_bb_id()));
+      }
+    }
+  }
+}
+
+void ControlDependenceAnalysis::ComputeControlDependenceGraph(
+    const CFG& cfg, const PostDominatorAnalysis& pdom) {
+  ComputePostDominanceFrontiers(cfg, pdom);
+  ComputeForwardGraphFromReverse();
+}
+
+void ControlDependenceAnalysis::ComputeForwardGraphFromReverse() {
+  for (const auto& entry : reverse_nodes_) {
+    // Ensure an entry is created for each node.
+    forward_nodes_[entry.first];
+    for (const ControlDependence& dep : entry.second) {
+      forward_nodes_[dep.source_bb_id()].push_back(dep);
+    }
+  }
+}
+
+}  // namespace opt
+}  // namespace spvtools
diff --git a/third_party/vulkan-deps/spirv-tools/src/source/opt/control_dependence.h b/third_party/vulkan-deps/spirv-tools/src/source/opt/control_dependence.h
new file mode 100644
index 0000000..993f379
--- /dev/null
+++ b/third_party/vulkan-deps/spirv-tools/src/source/opt/control_dependence.h
@@ -0,0 +1,197 @@
+// Copyright (c) 2021 Google LLC.
+//
+// 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.
+
+#ifndef SOURCE_OPT_CONTROL_DEPENDENCE_H_
+#define SOURCE_OPT_CONTROL_DEPENDENCE_H_
+
+#include <algorithm>
+#include <cstdint>
+#include <functional>
+#include <ostream>
+#include <unordered_map>
+#include <vector>
+
+#include "source/opt/cfg.h"
+#include "source/opt/dominator_analysis.h"
+
+namespace spvtools {
+namespace opt {
+
+class ControlDependence {
+ public:
+  // The label of the source of this dependence, i.e. the block on which the
+  // target is dependent on.
+  // A |source_bb_id| of 0 represents an "entry" dependence, meaning that the
+  // execution of |target_bb_id| is only dependent on entry to the function.
+  uint32_t source_bb_id() const { return source_bb_id_; }
+  // The label of the target of this dependence, i.e. the block which is
+  // dependent on the source.
+  uint32_t target_bb_id() const { return target_bb_id_; }
+  // The label of the target of the *branch* for this dependence.
+  // Equal to the ID of the entry block for entry dependences.
+  //
+  // For example, for the partial CFG pictured below:
+  // 1 ---> 2 ---> 4 ---> 6
+  //  \      \            ^
+  //   \-> 3  \-> 5 -----/
+  // Block 6 is control dependent on block 1, but this dependence comes from the
+  // branch 1 -> 2, so in this case the branch target ID would be 2.
+  uint32_t branch_target_bb_id() const { return branch_target_bb_id_; }
+
+  // Create a direct control dependence from BB ID |source| to |target|.
+  ControlDependence(uint32_t source, uint32_t target)
+      : source_bb_id_(source),
+        target_bb_id_(target),
+        branch_target_bb_id_(target) {}
+  // Create a control dependence from BB ID |source| to |target| through the
+  // branch from |source| to |branch_target|.
+  ControlDependence(uint32_t source, uint32_t target, uint32_t branch_target)
+      : source_bb_id_(source),
+        target_bb_id_(target),
+        branch_target_bb_id_(branch_target) {}
+
+  // Gets the ID of the conditional value for the branch corresponding to this
+  // control dependence. This is the first input operand for both
+  // OpConditionalBranch and OpSwitch.
+  // Returns 0 for entry dependences.
+  uint32_t GetConditionID(const CFG& cfg) const;
+
+  bool operator==(const ControlDependence& other) const;
+  bool operator!=(const ControlDependence& other) const {
+    return !(*this == other);
+  }
+
+  // Comparison operators, ordered lexicographically. Total ordering.
+  bool operator<(const ControlDependence& other) const;
+  bool operator>(const ControlDependence& other) const { return other < *this; }
+  bool operator<=(const ControlDependence& other) const {
+    return !(*this > other);
+  }
+  bool operator>=(const ControlDependence& other) const {
+    return !(*this < other);
+  }
+
+ private:
+  uint32_t source_bb_id_;
+  uint32_t target_bb_id_;
+  uint32_t branch_target_bb_id_;
+};
+
+// Prints |dep| to |os| in a human-readable way. For example,
+//   1->2           (target_bb_id = branch_target_bb_id = 2)
+//   3->4 through 5 (target_bb_id = 4, branch_target_bb_id = 5)
+std::ostream& operator<<(std::ostream& os, const ControlDependence& dep);
+
+// Represents the control dependence graph. A basic block is control dependent
+// on another if the result of that block (e.g. the condition of a conditional
+// branch) influences whether it is executed or not. More formally, a block A is
+// control dependent on B iff:
+// 1. there exists a path from A to the exit node that does *not* go through B
+//    (i.e., A does not postdominate B), and
+// 2. there exists a path B -> b_1 -> ... -> b_n -> A such that A post-dominates
+//    all nodes b_i.
+class ControlDependenceAnalysis {
+ public:
+  // Map basic block labels to control dependencies/dependents.
+  // Not guaranteed to be in any particular order.
+  using ControlDependenceList = std::vector<ControlDependence>;
+  using ControlDependenceListMap =
+      std::unordered_map<uint32_t, ControlDependenceList>;
+
+  // 0, the label number for the pseudo entry block.
+  // All control dependences on the pseudo entry block are of type kEntry, and
+  // vice versa.
+  static constexpr uint32_t kPseudoEntryBlock = 0;
+
+  // Build the control dependence graph for the given control flow graph |cfg|
+  // and corresponding post-dominator analysis |pdom|.
+  void ComputeControlDependenceGraph(const CFG& cfg,
+                                     const PostDominatorAnalysis& pdom);
+
+  // Get the list of the nodes that depend on a block.
+  // Return value is not guaranteed to be in any particular order.
+  const ControlDependenceList& GetDependenceTargets(uint32_t block) const {
+    return forward_nodes_.at(block);
+  }
+
+  // Get the list of the nodes on which a block depends on.
+  // Return value is not guaranteed to be in any particular order.
+  const ControlDependenceList& GetDependenceSources(uint32_t block) const {
+    return reverse_nodes_.at(block);
+  }
+
+  // Runs the function |f| on each block label in the CDG. If any iteration
+  // returns false, immediately stops iteration and returns false. Otherwise
+  // returns true. Nodes are iterated in some undefined order, including the
+  // pseudo-entry block.
+  bool WhileEachBlockLabel(std::function<bool(uint32_t)> f) const {
+    for (const auto& entry : forward_nodes_) {
+      if (!f(entry.first)) {
+        return false;
+      }
+    }
+    return true;
+  }
+
+  // Runs the function |f| on each block label in the CDG. Nodes are iterated in
+  // some undefined order, including the pseudo-entry block.
+  void ForEachBlockLabel(std::function<void(uint32_t)> f) const {
+    WhileEachBlockLabel([&f](uint32_t label) {
+      f(label);
+      return true;
+    });
+  }
+
+  // Returns true if the block |id| exists in the control dependence graph.
+  // This can be false even if the block exists in the function when it is part
+  // of an infinite loop, since it is not part of the post-dominator tree.
+  bool HasBlock(uint32_t id) const { return forward_nodes_.count(id) > 0; }
+
+  // Returns true if block |a| is dependent on block |b|.
+  bool IsDependent(uint32_t a, uint32_t b) const {
+    if (!HasBlock(a)) return false;
+    // BBs tend to have more dependents (targets) than they are dependent on
+    // (sources), so search sources.
+    const ControlDependenceList& a_sources = GetDependenceSources(a);
+    return std::find_if(a_sources.begin(), a_sources.end(),
+                        [b](const ControlDependence& dep) {
+                          return dep.source_bb_id() == b;
+                        }) != a_sources.end();
+  }
+
+ private:
+  // Computes the post-dominance frontiers (i.e. the reverse CDG) for each node
+  // in the post-dominator tree. Only modifies reverse_nodes_; forward_nodes_ is
+  // not modified.
+  void ComputePostDominanceFrontiers(const CFG& cfg,
+                                     const PostDominatorAnalysis& pdom);
+  // Computes the post-dominance frontier for a specific node |pdom_node| in the
+  // post-dominator tree. Result is placed in reverse_nodes_[pdom_node.id()].
+  void ComputePostDominanceFrontierForNode(const CFG& cfg,
+                                           const PostDominatorAnalysis& pdom,
+                                           uint32_t function_entry,
+                                           const DominatorTreeNode& pdom_node);
+
+  // Computes the forward graph (forward_nodes_) from the reverse graph
+  // (reverse_nodes_).
+  void ComputeForwardGraphFromReverse();
+
+  ControlDependenceListMap forward_nodes_;
+  ControlDependenceListMap reverse_nodes_;
+};
+
+}  // namespace opt
+}  // namespace spvtools
+
+#endif  // SOURCE_OPT_CONTROL_DEPENDENCE_H_
diff --git a/third_party/vulkan-deps/spirv-tools/src/source/opt/convert_to_sampled_image_pass.cpp b/third_party/vulkan-deps/spirv-tools/src/source/opt/convert_to_sampled_image_pass.cpp
new file mode 100644
index 0000000..e84d357
--- /dev/null
+++ b/third_party/vulkan-deps/spirv-tools/src/source/opt/convert_to_sampled_image_pass.cpp
@@ -0,0 +1,437 @@
+// Copyright (c) 2021 Google LLC
+//
+// 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.
+
+#include "source/opt/convert_to_sampled_image_pass.h"
+
+#include <cctype>
+#include <cstring>
+#include <tuple>
+
+#include "source/opt/ir_builder.h"
+#include "source/util/make_unique.h"
+#include "source/util/parse_number.h"
+
+namespace spvtools {
+namespace opt {
+
+using VectorOfDescriptorSetAndBindingPairs =
+    std::vector<DescriptorSetAndBinding>;
+using DescriptorSetBindingToInstruction =
+    ConvertToSampledImagePass::DescriptorSetBindingToInstruction;
+
+namespace {
+
+using utils::ParseNumber;
+
+// Returns true if the given char is ':', '\0' or considered as blank space
+// (i.e.: '\n', '\r', '\v', '\t', '\f' and ' ').
+bool IsSeparator(char ch) {
+  return std::strchr(":\0", ch) || std::isspace(ch) != 0;
+}
+
+// Reads characters starting from |str| until it meets a separator. Parses a
+// number from the characters and stores it into |number|. Returns the pointer
+// to the separator if it succeeds. Otherwise, returns nullptr.
+const char* ParseNumberUntilSeparator(const char* str, uint32_t* number) {
+  const char* number_begin = str;
+  while (!IsSeparator(*str)) str++;
+  const char* number_end = str;
+  std::string number_in_str(number_begin, number_end - number_begin);
+  if (!utils::ParseNumber(number_in_str.c_str(), number)) {
+    // The descriptor set is not a valid uint32 number.
+    return nullptr;
+  }
+  return str;
+}
+
+// Returns id of the image type used for the sampled image type of
+// |sampled_image|.
+uint32_t GetImageTypeOfSampledImage(analysis::TypeManager* type_mgr,
+                                    Instruction* sampled_image) {
+  auto* sampled_image_type =
+      type_mgr->GetType(sampled_image->type_id())->AsSampledImage();
+  return type_mgr->GetTypeInstruction(sampled_image_type->image_type());
+}
+
+// Finds the instruction whose id is |inst_id|. Follows the operand of
+// OpCopyObject recursively if the opcode of the instruction is OpCopyObject
+// and returns the first instruction that does not have OpCopyObject as opcode.
+Instruction* GetNonCopyObjectDef(analysis::DefUseManager* def_use_mgr,
+                                 uint32_t inst_id) {
+  Instruction* inst = def_use_mgr->GetDef(inst_id);
+  while (inst->opcode() == SpvOpCopyObject) {
+    inst_id = inst->GetSingleWordInOperand(0u);
+    inst = def_use_mgr->GetDef(inst_id);
+  }
+  return inst;
+}
+
+}  // namespace
+
+bool ConvertToSampledImagePass::GetDescriptorSetBinding(
+    const Instruction& inst,
+    DescriptorSetAndBinding* descriptor_set_binding) const {
+  auto* decoration_manager = context()->get_decoration_mgr();
+  bool found_descriptor_set_to_convert = false;
+  bool found_binding_to_convert = false;
+  for (auto decorate :
+       decoration_manager->GetDecorationsFor(inst.result_id(), false)) {
+    uint32_t decoration = decorate->GetSingleWordInOperand(1u);
+    if (decoration == SpvDecorationDescriptorSet) {
+      if (found_descriptor_set_to_convert) {
+        assert(false && "A resource has two OpDecorate for the descriptor set");
+        return false;
+      }
+      descriptor_set_binding->descriptor_set =
+          decorate->GetSingleWordInOperand(2u);
+      found_descriptor_set_to_convert = true;
+    } else if (decoration == SpvDecorationBinding) {
+      if (found_binding_to_convert) {
+        assert(false && "A resource has two OpDecorate for the binding");
+        return false;
+      }
+      descriptor_set_binding->binding = decorate->GetSingleWordInOperand(2u);
+      found_binding_to_convert = true;
+    }
+  }
+  return found_descriptor_set_to_convert && found_binding_to_convert;
+}
+
+bool ConvertToSampledImagePass::ShouldResourceBeConverted(
+    const DescriptorSetAndBinding& descriptor_set_binding) const {
+  return descriptor_set_binding_pairs_.find(descriptor_set_binding) !=
+         descriptor_set_binding_pairs_.end();
+}
+
+const analysis::Type* ConvertToSampledImagePass::GetVariableType(
+    const Instruction& variable) const {
+  if (variable.opcode() != SpvOpVariable) return nullptr;
+  auto* type = context()->get_type_mgr()->GetType(variable.type_id());
+  auto* pointer_type = type->AsPointer();
+  if (!pointer_type) return nullptr;
+
+  return pointer_type->pointee_type();
+}
+
+SpvStorageClass ConvertToSampledImagePass::GetStorageClass(
+    const Instruction& variable) const {
+  assert(variable.opcode() == SpvOpVariable);
+  auto* type = context()->get_type_mgr()->GetType(variable.type_id());
+  auto* pointer_type = type->AsPointer();
+  if (!pointer_type) return SpvStorageClassMax;
+
+  return pointer_type->storage_class();
+}
+
+bool ConvertToSampledImagePass::CollectResourcesToConvert(
+    DescriptorSetBindingToInstruction* descriptor_set_binding_pair_to_sampler,
+    DescriptorSetBindingToInstruction* descriptor_set_binding_pair_to_image)
+    const {
+  for (auto& inst : context()->types_values()) {
+    const auto* variable_type = GetVariableType(inst);
+    if (variable_type == nullptr) continue;
+
+    DescriptorSetAndBinding descriptor_set_binding;
+    if (!GetDescriptorSetBinding(inst, &descriptor_set_binding)) continue;
+
+    if (!ShouldResourceBeConverted(descriptor_set_binding)) {
+      continue;
+    }
+
+    if (variable_type->AsImage()) {
+      if (!descriptor_set_binding_pair_to_image
+               ->insert({descriptor_set_binding, &inst})
+               .second) {
+        return false;
+      }
+    } else if (variable_type->AsSampler()) {
+      if (!descriptor_set_binding_pair_to_sampler
+               ->insert({descriptor_set_binding, &inst})
+               .second) {
+        return false;
+      }
+    }
+  }
+  return true;
+}
+
+Pass::Status ConvertToSampledImagePass::Process() {
+  Status status = Status::SuccessWithoutChange;
+
+  DescriptorSetBindingToInstruction descriptor_set_binding_pair_to_sampler,
+      descriptor_set_binding_pair_to_image;
+  if (!CollectResourcesToConvert(&descriptor_set_binding_pair_to_sampler,
+                                 &descriptor_set_binding_pair_to_image)) {
+    return Status::Failure;
+  }
+
+  for (auto& image : descriptor_set_binding_pair_to_image) {
+    status = CombineStatus(
+        status, UpdateImageVariableToSampledImage(image.second, image.first));
+    if (status == Status::Failure) {
+      return status;
+    }
+  }
+
+  for (const auto& sampler : descriptor_set_binding_pair_to_sampler) {
+    // Converting only a Sampler to Sampled Image is not allowed. It must have a
+    // corresponding image to combine the sampler with.
+    auto image_itr = descriptor_set_binding_pair_to_image.find(sampler.first);
+    if (image_itr == descriptor_set_binding_pair_to_image.end() ||
+        image_itr->second == nullptr) {
+      return Status::Failure;
+    }
+
+    status = CombineStatus(
+        status, CheckUsesOfSamplerVariable(sampler.second, image_itr->second));
+    if (status == Status::Failure) {
+      return status;
+    }
+  }
+
+  return status;
+}
+
+void ConvertToSampledImagePass::FindUses(const Instruction* inst,
+                                         std::vector<Instruction*>* uses,
+                                         uint32_t user_opcode) const {
+  auto* def_use_mgr = context()->get_def_use_mgr();
+  def_use_mgr->ForEachUser(inst, [uses, user_opcode, this](Instruction* user) {
+    if (user->opcode() == user_opcode) {
+      uses->push_back(user);
+    } else if (user->opcode() == SpvOpCopyObject) {
+      FindUses(user, uses, user_opcode);
+    }
+  });
+}
+
+void ConvertToSampledImagePass::FindUsesOfImage(
+    const Instruction* image, std::vector<Instruction*>* uses) const {
+  auto* def_use_mgr = context()->get_def_use_mgr();
+  def_use_mgr->ForEachUser(image, [uses, this](Instruction* user) {
+    switch (user->opcode()) {
+      case SpvOpImageFetch:
+      case SpvOpImageRead:
+      case SpvOpImageWrite:
+      case SpvOpImageQueryFormat:
+      case SpvOpImageQueryOrder:
+      case SpvOpImageQuerySizeLod:
+      case SpvOpImageQuerySize:
+      case SpvOpImageQueryLevels:
+      case SpvOpImageQuerySamples:
+      case SpvOpImageSparseFetch:
+        uses->push_back(user);
+      default:
+        break;
+    }
+    if (user->opcode() == SpvOpCopyObject) {
+      FindUsesOfImage(user, uses);
+    }
+  });
+}
+
+Instruction* ConvertToSampledImagePass::CreateImageExtraction(
+    Instruction* sampled_image) {
+  InstructionBuilder builder(
+      context(), sampled_image->NextNode(),
+      IRContext::kAnalysisDefUse | IRContext::kAnalysisInstrToBlockMapping);
+  return builder.AddUnaryOp(
+      GetImageTypeOfSampledImage(context()->get_type_mgr(), sampled_image),
+      SpvOpImage, sampled_image->result_id());
+}
+
+uint32_t ConvertToSampledImagePass::GetSampledImageTypeForImage(
+    Instruction* image_variable) {
+  const auto* variable_type = GetVariableType(*image_variable);
+  if (variable_type == nullptr) return 0;
+  const auto* image_type = variable_type->AsImage();
+  if (image_type == nullptr) return 0;
+
+  analysis::Image image_type_for_sampled_image(*image_type);
+  analysis::SampledImage sampled_image_type(&image_type_for_sampled_image);
+  return context()->get_type_mgr()->GetTypeInstruction(&sampled_image_type);
+}
+
+Instruction* ConvertToSampledImagePass::UpdateImageUses(
+    Instruction* sampled_image_load) {
+  std::vector<Instruction*> uses_of_load;
+  FindUsesOfImage(sampled_image_load, &uses_of_load);
+  if (uses_of_load.empty()) return nullptr;
+
+  auto* extracted_image = CreateImageExtraction(sampled_image_load);
+  for (auto* user : uses_of_load) {
+    user->SetInOperand(0, {extracted_image->result_id()});
+    context()->get_def_use_mgr()->AnalyzeInstUse(user);
+  }
+  return extracted_image;
+}
+
+bool ConvertToSampledImagePass::
+    IsSamplerOfSampledImageDecoratedByDescriptorSetBinding(
+        Instruction* sampled_image_inst,
+        const DescriptorSetAndBinding& descriptor_set_binding) {
+  auto* def_use_mgr = context()->get_def_use_mgr();
+  uint32_t sampler_id = sampled_image_inst->GetSingleWordInOperand(1u);
+  auto* sampler_load = def_use_mgr->GetDef(sampler_id);
+  if (sampler_load->opcode() != SpvOpLoad) return false;
+  auto* sampler = def_use_mgr->GetDef(sampler_load->GetSingleWordInOperand(0u));
+  DescriptorSetAndBinding sampler_descriptor_set_binding;
+  return GetDescriptorSetBinding(*sampler, &sampler_descriptor_set_binding) &&
+         sampler_descriptor_set_binding == descriptor_set_binding;
+}
+
+void ConvertToSampledImagePass::UpdateSampledImageUses(
+    Instruction* image_load, Instruction* image_extraction,
+    const DescriptorSetAndBinding& image_descriptor_set_binding) {
+  std::vector<Instruction*> sampled_image_users;
+  FindUses(image_load, &sampled_image_users, SpvOpSampledImage);
+
+  auto* def_use_mgr = context()->get_def_use_mgr();
+  for (auto* sampled_image_inst : sampled_image_users) {
+    if (IsSamplerOfSampledImageDecoratedByDescriptorSetBinding(
+            sampled_image_inst, image_descriptor_set_binding)) {
+      context()->ReplaceAllUsesWith(sampled_image_inst->result_id(),
+                                    image_load->result_id());
+      def_use_mgr->AnalyzeInstUse(image_load);
+      context()->KillInst(sampled_image_inst);
+    } else {
+      if (!image_extraction)
+        image_extraction = CreateImageExtraction(image_load);
+      sampled_image_inst->SetInOperand(0, {image_extraction->result_id()});
+      def_use_mgr->AnalyzeInstUse(sampled_image_inst);
+    }
+  }
+}
+
+void ConvertToSampledImagePass::MoveInstructionNextToType(Instruction* inst,
+                                                          uint32_t type_id) {
+  auto* type_inst = context()->get_def_use_mgr()->GetDef(type_id);
+  inst->SetResultType(type_id);
+  inst->RemoveFromList();
+  inst->InsertAfter(type_inst);
+}
+
+bool ConvertToSampledImagePass::ConvertImageVariableToSampledImage(
+    Instruction* image_variable, uint32_t sampled_image_type_id) {
+  auto* sampled_image_type =
+      context()->get_type_mgr()->GetType(sampled_image_type_id);
+  if (sampled_image_type == nullptr) return false;
+  auto storage_class = GetStorageClass(*image_variable);
+  if (storage_class == SpvStorageClassMax) return false;
+  analysis::Pointer sampled_image_pointer(sampled_image_type, storage_class);
+
+  // Make sure |image_variable| is behind its type i.e., avoid the forward
+  // reference.
+  uint32_t type_id =
+      context()->get_type_mgr()->GetTypeInstruction(&sampled_image_pointer);
+  MoveInstructionNextToType(image_variable, type_id);
+  return true;
+}
+
+Pass::Status ConvertToSampledImagePass::UpdateImageVariableToSampledImage(
+    Instruction* image_variable,
+    const DescriptorSetAndBinding& descriptor_set_binding) {
+  std::vector<Instruction*> image_variable_loads;
+  FindUses(image_variable, &image_variable_loads, SpvOpLoad);
+  if (image_variable_loads.empty()) return Status::SuccessWithoutChange;
+
+  const uint32_t sampled_image_type_id =
+      GetSampledImageTypeForImage(image_variable);
+  if (!sampled_image_type_id) return Status::Failure;
+
+  for (auto* load : image_variable_loads) {
+    load->SetResultType(sampled_image_type_id);
+    auto* image_extraction = UpdateImageUses(load);
+    UpdateSampledImageUses(load, image_extraction, descriptor_set_binding);
+  }
+
+  return ConvertImageVariableToSampledImage(image_variable,
+                                            sampled_image_type_id)
+             ? Status::SuccessWithChange
+             : Status::Failure;
+}
+
+bool ConvertToSampledImagePass::DoesSampledImageReferenceImage(
+    Instruction* sampled_image_inst, Instruction* image_variable) {
+  if (sampled_image_inst->opcode() != SpvOpSampledImage) return false;
+  auto* def_use_mgr = context()->get_def_use_mgr();
+  auto* image_load = GetNonCopyObjectDef(
+      def_use_mgr, sampled_image_inst->GetSingleWordInOperand(0u));
+  if (image_load->opcode() != SpvOpLoad) return false;
+  auto* image =
+      GetNonCopyObjectDef(def_use_mgr, image_load->GetSingleWordInOperand(0u));
+  return image->opcode() == SpvOpVariable &&
+         image->result_id() == image_variable->result_id();
+}
+
+Pass::Status ConvertToSampledImagePass::CheckUsesOfSamplerVariable(
+    const Instruction* sampler_variable,
+    Instruction* image_to_be_combined_with) {
+  if (image_to_be_combined_with == nullptr) return Status::Failure;
+
+  std::vector<Instruction*> sampler_variable_loads;
+  FindUses(sampler_variable, &sampler_variable_loads, SpvOpLoad);
+  for (auto* load : sampler_variable_loads) {
+    std::vector<Instruction*> sampled_image_users;
+    FindUses(load, &sampled_image_users, SpvOpSampledImage);
+    for (auto* sampled_image_inst : sampled_image_users) {
+      if (!DoesSampledImageReferenceImage(sampled_image_inst,
+                                          image_to_be_combined_with)) {
+        return Status::Failure;
+      }
+    }
+  }
+  return Status::SuccessWithoutChange;
+}
+
+std::unique_ptr<VectorOfDescriptorSetAndBindingPairs>
+ConvertToSampledImagePass::ParseDescriptorSetBindingPairsString(
+    const char* str) {
+  if (!str) return nullptr;
+
+  auto descriptor_set_binding_pairs =
+      MakeUnique<VectorOfDescriptorSetAndBindingPairs>();
+
+  while (std::isspace(*str)) str++;  // skip leading spaces.
+
+  // The parsing loop, break when points to the end.
+  while (*str) {
+    // Parse the descriptor set.
+    uint32_t descriptor_set = 0;
+    str = ParseNumberUntilSeparator(str, &descriptor_set);
+    if (str == nullptr) return nullptr;
+
+    // Find the ':', spaces between the descriptor set and the ':' are not
+    // allowed.
+    if (*str++ != ':') {
+      // ':' not found
+      return nullptr;
+    }
+
+    // Parse the binding.
+    uint32_t binding = 0;
+    str = ParseNumberUntilSeparator(str, &binding);
+    if (str == nullptr) return nullptr;
+
+    descriptor_set_binding_pairs->push_back({descriptor_set, binding});
+
+    // Skip trailing spaces.
+    while (std::isspace(*str)) str++;
+  }
+
+  return descriptor_set_binding_pairs;
+}
+
+}  // namespace opt
+}  // namespace spvtools
diff --git a/third_party/vulkan-deps/spirv-tools/src/source/opt/convert_to_sampled_image_pass.h b/third_party/vulkan-deps/spirv-tools/src/source/opt/convert_to_sampled_image_pass.h
new file mode 100644
index 0000000..d3938af
--- /dev/null
+++ b/third_party/vulkan-deps/spirv-tools/src/source/opt/convert_to_sampled_image_pass.h
@@ -0,0 +1,207 @@
+// Copyright (c) 2021 Google LLC
+//
+// 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.
+
+#ifndef SOURCE_OPT_CONVERT_TO_SAMPLED_IMAGE_PASS_H_
+#define SOURCE_OPT_CONVERT_TO_SAMPLED_IMAGE_PASS_H_
+
+#include <memory>
+#include <unordered_set>
+#include <utility>
+
+#include "source/opt/pass.h"
+#include "source/opt/types.h"
+
+namespace spvtools {
+namespace opt {
+
+// A struct for a pair of descriptor set and binding.
+struct DescriptorSetAndBinding {
+  uint32_t descriptor_set;
+  uint32_t binding;
+
+  bool operator==(const DescriptorSetAndBinding& descriptor_set_binding) const {
+    return descriptor_set_binding.descriptor_set == descriptor_set &&
+           descriptor_set_binding.binding == binding;
+  }
+};
+
+// See optimizer.hpp for documentation.
+class ConvertToSampledImagePass : public Pass {
+ public:
+  // Hashing functor for the pair of descriptor set and binding.
+  struct DescriptorSetAndBindingHash {
+    size_t operator()(
+        const DescriptorSetAndBinding& descriptor_set_binding) const {
+      return std::hash<uint32_t>()(descriptor_set_binding.descriptor_set) ^
+             std::hash<uint32_t>()(descriptor_set_binding.binding);
+    }
+  };
+
+  using SetOfDescriptorSetAndBindingPairs =
+      std::unordered_set<DescriptorSetAndBinding, DescriptorSetAndBindingHash>;
+  using DescriptorSetBindingToInstruction =
+      std::unordered_map<DescriptorSetAndBinding, Instruction*,
+                         DescriptorSetAndBindingHash>;
+
+  explicit ConvertToSampledImagePass(
+      const std::vector<DescriptorSetAndBinding>& descriptor_set_binding_pairs)
+      : descriptor_set_binding_pairs_(descriptor_set_binding_pairs.begin(),
+                                      descriptor_set_binding_pairs.end()) {}
+
+  const char* name() const override { return "convert-to-sampled-image"; }
+  Status Process() override;
+
+  // Parses the given null-terminated C string to get a vector of descriptor set
+  // and binding pairs. Returns a unique pointer to the vector of descriptor set
+  // and binding pairs built from the given |str| on success. Returns a nullptr
+  // if the given string is not valid for building the vector of pairs.
+  // A valid string for building the vector of pairs should follow the rule
+  // below:
+  //
+  //  "<descriptor set>:<binding> <descriptor set>:<binding> ..."
+  //  Example:
+  //    "3:5 2:1 0:4"
+  //
+  //  Entries are separated with blank spaces (i.e.:' ', '\n', '\r', '\t',
+  //  '\f', '\v'). Each entry corresponds to a descriptor set and binding pair.
+  //  Multiple spaces between, before or after entries are allowed. However,
+  //  spaces are not allowed within a descriptor set or binding.
+  //
+  //  In each entry, the descriptor set and binding are separated by ':'.
+  //  Missing ':' in any entry is invalid. And it is invalid to have blank
+  //  spaces in between the descriptor set and ':' or ':' and the binding.
+  //
+  //  <descriptor set>: the descriptor set.
+  //    The text must represent a valid uint32_t number.
+  //
+  //  <binding>: the binding.
+  //    The text must represent a valid uint32_t number.
+  static std::unique_ptr<std::vector<DescriptorSetAndBinding>>
+  ParseDescriptorSetBindingPairsString(const char* str);
+
+ private:
+  // Collects resources to convert to sampled image and saves them in
+  // |descriptor_set_binding_pair_to_sampler| if the resource is a sampler and
+  // saves them in |descriptor_set_binding_pair_to_image| if the resource is an
+  // image. Returns false if two samplers or two images have the same descriptor
+  // set and binding. Otherwise, returns true.
+  bool CollectResourcesToConvert(
+      DescriptorSetBindingToInstruction* descriptor_set_binding_pair_to_sampler,
+      DescriptorSetBindingToInstruction* descriptor_set_binding_pair_to_image)
+      const;
+
+  // Finds an OpDecorate with DescriptorSet decorating |inst| and another
+  // OpDecorate with Binding decorating |inst|. Stores the descriptor set and
+  // binding in |descriptor_set_binding|. Returns whether it successfully finds
+  // the descriptor set and binding or not.
+  bool GetDescriptorSetBinding(
+      const Instruction& inst,
+      DescriptorSetAndBinding* descriptor_set_binding) const;
+
+  // Returns whether |descriptor_set_binding| is a pair of a descriptor set
+  // and a binding that we have to convert resources with it to a sampled image
+  // or not.
+  bool ShouldResourceBeConverted(
+      const DescriptorSetAndBinding& descriptor_set_binding) const;
+
+  // Returns the pointee type of the type of variable |variable|. If |variable|
+  // is not an OpVariable instruction, just returns nullptr.
+  const analysis::Type* GetVariableType(const Instruction& variable) const;
+
+  // Returns the storage class of |variable|.
+  SpvStorageClass GetStorageClass(const Instruction& variable) const;
+
+  // Finds |inst|'s users whose opcode is |user_opcode| or users of OpCopyObject
+  // instructions of |inst| whose opcode is |user_opcode| and puts them in
+  // |uses|.
+  void FindUses(const Instruction* inst, std::vector<Instruction*>* uses,
+                uint32_t user_opcode) const;
+
+  // Finds OpImage* instructions using |image| or OpCopyObject instructions that
+  // copy |image| and puts them in |uses|.
+  void FindUsesOfImage(const Instruction* image,
+                       std::vector<Instruction*>* uses) const;
+
+  // Creates an OpImage instruction that extracts the image from the sampled
+  // image |sampled_image|.
+  Instruction* CreateImageExtraction(Instruction* sampled_image);
+
+  // Converts |image_variable| whose type is an image pointer to sampled image
+  // type. Updates users of |image_variable| accordingly. If some instructions
+  // e.g., OpImageRead use |image_variable| as an Image operand, creates an
+  // image extracted from the sampled image using OpImage and replace the Image
+  // operands of the users with the extracted image. If some OpSampledImage
+  // instructions use |image_variable| and sampler whose descriptor set and
+  // binding are the same with |image_variable|, just combines |image_variable|
+  // and the sampler to a sampled image.
+  Pass::Status UpdateImageVariableToSampledImage(
+      Instruction* image_variable,
+      const DescriptorSetAndBinding& descriptor_set_binding);
+
+  // Returns the id of type sampled image type whose image type is the one of
+  // |image_variable|.
+  uint32_t GetSampledImageTypeForImage(Instruction* image_variable);
+
+  // Moves |inst| next to the OpType* instruction with |type_id|.
+  void MoveInstructionNextToType(Instruction* inst, uint32_t type_id);
+
+  // Converts |image_variable| whose type is an image pointer to sampled image
+  // with the type id |sampled_image_type_id|. Returns whether it successfully
+  // converts the type of |image_variable| or not.
+  bool ConvertImageVariableToSampledImage(Instruction* image_variable,
+                                          uint32_t sampled_image_type_id);
+
+  // Replaces |sampled_image_load| instruction used by OpImage* with the image
+  // extracted from |sampled_image_load|. Returns the extracted image or nullptr
+  // if it does not have uses.
+  Instruction* UpdateImageUses(Instruction* sampled_image_load);
+
+  // Returns true if the sampler of |sampled_image_inst| is decorated by a
+  // descriptor set and a binding |descriptor_set_binding|.
+  bool IsSamplerOfSampledImageDecoratedByDescriptorSetBinding(
+      Instruction* sampled_image_inst,
+      const DescriptorSetAndBinding& descriptor_set_binding);
+
+  // Replaces OpSampledImage instructions using |image_load| with |image_load|
+  // if the sampler of the OpSampledImage instruction has descriptor set and
+  // binding |image_descriptor_set_binding|. Otherwise, replaces |image_load|
+  // with |image_extraction|.
+  void UpdateSampledImageUses(
+      Instruction* image_load, Instruction* image_extraction,
+      const DescriptorSetAndBinding& image_descriptor_set_binding);
+
+  // Checks the uses of |sampler_variable|. When a sampler is used by
+  // OpSampledImage instruction, the corresponding image must be
+  // |image_to_be_combined_with| that should be already converted to a sampled
+  // image by UpdateImageVariableToSampledImage() method.
+  Pass::Status CheckUsesOfSamplerVariable(
+      const Instruction* sampler_variable,
+      Instruction* image_to_be_combined_with);
+
+  // Returns true if Image operand of |sampled_image_inst| is the image of
+  // |image_variable|.
+  bool DoesSampledImageReferenceImage(Instruction* sampled_image_inst,
+                                      Instruction* image_variable);
+
+  // A set of pairs of descriptor set and binding. If an image and/or a sampler
+  // have a pair of descriptor set and binding that is an element of
+  // |descriptor_set_binding_pairs_|, they/it will be converted to a sampled
+  // image by this pass.
+  const SetOfDescriptorSetAndBindingPairs descriptor_set_binding_pairs_;
+};
+
+}  // namespace opt
+}  // namespace spvtools
+
+#endif  // SOURCE_OPT_CONVERT_TO_SAMPLED_IMAGE_PASS_H_
diff --git a/third_party/vulkan-deps/spirv-tools/src/source/opt/copy_prop_arrays.cpp b/third_party/vulkan-deps/spirv-tools/src/source/opt/copy_prop_arrays.cpp
index 67a97b6..f505d8a 100644
--- a/third_party/vulkan-deps/spirv-tools/src/source/opt/copy_prop_arrays.cpp
+++ b/third_party/vulkan-deps/spirv-tools/src/source/opt/copy_prop_arrays.cpp
@@ -29,10 +29,10 @@
 const uint32_t kTypePointerStorageClassInIdx = 0;
 const uint32_t kTypePointerPointeeInIdx = 1;
 
-bool IsOpenCL100DebugDeclareOrValue(Instruction* di) {
-  auto dbg_opcode = di->GetOpenCL100DebugOpcode();
-  return dbg_opcode == OpenCLDebugInfo100DebugDeclare ||
-         dbg_opcode == OpenCLDebugInfo100DebugValue;
+bool IsDebugDeclareOrValue(Instruction* di) {
+  auto dbg_opcode = di->GetCommonDebugOpcode();
+  return dbg_opcode == CommonDebugInfoDebugDeclare ||
+         dbg_opcode == CommonDebugInfoDebugValue;
 }
 
 }  // namespace
@@ -194,7 +194,7 @@
           return ptr_inst->opcode() == SpvOpVariable &&
                  store_inst->GetSingleWordInOperand(kStorePointerInOperand) ==
                      ptr_inst->result_id();
-        } else if (IsOpenCL100DebugDeclareOrValue(use)) {
+        } else if (IsDebugDeclareOrValue(use)) {
           return true;
         }
         // Some other instruction.  Be conservative.
@@ -500,7 +500,7 @@
                                                        const_mgr,
                                                        type](Instruction* use,
                                                              uint32_t) {
-    if (IsOpenCL100DebugDeclareOrValue(use)) return true;
+    if (IsDebugDeclareOrValue(use)) return true;
 
     switch (use->opcode()) {
       case SpvOpLoad: {
@@ -592,9 +592,9 @@
     Instruction* use = pair.first;
     uint32_t index = pair.second;
 
-    if (use->IsOpenCL100DebugInstr()) {
-      switch (use->GetOpenCL100DebugOpcode()) {
-        case OpenCLDebugInfo100DebugDeclare: {
+    if (use->IsCommonDebugInstr()) {
+      switch (use->GetCommonDebugOpcode()) {
+        case CommonDebugInfoDebugDeclare: {
           if (new_ptr_inst->opcode() == SpvOpVariable ||
               new_ptr_inst->opcode() == SpvOpFunctionParameter) {
             context()->ForgetUses(use);
@@ -608,9 +608,8 @@
             context()->ForgetUses(use);
 
             // Change DebugDeclare to DebugValue.
-            use->SetOperand(
-                index - 2,
-                {static_cast<uint32_t>(OpenCLDebugInfo100DebugValue)});
+            use->SetOperand(index - 2,
+                            {static_cast<uint32_t>(CommonDebugInfoDebugValue)});
             use->SetOperand(index, {new_ptr_inst->result_id()});
 
             // Add Deref operation.
@@ -625,7 +624,7 @@
           }
           break;
         }
-        case OpenCLDebugInfo100DebugValue:
+        case CommonDebugInfoDebugValue:
           context()->ForgetUses(use);
           use->SetOperand(index, {new_ptr_inst->result_id()});
           context()->AnalyzeUses(use);
diff --git a/third_party/vulkan-deps/spirv-tools/src/source/opt/dataflow.cpp b/third_party/vulkan-deps/spirv-tools/src/source/opt/dataflow.cpp
new file mode 100644
index 0000000..c91fad0
--- /dev/null
+++ b/third_party/vulkan-deps/spirv-tools/src/source/opt/dataflow.cpp
@@ -0,0 +1,91 @@
+// Copyright (c) 2021 Google LLC.
+//
+// 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.
+
+#include "source/opt/dataflow.h"
+
+#include <algorithm>
+#include <cstdint>
+
+namespace spvtools {
+namespace opt {
+
+bool DataFlowAnalysis::Enqueue(Instruction* inst) {
+  bool& is_enqueued = on_worklist_[inst];
+  if (is_enqueued) return false;
+  is_enqueued = true;
+  worklist_.push(inst);
+  return true;
+}
+
+DataFlowAnalysis::VisitResult DataFlowAnalysis::RunOnce(
+    Function* function, bool is_first_iteration) {
+  InitializeWorklist(function, is_first_iteration);
+  VisitResult ret = VisitResult::kResultFixed;
+  while (!worklist_.empty()) {
+    Instruction* top = worklist_.front();
+    worklist_.pop();
+    on_worklist_[top] = false;
+    VisitResult result = Visit(top);
+    if (result == VisitResult::kResultChanged) {
+      EnqueueSuccessors(top);
+      ret = VisitResult::kResultChanged;
+    }
+  }
+  return ret;
+}
+
+void DataFlowAnalysis::Run(Function* function) {
+  VisitResult result = RunOnce(function, true);
+  while (result == VisitResult::kResultChanged) {
+    result = RunOnce(function, false);
+  }
+}
+
+void ForwardDataFlowAnalysis::InitializeWorklist(Function* function,
+                                                 bool /*is_first_iteration*/) {
+  context().cfg()->ForEachBlockInReversePostOrder(
+      function->entry().get(), [this](BasicBlock* bb) {
+        if (label_position_ == LabelPosition::kLabelsOnly) {
+          Enqueue(bb->GetLabelInst());
+          return;
+        }
+        if (label_position_ == LabelPosition::kLabelsAtBeginning) {
+          Enqueue(bb->GetLabelInst());
+        }
+        for (Instruction& inst : *bb) {
+          Enqueue(&inst);
+        }
+        if (label_position_ == LabelPosition::kLabelsAtEnd) {
+          Enqueue(bb->GetLabelInst());
+        }
+      });
+}
+
+void ForwardDataFlowAnalysis::EnqueueUsers(Instruction* inst) {
+  context().get_def_use_mgr()->ForEachUser(
+      inst, [this](Instruction* user) { Enqueue(user); });
+}
+
+void ForwardDataFlowAnalysis::EnqueueBlockSuccessors(Instruction* inst) {
+  if (inst->opcode() != SpvOpLabel) return;
+  context()
+      .cfg()
+      ->block(inst->result_id())
+      ->ForEachSuccessorLabel([this](uint32_t* label) {
+        Enqueue(context().cfg()->block(*label)->GetLabelInst());
+      });
+}
+
+}  // namespace opt
+}  // namespace spvtools
diff --git a/third_party/vulkan-deps/spirv-tools/src/source/opt/dataflow.h b/third_party/vulkan-deps/spirv-tools/src/source/opt/dataflow.h
new file mode 100644
index 0000000..be07415
--- /dev/null
+++ b/third_party/vulkan-deps/spirv-tools/src/source/opt/dataflow.h
@@ -0,0 +1,148 @@
+// Copyright (c) 2021 Google LLC.
+//
+// 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.
+
+#ifndef SOURCE_OPT_DATAFLOW_H_
+#define SOURCE_OPT_DATAFLOW_H_
+
+#include <queue>
+#include <unordered_map>
+#include <vector>
+
+#include "source/opt/instruction.h"
+#include "source/opt/ir_context.h"
+
+namespace spvtools {
+namespace opt {
+
+// Generic data-flow analysis.
+// Maintains a worklist of instructions to process and processes them in a
+// specified order. See also ForwardDataFlowAnalysis, which is specialized for
+// forward data-flow analysis.
+class DataFlowAnalysis {
+ public:
+  // The result of a |Visit| operation on an instruction.
+  // This is used to determine when analysis has reached a fixpoint.
+  enum class VisitResult {
+    // The analysis result for this instruction has changed.
+    // This means that any instructions that depend on it (its successors) must
+    // be recomputed.
+    kResultChanged,
+    // The analysis result for this instruction has not changed.
+    // When all visit operations return |kResultFixed|, the analysis has reached
+    // a fixpoint (converged).
+    kResultFixed,
+  };
+
+  virtual ~DataFlowAnalysis() {}
+
+  // Run this analysis on a given function.
+  // For analyses which work interprocedurally, |function| may be ignored.
+  void Run(Function* function);
+
+ protected:
+  DataFlowAnalysis(IRContext& context) : context_(context) {}
+
+  // Initialize the worklist for a given function.
+  // |is_first_iteration| is true on the first call to |Run| and false
+  // afterwards. All subsequent runs are only necessary to check if the analysis
+  // has converged; if |EnqueueSuccessors| is complete, |InitializeWorklist|
+  // should do nothing after the first iteration.
+  virtual void InitializeWorklist(Function* function,
+                                  bool is_first_iteration) = 0;
+
+  // Enqueues the successors (instructions which use the analysis result) of
+  // |inst|. This is not required to be complete, but convergence is faster when
+  // it is. This is called whenever |Visit| returns |kResultChanged|.
+  virtual void EnqueueSuccessors(Instruction* inst) = 0;
+
+  // Visits the given instruction, recomputing the analysis result. This is
+  // called once per instruction queued in |InitializeWorklist| and afterward
+  // when a predecessor is changed, through |EnqueueSuccessors|.
+  virtual VisitResult Visit(Instruction* inst) = 0;
+
+  // Enqueues the given instruction to be visited. Ignored if already in the
+  // worklist.
+  bool Enqueue(Instruction* inst);
+
+  IRContext& context() { return context_; }
+
+ private:
+  // Runs one pass, calling |InitializeWorklist| and then iterating through the
+  // worklist until all fixed.
+  VisitResult RunOnce(Function* function, bool is_first_iteration);
+
+  IRContext& context_;
+  std::unordered_map<Instruction*, bool> on_worklist_;
+  // The worklist, which contains the list of instructions to be visited.
+  //
+  // The choice of data structure was influenced by the data in "Iterative
+  // Data-flow Analysis, Revisited" (Cooper et al, 2002).
+  // https://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.125.1549&rep=rep1&type=pdf
+  // The paper shows that the overall performance benefit of a priority queue
+  // over a regular queue or stack is relatively small (or negative).
+  //
+  // A queue has the advantage that nodes are visited in the same order they are
+  // enqueued, which relieves the analysis from inserting nodes "backwards", for
+  // example in worklist initialization. Also, as the paper claims that sorting
+  // successors does not improve runtime, we can use a single queue which is
+  // modified during iteration.
+  std::queue<Instruction*> worklist_;
+};
+
+// A generic data flow analysis, specialized for forward analysis.
+class ForwardDataFlowAnalysis : public DataFlowAnalysis {
+ public:
+  // Indicates where labels should be in the worklist RPO ordering.
+  enum class LabelPosition {
+    // Labels should be placed at the beginning of their blocks.
+    kLabelsAtBeginning,
+    // Labels should be placed at the end of their blocks.
+    kLabelsAtEnd,
+    // Labels should not be in the worklist.
+    kNoLabels,
+    // Only labels should be placed in the worklist.
+    kLabelsOnly,
+  };
+
+  ForwardDataFlowAnalysis(IRContext& context, LabelPosition label_position)
+      : DataFlowAnalysis(context), label_position_(label_position) {}
+
+ protected:
+  // Initializes the worklist in reverse postorder, regardless of
+  // |is_first_iteration|. Labels are placed according to the label position
+  // specified in the constructor.
+  void InitializeWorklist(Function* function, bool is_first_iteration) override;
+
+  // Enqueues the users and block successors of the given instruction.
+  // See |EnqueueUsers| and |EnqueueBlockSuccessors|.
+  void EnqueueSuccessors(Instruction* inst) override {
+    EnqueueUsers(inst);
+    EnqueueBlockSuccessors(inst);
+  }
+
+  // Enqueues the users of the given instruction.
+  void EnqueueUsers(Instruction* inst);
+
+  // Enqueues the labels of the successors of the block corresponding to the
+  // given label instruction. Does nothing for other instructions.
+  void EnqueueBlockSuccessors(Instruction* inst);
+
+ private:
+  LabelPosition label_position_;
+};
+
+}  // namespace opt
+}  // namespace spvtools
+
+#endif  // SOURCE_OPT_DATAFLOW_H_
diff --git a/third_party/vulkan-deps/spirv-tools/src/source/opt/dead_insert_elim_pass.cpp b/third_party/vulkan-deps/spirv-tools/src/source/opt/dead_insert_elim_pass.cpp
index 46f4f12..fb5c163 100644
--- a/third_party/vulkan-deps/spirv-tools/src/source/opt/dead_insert_elim_pass.cpp
+++ b/third_party/vulkan-deps/spirv-tools/src/source/opt/dead_insert_elim_pass.cpp
@@ -196,7 +196,7 @@
       }
       const uint32_t id = ii->result_id();
       get_def_use_mgr()->ForEachUser(id, [&ii, this](Instruction* user) {
-        if (user->IsOpenCL100DebugInstr()) return;
+        if (user->IsCommonDebugInstr()) return;
         switch (user->opcode()) {
           case SpvOpCompositeInsert:
           case SpvOpPhi:
diff --git a/third_party/vulkan-deps/spirv-tools/src/source/opt/debug_info_manager.cpp b/third_party/vulkan-deps/spirv-tools/src/source/opt/debug_info_manager.cpp
index e782641..2e8e132 100644
--- a/third_party/vulkan-deps/spirv-tools/src/source/opt/debug_info_manager.cpp
+++ b/third_party/vulkan-deps/spirv-tools/src/source/opt/debug_info_manager.cpp
@@ -18,12 +18,15 @@
 
 #include "source/opt/ir_context.h"
 
-// Constants for OpenCL.DebugInfo.100 extension instructions.
+// Constants for OpenCL.DebugInfo.100 & NonSemantic.Vulkan.DebugInfo.100
+// extension instructions.
 
 static const uint32_t kOpLineOperandLineIndex = 1;
 static const uint32_t kLineOperandIndexDebugFunction = 7;
 static const uint32_t kLineOperandIndexDebugLexicalBlock = 5;
 static const uint32_t kDebugFunctionOperandFunctionIndex = 13;
+static const uint32_t kDebugFunctionDefinitionOperandDebugFunctionIndex = 4;
+static const uint32_t kDebugFunctionDefinitionOperandOpFunctionIndex = 5;
 static const uint32_t kDebugFunctionOperandParentIndex = 9;
 static const uint32_t kDebugTypeCompositeOperandParentIndex = 9;
 static const uint32_t kDebugLexicalBlockOperandParentIndex = 7;
@@ -46,8 +49,8 @@
 
 void SetInlinedOperand(Instruction* dbg_inlined_at, uint32_t inlined_operand) {
   assert(dbg_inlined_at);
-  assert(dbg_inlined_at->GetOpenCL100DebugOpcode() ==
-         OpenCLDebugInfo100DebugInlinedAt);
+  assert(dbg_inlined_at->GetCommonDebugOpcode() ==
+         CommonDebugInfoDebugInlinedAt);
   if (dbg_inlined_at->NumOperands() <= kDebugInlinedAtOperandInlinedIndex) {
     dbg_inlined_at->AddOperand(
         {spv_operand_type_t::SPV_OPERAND_TYPE_ID, {inlined_operand}});
@@ -59,8 +62,8 @@
 
 uint32_t GetInlinedOperand(Instruction* dbg_inlined_at) {
   assert(dbg_inlined_at);
-  assert(dbg_inlined_at->GetOpenCL100DebugOpcode() ==
-         OpenCLDebugInfo100DebugInlinedAt);
+  assert(dbg_inlined_at->GetCommonDebugOpcode() ==
+         CommonDebugInfoDebugInlinedAt);
   if (dbg_inlined_at->NumOperands() <= kDebugInlinedAtOperandInlinedIndex)
     return kNoInlinedAt;
   return dbg_inlined_at->GetSingleWordOperand(
@@ -68,8 +71,7 @@
 }
 
 bool IsEmptyDebugExpression(Instruction* instr) {
-  return instr->GetOpenCL100DebugOpcode() ==
-             OpenCLDebugInfo100DebugExpression &&
+  return (instr->GetCommonDebugOpcode() == CommonDebugInfoDebugExpression) &&
          instr->NumOperands() == kDebugExpressOperandOperationIndex;
 }
 
@@ -79,43 +81,63 @@
   AnalyzeDebugInsts(*c->module());
 }
 
+uint32_t DebugInfoManager::GetDbgSetImportId() {
+  uint32_t setId =
+      context()->get_feature_mgr()->GetExtInstImportId_OpenCL100DebugInfo();
+  if (setId == 0) {
+    setId =
+        context()->get_feature_mgr()->GetExtInstImportId_Vulkan100DebugInfo();
+  }
+  return setId;
+}
+
 Instruction* DebugInfoManager::GetDbgInst(uint32_t id) {
   auto dbg_inst_it = id_to_dbg_inst_.find(id);
   return dbg_inst_it == id_to_dbg_inst_.end() ? nullptr : dbg_inst_it->second;
 }
 
 void DebugInfoManager::RegisterDbgInst(Instruction* inst) {
-  assert(
-      inst->NumInOperands() != 0 &&
-      context()->get_feature_mgr()->GetExtInstImportId_OpenCL100DebugInfo() ==
-          inst->GetInOperand(0).words[0] &&
-      "Given instruction is not a debug instruction");
+  assert(inst->NumInOperands() != 0 &&
+         (GetDbgSetImportId() == inst->GetInOperand(0).words[0]) &&
+         "Given instruction is not a debug instruction");
   id_to_dbg_inst_[inst->result_id()] = inst;
 }
 
 void DebugInfoManager::RegisterDbgFunction(Instruction* inst) {
-  assert(inst->GetOpenCL100DebugOpcode() == OpenCLDebugInfo100DebugFunction &&
-         "inst is not a DebugFunction");
-  auto fn_id = inst->GetSingleWordOperand(kDebugFunctionOperandFunctionIndex);
-  // Do not register function that has been optimized away
-  auto fn_inst = GetDbgInst(fn_id);
-  if (fn_inst != nullptr) {
-    assert(GetDbgInst(fn_id)->GetOpenCL100DebugOpcode() ==
-           OpenCLDebugInfo100DebugInfoNone);
-    return;
+  if (inst->GetOpenCL100DebugOpcode() == OpenCLDebugInfo100DebugFunction) {
+    auto fn_id = inst->GetSingleWordOperand(kDebugFunctionOperandFunctionIndex);
+    // Do not register function that has been optimized away.
+    auto fn_inst = GetDbgInst(fn_id);
+    if (fn_inst != nullptr) {
+      assert(GetDbgInst(fn_id)->GetOpenCL100DebugOpcode() ==
+             OpenCLDebugInfo100DebugInfoNone);
+      return;
+    }
+    assert(
+        fn_id_to_dbg_fn_.find(fn_id) == fn_id_to_dbg_fn_.end() &&
+        "Register DebugFunction for a function that already has DebugFunction");
+    fn_id_to_dbg_fn_[fn_id] = inst;
+  } else if (inst->GetVulkan100DebugOpcode() ==
+             NonSemanticVulkanDebugInfo100DebugFunctionDefinition) {
+    auto fn_id = inst->GetSingleWordOperand(
+        kDebugFunctionDefinitionOperandOpFunctionIndex);
+    auto fn_inst = GetDbgInst(inst->GetSingleWordOperand(
+        kDebugFunctionDefinitionOperandDebugFunctionIndex));
+    assert(fn_inst && fn_inst->GetVulkan100DebugOpcode() ==
+                          NonSemanticVulkanDebugInfo100DebugFunction);
+    assert(fn_id_to_dbg_fn_.find(fn_id) == fn_id_to_dbg_fn_.end() &&
+           "Register DebugFunctionDefinition for a function that already has "
+           "DebugFunctionDefinition");
+    fn_id_to_dbg_fn_[fn_id] = fn_inst;
+  } else {
+    assert(false && "inst is not a DebugFunction");
   }
-  assert(
-      fn_id_to_dbg_fn_.find(fn_id) == fn_id_to_dbg_fn_.end() &&
-      "Register DebugFunction for a function that already has DebugFunction");
-  fn_id_to_dbg_fn_[fn_id] = inst;
 }
 
 void DebugInfoManager::RegisterDbgDeclare(uint32_t var_id,
                                           Instruction* dbg_declare) {
-  assert(dbg_declare->GetOpenCL100DebugOpcode() ==
-             OpenCLDebugInfo100DebugDeclare ||
-         dbg_declare->GetOpenCL100DebugOpcode() ==
-             OpenCLDebugInfo100DebugValue);
+  assert(dbg_declare->GetCommonDebugOpcode() == CommonDebugInfoDebugDeclare ||
+         dbg_declare->GetCommonDebugOpcode() == CommonDebugInfoDebugValue);
   auto dbg_decl_itr = var_id_to_dbg_decl_.find(var_id);
   if (dbg_decl_itr == var_id_to_dbg_decl_.end()) {
     var_id_to_dbg_decl_[var_id] = {dbg_declare};
@@ -126,27 +148,36 @@
 
 uint32_t DebugInfoManager::CreateDebugInlinedAt(const Instruction* line,
                                                 const DebugScope& scope) {
-  if (context()->get_feature_mgr()->GetExtInstImportId_OpenCL100DebugInfo() ==
-      0)
-    return kNoInlinedAt;
+  uint32_t setId = GetDbgSetImportId();
+
+  if (setId == 0) return kNoInlinedAt;
+
+  spv_operand_type_t line_number_type =
+      spv_operand_type_t::SPV_OPERAND_TYPE_LITERAL_INTEGER;
+
+  // In NonSemantic.Vulkan.DebugInfo.100, all constants are IDs of OpConstant,
+  // not literals.
+  if (setId ==
+      context()->get_feature_mgr()->GetExtInstImportId_Vulkan100DebugInfo())
+    line_number_type = spv_operand_type_t::SPV_OPERAND_TYPE_ID;
 
   uint32_t line_number = 0;
   if (line == nullptr) {
     auto* lexical_scope_inst = GetDbgInst(scope.GetLexicalScope());
     if (lexical_scope_inst == nullptr) return kNoInlinedAt;
-    OpenCLDebugInfo100Instructions debug_opcode =
-        lexical_scope_inst->GetOpenCL100DebugOpcode();
+    CommonDebugInfoInstructions debug_opcode =
+        lexical_scope_inst->GetCommonDebugOpcode();
     switch (debug_opcode) {
-      case OpenCLDebugInfo100DebugFunction:
+      case CommonDebugInfoDebugFunction:
         line_number = lexical_scope_inst->GetSingleWordOperand(
             kLineOperandIndexDebugFunction);
         break;
-      case OpenCLDebugInfo100DebugLexicalBlock:
+      case CommonDebugInfoDebugLexicalBlock:
         line_number = lexical_scope_inst->GetSingleWordOperand(
             kLineOperandIndexDebugLexicalBlock);
         break;
-      case OpenCLDebugInfo100DebugTypeComposite:
-      case OpenCLDebugInfo100DebugCompilationUnit:
+      case CommonDebugInfoDebugTypeComposite:
+      case CommonDebugInfoDebugCompilationUnit:
         assert(false &&
                "DebugTypeComposite and DebugCompilationUnit are lexical "
                "scopes, but we inline functions into a function or a block "
@@ -161,6 +192,13 @@
     }
   } else {
     line_number = line->GetSingleWordOperand(kOpLineOperandLineIndex);
+
+    // If we need the line number as an ID, generate that constant now.
+    if (line_number_type == spv_operand_type_t::SPV_OPERAND_TYPE_ID) {
+      uint32_t line_id =
+          context()->get_constant_mgr()->GetUIntConst(line_number);
+      line_number = line_id;
+    }
   }
 
   uint32_t result_id = context()->TakeNextId();
@@ -168,13 +206,10 @@
       context(), SpvOpExtInst, context()->get_type_mgr()->GetVoidTypeId(),
       result_id,
       {
-          {spv_operand_type_t::SPV_OPERAND_TYPE_ID,
-           {context()
-                ->get_feature_mgr()
-                ->GetExtInstImportId_OpenCL100DebugInfo()}},
+          {spv_operand_type_t::SPV_OPERAND_TYPE_ID, {setId}},
           {spv_operand_type_t::SPV_OPERAND_TYPE_EXTENSION_INSTRUCTION_NUMBER,
-           {static_cast<uint32_t>(OpenCLDebugInfo100DebugInlinedAt)}},
-          {spv_operand_type_t::SPV_OPERAND_TYPE_LITERAL_INTEGER, {line_number}},
+           {static_cast<uint32_t>(CommonDebugInfoDebugInlinedAt)}},
+          {line_number_type, {line_number}},
           {spv_operand_type_t::SPV_OPERAND_TYPE_ID, {scope.GetLexicalScope()}},
       }));
   // |scope| already has DebugInlinedAt. We put the existing DebugInlinedAt
@@ -257,19 +292,34 @@
   if (deref_operation_ != nullptr) return deref_operation_;
 
   uint32_t result_id = context()->TakeNextId();
-  std::unique_ptr<Instruction> deref_operation(new Instruction(
-      context(), SpvOpExtInst, context()->get_type_mgr()->GetVoidTypeId(),
-      result_id,
-      {
-          {SPV_OPERAND_TYPE_ID,
-           {context()
-                ->get_feature_mgr()
-                ->GetExtInstImportId_OpenCL100DebugInfo()}},
-          {SPV_OPERAND_TYPE_EXTENSION_INSTRUCTION_NUMBER,
-           {static_cast<uint32_t>(OpenCLDebugInfo100DebugOperation)}},
-          {SPV_OPERAND_TYPE_CLDEBUG100_DEBUG_OPERATION,
-           {static_cast<uint32_t>(OpenCLDebugInfo100Deref)}},
-      }));
+  std::unique_ptr<Instruction> deref_operation;
+
+  if (context()->get_feature_mgr()->GetExtInstImportId_OpenCL100DebugInfo()) {
+    deref_operation = std::unique_ptr<Instruction>(new Instruction(
+        context(), SpvOpExtInst, context()->get_type_mgr()->GetVoidTypeId(),
+        result_id,
+        {
+            {SPV_OPERAND_TYPE_ID, {GetDbgSetImportId()}},
+            {SPV_OPERAND_TYPE_EXTENSION_INSTRUCTION_NUMBER,
+             {static_cast<uint32_t>(OpenCLDebugInfo100DebugOperation)}},
+            {SPV_OPERAND_TYPE_CLDEBUG100_DEBUG_OPERATION,
+             {static_cast<uint32_t>(OpenCLDebugInfo100Deref)}},
+        }));
+  } else {
+    uint32_t deref_id = context()->get_constant_mgr()->GetUIntConst(
+        NonSemanticVulkanDebugInfo100Deref);
+
+    deref_operation = std::unique_ptr<Instruction>(
+        new Instruction(context(), SpvOpExtInst,
+                        context()->get_type_mgr()->GetVoidTypeId(), result_id,
+                        {
+                            {SPV_OPERAND_TYPE_ID, {GetDbgSetImportId()}},
+                            {SPV_OPERAND_TYPE_EXTENSION_INSTRUCTION_NUMBER,
+                             {static_cast<uint32_t>(
+                                 NonSemanticVulkanDebugInfo100DebugOperation)}},
+                            {SPV_OPERAND_TYPE_ID, {deref_id}},
+                        }));
+  }
 
   // Add to the front of |ext_inst_debuginfo_|.
   deref_operation_ =
@@ -283,8 +333,7 @@
 }
 
 Instruction* DebugInfoManager::DerefDebugExpression(Instruction* dbg_expr) {
-  assert(dbg_expr->GetOpenCL100DebugOpcode() ==
-         OpenCLDebugInfo100DebugExpression);
+  assert(dbg_expr->GetCommonDebugOpcode() == CommonDebugInfoDebugExpression);
   std::unique_ptr<Instruction> deref_expr(dbg_expr->Clone(context()));
   deref_expr->SetResultId(context()->TakeNextId());
   deref_expr->InsertOperand(
@@ -306,12 +355,9 @@
       context(), SpvOpExtInst, context()->get_type_mgr()->GetVoidTypeId(),
       result_id,
       {
-          {spv_operand_type_t::SPV_OPERAND_TYPE_ID,
-           {context()
-                ->get_feature_mgr()
-                ->GetExtInstImportId_OpenCL100DebugInfo()}},
+          {spv_operand_type_t::SPV_OPERAND_TYPE_ID, {GetDbgSetImportId()}},
           {spv_operand_type_t::SPV_OPERAND_TYPE_EXTENSION_INSTRUCTION_NUMBER,
-           {static_cast<uint32_t>(OpenCLDebugInfo100DebugInfoNone)}},
+           {static_cast<uint32_t>(CommonDebugInfoDebugInfoNone)}},
       }));
 
   // Add to the front of |ext_inst_debuginfo_|.
@@ -333,12 +379,9 @@
       context(), SpvOpExtInst, context()->get_type_mgr()->GetVoidTypeId(),
       result_id,
       {
-          {spv_operand_type_t::SPV_OPERAND_TYPE_ID,
-           {context()
-                ->get_feature_mgr()
-                ->GetExtInstImportId_OpenCL100DebugInfo()}},
+          {spv_operand_type_t::SPV_OPERAND_TYPE_ID, {GetDbgSetImportId()}},
           {spv_operand_type_t::SPV_OPERAND_TYPE_EXTENSION_INSTRUCTION_NUMBER,
-           {static_cast<uint32_t>(OpenCLDebugInfo100DebugExpression)}},
+           {static_cast<uint32_t>(CommonDebugInfoDebugExpression)}},
       }));
 
   // Add to the front of |ext_inst_debuginfo_|.
@@ -355,8 +398,7 @@
 Instruction* DebugInfoManager::GetDebugInlinedAt(uint32_t dbg_inlined_at_id) {
   auto* inlined_at = GetDbgInst(dbg_inlined_at_id);
   if (inlined_at == nullptr) return nullptr;
-  if (inlined_at->GetOpenCL100DebugOpcode() !=
-      OpenCLDebugInfo100DebugInlinedAt) {
+  if (inlined_at->GetCommonDebugOpcode() != CommonDebugInfoDebugInlinedAt) {
     return nullptr;
   }
   return inlined_at;
@@ -403,23 +445,23 @@
 uint32_t DebugInfoManager::GetParentScope(uint32_t child_scope) {
   auto dbg_scope_itr = id_to_dbg_inst_.find(child_scope);
   assert(dbg_scope_itr != id_to_dbg_inst_.end());
-  OpenCLDebugInfo100Instructions debug_opcode =
-      dbg_scope_itr->second->GetOpenCL100DebugOpcode();
+  CommonDebugInfoInstructions debug_opcode =
+      dbg_scope_itr->second->GetCommonDebugOpcode();
   uint32_t parent_scope = kNoDebugScope;
   switch (debug_opcode) {
-    case OpenCLDebugInfo100DebugFunction:
+    case CommonDebugInfoDebugFunction:
       parent_scope = dbg_scope_itr->second->GetSingleWordOperand(
           kDebugFunctionOperandParentIndex);
       break;
-    case OpenCLDebugInfo100DebugLexicalBlock:
+    case CommonDebugInfoDebugLexicalBlock:
       parent_scope = dbg_scope_itr->second->GetSingleWordOperand(
           kDebugLexicalBlockOperandParentIndex);
       break;
-    case OpenCLDebugInfo100DebugTypeComposite:
+    case CommonDebugInfoDebugTypeComposite:
       parent_scope = dbg_scope_itr->second->GetSingleWordOperand(
           kDebugTypeCompositeOperandParentIndex);
       break;
-    case OpenCLDebugInfo100DebugCompilationUnit:
+    case CommonDebugInfoDebugCompilationUnit:
       // DebugCompilationUnit does not have a parent scope.
       break;
     default:
@@ -513,8 +555,7 @@
 
   std::unique_ptr<Instruction> dbg_val(dbg_decl->Clone(context()));
   dbg_val->SetResultId(context()->TakeNextId());
-  dbg_val->SetInOperand(kExtInstInstructionInIdx,
-                        {OpenCLDebugInfo100DebugValue});
+  dbg_val->SetInOperand(kExtInstInstructionInIdx, {CommonDebugInfoDebugValue});
   dbg_val->SetOperand(kDebugDeclareOperandVariableIndex, {value_id});
   dbg_val->SetOperand(kDebugValueOperandExpressionIndex,
                       {GetEmptyDebugExpression()->result_id()});
@@ -532,9 +573,20 @@
   return added_dbg_val;
 }
 
+uint32_t DebugInfoManager::GetVulkanDebugOperation(Instruction* inst) {
+  assert(inst->GetVulkan100DebugOpcode() ==
+             NonSemanticVulkanDebugInfo100DebugOperation &&
+         "inst must be Vulkan DebugOperation");
+  return context()
+      ->get_constant_mgr()
+      ->GetConstantFromInst(context()->get_def_use_mgr()->GetDef(
+          inst->GetSingleWordOperand(kDebugOperationOperandOperationIndex)))
+      ->GetU32();
+}
+
 uint32_t DebugInfoManager::GetVariableIdOfDebugValueUsedForDeclare(
     Instruction* inst) {
-  if (inst->GetOpenCL100DebugOpcode() != OpenCLDebugInfo100DebugValue) return 0;
+  if (inst->GetCommonDebugOpcode() != CommonDebugInfoDebugValue) return 0;
 
   auto* expr =
       GetDbgInst(inst->GetSingleWordOperand(kDebugValueOperandExpressionIndex));
@@ -544,9 +596,19 @@
   auto* operation = GetDbgInst(
       expr->GetSingleWordOperand(kDebugExpressOperandOperationIndex));
   if (operation == nullptr) return 0;
-  if (operation->GetSingleWordOperand(kDebugOperationOperandOperationIndex) !=
-      OpenCLDebugInfo100Deref) {
-    return 0;
+
+  // OpenCL.DebugInfo.100 contains a literal for the operation, Vulkan uses an
+  // OpConstant.
+  if (inst->IsOpenCL100DebugInstr()) {
+    if (operation->GetSingleWordOperand(kDebugOperationOperandOperationIndex) !=
+        OpenCLDebugInfo100Deref) {
+      return 0;
+    }
+  } else {
+    uint32_t operation_const = GetVulkanDebugOperation(operation);
+    if (operation_const != NonSemanticVulkanDebugInfo100Deref) {
+      return 0;
+    }
   }
 
   uint32_t var_id =
@@ -567,8 +629,8 @@
 }
 
 bool DebugInfoManager::IsDebugDeclare(Instruction* instr) {
-  if (!instr->IsOpenCL100DebugInstr()) return false;
-  return instr->GetOpenCL100DebugOpcode() == OpenCLDebugInfo100DebugDeclare ||
+  if (!instr->IsCommonDebugInstr()) return false;
+  return instr->GetCommonDebugOpcode() == CommonDebugInfoDebugDeclare ||
          GetVariableIdOfDebugValueUsedForDeclare(instr) != 0;
 }
 
@@ -615,14 +677,13 @@
     users.insert(inst);
   }
 
-  if (!inst->IsOpenCL100DebugInstr()) return;
+  if (!inst->IsCommonDebugInstr()) return;
 
   RegisterDbgInst(inst);
 
-  if (inst->GetOpenCL100DebugOpcode() == OpenCLDebugInfo100DebugFunction) {
-    assert(GetDebugFunction(inst->GetSingleWordOperand(
-               kDebugFunctionOperandFunctionIndex)) == nullptr &&
-           "Two DebugFunction instruction exists for a single OpFunction.");
+  if (inst->GetOpenCL100DebugOpcode() == OpenCLDebugInfo100DebugFunction ||
+      inst->GetVulkan100DebugOpcode() ==
+          NonSemanticVulkanDebugInfo100DebugFunctionDefinition) {
     RegisterDbgFunction(inst);
   }
 
@@ -633,8 +694,17 @@
     deref_operation_ = inst;
   }
 
+  if (deref_operation_ == nullptr &&
+      inst->GetVulkan100DebugOpcode() ==
+          NonSemanticVulkanDebugInfo100DebugOperation) {
+    uint32_t operation_const = GetVulkanDebugOperation(inst);
+    if (operation_const == NonSemanticVulkanDebugInfo100Deref) {
+      deref_operation_ = inst;
+    }
+  }
+
   if (debug_info_none_inst_ == nullptr &&
-      inst->GetOpenCL100DebugOpcode() == OpenCLDebugInfo100DebugInfoNone) {
+      inst->GetCommonDebugOpcode() == CommonDebugInfoDebugInfoNone) {
     debug_info_none_inst_ = inst;
   }
 
@@ -642,7 +712,7 @@
     empty_debug_expr_inst_ = inst;
   }
 
-  if (inst->GetOpenCL100DebugOpcode() == OpenCLDebugInfo100DebugDeclare) {
+  if (inst->GetCommonDebugOpcode() == CommonDebugInfoDebugDeclare) {
     uint32_t var_id =
         inst->GetSingleWordOperand(kDebugDeclareOperandVariableIndex);
     RegisterDbgDeclare(var_id, inst);
@@ -655,8 +725,8 @@
 
 void DebugInfoManager::ConvertDebugGlobalToLocalVariable(
     Instruction* dbg_global_var, Instruction* local_var) {
-  if (dbg_global_var->GetOpenCL100DebugOpcode() !=
-      OpenCLDebugInfo100DebugGlobalVariable) {
+  if (dbg_global_var->GetCommonDebugOpcode() !=
+      CommonDebugInfoDebugGlobalVariable) {
     return;
   }
   assert(local_var->opcode() == SpvOpVariable ||
@@ -664,7 +734,7 @@
 
   // Convert |dbg_global_var| to DebugLocalVariable
   dbg_global_var->SetInOperand(kExtInstInstructionInIdx,
-                               {OpenCLDebugInfo100DebugLocalVariable});
+                               {CommonDebugInfoDebugLocalVariable});
   auto flags = dbg_global_var->GetSingleWordOperand(
       kDebugGlobalVariableOperandFlagsIndex);
   for (uint32_t i = dbg_global_var->NumInOperands() - 1;
@@ -680,12 +750,9 @@
       context(), SpvOpExtInst, context()->get_type_mgr()->GetVoidTypeId(),
       context()->TakeNextId(),
       {
-          {spv_operand_type_t::SPV_OPERAND_TYPE_ID,
-           {context()
-                ->get_feature_mgr()
-                ->GetExtInstImportId_OpenCL100DebugInfo()}},
+          {spv_operand_type_t::SPV_OPERAND_TYPE_ID, {GetDbgSetImportId()}},
           {spv_operand_type_t::SPV_OPERAND_TYPE_EXTENSION_INSTRUCTION_NUMBER,
-           {static_cast<uint32_t>(OpenCLDebugInfo100DebugDeclare)}},
+           {static_cast<uint32_t>(CommonDebugInfoDebugDeclare)}},
           {spv_operand_type_t::SPV_OPERAND_TYPE_ID,
            {dbg_global_var->result_id()}},
           {spv_operand_type_t::SPV_OPERAND_TYPE_ID, {local_var->result_id()}},
@@ -713,7 +780,7 @@
   // list.
   if (empty_debug_expr_inst_ != nullptr &&
       empty_debug_expr_inst_->PreviousNode() != nullptr &&
-      empty_debug_expr_inst_->PreviousNode()->IsOpenCL100DebugInstr()) {
+      empty_debug_expr_inst_->PreviousNode()->IsCommonDebugInstr()) {
     empty_debug_expr_inst_->InsertBefore(
         &*context()->module()->ext_inst_debuginfo_begin());
   }
@@ -722,7 +789,7 @@
   // list.
   if (debug_info_none_inst_ != nullptr &&
       debug_info_none_inst_->PreviousNode() != nullptr &&
-      debug_info_none_inst_->PreviousNode()->IsOpenCL100DebugInstr()) {
+      debug_info_none_inst_->PreviousNode()->IsCommonDebugInstr()) {
     debug_info_none_inst_->InsertBefore(
         &*context()->module()->ext_inst_debuginfo_begin());
   }
@@ -740,7 +807,7 @@
     inlinedat_id_to_users_itr->second.erase(instr);
   }
 
-  if (instr == nullptr || !instr->IsOpenCL100DebugInstr()) {
+  if (instr == nullptr || !instr->IsCommonDebugInstr()) {
     return;
   }
 
@@ -751,9 +818,15 @@
         instr->GetSingleWordOperand(kDebugFunctionOperandFunctionIndex);
     fn_id_to_dbg_fn_.erase(fn_id);
   }
+  if (instr->GetVulkan100DebugOpcode() ==
+      NonSemanticVulkanDebugInfo100DebugFunction) {
+    auto fn_id = instr->GetSingleWordOperand(
+        kDebugFunctionDefinitionOperandOpFunctionIndex);
+    fn_id_to_dbg_fn_.erase(fn_id);
+  }
 
-  if (instr->GetOpenCL100DebugOpcode() == OpenCLDebugInfo100DebugDeclare ||
-      instr->GetOpenCL100DebugOpcode() == OpenCLDebugInfo100DebugValue) {
+  if (instr->GetCommonDebugOpcode() == CommonDebugInfoDebugDeclare ||
+      instr->GetCommonDebugOpcode() == CommonDebugInfoDebugValue) {
     auto var_or_value_id =
         instr->GetSingleWordOperand(kDebugDeclareOperandVariableIndex);
     auto dbg_decl_itr = var_id_to_dbg_decl_.find(var_or_value_id);
@@ -767,6 +840,8 @@
     for (auto dbg_instr_itr = context()->module()->ext_inst_debuginfo_begin();
          dbg_instr_itr != context()->module()->ext_inst_debuginfo_end();
          ++dbg_instr_itr) {
+      // OpenCL.DebugInfo.100 contains the operation as a literal operand, in
+      // Vulkan it's referenced as an OpConstant.
       if (instr != &*dbg_instr_itr &&
           dbg_instr_itr->GetOpenCL100DebugOpcode() ==
               OpenCLDebugInfo100DebugOperation &&
@@ -775,6 +850,15 @@
               OpenCLDebugInfo100Deref) {
         deref_operation_ = &*dbg_instr_itr;
         break;
+      } else if (instr != &*dbg_instr_itr &&
+                 dbg_instr_itr->GetVulkan100DebugOpcode() ==
+                     NonSemanticVulkanDebugInfo100DebugOperation) {
+        uint32_t operation_const = GetVulkanDebugOperation(&*dbg_instr_itr);
+
+        if (operation_const == NonSemanticVulkanDebugInfo100Deref) {
+          deref_operation_ = &*dbg_instr_itr;
+          break;
+        }
       }
     }
   }
@@ -784,9 +868,8 @@
     for (auto dbg_instr_itr = context()->module()->ext_inst_debuginfo_begin();
          dbg_instr_itr != context()->module()->ext_inst_debuginfo_end();
          ++dbg_instr_itr) {
-      if (instr != &*dbg_instr_itr &&
-          dbg_instr_itr->GetOpenCL100DebugOpcode() ==
-              OpenCLDebugInfo100DebugInfoNone) {
+      if (instr != &*dbg_instr_itr && dbg_instr_itr->GetCommonDebugOpcode() ==
+                                          CommonDebugInfoDebugInfoNone) {
         debug_info_none_inst_ = &*dbg_instr_itr;
         break;
       }
diff --git a/third_party/vulkan-deps/spirv-tools/src/source/opt/debug_info_manager.h b/third_party/vulkan-deps/spirv-tools/src/source/opt/debug_info_manager.h
index 776e9ba..679ae13 100644
--- a/third_party/vulkan-deps/spirv-tools/src/source/opt/debug_info_manager.h
+++ b/third_party/vulkan-deps/spirv-tools/src/source/opt/debug_info_manager.h
@@ -67,8 +67,8 @@
   std::unordered_map<uint32_t, uint32_t> callee_inlined_at2chain_;
 };
 
-// A class for analyzing, managing, and creating OpenCL.DebugInfo.100 extension
-// instructions.
+// A class for analyzing, managing, and creating OpenCL.DebugInfo.100 and
+// NonSemantic.Vulkan.DebugInfo.100 extension instructions.
 class DebugInfoManager {
  public:
   // Constructs a debug information manager from the given |context|.
@@ -85,7 +85,7 @@
     return !(lhs == rhs);
   }
 
-  // Analyzes OpenCL.DebugInfo.100 instruction |dbg_inst|.
+  // Analyzes DebugInfo instruction |dbg_inst|.
   void AnalyzeDebugInst(Instruction* dbg_inst);
 
   // Creates new DebugInlinedAt and returns its id. Its line operand is the
@@ -164,6 +164,9 @@
   // Erases |instr| from data structures of this class.
   void ClearDebugInfo(Instruction* instr);
 
+  // Return the opcode for the Vulkan DebugOperation inst
+  uint32_t GetVulkanDebugOperation(Instruction* inst);
+
   // Returns the id of Value operand if |inst| is DebugValue who has Deref
   // operation and its Value operand is a result id of OpVariable with
   // Function storage class. Otherwise, returns 0.
@@ -190,10 +193,13 @@
  private:
   IRContext* context() { return context_; }
 
-  // Analyzes OpenCL.DebugInfo.100 instructions in the given |module| and
+  // Analyzes DebugInfo instructions in the given |module| and
   // populates data structures in this class.
   void AnalyzeDebugInsts(Module& module);
 
+  // Get the DebugInfo ExtInstImport Id, or 0 if no DebugInfo is available.
+  uint32_t GetDbgSetImportId();
+
   // Returns the debug instruction whose id is |id|. Returns |nullptr| if one
   // does not exists.
   Instruction* GetDbgInst(uint32_t id);
@@ -230,7 +236,7 @@
 
   IRContext* context_;
 
-  // Mapping from ids of OpenCL.DebugInfo.100 extension instructions
+  // Mapping from ids of DebugInfo extension instructions.
   // to their Instruction instances.
   std::unordered_map<uint32_t, Instruction*> id_to_dbg_inst_;
 
diff --git a/third_party/vulkan-deps/spirv-tools/src/source/opt/folding_rules.cpp b/third_party/vulkan-deps/spirv-tools/src/source/opt/folding_rules.cpp
index e3e926c..6ae078f 100644
--- a/third_party/vulkan-deps/spirv-tools/src/source/opt/folding_rules.cpp
+++ b/third_party/vulkan-deps/spirv-tools/src/source/opt/folding_rules.cpp
@@ -967,12 +967,11 @@
 // Fold divides of a constant and a negation.
 // Cases:
 // (-x) / 2 = x / -2
-// 2 / (-x) = 2 / -x
+// 2 / (-x) = -2 / x
 FoldingRule MergeDivNegateArithmetic() {
   return [](IRContext* context, Instruction* inst,
             const std::vector<const analysis::Constant*>& constants) {
-    assert(inst->opcode() == SpvOpFDiv || inst->opcode() == SpvOpSDiv ||
-           inst->opcode() == SpvOpUDiv);
+    assert(inst->opcode() == SpvOpFDiv || inst->opcode() == SpvOpSDiv);
     analysis::ConstantManager* const_mgr = context->get_constant_mgr();
     const analysis::Type* type =
         context->get_type_mgr()->GetType(inst->type_id());
@@ -2572,8 +2571,6 @@
 
   rules_[SpvOpStore].push_back(StoringUndef());
 
-  rules_[SpvOpUDiv].push_back(MergeDivNegateArithmetic());
-
   rules_[SpvOpVectorShuffle].push_back(VectorShuffleFeedingShuffle());
 
   rules_[SpvOpImageSampleImplicitLod].push_back(UpdateImageOperands());
diff --git a/third_party/vulkan-deps/spirv-tools/src/source/opt/inline_pass.cpp b/third_party/vulkan-deps/spirv-tools/src/source/opt/inline_pass.cpp
index 8159ebf..a6bdaaf 100644
--- a/third_party/vulkan-deps/spirv-tools/src/source/opt/inline_pass.cpp
+++ b/third_party/vulkan-deps/spirv-tools/src/source/opt/inline_pass.cpp
@@ -158,8 +158,8 @@
   auto callee_block_itr = calleeFn->begin();
   auto callee_var_itr = callee_block_itr->begin();
   while (callee_var_itr->opcode() == SpvOp::SpvOpVariable ||
-         callee_var_itr->GetOpenCL100DebugOpcode() ==
-             OpenCLDebugInfo100DebugDeclare) {
+         callee_var_itr->GetCommonDebugOpcode() ==
+             CommonDebugInfoDebugDeclare) {
     if (callee_var_itr->opcode() != SpvOp::SpvOpVariable) {
       ++callee_var_itr;
       continue;
@@ -300,8 +300,7 @@
     UptrVectorIterator<BasicBlock> callee_first_block_itr) {
   auto callee_itr = callee_first_block_itr->begin();
   while (callee_itr->opcode() == SpvOp::SpvOpVariable ||
-         callee_itr->GetOpenCL100DebugOpcode() ==
-             OpenCLDebugInfo100DebugDeclare) {
+         callee_itr->GetCommonDebugOpcode() == CommonDebugInfoDebugDeclare) {
     if (callee_itr->opcode() == SpvOp::SpvOpVariable &&
         callee_itr->NumInOperands() == 2) {
       assert(callee2caller.count(callee_itr->result_id()) &&
@@ -315,8 +314,7 @@
                context()->get_debug_info_mgr()->BuildDebugScope(
                    callee_itr->GetDebugScope(), inlined_at_ctx));
     }
-    if (callee_itr->GetOpenCL100DebugOpcode() ==
-        OpenCLDebugInfo100DebugDeclare) {
+    if (callee_itr->GetCommonDebugOpcode() == CommonDebugInfoDebugDeclare) {
       InlineSingleInstruction(
           callee2caller, new_blk_ptr->get(), &*callee_itr,
           context()->get_debug_info_mgr()->BuildDebugInlinedAtChain(
@@ -405,6 +403,14 @@
       callee2caller, inlined_at_ctx, new_blk_ptr, callee_first_block);
 
   while (callee_inst_itr != callee_first_block->end()) {
+    // Don't inline function definition links, the calling function is not a
+    // definition.
+    if (callee_inst_itr->GetVulkan100DebugOpcode() ==
+        NonSemanticVulkanDebugInfo100DebugFunctionDefinition) {
+      ++callee_inst_itr;
+      continue;
+    }
+
     if (!InlineSingleInstruction(
             callee2caller, new_blk_ptr->get(), &*callee_inst_itr,
             context()->get_debug_info_mgr()->BuildDebugInlinedAtChain(
diff --git a/third_party/vulkan-deps/spirv-tools/src/source/opt/instruction.cpp b/third_party/vulkan-deps/spirv-tools/src/source/opt/instruction.cpp
index f93ad01..577c0a6 100644
--- a/third_party/vulkan-deps/spirv-tools/src/source/opt/instruction.cpp
+++ b/third_party/vulkan-deps/spirv-tools/src/source/opt/instruction.cpp
@@ -66,7 +66,8 @@
 
 Instruction::Instruction(IRContext* c, const spv_parsed_instruction_t& inst,
                          std::vector<Instruction>&& dbg_line)
-    : context_(c),
+    : utils::IntrusiveNodeBase<Instruction>(),
+      context_(c),
       opcode_(static_cast<SpvOp>(inst.opcode)),
       has_type_id_(inst.type_id != 0),
       has_result_id_(inst.result_id != 0),
@@ -86,7 +87,8 @@
 
 Instruction::Instruction(IRContext* c, const spv_parsed_instruction_t& inst,
                          const DebugScope& dbg_scope)
-    : context_(c),
+    : utils::IntrusiveNodeBase<Instruction>(),
+      context_(c),
       opcode_(static_cast<SpvOp>(inst.opcode)),
       has_type_id_(inst.type_id != 0),
       has_result_id_(inst.result_id != 0),
@@ -124,6 +126,7 @@
 
 Instruction::Instruction(Instruction&& that)
     : utils::IntrusiveNodeBase<Instruction>(),
+      context_(that.context_),
       opcode_(that.opcode_),
       has_type_id_(that.has_type_id_),
       has_result_id_(that.has_result_id_),
@@ -137,6 +140,7 @@
 }
 
 Instruction& Instruction::operator=(Instruction&& that) {
+  context_ = that.context_;
   opcode_ = that.opcode_;
   has_type_id_ = that.has_type_id_;
   has_result_id_ = that.has_result_id_;
@@ -985,10 +989,10 @@
                           uint32_t ext_set,
                           std::vector<uint32_t>* binary) const {
   uint32_t num_words = kDebugScopeNumWords;
-  OpenCLDebugInfo100Instructions dbg_opcode = OpenCLDebugInfo100DebugScope;
+  CommonDebugInfoInstructions dbg_opcode = CommonDebugInfoDebugScope;
   if (GetLexicalScope() == kNoDebugScope) {
     num_words = kDebugNoScopeNumWords;
-    dbg_opcode = OpenCLDebugInfo100DebugNoScope;
+    dbg_opcode = CommonDebugInfoDebugNoScope;
   } else if (GetInlinedAt() == kNoInlinedAt) {
     num_words = kDebugScopeNumWordsWithoutInlinedAt;
   }
diff --git a/third_party/vulkan-deps/spirv-tools/src/source/opt/ir_context.cpp b/third_party/vulkan-deps/spirv-tools/src/source/opt/ir_context.cpp
index 74f3878..9087346 100644
--- a/third_party/vulkan-deps/spirv-tools/src/source/opt/ir_context.cpp
+++ b/third_party/vulkan-deps/spirv-tools/src/source/opt/ir_context.cpp
@@ -30,7 +30,8 @@
 static const int kEntryPointInterfaceInIdx = 3;
 static const int kEntryPointFunctionIdInIdx = 1;
 
-// Constants for OpenCL.DebugInfo.100 extension instructions.
+// Constants for OpenCL.DebugInfo.100 / NonSemantic.Vulkan.DebugInfo.100
+// extension instructions.
 static const uint32_t kDebugFunctionOperandFunctionIndex = 13;
 static const uint32_t kDebugGlobalVariableOperandVariableIndex = 11;
 
@@ -437,8 +438,7 @@
   if (opcode == SpvOpVariable || IsConstantInst(opcode)) {
     for (auto it = module()->ext_inst_debuginfo_begin();
          it != module()->ext_inst_debuginfo_end(); ++it) {
-      if (it->GetOpenCL100DebugOpcode() !=
-          OpenCLDebugInfo100DebugGlobalVariable)
+      if (it->GetCommonDebugOpcode() != CommonDebugInfoDebugGlobalVariable)
         continue;
       auto& operand = it->GetOperand(kDebugGlobalVariableOperandVariableIndex);
       if (operand.words[0] == id) {
diff --git a/third_party/vulkan-deps/spirv-tools/src/source/opt/ir_context.h b/third_party/vulkan-deps/spirv-tools/src/source/opt/ir_context.h
index f5f38a6..3b89d85 100644
--- a/third_party/vulkan-deps/spirv-tools/src/source/opt/ir_context.h
+++ b/third_party/vulkan-deps/spirv-tools/src/source/opt/ir_context.h
@@ -190,8 +190,8 @@
   inline IteratorRange<Module::const_inst_iterator> debugs3() const;
 
   // Iterators for debug info instructions (excluding OpLine & OpNoLine)
-  // contained in this module.  These are OpExtInst for OpenCL.DebugInfo.100
-  // or DebugInfo extension placed between section 9 and 10.
+  // contained in this module.  These are OpExtInst for DebugInfo extension
+  // placed between section 9 and 10.
   inline Module::inst_iterator ext_inst_debuginfo_begin();
   inline Module::inst_iterator ext_inst_debuginfo_end();
   inline IteratorRange<Module::inst_iterator> ext_inst_debuginfo();
diff --git a/third_party/vulkan-deps/spirv-tools/src/source/opt/ir_loader.cpp b/third_party/vulkan-deps/spirv-tools/src/source/opt/ir_loader.cpp
index e443ebb..bfdd59b 100644
--- a/third_party/vulkan-deps/spirv-tools/src/source/opt/ir_loader.cpp
+++ b/third_party/vulkan-deps/spirv-tools/src/source/opt/ir_loader.cpp
@@ -17,6 +17,7 @@
 #include <utility>
 
 #include "DebugInfo.h"
+#include "NonSemanticVulkanDebugInfo100.h"
 #include "OpenCLDebugInfo100.h"
 #include "source/ext_inst.h"
 #include "source/opt/log.h"
@@ -53,10 +54,12 @@
   // struct DebugScope.
   if (opcode == SpvOpExtInst && spvExtInstIsDebugInfo(inst->ext_inst_type)) {
     const uint32_t ext_inst_index = inst->words[kExtInstSetIndex];
-    if (inst->ext_inst_type == SPV_EXT_INST_TYPE_OPENCL_DEBUGINFO_100) {
-      const OpenCLDebugInfo100Instructions ext_inst_key =
-          OpenCLDebugInfo100Instructions(ext_inst_index);
-      if (ext_inst_key == OpenCLDebugInfo100DebugScope) {
+    if (inst->ext_inst_type == SPV_EXT_INST_TYPE_OPENCL_DEBUGINFO_100 ||
+        inst->ext_inst_type ==
+            SPV_EXT_INST_TYPE_NONSEMANTIC_VULKAN_DEBUGINFO_100) {
+      const CommonDebugInfoInstructions ext_inst_key =
+          CommonDebugInfoInstructions(ext_inst_index);
+      if (ext_inst_key == CommonDebugInfoDebugScope) {
         uint32_t inlined_at = 0;
         if (inst->num_words > kInlinedAtIndex)
           inlined_at = inst->words[kInlinedAtIndex];
@@ -65,7 +68,7 @@
         module()->SetContainsDebugInfo();
         return true;
       }
-      if (ext_inst_key == OpenCLDebugInfo100DebugNoScope) {
+      if (ext_inst_key == CommonDebugInfoDebugNoScope) {
         last_dbg_scope_ = DebugScope(kNoDebugScope, kNoInlinedAt);
         module()->SetContainsDebugInfo();
         return true;
@@ -233,6 +236,35 @@
             default: {
               Errorf(consumer_, src, loc,
                      "Debug info extension instruction other than DebugScope, "
+                     "DebugNoScope, DebugFunctionDefinition, DebugDeclare, and "
+                     "DebugValue found inside function",
+                     opcode);
+              return false;
+            }
+          }
+        } else if (inst->ext_inst_type ==
+                   SPV_EXT_INST_TYPE_NONSEMANTIC_VULKAN_DEBUGINFO_100) {
+          const NonSemanticVulkanDebugInfo100Instructions ext_inst_key =
+              NonSemanticVulkanDebugInfo100Instructions(ext_inst_index);
+          switch (ext_inst_key) {
+            case NonSemanticVulkanDebugInfo100DebugDeclare:
+            case NonSemanticVulkanDebugInfo100DebugValue:
+            case NonSemanticVulkanDebugInfo100DebugScope:
+            case NonSemanticVulkanDebugInfo100DebugNoScope:
+            case NonSemanticVulkanDebugInfo100DebugFunctionDefinition: {
+              if (block_ == nullptr) {  // Inside function but outside blocks
+                Errorf(consumer_, src, loc,
+                       "Debug info extension instruction found inside function "
+                       "but outside block",
+                       opcode);
+              } else {
+                block_->AddInstruction(std::move(spv_inst));
+              }
+              break;
+            }
+            default: {
+              Errorf(consumer_, src, loc,
+                     "Debug info extension instruction other than DebugScope, "
                      "DebugNoScope, DebugDeclare, and DebugValue found inside "
                      "function",
                      opcode);
diff --git a/third_party/vulkan-deps/spirv-tools/src/source/opt/local_access_chain_convert_pass.cpp b/third_party/vulkan-deps/spirv-tools/src/source/opt/local_access_chain_convert_pass.cpp
index 5485c03..e8dbdfc 100644
--- a/third_party/vulkan-deps/spirv-tools/src/source/opt/local_access_chain_convert_pass.cpp
+++ b/third_party/vulkan-deps/spirv-tools/src/source/opt/local_access_chain_convert_pass.cpp
@@ -184,8 +184,8 @@
 bool LocalAccessChainConvertPass::HasOnlySupportedRefs(uint32_t ptrId) {
   if (supported_ref_ptrs_.find(ptrId) != supported_ref_ptrs_.end()) return true;
   if (get_def_use_mgr()->WhileEachUser(ptrId, [this](Instruction* user) {
-        if (user->GetOpenCL100DebugOpcode() == OpenCLDebugInfo100DebugValue ||
-            user->GetOpenCL100DebugOpcode() == OpenCLDebugInfo100DebugDeclare) {
+        if (user->GetCommonDebugOpcode() == CommonDebugInfoDebugValue ||
+            user->GetCommonDebugOpcode() == CommonDebugInfoDebugDeclare) {
           return true;
         }
         SpvOp op = user->opcode();
diff --git a/third_party/vulkan-deps/spirv-tools/src/source/opt/local_single_block_elim_pass.cpp b/third_party/vulkan-deps/spirv-tools/src/source/opt/local_single_block_elim_pass.cpp
index a964c4c..a742e3b 100644
--- a/third_party/vulkan-deps/spirv-tools/src/source/opt/local_single_block_elim_pass.cpp
+++ b/third_party/vulkan-deps/spirv-tools/src/source/opt/local_single_block_elim_pass.cpp
@@ -31,9 +31,9 @@
 bool LocalSingleBlockLoadStoreElimPass::HasOnlySupportedRefs(uint32_t ptrId) {
   if (supported_ref_ptrs_.find(ptrId) != supported_ref_ptrs_.end()) return true;
   if (get_def_use_mgr()->WhileEachUser(ptrId, [this](Instruction* user) {
-        auto dbg_op = user->GetOpenCL100DebugOpcode();
-        if (dbg_op == OpenCLDebugInfo100DebugDeclare ||
-            dbg_op == OpenCLDebugInfo100DebugValue) {
+        auto dbg_op = user->GetCommonDebugOpcode();
+        if (dbg_op == CommonDebugInfoDebugDeclare ||
+            dbg_op == CommonDebugInfoDebugValue) {
           return true;
         }
         SpvOp op = user->opcode();
diff --git a/third_party/vulkan-deps/spirv-tools/src/source/opt/local_single_store_elim_pass.cpp b/third_party/vulkan-deps/spirv-tools/src/source/opt/local_single_store_elim_pass.cpp
index f3864a8..9701d10 100644
--- a/third_party/vulkan-deps/spirv-tools/src/source/opt/local_single_store_elim_pass.cpp
+++ b/third_party/vulkan-deps/spirv-tools/src/source/opt/local_single_store_elim_pass.cpp
@@ -224,9 +224,9 @@
       case SpvOpCopyObject:
         break;
       case SpvOpExtInst: {
-        auto dbg_op = user->GetOpenCL100DebugOpcode();
-        if (dbg_op == OpenCLDebugInfo100DebugDeclare ||
-            dbg_op == OpenCLDebugInfo100DebugValue) {
+        auto dbg_op = user->GetCommonDebugOpcode();
+        if (dbg_op == CommonDebugInfoDebugDeclare ||
+            dbg_op == CommonDebugInfoDebugValue) {
           break;
         }
         return nullptr;
@@ -293,9 +293,9 @@
   bool modified = false;
   for (Instruction* use : uses) {
     if (use->opcode() == SpvOpStore) continue;
-    auto dbg_op = use->GetOpenCL100DebugOpcode();
-    if (dbg_op == OpenCLDebugInfo100DebugDeclare ||
-        dbg_op == OpenCLDebugInfo100DebugValue)
+    auto dbg_op = use->GetCommonDebugOpcode();
+    if (dbg_op == CommonDebugInfoDebugDeclare ||
+        dbg_op == CommonDebugInfoDebugValue)
       continue;
     if (use->opcode() == SpvOpLoad &&
         dominator_analysis->Dominates(store_inst, use)) {
diff --git a/third_party/vulkan-deps/spirv-tools/src/source/opt/mem_pass.cpp b/third_party/vulkan-deps/spirv-tools/src/source/opt/mem_pass.cpp
index 5738798..72442a9 100644
--- a/third_party/vulkan-deps/spirv-tools/src/source/opt/mem_pass.cpp
+++ b/third_party/vulkan-deps/spirv-tools/src/source/opt/mem_pass.cpp
@@ -20,7 +20,6 @@
 #include <set>
 #include <vector>
 
-#include "OpenCLDebugInfo100.h"
 #include "source/cfa.h"
 #include "source/opt/basic_block.h"
 #include "source/opt/dominator_analysis.h"
@@ -226,9 +225,9 @@
 
 bool MemPass::HasOnlySupportedRefs(uint32_t varId) {
   return get_def_use_mgr()->WhileEachUser(varId, [this](Instruction* user) {
-    auto dbg_op = user->GetOpenCL100DebugOpcode();
-    if (dbg_op == OpenCLDebugInfo100DebugDeclare ||
-        dbg_op == OpenCLDebugInfo100DebugValue) {
+    auto dbg_op = user->GetCommonDebugOpcode();
+    if (dbg_op == CommonDebugInfoDebugDeclare ||
+        dbg_op == CommonDebugInfoDebugValue) {
       return true;
     }
     SpvOp op = user->opcode();
diff --git a/third_party/vulkan-deps/spirv-tools/src/source/opt/module.cpp b/third_party/vulkan-deps/spirv-tools/src/source/opt/module.cpp
index 0c88601..6585012 100644
--- a/third_party/vulkan-deps/spirv-tools/src/source/opt/module.cpp
+++ b/third_party/vulkan-deps/spirv-tools/src/source/opt/module.cpp
@@ -145,8 +145,10 @@
   DebugScope last_scope(kNoDebugScope, kNoInlinedAt);
   const Instruction* last_line_inst = nullptr;
   bool between_merge_and_branch = false;
+  bool between_label_and_phi_var = false;
   auto write_inst = [binary, skip_nop, &last_scope, &last_line_inst,
-                     &between_merge_and_branch, this](const Instruction* i) {
+                     &between_merge_and_branch, &between_label_and_phi_var,
+                     this](const Instruction* i) {
     // Skip emitting line instructions between merge and branch instructions.
     auto opcode = i->opcode();
     if (between_merge_and_branch &&
@@ -175,13 +177,29 @@
         last_line_inst = nullptr;
       }
     }
+
+    if (opcode == SpvOpLabel) {
+      between_label_and_phi_var = true;
+    } else if (opcode != SpvOpVariable && opcode != SpvOpPhi &&
+               opcode != SpvOpLine && opcode != SpvOpNoLine) {
+      between_label_and_phi_var = false;
+    }
+
     if (!(skip_nop && i->IsNop())) {
       const auto& scope = i->GetDebugScope();
       if (scope != last_scope) {
-        // Emit DebugScope |scope| to |binary|.
-        auto dbg_inst = ext_inst_debuginfo_.begin();
-        scope.ToBinary(dbg_inst->type_id(), context()->TakeNextId(),
-                       dbg_inst->GetSingleWordOperand(2), binary);
+        // Can only emit nonsemantic instructions after all phi instructions
+        // in a block so don't emit scope instructions before phi instructions
+        // for Vulkan.NonSemantic.DebugInfo.100.
+        if (!between_label_and_phi_var ||
+            context()
+                ->get_feature_mgr()
+                ->GetExtInstImportId_OpenCL100DebugInfo()) {
+          // Emit DebugScope |scope| to |binary|.
+          auto dbg_inst = ext_inst_debuginfo_.begin();
+          scope.ToBinary(dbg_inst->type_id(), context()->TakeNextId(),
+                         dbg_inst->GetSingleWordOperand(2), binary);
+        }
         last_scope = scope;
       }
 
diff --git a/third_party/vulkan-deps/spirv-tools/src/source/opt/module.h b/third_party/vulkan-deps/spirv-tools/src/source/opt/module.h
index d609b60..43b55ae 100644
--- a/third_party/vulkan-deps/spirv-tools/src/source/opt/module.h
+++ b/third_party/vulkan-deps/spirv-tools/src/source/opt/module.h
@@ -103,8 +103,8 @@
   // This is due to decision by the SPIR Working Group, pending publication.
   inline void AddDebug3Inst(std::unique_ptr<Instruction> d);
 
-  // Appends a debug info extension (OpenCL.DebugInfo.100 or DebugInfo)
-  // instruction to this module.
+  // Appends a debug info extension (OpenCL.DebugInfo.100,
+  // NonSemantic.Vulkan.DebugInfo.100, or DebugInfo) instruction to this module.
   inline void AddExtInstDebugInfo(std::unique_ptr<Instruction> d);
 
   // Appends an annotation instruction to this module.
@@ -192,8 +192,8 @@
   inline IteratorRange<const_inst_iterator> debugs3() const;
 
   // Iterators for debug info instructions (excluding OpLine & OpNoLine)
-  // contained in this module.  These are OpExtInst for OpenCL.DebugInfo.100
-  // or DebugInfo extension placed between section 9 and 10.
+  // contained in this module.  These are OpExtInst for DebugInfo extension
+  // placed between section 9 and 10.
   inline inst_iterator ext_inst_debuginfo_begin();
   inline inst_iterator ext_inst_debuginfo_end();
   inline IteratorRange<inst_iterator> ext_inst_debuginfo();
diff --git a/third_party/vulkan-deps/spirv-tools/src/source/opt/optimizer.cpp b/third_party/vulkan-deps/spirv-tools/src/source/opt/optimizer.cpp
index 69103b2..32f953b 100644
--- a/third_party/vulkan-deps/spirv-tools/src/source/opt/optimizer.cpp
+++ b/third_party/vulkan-deps/spirv-tools/src/source/opt/optimizer.cpp
@@ -385,7 +385,23 @@
   } else if (pass_name == "loop-invariant-code-motion") {
     RegisterPass(CreateLoopInvariantCodeMotionPass());
   } else if (pass_name == "reduce-load-size") {
-    RegisterPass(CreateReduceLoadSizePass());
+    if (pass_args.size() == 0) {
+      RegisterPass(CreateReduceLoadSizePass());
+    } else {
+      double load_replacement_threshold = 0.9;
+      if (pass_args.find_first_not_of(".0123456789") == std::string::npos) {
+        load_replacement_threshold = atof(pass_args.c_str());
+      }
+
+      if (load_replacement_threshold >= 0) {
+        RegisterPass(CreateReduceLoadSizePass(load_replacement_threshold));
+      } else {
+        Error(consumer(), nullptr, {},
+              "--reduce-load-size must have no arguments or a non-negative "
+              "double argument");
+        return false;
+      }
+    }
   } else if (pass_name == "redundancy-elimination") {
     RegisterPass(CreateRedundancyEliminationPass());
   } else if (pass_name == "private-to-local") {
@@ -499,6 +515,26 @@
     RegisterPass(CreateAmdExtToKhrPass());
   } else if (pass_name == "interpolate-fixup") {
     RegisterPass(CreateInterpolateFixupPass());
+  } else if (pass_name == "convert-to-sampled-image") {
+    if (pass_args.size() > 0) {
+      auto descriptor_set_binding_pairs =
+          opt::ConvertToSampledImagePass::ParseDescriptorSetBindingPairsString(
+              pass_args.c_str());
+      if (!descriptor_set_binding_pairs) {
+        Errorf(consumer(), nullptr, {},
+               "Invalid argument for --convert-to-sampled-image: %s",
+               pass_args.c_str());
+        return false;
+      }
+      RegisterPass(CreateConvertToSampledImagePass(
+          std::move(*descriptor_set_binding_pairs)));
+    } else {
+      Errorf(consumer(), nullptr, {},
+             "Invalid pairs of descriptor set and binding '%s'. Expected a "
+             "string of <descriptor set>:<binding> pairs.",
+             pass_args.c_str());
+      return false;
+    }
   } else {
     Errorf(consumer(), nullptr, {},
            "Unknown flag '--%s'. Use --help for a list of valid flags",
@@ -859,9 +895,10 @@
   return MakeUnique<Optimizer::PassToken::Impl>(MakeUnique<opt::VectorDCE>());
 }
 
-Optimizer::PassToken CreateReduceLoadSizePass() {
+Optimizer::PassToken CreateReduceLoadSizePass(
+    double load_replacement_threshold) {
   return MakeUnique<Optimizer::PassToken::Impl>(
-      MakeUnique<opt::ReduceLoadSize>());
+      MakeUnique<opt::ReduceLoadSize>(load_replacement_threshold));
 }
 
 Optimizer::PassToken CreateCombineAccessChainsPass() {
@@ -940,4 +977,11 @@
       MakeUnique<opt::InterpFixupPass>());
 }
 
+Optimizer::PassToken CreateConvertToSampledImagePass(
+    const std::vector<opt::DescriptorSetAndBinding>&
+        descriptor_set_binding_pairs) {
+  return MakeUnique<Optimizer::PassToken::Impl>(
+      MakeUnique<opt::ConvertToSampledImagePass>(descriptor_set_binding_pairs));
+}
+
 }  // namespace spvtools
diff --git a/third_party/vulkan-deps/spirv-tools/src/source/opt/passes.h b/third_party/vulkan-deps/spirv-tools/src/source/opt/passes.h
index aeae444..da837f2 100644
--- a/third_party/vulkan-deps/spirv-tools/src/source/opt/passes.h
+++ b/third_party/vulkan-deps/spirv-tools/src/source/opt/passes.h
@@ -26,6 +26,7 @@
 #include "source/opt/combine_access_chains.h"
 #include "source/opt/compact_ids_pass.h"
 #include "source/opt/convert_to_half_pass.h"
+#include "source/opt/convert_to_sampled_image_pass.h"
 #include "source/opt/copy_prop_arrays.h"
 #include "source/opt/dead_branch_elim_pass.h"
 #include "source/opt/dead_insert_elim_pass.h"
diff --git a/third_party/vulkan-deps/spirv-tools/src/source/opt/private_to_local_pass.cpp b/third_party/vulkan-deps/spirv-tools/src/source/opt/private_to_local_pass.cpp
index dd6cbbd..12a226d 100644
--- a/third_party/vulkan-deps/spirv-tools/src/source/opt/private_to_local_pass.cpp
+++ b/third_party/vulkan-deps/spirv-tools/src/source/opt/private_to_local_pass.cpp
@@ -157,8 +157,7 @@
 bool PrivateToLocalPass::IsValidUse(const Instruction* inst) const {
   // The cases in this switch have to match the cases in |UpdateUse|.
   // If we don't know how to update it, it is not valid.
-  if (inst->GetOpenCL100DebugOpcode() ==
-      OpenCLDebugInfo100DebugGlobalVariable) {
+  if (inst->GetCommonDebugOpcode() == CommonDebugInfoDebugGlobalVariable) {
     return true;
   }
   switch (inst->opcode()) {
@@ -183,8 +182,7 @@
   // The cases in this switch have to match the cases in |IsValidUse|.  If we
   // don't think it is valid, the optimization will not view the variable as a
   // candidate, and therefore the use will not be updated.
-  if (inst->GetOpenCL100DebugOpcode() ==
-      OpenCLDebugInfo100DebugGlobalVariable) {
+  if (inst->GetCommonDebugOpcode() == CommonDebugInfoDebugGlobalVariable) {
     context()->get_debug_info_mgr()->ConvertDebugGlobalToLocalVariable(inst,
                                                                        user);
     return true;
diff --git a/third_party/vulkan-deps/spirv-tools/src/source/opt/reduce_load_size.cpp b/third_party/vulkan-deps/spirv-tools/src/source/opt/reduce_load_size.cpp
index c58adf4..e9b8087 100644
--- a/third_party/vulkan-deps/spirv-tools/src/source/opt/reduce_load_size.cpp
+++ b/third_party/vulkan-deps/spirv-tools/src/source/opt/reduce_load_size.cpp
@@ -27,7 +27,6 @@
 const uint32_t kExtractCompositeIdInIdx = 0;
 const uint32_t kVariableStorageClassInIdx = 0;
 const uint32_t kLoadPointerInIdx = 0;
-const double kThreshold = 0.9;
 
 }  // namespace
 
@@ -139,7 +138,7 @@
 
   all_elements_used =
       !def_use_mgr->WhileEachUser(op_inst, [&elements_used](Instruction* use) {
-        if (use->IsOpenCL100DebugInstr()) return true;
+        if (use->IsCommonDebugInstr()) return true;
         if (use->opcode() != SpvOpCompositeExtract ||
             use->NumInOperands() == 1) {
           return false;
@@ -151,6 +150,8 @@
   bool should_replace = false;
   if (all_elements_used) {
     should_replace = false;
+  } else if (1.0 <= replacement_threshold_) {
+    should_replace = true;
   } else {
     analysis::ConstantManager* const_mgr = context()->get_constant_mgr();
     analysis::TypeManager* type_mgr = context()->get_type_mgr();
@@ -172,7 +173,7 @@
     }
     double percent_used = static_cast<double>(elements_used.size()) /
                           static_cast<double>(total_size);
-    should_replace = (percent_used < kThreshold);
+    should_replace = (percent_used < replacement_threshold_);
   }
 
   should_replace_cache_[op_inst->result_id()] = should_replace;
diff --git a/third_party/vulkan-deps/spirv-tools/src/source/opt/reduce_load_size.h b/third_party/vulkan-deps/spirv-tools/src/source/opt/reduce_load_size.h
index ccac49b..b323845 100644
--- a/third_party/vulkan-deps/spirv-tools/src/source/opt/reduce_load_size.h
+++ b/third_party/vulkan-deps/spirv-tools/src/source/opt/reduce_load_size.h
@@ -27,6 +27,9 @@
 // See optimizer.hpp for documentation.
 class ReduceLoadSize : public Pass {
  public:
+  explicit ReduceLoadSize(double replacement_threshold)
+      : replacement_threshold_(replacement_threshold) {}
+
   const char* name() const override { return "reduce-load-size"; }
   Status Process() override;
 
@@ -54,6 +57,11 @@
   // on the load feeding |inst|.
   bool ShouldReplaceExtract(Instruction* inst);
 
+  // Threshold to determine whether we have to replace the load or not. If the
+  // ratio of the used components of the load is less than the threshold, we
+  // replace the load.
+  double replacement_threshold_;
+
   // Maps the result id of an OpLoad instruction to the result of whether or
   // not the OpCompositeExtract that use the id should be replaced.
   std::unordered_map<uint32_t, bool> should_replace_cache_;
diff --git a/third_party/vulkan-deps/spirv-tools/src/source/opt/scalar_replacement_pass.cpp b/third_party/vulkan-deps/spirv-tools/src/source/opt/scalar_replacement_pass.cpp
index 4d47bdd..8adca7b 100644
--- a/third_party/vulkan-deps/spirv-tools/src/source/opt/scalar_replacement_pass.cpp
+++ b/third_party/vulkan-deps/spirv-tools/src/source/opt/scalar_replacement_pass.cpp
@@ -83,14 +83,14 @@
   std::vector<Instruction*> dead;
   bool replaced_all_uses = get_def_use_mgr()->WhileEachUser(
       inst, [this, &replacements, &dead](Instruction* user) {
-        if (user->GetOpenCL100DebugOpcode() == OpenCLDebugInfo100DebugDeclare) {
+        if (user->GetCommonDebugOpcode() == CommonDebugInfoDebugDeclare) {
           if (ReplaceWholeDebugDeclare(user, replacements)) {
             dead.push_back(user);
             return true;
           }
           return false;
         }
-        if (user->GetOpenCL100DebugOpcode() == OpenCLDebugInfo100DebugValue) {
+        if (user->GetCommonDebugOpcode() == CommonDebugInfoDebugValue) {
           if (ReplaceWholeDebugValue(user, replacements)) {
             dead.push_back(user);
             return true;
@@ -504,7 +504,7 @@
     }
   }
 
-  // Update the OpenCL.DebugInfo.100 debug information.
+  // Update the DebugInfo debug information.
   inst->UpdateDebugInfoFrom(varInst);
 
   replacements->push_back(inst);
@@ -791,8 +791,8 @@
   get_def_use_mgr()->ForEachUse(inst, [this, max_legal_index, stats, &ok](
                                           const Instruction* user,
                                           uint32_t index) {
-    if (user->GetOpenCL100DebugOpcode() == OpenCLDebugInfo100DebugDeclare ||
-        user->GetOpenCL100DebugOpcode() == OpenCLDebugInfo100DebugValue) {
+    if (user->GetCommonDebugOpcode() == CommonDebugInfoDebugDeclare ||
+        user->GetCommonDebugOpcode() == CommonDebugInfoDebugValue) {
       // TODO: include num_partial_accesses if it uses Fragment operation or
       // DebugValue has Indexes operand.
       stats->num_full_accesses++;
diff --git a/third_party/vulkan-deps/spirv-tools/src/source/opt/value_number_table.cpp b/third_party/vulkan-deps/spirv-tools/src/source/opt/value_number_table.cpp
index 32d6de9..5271e3f 100644
--- a/third_party/vulkan-deps/spirv-tools/src/source/opt/value_number_table.cpp
+++ b/third_party/vulkan-deps/spirv-tools/src/source/opt/value_number_table.cpp
@@ -50,7 +50,7 @@
   // OpSampledImage and OpImage must remain in the same basic block in which
   // they are used, because of this we will assign each one it own value number.
   if (!context()->IsCombinatorInstruction(inst) &&
-      !inst->IsOpenCL100DebugInstr()) {
+      !inst->IsCommonDebugInstr()) {
     value = TakeNextValueNumber();
     id_to_value_[inst->result_id()] = value;
     return value;
diff --git a/third_party/vulkan-deps/spirv-tools/src/source/opt/vector_dce.cpp b/third_party/vulkan-deps/spirv-tools/src/source/opt/vector_dce.cpp
index 14a55c1..3c9f944 100644
--- a/third_party/vulkan-deps/spirv-tools/src/source/opt/vector_dce.cpp
+++ b/third_party/vulkan-deps/spirv-tools/src/source/opt/vector_dce.cpp
@@ -52,7 +52,7 @@
   // components are live because of arbitrary nesting of structs.
   function->ForEachInst(
       [&work_list, this, live_components](Instruction* current_inst) {
-        if (current_inst->IsOpenCL100DebugInstr()) {
+        if (current_inst->IsCommonDebugInstr()) {
           return;
         }
         if (!HasVectorOrScalarResult(current_inst) ||
@@ -394,7 +394,7 @@
     Instruction* composite, std::vector<Instruction*>* dead_dbg_value) {
   context()->get_def_use_mgr()->ForEachUser(
       composite, [&dead_dbg_value](Instruction* use) {
-        if (use->GetOpenCL100DebugOpcode() == OpenCLDebugInfo100DebugValue)
+        if (use->GetCommonDebugOpcode() == CommonDebugInfoDebugValue)
           dead_dbg_value->push_back(use);
       });
 }
diff --git a/third_party/vulkan-deps/spirv-tools/src/source/spirv_validator_options.cpp b/third_party/vulkan-deps/spirv-tools/src/source/spirv_validator_options.cpp
index 2716cca..e5b1eec 100644
--- a/third_party/vulkan-deps/spirv-tools/src/source/spirv_validator_options.cpp
+++ b/third_party/vulkan-deps/spirv-tools/src/source/spirv_validator_options.cpp
@@ -120,3 +120,8 @@
                                            bool val) {
   options->skip_block_layout = val;
 }
+
+void spvValidatorOptionsSetAllowLocalSizeId(spv_validator_options options,
+                                            bool val) {
+  options->allow_localsizeid = val;
+}
diff --git a/third_party/vulkan-deps/spirv-tools/src/source/spirv_validator_options.h b/third_party/vulkan-deps/spirv-tools/src/source/spirv_validator_options.h
index baaa535..a357c03 100644
--- a/third_party/vulkan-deps/spirv-tools/src/source/spirv_validator_options.h
+++ b/third_party/vulkan-deps/spirv-tools/src/source/spirv_validator_options.h
@@ -47,6 +47,7 @@
         scalar_block_layout(false),
         workgroup_scalar_block_layout(false),
         skip_block_layout(false),
+        allow_localsizeid(false),
         before_hlsl_legalization(false) {}
 
   validator_universal_limits_t universal_limits_;
@@ -57,6 +58,7 @@
   bool scalar_block_layout;
   bool workgroup_scalar_block_layout;
   bool skip_block_layout;
+  bool allow_localsizeid;
   bool before_hlsl_legalization;
 };
 
diff --git a/third_party/vulkan-deps/spirv-tools/src/source/val/validate_adjacency.cpp b/third_party/vulkan-deps/spirv-tools/src/source/val/validate_adjacency.cpp
index 64655b0..13720f0 100644
--- a/third_party/vulkan-deps/spirv-tools/src/source/val/validate_adjacency.cpp
+++ b/third_party/vulkan-deps/spirv-tools/src/source/val/validate_adjacency.cpp
@@ -60,7 +60,10 @@
         // TODO(https://gitlab.khronos.org/spirv/SPIR-V/issues/533): We need
         // to discuss the location of DebugScope, DebugNoScope, DebugDeclare,
         // and DebugValue.
-        if (!spvExtInstIsDebugInfo(inst.ext_inst_type())) {
+        // NOTE: This does not apply to the non-semantic vulkan debug info.
+        if (!spvExtInstIsDebugInfo(inst.ext_inst_type()) ||
+            inst.ext_inst_type() ==
+                SPV_EXT_INST_TYPE_NONSEMANTIC_VULKAN_DEBUGINFO_100) {
           adjacency_status = PHI_AND_VAR_INVALID;
         }
         break;
diff --git a/third_party/vulkan-deps/spirv-tools/src/source/val/validate_builtins.cpp b/third_party/vulkan-deps/spirv-tools/src/source/val/validate_builtins.cpp
index 3c9df9f..a6e624f 100644
--- a/third_party/vulkan-deps/spirv-tools/src/source/val/validate_builtins.cpp
+++ b/third_party/vulkan-deps/spirv-tools/src/source/val/validate_builtins.cpp
@@ -2846,7 +2846,7 @@
                << spvLogStringForEnv(_.context()->target_env)
                << " spec allows BuiltIn "
                << _.grammar().lookupOperandName(SPV_OPERAND_TYPE_BUILT_IN, builtin)
-               << " to be used only with GLCompute execution model. "
+               << " to be used only with GLCompute, MeshNV, or TaskNV execution model. "
                << GetReferenceDesc(decoration, built_in_inst, referenced_inst,
                                    referenced_from_inst, execution_model);
       }
@@ -2928,7 +2928,7 @@
                << spvLogStringForEnv(_.context()->target_env)
                << " spec allows BuiltIn "
                << _.grammar().lookupOperandName(SPV_OPERAND_TYPE_BUILT_IN, builtin)
-               << " to be used only with GLCompute execution model. "
+               << " to be used only with GLCompute, MeshNV, or TaskNV execution model. "
                << GetReferenceDesc(decoration, built_in_inst, referenced_inst,
                                    referenced_from_inst, execution_model);
       }
@@ -3070,14 +3070,16 @@
     const Instruction& referenced_from_inst) {
   if (spvIsVulkanEnv(_.context()->target_env)) {
     for (const SpvExecutionModel execution_model : execution_models_) {
-      if (execution_model != SpvExecutionModelGLCompute) {
+      if (execution_model != SpvExecutionModelGLCompute &&
+          execution_model != SpvExecutionModelTaskNV &&
+          execution_model != SpvExecutionModelMeshNV) {
         return _.diag(SPV_ERROR_INVALID_DATA, &referenced_from_inst)
                << _.VkErrorID(4425)
                << spvLogStringForEnv(_.context()->target_env)
                << " spec allows BuiltIn "
                << _.grammar().lookupOperandName(SPV_OPERAND_TYPE_BUILT_IN,
                                                 decoration.params()[0])
-               << " to be used only with GLCompute execution model. "
+               << " to be used only with GLCompute, MeshNV, or TaskNV execution model. "
                << GetReferenceDesc(decoration, built_in_inst, referenced_inst,
                                    referenced_from_inst, execution_model);
       }
@@ -4190,6 +4192,7 @@
     case SpvBuiltInMeshViewIndicesNV:
     case SpvBuiltInBaryCoordNV:
     case SpvBuiltInBaryCoordNoPerspNV:
+    case SpvBuiltInCurrentRayTimeNV:
       // No validation rules (for the moment).
       break;
 
diff --git a/third_party/vulkan-deps/spirv-tools/src/source/val/validate_decorations.cpp b/third_party/vulkan-deps/spirv-tools/src/source/val/validate_decorations.cpp
index f076b04..c483635 100644
--- a/third_party/vulkan-deps/spirv-tools/src/source/val/validate_decorations.cpp
+++ b/third_party/vulkan-deps/spirv-tools/src/source/val/validate_decorations.cpp
@@ -506,12 +506,10 @@
       return recursive_status;
     // Check matrix stride.
     if (SpvOpTypeMatrix == opcode) {
-      for (auto& decoration : vstate.id_decorations(id)) {
-        if (SpvDecorationMatrixStride == decoration.dec_type() &&
-            !IsAlignedTo(decoration.params()[0], alignment))
-          return fail(memberIdx)
-                 << "is a matrix with stride " << decoration.params()[0]
-                 << " not satisfying alignment to " << alignment;
+      const auto stride = constraint.matrix_stride;
+      if (!IsAlignedTo(stride, alignment)) {
+        return fail(memberIdx) << "is a matrix with stride " << stride
+                               << " not satisfying alignment to " << alignment;
       }
     }
 
@@ -549,17 +547,23 @@
       // limitation to this check if the array size is a spec constant or is a
       // runtime array then we will only check a single element. This means
       // some improper straddles might be missed.
-      for (uint32_t i = 0; i < num_elements; ++i) {
-        uint32_t next_offset = i * array_stride + offset;
-        if (SpvOpTypeStruct == element_inst->opcode() &&
-            SPV_SUCCESS != (recursive_status = checkLayout(
-                                typeId, storage_class_str, decoration_str,
-                                blockRules, scalar_block_layout,
-                                next_offset, constraints, vstate)))
-          return recursive_status;
-        // If offsets accumulate up to a 16-byte multiple stop checking since
-        // it will just repeat.
-        if (i > 0 && (next_offset % 16 == 0)) break;
+      if (SpvOpTypeStruct == element_inst->opcode()) {
+        std::vector<bool> seen(16, false);
+        for (uint32_t i = 0; i < num_elements; ++i) {
+          uint32_t next_offset = i * array_stride + offset;
+          // Stop checking if offsets repeat in terms of 16-byte multiples.
+          if (seen[next_offset % 16]) {
+            break;
+          }
+
+          if (SPV_SUCCESS !=
+              (recursive_status = checkLayout(
+                   typeId, storage_class_str, decoration_str, blockRules,
+                   scalar_block_layout, next_offset, constraints, vstate)))
+            return recursive_status;
+
+          seen[next_offset % 16] = true;
+        }
       }
 
       // Proceed to the element in case it is an array.
diff --git a/third_party/vulkan-deps/spirv-tools/src/source/val/validate_extensions.cpp b/third_party/vulkan-deps/spirv-tools/src/source/val/validate_extensions.cpp
index b5b9878..5ea23e1 100644
--- a/third_party/vulkan-deps/spirv-tools/src/source/val/validate_extensions.cpp
+++ b/third_party/vulkan-deps/spirv-tools/src/source/val/validate_extensions.cpp
@@ -20,7 +20,9 @@
 
 #include "spirv/unified1/NonSemanticClspvReflection.h"
 
+#include "NonSemanticVulkanDebugInfo100.h"
 #include "OpenCLDebugInfo100.h"
+#include "source/common_debug_info.h"
 #include "source/diagnostic.h"
 #include "source/enum_string_mapping.h"
 #include "source/extensions.h"
@@ -45,6 +47,34 @@
   return 0;
 }
 
+bool IsIntScalar(ValidationState_t& _, uint32_t id, bool must_len32,
+                 bool must_unsigned) {
+  auto type = _.FindDef(id);
+  if (!type || type->opcode() != SpvOpTypeInt) {
+    return false;
+  }
+
+  if (must_len32 && type->GetOperandAs<uint32_t>(1) != 32) {
+    return false;
+  }
+
+  return !must_unsigned || type->GetOperandAs<uint32_t>(2) == 0;
+}
+
+bool IsUint32Constant(ValidationState_t& _, uint32_t id) {
+  auto inst = _.FindDef(id);
+  if (!inst || inst->opcode() != SpvOpConstant) {
+    return false;
+  }
+
+  return IsIntScalar(_, inst->type_id(), true, true);
+}
+
+uint32_t GetUint32Constant(ValidationState_t& _, uint32_t id) {
+  auto inst = _.FindDef(id);
+  return inst->word(3);
+}
+
 // Check that the operand of a debug info instruction |inst| at |word_index|
 // is a result id of an instruction with |expected_opcode|.
 spv_result_t ValidateOperandForDebugInfo(
@@ -68,6 +98,22 @@
   return SPV_SUCCESS;
 }
 
+// For NonSemantic.Vulkan.DebugInfo.100 check that the operand of a debug info
+// instruction |inst| at |word_index| is a result id of a 32-bit integer
+// OpConstant instruction. For OpenCL.DebugInfo.100 the parameter is a literal
+// word so cannot be validated.
+spv_result_t ValidateUint32ConstantOperandForDebugInfo(
+    ValidationState_t& _, const std::string& operand_name,
+    const Instruction* inst, uint32_t word_index,
+    const std::function<std::string()>& ext_inst_name) {
+  if (!IsUint32Constant(_, inst->word(word_index))) {
+    return _.diag(SPV_ERROR_INVALID_DATA, inst)
+           << ext_inst_name() << ": expected operand " << operand_name
+           << " must be a result id of 32-bit unsigned OpConstant";
+  }
+  return SPV_SUCCESS;
+}
+
 #define CHECK_OPERAND(NAME, opcode, index)                                  \
   do {                                                                      \
     auto result = ValidateOperandForDebugInfo(_, NAME, opcode, inst, index, \
@@ -75,18 +121,27 @@
     if (result != SPV_SUCCESS) return result;                               \
   } while (0)
 
+#define CHECK_CONST_UINT_OPERAND(NAME, index)                \
+  if (vulkanDebugInfo) {                                     \
+    auto result = ValidateUint32ConstantOperandForDebugInfo( \
+        _, NAME, inst, index, ext_inst_name);                \
+    if (result != SPV_SUCCESS) return result;                \
+  }
+
 // True if the operand of a debug info instruction |inst| at |word_index|
 // satisifies |expectation| that is given as a function. Otherwise,
 // returns false.
 bool DoesDebugInfoOperandMatchExpectation(
     const ValidationState_t& _,
-    const std::function<bool(OpenCLDebugInfo100Instructions)>& expectation,
+    const std::function<bool(CommonDebugInfoInstructions)>& expectation,
     const Instruction* inst, uint32_t word_index) {
   if (inst->words().size() <= word_index) return false;
   auto* debug_inst = _.FindDef(inst->word(word_index));
   if (debug_inst->opcode() != SpvOpExtInst ||
-      debug_inst->ext_inst_type() != SPV_EXT_INST_TYPE_OPENCL_DEBUGINFO_100 ||
-      !expectation(OpenCLDebugInfo100Instructions(debug_inst->word(4)))) {
+      (debug_inst->ext_inst_type() != SPV_EXT_INST_TYPE_OPENCL_DEBUGINFO_100 &&
+       debug_inst->ext_inst_type() !=
+           SPV_EXT_INST_TYPE_NONSEMANTIC_VULKAN_DEBUGINFO_100) ||
+      !expectation(CommonDebugInfoInstructions(debug_inst->word(4)))) {
     return false;
   }
   return true;
@@ -97,20 +152,18 @@
 // is |expected_debug_inst|.
 spv_result_t ValidateDebugInfoOperand(
     ValidationState_t& _, const std::string& debug_inst_name,
-    OpenCLDebugInfo100Instructions expected_debug_inst, const Instruction* inst,
+    CommonDebugInfoInstructions expected_debug_inst, const Instruction* inst,
     uint32_t word_index, const std::function<std::string()>& ext_inst_name) {
-  std::function<bool(OpenCLDebugInfo100Instructions)> expectation =
-      [expected_debug_inst](OpenCLDebugInfo100Instructions dbg_inst) {
+  std::function<bool(CommonDebugInfoInstructions)> expectation =
+      [expected_debug_inst](CommonDebugInfoInstructions dbg_inst) {
         return dbg_inst == expected_debug_inst;
       };
   if (DoesDebugInfoOperandMatchExpectation(_, expectation, inst, word_index))
     return SPV_SUCCESS;
 
   spv_ext_inst_desc desc = nullptr;
-  _.grammar().lookupExtInst(SPV_EXT_INST_TYPE_OPENCL_DEBUGINFO_100,
-                            expected_debug_inst, &desc);
-  if (_.grammar().lookupExtInst(SPV_EXT_INST_TYPE_OPENCL_DEBUGINFO_100,
-                                expected_debug_inst, &desc) != SPV_SUCCESS ||
+  if (_.grammar().lookupExtInst(inst->ext_inst_type(), expected_debug_inst,
+                                &desc) != SPV_SUCCESS ||
       !desc) {
     return _.diag(SPV_ERROR_INVALID_DATA, inst)
            << ext_inst_name() << ": "
@@ -134,9 +187,8 @@
 spv_result_t ValidateOperandBaseType(
     ValidationState_t& _, const Instruction* inst, uint32_t word_index,
     const std::function<std::string()>& ext_inst_name) {
-  return ValidateDebugInfoOperand(_, "Base Type",
-                                  OpenCLDebugInfo100DebugTypeBasic, inst,
-                                  word_index, ext_inst_name);
+  return ValidateDebugInfoOperand(_, "Base Type", CommonDebugInfoDebugTypeBasic,
+                                  inst, word_index, ext_inst_name);
 }
 
 // Check that the operand of a debug info instruction |inst| at |word_index|
@@ -147,12 +199,12 @@
     ValidationState_t& _, const std::string& debug_inst_name,
     const Instruction* inst, uint32_t word_index,
     const std::function<std::string()>& ext_inst_name) {
-  std::function<bool(OpenCLDebugInfo100Instructions)> expectation =
-      [](OpenCLDebugInfo100Instructions dbg_inst) {
-        return dbg_inst == OpenCLDebugInfo100DebugCompilationUnit ||
-               dbg_inst == OpenCLDebugInfo100DebugFunction ||
-               dbg_inst == OpenCLDebugInfo100DebugLexicalBlock ||
-               dbg_inst == OpenCLDebugInfo100DebugTypeComposite;
+  std::function<bool(CommonDebugInfoInstructions)> expectation =
+      [](CommonDebugInfoInstructions dbg_inst) {
+        return dbg_inst == CommonDebugInfoDebugCompilationUnit ||
+               dbg_inst == CommonDebugInfoDebugFunction ||
+               dbg_inst == CommonDebugInfoDebugLexicalBlock ||
+               dbg_inst == CommonDebugInfoDebugTypeComposite;
       };
   if (DoesDebugInfoOperandMatchExpectation(_, expectation, inst, word_index))
     return SPV_SUCCESS;
@@ -171,16 +223,15 @@
     const Instruction* inst, uint32_t word_index,
     const std::function<std::string()>& ext_inst_name,
     bool allow_template_param) {
-  std::function<bool(OpenCLDebugInfo100Instructions)> expectation =
-      [&allow_template_param](OpenCLDebugInfo100Instructions dbg_inst) {
+  std::function<bool(CommonDebugInfoInstructions)> expectation =
+      [&allow_template_param](CommonDebugInfoInstructions dbg_inst) {
         if (allow_template_param &&
-            (dbg_inst == OpenCLDebugInfo100DebugTypeTemplateParameter ||
-             dbg_inst ==
-                 OpenCLDebugInfo100DebugTypeTemplateTemplateParameter)) {
+            (dbg_inst == CommonDebugInfoDebugTypeTemplateParameter ||
+             dbg_inst == CommonDebugInfoDebugTypeTemplateTemplateParameter)) {
           return true;
         }
-        return OpenCLDebugInfo100DebugTypeBasic <= dbg_inst &&
-               dbg_inst <= OpenCLDebugInfo100DebugTypeTemplate;
+        return CommonDebugInfoDebugTypeBasic <= dbg_inst &&
+               dbg_inst <= CommonDebugInfoDebugTypeTemplate;
       };
   if (DoesDebugInfoOperandMatchExpectation(_, expectation, inst, word_index))
     return SPV_SUCCESS;
@@ -191,28 +242,6 @@
          << " is not a valid debug type";
 }
 
-bool IsUint32Constant(ValidationState_t& _, uint32_t id) {
-  auto inst = _.FindDef(id);
-  if (!inst || inst->opcode() != SpvOpConstant) {
-    return false;
-  }
-
-  auto type = _.FindDef(inst->type_id());
-  if (!type || type->opcode() != SpvOpTypeInt) {
-    return false;
-  }
-
-  if (type->GetOperandAs<uint32_t>(1) != 32) {
-    return false;
-  }
-
-  if (type->GetOperandAs<uint32_t>(2) != 0) {
-    return false;
-  }
-
-  return true;
-}
-
 spv_result_t ValidateClspvReflectionKernel(ValidationState_t& _,
                                            const Instruction* inst) {
   const auto kernel_id = inst->GetOperandAs<uint32_t>(4);
@@ -667,18 +696,26 @@
                                       const Instruction* inst,
                                       uint32_t word_index) {
   auto* dbg_int_scalar_var = _.FindDef(inst->word(word_index));
-  if (OpenCLDebugInfo100Instructions(dbg_int_scalar_var->word(4)) ==
-          OpenCLDebugInfo100DebugLocalVariable ||
-      OpenCLDebugInfo100Instructions(dbg_int_scalar_var->word(4)) ==
-          OpenCLDebugInfo100DebugGlobalVariable) {
+  if (CommonDebugInfoInstructions(dbg_int_scalar_var->word(4)) ==
+          CommonDebugInfoDebugLocalVariable ||
+      CommonDebugInfoInstructions(dbg_int_scalar_var->word(4)) ==
+          CommonDebugInfoDebugGlobalVariable) {
     auto* dbg_type = _.FindDef(dbg_int_scalar_var->word(6));
-    if (OpenCLDebugInfo100Instructions(dbg_type->word(4)) ==
-            OpenCLDebugInfo100DebugTypeBasic &&
-        (OpenCLDebugInfo100DebugBaseTypeAttributeEncoding(dbg_type->word(7)) ==
-             OpenCLDebugInfo100Signed ||
-         OpenCLDebugInfo100DebugBaseTypeAttributeEncoding(dbg_type->word(7)) ==
-             OpenCLDebugInfo100Unsigned)) {
-      return true;
+    if (CommonDebugInfoInstructions(dbg_type->word(4)) ==
+        CommonDebugInfoDebugTypeBasic) {
+      const spv_ext_inst_type_t ext_inst_type =
+          spv_ext_inst_type_t(inst->ext_inst_type());
+      const bool vulkanDebugInfo =
+          ext_inst_type == SPV_EXT_INST_TYPE_NONSEMANTIC_VULKAN_DEBUGINFO_100;
+      uint32_t encoding = dbg_type->word(7);
+      if (!vulkanDebugInfo || IsUint32Constant(_, encoding)) {
+        auto ocl_encoding = OpenCLDebugInfo100DebugBaseTypeAttributeEncoding(
+            vulkanDebugInfo ? GetUint32Constant(_, encoding) : encoding);
+        if (ocl_encoding == OpenCLDebugInfo100Signed ||
+            ocl_encoding == OpenCLDebugInfo100Unsigned) {
+          return true;
+        }
+      }
     }
   }
   return false;
@@ -812,7 +849,7 @@
         for (uint32_t operand_index = 4; operand_index < num_operands;
              ++operand_index) {
           const uint32_t operand_type = _.GetOperandTypeId(inst, operand_index);
-          if (!_.IsIntScalarOrVectorType(operand_type)) {
+          if (!operand_type || !_.IsIntScalarOrVectorType(operand_type)) {
             return _.diag(SPV_ERROR_INVALID_DATA, inst)
                    << ext_inst_name() << ": "
                    << "expected all operands to be int scalars or vectors";
@@ -2668,7 +2705,9 @@
         break;
       }
     }
-  } else if (ext_inst_type == SPV_EXT_INST_TYPE_OPENCL_DEBUGINFO_100) {
+  } else if (ext_inst_type == SPV_EXT_INST_TYPE_OPENCL_DEBUGINFO_100 ||
+             ext_inst_type ==
+                 SPV_EXT_INST_TYPE_NONSEMANTIC_VULKAN_DEBUGINFO_100) {
     if (!_.IsVoidType(result_type)) {
       return _.diag(SPV_ERROR_INVALID_DATA, inst)
              << ext_inst_name() << ": "
@@ -2676,447 +2715,552 @@
              << "OpTypeVoid";
     }
 
+    const bool vulkanDebugInfo =
+        ext_inst_type == SPV_EXT_INST_TYPE_NONSEMANTIC_VULKAN_DEBUGINFO_100;
+
     auto num_words = inst->words().size();
 
-    const OpenCLDebugInfo100Instructions ext_inst_key =
-        OpenCLDebugInfo100Instructions(ext_inst_index);
-    switch (ext_inst_key) {
-      case OpenCLDebugInfo100DebugInfoNone:
-      case OpenCLDebugInfo100DebugNoScope:
-      case OpenCLDebugInfo100DebugOperation:
-        // The binary parser validates the opcode for DebugInfoNone,
-        // DebugNoScope, DebugOperation, and the literal values don't need
-        // further checks.
-        break;
-      case OpenCLDebugInfo100DebugCompilationUnit: {
-        CHECK_DEBUG_OPERAND("Source", OpenCLDebugInfo100DebugSource, 7);
-        break;
-      }
-      case OpenCLDebugInfo100DebugSource: {
-        CHECK_OPERAND("File", SpvOpString, 5);
-        if (num_words == 7) CHECK_OPERAND("Text", SpvOpString, 6);
-        break;
-      }
-      case OpenCLDebugInfo100DebugTypeBasic: {
-        CHECK_OPERAND("Name", SpvOpString, 5);
-        CHECK_OPERAND("Size", SpvOpConstant, 6);
-        // "Encoding" param is already validated by the binary parsing stage.
-        break;
-      }
-      case OpenCLDebugInfo100DebugTypePointer:
-      case OpenCLDebugInfo100DebugTypeQualifier: {
-        auto validate_base_type =
-            ValidateOperandBaseType(_, inst, 5, ext_inst_name);
-        if (validate_base_type != SPV_SUCCESS) return validate_base_type;
-        break;
-      }
-      case OpenCLDebugInfo100DebugTypeVector: {
-        auto validate_base_type =
-            ValidateOperandBaseType(_, inst, 5, ext_inst_name);
-        if (validate_base_type != SPV_SUCCESS) return validate_base_type;
-
-        uint32_t component_count = inst->word(6);
-        if (!component_count || component_count > 4) {
-          return _.diag(SPV_ERROR_INVALID_DATA, inst)
-                 << ext_inst_name() << ": Component Count must be positive "
-                 << "integer less than or equal to 4";
+    // Handle any non-common OpenCL insts, then common
+    if (ext_inst_type != SPV_EXT_INST_TYPE_OPENCL_DEBUGINFO_100 ||
+        OpenCLDebugInfo100Instructions(ext_inst_index) !=
+            OpenCLDebugInfo100DebugModuleINTEL) {
+      const CommonDebugInfoInstructions ext_inst_key =
+          CommonDebugInfoInstructions(ext_inst_index);
+      switch (ext_inst_key) {
+        case CommonDebugInfoDebugInfoNone:
+        case CommonDebugInfoDebugNoScope:
+          break;
+          // The binary parser validates the opcode for DebugInfoNone,
+          // DebugNoScope, DebugOperation. We just check the parameters to
+          // DebugOperation are properly constants for vulkan debug info.
+        case CommonDebugInfoDebugOperation: {
+          CHECK_CONST_UINT_OPERAND("Operation", 5);
+          for (uint32_t i = 6; i < num_words; ++i) {
+            CHECK_CONST_UINT_OPERAND("Operand", i);
+          }
+          break;
         }
-        break;
-      }
-      case OpenCLDebugInfo100DebugTypeArray: {
-        auto validate_base_type = ValidateOperandDebugType(
-            _, "Base Type", inst, 5, ext_inst_name, false);
-        if (validate_base_type != SPV_SUCCESS) return validate_base_type;
-        for (uint32_t i = 6; i < num_words; ++i) {
-          bool invalid = false;
-          auto* component_count = _.FindDef(inst->word(i));
-          if (IsConstIntScalarTypeWith32Or64Bits(_, component_count)) {
-            // TODO: We need a spec discussion for the bindless array.
-            if (!component_count->word(3)) {
-              invalid = true;
+        case CommonDebugInfoDebugCompilationUnit: {
+          CHECK_CONST_UINT_OPERAND("Version", 5);
+          CHECK_CONST_UINT_OPERAND("DWARF Version", 6);
+          CHECK_DEBUG_OPERAND("Source", CommonDebugInfoDebugSource, 7);
+          CHECK_CONST_UINT_OPERAND("Language", 8);
+          break;
+        }
+        case CommonDebugInfoDebugSource: {
+          CHECK_OPERAND("File", SpvOpString, 5);
+          if (num_words == 7) CHECK_OPERAND("Text", SpvOpString, 6);
+          break;
+        }
+        case CommonDebugInfoDebugTypeBasic: {
+          CHECK_OPERAND("Name", SpvOpString, 5);
+          CHECK_OPERAND("Size", SpvOpConstant, 6);
+          CHECK_CONST_UINT_OPERAND("Encoding", 7);
+          break;
+        }
+        case CommonDebugInfoDebugTypePointer: {
+          auto validate_base_type =
+              ValidateOperandBaseType(_, inst, 5, ext_inst_name);
+          if (validate_base_type != SPV_SUCCESS) return validate_base_type;
+          CHECK_CONST_UINT_OPERAND("Storage Class", 6);
+          CHECK_CONST_UINT_OPERAND("Flags", 7);
+          break;
+        }
+        case CommonDebugInfoDebugTypeQualifier: {
+          auto validate_base_type =
+              ValidateOperandBaseType(_, inst, 5, ext_inst_name);
+          if (validate_base_type != SPV_SUCCESS) return validate_base_type;
+          CHECK_CONST_UINT_OPERAND("Type Qualifier", 6);
+          break;
+        }
+        case CommonDebugInfoDebugTypeVector: {
+          auto validate_base_type =
+              ValidateOperandBaseType(_, inst, 5, ext_inst_name);
+          if (validate_base_type != SPV_SUCCESS) return validate_base_type;
+
+          CHECK_CONST_UINT_OPERAND("Component Count", 6);
+          uint32_t component_count = inst->word(6);
+          if (vulkanDebugInfo) {
+            uint64_t const_val;
+            if (!_.GetConstantValUint64(component_count, &const_val)) {
+              return _.diag(SPV_ERROR_INVALID_DATA, inst)
+                     << ext_inst_name()
+                     << ": Component Count must be 32-bit integer OpConstant";
             }
-          } else if (component_count->words().size() > 6 &&
-                     (OpenCLDebugInfo100Instructions(component_count->word(
-                          4)) == OpenCLDebugInfo100DebugLocalVariable ||
-                      OpenCLDebugInfo100Instructions(component_count->word(
-                          4)) == OpenCLDebugInfo100DebugGlobalVariable)) {
-            auto* component_count_type = _.FindDef(component_count->word(6));
-            if (component_count_type->words().size() > 7) {
-              if (OpenCLDebugInfo100Instructions(component_count_type->word(
-                      4)) != OpenCLDebugInfo100DebugTypeBasic ||
-                  OpenCLDebugInfo100DebugBaseTypeAttributeEncoding(
-                      component_count_type->word(7)) !=
-                      OpenCLDebugInfo100Unsigned) {
+            component_count = const_val & 0xffffffff;
+          }
+
+          if (!component_count || component_count > 4) {
+            return _.diag(SPV_ERROR_INVALID_DATA, inst)
+                   << ext_inst_name() << ": Component Count must be positive "
+                   << "integer less than or equal to 4";
+          }
+          break;
+        }
+        case CommonDebugInfoDebugTypeArray: {
+          auto validate_base_type = ValidateOperandDebugType(
+              _, "Base Type", inst, 5, ext_inst_name, false);
+          if (validate_base_type != SPV_SUCCESS) return validate_base_type;
+          for (uint32_t i = 6; i < num_words; ++i) {
+            bool invalid = false;
+            auto* component_count = _.FindDef(inst->word(i));
+            if (IsConstIntScalarTypeWith32Or64Bits(_, component_count)) {
+              // TODO: We need a spec discussion for the bindless array.
+              if (!component_count->word(3)) {
                 invalid = true;
-              } else {
-                // DebugTypeBasic for DebugLocalVariable/DebugGlobalVariable
-                // must have Unsigned encoding and 32 or 64 as its size in bits.
-                Instruction* size_in_bits =
-                    _.FindDef(component_count_type->word(6));
-                if (!_.IsIntScalarType(size_in_bits->type_id()) ||
-                    (size_in_bits->word(3) != 32 &&
-                     size_in_bits->word(3) != 64)) {
+              }
+            } else if (component_count->words().size() > 6 &&
+                       (CommonDebugInfoInstructions(component_count->word(4)) ==
+                            CommonDebugInfoDebugLocalVariable ||
+                        CommonDebugInfoInstructions(component_count->word(4)) ==
+                            CommonDebugInfoDebugGlobalVariable)) {
+              auto* component_count_type = _.FindDef(component_count->word(6));
+              if (component_count_type->words().size() > 7) {
+                uint32_t encoding = component_count_type->word(7);
+                if (CommonDebugInfoInstructions(component_count_type->word(
+                        4)) != CommonDebugInfoDebugTypeBasic ||
+                    (vulkanDebugInfo && !IsUint32Constant(_, encoding)) ||
+                    OpenCLDebugInfo100DebugBaseTypeAttributeEncoding(
+                        vulkanDebugInfo
+                            ? GetUint32Constant(_, encoding)
+                            : encoding) != OpenCLDebugInfo100Unsigned) {
                   invalid = true;
+                } else {
+                  // DebugTypeBasic for DebugLocalVariable/DebugGlobalVariable
+                  // must have Unsigned encoding and 32 or 64 as its size in
+                  // bits.
+                  Instruction* size_in_bits =
+                      _.FindDef(component_count_type->word(6));
+                  if (!_.IsIntScalarType(size_in_bits->type_id()) ||
+                      (size_in_bits->word(3) != 32 &&
+                       size_in_bits->word(3) != 64)) {
+                    invalid = true;
+                  }
                 }
+              } else {
+                invalid = true;
               }
             } else {
               invalid = true;
             }
+            if (invalid) {
+              return _.diag(SPV_ERROR_INVALID_DATA, inst)
+                     << ext_inst_name() << ": Component Count must be "
+                     << "OpConstant with a 32- or 64-bits integer scalar type "
+                        "or "
+                     << "DebugGlobalVariable or DebugLocalVariable with a 32- "
+                        "or "
+                     << "64-bits unsigned integer scalar type";
+            }
+          }
+          break;
+        }
+        case CommonDebugInfoDebugTypedef: {
+          CHECK_OPERAND("Name", SpvOpString, 5);
+          auto validate_base_type =
+              ValidateOperandBaseType(_, inst, 6, ext_inst_name);
+          if (validate_base_type != SPV_SUCCESS) return validate_base_type;
+          CHECK_DEBUG_OPERAND("Source", CommonDebugInfoDebugSource, 7);
+          CHECK_CONST_UINT_OPERAND("Line", 8);
+          CHECK_CONST_UINT_OPERAND("Column", 9);
+          auto validate_parent =
+              ValidateOperandLexicalScope(_, "Parent", inst, 10, ext_inst_name);
+          if (validate_parent != SPV_SUCCESS) return validate_parent;
+          break;
+        }
+        case CommonDebugInfoDebugTypeFunction: {
+          CHECK_CONST_UINT_OPERAND("Flags", 5);
+          auto* return_type = _.FindDef(inst->word(6));
+          // TODO: We need a spec discussion that we have to allow return and
+          // parameter types of a DebugTypeFunction to have template parameter.
+          if (return_type->opcode() != SpvOpTypeVoid) {
+            auto validate_return = ValidateOperandDebugType(
+                _, "Return Type", inst, 6, ext_inst_name, true);
+            if (validate_return != SPV_SUCCESS) return validate_return;
+          }
+          for (uint32_t word_index = 7; word_index < num_words; ++word_index) {
+            auto validate_param = ValidateOperandDebugType(
+                _, "Parameter Types", inst, word_index, ext_inst_name, true);
+            if (validate_param != SPV_SUCCESS) return validate_param;
+          }
+          break;
+        }
+        case CommonDebugInfoDebugTypeEnum: {
+          CHECK_OPERAND("Name", SpvOpString, 5);
+          if (!DoesDebugInfoOperandMatchExpectation(
+                  _,
+                  [](CommonDebugInfoInstructions dbg_inst) {
+                    return dbg_inst == CommonDebugInfoDebugInfoNone;
+                  },
+                  inst, 6)) {
+            auto validate_underlying_type = ValidateOperandDebugType(
+                _, "Underlying Types", inst, 6, ext_inst_name, false);
+            if (validate_underlying_type != SPV_SUCCESS)
+              return validate_underlying_type;
+          }
+          CHECK_DEBUG_OPERAND("Source", CommonDebugInfoDebugSource, 7);
+          CHECK_CONST_UINT_OPERAND("Line", 8);
+          CHECK_CONST_UINT_OPERAND("Column", 9);
+          auto validate_parent =
+              ValidateOperandLexicalScope(_, "Parent", inst, 10, ext_inst_name);
+          if (validate_parent != SPV_SUCCESS) return validate_parent;
+          CHECK_OPERAND("Size", SpvOpConstant, 11);
+          auto* size = _.FindDef(inst->word(11));
+          if (!_.IsIntScalarType(size->type_id()) || !size->word(3)) {
+            return _.diag(SPV_ERROR_INVALID_DATA, inst)
+                   << ext_inst_name() << ": expected operand Size is a "
+                   << "positive integer";
+          }
+          CHECK_CONST_UINT_OPERAND("Flags", 12);
+          for (uint32_t word_index = 13; word_index + 1 < num_words;
+               word_index += 2) {
+            CHECK_OPERAND("Value", SpvOpConstant, word_index);
+            CHECK_OPERAND("Name", SpvOpString, word_index + 1);
+          }
+          break;
+        }
+        case CommonDebugInfoDebugTypeComposite: {
+          CHECK_OPERAND("Name", SpvOpString, 5);
+          CHECK_DEBUG_OPERAND("Source", CommonDebugInfoDebugSource, 7);
+          CHECK_CONST_UINT_OPERAND("Line", 8);
+          CHECK_CONST_UINT_OPERAND("Column", 9);
+          auto validate_parent =
+              ValidateOperandLexicalScope(_, "Parent", inst, 10, ext_inst_name);
+          if (validate_parent != SPV_SUCCESS) return validate_parent;
+          CHECK_OPERAND("Linkage Name", SpvOpString, 11);
+          if (!DoesDebugInfoOperandMatchExpectation(
+                  _,
+                  [](CommonDebugInfoInstructions dbg_inst) {
+                    return dbg_inst == CommonDebugInfoDebugInfoNone;
+                  },
+                  inst, 12)) {
+            CHECK_OPERAND("Size", SpvOpConstant, 12);
+          }
+          CHECK_CONST_UINT_OPERAND("Flags", 13);
+          for (uint32_t word_index = 14; word_index < num_words; ++word_index) {
+            if (!DoesDebugInfoOperandMatchExpectation(
+                    _,
+                    [](CommonDebugInfoInstructions dbg_inst) {
+                      return dbg_inst == CommonDebugInfoDebugTypeMember ||
+                             dbg_inst == CommonDebugInfoDebugFunction ||
+                             dbg_inst == CommonDebugInfoDebugTypeInheritance;
+                    },
+                    inst, word_index)) {
+              return _.diag(SPV_ERROR_INVALID_DATA, inst)
+                     << ext_inst_name() << ": "
+                     << "expected operand Members "
+                     << "must be DebugTypeMember, DebugFunction, or "
+                        "DebugTypeInheritance";
+            }
+          }
+          break;
+        }
+        case CommonDebugInfoDebugTypeMember: {
+          CHECK_OPERAND("Name", SpvOpString, 5);
+          // TODO: We need a spec discussion that we have to allow member types
+          // to have template parameter.
+          auto validate_type =
+              ValidateOperandDebugType(_, "Type", inst, 6, ext_inst_name, true);
+          if (validate_type != SPV_SUCCESS) return validate_type;
+          CHECK_DEBUG_OPERAND("Source", CommonDebugInfoDebugSource, 7);
+          CHECK_CONST_UINT_OPERAND("Line", 8);
+          CHECK_CONST_UINT_OPERAND("Column", 9);
+          // NonSemantic.Vulkan.DebugInfo doesn't have the Parent operand
+          if (vulkanDebugInfo) {
+            CHECK_OPERAND("Offset", SpvOpConstant, 10);
+            CHECK_OPERAND("Size", SpvOpConstant, 11);
+            CHECK_CONST_UINT_OPERAND("Flags", 12);
+            if (num_words == 14) CHECK_OPERAND("Value", SpvOpConstant, 13);
           } else {
-            invalid = true;
+            CHECK_DEBUG_OPERAND("Parent", CommonDebugInfoDebugTypeComposite,
+                                10);
+            CHECK_OPERAND("Offset", SpvOpConstant, 11);
+            CHECK_OPERAND("Size", SpvOpConstant, 12);
+            CHECK_CONST_UINT_OPERAND("Flags", 13);
+            if (num_words == 15) CHECK_OPERAND("Value", SpvOpConstant, 14);
           }
-          if (invalid) {
-            return _.diag(SPV_ERROR_INVALID_DATA, inst)
-                   << ext_inst_name() << ": Component Count must be "
-                   << "OpConstant with a 32- or 64-bits integer scalar type or "
-                   << "DebugGlobalVariable or DebugLocalVariable with a 32- or "
-                   << "64-bits unsigned integer scalar type";
-          }
+          break;
         }
-        break;
-      }
-      case OpenCLDebugInfo100DebugTypedef: {
-        CHECK_OPERAND("Name", SpvOpString, 5);
-        auto validate_base_type =
-            ValidateOperandBaseType(_, inst, 6, ext_inst_name);
-        if (validate_base_type != SPV_SUCCESS) return validate_base_type;
-        CHECK_DEBUG_OPERAND("Source", OpenCLDebugInfo100DebugSource, 7);
-        auto validate_parent =
-            ValidateOperandLexicalScope(_, "Parent", inst, 10, ext_inst_name);
-        if (validate_parent != SPV_SUCCESS) return validate_parent;
-        break;
-      }
-      case OpenCLDebugInfo100DebugTypeFunction: {
-        auto* return_type = _.FindDef(inst->word(6));
-        // TODO: We need a spec discussion that we have to allow return and
-        // parameter types of a DebugTypeFunction to have template parameter.
-        if (return_type->opcode() != SpvOpTypeVoid) {
-          auto validate_return = ValidateOperandDebugType(
-              _, "Return Type", inst, 6, ext_inst_name, true);
-          if (validate_return != SPV_SUCCESS) return validate_return;
-        }
-        for (uint32_t word_index = 7; word_index < num_words; ++word_index) {
-          auto validate_param = ValidateOperandDebugType(
-              _, "Parameter Types", inst, word_index, ext_inst_name, true);
-          if (validate_param != SPV_SUCCESS) return validate_param;
-        }
-        break;
-      }
-      case OpenCLDebugInfo100DebugTypeEnum: {
-        CHECK_OPERAND("Name", SpvOpString, 5);
-        if (!DoesDebugInfoOperandMatchExpectation(
-                _,
-                [](OpenCLDebugInfo100Instructions dbg_inst) {
-                  return dbg_inst == OpenCLDebugInfo100DebugInfoNone;
-                },
-                inst, 6)) {
-          auto validate_underlying_type = ValidateOperandDebugType(
-              _, "Underlying Types", inst, 6, ext_inst_name, false);
-          if (validate_underlying_type != SPV_SUCCESS)
-            return validate_underlying_type;
-        }
-        CHECK_DEBUG_OPERAND("Source", OpenCLDebugInfo100DebugSource, 7);
-        auto validate_parent =
-            ValidateOperandLexicalScope(_, "Parent", inst, 10, ext_inst_name);
-        if (validate_parent != SPV_SUCCESS) return validate_parent;
-        CHECK_OPERAND("Size", SpvOpConstant, 11);
-        auto* size = _.FindDef(inst->word(11));
-        if (!_.IsIntScalarType(size->type_id()) || !size->word(3)) {
-          return _.diag(SPV_ERROR_INVALID_DATA, inst)
-                 << ext_inst_name() << ": expected operand Size is a "
-                 << "positive integer";
-        }
-        for (uint32_t word_index = 13; word_index + 1 < num_words;
-             word_index += 2) {
-          CHECK_OPERAND("Value", SpvOpConstant, word_index);
-          CHECK_OPERAND("Name", SpvOpString, word_index + 1);
-        }
-        break;
-      }
-      case OpenCLDebugInfo100DebugTypeComposite: {
-        CHECK_OPERAND("Name", SpvOpString, 5);
-        CHECK_DEBUG_OPERAND("Source", OpenCLDebugInfo100DebugSource, 7);
-        auto validate_parent =
-            ValidateOperandLexicalScope(_, "Parent", inst, 10, ext_inst_name);
-        if (validate_parent != SPV_SUCCESS) return validate_parent;
-        CHECK_OPERAND("Linkage Name", SpvOpString, 11);
-        if (!DoesDebugInfoOperandMatchExpectation(
-                _,
-                [](OpenCLDebugInfo100Instructions dbg_inst) {
-                  return dbg_inst == OpenCLDebugInfo100DebugInfoNone;
-                },
-                inst, 12)) {
-          CHECK_OPERAND("Size", SpvOpConstant, 12);
-        }
-        for (uint32_t word_index = 14; word_index < num_words; ++word_index) {
-          if (!DoesDebugInfoOperandMatchExpectation(
-                  _,
-                  [](OpenCLDebugInfo100Instructions dbg_inst) {
-                    return dbg_inst == OpenCLDebugInfo100DebugTypeMember ||
-                           dbg_inst == OpenCLDebugInfo100DebugFunction ||
-                           dbg_inst == OpenCLDebugInfo100DebugTypeInheritance;
-                  },
-                  inst, word_index)) {
+        case CommonDebugInfoDebugTypeInheritance: {
+          CHECK_DEBUG_OPERAND("Child", CommonDebugInfoDebugTypeComposite, 5);
+          auto* debug_inst = _.FindDef(inst->word(5));
+          auto composite_type =
+              OpenCLDebugInfo100DebugCompositeType(debug_inst->word(6));
+          if (composite_type != OpenCLDebugInfo100Class &&
+              composite_type != OpenCLDebugInfo100Structure) {
             return _.diag(SPV_ERROR_INVALID_DATA, inst)
                    << ext_inst_name() << ": "
-                   << "expected operand Members "
-                   << "must be DebugTypeMember, DebugFunction, or "
-                      "DebugTypeInheritance";
+                   << "expected operand Child must be class or struct debug "
+                      "type";
           }
-        }
-        break;
-      }
-      case OpenCLDebugInfo100DebugTypeMember: {
-        CHECK_OPERAND("Name", SpvOpString, 5);
-        // TODO: We need a spec discussion that we have to allow member types
-        // to have template parameter.
-        auto validate_type =
-            ValidateOperandDebugType(_, "Type", inst, 6, ext_inst_name, true);
-        if (validate_type != SPV_SUCCESS) return validate_type;
-        CHECK_DEBUG_OPERAND("Source", OpenCLDebugInfo100DebugSource, 7);
-        CHECK_DEBUG_OPERAND("Parent", OpenCLDebugInfo100DebugTypeComposite, 10);
-        CHECK_OPERAND("Offset", SpvOpConstant, 11);
-        CHECK_OPERAND("Size", SpvOpConstant, 12);
-        if (num_words == 15) CHECK_OPERAND("Value", SpvOpConstant, 14);
-        break;
-      }
-      case OpenCLDebugInfo100DebugTypeInheritance: {
-        CHECK_DEBUG_OPERAND("Child", OpenCLDebugInfo100DebugTypeComposite, 5);
-        auto* debug_inst = _.FindDef(inst->word(5));
-        auto composite_type =
-            OpenCLDebugInfo100DebugCompositeType(debug_inst->word(6));
-        if (composite_type != OpenCLDebugInfo100Class &&
-            composite_type != OpenCLDebugInfo100Structure) {
-          return _.diag(SPV_ERROR_INVALID_DATA, inst)
-                 << ext_inst_name() << ": "
-                 << "expected operand Child must be class or struct debug type";
-        }
-        CHECK_DEBUG_OPERAND("Parent", OpenCLDebugInfo100DebugTypeComposite, 6);
-        debug_inst = _.FindDef(inst->word(6));
-        composite_type =
-            OpenCLDebugInfo100DebugCompositeType(debug_inst->word(6));
-        if (composite_type != OpenCLDebugInfo100Class &&
-            composite_type != OpenCLDebugInfo100Structure) {
-          return _.diag(SPV_ERROR_INVALID_DATA, inst)
-                 << ext_inst_name() << ": "
-                 << "expected operand Parent must be class or struct debug "
-                    "type";
-        }
-        CHECK_OPERAND("Offset", SpvOpConstant, 7);
-        CHECK_OPERAND("Size", SpvOpConstant, 8);
-        break;
-      }
-      case OpenCLDebugInfo100DebugFunction: {
-        CHECK_OPERAND("Name", SpvOpString, 5);
-        auto validate_type =
-            ValidateOperandDebugType(_, "Type", inst, 6, ext_inst_name, false);
-        if (validate_type != SPV_SUCCESS) return validate_type;
-        CHECK_DEBUG_OPERAND("Source", OpenCLDebugInfo100DebugSource, 7);
-        auto validate_parent =
-            ValidateOperandLexicalScope(_, "Parent", inst, 10, ext_inst_name);
-        if (validate_parent != SPV_SUCCESS) return validate_parent;
-        CHECK_OPERAND("Linkage Name", SpvOpString, 11);
-        if (!DoesDebugInfoOperandMatchExpectation(
-                _,
-                [](OpenCLDebugInfo100Instructions dbg_inst) {
-                  return dbg_inst == OpenCLDebugInfo100DebugInfoNone;
-                },
-                inst, 14)) {
-          CHECK_OPERAND("Function", SpvOpFunction, 14);
-        }
-        if (num_words == 16) {
-          CHECK_DEBUG_OPERAND("Declaration",
-                              OpenCLDebugInfo100DebugFunctionDeclaration, 15);
-        }
-        break;
-      }
-      case OpenCLDebugInfo100DebugFunctionDeclaration: {
-        CHECK_OPERAND("Name", SpvOpString, 5);
-        auto validate_type =
-            ValidateOperandDebugType(_, "Type", inst, 6, ext_inst_name, false);
-        if (validate_type != SPV_SUCCESS) return validate_type;
-        CHECK_DEBUG_OPERAND("Source", OpenCLDebugInfo100DebugSource, 7);
-        auto validate_parent =
-            ValidateOperandLexicalScope(_, "Parent", inst, 10, ext_inst_name);
-        if (validate_parent != SPV_SUCCESS) return validate_parent;
-        CHECK_OPERAND("Linkage Name", SpvOpString, 11);
-        break;
-      }
-      case OpenCLDebugInfo100DebugLexicalBlock: {
-        CHECK_DEBUG_OPERAND("Source", OpenCLDebugInfo100DebugSource, 5);
-        auto validate_parent =
-            ValidateOperandLexicalScope(_, "Parent", inst, 8, ext_inst_name);
-        if (validate_parent != SPV_SUCCESS) return validate_parent;
-        if (num_words == 10) CHECK_OPERAND("Name", SpvOpString, 9);
-        break;
-      }
-      case OpenCLDebugInfo100DebugScope: {
-        auto validate_scope =
-            ValidateOperandLexicalScope(_, "Scope", inst, 5, ext_inst_name);
-        if (validate_scope != SPV_SUCCESS) return validate_scope;
-        if (num_words == 7) {
-          CHECK_DEBUG_OPERAND("Inlined At", OpenCLDebugInfo100DebugInlinedAt,
-                              6);
-        }
-        break;
-      }
-      case OpenCLDebugInfo100DebugLocalVariable: {
-        CHECK_OPERAND("Name", SpvOpString, 5);
-        // TODO: We need a spec discussion that we have to allow local variable
-        // types to have template parameter.
-        auto validate_type =
-            ValidateOperandDebugType(_, "Type", inst, 6, ext_inst_name, true);
-        if (validate_type != SPV_SUCCESS) return validate_type;
-        CHECK_DEBUG_OPERAND("Source", OpenCLDebugInfo100DebugSource, 7);
-        auto validate_parent =
-            ValidateOperandLexicalScope(_, "Parent", inst, 10, ext_inst_name);
-        if (validate_parent != SPV_SUCCESS) return validate_parent;
-        break;
-      }
-      case OpenCLDebugInfo100DebugDeclare: {
-        CHECK_DEBUG_OPERAND("Local Variable",
-                            OpenCLDebugInfo100DebugLocalVariable, 5);
-        auto* operand = _.FindDef(inst->word(6));
-        if (operand->opcode() != SpvOpVariable &&
-            operand->opcode() != SpvOpFunctionParameter) {
-          return _.diag(SPV_ERROR_INVALID_DATA, inst)
-                 << ext_inst_name() << ": "
-                 << "expected operand Variable must be a result id of "
-                    "OpVariable or OpFunctionParameter";
-        }
-
-        CHECK_DEBUG_OPERAND("Expression", OpenCLDebugInfo100DebugExpression, 7);
-        break;
-      }
-      case OpenCLDebugInfo100DebugExpression: {
-        for (uint32_t word_index = 5; word_index < num_words; ++word_index) {
-          CHECK_DEBUG_OPERAND("Operation", OpenCLDebugInfo100DebugOperation,
-                              word_index);
-        }
-        break;
-      }
-      case OpenCLDebugInfo100DebugTypeTemplate: {
-        if (!DoesDebugInfoOperandMatchExpectation(
-                _,
-                [](OpenCLDebugInfo100Instructions dbg_inst) {
-                  return dbg_inst == OpenCLDebugInfo100DebugTypeComposite ||
-                         dbg_inst == OpenCLDebugInfo100DebugFunction;
-                },
-                inst, 5)) {
-          return _.diag(SPV_ERROR_INVALID_DATA, inst)
-                 << ext_inst_name() << ": "
-                 << "expected operand Target must be DebugTypeComposite "
-                 << "or DebugFunction";
-        }
-        for (uint32_t word_index = 6; word_index < num_words; ++word_index) {
-          if (!DoesDebugInfoOperandMatchExpectation(
-                  _,
-                  [](OpenCLDebugInfo100Instructions dbg_inst) {
-                    return dbg_inst ==
-                               OpenCLDebugInfo100DebugTypeTemplateParameter ||
-                           dbg_inst ==
-                               OpenCLDebugInfo100DebugTypeTemplateTemplateParameter;
-                  },
-                  inst, word_index)) {
+          CHECK_DEBUG_OPERAND("Parent", CommonDebugInfoDebugTypeComposite, 6);
+          debug_inst = _.FindDef(inst->word(6));
+          composite_type =
+              OpenCLDebugInfo100DebugCompositeType(debug_inst->word(6));
+          if (composite_type != OpenCLDebugInfo100Class &&
+              composite_type != OpenCLDebugInfo100Structure) {
             return _.diag(SPV_ERROR_INVALID_DATA, inst)
                    << ext_inst_name() << ": "
-                   << "expected operand Parameters must be "
-                   << "DebugTypeTemplateParameter or "
-                   << "DebugTypeTemplateTemplateParameter";
+                   << "expected operand Parent must be class or struct debug "
+                      "type";
           }
+          CHECK_OPERAND("Offset", SpvOpConstant, 7);
+          CHECK_OPERAND("Size", SpvOpConstant, 8);
+          CHECK_CONST_UINT_OPERAND("Flags", 9);
+          break;
         }
-        break;
-      }
-      case OpenCLDebugInfo100DebugTypeTemplateParameter: {
-        CHECK_OPERAND("Name", SpvOpString, 5);
-        auto validate_actual_type = ValidateOperandDebugType(
-            _, "Actual Type", inst, 6, ext_inst_name, false);
-        if (validate_actual_type != SPV_SUCCESS) return validate_actual_type;
-        if (!DoesDebugInfoOperandMatchExpectation(
-                _,
-                [](OpenCLDebugInfo100Instructions dbg_inst) {
-                  return dbg_inst == OpenCLDebugInfo100DebugInfoNone;
-                },
-                inst, 7)) {
-          CHECK_OPERAND("Value", SpvOpConstant, 7);
+        case CommonDebugInfoDebugFunction: {
+          CHECK_OPERAND("Name", SpvOpString, 5);
+          auto validate_type = ValidateOperandDebugType(_, "Type", inst, 6,
+                                                        ext_inst_name, false);
+          if (validate_type != SPV_SUCCESS) return validate_type;
+          CHECK_DEBUG_OPERAND("Source", CommonDebugInfoDebugSource, 7);
+          CHECK_CONST_UINT_OPERAND("Line", 8);
+          CHECK_CONST_UINT_OPERAND("Column", 9);
+          auto validate_parent =
+              ValidateOperandLexicalScope(_, "Parent", inst, 10, ext_inst_name);
+          if (validate_parent != SPV_SUCCESS) return validate_parent;
+          CHECK_OPERAND("Linkage Name", SpvOpString, 11);
+          CHECK_CONST_UINT_OPERAND("Flags", 12);
+          CHECK_CONST_UINT_OPERAND("Scope Line", 13);
+          // NonSemantic.Vulkan.DebugInfo.100 doesn't include a reference to the
+          // OpFunction
+          if (vulkanDebugInfo) {
+            if (num_words == 15) {
+              CHECK_DEBUG_OPERAND("Declaration",
+                                  CommonDebugInfoDebugFunctionDeclaration, 14);
+            }
+          } else {
+            if (!DoesDebugInfoOperandMatchExpectation(
+                    _,
+                    [](CommonDebugInfoInstructions dbg_inst) {
+                      return dbg_inst == CommonDebugInfoDebugInfoNone;
+                    },
+                    inst, 14)) {
+              CHECK_OPERAND("Function", SpvOpFunction, 14);
+            }
+            if (num_words == 16) {
+              CHECK_DEBUG_OPERAND("Declaration",
+                                  CommonDebugInfoDebugFunctionDeclaration, 15);
+            }
+          }
+          break;
         }
-        CHECK_DEBUG_OPERAND("Source", OpenCLDebugInfo100DebugSource, 8);
-        break;
-      }
-      case OpenCLDebugInfo100DebugGlobalVariable: {
-        CHECK_OPERAND("Name", SpvOpString, 5);
-        auto validate_type =
-            ValidateOperandDebugType(_, "Type", inst, 6, ext_inst_name, false);
-        if (validate_type != SPV_SUCCESS) return validate_type;
-        CHECK_DEBUG_OPERAND("Source", OpenCLDebugInfo100DebugSource, 7);
-        auto validate_scope =
-            ValidateOperandLexicalScope(_, "Scope", inst, 10, ext_inst_name);
-        if (validate_scope != SPV_SUCCESS) return validate_scope;
-        CHECK_OPERAND("Linkage Name", SpvOpString, 11);
-        if (!DoesDebugInfoOperandMatchExpectation(
-                _,
-                [](OpenCLDebugInfo100Instructions dbg_inst) {
-                  return dbg_inst == OpenCLDebugInfo100DebugInfoNone;
-                },
-                inst, 12)) {
-          auto* operand = _.FindDef(inst->word(12));
+        case CommonDebugInfoDebugFunctionDeclaration: {
+          CHECK_OPERAND("Name", SpvOpString, 5);
+          auto validate_type = ValidateOperandDebugType(_, "Type", inst, 6,
+                                                        ext_inst_name, false);
+          if (validate_type != SPV_SUCCESS) return validate_type;
+          CHECK_DEBUG_OPERAND("Source", CommonDebugInfoDebugSource, 7);
+          CHECK_CONST_UINT_OPERAND("Line", 8);
+          CHECK_CONST_UINT_OPERAND("Column", 9);
+          auto validate_parent =
+              ValidateOperandLexicalScope(_, "Parent", inst, 10, ext_inst_name);
+          if (validate_parent != SPV_SUCCESS) return validate_parent;
+          CHECK_OPERAND("Linkage Name", SpvOpString, 11);
+          CHECK_CONST_UINT_OPERAND("Flags", 12);
+          break;
+        }
+        case CommonDebugInfoDebugLexicalBlock: {
+          CHECK_DEBUG_OPERAND("Source", CommonDebugInfoDebugSource, 5);
+          CHECK_CONST_UINT_OPERAND("Line", 6);
+          CHECK_CONST_UINT_OPERAND("Column", 7);
+          auto validate_parent =
+              ValidateOperandLexicalScope(_, "Parent", inst, 8, ext_inst_name);
+          if (validate_parent != SPV_SUCCESS) return validate_parent;
+          if (num_words == 10) CHECK_OPERAND("Name", SpvOpString, 9);
+          break;
+        }
+        case CommonDebugInfoDebugScope: {
+          auto validate_scope =
+              ValidateOperandLexicalScope(_, "Scope", inst, 5, ext_inst_name);
+          if (validate_scope != SPV_SUCCESS) return validate_scope;
+          if (num_words == 7) {
+            CHECK_DEBUG_OPERAND("Inlined At", CommonDebugInfoDebugInlinedAt, 6);
+          }
+          break;
+        }
+        case CommonDebugInfoDebugLocalVariable: {
+          CHECK_OPERAND("Name", SpvOpString, 5);
+          // TODO: We need a spec discussion that we have to allow local
+          // variable types to have template parameter.
+          auto validate_type =
+              ValidateOperandDebugType(_, "Type", inst, 6, ext_inst_name, true);
+          if (validate_type != SPV_SUCCESS) return validate_type;
+          CHECK_DEBUG_OPERAND("Source", CommonDebugInfoDebugSource, 7);
+          CHECK_CONST_UINT_OPERAND("Line", 8);
+          CHECK_CONST_UINT_OPERAND("Column", 9);
+          auto validate_parent =
+              ValidateOperandLexicalScope(_, "Parent", inst, 10, ext_inst_name);
+          if (validate_parent != SPV_SUCCESS) return validate_parent;
+          CHECK_CONST_UINT_OPERAND("Flags", 11);
+          if (num_words == 13) {
+            CHECK_CONST_UINT_OPERAND("ArgNumber", 12);
+          }
+          break;
+        }
+        case CommonDebugInfoDebugDeclare: {
+          CHECK_DEBUG_OPERAND("Local Variable",
+                              CommonDebugInfoDebugLocalVariable, 5);
+          auto* operand = _.FindDef(inst->word(6));
           if (operand->opcode() != SpvOpVariable &&
-              operand->opcode() != SpvOpConstant) {
+              operand->opcode() != SpvOpFunctionParameter) {
             return _.diag(SPV_ERROR_INVALID_DATA, inst)
                    << ext_inst_name() << ": "
                    << "expected operand Variable must be a result id of "
-                      "OpVariable or OpConstant or DebugInfoNone";
+                      "OpVariable or OpFunctionParameter";
           }
-        }
-        if (num_words == 15) {
-          CHECK_DEBUG_OPERAND("Static Member Declaration",
-                              OpenCLDebugInfo100DebugTypeMember, 14);
-        }
-        break;
-      }
-      case OpenCLDebugInfo100DebugInlinedAt: {
-        auto validate_scope =
-            ValidateOperandLexicalScope(_, "Scope", inst, 6, ext_inst_name);
-        if (validate_scope != SPV_SUCCESS) return validate_scope;
-        if (num_words == 8) {
-          CHECK_DEBUG_OPERAND("Inlined", OpenCLDebugInfo100DebugInlinedAt, 7);
-        }
-        break;
-      }
-      case OpenCLDebugInfo100DebugValue: {
-        CHECK_DEBUG_OPERAND("Local Variable",
-                            OpenCLDebugInfo100DebugLocalVariable, 5);
-        CHECK_DEBUG_OPERAND("Expression", OpenCLDebugInfo100DebugExpression, 7);
 
-        for (uint32_t word_index = 8; word_index < num_words; ++word_index) {
-          // TODO: The following code simply checks if it is a const int scalar
-          // or a DebugLocalVariable or DebugGlobalVariable, but we have to
-          // check it using the same validation for Indexes of OpAccessChain.
-          if (!IsConstWithIntScalarType(_, inst, word_index) &&
-              !IsDebugVariableWithIntScalarType(_, inst, word_index)) {
+          CHECK_DEBUG_OPERAND("Expression", CommonDebugInfoDebugExpression, 7);
+
+          if (vulkanDebugInfo) {
+            for (uint32_t word_index = 8; word_index < num_words;
+                 ++word_index) {
+              auto index_inst = _.FindDef(inst->word(word_index));
+              auto type_id = index_inst != nullptr ? index_inst->type_id() : 0;
+              if (type_id == 0 || !IsIntScalar(_, type_id, false, false))
+                return _.diag(SPV_ERROR_INVALID_DATA, inst)
+                       << ext_inst_name() << ": "
+                       << "expected index must be scalar integer";
+            }
+          }
+          break;
+        }
+        case CommonDebugInfoDebugExpression: {
+          for (uint32_t word_index = 5; word_index < num_words; ++word_index) {
+            CHECK_DEBUG_OPERAND("Operation", CommonDebugInfoDebugOperation,
+                                word_index);
+          }
+          break;
+        }
+        case CommonDebugInfoDebugTypeTemplate: {
+          if (!DoesDebugInfoOperandMatchExpectation(
+                  _,
+                  [](CommonDebugInfoInstructions dbg_inst) {
+                    return dbg_inst == CommonDebugInfoDebugTypeComposite ||
+                           dbg_inst == CommonDebugInfoDebugFunction;
+                  },
+                  inst, 5)) {
             return _.diag(SPV_ERROR_INVALID_DATA, inst)
-                   << ext_inst_name() << ": expected operand Indexes is "
-                   << "OpConstant, DebugGlobalVariable, or "
-                   << "type is OpConstant with an integer scalar type";
+                   << ext_inst_name() << ": "
+                   << "expected operand Target must be DebugTypeComposite "
+                   << "or DebugFunction";
           }
+          for (uint32_t word_index = 6; word_index < num_words; ++word_index) {
+            if (!DoesDebugInfoOperandMatchExpectation(
+                    _,
+                    [](CommonDebugInfoInstructions dbg_inst) {
+                      return dbg_inst ==
+                                 CommonDebugInfoDebugTypeTemplateParameter ||
+                             dbg_inst ==
+                                 CommonDebugInfoDebugTypeTemplateTemplateParameter;
+                    },
+                    inst, word_index)) {
+              return _.diag(SPV_ERROR_INVALID_DATA, inst)
+                     << ext_inst_name() << ": "
+                     << "expected operand Parameters must be "
+                     << "DebugTypeTemplateParameter or "
+                     << "DebugTypeTemplateTemplateParameter";
+            }
+          }
+          break;
         }
-        break;
-      }
+        case CommonDebugInfoDebugTypeTemplateParameter: {
+          CHECK_OPERAND("Name", SpvOpString, 5);
+          auto validate_actual_type = ValidateOperandDebugType(
+              _, "Actual Type", inst, 6, ext_inst_name, false);
+          if (validate_actual_type != SPV_SUCCESS) return validate_actual_type;
+          if (!DoesDebugInfoOperandMatchExpectation(
+                  _,
+                  [](CommonDebugInfoInstructions dbg_inst) {
+                    return dbg_inst == CommonDebugInfoDebugInfoNone;
+                  },
+                  inst, 7)) {
+            CHECK_OPERAND("Value", SpvOpConstant, 7);
+          }
+          CHECK_DEBUG_OPERAND("Source", CommonDebugInfoDebugSource, 8);
+          CHECK_CONST_UINT_OPERAND("Line", 9);
+          CHECK_CONST_UINT_OPERAND("Column", 10);
+          break;
+        }
+        case CommonDebugInfoDebugGlobalVariable: {
+          CHECK_OPERAND("Name", SpvOpString, 5);
+          auto validate_type = ValidateOperandDebugType(_, "Type", inst, 6,
+                                                        ext_inst_name, false);
+          if (validate_type != SPV_SUCCESS) return validate_type;
+          CHECK_DEBUG_OPERAND("Source", CommonDebugInfoDebugSource, 7);
+          CHECK_CONST_UINT_OPERAND("Line", 8);
+          CHECK_CONST_UINT_OPERAND("Column", 9);
+          auto validate_scope =
+              ValidateOperandLexicalScope(_, "Scope", inst, 10, ext_inst_name);
+          if (validate_scope != SPV_SUCCESS) return validate_scope;
+          CHECK_OPERAND("Linkage Name", SpvOpString, 11);
+          if (!DoesDebugInfoOperandMatchExpectation(
+                  _,
+                  [](CommonDebugInfoInstructions dbg_inst) {
+                    return dbg_inst == CommonDebugInfoDebugInfoNone;
+                  },
+                  inst, 12)) {
+            auto* operand = _.FindDef(inst->word(12));
+            if (operand->opcode() != SpvOpVariable &&
+                operand->opcode() != SpvOpConstant) {
+              return _.diag(SPV_ERROR_INVALID_DATA, inst)
+                     << ext_inst_name() << ": "
+                     << "expected operand Variable must be a result id of "
+                        "OpVariable or OpConstant or DebugInfoNone";
+            }
+          }
+          if (num_words == 15) {
+            CHECK_DEBUG_OPERAND("Static Member Declaration",
+                                CommonDebugInfoDebugTypeMember, 14);
+          }
+          break;
+        }
+        case CommonDebugInfoDebugInlinedAt: {
+          CHECK_CONST_UINT_OPERAND("Line", 5);
+          auto validate_scope =
+              ValidateOperandLexicalScope(_, "Scope", inst, 6, ext_inst_name);
+          if (validate_scope != SPV_SUCCESS) return validate_scope;
+          if (num_words == 8) {
+            CHECK_DEBUG_OPERAND("Inlined", CommonDebugInfoDebugInlinedAt, 7);
+          }
+          break;
+        }
+        case CommonDebugInfoDebugValue: {
+          CHECK_DEBUG_OPERAND("Local Variable",
+                              CommonDebugInfoDebugLocalVariable, 5);
+          CHECK_DEBUG_OPERAND("Expression", CommonDebugInfoDebugExpression, 7);
 
-      // TODO: Add validation rules for remaining cases as well.
-      case OpenCLDebugInfo100DebugTypePtrToMember:
-      case OpenCLDebugInfo100DebugTypeTemplateTemplateParameter:
-      case OpenCLDebugInfo100DebugTypeTemplateParameterPack:
-      case OpenCLDebugInfo100DebugLexicalBlockDiscriminator:
-      case OpenCLDebugInfo100DebugInlinedVariable:
-      case OpenCLDebugInfo100DebugMacroDef:
-      case OpenCLDebugInfo100DebugMacroUndef:
-      case OpenCLDebugInfo100DebugImportedEntity:
-      case OpenCLDebugInfo100DebugModuleINTEL:
-        break;
-      case OpenCLDebugInfo100InstructionsMax:
-        assert(0);
-        break;
+          for (uint32_t word_index = 8; word_index < num_words; ++word_index) {
+            // TODO: The following code simply checks if it is a const int
+            // scalar or a DebugLocalVariable or DebugGlobalVariable, but we
+            // have to check it using the same validation for Indexes of
+            // OpAccessChain.
+            if (!IsConstWithIntScalarType(_, inst, word_index) &&
+                !IsDebugVariableWithIntScalarType(_, inst, word_index)) {
+              return _.diag(SPV_ERROR_INVALID_DATA, inst)
+                     << ext_inst_name() << ": expected operand Indexes is "
+                     << "OpConstant, DebugGlobalVariable, or "
+                     << "type is OpConstant with an integer scalar type";
+            }
+          }
+          break;
+        }
+
+        // TODO: Add validation rules for remaining cases as well.
+        case CommonDebugInfoDebugTypePtrToMember:
+        case CommonDebugInfoDebugTypeTemplateTemplateParameter:
+        case CommonDebugInfoDebugTypeTemplateParameterPack:
+        case CommonDebugInfoDebugLexicalBlockDiscriminator:
+        case CommonDebugInfoDebugInlinedVariable:
+        case CommonDebugInfoDebugMacroDef:
+        case CommonDebugInfoDebugMacroUndef:
+        case CommonDebugInfoDebugImportedEntity:
+          break;
+        case CommonDebugInfoInstructionsMax:
+          assert(0);
+          break;
+      }
     }
   } else if (ext_inst_type == SPV_EXT_INST_TYPE_NONSEMANTIC_CLSPVREFLECTION) {
     auto import_inst = _.FindDef(inst->GetOperandAs<uint32_t>(2));
diff --git a/third_party/vulkan-deps/spirv-tools/src/source/val/validate_interfaces.cpp b/third_party/vulkan-deps/spirv-tools/src/source/val/validate_interfaces.cpp
index d16d48e..d3ef538 100644
--- a/third_party/vulkan-deps/spirv-tools/src/source/val/validate_interfaces.cpp
+++ b/third_party/vulkan-deps/spirv-tools/src/source/val/validate_interfaces.cpp
@@ -27,6 +27,10 @@
 namespace val {
 namespace {
 
+// Limit the number of checked locations to 4096. Multiplied by 4 to represent
+// all the components. This limit is set to be well beyond practical use cases.
+const uint32_t kMaxLocations = 4096 * 4;
+
 // Returns true if \c inst is an input or output variable.
 bool is_interface_variable(const Instruction* inst, bool is_spv_1_4) {
   if (is_spv_1_4) {
@@ -347,6 +351,11 @@
       uint32_t num_components = NumConsumedComponents(_, sub_type);
       uint32_t array_location = location + (num_locations * array_idx);
       uint32_t start = array_location * 4;
+      if (kMaxLocations <= start) {
+        // Too many locations, give up.
+        break;
+      }
+
       uint32_t end = (array_location + num_locations) * 4;
       if (num_components != 0) {
         start += component;
@@ -416,6 +425,11 @@
       }
 
       uint32_t start = location * 4;
+      if (kMaxLocations <= start) {
+        // Too many locations, give up.
+        continue;
+      }
+
       uint32_t end = (location + num_locations) * 4;
       if (num_components != 0) {
         start += component;
@@ -454,6 +468,7 @@
   std::unordered_set<uint32_t> input_locations;
   std::unordered_set<uint32_t> output_locations_index0;
   std::unordered_set<uint32_t> output_locations_index1;
+  std::unordered_set<uint32_t> seen;
   for (uint32_t i = 3; i < entry_point->operands().size(); ++i) {
     auto interface_id = entry_point->GetOperandAs<uint32_t>(i);
     auto interface_var = _.FindDef(interface_id);
@@ -462,6 +477,11 @@
         storage_class != SpvStorageClassOutput) {
       continue;
     }
+    if (!seen.insert(interface_id).second) {
+      // Pre-1.4 an interface variable could be listed multiple times in an
+      // entry point. Validation for 1.4 or later is done elsewhere.
+      continue;
+    }
 
     auto locations = (storage_class == SpvStorageClassInput)
                          ? &input_locations
diff --git a/third_party/vulkan-deps/spirv-tools/src/source/val/validate_layout.cpp b/third_party/vulkan-deps/spirv-tools/src/source/val/validate_layout.cpp
index b53f991..e6f4fca 100644
--- a/third_party/vulkan-deps/spirv-tools/src/source/val/validate_layout.cpp
+++ b/third_party/vulkan-deps/spirv-tools/src/source/val/validate_layout.cpp
@@ -17,6 +17,7 @@
 #include <cassert>
 
 #include "DebugInfo.h"
+#include "NonSemanticVulkanDebugInfo100.h"
 #include "OpenCLDebugInfo100.h"
 #include "source/diagnostic.h"
 #include "source/opcode.h"
@@ -37,17 +38,7 @@
                                       const Instruction* inst, SpvOp opcode) {
   switch (opcode) {
     case SpvOpExtInst:
-      if (spvExtInstIsNonSemantic(inst->ext_inst_type())) {
-        // non-semantic extinst opcodes are allowed beginning in the types
-        // section, but since they must name a return type they cannot be the
-        // first instruction in the types section. Therefore check that we are
-        // already in it.
-        if (_.current_layout_section() < kLayoutTypes) {
-          return _.diag(SPV_ERROR_INVALID_LAYOUT, inst)
-                 << "Non-semantic OpExtInst must not appear before types "
-                 << "section";
-        }
-      } else if (spvExtInstIsDebugInfo(inst->ext_inst_type())) {
+      if (spvExtInstIsDebugInfo(inst->ext_inst_type())) {
         const uint32_t ext_inst_index = inst->word(4);
         bool local_debug_info = false;
         if (inst->ext_inst_type() == SPV_EXT_INST_TYPE_OPENCL_DEBUGINFO_100) {
@@ -59,6 +50,18 @@
               ext_inst_key == OpenCLDebugInfo100DebugValue) {
             local_debug_info = true;
           }
+        } else if (inst->ext_inst_type() ==
+                   SPV_EXT_INST_TYPE_NONSEMANTIC_VULKAN_DEBUGINFO_100) {
+          const NonSemanticVulkanDebugInfo100Instructions ext_inst_key =
+              NonSemanticVulkanDebugInfo100Instructions(ext_inst_index);
+          if (ext_inst_key == NonSemanticVulkanDebugInfo100DebugScope ||
+              ext_inst_key == NonSemanticVulkanDebugInfo100DebugNoScope ||
+              ext_inst_key == NonSemanticVulkanDebugInfo100DebugDeclare ||
+              ext_inst_key == NonSemanticVulkanDebugInfo100DebugValue ||
+              ext_inst_key ==
+                  NonSemanticVulkanDebugInfo100DebugFunctionDefinition) {
+            local_debug_info = true;
+          }
         } else {
           const DebugInfoInstructions ext_inst_key =
               DebugInfoInstructions(ext_inst_index);
@@ -94,6 +97,16 @@
                    << "declarations)";
           }
         }
+      } else if (spvExtInstIsNonSemantic(inst->ext_inst_type())) {
+        // non-semantic extinst opcodes are allowed beginning in the types
+        // section, but since they must name a return type they cannot be the
+        // first instruction in the types section. Therefore check that we are
+        // already in it.
+        if (_.current_layout_section() < kLayoutTypes) {
+          return _.diag(SPV_ERROR_INVALID_LAYOUT, inst)
+                 << "Non-semantic OpExtInst must not appear before types "
+                 << "section";
+        }
       } else {
         // otherwise they must be used in a block
         if (_.current_layout_section() < kLayoutFunctionDefinitions) {
@@ -230,20 +243,7 @@
         break;
 
       case SpvOpExtInst:
-        if (spvExtInstIsNonSemantic(inst->ext_inst_type())) {
-          // non-semantic extinst opcodes are allowed beginning in the types
-          // section, but must either be placed outside a function declaration,
-          // or inside a block.
-          if (_.current_layout_section() < kLayoutTypes) {
-            return _.diag(SPV_ERROR_INVALID_LAYOUT, inst)
-                   << "Non-semantic OpExtInst must not appear before types "
-                   << "section";
-          } else if (_.in_function_body() && _.in_block() == false) {
-            return _.diag(SPV_ERROR_INVALID_LAYOUT, inst)
-                   << "Non-semantic OpExtInst within function definition must "
-                      "appear in a block";
-          }
-        } else if (spvExtInstIsDebugInfo(inst->ext_inst_type())) {
+        if (spvExtInstIsDebugInfo(inst->ext_inst_type())) {
           const uint32_t ext_inst_index = inst->word(4);
           bool local_debug_info = false;
           if (inst->ext_inst_type() == SPV_EXT_INST_TYPE_OPENCL_DEBUGINFO_100) {
@@ -255,6 +255,18 @@
                 ext_inst_key == OpenCLDebugInfo100DebugValue) {
               local_debug_info = true;
             }
+          } else if (inst->ext_inst_type() ==
+                     SPV_EXT_INST_TYPE_NONSEMANTIC_VULKAN_DEBUGINFO_100) {
+            const NonSemanticVulkanDebugInfo100Instructions ext_inst_key =
+                NonSemanticVulkanDebugInfo100Instructions(ext_inst_index);
+            if (ext_inst_key == NonSemanticVulkanDebugInfo100DebugScope ||
+                ext_inst_key == NonSemanticVulkanDebugInfo100DebugNoScope ||
+                ext_inst_key == NonSemanticVulkanDebugInfo100DebugDeclare ||
+                ext_inst_key == NonSemanticVulkanDebugInfo100DebugValue ||
+                ext_inst_key ==
+                    NonSemanticVulkanDebugInfo100DebugFunctionDefinition) {
+              local_debug_info = true;
+            }
           } else {
             const DebugInfoInstructions ext_inst_key =
                 DebugInfoInstructions(ext_inst_index);
@@ -290,6 +302,19 @@
                      << "declarations)";
             }
           }
+        } else if (spvExtInstIsNonSemantic(inst->ext_inst_type())) {
+          // non-semantic extinst opcodes are allowed beginning in the types
+          // section, but must either be placed outside a function declaration,
+          // or inside a block.
+          if (_.current_layout_section() < kLayoutTypes) {
+            return _.diag(SPV_ERROR_INVALID_LAYOUT, inst)
+                   << "Non-semantic OpExtInst must not appear before types "
+                   << "section";
+          } else if (_.in_function_body() && _.in_block() == false) {
+            return _.diag(SPV_ERROR_INVALID_LAYOUT, inst)
+                   << "Non-semantic OpExtInst within function definition must "
+                      "appear in a block";
+          }
         } else {
           // otherwise they must be used in a block
           if (_.in_block() == false) {
diff --git a/third_party/vulkan-deps/spirv-tools/src/source/val/validate_memory.cpp b/third_party/vulkan-deps/spirv-tools/src/source/val/validate_memory.cpp
index a4bc0fa..a7b0f82 100644
--- a/third_party/vulkan-deps/spirv-tools/src/source/val/validate_memory.cpp
+++ b/third_party/vulkan-deps/spirv-tools/src/source/val/validate_memory.cpp
@@ -893,6 +893,12 @@
            << "'s type.";
   }
 
+  if (!_.options()->before_hlsl_legalization &&
+      _.ContainsRuntimeArray(inst->type_id())) {
+    return _.diag(SPV_ERROR_INVALID_ID, inst)
+           << "Cannot load a runtime-sized array";
+  }
+
   if (auto error = CheckMemoryAccess(_, inst, 3)) return error;
 
   if (_.HasCapability(SpvCapabilityShader) &&
diff --git a/third_party/vulkan-deps/spirv-tools/src/source/val/validate_mode_setting.cpp b/third_party/vulkan-deps/spirv-tools/src/source/val/validate_mode_setting.cpp
index 79f82d8..4fb6d9b 100644
--- a/third_party/vulkan-deps/spirv-tools/src/source/val/validate_mode_setting.cpp
+++ b/third_party/vulkan-deps/spirv-tools/src/source/val/validate_mode_setting.cpp
@@ -225,6 +225,13 @@
                 }
               }
             }
+            if (i.opcode() == SpvOpExecutionModeId) {
+              const auto mode = i.GetOperandAs<SpvExecutionMode>(1);
+              if (mode == SpvExecutionModeLocalSizeId) {
+                ok = true;
+                break;
+              }
+            }
           }
           if (!ok) {
             return _.diag(SPV_ERROR_INVALID_DATA, inst)
@@ -429,6 +436,10 @@
       break;
     case SpvExecutionModeLocalSize:
     case SpvExecutionModeLocalSizeId:
+      if (mode == SpvExecutionModeLocalSizeId && !_.IsLocalSizeIdAllowed())
+        return _.diag(SPV_ERROR_INVALID_DATA, inst)
+               << "LocalSizeId mode is not allowed by the current environment.";
+
       if (!std::all_of(models->begin(), models->end(),
                        [&_](const SpvExecutionModel& model) {
                          switch (model) {
diff --git a/third_party/vulkan-deps/spirv-tools/src/source/val/validation_state.cpp b/third_party/vulkan-deps/spirv-tools/src/source/val/validation_state.cpp
index 5282163..e6a02dc 100644
--- a/third_party/vulkan-deps/spirv-tools/src/source/val/validation_state.cpp
+++ b/third_party/vulkan-deps/spirv-tools/src/source/val/validation_state.cpp
@@ -175,6 +175,9 @@
     }
   }
 
+  // LocalSizeId is always allowed in non-Vulkan environments.
+  features_.env_allow_localsizeid = !spvIsVulkanEnv(env);
+
   // Only attempt to count if we have words, otherwise let the other validation
   // fail and generate an error.
   if (num_words > 0) {
@@ -1262,16 +1265,13 @@
   return base_ptr;
 }
 
-bool ValidationState_t::ContainsSizedIntOrFloatType(uint32_t id, SpvOp type,
-                                                    uint32_t width) const {
-  if (type != SpvOpTypeInt && type != SpvOpTypeFloat) return false;
-
+bool ValidationState_t::ContainsType(
+    uint32_t id, const std::function<bool(const Instruction*)>& f,
+    bool traverse_all_types) const {
   const auto inst = FindDef(id);
   if (!inst) return false;
 
-  if (inst->opcode() == type) {
-    return inst->GetOperandAs<uint32_t>(1u) == width;
-  }
+  if (f(inst)) return true;
 
   switch (inst->opcode()) {
     case SpvOpTypeArray:
@@ -1281,24 +1281,45 @@
     case SpvOpTypeImage:
     case SpvOpTypeSampledImage:
     case SpvOpTypeCooperativeMatrixNV:
-      return ContainsSizedIntOrFloatType(inst->GetOperandAs<uint32_t>(1u), type,
-                                         width);
+      return ContainsType(inst->GetOperandAs<uint32_t>(1u), f,
+                          traverse_all_types);
     case SpvOpTypePointer:
       if (IsForwardPointer(id)) return false;
-      return ContainsSizedIntOrFloatType(inst->GetOperandAs<uint32_t>(2u), type,
-                                         width);
-    case SpvOpTypeFunction:
-    case SpvOpTypeStruct: {
-      for (uint32_t i = 1; i < inst->operands().size(); ++i) {
-        if (ContainsSizedIntOrFloatType(inst->GetOperandAs<uint32_t>(i), type,
-                                        width))
-          return true;
+      if (traverse_all_types) {
+        return ContainsType(inst->GetOperandAs<uint32_t>(2u), f,
+                            traverse_all_types);
       }
-      return false;
-    }
+      break;
+    case SpvOpTypeFunction:
+    case SpvOpTypeStruct:
+      if (inst->opcode() == SpvOpTypeFunction && !traverse_all_types) {
+        return false;
+      }
+      for (uint32_t i = 1; i < inst->operands().size(); ++i) {
+        if (ContainsType(inst->GetOperandAs<uint32_t>(i), f,
+                         traverse_all_types)) {
+          return true;
+        }
+      }
+      break;
     default:
-      return false;
+      break;
   }
+
+  return false;
+}
+
+bool ValidationState_t::ContainsSizedIntOrFloatType(uint32_t id, SpvOp type,
+                                                    uint32_t width) const {
+  if (type != SpvOpTypeInt && type != SpvOpTypeFloat) return false;
+
+  const auto f = [type, width](const Instruction* inst) {
+    if (inst->opcode() == type) {
+      return inst->GetOperandAs<uint32_t>(1u) == width;
+    }
+    return false;
+  };
+  return ContainsType(id, f);
 }
 
 bool ValidationState_t::ContainsLimitedUseIntOrFloatType(uint32_t id) const {
@@ -1313,6 +1334,13 @@
   return false;
 }
 
+bool ValidationState_t::ContainsRuntimeArray(uint32_t id) const {
+  const auto f = [](const Instruction* inst) {
+    return inst->opcode() == SpvOpTypeRuntimeArray;
+  };
+  return ContainsType(id, f, /* traverse_all_types = */ false);
+}
+
 bool ValidationState_t::IsValidStorageClass(
     SpvStorageClass storage_class) const {
   if (spvIsVulkanEnv(context()->target_env)) {
diff --git a/third_party/vulkan-deps/spirv-tools/src/source/val/validation_state.h b/third_party/vulkan-deps/spirv-tools/src/source/val/validation_state.h
index 57634bf..4e35cd2 100644
--- a/third_party/vulkan-deps/spirv-tools/src/source/val/validation_state.h
+++ b/third_party/vulkan-deps/spirv-tools/src/source/val/validation_state.h
@@ -121,6 +121,9 @@
 
     // SPIR-V 1.4 allows Function and Private variables to be NonWritable
     bool nonwritable_var_in_function_or_private = false;
+
+    // Whether LocalSizeId execution mode is allowed by the environment.
+    bool env_allow_localsizeid = false;
   };
 
   ValidationState_t(const spv_const_context context,
@@ -493,6 +496,12 @@
     return features_.env_relaxed_block_layout || options()->relax_block_layout;
   }
 
+  // Returns true if allowing localsizeid, either because the environment always
+  // allows it, or because it is enabled from the command-line.
+  bool IsLocalSizeIdAllowed() const {
+    return features_.env_allow_localsizeid || options()->allow_localsizeid;
+  }
+
   /// Sets the struct nesting depth for a given struct ID
   void set_struct_nesting_depth(uint32_t id, uint32_t depth) {
     struct_nesting_depth_[id] = depth;
@@ -595,6 +604,17 @@
   // 16-bit float that is not generally enabled for use.
   bool ContainsLimitedUseIntOrFloatType(uint32_t id) const;
 
+  // Returns true if |id| is a type that contains a runtime-sized array.
+  // Does not consider a pointers as contains the array.
+  bool ContainsRuntimeArray(uint32_t id) const;
+
+  // Generic type traversal.
+  // Only traverse pointers and functions if |traverse_all_types| is true.
+  // Recursively tests |f| against the type hierarchy headed by |id|.
+  bool ContainsType(uint32_t id,
+                    const std::function<bool(const Instruction*)>& f,
+                    bool traverse_all_types = true) const;
+
   // Gets value from OpConstant and OpSpecConstant as uint64.
   // Returns false on failure (no instruction, wrong instruction, not int).
   bool GetConstantValUint64(uint32_t id, uint64_t* val) const;
diff --git a/third_party/vulkan-deps/spirv-tools/src/test/CMakeLists.txt b/third_party/vulkan-deps/spirv-tools/src/test/CMakeLists.txt
index 8ede58b..e88df04 100644
--- a/third_party/vulkan-deps/spirv-tools/src/test/CMakeLists.txt
+++ b/third_party/vulkan-deps/spirv-tools/src/test/CMakeLists.txt
@@ -186,9 +186,11 @@
 
 
 add_subdirectory(link)
+add_subdirectory(lint)
 add_subdirectory(opt)
 add_subdirectory(reduce)
 add_subdirectory(fuzz)
 add_subdirectory(tools)
 add_subdirectory(util)
 add_subdirectory(val)
+add_subdirectory(fuzzers)
diff --git a/third_party/vulkan-deps/spirv-tools/src/test/binary_to_text_test.cpp b/third_party/vulkan-deps/spirv-tools/src/test/binary_to_text_test.cpp
index 9cad966..df703e5 100644
--- a/third_party/vulkan-deps/spirv-tools/src/test/binary_to_text_test.cpp
+++ b/third_party/vulkan-deps/spirv-tools/src/test/binary_to_text_test.cpp
@@ -386,7 +386,7 @@
             ::testing::ValuesIn(std::vector<std::string>{
                 "OpExecutionModeId %1 SubgroupsPerWorkgroupId %2\n",
                 "OpExecutionModeId %1 LocalSizeId %2 %3 %4\n",
-                "OpExecutionModeId %1 LocalSizeHintId %2\n",
+                "OpExecutionModeId %1 LocalSizeHintId %2 %3 %4\n",
                 "OpDecorateId %1 AlignmentId %2\n",
                 "OpDecorateId %1 MaxByteOffsetId %2\n",
             })));
diff --git a/third_party/vulkan-deps/spirv-tools/src/test/fuzz/CMakeLists.txt b/third_party/vulkan-deps/spirv-tools/src/test/fuzz/CMakeLists.txt
index 8acebde..56af0b9 100644
--- a/third_party/vulkan-deps/spirv-tools/src/test/fuzz/CMakeLists.txt
+++ b/third_party/vulkan-deps/spirv-tools/src/test/fuzz/CMakeLists.txt
@@ -122,6 +122,7 @@
           transformation_vector_shuffle_test.cpp
           transformation_wrap_early_terminator_in_function_test.cpp
           transformation_wrap_region_in_selection_test.cpp
+          transformation_wrap_vector_synonym_test.cpp
           uniform_buffer_element_descriptor_test.cpp)
 
   if (${SPIRV_ENABLE_LONG_FUZZER_TESTS})
diff --git a/third_party/vulkan-deps/spirv-tools/src/test/fuzz/fuzzer_pass_add_opphi_synonyms_test.cpp b/third_party/vulkan-deps/spirv-tools/src/test/fuzz/fuzzer_pass_add_opphi_synonyms_test.cpp
index 734f47a..1045f8a 100644
--- a/third_party/vulkan-deps/spirv-tools/src/test/fuzz/fuzzer_pass_add_opphi_synonyms_test.cpp
+++ b/third_party/vulkan-deps/spirv-tools/src/test/fuzz/fuzzer_pass_add_opphi_synonyms_test.cpp
@@ -134,7 +134,7 @@
 
   FuzzerPassAddOpPhiSynonyms fuzzer_pass(context.get(), &transformation_context,
                                          &fuzzer_context,
-                                         &transformation_sequence);
+                                         &transformation_sequence, false);
 
   SetUpIdSynonyms(transformation_context.GetFactManager());
 
diff --git a/third_party/vulkan-deps/spirv-tools/src/test/fuzz/fuzzer_pass_construct_composites_test.cpp b/third_party/vulkan-deps/spirv-tools/src/test/fuzz/fuzzer_pass_construct_composites_test.cpp
index a02176b..a858e4c 100644
--- a/third_party/vulkan-deps/spirv-tools/src/test/fuzz/fuzzer_pass_construct_composites_test.cpp
+++ b/third_party/vulkan-deps/spirv-tools/src/test/fuzz/fuzzer_pass_construct_composites_test.cpp
@@ -92,7 +92,7 @@
 
     FuzzerPassConstructComposites fuzzer_pass(
         context.get(), &transformation_context, &fuzzer_context,
-        &transformation_sequence);
+        &transformation_sequence, false);
 
     fuzzer_pass.Apply();
 
@@ -173,7 +173,7 @@
 
     FuzzerPassConstructComposites fuzzer_pass(
         context.get(), &transformation_context, &fuzzer_context,
-        &transformation_sequence);
+        &transformation_sequence, false);
 
     fuzzer_pass.Apply();
 
diff --git a/third_party/vulkan-deps/spirv-tools/src/test/fuzz/fuzzer_pass_donate_modules_test.cpp b/third_party/vulkan-deps/spirv-tools/src/test/fuzz/fuzzer_pass_donate_modules_test.cpp
index f11885d..fe8e671 100644
--- a/third_party/vulkan-deps/spirv-tools/src/test/fuzz/fuzzer_pass_donate_modules_test.cpp
+++ b/third_party/vulkan-deps/spirv-tools/src/test/fuzz/fuzzer_pass_donate_modules_test.cpp
@@ -210,7 +210,7 @@
 
   FuzzerPassDonateModules fuzzer_pass(recipient_context.get(),
                                       &transformation_context, &fuzzer_context,
-                                      &transformation_sequence, {});
+                                      &transformation_sequence, false, {});
 
   fuzzer_pass.DonateSingleModule(donor_context.get(), false);
 
@@ -291,7 +291,7 @@
 
   FuzzerPassDonateModules fuzzer_pass(recipient_context.get(),
                                       &transformation_context, &fuzzer_context,
-                                      &transformation_sequence, {});
+                                      &transformation_sequence, false, {});
 
   fuzzer_pass.DonateSingleModule(donor_context.get(), false);
 
@@ -422,7 +422,7 @@
 
   FuzzerPassDonateModules fuzzer_pass(recipient_context.get(),
                                       &transformation_context, &fuzzer_context,
-                                      &transformation_sequence, {});
+                                      &transformation_sequence, false, {});
 
   fuzzer_pass.DonateSingleModule(donor_context.get(), false);
 
@@ -517,7 +517,7 @@
 
   FuzzerPassDonateModules fuzzer_pass(recipient_context.get(),
                                       &transformation_context, &fuzzer_context,
-                                      &transformation_sequence, {});
+                                      &transformation_sequence, false, {});
 
   fuzzer_pass.DonateSingleModule(donor_context.get(), false);
 
@@ -531,6 +531,7 @@
   std::string recipient_shader = R"(
                OpCapability Shader
                OpCapability ImageQuery
+               OpCapability VariablePointers
           %1 = OpExtInstImport "GLSL.std.450"
                OpMemoryModel Logical GLSL450
                OpEntryPoint Fragment %4 "main"
@@ -548,6 +549,7 @@
   std::string donor_shader = R"(
                OpCapability Shader
                OpCapability ImageQuery
+               OpCapability VariablePointers
           %1 = OpExtInstImport "GLSL.std.450"
                OpMemoryModel Logical GLSL450
                OpEntryPoint Fragment %4 "main"
@@ -587,7 +589,7 @@
 
   FuzzerPassDonateModules fuzzer_pass(recipient_context.get(),
                                       &transformation_context, &fuzzer_context,
-                                      &transformation_sequence, {});
+                                      &transformation_sequence, false, {});
 
   fuzzer_pass.DonateSingleModule(donor_context.get(), false);
 
@@ -715,7 +717,7 @@
 
   FuzzerPassDonateModules fuzzer_pass(recipient_context.get(),
                                       &transformation_context, &fuzzer_context,
-                                      &transformation_sequence, {});
+                                      &transformation_sequence, false, {});
 
   fuzzer_pass.DonateSingleModule(donor_context.get(), false);
 
@@ -811,7 +813,7 @@
 
   FuzzerPassDonateModules fuzzer_pass(recipient_context.get(),
                                       &transformation_context, &fuzzer_context,
-                                      &transformation_sequence, {});
+                                      &transformation_sequence, false, {});
 
   fuzzer_pass.DonateSingleModule(donor_context.get(), false);
 
@@ -943,7 +945,7 @@
 
   FuzzerPassDonateModules fuzzer_pass(recipient_context.get(),
                                       &transformation_context, &fuzzer_context,
-                                      &transformation_sequence, {});
+                                      &transformation_sequence, false, {});
 
   fuzzer_pass.DonateSingleModule(donor_context.get(), false);
 
@@ -1079,7 +1081,7 @@
 
   FuzzerPassDonateModules fuzzer_pass(recipient_context.get(),
                                       &transformation_context, &fuzzer_context,
-                                      &transformation_sequence, {});
+                                      &transformation_sequence, false, {});
 
   fuzzer_pass.DonateSingleModule(donor_context.get(), false);
 
@@ -1161,7 +1163,7 @@
 
   FuzzerPassDonateModules fuzzer_pass(recipient_context.get(),
                                       &transformation_context, &fuzzer_context,
-                                      &transformation_sequence, {});
+                                      &transformation_sequence, false, {});
 
   fuzzer_pass.DonateSingleModule(donor_context.get(), true);
 
@@ -1248,7 +1250,7 @@
 
   FuzzerPassDonateModules fuzzer_pass(recipient_context.get(),
                                       &transformation_context, &fuzzer_context,
-                                      &transformation_sequence, {});
+                                      &transformation_sequence, false, {});
 
   fuzzer_pass.DonateSingleModule(donor_context.get(), false);
 
@@ -1352,7 +1354,7 @@
 
   FuzzerPassDonateModules fuzzer_pass(recipient_context.get(),
                                       &transformation_context, &fuzzer_context,
-                                      &transformation_sequence, {});
+                                      &transformation_sequence, false, {});
 
   fuzzer_pass.DonateSingleModule(donor_context.get(), true);
 
@@ -1424,7 +1426,7 @@
 
   FuzzerPassDonateModules fuzzer_pass(recipient_context.get(),
                                       &transformation_context, &fuzzer_context,
-                                      &transformation_sequence, {});
+                                      &transformation_sequence, false, {});
 
   fuzzer_pass.DonateSingleModule(donor_context.get(), true);
 
@@ -1534,7 +1536,7 @@
 
   FuzzerPassDonateModules fuzzer_pass(recipient_context.get(),
                                       &transformation_context, &fuzzer_context,
-                                      &transformation_sequence, {});
+                                      &transformation_sequence, false, {});
 
   fuzzer_pass.DonateSingleModule(donor_context.get(), true);
 
@@ -1718,7 +1720,7 @@
 
   FuzzerPassDonateModules fuzzer_pass(recipient_context.get(),
                                       &transformation_context, &fuzzer_context,
-                                      &transformation_sequence, {});
+                                      &transformation_sequence, false, {});
 
   fuzzer_pass.DonateSingleModule(donor_context.get(), false);
 
@@ -1790,7 +1792,7 @@
 
   FuzzerPassDonateModules fuzzer_pass(recipient_context.get(),
                                       &transformation_context, &fuzzer_context,
-                                      &transformation_sequence, {});
+                                      &transformation_sequence, false, {});
 
   fuzzer_pass.DonateSingleModule(donor_context.get(), false);
 
@@ -1947,7 +1949,7 @@
 
   FuzzerPassDonateModules fuzzer_pass(recipient_context.get(),
                                       &transformation_context, &fuzzer_context,
-                                      &transformation_sequence, {});
+                                      &transformation_sequence, false, {});
 
   fuzzer_pass.DonateSingleModule(donor_context.get(), false);
 
@@ -2020,7 +2022,7 @@
 
   FuzzerPassDonateModules fuzzer_pass(recipient_context.get(),
                                       &transformation_context, &fuzzer_context,
-                                      &transformation_sequence, {});
+                                      &transformation_sequence, false, {});
 
   ASSERT_TRUE(donor_context->get_feature_mgr()->HasCapability(
       SpvCapabilityVariablePointersStorageBuffer));
@@ -2253,7 +2255,7 @@
 
   FuzzerPassDonateModules fuzzer_pass(recipient_context.get(),
                                       &transformation_context, &fuzzer_context,
-                                      &transformation_sequence, {});
+                                      &transformation_sequence, false, {});
 
   fuzzer_pass.DonateSingleModule(donor_context.get(), true);
 
diff --git a/third_party/vulkan-deps/spirv-tools/src/test/fuzz/fuzzer_pass_outline_functions_test.cpp b/third_party/vulkan-deps/spirv-tools/src/test/fuzz/fuzzer_pass_outline_functions_test.cpp
index 0d2c5bf..a088e17 100644
--- a/third_party/vulkan-deps/spirv-tools/src/test/fuzz/fuzzer_pass_outline_functions_test.cpp
+++ b/third_party/vulkan-deps/spirv-tools/src/test/fuzz/fuzzer_pass_outline_functions_test.cpp
@@ -130,7 +130,7 @@
 
   FuzzerPassOutlineFunctions fuzzer_pass(context.get(), &transformation_context,
                                          &fuzzer_context,
-                                         &transformation_sequence);
+                                         &transformation_sequence, false);
 
   // Block 28
   auto suitable_entry_block =
@@ -173,7 +173,7 @@
 
   FuzzerPassOutlineFunctions fuzzer_pass(context.get(), &transformation_context,
                                          &fuzzer_context,
-                                         &transformation_sequence);
+                                         &transformation_sequence, false);
 
   // Block 20
   auto suitable_entry_block =
@@ -297,7 +297,7 @@
 
   FuzzerPassOutlineFunctions fuzzer_pass(context.get(), &transformation_context,
                                          &fuzzer_context,
-                                         &transformation_sequence);
+                                         &transformation_sequence, false);
 
   // Block 21
   auto suitable_entry_block =
@@ -464,7 +464,7 @@
 
   FuzzerPassOutlineFunctions fuzzer_pass(context.get(), &transformation_context,
                                          &fuzzer_context,
-                                         &transformation_sequence);
+                                         &transformation_sequence, false);
 
   // Block 39 is not a merge block, so it is already suitable.
   auto suitable_exit_block = fuzzer_pass.MaybeGetExitBlockSuitableForOutlining(
diff --git a/third_party/vulkan-deps/spirv-tools/src/test/fuzz/fuzzer_pass_test.cpp b/third_party/vulkan-deps/spirv-tools/src/test/fuzz/fuzzer_pass_test.cpp
index b035de7..31b8582 100644
--- a/third_party/vulkan-deps/spirv-tools/src/test/fuzz/fuzzer_pass_test.cpp
+++ b/third_party/vulkan-deps/spirv-tools/src/test/fuzz/fuzzer_pass_test.cpp
@@ -29,7 +29,7 @@
                  FuzzerContext* fuzzer_context,
                  protobufs::TransformationSequence* transformations)
       : FuzzerPass(ir_context, transformation_context, fuzzer_context,
-                   transformations) {}
+                   transformations, false) {}
 
   ~FuzzerPassMock() override = default;
 
diff --git a/third_party/vulkan-deps/spirv-tools/src/test/fuzz/fuzzer_replayer_test.cpp b/third_party/vulkan-deps/spirv-tools/src/test/fuzz/fuzzer_replayer_test.cpp
index 6dc7ffb..2a22e6a 100644
--- a/third_party/vulkan-deps/spirv-tools/src/test/fuzz/fuzzer_replayer_test.cpp
+++ b/third_party/vulkan-deps/spirv-tools/src/test/fuzz/fuzzer_replayer_test.cpp
@@ -1596,6 +1596,23 @@
                OpFunctionEnd
   )";
 
+// A virtually empty piece of SPIR-V.
+
+const std::string kTestShader7 = R"(
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %4 "main"
+               OpExecutionMode %4 OriginUpperLeft
+               OpSource ESSL 320
+          %2 = OpTypeVoid
+          %3 = OpTypeFunction %2
+          %4 = OpFunction %2 None %3
+          %5 = OpLabel
+               OpReturn
+               OpFunctionEnd
+  )";
+
 void AddConstantUniformFact(protobufs::FactSequence* facts,
                             uint32_t descriptor_set, uint32_t binding,
                             std::vector<uint32_t>&& indices, uint32_t value) {
@@ -1668,7 +1685,7 @@
     Fuzzer fuzzer(std::move(ir_context), std::move(transformation_context),
                   std::move(fuzzer_context), kConsoleMessageConsumer,
                   donor_suppliers, enable_all_passes,
-                  strategies[strategy_index], true, validator_options);
+                  strategies[strategy_index], true, validator_options, false);
     auto fuzzer_result = fuzzer.Run(0);
 
     // Cycle the repeated pass strategy so that we try a different one next time
@@ -1760,6 +1777,13 @@
                        kNumFuzzerRuns);
 }
 
+TEST(FuzzerReplayerTest, Miscellaneous7) {
+  // Do some fuzzer runs, starting from an initial seed of 1 (seed value chosen
+  // arbitrarily).
+  RunFuzzerAndReplayer(kTestShader7, protobufs::FactSequence(), 1,
+                       kNumFuzzerRuns);
+}
+
 }  // namespace
 }  // namespace fuzz
 }  // namespace spvtools
diff --git a/third_party/vulkan-deps/spirv-tools/src/test/fuzz/fuzzer_shrinker_test.cpp b/third_party/vulkan-deps/spirv-tools/src/test/fuzz/fuzzer_shrinker_test.cpp
index e792116..acee03c 100644
--- a/third_party/vulkan-deps/spirv-tools/src/test/fuzz/fuzzer_shrinker_test.cpp
+++ b/third_party/vulkan-deps/spirv-tools/src/test/fuzz/fuzzer_shrinker_test.cpp
@@ -1068,7 +1068,7 @@
   Fuzzer fuzzer(std::move(ir_context), std::move(transformation_context),
                 std::move(fuzzer_context), kConsoleMessageConsumer,
                 donor_suppliers, enable_all_passes, repeated_pass_strategy,
-                true, validator_options);
+                true, validator_options, false);
   auto fuzzer_result = fuzzer.Run(0);
   ASSERT_NE(Fuzzer::Status::kFuzzerPassLedToInvalidModule,
             fuzzer_result.status);
diff --git a/third_party/vulkan-deps/spirv-tools/src/test/fuzz/fuzzerutil_test.cpp b/third_party/vulkan-deps/spirv-tools/src/test/fuzz/fuzzerutil_test.cpp
index 7ff9b4d..6771c40 100644
--- a/third_party/vulkan-deps/spirv-tools/src/test/fuzz/fuzzerutil_test.cpp
+++ b/third_party/vulkan-deps/spirv-tools/src/test/fuzz/fuzzerutil_test.cpp
@@ -196,8 +196,6 @@
          %50 = OpTypePointer Private %7
          %34 = OpTypeBool
          %35 = OpConstantFalse %34
-         %60 = OpConstantNull %50
-         %61 = OpUndef %51
          %52 = OpVariable %50 Private
          %53 = OpVariable %51 Private
          %80 = OpConstantComposite %8 %21 %24
@@ -507,8 +505,6 @@
          %50 = OpTypePointer Private %7
          %34 = OpTypeBool
          %35 = OpConstantFalse %34
-         %60 = OpConstantNull %50
-         %61 = OpUndef %51
          %52 = OpVariable %50 Private
          %53 = OpVariable %51 Private
          %80 = OpConstantComposite %8 %21 %24
@@ -799,8 +795,6 @@
          %50 = OpTypePointer Private %7
          %34 = OpTypeBool
          %35 = OpConstantFalse %34
-         %60 = OpConstantNull %50
-         %61 = OpUndef %51
          %52 = OpVariable %50 Private
          %53 = OpVariable %51 Private
          %80 = OpConstantComposite %8 %21 %24
@@ -894,8 +888,6 @@
          %50 = OpTypePointer Private %7
          %34 = OpTypeBool
          %35 = OpConstantFalse %34
-         %60 = OpConstantNull %50
-         %61 = OpUndef %51
          %52 = OpVariable %50 Private
          %53 = OpVariable %51 Private
          %80 = OpConstantComposite %8 %21 %24
@@ -1165,8 +1157,6 @@
          %50 = OpTypePointer Private %7
          %34 = OpTypeBool
          %35 = OpConstantFalse %34
-         %60 = OpConstantNull %50
-         %61 = OpUndef %51
          %52 = OpVariable %50 Private
          %53 = OpVariable %51 Private
          %80 = OpConstantComposite %8 %21 %24
@@ -1261,8 +1251,6 @@
          %50 = OpTypePointer Private %7
          %34 = OpTypeBool
          %35 = OpConstantFalse %34
-         %60 = OpConstantNull %50
-         %61 = OpUndef %51
          %52 = OpVariable %50 Private
          %53 = OpVariable %51 Private
          %80 = OpConstantComposite %8 %21 %24
@@ -1362,8 +1350,6 @@
          %50 = OpTypePointer Private %7
          %34 = OpTypeBool
          %35 = OpConstantFalse %34
-         %60 = OpConstantNull %50
-         %61 = OpUndef %51
          %52 = OpVariable %50 Private
          %53 = OpVariable %51 Private
          %80 = OpConstantComposite %8 %21 %24
diff --git a/third_party/vulkan-deps/spirv-tools/src/test/fuzz/shrinker_test.cpp b/third_party/vulkan-deps/spirv-tools/src/test/fuzz/shrinker_test.cpp
index 447ebec..942de29 100644
--- a/third_party/vulkan-deps/spirv-tools/src/test/fuzz/shrinker_test.cpp
+++ b/third_party/vulkan-deps/spirv-tools/src/test/fuzz/shrinker_test.cpp
@@ -171,7 +171,7 @@
   protobufs::TransformationSequence transformations;
   FuzzerPassDonateModules pass(variant_ir_context.get(),
                                &transformation_context, &fuzzer_context,
-                               &transformations, {});
+                               &transformations, false, {});
   pass.DonateSingleModule(donor_ir_context.get(), true);
 
   protobufs::FactSequence no_facts;
@@ -349,7 +349,7 @@
   protobufs::TransformationSequence transformations;
   FuzzerPassDonateModules pass(variant_ir_context.get(),
                                &transformation_context, &fuzzer_context,
-                               &transformations, {});
+                               &transformations, false, {});
   pass.DonateSingleModule(donor_ir_context.get(), true);
 
   protobufs::FactSequence no_facts;
diff --git a/third_party/vulkan-deps/spirv-tools/src/test/fuzz/transformation_access_chain_test.cpp b/third_party/vulkan-deps/spirv-tools/src/test/fuzz/transformation_access_chain_test.cpp
index e791981..bddcf5f 100644
--- a/third_party/vulkan-deps/spirv-tools/src/test/fuzz/transformation_access_chain_test.cpp
+++ b/third_party/vulkan-deps/spirv-tools/src/test/fuzz/transformation_access_chain_test.cpp
@@ -26,6 +26,7 @@
 TEST(TransformationAccessChainTest, BasicTest) {
   std::string shader = R"(
                OpCapability Shader
+               OpCapability VariablePointers
           %1 = OpExtInstImport "GLSL.std.450"
                OpMemoryModel Logical GLSL450
                OpEntryPoint Fragment %4 "main" %48 %54
@@ -63,7 +64,6 @@
          %85 = OpConstant %10 5
          %52 = OpTypeArray %50 %51
          %53 = OpTypePointer Private %52
-         %45 = OpUndef %9
          %46 = OpConstantNull %9
          %47 = OpTypePointer Private %8
          %48 = OpVariable %47 Private
@@ -204,15 +204,6 @@
 #ifndef NDEBUG
   // Bad: pointer is null
   ASSERT_DEATH(
-      TransformationAccessChain(100, 45, {80},
-                                MakeInstructionDescriptor(24, SpvOpLoad, 0))
-          .IsApplicable(context.get(), transformation_context),
-      "Access chains should not be created from null/undefined pointers");
-#endif
-
-#ifndef NDEBUG
-  // Bad: pointer is undef
-  ASSERT_DEATH(
       TransformationAccessChain(100, 46, {80},
                                 MakeInstructionDescriptor(24, SpvOpLoad, 0))
           .IsApplicable(context.get(), transformation_context),
@@ -331,6 +322,7 @@
 
   std::string after_transformation = R"(
                OpCapability Shader
+               OpCapability VariablePointers
           %1 = OpExtInstImport "GLSL.std.450"
                OpMemoryModel Logical GLSL450
                OpEntryPoint Fragment %4 "main" %48 %54
@@ -368,7 +360,6 @@
          %85 = OpConstant %10 5
          %52 = OpTypeArray %50 %51
          %53 = OpTypePointer Private %52
-         %45 = OpUndef %9
          %46 = OpConstantNull %9
          %47 = OpTypePointer Private %8
          %48 = OpVariable %47 Private
diff --git a/third_party/vulkan-deps/spirv-tools/src/test/fuzz/transformation_add_copy_memory_test.cpp b/third_party/vulkan-deps/spirv-tools/src/test/fuzz/transformation_add_copy_memory_test.cpp
index 642a556..ff8ac72 100644
--- a/third_party/vulkan-deps/spirv-tools/src/test/fuzz/transformation_add_copy_memory_test.cpp
+++ b/third_party/vulkan-deps/spirv-tools/src/test/fuzz/transformation_add_copy_memory_test.cpp
@@ -26,6 +26,7 @@
 TEST(TransformationAddCopyMemoryTest, BasicTest) {
   std::string shader = R"(
                OpCapability Shader
+               OpCapability VariablePointers
           %1 = OpExtInstImport "GLSL.std.450"
                OpMemoryModel Logical GLSL450
                OpEntryPoint Fragment %4 "main"
@@ -64,7 +65,6 @@
          %67 = OpTypePointer Function %66
          %83 = OpTypePointer Private %66
          %86 = OpVariable %79 Private %20
-         %87 = OpUndef %79
          %88 = OpConstantNull %79
           %4 = OpFunction %2 None %3
           %5 = OpLabel
@@ -182,12 +182,6 @@
                                   90, 40, SpvStorageClassPrivate, 0)
           .IsApplicable(context.get(), transformation_context));
 
-  // Source instruction is OpUndef.
-  ASSERT_FALSE(
-      TransformationAddCopyMemory(MakeInstructionDescriptor(41, SpvOpLoad, 0),
-                                  90, 87, SpvStorageClassPrivate, 0)
-          .IsApplicable(context.get(), transformation_context));
-
   // Source instruction is OpConstantNull.
   ASSERT_FALSE(
       TransformationAddCopyMemory(MakeInstructionDescriptor(41, SpvOpLoad, 0),
@@ -255,6 +249,7 @@
 
   std::string expected = R"(
                OpCapability Shader
+               OpCapability VariablePointers
           %1 = OpExtInstImport "GLSL.std.450"
                OpMemoryModel Logical GLSL450
                OpEntryPoint Fragment %4 "main"
@@ -293,7 +288,6 @@
          %67 = OpTypePointer Function %66
          %83 = OpTypePointer Private %66
          %86 = OpVariable %79 Private %20
-         %87 = OpUndef %79
          %88 = OpConstantNull %79
          %90 = OpVariable %79 Private %20
          %92 = OpVariable %78 Private %25
diff --git a/third_party/vulkan-deps/spirv-tools/src/test/fuzz/transformation_add_synonym_test.cpp b/third_party/vulkan-deps/spirv-tools/src/test/fuzz/transformation_add_synonym_test.cpp
index 314b003..ffcf1c9 100644
--- a/third_party/vulkan-deps/spirv-tools/src/test/fuzz/transformation_add_synonym_test.cpp
+++ b/third_party/vulkan-deps/spirv-tools/src/test/fuzz/transformation_add_synonym_test.cpp
@@ -1242,9 +1242,10 @@
   ASSERT_TRUE(IsEqual(env, after_transformation, context.get()));
 }
 
-TEST(TransformationAddSynonymTest, DoNotCopyNullOrUndefPointers) {
+TEST(TransformationAddSynonymTest, DoNotCopyNullPointers) {
   std::string shader = R"(
                OpCapability Shader
+               OpCapability VariablePointers
           %1 = OpExtInstImport "GLSL.std.450"
                OpMemoryModel Logical GLSL450
                OpEntryPoint Fragment %4 "main"
@@ -1255,7 +1256,6 @@
           %6 = OpTypeInt 32 1
           %7 = OpTypePointer Function %6
           %8 = OpConstantNull %7
-          %9 = OpUndef %7
           %4 = OpFunction %2 None %3
           %5 = OpLabel
                OpReturn
@@ -1275,12 +1275,6 @@
                    8, protobufs::TransformationAddSynonym::COPY_OBJECT, 100,
                    MakeInstructionDescriptor(5, SpvOpReturn, 0))
                    .IsApplicable(context.get(), transformation_context));
-
-  // Illegal to copy an OpUndef of pointer type.
-  ASSERT_FALSE(TransformationAddSynonym(
-                   9, protobufs::TransformationAddSynonym::COPY_OBJECT, 100,
-                   MakeInstructionDescriptor(5, SpvOpReturn, 0))
-                   .IsApplicable(context.get(), transformation_context));
 }
 
 TEST(TransformationAddSynonymTest, PropagateIrrelevantPointeeFact) {
diff --git a/third_party/vulkan-deps/spirv-tools/src/test/fuzz/transformation_load_test.cpp b/third_party/vulkan-deps/spirv-tools/src/test/fuzz/transformation_load_test.cpp
index a03ffdd..370826e 100644
--- a/third_party/vulkan-deps/spirv-tools/src/test/fuzz/transformation_load_test.cpp
+++ b/third_party/vulkan-deps/spirv-tools/src/test/fuzz/transformation_load_test.cpp
@@ -26,6 +26,7 @@
 TEST(TransformationLoadTest, BasicTest) {
   std::string shader = R"(
                OpCapability Shader
+               OpCapability VariablePointers
           %1 = OpExtInstImport "GLSL.std.450"
                OpMemoryModel Logical GLSL450
                OpEntryPoint Fragment %4 "main"
@@ -49,7 +50,6 @@
          %34 = OpTypeBool
          %35 = OpConstantFalse %34
          %60 = OpConstantNull %50
-         %61 = OpUndef %51
          %52 = OpVariable %50 Private
          %53 = OpVariable %51 Private
           %4 = OpFunction %2 None %3
@@ -129,65 +129,69 @@
 
   // Pointers that cannot be used:
   //  60 - null
-  //  61 - undefined
 
   // Bad: id is not fresh
-  ASSERT_FALSE(TransformationLoad(
-                   33, 33, MakeInstructionDescriptor(38, SpvOpAccessChain, 0))
-                   .IsApplicable(context.get(), transformation_context));
+  ASSERT_FALSE(
+      TransformationLoad(33, 33, false, 0, 0,
+                         MakeInstructionDescriptor(38, SpvOpAccessChain, 0))
+          .IsApplicable(context.get(), transformation_context));
   // Bad: attempt to load from 11 from outside its function
-  ASSERT_FALSE(TransformationLoad(
-                   100, 11, MakeInstructionDescriptor(38, SpvOpAccessChain, 0))
-                   .IsApplicable(context.get(), transformation_context));
+  ASSERT_FALSE(
+      TransformationLoad(100, 11, false, 0, 0,
+                         MakeInstructionDescriptor(38, SpvOpAccessChain, 0))
+          .IsApplicable(context.get(), transformation_context));
 
   // Bad: pointer is not available
-  ASSERT_FALSE(TransformationLoad(
-                   100, 33, MakeInstructionDescriptor(45, SpvOpCopyObject, 0))
-                   .IsApplicable(context.get(), transformation_context));
+  ASSERT_FALSE(
+      TransformationLoad(100, 33, false, 0, 0,
+                         MakeInstructionDescriptor(45, SpvOpCopyObject, 0))
+          .IsApplicable(context.get(), transformation_context));
 
   // Bad: attempt to insert before OpVariable
-  ASSERT_FALSE(TransformationLoad(
-                   100, 27, MakeInstructionDescriptor(27, SpvOpVariable, 0))
-                   .IsApplicable(context.get(), transformation_context));
+  ASSERT_FALSE(
+      TransformationLoad(100, 27, false, 0, 0,
+                         MakeInstructionDescriptor(27, SpvOpVariable, 0))
+          .IsApplicable(context.get(), transformation_context));
 
   // Bad: pointer id does not exist
   ASSERT_FALSE(
-      TransformationLoad(100, 1000,
+      TransformationLoad(100, 1000, false, 0, 0,
                          MakeInstructionDescriptor(38, SpvOpAccessChain, 0))
           .IsApplicable(context.get(), transformation_context));
 
   // Bad: pointer id exists but does not have a type
-  ASSERT_FALSE(TransformationLoad(
-                   100, 5, MakeInstructionDescriptor(38, SpvOpAccessChain, 0))
-                   .IsApplicable(context.get(), transformation_context));
-
-  // Bad: pointer id exists and has a type, but is not a pointer
-  ASSERT_FALSE(TransformationLoad(
-                   100, 24, MakeInstructionDescriptor(38, SpvOpAccessChain, 0))
-                   .IsApplicable(context.get(), transformation_context));
-
-  // Bad: attempt to load from null pointer
-  ASSERT_FALSE(TransformationLoad(
-                   100, 60, MakeInstructionDescriptor(38, SpvOpAccessChain, 0))
-                   .IsApplicable(context.get(), transformation_context));
-
-  // Bad: attempt to load from undefined pointer
-  ASSERT_FALSE(TransformationLoad(
-                   100, 61, MakeInstructionDescriptor(38, SpvOpAccessChain, 0))
-                   .IsApplicable(context.get(), transformation_context));
-  // Bad: %40 is not available at the program point
   ASSERT_FALSE(
-      TransformationLoad(100, 40, MakeInstructionDescriptor(37, SpvOpReturn, 0))
+      TransformationLoad(100, 5, false, 0, 0,
+                         MakeInstructionDescriptor(38, SpvOpAccessChain, 0))
           .IsApplicable(context.get(), transformation_context));
 
-  // Bad: The described instruction does not exist
-  ASSERT_FALSE(TransformationLoad(
-                   100, 33, MakeInstructionDescriptor(1000, SpvOpReturn, 0))
+  // Bad: pointer id exists and has a type, but is not a pointer
+  ASSERT_FALSE(
+      TransformationLoad(100, 24, false, 0, 0,
+                         MakeInstructionDescriptor(38, SpvOpAccessChain, 0))
+          .IsApplicable(context.get(), transformation_context));
+
+  // Bad: attempt to load from null pointer
+  ASSERT_FALSE(
+      TransformationLoad(100, 60, false, 0, 0,
+                         MakeInstructionDescriptor(38, SpvOpAccessChain, 0))
+          .IsApplicable(context.get(), transformation_context));
+
+  // Bad: %40 is not available at the program point
+  ASSERT_FALSE(TransformationLoad(100, 40, false, 0, 0,
+                                  MakeInstructionDescriptor(37, SpvOpReturn, 0))
                    .IsApplicable(context.get(), transformation_context));
 
+  // Bad: The described instruction does not exist
+  ASSERT_FALSE(
+      TransformationLoad(100, 33, false, 0, 0,
+                         MakeInstructionDescriptor(1000, SpvOpReturn, 0))
+          .IsApplicable(context.get(), transformation_context));
+
   {
     TransformationLoad transformation(
-        100, 33, MakeInstructionDescriptor(38, SpvOpAccessChain, 0));
+        100, 33, false, 0, 0,
+        MakeInstructionDescriptor(38, SpvOpAccessChain, 0));
     ASSERT_TRUE(
         transformation.IsApplicable(context.get(), transformation_context));
     ApplyAndCheckFreshIds(transformation, context.get(),
@@ -198,7 +202,8 @@
 
   {
     TransformationLoad transformation(
-        101, 46, MakeInstructionDescriptor(16, SpvOpReturnValue, 0));
+        101, 46, false, 0, 0,
+        MakeInstructionDescriptor(16, SpvOpReturnValue, 0));
     ASSERT_TRUE(
         transformation.IsApplicable(context.get(), transformation_context));
     ApplyAndCheckFreshIds(transformation, context.get(),
@@ -209,7 +214,8 @@
 
   {
     TransformationLoad transformation(
-        102, 16, MakeInstructionDescriptor(16, SpvOpReturnValue, 0));
+        102, 16, false, 0, 0,
+        MakeInstructionDescriptor(16, SpvOpReturnValue, 0));
     ASSERT_TRUE(
         transformation.IsApplicable(context.get(), transformation_context));
     ApplyAndCheckFreshIds(transformation, context.get(),
@@ -220,7 +226,8 @@
 
   {
     TransformationLoad transformation(
-        103, 40, MakeInstructionDescriptor(43, SpvOpAccessChain, 0));
+        103, 40, false, 0, 0,
+        MakeInstructionDescriptor(43, SpvOpAccessChain, 0));
     ASSERT_TRUE(
         transformation.IsApplicable(context.get(), transformation_context));
     ApplyAndCheckFreshIds(transformation, context.get(),
@@ -231,6 +238,7 @@
 
   std::string after_transformation = R"(
                OpCapability Shader
+               OpCapability VariablePointers
           %1 = OpExtInstImport "GLSL.std.450"
                OpMemoryModel Logical GLSL450
                OpEntryPoint Fragment %4 "main"
@@ -254,7 +262,6 @@
          %34 = OpTypeBool
          %35 = OpConstantFalse %34
          %60 = OpConstantNull %50
-         %61 = OpUndef %51
          %52 = OpVariable %50 Private
          %53 = OpVariable %51 Private
           %4 = OpFunction %2 None %3
@@ -293,6 +300,296 @@
   ASSERT_TRUE(IsEqual(env, after_transformation, context.get()));
 }
 
+TEST(TransformationLoadTest, AtomicLoadTestCase) {
+  const std::string shader = R"(
+               OpCapability Shader
+               OpCapability Int8
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %4 "main"
+               OpExecutionMode %4 OriginUpperLeft
+               OpSource ESSL 320
+          %2 = OpTypeVoid
+          %3 = OpTypeFunction %2
+          %6 = OpTypeInt 32 1
+          %7 = OpTypeInt 8 1
+          %9 = OpTypeInt 32 0
+         %26 = OpTypeFloat 32
+          %8 = OpTypeStruct %6
+         %10 = OpTypePointer StorageBuffer %8
+         %11 = OpVariable %10 StorageBuffer
+         %19 = OpConstant %26 0
+         %18 = OpConstant %9 1
+         %12 = OpConstant %6 0
+         %13 = OpTypePointer StorageBuffer %6
+         %15 = OpConstant %6 4
+         %16 = OpConstant %6 7
+         %17 = OpConstant %7 4
+         %20 = OpConstant %9 64
+          %4 = OpFunction %2 None %3
+          %5 = OpLabel
+         %14 = OpAccessChain %13 %11 %12
+         %24 = OpAccessChain %13 %11 %12
+               OpReturn
+               OpFunctionEnd
+  )";
+
+  const auto env = SPV_ENV_UNIVERSAL_1_3;
+  const auto consumer = nullptr;
+  const auto context = BuildModule(env, consumer, shader, kFuzzAssembleOption);
+  spvtools::ValidatorOptions validator_options;
+  ASSERT_TRUE(fuzzerutil::IsValidAndWellFormed(context.get(), validator_options,
+                                               kConsoleMessageConsumer));
+  TransformationContext transformation_context(
+      MakeUnique<FactManager>(context.get()), validator_options);
+
+  // Bad: id is not fresh.
+  ASSERT_FALSE(
+      TransformationLoad(14, 14, true, 15, 20,
+                         MakeInstructionDescriptor(24, SpvOpAccessChain, 0))
+          .IsApplicable(context.get(), transformation_context));
+
+  // Bad: id 100 of memory scope instruction does not exist.
+  ASSERT_FALSE(
+      TransformationLoad(21, 14, true, 100, 20,
+                         MakeInstructionDescriptor(24, SpvOpAccessChain, 0))
+          .IsApplicable(context.get(), transformation_context));
+  // Bad: id 100 of memory semantics instruction does not exist.
+  ASSERT_FALSE(
+      TransformationLoad(21, 14, true, 15, 100,
+                         MakeInstructionDescriptor(24, SpvOpAccessChain, 0))
+          .IsApplicable(context.get(), transformation_context));
+  // Bad: memory scope should be |OpConstant| opcode.
+  ASSERT_FALSE(
+      TransformationLoad(21, 14, true, 5, 20,
+                         MakeInstructionDescriptor(24, SpvOpAccessChain, 0))
+          .IsApplicable(context.get(), transformation_context));
+  // Bad: memory semantics should be |OpConstant| opcode.
+  ASSERT_FALSE(
+      TransformationLoad(21, 14, true, 15, 5,
+                         MakeInstructionDescriptor(24, SpvOpAccessChain, 0))
+          .IsApplicable(context.get(), transformation_context));
+
+  // Bad: The memory scope instruction must have an Integer operand.
+  ASSERT_FALSE(
+      TransformationLoad(21, 14, true, 15, 19,
+                         MakeInstructionDescriptor(24, SpvOpAccessChain, 0))
+          .IsApplicable(context.get(), transformation_context));
+  // Bad: The memory memory semantics instruction must have an Integer operand.
+  ASSERT_FALSE(
+      TransformationLoad(21, 14, true, 19, 20,
+                         MakeInstructionDescriptor(24, SpvOpAccessChain, 0))
+          .IsApplicable(context.get(), transformation_context));
+
+  // Bad: Integer size of the memory scope must be equal to 32 bits.
+  ASSERT_FALSE(
+      TransformationLoad(21, 14, true, 17, 20,
+                         MakeInstructionDescriptor(24, SpvOpAccessChain, 0))
+          .IsApplicable(context.get(), transformation_context));
+
+  // Bad: Integer size of memory semantics must be equal to 32 bits.
+  ASSERT_FALSE(
+      TransformationLoad(21, 14, true, 15, 17,
+                         MakeInstructionDescriptor(24, SpvOpAccessChain, 0))
+          .IsApplicable(context.get(), transformation_context));
+
+  // Bad: memory scope value must be 4 (SpvScopeInvocation).
+  ASSERT_FALSE(
+      TransformationLoad(21, 14, true, 16, 20,
+                         MakeInstructionDescriptor(24, SpvOpAccessChain, 0))
+          .IsApplicable(context.get(), transformation_context));
+
+  // Bad: memory semantics value must be either:
+  // 64 (SpvMemorySemanticsUniformMemoryMask)
+  // 256 (SpvMemorySemanticsWorkgroupMemoryMask)
+  ASSERT_FALSE(
+      TransformationLoad(21, 14, true, 15, 16,
+                         MakeInstructionDescriptor(24, SpvOpAccessChain, 0))
+          .IsApplicable(context.get(), transformation_context));
+
+  // Bad: The described instruction does not exist
+  ASSERT_FALSE(
+      TransformationLoad(21, 14, false, 15, 20,
+                         MakeInstructionDescriptor(150, SpvOpAccessChain, 0))
+          .IsApplicable(context.get(), transformation_context));
+
+  // Successful transformations.
+  {
+    TransformationLoad transformation(
+        21, 14, true, 15, 20,
+        MakeInstructionDescriptor(24, SpvOpAccessChain, 0));
+    ASSERT_TRUE(
+        transformation.IsApplicable(context.get(), transformation_context));
+    ApplyAndCheckFreshIds(transformation, context.get(),
+                          &transformation_context);
+    ASSERT_TRUE(fuzzerutil::IsValidAndWellFormed(
+        context.get(), validator_options, kConsoleMessageConsumer));
+  }
+
+  const std::string after_transformation = R"(
+               OpCapability Shader
+               OpCapability Int8
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %4 "main"
+               OpExecutionMode %4 OriginUpperLeft
+               OpSource ESSL 320
+          %2 = OpTypeVoid
+          %3 = OpTypeFunction %2
+          %6 = OpTypeInt 32 1
+          %7 = OpTypeInt 8 1
+          %9 = OpTypeInt 32 0
+         %26 = OpTypeFloat 32
+          %8 = OpTypeStruct %6
+         %10 = OpTypePointer StorageBuffer %8
+         %11 = OpVariable %10 StorageBuffer
+         %19 = OpConstant %26 0
+         %18 = OpConstant %9 1
+         %12 = OpConstant %6 0
+         %13 = OpTypePointer StorageBuffer %6
+         %15 = OpConstant %6 4
+         %16 = OpConstant %6 7
+         %17 = OpConstant %7 4
+         %20 = OpConstant %9 64
+          %4 = OpFunction %2 None %3
+          %5 = OpLabel
+         %14 = OpAccessChain %13 %11 %12
+         %21 = OpAtomicLoad %6 %14 %15 %20
+         %24 = OpAccessChain %13 %11 %12
+               OpReturn
+               OpFunctionEnd
+  )";
+
+  ASSERT_TRUE(IsEqual(env, after_transformation, context.get()));
+}
+
+TEST(TransformationLoadTest, AtomicLoadTestCaseForWorkgroupMemory) {
+  std::string shader = R"(
+               OpCapability Shader
+               OpCapability Int8
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %4 "main"
+               OpExecutionMode %4 OriginUpperLeft
+               OpSource ESSL 310
+          %2 = OpTypeVoid
+          %3 = OpTypeFunction %2
+          %6 = OpTypeInt 32 1
+          %26 = OpTypeFloat 32
+          %27 = OpTypeInt 8 1
+          %7 = OpTypeInt 32 0 ; 0 means unsigned
+          %8 = OpConstant %7 0
+         %17 = OpConstant %27 4
+         %19 = OpConstant %26 0
+          %9 = OpTypePointer Function %6
+         %13 = OpTypeStruct %6
+         %12 = OpTypePointer Workgroup %13
+         %11 = OpVariable %12 Workgroup
+         %14 = OpConstant %6 0
+         %15 = OpTypePointer Function %6
+         %51 = OpTypePointer Private %6
+         %21 = OpConstant %6 4
+         %23 = OpConstant %6 256
+         %25 = OpTypePointer Function %7
+         %50 = OpTypePointer Workgroup %6
+         %34 = OpTypeBool
+         %35 = OpConstantFalse %34
+         %53 = OpVariable %51 Private
+          %4 = OpFunction %2 None %3
+          %5 = OpLabel
+               OpSelectionMerge %37 None
+               OpBranchConditional %35 %36 %37
+         %36 = OpLabel
+         %38 = OpAccessChain %50 %11 %14
+         %40 = OpAccessChain %50 %11 %14
+               OpBranch %37
+         %37 = OpLabel
+               OpReturn
+               OpFunctionEnd
+  )";
+
+  const auto env = SPV_ENV_UNIVERSAL_1_3;
+  const auto consumer = nullptr;
+  const auto context = BuildModule(env, consumer, shader, kFuzzAssembleOption);
+  spvtools::ValidatorOptions validator_options;
+  ASSERT_TRUE(fuzzerutil::IsValidAndWellFormed(context.get(), validator_options,
+                                               kConsoleMessageConsumer));
+  TransformationContext transformation_context(
+      MakeUnique<FactManager>(context.get()), validator_options);
+
+  // Bad: Can't insert OpAccessChain before the id 23 of memory scope.
+  ASSERT_FALSE(
+      TransformationLoad(60, 38, true, 21, 23,
+                         MakeInstructionDescriptor(23, SpvOpAccessChain, 0))
+          .IsApplicable(context.get(), transformation_context));
+
+  // Bad: Can't insert OpAccessChain before the id 23 of memory semantics.
+  ASSERT_FALSE(
+      TransformationLoad(60, 38, true, 21, 23,
+                         MakeInstructionDescriptor(21, SpvOpAccessChain, 0))
+          .IsApplicable(context.get(), transformation_context));
+
+  // Successful transformations.
+  {
+    TransformationLoad transformation(
+        60, 38, true, 21, 23,
+        MakeInstructionDescriptor(40, SpvOpAccessChain, 0));
+    ASSERT_TRUE(
+        transformation.IsApplicable(context.get(), transformation_context));
+    ApplyAndCheckFreshIds(transformation, context.get(),
+                          &transformation_context);
+    ASSERT_TRUE(fuzzerutil::IsValidAndWellFormed(
+        context.get(), validator_options, kConsoleMessageConsumer));
+  }
+
+  std::string after_transformation = R"(
+               OpCapability Shader
+               OpCapability Int8
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %4 "main"
+               OpExecutionMode %4 OriginUpperLeft
+               OpSource ESSL 310
+          %2 = OpTypeVoid
+          %3 = OpTypeFunction %2
+          %6 = OpTypeInt 32 1
+          %26 = OpTypeFloat 32
+          %27 = OpTypeInt 8 1
+          %7 = OpTypeInt 32 0 ; 0 means unsigned
+          %8 = OpConstant %7 0
+         %17 = OpConstant %27 4
+         %19 = OpConstant %26 0
+          %9 = OpTypePointer Function %6
+         %13 = OpTypeStruct %6
+         %12 = OpTypePointer Workgroup %13
+         %11 = OpVariable %12 Workgroup
+         %14 = OpConstant %6 0
+         %15 = OpTypePointer Function %6
+         %51 = OpTypePointer Private %6
+         %21 = OpConstant %6 4
+         %23 = OpConstant %6 256
+         %25 = OpTypePointer Function %7
+         %50 = OpTypePointer Workgroup %6
+         %34 = OpTypeBool
+         %35 = OpConstantFalse %34
+         %53 = OpVariable %51 Private
+          %4 = OpFunction %2 None %3
+          %5 = OpLabel
+               OpSelectionMerge %37 None
+               OpBranchConditional %35 %36 %37
+         %36 = OpLabel
+         %38 = OpAccessChain %50 %11 %14
+         %60 = OpAtomicLoad %6 %38 %21 %23
+         %40 = OpAccessChain %50 %11 %14
+               OpBranch %37
+         %37 = OpLabel
+               OpReturn
+               OpFunctionEnd
+  )";
+
+  ASSERT_TRUE(IsEqual(env, after_transformation, context.get()));
+}
+
 }  // namespace
 }  // namespace fuzz
 }  // namespace spvtools
diff --git a/third_party/vulkan-deps/spirv-tools/src/test/fuzz/transformation_mutate_pointer_test.cpp b/third_party/vulkan-deps/spirv-tools/src/test/fuzz/transformation_mutate_pointer_test.cpp
index ae42310..e869efa 100644
--- a/third_party/vulkan-deps/spirv-tools/src/test/fuzz/transformation_mutate_pointer_test.cpp
+++ b/third_party/vulkan-deps/spirv-tools/src/test/fuzz/transformation_mutate_pointer_test.cpp
@@ -26,6 +26,7 @@
 TEST(TransformationMutatePointerTest, BasicTest) {
   std::string shader = R"(
                OpCapability Shader
+               OpCapability VariablePointers
           %1 = OpExtInstImport "GLSL.std.450"
                OpMemoryModel Logical GLSL450
                OpEntryPoint Fragment %4 "main"
@@ -60,7 +61,6 @@
          %23 = OpTypePointer Output %6
          %24 = OpVariable %23 Output
          %27 = OpTypeFunction %2 %13
-         %32 = OpUndef %16
          %33 = OpConstantNull %16
           %4 = OpFunction %2 None %3
           %5 = OpLabel
@@ -110,10 +110,6 @@
   ASSERT_FALSE(TransformationMutatePointer(11, 70, insert_before)
                    .IsApplicable(context.get(), transformation_context));
 
-  // |pointer_id| is a result id of OpUndef.
-  ASSERT_FALSE(TransformationMutatePointer(32, 70, insert_before)
-                   .IsApplicable(context.get(), transformation_context));
-
   // |pointer_id| is a result id of OpConstantNull.
   ASSERT_FALSE(TransformationMutatePointer(33, 70, insert_before)
                    .IsApplicable(context.get(), transformation_context));
@@ -163,6 +159,7 @@
 
   std::string after_transformation = R"(
                OpCapability Shader
+               OpCapability VariablePointers
           %1 = OpExtInstImport "GLSL.std.450"
                OpMemoryModel Logical GLSL450
                OpEntryPoint Fragment %4 "main"
@@ -197,7 +194,6 @@
          %23 = OpTypePointer Output %6
          %24 = OpVariable %23 Output
          %27 = OpTypeFunction %2 %13
-         %32 = OpUndef %16
          %33 = OpConstantNull %16
           %4 = OpFunction %2 None %3
           %5 = OpLabel
diff --git a/third_party/vulkan-deps/spirv-tools/src/test/fuzz/transformation_push_id_through_variable_test.cpp b/third_party/vulkan-deps/spirv-tools/src/test/fuzz/transformation_push_id_through_variable_test.cpp
index 7487cab..b0fff58 100644
--- a/third_party/vulkan-deps/spirv-tools/src/test/fuzz/transformation_push_id_through_variable_test.cpp
+++ b/third_party/vulkan-deps/spirv-tools/src/test/fuzz/transformation_push_id_through_variable_test.cpp
@@ -26,6 +26,7 @@
 TEST(TransformationPushIdThroughVariableTest, IsApplicable) {
   std::string reference_shader = R"(
                OpCapability Shader
+               OpCapability VariablePointers
           %1 = OpExtInstImport "GLSL.std.450"
                OpMemoryModel Logical GLSL450
                OpEntryPoint Fragment %4 "main" %92 %52 %53
@@ -50,7 +51,6 @@
          %34 = OpTypeBool
          %35 = OpConstantFalse %34
          %60 = OpConstantNull %50
-         %61 = OpUndef %51
          %52 = OpVariable %50 Private
          %53 = OpVariable %51 Private
          %80 = OpConstantComposite %8 %21 %24
@@ -257,6 +257,7 @@
 TEST(TransformationPushIdThroughVariableTest, Apply) {
   std::string reference_shader = R"(
                OpCapability Shader
+               OpCapability VariablePointers
           %1 = OpExtInstImport "GLSL.std.450"
                OpMemoryModel Logical GLSL450
                OpEntryPoint Fragment %4 "main" %92 %52 %53
@@ -281,7 +282,6 @@
          %34 = OpTypeBool
          %35 = OpConstantFalse %34
          %60 = OpConstantNull %50
-         %61 = OpUndef %51
          %52 = OpVariable %50 Private
          %53 = OpVariable %51 Private
          %80 = OpConstantComposite %8 %21 %24
@@ -419,6 +419,7 @@
 
   std::string variant_shader = R"(
                OpCapability Shader
+               OpCapability VariablePointers
           %1 = OpExtInstImport "GLSL.std.450"
                OpMemoryModel Logical GLSL450
                OpEntryPoint Fragment %4 "main" %92 %52 %53 %109 %111
@@ -443,7 +444,6 @@
          %34 = OpTypeBool
          %35 = OpConstantFalse %34
          %60 = OpConstantNull %50
-         %61 = OpUndef %51
          %52 = OpVariable %50 Private
          %53 = OpVariable %51 Private
          %80 = OpConstantComposite %8 %21 %24
@@ -519,6 +519,7 @@
 TEST(TransformationPushIdThroughVariableTest, AddSynonymsForRelevantIds) {
   std::string reference_shader = R"(
                OpCapability Shader
+               OpCapability VariablePointers
           %1 = OpExtInstImport "GLSL.std.450"
                OpMemoryModel Logical GLSL450
                OpEntryPoint Fragment %4 "main" %92 %52 %53
@@ -543,7 +544,6 @@
          %34 = OpTypeBool
          %35 = OpConstantFalse %34
          %60 = OpConstantNull %50
-         %61 = OpUndef %51
          %52 = OpVariable %50 Private
          %53 = OpVariable %51 Private
          %80 = OpConstantComposite %8 %21 %24
@@ -620,6 +620,7 @@
 TEST(TransformationPushIdThroughVariableTest, DontAddSynonymsForIrrelevantIds) {
   std::string reference_shader = R"(
                OpCapability Shader
+               OpCapability VariablePointers
           %1 = OpExtInstImport "GLSL.std.450"
                OpMemoryModel Logical GLSL450
                OpEntryPoint Fragment %4 "main" %92 %52 %53
@@ -644,7 +645,6 @@
          %34 = OpTypeBool
          %35 = OpConstantFalse %34
          %60 = OpConstantNull %50
-         %61 = OpUndef %51
          %52 = OpVariable %50 Private
          %53 = OpVariable %51 Private
          %80 = OpConstantComposite %8 %21 %24
diff --git a/third_party/vulkan-deps/spirv-tools/src/test/fuzz/transformation_store_test.cpp b/third_party/vulkan-deps/spirv-tools/src/test/fuzz/transformation_store_test.cpp
index 93257d0..dd653e2 100644
--- a/third_party/vulkan-deps/spirv-tools/src/test/fuzz/transformation_store_test.cpp
+++ b/third_party/vulkan-deps/spirv-tools/src/test/fuzz/transformation_store_test.cpp
@@ -26,6 +26,7 @@
 TEST(TransformationStoreTest, BasicTest) {
   std::string shader = R"(
                OpCapability Shader
+               OpCapability VariablePointers
           %1 = OpExtInstImport "GLSL.std.450"
                OpMemoryModel Logical GLSL450
                OpEntryPoint Fragment %4 "main" %92 %52 %53
@@ -50,7 +51,6 @@
          %34 = OpTypeBool
          %35 = OpConstantFalse %34
          %60 = OpConstantNull %50
-         %61 = OpUndef %51
          %52 = OpVariable %50 Private
          %53 = OpVariable %51 Private
          %80 = OpConstantComposite %8 %21 %24
@@ -148,90 +148,107 @@
   //  61 - undefined
 
   // Bad: attempt to store to 11 from outside its function
-  ASSERT_FALSE(TransformationStore(
-                   11, 80, MakeInstructionDescriptor(38, SpvOpAccessChain, 0))
-                   .IsApplicable(context.get(), transformation_context));
+  ASSERT_FALSE(
+      TransformationStore(11, false, 0, 0, 80,
+                          MakeInstructionDescriptor(38, SpvOpAccessChain, 0))
+          .IsApplicable(context.get(), transformation_context));
 
   // Bad: pointer is not available
-  ASSERT_FALSE(TransformationStore(
-                   81, 80, MakeInstructionDescriptor(45, SpvOpCopyObject, 0))
-                   .IsApplicable(context.get(), transformation_context));
+  ASSERT_FALSE(
+      TransformationStore(81, false, 0, 0, 80,
+                          MakeInstructionDescriptor(45, SpvOpCopyObject, 0))
+          .IsApplicable(context.get(), transformation_context));
 
   // Bad: attempt to insert before OpVariable
-  ASSERT_FALSE(TransformationStore(
-                   52, 24, MakeInstructionDescriptor(27, SpvOpVariable, 0))
-                   .IsApplicable(context.get(), transformation_context));
+  ASSERT_FALSE(
+      TransformationStore(52, false, 0, 0, 24,
+                          MakeInstructionDescriptor(27, SpvOpVariable, 0))
+          .IsApplicable(context.get(), transformation_context));
 
   // Bad: pointer id does not exist
-  ASSERT_FALSE(TransformationStore(
-                   1000, 24, MakeInstructionDescriptor(38, SpvOpAccessChain, 0))
-                   .IsApplicable(context.get(), transformation_context));
+  ASSERT_FALSE(
+      TransformationStore(1000, false, 0, 0, 24,
+                          MakeInstructionDescriptor(38, SpvOpAccessChain, 0))
+          .IsApplicable(context.get(), transformation_context));
 
   // Bad: pointer id exists but does not have a type
-  ASSERT_FALSE(TransformationStore(
-                   5, 24, MakeInstructionDescriptor(38, SpvOpAccessChain, 0))
-                   .IsApplicable(context.get(), transformation_context));
+  ASSERT_FALSE(
+      TransformationStore(5, false, 0, 0, 24,
+                          MakeInstructionDescriptor(38, SpvOpAccessChain, 0))
+          .IsApplicable(context.get(), transformation_context));
 
   // Bad: pointer id exists and has a type, but is not a pointer
-  ASSERT_FALSE(TransformationStore(
-                   24, 24, MakeInstructionDescriptor(38, SpvOpAccessChain, 0))
-                   .IsApplicable(context.get(), transformation_context));
+  ASSERT_FALSE(
+      TransformationStore(24, false, 0, 0, 24,
+                          MakeInstructionDescriptor(38, SpvOpAccessChain, 0))
+          .IsApplicable(context.get(), transformation_context));
 
   // Bad: attempt to store to a null pointer
-  ASSERT_FALSE(TransformationStore(
-                   60, 24, MakeInstructionDescriptor(38, SpvOpAccessChain, 0))
-                   .IsApplicable(context.get(), transformation_context));
+  ASSERT_FALSE(
+      TransformationStore(60, false, 0, 0, 24,
+                          MakeInstructionDescriptor(38, SpvOpAccessChain, 0))
+          .IsApplicable(context.get(), transformation_context));
 
   // Bad: attempt to store to an undefined pointer
-  ASSERT_FALSE(TransformationStore(
-                   61, 21, MakeInstructionDescriptor(38, SpvOpAccessChain, 0))
-                   .IsApplicable(context.get(), transformation_context));
+  ASSERT_FALSE(
+      TransformationStore(61, false, 0, 0, 21,
+                          MakeInstructionDescriptor(38, SpvOpAccessChain, 0))
+          .IsApplicable(context.get(), transformation_context));
 
   // Bad: %82 is not available at the program point
   ASSERT_FALSE(
-      TransformationStore(82, 80, MakeInstructionDescriptor(37, SpvOpReturn, 0))
+      TransformationStore(82, false, 0, 0, 80,
+                          MakeInstructionDescriptor(37, SpvOpReturn, 0))
           .IsApplicable(context.get(), transformation_context));
 
   // Bad: value id does not exist
-  ASSERT_FALSE(TransformationStore(
-                   27, 1000, MakeInstructionDescriptor(38, SpvOpAccessChain, 0))
-                   .IsApplicable(context.get(), transformation_context));
+  ASSERT_FALSE(
+      TransformationStore(27, false, 0, 0, 1000,
+                          MakeInstructionDescriptor(38, SpvOpAccessChain, 0))
+          .IsApplicable(context.get(), transformation_context));
 
   // Bad: value id exists but does not have a type
-  ASSERT_FALSE(TransformationStore(
-                   27, 15, MakeInstructionDescriptor(38, SpvOpAccessChain, 0))
-                   .IsApplicable(context.get(), transformation_context));
+  ASSERT_FALSE(
+      TransformationStore(27, false, 0, 0, 15,
+                          MakeInstructionDescriptor(38, SpvOpAccessChain, 0))
+          .IsApplicable(context.get(), transformation_context));
 
   // Bad: value id exists but has the wrong type
-  ASSERT_FALSE(TransformationStore(
-                   27, 14, MakeInstructionDescriptor(38, SpvOpAccessChain, 0))
-                   .IsApplicable(context.get(), transformation_context));
+  ASSERT_FALSE(
+      TransformationStore(27, false, 0, 0, 14,
+                          MakeInstructionDescriptor(38, SpvOpAccessChain, 0))
+          .IsApplicable(context.get(), transformation_context));
 
   // Bad: attempt to store to read-only variable
-  ASSERT_FALSE(TransformationStore(
-                   92, 93, MakeInstructionDescriptor(40, SpvOpAccessChain, 0))
-                   .IsApplicable(context.get(), transformation_context));
+  ASSERT_FALSE(
+      TransformationStore(92, false, 0, 0, 93,
+                          MakeInstructionDescriptor(40, SpvOpAccessChain, 0))
+          .IsApplicable(context.get(), transformation_context));
 
   // Bad: value is not available
-  ASSERT_FALSE(TransformationStore(
-                   27, 95, MakeInstructionDescriptor(40, SpvOpAccessChain, 0))
-                   .IsApplicable(context.get(), transformation_context));
+  ASSERT_FALSE(
+      TransformationStore(27, false, 0, 0, 95,
+                          MakeInstructionDescriptor(40, SpvOpAccessChain, 0))
+          .IsApplicable(context.get(), transformation_context));
 
   // Bad: variable being stored to does not have an irrelevant pointee value,
   // and the store is not in a dead block.
-  ASSERT_FALSE(TransformationStore(
-                   20, 95, MakeInstructionDescriptor(45, SpvOpCopyObject, 0))
-                   .IsApplicable(context.get(), transformation_context));
+  ASSERT_FALSE(
+      TransformationStore(20, false, 0, 0, 95,
+                          MakeInstructionDescriptor(45, SpvOpCopyObject, 0))
+          .IsApplicable(context.get(), transformation_context));
 
   // The described instruction does not exist.
-  ASSERT_FALSE(TransformationStore(
-                   27, 80, MakeInstructionDescriptor(1000, SpvOpAccessChain, 0))
-                   .IsApplicable(context.get(), transformation_context));
+  ASSERT_FALSE(
+      TransformationStore(27, false, 0, 0, 80,
+                          MakeInstructionDescriptor(1000, SpvOpAccessChain, 0))
+          .IsApplicable(context.get(), transformation_context));
 
   {
     // Store to irrelevant variable from dead block.
     TransformationStore transformation(
-        27, 80, MakeInstructionDescriptor(38, SpvOpAccessChain, 0));
+        27, false, 0, 0, 80,
+        MakeInstructionDescriptor(38, SpvOpAccessChain, 0));
     ASSERT_TRUE(
         transformation.IsApplicable(context.get(), transformation_context));
     ApplyAndCheckFreshIds(transformation, context.get(),
@@ -243,7 +260,8 @@
   {
     // Store to irrelevant variable from live block.
     TransformationStore transformation(
-        11, 95, MakeInstructionDescriptor(95, SpvOpReturnValue, 0));
+        11, false, 0, 0, 95,
+        MakeInstructionDescriptor(95, SpvOpReturnValue, 0));
     ASSERT_TRUE(
         transformation.IsApplicable(context.get(), transformation_context));
     ApplyAndCheckFreshIds(transformation, context.get(),
@@ -255,7 +273,8 @@
   {
     // Store to irrelevant variable from live block.
     TransformationStore transformation(
-        46, 80, MakeInstructionDescriptor(95, SpvOpReturnValue, 0));
+        46, false, 0, 0, 80,
+        MakeInstructionDescriptor(95, SpvOpReturnValue, 0));
     ASSERT_TRUE(
         transformation.IsApplicable(context.get(), transformation_context));
     ApplyAndCheckFreshIds(transformation, context.get(),
@@ -267,7 +286,8 @@
   {
     // Store to irrelevant variable from live block.
     TransformationStore transformation(
-        16, 21, MakeInstructionDescriptor(95, SpvOpReturnValue, 0));
+        16, false, 0, 0, 21,
+        MakeInstructionDescriptor(95, SpvOpReturnValue, 0));
     ASSERT_TRUE(
         transformation.IsApplicable(context.get(), transformation_context));
     ApplyAndCheckFreshIds(transformation, context.get(),
@@ -279,7 +299,8 @@
   {
     // Store to non-irrelevant variable from dead block.
     TransformationStore transformation(
-        53, 21, MakeInstructionDescriptor(38, SpvOpAccessChain, 0));
+        53, false, 0, 0, 21,
+        MakeInstructionDescriptor(38, SpvOpAccessChain, 0));
     ASSERT_TRUE(
         transformation.IsApplicable(context.get(), transformation_context));
     ApplyAndCheckFreshIds(transformation, context.get(),
@@ -290,6 +311,7 @@
 
   std::string after_transformation = R"(
                OpCapability Shader
+               OpCapability VariablePointers
           %1 = OpExtInstImport "GLSL.std.450"
                OpMemoryModel Logical GLSL450
                OpEntryPoint Fragment %4 "main" %92 %52 %53
@@ -314,7 +336,6 @@
          %34 = OpTypeBool
          %35 = OpConstantFalse %34
          %60 = OpConstantNull %50
-         %61 = OpUndef %51
          %52 = OpVariable %50 Private
          %53 = OpVariable %51 Private
          %80 = OpConstantComposite %8 %21 %24
@@ -414,16 +435,190 @@
   transformation_context.GetFactManager()->AddFactBlockIsDead(5);
 
   ASSERT_FALSE(
-      TransformationStore(15, 13, MakeInstructionDescriptor(27, SpvOpReturn, 0))
+      TransformationStore(15, false, 0, 0, 13,
+                          MakeInstructionDescriptor(27, SpvOpReturn, 0))
           .IsApplicable(context.get(), transformation_context));
   ASSERT_FALSE(
-      TransformationStore(19, 50, MakeInstructionDescriptor(27, SpvOpReturn, 0))
+      TransformationStore(19, false, 0, 0, 50,
+                          MakeInstructionDescriptor(27, SpvOpReturn, 0))
           .IsApplicable(context.get(), transformation_context));
   ASSERT_FALSE(
-      TransformationStore(27, 50, MakeInstructionDescriptor(27, SpvOpReturn, 0))
+      TransformationStore(27, false, 0, 0, 50,
+                          MakeInstructionDescriptor(27, SpvOpReturn, 0))
           .IsApplicable(context.get(), transformation_context));
 }
 
+TEST(TransformationStoreTest, SupportAtomicStore) {
+  const std::string shader = R"(
+               OpCapability Shader
+               OpCapability Int8
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %4 "main"
+               OpExecutionMode %4 OriginUpperLeft
+               OpSource ESSL 320
+          %2 = OpTypeVoid
+          %3 = OpTypeFunction %2
+          %6 = OpTypeInt 32 1
+          %7 = OpTypeInt 8 1
+          %9 = OpTypeInt 32 0
+         %26 = OpTypeFloat 32
+          %8 = OpTypeStruct %6
+         %10 = OpTypePointer StorageBuffer %8
+         %11 = OpVariable %10 StorageBuffer
+         %19 = OpConstant %26 0
+         %18 = OpConstant %9 1
+         %12 = OpConstant %6 0
+         %13 = OpTypePointer StorageBuffer %6
+         %15 = OpConstant %6 4
+         %16 = OpConstant %6 7
+         %17 = OpConstant %7 4
+         %20 = OpConstant %9 64
+         %21 = OpConstant %6 15
+          %4 = OpFunction %2 None %3
+          %5 = OpLabel
+         %14 = OpAccessChain %13 %11 %12
+         %24 = OpAccessChain %13 %11 %12
+               OpReturn
+               OpFunctionEnd
+  )";
+  const auto env = SPV_ENV_UNIVERSAL_1_3;
+  const auto consumer = nullptr;
+  const auto context = BuildModule(env, consumer, shader, kFuzzAssembleOption);
+  spvtools::ValidatorOptions validator_options;
+  ASSERT_TRUE(fuzzerutil::IsValidAndWellFormed(context.get(), validator_options,
+                                               kConsoleMessageConsumer));
+  TransformationContext transformation_context(
+      MakeUnique<FactManager>(context.get()), validator_options);
+
+  transformation_context.GetFactManager()->AddFactValueOfPointeeIsIrrelevant(
+      14);
+
+  // Bad: id 100 of memory scope instruction does not exist.
+  ASSERT_FALSE(
+      TransformationStore(14, true, 100, 20, 21,
+                          MakeInstructionDescriptor(24, SpvOpAccessChain, 0))
+          .IsApplicable(context.get(), transformation_context));
+  // Bad: id 100 of memory semantics instruction does not exist.
+  ASSERT_FALSE(
+      TransformationStore(14, true, 15, 100, 21,
+                          MakeInstructionDescriptor(24, SpvOpAccessChain, 0))
+          .IsApplicable(context.get(), transformation_context));
+  // Bad: memory scope should be |OpConstant| opcode.
+  ASSERT_FALSE(
+      TransformationStore(14, true, 5, 20, 21,
+                          MakeInstructionDescriptor(24, SpvOpAccessChain, 0))
+          .IsApplicable(context.get(), transformation_context));
+  // Bad: memory semantics should be |OpConstant| opcode.
+  ASSERT_FALSE(
+      TransformationStore(14, true, 15, 5, 21,
+                          MakeInstructionDescriptor(24, SpvOpAccessChain, 0))
+          .IsApplicable(context.get(), transformation_context));
+
+  // Bad: The memory scope instruction must have an Integer operand.
+  ASSERT_FALSE(
+      TransformationStore(14, true, 15, 19, 21,
+                          MakeInstructionDescriptor(24, SpvOpAccessChain, 0))
+          .IsApplicable(context.get(), transformation_context));
+  // Bad: The memory memory semantics instruction must have an Integer operand.
+  ASSERT_FALSE(
+      TransformationStore(14, true, 19, 20, 21,
+                          MakeInstructionDescriptor(24, SpvOpAccessChain, 0))
+          .IsApplicable(context.get(), transformation_context));
+
+  // Bad: Integer size of the memory scope must be equal to 32 bits.
+  ASSERT_FALSE(
+      TransformationStore(14, true, 17, 20, 21,
+                          MakeInstructionDescriptor(24, SpvOpAccessChain, 0))
+          .IsApplicable(context.get(), transformation_context));
+
+  // Bad: Integer size of memory semantics must be equal to 32 bits.
+  ASSERT_FALSE(
+      TransformationStore(14, true, 15, 17, 21,
+                          MakeInstructionDescriptor(24, SpvOpAccessChain, 0))
+          .IsApplicable(context.get(), transformation_context));
+
+  // Bad: memory scope value must be 4 (SpvScopeInvocation).
+  ASSERT_FALSE(
+      TransformationStore(14, true, 16, 20, 21,
+                          MakeInstructionDescriptor(24, SpvOpAccessChain, 0))
+          .IsApplicable(context.get(), transformation_context));
+
+  // Bad: memory semantics value must be either:
+  // 64 (SpvMemorySemanticsUniformMemoryMask)
+  // 256 (SpvMemorySemanticsWorkgroupMemoryMask)
+  ASSERT_FALSE(
+      TransformationStore(14, true, 15, 16, 21,
+                          MakeInstructionDescriptor(24, SpvOpAccessChain, 0))
+          .IsApplicable(context.get(), transformation_context));
+  // Bad: The described instruction does not exist
+  ASSERT_FALSE(
+      TransformationStore(14, true, 15, 20, 21,
+                          MakeInstructionDescriptor(150, SpvOpAccessChain, 0))
+          .IsApplicable(context.get(), transformation_context));
+
+  // Bad: Can't insert OpAccessChain before the id 15 of memory scope.
+  ASSERT_FALSE(
+      TransformationStore(14, true, 15, 20, 21,
+                          MakeInstructionDescriptor(15, SpvOpAccessChain, 0))
+          .IsApplicable(context.get(), transformation_context));
+
+  // Bad: Can't insert OpAccessChain before the id 20 of memory semantics.
+  ASSERT_FALSE(
+      TransformationStore(14, true, 15, 20, 21,
+                          MakeInstructionDescriptor(20, SpvOpAccessChain, 0))
+          .IsApplicable(context.get(), transformation_context));
+
+  // Successful transformations.
+  {
+    TransformationStore transformation(
+        14, true, 15, 20, 21, MakeInstructionDescriptor(24, SpvOpReturn, 0));
+    ASSERT_TRUE(
+        transformation.IsApplicable(context.get(), transformation_context));
+    ApplyAndCheckFreshIds(transformation, context.get(),
+                          &transformation_context);
+    ASSERT_TRUE(fuzzerutil::IsValidAndWellFormed(
+        context.get(), validator_options, kConsoleMessageConsumer));
+  }
+
+  const std::string after_transformation = R"(
+               OpCapability Shader
+               OpCapability Int8
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %4 "main"
+               OpExecutionMode %4 OriginUpperLeft
+               OpSource ESSL 320
+          %2 = OpTypeVoid
+          %3 = OpTypeFunction %2
+          %6 = OpTypeInt 32 1
+          %7 = OpTypeInt 8 1
+          %9 = OpTypeInt 32 0
+         %26 = OpTypeFloat 32
+          %8 = OpTypeStruct %6
+         %10 = OpTypePointer StorageBuffer %8
+         %11 = OpVariable %10 StorageBuffer
+         %19 = OpConstant %26 0
+         %18 = OpConstant %9 1
+         %12 = OpConstant %6 0
+         %13 = OpTypePointer StorageBuffer %6
+         %15 = OpConstant %6 4
+         %16 = OpConstant %6 7
+         %17 = OpConstant %7 4
+         %20 = OpConstant %9 64
+         %21 = OpConstant %6 15
+          %4 = OpFunction %2 None %3
+          %5 = OpLabel
+         %14 = OpAccessChain %13 %11 %12
+         %24 = OpAccessChain %13 %11 %12
+               OpAtomicStore %14 %15 %20 %21
+               OpReturn
+               OpFunctionEnd
+  )";
+
+  ASSERT_TRUE(IsEqual(env, after_transformation, context.get()));
+}
+
 }  // namespace
 }  // namespace fuzz
 }  // namespace spvtools
diff --git a/third_party/vulkan-deps/spirv-tools/src/test/fuzz/transformation_wrap_vector_synonym_test.cpp b/third_party/vulkan-deps/spirv-tools/src/test/fuzz/transformation_wrap_vector_synonym_test.cpp
new file mode 100644
index 0000000..dae78a5
--- /dev/null
+++ b/third_party/vulkan-deps/spirv-tools/src/test/fuzz/transformation_wrap_vector_synonym_test.cpp
@@ -0,0 +1,1394 @@
+// Copyright (c) 2021 Shiyu Liu
+//
+// 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.
+
+#include "source/fuzz/transformation_wrap_vector_synonym.h"
+
+#include "gtest/gtest.h"
+#include "source/fuzz/fuzzer_util.h"
+#include "source/fuzz/instruction_descriptor.h"
+#include "test/fuzz/fuzz_test_util.h"
+
+namespace spvtools {
+namespace fuzz {
+namespace {
+
+TEST(TransformationWrapVectorSynonym, BasicTest) {
+  std::string shader = R"(
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %4 "main" %97
+               OpExecutionMode %4 OriginUpperLeft
+               OpSource ESSL 310
+               OpName %4 "main"
+          %2 = OpTypeVoid
+          %3 = OpTypeFunction %2
+          %6 = OpTypeInt 32 1
+          %7 = OpTypePointer Function %6
+          %9 = OpConstant %6 10
+         %11 = OpConstant %6 -5
+         %12 = OpTypeVector %6 2
+         %13 = OpTypePointer Function %12
+         %18 = OpTypeInt 32 0
+         %19 = OpTypePointer Function %18
+         %21 = OpConstant %18 8
+         %23 = OpConstant %18 2
+         %24 = OpTypeVector %18 3
+         %25 = OpTypePointer Function %24
+         %31 = OpTypeFloat 32
+         %32 = OpTypePointer Function %31
+         %34 = OpConstant %31 3.29999995
+         %36 = OpConstant %31 1.10000002
+         %37 = OpTypeVector %31 4
+         %38 = OpTypePointer Function %37
+         %96 = OpTypePointer Input %31
+         %97 = OpVariable %96 Input
+          %4 = OpFunction %2 None %3
+          %5 = OpLabel
+          %8 = OpVariable %7 Function
+         %10 = OpVariable %7 Function
+         %14 = OpVariable %13 Function
+         %20 = OpVariable %19 Function
+         %22 = OpVariable %19 Function
+         %26 = OpVariable %25 Function
+         %33 = OpVariable %32 Function
+         %35 = OpVariable %32 Function
+         %39 = OpVariable %38 Function
+         %47 = OpVariable %7 Function
+         %51 = OpVariable %7 Function
+         %55 = OpVariable %7 Function
+         %59 = OpVariable %7 Function
+         %63 = OpVariable %19 Function
+         %67 = OpVariable %19 Function
+         %71 = OpVariable %19 Function
+         %75 = OpVariable %19 Function
+         %79 = OpVariable %32 Function
+         %83 = OpVariable %32 Function
+         %87 = OpVariable %32 Function
+         %91 = OpVariable %32 Function
+               OpStore %8 %9
+               OpStore %10 %11
+         %15 = OpLoad %6 %8
+         %16 = OpLoad %6 %10
+         %17 = OpCompositeConstruct %12 %15 %16
+               OpStore %14 %17
+               OpStore %20 %21
+               OpStore %22 %23
+         %27 = OpLoad %18 %20
+         %28 = OpLoad %18 %20
+         %29 = OpLoad %18 %22
+         %30 = OpCompositeConstruct %24 %27 %28 %29
+               OpStore %26 %30
+               OpStore %33 %34
+               OpStore %35 %36
+         %40 = OpLoad %31 %33
+         %41 = OpLoad %31 %33
+         %42 = OpLoad %31 %35
+         %43 = OpLoad %31 %35
+         %44 = OpCompositeConstruct %37 %40 %41 %42 %43
+         %45 = OpLoad %37 %39
+         %46 = OpVectorShuffle %37 %45 %44 5 6 7 4
+               OpStore %39 %46
+         %48 = OpLoad %6 %8
+         %49 = OpLoad %6 %10
+        %100 = OpCompositeConstruct %12 %48 %48
+        %101 = OpCompositeConstruct %12 %49 %49
+         %50 = OpIAdd %6 %48 %49
+               OpStore %47 %50
+         %52 = OpLoad %6 %8
+         %53 = OpLoad %6 %10
+         %54 = OpISub %6 %52 %53
+               OpStore %51 %54
+         %56 = OpLoad %6 %8
+         %57 = OpLoad %6 %10
+         %58 = OpIMul %6 %56 %57
+               OpStore %55 %58
+         %60 = OpLoad %6 %8
+         %61 = OpLoad %6 %10
+         %62 = OpSDiv %6 %60 %61
+               OpStore %59 %62
+         %64 = OpLoad %18 %20
+         %65 = OpLoad %18 %22
+         %66 = OpIAdd %18 %64 %65
+               OpStore %63 %66
+         %68 = OpLoad %18 %20
+         %69 = OpLoad %18 %22
+         %70 = OpISub %18 %68 %69
+               OpStore %67 %70
+         %72 = OpLoad %18 %20
+         %73 = OpLoad %18 %22
+         %74 = OpIMul %18 %72 %73
+               OpStore %71 %74
+         %76 = OpLoad %18 %20
+         %77 = OpLoad %18 %22
+         %78 = OpUDiv %18 %76 %77
+               OpStore %75 %78
+         %80 = OpLoad %31 %33
+         %81 = OpLoad %31 %35
+         %82 = OpFAdd %31 %80 %81
+               OpStore %79 %82
+         %84 = OpLoad %31 %33
+         %85 = OpLoad %31 %35
+         %86 = OpFSub %31 %84 %85
+               OpStore %83 %86
+         %88 = OpLoad %31 %33
+         %89 = OpLoad %31 %35
+         %90 = OpFMul %31 %88 %89
+               OpStore %87 %90
+         %92 = OpLoad %31 %33
+         %93 = OpLoad %31 %35
+         %94 = OpFDiv %31 %92 %93
+               OpStore %91 %94
+               OpReturn
+               OpFunctionEnd
+  )";
+  const auto env = SPV_ENV_UNIVERSAL_1_3;
+  const auto consumer = nullptr;
+  const auto context = BuildModule(env, consumer, shader, kFuzzAssembleOption);
+  spvtools::ValidatorOptions validator_options;
+
+  // Check context validity.
+  ASSERT_TRUE(fuzzerutil::IsValidAndWellFormed(context.get(), validator_options,
+                                               kConsoleMessageConsumer));
+
+  TransformationContext transformation_context(
+      MakeUnique<FactManager>(context.get()), validator_options);
+
+  // Vec Type Id |   Vector Type  |  Element Type id |   Element Type  |
+  // ------------+----------------+------------------+-----------------+
+  //     12      |      vec2      |         6        |      int32      |
+  //     24      |      vec3      |        18        |     uint32      |
+  //     37      |      vec4      |        31        |      float      |
+
+  // Instruction Id | Opcode  | Type Id | constant id 1 | constant id 2 |
+  // ---------------+---------+---------+---------------+---------------+
+  //       50       | OpIAdd  |    6    |      48       |      49       |
+  //       54       | OpISub  |    6    |      52       |      53       |
+  //       58       | OpIMul  |    6    |      56       |      57       |
+  //       62       | OpSDiv  |    6    |      60       |      61       |
+  //       66       | OpIAdd  |    18   |      64       |      65       |
+  //       70       | OpISub  |    18   |      68       |      69       |
+  //       74       | OpIMul  |    18   |      72       |      73       |
+  //       78       | OpUDiv  |    18   |      76       |      77       |
+  //       82       | OpFAdd  |    31   |      80       |      81       |
+  //       86       | OpFSub  |    31   |      84       |      85       |
+  //       90       | OpFMul  |    31   |      88       |      89       |
+  //       94       | OpFDiv  |    31   |      92       |      93       |
+
+  // Assert that the target scalar instruction result id is relevant.
+  ASSERT_FALSE(transformation_context.GetFactManager()->IdIsIrrelevant(50));
+  transformation_context.GetFactManager()->AddFactDataSynonym(
+      MakeDataDescriptor(100, {1}), MakeDataDescriptor(48, {}));
+  transformation_context.GetFactManager()->AddFactDataSynonym(
+      MakeDataDescriptor(101, {1}), MakeDataDescriptor(49, {}));
+
+  // The following are all invalid use.
+  {
+    // Bad: Instruction id does not exist.
+    TransformationWrapVectorSynonym wrap_add_int_bad1(103, 100, 101, 102, 1);
+    ASSERT_FALSE(
+        wrap_add_int_bad1.IsApplicable(context.get(), transformation_context));
+
+    // Bad: Instruction id given is not of a valid arithmetic operation typed
+    // instruction.
+    TransformationWrapVectorSynonym wrap_add_int_bad2(80, 100, 101, 102, 1);
+    ASSERT_FALSE(
+        wrap_add_int_bad1.IsApplicable(context.get(), transformation_context));
+
+    // Bad: the id for the first vector does not exist.
+    TransformationWrapVectorSynonym wrap_add_int_bad3(50, 105, 101, 102, 1);
+    ASSERT_FALSE(
+        wrap_add_int_bad3.IsApplicable(context.get(), transformation_context));
+
+    // Bad: the id for the second vector does not exist.
+    TransformationWrapVectorSynonym wrap_add_int_bad4(50, 100, 105, 102, 1);
+    ASSERT_FALSE(
+        wrap_add_int_bad4.IsApplicable(context.get(), transformation_context));
+
+    // Bad: vector id is not fresh.
+    TransformationWrapVectorSynonym wrap_add_int_bad6(50, 100, 101, 94, 1);
+    ASSERT_FALSE(
+        wrap_add_int_bad6.IsApplicable(context.get(), transformation_context));
+
+    // Bad: The position goes out of bound for the given vector type.
+    TransformationWrapVectorSynonym wrap_add_int_bad8(50, 100, 101, 102, 2);
+    ASSERT_FALSE(
+        wrap_add_int_bad8.IsApplicable(context.get(), transformation_context));
+
+    // Bad: The original instruction is not a valid scalar operation
+    // instruction.
+    TransformationWrapVectorSynonym wrap_add_int(27, 100, 101, 102, 1);
+    ASSERT_FALSE(
+        wrap_add_int.IsApplicable(context.get(), transformation_context));
+  }
+
+  // Good: The following transformation should be applicable.
+  TransformationWrapVectorSynonym wrap_add_int(50, 100, 101, 102, 1);
+  ASSERT_TRUE(wrap_add_int.IsApplicable(context.get(), transformation_context));
+  // Insert an arithmetic instruction of the same type to add two vectors.
+  ApplyAndCheckFreshIds(wrap_add_int, context.get(), &transformation_context);
+
+  // |instruction_id| and id at |scalar_position of the result vector should be
+  // synonyms.
+  ASSERT_TRUE(transformation_context.GetFactManager()->IsSynonymous(
+      MakeDataDescriptor(102, {1}), MakeDataDescriptor(50, {})));
+
+  // After applying transformations, the instruction:
+  //
+  // %102 = OpIAdd %12 %100 %101
+  //
+  // should be added before:
+  //
+  // %50 = OpIAdd %6 %48 %49
+  std::string after_transformation = R"(
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %4 "main" %97
+               OpExecutionMode %4 OriginUpperLeft
+               OpSource ESSL 310
+               OpName %4 "main"
+          %2 = OpTypeVoid
+          %3 = OpTypeFunction %2
+          %6 = OpTypeInt 32 1
+          %7 = OpTypePointer Function %6
+          %9 = OpConstant %6 10
+         %11 = OpConstant %6 -5
+         %12 = OpTypeVector %6 2
+         %13 = OpTypePointer Function %12
+         %18 = OpTypeInt 32 0
+         %19 = OpTypePointer Function %18
+         %21 = OpConstant %18 8
+         %23 = OpConstant %18 2
+         %24 = OpTypeVector %18 3
+         %25 = OpTypePointer Function %24
+         %31 = OpTypeFloat 32
+         %32 = OpTypePointer Function %31
+         %34 = OpConstant %31 3.29999995
+         %36 = OpConstant %31 1.10000002
+         %37 = OpTypeVector %31 4
+         %38 = OpTypePointer Function %37
+         %96 = OpTypePointer Input %31
+         %97 = OpVariable %96 Input
+          %4 = OpFunction %2 None %3
+          %5 = OpLabel
+          %8 = OpVariable %7 Function
+         %10 = OpVariable %7 Function
+         %14 = OpVariable %13 Function
+         %20 = OpVariable %19 Function
+         %22 = OpVariable %19 Function
+         %26 = OpVariable %25 Function
+         %33 = OpVariable %32 Function
+         %35 = OpVariable %32 Function
+         %39 = OpVariable %38 Function
+         %47 = OpVariable %7 Function
+         %51 = OpVariable %7 Function
+         %55 = OpVariable %7 Function
+         %59 = OpVariable %7 Function
+         %63 = OpVariable %19 Function
+         %67 = OpVariable %19 Function
+         %71 = OpVariable %19 Function
+         %75 = OpVariable %19 Function
+         %79 = OpVariable %32 Function
+         %83 = OpVariable %32 Function
+         %87 = OpVariable %32 Function
+         %91 = OpVariable %32 Function
+               OpStore %8 %9
+               OpStore %10 %11
+         %15 = OpLoad %6 %8
+         %16 = OpLoad %6 %10
+         %17 = OpCompositeConstruct %12 %15 %16
+               OpStore %14 %17
+               OpStore %20 %21
+               OpStore %22 %23
+         %27 = OpLoad %18 %20
+         %28 = OpLoad %18 %20
+         %29 = OpLoad %18 %22
+         %30 = OpCompositeConstruct %24 %27 %28 %29
+               OpStore %26 %30
+               OpStore %33 %34
+               OpStore %35 %36
+         %40 = OpLoad %31 %33
+         %41 = OpLoad %31 %33
+         %42 = OpLoad %31 %35
+         %43 = OpLoad %31 %35
+         %44 = OpCompositeConstruct %37 %40 %41 %42 %43
+         %45 = OpLoad %37 %39
+         %46 = OpVectorShuffle %37 %45 %44 5 6 7 4
+               OpStore %39 %46
+         %48 = OpLoad %6 %8
+         %49 = OpLoad %6 %10
+        %100 = OpCompositeConstruct %12 %48 %48
+        %101 = OpCompositeConstruct %12 %49 %49
+        %102 = OpIAdd %12 %100 %101
+         %50 = OpIAdd %6 %48 %49
+               OpStore %47 %50
+         %52 = OpLoad %6 %8
+         %53 = OpLoad %6 %10
+         %54 = OpISub %6 %52 %53
+               OpStore %51 %54
+         %56 = OpLoad %6 %8
+         %57 = OpLoad %6 %10
+         %58 = OpIMul %6 %56 %57
+               OpStore %55 %58
+         %60 = OpLoad %6 %8
+         %61 = OpLoad %6 %10
+         %62 = OpSDiv %6 %60 %61
+               OpStore %59 %62
+         %64 = OpLoad %18 %20
+         %65 = OpLoad %18 %22
+         %66 = OpIAdd %18 %64 %65
+               OpStore %63 %66
+         %68 = OpLoad %18 %20
+         %69 = OpLoad %18 %22
+         %70 = OpISub %18 %68 %69
+               OpStore %67 %70
+         %72 = OpLoad %18 %20
+         %73 = OpLoad %18 %22
+         %74 = OpIMul %18 %72 %73
+               OpStore %71 %74
+         %76 = OpLoad %18 %20
+         %77 = OpLoad %18 %22
+         %78 = OpUDiv %18 %76 %77
+               OpStore %75 %78
+         %80 = OpLoad %31 %33
+         %81 = OpLoad %31 %35
+         %82 = OpFAdd %31 %80 %81
+               OpStore %79 %82
+         %84 = OpLoad %31 %33
+         %85 = OpLoad %31 %35
+         %86 = OpFSub %31 %84 %85
+               OpStore %83 %86
+         %88 = OpLoad %31 %33
+         %89 = OpLoad %31 %35
+         %90 = OpFMul %31 %88 %89
+               OpStore %87 %90
+         %92 = OpLoad %31 %33
+         %93 = OpLoad %31 %35
+         %94 = OpFDiv %31 %92 %93
+               OpStore %91 %94
+               OpReturn
+               OpFunctionEnd
+  )";
+  ASSERT_TRUE(IsEqual(env, after_transformation, context.get()));
+}
+
+TEST(TransformationWrapVectorSynonym, OperationSupportTest) {
+  std::string shader = R"(
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %4 "main" %97
+               OpExecutionMode %4 OriginUpperLeft
+               OpSource ESSL 310
+               OpName %4 "main"
+          %2 = OpTypeVoid
+          %3 = OpTypeFunction %2
+          %6 = OpTypeInt 32 1
+          %7 = OpTypePointer Function %6
+          %9 = OpConstant %6 10
+         %11 = OpConstant %6 -5
+         %12 = OpTypeVector %6 2
+         %13 = OpTypePointer Function %12
+         %18 = OpTypeInt 32 0
+         %19 = OpTypePointer Function %18
+         %21 = OpConstant %18 8
+         %23 = OpConstant %18 2
+         %24 = OpTypeVector %18 3
+         %25 = OpTypePointer Function %24
+         %31 = OpTypeFloat 32
+         %32 = OpTypePointer Function %31
+         %34 = OpConstant %31 3.29999995
+         %36 = OpConstant %31 1.10000002
+         %37 = OpTypeVector %31 4
+         %38 = OpTypePointer Function %37
+         %96 = OpTypePointer Input %31
+         %97 = OpVariable %96 Input
+          %4 = OpFunction %2 None %3
+          %5 = OpLabel
+          %8 = OpVariable %7 Function
+         %10 = OpVariable %7 Function
+         %14 = OpVariable %13 Function
+         %20 = OpVariable %19 Function
+         %22 = OpVariable %19 Function
+         %26 = OpVariable %25 Function
+         %33 = OpVariable %32 Function
+         %35 = OpVariable %32 Function
+         %39 = OpVariable %38 Function
+         %47 = OpVariable %7 Function
+         %51 = OpVariable %7 Function
+         %55 = OpVariable %7 Function
+         %59 = OpVariable %7 Function
+         %63 = OpVariable %19 Function
+         %67 = OpVariable %19 Function
+         %71 = OpVariable %19 Function
+         %75 = OpVariable %19 Function
+         %79 = OpVariable %32 Function
+         %83 = OpVariable %32 Function
+         %87 = OpVariable %32 Function
+         %91 = OpVariable %32 Function
+               OpStore %8 %9
+               OpStore %10 %11
+         %15 = OpLoad %6 %8
+         %16 = OpLoad %6 %10
+         %17 = OpCompositeConstruct %12 %15 %16
+               OpStore %14 %17
+               OpStore %20 %21
+               OpStore %22 %23
+         %27 = OpLoad %18 %20
+         %28 = OpLoad %18 %20
+         %29 = OpLoad %18 %22
+         %30 = OpCompositeConstruct %24 %27 %28 %29
+               OpStore %26 %30
+               OpStore %33 %34
+               OpStore %35 %36
+         %40 = OpLoad %31 %33
+         %41 = OpLoad %31 %33
+         %42 = OpLoad %31 %35
+         %43 = OpLoad %31 %35
+         %44 = OpCompositeConstruct %37 %40 %41 %42 %43
+         %45 = OpLoad %37 %39
+         %46 = OpVectorShuffle %37 %45 %44 5 6 7 4
+               OpStore %39 %46
+         %48 = OpLoad %6 %8
+         %49 = OpLoad %6 %10
+         %50 = OpIAdd %6 %48 %49
+               OpStore %47 %50
+         %52 = OpLoad %6 %8
+         %53 = OpLoad %6 %10
+        %100 = OpCompositeConstruct %12 %52 %52
+        %101 = OpCompositeConstruct %12 %53 %53
+         %54 = OpISub %6 %52 %53
+               OpStore %51 %54
+         %56 = OpLoad %6 %8
+         %57 = OpLoad %6 %10
+        %103 = OpCompositeConstruct %12 %56 %56
+        %104 = OpCompositeConstruct %12 %57 %57
+         %58 = OpIMul %6 %56 %57
+               OpStore %55 %58
+         %60 = OpLoad %6 %8
+         %61 = OpLoad %6 %10
+         %62 = OpSDiv %6 %60 %61
+               OpStore %59 %62
+         %64 = OpLoad %18 %20
+         %65 = OpLoad %18 %22
+        %106 = OpCompositeConstruct %24 %64 %64 %64
+        %107 = OpCompositeConstruct %24 %65 %65 %65
+         %66 = OpIAdd %18 %64 %65
+               OpStore %63 %66
+         %68 = OpLoad %18 %20
+         %69 = OpLoad %18 %22
+        %109 = OpCompositeConstruct %24 %68 %68 %68
+        %110 = OpCompositeConstruct %24 %69 %69 %69
+         %70 = OpISub %18 %68 %69
+               OpStore %67 %70
+         %72 = OpLoad %18 %20
+         %73 = OpLoad %18 %22
+        %112 = OpCompositeConstruct %24 %72 %72 %72
+        %113 = OpCompositeConstruct %24 %73 %73 %73
+         %74 = OpIMul %18 %72 %73
+               OpStore %71 %74
+         %76 = OpLoad %18 %20
+         %77 = OpLoad %18 %22
+         %78 = OpUDiv %18 %76 %77
+               OpStore %75 %78
+         %80 = OpLoad %31 %33
+         %81 = OpLoad %31 %35
+        %115 = OpCompositeConstruct %37 %80 %80 %80 %80
+        %116 = OpCompositeConstruct %37 %81 %81 %81 %81
+         %82 = OpFAdd %31 %80 %81
+               OpStore %79 %82
+         %84 = OpLoad %31 %33
+         %85 = OpLoad %31 %35
+        %118 = OpCompositeConstruct %37 %84 %84 %84 %84
+        %119 = OpCompositeConstruct %37 %85 %85 %85 %85
+         %86 = OpFSub %31 %84 %85
+               OpStore %83 %86
+         %88 = OpLoad %31 %33
+         %89 = OpLoad %31 %35
+        %121 = OpCompositeConstruct %37 %88 %88 %88 %88
+        %122 = OpCompositeConstruct %37 %89 %89 %89 %89
+         %90 = OpFMul %31 %88 %89
+               OpStore %87 %90
+         %92 = OpLoad %31 %33
+         %93 = OpLoad %31 %35
+         %94 = OpFDiv %31 %92 %93
+               OpStore %91 %94
+               OpReturn
+               OpFunctionEnd
+  )";
+  const auto env = SPV_ENV_UNIVERSAL_1_3;
+  const auto consumer = nullptr;
+  const auto context = BuildModule(env, consumer, shader, kFuzzAssembleOption);
+  spvtools::ValidatorOptions validator_options;
+
+  ASSERT_TRUE(fuzzerutil::IsValidAndWellFormed(context.get(), validator_options,
+                                               kConsoleMessageConsumer));
+
+  TransformationContext transformation_context(
+      MakeUnique<FactManager>(context.get()), validator_options);
+
+  {
+    // Add synonym facts between the vector operands at pos and the operands to
+    // the scalar instruction.
+    transformation_context.GetFactManager()->AddFactDataSynonym(
+        MakeDataDescriptor(100, {1}), MakeDataDescriptor(52, {}));
+    transformation_context.GetFactManager()->AddFactDataSynonym(
+        MakeDataDescriptor(101, {1}), MakeDataDescriptor(53, {}));
+
+    transformation_context.GetFactManager()->AddFactDataSynonym(
+        MakeDataDescriptor(103, {0}), MakeDataDescriptor(56, {}));
+    transformation_context.GetFactManager()->AddFactDataSynonym(
+        MakeDataDescriptor(104, {0}), MakeDataDescriptor(57, {}));
+
+    transformation_context.GetFactManager()->AddFactDataSynonym(
+        MakeDataDescriptor(106, {2}), MakeDataDescriptor(64, {}));
+    transformation_context.GetFactManager()->AddFactDataSynonym(
+        MakeDataDescriptor(107, {2}), MakeDataDescriptor(65, {}));
+
+    transformation_context.GetFactManager()->AddFactDataSynonym(
+        MakeDataDescriptor(109, {2}), MakeDataDescriptor(68, {}));
+    transformation_context.GetFactManager()->AddFactDataSynonym(
+        MakeDataDescriptor(110, {2}), MakeDataDescriptor(69, {}));
+
+    transformation_context.GetFactManager()->AddFactDataSynonym(
+        MakeDataDescriptor(112, {1}), MakeDataDescriptor(72, {}));
+    transformation_context.GetFactManager()->AddFactDataSynonym(
+        MakeDataDescriptor(113, {1}), MakeDataDescriptor(73, {}));
+
+    transformation_context.GetFactManager()->AddFactDataSynonym(
+        MakeDataDescriptor(115, {2}), MakeDataDescriptor(80, {}));
+    transformation_context.GetFactManager()->AddFactDataSynonym(
+        MakeDataDescriptor(116, {2}), MakeDataDescriptor(81, {}));
+
+    transformation_context.GetFactManager()->AddFactDataSynonym(
+        MakeDataDescriptor(118, {3}), MakeDataDescriptor(84, {}));
+    transformation_context.GetFactManager()->AddFactDataSynonym(
+        MakeDataDescriptor(119, {3}), MakeDataDescriptor(85, {}));
+
+    transformation_context.GetFactManager()->AddFactDataSynonym(
+        MakeDataDescriptor(121, {1}), MakeDataDescriptor(88, {}));
+    transformation_context.GetFactManager()->AddFactDataSynonym(
+        MakeDataDescriptor(122, {1}), MakeDataDescriptor(89, {}));
+  }
+
+  // Test OpISub for signed integer.
+  {
+    // Good: The following transformation should be applicable.
+    TransformationWrapVectorSynonym wrap_sub_int(54, 100, 101, 102, 1);
+    ASSERT_TRUE(
+        wrap_sub_int.IsApplicable(context.get(), transformation_context));
+    ApplyAndCheckFreshIds(wrap_sub_int, context.get(), &transformation_context);
+
+    // |instruction_id| and id at |scalar_position of the result vector should
+    // be synonyms.
+    ASSERT_TRUE(transformation_context.GetFactManager()->IsSynonymous(
+        MakeDataDescriptor(102, {1}), MakeDataDescriptor(54, {})));
+  }
+
+  // Test OpIMul for signed integer.
+  {
+    // Good: The following transformation should be applicable.
+    TransformationWrapVectorSynonym wrap_mul_int(58, 103, 104, 105, 0);
+    ASSERT_TRUE(
+        wrap_mul_int.IsApplicable(context.get(), transformation_context));
+    ApplyAndCheckFreshIds(wrap_mul_int, context.get(), &transformation_context);
+
+    // |instruction_id| and id at |scalar_position of the result vector should
+    // be synonyms.
+    ASSERT_TRUE(transformation_context.GetFactManager()->IsSynonymous(
+        MakeDataDescriptor(105, {0}), MakeDataDescriptor(58, {})));
+  }
+
+  // Test OpIAdd for unsigned integer.
+  {
+    // Good: The following transformation should be applicable.
+    TransformationWrapVectorSynonym wrap_add_uint(66, 106, 107, 108, 2);
+    ASSERT_TRUE(
+        wrap_add_uint.IsApplicable(context.get(), transformation_context));
+    ApplyAndCheckFreshIds(wrap_add_uint, context.get(),
+                          &transformation_context);
+
+    // |instruction_id| and id at |scalar_position of the result vector should
+    // be synonyms.
+    ASSERT_TRUE(transformation_context.GetFactManager()->IsSynonymous(
+        MakeDataDescriptor(108, {2}), MakeDataDescriptor(66, {})));
+  }
+
+  // Test OpISub for signed integer.
+  {
+    // Good: The following transformation should be applicable.
+    TransformationWrapVectorSynonym wrap_sub_uint(70, 109, 110, 111, 2);
+    ASSERT_TRUE(
+        wrap_sub_uint.IsApplicable(context.get(), transformation_context));
+    ApplyAndCheckFreshIds(wrap_sub_uint, context.get(),
+                          &transformation_context);
+
+    // |instruction_id| and id at |scalar_position of the result vector should
+    // be synonyms.
+    ASSERT_TRUE(transformation_context.GetFactManager()->IsSynonymous(
+        MakeDataDescriptor(111, {2}), MakeDataDescriptor(70, {})));
+  }
+
+  // Test OpIMul for signed integer.
+  {
+    // Good: The following transformation should be applicable.
+    TransformationWrapVectorSynonym wrap_mul_uint(74, 112, 113, 114, 1);
+    ASSERT_TRUE(
+        wrap_mul_uint.IsApplicable(context.get(), transformation_context));
+    ApplyAndCheckFreshIds(wrap_mul_uint, context.get(),
+                          &transformation_context);
+
+    // |instruction_id| and id at |scalar_position of the result vector should
+    // be synonyms.
+    ASSERT_TRUE(transformation_context.GetFactManager()->IsSynonymous(
+        MakeDataDescriptor(114, {1}), MakeDataDescriptor(74, {})));
+  }
+
+  // Test OpFAdd for float.
+  {
+    // Good: The following transformation should be applicable.
+    TransformationWrapVectorSynonym wrap_add_float(82, 115, 116, 117, 2);
+    ASSERT_TRUE(
+        wrap_add_float.IsApplicable(context.get(), transformation_context));
+    ApplyAndCheckFreshIds(wrap_add_float, context.get(),
+                          &transformation_context);
+
+    // |instruction_id| and id at |scalar_position of the result vector should
+    // be synonyms.
+    ASSERT_TRUE(transformation_context.GetFactManager()->IsSynonymous(
+        MakeDataDescriptor(117, {2}), MakeDataDescriptor(82, {})));
+  }
+
+  // Test OpFSub for float.
+  {
+    // Good: The following transformation should be applicable.
+    TransformationWrapVectorSynonym wrap_add_float(86, 118, 119, 120, 3);
+    ASSERT_TRUE(
+        wrap_add_float.IsApplicable(context.get(), transformation_context));
+    ApplyAndCheckFreshIds(wrap_add_float, context.get(),
+                          &transformation_context);
+
+    // |instruction_id| and id at |scalar_position of the result vector should
+    // be synonyms.
+    ASSERT_TRUE(transformation_context.GetFactManager()->IsSynonymous(
+        MakeDataDescriptor(120, {3}), MakeDataDescriptor(86, {})));
+  }
+
+  // Test OpFMul for float.
+  {
+    // Good: The following transformation should be applicable.
+    TransformationWrapVectorSynonym wrap_mul_float(90, 121, 122, 123, 1);
+    ASSERT_TRUE(
+        wrap_mul_float.IsApplicable(context.get(), transformation_context));
+    ApplyAndCheckFreshIds(wrap_mul_float, context.get(),
+                          &transformation_context);
+
+    // |instruction_id| and id at |scalar_position of the result vector should
+    // be synonyms.
+    ASSERT_TRUE(transformation_context.GetFactManager()->IsSynonymous(
+        MakeDataDescriptor(123, {1}), MakeDataDescriptor(90, {})));
+  }
+
+  std::string after_transformation = R"(
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %4 "main" %97
+               OpExecutionMode %4 OriginUpperLeft
+               OpSource ESSL 310
+               OpName %4 "main"
+          %2 = OpTypeVoid
+          %3 = OpTypeFunction %2
+          %6 = OpTypeInt 32 1
+          %7 = OpTypePointer Function %6
+          %9 = OpConstant %6 10
+         %11 = OpConstant %6 -5
+         %12 = OpTypeVector %6 2
+         %13 = OpTypePointer Function %12
+         %18 = OpTypeInt 32 0
+         %19 = OpTypePointer Function %18
+         %21 = OpConstant %18 8
+         %23 = OpConstant %18 2
+         %24 = OpTypeVector %18 3
+         %25 = OpTypePointer Function %24
+         %31 = OpTypeFloat 32
+         %32 = OpTypePointer Function %31
+         %34 = OpConstant %31 3.29999995
+         %36 = OpConstant %31 1.10000002
+         %37 = OpTypeVector %31 4
+         %38 = OpTypePointer Function %37
+         %96 = OpTypePointer Input %31
+         %97 = OpVariable %96 Input
+          %4 = OpFunction %2 None %3
+          %5 = OpLabel
+          %8 = OpVariable %7 Function
+         %10 = OpVariable %7 Function
+         %14 = OpVariable %13 Function
+         %20 = OpVariable %19 Function
+         %22 = OpVariable %19 Function
+         %26 = OpVariable %25 Function
+         %33 = OpVariable %32 Function
+         %35 = OpVariable %32 Function
+         %39 = OpVariable %38 Function
+         %47 = OpVariable %7 Function
+         %51 = OpVariable %7 Function
+         %55 = OpVariable %7 Function
+         %59 = OpVariable %7 Function
+         %63 = OpVariable %19 Function
+         %67 = OpVariable %19 Function
+         %71 = OpVariable %19 Function
+         %75 = OpVariable %19 Function
+         %79 = OpVariable %32 Function
+         %83 = OpVariable %32 Function
+         %87 = OpVariable %32 Function
+         %91 = OpVariable %32 Function
+               OpStore %8 %9
+               OpStore %10 %11
+         %15 = OpLoad %6 %8
+         %16 = OpLoad %6 %10
+         %17 = OpCompositeConstruct %12 %15 %16
+               OpStore %14 %17
+               OpStore %20 %21
+               OpStore %22 %23
+         %27 = OpLoad %18 %20
+         %28 = OpLoad %18 %20
+         %29 = OpLoad %18 %22
+         %30 = OpCompositeConstruct %24 %27 %28 %29
+               OpStore %26 %30
+               OpStore %33 %34
+               OpStore %35 %36
+         %40 = OpLoad %31 %33
+         %41 = OpLoad %31 %33
+         %42 = OpLoad %31 %35
+         %43 = OpLoad %31 %35
+         %44 = OpCompositeConstruct %37 %40 %41 %42 %43
+         %45 = OpLoad %37 %39
+         %46 = OpVectorShuffle %37 %45 %44 5 6 7 4
+               OpStore %39 %46
+         %48 = OpLoad %6 %8
+         %49 = OpLoad %6 %10
+         %50 = OpIAdd %6 %48 %49
+               OpStore %47 %50
+         %52 = OpLoad %6 %8
+         %53 = OpLoad %6 %10
+        %100 = OpCompositeConstruct %12 %52 %52
+        %101 = OpCompositeConstruct %12 %53 %53
+        %102 = OpISub %12 %100 %101
+         %54 = OpISub %6 %52 %53
+               OpStore %51 %54
+         %56 = OpLoad %6 %8
+         %57 = OpLoad %6 %10
+        %103 = OpCompositeConstruct %12 %56 %56
+        %104 = OpCompositeConstruct %12 %57 %57
+        %105 = OpIMul %12 %103 %104
+         %58 = OpIMul %6 %56 %57
+               OpStore %55 %58
+         %60 = OpLoad %6 %8
+         %61 = OpLoad %6 %10
+         %62 = OpSDiv %6 %60 %61
+               OpStore %59 %62
+         %64 = OpLoad %18 %20
+         %65 = OpLoad %18 %22
+        %106 = OpCompositeConstruct %24 %64 %64 %64
+        %107 = OpCompositeConstruct %24 %65 %65 %65
+        %108 = OpIAdd %24 %106 %107
+         %66 = OpIAdd %18 %64 %65
+               OpStore %63 %66
+         %68 = OpLoad %18 %20
+         %69 = OpLoad %18 %22
+        %109 = OpCompositeConstruct %24 %68 %68 %68
+        %110 = OpCompositeConstruct %24 %69 %69 %69
+        %111 = OpISub %24 %109 %110
+         %70 = OpISub %18 %68 %69
+               OpStore %67 %70
+         %72 = OpLoad %18 %20
+         %73 = OpLoad %18 %22
+        %112 = OpCompositeConstruct %24 %72 %72 %72
+        %113 = OpCompositeConstruct %24 %73 %73 %73
+        %114 = OpIMul %24 %112 %113
+         %74 = OpIMul %18 %72 %73
+               OpStore %71 %74
+         %76 = OpLoad %18 %20
+         %77 = OpLoad %18 %22
+         %78 = OpUDiv %18 %76 %77
+               OpStore %75 %78
+         %80 = OpLoad %31 %33
+         %81 = OpLoad %31 %35
+        %115 = OpCompositeConstruct %37 %80 %80 %80 %80
+        %116 = OpCompositeConstruct %37 %81 %81 %81 %81
+        %117 = OpFAdd %37 %115 %116
+         %82 = OpFAdd %31 %80 %81
+               OpStore %79 %82
+         %84 = OpLoad %31 %33
+         %85 = OpLoad %31 %35
+        %118 = OpCompositeConstruct %37 %84 %84 %84 %84
+        %119 = OpCompositeConstruct %37 %85 %85 %85 %85
+        %120 = OpFSub %37 %118 %119
+         %86 = OpFSub %31 %84 %85
+               OpStore %83 %86
+         %88 = OpLoad %31 %33
+         %89 = OpLoad %31 %35
+        %121 = OpCompositeConstruct %37 %88 %88 %88 %88
+        %122 = OpCompositeConstruct %37 %89 %89 %89 %89
+        %123 = OpFMul %37 %121 %122
+         %90 = OpFMul %31 %88 %89
+               OpStore %87 %90
+         %92 = OpLoad %31 %33
+         %93 = OpLoad %31 %35
+         %94 = OpFDiv %31 %92 %93
+               OpStore %91 %94
+               OpReturn
+               OpFunctionEnd
+  )";
+  ASSERT_TRUE(IsEqual(env, after_transformation, context.get()));
+}
+
+TEST(TransformationWrapVectorSynonym, DivSupportTest) {
+  std::string shader = R"(
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %4 "main" %97
+               OpExecutionMode %4 OriginUpperLeft
+               OpSource ESSL 310
+               OpName %4 "main"
+          %2 = OpTypeVoid
+          %3 = OpTypeFunction %2
+          %6 = OpTypeInt 32 1
+          %7 = OpTypePointer Function %6
+          %9 = OpConstant %6 10
+         %11 = OpConstant %6 -5
+         %12 = OpTypeVector %6 2
+         %13 = OpTypePointer Function %12
+         %18 = OpTypeInt 32 0
+         %19 = OpTypePointer Function %18
+         %21 = OpConstant %18 8
+         %23 = OpConstant %18 2
+         %24 = OpTypeVector %18 3
+         %25 = OpTypePointer Function %24
+         %31 = OpTypeFloat 32
+         %32 = OpTypePointer Function %31
+         %34 = OpConstant %31 3.29999995
+         %36 = OpConstant %31 1.10000002
+         %37 = OpTypeVector %31 4
+         %38 = OpTypePointer Function %37
+         %96 = OpTypePointer Input %31
+         %97 = OpVariable %96 Input
+          %4 = OpFunction %2 None %3
+          %5 = OpLabel
+          %8 = OpVariable %7 Function
+         %10 = OpVariable %7 Function
+         %14 = OpVariable %13 Function
+         %20 = OpVariable %19 Function
+         %22 = OpVariable %19 Function
+         %26 = OpVariable %25 Function
+         %33 = OpVariable %32 Function
+         %35 = OpVariable %32 Function
+         %39 = OpVariable %38 Function
+         %47 = OpVariable %7 Function
+         %51 = OpVariable %7 Function
+         %55 = OpVariable %7 Function
+         %59 = OpVariable %7 Function
+         %63 = OpVariable %19 Function
+         %67 = OpVariable %19 Function
+         %71 = OpVariable %19 Function
+         %75 = OpVariable %19 Function
+         %79 = OpVariable %32 Function
+         %83 = OpVariable %32 Function
+         %87 = OpVariable %32 Function
+         %91 = OpVariable %32 Function
+               OpStore %8 %9
+               OpStore %10 %11
+         %15 = OpLoad %6 %8
+         %16 = OpLoad %6 %10
+         %17 = OpCompositeConstruct %12 %15 %16
+               OpStore %14 %17
+               OpStore %20 %21
+               OpStore %22 %23
+         %27 = OpLoad %18 %20
+         %28 = OpLoad %18 %20
+         %29 = OpLoad %18 %22
+         %30 = OpCompositeConstruct %24 %27 %28 %29
+               OpStore %26 %30
+               OpStore %33 %34
+               OpStore %35 %36
+         %40 = OpLoad %31 %33
+         %41 = OpLoad %31 %33
+         %42 = OpLoad %31 %35
+         %43 = OpLoad %31 %35
+         %44 = OpCompositeConstruct %37 %40 %41 %42 %43
+         %45 = OpLoad %37 %39
+         %46 = OpVectorShuffle %37 %45 %44 5 6 7 4
+               OpStore %39 %46
+         %48 = OpLoad %6 %8
+         %49 = OpLoad %6 %10
+         %50 = OpIAdd %6 %48 %49
+               OpStore %47 %50
+         %52 = OpLoad %6 %8
+         %53 = OpLoad %6 %10
+         %54 = OpISub %6 %52 %53
+               OpStore %51 %54
+         %56 = OpLoad %6 %8
+         %57 = OpLoad %6 %10
+         %58 = OpIMul %6 %56 %57
+               OpStore %55 %58
+         %60 = OpLoad %6 %8
+         %61 = OpLoad %6 %10
+        %100 = OpCompositeConstruct %12 %60 %60
+        %101 = OpCompositeConstruct %12 %61 %61
+         %62 = OpSDiv %6 %60 %61
+               OpStore %59 %62
+         %64 = OpLoad %18 %20
+         %65 = OpLoad %18 %22
+         %66 = OpIAdd %18 %64 %65
+               OpStore %63 %66
+         %68 = OpLoad %18 %20
+         %69 = OpLoad %18 %22
+         %70 = OpISub %18 %68 %69
+               OpStore %67 %70
+         %72 = OpLoad %18 %20
+         %73 = OpLoad %18 %22
+         %74 = OpIMul %18 %72 %73
+               OpStore %71 %74
+         %76 = OpLoad %18 %20
+         %77 = OpLoad %18 %22
+        %102 = OpCompositeConstruct %24 %76 %76 %76
+        %103 = OpCompositeConstruct %24 %77 %77 %77
+         %78 = OpUDiv %18 %76 %77
+               OpStore %75 %78
+         %80 = OpLoad %31 %33
+         %81 = OpLoad %31 %35
+         %82 = OpFAdd %31 %80 %81
+               OpStore %79 %82
+         %84 = OpLoad %31 %33
+         %85 = OpLoad %31 %35
+         %86 = OpFSub %31 %84 %85
+               OpStore %83 %86
+         %88 = OpLoad %31 %33
+         %89 = OpLoad %31 %35
+         %90 = OpFMul %31 %88 %89
+               OpStore %87 %90
+         %92 = OpLoad %31 %33
+         %93 = OpLoad %31 %35
+        %104 = OpCompositeConstruct %37 %92 %92 %92 %92
+        %105 = OpCompositeConstruct %37 %93 %93 %93 %93
+         %94 = OpFDiv %31 %92 %93
+               OpStore %91 %94
+               OpReturn
+               OpFunctionEnd
+  )";
+  const auto env = SPV_ENV_UNIVERSAL_1_3;
+  const auto consumer = nullptr;
+  const auto context = BuildModule(env, consumer, shader, kFuzzAssembleOption);
+  spvtools::ValidatorOptions validator_options;
+
+  ASSERT_TRUE(fuzzerutil::IsValidAndWellFormed(context.get(), validator_options,
+                                               kConsoleMessageConsumer));
+
+  TransformationContext transformation_context(
+      MakeUnique<FactManager>(context.get()), validator_options);
+
+  transformation_context.GetFactManager()->AddFactDataSynonym(
+      MakeDataDescriptor(100, {1}), MakeDataDescriptor(60, {}));
+  transformation_context.GetFactManager()->AddFactDataSynonym(
+      MakeDataDescriptor(101, {1}), MakeDataDescriptor(61, {}));
+
+  transformation_context.GetFactManager()->AddFactDataSynonym(
+      MakeDataDescriptor(102, {1}), MakeDataDescriptor(76, {}));
+  transformation_context.GetFactManager()->AddFactDataSynonym(
+      MakeDataDescriptor(103, {1}), MakeDataDescriptor(77, {}));
+
+  transformation_context.GetFactManager()->AddFactDataSynonym(
+      MakeDataDescriptor(104, {1}), MakeDataDescriptor(92, {}));
+  transformation_context.GetFactManager()->AddFactDataSynonym(
+      MakeDataDescriptor(105, {1}), MakeDataDescriptor(93, {}));
+
+  // Div operations are not currently supported.
+  {
+    TransformationWrapVectorSynonym wrap_div_bad1(62, 100, 101, 106, 1);
+    ASSERT_FALSE(
+        wrap_div_bad1.IsApplicable(context.get(), transformation_context));
+
+    TransformationWrapVectorSynonym wrap_div_bad2(78, 102, 103, 106, 1);
+    ASSERT_FALSE(
+        wrap_div_bad2.IsApplicable(context.get(), transformation_context));
+
+    TransformationWrapVectorSynonym wrap_div_bad3(94, 104, 105, 106, 1);
+    ASSERT_FALSE(
+        wrap_div_bad3.IsApplicable(context.get(), transformation_context));
+  }
+}
+
+TEST(TransformationWrapVectorSynonym, AdditionalWidthSupportTest) {
+  std::string shader = R"(
+               OpCapability Shader
+               OpCapability Int64
+               OpCapability Float64
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %4 "main" %97
+               OpExecutionMode %4 OriginUpperLeft
+               OpSource ESSL 310
+               OpName %4 "main"
+          %2 = OpTypeVoid
+          %3 = OpTypeFunction %2
+          %6 = OpTypeInt 64 1
+          %7 = OpTypePointer Function %6
+          %9 = OpConstant %6 10
+         %11 = OpConstant %6 -5
+         %12 = OpTypeVector %6 2
+         %13 = OpTypePointer Function %12
+         %18 = OpTypeInt 64 0
+         %19 = OpTypePointer Function %18
+         %21 = OpConstant %18 8
+         %23 = OpConstant %18 2
+         %24 = OpTypeVector %18 3
+         %25 = OpTypePointer Function %24
+         %31 = OpTypeFloat 64
+         %32 = OpTypePointer Function %31
+         %34 = OpConstant %31 3.29999995
+         %36 = OpConstant %31 1.10000002
+         %37 = OpTypeVector %31 4
+         %38 = OpTypePointer Function %37
+         %96 = OpTypePointer Input %31
+         %97 = OpVariable %96 Input
+          %4 = OpFunction %2 None %3
+          %5 = OpLabel
+          %8 = OpVariable %7 Function
+         %10 = OpVariable %7 Function
+         %14 = OpVariable %13 Function
+         %20 = OpVariable %19 Function
+         %22 = OpVariable %19 Function
+         %26 = OpVariable %25 Function
+         %33 = OpVariable %32 Function
+         %35 = OpVariable %32 Function
+         %39 = OpVariable %38 Function
+         %47 = OpVariable %7 Function
+         %51 = OpVariable %7 Function
+         %55 = OpVariable %7 Function
+         %59 = OpVariable %7 Function
+         %63 = OpVariable %19 Function
+         %67 = OpVariable %19 Function
+         %71 = OpVariable %19 Function
+         %75 = OpVariable %19 Function
+         %79 = OpVariable %32 Function
+         %83 = OpVariable %32 Function
+         %87 = OpVariable %32 Function
+         %91 = OpVariable %32 Function
+               OpStore %8 %9
+               OpStore %10 %11
+         %15 = OpLoad %6 %8
+         %16 = OpLoad %6 %10
+         %17 = OpCompositeConstruct %12 %15 %16
+               OpStore %14 %17
+               OpStore %20 %21
+               OpStore %22 %23
+         %27 = OpLoad %18 %20
+         %28 = OpLoad %18 %20
+         %29 = OpLoad %18 %22
+         %30 = OpCompositeConstruct %24 %27 %28 %29
+               OpStore %26 %30
+               OpStore %33 %34
+               OpStore %35 %36
+         %40 = OpLoad %31 %33
+         %41 = OpLoad %31 %33
+         %42 = OpLoad %31 %35
+         %43 = OpLoad %31 %35
+         %44 = OpCompositeConstruct %37 %40 %41 %42 %43
+         %45 = OpLoad %37 %39
+         %46 = OpVectorShuffle %37 %45 %44 5 6 7 4
+               OpStore %39 %46
+         %48 = OpLoad %6 %8
+         %49 = OpLoad %6 %10
+        %100 = OpCompositeConstruct %12 %48 %48
+        %101 = OpCompositeConstruct %12 %49 %49
+         %50 = OpIAdd %6 %48 %49
+               OpStore %47 %50
+         %52 = OpLoad %6 %8
+         %53 = OpLoad %6 %10
+         %54 = OpISub %6 %52 %53
+               OpStore %51 %54
+         %56 = OpLoad %6 %8
+         %57 = OpLoad %6 %10
+         %58 = OpIMul %6 %56 %57
+               OpStore %55 %58
+         %60 = OpLoad %6 %8
+         %61 = OpLoad %6 %10
+         %62 = OpSDiv %6 %60 %61
+               OpStore %59 %62
+         %64 = OpLoad %18 %20
+         %65 = OpLoad %18 %22
+         %66 = OpIAdd %18 %64 %65
+               OpStore %63 %66
+         %68 = OpLoad %18 %20
+         %69 = OpLoad %18 %22
+        %103 = OpCompositeConstruct %24 %68 %68 %68
+        %104 = OpCompositeConstruct %24 %69 %69 %69
+         %70 = OpISub %18 %68 %69
+               OpStore %67 %70
+         %72 = OpLoad %18 %20
+         %73 = OpLoad %18 %22
+         %74 = OpIMul %18 %72 %73
+               OpStore %71 %74
+         %76 = OpLoad %18 %20
+         %77 = OpLoad %18 %22
+         %78 = OpUDiv %18 %76 %77
+               OpStore %75 %78
+         %80 = OpLoad %31 %33
+         %81 = OpLoad %31 %35
+         %82 = OpFAdd %31 %80 %81
+               OpStore %79 %82
+         %84 = OpLoad %31 %33
+         %85 = OpLoad %31 %35
+         %86 = OpFSub %31 %84 %85
+               OpStore %83 %86
+         %88 = OpLoad %31 %33
+         %89 = OpLoad %31 %35
+        %106 = OpCompositeConstruct %37 %88 %88 %88 %88
+        %107 = OpCompositeConstruct %37 %89 %89 %89 %89
+         %90 = OpFMul %31 %88 %89
+               OpStore %87 %90
+         %92 = OpLoad %31 %33
+         %93 = OpLoad %31 %35
+         %94 = OpFDiv %31 %92 %93
+               OpStore %91 %94
+               OpReturn
+               OpFunctionEnd
+  )";
+  const auto env = SPV_ENV_UNIVERSAL_1_3;
+  const auto consumer = nullptr;
+  const auto context = BuildModule(env, consumer, shader, kFuzzAssembleOption);
+  spvtools::ValidatorOptions validator_options;
+
+  // Check context validity.
+  ASSERT_TRUE(fuzzerutil::IsValidAndWellFormed(context.get(), validator_options,
+                                               kConsoleMessageConsumer));
+
+  TransformationContext transformation_context(
+      MakeUnique<FactManager>(context.get()), validator_options);
+
+  // Vec Type Id |   Vector Type  |  Element Type id |   Element Type  |
+  // ------------+----------------+------------------+-----------------+
+  //     12      |      vec2      |         6        |      int64      |
+  //     24      |      vec3      |        18        |     uint64      |
+  //     37      |      vec4      |        31        |    float64      |
+
+  // Test support for 64-bit signed int.
+  {
+    // Assert that the target scalar instruction result id is relevant.
+    ASSERT_FALSE(transformation_context.GetFactManager()->IdIsIrrelevant(50));
+    transformation_context.GetFactManager()->AddFactDataSynonym(
+        MakeDataDescriptor(100, {1}), MakeDataDescriptor(48, {}));
+    transformation_context.GetFactManager()->AddFactDataSynonym(
+        MakeDataDescriptor(101, {1}), MakeDataDescriptor(49, {}));
+
+    // Good: The following transformation should be applicable.
+    TransformationWrapVectorSynonym wrap_add_int64(50, 100, 101, 102, 1);
+    ASSERT_TRUE(
+        wrap_add_int64.IsApplicable(context.get(), transformation_context));
+    // Insert an arithmetic instruction of the same type to add two vectors.
+    ApplyAndCheckFreshIds(wrap_add_int64, context.get(),
+                          &transformation_context);
+
+    // |instruction_id| and id at |scalar_position of the result vector should
+    // be synonyms.
+    ASSERT_TRUE(transformation_context.GetFactManager()->IsSynonymous(
+        MakeDataDescriptor(102, {1}), MakeDataDescriptor(50, {})));
+  }
+
+  // Test support for 64-bit unsigned int.
+  {
+    ASSERT_FALSE(transformation_context.GetFactManager()->IdIsIrrelevant(70));
+    transformation_context.GetFactManager()->AddFactDataSynonym(
+        MakeDataDescriptor(103, {2}), MakeDataDescriptor(68, {}));
+    transformation_context.GetFactManager()->AddFactDataSynonym(
+        MakeDataDescriptor(104, {2}), MakeDataDescriptor(69, {}));
+
+    // Good: The following transformation should be applicable.
+    TransformationWrapVectorSynonym wrap_sub_uint64(70, 103, 104, 105, 2);
+    ASSERT_TRUE(
+        wrap_sub_uint64.IsApplicable(context.get(), transformation_context));
+
+    ApplyAndCheckFreshIds(wrap_sub_uint64, context.get(),
+                          &transformation_context);
+
+    ASSERT_TRUE(transformation_context.GetFactManager()->IsSynonymous(
+        MakeDataDescriptor(105, {2}), MakeDataDescriptor(70, {})));
+  }
+
+  // Test support for 64-bit float.
+  {
+    ASSERT_FALSE(transformation_context.GetFactManager()->IdIsIrrelevant(90));
+    transformation_context.GetFactManager()->AddFactDataSynonym(
+        MakeDataDescriptor(106, {3}), MakeDataDescriptor(88, {}));
+    transformation_context.GetFactManager()->AddFactDataSynonym(
+        MakeDataDescriptor(107, {3}), MakeDataDescriptor(89, {}));
+
+    // Good: The following transformation should be applicable.
+    TransformationWrapVectorSynonym wrap_mul_float64(90, 106, 107, 108, 3);
+    ASSERT_TRUE(
+        wrap_mul_float64.IsApplicable(context.get(), transformation_context));
+
+    ApplyAndCheckFreshIds(wrap_mul_float64, context.get(),
+                          &transformation_context);
+
+    ASSERT_TRUE(transformation_context.GetFactManager()->IsSynonymous(
+        MakeDataDescriptor(108, {3}), MakeDataDescriptor(90, {})));
+  }
+
+  std::string after_transformation = R"(
+               OpCapability Shader
+               OpCapability Int64
+               OpCapability Float64
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %4 "main" %97
+               OpExecutionMode %4 OriginUpperLeft
+               OpSource ESSL 310
+               OpName %4 "main"
+          %2 = OpTypeVoid
+          %3 = OpTypeFunction %2
+          %6 = OpTypeInt 64 1
+          %7 = OpTypePointer Function %6
+          %9 = OpConstant %6 10
+         %11 = OpConstant %6 -5
+         %12 = OpTypeVector %6 2
+         %13 = OpTypePointer Function %12
+         %18 = OpTypeInt 64 0
+         %19 = OpTypePointer Function %18
+         %21 = OpConstant %18 8
+         %23 = OpConstant %18 2
+         %24 = OpTypeVector %18 3
+         %25 = OpTypePointer Function %24
+         %31 = OpTypeFloat 64
+         %32 = OpTypePointer Function %31
+         %34 = OpConstant %31 3.29999995
+         %36 = OpConstant %31 1.10000002
+         %37 = OpTypeVector %31 4
+         %38 = OpTypePointer Function %37
+         %96 = OpTypePointer Input %31
+         %97 = OpVariable %96 Input
+          %4 = OpFunction %2 None %3
+          %5 = OpLabel
+          %8 = OpVariable %7 Function
+         %10 = OpVariable %7 Function
+         %14 = OpVariable %13 Function
+         %20 = OpVariable %19 Function
+         %22 = OpVariable %19 Function
+         %26 = OpVariable %25 Function
+         %33 = OpVariable %32 Function
+         %35 = OpVariable %32 Function
+         %39 = OpVariable %38 Function
+         %47 = OpVariable %7 Function
+         %51 = OpVariable %7 Function
+         %55 = OpVariable %7 Function
+         %59 = OpVariable %7 Function
+         %63 = OpVariable %19 Function
+         %67 = OpVariable %19 Function
+         %71 = OpVariable %19 Function
+         %75 = OpVariable %19 Function
+         %79 = OpVariable %32 Function
+         %83 = OpVariable %32 Function
+         %87 = OpVariable %32 Function
+         %91 = OpVariable %32 Function
+               OpStore %8 %9
+               OpStore %10 %11
+         %15 = OpLoad %6 %8
+         %16 = OpLoad %6 %10
+         %17 = OpCompositeConstruct %12 %15 %16
+               OpStore %14 %17
+               OpStore %20 %21
+               OpStore %22 %23
+         %27 = OpLoad %18 %20
+         %28 = OpLoad %18 %20
+         %29 = OpLoad %18 %22
+         %30 = OpCompositeConstruct %24 %27 %28 %29
+               OpStore %26 %30
+               OpStore %33 %34
+               OpStore %35 %36
+         %40 = OpLoad %31 %33
+         %41 = OpLoad %31 %33
+         %42 = OpLoad %31 %35
+         %43 = OpLoad %31 %35
+         %44 = OpCompositeConstruct %37 %40 %41 %42 %43
+         %45 = OpLoad %37 %39
+         %46 = OpVectorShuffle %37 %45 %44 5 6 7 4
+               OpStore %39 %46
+         %48 = OpLoad %6 %8
+         %49 = OpLoad %6 %10
+        %100 = OpCompositeConstruct %12 %48 %48
+        %101 = OpCompositeConstruct %12 %49 %49
+        %102 = OpIAdd %12 %100 %101
+         %50 = OpIAdd %6 %48 %49
+               OpStore %47 %50
+         %52 = OpLoad %6 %8
+         %53 = OpLoad %6 %10
+         %54 = OpISub %6 %52 %53
+               OpStore %51 %54
+         %56 = OpLoad %6 %8
+         %57 = OpLoad %6 %10
+         %58 = OpIMul %6 %56 %57
+               OpStore %55 %58
+         %60 = OpLoad %6 %8
+         %61 = OpLoad %6 %10
+         %62 = OpSDiv %6 %60 %61
+               OpStore %59 %62
+         %64 = OpLoad %18 %20
+         %65 = OpLoad %18 %22
+         %66 = OpIAdd %18 %64 %65
+               OpStore %63 %66
+         %68 = OpLoad %18 %20
+         %69 = OpLoad %18 %22
+        %103 = OpCompositeConstruct %24 %68 %68 %68
+        %104 = OpCompositeConstruct %24 %69 %69 %69
+        %105 = OpISub %24 %103 %104
+         %70 = OpISub %18 %68 %69
+               OpStore %67 %70
+         %72 = OpLoad %18 %20
+         %73 = OpLoad %18 %22
+         %74 = OpIMul %18 %72 %73
+               OpStore %71 %74
+         %76 = OpLoad %18 %20
+         %77 = OpLoad %18 %22
+         %78 = OpUDiv %18 %76 %77
+               OpStore %75 %78
+         %80 = OpLoad %31 %33
+         %81 = OpLoad %31 %35
+         %82 = OpFAdd %31 %80 %81
+               OpStore %79 %82
+         %84 = OpLoad %31 %33
+         %85 = OpLoad %31 %35
+         %86 = OpFSub %31 %84 %85
+               OpStore %83 %86
+         %88 = OpLoad %31 %33
+         %89 = OpLoad %31 %35
+        %106 = OpCompositeConstruct %37 %88 %88 %88 %88
+        %107 = OpCompositeConstruct %37 %89 %89 %89 %89
+        %108 = OpFMul %37 %106 %107
+         %90 = OpFMul %31 %88 %89
+               OpStore %87 %90
+         %92 = OpLoad %31 %33
+         %93 = OpLoad %31 %35
+         %94 = OpFDiv %31 %92 %93
+               OpStore %91 %94
+               OpReturn
+               OpFunctionEnd
+  )";
+  ASSERT_TRUE(IsEqual(env, after_transformation, context.get()));
+}
+
+}  // namespace
+}  // namespace fuzz
+}  // namespace spvtools
diff --git a/third_party/vulkan-deps/spirv-tools/src/test/fuzzers/CMakeLists.txt b/third_party/vulkan-deps/spirv-tools/src/test/fuzzers/CMakeLists.txt
new file mode 100644
index 0000000..afcc6b8
--- /dev/null
+++ b/third_party/vulkan-deps/spirv-tools/src/test/fuzzers/CMakeLists.txt
@@ -0,0 +1,53 @@
+# Copyright (c) 2021 Google LLC
+#
+# 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.
+
+function(add_spvtools_libfuzzer_target)
+  set(one_value_args TARGET)
+  set(multi_value_args SRCS LIBS)
+  cmake_parse_arguments(
+    ARG "" "${one_value_args}" "${multi_value_args}" ${ARGN})
+
+  add_executable(${ARG_TARGET} ${ARG_SRCS})
+  spvtools_default_compile_options(${ARG_TARGET})
+  target_link_libraries(${ARG_TARGET} PRIVATE ${ARG_LIBS})
+  target_include_directories(${ARG_TARGET} PRIVATE
+    ${spirv-tools_SOURCE_DIR}
+    ${spirv-tools_BINARY_DIR}
+  )
+  set_property(TARGET ${ARG_TARGET} PROPERTY FOLDER "SPIRV-Tools libFuzzer targets")
+  if(NOT ${SPIRV_LIB_FUZZING_ENGINE_LINK_OPTIONS} STREQUAL "")
+    # This is set when the fuzzers are being built by OSS-Fuzz. In this case the
+    # variable provides the necessary linker flags, and OSS-Fuzz will take care
+    # of passing suitable compiler flags.
+    target_link_options(${ARG_TARGET} PRIVATE ${SPIRV_LIB_FUZZING_ENGINE_LINK_OPTIONS})
+  else()
+    # When the fuzzers are being built outside of OSS-Fuzz, standard libFuzzer
+    # arguments to enable fuzzing are used.
+    target_compile_options(${ARG_TARGET} PRIVATE "-fsanitize=fuzzer")
+    target_link_options(${ARG_TARGET} PRIVATE "-fsanitize=fuzzer")    
+  endif()
+endfunction()
+
+if (${SPIRV_BUILD_LIBFUZZER_TARGETS})
+  if(NOT "${CMAKE_CXX_COMPILER_ID}" MATCHES "Clang")
+    message(FATAL_ERROR "The libFuzzer targets are only supported with the Clang compiler. Compiler '${CMAKE_CXX_COMPILER_ID}' is not supported!")
+  endif()
+  add_spvtools_libfuzzer_target(TARGET spvtools_as_fuzzer SRCS spvtools_as_fuzzer.cpp LIBS ${SPIRV_TOOLS_FULL_VISIBILITY})
+  add_spvtools_libfuzzer_target(TARGET spvtools_binary_parser_fuzzer SRCS spvtools_binary_parser_fuzzer.cpp LIBS ${SPIRV_TOOLS_FULL_VISIBILITY})
+  add_spvtools_libfuzzer_target(TARGET spvtools_dis_fuzzer SRCS spvtools_dis_fuzzer.cpp LIBS ${SPIRV_TOOLS_FULL_VISIBILITY})
+  add_spvtools_libfuzzer_target(TARGET spvtools_opt_legalization_fuzzer SRCS spvtools_opt_legalization_fuzzer.cpp LIBS SPIRV-Tools-opt ${SPIRV_TOOLS_FULL_VISIBILITY})
+  add_spvtools_libfuzzer_target(TARGET spvtools_opt_performance_fuzzer SRCS spvtools_opt_performance_fuzzer.cpp LIBS SPIRV-Tools-opt ${SPIRV_TOOLS_FULL_VISIBILITY})
+  add_spvtools_libfuzzer_target(TARGET spvtools_opt_size_fuzzer SRCS spvtools_opt_size_fuzzer.cpp LIBS SPIRV-Tools-opt ${SPIRV_TOOLS_FULL_VISIBILITY})
+  add_spvtools_libfuzzer_target(TARGET spvtools_val_fuzzer SRCS spvtools_val_fuzzer.cpp LIBS ${SPIRV_TOOLS_FULL_VISIBILITY})
+endif()
diff --git a/third_party/vulkan-deps/spirv-tools/src/test/fuzzers/corpora/spv/graphicsfuzz_000.spv b/third_party/vulkan-deps/spirv-tools/src/test/fuzzers/corpora/spv/graphicsfuzz_000.spv
new file mode 100644
index 0000000..c203cec
--- /dev/null
+++ b/third_party/vulkan-deps/spirv-tools/src/test/fuzzers/corpora/spv/graphicsfuzz_000.spv
Binary files differ
diff --git a/third_party/vulkan-deps/spirv-tools/src/test/fuzzers/corpora/spv/graphicsfuzz_001.spv b/third_party/vulkan-deps/spirv-tools/src/test/fuzzers/corpora/spv/graphicsfuzz_001.spv
new file mode 100644
index 0000000..c3dfbd9
--- /dev/null
+++ b/third_party/vulkan-deps/spirv-tools/src/test/fuzzers/corpora/spv/graphicsfuzz_001.spv
Binary files differ
diff --git a/third_party/vulkan-deps/spirv-tools/src/test/fuzzers/corpora/spv/graphicsfuzz_002.spv b/third_party/vulkan-deps/spirv-tools/src/test/fuzzers/corpora/spv/graphicsfuzz_002.spv
new file mode 100644
index 0000000..5a3c145
--- /dev/null
+++ b/third_party/vulkan-deps/spirv-tools/src/test/fuzzers/corpora/spv/graphicsfuzz_002.spv
Binary files differ
diff --git a/third_party/vulkan-deps/spirv-tools/src/test/fuzzers/corpora/spv/graphicsfuzz_003.spv b/third_party/vulkan-deps/spirv-tools/src/test/fuzzers/corpora/spv/graphicsfuzz_003.spv
new file mode 100644
index 0000000..c0e0a29
--- /dev/null
+++ b/third_party/vulkan-deps/spirv-tools/src/test/fuzzers/corpora/spv/graphicsfuzz_003.spv
Binary files differ
diff --git a/third_party/vulkan-deps/spirv-tools/src/test/fuzzers/corpora/spv/graphicsfuzz_004.spv b/third_party/vulkan-deps/spirv-tools/src/test/fuzzers/corpora/spv/graphicsfuzz_004.spv
new file mode 100644
index 0000000..f1afc72
--- /dev/null
+++ b/third_party/vulkan-deps/spirv-tools/src/test/fuzzers/corpora/spv/graphicsfuzz_004.spv
Binary files differ
diff --git a/third_party/vulkan-deps/spirv-tools/src/test/fuzzers/corpora/spv/graphicsfuzz_005.spv b/third_party/vulkan-deps/spirv-tools/src/test/fuzzers/corpora/spv/graphicsfuzz_005.spv
new file mode 100644
index 0000000..c6bf437
--- /dev/null
+++ b/third_party/vulkan-deps/spirv-tools/src/test/fuzzers/corpora/spv/graphicsfuzz_005.spv
Binary files differ
diff --git a/third_party/vulkan-deps/spirv-tools/src/test/fuzzers/corpora/spv/graphicsfuzz_006.spv b/third_party/vulkan-deps/spirv-tools/src/test/fuzzers/corpora/spv/graphicsfuzz_006.spv
new file mode 100644
index 0000000..d0d4a70
--- /dev/null
+++ b/third_party/vulkan-deps/spirv-tools/src/test/fuzzers/corpora/spv/graphicsfuzz_006.spv
Binary files differ
diff --git a/third_party/vulkan-deps/spirv-tools/src/test/fuzzers/corpora/spv/graphicsfuzz_007.spv b/third_party/vulkan-deps/spirv-tools/src/test/fuzzers/corpora/spv/graphicsfuzz_007.spv
new file mode 100644
index 0000000..7f2f982
--- /dev/null
+++ b/third_party/vulkan-deps/spirv-tools/src/test/fuzzers/corpora/spv/graphicsfuzz_007.spv
Binary files differ
diff --git a/third_party/vulkan-deps/spirv-tools/src/test/fuzzers/corpora/spv/graphicsfuzz_008.spv b/third_party/vulkan-deps/spirv-tools/src/test/fuzzers/corpora/spv/graphicsfuzz_008.spv
new file mode 100644
index 0000000..c67dc97
--- /dev/null
+++ b/third_party/vulkan-deps/spirv-tools/src/test/fuzzers/corpora/spv/graphicsfuzz_008.spv
Binary files differ
diff --git a/third_party/vulkan-deps/spirv-tools/src/test/fuzzers/corpora/spv/graphicsfuzz_009.spv b/third_party/vulkan-deps/spirv-tools/src/test/fuzzers/corpora/spv/graphicsfuzz_009.spv
new file mode 100644
index 0000000..68740b3
--- /dev/null
+++ b/third_party/vulkan-deps/spirv-tools/src/test/fuzzers/corpora/spv/graphicsfuzz_009.spv
Binary files differ
diff --git a/third_party/vulkan-deps/spirv-tools/src/test/fuzzers/corpora/spv/graphicsfuzz_010.spv b/third_party/vulkan-deps/spirv-tools/src/test/fuzzers/corpora/spv/graphicsfuzz_010.spv
new file mode 100644
index 0000000..fedc8b4c
--- /dev/null
+++ b/third_party/vulkan-deps/spirv-tools/src/test/fuzzers/corpora/spv/graphicsfuzz_010.spv
Binary files differ
diff --git a/third_party/vulkan-deps/spirv-tools/src/test/fuzzers/corpora/spv/graphicsfuzz_011.spv b/third_party/vulkan-deps/spirv-tools/src/test/fuzzers/corpora/spv/graphicsfuzz_011.spv
new file mode 100644
index 0000000..882bfe6
--- /dev/null
+++ b/third_party/vulkan-deps/spirv-tools/src/test/fuzzers/corpora/spv/graphicsfuzz_011.spv
Binary files differ
diff --git a/third_party/vulkan-deps/spirv-tools/src/test/fuzzers/corpora/spv/graphicsfuzz_012.spv b/third_party/vulkan-deps/spirv-tools/src/test/fuzzers/corpora/spv/graphicsfuzz_012.spv
new file mode 100644
index 0000000..bd3c114
--- /dev/null
+++ b/third_party/vulkan-deps/spirv-tools/src/test/fuzzers/corpora/spv/graphicsfuzz_012.spv
Binary files differ
diff --git a/third_party/vulkan-deps/spirv-tools/src/test/fuzzers/corpora/spv/graphicsfuzz_013.spv b/third_party/vulkan-deps/spirv-tools/src/test/fuzzers/corpora/spv/graphicsfuzz_013.spv
new file mode 100644
index 0000000..d7e35b4
--- /dev/null
+++ b/third_party/vulkan-deps/spirv-tools/src/test/fuzzers/corpora/spv/graphicsfuzz_013.spv
Binary files differ
diff --git a/third_party/vulkan-deps/spirv-tools/src/test/fuzzers/corpora/spv/graphicsfuzz_014.spv b/third_party/vulkan-deps/spirv-tools/src/test/fuzzers/corpora/spv/graphicsfuzz_014.spv
new file mode 100644
index 0000000..abf5488
--- /dev/null
+++ b/third_party/vulkan-deps/spirv-tools/src/test/fuzzers/corpora/spv/graphicsfuzz_014.spv
Binary files differ
diff --git a/third_party/vulkan-deps/spirv-tools/src/test/fuzzers/corpora/spv/graphicsfuzz_015.spv b/third_party/vulkan-deps/spirv-tools/src/test/fuzzers/corpora/spv/graphicsfuzz_015.spv
new file mode 100644
index 0000000..868ab04
--- /dev/null
+++ b/third_party/vulkan-deps/spirv-tools/src/test/fuzzers/corpora/spv/graphicsfuzz_015.spv
Binary files differ
diff --git a/third_party/vulkan-deps/spirv-tools/src/test/fuzzers/corpora/spv/graphicsfuzz_016.spv b/third_party/vulkan-deps/spirv-tools/src/test/fuzzers/corpora/spv/graphicsfuzz_016.spv
new file mode 100644
index 0000000..a7cef28
--- /dev/null
+++ b/third_party/vulkan-deps/spirv-tools/src/test/fuzzers/corpora/spv/graphicsfuzz_016.spv
Binary files differ
diff --git a/third_party/vulkan-deps/spirv-tools/src/test/fuzzers/corpora/spv/graphicsfuzz_017.spv b/third_party/vulkan-deps/spirv-tools/src/test/fuzzers/corpora/spv/graphicsfuzz_017.spv
new file mode 100644
index 0000000..6d338a9
--- /dev/null
+++ b/third_party/vulkan-deps/spirv-tools/src/test/fuzzers/corpora/spv/graphicsfuzz_017.spv
Binary files differ
diff --git a/third_party/vulkan-deps/spirv-tools/src/test/fuzzers/corpora/spv/graphicsfuzz_018.spv b/third_party/vulkan-deps/spirv-tools/src/test/fuzzers/corpora/spv/graphicsfuzz_018.spv
new file mode 100644
index 0000000..c7bf440
--- /dev/null
+++ b/third_party/vulkan-deps/spirv-tools/src/test/fuzzers/corpora/spv/graphicsfuzz_018.spv
Binary files differ
diff --git a/third_party/vulkan-deps/spirv-tools/src/test/fuzzers/corpora/spv/graphicsfuzz_019.spv b/third_party/vulkan-deps/spirv-tools/src/test/fuzzers/corpora/spv/graphicsfuzz_019.spv
new file mode 100644
index 0000000..99d7e2d
--- /dev/null
+++ b/third_party/vulkan-deps/spirv-tools/src/test/fuzzers/corpora/spv/graphicsfuzz_019.spv
Binary files differ
diff --git a/third_party/vulkan-deps/spirv-tools/src/test/fuzzers/corpora/spv/graphicsfuzz_020.spv b/third_party/vulkan-deps/spirv-tools/src/test/fuzzers/corpora/spv/graphicsfuzz_020.spv
new file mode 100644
index 0000000..9e24124
--- /dev/null
+++ b/third_party/vulkan-deps/spirv-tools/src/test/fuzzers/corpora/spv/graphicsfuzz_020.spv
Binary files differ
diff --git a/third_party/vulkan-deps/spirv-tools/src/test/fuzzers/corpora/spv/graphicsfuzz_021.spv b/third_party/vulkan-deps/spirv-tools/src/test/fuzzers/corpora/spv/graphicsfuzz_021.spv
new file mode 100644
index 0000000..02734af
--- /dev/null
+++ b/third_party/vulkan-deps/spirv-tools/src/test/fuzzers/corpora/spv/graphicsfuzz_021.spv
Binary files differ
diff --git a/third_party/vulkan-deps/spirv-tools/src/test/fuzzers/corpora/spv/graphicsfuzz_022.spv b/third_party/vulkan-deps/spirv-tools/src/test/fuzzers/corpora/spv/graphicsfuzz_022.spv
new file mode 100644
index 0000000..cd9ab76
--- /dev/null
+++ b/third_party/vulkan-deps/spirv-tools/src/test/fuzzers/corpora/spv/graphicsfuzz_022.spv
Binary files differ
diff --git a/third_party/vulkan-deps/spirv-tools/src/test/fuzzers/corpora/spv/graphicsfuzz_023.spv b/third_party/vulkan-deps/spirv-tools/src/test/fuzzers/corpora/spv/graphicsfuzz_023.spv
new file mode 100644
index 0000000..d0ec5d3
--- /dev/null
+++ b/third_party/vulkan-deps/spirv-tools/src/test/fuzzers/corpora/spv/graphicsfuzz_023.spv
Binary files differ
diff --git a/third_party/vulkan-deps/spirv-tools/src/test/fuzzers/corpora/spv/graphicsfuzz_024.spv b/third_party/vulkan-deps/spirv-tools/src/test/fuzzers/corpora/spv/graphicsfuzz_024.spv
new file mode 100644
index 0000000..503627f
--- /dev/null
+++ b/third_party/vulkan-deps/spirv-tools/src/test/fuzzers/corpora/spv/graphicsfuzz_024.spv
Binary files differ
diff --git a/third_party/vulkan-deps/spirv-tools/src/test/fuzzers/corpora/spv/graphicsfuzz_025.spv b/third_party/vulkan-deps/spirv-tools/src/test/fuzzers/corpora/spv/graphicsfuzz_025.spv
new file mode 100644
index 0000000..c4e0aa3
--- /dev/null
+++ b/third_party/vulkan-deps/spirv-tools/src/test/fuzzers/corpora/spv/graphicsfuzz_025.spv
Binary files differ
diff --git a/third_party/vulkan-deps/spirv-tools/src/test/fuzzers/corpora/spv/graphicsfuzz_026.spv b/third_party/vulkan-deps/spirv-tools/src/test/fuzzers/corpora/spv/graphicsfuzz_026.spv
new file mode 100644
index 0000000..c5b3ced
--- /dev/null
+++ b/third_party/vulkan-deps/spirv-tools/src/test/fuzzers/corpora/spv/graphicsfuzz_026.spv
Binary files differ
diff --git a/third_party/vulkan-deps/spirv-tools/src/test/fuzzers/corpora/spv/graphicsfuzz_027.spv b/third_party/vulkan-deps/spirv-tools/src/test/fuzzers/corpora/spv/graphicsfuzz_027.spv
new file mode 100644
index 0000000..626e606
--- /dev/null
+++ b/third_party/vulkan-deps/spirv-tools/src/test/fuzzers/corpora/spv/graphicsfuzz_027.spv
Binary files differ
diff --git a/third_party/vulkan-deps/spirv-tools/src/test/fuzzers/corpora/spv/graphicsfuzz_028.spv b/third_party/vulkan-deps/spirv-tools/src/test/fuzzers/corpora/spv/graphicsfuzz_028.spv
new file mode 100644
index 0000000..a9a4357
--- /dev/null
+++ b/third_party/vulkan-deps/spirv-tools/src/test/fuzzers/corpora/spv/graphicsfuzz_028.spv
Binary files differ
diff --git a/third_party/vulkan-deps/spirv-tools/src/test/fuzzers/corpora/spv/graphicsfuzz_029.spv b/third_party/vulkan-deps/spirv-tools/src/test/fuzzers/corpora/spv/graphicsfuzz_029.spv
new file mode 100644
index 0000000..18e49a5
--- /dev/null
+++ b/third_party/vulkan-deps/spirv-tools/src/test/fuzzers/corpora/spv/graphicsfuzz_029.spv
Binary files differ
diff --git a/third_party/vulkan-deps/spirv-tools/src/test/fuzzers/corpora/spv/graphicsfuzz_030.spv b/third_party/vulkan-deps/spirv-tools/src/test/fuzzers/corpora/spv/graphicsfuzz_030.spv
new file mode 100644
index 0000000..ac4ea36
--- /dev/null
+++ b/third_party/vulkan-deps/spirv-tools/src/test/fuzzers/corpora/spv/graphicsfuzz_030.spv
Binary files differ
diff --git a/third_party/vulkan-deps/spirv-tools/src/test/fuzzers/corpora/spv/graphicsfuzz_031.spv b/third_party/vulkan-deps/spirv-tools/src/test/fuzzers/corpora/spv/graphicsfuzz_031.spv
new file mode 100644
index 0000000..2f8eff6
--- /dev/null
+++ b/third_party/vulkan-deps/spirv-tools/src/test/fuzzers/corpora/spv/graphicsfuzz_031.spv
Binary files differ
diff --git a/third_party/vulkan-deps/spirv-tools/src/test/fuzzers/corpora/spv/graphicsfuzz_032.spv b/third_party/vulkan-deps/spirv-tools/src/test/fuzzers/corpora/spv/graphicsfuzz_032.spv
new file mode 100644
index 0000000..a5808ec
--- /dev/null
+++ b/third_party/vulkan-deps/spirv-tools/src/test/fuzzers/corpora/spv/graphicsfuzz_032.spv
Binary files differ
diff --git a/third_party/vulkan-deps/spirv-tools/src/test/fuzzers/corpora/spv/graphicsfuzz_033.spv b/third_party/vulkan-deps/spirv-tools/src/test/fuzzers/corpora/spv/graphicsfuzz_033.spv
new file mode 100644
index 0000000..98cf02e
--- /dev/null
+++ b/third_party/vulkan-deps/spirv-tools/src/test/fuzzers/corpora/spv/graphicsfuzz_033.spv
Binary files differ
diff --git a/third_party/vulkan-deps/spirv-tools/src/test/fuzzers/corpora/spv/graphicsfuzz_034.spv b/third_party/vulkan-deps/spirv-tools/src/test/fuzzers/corpora/spv/graphicsfuzz_034.spv
new file mode 100644
index 0000000..306fd84
--- /dev/null
+++ b/third_party/vulkan-deps/spirv-tools/src/test/fuzzers/corpora/spv/graphicsfuzz_034.spv
Binary files differ
diff --git a/third_party/vulkan-deps/spirv-tools/src/test/fuzzers/corpora/spv/graphicsfuzz_035.spv b/third_party/vulkan-deps/spirv-tools/src/test/fuzzers/corpora/spv/graphicsfuzz_035.spv
new file mode 100644
index 0000000..7ed19e0
--- /dev/null
+++ b/third_party/vulkan-deps/spirv-tools/src/test/fuzzers/corpora/spv/graphicsfuzz_035.spv
Binary files differ
diff --git a/third_party/vulkan-deps/spirv-tools/src/test/fuzzers/corpora/spv/graphicsfuzz_036.spv b/third_party/vulkan-deps/spirv-tools/src/test/fuzzers/corpora/spv/graphicsfuzz_036.spv
new file mode 100644
index 0000000..22e6783
--- /dev/null
+++ b/third_party/vulkan-deps/spirv-tools/src/test/fuzzers/corpora/spv/graphicsfuzz_036.spv
Binary files differ
diff --git a/third_party/vulkan-deps/spirv-tools/src/test/fuzzers/corpora/spv/graphicsfuzz_037.spv b/third_party/vulkan-deps/spirv-tools/src/test/fuzzers/corpora/spv/graphicsfuzz_037.spv
new file mode 100644
index 0000000..19fbd20
--- /dev/null
+++ b/third_party/vulkan-deps/spirv-tools/src/test/fuzzers/corpora/spv/graphicsfuzz_037.spv
Binary files differ
diff --git a/third_party/vulkan-deps/spirv-tools/src/test/fuzzers/corpora/spv/graphicsfuzz_038.spv b/third_party/vulkan-deps/spirv-tools/src/test/fuzzers/corpora/spv/graphicsfuzz_038.spv
new file mode 100644
index 0000000..7bc5489
--- /dev/null
+++ b/third_party/vulkan-deps/spirv-tools/src/test/fuzzers/corpora/spv/graphicsfuzz_038.spv
Binary files differ
diff --git a/third_party/vulkan-deps/spirv-tools/src/test/fuzzers/corpora/spv/graphicsfuzz_039.spv b/third_party/vulkan-deps/spirv-tools/src/test/fuzzers/corpora/spv/graphicsfuzz_039.spv
new file mode 100644
index 0000000..01b908d
--- /dev/null
+++ b/third_party/vulkan-deps/spirv-tools/src/test/fuzzers/corpora/spv/graphicsfuzz_039.spv
Binary files differ
diff --git a/third_party/vulkan-deps/spirv-tools/src/test/fuzzers/corpora/spv/graphicsfuzz_040.spv b/third_party/vulkan-deps/spirv-tools/src/test/fuzzers/corpora/spv/graphicsfuzz_040.spv
new file mode 100644
index 0000000..bd13157
--- /dev/null
+++ b/third_party/vulkan-deps/spirv-tools/src/test/fuzzers/corpora/spv/graphicsfuzz_040.spv
Binary files differ
diff --git a/third_party/vulkan-deps/spirv-tools/src/test/fuzzers/corpora/spv/graphicsfuzz_041.spv b/third_party/vulkan-deps/spirv-tools/src/test/fuzzers/corpora/spv/graphicsfuzz_041.spv
new file mode 100644
index 0000000..6e355c2
--- /dev/null
+++ b/third_party/vulkan-deps/spirv-tools/src/test/fuzzers/corpora/spv/graphicsfuzz_041.spv
Binary files differ
diff --git a/third_party/vulkan-deps/spirv-tools/src/test/fuzzers/corpora/spv/graphicsfuzz_042.spv b/third_party/vulkan-deps/spirv-tools/src/test/fuzzers/corpora/spv/graphicsfuzz_042.spv
new file mode 100644
index 0000000..d356cb1
--- /dev/null
+++ b/third_party/vulkan-deps/spirv-tools/src/test/fuzzers/corpora/spv/graphicsfuzz_042.spv
Binary files differ
diff --git a/third_party/vulkan-deps/spirv-tools/src/test/fuzzers/corpora/spv/graphicsfuzz_043.spv b/third_party/vulkan-deps/spirv-tools/src/test/fuzzers/corpora/spv/graphicsfuzz_043.spv
new file mode 100644
index 0000000..49c87ed
--- /dev/null
+++ b/third_party/vulkan-deps/spirv-tools/src/test/fuzzers/corpora/spv/graphicsfuzz_043.spv
Binary files differ
diff --git a/third_party/vulkan-deps/spirv-tools/src/test/fuzzers/corpora/spv/graphicsfuzz_044.spv b/third_party/vulkan-deps/spirv-tools/src/test/fuzzers/corpora/spv/graphicsfuzz_044.spv
new file mode 100644
index 0000000..c7e36d5
--- /dev/null
+++ b/third_party/vulkan-deps/spirv-tools/src/test/fuzzers/corpora/spv/graphicsfuzz_044.spv
Binary files differ
diff --git a/third_party/vulkan-deps/spirv-tools/src/test/fuzzers/corpora/spv/graphicsfuzz_045.spv b/third_party/vulkan-deps/spirv-tools/src/test/fuzzers/corpora/spv/graphicsfuzz_045.spv
new file mode 100644
index 0000000..ad19726
--- /dev/null
+++ b/third_party/vulkan-deps/spirv-tools/src/test/fuzzers/corpora/spv/graphicsfuzz_045.spv
Binary files differ
diff --git a/third_party/vulkan-deps/spirv-tools/src/test/fuzzers/corpora/spv/graphicsfuzz_046.spv b/third_party/vulkan-deps/spirv-tools/src/test/fuzzers/corpora/spv/graphicsfuzz_046.spv
new file mode 100644
index 0000000..3b3678a
--- /dev/null
+++ b/third_party/vulkan-deps/spirv-tools/src/test/fuzzers/corpora/spv/graphicsfuzz_046.spv
Binary files differ
diff --git a/third_party/vulkan-deps/spirv-tools/src/test/fuzzers/corpora/spv/graphicsfuzz_047.spv b/third_party/vulkan-deps/spirv-tools/src/test/fuzzers/corpora/spv/graphicsfuzz_047.spv
new file mode 100644
index 0000000..7253247
--- /dev/null
+++ b/third_party/vulkan-deps/spirv-tools/src/test/fuzzers/corpora/spv/graphicsfuzz_047.spv
Binary files differ
diff --git a/third_party/vulkan-deps/spirv-tools/src/test/fuzzers/corpora/spv/graphicsfuzz_048.spv b/third_party/vulkan-deps/spirv-tools/src/test/fuzzers/corpora/spv/graphicsfuzz_048.spv
new file mode 100644
index 0000000..5c05c1c
--- /dev/null
+++ b/third_party/vulkan-deps/spirv-tools/src/test/fuzzers/corpora/spv/graphicsfuzz_048.spv
Binary files differ
diff --git a/third_party/vulkan-deps/spirv-tools/src/test/fuzzers/corpora/spv/graphicsfuzz_049.spv b/third_party/vulkan-deps/spirv-tools/src/test/fuzzers/corpora/spv/graphicsfuzz_049.spv
new file mode 100644
index 0000000..22bc9c2
--- /dev/null
+++ b/third_party/vulkan-deps/spirv-tools/src/test/fuzzers/corpora/spv/graphicsfuzz_049.spv
Binary files differ
diff --git a/third_party/vulkan-deps/spirv-tools/src/test/fuzzers/corpora/spv/graphicsfuzz_050.spv b/third_party/vulkan-deps/spirv-tools/src/test/fuzzers/corpora/spv/graphicsfuzz_050.spv
new file mode 100644
index 0000000..8f84788
--- /dev/null
+++ b/third_party/vulkan-deps/spirv-tools/src/test/fuzzers/corpora/spv/graphicsfuzz_050.spv
Binary files differ
diff --git a/third_party/vulkan-deps/spirv-tools/src/test/fuzzers/corpora/spv/graphicsfuzz_051.spv b/third_party/vulkan-deps/spirv-tools/src/test/fuzzers/corpora/spv/graphicsfuzz_051.spv
new file mode 100644
index 0000000..727c64d
--- /dev/null
+++ b/third_party/vulkan-deps/spirv-tools/src/test/fuzzers/corpora/spv/graphicsfuzz_051.spv
Binary files differ
diff --git a/third_party/vulkan-deps/spirv-tools/src/test/fuzzers/corpora/spv/graphicsfuzz_052.spv b/third_party/vulkan-deps/spirv-tools/src/test/fuzzers/corpora/spv/graphicsfuzz_052.spv
new file mode 100644
index 0000000..d9ba741
--- /dev/null
+++ b/third_party/vulkan-deps/spirv-tools/src/test/fuzzers/corpora/spv/graphicsfuzz_052.spv
Binary files differ
diff --git a/third_party/vulkan-deps/spirv-tools/src/test/fuzzers/corpora/spv/graphicsfuzz_053.spv b/third_party/vulkan-deps/spirv-tools/src/test/fuzzers/corpora/spv/graphicsfuzz_053.spv
new file mode 100644
index 0000000..d827004
--- /dev/null
+++ b/third_party/vulkan-deps/spirv-tools/src/test/fuzzers/corpora/spv/graphicsfuzz_053.spv
Binary files differ
diff --git a/third_party/vulkan-deps/spirv-tools/src/test/fuzzers/corpora/spv/graphicsfuzz_054.spv b/third_party/vulkan-deps/spirv-tools/src/test/fuzzers/corpora/spv/graphicsfuzz_054.spv
new file mode 100644
index 0000000..a3aec7b
--- /dev/null
+++ b/third_party/vulkan-deps/spirv-tools/src/test/fuzzers/corpora/spv/graphicsfuzz_054.spv
Binary files differ
diff --git a/third_party/vulkan-deps/spirv-tools/src/test/fuzzers/corpora/spv/graphicsfuzz_055.spv b/third_party/vulkan-deps/spirv-tools/src/test/fuzzers/corpora/spv/graphicsfuzz_055.spv
new file mode 100644
index 0000000..2da1375
--- /dev/null
+++ b/third_party/vulkan-deps/spirv-tools/src/test/fuzzers/corpora/spv/graphicsfuzz_055.spv
Binary files differ
diff --git a/third_party/vulkan-deps/spirv-tools/src/test/fuzzers/corpora/spv/graphicsfuzz_056.spv b/third_party/vulkan-deps/spirv-tools/src/test/fuzzers/corpora/spv/graphicsfuzz_056.spv
new file mode 100644
index 0000000..515d4f1
--- /dev/null
+++ b/third_party/vulkan-deps/spirv-tools/src/test/fuzzers/corpora/spv/graphicsfuzz_056.spv
Binary files differ
diff --git a/third_party/vulkan-deps/spirv-tools/src/test/fuzzers/corpora/spv/graphicsfuzz_057.spv b/third_party/vulkan-deps/spirv-tools/src/test/fuzzers/corpora/spv/graphicsfuzz_057.spv
new file mode 100644
index 0000000..2a0f489
--- /dev/null
+++ b/third_party/vulkan-deps/spirv-tools/src/test/fuzzers/corpora/spv/graphicsfuzz_057.spv
Binary files differ
diff --git a/third_party/vulkan-deps/spirv-tools/src/test/fuzzers/corpora/spv/graphicsfuzz_058.spv b/third_party/vulkan-deps/spirv-tools/src/test/fuzzers/corpora/spv/graphicsfuzz_058.spv
new file mode 100644
index 0000000..3211ec2
--- /dev/null
+++ b/third_party/vulkan-deps/spirv-tools/src/test/fuzzers/corpora/spv/graphicsfuzz_058.spv
Binary files differ
diff --git a/third_party/vulkan-deps/spirv-tools/src/test/fuzzers/corpora/spv/graphicsfuzz_059.spv b/third_party/vulkan-deps/spirv-tools/src/test/fuzzers/corpora/spv/graphicsfuzz_059.spv
new file mode 100644
index 0000000..89e34ec
--- /dev/null
+++ b/third_party/vulkan-deps/spirv-tools/src/test/fuzzers/corpora/spv/graphicsfuzz_059.spv
Binary files differ
diff --git a/third_party/vulkan-deps/spirv-tools/src/test/fuzzers/corpora/spv/graphicsfuzz_060.spv b/third_party/vulkan-deps/spirv-tools/src/test/fuzzers/corpora/spv/graphicsfuzz_060.spv
new file mode 100644
index 0000000..d1fdaec
--- /dev/null
+++ b/third_party/vulkan-deps/spirv-tools/src/test/fuzzers/corpora/spv/graphicsfuzz_060.spv
Binary files differ
diff --git a/third_party/vulkan-deps/spirv-tools/src/test/fuzzers/corpora/spv/graphicsfuzz_061.spv b/third_party/vulkan-deps/spirv-tools/src/test/fuzzers/corpora/spv/graphicsfuzz_061.spv
new file mode 100644
index 0000000..de10f68
--- /dev/null
+++ b/third_party/vulkan-deps/spirv-tools/src/test/fuzzers/corpora/spv/graphicsfuzz_061.spv
Binary files differ
diff --git a/third_party/vulkan-deps/spirv-tools/src/test/fuzzers/corpora/spv/graphicsfuzz_062.spv b/third_party/vulkan-deps/spirv-tools/src/test/fuzzers/corpora/spv/graphicsfuzz_062.spv
new file mode 100644
index 0000000..503304c
--- /dev/null
+++ b/third_party/vulkan-deps/spirv-tools/src/test/fuzzers/corpora/spv/graphicsfuzz_062.spv
Binary files differ
diff --git a/third_party/vulkan-deps/spirv-tools/src/test/fuzzers/corpora/spv/graphicsfuzz_063.spv b/third_party/vulkan-deps/spirv-tools/src/test/fuzzers/corpora/spv/graphicsfuzz_063.spv
new file mode 100644
index 0000000..75d9b4c
--- /dev/null
+++ b/third_party/vulkan-deps/spirv-tools/src/test/fuzzers/corpora/spv/graphicsfuzz_063.spv
Binary files differ
diff --git a/third_party/vulkan-deps/spirv-tools/src/test/fuzzers/corpora/spv/graphicsfuzz_064.spv b/third_party/vulkan-deps/spirv-tools/src/test/fuzzers/corpora/spv/graphicsfuzz_064.spv
new file mode 100644
index 0000000..0b902cb
--- /dev/null
+++ b/third_party/vulkan-deps/spirv-tools/src/test/fuzzers/corpora/spv/graphicsfuzz_064.spv
Binary files differ
diff --git a/third_party/vulkan-deps/spirv-tools/src/test/fuzzers/corpora/spv/graphicsfuzz_065.spv b/third_party/vulkan-deps/spirv-tools/src/test/fuzzers/corpora/spv/graphicsfuzz_065.spv
new file mode 100644
index 0000000..437e45b
--- /dev/null
+++ b/third_party/vulkan-deps/spirv-tools/src/test/fuzzers/corpora/spv/graphicsfuzz_065.spv
Binary files differ
diff --git a/third_party/vulkan-deps/spirv-tools/src/test/fuzzers/corpora/spv/graphicsfuzz_066.spv b/third_party/vulkan-deps/spirv-tools/src/test/fuzzers/corpora/spv/graphicsfuzz_066.spv
new file mode 100644
index 0000000..5585a6f
--- /dev/null
+++ b/third_party/vulkan-deps/spirv-tools/src/test/fuzzers/corpora/spv/graphicsfuzz_066.spv
Binary files differ
diff --git a/third_party/vulkan-deps/spirv-tools/src/test/fuzzers/corpora/spv/graphicsfuzz_067.spv b/third_party/vulkan-deps/spirv-tools/src/test/fuzzers/corpora/spv/graphicsfuzz_067.spv
new file mode 100644
index 0000000..763fd34
--- /dev/null
+++ b/third_party/vulkan-deps/spirv-tools/src/test/fuzzers/corpora/spv/graphicsfuzz_067.spv
Binary files differ
diff --git a/third_party/vulkan-deps/spirv-tools/src/test/fuzzers/corpora/spv/graphicsfuzz_068.spv b/third_party/vulkan-deps/spirv-tools/src/test/fuzzers/corpora/spv/graphicsfuzz_068.spv
new file mode 100644
index 0000000..1ad0bd5
--- /dev/null
+++ b/third_party/vulkan-deps/spirv-tools/src/test/fuzzers/corpora/spv/graphicsfuzz_068.spv
Binary files differ
diff --git a/third_party/vulkan-deps/spirv-tools/src/test/fuzzers/corpora/spv/graphicsfuzz_069.spv b/third_party/vulkan-deps/spirv-tools/src/test/fuzzers/corpora/spv/graphicsfuzz_069.spv
new file mode 100644
index 0000000..f1e7950
--- /dev/null
+++ b/third_party/vulkan-deps/spirv-tools/src/test/fuzzers/corpora/spv/graphicsfuzz_069.spv
Binary files differ
diff --git a/third_party/vulkan-deps/spirv-tools/src/test/fuzzers/corpora/spv/graphicsfuzz_070.spv b/third_party/vulkan-deps/spirv-tools/src/test/fuzzers/corpora/spv/graphicsfuzz_070.spv
new file mode 100644
index 0000000..47f4c82
--- /dev/null
+++ b/third_party/vulkan-deps/spirv-tools/src/test/fuzzers/corpora/spv/graphicsfuzz_070.spv
Binary files differ
diff --git a/third_party/vulkan-deps/spirv-tools/src/test/fuzzers/corpora/spv/graphicsfuzz_071.spv b/third_party/vulkan-deps/spirv-tools/src/test/fuzzers/corpora/spv/graphicsfuzz_071.spv
new file mode 100644
index 0000000..3eac74a
--- /dev/null
+++ b/third_party/vulkan-deps/spirv-tools/src/test/fuzzers/corpora/spv/graphicsfuzz_071.spv
Binary files differ
diff --git a/third_party/vulkan-deps/spirv-tools/src/test/fuzzers/corpora/spv/graphicsfuzz_072.spv b/third_party/vulkan-deps/spirv-tools/src/test/fuzzers/corpora/spv/graphicsfuzz_072.spv
new file mode 100644
index 0000000..e246115
--- /dev/null
+++ b/third_party/vulkan-deps/spirv-tools/src/test/fuzzers/corpora/spv/graphicsfuzz_072.spv
Binary files differ
diff --git a/third_party/vulkan-deps/spirv-tools/src/test/fuzzers/corpora/spv/graphicsfuzz_073.spv b/third_party/vulkan-deps/spirv-tools/src/test/fuzzers/corpora/spv/graphicsfuzz_073.spv
new file mode 100644
index 0000000..b7e915b
--- /dev/null
+++ b/third_party/vulkan-deps/spirv-tools/src/test/fuzzers/corpora/spv/graphicsfuzz_073.spv
Binary files differ
diff --git a/third_party/vulkan-deps/spirv-tools/src/test/fuzzers/corpora/spv/graphicsfuzz_074.spv b/third_party/vulkan-deps/spirv-tools/src/test/fuzzers/corpora/spv/graphicsfuzz_074.spv
new file mode 100644
index 0000000..3588757
--- /dev/null
+++ b/third_party/vulkan-deps/spirv-tools/src/test/fuzzers/corpora/spv/graphicsfuzz_074.spv
Binary files differ
diff --git a/third_party/vulkan-deps/spirv-tools/src/test/fuzzers/corpora/spv/graphicsfuzz_075.spv b/third_party/vulkan-deps/spirv-tools/src/test/fuzzers/corpora/spv/graphicsfuzz_075.spv
new file mode 100644
index 0000000..d3dc46d
--- /dev/null
+++ b/third_party/vulkan-deps/spirv-tools/src/test/fuzzers/corpora/spv/graphicsfuzz_075.spv
Binary files differ
diff --git a/third_party/vulkan-deps/spirv-tools/src/test/fuzzers/corpora/spv/graphicsfuzz_076.spv b/third_party/vulkan-deps/spirv-tools/src/test/fuzzers/corpora/spv/graphicsfuzz_076.spv
new file mode 100644
index 0000000..11bee68
--- /dev/null
+++ b/third_party/vulkan-deps/spirv-tools/src/test/fuzzers/corpora/spv/graphicsfuzz_076.spv
Binary files differ
diff --git a/third_party/vulkan-deps/spirv-tools/src/test/fuzzers/corpora/spv/graphicsfuzz_077.spv b/third_party/vulkan-deps/spirv-tools/src/test/fuzzers/corpora/spv/graphicsfuzz_077.spv
new file mode 100644
index 0000000..d1b8c76
--- /dev/null
+++ b/third_party/vulkan-deps/spirv-tools/src/test/fuzzers/corpora/spv/graphicsfuzz_077.spv
Binary files differ
diff --git a/third_party/vulkan-deps/spirv-tools/src/test/fuzzers/corpora/spv/graphicsfuzz_078.spv b/third_party/vulkan-deps/spirv-tools/src/test/fuzzers/corpora/spv/graphicsfuzz_078.spv
new file mode 100644
index 0000000..4739a9a
--- /dev/null
+++ b/third_party/vulkan-deps/spirv-tools/src/test/fuzzers/corpora/spv/graphicsfuzz_078.spv
Binary files differ
diff --git a/third_party/vulkan-deps/spirv-tools/src/test/fuzzers/corpora/spv/graphicsfuzz_079.spv b/third_party/vulkan-deps/spirv-tools/src/test/fuzzers/corpora/spv/graphicsfuzz_079.spv
new file mode 100644
index 0000000..6553ecf
--- /dev/null
+++ b/third_party/vulkan-deps/spirv-tools/src/test/fuzzers/corpora/spv/graphicsfuzz_079.spv
Binary files differ
diff --git a/third_party/vulkan-deps/spirv-tools/src/test/fuzzers/corpora/spv/graphicsfuzz_080.spv b/third_party/vulkan-deps/spirv-tools/src/test/fuzzers/corpora/spv/graphicsfuzz_080.spv
new file mode 100644
index 0000000..802375b
--- /dev/null
+++ b/third_party/vulkan-deps/spirv-tools/src/test/fuzzers/corpora/spv/graphicsfuzz_080.spv
Binary files differ
diff --git a/third_party/vulkan-deps/spirv-tools/src/test/fuzzers/corpora/spv/graphicsfuzz_081.spv b/third_party/vulkan-deps/spirv-tools/src/test/fuzzers/corpora/spv/graphicsfuzz_081.spv
new file mode 100644
index 0000000..72d1027
--- /dev/null
+++ b/third_party/vulkan-deps/spirv-tools/src/test/fuzzers/corpora/spv/graphicsfuzz_081.spv
Binary files differ
diff --git a/third_party/vulkan-deps/spirv-tools/src/test/fuzzers/corpora/spv/graphicsfuzz_082.spv b/third_party/vulkan-deps/spirv-tools/src/test/fuzzers/corpora/spv/graphicsfuzz_082.spv
new file mode 100644
index 0000000..619c742
--- /dev/null
+++ b/third_party/vulkan-deps/spirv-tools/src/test/fuzzers/corpora/spv/graphicsfuzz_082.spv
Binary files differ
diff --git a/third_party/vulkan-deps/spirv-tools/src/test/fuzzers/corpora/spv/graphicsfuzz_083.spv b/third_party/vulkan-deps/spirv-tools/src/test/fuzzers/corpora/spv/graphicsfuzz_083.spv
new file mode 100644
index 0000000..fa27c33
--- /dev/null
+++ b/third_party/vulkan-deps/spirv-tools/src/test/fuzzers/corpora/spv/graphicsfuzz_083.spv
Binary files differ
diff --git a/third_party/vulkan-deps/spirv-tools/src/test/fuzzers/corpora/spv/graphicsfuzz_084.spv b/third_party/vulkan-deps/spirv-tools/src/test/fuzzers/corpora/spv/graphicsfuzz_084.spv
new file mode 100644
index 0000000..14f7bfd
--- /dev/null
+++ b/third_party/vulkan-deps/spirv-tools/src/test/fuzzers/corpora/spv/graphicsfuzz_084.spv
Binary files differ
diff --git a/third_party/vulkan-deps/spirv-tools/src/test/fuzzers/corpora/spv/graphicsfuzz_085.spv b/third_party/vulkan-deps/spirv-tools/src/test/fuzzers/corpora/spv/graphicsfuzz_085.spv
new file mode 100644
index 0000000..5f5fc03
--- /dev/null
+++ b/third_party/vulkan-deps/spirv-tools/src/test/fuzzers/corpora/spv/graphicsfuzz_085.spv
Binary files differ
diff --git a/third_party/vulkan-deps/spirv-tools/src/test/fuzzers/corpora/spv/graphicsfuzz_086.spv b/third_party/vulkan-deps/spirv-tools/src/test/fuzzers/corpora/spv/graphicsfuzz_086.spv
new file mode 100644
index 0000000..a311992
--- /dev/null
+++ b/third_party/vulkan-deps/spirv-tools/src/test/fuzzers/corpora/spv/graphicsfuzz_086.spv
Binary files differ
diff --git a/third_party/vulkan-deps/spirv-tools/src/test/lint/CMakeLists.txt b/third_party/vulkan-deps/spirv-tools/src/test/lint/CMakeLists.txt
new file mode 100644
index 0000000..09bc6d3
--- /dev/null
+++ b/third_party/vulkan-deps/spirv-tools/src/test/lint/CMakeLists.txt
@@ -0,0 +1,18 @@
+# Copyright (c) 2021 Google LLC.
+#
+# 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.
+
+add_spvtools_unittest(TARGET lint
+  SRCS divergence_analysis_test.cpp
+  LIBS SPIRV-Tools-lint SPIRV-Tools-opt
+)
diff --git a/third_party/vulkan-deps/spirv-tools/src/test/lint/divergence_analysis_test.cpp b/third_party/vulkan-deps/spirv-tools/src/test/lint/divergence_analysis_test.cpp
new file mode 100644
index 0000000..36cd32d
--- /dev/null
+++ b/third_party/vulkan-deps/spirv-tools/src/test/lint/divergence_analysis_test.cpp
@@ -0,0 +1,700 @@
+// Copyright (c) 2021 Google LLC.
+//
+// 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.
+
+#include "source/lint/divergence_analysis.h"
+
+#include <string>
+
+#include "gtest/gtest.h"
+#include "source/opt/build_module.h"
+#include "source/opt/ir_context.h"
+#include "source/opt/module.h"
+#include "spirv-tools/libspirv.h"
+
+namespace spvtools {
+namespace lint {
+namespace {
+
+void CLIMessageConsumer(spv_message_level_t level, const char*,
+                        const spv_position_t& position, const char* message) {
+  switch (level) {
+    case SPV_MSG_FATAL:
+    case SPV_MSG_INTERNAL_ERROR:
+    case SPV_MSG_ERROR:
+      std::cerr << "error: line " << position.index << ": " << message
+                << std::endl;
+      break;
+    case SPV_MSG_WARNING:
+      std::cout << "warning: line " << position.index << ": " << message
+                << std::endl;
+      break;
+    case SPV_MSG_INFO:
+      std::cout << "info: line " << position.index << ": " << message
+                << std::endl;
+      break;
+    default:
+      break;
+  }
+}
+
+class DivergenceTest : public ::testing::Test {
+ protected:
+  std::unique_ptr<opt::IRContext> context_;
+  std::unique_ptr<DivergenceAnalysis> divergence_;
+
+  void Build(std::string text, uint32_t function_id = 1) {
+    context_ = BuildModule(SPV_ENV_UNIVERSAL_1_0, CLIMessageConsumer, text,
+                           SPV_TEXT_TO_BINARY_OPTION_PRESERVE_NUMERIC_IDS);
+    ASSERT_NE(nullptr, context_.get());
+    opt::Module* module = context_->module();
+    ASSERT_NE(nullptr, module);
+    // First function should have the given ID.
+    ASSERT_NE(module->begin(), module->end());
+    opt::Function* function = &*module->begin();
+    ASSERT_EQ(function->result_id(), function_id);
+    divergence_.reset(new DivergenceAnalysis(*context_));
+    divergence_->Run(function);
+  }
+};
+
+// Makes assertions a bit shorter.
+using Level = DivergenceAnalysis::DivergenceLevel;
+
+namespace {
+std::string Preamble() {
+  return R"(
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %1 "main" %x %y
+	       OpExecutionMode %1 OriginLowerLeft
+               OpDecorate %y Flat
+       %void = OpTypeVoid
+     %void_f = OpTypeFunction %void
+       %bool = OpTypeBool
+      %float = OpTypeFloat 32
+      %false = OpConstantFalse %bool
+       %true = OpConstantTrue %bool
+       %zero = OpConstant %float 0
+        %one = OpConstant %float 1
+        %x_t = OpTypePointer Input %float
+          %x = OpVariable %x_t Input
+          %y = OpVariable %x_t Input
+          %1 = OpFunction %void None %void_f
+  )";
+}
+}  // namespace
+
+TEST_F(DivergenceTest, SimpleTest) {
+  // pseudocode:
+  //     %10:
+  //     %11 = load x
+  //     if (%12 = (%11 < 0)) {
+  //       %13:
+  //       // do nothing
+  //     }
+  //     %14:
+  //     return
+  ASSERT_NO_FATAL_FAILURE(Build(Preamble() + R"(
+         %10 = OpLabel
+         %11 = OpLoad %float %x
+         %12 = OpFOrdLessThan %bool %11 %zero
+               OpSelectionMerge %14 None
+               OpBranchConditional %12 %13 %14
+         %13 = OpLabel
+               OpBranch %14
+         %14 = OpLabel
+               OpReturn
+               OpFunctionEnd
+  )"));
+  // Control flow divergence.
+  EXPECT_EQ(Level::kUniform, divergence_->GetDivergenceLevel(10));
+  EXPECT_EQ(Level::kDivergent, divergence_->GetDivergenceLevel(13));
+  EXPECT_EQ(12, divergence_->GetDivergenceSource(13));
+  EXPECT_EQ(Level::kUniform, divergence_->GetDivergenceLevel(14));
+  // Value divergence.
+  EXPECT_EQ(Level::kDivergent, divergence_->GetDivergenceLevel(11));
+  EXPECT_EQ(0, divergence_->GetDivergenceSource(11));
+  EXPECT_EQ(Level::kDivergent, divergence_->GetDivergenceLevel(12));
+  EXPECT_EQ(11, divergence_->GetDivergenceSource(12));
+}
+
+TEST_F(DivergenceTest, FlowTypesTest) {
+  // pseudocode:
+  //   %10:
+  //   %11 = load x
+  //   %12 = x < 0 // data -> data
+  //   if (%12) {
+  //     %13: // data -> control
+  //     if (true) {
+  //       %14: // control -> control
+  //     }
+  //     %15:
+  //     %16 = 1
+  //   } else {
+  //     %17:
+  //     %18 = 2
+  //   }
+  //   %19:
+  //   %19 = phi(%16 from %15, %18 from %17) // control -> data
+  //   return
+  ASSERT_NO_FATAL_FAILURE(Build(Preamble() + R"(
+         %10 = OpLabel
+         %11 = OpLoad %float %x
+         %12 = OpFOrdLessThan %bool %11 %zero
+               OpSelectionMerge %19 None
+               OpBranchConditional %12 %13 %17
+         %13 = OpLabel
+               OpSelectionMerge %15 None
+               OpBranchConditional %true %14 %15
+         %14 = OpLabel
+               OpBranch %15
+         %15 = OpLabel
+         %16 = OpFAdd %float %zero %zero
+               OpBranch %19
+         %17 = OpLabel
+         %18 = OpFAdd %float %zero %one
+               OpBranch %19
+         %19 = OpLabel
+         %20 = OpPhi %float %16 %15 %18 %17
+               OpReturn
+               OpFunctionEnd
+  )"));
+  EXPECT_EQ(Level::kUniform, divergence_->GetDivergenceLevel(10));
+
+  EXPECT_EQ(Level::kDivergent, divergence_->GetDivergenceLevel(11));
+  EXPECT_EQ(0, divergence_->GetDivergenceSource(11));
+
+  EXPECT_EQ(Level::kDivergent, divergence_->GetDivergenceLevel(12));
+  EXPECT_EQ(11, divergence_->GetDivergenceSource(12));
+
+  EXPECT_EQ(Level::kDivergent, divergence_->GetDivergenceLevel(13));
+  EXPECT_EQ(12, divergence_->GetDivergenceSource(13));
+  EXPECT_EQ(10, divergence_->GetDivergenceDependenceSource(13));
+
+  EXPECT_EQ(Level::kDivergent, divergence_->GetDivergenceLevel(14));
+  EXPECT_EQ(13, divergence_->GetDivergenceSource(14));
+
+  EXPECT_EQ(Level::kDivergent, divergence_->GetDivergenceLevel(15));
+  EXPECT_EQ(12, divergence_->GetDivergenceSource(15));
+  EXPECT_EQ(10, divergence_->GetDivergenceDependenceSource(15));
+
+  EXPECT_EQ(Level::kUniform, divergence_->GetDivergenceLevel(16));
+
+  EXPECT_EQ(Level::kDivergent, divergence_->GetDivergenceLevel(17));
+  EXPECT_EQ(12, divergence_->GetDivergenceSource(17));
+  EXPECT_EQ(10, divergence_->GetDivergenceDependenceSource(17));
+
+  EXPECT_EQ(Level::kUniform, divergence_->GetDivergenceLevel(18));
+
+  EXPECT_EQ(Level::kUniform, divergence_->GetDivergenceLevel(19));
+
+  EXPECT_EQ(Level::kDivergent, divergence_->GetDivergenceLevel(20));
+  EXPECT_TRUE(divergence_->GetDivergenceSource(20) == 15 ||
+              divergence_->GetDivergenceDependenceSource(20) == 17)
+      << "Got: " << divergence_->GetDivergenceDependenceSource(20);
+}
+
+TEST_F(DivergenceTest, ExitDependenceTest) {
+  // pseudocode:
+  //   %10:
+  //   %11 = load x
+  //   %12 = %11 < 0
+  //   %13:
+  //   do {
+  //     %14:
+  //     if (%12) {
+  //       %15:
+  //       continue;
+  //     }
+  //     %16:
+  //     %17:
+  //     continue;
+  //   } %18: while(false);
+  //   %19:
+  //   return
+  ASSERT_NO_FATAL_FAILURE(Build(Preamble() + R"(
+         %10 = OpLabel
+         %11 = OpLoad %float %x
+         %12 = OpFOrdLessThan %bool %11 %zero ; data -> data
+               OpBranch %13
+         %13 = OpLabel
+               OpLoopMerge %19 %18 None
+               OpBranch %14
+         %14 = OpLabel
+               OpSelectionMerge %16 None
+               OpBranchConditional %12 %15 %16
+         %15 = OpLabel
+               OpBranch %18  ; continue
+         %16 = OpLabel
+               OpBranch %17
+         %17 = OpLabel
+               OpBranch %18  ; continue
+         %18 = OpLabel
+               OpBranchConditional %false %13 %19
+         %19 = OpLabel
+               OpReturn
+               OpFunctionEnd
+  )"));
+
+  EXPECT_EQ(Level::kUniform, divergence_->GetDivergenceLevel(10));
+
+  EXPECT_EQ(Level::kDivergent, divergence_->GetDivergenceLevel(11));
+  EXPECT_EQ(0, divergence_->GetDivergenceSource(11));
+
+  EXPECT_EQ(Level::kDivergent, divergence_->GetDivergenceLevel(12));
+  EXPECT_EQ(11, divergence_->GetDivergenceSource(12));
+
+  // Since both branches continue, there's no divergent control dependence
+  // to 13.
+  EXPECT_EQ(Level::kUniform, divergence_->GetDivergenceLevel(13));
+
+  EXPECT_EQ(Level::kUniform, divergence_->GetDivergenceLevel(14));
+
+  EXPECT_EQ(Level::kDivergent, divergence_->GetDivergenceLevel(15));
+  EXPECT_EQ(12, divergence_->GetDivergenceSource(15));
+  EXPECT_EQ(14, divergence_->GetDivergenceDependenceSource(15));
+
+  // These two blocks are outside the if but are still control dependent.
+  EXPECT_EQ(Level::kDivergent, divergence_->GetDivergenceLevel(16));
+  EXPECT_EQ(12, divergence_->GetDivergenceSource(16));
+  EXPECT_EQ(14, divergence_->GetDivergenceDependenceSource(16));
+  EXPECT_EQ(Level::kDivergent, divergence_->GetDivergenceLevel(17));
+  EXPECT_EQ(12, divergence_->GetDivergenceSource(17));
+  EXPECT_EQ(14, divergence_->GetDivergenceDependenceSource(17));
+
+  EXPECT_EQ(Level::kUniform, divergence_->GetDivergenceLevel(18));
+
+  EXPECT_EQ(Level::kUniform, divergence_->GetDivergenceLevel(19));
+}
+
+TEST_F(DivergenceTest, ReconvergencePromotionTest) {
+  // pseudocode:
+  // %10:
+  // %11 = load y
+  // %12 = %11 < 0
+  // if (%12) {
+  //   %13:
+  //   %14:
+  //   %15:
+  //   if (true) {
+  //     %16:
+  //   }
+  //   // Reconvergence *not* guaranteed as
+  //   // control is not uniform on the IG level
+  //   // at %15.
+  //   %17:
+  //   %18:
+  //   %19:
+  //   %20 = load x
+  // }
+  // %21:
+  // %22 = phi(%11, %20)
+  // return
+  ASSERT_NO_FATAL_FAILURE(Build(Preamble() + R"(
+         %10 = OpLabel
+         %11 = OpLoad %float %y
+         %12 = OpFOrdLessThan %bool %11 %zero
+               OpSelectionMerge %21 None
+               OpBranchConditional %12 %13 %21
+         %13 = OpLabel
+               OpBranch %14
+         %14 = OpLabel
+               OpBranch %15
+         %15 = OpLabel
+               OpSelectionMerge %17 None
+               OpBranchConditional %true %16 %17
+         %16 = OpLabel
+               OpBranch %17
+         %17 = OpLabel
+               OpBranch %18
+         %18 = OpLabel
+               OpBranch %19
+         %19 = OpLabel
+         %20 = OpLoad %float %y
+               OpBranch %21
+         %21 = OpLabel
+         %22 = OpPhi %float %11 %10 %20 %19
+               OpReturn
+               OpFunctionEnd
+  )"));
+  ASSERT_EQ(Level::kUniform, divergence_->GetDivergenceLevel(10));
+  ASSERT_EQ(Level::kUniform, divergence_->GetDivergenceLevel(21));
+
+  ASSERT_EQ(Level::kPartiallyUniform, divergence_->GetDivergenceLevel(11));
+  ASSERT_EQ(0, divergence_->GetDivergenceSource(11));
+  ASSERT_EQ(Level::kPartiallyUniform, divergence_->GetDivergenceLevel(12));
+  ASSERT_EQ(11, divergence_->GetDivergenceSource(12));
+  ASSERT_EQ(Level::kPartiallyUniform, divergence_->GetDivergenceLevel(13));
+  ASSERT_EQ(12, divergence_->GetDivergenceSource(13));
+  ASSERT_EQ(10, divergence_->GetDivergenceDependenceSource(13));
+  ASSERT_EQ(Level::kPartiallyUniform, divergence_->GetDivergenceLevel(14));
+  ASSERT_EQ(12, divergence_->GetDivergenceSource(14));
+  ASSERT_EQ(10, divergence_->GetDivergenceDependenceSource(14));
+  ASSERT_EQ(Level::kPartiallyUniform, divergence_->GetDivergenceLevel(15));
+  ASSERT_EQ(12, divergence_->GetDivergenceSource(15));
+  ASSERT_EQ(10, divergence_->GetDivergenceDependenceSource(15));
+  ASSERT_EQ(Level::kPartiallyUniform, divergence_->GetDivergenceLevel(16));
+  ASSERT_EQ(15, divergence_->GetDivergenceSource(16));
+
+  ASSERT_EQ(Level::kDivergent, divergence_->GetDivergenceLevel(17));
+  ASSERT_EQ(12, divergence_->GetDivergenceSource(17));
+  ASSERT_EQ(Level::kDivergent, divergence_->GetDivergenceLevel(18));
+  ASSERT_EQ(12, divergence_->GetDivergenceSource(18));
+  ASSERT_EQ(Level::kDivergent, divergence_->GetDivergenceLevel(19));
+  ASSERT_EQ(12, divergence_->GetDivergenceSource(19));
+
+  ASSERT_EQ(Level::kPartiallyUniform, divergence_->GetDivergenceLevel(20));
+  ASSERT_EQ(0, divergence_->GetDivergenceSource(20));
+  ASSERT_EQ(Level::kDivergent, divergence_->GetDivergenceLevel(22));
+  ASSERT_EQ(19, divergence_->GetDivergenceSource(22));
+  ASSERT_EQ(10, divergence_->GetDivergenceDependenceSource(15));
+}
+
+TEST_F(DivergenceTest, FunctionCallTest) {
+  // pseudocode:
+  // %2() {
+  //   %20:
+  //   %21 = load x
+  //   %22 = %21 < 0
+  //   if (%22) {
+  //     %23:
+  //     return
+  //   }
+  //   %24:
+  //   return
+  // }
+  //
+  // main() {
+  //   %10:
+  //   %11 = %2();
+  //   // Reconvergence *not* guaranteed.
+  //   %12:
+  //   return
+  // }
+  ASSERT_NO_FATAL_FAILURE(Build(Preamble() + R"(
+         %10 = OpLabel
+         %11 = OpFunctionCall %void %2
+               OpBranch %12
+         %12 = OpLabel
+               OpReturn
+               OpFunctionEnd
+
+          %2 = OpFunction %void None %void_f
+         %20 = OpLabel
+         %21 = OpLoad %float %x
+         %22 = OpFOrdLessThan %bool %21 %zero
+               OpSelectionMerge %24 None
+               OpBranchConditional %22 %23 %24
+         %23 = OpLabel
+               OpReturn
+         %24 = OpLabel
+               OpReturn
+               OpFunctionEnd
+  )"));
+
+  EXPECT_EQ(Level::kUniform, divergence_->GetDivergenceLevel(10));
+  // Conservatively assume function return value is uniform.
+  EXPECT_EQ(Level::kUniform, divergence_->GetDivergenceLevel(11));
+  // TODO(dongja): blocks reachable from diverging function calls should be
+  // divergent.
+  // EXPECT_EQ(Level::kDivergent, divergence_->GetDivergenceLevel(12));
+  EXPECT_EQ(Level::kUniform, divergence_->GetDivergenceLevel(12));  // Wrong!
+}
+
+TEST_F(DivergenceTest, LateMergeTest) {
+  // pseudocode:
+  // %10:
+  // %11 = load y
+  // %12 = %11 < 0
+  // [merge: %15]
+  // if (%12) {
+  //   %13:
+  // }
+  // %14: // Reconvergence hasn't happened by here.
+  // %15:
+  // return
+  ASSERT_NO_FATAL_FAILURE(Build(Preamble() + R"(
+         %10 = OpLabel
+         %11 = OpLoad %float %x
+         %12 = OpFOrdLessThan %bool %11 %zero
+               OpSelectionMerge %15 None
+               OpBranchConditional %12 %13 %14
+         %13 = OpLabel
+               OpBranch %14
+         %14 = OpLabel
+               OpBranch %15
+         %15 = OpLabel
+               OpReturn
+               OpFunctionEnd
+  )"));
+
+  EXPECT_EQ(Level::kUniform, divergence_->GetDivergenceLevel(10));
+  EXPECT_EQ(Level::kDivergent, divergence_->GetDivergenceLevel(11));
+  EXPECT_EQ(Level::kDivergent, divergence_->GetDivergenceLevel(12));
+  EXPECT_EQ(Level::kDivergent, divergence_->GetDivergenceLevel(13));
+  // TODO(dongja):
+  // EXPECT_EQ(Level::kDivergent, divergence_->GetDivergenceLevel(14));
+  EXPECT_EQ(Level::kUniform, divergence_->GetDivergenceLevel(14));  // Wrong!
+  EXPECT_EQ(Level::kUniform, divergence_->GetDivergenceLevel(15));
+}
+
+// The following series of tests makes sure that we find the least fixpoint.
+TEST_F(DivergenceTest, UniformFixpointTest) {
+  // pseudocode:
+  //   %10:
+  //   %20 = load x
+  //   %21 = load y
+  //   do {
+  //     %11:
+  //     %12:
+  //     %13 = phi(%zero from %11, %14 from %16)
+  //     %14 = %13 + 1
+  //     %15 = %13 < 1
+  //   } %16: while (%15)
+  //   %17:
+  ASSERT_NO_FATAL_FAILURE(Build(Preamble() + R"(
+         %10 = OpLabel
+         %20 = OpLoad %float %x
+         %21 = OpLoad %float %y
+               OpBranch %11
+         %11 = OpLabel
+         %13 = OpPhi %float %zero %10 %14 %16
+               OpLoopMerge %17 %16 None
+               OpBranch %12
+         %12 = OpLabel
+         %14 = OpFAdd %float %13 %one
+         %15 = OpFOrdLessThan %bool %13 %one
+               OpBranch %16
+         %16 = OpLabel
+               OpBranchConditional %15 %11 %17
+         %17 = OpLabel
+               OpReturn
+               OpFunctionEnd
+  )"));
+
+  EXPECT_EQ(Level::kUniform, divergence_->GetDivergenceLevel(10));
+  EXPECT_EQ(Level::kUniform, divergence_->GetDivergenceLevel(11));
+  EXPECT_EQ(Level::kUniform, divergence_->GetDivergenceLevel(12));
+  EXPECT_EQ(Level::kUniform, divergence_->GetDivergenceLevel(13));
+  EXPECT_EQ(Level::kUniform, divergence_->GetDivergenceLevel(14));
+  EXPECT_EQ(Level::kUniform, divergence_->GetDivergenceLevel(15));
+  EXPECT_EQ(Level::kUniform, divergence_->GetDivergenceLevel(16));
+  EXPECT_EQ(Level::kUniform, divergence_->GetDivergenceLevel(17));
+}
+
+TEST_F(DivergenceTest, PartiallyUniformFixpointTest) {
+  // pseudocode:
+  //   %10:
+  //   %20 = load x
+  //   %21 = load y
+  //   do {
+  //     %11:
+  //     %12:
+  //     %13 = phi(%zero from %11, %14 from %16)
+  //     %14 = %13 + 1
+  //     %15 = %13 < %21
+  //   } %16: while (%15)
+  //   %17:
+  ASSERT_NO_FATAL_FAILURE(Build(Preamble() + R"(
+         %10 = OpLabel
+         %20 = OpLoad %float %x
+         %21 = OpLoad %float %y
+               OpBranch %11
+         %11 = OpLabel
+         %13 = OpPhi %float %zero %10 %14 %16
+               OpLoopMerge %17 %16 None
+               OpBranch %12
+         %12 = OpLabel
+         %14 = OpFAdd %float %13 %one
+         %15 = OpFOrdLessThan %bool %13 %21
+               OpBranch %16
+         %16 = OpLabel
+               OpBranchConditional %15 %11 %17
+         %17 = OpLabel
+               OpReturn
+               OpFunctionEnd
+  )"));
+
+  EXPECT_EQ(Level::kUniform, divergence_->GetDivergenceLevel(10));
+  EXPECT_EQ(Level::kPartiallyUniform, divergence_->GetDivergenceLevel(11));
+  EXPECT_EQ(Level::kPartiallyUniform, divergence_->GetDivergenceLevel(12));
+  EXPECT_EQ(Level::kPartiallyUniform, divergence_->GetDivergenceLevel(13));
+  EXPECT_EQ(Level::kPartiallyUniform, divergence_->GetDivergenceLevel(14));
+  EXPECT_EQ(Level::kPartiallyUniform, divergence_->GetDivergenceLevel(15));
+  EXPECT_EQ(Level::kPartiallyUniform, divergence_->GetDivergenceLevel(16));
+  EXPECT_EQ(Level::kUniform, divergence_->GetDivergenceLevel(17));
+}
+
+TEST_F(DivergenceTest, DivergentFixpointTest) {
+  // pseudocode:
+  //   %10:
+  //   %20 = load x
+  //   %21 = load y
+  //   do {
+  //     %11:
+  //     %12:
+  //     %13 = phi(%zero from %11, %14 from %16)
+  //     %14 = %13 + 1
+  //     %15 = %13 < %20
+  //   } %16: while (%15)
+  //   %17:
+  ASSERT_NO_FATAL_FAILURE(Build(Preamble() + R"(
+         %10 = OpLabel
+         %20 = OpLoad %float %x
+         %21 = OpLoad %float %y
+               OpBranch %11
+         %11 = OpLabel
+         %13 = OpPhi %float %zero %10 %14 %16
+               OpLoopMerge %17 %16 None
+               OpBranch %12
+         %12 = OpLabel
+         %14 = OpFAdd %float %13 %one
+         %15 = OpFOrdLessThan %bool %13 %20
+               OpBranch %16
+         %16 = OpLabel
+               OpBranchConditional %15 %11 %17
+         %17 = OpLabel
+               OpReturn
+               OpFunctionEnd
+  )"));
+
+  EXPECT_EQ(Level::kUniform, divergence_->GetDivergenceLevel(10));
+  EXPECT_EQ(Level::kDivergent, divergence_->GetDivergenceLevel(11));
+  EXPECT_EQ(Level::kDivergent, divergence_->GetDivergenceLevel(12));
+  EXPECT_EQ(Level::kDivergent, divergence_->GetDivergenceLevel(13));
+  EXPECT_EQ(Level::kDivergent, divergence_->GetDivergenceLevel(14));
+  EXPECT_EQ(Level::kDivergent, divergence_->GetDivergenceLevel(15));
+  EXPECT_EQ(Level::kDivergent, divergence_->GetDivergenceLevel(16));
+  EXPECT_EQ(Level::kUniform, divergence_->GetDivergenceLevel(17));
+}
+
+TEST_F(DivergenceTest, DivergentOverridesPartiallyUniformTest) {
+  // pseudocode:
+  //   %10:
+  //   %20 = load x
+  //   %21 = load y
+  //   %11:
+  //   do {
+  //     %12:
+  //     %13 = phi(%21 from %11, %14 from %16)
+  //     %14 = %13 + 1
+  //     %15 = %13 < %20
+  //   } %16: while (%15)
+  //   %17:
+  ASSERT_NO_FATAL_FAILURE(Build(Preamble() + R"(
+         %10 = OpLabel
+         %20 = OpLoad %float %x
+         %21 = OpLoad %float %y
+               OpBranch %11
+         %11 = OpLabel
+         %13 = OpPhi %float %zero %10 %14 %16
+               OpLoopMerge %17 %16 None
+               OpBranch %12
+         %12 = OpLabel
+         %14 = OpFAdd %float %13 %one
+         %15 = OpFOrdLessThan %bool %13 %20
+               OpBranch %16
+         %16 = OpLabel
+               OpBranchConditional %15 %11 %17
+         %17 = OpLabel
+               OpReturn
+               OpFunctionEnd
+  )"));
+
+  EXPECT_EQ(Level::kUniform, divergence_->GetDivergenceLevel(10));
+  EXPECT_EQ(Level::kDivergent, divergence_->GetDivergenceLevel(11));
+  EXPECT_EQ(Level::kDivergent, divergence_->GetDivergenceLevel(12));
+  EXPECT_EQ(Level::kDivergent, divergence_->GetDivergenceLevel(13));
+  EXPECT_EQ(Level::kDivergent, divergence_->GetDivergenceLevel(14));
+  EXPECT_EQ(Level::kDivergent, divergence_->GetDivergenceLevel(15));
+  EXPECT_EQ(Level::kDivergent, divergence_->GetDivergenceLevel(16));
+  EXPECT_EQ(Level::kUniform, divergence_->GetDivergenceLevel(17));
+}
+
+TEST_F(DivergenceTest, NestedFixpointTest) {
+  // pseudocode:
+  //   %10:
+  //   %20 = load x
+  //   %21 = load y
+  //   do {
+  //     %22:
+  //     %23:
+  //     %24 = phi(%zero from %22, %25 from %26)
+  //     %11:
+  //     do {
+  //       %12:
+  //       %13 = phi(%zero from %11, %14 from %16)
+  //       %14 = %13 + 1
+  //       %15 = %13 < %24
+  //     } %16: while (%15)
+  //     %17:
+  //     %25 = load x
+  //   } %26: while (false)
+  //   %27:
+  //   return
+  ASSERT_NO_FATAL_FAILURE(Build(Preamble() + R"(
+         %10 = OpLabel
+         %20 = OpLoad %float %x
+         %21 = OpLoad %float %y
+               OpBranch %22
+         %22 = OpLabel
+         %24 = OpPhi %float %zero %10 %25 %26
+               OpLoopMerge %27 %26 None
+               OpBranch %23
+         %23 = OpLabel
+               OpBranch %11
+         %11 = OpLabel
+         %13 = OpPhi %float %zero %23 %14 %16
+               OpLoopMerge %17 %16 None
+               OpBranch %12
+         %12 = OpLabel
+         %14 = OpFAdd %float %13 %one
+         %15 = OpFOrdLessThan %bool %13 %24
+               OpBranch %16
+         %16 = OpLabel
+               OpBranchConditional %15 %11 %17
+         %17 = OpLabel
+         %25 = OpLoad %float %x
+               OpBranch %26
+         %26 = OpLabel
+               OpBranchConditional %false %22 %27
+         %27 = OpLabel
+               OpReturn
+               OpFunctionEnd
+  )"));
+  // This test makes sure that divergent values flowing upward can influence the
+  // fixpoint of a loop.
+  EXPECT_EQ(Level::kUniform, divergence_->GetDivergenceLevel(10));
+  EXPECT_EQ(Level::kDivergent, divergence_->GetDivergenceLevel(11));
+  EXPECT_EQ(Level::kDivergent, divergence_->GetDivergenceLevel(12));
+  EXPECT_EQ(Level::kDivergent, divergence_->GetDivergenceLevel(13));
+  EXPECT_EQ(Level::kDivergent, divergence_->GetDivergenceLevel(14));
+  EXPECT_EQ(Level::kDivergent, divergence_->GetDivergenceLevel(15));
+  EXPECT_EQ(Level::kDivergent, divergence_->GetDivergenceLevel(16));
+  // Control of the outer loop is still uniform.
+  EXPECT_EQ(Level::kUniform, divergence_->GetDivergenceLevel(17));
+  EXPECT_EQ(Level::kUniform, divergence_->GetDivergenceLevel(22));
+  EXPECT_EQ(Level::kUniform, divergence_->GetDivergenceLevel(23));
+  // Seed divergent values.
+  EXPECT_EQ(Level::kDivergent, divergence_->GetDivergenceLevel(24));
+  EXPECT_EQ(Level::kDivergent, divergence_->GetDivergenceLevel(25));
+  // Outer loop control.
+  EXPECT_EQ(Level::kUniform, divergence_->GetDivergenceLevel(26));
+  // Merged.
+  EXPECT_EQ(Level::kUniform, divergence_->GetDivergenceLevel(27));
+}
+
+}  // namespace
+}  // namespace lint
+}  // namespace spvtools
diff --git a/third_party/vulkan-deps/spirv-tools/src/test/opt/CMakeLists.txt b/third_party/vulkan-deps/spirv-tools/src/test/opt/CMakeLists.txt
index 621a6aa..1129975 100644
--- a/third_party/vulkan-deps/spirv-tools/src/test/opt/CMakeLists.txt
+++ b/third_party/vulkan-deps/spirv-tools/src/test/opt/CMakeLists.txt
@@ -28,8 +28,11 @@
        compact_ids_test.cpp
        constants_test.cpp
        constant_manager_test.cpp
+       control_dependence.cpp
        convert_relaxed_to_half_test.cpp
+       convert_to_sampled_image_test.cpp
        copy_prop_array_test.cpp
+       dataflow.cpp
        dead_branch_elim_test.cpp
        dead_insert_elim_test.cpp
        dead_variable_elim_test.cpp
diff --git a/third_party/vulkan-deps/spirv-tools/src/test/opt/aggressive_dead_code_elim_test.cpp b/third_party/vulkan-deps/spirv-tools/src/test/opt/aggressive_dead_code_elim_test.cpp
index 5b4291d..d2581ea 100644
--- a/third_party/vulkan-deps/spirv-tools/src/test/opt/aggressive_dead_code_elim_test.cpp
+++ b/third_party/vulkan-deps/spirv-tools/src/test/opt/aggressive_dead_code_elim_test.cpp
@@ -7584,6 +7584,111 @@
   SinglePassRunAndMatch<AggressiveDCEPass>(text, true);
 }
 
+TEST_F(AggressiveDCETest, KeepExportFunctions) {
+  // All functions are reachable.  In particular, ExportedFunc and Constant are
+  // reachable because ExportedFunc is exported.  Nothing should be removed.
+  const std::vector<const char*> text = {
+      // clang-format off
+               "OpCapability Shader",
+               "OpCapability Linkage",
+               "OpMemoryModel Logical GLSL450",
+               "OpEntryPoint Fragment %main \"main\"",
+               "OpName %main \"main\"",
+               "OpName %ExportedFunc \"ExportedFunc\"",
+               "OpName %Live \"Live\"",
+               "OpDecorate %ExportedFunc LinkageAttributes \"ExportedFunc\" Export",
+       "%void = OpTypeVoid",
+          "%7 = OpTypeFunction %void",
+       "%main = OpFunction %void None %7",
+         "%15 = OpLabel",
+               "OpReturn",
+               "OpFunctionEnd",
+"%ExportedFunc = OpFunction %void None %7",
+         "%19 = OpLabel",
+         "%16 = OpFunctionCall %void %Live",
+               "OpReturn",
+               "OpFunctionEnd",
+  "%Live = OpFunction %void None %7",
+         "%20 = OpLabel",
+               "OpReturn",
+               "OpFunctionEnd"
+      // clang-format on
+  };
+
+  SetAssembleOptions(SPV_TEXT_TO_BINARY_OPTION_PRESERVE_NUMERIC_IDS);
+  std::string assembly = JoinAllInsts(text);
+  auto result = SinglePassRunAndDisassemble<AggressiveDCEPass>(
+      assembly, /* skip_nop = */ true, /* do_validation = */ false);
+  EXPECT_EQ(Pass::Status::SuccessWithoutChange, std::get<1>(result));
+  EXPECT_EQ(assembly, std::get<0>(result));
+}
+
+TEST_F(AggressiveDCETest, KeepPrivateVarInExportFunctions) {
+  // The loads and stores from the private variable should not be removed
+  // because the functions are exported and could be called.
+  const std::string text = R"(OpCapability Shader
+OpCapability Linkage
+OpMemoryModel Logical GLSL450
+OpSource HLSL 630
+OpName %privateVar "privateVar"
+OpName %ReadPrivate "ReadPrivate"
+OpName %WritePrivate "WritePrivate"
+OpName %value "value"
+OpDecorate %ReadPrivate LinkageAttributes "ReadPrivate" Export
+OpDecorate %WritePrivate LinkageAttributes "WritePrivate" Export
+%int = OpTypeInt 32 1
+%_ptr_Private_int = OpTypePointer Private %int
+%6 = OpTypeFunction %int
+%void = OpTypeVoid
+%_ptr_Function_int = OpTypePointer Function %int
+%10 = OpTypeFunction %void %_ptr_Function_int
+%privateVar = OpVariable %_ptr_Private_int Private
+%ReadPrivate = OpFunction %int None %6
+%12 = OpLabel
+%8 = OpLoad %int %privateVar
+OpReturnValue %8
+OpFunctionEnd
+%WritePrivate = OpFunction %void None %10
+%value = OpFunctionParameter %_ptr_Function_int
+%13 = OpLabel
+%14 = OpLoad %int %value
+OpStore %privateVar %14
+OpReturn
+OpFunctionEnd
+)";
+
+  SetAssembleOptions(SPV_TEXT_TO_BINARY_OPTION_PRESERVE_NUMERIC_IDS);
+  auto result = SinglePassRunAndDisassemble<AggressiveDCEPass>(
+      text, /* skip_nop = */ true, /* do_validation = */ false);
+  EXPECT_EQ(Pass::Status::SuccessWithoutChange, std::get<1>(result));
+  EXPECT_EQ(text, std::get<0>(result));
+}
+
+TEST_F(AggressiveDCETest, KeepLableNames) {
+  const std::string text = R"(OpCapability Shader
+OpCapability Linkage
+OpMemoryModel Logical GLSL450
+OpSource HLSL 630
+OpName %WritePrivate "WritePrivate"
+OpName %entry "entry"
+OpName %target "target"
+OpDecorate %WritePrivate LinkageAttributes "WritePrivate" Export
+%void = OpTypeVoid
+%3 = OpTypeFunction %void
+%WritePrivate = OpFunction %void None %3
+%entry = OpLabel
+OpBranch %target
+%target = OpLabel
+OpReturn
+OpFunctionEnd
+)";
+
+  SetAssembleOptions(SPV_TEXT_TO_BINARY_OPTION_PRESERVE_NUMERIC_IDS);
+  auto result = SinglePassRunAndDisassemble<AggressiveDCEPass>(
+      text, /* skip_nop = */ true, /* do_validation = */ false);
+  EXPECT_EQ(Pass::Status::SuccessWithoutChange, std::get<1>(result));
+  EXPECT_EQ(text, std::get<0>(result));
+}
 // TODO(greg-lunarg): Add tests to verify handling of these cases:
 //
 //    Check that logical addressing required
diff --git a/third_party/vulkan-deps/spirv-tools/src/test/opt/control_dependence.cpp b/third_party/vulkan-deps/spirv-tools/src/test/opt/control_dependence.cpp
new file mode 100644
index 0000000..4665547
--- /dev/null
+++ b/third_party/vulkan-deps/spirv-tools/src/test/opt/control_dependence.cpp
@@ -0,0 +1,306 @@
+// Copyright (c) 2021 Google LLC.
+//
+// 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.
+
+#include "source/opt/control_dependence.h"
+
+#include <algorithm>
+#include <vector>
+
+#include "gmock/gmock-matchers.h"
+#include "gtest/gtest.h"
+#include "source/opt/build_module.h"
+#include "source/opt/cfg.h"
+#include "test/opt/function_utils.h"
+
+namespace spvtools {
+namespace opt {
+
+namespace {
+void GatherEdges(const ControlDependenceAnalysis& cdg,
+                 std::vector<ControlDependence>& ret) {
+  cdg.ForEachBlockLabel([&](uint32_t label) {
+    ret.reserve(ret.size() + cdg.GetDependenceTargets(label).size());
+    ret.insert(ret.end(), cdg.GetDependenceTargets(label).begin(),
+               cdg.GetDependenceTargets(label).end());
+  });
+  std::sort(ret.begin(), ret.end());
+  // Verify that reverse graph is the same.
+  std::vector<ControlDependence> reverse_edges;
+  reverse_edges.reserve(ret.size());
+  cdg.ForEachBlockLabel([&](uint32_t label) {
+    reverse_edges.insert(reverse_edges.end(),
+                         cdg.GetDependenceSources(label).begin(),
+                         cdg.GetDependenceSources(label).end());
+  });
+  std::sort(reverse_edges.begin(), reverse_edges.end());
+  ASSERT_THAT(reverse_edges, testing::ElementsAreArray(ret));
+}
+
+using ControlDependenceTest = ::testing::Test;
+
+TEST(ControlDependenceTest, DependenceSimpleCFG) {
+  const std::string text = R"(
+               OpCapability Addresses
+               OpCapability Kernel
+               OpMemoryModel Physical64 OpenCL
+               OpEntryPoint Kernel %1 "main"
+          %2 = OpTypeVoid
+          %3 = OpTypeFunction %2
+          %4 = OpTypeBool
+          %5 = OpTypeInt 32 0
+          %6 = OpConstant %5 0
+          %7 = OpConstantFalse %4
+          %8 = OpConstantTrue %4
+          %9 = OpConstant %5 1
+          %1 = OpFunction %2 None %3
+         %10 = OpLabel
+               OpBranch %11
+         %11 = OpLabel
+               OpSwitch %6 %12 1 %13
+         %12 = OpLabel
+               OpBranch %14
+         %13 = OpLabel
+               OpBranch %14
+         %14 = OpLabel
+               OpBranchConditional %8 %15 %16
+         %15 = OpLabel
+               OpBranch %19
+         %16 = OpLabel
+               OpBranchConditional %8 %17 %18
+         %17 = OpLabel
+               OpBranch %18
+         %18 = OpLabel
+               OpBranch %19
+         %19 = OpLabel
+               OpReturn
+               OpFunctionEnd
+)";
+
+  // CFG: (all edges pointing downward)
+  //   %10
+  //    |
+  //   %11
+  //  /   \ (R: %6 == 1, L: default)
+  // %12 %13
+  //  \   /
+  //   %14
+  // T/   \F
+  // %15  %16
+  //  | T/ |F
+  //  | %17|
+  //  |  \ |
+  //  |   %18
+  //  |  /
+  // %19
+
+  std::unique_ptr<IRContext> context =
+      BuildModule(SPV_ENV_UNIVERSAL_1_0, nullptr, text,
+                  SPV_TEXT_TO_BINARY_OPTION_PRESERVE_NUMERIC_IDS);
+  Module* module = context->module();
+  EXPECT_NE(nullptr, module) << "Assembling failed for shader:\n"
+                             << text << std::endl;
+  const Function* fn = spvtest::GetFunction(module, 1);
+  const BasicBlock* entry = spvtest::GetBasicBlock(fn, 10);
+  EXPECT_EQ(entry, fn->entry().get())
+      << "The entry node is not the expected one";
+
+  {
+    PostDominatorAnalysis pdom;
+    const CFG& cfg = *context->cfg();
+    pdom.InitializeTree(cfg, fn);
+    ControlDependenceAnalysis cdg;
+    cdg.ComputeControlDependenceGraph(cfg, pdom);
+
+    // Test HasBlock.
+    for (uint32_t id = 10; id <= 19; id++) {
+      EXPECT_TRUE(cdg.HasBlock(id));
+    }
+    EXPECT_TRUE(cdg.HasBlock(ControlDependenceAnalysis::kPseudoEntryBlock));
+    // Check blocks before/after valid range.
+    EXPECT_FALSE(cdg.HasBlock(5));
+    EXPECT_FALSE(cdg.HasBlock(25));
+    EXPECT_FALSE(cdg.HasBlock(UINT32_MAX));
+
+    // Test ForEachBlockLabel.
+    std::set<uint32_t> block_labels;
+    cdg.ForEachBlockLabel([&block_labels](uint32_t id) {
+      bool inserted = block_labels.insert(id).second;
+      EXPECT_TRUE(inserted);  // Should have no duplicates.
+    });
+    EXPECT_THAT(block_labels, testing::ElementsAre(0, 10, 11, 12, 13, 14, 15,
+                                                   16, 17, 18, 19));
+
+    {
+      // Test WhileEachBlockLabel.
+      uint32_t iters = 0;
+      EXPECT_TRUE(cdg.WhileEachBlockLabel([&iters](uint32_t) {
+        ++iters;
+        return true;
+      }));
+      EXPECT_EQ((uint32_t)block_labels.size(), iters);
+      iters = 0;
+      EXPECT_FALSE(cdg.WhileEachBlockLabel([&iters](uint32_t) {
+        ++iters;
+        return false;
+      }));
+      EXPECT_EQ(1, iters);
+    }
+
+    // Test IsDependent.
+    EXPECT_TRUE(cdg.IsDependent(12, 11));
+    EXPECT_TRUE(cdg.IsDependent(13, 11));
+    EXPECT_TRUE(cdg.IsDependent(15, 14));
+    EXPECT_TRUE(cdg.IsDependent(16, 14));
+    EXPECT_TRUE(cdg.IsDependent(18, 14));
+    EXPECT_TRUE(cdg.IsDependent(17, 16));
+    EXPECT_TRUE(cdg.IsDependent(10, 0));
+    EXPECT_TRUE(cdg.IsDependent(11, 0));
+    EXPECT_TRUE(cdg.IsDependent(14, 0));
+    EXPECT_TRUE(cdg.IsDependent(19, 0));
+    EXPECT_FALSE(cdg.IsDependent(14, 11));
+    EXPECT_FALSE(cdg.IsDependent(17, 14));
+    EXPECT_FALSE(cdg.IsDependent(19, 14));
+    EXPECT_FALSE(cdg.IsDependent(12, 0));
+
+    // Test GetDependenceSources/Targets.
+    std::vector<ControlDependence> edges;
+    GatherEdges(cdg, edges);
+    EXPECT_THAT(edges,
+                testing::ElementsAre(
+                    ControlDependence(0, 10), ControlDependence(0, 11, 10),
+                    ControlDependence(0, 14, 10), ControlDependence(0, 19, 10),
+                    ControlDependence(11, 12), ControlDependence(11, 13),
+                    ControlDependence(14, 15), ControlDependence(14, 16),
+                    ControlDependence(14, 18, 16), ControlDependence(16, 17)));
+
+    const uint32_t expected_condition_ids[] = {
+        0, 0, 0, 0, 6, 6, 8, 8, 8, 8,
+    };
+
+    for (uint32_t i = 0; i < edges.size(); i++) {
+      EXPECT_EQ(expected_condition_ids[i], edges[i].GetConditionID(cfg));
+    }
+  }
+}
+
+TEST(ControlDependenceTest, DependencePaperCFG) {
+  const std::string text = R"(
+               OpCapability Addresses
+               OpCapability Kernel
+               OpMemoryModel Physical64 OpenCL
+               OpEntryPoint Kernel %101 "main"
+        %102 = OpTypeVoid
+        %103 = OpTypeFunction %102
+        %104 = OpTypeBool
+        %108 = OpConstantTrue %104
+        %101 = OpFunction %102 None %103
+          %1 = OpLabel
+               OpBranch %2
+          %2 = OpLabel
+               OpBranchConditional %108 %3 %7
+          %3 = OpLabel
+               OpBranchConditional %108 %4 %5
+          %4 = OpLabel
+               OpBranch %6
+          %5 = OpLabel
+               OpBranch %6
+          %6 = OpLabel
+               OpBranch %8
+          %7 = OpLabel
+               OpBranch %8
+          %8 = OpLabel
+               OpBranch %9
+          %9 = OpLabel
+               OpBranchConditional %108 %10 %11
+         %10 = OpLabel
+               OpBranch %11
+         %11 = OpLabel
+               OpBranchConditional %108 %12 %9
+         %12 = OpLabel
+               OpBranchConditional %108 %13 %2
+         %13 = OpLabel
+               OpReturn
+               OpFunctionEnd
+)";
+
+  // CFG: (edges pointing downward if no arrow)
+  //         %1
+  //         |
+  //         %2 <----+
+  //       T/  \F    |
+  //      %3    \    |
+  //    T/  \F   \   |
+  //    %4  %5    %7 |
+  //     \  /    /   |
+  //      %6    /    |
+  //        \  /     |
+  //         %8      |
+  //         |       |
+  //         %9 <-+  |
+  //       T/  |  |  |
+  //       %10 |  |  |
+  //        \  |  |  |
+  //         %11-F+  |
+  //         T|      |
+  //         %12-F---+
+  //         T|
+  //         %13
+
+  std::unique_ptr<IRContext> context =
+      BuildModule(SPV_ENV_UNIVERSAL_1_0, nullptr, text,
+                  SPV_TEXT_TO_BINARY_OPTION_PRESERVE_NUMERIC_IDS);
+  Module* module = context->module();
+  EXPECT_NE(nullptr, module) << "Assembling failed for shader:\n"
+                             << text << std::endl;
+  const Function* fn = spvtest::GetFunction(module, 101);
+  const BasicBlock* entry = spvtest::GetBasicBlock(fn, 1);
+  EXPECT_EQ(entry, fn->entry().get())
+      << "The entry node is not the expected one";
+
+  {
+    PostDominatorAnalysis pdom;
+    const CFG& cfg = *context->cfg();
+    pdom.InitializeTree(cfg, fn);
+    ControlDependenceAnalysis cdg;
+    cdg.ComputeControlDependenceGraph(cfg, pdom);
+
+    std::vector<ControlDependence> edges;
+    GatherEdges(cdg, edges);
+    EXPECT_THAT(
+        edges, testing::ElementsAre(
+                   ControlDependence(0, 1), ControlDependence(0, 2, 1),
+                   ControlDependence(0, 8, 1), ControlDependence(0, 9, 1),
+                   ControlDependence(0, 11, 1), ControlDependence(0, 12, 1),
+                   ControlDependence(0, 13, 1), ControlDependence(2, 3),
+                   ControlDependence(2, 6, 3), ControlDependence(2, 7),
+                   ControlDependence(3, 4), ControlDependence(3, 5),
+                   ControlDependence(9, 10), ControlDependence(11, 9),
+                   ControlDependence(11, 11, 9), ControlDependence(12, 2),
+                   ControlDependence(12, 8, 2), ControlDependence(12, 9, 2),
+                   ControlDependence(12, 11, 2), ControlDependence(12, 12, 2)));
+
+    const uint32_t expected_condition_ids[] = {
+        0,   0,   0,   0,   0,   0,   0,   108, 108, 108,
+        108, 108, 108, 108, 108, 108, 108, 108, 108, 108,
+    };
+
+    for (uint32_t i = 0; i < edges.size(); i++) {
+      EXPECT_EQ(expected_condition_ids[i], edges[i].GetConditionID(cfg));
+    }
+  }
+}
+
+}  // namespace
+}  // namespace opt
+}  // namespace spvtools
diff --git a/third_party/vulkan-deps/spirv-tools/src/test/opt/convert_to_sampled_image_test.cpp b/third_party/vulkan-deps/spirv-tools/src/test/opt/convert_to_sampled_image_test.cpp
new file mode 100644
index 0000000..37f6560
--- /dev/null
+++ b/third_party/vulkan-deps/spirv-tools/src/test/opt/convert_to_sampled_image_test.cpp
@@ -0,0 +1,353 @@
+// Copyright (c) 2021 Google LLC
+//
+// 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.
+
+#include <vector>
+
+#include "gmock/gmock.h"
+#include "source/opt/convert_to_sampled_image_pass.h"
+#include "test/opt/pass_fixture.h"
+#include "test/opt/pass_utils.h"
+
+namespace spvtools {
+namespace opt {
+namespace {
+
+using testing::Eq;
+using VectorOfDescriptorSetAndBindingPairs =
+    std::vector<DescriptorSetAndBinding>;
+
+struct DescriptorSetAndBindingStringParsingTestCase {
+  const char* descriptor_set_binding_str;
+  bool expect_success;
+  VectorOfDescriptorSetAndBindingPairs expected_descriptor_set_binding_pairs;
+};
+
+using DescriptorSetAndBindingStringParsingTest =
+    ::testing::TestWithParam<DescriptorSetAndBindingStringParsingTestCase>;
+
+TEST_P(DescriptorSetAndBindingStringParsingTest, TestCase) {
+  const auto& tc = GetParam();
+  auto actual_descriptor_set_binding_pairs =
+      ConvertToSampledImagePass::ParseDescriptorSetBindingPairsString(
+          tc.descriptor_set_binding_str);
+  if (tc.expect_success) {
+    EXPECT_NE(nullptr, actual_descriptor_set_binding_pairs);
+    if (actual_descriptor_set_binding_pairs) {
+      EXPECT_THAT(*actual_descriptor_set_binding_pairs,
+                  Eq(tc.expected_descriptor_set_binding_pairs));
+    }
+  } else {
+    EXPECT_EQ(nullptr, actual_descriptor_set_binding_pairs);
+  }
+}
+
+INSTANTIATE_TEST_SUITE_P(
+    ValidString, DescriptorSetAndBindingStringParsingTest,
+    ::testing::ValuesIn(std::vector<
+                        DescriptorSetAndBindingStringParsingTestCase>{
+        // 0. empty vector
+        {"", true, VectorOfDescriptorSetAndBindingPairs({})},
+        // 1. one pair
+        {"100:1024", true,
+         VectorOfDescriptorSetAndBindingPairs({DescriptorSetAndBinding{100,
+                                                                       1024}})},
+        // 2. two pairs
+        {"100:1024 200:2048", true,
+         VectorOfDescriptorSetAndBindingPairs(
+             {DescriptorSetAndBinding{100, 1024},
+              DescriptorSetAndBinding{200, 2048}})},
+        // 3. spaces between entries
+        {"100:1024 \n \r \t \v \f 200:2048", true,
+         VectorOfDescriptorSetAndBindingPairs(
+             {DescriptorSetAndBinding{100, 1024},
+              DescriptorSetAndBinding{200, 2048}})},
+        // 4. \t, \n, \r and spaces before spec id
+        {"   \n \r\t \t \v \f 100:1024", true,
+         VectorOfDescriptorSetAndBindingPairs({DescriptorSetAndBinding{100,
+                                                                       1024}})},
+        // 5. \t, \n, \r and spaces after value string
+        {"100:1024   \n \r\t \t \v \f ", true,
+         VectorOfDescriptorSetAndBindingPairs({DescriptorSetAndBinding{100,
+                                                                       1024}})},
+        // 6. maximum spec id
+        {"4294967295:0", true,
+         VectorOfDescriptorSetAndBindingPairs({DescriptorSetAndBinding{
+             4294967295, 0}})},
+        // 7. minimum spec id
+        {"0:100", true,
+         VectorOfDescriptorSetAndBindingPairs({DescriptorSetAndBinding{0,
+                                                                       100}})},
+        // 8. multiple entries
+        {"101:1 102:2 103:3 104:4 200:201 9999:1000", true,
+         VectorOfDescriptorSetAndBindingPairs(
+             {DescriptorSetAndBinding{101, 1}, DescriptorSetAndBinding{102, 2},
+              DescriptorSetAndBinding{103, 3}, DescriptorSetAndBinding{104, 4},
+              DescriptorSetAndBinding{200, 201},
+              DescriptorSetAndBinding{9999, 1000}})},
+    }));
+
+INSTANTIATE_TEST_SUITE_P(
+    InvalidString, DescriptorSetAndBindingStringParsingTest,
+    ::testing::ValuesIn(
+        std::vector<DescriptorSetAndBindingStringParsingTestCase>{
+            // 0. missing default value
+            {"100:", false, VectorOfDescriptorSetAndBindingPairs{}},
+            // 1. descriptor set is not an integer
+            {"100.0:200", false, VectorOfDescriptorSetAndBindingPairs{}},
+            // 2. descriptor set is not a number
+            {"something_not_a_number:1", false,
+             VectorOfDescriptorSetAndBindingPairs{}},
+            // 3. only descriptor set number
+            {"100", false, VectorOfDescriptorSetAndBindingPairs{}},
+            // 4. empty descriptor set
+            {":3", false, VectorOfDescriptorSetAndBindingPairs{}},
+            // 5. only colon
+            {":", false, VectorOfDescriptorSetAndBindingPairs{}},
+            // 6. descriptor set overflow
+            {"4294967296:200", false, VectorOfDescriptorSetAndBindingPairs{}},
+            // 7. descriptor set less than 0
+            {"-1:200", false, VectorOfDescriptorSetAndBindingPairs{}},
+            // 8. nullptr
+            {nullptr, false, VectorOfDescriptorSetAndBindingPairs{}},
+            // 9. only a number is invalid
+            {"1234", false, VectorOfDescriptorSetAndBindingPairs{}},
+            // 10. invalid entry separator
+            {"12:34;23:14", false, VectorOfDescriptorSetAndBindingPairs{}},
+            // 11. invalid descriptor set and default value separator
+            {"12@34", false, VectorOfDescriptorSetAndBindingPairs{}},
+            // 12. spaces before colon
+            {"100   :1024", false, VectorOfDescriptorSetAndBindingPairs{}},
+            // 13. spaces after colon
+            {"100:   1024", false, VectorOfDescriptorSetAndBindingPairs{}},
+            // 14. descriptor set represented in hex float format is invalid
+            {"0x3p10:200", false, VectorOfDescriptorSetAndBindingPairs{}},
+        }));
+
+std::string BuildShader(const char* shader_decorate_instructions,
+                        const char* shader_image_and_sampler_variables,
+                        const char* shader_body) {
+  // Base HLSL code:
+  //
+  // SamplerState sam : register(s2);
+  // Texture2D <float4> texture : register(t5);
+  //
+  // float4 main() : SV_TARGET {
+  //     return texture.SampleLevel(sam, float2(1, 2), 10, 2);
+  // }
+  std::stringstream ss;
+  ss << R"(
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %out_var_SV_TARGET
+               OpExecutionMode %main OriginUpperLeft
+               OpSource HLSL 600
+               OpName %type_sampler "type.sampler"
+               OpName %type_2d_image "type.2d.image"
+               OpName %out_var_SV_TARGET "out.var.SV_TARGET"
+               OpName %main "main"
+               OpName %type_sampled_image "type.sampled.image"
+               OpDecorate %out_var_SV_TARGET Location 0
+               )";
+  ss << shader_decorate_instructions;
+  ss << R"(
+      %float = OpTypeFloat 32
+    %float_1 = OpConstant %float 1
+    %float_2 = OpConstant %float 2
+    %v2float = OpTypeVector %float 2
+         %12 = OpConstantComposite %v2float %float_1 %float_2
+   %float_10 = OpConstant %float 10
+        %int = OpTypeInt 32 1
+      %int_2 = OpConstant %int 2
+      %v2int = OpTypeVector %int 2
+         %17 = OpConstantComposite %v2int %int_2 %int_2
+%type_sampler = OpTypeSampler
+%_ptr_UniformConstant_type_sampler = OpTypePointer UniformConstant %type_sampler
+%type_2d_image = OpTypeImage %float 2D 2 0 0 1 Unknown
+%_ptr_UniformConstant_type_2d_image = OpTypePointer UniformConstant %type_2d_image
+    %v4float = OpTypeVector %float 4
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+       %void = OpTypeVoid
+         %23 = OpTypeFunction %void
+%type_sampled_image = OpTypeSampledImage %type_2d_image
+               )";
+  ss << shader_image_and_sampler_variables;
+  ss << R"(
+%out_var_SV_TARGET = OpVariable %_ptr_Output_v4float Output
+       %main = OpFunction %void None %23
+         %24 = OpLabel
+  )";
+  ss << shader_body;
+  ss << R"(
+               OpReturn
+               OpFunctionEnd
+  )";
+  return ss.str();
+}
+
+using ConvertToSampledImageTest = PassTest<::testing::Test>;
+
+TEST_F(ConvertToSampledImageTest, Texture2DAndSamplerToSampledImage) {
+  const std::string shader = BuildShader(
+      R"(
+               OpDecorate %sam DescriptorSet 0
+               OpDecorate %sam Binding 5
+               OpDecorate %texture DescriptorSet 0
+               OpDecorate %texture Binding 5
+               )",
+      R"(
+            ; CHECK-NOT: OpVariable %_ptr_UniformConstant_type_2d_image
+
+            ; CHECK: [[tex:%\w+]] = OpVariable %_ptr_UniformConstant_type_sampled_image UniformConstant
+        %sam = OpVariable %_ptr_UniformConstant_type_sampler UniformConstant
+    %texture = OpVariable %_ptr_UniformConstant_type_2d_image UniformConstant
+               )",
+      R"(
+            ; CHECK: [[load:%\w+]] = OpLoad %type_sampled_image [[tex]]
+            ; CHECK: OpImageSampleExplicitLod %v4float [[load]]
+         %25 = OpLoad %type_2d_image %texture
+         %26 = OpLoad %type_sampler %sam
+         %27 = OpSampledImage %type_sampled_image %25 %26
+         %28 = OpImageSampleExplicitLod %v4float %27 %12 Lod|ConstOffset %float_10 %17
+               OpStore %out_var_SV_TARGET %28
+               )");
+
+  auto result = SinglePassRunAndMatch<ConvertToSampledImagePass>(
+      shader, /* do_validate = */ true,
+      VectorOfDescriptorSetAndBindingPairs{DescriptorSetAndBinding{0, 5}});
+
+  EXPECT_EQ(std::get<1>(result), Pass::Status::SuccessWithChange);
+}
+
+TEST_F(ConvertToSampledImageTest, Texture2DToSampledImage) {
+  const std::string shader = BuildShader(
+      R"(
+               OpDecorate %sam DescriptorSet 0
+               OpDecorate %sam Binding 2
+               OpDecorate %texture DescriptorSet 0
+               OpDecorate %texture Binding 5
+               )",
+      R"(
+            ; CHECK: [[tex:%\w+]] = OpVariable %_ptr_UniformConstant_type_sampled_image UniformConstant
+        %sam = OpVariable %_ptr_UniformConstant_type_sampler UniformConstant
+    %texture = OpVariable %_ptr_UniformConstant_type_2d_image UniformConstant
+               )",
+      R"(
+            ; CHECK: [[load:%\w+]] = OpLoad %type_sampled_image [[tex]]
+            ; CHECK: [[image_extraction:%\w+]] = OpImage %type_2d_image [[load]]
+            ; CHECK: OpSampledImage %type_sampled_image [[image_extraction]]
+         %25 = OpLoad %type_2d_image %texture
+         %26 = OpLoad %type_sampler %sam
+         %27 = OpSampledImage %type_sampled_image %25 %26
+         %28 = OpImageSampleExplicitLod %v4float %27 %12 Lod|ConstOffset %float_10 %17
+               OpStore %out_var_SV_TARGET %28
+               )");
+
+  auto result = SinglePassRunAndMatch<ConvertToSampledImagePass>(
+      shader, /* do_validate = */ true,
+      VectorOfDescriptorSetAndBindingPairs{DescriptorSetAndBinding{0, 5}});
+
+  EXPECT_EQ(std::get<1>(result), Pass::Status::SuccessWithChange);
+}
+
+TEST_F(ConvertToSampledImageTest, SamplerToSampledImage) {
+  const std::string shader = BuildShader(
+      R"(
+               OpDecorate %sam DescriptorSet 0
+               OpDecorate %sam Binding 2
+               OpDecorate %texture DescriptorSet 0
+               OpDecorate %texture Binding 5
+               )",
+      R"(
+        %sam = OpVariable %_ptr_UniformConstant_type_sampler UniformConstant
+    %texture = OpVariable %_ptr_UniformConstant_type_2d_image UniformConstant
+               )",
+      R"(
+         %25 = OpLoad %type_2d_image %texture
+         %26 = OpLoad %type_sampler %sam
+         %27 = OpSampledImage %type_sampled_image %25 %26
+         %28 = OpImageSampleExplicitLod %v4float %27 %12 Lod|ConstOffset %float_10 %17
+               OpStore %out_var_SV_TARGET %28
+               )");
+
+  auto result = SinglePassRunToBinary<ConvertToSampledImagePass>(
+      shader, /* skip_nop = */ false,
+      VectorOfDescriptorSetAndBindingPairs{DescriptorSetAndBinding{0, 2}});
+
+  EXPECT_EQ(std::get<1>(result), Pass::Status::Failure);
+}
+
+TEST_F(ConvertToSampledImageTest, TwoImagesWithDuplicatedDescriptorSetBinding) {
+  const std::string shader = BuildShader(
+      R"(
+               OpDecorate %sam DescriptorSet 0
+               OpDecorate %sam Binding 2
+               OpDecorate %texture0 DescriptorSet 0
+               OpDecorate %texture0 Binding 5
+               OpDecorate %texture1 DescriptorSet 0
+               OpDecorate %texture1 Binding 5
+               )",
+      R"(
+        %sam = OpVariable %_ptr_UniformConstant_type_sampler UniformConstant
+   %texture0 = OpVariable %_ptr_UniformConstant_type_2d_image UniformConstant
+   %texture1 = OpVariable %_ptr_UniformConstant_type_2d_image UniformConstant
+               )",
+      R"(
+         %25 = OpLoad %type_2d_image %texture0
+         %26 = OpLoad %type_sampler %sam
+         %27 = OpSampledImage %type_sampled_image %25 %26
+         %28 = OpImageSampleExplicitLod %v4float %27 %12 Lod|ConstOffset %float_10 %17
+               OpStore %out_var_SV_TARGET %28
+               )");
+
+  auto result = SinglePassRunToBinary<ConvertToSampledImagePass>(
+      shader, /* skip_nop = */ false,
+      VectorOfDescriptorSetAndBindingPairs{DescriptorSetAndBinding{0, 5}});
+
+  EXPECT_EQ(std::get<1>(result), Pass::Status::Failure);
+}
+
+TEST_F(ConvertToSampledImageTest,
+       TwoSamplersWithDuplicatedDescriptorSetBinding) {
+  const std::string shader = BuildShader(
+      R"(
+               OpDecorate %sam0 DescriptorSet 0
+               OpDecorate %sam0 Binding 2
+               OpDecorate %sam1 DescriptorSet 0
+               OpDecorate %sam1 Binding 2
+               OpDecorate %texture DescriptorSet 0
+               OpDecorate %texture Binding 5
+               )",
+      R"(
+       %sam0 = OpVariable %_ptr_UniformConstant_type_sampler UniformConstant
+       %sam1 = OpVariable %_ptr_UniformConstant_type_sampler UniformConstant
+    %texture = OpVariable %_ptr_UniformConstant_type_2d_image UniformConstant
+               )",
+      R"(
+         %25 = OpLoad %type_2d_image %texture
+         %26 = OpLoad %type_sampler %sam0
+         %27 = OpSampledImage %type_sampled_image %25 %26
+         %28 = OpImageSampleExplicitLod %v4float %27 %12 Lod|ConstOffset %float_10 %17
+               OpStore %out_var_SV_TARGET %28
+               )");
+
+  auto result = SinglePassRunToBinary<ConvertToSampledImagePass>(
+      shader, /* skip_nop = */ false,
+      VectorOfDescriptorSetAndBindingPairs{DescriptorSetAndBinding{0, 2}});
+
+  EXPECT_EQ(std::get<1>(result), Pass::Status::Failure);
+}
+
+}  // namespace
+}  // namespace opt
+}  // namespace spvtools
diff --git a/third_party/vulkan-deps/spirv-tools/src/test/opt/dataflow.cpp b/third_party/vulkan-deps/spirv-tools/src/test/opt/dataflow.cpp
new file mode 100644
index 0000000..4742015
--- /dev/null
+++ b/third_party/vulkan-deps/spirv-tools/src/test/opt/dataflow.cpp
@@ -0,0 +1,225 @@
+// Copyright (c) 2021 Google LLC.
+//
+// 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.
+
+#include "source/opt/dataflow.h"
+
+#include <map>
+#include <set>
+
+#include "gmock/gmock.h"
+#include "gtest/gtest.h"
+#include "opt/function_utils.h"
+#include "source/opt/build_module.h"
+
+namespace spvtools {
+namespace opt {
+namespace {
+
+using DataFlowTest = ::testing::Test;
+
+// Simple analyses for testing:
+
+// Stores the result IDs of visited instructions in visit order.
+struct VisitOrder : public ForwardDataFlowAnalysis {
+  std::vector<uint32_t> visited_result_ids;
+
+  VisitOrder(IRContext& context, LabelPosition label_position)
+      : ForwardDataFlowAnalysis(context, label_position) {}
+
+  VisitResult Visit(Instruction* inst) override {
+    if (inst->HasResultId()) {
+      visited_result_ids.push_back(inst->result_id());
+    }
+    return DataFlowAnalysis::VisitResult::kResultFixed;
+  }
+};
+
+// For each block, stores the set of blocks it can be preceded by.
+// For example, with the following CFG:
+//    V-----------.
+// -> 11 -> 12 -> 13 -> 15
+//            \-> 14 ---^
+//
+// The answer is:
+// 11: 11, 12, 13
+// 12: 11, 12, 13
+// 13: 11, 12, 13
+// 14: 11, 12, 13
+// 15: 11, 12, 13, 14
+struct BackwardReachability : public ForwardDataFlowAnalysis {
+  std::map<uint32_t, std::set<uint32_t>> reachable_from;
+
+  BackwardReachability(IRContext& context)
+      : ForwardDataFlowAnalysis(
+            context, ForwardDataFlowAnalysis::LabelPosition::kLabelsOnly) {}
+
+  VisitResult Visit(Instruction* inst) override {
+    // Conditional branches can be enqueued from labels, so skip them.
+    if (inst->opcode() != SpvOpLabel)
+      return DataFlowAnalysis::VisitResult::kResultFixed;
+    uint32_t id = inst->result_id();
+    VisitResult ret = DataFlowAnalysis::VisitResult::kResultFixed;
+    std::set<uint32_t>& precedents = reachable_from[id];
+    for (uint32_t pred : context().cfg()->preds(id)) {
+      bool pred_inserted = precedents.insert(pred).second;
+      if (pred_inserted) {
+        ret = DataFlowAnalysis::VisitResult::kResultChanged;
+      }
+      for (uint32_t block : reachable_from[pred]) {
+        bool inserted = precedents.insert(block).second;
+        if (inserted) {
+          ret = DataFlowAnalysis::VisitResult::kResultChanged;
+        }
+      }
+    }
+    return ret;
+  }
+
+  void InitializeWorklist(Function* function,
+                          bool is_first_iteration) override {
+    // Since successor function is exact, only need one pass.
+    if (is_first_iteration) {
+      ForwardDataFlowAnalysis::InitializeWorklist(function, true);
+    }
+  }
+};
+
+TEST_F(DataFlowTest, ReversePostOrder) {
+  // Note: labels and IDs are intentionally out of order.
+  //
+  // CFG: (order of branches is from bottom to top)
+  //          V-----------.
+  // -> 50 -> 40 -> 20 -> 60 -> 70
+  //            \-> 30 ---^
+
+  // DFS tree with RPO numbering:
+  // -> 50[0] -> 40[1] -> 20[2]    60[4] -> 70[5]
+  //                  \-> 30[3] ---^
+
+  const std::string text = R"(
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %2 "main"
+               OpExecutionMode %2 OriginUpperLeft
+               OpSource GLSL 430
+          %3 = OpTypeVoid
+          %4 = OpTypeFunction %3
+          %6 = OpTypeBool
+          %5 = OpConstantTrue %6
+          %2 = OpFunction %3 None %4
+         %50 = OpLabel
+         %51 = OpUndef %6
+         %52 = OpUndef %6
+               OpBranch %40
+         %70 = OpLabel
+         %69 = OpUndef %6
+               OpReturn
+         %60 = OpLabel
+         %61 = OpUndef %6
+               OpBranchConditional %5 %70 %40
+         %30 = OpLabel
+         %29 = OpUndef %6
+               OpBranch %60
+         %20 = OpLabel
+         %21 = OpUndef %6
+               OpBranch %60
+         %40 = OpLabel
+         %39 = OpUndef %6
+               OpBranchConditional %5 %30 %20
+               OpFunctionEnd
+  )";
+
+  std::unique_ptr<IRContext> context =
+      BuildModule(SPV_ENV_UNIVERSAL_1_2, nullptr, text,
+                  SPV_TEXT_TO_BINARY_OPTION_PRESERVE_NUMERIC_IDS);
+  ASSERT_NE(context, nullptr);
+
+  Function* function = spvtest::GetFunction(context->module(), 2);
+
+  std::map<ForwardDataFlowAnalysis::LabelPosition, std::vector<uint32_t>>
+      expected_order;
+  expected_order[ForwardDataFlowAnalysis::LabelPosition::kLabelsOnly] = {
+      50, 40, 20, 30, 60, 70,
+  };
+  expected_order[ForwardDataFlowAnalysis::LabelPosition::kLabelsAtBeginning] = {
+      50, 51, 52, 40, 39, 20, 21, 30, 29, 60, 61, 70, 69,
+  };
+  expected_order[ForwardDataFlowAnalysis::LabelPosition::kLabelsAtEnd] = {
+      51, 52, 50, 39, 40, 21, 20, 29, 30, 61, 60, 69, 70,
+  };
+  expected_order[ForwardDataFlowAnalysis::LabelPosition::kNoLabels] = {
+      51, 52, 39, 21, 29, 61, 69,
+  };
+
+  for (const auto& test_case : expected_order) {
+    VisitOrder analysis(*context, test_case.first);
+    analysis.Run(function);
+    EXPECT_EQ(test_case.second, analysis.visited_result_ids);
+  }
+}
+
+TEST_F(DataFlowTest, BackwardReachability) {
+  // CFG:
+  //    V-----------.
+  // -> 11 -> 12 -> 13 -> 15
+  //            \-> 14 ---^
+
+  const std::string text = R"(
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %2 "main"
+               OpExecutionMode %2 OriginUpperLeft
+               OpSource GLSL 430
+          %3 = OpTypeVoid
+          %4 = OpTypeFunction %3
+          %6 = OpTypeBool
+          %5 = OpConstantTrue %6
+          %2 = OpFunction %3 None %4
+         %11 = OpLabel
+               OpBranch %12
+         %12 = OpLabel
+               OpBranchConditional %5 %14 %13
+         %13 = OpLabel
+               OpBranchConditional %5 %15 %11
+         %14 = OpLabel
+               OpBranch %15
+         %15 = OpLabel
+               OpReturn
+               OpFunctionEnd
+  )";
+
+  std::unique_ptr<IRContext> context =
+      BuildModule(SPV_ENV_UNIVERSAL_1_2, nullptr, text,
+                  SPV_TEXT_TO_BINARY_OPTION_PRESERVE_NUMERIC_IDS);
+  ASSERT_NE(context, nullptr);
+
+  Function* function = spvtest::GetFunction(context->module(), 2);
+
+  BackwardReachability analysis(*context);
+  analysis.Run(function);
+
+  std::map<uint32_t, std::set<uint32_t>> expected_result;
+  expected_result[11] = {11, 12, 13};
+  expected_result[12] = {11, 12, 13};
+  expected_result[13] = {11, 12, 13};
+  expected_result[14] = {11, 12, 13};
+  expected_result[15] = {11, 12, 13, 14};
+  EXPECT_EQ(expected_result, analysis.reachable_from);
+}
+
+}  // namespace
+}  // namespace opt
+}  // namespace spvtools
diff --git a/third_party/vulkan-deps/spirv-tools/src/test/opt/eliminate_dead_member_test.cpp b/third_party/vulkan-deps/spirv-tools/src/test/opt/eliminate_dead_member_test.cpp
index 7728782..7887433 100644
--- a/third_party/vulkan-deps/spirv-tools/src/test/opt/eliminate_dead_member_test.cpp
+++ b/third_party/vulkan-deps/spirv-tools/src/test/opt/eliminate_dead_member_test.cpp
@@ -576,7 +576,6 @@
    %_Globals = OpVariable %_ptr_Uniform_type__Globals Uniform
        %main = OpFunction %void None %9
          %10 = OpLabel
-         %11 = OpLoad %type__Globals %_Globals
          %12 = OpArrayLength %uint %_Globals 2
                OpReturn
                OpFunctionEnd
diff --git a/third_party/vulkan-deps/spirv-tools/src/test/opt/fold_test.cpp b/third_party/vulkan-deps/spirv-tools/src/test/opt/fold_test.cpp
index 8457bbf..da5b017 100644
--- a/third_party/vulkan-deps/spirv-tools/src/test/opt/fold_test.cpp
+++ b/third_party/vulkan-deps/spirv-tools/src/test/opt/fold_test.cpp
@@ -5818,7 +5818,33 @@
         "%5 = OpFDiv %float %4 %2\n" +
         "OpReturn\n" +
         "OpFunctionEnd\n",
-    5, true)
+    5, true),
+  // Test case 16: Do not merge udiv of snegate
+  // (-x) / 2u
+  InstructionFoldingCase<bool>(
+    Header() +
+      "%main = OpFunction %void None %void_func\n" +
+      "%main_lab = OpLabel\n" +
+      "%var = OpVariable %_ptr_uint Function\n" +
+      "%2 = OpLoad %uint %var\n" +
+      "%3 = OpSNegate %uint %2\n" +
+      "%4 = OpUDiv %uint %3 %uint_2\n" +
+      "OpReturn\n" +
+      "OpFunctionEnd\n",
+    4, false),
+  // Test case 17: Do not merge udiv of snegate
+  // 2u / (-x)
+  InstructionFoldingCase<bool>(
+    Header() +
+      "%main = OpFunction %void None %void_func\n" +
+      "%main_lab = OpLabel\n" +
+      "%var = OpVariable %_ptr_uint Function\n" +
+      "%2 = OpLoad %uint %var\n" +
+      "%3 = OpSNegate %uint %2\n" +
+      "%4 = OpUDiv %uint %uint_2 %3\n" +
+      "OpReturn\n" +
+      "OpFunctionEnd\n",
+    4, false)
 ));
 
 INSTANTIATE_TEST_SUITE_P(MergeAddTest, MatchingInstructionFoldingTest,
diff --git a/third_party/vulkan-deps/spirv-tools/src/test/opt/reduce_load_size_test.cpp b/third_party/vulkan-deps/spirv-tools/src/test/opt/reduce_load_size_test.cpp
index 7672e8f..abb5cde 100644
--- a/third_party/vulkan-deps/spirv-tools/src/test/opt/reduce_load_size_test.cpp
+++ b/third_party/vulkan-deps/spirv-tools/src/test/opt/reduce_load_size_test.cpp
@@ -17,6 +17,12 @@
 #include "test/opt/pass_fixture.h"
 #include "test/opt/pass_utils.h"
 
+namespace {
+
+const double kDefaultLoadReductionThreshold = 0.9;
+
+}  // namespace
+
 namespace spvtools {
 namespace opt {
 namespace {
@@ -104,7 +110,8 @@
   SetAssembleOptions(SPV_TEXT_TO_BINARY_OPTION_PRESERVE_NUMERIC_IDS);
   SetDisassembleOptions(SPV_BINARY_TO_TEXT_OPTION_NO_HEADER |
                         SPV_BINARY_TO_TEXT_OPTION_FRIENDLY_NAMES);
-  SinglePassRunAndMatch<ReduceLoadSize>(test, false);
+  SinglePassRunAndMatch<ReduceLoadSize>(test, false,
+                                        kDefaultLoadReductionThreshold);
 }
 
 TEST_F(ReduceLoadSizeTest, cbuffer_load_extract_not_affected_by_debug_instr) {
@@ -202,7 +209,8 @@
   SetAssembleOptions(SPV_TEXT_TO_BINARY_OPTION_PRESERVE_NUMERIC_IDS);
   SetDisassembleOptions(SPV_BINARY_TO_TEXT_OPTION_NO_HEADER |
                         SPV_BINARY_TO_TEXT_OPTION_FRIENDLY_NAMES);
-  SinglePassRunAndMatch<ReduceLoadSize>(test, false);
+  SinglePassRunAndMatch<ReduceLoadSize>(test, false,
+                                        kDefaultLoadReductionThreshold);
 }
 
 TEST_F(ReduceLoadSizeTest, cbuffer_load_extract_vector) {
@@ -280,7 +288,8 @@
   SetAssembleOptions(SPV_TEXT_TO_BINARY_OPTION_PRESERVE_NUMERIC_IDS);
   SetDisassembleOptions(SPV_BINARY_TO_TEXT_OPTION_NO_HEADER |
                         SPV_BINARY_TO_TEXT_OPTION_FRIENDLY_NAMES);
-  SinglePassRunAndCheck<ReduceLoadSize>(test, test, true, false);
+  SinglePassRunAndCheck<ReduceLoadSize>(test, test, true, false,
+                                        kDefaultLoadReductionThreshold);
 }
 
 TEST_F(ReduceLoadSizeTest, cbuffer_load_5_extract) {
@@ -351,7 +360,8 @@
   SetAssembleOptions(SPV_TEXT_TO_BINARY_OPTION_PRESERVE_NUMERIC_IDS);
   SetDisassembleOptions(SPV_BINARY_TO_TEXT_OPTION_NO_HEADER |
                         SPV_BINARY_TO_TEXT_OPTION_FRIENDLY_NAMES);
-  SinglePassRunAndCheck<ReduceLoadSize>(test, test, true, false);
+  SinglePassRunAndCheck<ReduceLoadSize>(test, test, true, false,
+                                        kDefaultLoadReductionThreshold);
 }
 
 TEST_F(ReduceLoadSizeTest, cbuffer_load_fully_used) {
@@ -416,7 +426,76 @@
   SetAssembleOptions(SPV_TEXT_TO_BINARY_OPTION_PRESERVE_NUMERIC_IDS);
   SetDisassembleOptions(SPV_BINARY_TO_TEXT_OPTION_NO_HEADER |
                         SPV_BINARY_TO_TEXT_OPTION_FRIENDLY_NAMES);
-  SinglePassRunAndCheck<ReduceLoadSize>(test, test, true, false);
+  SinglePassRunAndCheck<ReduceLoadSize>(test, test, true, false,
+                                        kDefaultLoadReductionThreshold);
+}
+
+TEST_F(ReduceLoadSizeTest, replace_cbuffer_load_fully_used) {
+  const std::string test =
+      R"(
+               OpCapability Shader
+               OpCapability SampledBuffer
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %out_var_SV_Target0
+               OpExecutionMode %main OriginUpperLeft
+               OpSource HLSL 600
+               OpName %type_MaterialInstancing_cbuffer "type.MaterialInstancing_cbuffer"
+               OpMemberName %type_MaterialInstancing_cbuffer 0 "MaterialInstancing_constants"
+               OpName %MaterialInstancing_Constants "MaterialInstancing_Constants"
+               OpMemberName %MaterialInstancing_Constants 0 "offset0"
+               OpMemberName %MaterialInstancing_Constants 1 "params"
+               OpName %InstancingParams_Constants "InstancingParams_Constants"
+               OpMemberName %InstancingParams_Constants 0 "offset1"
+               OpName %MaterialInstancing_cbuffer "MaterialInstancing_cbuffer"
+               OpName %out_var_SV_Target0 "out.var.SV_Target0"
+               OpName %main "main"
+               OpDecorate %out_var_SV_Target0 Location 0
+               OpDecorate %MaterialInstancing_cbuffer DescriptorSet 6
+               OpDecorate %MaterialInstancing_cbuffer Binding 0
+               OpMemberDecorate %InstancingParams_Constants 0 Offset 0
+               OpMemberDecorate %MaterialInstancing_Constants 0 Offset 0
+               OpMemberDecorate %MaterialInstancing_Constants 1 Offset 16
+               OpMemberDecorate %type_MaterialInstancing_cbuffer 0 Offset 0
+               OpDecorate %type_MaterialInstancing_cbuffer Block
+        %int = OpTypeInt 32 1
+      %int_0 = OpConstant %int 0
+      %v4int = OpTypeVector %int 4
+%InstancingParams_Constants = OpTypeStruct %v4int
+%MaterialInstancing_Constants = OpTypeStruct %v4int %InstancingParams_Constants
+%type_MaterialInstancing_cbuffer = OpTypeStruct %MaterialInstancing_Constants
+%_ptr_Uniform_type_MaterialInstancing_cbuffer = OpTypePointer Uniform %type_MaterialInstancing_cbuffer
+%_ptr_Output_int = OpTypePointer Output %int
+       %void = OpTypeVoid
+         %60 = OpTypeFunction %void
+%_ptr_Uniform_MaterialInstancing_Constants = OpTypePointer Uniform %MaterialInstancing_Constants
+%MaterialInstancing_cbuffer = OpVariable %_ptr_Uniform_type_MaterialInstancing_cbuffer Uniform
+%out_var_SV_Target0 = OpVariable %_ptr_Output_int Output
+       %main = OpFunction %void None %60
+         %80 = OpLabel
+        %131 = OpAccessChain %_ptr_Uniform_MaterialInstancing_Constants %MaterialInstancing_cbuffer %int_0
+        %132 = OpLoad %MaterialInstancing_Constants %131
+; CHECK: [[ac1:%\w+]] = OpAccessChain {{%\w+}} %MaterialInstancing_cbuffer %int_0
+; CHECK: [[ac2:%\w+]] = OpAccessChain {{%\w+}} [[ac1]] %uint_0
+; CHECK: OpLoad %v4int [[ac2]]
+
+; CHECK: [[ac3:%\w+]] = OpAccessChain {{%\w+}} [[ac1]] %uint_1
+; CHECK: [[ac4:%\w+]] = OpAccessChain {{%\w+}} [[ac3]] %uint_0
+; CHECK: OpLoad %v4int [[ac4]]
+        %134 = OpCompositeExtract %v4int %132 0
+        %135 = OpCompositeExtract %InstancingParams_Constants %132 1
+        %136 = OpCompositeExtract %v4int %135 0
+        %149 = OpCompositeExtract %int %134 0
+        %185 = OpCompositeExtract %int %136 0
+        %156 = OpIAdd %int %149 %185
+               OpStore %out_var_SV_Target0 %156
+               OpReturn
+               OpFunctionEnd
+  )";
+
+  SetAssembleOptions(SPV_TEXT_TO_BINARY_OPTION_PRESERVE_NUMERIC_IDS);
+  SetDisassembleOptions(SPV_BINARY_TO_TEXT_OPTION_NO_HEADER |
+                        SPV_BINARY_TO_TEXT_OPTION_FRIENDLY_NAMES);
+  SinglePassRunAndMatch<ReduceLoadSize>(test, false, 1.1);
 }
 
 }  // namespace
diff --git a/third_party/vulkan-deps/spirv-tools/src/test/val/CMakeLists.txt b/third_party/vulkan-deps/spirv-tools/src/test/val/CMakeLists.txt
index b1e12ac..39f9a09 100644
--- a/third_party/vulkan-deps/spirv-tools/src/test/val/CMakeLists.txt
+++ b/third_party/vulkan-deps/spirv-tools/src/test/val/CMakeLists.txt
@@ -45,6 +45,7 @@
        val_extension_spv_khr_bit_instructions.cpp
        val_extension_spv_khr_terminate_invocation.cpp
        val_ext_inst_test.cpp
+       val_ext_inst_debug_test.cpp
        ${VAL_TEST_COMMON_SRCS}
   LIBS ${SPIRV_TOOLS_FULL_VISIBILITY}
   PCH_FILE pch_test_val
diff --git a/third_party/vulkan-deps/spirv-tools/src/test/val/val_builtins_test.cpp b/third_party/vulkan-deps/spirv-tools/src/test/val/val_builtins_test.cpp
index 2116fff..8495264 100644
--- a/third_party/vulkan-deps/spirv-tools/src/test/val/val_builtins_test.cpp
+++ b/third_party/vulkan-deps/spirv-tools/src/test/val/val_builtins_test.cpp
@@ -767,18 +767,18 @@
 INSTANTIATE_TEST_SUITE_P(
     ComputeShaderInputInt32Vec3NotGLCompute,
     ValidateVulkanCombineBuiltInExecutionModelDataTypeResult,
-    Combine(
-        Values("GlobalInvocationId", "LocalInvocationId", "NumWorkgroups",
-               "WorkgroupId"),
-        Values("Vertex", "Fragment", "Geometry", "TessellationControl",
-               "TessellationEvaluation"),
-        Values("Input"), Values("%u32vec3"),
-        Values("VUID-GlobalInvocationId-GlobalInvocationId-04236 "
-               "VUID-LocalInvocationId-LocalInvocationId-04281 "
-               "VUID-NumWorkgroups-NumWorkgroups-04296 "
-               "VUID-WorkgroupId-WorkgroupId-04422"),
-        Values(TestResult(SPV_ERROR_INVALID_DATA,
-                          "to be used only with GLCompute execution model"))));
+    Combine(Values("GlobalInvocationId", "LocalInvocationId", "NumWorkgroups",
+                   "WorkgroupId"),
+            Values("Vertex", "Fragment", "Geometry", "TessellationControl",
+                   "TessellationEvaluation"),
+            Values("Input"), Values("%u32vec3"),
+            Values("VUID-GlobalInvocationId-GlobalInvocationId-04236 "
+                   "VUID-LocalInvocationId-LocalInvocationId-04281 "
+                   "VUID-NumWorkgroups-NumWorkgroups-04296 "
+                   "VUID-WorkgroupId-WorkgroupId-04422"),
+            Values(TestResult(SPV_ERROR_INVALID_DATA,
+                              "to be used only with GLCompute, MeshNV, or "
+                              "TaskNV execution model"))));
 
 INSTANTIATE_TEST_SUITE_P(
     ComputeShaderInputInt32Vec3NotInput,
@@ -2828,9 +2828,10 @@
 
   CompileSuccessfully(generator.Build(), SPV_ENV_VULKAN_1_0);
   ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions(SPV_ENV_VULKAN_1_0));
-  EXPECT_THAT(getDiagnosticString(),
-              HasSubstr("Vulkan spec allows BuiltIn WorkgroupSize to be used "
-                        "only with GLCompute execution model"));
+  EXPECT_THAT(
+      getDiagnosticString(),
+      HasSubstr("Vulkan spec allows BuiltIn WorkgroupSize to be used "
+                "only with GLCompute, MeshNV, or TaskNV execution model"));
   EXPECT_THAT(getDiagnosticString(),
               HasSubstr("is referencing ID <2> (OpConstantComposite) which is "
                         "decorated with BuiltIn WorkgroupSize in function <1> "
@@ -3711,13 +3712,13 @@
 
 INSTANTIATE_TEST_SUITE_P(
     SubgroupNumAndIdNotCompute, ValidateVulkanSubgroupBuiltIns,
-    Combine(
-        Values("SubgroupId", "NumSubgroups"), Values("Vertex"), Values("Input"),
-        Values("%u32"),
-        Values("VUID-SubgroupId-SubgroupId-04367 "
-               "VUID-NumSubgroups-NumSubgroups-04293"),
-        Values(TestResult(SPV_ERROR_INVALID_DATA,
-                          "to be used only with GLCompute execution model"))));
+    Combine(Values("SubgroupId", "NumSubgroups"), Values("Vertex"),
+            Values("Input"), Values("%u32"),
+            Values("VUID-SubgroupId-SubgroupId-04367 "
+                   "VUID-NumSubgroups-NumSubgroups-04293"),
+            Values(TestResult(SPV_ERROR_INVALID_DATA,
+                              "to be used only with GLCompute, MeshNV, or "
+                              "TaskNV execution model"))));
 
 INSTANTIATE_TEST_SUITE_P(
     SubgroupNumAndIdNotU32, ValidateVulkanSubgroupBuiltIns,
diff --git a/third_party/vulkan-deps/spirv-tools/src/test/val/val_composites_test.cpp b/third_party/vulkan-deps/spirv-tools/src/test/val/val_composites_test.cpp
index bf7caa9..507ee88 100644
--- a/third_party/vulkan-deps/spirv-tools/src/test/val/val_composites_test.cpp
+++ b/third_party/vulkan-deps/spirv-tools/src/test/val/val_composites_test.cpp
@@ -86,10 +86,10 @@
 %f32mat23_121212 = OpConstantComposite %f32mat23 %f32vec2_12 %f32vec2_12 %f32vec2_12
 
 %f32vec2arr3 = OpTypeArray %f32vec2 %u32_3
-%f32vec2rarr = OpTypeRuntimeArray %f32vec2
+%f32vec2arr2 = OpTypeArray %f32vec2 %u32_2
 
 %f32u32struct = OpTypeStruct %f32 %u32
-%big_struct = OpTypeStruct %f32 %f32vec4 %f32mat23 %f32vec2arr3 %f32vec2rarr %f32u32struct
+%big_struct = OpTypeStruct %f32 %f32vec4 %f32mat23 %f32vec2arr3 %f32vec2arr2 %f32u32struct
 
 %ptr_big_struct = OpTypePointer Uniform %big_struct
 %var_big_struct = OpVariable %ptr_big_struct Uniform
@@ -150,7 +150,6 @@
 ; uniform blockName {
 ;   S s;
 ;   bool cond;
-;   RunTimeArray arr;
 ; }
 
 %f32arr = OpTypeRuntimeArray %float
@@ -161,7 +160,7 @@
 %_ptr_Function_vec4 = OpTypePointer Function %v4float
 %_ptr_Uniform_vec4 = OpTypePointer Uniform %v4float
 %struct_s = OpTypeStruct %int %array5_vec4 %int %array5_mat4x3
-%struct_blockName = OpTypeStruct %struct_s %int %f32arr
+%struct_blockName = OpTypeStruct %struct_s %int
 %_ptr_Uniform_blockName = OpTypePointer Uniform %struct_blockName
 %_ptr_Uniform_struct_s = OpTypePointer Uniform %struct_s
 %_ptr_Uniform_array5_mat4x3 = OpTypePointer Uniform %array5_mat4x3
@@ -644,8 +643,8 @@
 %val12 = OpCompositeExtract %f32 %struct 2 2 1
 %val13 = OpCompositeExtract %f32vec2 %struct 3 2
 %val14 = OpCompositeExtract %f32 %struct 3 2 1
-%val15 = OpCompositeExtract %f32vec2 %struct 4 100
-%val16 = OpCompositeExtract %f32 %struct 4 1000 1
+%val15 = OpCompositeExtract %f32vec2 %struct 4 1
+%val16 = OpCompositeExtract %f32 %struct 4 0 1
 %val17 = OpCompositeExtract %f32 %struct 5 0
 %val18 = OpCompositeExtract %u32 %struct 5 1
 )";
@@ -868,8 +867,8 @@
 %val12 = OpCompositeInsert %big_struct %f32_3 %struct 2 2 1
 %val13 = OpCompositeInsert %big_struct %f32vec2_01 %struct 3 2
 %val14 = OpCompositeInsert %big_struct %f32_3 %struct 3 2 1
-%val15 = OpCompositeInsert %big_struct %f32vec2_01 %struct 4 100
-%val16 = OpCompositeInsert %big_struct %f32_3 %struct 4 1000 1
+%val15 = OpCompositeInsert %big_struct %f32vec2_01 %struct 4 1
+%val16 = OpCompositeInsert %big_struct %f32_3 %struct 4 0 1
 %val17 = OpCompositeInsert %big_struct %f32_3 %struct 5 0
 %val18 = OpCompositeInsert %big_struct %u32_3 %struct 5 1
 )";
@@ -1382,8 +1381,8 @@
   EXPECT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
   EXPECT_THAT(getDiagnosticString(),
               HasSubstr("Index is out of bounds, can not find index 3 in the "
-                        "structure <id> '25'. This structure has 3 members. "
-                        "Largest valid index is 2."));
+                        "structure <id> '25'. This structure has 2 members. "
+                        "Largest valid index is 1."));
 }
 
 // Invalid. Index into a struct is larger than the number of struct members.
@@ -1403,8 +1402,8 @@
   EXPECT_THAT(
       getDiagnosticString(),
       HasSubstr("Index is out of bounds, can not find index 3 in the structure "
-                "<id> '25'. This structure has 3 members. Largest valid index "
-                "is 2."));
+                "<id> '25'. This structure has 2 members. Largest valid index "
+                "is 1."));
 }
 
 // #1403: Ensure that the default spec constant value is not used to check the
diff --git a/third_party/vulkan-deps/spirv-tools/src/test/val/val_decoration_test.cpp b/third_party/vulkan-deps/spirv-tools/src/test/val/val_decoration_test.cpp
index 096fd17..b9a413e 100644
--- a/third_party/vulkan-deps/spirv-tools/src/test/val/val_decoration_test.cpp
+++ b/third_party/vulkan-deps/spirv-tools/src/test/val/val_decoration_test.cpp
@@ -7648,6 +7648,149 @@
           "member 0 at offset 1 is not aligned to 4"));
 }
 
+TEST_F(ValidateDecorations, BadMatrixStrideUniform) {
+  const std::string spirv = R"(
+OpCapability Shader
+OpMemoryModel Logical GLSL450
+OpEntryPoint GLCompute %main "main"
+OpExecutionMode %main LocalSize 1 1 1
+OpDecorate %block Block
+OpMemberDecorate %block 0 Offset 0
+OpMemberDecorate %block 0 MatrixStride 3
+OpDecorate %var DescriptorSet 0
+OpDecorate %var Binding 0
+%void = OpTypeVoid
+%float = OpTypeFloat 32
+%float4 = OpTypeVector %float 4
+%matrix4x4 = OpTypeMatrix %float4 4
+%block = OpTypeStruct %matrix4x4
+%block_ptr = OpTypePointer Uniform %block
+%var = OpVariable %block_ptr Uniform
+%void_fn = OpTypeFunction %void
+%main = OpFunction %void None %void_fn
+%entry = OpLabel
+OpReturn
+OpFunctionEnd
+)";
+
+  CompileSuccessfully(spirv);
+  EXPECT_EQ(SPV_ERROR_INVALID_ID, ValidateInstructions());
+  EXPECT_THAT(
+      getDiagnosticString(),
+      HasSubstr(
+          "Structure id 2 decorated as Block for variable in Uniform storage "
+          "class must follow standard uniform buffer layout rules: member 0 is "
+          "a matrix with stride 3 not satisfying alignment to 16"));
+}
+
+TEST_F(ValidateDecorations, BadMatrixStrideStorageBuffer) {
+  const std::string spirv = R"(
+OpCapability Shader
+OpExtension "SPV_KHR_storage_buffer_storage_class"
+OpMemoryModel Logical GLSL450
+OpEntryPoint GLCompute %main "main"
+OpExecutionMode %main LocalSize 1 1 1
+OpDecorate %block Block
+OpMemberDecorate %block 0 Offset 0
+OpMemberDecorate %block 0 MatrixStride 3
+OpDecorate %var DescriptorSet 0
+OpDecorate %var Binding 0
+%void = OpTypeVoid
+%float = OpTypeFloat 32
+%float4 = OpTypeVector %float 4
+%matrix4x4 = OpTypeMatrix %float4 4
+%block = OpTypeStruct %matrix4x4
+%block_ptr = OpTypePointer StorageBuffer %block
+%var = OpVariable %block_ptr StorageBuffer
+%void_fn = OpTypeFunction %void
+%main = OpFunction %void None %void_fn
+%entry = OpLabel
+OpReturn
+OpFunctionEnd
+)";
+
+  CompileSuccessfully(spirv);
+  EXPECT_EQ(SPV_ERROR_INVALID_ID, ValidateInstructions());
+  EXPECT_THAT(
+      getDiagnosticString(),
+      HasSubstr(
+          "Structure id 2 decorated as Block for variable in StorageBuffer "
+          "storage class must follow standard storage buffer layout rules: "
+          "member 0 is a matrix with stride 3 not satisfying alignment to 16"));
+}
+
+TEST_F(ValidateDecorations, BadMatrixStridePushConstant) {
+  const std::string spirv = R"(
+OpCapability Shader
+OpMemoryModel Logical GLSL450
+OpEntryPoint GLCompute %main "main"
+OpExecutionMode %main LocalSize 1 1 1
+OpDecorate %block Block
+OpMemberDecorate %block 0 Offset 0
+OpMemberDecorate %block 0 MatrixStride 3
+OpDecorate %var DescriptorSet 0
+OpDecorate %var Binding 0
+%void = OpTypeVoid
+%float = OpTypeFloat 32
+%float4 = OpTypeVector %float 4
+%matrix4x4 = OpTypeMatrix %float4 4
+%block = OpTypeStruct %matrix4x4
+%block_ptr = OpTypePointer PushConstant %block
+%var = OpVariable %block_ptr PushConstant
+%void_fn = OpTypeFunction %void
+%main = OpFunction %void None %void_fn
+%entry = OpLabel
+OpReturn
+OpFunctionEnd
+)";
+
+  CompileSuccessfully(spirv);
+  EXPECT_EQ(SPV_ERROR_INVALID_ID, ValidateInstructions());
+  EXPECT_THAT(
+      getDiagnosticString(),
+      HasSubstr(
+          "Structure id 2 decorated as Block for variable in PushConstant "
+          "storage class must follow standard storage buffer layout rules: "
+          "member 0 is a matrix with stride 3 not satisfying alignment to 16"));
+}
+
+TEST_F(ValidateDecorations, BadMatrixStrideStorageBufferScalarLayout) {
+  const std::string spirv = R"(
+OpCapability Shader
+OpExtension "SPV_KHR_storage_buffer_storage_class"
+OpMemoryModel Logical GLSL450
+OpEntryPoint GLCompute %main "main"
+OpExecutionMode %main LocalSize 1 1 1
+OpDecorate %block Block
+OpMemberDecorate %block 0 Offset 0
+OpMemberDecorate %block 0 MatrixStride 3
+OpDecorate %var DescriptorSet 0
+OpDecorate %var Binding 0
+%void = OpTypeVoid
+%float = OpTypeFloat 32
+%float4 = OpTypeVector %float 4
+%matrix4x4 = OpTypeMatrix %float4 4
+%block = OpTypeStruct %matrix4x4
+%block_ptr = OpTypePointer StorageBuffer %block
+%var = OpVariable %block_ptr StorageBuffer
+%void_fn = OpTypeFunction %void
+%main = OpFunction %void None %void_fn
+%entry = OpLabel
+OpReturn
+OpFunctionEnd
+)";
+
+  options_->scalar_block_layout = true;
+  CompileSuccessfully(spirv);
+  EXPECT_EQ(SPV_ERROR_INVALID_ID, ValidateInstructions());
+  EXPECT_THAT(
+      getDiagnosticString(),
+      HasSubstr(
+          "Structure id 2 decorated as Block for variable in StorageBuffer "
+          "storage class must follow scalar storage buffer layout rules: "
+          "member 0 is a matrix with stride 3 not satisfying alignment to 4"));
+}
+
 }  // namespace
 }  // namespace val
 }  // namespace spvtools
diff --git a/third_party/vulkan-deps/spirv-tools/src/test/val/val_ext_inst_debug_test.cpp b/third_party/vulkan-deps/spirv-tools/src/test/val/val_ext_inst_debug_test.cpp
new file mode 100644
index 0000000..d3b9f03
--- /dev/null
+++ b/third_party/vulkan-deps/spirv-tools/src/test/val/val_ext_inst_debug_test.cpp
@@ -0,0 +1,5313 @@
+// Copyright (c) 2017 Google 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.
+
+// Tests validation rules of GLSL.450.std and OpenCL.std extended instructions.
+// Doesn't test OpenCL.std vector size 2, 3, 4, 8 or 16 rules (not supported
+// by standard SPIR-V).
+
+#include <sstream>
+#include <string>
+#include <vector>
+
+#include "gmock/gmock.h"
+#include "test/unit_spirv.h"
+#include "test/val/val_fixtures.h"
+
+namespace spvtools {
+namespace val {
+namespace {
+
+using ::testing::Eq;
+using ::testing::HasSubstr;
+using ::testing::Not;
+
+using ValidateOldDebugInfo = spvtest::ValidateBase<std::string>;
+using ValidateOpenCL100DebugInfo = spvtest::ValidateBase<std::string>;
+using ValidateXDebugInfo = spvtest::ValidateBase<std::string>;
+using ValidateLocalDebugInfoOutOfFunction = spvtest::ValidateBase<std::string>;
+using ValidateOpenCL100DebugInfoDebugTypedef =
+    spvtest::ValidateBase<std::pair<std::string, std::string>>;
+using ValidateVulkan100DebugInfoDebugTypedef =
+    spvtest::ValidateBase<std::pair<std::string, std::string>>;
+using ValidateOpenCL100DebugInfoDebugTypeEnum =
+    spvtest::ValidateBase<std::pair<std::string, std::string>>;
+using ValidateVulkan100DebugInfoDebugTypeEnum =
+    spvtest::ValidateBase<std::pair<std::string, std::string>>;
+using ValidateOpenCL100DebugInfoDebugTypeComposite =
+    spvtest::ValidateBase<std::pair<std::string, std::string>>;
+using ValidateVulkan100DebugInfoDebugTypeComposite =
+    spvtest::ValidateBase<std::pair<std::string, std::string>>;
+using ValidateOpenCL100DebugInfoDebugTypeMember =
+    spvtest::ValidateBase<std::pair<std::string, std::string>>;
+using ValidateVulkan100DebugInfoDebugTypeMember =
+    spvtest::ValidateBase<std::pair<std::string, std::string>>;
+using ValidateOpenCL100DebugInfoDebugTypeInheritance =
+    spvtest::ValidateBase<std::pair<std::string, std::string>>;
+using ValidateOpenCL100DebugInfoDebugFunction =
+    spvtest::ValidateBase<std::pair<std::string, std::string>>;
+using ValidateVulkan100DebugInfoDebugFunction =
+    spvtest::ValidateBase<std::pair<std::string, std::string>>;
+using ValidateOpenCL100DebugInfoDebugFunctionDeclaration =
+    spvtest::ValidateBase<std::pair<std::string, std::string>>;
+using ValidateVulkan100DebugInfoDebugFunctionDeclaration =
+    spvtest::ValidateBase<std::pair<std::string, std::string>>;
+using ValidateOpenCL100DebugInfoDebugLexicalBlock =
+    spvtest::ValidateBase<std::pair<std::string, std::string>>;
+using ValidateVulkan100DebugInfoDebugLexicalBlock =
+    spvtest::ValidateBase<std::pair<std::string, std::string>>;
+using ValidateOpenCL100DebugInfoDebugLocalVariable =
+    spvtest::ValidateBase<std::pair<std::string, std::string>>;
+using ValidateVulkan100DebugInfoDebugLocalVariable =
+    spvtest::ValidateBase<std::pair<std::string, std::string>>;
+using ValidateOpenCL100DebugInfoDebugGlobalVariable =
+    spvtest::ValidateBase<std::pair<std::string, std::string>>;
+using ValidateVulkan100DebugInfoDebugGlobalVariable =
+    spvtest::ValidateBase<std::pair<std::string, std::string>>;
+using ValidateOpenCL100DebugInfoDebugDeclare =
+    spvtest::ValidateBase<std::pair<std::string, std::string>>;
+using ValidateVulkan100DebugInfoDebugDeclare =
+    spvtest::ValidateBase<std::pair<std::string, std::string>>;
+using ValidateOpenCL100DebugInfoDebugValue =
+    spvtest::ValidateBase<std::pair<std::string, std::string>>;
+using ValidateVulkan100DebugInfoDebugValue =
+    spvtest::ValidateBase<std::pair<std::string, std::string>>;
+using ValidateVulkan100DebugInfo = spvtest::ValidateBase<std::string>;
+
+std::string GenerateShaderCodeForDebugInfo(
+    const std::string& op_string_instructions,
+    const std::string& op_const_instructions,
+    const std::string& debug_instructions_before_main, const std::string& body,
+    const std::string& capabilities_and_extensions = "",
+    const std::string& execution_model = "Fragment") {
+  std::ostringstream ss;
+  ss << R"(
+OpCapability Shader
+OpCapability Float16
+OpCapability Float64
+OpCapability Int16
+OpCapability Int64
+)";
+
+  ss << capabilities_and_extensions;
+  ss << "%extinst = OpExtInstImport \"GLSL.std.450\"\n";
+  ss << "OpMemoryModel Logical GLSL450\n";
+  ss << "OpEntryPoint " << execution_model << " %main \"main\""
+     << " %f32_output"
+     << " %f32vec2_output"
+     << " %u32_output"
+     << " %u32vec2_output"
+     << " %u64_output"
+     << " %f32_input"
+     << " %f32vec2_input"
+     << " %u32_input"
+     << " %u32vec2_input"
+     << " %u64_input"
+     << "\n";
+  if (execution_model == "Fragment") {
+    ss << "OpExecutionMode %main OriginUpperLeft\n";
+  }
+
+  ss << op_string_instructions;
+
+  ss << R"(
+%void = OpTypeVoid
+%func = OpTypeFunction %void
+%bool = OpTypeBool
+%f16 = OpTypeFloat 16
+%f32 = OpTypeFloat 32
+%f64 = OpTypeFloat 64
+%u32 = OpTypeInt 32 0
+%s32 = OpTypeInt 32 1
+%u64 = OpTypeInt 64 0
+%s64 = OpTypeInt 64 1
+%u16 = OpTypeInt 16 0
+%s16 = OpTypeInt 16 1
+%f32vec2 = OpTypeVector %f32 2
+%f32vec3 = OpTypeVector %f32 3
+%f32vec4 = OpTypeVector %f32 4
+%f64vec2 = OpTypeVector %f64 2
+%f64vec3 = OpTypeVector %f64 3
+%f64vec4 = OpTypeVector %f64 4
+%u32vec2 = OpTypeVector %u32 2
+%u32vec3 = OpTypeVector %u32 3
+%s32vec2 = OpTypeVector %s32 2
+%u32vec4 = OpTypeVector %u32 4
+%s32vec4 = OpTypeVector %s32 4
+%u64vec2 = OpTypeVector %u64 2
+%s64vec2 = OpTypeVector %s64 2
+%f64mat22 = OpTypeMatrix %f64vec2 2
+%f32mat22 = OpTypeMatrix %f32vec2 2
+%f32mat23 = OpTypeMatrix %f32vec2 3
+%f32mat32 = OpTypeMatrix %f32vec3 2
+%f32mat33 = OpTypeMatrix %f32vec3 3
+
+%f32_0 = OpConstant %f32 0
+%f32_1 = OpConstant %f32 1
+%f32_2 = OpConstant %f32 2
+%f32_3 = OpConstant %f32 3
+%f32_4 = OpConstant %f32 4
+%f32_h = OpConstant %f32 0.5
+%f32vec2_01 = OpConstantComposite %f32vec2 %f32_0 %f32_1
+%f32vec2_12 = OpConstantComposite %f32vec2 %f32_1 %f32_2
+%f32vec3_012 = OpConstantComposite %f32vec3 %f32_0 %f32_1 %f32_2
+%f32vec3_123 = OpConstantComposite %f32vec3 %f32_1 %f32_2 %f32_3
+%f32vec4_0123 = OpConstantComposite %f32vec4 %f32_0 %f32_1 %f32_2 %f32_3
+%f32vec4_1234 = OpConstantComposite %f32vec4 %f32_1 %f32_2 %f32_3 %f32_4
+
+%f64_0 = OpConstant %f64 0
+%f64_1 = OpConstant %f64 1
+%f64_2 = OpConstant %f64 2
+%f64_3 = OpConstant %f64 3
+%f64vec2_01 = OpConstantComposite %f64vec2 %f64_0 %f64_1
+%f64vec3_012 = OpConstantComposite %f64vec3 %f64_0 %f64_1 %f64_2
+%f64vec4_0123 = OpConstantComposite %f64vec4 %f64_0 %f64_1 %f64_2 %f64_3
+
+%f16_0 = OpConstant %f16 0
+%f16_1 = OpConstant %f16 1
+%f16_h = OpConstant %f16 0.5
+
+%u32_0 = OpConstant %u32 0
+%u32_1 = OpConstant %u32 1
+%u32_2 = OpConstant %u32 2
+%u32_3 = OpConstant %u32 3
+
+%s32_0 = OpConstant %s32 0
+%s32_1 = OpConstant %s32 1
+%s32_2 = OpConstant %s32 2
+%s32_3 = OpConstant %s32 3
+
+%u64_0 = OpConstant %u64 0
+%u64_1 = OpConstant %u64 1
+%u64_2 = OpConstant %u64 2
+%u64_3 = OpConstant %u64 3
+
+%s64_0 = OpConstant %s64 0
+%s64_1 = OpConstant %s64 1
+%s64_2 = OpConstant %s64 2
+%s64_3 = OpConstant %s64 3
+)";
+
+  ss << op_const_instructions;
+
+  ss << R"(
+%s32vec2_01 = OpConstantComposite %s32vec2 %s32_0 %s32_1
+%u32vec2_01 = OpConstantComposite %u32vec2 %u32_0 %u32_1
+
+%s32vec2_12 = OpConstantComposite %s32vec2 %s32_1 %s32_2
+%u32vec2_12 = OpConstantComposite %u32vec2 %u32_1 %u32_2
+
+%s32vec4_0123 = OpConstantComposite %s32vec4 %s32_0 %s32_1 %s32_2 %s32_3
+%u32vec4_0123 = OpConstantComposite %u32vec4 %u32_0 %u32_1 %u32_2 %u32_3
+
+%s64vec2_01 = OpConstantComposite %s64vec2 %s64_0 %s64_1
+%u64vec2_01 = OpConstantComposite %u64vec2 %u64_0 %u64_1
+
+%f32mat22_1212 = OpConstantComposite %f32mat22 %f32vec2_12 %f32vec2_12
+%f32mat23_121212 = OpConstantComposite %f32mat23 %f32vec2_12 %f32vec2_12 %f32vec2_12
+
+%f32_ptr_output = OpTypePointer Output %f32
+%f32vec2_ptr_output = OpTypePointer Output %f32vec2
+
+%u32_ptr_output = OpTypePointer Output %u32
+%u32vec2_ptr_output = OpTypePointer Output %u32vec2
+
+%u64_ptr_output = OpTypePointer Output %u64
+
+%f32_output = OpVariable %f32_ptr_output Output
+%f32vec2_output = OpVariable %f32vec2_ptr_output Output
+
+%u32_output = OpVariable %u32_ptr_output Output
+%u32vec2_output = OpVariable %u32vec2_ptr_output Output
+
+%u64_output = OpVariable %u64_ptr_output Output
+
+%f32_ptr_input = OpTypePointer Input %f32
+%f32vec2_ptr_input = OpTypePointer Input %f32vec2
+
+%u32_ptr_input = OpTypePointer Input %u32
+%u32vec2_ptr_input = OpTypePointer Input %u32vec2
+
+%u64_ptr_input = OpTypePointer Input %u64
+
+%f32_ptr_function = OpTypePointer Function %f32
+
+%f32_input = OpVariable %f32_ptr_input Input
+%f32vec2_input = OpVariable %f32vec2_ptr_input Input
+
+%u32_input = OpVariable %u32_ptr_input Input
+%u32vec2_input = OpVariable %u32vec2_ptr_input Input
+
+%u64_input = OpVariable %u64_ptr_input Input
+
+%u32_ptr_function = OpTypePointer Function %u32
+
+%struct_f16_u16 = OpTypeStruct %f16 %u16
+%struct_f32_f32 = OpTypeStruct %f32 %f32
+%struct_f32_f32_f32 = OpTypeStruct %f32 %f32 %f32
+%struct_f32_u32 = OpTypeStruct %f32 %u32
+%struct_f32_u32_f32 = OpTypeStruct %f32 %u32 %f32
+%struct_u32_f32 = OpTypeStruct %u32 %f32
+%struct_u32_u32 = OpTypeStruct %u32 %u32
+%struct_f32_f64 = OpTypeStruct %f32 %f64
+%struct_f32vec2_f32vec2 = OpTypeStruct %f32vec2 %f32vec2
+%struct_f32vec2_u32vec2 = OpTypeStruct %f32vec2 %u32vec2
+)";
+
+  ss << debug_instructions_before_main;
+
+  ss << R"(
+%main = OpFunction %void None %func
+%main_entry = OpLabel
+)";
+
+  ss << body;
+
+  ss << R"(
+OpReturn
+OpFunctionEnd)";
+
+  return ss.str();
+}
+
+TEST_F(ValidateOldDebugInfo, UseDebugInstructionOutOfFunction) {
+  const std::string src = R"(
+%code = OpString "main() {}"
+)";
+
+  const std::string dbg_inst = R"(
+%cu = OpExtInst %void %DbgExt DebugCompilationUnit %code 1 1
+)";
+
+  const std::string extension = R"(
+%DbgExt = OpExtInstImport "DebugInfo"
+)";
+
+  CompileSuccessfully(GenerateShaderCodeForDebugInfo(src, "", dbg_inst, "",
+                                                     extension, "Vertex"));
+  ASSERT_EQ(SPV_SUCCESS, ValidateInstructions());
+}
+
+TEST_F(ValidateOpenCL100DebugInfo, UseDebugInstructionOutOfFunction) {
+  const std::string src = R"(
+%src = OpString "simple.hlsl"
+%code = OpString "main() {}"
+)";
+
+  const std::string dbg_inst = R"(
+%dbg_src = OpExtInst %void %DbgExt DebugSource %src %code
+)";
+
+  const std::string extension = R"(
+%DbgExt = OpExtInstImport "OpenCL.DebugInfo.100"
+)";
+
+  CompileSuccessfully(GenerateShaderCodeForDebugInfo(src, "", dbg_inst, "",
+                                                     extension, "Vertex"));
+  ASSERT_EQ(SPV_SUCCESS, ValidateInstructions());
+}
+
+TEST_F(ValidateOpenCL100DebugInfo, DebugSourceInFunction) {
+  const std::string src = R"(
+%src = OpString "simple.hlsl"
+%code = OpString "main() {}"
+)";
+
+  const std::string dbg_inst = R"(
+%dbg_src = OpExtInst %void %DbgExt DebugSource %src %code
+)";
+
+  const std::string extension = R"(
+%DbgExt = OpExtInstImport "OpenCL.DebugInfo.100"
+)";
+
+  CompileSuccessfully(GenerateShaderCodeForDebugInfo(src, "", "", dbg_inst,
+                                                     extension, "Vertex"));
+  ASSERT_EQ(SPV_ERROR_INVALID_LAYOUT, ValidateInstructions());
+  EXPECT_THAT(
+      getDiagnosticString(),
+      HasSubstr("Debug info extension instructions other than DebugScope, "
+                "DebugNoScope, DebugDeclare, DebugValue must appear between "
+                "section 9 (types, constants, global variables) and section 10 "
+                "(function declarations)"));
+}
+
+TEST_F(ValidateVulkan100DebugInfo, DebugSourceInFunction) {
+  const std::string src = R"(
+%src = OpString "simple.hlsl"
+%code = OpString "main() {}"
+)";
+
+  const std::string dbg_inst = R"(
+%dbg_src = OpExtInst %void %DbgExt DebugSource %src %code
+)";
+
+  const std::string extension = R"(
+OpExtension "SPV_KHR_non_semantic_info"
+%DbgExt = OpExtInstImport "NonSemantic.Vulkan.DebugInfo.100"
+)";
+
+  CompileSuccessfully(GenerateShaderCodeForDebugInfo(src, "", "", dbg_inst,
+                                                     extension, "Vertex"));
+  ASSERT_EQ(SPV_ERROR_INVALID_LAYOUT, ValidateInstructions());
+  EXPECT_THAT(
+      getDiagnosticString(),
+      HasSubstr("Debug info extension instructions other than DebugScope, "
+                "DebugNoScope, DebugDeclare, DebugValue must appear between "
+                "section 9 (types, constants, global variables) and section 10 "
+                "(function declarations)"));
+}
+
+TEST_P(ValidateLocalDebugInfoOutOfFunction, OpenCLDebugInfo100DebugScope) {
+  const std::string src = R"(
+%src = OpString "simple.hlsl"
+%code = OpString "void main() {}"
+%void_name = OpString "void"
+%main_name = OpString "main"
+%main_linkage_name = OpString "v_main"
+%int_name = OpString "int"
+%foo_name = OpString "foo"
+)";
+
+  const std::string dbg_inst_header = R"(
+%dbg_src = OpExtInst %void %DbgExt DebugSource %src %code
+%comp_unit = OpExtInst %void %DbgExt DebugCompilationUnit 2 4 %dbg_src HLSL
+%int_info = OpExtInst %void %DbgExt DebugTypeBasic %int_name %u32_0 Signed
+%main_type_info = OpExtInst %void %DbgExt DebugTypeFunction FlagIsPublic %void
+%main_info = OpExtInst %void %DbgExt DebugFunction %main_name %main_type_info %dbg_src 1 1 %comp_unit %main_linkage_name FlagIsPublic 1 %main
+%foo_info = OpExtInst %void %DbgExt DebugLocalVariable %foo_name %int_info %dbg_src 1 1 %main_info FlagIsLocal
+%expr = OpExtInst %void %DbgExt DebugExpression
+)";
+
+  const std::string body = R"(
+%foo = OpVariable %u32_ptr_function Function
+%foo_val = OpLoad %u32 %foo
+)";
+
+  const std::string extension = R"(
+%DbgExt = OpExtInstImport "OpenCL.DebugInfo.100"
+)";
+
+  CompileSuccessfully(GenerateShaderCodeForDebugInfo(
+      src, "", dbg_inst_header + GetParam(), body, extension, "Vertex"));
+  ASSERT_EQ(SPV_ERROR_INVALID_LAYOUT, ValidateInstructions());
+  EXPECT_THAT(getDiagnosticString(),
+              HasSubstr("DebugScope, DebugNoScope, DebugDeclare, DebugValue "
+                        "of debug info extension must appear in a function "
+                        "body"));
+}
+
+TEST_P(ValidateLocalDebugInfoOutOfFunction, VulkanDebugInfo100DebugScope) {
+  const std::string src = R"(
+%src = OpString "simple.hlsl"
+%code = OpString "void main() {}"
+%void_name = OpString "void"
+%main_name = OpString "main"
+%main_linkage_name = OpString "v_main"
+%int_name = OpString "int"
+%foo_name = OpString "foo"
+)";
+
+  const std::string dbg_inst_header = R"(
+%dbg_src = OpExtInst %void %DbgExt DebugSource %src %code
+%comp_unit = OpExtInst %void %DbgExt DebugCompilationUnit %u32_2 %u32_4 %dbg_src %u32_5
+%int_info = OpExtInst %void %DbgExt DebugTypeBasic %int_name %u32_0 %u32_1 %u32_0
+%main_type_info = OpExtInst %void %DbgExt DebugTypeFunction %u32_3 %void
+%main_info = OpExtInst %void %DbgExt DebugFunction %main_name %main_type_info %dbg_src %u32_1 %u32_1 %comp_unit %main_linkage_name %u32_3 %u32_1
+%foo_info = OpExtInst %void %DbgExt DebugLocalVariable %foo_name %int_info %dbg_src %u32_1 %u32_1 %main_info %u32_4
+%expr = OpExtInst %void %DbgExt DebugExpression
+)";
+
+  const std::string body = R"(
+%foo = OpVariable %u32_ptr_function Function
+%main_def = OpExtInst %void %DbgExt DebugFunctionDefinition %main_info %main
+%foo_val = OpLoad %u32 %foo
+)";
+
+  const std::string extension = R"(
+OpExtension "SPV_KHR_non_semantic_info"
+%DbgExt = OpExtInstImport "NonSemantic.Vulkan.DebugInfo.100"
+)";
+
+  const std::string constants = R"(
+%u32_4 = OpConstant %u32 4
+%u32_5 = OpConstant %u32 5
+)";
+
+  CompileSuccessfully(GenerateShaderCodeForDebugInfo(
+      src, constants, dbg_inst_header + GetParam(), body, extension, "Vertex"));
+  ASSERT_EQ(SPV_ERROR_INVALID_LAYOUT, ValidateInstructions());
+  EXPECT_THAT(getDiagnosticString(),
+              HasSubstr("DebugScope, DebugNoScope, DebugDeclare, DebugValue "
+                        "of debug info extension must appear in a function "
+                        "body"));
+}
+
+INSTANTIATE_TEST_SUITE_P(
+    AllLocalDebugInfo, ValidateLocalDebugInfoOutOfFunction,
+    ::testing::ValuesIn(std::vector<std::string>{
+        "%main_scope = OpExtInst %void %DbgExt DebugScope %main_info",
+        "%no_scope = OpExtInst %void %DbgExt DebugNoScope",
+    }));
+
+TEST_F(ValidateOpenCL100DebugInfo, DebugFunctionForwardReference) {
+  const std::string src = R"(
+%src = OpString "simple.hlsl"
+%code = OpString "void main() {}"
+%void_name = OpString "void"
+%main_name = OpString "main"
+%main_linkage_name = OpString "v_main"
+)";
+
+  const std::string dbg_inst_header = R"(
+%dbg_src = OpExtInst %void %DbgExt DebugSource %src %code
+%comp_unit = OpExtInst %void %DbgExt DebugCompilationUnit 2 4 %dbg_src HLSL
+%main_type_info = OpExtInst %void %DbgExt DebugTypeFunction FlagIsPublic %void
+%main_info = OpExtInst %void %DbgExt DebugFunction %main_name %main_type_info %dbg_src 1 1 %comp_unit %main_linkage_name FlagIsPublic 1 %main
+)";
+
+  const std::string body = R"(
+%main_scope = OpExtInst %void %DbgExt DebugScope %main_info
+)";
+
+  const std::string extension = R"(
+%DbgExt = OpExtInstImport "OpenCL.DebugInfo.100"
+)";
+
+  CompileSuccessfully(GenerateShaderCodeForDebugInfo(
+      src, "", dbg_inst_header, body, extension, "Vertex"));
+  ASSERT_EQ(SPV_SUCCESS, ValidateInstructions());
+}
+
+TEST_F(ValidateOpenCL100DebugInfo, DebugFunctionMissingOpFunction) {
+  const std::string src = R"(
+%src = OpString "simple.hlsl"
+%code = OpString "void main() {}"
+%void_name = OpString "void"
+%main_name = OpString "main"
+%main_linkage_name = OpString "v_main"
+)";
+
+  const std::string dbg_inst_header = R"(
+%dbgNone = OpExtInst %void %DbgExt DebugInfoNone
+%dbg_src = OpExtInst %void %DbgExt DebugSource %src %code
+%comp_unit = OpExtInst %void %DbgExt DebugCompilationUnit 2 4 %dbg_src HLSL
+%main_type_info = OpExtInst %void %DbgExt DebugTypeFunction FlagIsPublic %void
+%main_info = OpExtInst %void %DbgExt DebugFunction %main_name %main_type_info %dbg_src 1 1 %comp_unit %main_linkage_name FlagIsPublic 1 %dbgNone
+)";
+
+  const std::string body = R"(
+%main_scope = OpExtInst %void %DbgExt DebugScope %main_info
+)";
+
+  const std::string extension = R"(
+%DbgExt = OpExtInstImport "OpenCL.DebugInfo.100"
+)";
+
+  CompileSuccessfully(GenerateShaderCodeForDebugInfo(
+      src, "", dbg_inst_header, body, extension, "Vertex"));
+  ASSERT_EQ(SPV_SUCCESS, ValidateInstructions());
+}
+
+TEST_F(ValidateOpenCL100DebugInfo, DebugScopeBeforeOpVariableInFunction) {
+  const std::string src = R"(
+%src = OpString "simple.hlsl"
+%code = OpString "float4 main(float arg) {
+  float foo;
+  return float4(0, 0, 0, 0);
+}
+"
+%float_name = OpString "float"
+%main_name = OpString "main"
+%main_linkage_name = OpString "v4f_main_f"
+)";
+
+  const std::string size_const = R"(
+%int_32 = OpConstant %u32 32
+)";
+
+  const std::string dbg_inst_header = R"(
+%dbg_src = OpExtInst %void %DbgExt DebugSource %src %code
+%comp_unit = OpExtInst %void %DbgExt DebugCompilationUnit 2 4 %dbg_src HLSL
+%float_info = OpExtInst %void %DbgExt DebugTypeBasic %float_name %int_32 Float
+%v4float_info = OpExtInst %void %DbgExt DebugTypeVector %float_info 4
+%main_type_info = OpExtInst %void %DbgExt DebugTypeFunction FlagIsPublic %v4float_info %float_info
+%main_info = OpExtInst %void %DbgExt DebugFunction %main_name %main_type_info %dbg_src 12 1 %comp_unit %main_linkage_name FlagIsPublic 13 %main
+)";
+
+  const std::string body = R"(
+%main_scope = OpExtInst %void %DbgExt DebugScope %main_info
+%foo = OpVariable %f32_ptr_function Function
+)";
+
+  const std::string extension = R"(
+%DbgExt = OpExtInstImport "OpenCL.DebugInfo.100"
+)";
+
+  CompileSuccessfully(GenerateShaderCodeForDebugInfo(
+      src, size_const, dbg_inst_header, body, extension, "Vertex"));
+  ASSERT_EQ(SPV_SUCCESS, ValidateInstructions());
+}
+
+TEST_F(ValidateOpenCL100DebugInfo, DebugTypeCompositeSizeDebugInfoNone) {
+  const std::string src = R"(
+%src = OpString "simple.hlsl"
+%code = OpString "OpaqueType foo;
+main() {}
+"
+%ty_name = OpString "struct VS_OUTPUT"
+)";
+
+  const std::string dbg_inst_header = R"(
+%dbg_none = OpExtInst %void %DbgExt DebugInfoNone
+%dbg_src = OpExtInst %void %DbgExt DebugSource %src %code
+%comp_unit = OpExtInst %void %DbgExt DebugCompilationUnit 2 4 %dbg_src HLSL
+%opaque = OpExtInst %void %DbgExt DebugTypeComposite %ty_name Class %dbg_src 1 1 %comp_unit %ty_name %dbg_none FlagIsPublic
+)";
+
+  const std::string extension = R"(
+%DbgExt = OpExtInstImport "OpenCL.DebugInfo.100"
+)";
+
+  CompileSuccessfully(GenerateShaderCodeForDebugInfo(src, "", dbg_inst_header,
+                                                     "", extension, "Vertex"));
+  ASSERT_EQ(SPV_SUCCESS, ValidateInstructions());
+}
+
+TEST_F(ValidateOpenCL100DebugInfo, DebugTypeCompositeForwardReference) {
+  const std::string src = R"(
+%src = OpString "simple.hlsl"
+%code = OpString "struct VS_OUTPUT {
+  float4 pos : SV_POSITION;
+  float4 color : COLOR;
+};
+main() {}
+"
+%VS_OUTPUT_name = OpString "struct VS_OUTPUT"
+%float_name = OpString "float"
+%VS_OUTPUT_pos_name = OpString "pos : SV_POSITION"
+%VS_OUTPUT_color_name = OpString "color : COLOR"
+%VS_OUTPUT_linkage_name = OpString "VS_OUTPUT"
+)";
+
+  const std::string size_const = R"(
+%int_32 = OpConstant %u32 32
+%int_128 = OpConstant %u32 128
+)";
+
+  const std::string dbg_inst_header = R"(
+%dbg_src = OpExtInst %void %DbgExt DebugSource %src %code
+%comp_unit = OpExtInst %void %DbgExt DebugCompilationUnit 2 4 %dbg_src HLSL
+%VS_OUTPUT_info = OpExtInst %void %DbgExt DebugTypeComposite %VS_OUTPUT_name Structure %dbg_src 1 1 %comp_unit %VS_OUTPUT_linkage_name %int_128 FlagIsPublic %VS_OUTPUT_pos_info %VS_OUTPUT_color_info
+%float_info = OpExtInst %void %DbgExt DebugTypeBasic %float_name %int_32 Float
+%v4float_info = OpExtInst %void %DbgExt DebugTypeVector %float_info 4
+%VS_OUTPUT_pos_info = OpExtInst %void %DbgExt DebugTypeMember %VS_OUTPUT_pos_name %v4float_info %dbg_src 2 3 %VS_OUTPUT_info %u32_0 %int_128 FlagIsPublic
+%VS_OUTPUT_color_info = OpExtInst %void %DbgExt DebugTypeMember %VS_OUTPUT_color_name %v4float_info %dbg_src 3 3 %VS_OUTPUT_info %int_128 %int_128 FlagIsPublic
+)";
+
+  const std::string extension = R"(
+%DbgExt = OpExtInstImport "OpenCL.DebugInfo.100"
+)";
+
+  CompileSuccessfully(GenerateShaderCodeForDebugInfo(
+      src, size_const, dbg_inst_header, "", extension, "Vertex"));
+  ASSERT_EQ(SPV_SUCCESS, ValidateInstructions());
+}
+
+TEST_F(ValidateOpenCL100DebugInfo, DebugTypeCompositeMissingReference) {
+  const std::string src = R"(
+%src = OpString "simple.hlsl"
+%code = OpString "struct VS_OUTPUT {
+  float4 pos : SV_POSITION;
+  float4 color : COLOR;
+};
+main() {}
+"
+%VS_OUTPUT_name = OpString "struct VS_OUTPUT"
+%float_name = OpString "float"
+%VS_OUTPUT_pos_name = OpString "pos : SV_POSITION"
+%VS_OUTPUT_color_name = OpString "color : COLOR"
+%VS_OUTPUT_linkage_name = OpString "VS_OUTPUT"
+)";
+
+  const std::string size_const = R"(
+%int_32 = OpConstant %u32 32
+%int_128 = OpConstant %u32 128
+)";
+
+  const std::string dbg_inst_header = R"(
+%dbg_src = OpExtInst %void %DbgExt DebugSource %src %code
+%comp_unit = OpExtInst %void %DbgExt DebugCompilationUnit 2 4 %dbg_src HLSL
+%VS_OUTPUT_info = OpExtInst %void %DbgExt DebugTypeComposite %VS_OUTPUT_name Structure %dbg_src 1 1 %comp_unit %VS_OUTPUT_linkage_name %int_128 FlagIsPublic %VS_OUTPUT_pos_info %VS_OUTPUT_color_info
+%float_info = OpExtInst %void %DbgExt DebugTypeBasic %float_name %int_32 Float
+%v4float_info = OpExtInst %void %DbgExt DebugTypeVector %float_info 4
+%VS_OUTPUT_pos_info = OpExtInst %void %DbgExt DebugTypeMember %VS_OUTPUT_pos_name %v4float_info %dbg_src 2 3 %VS_OUTPUT_info %u32_0 %int_128 FlagIsPublic
+)";
+
+  const std::string extension = R"(
+%DbgExt = OpExtInstImport "OpenCL.DebugInfo.100"
+)";
+
+  CompileSuccessfully(GenerateShaderCodeForDebugInfo(
+      src, size_const, dbg_inst_header, "", extension, "Vertex"));
+  ASSERT_EQ(SPV_ERROR_INVALID_ID, ValidateInstructions());
+  EXPECT_THAT(getDiagnosticString(),
+              HasSubstr("forward referenced IDs have not been defined"));
+}
+
+TEST_P(ValidateXDebugInfo, DebugSourceWrongResultType) {
+  const std::string src = R"(
+%src = OpString "simple.hlsl"
+%code = OpString "main() {}"
+)";
+
+  const std::string dbg_inst = R"(
+%dbg_src = OpExtInst %bool %DbgExt DebugSource %src %code
+)";
+
+  CompileSuccessfully(GenerateShaderCodeForDebugInfo(src, "", dbg_inst, "",
+                                                     GetParam(), "Vertex"));
+  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
+  EXPECT_THAT(getDiagnosticString(),
+              HasSubstr("expected result type must be a result id of "
+                        "OpTypeVoid"));
+}
+
+TEST_P(ValidateXDebugInfo, DebugSourceFailFile) {
+  const std::string src = R"(
+%code = OpString "main() {}"
+)";
+
+  const std::string dbg_inst = R"(
+%dbg_src = OpExtInst %void %DbgExt DebugSource %DbgExt %code
+)";
+
+  CompileSuccessfully(GenerateShaderCodeForDebugInfo(src, "", dbg_inst, "",
+                                                     GetParam(), "Vertex"));
+  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
+  EXPECT_THAT(getDiagnosticString(),
+              HasSubstr("expected operand File must be a result id of "
+                        "OpString"));
+}
+
+TEST_P(ValidateXDebugInfo, DebugSourceFailSource) {
+  const std::string src = R"(
+%src = OpString "simple.hlsl"
+)";
+
+  const std::string dbg_inst = R"(
+%dbg_src = OpExtInst %void %DbgExt DebugSource %src %DbgExt
+)";
+
+  CompileSuccessfully(GenerateShaderCodeForDebugInfo(src, "", dbg_inst, "",
+                                                     GetParam(), "Vertex"));
+  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
+  EXPECT_THAT(getDiagnosticString(),
+              HasSubstr("expected operand Text must be a result id of "
+                        "OpString"));
+}
+
+TEST_P(ValidateXDebugInfo, DebugSourceNoText) {
+  const std::string src = R"(
+%src = OpString "simple.hlsl"
+)";
+
+  const std::string dbg_inst = R"(
+%dbg_src = OpExtInst %void %DbgExt DebugSource %src
+)";
+
+  CompileSuccessfully(GenerateShaderCodeForDebugInfo(src, "", dbg_inst, "",
+                                                     GetParam(), "Vertex"));
+  ASSERT_EQ(SPV_SUCCESS, ValidateInstructions());
+}
+
+INSTANTIATE_TEST_SUITE_P(OpenCLAndVkDebugInfo100, ValidateXDebugInfo,
+                         ::testing::ValuesIn(std::vector<std::string>{
+                             R"(
+%DbgExt = OpExtInstImport "OpenCL.DebugInfo.100"
+)",
+                             R"(
+OpExtension "SPV_KHR_non_semantic_info"
+%DbgExt = OpExtInstImport "NonSemantic.Vulkan.DebugInfo.100"
+)",
+                         }));
+
+TEST_F(ValidateOpenCL100DebugInfo, DebugCompilationUnit) {
+  const std::string src = R"(
+%src = OpString "simple.hlsl"
+%code = OpString "main() {}"
+)";
+
+  const std::string dbg_inst = R"(
+%dbg_src = OpExtInst %void %DbgExt DebugSource %src %code
+%comp_unit = OpExtInst %void %DbgExt DebugCompilationUnit 2 4 %dbg_src HLSL
+)";
+
+  const std::string extension = R"(
+%DbgExt = OpExtInstImport "OpenCL.DebugInfo.100"
+)";
+
+  CompileSuccessfully(GenerateShaderCodeForDebugInfo(src, "", dbg_inst, "",
+                                                     extension, "Vertex"));
+  ASSERT_EQ(SPV_SUCCESS, ValidateInstructions());
+}
+
+TEST_F(ValidateOpenCL100DebugInfo, DebugCompilationUnitFail) {
+  const std::string src = R"(
+%src = OpString "simple.hlsl"
+%code = OpString "main() {}"
+)";
+
+  const std::string dbg_inst = R"(
+%dbg_src = OpExtInst %void %DbgExt DebugSource %src %code
+%comp_unit = OpExtInst %void %DbgExt DebugCompilationUnit 2 4 %src HLSL
+)";
+
+  const std::string extension = R"(
+%DbgExt = OpExtInstImport "OpenCL.DebugInfo.100"
+)";
+
+  CompileSuccessfully(GenerateShaderCodeForDebugInfo(src, "", dbg_inst, "",
+                                                     extension, "Vertex"));
+  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
+  EXPECT_THAT(getDiagnosticString(),
+              HasSubstr("expected operand Source must be a result id of "
+                        "DebugSource"));
+}
+
+TEST_F(ValidateVulkan100DebugInfo, DebugCompilationUnitFail) {
+  const std::string src = R"(
+%src = OpString "simple.hlsl"
+%code = OpString "main() {}"
+)";
+
+  const std::string dbg_inst = R"(
+%dbg_src = OpExtInst %void %DbgExt DebugSource %src %code
+%comp_unit = OpExtInst %void %DbgExt DebugCompilationUnit %u32_2 %u32_4 %src %u32_5
+)";
+
+  const std::string extension = R"(
+OpExtension "SPV_KHR_non_semantic_info"
+%DbgExt = OpExtInstImport "NonSemantic.Vulkan.DebugInfo.100"
+)";
+
+  const std::string constants = R"(
+%u32_4 = OpConstant %u32 4
+%u32_5 = OpConstant %u32 5
+)";
+
+  CompileSuccessfully(GenerateShaderCodeForDebugInfo(src, constants, dbg_inst,
+                                                     "", extension, "Vertex"));
+  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
+  EXPECT_THAT(getDiagnosticString(),
+              HasSubstr("expected operand Source must be a result id of "
+                        "DebugSource"));
+}
+
+TEST_F(ValidateOpenCL100DebugInfo, DebugTypeBasicFailName) {
+  const std::string src = R"(
+%src = OpString "simple.hlsl"
+%code = OpString "float4 main(float arg) {
+  float foo;
+  return float4(0, 0, 0, 0);
+}
+"
+%float_name = OpString "float"
+)";
+
+  const std::string size_const = R"(
+%int_32 = OpConstant %u32 32
+)";
+
+  const std::string dbg_inst_header = R"(
+%dbg_src = OpExtInst %void %DbgExt DebugSource %src %code
+%comp_unit = OpExtInst %void %DbgExt DebugCompilationUnit 2 4 %dbg_src HLSL
+%float_info = OpExtInst %void %DbgExt DebugTypeBasic %int_32 %int_32 Float
+)";
+
+  const std::string extension = R"(
+%DbgExt = OpExtInstImport "OpenCL.DebugInfo.100"
+)";
+
+  CompileSuccessfully(GenerateShaderCodeForDebugInfo(
+      src, size_const, dbg_inst_header, "", extension, "Vertex"));
+  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
+  EXPECT_THAT(getDiagnosticString(),
+              HasSubstr("expected operand Name must be a result id of "
+                        "OpString"));
+}
+
+TEST_F(ValidateVulkan100DebugInfo, DebugTypeBasicFailName) {
+  const std::string src = R"(
+%src = OpString "simple.hlsl"
+%code = OpString "float4 main(float arg) {
+  float foo;
+  return float4(0, 0, 0, 0);
+}
+"
+%float_name = OpString "float"
+)";
+
+  const std::string constants = R"(
+%u32_4 = OpConstant %u32 4
+%u32_5 = OpConstant %u32 5
+%u32_32 = OpConstant %u32 32
+)";
+
+  const std::string dbg_inst_header = R"(
+%dbg_src = OpExtInst %void %DbgExt DebugSource %src %code
+%comp_unit = OpExtInst %void %DbgExt DebugCompilationUnit %u32_2 %u32_4 %dbg_src %u32_5
+%float_info = OpExtInst %void %DbgExt DebugTypeBasic %u32_32 %u32_32 %u32_3 %u32_0
+)";
+
+  const std::string extension = R"(
+OpExtension "SPV_KHR_non_semantic_info"
+%DbgExt = OpExtInstImport "NonSemantic.Vulkan.DebugInfo.100"
+)";
+
+  CompileSuccessfully(GenerateShaderCodeForDebugInfo(
+      src, constants, dbg_inst_header, "", extension, "Vertex"));
+  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
+  EXPECT_THAT(getDiagnosticString(),
+              HasSubstr("expected operand Name must be a result id of "
+                        "OpString"));
+}
+
+TEST_F(ValidateOpenCL100DebugInfo, DebugTypeBasicFailSize) {
+  const std::string src = R"(
+%src = OpString "simple.hlsl"
+%code = OpString "float4 main(float arg) {
+  float foo;
+  return float4(0, 0, 0, 0);
+}
+"
+%float_name = OpString "float"
+)";
+
+  const std::string size_const = R"(
+%int_32 = OpConstant %u32 32
+)";
+
+  const std::string dbg_inst_header = R"(
+%dbg_src = OpExtInst %void %DbgExt DebugSource %src %code
+%comp_unit = OpExtInst %void %DbgExt DebugCompilationUnit 2 4 %dbg_src HLSL
+%float_info = OpExtInst %void %DbgExt DebugTypeBasic %float_name %float_name Float
+)";
+
+  const std::string extension = R"(
+%DbgExt = OpExtInstImport "OpenCL.DebugInfo.100"
+)";
+
+  CompileSuccessfully(GenerateShaderCodeForDebugInfo(
+      src, size_const, dbg_inst_header, "", extension, "Vertex"));
+  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
+  EXPECT_THAT(getDiagnosticString(),
+              HasSubstr("expected operand Size must be a result id of "
+                        "OpConstant"));
+}
+
+TEST_F(ValidateVulkan100DebugInfo, DebugTypeBasicFailSize) {
+  const std::string src = R"(
+%src = OpString "simple.hlsl"
+%code = OpString "float4 main(float arg) {
+  float foo;
+  return float4(0, 0, 0, 0);
+}
+"
+%float_name = OpString "float"
+)";
+
+  const std::string constants = R"(
+%u32_4 = OpConstant %u32 4
+%u32_5 = OpConstant %u32 5
+%u32_32 = OpConstant %u32 32
+)";
+
+  const std::string dbg_inst_header = R"(
+%dbg_src = OpExtInst %void %DbgExt DebugSource %src %code
+%comp_unit = OpExtInst %void %DbgExt DebugCompilationUnit %u32_2 %u32_4 %dbg_src %u32_5
+%float_info = OpExtInst %void %DbgExt DebugTypeBasic %float_name %float_name %u32_3 %u32_0
+)";
+
+  const std::string extension = R"(
+OpExtension "SPV_KHR_non_semantic_info"
+%DbgExt = OpExtInstImport "NonSemantic.Vulkan.DebugInfo.100"
+)";
+
+  CompileSuccessfully(GenerateShaderCodeForDebugInfo(
+      src, constants, dbg_inst_header, "", extension, "Vertex"));
+  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
+  EXPECT_THAT(getDiagnosticString(),
+              HasSubstr("expected operand Size must be a result id of "
+                        "OpConstant"));
+}
+
+TEST_F(ValidateOpenCL100DebugInfo, DebugTypePointer) {
+  const std::string src = R"(
+%src = OpString "simple.hlsl"
+%code = OpString "float4 main(float arg) {
+  float foo;
+  return float4(0, 0, 0, 0);
+}
+"
+%float_name = OpString "float"
+)";
+
+  const std::string size_const = R"(
+%int_32 = OpConstant %u32 32
+)";
+
+  const std::string dbg_inst_header = R"(
+%dbg_src = OpExtInst %void %DbgExt DebugSource %src %code
+%comp_unit = OpExtInst %void %DbgExt DebugCompilationUnit 2 4 %dbg_src HLSL
+%float_info = OpExtInst %void %DbgExt DebugTypeBasic %float_name %int_32 Float
+%pfloat_info = OpExtInst %void %DbgExt DebugTypePointer %float_info Function FlagIsLocal
+)";
+
+  const std::string extension = R"(
+%DbgExt = OpExtInstImport "OpenCL.DebugInfo.100"
+)";
+
+  CompileSuccessfully(GenerateShaderCodeForDebugInfo(
+      src, size_const, dbg_inst_header, "", extension, "Vertex"));
+  ASSERT_EQ(SPV_SUCCESS, ValidateInstructions());
+}
+
+TEST_F(ValidateOpenCL100DebugInfo, DebugTypePointerFail) {
+  const std::string src = R"(
+%src = OpString "simple.hlsl"
+%code = OpString "float4 main(float arg) {
+  float foo;
+  return float4(0, 0, 0, 0);
+}
+"
+%float_name = OpString "float"
+)";
+
+  const std::string size_const = R"(
+%int_32 = OpConstant %u32 32
+)";
+
+  const std::string dbg_inst_header = R"(
+%dbg_src = OpExtInst %void %DbgExt DebugSource %src %code
+%comp_unit = OpExtInst %void %DbgExt DebugCompilationUnit 2 4 %dbg_src HLSL
+%float_info = OpExtInst %void %DbgExt DebugTypeBasic %float_name %int_32 Float
+%pfloat_info = OpExtInst %void %DbgExt DebugTypePointer %dbg_src Function FlagIsLocal
+)";
+
+  const std::string extension = R"(
+%DbgExt = OpExtInstImport "OpenCL.DebugInfo.100"
+)";
+
+  CompileSuccessfully(GenerateShaderCodeForDebugInfo(
+      src, size_const, dbg_inst_header, "", extension, "Vertex"));
+  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
+  EXPECT_THAT(getDiagnosticString(),
+              HasSubstr("expected operand Base Type must be a result id of "
+                        "DebugTypeBasic"));
+}
+
+TEST_F(ValidateOpenCL100DebugInfo, DebugTypeQualifier) {
+  const std::string src = R"(
+%src = OpString "simple.hlsl"
+%code = OpString "float4 main(float arg) {
+  float foo;
+  return float4(0, 0, 0, 0);
+}
+"
+%float_name = OpString "float"
+)";
+
+  const std::string size_const = R"(
+%int_32 = OpConstant %u32 32
+)";
+
+  const std::string dbg_inst_header = R"(
+%dbg_src = OpExtInst %void %DbgExt DebugSource %src %code
+%comp_unit = OpExtInst %void %DbgExt DebugCompilationUnit 2 4 %dbg_src HLSL
+%float_info = OpExtInst %void %DbgExt DebugTypeBasic %float_name %int_32 Float
+%cfloat_info = OpExtInst %void %DbgExt DebugTypeQualifier %float_info ConstType
+)";
+
+  const std::string extension = R"(
+%DbgExt = OpExtInstImport "OpenCL.DebugInfo.100"
+)";
+
+  CompileSuccessfully(GenerateShaderCodeForDebugInfo(
+      src, size_const, dbg_inst_header, "", extension, "Vertex"));
+  ASSERT_EQ(SPV_SUCCESS, ValidateInstructions());
+}
+
+TEST_F(ValidateOpenCL100DebugInfo, DebugTypeQualifierFail) {
+  const std::string src = R"(
+%src = OpString "simple.hlsl"
+%code = OpString "float4 main(float arg) {
+  float foo;
+  return float4(0, 0, 0, 0);
+}
+"
+%float_name = OpString "float"
+)";
+
+  const std::string size_const = R"(
+%int_32 = OpConstant %u32 32
+)";
+
+  const std::string dbg_inst_header = R"(
+%dbg_src = OpExtInst %void %DbgExt DebugSource %src %code
+%comp_unit = OpExtInst %void %DbgExt DebugCompilationUnit 2 4 %dbg_src HLSL
+%float_info = OpExtInst %void %DbgExt DebugTypeBasic %float_name %int_32 Float
+%cfloat_info = OpExtInst %void %DbgExt DebugTypeQualifier %comp_unit ConstType
+)";
+
+  const std::string extension = R"(
+%DbgExt = OpExtInstImport "OpenCL.DebugInfo.100"
+)";
+
+  CompileSuccessfully(GenerateShaderCodeForDebugInfo(
+      src, size_const, dbg_inst_header, "", extension, "Vertex"));
+  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
+  EXPECT_THAT(getDiagnosticString(),
+              HasSubstr("expected operand Base Type must be a result id of "
+                        "DebugTypeBasic"));
+}
+TEST_F(ValidateVulkan100DebugInfo, DebugTypeQualifier) {
+  const std::string src = R"(
+%src = OpString "simple.hlsl"
+%code = OpString "float4 main(float arg) {
+  float foo;
+  return float4(0, 0, 0, 0);
+}
+"
+%float_name = OpString "float"
+)";
+
+  const std::string constants = R"(
+%u32_4 = OpConstant %u32 4
+%u32_5 = OpConstant %u32 5
+%u32_32 = OpConstant %u32 32
+)";
+
+  const std::string dbg_inst_header = R"(
+%dbg_src = OpExtInst %void %DbgExt DebugSource %src %code
+%comp_unit = OpExtInst %void %DbgExt DebugCompilationUnit %u32_2 %u32_4 %dbg_src %u32_5
+%float_info = OpExtInst %void %DbgExt DebugTypeBasic %float_name %u32_32 %u32_3 %u32_0
+%cfloat_info = OpExtInst %void %DbgExt DebugTypeQualifier %float_info %u32_0
+)";
+
+  const std::string extension = R"(
+OpExtension "SPV_KHR_non_semantic_info"
+%DbgExt = OpExtInstImport "NonSemantic.Vulkan.DebugInfo.100"
+)";
+
+  CompileSuccessfully(GenerateShaderCodeForDebugInfo(
+      src, constants, dbg_inst_header, "", extension, "Vertex"));
+  ASSERT_EQ(SPV_SUCCESS, ValidateInstructions());
+}
+
+TEST_F(ValidateVulkan100DebugInfo, DebugTypeQualifierFail) {
+  const std::string src = R"(
+%src = OpString "simple.hlsl"
+%code = OpString "float4 main(float arg) {
+  float foo;
+  return float4(0, 0, 0, 0);
+}
+"
+%float_name = OpString "float"
+)";
+
+  const std::string constants = R"(
+%u32_4 = OpConstant %u32 4
+%u32_5 = OpConstant %u32 5
+%u32_32 = OpConstant %u32 32
+)";
+
+  const std::string dbg_inst_header = R"(
+%dbg_src = OpExtInst %void %DbgExt DebugSource %src %code
+%comp_unit = OpExtInst %void %DbgExt DebugCompilationUnit %u32_2 %u32_4 %dbg_src %u32_5
+%float_info = OpExtInst %void %DbgExt DebugTypeBasic %float_name %u32_32 %u32_3 %u32_0
+%cfloat_info = OpExtInst %void %DbgExt DebugTypeQualifier %comp_unit %u32_0
+)";
+
+  const std::string extension = R"(
+OpExtension "SPV_KHR_non_semantic_info"
+%DbgExt = OpExtInstImport "NonSemantic.Vulkan.DebugInfo.100"
+)";
+
+  CompileSuccessfully(GenerateShaderCodeForDebugInfo(
+      src, constants, dbg_inst_header, "", extension, "Vertex"));
+  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
+  EXPECT_THAT(getDiagnosticString(),
+              HasSubstr("expected operand Base Type must be a result id of "
+                        "DebugTypeBasic"));
+}
+
+TEST_F(ValidateOpenCL100DebugInfo, DebugTypeArray) {
+  const std::string src = R"(
+%src = OpString "simple.hlsl"
+%code = OpString "main() {}"
+%float_name = OpString "float"
+)";
+
+  const std::string size_const = R"(
+%int_32 = OpConstant %u32 32
+)";
+
+  const std::string dbg_inst_header = R"(
+%dbg_src = OpExtInst %void %DbgExt DebugSource %src %code
+%comp_unit = OpExtInst %void %DbgExt DebugCompilationUnit 2 4 %dbg_src HLSL
+%float_info = OpExtInst %void %DbgExt DebugTypeBasic %float_name %int_32 Float
+%float_arr_info = OpExtInst %void %DbgExt DebugTypeArray %float_info %int_32
+)";
+
+  const std::string extension = R"(
+%DbgExt = OpExtInstImport "OpenCL.DebugInfo.100"
+)";
+
+  CompileSuccessfully(GenerateShaderCodeForDebugInfo(
+      src, size_const, dbg_inst_header, "", extension, "Vertex"));
+  ASSERT_EQ(SPV_SUCCESS, ValidateInstructions());
+}
+
+TEST_F(ValidateOpenCL100DebugInfo, DebugTypeArrayWithVariableSize) {
+  const std::string src = R"(
+%src = OpString "simple.hlsl"
+%code = OpString "main() {}"
+%float_name = OpString "float"
+%int_name = OpString "int"
+%main_name = OpString "main"
+%foo_name = OpString "foo"
+)";
+
+  const std::string size_const = R"(
+%int_32 = OpConstant %u32 32
+)";
+
+  const std::string dbg_inst_header = R"(
+%dbg_src = OpExtInst %void %DbgExt DebugSource %src %code
+%comp_unit = OpExtInst %void %DbgExt DebugCompilationUnit 2 4 %dbg_src HLSL
+%float_info = OpExtInst %void %DbgExt DebugTypeBasic %float_name %int_32 Float
+%uint_info = OpExtInst %void %DbgExt DebugTypeBasic %int_name %int_32 Unsigned
+%main_type_info = OpExtInst %void %DbgExt DebugTypeFunction FlagIsPublic %void
+%main_info = OpExtInst %void %DbgExt DebugFunction %main_name %main_type_info %dbg_src 1 1 %comp_unit %main_name FlagIsPublic 1 %main
+%foo_info = OpExtInst %void %DbgExt DebugLocalVariable %foo_name %uint_info %dbg_src 1 1 %main_info FlagIsLocal
+%float_arr_info = OpExtInst %void %DbgExt DebugTypeArray %float_info %foo_info
+)";
+
+  const std::string extension = R"(
+%DbgExt = OpExtInstImport "OpenCL.DebugInfo.100"
+)";
+
+  CompileSuccessfully(GenerateShaderCodeForDebugInfo(
+      src, size_const, dbg_inst_header, "", extension, "Vertex"));
+  ASSERT_EQ(SPV_SUCCESS, ValidateInstructions());
+}
+
+TEST_F(ValidateOpenCL100DebugInfo, DebugTypeArrayFailBaseType) {
+  const std::string src = R"(
+%src = OpString "simple.hlsl"
+%code = OpString "main() {}"
+%float_name = OpString "float"
+)";
+
+  const std::string size_const = R"(
+%int_32 = OpConstant %u32 32
+)";
+
+  const std::string dbg_inst_header = R"(
+%dbg_src = OpExtInst %void %DbgExt DebugSource %src %code
+%comp_unit = OpExtInst %void %DbgExt DebugCompilationUnit 2 4 %dbg_src HLSL
+%float_info = OpExtInst %void %DbgExt DebugTypeBasic %float_name %int_32 Float
+%float_arr_info = OpExtInst %void %DbgExt DebugTypeArray %comp_unit %int_32
+)";
+
+  const std::string extension = R"(
+%DbgExt = OpExtInstImport "OpenCL.DebugInfo.100"
+)";
+
+  CompileSuccessfully(GenerateShaderCodeForDebugInfo(
+      src, size_const, dbg_inst_header, "", extension, "Vertex"));
+  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
+  EXPECT_THAT(getDiagnosticString(),
+              HasSubstr("expected operand Base Type is not a valid debug "
+                        "type"));
+}
+
+TEST_F(ValidateOpenCL100DebugInfo, DebugTypeArrayFailComponentCount) {
+  const std::string src = R"(
+%src = OpString "simple.hlsl"
+%code = OpString "main() {}"
+%float_name = OpString "float"
+)";
+
+  const std::string size_const = R"(
+%int_32 = OpConstant %u32 32
+)";
+
+  const std::string dbg_inst_header = R"(
+%dbg_src = OpExtInst %void %DbgExt DebugSource %src %code
+%comp_unit = OpExtInst %void %DbgExt DebugCompilationUnit 2 4 %dbg_src HLSL
+%float_info = OpExtInst %void %DbgExt DebugTypeBasic %float_name %int_32 Float
+%float_arr_info = OpExtInst %void %DbgExt DebugTypeArray %float_info %float_info
+)";
+
+  const std::string extension = R"(
+%DbgExt = OpExtInstImport "OpenCL.DebugInfo.100"
+)";
+
+  CompileSuccessfully(GenerateShaderCodeForDebugInfo(
+      src, size_const, dbg_inst_header, "", extension, "Vertex"));
+  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
+  EXPECT_THAT(getDiagnosticString(),
+              HasSubstr("Component Count must be OpConstant with a 32- or "
+                        "64-bits integer scalar type or DebugGlobalVariable or "
+                        "DebugLocalVariable with a 32- or 64-bits unsigned "
+                        "integer scalar type"));
+}
+
+TEST_F(ValidateOpenCL100DebugInfo, DebugTypeArrayFailComponentCountFloat) {
+  const std::string src = R"(
+%src = OpString "simple.hlsl"
+%code = OpString "main() {}"
+%float_name = OpString "float"
+)";
+
+  const std::string size_const = R"(
+%int_32 = OpConstant %u32 32
+)";
+
+  const std::string dbg_inst_header = R"(
+%dbg_src = OpExtInst %void %DbgExt DebugSource %src %code
+%comp_unit = OpExtInst %void %DbgExt DebugCompilationUnit 2 4 %dbg_src HLSL
+%float_info = OpExtInst %void %DbgExt DebugTypeBasic %float_name %int_32 Float
+%float_arr_info = OpExtInst %void %DbgExt DebugTypeArray %float_info %f32_4
+)";
+
+  const std::string extension = R"(
+%DbgExt = OpExtInstImport "OpenCL.DebugInfo.100"
+)";
+
+  CompileSuccessfully(GenerateShaderCodeForDebugInfo(
+      src, size_const, dbg_inst_header, "", extension, "Vertex"));
+  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
+  EXPECT_THAT(getDiagnosticString(),
+              HasSubstr("Component Count must be OpConstant with a 32- or "
+                        "64-bits integer scalar type or DebugGlobalVariable or "
+                        "DebugLocalVariable with a 32- or 64-bits unsigned "
+                        "integer scalar type"));
+}
+
+TEST_F(ValidateOpenCL100DebugInfo, DebugTypeArrayFailComponentCountZero) {
+  const std::string src = R"(
+%src = OpString "simple.hlsl"
+%code = OpString "main() {}"
+%float_name = OpString "float"
+)";
+
+  const std::string size_const = R"(
+%int_32 = OpConstant %u32 32
+)";
+
+  const std::string dbg_inst_header = R"(
+%dbg_src = OpExtInst %void %DbgExt DebugSource %src %code
+%comp_unit = OpExtInst %void %DbgExt DebugCompilationUnit 2 4 %dbg_src HLSL
+%float_info = OpExtInst %void %DbgExt DebugTypeBasic %float_name %int_32 Float
+%float_arr_info = OpExtInst %void %DbgExt DebugTypeArray %float_info %u32_0
+)";
+
+  const std::string extension = R"(
+%DbgExt = OpExtInstImport "OpenCL.DebugInfo.100"
+)";
+
+  CompileSuccessfully(GenerateShaderCodeForDebugInfo(
+      src, size_const, dbg_inst_header, "", extension, "Vertex"));
+  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
+  EXPECT_THAT(getDiagnosticString(),
+              HasSubstr("Component Count must be OpConstant with a 32- or "
+                        "64-bits integer scalar type or DebugGlobalVariable or "
+                        "DebugLocalVariable with a 32- or 64-bits unsigned "
+                        "integer scalar type"));
+}
+
+TEST_F(ValidateOpenCL100DebugInfo, DebugTypeArrayFailVariableSizeTypeFloat) {
+  const std::string src = R"(
+%src = OpString "simple.hlsl"
+%code = OpString "main() {}"
+%float_name = OpString "float"
+%main_name = OpString "main"
+%foo_name = OpString "foo"
+)";
+
+  const std::string size_const = R"(
+%int_32 = OpConstant %u32 32
+)";
+
+  const std::string dbg_inst_header = R"(
+%dbg_src = OpExtInst %void %DbgExt DebugSource %src %code
+%comp_unit = OpExtInst %void %DbgExt DebugCompilationUnit 2 4 %dbg_src HLSL
+%float_info = OpExtInst %void %DbgExt DebugTypeBasic %float_name %int_32 Float
+%main_type_info = OpExtInst %void %DbgExt DebugTypeFunction FlagIsPublic %void
+%main_info = OpExtInst %void %DbgExt DebugFunction %main_name %main_type_info %dbg_src 1 1 %comp_unit %main_name FlagIsPublic 1 %main
+%foo_info = OpExtInst %void %DbgExt DebugLocalVariable %foo_name %float_info %dbg_src 1 1 %main_info FlagIsLocal
+%float_arr_info = OpExtInst %void %DbgExt DebugTypeArray %float_info %foo_info
+)";
+
+  const std::string extension = R"(
+%DbgExt = OpExtInstImport "OpenCL.DebugInfo.100"
+)";
+
+  CompileSuccessfully(GenerateShaderCodeForDebugInfo(
+      src, size_const, dbg_inst_header, "", extension, "Vertex"));
+  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
+  EXPECT_THAT(getDiagnosticString(),
+              HasSubstr("Component Count must be OpConstant with a 32- or "
+                        "64-bits integer scalar type or DebugGlobalVariable or "
+                        "DebugLocalVariable with a 32- or 64-bits unsigned "
+                        "integer scalar type"));
+}
+
+TEST_F(ValidateVulkan100DebugInfo, DebugTypeArray) {
+  const std::string src = R"(
+%src = OpString "simple.hlsl"
+%code = OpString "main() {}"
+%float_name = OpString "float"
+)";
+
+  const std::string constants = R"(
+%u32_4 = OpConstant %u32 4
+%u32_5 = OpConstant %u32 5
+%u32_32 = OpConstant %u32 32
+)";
+
+  const std::string dbg_inst_header = R"(
+%dbg_src = OpExtInst %void %DbgExt DebugSource %src %code
+%comp_unit = OpExtInst %void %DbgExt DebugCompilationUnit %u32_2 %u32_4 %dbg_src %u32_5
+%float_info = OpExtInst %void %DbgExt DebugTypeBasic %float_name %u32_32 %u32_3 %u32_0
+%float_arr_info = OpExtInst %void %DbgExt DebugTypeArray %float_info %u32_32
+)";
+
+  const std::string extension = R"(
+OpExtension "SPV_KHR_non_semantic_info"
+%DbgExt = OpExtInstImport "NonSemantic.Vulkan.DebugInfo.100"
+)";
+
+  CompileSuccessfully(GenerateShaderCodeForDebugInfo(
+      src, constants, dbg_inst_header, "", extension, "Vertex"));
+  ASSERT_EQ(SPV_SUCCESS, ValidateInstructions());
+}
+
+TEST_F(ValidateVulkan100DebugInfo, DebugTypeArrayWithVariableSize) {
+  const std::string src = R"(
+%src = OpString "simple.hlsl"
+%code = OpString "main() {}"
+%float_name = OpString "float"
+%uint_name = OpString "uint"
+%main_name = OpString "main"
+%foo_name = OpString "foo"
+)";
+
+  const std::string constants = R"(
+%u32_4 = OpConstant %u32 4
+%u32_5 = OpConstant %u32 5
+%u32_6 = OpConstant %u32 6
+%u32_32 = OpConstant %u32 32
+)";
+
+  const std::string dbg_inst_header = R"(
+%dbg_src = OpExtInst %void %DbgExt DebugSource %src %code
+%comp_unit = OpExtInst %void %DbgExt DebugCompilationUnit %u32_2 %u32_4 %dbg_src %u32_5
+%float_info = OpExtInst %void %DbgExt DebugTypeBasic %float_name %u32_32 %u32_3 %u32_0
+%uint_info = OpExtInst %void %DbgExt DebugTypeBasic %uint_name %u32_32 %u32_6 %u32_0
+%main_type_info = OpExtInst %void %DbgExt DebugTypeFunction %u32_3 %void
+%main_info = OpExtInst %void %DbgExt DebugFunction %main_name %main_type_info %dbg_src %u32_1 %u32_1 %comp_unit %main_name %u32_3 %u32_1
+%foo_info = OpExtInst %void %DbgExt DebugLocalVariable %foo_name %uint_info %dbg_src %u32_1 %u32_1 %main_info %u32_4
+%float_arr_info = OpExtInst %void %DbgExt DebugTypeArray %float_info %foo_info
+)";
+
+  const std::string extension = R"(
+OpExtension "SPV_KHR_non_semantic_info"
+%DbgExt = OpExtInstImport "NonSemantic.Vulkan.DebugInfo.100"
+)";
+
+  CompileSuccessfully(GenerateShaderCodeForDebugInfo(
+      src, constants, dbg_inst_header, "", extension, "Vertex"));
+  ASSERT_EQ(SPV_SUCCESS, ValidateInstructions());
+}
+
+TEST_F(ValidateVulkan100DebugInfo, DebugTypeArrayFailBaseType) {
+  const std::string src = R"(
+%src = OpString "simple.hlsl"
+%code = OpString "main() {}"
+%float_name = OpString "float"
+)";
+
+  const std::string constants = R"(
+%u32_4 = OpConstant %u32 4
+%u32_5 = OpConstant %u32 5
+%u32_32 = OpConstant %u32 32
+)";
+
+  const std::string dbg_inst_header = R"(
+%dbg_src = OpExtInst %void %DbgExt DebugSource %src %code
+%comp_unit = OpExtInst %void %DbgExt DebugCompilationUnit %u32_2 %u32_4 %dbg_src %u32_5
+%float_info = OpExtInst %void %DbgExt DebugTypeBasic %float_name %u32_32 %u32_3 %u32_0
+%float_arr_info = OpExtInst %void %DbgExt DebugTypeArray %comp_unit %u32_32
+)";
+
+  const std::string extension = R"(
+OpExtension "SPV_KHR_non_semantic_info"
+%DbgExt = OpExtInstImport "NonSemantic.Vulkan.DebugInfo.100"
+)";
+
+  CompileSuccessfully(GenerateShaderCodeForDebugInfo(
+      src, constants, dbg_inst_header, "", extension, "Vertex"));
+  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
+  EXPECT_THAT(getDiagnosticString(),
+              HasSubstr("expected operand Base Type is not a valid debug "
+                        "type"));
+}
+
+TEST_F(ValidateVulkan100DebugInfo, DebugTypeArrayFailComponentCount) {
+  const std::string src = R"(
+%src = OpString "simple.hlsl"
+%code = OpString "main() {}"
+%float_name = OpString "float"
+)";
+
+  const std::string constants = R"(
+%u32_4 = OpConstant %u32 4
+%u32_5 = OpConstant %u32 5
+%u32_32 = OpConstant %u32 32
+)";
+
+  const std::string dbg_inst_header = R"(
+%dbg_src = OpExtInst %void %DbgExt DebugSource %src %code
+%comp_unit = OpExtInst %void %DbgExt DebugCompilationUnit %u32_2 %u32_4 %dbg_src %u32_5
+%float_info = OpExtInst %void %DbgExt DebugTypeBasic %float_name %u32_32 %u32_3 %u32_0
+%float_arr_info = OpExtInst %void %DbgExt DebugTypeArray %float_info %float_info
+)";
+
+  const std::string extension = R"(
+OpExtension "SPV_KHR_non_semantic_info"
+%DbgExt = OpExtInstImport "NonSemantic.Vulkan.DebugInfo.100"
+)";
+
+  CompileSuccessfully(GenerateShaderCodeForDebugInfo(
+      src, constants, dbg_inst_header, "", extension, "Vertex"));
+  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
+  EXPECT_THAT(getDiagnosticString(),
+              HasSubstr("Component Count must be OpConstant with a 32- or "
+                        "64-bits integer scalar type or DebugGlobalVariable or "
+                        "DebugLocalVariable with a 32- or 64-bits unsigned "
+                        "integer scalar type"));
+}
+
+TEST_F(ValidateVulkan100DebugInfo, DebugTypeArrayFailComponentCountFloat) {
+  const std::string src = R"(
+%src = OpString "simple.hlsl"
+%code = OpString "main() {}"
+%float_name = OpString "float"
+)";
+
+  const std::string constants = R"(
+%u32_4 = OpConstant %u32 4
+%u32_5 = OpConstant %u32 5
+%u32_32 = OpConstant %u32 32
+)";
+
+  const std::string dbg_inst_header = R"(
+%dbg_src = OpExtInst %void %DbgExt DebugSource %src %code
+%comp_unit = OpExtInst %void %DbgExt DebugCompilationUnit %u32_2 %u32_4 %dbg_src %u32_5
+%float_info = OpExtInst %void %DbgExt DebugTypeBasic %float_name %u32_32 %u32_3 %u32_0
+%float_arr_info = OpExtInst %void %DbgExt DebugTypeArray %float_info %f32_4
+)";
+
+  const std::string extension = R"(
+OpExtension "SPV_KHR_non_semantic_info"
+%DbgExt = OpExtInstImport "NonSemantic.Vulkan.DebugInfo.100"
+)";
+
+  CompileSuccessfully(GenerateShaderCodeForDebugInfo(
+      src, constants, dbg_inst_header, "", extension, "Vertex"));
+  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
+  EXPECT_THAT(getDiagnosticString(),
+              HasSubstr("Component Count must be OpConstant with a 32- or "
+                        "64-bits integer scalar type or DebugGlobalVariable or "
+                        "DebugLocalVariable with a 32- or 64-bits unsigned "
+                        "integer scalar type"));
+}
+
+TEST_F(ValidateVulkan100DebugInfo, DebugTypeArrayFailComponentCountZero) {
+  const std::string src = R"(
+%src = OpString "simple.hlsl"
+%code = OpString "main() {}"
+%float_name = OpString "float"
+)";
+
+  const std::string constants = R"(
+%u32_4 = OpConstant %u32 4
+%u32_5 = OpConstant %u32 5
+%u32_32 = OpConstant %u32 32
+)";
+
+  const std::string dbg_inst_header = R"(
+%dbg_src = OpExtInst %void %DbgExt DebugSource %src %code
+%comp_unit = OpExtInst %void %DbgExt DebugCompilationUnit %u32_2 %u32_4 %dbg_src %u32_5
+%float_info = OpExtInst %void %DbgExt DebugTypeBasic %float_name %u32_32 %u32_3 %u32_0
+%float_arr_info = OpExtInst %void %DbgExt DebugTypeArray %float_info %u32_0
+)";
+
+  const std::string extension = R"(
+OpExtension "SPV_KHR_non_semantic_info"
+%DbgExt = OpExtInstImport "NonSemantic.Vulkan.DebugInfo.100"
+)";
+
+  CompileSuccessfully(GenerateShaderCodeForDebugInfo(
+      src, constants, dbg_inst_header, "", extension, "Vertex"));
+  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
+  EXPECT_THAT(getDiagnosticString(),
+              HasSubstr("Component Count must be OpConstant with a 32- or "
+                        "64-bits integer scalar type or DebugGlobalVariable or "
+                        "DebugLocalVariable with a 32- or 64-bits unsigned "
+                        "integer scalar type"));
+}
+
+TEST_F(ValidateVulkan100DebugInfo, DebugTypeArrayFailVariableSizeTypeFloat) {
+  const std::string src = R"(
+%src = OpString "simple.hlsl"
+%code = OpString "main() {}"
+%float_name = OpString "float"
+%main_name = OpString "main"
+%foo_name = OpString "foo"
+)";
+
+  const std::string constants = R"(
+%u32_4 = OpConstant %u32 4
+%u32_5 = OpConstant %u32 5
+%u32_6 = OpConstant %u32 6
+%u32_32 = OpConstant %u32 32
+)";
+
+  const std::string dbg_inst_header = R"(
+%dbg_src = OpExtInst %void %DbgExt DebugSource %src %code
+%comp_unit = OpExtInst %void %DbgExt DebugCompilationUnit %u32_2 %u32_4 %dbg_src %u32_5
+%float_info = OpExtInst %void %DbgExt DebugTypeBasic %float_name %u32_32 %u32_3 %u32_0
+%main_type_info = OpExtInst %void %DbgExt DebugTypeFunction %u32_3 %void
+%main_info = OpExtInst %void %DbgExt DebugFunction %main_name %main_type_info %dbg_src %u32_1 %u32_1 %comp_unit %main_name %u32_3 %u32_1
+%foo_info = OpExtInst %void %DbgExt DebugLocalVariable %foo_name %float_info %dbg_src %u32_1 %u32_1 %main_info %u32_4
+%float_arr_info = OpExtInst %void %DbgExt DebugTypeArray %float_info %foo_info
+)";
+
+  const std::string extension = R"(
+OpExtension "SPV_KHR_non_semantic_info"
+%DbgExt = OpExtInstImport "NonSemantic.Vulkan.DebugInfo.100"
+)";
+
+  CompileSuccessfully(GenerateShaderCodeForDebugInfo(
+      src, constants, dbg_inst_header, "", extension, "Vertex"));
+  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
+  EXPECT_THAT(getDiagnosticString(),
+              HasSubstr("Component Count must be OpConstant with a 32- or "
+                        "64-bits integer scalar type or DebugGlobalVariable or "
+                        "DebugLocalVariable with a 32- or 64-bits unsigned "
+                        "integer scalar type"));
+}
+
+TEST_F(ValidateOpenCL100DebugInfo, DebugTypeVector) {
+  const std::string src = R"(
+%src = OpString "simple.hlsl"
+%code = OpString "main() {}"
+%float_name = OpString "float"
+)";
+
+  const std::string size_const = R"(
+%int_32 = OpConstant %u32 32
+)";
+
+  const std::string dbg_inst_header = R"(
+%dbg_src = OpExtInst %void %DbgExt DebugSource %src %code
+%comp_unit = OpExtInst %void %DbgExt DebugCompilationUnit 2 4 %dbg_src HLSL
+%float_info = OpExtInst %void %DbgExt DebugTypeBasic %float_name %int_32 Float
+%vfloat_info = OpExtInst %void %DbgExt DebugTypeVector %float_info 4
+)";
+
+  const std::string extension = R"(
+%DbgExt = OpExtInstImport "OpenCL.DebugInfo.100"
+)";
+
+  CompileSuccessfully(GenerateShaderCodeForDebugInfo(
+      src, size_const, dbg_inst_header, "", extension, "Vertex"));
+  ASSERT_EQ(SPV_SUCCESS, ValidateInstructions());
+}
+
+TEST_F(ValidateOpenCL100DebugInfo, DebugTypeVectorFail) {
+  const std::string src = R"(
+%src = OpString "simple.hlsl"
+%code = OpString "main() {}"
+%float_name = OpString "float"
+)";
+
+  const std::string size_const = R"(
+%int_32 = OpConstant %u32 32
+)";
+
+  const std::string dbg_inst_header = R"(
+%dbg_src = OpExtInst %void %DbgExt DebugSource %src %code
+%comp_unit = OpExtInst %void %DbgExt DebugCompilationUnit 2 4 %dbg_src HLSL
+%float_info = OpExtInst %void %DbgExt DebugTypeBasic %float_name %int_32 Float
+%vfloat_info = OpExtInst %void %DbgExt DebugTypeVector %dbg_src 4
+)";
+
+  const std::string extension = R"(
+%DbgExt = OpExtInstImport "OpenCL.DebugInfo.100"
+)";
+
+  CompileSuccessfully(GenerateShaderCodeForDebugInfo(
+      src, size_const, dbg_inst_header, "", extension, "Vertex"));
+  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
+  EXPECT_THAT(getDiagnosticString(),
+              HasSubstr("expected operand Base Type must be a result id of "
+                        "DebugTypeBasic"));
+}
+
+TEST_F(ValidateOpenCL100DebugInfo, DebugTypeVectorFailComponentZero) {
+  const std::string src = R"(
+%src = OpString "simple.hlsl"
+%code = OpString "main() {}"
+%float_name = OpString "float"
+)";
+
+  const std::string size_const = R"(
+%int_32 = OpConstant %u32 32
+)";
+
+  const std::string dbg_inst_header = R"(
+%dbg_src = OpExtInst %void %DbgExt DebugSource %src %code
+%comp_unit = OpExtInst %void %DbgExt DebugCompilationUnit 2 4 %dbg_src HLSL
+%float_info = OpExtInst %void %DbgExt DebugTypeBasic %float_name %int_32 Float
+%vfloat_info = OpExtInst %void %DbgExt DebugTypeVector %dbg_src 0
+)";
+
+  const std::string extension = R"(
+%DbgExt = OpExtInstImport "OpenCL.DebugInfo.100"
+)";
+
+  CompileSuccessfully(GenerateShaderCodeForDebugInfo(
+      src, size_const, dbg_inst_header, "", extension, "Vertex"));
+  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
+  EXPECT_THAT(getDiagnosticString(),
+              HasSubstr("expected operand Base Type must be a result id of "
+                        "DebugTypeBasic"));
+}
+
+TEST_F(ValidateOpenCL100DebugInfo, DebugTypeVectorFailComponentFive) {
+  const std::string src = R"(
+%src = OpString "simple.hlsl"
+%code = OpString "main() {}"
+%float_name = OpString "float"
+)";
+
+  const std::string size_const = R"(
+%int_32 = OpConstant %u32 32
+)";
+
+  const std::string dbg_inst_header = R"(
+%dbg_src = OpExtInst %void %DbgExt DebugSource %src %code
+%comp_unit = OpExtInst %void %DbgExt DebugCompilationUnit 2 4 %dbg_src HLSL
+%float_info = OpExtInst %void %DbgExt DebugTypeBasic %float_name %int_32 Float
+%vfloat_info = OpExtInst %void %DbgExt DebugTypeVector %dbg_src 5
+)";
+
+  const std::string extension = R"(
+%DbgExt = OpExtInstImport "OpenCL.DebugInfo.100"
+)";
+
+  CompileSuccessfully(GenerateShaderCodeForDebugInfo(
+      src, size_const, dbg_inst_header, "", extension, "Vertex"));
+  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
+  EXPECT_THAT(getDiagnosticString(),
+              HasSubstr("expected operand Base Type must be a result id of "
+                        "DebugTypeBasic"));
+}
+
+TEST_F(ValidateVulkan100DebugInfo, DebugTypeVector) {
+  const std::string src = R"(
+%src = OpString "simple.hlsl"
+%code = OpString "main() {}"
+%float_name = OpString "float"
+)";
+
+  const std::string constants = R"(
+%u32_4 = OpConstant %u32 4
+%u32_5 = OpConstant %u32 5
+%u32_32 = OpConstant %u32 32
+)";
+
+  const std::string dbg_inst_header = R"(
+%dbg_src = OpExtInst %void %DbgExt DebugSource %src %code
+%comp_unit = OpExtInst %void %DbgExt DebugCompilationUnit %u32_2 %u32_4 %dbg_src %u32_5
+%float_info = OpExtInst %void %DbgExt DebugTypeBasic %float_name %u32_32 %u32_3 %u32_0
+%vfloat_info = OpExtInst %void %DbgExt DebugTypeVector %float_info %u32_4
+)";
+
+  const std::string extension = R"(
+OpExtension "SPV_KHR_non_semantic_info"
+%DbgExt = OpExtInstImport "NonSemantic.Vulkan.DebugInfo.100"
+)";
+
+  CompileSuccessfully(GenerateShaderCodeForDebugInfo(
+      src, constants, dbg_inst_header, "", extension, "Vertex"));
+  ASSERT_EQ(SPV_SUCCESS, ValidateInstructions());
+}
+
+TEST_F(ValidateVulkan100DebugInfo, DebugTypeVectorFail) {
+  const std::string src = R"(
+%src = OpString "simple.hlsl"
+%code = OpString "main() {}"
+%float_name = OpString "float"
+)";
+
+  const std::string constants = R"(
+%u32_4 = OpConstant %u32 4
+%u32_5 = OpConstant %u32 5
+%u32_32 = OpConstant %u32 32
+)";
+
+  const std::string dbg_inst_header = R"(
+%dbg_src = OpExtInst %void %DbgExt DebugSource %src %code
+%comp_unit = OpExtInst %void %DbgExt DebugCompilationUnit %u32_2 %u32_4 %dbg_src %u32_5
+%float_info = OpExtInst %void %DbgExt DebugTypeBasic %float_name %u32_32 %u32_3 %u32_0
+%vfloat_info = OpExtInst %void %DbgExt DebugTypeVector %dbg_src %u32_4
+)";
+
+  const std::string extension = R"(
+OpExtension "SPV_KHR_non_semantic_info"
+%DbgExt = OpExtInstImport "NonSemantic.Vulkan.DebugInfo.100"
+)";
+
+  CompileSuccessfully(GenerateShaderCodeForDebugInfo(
+      src, constants, dbg_inst_header, "", extension, "Vertex"));
+  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
+  EXPECT_THAT(getDiagnosticString(),
+              HasSubstr("expected operand Base Type must be a result id of "
+                        "DebugTypeBasic"));
+}
+
+TEST_F(ValidateVulkan100DebugInfo, DebugTypeVectorFailComponentZero) {
+  const std::string src = R"(
+%src = OpString "simple.hlsl"
+%code = OpString "main() {}"
+%float_name = OpString "float"
+)";
+
+  const std::string constants = R"(
+%u32_4 = OpConstant %u32 4
+%u32_5 = OpConstant %u32 5
+%u32_32 = OpConstant %u32 32
+)";
+
+  const std::string dbg_inst_header = R"(
+%dbg_src = OpExtInst %void %DbgExt DebugSource %src %code
+%comp_unit = OpExtInst %void %DbgExt DebugCompilationUnit %u32_2 %u32_4 %dbg_src %u32_5
+%float_info = OpExtInst %void %DbgExt DebugTypeBasic %float_name %u32_32 %u32_3 %u32_0
+%vfloat_info = OpExtInst %void %DbgExt DebugTypeVector %float_info %u32_0
+)";
+
+  const std::string extension = R"(
+OpExtension "SPV_KHR_non_semantic_info"
+%DbgExt = OpExtInstImport "NonSemantic.Vulkan.DebugInfo.100"
+)";
+
+  CompileSuccessfully(GenerateShaderCodeForDebugInfo(
+      src, constants, dbg_inst_header, "", extension, "Vertex"));
+  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
+  EXPECT_THAT(getDiagnosticString(),
+              HasSubstr("Component Count must be positive "
+                        "integer less than or equal to 4"));
+}
+
+TEST_F(ValidateVulkan100DebugInfo, DebugTypeVectorFailComponentFive) {
+  const std::string src = R"(
+%src = OpString "simple.hlsl"
+%code = OpString "main() {}"
+%float_name = OpString "float"
+)";
+
+  const std::string constants = R"(
+%u32_4 = OpConstant %u32 4
+%u32_5 = OpConstant %u32 5
+%u32_32 = OpConstant %u32 32
+)";
+
+  const std::string dbg_inst_header = R"(
+%dbg_src = OpExtInst %void %DbgExt DebugSource %src %code
+%comp_unit = OpExtInst %void %DbgExt DebugCompilationUnit %u32_2 %u32_4 %dbg_src %u32_5
+%float_info = OpExtInst %void %DbgExt DebugTypeBasic %float_name %u32_32 %u32_3 %u32_0
+%vfloat_info = OpExtInst %void %DbgExt DebugTypeVector %float_info %u32_5
+)";
+
+  const std::string extension = R"(
+OpExtension "SPV_KHR_non_semantic_info"
+%DbgExt = OpExtInstImport "NonSemantic.Vulkan.DebugInfo.100"
+)";
+
+  CompileSuccessfully(GenerateShaderCodeForDebugInfo(
+      src, constants, dbg_inst_header, "", extension, "Vertex"));
+  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
+  EXPECT_THAT(getDiagnosticString(),
+              HasSubstr("Component Count must be positive "
+                        "integer less than or equal to 4"));
+}
+
+TEST_F(ValidateOpenCL100DebugInfo, DebugTypedef) {
+  const std::string src = R"(
+%src = OpString "simple.hlsl"
+%code = OpString "main() {}"
+%float_name = OpString "float"
+%foo_name = OpString "foo"
+)";
+
+  const std::string size_const = R"(
+%int_32 = OpConstant %u32 32
+)";
+
+  const std::string dbg_inst_header = R"(
+%dbg_src = OpExtInst %void %DbgExt DebugSource %src %code
+%comp_unit = OpExtInst %void %DbgExt DebugCompilationUnit 2 4 %dbg_src HLSL
+%float_info = OpExtInst %void %DbgExt DebugTypeBasic %float_name %int_32 Float
+%foo_info = OpExtInst %void %DbgExt DebugTypedef %foo_name %float_info %dbg_src 1 1 %comp_unit
+)";
+
+  const std::string extension = R"(
+%DbgExt = OpExtInstImport "OpenCL.DebugInfo.100"
+)";
+
+  CompileSuccessfully(GenerateShaderCodeForDebugInfo(
+      src, size_const, dbg_inst_header, "", extension, "Vertex"));
+  ASSERT_EQ(SPV_SUCCESS, ValidateInstructions());
+}
+
+TEST_P(ValidateOpenCL100DebugInfoDebugTypedef, Fail) {
+  const std::string src = R"(
+%src = OpString "simple.hlsl"
+%code = OpString "main() {}"
+%float_name = OpString "float"
+%foo_name = OpString "foo"
+)";
+
+  const std::string size_const = R"(
+%int_32 = OpConstant %u32 32
+)";
+
+  const auto& param = GetParam();
+
+  std::ostringstream ss;
+  ss << R"(
+%dbg_src = OpExtInst %void %DbgExt DebugSource %src %code
+%comp_unit = OpExtInst %void %DbgExt DebugCompilationUnit 2 4 %dbg_src HLSL
+%float_info = OpExtInst %void %DbgExt DebugTypeBasic %float_name %int_32 Float
+%foo_info = OpExtInst %void %DbgExt DebugTypedef )";
+  ss << param.first;
+
+  const std::string extension = R"(
+%DbgExt = OpExtInstImport "OpenCL.DebugInfo.100"
+)";
+
+  CompileSuccessfully(GenerateShaderCodeForDebugInfo(src, size_const, ss.str(),
+                                                     "", extension, "Vertex"));
+  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
+  EXPECT_THAT(getDiagnosticString(),
+              HasSubstr("expected operand " + param.second +
+                        " must be a result id of "));
+}
+
+INSTANTIATE_TEST_SUITE_P(
+    AllOpenCL100DebugInfoFail, ValidateOpenCL100DebugInfoDebugTypedef,
+    ::testing::ValuesIn(std::vector<std::pair<std::string, std::string>>{
+        std::make_pair(R"(%dbg_src %float_info %dbg_src 1 1 %comp_unit)",
+                       "Name"),
+        std::make_pair(R"(%foo_name %dbg_src %dbg_src 1 1 %comp_unit)",
+                       "Base Type"),
+        std::make_pair(R"(%foo_name %float_info %comp_unit 1 1 %comp_unit)",
+                       "Source"),
+        std::make_pair(R"(%foo_name %float_info %dbg_src 1 1 %dbg_src)",
+                       "Parent"),
+    }));
+
+TEST_F(ValidateVulkan100DebugInfo, DebugTypedef) {
+  const std::string src = R"(
+%src = OpString "simple.hlsl"
+%code = OpString "main() {}"
+%float_name = OpString "float"
+%foo_name = OpString "foo"
+)";
+
+  const std::string constants = R"(
+%u32_4 = OpConstant %u32 4
+%u32_5 = OpConstant %u32 5
+%u32_32 = OpConstant %u32 32
+)";
+
+  const std::string dbg_inst_header = R"(
+%dbg_src = OpExtInst %void %DbgExt DebugSource %src %code
+%comp_unit = OpExtInst %void %DbgExt DebugCompilationUnit %u32_2 %u32_4 %dbg_src %u32_5
+%float_info = OpExtInst %void %DbgExt DebugTypeBasic %float_name %u32_32 %u32_3 %u32_0
+%foo_info = OpExtInst %void %DbgExt DebugTypedef %foo_name %float_info %dbg_src %u32_1 %u32_1 %comp_unit
+)";
+
+  const std::string extension = R"(
+OpExtension "SPV_KHR_non_semantic_info"
+%DbgExt = OpExtInstImport "NonSemantic.Vulkan.DebugInfo.100"
+)";
+
+  CompileSuccessfully(GenerateShaderCodeForDebugInfo(
+      src, constants, dbg_inst_header, "", extension, "Vertex"));
+  ASSERT_EQ(SPV_SUCCESS, ValidateInstructions());
+}
+
+TEST_P(ValidateVulkan100DebugInfoDebugTypedef, Fail) {
+  const std::string src = R"(
+%src = OpString "simple.hlsl"
+%code = OpString "main() {}"
+%float_name = OpString "float"
+%foo_name = OpString "foo"
+)";
+
+  const std::string constants = R"(
+%u32_4 = OpConstant %u32 4
+%u32_5 = OpConstant %u32 5
+%u32_32 = OpConstant %u32 32
+)";
+
+  const auto& param = GetParam();
+
+  std::ostringstream ss;
+  ss << R"(
+%dbg_src = OpExtInst %void %DbgExt DebugSource %src %code
+%comp_unit = OpExtInst %void %DbgExt DebugCompilationUnit %u32_2 %u32_4 %dbg_src %u32_5
+%float_info = OpExtInst %void %DbgExt DebugTypeBasic %float_name %u32_32 %u32_3 %u32_0
+%foo_info = OpExtInst %void %DbgExt DebugTypedef )";
+  ss << param.first;
+
+  const std::string extension = R"(
+OpExtension "SPV_KHR_non_semantic_info"
+%DbgExt = OpExtInstImport "NonSemantic.Vulkan.DebugInfo.100"
+)";
+
+  CompileSuccessfully(GenerateShaderCodeForDebugInfo(src, constants, ss.str(),
+                                                     "", extension, "Vertex"));
+  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
+  EXPECT_THAT(getDiagnosticString(),
+              HasSubstr("expected operand " + param.second +
+                        " must be a result id of "));
+}
+
+INSTANTIATE_TEST_SUITE_P(
+    AllVulkan100DebugInfoFail, ValidateVulkan100DebugInfoDebugTypedef,
+    ::testing::ValuesIn(std::vector<std::pair<std::string, std::string>>{
+        std::make_pair(
+            R"(%dbg_src %float_info %dbg_src %u32_1 %u32_1 %comp_unit)",
+            "Name"),
+        std::make_pair(
+            R"(%foo_name %dbg_src %dbg_src %u32_1 %u32_1 %comp_unit)",
+            "Base Type"),
+        std::make_pair(
+            R"(%foo_name %float_info %comp_unit %u32_1 %u32_1 %comp_unit)",
+            "Source"),
+        std::make_pair(
+            R"(%foo_name %float_info %dbg_src %u32_1 %u32_1 %dbg_src)",
+            "Parent"),
+    }));
+
+TEST_F(ValidateOpenCL100DebugInfo, DebugTypeFunction) {
+  const std::string src = R"(
+%src = OpString "simple.hlsl"
+%code = OpString "main() {}"
+%main_name = OpString "main"
+%main_linkage_name = OpString "v_main"
+%float_name = OpString "float"
+)";
+
+  const std::string size_const = R"(
+%int_32 = OpConstant %u32 32
+)";
+
+  const std::string dbg_inst_header = R"(
+%dbg_src = OpExtInst %void %DbgExt DebugSource %src %code
+%comp_unit = OpExtInst %void %DbgExt DebugCompilationUnit 2 4 %dbg_src HLSL
+%float_info = OpExtInst %void %DbgExt DebugTypeBasic %float_name %int_32 Float
+%main_type_info1 = OpExtInst %void %DbgExt DebugTypeFunction FlagIsPublic %void
+%main_type_info2 = OpExtInst %void %DbgExt DebugTypeFunction FlagIsPublic %float_info
+%main_type_info3 = OpExtInst %void %DbgExt DebugTypeFunction FlagIsPublic %float_info %float_info
+%main_type_info4 = OpExtInst %void %DbgExt DebugTypeFunction FlagIsPublic %void %float_info %float_info
+)";
+
+  const std::string extension = R"(
+%DbgExt = OpExtInstImport "OpenCL.DebugInfo.100"
+)";
+
+  CompileSuccessfully(GenerateShaderCodeForDebugInfo(
+      src, size_const, dbg_inst_header, "", extension, "Vertex"));
+  ASSERT_EQ(SPV_SUCCESS, ValidateInstructions());
+}
+
+TEST_F(ValidateOpenCL100DebugInfo, DebugTypeFunctionFailReturn) {
+  const std::string src = R"(
+%src = OpString "simple.hlsl"
+%code = OpString "main() {}"
+%main_name = OpString "main"
+%main_linkage_name = OpString "v_main"
+%float_name = OpString "float"
+)";
+
+  const std::string size_const = R"(
+%int_32 = OpConstant %u32 32
+)";
+
+  const std::string dbg_inst_header = R"(
+%dbg_src = OpExtInst %void %DbgExt DebugSource %src %code
+%comp_unit = OpExtInst %void %DbgExt DebugCompilationUnit 2 4 %dbg_src HLSL
+%float_info = OpExtInst %void %DbgExt DebugTypeBasic %float_name %int_32 Float
+%main_type_info = OpExtInst %void %DbgExt DebugTypeFunction FlagIsPublic %dbg_src %float_info
+)";
+
+  const std::string extension = R"(
+%DbgExt = OpExtInstImport "OpenCL.DebugInfo.100"
+)";
+
+  CompileSuccessfully(GenerateShaderCodeForDebugInfo(
+      src, size_const, dbg_inst_header, "", extension, "Vertex"));
+  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
+  EXPECT_THAT(
+      getDiagnosticString(),
+      HasSubstr("expected operand Return Type is not a valid debug type"));
+}
+
+TEST_F(ValidateOpenCL100DebugInfo, DebugTypeFunctionFailParam) {
+  const std::string src = R"(
+%src = OpString "simple.hlsl"
+%code = OpString "main() {}"
+%main_name = OpString "main"
+%main_linkage_name = OpString "v_main"
+%float_name = OpString "float"
+)";
+
+  const std::string size_const = R"(
+%int_32 = OpConstant %u32 32
+)";
+
+  const std::string dbg_inst_header = R"(
+%dbg_src = OpExtInst %void %DbgExt DebugSource %src %code
+%comp_unit = OpExtInst %void %DbgExt DebugCompilationUnit 2 4 %dbg_src HLSL
+%float_info = OpExtInst %void %DbgExt DebugTypeBasic %float_name %int_32 Float
+%main_type_info = OpExtInst %void %DbgExt DebugTypeFunction FlagIsPublic %float_info %void
+)";
+
+  const std::string extension = R"(
+%DbgExt = OpExtInstImport "OpenCL.DebugInfo.100"
+)";
+
+  CompileSuccessfully(GenerateShaderCodeForDebugInfo(
+      src, size_const, dbg_inst_header, "", extension, "Vertex"));
+  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
+  EXPECT_THAT(
+      getDiagnosticString(),
+      HasSubstr("expected operand Parameter Types is not a valid debug type"));
+}
+
+TEST_F(ValidateVulkan100DebugInfo, DebugTypeFunctionAndParams) {
+  const std::string src = R"(
+%src = OpString "simple.hlsl"
+%code = OpString "main() {}"
+%main_name = OpString "main"
+%main_linkage_name = OpString "v_main"
+%float_name = OpString "float"
+)";
+
+  const std::string constants = R"(
+%u32_4 = OpConstant %u32 4
+%u32_5 = OpConstant %u32 5
+%u32_32 = OpConstant %u32 32
+)";
+
+  const std::string dbg_inst_header = R"(
+%dbg_src = OpExtInst %void %DbgExt DebugSource %src %code
+%comp_unit = OpExtInst %void %DbgExt DebugCompilationUnit %u32_2 %u32_4 %dbg_src %u32_5
+%float_info = OpExtInst %void %DbgExt DebugTypeBasic %float_name %u32_32 %u32_3 %u32_0
+%main_type_info1 = OpExtInst %void %DbgExt DebugTypeFunction %u32_3 %void
+%main_type_info2 = OpExtInst %void %DbgExt DebugTypeFunction %u32_3 %float_info
+%main_type_info3 = OpExtInst %void %DbgExt DebugTypeFunction %u32_3 %float_info %float_info
+%main_type_info4 = OpExtInst %void %DbgExt DebugTypeFunction %u32_3 %void %float_info %float_info
+)";
+
+  const std::string extension = R"(
+OpExtension "SPV_KHR_non_semantic_info"
+%DbgExt = OpExtInstImport "NonSemantic.Vulkan.DebugInfo.100"
+)";
+
+  CompileSuccessfully(GenerateShaderCodeForDebugInfo(
+      src, constants, dbg_inst_header, "", extension, "Vertex"));
+  ASSERT_EQ(SPV_SUCCESS, ValidateInstructions());
+}
+
+TEST_F(ValidateVulkan100DebugInfo, DebugTypeFunctionFailReturn) {
+  const std::string src = R"(
+%src = OpString "simple.hlsl"
+%code = OpString "main() {}"
+%main_name = OpString "main"
+%main_linkage_name = OpString "v_main"
+%float_name = OpString "float"
+)";
+
+  const std::string constants = R"(
+%u32_4 = OpConstant %u32 4
+%u32_5 = OpConstant %u32 5
+%u32_32 = OpConstant %u32 32
+)";
+
+  const std::string dbg_inst_header = R"(
+%dbg_src = OpExtInst %void %DbgExt DebugSource %src %code
+%comp_unit = OpExtInst %void %DbgExt DebugCompilationUnit %u32_2 %u32_4 %dbg_src %u32_5
+%float_info = OpExtInst %void %DbgExt DebugTypeBasic %float_name %u32_32 %u32_3 %u32_0
+%main_type_info = OpExtInst %void %DbgExt DebugTypeFunction %u32_3 %dbg_src %float_info
+)";
+
+  const std::string extension = R"(
+OpExtension "SPV_KHR_non_semantic_info"
+%DbgExt = OpExtInstImport "NonSemantic.Vulkan.DebugInfo.100"
+)";
+
+  CompileSuccessfully(GenerateShaderCodeForDebugInfo(
+      src, constants, dbg_inst_header, "", extension, "Vertex"));
+  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
+  EXPECT_THAT(
+      getDiagnosticString(),
+      HasSubstr("expected operand Return Type is not a valid debug type"));
+}
+
+TEST_F(ValidateVulkan100DebugInfo, DebugTypeFunctionFailParam) {
+  const std::string src = R"(
+%src = OpString "simple.hlsl"
+%code = OpString "main() {}"
+%main_name = OpString "main"
+%main_linkage_name = OpString "v_main"
+%float_name = OpString "float"
+)";
+
+  const std::string constants = R"(
+%u32_4 = OpConstant %u32 4
+%u32_5 = OpConstant %u32 5
+%u32_32 = OpConstant %u32 32
+)";
+
+  const std::string dbg_inst_header = R"(
+%dbg_src = OpExtInst %void %DbgExt DebugSource %src %code
+%comp_unit = OpExtInst %void %DbgExt DebugCompilationUnit %u32_2 %u32_4 %dbg_src %u32_5
+%float_info = OpExtInst %void %DbgExt DebugTypeBasic %float_name %u32_32 %u32_3 %u32_0
+%main_type_info = OpExtInst %void %DbgExt DebugTypeFunction %u32_3 %float_info %void
+)";
+
+  const std::string extension = R"(
+OpExtension "SPV_KHR_non_semantic_info"
+%DbgExt = OpExtInstImport "NonSemantic.Vulkan.DebugInfo.100"
+)";
+
+  CompileSuccessfully(GenerateShaderCodeForDebugInfo(
+      src, constants, dbg_inst_header, "", extension, "Vertex"));
+  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
+  EXPECT_THAT(
+      getDiagnosticString(),
+      HasSubstr("expected operand Parameter Types is not a valid debug type"));
+}
+
+TEST_F(ValidateOpenCL100DebugInfo, DebugTypeEnum) {
+  const std::string src = R"(
+%src = OpString "simple.hlsl"
+%code = OpString "main() {}"
+%float_name = OpString "float"
+%foo_name = OpString "foo"
+)";
+
+  const std::string size_const = R"(
+%int_32 = OpConstant %u32 32
+)";
+
+  const std::string dbg_inst_header = R"(
+%dbg_src = OpExtInst %void %DbgExt DebugSource %src %code
+%comp_unit = OpExtInst %void %DbgExt DebugCompilationUnit 2 4 %dbg_src HLSL
+%none = OpExtInst %void %DbgExt DebugInfoNone
+%float_info = OpExtInst %void %DbgExt DebugTypeBasic %float_name %int_32 Float
+%foo_info1 = OpExtInst %void %DbgExt DebugTypeEnum %foo_name %float_info %dbg_src 1 1 %comp_unit %int_32 FlagIsPublic %u32_0 %foo_name %u32_1 %foo_name
+%foo_info2 = OpExtInst %void %DbgExt DebugTypeEnum %foo_name %none %dbg_src 1 1 %comp_unit %int_32 FlagIsPublic %u32_0 %foo_name %u32_1 %foo_name
+%foo_info3 = OpExtInst %void %DbgExt DebugTypeEnum %foo_name %none %dbg_src 1 1 %comp_unit %int_32 FlagIsPublic
+)";
+
+  const std::string extension = R"(
+%DbgExt = OpExtInstImport "OpenCL.DebugInfo.100"
+)";
+
+  CompileSuccessfully(GenerateShaderCodeForDebugInfo(
+      src, size_const, dbg_inst_header, "", extension, "Vertex"));
+  ASSERT_EQ(SPV_SUCCESS, ValidateInstructions());
+}
+
+TEST_P(ValidateOpenCL100DebugInfoDebugTypeEnum, Fail) {
+  const std::string src = R"(
+%src = OpString "simple.hlsl"
+%code = OpString "main() {}"
+%float_name = OpString "float"
+%foo_name = OpString "foo"
+)";
+
+  const std::string size_const = R"(
+%int_32 = OpConstant %u32 32
+)";
+
+  const auto& param = GetParam();
+
+  std::ostringstream ss;
+  ss << R"(
+%dbg_src = OpExtInst %void %DbgExt DebugSource %src %code
+%comp_unit = OpExtInst %void %DbgExt DebugCompilationUnit 2 4 %dbg_src HLSL
+%float_info = OpExtInst %void %DbgExt DebugTypeBasic %float_name %int_32 Float
+%foo_info = OpExtInst %void %DbgExt DebugTypeEnum )";
+  ss << param.first;
+
+  const std::string extension = R"(
+%DbgExt = OpExtInstImport "OpenCL.DebugInfo.100"
+)";
+
+  CompileSuccessfully(GenerateShaderCodeForDebugInfo(src, size_const, ss.str(),
+                                                     "", extension, "Vertex"));
+  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
+  EXPECT_THAT(getDiagnosticString(),
+              HasSubstr("expected operand " + param.second));
+}
+
+INSTANTIATE_TEST_SUITE_P(
+    AllOpenCL100DebugInfoFail, ValidateOpenCL100DebugInfoDebugTypeEnum,
+    ::testing::ValuesIn(std::vector<std::pair<std::string, std::string>>{
+        std::make_pair(
+            R"(%dbg_src %float_info %dbg_src 1 1 %comp_unit %int_32 FlagIsPublic %u32_0 %foo_name)",
+            "Name"),
+        std::make_pair(
+            R"(%foo_name %dbg_src %dbg_src 1 1 %comp_unit %int_32 FlagIsPublic %u32_0 %foo_name)",
+            "Underlying Types"),
+        std::make_pair(
+            R"(%foo_name %float_info %comp_unit 1 1 %comp_unit %int_32 FlagIsPublic %u32_0 %foo_name)",
+            "Source"),
+        std::make_pair(
+            R"(%foo_name %float_info %dbg_src 1 1 %dbg_src %int_32 FlagIsPublic %u32_0 %foo_name)",
+            "Parent"),
+        std::make_pair(
+            R"(%foo_name %float_info %dbg_src 1 1 %comp_unit %void FlagIsPublic %u32_0 %foo_name)",
+            "Size"),
+        std::make_pair(
+            R"(%foo_name %float_info %dbg_src 1 1 %comp_unit %u32_0 FlagIsPublic %u32_0 %foo_name)",
+            "Size"),
+        std::make_pair(
+            R"(%foo_name %float_info %dbg_src 1 1 %comp_unit %int_32 FlagIsPublic %foo_name %foo_name)",
+            "Value"),
+        std::make_pair(
+            R"(%foo_name %float_info %dbg_src 1 1 %comp_unit %int_32 FlagIsPublic %u32_0 %u32_1)",
+            "Name"),
+    }));
+
+TEST_F(ValidateVulkan100DebugInfo, DebugTypeEnum) {
+  const std::string src = R"(
+%src = OpString "simple.hlsl"
+%code = OpString "main() {}"
+%float_name = OpString "float"
+%foo_name = OpString "foo"
+)";
+
+  const std::string constants = R"(
+%u32_4 = OpConstant %u32 4
+%u32_5 = OpConstant %u32 5
+%u32_32 = OpConstant %u32 32
+)";
+
+  const std::string dbg_inst_header = R"(
+%dbg_src = OpExtInst %void %DbgExt DebugSource %src %code
+%comp_unit = OpExtInst %void %DbgExt DebugCompilationUnit %u32_2 %u32_4 %dbg_src %u32_5
+%none = OpExtInst %void %DbgExt DebugInfoNone
+%float_info = OpExtInst %void %DbgExt DebugTypeBasic %float_name %u32_32 %u32_3 %u32_0
+%foo_info1 = OpExtInst %void %DbgExt DebugTypeEnum %foo_name %float_info %dbg_src %u32_1 %u32_1 %comp_unit %u32_32 %u32_3 %u32_0 %foo_name %u32_1 %foo_name
+%foo_info2 = OpExtInst %void %DbgExt DebugTypeEnum %foo_name %none %dbg_src %u32_1 %u32_1 %comp_unit %u32_32 %u32_3 %u32_0 %foo_name %u32_1 %foo_name
+%foo_info3 = OpExtInst %void %DbgExt DebugTypeEnum %foo_name %none %dbg_src %u32_1 %u32_1 %comp_unit %u32_32 %u32_3
+)";
+
+  const std::string extension = R"(
+OpExtension "SPV_KHR_non_semantic_info"
+%DbgExt = OpExtInstImport "NonSemantic.Vulkan.DebugInfo.100"
+)";
+
+  CompileSuccessfully(GenerateShaderCodeForDebugInfo(
+      src, constants, dbg_inst_header, "", extension, "Vertex"));
+  ASSERT_EQ(SPV_SUCCESS, ValidateInstructions());
+}
+
+TEST_P(ValidateVulkan100DebugInfoDebugTypeEnum, Fail) {
+  const std::string src = R"(
+%src = OpString "simple.hlsl"
+%code = OpString "main() {}"
+%float_name = OpString "float"
+%foo_name = OpString "foo"
+)";
+
+  const std::string constants = R"(
+%u32_4 = OpConstant %u32 4
+%u32_5 = OpConstant %u32 5
+%u32_32 = OpConstant %u32 32
+)";
+
+  const auto& param = GetParam();
+
+  std::ostringstream ss;
+  ss << R"(
+%dbg_src = OpExtInst %void %DbgExt DebugSource %src %code
+%comp_unit = OpExtInst %void %DbgExt DebugCompilationUnit %u32_2 %u32_4 %dbg_src %u32_5
+%float_info = OpExtInst %void %DbgExt DebugTypeBasic %float_name %u32_32 %u32_3 %u32_0
+%foo_info = OpExtInst %void %DbgExt DebugTypeEnum )";
+  ss << param.first;
+
+  const std::string extension = R"(
+OpExtension "SPV_KHR_non_semantic_info"
+%DbgExt = OpExtInstImport "NonSemantic.Vulkan.DebugInfo.100"
+)";
+
+  CompileSuccessfully(GenerateShaderCodeForDebugInfo(src, constants, ss.str(),
+                                                     "", extension, "Vertex"));
+  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
+  EXPECT_THAT(getDiagnosticString(),
+              HasSubstr("expected operand " + param.second));
+}
+
+INSTANTIATE_TEST_SUITE_P(
+    AllVulkan100DebugInfoFail, ValidateVulkan100DebugInfoDebugTypeEnum,
+    ::testing::ValuesIn(std::vector<std::pair<std::string, std::string>>{
+        std::make_pair(
+            R"(%dbg_src %float_info %dbg_src %u32_1 %u32_1 %comp_unit %u32_32 %u32_3 %u32_0 %foo_name)",
+            "Name"),
+        std::make_pair(
+            R"(%foo_name %dbg_src %dbg_src %u32_1 %u32_1 %comp_unit %u32_32 %u32_3 %u32_0 %foo_name)",
+            "Underlying Types"),
+        std::make_pair(
+            R"(%foo_name %float_info %comp_unit %u32_1 %u32_1 %comp_unit %u32_32 %u32_3 %u32_0 %foo_name)",
+            "Source"),
+        std::make_pair(
+            R"(%foo_name %float_info %dbg_src %u32_1 %u32_1 %dbg_src %u32_32 %u32_3 %u32_0 %foo_name)",
+            "Parent"),
+        std::make_pair(
+            R"(%foo_name %float_info %dbg_src %u32_1 %u32_1 %comp_unit %void %u32_3 %u32_0 %foo_name)",
+            "Size"),
+        std::make_pair(
+            R"(%foo_name %float_info %dbg_src %u32_1 %u32_1 %comp_unit %u32_0 %u32_3 %u32_0 %foo_name)",
+            "Size"),
+        std::make_pair(
+            R"(%foo_name %float_info %dbg_src %u32_1 %u32_1 %comp_unit %u32_32 %u32_3 %foo_name %foo_name)",
+            "Value"),
+        std::make_pair(
+            R"(%foo_name %float_info %dbg_src %u32_1 %u32_1 %comp_unit %u32_32 %u32_3 %u32_0 %u32_1)",
+            "Name"),
+    }));
+
+TEST_F(ValidateOpenCL100DebugInfo, DebugTypeCompositeFunctionAndInheritance) {
+  const std::string src = R"(
+%src = OpString "simple.hlsl"
+%code = OpString "struct VS_OUTPUT {
+  float4 pos : SV_POSITION;
+};
+struct foo : VS_OUTPUT {
+};
+main() {}
+"
+%VS_OUTPUT_name = OpString "struct VS_OUTPUT"
+%float_name = OpString "float"
+%foo_name = OpString "foo"
+%VS_OUTPUT_pos_name = OpString "pos : SV_POSITION"
+%VS_OUTPUT_linkage_name = OpString "VS_OUTPUT"
+%main_name = OpString "main"
+%main_linkage_name = OpString "v4f_main_f"
+)";
+
+  const std::string size_const = R"(
+%int_32 = OpConstant %u32 32
+%int_128 = OpConstant %u32 128
+)";
+
+  const std::string dbg_inst_header = R"(
+%dbg_src = OpExtInst %void %DbgExt DebugSource %src %code
+%comp_unit = OpExtInst %void %DbgExt DebugCompilationUnit 2 4 %dbg_src HLSL
+%VS_OUTPUT_info = OpExtInst %void %DbgExt DebugTypeComposite %VS_OUTPUT_name Structure %dbg_src 1 1 %comp_unit %VS_OUTPUT_linkage_name %int_128 FlagIsPublic %VS_OUTPUT_pos_info %main_info %child
+%float_info = OpExtInst %void %DbgExt DebugTypeBasic %float_name %int_32 Float
+%v4float_info = OpExtInst %void %DbgExt DebugTypeVector %float_info 4
+%VS_OUTPUT_pos_info = OpExtInst %void %DbgExt DebugTypeMember %VS_OUTPUT_pos_name %v4float_info %dbg_src 2 3 %VS_OUTPUT_info %u32_0 %int_128 FlagIsPublic
+%main_type_info = OpExtInst %void %DbgExt DebugTypeFunction FlagIsPublic %v4float_info %float_info
+%main_info = OpExtInst %void %DbgExt DebugFunction %main_name %main_type_info %dbg_src 12 1 %comp_unit %main_linkage_name FlagIsPublic 13 %main
+%foo_info = OpExtInst %void %DbgExt DebugTypeComposite %foo_name Structure %dbg_src 1 1 %comp_unit %foo_name %u32_0 FlagIsPublic
+%child = OpExtInst %void %DbgExt DebugTypeInheritance %foo_info %VS_OUTPUT_info %int_128 %int_128 FlagIsPublic
+)";
+
+  const std::string extension = R"(
+%DbgExt = OpExtInstImport "OpenCL.DebugInfo.100"
+)";
+
+  CompileSuccessfully(GenerateShaderCodeForDebugInfo(
+      src, size_const, dbg_inst_header, "", extension, "Vertex"));
+  ASSERT_EQ(SPV_SUCCESS, ValidateInstructions());
+}
+
+TEST_P(ValidateOpenCL100DebugInfoDebugTypeComposite, Fail) {
+  const std::string src = R"(
+%src = OpString "simple.hlsl"
+%code = OpString "struct VS_OUTPUT {
+  float4 pos : SV_POSITION;
+};
+struct foo : VS_OUTPUT {
+};
+main() {}
+"
+%VS_OUTPUT_name = OpString "struct VS_OUTPUT"
+%float_name = OpString "float"
+%foo_name = OpString "foo"
+%VS_OUTPUT_pos_name = OpString "pos : SV_POSITION"
+%VS_OUTPUT_linkage_name = OpString "VS_OUTPUT"
+%main_name = OpString "main"
+%main_linkage_name = OpString "v4f_main_f"
+)";
+
+  const std::string size_const = R"(
+%int_32 = OpConstant %u32 32
+%int_128 = OpConstant %u32 128
+)";
+
+  const auto& param = GetParam();
+
+  std::ostringstream ss;
+  ss << R"(
+%dbg_src = OpExtInst %void %DbgExt DebugSource %src %code
+%comp_unit = OpExtInst %void %DbgExt DebugCompilationUnit 2 4 %dbg_src HLSL
+%VS_OUTPUT_info = OpExtInst %void %DbgExt DebugTypeComposite )";
+  ss << param.first;
+  ss << R"(
+%float_info = OpExtInst %void %DbgExt DebugTypeBasic %float_name %int_32 Float
+%v4float_info = OpExtInst %void %DbgExt DebugTypeVector %float_info 4
+%VS_OUTPUT_pos_info = OpExtInst %void %DbgExt DebugTypeMember %VS_OUTPUT_pos_name %v4float_info %dbg_src 2 3 %VS_OUTPUT_info %u32_0 %int_128 FlagIsPublic
+%main_type_info = OpExtInst %void %DbgExt DebugTypeFunction FlagIsPublic %v4float_info %float_info
+%main_info = OpExtInst %void %DbgExt DebugFunction %main_name %main_type_info %dbg_src 12 1 %comp_unit %main_linkage_name FlagIsPublic 13 %main
+%foo_info = OpExtInst %void %DbgExt DebugTypeComposite %foo_name Structure %dbg_src 1 1 %comp_unit %foo_name %u32_0 FlagIsPublic
+%child = OpExtInst %void %DbgExt DebugTypeInheritance %foo_info %VS_OUTPUT_info %int_128 %int_128 FlagIsPublic
+)";
+
+  const std::string extension = R"(
+%DbgExt = OpExtInstImport "OpenCL.DebugInfo.100"
+)";
+
+  CompileSuccessfully(GenerateShaderCodeForDebugInfo(src, size_const, ss.str(),
+                                                     "", extension, "Vertex"));
+  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
+  EXPECT_THAT(getDiagnosticString(),
+              HasSubstr("expected operand " + param.second + " must be "));
+}
+
+INSTANTIATE_TEST_SUITE_P(
+    AllOpenCL100DebugInfoFail, ValidateOpenCL100DebugInfoDebugTypeComposite,
+    ::testing::ValuesIn(std::vector<std::pair<std::string, std::string>>{
+        std::make_pair(
+            R"(%dbg_src Structure %dbg_src 1 1 %comp_unit %VS_OUTPUT_linkage_name %int_128 FlagIsPublic %VS_OUTPUT_pos_info %main_info %child)",
+            "Name"),
+        std::make_pair(
+            R"(%VS_OUTPUT_name Structure %comp_unit 1 1 %comp_unit %VS_OUTPUT_linkage_name %int_128 FlagIsPublic %VS_OUTPUT_pos_info %main_info %child)",
+            "Source"),
+        std::make_pair(
+            R"(%VS_OUTPUT_name Structure %dbg_src 1 1 %dbg_src %VS_OUTPUT_linkage_name %int_128 FlagIsPublic %VS_OUTPUT_pos_info %main_info %child)",
+            "Parent"),
+        std::make_pair(
+            R"(%VS_OUTPUT_name Structure %dbg_src 1 1 %comp_unit %int_128 %int_128 FlagIsPublic %VS_OUTPUT_pos_info %main_info %child)",
+            "Linkage Name"),
+        std::make_pair(
+            R"(%VS_OUTPUT_name Structure %dbg_src 1 1 %comp_unit %VS_OUTPUT_linkage_name %dbg_src FlagIsPublic %VS_OUTPUT_pos_info %main_info %child)",
+            "Size"),
+        std::make_pair(
+            R"(%VS_OUTPUT_name Structure %dbg_src 1 1 %comp_unit %VS_OUTPUT_linkage_name %int_128 FlagIsPublic %dbg_src %main_info %child)",
+            "Members"),
+        std::make_pair(
+            R"(%VS_OUTPUT_name Structure %dbg_src 1 1 %comp_unit %VS_OUTPUT_linkage_name %int_128 FlagIsPublic %VS_OUTPUT_pos_info %dbg_src %child)",
+            "Members"),
+        std::make_pair(
+            R"(%VS_OUTPUT_name Structure %dbg_src 1 1 %comp_unit %VS_OUTPUT_linkage_name %int_128 FlagIsPublic %VS_OUTPUT_pos_info %main_info %dbg_src)",
+            "Members"),
+    }));
+
+TEST_P(ValidateOpenCL100DebugInfoDebugTypeMember, Fail) {
+  const std::string src = R"(
+%src = OpString "simple.hlsl"
+%code = OpString "struct VS_OUTPUT {
+  float pos : SV_POSITION;
+};
+main() {}
+"
+%VS_OUTPUT_name = OpString "struct VS_OUTPUT"
+%float_name = OpString "float"
+%VS_OUTPUT_pos_name = OpString "pos : SV_POSITION"
+%VS_OUTPUT_linkage_name = OpString "VS_OUTPUT"
+)";
+
+  const std::string size_const = R"(
+%int_32 = OpConstant %u32 32
+)";
+
+  const auto& param = GetParam();
+
+  std::ostringstream ss;
+  ss << R"(
+%dbg_src = OpExtInst %void %DbgExt DebugSource %src %code
+%comp_unit = OpExtInst %void %DbgExt DebugCompilationUnit 2 4 %dbg_src HLSL
+%VS_OUTPUT_info = OpExtInst %void %DbgExt DebugTypeComposite %VS_OUTPUT_name Structure %dbg_src 1 1 %comp_unit %VS_OUTPUT_linkage_name %int_32 FlagIsPublic %VS_OUTPUT_pos_info
+%float_info = OpExtInst %void %DbgExt DebugTypeBasic %float_name %int_32 Float
+%VS_OUTPUT_pos_info = OpExtInst %void %DbgExt DebugTypeMember )";
+  ss << param.first;
+
+  const std::string extension = R"(
+%DbgExt = OpExtInstImport "OpenCL.DebugInfo.100"
+)";
+
+  CompileSuccessfully(GenerateShaderCodeForDebugInfo(src, size_const, ss.str(),
+                                                     "", extension, "Vertex"));
+  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
+  if (!param.second.empty()) {
+    EXPECT_THAT(getDiagnosticString(),
+                HasSubstr("expected operand " + param.second +
+                          " must be a result id of "));
+  }
+}
+
+INSTANTIATE_TEST_SUITE_P(
+    AllOpenCL100DebugInfoFail, ValidateOpenCL100DebugInfoDebugTypeMember,
+    ::testing::ValuesIn(std::vector<std::pair<std::string, std::string>>{
+        std::make_pair(
+            R"(%dbg_src %float_info %dbg_src 2 3 %VS_OUTPUT_info %u32_0 %int_32 FlagIsPublic)",
+            "Name"),
+        std::make_pair(
+            R"(%VS_OUTPUT_pos_name %dbg_src %dbg_src 2 3 %VS_OUTPUT_info %u32_0 %int_32 FlagIsPublic)",
+            ""),
+        std::make_pair(
+            R"(%VS_OUTPUT_pos_name %float_info %float_info 2 3 %VS_OUTPUT_info %u32_0 %int_32 FlagIsPublic)",
+            "Source"),
+        std::make_pair(
+            R"(%VS_OUTPUT_pos_name %float_info %dbg_src 2 3 %float_info %u32_0 %int_32 FlagIsPublic)",
+            "Parent"),
+        std::make_pair(
+            R"(%VS_OUTPUT_pos_name %float_info %dbg_src 2 3 %VS_OUTPUT_info %void %int_32 FlagIsPublic)",
+            "Offset"),
+        std::make_pair(
+            R"(%VS_OUTPUT_pos_name %float_info %dbg_src 2 3 %VS_OUTPUT_info %u32_0 %void FlagIsPublic)",
+            "Size"),
+    }));
+
+TEST_P(ValidateOpenCL100DebugInfoDebugTypeInheritance, Fail) {
+  const std::string src = R"(
+%src = OpString "simple.hlsl"
+%code = OpString "struct VS_OUTPUT {};
+struct foo : VS_OUTPUT {};
+"
+%VS_OUTPUT_name = OpString "struct VS_OUTPUT"
+%foo_name = OpString "foo"
+)";
+
+  const auto& param = GetParam();
+
+  std::ostringstream ss;
+  ss << R"(
+%dbg_src = OpExtInst %void %DbgExt DebugSource %src %code
+%comp_unit = OpExtInst %void %DbgExt DebugCompilationUnit 2 4 %dbg_src HLSL
+%VS_OUTPUT_info = OpExtInst %void %DbgExt DebugTypeComposite %VS_OUTPUT_name Structure %dbg_src 1 1 %comp_unit %VS_OUTPUT_name %u32_0 FlagIsPublic %child
+%foo_info = OpExtInst %void %DbgExt DebugTypeComposite %foo_name Structure %dbg_src 1 1 %comp_unit %foo_name %u32_0 FlagIsPublic
+%bar_info = OpExtInst %void %DbgExt DebugTypeComposite %foo_name Union %dbg_src 1 1 %comp_unit %foo_name %u32_0 FlagIsPublic
+%child = OpExtInst %void %DbgExt DebugTypeInheritance )"
+     << param.first;
+
+  const std::string extension = R"(
+%DbgExt = OpExtInstImport "OpenCL.DebugInfo.100"
+)";
+
+  CompileSuccessfully(GenerateShaderCodeForDebugInfo(src, "", ss.str(), "",
+                                                     extension, "Vertex"));
+  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
+  EXPECT_THAT(getDiagnosticString(),
+              HasSubstr("expected operand " + param.second));
+}
+
+INSTANTIATE_TEST_SUITE_P(
+    AllOpenCL100DebugInfoFail, ValidateOpenCL100DebugInfoDebugTypeInheritance,
+    ::testing::ValuesIn(std::vector<std::pair<std::string, std::string>>{
+        std::make_pair(R"(%dbg_src %VS_OUTPUT_info %u32_0 %u32_0 FlagIsPublic)",
+                       "Child must be a result id of"),
+        std::make_pair(R"(%foo_info %dbg_src %u32_0 %u32_0 FlagIsPublic)",
+                       "Parent must be a result id of"),
+        std::make_pair(
+            R"(%bar_info %VS_OUTPUT_info %u32_0 %u32_0 FlagIsPublic)",
+            "Child must be class or struct debug type"),
+        std::make_pair(R"(%foo_info %bar_info %u32_0 %u32_0 FlagIsPublic)",
+                       "Parent must be class or struct debug type"),
+        std::make_pair(R"(%foo_info %VS_OUTPUT_info %void %u32_0 FlagIsPublic)",
+                       "Offset"),
+        std::make_pair(R"(%foo_info %VS_OUTPUT_info %u32_0 %void FlagIsPublic)",
+                       "Size"),
+    }));
+
+TEST_F(ValidateVulkan100DebugInfo, DebugTypeComposite) {
+  const std::string src = R"(
+%src = OpString "simple.hlsl"
+%code = OpString "struct VS_OUTPUT {
+  float4 pos : SV_POSITION;
+};
+struct foo : VS_OUTPUT {
+};
+main() {}
+"
+%VS_OUTPUT_name = OpString "struct VS_OUTPUT"
+%float_name = OpString "float"
+%foo_name = OpString "foo"
+%VS_OUTPUT_pos_name = OpString "pos : SV_POSITION"
+%VS_OUTPUT_linkage_name = OpString "VS_OUTPUT"
+%main_name = OpString "main"
+%main_linkage_name = OpString "v4f_main_f"
+)";
+
+  const std::string constants = R"(
+%u32_4 = OpConstant %u32 4
+%u32_5 = OpConstant %u32 5
+%u32_32 = OpConstant %u32 32
+%u32_128 = OpConstant %u32 128
+)";
+
+  const std::string dbg_inst_header = R"(
+%dbg_src = OpExtInst %void %DbgExt DebugSource %src %code
+%comp_unit = OpExtInst %void %DbgExt DebugCompilationUnit %u32_2 %u32_4 %dbg_src %u32_5
+%float_info = OpExtInst %void %DbgExt DebugTypeBasic %float_name %u32_32 %u32_3 %u32_0
+%v4float_info = OpExtInst %void %DbgExt DebugTypeVector %float_info %u32_4
+%VS_OUTPUT_pos_info = OpExtInst %void %DbgExt DebugTypeMember %VS_OUTPUT_pos_name %v4float_info %dbg_src %u32_2 %u32_3 %u32_0 %u32_128 %u32_3
+%VS_OUTPUT_info = OpExtInst %void %DbgExt DebugTypeComposite %VS_OUTPUT_name %u32_1 %dbg_src %u32_1 %u32_1 %comp_unit %VS_OUTPUT_linkage_name %u32_128 %u32_3 %VS_OUTPUT_pos_info
+%foo_info = OpExtInst %void %DbgExt DebugTypeComposite %foo_name %u32_1 %dbg_src %u32_1 %u32_1 %comp_unit %foo_name %u32_0 %u32_3
+)";
+
+  const std::string extension = R"(
+OpExtension "SPV_KHR_non_semantic_info"
+%DbgExt = OpExtInstImport "NonSemantic.Vulkan.DebugInfo.100"
+)";
+
+  CompileSuccessfully(GenerateShaderCodeForDebugInfo(
+      src, constants, dbg_inst_header, "", extension, "Vertex"));
+  ASSERT_EQ(SPV_SUCCESS, ValidateInstructions());
+}
+
+TEST_P(ValidateVulkan100DebugInfoDebugTypeComposite, Fail) {
+  const std::string src = R"(
+%src = OpString "simple.hlsl"
+%code = OpString "struct VS_OUTPUT {
+  float4 pos : SV_POSITION;
+};
+struct foo : VS_OUTPUT {
+};
+main() {}
+"
+%VS_OUTPUT_name = OpString "struct VS_OUTPUT"
+%float_name = OpString "float"
+%foo_name = OpString "foo"
+%VS_OUTPUT_pos_name = OpString "pos : SV_POSITION"
+%VS_OUTPUT_linkage_name = OpString "VS_OUTPUT"
+%main_name = OpString "main"
+%main_linkage_name = OpString "v4f_main_f"
+)";
+
+  const std::string constants = R"(
+%u32_4 = OpConstant %u32 4
+%u32_5 = OpConstant %u32 5
+%u32_32 = OpConstant %u32 32
+%u32_128 = OpConstant %u32 128
+)";
+
+  const auto& param = GetParam();
+
+  std::ostringstream ss;
+  ss << R"(
+%dbg_src = OpExtInst %void %DbgExt DebugSource %src %code
+%comp_unit = OpExtInst %void %DbgExt DebugCompilationUnit %u32_2 %u32_4 %dbg_src %u32_5
+%float_info = OpExtInst %void %DbgExt DebugTypeBasic %float_name %u32_32 %u32_3 %u32_0
+%v4float_info = OpExtInst %void %DbgExt DebugTypeVector %float_info %u32_4
+%VS_OUTPUT_pos_info = OpExtInst %void %DbgExt DebugTypeMember %VS_OUTPUT_pos_name %v4float_info %dbg_src %u32_2 %u32_3 %u32_0 %u32_128 %u32_3
+%VS_OUTPUT_info = OpExtInst %void %DbgExt DebugTypeComposite )";
+  ss << param.first;
+
+  const std::string extension = R"(
+OpExtension "SPV_KHR_non_semantic_info"
+%DbgExt = OpExtInstImport "NonSemantic.Vulkan.DebugInfo.100"
+)";
+
+  CompileSuccessfully(GenerateShaderCodeForDebugInfo(src, constants, ss.str(),
+                                                     "", extension, "Vertex"));
+  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
+  EXPECT_THAT(getDiagnosticString(),
+              HasSubstr("expected operand " + param.second + " must be "));
+}
+
+INSTANTIATE_TEST_SUITE_P(
+    AllVulkan100DebugInfoFail, ValidateVulkan100DebugInfoDebugTypeComposite,
+    ::testing::ValuesIn(std::vector<std::pair<std::string, std::string>>{
+        std::make_pair(
+            R"(%dbg_src %u32_1 %dbg_src %u32_1 %u32_1 %comp_unit %VS_OUTPUT_linkage_name %u32_128 %u32_3 %VS_OUTPUT_pos_info)",
+            "Name"),
+        std::make_pair(
+            R"(%VS_OUTPUT_name %u32_1 %comp_unit %u32_1 %u32_1 %comp_unit %VS_OUTPUT_linkage_name %u32_128 %u32_3 %VS_OUTPUT_pos_info)",
+            "Source"),
+        std::make_pair(
+            R"(%VS_OUTPUT_name %u32_1 %dbg_src %u32_1 %u32_1 %dbg_src %VS_OUTPUT_linkage_name %u32_128 %u32_3 %VS_OUTPUT_pos_info)",
+            "Parent"),
+        std::make_pair(
+            R"(%VS_OUTPUT_name %u32_1 %dbg_src %u32_1 %u32_1 %comp_unit %u32_128 %u32_128 %u32_3 %VS_OUTPUT_pos_info)",
+            "Linkage Name"),
+        std::make_pair(
+            R"(%VS_OUTPUT_name %u32_1 %dbg_src %u32_1 %u32_1 %comp_unit %VS_OUTPUT_linkage_name %dbg_src %u32_3 %VS_OUTPUT_pos_info)",
+            "Size"),
+        std::make_pair(
+            R"(%VS_OUTPUT_name %u32_1 %dbg_src %u32_1 %u32_1 %comp_unit %VS_OUTPUT_linkage_name %u32_128 %dbg_src %VS_OUTPUT_pos_info)",
+            "Flags"),
+        std::make_pair(
+            R"(%VS_OUTPUT_name %u32_1 %dbg_src %u32_1 %u32_1 %comp_unit %VS_OUTPUT_linkage_name %u32_128 %u32_3 %dbg_src)",
+            "Members"),
+    }));
+
+TEST_P(ValidateVulkan100DebugInfoDebugTypeMember, Fail) {
+  const std::string src = R"(
+%src = OpString "simple.hlsl"
+%code = OpString "struct VS_OUTPUT {
+  float pos : SV_POSITION;
+};
+main() {}
+"
+%VS_OUTPUT_name = OpString "struct VS_OUTPUT"
+%float_name = OpString "float"
+%VS_OUTPUT_pos_name = OpString "pos : SV_POSITION"
+%VS_OUTPUT_linkage_name = OpString "VS_OUTPUT"
+)";
+
+  const std::string constants = R"(
+%u32_4 = OpConstant %u32 4
+%u32_5 = OpConstant %u32 5
+%u32_32 = OpConstant %u32 32
+%u32_128 = OpConstant %u32 128
+)";
+
+  const auto& param = GetParam();
+
+  std::ostringstream ss;
+  ss << R"(
+%dbg_src = OpExtInst %void %DbgExt DebugSource %src %code
+%comp_unit = OpExtInst %void %DbgExt DebugCompilationUnit %u32_2 %u32_4 %dbg_src %u32_5
+%float_info = OpExtInst %void %DbgExt DebugTypeBasic %float_name %u32_32 %u32_3 %u32_0
+%VS_OUTPUT_pos_info = OpExtInst %void %DbgExt DebugTypeMember )";
+  ss << param.first;
+
+  const std::string extension = R"(
+OpExtension "SPV_KHR_non_semantic_info"
+%DbgExt = OpExtInstImport "NonSemantic.Vulkan.DebugInfo.100"
+)";
+
+  CompileSuccessfully(GenerateShaderCodeForDebugInfo(src, constants, ss.str(),
+                                                     "", extension, "Vertex"));
+  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
+  if (!param.second.empty()) {
+    EXPECT_THAT(getDiagnosticString(),
+                HasSubstr("expected operand " + param.second +
+                          " must be a result id of "));
+  }
+}
+
+INSTANTIATE_TEST_SUITE_P(
+    AllVulkan100DebugInfoFail, ValidateVulkan100DebugInfoDebugTypeMember,
+    ::testing::ValuesIn(std::vector<std::pair<std::string, std::string>>{
+        std::make_pair(
+            R"(%dbg_src %float_info %dbg_src %u32_2 %u32_3 %u32_0 %u32_32 %u32_3)",
+            "Name"),
+        std::make_pair(
+            R"(%VS_OUTPUT_pos_name %dbg_src %dbg_src %u32_2 %u32_3 %u32_0 %u32_32 %u32_3)",
+            ""),
+        std::make_pair(
+            R"(%VS_OUTPUT_pos_name %float_info %float_info %u32_2 %u32_3 %u32_0 %u32_32 %u32_3)",
+            "Source"),
+        std::make_pair(
+            R"(%VS_OUTPUT_pos_name %float_info %dbg_src %u32_2 %u32_3 %void %u32_32 %u32_3)",
+            "Offset"),
+        std::make_pair(
+            R"(%VS_OUTPUT_pos_name %float_info %dbg_src %u32_2 %u32_3 %u32_0 %void %u32_3)",
+            "Size"),
+        std::make_pair(
+            R"(%VS_OUTPUT_pos_name %float_info %dbg_src %u32_2 %u32_3 %u32_0 %u32_32 %void)",
+            "Flags"),
+    }));
+
+TEST_F(ValidateOpenCL100DebugInfo, DebugFunctionDeclaration) {
+  const std::string src = R"(
+%src = OpString "simple.hlsl"
+%code = OpString "struct VS_OUTPUT {
+  float4 pos : SV_POSITION;
+};
+main() {}
+"
+%main_name = OpString "main"
+%main_linkage_name = OpString "v4f_main_f"
+)";
+
+  const std::string dbg_inst_header = R"(
+%dbg_src = OpExtInst %void %DbgExt DebugSource %src %code
+%comp_unit = OpExtInst %void %DbgExt DebugCompilationUnit 2 4 %dbg_src HLSL
+%main_type_info = OpExtInst %void %DbgExt DebugTypeFunction FlagIsPublic %void
+%main_decl = OpExtInst %void %DbgExt DebugFunctionDeclaration %main_name %main_type_info %dbg_src 12 1 %comp_unit %main_linkage_name FlagIsPublic
+%main_info = OpExtInst %void %DbgExt DebugFunction %main_name %main_type_info %dbg_src 12 1 %comp_unit %main_linkage_name FlagIsPublic 13 %main)";
+
+  const std::string extension = R"(
+%DbgExt = OpExtInstImport "OpenCL.DebugInfo.100"
+)";
+
+  CompileSuccessfully(GenerateShaderCodeForDebugInfo(src, "", dbg_inst_header,
+                                                     "", extension, "Vertex"));
+  ASSERT_EQ(SPV_SUCCESS, ValidateInstructions());
+}
+
+TEST_P(ValidateOpenCL100DebugInfoDebugFunction, Fail) {
+  const std::string src = R"(
+%src = OpString "simple.hlsl"
+%code = OpString "struct VS_OUTPUT {
+  float4 pos : SV_POSITION;
+};
+main() {}
+"
+%main_name = OpString "main"
+%main_linkage_name = OpString "v4f_main_f"
+)";
+
+  const auto& param = GetParam();
+
+  std::ostringstream ss;
+  ss << R"(
+%dbg_src = OpExtInst %void %DbgExt DebugSource %src %code
+%comp_unit = OpExtInst %void %DbgExt DebugCompilationUnit 2 4 %dbg_src HLSL
+%main_type_info = OpExtInst %void %DbgExt DebugTypeFunction FlagIsPublic %void
+%main_decl = OpExtInst %void %DbgExt DebugFunctionDeclaration %main_name %main_type_info %dbg_src 12 1 %comp_unit %main_linkage_name FlagIsPublic
+%main_info = OpExtInst %void %DbgExt DebugFunction )"
+     << param.first;
+
+  const std::string extension = R"(
+%DbgExt = OpExtInstImport "OpenCL.DebugInfo.100"
+)";
+
+  CompileSuccessfully(GenerateShaderCodeForDebugInfo(src, "", ss.str(), "",
+                                                     extension, "Vertex"));
+  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
+  EXPECT_THAT(getDiagnosticString(),
+              HasSubstr("expected operand " + param.second));
+}
+
+INSTANTIATE_TEST_SUITE_P(
+    AllOpenCL100DebugInfoFail, ValidateOpenCL100DebugInfoDebugFunction,
+    ::testing::ValuesIn(std::vector<std::pair<std::string, std::string>>{
+        std::make_pair(
+            R"(%u32_0 %main_type_info %dbg_src 12 1 %comp_unit %main_linkage_name FlagIsPublic 13 %main)",
+            "Name"),
+        std::make_pair(
+            R"(%main_name %dbg_src %dbg_src 12 1 %comp_unit %main_linkage_name FlagIsPublic 13 %main)",
+            "Type"),
+        std::make_pair(
+            R"(%main_name %main_type_info %comp_unit 12 1 %comp_unit %main_linkage_name FlagIsPublic 13 %main)",
+            "Source"),
+        std::make_pair(
+            R"(%main_name %main_type_info %dbg_src 12 1 %dbg_src %main_linkage_name FlagIsPublic 13 %main)",
+            "Parent"),
+        std::make_pair(
+            R"(%main_name %main_type_info %dbg_src 12 1 %comp_unit %void FlagIsPublic 13 %main)",
+            "Linkage Name"),
+        std::make_pair(
+            R"(%main_name %main_type_info %dbg_src 12 1 %comp_unit %main_linkage_name FlagIsPublic 13 %void)",
+            "Function"),
+        std::make_pair(
+            R"(%main_name %main_type_info %dbg_src 12 1 %comp_unit %main_linkage_name FlagIsPublic 13 %main %dbg_src)",
+            "Declaration"),
+    }));
+
+TEST_P(ValidateOpenCL100DebugInfoDebugFunctionDeclaration, Fail) {
+  const std::string src = R"(
+%src = OpString "simple.hlsl"
+%code = OpString "struct VS_OUTPUT {
+  float4 pos : SV_POSITION;
+};
+main() {}
+"
+%main_name = OpString "main"
+%main_linkage_name = OpString "v4f_main_f"
+)";
+
+  const auto& param = GetParam();
+
+  std::ostringstream ss;
+  ss << R"(
+%dbg_src = OpExtInst %void %DbgExt DebugSource %src %code
+%comp_unit = OpExtInst %void %DbgExt DebugCompilationUnit 2 4 %dbg_src HLSL
+%main_type_info = OpExtInst %void %DbgExt DebugTypeFunction FlagIsPublic %void
+%main_decl = OpExtInst %void %DbgExt DebugFunctionDeclaration )"
+     << param.first;
+
+  const std::string extension = R"(
+%DbgExt = OpExtInstImport "OpenCL.DebugInfo.100"
+)";
+
+  CompileSuccessfully(GenerateShaderCodeForDebugInfo(src, "", ss.str(), "",
+                                                     extension, "Vertex"));
+  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
+  EXPECT_THAT(getDiagnosticString(),
+              HasSubstr("expected operand " + param.second));
+}
+
+INSTANTIATE_TEST_SUITE_P(
+    AllOpenCL100DebugInfoFail,
+    ValidateOpenCL100DebugInfoDebugFunctionDeclaration,
+    ::testing::ValuesIn(std::vector<std::pair<std::string, std::string>>{
+        std::make_pair(
+            R"(%u32_0 %main_type_info %dbg_src 12 1 %comp_unit %main_linkage_name FlagIsPublic)",
+            "Name"),
+        std::make_pair(
+            R"(%main_name %dbg_src %dbg_src 12 1 %comp_unit %main_linkage_name FlagIsPublic)",
+            "Type"),
+        std::make_pair(
+            R"(%main_name %main_type_info %comp_unit 12 1 %comp_unit %main_linkage_name FlagIsPublic)",
+            "Source"),
+        std::make_pair(
+            R"(%main_name %main_type_info %dbg_src 12 1 %dbg_src %main_linkage_name FlagIsPublic)",
+            "Parent"),
+        std::make_pair(
+            R"(%main_name %main_type_info %dbg_src 12 1 %comp_unit %void FlagIsPublic)",
+            "Linkage Name"),
+    }));
+
+TEST_F(ValidateVulkan100DebugInfo, DebugFunctionDeclaration) {
+  const std::string src = R"(
+%src = OpString "simple.hlsl"
+%code = OpString "struct VS_OUTPUT {
+  float4 pos : SV_POSITION;
+};
+main() {}
+"
+%main_name = OpString "main"
+%main_linkage_name = OpString "v4f_main_f"
+)";
+
+  const std::string constants = R"(
+%u32_4 = OpConstant %u32 4
+%u32_5 = OpConstant %u32 5
+%u32_12 = OpConstant %u32 12
+%u32_13 = OpConstant %u32 13
+)";
+
+  const std::string dbg_inst_header = R"(
+%dbg_src = OpExtInst %void %DbgExt DebugSource %src %code
+%comp_unit = OpExtInst %void %DbgExt DebugCompilationUnit %u32_2 %u32_4 %dbg_src %u32_5
+%main_type_info = OpExtInst %void %DbgExt DebugTypeFunction %u32_3 %void
+%main_decl = OpExtInst %void %DbgExt DebugFunctionDeclaration %main_name %main_type_info %dbg_src %u32_12 %u32_1 %comp_unit %main_linkage_name %u32_3
+%main_info = OpExtInst %void %DbgExt DebugFunction %main_name %main_type_info %dbg_src %u32_12 %u32_1 %comp_unit %main_linkage_name %u32_3 %u32_13
+)";
+
+  const std::string extension = R"(
+OpExtension "SPV_KHR_non_semantic_info"
+%DbgExt = OpExtInstImport "NonSemantic.Vulkan.DebugInfo.100"
+)";
+
+  CompileSuccessfully(GenerateShaderCodeForDebugInfo(
+      src, constants, dbg_inst_header, "", extension, "Vertex"));
+  ASSERT_EQ(SPV_SUCCESS, ValidateInstructions());
+}
+
+TEST_P(ValidateVulkan100DebugInfoDebugFunction, Fail) {
+  const std::string src = R"(
+%src = OpString "simple.hlsl"
+%code = OpString "struct VS_OUTPUT {
+  float4 pos : SV_POSITION;
+};
+main() {}
+"
+%main_name = OpString "main"
+%main_linkage_name = OpString "v4f_main_f"
+)";
+
+  const std::string constants = R"(
+%u32_4 = OpConstant %u32 4
+%u32_5 = OpConstant %u32 5
+%u32_12 = OpConstant %u32 12
+%u32_13 = OpConstant %u32 13
+)";
+
+  const auto& param = GetParam();
+
+  std::ostringstream ss;
+  ss << R"(
+%dbg_src = OpExtInst %void %DbgExt DebugSource %src %code
+%comp_unit = OpExtInst %void %DbgExt DebugCompilationUnit %u32_2 %u32_4 %dbg_src %u32_5
+%main_type_info = OpExtInst %void %DbgExt DebugTypeFunction %u32_3 %void
+%main_decl = OpExtInst %void %DbgExt DebugFunctionDeclaration %main_name %main_type_info %dbg_src %u32_12 %u32_1 %comp_unit %main_linkage_name %u32_3
+%main_info = OpExtInst %void %DbgExt DebugFunction )"
+     << param.first;
+
+  const std::string extension = R"(
+OpExtension "SPV_KHR_non_semantic_info"
+%DbgExt = OpExtInstImport "NonSemantic.Vulkan.DebugInfo.100"
+)";
+
+  CompileSuccessfully(GenerateShaderCodeForDebugInfo(src, constants, ss.str(),
+                                                     "", extension, "Vertex"));
+  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
+  EXPECT_THAT(getDiagnosticString(),
+              HasSubstr("expected operand " + param.second));
+}
+
+INSTANTIATE_TEST_SUITE_P(
+    AllVulkan100DebugInfoFail, ValidateVulkan100DebugInfoDebugFunction,
+    ::testing::ValuesIn(std::vector<std::pair<std::string, std::string>>{
+        std::make_pair(
+            R"(%u32_0 %main_type_info %dbg_src %u32_12 %u32_1 %comp_unit %main_linkage_name %u32_3 %u32_13)",
+            "Name"),
+        std::make_pair(
+            R"(%main_name %dbg_src %dbg_src %u32_12 %u32_1 %comp_unit %main_linkage_name %u32_3 %u32_13)",
+            "Type"),
+        std::make_pair(
+            R"(%main_name %main_type_info %comp_unit %u32_12 %u32_1 %comp_unit %main_linkage_name %u32_3 %u32_13)",
+            "Source"),
+        std::make_pair(
+            R"(%main_name %main_type_info %dbg_src %u32_12 %u32_1 %dbg_src %main_linkage_name %u32_3 %u32_13)",
+            "Parent"),
+        std::make_pair(
+            R"(%main_name %main_type_info %dbg_src %u32_12 %u32_1 %comp_unit %void %u32_3 %u32_13)",
+            "Linkage Name"),
+        std::make_pair(
+            R"(%main_name %main_type_info %dbg_src %u32_12 %u32_1 %comp_unit %main_linkage_name %u32_3 %u32_13 %dbg_src)",
+            "Declaration"),
+    }));
+
+TEST_P(ValidateVulkan100DebugInfoDebugFunctionDeclaration, Fail) {
+  const std::string src = R"(
+%src = OpString "simple.hlsl"
+%code = OpString "struct VS_OUTPUT {
+  float4 pos : SV_POSITION;
+};
+main() {}
+"
+%main_name = OpString "main"
+%main_linkage_name = OpString "v4f_main_f"
+)";
+
+  const std::string constants = R"(
+%u32_4 = OpConstant %u32 4
+%u32_5 = OpConstant %u32 5
+%u32_12 = OpConstant %u32 12
+%u32_13 = OpConstant %u32 13
+)";
+
+  const auto& param = GetParam();
+
+  std::ostringstream ss;
+  ss << R"(
+%dbg_src = OpExtInst %void %DbgExt DebugSource %src %code
+%comp_unit = OpExtInst %void %DbgExt DebugCompilationUnit %u32_2 %u32_4 %dbg_src %u32_5
+%main_type_info = OpExtInst %void %DbgExt DebugTypeFunction %u32_3 %void
+%main_decl = OpExtInst %void %DbgExt DebugFunctionDeclaration )"
+     << param.first;
+
+  const std::string extension = R"(
+OpExtension "SPV_KHR_non_semantic_info"
+%DbgExt = OpExtInstImport "NonSemantic.Vulkan.DebugInfo.100"
+)";
+
+  CompileSuccessfully(GenerateShaderCodeForDebugInfo(src, constants, ss.str(),
+                                                     "", extension, "Vertex"));
+  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
+  EXPECT_THAT(getDiagnosticString(),
+              HasSubstr("expected operand " + param.second));
+}
+
+INSTANTIATE_TEST_SUITE_P(
+    AllVulkan100DebugInfoFail,
+    ValidateVulkan100DebugInfoDebugFunctionDeclaration,
+    ::testing::ValuesIn(std::vector<std::pair<std::string, std::string>>{
+        std::make_pair(
+            R"(%u32_0 %main_type_info %dbg_src %u32_12 %u32_1 %comp_unit %main_linkage_name %u32_3)",
+            "Name"),
+        std::make_pair(
+            R"(%main_name %dbg_src %dbg_src %u32_12 %u32_1 %comp_unit %main_linkage_name %u32_3)",
+            "Type"),
+        std::make_pair(
+            R"(%main_name %main_type_info %comp_unit %u32_12 %u32_1 %comp_unit %main_linkage_name %u32_3)",
+            "Source"),
+        std::make_pair(
+            R"(%main_name %main_type_info %dbg_src %u32_12 %u32_1 %dbg_src %main_linkage_name %u32_3)",
+            "Parent"),
+        std::make_pair(
+            R"(%main_name %main_type_info %dbg_src %u32_12 %u32_1 %comp_unit %void %u32_3)",
+            "Linkage Name"),
+    }));
+
+TEST_F(ValidateOpenCL100DebugInfo, DebugLexicalBlock) {
+  const std::string src = R"(
+%src = OpString "simple.hlsl"
+%code = OpString "main() {}"
+%main_name = OpString "main"
+)";
+
+  const std::string dbg_inst_header = R"(
+%dbg_src = OpExtInst %void %DbgExt DebugSource %src %code
+%comp_unit = OpExtInst %void %DbgExt DebugCompilationUnit 2 4 %dbg_src HLSL
+%main_block = OpExtInst %void %DbgExt DebugLexicalBlock %dbg_src 1 1 %comp_unit %main_name)";
+
+  const std::string extension = R"(
+%DbgExt = OpExtInstImport "OpenCL.DebugInfo.100"
+)";
+
+  CompileSuccessfully(GenerateShaderCodeForDebugInfo(src, "", dbg_inst_header,
+                                                     "", extension, "Vertex"));
+  ASSERT_EQ(SPV_SUCCESS, ValidateInstructions());
+}
+
+TEST_P(ValidateOpenCL100DebugInfoDebugLexicalBlock, Fail) {
+  const std::string src = R"(
+%src = OpString "simple.hlsl"
+%code = OpString "main() {}"
+%main_name = OpString "main"
+)";
+
+  const auto& param = GetParam();
+
+  std::ostringstream ss;
+  ss << R"(
+%dbg_src = OpExtInst %void %DbgExt DebugSource %src %code
+%comp_unit = OpExtInst %void %DbgExt DebugCompilationUnit 2 4 %dbg_src HLSL
+%main_block = OpExtInst %void %DbgExt DebugLexicalBlock )"
+     << param.first;
+
+  const std::string extension = R"(
+%DbgExt = OpExtInstImport "OpenCL.DebugInfo.100"
+)";
+
+  CompileSuccessfully(GenerateShaderCodeForDebugInfo(src, "", ss.str(), "",
+                                                     extension, "Vertex"));
+  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
+  EXPECT_THAT(getDiagnosticString(),
+              HasSubstr("expected operand " + param.second));
+}
+
+INSTANTIATE_TEST_SUITE_P(
+    AllOpenCL100DebugInfoFail, ValidateOpenCL100DebugInfoDebugLexicalBlock,
+    ::testing::ValuesIn(std::vector<std::pair<std::string, std::string>>{
+        std::make_pair(R"(%comp_unit 1 1 %comp_unit %main_name)", "Source"),
+        std::make_pair(R"(%dbg_src 1 1 %dbg_src %main_name)", "Parent"),
+        std::make_pair(R"(%dbg_src 1 1 %comp_unit %void)", "Name"),
+    }));
+
+TEST_F(ValidateOpenCL100DebugInfo, DebugScopeFailScope) {
+  const std::string src = R"(
+%src = OpString "simple.hlsl"
+%code = OpString "void main() {}"
+)";
+
+  const std::string dbg_inst_header = R"(
+%dbg_src = OpExtInst %void %DbgExt DebugSource %src %code
+%comp_unit = OpExtInst %void %DbgExt DebugCompilationUnit 2 4 %dbg_src HLSL
+)";
+
+  const std::string body = R"(
+%main_scope = OpExtInst %void %DbgExt DebugScope %dbg_src
+)";
+
+  const std::string extension = R"(
+%DbgExt = OpExtInstImport "OpenCL.DebugInfo.100"
+)";
+
+  CompileSuccessfully(GenerateShaderCodeForDebugInfo(
+      src, "", dbg_inst_header, body, extension, "Vertex"));
+  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
+  EXPECT_THAT(getDiagnosticString(), HasSubstr("expected operand Scope"));
+}
+
+TEST_F(ValidateOpenCL100DebugInfo, DebugScopeFailInlinedAt) {
+  const std::string src = R"(
+%src = OpString "simple.hlsl"
+%code = OpString "void main() {}"
+)";
+
+  const std::string dbg_inst_header = R"(
+%dbg_src = OpExtInst %void %DbgExt DebugSource %src %code
+%comp_unit = OpExtInst %void %DbgExt DebugCompilationUnit 2 4 %dbg_src HLSL
+)";
+
+  const std::string body = R"(
+%main_scope = OpExtInst %void %DbgExt DebugScope %comp_unit %dbg_src
+)";
+
+  const std::string extension = R"(
+%DbgExt = OpExtInstImport "OpenCL.DebugInfo.100"
+)";
+
+  CompileSuccessfully(GenerateShaderCodeForDebugInfo(
+      src, "", dbg_inst_header, body, extension, "Vertex"));
+  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
+  EXPECT_THAT(getDiagnosticString(), HasSubstr("expected operand Inlined At"));
+}
+
+TEST_F(ValidateVulkan100DebugInfo, DebugLexicalBlock) {
+  const std::string src = R"(
+%src = OpString "simple.hlsl"
+%code = OpString "main() {}"
+%main_name = OpString "main"
+)";
+
+  const std::string constants = R"(
+%u32_4 = OpConstant %u32 4
+%u32_5 = OpConstant %u32 5
+)";
+
+  const std::string dbg_inst_header = R"(
+%dbg_src = OpExtInst %void %DbgExt DebugSource %src %code
+%comp_unit = OpExtInst %void %DbgExt DebugCompilationUnit %u32_2 %u32_4 %dbg_src %u32_5
+%main_block = OpExtInst %void %DbgExt DebugLexicalBlock %dbg_src %u32_1 %u32_1 %comp_unit %main_name
+)";
+
+  const std::string extension = R"(
+OpExtension "SPV_KHR_non_semantic_info"
+%DbgExt = OpExtInstImport "NonSemantic.Vulkan.DebugInfo.100"
+)";
+
+  CompileSuccessfully(GenerateShaderCodeForDebugInfo(
+      src, constants, dbg_inst_header, "", extension, "Vertex"));
+  ASSERT_EQ(SPV_SUCCESS, ValidateInstructions());
+}
+
+TEST_P(ValidateVulkan100DebugInfoDebugLexicalBlock, Fail) {
+  const std::string src = R"(
+%src = OpString "simple.hlsl"
+%code = OpString "main() {}"
+%main_name = OpString "main"
+)";
+
+  const std::string constants = R"(
+%u32_4 = OpConstant %u32 4
+%u32_5 = OpConstant %u32 5
+)";
+
+  const auto& param = GetParam();
+
+  std::ostringstream ss;
+  ss << R"(
+%dbg_src = OpExtInst %void %DbgExt DebugSource %src %code
+%comp_unit = OpExtInst %void %DbgExt DebugCompilationUnit %u32_2 %u32_4 %dbg_src %u32_5
+%main_block = OpExtInst %void %DbgExt DebugLexicalBlock )"
+     << param.first;
+
+  const std::string extension = R"(
+OpExtension "SPV_KHR_non_semantic_info"
+%DbgExt = OpExtInstImport "NonSemantic.Vulkan.DebugInfo.100"
+)";
+
+  CompileSuccessfully(GenerateShaderCodeForDebugInfo(src, constants, ss.str(),
+                                                     "", extension, "Vertex"));
+  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
+  EXPECT_THAT(getDiagnosticString(),
+              HasSubstr("expected operand " + param.second));
+}
+
+INSTANTIATE_TEST_SUITE_P(
+    AllVulkan100DebugInfoFail, ValidateVulkan100DebugInfoDebugLexicalBlock,
+    ::testing::ValuesIn(std::vector<std::pair<std::string, std::string>>{
+        std::make_pair(R"(%comp_unit %u32_1 %u32_1 %comp_unit %main_name)",
+                       "Source"),
+        std::make_pair(R"(%dbg_src %u32_1 %u32_1 %dbg_src %main_name)",
+                       "Parent"),
+        std::make_pair(R"(%dbg_src %u32_1 %u32_1 %comp_unit %void)", "Name"),
+    }));
+
+TEST_F(ValidateVulkan100DebugInfo, DebugScopeFailScope) {
+  const std::string src = R"(
+%src = OpString "simple.hlsl"
+%code = OpString "void main() {}"
+)";
+
+  const std::string constants = R"(
+%u32_4 = OpConstant %u32 4
+%u32_5 = OpConstant %u32 5
+)";
+
+  const std::string dbg_inst_header = R"(
+%dbg_src = OpExtInst %void %DbgExt DebugSource %src %code
+%comp_unit = OpExtInst %void %DbgExt DebugCompilationUnit %u32_2 %u32_4 %dbg_src %u32_5
+)";
+
+  const std::string body = R"(
+%main_scope = OpExtInst %void %DbgExt DebugScope %dbg_src
+)";
+
+  const std::string extension = R"(
+OpExtension "SPV_KHR_non_semantic_info"
+%DbgExt = OpExtInstImport "NonSemantic.Vulkan.DebugInfo.100"
+)";
+
+  CompileSuccessfully(GenerateShaderCodeForDebugInfo(
+      src, constants, dbg_inst_header, body, extension, "Vertex"));
+  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
+  EXPECT_THAT(getDiagnosticString(), HasSubstr("expected operand Scope"));
+}
+
+TEST_F(ValidateVulkan100DebugInfo, DebugScopeFailInlinedAt) {
+  const std::string src = R"(
+%src = OpString "simple.hlsl"
+%code = OpString "void main() {}"
+)";
+
+  const std::string constants = R"(
+%u32_4 = OpConstant %u32 4
+%u32_5 = OpConstant %u32 5
+)";
+
+  const std::string dbg_inst_header = R"(
+%dbg_src = OpExtInst %void %DbgExt DebugSource %src %code
+%comp_unit = OpExtInst %void %DbgExt DebugCompilationUnit %u32_2 %u32_4 %dbg_src %u32_5
+)";
+
+  const std::string body = R"(
+%main_scope = OpExtInst %void %DbgExt DebugScope %comp_unit %dbg_src
+)";
+
+  const std::string extension = R"(
+OpExtension "SPV_KHR_non_semantic_info"
+%DbgExt = OpExtInstImport "NonSemantic.Vulkan.DebugInfo.100"
+)";
+
+  CompileSuccessfully(GenerateShaderCodeForDebugInfo(
+      src, constants, dbg_inst_header, body, extension, "Vertex"));
+  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
+  EXPECT_THAT(getDiagnosticString(), HasSubstr("expected operand Inlined At"));
+}
+
+TEST_F(ValidateOpenCL100DebugInfo, DebugLocalVariable) {
+  const std::string src = R"(
+%src = OpString "simple.hlsl"
+%code = OpString "void main() { float foo; }"
+%float_name = OpString "float"
+%foo_name = OpString "foo"
+)";
+
+  const std::string size_const = R"(
+%int_32 = OpConstant %u32 32
+)";
+
+  const std::string dbg_inst_header = R"(
+%dbg_src = OpExtInst %void %DbgExt DebugSource %src %code
+%comp_unit = OpExtInst %void %DbgExt DebugCompilationUnit 2 4 %dbg_src HLSL
+%float_info = OpExtInst %void %DbgExt DebugTypeBasic %float_name %int_32 Float
+%foo = OpExtInst %void %DbgExt DebugLocalVariable %foo_name %float_info %dbg_src 1 10 %comp_unit FlagIsLocal 0
+)";
+
+  const std::string extension = R"(
+%DbgExt = OpExtInstImport "OpenCL.DebugInfo.100"
+)";
+
+  CompileSuccessfully(GenerateShaderCodeForDebugInfo(
+      src, size_const, dbg_inst_header, "", extension, "Vertex"));
+  ASSERT_EQ(SPV_SUCCESS, ValidateInstructions());
+}
+
+TEST_P(ValidateOpenCL100DebugInfoDebugLocalVariable, Fail) {
+  const std::string src = R"(
+%src = OpString "simple.hlsl"
+%code = OpString "void main() { float foo; }"
+%float_name = OpString "float"
+%foo_name = OpString "foo"
+)";
+
+  const std::string size_const = R"(
+%int_32 = OpConstant %u32 32
+)";
+
+  const auto& param = GetParam();
+
+  std::ostringstream ss;
+  ss << R"(
+%dbg_src = OpExtInst %void %DbgExt DebugSource %src %code
+%comp_unit = OpExtInst %void %DbgExt DebugCompilationUnit 2 4 %dbg_src HLSL
+%float_info = OpExtInst %void %DbgExt DebugTypeBasic %float_name %int_32 Float
+%foo = OpExtInst %void %DbgExt DebugLocalVariable )"
+     << param.first;
+
+  const std::string extension = R"(
+%DbgExt = OpExtInstImport "OpenCL.DebugInfo.100"
+)";
+
+  CompileSuccessfully(GenerateShaderCodeForDebugInfo(src, size_const, ss.str(),
+                                                     "", extension, "Vertex"));
+  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
+  EXPECT_THAT(getDiagnosticString(),
+              HasSubstr("expected operand " + param.second));
+}
+
+INSTANTIATE_TEST_SUITE_P(
+    AllOpenCL100DebugInfoFail, ValidateOpenCL100DebugInfoDebugLocalVariable,
+    ::testing::ValuesIn(std::vector<std::pair<std::string, std::string>>{
+        std::make_pair(
+            R"(%void %float_info %dbg_src 1 10 %comp_unit FlagIsLocal 0)",
+            "Name"),
+        std::make_pair(
+            R"(%foo_name %dbg_src %dbg_src 1 10 %comp_unit FlagIsLocal 0)",
+            "Type"),
+        std::make_pair(
+            R"(%foo_name %float_info %comp_unit 1 10 %comp_unit FlagIsLocal 0)",
+            "Source"),
+        std::make_pair(
+            R"(%foo_name %float_info %dbg_src 1 10 %dbg_src FlagIsLocal 0)",
+            "Parent"),
+    }));
+
+TEST_F(ValidateVulkan100DebugInfo, DebugLocalVariable) {
+  const std::string src = R"(
+%src = OpString "simple.hlsl"
+%code = OpString "void main() { float foo; }"
+%float_name = OpString "float"
+%foo_name = OpString "foo"
+)";
+
+  const std::string constants = R"(
+%u32_4 = OpConstant %u32 4
+%u32_5 = OpConstant %u32 5
+%u32_10 = OpConstant %u32 10
+%u32_32 = OpConstant %u32 32
+)";
+
+  const std::string dbg_inst_header = R"(
+%dbg_src = OpExtInst %void %DbgExt DebugSource %src %code
+%comp_unit = OpExtInst %void %DbgExt DebugCompilationUnit %u32_2 %u32_4 %dbg_src %u32_5
+%float_info = OpExtInst %void %DbgExt DebugTypeBasic %float_name %u32_32 %u32_3 %u32_0
+%foo = OpExtInst %void %DbgExt DebugLocalVariable %foo_name %float_info %dbg_src %u32_1 %u32_10 %comp_unit %u32_4
+)";
+
+  const std::string extension = R"(
+OpExtension "SPV_KHR_non_semantic_info"
+%DbgExt = OpExtInstImport "NonSemantic.Vulkan.DebugInfo.100"
+)";
+
+  CompileSuccessfully(GenerateShaderCodeForDebugInfo(
+      src, constants, dbg_inst_header, "", extension, "Vertex"));
+  ASSERT_EQ(SPV_SUCCESS, ValidateInstructions());
+}
+
+TEST_P(ValidateVulkan100DebugInfoDebugLocalVariable, Fail) {
+  const std::string src = R"(
+%src = OpString "simple.hlsl"
+%code = OpString "void main() { float foo; }"
+%float_name = OpString "float"
+%foo_name = OpString "foo"
+)";
+
+  const std::string constants = R"(
+%u32_4 = OpConstant %u32 4
+%u32_5 = OpConstant %u32 5
+%u32_10 = OpConstant %u32 10
+%u32_32 = OpConstant %u32 32
+)";
+
+  const auto& param = GetParam();
+
+  std::ostringstream ss;
+  ss << R"(
+%dbg_src = OpExtInst %void %DbgExt DebugSource %src %code
+%comp_unit = OpExtInst %void %DbgExt DebugCompilationUnit %u32_2 %u32_4 %dbg_src %u32_5
+%float_info = OpExtInst %void %DbgExt DebugTypeBasic %float_name %u32_32 %u32_3 %u32_0
+%foo = OpExtInst %void %DbgExt DebugLocalVariable )"
+     << param.first;
+
+  const std::string extension = R"(
+OpExtension "SPV_KHR_non_semantic_info"
+%DbgExt = OpExtInstImport "NonSemantic.Vulkan.DebugInfo.100"
+)";
+
+  CompileSuccessfully(GenerateShaderCodeForDebugInfo(src, constants, ss.str(),
+                                                     "", extension, "Vertex"));
+  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
+  EXPECT_THAT(getDiagnosticString(),
+              HasSubstr("expected operand " + param.second));
+}
+
+INSTANTIATE_TEST_SUITE_P(
+    AllVulkan100DebugInfoFail, ValidateVulkan100DebugInfoDebugLocalVariable,
+    ::testing::ValuesIn(std::vector<std::pair<std::string, std::string>>{
+        std::make_pair(
+            R"(%void %float_info %dbg_src %u32_1 %u32_10 %comp_unit %u32_3 %u32_0)",
+            "Name"),
+        std::make_pair(
+            R"(%foo_name %dbg_src %dbg_src %u32_1 %u32_10 %comp_unit %u32_3 %u32_0)",
+            "Type"),
+        std::make_pair(
+            R"(%foo_name %float_info %comp_unit %u32_1 %u32_10 %comp_unit %u32_3 %u32_0)",
+            "Source"),
+        std::make_pair(
+            R"(%foo_name %float_info %dbg_src %u32_1 %u32_10 %dbg_src %u32_3 %u32_0)",
+            "Parent"),
+    }));
+
+TEST_F(ValidateOpenCL100DebugInfo, DebugDeclare) {
+  const std::string src = R"(
+%src = OpString "simple.hlsl"
+%code = OpString "void main() { float foo; }"
+%float_name = OpString "float"
+%foo_name = OpString "foo"
+)";
+
+  const std::string size_const = R"(
+%int_32 = OpConstant %u32 32
+)";
+
+  const std::string dbg_inst_header = R"(
+%dbg_src = OpExtInst %void %DbgExt DebugSource %src %code
+%comp_unit = OpExtInst %void %DbgExt DebugCompilationUnit 2 4 %dbg_src HLSL
+%null_expr = OpExtInst %void %DbgExt DebugExpression
+%float_info = OpExtInst %void %DbgExt DebugTypeBasic %float_name %int_32 Float
+%foo_info = OpExtInst %void %DbgExt DebugLocalVariable %foo_name %float_info %dbg_src 1 10 %comp_unit FlagIsLocal 0
+)";
+
+  const std::string body = R"(
+%foo = OpVariable %f32_ptr_function Function
+%decl = OpExtInst %void %DbgExt DebugDeclare %foo_info %foo %null_expr
+)";
+
+  const std::string extension = R"(
+%DbgExt = OpExtInstImport "OpenCL.DebugInfo.100"
+)";
+
+  CompileSuccessfully(GenerateShaderCodeForDebugInfo(
+      src, size_const, dbg_inst_header, body, extension, "Vertex"));
+  ASSERT_EQ(SPV_SUCCESS, ValidateInstructions());
+}
+
+TEST_F(ValidateOpenCL100DebugInfo, DebugDeclareParam) {
+  CompileSuccessfully(R"(
+               OpCapability Shader
+          %1 = OpExtInstImport "OpenCL.DebugInfo.100"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Vertex %main "main" %in_var_COLOR
+          %4 = OpString "test.hlsl"
+               OpSource HLSL 620 %4 "#line 1 \"test.hlsl\"
+void main(float foo:COLOR) {}
+"
+         %11 = OpString "#line 1 \"test.hlsl\"
+void main(float foo:COLOR) {}
+"
+         %14 = OpString "float"
+         %17 = OpString "src.main"
+         %20 = OpString "foo"
+               OpName %in_var_COLOR "in.var.COLOR"
+               OpName %main "main"
+               OpName %param_var_foo "param.var.foo"
+               OpName %src_main "src.main"
+               OpName %foo "foo"
+               OpName %bb_entry "bb.entry"
+               OpDecorate %in_var_COLOR Location 0
+       %uint = OpTypeInt 32 0
+    %uint_32 = OpConstant %uint 32
+      %float = OpTypeFloat 32
+%_ptr_Input_float = OpTypePointer Input %float
+       %void = OpTypeVoid
+         %23 = OpTypeFunction %void
+%_ptr_Function_float = OpTypePointer Function %float
+         %29 = OpTypeFunction %void %_ptr_Function_float
+               OpLine %4 1 21
+%in_var_COLOR = OpVariable %_ptr_Input_float Input
+         %10 = OpExtInst %void %1 DebugExpression
+         %12 = OpExtInst %void %1 DebugSource %4 %11
+         %13 = OpExtInst %void %1 DebugCompilationUnit 1 4 %12 HLSL
+         %15 = OpExtInst %void %1 DebugTypeBasic %14 %uint_32 Float
+         %16 = OpExtInst %void %1 DebugTypeFunction FlagIsProtected|FlagIsPrivate %void %15
+         %18 = OpExtInst %void %1 DebugFunction %17 %16 %12 1 1 %13 %17 FlagIsProtected|FlagIsPrivate 1 %src_main
+         %21 = OpExtInst %void %1 DebugLocalVariable %20 %15 %12 1 17 %18 FlagIsLocal 0
+         %22 = OpExtInst %void %1 DebugLexicalBlock %12 1 28 %18
+               OpLine %4 1 1
+       %main = OpFunction %void None %23
+         %24 = OpLabel
+               OpLine %4 1 17
+%param_var_foo = OpVariable %_ptr_Function_float Function
+         %27 = OpLoad %float %in_var_COLOR
+               OpLine %4 1 1
+         %28 = OpFunctionCall %void %src_main %param_var_foo
+               OpReturn
+               OpFunctionEnd
+   %src_main = OpFunction %void None %29
+               OpLine %4 1 17
+        %foo = OpFunctionParameter %_ptr_Function_float
+         %31 = OpExtInst %void %1 DebugDeclare %21 %foo %10
+   %bb_entry = OpLabel
+               OpLine %4 1 29
+               OpReturn
+               OpFunctionEnd
+)");
+  ASSERT_EQ(SPV_SUCCESS, ValidateInstructions());
+}
+
+TEST_P(ValidateOpenCL100DebugInfoDebugDeclare, Fail) {
+  const std::string src = R"(
+%src = OpString "simple.hlsl"
+%code = OpString "void main() { float foo; }"
+%float_name = OpString "float"
+%foo_name = OpString "foo"
+)";
+
+  const std::string size_const = R"(
+%int_32 = OpConstant %u32 32
+)";
+
+  const std::string dbg_inst_header = R"(
+%dbg_src = OpExtInst %void %DbgExt DebugSource %src %code
+%comp_unit = OpExtInst %void %DbgExt DebugCompilationUnit 2 4 %dbg_src HLSL
+%null_expr = OpExtInst %void %DbgExt DebugExpression
+%float_info = OpExtInst %void %DbgExt DebugTypeBasic %float_name %int_32 Float
+%foo_info = OpExtInst %void %DbgExt DebugLocalVariable %foo_name %float_info %dbg_src 1 10 %comp_unit FlagIsLocal 0
+)";
+
+  const auto& param = GetParam();
+
+  std::ostringstream ss;
+  ss << R"(
+%foo = OpVariable %f32_ptr_function Function
+%decl = OpExtInst %void %DbgExt DebugDeclare )"
+     << param.first;
+
+  const std::string extension = R"(
+%DbgExt = OpExtInstImport "OpenCL.DebugInfo.100"
+)";
+
+  CompileSuccessfully(GenerateShaderCodeForDebugInfo(
+      src, size_const, dbg_inst_header, ss.str(), extension, "Vertex"));
+  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
+  EXPECT_THAT(getDiagnosticString(),
+              HasSubstr("expected operand " + param.second));
+}
+
+INSTANTIATE_TEST_SUITE_P(
+    AllOpenCL100DebugInfoFail, ValidateOpenCL100DebugInfoDebugDeclare,
+    ::testing::ValuesIn(std::vector<std::pair<std::string, std::string>>{
+        std::make_pair(R"(%dbg_src %foo %null_expr)", "Local Variable"),
+        std::make_pair(R"(%foo_info %void %null_expr)", "Variable"),
+        std::make_pair(R"(%foo_info %foo %dbg_src)", "Expression"),
+    }));
+
+TEST_F(ValidateVulkan100DebugInfo, DebugDeclare) {
+  const std::string src = R"(
+%src = OpString "simple.hlsl"
+%code = OpString "void main() { float foo; }"
+%float_name = OpString "float"
+%foo_name = OpString "foo"
+)";
+
+  const std::string constants = R"(
+%u32_4 = OpConstant %u32 4
+%u32_5 = OpConstant %u32 5
+%u32_10 = OpConstant %u32 10
+%u32_32 = OpConstant %u32 32
+)";
+
+  const std::string dbg_inst_header = R"(
+%dbg_src = OpExtInst %void %DbgExt DebugSource %src %code
+%comp_unit = OpExtInst %void %DbgExt DebugCompilationUnit %u32_2 %u32_4 %dbg_src %u32_5
+%null_expr = OpExtInst %void %DbgExt DebugExpression
+%float_info = OpExtInst %void %DbgExt DebugTypeBasic %float_name %u32_32 %u32_3 %u32_0
+%foo_info = OpExtInst %void %DbgExt DebugLocalVariable %foo_name %float_info %dbg_src %u32_1 %u32_10 %comp_unit %u32_4
+)";
+
+  const std::string extension = R"(
+OpExtension "SPV_KHR_non_semantic_info"
+%DbgExt = OpExtInstImport "NonSemantic.Vulkan.DebugInfo.100"
+)";
+
+  const std::string body = R"(
+%foo = OpVariable %f32_ptr_function Function
+%decl = OpExtInst %void %DbgExt DebugDeclare %foo_info %foo %null_expr
+)";
+
+  CompileSuccessfully(GenerateShaderCodeForDebugInfo(
+      src, constants, dbg_inst_header, body, extension, "Vertex"));
+  ASSERT_EQ(SPV_SUCCESS, ValidateInstructions());
+}
+
+TEST_F(ValidateVulkan100DebugInfo, DebugDeclareParam) {
+  CompileSuccessfully(R"(
+               OpCapability Shader
+               OpExtension "SPV_KHR_non_semantic_info"
+          %1 = OpExtInstImport "NonSemantic.Vulkan.DebugInfo.100"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Vertex %main "main" %in_var_COLOR
+          %4 = OpString "test.hlsl"
+               OpSource HLSL 620 %4 "#line 1 \"test.hlsl\"
+void main(float foo:COLOR) {}
+"
+         %11 = OpString "#line 1 \"test.hlsl\"
+void main(float foo:COLOR) {}
+"
+         %14 = OpString "float"
+         %17 = OpString "src.main"
+         %20 = OpString "foo"
+               OpName %in_var_COLOR "in.var.COLOR"
+               OpName %main "main"
+               OpName %param_var_foo "param.var.foo"
+               OpName %src_main "src.main"
+               OpName %foo "foo"
+               OpName %bb_entry "bb.entry"
+               OpDecorate %in_var_COLOR Location 0
+       %uint = OpTypeInt 32 0
+      %u32_0 = OpConstant %uint 0
+      %u32_1 = OpConstant %uint 1
+      %u32_2 = OpConstant %uint 2
+      %u32_3 = OpConstant %uint 3
+      %u32_4 = OpConstant %uint 4
+      %u32_5 = OpConstant %uint 5
+     %u32_10 = OpConstant %uint 10
+     %u32_17 = OpConstant %uint 17
+     %u32_28 = OpConstant %uint 28
+     %u32_32 = OpConstant %uint 32
+    %uint_32 = OpConstant %uint 32
+      %float = OpTypeFloat 32
+%_ptr_Input_float = OpTypePointer Input %float
+       %void = OpTypeVoid
+         %23 = OpTypeFunction %void
+%_ptr_Function_float = OpTypePointer Function %float
+         %29 = OpTypeFunction %void %_ptr_Function_float
+               OpLine %4 1 21
+%in_var_COLOR = OpVariable %_ptr_Input_float Input
+         %10 = OpExtInst %void %1 DebugExpression
+         %12 = OpExtInst %void %1 DebugSource %4 %11
+         %13 = OpExtInst %void %1 DebugCompilationUnit %u32_1 %u32_4 %12 %u32_5
+         %15 = OpExtInst %void %1 DebugTypeBasic %14 %uint_32 %u32_3 %u32_0
+         %16 = OpExtInst %void %1 DebugTypeFunction %u32_3 %void %15
+         %18 = OpExtInst %void %1 DebugFunction %17 %16 %12 %u32_1 %u32_1 %13 %17 %u32_3 %u32_1
+         %21 = OpExtInst %void %1 DebugLocalVariable %20 %15 %12 %u32_1 %u32_17 %18 %u32_4 %u32_0
+         %22 = OpExtInst %void %1 DebugLexicalBlock %12 %u32_1 %u32_28 %18
+       %main = OpFunction %void None %23
+         %24 = OpLabel
+%param_var_foo = OpVariable %_ptr_Function_float Function
+         %27 = OpLoad %float %in_var_COLOR
+         %28 = OpFunctionCall %void %src_main %param_var_foo
+               OpReturn
+               OpFunctionEnd
+   %src_main = OpFunction %void None %29
+        %foo = OpFunctionParameter %_ptr_Function_float
+         %31 = OpExtInst %void %1 DebugDeclare %21 %foo %10
+   %bb_entry = OpLabel
+               OpReturn
+               OpFunctionEnd
+)");
+  ASSERT_EQ(SPV_SUCCESS, ValidateInstructions());
+}
+
+TEST_P(ValidateVulkan100DebugInfoDebugDeclare, Fail) {
+  const std::string src = R"(
+%src = OpString "simple.hlsl"
+%code = OpString "void main() { float foo; }"
+%float_name = OpString "float"
+%foo_name = OpString "foo"
+)";
+
+  const std::string constants = R"(
+%u32_4 = OpConstant %u32 4
+%u32_5 = OpConstant %u32 5
+%u32_10 = OpConstant %u32 10
+%u32_32 = OpConstant %u32 32
+)";
+
+  const std::string dbg_inst_header = R"(
+%dbg_src = OpExtInst %void %DbgExt DebugSource %src %code
+%comp_unit = OpExtInst %void %DbgExt DebugCompilationUnit %u32_2 %u32_4 %dbg_src %u32_5
+%null_expr = OpExtInst %void %DbgExt DebugExpression
+%float_info = OpExtInst %void %DbgExt DebugTypeBasic %float_name %u32_32 %u32_3 %u32_0
+%foo_info = OpExtInst %void %DbgExt DebugLocalVariable %foo_name %float_info %dbg_src %u32_1 %u32_10 %comp_unit %u32_4
+)";
+
+  const std::string extension = R"(
+OpExtension "SPV_KHR_non_semantic_info"
+%DbgExt = OpExtInstImport "NonSemantic.Vulkan.DebugInfo.100"
+)";
+
+  const auto& param = GetParam();
+
+  std::ostringstream ss;
+  ss << R"(
+%foo = OpVariable %f32_ptr_function Function
+%decl = OpExtInst %void %DbgExt DebugDeclare )"
+     << param.first;
+
+  CompileSuccessfully(GenerateShaderCodeForDebugInfo(
+      src, constants, dbg_inst_header, ss.str(), extension, "Vertex"));
+  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
+  EXPECT_THAT(getDiagnosticString(),
+              HasSubstr("expected operand " + param.second));
+}
+
+INSTANTIATE_TEST_SUITE_P(
+    AllVulkan100DebugInfoFail, ValidateVulkan100DebugInfoDebugDeclare,
+    ::testing::ValuesIn(std::vector<std::pair<std::string, std::string>>{
+        std::make_pair(R"(%dbg_src %foo %null_expr)", "Local Variable"),
+        std::make_pair(R"(%foo_info %void %null_expr)", "Variable"),
+        std::make_pair(R"(%foo_info %foo %dbg_src)", "Expression"),
+    }));
+
+TEST_F(ValidateOpenCL100DebugInfo, DebugExpression) {
+  const std::string dbg_inst_header = R"(
+%op0 = OpExtInst %void %DbgExt DebugOperation Deref
+%op1 = OpExtInst %void %DbgExt DebugOperation Plus
+%null_expr = OpExtInst %void %DbgExt DebugExpression %op0 %op1
+)";
+
+  const std::string extension = R"(
+%DbgExt = OpExtInstImport "OpenCL.DebugInfo.100"
+)";
+
+  CompileSuccessfully(GenerateShaderCodeForDebugInfo("", "", dbg_inst_header,
+                                                     "", extension, "Vertex"));
+  ASSERT_EQ(SPV_SUCCESS, ValidateInstructions());
+}
+
+TEST_F(ValidateOpenCL100DebugInfo, DebugExpressionFail) {
+  const std::string dbg_inst_header = R"(
+%op = OpExtInst %void %DbgExt DebugOperation Deref
+%null_expr = OpExtInst %void %DbgExt DebugExpression %op %void
+)";
+
+  const std::string extension = R"(
+%DbgExt = OpExtInstImport "OpenCL.DebugInfo.100"
+)";
+
+  CompileSuccessfully(GenerateShaderCodeForDebugInfo("", "", dbg_inst_header,
+                                                     "", extension, "Vertex"));
+  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
+  EXPECT_THAT(
+      getDiagnosticString(),
+      HasSubstr(
+          "expected operand Operation must be a result id of DebugOperation"));
+}
+
+TEST_F(ValidateVulkan100DebugInfo, DebugExpression) {
+  const std::string dbg_inst_header = R"(
+%op0 = OpExtInst %void %DbgExt DebugOperation %u32_0
+%op1 = OpExtInst %void %DbgExt DebugOperation %u32_1
+%null_expr = OpExtInst %void %DbgExt DebugExpression %op0 %op1
+)";
+
+  const std::string extension = R"(
+OpExtension "SPV_KHR_non_semantic_info"
+%DbgExt = OpExtInstImport "NonSemantic.Vulkan.DebugInfo.100"
+)";
+
+  CompileSuccessfully(GenerateShaderCodeForDebugInfo("", "", dbg_inst_header,
+                                                     "", extension, "Vertex"));
+  ASSERT_EQ(SPV_SUCCESS, ValidateInstructions());
+}
+
+TEST_F(ValidateVulkan100DebugInfo, DebugExpressionFail) {
+  const std::string dbg_inst_header = R"(
+%op = OpExtInst %void %DbgExt DebugOperation %u32_0
+%null_expr = OpExtInst %void %DbgExt DebugExpression %op %void
+)";
+
+  const std::string extension = R"(
+OpExtension "SPV_KHR_non_semantic_info"
+%DbgExt = OpExtInstImport "NonSemantic.Vulkan.DebugInfo.100"
+)";
+
+  CompileSuccessfully(GenerateShaderCodeForDebugInfo("", "", dbg_inst_header,
+                                                     "", extension, "Vertex"));
+  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
+  EXPECT_THAT(
+      getDiagnosticString(),
+      HasSubstr(
+          "expected operand Operation must be a result id of DebugOperation"));
+}
+
+TEST_F(ValidateOpenCL100DebugInfo, DebugTypeTemplate) {
+  const std::string src = R"(
+%src = OpString "simple.hlsl"
+%code = OpString "OpaqueType foo;
+main() {}
+"
+%float_name = OpString "float"
+%ty_name = OpString "Texture"
+%t_name = OpString "T"
+)";
+
+  const std::string size_const = R"(
+%int_32 = OpConstant %u32 32
+%int_128 = OpConstant %u32 128
+)";
+
+  const std::string dbg_inst_header = R"(
+%dbg_none = OpExtInst %void %DbgExt DebugInfoNone
+%dbg_src = OpExtInst %void %DbgExt DebugSource %src %code
+%comp_unit = OpExtInst %void %DbgExt DebugCompilationUnit 2 4 %dbg_src HLSL
+%float_info = OpExtInst %void %DbgExt DebugTypeBasic %float_name %int_32 Float
+%opaque = OpExtInst %void %DbgExt DebugTypeComposite %ty_name Class %dbg_src 1 1 %comp_unit %ty_name %dbg_none FlagIsPublic
+%param = OpExtInst %void %DbgExt DebugTypeTemplateParameter %t_name %float_info %dbg_none %dbg_src 0 0
+%temp = OpExtInst %void %DbgExt DebugTypeTemplate %opaque %param
+)";
+
+  const std::string extension = R"(
+%DbgExt = OpExtInstImport "OpenCL.DebugInfo.100"
+)";
+
+  CompileSuccessfully(GenerateShaderCodeForDebugInfo(
+      src, size_const, dbg_inst_header, "", extension, "Vertex"));
+  ASSERT_EQ(SPV_SUCCESS, ValidateInstructions());
+}
+
+TEST_F(ValidateOpenCL100DebugInfo, DebugTypeTemplateUsedForVariableType) {
+  const std::string src = R"(
+%src = OpString "simple.hlsl"
+%code = OpString "OpaqueType foo;
+main() {}
+"
+%float_name = OpString "float"
+%ty_name = OpString "Texture"
+%t_name = OpString "T"
+%foo_name = OpString "foo"
+)";
+
+  const std::string size_const = R"(
+%int_32 = OpConstant %u32 32
+%int_128 = OpConstant %u32 128
+)";
+
+  const std::string dbg_inst_header = R"(
+%dbg_none = OpExtInst %void %DbgExt DebugInfoNone
+%dbg_src = OpExtInst %void %DbgExt DebugSource %src %code
+%comp_unit = OpExtInst %void %DbgExt DebugCompilationUnit 2 4 %dbg_src HLSL
+%float_info = OpExtInst %void %DbgExt DebugTypeBasic %float_name %int_32 Float
+%opaque = OpExtInst %void %DbgExt DebugTypeComposite %ty_name Class %dbg_src 1 1 %comp_unit %ty_name %dbg_none FlagIsPublic
+%param = OpExtInst %void %DbgExt DebugTypeTemplateParameter %t_name %float_info %dbg_none %dbg_src 0 0
+%temp = OpExtInst %void %DbgExt DebugTypeTemplate %opaque %param
+%foo = OpExtInst %void %DbgExt DebugGlobalVariable %foo_name %temp %dbg_src 0 0 %comp_unit %foo_name %f32_input FlagIsProtected|FlagIsPrivate
+)";
+
+  const std::string extension = R"(
+%DbgExt = OpExtInstImport "OpenCL.DebugInfo.100"
+)";
+
+  CompileSuccessfully(GenerateShaderCodeForDebugInfo(
+      src, size_const, dbg_inst_header, "", extension, "Vertex"));
+  ASSERT_EQ(SPV_SUCCESS, ValidateInstructions());
+}
+
+TEST_F(ValidateOpenCL100DebugInfo, DebugTypeTemplateFunction) {
+  const std::string src = R"(
+%src = OpString "simple.hlsl"
+%code = OpString "OpaqueType foo;
+main() {}
+"
+%float_name = OpString "float"
+%ty_name = OpString "Texture"
+%t_name = OpString "T"
+%main_name = OpString "main"
+)";
+
+  const std::string size_const = R"(
+%int_32 = OpConstant %u32 32
+%int_128 = OpConstant %u32 128
+)";
+
+  const std::string dbg_inst_header = R"(
+%dbg_none = OpExtInst %void %DbgExt DebugInfoNone
+%dbg_src = OpExtInst %void %DbgExt DebugSource %src %code
+%comp_unit = OpExtInst %void %DbgExt DebugCompilationUnit 2 4 %dbg_src HLSL
+%float_info = OpExtInst %void %DbgExt DebugTypeBasic %float_name %int_32 Float
+%param = OpExtInst %void %DbgExt DebugTypeTemplateParameter %t_name %float_info %dbg_none %dbg_src 0 0
+%main_type_info = OpExtInst %void %DbgExt DebugTypeFunction FlagIsPublic %param %param
+%main_info = OpExtInst %void %DbgExt DebugFunction %main_name %main_type_info %dbg_src 1 1 %comp_unit %main_name FlagIsPublic 1 %main
+%temp = OpExtInst %void %DbgExt DebugTypeTemplate %main_info %param
+)";
+
+  const std::string extension = R"(
+%DbgExt = OpExtInstImport "OpenCL.DebugInfo.100"
+)";
+
+  CompileSuccessfully(GenerateShaderCodeForDebugInfo(
+      src, size_const, dbg_inst_header, "", extension, "Vertex"));
+  ASSERT_EQ(SPV_SUCCESS, ValidateInstructions());
+}
+
+TEST_F(ValidateOpenCL100DebugInfo, DebugTypeTemplateFailTarget) {
+  const std::string src = R"(
+%src = OpString "simple.hlsl"
+%code = OpString "OpaqueType foo;
+main() {}
+"
+%float_name = OpString "float"
+%ty_name = OpString "Texture"
+%t_name = OpString "T"
+%main_name = OpString "main"
+)";
+
+  const std::string size_const = R"(
+%int_32 = OpConstant %u32 32
+%int_128 = OpConstant %u32 128
+)";
+
+  const std::string dbg_inst_header = R"(
+%dbg_none = OpExtInst %void %DbgExt DebugInfoNone
+%dbg_src = OpExtInst %void %DbgExt DebugSource %src %code
+%comp_unit = OpExtInst %void %DbgExt DebugCompilationUnit 2 4 %dbg_src HLSL
+%float_info = OpExtInst %void %DbgExt DebugTypeBasic %float_name %int_32 Float
+%param = OpExtInst %void %DbgExt DebugTypeTemplateParameter %t_name %float_info %dbg_none %dbg_src 0 0
+%temp = OpExtInst %void %DbgExt DebugTypeTemplate %float_info %param
+)";
+
+  const std::string extension = R"(
+%DbgExt = OpExtInstImport "OpenCL.DebugInfo.100"
+)";
+
+  CompileSuccessfully(GenerateShaderCodeForDebugInfo(
+      src, size_const, dbg_inst_header, "", extension, "Vertex"));
+  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
+  EXPECT_THAT(getDiagnosticString(),
+              HasSubstr("expected operand Target must be DebugTypeComposite or "
+                        "DebugFunction"));
+}
+
+TEST_F(ValidateOpenCL100DebugInfo, DebugTypeTemplateFailParam) {
+  const std::string src = R"(
+%src = OpString "simple.hlsl"
+%code = OpString "OpaqueType foo;
+main() {}
+"
+%float_name = OpString "float"
+%ty_name = OpString "Texture"
+%t_name = OpString "T"
+%main_name = OpString "main"
+)";
+
+  const std::string size_const = R"(
+%int_32 = OpConstant %u32 32
+%int_128 = OpConstant %u32 128
+)";
+
+  const std::string dbg_inst_header = R"(
+%dbg_none = OpExtInst %void %DbgExt DebugInfoNone
+%dbg_src = OpExtInst %void %DbgExt DebugSource %src %code
+%comp_unit = OpExtInst %void %DbgExt DebugCompilationUnit 2 4 %dbg_src HLSL
+%float_info = OpExtInst %void %DbgExt DebugTypeBasic %float_name %int_32 Float
+%param = OpExtInst %void %DbgExt DebugTypeTemplateParameter %t_name %float_info %dbg_none %dbg_src 0 0
+%main_type_info = OpExtInst %void %DbgExt DebugTypeFunction FlagIsPublic %param %param
+%main_info = OpExtInst %void %DbgExt DebugFunction %main_name %main_type_info %dbg_src 1 1 %comp_unit %main_name FlagIsPublic 1 %main
+%temp = OpExtInst %void %DbgExt DebugTypeTemplate %main_info %float_info
+)";
+
+  const std::string extension = R"(
+%DbgExt = OpExtInstImport "OpenCL.DebugInfo.100"
+)";
+
+  CompileSuccessfully(GenerateShaderCodeForDebugInfo(
+      src, size_const, dbg_inst_header, "", extension, "Vertex"));
+  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
+  EXPECT_THAT(
+      getDiagnosticString(),
+      HasSubstr(
+          "expected operand Parameters must be DebugTypeTemplateParameter or "
+          "DebugTypeTemplateTemplateParameter"));
+}
+
+TEST_F(ValidateVulkan100DebugInfo, DebugTypeTemplate) {
+  const std::string src = R"(
+%src = OpString "simple.hlsl"
+%code = OpString "OpaqueType foo;
+main() {}
+"
+%float_name = OpString "float"
+%ty_name = OpString "Texture"
+%t_name = OpString "T"
+)";
+
+  const std::string constants = R"(
+%u32_4 = OpConstant %u32 4
+%u32_5 = OpConstant %u32 5
+%u32_32 = OpConstant %u32 32
+)";
+
+  const std::string dbg_inst_header = R"(
+%dbg_none = OpExtInst %void %DbgExt DebugInfoNone
+%dbg_src = OpExtInst %void %DbgExt DebugSource %src %code
+%comp_unit = OpExtInst %void %DbgExt DebugCompilationUnit %u32_2 %u32_4 %dbg_src %u32_5
+%float_info = OpExtInst %void %DbgExt DebugTypeBasic %float_name %u32_32 %u32_3 %u32_0
+%opaque = OpExtInst %void %DbgExt DebugTypeComposite %ty_name %u32_1 %dbg_src %u32_1 %u32_1 %comp_unit %ty_name %dbg_none %u32_3
+%param = OpExtInst %void %DbgExt DebugTypeTemplateParameter %t_name %float_info %dbg_none %dbg_src %u32_0 %u32_0
+%temp = OpExtInst %void %DbgExt DebugTypeTemplate %opaque %param
+)";
+
+  const std::string extension = R"(
+OpExtension "SPV_KHR_non_semantic_info"
+%DbgExt = OpExtInstImport "NonSemantic.Vulkan.DebugInfo.100"
+)";
+
+  CompileSuccessfully(GenerateShaderCodeForDebugInfo(
+      src, constants, dbg_inst_header, "", extension, "Vertex"));
+  ASSERT_EQ(SPV_SUCCESS, ValidateInstructions());
+}
+
+TEST_F(ValidateVulkan100DebugInfo, DebugTypeTemplateUsedForVariableType) {
+  const std::string src = R"(
+%src = OpString "simple.hlsl"
+%code = OpString "OpaqueType foo;
+main() {}
+"
+%float_name = OpString "float"
+%ty_name = OpString "Texture"
+%t_name = OpString "T"
+%foo_name = OpString "foo"
+)";
+
+  const std::string constants = R"(
+%u32_4 = OpConstant %u32 4
+%u32_5 = OpConstant %u32 5
+%u32_32 = OpConstant %u32 32
+)";
+
+  const std::string dbg_inst_header = R"(
+%dbg_none = OpExtInst %void %DbgExt DebugInfoNone
+%dbg_src = OpExtInst %void %DbgExt DebugSource %src %code
+%comp_unit = OpExtInst %void %DbgExt DebugCompilationUnit %u32_2 %u32_4 %dbg_src %u32_5
+%float_info = OpExtInst %void %DbgExt DebugTypeBasic %float_name %u32_32 %u32_3 %u32_0
+%opaque = OpExtInst %void %DbgExt DebugTypeComposite %ty_name %u32_1 %dbg_src %u32_1 %u32_1 %comp_unit %ty_name %dbg_none %u32_3
+%param = OpExtInst %void %DbgExt DebugTypeTemplateParameter %t_name %float_info %dbg_none %dbg_src %u32_0 %u32_0
+%temp = OpExtInst %void %DbgExt DebugTypeTemplate %opaque %param
+%foo = OpExtInst %void %DbgExt DebugGlobalVariable %foo_name %temp %dbg_src %u32_0 %u32_0 %comp_unit %foo_name %f32_input %u32_3
+)";
+
+  const std::string extension = R"(
+OpExtension "SPV_KHR_non_semantic_info"
+%DbgExt = OpExtInstImport "NonSemantic.Vulkan.DebugInfo.100"
+)";
+
+  CompileSuccessfully(GenerateShaderCodeForDebugInfo(
+      src, constants, dbg_inst_header, "", extension, "Vertex"));
+  ASSERT_EQ(SPV_SUCCESS, ValidateInstructions());
+}
+
+TEST_F(ValidateVulkan100DebugInfo, DebugTypeTemplateFunction) {
+  const std::string src = R"(
+%src = OpString "simple.hlsl"
+%code = OpString "OpaqueType foo;
+main() {}
+"
+%float_name = OpString "float"
+%ty_name = OpString "Texture"
+%t_name = OpString "T"
+%main_name = OpString "main"
+)";
+
+  const std::string constants = R"(
+%u32_4 = OpConstant %u32 4
+%u32_5 = OpConstant %u32 5
+%u32_32 = OpConstant %u32 32
+)";
+
+  const std::string dbg_inst_header = R"(
+%dbg_none = OpExtInst %void %DbgExt DebugInfoNone
+%dbg_src = OpExtInst %void %DbgExt DebugSource %src %code
+%comp_unit = OpExtInst %void %DbgExt DebugCompilationUnit %u32_2 %u32_4 %dbg_src %u32_5
+%float_info = OpExtInst %void %DbgExt DebugTypeBasic %float_name %u32_32 %u32_3 %u32_0
+%param = OpExtInst %void %DbgExt DebugTypeTemplateParameter %t_name %float_info %dbg_none %dbg_src %u32_0 %u32_0
+%main_type_info = OpExtInst %void %DbgExt DebugTypeFunction %u32_3 %param %param
+%main_info = OpExtInst %void %DbgExt DebugFunction %main_name %main_type_info %dbg_src %u32_1 %u32_1 %comp_unit %main_name %u32_3 %u32_1
+%temp = OpExtInst %void %DbgExt DebugTypeTemplate %main_info %param
+)";
+
+  const std::string extension = R"(
+OpExtension "SPV_KHR_non_semantic_info"
+%DbgExt = OpExtInstImport "NonSemantic.Vulkan.DebugInfo.100"
+)";
+
+  CompileSuccessfully(GenerateShaderCodeForDebugInfo(
+      src, constants, dbg_inst_header, "", extension, "Vertex"));
+  ASSERT_EQ(SPV_SUCCESS, ValidateInstructions());
+}
+
+TEST_F(ValidateVulkan100DebugInfo, DebugTypeTemplateFailTarget) {
+  const std::string src = R"(
+%src = OpString "simple.hlsl"
+%code = OpString "OpaqueType foo;
+main() {}
+"
+%float_name = OpString "float"
+%ty_name = OpString "Texture"
+%t_name = OpString "T"
+%main_name = OpString "main"
+)";
+
+  const std::string constants = R"(
+%u32_4 = OpConstant %u32 4
+%u32_5 = OpConstant %u32 5
+%u32_32 = OpConstant %u32 32
+)";
+
+  const std::string dbg_inst_header = R"(
+%dbg_none = OpExtInst %void %DbgExt DebugInfoNone
+%dbg_src = OpExtInst %void %DbgExt DebugSource %src %code
+%comp_unit = OpExtInst %void %DbgExt DebugCompilationUnit %u32_2 %u32_4 %dbg_src %u32_5
+%float_info = OpExtInst %void %DbgExt DebugTypeBasic %float_name %u32_32 %u32_3 %u32_0
+%param = OpExtInst %void %DbgExt DebugTypeTemplateParameter %t_name %float_info %dbg_none %dbg_src %u32_0 %u32_0
+%temp = OpExtInst %void %DbgExt DebugTypeTemplate %float_info %param
+)";
+
+  const std::string extension = R"(
+OpExtension "SPV_KHR_non_semantic_info"
+%DbgExt = OpExtInstImport "NonSemantic.Vulkan.DebugInfo.100"
+)";
+
+  CompileSuccessfully(GenerateShaderCodeForDebugInfo(
+      src, constants, dbg_inst_header, "", extension, "Vertex"));
+  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
+  EXPECT_THAT(getDiagnosticString(),
+              HasSubstr("expected operand Target must be DebugTypeComposite or "
+                        "DebugFunction"));
+}
+
+TEST_F(ValidateVulkan100DebugInfo, DebugTypeTemplateFailParam) {
+  const std::string src = R"(
+%src = OpString "simple.hlsl"
+%code = OpString "OpaqueType foo;
+main() {}
+"
+%float_name = OpString "float"
+%ty_name = OpString "Texture"
+%t_name = OpString "T"
+%main_name = OpString "main"
+)";
+
+  const std::string constants = R"(
+%u32_4 = OpConstant %u32 4
+%u32_5 = OpConstant %u32 5
+%u32_32 = OpConstant %u32 32
+)";
+
+  const std::string dbg_inst_header = R"(
+%dbg_none = OpExtInst %void %DbgExt DebugInfoNone
+%dbg_src = OpExtInst %void %DbgExt DebugSource %src %code
+%comp_unit = OpExtInst %void %DbgExt DebugCompilationUnit %u32_2 %u32_4 %dbg_src %u32_5
+%float_info = OpExtInst %void %DbgExt DebugTypeBasic %float_name %u32_32 %u32_3 %u32_0
+%opaque = OpExtInst %void %DbgExt DebugTypeComposite %ty_name %u32_1 %dbg_src %u32_1 %u32_1 %comp_unit %ty_name %dbg_none %u32_3
+%param = OpExtInst %void %DbgExt DebugTypeTemplateParameter %t_name %float_info %dbg_none %dbg_src %u32_0 %u32_0
+%temp = OpExtInst %void %DbgExt DebugTypeTemplate %opaque %float_info
+)";
+
+  const std::string extension = R"(
+OpExtension "SPV_KHR_non_semantic_info"
+%DbgExt = OpExtInstImport "NonSemantic.Vulkan.DebugInfo.100"
+)";
+
+  CompileSuccessfully(GenerateShaderCodeForDebugInfo(
+      src, constants, dbg_inst_header, "", extension, "Vertex"));
+  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
+  EXPECT_THAT(
+      getDiagnosticString(),
+      HasSubstr(
+          "expected operand Parameters must be DebugTypeTemplateParameter or "
+          "DebugTypeTemplateTemplateParameter"));
+}
+
+TEST_F(ValidateOpenCL100DebugInfo, DebugGlobalVariable) {
+  const std::string src = R"(
+%src = OpString "simple.hlsl"
+%code = OpString "float foo; void main() {}"
+%float_name = OpString "float"
+%foo_name = OpString "foo"
+)";
+
+  const std::string size_const = R"(
+%int_32 = OpConstant %u32 32
+)";
+
+  const std::string dbg_inst_header = R"(
+%dbg_src = OpExtInst %void %DbgExt DebugSource %src %code
+%comp_unit = OpExtInst %void %DbgExt DebugCompilationUnit 2 4 %dbg_src HLSL
+%float_info = OpExtInst %void %DbgExt DebugTypeBasic %float_name %int_32 Float
+%foo = OpExtInst %void %DbgExt DebugGlobalVariable %foo_name %float_info %dbg_src 0 0 %comp_unit %foo_name %f32_input FlagIsProtected|FlagIsPrivate
+)";
+
+  const std::string extension = R"(
+%DbgExt = OpExtInstImport "OpenCL.DebugInfo.100"
+)";
+
+  CompileSuccessfully(GenerateShaderCodeForDebugInfo(
+      src, size_const, dbg_inst_header, "", extension, "Vertex"));
+  ASSERT_EQ(SPV_SUCCESS, ValidateInstructions());
+}
+
+TEST_F(ValidateOpenCL100DebugInfo, DebugGlobalVariableStaticMember) {
+  const std::string src = R"(
+%src = OpString "simple.hlsl"
+%code = OpString "float foo; void main() {}"
+%float_name = OpString "float"
+%foo_name = OpString "foo"
+)";
+
+  const std::string size_const = R"(
+%int_32 = OpConstant %u32 32
+)";
+
+  const std::string dbg_inst_header = R"(
+%dbg_src = OpExtInst %void %DbgExt DebugSource %src %code
+%comp_unit = OpExtInst %void %DbgExt DebugCompilationUnit 2 4 %dbg_src HLSL
+%float_info = OpExtInst %void %DbgExt DebugTypeBasic %float_name %int_32 Float
+%t = OpExtInst %void %DbgExt DebugTypeComposite %foo_name Class %dbg_src 0 0 %comp_unit %foo_name %int_32 FlagIsPublic %a
+%a = OpExtInst %void %DbgExt DebugTypeMember %foo_name %float_info %dbg_src 0 0 %t %u32_0 %int_32 FlagIsPublic
+%foo = OpExtInst %void %DbgExt DebugGlobalVariable %foo_name %float_info %dbg_src 0 0 %comp_unit %foo_name %f32_input FlagIsProtected|FlagIsPrivate %a
+)";
+
+  const std::string extension = R"(
+%DbgExt = OpExtInstImport "OpenCL.DebugInfo.100"
+)";
+
+  CompileSuccessfully(GenerateShaderCodeForDebugInfo(
+      src, size_const, dbg_inst_header, "", extension, "Vertex"));
+  ASSERT_EQ(SPV_SUCCESS, ValidateInstructions());
+}
+
+TEST_F(ValidateOpenCL100DebugInfo, DebugGlobalVariableDebugInfoNone) {
+  const std::string src = R"(
+%src = OpString "simple.hlsl"
+%code = OpString "float foo; void main() {}"
+%float_name = OpString "float"
+%foo_name = OpString "foo"
+)";
+
+  const std::string size_const = R"(
+%int_32 = OpConstant %u32 32
+)";
+
+  const std::string dbg_inst_header = R"(
+%dbgNone = OpExtInst %void %DbgExt DebugInfoNone
+%dbg_src = OpExtInst %void %DbgExt DebugSource %src %code
+%comp_unit = OpExtInst %void %DbgExt DebugCompilationUnit 2 4 %dbg_src HLSL
+%float_info = OpExtInst %void %DbgExt DebugTypeBasic %float_name %int_32 Float
+%foo = OpExtInst %void %DbgExt DebugGlobalVariable %foo_name %float_info %dbg_src 0 0 %comp_unit %foo_name %dbgNone FlagIsProtected|FlagIsPrivate
+)";
+
+  const std::string extension = R"(
+%DbgExt = OpExtInstImport "OpenCL.DebugInfo.100"
+)";
+
+  CompileSuccessfully(GenerateShaderCodeForDebugInfo(
+      src, size_const, dbg_inst_header, "", extension, "Vertex"));
+  ASSERT_EQ(SPV_SUCCESS, ValidateInstructions());
+}
+
+TEST_F(ValidateOpenCL100DebugInfo, DebugGlobalVariableConst) {
+  const std::string src = R"(
+%src = OpString "simple.hlsl"
+%code = OpString "float foo; void main() {}"
+%float_name = OpString "float"
+%foo_name = OpString "foo"
+)";
+
+  const std::string size_const = R"(
+%int_32 = OpConstant %u32 32
+)";
+
+  const std::string dbg_inst_header = R"(
+%dbg_src = OpExtInst %void %DbgExt DebugSource %src %code
+%comp_unit = OpExtInst %void %DbgExt DebugCompilationUnit 2 4 %dbg_src HLSL
+%float_info = OpExtInst %void %DbgExt DebugTypeBasic %float_name %int_32 Float
+%foo = OpExtInst %void %DbgExt DebugGlobalVariable %foo_name %float_info %dbg_src 0 0 %comp_unit %foo_name %int_32 FlagIsProtected|FlagIsPrivate
+)";
+
+  const std::string extension = R"(
+%DbgExt = OpExtInstImport "OpenCL.DebugInfo.100"
+)";
+
+  CompileSuccessfully(GenerateShaderCodeForDebugInfo(
+      src, size_const, dbg_inst_header, "", extension, "Vertex"));
+  ASSERT_EQ(SPV_SUCCESS, ValidateInstructions());
+}
+
+TEST_P(ValidateOpenCL100DebugInfoDebugGlobalVariable, Fail) {
+  const std::string src = R"(
+%src = OpString "simple.hlsl"
+%code = OpString "float foo; void main() {}"
+%float_name = OpString "float"
+%foo_name = OpString "foo"
+)";
+
+  const std::string size_const = R"(
+%int_32 = OpConstant %u32 32
+)";
+
+  const auto& param = GetParam();
+
+  std::ostringstream ss;
+  ss << R"(
+%dbg_src = OpExtInst %void %DbgExt DebugSource %src %code
+%comp_unit = OpExtInst %void %DbgExt DebugCompilationUnit 2 4 %dbg_src HLSL
+%float_info = OpExtInst %void %DbgExt DebugTypeBasic %float_name %int_32 Float
+%foo = OpExtInst %void %DbgExt DebugGlobalVariable )"
+     << param.first;
+
+  const std::string extension = R"(
+%DbgExt = OpExtInstImport "OpenCL.DebugInfo.100"
+)";
+
+  CompileSuccessfully(GenerateShaderCodeForDebugInfo(src, size_const, ss.str(),
+                                                     "", extension, "Vertex"));
+  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
+  EXPECT_THAT(getDiagnosticString(),
+              HasSubstr("expected operand " + param.second));
+}
+
+INSTANTIATE_TEST_SUITE_P(
+    AllOpenCL100DebugInfoFail, ValidateOpenCL100DebugInfoDebugGlobalVariable,
+    ::testing::ValuesIn(std::vector<std::pair<std::string, std::string>>{
+        std::make_pair(
+            R"(%void %float_info %dbg_src 0 0 %comp_unit %foo_name %f32_input FlagIsProtected|FlagIsPrivate)",
+            "Name"),
+        std::make_pair(
+            R"(%foo_name %dbg_src %dbg_src 0 0 %comp_unit %foo_name %f32_input FlagIsProtected|FlagIsPrivate)",
+            "Type"),
+        std::make_pair(
+            R"(%foo_name %float_info %comp_unit 0 0 %comp_unit %foo_name %f32_input FlagIsProtected|FlagIsPrivate)",
+            "Source"),
+        std::make_pair(
+            R"(%foo_name %float_info %dbg_src 0 0 %dbg_src %foo_name %f32_input FlagIsProtected|FlagIsPrivate)",
+            "Scope"),
+        std::make_pair(
+            R"(%foo_name %float_info %dbg_src 0 0 %comp_unit %void %f32_input FlagIsProtected|FlagIsPrivate)",
+            "Linkage Name"),
+        std::make_pair(
+            R"(%foo_name %float_info %dbg_src 0 0 %comp_unit %foo_name %void FlagIsProtected|FlagIsPrivate)",
+            "Variable"),
+    }));
+
+TEST_F(ValidateVulkan100DebugInfo, DebugGlobalVariable) {
+  const std::string src = R"(
+%src = OpString "simple.hlsl"
+%code = OpString "float foo; void main() {}"
+%float_name = OpString "float"
+%foo_name = OpString "foo"
+)";
+
+  const std::string constants = R"(
+%u32_4 = OpConstant %u32 4
+%u32_5 = OpConstant %u32 5
+%u32_32 = OpConstant %u32 32
+)";
+
+  const std::string dbg_inst_header = R"(
+%dbg_src = OpExtInst %void %DbgExt DebugSource %src %code
+%comp_unit = OpExtInst %void %DbgExt DebugCompilationUnit %u32_2 %u32_4 %dbg_src %u32_5
+%float_info = OpExtInst %void %DbgExt DebugTypeBasic %float_name %u32_32 %u32_3 %u32_0
+%foo = OpExtInst %void %DbgExt DebugGlobalVariable %foo_name %float_info %dbg_src %u32_0 %u32_0 %comp_unit %foo_name %f32_input %u32_3
+)";
+
+  const std::string extension = R"(
+OpExtension "SPV_KHR_non_semantic_info"
+%DbgExt = OpExtInstImport "NonSemantic.Vulkan.DebugInfo.100"
+)";
+
+  CompileSuccessfully(GenerateShaderCodeForDebugInfo(
+      src, constants, dbg_inst_header, "", extension, "Vertex"));
+  ASSERT_EQ(SPV_SUCCESS, ValidateInstructions());
+}
+
+TEST_F(ValidateVulkan100DebugInfo, DebugGlobalVariableStaticMember) {
+  const std::string src = R"(
+%src = OpString "simple.hlsl"
+%code = OpString "float foo; void main() {}"
+%float_name = OpString "float"
+%foo_name = OpString "foo"
+)";
+
+  const std::string constants = R"(
+%u32_4 = OpConstant %u32 4
+%u32_5 = OpConstant %u32 5
+%u32_32 = OpConstant %u32 32
+)";
+
+  const std::string dbg_inst_header = R"(
+%dbg_src = OpExtInst %void %DbgExt DebugSource %src %code
+%comp_unit = OpExtInst %void %DbgExt DebugCompilationUnit %u32_2 %u32_4 %dbg_src %u32_5
+%float_info = OpExtInst %void %DbgExt DebugTypeBasic %float_name %u32_32 %u32_3 %u32_0
+%a = OpExtInst %void %DbgExt DebugTypeMember %foo_name %float_info %dbg_src %u32_0 %u32_0 %u32_0 %u32_32 %u32_3
+%t = OpExtInst %void %DbgExt DebugTypeComposite %foo_name %u32_1 %dbg_src %u32_0 %u32_0 %comp_unit %foo_name %u32_32 %u32_3 %a
+%foo = OpExtInst %void %DbgExt DebugGlobalVariable %foo_name %t %dbg_src %u32_0 %u32_0 %comp_unit %foo_name %f32_input %u32_3
+)";
+
+  const std::string extension = R"(
+OpExtension "SPV_KHR_non_semantic_info"
+%DbgExt = OpExtInstImport "NonSemantic.Vulkan.DebugInfo.100"
+)";
+
+  CompileSuccessfully(GenerateShaderCodeForDebugInfo(
+      src, constants, dbg_inst_header, "", extension, "Vertex"));
+  ASSERT_EQ(SPV_SUCCESS, ValidateInstructions());
+}
+
+TEST_F(ValidateVulkan100DebugInfo, DebugGlobalVariableDebugInfoNone) {
+  const std::string src = R"(
+%src = OpString "simple.hlsl"
+%code = OpString "float foo; void main() {}"
+%float_name = OpString "float"
+%foo_name = OpString "foo"
+)";
+
+  const std::string constants = R"(
+%u32_4 = OpConstant %u32 4
+%u32_5 = OpConstant %u32 5
+%u32_32 = OpConstant %u32 32
+)";
+
+  const std::string dbg_inst_header = R"(
+%dbgNone = OpExtInst %void %DbgExt DebugInfoNone
+%dbg_src = OpExtInst %void %DbgExt DebugSource %src %code
+%comp_unit = OpExtInst %void %DbgExt DebugCompilationUnit %u32_2 %u32_4 %dbg_src %u32_5
+%float_info = OpExtInst %void %DbgExt DebugTypeBasic %float_name %u32_32 %u32_3 %u32_0
+%foo = OpExtInst %void %DbgExt DebugGlobalVariable %foo_name %float_info %dbg_src %u32_0 %u32_0 %comp_unit %foo_name %dbgNone %u32_3
+)";
+
+  const std::string extension = R"(
+OpExtension "SPV_KHR_non_semantic_info"
+%DbgExt = OpExtInstImport "NonSemantic.Vulkan.DebugInfo.100"
+)";
+
+  CompileSuccessfully(GenerateShaderCodeForDebugInfo(
+      src, constants, dbg_inst_header, "", extension, "Vertex"));
+  ASSERT_EQ(SPV_SUCCESS, ValidateInstructions());
+}
+
+TEST_F(ValidateVulkan100DebugInfo, DebugGlobalVariableConst) {
+  const std::string src = R"(
+%src = OpString "simple.hlsl"
+%code = OpString "float foo; void main() {}"
+%float_name = OpString "float"
+%foo_name = OpString "foo"
+)";
+
+  const std::string constants = R"(
+%u32_4 = OpConstant %u32 4
+%u32_5 = OpConstant %u32 5
+%u32_32 = OpConstant %u32 32
+)";
+
+  const std::string dbg_inst_header = R"(
+%dbg_src = OpExtInst %void %DbgExt DebugSource %src %code
+%comp_unit = OpExtInst %void %DbgExt DebugCompilationUnit %u32_2 %u32_4 %dbg_src %u32_5
+%float_info = OpExtInst %void %DbgExt DebugTypeBasic %float_name %u32_32 %u32_3 %u32_0
+%foo = OpExtInst %void %DbgExt DebugGlobalVariable %foo_name %float_info %dbg_src %u32_0 %u32_0 %comp_unit %foo_name %u32_32 %u32_3
+)";
+
+  const std::string extension = R"(
+OpExtension "SPV_KHR_non_semantic_info"
+%DbgExt = OpExtInstImport "NonSemantic.Vulkan.DebugInfo.100"
+)";
+
+  CompileSuccessfully(GenerateShaderCodeForDebugInfo(
+      src, constants, dbg_inst_header, "", extension, "Vertex"));
+  ASSERT_EQ(SPV_SUCCESS, ValidateInstructions());
+}
+
+TEST_P(ValidateVulkan100DebugInfoDebugGlobalVariable, Fail) {
+  const std::string src = R"(
+%src = OpString "simple.hlsl"
+%code = OpString "float foo; void main() {}"
+%float_name = OpString "float"
+%foo_name = OpString "foo"
+)";
+
+  const std::string constants = R"(
+%u32_4 = OpConstant %u32 4
+%u32_5 = OpConstant %u32 5
+%u32_32 = OpConstant %u32 32
+)";
+
+  const auto& param = GetParam();
+
+  std::ostringstream ss;
+  ss << R"(
+%dbg_src = OpExtInst %void %DbgExt DebugSource %src %code
+%comp_unit = OpExtInst %void %DbgExt DebugCompilationUnit %u32_2 %u32_4 %dbg_src %u32_5
+%float_info = OpExtInst %void %DbgExt DebugTypeBasic %float_name %u32_32 %u32_3 %u32_0
+%foo = OpExtInst %void %DbgExt DebugGlobalVariable )"
+     << param.first;
+
+  const std::string extension = R"(
+OpExtension "SPV_KHR_non_semantic_info"
+%DbgExt = OpExtInstImport "NonSemantic.Vulkan.DebugInfo.100"
+)";
+
+  CompileSuccessfully(GenerateShaderCodeForDebugInfo(src, constants, ss.str(),
+                                                     "", extension, "Vertex"));
+  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
+  EXPECT_THAT(getDiagnosticString(),
+              HasSubstr("expected operand " + param.second));
+}
+
+INSTANTIATE_TEST_SUITE_P(
+    AllOpenCL100DebugInfoFail, ValidateVulkan100DebugInfoDebugGlobalVariable,
+    ::testing::ValuesIn(std::vector<std::pair<std::string, std::string>>{
+        std::make_pair(
+            R"(%void %float_info %dbg_src %u32_0 %u32_0 %comp_unit %foo_name %f32_input %u32_3)",
+            "Name"),
+        std::make_pair(
+            R"(%foo_name %dbg_src %dbg_src %u32_0 %u32_0 %comp_unit %foo_name %f32_input %u32_3)",
+            "Type"),
+        std::make_pair(
+            R"(%foo_name %float_info %comp_unit %u32_0 %u32_0 %comp_unit %foo_name %f32_input %u32_3)",
+            "Source"),
+        std::make_pair(
+            R"(%foo_name %float_info %dbg_src %u32_0 %u32_0 %dbg_src %foo_name %f32_input %u32_3)",
+            "Scope"),
+        std::make_pair(
+            R"(%foo_name %float_info %dbg_src %u32_0 %u32_0 %comp_unit %void %f32_input %u32_3)",
+            "Linkage Name"),
+        std::make_pair(
+            R"(%foo_name %float_info %dbg_src %u32_0 %u32_0 %comp_unit %foo_name %void %u32_3)",
+            "Variable"),
+    }));
+
+TEST_F(ValidateOpenCL100DebugInfo, DebugInlinedAt) {
+  const std::string src = R"(
+%src = OpString "simple.hlsl"
+%code = OpString "void main() {}"
+%void_name = OpString "void"
+%main_name = OpString "main"
+%main_linkage_name = OpString "v_main"
+)";
+
+  const std::string dbg_inst_header = R"(
+%dbg_src = OpExtInst %void %DbgExt DebugSource %src %code
+%comp_unit = OpExtInst %void %DbgExt DebugCompilationUnit 2 4 %dbg_src HLSL
+%main_type_info = OpExtInst %void %DbgExt DebugTypeFunction FlagIsPublic %void
+%main_info = OpExtInst %void %DbgExt DebugFunction %main_name %main_type_info %dbg_src 1 1 %comp_unit %main_linkage_name FlagIsPublic 1 %main
+%inlined_at = OpExtInst %void %DbgExt DebugInlinedAt 0 %main_info
+%inlined_at_recursive = OpExtInst %void %DbgExt DebugInlinedAt 0 %main_info %inlined_at
+)";
+
+  const std::string body = R"(
+%main_scope = OpExtInst %void %DbgExt DebugScope %main_info %inlined_at
+)";
+
+  const std::string extension = R"(
+%DbgExt = OpExtInstImport "OpenCL.DebugInfo.100"
+)";
+
+  CompileSuccessfully(GenerateShaderCodeForDebugInfo(
+      src, "", dbg_inst_header, body, extension, "Vertex"));
+  ASSERT_EQ(SPV_SUCCESS, ValidateInstructions());
+}
+
+TEST_F(ValidateOpenCL100DebugInfo, DebugInlinedAtFail) {
+  const std::string src = R"(
+%src = OpString "simple.hlsl"
+%code = OpString "void main() {}"
+%void_name = OpString "void"
+%main_name = OpString "main"
+%main_linkage_name = OpString "v_main"
+)";
+
+  const std::string dbg_inst_header = R"(
+%dbg_src = OpExtInst %void %DbgExt DebugSource %src %code
+%comp_unit = OpExtInst %void %DbgExt DebugCompilationUnit 2 4 %dbg_src HLSL
+%main_type_info = OpExtInst %void %DbgExt DebugTypeFunction FlagIsPublic %void
+%main_info = OpExtInst %void %DbgExt DebugFunction %main_name %main_type_info %dbg_src 1 1 %comp_unit %main_linkage_name FlagIsPublic 1 %main
+%inlined_at = OpExtInst %void %DbgExt DebugInlinedAt 0 %main_info
+%inlined_at_recursive = OpExtInst %void %DbgExt DebugInlinedAt 0 %inlined_at
+)";
+
+  const std::string body = R"(
+%main_scope = OpExtInst %void %DbgExt DebugScope %main_info %inlined_at
+)";
+
+  const std::string extension = R"(
+%DbgExt = OpExtInstImport "OpenCL.DebugInfo.100"
+)";
+
+  CompileSuccessfully(GenerateShaderCodeForDebugInfo(
+      src, "", dbg_inst_header, body, extension, "Vertex"));
+  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
+  EXPECT_THAT(getDiagnosticString(), HasSubstr("expected operand Scope"));
+}
+
+TEST_F(ValidateOpenCL100DebugInfo, DebugInlinedAtFail2) {
+  const std::string src = R"(
+%src = OpString "simple.hlsl"
+%code = OpString "void main() {}"
+%void_name = OpString "void"
+%main_name = OpString "main"
+%main_linkage_name = OpString "v_main"
+)";
+
+  const std::string dbg_inst_header = R"(
+%dbg_src = OpExtInst %void %DbgExt DebugSource %src %code
+%comp_unit = OpExtInst %void %DbgExt DebugCompilationUnit 2 4 %dbg_src HLSL
+%main_type_info = OpExtInst %void %DbgExt DebugTypeFunction FlagIsPublic %void
+%main_info = OpExtInst %void %DbgExt DebugFunction %main_name %main_type_info %dbg_src 1 1 %comp_unit %main_linkage_name FlagIsPublic 1 %main
+%inlined_at = OpExtInst %void %DbgExt DebugInlinedAt 0 %main_info
+%inlined_at_recursive = OpExtInst %void %DbgExt DebugInlinedAt 0 %main_info %main_info
+)";
+
+  const std::string body = R"(
+%main_scope = OpExtInst %void %DbgExt DebugScope %main_info %inlined_at
+)";
+
+  const std::string extension = R"(
+%DbgExt = OpExtInstImport "OpenCL.DebugInfo.100"
+)";
+
+  CompileSuccessfully(GenerateShaderCodeForDebugInfo(
+      src, "", dbg_inst_header, body, extension, "Vertex"));
+  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
+  EXPECT_THAT(getDiagnosticString(), HasSubstr("expected operand Inlined"));
+}
+
+TEST_F(ValidateVulkan100DebugInfo, DebugInlinedAt) {
+  const std::string src = R"(
+%src = OpString "simple.hlsl"
+%code = OpString "void main() {}"
+%void_name = OpString "void"
+%main_name = OpString "main"
+%main_linkage_name = OpString "v_main"
+)";
+
+  const std::string constants = R"(
+%u32_4 = OpConstant %u32 4
+%u32_5 = OpConstant %u32 5
+%u32_32 = OpConstant %u32 32
+)";
+
+  const std::string dbg_inst_header = R"(
+%dbg_src = OpExtInst %void %DbgExt DebugSource %src %code
+%comp_unit = OpExtInst %void %DbgExt DebugCompilationUnit %u32_2 %u32_4 %dbg_src %u32_5
+%main_type_info = OpExtInst %void %DbgExt DebugTypeFunction %u32_3 %void
+%main_info = OpExtInst %void %DbgExt DebugFunction %main_name %main_type_info %dbg_src %u32_1 %u32_1 %comp_unit %main_name %u32_3 %u32_1
+%inlined_at = OpExtInst %void %DbgExt DebugInlinedAt %u32_0 %main_info
+%inlined_at_recursive = OpExtInst %void %DbgExt DebugInlinedAt %u32_0 %main_info %inlined_at
+)";
+
+  const std::string extension = R"(
+OpExtension "SPV_KHR_non_semantic_info"
+%DbgExt = OpExtInstImport "NonSemantic.Vulkan.DebugInfo.100"
+)";
+
+  const std::string body = R"(
+%main_scope = OpExtInst %void %DbgExt DebugScope %main_info %inlined_at
+)";
+
+  CompileSuccessfully(GenerateShaderCodeForDebugInfo(
+      src, constants, dbg_inst_header, body, extension, "Vertex"));
+  ASSERT_EQ(SPV_SUCCESS, ValidateInstructions());
+}
+
+TEST_F(ValidateVulkan100DebugInfo, DebugInlinedAtFail) {
+  const std::string src = R"(
+%src = OpString "simple.hlsl"
+%code = OpString "void main() {}"
+%void_name = OpString "void"
+%main_name = OpString "main"
+%main_linkage_name = OpString "v_main"
+)";
+
+  const std::string constants = R"(
+%u32_4 = OpConstant %u32 4
+%u32_5 = OpConstant %u32 5
+%u32_32 = OpConstant %u32 32
+)";
+
+  const std::string dbg_inst_header = R"(
+%dbg_src = OpExtInst %void %DbgExt DebugSource %src %code
+%comp_unit = OpExtInst %void %DbgExt DebugCompilationUnit %u32_2 %u32_4 %dbg_src %u32_5
+%main_type_info = OpExtInst %void %DbgExt DebugTypeFunction %u32_3 %void
+%main_info = OpExtInst %void %DbgExt DebugFunction %main_name %main_type_info %dbg_src %u32_1 %u32_1 %comp_unit %main_name %u32_3 %u32_1
+%inlined_at = OpExtInst %void %DbgExt DebugInlinedAt %u32_0 %main_info
+%inlined_at_recursive = OpExtInst %void %DbgExt DebugInlinedAt %u32_0 %inlined_at %inlined_at
+)";
+
+  const std::string extension = R"(
+OpExtension "SPV_KHR_non_semantic_info"
+%DbgExt = OpExtInstImport "NonSemantic.Vulkan.DebugInfo.100"
+)";
+
+  const std::string body = R"(
+%main_scope = OpExtInst %void %DbgExt DebugScope %main_info %inlined_at
+)";
+
+  CompileSuccessfully(GenerateShaderCodeForDebugInfo(
+      src, constants, dbg_inst_header, body, extension, "Vertex"));
+  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
+  EXPECT_THAT(getDiagnosticString(), HasSubstr("expected operand Scope"));
+}
+
+TEST_F(ValidateVulkan100DebugInfo, DebugInlinedAtFail2) {
+  const std::string src = R"(
+%src = OpString "simple.hlsl"
+%code = OpString "void main() {}"
+%void_name = OpString "void"
+%main_name = OpString "main"
+%main_linkage_name = OpString "v_main"
+)";
+
+  const std::string constants = R"(
+%u32_4 = OpConstant %u32 4
+%u32_5 = OpConstant %u32 5
+%u32_32 = OpConstant %u32 32
+)";
+
+  const std::string dbg_inst_header = R"(
+%dbg_src = OpExtInst %void %DbgExt DebugSource %src %code
+%comp_unit = OpExtInst %void %DbgExt DebugCompilationUnit %u32_2 %u32_4 %dbg_src %u32_5
+%main_type_info = OpExtInst %void %DbgExt DebugTypeFunction %u32_3 %void
+%main_info = OpExtInst %void %DbgExt DebugFunction %main_name %main_type_info %dbg_src %u32_1 %u32_1 %comp_unit %main_name %u32_3 %u32_1
+%inlined_at = OpExtInst %void %DbgExt DebugInlinedAt %u32_0 %main_info
+%inlined_at_recursive = OpExtInst %void %DbgExt DebugInlinedAt %u32_0 %main_info %main_info
+)";
+
+  const std::string extension = R"(
+OpExtension "SPV_KHR_non_semantic_info"
+%DbgExt = OpExtInstImport "NonSemantic.Vulkan.DebugInfo.100"
+)";
+
+  const std::string body = R"(
+%main_scope = OpExtInst %void %DbgExt DebugScope %main_info %inlined_at
+)";
+
+  CompileSuccessfully(GenerateShaderCodeForDebugInfo(
+      src, constants, dbg_inst_header, body, extension, "Vertex"));
+  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
+  EXPECT_THAT(getDiagnosticString(), HasSubstr("expected operand Inlined"));
+}
+
+TEST_F(ValidateOpenCL100DebugInfo, DebugValue) {
+  const std::string src = R"(
+%src = OpString "simple.hlsl"
+%code = OpString "void main() { float foo; }"
+%float_name = OpString "float"
+%foo_name = OpString "foo"
+)";
+
+  const std::string size_const = R"(
+%int_3 = OpConstant %u32 3
+%int_32 = OpConstant %u32 32
+)";
+
+  const std::string dbg_inst_header = R"(
+%dbg_src = OpExtInst %void %DbgExt DebugSource %src %code
+%comp_unit = OpExtInst %void %DbgExt DebugCompilationUnit 2 4 %dbg_src HLSL
+%null_expr = OpExtInst %void %DbgExt DebugExpression
+%float_info = OpExtInst %void %DbgExt DebugTypeBasic %float_name %int_32 Float
+%v4float_info = OpExtInst %void %DbgExt DebugTypeVector %float_info 4
+%foo_info = OpExtInst %void %DbgExt DebugLocalVariable %foo_name %v4float_info %dbg_src 1 10 %comp_unit FlagIsLocal 0
+)";
+
+  const std::string body = R"(
+%value = OpExtInst %void %DbgExt DebugValue %foo_info %int_32 %null_expr %int_3
+)";
+
+  const std::string extension = R"(
+%DbgExt = OpExtInstImport "OpenCL.DebugInfo.100"
+)";
+
+  CompileSuccessfully(GenerateShaderCodeForDebugInfo(
+      src, size_const, dbg_inst_header, body, extension, "Vertex"));
+  ASSERT_EQ(SPV_SUCCESS, ValidateInstructions());
+}
+
+TEST_F(ValidateOpenCL100DebugInfo, DebugValueWithVariableIndex) {
+  const std::string src = R"(
+%src = OpString "simple.hlsl"
+%code = OpString "void main() { float foo; }"
+%float_name = OpString "float"
+%int_name = OpString "int"
+%foo_name = OpString "foo"
+%len_name = OpString "length"
+)";
+
+  const std::string size_const = R"(
+%int_3 = OpConstant %u32 3
+%int_32 = OpConstant %u32 32
+)";
+
+  const std::string dbg_inst_header = R"(
+%dbg_src = OpExtInst %void %DbgExt DebugSource %src %code
+%comp_unit = OpExtInst %void %DbgExt DebugCompilationUnit 2 4 %dbg_src HLSL
+%null_expr = OpExtInst %void %DbgExt DebugExpression
+%float_info = OpExtInst %void %DbgExt DebugTypeBasic %float_name %int_32 Float
+%int_info = OpExtInst %void %DbgExt DebugTypeBasic %int_name %int_32 Signed
+%v4float_info = OpExtInst %void %DbgExt DebugTypeVector %float_info 4
+%foo_info = OpExtInst %void %DbgExt DebugLocalVariable %foo_name %v4float_info %dbg_src 1 10 %comp_unit FlagIsLocal
+%len_info = OpExtInst %void %DbgExt DebugLocalVariable %len_name %int_info %dbg_src 0 0 %comp_unit FlagIsLocal
+)";
+
+  const std::string body = R"(
+%value = OpExtInst %void %DbgExt DebugValue %foo_info %int_32 %null_expr %len_info
+)";
+
+  const std::string extension = R"(
+%DbgExt = OpExtInstImport "OpenCL.DebugInfo.100"
+)";
+
+  CompileSuccessfully(GenerateShaderCodeForDebugInfo(
+      src, size_const, dbg_inst_header, body, extension, "Vertex"));
+  ASSERT_EQ(SPV_SUCCESS, ValidateInstructions());
+}
+
+TEST_P(ValidateOpenCL100DebugInfoDebugValue, Fail) {
+  const std::string src = R"(
+%src = OpString "simple.hlsl"
+%code = OpString "void main() { float foo; }"
+%float_name = OpString "float"
+%foo_name = OpString "foo"
+)";
+
+  const std::string size_const = R"(
+%int_32 = OpConstant %u32 32
+)";
+
+  const std::string dbg_inst_header = R"(
+%dbg_src = OpExtInst %void %DbgExt DebugSource %src %code
+%comp_unit = OpExtInst %void %DbgExt DebugCompilationUnit 2 4 %dbg_src HLSL
+%null_expr = OpExtInst %void %DbgExt DebugExpression
+%float_info = OpExtInst %void %DbgExt DebugTypeBasic %float_name %int_32 Float
+%foo_info = OpExtInst %void %DbgExt DebugLocalVariable %foo_name %float_info %dbg_src 1 10 %comp_unit FlagIsLocal 0
+)";
+
+  const auto& param = GetParam();
+
+  std::ostringstream ss;
+  ss << R"(
+%decl = OpExtInst %void %DbgExt DebugValue )"
+     << param.first;
+
+  const std::string extension = R"(
+%DbgExt = OpExtInstImport "OpenCL.DebugInfo.100"
+)";
+
+  CompileSuccessfully(GenerateShaderCodeForDebugInfo(
+      src, size_const, dbg_inst_header, ss.str(), extension, "Vertex"));
+  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
+  EXPECT_THAT(getDiagnosticString(),
+              HasSubstr("expected operand " + param.second));
+}
+
+INSTANTIATE_TEST_SUITE_P(
+    AllOpenCL100DebugInfoFail, ValidateOpenCL100DebugInfoDebugValue,
+    ::testing::ValuesIn(std::vector<std::pair<std::string, std::string>>{
+        std::make_pair(R"(%dbg_src %int_32 %null_expr)", "Local Variable"),
+        std::make_pair(R"(%foo_info %int_32 %dbg_src)", "Expression"),
+        std::make_pair(R"(%foo_info %int_32 %null_expr %dbg_src)", "Indexes"),
+    }));
+
+TEST_F(ValidateVulkan100DebugInfo, DebugValue) {
+  const std::string src = R"(
+%src = OpString "simple.hlsl"
+%code = OpString "void main() { float foo; }"
+%float_name = OpString "float"
+%foo_name = OpString "foo"
+)";
+
+  const std::string constants = R"(
+%u32_4 = OpConstant %u32 4
+%u32_5 = OpConstant %u32 5
+%u32_10 = OpConstant %u32 10
+%u32_32 = OpConstant %u32 32
+)";
+
+  const std::string dbg_inst_header = R"(
+%dbg_src = OpExtInst %void %DbgExt DebugSource %src %code
+%comp_unit = OpExtInst %void %DbgExt DebugCompilationUnit %u32_2 %u32_4 %dbg_src %u32_5
+%null_expr = OpExtInst %void %DbgExt DebugExpression
+%float_info = OpExtInst %void %DbgExt DebugTypeBasic %float_name %u32_32 %u32_3 %u32_0
+%v4float_info = OpExtInst %void %DbgExt DebugTypeVector %float_info %u32_4
+%foo_info = OpExtInst %void %DbgExt DebugLocalVariable %foo_name %v4float_info %dbg_src %u32_1 %u32_10 %comp_unit %u32_4
+)";
+
+  const std::string extension = R"(
+OpExtension "SPV_KHR_non_semantic_info"
+%DbgExt = OpExtInstImport "NonSemantic.Vulkan.DebugInfo.100"
+)";
+
+  const std::string body = R"(
+%value = OpExtInst %void %DbgExt DebugValue %foo_info %u32_32 %null_expr %u32_3
+)";
+
+  CompileSuccessfully(GenerateShaderCodeForDebugInfo(
+      src, constants, dbg_inst_header, body, extension, "Vertex"));
+  ASSERT_EQ(SPV_SUCCESS, ValidateInstructions());
+}
+
+TEST_F(ValidateVulkan100DebugInfo, DebugValueWithVariableIndex) {
+  const std::string src = R"(
+%src = OpString "simple.hlsl"
+%code = OpString "void main() { float foo; }"
+%float_name = OpString "float"
+%int_name = OpString "int"
+%foo_name = OpString "foo"
+%len_name = OpString "length"
+)";
+
+  const std::string constants = R"(
+%u32_4 = OpConstant %u32 4
+%u32_5 = OpConstant %u32 5
+%u32_10 = OpConstant %u32 10
+%u32_32 = OpConstant %u32 32
+)";
+
+  const std::string dbg_inst_header = R"(
+%dbg_src = OpExtInst %void %DbgExt DebugSource %src %code
+%comp_unit = OpExtInst %void %DbgExt DebugCompilationUnit %u32_2 %u32_4 %dbg_src %u32_5
+%null_expr = OpExtInst %void %DbgExt DebugExpression
+%float_info = OpExtInst %void %DbgExt DebugTypeBasic %float_name %u32_32 %u32_3 %u32_0
+%int_info = OpExtInst %void %DbgExt DebugTypeBasic %int_name %u32_32 %u32_4 %u32_0
+%v4float_info = OpExtInst %void %DbgExt DebugTypeVector %float_info %u32_4
+%foo_info = OpExtInst %void %DbgExt DebugLocalVariable %foo_name %v4float_info %dbg_src %u32_1 %u32_10 %comp_unit %u32_4 %u32_0
+%len_info = OpExtInst %void %DbgExt DebugLocalVariable %len_name %int_info %dbg_src %u32_0 %u32_0 %comp_unit %u32_4
+)";
+
+  const std::string extension = R"(
+OpExtension "SPV_KHR_non_semantic_info"
+%DbgExt = OpExtInstImport "NonSemantic.Vulkan.DebugInfo.100"
+)";
+
+  const std::string body = R"(
+%value = OpExtInst %void %DbgExt DebugValue %foo_info %u32_32 %null_expr %len_info
+)";
+
+  CompileSuccessfully(GenerateShaderCodeForDebugInfo(
+      src, constants, dbg_inst_header, body, extension, "Vertex"));
+  ASSERT_EQ(SPV_SUCCESS, ValidateInstructions());
+}
+
+TEST_P(ValidateVulkan100DebugInfoDebugValue, Fail) {
+  const std::string src = R"(
+%src = OpString "simple.hlsl"
+%code = OpString "void main() { float foo; }"
+%float_name = OpString "float"
+%foo_name = OpString "foo"
+)";
+
+  const std::string constants = R"(
+%u32_4 = OpConstant %u32 4
+%u32_5 = OpConstant %u32 5
+%u32_10 = OpConstant %u32 10
+%u32_32 = OpConstant %u32 32
+)";
+
+  const std::string dbg_inst_header = R"(
+%dbg_src = OpExtInst %void %DbgExt DebugSource %src %code
+%comp_unit = OpExtInst %void %DbgExt DebugCompilationUnit %u32_2 %u32_4 %dbg_src %u32_5
+%null_expr = OpExtInst %void %DbgExt DebugExpression
+%float_info = OpExtInst %void %DbgExt DebugTypeBasic %float_name %u32_32 %u32_3 %u32_0
+%v4float_info = OpExtInst %void %DbgExt DebugTypeVector %float_info %u32_4
+%foo_info = OpExtInst %void %DbgExt DebugLocalVariable %foo_name %v4float_info %dbg_src %u32_1 %u32_10 %comp_unit %u32_4 %u32_0
+)";
+
+  const std::string extension = R"(
+OpExtension "SPV_KHR_non_semantic_info"
+%DbgExt = OpExtInstImport "NonSemantic.Vulkan.DebugInfo.100"
+)";
+
+  const auto& param = GetParam();
+
+  std::ostringstream ss;
+  ss << R"(
+%decl = OpExtInst %void %DbgExt DebugValue )"
+     << param.first;
+
+  CompileSuccessfully(GenerateShaderCodeForDebugInfo(
+      src, constants, dbg_inst_header, ss.str(), extension, "Vertex"));
+  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
+  EXPECT_THAT(getDiagnosticString(),
+              HasSubstr("expected operand " + param.second));
+}
+
+INSTANTIATE_TEST_SUITE_P(
+    AllOpenCL100DebugInfoFail, ValidateVulkan100DebugInfoDebugValue,
+    ::testing::ValuesIn(std::vector<std::pair<std::string, std::string>>{
+        std::make_pair(R"(%dbg_src %u32_32 %null_expr %u32_3)",
+                       "Local Variable"),
+        std::make_pair(R"(%foo_info %u32_32 %dbg_src %u32_3)", "Expression"),
+        std::make_pair(R"(%foo_info %u32_32 %null_expr %dbg_src)", "Indexes"),
+    }));
+
+TEST_F(ValidateVulkan100DebugInfo, VulkanDebugInfoSample) {
+  std::ostringstream ss;
+  ss << R"(
+               OpCapability Shader
+               OpExtension "SPV_KHR_non_semantic_info"
+          %id_1 = OpExtInstImport "NonSemantic.Vulkan.DebugInfo.100"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %id_MainPs "MainPs" %id_in_var_TEXCOORD2 %id_out_var_SV_Target0
+               OpExecutionMode %id_MainPs OriginUpperLeft
+          %id_7 = OpString "foo.frag"
+         %id_27 = OpString "float"
+         %id_32 = OpString "vColor"
+         %id_36 = OpString "PS_OUTPUT"
+         %id_42 = OpString "vTextureCoords"
+         %id_46 = OpString "PS_INPUT"
+         %id_49 = OpString "MainPs"
+         %id_50 = OpString ""
+         %id_55 = OpString "ps_output"
+         %id_59 = OpString "i"
+         %id_63 = OpString "@type.sampler"
+         %id_64 = OpString "type.sampler"
+         %id_66 = OpString "g_sAniso"
+         %id_69 = OpString "@type.2d.image"
+         %id_70 = OpString "type.2d.image"
+         %id_72 = OpString "TemplateParam"
+         %id_75 = OpString "g_tColor"
+               OpName %id_type_2d_image "type.2d.image"
+               OpName %id_g_tColor "g_tColor"
+               OpName %id_type_sampler "type.sampler"
+               OpName %id_g_sAniso "g_sAniso"
+               OpName %id_in_var_TEXCOORD2 "in.var.TEXCOORD2"
+               OpName %id_out_var_SV_Target0 "out.var.SV_Target0"
+               OpName %id_MainPs "MainPs"
+               OpName %id_PS_INPUT "PS_INPUT"
+               OpMemberName %id_PS_INPUT 0 "vTextureCoords"
+               OpName %id_param_var_i "param.var.i"
+               OpName %id_PS_OUTPUT "PS_OUTPUT"
+               OpMemberName %id_PS_OUTPUT 0 "vColor"
+               OpName %id_src_MainPs "src.MainPs"
+               OpName %id_i "i"
+               OpName %id_bb_entry "bb.entry"
+               OpName %id_ps_output "ps_output"
+               OpName %id_type_sampled_image "type.sampled.image"
+               OpDecorate %id_in_var_TEXCOORD2 Location 0
+               OpDecorate %id_out_var_SV_Target0 Location 0
+               OpDecorate %id_g_tColor DescriptorSet 0
+               OpDecorate %id_g_tColor Binding 0
+               OpDecorate %id_g_sAniso DescriptorSet 0
+               OpDecorate %id_g_sAniso Binding 1
+        %id_int = OpTypeInt 32 1
+      %id_int_0 = OpConstant %id_int 0
+       %id_uint = OpTypeInt 32 0
+    %id_uint_32 = OpConstant %id_uint 32
+      %id_float = OpTypeFloat 32
+%id_type_2d_image = OpTypeImage %id_float 2D 2 0 0 1 Unknown
+%id__ptr_UniformConstant_type_2d_image = OpTypePointer UniformConstant %id_type_2d_image
+%id_type_sampler = OpTypeSampler
+%id__ptr_UniformConstant_type_sampler = OpTypePointer UniformConstant %id_type_sampler
+    %id_v2float = OpTypeVector %id_float 2
+%id__ptr_Input_v2float = OpTypePointer Input %id_v2float
+    %id_v4float = OpTypeVector %id_float 4
+%id__ptr_Output_v4float = OpTypePointer Output %id_v4float
+       %id_void = OpTypeVoid
+     %id_uint_1 = OpConstant %id_uint 1
+     %id_uint_4 = OpConstant %id_uint 4
+     %id_uint_5 = OpConstant %id_uint 5
+     %id_uint_3 = OpConstant %id_uint 3
+     %id_uint_0 = OpConstant %id_uint 0
+   %id_uint_128 = OpConstant %id_uint 128
+    %id_uint_12 = OpConstant %id_uint 12
+    %id_uint_10 = OpConstant %id_uint 10
+     %id_uint_8 = OpConstant %id_uint 8
+     %id_uint_2 = OpConstant %id_uint 2
+    %id_uint_64 = OpConstant %id_uint 64
+     %id_uint_7 = OpConstant %id_uint 7
+    %id_uint_15 = OpConstant %id_uint 15
+    %id_uint_16 = OpConstant %id_uint 16
+    %id_uint_17 = OpConstant %id_uint 17
+    %id_uint_29 = OpConstant %id_uint 29
+    %id_uint_14 = OpConstant %id_uint 14
+    %id_uint_11 = OpConstant %id_uint 11
+         %id_78 = OpTypeFunction %id_void
+   %id_PS_INPUT = OpTypeStruct %id_v2float
+%id__ptr_Function_PS_INPUT = OpTypePointer Function %id_PS_INPUT
+  %id_PS_OUTPUT = OpTypeStruct %id_v4float
+         %id_89 = OpTypeFunction %id_PS_OUTPUT %id__ptr_Function_PS_INPUT
+%id__ptr_Function_PS_OUTPUT = OpTypePointer Function %id_PS_OUTPUT
+    %id_uint_20 = OpConstant %id_uint 20
+    %id_uint_19 = OpConstant %id_uint 19
+    %id_uint_26 = OpConstant %id_uint 26
+    %id_uint_46 = OpConstant %id_uint 46
+%id__ptr_Function_v2float = OpTypePointer Function %id_v2float
+    %id_uint_57 = OpConstant %id_uint 57
+    %id_uint_78 = OpConstant %id_uint 78
+%id_type_sampled_image = OpTypeSampledImage %id_type_2d_image
+    %id_uint_81 = OpConstant %id_uint 81
+%id__ptr_Function_v4float = OpTypePointer Function %id_v4float
+   %id_g_tColor = OpVariable %id__ptr_UniformConstant_type_2d_image UniformConstant
+   %id_g_sAniso = OpVariable %id__ptr_UniformConstant_type_sampler UniformConstant
+%id_in_var_TEXCOORD2 = OpVariable %id__ptr_Input_v2float Input
+%id_out_var_SV_Target0 = OpVariable %id__ptr_Output_v4float Output
+         %id_22 = OpExtInst %id_void %id_1 DebugSource %id_7
+         %id_23 = OpExtInst %id_void %id_1 DebugCompilationUnit %id_uint_1 %id_uint_4 %id_22 %id_uint_5
+         %id_28 = OpExtInst %id_void %id_1 DebugTypeBasic %id_27 %id_uint_32 %id_uint_3 %id_uint_0
+         %id_31 = OpExtInst %id_void %id_1 DebugTypeVector %id_28 %id_uint_4
+         %id_34 = OpExtInst %id_void %id_1 DebugTypeMember %id_32 %id_31 %id_22 %id_uint_12 %id_uint_12 %id_uint_0 %id_uint_128 %id_uint_3
+         %id_37 = OpExtInst %id_void %id_1 DebugTypeComposite %id_36 %id_uint_1 %id_22 %id_uint_10 %id_uint_8 %id_23 %id_36 %id_uint_128 %id_uint_3 %id_34
+         %id_40 = OpExtInst %id_void %id_1 DebugTypeVector %id_28 %id_uint_2
+         %id_44 = OpExtInst %id_void %id_1 DebugTypeMember %id_42 %id_40 %id_22 %id_uint_7 %id_uint_12 %id_uint_0 %id_uint_64 %id_uint_3
+         %id_47 = OpExtInst %id_void %id_1 DebugTypeComposite %id_46 %id_uint_1 %id_22 %id_uint_5 %id_uint_8 %id_23 %id_46 %id_uint_64 %id_uint_3 %id_44
+         %id_48 = OpExtInst %id_void %id_1 DebugTypeFunction %id_uint_3 %id_37 %id_47
+         %id_51 = OpExtInst %id_void %id_1 DebugFunction %id_49 %id_48 %id_22 %id_uint_15 %id_uint_1 %id_23 %id_50 %id_uint_3 %id_uint_16
+         %id_54 = OpExtInst %id_void %id_1 DebugLexicalBlock %id_22 %id_uint_16 %id_uint_1 %id_51
+         %id_56 = OpExtInst %id_void %id_1 DebugLocalVariable %id_55 %id_37 %id_22 %id_uint_17 %id_uint_15 %id_54 %id_uint_4
+         %id_58 = OpExtInst %id_void %id_1 DebugExpression
+         %id_60 = OpExtInst %id_void %id_1 DebugLocalVariable %id_59 %id_47 %id_22 %id_uint_15 %id_uint_29 %id_51 %id_uint_4 %id_uint_1
+         %id_62 = OpExtInst %id_void %id_1 DebugInfoNone
+         %id_65 = OpExtInst %id_void %id_1 DebugTypeComposite %id_63 %id_uint_1 %id_22 %id_uint_0 %id_uint_0 %id_23 %id_64 %id_62 %id_uint_3
+         %id_67 = OpExtInst %id_void %id_1 DebugGlobalVariable %id_66 %id_65 %id_22 %id_uint_3 %id_uint_14 %id_23 %id_66 %id_g_sAniso %id_uint_8
+         %id_71 = OpExtInst %id_void %id_1 DebugTypeComposite %id_69 %id_uint_0 %id_22 %id_uint_0 %id_uint_0 %id_23 %id_70 %id_62 %id_uint_3
+         %id_73 = OpExtInst %id_void %id_1 DebugTypeTemplateParameter %id_72 %id_31 %id_62 %id_22 %id_uint_0 %id_uint_0
+         %id_74 = OpExtInst %id_void %id_1 DebugTypeTemplate %id_71 %id_73
+         %id_76 = OpExtInst %id_void %id_1 DebugGlobalVariable %id_75 %id_74 %id_22 %id_uint_1 %id_uint_11 %id_23 %id_75 %id_g_tColor %id_uint_8
+     %id_MainPs = OpFunction %id_void None %id_78
+         %id_79 = OpLabel
+%id_param_var_i = OpVariable %id__ptr_Function_PS_INPUT Function
+         %id_83 = OpLoad %id_v2float %id_in_var_TEXCOORD2
+         %id_84 = OpCompositeConstruct %id_PS_INPUT %id_83
+               OpStore %id_param_var_i %id_84
+         %id_86 = OpFunctionCall %id_PS_OUTPUT %id_src_MainPs %id_param_var_i
+         %id_88 = OpCompositeExtract %id_v4float %id_86 0
+               OpStore %id_out_var_SV_Target0 %id_88
+               OpReturn
+               OpFunctionEnd
+ %id_src_MainPs = OpFunction %id_PS_OUTPUT None %id_89
+          %id_i = OpFunctionParameter %id__ptr_Function_PS_INPUT
+   %id_bb_entry = OpLabel
+  %id_ps_output = OpVariable %id__ptr_Function_PS_OUTPUT Function
+         %id_94 = OpExtInst %id_void %id_1 DebugScope %id_51
+         %id_97 = OpExtInst %id_void %id_1 DebugDeclare %id_60 %id_i %id_58
+         %id_99 = OpExtInst %id_void %id_1 DebugFunctionDefinition %id_51 %id_src_MainPs
+        %id_100 = OpExtInst %id_void %id_1 DebugScope %id_54
+        %id_102 = OpExtInst %id_void %id_1 DebugDeclare %id_56 %id_ps_output %id_58
+        %id_106 = OpLoad %id_type_2d_image %id_g_tColor
+        %id_109 = OpLoad %id_type_sampler %id_g_sAniso
+        %id_114 = OpAccessChain %id__ptr_Function_v2float %id_i %id_int_0
+        %id_115 = OpLoad %id_v2float %id_114
+        %id_119 = OpSampledImage %id_type_sampled_image %id_106 %id_109
+        %id_120 = OpImageSampleImplicitLod %id_v4float %id_119 %id_115 None
+        %id_123 = OpAccessChain %id__ptr_Function_v4float %id_ps_output %id_int_0
+               OpStore %id_123 %id_120
+        %id_125 = OpLoad %id_PS_OUTPUT %id_ps_output
+               OpReturnValue %id_125
+               OpFunctionEnd
+)";
+
+  CompileSuccessfully(ss.str());
+  ASSERT_EQ(SPV_SUCCESS, ValidateInstructions());
+}
+
+}  // namespace
+}  // namespace val
+}  // namespace spvtools
diff --git a/third_party/vulkan-deps/spirv-tools/src/test/val/val_ext_inst_test.cpp b/third_party/vulkan-deps/spirv-tools/src/test/val/val_ext_inst_test.cpp
index b73ec34..b014ad6 100644
--- a/third_party/vulkan-deps/spirv-tools/src/test/val/val_ext_inst_test.cpp
+++ b/third_party/vulkan-deps/spirv-tools/src/test/val/val_ext_inst_test.cpp
@@ -33,33 +33,6 @@
 using ::testing::Not;
 
 using ValidateExtInst = spvtest::ValidateBase<bool>;
-using ValidateOldDebugInfo = spvtest::ValidateBase<std::string>;
-using ValidateOpenCL100DebugInfo = spvtest::ValidateBase<std::string>;
-using ValidateLocalDebugInfoOutOfFunction = spvtest::ValidateBase<std::string>;
-using ValidateOpenCL100DebugInfoDebugTypedef =
-    spvtest::ValidateBase<std::pair<std::string, std::string>>;
-using ValidateOpenCL100DebugInfoDebugTypeEnum =
-    spvtest::ValidateBase<std::pair<std::string, std::string>>;
-using ValidateOpenCL100DebugInfoDebugTypeComposite =
-    spvtest::ValidateBase<std::pair<std::string, std::string>>;
-using ValidateOpenCL100DebugInfoDebugTypeMember =
-    spvtest::ValidateBase<std::pair<std::string, std::string>>;
-using ValidateOpenCL100DebugInfoDebugTypeInheritance =
-    spvtest::ValidateBase<std::pair<std::string, std::string>>;
-using ValidateOpenCL100DebugInfoDebugFunction =
-    spvtest::ValidateBase<std::pair<std::string, std::string>>;
-using ValidateOpenCL100DebugInfoDebugFunctionDeclaration =
-    spvtest::ValidateBase<std::pair<std::string, std::string>>;
-using ValidateOpenCL100DebugInfoDebugLexicalBlock =
-    spvtest::ValidateBase<std::pair<std::string, std::string>>;
-using ValidateOpenCL100DebugInfoDebugLocalVariable =
-    spvtest::ValidateBase<std::pair<std::string, std::string>>;
-using ValidateOpenCL100DebugInfoDebugGlobalVariable =
-    spvtest::ValidateBase<std::pair<std::string, std::string>>;
-using ValidateOpenCL100DebugInfoDebugDeclare =
-    spvtest::ValidateBase<std::pair<std::string, std::string>>;
-using ValidateOpenCL100DebugInfoDebugValue =
-    spvtest::ValidateBase<std::pair<std::string, std::string>>;
 using ValidateGlslStd450SqrtLike = spvtest::ValidateBase<std::string>;
 using ValidateGlslStd450FMinLike = spvtest::ValidateBase<std::string>;
 using ValidateGlslStd450FClampLike = spvtest::ValidateBase<std::string>;
@@ -488,1685 +461,6 @@
   return ss.str();
 }
 
-std::string GenerateShaderCodeForDebugInfo(
-    const std::string& op_string_instructions,
-    const std::string& op_const_instructions,
-    const std::string& debug_instructions_before_main, const std::string& body,
-    const std::string& capabilities_and_extensions = "",
-    const std::string& execution_model = "Fragment") {
-  std::ostringstream ss;
-  ss << R"(
-OpCapability Shader
-OpCapability Float16
-OpCapability Float64
-OpCapability Int16
-OpCapability Int64
-)";
-
-  ss << capabilities_and_extensions;
-  ss << "%extinst = OpExtInstImport \"GLSL.std.450\"\n";
-  ss << "OpMemoryModel Logical GLSL450\n";
-  ss << "OpEntryPoint " << execution_model << " %main \"main\""
-     << " %f32_output"
-     << " %f32vec2_output"
-     << " %u32_output"
-     << " %u32vec2_output"
-     << " %u64_output"
-     << " %f32_input"
-     << " %f32vec2_input"
-     << " %u32_input"
-     << " %u32vec2_input"
-     << " %u64_input"
-     << "\n";
-  if (execution_model == "Fragment") {
-    ss << "OpExecutionMode %main OriginUpperLeft\n";
-  }
-
-  ss << op_string_instructions;
-
-  ss << R"(
-%void = OpTypeVoid
-%func = OpTypeFunction %void
-%bool = OpTypeBool
-%f16 = OpTypeFloat 16
-%f32 = OpTypeFloat 32
-%f64 = OpTypeFloat 64
-%u32 = OpTypeInt 32 0
-%s32 = OpTypeInt 32 1
-%u64 = OpTypeInt 64 0
-%s64 = OpTypeInt 64 1
-%u16 = OpTypeInt 16 0
-%s16 = OpTypeInt 16 1
-%f32vec2 = OpTypeVector %f32 2
-%f32vec3 = OpTypeVector %f32 3
-%f32vec4 = OpTypeVector %f32 4
-%f64vec2 = OpTypeVector %f64 2
-%f64vec3 = OpTypeVector %f64 3
-%f64vec4 = OpTypeVector %f64 4
-%u32vec2 = OpTypeVector %u32 2
-%u32vec3 = OpTypeVector %u32 3
-%s32vec2 = OpTypeVector %s32 2
-%u32vec4 = OpTypeVector %u32 4
-%s32vec4 = OpTypeVector %s32 4
-%u64vec2 = OpTypeVector %u64 2
-%s64vec2 = OpTypeVector %s64 2
-%f64mat22 = OpTypeMatrix %f64vec2 2
-%f32mat22 = OpTypeMatrix %f32vec2 2
-%f32mat23 = OpTypeMatrix %f32vec2 3
-%f32mat32 = OpTypeMatrix %f32vec3 2
-%f32mat33 = OpTypeMatrix %f32vec3 3
-
-%f32_0 = OpConstant %f32 0
-%f32_1 = OpConstant %f32 1
-%f32_2 = OpConstant %f32 2
-%f32_3 = OpConstant %f32 3
-%f32_4 = OpConstant %f32 4
-%f32_h = OpConstant %f32 0.5
-%f32vec2_01 = OpConstantComposite %f32vec2 %f32_0 %f32_1
-%f32vec2_12 = OpConstantComposite %f32vec2 %f32_1 %f32_2
-%f32vec3_012 = OpConstantComposite %f32vec3 %f32_0 %f32_1 %f32_2
-%f32vec3_123 = OpConstantComposite %f32vec3 %f32_1 %f32_2 %f32_3
-%f32vec4_0123 = OpConstantComposite %f32vec4 %f32_0 %f32_1 %f32_2 %f32_3
-%f32vec4_1234 = OpConstantComposite %f32vec4 %f32_1 %f32_2 %f32_3 %f32_4
-
-%f64_0 = OpConstant %f64 0
-%f64_1 = OpConstant %f64 1
-%f64_2 = OpConstant %f64 2
-%f64_3 = OpConstant %f64 3
-%f64vec2_01 = OpConstantComposite %f64vec2 %f64_0 %f64_1
-%f64vec3_012 = OpConstantComposite %f64vec3 %f64_0 %f64_1 %f64_2
-%f64vec4_0123 = OpConstantComposite %f64vec4 %f64_0 %f64_1 %f64_2 %f64_3
-
-%f16_0 = OpConstant %f16 0
-%f16_1 = OpConstant %f16 1
-%f16_h = OpConstant %f16 0.5
-
-%u32_0 = OpConstant %u32 0
-%u32_1 = OpConstant %u32 1
-%u32_2 = OpConstant %u32 2
-%u32_3 = OpConstant %u32 3
-
-%s32_0 = OpConstant %s32 0
-%s32_1 = OpConstant %s32 1
-%s32_2 = OpConstant %s32 2
-%s32_3 = OpConstant %s32 3
-
-%u64_0 = OpConstant %u64 0
-%u64_1 = OpConstant %u64 1
-%u64_2 = OpConstant %u64 2
-%u64_3 = OpConstant %u64 3
-
-%s64_0 = OpConstant %s64 0
-%s64_1 = OpConstant %s64 1
-%s64_2 = OpConstant %s64 2
-%s64_3 = OpConstant %s64 3
-)";
-
-  ss << op_const_instructions;
-
-  ss << R"(
-%s32vec2_01 = OpConstantComposite %s32vec2 %s32_0 %s32_1
-%u32vec2_01 = OpConstantComposite %u32vec2 %u32_0 %u32_1
-
-%s32vec2_12 = OpConstantComposite %s32vec2 %s32_1 %s32_2
-%u32vec2_12 = OpConstantComposite %u32vec2 %u32_1 %u32_2
-
-%s32vec4_0123 = OpConstantComposite %s32vec4 %s32_0 %s32_1 %s32_2 %s32_3
-%u32vec4_0123 = OpConstantComposite %u32vec4 %u32_0 %u32_1 %u32_2 %u32_3
-
-%s64vec2_01 = OpConstantComposite %s64vec2 %s64_0 %s64_1
-%u64vec2_01 = OpConstantComposite %u64vec2 %u64_0 %u64_1
-
-%f32mat22_1212 = OpConstantComposite %f32mat22 %f32vec2_12 %f32vec2_12
-%f32mat23_121212 = OpConstantComposite %f32mat23 %f32vec2_12 %f32vec2_12 %f32vec2_12
-
-%f32_ptr_output = OpTypePointer Output %f32
-%f32vec2_ptr_output = OpTypePointer Output %f32vec2
-
-%u32_ptr_output = OpTypePointer Output %u32
-%u32vec2_ptr_output = OpTypePointer Output %u32vec2
-
-%u64_ptr_output = OpTypePointer Output %u64
-
-%f32_output = OpVariable %f32_ptr_output Output
-%f32vec2_output = OpVariable %f32vec2_ptr_output Output
-
-%u32_output = OpVariable %u32_ptr_output Output
-%u32vec2_output = OpVariable %u32vec2_ptr_output Output
-
-%u64_output = OpVariable %u64_ptr_output Output
-
-%f32_ptr_input = OpTypePointer Input %f32
-%f32vec2_ptr_input = OpTypePointer Input %f32vec2
-
-%u32_ptr_input = OpTypePointer Input %u32
-%u32vec2_ptr_input = OpTypePointer Input %u32vec2
-
-%u64_ptr_input = OpTypePointer Input %u64
-
-%f32_ptr_function = OpTypePointer Function %f32
-
-%f32_input = OpVariable %f32_ptr_input Input
-%f32vec2_input = OpVariable %f32vec2_ptr_input Input
-
-%u32_input = OpVariable %u32_ptr_input Input
-%u32vec2_input = OpVariable %u32vec2_ptr_input Input
-
-%u64_input = OpVariable %u64_ptr_input Input
-
-%u32_ptr_function = OpTypePointer Function %u32
-
-%struct_f16_u16 = OpTypeStruct %f16 %u16
-%struct_f32_f32 = OpTypeStruct %f32 %f32
-%struct_f32_f32_f32 = OpTypeStruct %f32 %f32 %f32
-%struct_f32_u32 = OpTypeStruct %f32 %u32
-%struct_f32_u32_f32 = OpTypeStruct %f32 %u32 %f32
-%struct_u32_f32 = OpTypeStruct %u32 %f32
-%struct_u32_u32 = OpTypeStruct %u32 %u32
-%struct_f32_f64 = OpTypeStruct %f32 %f64
-%struct_f32vec2_f32vec2 = OpTypeStruct %f32vec2 %f32vec2
-%struct_f32vec2_u32vec2 = OpTypeStruct %f32vec2 %u32vec2
-)";
-
-  ss << debug_instructions_before_main;
-
-  ss << R"(
-%main = OpFunction %void None %func
-%main_entry = OpLabel
-)";
-
-  ss << body;
-
-  ss << R"(
-OpReturn
-OpFunctionEnd)";
-
-  return ss.str();
-}
-
-TEST_F(ValidateOldDebugInfo, UseDebugInstructionOutOfFunction) {
-  const std::string src = R"(
-%code = OpString "main() {}"
-)";
-
-  const std::string dbg_inst = R"(
-%cu = OpExtInst %void %DbgExt DebugCompilationUnit %code 1 1
-)";
-
-  const std::string extension = R"(
-%DbgExt = OpExtInstImport "DebugInfo"
-)";
-
-  CompileSuccessfully(GenerateShaderCodeForDebugInfo(src, "", dbg_inst, "",
-                                                     extension, "Vertex"));
-  ASSERT_EQ(SPV_SUCCESS, ValidateInstructions());
-}
-
-TEST_F(ValidateOpenCL100DebugInfo, UseDebugInstructionOutOfFunction) {
-  const std::string src = R"(
-%src = OpString "simple.hlsl"
-%code = OpString "main() {}"
-)";
-
-  const std::string dbg_inst = R"(
-%dbg_src = OpExtInst %void %DbgExt DebugSource %src %code
-)";
-
-  const std::string extension = R"(
-%DbgExt = OpExtInstImport "OpenCL.DebugInfo.100"
-)";
-
-  CompileSuccessfully(GenerateShaderCodeForDebugInfo(src, "", dbg_inst, "",
-                                                     extension, "Vertex"));
-  ASSERT_EQ(SPV_SUCCESS, ValidateInstructions());
-}
-
-TEST_F(ValidateOpenCL100DebugInfo, DebugSourceInFunction) {
-  const std::string src = R"(
-%src = OpString "simple.hlsl"
-%code = OpString "main() {}"
-)";
-
-  const std::string dbg_inst = R"(
-%dbg_src = OpExtInst %void %DbgExt DebugSource %src %code
-)";
-
-  const std::string extension = R"(
-%DbgExt = OpExtInstImport "OpenCL.DebugInfo.100"
-)";
-
-  CompileSuccessfully(GenerateShaderCodeForDebugInfo(src, "", "", dbg_inst,
-                                                     extension, "Vertex"));
-  ASSERT_EQ(SPV_ERROR_INVALID_LAYOUT, ValidateInstructions());
-  EXPECT_THAT(
-      getDiagnosticString(),
-      HasSubstr("Debug info extension instructions other than DebugScope, "
-                "DebugNoScope, DebugDeclare, DebugValue must appear between "
-                "section 9 (types, constants, global variables) and section 10 "
-                "(function declarations)"));
-}
-
-TEST_P(ValidateLocalDebugInfoOutOfFunction, OpenCLDebugInfo100DebugScope) {
-  const std::string src = R"(
-%src = OpString "simple.hlsl"
-%code = OpString "void main() {}"
-%void_name = OpString "void"
-%main_name = OpString "main"
-%main_linkage_name = OpString "v_main"
-%int_name = OpString "int"
-%foo_name = OpString "foo"
-)";
-
-  const std::string dbg_inst_header = R"(
-%dbg_src = OpExtInst %void %DbgExt DebugSource %src %code
-%comp_unit = OpExtInst %void %DbgExt DebugCompilationUnit 2 4 %dbg_src HLSL
-%int_info = OpExtInst %void %DbgExt DebugTypeBasic %int_name %u32_0 Signed
-%main_type_info = OpExtInst %void %DbgExt DebugTypeFunction FlagIsPublic %void
-%main_info = OpExtInst %void %DbgExt DebugFunction %main_name %main_type_info %dbg_src 1 1 %comp_unit %main_linkage_name FlagIsPublic 1 %main
-%foo_info = OpExtInst %void %DbgExt DebugLocalVariable %foo_name %int_info %dbg_src 1 1 %main_info FlagIsLocal
-%expr = OpExtInst %void %DbgExt DebugExpression
-)";
-
-  const std::string body = R"(
-%foo = OpVariable %u32_ptr_function Function
-%foo_val = OpLoad %u32 %foo
-)";
-
-  const std::string extension = R"(
-%DbgExt = OpExtInstImport "OpenCL.DebugInfo.100"
-)";
-
-  CompileSuccessfully(GenerateShaderCodeForDebugInfo(
-      src, "", dbg_inst_header + GetParam(), body, extension, "Vertex"));
-  ASSERT_EQ(SPV_ERROR_INVALID_LAYOUT, ValidateInstructions());
-  EXPECT_THAT(getDiagnosticString(),
-              HasSubstr("DebugScope, DebugNoScope, DebugDeclare, DebugValue "
-                        "of debug info extension must appear in a function "
-                        "body"));
-}
-
-INSTANTIATE_TEST_SUITE_P(
-    AllLocalDebugInfo, ValidateLocalDebugInfoOutOfFunction,
-    ::testing::ValuesIn(std::vector<std::string>{
-        "%main_scope = OpExtInst %void %DbgExt DebugScope %main_info",
-        "%no_scope = OpExtInst %void %DbgExt DebugNoScope",
-    }));
-
-TEST_F(ValidateOpenCL100DebugInfo, DebugFunctionForwardReference) {
-  const std::string src = R"(
-%src = OpString "simple.hlsl"
-%code = OpString "void main() {}"
-%void_name = OpString "void"
-%main_name = OpString "main"
-%main_linkage_name = OpString "v_main"
-)";
-
-  const std::string dbg_inst_header = R"(
-%dbg_src = OpExtInst %void %DbgExt DebugSource %src %code
-%comp_unit = OpExtInst %void %DbgExt DebugCompilationUnit 2 4 %dbg_src HLSL
-%main_type_info = OpExtInst %void %DbgExt DebugTypeFunction FlagIsPublic %void
-%main_info = OpExtInst %void %DbgExt DebugFunction %main_name %main_type_info %dbg_src 1 1 %comp_unit %main_linkage_name FlagIsPublic 1 %main
-)";
-
-  const std::string body = R"(
-%main_scope = OpExtInst %void %DbgExt DebugScope %main_info
-)";
-
-  const std::string extension = R"(
-%DbgExt = OpExtInstImport "OpenCL.DebugInfo.100"
-)";
-
-  CompileSuccessfully(GenerateShaderCodeForDebugInfo(
-      src, "", dbg_inst_header, body, extension, "Vertex"));
-  ASSERT_EQ(SPV_SUCCESS, ValidateInstructions());
-}
-
-TEST_F(ValidateOpenCL100DebugInfo, DebugFunctionMissingOpFunction) {
-  const std::string src = R"(
-%src = OpString "simple.hlsl"
-%code = OpString "void main() {}"
-%void_name = OpString "void"
-%main_name = OpString "main"
-%main_linkage_name = OpString "v_main"
-)";
-
-  const std::string dbg_inst_header = R"(
-%dbgNone = OpExtInst %void %DbgExt DebugInfoNone
-%dbg_src = OpExtInst %void %DbgExt DebugSource %src %code
-%comp_unit = OpExtInst %void %DbgExt DebugCompilationUnit 2 4 %dbg_src HLSL
-%main_type_info = OpExtInst %void %DbgExt DebugTypeFunction FlagIsPublic %void
-%main_info = OpExtInst %void %DbgExt DebugFunction %main_name %main_type_info %dbg_src 1 1 %comp_unit %main_linkage_name FlagIsPublic 1 %dbgNone
-)";
-
-  const std::string body = R"(
-%main_scope = OpExtInst %void %DbgExt DebugScope %main_info
-)";
-
-  const std::string extension = R"(
-%DbgExt = OpExtInstImport "OpenCL.DebugInfo.100"
-)";
-
-  CompileSuccessfully(GenerateShaderCodeForDebugInfo(
-      src, "", dbg_inst_header, body, extension, "Vertex"));
-  ASSERT_EQ(SPV_SUCCESS, ValidateInstructions());
-}
-
-TEST_F(ValidateOpenCL100DebugInfo, DebugScopeBeforeOpVariableInFunction) {
-  const std::string src = R"(
-%src = OpString "simple.hlsl"
-%code = OpString "float4 main(float arg) {
-  float foo;
-  return float4(0, 0, 0, 0);
-}
-"
-%float_name = OpString "float"
-%main_name = OpString "main"
-%main_linkage_name = OpString "v4f_main_f"
-)";
-
-  const std::string size_const = R"(
-%int_32 = OpConstant %u32 32
-)";
-
-  const std::string dbg_inst_header = R"(
-%dbg_src = OpExtInst %void %DbgExt DebugSource %src %code
-%comp_unit = OpExtInst %void %DbgExt DebugCompilationUnit 2 4 %dbg_src HLSL
-%float_info = OpExtInst %void %DbgExt DebugTypeBasic %float_name %int_32 Float
-%v4float_info = OpExtInst %void %DbgExt DebugTypeVector %float_info 4
-%main_type_info = OpExtInst %void %DbgExt DebugTypeFunction FlagIsPublic %v4float_info %float_info
-%main_info = OpExtInst %void %DbgExt DebugFunction %main_name %main_type_info %dbg_src 12 1 %comp_unit %main_linkage_name FlagIsPublic 13 %main
-)";
-
-  const std::string body = R"(
-%main_scope = OpExtInst %void %DbgExt DebugScope %main_info
-%foo = OpVariable %f32_ptr_function Function
-)";
-
-  const std::string extension = R"(
-%DbgExt = OpExtInstImport "OpenCL.DebugInfo.100"
-)";
-
-  CompileSuccessfully(GenerateShaderCodeForDebugInfo(
-      src, size_const, dbg_inst_header, body, extension, "Vertex"));
-  ASSERT_EQ(SPV_SUCCESS, ValidateInstructions());
-}
-
-TEST_F(ValidateOpenCL100DebugInfo, DebugTypeCompositeSizeDebugInfoNone) {
-  const std::string src = R"(
-%src = OpString "simple.hlsl"
-%code = OpString "OpaqueType foo;
-main() {}
-"
-%ty_name = OpString "struct VS_OUTPUT"
-)";
-
-  const std::string dbg_inst_header = R"(
-%dbg_none = OpExtInst %void %DbgExt DebugInfoNone
-%dbg_src = OpExtInst %void %DbgExt DebugSource %src %code
-%comp_unit = OpExtInst %void %DbgExt DebugCompilationUnit 2 4 %dbg_src HLSL
-%opaque = OpExtInst %void %DbgExt DebugTypeComposite %ty_name Class %dbg_src 1 1 %comp_unit %ty_name %dbg_none FlagIsPublic
-)";
-
-  const std::string extension = R"(
-%DbgExt = OpExtInstImport "OpenCL.DebugInfo.100"
-)";
-
-  CompileSuccessfully(GenerateShaderCodeForDebugInfo(src, "", dbg_inst_header,
-                                                     "", extension, "Vertex"));
-  ASSERT_EQ(SPV_SUCCESS, ValidateInstructions());
-}
-
-TEST_F(ValidateOpenCL100DebugInfo, DebugTypeCompositeForwardReference) {
-  const std::string src = R"(
-%src = OpString "simple.hlsl"
-%code = OpString "struct VS_OUTPUT {
-  float4 pos : SV_POSITION;
-  float4 color : COLOR;
-};
-main() {}
-"
-%VS_OUTPUT_name = OpString "struct VS_OUTPUT"
-%float_name = OpString "float"
-%VS_OUTPUT_pos_name = OpString "pos : SV_POSITION"
-%VS_OUTPUT_color_name = OpString "color : COLOR"
-%VS_OUTPUT_linkage_name = OpString "VS_OUTPUT"
-)";
-
-  const std::string size_const = R"(
-%int_32 = OpConstant %u32 32
-%int_128 = OpConstant %u32 128
-)";
-
-  const std::string dbg_inst_header = R"(
-%dbg_src = OpExtInst %void %DbgExt DebugSource %src %code
-%comp_unit = OpExtInst %void %DbgExt DebugCompilationUnit 2 4 %dbg_src HLSL
-%VS_OUTPUT_info = OpExtInst %void %DbgExt DebugTypeComposite %VS_OUTPUT_name Structure %dbg_src 1 1 %comp_unit %VS_OUTPUT_linkage_name %int_128 FlagIsPublic %VS_OUTPUT_pos_info %VS_OUTPUT_color_info
-%float_info = OpExtInst %void %DbgExt DebugTypeBasic %float_name %int_32 Float
-%v4float_info = OpExtInst %void %DbgExt DebugTypeVector %float_info 4
-%VS_OUTPUT_pos_info = OpExtInst %void %DbgExt DebugTypeMember %VS_OUTPUT_pos_name %v4float_info %dbg_src 2 3 %VS_OUTPUT_info %u32_0 %int_128 FlagIsPublic
-%VS_OUTPUT_color_info = OpExtInst %void %DbgExt DebugTypeMember %VS_OUTPUT_color_name %v4float_info %dbg_src 3 3 %VS_OUTPUT_info %int_128 %int_128 FlagIsPublic
-)";
-
-  const std::string extension = R"(
-%DbgExt = OpExtInstImport "OpenCL.DebugInfo.100"
-)";
-
-  CompileSuccessfully(GenerateShaderCodeForDebugInfo(
-      src, size_const, dbg_inst_header, "", extension, "Vertex"));
-  ASSERT_EQ(SPV_SUCCESS, ValidateInstructions());
-}
-
-TEST_F(ValidateOpenCL100DebugInfo, DebugTypeCompositeMissingReference) {
-  const std::string src = R"(
-%src = OpString "simple.hlsl"
-%code = OpString "struct VS_OUTPUT {
-  float4 pos : SV_POSITION;
-  float4 color : COLOR;
-};
-main() {}
-"
-%VS_OUTPUT_name = OpString "struct VS_OUTPUT"
-%float_name = OpString "float"
-%VS_OUTPUT_pos_name = OpString "pos : SV_POSITION"
-%VS_OUTPUT_color_name = OpString "color : COLOR"
-%VS_OUTPUT_linkage_name = OpString "VS_OUTPUT"
-)";
-
-  const std::string size_const = R"(
-%int_32 = OpConstant %u32 32
-%int_128 = OpConstant %u32 128
-)";
-
-  const std::string dbg_inst_header = R"(
-%dbg_src = OpExtInst %void %DbgExt DebugSource %src %code
-%comp_unit = OpExtInst %void %DbgExt DebugCompilationUnit 2 4 %dbg_src HLSL
-%VS_OUTPUT_info = OpExtInst %void %DbgExt DebugTypeComposite %VS_OUTPUT_name Structure %dbg_src 1 1 %comp_unit %VS_OUTPUT_linkage_name %int_128 FlagIsPublic %VS_OUTPUT_pos_info %VS_OUTPUT_color_info
-%float_info = OpExtInst %void %DbgExt DebugTypeBasic %float_name %int_32 Float
-%v4float_info = OpExtInst %void %DbgExt DebugTypeVector %float_info 4
-%VS_OUTPUT_pos_info = OpExtInst %void %DbgExt DebugTypeMember %VS_OUTPUT_pos_name %v4float_info %dbg_src 2 3 %VS_OUTPUT_info %u32_0 %int_128 FlagIsPublic
-)";
-
-  const std::string extension = R"(
-%DbgExt = OpExtInstImport "OpenCL.DebugInfo.100"
-)";
-
-  CompileSuccessfully(GenerateShaderCodeForDebugInfo(
-      src, size_const, dbg_inst_header, "", extension, "Vertex"));
-  ASSERT_EQ(SPV_ERROR_INVALID_ID, ValidateInstructions());
-  EXPECT_THAT(getDiagnosticString(),
-              HasSubstr("forward referenced IDs have not been defined"));
-}
-
-TEST_F(ValidateOpenCL100DebugInfo, DebugInstructionWrongResultType) {
-  const std::string src = R"(
-%src = OpString "simple.hlsl"
-%code = OpString "main() {}"
-)";
-
-  const std::string dbg_inst = R"(
-%dbg_src = OpExtInst %bool %DbgExt DebugSource %src %code
-)";
-
-  const std::string extension = R"(
-%DbgExt = OpExtInstImport "OpenCL.DebugInfo.100"
-)";
-
-  CompileSuccessfully(GenerateShaderCodeForDebugInfo(src, "", dbg_inst, "",
-                                                     extension, "Vertex"));
-  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
-  EXPECT_THAT(getDiagnosticString(),
-              HasSubstr("expected result type must be a result id of "
-                        "OpTypeVoid"));
-}
-
-TEST_F(ValidateOpenCL100DebugInfo, DebugCompilationUnit) {
-  const std::string src = R"(
-%src = OpString "simple.hlsl"
-%code = OpString "main() {}"
-)";
-
-  const std::string dbg_inst = R"(
-%dbg_src = OpExtInst %void %DbgExt DebugSource %src %code
-%comp_unit = OpExtInst %void %DbgExt DebugCompilationUnit 2 4 %dbg_src HLSL
-)";
-
-  const std::string extension = R"(
-%DbgExt = OpExtInstImport "OpenCL.DebugInfo.100"
-)";
-
-  CompileSuccessfully(GenerateShaderCodeForDebugInfo(src, "", dbg_inst, "",
-                                                     extension, "Vertex"));
-  ASSERT_EQ(SPV_SUCCESS, ValidateInstructions());
-}
-
-TEST_F(ValidateOpenCL100DebugInfo, DebugCompilationUnitFail) {
-  const std::string src = R"(
-%src = OpString "simple.hlsl"
-%code = OpString "main() {}"
-)";
-
-  const std::string dbg_inst = R"(
-%dbg_src = OpExtInst %void %DbgExt DebugSource %src %code
-%comp_unit = OpExtInst %void %DbgExt DebugCompilationUnit 2 4 %src HLSL
-)";
-
-  const std::string extension = R"(
-%DbgExt = OpExtInstImport "OpenCL.DebugInfo.100"
-)";
-
-  CompileSuccessfully(GenerateShaderCodeForDebugInfo(src, "", dbg_inst, "",
-                                                     extension, "Vertex"));
-  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
-  EXPECT_THAT(getDiagnosticString(),
-              HasSubstr("expected operand Source must be a result id of "
-                        "DebugSource"));
-}
-
-TEST_F(ValidateOpenCL100DebugInfo, DebugSourceFailFile) {
-  const std::string src = R"(
-%code = OpString "main() {}"
-)";
-
-  const std::string dbg_inst = R"(
-%dbg_src = OpExtInst %void %DbgExt DebugSource %DbgExt %code
-)";
-
-  const std::string extension = R"(
-%DbgExt = OpExtInstImport "OpenCL.DebugInfo.100"
-)";
-
-  CompileSuccessfully(GenerateShaderCodeForDebugInfo(src, "", dbg_inst, "",
-                                                     extension, "Vertex"));
-  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
-  EXPECT_THAT(getDiagnosticString(),
-              HasSubstr("expected operand File must be a result id of "
-                        "OpString"));
-}
-
-TEST_F(ValidateOpenCL100DebugInfo, DebugSourceFailSource) {
-  const std::string src = R"(
-%src = OpString "simple.hlsl"
-)";
-
-  const std::string dbg_inst = R"(
-%dbg_src = OpExtInst %void %DbgExt DebugSource %src %DbgExt
-)";
-
-  const std::string extension = R"(
-%DbgExt = OpExtInstImport "OpenCL.DebugInfo.100"
-)";
-
-  CompileSuccessfully(GenerateShaderCodeForDebugInfo(src, "", dbg_inst, "",
-                                                     extension, "Vertex"));
-  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
-  EXPECT_THAT(getDiagnosticString(),
-              HasSubstr("expected operand Text must be a result id of "
-                        "OpString"));
-}
-
-TEST_F(ValidateOpenCL100DebugInfo, DebugSourceNoText) {
-  const std::string src = R"(
-%src = OpString "simple.hlsl"
-)";
-
-  const std::string dbg_inst = R"(
-%dbg_src = OpExtInst %void %DbgExt DebugSource %src
-)";
-
-  const std::string extension = R"(
-%DbgExt = OpExtInstImport "OpenCL.DebugInfo.100"
-)";
-
-  CompileSuccessfully(GenerateShaderCodeForDebugInfo(src, "", dbg_inst, "",
-                                                     extension, "Vertex"));
-  ASSERT_EQ(SPV_SUCCESS, ValidateInstructions());
-}
-
-TEST_F(ValidateOpenCL100DebugInfo, DebugTypeBasicFailName) {
-  const std::string src = R"(
-%src = OpString "simple.hlsl"
-%code = OpString "float4 main(float arg) {
-  float foo;
-  return float4(0, 0, 0, 0);
-}
-"
-%float_name = OpString "float"
-)";
-
-  const std::string size_const = R"(
-%int_32 = OpConstant %u32 32
-)";
-
-  const std::string dbg_inst_header = R"(
-%dbg_src = OpExtInst %void %DbgExt DebugSource %src %code
-%comp_unit = OpExtInst %void %DbgExt DebugCompilationUnit 2 4 %dbg_src HLSL
-%float_info = OpExtInst %void %DbgExt DebugTypeBasic %int_32 %int_32 Float
-)";
-
-  const std::string extension = R"(
-%DbgExt = OpExtInstImport "OpenCL.DebugInfo.100"
-)";
-
-  CompileSuccessfully(GenerateShaderCodeForDebugInfo(
-      src, size_const, dbg_inst_header, "", extension, "Vertex"));
-  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
-  EXPECT_THAT(getDiagnosticString(),
-              HasSubstr("expected operand Name must be a result id of "
-                        "OpString"));
-}
-
-TEST_F(ValidateOpenCL100DebugInfo, DebugTypeBasicFailSize) {
-  const std::string src = R"(
-%src = OpString "simple.hlsl"
-%code = OpString "float4 main(float arg) {
-  float foo;
-  return float4(0, 0, 0, 0);
-}
-"
-%float_name = OpString "float"
-)";
-
-  const std::string size_const = R"(
-%int_32 = OpConstant %u32 32
-)";
-
-  const std::string dbg_inst_header = R"(
-%dbg_src = OpExtInst %void %DbgExt DebugSource %src %code
-%comp_unit = OpExtInst %void %DbgExt DebugCompilationUnit 2 4 %dbg_src HLSL
-%float_info = OpExtInst %void %DbgExt DebugTypeBasic %float_name %float_name Float
-)";
-
-  const std::string extension = R"(
-%DbgExt = OpExtInstImport "OpenCL.DebugInfo.100"
-)";
-
-  CompileSuccessfully(GenerateShaderCodeForDebugInfo(
-      src, size_const, dbg_inst_header, "", extension, "Vertex"));
-  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
-  EXPECT_THAT(getDiagnosticString(),
-              HasSubstr("expected operand Size must be a result id of "
-                        "OpConstant"));
-}
-
-TEST_F(ValidateOpenCL100DebugInfo, DebugTypePointer) {
-  const std::string src = R"(
-%src = OpString "simple.hlsl"
-%code = OpString "float4 main(float arg) {
-  float foo;
-  return float4(0, 0, 0, 0);
-}
-"
-%float_name = OpString "float"
-)";
-
-  const std::string size_const = R"(
-%int_32 = OpConstant %u32 32
-)";
-
-  const std::string dbg_inst_header = R"(
-%dbg_src = OpExtInst %void %DbgExt DebugSource %src %code
-%comp_unit = OpExtInst %void %DbgExt DebugCompilationUnit 2 4 %dbg_src HLSL
-%float_info = OpExtInst %void %DbgExt DebugTypeBasic %float_name %int_32 Float
-%pfloat_info = OpExtInst %void %DbgExt DebugTypePointer %float_info Function FlagIsLocal
-)";
-
-  const std::string extension = R"(
-%DbgExt = OpExtInstImport "OpenCL.DebugInfo.100"
-)";
-
-  CompileSuccessfully(GenerateShaderCodeForDebugInfo(
-      src, size_const, dbg_inst_header, "", extension, "Vertex"));
-  ASSERT_EQ(SPV_SUCCESS, ValidateInstructions());
-}
-
-TEST_F(ValidateOpenCL100DebugInfo, DebugTypePointerFail) {
-  const std::string src = R"(
-%src = OpString "simple.hlsl"
-%code = OpString "float4 main(float arg) {
-  float foo;
-  return float4(0, 0, 0, 0);
-}
-"
-%float_name = OpString "float"
-)";
-
-  const std::string size_const = R"(
-%int_32 = OpConstant %u32 32
-)";
-
-  const std::string dbg_inst_header = R"(
-%dbg_src = OpExtInst %void %DbgExt DebugSource %src %code
-%comp_unit = OpExtInst %void %DbgExt DebugCompilationUnit 2 4 %dbg_src HLSL
-%float_info = OpExtInst %void %DbgExt DebugTypeBasic %float_name %int_32 Float
-%pfloat_info = OpExtInst %void %DbgExt DebugTypePointer %dbg_src Function FlagIsLocal
-)";
-
-  const std::string extension = R"(
-%DbgExt = OpExtInstImport "OpenCL.DebugInfo.100"
-)";
-
-  CompileSuccessfully(GenerateShaderCodeForDebugInfo(
-      src, size_const, dbg_inst_header, "", extension, "Vertex"));
-  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
-  EXPECT_THAT(getDiagnosticString(),
-              HasSubstr("expected operand Base Type must be a result id of "
-                        "DebugTypeBasic"));
-}
-
-TEST_F(ValidateOpenCL100DebugInfo, DebugTypeQualifier) {
-  const std::string src = R"(
-%src = OpString "simple.hlsl"
-%code = OpString "float4 main(float arg) {
-  float foo;
-  return float4(0, 0, 0, 0);
-}
-"
-%float_name = OpString "float"
-)";
-
-  const std::string size_const = R"(
-%int_32 = OpConstant %u32 32
-)";
-
-  const std::string dbg_inst_header = R"(
-%dbg_src = OpExtInst %void %DbgExt DebugSource %src %code
-%comp_unit = OpExtInst %void %DbgExt DebugCompilationUnit 2 4 %dbg_src HLSL
-%float_info = OpExtInst %void %DbgExt DebugTypeBasic %float_name %int_32 Float
-%cfloat_info = OpExtInst %void %DbgExt DebugTypeQualifier %float_info ConstType
-)";
-
-  const std::string extension = R"(
-%DbgExt = OpExtInstImport "OpenCL.DebugInfo.100"
-)";
-
-  CompileSuccessfully(GenerateShaderCodeForDebugInfo(
-      src, size_const, dbg_inst_header, "", extension, "Vertex"));
-  ASSERT_EQ(SPV_SUCCESS, ValidateInstructions());
-}
-
-TEST_F(ValidateOpenCL100DebugInfo, DebugTypeQualifierFail) {
-  const std::string src = R"(
-%src = OpString "simple.hlsl"
-%code = OpString "float4 main(float arg) {
-  float foo;
-  return float4(0, 0, 0, 0);
-}
-"
-%float_name = OpString "float"
-)";
-
-  const std::string size_const = R"(
-%int_32 = OpConstant %u32 32
-)";
-
-  const std::string dbg_inst_header = R"(
-%dbg_src = OpExtInst %void %DbgExt DebugSource %src %code
-%comp_unit = OpExtInst %void %DbgExt DebugCompilationUnit 2 4 %dbg_src HLSL
-%float_info = OpExtInst %void %DbgExt DebugTypeBasic %float_name %int_32 Float
-%cfloat_info = OpExtInst %void %DbgExt DebugTypeQualifier %comp_unit ConstType
-)";
-
-  const std::string extension = R"(
-%DbgExt = OpExtInstImport "OpenCL.DebugInfo.100"
-)";
-
-  CompileSuccessfully(GenerateShaderCodeForDebugInfo(
-      src, size_const, dbg_inst_header, "", extension, "Vertex"));
-  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
-  EXPECT_THAT(getDiagnosticString(),
-              HasSubstr("expected operand Base Type must be a result id of "
-                        "DebugTypeBasic"));
-}
-
-TEST_F(ValidateOpenCL100DebugInfo, DebugTypeArray) {
-  const std::string src = R"(
-%src = OpString "simple.hlsl"
-%code = OpString "main() {}"
-%float_name = OpString "float"
-)";
-
-  const std::string size_const = R"(
-%int_32 = OpConstant %u32 32
-)";
-
-  const std::string dbg_inst_header = R"(
-%dbg_src = OpExtInst %void %DbgExt DebugSource %src %code
-%comp_unit = OpExtInst %void %DbgExt DebugCompilationUnit 2 4 %dbg_src HLSL
-%float_info = OpExtInst %void %DbgExt DebugTypeBasic %float_name %int_32 Float
-%float_arr_info = OpExtInst %void %DbgExt DebugTypeArray %float_info %int_32
-)";
-
-  const std::string extension = R"(
-%DbgExt = OpExtInstImport "OpenCL.DebugInfo.100"
-)";
-
-  CompileSuccessfully(GenerateShaderCodeForDebugInfo(
-      src, size_const, dbg_inst_header, "", extension, "Vertex"));
-  ASSERT_EQ(SPV_SUCCESS, ValidateInstructions());
-}
-
-TEST_F(ValidateOpenCL100DebugInfo, DebugTypeArrayWithVariableSize) {
-  const std::string src = R"(
-%src = OpString "simple.hlsl"
-%code = OpString "main() {}"
-%float_name = OpString "float"
-%int_name = OpString "int"
-%main_name = OpString "main"
-%foo_name = OpString "foo"
-)";
-
-  const std::string size_const = R"(
-%int_32 = OpConstant %u32 32
-)";
-
-  const std::string dbg_inst_header = R"(
-%dbg_src = OpExtInst %void %DbgExt DebugSource %src %code
-%comp_unit = OpExtInst %void %DbgExt DebugCompilationUnit 2 4 %dbg_src HLSL
-%float_info = OpExtInst %void %DbgExt DebugTypeBasic %float_name %int_32 Float
-%uint_info = OpExtInst %void %DbgExt DebugTypeBasic %int_name %int_32 Unsigned
-%main_type_info = OpExtInst %void %DbgExt DebugTypeFunction FlagIsPublic %void
-%main_info = OpExtInst %void %DbgExt DebugFunction %main_name %main_type_info %dbg_src 1 1 %comp_unit %main_name FlagIsPublic 1 %main
-%foo_info = OpExtInst %void %DbgExt DebugLocalVariable %foo_name %uint_info %dbg_src 1 1 %main_info FlagIsLocal
-%float_arr_info = OpExtInst %void %DbgExt DebugTypeArray %float_info %foo_info
-)";
-
-  const std::string extension = R"(
-%DbgExt = OpExtInstImport "OpenCL.DebugInfo.100"
-)";
-
-  CompileSuccessfully(GenerateShaderCodeForDebugInfo(
-      src, size_const, dbg_inst_header, "", extension, "Vertex"));
-  ASSERT_EQ(SPV_SUCCESS, ValidateInstructions());
-}
-
-TEST_F(ValidateOpenCL100DebugInfo, DebugTypeArrayFailBaseType) {
-  const std::string src = R"(
-%src = OpString "simple.hlsl"
-%code = OpString "main() {}"
-%float_name = OpString "float"
-)";
-
-  const std::string size_const = R"(
-%int_32 = OpConstant %u32 32
-)";
-
-  const std::string dbg_inst_header = R"(
-%dbg_src = OpExtInst %void %DbgExt DebugSource %src %code
-%comp_unit = OpExtInst %void %DbgExt DebugCompilationUnit 2 4 %dbg_src HLSL
-%float_info = OpExtInst %void %DbgExt DebugTypeBasic %float_name %int_32 Float
-%float_arr_info = OpExtInst %void %DbgExt DebugTypeArray %comp_unit %int_32
-)";
-
-  const std::string extension = R"(
-%DbgExt = OpExtInstImport "OpenCL.DebugInfo.100"
-)";
-
-  CompileSuccessfully(GenerateShaderCodeForDebugInfo(
-      src, size_const, dbg_inst_header, "", extension, "Vertex"));
-  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
-  EXPECT_THAT(getDiagnosticString(),
-              HasSubstr("expected operand Base Type is not a valid debug "
-                        "type"));
-}
-
-TEST_F(ValidateOpenCL100DebugInfo, DebugTypeArrayFailComponentCount) {
-  const std::string src = R"(
-%src = OpString "simple.hlsl"
-%code = OpString "main() {}"
-%float_name = OpString "float"
-)";
-
-  const std::string size_const = R"(
-%int_32 = OpConstant %u32 32
-)";
-
-  const std::string dbg_inst_header = R"(
-%dbg_src = OpExtInst %void %DbgExt DebugSource %src %code
-%comp_unit = OpExtInst %void %DbgExt DebugCompilationUnit 2 4 %dbg_src HLSL
-%float_info = OpExtInst %void %DbgExt DebugTypeBasic %float_name %int_32 Float
-%float_arr_info = OpExtInst %void %DbgExt DebugTypeArray %float_info %float_info
-)";
-
-  const std::string extension = R"(
-%DbgExt = OpExtInstImport "OpenCL.DebugInfo.100"
-)";
-
-  CompileSuccessfully(GenerateShaderCodeForDebugInfo(
-      src, size_const, dbg_inst_header, "", extension, "Vertex"));
-  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
-  EXPECT_THAT(getDiagnosticString(),
-              HasSubstr("Component Count must be OpConstant with a 32- or "
-                        "64-bits integer scalar type or DebugGlobalVariable or "
-                        "DebugLocalVariable with a 32- or 64-bits unsigned "
-                        "integer scalar type"));
-}
-
-TEST_F(ValidateOpenCL100DebugInfo, DebugTypeArrayFailComponentCountFloat) {
-  const std::string src = R"(
-%src = OpString "simple.hlsl"
-%code = OpString "main() {}"
-%float_name = OpString "float"
-)";
-
-  const std::string size_const = R"(
-%int_32 = OpConstant %u32 32
-)";
-
-  const std::string dbg_inst_header = R"(
-%dbg_src = OpExtInst %void %DbgExt DebugSource %src %code
-%comp_unit = OpExtInst %void %DbgExt DebugCompilationUnit 2 4 %dbg_src HLSL
-%float_info = OpExtInst %void %DbgExt DebugTypeBasic %float_name %int_32 Float
-%float_arr_info = OpExtInst %void %DbgExt DebugTypeArray %float_info %f32_4
-)";
-
-  const std::string extension = R"(
-%DbgExt = OpExtInstImport "OpenCL.DebugInfo.100"
-)";
-
-  CompileSuccessfully(GenerateShaderCodeForDebugInfo(
-      src, size_const, dbg_inst_header, "", extension, "Vertex"));
-  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
-  EXPECT_THAT(getDiagnosticString(),
-              HasSubstr("Component Count must be OpConstant with a 32- or "
-                        "64-bits integer scalar type or DebugGlobalVariable or "
-                        "DebugLocalVariable with a 32- or 64-bits unsigned "
-                        "integer scalar type"));
-}
-
-TEST_F(ValidateOpenCL100DebugInfo, DebugTypeArrayFailComponentCountZero) {
-  const std::string src = R"(
-%src = OpString "simple.hlsl"
-%code = OpString "main() {}"
-%float_name = OpString "float"
-)";
-
-  const std::string size_const = R"(
-%int_32 = OpConstant %u32 32
-)";
-
-  const std::string dbg_inst_header = R"(
-%dbg_src = OpExtInst %void %DbgExt DebugSource %src %code
-%comp_unit = OpExtInst %void %DbgExt DebugCompilationUnit 2 4 %dbg_src HLSL
-%float_info = OpExtInst %void %DbgExt DebugTypeBasic %float_name %int_32 Float
-%float_arr_info = OpExtInst %void %DbgExt DebugTypeArray %float_info %u32_0
-)";
-
-  const std::string extension = R"(
-%DbgExt = OpExtInstImport "OpenCL.DebugInfo.100"
-)";
-
-  CompileSuccessfully(GenerateShaderCodeForDebugInfo(
-      src, size_const, dbg_inst_header, "", extension, "Vertex"));
-  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
-  EXPECT_THAT(getDiagnosticString(),
-              HasSubstr("Component Count must be OpConstant with a 32- or "
-                        "64-bits integer scalar type or DebugGlobalVariable or "
-                        "DebugLocalVariable with a 32- or 64-bits unsigned "
-                        "integer scalar type"));
-}
-
-TEST_F(ValidateOpenCL100DebugInfo, DebugTypeArrayFailVariableSizeTypeFloat) {
-  const std::string src = R"(
-%src = OpString "simple.hlsl"
-%code = OpString "main() {}"
-%float_name = OpString "float"
-%main_name = OpString "main"
-%foo_name = OpString "foo"
-)";
-
-  const std::string size_const = R"(
-%int_32 = OpConstant %u32 32
-)";
-
-  const std::string dbg_inst_header = R"(
-%dbg_src = OpExtInst %void %DbgExt DebugSource %src %code
-%comp_unit = OpExtInst %void %DbgExt DebugCompilationUnit 2 4 %dbg_src HLSL
-%float_info = OpExtInst %void %DbgExt DebugTypeBasic %float_name %int_32 Float
-%main_type_info = OpExtInst %void %DbgExt DebugTypeFunction FlagIsPublic %void
-%main_info = OpExtInst %void %DbgExt DebugFunction %main_name %main_type_info %dbg_src 1 1 %comp_unit %main_name FlagIsPublic 1 %main
-%foo_info = OpExtInst %void %DbgExt DebugLocalVariable %foo_name %float_info %dbg_src 1 1 %main_info FlagIsLocal
-%float_arr_info = OpExtInst %void %DbgExt DebugTypeArray %float_info %foo_info
-)";
-
-  const std::string extension = R"(
-%DbgExt = OpExtInstImport "OpenCL.DebugInfo.100"
-)";
-
-  CompileSuccessfully(GenerateShaderCodeForDebugInfo(
-      src, size_const, dbg_inst_header, "", extension, "Vertex"));
-  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
-  EXPECT_THAT(getDiagnosticString(),
-              HasSubstr("Component Count must be OpConstant with a 32- or "
-                        "64-bits integer scalar type or DebugGlobalVariable or "
-                        "DebugLocalVariable with a 32- or 64-bits unsigned "
-                        "integer scalar type"));
-}
-
-TEST_F(ValidateOpenCL100DebugInfo, DebugTypeVector) {
-  const std::string src = R"(
-%src = OpString "simple.hlsl"
-%code = OpString "main() {}"
-%float_name = OpString "float"
-)";
-
-  const std::string size_const = R"(
-%int_32 = OpConstant %u32 32
-)";
-
-  const std::string dbg_inst_header = R"(
-%dbg_src = OpExtInst %void %DbgExt DebugSource %src %code
-%comp_unit = OpExtInst %void %DbgExt DebugCompilationUnit 2 4 %dbg_src HLSL
-%float_info = OpExtInst %void %DbgExt DebugTypeBasic %float_name %int_32 Float
-%vfloat_info = OpExtInst %void %DbgExt DebugTypeVector %float_info 4
-)";
-
-  const std::string extension = R"(
-%DbgExt = OpExtInstImport "OpenCL.DebugInfo.100"
-)";
-
-  CompileSuccessfully(GenerateShaderCodeForDebugInfo(
-      src, size_const, dbg_inst_header, "", extension, "Vertex"));
-  ASSERT_EQ(SPV_SUCCESS, ValidateInstructions());
-}
-
-TEST_F(ValidateOpenCL100DebugInfo, DebugTypeVectorFail) {
-  const std::string src = R"(
-%src = OpString "simple.hlsl"
-%code = OpString "main() {}"
-%float_name = OpString "float"
-)";
-
-  const std::string size_const = R"(
-%int_32 = OpConstant %u32 32
-)";
-
-  const std::string dbg_inst_header = R"(
-%dbg_src = OpExtInst %void %DbgExt DebugSource %src %code
-%comp_unit = OpExtInst %void %DbgExt DebugCompilationUnit 2 4 %dbg_src HLSL
-%float_info = OpExtInst %void %DbgExt DebugTypeBasic %float_name %int_32 Float
-%vfloat_info = OpExtInst %void %DbgExt DebugTypeVector %dbg_src 4
-)";
-
-  const std::string extension = R"(
-%DbgExt = OpExtInstImport "OpenCL.DebugInfo.100"
-)";
-
-  CompileSuccessfully(GenerateShaderCodeForDebugInfo(
-      src, size_const, dbg_inst_header, "", extension, "Vertex"));
-  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
-  EXPECT_THAT(getDiagnosticString(),
-              HasSubstr("expected operand Base Type must be a result id of "
-                        "DebugTypeBasic"));
-}
-
-TEST_F(ValidateOpenCL100DebugInfo, DebugTypeVectorFailComponentZero) {
-  const std::string src = R"(
-%src = OpString "simple.hlsl"
-%code = OpString "main() {}"
-%float_name = OpString "float"
-)";
-
-  const std::string size_const = R"(
-%int_32 = OpConstant %u32 32
-)";
-
-  const std::string dbg_inst_header = R"(
-%dbg_src = OpExtInst %void %DbgExt DebugSource %src %code
-%comp_unit = OpExtInst %void %DbgExt DebugCompilationUnit 2 4 %dbg_src HLSL
-%float_info = OpExtInst %void %DbgExt DebugTypeBasic %float_name %int_32 Float
-%vfloat_info = OpExtInst %void %DbgExt DebugTypeVector %dbg_src 0
-)";
-
-  const std::string extension = R"(
-%DbgExt = OpExtInstImport "OpenCL.DebugInfo.100"
-)";
-
-  CompileSuccessfully(GenerateShaderCodeForDebugInfo(
-      src, size_const, dbg_inst_header, "", extension, "Vertex"));
-  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
-  EXPECT_THAT(getDiagnosticString(),
-              HasSubstr("expected operand Base Type must be a result id of "
-                        "DebugTypeBasic"));
-}
-
-TEST_F(ValidateOpenCL100DebugInfo, DebugTypeVectorFailComponentFive) {
-  const std::string src = R"(
-%src = OpString "simple.hlsl"
-%code = OpString "main() {}"
-%float_name = OpString "float"
-)";
-
-  const std::string size_const = R"(
-%int_32 = OpConstant %u32 32
-)";
-
-  const std::string dbg_inst_header = R"(
-%dbg_src = OpExtInst %void %DbgExt DebugSource %src %code
-%comp_unit = OpExtInst %void %DbgExt DebugCompilationUnit 2 4 %dbg_src HLSL
-%float_info = OpExtInst %void %DbgExt DebugTypeBasic %float_name %int_32 Float
-%vfloat_info = OpExtInst %void %DbgExt DebugTypeVector %dbg_src 5
-)";
-
-  const std::string extension = R"(
-%DbgExt = OpExtInstImport "OpenCL.DebugInfo.100"
-)";
-
-  CompileSuccessfully(GenerateShaderCodeForDebugInfo(
-      src, size_const, dbg_inst_header, "", extension, "Vertex"));
-  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
-  EXPECT_THAT(getDiagnosticString(),
-              HasSubstr("expected operand Base Type must be a result id of "
-                        "DebugTypeBasic"));
-}
-
-TEST_F(ValidateOpenCL100DebugInfo, DebugTypedef) {
-  const std::string src = R"(
-%src = OpString "simple.hlsl"
-%code = OpString "main() {}"
-%float_name = OpString "float"
-%foo_name = OpString "foo"
-)";
-
-  const std::string size_const = R"(
-%int_32 = OpConstant %u32 32
-)";
-
-  const std::string dbg_inst_header = R"(
-%dbg_src = OpExtInst %void %DbgExt DebugSource %src %code
-%comp_unit = OpExtInst %void %DbgExt DebugCompilationUnit 2 4 %dbg_src HLSL
-%float_info = OpExtInst %void %DbgExt DebugTypeBasic %float_name %int_32 Float
-%foo_info = OpExtInst %void %DbgExt DebugTypedef %foo_name %float_info %dbg_src 1 1 %comp_unit
-)";
-
-  const std::string extension = R"(
-%DbgExt = OpExtInstImport "OpenCL.DebugInfo.100"
-)";
-
-  CompileSuccessfully(GenerateShaderCodeForDebugInfo(
-      src, size_const, dbg_inst_header, "", extension, "Vertex"));
-  ASSERT_EQ(SPV_SUCCESS, ValidateInstructions());
-}
-
-TEST_P(ValidateOpenCL100DebugInfoDebugTypedef, Fail) {
-  const std::string src = R"(
-%src = OpString "simple.hlsl"
-%code = OpString "main() {}"
-%float_name = OpString "float"
-%foo_name = OpString "foo"
-)";
-
-  const std::string size_const = R"(
-%int_32 = OpConstant %u32 32
-)";
-
-  const auto& param = GetParam();
-
-  std::ostringstream ss;
-  ss << R"(
-%dbg_src = OpExtInst %void %DbgExt DebugSource %src %code
-%comp_unit = OpExtInst %void %DbgExt DebugCompilationUnit 2 4 %dbg_src HLSL
-%float_info = OpExtInst %void %DbgExt DebugTypeBasic %float_name %int_32 Float
-%foo_info = OpExtInst %void %DbgExt DebugTypedef )";
-  ss << param.first;
-
-  const std::string extension = R"(
-%DbgExt = OpExtInstImport "OpenCL.DebugInfo.100"
-)";
-
-  CompileSuccessfully(GenerateShaderCodeForDebugInfo(src, size_const, ss.str(),
-                                                     "", extension, "Vertex"));
-  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
-  EXPECT_THAT(getDiagnosticString(),
-              HasSubstr("expected operand " + param.second +
-                        " must be a result id of "));
-}
-
-INSTANTIATE_TEST_SUITE_P(
-    AllOpenCL100DebugInfoFail, ValidateOpenCL100DebugInfoDebugTypedef,
-    ::testing::ValuesIn(std::vector<std::pair<std::string, std::string>>{
-        std::make_pair(R"(%dbg_src %float_info %dbg_src 1 1 %comp_unit)",
-                       "Name"),
-        std::make_pair(R"(%foo_name %dbg_src %dbg_src 1 1 %comp_unit)",
-                       "Base Type"),
-        std::make_pair(R"(%foo_name %float_info %comp_unit 1 1 %comp_unit)",
-                       "Source"),
-        std::make_pair(R"(%foo_name %float_info %dbg_src 1 1 %dbg_src)",
-                       "Parent"),
-    }));
-
-TEST_F(ValidateOpenCL100DebugInfo, DebugTypeFunction) {
-  const std::string src = R"(
-%src = OpString "simple.hlsl"
-%code = OpString "main() {}"
-%main_name = OpString "main"
-%main_linkage_name = OpString "v_main"
-%float_name = OpString "float"
-)";
-
-  const std::string size_const = R"(
-%int_32 = OpConstant %u32 32
-)";
-
-  const std::string dbg_inst_header = R"(
-%dbg_src = OpExtInst %void %DbgExt DebugSource %src %code
-%comp_unit = OpExtInst %void %DbgExt DebugCompilationUnit 2 4 %dbg_src HLSL
-%float_info = OpExtInst %void %DbgExt DebugTypeBasic %float_name %int_32 Float
-%main_type_info1 = OpExtInst %void %DbgExt DebugTypeFunction FlagIsPublic %void
-%main_type_info2 = OpExtInst %void %DbgExt DebugTypeFunction FlagIsPublic %float_info
-%main_type_info3 = OpExtInst %void %DbgExt DebugTypeFunction FlagIsPublic %float_info %float_info
-%main_type_info4 = OpExtInst %void %DbgExt DebugTypeFunction FlagIsPublic %void %float_info %float_info
-)";
-
-  const std::string extension = R"(
-%DbgExt = OpExtInstImport "OpenCL.DebugInfo.100"
-)";
-
-  CompileSuccessfully(GenerateShaderCodeForDebugInfo(
-      src, size_const, dbg_inst_header, "", extension, "Vertex"));
-  ASSERT_EQ(SPV_SUCCESS, ValidateInstructions());
-}
-
-TEST_F(ValidateOpenCL100DebugInfo, DebugTypeFunctionFailReturn) {
-  const std::string src = R"(
-%src = OpString "simple.hlsl"
-%code = OpString "main() {}"
-%main_name = OpString "main"
-%main_linkage_name = OpString "v_main"
-%float_name = OpString "float"
-)";
-
-  const std::string size_const = R"(
-%int_32 = OpConstant %u32 32
-)";
-
-  const std::string dbg_inst_header = R"(
-%dbg_src = OpExtInst %void %DbgExt DebugSource %src %code
-%comp_unit = OpExtInst %void %DbgExt DebugCompilationUnit 2 4 %dbg_src HLSL
-%float_info = OpExtInst %void %DbgExt DebugTypeBasic %float_name %int_32 Float
-%main_type_info = OpExtInst %void %DbgExt DebugTypeFunction FlagIsPublic %dbg_src %float_info
-)";
-
-  const std::string extension = R"(
-%DbgExt = OpExtInstImport "OpenCL.DebugInfo.100"
-)";
-
-  CompileSuccessfully(GenerateShaderCodeForDebugInfo(
-      src, size_const, dbg_inst_header, "", extension, "Vertex"));
-  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
-  EXPECT_THAT(
-      getDiagnosticString(),
-      HasSubstr("expected operand Return Type is not a valid debug type"));
-}
-
-TEST_F(ValidateOpenCL100DebugInfo, DebugTypeFunctionFailParam) {
-  const std::string src = R"(
-%src = OpString "simple.hlsl"
-%code = OpString "main() {}"
-%main_name = OpString "main"
-%main_linkage_name = OpString "v_main"
-%float_name = OpString "float"
-)";
-
-  const std::string size_const = R"(
-%int_32 = OpConstant %u32 32
-)";
-
-  const std::string dbg_inst_header = R"(
-%dbg_src = OpExtInst %void %DbgExt DebugSource %src %code
-%comp_unit = OpExtInst %void %DbgExt DebugCompilationUnit 2 4 %dbg_src HLSL
-%float_info = OpExtInst %void %DbgExt DebugTypeBasic %float_name %int_32 Float
-%main_type_info = OpExtInst %void %DbgExt DebugTypeFunction FlagIsPublic %float_info %void
-)";
-
-  const std::string extension = R"(
-%DbgExt = OpExtInstImport "OpenCL.DebugInfo.100"
-)";
-
-  CompileSuccessfully(GenerateShaderCodeForDebugInfo(
-      src, size_const, dbg_inst_header, "", extension, "Vertex"));
-  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
-  EXPECT_THAT(
-      getDiagnosticString(),
-      HasSubstr("expected operand Parameter Types is not a valid debug type"));
-}
-
-TEST_F(ValidateOpenCL100DebugInfo, DebugTypeEnum) {
-  const std::string src = R"(
-%src = OpString "simple.hlsl"
-%code = OpString "main() {}"
-%float_name = OpString "float"
-%foo_name = OpString "foo"
-)";
-
-  const std::string size_const = R"(
-%int_32 = OpConstant %u32 32
-)";
-
-  const std::string dbg_inst_header = R"(
-%dbg_src = OpExtInst %void %DbgExt DebugSource %src %code
-%comp_unit = OpExtInst %void %DbgExt DebugCompilationUnit 2 4 %dbg_src HLSL
-%none = OpExtInst %void %DbgExt DebugInfoNone
-%float_info = OpExtInst %void %DbgExt DebugTypeBasic %float_name %int_32 Float
-%foo_info1 = OpExtInst %void %DbgExt DebugTypeEnum %foo_name %float_info %dbg_src 1 1 %comp_unit %int_32 FlagIsPublic %u32_0 %foo_name %u32_1 %foo_name
-%foo_info2 = OpExtInst %void %DbgExt DebugTypeEnum %foo_name %none %dbg_src 1 1 %comp_unit %int_32 FlagIsPublic %u32_0 %foo_name %u32_1 %foo_name
-%foo_info3 = OpExtInst %void %DbgExt DebugTypeEnum %foo_name %none %dbg_src 1 1 %comp_unit %int_32 FlagIsPublic
-)";
-
-  const std::string extension = R"(
-%DbgExt = OpExtInstImport "OpenCL.DebugInfo.100"
-)";
-
-  CompileSuccessfully(GenerateShaderCodeForDebugInfo(
-      src, size_const, dbg_inst_header, "", extension, "Vertex"));
-  ASSERT_EQ(SPV_SUCCESS, ValidateInstructions());
-}
-
-TEST_P(ValidateOpenCL100DebugInfoDebugTypeEnum, Fail) {
-  const std::string src = R"(
-%src = OpString "simple.hlsl"
-%code = OpString "main() {}"
-%float_name = OpString "float"
-%foo_name = OpString "foo"
-)";
-
-  const std::string size_const = R"(
-%int_32 = OpConstant %u32 32
-)";
-
-  const auto& param = GetParam();
-
-  std::ostringstream ss;
-  ss << R"(
-%dbg_src = OpExtInst %void %DbgExt DebugSource %src %code
-%comp_unit = OpExtInst %void %DbgExt DebugCompilationUnit 2 4 %dbg_src HLSL
-%float_info = OpExtInst %void %DbgExt DebugTypeBasic %float_name %int_32 Float
-%foo_info = OpExtInst %void %DbgExt DebugTypeEnum )";
-  ss << param.first;
-
-  const std::string extension = R"(
-%DbgExt = OpExtInstImport "OpenCL.DebugInfo.100"
-)";
-
-  CompileSuccessfully(GenerateShaderCodeForDebugInfo(src, size_const, ss.str(),
-                                                     "", extension, "Vertex"));
-  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
-  EXPECT_THAT(getDiagnosticString(),
-              HasSubstr("expected operand " + param.second));
-}
-
-INSTANTIATE_TEST_SUITE_P(
-    AllOpenCL100DebugInfoFail, ValidateOpenCL100DebugInfoDebugTypeEnum,
-    ::testing::ValuesIn(std::vector<std::pair<std::string, std::string>>{
-        std::make_pair(
-            R"(%dbg_src %float_info %dbg_src 1 1 %comp_unit %int_32 FlagIsPublic %u32_0 %foo_name)",
-            "Name"),
-        std::make_pair(
-            R"(%foo_name %dbg_src %dbg_src 1 1 %comp_unit %int_32 FlagIsPublic %u32_0 %foo_name)",
-            "Underlying Types"),
-        std::make_pair(
-            R"(%foo_name %float_info %comp_unit 1 1 %comp_unit %int_32 FlagIsPublic %u32_0 %foo_name)",
-            "Source"),
-        std::make_pair(
-            R"(%foo_name %float_info %dbg_src 1 1 %dbg_src %int_32 FlagIsPublic %u32_0 %foo_name)",
-            "Parent"),
-        std::make_pair(
-            R"(%foo_name %float_info %dbg_src 1 1 %comp_unit %void FlagIsPublic %u32_0 %foo_name)",
-            "Size"),
-        std::make_pair(
-            R"(%foo_name %float_info %dbg_src 1 1 %comp_unit %u32_0 FlagIsPublic %u32_0 %foo_name)",
-            "Size"),
-        std::make_pair(
-            R"(%foo_name %float_info %dbg_src 1 1 %comp_unit %int_32 FlagIsPublic %foo_name %foo_name)",
-            "Value"),
-        std::make_pair(
-            R"(%foo_name %float_info %dbg_src 1 1 %comp_unit %int_32 FlagIsPublic %u32_0 %u32_1)",
-            "Name"),
-    }));
-
-TEST_F(ValidateOpenCL100DebugInfo, DebugTypeCompositeFunctionAndInheritance) {
-  const std::string src = R"(
-%src = OpString "simple.hlsl"
-%code = OpString "struct VS_OUTPUT {
-  float4 pos : SV_POSITION;
-};
-struct foo : VS_OUTPUT {
-};
-main() {}
-"
-%VS_OUTPUT_name = OpString "struct VS_OUTPUT"
-%float_name = OpString "float"
-%foo_name = OpString "foo"
-%VS_OUTPUT_pos_name = OpString "pos : SV_POSITION"
-%VS_OUTPUT_linkage_name = OpString "VS_OUTPUT"
-%main_name = OpString "main"
-%main_linkage_name = OpString "v4f_main_f"
-)";
-
-  const std::string size_const = R"(
-%int_32 = OpConstant %u32 32
-%int_128 = OpConstant %u32 128
-)";
-
-  const std::string dbg_inst_header = R"(
-%dbg_src = OpExtInst %void %DbgExt DebugSource %src %code
-%comp_unit = OpExtInst %void %DbgExt DebugCompilationUnit 2 4 %dbg_src HLSL
-%VS_OUTPUT_info = OpExtInst %void %DbgExt DebugTypeComposite %VS_OUTPUT_name Structure %dbg_src 1 1 %comp_unit %VS_OUTPUT_linkage_name %int_128 FlagIsPublic %VS_OUTPUT_pos_info %main_info %child
-%float_info = OpExtInst %void %DbgExt DebugTypeBasic %float_name %int_32 Float
-%v4float_info = OpExtInst %void %DbgExt DebugTypeVector %float_info 4
-%VS_OUTPUT_pos_info = OpExtInst %void %DbgExt DebugTypeMember %VS_OUTPUT_pos_name %v4float_info %dbg_src 2 3 %VS_OUTPUT_info %u32_0 %int_128 FlagIsPublic
-%main_type_info = OpExtInst %void %DbgExt DebugTypeFunction FlagIsPublic %v4float_info %float_info
-%main_info = OpExtInst %void %DbgExt DebugFunction %main_name %main_type_info %dbg_src 12 1 %comp_unit %main_linkage_name FlagIsPublic 13 %main
-%foo_info = OpExtInst %void %DbgExt DebugTypeComposite %foo_name Structure %dbg_src 1 1 %comp_unit %foo_name %u32_0 FlagIsPublic
-%child = OpExtInst %void %DbgExt DebugTypeInheritance %foo_info %VS_OUTPUT_info %int_128 %int_128 FlagIsPublic
-)";
-
-  const std::string extension = R"(
-%DbgExt = OpExtInstImport "OpenCL.DebugInfo.100"
-)";
-
-  CompileSuccessfully(GenerateShaderCodeForDebugInfo(
-      src, size_const, dbg_inst_header, "", extension, "Vertex"));
-  ASSERT_EQ(SPV_SUCCESS, ValidateInstructions());
-}
-
-TEST_P(ValidateOpenCL100DebugInfoDebugTypeComposite, Fail) {
-  const std::string src = R"(
-%src = OpString "simple.hlsl"
-%code = OpString "struct VS_OUTPUT {
-  float4 pos : SV_POSITION;
-};
-struct foo : VS_OUTPUT {
-};
-main() {}
-"
-%VS_OUTPUT_name = OpString "struct VS_OUTPUT"
-%float_name = OpString "float"
-%foo_name = OpString "foo"
-%VS_OUTPUT_pos_name = OpString "pos : SV_POSITION"
-%VS_OUTPUT_linkage_name = OpString "VS_OUTPUT"
-%main_name = OpString "main"
-%main_linkage_name = OpString "v4f_main_f"
-)";
-
-  const std::string size_const = R"(
-%int_32 = OpConstant %u32 32
-%int_128 = OpConstant %u32 128
-)";
-
-  const auto& param = GetParam();
-
-  std::ostringstream ss;
-  ss << R"(
-%dbg_src = OpExtInst %void %DbgExt DebugSource %src %code
-%comp_unit = OpExtInst %void %DbgExt DebugCompilationUnit 2 4 %dbg_src HLSL
-%VS_OUTPUT_info = OpExtInst %void %DbgExt DebugTypeComposite )";
-  ss << param.first;
-  ss << R"(
-%float_info = OpExtInst %void %DbgExt DebugTypeBasic %float_name %int_32 Float
-%v4float_info = OpExtInst %void %DbgExt DebugTypeVector %float_info 4
-%VS_OUTPUT_pos_info = OpExtInst %void %DbgExt DebugTypeMember %VS_OUTPUT_pos_name %v4float_info %dbg_src 2 3 %VS_OUTPUT_info %u32_0 %int_128 FlagIsPublic
-%main_type_info = OpExtInst %void %DbgExt DebugTypeFunction FlagIsPublic %v4float_info %float_info
-%main_info = OpExtInst %void %DbgExt DebugFunction %main_name %main_type_info %dbg_src 12 1 %comp_unit %main_linkage_name FlagIsPublic 13 %main
-%foo_info = OpExtInst %void %DbgExt DebugTypeComposite %foo_name Structure %dbg_src 1 1 %comp_unit %foo_name %u32_0 FlagIsPublic
-%child = OpExtInst %void %DbgExt DebugTypeInheritance %foo_info %VS_OUTPUT_info %int_128 %int_128 FlagIsPublic
-)";
-
-  const std::string extension = R"(
-%DbgExt = OpExtInstImport "OpenCL.DebugInfo.100"
-)";
-
-  CompileSuccessfully(GenerateShaderCodeForDebugInfo(src, size_const, ss.str(),
-                                                     "", extension, "Vertex"));
-  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
-  EXPECT_THAT(getDiagnosticString(),
-              HasSubstr("expected operand " + param.second + " must be "));
-}
-
-INSTANTIATE_TEST_SUITE_P(
-    AllOpenCL100DebugInfoFail, ValidateOpenCL100DebugInfoDebugTypeComposite,
-    ::testing::ValuesIn(std::vector<std::pair<std::string, std::string>>{
-        std::make_pair(
-            R"(%dbg_src Structure %dbg_src 1 1 %comp_unit %VS_OUTPUT_linkage_name %int_128 FlagIsPublic %VS_OUTPUT_pos_info %main_info %child)",
-            "Name"),
-        std::make_pair(
-            R"(%VS_OUTPUT_name Structure %comp_unit 1 1 %comp_unit %VS_OUTPUT_linkage_name %int_128 FlagIsPublic %VS_OUTPUT_pos_info %main_info %child)",
-            "Source"),
-        std::make_pair(
-            R"(%VS_OUTPUT_name Structure %dbg_src 1 1 %dbg_src %VS_OUTPUT_linkage_name %int_128 FlagIsPublic %VS_OUTPUT_pos_info %main_info %child)",
-            "Parent"),
-        std::make_pair(
-            R"(%VS_OUTPUT_name Structure %dbg_src 1 1 %comp_unit %int_128 %int_128 FlagIsPublic %VS_OUTPUT_pos_info %main_info %child)",
-            "Linkage Name"),
-        std::make_pair(
-            R"(%VS_OUTPUT_name Structure %dbg_src 1 1 %comp_unit %VS_OUTPUT_linkage_name %dbg_src FlagIsPublic %VS_OUTPUT_pos_info %main_info %child)",
-            "Size"),
-        std::make_pair(
-            R"(%VS_OUTPUT_name Structure %dbg_src 1 1 %comp_unit %VS_OUTPUT_linkage_name %int_128 FlagIsPublic %dbg_src %main_info %child)",
-            "Members"),
-        std::make_pair(
-            R"(%VS_OUTPUT_name Structure %dbg_src 1 1 %comp_unit %VS_OUTPUT_linkage_name %int_128 FlagIsPublic %VS_OUTPUT_pos_info %dbg_src %child)",
-            "Members"),
-        std::make_pair(
-            R"(%VS_OUTPUT_name Structure %dbg_src 1 1 %comp_unit %VS_OUTPUT_linkage_name %int_128 FlagIsPublic %VS_OUTPUT_pos_info %main_info %dbg_src)",
-            "Members"),
-    }));
-
-TEST_P(ValidateOpenCL100DebugInfoDebugTypeMember, Fail) {
-  const std::string src = R"(
-%src = OpString "simple.hlsl"
-%code = OpString "struct VS_OUTPUT {
-  float pos : SV_POSITION;
-};
-main() {}
-"
-%VS_OUTPUT_name = OpString "struct VS_OUTPUT"
-%float_name = OpString "float"
-%VS_OUTPUT_pos_name = OpString "pos : SV_POSITION"
-%VS_OUTPUT_linkage_name = OpString "VS_OUTPUT"
-)";
-
-  const std::string size_const = R"(
-%int_32 = OpConstant %u32 32
-)";
-
-  const auto& param = GetParam();
-
-  std::ostringstream ss;
-  ss << R"(
-%dbg_src = OpExtInst %void %DbgExt DebugSource %src %code
-%comp_unit = OpExtInst %void %DbgExt DebugCompilationUnit 2 4 %dbg_src HLSL
-%VS_OUTPUT_info = OpExtInst %void %DbgExt DebugTypeComposite %VS_OUTPUT_name Structure %dbg_src 1 1 %comp_unit %VS_OUTPUT_linkage_name %int_32 FlagIsPublic %VS_OUTPUT_pos_info
-%float_info = OpExtInst %void %DbgExt DebugTypeBasic %float_name %int_32 Float
-%VS_OUTPUT_pos_info = OpExtInst %void %DbgExt DebugTypeMember )";
-  ss << param.first;
-
-  const std::string extension = R"(
-%DbgExt = OpExtInstImport "OpenCL.DebugInfo.100"
-)";
-
-  CompileSuccessfully(GenerateShaderCodeForDebugInfo(src, size_const, ss.str(),
-                                                     "", extension, "Vertex"));
-  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
-  if (!param.second.empty()) {
-    EXPECT_THAT(getDiagnosticString(),
-                HasSubstr("expected operand " + param.second +
-                          " must be a result id of "));
-  }
-}
-
-INSTANTIATE_TEST_SUITE_P(
-    AllOpenCL100DebugInfoFail, ValidateOpenCL100DebugInfoDebugTypeMember,
-    ::testing::ValuesIn(std::vector<std::pair<std::string, std::string>>{
-        std::make_pair(
-            R"(%dbg_src %float_info %dbg_src 2 3 %VS_OUTPUT_info %u32_0 %int_32 FlagIsPublic)",
-            "Name"),
-        std::make_pair(
-            R"(%VS_OUTPUT_pos_name %dbg_src %dbg_src 2 3 %VS_OUTPUT_info %u32_0 %int_32 FlagIsPublic)",
-            ""),
-        std::make_pair(
-            R"(%VS_OUTPUT_pos_name %float_info %float_info 2 3 %VS_OUTPUT_info %u32_0 %int_32 FlagIsPublic)",
-            "Source"),
-        std::make_pair(
-            R"(%VS_OUTPUT_pos_name %float_info %dbg_src 2 3 %float_info %u32_0 %int_32 FlagIsPublic)",
-            "Parent"),
-        std::make_pair(
-            R"(%VS_OUTPUT_pos_name %float_info %dbg_src 2 3 %VS_OUTPUT_info %void %int_32 FlagIsPublic)",
-            "Offset"),
-        std::make_pair(
-            R"(%VS_OUTPUT_pos_name %float_info %dbg_src 2 3 %VS_OUTPUT_info %u32_0 %void FlagIsPublic)",
-            "Size"),
-    }));
-
-TEST_P(ValidateOpenCL100DebugInfoDebugTypeInheritance, Fail) {
-  const std::string src = R"(
-%src = OpString "simple.hlsl"
-%code = OpString "struct VS_OUTPUT {};
-struct foo : VS_OUTPUT {};
-"
-%VS_OUTPUT_name = OpString "struct VS_OUTPUT"
-%foo_name = OpString "foo"
-)";
-
-  const auto& param = GetParam();
-
-  std::ostringstream ss;
-  ss << R"(
-%dbg_src = OpExtInst %void %DbgExt DebugSource %src %code
-%comp_unit = OpExtInst %void %DbgExt DebugCompilationUnit 2 4 %dbg_src HLSL
-%VS_OUTPUT_info = OpExtInst %void %DbgExt DebugTypeComposite %VS_OUTPUT_name Structure %dbg_src 1 1 %comp_unit %VS_OUTPUT_name %u32_0 FlagIsPublic %child
-%foo_info = OpExtInst %void %DbgExt DebugTypeComposite %foo_name Structure %dbg_src 1 1 %comp_unit %foo_name %u32_0 FlagIsPublic
-%bar_info = OpExtInst %void %DbgExt DebugTypeComposite %foo_name Union %dbg_src 1 1 %comp_unit %foo_name %u32_0 FlagIsPublic
-%child = OpExtInst %void %DbgExt DebugTypeInheritance )"
-     << param.first;
-
-  const std::string extension = R"(
-%DbgExt = OpExtInstImport "OpenCL.DebugInfo.100"
-)";
-
-  CompileSuccessfully(GenerateShaderCodeForDebugInfo(src, "", ss.str(), "",
-                                                     extension, "Vertex"));
-  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
-  EXPECT_THAT(getDiagnosticString(),
-              HasSubstr("expected operand " + param.second));
-}
-
-INSTANTIATE_TEST_SUITE_P(
-    AllOpenCL100DebugInfoFail, ValidateOpenCL100DebugInfoDebugTypeInheritance,
-    ::testing::ValuesIn(std::vector<std::pair<std::string, std::string>>{
-        std::make_pair(R"(%dbg_src %VS_OUTPUT_info %u32_0 %u32_0 FlagIsPublic)",
-                       "Child must be a result id of"),
-        std::make_pair(R"(%foo_info %dbg_src %u32_0 %u32_0 FlagIsPublic)",
-                       "Parent must be a result id of"),
-        std::make_pair(
-            R"(%bar_info %VS_OUTPUT_info %u32_0 %u32_0 FlagIsPublic)",
-            "Child must be class or struct debug type"),
-        std::make_pair(R"(%foo_info %bar_info %u32_0 %u32_0 FlagIsPublic)",
-                       "Parent must be class or struct debug type"),
-        std::make_pair(R"(%foo_info %VS_OUTPUT_info %void %u32_0 FlagIsPublic)",
-                       "Offset"),
-        std::make_pair(R"(%foo_info %VS_OUTPUT_info %u32_0 %void FlagIsPublic)",
-                       "Size"),
-    }));
 TEST_P(ValidateGlslStd450SqrtLike, Success) {
   const std::string ext_inst_name = GetParam();
   std::ostringstream ss;
@@ -2178,1086 +472,6 @@
   ASSERT_EQ(SPV_SUCCESS, ValidateInstructions());
 }
 
-TEST_F(ValidateOpenCL100DebugInfo, DebugFunctionDeclaration) {
-  const std::string src = R"(
-%src = OpString "simple.hlsl"
-%code = OpString "struct VS_OUTPUT {
-  float4 pos : SV_POSITION;
-};
-main() {}
-"
-%main_name = OpString "main"
-%main_linkage_name = OpString "v4f_main_f"
-)";
-
-  const std::string dbg_inst_header = R"(
-%dbg_src = OpExtInst %void %DbgExt DebugSource %src %code
-%comp_unit = OpExtInst %void %DbgExt DebugCompilationUnit 2 4 %dbg_src HLSL
-%main_type_info = OpExtInst %void %DbgExt DebugTypeFunction FlagIsPublic %void
-%main_decl = OpExtInst %void %DbgExt DebugFunctionDeclaration %main_name %main_type_info %dbg_src 12 1 %comp_unit %main_linkage_name FlagIsPublic
-%main_info = OpExtInst %void %DbgExt DebugFunction %main_name %main_type_info %dbg_src 12 1 %comp_unit %main_linkage_name FlagIsPublic 13 %main)";
-
-  const std::string extension = R"(
-%DbgExt = OpExtInstImport "OpenCL.DebugInfo.100"
-)";
-
-  CompileSuccessfully(GenerateShaderCodeForDebugInfo(src, "", dbg_inst_header,
-                                                     "", extension, "Vertex"));
-  ASSERT_EQ(SPV_SUCCESS, ValidateInstructions());
-}
-
-TEST_P(ValidateOpenCL100DebugInfoDebugFunction, Fail) {
-  const std::string src = R"(
-%src = OpString "simple.hlsl"
-%code = OpString "struct VS_OUTPUT {
-  float4 pos : SV_POSITION;
-};
-main() {}
-"
-%main_name = OpString "main"
-%main_linkage_name = OpString "v4f_main_f"
-)";
-
-  const auto& param = GetParam();
-
-  std::ostringstream ss;
-  ss << R"(
-%dbg_src = OpExtInst %void %DbgExt DebugSource %src %code
-%comp_unit = OpExtInst %void %DbgExt DebugCompilationUnit 2 4 %dbg_src HLSL
-%main_type_info = OpExtInst %void %DbgExt DebugTypeFunction FlagIsPublic %void
-%main_decl = OpExtInst %void %DbgExt DebugFunctionDeclaration %main_name %main_type_info %dbg_src 12 1 %comp_unit %main_linkage_name FlagIsPublic
-%main_info = OpExtInst %void %DbgExt DebugFunction )"
-     << param.first;
-
-  const std::string extension = R"(
-%DbgExt = OpExtInstImport "OpenCL.DebugInfo.100"
-)";
-
-  CompileSuccessfully(GenerateShaderCodeForDebugInfo(src, "", ss.str(), "",
-                                                     extension, "Vertex"));
-  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
-  EXPECT_THAT(getDiagnosticString(),
-              HasSubstr("expected operand " + param.second));
-}
-
-INSTANTIATE_TEST_SUITE_P(
-    AllOpenCL100DebugInfoFail, ValidateOpenCL100DebugInfoDebugFunction,
-    ::testing::ValuesIn(std::vector<std::pair<std::string, std::string>>{
-        std::make_pair(
-            R"(%u32_0 %main_type_info %dbg_src 12 1 %comp_unit %main_linkage_name FlagIsPublic 13 %main)",
-            "Name"),
-        std::make_pair(
-            R"(%main_name %dbg_src %dbg_src 12 1 %comp_unit %main_linkage_name FlagIsPublic 13 %main)",
-            "Type"),
-        std::make_pair(
-            R"(%main_name %main_type_info %comp_unit 12 1 %comp_unit %main_linkage_name FlagIsPublic 13 %main)",
-            "Source"),
-        std::make_pair(
-            R"(%main_name %main_type_info %dbg_src 12 1 %dbg_src %main_linkage_name FlagIsPublic 13 %main)",
-            "Parent"),
-        std::make_pair(
-            R"(%main_name %main_type_info %dbg_src 12 1 %comp_unit %void FlagIsPublic 13 %main)",
-            "Linkage Name"),
-        std::make_pair(
-            R"(%main_name %main_type_info %dbg_src 12 1 %comp_unit %main_linkage_name FlagIsPublic 13 %void)",
-            "Function"),
-        std::make_pair(
-            R"(%main_name %main_type_info %dbg_src 12 1 %comp_unit %main_linkage_name FlagIsPublic 13 %main %dbg_src)",
-            "Declaration"),
-    }));
-
-TEST_P(ValidateOpenCL100DebugInfoDebugFunctionDeclaration, Fail) {
-  const std::string src = R"(
-%src = OpString "simple.hlsl"
-%code = OpString "struct VS_OUTPUT {
-  float4 pos : SV_POSITION;
-};
-main() {}
-"
-%main_name = OpString "main"
-%main_linkage_name = OpString "v4f_main_f"
-)";
-
-  const auto& param = GetParam();
-
-  std::ostringstream ss;
-  ss << R"(
-%dbg_src = OpExtInst %void %DbgExt DebugSource %src %code
-%comp_unit = OpExtInst %void %DbgExt DebugCompilationUnit 2 4 %dbg_src HLSL
-%main_type_info = OpExtInst %void %DbgExt DebugTypeFunction FlagIsPublic %void
-%main_decl = OpExtInst %void %DbgExt DebugFunctionDeclaration )"
-     << param.first;
-
-  const std::string extension = R"(
-%DbgExt = OpExtInstImport "OpenCL.DebugInfo.100"
-)";
-
-  CompileSuccessfully(GenerateShaderCodeForDebugInfo(src, "", ss.str(), "",
-                                                     extension, "Vertex"));
-  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
-  EXPECT_THAT(getDiagnosticString(),
-              HasSubstr("expected operand " + param.second));
-}
-
-INSTANTIATE_TEST_SUITE_P(
-    AllOpenCL100DebugInfoFail,
-    ValidateOpenCL100DebugInfoDebugFunctionDeclaration,
-    ::testing::ValuesIn(std::vector<std::pair<std::string, std::string>>{
-        std::make_pair(
-            R"(%u32_0 %main_type_info %dbg_src 12 1 %comp_unit %main_linkage_name FlagIsPublic)",
-            "Name"),
-        std::make_pair(
-            R"(%main_name %dbg_src %dbg_src 12 1 %comp_unit %main_linkage_name FlagIsPublic)",
-            "Type"),
-        std::make_pair(
-            R"(%main_name %main_type_info %comp_unit 12 1 %comp_unit %main_linkage_name FlagIsPublic)",
-            "Source"),
-        std::make_pair(
-            R"(%main_name %main_type_info %dbg_src 12 1 %dbg_src %main_linkage_name FlagIsPublic)",
-            "Parent"),
-        std::make_pair(
-            R"(%main_name %main_type_info %dbg_src 12 1 %comp_unit %void FlagIsPublic)",
-            "Linkage Name"),
-    }));
-
-TEST_F(ValidateOpenCL100DebugInfo, DebugLexicalBlock) {
-  const std::string src = R"(
-%src = OpString "simple.hlsl"
-%code = OpString "main() {}"
-%main_name = OpString "main"
-)";
-
-  const std::string dbg_inst_header = R"(
-%dbg_src = OpExtInst %void %DbgExt DebugSource %src %code
-%comp_unit = OpExtInst %void %DbgExt DebugCompilationUnit 2 4 %dbg_src HLSL
-%main_block = OpExtInst %void %DbgExt DebugLexicalBlock %dbg_src 1 1 %comp_unit %main_name)";
-
-  const std::string extension = R"(
-%DbgExt = OpExtInstImport "OpenCL.DebugInfo.100"
-)";
-
-  CompileSuccessfully(GenerateShaderCodeForDebugInfo(src, "", dbg_inst_header,
-                                                     "", extension, "Vertex"));
-  ASSERT_EQ(SPV_SUCCESS, ValidateInstructions());
-}
-
-TEST_P(ValidateOpenCL100DebugInfoDebugLexicalBlock, Fail) {
-  const std::string src = R"(
-%src = OpString "simple.hlsl"
-%code = OpString "main() {}"
-%main_name = OpString "main"
-)";
-
-  const auto& param = GetParam();
-
-  std::ostringstream ss;
-  ss << R"(
-%dbg_src = OpExtInst %void %DbgExt DebugSource %src %code
-%comp_unit = OpExtInst %void %DbgExt DebugCompilationUnit 2 4 %dbg_src HLSL
-%main_block = OpExtInst %void %DbgExt DebugLexicalBlock )"
-     << param.first;
-
-  const std::string extension = R"(
-%DbgExt = OpExtInstImport "OpenCL.DebugInfo.100"
-)";
-
-  CompileSuccessfully(GenerateShaderCodeForDebugInfo(src, "", ss.str(), "",
-                                                     extension, "Vertex"));
-  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
-  EXPECT_THAT(getDiagnosticString(),
-              HasSubstr("expected operand " + param.second));
-}
-
-INSTANTIATE_TEST_SUITE_P(
-    AllOpenCL100DebugInfoFail, ValidateOpenCL100DebugInfoDebugLexicalBlock,
-    ::testing::ValuesIn(std::vector<std::pair<std::string, std::string>>{
-        std::make_pair(R"(%comp_unit 1 1 %comp_unit %main_name)", "Source"),
-        std::make_pair(R"(%dbg_src 1 1 %dbg_src %main_name)", "Parent"),
-        std::make_pair(R"(%dbg_src 1 1 %comp_unit %void)", "Name"),
-    }));
-
-TEST_F(ValidateOpenCL100DebugInfo, DebugScopeFailScope) {
-  const std::string src = R"(
-%src = OpString "simple.hlsl"
-%code = OpString "void main() {}"
-)";
-
-  const std::string dbg_inst_header = R"(
-%dbg_src = OpExtInst %void %DbgExt DebugSource %src %code
-%comp_unit = OpExtInst %void %DbgExt DebugCompilationUnit 2 4 %dbg_src HLSL
-)";
-
-  const std::string body = R"(
-%main_scope = OpExtInst %void %DbgExt DebugScope %dbg_src
-)";
-
-  const std::string extension = R"(
-%DbgExt = OpExtInstImport "OpenCL.DebugInfo.100"
-)";
-
-  CompileSuccessfully(GenerateShaderCodeForDebugInfo(
-      src, "", dbg_inst_header, body, extension, "Vertex"));
-  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
-  EXPECT_THAT(getDiagnosticString(), HasSubstr("expected operand Scope"));
-}
-
-TEST_F(ValidateOpenCL100DebugInfo, DebugScopeFailInlinedAt) {
-  const std::string src = R"(
-%src = OpString "simple.hlsl"
-%code = OpString "void main() {}"
-)";
-
-  const std::string dbg_inst_header = R"(
-%dbg_src = OpExtInst %void %DbgExt DebugSource %src %code
-%comp_unit = OpExtInst %void %DbgExt DebugCompilationUnit 2 4 %dbg_src HLSL
-)";
-
-  const std::string body = R"(
-%main_scope = OpExtInst %void %DbgExt DebugScope %comp_unit %dbg_src
-)";
-
-  const std::string extension = R"(
-%DbgExt = OpExtInstImport "OpenCL.DebugInfo.100"
-)";
-
-  CompileSuccessfully(GenerateShaderCodeForDebugInfo(
-      src, "", dbg_inst_header, body, extension, "Vertex"));
-  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
-  EXPECT_THAT(getDiagnosticString(), HasSubstr("expected operand Inlined At"));
-}
-
-TEST_F(ValidateOpenCL100DebugInfo, DebugLocalVariable) {
-  const std::string src = R"(
-%src = OpString "simple.hlsl"
-%code = OpString "void main() { float foo; }"
-%float_name = OpString "float"
-%foo_name = OpString "foo"
-)";
-
-  const std::string size_const = R"(
-%int_32 = OpConstant %u32 32
-)";
-
-  const std::string dbg_inst_header = R"(
-%dbg_src = OpExtInst %void %DbgExt DebugSource %src %code
-%comp_unit = OpExtInst %void %DbgExt DebugCompilationUnit 2 4 %dbg_src HLSL
-%float_info = OpExtInst %void %DbgExt DebugTypeBasic %float_name %int_32 Float
-%foo = OpExtInst %void %DbgExt DebugLocalVariable %foo_name %float_info %dbg_src 1 10 %comp_unit FlagIsLocal 0
-)";
-
-  const std::string extension = R"(
-%DbgExt = OpExtInstImport "OpenCL.DebugInfo.100"
-)";
-
-  CompileSuccessfully(GenerateShaderCodeForDebugInfo(
-      src, size_const, dbg_inst_header, "", extension, "Vertex"));
-  ASSERT_EQ(SPV_SUCCESS, ValidateInstructions());
-}
-
-TEST_P(ValidateOpenCL100DebugInfoDebugLocalVariable, Fail) {
-  const std::string src = R"(
-%src = OpString "simple.hlsl"
-%code = OpString "void main() { float foo; }"
-%float_name = OpString "float"
-%foo_name = OpString "foo"
-)";
-
-  const std::string size_const = R"(
-%int_32 = OpConstant %u32 32
-)";
-
-  const auto& param = GetParam();
-
-  std::ostringstream ss;
-  ss << R"(
-%dbg_src = OpExtInst %void %DbgExt DebugSource %src %code
-%comp_unit = OpExtInst %void %DbgExt DebugCompilationUnit 2 4 %dbg_src HLSL
-%float_info = OpExtInst %void %DbgExt DebugTypeBasic %float_name %int_32 Float
-%foo = OpExtInst %void %DbgExt DebugLocalVariable )"
-     << param.first;
-
-  const std::string extension = R"(
-%DbgExt = OpExtInstImport "OpenCL.DebugInfo.100"
-)";
-
-  CompileSuccessfully(GenerateShaderCodeForDebugInfo(src, size_const, ss.str(),
-                                                     "", extension, "Vertex"));
-  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
-  EXPECT_THAT(getDiagnosticString(),
-              HasSubstr("expected operand " + param.second));
-}
-
-INSTANTIATE_TEST_SUITE_P(
-    AllOpenCL100DebugInfoFail, ValidateOpenCL100DebugInfoDebugLocalVariable,
-    ::testing::ValuesIn(std::vector<std::pair<std::string, std::string>>{
-        std::make_pair(
-            R"(%void %float_info %dbg_src 1 10 %comp_unit FlagIsLocal 0)",
-            "Name"),
-        std::make_pair(
-            R"(%foo_name %dbg_src %dbg_src 1 10 %comp_unit FlagIsLocal 0)",
-            "Type"),
-        std::make_pair(
-            R"(%foo_name %float_info %comp_unit 1 10 %comp_unit FlagIsLocal 0)",
-            "Source"),
-        std::make_pair(
-            R"(%foo_name %float_info %dbg_src 1 10 %dbg_src FlagIsLocal 0)",
-            "Parent"),
-    }));
-
-TEST_F(ValidateOpenCL100DebugInfo, DebugDeclare) {
-  const std::string src = R"(
-%src = OpString "simple.hlsl"
-%code = OpString "void main() { float foo; }"
-%float_name = OpString "float"
-%foo_name = OpString "foo"
-)";
-
-  const std::string size_const = R"(
-%int_32 = OpConstant %u32 32
-)";
-
-  const std::string dbg_inst_header = R"(
-%dbg_src = OpExtInst %void %DbgExt DebugSource %src %code
-%comp_unit = OpExtInst %void %DbgExt DebugCompilationUnit 2 4 %dbg_src HLSL
-%null_expr = OpExtInst %void %DbgExt DebugExpression
-%float_info = OpExtInst %void %DbgExt DebugTypeBasic %float_name %int_32 Float
-%foo_info = OpExtInst %void %DbgExt DebugLocalVariable %foo_name %float_info %dbg_src 1 10 %comp_unit FlagIsLocal 0
-)";
-
-  const std::string body = R"(
-%foo = OpVariable %f32_ptr_function Function
-%decl = OpExtInst %void %DbgExt DebugDeclare %foo_info %foo %null_expr
-)";
-
-  const std::string extension = R"(
-%DbgExt = OpExtInstImport "OpenCL.DebugInfo.100"
-)";
-
-  CompileSuccessfully(GenerateShaderCodeForDebugInfo(
-      src, size_const, dbg_inst_header, body, extension, "Vertex"));
-  ASSERT_EQ(SPV_SUCCESS, ValidateInstructions());
-}
-
-TEST_F(ValidateOpenCL100DebugInfo, DebugDeclareParam) {
-  CompileSuccessfully(R"(
-               OpCapability Shader
-          %1 = OpExtInstImport "OpenCL.DebugInfo.100"
-               OpMemoryModel Logical GLSL450
-               OpEntryPoint Vertex %main "main" %in_var_COLOR
-          %4 = OpString "test.hlsl"
-               OpSource HLSL 620 %4 "#line 1 \"test.hlsl\"
-void main(float foo:COLOR) {}
-"
-         %11 = OpString "#line 1 \"test.hlsl\"
-void main(float foo:COLOR) {}
-"
-         %14 = OpString "float"
-         %17 = OpString "src.main"
-         %20 = OpString "foo"
-               OpName %in_var_COLOR "in.var.COLOR"
-               OpName %main "main"
-               OpName %param_var_foo "param.var.foo"
-               OpName %src_main "src.main"
-               OpName %foo "foo"
-               OpName %bb_entry "bb.entry"
-               OpDecorate %in_var_COLOR Location 0
-       %uint = OpTypeInt 32 0
-    %uint_32 = OpConstant %uint 32
-      %float = OpTypeFloat 32
-%_ptr_Input_float = OpTypePointer Input %float
-       %void = OpTypeVoid
-         %23 = OpTypeFunction %void
-%_ptr_Function_float = OpTypePointer Function %float
-         %29 = OpTypeFunction %void %_ptr_Function_float
-               OpLine %4 1 21
-%in_var_COLOR = OpVariable %_ptr_Input_float Input
-         %10 = OpExtInst %void %1 DebugExpression
-         %12 = OpExtInst %void %1 DebugSource %4 %11
-         %13 = OpExtInst %void %1 DebugCompilationUnit 1 4 %12 HLSL
-         %15 = OpExtInst %void %1 DebugTypeBasic %14 %uint_32 Float
-         %16 = OpExtInst %void %1 DebugTypeFunction FlagIsProtected|FlagIsPrivate %void %15
-         %18 = OpExtInst %void %1 DebugFunction %17 %16 %12 1 1 %13 %17 FlagIsProtected|FlagIsPrivate 1 %src_main
-         %21 = OpExtInst %void %1 DebugLocalVariable %20 %15 %12 1 17 %18 FlagIsLocal 0
-         %22 = OpExtInst %void %1 DebugLexicalBlock %12 1 28 %18
-               OpLine %4 1 1
-       %main = OpFunction %void None %23
-         %24 = OpLabel
-               OpLine %4 1 17
-%param_var_foo = OpVariable %_ptr_Function_float Function
-         %27 = OpLoad %float %in_var_COLOR
-               OpLine %4 1 1
-         %28 = OpFunctionCall %void %src_main %param_var_foo
-               OpReturn
-               OpFunctionEnd
-   %src_main = OpFunction %void None %29
-               OpLine %4 1 17
-        %foo = OpFunctionParameter %_ptr_Function_float
-         %31 = OpExtInst %void %1 DebugDeclare %21 %foo %10
-   %bb_entry = OpLabel
-               OpLine %4 1 29
-               OpReturn
-               OpFunctionEnd
-)");
-  ASSERT_EQ(SPV_SUCCESS, ValidateInstructions());
-}
-
-TEST_P(ValidateOpenCL100DebugInfoDebugDeclare, Fail) {
-  const std::string src = R"(
-%src = OpString "simple.hlsl"
-%code = OpString "void main() { float foo; }"
-%float_name = OpString "float"
-%foo_name = OpString "foo"
-)";
-
-  const std::string size_const = R"(
-%int_32 = OpConstant %u32 32
-)";
-
-  const std::string dbg_inst_header = R"(
-%dbg_src = OpExtInst %void %DbgExt DebugSource %src %code
-%comp_unit = OpExtInst %void %DbgExt DebugCompilationUnit 2 4 %dbg_src HLSL
-%null_expr = OpExtInst %void %DbgExt DebugExpression
-%float_info = OpExtInst %void %DbgExt DebugTypeBasic %float_name %int_32 Float
-%foo_info = OpExtInst %void %DbgExt DebugLocalVariable %foo_name %float_info %dbg_src 1 10 %comp_unit FlagIsLocal 0
-)";
-
-  const auto& param = GetParam();
-
-  std::ostringstream ss;
-  ss << R"(
-%foo = OpVariable %f32_ptr_function Function
-%decl = OpExtInst %void %DbgExt DebugDeclare )"
-     << param.first;
-
-  const std::string extension = R"(
-%DbgExt = OpExtInstImport "OpenCL.DebugInfo.100"
-)";
-
-  CompileSuccessfully(GenerateShaderCodeForDebugInfo(
-      src, size_const, dbg_inst_header, ss.str(), extension, "Vertex"));
-  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
-  EXPECT_THAT(getDiagnosticString(),
-              HasSubstr("expected operand " + param.second));
-}
-
-INSTANTIATE_TEST_SUITE_P(
-    AllOpenCL100DebugInfoFail, ValidateOpenCL100DebugInfoDebugDeclare,
-    ::testing::ValuesIn(std::vector<std::pair<std::string, std::string>>{
-        std::make_pair(R"(%dbg_src %foo %null_expr)", "Local Variable"),
-        std::make_pair(R"(%foo_info %void %null_expr)", "Variable"),
-        std::make_pair(R"(%foo_info %foo %dbg_src)", "Expression"),
-    }));
-
-TEST_F(ValidateOpenCL100DebugInfo, DebugExpression) {
-  const std::string dbg_inst_header = R"(
-%op0 = OpExtInst %void %DbgExt DebugOperation Deref
-%op1 = OpExtInst %void %DbgExt DebugOperation Plus
-%null_expr = OpExtInst %void %DbgExt DebugExpression %op0 %op1
-)";
-
-  const std::string extension = R"(
-%DbgExt = OpExtInstImport "OpenCL.DebugInfo.100"
-)";
-
-  CompileSuccessfully(GenerateShaderCodeForDebugInfo("", "", dbg_inst_header,
-                                                     "", extension, "Vertex"));
-  ASSERT_EQ(SPV_SUCCESS, ValidateInstructions());
-}
-
-TEST_F(ValidateOpenCL100DebugInfo, DebugExpressionFail) {
-  const std::string dbg_inst_header = R"(
-%op = OpExtInst %void %DbgExt DebugOperation Deref
-%null_expr = OpExtInst %void %DbgExt DebugExpression %op %void
-)";
-
-  const std::string extension = R"(
-%DbgExt = OpExtInstImport "OpenCL.DebugInfo.100"
-)";
-
-  CompileSuccessfully(GenerateShaderCodeForDebugInfo("", "", dbg_inst_header,
-                                                     "", extension, "Vertex"));
-  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
-  EXPECT_THAT(
-      getDiagnosticString(),
-      HasSubstr(
-          "expected operand Operation must be a result id of DebugOperation"));
-}
-
-TEST_F(ValidateOpenCL100DebugInfo, DebugTypeTemplate) {
-  const std::string src = R"(
-%src = OpString "simple.hlsl"
-%code = OpString "OpaqueType foo;
-main() {}
-"
-%float_name = OpString "float"
-%ty_name = OpString "Texture"
-%t_name = OpString "T"
-)";
-
-  const std::string size_const = R"(
-%int_32 = OpConstant %u32 32
-%int_128 = OpConstant %u32 128
-)";
-
-  const std::string dbg_inst_header = R"(
-%dbg_none = OpExtInst %void %DbgExt DebugInfoNone
-%dbg_src = OpExtInst %void %DbgExt DebugSource %src %code
-%comp_unit = OpExtInst %void %DbgExt DebugCompilationUnit 2 4 %dbg_src HLSL
-%float_info = OpExtInst %void %DbgExt DebugTypeBasic %float_name %int_32 Float
-%opaque = OpExtInst %void %DbgExt DebugTypeComposite %ty_name Class %dbg_src 1 1 %comp_unit %ty_name %dbg_none FlagIsPublic
-%param = OpExtInst %void %DbgExt DebugTypeTemplateParameter %t_name %float_info %dbg_none %dbg_src 0 0
-%temp = OpExtInst %void %DbgExt DebugTypeTemplate %opaque %param
-)";
-
-  const std::string extension = R"(
-%DbgExt = OpExtInstImport "OpenCL.DebugInfo.100"
-)";
-
-  CompileSuccessfully(GenerateShaderCodeForDebugInfo(
-      src, size_const, dbg_inst_header, "", extension, "Vertex"));
-  ASSERT_EQ(SPV_SUCCESS, ValidateInstructions());
-}
-
-TEST_F(ValidateOpenCL100DebugInfo, DebugTypeTemplateUsedForVariableType) {
-  const std::string src = R"(
-%src = OpString "simple.hlsl"
-%code = OpString "OpaqueType foo;
-main() {}
-"
-%float_name = OpString "float"
-%ty_name = OpString "Texture"
-%t_name = OpString "T"
-%foo_name = OpString "foo"
-)";
-
-  const std::string size_const = R"(
-%int_32 = OpConstant %u32 32
-%int_128 = OpConstant %u32 128
-)";
-
-  const std::string dbg_inst_header = R"(
-%dbg_none = OpExtInst %void %DbgExt DebugInfoNone
-%dbg_src = OpExtInst %void %DbgExt DebugSource %src %code
-%comp_unit = OpExtInst %void %DbgExt DebugCompilationUnit 2 4 %dbg_src HLSL
-%float_info = OpExtInst %void %DbgExt DebugTypeBasic %float_name %int_32 Float
-%opaque = OpExtInst %void %DbgExt DebugTypeComposite %ty_name Class %dbg_src 1 1 %comp_unit %ty_name %dbg_none FlagIsPublic
-%param = OpExtInst %void %DbgExt DebugTypeTemplateParameter %t_name %float_info %dbg_none %dbg_src 0 0
-%temp = OpExtInst %void %DbgExt DebugTypeTemplate %opaque %param
-%foo = OpExtInst %void %DbgExt DebugGlobalVariable %foo_name %temp %dbg_src 0 0 %comp_unit %foo_name %f32_input FlagIsProtected|FlagIsPrivate
-)";
-
-  const std::string extension = R"(
-%DbgExt = OpExtInstImport "OpenCL.DebugInfo.100"
-)";
-
-  CompileSuccessfully(GenerateShaderCodeForDebugInfo(
-      src, size_const, dbg_inst_header, "", extension, "Vertex"));
-  ASSERT_EQ(SPV_SUCCESS, ValidateInstructions());
-}
-
-TEST_F(ValidateOpenCL100DebugInfo, DebugTypeTemplateFunction) {
-  const std::string src = R"(
-%src = OpString "simple.hlsl"
-%code = OpString "OpaqueType foo;
-main() {}
-"
-%float_name = OpString "float"
-%ty_name = OpString "Texture"
-%t_name = OpString "T"
-%main_name = OpString "main"
-)";
-
-  const std::string size_const = R"(
-%int_32 = OpConstant %u32 32
-%int_128 = OpConstant %u32 128
-)";
-
-  const std::string dbg_inst_header = R"(
-%dbg_none = OpExtInst %void %DbgExt DebugInfoNone
-%dbg_src = OpExtInst %void %DbgExt DebugSource %src %code
-%comp_unit = OpExtInst %void %DbgExt DebugCompilationUnit 2 4 %dbg_src HLSL
-%float_info = OpExtInst %void %DbgExt DebugTypeBasic %float_name %int_32 Float
-%param = OpExtInst %void %DbgExt DebugTypeTemplateParameter %t_name %float_info %dbg_none %dbg_src 0 0
-%main_type_info = OpExtInst %void %DbgExt DebugTypeFunction FlagIsPublic %param %param
-%main_info = OpExtInst %void %DbgExt DebugFunction %main_name %main_type_info %dbg_src 1 1 %comp_unit %main_name FlagIsPublic 1 %main
-%temp = OpExtInst %void %DbgExt DebugTypeTemplate %main_info %param
-)";
-
-  const std::string extension = R"(
-%DbgExt = OpExtInstImport "OpenCL.DebugInfo.100"
-)";
-
-  CompileSuccessfully(GenerateShaderCodeForDebugInfo(
-      src, size_const, dbg_inst_header, "", extension, "Vertex"));
-  ASSERT_EQ(SPV_SUCCESS, ValidateInstructions());
-}
-
-TEST_F(ValidateOpenCL100DebugInfo, DebugTypeTemplateFailTarget) {
-  const std::string src = R"(
-%src = OpString "simple.hlsl"
-%code = OpString "OpaqueType foo;
-main() {}
-"
-%float_name = OpString "float"
-%ty_name = OpString "Texture"
-%t_name = OpString "T"
-%main_name = OpString "main"
-)";
-
-  const std::string size_const = R"(
-%int_32 = OpConstant %u32 32
-%int_128 = OpConstant %u32 128
-)";
-
-  const std::string dbg_inst_header = R"(
-%dbg_none = OpExtInst %void %DbgExt DebugInfoNone
-%dbg_src = OpExtInst %void %DbgExt DebugSource %src %code
-%comp_unit = OpExtInst %void %DbgExt DebugCompilationUnit 2 4 %dbg_src HLSL
-%float_info = OpExtInst %void %DbgExt DebugTypeBasic %float_name %int_32 Float
-%param = OpExtInst %void %DbgExt DebugTypeTemplateParameter %t_name %float_info %dbg_none %dbg_src 0 0
-%temp = OpExtInst %void %DbgExt DebugTypeTemplate %float_info %param
-)";
-
-  const std::string extension = R"(
-%DbgExt = OpExtInstImport "OpenCL.DebugInfo.100"
-)";
-
-  CompileSuccessfully(GenerateShaderCodeForDebugInfo(
-      src, size_const, dbg_inst_header, "", extension, "Vertex"));
-  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
-  EXPECT_THAT(getDiagnosticString(),
-              HasSubstr("expected operand Target must be DebugTypeComposite or "
-                        "DebugFunction"));
-}
-
-TEST_F(ValidateOpenCL100DebugInfo, DebugTypeTemplateFailParam) {
-  const std::string src = R"(
-%src = OpString "simple.hlsl"
-%code = OpString "OpaqueType foo;
-main() {}
-"
-%float_name = OpString "float"
-%ty_name = OpString "Texture"
-%t_name = OpString "T"
-%main_name = OpString "main"
-)";
-
-  const std::string size_const = R"(
-%int_32 = OpConstant %u32 32
-%int_128 = OpConstant %u32 128
-)";
-
-  const std::string dbg_inst_header = R"(
-%dbg_none = OpExtInst %void %DbgExt DebugInfoNone
-%dbg_src = OpExtInst %void %DbgExt DebugSource %src %code
-%comp_unit = OpExtInst %void %DbgExt DebugCompilationUnit 2 4 %dbg_src HLSL
-%float_info = OpExtInst %void %DbgExt DebugTypeBasic %float_name %int_32 Float
-%param = OpExtInst %void %DbgExt DebugTypeTemplateParameter %t_name %float_info %dbg_none %dbg_src 0 0
-%main_type_info = OpExtInst %void %DbgExt DebugTypeFunction FlagIsPublic %param %param
-%main_info = OpExtInst %void %DbgExt DebugFunction %main_name %main_type_info %dbg_src 1 1 %comp_unit %main_name FlagIsPublic 1 %main
-%temp = OpExtInst %void %DbgExt DebugTypeTemplate %main_info %float_info
-)";
-
-  const std::string extension = R"(
-%DbgExt = OpExtInstImport "OpenCL.DebugInfo.100"
-)";
-
-  CompileSuccessfully(GenerateShaderCodeForDebugInfo(
-      src, size_const, dbg_inst_header, "", extension, "Vertex"));
-  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
-  EXPECT_THAT(
-      getDiagnosticString(),
-      HasSubstr(
-          "expected operand Parameters must be DebugTypeTemplateParameter or "
-          "DebugTypeTemplateTemplateParameter"));
-}
-
-TEST_F(ValidateOpenCL100DebugInfo, DebugGlobalVariable) {
-  const std::string src = R"(
-%src = OpString "simple.hlsl"
-%code = OpString "float foo; void main() {}"
-%float_name = OpString "float"
-%foo_name = OpString "foo"
-)";
-
-  const std::string size_const = R"(
-%int_32 = OpConstant %u32 32
-)";
-
-  const std::string dbg_inst_header = R"(
-%dbg_src = OpExtInst %void %DbgExt DebugSource %src %code
-%comp_unit = OpExtInst %void %DbgExt DebugCompilationUnit 2 4 %dbg_src HLSL
-%float_info = OpExtInst %void %DbgExt DebugTypeBasic %float_name %int_32 Float
-%foo = OpExtInst %void %DbgExt DebugGlobalVariable %foo_name %float_info %dbg_src 0 0 %comp_unit %foo_name %f32_input FlagIsProtected|FlagIsPrivate
-)";
-
-  const std::string extension = R"(
-%DbgExt = OpExtInstImport "OpenCL.DebugInfo.100"
-)";
-
-  CompileSuccessfully(GenerateShaderCodeForDebugInfo(
-      src, size_const, dbg_inst_header, "", extension, "Vertex"));
-  ASSERT_EQ(SPV_SUCCESS, ValidateInstructions());
-}
-
-TEST_F(ValidateOpenCL100DebugInfo, DebugGlobalVariableStaticMember) {
-  const std::string src = R"(
-%src = OpString "simple.hlsl"
-%code = OpString "float foo; void main() {}"
-%float_name = OpString "float"
-%foo_name = OpString "foo"
-)";
-
-  const std::string size_const = R"(
-%int_32 = OpConstant %u32 32
-)";
-
-  const std::string dbg_inst_header = R"(
-%dbg_src = OpExtInst %void %DbgExt DebugSource %src %code
-%comp_unit = OpExtInst %void %DbgExt DebugCompilationUnit 2 4 %dbg_src HLSL
-%float_info = OpExtInst %void %DbgExt DebugTypeBasic %float_name %int_32 Float
-%t = OpExtInst %void %DbgExt DebugTypeComposite %foo_name Class %dbg_src 0 0 %comp_unit %foo_name %int_32 FlagIsPublic %a
-%a = OpExtInst %void %DbgExt DebugTypeMember %foo_name %float_info %dbg_src 0 0 %t %u32_0 %int_32 FlagIsPublic
-%foo = OpExtInst %void %DbgExt DebugGlobalVariable %foo_name %float_info %dbg_src 0 0 %comp_unit %foo_name %f32_input FlagIsProtected|FlagIsPrivate %a
-)";
-
-  const std::string extension = R"(
-%DbgExt = OpExtInstImport "OpenCL.DebugInfo.100"
-)";
-
-  CompileSuccessfully(GenerateShaderCodeForDebugInfo(
-      src, size_const, dbg_inst_header, "", extension, "Vertex"));
-  ASSERT_EQ(SPV_SUCCESS, ValidateInstructions());
-}
-
-TEST_F(ValidateOpenCL100DebugInfo, DebugGlobalVariableDebugInfoNone) {
-  const std::string src = R"(
-%src = OpString "simple.hlsl"
-%code = OpString "float foo; void main() {}"
-%float_name = OpString "float"
-%foo_name = OpString "foo"
-)";
-
-  const std::string size_const = R"(
-%int_32 = OpConstant %u32 32
-)";
-
-  const std::string dbg_inst_header = R"(
-%dbgNone = OpExtInst %void %DbgExt DebugInfoNone
-%dbg_src = OpExtInst %void %DbgExt DebugSource %src %code
-%comp_unit = OpExtInst %void %DbgExt DebugCompilationUnit 2 4 %dbg_src HLSL
-%float_info = OpExtInst %void %DbgExt DebugTypeBasic %float_name %int_32 Float
-%foo = OpExtInst %void %DbgExt DebugGlobalVariable %foo_name %float_info %dbg_src 0 0 %comp_unit %foo_name %dbgNone FlagIsProtected|FlagIsPrivate
-)";
-
-  const std::string extension = R"(
-%DbgExt = OpExtInstImport "OpenCL.DebugInfo.100"
-)";
-
-  CompileSuccessfully(GenerateShaderCodeForDebugInfo(
-      src, size_const, dbg_inst_header, "", extension, "Vertex"));
-  ASSERT_EQ(SPV_SUCCESS, ValidateInstructions());
-}
-
-TEST_F(ValidateOpenCL100DebugInfo, DebugGlobalVariableConst) {
-  const std::string src = R"(
-%src = OpString "simple.hlsl"
-%code = OpString "float foo; void main() {}"
-%float_name = OpString "float"
-%foo_name = OpString "foo"
-)";
-
-  const std::string size_const = R"(
-%int_32 = OpConstant %u32 32
-)";
-
-  const std::string dbg_inst_header = R"(
-%dbg_src = OpExtInst %void %DbgExt DebugSource %src %code
-%comp_unit = OpExtInst %void %DbgExt DebugCompilationUnit 2 4 %dbg_src HLSL
-%float_info = OpExtInst %void %DbgExt DebugTypeBasic %float_name %int_32 Float
-%foo = OpExtInst %void %DbgExt DebugGlobalVariable %foo_name %float_info %dbg_src 0 0 %comp_unit %foo_name %int_32 FlagIsProtected|FlagIsPrivate
-)";
-
-  const std::string extension = R"(
-%DbgExt = OpExtInstImport "OpenCL.DebugInfo.100"
-)";
-
-  CompileSuccessfully(GenerateShaderCodeForDebugInfo(
-      src, size_const, dbg_inst_header, "", extension, "Vertex"));
-  ASSERT_EQ(SPV_SUCCESS, ValidateInstructions());
-}
-
-TEST_P(ValidateOpenCL100DebugInfoDebugGlobalVariable, Fail) {
-  const std::string src = R"(
-%src = OpString "simple.hlsl"
-%code = OpString "float foo; void main() {}"
-%float_name = OpString "float"
-%foo_name = OpString "foo"
-)";
-
-  const std::string size_const = R"(
-%int_32 = OpConstant %u32 32
-)";
-
-  const auto& param = GetParam();
-
-  std::ostringstream ss;
-  ss << R"(
-%dbg_src = OpExtInst %void %DbgExt DebugSource %src %code
-%comp_unit = OpExtInst %void %DbgExt DebugCompilationUnit 2 4 %dbg_src HLSL
-%float_info = OpExtInst %void %DbgExt DebugTypeBasic %float_name %int_32 Float
-%foo = OpExtInst %void %DbgExt DebugGlobalVariable )"
-     << param.first;
-
-  const std::string extension = R"(
-%DbgExt = OpExtInstImport "OpenCL.DebugInfo.100"
-)";
-
-  CompileSuccessfully(GenerateShaderCodeForDebugInfo(src, size_const, ss.str(),
-                                                     "", extension, "Vertex"));
-  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
-  EXPECT_THAT(getDiagnosticString(),
-              HasSubstr("expected operand " + param.second));
-}
-
-INSTANTIATE_TEST_SUITE_P(
-    AllOpenCL100DebugInfoFail, ValidateOpenCL100DebugInfoDebugGlobalVariable,
-    ::testing::ValuesIn(std::vector<std::pair<std::string, std::string>>{
-        std::make_pair(
-            R"(%void %float_info %dbg_src 0 0 %comp_unit %foo_name %f32_input FlagIsProtected|FlagIsPrivate)",
-            "Name"),
-        std::make_pair(
-            R"(%foo_name %dbg_src %dbg_src 0 0 %comp_unit %foo_name %f32_input FlagIsProtected|FlagIsPrivate)",
-            "Type"),
-        std::make_pair(
-            R"(%foo_name %float_info %comp_unit 0 0 %comp_unit %foo_name %f32_input FlagIsProtected|FlagIsPrivate)",
-            "Source"),
-        std::make_pair(
-            R"(%foo_name %float_info %dbg_src 0 0 %dbg_src %foo_name %f32_input FlagIsProtected|FlagIsPrivate)",
-            "Scope"),
-        std::make_pair(
-            R"(%foo_name %float_info %dbg_src 0 0 %comp_unit %void %f32_input FlagIsProtected|FlagIsPrivate)",
-            "Linkage Name"),
-        std::make_pair(
-            R"(%foo_name %float_info %dbg_src 0 0 %comp_unit %foo_name %void FlagIsProtected|FlagIsPrivate)",
-            "Variable"),
-    }));
-
-TEST_F(ValidateOpenCL100DebugInfo, DebugInlinedAt) {
-  const std::string src = R"(
-%src = OpString "simple.hlsl"
-%code = OpString "void main() {}"
-%void_name = OpString "void"
-%main_name = OpString "main"
-%main_linkage_name = OpString "v_main"
-)";
-
-  const std::string dbg_inst_header = R"(
-%dbg_src = OpExtInst %void %DbgExt DebugSource %src %code
-%comp_unit = OpExtInst %void %DbgExt DebugCompilationUnit 2 4 %dbg_src HLSL
-%main_type_info = OpExtInst %void %DbgExt DebugTypeFunction FlagIsPublic %void
-%main_info = OpExtInst %void %DbgExt DebugFunction %main_name %main_type_info %dbg_src 1 1 %comp_unit %main_linkage_name FlagIsPublic 1 %main
-%inlined_at = OpExtInst %void %DbgExt DebugInlinedAt 0 %main_info
-%inlined_at_recursive = OpExtInst %void %DbgExt DebugInlinedAt 0 %main_info %inlined_at
-)";
-
-  const std::string body = R"(
-%main_scope = OpExtInst %void %DbgExt DebugScope %main_info %inlined_at
-)";
-
-  const std::string extension = R"(
-%DbgExt = OpExtInstImport "OpenCL.DebugInfo.100"
-)";
-
-  CompileSuccessfully(GenerateShaderCodeForDebugInfo(
-      src, "", dbg_inst_header, body, extension, "Vertex"));
-  ASSERT_EQ(SPV_SUCCESS, ValidateInstructions());
-}
-
-TEST_F(ValidateOpenCL100DebugInfo, DebugInlinedAtFail) {
-  const std::string src = R"(
-%src = OpString "simple.hlsl"
-%code = OpString "void main() {}"
-%void_name = OpString "void"
-%main_name = OpString "main"
-%main_linkage_name = OpString "v_main"
-)";
-
-  const std::string dbg_inst_header = R"(
-%dbg_src = OpExtInst %void %DbgExt DebugSource %src %code
-%comp_unit = OpExtInst %void %DbgExt DebugCompilationUnit 2 4 %dbg_src HLSL
-%main_type_info = OpExtInst %void %DbgExt DebugTypeFunction FlagIsPublic %void
-%main_info = OpExtInst %void %DbgExt DebugFunction %main_name %main_type_info %dbg_src 1 1 %comp_unit %main_linkage_name FlagIsPublic 1 %main
-%inlined_at = OpExtInst %void %DbgExt DebugInlinedAt 0 %main_info
-%inlined_at_recursive = OpExtInst %void %DbgExt DebugInlinedAt 0 %inlined_at
-)";
-
-  const std::string body = R"(
-%main_scope = OpExtInst %void %DbgExt DebugScope %main_info %inlined_at
-)";
-
-  const std::string extension = R"(
-%DbgExt = OpExtInstImport "OpenCL.DebugInfo.100"
-)";
-
-  CompileSuccessfully(GenerateShaderCodeForDebugInfo(
-      src, "", dbg_inst_header, body, extension, "Vertex"));
-  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
-  EXPECT_THAT(getDiagnosticString(), HasSubstr("expected operand Scope"));
-}
-
-TEST_F(ValidateOpenCL100DebugInfo, DebugInlinedAtFail2) {
-  const std::string src = R"(
-%src = OpString "simple.hlsl"
-%code = OpString "void main() {}"
-%void_name = OpString "void"
-%main_name = OpString "main"
-%main_linkage_name = OpString "v_main"
-)";
-
-  const std::string dbg_inst_header = R"(
-%dbg_src = OpExtInst %void %DbgExt DebugSource %src %code
-%comp_unit = OpExtInst %void %DbgExt DebugCompilationUnit 2 4 %dbg_src HLSL
-%main_type_info = OpExtInst %void %DbgExt DebugTypeFunction FlagIsPublic %void
-%main_info = OpExtInst %void %DbgExt DebugFunction %main_name %main_type_info %dbg_src 1 1 %comp_unit %main_linkage_name FlagIsPublic 1 %main
-%inlined_at = OpExtInst %void %DbgExt DebugInlinedAt 0 %main_info
-%inlined_at_recursive = OpExtInst %void %DbgExt DebugInlinedAt 0 %main_info %main_info
-)";
-
-  const std::string body = R"(
-%main_scope = OpExtInst %void %DbgExt DebugScope %main_info %inlined_at
-)";
-
-  const std::string extension = R"(
-%DbgExt = OpExtInstImport "OpenCL.DebugInfo.100"
-)";
-
-  CompileSuccessfully(GenerateShaderCodeForDebugInfo(
-      src, "", dbg_inst_header, body, extension, "Vertex"));
-  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
-  EXPECT_THAT(getDiagnosticString(), HasSubstr("expected operand Inlined"));
-}
-
-TEST_F(ValidateOpenCL100DebugInfo, DebugValue) {
-  const std::string src = R"(
-%src = OpString "simple.hlsl"
-%code = OpString "void main() { float foo; }"
-%float_name = OpString "float"
-%foo_name = OpString "foo"
-)";
-
-  const std::string size_const = R"(
-%int_3 = OpConstant %u32 3
-%int_32 = OpConstant %u32 32
-)";
-
-  const std::string dbg_inst_header = R"(
-%dbg_src = OpExtInst %void %DbgExt DebugSource %src %code
-%comp_unit = OpExtInst %void %DbgExt DebugCompilationUnit 2 4 %dbg_src HLSL
-%null_expr = OpExtInst %void %DbgExt DebugExpression
-%float_info = OpExtInst %void %DbgExt DebugTypeBasic %float_name %int_32 Float
-%v4float_info = OpExtInst %void %DbgExt DebugTypeVector %float_info 4
-%foo_info = OpExtInst %void %DbgExt DebugLocalVariable %foo_name %v4float_info %dbg_src 1 10 %comp_unit FlagIsLocal 0
-)";
-
-  const std::string body = R"(
-%value = OpExtInst %void %DbgExt DebugValue %foo_info %int_32 %null_expr %int_3
-)";
-
-  const std::string extension = R"(
-%DbgExt = OpExtInstImport "OpenCL.DebugInfo.100"
-)";
-
-  CompileSuccessfully(GenerateShaderCodeForDebugInfo(
-      src, size_const, dbg_inst_header, body, extension, "Vertex"));
-  ASSERT_EQ(SPV_SUCCESS, ValidateInstructions());
-}
-
-TEST_F(ValidateOpenCL100DebugInfo, DebugValueWithVariableIndex) {
-  const std::string src = R"(
-%src = OpString "simple.hlsl"
-%code = OpString "void main() { float foo; }"
-%float_name = OpString "float"
-%int_name = OpString "int"
-%foo_name = OpString "foo"
-%len_name = OpString "length"
-)";
-
-  const std::string size_const = R"(
-%int_3 = OpConstant %u32 3
-%int_32 = OpConstant %u32 32
-)";
-
-  const std::string dbg_inst_header = R"(
-%dbg_src = OpExtInst %void %DbgExt DebugSource %src %code
-%comp_unit = OpExtInst %void %DbgExt DebugCompilationUnit 2 4 %dbg_src HLSL
-%null_expr = OpExtInst %void %DbgExt DebugExpression
-%float_info = OpExtInst %void %DbgExt DebugTypeBasic %float_name %int_32 Float
-%int_info = OpExtInst %void %DbgExt DebugTypeBasic %int_name %int_32 Signed
-%v4float_info = OpExtInst %void %DbgExt DebugTypeVector %float_info 4
-%foo_info = OpExtInst %void %DbgExt DebugLocalVariable %foo_name %v4float_info %dbg_src 1 10 %comp_unit FlagIsLocal
-%len_info = OpExtInst %void %DbgExt DebugLocalVariable %len_name %int_info %dbg_src 0 0 %comp_unit FlagIsLocal
-)";
-
-  const std::string body = R"(
-%value = OpExtInst %void %DbgExt DebugValue %foo_info %int_32 %null_expr %len_info
-)";
-
-  const std::string extension = R"(
-%DbgExt = OpExtInstImport "OpenCL.DebugInfo.100"
-)";
-
-  CompileSuccessfully(GenerateShaderCodeForDebugInfo(
-      src, size_const, dbg_inst_header, body, extension, "Vertex"));
-  ASSERT_EQ(SPV_SUCCESS, ValidateInstructions());
-}
-
-TEST_P(ValidateOpenCL100DebugInfoDebugValue, Fail) {
-  const std::string src = R"(
-%src = OpString "simple.hlsl"
-%code = OpString "void main() { float foo; }"
-%float_name = OpString "float"
-%foo_name = OpString "foo"
-)";
-
-  const std::string size_const = R"(
-%int_32 = OpConstant %u32 32
-)";
-
-  const std::string dbg_inst_header = R"(
-%dbg_src = OpExtInst %void %DbgExt DebugSource %src %code
-%comp_unit = OpExtInst %void %DbgExt DebugCompilationUnit 2 4 %dbg_src HLSL
-%null_expr = OpExtInst %void %DbgExt DebugExpression
-%float_info = OpExtInst %void %DbgExt DebugTypeBasic %float_name %int_32 Float
-%foo_info = OpExtInst %void %DbgExt DebugLocalVariable %foo_name %float_info %dbg_src 1 10 %comp_unit FlagIsLocal 0
-)";
-
-  const auto& param = GetParam();
-
-  std::ostringstream ss;
-  ss << R"(
-%decl = OpExtInst %void %DbgExt DebugValue )"
-     << param.first;
-
-  const std::string extension = R"(
-%DbgExt = OpExtInstImport "OpenCL.DebugInfo.100"
-)";
-
-  CompileSuccessfully(GenerateShaderCodeForDebugInfo(
-      src, size_const, dbg_inst_header, ss.str(), extension, "Vertex"));
-  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
-  EXPECT_THAT(getDiagnosticString(),
-              HasSubstr("expected operand " + param.second));
-}
-
-INSTANTIATE_TEST_SUITE_P(
-    AllOpenCL100DebugInfoFail, ValidateOpenCL100DebugInfoDebugValue,
-    ::testing::ValuesIn(std::vector<std::pair<std::string, std::string>>{
-        std::make_pair(R"(%dbg_src %int_32 %null_expr)", "Local Variable"),
-        std::make_pair(R"(%foo_info %int_32 %dbg_src)", "Expression"),
-        std::make_pair(R"(%foo_info %int_32 %null_expr %dbg_src)", "Indexes"),
-    }));
-
 TEST_P(ValidateGlslStd450SqrtLike, IntResultType) {
   const std::string ext_inst_name = GetParam();
   const std::string body =
@@ -3507,6 +721,19 @@
                         "Result Type"));
 }
 
+TEST_P(ValidateGlslStd450SAbsLike, TypelessOperand) {
+  const std::string ext_inst_name = GetParam();
+  const std::string body =
+      "%val1 = OpExtInst %s64 %extinst " + ext_inst_name + " %main_entry\n";
+
+  CompileSuccessfully(GenerateShaderCode(body));
+  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
+  EXPECT_THAT(
+      getDiagnosticString(),
+      HasSubstr("GLSL.std.450 " + ext_inst_name +
+                ": expected all operands to be int scalars or vectors"));
+}
+
 INSTANTIATE_TEST_SUITE_P(AllSAbsLike, ValidateGlslStd450SAbsLike,
                          ::testing::ValuesIn(std::vector<std::string>{
                              "SAbs",
@@ -3656,6 +883,19 @@
                         "Result Type"));
 }
 
+TEST_P(ValidateGlslStd450UMinLike, TypelessOperand) {
+  const std::string ext_inst_name = GetParam();
+  const std::string body = "%val1 = OpExtInst %s64 %extinst " + ext_inst_name +
+                           " %s64_0 %main_entry\n";
+
+  CompileSuccessfully(GenerateShaderCode(body));
+  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
+  EXPECT_THAT(
+      getDiagnosticString(),
+      HasSubstr("GLSL.std.450 " + ext_inst_name +
+                ": expected all operands to be int scalars or vectors"));
+}
+
 INSTANTIATE_TEST_SUITE_P(AllUMinLike, ValidateGlslStd450UMinLike,
                          ::testing::ValuesIn(std::vector<std::string>{
                              "UMin",
@@ -3819,6 +1059,19 @@
                         "Result Type"));
 }
 
+TEST_P(ValidateGlslStd450UClampLike, TypelessOperand) {
+  const std::string ext_inst_name = GetParam();
+  const std::string body = "%val1 = OpExtInst %s64 %extinst " + ext_inst_name +
+                           " %main_entry %s64_0 %s64_0\n";
+
+  CompileSuccessfully(GenerateShaderCode(body));
+  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
+  EXPECT_THAT(
+      getDiagnosticString(),
+      HasSubstr("GLSL.std.450 " + ext_inst_name +
+                ": expected all operands to be int scalars or vectors"));
+}
+
 INSTANTIATE_TEST_SUITE_P(AllUClampLike, ValidateGlslStd450UClampLike,
                          ::testing::ValuesIn(std::vector<std::string>{
                              "UClamp",
@@ -5552,7 +2805,8 @@
                         "expected Interpolant to be a pointer"));
 }
 
-TEST_F(ValidateExtInst, GlslStd450InterpolateAtOffsetInternalInvalidDataF32Vec2) {
+TEST_F(ValidateExtInst,
+       GlslStd450InterpolateAtOffsetInternalInvalidDataF32Vec2) {
   const std::string body = R"(
 %ld2  = OpLoad %f32vec2 %f32vec2_input
 %val2 = OpExtInst %f32vec2 %extinst InterpolateAtOffset %ld2 %f32vec2_01
diff --git a/third_party/vulkan-deps/spirv-tools/src/test/val/val_interfaces_test.cpp b/third_party/vulkan-deps/spirv-tools/src/test/val/val_interfaces_test.cpp
index 6869e79..be13cd7 100644
--- a/third_party/vulkan-deps/spirv-tools/src/test/val/val_interfaces_test.cpp
+++ b/third_party/vulkan-deps/spirv-tools/src/test/val/val_interfaces_test.cpp
@@ -1410,6 +1410,31 @@
   EXPECT_EQ(SPV_SUCCESS, ValidateInstructions(SPV_ENV_VULKAN_1_2));
 }
 
+TEST_F(ValidateInterfacesTest, DuplicateInterfaceVariableSuccess) {
+  const std::string text = R"(
+OpCapability Shader
+OpMemoryModel Logical GLSL450
+OpEntryPoint Fragment %main "main" %in %out %in
+OpExecutionMode %main OriginUpperLeft
+OpDecorate %in Location 0
+OpDecorate %out Location 0
+%void = OpTypeVoid
+%float = OpTypeFloat 32
+%in_ptr = OpTypePointer Input %float
+%out_ptr = OpTypePointer Output %float
+%in = OpVariable %in_ptr Input
+%out = OpVariable %out_ptr Output
+%void_fn = OpTypeFunction %void
+%main = OpFunction %void None %void_fn
+%entry = OpLabel
+OpReturn
+OpFunctionEnd
+)";
+
+  CompileSuccessfully(text, SPV_ENV_VULKAN_1_0);
+  EXPECT_EQ(SPV_SUCCESS, ValidateInstructions(SPV_ENV_VULKAN_1_0));
+}
+
 }  // namespace
 }  // namespace val
 }  // namespace spvtools
diff --git a/third_party/vulkan-deps/spirv-tools/src/test/val/val_memory_test.cpp b/third_party/vulkan-deps/spirv-tools/src/test/val/val_memory_test.cpp
index 9799b40..616a88f 100644
--- a/third_party/vulkan-deps/spirv-tools/src/test/val/val_memory_test.cpp
+++ b/third_party/vulkan-deps/spirv-tools/src/test/val/val_memory_test.cpp
@@ -746,7 +746,7 @@
       %float = OpTypeFloat 32
      %uint = OpTypeInt 32 0
 %_runtimearr_float = OpTypeRuntimeArray %float
-  %_struct_7 = OpTypeStruct %float %_runtimearr_float
+  %_struct_7 = OpTypeStruct %float
 %_ptr_Function__struct_7  = OpTypePointer Function %_struct_7
           %1 = OpFunction %void None %3
           %9 = OpLabel
@@ -4284,6 +4284,94 @@
   EXPECT_EQ(SPV_SUCCESS, ValidateInstructions(SPV_ENV_VULKAN_1_0));
 }
 
+TEST_F(ValidateMemory, LoadRuntimeArray) {
+  const std::string spirv = R"(
+OpCapability Shader
+OpExtension "SPV_KHR_storage_buffer_storage_class"
+OpMemoryModel Logical GLSL450
+OpEntryPoint GLCompute %main "main"
+%void = OpTypeVoid
+%int = OpTypeInt 32 0
+%int_0 = OpConstant %int 0
+%rta = OpTypeRuntimeArray %int
+%block = OpTypeStruct %rta
+%ptr_rta = OpTypePointer StorageBuffer %rta
+%ptr_block = OpTypePointer StorageBuffer %block
+%var = OpVariable %ptr_block StorageBuffer
+%void_fn = OpTypeFunction %void
+%main = OpFunction %void None %void_fn
+%entry = OpLabel
+%gep = OpAccessChain %ptr_rta %var %int_0
+%ld = OpLoad %rta %gep
+OpReturn
+OpFunctionEnd
+)";
+
+  CompileSuccessfully(spirv);
+  EXPECT_EQ(SPV_ERROR_INVALID_ID, ValidateInstructions());
+  EXPECT_THAT(getDiagnosticString(),
+              HasSubstr("Cannot load a runtime-sized array"));
+}
+
+TEST_F(ValidateMemory, LoadRuntimeArrayInStruct) {
+  const std::string spirv = R"(
+OpCapability Shader
+OpExtension "SPV_KHR_storage_buffer_storage_class"
+OpMemoryModel Logical GLSL450
+OpEntryPoint GLCompute %main "main"
+%void = OpTypeVoid
+%int = OpTypeInt 32 0
+%int_0 = OpConstant %int 0
+%rta = OpTypeRuntimeArray %int
+%block = OpTypeStruct %rta
+%ptr_rta = OpTypePointer StorageBuffer %rta
+%ptr_block = OpTypePointer StorageBuffer %block
+%var = OpVariable %ptr_block StorageBuffer
+%void_fn = OpTypeFunction %void
+%main = OpFunction %void None %void_fn
+%entry = OpLabel
+%ld = OpLoad %block %var
+OpReturn
+OpFunctionEnd
+)";
+
+  CompileSuccessfully(spirv);
+  EXPECT_EQ(SPV_ERROR_INVALID_ID, ValidateInstructions());
+  EXPECT_THAT(getDiagnosticString(),
+              HasSubstr("Cannot load a runtime-sized array"));
+}
+
+TEST_F(ValidateMemory, LoadRuntimeArrayInArray) {
+  const std::string spirv = R"(
+OpCapability Shader
+OpExtension "SPV_KHR_storage_buffer_storage_class"
+OpMemoryModel Logical GLSL450
+OpEntryPoint GLCompute %main "main"
+%void = OpTypeVoid
+%int = OpTypeInt 32 0
+%int_0 = OpConstant %int 0
+%int_4 = OpConstant %int 4
+%rta = OpTypeRuntimeArray %int
+%block = OpTypeStruct %rta
+%array = OpTypeArray %block %int_4
+%ptr_rta = OpTypePointer StorageBuffer %rta
+%ptr_block = OpTypePointer StorageBuffer %block
+%ptr_array = OpTypePointer StorageBuffer %array
+%var = OpVariable %ptr_array StorageBuffer
+%void_fn = OpTypeFunction %void
+%main = OpFunction %void None %void_fn
+%entry = OpLabel
+%ld = OpLoad %array %var
+OpReturn
+OpFunctionEnd
+)";
+
+  CompileSuccessfully(spirv);
+  EXPECT_EQ(SPV_ERROR_INVALID_ID, ValidateInstructions());
+  EXPECT_THAT(getDiagnosticString(),
+              HasSubstr("Cannot load a runtime-sized array"));
+}
+
 }  // namespace
 }  // namespace val
 }  // namespace spvtools
diff --git a/third_party/vulkan-deps/spirv-tools/src/test/val/val_modes_test.cpp b/third_party/vulkan-deps/spirv-tools/src/test/val/val_modes_test.cpp
index 99f5c9c..d060bb7 100644
--- a/third_party/vulkan-deps/spirv-tools/src/test/val/val_modes_test.cpp
+++ b/third_party/vulkan-deps/spirv-tools/src/test/val/val_modes_test.cpp
@@ -672,7 +672,7 @@
                                  Values("Kernel"),
                                  Values("LocalSizeHint 1 1 1", "VecTypeHint 4",
                                         "ContractionOff",
-                                        "LocalSizeHintId %int1"),
+                                        "LocalSizeHintId %int1 %int1 %int1"),
                                  Values(SPV_ENV_UNIVERSAL_1_3)));
 
 INSTANTIATE_TEST_SUITE_P(
@@ -684,7 +684,7 @@
         Values("Geometry", "TessellationControl", "TessellationEvaluation",
                "GLCompute", "Vertex", "Fragment"),
         Values("LocalSizeHint 1 1 1", "VecTypeHint 4", "ContractionOff",
-               "LocalSizeHintId %int1"),
+               "LocalSizeHintId %int1 %int1 %int1"),
         Values(SPV_ENV_UNIVERSAL_1_3)));
 
 INSTANTIATE_TEST_SUITE_P(
@@ -863,7 +863,7 @@
 OpCapability Shader
 OpMemoryModel Logical GLSL450
 OpEntryPoint Kernel %main "main"
-OpExecutionMode %main LocalSizeHintId %int_1
+OpExecutionMode %main LocalSizeHintId %int_1 %int_1 %int_1
 %int = OpTypeInt 32 0
 %int_1 = OpConstant %int 1
 )" + kVoidFunction;
@@ -882,7 +882,7 @@
 OpCapability Shader
 OpMemoryModel Logical GLSL450
 OpEntryPoint Kernel %main "main"
-OpExecutionModeId %main LocalSizeHintId %int_1
+OpExecutionModeId %main LocalSizeHintId %int_1 %int_1 %int_1
 %int = OpTypeInt 32 0
 %int_1 = OpConstant %int 1
 )" + kVoidFunction;
@@ -898,7 +898,7 @@
 OpCapability Shader
 OpMemoryModel Logical GLSL450
 OpEntryPoint Vertex %main "main"
-OpExecutionModeId %main LocalSizeHintId %int_1
+OpExecutionModeId %main LocalSizeHintId %int_1 %int_1 %int_1
 %int = OpTypeInt 32 0
 %int_ptr = OpTypePointer Private %int
 %int_1 = OpVariable %int_ptr Private
diff --git a/third_party/vulkan-deps/spirv-tools/src/tools/CMakeLists.txt b/third_party/vulkan-deps/spirv-tools/src/tools/CMakeLists.txt
index 124a332..6039089 100644
--- a/third_party/vulkan-deps/spirv-tools/src/tools/CMakeLists.txt
+++ b/third_party/vulkan-deps/spirv-tools/src/tools/CMakeLists.txt
@@ -48,6 +48,7 @@
     add_spvtools_tool(TARGET spirv-reduce SRCS reduce/reduce.cpp util/cli_consumer.cpp LIBS SPIRV-Tools-reduce ${SPIRV_TOOLS_FULL_VISIBILITY})
   endif()
   add_spvtools_tool(TARGET spirv-link SRCS link/linker.cpp LIBS SPIRV-Tools-link ${SPIRV_TOOLS_FULL_VISIBILITY})
+  add_spvtools_tool(TARGET spirv-lint SRCS lint/lint.cpp util/cli_consumer.cpp LIBS SPIRV-Tools-lint SPIRV-Tools-opt ${SPIRV_TOOLS_FULL_VISIBILITY})
   add_spvtools_tool(TARGET spirv-cfg
                     SRCS cfg/cfg.cpp
                          cfg/bin_to_dot.h
@@ -56,7 +57,7 @@
   target_include_directories(spirv-cfg PRIVATE ${spirv-tools_SOURCE_DIR}
                                                ${SPIRV_HEADER_INCLUDE_DIR})
   set(SPIRV_INSTALL_TARGETS spirv-as spirv-dis spirv-val spirv-opt
-                            spirv-cfg spirv-link)
+                            spirv-cfg spirv-link spirv-lint)
   if(NOT DEFINED IOS_PLATFORM)
     set(SPIRV_INSTALL_TARGETS ${SPIRV_INSTALL_TARGETS} spirv-reduce)
   endif()
diff --git a/third_party/vulkan-deps/spirv-tools/src/tools/fuzz/fuzz.cpp b/third_party/vulkan-deps/spirv-tools/src/tools/fuzz/fuzz.cpp
index de72b2c..306f925 100644
--- a/third_party/vulkan-deps/spirv-tools/src/tools/fuzz/fuzz.cpp
+++ b/third_party/vulkan-deps/spirv-tools/src/tools/fuzz/fuzz.cpp
@@ -630,7 +630,7 @@
       std::move(ir_context), std::move(transformation_context),
       std::move(fuzzer_context), message_consumer, donor_suppliers,
       fuzzer_options->all_passes_enabled, repeated_pass_strategy,
-      fuzzer_options->fuzzer_pass_validation_enabled, validator_options);
+      fuzzer_options->fuzzer_pass_validation_enabled, validator_options, false);
   auto fuzz_result = fuzzer.Run(0);
   if (fuzz_result.status ==
       spvtools::fuzz::Fuzzer::Status::kFuzzerPassLedToInvalidModule) {
diff --git a/third_party/vulkan-deps/spirv-tools/src/tools/io.h b/third_party/vulkan-deps/spirv-tools/src/tools/io.h
index aff9eab..83a85c1 100644
--- a/third_party/vulkan-deps/spirv-tools/src/tools/io.h
+++ b/third_party/vulkan-deps/spirv-tools/src/tools/io.h
@@ -89,7 +89,7 @@
 
   ReadFile(fp, data);
   bool succeeded = WasFileCorrectlyRead<T>(fp, filename);
-  if (use_file) fclose(fp);
+  if (use_file && fp) fclose(fp);
   return succeeded;
 }
 
@@ -111,7 +111,7 @@
 
   ReadFile(fp, data);
   bool succeeded = WasFileCorrectlyRead<T>(fp, filename);
-  if (use_file) fclose(fp);
+  if (use_file && fp) fclose(fp);
   return succeeded;
 }
 
diff --git a/third_party/vulkan-deps/spirv-tools/src/tools/lint/lint.cpp b/third_party/vulkan-deps/spirv-tools/src/tools/lint/lint.cpp
new file mode 100644
index 0000000..5c2a82a
--- /dev/null
+++ b/third_party/vulkan-deps/spirv-tools/src/tools/lint/lint.cpp
@@ -0,0 +1,75 @@
+// Copyright (c) 2021 Google LLC.
+//
+// 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.
+
+#include <iostream>
+
+#include "source/opt/log.h"
+#include "spirv-tools/linter.hpp"
+#include "tools/io.h"
+#include "tools/util/cli_consumer.h"
+
+const auto kDefaultEnvironment = SPV_ENV_UNIVERSAL_1_5;
+
+namespace {
+// Status and actions to perform after parsing command-line arguments.
+enum LintActions { LINT_CONTINUE, LINT_STOP };
+
+struct LintStatus {
+  LintActions action;
+  int code;
+};
+
+// Parses command-line flags. |argc| contains the number of command-line flags.
+// |argv| points to an array of strings holding the flags.
+//
+// On return, this function stores the name of the input program in |in_file|.
+// The return value indicates whether optimization should continue and a status
+// code indicating an error or success.
+LintStatus ParseFlags(int argc, const char** argv, const char** in_file) {
+  // TODO (dongja): actually parse flags, etc.
+  if (argc != 2) {
+    spvtools::Error(spvtools::utils::CLIMessageConsumer, nullptr, {},
+                    "expected exactly one argument: in_file");
+    return {LINT_STOP, 1};
+  }
+
+  *in_file = argv[1];
+
+  return {LINT_CONTINUE, 0};
+}
+}  // namespace
+
+int main(int argc, const char** argv) {
+  const char* in_file = nullptr;
+
+  spv_target_env target_env = kDefaultEnvironment;
+
+  spvtools::Linter linter(target_env);
+  linter.SetMessageConsumer(spvtools::utils::CLIMessageConsumer);
+
+  LintStatus status = ParseFlags(argc, argv, &in_file);
+
+  if (status.action == LINT_STOP) {
+    return status.code;
+  }
+
+  std::vector<uint32_t> binary;
+  if (!ReadBinaryFile(in_file, &binary)) {
+    return 1;
+  }
+
+  bool ok = linter.Run(binary.data(), binary.size());
+
+  return ok ? 0 : 1;
+}
diff --git a/third_party/vulkan-deps/spirv-tools/src/tools/opt/opt.cpp b/third_party/vulkan-deps/spirv-tools/src/tools/opt/opt.cpp
index 53bf31d..d5036fc 100644
--- a/third_party/vulkan-deps/spirv-tools/src/tools/opt/opt.cpp
+++ b/third_party/vulkan-deps/spirv-tools/src/tools/opt/opt.cpp
@@ -143,6 +143,15 @@
                does not support RelaxedPrecision or ignores it. This pass also
                removes all RelaxedPrecision decorations.)");
   printf(R"(
+  --convert-to-sampled-image "<descriptor set>:<binding> ..."
+               convert images and/or samplers with the given pairs of descriptor
+               set and binding to sampled images. If a pair of an image and a
+               sampler have the same pair of descriptor set and binding that is
+               one of the given pairs, they will be converted to a sampled
+               image. In addition, if only an image or a sampler has the
+               descriptor set and binding that is one of the given pairs, it
+               will be converted to a sampled image.)");
+  printf(R"(
   --copy-propagate-arrays
                Does propagation of memory references when an array is a copy of
                another.  It will only propagate an array if the source is never
@@ -378,9 +387,12 @@
                Change the scope of private variables that are used in a single
                function to that function.)");
   printf(R"(
-  --reduce-load-size
+  --reduce-load-size[=<threshold>]
                Replaces loads of composite objects where not every component is
-               used by loads of just the elements that are used.)");
+               used by loads of just the elements that are used.  If the ratio
+               of the used components of the load is less than the <threshold>,
+               we replace the load.  <threshold> is a double type number.  If
+               it is bigger than 1.0, we always replaces the load.)");
   printf(R"(
   --redundancy-elimination
                Looks for instructions in the same function that compute the
diff --git a/third_party/vulkan-deps/spirv-tools/src/tools/val/val.cpp b/third_party/vulkan-deps/spirv-tools/src/tools/val/val.cpp
index 21a7d8f..55321da 100644
--- a/third_party/vulkan-deps/spirv-tools/src/tools/val/val.cpp
+++ b/third_party/vulkan-deps/spirv-tools/src/tools/val/val.cpp
@@ -64,6 +64,8 @@
   --relax-struct-store             Allow store from one struct type to a
                                    different type with compatible layout and
                                    members.
+  --allow-localsizeid              Allow use of the LocalSizeId decoration where it would otherwise not
+                                   be allowed by the target environment.
   --before-hlsl-legalization       Allows code patterns that are intended to be
                                    fixed by spirv-opt's legalization passes.
   --version                        Display validator version information.
@@ -153,6 +155,8 @@
         options.SetWorkgroupScalarBlockLayout(true);
       } else if (0 == strcmp(cur_arg, "--skip-block-layout")) {
         options.SetSkipBlockLayout(true);
+      } else if (0 == strcmp(cur_arg, "--allow-localsizeid")) {
+        options.SetAllowLocalSizeId(true);
       } else if (0 == strcmp(cur_arg, "--relax-struct-store")) {
         options.SetRelaxStructStore(true);
       } else if (0 == cur_arg[1]) {
diff --git a/third_party/vulkan-deps/vulkan-headers/src/include/vulkan/vulkan.hpp b/third_party/vulkan-deps/vulkan-headers/src/include/vulkan/vulkan.hpp
index 61e4955..63d72f4 100644
--- a/third_party/vulkan-deps/vulkan-headers/src/include/vulkan/vulkan.hpp
+++ b/third_party/vulkan-deps/vulkan-headers/src/include/vulkan/vulkan.hpp
@@ -39,7 +39,6 @@
 #include <tuple>
 #include <type_traits>
 #include <vulkan/vulkan.h>
-
 #if 17 <= VULKAN_HPP_CPP_VERSION
 #  include <string_view>
 #endif
@@ -53,6 +52,24 @@
 #  include <vector>
 #endif
 
+#if defined( VULKAN_HPP_NO_CONSTRUCTORS )
+#  if !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )
+#    define VULKAN_HPP_NO_STRUCT_CONSTRUCTORS
+#  endif
+#  if !defined( VULKAN_HPP_NO_UNION_CONSTRUCTORS )
+#    define VULKAN_HPP_NO_UNION_CONSTRUCTORS
+#  endif
+#endif
+
+#if defined( VULKAN_HPP_NO_SETTERS )
+#  if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
+#    define VULKAN_HPP_NO_STRUCT_SETTERS
+#  endif
+#  if !defined( VULKAN_HPP_NO_UNION_SETTERS )
+#    define VULKAN_HPP_NO_UNION_SETTERS
+#  endif
+#endif
+
 #if !defined( VULKAN_HPP_ASSERT )
 #  include <cassert>
 #  define VULKAN_HPP_ASSERT assert
@@ -93,7 +110,12 @@
 #  include <compare>
 #endif
 
-static_assert( VK_HEADER_VERSION == 184, "Wrong VK_HEADER_VERSION!" );
+#if ( 201803 <= __cpp_lib_span )
+#  define VULKAN_HPP_SUPPORT_SPAN
+#  include <span>
+#endif
+
+static_assert( VK_HEADER_VERSION == 190, "Wrong VK_HEADER_VERSION!" );
 
 // 32-bit vulkan is not typesafe for handles, so don't allow copy constructors on this platform by default.
 // To enable this feature on 32-bit platforms please define VULKAN_HPP_TYPESAFE_CONVERSION
@@ -334,6 +356,36 @@
       , m_ptr( data.data() )
     {}
 
+#  if defined( VULKAN_HPP_SUPPORT_SPAN )
+    template <size_t N = std::dynamic_extent>
+    ArrayProxy( std::span<T, N> const & data ) VULKAN_HPP_NOEXCEPT
+      : m_count( static_cast<uint32_t>( data.size() ) )
+      , m_ptr( data.data() )
+    {}
+
+    template <size_t N                                                    = std::dynamic_extent,
+              typename B                                                  = T,
+              typename std::enable_if<std::is_const<B>::value, int>::type = 0>
+    ArrayProxy( std::span<typename std::remove_const<T>::type, N> const & data ) VULKAN_HPP_NOEXCEPT
+      : m_count( static_cast<uint32_t>( data.size() ) )
+      , m_ptr( data.data() )
+    {}
+
+    template <size_t N = std::dynamic_extent>
+    ArrayProxy( std::span<T, N> & data ) VULKAN_HPP_NOEXCEPT
+      : m_count( static_cast<uint32_t>( data.size() ) )
+      , m_ptr( data.data() )
+    {}
+
+    template <size_t N                                                    = std::dynamic_extent,
+              typename B                                                  = T,
+              typename std::enable_if<std::is_const<B>::value, int>::type = 0>
+    ArrayProxy( std::span<typename std::remove_const<T>::type, N> & data ) VULKAN_HPP_NOEXCEPT
+      : m_count( static_cast<uint32_t>( data.size() ) )
+      , m_ptr( data.data() )
+    {}
+#  endif
+
     const T * begin() const VULKAN_HPP_NOEXCEPT
     {
       return m_ptr;
@@ -531,6 +583,36 @@
               typename std::enable_if<std::is_const<B>::value, int>::type = 0>
     ArrayProxyNoTemporaries( std::vector<typename std::remove_const<T>::type, Allocator> && data ) = delete;
 
+#  if defined( VULKAN_HPP_SUPPORT_SPAN )
+    template <size_t N = std::dynamic_extent>
+    ArrayProxyNoTemporaries( std::span<T, N> const & data ) VULKAN_HPP_NOEXCEPT
+      : m_count( static_cast<uint32_t>( data.size() ) )
+      , m_ptr( data.data() )
+    {}
+
+    template <size_t N                                                    = std::dynamic_extent,
+              typename B                                                  = T,
+              typename std::enable_if<std::is_const<B>::value, int>::type = 0>
+    ArrayProxyNoTemporaries( std::span<typename std::remove_const<T>::type, N> const & data ) VULKAN_HPP_NOEXCEPT
+      : m_count( static_cast<uint32_t>( data.size() ) )
+      , m_ptr( data.data() )
+    {}
+
+    template <size_t N = std::dynamic_extent>
+    ArrayProxyNoTemporaries( std::span<T, N> & data ) VULKAN_HPP_NOEXCEPT
+      : m_count( static_cast<uint32_t>( data.size() ) )
+      , m_ptr( data.data() )
+    {}
+
+    template <size_t N                                                    = std::dynamic_extent,
+              typename B                                                  = T,
+              typename std::enable_if<std::is_const<B>::value, int>::type = 0>
+    ArrayProxyNoTemporaries( std::span<typename std::remove_const<T>::type, N> & data ) VULKAN_HPP_NOEXCEPT
+      : m_count( static_cast<uint32_t>( data.size() ) )
+      , m_ptr( data.data() )
+    {}
+#  endif
+
     const T * begin() const VULKAN_HPP_NOEXCEPT
     {
       return m_ptr;
@@ -1296,8 +1378,22 @@
   }
 #endif
 
+  class DispatchLoaderBase
+  {
+#if !defined( NDEBUG )
+  public:
+    size_t getVkHeaderVersion() const
+    {
+      return vkHeaderVersion;
+    }
+
+  private:
+    size_t vkHeaderVersion = VK_HEADER_VERSION;
+#endif
+  };
+
 #if !defined( VK_NO_PROTOTYPES )
-  class DispatchLoaderStatic
+  class DispatchLoaderStatic : public DispatchLoaderBase
   {
   public:
     //=== VK_VERSION_1_0 ===
@@ -4715,6 +4811,16 @@
       return ::vkGetPhysicalDeviceToolPropertiesEXT( physicalDevice, pToolCount, pToolProperties );
     }
 
+    //=== VK_KHR_present_wait ===
+
+    VkResult vkWaitForPresentKHR( VkDevice       device,
+                                  VkSwapchainKHR swapchain,
+                                  uint64_t       presentId,
+                                  uint64_t       timeout ) const VULKAN_HPP_NOEXCEPT
+    {
+      return ::vkWaitForPresentKHR( device, swapchain, presentId, timeout );
+    }
+
     //=== VK_NV_cooperative_matrix ===
 
     VkResult vkGetPhysicalDeviceCooperativeMatrixPropertiesNV( VkPhysicalDevice                  physicalDevice,
@@ -5372,13 +5478,22 @@
       return ::vkCmdSubpassShadingHUAWEI( commandBuffer );
     }
 
+    //=== VK_HUAWEI_invocation_mask ===
+
+    void vkCmdBindInvocationMaskHUAWEI( VkCommandBuffer commandBuffer,
+                                        VkImageView     imageView,
+                                        VkImageLayout   imageLayout ) const VULKAN_HPP_NOEXCEPT
+    {
+      return ::vkCmdBindInvocationMaskHUAWEI( commandBuffer, imageView, imageLayout );
+    }
+
     //=== VK_NV_external_memory_rdma ===
 
     VkResult vkGetMemoryRemoteAddressNV( VkDevice                               device,
-                                         const VkMemoryGetRemoteAddressInfoNV * getMemoryRemoteAddressInfo,
+                                         const VkMemoryGetRemoteAddressInfoNV * pMemoryGetRemoteAddressInfo,
                                          VkRemoteAddressNV *                    pAddress ) const VULKAN_HPP_NOEXCEPT
     {
-      return ::vkGetMemoryRemoteAddressNV( device, getMemoryRemoteAddressInfo, pAddress );
+      return ::vkGetMemoryRemoteAddressNV( device, pMemoryGetRemoteAddressInfo, pAddress );
     }
 
     //=== VK_EXT_extended_dynamic_state2 ===
@@ -5541,7 +5656,7 @@
     ObjectDestroy( OwnerType                           owner,
                    Optional<const AllocationCallbacks> allocationCallbacks
                                                        VULKAN_HPP_DEFAULT_ARGUMENT_NULLPTR_ASSIGNMENT,
-                   Dispatch const &                    dispatch = VULKAN_HPP_DEFAULT_DISPATCHER ) VULKAN_HPP_NOEXCEPT
+                   Dispatch const & dispatch VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) VULKAN_HPP_NOEXCEPT
       : m_owner( owner )
       , m_allocationCallbacks( allocationCallbacks )
       , m_dispatch( &dispatch )
@@ -5579,7 +5694,7 @@
     ObjectDestroy() = default;
 
     ObjectDestroy( Optional<const AllocationCallbacks> allocationCallbacks,
-                   Dispatch const &                    dispatch = VULKAN_HPP_DEFAULT_DISPATCHER ) VULKAN_HPP_NOEXCEPT
+                   Dispatch const & dispatch VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) VULKAN_HPP_NOEXCEPT
       : m_allocationCallbacks( allocationCallbacks )
       , m_dispatch( &dispatch )
     {}
@@ -5610,7 +5725,7 @@
 
     ObjectFree( OwnerType                           owner,
                 Optional<const AllocationCallbacks> allocationCallbacks VULKAN_HPP_DEFAULT_ARGUMENT_NULLPTR_ASSIGNMENT,
-                Dispatch const & dispatch = VULKAN_HPP_DEFAULT_DISPATCHER ) VULKAN_HPP_NOEXCEPT
+                Dispatch const & dispatch VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) VULKAN_HPP_NOEXCEPT
       : m_owner( owner )
       , m_allocationCallbacks( allocationCallbacks )
       , m_dispatch( &dispatch )
@@ -5646,7 +5761,8 @@
   public:
     ObjectRelease() = default;
 
-    ObjectRelease( OwnerType owner, Dispatch const & dispatch = VULKAN_HPP_DEFAULT_DISPATCHER ) VULKAN_HPP_NOEXCEPT
+    ObjectRelease( OwnerType        owner,
+                   Dispatch const & dispatch VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) VULKAN_HPP_NOEXCEPT
       : m_owner( owner )
       , m_dispatch( &dispatch )
     {}
@@ -5677,7 +5793,7 @@
 
     PoolFree( OwnerType        owner,
               PoolType         pool,
-              Dispatch const & dispatch = VULKAN_HPP_DEFAULT_DISPATCHER ) VULKAN_HPP_NOEXCEPT
+              Dispatch const & dispatch VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) VULKAN_HPP_NOEXCEPT
       : m_owner( owner )
       , m_pool( pool )
       , m_dispatch( &dispatch )
@@ -5705,11 +5821,16 @@
     Dispatch const * m_dispatch = nullptr;
   };
 
+  //==================
+  //=== BASE TYPEs ===
+  //==================
+
   using Bool32          = uint32_t;
   using DeviceAddress   = uint64_t;
   using DeviceSize      = uint64_t;
   using RemoteAddressNV = void *;
   using SampleMask      = uint32_t;
+
 }  // namespace VULKAN_HPP_NAMESPACE
 
 #include <vulkan/vulkan_enums.hpp>
@@ -6419,721 +6540,13 @@
 
 namespace VULKAN_HPP_NAMESPACE
 {
+  //=======================
+  //=== STRUCTS EXTENDS ===
+  //=======================
+
+  //=== VK_VERSION_1_1 ===
   template <>
-  struct StructExtends<AccelerationStructureGeometryMotionTrianglesDataNV,
-                       AccelerationStructureGeometryTrianglesDataKHR>
-  {
-    enum
-    {
-      value = true
-    };
-  };
-  template <>
-  struct StructExtends<AccelerationStructureMotionInfoNV, AccelerationStructureCreateInfoKHR>
-  {
-    enum
-    {
-      value = true
-    };
-  };
-#if defined( VK_USE_PLATFORM_ANDROID_KHR )
-  template <>
-  struct StructExtends<AndroidHardwareBufferFormatPropertiesANDROID, AndroidHardwareBufferPropertiesANDROID>
-  {
-    enum
-    {
-      value = true
-    };
-  };
-#endif /*VK_USE_PLATFORM_ANDROID_KHR*/
-#if defined( VK_USE_PLATFORM_ANDROID_KHR )
-  template <>
-  struct StructExtends<AndroidHardwareBufferUsageANDROID, ImageFormatProperties2>
-  {
-    enum
-    {
-      value = true
-    };
-  };
-#endif /*VK_USE_PLATFORM_ANDROID_KHR*/
-  template <>
-  struct StructExtends<AttachmentDescriptionStencilLayout, AttachmentDescription2>
-  {
-    enum
-    {
-      value = true
-    };
-  };
-  template <>
-  struct StructExtends<AttachmentReferenceStencilLayout, AttachmentReference2>
-  {
-    enum
-    {
-      value = true
-    };
-  };
-  template <>
-  struct StructExtends<BindBufferMemoryDeviceGroupInfo, BindBufferMemoryInfo>
-  {
-    enum
-    {
-      value = true
-    };
-  };
-  template <>
-  struct StructExtends<BindImageMemoryDeviceGroupInfo, BindImageMemoryInfo>
-  {
-    enum
-    {
-      value = true
-    };
-  };
-  template <>
-  struct StructExtends<BindImageMemorySwapchainInfoKHR, BindImageMemoryInfo>
-  {
-    enum
-    {
-      value = true
-    };
-  };
-  template <>
-  struct StructExtends<BindImagePlaneMemoryInfo, BindImageMemoryInfo>
-  {
-    enum
-    {
-      value = true
-    };
-  };
-  template <>
-  struct StructExtends<BufferDeviceAddressCreateInfoEXT, BufferCreateInfo>
-  {
-    enum
-    {
-      value = true
-    };
-  };
-  template <>
-  struct StructExtends<BufferOpaqueCaptureAddressCreateInfo, BufferCreateInfo>
-  {
-    enum
-    {
-      value = true
-    };
-  };
-  template <>
-  struct StructExtends<CommandBufferInheritanceConditionalRenderingInfoEXT, CommandBufferInheritanceInfo>
-  {
-    enum
-    {
-      value = true
-    };
-  };
-  template <>
-  struct StructExtends<CommandBufferInheritanceRenderPassTransformInfoQCOM, CommandBufferInheritanceInfo>
-  {
-    enum
-    {
-      value = true
-    };
-  };
-  template <>
-  struct StructExtends<CommandBufferInheritanceViewportScissorInfoNV, CommandBufferInheritanceInfo>
-  {
-    enum
-    {
-      value = true
-    };
-  };
-  template <>
-  struct StructExtends<CopyCommandTransformInfoQCOM, BufferImageCopy2KHR>
-  {
-    enum
-    {
-      value = true
-    };
-  };
-  template <>
-  struct StructExtends<CopyCommandTransformInfoQCOM, ImageBlit2KHR>
-  {
-    enum
-    {
-      value = true
-    };
-  };
-#if defined( VK_USE_PLATFORM_WIN32_KHR )
-  template <>
-  struct StructExtends<D3D12FenceSubmitInfoKHR, SubmitInfo>
-  {
-    enum
-    {
-      value = true
-    };
-  };
-#endif /*VK_USE_PLATFORM_WIN32_KHR*/
-  template <>
-  struct StructExtends<DebugReportCallbackCreateInfoEXT, InstanceCreateInfo>
-  {
-    enum
-    {
-      value = true
-    };
-  };
-  template <>
-  struct StructExtends<DebugUtilsMessengerCreateInfoEXT, InstanceCreateInfo>
-  {
-    enum
-    {
-      value = true
-    };
-  };
-  template <>
-  struct StructExtends<DedicatedAllocationBufferCreateInfoNV, BufferCreateInfo>
-  {
-    enum
-    {
-      value = true
-    };
-  };
-  template <>
-  struct StructExtends<DedicatedAllocationImageCreateInfoNV, ImageCreateInfo>
-  {
-    enum
-    {
-      value = true
-    };
-  };
-  template <>
-  struct StructExtends<DedicatedAllocationMemoryAllocateInfoNV, MemoryAllocateInfo>
-  {
-    enum
-    {
-      value = true
-    };
-  };
-  template <>
-  struct StructExtends<DescriptorPoolInlineUniformBlockCreateInfoEXT, DescriptorPoolCreateInfo>
-  {
-    enum
-    {
-      value = true
-    };
-  };
-  template <>
-  struct StructExtends<DescriptorSetLayoutBindingFlagsCreateInfo, DescriptorSetLayoutCreateInfo>
-  {
-    enum
-    {
-      value = true
-    };
-  };
-  template <>
-  struct StructExtends<DescriptorSetVariableDescriptorCountAllocateInfo, DescriptorSetAllocateInfo>
-  {
-    enum
-    {
-      value = true
-    };
-  };
-  template <>
-  struct StructExtends<DescriptorSetVariableDescriptorCountLayoutSupport, DescriptorSetLayoutSupport>
-  {
-    enum
-    {
-      value = true
-    };
-  };
-  template <>
-  struct StructExtends<DeviceDeviceMemoryReportCreateInfoEXT, DeviceCreateInfo>
-  {
-    enum
-    {
-      value = true
-    };
-  };
-  template <>
-  struct StructExtends<DeviceDiagnosticsConfigCreateInfoNV, DeviceCreateInfo>
-  {
-    enum
-    {
-      value = true
-    };
-  };
-  template <>
-  struct StructExtends<DeviceGroupBindSparseInfo, BindSparseInfo>
-  {
-    enum
-    {
-      value = true
-    };
-  };
-  template <>
-  struct StructExtends<DeviceGroupCommandBufferBeginInfo, CommandBufferBeginInfo>
-  {
-    enum
-    {
-      value = true
-    };
-  };
-  template <>
-  struct StructExtends<DeviceGroupDeviceCreateInfo, DeviceCreateInfo>
-  {
-    enum
-    {
-      value = true
-    };
-  };
-  template <>
-  struct StructExtends<DeviceGroupPresentInfoKHR, PresentInfoKHR>
-  {
-    enum
-    {
-      value = true
-    };
-  };
-  template <>
-  struct StructExtends<DeviceGroupRenderPassBeginInfo, RenderPassBeginInfo>
-  {
-    enum
-    {
-      value = true
-    };
-  };
-  template <>
-  struct StructExtends<DeviceGroupSubmitInfo, SubmitInfo>
-  {
-    enum
-    {
-      value = true
-    };
-  };
-  template <>
-  struct StructExtends<DeviceGroupSwapchainCreateInfoKHR, SwapchainCreateInfoKHR>
-  {
-    enum
-    {
-      value = true
-    };
-  };
-  template <>
-  struct StructExtends<DeviceMemoryOverallocationCreateInfoAMD, DeviceCreateInfo>
-  {
-    enum
-    {
-      value = true
-    };
-  };
-  template <>
-  struct StructExtends<DevicePrivateDataCreateInfoEXT, DeviceCreateInfo>
-  {
-    enum
-    {
-      value = true
-    };
-  };
-  template <>
-  struct StructExtends<DeviceQueueGlobalPriorityCreateInfoEXT, DeviceQueueCreateInfo>
-  {
-    enum
-    {
-      value = true
-    };
-  };
-  template <>
-  struct StructExtends<DisplayNativeHdrSurfaceCapabilitiesAMD, SurfaceCapabilities2KHR>
-  {
-    enum
-    {
-      value = true
-    };
-  };
-  template <>
-  struct StructExtends<DisplayPresentInfoKHR, PresentInfoKHR>
-  {
-    enum
-    {
-      value = true
-    };
-  };
-  template <>
-  struct StructExtends<DrmFormatModifierPropertiesListEXT, FormatProperties2>
-  {
-    enum
-    {
-      value = true
-    };
-  };
-  template <>
-  struct StructExtends<ExportFenceCreateInfo, FenceCreateInfo>
-  {
-    enum
-    {
-      value = true
-    };
-  };
-#if defined( VK_USE_PLATFORM_WIN32_KHR )
-  template <>
-  struct StructExtends<ExportFenceWin32HandleInfoKHR, FenceCreateInfo>
-  {
-    enum
-    {
-      value = true
-    };
-  };
-#endif /*VK_USE_PLATFORM_WIN32_KHR*/
-  template <>
-  struct StructExtends<ExportMemoryAllocateInfo, MemoryAllocateInfo>
-  {
-    enum
-    {
-      value = true
-    };
-  };
-  template <>
-  struct StructExtends<ExportMemoryAllocateInfoNV, MemoryAllocateInfo>
-  {
-    enum
-    {
-      value = true
-    };
-  };
-#if defined( VK_USE_PLATFORM_WIN32_KHR )
-  template <>
-  struct StructExtends<ExportMemoryWin32HandleInfoKHR, MemoryAllocateInfo>
-  {
-    enum
-    {
-      value = true
-    };
-  };
-#endif /*VK_USE_PLATFORM_WIN32_KHR*/
-#if defined( VK_USE_PLATFORM_WIN32_KHR )
-  template <>
-  struct StructExtends<ExportMemoryWin32HandleInfoNV, MemoryAllocateInfo>
-  {
-    enum
-    {
-      value = true
-    };
-  };
-#endif /*VK_USE_PLATFORM_WIN32_KHR*/
-  template <>
-  struct StructExtends<ExportSemaphoreCreateInfo, SemaphoreCreateInfo>
-  {
-    enum
-    {
-      value = true
-    };
-  };
-#if defined( VK_USE_PLATFORM_WIN32_KHR )
-  template <>
-  struct StructExtends<ExportSemaphoreWin32HandleInfoKHR, SemaphoreCreateInfo>
-  {
-    enum
-    {
-      value = true
-    };
-  };
-#endif /*VK_USE_PLATFORM_WIN32_KHR*/
-#if defined( VK_USE_PLATFORM_ANDROID_KHR )
-  template <>
-  struct StructExtends<ExternalFormatANDROID, ImageCreateInfo>
-  {
-    enum
-    {
-      value = true
-    };
-  };
-  template <>
-  struct StructExtends<ExternalFormatANDROID, SamplerYcbcrConversionCreateInfo>
-  {
-    enum
-    {
-      value = true
-    };
-  };
-#endif /*VK_USE_PLATFORM_ANDROID_KHR*/
-  template <>
-  struct StructExtends<ExternalImageFormatProperties, ImageFormatProperties2>
-  {
-    enum
-    {
-      value = true
-    };
-  };
-  template <>
-  struct StructExtends<ExternalMemoryBufferCreateInfo, BufferCreateInfo>
-  {
-    enum
-    {
-      value = true
-    };
-  };
-  template <>
-  struct StructExtends<ExternalMemoryImageCreateInfo, ImageCreateInfo>
-  {
-    enum
-    {
-      value = true
-    };
-  };
-  template <>
-  struct StructExtends<ExternalMemoryImageCreateInfoNV, ImageCreateInfo>
-  {
-    enum
-    {
-      value = true
-    };
-  };
-  template <>
-  struct StructExtends<FilterCubicImageViewImageFormatPropertiesEXT, ImageFormatProperties2>
-  {
-    enum
-    {
-      value = true
-    };
-  };
-  template <>
-  struct StructExtends<FragmentShadingRateAttachmentInfoKHR, SubpassDescription2>
-  {
-    enum
-    {
-      value = true
-    };
-  };
-  template <>
-  struct StructExtends<FramebufferAttachmentsCreateInfo, FramebufferCreateInfo>
-  {
-    enum
-    {
-      value = true
-    };
-  };
-  template <>
-  struct StructExtends<GraphicsPipelineShaderGroupsCreateInfoNV, GraphicsPipelineCreateInfo>
-  {
-    enum
-    {
-      value = true
-    };
-  };
-  template <>
-  struct StructExtends<ImageDrmFormatModifierExplicitCreateInfoEXT, ImageCreateInfo>
-  {
-    enum
-    {
-      value = true
-    };
-  };
-  template <>
-  struct StructExtends<ImageDrmFormatModifierListCreateInfoEXT, ImageCreateInfo>
-  {
-    enum
-    {
-      value = true
-    };
-  };
-  template <>
-  struct StructExtends<ImageFormatListCreateInfo, ImageCreateInfo>
-  {
-    enum
-    {
-      value = true
-    };
-  };
-  template <>
-  struct StructExtends<ImageFormatListCreateInfo, SwapchainCreateInfoKHR>
-  {
-    enum
-    {
-      value = true
-    };
-  };
-  template <>
-  struct StructExtends<ImageFormatListCreateInfo, PhysicalDeviceImageFormatInfo2>
-  {
-    enum
-    {
-      value = true
-    };
-  };
-  template <>
-  struct StructExtends<ImagePlaneMemoryRequirementsInfo, ImageMemoryRequirementsInfo2>
-  {
-    enum
-    {
-      value = true
-    };
-  };
-  template <>
-  struct StructExtends<ImageStencilUsageCreateInfo, ImageCreateInfo>
-  {
-    enum
-    {
-      value = true
-    };
-  };
-  template <>
-  struct StructExtends<ImageStencilUsageCreateInfo, PhysicalDeviceImageFormatInfo2>
-  {
-    enum
-    {
-      value = true
-    };
-  };
-  template <>
-  struct StructExtends<ImageSwapchainCreateInfoKHR, ImageCreateInfo>
-  {
-    enum
-    {
-      value = true
-    };
-  };
-  template <>
-  struct StructExtends<ImageViewASTCDecodeModeEXT, ImageViewCreateInfo>
-  {
-    enum
-    {
-      value = true
-    };
-  };
-  template <>
-  struct StructExtends<ImageViewUsageCreateInfo, ImageViewCreateInfo>
-  {
-    enum
-    {
-      value = true
-    };
-  };
-#if defined( VK_USE_PLATFORM_ANDROID_KHR )
-  template <>
-  struct StructExtends<ImportAndroidHardwareBufferInfoANDROID, MemoryAllocateInfo>
-  {
-    enum
-    {
-      value = true
-    };
-  };
-#endif /*VK_USE_PLATFORM_ANDROID_KHR*/
-  template <>
-  struct StructExtends<ImportMemoryFdInfoKHR, MemoryAllocateInfo>
-  {
-    enum
-    {
-      value = true
-    };
-  };
-  template <>
-  struct StructExtends<ImportMemoryHostPointerInfoEXT, MemoryAllocateInfo>
-  {
-    enum
-    {
-      value = true
-    };
-  };
-#if defined( VK_USE_PLATFORM_WIN32_KHR )
-  template <>
-  struct StructExtends<ImportMemoryWin32HandleInfoKHR, MemoryAllocateInfo>
-  {
-    enum
-    {
-      value = true
-    };
-  };
-#endif /*VK_USE_PLATFORM_WIN32_KHR*/
-#if defined( VK_USE_PLATFORM_WIN32_KHR )
-  template <>
-  struct StructExtends<ImportMemoryWin32HandleInfoNV, MemoryAllocateInfo>
-  {
-    enum
-    {
-      value = true
-    };
-  };
-#endif /*VK_USE_PLATFORM_WIN32_KHR*/
-#if defined( VK_USE_PLATFORM_FUCHSIA )
-  template <>
-  struct StructExtends<ImportMemoryZirconHandleInfoFUCHSIA, MemoryAllocateInfo>
-  {
-    enum
-    {
-      value = true
-    };
-  };
-#endif /*VK_USE_PLATFORM_FUCHSIA*/
-  template <>
-  struct StructExtends<MemoryAllocateFlagsInfo, MemoryAllocateInfo>
-  {
-    enum
-    {
-      value = true
-    };
-  };
-  template <>
-  struct StructExtends<MemoryBarrier2KHR, SubpassDependency2>
-  {
-    enum
-    {
-      value = true
-    };
-  };
-  template <>
-  struct StructExtends<MemoryDedicatedAllocateInfo, MemoryAllocateInfo>
-  {
-    enum
-    {
-      value = true
-    };
-  };
-  template <>
-  struct StructExtends<MemoryDedicatedRequirements, MemoryRequirements2>
-  {
-    enum
-    {
-      value = true
-    };
-  };
-  template <>
-  struct StructExtends<MemoryOpaqueCaptureAddressAllocateInfo, MemoryAllocateInfo>
-  {
-    enum
-    {
-      value = true
-    };
-  };
-  template <>
-  struct StructExtends<MemoryPriorityAllocateInfoEXT, MemoryAllocateInfo>
-  {
-    enum
-    {
-      value = true
-    };
-  };
-  template <>
-  struct StructExtends<MutableDescriptorTypeCreateInfoVALVE, DescriptorSetLayoutCreateInfo>
-  {
-    enum
-    {
-      value = true
-    };
-  };
-  template <>
-  struct StructExtends<MutableDescriptorTypeCreateInfoVALVE, DescriptorPoolCreateInfo>
-  {
-    enum
-    {
-      value = true
-    };
-  };
-  template <>
-  struct StructExtends<PerformanceQuerySubmitInfoKHR, SubmitInfo>
-  {
-    enum
-    {
-      value = true
-    };
-  };
-  template <>
-  struct StructExtends<PerformanceQuerySubmitInfoKHR, SubmitInfo2KHR>
+  struct StructExtends<PhysicalDeviceSubgroupProperties, PhysicalDeviceProperties2>
   {
     enum
     {
@@ -7157,7 +6570,7 @@
     };
   };
   template <>
-  struct StructExtends<PhysicalDevice4444FormatsFeaturesEXT, PhysicalDeviceFeatures2>
+  struct StructExtends<MemoryDedicatedRequirements, MemoryRequirements2>
   {
     enum
     {
@@ -7165,7 +6578,7 @@
     };
   };
   template <>
-  struct StructExtends<PhysicalDevice4444FormatsFeaturesEXT, DeviceCreateInfo>
+  struct StructExtends<MemoryDedicatedAllocateInfo, MemoryAllocateInfo>
   {
     enum
     {
@@ -7173,7 +6586,7 @@
     };
   };
   template <>
-  struct StructExtends<PhysicalDevice8BitStorageFeatures, PhysicalDeviceFeatures2>
+  struct StructExtends<MemoryAllocateFlagsInfo, MemoryAllocateInfo>
   {
     enum
     {
@@ -7181,7 +6594,7 @@
     };
   };
   template <>
-  struct StructExtends<PhysicalDevice8BitStorageFeatures, DeviceCreateInfo>
+  struct StructExtends<DeviceGroupRenderPassBeginInfo, RenderPassBeginInfo>
   {
     enum
     {
@@ -7189,7 +6602,7 @@
     };
   };
   template <>
-  struct StructExtends<PhysicalDeviceASTCDecodeFeaturesEXT, PhysicalDeviceFeatures2>
+  struct StructExtends<DeviceGroupCommandBufferBeginInfo, CommandBufferBeginInfo>
   {
     enum
     {
@@ -7197,7 +6610,7 @@
     };
   };
   template <>
-  struct StructExtends<PhysicalDeviceASTCDecodeFeaturesEXT, DeviceCreateInfo>
+  struct StructExtends<DeviceGroupSubmitInfo, SubmitInfo>
   {
     enum
     {
@@ -7205,7 +6618,7 @@
     };
   };
   template <>
-  struct StructExtends<PhysicalDeviceAccelerationStructureFeaturesKHR, PhysicalDeviceFeatures2>
+  struct StructExtends<DeviceGroupBindSparseInfo, BindSparseInfo>
   {
     enum
     {
@@ -7213,7 +6626,7 @@
     };
   };
   template <>
-  struct StructExtends<PhysicalDeviceAccelerationStructureFeaturesKHR, DeviceCreateInfo>
+  struct StructExtends<BindBufferMemoryDeviceGroupInfo, BindBufferMemoryInfo>
   {
     enum
     {
@@ -7221,7 +6634,7 @@
     };
   };
   template <>
-  struct StructExtends<PhysicalDeviceAccelerationStructurePropertiesKHR, PhysicalDeviceProperties2>
+  struct StructExtends<BindImageMemoryDeviceGroupInfo, BindImageMemoryInfo>
   {
     enum
     {
@@ -7229,431 +6642,7 @@
     };
   };
   template <>
-  struct StructExtends<PhysicalDeviceBlendOperationAdvancedFeaturesEXT, PhysicalDeviceFeatures2>
-  {
-    enum
-    {
-      value = true
-    };
-  };
-  template <>
-  struct StructExtends<PhysicalDeviceBlendOperationAdvancedFeaturesEXT, DeviceCreateInfo>
-  {
-    enum
-    {
-      value = true
-    };
-  };
-  template <>
-  struct StructExtends<PhysicalDeviceBlendOperationAdvancedPropertiesEXT, PhysicalDeviceProperties2>
-  {
-    enum
-    {
-      value = true
-    };
-  };
-  template <>
-  struct StructExtends<PhysicalDeviceBufferDeviceAddressFeatures, PhysicalDeviceFeatures2>
-  {
-    enum
-    {
-      value = true
-    };
-  };
-  template <>
-  struct StructExtends<PhysicalDeviceBufferDeviceAddressFeatures, DeviceCreateInfo>
-  {
-    enum
-    {
-      value = true
-    };
-  };
-  template <>
-  struct StructExtends<PhysicalDeviceBufferDeviceAddressFeaturesEXT, PhysicalDeviceFeatures2>
-  {
-    enum
-    {
-      value = true
-    };
-  };
-  template <>
-  struct StructExtends<PhysicalDeviceBufferDeviceAddressFeaturesEXT, DeviceCreateInfo>
-  {
-    enum
-    {
-      value = true
-    };
-  };
-  template <>
-  struct StructExtends<PhysicalDeviceCoherentMemoryFeaturesAMD, PhysicalDeviceFeatures2>
-  {
-    enum
-    {
-      value = true
-    };
-  };
-  template <>
-  struct StructExtends<PhysicalDeviceCoherentMemoryFeaturesAMD, DeviceCreateInfo>
-  {
-    enum
-    {
-      value = true
-    };
-  };
-  template <>
-  struct StructExtends<PhysicalDeviceColorWriteEnableFeaturesEXT, PhysicalDeviceFeatures2>
-  {
-    enum
-    {
-      value = true
-    };
-  };
-  template <>
-  struct StructExtends<PhysicalDeviceColorWriteEnableFeaturesEXT, DeviceCreateInfo>
-  {
-    enum
-    {
-      value = true
-    };
-  };
-  template <>
-  struct StructExtends<PhysicalDeviceComputeShaderDerivativesFeaturesNV, PhysicalDeviceFeatures2>
-  {
-    enum
-    {
-      value = true
-    };
-  };
-  template <>
-  struct StructExtends<PhysicalDeviceComputeShaderDerivativesFeaturesNV, DeviceCreateInfo>
-  {
-    enum
-    {
-      value = true
-    };
-  };
-  template <>
-  struct StructExtends<PhysicalDeviceConditionalRenderingFeaturesEXT, PhysicalDeviceFeatures2>
-  {
-    enum
-    {
-      value = true
-    };
-  };
-  template <>
-  struct StructExtends<PhysicalDeviceConditionalRenderingFeaturesEXT, DeviceCreateInfo>
-  {
-    enum
-    {
-      value = true
-    };
-  };
-  template <>
-  struct StructExtends<PhysicalDeviceConservativeRasterizationPropertiesEXT, PhysicalDeviceProperties2>
-  {
-    enum
-    {
-      value = true
-    };
-  };
-  template <>
-  struct StructExtends<PhysicalDeviceCooperativeMatrixFeaturesNV, PhysicalDeviceFeatures2>
-  {
-    enum
-    {
-      value = true
-    };
-  };
-  template <>
-  struct StructExtends<PhysicalDeviceCooperativeMatrixFeaturesNV, DeviceCreateInfo>
-  {
-    enum
-    {
-      value = true
-    };
-  };
-  template <>
-  struct StructExtends<PhysicalDeviceCooperativeMatrixPropertiesNV, PhysicalDeviceProperties2>
-  {
-    enum
-    {
-      value = true
-    };
-  };
-  template <>
-  struct StructExtends<PhysicalDeviceCornerSampledImageFeaturesNV, PhysicalDeviceFeatures2>
-  {
-    enum
-    {
-      value = true
-    };
-  };
-  template <>
-  struct StructExtends<PhysicalDeviceCornerSampledImageFeaturesNV, DeviceCreateInfo>
-  {
-    enum
-    {
-      value = true
-    };
-  };
-  template <>
-  struct StructExtends<PhysicalDeviceCoverageReductionModeFeaturesNV, PhysicalDeviceFeatures2>
-  {
-    enum
-    {
-      value = true
-    };
-  };
-  template <>
-  struct StructExtends<PhysicalDeviceCoverageReductionModeFeaturesNV, DeviceCreateInfo>
-  {
-    enum
-    {
-      value = true
-    };
-  };
-  template <>
-  struct StructExtends<PhysicalDeviceCustomBorderColorFeaturesEXT, PhysicalDeviceFeatures2>
-  {
-    enum
-    {
-      value = true
-    };
-  };
-  template <>
-  struct StructExtends<PhysicalDeviceCustomBorderColorFeaturesEXT, DeviceCreateInfo>
-  {
-    enum
-    {
-      value = true
-    };
-  };
-  template <>
-  struct StructExtends<PhysicalDeviceCustomBorderColorPropertiesEXT, PhysicalDeviceProperties2>
-  {
-    enum
-    {
-      value = true
-    };
-  };
-  template <>
-  struct StructExtends<PhysicalDeviceDedicatedAllocationImageAliasingFeaturesNV, PhysicalDeviceFeatures2>
-  {
-    enum
-    {
-      value = true
-    };
-  };
-  template <>
-  struct StructExtends<PhysicalDeviceDedicatedAllocationImageAliasingFeaturesNV, DeviceCreateInfo>
-  {
-    enum
-    {
-      value = true
-    };
-  };
-  template <>
-  struct StructExtends<PhysicalDeviceDepthClipEnableFeaturesEXT, PhysicalDeviceFeatures2>
-  {
-    enum
-    {
-      value = true
-    };
-  };
-  template <>
-  struct StructExtends<PhysicalDeviceDepthClipEnableFeaturesEXT, DeviceCreateInfo>
-  {
-    enum
-    {
-      value = true
-    };
-  };
-  template <>
-  struct StructExtends<PhysicalDeviceDepthStencilResolveProperties, PhysicalDeviceProperties2>
-  {
-    enum
-    {
-      value = true
-    };
-  };
-  template <>
-  struct StructExtends<PhysicalDeviceDescriptorIndexingFeatures, PhysicalDeviceFeatures2>
-  {
-    enum
-    {
-      value = true
-    };
-  };
-  template <>
-  struct StructExtends<PhysicalDeviceDescriptorIndexingFeatures, DeviceCreateInfo>
-  {
-    enum
-    {
-      value = true
-    };
-  };
-  template <>
-  struct StructExtends<PhysicalDeviceDescriptorIndexingProperties, PhysicalDeviceProperties2>
-  {
-    enum
-    {
-      value = true
-    };
-  };
-  template <>
-  struct StructExtends<PhysicalDeviceDeviceGeneratedCommandsFeaturesNV, PhysicalDeviceFeatures2>
-  {
-    enum
-    {
-      value = true
-    };
-  };
-  template <>
-  struct StructExtends<PhysicalDeviceDeviceGeneratedCommandsFeaturesNV, DeviceCreateInfo>
-  {
-    enum
-    {
-      value = true
-    };
-  };
-  template <>
-  struct StructExtends<PhysicalDeviceDeviceGeneratedCommandsPropertiesNV, PhysicalDeviceProperties2>
-  {
-    enum
-    {
-      value = true
-    };
-  };
-  template <>
-  struct StructExtends<PhysicalDeviceDeviceMemoryReportFeaturesEXT, PhysicalDeviceFeatures2>
-  {
-    enum
-    {
-      value = true
-    };
-  };
-  template <>
-  struct StructExtends<PhysicalDeviceDeviceMemoryReportFeaturesEXT, DeviceCreateInfo>
-  {
-    enum
-    {
-      value = true
-    };
-  };
-  template <>
-  struct StructExtends<PhysicalDeviceDiagnosticsConfigFeaturesNV, PhysicalDeviceFeatures2>
-  {
-    enum
-    {
-      value = true
-    };
-  };
-  template <>
-  struct StructExtends<PhysicalDeviceDiagnosticsConfigFeaturesNV, DeviceCreateInfo>
-  {
-    enum
-    {
-      value = true
-    };
-  };
-  template <>
-  struct StructExtends<PhysicalDeviceDiscardRectanglePropertiesEXT, PhysicalDeviceProperties2>
-  {
-    enum
-    {
-      value = true
-    };
-  };
-  template <>
-  struct StructExtends<PhysicalDeviceDriverProperties, PhysicalDeviceProperties2>
-  {
-    enum
-    {
-      value = true
-    };
-  };
-  template <>
-  struct StructExtends<PhysicalDeviceDrmPropertiesEXT, PhysicalDeviceProperties2>
-  {
-    enum
-    {
-      value = true
-    };
-  };
-  template <>
-  struct StructExtends<PhysicalDeviceExclusiveScissorFeaturesNV, PhysicalDeviceFeatures2>
-  {
-    enum
-    {
-      value = true
-    };
-  };
-  template <>
-  struct StructExtends<PhysicalDeviceExclusiveScissorFeaturesNV, DeviceCreateInfo>
-  {
-    enum
-    {
-      value = true
-    };
-  };
-  template <>
-  struct StructExtends<PhysicalDeviceExtendedDynamicState2FeaturesEXT, PhysicalDeviceFeatures2>
-  {
-    enum
-    {
-      value = true
-    };
-  };
-  template <>
-  struct StructExtends<PhysicalDeviceExtendedDynamicState2FeaturesEXT, DeviceCreateInfo>
-  {
-    enum
-    {
-      value = true
-    };
-  };
-  template <>
-  struct StructExtends<PhysicalDeviceExtendedDynamicStateFeaturesEXT, PhysicalDeviceFeatures2>
-  {
-    enum
-    {
-      value = true
-    };
-  };
-  template <>
-  struct StructExtends<PhysicalDeviceExtendedDynamicStateFeaturesEXT, DeviceCreateInfo>
-  {
-    enum
-    {
-      value = true
-    };
-  };
-  template <>
-  struct StructExtends<PhysicalDeviceExternalImageFormatInfo, PhysicalDeviceImageFormatInfo2>
-  {
-    enum
-    {
-      value = true
-    };
-  };
-  template <>
-  struct StructExtends<PhysicalDeviceExternalMemoryHostPropertiesEXT, PhysicalDeviceProperties2>
-  {
-    enum
-    {
-      value = true
-    };
-  };
-  template <>
-  struct StructExtends<PhysicalDeviceExternalMemoryRDMAFeaturesNV, PhysicalDeviceFeatures2>
-  {
-    enum
-    {
-      value = true
-    };
-  };
-  template <>
-  struct StructExtends<PhysicalDeviceExternalMemoryRDMAFeaturesNV, DeviceCreateInfo>
+  struct StructExtends<DeviceGroupDeviceCreateInfo, DeviceCreateInfo>
   {
     enum
     {
@@ -7669,7 +6658,7 @@
     };
   };
   template <>
-  struct StructExtends<PhysicalDeviceFloatControlsProperties, PhysicalDeviceProperties2>
+  struct StructExtends<PhysicalDevicePointClippingProperties, PhysicalDeviceProperties2>
   {
     enum
     {
@@ -7677,7 +6666,7 @@
     };
   };
   template <>
-  struct StructExtends<PhysicalDeviceFragmentDensityMap2FeaturesEXT, PhysicalDeviceFeatures2>
+  struct StructExtends<RenderPassInputAttachmentAspectCreateInfo, RenderPassCreateInfo>
   {
     enum
     {
@@ -7685,7 +6674,7 @@
     };
   };
   template <>
-  struct StructExtends<PhysicalDeviceFragmentDensityMap2FeaturesEXT, DeviceCreateInfo>
+  struct StructExtends<ImageViewUsageCreateInfo, ImageViewCreateInfo>
   {
     enum
     {
@@ -7693,7 +6682,7 @@
     };
   };
   template <>
-  struct StructExtends<PhysicalDeviceFragmentDensityMap2PropertiesEXT, PhysicalDeviceProperties2>
+  struct StructExtends<PipelineTessellationDomainOriginStateCreateInfo, PipelineTessellationStateCreateInfo>
   {
     enum
     {
@@ -7701,351 +6690,7 @@
     };
   };
   template <>
-  struct StructExtends<PhysicalDeviceFragmentDensityMapFeaturesEXT, PhysicalDeviceFeatures2>
-  {
-    enum
-    {
-      value = true
-    };
-  };
-  template <>
-  struct StructExtends<PhysicalDeviceFragmentDensityMapFeaturesEXT, DeviceCreateInfo>
-  {
-    enum
-    {
-      value = true
-    };
-  };
-  template <>
-  struct StructExtends<PhysicalDeviceFragmentDensityMapPropertiesEXT, PhysicalDeviceProperties2>
-  {
-    enum
-    {
-      value = true
-    };
-  };
-  template <>
-  struct StructExtends<PhysicalDeviceFragmentShaderBarycentricFeaturesNV, PhysicalDeviceFeatures2>
-  {
-    enum
-    {
-      value = true
-    };
-  };
-  template <>
-  struct StructExtends<PhysicalDeviceFragmentShaderBarycentricFeaturesNV, DeviceCreateInfo>
-  {
-    enum
-    {
-      value = true
-    };
-  };
-  template <>
-  struct StructExtends<PhysicalDeviceFragmentShaderInterlockFeaturesEXT, PhysicalDeviceFeatures2>
-  {
-    enum
-    {
-      value = true
-    };
-  };
-  template <>
-  struct StructExtends<PhysicalDeviceFragmentShaderInterlockFeaturesEXT, DeviceCreateInfo>
-  {
-    enum
-    {
-      value = true
-    };
-  };
-  template <>
-  struct StructExtends<PhysicalDeviceFragmentShadingRateEnumsFeaturesNV, PhysicalDeviceFeatures2>
-  {
-    enum
-    {
-      value = true
-    };
-  };
-  template <>
-  struct StructExtends<PhysicalDeviceFragmentShadingRateEnumsFeaturesNV, DeviceCreateInfo>
-  {
-    enum
-    {
-      value = true
-    };
-  };
-  template <>
-  struct StructExtends<PhysicalDeviceFragmentShadingRateEnumsPropertiesNV, PhysicalDeviceProperties2>
-  {
-    enum
-    {
-      value = true
-    };
-  };
-  template <>
-  struct StructExtends<PhysicalDeviceFragmentShadingRateFeaturesKHR, PhysicalDeviceFeatures2>
-  {
-    enum
-    {
-      value = true
-    };
-  };
-  template <>
-  struct StructExtends<PhysicalDeviceFragmentShadingRateFeaturesKHR, DeviceCreateInfo>
-  {
-    enum
-    {
-      value = true
-    };
-  };
-  template <>
-  struct StructExtends<PhysicalDeviceFragmentShadingRatePropertiesKHR, PhysicalDeviceProperties2>
-  {
-    enum
-    {
-      value = true
-    };
-  };
-  template <>
-  struct StructExtends<PhysicalDeviceGlobalPriorityQueryFeaturesEXT, PhysicalDeviceFeatures2>
-  {
-    enum
-    {
-      value = true
-    };
-  };
-  template <>
-  struct StructExtends<PhysicalDeviceGlobalPriorityQueryFeaturesEXT, DeviceCreateInfo>
-  {
-    enum
-    {
-      value = true
-    };
-  };
-  template <>
-  struct StructExtends<PhysicalDeviceHostQueryResetFeatures, PhysicalDeviceFeatures2>
-  {
-    enum
-    {
-      value = true
-    };
-  };
-  template <>
-  struct StructExtends<PhysicalDeviceHostQueryResetFeatures, DeviceCreateInfo>
-  {
-    enum
-    {
-      value = true
-    };
-  };
-  template <>
-  struct StructExtends<PhysicalDeviceIDProperties, PhysicalDeviceProperties2>
-  {
-    enum
-    {
-      value = true
-    };
-  };
-  template <>
-  struct StructExtends<PhysicalDeviceImageDrmFormatModifierInfoEXT, PhysicalDeviceImageFormatInfo2>
-  {
-    enum
-    {
-      value = true
-    };
-  };
-  template <>
-  struct StructExtends<PhysicalDeviceImageRobustnessFeaturesEXT, PhysicalDeviceFeatures2>
-  {
-    enum
-    {
-      value = true
-    };
-  };
-  template <>
-  struct StructExtends<PhysicalDeviceImageRobustnessFeaturesEXT, DeviceCreateInfo>
-  {
-    enum
-    {
-      value = true
-    };
-  };
-  template <>
-  struct StructExtends<PhysicalDeviceImageViewImageFormatInfoEXT, PhysicalDeviceImageFormatInfo2>
-  {
-    enum
-    {
-      value = true
-    };
-  };
-  template <>
-  struct StructExtends<PhysicalDeviceImagelessFramebufferFeatures, PhysicalDeviceFeatures2>
-  {
-    enum
-    {
-      value = true
-    };
-  };
-  template <>
-  struct StructExtends<PhysicalDeviceImagelessFramebufferFeatures, DeviceCreateInfo>
-  {
-    enum
-    {
-      value = true
-    };
-  };
-  template <>
-  struct StructExtends<PhysicalDeviceIndexTypeUint8FeaturesEXT, PhysicalDeviceFeatures2>
-  {
-    enum
-    {
-      value = true
-    };
-  };
-  template <>
-  struct StructExtends<PhysicalDeviceIndexTypeUint8FeaturesEXT, DeviceCreateInfo>
-  {
-    enum
-    {
-      value = true
-    };
-  };
-  template <>
-  struct StructExtends<PhysicalDeviceInheritedViewportScissorFeaturesNV, PhysicalDeviceFeatures2>
-  {
-    enum
-    {
-      value = true
-    };
-  };
-  template <>
-  struct StructExtends<PhysicalDeviceInheritedViewportScissorFeaturesNV, DeviceCreateInfo>
-  {
-    enum
-    {
-      value = true
-    };
-  };
-  template <>
-  struct StructExtends<PhysicalDeviceInlineUniformBlockFeaturesEXT, PhysicalDeviceFeatures2>
-  {
-    enum
-    {
-      value = true
-    };
-  };
-  template <>
-  struct StructExtends<PhysicalDeviceInlineUniformBlockFeaturesEXT, DeviceCreateInfo>
-  {
-    enum
-    {
-      value = true
-    };
-  };
-  template <>
-  struct StructExtends<PhysicalDeviceInlineUniformBlockPropertiesEXT, PhysicalDeviceProperties2>
-  {
-    enum
-    {
-      value = true
-    };
-  };
-  template <>
-  struct StructExtends<PhysicalDeviceLineRasterizationFeaturesEXT, PhysicalDeviceFeatures2>
-  {
-    enum
-    {
-      value = true
-    };
-  };
-  template <>
-  struct StructExtends<PhysicalDeviceLineRasterizationFeaturesEXT, DeviceCreateInfo>
-  {
-    enum
-    {
-      value = true
-    };
-  };
-  template <>
-  struct StructExtends<PhysicalDeviceLineRasterizationPropertiesEXT, PhysicalDeviceProperties2>
-  {
-    enum
-    {
-      value = true
-    };
-  };
-  template <>
-  struct StructExtends<PhysicalDeviceMaintenance3Properties, PhysicalDeviceProperties2>
-  {
-    enum
-    {
-      value = true
-    };
-  };
-  template <>
-  struct StructExtends<PhysicalDeviceMemoryBudgetPropertiesEXT, PhysicalDeviceMemoryProperties2>
-  {
-    enum
-    {
-      value = true
-    };
-  };
-  template <>
-  struct StructExtends<PhysicalDeviceMemoryPriorityFeaturesEXT, PhysicalDeviceFeatures2>
-  {
-    enum
-    {
-      value = true
-    };
-  };
-  template <>
-  struct StructExtends<PhysicalDeviceMemoryPriorityFeaturesEXT, DeviceCreateInfo>
-  {
-    enum
-    {
-      value = true
-    };
-  };
-  template <>
-  struct StructExtends<PhysicalDeviceMeshShaderFeaturesNV, PhysicalDeviceFeatures2>
-  {
-    enum
-    {
-      value = true
-    };
-  };
-  template <>
-  struct StructExtends<PhysicalDeviceMeshShaderFeaturesNV, DeviceCreateInfo>
-  {
-    enum
-    {
-      value = true
-    };
-  };
-  template <>
-  struct StructExtends<PhysicalDeviceMeshShaderPropertiesNV, PhysicalDeviceProperties2>
-  {
-    enum
-    {
-      value = true
-    };
-  };
-  template <>
-  struct StructExtends<PhysicalDeviceMultiDrawFeaturesEXT, PhysicalDeviceFeatures2>
-  {
-    enum
-    {
-      value = true
-    };
-  };
-  template <>
-  struct StructExtends<PhysicalDeviceMultiDrawFeaturesEXT, DeviceCreateInfo>
-  {
-    enum
-    {
-      value = true
-    };
-  };
-  template <>
-  struct StructExtends<PhysicalDeviceMultiDrawPropertiesEXT, PhysicalDeviceProperties2>
+  struct StructExtends<RenderPassMultiviewCreateInfo, RenderPassCreateInfo>
   {
     enum
     {
@@ -8069,14 +6714,6 @@
     };
   };
   template <>
-  struct StructExtends<PhysicalDeviceMultiviewPerViewAttributesPropertiesNVX, PhysicalDeviceProperties2>
-  {
-    enum
-    {
-      value = true
-    };
-  };
-  template <>
   struct StructExtends<PhysicalDeviceMultiviewProperties, PhysicalDeviceProperties2>
   {
     enum
@@ -8085,7 +6722,7 @@
     };
   };
   template <>
-  struct StructExtends<PhysicalDeviceMutableDescriptorTypeFeaturesVALVE, PhysicalDeviceFeatures2>
+  struct StructExtends<PhysicalDeviceVariablePointersFeatures, PhysicalDeviceFeatures2>
   {
     enum
     {
@@ -8093,123 +6730,7 @@
     };
   };
   template <>
-  struct StructExtends<PhysicalDeviceMutableDescriptorTypeFeaturesVALVE, DeviceCreateInfo>
-  {
-    enum
-    {
-      value = true
-    };
-  };
-  template <>
-  struct StructExtends<PhysicalDevicePCIBusInfoPropertiesEXT, PhysicalDeviceProperties2>
-  {
-    enum
-    {
-      value = true
-    };
-  };
-  template <>
-  struct StructExtends<PhysicalDevicePerformanceQueryFeaturesKHR, PhysicalDeviceFeatures2>
-  {
-    enum
-    {
-      value = true
-    };
-  };
-  template <>
-  struct StructExtends<PhysicalDevicePerformanceQueryFeaturesKHR, DeviceCreateInfo>
-  {
-    enum
-    {
-      value = true
-    };
-  };
-  template <>
-  struct StructExtends<PhysicalDevicePerformanceQueryPropertiesKHR, PhysicalDeviceProperties2>
-  {
-    enum
-    {
-      value = true
-    };
-  };
-  template <>
-  struct StructExtends<PhysicalDevicePipelineCreationCacheControlFeaturesEXT, PhysicalDeviceFeatures2>
-  {
-    enum
-    {
-      value = true
-    };
-  };
-  template <>
-  struct StructExtends<PhysicalDevicePipelineCreationCacheControlFeaturesEXT, DeviceCreateInfo>
-  {
-    enum
-    {
-      value = true
-    };
-  };
-  template <>
-  struct StructExtends<PhysicalDevicePipelineExecutablePropertiesFeaturesKHR, PhysicalDeviceFeatures2>
-  {
-    enum
-    {
-      value = true
-    };
-  };
-  template <>
-  struct StructExtends<PhysicalDevicePipelineExecutablePropertiesFeaturesKHR, DeviceCreateInfo>
-  {
-    enum
-    {
-      value = true
-    };
-  };
-  template <>
-  struct StructExtends<PhysicalDevicePointClippingProperties, PhysicalDeviceProperties2>
-  {
-    enum
-    {
-      value = true
-    };
-  };
-#if defined( VK_ENABLE_BETA_EXTENSIONS )
-  template <>
-  struct StructExtends<PhysicalDevicePortabilitySubsetFeaturesKHR, PhysicalDeviceFeatures2>
-  {
-    enum
-    {
-      value = true
-    };
-  };
-  template <>
-  struct StructExtends<PhysicalDevicePortabilitySubsetFeaturesKHR, DeviceCreateInfo>
-  {
-    enum
-    {
-      value = true
-    };
-  };
-#endif /*VK_ENABLE_BETA_EXTENSIONS*/
-#if defined( VK_ENABLE_BETA_EXTENSIONS )
-  template <>
-  struct StructExtends<PhysicalDevicePortabilitySubsetPropertiesKHR, PhysicalDeviceProperties2>
-  {
-    enum
-    {
-      value = true
-    };
-  };
-#endif /*VK_ENABLE_BETA_EXTENSIONS*/
-  template <>
-  struct StructExtends<PhysicalDevicePrivateDataFeaturesEXT, PhysicalDeviceFeatures2>
-  {
-    enum
-    {
-      value = true
-    };
-  };
-  template <>
-  struct StructExtends<PhysicalDevicePrivateDataFeaturesEXT, DeviceCreateInfo>
+  struct StructExtends<PhysicalDeviceVariablePointersFeatures, DeviceCreateInfo>
   {
     enum
     {
@@ -8241,7 +6762,7 @@
     };
   };
   template <>
-  struct StructExtends<PhysicalDeviceProvokingVertexFeaturesEXT, PhysicalDeviceFeatures2>
+  struct StructExtends<ProtectedSubmitInfo, SubmitInfo>
   {
     enum
     {
@@ -8249,7 +6770,7 @@
     };
   };
   template <>
-  struct StructExtends<PhysicalDeviceProvokingVertexFeaturesEXT, DeviceCreateInfo>
+  struct StructExtends<SamplerYcbcrConversionInfo, SamplerCreateInfo>
   {
     enum
     {
@@ -8257,7 +6778,7 @@
     };
   };
   template <>
-  struct StructExtends<PhysicalDeviceProvokingVertexPropertiesEXT, PhysicalDeviceProperties2>
+  struct StructExtends<SamplerYcbcrConversionInfo, ImageViewCreateInfo>
   {
     enum
     {
@@ -8265,7 +6786,7 @@
     };
   };
   template <>
-  struct StructExtends<PhysicalDevicePushDescriptorPropertiesKHR, PhysicalDeviceProperties2>
+  struct StructExtends<BindImagePlaneMemoryInfo, BindImageMemoryInfo>
   {
     enum
     {
@@ -8273,119 +6794,7 @@
     };
   };
   template <>
-  struct StructExtends<PhysicalDeviceRayQueryFeaturesKHR, PhysicalDeviceFeatures2>
-  {
-    enum
-    {
-      value = true
-    };
-  };
-  template <>
-  struct StructExtends<PhysicalDeviceRayQueryFeaturesKHR, DeviceCreateInfo>
-  {
-    enum
-    {
-      value = true
-    };
-  };
-  template <>
-  struct StructExtends<PhysicalDeviceRayTracingMotionBlurFeaturesNV, PhysicalDeviceFeatures2>
-  {
-    enum
-    {
-      value = true
-    };
-  };
-  template <>
-  struct StructExtends<PhysicalDeviceRayTracingMotionBlurFeaturesNV, DeviceCreateInfo>
-  {
-    enum
-    {
-      value = true
-    };
-  };
-  template <>
-  struct StructExtends<PhysicalDeviceRayTracingPipelineFeaturesKHR, PhysicalDeviceFeatures2>
-  {
-    enum
-    {
-      value = true
-    };
-  };
-  template <>
-  struct StructExtends<PhysicalDeviceRayTracingPipelineFeaturesKHR, DeviceCreateInfo>
-  {
-    enum
-    {
-      value = true
-    };
-  };
-  template <>
-  struct StructExtends<PhysicalDeviceRayTracingPipelinePropertiesKHR, PhysicalDeviceProperties2>
-  {
-    enum
-    {
-      value = true
-    };
-  };
-  template <>
-  struct StructExtends<PhysicalDeviceRayTracingPropertiesNV, PhysicalDeviceProperties2>
-  {
-    enum
-    {
-      value = true
-    };
-  };
-  template <>
-  struct StructExtends<PhysicalDeviceRepresentativeFragmentTestFeaturesNV, PhysicalDeviceFeatures2>
-  {
-    enum
-    {
-      value = true
-    };
-  };
-  template <>
-  struct StructExtends<PhysicalDeviceRepresentativeFragmentTestFeaturesNV, DeviceCreateInfo>
-  {
-    enum
-    {
-      value = true
-    };
-  };
-  template <>
-  struct StructExtends<PhysicalDeviceRobustness2FeaturesEXT, PhysicalDeviceFeatures2>
-  {
-    enum
-    {
-      value = true
-    };
-  };
-  template <>
-  struct StructExtends<PhysicalDeviceRobustness2FeaturesEXT, DeviceCreateInfo>
-  {
-    enum
-    {
-      value = true
-    };
-  };
-  template <>
-  struct StructExtends<PhysicalDeviceRobustness2PropertiesEXT, PhysicalDeviceProperties2>
-  {
-    enum
-    {
-      value = true
-    };
-  };
-  template <>
-  struct StructExtends<PhysicalDeviceSampleLocationsPropertiesEXT, PhysicalDeviceProperties2>
-  {
-    enum
-    {
-      value = true
-    };
-  };
-  template <>
-  struct StructExtends<PhysicalDeviceSamplerFilterMinmaxProperties, PhysicalDeviceProperties2>
+  struct StructExtends<ImagePlaneMemoryRequirementsInfo, ImageMemoryRequirementsInfo2>
   {
     enum
     {
@@ -8409,7 +6818,7 @@
     };
   };
   template <>
-  struct StructExtends<PhysicalDeviceScalarBlockLayoutFeatures, PhysicalDeviceFeatures2>
+  struct StructExtends<SamplerYcbcrConversionImageFormatProperties, ImageFormatProperties2>
   {
     enum
     {
@@ -8417,7 +6826,7 @@
     };
   };
   template <>
-  struct StructExtends<PhysicalDeviceScalarBlockLayoutFeatures, DeviceCreateInfo>
+  struct StructExtends<PhysicalDeviceExternalImageFormatInfo, PhysicalDeviceImageFormatInfo2>
   {
     enum
     {
@@ -8425,7 +6834,7 @@
     };
   };
   template <>
-  struct StructExtends<PhysicalDeviceSeparateDepthStencilLayoutsFeatures, PhysicalDeviceFeatures2>
+  struct StructExtends<ExternalImageFormatProperties, ImageFormatProperties2>
   {
     enum
     {
@@ -8433,7 +6842,7 @@
     };
   };
   template <>
-  struct StructExtends<PhysicalDeviceSeparateDepthStencilLayoutsFeatures, DeviceCreateInfo>
+  struct StructExtends<PhysicalDeviceIDProperties, PhysicalDeviceProperties2>
   {
     enum
     {
@@ -8441,7 +6850,7 @@
     };
   };
   template <>
-  struct StructExtends<PhysicalDeviceShaderAtomicFloatFeaturesEXT, PhysicalDeviceFeatures2>
+  struct StructExtends<ExternalMemoryImageCreateInfo, ImageCreateInfo>
   {
     enum
     {
@@ -8449,7 +6858,7 @@
     };
   };
   template <>
-  struct StructExtends<PhysicalDeviceShaderAtomicFloatFeaturesEXT, DeviceCreateInfo>
+  struct StructExtends<ExternalMemoryBufferCreateInfo, BufferCreateInfo>
   {
     enum
     {
@@ -8457,7 +6866,7 @@
     };
   };
   template <>
-  struct StructExtends<PhysicalDeviceShaderAtomicInt64Features, PhysicalDeviceFeatures2>
+  struct StructExtends<ExportMemoryAllocateInfo, MemoryAllocateInfo>
   {
     enum
     {
@@ -8465,7 +6874,7 @@
     };
   };
   template <>
-  struct StructExtends<PhysicalDeviceShaderAtomicInt64Features, DeviceCreateInfo>
+  struct StructExtends<ExportFenceCreateInfo, FenceCreateInfo>
   {
     enum
     {
@@ -8473,7 +6882,7 @@
     };
   };
   template <>
-  struct StructExtends<PhysicalDeviceShaderClockFeaturesKHR, PhysicalDeviceFeatures2>
+  struct StructExtends<ExportSemaphoreCreateInfo, SemaphoreCreateInfo>
   {
     enum
     {
@@ -8481,39 +6890,7 @@
     };
   };
   template <>
-  struct StructExtends<PhysicalDeviceShaderClockFeaturesKHR, DeviceCreateInfo>
-  {
-    enum
-    {
-      value = true
-    };
-  };
-  template <>
-  struct StructExtends<PhysicalDeviceShaderCoreProperties2AMD, PhysicalDeviceProperties2>
-  {
-    enum
-    {
-      value = true
-    };
-  };
-  template <>
-  struct StructExtends<PhysicalDeviceShaderCorePropertiesAMD, PhysicalDeviceProperties2>
-  {
-    enum
-    {
-      value = true
-    };
-  };
-  template <>
-  struct StructExtends<PhysicalDeviceShaderDemoteToHelperInvocationFeaturesEXT, PhysicalDeviceFeatures2>
-  {
-    enum
-    {
-      value = true
-    };
-  };
-  template <>
-  struct StructExtends<PhysicalDeviceShaderDemoteToHelperInvocationFeaturesEXT, DeviceCreateInfo>
+  struct StructExtends<PhysicalDeviceMaintenance3Properties, PhysicalDeviceProperties2>
   {
     enum
     {
@@ -8536,398 +6913,8 @@
       value = true
     };
   };
-  template <>
-  struct StructExtends<PhysicalDeviceShaderFloat16Int8Features, PhysicalDeviceFeatures2>
-  {
-    enum
-    {
-      value = true
-    };
-  };
-  template <>
-  struct StructExtends<PhysicalDeviceShaderFloat16Int8Features, DeviceCreateInfo>
-  {
-    enum
-    {
-      value = true
-    };
-  };
-  template <>
-  struct StructExtends<PhysicalDeviceShaderImageAtomicInt64FeaturesEXT, PhysicalDeviceFeatures2>
-  {
-    enum
-    {
-      value = true
-    };
-  };
-  template <>
-  struct StructExtends<PhysicalDeviceShaderImageAtomicInt64FeaturesEXT, DeviceCreateInfo>
-  {
-    enum
-    {
-      value = true
-    };
-  };
-  template <>
-  struct StructExtends<PhysicalDeviceShaderImageFootprintFeaturesNV, PhysicalDeviceFeatures2>
-  {
-    enum
-    {
-      value = true
-    };
-  };
-  template <>
-  struct StructExtends<PhysicalDeviceShaderImageFootprintFeaturesNV, DeviceCreateInfo>
-  {
-    enum
-    {
-      value = true
-    };
-  };
-  template <>
-  struct StructExtends<PhysicalDeviceShaderIntegerFunctions2FeaturesINTEL, PhysicalDeviceFeatures2>
-  {
-    enum
-    {
-      value = true
-    };
-  };
-  template <>
-  struct StructExtends<PhysicalDeviceShaderIntegerFunctions2FeaturesINTEL, DeviceCreateInfo>
-  {
-    enum
-    {
-      value = true
-    };
-  };
-  template <>
-  struct StructExtends<PhysicalDeviceShaderSMBuiltinsFeaturesNV, PhysicalDeviceFeatures2>
-  {
-    enum
-    {
-      value = true
-    };
-  };
-  template <>
-  struct StructExtends<PhysicalDeviceShaderSMBuiltinsFeaturesNV, DeviceCreateInfo>
-  {
-    enum
-    {
-      value = true
-    };
-  };
-  template <>
-  struct StructExtends<PhysicalDeviceShaderSMBuiltinsPropertiesNV, PhysicalDeviceProperties2>
-  {
-    enum
-    {
-      value = true
-    };
-  };
-  template <>
-  struct StructExtends<PhysicalDeviceShaderSubgroupExtendedTypesFeatures, PhysicalDeviceFeatures2>
-  {
-    enum
-    {
-      value = true
-    };
-  };
-  template <>
-  struct StructExtends<PhysicalDeviceShaderSubgroupExtendedTypesFeatures, DeviceCreateInfo>
-  {
-    enum
-    {
-      value = true
-    };
-  };
-  template <>
-  struct StructExtends<PhysicalDeviceShaderSubgroupUniformControlFlowFeaturesKHR, PhysicalDeviceFeatures2>
-  {
-    enum
-    {
-      value = true
-    };
-  };
-  template <>
-  struct StructExtends<PhysicalDeviceShaderSubgroupUniformControlFlowFeaturesKHR, DeviceCreateInfo>
-  {
-    enum
-    {
-      value = true
-    };
-  };
-  template <>
-  struct StructExtends<PhysicalDeviceShaderTerminateInvocationFeaturesKHR, PhysicalDeviceFeatures2>
-  {
-    enum
-    {
-      value = true
-    };
-  };
-  template <>
-  struct StructExtends<PhysicalDeviceShaderTerminateInvocationFeaturesKHR, DeviceCreateInfo>
-  {
-    enum
-    {
-      value = true
-    };
-  };
-  template <>
-  struct StructExtends<PhysicalDeviceShadingRateImageFeaturesNV, PhysicalDeviceFeatures2>
-  {
-    enum
-    {
-      value = true
-    };
-  };
-  template <>
-  struct StructExtends<PhysicalDeviceShadingRateImageFeaturesNV, DeviceCreateInfo>
-  {
-    enum
-    {
-      value = true
-    };
-  };
-  template <>
-  struct StructExtends<PhysicalDeviceShadingRateImagePropertiesNV, PhysicalDeviceProperties2>
-  {
-    enum
-    {
-      value = true
-    };
-  };
-  template <>
-  struct StructExtends<PhysicalDeviceSubgroupProperties, PhysicalDeviceProperties2>
-  {
-    enum
-    {
-      value = true
-    };
-  };
-  template <>
-  struct StructExtends<PhysicalDeviceSubgroupSizeControlFeaturesEXT, PhysicalDeviceFeatures2>
-  {
-    enum
-    {
-      value = true
-    };
-  };
-  template <>
-  struct StructExtends<PhysicalDeviceSubgroupSizeControlFeaturesEXT, DeviceCreateInfo>
-  {
-    enum
-    {
-      value = true
-    };
-  };
-  template <>
-  struct StructExtends<PhysicalDeviceSubgroupSizeControlPropertiesEXT, PhysicalDeviceProperties2>
-  {
-    enum
-    {
-      value = true
-    };
-  };
-  template <>
-  struct StructExtends<PhysicalDeviceSubpassShadingFeaturesHUAWEI, PhysicalDeviceFeatures2>
-  {
-    enum
-    {
-      value = true
-    };
-  };
-  template <>
-  struct StructExtends<PhysicalDeviceSubpassShadingFeaturesHUAWEI, DeviceCreateInfo>
-  {
-    enum
-    {
-      value = true
-    };
-  };
-  template <>
-  struct StructExtends<PhysicalDeviceSubpassShadingPropertiesHUAWEI, PhysicalDeviceProperties2>
-  {
-    enum
-    {
-      value = true
-    };
-  };
-  template <>
-  struct StructExtends<PhysicalDeviceSynchronization2FeaturesKHR, PhysicalDeviceFeatures2>
-  {
-    enum
-    {
-      value = true
-    };
-  };
-  template <>
-  struct StructExtends<PhysicalDeviceSynchronization2FeaturesKHR, DeviceCreateInfo>
-  {
-    enum
-    {
-      value = true
-    };
-  };
-  template <>
-  struct StructExtends<PhysicalDeviceTexelBufferAlignmentFeaturesEXT, PhysicalDeviceFeatures2>
-  {
-    enum
-    {
-      value = true
-    };
-  };
-  template <>
-  struct StructExtends<PhysicalDeviceTexelBufferAlignmentFeaturesEXT, DeviceCreateInfo>
-  {
-    enum
-    {
-      value = true
-    };
-  };
-  template <>
-  struct StructExtends<PhysicalDeviceTexelBufferAlignmentPropertiesEXT, PhysicalDeviceProperties2>
-  {
-    enum
-    {
-      value = true
-    };
-  };
-  template <>
-  struct StructExtends<PhysicalDeviceTextureCompressionASTCHDRFeaturesEXT, PhysicalDeviceFeatures2>
-  {
-    enum
-    {
-      value = true
-    };
-  };
-  template <>
-  struct StructExtends<PhysicalDeviceTextureCompressionASTCHDRFeaturesEXT, DeviceCreateInfo>
-  {
-    enum
-    {
-      value = true
-    };
-  };
-  template <>
-  struct StructExtends<PhysicalDeviceTimelineSemaphoreFeatures, PhysicalDeviceFeatures2>
-  {
-    enum
-    {
-      value = true
-    };
-  };
-  template <>
-  struct StructExtends<PhysicalDeviceTimelineSemaphoreFeatures, DeviceCreateInfo>
-  {
-    enum
-    {
-      value = true
-    };
-  };
-  template <>
-  struct StructExtends<PhysicalDeviceTimelineSemaphoreProperties, PhysicalDeviceProperties2>
-  {
-    enum
-    {
-      value = true
-    };
-  };
-  template <>
-  struct StructExtends<PhysicalDeviceTransformFeedbackFeaturesEXT, PhysicalDeviceFeatures2>
-  {
-    enum
-    {
-      value = true
-    };
-  };
-  template <>
-  struct StructExtends<PhysicalDeviceTransformFeedbackFeaturesEXT, DeviceCreateInfo>
-  {
-    enum
-    {
-      value = true
-    };
-  };
-  template <>
-  struct StructExtends<PhysicalDeviceTransformFeedbackPropertiesEXT, PhysicalDeviceProperties2>
-  {
-    enum
-    {
-      value = true
-    };
-  };
-  template <>
-  struct StructExtends<PhysicalDeviceUniformBufferStandardLayoutFeatures, PhysicalDeviceFeatures2>
-  {
-    enum
-    {
-      value = true
-    };
-  };
-  template <>
-  struct StructExtends<PhysicalDeviceUniformBufferStandardLayoutFeatures, DeviceCreateInfo>
-  {
-    enum
-    {
-      value = true
-    };
-  };
-  template <>
-  struct StructExtends<PhysicalDeviceVariablePointersFeatures, PhysicalDeviceFeatures2>
-  {
-    enum
-    {
-      value = true
-    };
-  };
-  template <>
-  struct StructExtends<PhysicalDeviceVariablePointersFeatures, DeviceCreateInfo>
-  {
-    enum
-    {
-      value = true
-    };
-  };
-  template <>
-  struct StructExtends<PhysicalDeviceVertexAttributeDivisorFeaturesEXT, PhysicalDeviceFeatures2>
-  {
-    enum
-    {
-      value = true
-    };
-  };
-  template <>
-  struct StructExtends<PhysicalDeviceVertexAttributeDivisorFeaturesEXT, DeviceCreateInfo>
-  {
-    enum
-    {
-      value = true
-    };
-  };
-  template <>
-  struct StructExtends<PhysicalDeviceVertexAttributeDivisorPropertiesEXT, PhysicalDeviceProperties2>
-  {
-    enum
-    {
-      value = true
-    };
-  };
-  template <>
-  struct StructExtends<PhysicalDeviceVertexInputDynamicStateFeaturesEXT, PhysicalDeviceFeatures2>
-  {
-    enum
-    {
-      value = true
-    };
-  };
-  template <>
-  struct StructExtends<PhysicalDeviceVertexInputDynamicStateFeaturesEXT, DeviceCreateInfo>
-  {
-    enum
-    {
-      value = true
-    };
-  };
+
+  //=== VK_VERSION_1_2 ===
   template <>
   struct StructExtends<PhysicalDeviceVulkan11Features, PhysicalDeviceFeatures2>
   {
@@ -8977,6 +6964,206 @@
     };
   };
   template <>
+  struct StructExtends<ImageFormatListCreateInfo, ImageCreateInfo>
+  {
+    enum
+    {
+      value = true
+    };
+  };
+  template <>
+  struct StructExtends<ImageFormatListCreateInfo, SwapchainCreateInfoKHR>
+  {
+    enum
+    {
+      value = true
+    };
+  };
+  template <>
+  struct StructExtends<ImageFormatListCreateInfo, PhysicalDeviceImageFormatInfo2>
+  {
+    enum
+    {
+      value = true
+    };
+  };
+  template <>
+  struct StructExtends<PhysicalDevice8BitStorageFeatures, PhysicalDeviceFeatures2>
+  {
+    enum
+    {
+      value = true
+    };
+  };
+  template <>
+  struct StructExtends<PhysicalDevice8BitStorageFeatures, DeviceCreateInfo>
+  {
+    enum
+    {
+      value = true
+    };
+  };
+  template <>
+  struct StructExtends<PhysicalDeviceDriverProperties, PhysicalDeviceProperties2>
+  {
+    enum
+    {
+      value = true
+    };
+  };
+  template <>
+  struct StructExtends<PhysicalDeviceShaderAtomicInt64Features, PhysicalDeviceFeatures2>
+  {
+    enum
+    {
+      value = true
+    };
+  };
+  template <>
+  struct StructExtends<PhysicalDeviceShaderAtomicInt64Features, DeviceCreateInfo>
+  {
+    enum
+    {
+      value = true
+    };
+  };
+  template <>
+  struct StructExtends<PhysicalDeviceShaderFloat16Int8Features, PhysicalDeviceFeatures2>
+  {
+    enum
+    {
+      value = true
+    };
+  };
+  template <>
+  struct StructExtends<PhysicalDeviceShaderFloat16Int8Features, DeviceCreateInfo>
+  {
+    enum
+    {
+      value = true
+    };
+  };
+  template <>
+  struct StructExtends<PhysicalDeviceFloatControlsProperties, PhysicalDeviceProperties2>
+  {
+    enum
+    {
+      value = true
+    };
+  };
+  template <>
+  struct StructExtends<DescriptorSetLayoutBindingFlagsCreateInfo, DescriptorSetLayoutCreateInfo>
+  {
+    enum
+    {
+      value = true
+    };
+  };
+  template <>
+  struct StructExtends<PhysicalDeviceDescriptorIndexingFeatures, PhysicalDeviceFeatures2>
+  {
+    enum
+    {
+      value = true
+    };
+  };
+  template <>
+  struct StructExtends<PhysicalDeviceDescriptorIndexingFeatures, DeviceCreateInfo>
+  {
+    enum
+    {
+      value = true
+    };
+  };
+  template <>
+  struct StructExtends<PhysicalDeviceDescriptorIndexingProperties, PhysicalDeviceProperties2>
+  {
+    enum
+    {
+      value = true
+    };
+  };
+  template <>
+  struct StructExtends<DescriptorSetVariableDescriptorCountAllocateInfo, DescriptorSetAllocateInfo>
+  {
+    enum
+    {
+      value = true
+    };
+  };
+  template <>
+  struct StructExtends<DescriptorSetVariableDescriptorCountLayoutSupport, DescriptorSetLayoutSupport>
+  {
+    enum
+    {
+      value = true
+    };
+  };
+  template <>
+  struct StructExtends<SubpassDescriptionDepthStencilResolve, SubpassDescription2>
+  {
+    enum
+    {
+      value = true
+    };
+  };
+  template <>
+  struct StructExtends<PhysicalDeviceDepthStencilResolveProperties, PhysicalDeviceProperties2>
+  {
+    enum
+    {
+      value = true
+    };
+  };
+  template <>
+  struct StructExtends<PhysicalDeviceScalarBlockLayoutFeatures, PhysicalDeviceFeatures2>
+  {
+    enum
+    {
+      value = true
+    };
+  };
+  template <>
+  struct StructExtends<PhysicalDeviceScalarBlockLayoutFeatures, DeviceCreateInfo>
+  {
+    enum
+    {
+      value = true
+    };
+  };
+  template <>
+  struct StructExtends<ImageStencilUsageCreateInfo, ImageCreateInfo>
+  {
+    enum
+    {
+      value = true
+    };
+  };
+  template <>
+  struct StructExtends<ImageStencilUsageCreateInfo, PhysicalDeviceImageFormatInfo2>
+  {
+    enum
+    {
+      value = true
+    };
+  };
+  template <>
+  struct StructExtends<SamplerReductionModeCreateInfo, SamplerCreateInfo>
+  {
+    enum
+    {
+      value = true
+    };
+  };
+  template <>
+  struct StructExtends<PhysicalDeviceSamplerFilterMinmaxProperties, PhysicalDeviceProperties2>
+  {
+    enum
+    {
+      value = true
+    };
+  };
+  template <>
   struct StructExtends<PhysicalDeviceVulkanMemoryModelFeatures, PhysicalDeviceFeatures2>
   {
     enum
@@ -8993,7 +7180,7 @@
     };
   };
   template <>
-  struct StructExtends<PhysicalDeviceWorkgroupMemoryExplicitLayoutFeaturesKHR, PhysicalDeviceFeatures2>
+  struct StructExtends<PhysicalDeviceImagelessFramebufferFeatures, PhysicalDeviceFeatures2>
   {
     enum
     {
@@ -9001,7 +7188,7 @@
     };
   };
   template <>
-  struct StructExtends<PhysicalDeviceWorkgroupMemoryExplicitLayoutFeaturesKHR, DeviceCreateInfo>
+  struct StructExtends<PhysicalDeviceImagelessFramebufferFeatures, DeviceCreateInfo>
   {
     enum
     {
@@ -9009,361 +7196,7 @@
     };
   };
   template <>
-  struct StructExtends<PhysicalDeviceYcbcr2Plane444FormatsFeaturesEXT, PhysicalDeviceFeatures2>
-  {
-    enum
-    {
-      value = true
-    };
-  };
-  template <>
-  struct StructExtends<PhysicalDeviceYcbcr2Plane444FormatsFeaturesEXT, DeviceCreateInfo>
-  {
-    enum
-    {
-      value = true
-    };
-  };
-  template <>
-  struct StructExtends<PhysicalDeviceYcbcrImageArraysFeaturesEXT, PhysicalDeviceFeatures2>
-  {
-    enum
-    {
-      value = true
-    };
-  };
-  template <>
-  struct StructExtends<PhysicalDeviceYcbcrImageArraysFeaturesEXT, DeviceCreateInfo>
-  {
-    enum
-    {
-      value = true
-    };
-  };
-  template <>
-  struct StructExtends<PhysicalDeviceZeroInitializeWorkgroupMemoryFeaturesKHR, PhysicalDeviceFeatures2>
-  {
-    enum
-    {
-      value = true
-    };
-  };
-  template <>
-  struct StructExtends<PhysicalDeviceZeroInitializeWorkgroupMemoryFeaturesKHR, DeviceCreateInfo>
-  {
-    enum
-    {
-      value = true
-    };
-  };
-  template <>
-  struct StructExtends<PipelineColorBlendAdvancedStateCreateInfoEXT, PipelineColorBlendStateCreateInfo>
-  {
-    enum
-    {
-      value = true
-    };
-  };
-  template <>
-  struct StructExtends<PipelineColorWriteCreateInfoEXT, PipelineColorBlendStateCreateInfo>
-  {
-    enum
-    {
-      value = true
-    };
-  };
-  template <>
-  struct StructExtends<PipelineCompilerControlCreateInfoAMD, GraphicsPipelineCreateInfo>
-  {
-    enum
-    {
-      value = true
-    };
-  };
-  template <>
-  struct StructExtends<PipelineCompilerControlCreateInfoAMD, ComputePipelineCreateInfo>
-  {
-    enum
-    {
-      value = true
-    };
-  };
-  template <>
-  struct StructExtends<PipelineCoverageModulationStateCreateInfoNV, PipelineMultisampleStateCreateInfo>
-  {
-    enum
-    {
-      value = true
-    };
-  };
-  template <>
-  struct StructExtends<PipelineCoverageReductionStateCreateInfoNV, PipelineMultisampleStateCreateInfo>
-  {
-    enum
-    {
-      value = true
-    };
-  };
-  template <>
-  struct StructExtends<PipelineCoverageToColorStateCreateInfoNV, PipelineMultisampleStateCreateInfo>
-  {
-    enum
-    {
-      value = true
-    };
-  };
-  template <>
-  struct StructExtends<PipelineCreationFeedbackCreateInfoEXT, GraphicsPipelineCreateInfo>
-  {
-    enum
-    {
-      value = true
-    };
-  };
-  template <>
-  struct StructExtends<PipelineCreationFeedbackCreateInfoEXT, ComputePipelineCreateInfo>
-  {
-    enum
-    {
-      value = true
-    };
-  };
-  template <>
-  struct StructExtends<PipelineCreationFeedbackCreateInfoEXT, RayTracingPipelineCreateInfoNV>
-  {
-    enum
-    {
-      value = true
-    };
-  };
-  template <>
-  struct StructExtends<PipelineCreationFeedbackCreateInfoEXT, RayTracingPipelineCreateInfoKHR>
-  {
-    enum
-    {
-      value = true
-    };
-  };
-  template <>
-  struct StructExtends<PipelineDiscardRectangleStateCreateInfoEXT, GraphicsPipelineCreateInfo>
-  {
-    enum
-    {
-      value = true
-    };
-  };
-  template <>
-  struct StructExtends<PipelineFragmentShadingRateEnumStateCreateInfoNV, GraphicsPipelineCreateInfo>
-  {
-    enum
-    {
-      value = true
-    };
-  };
-  template <>
-  struct StructExtends<PipelineFragmentShadingRateStateCreateInfoKHR, GraphicsPipelineCreateInfo>
-  {
-    enum
-    {
-      value = true
-    };
-  };
-  template <>
-  struct StructExtends<PipelineRasterizationConservativeStateCreateInfoEXT, PipelineRasterizationStateCreateInfo>
-  {
-    enum
-    {
-      value = true
-    };
-  };
-  template <>
-  struct StructExtends<PipelineRasterizationDepthClipStateCreateInfoEXT, PipelineRasterizationStateCreateInfo>
-  {
-    enum
-    {
-      value = true
-    };
-  };
-  template <>
-  struct StructExtends<PipelineRasterizationLineStateCreateInfoEXT, PipelineRasterizationStateCreateInfo>
-  {
-    enum
-    {
-      value = true
-    };
-  };
-  template <>
-  struct StructExtends<PipelineRasterizationProvokingVertexStateCreateInfoEXT, PipelineRasterizationStateCreateInfo>
-  {
-    enum
-    {
-      value = true
-    };
-  };
-  template <>
-  struct StructExtends<PipelineRasterizationStateRasterizationOrderAMD, PipelineRasterizationStateCreateInfo>
-  {
-    enum
-    {
-      value = true
-    };
-  };
-  template <>
-  struct StructExtends<PipelineRasterizationStateStreamCreateInfoEXT, PipelineRasterizationStateCreateInfo>
-  {
-    enum
-    {
-      value = true
-    };
-  };
-  template <>
-  struct StructExtends<PipelineRepresentativeFragmentTestStateCreateInfoNV, GraphicsPipelineCreateInfo>
-  {
-    enum
-    {
-      value = true
-    };
-  };
-  template <>
-  struct StructExtends<PipelineSampleLocationsStateCreateInfoEXT, PipelineMultisampleStateCreateInfo>
-  {
-    enum
-    {
-      value = true
-    };
-  };
-  template <>
-  struct StructExtends<PipelineShaderStageRequiredSubgroupSizeCreateInfoEXT, PipelineShaderStageCreateInfo>
-  {
-    enum
-    {
-      value = true
-    };
-  };
-  template <>
-  struct StructExtends<PipelineTessellationDomainOriginStateCreateInfo, PipelineTessellationStateCreateInfo>
-  {
-    enum
-    {
-      value = true
-    };
-  };
-  template <>
-  struct StructExtends<PipelineVertexInputDivisorStateCreateInfoEXT, PipelineVertexInputStateCreateInfo>
-  {
-    enum
-    {
-      value = true
-    };
-  };
-  template <>
-  struct StructExtends<PipelineViewportCoarseSampleOrderStateCreateInfoNV, PipelineViewportStateCreateInfo>
-  {
-    enum
-    {
-      value = true
-    };
-  };
-  template <>
-  struct StructExtends<PipelineViewportExclusiveScissorStateCreateInfoNV, PipelineViewportStateCreateInfo>
-  {
-    enum
-    {
-      value = true
-    };
-  };
-  template <>
-  struct StructExtends<PipelineViewportShadingRateImageStateCreateInfoNV, PipelineViewportStateCreateInfo>
-  {
-    enum
-    {
-      value = true
-    };
-  };
-  template <>
-  struct StructExtends<PipelineViewportSwizzleStateCreateInfoNV, PipelineViewportStateCreateInfo>
-  {
-    enum
-    {
-      value = true
-    };
-  };
-  template <>
-  struct StructExtends<PipelineViewportWScalingStateCreateInfoNV, PipelineViewportStateCreateInfo>
-  {
-    enum
-    {
-      value = true
-    };
-  };
-#if defined( VK_USE_PLATFORM_GGP )
-  template <>
-  struct StructExtends<PresentFrameTokenGGP, PresentInfoKHR>
-  {
-    enum
-    {
-      value = true
-    };
-  };
-#endif /*VK_USE_PLATFORM_GGP*/
-  template <>
-  struct StructExtends<PresentRegionsKHR, PresentInfoKHR>
-  {
-    enum
-    {
-      value = true
-    };
-  };
-  template <>
-  struct StructExtends<PresentTimesInfoGOOGLE, PresentInfoKHR>
-  {
-    enum
-    {
-      value = true
-    };
-  };
-  template <>
-  struct StructExtends<ProtectedSubmitInfo, SubmitInfo>
-  {
-    enum
-    {
-      value = true
-    };
-  };
-  template <>
-  struct StructExtends<QueryPoolPerformanceCreateInfoKHR, QueryPoolCreateInfo>
-  {
-    enum
-    {
-      value = true
-    };
-  };
-  template <>
-  struct StructExtends<QueryPoolPerformanceQueryCreateInfoINTEL, QueryPoolCreateInfo>
-  {
-    enum
-    {
-      value = true
-    };
-  };
-  template <>
-  struct StructExtends<QueueFamilyCheckpointProperties2NV, QueueFamilyProperties2>
-  {
-    enum
-    {
-      value = true
-    };
-  };
-  template <>
-  struct StructExtends<QueueFamilyCheckpointPropertiesNV, QueueFamilyProperties2>
-  {
-    enum
-    {
-      value = true
-    };
-  };
-  template <>
-  struct StructExtends<QueueFamilyGlobalPriorityPropertiesEXT, QueueFamilyProperties2>
+  struct StructExtends<FramebufferAttachmentsCreateInfo, FramebufferCreateInfo>
   {
     enum
     {
@@ -9379,7 +7212,7 @@
     };
   };
   template <>
-  struct StructExtends<RenderPassFragmentDensityMapCreateInfoEXT, RenderPassCreateInfo>
+  struct StructExtends<PhysicalDeviceUniformBufferStandardLayoutFeatures, PhysicalDeviceFeatures2>
   {
     enum
     {
@@ -9387,7 +7220,7 @@
     };
   };
   template <>
-  struct StructExtends<RenderPassFragmentDensityMapCreateInfoEXT, RenderPassCreateInfo2>
+  struct StructExtends<PhysicalDeviceUniformBufferStandardLayoutFeatures, DeviceCreateInfo>
   {
     enum
     {
@@ -9395,7 +7228,7 @@
     };
   };
   template <>
-  struct StructExtends<RenderPassInputAttachmentAspectCreateInfo, RenderPassCreateInfo>
+  struct StructExtends<PhysicalDeviceShaderSubgroupExtendedTypesFeatures, PhysicalDeviceFeatures2>
   {
     enum
     {
@@ -9403,7 +7236,7 @@
     };
   };
   template <>
-  struct StructExtends<RenderPassMultiviewCreateInfo, RenderPassCreateInfo>
+  struct StructExtends<PhysicalDeviceShaderSubgroupExtendedTypesFeatures, DeviceCreateInfo>
   {
     enum
     {
@@ -9411,7 +7244,7 @@
     };
   };
   template <>
-  struct StructExtends<RenderPassSampleLocationsBeginInfoEXT, RenderPassBeginInfo>
+  struct StructExtends<PhysicalDeviceSeparateDepthStencilLayoutsFeatures, PhysicalDeviceFeatures2>
   {
     enum
     {
@@ -9419,7 +7252,7 @@
     };
   };
   template <>
-  struct StructExtends<RenderPassTransformBeginInfoQCOM, RenderPassBeginInfo>
+  struct StructExtends<PhysicalDeviceSeparateDepthStencilLayoutsFeatures, DeviceCreateInfo>
   {
     enum
     {
@@ -9427,7 +7260,7 @@
     };
   };
   template <>
-  struct StructExtends<SampleLocationsInfoEXT, ImageMemoryBarrier>
+  struct StructExtends<AttachmentReferenceStencilLayout, AttachmentReference2>
   {
     enum
     {
@@ -9435,7 +7268,7 @@
     };
   };
   template <>
-  struct StructExtends<SampleLocationsInfoEXT, ImageMemoryBarrier2KHR>
+  struct StructExtends<AttachmentDescriptionStencilLayout, AttachmentDescription2>
   {
     enum
     {
@@ -9443,7 +7276,7 @@
     };
   };
   template <>
-  struct StructExtends<SamplerCustomBorderColorCreateInfoEXT, SamplerCreateInfo>
+  struct StructExtends<PhysicalDeviceHostQueryResetFeatures, PhysicalDeviceFeatures2>
   {
     enum
     {
@@ -9451,7 +7284,7 @@
     };
   };
   template <>
-  struct StructExtends<SamplerReductionModeCreateInfo, SamplerCreateInfo>
+  struct StructExtends<PhysicalDeviceHostQueryResetFeatures, DeviceCreateInfo>
   {
     enum
     {
@@ -9459,7 +7292,7 @@
     };
   };
   template <>
-  struct StructExtends<SamplerYcbcrConversionImageFormatProperties, ImageFormatProperties2>
+  struct StructExtends<PhysicalDeviceTimelineSemaphoreFeatures, PhysicalDeviceFeatures2>
   {
     enum
     {
@@ -9467,7 +7300,7 @@
     };
   };
   template <>
-  struct StructExtends<SamplerYcbcrConversionInfo, SamplerCreateInfo>
+  struct StructExtends<PhysicalDeviceTimelineSemaphoreFeatures, DeviceCreateInfo>
   {
     enum
     {
@@ -9475,7 +7308,7 @@
     };
   };
   template <>
-  struct StructExtends<SamplerYcbcrConversionInfo, ImageViewCreateInfo>
+  struct StructExtends<PhysicalDeviceTimelineSemaphoreProperties, PhysicalDeviceProperties2>
   {
     enum
     {
@@ -9499,116 +7332,6 @@
     };
   };
   template <>
-  struct StructExtends<ShaderModuleValidationCacheCreateInfoEXT, ShaderModuleCreateInfo>
-  {
-    enum
-    {
-      value = true
-    };
-  };
-  template <>
-  struct StructExtends<SharedPresentSurfaceCapabilitiesKHR, SurfaceCapabilities2KHR>
-  {
-    enum
-    {
-      value = true
-    };
-  };
-  template <>
-  struct StructExtends<SubpassDescriptionDepthStencilResolve, SubpassDescription2>
-  {
-    enum
-    {
-      value = true
-    };
-  };
-  template <>
-  struct StructExtends<SubpassShadingPipelineCreateInfoHUAWEI, ComputePipelineCreateInfo>
-  {
-    enum
-    {
-      value = true
-    };
-  };
-#if defined( VK_USE_PLATFORM_WIN32_KHR )
-  template <>
-  struct StructExtends<SurfaceCapabilitiesFullScreenExclusiveEXT, SurfaceCapabilities2KHR>
-  {
-    enum
-    {
-      value = true
-    };
-  };
-#endif /*VK_USE_PLATFORM_WIN32_KHR*/
-#if defined( VK_USE_PLATFORM_WIN32_KHR )
-  template <>
-  struct StructExtends<SurfaceFullScreenExclusiveInfoEXT, PhysicalDeviceSurfaceInfo2KHR>
-  {
-    enum
-    {
-      value = true
-    };
-  };
-  template <>
-  struct StructExtends<SurfaceFullScreenExclusiveInfoEXT, SwapchainCreateInfoKHR>
-  {
-    enum
-    {
-      value = true
-    };
-  };
-#endif /*VK_USE_PLATFORM_WIN32_KHR*/
-#if defined( VK_USE_PLATFORM_WIN32_KHR )
-  template <>
-  struct StructExtends<SurfaceFullScreenExclusiveWin32InfoEXT, PhysicalDeviceSurfaceInfo2KHR>
-  {
-    enum
-    {
-      value = true
-    };
-  };
-  template <>
-  struct StructExtends<SurfaceFullScreenExclusiveWin32InfoEXT, SwapchainCreateInfoKHR>
-  {
-    enum
-    {
-      value = true
-    };
-  };
-#endif /*VK_USE_PLATFORM_WIN32_KHR*/
-  template <>
-  struct StructExtends<SurfaceProtectedCapabilitiesKHR, SurfaceCapabilities2KHR>
-  {
-    enum
-    {
-      value = true
-    };
-  };
-  template <>
-  struct StructExtends<SwapchainCounterCreateInfoEXT, SwapchainCreateInfoKHR>
-  {
-    enum
-    {
-      value = true
-    };
-  };
-  template <>
-  struct StructExtends<SwapchainDisplayNativeHdrCreateInfoAMD, SwapchainCreateInfoKHR>
-  {
-    enum
-    {
-      value = true
-    };
-  };
-  template <>
-  struct StructExtends<TextureLODGatherFormatPropertiesAMD, ImageFormatProperties2>
-  {
-    enum
-    {
-      value = true
-    };
-  };
-  template <>
   struct StructExtends<TimelineSemaphoreSubmitInfo, SubmitInfo>
   {
     enum
@@ -9625,7 +7348,7 @@
     };
   };
   template <>
-  struct StructExtends<ValidationFeaturesEXT, InstanceCreateInfo>
+  struct StructExtends<PhysicalDeviceBufferDeviceAddressFeatures, PhysicalDeviceFeatures2>
   {
     enum
     {
@@ -9633,244 +7356,104 @@
     };
   };
   template <>
-  struct StructExtends<ValidationFlagsEXT, InstanceCreateInfo>
+  struct StructExtends<PhysicalDeviceBufferDeviceAddressFeatures, DeviceCreateInfo>
   {
     enum
     {
       value = true
     };
   };
-#if defined( VK_ENABLE_BETA_EXTENSIONS )
   template <>
-  struct StructExtends<VideoDecodeH264CapabilitiesEXT, VideoCapabilitiesKHR>
+  struct StructExtends<BufferOpaqueCaptureAddressCreateInfo, BufferCreateInfo>
   {
     enum
     {
       value = true
     };
   };
-#endif /*VK_ENABLE_BETA_EXTENSIONS*/
-#if defined( VK_ENABLE_BETA_EXTENSIONS )
   template <>
-  struct StructExtends<VideoDecodeH264DpbSlotInfoEXT, VideoReferenceSlotKHR>
+  struct StructExtends<MemoryOpaqueCaptureAddressAllocateInfo, MemoryAllocateInfo>
   {
     enum
     {
       value = true
     };
   };
-#endif /*VK_ENABLE_BETA_EXTENSIONS*/
-#if defined( VK_ENABLE_BETA_EXTENSIONS )
+
+  //=== VK_KHR_swapchain ===
   template <>
-  struct StructExtends<VideoDecodeH264MvcEXT, VideoDecodeH264PictureInfoEXT>
+  struct StructExtends<ImageSwapchainCreateInfoKHR, ImageCreateInfo>
   {
     enum
     {
       value = true
     };
   };
-#endif /*VK_ENABLE_BETA_EXTENSIONS*/
-#if defined( VK_ENABLE_BETA_EXTENSIONS )
   template <>
-  struct StructExtends<VideoDecodeH264PictureInfoEXT, VideoDecodeInfoKHR>
+  struct StructExtends<BindImageMemorySwapchainInfoKHR, BindImageMemoryInfo>
   {
     enum
     {
       value = true
     };
   };
-#endif /*VK_ENABLE_BETA_EXTENSIONS*/
-#if defined( VK_ENABLE_BETA_EXTENSIONS )
   template <>
-  struct StructExtends<VideoDecodeH264ProfileEXT, VideoProfileKHR>
+  struct StructExtends<DeviceGroupPresentInfoKHR, PresentInfoKHR>
   {
     enum
     {
       value = true
     };
   };
-#endif /*VK_ENABLE_BETA_EXTENSIONS*/
-#if defined( VK_ENABLE_BETA_EXTENSIONS )
   template <>
-  struct StructExtends<VideoDecodeH264SessionCreateInfoEXT, VideoSessionCreateInfoKHR>
+  struct StructExtends<DeviceGroupSwapchainCreateInfoKHR, SwapchainCreateInfoKHR>
   {
     enum
     {
       value = true
     };
   };
-#endif /*VK_ENABLE_BETA_EXTENSIONS*/
-#if defined( VK_ENABLE_BETA_EXTENSIONS )
+
+  //=== VK_KHR_display_swapchain ===
   template <>
-  struct StructExtends<VideoDecodeH264SessionParametersAddInfoEXT, VideoSessionParametersUpdateInfoKHR>
+  struct StructExtends<DisplayPresentInfoKHR, PresentInfoKHR>
   {
     enum
     {
       value = true
     };
   };
-#endif /*VK_ENABLE_BETA_EXTENSIONS*/
-#if defined( VK_ENABLE_BETA_EXTENSIONS )
+
+  //=== VK_EXT_debug_report ===
   template <>
-  struct StructExtends<VideoDecodeH264SessionParametersCreateInfoEXT, VideoSessionParametersCreateInfoKHR>
+  struct StructExtends<DebugReportCallbackCreateInfoEXT, InstanceCreateInfo>
   {
     enum
     {
       value = true
     };
   };
-#endif /*VK_ENABLE_BETA_EXTENSIONS*/
-#if defined( VK_ENABLE_BETA_EXTENSIONS )
+
+  //=== VK_AMD_rasterization_order ===
   template <>
-  struct StructExtends<VideoDecodeH265CapabilitiesEXT, VideoCapabilitiesKHR>
+  struct StructExtends<PipelineRasterizationStateRasterizationOrderAMD, PipelineRasterizationStateCreateInfo>
   {
     enum
     {
       value = true
     };
   };
-#endif /*VK_ENABLE_BETA_EXTENSIONS*/
+
 #if defined( VK_ENABLE_BETA_EXTENSIONS )
+  //=== VK_KHR_video_queue ===
   template <>
-  struct StructExtends<VideoDecodeH265DpbSlotInfoEXT, VideoReferenceSlotKHR>
+  struct StructExtends<VideoQueueFamilyProperties2KHR, QueueFamilyProperties2>
   {
     enum
     {
       value = true
     };
   };
-#endif /*VK_ENABLE_BETA_EXTENSIONS*/
-#if defined( VK_ENABLE_BETA_EXTENSIONS )
-  template <>
-  struct StructExtends<VideoDecodeH265PictureInfoEXT, VideoDecodeInfoKHR>
-  {
-    enum
-    {
-      value = true
-    };
-  };
-#endif /*VK_ENABLE_BETA_EXTENSIONS*/
-#if defined( VK_ENABLE_BETA_EXTENSIONS )
-  template <>
-  struct StructExtends<VideoDecodeH265ProfileEXT, VideoProfileKHR>
-  {
-    enum
-    {
-      value = true
-    };
-  };
-#endif /*VK_ENABLE_BETA_EXTENSIONS*/
-#if defined( VK_ENABLE_BETA_EXTENSIONS )
-  template <>
-  struct StructExtends<VideoDecodeH265SessionCreateInfoEXT, VideoSessionCreateInfoKHR>
-  {
-    enum
-    {
-      value = true
-    };
-  };
-#endif /*VK_ENABLE_BETA_EXTENSIONS*/
-#if defined( VK_ENABLE_BETA_EXTENSIONS )
-  template <>
-  struct StructExtends<VideoDecodeH265SessionParametersAddInfoEXT, VideoSessionParametersUpdateInfoKHR>
-  {
-    enum
-    {
-      value = true
-    };
-  };
-#endif /*VK_ENABLE_BETA_EXTENSIONS*/
-#if defined( VK_ENABLE_BETA_EXTENSIONS )
-  template <>
-  struct StructExtends<VideoDecodeH265SessionParametersCreateInfoEXT, VideoSessionParametersCreateInfoKHR>
-  {
-    enum
-    {
-      value = true
-    };
-  };
-#endif /*VK_ENABLE_BETA_EXTENSIONS*/
-#if defined( VK_ENABLE_BETA_EXTENSIONS )
-  template <>
-  struct StructExtends<VideoEncodeH264CapabilitiesEXT, VideoCapabilitiesKHR>
-  {
-    enum
-    {
-      value = true
-    };
-  };
-#endif /*VK_ENABLE_BETA_EXTENSIONS*/
-#if defined( VK_ENABLE_BETA_EXTENSIONS )
-  template <>
-  struct StructExtends<VideoEncodeH264EmitPictureParametersEXT, VideoEncodeInfoKHR>
-  {
-    enum
-    {
-      value = true
-    };
-  };
-#endif /*VK_ENABLE_BETA_EXTENSIONS*/
-#if defined( VK_ENABLE_BETA_EXTENSIONS )
-  template <>
-  struct StructExtends<VideoEncodeH264ProfileEXT, VideoProfileKHR>
-  {
-    enum
-    {
-      value = true
-    };
-  };
-#endif /*VK_ENABLE_BETA_EXTENSIONS*/
-#if defined( VK_ENABLE_BETA_EXTENSIONS )
-  template <>
-  struct StructExtends<VideoEncodeH264SessionCreateInfoEXT, VideoSessionCreateInfoKHR>
-  {
-    enum
-    {
-      value = true
-    };
-  };
-#endif /*VK_ENABLE_BETA_EXTENSIONS*/
-#if defined( VK_ENABLE_BETA_EXTENSIONS )
-  template <>
-  struct StructExtends<VideoEncodeH264SessionParametersAddInfoEXT, VideoSessionParametersUpdateInfoKHR>
-  {
-    enum
-    {
-      value = true
-    };
-  };
-#endif /*VK_ENABLE_BETA_EXTENSIONS*/
-#if defined( VK_ENABLE_BETA_EXTENSIONS )
-  template <>
-  struct StructExtends<VideoEncodeH264SessionParametersCreateInfoEXT, VideoSessionParametersCreateInfoKHR>
-  {
-    enum
-    {
-      value = true
-    };
-  };
-#endif /*VK_ENABLE_BETA_EXTENSIONS*/
-#if defined( VK_ENABLE_BETA_EXTENSIONS )
-  template <>
-  struct StructExtends<VideoEncodeH264VclFrameInfoEXT, VideoEncodeInfoKHR>
-  {
-    enum
-    {
-      value = true
-    };
-  };
-#endif /*VK_ENABLE_BETA_EXTENSIONS*/
-#if defined( VK_ENABLE_BETA_EXTENSIONS )
-  template <>
-  struct StructExtends<VideoEncodeRateControlInfoKHR, VideoCodingControlInfoKHR>
-  {
-    enum
-    {
-      value = true
-    };
-  };
-#endif /*VK_ENABLE_BETA_EXTENSIONS*/
-#if defined( VK_ENABLE_BETA_EXTENSIONS )
   template <>
   struct StructExtends<VideoProfileKHR, QueryPoolCreateInfo>
   {
@@ -9911,8 +7494,6 @@
       value = true
     };
   };
-#endif /*VK_ENABLE_BETA_EXTENSIONS*/
-#if defined( VK_ENABLE_BETA_EXTENSIONS )
   template <>
   struct StructExtends<VideoProfilesKHR, FormatProperties2>
   {
@@ -9946,9 +7527,119 @@
     };
   };
 #endif /*VK_ENABLE_BETA_EXTENSIONS*/
-#if defined( VK_ENABLE_BETA_EXTENSIONS )
+
+  //=== VK_NV_dedicated_allocation ===
   template <>
-  struct StructExtends<VideoQueueFamilyProperties2KHR, QueueFamilyProperties2>
+  struct StructExtends<DedicatedAllocationImageCreateInfoNV, ImageCreateInfo>
+  {
+    enum
+    {
+      value = true
+    };
+  };
+  template <>
+  struct StructExtends<DedicatedAllocationBufferCreateInfoNV, BufferCreateInfo>
+  {
+    enum
+    {
+      value = true
+    };
+  };
+  template <>
+  struct StructExtends<DedicatedAllocationMemoryAllocateInfoNV, MemoryAllocateInfo>
+  {
+    enum
+    {
+      value = true
+    };
+  };
+
+  //=== VK_EXT_transform_feedback ===
+  template <>
+  struct StructExtends<PhysicalDeviceTransformFeedbackFeaturesEXT, PhysicalDeviceFeatures2>
+  {
+    enum
+    {
+      value = true
+    };
+  };
+  template <>
+  struct StructExtends<PhysicalDeviceTransformFeedbackFeaturesEXT, DeviceCreateInfo>
+  {
+    enum
+    {
+      value = true
+    };
+  };
+  template <>
+  struct StructExtends<PhysicalDeviceTransformFeedbackPropertiesEXT, PhysicalDeviceProperties2>
+  {
+    enum
+    {
+      value = true
+    };
+  };
+  template <>
+  struct StructExtends<PipelineRasterizationStateStreamCreateInfoEXT, PipelineRasterizationStateCreateInfo>
+  {
+    enum
+    {
+      value = true
+    };
+  };
+
+#if defined( VK_ENABLE_BETA_EXTENSIONS )
+  //=== VK_EXT_video_encode_h264 ===
+  template <>
+  struct StructExtends<VideoEncodeH264CapabilitiesEXT, VideoCapabilitiesKHR>
+  {
+    enum
+    {
+      value = true
+    };
+  };
+  template <>
+  struct StructExtends<VideoEncodeH264SessionCreateInfoEXT, VideoSessionCreateInfoKHR>
+  {
+    enum
+    {
+      value = true
+    };
+  };
+  template <>
+  struct StructExtends<VideoEncodeH264SessionParametersCreateInfoEXT, VideoSessionParametersCreateInfoKHR>
+  {
+    enum
+    {
+      value = true
+    };
+  };
+  template <>
+  struct StructExtends<VideoEncodeH264SessionParametersAddInfoEXT, VideoSessionParametersUpdateInfoKHR>
+  {
+    enum
+    {
+      value = true
+    };
+  };
+  template <>
+  struct StructExtends<VideoEncodeH264VclFrameInfoEXT, VideoEncodeInfoKHR>
+  {
+    enum
+    {
+      value = true
+    };
+  };
+  template <>
+  struct StructExtends<VideoEncodeH264EmitPictureParametersEXT, VideoEncodeInfoKHR>
+  {
+    enum
+    {
+      value = true
+    };
+  };
+  template <>
+  struct StructExtends<VideoEncodeH264ProfileEXT, VideoProfileKHR>
   {
     enum
     {
@@ -9956,9 +7647,11 @@
     };
   };
 #endif /*VK_ENABLE_BETA_EXTENSIONS*/
-#if defined( VK_USE_PLATFORM_WIN32_KHR )
+
+#if defined( VK_ENABLE_BETA_EXTENSIONS )
+  //=== VK_EXT_video_decode_h264 ===
   template <>
-  struct StructExtends<Win32KeyedMutexAcquireReleaseInfoKHR, SubmitInfo>
+  struct StructExtends<VideoDecodeH264ProfileEXT, VideoProfileKHR>
   {
     enum
     {
@@ -9966,7 +7659,121 @@
     };
   };
   template <>
-  struct StructExtends<Win32KeyedMutexAcquireReleaseInfoKHR, SubmitInfo2KHR>
+  struct StructExtends<VideoDecodeH264CapabilitiesEXT, VideoCapabilitiesKHR>
+  {
+    enum
+    {
+      value = true
+    };
+  };
+  template <>
+  struct StructExtends<VideoDecodeH264SessionCreateInfoEXT, VideoSessionCreateInfoKHR>
+  {
+    enum
+    {
+      value = true
+    };
+  };
+  template <>
+  struct StructExtends<VideoDecodeH264SessionParametersCreateInfoEXT, VideoSessionParametersCreateInfoKHR>
+  {
+    enum
+    {
+      value = true
+    };
+  };
+  template <>
+  struct StructExtends<VideoDecodeH264SessionParametersAddInfoEXT, VideoSessionParametersUpdateInfoKHR>
+  {
+    enum
+    {
+      value = true
+    };
+  };
+  template <>
+  struct StructExtends<VideoDecodeH264PictureInfoEXT, VideoDecodeInfoKHR>
+  {
+    enum
+    {
+      value = true
+    };
+  };
+  template <>
+  struct StructExtends<VideoDecodeH264MvcEXT, VideoDecodeH264PictureInfoEXT>
+  {
+    enum
+    {
+      value = true
+    };
+  };
+  template <>
+  struct StructExtends<VideoDecodeH264DpbSlotInfoEXT, VideoReferenceSlotKHR>
+  {
+    enum
+    {
+      value = true
+    };
+  };
+#endif /*VK_ENABLE_BETA_EXTENSIONS*/
+
+  //=== VK_AMD_texture_gather_bias_lod ===
+  template <>
+  struct StructExtends<TextureLODGatherFormatPropertiesAMD, ImageFormatProperties2>
+  {
+    enum
+    {
+      value = true
+    };
+  };
+
+  //=== VK_NV_corner_sampled_image ===
+  template <>
+  struct StructExtends<PhysicalDeviceCornerSampledImageFeaturesNV, PhysicalDeviceFeatures2>
+  {
+    enum
+    {
+      value = true
+    };
+  };
+  template <>
+  struct StructExtends<PhysicalDeviceCornerSampledImageFeaturesNV, DeviceCreateInfo>
+  {
+    enum
+    {
+      value = true
+    };
+  };
+
+  //=== VK_NV_external_memory ===
+  template <>
+  struct StructExtends<ExternalMemoryImageCreateInfoNV, ImageCreateInfo>
+  {
+    enum
+    {
+      value = true
+    };
+  };
+  template <>
+  struct StructExtends<ExportMemoryAllocateInfoNV, MemoryAllocateInfo>
+  {
+    enum
+    {
+      value = true
+    };
+  };
+
+#if defined( VK_USE_PLATFORM_WIN32_KHR )
+  //=== VK_NV_external_memory_win32 ===
+  template <>
+  struct StructExtends<ImportMemoryWin32HandleInfoNV, MemoryAllocateInfo>
+  {
+    enum
+    {
+      value = true
+    };
+  };
+  template <>
+  struct StructExtends<ExportMemoryWin32HandleInfoNV, MemoryAllocateInfo>
   {
     enum
     {
@@ -9974,7 +7781,9 @@
     };
   };
 #endif /*VK_USE_PLATFORM_WIN32_KHR*/
+
 #if defined( VK_USE_PLATFORM_WIN32_KHR )
+  //=== VK_NV_win32_keyed_mutex ===
   template <>
   struct StructExtends<Win32KeyedMutexAcquireReleaseInfoNV, SubmitInfo>
   {
@@ -9992,6 +7801,544 @@
     };
   };
 #endif /*VK_USE_PLATFORM_WIN32_KHR*/
+
+  //=== VK_EXT_validation_flags ===
+  template <>
+  struct StructExtends<ValidationFlagsEXT, InstanceCreateInfo>
+  {
+    enum
+    {
+      value = true
+    };
+  };
+
+  //=== VK_EXT_texture_compression_astc_hdr ===
+  template <>
+  struct StructExtends<PhysicalDeviceTextureCompressionASTCHDRFeaturesEXT, PhysicalDeviceFeatures2>
+  {
+    enum
+    {
+      value = true
+    };
+  };
+  template <>
+  struct StructExtends<PhysicalDeviceTextureCompressionASTCHDRFeaturesEXT, DeviceCreateInfo>
+  {
+    enum
+    {
+      value = true
+    };
+  };
+
+  //=== VK_EXT_astc_decode_mode ===
+  template <>
+  struct StructExtends<ImageViewASTCDecodeModeEXT, ImageViewCreateInfo>
+  {
+    enum
+    {
+      value = true
+    };
+  };
+  template <>
+  struct StructExtends<PhysicalDeviceASTCDecodeFeaturesEXT, PhysicalDeviceFeatures2>
+  {
+    enum
+    {
+      value = true
+    };
+  };
+  template <>
+  struct StructExtends<PhysicalDeviceASTCDecodeFeaturesEXT, DeviceCreateInfo>
+  {
+    enum
+    {
+      value = true
+    };
+  };
+
+#if defined( VK_USE_PLATFORM_WIN32_KHR )
+  //=== VK_KHR_external_memory_win32 ===
+  template <>
+  struct StructExtends<ImportMemoryWin32HandleInfoKHR, MemoryAllocateInfo>
+  {
+    enum
+    {
+      value = true
+    };
+  };
+  template <>
+  struct StructExtends<ExportMemoryWin32HandleInfoKHR, MemoryAllocateInfo>
+  {
+    enum
+    {
+      value = true
+    };
+  };
+#endif /*VK_USE_PLATFORM_WIN32_KHR*/
+
+  //=== VK_KHR_external_memory_fd ===
+  template <>
+  struct StructExtends<ImportMemoryFdInfoKHR, MemoryAllocateInfo>
+  {
+    enum
+    {
+      value = true
+    };
+  };
+
+#if defined( VK_USE_PLATFORM_WIN32_KHR )
+  //=== VK_KHR_win32_keyed_mutex ===
+  template <>
+  struct StructExtends<Win32KeyedMutexAcquireReleaseInfoKHR, SubmitInfo>
+  {
+    enum
+    {
+      value = true
+    };
+  };
+  template <>
+  struct StructExtends<Win32KeyedMutexAcquireReleaseInfoKHR, SubmitInfo2KHR>
+  {
+    enum
+    {
+      value = true
+    };
+  };
+#endif /*VK_USE_PLATFORM_WIN32_KHR*/
+
+#if defined( VK_USE_PLATFORM_WIN32_KHR )
+  //=== VK_KHR_external_semaphore_win32 ===
+  template <>
+  struct StructExtends<ExportSemaphoreWin32HandleInfoKHR, SemaphoreCreateInfo>
+  {
+    enum
+    {
+      value = true
+    };
+  };
+  template <>
+  struct StructExtends<D3D12FenceSubmitInfoKHR, SubmitInfo>
+  {
+    enum
+    {
+      value = true
+    };
+  };
+#endif /*VK_USE_PLATFORM_WIN32_KHR*/
+
+  //=== VK_KHR_push_descriptor ===
+  template <>
+  struct StructExtends<PhysicalDevicePushDescriptorPropertiesKHR, PhysicalDeviceProperties2>
+  {
+    enum
+    {
+      value = true
+    };
+  };
+
+  //=== VK_EXT_conditional_rendering ===
+  template <>
+  struct StructExtends<PhysicalDeviceConditionalRenderingFeaturesEXT, PhysicalDeviceFeatures2>
+  {
+    enum
+    {
+      value = true
+    };
+  };
+  template <>
+  struct StructExtends<PhysicalDeviceConditionalRenderingFeaturesEXT, DeviceCreateInfo>
+  {
+    enum
+    {
+      value = true
+    };
+  };
+  template <>
+  struct StructExtends<CommandBufferInheritanceConditionalRenderingInfoEXT, CommandBufferInheritanceInfo>
+  {
+    enum
+    {
+      value = true
+    };
+  };
+
+  //=== VK_KHR_incremental_present ===
+  template <>
+  struct StructExtends<PresentRegionsKHR, PresentInfoKHR>
+  {
+    enum
+    {
+      value = true
+    };
+  };
+
+  //=== VK_NV_clip_space_w_scaling ===
+  template <>
+  struct StructExtends<PipelineViewportWScalingStateCreateInfoNV, PipelineViewportStateCreateInfo>
+  {
+    enum
+    {
+      value = true
+    };
+  };
+
+  //=== VK_EXT_display_control ===
+  template <>
+  struct StructExtends<SwapchainCounterCreateInfoEXT, SwapchainCreateInfoKHR>
+  {
+    enum
+    {
+      value = true
+    };
+  };
+
+  //=== VK_GOOGLE_display_timing ===
+  template <>
+  struct StructExtends<PresentTimesInfoGOOGLE, PresentInfoKHR>
+  {
+    enum
+    {
+      value = true
+    };
+  };
+
+  //=== VK_NVX_multiview_per_view_attributes ===
+  template <>
+  struct StructExtends<PhysicalDeviceMultiviewPerViewAttributesPropertiesNVX, PhysicalDeviceProperties2>
+  {
+    enum
+    {
+      value = true
+    };
+  };
+
+  //=== VK_NV_viewport_swizzle ===
+  template <>
+  struct StructExtends<PipelineViewportSwizzleStateCreateInfoNV, PipelineViewportStateCreateInfo>
+  {
+    enum
+    {
+      value = true
+    };
+  };
+
+  //=== VK_EXT_discard_rectangles ===
+  template <>
+  struct StructExtends<PhysicalDeviceDiscardRectanglePropertiesEXT, PhysicalDeviceProperties2>
+  {
+    enum
+    {
+      value = true
+    };
+  };
+  template <>
+  struct StructExtends<PipelineDiscardRectangleStateCreateInfoEXT, GraphicsPipelineCreateInfo>
+  {
+    enum
+    {
+      value = true
+    };
+  };
+
+  //=== VK_EXT_conservative_rasterization ===
+  template <>
+  struct StructExtends<PhysicalDeviceConservativeRasterizationPropertiesEXT, PhysicalDeviceProperties2>
+  {
+    enum
+    {
+      value = true
+    };
+  };
+  template <>
+  struct StructExtends<PipelineRasterizationConservativeStateCreateInfoEXT, PipelineRasterizationStateCreateInfo>
+  {
+    enum
+    {
+      value = true
+    };
+  };
+
+  //=== VK_EXT_depth_clip_enable ===
+  template <>
+  struct StructExtends<PhysicalDeviceDepthClipEnableFeaturesEXT, PhysicalDeviceFeatures2>
+  {
+    enum
+    {
+      value = true
+    };
+  };
+  template <>
+  struct StructExtends<PhysicalDeviceDepthClipEnableFeaturesEXT, DeviceCreateInfo>
+  {
+    enum
+    {
+      value = true
+    };
+  };
+  template <>
+  struct StructExtends<PipelineRasterizationDepthClipStateCreateInfoEXT, PipelineRasterizationStateCreateInfo>
+  {
+    enum
+    {
+      value = true
+    };
+  };
+
+  //=== VK_KHR_shared_presentable_image ===
+  template <>
+  struct StructExtends<SharedPresentSurfaceCapabilitiesKHR, SurfaceCapabilities2KHR>
+  {
+    enum
+    {
+      value = true
+    };
+  };
+
+#if defined( VK_USE_PLATFORM_WIN32_KHR )
+  //=== VK_KHR_external_fence_win32 ===
+  template <>
+  struct StructExtends<ExportFenceWin32HandleInfoKHR, FenceCreateInfo>
+  {
+    enum
+    {
+      value = true
+    };
+  };
+#endif /*VK_USE_PLATFORM_WIN32_KHR*/
+
+  //=== VK_KHR_performance_query ===
+  template <>
+  struct StructExtends<PhysicalDevicePerformanceQueryFeaturesKHR, PhysicalDeviceFeatures2>
+  {
+    enum
+    {
+      value = true
+    };
+  };
+  template <>
+  struct StructExtends<PhysicalDevicePerformanceQueryFeaturesKHR, DeviceCreateInfo>
+  {
+    enum
+    {
+      value = true
+    };
+  };
+  template <>
+  struct StructExtends<PhysicalDevicePerformanceQueryPropertiesKHR, PhysicalDeviceProperties2>
+  {
+    enum
+    {
+      value = true
+    };
+  };
+  template <>
+  struct StructExtends<QueryPoolPerformanceCreateInfoKHR, QueryPoolCreateInfo>
+  {
+    enum
+    {
+      value = true
+    };
+  };
+  template <>
+  struct StructExtends<PerformanceQuerySubmitInfoKHR, SubmitInfo>
+  {
+    enum
+    {
+      value = true
+    };
+  };
+  template <>
+  struct StructExtends<PerformanceQuerySubmitInfoKHR, SubmitInfo2KHR>
+  {
+    enum
+    {
+      value = true
+    };
+  };
+
+  //=== VK_EXT_debug_utils ===
+  template <>
+  struct StructExtends<DebugUtilsMessengerCreateInfoEXT, InstanceCreateInfo>
+  {
+    enum
+    {
+      value = true
+    };
+  };
+
+#if defined( VK_USE_PLATFORM_ANDROID_KHR )
+  //=== VK_ANDROID_external_memory_android_hardware_buffer ===
+  template <>
+  struct StructExtends<AndroidHardwareBufferUsageANDROID, ImageFormatProperties2>
+  {
+    enum
+    {
+      value = true
+    };
+  };
+  template <>
+  struct StructExtends<AndroidHardwareBufferFormatPropertiesANDROID, AndroidHardwareBufferPropertiesANDROID>
+  {
+    enum
+    {
+      value = true
+    };
+  };
+  template <>
+  struct StructExtends<ImportAndroidHardwareBufferInfoANDROID, MemoryAllocateInfo>
+  {
+    enum
+    {
+      value = true
+    };
+  };
+  template <>
+  struct StructExtends<ExternalFormatANDROID, ImageCreateInfo>
+  {
+    enum
+    {
+      value = true
+    };
+  };
+  template <>
+  struct StructExtends<ExternalFormatANDROID, SamplerYcbcrConversionCreateInfo>
+  {
+    enum
+    {
+      value = true
+    };
+  };
+#endif /*VK_USE_PLATFORM_ANDROID_KHR*/
+
+  //=== VK_EXT_inline_uniform_block ===
+  template <>
+  struct StructExtends<PhysicalDeviceInlineUniformBlockFeaturesEXT, PhysicalDeviceFeatures2>
+  {
+    enum
+    {
+      value = true
+    };
+  };
+  template <>
+  struct StructExtends<PhysicalDeviceInlineUniformBlockFeaturesEXT, DeviceCreateInfo>
+  {
+    enum
+    {
+      value = true
+    };
+  };
+  template <>
+  struct StructExtends<PhysicalDeviceInlineUniformBlockPropertiesEXT, PhysicalDeviceProperties2>
+  {
+    enum
+    {
+      value = true
+    };
+  };
+  template <>
+  struct StructExtends<WriteDescriptorSetInlineUniformBlockEXT, WriteDescriptorSet>
+  {
+    enum
+    {
+      value = true
+    };
+  };
+  template <>
+  struct StructExtends<DescriptorPoolInlineUniformBlockCreateInfoEXT, DescriptorPoolCreateInfo>
+  {
+    enum
+    {
+      value = true
+    };
+  };
+
+  //=== VK_EXT_sample_locations ===
+  template <>
+  struct StructExtends<SampleLocationsInfoEXT, ImageMemoryBarrier>
+  {
+    enum
+    {
+      value = true
+    };
+  };
+  template <>
+  struct StructExtends<SampleLocationsInfoEXT, ImageMemoryBarrier2KHR>
+  {
+    enum
+    {
+      value = true
+    };
+  };
+  template <>
+  struct StructExtends<RenderPassSampleLocationsBeginInfoEXT, RenderPassBeginInfo>
+  {
+    enum
+    {
+      value = true
+    };
+  };
+  template <>
+  struct StructExtends<PipelineSampleLocationsStateCreateInfoEXT, PipelineMultisampleStateCreateInfo>
+  {
+    enum
+    {
+      value = true
+    };
+  };
+  template <>
+  struct StructExtends<PhysicalDeviceSampleLocationsPropertiesEXT, PhysicalDeviceProperties2>
+  {
+    enum
+    {
+      value = true
+    };
+  };
+
+  //=== VK_EXT_blend_operation_advanced ===
+  template <>
+  struct StructExtends<PhysicalDeviceBlendOperationAdvancedFeaturesEXT, PhysicalDeviceFeatures2>
+  {
+    enum
+    {
+      value = true
+    };
+  };
+  template <>
+  struct StructExtends<PhysicalDeviceBlendOperationAdvancedFeaturesEXT, DeviceCreateInfo>
+  {
+    enum
+    {
+      value = true
+    };
+  };
+  template <>
+  struct StructExtends<PhysicalDeviceBlendOperationAdvancedPropertiesEXT, PhysicalDeviceProperties2>
+  {
+    enum
+    {
+      value = true
+    };
+  };
+  template <>
+  struct StructExtends<PipelineColorBlendAdvancedStateCreateInfoEXT, PipelineColorBlendStateCreateInfo>
+  {
+    enum
+    {
+      value = true
+    };
+  };
+
+  //=== VK_NV_fragment_coverage_to_color ===
+  template <>
+  struct StructExtends<PipelineCoverageToColorStateCreateInfoNV, PipelineMultisampleStateCreateInfo>
+  {
+    enum
+    {
+      value = true
+    };
+  };
+
+  //=== VK_KHR_acceleration_structure ===
   template <>
   struct StructExtends<WriteDescriptorSetAccelerationStructureKHR, WriteDescriptorSet>
   {
@@ -10001,6 +8348,182 @@
     };
   };
   template <>
+  struct StructExtends<PhysicalDeviceAccelerationStructureFeaturesKHR, PhysicalDeviceFeatures2>
+  {
+    enum
+    {
+      value = true
+    };
+  };
+  template <>
+  struct StructExtends<PhysicalDeviceAccelerationStructureFeaturesKHR, DeviceCreateInfo>
+  {
+    enum
+    {
+      value = true
+    };
+  };
+  template <>
+  struct StructExtends<PhysicalDeviceAccelerationStructurePropertiesKHR, PhysicalDeviceProperties2>
+  {
+    enum
+    {
+      value = true
+    };
+  };
+
+  //=== VK_NV_framebuffer_mixed_samples ===
+  template <>
+  struct StructExtends<PipelineCoverageModulationStateCreateInfoNV, PipelineMultisampleStateCreateInfo>
+  {
+    enum
+    {
+      value = true
+    };
+  };
+
+  //=== VK_NV_shader_sm_builtins ===
+  template <>
+  struct StructExtends<PhysicalDeviceShaderSMBuiltinsPropertiesNV, PhysicalDeviceProperties2>
+  {
+    enum
+    {
+      value = true
+    };
+  };
+  template <>
+  struct StructExtends<PhysicalDeviceShaderSMBuiltinsFeaturesNV, PhysicalDeviceFeatures2>
+  {
+    enum
+    {
+      value = true
+    };
+  };
+  template <>
+  struct StructExtends<PhysicalDeviceShaderSMBuiltinsFeaturesNV, DeviceCreateInfo>
+  {
+    enum
+    {
+      value = true
+    };
+  };
+
+  //=== VK_EXT_image_drm_format_modifier ===
+  template <>
+  struct StructExtends<DrmFormatModifierPropertiesListEXT, FormatProperties2>
+  {
+    enum
+    {
+      value = true
+    };
+  };
+  template <>
+  struct StructExtends<PhysicalDeviceImageDrmFormatModifierInfoEXT, PhysicalDeviceImageFormatInfo2>
+  {
+    enum
+    {
+      value = true
+    };
+  };
+  template <>
+  struct StructExtends<ImageDrmFormatModifierListCreateInfoEXT, ImageCreateInfo>
+  {
+    enum
+    {
+      value = true
+    };
+  };
+  template <>
+  struct StructExtends<ImageDrmFormatModifierExplicitCreateInfoEXT, ImageCreateInfo>
+  {
+    enum
+    {
+      value = true
+    };
+  };
+
+  //=== VK_EXT_validation_cache ===
+  template <>
+  struct StructExtends<ShaderModuleValidationCacheCreateInfoEXT, ShaderModuleCreateInfo>
+  {
+    enum
+    {
+      value = true
+    };
+  };
+
+#if defined( VK_ENABLE_BETA_EXTENSIONS )
+  //=== VK_KHR_portability_subset ===
+  template <>
+  struct StructExtends<PhysicalDevicePortabilitySubsetFeaturesKHR, PhysicalDeviceFeatures2>
+  {
+    enum
+    {
+      value = true
+    };
+  };
+  template <>
+  struct StructExtends<PhysicalDevicePortabilitySubsetFeaturesKHR, DeviceCreateInfo>
+  {
+    enum
+    {
+      value = true
+    };
+  };
+  template <>
+  struct StructExtends<PhysicalDevicePortabilitySubsetPropertiesKHR, PhysicalDeviceProperties2>
+  {
+    enum
+    {
+      value = true
+    };
+  };
+#endif /*VK_ENABLE_BETA_EXTENSIONS*/
+
+  //=== VK_NV_shading_rate_image ===
+  template <>
+  struct StructExtends<PipelineViewportShadingRateImageStateCreateInfoNV, PipelineViewportStateCreateInfo>
+  {
+    enum
+    {
+      value = true
+    };
+  };
+  template <>
+  struct StructExtends<PhysicalDeviceShadingRateImageFeaturesNV, PhysicalDeviceFeatures2>
+  {
+    enum
+    {
+      value = true
+    };
+  };
+  template <>
+  struct StructExtends<PhysicalDeviceShadingRateImageFeaturesNV, DeviceCreateInfo>
+  {
+    enum
+    {
+      value = true
+    };
+  };
+  template <>
+  struct StructExtends<PhysicalDeviceShadingRateImagePropertiesNV, PhysicalDeviceProperties2>
+  {
+    enum
+    {
+      value = true
+    };
+  };
+  template <>
+  struct StructExtends<PipelineViewportCoarseSampleOrderStateCreateInfoNV, PipelineViewportStateCreateInfo>
+  {
+    enum
+    {
+      value = true
+    };
+  };
+
+  //=== VK_NV_ray_tracing ===
+  template <>
   struct StructExtends<WriteDescriptorSetAccelerationStructureNV, WriteDescriptorSet>
   {
     enum
@@ -10009,7 +8532,1936 @@
     };
   };
   template <>
-  struct StructExtends<WriteDescriptorSetInlineUniformBlockEXT, WriteDescriptorSet>
+  struct StructExtends<PhysicalDeviceRayTracingPropertiesNV, PhysicalDeviceProperties2>
+  {
+    enum
+    {
+      value = true
+    };
+  };
+
+  //=== VK_NV_representative_fragment_test ===
+  template <>
+  struct StructExtends<PhysicalDeviceRepresentativeFragmentTestFeaturesNV, PhysicalDeviceFeatures2>
+  {
+    enum
+    {
+      value = true
+    };
+  };
+  template <>
+  struct StructExtends<PhysicalDeviceRepresentativeFragmentTestFeaturesNV, DeviceCreateInfo>
+  {
+    enum
+    {
+      value = true
+    };
+  };
+  template <>
+  struct StructExtends<PipelineRepresentativeFragmentTestStateCreateInfoNV, GraphicsPipelineCreateInfo>
+  {
+    enum
+    {
+      value = true
+    };
+  };
+
+  //=== VK_EXT_filter_cubic ===
+  template <>
+  struct StructExtends<PhysicalDeviceImageViewImageFormatInfoEXT, PhysicalDeviceImageFormatInfo2>
+  {
+    enum
+    {
+      value = true
+    };
+  };
+  template <>
+  struct StructExtends<FilterCubicImageViewImageFormatPropertiesEXT, ImageFormatProperties2>
+  {
+    enum
+    {
+      value = true
+    };
+  };
+
+  //=== VK_EXT_global_priority ===
+  template <>
+  struct StructExtends<DeviceQueueGlobalPriorityCreateInfoEXT, DeviceQueueCreateInfo>
+  {
+    enum
+    {
+      value = true
+    };
+  };
+
+  //=== VK_EXT_external_memory_host ===
+  template <>
+  struct StructExtends<ImportMemoryHostPointerInfoEXT, MemoryAllocateInfo>
+  {
+    enum
+    {
+      value = true
+    };
+  };
+  template <>
+  struct StructExtends<PhysicalDeviceExternalMemoryHostPropertiesEXT, PhysicalDeviceProperties2>
+  {
+    enum
+    {
+      value = true
+    };
+  };
+
+  //=== VK_KHR_shader_clock ===
+  template <>
+  struct StructExtends<PhysicalDeviceShaderClockFeaturesKHR, PhysicalDeviceFeatures2>
+  {
+    enum
+    {
+      value = true
+    };
+  };
+  template <>
+  struct StructExtends<PhysicalDeviceShaderClockFeaturesKHR, DeviceCreateInfo>
+  {
+    enum
+    {
+      value = true
+    };
+  };
+
+  //=== VK_AMD_pipeline_compiler_control ===
+  template <>
+  struct StructExtends<PipelineCompilerControlCreateInfoAMD, GraphicsPipelineCreateInfo>
+  {
+    enum
+    {
+      value = true
+    };
+  };
+  template <>
+  struct StructExtends<PipelineCompilerControlCreateInfoAMD, ComputePipelineCreateInfo>
+  {
+    enum
+    {
+      value = true
+    };
+  };
+
+  //=== VK_AMD_shader_core_properties ===
+  template <>
+  struct StructExtends<PhysicalDeviceShaderCorePropertiesAMD, PhysicalDeviceProperties2>
+  {
+    enum
+    {
+      value = true
+    };
+  };
+
+#if defined( VK_ENABLE_BETA_EXTENSIONS )
+  //=== VK_EXT_video_decode_h265 ===
+  template <>
+  struct StructExtends<VideoDecodeH265ProfileEXT, VideoProfileKHR>
+  {
+    enum
+    {
+      value = true
+    };
+  };
+  template <>
+  struct StructExtends<VideoDecodeH265CapabilitiesEXT, VideoCapabilitiesKHR>
+  {
+    enum
+    {
+      value = true
+    };
+  };
+  template <>
+  struct StructExtends<VideoDecodeH265SessionCreateInfoEXT, VideoSessionCreateInfoKHR>
+  {
+    enum
+    {
+      value = true
+    };
+  };
+  template <>
+  struct StructExtends<VideoDecodeH265SessionParametersCreateInfoEXT, VideoSessionParametersCreateInfoKHR>
+  {
+    enum
+    {
+      value = true
+    };
+  };
+  template <>
+  struct StructExtends<VideoDecodeH265SessionParametersAddInfoEXT, VideoSessionParametersUpdateInfoKHR>
+  {
+    enum
+    {
+      value = true
+    };
+  };
+  template <>
+  struct StructExtends<VideoDecodeH265PictureInfoEXT, VideoDecodeInfoKHR>
+  {
+    enum
+    {
+      value = true
+    };
+  };
+  template <>
+  struct StructExtends<VideoDecodeH265DpbSlotInfoEXT, VideoReferenceSlotKHR>
+  {
+    enum
+    {
+      value = true
+    };
+  };
+#endif /*VK_ENABLE_BETA_EXTENSIONS*/
+
+  //=== VK_AMD_memory_overallocation_behavior ===
+  template <>
+  struct StructExtends<DeviceMemoryOverallocationCreateInfoAMD, DeviceCreateInfo>
+  {
+    enum
+    {
+      value = true
+    };
+  };
+
+  //=== VK_EXT_vertex_attribute_divisor ===
+  template <>
+  struct StructExtends<PhysicalDeviceVertexAttributeDivisorPropertiesEXT, PhysicalDeviceProperties2>
+  {
+    enum
+    {
+      value = true
+    };
+  };
+  template <>
+  struct StructExtends<PipelineVertexInputDivisorStateCreateInfoEXT, PipelineVertexInputStateCreateInfo>
+  {
+    enum
+    {
+      value = true
+    };
+  };
+  template <>
+  struct StructExtends<PhysicalDeviceVertexAttributeDivisorFeaturesEXT, PhysicalDeviceFeatures2>
+  {
+    enum
+    {
+      value = true
+    };
+  };
+  template <>
+  struct StructExtends<PhysicalDeviceVertexAttributeDivisorFeaturesEXT, DeviceCreateInfo>
+  {
+    enum
+    {
+      value = true
+    };
+  };
+
+#if defined( VK_USE_PLATFORM_GGP )
+  //=== VK_GGP_frame_token ===
+  template <>
+  struct StructExtends<PresentFrameTokenGGP, PresentInfoKHR>
+  {
+    enum
+    {
+      value = true
+    };
+  };
+#endif /*VK_USE_PLATFORM_GGP*/
+
+  //=== VK_EXT_pipeline_creation_feedback ===
+  template <>
+  struct StructExtends<PipelineCreationFeedbackCreateInfoEXT, GraphicsPipelineCreateInfo>
+  {
+    enum
+    {
+      value = true
+    };
+  };
+  template <>
+  struct StructExtends<PipelineCreationFeedbackCreateInfoEXT, ComputePipelineCreateInfo>
+  {
+    enum
+    {
+      value = true
+    };
+  };
+  template <>
+  struct StructExtends<PipelineCreationFeedbackCreateInfoEXT, RayTracingPipelineCreateInfoNV>
+  {
+    enum
+    {
+      value = true
+    };
+  };
+  template <>
+  struct StructExtends<PipelineCreationFeedbackCreateInfoEXT, RayTracingPipelineCreateInfoKHR>
+  {
+    enum
+    {
+      value = true
+    };
+  };
+
+  //=== VK_NV_compute_shader_derivatives ===
+  template <>
+  struct StructExtends<PhysicalDeviceComputeShaderDerivativesFeaturesNV, PhysicalDeviceFeatures2>
+  {
+    enum
+    {
+      value = true
+    };
+  };
+  template <>
+  struct StructExtends<PhysicalDeviceComputeShaderDerivativesFeaturesNV, DeviceCreateInfo>
+  {
+    enum
+    {
+      value = true
+    };
+  };
+
+  //=== VK_NV_mesh_shader ===
+  template <>
+  struct StructExtends<PhysicalDeviceMeshShaderFeaturesNV, PhysicalDeviceFeatures2>
+  {
+    enum
+    {
+      value = true
+    };
+  };
+  template <>
+  struct StructExtends<PhysicalDeviceMeshShaderFeaturesNV, DeviceCreateInfo>
+  {
+    enum
+    {
+      value = true
+    };
+  };
+  template <>
+  struct StructExtends<PhysicalDeviceMeshShaderPropertiesNV, PhysicalDeviceProperties2>
+  {
+    enum
+    {
+      value = true
+    };
+  };
+
+  //=== VK_NV_fragment_shader_barycentric ===
+  template <>
+  struct StructExtends<PhysicalDeviceFragmentShaderBarycentricFeaturesNV, PhysicalDeviceFeatures2>
+  {
+    enum
+    {
+      value = true
+    };
+  };
+  template <>
+  struct StructExtends<PhysicalDeviceFragmentShaderBarycentricFeaturesNV, DeviceCreateInfo>
+  {
+    enum
+    {
+      value = true
+    };
+  };
+
+  //=== VK_NV_shader_image_footprint ===
+  template <>
+  struct StructExtends<PhysicalDeviceShaderImageFootprintFeaturesNV, PhysicalDeviceFeatures2>
+  {
+    enum
+    {
+      value = true
+    };
+  };
+  template <>
+  struct StructExtends<PhysicalDeviceShaderImageFootprintFeaturesNV, DeviceCreateInfo>
+  {
+    enum
+    {
+      value = true
+    };
+  };
+
+  //=== VK_NV_scissor_exclusive ===
+  template <>
+  struct StructExtends<PipelineViewportExclusiveScissorStateCreateInfoNV, PipelineViewportStateCreateInfo>
+  {
+    enum
+    {
+      value = true
+    };
+  };
+  template <>
+  struct StructExtends<PhysicalDeviceExclusiveScissorFeaturesNV, PhysicalDeviceFeatures2>
+  {
+    enum
+    {
+      value = true
+    };
+  };
+  template <>
+  struct StructExtends<PhysicalDeviceExclusiveScissorFeaturesNV, DeviceCreateInfo>
+  {
+    enum
+    {
+      value = true
+    };
+  };
+
+  //=== VK_NV_device_diagnostic_checkpoints ===
+  template <>
+  struct StructExtends<QueueFamilyCheckpointPropertiesNV, QueueFamilyProperties2>
+  {
+    enum
+    {
+      value = true
+    };
+  };
+
+  //=== VK_INTEL_shader_integer_functions2 ===
+  template <>
+  struct StructExtends<PhysicalDeviceShaderIntegerFunctions2FeaturesINTEL, PhysicalDeviceFeatures2>
+  {
+    enum
+    {
+      value = true
+    };
+  };
+  template <>
+  struct StructExtends<PhysicalDeviceShaderIntegerFunctions2FeaturesINTEL, DeviceCreateInfo>
+  {
+    enum
+    {
+      value = true
+    };
+  };
+
+  //=== VK_INTEL_performance_query ===
+  template <>
+  struct StructExtends<QueryPoolPerformanceQueryCreateInfoINTEL, QueryPoolCreateInfo>
+  {
+    enum
+    {
+      value = true
+    };
+  };
+
+  //=== VK_EXT_pci_bus_info ===
+  template <>
+  struct StructExtends<PhysicalDevicePCIBusInfoPropertiesEXT, PhysicalDeviceProperties2>
+  {
+    enum
+    {
+      value = true
+    };
+  };
+
+  //=== VK_AMD_display_native_hdr ===
+  template <>
+  struct StructExtends<DisplayNativeHdrSurfaceCapabilitiesAMD, SurfaceCapabilities2KHR>
+  {
+    enum
+    {
+      value = true
+    };
+  };
+  template <>
+  struct StructExtends<SwapchainDisplayNativeHdrCreateInfoAMD, SwapchainCreateInfoKHR>
+  {
+    enum
+    {
+      value = true
+    };
+  };
+
+  //=== VK_KHR_shader_terminate_invocation ===
+  template <>
+  struct StructExtends<PhysicalDeviceShaderTerminateInvocationFeaturesKHR, PhysicalDeviceFeatures2>
+  {
+    enum
+    {
+      value = true
+    };
+  };
+  template <>
+  struct StructExtends<PhysicalDeviceShaderTerminateInvocationFeaturesKHR, DeviceCreateInfo>
+  {
+    enum
+    {
+      value = true
+    };
+  };
+
+  //=== VK_EXT_fragment_density_map ===
+  template <>
+  struct StructExtends<PhysicalDeviceFragmentDensityMapFeaturesEXT, PhysicalDeviceFeatures2>
+  {
+    enum
+    {
+      value = true
+    };
+  };
+  template <>
+  struct StructExtends<PhysicalDeviceFragmentDensityMapFeaturesEXT, DeviceCreateInfo>
+  {
+    enum
+    {
+      value = true
+    };
+  };
+  template <>
+  struct StructExtends<PhysicalDeviceFragmentDensityMapPropertiesEXT, PhysicalDeviceProperties2>
+  {
+    enum
+    {
+      value = true
+    };
+  };
+  template <>
+  struct StructExtends<RenderPassFragmentDensityMapCreateInfoEXT, RenderPassCreateInfo>
+  {
+    enum
+    {
+      value = true
+    };
+  };
+  template <>
+  struct StructExtends<RenderPassFragmentDensityMapCreateInfoEXT, RenderPassCreateInfo2>
+  {
+    enum
+    {
+      value = true
+    };
+  };
+
+  //=== VK_EXT_subgroup_size_control ===
+  template <>
+  struct StructExtends<PhysicalDeviceSubgroupSizeControlFeaturesEXT, PhysicalDeviceFeatures2>
+  {
+    enum
+    {
+      value = true
+    };
+  };
+  template <>
+  struct StructExtends<PhysicalDeviceSubgroupSizeControlFeaturesEXT, DeviceCreateInfo>
+  {
+    enum
+    {
+      value = true
+    };
+  };
+  template <>
+  struct StructExtends<PhysicalDeviceSubgroupSizeControlPropertiesEXT, PhysicalDeviceProperties2>
+  {
+    enum
+    {
+      value = true
+    };
+  };
+  template <>
+  struct StructExtends<PipelineShaderStageRequiredSubgroupSizeCreateInfoEXT, PipelineShaderStageCreateInfo>
+  {
+    enum
+    {
+      value = true
+    };
+  };
+
+  //=== VK_KHR_fragment_shading_rate ===
+  template <>
+  struct StructExtends<FragmentShadingRateAttachmentInfoKHR, SubpassDescription2>
+  {
+    enum
+    {
+      value = true
+    };
+  };
+  template <>
+  struct StructExtends<PipelineFragmentShadingRateStateCreateInfoKHR, GraphicsPipelineCreateInfo>
+  {
+    enum
+    {
+      value = true
+    };
+  };
+  template <>
+  struct StructExtends<PhysicalDeviceFragmentShadingRateFeaturesKHR, PhysicalDeviceFeatures2>
+  {
+    enum
+    {
+      value = true
+    };
+  };
+  template <>
+  struct StructExtends<PhysicalDeviceFragmentShadingRateFeaturesKHR, DeviceCreateInfo>
+  {
+    enum
+    {
+      value = true
+    };
+  };
+  template <>
+  struct StructExtends<PhysicalDeviceFragmentShadingRatePropertiesKHR, PhysicalDeviceProperties2>
+  {
+    enum
+    {
+      value = true
+    };
+  };
+
+  //=== VK_AMD_shader_core_properties2 ===
+  template <>
+  struct StructExtends<PhysicalDeviceShaderCoreProperties2AMD, PhysicalDeviceProperties2>
+  {
+    enum
+    {
+      value = true
+    };
+  };
+
+  //=== VK_AMD_device_coherent_memory ===
+  template <>
+  struct StructExtends<PhysicalDeviceCoherentMemoryFeaturesAMD, PhysicalDeviceFeatures2>
+  {
+    enum
+    {
+      value = true
+    };
+  };
+  template <>
+  struct StructExtends<PhysicalDeviceCoherentMemoryFeaturesAMD, DeviceCreateInfo>
+  {
+    enum
+    {
+      value = true
+    };
+  };
+
+  //=== VK_EXT_shader_image_atomic_int64 ===
+  template <>
+  struct StructExtends<PhysicalDeviceShaderImageAtomicInt64FeaturesEXT, PhysicalDeviceFeatures2>
+  {
+    enum
+    {
+      value = true
+    };
+  };
+  template <>
+  struct StructExtends<PhysicalDeviceShaderImageAtomicInt64FeaturesEXT, DeviceCreateInfo>
+  {
+    enum
+    {
+      value = true
+    };
+  };
+
+  //=== VK_EXT_memory_budget ===
+  template <>
+  struct StructExtends<PhysicalDeviceMemoryBudgetPropertiesEXT, PhysicalDeviceMemoryProperties2>
+  {
+    enum
+    {
+      value = true
+    };
+  };
+
+  //=== VK_EXT_memory_priority ===
+  template <>
+  struct StructExtends<PhysicalDeviceMemoryPriorityFeaturesEXT, PhysicalDeviceFeatures2>
+  {
+    enum
+    {
+      value = true
+    };
+  };
+  template <>
+  struct StructExtends<PhysicalDeviceMemoryPriorityFeaturesEXT, DeviceCreateInfo>
+  {
+    enum
+    {
+      value = true
+    };
+  };
+  template <>
+  struct StructExtends<MemoryPriorityAllocateInfoEXT, MemoryAllocateInfo>
+  {
+    enum
+    {
+      value = true
+    };
+  };
+
+  //=== VK_KHR_surface_protected_capabilities ===
+  template <>
+  struct StructExtends<SurfaceProtectedCapabilitiesKHR, SurfaceCapabilities2KHR>
+  {
+    enum
+    {
+      value = true
+    };
+  };
+
+  //=== VK_NV_dedicated_allocation_image_aliasing ===
+  template <>
+  struct StructExtends<PhysicalDeviceDedicatedAllocationImageAliasingFeaturesNV, PhysicalDeviceFeatures2>
+  {
+    enum
+    {
+      value = true
+    };
+  };
+  template <>
+  struct StructExtends<PhysicalDeviceDedicatedAllocationImageAliasingFeaturesNV, DeviceCreateInfo>
+  {
+    enum
+    {
+      value = true
+    };
+  };
+
+  //=== VK_EXT_buffer_device_address ===
+  template <>
+  struct StructExtends<PhysicalDeviceBufferDeviceAddressFeaturesEXT, PhysicalDeviceFeatures2>
+  {
+    enum
+    {
+      value = true
+    };
+  };
+  template <>
+  struct StructExtends<PhysicalDeviceBufferDeviceAddressFeaturesEXT, DeviceCreateInfo>
+  {
+    enum
+    {
+      value = true
+    };
+  };
+  template <>
+  struct StructExtends<BufferDeviceAddressCreateInfoEXT, BufferCreateInfo>
+  {
+    enum
+    {
+      value = true
+    };
+  };
+
+  //=== VK_EXT_validation_features ===
+  template <>
+  struct StructExtends<ValidationFeaturesEXT, InstanceCreateInfo>
+  {
+    enum
+    {
+      value = true
+    };
+  };
+
+  //=== VK_KHR_present_wait ===
+  template <>
+  struct StructExtends<PhysicalDevicePresentWaitFeaturesKHR, PhysicalDeviceFeatures2>
+  {
+    enum
+    {
+      value = true
+    };
+  };
+  template <>
+  struct StructExtends<PhysicalDevicePresentWaitFeaturesKHR, DeviceCreateInfo>
+  {
+    enum
+    {
+      value = true
+    };
+  };
+
+  //=== VK_NV_cooperative_matrix ===
+  template <>
+  struct StructExtends<PhysicalDeviceCooperativeMatrixFeaturesNV, PhysicalDeviceFeatures2>
+  {
+    enum
+    {
+      value = true
+    };
+  };
+  template <>
+  struct StructExtends<PhysicalDeviceCooperativeMatrixFeaturesNV, DeviceCreateInfo>
+  {
+    enum
+    {
+      value = true
+    };
+  };
+  template <>
+  struct StructExtends<PhysicalDeviceCooperativeMatrixPropertiesNV, PhysicalDeviceProperties2>
+  {
+    enum
+    {
+      value = true
+    };
+  };
+
+  //=== VK_NV_coverage_reduction_mode ===
+  template <>
+  struct StructExtends<PhysicalDeviceCoverageReductionModeFeaturesNV, PhysicalDeviceFeatures2>
+  {
+    enum
+    {
+      value = true
+    };
+  };
+  template <>
+  struct StructExtends<PhysicalDeviceCoverageReductionModeFeaturesNV, DeviceCreateInfo>
+  {
+    enum
+    {
+      value = true
+    };
+  };
+  template <>
+  struct StructExtends<PipelineCoverageReductionStateCreateInfoNV, PipelineMultisampleStateCreateInfo>
+  {
+    enum
+    {
+      value = true
+    };
+  };
+
+  //=== VK_EXT_fragment_shader_interlock ===
+  template <>
+  struct StructExtends<PhysicalDeviceFragmentShaderInterlockFeaturesEXT, PhysicalDeviceFeatures2>
+  {
+    enum
+    {
+      value = true
+    };
+  };
+  template <>
+  struct StructExtends<PhysicalDeviceFragmentShaderInterlockFeaturesEXT, DeviceCreateInfo>
+  {
+    enum
+    {
+      value = true
+    };
+  };
+
+  //=== VK_EXT_ycbcr_image_arrays ===
+  template <>
+  struct StructExtends<PhysicalDeviceYcbcrImageArraysFeaturesEXT, PhysicalDeviceFeatures2>
+  {
+    enum
+    {
+      value = true
+    };
+  };
+  template <>
+  struct StructExtends<PhysicalDeviceYcbcrImageArraysFeaturesEXT, DeviceCreateInfo>
+  {
+    enum
+    {
+      value = true
+    };
+  };
+
+  //=== VK_EXT_provoking_vertex ===
+  template <>
+  struct StructExtends<PhysicalDeviceProvokingVertexFeaturesEXT, PhysicalDeviceFeatures2>
+  {
+    enum
+    {
+      value = true
+    };
+  };
+  template <>
+  struct StructExtends<PhysicalDeviceProvokingVertexFeaturesEXT, DeviceCreateInfo>
+  {
+    enum
+    {
+      value = true
+    };
+  };
+  template <>
+  struct StructExtends<PhysicalDeviceProvokingVertexPropertiesEXT, PhysicalDeviceProperties2>
+  {
+    enum
+    {
+      value = true
+    };
+  };
+  template <>
+  struct StructExtends<PipelineRasterizationProvokingVertexStateCreateInfoEXT, PipelineRasterizationStateCreateInfo>
+  {
+    enum
+    {
+      value = true
+    };
+  };
+
+#if defined( VK_USE_PLATFORM_WIN32_KHR )
+  //=== VK_EXT_full_screen_exclusive ===
+  template <>
+  struct StructExtends<SurfaceFullScreenExclusiveInfoEXT, PhysicalDeviceSurfaceInfo2KHR>
+  {
+    enum
+    {
+      value = true
+    };
+  };
+  template <>
+  struct StructExtends<SurfaceFullScreenExclusiveInfoEXT, SwapchainCreateInfoKHR>
+  {
+    enum
+    {
+      value = true
+    };
+  };
+  template <>
+  struct StructExtends<SurfaceCapabilitiesFullScreenExclusiveEXT, SurfaceCapabilities2KHR>
+  {
+    enum
+    {
+      value = true
+    };
+  };
+  template <>
+  struct StructExtends<SurfaceFullScreenExclusiveWin32InfoEXT, PhysicalDeviceSurfaceInfo2KHR>
+  {
+    enum
+    {
+      value = true
+    };
+  };
+  template <>
+  struct StructExtends<SurfaceFullScreenExclusiveWin32InfoEXT, SwapchainCreateInfoKHR>
+  {
+    enum
+    {
+      value = true
+    };
+  };
+#endif /*VK_USE_PLATFORM_WIN32_KHR*/
+
+  //=== VK_EXT_line_rasterization ===
+  template <>
+  struct StructExtends<PhysicalDeviceLineRasterizationFeaturesEXT, PhysicalDeviceFeatures2>
+  {
+    enum
+    {
+      value = true
+    };
+  };
+  template <>
+  struct StructExtends<PhysicalDeviceLineRasterizationFeaturesEXT, DeviceCreateInfo>
+  {
+    enum
+    {
+      value = true
+    };
+  };
+  template <>
+  struct StructExtends<PhysicalDeviceLineRasterizationPropertiesEXT, PhysicalDeviceProperties2>
+  {
+    enum
+    {
+      value = true
+    };
+  };
+  template <>
+  struct StructExtends<PipelineRasterizationLineStateCreateInfoEXT, PipelineRasterizationStateCreateInfo>
+  {
+    enum
+    {
+      value = true
+    };
+  };
+
+  //=== VK_EXT_shader_atomic_float ===
+  template <>
+  struct StructExtends<PhysicalDeviceShaderAtomicFloatFeaturesEXT, PhysicalDeviceFeatures2>
+  {
+    enum
+    {
+      value = true
+    };
+  };
+  template <>
+  struct StructExtends<PhysicalDeviceShaderAtomicFloatFeaturesEXT, DeviceCreateInfo>
+  {
+    enum
+    {
+      value = true
+    };
+  };
+
+  //=== VK_EXT_index_type_uint8 ===
+  template <>
+  struct StructExtends<PhysicalDeviceIndexTypeUint8FeaturesEXT, PhysicalDeviceFeatures2>
+  {
+    enum
+    {
+      value = true
+    };
+  };
+  template <>
+  struct StructExtends<PhysicalDeviceIndexTypeUint8FeaturesEXT, DeviceCreateInfo>
+  {
+    enum
+    {
+      value = true
+    };
+  };
+
+  //=== VK_EXT_extended_dynamic_state ===
+  template <>
+  struct StructExtends<PhysicalDeviceExtendedDynamicStateFeaturesEXT, PhysicalDeviceFeatures2>
+  {
+    enum
+    {
+      value = true
+    };
+  };
+  template <>
+  struct StructExtends<PhysicalDeviceExtendedDynamicStateFeaturesEXT, DeviceCreateInfo>
+  {
+    enum
+    {
+      value = true
+    };
+  };
+
+  //=== VK_KHR_pipeline_executable_properties ===
+  template <>
+  struct StructExtends<PhysicalDevicePipelineExecutablePropertiesFeaturesKHR, PhysicalDeviceFeatures2>
+  {
+    enum
+    {
+      value = true
+    };
+  };
+  template <>
+  struct StructExtends<PhysicalDevicePipelineExecutablePropertiesFeaturesKHR, DeviceCreateInfo>
+  {
+    enum
+    {
+      value = true
+    };
+  };
+
+  //=== VK_EXT_shader_atomic_float2 ===
+  template <>
+  struct StructExtends<PhysicalDeviceShaderAtomicFloat2FeaturesEXT, PhysicalDeviceFeatures2>
+  {
+    enum
+    {
+      value = true
+    };
+  };
+  template <>
+  struct StructExtends<PhysicalDeviceShaderAtomicFloat2FeaturesEXT, DeviceCreateInfo>
+  {
+    enum
+    {
+      value = true
+    };
+  };
+
+  //=== VK_EXT_shader_demote_to_helper_invocation ===
+  template <>
+  struct StructExtends<PhysicalDeviceShaderDemoteToHelperInvocationFeaturesEXT, PhysicalDeviceFeatures2>
+  {
+    enum
+    {
+      value = true
+    };
+  };
+  template <>
+  struct StructExtends<PhysicalDeviceShaderDemoteToHelperInvocationFeaturesEXT, DeviceCreateInfo>
+  {
+    enum
+    {
+      value = true
+    };
+  };
+
+  //=== VK_NV_device_generated_commands ===
+  template <>
+  struct StructExtends<PhysicalDeviceDeviceGeneratedCommandsPropertiesNV, PhysicalDeviceProperties2>
+  {
+    enum
+    {
+      value = true
+    };
+  };
+  template <>
+  struct StructExtends<PhysicalDeviceDeviceGeneratedCommandsFeaturesNV, PhysicalDeviceFeatures2>
+  {
+    enum
+    {
+      value = true
+    };
+  };
+  template <>
+  struct StructExtends<PhysicalDeviceDeviceGeneratedCommandsFeaturesNV, DeviceCreateInfo>
+  {
+    enum
+    {
+      value = true
+    };
+  };
+  template <>
+  struct StructExtends<GraphicsPipelineShaderGroupsCreateInfoNV, GraphicsPipelineCreateInfo>
+  {
+    enum
+    {
+      value = true
+    };
+  };
+
+  //=== VK_NV_inherited_viewport_scissor ===
+  template <>
+  struct StructExtends<PhysicalDeviceInheritedViewportScissorFeaturesNV, PhysicalDeviceFeatures2>
+  {
+    enum
+    {
+      value = true
+    };
+  };
+  template <>
+  struct StructExtends<PhysicalDeviceInheritedViewportScissorFeaturesNV, DeviceCreateInfo>
+  {
+    enum
+    {
+      value = true
+    };
+  };
+  template <>
+  struct StructExtends<CommandBufferInheritanceViewportScissorInfoNV, CommandBufferInheritanceInfo>
+  {
+    enum
+    {
+      value = true
+    };
+  };
+
+  //=== VK_KHR_shader_integer_dot_product ===
+  template <>
+  struct StructExtends<PhysicalDeviceShaderIntegerDotProductFeaturesKHR, PhysicalDeviceFeatures2>
+  {
+    enum
+    {
+      value = true
+    };
+  };
+  template <>
+  struct StructExtends<PhysicalDeviceShaderIntegerDotProductFeaturesKHR, DeviceCreateInfo>
+  {
+    enum
+    {
+      value = true
+    };
+  };
+  template <>
+  struct StructExtends<PhysicalDeviceShaderIntegerDotProductPropertiesKHR, PhysicalDeviceProperties2>
+  {
+    enum
+    {
+      value = true
+    };
+  };
+
+  //=== VK_EXT_texel_buffer_alignment ===
+  template <>
+  struct StructExtends<PhysicalDeviceTexelBufferAlignmentFeaturesEXT, PhysicalDeviceFeatures2>
+  {
+    enum
+    {
+      value = true
+    };
+  };
+  template <>
+  struct StructExtends<PhysicalDeviceTexelBufferAlignmentFeaturesEXT, DeviceCreateInfo>
+  {
+    enum
+    {
+      value = true
+    };
+  };
+  template <>
+  struct StructExtends<PhysicalDeviceTexelBufferAlignmentPropertiesEXT, PhysicalDeviceProperties2>
+  {
+    enum
+    {
+      value = true
+    };
+  };
+
+  //=== VK_QCOM_render_pass_transform ===
+  template <>
+  struct StructExtends<RenderPassTransformBeginInfoQCOM, RenderPassBeginInfo>
+  {
+    enum
+    {
+      value = true
+    };
+  };
+  template <>
+  struct StructExtends<CommandBufferInheritanceRenderPassTransformInfoQCOM, CommandBufferInheritanceInfo>
+  {
+    enum
+    {
+      value = true
+    };
+  };
+
+  //=== VK_EXT_device_memory_report ===
+  template <>
+  struct StructExtends<PhysicalDeviceDeviceMemoryReportFeaturesEXT, PhysicalDeviceFeatures2>
+  {
+    enum
+    {
+      value = true
+    };
+  };
+  template <>
+  struct StructExtends<PhysicalDeviceDeviceMemoryReportFeaturesEXT, DeviceCreateInfo>
+  {
+    enum
+    {
+      value = true
+    };
+  };
+  template <>
+  struct StructExtends<DeviceDeviceMemoryReportCreateInfoEXT, DeviceCreateInfo>
+  {
+    enum
+    {
+      value = true
+    };
+  };
+
+  //=== VK_EXT_robustness2 ===
+  template <>
+  struct StructExtends<PhysicalDeviceRobustness2FeaturesEXT, PhysicalDeviceFeatures2>
+  {
+    enum
+    {
+      value = true
+    };
+  };
+  template <>
+  struct StructExtends<PhysicalDeviceRobustness2FeaturesEXT, DeviceCreateInfo>
+  {
+    enum
+    {
+      value = true
+    };
+  };
+  template <>
+  struct StructExtends<PhysicalDeviceRobustness2PropertiesEXT, PhysicalDeviceProperties2>
+  {
+    enum
+    {
+      value = true
+    };
+  };
+
+  //=== VK_EXT_custom_border_color ===
+  template <>
+  struct StructExtends<SamplerCustomBorderColorCreateInfoEXT, SamplerCreateInfo>
+  {
+    enum
+    {
+      value = true
+    };
+  };
+  template <>
+  struct StructExtends<PhysicalDeviceCustomBorderColorPropertiesEXT, PhysicalDeviceProperties2>
+  {
+    enum
+    {
+      value = true
+    };
+  };
+  template <>
+  struct StructExtends<PhysicalDeviceCustomBorderColorFeaturesEXT, PhysicalDeviceFeatures2>
+  {
+    enum
+    {
+      value = true
+    };
+  };
+  template <>
+  struct StructExtends<PhysicalDeviceCustomBorderColorFeaturesEXT, DeviceCreateInfo>
+  {
+    enum
+    {
+      value = true
+    };
+  };
+
+  //=== VK_KHR_present_id ===
+  template <>
+  struct StructExtends<PresentIdKHR, PresentInfoKHR>
+  {
+    enum
+    {
+      value = true
+    };
+  };
+  template <>
+  struct StructExtends<PhysicalDevicePresentIdFeaturesKHR, PhysicalDeviceFeatures2>
+  {
+    enum
+    {
+      value = true
+    };
+  };
+  template <>
+  struct StructExtends<PhysicalDevicePresentIdFeaturesKHR, DeviceCreateInfo>
+  {
+    enum
+    {
+      value = true
+    };
+  };
+
+  //=== VK_EXT_private_data ===
+  template <>
+  struct StructExtends<PhysicalDevicePrivateDataFeaturesEXT, PhysicalDeviceFeatures2>
+  {
+    enum
+    {
+      value = true
+    };
+  };
+  template <>
+  struct StructExtends<PhysicalDevicePrivateDataFeaturesEXT, DeviceCreateInfo>
+  {
+    enum
+    {
+      value = true
+    };
+  };
+  template <>
+  struct StructExtends<DevicePrivateDataCreateInfoEXT, DeviceCreateInfo>
+  {
+    enum
+    {
+      value = true
+    };
+  };
+
+  //=== VK_EXT_pipeline_creation_cache_control ===
+  template <>
+  struct StructExtends<PhysicalDevicePipelineCreationCacheControlFeaturesEXT, PhysicalDeviceFeatures2>
+  {
+    enum
+    {
+      value = true
+    };
+  };
+  template <>
+  struct StructExtends<PhysicalDevicePipelineCreationCacheControlFeaturesEXT, DeviceCreateInfo>
+  {
+    enum
+    {
+      value = true
+    };
+  };
+
+#if defined( VK_ENABLE_BETA_EXTENSIONS )
+  //=== VK_KHR_video_encode_queue ===
+  template <>
+  struct StructExtends<VideoEncodeRateControlInfoKHR, VideoCodingControlInfoKHR>
+  {
+    enum
+    {
+      value = true
+    };
+  };
+#endif /*VK_ENABLE_BETA_EXTENSIONS*/
+
+  //=== VK_NV_device_diagnostics_config ===
+  template <>
+  struct StructExtends<PhysicalDeviceDiagnosticsConfigFeaturesNV, PhysicalDeviceFeatures2>
+  {
+    enum
+    {
+      value = true
+    };
+  };
+  template <>
+  struct StructExtends<PhysicalDeviceDiagnosticsConfigFeaturesNV, DeviceCreateInfo>
+  {
+    enum
+    {
+      value = true
+    };
+  };
+  template <>
+  struct StructExtends<DeviceDiagnosticsConfigCreateInfoNV, DeviceCreateInfo>
+  {
+    enum
+    {
+      value = true
+    };
+  };
+
+  //=== VK_KHR_synchronization2 ===
+  template <>
+  struct StructExtends<MemoryBarrier2KHR, SubpassDependency2>
+  {
+    enum
+    {
+      value = true
+    };
+  };
+  template <>
+  struct StructExtends<PhysicalDeviceSynchronization2FeaturesKHR, PhysicalDeviceFeatures2>
+  {
+    enum
+    {
+      value = true
+    };
+  };
+  template <>
+  struct StructExtends<PhysicalDeviceSynchronization2FeaturesKHR, DeviceCreateInfo>
+  {
+    enum
+    {
+      value = true
+    };
+  };
+  template <>
+  struct StructExtends<QueueFamilyCheckpointProperties2NV, QueueFamilyProperties2>
+  {
+    enum
+    {
+      value = true
+    };
+  };
+
+  //=== VK_KHR_shader_subgroup_uniform_control_flow ===
+  template <>
+  struct StructExtends<PhysicalDeviceShaderSubgroupUniformControlFlowFeaturesKHR, PhysicalDeviceFeatures2>
+  {
+    enum
+    {
+      value = true
+    };
+  };
+  template <>
+  struct StructExtends<PhysicalDeviceShaderSubgroupUniformControlFlowFeaturesKHR, DeviceCreateInfo>
+  {
+    enum
+    {
+      value = true
+    };
+  };
+
+  //=== VK_KHR_zero_initialize_workgroup_memory ===
+  template <>
+  struct StructExtends<PhysicalDeviceZeroInitializeWorkgroupMemoryFeaturesKHR, PhysicalDeviceFeatures2>
+  {
+    enum
+    {
+      value = true
+    };
+  };
+  template <>
+  struct StructExtends<PhysicalDeviceZeroInitializeWorkgroupMemoryFeaturesKHR, DeviceCreateInfo>
+  {
+    enum
+    {
+      value = true
+    };
+  };
+
+  //=== VK_NV_fragment_shading_rate_enums ===
+  template <>
+  struct StructExtends<PhysicalDeviceFragmentShadingRateEnumsFeaturesNV, PhysicalDeviceFeatures2>
+  {
+    enum
+    {
+      value = true
+    };
+  };
+  template <>
+  struct StructExtends<PhysicalDeviceFragmentShadingRateEnumsFeaturesNV, DeviceCreateInfo>
+  {
+    enum
+    {
+      value = true
+    };
+  };
+  template <>
+  struct StructExtends<PhysicalDeviceFragmentShadingRateEnumsPropertiesNV, PhysicalDeviceProperties2>
+  {
+    enum
+    {
+      value = true
+    };
+  };
+  template <>
+  struct StructExtends<PipelineFragmentShadingRateEnumStateCreateInfoNV, GraphicsPipelineCreateInfo>
+  {
+    enum
+    {
+      value = true
+    };
+  };
+
+  //=== VK_NV_ray_tracing_motion_blur ===
+  template <>
+  struct StructExtends<AccelerationStructureGeometryMotionTrianglesDataNV,
+                       AccelerationStructureGeometryTrianglesDataKHR>
+  {
+    enum
+    {
+      value = true
+    };
+  };
+  template <>
+  struct StructExtends<AccelerationStructureMotionInfoNV, AccelerationStructureCreateInfoKHR>
+  {
+    enum
+    {
+      value = true
+    };
+  };
+  template <>
+  struct StructExtends<PhysicalDeviceRayTracingMotionBlurFeaturesNV, PhysicalDeviceFeatures2>
+  {
+    enum
+    {
+      value = true
+    };
+  };
+  template <>
+  struct StructExtends<PhysicalDeviceRayTracingMotionBlurFeaturesNV, DeviceCreateInfo>
+  {
+    enum
+    {
+      value = true
+    };
+  };
+
+  //=== VK_EXT_ycbcr_2plane_444_formats ===
+  template <>
+  struct StructExtends<PhysicalDeviceYcbcr2Plane444FormatsFeaturesEXT, PhysicalDeviceFeatures2>
+  {
+    enum
+    {
+      value = true
+    };
+  };
+  template <>
+  struct StructExtends<PhysicalDeviceYcbcr2Plane444FormatsFeaturesEXT, DeviceCreateInfo>
+  {
+    enum
+    {
+      value = true
+    };
+  };
+
+  //=== VK_EXT_fragment_density_map2 ===
+  template <>
+  struct StructExtends<PhysicalDeviceFragmentDensityMap2FeaturesEXT, PhysicalDeviceFeatures2>
+  {
+    enum
+    {
+      value = true
+    };
+  };
+  template <>
+  struct StructExtends<PhysicalDeviceFragmentDensityMap2FeaturesEXT, DeviceCreateInfo>
+  {
+    enum
+    {
+      value = true
+    };
+  };
+  template <>
+  struct StructExtends<PhysicalDeviceFragmentDensityMap2PropertiesEXT, PhysicalDeviceProperties2>
+  {
+    enum
+    {
+      value = true
+    };
+  };
+
+  //=== VK_QCOM_rotated_copy_commands ===
+  template <>
+  struct StructExtends<CopyCommandTransformInfoQCOM, BufferImageCopy2KHR>
+  {
+    enum
+    {
+      value = true
+    };
+  };
+  template <>
+  struct StructExtends<CopyCommandTransformInfoQCOM, ImageBlit2KHR>
+  {
+    enum
+    {
+      value = true
+    };
+  };
+
+  //=== VK_EXT_image_robustness ===
+  template <>
+  struct StructExtends<PhysicalDeviceImageRobustnessFeaturesEXT, PhysicalDeviceFeatures2>
+  {
+    enum
+    {
+      value = true
+    };
+  };
+  template <>
+  struct StructExtends<PhysicalDeviceImageRobustnessFeaturesEXT, DeviceCreateInfo>
+  {
+    enum
+    {
+      value = true
+    };
+  };
+
+  //=== VK_KHR_workgroup_memory_explicit_layout ===
+  template <>
+  struct StructExtends<PhysicalDeviceWorkgroupMemoryExplicitLayoutFeaturesKHR, PhysicalDeviceFeatures2>
+  {
+    enum
+    {
+      value = true
+    };
+  };
+  template <>
+  struct StructExtends<PhysicalDeviceWorkgroupMemoryExplicitLayoutFeaturesKHR, DeviceCreateInfo>
+  {
+    enum
+    {
+      value = true
+    };
+  };
+
+  //=== VK_EXT_4444_formats ===
+  template <>
+  struct StructExtends<PhysicalDevice4444FormatsFeaturesEXT, PhysicalDeviceFeatures2>
+  {
+    enum
+    {
+      value = true
+    };
+  };
+  template <>
+  struct StructExtends<PhysicalDevice4444FormatsFeaturesEXT, DeviceCreateInfo>
+  {
+    enum
+    {
+      value = true
+    };
+  };
+
+  //=== VK_KHR_ray_tracing_pipeline ===
+  template <>
+  struct StructExtends<PhysicalDeviceRayTracingPipelineFeaturesKHR, PhysicalDeviceFeatures2>
+  {
+    enum
+    {
+      value = true
+    };
+  };
+  template <>
+  struct StructExtends<PhysicalDeviceRayTracingPipelineFeaturesKHR, DeviceCreateInfo>
+  {
+    enum
+    {
+      value = true
+    };
+  };
+  template <>
+  struct StructExtends<PhysicalDeviceRayTracingPipelinePropertiesKHR, PhysicalDeviceProperties2>
+  {
+    enum
+    {
+      value = true
+    };
+  };
+
+  //=== VK_KHR_ray_query ===
+  template <>
+  struct StructExtends<PhysicalDeviceRayQueryFeaturesKHR, PhysicalDeviceFeatures2>
+  {
+    enum
+    {
+      value = true
+    };
+  };
+  template <>
+  struct StructExtends<PhysicalDeviceRayQueryFeaturesKHR, DeviceCreateInfo>
+  {
+    enum
+    {
+      value = true
+    };
+  };
+
+  //=== VK_VALVE_mutable_descriptor_type ===
+  template <>
+  struct StructExtends<PhysicalDeviceMutableDescriptorTypeFeaturesVALVE, PhysicalDeviceFeatures2>
+  {
+    enum
+    {
+      value = true
+    };
+  };
+  template <>
+  struct StructExtends<PhysicalDeviceMutableDescriptorTypeFeaturesVALVE, DeviceCreateInfo>
+  {
+    enum
+    {
+      value = true
+    };
+  };
+  template <>
+  struct StructExtends<MutableDescriptorTypeCreateInfoVALVE, DescriptorSetLayoutCreateInfo>
+  {
+    enum
+    {
+      value = true
+    };
+  };
+  template <>
+  struct StructExtends<MutableDescriptorTypeCreateInfoVALVE, DescriptorPoolCreateInfo>
+  {
+    enum
+    {
+      value = true
+    };
+  };
+
+  //=== VK_EXT_vertex_input_dynamic_state ===
+  template <>
+  struct StructExtends<PhysicalDeviceVertexInputDynamicStateFeaturesEXT, PhysicalDeviceFeatures2>
+  {
+    enum
+    {
+      value = true
+    };
+  };
+  template <>
+  struct StructExtends<PhysicalDeviceVertexInputDynamicStateFeaturesEXT, DeviceCreateInfo>
+  {
+    enum
+    {
+      value = true
+    };
+  };
+
+  //=== VK_EXT_physical_device_drm ===
+  template <>
+  struct StructExtends<PhysicalDeviceDrmPropertiesEXT, PhysicalDeviceProperties2>
+  {
+    enum
+    {
+      value = true
+    };
+  };
+
+  //=== VK_EXT_primitive_topology_list_restart ===
+  template <>
+  struct StructExtends<PhysicalDevicePrimitiveTopologyListRestartFeaturesEXT, PhysicalDeviceFeatures2>
+  {
+    enum
+    {
+      value = true
+    };
+  };
+  template <>
+  struct StructExtends<PhysicalDevicePrimitiveTopologyListRestartFeaturesEXT, DeviceCreateInfo>
+  {
+    enum
+    {
+      value = true
+    };
+  };
+
+#if defined( VK_USE_PLATFORM_FUCHSIA )
+  //=== VK_FUCHSIA_external_memory ===
+  template <>
+  struct StructExtends<ImportMemoryZirconHandleInfoFUCHSIA, MemoryAllocateInfo>
+  {
+    enum
+    {
+      value = true
+    };
+  };
+#endif /*VK_USE_PLATFORM_FUCHSIA*/
+
+  //=== VK_HUAWEI_subpass_shading ===
+  template <>
+  struct StructExtends<SubpassShadingPipelineCreateInfoHUAWEI, ComputePipelineCreateInfo>
+  {
+    enum
+    {
+      value = true
+    };
+  };
+  template <>
+  struct StructExtends<PhysicalDeviceSubpassShadingFeaturesHUAWEI, PhysicalDeviceFeatures2>
+  {
+    enum
+    {
+      value = true
+    };
+  };
+  template <>
+  struct StructExtends<PhysicalDeviceSubpassShadingFeaturesHUAWEI, DeviceCreateInfo>
+  {
+    enum
+    {
+      value = true
+    };
+  };
+  template <>
+  struct StructExtends<PhysicalDeviceSubpassShadingPropertiesHUAWEI, PhysicalDeviceProperties2>
+  {
+    enum
+    {
+      value = true
+    };
+  };
+
+  //=== VK_HUAWEI_invocation_mask ===
+  template <>
+  struct StructExtends<PhysicalDeviceInvocationMaskFeaturesHUAWEI, PhysicalDeviceFeatures2>
+  {
+    enum
+    {
+      value = true
+    };
+  };
+  template <>
+  struct StructExtends<PhysicalDeviceInvocationMaskFeaturesHUAWEI, DeviceCreateInfo>
+  {
+    enum
+    {
+      value = true
+    };
+  };
+
+  //=== VK_NV_external_memory_rdma ===
+  template <>
+  struct StructExtends<PhysicalDeviceExternalMemoryRDMAFeaturesNV, PhysicalDeviceFeatures2>
+  {
+    enum
+    {
+      value = true
+    };
+  };
+  template <>
+  struct StructExtends<PhysicalDeviceExternalMemoryRDMAFeaturesNV, DeviceCreateInfo>
+  {
+    enum
+    {
+      value = true
+    };
+  };
+
+  //=== VK_EXT_extended_dynamic_state2 ===
+  template <>
+  struct StructExtends<PhysicalDeviceExtendedDynamicState2FeaturesEXT, PhysicalDeviceFeatures2>
+  {
+    enum
+    {
+      value = true
+    };
+  };
+  template <>
+  struct StructExtends<PhysicalDeviceExtendedDynamicState2FeaturesEXT, DeviceCreateInfo>
+  {
+    enum
+    {
+      value = true
+    };
+  };
+
+  //=== VK_EXT_color_write_enable ===
+  template <>
+  struct StructExtends<PhysicalDeviceColorWriteEnableFeaturesEXT, PhysicalDeviceFeatures2>
+  {
+    enum
+    {
+      value = true
+    };
+  };
+  template <>
+  struct StructExtends<PhysicalDeviceColorWriteEnableFeaturesEXT, DeviceCreateInfo>
+  {
+    enum
+    {
+      value = true
+    };
+  };
+  template <>
+  struct StructExtends<PipelineColorWriteCreateInfoEXT, PipelineColorBlendStateCreateInfo>
+  {
+    enum
+    {
+      value = true
+    };
+  };
+
+  //=== VK_EXT_global_priority_query ===
+  template <>
+  struct StructExtends<PhysicalDeviceGlobalPriorityQueryFeaturesEXT, PhysicalDeviceFeatures2>
+  {
+    enum
+    {
+      value = true
+    };
+  };
+  template <>
+  struct StructExtends<PhysicalDeviceGlobalPriorityQueryFeaturesEXT, DeviceCreateInfo>
+  {
+    enum
+    {
+      value = true
+    };
+  };
+  template <>
+  struct StructExtends<QueueFamilyGlobalPriorityPropertiesEXT, QueueFamilyProperties2>
+  {
+    enum
+    {
+      value = true
+    };
+  };
+
+  //=== VK_EXT_multi_draw ===
+  template <>
+  struct StructExtends<PhysicalDeviceMultiDrawFeaturesEXT, PhysicalDeviceFeatures2>
+  {
+    enum
+    {
+      value = true
+    };
+  };
+  template <>
+  struct StructExtends<PhysicalDeviceMultiDrawFeaturesEXT, DeviceCreateInfo>
+  {
+    enum
+    {
+      value = true
+    };
+  };
+  template <>
+  struct StructExtends<PhysicalDeviceMultiDrawPropertiesEXT, PhysicalDeviceProperties2>
   {
     enum
     {
@@ -10121,723 +10573,868 @@
   };
 #endif
 
-  class DispatchLoaderDynamic
+  using PFN_dummy = void ( * )();
+
+  class DispatchLoaderDynamic : public DispatchLoaderBase
   {
   public:
-    using PFN_dummy = void ( * )();
-
-    PFN_vkAcquireDrmDisplayEXT vkAcquireDrmDisplayEXT = 0;
-#if defined( VK_USE_PLATFORM_WIN32_KHR )
-    PFN_vkAcquireFullScreenExclusiveModeEXT vkAcquireFullScreenExclusiveModeEXT = 0;
-#else
-    PFN_dummy placeholder_dont_call_vkAcquireFullScreenExclusiveModeEXT               = 0;
-#endif /*VK_USE_PLATFORM_WIN32_KHR*/
-    PFN_vkAcquireNextImage2KHR                 vkAcquireNextImage2KHR                 = 0;
-    PFN_vkAcquireNextImageKHR                  vkAcquireNextImageKHR                  = 0;
-    PFN_vkAcquirePerformanceConfigurationINTEL vkAcquirePerformanceConfigurationINTEL = 0;
-    PFN_vkAcquireProfilingLockKHR              vkAcquireProfilingLockKHR              = 0;
-#if defined( VK_USE_PLATFORM_WIN32_KHR )
-    PFN_vkAcquireWinrtDisplayNV vkAcquireWinrtDisplayNV = 0;
-#else
-    PFN_dummy placeholder_dont_call_vkAcquireWinrtDisplayNV                           = 0;
-#endif /*VK_USE_PLATFORM_WIN32_KHR*/
-#if defined( VK_USE_PLATFORM_XLIB_XRANDR_EXT )
-    PFN_vkAcquireXlibDisplayEXT vkAcquireXlibDisplayEXT = 0;
-#else
-    PFN_dummy placeholder_dont_call_vkAcquireXlibDisplayEXT                           = 0;
-#endif /*VK_USE_PLATFORM_XLIB_XRANDR_EXT*/
-    PFN_vkAllocateCommandBuffers            vkAllocateCommandBuffers            = 0;
-    PFN_vkAllocateDescriptorSets            vkAllocateDescriptorSets            = 0;
-    PFN_vkAllocateMemory                    vkAllocateMemory                    = 0;
-    PFN_vkBeginCommandBuffer                vkBeginCommandBuffer                = 0;
-    PFN_vkBindAccelerationStructureMemoryNV vkBindAccelerationStructureMemoryNV = 0;
-    PFN_vkBindBufferMemory                  vkBindBufferMemory                  = 0;
-    PFN_vkBindBufferMemory2                 vkBindBufferMemory2                 = 0;
-    PFN_vkBindBufferMemory2KHR              vkBindBufferMemory2KHR              = 0;
-    PFN_vkBindImageMemory                   vkBindImageMemory                   = 0;
-    PFN_vkBindImageMemory2                  vkBindImageMemory2                  = 0;
-    PFN_vkBindImageMemory2KHR               vkBindImageMemory2KHR               = 0;
-#if defined( VK_ENABLE_BETA_EXTENSIONS )
-    PFN_vkBindVideoSessionMemoryKHR vkBindVideoSessionMemoryKHR = 0;
-#else
-    PFN_dummy placeholder_dont_call_vkBindVideoSessionMemoryKHR                       = 0;
-#endif /*VK_ENABLE_BETA_EXTENSIONS*/
-    PFN_vkBuildAccelerationStructuresKHR  vkBuildAccelerationStructuresKHR  = 0;
-    PFN_vkCmdBeginConditionalRenderingEXT vkCmdBeginConditionalRenderingEXT = 0;
-    PFN_vkCmdBeginDebugUtilsLabelEXT      vkCmdBeginDebugUtilsLabelEXT      = 0;
-    PFN_vkCmdBeginQuery                   vkCmdBeginQuery                   = 0;
-    PFN_vkCmdBeginQueryIndexedEXT         vkCmdBeginQueryIndexedEXT         = 0;
-    PFN_vkCmdBeginRenderPass              vkCmdBeginRenderPass              = 0;
-    PFN_vkCmdBeginRenderPass2             vkCmdBeginRenderPass2             = 0;
-    PFN_vkCmdBeginRenderPass2KHR          vkCmdBeginRenderPass2KHR          = 0;
-    PFN_vkCmdBeginTransformFeedbackEXT    vkCmdBeginTransformFeedbackEXT    = 0;
-#if defined( VK_ENABLE_BETA_EXTENSIONS )
-    PFN_vkCmdBeginVideoCodingKHR vkCmdBeginVideoCodingKHR = 0;
-#else
-    PFN_dummy placeholder_dont_call_vkCmdBeginVideoCodingKHR                          = 0;
-#endif /*VK_ENABLE_BETA_EXTENSIONS*/
-    PFN_vkCmdBindDescriptorSets                     vkCmdBindDescriptorSets                     = 0;
-    PFN_vkCmdBindIndexBuffer                        vkCmdBindIndexBuffer                        = 0;
-    PFN_vkCmdBindPipeline                           vkCmdBindPipeline                           = 0;
-    PFN_vkCmdBindPipelineShaderGroupNV              vkCmdBindPipelineShaderGroupNV              = 0;
-    PFN_vkCmdBindShadingRateImageNV                 vkCmdBindShadingRateImageNV                 = 0;
-    PFN_vkCmdBindTransformFeedbackBuffersEXT        vkCmdBindTransformFeedbackBuffersEXT        = 0;
-    PFN_vkCmdBindVertexBuffers                      vkCmdBindVertexBuffers                      = 0;
-    PFN_vkCmdBindVertexBuffers2EXT                  vkCmdBindVertexBuffers2EXT                  = 0;
-    PFN_vkCmdBlitImage                              vkCmdBlitImage                              = 0;
-    PFN_vkCmdBlitImage2KHR                          vkCmdBlitImage2KHR                          = 0;
-    PFN_vkCmdBuildAccelerationStructureNV           vkCmdBuildAccelerationStructureNV           = 0;
-    PFN_vkCmdBuildAccelerationStructuresIndirectKHR vkCmdBuildAccelerationStructuresIndirectKHR = 0;
-    PFN_vkCmdBuildAccelerationStructuresKHR         vkCmdBuildAccelerationStructuresKHR         = 0;
-    PFN_vkCmdClearAttachments                       vkCmdClearAttachments                       = 0;
-    PFN_vkCmdClearColorImage                        vkCmdClearColorImage                        = 0;
-    PFN_vkCmdClearDepthStencilImage                 vkCmdClearDepthStencilImage                 = 0;
-#if defined( VK_ENABLE_BETA_EXTENSIONS )
-    PFN_vkCmdControlVideoCodingKHR vkCmdControlVideoCodingKHR = 0;
-#else
-    PFN_dummy placeholder_dont_call_vkCmdControlVideoCodingKHR                        = 0;
-#endif /*VK_ENABLE_BETA_EXTENSIONS*/
-    PFN_vkCmdCopyAccelerationStructureKHR         vkCmdCopyAccelerationStructureKHR         = 0;
-    PFN_vkCmdCopyAccelerationStructureNV          vkCmdCopyAccelerationStructureNV          = 0;
-    PFN_vkCmdCopyAccelerationStructureToMemoryKHR vkCmdCopyAccelerationStructureToMemoryKHR = 0;
-    PFN_vkCmdCopyBuffer                           vkCmdCopyBuffer                           = 0;
-    PFN_vkCmdCopyBuffer2KHR                       vkCmdCopyBuffer2KHR                       = 0;
-    PFN_vkCmdCopyBufferToImage                    vkCmdCopyBufferToImage                    = 0;
-    PFN_vkCmdCopyBufferToImage2KHR                vkCmdCopyBufferToImage2KHR                = 0;
-    PFN_vkCmdCopyImage                            vkCmdCopyImage                            = 0;
-    PFN_vkCmdCopyImage2KHR                        vkCmdCopyImage2KHR                        = 0;
-    PFN_vkCmdCopyImageToBuffer                    vkCmdCopyImageToBuffer                    = 0;
-    PFN_vkCmdCopyImageToBuffer2KHR                vkCmdCopyImageToBuffer2KHR                = 0;
-    PFN_vkCmdCopyMemoryToAccelerationStructureKHR vkCmdCopyMemoryToAccelerationStructureKHR = 0;
-    PFN_vkCmdCopyQueryPoolResults                 vkCmdCopyQueryPoolResults                 = 0;
-    PFN_vkCmdCuLaunchKernelNVX                    vkCmdCuLaunchKernelNVX                    = 0;
-    PFN_vkCmdDebugMarkerBeginEXT                  vkCmdDebugMarkerBeginEXT                  = 0;
-    PFN_vkCmdDebugMarkerEndEXT                    vkCmdDebugMarkerEndEXT                    = 0;
-    PFN_vkCmdDebugMarkerInsertEXT                 vkCmdDebugMarkerInsertEXT                 = 0;
-#if defined( VK_ENABLE_BETA_EXTENSIONS )
-    PFN_vkCmdDecodeVideoKHR vkCmdDecodeVideoKHR = 0;
-#else
-    PFN_dummy placeholder_dont_call_vkCmdDecodeVideoKHR                               = 0;
-#endif /*VK_ENABLE_BETA_EXTENSIONS*/
-    PFN_vkCmdDispatch                     vkCmdDispatch                     = 0;
-    PFN_vkCmdDispatchBase                 vkCmdDispatchBase                 = 0;
-    PFN_vkCmdDispatchBaseKHR              vkCmdDispatchBaseKHR              = 0;
-    PFN_vkCmdDispatchIndirect             vkCmdDispatchIndirect             = 0;
-    PFN_vkCmdDraw                         vkCmdDraw                         = 0;
-    PFN_vkCmdDrawIndexed                  vkCmdDrawIndexed                  = 0;
-    PFN_vkCmdDrawIndexedIndirect          vkCmdDrawIndexedIndirect          = 0;
-    PFN_vkCmdDrawIndexedIndirectCount     vkCmdDrawIndexedIndirectCount     = 0;
-    PFN_vkCmdDrawIndexedIndirectCountAMD  vkCmdDrawIndexedIndirectCountAMD  = 0;
-    PFN_vkCmdDrawIndexedIndirectCountKHR  vkCmdDrawIndexedIndirectCountKHR  = 0;
-    PFN_vkCmdDrawIndirect                 vkCmdDrawIndirect                 = 0;
-    PFN_vkCmdDrawIndirectByteCountEXT     vkCmdDrawIndirectByteCountEXT     = 0;
-    PFN_vkCmdDrawIndirectCount            vkCmdDrawIndirectCount            = 0;
-    PFN_vkCmdDrawIndirectCountAMD         vkCmdDrawIndirectCountAMD         = 0;
-    PFN_vkCmdDrawIndirectCountKHR         vkCmdDrawIndirectCountKHR         = 0;
-    PFN_vkCmdDrawMeshTasksIndirectCountNV vkCmdDrawMeshTasksIndirectCountNV = 0;
-    PFN_vkCmdDrawMeshTasksIndirectNV      vkCmdDrawMeshTasksIndirectNV      = 0;
-    PFN_vkCmdDrawMeshTasksNV              vkCmdDrawMeshTasksNV              = 0;
-    PFN_vkCmdDrawMultiEXT                 vkCmdDrawMultiEXT                 = 0;
-    PFN_vkCmdDrawMultiIndexedEXT          vkCmdDrawMultiIndexedEXT          = 0;
-#if defined( VK_ENABLE_BETA_EXTENSIONS )
-    PFN_vkCmdEncodeVideoKHR vkCmdEncodeVideoKHR = 0;
-#else
-    PFN_dummy placeholder_dont_call_vkCmdEncodeVideoKHR                               = 0;
-#endif /*VK_ENABLE_BETA_EXTENSIONS*/
-    PFN_vkCmdEndConditionalRenderingEXT vkCmdEndConditionalRenderingEXT = 0;
-    PFN_vkCmdEndDebugUtilsLabelEXT      vkCmdEndDebugUtilsLabelEXT      = 0;
-    PFN_vkCmdEndQuery                   vkCmdEndQuery                   = 0;
-    PFN_vkCmdEndQueryIndexedEXT         vkCmdEndQueryIndexedEXT         = 0;
-    PFN_vkCmdEndRenderPass              vkCmdEndRenderPass              = 0;
-    PFN_vkCmdEndRenderPass2             vkCmdEndRenderPass2             = 0;
-    PFN_vkCmdEndRenderPass2KHR          vkCmdEndRenderPass2KHR          = 0;
-    PFN_vkCmdEndTransformFeedbackEXT    vkCmdEndTransformFeedbackEXT    = 0;
-#if defined( VK_ENABLE_BETA_EXTENSIONS )
-    PFN_vkCmdEndVideoCodingKHR vkCmdEndVideoCodingKHR = 0;
-#else
-    PFN_dummy placeholder_dont_call_vkCmdEndVideoCodingKHR                            = 0;
-#endif /*VK_ENABLE_BETA_EXTENSIONS*/
-    PFN_vkCmdExecuteCommands                          vkCmdExecuteCommands                          = 0;
-    PFN_vkCmdExecuteGeneratedCommandsNV               vkCmdExecuteGeneratedCommandsNV               = 0;
-    PFN_vkCmdFillBuffer                               vkCmdFillBuffer                               = 0;
-    PFN_vkCmdInsertDebugUtilsLabelEXT                 vkCmdInsertDebugUtilsLabelEXT                 = 0;
-    PFN_vkCmdNextSubpass                              vkCmdNextSubpass                              = 0;
-    PFN_vkCmdNextSubpass2                             vkCmdNextSubpass2                             = 0;
-    PFN_vkCmdNextSubpass2KHR                          vkCmdNextSubpass2KHR                          = 0;
-    PFN_vkCmdPipelineBarrier                          vkCmdPipelineBarrier                          = 0;
-    PFN_vkCmdPipelineBarrier2KHR                      vkCmdPipelineBarrier2KHR                      = 0;
-    PFN_vkCmdPreprocessGeneratedCommandsNV            vkCmdPreprocessGeneratedCommandsNV            = 0;
-    PFN_vkCmdPushConstants                            vkCmdPushConstants                            = 0;
-    PFN_vkCmdPushDescriptorSetKHR                     vkCmdPushDescriptorSetKHR                     = 0;
-    PFN_vkCmdPushDescriptorSetWithTemplateKHR         vkCmdPushDescriptorSetWithTemplateKHR         = 0;
-    PFN_vkCmdResetEvent                               vkCmdResetEvent                               = 0;
-    PFN_vkCmdResetEvent2KHR                           vkCmdResetEvent2KHR                           = 0;
-    PFN_vkCmdResetQueryPool                           vkCmdResetQueryPool                           = 0;
-    PFN_vkCmdResolveImage                             vkCmdResolveImage                             = 0;
-    PFN_vkCmdResolveImage2KHR                         vkCmdResolveImage2KHR                         = 0;
-    PFN_vkCmdSetBlendConstants                        vkCmdSetBlendConstants                        = 0;
-    PFN_vkCmdSetCheckpointNV                          vkCmdSetCheckpointNV                          = 0;
-    PFN_vkCmdSetCoarseSampleOrderNV                   vkCmdSetCoarseSampleOrderNV                   = 0;
-    PFN_vkCmdSetColorWriteEnableEXT                   vkCmdSetColorWriteEnableEXT                   = 0;
-    PFN_vkCmdSetCullModeEXT                           vkCmdSetCullModeEXT                           = 0;
-    PFN_vkCmdSetDepthBias                             vkCmdSetDepthBias                             = 0;
-    PFN_vkCmdSetDepthBiasEnableEXT                    vkCmdSetDepthBiasEnableEXT                    = 0;
-    PFN_vkCmdSetDepthBounds                           vkCmdSetDepthBounds                           = 0;
-    PFN_vkCmdSetDepthBoundsTestEnableEXT              vkCmdSetDepthBoundsTestEnableEXT              = 0;
-    PFN_vkCmdSetDepthCompareOpEXT                     vkCmdSetDepthCompareOpEXT                     = 0;
-    PFN_vkCmdSetDepthTestEnableEXT                    vkCmdSetDepthTestEnableEXT                    = 0;
-    PFN_vkCmdSetDepthWriteEnableEXT                   vkCmdSetDepthWriteEnableEXT                   = 0;
-    PFN_vkCmdSetDeviceMask                            vkCmdSetDeviceMask                            = 0;
-    PFN_vkCmdSetDeviceMaskKHR                         vkCmdSetDeviceMaskKHR                         = 0;
-    PFN_vkCmdSetDiscardRectangleEXT                   vkCmdSetDiscardRectangleEXT                   = 0;
-    PFN_vkCmdSetEvent                                 vkCmdSetEvent                                 = 0;
-    PFN_vkCmdSetEvent2KHR                             vkCmdSetEvent2KHR                             = 0;
-    PFN_vkCmdSetExclusiveScissorNV                    vkCmdSetExclusiveScissorNV                    = 0;
-    PFN_vkCmdSetFragmentShadingRateEnumNV             vkCmdSetFragmentShadingRateEnumNV             = 0;
-    PFN_vkCmdSetFragmentShadingRateKHR                vkCmdSetFragmentShadingRateKHR                = 0;
-    PFN_vkCmdSetFrontFaceEXT                          vkCmdSetFrontFaceEXT                          = 0;
-    PFN_vkCmdSetLineStippleEXT                        vkCmdSetLineStippleEXT                        = 0;
-    PFN_vkCmdSetLineWidth                             vkCmdSetLineWidth                             = 0;
-    PFN_vkCmdSetLogicOpEXT                            vkCmdSetLogicOpEXT                            = 0;
-    PFN_vkCmdSetPatchControlPointsEXT                 vkCmdSetPatchControlPointsEXT                 = 0;
-    PFN_vkCmdSetPerformanceMarkerINTEL                vkCmdSetPerformanceMarkerINTEL                = 0;
-    PFN_vkCmdSetPerformanceOverrideINTEL              vkCmdSetPerformanceOverrideINTEL              = 0;
-    PFN_vkCmdSetPerformanceStreamMarkerINTEL          vkCmdSetPerformanceStreamMarkerINTEL          = 0;
-    PFN_vkCmdSetPrimitiveRestartEnableEXT             vkCmdSetPrimitiveRestartEnableEXT             = 0;
-    PFN_vkCmdSetPrimitiveTopologyEXT                  vkCmdSetPrimitiveTopologyEXT                  = 0;
-    PFN_vkCmdSetRasterizerDiscardEnableEXT            vkCmdSetRasterizerDiscardEnableEXT            = 0;
-    PFN_vkCmdSetRayTracingPipelineStackSizeKHR        vkCmdSetRayTracingPipelineStackSizeKHR        = 0;
-    PFN_vkCmdSetSampleLocationsEXT                    vkCmdSetSampleLocationsEXT                    = 0;
-    PFN_vkCmdSetScissor                               vkCmdSetScissor                               = 0;
-    PFN_vkCmdSetScissorWithCountEXT                   vkCmdSetScissorWithCountEXT                   = 0;
-    PFN_vkCmdSetStencilCompareMask                    vkCmdSetStencilCompareMask                    = 0;
-    PFN_vkCmdSetStencilOpEXT                          vkCmdSetStencilOpEXT                          = 0;
-    PFN_vkCmdSetStencilReference                      vkCmdSetStencilReference                      = 0;
-    PFN_vkCmdSetStencilTestEnableEXT                  vkCmdSetStencilTestEnableEXT                  = 0;
-    PFN_vkCmdSetStencilWriteMask                      vkCmdSetStencilWriteMask                      = 0;
-    PFN_vkCmdSetVertexInputEXT                        vkCmdSetVertexInputEXT                        = 0;
-    PFN_vkCmdSetViewport                              vkCmdSetViewport                              = 0;
-    PFN_vkCmdSetViewportShadingRatePaletteNV          vkCmdSetViewportShadingRatePaletteNV          = 0;
-    PFN_vkCmdSetViewportWScalingNV                    vkCmdSetViewportWScalingNV                    = 0;
-    PFN_vkCmdSetViewportWithCountEXT                  vkCmdSetViewportWithCountEXT                  = 0;
-    PFN_vkCmdSubpassShadingHUAWEI                     vkCmdSubpassShadingHUAWEI                     = 0;
-    PFN_vkCmdTraceRaysIndirectKHR                     vkCmdTraceRaysIndirectKHR                     = 0;
-    PFN_vkCmdTraceRaysKHR                             vkCmdTraceRaysKHR                             = 0;
-    PFN_vkCmdTraceRaysNV                              vkCmdTraceRaysNV                              = 0;
-    PFN_vkCmdUpdateBuffer                             vkCmdUpdateBuffer                             = 0;
-    PFN_vkCmdWaitEvents                               vkCmdWaitEvents                               = 0;
-    PFN_vkCmdWaitEvents2KHR                           vkCmdWaitEvents2KHR                           = 0;
-    PFN_vkCmdWriteAccelerationStructuresPropertiesKHR vkCmdWriteAccelerationStructuresPropertiesKHR = 0;
-    PFN_vkCmdWriteAccelerationStructuresPropertiesNV  vkCmdWriteAccelerationStructuresPropertiesNV  = 0;
-    PFN_vkCmdWriteBufferMarker2AMD                    vkCmdWriteBufferMarker2AMD                    = 0;
-    PFN_vkCmdWriteBufferMarkerAMD                     vkCmdWriteBufferMarkerAMD                     = 0;
-    PFN_vkCmdWriteTimestamp                           vkCmdWriteTimestamp                           = 0;
-    PFN_vkCmdWriteTimestamp2KHR                       vkCmdWriteTimestamp2KHR                       = 0;
-    PFN_vkCompileDeferredNV                           vkCompileDeferredNV                           = 0;
-    PFN_vkCopyAccelerationStructureKHR                vkCopyAccelerationStructureKHR                = 0;
-    PFN_vkCopyAccelerationStructureToMemoryKHR        vkCopyAccelerationStructureToMemoryKHR        = 0;
-    PFN_vkCopyMemoryToAccelerationStructureKHR        vkCopyMemoryToAccelerationStructureKHR        = 0;
-    PFN_vkCreateAccelerationStructureKHR              vkCreateAccelerationStructureKHR              = 0;
-    PFN_vkCreateAccelerationStructureNV               vkCreateAccelerationStructureNV               = 0;
-#if defined( VK_USE_PLATFORM_ANDROID_KHR )
-    PFN_vkCreateAndroidSurfaceKHR vkCreateAndroidSurfaceKHR = 0;
-#else
-    PFN_dummy placeholder_dont_call_vkCreateAndroidSurfaceKHR                         = 0;
-#endif /*VK_USE_PLATFORM_ANDROID_KHR*/
-    PFN_vkCreateBuffer                      vkCreateBuffer                      = 0;
-    PFN_vkCreateBufferView                  vkCreateBufferView                  = 0;
-    PFN_vkCreateCommandPool                 vkCreateCommandPool                 = 0;
-    PFN_vkCreateComputePipelines            vkCreateComputePipelines            = 0;
-    PFN_vkCreateCuFunctionNVX               vkCreateCuFunctionNVX               = 0;
-    PFN_vkCreateCuModuleNVX                 vkCreateCuModuleNVX                 = 0;
-    PFN_vkCreateDebugReportCallbackEXT      vkCreateDebugReportCallbackEXT      = 0;
-    PFN_vkCreateDebugUtilsMessengerEXT      vkCreateDebugUtilsMessengerEXT      = 0;
-    PFN_vkCreateDeferredOperationKHR        vkCreateDeferredOperationKHR        = 0;
-    PFN_vkCreateDescriptorPool              vkCreateDescriptorPool              = 0;
-    PFN_vkCreateDescriptorSetLayout         vkCreateDescriptorSetLayout         = 0;
-    PFN_vkCreateDescriptorUpdateTemplate    vkCreateDescriptorUpdateTemplate    = 0;
-    PFN_vkCreateDescriptorUpdateTemplateKHR vkCreateDescriptorUpdateTemplateKHR = 0;
-    PFN_vkCreateDevice                      vkCreateDevice                      = 0;
-#if defined( VK_USE_PLATFORM_DIRECTFB_EXT )
-    PFN_vkCreateDirectFBSurfaceEXT vkCreateDirectFBSurfaceEXT = 0;
-#else
-    PFN_dummy placeholder_dont_call_vkCreateDirectFBSurfaceEXT                        = 0;
-#endif /*VK_USE_PLATFORM_DIRECTFB_EXT*/
-    PFN_vkCreateDisplayModeKHR         vkCreateDisplayModeKHR         = 0;
-    PFN_vkCreateDisplayPlaneSurfaceKHR vkCreateDisplayPlaneSurfaceKHR = 0;
-    PFN_vkCreateEvent                  vkCreateEvent                  = 0;
-    PFN_vkCreateFence                  vkCreateFence                  = 0;
-    PFN_vkCreateFramebuffer            vkCreateFramebuffer            = 0;
-    PFN_vkCreateGraphicsPipelines      vkCreateGraphicsPipelines      = 0;
-    PFN_vkCreateHeadlessSurfaceEXT     vkCreateHeadlessSurfaceEXT     = 0;
-#if defined( VK_USE_PLATFORM_IOS_MVK )
-    PFN_vkCreateIOSSurfaceMVK vkCreateIOSSurfaceMVK = 0;
-#else
-    PFN_dummy placeholder_dont_call_vkCreateIOSSurfaceMVK                             = 0;
-#endif /*VK_USE_PLATFORM_IOS_MVK*/
-    PFN_vkCreateImage vkCreateImage = 0;
-#if defined( VK_USE_PLATFORM_FUCHSIA )
-    PFN_vkCreateImagePipeSurfaceFUCHSIA vkCreateImagePipeSurfaceFUCHSIA = 0;
-#else
-    PFN_dummy placeholder_dont_call_vkCreateImagePipeSurfaceFUCHSIA                   = 0;
-#endif /*VK_USE_PLATFORM_FUCHSIA*/
-    PFN_vkCreateImageView                vkCreateImageView                = 0;
-    PFN_vkCreateIndirectCommandsLayoutNV vkCreateIndirectCommandsLayoutNV = 0;
-    PFN_vkCreateInstance                 vkCreateInstance                 = 0;
-#if defined( VK_USE_PLATFORM_MACOS_MVK )
-    PFN_vkCreateMacOSSurfaceMVK vkCreateMacOSSurfaceMVK = 0;
-#else
-    PFN_dummy placeholder_dont_call_vkCreateMacOSSurfaceMVK                           = 0;
-#endif /*VK_USE_PLATFORM_MACOS_MVK*/
-#if defined( VK_USE_PLATFORM_METAL_EXT )
-    PFN_vkCreateMetalSurfaceEXT vkCreateMetalSurfaceEXT = 0;
-#else
-    PFN_dummy placeholder_dont_call_vkCreateMetalSurfaceEXT                           = 0;
-#endif /*VK_USE_PLATFORM_METAL_EXT*/
-    PFN_vkCreatePipelineCache             vkCreatePipelineCache             = 0;
-    PFN_vkCreatePipelineLayout            vkCreatePipelineLayout            = 0;
-    PFN_vkCreatePrivateDataSlotEXT        vkCreatePrivateDataSlotEXT        = 0;
-    PFN_vkCreateQueryPool                 vkCreateQueryPool                 = 0;
-    PFN_vkCreateRayTracingPipelinesKHR    vkCreateRayTracingPipelinesKHR    = 0;
-    PFN_vkCreateRayTracingPipelinesNV     vkCreateRayTracingPipelinesNV     = 0;
-    PFN_vkCreateRenderPass                vkCreateRenderPass                = 0;
-    PFN_vkCreateRenderPass2               vkCreateRenderPass2               = 0;
-    PFN_vkCreateRenderPass2KHR            vkCreateRenderPass2KHR            = 0;
-    PFN_vkCreateSampler                   vkCreateSampler                   = 0;
-    PFN_vkCreateSamplerYcbcrConversion    vkCreateSamplerYcbcrConversion    = 0;
-    PFN_vkCreateSamplerYcbcrConversionKHR vkCreateSamplerYcbcrConversionKHR = 0;
-#if defined( VK_USE_PLATFORM_SCREEN_QNX )
-    PFN_vkCreateScreenSurfaceQNX vkCreateScreenSurfaceQNX = 0;
-#else
-    PFN_dummy placeholder_dont_call_vkCreateScreenSurfaceQNX                          = 0;
-#endif /*VK_USE_PLATFORM_SCREEN_QNX*/
-    PFN_vkCreateSemaphore           vkCreateSemaphore           = 0;
-    PFN_vkCreateShaderModule        vkCreateShaderModule        = 0;
-    PFN_vkCreateSharedSwapchainsKHR vkCreateSharedSwapchainsKHR = 0;
-#if defined( VK_USE_PLATFORM_GGP )
-    PFN_vkCreateStreamDescriptorSurfaceGGP vkCreateStreamDescriptorSurfaceGGP = 0;
-#else
-    PFN_dummy placeholder_dont_call_vkCreateStreamDescriptorSurfaceGGP                = 0;
-#endif /*VK_USE_PLATFORM_GGP*/
-    PFN_vkCreateSwapchainKHR       vkCreateSwapchainKHR       = 0;
-    PFN_vkCreateValidationCacheEXT vkCreateValidationCacheEXT = 0;
-#if defined( VK_USE_PLATFORM_VI_NN )
-    PFN_vkCreateViSurfaceNN vkCreateViSurfaceNN = 0;
-#else
-    PFN_dummy placeholder_dont_call_vkCreateViSurfaceNN                               = 0;
-#endif /*VK_USE_PLATFORM_VI_NN*/
-#if defined( VK_ENABLE_BETA_EXTENSIONS )
-    PFN_vkCreateVideoSessionKHR vkCreateVideoSessionKHR = 0;
-#else
-    PFN_dummy placeholder_dont_call_vkCreateVideoSessionKHR                           = 0;
-#endif /*VK_ENABLE_BETA_EXTENSIONS*/
-#if defined( VK_ENABLE_BETA_EXTENSIONS )
-    PFN_vkCreateVideoSessionParametersKHR vkCreateVideoSessionParametersKHR = 0;
-#else
-    PFN_dummy placeholder_dont_call_vkCreateVideoSessionParametersKHR                 = 0;
-#endif /*VK_ENABLE_BETA_EXTENSIONS*/
-#if defined( VK_USE_PLATFORM_WAYLAND_KHR )
-    PFN_vkCreateWaylandSurfaceKHR vkCreateWaylandSurfaceKHR = 0;
-#else
-    PFN_dummy placeholder_dont_call_vkCreateWaylandSurfaceKHR                         = 0;
-#endif /*VK_USE_PLATFORM_WAYLAND_KHR*/
-#if defined( VK_USE_PLATFORM_WIN32_KHR )
-    PFN_vkCreateWin32SurfaceKHR vkCreateWin32SurfaceKHR = 0;
-#else
-    PFN_dummy placeholder_dont_call_vkCreateWin32SurfaceKHR                           = 0;
-#endif /*VK_USE_PLATFORM_WIN32_KHR*/
-#if defined( VK_USE_PLATFORM_XCB_KHR )
-    PFN_vkCreateXcbSurfaceKHR vkCreateXcbSurfaceKHR = 0;
-#else
-    PFN_dummy placeholder_dont_call_vkCreateXcbSurfaceKHR                             = 0;
-#endif /*VK_USE_PLATFORM_XCB_KHR*/
-#if defined( VK_USE_PLATFORM_XLIB_KHR )
-    PFN_vkCreateXlibSurfaceKHR vkCreateXlibSurfaceKHR = 0;
-#else
-    PFN_dummy placeholder_dont_call_vkCreateXlibSurfaceKHR                            = 0;
-#endif /*VK_USE_PLATFORM_XLIB_KHR*/
-    PFN_vkDebugMarkerSetObjectNameEXT        vkDebugMarkerSetObjectNameEXT        = 0;
-    PFN_vkDebugMarkerSetObjectTagEXT         vkDebugMarkerSetObjectTagEXT         = 0;
-    PFN_vkDebugReportMessageEXT              vkDebugReportMessageEXT              = 0;
-    PFN_vkDeferredOperationJoinKHR           vkDeferredOperationJoinKHR           = 0;
-    PFN_vkDestroyAccelerationStructureKHR    vkDestroyAccelerationStructureKHR    = 0;
-    PFN_vkDestroyAccelerationStructureNV     vkDestroyAccelerationStructureNV     = 0;
-    PFN_vkDestroyBuffer                      vkDestroyBuffer                      = 0;
-    PFN_vkDestroyBufferView                  vkDestroyBufferView                  = 0;
-    PFN_vkDestroyCommandPool                 vkDestroyCommandPool                 = 0;
-    PFN_vkDestroyCuFunctionNVX               vkDestroyCuFunctionNVX               = 0;
-    PFN_vkDestroyCuModuleNVX                 vkDestroyCuModuleNVX                 = 0;
-    PFN_vkDestroyDebugReportCallbackEXT      vkDestroyDebugReportCallbackEXT      = 0;
-    PFN_vkDestroyDebugUtilsMessengerEXT      vkDestroyDebugUtilsMessengerEXT      = 0;
-    PFN_vkDestroyDeferredOperationKHR        vkDestroyDeferredOperationKHR        = 0;
-    PFN_vkDestroyDescriptorPool              vkDestroyDescriptorPool              = 0;
-    PFN_vkDestroyDescriptorSetLayout         vkDestroyDescriptorSetLayout         = 0;
-    PFN_vkDestroyDescriptorUpdateTemplate    vkDestroyDescriptorUpdateTemplate    = 0;
-    PFN_vkDestroyDescriptorUpdateTemplateKHR vkDestroyDescriptorUpdateTemplateKHR = 0;
-    PFN_vkDestroyDevice                      vkDestroyDevice                      = 0;
-    PFN_vkDestroyEvent                       vkDestroyEvent                       = 0;
-    PFN_vkDestroyFence                       vkDestroyFence                       = 0;
-    PFN_vkDestroyFramebuffer                 vkDestroyFramebuffer                 = 0;
-    PFN_vkDestroyImage                       vkDestroyImage                       = 0;
-    PFN_vkDestroyImageView                   vkDestroyImageView                   = 0;
-    PFN_vkDestroyIndirectCommandsLayoutNV    vkDestroyIndirectCommandsLayoutNV    = 0;
-    PFN_vkDestroyInstance                    vkDestroyInstance                    = 0;
-    PFN_vkDestroyPipeline                    vkDestroyPipeline                    = 0;
-    PFN_vkDestroyPipelineCache               vkDestroyPipelineCache               = 0;
-    PFN_vkDestroyPipelineLayout              vkDestroyPipelineLayout              = 0;
-    PFN_vkDestroyPrivateDataSlotEXT          vkDestroyPrivateDataSlotEXT          = 0;
-    PFN_vkDestroyQueryPool                   vkDestroyQueryPool                   = 0;
-    PFN_vkDestroyRenderPass                  vkDestroyRenderPass                  = 0;
-    PFN_vkDestroySampler                     vkDestroySampler                     = 0;
-    PFN_vkDestroySamplerYcbcrConversion      vkDestroySamplerYcbcrConversion      = 0;
-    PFN_vkDestroySamplerYcbcrConversionKHR   vkDestroySamplerYcbcrConversionKHR   = 0;
-    PFN_vkDestroySemaphore                   vkDestroySemaphore                   = 0;
-    PFN_vkDestroyShaderModule                vkDestroyShaderModule                = 0;
-    PFN_vkDestroySurfaceKHR                  vkDestroySurfaceKHR                  = 0;
-    PFN_vkDestroySwapchainKHR                vkDestroySwapchainKHR                = 0;
-    PFN_vkDestroyValidationCacheEXT          vkDestroyValidationCacheEXT          = 0;
-#if defined( VK_ENABLE_BETA_EXTENSIONS )
-    PFN_vkDestroyVideoSessionKHR vkDestroyVideoSessionKHR = 0;
-#else
-    PFN_dummy placeholder_dont_call_vkDestroyVideoSessionKHR                          = 0;
-#endif /*VK_ENABLE_BETA_EXTENSIONS*/
-#if defined( VK_ENABLE_BETA_EXTENSIONS )
-    PFN_vkDestroyVideoSessionParametersKHR vkDestroyVideoSessionParametersKHR = 0;
-#else
-    PFN_dummy placeholder_dont_call_vkDestroyVideoSessionParametersKHR                = 0;
-#endif /*VK_ENABLE_BETA_EXTENSIONS*/
-    PFN_vkDeviceWaitIdle                       vkDeviceWaitIdle                       = 0;
-    PFN_vkDisplayPowerControlEXT               vkDisplayPowerControlEXT               = 0;
-    PFN_vkEndCommandBuffer                     vkEndCommandBuffer                     = 0;
-    PFN_vkEnumerateDeviceExtensionProperties   vkEnumerateDeviceExtensionProperties   = 0;
-    PFN_vkEnumerateDeviceLayerProperties       vkEnumerateDeviceLayerProperties       = 0;
-    PFN_vkEnumerateInstanceExtensionProperties vkEnumerateInstanceExtensionProperties = 0;
-    PFN_vkEnumerateInstanceLayerProperties     vkEnumerateInstanceLayerProperties     = 0;
-    PFN_vkEnumerateInstanceVersion             vkEnumerateInstanceVersion             = 0;
-    PFN_vkEnumeratePhysicalDeviceGroups        vkEnumeratePhysicalDeviceGroups        = 0;
-    PFN_vkEnumeratePhysicalDeviceGroupsKHR     vkEnumeratePhysicalDeviceGroupsKHR     = 0;
-    PFN_vkEnumeratePhysicalDeviceQueueFamilyPerformanceQueryCountersKHR
-                                                       vkEnumeratePhysicalDeviceQueueFamilyPerformanceQueryCountersKHR = 0;
+    //=== VK_VERSION_1_0 ===
+    PFN_vkCreateInstance                               vkCreateInstance                               = 0;
+    PFN_vkDestroyInstance                              vkDestroyInstance                              = 0;
     PFN_vkEnumeratePhysicalDevices                     vkEnumeratePhysicalDevices                     = 0;
-    PFN_vkFlushMappedMemoryRanges                      vkFlushMappedMemoryRanges                      = 0;
-    PFN_vkFreeCommandBuffers                           vkFreeCommandBuffers                           = 0;
-    PFN_vkFreeDescriptorSets                           vkFreeDescriptorSets                           = 0;
+    PFN_vkGetPhysicalDeviceFeatures                    vkGetPhysicalDeviceFeatures                    = 0;
+    PFN_vkGetPhysicalDeviceFormatProperties            vkGetPhysicalDeviceFormatProperties            = 0;
+    PFN_vkGetPhysicalDeviceImageFormatProperties       vkGetPhysicalDeviceImageFormatProperties       = 0;
+    PFN_vkGetPhysicalDeviceProperties                  vkGetPhysicalDeviceProperties                  = 0;
+    PFN_vkGetPhysicalDeviceQueueFamilyProperties       vkGetPhysicalDeviceQueueFamilyProperties       = 0;
+    PFN_vkGetPhysicalDeviceMemoryProperties            vkGetPhysicalDeviceMemoryProperties            = 0;
+    PFN_vkGetInstanceProcAddr                          vkGetInstanceProcAddr                          = 0;
+    PFN_vkGetDeviceProcAddr                            vkGetDeviceProcAddr                            = 0;
+    PFN_vkCreateDevice                                 vkCreateDevice                                 = 0;
+    PFN_vkDestroyDevice                                vkDestroyDevice                                = 0;
+    PFN_vkEnumerateInstanceExtensionProperties         vkEnumerateInstanceExtensionProperties         = 0;
+    PFN_vkEnumerateDeviceExtensionProperties           vkEnumerateDeviceExtensionProperties           = 0;
+    PFN_vkEnumerateInstanceLayerProperties             vkEnumerateInstanceLayerProperties             = 0;
+    PFN_vkEnumerateDeviceLayerProperties               vkEnumerateDeviceLayerProperties               = 0;
+    PFN_vkGetDeviceQueue                               vkGetDeviceQueue                               = 0;
+    PFN_vkQueueSubmit                                  vkQueueSubmit                                  = 0;
+    PFN_vkQueueWaitIdle                                vkQueueWaitIdle                                = 0;
+    PFN_vkDeviceWaitIdle                               vkDeviceWaitIdle                               = 0;
+    PFN_vkAllocateMemory                               vkAllocateMemory                               = 0;
     PFN_vkFreeMemory                                   vkFreeMemory                                   = 0;
-    PFN_vkGetAccelerationStructureBuildSizesKHR        vkGetAccelerationStructureBuildSizesKHR        = 0;
-    PFN_vkGetAccelerationStructureDeviceAddressKHR     vkGetAccelerationStructureDeviceAddressKHR     = 0;
-    PFN_vkGetAccelerationStructureHandleNV             vkGetAccelerationStructureHandleNV             = 0;
-    PFN_vkGetAccelerationStructureMemoryRequirementsNV vkGetAccelerationStructureMemoryRequirementsNV = 0;
-#if defined( VK_USE_PLATFORM_ANDROID_KHR )
-    PFN_vkGetAndroidHardwareBufferPropertiesANDROID vkGetAndroidHardwareBufferPropertiesANDROID = 0;
-#else
-    PFN_dummy placeholder_dont_call_vkGetAndroidHardwareBufferPropertiesANDROID       = 0;
-#endif /*VK_USE_PLATFORM_ANDROID_KHR*/
-    PFN_vkGetBufferDeviceAddress                         vkGetBufferDeviceAddress                         = 0;
-    PFN_vkGetBufferDeviceAddressEXT                      vkGetBufferDeviceAddressEXT                      = 0;
-    PFN_vkGetBufferDeviceAddressKHR                      vkGetBufferDeviceAddressKHR                      = 0;
-    PFN_vkGetBufferMemoryRequirements                    vkGetBufferMemoryRequirements                    = 0;
-    PFN_vkGetBufferMemoryRequirements2                   vkGetBufferMemoryRequirements2                   = 0;
-    PFN_vkGetBufferMemoryRequirements2KHR                vkGetBufferMemoryRequirements2KHR                = 0;
-    PFN_vkGetBufferOpaqueCaptureAddress                  vkGetBufferOpaqueCaptureAddress                  = 0;
-    PFN_vkGetBufferOpaqueCaptureAddressKHR               vkGetBufferOpaqueCaptureAddressKHR               = 0;
-    PFN_vkGetCalibratedTimestampsEXT                     vkGetCalibratedTimestampsEXT                     = 0;
-    PFN_vkGetDeferredOperationMaxConcurrencyKHR          vkGetDeferredOperationMaxConcurrencyKHR          = 0;
-    PFN_vkGetDeferredOperationResultKHR                  vkGetDeferredOperationResultKHR                  = 0;
-    PFN_vkGetDescriptorSetLayoutSupport                  vkGetDescriptorSetLayoutSupport                  = 0;
-    PFN_vkGetDescriptorSetLayoutSupportKHR               vkGetDescriptorSetLayoutSupportKHR               = 0;
-    PFN_vkGetDeviceAccelerationStructureCompatibilityKHR vkGetDeviceAccelerationStructureCompatibilityKHR = 0;
-    PFN_vkGetDeviceGroupPeerMemoryFeatures               vkGetDeviceGroupPeerMemoryFeatures               = 0;
-    PFN_vkGetDeviceGroupPeerMemoryFeaturesKHR            vkGetDeviceGroupPeerMemoryFeaturesKHR            = 0;
-    PFN_vkGetDeviceGroupPresentCapabilitiesKHR           vkGetDeviceGroupPresentCapabilitiesKHR           = 0;
-#if defined( VK_USE_PLATFORM_WIN32_KHR )
-    PFN_vkGetDeviceGroupSurfacePresentModes2EXT vkGetDeviceGroupSurfacePresentModes2EXT = 0;
-#else
-    PFN_dummy placeholder_dont_call_vkGetDeviceGroupSurfacePresentModes2EXT           = 0;
-#endif /*VK_USE_PLATFORM_WIN32_KHR*/
-    PFN_vkGetDeviceGroupSurfacePresentModesKHR          vkGetDeviceGroupSurfacePresentModesKHR          = 0;
-    PFN_vkGetDeviceMemoryCommitment                     vkGetDeviceMemoryCommitment                     = 0;
-    PFN_vkGetDeviceMemoryOpaqueCaptureAddress           vkGetDeviceMemoryOpaqueCaptureAddress           = 0;
-    PFN_vkGetDeviceMemoryOpaqueCaptureAddressKHR        vkGetDeviceMemoryOpaqueCaptureAddressKHR        = 0;
-    PFN_vkGetDeviceProcAddr                             vkGetDeviceProcAddr                             = 0;
-    PFN_vkGetDeviceQueue                                vkGetDeviceQueue                                = 0;
+    PFN_vkMapMemory                                    vkMapMemory                                    = 0;
+    PFN_vkUnmapMemory                                  vkUnmapMemory                                  = 0;
+    PFN_vkFlushMappedMemoryRanges                      vkFlushMappedMemoryRanges                      = 0;
+    PFN_vkInvalidateMappedMemoryRanges                 vkInvalidateMappedMemoryRanges                 = 0;
+    PFN_vkGetDeviceMemoryCommitment                    vkGetDeviceMemoryCommitment                    = 0;
+    PFN_vkBindBufferMemory                             vkBindBufferMemory                             = 0;
+    PFN_vkBindImageMemory                              vkBindImageMemory                              = 0;
+    PFN_vkGetBufferMemoryRequirements                  vkGetBufferMemoryRequirements                  = 0;
+    PFN_vkGetImageMemoryRequirements                   vkGetImageMemoryRequirements                   = 0;
+    PFN_vkGetImageSparseMemoryRequirements             vkGetImageSparseMemoryRequirements             = 0;
+    PFN_vkGetPhysicalDeviceSparseImageFormatProperties vkGetPhysicalDeviceSparseImageFormatProperties = 0;
+    PFN_vkQueueBindSparse                              vkQueueBindSparse                              = 0;
+    PFN_vkCreateFence                                  vkCreateFence                                  = 0;
+    PFN_vkDestroyFence                                 vkDestroyFence                                 = 0;
+    PFN_vkResetFences                                  vkResetFences                                  = 0;
+    PFN_vkGetFenceStatus                               vkGetFenceStatus                               = 0;
+    PFN_vkWaitForFences                                vkWaitForFences                                = 0;
+    PFN_vkCreateSemaphore                              vkCreateSemaphore                              = 0;
+    PFN_vkDestroySemaphore                             vkDestroySemaphore                             = 0;
+    PFN_vkCreateEvent                                  vkCreateEvent                                  = 0;
+    PFN_vkDestroyEvent                                 vkDestroyEvent                                 = 0;
+    PFN_vkGetEventStatus                               vkGetEventStatus                               = 0;
+    PFN_vkSetEvent                                     vkSetEvent                                     = 0;
+    PFN_vkResetEvent                                   vkResetEvent                                   = 0;
+    PFN_vkCreateQueryPool                              vkCreateQueryPool                              = 0;
+    PFN_vkDestroyQueryPool                             vkDestroyQueryPool                             = 0;
+    PFN_vkGetQueryPoolResults                          vkGetQueryPoolResults                          = 0;
+    PFN_vkCreateBuffer                                 vkCreateBuffer                                 = 0;
+    PFN_vkDestroyBuffer                                vkDestroyBuffer                                = 0;
+    PFN_vkCreateBufferView                             vkCreateBufferView                             = 0;
+    PFN_vkDestroyBufferView                            vkDestroyBufferView                            = 0;
+    PFN_vkCreateImage                                  vkCreateImage                                  = 0;
+    PFN_vkDestroyImage                                 vkDestroyImage                                 = 0;
+    PFN_vkGetImageSubresourceLayout                    vkGetImageSubresourceLayout                    = 0;
+    PFN_vkCreateImageView                              vkCreateImageView                              = 0;
+    PFN_vkDestroyImageView                             vkDestroyImageView                             = 0;
+    PFN_vkCreateShaderModule                           vkCreateShaderModule                           = 0;
+    PFN_vkDestroyShaderModule                          vkDestroyShaderModule                          = 0;
+    PFN_vkCreatePipelineCache                          vkCreatePipelineCache                          = 0;
+    PFN_vkDestroyPipelineCache                         vkDestroyPipelineCache                         = 0;
+    PFN_vkGetPipelineCacheData                         vkGetPipelineCacheData                         = 0;
+    PFN_vkMergePipelineCaches                          vkMergePipelineCaches                          = 0;
+    PFN_vkCreateGraphicsPipelines                      vkCreateGraphicsPipelines                      = 0;
+    PFN_vkCreateComputePipelines                       vkCreateComputePipelines                       = 0;
+    PFN_vkDestroyPipeline                              vkDestroyPipeline                              = 0;
+    PFN_vkCreatePipelineLayout                         vkCreatePipelineLayout                         = 0;
+    PFN_vkDestroyPipelineLayout                        vkDestroyPipelineLayout                        = 0;
+    PFN_vkCreateSampler                                vkCreateSampler                                = 0;
+    PFN_vkDestroySampler                               vkDestroySampler                               = 0;
+    PFN_vkCreateDescriptorSetLayout                    vkCreateDescriptorSetLayout                    = 0;
+    PFN_vkDestroyDescriptorSetLayout                   vkDestroyDescriptorSetLayout                   = 0;
+    PFN_vkCreateDescriptorPool                         vkCreateDescriptorPool                         = 0;
+    PFN_vkDestroyDescriptorPool                        vkDestroyDescriptorPool                        = 0;
+    PFN_vkResetDescriptorPool                          vkResetDescriptorPool                          = 0;
+    PFN_vkAllocateDescriptorSets                       vkAllocateDescriptorSets                       = 0;
+    PFN_vkFreeDescriptorSets                           vkFreeDescriptorSets                           = 0;
+    PFN_vkUpdateDescriptorSets                         vkUpdateDescriptorSets                         = 0;
+    PFN_vkCreateFramebuffer                            vkCreateFramebuffer                            = 0;
+    PFN_vkDestroyFramebuffer                           vkDestroyFramebuffer                           = 0;
+    PFN_vkCreateRenderPass                             vkCreateRenderPass                             = 0;
+    PFN_vkDestroyRenderPass                            vkDestroyRenderPass                            = 0;
+    PFN_vkGetRenderAreaGranularity                     vkGetRenderAreaGranularity                     = 0;
+    PFN_vkCreateCommandPool                            vkCreateCommandPool                            = 0;
+    PFN_vkDestroyCommandPool                           vkDestroyCommandPool                           = 0;
+    PFN_vkResetCommandPool                             vkResetCommandPool                             = 0;
+    PFN_vkAllocateCommandBuffers                       vkAllocateCommandBuffers                       = 0;
+    PFN_vkFreeCommandBuffers                           vkFreeCommandBuffers                           = 0;
+    PFN_vkBeginCommandBuffer                           vkBeginCommandBuffer                           = 0;
+    PFN_vkEndCommandBuffer                             vkEndCommandBuffer                             = 0;
+    PFN_vkResetCommandBuffer                           vkResetCommandBuffer                           = 0;
+    PFN_vkCmdBindPipeline                              vkCmdBindPipeline                              = 0;
+    PFN_vkCmdSetViewport                               vkCmdSetViewport                               = 0;
+    PFN_vkCmdSetScissor                                vkCmdSetScissor                                = 0;
+    PFN_vkCmdSetLineWidth                              vkCmdSetLineWidth                              = 0;
+    PFN_vkCmdSetDepthBias                              vkCmdSetDepthBias                              = 0;
+    PFN_vkCmdSetBlendConstants                         vkCmdSetBlendConstants                         = 0;
+    PFN_vkCmdSetDepthBounds                            vkCmdSetDepthBounds                            = 0;
+    PFN_vkCmdSetStencilCompareMask                     vkCmdSetStencilCompareMask                     = 0;
+    PFN_vkCmdSetStencilWriteMask                       vkCmdSetStencilWriteMask                       = 0;
+    PFN_vkCmdSetStencilReference                       vkCmdSetStencilReference                       = 0;
+    PFN_vkCmdBindDescriptorSets                        vkCmdBindDescriptorSets                        = 0;
+    PFN_vkCmdBindIndexBuffer                           vkCmdBindIndexBuffer                           = 0;
+    PFN_vkCmdBindVertexBuffers                         vkCmdBindVertexBuffers                         = 0;
+    PFN_vkCmdDraw                                      vkCmdDraw                                      = 0;
+    PFN_vkCmdDrawIndexed                               vkCmdDrawIndexed                               = 0;
+    PFN_vkCmdDrawIndirect                              vkCmdDrawIndirect                              = 0;
+    PFN_vkCmdDrawIndexedIndirect                       vkCmdDrawIndexedIndirect                       = 0;
+    PFN_vkCmdDispatch                                  vkCmdDispatch                                  = 0;
+    PFN_vkCmdDispatchIndirect                          vkCmdDispatchIndirect                          = 0;
+    PFN_vkCmdCopyBuffer                                vkCmdCopyBuffer                                = 0;
+    PFN_vkCmdCopyImage                                 vkCmdCopyImage                                 = 0;
+    PFN_vkCmdBlitImage                                 vkCmdBlitImage                                 = 0;
+    PFN_vkCmdCopyBufferToImage                         vkCmdCopyBufferToImage                         = 0;
+    PFN_vkCmdCopyImageToBuffer                         vkCmdCopyImageToBuffer                         = 0;
+    PFN_vkCmdUpdateBuffer                              vkCmdUpdateBuffer                              = 0;
+    PFN_vkCmdFillBuffer                                vkCmdFillBuffer                                = 0;
+    PFN_vkCmdClearColorImage                           vkCmdClearColorImage                           = 0;
+    PFN_vkCmdClearDepthStencilImage                    vkCmdClearDepthStencilImage                    = 0;
+    PFN_vkCmdClearAttachments                          vkCmdClearAttachments                          = 0;
+    PFN_vkCmdResolveImage                              vkCmdResolveImage                              = 0;
+    PFN_vkCmdSetEvent                                  vkCmdSetEvent                                  = 0;
+    PFN_vkCmdResetEvent                                vkCmdResetEvent                                = 0;
+    PFN_vkCmdWaitEvents                                vkCmdWaitEvents                                = 0;
+    PFN_vkCmdPipelineBarrier                           vkCmdPipelineBarrier                           = 0;
+    PFN_vkCmdBeginQuery                                vkCmdBeginQuery                                = 0;
+    PFN_vkCmdEndQuery                                  vkCmdEndQuery                                  = 0;
+    PFN_vkCmdResetQueryPool                            vkCmdResetQueryPool                            = 0;
+    PFN_vkCmdWriteTimestamp                            vkCmdWriteTimestamp                            = 0;
+    PFN_vkCmdCopyQueryPoolResults                      vkCmdCopyQueryPoolResults                      = 0;
+    PFN_vkCmdPushConstants                             vkCmdPushConstants                             = 0;
+    PFN_vkCmdBeginRenderPass                           vkCmdBeginRenderPass                           = 0;
+    PFN_vkCmdNextSubpass                               vkCmdNextSubpass                               = 0;
+    PFN_vkCmdEndRenderPass                             vkCmdEndRenderPass                             = 0;
+    PFN_vkCmdExecuteCommands                           vkCmdExecuteCommands                           = 0;
+
+    //=== VK_VERSION_1_1 ===
+    PFN_vkEnumerateInstanceVersion                      vkEnumerateInstanceVersion                      = 0;
+    PFN_vkBindBufferMemory2                             vkBindBufferMemory2                             = 0;
+    PFN_vkBindImageMemory2                              vkBindImageMemory2                              = 0;
+    PFN_vkGetDeviceGroupPeerMemoryFeatures              vkGetDeviceGroupPeerMemoryFeatures              = 0;
+    PFN_vkCmdSetDeviceMask                              vkCmdSetDeviceMask                              = 0;
+    PFN_vkCmdDispatchBase                               vkCmdDispatchBase                               = 0;
+    PFN_vkEnumeratePhysicalDeviceGroups                 vkEnumeratePhysicalDeviceGroups                 = 0;
+    PFN_vkGetImageMemoryRequirements2                   vkGetImageMemoryRequirements2                   = 0;
+    PFN_vkGetBufferMemoryRequirements2                  vkGetBufferMemoryRequirements2                  = 0;
+    PFN_vkGetImageSparseMemoryRequirements2             vkGetImageSparseMemoryRequirements2             = 0;
+    PFN_vkGetPhysicalDeviceFeatures2                    vkGetPhysicalDeviceFeatures2                    = 0;
+    PFN_vkGetPhysicalDeviceProperties2                  vkGetPhysicalDeviceProperties2                  = 0;
+    PFN_vkGetPhysicalDeviceFormatProperties2            vkGetPhysicalDeviceFormatProperties2            = 0;
+    PFN_vkGetPhysicalDeviceImageFormatProperties2       vkGetPhysicalDeviceImageFormatProperties2       = 0;
+    PFN_vkGetPhysicalDeviceQueueFamilyProperties2       vkGetPhysicalDeviceQueueFamilyProperties2       = 0;
+    PFN_vkGetPhysicalDeviceMemoryProperties2            vkGetPhysicalDeviceMemoryProperties2            = 0;
+    PFN_vkGetPhysicalDeviceSparseImageFormatProperties2 vkGetPhysicalDeviceSparseImageFormatProperties2 = 0;
+    PFN_vkTrimCommandPool                               vkTrimCommandPool                               = 0;
     PFN_vkGetDeviceQueue2                               vkGetDeviceQueue2                               = 0;
-    PFN_vkGetDeviceSubpassShadingMaxWorkgroupSizeHUAWEI vkGetDeviceSubpassShadingMaxWorkgroupSizeHUAWEI = 0;
-    PFN_vkGetDisplayModeProperties2KHR                  vkGetDisplayModeProperties2KHR                  = 0;
-    PFN_vkGetDisplayModePropertiesKHR                   vkGetDisplayModePropertiesKHR                   = 0;
-    PFN_vkGetDisplayPlaneCapabilities2KHR               vkGetDisplayPlaneCapabilities2KHR               = 0;
-    PFN_vkGetDisplayPlaneCapabilitiesKHR                vkGetDisplayPlaneCapabilitiesKHR                = 0;
-    PFN_vkGetDisplayPlaneSupportedDisplaysKHR           vkGetDisplayPlaneSupportedDisplaysKHR           = 0;
-    PFN_vkGetDrmDisplayEXT                              vkGetDrmDisplayEXT                              = 0;
-    PFN_vkGetEventStatus                                vkGetEventStatus                                = 0;
-    PFN_vkGetFenceFdKHR                                 vkGetFenceFdKHR                                 = 0;
-    PFN_vkGetFenceStatus                                vkGetFenceStatus                                = 0;
-#if defined( VK_USE_PLATFORM_WIN32_KHR )
-    PFN_vkGetFenceWin32HandleKHR vkGetFenceWin32HandleKHR = 0;
-#else
-    PFN_dummy placeholder_dont_call_vkGetFenceWin32HandleKHR                          = 0;
-#endif /*VK_USE_PLATFORM_WIN32_KHR*/
-    PFN_vkGetGeneratedCommandsMemoryRequirementsNV vkGetGeneratedCommandsMemoryRequirementsNV = 0;
-    PFN_vkGetImageDrmFormatModifierPropertiesEXT   vkGetImageDrmFormatModifierPropertiesEXT   = 0;
-    PFN_vkGetImageMemoryRequirements               vkGetImageMemoryRequirements               = 0;
-    PFN_vkGetImageMemoryRequirements2              vkGetImageMemoryRequirements2              = 0;
-    PFN_vkGetImageMemoryRequirements2KHR           vkGetImageMemoryRequirements2KHR           = 0;
-    PFN_vkGetImageSparseMemoryRequirements         vkGetImageSparseMemoryRequirements         = 0;
-    PFN_vkGetImageSparseMemoryRequirements2        vkGetImageSparseMemoryRequirements2        = 0;
-    PFN_vkGetImageSparseMemoryRequirements2KHR     vkGetImageSparseMemoryRequirements2KHR     = 0;
-    PFN_vkGetImageSubresourceLayout                vkGetImageSubresourceLayout                = 0;
-    PFN_vkGetImageViewAddressNVX                   vkGetImageViewAddressNVX                   = 0;
-    PFN_vkGetImageViewHandleNVX                    vkGetImageViewHandleNVX                    = 0;
-    PFN_vkGetInstanceProcAddr                      vkGetInstanceProcAddr                      = 0;
-#if defined( VK_USE_PLATFORM_ANDROID_KHR )
-    PFN_vkGetMemoryAndroidHardwareBufferANDROID vkGetMemoryAndroidHardwareBufferANDROID = 0;
-#else
-    PFN_dummy placeholder_dont_call_vkGetMemoryAndroidHardwareBufferANDROID           = 0;
-#endif /*VK_USE_PLATFORM_ANDROID_KHR*/
-    PFN_vkGetMemoryFdKHR                    vkGetMemoryFdKHR                    = 0;
-    PFN_vkGetMemoryFdPropertiesKHR          vkGetMemoryFdPropertiesKHR          = 0;
-    PFN_vkGetMemoryHostPointerPropertiesEXT vkGetMemoryHostPointerPropertiesEXT = 0;
-    PFN_vkGetMemoryRemoteAddressNV          vkGetMemoryRemoteAddressNV          = 0;
-#if defined( VK_USE_PLATFORM_WIN32_KHR )
-    PFN_vkGetMemoryWin32HandleKHR vkGetMemoryWin32HandleKHR = 0;
-#else
-    PFN_dummy placeholder_dont_call_vkGetMemoryWin32HandleKHR                         = 0;
-#endif /*VK_USE_PLATFORM_WIN32_KHR*/
-#if defined( VK_USE_PLATFORM_WIN32_KHR )
-    PFN_vkGetMemoryWin32HandleNV vkGetMemoryWin32HandleNV = 0;
-#else
-    PFN_dummy placeholder_dont_call_vkGetMemoryWin32HandleNV                          = 0;
-#endif /*VK_USE_PLATFORM_WIN32_KHR*/
-#if defined( VK_USE_PLATFORM_WIN32_KHR )
-    PFN_vkGetMemoryWin32HandlePropertiesKHR vkGetMemoryWin32HandlePropertiesKHR = 0;
-#else
-    PFN_dummy placeholder_dont_call_vkGetMemoryWin32HandlePropertiesKHR               = 0;
-#endif /*VK_USE_PLATFORM_WIN32_KHR*/
-#if defined( VK_USE_PLATFORM_FUCHSIA )
-    PFN_vkGetMemoryZirconHandleFUCHSIA vkGetMemoryZirconHandleFUCHSIA = 0;
-#else
-    PFN_dummy placeholder_dont_call_vkGetMemoryZirconHandleFUCHSIA                    = 0;
-#endif /*VK_USE_PLATFORM_FUCHSIA*/
-#if defined( VK_USE_PLATFORM_FUCHSIA )
-    PFN_vkGetMemoryZirconHandlePropertiesFUCHSIA vkGetMemoryZirconHandlePropertiesFUCHSIA = 0;
-#else
-    PFN_dummy placeholder_dont_call_vkGetMemoryZirconHandlePropertiesFUCHSIA          = 0;
-#endif /*VK_USE_PLATFORM_FUCHSIA*/
-    PFN_vkGetPastPresentationTimingGOOGLE                vkGetPastPresentationTimingGOOGLE                = 0;
-    PFN_vkGetPerformanceParameterINTEL                   vkGetPerformanceParameterINTEL                   = 0;
-    PFN_vkGetPhysicalDeviceCalibrateableTimeDomainsEXT   vkGetPhysicalDeviceCalibrateableTimeDomainsEXT   = 0;
-    PFN_vkGetPhysicalDeviceCooperativeMatrixPropertiesNV vkGetPhysicalDeviceCooperativeMatrixPropertiesNV = 0;
-#if defined( VK_USE_PLATFORM_DIRECTFB_EXT )
-    PFN_vkGetPhysicalDeviceDirectFBPresentationSupportEXT vkGetPhysicalDeviceDirectFBPresentationSupportEXT = 0;
-#else
-    PFN_dummy placeholder_dont_call_vkGetPhysicalDeviceDirectFBPresentationSupportEXT = 0;
-#endif /*VK_USE_PLATFORM_DIRECTFB_EXT*/
-    PFN_vkGetPhysicalDeviceDisplayPlaneProperties2KHR      vkGetPhysicalDeviceDisplayPlaneProperties2KHR      = 0;
-    PFN_vkGetPhysicalDeviceDisplayPlanePropertiesKHR       vkGetPhysicalDeviceDisplayPlanePropertiesKHR       = 0;
-    PFN_vkGetPhysicalDeviceDisplayProperties2KHR           vkGetPhysicalDeviceDisplayProperties2KHR           = 0;
-    PFN_vkGetPhysicalDeviceDisplayPropertiesKHR            vkGetPhysicalDeviceDisplayPropertiesKHR            = 0;
-    PFN_vkGetPhysicalDeviceExternalBufferProperties        vkGetPhysicalDeviceExternalBufferProperties        = 0;
-    PFN_vkGetPhysicalDeviceExternalBufferPropertiesKHR     vkGetPhysicalDeviceExternalBufferPropertiesKHR     = 0;
-    PFN_vkGetPhysicalDeviceExternalFenceProperties         vkGetPhysicalDeviceExternalFenceProperties         = 0;
-    PFN_vkGetPhysicalDeviceExternalFencePropertiesKHR      vkGetPhysicalDeviceExternalFencePropertiesKHR      = 0;
-    PFN_vkGetPhysicalDeviceExternalImageFormatPropertiesNV vkGetPhysicalDeviceExternalImageFormatPropertiesNV = 0;
-    PFN_vkGetPhysicalDeviceExternalSemaphoreProperties     vkGetPhysicalDeviceExternalSemaphoreProperties     = 0;
-    PFN_vkGetPhysicalDeviceExternalSemaphorePropertiesKHR  vkGetPhysicalDeviceExternalSemaphorePropertiesKHR  = 0;
-    PFN_vkGetPhysicalDeviceFeatures                        vkGetPhysicalDeviceFeatures                        = 0;
-    PFN_vkGetPhysicalDeviceFeatures2                       vkGetPhysicalDeviceFeatures2                       = 0;
-    PFN_vkGetPhysicalDeviceFeatures2KHR                    vkGetPhysicalDeviceFeatures2KHR                    = 0;
-    PFN_vkGetPhysicalDeviceFormatProperties                vkGetPhysicalDeviceFormatProperties                = 0;
-    PFN_vkGetPhysicalDeviceFormatProperties2               vkGetPhysicalDeviceFormatProperties2               = 0;
-    PFN_vkGetPhysicalDeviceFormatProperties2KHR            vkGetPhysicalDeviceFormatProperties2KHR            = 0;
-    PFN_vkGetPhysicalDeviceFragmentShadingRatesKHR         vkGetPhysicalDeviceFragmentShadingRatesKHR         = 0;
-    PFN_vkGetPhysicalDeviceImageFormatProperties           vkGetPhysicalDeviceImageFormatProperties           = 0;
-    PFN_vkGetPhysicalDeviceImageFormatProperties2          vkGetPhysicalDeviceImageFormatProperties2          = 0;
-    PFN_vkGetPhysicalDeviceImageFormatProperties2KHR       vkGetPhysicalDeviceImageFormatProperties2KHR       = 0;
-    PFN_vkGetPhysicalDeviceMemoryProperties                vkGetPhysicalDeviceMemoryProperties                = 0;
-    PFN_vkGetPhysicalDeviceMemoryProperties2               vkGetPhysicalDeviceMemoryProperties2               = 0;
-    PFN_vkGetPhysicalDeviceMemoryProperties2KHR            vkGetPhysicalDeviceMemoryProperties2KHR            = 0;
-    PFN_vkGetPhysicalDeviceMultisamplePropertiesEXT        vkGetPhysicalDeviceMultisamplePropertiesEXT        = 0;
-    PFN_vkGetPhysicalDevicePresentRectanglesKHR            vkGetPhysicalDevicePresentRectanglesKHR            = 0;
-    PFN_vkGetPhysicalDeviceProperties                      vkGetPhysicalDeviceProperties                      = 0;
-    PFN_vkGetPhysicalDeviceProperties2                     vkGetPhysicalDeviceProperties2                     = 0;
-    PFN_vkGetPhysicalDeviceProperties2KHR                  vkGetPhysicalDeviceProperties2KHR                  = 0;
-    PFN_vkGetPhysicalDeviceQueueFamilyPerformanceQueryPassesKHR
-                                                     vkGetPhysicalDeviceQueueFamilyPerformanceQueryPassesKHR = 0;
-    PFN_vkGetPhysicalDeviceQueueFamilyProperties     vkGetPhysicalDeviceQueueFamilyProperties                = 0;
-    PFN_vkGetPhysicalDeviceQueueFamilyProperties2    vkGetPhysicalDeviceQueueFamilyProperties2               = 0;
-    PFN_vkGetPhysicalDeviceQueueFamilyProperties2KHR vkGetPhysicalDeviceQueueFamilyProperties2KHR            = 0;
-#if defined( VK_USE_PLATFORM_SCREEN_QNX )
-    PFN_vkGetPhysicalDeviceScreenPresentationSupportQNX vkGetPhysicalDeviceScreenPresentationSupportQNX = 0;
-#else
-    PFN_dummy placeholder_dont_call_vkGetPhysicalDeviceScreenPresentationSupportQNX   = 0;
-#endif /*VK_USE_PLATFORM_SCREEN_QNX*/
-    PFN_vkGetPhysicalDeviceSparseImageFormatProperties     vkGetPhysicalDeviceSparseImageFormatProperties     = 0;
-    PFN_vkGetPhysicalDeviceSparseImageFormatProperties2    vkGetPhysicalDeviceSparseImageFormatProperties2    = 0;
-    PFN_vkGetPhysicalDeviceSparseImageFormatProperties2KHR vkGetPhysicalDeviceSparseImageFormatProperties2KHR = 0;
-    PFN_vkGetPhysicalDeviceSupportedFramebufferMixedSamplesCombinationsNV
-                                                   vkGetPhysicalDeviceSupportedFramebufferMixedSamplesCombinationsNV = 0;
-    PFN_vkGetPhysicalDeviceSurfaceCapabilities2EXT vkGetPhysicalDeviceSurfaceCapabilities2EXT = 0;
-    PFN_vkGetPhysicalDeviceSurfaceCapabilities2KHR vkGetPhysicalDeviceSurfaceCapabilities2KHR = 0;
-    PFN_vkGetPhysicalDeviceSurfaceCapabilitiesKHR  vkGetPhysicalDeviceSurfaceCapabilitiesKHR  = 0;
-    PFN_vkGetPhysicalDeviceSurfaceFormats2KHR      vkGetPhysicalDeviceSurfaceFormats2KHR      = 0;
-    PFN_vkGetPhysicalDeviceSurfaceFormatsKHR       vkGetPhysicalDeviceSurfaceFormatsKHR       = 0;
-#if defined( VK_USE_PLATFORM_WIN32_KHR )
-    PFN_vkGetPhysicalDeviceSurfacePresentModes2EXT vkGetPhysicalDeviceSurfacePresentModes2EXT = 0;
-#else
-    PFN_dummy placeholder_dont_call_vkGetPhysicalDeviceSurfacePresentModes2EXT        = 0;
-#endif /*VK_USE_PLATFORM_WIN32_KHR*/
-    PFN_vkGetPhysicalDeviceSurfacePresentModesKHR vkGetPhysicalDeviceSurfacePresentModesKHR = 0;
+    PFN_vkCreateSamplerYcbcrConversion                  vkCreateSamplerYcbcrConversion                  = 0;
+    PFN_vkDestroySamplerYcbcrConversion                 vkDestroySamplerYcbcrConversion                 = 0;
+    PFN_vkCreateDescriptorUpdateTemplate                vkCreateDescriptorUpdateTemplate                = 0;
+    PFN_vkDestroyDescriptorUpdateTemplate               vkDestroyDescriptorUpdateTemplate               = 0;
+    PFN_vkUpdateDescriptorSetWithTemplate               vkUpdateDescriptorSetWithTemplate               = 0;
+    PFN_vkGetPhysicalDeviceExternalBufferProperties     vkGetPhysicalDeviceExternalBufferProperties     = 0;
+    PFN_vkGetPhysicalDeviceExternalFenceProperties      vkGetPhysicalDeviceExternalFenceProperties      = 0;
+    PFN_vkGetPhysicalDeviceExternalSemaphoreProperties  vkGetPhysicalDeviceExternalSemaphoreProperties  = 0;
+    PFN_vkGetDescriptorSetLayoutSupport                 vkGetDescriptorSetLayoutSupport                 = 0;
+
+    //=== VK_VERSION_1_2 ===
+    PFN_vkCmdDrawIndirectCount                vkCmdDrawIndirectCount                = 0;
+    PFN_vkCmdDrawIndexedIndirectCount         vkCmdDrawIndexedIndirectCount         = 0;
+    PFN_vkCreateRenderPass2                   vkCreateRenderPass2                   = 0;
+    PFN_vkCmdBeginRenderPass2                 vkCmdBeginRenderPass2                 = 0;
+    PFN_vkCmdNextSubpass2                     vkCmdNextSubpass2                     = 0;
+    PFN_vkCmdEndRenderPass2                   vkCmdEndRenderPass2                   = 0;
+    PFN_vkResetQueryPool                      vkResetQueryPool                      = 0;
+    PFN_vkGetSemaphoreCounterValue            vkGetSemaphoreCounterValue            = 0;
+    PFN_vkWaitSemaphores                      vkWaitSemaphores                      = 0;
+    PFN_vkSignalSemaphore                     vkSignalSemaphore                     = 0;
+    PFN_vkGetBufferDeviceAddress              vkGetBufferDeviceAddress              = 0;
+    PFN_vkGetBufferOpaqueCaptureAddress       vkGetBufferOpaqueCaptureAddress       = 0;
+    PFN_vkGetDeviceMemoryOpaqueCaptureAddress vkGetDeviceMemoryOpaqueCaptureAddress = 0;
+
+    //=== VK_KHR_surface ===
+    PFN_vkDestroySurfaceKHR                       vkDestroySurfaceKHR                       = 0;
     PFN_vkGetPhysicalDeviceSurfaceSupportKHR      vkGetPhysicalDeviceSurfaceSupportKHR      = 0;
-    PFN_vkGetPhysicalDeviceToolPropertiesEXT      vkGetPhysicalDeviceToolPropertiesEXT      = 0;
-#if defined( VK_ENABLE_BETA_EXTENSIONS )
-    PFN_vkGetPhysicalDeviceVideoCapabilitiesKHR vkGetPhysicalDeviceVideoCapabilitiesKHR = 0;
-#else
-    PFN_dummy placeholder_dont_call_vkGetPhysicalDeviceVideoCapabilitiesKHR           = 0;
-#endif /*VK_ENABLE_BETA_EXTENSIONS*/
-#if defined( VK_ENABLE_BETA_EXTENSIONS )
-    PFN_vkGetPhysicalDeviceVideoFormatPropertiesKHR vkGetPhysicalDeviceVideoFormatPropertiesKHR = 0;
-#else
-    PFN_dummy placeholder_dont_call_vkGetPhysicalDeviceVideoFormatPropertiesKHR       = 0;
-#endif /*VK_ENABLE_BETA_EXTENSIONS*/
-#if defined( VK_USE_PLATFORM_WAYLAND_KHR )
-    PFN_vkGetPhysicalDeviceWaylandPresentationSupportKHR vkGetPhysicalDeviceWaylandPresentationSupportKHR = 0;
-#else
-    PFN_dummy placeholder_dont_call_vkGetPhysicalDeviceWaylandPresentationSupportKHR  = 0;
-#endif /*VK_USE_PLATFORM_WAYLAND_KHR*/
-#if defined( VK_USE_PLATFORM_WIN32_KHR )
-    PFN_vkGetPhysicalDeviceWin32PresentationSupportKHR vkGetPhysicalDeviceWin32PresentationSupportKHR = 0;
-#else
-    PFN_dummy placeholder_dont_call_vkGetPhysicalDeviceWin32PresentationSupportKHR    = 0;
-#endif /*VK_USE_PLATFORM_WIN32_KHR*/
-#if defined( VK_USE_PLATFORM_XCB_KHR )
-    PFN_vkGetPhysicalDeviceXcbPresentationSupportKHR vkGetPhysicalDeviceXcbPresentationSupportKHR = 0;
-#else
-    PFN_dummy placeholder_dont_call_vkGetPhysicalDeviceXcbPresentationSupportKHR      = 0;
-#endif /*VK_USE_PLATFORM_XCB_KHR*/
+    PFN_vkGetPhysicalDeviceSurfaceCapabilitiesKHR vkGetPhysicalDeviceSurfaceCapabilitiesKHR = 0;
+    PFN_vkGetPhysicalDeviceSurfaceFormatsKHR      vkGetPhysicalDeviceSurfaceFormatsKHR      = 0;
+    PFN_vkGetPhysicalDeviceSurfacePresentModesKHR vkGetPhysicalDeviceSurfacePresentModesKHR = 0;
+
+    //=== VK_KHR_swapchain ===
+    PFN_vkCreateSwapchainKHR                    vkCreateSwapchainKHR                    = 0;
+    PFN_vkDestroySwapchainKHR                   vkDestroySwapchainKHR                   = 0;
+    PFN_vkGetSwapchainImagesKHR                 vkGetSwapchainImagesKHR                 = 0;
+    PFN_vkAcquireNextImageKHR                   vkAcquireNextImageKHR                   = 0;
+    PFN_vkQueuePresentKHR                       vkQueuePresentKHR                       = 0;
+    PFN_vkGetDeviceGroupPresentCapabilitiesKHR  vkGetDeviceGroupPresentCapabilitiesKHR  = 0;
+    PFN_vkGetDeviceGroupSurfacePresentModesKHR  vkGetDeviceGroupSurfacePresentModesKHR  = 0;
+    PFN_vkGetPhysicalDevicePresentRectanglesKHR vkGetPhysicalDevicePresentRectanglesKHR = 0;
+    PFN_vkAcquireNextImage2KHR                  vkAcquireNextImage2KHR                  = 0;
+
+    //=== VK_KHR_display ===
+    PFN_vkGetPhysicalDeviceDisplayPropertiesKHR      vkGetPhysicalDeviceDisplayPropertiesKHR      = 0;
+    PFN_vkGetPhysicalDeviceDisplayPlanePropertiesKHR vkGetPhysicalDeviceDisplayPlanePropertiesKHR = 0;
+    PFN_vkGetDisplayPlaneSupportedDisplaysKHR        vkGetDisplayPlaneSupportedDisplaysKHR        = 0;
+    PFN_vkGetDisplayModePropertiesKHR                vkGetDisplayModePropertiesKHR                = 0;
+    PFN_vkCreateDisplayModeKHR                       vkCreateDisplayModeKHR                       = 0;
+    PFN_vkGetDisplayPlaneCapabilitiesKHR             vkGetDisplayPlaneCapabilitiesKHR             = 0;
+    PFN_vkCreateDisplayPlaneSurfaceKHR               vkCreateDisplayPlaneSurfaceKHR               = 0;
+
+    //=== VK_KHR_display_swapchain ===
+    PFN_vkCreateSharedSwapchainsKHR vkCreateSharedSwapchainsKHR = 0;
+
 #if defined( VK_USE_PLATFORM_XLIB_KHR )
+    //=== VK_KHR_xlib_surface ===
+    PFN_vkCreateXlibSurfaceKHR                        vkCreateXlibSurfaceKHR                        = 0;
     PFN_vkGetPhysicalDeviceXlibPresentationSupportKHR vkGetPhysicalDeviceXlibPresentationSupportKHR = 0;
 #else
-    PFN_dummy placeholder_dont_call_vkGetPhysicalDeviceXlibPresentationSupportKHR     = 0;
+    PFN_dummy vkCreateXlibSurfaceKHR_placeholder                            = 0;
+    PFN_dummy vkGetPhysicalDeviceXlibPresentationSupportKHR_placeholder     = 0;
 #endif /*VK_USE_PLATFORM_XLIB_KHR*/
-    PFN_vkGetPipelineCacheData                            vkGetPipelineCacheData                            = 0;
-    PFN_vkGetPipelineExecutableInternalRepresentationsKHR vkGetPipelineExecutableInternalRepresentationsKHR = 0;
-    PFN_vkGetPipelineExecutablePropertiesKHR              vkGetPipelineExecutablePropertiesKHR              = 0;
-    PFN_vkGetPipelineExecutableStatisticsKHR              vkGetPipelineExecutableStatisticsKHR              = 0;
-    PFN_vkGetPrivateDataEXT                               vkGetPrivateDataEXT                               = 0;
-    PFN_vkGetQueryPoolResults                             vkGetQueryPoolResults                             = 0;
-    PFN_vkGetQueueCheckpointData2NV                       vkGetQueueCheckpointData2NV                       = 0;
-    PFN_vkGetQueueCheckpointDataNV                        vkGetQueueCheckpointDataNV                        = 0;
+
+#if defined( VK_USE_PLATFORM_XCB_KHR )
+    //=== VK_KHR_xcb_surface ===
+    PFN_vkCreateXcbSurfaceKHR                        vkCreateXcbSurfaceKHR                        = 0;
+    PFN_vkGetPhysicalDeviceXcbPresentationSupportKHR vkGetPhysicalDeviceXcbPresentationSupportKHR = 0;
+#else
+    PFN_dummy vkCreateXcbSurfaceKHR_placeholder                             = 0;
+    PFN_dummy vkGetPhysicalDeviceXcbPresentationSupportKHR_placeholder      = 0;
+#endif /*VK_USE_PLATFORM_XCB_KHR*/
+
+#if defined( VK_USE_PLATFORM_WAYLAND_KHR )
+    //=== VK_KHR_wayland_surface ===
+    PFN_vkCreateWaylandSurfaceKHR                        vkCreateWaylandSurfaceKHR                        = 0;
+    PFN_vkGetPhysicalDeviceWaylandPresentationSupportKHR vkGetPhysicalDeviceWaylandPresentationSupportKHR = 0;
+#else
+    PFN_dummy vkCreateWaylandSurfaceKHR_placeholder                         = 0;
+    PFN_dummy vkGetPhysicalDeviceWaylandPresentationSupportKHR_placeholder  = 0;
+#endif /*VK_USE_PLATFORM_WAYLAND_KHR*/
+
+#if defined( VK_USE_PLATFORM_ANDROID_KHR )
+    //=== VK_KHR_android_surface ===
+    PFN_vkCreateAndroidSurfaceKHR vkCreateAndroidSurfaceKHR = 0;
+#else
+    PFN_dummy vkCreateAndroidSurfaceKHR_placeholder                         = 0;
+#endif /*VK_USE_PLATFORM_ANDROID_KHR*/
+
+#if defined( VK_USE_PLATFORM_WIN32_KHR )
+    //=== VK_KHR_win32_surface ===
+    PFN_vkCreateWin32SurfaceKHR                        vkCreateWin32SurfaceKHR                        = 0;
+    PFN_vkGetPhysicalDeviceWin32PresentationSupportKHR vkGetPhysicalDeviceWin32PresentationSupportKHR = 0;
+#else
+    PFN_dummy vkCreateWin32SurfaceKHR_placeholder                           = 0;
+    PFN_dummy vkGetPhysicalDeviceWin32PresentationSupportKHR_placeholder    = 0;
+#endif /*VK_USE_PLATFORM_WIN32_KHR*/
+
+    //=== VK_EXT_debug_report ===
+    PFN_vkCreateDebugReportCallbackEXT  vkCreateDebugReportCallbackEXT  = 0;
+    PFN_vkDestroyDebugReportCallbackEXT vkDestroyDebugReportCallbackEXT = 0;
+    PFN_vkDebugReportMessageEXT         vkDebugReportMessageEXT         = 0;
+
+    //=== VK_EXT_debug_marker ===
+    PFN_vkDebugMarkerSetObjectTagEXT  vkDebugMarkerSetObjectTagEXT  = 0;
+    PFN_vkDebugMarkerSetObjectNameEXT vkDebugMarkerSetObjectNameEXT = 0;
+    PFN_vkCmdDebugMarkerBeginEXT      vkCmdDebugMarkerBeginEXT      = 0;
+    PFN_vkCmdDebugMarkerEndEXT        vkCmdDebugMarkerEndEXT        = 0;
+    PFN_vkCmdDebugMarkerInsertEXT     vkCmdDebugMarkerInsertEXT     = 0;
+
+#if defined( VK_ENABLE_BETA_EXTENSIONS )
+    //=== VK_KHR_video_queue ===
+    PFN_vkGetPhysicalDeviceVideoCapabilitiesKHR     vkGetPhysicalDeviceVideoCapabilitiesKHR     = 0;
+    PFN_vkGetPhysicalDeviceVideoFormatPropertiesKHR vkGetPhysicalDeviceVideoFormatPropertiesKHR = 0;
+    PFN_vkCreateVideoSessionKHR                     vkCreateVideoSessionKHR                     = 0;
+    PFN_vkDestroyVideoSessionKHR                    vkDestroyVideoSessionKHR                    = 0;
+    PFN_vkGetVideoSessionMemoryRequirementsKHR      vkGetVideoSessionMemoryRequirementsKHR      = 0;
+    PFN_vkBindVideoSessionMemoryKHR                 vkBindVideoSessionMemoryKHR                 = 0;
+    PFN_vkCreateVideoSessionParametersKHR           vkCreateVideoSessionParametersKHR           = 0;
+    PFN_vkUpdateVideoSessionParametersKHR           vkUpdateVideoSessionParametersKHR           = 0;
+    PFN_vkDestroyVideoSessionParametersKHR          vkDestroyVideoSessionParametersKHR          = 0;
+    PFN_vkCmdBeginVideoCodingKHR                    vkCmdBeginVideoCodingKHR                    = 0;
+    PFN_vkCmdEndVideoCodingKHR                      vkCmdEndVideoCodingKHR                      = 0;
+    PFN_vkCmdControlVideoCodingKHR                  vkCmdControlVideoCodingKHR                  = 0;
+#else
+    PFN_dummy vkGetPhysicalDeviceVideoCapabilitiesKHR_placeholder           = 0;
+    PFN_dummy vkGetPhysicalDeviceVideoFormatPropertiesKHR_placeholder       = 0;
+    PFN_dummy vkCreateVideoSessionKHR_placeholder                           = 0;
+    PFN_dummy vkDestroyVideoSessionKHR_placeholder                          = 0;
+    PFN_dummy vkGetVideoSessionMemoryRequirementsKHR_placeholder            = 0;
+    PFN_dummy vkBindVideoSessionMemoryKHR_placeholder                       = 0;
+    PFN_dummy vkCreateVideoSessionParametersKHR_placeholder                 = 0;
+    PFN_dummy vkUpdateVideoSessionParametersKHR_placeholder                 = 0;
+    PFN_dummy vkDestroyVideoSessionParametersKHR_placeholder                = 0;
+    PFN_dummy vkCmdBeginVideoCodingKHR_placeholder                          = 0;
+    PFN_dummy vkCmdEndVideoCodingKHR_placeholder                            = 0;
+    PFN_dummy vkCmdControlVideoCodingKHR_placeholder                        = 0;
+#endif /*VK_ENABLE_BETA_EXTENSIONS*/
+
+#if defined( VK_ENABLE_BETA_EXTENSIONS )
+    //=== VK_KHR_video_decode_queue ===
+    PFN_vkCmdDecodeVideoKHR vkCmdDecodeVideoKHR = 0;
+#else
+    PFN_dummy vkCmdDecodeVideoKHR_placeholder                               = 0;
+#endif /*VK_ENABLE_BETA_EXTENSIONS*/
+
+    //=== VK_EXT_transform_feedback ===
+    PFN_vkCmdBindTransformFeedbackBuffersEXT vkCmdBindTransformFeedbackBuffersEXT = 0;
+    PFN_vkCmdBeginTransformFeedbackEXT       vkCmdBeginTransformFeedbackEXT       = 0;
+    PFN_vkCmdEndTransformFeedbackEXT         vkCmdEndTransformFeedbackEXT         = 0;
+    PFN_vkCmdBeginQueryIndexedEXT            vkCmdBeginQueryIndexedEXT            = 0;
+    PFN_vkCmdEndQueryIndexedEXT              vkCmdEndQueryIndexedEXT              = 0;
+    PFN_vkCmdDrawIndirectByteCountEXT        vkCmdDrawIndirectByteCountEXT        = 0;
+
+    //=== VK_NVX_binary_import ===
+    PFN_vkCreateCuModuleNVX    vkCreateCuModuleNVX    = 0;
+    PFN_vkCreateCuFunctionNVX  vkCreateCuFunctionNVX  = 0;
+    PFN_vkDestroyCuModuleNVX   vkDestroyCuModuleNVX   = 0;
+    PFN_vkDestroyCuFunctionNVX vkDestroyCuFunctionNVX = 0;
+    PFN_vkCmdCuLaunchKernelNVX vkCmdCuLaunchKernelNVX = 0;
+
+    //=== VK_NVX_image_view_handle ===
+    PFN_vkGetImageViewHandleNVX  vkGetImageViewHandleNVX  = 0;
+    PFN_vkGetImageViewAddressNVX vkGetImageViewAddressNVX = 0;
+
+    //=== VK_AMD_draw_indirect_count ===
+    PFN_vkCmdDrawIndirectCountAMD        vkCmdDrawIndirectCountAMD        = 0;
+    PFN_vkCmdDrawIndexedIndirectCountAMD vkCmdDrawIndexedIndirectCountAMD = 0;
+
+    //=== VK_AMD_shader_info ===
+    PFN_vkGetShaderInfoAMD vkGetShaderInfoAMD = 0;
+
+#if defined( VK_USE_PLATFORM_GGP )
+    //=== VK_GGP_stream_descriptor_surface ===
+    PFN_vkCreateStreamDescriptorSurfaceGGP vkCreateStreamDescriptorSurfaceGGP = 0;
+#else
+    PFN_dummy vkCreateStreamDescriptorSurfaceGGP_placeholder                = 0;
+#endif /*VK_USE_PLATFORM_GGP*/
+
+    //=== VK_NV_external_memory_capabilities ===
+    PFN_vkGetPhysicalDeviceExternalImageFormatPropertiesNV vkGetPhysicalDeviceExternalImageFormatPropertiesNV = 0;
+
+#if defined( VK_USE_PLATFORM_WIN32_KHR )
+    //=== VK_NV_external_memory_win32 ===
+    PFN_vkGetMemoryWin32HandleNV vkGetMemoryWin32HandleNV = 0;
+#else
+    PFN_dummy vkGetMemoryWin32HandleNV_placeholder                          = 0;
+#endif /*VK_USE_PLATFORM_WIN32_KHR*/
+
+    //=== VK_KHR_get_physical_device_properties2 ===
+    PFN_vkGetPhysicalDeviceFeatures2KHR                    vkGetPhysicalDeviceFeatures2KHR                    = 0;
+    PFN_vkGetPhysicalDeviceProperties2KHR                  vkGetPhysicalDeviceProperties2KHR                  = 0;
+    PFN_vkGetPhysicalDeviceFormatProperties2KHR            vkGetPhysicalDeviceFormatProperties2KHR            = 0;
+    PFN_vkGetPhysicalDeviceImageFormatProperties2KHR       vkGetPhysicalDeviceImageFormatProperties2KHR       = 0;
+    PFN_vkGetPhysicalDeviceQueueFamilyProperties2KHR       vkGetPhysicalDeviceQueueFamilyProperties2KHR       = 0;
+    PFN_vkGetPhysicalDeviceMemoryProperties2KHR            vkGetPhysicalDeviceMemoryProperties2KHR            = 0;
+    PFN_vkGetPhysicalDeviceSparseImageFormatProperties2KHR vkGetPhysicalDeviceSparseImageFormatProperties2KHR = 0;
+
+    //=== VK_KHR_device_group ===
+    PFN_vkGetDeviceGroupPeerMemoryFeaturesKHR vkGetDeviceGroupPeerMemoryFeaturesKHR = 0;
+    PFN_vkCmdSetDeviceMaskKHR                 vkCmdSetDeviceMaskKHR                 = 0;
+    PFN_vkCmdDispatchBaseKHR                  vkCmdDispatchBaseKHR                  = 0;
+
+#if defined( VK_USE_PLATFORM_VI_NN )
+    //=== VK_NN_vi_surface ===
+    PFN_vkCreateViSurfaceNN vkCreateViSurfaceNN = 0;
+#else
+    PFN_dummy vkCreateViSurfaceNN_placeholder                               = 0;
+#endif /*VK_USE_PLATFORM_VI_NN*/
+
+    //=== VK_KHR_maintenance1 ===
+    PFN_vkTrimCommandPoolKHR vkTrimCommandPoolKHR = 0;
+
+    //=== VK_KHR_device_group_creation ===
+    PFN_vkEnumeratePhysicalDeviceGroupsKHR vkEnumeratePhysicalDeviceGroupsKHR = 0;
+
+    //=== VK_KHR_external_memory_capabilities ===
+    PFN_vkGetPhysicalDeviceExternalBufferPropertiesKHR vkGetPhysicalDeviceExternalBufferPropertiesKHR = 0;
+
+#if defined( VK_USE_PLATFORM_WIN32_KHR )
+    //=== VK_KHR_external_memory_win32 ===
+    PFN_vkGetMemoryWin32HandleKHR           vkGetMemoryWin32HandleKHR           = 0;
+    PFN_vkGetMemoryWin32HandlePropertiesKHR vkGetMemoryWin32HandlePropertiesKHR = 0;
+#else
+    PFN_dummy vkGetMemoryWin32HandleKHR_placeholder                         = 0;
+    PFN_dummy vkGetMemoryWin32HandlePropertiesKHR_placeholder               = 0;
+#endif /*VK_USE_PLATFORM_WIN32_KHR*/
+
+    //=== VK_KHR_external_memory_fd ===
+    PFN_vkGetMemoryFdKHR           vkGetMemoryFdKHR           = 0;
+    PFN_vkGetMemoryFdPropertiesKHR vkGetMemoryFdPropertiesKHR = 0;
+
+    //=== VK_KHR_external_semaphore_capabilities ===
+    PFN_vkGetPhysicalDeviceExternalSemaphorePropertiesKHR vkGetPhysicalDeviceExternalSemaphorePropertiesKHR = 0;
+
+#if defined( VK_USE_PLATFORM_WIN32_KHR )
+    //=== VK_KHR_external_semaphore_win32 ===
+    PFN_vkImportSemaphoreWin32HandleKHR vkImportSemaphoreWin32HandleKHR = 0;
+    PFN_vkGetSemaphoreWin32HandleKHR    vkGetSemaphoreWin32HandleKHR    = 0;
+#else
+    PFN_dummy vkImportSemaphoreWin32HandleKHR_placeholder                   = 0;
+    PFN_dummy vkGetSemaphoreWin32HandleKHR_placeholder                      = 0;
+#endif /*VK_USE_PLATFORM_WIN32_KHR*/
+
+    //=== VK_KHR_external_semaphore_fd ===
+    PFN_vkImportSemaphoreFdKHR vkImportSemaphoreFdKHR = 0;
+    PFN_vkGetSemaphoreFdKHR    vkGetSemaphoreFdKHR    = 0;
+
+    //=== VK_KHR_push_descriptor ===
+    PFN_vkCmdPushDescriptorSetKHR             vkCmdPushDescriptorSetKHR             = 0;
+    PFN_vkCmdPushDescriptorSetWithTemplateKHR vkCmdPushDescriptorSetWithTemplateKHR = 0;
+
+    //=== VK_EXT_conditional_rendering ===
+    PFN_vkCmdBeginConditionalRenderingEXT vkCmdBeginConditionalRenderingEXT = 0;
+    PFN_vkCmdEndConditionalRenderingEXT   vkCmdEndConditionalRenderingEXT   = 0;
+
+    //=== VK_KHR_descriptor_update_template ===
+    PFN_vkCreateDescriptorUpdateTemplateKHR  vkCreateDescriptorUpdateTemplateKHR  = 0;
+    PFN_vkDestroyDescriptorUpdateTemplateKHR vkDestroyDescriptorUpdateTemplateKHR = 0;
+    PFN_vkUpdateDescriptorSetWithTemplateKHR vkUpdateDescriptorSetWithTemplateKHR = 0;
+
+    //=== VK_NV_clip_space_w_scaling ===
+    PFN_vkCmdSetViewportWScalingNV vkCmdSetViewportWScalingNV = 0;
+
+    //=== VK_EXT_direct_mode_display ===
+    PFN_vkReleaseDisplayEXT vkReleaseDisplayEXT = 0;
+
 #if defined( VK_USE_PLATFORM_XLIB_XRANDR_EXT )
+    //=== VK_EXT_acquire_xlib_display ===
+    PFN_vkAcquireXlibDisplayEXT    vkAcquireXlibDisplayEXT    = 0;
     PFN_vkGetRandROutputDisplayEXT vkGetRandROutputDisplayEXT = 0;
 #else
-    PFN_dummy placeholder_dont_call_vkGetRandROutputDisplayEXT                        = 0;
+    PFN_dummy vkAcquireXlibDisplayEXT_placeholder                           = 0;
+    PFN_dummy vkGetRandROutputDisplayEXT_placeholder                        = 0;
 #endif /*VK_USE_PLATFORM_XLIB_XRANDR_EXT*/
-    PFN_vkGetRayTracingCaptureReplayShaderGroupHandlesKHR vkGetRayTracingCaptureReplayShaderGroupHandlesKHR = 0;
-    PFN_vkGetRayTracingShaderGroupHandlesKHR              vkGetRayTracingShaderGroupHandlesKHR              = 0;
-    PFN_vkGetRayTracingShaderGroupHandlesNV               vkGetRayTracingShaderGroupHandlesNV               = 0;
-    PFN_vkGetRayTracingShaderGroupStackSizeKHR            vkGetRayTracingShaderGroupStackSizeKHR            = 0;
-    PFN_vkGetRefreshCycleDurationGOOGLE                   vkGetRefreshCycleDurationGOOGLE                   = 0;
-    PFN_vkGetRenderAreaGranularity                        vkGetRenderAreaGranularity                        = 0;
-    PFN_vkGetSemaphoreCounterValue                        vkGetSemaphoreCounterValue                        = 0;
-    PFN_vkGetSemaphoreCounterValueKHR                     vkGetSemaphoreCounterValueKHR                     = 0;
-    PFN_vkGetSemaphoreFdKHR                               vkGetSemaphoreFdKHR                               = 0;
+
+    //=== VK_EXT_display_surface_counter ===
+    PFN_vkGetPhysicalDeviceSurfaceCapabilities2EXT vkGetPhysicalDeviceSurfaceCapabilities2EXT = 0;
+
+    //=== VK_EXT_display_control ===
+    PFN_vkDisplayPowerControlEXT  vkDisplayPowerControlEXT  = 0;
+    PFN_vkRegisterDeviceEventEXT  vkRegisterDeviceEventEXT  = 0;
+    PFN_vkRegisterDisplayEventEXT vkRegisterDisplayEventEXT = 0;
+    PFN_vkGetSwapchainCounterEXT  vkGetSwapchainCounterEXT  = 0;
+
+    //=== VK_GOOGLE_display_timing ===
+    PFN_vkGetRefreshCycleDurationGOOGLE   vkGetRefreshCycleDurationGOOGLE   = 0;
+    PFN_vkGetPastPresentationTimingGOOGLE vkGetPastPresentationTimingGOOGLE = 0;
+
+    //=== VK_EXT_discard_rectangles ===
+    PFN_vkCmdSetDiscardRectangleEXT vkCmdSetDiscardRectangleEXT = 0;
+
+    //=== VK_EXT_hdr_metadata ===
+    PFN_vkSetHdrMetadataEXT vkSetHdrMetadataEXT = 0;
+
+    //=== VK_KHR_create_renderpass2 ===
+    PFN_vkCreateRenderPass2KHR   vkCreateRenderPass2KHR   = 0;
+    PFN_vkCmdBeginRenderPass2KHR vkCmdBeginRenderPass2KHR = 0;
+    PFN_vkCmdNextSubpass2KHR     vkCmdNextSubpass2KHR     = 0;
+    PFN_vkCmdEndRenderPass2KHR   vkCmdEndRenderPass2KHR   = 0;
+
+    //=== VK_KHR_shared_presentable_image ===
+    PFN_vkGetSwapchainStatusKHR vkGetSwapchainStatusKHR = 0;
+
+    //=== VK_KHR_external_fence_capabilities ===
+    PFN_vkGetPhysicalDeviceExternalFencePropertiesKHR vkGetPhysicalDeviceExternalFencePropertiesKHR = 0;
+
 #if defined( VK_USE_PLATFORM_WIN32_KHR )
-    PFN_vkGetSemaphoreWin32HandleKHR vkGetSemaphoreWin32HandleKHR = 0;
-#else
-    PFN_dummy placeholder_dont_call_vkGetSemaphoreWin32HandleKHR                      = 0;
-#endif /*VK_USE_PLATFORM_WIN32_KHR*/
-#if defined( VK_USE_PLATFORM_FUCHSIA )
-    PFN_vkGetSemaphoreZirconHandleFUCHSIA vkGetSemaphoreZirconHandleFUCHSIA = 0;
-#else
-    PFN_dummy placeholder_dont_call_vkGetSemaphoreZirconHandleFUCHSIA                 = 0;
-#endif /*VK_USE_PLATFORM_FUCHSIA*/
-    PFN_vkGetShaderInfoAMD          vkGetShaderInfoAMD          = 0;
-    PFN_vkGetSwapchainCounterEXT    vkGetSwapchainCounterEXT    = 0;
-    PFN_vkGetSwapchainImagesKHR     vkGetSwapchainImagesKHR     = 0;
-    PFN_vkGetSwapchainStatusKHR     vkGetSwapchainStatusKHR     = 0;
-    PFN_vkGetValidationCacheDataEXT vkGetValidationCacheDataEXT = 0;
-#if defined( VK_ENABLE_BETA_EXTENSIONS )
-    PFN_vkGetVideoSessionMemoryRequirementsKHR vkGetVideoSessionMemoryRequirementsKHR = 0;
-#else
-    PFN_dummy placeholder_dont_call_vkGetVideoSessionMemoryRequirementsKHR            = 0;
-#endif /*VK_ENABLE_BETA_EXTENSIONS*/
-#if defined( VK_USE_PLATFORM_WIN32_KHR )
-    PFN_vkGetWinrtDisplayNV vkGetWinrtDisplayNV = 0;
-#else
-    PFN_dummy placeholder_dont_call_vkGetWinrtDisplayNV                               = 0;
-#endif /*VK_USE_PLATFORM_WIN32_KHR*/
-    PFN_vkImportFenceFdKHR vkImportFenceFdKHR = 0;
-#if defined( VK_USE_PLATFORM_WIN32_KHR )
+    //=== VK_KHR_external_fence_win32 ===
     PFN_vkImportFenceWin32HandleKHR vkImportFenceWin32HandleKHR = 0;
+    PFN_vkGetFenceWin32HandleKHR    vkGetFenceWin32HandleKHR    = 0;
 #else
-    PFN_dummy placeholder_dont_call_vkImportFenceWin32HandleKHR                       = 0;
+    PFN_dummy vkImportFenceWin32HandleKHR_placeholder                       = 0;
+    PFN_dummy vkGetFenceWin32HandleKHR_placeholder                          = 0;
 #endif /*VK_USE_PLATFORM_WIN32_KHR*/
-    PFN_vkImportSemaphoreFdKHR vkImportSemaphoreFdKHR = 0;
-#if defined( VK_USE_PLATFORM_WIN32_KHR )
-    PFN_vkImportSemaphoreWin32HandleKHR vkImportSemaphoreWin32HandleKHR = 0;
+
+    //=== VK_KHR_external_fence_fd ===
+    PFN_vkImportFenceFdKHR vkImportFenceFdKHR = 0;
+    PFN_vkGetFenceFdKHR    vkGetFenceFdKHR    = 0;
+
+    //=== VK_KHR_performance_query ===
+    PFN_vkEnumeratePhysicalDeviceQueueFamilyPerformanceQueryCountersKHR
+      vkEnumeratePhysicalDeviceQueueFamilyPerformanceQueryCountersKHR = 0;
+    PFN_vkGetPhysicalDeviceQueueFamilyPerformanceQueryPassesKHR
+                                  vkGetPhysicalDeviceQueueFamilyPerformanceQueryPassesKHR = 0;
+    PFN_vkAcquireProfilingLockKHR vkAcquireProfilingLockKHR                               = 0;
+    PFN_vkReleaseProfilingLockKHR vkReleaseProfilingLockKHR                               = 0;
+
+    //=== VK_KHR_get_surface_capabilities2 ===
+    PFN_vkGetPhysicalDeviceSurfaceCapabilities2KHR vkGetPhysicalDeviceSurfaceCapabilities2KHR = 0;
+    PFN_vkGetPhysicalDeviceSurfaceFormats2KHR      vkGetPhysicalDeviceSurfaceFormats2KHR      = 0;
+
+    //=== VK_KHR_get_display_properties2 ===
+    PFN_vkGetPhysicalDeviceDisplayProperties2KHR      vkGetPhysicalDeviceDisplayProperties2KHR      = 0;
+    PFN_vkGetPhysicalDeviceDisplayPlaneProperties2KHR vkGetPhysicalDeviceDisplayPlaneProperties2KHR = 0;
+    PFN_vkGetDisplayModeProperties2KHR                vkGetDisplayModeProperties2KHR                = 0;
+    PFN_vkGetDisplayPlaneCapabilities2KHR             vkGetDisplayPlaneCapabilities2KHR             = 0;
+
+#if defined( VK_USE_PLATFORM_IOS_MVK )
+    //=== VK_MVK_ios_surface ===
+    PFN_vkCreateIOSSurfaceMVK vkCreateIOSSurfaceMVK = 0;
 #else
-    PFN_dummy placeholder_dont_call_vkImportSemaphoreWin32HandleKHR                   = 0;
-#endif /*VK_USE_PLATFORM_WIN32_KHR*/
-#if defined( VK_USE_PLATFORM_FUCHSIA )
-    PFN_vkImportSemaphoreZirconHandleFUCHSIA vkImportSemaphoreZirconHandleFUCHSIA = 0;
+    PFN_dummy vkCreateIOSSurfaceMVK_placeholder                             = 0;
+#endif /*VK_USE_PLATFORM_IOS_MVK*/
+
+#if defined( VK_USE_PLATFORM_MACOS_MVK )
+    //=== VK_MVK_macos_surface ===
+    PFN_vkCreateMacOSSurfaceMVK vkCreateMacOSSurfaceMVK = 0;
 #else
-    PFN_dummy placeholder_dont_call_vkImportSemaphoreZirconHandleFUCHSIA              = 0;
-#endif /*VK_USE_PLATFORM_FUCHSIA*/
+    PFN_dummy vkCreateMacOSSurfaceMVK_placeholder                           = 0;
+#endif /*VK_USE_PLATFORM_MACOS_MVK*/
+
+    //=== VK_EXT_debug_utils ===
+    PFN_vkSetDebugUtilsObjectNameEXT    vkSetDebugUtilsObjectNameEXT    = 0;
+    PFN_vkSetDebugUtilsObjectTagEXT     vkSetDebugUtilsObjectTagEXT     = 0;
+    PFN_vkQueueBeginDebugUtilsLabelEXT  vkQueueBeginDebugUtilsLabelEXT  = 0;
+    PFN_vkQueueEndDebugUtilsLabelEXT    vkQueueEndDebugUtilsLabelEXT    = 0;
+    PFN_vkQueueInsertDebugUtilsLabelEXT vkQueueInsertDebugUtilsLabelEXT = 0;
+    PFN_vkCmdBeginDebugUtilsLabelEXT    vkCmdBeginDebugUtilsLabelEXT    = 0;
+    PFN_vkCmdEndDebugUtilsLabelEXT      vkCmdEndDebugUtilsLabelEXT      = 0;
+    PFN_vkCmdInsertDebugUtilsLabelEXT   vkCmdInsertDebugUtilsLabelEXT   = 0;
+    PFN_vkCreateDebugUtilsMessengerEXT  vkCreateDebugUtilsMessengerEXT  = 0;
+    PFN_vkDestroyDebugUtilsMessengerEXT vkDestroyDebugUtilsMessengerEXT = 0;
+    PFN_vkSubmitDebugUtilsMessageEXT    vkSubmitDebugUtilsMessageEXT    = 0;
+
+#if defined( VK_USE_PLATFORM_ANDROID_KHR )
+    //=== VK_ANDROID_external_memory_android_hardware_buffer ===
+    PFN_vkGetAndroidHardwareBufferPropertiesANDROID vkGetAndroidHardwareBufferPropertiesANDROID = 0;
+    PFN_vkGetMemoryAndroidHardwareBufferANDROID     vkGetMemoryAndroidHardwareBufferANDROID     = 0;
+#else
+    PFN_dummy vkGetAndroidHardwareBufferPropertiesANDROID_placeholder       = 0;
+    PFN_dummy vkGetMemoryAndroidHardwareBufferANDROID_placeholder           = 0;
+#endif /*VK_USE_PLATFORM_ANDROID_KHR*/
+
+    //=== VK_EXT_sample_locations ===
+    PFN_vkCmdSetSampleLocationsEXT                  vkCmdSetSampleLocationsEXT                  = 0;
+    PFN_vkGetPhysicalDeviceMultisamplePropertiesEXT vkGetPhysicalDeviceMultisamplePropertiesEXT = 0;
+
+    //=== VK_KHR_get_memory_requirements2 ===
+    PFN_vkGetImageMemoryRequirements2KHR       vkGetImageMemoryRequirements2KHR       = 0;
+    PFN_vkGetBufferMemoryRequirements2KHR      vkGetBufferMemoryRequirements2KHR      = 0;
+    PFN_vkGetImageSparseMemoryRequirements2KHR vkGetImageSparseMemoryRequirements2KHR = 0;
+
+    //=== VK_KHR_acceleration_structure ===
+    PFN_vkCreateAccelerationStructureKHR                 vkCreateAccelerationStructureKHR                 = 0;
+    PFN_vkDestroyAccelerationStructureKHR                vkDestroyAccelerationStructureKHR                = 0;
+    PFN_vkCmdBuildAccelerationStructuresKHR              vkCmdBuildAccelerationStructuresKHR              = 0;
+    PFN_vkCmdBuildAccelerationStructuresIndirectKHR      vkCmdBuildAccelerationStructuresIndirectKHR      = 0;
+    PFN_vkBuildAccelerationStructuresKHR                 vkBuildAccelerationStructuresKHR                 = 0;
+    PFN_vkCopyAccelerationStructureKHR                   vkCopyAccelerationStructureKHR                   = 0;
+    PFN_vkCopyAccelerationStructureToMemoryKHR           vkCopyAccelerationStructureToMemoryKHR           = 0;
+    PFN_vkCopyMemoryToAccelerationStructureKHR           vkCopyMemoryToAccelerationStructureKHR           = 0;
+    PFN_vkWriteAccelerationStructuresPropertiesKHR       vkWriteAccelerationStructuresPropertiesKHR       = 0;
+    PFN_vkCmdCopyAccelerationStructureKHR                vkCmdCopyAccelerationStructureKHR                = 0;
+    PFN_vkCmdCopyAccelerationStructureToMemoryKHR        vkCmdCopyAccelerationStructureToMemoryKHR        = 0;
+    PFN_vkCmdCopyMemoryToAccelerationStructureKHR        vkCmdCopyMemoryToAccelerationStructureKHR        = 0;
+    PFN_vkGetAccelerationStructureDeviceAddressKHR       vkGetAccelerationStructureDeviceAddressKHR       = 0;
+    PFN_vkCmdWriteAccelerationStructuresPropertiesKHR    vkCmdWriteAccelerationStructuresPropertiesKHR    = 0;
+    PFN_vkGetDeviceAccelerationStructureCompatibilityKHR vkGetDeviceAccelerationStructureCompatibilityKHR = 0;
+    PFN_vkGetAccelerationStructureBuildSizesKHR          vkGetAccelerationStructureBuildSizesKHR          = 0;
+
+    //=== VK_KHR_sampler_ycbcr_conversion ===
+    PFN_vkCreateSamplerYcbcrConversionKHR  vkCreateSamplerYcbcrConversionKHR  = 0;
+    PFN_vkDestroySamplerYcbcrConversionKHR vkDestroySamplerYcbcrConversionKHR = 0;
+
+    //=== VK_KHR_bind_memory2 ===
+    PFN_vkBindBufferMemory2KHR vkBindBufferMemory2KHR = 0;
+    PFN_vkBindImageMemory2KHR  vkBindImageMemory2KHR  = 0;
+
+    //=== VK_EXT_image_drm_format_modifier ===
+    PFN_vkGetImageDrmFormatModifierPropertiesEXT vkGetImageDrmFormatModifierPropertiesEXT = 0;
+
+    //=== VK_EXT_validation_cache ===
+    PFN_vkCreateValidationCacheEXT  vkCreateValidationCacheEXT  = 0;
+    PFN_vkDestroyValidationCacheEXT vkDestroyValidationCacheEXT = 0;
+    PFN_vkMergeValidationCachesEXT  vkMergeValidationCachesEXT  = 0;
+    PFN_vkGetValidationCacheDataEXT vkGetValidationCacheDataEXT = 0;
+
+    //=== VK_NV_shading_rate_image ===
+    PFN_vkCmdBindShadingRateImageNV          vkCmdBindShadingRateImageNV          = 0;
+    PFN_vkCmdSetViewportShadingRatePaletteNV vkCmdSetViewportShadingRatePaletteNV = 0;
+    PFN_vkCmdSetCoarseSampleOrderNV          vkCmdSetCoarseSampleOrderNV          = 0;
+
+    //=== VK_NV_ray_tracing ===
+    PFN_vkCreateAccelerationStructureNV                vkCreateAccelerationStructureNV                = 0;
+    PFN_vkDestroyAccelerationStructureNV               vkDestroyAccelerationStructureNV               = 0;
+    PFN_vkGetAccelerationStructureMemoryRequirementsNV vkGetAccelerationStructureMemoryRequirementsNV = 0;
+    PFN_vkBindAccelerationStructureMemoryNV            vkBindAccelerationStructureMemoryNV            = 0;
+    PFN_vkCmdBuildAccelerationStructureNV              vkCmdBuildAccelerationStructureNV              = 0;
+    PFN_vkCmdCopyAccelerationStructureNV               vkCmdCopyAccelerationStructureNV               = 0;
+    PFN_vkCmdTraceRaysNV                               vkCmdTraceRaysNV                               = 0;
+    PFN_vkCreateRayTracingPipelinesNV                  vkCreateRayTracingPipelinesNV                  = 0;
+    PFN_vkGetRayTracingShaderGroupHandlesNV            vkGetRayTracingShaderGroupHandlesNV            = 0;
+    PFN_vkGetAccelerationStructureHandleNV             vkGetAccelerationStructureHandleNV             = 0;
+    PFN_vkCmdWriteAccelerationStructuresPropertiesNV   vkCmdWriteAccelerationStructuresPropertiesNV   = 0;
+    PFN_vkCompileDeferredNV                            vkCompileDeferredNV                            = 0;
+
+    //=== VK_KHR_maintenance3 ===
+    PFN_vkGetDescriptorSetLayoutSupportKHR vkGetDescriptorSetLayoutSupportKHR = 0;
+
+    //=== VK_KHR_draw_indirect_count ===
+    PFN_vkCmdDrawIndirectCountKHR        vkCmdDrawIndirectCountKHR        = 0;
+    PFN_vkCmdDrawIndexedIndirectCountKHR vkCmdDrawIndexedIndirectCountKHR = 0;
+
+    //=== VK_EXT_external_memory_host ===
+    PFN_vkGetMemoryHostPointerPropertiesEXT vkGetMemoryHostPointerPropertiesEXT = 0;
+
+    //=== VK_AMD_buffer_marker ===
+    PFN_vkCmdWriteBufferMarkerAMD vkCmdWriteBufferMarkerAMD = 0;
+
+    //=== VK_EXT_calibrated_timestamps ===
+    PFN_vkGetPhysicalDeviceCalibrateableTimeDomainsEXT vkGetPhysicalDeviceCalibrateableTimeDomainsEXT = 0;
+    PFN_vkGetCalibratedTimestampsEXT                   vkGetCalibratedTimestampsEXT                   = 0;
+
+    //=== VK_NV_mesh_shader ===
+    PFN_vkCmdDrawMeshTasksNV              vkCmdDrawMeshTasksNV              = 0;
+    PFN_vkCmdDrawMeshTasksIndirectNV      vkCmdDrawMeshTasksIndirectNV      = 0;
+    PFN_vkCmdDrawMeshTasksIndirectCountNV vkCmdDrawMeshTasksIndirectCountNV = 0;
+
+    //=== VK_NV_scissor_exclusive ===
+    PFN_vkCmdSetExclusiveScissorNV vkCmdSetExclusiveScissorNV = 0;
+
+    //=== VK_NV_device_diagnostic_checkpoints ===
+    PFN_vkCmdSetCheckpointNV       vkCmdSetCheckpointNV       = 0;
+    PFN_vkGetQueueCheckpointDataNV vkGetQueueCheckpointDataNV = 0;
+
+    //=== VK_KHR_timeline_semaphore ===
+    PFN_vkGetSemaphoreCounterValueKHR vkGetSemaphoreCounterValueKHR = 0;
+    PFN_vkWaitSemaphoresKHR           vkWaitSemaphoresKHR           = 0;
+    PFN_vkSignalSemaphoreKHR          vkSignalSemaphoreKHR          = 0;
+
+    //=== VK_INTEL_performance_query ===
     PFN_vkInitializePerformanceApiINTEL         vkInitializePerformanceApiINTEL         = 0;
-    PFN_vkInvalidateMappedMemoryRanges          vkInvalidateMappedMemoryRanges          = 0;
-    PFN_vkMapMemory                             vkMapMemory                             = 0;
-    PFN_vkMergePipelineCaches                   vkMergePipelineCaches                   = 0;
-    PFN_vkMergeValidationCachesEXT              vkMergeValidationCachesEXT              = 0;
-    PFN_vkQueueBeginDebugUtilsLabelEXT          vkQueueBeginDebugUtilsLabelEXT          = 0;
-    PFN_vkQueueBindSparse                       vkQueueBindSparse                       = 0;
-    PFN_vkQueueEndDebugUtilsLabelEXT            vkQueueEndDebugUtilsLabelEXT            = 0;
-    PFN_vkQueueInsertDebugUtilsLabelEXT         vkQueueInsertDebugUtilsLabelEXT         = 0;
-    PFN_vkQueuePresentKHR                       vkQueuePresentKHR                       = 0;
+    PFN_vkUninitializePerformanceApiINTEL       vkUninitializePerformanceApiINTEL       = 0;
+    PFN_vkCmdSetPerformanceMarkerINTEL          vkCmdSetPerformanceMarkerINTEL          = 0;
+    PFN_vkCmdSetPerformanceStreamMarkerINTEL    vkCmdSetPerformanceStreamMarkerINTEL    = 0;
+    PFN_vkCmdSetPerformanceOverrideINTEL        vkCmdSetPerformanceOverrideINTEL        = 0;
+    PFN_vkAcquirePerformanceConfigurationINTEL  vkAcquirePerformanceConfigurationINTEL  = 0;
+    PFN_vkReleasePerformanceConfigurationINTEL  vkReleasePerformanceConfigurationINTEL  = 0;
     PFN_vkQueueSetPerformanceConfigurationINTEL vkQueueSetPerformanceConfigurationINTEL = 0;
-    PFN_vkQueueSubmit                           vkQueueSubmit                           = 0;
-    PFN_vkQueueSubmit2KHR                       vkQueueSubmit2KHR                       = 0;
-    PFN_vkQueueWaitIdle                         vkQueueWaitIdle                         = 0;
-    PFN_vkRegisterDeviceEventEXT                vkRegisterDeviceEventEXT                = 0;
-    PFN_vkRegisterDisplayEventEXT               vkRegisterDisplayEventEXT               = 0;
-    PFN_vkReleaseDisplayEXT                     vkReleaseDisplayEXT                     = 0;
+    PFN_vkGetPerformanceParameterINTEL          vkGetPerformanceParameterINTEL          = 0;
+
+    //=== VK_AMD_display_native_hdr ===
+    PFN_vkSetLocalDimmingAMD vkSetLocalDimmingAMD = 0;
+
+#if defined( VK_USE_PLATFORM_FUCHSIA )
+    //=== VK_FUCHSIA_imagepipe_surface ===
+    PFN_vkCreateImagePipeSurfaceFUCHSIA vkCreateImagePipeSurfaceFUCHSIA = 0;
+#else
+    PFN_dummy vkCreateImagePipeSurfaceFUCHSIA_placeholder                   = 0;
+#endif /*VK_USE_PLATFORM_FUCHSIA*/
+
+#if defined( VK_USE_PLATFORM_METAL_EXT )
+    //=== VK_EXT_metal_surface ===
+    PFN_vkCreateMetalSurfaceEXT vkCreateMetalSurfaceEXT = 0;
+#else
+    PFN_dummy vkCreateMetalSurfaceEXT_placeholder                           = 0;
+#endif /*VK_USE_PLATFORM_METAL_EXT*/
+
+    //=== VK_KHR_fragment_shading_rate ===
+    PFN_vkGetPhysicalDeviceFragmentShadingRatesKHR vkGetPhysicalDeviceFragmentShadingRatesKHR = 0;
+    PFN_vkCmdSetFragmentShadingRateKHR             vkCmdSetFragmentShadingRateKHR             = 0;
+
+    //=== VK_EXT_buffer_device_address ===
+    PFN_vkGetBufferDeviceAddressEXT vkGetBufferDeviceAddressEXT = 0;
+
+    //=== VK_EXT_tooling_info ===
+    PFN_vkGetPhysicalDeviceToolPropertiesEXT vkGetPhysicalDeviceToolPropertiesEXT = 0;
+
+    //=== VK_KHR_present_wait ===
+    PFN_vkWaitForPresentKHR vkWaitForPresentKHR = 0;
+
+    //=== VK_NV_cooperative_matrix ===
+    PFN_vkGetPhysicalDeviceCooperativeMatrixPropertiesNV vkGetPhysicalDeviceCooperativeMatrixPropertiesNV = 0;
+
+    //=== VK_NV_coverage_reduction_mode ===
+    PFN_vkGetPhysicalDeviceSupportedFramebufferMixedSamplesCombinationsNV
+      vkGetPhysicalDeviceSupportedFramebufferMixedSamplesCombinationsNV = 0;
+
 #if defined( VK_USE_PLATFORM_WIN32_KHR )
-    PFN_vkReleaseFullScreenExclusiveModeEXT vkReleaseFullScreenExclusiveModeEXT = 0;
+    //=== VK_EXT_full_screen_exclusive ===
+    PFN_vkGetPhysicalDeviceSurfacePresentModes2EXT vkGetPhysicalDeviceSurfacePresentModes2EXT = 0;
+    PFN_vkAcquireFullScreenExclusiveModeEXT        vkAcquireFullScreenExclusiveModeEXT        = 0;
+    PFN_vkReleaseFullScreenExclusiveModeEXT        vkReleaseFullScreenExclusiveModeEXT        = 0;
+    PFN_vkGetDeviceGroupSurfacePresentModes2EXT    vkGetDeviceGroupSurfacePresentModes2EXT    = 0;
 #else
-    PFN_dummy placeholder_dont_call_vkReleaseFullScreenExclusiveModeEXT               = 0;
+    PFN_dummy vkGetPhysicalDeviceSurfacePresentModes2EXT_placeholder        = 0;
+    PFN_dummy vkAcquireFullScreenExclusiveModeEXT_placeholder               = 0;
+    PFN_dummy vkReleaseFullScreenExclusiveModeEXT_placeholder               = 0;
+    PFN_dummy vkGetDeviceGroupSurfacePresentModes2EXT_placeholder           = 0;
 #endif /*VK_USE_PLATFORM_WIN32_KHR*/
-    PFN_vkReleasePerformanceConfigurationINTEL vkReleasePerformanceConfigurationINTEL = 0;
-    PFN_vkReleaseProfilingLockKHR              vkReleaseProfilingLockKHR              = 0;
-    PFN_vkResetCommandBuffer                   vkResetCommandBuffer                   = 0;
-    PFN_vkResetCommandPool                     vkResetCommandPool                     = 0;
-    PFN_vkResetDescriptorPool                  vkResetDescriptorPool                  = 0;
-    PFN_vkResetEvent                           vkResetEvent                           = 0;
-    PFN_vkResetFences                          vkResetFences                          = 0;
-    PFN_vkResetQueryPool                       vkResetQueryPool                       = 0;
-    PFN_vkResetQueryPoolEXT                    vkResetQueryPoolEXT                    = 0;
-    PFN_vkSetDebugUtilsObjectNameEXT           vkSetDebugUtilsObjectNameEXT           = 0;
-    PFN_vkSetDebugUtilsObjectTagEXT            vkSetDebugUtilsObjectTagEXT            = 0;
-    PFN_vkSetEvent                             vkSetEvent                             = 0;
-    PFN_vkSetHdrMetadataEXT                    vkSetHdrMetadataEXT                    = 0;
-    PFN_vkSetLocalDimmingAMD                   vkSetLocalDimmingAMD                   = 0;
-    PFN_vkSetPrivateDataEXT                    vkSetPrivateDataEXT                    = 0;
-    PFN_vkSignalSemaphore                      vkSignalSemaphore                      = 0;
-    PFN_vkSignalSemaphoreKHR                   vkSignalSemaphoreKHR                   = 0;
-    PFN_vkSubmitDebugUtilsMessageEXT           vkSubmitDebugUtilsMessageEXT           = 0;
-    PFN_vkTrimCommandPool                      vkTrimCommandPool                      = 0;
-    PFN_vkTrimCommandPoolKHR                   vkTrimCommandPoolKHR                   = 0;
-    PFN_vkUninitializePerformanceApiINTEL      vkUninitializePerformanceApiINTEL      = 0;
-    PFN_vkUnmapMemory                          vkUnmapMemory                          = 0;
-    PFN_vkUpdateDescriptorSetWithTemplate      vkUpdateDescriptorSetWithTemplate      = 0;
-    PFN_vkUpdateDescriptorSetWithTemplateKHR   vkUpdateDescriptorSetWithTemplateKHR   = 0;
-    PFN_vkUpdateDescriptorSets                 vkUpdateDescriptorSets                 = 0;
+
+    //=== VK_EXT_headless_surface ===
+    PFN_vkCreateHeadlessSurfaceEXT vkCreateHeadlessSurfaceEXT = 0;
+
+    //=== VK_KHR_buffer_device_address ===
+    PFN_vkGetBufferDeviceAddressKHR              vkGetBufferDeviceAddressKHR              = 0;
+    PFN_vkGetBufferOpaqueCaptureAddressKHR       vkGetBufferOpaqueCaptureAddressKHR       = 0;
+    PFN_vkGetDeviceMemoryOpaqueCaptureAddressKHR vkGetDeviceMemoryOpaqueCaptureAddressKHR = 0;
+
+    //=== VK_EXT_line_rasterization ===
+    PFN_vkCmdSetLineStippleEXT vkCmdSetLineStippleEXT = 0;
+
+    //=== VK_EXT_host_query_reset ===
+    PFN_vkResetQueryPoolEXT vkResetQueryPoolEXT = 0;
+
+    //=== VK_EXT_extended_dynamic_state ===
+    PFN_vkCmdSetCullModeEXT              vkCmdSetCullModeEXT              = 0;
+    PFN_vkCmdSetFrontFaceEXT             vkCmdSetFrontFaceEXT             = 0;
+    PFN_vkCmdSetPrimitiveTopologyEXT     vkCmdSetPrimitiveTopologyEXT     = 0;
+    PFN_vkCmdSetViewportWithCountEXT     vkCmdSetViewportWithCountEXT     = 0;
+    PFN_vkCmdSetScissorWithCountEXT      vkCmdSetScissorWithCountEXT      = 0;
+    PFN_vkCmdBindVertexBuffers2EXT       vkCmdBindVertexBuffers2EXT       = 0;
+    PFN_vkCmdSetDepthTestEnableEXT       vkCmdSetDepthTestEnableEXT       = 0;
+    PFN_vkCmdSetDepthWriteEnableEXT      vkCmdSetDepthWriteEnableEXT      = 0;
+    PFN_vkCmdSetDepthCompareOpEXT        vkCmdSetDepthCompareOpEXT        = 0;
+    PFN_vkCmdSetDepthBoundsTestEnableEXT vkCmdSetDepthBoundsTestEnableEXT = 0;
+    PFN_vkCmdSetStencilTestEnableEXT     vkCmdSetStencilTestEnableEXT     = 0;
+    PFN_vkCmdSetStencilOpEXT             vkCmdSetStencilOpEXT             = 0;
+
+    //=== VK_KHR_deferred_host_operations ===
+    PFN_vkCreateDeferredOperationKHR            vkCreateDeferredOperationKHR            = 0;
+    PFN_vkDestroyDeferredOperationKHR           vkDestroyDeferredOperationKHR           = 0;
+    PFN_vkGetDeferredOperationMaxConcurrencyKHR vkGetDeferredOperationMaxConcurrencyKHR = 0;
+    PFN_vkGetDeferredOperationResultKHR         vkGetDeferredOperationResultKHR         = 0;
+    PFN_vkDeferredOperationJoinKHR              vkDeferredOperationJoinKHR              = 0;
+
+    //=== VK_KHR_pipeline_executable_properties ===
+    PFN_vkGetPipelineExecutablePropertiesKHR              vkGetPipelineExecutablePropertiesKHR              = 0;
+    PFN_vkGetPipelineExecutableStatisticsKHR              vkGetPipelineExecutableStatisticsKHR              = 0;
+    PFN_vkGetPipelineExecutableInternalRepresentationsKHR vkGetPipelineExecutableInternalRepresentationsKHR = 0;
+
+    //=== VK_NV_device_generated_commands ===
+    PFN_vkGetGeneratedCommandsMemoryRequirementsNV vkGetGeneratedCommandsMemoryRequirementsNV = 0;
+    PFN_vkCmdPreprocessGeneratedCommandsNV         vkCmdPreprocessGeneratedCommandsNV         = 0;
+    PFN_vkCmdExecuteGeneratedCommandsNV            vkCmdExecuteGeneratedCommandsNV            = 0;
+    PFN_vkCmdBindPipelineShaderGroupNV             vkCmdBindPipelineShaderGroupNV             = 0;
+    PFN_vkCreateIndirectCommandsLayoutNV           vkCreateIndirectCommandsLayoutNV           = 0;
+    PFN_vkDestroyIndirectCommandsLayoutNV          vkDestroyIndirectCommandsLayoutNV          = 0;
+
+    //=== VK_EXT_acquire_drm_display ===
+    PFN_vkAcquireDrmDisplayEXT vkAcquireDrmDisplayEXT = 0;
+    PFN_vkGetDrmDisplayEXT     vkGetDrmDisplayEXT     = 0;
+
+    //=== VK_EXT_private_data ===
+    PFN_vkCreatePrivateDataSlotEXT  vkCreatePrivateDataSlotEXT  = 0;
+    PFN_vkDestroyPrivateDataSlotEXT vkDestroyPrivateDataSlotEXT = 0;
+    PFN_vkSetPrivateDataEXT         vkSetPrivateDataEXT         = 0;
+    PFN_vkGetPrivateDataEXT         vkGetPrivateDataEXT         = 0;
+
 #if defined( VK_ENABLE_BETA_EXTENSIONS )
-    PFN_vkUpdateVideoSessionParametersKHR vkUpdateVideoSessionParametersKHR = 0;
+    //=== VK_KHR_video_encode_queue ===
+    PFN_vkCmdEncodeVideoKHR vkCmdEncodeVideoKHR = 0;
 #else
-    PFN_dummy placeholder_dont_call_vkUpdateVideoSessionParametersKHR                 = 0;
+    PFN_dummy vkCmdEncodeVideoKHR_placeholder                               = 0;
 #endif /*VK_ENABLE_BETA_EXTENSIONS*/
-    PFN_vkWaitForFences                            vkWaitForFences                            = 0;
-    PFN_vkWaitSemaphores                           vkWaitSemaphores                           = 0;
-    PFN_vkWaitSemaphoresKHR                        vkWaitSemaphoresKHR                        = 0;
-    PFN_vkWriteAccelerationStructuresPropertiesKHR vkWriteAccelerationStructuresPropertiesKHR = 0;
+
+    //=== VK_KHR_synchronization2 ===
+    PFN_vkCmdSetEvent2KHR           vkCmdSetEvent2KHR           = 0;
+    PFN_vkCmdResetEvent2KHR         vkCmdResetEvent2KHR         = 0;
+    PFN_vkCmdWaitEvents2KHR         vkCmdWaitEvents2KHR         = 0;
+    PFN_vkCmdPipelineBarrier2KHR    vkCmdPipelineBarrier2KHR    = 0;
+    PFN_vkCmdWriteTimestamp2KHR     vkCmdWriteTimestamp2KHR     = 0;
+    PFN_vkQueueSubmit2KHR           vkQueueSubmit2KHR           = 0;
+    PFN_vkCmdWriteBufferMarker2AMD  vkCmdWriteBufferMarker2AMD  = 0;
+    PFN_vkGetQueueCheckpointData2NV vkGetQueueCheckpointData2NV = 0;
+
+    //=== VK_NV_fragment_shading_rate_enums ===
+    PFN_vkCmdSetFragmentShadingRateEnumNV vkCmdSetFragmentShadingRateEnumNV = 0;
+
+    //=== VK_KHR_copy_commands2 ===
+    PFN_vkCmdCopyBuffer2KHR        vkCmdCopyBuffer2KHR        = 0;
+    PFN_vkCmdCopyImage2KHR         vkCmdCopyImage2KHR         = 0;
+    PFN_vkCmdCopyBufferToImage2KHR vkCmdCopyBufferToImage2KHR = 0;
+    PFN_vkCmdCopyImageToBuffer2KHR vkCmdCopyImageToBuffer2KHR = 0;
+    PFN_vkCmdBlitImage2KHR         vkCmdBlitImage2KHR         = 0;
+    PFN_vkCmdResolveImage2KHR      vkCmdResolveImage2KHR      = 0;
+
+#if defined( VK_USE_PLATFORM_WIN32_KHR )
+    //=== VK_NV_acquire_winrt_display ===
+    PFN_vkAcquireWinrtDisplayNV vkAcquireWinrtDisplayNV = 0;
+    PFN_vkGetWinrtDisplayNV     vkGetWinrtDisplayNV     = 0;
+#else
+    PFN_dummy vkAcquireWinrtDisplayNV_placeholder                           = 0;
+    PFN_dummy vkGetWinrtDisplayNV_placeholder                               = 0;
+#endif /*VK_USE_PLATFORM_WIN32_KHR*/
+
+#if defined( VK_USE_PLATFORM_DIRECTFB_EXT )
+    //=== VK_EXT_directfb_surface ===
+    PFN_vkCreateDirectFBSurfaceEXT                        vkCreateDirectFBSurfaceEXT                        = 0;
+    PFN_vkGetPhysicalDeviceDirectFBPresentationSupportEXT vkGetPhysicalDeviceDirectFBPresentationSupportEXT = 0;
+#else
+    PFN_dummy vkCreateDirectFBSurfaceEXT_placeholder                        = 0;
+    PFN_dummy vkGetPhysicalDeviceDirectFBPresentationSupportEXT_placeholder = 0;
+#endif /*VK_USE_PLATFORM_DIRECTFB_EXT*/
+
+    //=== VK_KHR_ray_tracing_pipeline ===
+    PFN_vkCmdTraceRaysKHR                                 vkCmdTraceRaysKHR                                 = 0;
+    PFN_vkCreateRayTracingPipelinesKHR                    vkCreateRayTracingPipelinesKHR                    = 0;
+    PFN_vkGetRayTracingShaderGroupHandlesKHR              vkGetRayTracingShaderGroupHandlesKHR              = 0;
+    PFN_vkGetRayTracingCaptureReplayShaderGroupHandlesKHR vkGetRayTracingCaptureReplayShaderGroupHandlesKHR = 0;
+    PFN_vkCmdTraceRaysIndirectKHR                         vkCmdTraceRaysIndirectKHR                         = 0;
+    PFN_vkGetRayTracingShaderGroupStackSizeKHR            vkGetRayTracingShaderGroupStackSizeKHR            = 0;
+    PFN_vkCmdSetRayTracingPipelineStackSizeKHR            vkCmdSetRayTracingPipelineStackSizeKHR            = 0;
+
+    //=== VK_EXT_vertex_input_dynamic_state ===
+    PFN_vkCmdSetVertexInputEXT vkCmdSetVertexInputEXT = 0;
+
+#if defined( VK_USE_PLATFORM_FUCHSIA )
+    //=== VK_FUCHSIA_external_memory ===
+    PFN_vkGetMemoryZirconHandleFUCHSIA           vkGetMemoryZirconHandleFUCHSIA           = 0;
+    PFN_vkGetMemoryZirconHandlePropertiesFUCHSIA vkGetMemoryZirconHandlePropertiesFUCHSIA = 0;
+#else
+    PFN_dummy vkGetMemoryZirconHandleFUCHSIA_placeholder                    = 0;
+    PFN_dummy vkGetMemoryZirconHandlePropertiesFUCHSIA_placeholder          = 0;
+#endif /*VK_USE_PLATFORM_FUCHSIA*/
+
+#if defined( VK_USE_PLATFORM_FUCHSIA )
+    //=== VK_FUCHSIA_external_semaphore ===
+    PFN_vkImportSemaphoreZirconHandleFUCHSIA vkImportSemaphoreZirconHandleFUCHSIA = 0;
+    PFN_vkGetSemaphoreZirconHandleFUCHSIA    vkGetSemaphoreZirconHandleFUCHSIA    = 0;
+#else
+    PFN_dummy vkImportSemaphoreZirconHandleFUCHSIA_placeholder              = 0;
+    PFN_dummy vkGetSemaphoreZirconHandleFUCHSIA_placeholder                 = 0;
+#endif /*VK_USE_PLATFORM_FUCHSIA*/
+
+    //=== VK_HUAWEI_subpass_shading ===
+    PFN_vkGetDeviceSubpassShadingMaxWorkgroupSizeHUAWEI vkGetDeviceSubpassShadingMaxWorkgroupSizeHUAWEI = 0;
+    PFN_vkCmdSubpassShadingHUAWEI                       vkCmdSubpassShadingHUAWEI                       = 0;
+
+    //=== VK_HUAWEI_invocation_mask ===
+    PFN_vkCmdBindInvocationMaskHUAWEI vkCmdBindInvocationMaskHUAWEI = 0;
+
+    //=== VK_NV_external_memory_rdma ===
+    PFN_vkGetMemoryRemoteAddressNV vkGetMemoryRemoteAddressNV = 0;
+
+    //=== VK_EXT_extended_dynamic_state2 ===
+    PFN_vkCmdSetPatchControlPointsEXT      vkCmdSetPatchControlPointsEXT      = 0;
+    PFN_vkCmdSetRasterizerDiscardEnableEXT vkCmdSetRasterizerDiscardEnableEXT = 0;
+    PFN_vkCmdSetDepthBiasEnableEXT         vkCmdSetDepthBiasEnableEXT         = 0;
+    PFN_vkCmdSetLogicOpEXT                 vkCmdSetLogicOpEXT                 = 0;
+    PFN_vkCmdSetPrimitiveRestartEnableEXT  vkCmdSetPrimitiveRestartEnableEXT  = 0;
+
+#if defined( VK_USE_PLATFORM_SCREEN_QNX )
+    //=== VK_QNX_screen_surface ===
+    PFN_vkCreateScreenSurfaceQNX                        vkCreateScreenSurfaceQNX                        = 0;
+    PFN_vkGetPhysicalDeviceScreenPresentationSupportQNX vkGetPhysicalDeviceScreenPresentationSupportQNX = 0;
+#else
+    PFN_dummy vkCreateScreenSurfaceQNX_placeholder                          = 0;
+    PFN_dummy vkGetPhysicalDeviceScreenPresentationSupportQNX_placeholder   = 0;
+#endif /*VK_USE_PLATFORM_SCREEN_QNX*/
+
+    //=== VK_EXT_color_write_enable ===
+    PFN_vkCmdSetColorWriteEnableEXT vkCmdSetColorWriteEnableEXT = 0;
+
+    //=== VK_EXT_multi_draw ===
+    PFN_vkCmdDrawMultiEXT        vkCmdDrawMultiEXT        = 0;
+    PFN_vkCmdDrawMultiIndexedEXT vkCmdDrawMultiIndexedEXT = 0;
 
   public:
     DispatchLoaderDynamic() VULKAN_HPP_NOEXCEPT                                    = default;
@@ -10886,11 +11483,15 @@
       VULKAN_HPP_ASSERT( getInstanceProcAddr );
 
       vkGetInstanceProcAddr = getInstanceProcAddr;
-      vkCreateInstance      = PFN_vkCreateInstance( vkGetInstanceProcAddr( NULL, "vkCreateInstance" ) );
+
+      //=== VK_VERSION_1_0 ===
+      vkCreateInstance = PFN_vkCreateInstance( vkGetInstanceProcAddr( NULL, "vkCreateInstance" ) );
       vkEnumerateInstanceExtensionProperties = PFN_vkEnumerateInstanceExtensionProperties(
         vkGetInstanceProcAddr( NULL, "vkEnumerateInstanceExtensionProperties" ) );
       vkEnumerateInstanceLayerProperties =
         PFN_vkEnumerateInstanceLayerProperties( vkGetInstanceProcAddr( NULL, "vkEnumerateInstanceLayerProperties" ) );
+
+      //=== VK_VERSION_1_1 ===
       vkEnumerateInstanceVersion =
         PFN_vkEnumerateInstanceVersion( vkGetInstanceProcAddr( NULL, "vkEnumerateInstanceVersion" ) );
     }
@@ -10922,1778 +11523,2158 @@
     void init( VULKAN_HPP_NAMESPACE::Instance instanceCpp ) VULKAN_HPP_NOEXCEPT
     {
       VkInstance instance = static_cast<VkInstance>( instanceCpp );
-      vkAcquireDrmDisplayEXT =
-        PFN_vkAcquireDrmDisplayEXT( vkGetInstanceProcAddr( instance, "vkAcquireDrmDisplayEXT" ) );
-#if defined( VK_USE_PLATFORM_WIN32_KHR )
-      vkAcquireWinrtDisplayNV =
-        PFN_vkAcquireWinrtDisplayNV( vkGetInstanceProcAddr( instance, "vkAcquireWinrtDisplayNV" ) );
-#endif /*VK_USE_PLATFORM_WIN32_KHR*/
-#if defined( VK_USE_PLATFORM_XLIB_XRANDR_EXT )
-      vkAcquireXlibDisplayEXT =
-        PFN_vkAcquireXlibDisplayEXT( vkGetInstanceProcAddr( instance, "vkAcquireXlibDisplayEXT" ) );
-#endif /*VK_USE_PLATFORM_XLIB_XRANDR_EXT*/
-#if defined( VK_USE_PLATFORM_ANDROID_KHR )
-      vkCreateAndroidSurfaceKHR =
-        PFN_vkCreateAndroidSurfaceKHR( vkGetInstanceProcAddr( instance, "vkCreateAndroidSurfaceKHR" ) );
-#endif /*VK_USE_PLATFORM_ANDROID_KHR*/
-      vkCreateDebugReportCallbackEXT =
-        PFN_vkCreateDebugReportCallbackEXT( vkGetInstanceProcAddr( instance, "vkCreateDebugReportCallbackEXT" ) );
-      vkCreateDebugUtilsMessengerEXT =
-        PFN_vkCreateDebugUtilsMessengerEXT( vkGetInstanceProcAddr( instance, "vkCreateDebugUtilsMessengerEXT" ) );
-      vkCreateDevice = PFN_vkCreateDevice( vkGetInstanceProcAddr( instance, "vkCreateDevice" ) );
-#if defined( VK_USE_PLATFORM_DIRECTFB_EXT )
-      vkCreateDirectFBSurfaceEXT =
-        PFN_vkCreateDirectFBSurfaceEXT( vkGetInstanceProcAddr( instance, "vkCreateDirectFBSurfaceEXT" ) );
-#endif /*VK_USE_PLATFORM_DIRECTFB_EXT*/
-      vkCreateDisplayModeKHR =
-        PFN_vkCreateDisplayModeKHR( vkGetInstanceProcAddr( instance, "vkCreateDisplayModeKHR" ) );
-      vkCreateDisplayPlaneSurfaceKHR =
-        PFN_vkCreateDisplayPlaneSurfaceKHR( vkGetInstanceProcAddr( instance, "vkCreateDisplayPlaneSurfaceKHR" ) );
-      vkCreateHeadlessSurfaceEXT =
-        PFN_vkCreateHeadlessSurfaceEXT( vkGetInstanceProcAddr( instance, "vkCreateHeadlessSurfaceEXT" ) );
-#if defined( VK_USE_PLATFORM_IOS_MVK )
-      vkCreateIOSSurfaceMVK = PFN_vkCreateIOSSurfaceMVK( vkGetInstanceProcAddr( instance, "vkCreateIOSSurfaceMVK" ) );
-#endif /*VK_USE_PLATFORM_IOS_MVK*/
-#if defined( VK_USE_PLATFORM_FUCHSIA )
-      vkCreateImagePipeSurfaceFUCHSIA =
-        PFN_vkCreateImagePipeSurfaceFUCHSIA( vkGetInstanceProcAddr( instance, "vkCreateImagePipeSurfaceFUCHSIA" ) );
-#endif /*VK_USE_PLATFORM_FUCHSIA*/
-#if defined( VK_USE_PLATFORM_MACOS_MVK )
-      vkCreateMacOSSurfaceMVK =
-        PFN_vkCreateMacOSSurfaceMVK( vkGetInstanceProcAddr( instance, "vkCreateMacOSSurfaceMVK" ) );
-#endif /*VK_USE_PLATFORM_MACOS_MVK*/
-#if defined( VK_USE_PLATFORM_METAL_EXT )
-      vkCreateMetalSurfaceEXT =
-        PFN_vkCreateMetalSurfaceEXT( vkGetInstanceProcAddr( instance, "vkCreateMetalSurfaceEXT" ) );
-#endif /*VK_USE_PLATFORM_METAL_EXT*/
-#if defined( VK_USE_PLATFORM_SCREEN_QNX )
-      vkCreateScreenSurfaceQNX =
-        PFN_vkCreateScreenSurfaceQNX( vkGetInstanceProcAddr( instance, "vkCreateScreenSurfaceQNX" ) );
-#endif /*VK_USE_PLATFORM_SCREEN_QNX*/
-#if defined( VK_USE_PLATFORM_GGP )
-      vkCreateStreamDescriptorSurfaceGGP = PFN_vkCreateStreamDescriptorSurfaceGGP(
-        vkGetInstanceProcAddr( instance, "vkCreateStreamDescriptorSurfaceGGP" ) );
-#endif /*VK_USE_PLATFORM_GGP*/
-#if defined( VK_USE_PLATFORM_VI_NN )
-      vkCreateViSurfaceNN = PFN_vkCreateViSurfaceNN( vkGetInstanceProcAddr( instance, "vkCreateViSurfaceNN" ) );
-#endif /*VK_USE_PLATFORM_VI_NN*/
-#if defined( VK_USE_PLATFORM_WAYLAND_KHR )
-      vkCreateWaylandSurfaceKHR =
-        PFN_vkCreateWaylandSurfaceKHR( vkGetInstanceProcAddr( instance, "vkCreateWaylandSurfaceKHR" ) );
-#endif /*VK_USE_PLATFORM_WAYLAND_KHR*/
-#if defined( VK_USE_PLATFORM_WIN32_KHR )
-      vkCreateWin32SurfaceKHR =
-        PFN_vkCreateWin32SurfaceKHR( vkGetInstanceProcAddr( instance, "vkCreateWin32SurfaceKHR" ) );
-#endif /*VK_USE_PLATFORM_WIN32_KHR*/
-#if defined( VK_USE_PLATFORM_XCB_KHR )
-      vkCreateXcbSurfaceKHR = PFN_vkCreateXcbSurfaceKHR( vkGetInstanceProcAddr( instance, "vkCreateXcbSurfaceKHR" ) );
-#endif /*VK_USE_PLATFORM_XCB_KHR*/
-#if defined( VK_USE_PLATFORM_XLIB_KHR )
-      vkCreateXlibSurfaceKHR =
-        PFN_vkCreateXlibSurfaceKHR( vkGetInstanceProcAddr( instance, "vkCreateXlibSurfaceKHR" ) );
-#endif /*VK_USE_PLATFORM_XLIB_KHR*/
-      vkDebugReportMessageEXT =
-        PFN_vkDebugReportMessageEXT( vkGetInstanceProcAddr( instance, "vkDebugReportMessageEXT" ) );
-      vkDestroyDebugReportCallbackEXT =
-        PFN_vkDestroyDebugReportCallbackEXT( vkGetInstanceProcAddr( instance, "vkDestroyDebugReportCallbackEXT" ) );
-      vkDestroyDebugUtilsMessengerEXT =
-        PFN_vkDestroyDebugUtilsMessengerEXT( vkGetInstanceProcAddr( instance, "vkDestroyDebugUtilsMessengerEXT" ) );
-      vkDestroyInstance   = PFN_vkDestroyInstance( vkGetInstanceProcAddr( instance, "vkDestroyInstance" ) );
-      vkDestroySurfaceKHR = PFN_vkDestroySurfaceKHR( vkGetInstanceProcAddr( instance, "vkDestroySurfaceKHR" ) );
+
+      //=== VK_VERSION_1_0 ===
+      vkDestroyInstance = PFN_vkDestroyInstance( vkGetInstanceProcAddr( instance, "vkDestroyInstance" ) );
+      vkEnumeratePhysicalDevices =
+        PFN_vkEnumeratePhysicalDevices( vkGetInstanceProcAddr( instance, "vkEnumeratePhysicalDevices" ) );
+      vkGetPhysicalDeviceFeatures =
+        PFN_vkGetPhysicalDeviceFeatures( vkGetInstanceProcAddr( instance, "vkGetPhysicalDeviceFeatures" ) );
+      vkGetPhysicalDeviceFormatProperties = PFN_vkGetPhysicalDeviceFormatProperties(
+        vkGetInstanceProcAddr( instance, "vkGetPhysicalDeviceFormatProperties" ) );
+      vkGetPhysicalDeviceImageFormatProperties = PFN_vkGetPhysicalDeviceImageFormatProperties(
+        vkGetInstanceProcAddr( instance, "vkGetPhysicalDeviceImageFormatProperties" ) );
+      vkGetPhysicalDeviceProperties =
+        PFN_vkGetPhysicalDeviceProperties( vkGetInstanceProcAddr( instance, "vkGetPhysicalDeviceProperties" ) );
+      vkGetPhysicalDeviceQueueFamilyProperties = PFN_vkGetPhysicalDeviceQueueFamilyProperties(
+        vkGetInstanceProcAddr( instance, "vkGetPhysicalDeviceQueueFamilyProperties" ) );
+      vkGetPhysicalDeviceMemoryProperties = PFN_vkGetPhysicalDeviceMemoryProperties(
+        vkGetInstanceProcAddr( instance, "vkGetPhysicalDeviceMemoryProperties" ) );
+      vkGetInstanceProcAddr = PFN_vkGetInstanceProcAddr( vkGetInstanceProcAddr( instance, "vkGetInstanceProcAddr" ) );
+      vkGetDeviceProcAddr   = PFN_vkGetDeviceProcAddr( vkGetInstanceProcAddr( instance, "vkGetDeviceProcAddr" ) );
+      vkCreateDevice        = PFN_vkCreateDevice( vkGetInstanceProcAddr( instance, "vkCreateDevice" ) );
+      vkDestroyDevice       = PFN_vkDestroyDevice( vkGetInstanceProcAddr( instance, "vkDestroyDevice" ) );
       vkEnumerateDeviceExtensionProperties = PFN_vkEnumerateDeviceExtensionProperties(
         vkGetInstanceProcAddr( instance, "vkEnumerateDeviceExtensionProperties" ) );
       vkEnumerateDeviceLayerProperties =
         PFN_vkEnumerateDeviceLayerProperties( vkGetInstanceProcAddr( instance, "vkEnumerateDeviceLayerProperties" ) );
-      vkEnumeratePhysicalDeviceGroups =
-        PFN_vkEnumeratePhysicalDeviceGroups( vkGetInstanceProcAddr( instance, "vkEnumeratePhysicalDeviceGroups" ) );
-      vkEnumeratePhysicalDeviceGroupsKHR = PFN_vkEnumeratePhysicalDeviceGroupsKHR(
-        vkGetInstanceProcAddr( instance, "vkEnumeratePhysicalDeviceGroupsKHR" ) );
-      if ( !vkEnumeratePhysicalDeviceGroups )
-        vkEnumeratePhysicalDeviceGroups = vkEnumeratePhysicalDeviceGroupsKHR;
-      vkEnumeratePhysicalDeviceQueueFamilyPerformanceQueryCountersKHR =
-        PFN_vkEnumeratePhysicalDeviceQueueFamilyPerformanceQueryCountersKHR(
-          vkGetInstanceProcAddr( instance, "vkEnumeratePhysicalDeviceQueueFamilyPerformanceQueryCountersKHR" ) );
-      vkEnumeratePhysicalDevices =
-        PFN_vkEnumeratePhysicalDevices( vkGetInstanceProcAddr( instance, "vkEnumeratePhysicalDevices" ) );
-      vkGetDisplayModeProperties2KHR =
-        PFN_vkGetDisplayModeProperties2KHR( vkGetInstanceProcAddr( instance, "vkGetDisplayModeProperties2KHR" ) );
-      vkGetDisplayModePropertiesKHR =
-        PFN_vkGetDisplayModePropertiesKHR( vkGetInstanceProcAddr( instance, "vkGetDisplayModePropertiesKHR" ) );
-      vkGetDisplayPlaneCapabilities2KHR =
-        PFN_vkGetDisplayPlaneCapabilities2KHR( vkGetInstanceProcAddr( instance, "vkGetDisplayPlaneCapabilities2KHR" ) );
-      vkGetDisplayPlaneCapabilitiesKHR =
-        PFN_vkGetDisplayPlaneCapabilitiesKHR( vkGetInstanceProcAddr( instance, "vkGetDisplayPlaneCapabilitiesKHR" ) );
-      vkGetDisplayPlaneSupportedDisplaysKHR = PFN_vkGetDisplayPlaneSupportedDisplaysKHR(
-        vkGetInstanceProcAddr( instance, "vkGetDisplayPlaneSupportedDisplaysKHR" ) );
-      vkGetDrmDisplayEXT    = PFN_vkGetDrmDisplayEXT( vkGetInstanceProcAddr( instance, "vkGetDrmDisplayEXT" ) );
-      vkGetInstanceProcAddr = PFN_vkGetInstanceProcAddr( vkGetInstanceProcAddr( instance, "vkGetInstanceProcAddr" ) );
-      vkGetPhysicalDeviceCalibrateableTimeDomainsEXT = PFN_vkGetPhysicalDeviceCalibrateableTimeDomainsEXT(
-        vkGetInstanceProcAddr( instance, "vkGetPhysicalDeviceCalibrateableTimeDomainsEXT" ) );
-      vkGetPhysicalDeviceCooperativeMatrixPropertiesNV = PFN_vkGetPhysicalDeviceCooperativeMatrixPropertiesNV(
-        vkGetInstanceProcAddr( instance, "vkGetPhysicalDeviceCooperativeMatrixPropertiesNV" ) );
-#if defined( VK_USE_PLATFORM_DIRECTFB_EXT )
-      vkGetPhysicalDeviceDirectFBPresentationSupportEXT = PFN_vkGetPhysicalDeviceDirectFBPresentationSupportEXT(
-        vkGetInstanceProcAddr( instance, "vkGetPhysicalDeviceDirectFBPresentationSupportEXT" ) );
-#endif /*VK_USE_PLATFORM_DIRECTFB_EXT*/
-      vkGetPhysicalDeviceDisplayPlaneProperties2KHR = PFN_vkGetPhysicalDeviceDisplayPlaneProperties2KHR(
-        vkGetInstanceProcAddr( instance, "vkGetPhysicalDeviceDisplayPlaneProperties2KHR" ) );
-      vkGetPhysicalDeviceDisplayPlanePropertiesKHR = PFN_vkGetPhysicalDeviceDisplayPlanePropertiesKHR(
-        vkGetInstanceProcAddr( instance, "vkGetPhysicalDeviceDisplayPlanePropertiesKHR" ) );
-      vkGetPhysicalDeviceDisplayProperties2KHR = PFN_vkGetPhysicalDeviceDisplayProperties2KHR(
-        vkGetInstanceProcAddr( instance, "vkGetPhysicalDeviceDisplayProperties2KHR" ) );
-      vkGetPhysicalDeviceDisplayPropertiesKHR = PFN_vkGetPhysicalDeviceDisplayPropertiesKHR(
-        vkGetInstanceProcAddr( instance, "vkGetPhysicalDeviceDisplayPropertiesKHR" ) );
-      vkGetPhysicalDeviceExternalBufferProperties = PFN_vkGetPhysicalDeviceExternalBufferProperties(
-        vkGetInstanceProcAddr( instance, "vkGetPhysicalDeviceExternalBufferProperties" ) );
-      vkGetPhysicalDeviceExternalBufferPropertiesKHR = PFN_vkGetPhysicalDeviceExternalBufferPropertiesKHR(
-        vkGetInstanceProcAddr( instance, "vkGetPhysicalDeviceExternalBufferPropertiesKHR" ) );
-      if ( !vkGetPhysicalDeviceExternalBufferProperties )
-        vkGetPhysicalDeviceExternalBufferProperties = vkGetPhysicalDeviceExternalBufferPropertiesKHR;
-      vkGetPhysicalDeviceExternalFenceProperties = PFN_vkGetPhysicalDeviceExternalFenceProperties(
-        vkGetInstanceProcAddr( instance, "vkGetPhysicalDeviceExternalFenceProperties" ) );
-      vkGetPhysicalDeviceExternalFencePropertiesKHR = PFN_vkGetPhysicalDeviceExternalFencePropertiesKHR(
-        vkGetInstanceProcAddr( instance, "vkGetPhysicalDeviceExternalFencePropertiesKHR" ) );
-      if ( !vkGetPhysicalDeviceExternalFenceProperties )
-        vkGetPhysicalDeviceExternalFenceProperties = vkGetPhysicalDeviceExternalFencePropertiesKHR;
-      vkGetPhysicalDeviceExternalImageFormatPropertiesNV = PFN_vkGetPhysicalDeviceExternalImageFormatPropertiesNV(
-        vkGetInstanceProcAddr( instance, "vkGetPhysicalDeviceExternalImageFormatPropertiesNV" ) );
-      vkGetPhysicalDeviceExternalSemaphoreProperties = PFN_vkGetPhysicalDeviceExternalSemaphoreProperties(
-        vkGetInstanceProcAddr( instance, "vkGetPhysicalDeviceExternalSemaphoreProperties" ) );
-      vkGetPhysicalDeviceExternalSemaphorePropertiesKHR = PFN_vkGetPhysicalDeviceExternalSemaphorePropertiesKHR(
-        vkGetInstanceProcAddr( instance, "vkGetPhysicalDeviceExternalSemaphorePropertiesKHR" ) );
-      if ( !vkGetPhysicalDeviceExternalSemaphoreProperties )
-        vkGetPhysicalDeviceExternalSemaphoreProperties = vkGetPhysicalDeviceExternalSemaphorePropertiesKHR;
-      vkGetPhysicalDeviceFeatures =
-        PFN_vkGetPhysicalDeviceFeatures( vkGetInstanceProcAddr( instance, "vkGetPhysicalDeviceFeatures" ) );
-      vkGetPhysicalDeviceFeatures2 =
-        PFN_vkGetPhysicalDeviceFeatures2( vkGetInstanceProcAddr( instance, "vkGetPhysicalDeviceFeatures2" ) );
-      vkGetPhysicalDeviceFeatures2KHR =
-        PFN_vkGetPhysicalDeviceFeatures2KHR( vkGetInstanceProcAddr( instance, "vkGetPhysicalDeviceFeatures2KHR" ) );
-      if ( !vkGetPhysicalDeviceFeatures2 )
-        vkGetPhysicalDeviceFeatures2 = vkGetPhysicalDeviceFeatures2KHR;
-      vkGetPhysicalDeviceFormatProperties = PFN_vkGetPhysicalDeviceFormatProperties(
-        vkGetInstanceProcAddr( instance, "vkGetPhysicalDeviceFormatProperties" ) );
-      vkGetPhysicalDeviceFormatProperties2 = PFN_vkGetPhysicalDeviceFormatProperties2(
-        vkGetInstanceProcAddr( instance, "vkGetPhysicalDeviceFormatProperties2" ) );
-      vkGetPhysicalDeviceFormatProperties2KHR = PFN_vkGetPhysicalDeviceFormatProperties2KHR(
-        vkGetInstanceProcAddr( instance, "vkGetPhysicalDeviceFormatProperties2KHR" ) );
-      if ( !vkGetPhysicalDeviceFormatProperties2 )
-        vkGetPhysicalDeviceFormatProperties2 = vkGetPhysicalDeviceFormatProperties2KHR;
-      vkGetPhysicalDeviceFragmentShadingRatesKHR = PFN_vkGetPhysicalDeviceFragmentShadingRatesKHR(
-        vkGetInstanceProcAddr( instance, "vkGetPhysicalDeviceFragmentShadingRatesKHR" ) );
-      vkGetPhysicalDeviceImageFormatProperties = PFN_vkGetPhysicalDeviceImageFormatProperties(
-        vkGetInstanceProcAddr( instance, "vkGetPhysicalDeviceImageFormatProperties" ) );
-      vkGetPhysicalDeviceImageFormatProperties2 = PFN_vkGetPhysicalDeviceImageFormatProperties2(
-        vkGetInstanceProcAddr( instance, "vkGetPhysicalDeviceImageFormatProperties2" ) );
-      vkGetPhysicalDeviceImageFormatProperties2KHR = PFN_vkGetPhysicalDeviceImageFormatProperties2KHR(
-        vkGetInstanceProcAddr( instance, "vkGetPhysicalDeviceImageFormatProperties2KHR" ) );
-      if ( !vkGetPhysicalDeviceImageFormatProperties2 )
-        vkGetPhysicalDeviceImageFormatProperties2 = vkGetPhysicalDeviceImageFormatProperties2KHR;
-      vkGetPhysicalDeviceMemoryProperties = PFN_vkGetPhysicalDeviceMemoryProperties(
-        vkGetInstanceProcAddr( instance, "vkGetPhysicalDeviceMemoryProperties" ) );
-      vkGetPhysicalDeviceMemoryProperties2 = PFN_vkGetPhysicalDeviceMemoryProperties2(
-        vkGetInstanceProcAddr( instance, "vkGetPhysicalDeviceMemoryProperties2" ) );
-      vkGetPhysicalDeviceMemoryProperties2KHR = PFN_vkGetPhysicalDeviceMemoryProperties2KHR(
-        vkGetInstanceProcAddr( instance, "vkGetPhysicalDeviceMemoryProperties2KHR" ) );
-      if ( !vkGetPhysicalDeviceMemoryProperties2 )
-        vkGetPhysicalDeviceMemoryProperties2 = vkGetPhysicalDeviceMemoryProperties2KHR;
-      vkGetPhysicalDeviceMultisamplePropertiesEXT = PFN_vkGetPhysicalDeviceMultisamplePropertiesEXT(
-        vkGetInstanceProcAddr( instance, "vkGetPhysicalDeviceMultisamplePropertiesEXT" ) );
-      vkGetPhysicalDevicePresentRectanglesKHR = PFN_vkGetPhysicalDevicePresentRectanglesKHR(
-        vkGetInstanceProcAddr( instance, "vkGetPhysicalDevicePresentRectanglesKHR" ) );
-      vkGetPhysicalDeviceProperties =
-        PFN_vkGetPhysicalDeviceProperties( vkGetInstanceProcAddr( instance, "vkGetPhysicalDeviceProperties" ) );
-      vkGetPhysicalDeviceProperties2 =
-        PFN_vkGetPhysicalDeviceProperties2( vkGetInstanceProcAddr( instance, "vkGetPhysicalDeviceProperties2" ) );
-      vkGetPhysicalDeviceProperties2KHR =
-        PFN_vkGetPhysicalDeviceProperties2KHR( vkGetInstanceProcAddr( instance, "vkGetPhysicalDeviceProperties2KHR" ) );
-      if ( !vkGetPhysicalDeviceProperties2 )
-        vkGetPhysicalDeviceProperties2 = vkGetPhysicalDeviceProperties2KHR;
-      vkGetPhysicalDeviceQueueFamilyPerformanceQueryPassesKHR =
-        PFN_vkGetPhysicalDeviceQueueFamilyPerformanceQueryPassesKHR(
-          vkGetInstanceProcAddr( instance, "vkGetPhysicalDeviceQueueFamilyPerformanceQueryPassesKHR" ) );
-      vkGetPhysicalDeviceQueueFamilyProperties = PFN_vkGetPhysicalDeviceQueueFamilyProperties(
-        vkGetInstanceProcAddr( instance, "vkGetPhysicalDeviceQueueFamilyProperties" ) );
-      vkGetPhysicalDeviceQueueFamilyProperties2 = PFN_vkGetPhysicalDeviceQueueFamilyProperties2(
-        vkGetInstanceProcAddr( instance, "vkGetPhysicalDeviceQueueFamilyProperties2" ) );
-      vkGetPhysicalDeviceQueueFamilyProperties2KHR = PFN_vkGetPhysicalDeviceQueueFamilyProperties2KHR(
-        vkGetInstanceProcAddr( instance, "vkGetPhysicalDeviceQueueFamilyProperties2KHR" ) );
-      if ( !vkGetPhysicalDeviceQueueFamilyProperties2 )
-        vkGetPhysicalDeviceQueueFamilyProperties2 = vkGetPhysicalDeviceQueueFamilyProperties2KHR;
-#if defined( VK_USE_PLATFORM_SCREEN_QNX )
-      vkGetPhysicalDeviceScreenPresentationSupportQNX = PFN_vkGetPhysicalDeviceScreenPresentationSupportQNX(
-        vkGetInstanceProcAddr( instance, "vkGetPhysicalDeviceScreenPresentationSupportQNX" ) );
-#endif /*VK_USE_PLATFORM_SCREEN_QNX*/
+      vkGetDeviceQueue = PFN_vkGetDeviceQueue( vkGetInstanceProcAddr( instance, "vkGetDeviceQueue" ) );
+      vkQueueSubmit    = PFN_vkQueueSubmit( vkGetInstanceProcAddr( instance, "vkQueueSubmit" ) );
+      vkQueueWaitIdle  = PFN_vkQueueWaitIdle( vkGetInstanceProcAddr( instance, "vkQueueWaitIdle" ) );
+      vkDeviceWaitIdle = PFN_vkDeviceWaitIdle( vkGetInstanceProcAddr( instance, "vkDeviceWaitIdle" ) );
+      vkAllocateMemory = PFN_vkAllocateMemory( vkGetInstanceProcAddr( instance, "vkAllocateMemory" ) );
+      vkFreeMemory     = PFN_vkFreeMemory( vkGetInstanceProcAddr( instance, "vkFreeMemory" ) );
+      vkMapMemory      = PFN_vkMapMemory( vkGetInstanceProcAddr( instance, "vkMapMemory" ) );
+      vkUnmapMemory    = PFN_vkUnmapMemory( vkGetInstanceProcAddr( instance, "vkUnmapMemory" ) );
+      vkFlushMappedMemoryRanges =
+        PFN_vkFlushMappedMemoryRanges( vkGetInstanceProcAddr( instance, "vkFlushMappedMemoryRanges" ) );
+      vkInvalidateMappedMemoryRanges =
+        PFN_vkInvalidateMappedMemoryRanges( vkGetInstanceProcAddr( instance, "vkInvalidateMappedMemoryRanges" ) );
+      vkGetDeviceMemoryCommitment =
+        PFN_vkGetDeviceMemoryCommitment( vkGetInstanceProcAddr( instance, "vkGetDeviceMemoryCommitment" ) );
+      vkBindBufferMemory = PFN_vkBindBufferMemory( vkGetInstanceProcAddr( instance, "vkBindBufferMemory" ) );
+      vkBindImageMemory  = PFN_vkBindImageMemory( vkGetInstanceProcAddr( instance, "vkBindImageMemory" ) );
+      vkGetBufferMemoryRequirements =
+        PFN_vkGetBufferMemoryRequirements( vkGetInstanceProcAddr( instance, "vkGetBufferMemoryRequirements" ) );
+      vkGetImageMemoryRequirements =
+        PFN_vkGetImageMemoryRequirements( vkGetInstanceProcAddr( instance, "vkGetImageMemoryRequirements" ) );
+      vkGetImageSparseMemoryRequirements = PFN_vkGetImageSparseMemoryRequirements(
+        vkGetInstanceProcAddr( instance, "vkGetImageSparseMemoryRequirements" ) );
       vkGetPhysicalDeviceSparseImageFormatProperties = PFN_vkGetPhysicalDeviceSparseImageFormatProperties(
         vkGetInstanceProcAddr( instance, "vkGetPhysicalDeviceSparseImageFormatProperties" ) );
-      vkGetPhysicalDeviceSparseImageFormatProperties2 = PFN_vkGetPhysicalDeviceSparseImageFormatProperties2(
-        vkGetInstanceProcAddr( instance, "vkGetPhysicalDeviceSparseImageFormatProperties2" ) );
-      vkGetPhysicalDeviceSparseImageFormatProperties2KHR = PFN_vkGetPhysicalDeviceSparseImageFormatProperties2KHR(
-        vkGetInstanceProcAddr( instance, "vkGetPhysicalDeviceSparseImageFormatProperties2KHR" ) );
-      if ( !vkGetPhysicalDeviceSparseImageFormatProperties2 )
-        vkGetPhysicalDeviceSparseImageFormatProperties2 = vkGetPhysicalDeviceSparseImageFormatProperties2KHR;
-      vkGetPhysicalDeviceSupportedFramebufferMixedSamplesCombinationsNV =
-        PFN_vkGetPhysicalDeviceSupportedFramebufferMixedSamplesCombinationsNV(
-          vkGetInstanceProcAddr( instance, "vkGetPhysicalDeviceSupportedFramebufferMixedSamplesCombinationsNV" ) );
-      vkGetPhysicalDeviceSurfaceCapabilities2EXT = PFN_vkGetPhysicalDeviceSurfaceCapabilities2EXT(
-        vkGetInstanceProcAddr( instance, "vkGetPhysicalDeviceSurfaceCapabilities2EXT" ) );
-      vkGetPhysicalDeviceSurfaceCapabilities2KHR = PFN_vkGetPhysicalDeviceSurfaceCapabilities2KHR(
-        vkGetInstanceProcAddr( instance, "vkGetPhysicalDeviceSurfaceCapabilities2KHR" ) );
-      vkGetPhysicalDeviceSurfaceCapabilitiesKHR = PFN_vkGetPhysicalDeviceSurfaceCapabilitiesKHR(
-        vkGetInstanceProcAddr( instance, "vkGetPhysicalDeviceSurfaceCapabilitiesKHR" ) );
-      vkGetPhysicalDeviceSurfaceFormats2KHR = PFN_vkGetPhysicalDeviceSurfaceFormats2KHR(
-        vkGetInstanceProcAddr( instance, "vkGetPhysicalDeviceSurfaceFormats2KHR" ) );
-      vkGetPhysicalDeviceSurfaceFormatsKHR = PFN_vkGetPhysicalDeviceSurfaceFormatsKHR(
-        vkGetInstanceProcAddr( instance, "vkGetPhysicalDeviceSurfaceFormatsKHR" ) );
-#if defined( VK_USE_PLATFORM_WIN32_KHR )
-      vkGetPhysicalDeviceSurfacePresentModes2EXT = PFN_vkGetPhysicalDeviceSurfacePresentModes2EXT(
-        vkGetInstanceProcAddr( instance, "vkGetPhysicalDeviceSurfacePresentModes2EXT" ) );
-#endif /*VK_USE_PLATFORM_WIN32_KHR*/
-      vkGetPhysicalDeviceSurfacePresentModesKHR = PFN_vkGetPhysicalDeviceSurfacePresentModesKHR(
-        vkGetInstanceProcAddr( instance, "vkGetPhysicalDeviceSurfacePresentModesKHR" ) );
-      vkGetPhysicalDeviceSurfaceSupportKHR = PFN_vkGetPhysicalDeviceSurfaceSupportKHR(
-        vkGetInstanceProcAddr( instance, "vkGetPhysicalDeviceSurfaceSupportKHR" ) );
-      vkGetPhysicalDeviceToolPropertiesEXT = PFN_vkGetPhysicalDeviceToolPropertiesEXT(
-        vkGetInstanceProcAddr( instance, "vkGetPhysicalDeviceToolPropertiesEXT" ) );
-#if defined( VK_ENABLE_BETA_EXTENSIONS )
-      vkGetPhysicalDeviceVideoCapabilitiesKHR = PFN_vkGetPhysicalDeviceVideoCapabilitiesKHR(
-        vkGetInstanceProcAddr( instance, "vkGetPhysicalDeviceVideoCapabilitiesKHR" ) );
-#endif /*VK_ENABLE_BETA_EXTENSIONS*/
-#if defined( VK_ENABLE_BETA_EXTENSIONS )
-      vkGetPhysicalDeviceVideoFormatPropertiesKHR = PFN_vkGetPhysicalDeviceVideoFormatPropertiesKHR(
-        vkGetInstanceProcAddr( instance, "vkGetPhysicalDeviceVideoFormatPropertiesKHR" ) );
-#endif /*VK_ENABLE_BETA_EXTENSIONS*/
-#if defined( VK_USE_PLATFORM_WAYLAND_KHR )
-      vkGetPhysicalDeviceWaylandPresentationSupportKHR = PFN_vkGetPhysicalDeviceWaylandPresentationSupportKHR(
-        vkGetInstanceProcAddr( instance, "vkGetPhysicalDeviceWaylandPresentationSupportKHR" ) );
-#endif /*VK_USE_PLATFORM_WAYLAND_KHR*/
-#if defined( VK_USE_PLATFORM_WIN32_KHR )
-      vkGetPhysicalDeviceWin32PresentationSupportKHR = PFN_vkGetPhysicalDeviceWin32PresentationSupportKHR(
-        vkGetInstanceProcAddr( instance, "vkGetPhysicalDeviceWin32PresentationSupportKHR" ) );
-#endif /*VK_USE_PLATFORM_WIN32_KHR*/
-#if defined( VK_USE_PLATFORM_XCB_KHR )
-      vkGetPhysicalDeviceXcbPresentationSupportKHR = PFN_vkGetPhysicalDeviceXcbPresentationSupportKHR(
-        vkGetInstanceProcAddr( instance, "vkGetPhysicalDeviceXcbPresentationSupportKHR" ) );
-#endif /*VK_USE_PLATFORM_XCB_KHR*/
-#if defined( VK_USE_PLATFORM_XLIB_KHR )
-      vkGetPhysicalDeviceXlibPresentationSupportKHR = PFN_vkGetPhysicalDeviceXlibPresentationSupportKHR(
-        vkGetInstanceProcAddr( instance, "vkGetPhysicalDeviceXlibPresentationSupportKHR" ) );
-#endif /*VK_USE_PLATFORM_XLIB_KHR*/
-#if defined( VK_USE_PLATFORM_XLIB_XRANDR_EXT )
-      vkGetRandROutputDisplayEXT =
-        PFN_vkGetRandROutputDisplayEXT( vkGetInstanceProcAddr( instance, "vkGetRandROutputDisplayEXT" ) );
-#endif /*VK_USE_PLATFORM_XLIB_XRANDR_EXT*/
-#if defined( VK_USE_PLATFORM_WIN32_KHR )
-      vkGetWinrtDisplayNV = PFN_vkGetWinrtDisplayNV( vkGetInstanceProcAddr( instance, "vkGetWinrtDisplayNV" ) );
-#endif /*VK_USE_PLATFORM_WIN32_KHR*/
-      vkReleaseDisplayEXT = PFN_vkReleaseDisplayEXT( vkGetInstanceProcAddr( instance, "vkReleaseDisplayEXT" ) );
-      vkSubmitDebugUtilsMessageEXT =
-        PFN_vkSubmitDebugUtilsMessageEXT( vkGetInstanceProcAddr( instance, "vkSubmitDebugUtilsMessageEXT" ) );
-#if defined( VK_USE_PLATFORM_WIN32_KHR )
-      vkAcquireFullScreenExclusiveModeEXT = PFN_vkAcquireFullScreenExclusiveModeEXT(
-        vkGetInstanceProcAddr( instance, "vkAcquireFullScreenExclusiveModeEXT" ) );
-#endif /*VK_USE_PLATFORM_WIN32_KHR*/
-      vkAcquireNextImage2KHR =
-        PFN_vkAcquireNextImage2KHR( vkGetInstanceProcAddr( instance, "vkAcquireNextImage2KHR" ) );
-      vkAcquireNextImageKHR = PFN_vkAcquireNextImageKHR( vkGetInstanceProcAddr( instance, "vkAcquireNextImageKHR" ) );
-      vkAcquirePerformanceConfigurationINTEL = PFN_vkAcquirePerformanceConfigurationINTEL(
-        vkGetInstanceProcAddr( instance, "vkAcquirePerformanceConfigurationINTEL" ) );
-      vkAcquireProfilingLockKHR =
-        PFN_vkAcquireProfilingLockKHR( vkGetInstanceProcAddr( instance, "vkAcquireProfilingLockKHR" ) );
-      vkAllocateCommandBuffers =
-        PFN_vkAllocateCommandBuffers( vkGetInstanceProcAddr( instance, "vkAllocateCommandBuffers" ) );
+      vkQueueBindSparse     = PFN_vkQueueBindSparse( vkGetInstanceProcAddr( instance, "vkQueueBindSparse" ) );
+      vkCreateFence         = PFN_vkCreateFence( vkGetInstanceProcAddr( instance, "vkCreateFence" ) );
+      vkDestroyFence        = PFN_vkDestroyFence( vkGetInstanceProcAddr( instance, "vkDestroyFence" ) );
+      vkResetFences         = PFN_vkResetFences( vkGetInstanceProcAddr( instance, "vkResetFences" ) );
+      vkGetFenceStatus      = PFN_vkGetFenceStatus( vkGetInstanceProcAddr( instance, "vkGetFenceStatus" ) );
+      vkWaitForFences       = PFN_vkWaitForFences( vkGetInstanceProcAddr( instance, "vkWaitForFences" ) );
+      vkCreateSemaphore     = PFN_vkCreateSemaphore( vkGetInstanceProcAddr( instance, "vkCreateSemaphore" ) );
+      vkDestroySemaphore    = PFN_vkDestroySemaphore( vkGetInstanceProcAddr( instance, "vkDestroySemaphore" ) );
+      vkCreateEvent         = PFN_vkCreateEvent( vkGetInstanceProcAddr( instance, "vkCreateEvent" ) );
+      vkDestroyEvent        = PFN_vkDestroyEvent( vkGetInstanceProcAddr( instance, "vkDestroyEvent" ) );
+      vkGetEventStatus      = PFN_vkGetEventStatus( vkGetInstanceProcAddr( instance, "vkGetEventStatus" ) );
+      vkSetEvent            = PFN_vkSetEvent( vkGetInstanceProcAddr( instance, "vkSetEvent" ) );
+      vkResetEvent          = PFN_vkResetEvent( vkGetInstanceProcAddr( instance, "vkResetEvent" ) );
+      vkCreateQueryPool     = PFN_vkCreateQueryPool( vkGetInstanceProcAddr( instance, "vkCreateQueryPool" ) );
+      vkDestroyQueryPool    = PFN_vkDestroyQueryPool( vkGetInstanceProcAddr( instance, "vkDestroyQueryPool" ) );
+      vkGetQueryPoolResults = PFN_vkGetQueryPoolResults( vkGetInstanceProcAddr( instance, "vkGetQueryPoolResults" ) );
+      vkCreateBuffer        = PFN_vkCreateBuffer( vkGetInstanceProcAddr( instance, "vkCreateBuffer" ) );
+      vkDestroyBuffer       = PFN_vkDestroyBuffer( vkGetInstanceProcAddr( instance, "vkDestroyBuffer" ) );
+      vkCreateBufferView    = PFN_vkCreateBufferView( vkGetInstanceProcAddr( instance, "vkCreateBufferView" ) );
+      vkDestroyBufferView   = PFN_vkDestroyBufferView( vkGetInstanceProcAddr( instance, "vkDestroyBufferView" ) );
+      vkCreateImage         = PFN_vkCreateImage( vkGetInstanceProcAddr( instance, "vkCreateImage" ) );
+      vkDestroyImage        = PFN_vkDestroyImage( vkGetInstanceProcAddr( instance, "vkDestroyImage" ) );
+      vkGetImageSubresourceLayout =
+        PFN_vkGetImageSubresourceLayout( vkGetInstanceProcAddr( instance, "vkGetImageSubresourceLayout" ) );
+      vkCreateImageView     = PFN_vkCreateImageView( vkGetInstanceProcAddr( instance, "vkCreateImageView" ) );
+      vkDestroyImageView    = PFN_vkDestroyImageView( vkGetInstanceProcAddr( instance, "vkDestroyImageView" ) );
+      vkCreateShaderModule  = PFN_vkCreateShaderModule( vkGetInstanceProcAddr( instance, "vkCreateShaderModule" ) );
+      vkDestroyShaderModule = PFN_vkDestroyShaderModule( vkGetInstanceProcAddr( instance, "vkDestroyShaderModule" ) );
+      vkCreatePipelineCache = PFN_vkCreatePipelineCache( vkGetInstanceProcAddr( instance, "vkCreatePipelineCache" ) );
+      vkDestroyPipelineCache =
+        PFN_vkDestroyPipelineCache( vkGetInstanceProcAddr( instance, "vkDestroyPipelineCache" ) );
+      vkGetPipelineCacheData =
+        PFN_vkGetPipelineCacheData( vkGetInstanceProcAddr( instance, "vkGetPipelineCacheData" ) );
+      vkMergePipelineCaches = PFN_vkMergePipelineCaches( vkGetInstanceProcAddr( instance, "vkMergePipelineCaches" ) );
+      vkCreateGraphicsPipelines =
+        PFN_vkCreateGraphicsPipelines( vkGetInstanceProcAddr( instance, "vkCreateGraphicsPipelines" ) );
+      vkCreateComputePipelines =
+        PFN_vkCreateComputePipelines( vkGetInstanceProcAddr( instance, "vkCreateComputePipelines" ) );
+      vkDestroyPipeline = PFN_vkDestroyPipeline( vkGetInstanceProcAddr( instance, "vkDestroyPipeline" ) );
+      vkCreatePipelineLayout =
+        PFN_vkCreatePipelineLayout( vkGetInstanceProcAddr( instance, "vkCreatePipelineLayout" ) );
+      vkDestroyPipelineLayout =
+        PFN_vkDestroyPipelineLayout( vkGetInstanceProcAddr( instance, "vkDestroyPipelineLayout" ) );
+      vkCreateSampler  = PFN_vkCreateSampler( vkGetInstanceProcAddr( instance, "vkCreateSampler" ) );
+      vkDestroySampler = PFN_vkDestroySampler( vkGetInstanceProcAddr( instance, "vkDestroySampler" ) );
+      vkCreateDescriptorSetLayout =
+        PFN_vkCreateDescriptorSetLayout( vkGetInstanceProcAddr( instance, "vkCreateDescriptorSetLayout" ) );
+      vkDestroyDescriptorSetLayout =
+        PFN_vkDestroyDescriptorSetLayout( vkGetInstanceProcAddr( instance, "vkDestroyDescriptorSetLayout" ) );
+      vkCreateDescriptorPool =
+        PFN_vkCreateDescriptorPool( vkGetInstanceProcAddr( instance, "vkCreateDescriptorPool" ) );
+      vkDestroyDescriptorPool =
+        PFN_vkDestroyDescriptorPool( vkGetInstanceProcAddr( instance, "vkDestroyDescriptorPool" ) );
+      vkResetDescriptorPool = PFN_vkResetDescriptorPool( vkGetInstanceProcAddr( instance, "vkResetDescriptorPool" ) );
       vkAllocateDescriptorSets =
         PFN_vkAllocateDescriptorSets( vkGetInstanceProcAddr( instance, "vkAllocateDescriptorSets" ) );
-      vkAllocateMemory     = PFN_vkAllocateMemory( vkGetInstanceProcAddr( instance, "vkAllocateMemory" ) );
+      vkFreeDescriptorSets = PFN_vkFreeDescriptorSets( vkGetInstanceProcAddr( instance, "vkFreeDescriptorSets" ) );
+      vkUpdateDescriptorSets =
+        PFN_vkUpdateDescriptorSets( vkGetInstanceProcAddr( instance, "vkUpdateDescriptorSets" ) );
+      vkCreateFramebuffer  = PFN_vkCreateFramebuffer( vkGetInstanceProcAddr( instance, "vkCreateFramebuffer" ) );
+      vkDestroyFramebuffer = PFN_vkDestroyFramebuffer( vkGetInstanceProcAddr( instance, "vkDestroyFramebuffer" ) );
+      vkCreateRenderPass   = PFN_vkCreateRenderPass( vkGetInstanceProcAddr( instance, "vkCreateRenderPass" ) );
+      vkDestroyRenderPass  = PFN_vkDestroyRenderPass( vkGetInstanceProcAddr( instance, "vkDestroyRenderPass" ) );
+      vkGetRenderAreaGranularity =
+        PFN_vkGetRenderAreaGranularity( vkGetInstanceProcAddr( instance, "vkGetRenderAreaGranularity" ) );
+      vkCreateCommandPool  = PFN_vkCreateCommandPool( vkGetInstanceProcAddr( instance, "vkCreateCommandPool" ) );
+      vkDestroyCommandPool = PFN_vkDestroyCommandPool( vkGetInstanceProcAddr( instance, "vkDestroyCommandPool" ) );
+      vkResetCommandPool   = PFN_vkResetCommandPool( vkGetInstanceProcAddr( instance, "vkResetCommandPool" ) );
+      vkAllocateCommandBuffers =
+        PFN_vkAllocateCommandBuffers( vkGetInstanceProcAddr( instance, "vkAllocateCommandBuffers" ) );
+      vkFreeCommandBuffers = PFN_vkFreeCommandBuffers( vkGetInstanceProcAddr( instance, "vkFreeCommandBuffers" ) );
       vkBeginCommandBuffer = PFN_vkBeginCommandBuffer( vkGetInstanceProcAddr( instance, "vkBeginCommandBuffer" ) );
-      vkBindAccelerationStructureMemoryNV = PFN_vkBindAccelerationStructureMemoryNV(
-        vkGetInstanceProcAddr( instance, "vkBindAccelerationStructureMemoryNV" ) );
-      vkBindBufferMemory  = PFN_vkBindBufferMemory( vkGetInstanceProcAddr( instance, "vkBindBufferMemory" ) );
-      vkBindBufferMemory2 = PFN_vkBindBufferMemory2( vkGetInstanceProcAddr( instance, "vkBindBufferMemory2" ) );
-      vkBindBufferMemory2KHR =
-        PFN_vkBindBufferMemory2KHR( vkGetInstanceProcAddr( instance, "vkBindBufferMemory2KHR" ) );
-      if ( !vkBindBufferMemory2 )
-        vkBindBufferMemory2 = vkBindBufferMemory2KHR;
-      vkBindImageMemory     = PFN_vkBindImageMemory( vkGetInstanceProcAddr( instance, "vkBindImageMemory" ) );
-      vkBindImageMemory2    = PFN_vkBindImageMemory2( vkGetInstanceProcAddr( instance, "vkBindImageMemory2" ) );
-      vkBindImageMemory2KHR = PFN_vkBindImageMemory2KHR( vkGetInstanceProcAddr( instance, "vkBindImageMemory2KHR" ) );
-      if ( !vkBindImageMemory2 )
-        vkBindImageMemory2 = vkBindImageMemory2KHR;
-#if defined( VK_ENABLE_BETA_EXTENSIONS )
-      vkBindVideoSessionMemoryKHR =
-        PFN_vkBindVideoSessionMemoryKHR( vkGetInstanceProcAddr( instance, "vkBindVideoSessionMemoryKHR" ) );
-#endif /*VK_ENABLE_BETA_EXTENSIONS*/
-      vkBuildAccelerationStructuresKHR =
-        PFN_vkBuildAccelerationStructuresKHR( vkGetInstanceProcAddr( instance, "vkBuildAccelerationStructuresKHR" ) );
-      vkCmdBeginConditionalRenderingEXT =
-        PFN_vkCmdBeginConditionalRenderingEXT( vkGetInstanceProcAddr( instance, "vkCmdBeginConditionalRenderingEXT" ) );
-      vkCmdBeginDebugUtilsLabelEXT =
-        PFN_vkCmdBeginDebugUtilsLabelEXT( vkGetInstanceProcAddr( instance, "vkCmdBeginDebugUtilsLabelEXT" ) );
-      vkCmdBeginQuery = PFN_vkCmdBeginQuery( vkGetInstanceProcAddr( instance, "vkCmdBeginQuery" ) );
-      vkCmdBeginQueryIndexedEXT =
-        PFN_vkCmdBeginQueryIndexedEXT( vkGetInstanceProcAddr( instance, "vkCmdBeginQueryIndexedEXT" ) );
-      vkCmdBeginRenderPass  = PFN_vkCmdBeginRenderPass( vkGetInstanceProcAddr( instance, "vkCmdBeginRenderPass" ) );
-      vkCmdBeginRenderPass2 = PFN_vkCmdBeginRenderPass2( vkGetInstanceProcAddr( instance, "vkCmdBeginRenderPass2" ) );
-      vkCmdBeginRenderPass2KHR =
-        PFN_vkCmdBeginRenderPass2KHR( vkGetInstanceProcAddr( instance, "vkCmdBeginRenderPass2KHR" ) );
-      if ( !vkCmdBeginRenderPass2 )
-        vkCmdBeginRenderPass2 = vkCmdBeginRenderPass2KHR;
-      vkCmdBeginTransformFeedbackEXT =
-        PFN_vkCmdBeginTransformFeedbackEXT( vkGetInstanceProcAddr( instance, "vkCmdBeginTransformFeedbackEXT" ) );
-#if defined( VK_ENABLE_BETA_EXTENSIONS )
-      vkCmdBeginVideoCodingKHR =
-        PFN_vkCmdBeginVideoCodingKHR( vkGetInstanceProcAddr( instance, "vkCmdBeginVideoCodingKHR" ) );
-#endif /*VK_ENABLE_BETA_EXTENSIONS*/
+      vkEndCommandBuffer   = PFN_vkEndCommandBuffer( vkGetInstanceProcAddr( instance, "vkEndCommandBuffer" ) );
+      vkResetCommandBuffer = PFN_vkResetCommandBuffer( vkGetInstanceProcAddr( instance, "vkResetCommandBuffer" ) );
+      vkCmdBindPipeline    = PFN_vkCmdBindPipeline( vkGetInstanceProcAddr( instance, "vkCmdBindPipeline" ) );
+      vkCmdSetViewport     = PFN_vkCmdSetViewport( vkGetInstanceProcAddr( instance, "vkCmdSetViewport" ) );
+      vkCmdSetScissor      = PFN_vkCmdSetScissor( vkGetInstanceProcAddr( instance, "vkCmdSetScissor" ) );
+      vkCmdSetLineWidth    = PFN_vkCmdSetLineWidth( vkGetInstanceProcAddr( instance, "vkCmdSetLineWidth" ) );
+      vkCmdSetDepthBias    = PFN_vkCmdSetDepthBias( vkGetInstanceProcAddr( instance, "vkCmdSetDepthBias" ) );
+      vkCmdSetBlendConstants =
+        PFN_vkCmdSetBlendConstants( vkGetInstanceProcAddr( instance, "vkCmdSetBlendConstants" ) );
+      vkCmdSetDepthBounds = PFN_vkCmdSetDepthBounds( vkGetInstanceProcAddr( instance, "vkCmdSetDepthBounds" ) );
+      vkCmdSetStencilCompareMask =
+        PFN_vkCmdSetStencilCompareMask( vkGetInstanceProcAddr( instance, "vkCmdSetStencilCompareMask" ) );
+      vkCmdSetStencilWriteMask =
+        PFN_vkCmdSetStencilWriteMask( vkGetInstanceProcAddr( instance, "vkCmdSetStencilWriteMask" ) );
+      vkCmdSetStencilReference =
+        PFN_vkCmdSetStencilReference( vkGetInstanceProcAddr( instance, "vkCmdSetStencilReference" ) );
       vkCmdBindDescriptorSets =
         PFN_vkCmdBindDescriptorSets( vkGetInstanceProcAddr( instance, "vkCmdBindDescriptorSets" ) );
       vkCmdBindIndexBuffer = PFN_vkCmdBindIndexBuffer( vkGetInstanceProcAddr( instance, "vkCmdBindIndexBuffer" ) );
-      vkCmdBindPipeline    = PFN_vkCmdBindPipeline( vkGetInstanceProcAddr( instance, "vkCmdBindPipeline" ) );
-      vkCmdBindPipelineShaderGroupNV =
-        PFN_vkCmdBindPipelineShaderGroupNV( vkGetInstanceProcAddr( instance, "vkCmdBindPipelineShaderGroupNV" ) );
-      vkCmdBindShadingRateImageNV =
-        PFN_vkCmdBindShadingRateImageNV( vkGetInstanceProcAddr( instance, "vkCmdBindShadingRateImageNV" ) );
-      vkCmdBindTransformFeedbackBuffersEXT = PFN_vkCmdBindTransformFeedbackBuffersEXT(
-        vkGetInstanceProcAddr( instance, "vkCmdBindTransformFeedbackBuffersEXT" ) );
       vkCmdBindVertexBuffers =
         PFN_vkCmdBindVertexBuffers( vkGetInstanceProcAddr( instance, "vkCmdBindVertexBuffers" ) );
-      vkCmdBindVertexBuffers2EXT =
-        PFN_vkCmdBindVertexBuffers2EXT( vkGetInstanceProcAddr( instance, "vkCmdBindVertexBuffers2EXT" ) );
-      vkCmdBlitImage     = PFN_vkCmdBlitImage( vkGetInstanceProcAddr( instance, "vkCmdBlitImage" ) );
-      vkCmdBlitImage2KHR = PFN_vkCmdBlitImage2KHR( vkGetInstanceProcAddr( instance, "vkCmdBlitImage2KHR" ) );
-      vkCmdBuildAccelerationStructureNV =
-        PFN_vkCmdBuildAccelerationStructureNV( vkGetInstanceProcAddr( instance, "vkCmdBuildAccelerationStructureNV" ) );
-      vkCmdBuildAccelerationStructuresIndirectKHR = PFN_vkCmdBuildAccelerationStructuresIndirectKHR(
-        vkGetInstanceProcAddr( instance, "vkCmdBuildAccelerationStructuresIndirectKHR" ) );
-      vkCmdBuildAccelerationStructuresKHR = PFN_vkCmdBuildAccelerationStructuresKHR(
-        vkGetInstanceProcAddr( instance, "vkCmdBuildAccelerationStructuresKHR" ) );
-      vkCmdClearAttachments = PFN_vkCmdClearAttachments( vkGetInstanceProcAddr( instance, "vkCmdClearAttachments" ) );
-      vkCmdClearColorImage  = PFN_vkCmdClearColorImage( vkGetInstanceProcAddr( instance, "vkCmdClearColorImage" ) );
-      vkCmdClearDepthStencilImage =
-        PFN_vkCmdClearDepthStencilImage( vkGetInstanceProcAddr( instance, "vkCmdClearDepthStencilImage" ) );
-#if defined( VK_ENABLE_BETA_EXTENSIONS )
-      vkCmdControlVideoCodingKHR =
-        PFN_vkCmdControlVideoCodingKHR( vkGetInstanceProcAddr( instance, "vkCmdControlVideoCodingKHR" ) );
-#endif /*VK_ENABLE_BETA_EXTENSIONS*/
-      vkCmdCopyAccelerationStructureKHR =
-        PFN_vkCmdCopyAccelerationStructureKHR( vkGetInstanceProcAddr( instance, "vkCmdCopyAccelerationStructureKHR" ) );
-      vkCmdCopyAccelerationStructureNV =
-        PFN_vkCmdCopyAccelerationStructureNV( vkGetInstanceProcAddr( instance, "vkCmdCopyAccelerationStructureNV" ) );
-      vkCmdCopyAccelerationStructureToMemoryKHR = PFN_vkCmdCopyAccelerationStructureToMemoryKHR(
-        vkGetInstanceProcAddr( instance, "vkCmdCopyAccelerationStructureToMemoryKHR" ) );
-      vkCmdCopyBuffer     = PFN_vkCmdCopyBuffer( vkGetInstanceProcAddr( instance, "vkCmdCopyBuffer" ) );
-      vkCmdCopyBuffer2KHR = PFN_vkCmdCopyBuffer2KHR( vkGetInstanceProcAddr( instance, "vkCmdCopyBuffer2KHR" ) );
+      vkCmdDraw         = PFN_vkCmdDraw( vkGetInstanceProcAddr( instance, "vkCmdDraw" ) );
+      vkCmdDrawIndexed  = PFN_vkCmdDrawIndexed( vkGetInstanceProcAddr( instance, "vkCmdDrawIndexed" ) );
+      vkCmdDrawIndirect = PFN_vkCmdDrawIndirect( vkGetInstanceProcAddr( instance, "vkCmdDrawIndirect" ) );
+      vkCmdDrawIndexedIndirect =
+        PFN_vkCmdDrawIndexedIndirect( vkGetInstanceProcAddr( instance, "vkCmdDrawIndexedIndirect" ) );
+      vkCmdDispatch         = PFN_vkCmdDispatch( vkGetInstanceProcAddr( instance, "vkCmdDispatch" ) );
+      vkCmdDispatchIndirect = PFN_vkCmdDispatchIndirect( vkGetInstanceProcAddr( instance, "vkCmdDispatchIndirect" ) );
+      vkCmdCopyBuffer       = PFN_vkCmdCopyBuffer( vkGetInstanceProcAddr( instance, "vkCmdCopyBuffer" ) );
+      vkCmdCopyImage        = PFN_vkCmdCopyImage( vkGetInstanceProcAddr( instance, "vkCmdCopyImage" ) );
+      vkCmdBlitImage        = PFN_vkCmdBlitImage( vkGetInstanceProcAddr( instance, "vkCmdBlitImage" ) );
       vkCmdCopyBufferToImage =
         PFN_vkCmdCopyBufferToImage( vkGetInstanceProcAddr( instance, "vkCmdCopyBufferToImage" ) );
-      vkCmdCopyBufferToImage2KHR =
-        PFN_vkCmdCopyBufferToImage2KHR( vkGetInstanceProcAddr( instance, "vkCmdCopyBufferToImage2KHR" ) );
-      vkCmdCopyImage     = PFN_vkCmdCopyImage( vkGetInstanceProcAddr( instance, "vkCmdCopyImage" ) );
-      vkCmdCopyImage2KHR = PFN_vkCmdCopyImage2KHR( vkGetInstanceProcAddr( instance, "vkCmdCopyImage2KHR" ) );
       vkCmdCopyImageToBuffer =
         PFN_vkCmdCopyImageToBuffer( vkGetInstanceProcAddr( instance, "vkCmdCopyImageToBuffer" ) );
-      vkCmdCopyImageToBuffer2KHR =
-        PFN_vkCmdCopyImageToBuffer2KHR( vkGetInstanceProcAddr( instance, "vkCmdCopyImageToBuffer2KHR" ) );
-      vkCmdCopyMemoryToAccelerationStructureKHR = PFN_vkCmdCopyMemoryToAccelerationStructureKHR(
-        vkGetInstanceProcAddr( instance, "vkCmdCopyMemoryToAccelerationStructureKHR" ) );
+      vkCmdUpdateBuffer    = PFN_vkCmdUpdateBuffer( vkGetInstanceProcAddr( instance, "vkCmdUpdateBuffer" ) );
+      vkCmdFillBuffer      = PFN_vkCmdFillBuffer( vkGetInstanceProcAddr( instance, "vkCmdFillBuffer" ) );
+      vkCmdClearColorImage = PFN_vkCmdClearColorImage( vkGetInstanceProcAddr( instance, "vkCmdClearColorImage" ) );
+      vkCmdClearDepthStencilImage =
+        PFN_vkCmdClearDepthStencilImage( vkGetInstanceProcAddr( instance, "vkCmdClearDepthStencilImage" ) );
+      vkCmdClearAttachments = PFN_vkCmdClearAttachments( vkGetInstanceProcAddr( instance, "vkCmdClearAttachments" ) );
+      vkCmdResolveImage     = PFN_vkCmdResolveImage( vkGetInstanceProcAddr( instance, "vkCmdResolveImage" ) );
+      vkCmdSetEvent         = PFN_vkCmdSetEvent( vkGetInstanceProcAddr( instance, "vkCmdSetEvent" ) );
+      vkCmdResetEvent       = PFN_vkCmdResetEvent( vkGetInstanceProcAddr( instance, "vkCmdResetEvent" ) );
+      vkCmdWaitEvents       = PFN_vkCmdWaitEvents( vkGetInstanceProcAddr( instance, "vkCmdWaitEvents" ) );
+      vkCmdPipelineBarrier  = PFN_vkCmdPipelineBarrier( vkGetInstanceProcAddr( instance, "vkCmdPipelineBarrier" ) );
+      vkCmdBeginQuery       = PFN_vkCmdBeginQuery( vkGetInstanceProcAddr( instance, "vkCmdBeginQuery" ) );
+      vkCmdEndQuery         = PFN_vkCmdEndQuery( vkGetInstanceProcAddr( instance, "vkCmdEndQuery" ) );
+      vkCmdResetQueryPool   = PFN_vkCmdResetQueryPool( vkGetInstanceProcAddr( instance, "vkCmdResetQueryPool" ) );
+      vkCmdWriteTimestamp   = PFN_vkCmdWriteTimestamp( vkGetInstanceProcAddr( instance, "vkCmdWriteTimestamp" ) );
       vkCmdCopyQueryPoolResults =
         PFN_vkCmdCopyQueryPoolResults( vkGetInstanceProcAddr( instance, "vkCmdCopyQueryPoolResults" ) );
-      vkCmdCuLaunchKernelNVX =
-        PFN_vkCmdCuLaunchKernelNVX( vkGetInstanceProcAddr( instance, "vkCmdCuLaunchKernelNVX" ) );
+      vkCmdPushConstants   = PFN_vkCmdPushConstants( vkGetInstanceProcAddr( instance, "vkCmdPushConstants" ) );
+      vkCmdBeginRenderPass = PFN_vkCmdBeginRenderPass( vkGetInstanceProcAddr( instance, "vkCmdBeginRenderPass" ) );
+      vkCmdNextSubpass     = PFN_vkCmdNextSubpass( vkGetInstanceProcAddr( instance, "vkCmdNextSubpass" ) );
+      vkCmdEndRenderPass   = PFN_vkCmdEndRenderPass( vkGetInstanceProcAddr( instance, "vkCmdEndRenderPass" ) );
+      vkCmdExecuteCommands = PFN_vkCmdExecuteCommands( vkGetInstanceProcAddr( instance, "vkCmdExecuteCommands" ) );
+
+      //=== VK_VERSION_1_1 ===
+      vkBindBufferMemory2 = PFN_vkBindBufferMemory2( vkGetInstanceProcAddr( instance, "vkBindBufferMemory2" ) );
+      vkBindImageMemory2  = PFN_vkBindImageMemory2( vkGetInstanceProcAddr( instance, "vkBindImageMemory2" ) );
+      vkGetDeviceGroupPeerMemoryFeatures = PFN_vkGetDeviceGroupPeerMemoryFeatures(
+        vkGetInstanceProcAddr( instance, "vkGetDeviceGroupPeerMemoryFeatures" ) );
+      vkCmdSetDeviceMask = PFN_vkCmdSetDeviceMask( vkGetInstanceProcAddr( instance, "vkCmdSetDeviceMask" ) );
+      vkCmdDispatchBase  = PFN_vkCmdDispatchBase( vkGetInstanceProcAddr( instance, "vkCmdDispatchBase" ) );
+      vkEnumeratePhysicalDeviceGroups =
+        PFN_vkEnumeratePhysicalDeviceGroups( vkGetInstanceProcAddr( instance, "vkEnumeratePhysicalDeviceGroups" ) );
+      vkGetImageMemoryRequirements2 =
+        PFN_vkGetImageMemoryRequirements2( vkGetInstanceProcAddr( instance, "vkGetImageMemoryRequirements2" ) );
+      vkGetBufferMemoryRequirements2 =
+        PFN_vkGetBufferMemoryRequirements2( vkGetInstanceProcAddr( instance, "vkGetBufferMemoryRequirements2" ) );
+      vkGetImageSparseMemoryRequirements2 = PFN_vkGetImageSparseMemoryRequirements2(
+        vkGetInstanceProcAddr( instance, "vkGetImageSparseMemoryRequirements2" ) );
+      vkGetPhysicalDeviceFeatures2 =
+        PFN_vkGetPhysicalDeviceFeatures2( vkGetInstanceProcAddr( instance, "vkGetPhysicalDeviceFeatures2" ) );
+      vkGetPhysicalDeviceProperties2 =
+        PFN_vkGetPhysicalDeviceProperties2( vkGetInstanceProcAddr( instance, "vkGetPhysicalDeviceProperties2" ) );
+      vkGetPhysicalDeviceFormatProperties2 = PFN_vkGetPhysicalDeviceFormatProperties2(
+        vkGetInstanceProcAddr( instance, "vkGetPhysicalDeviceFormatProperties2" ) );
+      vkGetPhysicalDeviceImageFormatProperties2 = PFN_vkGetPhysicalDeviceImageFormatProperties2(
+        vkGetInstanceProcAddr( instance, "vkGetPhysicalDeviceImageFormatProperties2" ) );
+      vkGetPhysicalDeviceQueueFamilyProperties2 = PFN_vkGetPhysicalDeviceQueueFamilyProperties2(
+        vkGetInstanceProcAddr( instance, "vkGetPhysicalDeviceQueueFamilyProperties2" ) );
+      vkGetPhysicalDeviceMemoryProperties2 = PFN_vkGetPhysicalDeviceMemoryProperties2(
+        vkGetInstanceProcAddr( instance, "vkGetPhysicalDeviceMemoryProperties2" ) );
+      vkGetPhysicalDeviceSparseImageFormatProperties2 = PFN_vkGetPhysicalDeviceSparseImageFormatProperties2(
+        vkGetInstanceProcAddr( instance, "vkGetPhysicalDeviceSparseImageFormatProperties2" ) );
+      vkTrimCommandPool = PFN_vkTrimCommandPool( vkGetInstanceProcAddr( instance, "vkTrimCommandPool" ) );
+      vkGetDeviceQueue2 = PFN_vkGetDeviceQueue2( vkGetInstanceProcAddr( instance, "vkGetDeviceQueue2" ) );
+      vkCreateSamplerYcbcrConversion =
+        PFN_vkCreateSamplerYcbcrConversion( vkGetInstanceProcAddr( instance, "vkCreateSamplerYcbcrConversion" ) );
+      vkDestroySamplerYcbcrConversion =
+        PFN_vkDestroySamplerYcbcrConversion( vkGetInstanceProcAddr( instance, "vkDestroySamplerYcbcrConversion" ) );
+      vkCreateDescriptorUpdateTemplate =
+        PFN_vkCreateDescriptorUpdateTemplate( vkGetInstanceProcAddr( instance, "vkCreateDescriptorUpdateTemplate" ) );
+      vkDestroyDescriptorUpdateTemplate =
+        PFN_vkDestroyDescriptorUpdateTemplate( vkGetInstanceProcAddr( instance, "vkDestroyDescriptorUpdateTemplate" ) );
+      vkUpdateDescriptorSetWithTemplate =
+        PFN_vkUpdateDescriptorSetWithTemplate( vkGetInstanceProcAddr( instance, "vkUpdateDescriptorSetWithTemplate" ) );
+      vkGetPhysicalDeviceExternalBufferProperties = PFN_vkGetPhysicalDeviceExternalBufferProperties(
+        vkGetInstanceProcAddr( instance, "vkGetPhysicalDeviceExternalBufferProperties" ) );
+      vkGetPhysicalDeviceExternalFenceProperties = PFN_vkGetPhysicalDeviceExternalFenceProperties(
+        vkGetInstanceProcAddr( instance, "vkGetPhysicalDeviceExternalFenceProperties" ) );
+      vkGetPhysicalDeviceExternalSemaphoreProperties = PFN_vkGetPhysicalDeviceExternalSemaphoreProperties(
+        vkGetInstanceProcAddr( instance, "vkGetPhysicalDeviceExternalSemaphoreProperties" ) );
+      vkGetDescriptorSetLayoutSupport =
+        PFN_vkGetDescriptorSetLayoutSupport( vkGetInstanceProcAddr( instance, "vkGetDescriptorSetLayoutSupport" ) );
+
+      //=== VK_VERSION_1_2 ===
+      vkCmdDrawIndirectCount =
+        PFN_vkCmdDrawIndirectCount( vkGetInstanceProcAddr( instance, "vkCmdDrawIndirectCount" ) );
+      vkCmdDrawIndexedIndirectCount =
+        PFN_vkCmdDrawIndexedIndirectCount( vkGetInstanceProcAddr( instance, "vkCmdDrawIndexedIndirectCount" ) );
+      vkCreateRenderPass2   = PFN_vkCreateRenderPass2( vkGetInstanceProcAddr( instance, "vkCreateRenderPass2" ) );
+      vkCmdBeginRenderPass2 = PFN_vkCmdBeginRenderPass2( vkGetInstanceProcAddr( instance, "vkCmdBeginRenderPass2" ) );
+      vkCmdNextSubpass2     = PFN_vkCmdNextSubpass2( vkGetInstanceProcAddr( instance, "vkCmdNextSubpass2" ) );
+      vkCmdEndRenderPass2   = PFN_vkCmdEndRenderPass2( vkGetInstanceProcAddr( instance, "vkCmdEndRenderPass2" ) );
+      vkResetQueryPool      = PFN_vkResetQueryPool( vkGetInstanceProcAddr( instance, "vkResetQueryPool" ) );
+      vkGetSemaphoreCounterValue =
+        PFN_vkGetSemaphoreCounterValue( vkGetInstanceProcAddr( instance, "vkGetSemaphoreCounterValue" ) );
+      vkWaitSemaphores  = PFN_vkWaitSemaphores( vkGetInstanceProcAddr( instance, "vkWaitSemaphores" ) );
+      vkSignalSemaphore = PFN_vkSignalSemaphore( vkGetInstanceProcAddr( instance, "vkSignalSemaphore" ) );
+      vkGetBufferDeviceAddress =
+        PFN_vkGetBufferDeviceAddress( vkGetInstanceProcAddr( instance, "vkGetBufferDeviceAddress" ) );
+      vkGetBufferOpaqueCaptureAddress =
+        PFN_vkGetBufferOpaqueCaptureAddress( vkGetInstanceProcAddr( instance, "vkGetBufferOpaqueCaptureAddress" ) );
+      vkGetDeviceMemoryOpaqueCaptureAddress = PFN_vkGetDeviceMemoryOpaqueCaptureAddress(
+        vkGetInstanceProcAddr( instance, "vkGetDeviceMemoryOpaqueCaptureAddress" ) );
+
+      //=== VK_KHR_surface ===
+      vkDestroySurfaceKHR = PFN_vkDestroySurfaceKHR( vkGetInstanceProcAddr( instance, "vkDestroySurfaceKHR" ) );
+      vkGetPhysicalDeviceSurfaceSupportKHR = PFN_vkGetPhysicalDeviceSurfaceSupportKHR(
+        vkGetInstanceProcAddr( instance, "vkGetPhysicalDeviceSurfaceSupportKHR" ) );
+      vkGetPhysicalDeviceSurfaceCapabilitiesKHR = PFN_vkGetPhysicalDeviceSurfaceCapabilitiesKHR(
+        vkGetInstanceProcAddr( instance, "vkGetPhysicalDeviceSurfaceCapabilitiesKHR" ) );
+      vkGetPhysicalDeviceSurfaceFormatsKHR = PFN_vkGetPhysicalDeviceSurfaceFormatsKHR(
+        vkGetInstanceProcAddr( instance, "vkGetPhysicalDeviceSurfaceFormatsKHR" ) );
+      vkGetPhysicalDeviceSurfacePresentModesKHR = PFN_vkGetPhysicalDeviceSurfacePresentModesKHR(
+        vkGetInstanceProcAddr( instance, "vkGetPhysicalDeviceSurfacePresentModesKHR" ) );
+
+      //=== VK_KHR_swapchain ===
+      vkCreateSwapchainKHR  = PFN_vkCreateSwapchainKHR( vkGetInstanceProcAddr( instance, "vkCreateSwapchainKHR" ) );
+      vkDestroySwapchainKHR = PFN_vkDestroySwapchainKHR( vkGetInstanceProcAddr( instance, "vkDestroySwapchainKHR" ) );
+      vkGetSwapchainImagesKHR =
+        PFN_vkGetSwapchainImagesKHR( vkGetInstanceProcAddr( instance, "vkGetSwapchainImagesKHR" ) );
+      vkAcquireNextImageKHR = PFN_vkAcquireNextImageKHR( vkGetInstanceProcAddr( instance, "vkAcquireNextImageKHR" ) );
+      vkQueuePresentKHR     = PFN_vkQueuePresentKHR( vkGetInstanceProcAddr( instance, "vkQueuePresentKHR" ) );
+      vkGetDeviceGroupPresentCapabilitiesKHR = PFN_vkGetDeviceGroupPresentCapabilitiesKHR(
+        vkGetInstanceProcAddr( instance, "vkGetDeviceGroupPresentCapabilitiesKHR" ) );
+      vkGetDeviceGroupSurfacePresentModesKHR = PFN_vkGetDeviceGroupSurfacePresentModesKHR(
+        vkGetInstanceProcAddr( instance, "vkGetDeviceGroupSurfacePresentModesKHR" ) );
+      vkGetPhysicalDevicePresentRectanglesKHR = PFN_vkGetPhysicalDevicePresentRectanglesKHR(
+        vkGetInstanceProcAddr( instance, "vkGetPhysicalDevicePresentRectanglesKHR" ) );
+      vkAcquireNextImage2KHR =
+        PFN_vkAcquireNextImage2KHR( vkGetInstanceProcAddr( instance, "vkAcquireNextImage2KHR" ) );
+
+      //=== VK_KHR_display ===
+      vkGetPhysicalDeviceDisplayPropertiesKHR = PFN_vkGetPhysicalDeviceDisplayPropertiesKHR(
+        vkGetInstanceProcAddr( instance, "vkGetPhysicalDeviceDisplayPropertiesKHR" ) );
+      vkGetPhysicalDeviceDisplayPlanePropertiesKHR = PFN_vkGetPhysicalDeviceDisplayPlanePropertiesKHR(
+        vkGetInstanceProcAddr( instance, "vkGetPhysicalDeviceDisplayPlanePropertiesKHR" ) );
+      vkGetDisplayPlaneSupportedDisplaysKHR = PFN_vkGetDisplayPlaneSupportedDisplaysKHR(
+        vkGetInstanceProcAddr( instance, "vkGetDisplayPlaneSupportedDisplaysKHR" ) );
+      vkGetDisplayModePropertiesKHR =
+        PFN_vkGetDisplayModePropertiesKHR( vkGetInstanceProcAddr( instance, "vkGetDisplayModePropertiesKHR" ) );
+      vkCreateDisplayModeKHR =
+        PFN_vkCreateDisplayModeKHR( vkGetInstanceProcAddr( instance, "vkCreateDisplayModeKHR" ) );
+      vkGetDisplayPlaneCapabilitiesKHR =
+        PFN_vkGetDisplayPlaneCapabilitiesKHR( vkGetInstanceProcAddr( instance, "vkGetDisplayPlaneCapabilitiesKHR" ) );
+      vkCreateDisplayPlaneSurfaceKHR =
+        PFN_vkCreateDisplayPlaneSurfaceKHR( vkGetInstanceProcAddr( instance, "vkCreateDisplayPlaneSurfaceKHR" ) );
+
+      //=== VK_KHR_display_swapchain ===
+      vkCreateSharedSwapchainsKHR =
+        PFN_vkCreateSharedSwapchainsKHR( vkGetInstanceProcAddr( instance, "vkCreateSharedSwapchainsKHR" ) );
+
+#if defined( VK_USE_PLATFORM_XLIB_KHR )
+      //=== VK_KHR_xlib_surface ===
+      vkCreateXlibSurfaceKHR =
+        PFN_vkCreateXlibSurfaceKHR( vkGetInstanceProcAddr( instance, "vkCreateXlibSurfaceKHR" ) );
+      vkGetPhysicalDeviceXlibPresentationSupportKHR = PFN_vkGetPhysicalDeviceXlibPresentationSupportKHR(
+        vkGetInstanceProcAddr( instance, "vkGetPhysicalDeviceXlibPresentationSupportKHR" ) );
+#endif /*VK_USE_PLATFORM_XLIB_KHR*/
+
+#if defined( VK_USE_PLATFORM_XCB_KHR )
+      //=== VK_KHR_xcb_surface ===
+      vkCreateXcbSurfaceKHR = PFN_vkCreateXcbSurfaceKHR( vkGetInstanceProcAddr( instance, "vkCreateXcbSurfaceKHR" ) );
+      vkGetPhysicalDeviceXcbPresentationSupportKHR = PFN_vkGetPhysicalDeviceXcbPresentationSupportKHR(
+        vkGetInstanceProcAddr( instance, "vkGetPhysicalDeviceXcbPresentationSupportKHR" ) );
+#endif /*VK_USE_PLATFORM_XCB_KHR*/
+
+#if defined( VK_USE_PLATFORM_WAYLAND_KHR )
+      //=== VK_KHR_wayland_surface ===
+      vkCreateWaylandSurfaceKHR =
+        PFN_vkCreateWaylandSurfaceKHR( vkGetInstanceProcAddr( instance, "vkCreateWaylandSurfaceKHR" ) );
+      vkGetPhysicalDeviceWaylandPresentationSupportKHR = PFN_vkGetPhysicalDeviceWaylandPresentationSupportKHR(
+        vkGetInstanceProcAddr( instance, "vkGetPhysicalDeviceWaylandPresentationSupportKHR" ) );
+#endif /*VK_USE_PLATFORM_WAYLAND_KHR*/
+
+#if defined( VK_USE_PLATFORM_ANDROID_KHR )
+      //=== VK_KHR_android_surface ===
+      vkCreateAndroidSurfaceKHR =
+        PFN_vkCreateAndroidSurfaceKHR( vkGetInstanceProcAddr( instance, "vkCreateAndroidSurfaceKHR" ) );
+#endif /*VK_USE_PLATFORM_ANDROID_KHR*/
+
+#if defined( VK_USE_PLATFORM_WIN32_KHR )
+      //=== VK_KHR_win32_surface ===
+      vkCreateWin32SurfaceKHR =
+        PFN_vkCreateWin32SurfaceKHR( vkGetInstanceProcAddr( instance, "vkCreateWin32SurfaceKHR" ) );
+      vkGetPhysicalDeviceWin32PresentationSupportKHR = PFN_vkGetPhysicalDeviceWin32PresentationSupportKHR(
+        vkGetInstanceProcAddr( instance, "vkGetPhysicalDeviceWin32PresentationSupportKHR" ) );
+#endif /*VK_USE_PLATFORM_WIN32_KHR*/
+
+      //=== VK_EXT_debug_report ===
+      vkCreateDebugReportCallbackEXT =
+        PFN_vkCreateDebugReportCallbackEXT( vkGetInstanceProcAddr( instance, "vkCreateDebugReportCallbackEXT" ) );
+      vkDestroyDebugReportCallbackEXT =
+        PFN_vkDestroyDebugReportCallbackEXT( vkGetInstanceProcAddr( instance, "vkDestroyDebugReportCallbackEXT" ) );
+      vkDebugReportMessageEXT =
+        PFN_vkDebugReportMessageEXT( vkGetInstanceProcAddr( instance, "vkDebugReportMessageEXT" ) );
+
+      //=== VK_EXT_debug_marker ===
+      vkDebugMarkerSetObjectTagEXT =
+        PFN_vkDebugMarkerSetObjectTagEXT( vkGetInstanceProcAddr( instance, "vkDebugMarkerSetObjectTagEXT" ) );
+      vkDebugMarkerSetObjectNameEXT =
+        PFN_vkDebugMarkerSetObjectNameEXT( vkGetInstanceProcAddr( instance, "vkDebugMarkerSetObjectNameEXT" ) );
       vkCmdDebugMarkerBeginEXT =
         PFN_vkCmdDebugMarkerBeginEXT( vkGetInstanceProcAddr( instance, "vkCmdDebugMarkerBeginEXT" ) );
       vkCmdDebugMarkerEndEXT =
         PFN_vkCmdDebugMarkerEndEXT( vkGetInstanceProcAddr( instance, "vkCmdDebugMarkerEndEXT" ) );
       vkCmdDebugMarkerInsertEXT =
         PFN_vkCmdDebugMarkerInsertEXT( vkGetInstanceProcAddr( instance, "vkCmdDebugMarkerInsertEXT" ) );
+
 #if defined( VK_ENABLE_BETA_EXTENSIONS )
+      //=== VK_KHR_video_queue ===
+      vkGetPhysicalDeviceVideoCapabilitiesKHR = PFN_vkGetPhysicalDeviceVideoCapabilitiesKHR(
+        vkGetInstanceProcAddr( instance, "vkGetPhysicalDeviceVideoCapabilitiesKHR" ) );
+      vkGetPhysicalDeviceVideoFormatPropertiesKHR = PFN_vkGetPhysicalDeviceVideoFormatPropertiesKHR(
+        vkGetInstanceProcAddr( instance, "vkGetPhysicalDeviceVideoFormatPropertiesKHR" ) );
+      vkCreateVideoSessionKHR =
+        PFN_vkCreateVideoSessionKHR( vkGetInstanceProcAddr( instance, "vkCreateVideoSessionKHR" ) );
+      vkDestroyVideoSessionKHR =
+        PFN_vkDestroyVideoSessionKHR( vkGetInstanceProcAddr( instance, "vkDestroyVideoSessionKHR" ) );
+      vkGetVideoSessionMemoryRequirementsKHR = PFN_vkGetVideoSessionMemoryRequirementsKHR(
+        vkGetInstanceProcAddr( instance, "vkGetVideoSessionMemoryRequirementsKHR" ) );
+      vkBindVideoSessionMemoryKHR =
+        PFN_vkBindVideoSessionMemoryKHR( vkGetInstanceProcAddr( instance, "vkBindVideoSessionMemoryKHR" ) );
+      vkCreateVideoSessionParametersKHR =
+        PFN_vkCreateVideoSessionParametersKHR( vkGetInstanceProcAddr( instance, "vkCreateVideoSessionParametersKHR" ) );
+      vkUpdateVideoSessionParametersKHR =
+        PFN_vkUpdateVideoSessionParametersKHR( vkGetInstanceProcAddr( instance, "vkUpdateVideoSessionParametersKHR" ) );
+      vkDestroyVideoSessionParametersKHR = PFN_vkDestroyVideoSessionParametersKHR(
+        vkGetInstanceProcAddr( instance, "vkDestroyVideoSessionParametersKHR" ) );
+      vkCmdBeginVideoCodingKHR =
+        PFN_vkCmdBeginVideoCodingKHR( vkGetInstanceProcAddr( instance, "vkCmdBeginVideoCodingKHR" ) );
+      vkCmdEndVideoCodingKHR =
+        PFN_vkCmdEndVideoCodingKHR( vkGetInstanceProcAddr( instance, "vkCmdEndVideoCodingKHR" ) );
+      vkCmdControlVideoCodingKHR =
+        PFN_vkCmdControlVideoCodingKHR( vkGetInstanceProcAddr( instance, "vkCmdControlVideoCodingKHR" ) );
+#endif /*VK_ENABLE_BETA_EXTENSIONS*/
+
+#if defined( VK_ENABLE_BETA_EXTENSIONS )
+      //=== VK_KHR_video_decode_queue ===
       vkCmdDecodeVideoKHR = PFN_vkCmdDecodeVideoKHR( vkGetInstanceProcAddr( instance, "vkCmdDecodeVideoKHR" ) );
 #endif /*VK_ENABLE_BETA_EXTENSIONS*/
-      vkCmdDispatch        = PFN_vkCmdDispatch( vkGetInstanceProcAddr( instance, "vkCmdDispatch" ) );
-      vkCmdDispatchBase    = PFN_vkCmdDispatchBase( vkGetInstanceProcAddr( instance, "vkCmdDispatchBase" ) );
-      vkCmdDispatchBaseKHR = PFN_vkCmdDispatchBaseKHR( vkGetInstanceProcAddr( instance, "vkCmdDispatchBaseKHR" ) );
-      if ( !vkCmdDispatchBase )
-        vkCmdDispatchBase = vkCmdDispatchBaseKHR;
-      vkCmdDispatchIndirect = PFN_vkCmdDispatchIndirect( vkGetInstanceProcAddr( instance, "vkCmdDispatchIndirect" ) );
-      vkCmdDraw             = PFN_vkCmdDraw( vkGetInstanceProcAddr( instance, "vkCmdDraw" ) );
-      vkCmdDrawIndexed      = PFN_vkCmdDrawIndexed( vkGetInstanceProcAddr( instance, "vkCmdDrawIndexed" ) );
-      vkCmdDrawIndexedIndirect =
-        PFN_vkCmdDrawIndexedIndirect( vkGetInstanceProcAddr( instance, "vkCmdDrawIndexedIndirect" ) );
-      vkCmdDrawIndexedIndirectCount =
-        PFN_vkCmdDrawIndexedIndirectCount( vkGetInstanceProcAddr( instance, "vkCmdDrawIndexedIndirectCount" ) );
-      vkCmdDrawIndexedIndirectCountAMD =
-        PFN_vkCmdDrawIndexedIndirectCountAMD( vkGetInstanceProcAddr( instance, "vkCmdDrawIndexedIndirectCountAMD" ) );
-      if ( !vkCmdDrawIndexedIndirectCount )
-        vkCmdDrawIndexedIndirectCount = vkCmdDrawIndexedIndirectCountAMD;
-      vkCmdDrawIndexedIndirectCountKHR =
-        PFN_vkCmdDrawIndexedIndirectCountKHR( vkGetInstanceProcAddr( instance, "vkCmdDrawIndexedIndirectCountKHR" ) );
-      if ( !vkCmdDrawIndexedIndirectCount )
-        vkCmdDrawIndexedIndirectCount = vkCmdDrawIndexedIndirectCountKHR;
-      vkCmdDrawIndirect = PFN_vkCmdDrawIndirect( vkGetInstanceProcAddr( instance, "vkCmdDrawIndirect" ) );
+
+      //=== VK_EXT_transform_feedback ===
+      vkCmdBindTransformFeedbackBuffersEXT = PFN_vkCmdBindTransformFeedbackBuffersEXT(
+        vkGetInstanceProcAddr( instance, "vkCmdBindTransformFeedbackBuffersEXT" ) );
+      vkCmdBeginTransformFeedbackEXT =
+        PFN_vkCmdBeginTransformFeedbackEXT( vkGetInstanceProcAddr( instance, "vkCmdBeginTransformFeedbackEXT" ) );
+      vkCmdEndTransformFeedbackEXT =
+        PFN_vkCmdEndTransformFeedbackEXT( vkGetInstanceProcAddr( instance, "vkCmdEndTransformFeedbackEXT" ) );
+      vkCmdBeginQueryIndexedEXT =
+        PFN_vkCmdBeginQueryIndexedEXT( vkGetInstanceProcAddr( instance, "vkCmdBeginQueryIndexedEXT" ) );
+      vkCmdEndQueryIndexedEXT =
+        PFN_vkCmdEndQueryIndexedEXT( vkGetInstanceProcAddr( instance, "vkCmdEndQueryIndexedEXT" ) );
       vkCmdDrawIndirectByteCountEXT =
         PFN_vkCmdDrawIndirectByteCountEXT( vkGetInstanceProcAddr( instance, "vkCmdDrawIndirectByteCountEXT" ) );
-      vkCmdDrawIndirectCount =
-        PFN_vkCmdDrawIndirectCount( vkGetInstanceProcAddr( instance, "vkCmdDrawIndirectCount" ) );
+
+      //=== VK_NVX_binary_import ===
+      vkCreateCuModuleNVX   = PFN_vkCreateCuModuleNVX( vkGetInstanceProcAddr( instance, "vkCreateCuModuleNVX" ) );
+      vkCreateCuFunctionNVX = PFN_vkCreateCuFunctionNVX( vkGetInstanceProcAddr( instance, "vkCreateCuFunctionNVX" ) );
+      vkDestroyCuModuleNVX  = PFN_vkDestroyCuModuleNVX( vkGetInstanceProcAddr( instance, "vkDestroyCuModuleNVX" ) );
+      vkDestroyCuFunctionNVX =
+        PFN_vkDestroyCuFunctionNVX( vkGetInstanceProcAddr( instance, "vkDestroyCuFunctionNVX" ) );
+      vkCmdCuLaunchKernelNVX =
+        PFN_vkCmdCuLaunchKernelNVX( vkGetInstanceProcAddr( instance, "vkCmdCuLaunchKernelNVX" ) );
+
+      //=== VK_NVX_image_view_handle ===
+      vkGetImageViewHandleNVX =
+        PFN_vkGetImageViewHandleNVX( vkGetInstanceProcAddr( instance, "vkGetImageViewHandleNVX" ) );
+      vkGetImageViewAddressNVX =
+        PFN_vkGetImageViewAddressNVX( vkGetInstanceProcAddr( instance, "vkGetImageViewAddressNVX" ) );
+
+      //=== VK_AMD_draw_indirect_count ===
       vkCmdDrawIndirectCountAMD =
         PFN_vkCmdDrawIndirectCountAMD( vkGetInstanceProcAddr( instance, "vkCmdDrawIndirectCountAMD" ) );
       if ( !vkCmdDrawIndirectCount )
         vkCmdDrawIndirectCount = vkCmdDrawIndirectCountAMD;
-      vkCmdDrawIndirectCountKHR =
-        PFN_vkCmdDrawIndirectCountKHR( vkGetInstanceProcAddr( instance, "vkCmdDrawIndirectCountKHR" ) );
-      if ( !vkCmdDrawIndirectCount )
-        vkCmdDrawIndirectCount = vkCmdDrawIndirectCountKHR;
-      vkCmdDrawMeshTasksIndirectCountNV =
-        PFN_vkCmdDrawMeshTasksIndirectCountNV( vkGetInstanceProcAddr( instance, "vkCmdDrawMeshTasksIndirectCountNV" ) );
-      vkCmdDrawMeshTasksIndirectNV =
-        PFN_vkCmdDrawMeshTasksIndirectNV( vkGetInstanceProcAddr( instance, "vkCmdDrawMeshTasksIndirectNV" ) );
-      vkCmdDrawMeshTasksNV = PFN_vkCmdDrawMeshTasksNV( vkGetInstanceProcAddr( instance, "vkCmdDrawMeshTasksNV" ) );
-      vkCmdDrawMultiEXT    = PFN_vkCmdDrawMultiEXT( vkGetInstanceProcAddr( instance, "vkCmdDrawMultiEXT" ) );
-      vkCmdDrawMultiIndexedEXT =
-        PFN_vkCmdDrawMultiIndexedEXT( vkGetInstanceProcAddr( instance, "vkCmdDrawMultiIndexedEXT" ) );
-#if defined( VK_ENABLE_BETA_EXTENSIONS )
-      vkCmdEncodeVideoKHR = PFN_vkCmdEncodeVideoKHR( vkGetInstanceProcAddr( instance, "vkCmdEncodeVideoKHR" ) );
-#endif /*VK_ENABLE_BETA_EXTENSIONS*/
-      vkCmdEndConditionalRenderingEXT =
-        PFN_vkCmdEndConditionalRenderingEXT( vkGetInstanceProcAddr( instance, "vkCmdEndConditionalRenderingEXT" ) );
-      vkCmdEndDebugUtilsLabelEXT =
-        PFN_vkCmdEndDebugUtilsLabelEXT( vkGetInstanceProcAddr( instance, "vkCmdEndDebugUtilsLabelEXT" ) );
-      vkCmdEndQuery = PFN_vkCmdEndQuery( vkGetInstanceProcAddr( instance, "vkCmdEndQuery" ) );
-      vkCmdEndQueryIndexedEXT =
-        PFN_vkCmdEndQueryIndexedEXT( vkGetInstanceProcAddr( instance, "vkCmdEndQueryIndexedEXT" ) );
-      vkCmdEndRenderPass  = PFN_vkCmdEndRenderPass( vkGetInstanceProcAddr( instance, "vkCmdEndRenderPass" ) );
-      vkCmdEndRenderPass2 = PFN_vkCmdEndRenderPass2( vkGetInstanceProcAddr( instance, "vkCmdEndRenderPass2" ) );
-      vkCmdEndRenderPass2KHR =
-        PFN_vkCmdEndRenderPass2KHR( vkGetInstanceProcAddr( instance, "vkCmdEndRenderPass2KHR" ) );
-      if ( !vkCmdEndRenderPass2 )
-        vkCmdEndRenderPass2 = vkCmdEndRenderPass2KHR;
-      vkCmdEndTransformFeedbackEXT =
-        PFN_vkCmdEndTransformFeedbackEXT( vkGetInstanceProcAddr( instance, "vkCmdEndTransformFeedbackEXT" ) );
-#if defined( VK_ENABLE_BETA_EXTENSIONS )
-      vkCmdEndVideoCodingKHR =
-        PFN_vkCmdEndVideoCodingKHR( vkGetInstanceProcAddr( instance, "vkCmdEndVideoCodingKHR" ) );
-#endif /*VK_ENABLE_BETA_EXTENSIONS*/
-      vkCmdExecuteCommands = PFN_vkCmdExecuteCommands( vkGetInstanceProcAddr( instance, "vkCmdExecuteCommands" ) );
-      vkCmdExecuteGeneratedCommandsNV =
-        PFN_vkCmdExecuteGeneratedCommandsNV( vkGetInstanceProcAddr( instance, "vkCmdExecuteGeneratedCommandsNV" ) );
-      vkCmdFillBuffer = PFN_vkCmdFillBuffer( vkGetInstanceProcAddr( instance, "vkCmdFillBuffer" ) );
-      vkCmdInsertDebugUtilsLabelEXT =
-        PFN_vkCmdInsertDebugUtilsLabelEXT( vkGetInstanceProcAddr( instance, "vkCmdInsertDebugUtilsLabelEXT" ) );
-      vkCmdNextSubpass     = PFN_vkCmdNextSubpass( vkGetInstanceProcAddr( instance, "vkCmdNextSubpass" ) );
-      vkCmdNextSubpass2    = PFN_vkCmdNextSubpass2( vkGetInstanceProcAddr( instance, "vkCmdNextSubpass2" ) );
-      vkCmdNextSubpass2KHR = PFN_vkCmdNextSubpass2KHR( vkGetInstanceProcAddr( instance, "vkCmdNextSubpass2KHR" ) );
-      if ( !vkCmdNextSubpass2 )
-        vkCmdNextSubpass2 = vkCmdNextSubpass2KHR;
-      vkCmdPipelineBarrier = PFN_vkCmdPipelineBarrier( vkGetInstanceProcAddr( instance, "vkCmdPipelineBarrier" ) );
-      vkCmdPipelineBarrier2KHR =
-        PFN_vkCmdPipelineBarrier2KHR( vkGetInstanceProcAddr( instance, "vkCmdPipelineBarrier2KHR" ) );
-      vkCmdPreprocessGeneratedCommandsNV = PFN_vkCmdPreprocessGeneratedCommandsNV(
-        vkGetInstanceProcAddr( instance, "vkCmdPreprocessGeneratedCommandsNV" ) );
-      vkCmdPushConstants = PFN_vkCmdPushConstants( vkGetInstanceProcAddr( instance, "vkCmdPushConstants" ) );
+      vkCmdDrawIndexedIndirectCountAMD =
+        PFN_vkCmdDrawIndexedIndirectCountAMD( vkGetInstanceProcAddr( instance, "vkCmdDrawIndexedIndirectCountAMD" ) );
+      if ( !vkCmdDrawIndexedIndirectCount )
+        vkCmdDrawIndexedIndirectCount = vkCmdDrawIndexedIndirectCountAMD;
+
+      //=== VK_AMD_shader_info ===
+      vkGetShaderInfoAMD = PFN_vkGetShaderInfoAMD( vkGetInstanceProcAddr( instance, "vkGetShaderInfoAMD" ) );
+
+#if defined( VK_USE_PLATFORM_GGP )
+      //=== VK_GGP_stream_descriptor_surface ===
+      vkCreateStreamDescriptorSurfaceGGP = PFN_vkCreateStreamDescriptorSurfaceGGP(
+        vkGetInstanceProcAddr( instance, "vkCreateStreamDescriptorSurfaceGGP" ) );
+#endif /*VK_USE_PLATFORM_GGP*/
+
+      //=== VK_NV_external_memory_capabilities ===
+      vkGetPhysicalDeviceExternalImageFormatPropertiesNV = PFN_vkGetPhysicalDeviceExternalImageFormatPropertiesNV(
+        vkGetInstanceProcAddr( instance, "vkGetPhysicalDeviceExternalImageFormatPropertiesNV" ) );
+
+#if defined( VK_USE_PLATFORM_WIN32_KHR )
+      //=== VK_NV_external_memory_win32 ===
+      vkGetMemoryWin32HandleNV =
+        PFN_vkGetMemoryWin32HandleNV( vkGetInstanceProcAddr( instance, "vkGetMemoryWin32HandleNV" ) );
+#endif /*VK_USE_PLATFORM_WIN32_KHR*/
+
+      //=== VK_KHR_get_physical_device_properties2 ===
+      vkGetPhysicalDeviceFeatures2KHR =
+        PFN_vkGetPhysicalDeviceFeatures2KHR( vkGetInstanceProcAddr( instance, "vkGetPhysicalDeviceFeatures2KHR" ) );
+      if ( !vkGetPhysicalDeviceFeatures2 )
+        vkGetPhysicalDeviceFeatures2 = vkGetPhysicalDeviceFeatures2KHR;
+      vkGetPhysicalDeviceProperties2KHR =
+        PFN_vkGetPhysicalDeviceProperties2KHR( vkGetInstanceProcAddr( instance, "vkGetPhysicalDeviceProperties2KHR" ) );
+      if ( !vkGetPhysicalDeviceProperties2 )
+        vkGetPhysicalDeviceProperties2 = vkGetPhysicalDeviceProperties2KHR;
+      vkGetPhysicalDeviceFormatProperties2KHR = PFN_vkGetPhysicalDeviceFormatProperties2KHR(
+        vkGetInstanceProcAddr( instance, "vkGetPhysicalDeviceFormatProperties2KHR" ) );
+      if ( !vkGetPhysicalDeviceFormatProperties2 )
+        vkGetPhysicalDeviceFormatProperties2 = vkGetPhysicalDeviceFormatProperties2KHR;
+      vkGetPhysicalDeviceImageFormatProperties2KHR = PFN_vkGetPhysicalDeviceImageFormatProperties2KHR(
+        vkGetInstanceProcAddr( instance, "vkGetPhysicalDeviceImageFormatProperties2KHR" ) );
+      if ( !vkGetPhysicalDeviceImageFormatProperties2 )
+        vkGetPhysicalDeviceImageFormatProperties2 = vkGetPhysicalDeviceImageFormatProperties2KHR;
+      vkGetPhysicalDeviceQueueFamilyProperties2KHR = PFN_vkGetPhysicalDeviceQueueFamilyProperties2KHR(
+        vkGetInstanceProcAddr( instance, "vkGetPhysicalDeviceQueueFamilyProperties2KHR" ) );
+      if ( !vkGetPhysicalDeviceQueueFamilyProperties2 )
+        vkGetPhysicalDeviceQueueFamilyProperties2 = vkGetPhysicalDeviceQueueFamilyProperties2KHR;
+      vkGetPhysicalDeviceMemoryProperties2KHR = PFN_vkGetPhysicalDeviceMemoryProperties2KHR(
+        vkGetInstanceProcAddr( instance, "vkGetPhysicalDeviceMemoryProperties2KHR" ) );
+      if ( !vkGetPhysicalDeviceMemoryProperties2 )
+        vkGetPhysicalDeviceMemoryProperties2 = vkGetPhysicalDeviceMemoryProperties2KHR;
+      vkGetPhysicalDeviceSparseImageFormatProperties2KHR = PFN_vkGetPhysicalDeviceSparseImageFormatProperties2KHR(
+        vkGetInstanceProcAddr( instance, "vkGetPhysicalDeviceSparseImageFormatProperties2KHR" ) );
+      if ( !vkGetPhysicalDeviceSparseImageFormatProperties2 )
+        vkGetPhysicalDeviceSparseImageFormatProperties2 = vkGetPhysicalDeviceSparseImageFormatProperties2KHR;
+
+      //=== VK_KHR_device_group ===
+      vkGetDeviceGroupPeerMemoryFeaturesKHR = PFN_vkGetDeviceGroupPeerMemoryFeaturesKHR(
+        vkGetInstanceProcAddr( instance, "vkGetDeviceGroupPeerMemoryFeaturesKHR" ) );
+      if ( !vkGetDeviceGroupPeerMemoryFeatures )
+        vkGetDeviceGroupPeerMemoryFeatures = vkGetDeviceGroupPeerMemoryFeaturesKHR;
+      vkCmdSetDeviceMaskKHR = PFN_vkCmdSetDeviceMaskKHR( vkGetInstanceProcAddr( instance, "vkCmdSetDeviceMaskKHR" ) );
+      if ( !vkCmdSetDeviceMask )
+        vkCmdSetDeviceMask = vkCmdSetDeviceMaskKHR;
+      vkCmdDispatchBaseKHR = PFN_vkCmdDispatchBaseKHR( vkGetInstanceProcAddr( instance, "vkCmdDispatchBaseKHR" ) );
+      if ( !vkCmdDispatchBase )
+        vkCmdDispatchBase = vkCmdDispatchBaseKHR;
+
+#if defined( VK_USE_PLATFORM_VI_NN )
+      //=== VK_NN_vi_surface ===
+      vkCreateViSurfaceNN = PFN_vkCreateViSurfaceNN( vkGetInstanceProcAddr( instance, "vkCreateViSurfaceNN" ) );
+#endif /*VK_USE_PLATFORM_VI_NN*/
+
+      //=== VK_KHR_maintenance1 ===
+      vkTrimCommandPoolKHR = PFN_vkTrimCommandPoolKHR( vkGetInstanceProcAddr( instance, "vkTrimCommandPoolKHR" ) );
+      if ( !vkTrimCommandPool )
+        vkTrimCommandPool = vkTrimCommandPoolKHR;
+
+      //=== VK_KHR_device_group_creation ===
+      vkEnumeratePhysicalDeviceGroupsKHR = PFN_vkEnumeratePhysicalDeviceGroupsKHR(
+        vkGetInstanceProcAddr( instance, "vkEnumeratePhysicalDeviceGroupsKHR" ) );
+      if ( !vkEnumeratePhysicalDeviceGroups )
+        vkEnumeratePhysicalDeviceGroups = vkEnumeratePhysicalDeviceGroupsKHR;
+
+      //=== VK_KHR_external_memory_capabilities ===
+      vkGetPhysicalDeviceExternalBufferPropertiesKHR = PFN_vkGetPhysicalDeviceExternalBufferPropertiesKHR(
+        vkGetInstanceProcAddr( instance, "vkGetPhysicalDeviceExternalBufferPropertiesKHR" ) );
+      if ( !vkGetPhysicalDeviceExternalBufferProperties )
+        vkGetPhysicalDeviceExternalBufferProperties = vkGetPhysicalDeviceExternalBufferPropertiesKHR;
+
+#if defined( VK_USE_PLATFORM_WIN32_KHR )
+      //=== VK_KHR_external_memory_win32 ===
+      vkGetMemoryWin32HandleKHR =
+        PFN_vkGetMemoryWin32HandleKHR( vkGetInstanceProcAddr( instance, "vkGetMemoryWin32HandleKHR" ) );
+      vkGetMemoryWin32HandlePropertiesKHR = PFN_vkGetMemoryWin32HandlePropertiesKHR(
+        vkGetInstanceProcAddr( instance, "vkGetMemoryWin32HandlePropertiesKHR" ) );
+#endif /*VK_USE_PLATFORM_WIN32_KHR*/
+
+      //=== VK_KHR_external_memory_fd ===
+      vkGetMemoryFdKHR = PFN_vkGetMemoryFdKHR( vkGetInstanceProcAddr( instance, "vkGetMemoryFdKHR" ) );
+      vkGetMemoryFdPropertiesKHR =
+        PFN_vkGetMemoryFdPropertiesKHR( vkGetInstanceProcAddr( instance, "vkGetMemoryFdPropertiesKHR" ) );
+
+      //=== VK_KHR_external_semaphore_capabilities ===
+      vkGetPhysicalDeviceExternalSemaphorePropertiesKHR = PFN_vkGetPhysicalDeviceExternalSemaphorePropertiesKHR(
+        vkGetInstanceProcAddr( instance, "vkGetPhysicalDeviceExternalSemaphorePropertiesKHR" ) );
+      if ( !vkGetPhysicalDeviceExternalSemaphoreProperties )
+        vkGetPhysicalDeviceExternalSemaphoreProperties = vkGetPhysicalDeviceExternalSemaphorePropertiesKHR;
+
+#if defined( VK_USE_PLATFORM_WIN32_KHR )
+      //=== VK_KHR_external_semaphore_win32 ===
+      vkImportSemaphoreWin32HandleKHR =
+        PFN_vkImportSemaphoreWin32HandleKHR( vkGetInstanceProcAddr( instance, "vkImportSemaphoreWin32HandleKHR" ) );
+      vkGetSemaphoreWin32HandleKHR =
+        PFN_vkGetSemaphoreWin32HandleKHR( vkGetInstanceProcAddr( instance, "vkGetSemaphoreWin32HandleKHR" ) );
+#endif /*VK_USE_PLATFORM_WIN32_KHR*/
+
+      //=== VK_KHR_external_semaphore_fd ===
+      vkImportSemaphoreFdKHR =
+        PFN_vkImportSemaphoreFdKHR( vkGetInstanceProcAddr( instance, "vkImportSemaphoreFdKHR" ) );
+      vkGetSemaphoreFdKHR = PFN_vkGetSemaphoreFdKHR( vkGetInstanceProcAddr( instance, "vkGetSemaphoreFdKHR" ) );
+
+      //=== VK_KHR_push_descriptor ===
       vkCmdPushDescriptorSetKHR =
         PFN_vkCmdPushDescriptorSetKHR( vkGetInstanceProcAddr( instance, "vkCmdPushDescriptorSetKHR" ) );
       vkCmdPushDescriptorSetWithTemplateKHR = PFN_vkCmdPushDescriptorSetWithTemplateKHR(
         vkGetInstanceProcAddr( instance, "vkCmdPushDescriptorSetWithTemplateKHR" ) );
-      vkCmdResetEvent       = PFN_vkCmdResetEvent( vkGetInstanceProcAddr( instance, "vkCmdResetEvent" ) );
-      vkCmdResetEvent2KHR   = PFN_vkCmdResetEvent2KHR( vkGetInstanceProcAddr( instance, "vkCmdResetEvent2KHR" ) );
-      vkCmdResetQueryPool   = PFN_vkCmdResetQueryPool( vkGetInstanceProcAddr( instance, "vkCmdResetQueryPool" ) );
-      vkCmdResolveImage     = PFN_vkCmdResolveImage( vkGetInstanceProcAddr( instance, "vkCmdResolveImage" ) );
-      vkCmdResolveImage2KHR = PFN_vkCmdResolveImage2KHR( vkGetInstanceProcAddr( instance, "vkCmdResolveImage2KHR" ) );
-      vkCmdSetBlendConstants =
-        PFN_vkCmdSetBlendConstants( vkGetInstanceProcAddr( instance, "vkCmdSetBlendConstants" ) );
-      vkCmdSetCheckpointNV = PFN_vkCmdSetCheckpointNV( vkGetInstanceProcAddr( instance, "vkCmdSetCheckpointNV" ) );
-      vkCmdSetCoarseSampleOrderNV =
-        PFN_vkCmdSetCoarseSampleOrderNV( vkGetInstanceProcAddr( instance, "vkCmdSetCoarseSampleOrderNV" ) );
-      vkCmdSetColorWriteEnableEXT =
-        PFN_vkCmdSetColorWriteEnableEXT( vkGetInstanceProcAddr( instance, "vkCmdSetColorWriteEnableEXT" ) );
-      vkCmdSetCullModeEXT = PFN_vkCmdSetCullModeEXT( vkGetInstanceProcAddr( instance, "vkCmdSetCullModeEXT" ) );
-      vkCmdSetDepthBias   = PFN_vkCmdSetDepthBias( vkGetInstanceProcAddr( instance, "vkCmdSetDepthBias" ) );
-      vkCmdSetDepthBiasEnableEXT =
-        PFN_vkCmdSetDepthBiasEnableEXT( vkGetInstanceProcAddr( instance, "vkCmdSetDepthBiasEnableEXT" ) );
-      vkCmdSetDepthBounds = PFN_vkCmdSetDepthBounds( vkGetInstanceProcAddr( instance, "vkCmdSetDepthBounds" ) );
-      vkCmdSetDepthBoundsTestEnableEXT =
-        PFN_vkCmdSetDepthBoundsTestEnableEXT( vkGetInstanceProcAddr( instance, "vkCmdSetDepthBoundsTestEnableEXT" ) );
-      vkCmdSetDepthCompareOpEXT =
-        PFN_vkCmdSetDepthCompareOpEXT( vkGetInstanceProcAddr( instance, "vkCmdSetDepthCompareOpEXT" ) );
-      vkCmdSetDepthTestEnableEXT =
-        PFN_vkCmdSetDepthTestEnableEXT( vkGetInstanceProcAddr( instance, "vkCmdSetDepthTestEnableEXT" ) );
-      vkCmdSetDepthWriteEnableEXT =
-        PFN_vkCmdSetDepthWriteEnableEXT( vkGetInstanceProcAddr( instance, "vkCmdSetDepthWriteEnableEXT" ) );
-      vkCmdSetDeviceMask    = PFN_vkCmdSetDeviceMask( vkGetInstanceProcAddr( instance, "vkCmdSetDeviceMask" ) );
-      vkCmdSetDeviceMaskKHR = PFN_vkCmdSetDeviceMaskKHR( vkGetInstanceProcAddr( instance, "vkCmdSetDeviceMaskKHR" ) );
-      if ( !vkCmdSetDeviceMask )
-        vkCmdSetDeviceMask = vkCmdSetDeviceMaskKHR;
-      vkCmdSetDiscardRectangleEXT =
-        PFN_vkCmdSetDiscardRectangleEXT( vkGetInstanceProcAddr( instance, "vkCmdSetDiscardRectangleEXT" ) );
-      vkCmdSetEvent     = PFN_vkCmdSetEvent( vkGetInstanceProcAddr( instance, "vkCmdSetEvent" ) );
-      vkCmdSetEvent2KHR = PFN_vkCmdSetEvent2KHR( vkGetInstanceProcAddr( instance, "vkCmdSetEvent2KHR" ) );
-      vkCmdSetExclusiveScissorNV =
-        PFN_vkCmdSetExclusiveScissorNV( vkGetInstanceProcAddr( instance, "vkCmdSetExclusiveScissorNV" ) );
-      vkCmdSetFragmentShadingRateEnumNV =
-        PFN_vkCmdSetFragmentShadingRateEnumNV( vkGetInstanceProcAddr( instance, "vkCmdSetFragmentShadingRateEnumNV" ) );
-      vkCmdSetFragmentShadingRateKHR =
-        PFN_vkCmdSetFragmentShadingRateKHR( vkGetInstanceProcAddr( instance, "vkCmdSetFragmentShadingRateKHR" ) );
-      vkCmdSetFrontFaceEXT = PFN_vkCmdSetFrontFaceEXT( vkGetInstanceProcAddr( instance, "vkCmdSetFrontFaceEXT" ) );
-      vkCmdSetLineStippleEXT =
-        PFN_vkCmdSetLineStippleEXT( vkGetInstanceProcAddr( instance, "vkCmdSetLineStippleEXT" ) );
-      vkCmdSetLineWidth  = PFN_vkCmdSetLineWidth( vkGetInstanceProcAddr( instance, "vkCmdSetLineWidth" ) );
-      vkCmdSetLogicOpEXT = PFN_vkCmdSetLogicOpEXT( vkGetInstanceProcAddr( instance, "vkCmdSetLogicOpEXT" ) );
-      vkCmdSetPatchControlPointsEXT =
-        PFN_vkCmdSetPatchControlPointsEXT( vkGetInstanceProcAddr( instance, "vkCmdSetPatchControlPointsEXT" ) );
-      vkCmdSetPerformanceMarkerINTEL =
-        PFN_vkCmdSetPerformanceMarkerINTEL( vkGetInstanceProcAddr( instance, "vkCmdSetPerformanceMarkerINTEL" ) );
-      vkCmdSetPerformanceOverrideINTEL =
-        PFN_vkCmdSetPerformanceOverrideINTEL( vkGetInstanceProcAddr( instance, "vkCmdSetPerformanceOverrideINTEL" ) );
-      vkCmdSetPerformanceStreamMarkerINTEL = PFN_vkCmdSetPerformanceStreamMarkerINTEL(
-        vkGetInstanceProcAddr( instance, "vkCmdSetPerformanceStreamMarkerINTEL" ) );
-      vkCmdSetPrimitiveRestartEnableEXT =
-        PFN_vkCmdSetPrimitiveRestartEnableEXT( vkGetInstanceProcAddr( instance, "vkCmdSetPrimitiveRestartEnableEXT" ) );
-      vkCmdSetPrimitiveTopologyEXT =
-        PFN_vkCmdSetPrimitiveTopologyEXT( vkGetInstanceProcAddr( instance, "vkCmdSetPrimitiveTopologyEXT" ) );
-      vkCmdSetRasterizerDiscardEnableEXT = PFN_vkCmdSetRasterizerDiscardEnableEXT(
-        vkGetInstanceProcAddr( instance, "vkCmdSetRasterizerDiscardEnableEXT" ) );
-      vkCmdSetRayTracingPipelineStackSizeKHR = PFN_vkCmdSetRayTracingPipelineStackSizeKHR(
-        vkGetInstanceProcAddr( instance, "vkCmdSetRayTracingPipelineStackSizeKHR" ) );
-      vkCmdSetSampleLocationsEXT =
-        PFN_vkCmdSetSampleLocationsEXT( vkGetInstanceProcAddr( instance, "vkCmdSetSampleLocationsEXT" ) );
-      vkCmdSetScissor = PFN_vkCmdSetScissor( vkGetInstanceProcAddr( instance, "vkCmdSetScissor" ) );
-      vkCmdSetScissorWithCountEXT =
-        PFN_vkCmdSetScissorWithCountEXT( vkGetInstanceProcAddr( instance, "vkCmdSetScissorWithCountEXT" ) );
-      vkCmdSetStencilCompareMask =
-        PFN_vkCmdSetStencilCompareMask( vkGetInstanceProcAddr( instance, "vkCmdSetStencilCompareMask" ) );
-      vkCmdSetStencilOpEXT = PFN_vkCmdSetStencilOpEXT( vkGetInstanceProcAddr( instance, "vkCmdSetStencilOpEXT" ) );
-      vkCmdSetStencilReference =
-        PFN_vkCmdSetStencilReference( vkGetInstanceProcAddr( instance, "vkCmdSetStencilReference" ) );
-      vkCmdSetStencilTestEnableEXT =
-        PFN_vkCmdSetStencilTestEnableEXT( vkGetInstanceProcAddr( instance, "vkCmdSetStencilTestEnableEXT" ) );
-      vkCmdSetStencilWriteMask =
-        PFN_vkCmdSetStencilWriteMask( vkGetInstanceProcAddr( instance, "vkCmdSetStencilWriteMask" ) );
-      vkCmdSetVertexInputEXT =
-        PFN_vkCmdSetVertexInputEXT( vkGetInstanceProcAddr( instance, "vkCmdSetVertexInputEXT" ) );
-      vkCmdSetViewport = PFN_vkCmdSetViewport( vkGetInstanceProcAddr( instance, "vkCmdSetViewport" ) );
-      vkCmdSetViewportShadingRatePaletteNV = PFN_vkCmdSetViewportShadingRatePaletteNV(
-        vkGetInstanceProcAddr( instance, "vkCmdSetViewportShadingRatePaletteNV" ) );
+
+      //=== VK_EXT_conditional_rendering ===
+      vkCmdBeginConditionalRenderingEXT =
+        PFN_vkCmdBeginConditionalRenderingEXT( vkGetInstanceProcAddr( instance, "vkCmdBeginConditionalRenderingEXT" ) );
+      vkCmdEndConditionalRenderingEXT =
+        PFN_vkCmdEndConditionalRenderingEXT( vkGetInstanceProcAddr( instance, "vkCmdEndConditionalRenderingEXT" ) );
+
+      //=== VK_KHR_descriptor_update_template ===
+      vkCreateDescriptorUpdateTemplateKHR = PFN_vkCreateDescriptorUpdateTemplateKHR(
+        vkGetInstanceProcAddr( instance, "vkCreateDescriptorUpdateTemplateKHR" ) );
+      if ( !vkCreateDescriptorUpdateTemplate )
+        vkCreateDescriptorUpdateTemplate = vkCreateDescriptorUpdateTemplateKHR;
+      vkDestroyDescriptorUpdateTemplateKHR = PFN_vkDestroyDescriptorUpdateTemplateKHR(
+        vkGetInstanceProcAddr( instance, "vkDestroyDescriptorUpdateTemplateKHR" ) );
+      if ( !vkDestroyDescriptorUpdateTemplate )
+        vkDestroyDescriptorUpdateTemplate = vkDestroyDescriptorUpdateTemplateKHR;
+      vkUpdateDescriptorSetWithTemplateKHR = PFN_vkUpdateDescriptorSetWithTemplateKHR(
+        vkGetInstanceProcAddr( instance, "vkUpdateDescriptorSetWithTemplateKHR" ) );
+      if ( !vkUpdateDescriptorSetWithTemplate )
+        vkUpdateDescriptorSetWithTemplate = vkUpdateDescriptorSetWithTemplateKHR;
+
+      //=== VK_NV_clip_space_w_scaling ===
       vkCmdSetViewportWScalingNV =
         PFN_vkCmdSetViewportWScalingNV( vkGetInstanceProcAddr( instance, "vkCmdSetViewportWScalingNV" ) );
-      vkCmdSetViewportWithCountEXT =
-        PFN_vkCmdSetViewportWithCountEXT( vkGetInstanceProcAddr( instance, "vkCmdSetViewportWithCountEXT" ) );
-      vkCmdSubpassShadingHUAWEI =
-        PFN_vkCmdSubpassShadingHUAWEI( vkGetInstanceProcAddr( instance, "vkCmdSubpassShadingHUAWEI" ) );
-      vkCmdTraceRaysIndirectKHR =
-        PFN_vkCmdTraceRaysIndirectKHR( vkGetInstanceProcAddr( instance, "vkCmdTraceRaysIndirectKHR" ) );
-      vkCmdTraceRaysKHR   = PFN_vkCmdTraceRaysKHR( vkGetInstanceProcAddr( instance, "vkCmdTraceRaysKHR" ) );
-      vkCmdTraceRaysNV    = PFN_vkCmdTraceRaysNV( vkGetInstanceProcAddr( instance, "vkCmdTraceRaysNV" ) );
-      vkCmdUpdateBuffer   = PFN_vkCmdUpdateBuffer( vkGetInstanceProcAddr( instance, "vkCmdUpdateBuffer" ) );
-      vkCmdWaitEvents     = PFN_vkCmdWaitEvents( vkGetInstanceProcAddr( instance, "vkCmdWaitEvents" ) );
-      vkCmdWaitEvents2KHR = PFN_vkCmdWaitEvents2KHR( vkGetInstanceProcAddr( instance, "vkCmdWaitEvents2KHR" ) );
-      vkCmdWriteAccelerationStructuresPropertiesKHR = PFN_vkCmdWriteAccelerationStructuresPropertiesKHR(
-        vkGetInstanceProcAddr( instance, "vkCmdWriteAccelerationStructuresPropertiesKHR" ) );
-      vkCmdWriteAccelerationStructuresPropertiesNV = PFN_vkCmdWriteAccelerationStructuresPropertiesNV(
-        vkGetInstanceProcAddr( instance, "vkCmdWriteAccelerationStructuresPropertiesNV" ) );
-      vkCmdWriteBufferMarker2AMD =
-        PFN_vkCmdWriteBufferMarker2AMD( vkGetInstanceProcAddr( instance, "vkCmdWriteBufferMarker2AMD" ) );
-      vkCmdWriteBufferMarkerAMD =
-        PFN_vkCmdWriteBufferMarkerAMD( vkGetInstanceProcAddr( instance, "vkCmdWriteBufferMarkerAMD" ) );
-      vkCmdWriteTimestamp = PFN_vkCmdWriteTimestamp( vkGetInstanceProcAddr( instance, "vkCmdWriteTimestamp" ) );
-      vkCmdWriteTimestamp2KHR =
-        PFN_vkCmdWriteTimestamp2KHR( vkGetInstanceProcAddr( instance, "vkCmdWriteTimestamp2KHR" ) );
-      vkCompileDeferredNV = PFN_vkCompileDeferredNV( vkGetInstanceProcAddr( instance, "vkCompileDeferredNV" ) );
+
+      //=== VK_EXT_direct_mode_display ===
+      vkReleaseDisplayEXT = PFN_vkReleaseDisplayEXT( vkGetInstanceProcAddr( instance, "vkReleaseDisplayEXT" ) );
+
+#if defined( VK_USE_PLATFORM_XLIB_XRANDR_EXT )
+      //=== VK_EXT_acquire_xlib_display ===
+      vkAcquireXlibDisplayEXT =
+        PFN_vkAcquireXlibDisplayEXT( vkGetInstanceProcAddr( instance, "vkAcquireXlibDisplayEXT" ) );
+      vkGetRandROutputDisplayEXT =
+        PFN_vkGetRandROutputDisplayEXT( vkGetInstanceProcAddr( instance, "vkGetRandROutputDisplayEXT" ) );
+#endif /*VK_USE_PLATFORM_XLIB_XRANDR_EXT*/
+
+      //=== VK_EXT_display_surface_counter ===
+      vkGetPhysicalDeviceSurfaceCapabilities2EXT = PFN_vkGetPhysicalDeviceSurfaceCapabilities2EXT(
+        vkGetInstanceProcAddr( instance, "vkGetPhysicalDeviceSurfaceCapabilities2EXT" ) );
+
+      //=== VK_EXT_display_control ===
+      vkDisplayPowerControlEXT =
+        PFN_vkDisplayPowerControlEXT( vkGetInstanceProcAddr( instance, "vkDisplayPowerControlEXT" ) );
+      vkRegisterDeviceEventEXT =
+        PFN_vkRegisterDeviceEventEXT( vkGetInstanceProcAddr( instance, "vkRegisterDeviceEventEXT" ) );
+      vkRegisterDisplayEventEXT =
+        PFN_vkRegisterDisplayEventEXT( vkGetInstanceProcAddr( instance, "vkRegisterDisplayEventEXT" ) );
+      vkGetSwapchainCounterEXT =
+        PFN_vkGetSwapchainCounterEXT( vkGetInstanceProcAddr( instance, "vkGetSwapchainCounterEXT" ) );
+
+      //=== VK_GOOGLE_display_timing ===
+      vkGetRefreshCycleDurationGOOGLE =
+        PFN_vkGetRefreshCycleDurationGOOGLE( vkGetInstanceProcAddr( instance, "vkGetRefreshCycleDurationGOOGLE" ) );
+      vkGetPastPresentationTimingGOOGLE =
+        PFN_vkGetPastPresentationTimingGOOGLE( vkGetInstanceProcAddr( instance, "vkGetPastPresentationTimingGOOGLE" ) );
+
+      //=== VK_EXT_discard_rectangles ===
+      vkCmdSetDiscardRectangleEXT =
+        PFN_vkCmdSetDiscardRectangleEXT( vkGetInstanceProcAddr( instance, "vkCmdSetDiscardRectangleEXT" ) );
+
+      //=== VK_EXT_hdr_metadata ===
+      vkSetHdrMetadataEXT = PFN_vkSetHdrMetadataEXT( vkGetInstanceProcAddr( instance, "vkSetHdrMetadataEXT" ) );
+
+      //=== VK_KHR_create_renderpass2 ===
+      vkCreateRenderPass2KHR =
+        PFN_vkCreateRenderPass2KHR( vkGetInstanceProcAddr( instance, "vkCreateRenderPass2KHR" ) );
+      if ( !vkCreateRenderPass2 )
+        vkCreateRenderPass2 = vkCreateRenderPass2KHR;
+      vkCmdBeginRenderPass2KHR =
+        PFN_vkCmdBeginRenderPass2KHR( vkGetInstanceProcAddr( instance, "vkCmdBeginRenderPass2KHR" ) );
+      if ( !vkCmdBeginRenderPass2 )
+        vkCmdBeginRenderPass2 = vkCmdBeginRenderPass2KHR;
+      vkCmdNextSubpass2KHR = PFN_vkCmdNextSubpass2KHR( vkGetInstanceProcAddr( instance, "vkCmdNextSubpass2KHR" ) );
+      if ( !vkCmdNextSubpass2 )
+        vkCmdNextSubpass2 = vkCmdNextSubpass2KHR;
+      vkCmdEndRenderPass2KHR =
+        PFN_vkCmdEndRenderPass2KHR( vkGetInstanceProcAddr( instance, "vkCmdEndRenderPass2KHR" ) );
+      if ( !vkCmdEndRenderPass2 )
+        vkCmdEndRenderPass2 = vkCmdEndRenderPass2KHR;
+
+      //=== VK_KHR_shared_presentable_image ===
+      vkGetSwapchainStatusKHR =
+        PFN_vkGetSwapchainStatusKHR( vkGetInstanceProcAddr( instance, "vkGetSwapchainStatusKHR" ) );
+
+      //=== VK_KHR_external_fence_capabilities ===
+      vkGetPhysicalDeviceExternalFencePropertiesKHR = PFN_vkGetPhysicalDeviceExternalFencePropertiesKHR(
+        vkGetInstanceProcAddr( instance, "vkGetPhysicalDeviceExternalFencePropertiesKHR" ) );
+      if ( !vkGetPhysicalDeviceExternalFenceProperties )
+        vkGetPhysicalDeviceExternalFenceProperties = vkGetPhysicalDeviceExternalFencePropertiesKHR;
+
+#if defined( VK_USE_PLATFORM_WIN32_KHR )
+      //=== VK_KHR_external_fence_win32 ===
+      vkImportFenceWin32HandleKHR =
+        PFN_vkImportFenceWin32HandleKHR( vkGetInstanceProcAddr( instance, "vkImportFenceWin32HandleKHR" ) );
+      vkGetFenceWin32HandleKHR =
+        PFN_vkGetFenceWin32HandleKHR( vkGetInstanceProcAddr( instance, "vkGetFenceWin32HandleKHR" ) );
+#endif /*VK_USE_PLATFORM_WIN32_KHR*/
+
+      //=== VK_KHR_external_fence_fd ===
+      vkImportFenceFdKHR = PFN_vkImportFenceFdKHR( vkGetInstanceProcAddr( instance, "vkImportFenceFdKHR" ) );
+      vkGetFenceFdKHR    = PFN_vkGetFenceFdKHR( vkGetInstanceProcAddr( instance, "vkGetFenceFdKHR" ) );
+
+      //=== VK_KHR_performance_query ===
+      vkEnumeratePhysicalDeviceQueueFamilyPerformanceQueryCountersKHR =
+        PFN_vkEnumeratePhysicalDeviceQueueFamilyPerformanceQueryCountersKHR(
+          vkGetInstanceProcAddr( instance, "vkEnumeratePhysicalDeviceQueueFamilyPerformanceQueryCountersKHR" ) );
+      vkGetPhysicalDeviceQueueFamilyPerformanceQueryPassesKHR =
+        PFN_vkGetPhysicalDeviceQueueFamilyPerformanceQueryPassesKHR(
+          vkGetInstanceProcAddr( instance, "vkGetPhysicalDeviceQueueFamilyPerformanceQueryPassesKHR" ) );
+      vkAcquireProfilingLockKHR =
+        PFN_vkAcquireProfilingLockKHR( vkGetInstanceProcAddr( instance, "vkAcquireProfilingLockKHR" ) );
+      vkReleaseProfilingLockKHR =
+        PFN_vkReleaseProfilingLockKHR( vkGetInstanceProcAddr( instance, "vkReleaseProfilingLockKHR" ) );
+
+      //=== VK_KHR_get_surface_capabilities2 ===
+      vkGetPhysicalDeviceSurfaceCapabilities2KHR = PFN_vkGetPhysicalDeviceSurfaceCapabilities2KHR(
+        vkGetInstanceProcAddr( instance, "vkGetPhysicalDeviceSurfaceCapabilities2KHR" ) );
+      vkGetPhysicalDeviceSurfaceFormats2KHR = PFN_vkGetPhysicalDeviceSurfaceFormats2KHR(
+        vkGetInstanceProcAddr( instance, "vkGetPhysicalDeviceSurfaceFormats2KHR" ) );
+
+      //=== VK_KHR_get_display_properties2 ===
+      vkGetPhysicalDeviceDisplayProperties2KHR = PFN_vkGetPhysicalDeviceDisplayProperties2KHR(
+        vkGetInstanceProcAddr( instance, "vkGetPhysicalDeviceDisplayProperties2KHR" ) );
+      vkGetPhysicalDeviceDisplayPlaneProperties2KHR = PFN_vkGetPhysicalDeviceDisplayPlaneProperties2KHR(
+        vkGetInstanceProcAddr( instance, "vkGetPhysicalDeviceDisplayPlaneProperties2KHR" ) );
+      vkGetDisplayModeProperties2KHR =
+        PFN_vkGetDisplayModeProperties2KHR( vkGetInstanceProcAddr( instance, "vkGetDisplayModeProperties2KHR" ) );
+      vkGetDisplayPlaneCapabilities2KHR =
+        PFN_vkGetDisplayPlaneCapabilities2KHR( vkGetInstanceProcAddr( instance, "vkGetDisplayPlaneCapabilities2KHR" ) );
+
+#if defined( VK_USE_PLATFORM_IOS_MVK )
+      //=== VK_MVK_ios_surface ===
+      vkCreateIOSSurfaceMVK = PFN_vkCreateIOSSurfaceMVK( vkGetInstanceProcAddr( instance, "vkCreateIOSSurfaceMVK" ) );
+#endif /*VK_USE_PLATFORM_IOS_MVK*/
+
+#if defined( VK_USE_PLATFORM_MACOS_MVK )
+      //=== VK_MVK_macos_surface ===
+      vkCreateMacOSSurfaceMVK =
+        PFN_vkCreateMacOSSurfaceMVK( vkGetInstanceProcAddr( instance, "vkCreateMacOSSurfaceMVK" ) );
+#endif /*VK_USE_PLATFORM_MACOS_MVK*/
+
+      //=== VK_EXT_debug_utils ===
+      vkSetDebugUtilsObjectNameEXT =
+        PFN_vkSetDebugUtilsObjectNameEXT( vkGetInstanceProcAddr( instance, "vkSetDebugUtilsObjectNameEXT" ) );
+      vkSetDebugUtilsObjectTagEXT =
+        PFN_vkSetDebugUtilsObjectTagEXT( vkGetInstanceProcAddr( instance, "vkSetDebugUtilsObjectTagEXT" ) );
+      vkQueueBeginDebugUtilsLabelEXT =
+        PFN_vkQueueBeginDebugUtilsLabelEXT( vkGetInstanceProcAddr( instance, "vkQueueBeginDebugUtilsLabelEXT" ) );
+      vkQueueEndDebugUtilsLabelEXT =
+        PFN_vkQueueEndDebugUtilsLabelEXT( vkGetInstanceProcAddr( instance, "vkQueueEndDebugUtilsLabelEXT" ) );
+      vkQueueInsertDebugUtilsLabelEXT =
+        PFN_vkQueueInsertDebugUtilsLabelEXT( vkGetInstanceProcAddr( instance, "vkQueueInsertDebugUtilsLabelEXT" ) );
+      vkCmdBeginDebugUtilsLabelEXT =
+        PFN_vkCmdBeginDebugUtilsLabelEXT( vkGetInstanceProcAddr( instance, "vkCmdBeginDebugUtilsLabelEXT" ) );
+      vkCmdEndDebugUtilsLabelEXT =
+        PFN_vkCmdEndDebugUtilsLabelEXT( vkGetInstanceProcAddr( instance, "vkCmdEndDebugUtilsLabelEXT" ) );
+      vkCmdInsertDebugUtilsLabelEXT =
+        PFN_vkCmdInsertDebugUtilsLabelEXT( vkGetInstanceProcAddr( instance, "vkCmdInsertDebugUtilsLabelEXT" ) );
+      vkCreateDebugUtilsMessengerEXT =
+        PFN_vkCreateDebugUtilsMessengerEXT( vkGetInstanceProcAddr( instance, "vkCreateDebugUtilsMessengerEXT" ) );
+      vkDestroyDebugUtilsMessengerEXT =
+        PFN_vkDestroyDebugUtilsMessengerEXT( vkGetInstanceProcAddr( instance, "vkDestroyDebugUtilsMessengerEXT" ) );
+      vkSubmitDebugUtilsMessageEXT =
+        PFN_vkSubmitDebugUtilsMessageEXT( vkGetInstanceProcAddr( instance, "vkSubmitDebugUtilsMessageEXT" ) );
+
+#if defined( VK_USE_PLATFORM_ANDROID_KHR )
+      //=== VK_ANDROID_external_memory_android_hardware_buffer ===
+      vkGetAndroidHardwareBufferPropertiesANDROID = PFN_vkGetAndroidHardwareBufferPropertiesANDROID(
+        vkGetInstanceProcAddr( instance, "vkGetAndroidHardwareBufferPropertiesANDROID" ) );
+      vkGetMemoryAndroidHardwareBufferANDROID = PFN_vkGetMemoryAndroidHardwareBufferANDROID(
+        vkGetInstanceProcAddr( instance, "vkGetMemoryAndroidHardwareBufferANDROID" ) );
+#endif /*VK_USE_PLATFORM_ANDROID_KHR*/
+
+      //=== VK_EXT_sample_locations ===
+      vkCmdSetSampleLocationsEXT =
+        PFN_vkCmdSetSampleLocationsEXT( vkGetInstanceProcAddr( instance, "vkCmdSetSampleLocationsEXT" ) );
+      vkGetPhysicalDeviceMultisamplePropertiesEXT = PFN_vkGetPhysicalDeviceMultisamplePropertiesEXT(
+        vkGetInstanceProcAddr( instance, "vkGetPhysicalDeviceMultisamplePropertiesEXT" ) );
+
+      //=== VK_KHR_get_memory_requirements2 ===
+      vkGetImageMemoryRequirements2KHR =
+        PFN_vkGetImageMemoryRequirements2KHR( vkGetInstanceProcAddr( instance, "vkGetImageMemoryRequirements2KHR" ) );
+      if ( !vkGetImageMemoryRequirements2 )
+        vkGetImageMemoryRequirements2 = vkGetImageMemoryRequirements2KHR;
+      vkGetBufferMemoryRequirements2KHR =
+        PFN_vkGetBufferMemoryRequirements2KHR( vkGetInstanceProcAddr( instance, "vkGetBufferMemoryRequirements2KHR" ) );
+      if ( !vkGetBufferMemoryRequirements2 )
+        vkGetBufferMemoryRequirements2 = vkGetBufferMemoryRequirements2KHR;
+      vkGetImageSparseMemoryRequirements2KHR = PFN_vkGetImageSparseMemoryRequirements2KHR(
+        vkGetInstanceProcAddr( instance, "vkGetImageSparseMemoryRequirements2KHR" ) );
+      if ( !vkGetImageSparseMemoryRequirements2 )
+        vkGetImageSparseMemoryRequirements2 = vkGetImageSparseMemoryRequirements2KHR;
+
+      //=== VK_KHR_acceleration_structure ===
+      vkCreateAccelerationStructureKHR =
+        PFN_vkCreateAccelerationStructureKHR( vkGetInstanceProcAddr( instance, "vkCreateAccelerationStructureKHR" ) );
+      vkDestroyAccelerationStructureKHR =
+        PFN_vkDestroyAccelerationStructureKHR( vkGetInstanceProcAddr( instance, "vkDestroyAccelerationStructureKHR" ) );
+      vkCmdBuildAccelerationStructuresKHR = PFN_vkCmdBuildAccelerationStructuresKHR(
+        vkGetInstanceProcAddr( instance, "vkCmdBuildAccelerationStructuresKHR" ) );
+      vkCmdBuildAccelerationStructuresIndirectKHR = PFN_vkCmdBuildAccelerationStructuresIndirectKHR(
+        vkGetInstanceProcAddr( instance, "vkCmdBuildAccelerationStructuresIndirectKHR" ) );
+      vkBuildAccelerationStructuresKHR =
+        PFN_vkBuildAccelerationStructuresKHR( vkGetInstanceProcAddr( instance, "vkBuildAccelerationStructuresKHR" ) );
       vkCopyAccelerationStructureKHR =
         PFN_vkCopyAccelerationStructureKHR( vkGetInstanceProcAddr( instance, "vkCopyAccelerationStructureKHR" ) );
       vkCopyAccelerationStructureToMemoryKHR = PFN_vkCopyAccelerationStructureToMemoryKHR(
         vkGetInstanceProcAddr( instance, "vkCopyAccelerationStructureToMemoryKHR" ) );
       vkCopyMemoryToAccelerationStructureKHR = PFN_vkCopyMemoryToAccelerationStructureKHR(
         vkGetInstanceProcAddr( instance, "vkCopyMemoryToAccelerationStructureKHR" ) );
-      vkCreateAccelerationStructureKHR =
-        PFN_vkCreateAccelerationStructureKHR( vkGetInstanceProcAddr( instance, "vkCreateAccelerationStructureKHR" ) );
-      vkCreateAccelerationStructureNV =
-        PFN_vkCreateAccelerationStructureNV( vkGetInstanceProcAddr( instance, "vkCreateAccelerationStructureNV" ) );
-      vkCreateBuffer      = PFN_vkCreateBuffer( vkGetInstanceProcAddr( instance, "vkCreateBuffer" ) );
-      vkCreateBufferView  = PFN_vkCreateBufferView( vkGetInstanceProcAddr( instance, "vkCreateBufferView" ) );
-      vkCreateCommandPool = PFN_vkCreateCommandPool( vkGetInstanceProcAddr( instance, "vkCreateCommandPool" ) );
-      vkCreateComputePipelines =
-        PFN_vkCreateComputePipelines( vkGetInstanceProcAddr( instance, "vkCreateComputePipelines" ) );
-      vkCreateCuFunctionNVX = PFN_vkCreateCuFunctionNVX( vkGetInstanceProcAddr( instance, "vkCreateCuFunctionNVX" ) );
-      vkCreateCuModuleNVX   = PFN_vkCreateCuModuleNVX( vkGetInstanceProcAddr( instance, "vkCreateCuModuleNVX" ) );
-      vkCreateDeferredOperationKHR =
-        PFN_vkCreateDeferredOperationKHR( vkGetInstanceProcAddr( instance, "vkCreateDeferredOperationKHR" ) );
-      vkCreateDescriptorPool =
-        PFN_vkCreateDescriptorPool( vkGetInstanceProcAddr( instance, "vkCreateDescriptorPool" ) );
-      vkCreateDescriptorSetLayout =
-        PFN_vkCreateDescriptorSetLayout( vkGetInstanceProcAddr( instance, "vkCreateDescriptorSetLayout" ) );
-      vkCreateDescriptorUpdateTemplate =
-        PFN_vkCreateDescriptorUpdateTemplate( vkGetInstanceProcAddr( instance, "vkCreateDescriptorUpdateTemplate" ) );
-      vkCreateDescriptorUpdateTemplateKHR = PFN_vkCreateDescriptorUpdateTemplateKHR(
-        vkGetInstanceProcAddr( instance, "vkCreateDescriptorUpdateTemplateKHR" ) );
-      if ( !vkCreateDescriptorUpdateTemplate )
-        vkCreateDescriptorUpdateTemplate = vkCreateDescriptorUpdateTemplateKHR;
-      vkCreateEvent       = PFN_vkCreateEvent( vkGetInstanceProcAddr( instance, "vkCreateEvent" ) );
-      vkCreateFence       = PFN_vkCreateFence( vkGetInstanceProcAddr( instance, "vkCreateFence" ) );
-      vkCreateFramebuffer = PFN_vkCreateFramebuffer( vkGetInstanceProcAddr( instance, "vkCreateFramebuffer" ) );
-      vkCreateGraphicsPipelines =
-        PFN_vkCreateGraphicsPipelines( vkGetInstanceProcAddr( instance, "vkCreateGraphicsPipelines" ) );
-      vkCreateImage     = PFN_vkCreateImage( vkGetInstanceProcAddr( instance, "vkCreateImage" ) );
-      vkCreateImageView = PFN_vkCreateImageView( vkGetInstanceProcAddr( instance, "vkCreateImageView" ) );
-      vkCreateIndirectCommandsLayoutNV =
-        PFN_vkCreateIndirectCommandsLayoutNV( vkGetInstanceProcAddr( instance, "vkCreateIndirectCommandsLayoutNV" ) );
-      vkCreatePipelineCache = PFN_vkCreatePipelineCache( vkGetInstanceProcAddr( instance, "vkCreatePipelineCache" ) );
-      vkCreatePipelineLayout =
-        PFN_vkCreatePipelineLayout( vkGetInstanceProcAddr( instance, "vkCreatePipelineLayout" ) );
-      vkCreatePrivateDataSlotEXT =
-        PFN_vkCreatePrivateDataSlotEXT( vkGetInstanceProcAddr( instance, "vkCreatePrivateDataSlotEXT" ) );
-      vkCreateQueryPool = PFN_vkCreateQueryPool( vkGetInstanceProcAddr( instance, "vkCreateQueryPool" ) );
-      vkCreateRayTracingPipelinesKHR =
-        PFN_vkCreateRayTracingPipelinesKHR( vkGetInstanceProcAddr( instance, "vkCreateRayTracingPipelinesKHR" ) );
-      vkCreateRayTracingPipelinesNV =
-        PFN_vkCreateRayTracingPipelinesNV( vkGetInstanceProcAddr( instance, "vkCreateRayTracingPipelinesNV" ) );
-      vkCreateRenderPass  = PFN_vkCreateRenderPass( vkGetInstanceProcAddr( instance, "vkCreateRenderPass" ) );
-      vkCreateRenderPass2 = PFN_vkCreateRenderPass2( vkGetInstanceProcAddr( instance, "vkCreateRenderPass2" ) );
-      vkCreateRenderPass2KHR =
-        PFN_vkCreateRenderPass2KHR( vkGetInstanceProcAddr( instance, "vkCreateRenderPass2KHR" ) );
-      if ( !vkCreateRenderPass2 )
-        vkCreateRenderPass2 = vkCreateRenderPass2KHR;
-      vkCreateSampler = PFN_vkCreateSampler( vkGetInstanceProcAddr( instance, "vkCreateSampler" ) );
-      vkCreateSamplerYcbcrConversion =
-        PFN_vkCreateSamplerYcbcrConversion( vkGetInstanceProcAddr( instance, "vkCreateSamplerYcbcrConversion" ) );
+      vkWriteAccelerationStructuresPropertiesKHR = PFN_vkWriteAccelerationStructuresPropertiesKHR(
+        vkGetInstanceProcAddr( instance, "vkWriteAccelerationStructuresPropertiesKHR" ) );
+      vkCmdCopyAccelerationStructureKHR =
+        PFN_vkCmdCopyAccelerationStructureKHR( vkGetInstanceProcAddr( instance, "vkCmdCopyAccelerationStructureKHR" ) );
+      vkCmdCopyAccelerationStructureToMemoryKHR = PFN_vkCmdCopyAccelerationStructureToMemoryKHR(
+        vkGetInstanceProcAddr( instance, "vkCmdCopyAccelerationStructureToMemoryKHR" ) );
+      vkCmdCopyMemoryToAccelerationStructureKHR = PFN_vkCmdCopyMemoryToAccelerationStructureKHR(
+        vkGetInstanceProcAddr( instance, "vkCmdCopyMemoryToAccelerationStructureKHR" ) );
+      vkGetAccelerationStructureDeviceAddressKHR = PFN_vkGetAccelerationStructureDeviceAddressKHR(
+        vkGetInstanceProcAddr( instance, "vkGetAccelerationStructureDeviceAddressKHR" ) );
+      vkCmdWriteAccelerationStructuresPropertiesKHR = PFN_vkCmdWriteAccelerationStructuresPropertiesKHR(
+        vkGetInstanceProcAddr( instance, "vkCmdWriteAccelerationStructuresPropertiesKHR" ) );
+      vkGetDeviceAccelerationStructureCompatibilityKHR = PFN_vkGetDeviceAccelerationStructureCompatibilityKHR(
+        vkGetInstanceProcAddr( instance, "vkGetDeviceAccelerationStructureCompatibilityKHR" ) );
+      vkGetAccelerationStructureBuildSizesKHR = PFN_vkGetAccelerationStructureBuildSizesKHR(
+        vkGetInstanceProcAddr( instance, "vkGetAccelerationStructureBuildSizesKHR" ) );
+
+      //=== VK_KHR_sampler_ycbcr_conversion ===
       vkCreateSamplerYcbcrConversionKHR =
         PFN_vkCreateSamplerYcbcrConversionKHR( vkGetInstanceProcAddr( instance, "vkCreateSamplerYcbcrConversionKHR" ) );
       if ( !vkCreateSamplerYcbcrConversion )
         vkCreateSamplerYcbcrConversion = vkCreateSamplerYcbcrConversionKHR;
-      vkCreateSemaphore    = PFN_vkCreateSemaphore( vkGetInstanceProcAddr( instance, "vkCreateSemaphore" ) );
-      vkCreateShaderModule = PFN_vkCreateShaderModule( vkGetInstanceProcAddr( instance, "vkCreateShaderModule" ) );
-      vkCreateSharedSwapchainsKHR =
-        PFN_vkCreateSharedSwapchainsKHR( vkGetInstanceProcAddr( instance, "vkCreateSharedSwapchainsKHR" ) );
-      vkCreateSwapchainKHR = PFN_vkCreateSwapchainKHR( vkGetInstanceProcAddr( instance, "vkCreateSwapchainKHR" ) );
-      vkCreateValidationCacheEXT =
-        PFN_vkCreateValidationCacheEXT( vkGetInstanceProcAddr( instance, "vkCreateValidationCacheEXT" ) );
-#if defined( VK_ENABLE_BETA_EXTENSIONS )
-      vkCreateVideoSessionKHR =
-        PFN_vkCreateVideoSessionKHR( vkGetInstanceProcAddr( instance, "vkCreateVideoSessionKHR" ) );
-#endif /*VK_ENABLE_BETA_EXTENSIONS*/
-#if defined( VK_ENABLE_BETA_EXTENSIONS )
-      vkCreateVideoSessionParametersKHR =
-        PFN_vkCreateVideoSessionParametersKHR( vkGetInstanceProcAddr( instance, "vkCreateVideoSessionParametersKHR" ) );
-#endif /*VK_ENABLE_BETA_EXTENSIONS*/
-      vkDebugMarkerSetObjectNameEXT =
-        PFN_vkDebugMarkerSetObjectNameEXT( vkGetInstanceProcAddr( instance, "vkDebugMarkerSetObjectNameEXT" ) );
-      vkDebugMarkerSetObjectTagEXT =
-        PFN_vkDebugMarkerSetObjectTagEXT( vkGetInstanceProcAddr( instance, "vkDebugMarkerSetObjectTagEXT" ) );
-      vkDeferredOperationJoinKHR =
-        PFN_vkDeferredOperationJoinKHR( vkGetInstanceProcAddr( instance, "vkDeferredOperationJoinKHR" ) );
-      vkDestroyAccelerationStructureKHR =
-        PFN_vkDestroyAccelerationStructureKHR( vkGetInstanceProcAddr( instance, "vkDestroyAccelerationStructureKHR" ) );
-      vkDestroyAccelerationStructureNV =
-        PFN_vkDestroyAccelerationStructureNV( vkGetInstanceProcAddr( instance, "vkDestroyAccelerationStructureNV" ) );
-      vkDestroyBuffer      = PFN_vkDestroyBuffer( vkGetInstanceProcAddr( instance, "vkDestroyBuffer" ) );
-      vkDestroyBufferView  = PFN_vkDestroyBufferView( vkGetInstanceProcAddr( instance, "vkDestroyBufferView" ) );
-      vkDestroyCommandPool = PFN_vkDestroyCommandPool( vkGetInstanceProcAddr( instance, "vkDestroyCommandPool" ) );
-      vkDestroyCuFunctionNVX =
-        PFN_vkDestroyCuFunctionNVX( vkGetInstanceProcAddr( instance, "vkDestroyCuFunctionNVX" ) );
-      vkDestroyCuModuleNVX = PFN_vkDestroyCuModuleNVX( vkGetInstanceProcAddr( instance, "vkDestroyCuModuleNVX" ) );
-      vkDestroyDeferredOperationKHR =
-        PFN_vkDestroyDeferredOperationKHR( vkGetInstanceProcAddr( instance, "vkDestroyDeferredOperationKHR" ) );
-      vkDestroyDescriptorPool =
-        PFN_vkDestroyDescriptorPool( vkGetInstanceProcAddr( instance, "vkDestroyDescriptorPool" ) );
-      vkDestroyDescriptorSetLayout =
-        PFN_vkDestroyDescriptorSetLayout( vkGetInstanceProcAddr( instance, "vkDestroyDescriptorSetLayout" ) );
-      vkDestroyDescriptorUpdateTemplate =
-        PFN_vkDestroyDescriptorUpdateTemplate( vkGetInstanceProcAddr( instance, "vkDestroyDescriptorUpdateTemplate" ) );
-      vkDestroyDescriptorUpdateTemplateKHR = PFN_vkDestroyDescriptorUpdateTemplateKHR(
-        vkGetInstanceProcAddr( instance, "vkDestroyDescriptorUpdateTemplateKHR" ) );
-      if ( !vkDestroyDescriptorUpdateTemplate )
-        vkDestroyDescriptorUpdateTemplate = vkDestroyDescriptorUpdateTemplateKHR;
-      vkDestroyDevice      = PFN_vkDestroyDevice( vkGetInstanceProcAddr( instance, "vkDestroyDevice" ) );
-      vkDestroyEvent       = PFN_vkDestroyEvent( vkGetInstanceProcAddr( instance, "vkDestroyEvent" ) );
-      vkDestroyFence       = PFN_vkDestroyFence( vkGetInstanceProcAddr( instance, "vkDestroyFence" ) );
-      vkDestroyFramebuffer = PFN_vkDestroyFramebuffer( vkGetInstanceProcAddr( instance, "vkDestroyFramebuffer" ) );
-      vkDestroyImage       = PFN_vkDestroyImage( vkGetInstanceProcAddr( instance, "vkDestroyImage" ) );
-      vkDestroyImageView   = PFN_vkDestroyImageView( vkGetInstanceProcAddr( instance, "vkDestroyImageView" ) );
-      vkDestroyIndirectCommandsLayoutNV =
-        PFN_vkDestroyIndirectCommandsLayoutNV( vkGetInstanceProcAddr( instance, "vkDestroyIndirectCommandsLayoutNV" ) );
-      vkDestroyPipeline = PFN_vkDestroyPipeline( vkGetInstanceProcAddr( instance, "vkDestroyPipeline" ) );
-      vkDestroyPipelineCache =
-        PFN_vkDestroyPipelineCache( vkGetInstanceProcAddr( instance, "vkDestroyPipelineCache" ) );
-      vkDestroyPipelineLayout =
-        PFN_vkDestroyPipelineLayout( vkGetInstanceProcAddr( instance, "vkDestroyPipelineLayout" ) );
-      vkDestroyPrivateDataSlotEXT =
-        PFN_vkDestroyPrivateDataSlotEXT( vkGetInstanceProcAddr( instance, "vkDestroyPrivateDataSlotEXT" ) );
-      vkDestroyQueryPool  = PFN_vkDestroyQueryPool( vkGetInstanceProcAddr( instance, "vkDestroyQueryPool" ) );
-      vkDestroyRenderPass = PFN_vkDestroyRenderPass( vkGetInstanceProcAddr( instance, "vkDestroyRenderPass" ) );
-      vkDestroySampler    = PFN_vkDestroySampler( vkGetInstanceProcAddr( instance, "vkDestroySampler" ) );
-      vkDestroySamplerYcbcrConversion =
-        PFN_vkDestroySamplerYcbcrConversion( vkGetInstanceProcAddr( instance, "vkDestroySamplerYcbcrConversion" ) );
       vkDestroySamplerYcbcrConversionKHR = PFN_vkDestroySamplerYcbcrConversionKHR(
         vkGetInstanceProcAddr( instance, "vkDestroySamplerYcbcrConversionKHR" ) );
       if ( !vkDestroySamplerYcbcrConversion )
         vkDestroySamplerYcbcrConversion = vkDestroySamplerYcbcrConversionKHR;
-      vkDestroySemaphore    = PFN_vkDestroySemaphore( vkGetInstanceProcAddr( instance, "vkDestroySemaphore" ) );
-      vkDestroyShaderModule = PFN_vkDestroyShaderModule( vkGetInstanceProcAddr( instance, "vkDestroyShaderModule" ) );
-      vkDestroySwapchainKHR = PFN_vkDestroySwapchainKHR( vkGetInstanceProcAddr( instance, "vkDestroySwapchainKHR" ) );
-      vkDestroyValidationCacheEXT =
-        PFN_vkDestroyValidationCacheEXT( vkGetInstanceProcAddr( instance, "vkDestroyValidationCacheEXT" ) );
-#if defined( VK_ENABLE_BETA_EXTENSIONS )
-      vkDestroyVideoSessionKHR =
-        PFN_vkDestroyVideoSessionKHR( vkGetInstanceProcAddr( instance, "vkDestroyVideoSessionKHR" ) );
-#endif /*VK_ENABLE_BETA_EXTENSIONS*/
-#if defined( VK_ENABLE_BETA_EXTENSIONS )
-      vkDestroyVideoSessionParametersKHR = PFN_vkDestroyVideoSessionParametersKHR(
-        vkGetInstanceProcAddr( instance, "vkDestroyVideoSessionParametersKHR" ) );
-#endif /*VK_ENABLE_BETA_EXTENSIONS*/
-      vkDeviceWaitIdle = PFN_vkDeviceWaitIdle( vkGetInstanceProcAddr( instance, "vkDeviceWaitIdle" ) );
-      vkDisplayPowerControlEXT =
-        PFN_vkDisplayPowerControlEXT( vkGetInstanceProcAddr( instance, "vkDisplayPowerControlEXT" ) );
-      vkEndCommandBuffer = PFN_vkEndCommandBuffer( vkGetInstanceProcAddr( instance, "vkEndCommandBuffer" ) );
-      vkFlushMappedMemoryRanges =
-        PFN_vkFlushMappedMemoryRanges( vkGetInstanceProcAddr( instance, "vkFlushMappedMemoryRanges" ) );
-      vkFreeCommandBuffers = PFN_vkFreeCommandBuffers( vkGetInstanceProcAddr( instance, "vkFreeCommandBuffers" ) );
-      vkFreeDescriptorSets = PFN_vkFreeDescriptorSets( vkGetInstanceProcAddr( instance, "vkFreeDescriptorSets" ) );
-      vkFreeMemory         = PFN_vkFreeMemory( vkGetInstanceProcAddr( instance, "vkFreeMemory" ) );
-      vkGetAccelerationStructureBuildSizesKHR = PFN_vkGetAccelerationStructureBuildSizesKHR(
-        vkGetInstanceProcAddr( instance, "vkGetAccelerationStructureBuildSizesKHR" ) );
-      vkGetAccelerationStructureDeviceAddressKHR = PFN_vkGetAccelerationStructureDeviceAddressKHR(
-        vkGetInstanceProcAddr( instance, "vkGetAccelerationStructureDeviceAddressKHR" ) );
-      vkGetAccelerationStructureHandleNV = PFN_vkGetAccelerationStructureHandleNV(
-        vkGetInstanceProcAddr( instance, "vkGetAccelerationStructureHandleNV" ) );
-      vkGetAccelerationStructureMemoryRequirementsNV = PFN_vkGetAccelerationStructureMemoryRequirementsNV(
-        vkGetInstanceProcAddr( instance, "vkGetAccelerationStructureMemoryRequirementsNV" ) );
-#if defined( VK_USE_PLATFORM_ANDROID_KHR )
-      vkGetAndroidHardwareBufferPropertiesANDROID = PFN_vkGetAndroidHardwareBufferPropertiesANDROID(
-        vkGetInstanceProcAddr( instance, "vkGetAndroidHardwareBufferPropertiesANDROID" ) );
-#endif /*VK_USE_PLATFORM_ANDROID_KHR*/
-      vkGetBufferDeviceAddress =
-        PFN_vkGetBufferDeviceAddress( vkGetInstanceProcAddr( instance, "vkGetBufferDeviceAddress" ) );
-      vkGetBufferDeviceAddressEXT =
-        PFN_vkGetBufferDeviceAddressEXT( vkGetInstanceProcAddr( instance, "vkGetBufferDeviceAddressEXT" ) );
-      if ( !vkGetBufferDeviceAddress )
-        vkGetBufferDeviceAddress = vkGetBufferDeviceAddressEXT;
-      vkGetBufferDeviceAddressKHR =
-        PFN_vkGetBufferDeviceAddressKHR( vkGetInstanceProcAddr( instance, "vkGetBufferDeviceAddressKHR" ) );
-      if ( !vkGetBufferDeviceAddress )
-        vkGetBufferDeviceAddress = vkGetBufferDeviceAddressKHR;
-      vkGetBufferMemoryRequirements =
-        PFN_vkGetBufferMemoryRequirements( vkGetInstanceProcAddr( instance, "vkGetBufferMemoryRequirements" ) );
-      vkGetBufferMemoryRequirements2 =
-        PFN_vkGetBufferMemoryRequirements2( vkGetInstanceProcAddr( instance, "vkGetBufferMemoryRequirements2" ) );
-      vkGetBufferMemoryRequirements2KHR =
-        PFN_vkGetBufferMemoryRequirements2KHR( vkGetInstanceProcAddr( instance, "vkGetBufferMemoryRequirements2KHR" ) );
-      if ( !vkGetBufferMemoryRequirements2 )
-        vkGetBufferMemoryRequirements2 = vkGetBufferMemoryRequirements2KHR;
-      vkGetBufferOpaqueCaptureAddress =
-        PFN_vkGetBufferOpaqueCaptureAddress( vkGetInstanceProcAddr( instance, "vkGetBufferOpaqueCaptureAddress" ) );
-      vkGetBufferOpaqueCaptureAddressKHR = PFN_vkGetBufferOpaqueCaptureAddressKHR(
-        vkGetInstanceProcAddr( instance, "vkGetBufferOpaqueCaptureAddressKHR" ) );
-      if ( !vkGetBufferOpaqueCaptureAddress )
-        vkGetBufferOpaqueCaptureAddress = vkGetBufferOpaqueCaptureAddressKHR;
-      vkGetCalibratedTimestampsEXT =
-        PFN_vkGetCalibratedTimestampsEXT( vkGetInstanceProcAddr( instance, "vkGetCalibratedTimestampsEXT" ) );
-      vkGetDeferredOperationMaxConcurrencyKHR = PFN_vkGetDeferredOperationMaxConcurrencyKHR(
-        vkGetInstanceProcAddr( instance, "vkGetDeferredOperationMaxConcurrencyKHR" ) );
-      vkGetDeferredOperationResultKHR =
-        PFN_vkGetDeferredOperationResultKHR( vkGetInstanceProcAddr( instance, "vkGetDeferredOperationResultKHR" ) );
-      vkGetDescriptorSetLayoutSupport =
-        PFN_vkGetDescriptorSetLayoutSupport( vkGetInstanceProcAddr( instance, "vkGetDescriptorSetLayoutSupport" ) );
-      vkGetDescriptorSetLayoutSupportKHR = PFN_vkGetDescriptorSetLayoutSupportKHR(
-        vkGetInstanceProcAddr( instance, "vkGetDescriptorSetLayoutSupportKHR" ) );
-      if ( !vkGetDescriptorSetLayoutSupport )
-        vkGetDescriptorSetLayoutSupport = vkGetDescriptorSetLayoutSupportKHR;
-      vkGetDeviceAccelerationStructureCompatibilityKHR = PFN_vkGetDeviceAccelerationStructureCompatibilityKHR(
-        vkGetInstanceProcAddr( instance, "vkGetDeviceAccelerationStructureCompatibilityKHR" ) );
-      vkGetDeviceGroupPeerMemoryFeatures = PFN_vkGetDeviceGroupPeerMemoryFeatures(
-        vkGetInstanceProcAddr( instance, "vkGetDeviceGroupPeerMemoryFeatures" ) );
-      vkGetDeviceGroupPeerMemoryFeaturesKHR = PFN_vkGetDeviceGroupPeerMemoryFeaturesKHR(
-        vkGetInstanceProcAddr( instance, "vkGetDeviceGroupPeerMemoryFeaturesKHR" ) );
-      if ( !vkGetDeviceGroupPeerMemoryFeatures )
-        vkGetDeviceGroupPeerMemoryFeatures = vkGetDeviceGroupPeerMemoryFeaturesKHR;
-      vkGetDeviceGroupPresentCapabilitiesKHR = PFN_vkGetDeviceGroupPresentCapabilitiesKHR(
-        vkGetInstanceProcAddr( instance, "vkGetDeviceGroupPresentCapabilitiesKHR" ) );
-#if defined( VK_USE_PLATFORM_WIN32_KHR )
-      vkGetDeviceGroupSurfacePresentModes2EXT = PFN_vkGetDeviceGroupSurfacePresentModes2EXT(
-        vkGetInstanceProcAddr( instance, "vkGetDeviceGroupSurfacePresentModes2EXT" ) );
-#endif /*VK_USE_PLATFORM_WIN32_KHR*/
-      vkGetDeviceGroupSurfacePresentModesKHR = PFN_vkGetDeviceGroupSurfacePresentModesKHR(
-        vkGetInstanceProcAddr( instance, "vkGetDeviceGroupSurfacePresentModesKHR" ) );
-      vkGetDeviceMemoryCommitment =
-        PFN_vkGetDeviceMemoryCommitment( vkGetInstanceProcAddr( instance, "vkGetDeviceMemoryCommitment" ) );
-      vkGetDeviceMemoryOpaqueCaptureAddress = PFN_vkGetDeviceMemoryOpaqueCaptureAddress(
-        vkGetInstanceProcAddr( instance, "vkGetDeviceMemoryOpaqueCaptureAddress" ) );
-      vkGetDeviceMemoryOpaqueCaptureAddressKHR = PFN_vkGetDeviceMemoryOpaqueCaptureAddressKHR(
-        vkGetInstanceProcAddr( instance, "vkGetDeviceMemoryOpaqueCaptureAddressKHR" ) );
-      if ( !vkGetDeviceMemoryOpaqueCaptureAddress )
-        vkGetDeviceMemoryOpaqueCaptureAddress = vkGetDeviceMemoryOpaqueCaptureAddressKHR;
-      vkGetDeviceProcAddr = PFN_vkGetDeviceProcAddr( vkGetInstanceProcAddr( instance, "vkGetDeviceProcAddr" ) );
-      vkGetDeviceQueue    = PFN_vkGetDeviceQueue( vkGetInstanceProcAddr( instance, "vkGetDeviceQueue" ) );
-      vkGetDeviceQueue2   = PFN_vkGetDeviceQueue2( vkGetInstanceProcAddr( instance, "vkGetDeviceQueue2" ) );
-      vkGetDeviceSubpassShadingMaxWorkgroupSizeHUAWEI = PFN_vkGetDeviceSubpassShadingMaxWorkgroupSizeHUAWEI(
-        vkGetInstanceProcAddr( instance, "vkGetDeviceSubpassShadingMaxWorkgroupSizeHUAWEI" ) );
-      vkGetEventStatus = PFN_vkGetEventStatus( vkGetInstanceProcAddr( instance, "vkGetEventStatus" ) );
-      vkGetFenceFdKHR  = PFN_vkGetFenceFdKHR( vkGetInstanceProcAddr( instance, "vkGetFenceFdKHR" ) );
-      vkGetFenceStatus = PFN_vkGetFenceStatus( vkGetInstanceProcAddr( instance, "vkGetFenceStatus" ) );
-#if defined( VK_USE_PLATFORM_WIN32_KHR )
-      vkGetFenceWin32HandleKHR =
-        PFN_vkGetFenceWin32HandleKHR( vkGetInstanceProcAddr( instance, "vkGetFenceWin32HandleKHR" ) );
-#endif /*VK_USE_PLATFORM_WIN32_KHR*/
-      vkGetGeneratedCommandsMemoryRequirementsNV = PFN_vkGetGeneratedCommandsMemoryRequirementsNV(
-        vkGetInstanceProcAddr( instance, "vkGetGeneratedCommandsMemoryRequirementsNV" ) );
+
+      //=== VK_KHR_bind_memory2 ===
+      vkBindBufferMemory2KHR =
+        PFN_vkBindBufferMemory2KHR( vkGetInstanceProcAddr( instance, "vkBindBufferMemory2KHR" ) );
+      if ( !vkBindBufferMemory2 )
+        vkBindBufferMemory2 = vkBindBufferMemory2KHR;
+      vkBindImageMemory2KHR = PFN_vkBindImageMemory2KHR( vkGetInstanceProcAddr( instance, "vkBindImageMemory2KHR" ) );
+      if ( !vkBindImageMemory2 )
+        vkBindImageMemory2 = vkBindImageMemory2KHR;
+
+      //=== VK_EXT_image_drm_format_modifier ===
       vkGetImageDrmFormatModifierPropertiesEXT = PFN_vkGetImageDrmFormatModifierPropertiesEXT(
         vkGetInstanceProcAddr( instance, "vkGetImageDrmFormatModifierPropertiesEXT" ) );
-      vkGetImageMemoryRequirements =
-        PFN_vkGetImageMemoryRequirements( vkGetInstanceProcAddr( instance, "vkGetImageMemoryRequirements" ) );
-      vkGetImageMemoryRequirements2 =
-        PFN_vkGetImageMemoryRequirements2( vkGetInstanceProcAddr( instance, "vkGetImageMemoryRequirements2" ) );
-      vkGetImageMemoryRequirements2KHR =
-        PFN_vkGetImageMemoryRequirements2KHR( vkGetInstanceProcAddr( instance, "vkGetImageMemoryRequirements2KHR" ) );
-      if ( !vkGetImageMemoryRequirements2 )
-        vkGetImageMemoryRequirements2 = vkGetImageMemoryRequirements2KHR;
-      vkGetImageSparseMemoryRequirements = PFN_vkGetImageSparseMemoryRequirements(
-        vkGetInstanceProcAddr( instance, "vkGetImageSparseMemoryRequirements" ) );
-      vkGetImageSparseMemoryRequirements2 = PFN_vkGetImageSparseMemoryRequirements2(
-        vkGetInstanceProcAddr( instance, "vkGetImageSparseMemoryRequirements2" ) );
-      vkGetImageSparseMemoryRequirements2KHR = PFN_vkGetImageSparseMemoryRequirements2KHR(
-        vkGetInstanceProcAddr( instance, "vkGetImageSparseMemoryRequirements2KHR" ) );
-      if ( !vkGetImageSparseMemoryRequirements2 )
-        vkGetImageSparseMemoryRequirements2 = vkGetImageSparseMemoryRequirements2KHR;
-      vkGetImageSubresourceLayout =
-        PFN_vkGetImageSubresourceLayout( vkGetInstanceProcAddr( instance, "vkGetImageSubresourceLayout" ) );
-      vkGetImageViewAddressNVX =
-        PFN_vkGetImageViewAddressNVX( vkGetInstanceProcAddr( instance, "vkGetImageViewAddressNVX" ) );
-      vkGetImageViewHandleNVX =
-        PFN_vkGetImageViewHandleNVX( vkGetInstanceProcAddr( instance, "vkGetImageViewHandleNVX" ) );
-#if defined( VK_USE_PLATFORM_ANDROID_KHR )
-      vkGetMemoryAndroidHardwareBufferANDROID = PFN_vkGetMemoryAndroidHardwareBufferANDROID(
-        vkGetInstanceProcAddr( instance, "vkGetMemoryAndroidHardwareBufferANDROID" ) );
-#endif /*VK_USE_PLATFORM_ANDROID_KHR*/
-      vkGetMemoryFdKHR = PFN_vkGetMemoryFdKHR( vkGetInstanceProcAddr( instance, "vkGetMemoryFdKHR" ) );
-      vkGetMemoryFdPropertiesKHR =
-        PFN_vkGetMemoryFdPropertiesKHR( vkGetInstanceProcAddr( instance, "vkGetMemoryFdPropertiesKHR" ) );
-      vkGetMemoryHostPointerPropertiesEXT = PFN_vkGetMemoryHostPointerPropertiesEXT(
-        vkGetInstanceProcAddr( instance, "vkGetMemoryHostPointerPropertiesEXT" ) );
-      vkGetMemoryRemoteAddressNV =
-        PFN_vkGetMemoryRemoteAddressNV( vkGetInstanceProcAddr( instance, "vkGetMemoryRemoteAddressNV" ) );
-#if defined( VK_USE_PLATFORM_WIN32_KHR )
-      vkGetMemoryWin32HandleKHR =
-        PFN_vkGetMemoryWin32HandleKHR( vkGetInstanceProcAddr( instance, "vkGetMemoryWin32HandleKHR" ) );
-#endif /*VK_USE_PLATFORM_WIN32_KHR*/
-#if defined( VK_USE_PLATFORM_WIN32_KHR )
-      vkGetMemoryWin32HandleNV =
-        PFN_vkGetMemoryWin32HandleNV( vkGetInstanceProcAddr( instance, "vkGetMemoryWin32HandleNV" ) );
-#endif /*VK_USE_PLATFORM_WIN32_KHR*/
-#if defined( VK_USE_PLATFORM_WIN32_KHR )
-      vkGetMemoryWin32HandlePropertiesKHR = PFN_vkGetMemoryWin32HandlePropertiesKHR(
-        vkGetInstanceProcAddr( instance, "vkGetMemoryWin32HandlePropertiesKHR" ) );
-#endif /*VK_USE_PLATFORM_WIN32_KHR*/
-#if defined( VK_USE_PLATFORM_FUCHSIA )
-      vkGetMemoryZirconHandleFUCHSIA =
-        PFN_vkGetMemoryZirconHandleFUCHSIA( vkGetInstanceProcAddr( instance, "vkGetMemoryZirconHandleFUCHSIA" ) );
-#endif /*VK_USE_PLATFORM_FUCHSIA*/
-#if defined( VK_USE_PLATFORM_FUCHSIA )
-      vkGetMemoryZirconHandlePropertiesFUCHSIA = PFN_vkGetMemoryZirconHandlePropertiesFUCHSIA(
-        vkGetInstanceProcAddr( instance, "vkGetMemoryZirconHandlePropertiesFUCHSIA" ) );
-#endif /*VK_USE_PLATFORM_FUCHSIA*/
-      vkGetPastPresentationTimingGOOGLE =
-        PFN_vkGetPastPresentationTimingGOOGLE( vkGetInstanceProcAddr( instance, "vkGetPastPresentationTimingGOOGLE" ) );
-      vkGetPerformanceParameterINTEL =
-        PFN_vkGetPerformanceParameterINTEL( vkGetInstanceProcAddr( instance, "vkGetPerformanceParameterINTEL" ) );
-      vkGetPipelineCacheData =
-        PFN_vkGetPipelineCacheData( vkGetInstanceProcAddr( instance, "vkGetPipelineCacheData" ) );
-      vkGetPipelineExecutableInternalRepresentationsKHR = PFN_vkGetPipelineExecutableInternalRepresentationsKHR(
-        vkGetInstanceProcAddr( instance, "vkGetPipelineExecutableInternalRepresentationsKHR" ) );
-      vkGetPipelineExecutablePropertiesKHR = PFN_vkGetPipelineExecutablePropertiesKHR(
-        vkGetInstanceProcAddr( instance, "vkGetPipelineExecutablePropertiesKHR" ) );
-      vkGetPipelineExecutableStatisticsKHR = PFN_vkGetPipelineExecutableStatisticsKHR(
-        vkGetInstanceProcAddr( instance, "vkGetPipelineExecutableStatisticsKHR" ) );
-      vkGetPrivateDataEXT   = PFN_vkGetPrivateDataEXT( vkGetInstanceProcAddr( instance, "vkGetPrivateDataEXT" ) );
-      vkGetQueryPoolResults = PFN_vkGetQueryPoolResults( vkGetInstanceProcAddr( instance, "vkGetQueryPoolResults" ) );
-      vkGetQueueCheckpointData2NV =
-        PFN_vkGetQueueCheckpointData2NV( vkGetInstanceProcAddr( instance, "vkGetQueueCheckpointData2NV" ) );
-      vkGetQueueCheckpointDataNV =
-        PFN_vkGetQueueCheckpointDataNV( vkGetInstanceProcAddr( instance, "vkGetQueueCheckpointDataNV" ) );
-      vkGetRayTracingCaptureReplayShaderGroupHandlesKHR = PFN_vkGetRayTracingCaptureReplayShaderGroupHandlesKHR(
-        vkGetInstanceProcAddr( instance, "vkGetRayTracingCaptureReplayShaderGroupHandlesKHR" ) );
-      vkGetRayTracingShaderGroupHandlesKHR = PFN_vkGetRayTracingShaderGroupHandlesKHR(
-        vkGetInstanceProcAddr( instance, "vkGetRayTracingShaderGroupHandlesKHR" ) );
+
+      //=== VK_EXT_validation_cache ===
+      vkCreateValidationCacheEXT =
+        PFN_vkCreateValidationCacheEXT( vkGetInstanceProcAddr( instance, "vkCreateValidationCacheEXT" ) );
+      vkDestroyValidationCacheEXT =
+        PFN_vkDestroyValidationCacheEXT( vkGetInstanceProcAddr( instance, "vkDestroyValidationCacheEXT" ) );
+      vkMergeValidationCachesEXT =
+        PFN_vkMergeValidationCachesEXT( vkGetInstanceProcAddr( instance, "vkMergeValidationCachesEXT" ) );
+      vkGetValidationCacheDataEXT =
+        PFN_vkGetValidationCacheDataEXT( vkGetInstanceProcAddr( instance, "vkGetValidationCacheDataEXT" ) );
+
+      //=== VK_NV_shading_rate_image ===
+      vkCmdBindShadingRateImageNV =
+        PFN_vkCmdBindShadingRateImageNV( vkGetInstanceProcAddr( instance, "vkCmdBindShadingRateImageNV" ) );
+      vkCmdSetViewportShadingRatePaletteNV = PFN_vkCmdSetViewportShadingRatePaletteNV(
+        vkGetInstanceProcAddr( instance, "vkCmdSetViewportShadingRatePaletteNV" ) );
+      vkCmdSetCoarseSampleOrderNV =
+        PFN_vkCmdSetCoarseSampleOrderNV( vkGetInstanceProcAddr( instance, "vkCmdSetCoarseSampleOrderNV" ) );
+
+      //=== VK_NV_ray_tracing ===
+      vkCreateAccelerationStructureNV =
+        PFN_vkCreateAccelerationStructureNV( vkGetInstanceProcAddr( instance, "vkCreateAccelerationStructureNV" ) );
+      vkDestroyAccelerationStructureNV =
+        PFN_vkDestroyAccelerationStructureNV( vkGetInstanceProcAddr( instance, "vkDestroyAccelerationStructureNV" ) );
+      vkGetAccelerationStructureMemoryRequirementsNV = PFN_vkGetAccelerationStructureMemoryRequirementsNV(
+        vkGetInstanceProcAddr( instance, "vkGetAccelerationStructureMemoryRequirementsNV" ) );
+      vkBindAccelerationStructureMemoryNV = PFN_vkBindAccelerationStructureMemoryNV(
+        vkGetInstanceProcAddr( instance, "vkBindAccelerationStructureMemoryNV" ) );
+      vkCmdBuildAccelerationStructureNV =
+        PFN_vkCmdBuildAccelerationStructureNV( vkGetInstanceProcAddr( instance, "vkCmdBuildAccelerationStructureNV" ) );
+      vkCmdCopyAccelerationStructureNV =
+        PFN_vkCmdCopyAccelerationStructureNV( vkGetInstanceProcAddr( instance, "vkCmdCopyAccelerationStructureNV" ) );
+      vkCmdTraceRaysNV = PFN_vkCmdTraceRaysNV( vkGetInstanceProcAddr( instance, "vkCmdTraceRaysNV" ) );
+      vkCreateRayTracingPipelinesNV =
+        PFN_vkCreateRayTracingPipelinesNV( vkGetInstanceProcAddr( instance, "vkCreateRayTracingPipelinesNV" ) );
       vkGetRayTracingShaderGroupHandlesNV = PFN_vkGetRayTracingShaderGroupHandlesNV(
         vkGetInstanceProcAddr( instance, "vkGetRayTracingShaderGroupHandlesNV" ) );
       if ( !vkGetRayTracingShaderGroupHandlesKHR )
         vkGetRayTracingShaderGroupHandlesKHR = vkGetRayTracingShaderGroupHandlesNV;
-      vkGetRayTracingShaderGroupStackSizeKHR = PFN_vkGetRayTracingShaderGroupStackSizeKHR(
-        vkGetInstanceProcAddr( instance, "vkGetRayTracingShaderGroupStackSizeKHR" ) );
-      vkGetRefreshCycleDurationGOOGLE =
-        PFN_vkGetRefreshCycleDurationGOOGLE( vkGetInstanceProcAddr( instance, "vkGetRefreshCycleDurationGOOGLE" ) );
-      vkGetRenderAreaGranularity =
-        PFN_vkGetRenderAreaGranularity( vkGetInstanceProcAddr( instance, "vkGetRenderAreaGranularity" ) );
-      vkGetSemaphoreCounterValue =
-        PFN_vkGetSemaphoreCounterValue( vkGetInstanceProcAddr( instance, "vkGetSemaphoreCounterValue" ) );
+      vkGetAccelerationStructureHandleNV = PFN_vkGetAccelerationStructureHandleNV(
+        vkGetInstanceProcAddr( instance, "vkGetAccelerationStructureHandleNV" ) );
+      vkCmdWriteAccelerationStructuresPropertiesNV = PFN_vkCmdWriteAccelerationStructuresPropertiesNV(
+        vkGetInstanceProcAddr( instance, "vkCmdWriteAccelerationStructuresPropertiesNV" ) );
+      vkCompileDeferredNV = PFN_vkCompileDeferredNV( vkGetInstanceProcAddr( instance, "vkCompileDeferredNV" ) );
+
+      //=== VK_KHR_maintenance3 ===
+      vkGetDescriptorSetLayoutSupportKHR = PFN_vkGetDescriptorSetLayoutSupportKHR(
+        vkGetInstanceProcAddr( instance, "vkGetDescriptorSetLayoutSupportKHR" ) );
+      if ( !vkGetDescriptorSetLayoutSupport )
+        vkGetDescriptorSetLayoutSupport = vkGetDescriptorSetLayoutSupportKHR;
+
+      //=== VK_KHR_draw_indirect_count ===
+      vkCmdDrawIndirectCountKHR =
+        PFN_vkCmdDrawIndirectCountKHR( vkGetInstanceProcAddr( instance, "vkCmdDrawIndirectCountKHR" ) );
+      if ( !vkCmdDrawIndirectCount )
+        vkCmdDrawIndirectCount = vkCmdDrawIndirectCountKHR;
+      vkCmdDrawIndexedIndirectCountKHR =
+        PFN_vkCmdDrawIndexedIndirectCountKHR( vkGetInstanceProcAddr( instance, "vkCmdDrawIndexedIndirectCountKHR" ) );
+      if ( !vkCmdDrawIndexedIndirectCount )
+        vkCmdDrawIndexedIndirectCount = vkCmdDrawIndexedIndirectCountKHR;
+
+      //=== VK_EXT_external_memory_host ===
+      vkGetMemoryHostPointerPropertiesEXT = PFN_vkGetMemoryHostPointerPropertiesEXT(
+        vkGetInstanceProcAddr( instance, "vkGetMemoryHostPointerPropertiesEXT" ) );
+
+      //=== VK_AMD_buffer_marker ===
+      vkCmdWriteBufferMarkerAMD =
+        PFN_vkCmdWriteBufferMarkerAMD( vkGetInstanceProcAddr( instance, "vkCmdWriteBufferMarkerAMD" ) );
+
+      //=== VK_EXT_calibrated_timestamps ===
+      vkGetPhysicalDeviceCalibrateableTimeDomainsEXT = PFN_vkGetPhysicalDeviceCalibrateableTimeDomainsEXT(
+        vkGetInstanceProcAddr( instance, "vkGetPhysicalDeviceCalibrateableTimeDomainsEXT" ) );
+      vkGetCalibratedTimestampsEXT =
+        PFN_vkGetCalibratedTimestampsEXT( vkGetInstanceProcAddr( instance, "vkGetCalibratedTimestampsEXT" ) );
+
+      //=== VK_NV_mesh_shader ===
+      vkCmdDrawMeshTasksNV = PFN_vkCmdDrawMeshTasksNV( vkGetInstanceProcAddr( instance, "vkCmdDrawMeshTasksNV" ) );
+      vkCmdDrawMeshTasksIndirectNV =
+        PFN_vkCmdDrawMeshTasksIndirectNV( vkGetInstanceProcAddr( instance, "vkCmdDrawMeshTasksIndirectNV" ) );
+      vkCmdDrawMeshTasksIndirectCountNV =
+        PFN_vkCmdDrawMeshTasksIndirectCountNV( vkGetInstanceProcAddr( instance, "vkCmdDrawMeshTasksIndirectCountNV" ) );
+
+      //=== VK_NV_scissor_exclusive ===
+      vkCmdSetExclusiveScissorNV =
+        PFN_vkCmdSetExclusiveScissorNV( vkGetInstanceProcAddr( instance, "vkCmdSetExclusiveScissorNV" ) );
+
+      //=== VK_NV_device_diagnostic_checkpoints ===
+      vkCmdSetCheckpointNV = PFN_vkCmdSetCheckpointNV( vkGetInstanceProcAddr( instance, "vkCmdSetCheckpointNV" ) );
+      vkGetQueueCheckpointDataNV =
+        PFN_vkGetQueueCheckpointDataNV( vkGetInstanceProcAddr( instance, "vkGetQueueCheckpointDataNV" ) );
+
+      //=== VK_KHR_timeline_semaphore ===
       vkGetSemaphoreCounterValueKHR =
         PFN_vkGetSemaphoreCounterValueKHR( vkGetInstanceProcAddr( instance, "vkGetSemaphoreCounterValueKHR" ) );
       if ( !vkGetSemaphoreCounterValue )
         vkGetSemaphoreCounterValue = vkGetSemaphoreCounterValueKHR;
-      vkGetSemaphoreFdKHR = PFN_vkGetSemaphoreFdKHR( vkGetInstanceProcAddr( instance, "vkGetSemaphoreFdKHR" ) );
-#if defined( VK_USE_PLATFORM_WIN32_KHR )
-      vkGetSemaphoreWin32HandleKHR =
-        PFN_vkGetSemaphoreWin32HandleKHR( vkGetInstanceProcAddr( instance, "vkGetSemaphoreWin32HandleKHR" ) );
-#endif /*VK_USE_PLATFORM_WIN32_KHR*/
-#if defined( VK_USE_PLATFORM_FUCHSIA )
-      vkGetSemaphoreZirconHandleFUCHSIA =
-        PFN_vkGetSemaphoreZirconHandleFUCHSIA( vkGetInstanceProcAddr( instance, "vkGetSemaphoreZirconHandleFUCHSIA" ) );
-#endif /*VK_USE_PLATFORM_FUCHSIA*/
-      vkGetShaderInfoAMD = PFN_vkGetShaderInfoAMD( vkGetInstanceProcAddr( instance, "vkGetShaderInfoAMD" ) );
-      vkGetSwapchainCounterEXT =
-        PFN_vkGetSwapchainCounterEXT( vkGetInstanceProcAddr( instance, "vkGetSwapchainCounterEXT" ) );
-      vkGetSwapchainImagesKHR =
-        PFN_vkGetSwapchainImagesKHR( vkGetInstanceProcAddr( instance, "vkGetSwapchainImagesKHR" ) );
-      vkGetSwapchainStatusKHR =
-        PFN_vkGetSwapchainStatusKHR( vkGetInstanceProcAddr( instance, "vkGetSwapchainStatusKHR" ) );
-      vkGetValidationCacheDataEXT =
-        PFN_vkGetValidationCacheDataEXT( vkGetInstanceProcAddr( instance, "vkGetValidationCacheDataEXT" ) );
-#if defined( VK_ENABLE_BETA_EXTENSIONS )
-      vkGetVideoSessionMemoryRequirementsKHR = PFN_vkGetVideoSessionMemoryRequirementsKHR(
-        vkGetInstanceProcAddr( instance, "vkGetVideoSessionMemoryRequirementsKHR" ) );
-#endif /*VK_ENABLE_BETA_EXTENSIONS*/
-      vkImportFenceFdKHR = PFN_vkImportFenceFdKHR( vkGetInstanceProcAddr( instance, "vkImportFenceFdKHR" ) );
-#if defined( VK_USE_PLATFORM_WIN32_KHR )
-      vkImportFenceWin32HandleKHR =
-        PFN_vkImportFenceWin32HandleKHR( vkGetInstanceProcAddr( instance, "vkImportFenceWin32HandleKHR" ) );
-#endif /*VK_USE_PLATFORM_WIN32_KHR*/
-      vkImportSemaphoreFdKHR =
-        PFN_vkImportSemaphoreFdKHR( vkGetInstanceProcAddr( instance, "vkImportSemaphoreFdKHR" ) );
-#if defined( VK_USE_PLATFORM_WIN32_KHR )
-      vkImportSemaphoreWin32HandleKHR =
-        PFN_vkImportSemaphoreWin32HandleKHR( vkGetInstanceProcAddr( instance, "vkImportSemaphoreWin32HandleKHR" ) );
-#endif /*VK_USE_PLATFORM_WIN32_KHR*/
-#if defined( VK_USE_PLATFORM_FUCHSIA )
-      vkImportSemaphoreZirconHandleFUCHSIA = PFN_vkImportSemaphoreZirconHandleFUCHSIA(
-        vkGetInstanceProcAddr( instance, "vkImportSemaphoreZirconHandleFUCHSIA" ) );
-#endif /*VK_USE_PLATFORM_FUCHSIA*/
-      vkInitializePerformanceApiINTEL =
-        PFN_vkInitializePerformanceApiINTEL( vkGetInstanceProcAddr( instance, "vkInitializePerformanceApiINTEL" ) );
-      vkInvalidateMappedMemoryRanges =
-        PFN_vkInvalidateMappedMemoryRanges( vkGetInstanceProcAddr( instance, "vkInvalidateMappedMemoryRanges" ) );
-      vkMapMemory           = PFN_vkMapMemory( vkGetInstanceProcAddr( instance, "vkMapMemory" ) );
-      vkMergePipelineCaches = PFN_vkMergePipelineCaches( vkGetInstanceProcAddr( instance, "vkMergePipelineCaches" ) );
-      vkMergeValidationCachesEXT =
-        PFN_vkMergeValidationCachesEXT( vkGetInstanceProcAddr( instance, "vkMergeValidationCachesEXT" ) );
-      vkQueueBeginDebugUtilsLabelEXT =
-        PFN_vkQueueBeginDebugUtilsLabelEXT( vkGetInstanceProcAddr( instance, "vkQueueBeginDebugUtilsLabelEXT" ) );
-      vkQueueBindSparse = PFN_vkQueueBindSparse( vkGetInstanceProcAddr( instance, "vkQueueBindSparse" ) );
-      vkQueueEndDebugUtilsLabelEXT =
-        PFN_vkQueueEndDebugUtilsLabelEXT( vkGetInstanceProcAddr( instance, "vkQueueEndDebugUtilsLabelEXT" ) );
-      vkQueueInsertDebugUtilsLabelEXT =
-        PFN_vkQueueInsertDebugUtilsLabelEXT( vkGetInstanceProcAddr( instance, "vkQueueInsertDebugUtilsLabelEXT" ) );
-      vkQueuePresentKHR = PFN_vkQueuePresentKHR( vkGetInstanceProcAddr( instance, "vkQueuePresentKHR" ) );
-      vkQueueSetPerformanceConfigurationINTEL = PFN_vkQueueSetPerformanceConfigurationINTEL(
-        vkGetInstanceProcAddr( instance, "vkQueueSetPerformanceConfigurationINTEL" ) );
-      vkQueueSubmit     = PFN_vkQueueSubmit( vkGetInstanceProcAddr( instance, "vkQueueSubmit" ) );
-      vkQueueSubmit2KHR = PFN_vkQueueSubmit2KHR( vkGetInstanceProcAddr( instance, "vkQueueSubmit2KHR" ) );
-      vkQueueWaitIdle   = PFN_vkQueueWaitIdle( vkGetInstanceProcAddr( instance, "vkQueueWaitIdle" ) );
-      vkRegisterDeviceEventEXT =
-        PFN_vkRegisterDeviceEventEXT( vkGetInstanceProcAddr( instance, "vkRegisterDeviceEventEXT" ) );
-      vkRegisterDisplayEventEXT =
-        PFN_vkRegisterDisplayEventEXT( vkGetInstanceProcAddr( instance, "vkRegisterDisplayEventEXT" ) );
-#if defined( VK_USE_PLATFORM_WIN32_KHR )
-      vkReleaseFullScreenExclusiveModeEXT = PFN_vkReleaseFullScreenExclusiveModeEXT(
-        vkGetInstanceProcAddr( instance, "vkReleaseFullScreenExclusiveModeEXT" ) );
-#endif /*VK_USE_PLATFORM_WIN32_KHR*/
-      vkReleasePerformanceConfigurationINTEL = PFN_vkReleasePerformanceConfigurationINTEL(
-        vkGetInstanceProcAddr( instance, "vkReleasePerformanceConfigurationINTEL" ) );
-      vkReleaseProfilingLockKHR =
-        PFN_vkReleaseProfilingLockKHR( vkGetInstanceProcAddr( instance, "vkReleaseProfilingLockKHR" ) );
-      vkResetCommandBuffer  = PFN_vkResetCommandBuffer( vkGetInstanceProcAddr( instance, "vkResetCommandBuffer" ) );
-      vkResetCommandPool    = PFN_vkResetCommandPool( vkGetInstanceProcAddr( instance, "vkResetCommandPool" ) );
-      vkResetDescriptorPool = PFN_vkResetDescriptorPool( vkGetInstanceProcAddr( instance, "vkResetDescriptorPool" ) );
-      vkResetEvent          = PFN_vkResetEvent( vkGetInstanceProcAddr( instance, "vkResetEvent" ) );
-      vkResetFences         = PFN_vkResetFences( vkGetInstanceProcAddr( instance, "vkResetFences" ) );
-      vkResetQueryPool      = PFN_vkResetQueryPool( vkGetInstanceProcAddr( instance, "vkResetQueryPool" ) );
-      vkResetQueryPoolEXT   = PFN_vkResetQueryPoolEXT( vkGetInstanceProcAddr( instance, "vkResetQueryPoolEXT" ) );
-      if ( !vkResetQueryPool )
-        vkResetQueryPool = vkResetQueryPoolEXT;
-      vkSetDebugUtilsObjectNameEXT =
-        PFN_vkSetDebugUtilsObjectNameEXT( vkGetInstanceProcAddr( instance, "vkSetDebugUtilsObjectNameEXT" ) );
-      vkSetDebugUtilsObjectTagEXT =
-        PFN_vkSetDebugUtilsObjectTagEXT( vkGetInstanceProcAddr( instance, "vkSetDebugUtilsObjectTagEXT" ) );
-      vkSetEvent           = PFN_vkSetEvent( vkGetInstanceProcAddr( instance, "vkSetEvent" ) );
-      vkSetHdrMetadataEXT  = PFN_vkSetHdrMetadataEXT( vkGetInstanceProcAddr( instance, "vkSetHdrMetadataEXT" ) );
-      vkSetLocalDimmingAMD = PFN_vkSetLocalDimmingAMD( vkGetInstanceProcAddr( instance, "vkSetLocalDimmingAMD" ) );
-      vkSetPrivateDataEXT  = PFN_vkSetPrivateDataEXT( vkGetInstanceProcAddr( instance, "vkSetPrivateDataEXT" ) );
-      vkSignalSemaphore    = PFN_vkSignalSemaphore( vkGetInstanceProcAddr( instance, "vkSignalSemaphore" ) );
-      vkSignalSemaphoreKHR = PFN_vkSignalSemaphoreKHR( vkGetInstanceProcAddr( instance, "vkSignalSemaphoreKHR" ) );
-      if ( !vkSignalSemaphore )
-        vkSignalSemaphore = vkSignalSemaphoreKHR;
-      vkTrimCommandPool    = PFN_vkTrimCommandPool( vkGetInstanceProcAddr( instance, "vkTrimCommandPool" ) );
-      vkTrimCommandPoolKHR = PFN_vkTrimCommandPoolKHR( vkGetInstanceProcAddr( instance, "vkTrimCommandPoolKHR" ) );
-      if ( !vkTrimCommandPool )
-        vkTrimCommandPool = vkTrimCommandPoolKHR;
-      vkUninitializePerformanceApiINTEL =
-        PFN_vkUninitializePerformanceApiINTEL( vkGetInstanceProcAddr( instance, "vkUninitializePerformanceApiINTEL" ) );
-      vkUnmapMemory = PFN_vkUnmapMemory( vkGetInstanceProcAddr( instance, "vkUnmapMemory" ) );
-      vkUpdateDescriptorSetWithTemplate =
-        PFN_vkUpdateDescriptorSetWithTemplate( vkGetInstanceProcAddr( instance, "vkUpdateDescriptorSetWithTemplate" ) );
-      vkUpdateDescriptorSetWithTemplateKHR = PFN_vkUpdateDescriptorSetWithTemplateKHR(
-        vkGetInstanceProcAddr( instance, "vkUpdateDescriptorSetWithTemplateKHR" ) );
-      if ( !vkUpdateDescriptorSetWithTemplate )
-        vkUpdateDescriptorSetWithTemplate = vkUpdateDescriptorSetWithTemplateKHR;
-      vkUpdateDescriptorSets =
-        PFN_vkUpdateDescriptorSets( vkGetInstanceProcAddr( instance, "vkUpdateDescriptorSets" ) );
-#if defined( VK_ENABLE_BETA_EXTENSIONS )
-      vkUpdateVideoSessionParametersKHR =
-        PFN_vkUpdateVideoSessionParametersKHR( vkGetInstanceProcAddr( instance, "vkUpdateVideoSessionParametersKHR" ) );
-#endif /*VK_ENABLE_BETA_EXTENSIONS*/
-      vkWaitForFences     = PFN_vkWaitForFences( vkGetInstanceProcAddr( instance, "vkWaitForFences" ) );
-      vkWaitSemaphores    = PFN_vkWaitSemaphores( vkGetInstanceProcAddr( instance, "vkWaitSemaphores" ) );
       vkWaitSemaphoresKHR = PFN_vkWaitSemaphoresKHR( vkGetInstanceProcAddr( instance, "vkWaitSemaphoresKHR" ) );
       if ( !vkWaitSemaphores )
         vkWaitSemaphores = vkWaitSemaphoresKHR;
-      vkWriteAccelerationStructuresPropertiesKHR = PFN_vkWriteAccelerationStructuresPropertiesKHR(
-        vkGetInstanceProcAddr( instance, "vkWriteAccelerationStructuresPropertiesKHR" ) );
+      vkSignalSemaphoreKHR = PFN_vkSignalSemaphoreKHR( vkGetInstanceProcAddr( instance, "vkSignalSemaphoreKHR" ) );
+      if ( !vkSignalSemaphore )
+        vkSignalSemaphore = vkSignalSemaphoreKHR;
+
+      //=== VK_INTEL_performance_query ===
+      vkInitializePerformanceApiINTEL =
+        PFN_vkInitializePerformanceApiINTEL( vkGetInstanceProcAddr( instance, "vkInitializePerformanceApiINTEL" ) );
+      vkUninitializePerformanceApiINTEL =
+        PFN_vkUninitializePerformanceApiINTEL( vkGetInstanceProcAddr( instance, "vkUninitializePerformanceApiINTEL" ) );
+      vkCmdSetPerformanceMarkerINTEL =
+        PFN_vkCmdSetPerformanceMarkerINTEL( vkGetInstanceProcAddr( instance, "vkCmdSetPerformanceMarkerINTEL" ) );
+      vkCmdSetPerformanceStreamMarkerINTEL = PFN_vkCmdSetPerformanceStreamMarkerINTEL(
+        vkGetInstanceProcAddr( instance, "vkCmdSetPerformanceStreamMarkerINTEL" ) );
+      vkCmdSetPerformanceOverrideINTEL =
+        PFN_vkCmdSetPerformanceOverrideINTEL( vkGetInstanceProcAddr( instance, "vkCmdSetPerformanceOverrideINTEL" ) );
+      vkAcquirePerformanceConfigurationINTEL = PFN_vkAcquirePerformanceConfigurationINTEL(
+        vkGetInstanceProcAddr( instance, "vkAcquirePerformanceConfigurationINTEL" ) );
+      vkReleasePerformanceConfigurationINTEL = PFN_vkReleasePerformanceConfigurationINTEL(
+        vkGetInstanceProcAddr( instance, "vkReleasePerformanceConfigurationINTEL" ) );
+      vkQueueSetPerformanceConfigurationINTEL = PFN_vkQueueSetPerformanceConfigurationINTEL(
+        vkGetInstanceProcAddr( instance, "vkQueueSetPerformanceConfigurationINTEL" ) );
+      vkGetPerformanceParameterINTEL =
+        PFN_vkGetPerformanceParameterINTEL( vkGetInstanceProcAddr( instance, "vkGetPerformanceParameterINTEL" ) );
+
+      //=== VK_AMD_display_native_hdr ===
+      vkSetLocalDimmingAMD = PFN_vkSetLocalDimmingAMD( vkGetInstanceProcAddr( instance, "vkSetLocalDimmingAMD" ) );
+
+#if defined( VK_USE_PLATFORM_FUCHSIA )
+      //=== VK_FUCHSIA_imagepipe_surface ===
+      vkCreateImagePipeSurfaceFUCHSIA =
+        PFN_vkCreateImagePipeSurfaceFUCHSIA( vkGetInstanceProcAddr( instance, "vkCreateImagePipeSurfaceFUCHSIA" ) );
+#endif /*VK_USE_PLATFORM_FUCHSIA*/
+
+#if defined( VK_USE_PLATFORM_METAL_EXT )
+      //=== VK_EXT_metal_surface ===
+      vkCreateMetalSurfaceEXT =
+        PFN_vkCreateMetalSurfaceEXT( vkGetInstanceProcAddr( instance, "vkCreateMetalSurfaceEXT" ) );
+#endif /*VK_USE_PLATFORM_METAL_EXT*/
+
+      //=== VK_KHR_fragment_shading_rate ===
+      vkGetPhysicalDeviceFragmentShadingRatesKHR = PFN_vkGetPhysicalDeviceFragmentShadingRatesKHR(
+        vkGetInstanceProcAddr( instance, "vkGetPhysicalDeviceFragmentShadingRatesKHR" ) );
+      vkCmdSetFragmentShadingRateKHR =
+        PFN_vkCmdSetFragmentShadingRateKHR( vkGetInstanceProcAddr( instance, "vkCmdSetFragmentShadingRateKHR" ) );
+
+      //=== VK_EXT_buffer_device_address ===
+      vkGetBufferDeviceAddressEXT =
+        PFN_vkGetBufferDeviceAddressEXT( vkGetInstanceProcAddr( instance, "vkGetBufferDeviceAddressEXT" ) );
+      if ( !vkGetBufferDeviceAddress )
+        vkGetBufferDeviceAddress = vkGetBufferDeviceAddressEXT;
+
+      //=== VK_EXT_tooling_info ===
+      vkGetPhysicalDeviceToolPropertiesEXT = PFN_vkGetPhysicalDeviceToolPropertiesEXT(
+        vkGetInstanceProcAddr( instance, "vkGetPhysicalDeviceToolPropertiesEXT" ) );
+
+      //=== VK_KHR_present_wait ===
+      vkWaitForPresentKHR = PFN_vkWaitForPresentKHR( vkGetInstanceProcAddr( instance, "vkWaitForPresentKHR" ) );
+
+      //=== VK_NV_cooperative_matrix ===
+      vkGetPhysicalDeviceCooperativeMatrixPropertiesNV = PFN_vkGetPhysicalDeviceCooperativeMatrixPropertiesNV(
+        vkGetInstanceProcAddr( instance, "vkGetPhysicalDeviceCooperativeMatrixPropertiesNV" ) );
+
+      //=== VK_NV_coverage_reduction_mode ===
+      vkGetPhysicalDeviceSupportedFramebufferMixedSamplesCombinationsNV =
+        PFN_vkGetPhysicalDeviceSupportedFramebufferMixedSamplesCombinationsNV(
+          vkGetInstanceProcAddr( instance, "vkGetPhysicalDeviceSupportedFramebufferMixedSamplesCombinationsNV" ) );
+
+#if defined( VK_USE_PLATFORM_WIN32_KHR )
+      //=== VK_EXT_full_screen_exclusive ===
+      vkGetPhysicalDeviceSurfacePresentModes2EXT = PFN_vkGetPhysicalDeviceSurfacePresentModes2EXT(
+        vkGetInstanceProcAddr( instance, "vkGetPhysicalDeviceSurfacePresentModes2EXT" ) );
+      vkAcquireFullScreenExclusiveModeEXT = PFN_vkAcquireFullScreenExclusiveModeEXT(
+        vkGetInstanceProcAddr( instance, "vkAcquireFullScreenExclusiveModeEXT" ) );
+      vkReleaseFullScreenExclusiveModeEXT = PFN_vkReleaseFullScreenExclusiveModeEXT(
+        vkGetInstanceProcAddr( instance, "vkReleaseFullScreenExclusiveModeEXT" ) );
+      vkGetDeviceGroupSurfacePresentModes2EXT = PFN_vkGetDeviceGroupSurfacePresentModes2EXT(
+        vkGetInstanceProcAddr( instance, "vkGetDeviceGroupSurfacePresentModes2EXT" ) );
+#endif /*VK_USE_PLATFORM_WIN32_KHR*/
+
+      //=== VK_EXT_headless_surface ===
+      vkCreateHeadlessSurfaceEXT =
+        PFN_vkCreateHeadlessSurfaceEXT( vkGetInstanceProcAddr( instance, "vkCreateHeadlessSurfaceEXT" ) );
+
+      //=== VK_KHR_buffer_device_address ===
+      vkGetBufferDeviceAddressKHR =
+        PFN_vkGetBufferDeviceAddressKHR( vkGetInstanceProcAddr( instance, "vkGetBufferDeviceAddressKHR" ) );
+      if ( !vkGetBufferDeviceAddress )
+        vkGetBufferDeviceAddress = vkGetBufferDeviceAddressKHR;
+      vkGetBufferOpaqueCaptureAddressKHR = PFN_vkGetBufferOpaqueCaptureAddressKHR(
+        vkGetInstanceProcAddr( instance, "vkGetBufferOpaqueCaptureAddressKHR" ) );
+      if ( !vkGetBufferOpaqueCaptureAddress )
+        vkGetBufferOpaqueCaptureAddress = vkGetBufferOpaqueCaptureAddressKHR;
+      vkGetDeviceMemoryOpaqueCaptureAddressKHR = PFN_vkGetDeviceMemoryOpaqueCaptureAddressKHR(
+        vkGetInstanceProcAddr( instance, "vkGetDeviceMemoryOpaqueCaptureAddressKHR" ) );
+      if ( !vkGetDeviceMemoryOpaqueCaptureAddress )
+        vkGetDeviceMemoryOpaqueCaptureAddress = vkGetDeviceMemoryOpaqueCaptureAddressKHR;
+
+      //=== VK_EXT_line_rasterization ===
+      vkCmdSetLineStippleEXT =
+        PFN_vkCmdSetLineStippleEXT( vkGetInstanceProcAddr( instance, "vkCmdSetLineStippleEXT" ) );
+
+      //=== VK_EXT_host_query_reset ===
+      vkResetQueryPoolEXT = PFN_vkResetQueryPoolEXT( vkGetInstanceProcAddr( instance, "vkResetQueryPoolEXT" ) );
+      if ( !vkResetQueryPool )
+        vkResetQueryPool = vkResetQueryPoolEXT;
+
+      //=== VK_EXT_extended_dynamic_state ===
+      vkCmdSetCullModeEXT  = PFN_vkCmdSetCullModeEXT( vkGetInstanceProcAddr( instance, "vkCmdSetCullModeEXT" ) );
+      vkCmdSetFrontFaceEXT = PFN_vkCmdSetFrontFaceEXT( vkGetInstanceProcAddr( instance, "vkCmdSetFrontFaceEXT" ) );
+      vkCmdSetPrimitiveTopologyEXT =
+        PFN_vkCmdSetPrimitiveTopologyEXT( vkGetInstanceProcAddr( instance, "vkCmdSetPrimitiveTopologyEXT" ) );
+      vkCmdSetViewportWithCountEXT =
+        PFN_vkCmdSetViewportWithCountEXT( vkGetInstanceProcAddr( instance, "vkCmdSetViewportWithCountEXT" ) );
+      vkCmdSetScissorWithCountEXT =
+        PFN_vkCmdSetScissorWithCountEXT( vkGetInstanceProcAddr( instance, "vkCmdSetScissorWithCountEXT" ) );
+      vkCmdBindVertexBuffers2EXT =
+        PFN_vkCmdBindVertexBuffers2EXT( vkGetInstanceProcAddr( instance, "vkCmdBindVertexBuffers2EXT" ) );
+      vkCmdSetDepthTestEnableEXT =
+        PFN_vkCmdSetDepthTestEnableEXT( vkGetInstanceProcAddr( instance, "vkCmdSetDepthTestEnableEXT" ) );
+      vkCmdSetDepthWriteEnableEXT =
+        PFN_vkCmdSetDepthWriteEnableEXT( vkGetInstanceProcAddr( instance, "vkCmdSetDepthWriteEnableEXT" ) );
+      vkCmdSetDepthCompareOpEXT =
+        PFN_vkCmdSetDepthCompareOpEXT( vkGetInstanceProcAddr( instance, "vkCmdSetDepthCompareOpEXT" ) );
+      vkCmdSetDepthBoundsTestEnableEXT =
+        PFN_vkCmdSetDepthBoundsTestEnableEXT( vkGetInstanceProcAddr( instance, "vkCmdSetDepthBoundsTestEnableEXT" ) );
+      vkCmdSetStencilTestEnableEXT =
+        PFN_vkCmdSetStencilTestEnableEXT( vkGetInstanceProcAddr( instance, "vkCmdSetStencilTestEnableEXT" ) );
+      vkCmdSetStencilOpEXT = PFN_vkCmdSetStencilOpEXT( vkGetInstanceProcAddr( instance, "vkCmdSetStencilOpEXT" ) );
+
+      //=== VK_KHR_deferred_host_operations ===
+      vkCreateDeferredOperationKHR =
+        PFN_vkCreateDeferredOperationKHR( vkGetInstanceProcAddr( instance, "vkCreateDeferredOperationKHR" ) );
+      vkDestroyDeferredOperationKHR =
+        PFN_vkDestroyDeferredOperationKHR( vkGetInstanceProcAddr( instance, "vkDestroyDeferredOperationKHR" ) );
+      vkGetDeferredOperationMaxConcurrencyKHR = PFN_vkGetDeferredOperationMaxConcurrencyKHR(
+        vkGetInstanceProcAddr( instance, "vkGetDeferredOperationMaxConcurrencyKHR" ) );
+      vkGetDeferredOperationResultKHR =
+        PFN_vkGetDeferredOperationResultKHR( vkGetInstanceProcAddr( instance, "vkGetDeferredOperationResultKHR" ) );
+      vkDeferredOperationJoinKHR =
+        PFN_vkDeferredOperationJoinKHR( vkGetInstanceProcAddr( instance, "vkDeferredOperationJoinKHR" ) );
+
+      //=== VK_KHR_pipeline_executable_properties ===
+      vkGetPipelineExecutablePropertiesKHR = PFN_vkGetPipelineExecutablePropertiesKHR(
+        vkGetInstanceProcAddr( instance, "vkGetPipelineExecutablePropertiesKHR" ) );
+      vkGetPipelineExecutableStatisticsKHR = PFN_vkGetPipelineExecutableStatisticsKHR(
+        vkGetInstanceProcAddr( instance, "vkGetPipelineExecutableStatisticsKHR" ) );
+      vkGetPipelineExecutableInternalRepresentationsKHR = PFN_vkGetPipelineExecutableInternalRepresentationsKHR(
+        vkGetInstanceProcAddr( instance, "vkGetPipelineExecutableInternalRepresentationsKHR" ) );
+
+      //=== VK_NV_device_generated_commands ===
+      vkGetGeneratedCommandsMemoryRequirementsNV = PFN_vkGetGeneratedCommandsMemoryRequirementsNV(
+        vkGetInstanceProcAddr( instance, "vkGetGeneratedCommandsMemoryRequirementsNV" ) );
+      vkCmdPreprocessGeneratedCommandsNV = PFN_vkCmdPreprocessGeneratedCommandsNV(
+        vkGetInstanceProcAddr( instance, "vkCmdPreprocessGeneratedCommandsNV" ) );
+      vkCmdExecuteGeneratedCommandsNV =
+        PFN_vkCmdExecuteGeneratedCommandsNV( vkGetInstanceProcAddr( instance, "vkCmdExecuteGeneratedCommandsNV" ) );
+      vkCmdBindPipelineShaderGroupNV =
+        PFN_vkCmdBindPipelineShaderGroupNV( vkGetInstanceProcAddr( instance, "vkCmdBindPipelineShaderGroupNV" ) );
+      vkCreateIndirectCommandsLayoutNV =
+        PFN_vkCreateIndirectCommandsLayoutNV( vkGetInstanceProcAddr( instance, "vkCreateIndirectCommandsLayoutNV" ) );
+      vkDestroyIndirectCommandsLayoutNV =
+        PFN_vkDestroyIndirectCommandsLayoutNV( vkGetInstanceProcAddr( instance, "vkDestroyIndirectCommandsLayoutNV" ) );
+
+      //=== VK_EXT_acquire_drm_display ===
+      vkAcquireDrmDisplayEXT =
+        PFN_vkAcquireDrmDisplayEXT( vkGetInstanceProcAddr( instance, "vkAcquireDrmDisplayEXT" ) );
+      vkGetDrmDisplayEXT = PFN_vkGetDrmDisplayEXT( vkGetInstanceProcAddr( instance, "vkGetDrmDisplayEXT" ) );
+
+      //=== VK_EXT_private_data ===
+      vkCreatePrivateDataSlotEXT =
+        PFN_vkCreatePrivateDataSlotEXT( vkGetInstanceProcAddr( instance, "vkCreatePrivateDataSlotEXT" ) );
+      vkDestroyPrivateDataSlotEXT =
+        PFN_vkDestroyPrivateDataSlotEXT( vkGetInstanceProcAddr( instance, "vkDestroyPrivateDataSlotEXT" ) );
+      vkSetPrivateDataEXT = PFN_vkSetPrivateDataEXT( vkGetInstanceProcAddr( instance, "vkSetPrivateDataEXT" ) );
+      vkGetPrivateDataEXT = PFN_vkGetPrivateDataEXT( vkGetInstanceProcAddr( instance, "vkGetPrivateDataEXT" ) );
+
+#if defined( VK_ENABLE_BETA_EXTENSIONS )
+      //=== VK_KHR_video_encode_queue ===
+      vkCmdEncodeVideoKHR = PFN_vkCmdEncodeVideoKHR( vkGetInstanceProcAddr( instance, "vkCmdEncodeVideoKHR" ) );
+#endif /*VK_ENABLE_BETA_EXTENSIONS*/
+
+      //=== VK_KHR_synchronization2 ===
+      vkCmdSetEvent2KHR   = PFN_vkCmdSetEvent2KHR( vkGetInstanceProcAddr( instance, "vkCmdSetEvent2KHR" ) );
+      vkCmdResetEvent2KHR = PFN_vkCmdResetEvent2KHR( vkGetInstanceProcAddr( instance, "vkCmdResetEvent2KHR" ) );
+      vkCmdWaitEvents2KHR = PFN_vkCmdWaitEvents2KHR( vkGetInstanceProcAddr( instance, "vkCmdWaitEvents2KHR" ) );
+      vkCmdPipelineBarrier2KHR =
+        PFN_vkCmdPipelineBarrier2KHR( vkGetInstanceProcAddr( instance, "vkCmdPipelineBarrier2KHR" ) );
+      vkCmdWriteTimestamp2KHR =
+        PFN_vkCmdWriteTimestamp2KHR( vkGetInstanceProcAddr( instance, "vkCmdWriteTimestamp2KHR" ) );
+      vkQueueSubmit2KHR = PFN_vkQueueSubmit2KHR( vkGetInstanceProcAddr( instance, "vkQueueSubmit2KHR" ) );
+      vkCmdWriteBufferMarker2AMD =
+        PFN_vkCmdWriteBufferMarker2AMD( vkGetInstanceProcAddr( instance, "vkCmdWriteBufferMarker2AMD" ) );
+      vkGetQueueCheckpointData2NV =
+        PFN_vkGetQueueCheckpointData2NV( vkGetInstanceProcAddr( instance, "vkGetQueueCheckpointData2NV" ) );
+
+      //=== VK_NV_fragment_shading_rate_enums ===
+      vkCmdSetFragmentShadingRateEnumNV =
+        PFN_vkCmdSetFragmentShadingRateEnumNV( vkGetInstanceProcAddr( instance, "vkCmdSetFragmentShadingRateEnumNV" ) );
+
+      //=== VK_KHR_copy_commands2 ===
+      vkCmdCopyBuffer2KHR = PFN_vkCmdCopyBuffer2KHR( vkGetInstanceProcAddr( instance, "vkCmdCopyBuffer2KHR" ) );
+      vkCmdCopyImage2KHR  = PFN_vkCmdCopyImage2KHR( vkGetInstanceProcAddr( instance, "vkCmdCopyImage2KHR" ) );
+      vkCmdCopyBufferToImage2KHR =
+        PFN_vkCmdCopyBufferToImage2KHR( vkGetInstanceProcAddr( instance, "vkCmdCopyBufferToImage2KHR" ) );
+      vkCmdCopyImageToBuffer2KHR =
+        PFN_vkCmdCopyImageToBuffer2KHR( vkGetInstanceProcAddr( instance, "vkCmdCopyImageToBuffer2KHR" ) );
+      vkCmdBlitImage2KHR    = PFN_vkCmdBlitImage2KHR( vkGetInstanceProcAddr( instance, "vkCmdBlitImage2KHR" ) );
+      vkCmdResolveImage2KHR = PFN_vkCmdResolveImage2KHR( vkGetInstanceProcAddr( instance, "vkCmdResolveImage2KHR" ) );
+
+#if defined( VK_USE_PLATFORM_WIN32_KHR )
+      //=== VK_NV_acquire_winrt_display ===
+      vkAcquireWinrtDisplayNV =
+        PFN_vkAcquireWinrtDisplayNV( vkGetInstanceProcAddr( instance, "vkAcquireWinrtDisplayNV" ) );
+      vkGetWinrtDisplayNV = PFN_vkGetWinrtDisplayNV( vkGetInstanceProcAddr( instance, "vkGetWinrtDisplayNV" ) );
+#endif /*VK_USE_PLATFORM_WIN32_KHR*/
+
+#if defined( VK_USE_PLATFORM_DIRECTFB_EXT )
+      //=== VK_EXT_directfb_surface ===
+      vkCreateDirectFBSurfaceEXT =
+        PFN_vkCreateDirectFBSurfaceEXT( vkGetInstanceProcAddr( instance, "vkCreateDirectFBSurfaceEXT" ) );
+      vkGetPhysicalDeviceDirectFBPresentationSupportEXT = PFN_vkGetPhysicalDeviceDirectFBPresentationSupportEXT(
+        vkGetInstanceProcAddr( instance, "vkGetPhysicalDeviceDirectFBPresentationSupportEXT" ) );
+#endif /*VK_USE_PLATFORM_DIRECTFB_EXT*/
+
+      //=== VK_KHR_ray_tracing_pipeline ===
+      vkCmdTraceRaysKHR = PFN_vkCmdTraceRaysKHR( vkGetInstanceProcAddr( instance, "vkCmdTraceRaysKHR" ) );
+      vkCreateRayTracingPipelinesKHR =
+        PFN_vkCreateRayTracingPipelinesKHR( vkGetInstanceProcAddr( instance, "vkCreateRayTracingPipelinesKHR" ) );
+      vkGetRayTracingShaderGroupHandlesKHR = PFN_vkGetRayTracingShaderGroupHandlesKHR(
+        vkGetInstanceProcAddr( instance, "vkGetRayTracingShaderGroupHandlesKHR" ) );
+      vkGetRayTracingCaptureReplayShaderGroupHandlesKHR = PFN_vkGetRayTracingCaptureReplayShaderGroupHandlesKHR(
+        vkGetInstanceProcAddr( instance, "vkGetRayTracingCaptureReplayShaderGroupHandlesKHR" ) );
+      vkCmdTraceRaysIndirectKHR =
+        PFN_vkCmdTraceRaysIndirectKHR( vkGetInstanceProcAddr( instance, "vkCmdTraceRaysIndirectKHR" ) );
+      vkGetRayTracingShaderGroupStackSizeKHR = PFN_vkGetRayTracingShaderGroupStackSizeKHR(
+        vkGetInstanceProcAddr( instance, "vkGetRayTracingShaderGroupStackSizeKHR" ) );
+      vkCmdSetRayTracingPipelineStackSizeKHR = PFN_vkCmdSetRayTracingPipelineStackSizeKHR(
+        vkGetInstanceProcAddr( instance, "vkCmdSetRayTracingPipelineStackSizeKHR" ) );
+
+      //=== VK_EXT_vertex_input_dynamic_state ===
+      vkCmdSetVertexInputEXT =
+        PFN_vkCmdSetVertexInputEXT( vkGetInstanceProcAddr( instance, "vkCmdSetVertexInputEXT" ) );
+
+#if defined( VK_USE_PLATFORM_FUCHSIA )
+      //=== VK_FUCHSIA_external_memory ===
+      vkGetMemoryZirconHandleFUCHSIA =
+        PFN_vkGetMemoryZirconHandleFUCHSIA( vkGetInstanceProcAddr( instance, "vkGetMemoryZirconHandleFUCHSIA" ) );
+      vkGetMemoryZirconHandlePropertiesFUCHSIA = PFN_vkGetMemoryZirconHandlePropertiesFUCHSIA(
+        vkGetInstanceProcAddr( instance, "vkGetMemoryZirconHandlePropertiesFUCHSIA" ) );
+#endif /*VK_USE_PLATFORM_FUCHSIA*/
+
+#if defined( VK_USE_PLATFORM_FUCHSIA )
+      //=== VK_FUCHSIA_external_semaphore ===
+      vkImportSemaphoreZirconHandleFUCHSIA = PFN_vkImportSemaphoreZirconHandleFUCHSIA(
+        vkGetInstanceProcAddr( instance, "vkImportSemaphoreZirconHandleFUCHSIA" ) );
+      vkGetSemaphoreZirconHandleFUCHSIA =
+        PFN_vkGetSemaphoreZirconHandleFUCHSIA( vkGetInstanceProcAddr( instance, "vkGetSemaphoreZirconHandleFUCHSIA" ) );
+#endif /*VK_USE_PLATFORM_FUCHSIA*/
+
+      //=== VK_HUAWEI_subpass_shading ===
+      vkGetDeviceSubpassShadingMaxWorkgroupSizeHUAWEI = PFN_vkGetDeviceSubpassShadingMaxWorkgroupSizeHUAWEI(
+        vkGetInstanceProcAddr( instance, "vkGetDeviceSubpassShadingMaxWorkgroupSizeHUAWEI" ) );
+      vkCmdSubpassShadingHUAWEI =
+        PFN_vkCmdSubpassShadingHUAWEI( vkGetInstanceProcAddr( instance, "vkCmdSubpassShadingHUAWEI" ) );
+
+      //=== VK_HUAWEI_invocation_mask ===
+      vkCmdBindInvocationMaskHUAWEI =
+        PFN_vkCmdBindInvocationMaskHUAWEI( vkGetInstanceProcAddr( instance, "vkCmdBindInvocationMaskHUAWEI" ) );
+
+      //=== VK_NV_external_memory_rdma ===
+      vkGetMemoryRemoteAddressNV =
+        PFN_vkGetMemoryRemoteAddressNV( vkGetInstanceProcAddr( instance, "vkGetMemoryRemoteAddressNV" ) );
+
+      //=== VK_EXT_extended_dynamic_state2 ===
+      vkCmdSetPatchControlPointsEXT =
+        PFN_vkCmdSetPatchControlPointsEXT( vkGetInstanceProcAddr( instance, "vkCmdSetPatchControlPointsEXT" ) );
+      vkCmdSetRasterizerDiscardEnableEXT = PFN_vkCmdSetRasterizerDiscardEnableEXT(
+        vkGetInstanceProcAddr( instance, "vkCmdSetRasterizerDiscardEnableEXT" ) );
+      vkCmdSetDepthBiasEnableEXT =
+        PFN_vkCmdSetDepthBiasEnableEXT( vkGetInstanceProcAddr( instance, "vkCmdSetDepthBiasEnableEXT" ) );
+      vkCmdSetLogicOpEXT = PFN_vkCmdSetLogicOpEXT( vkGetInstanceProcAddr( instance, "vkCmdSetLogicOpEXT" ) );
+      vkCmdSetPrimitiveRestartEnableEXT =
+        PFN_vkCmdSetPrimitiveRestartEnableEXT( vkGetInstanceProcAddr( instance, "vkCmdSetPrimitiveRestartEnableEXT" ) );
+
+#if defined( VK_USE_PLATFORM_SCREEN_QNX )
+      //=== VK_QNX_screen_surface ===
+      vkCreateScreenSurfaceQNX =
+        PFN_vkCreateScreenSurfaceQNX( vkGetInstanceProcAddr( instance, "vkCreateScreenSurfaceQNX" ) );
+      vkGetPhysicalDeviceScreenPresentationSupportQNX = PFN_vkGetPhysicalDeviceScreenPresentationSupportQNX(
+        vkGetInstanceProcAddr( instance, "vkGetPhysicalDeviceScreenPresentationSupportQNX" ) );
+#endif /*VK_USE_PLATFORM_SCREEN_QNX*/
+
+      //=== VK_EXT_color_write_enable ===
+      vkCmdSetColorWriteEnableEXT =
+        PFN_vkCmdSetColorWriteEnableEXT( vkGetInstanceProcAddr( instance, "vkCmdSetColorWriteEnableEXT" ) );
+
+      //=== VK_EXT_multi_draw ===
+      vkCmdDrawMultiEXT = PFN_vkCmdDrawMultiEXT( vkGetInstanceProcAddr( instance, "vkCmdDrawMultiEXT" ) );
+      vkCmdDrawMultiIndexedEXT =
+        PFN_vkCmdDrawMultiIndexedEXT( vkGetInstanceProcAddr( instance, "vkCmdDrawMultiIndexedEXT" ) );
     }
 
     void init( VULKAN_HPP_NAMESPACE::Device deviceCpp ) VULKAN_HPP_NOEXCEPT
     {
       VkDevice device = static_cast<VkDevice>( deviceCpp );
-#if defined( VK_USE_PLATFORM_WIN32_KHR )
-      vkAcquireFullScreenExclusiveModeEXT =
-        PFN_vkAcquireFullScreenExclusiveModeEXT( vkGetDeviceProcAddr( device, "vkAcquireFullScreenExclusiveModeEXT" ) );
-#endif /*VK_USE_PLATFORM_WIN32_KHR*/
-      vkAcquireNextImage2KHR = PFN_vkAcquireNextImage2KHR( vkGetDeviceProcAddr( device, "vkAcquireNextImage2KHR" ) );
-      vkAcquireNextImageKHR  = PFN_vkAcquireNextImageKHR( vkGetDeviceProcAddr( device, "vkAcquireNextImageKHR" ) );
-      vkAcquirePerformanceConfigurationINTEL = PFN_vkAcquirePerformanceConfigurationINTEL(
-        vkGetDeviceProcAddr( device, "vkAcquirePerformanceConfigurationINTEL" ) );
-      vkAcquireProfilingLockKHR =
-        PFN_vkAcquireProfilingLockKHR( vkGetDeviceProcAddr( device, "vkAcquireProfilingLockKHR" ) );
-      vkAllocateCommandBuffers =
-        PFN_vkAllocateCommandBuffers( vkGetDeviceProcAddr( device, "vkAllocateCommandBuffers" ) );
+
+      //=== VK_VERSION_1_0 ===
+      vkGetDeviceProcAddr = PFN_vkGetDeviceProcAddr( vkGetDeviceProcAddr( device, "vkGetDeviceProcAddr" ) );
+      vkDestroyDevice     = PFN_vkDestroyDevice( vkGetDeviceProcAddr( device, "vkDestroyDevice" ) );
+      vkGetDeviceQueue    = PFN_vkGetDeviceQueue( vkGetDeviceProcAddr( device, "vkGetDeviceQueue" ) );
+      vkQueueSubmit       = PFN_vkQueueSubmit( vkGetDeviceProcAddr( device, "vkQueueSubmit" ) );
+      vkQueueWaitIdle     = PFN_vkQueueWaitIdle( vkGetDeviceProcAddr( device, "vkQueueWaitIdle" ) );
+      vkDeviceWaitIdle    = PFN_vkDeviceWaitIdle( vkGetDeviceProcAddr( device, "vkDeviceWaitIdle" ) );
+      vkAllocateMemory    = PFN_vkAllocateMemory( vkGetDeviceProcAddr( device, "vkAllocateMemory" ) );
+      vkFreeMemory        = PFN_vkFreeMemory( vkGetDeviceProcAddr( device, "vkFreeMemory" ) );
+      vkMapMemory         = PFN_vkMapMemory( vkGetDeviceProcAddr( device, "vkMapMemory" ) );
+      vkUnmapMemory       = PFN_vkUnmapMemory( vkGetDeviceProcAddr( device, "vkUnmapMemory" ) );
+      vkFlushMappedMemoryRanges =
+        PFN_vkFlushMappedMemoryRanges( vkGetDeviceProcAddr( device, "vkFlushMappedMemoryRanges" ) );
+      vkInvalidateMappedMemoryRanges =
+        PFN_vkInvalidateMappedMemoryRanges( vkGetDeviceProcAddr( device, "vkInvalidateMappedMemoryRanges" ) );
+      vkGetDeviceMemoryCommitment =
+        PFN_vkGetDeviceMemoryCommitment( vkGetDeviceProcAddr( device, "vkGetDeviceMemoryCommitment" ) );
+      vkBindBufferMemory = PFN_vkBindBufferMemory( vkGetDeviceProcAddr( device, "vkBindBufferMemory" ) );
+      vkBindImageMemory  = PFN_vkBindImageMemory( vkGetDeviceProcAddr( device, "vkBindImageMemory" ) );
+      vkGetBufferMemoryRequirements =
+        PFN_vkGetBufferMemoryRequirements( vkGetDeviceProcAddr( device, "vkGetBufferMemoryRequirements" ) );
+      vkGetImageMemoryRequirements =
+        PFN_vkGetImageMemoryRequirements( vkGetDeviceProcAddr( device, "vkGetImageMemoryRequirements" ) );
+      vkGetImageSparseMemoryRequirements =
+        PFN_vkGetImageSparseMemoryRequirements( vkGetDeviceProcAddr( device, "vkGetImageSparseMemoryRequirements" ) );
+      vkQueueBindSparse     = PFN_vkQueueBindSparse( vkGetDeviceProcAddr( device, "vkQueueBindSparse" ) );
+      vkCreateFence         = PFN_vkCreateFence( vkGetDeviceProcAddr( device, "vkCreateFence" ) );
+      vkDestroyFence        = PFN_vkDestroyFence( vkGetDeviceProcAddr( device, "vkDestroyFence" ) );
+      vkResetFences         = PFN_vkResetFences( vkGetDeviceProcAddr( device, "vkResetFences" ) );
+      vkGetFenceStatus      = PFN_vkGetFenceStatus( vkGetDeviceProcAddr( device, "vkGetFenceStatus" ) );
+      vkWaitForFences       = PFN_vkWaitForFences( vkGetDeviceProcAddr( device, "vkWaitForFences" ) );
+      vkCreateSemaphore     = PFN_vkCreateSemaphore( vkGetDeviceProcAddr( device, "vkCreateSemaphore" ) );
+      vkDestroySemaphore    = PFN_vkDestroySemaphore( vkGetDeviceProcAddr( device, "vkDestroySemaphore" ) );
+      vkCreateEvent         = PFN_vkCreateEvent( vkGetDeviceProcAddr( device, "vkCreateEvent" ) );
+      vkDestroyEvent        = PFN_vkDestroyEvent( vkGetDeviceProcAddr( device, "vkDestroyEvent" ) );
+      vkGetEventStatus      = PFN_vkGetEventStatus( vkGetDeviceProcAddr( device, "vkGetEventStatus" ) );
+      vkSetEvent            = PFN_vkSetEvent( vkGetDeviceProcAddr( device, "vkSetEvent" ) );
+      vkResetEvent          = PFN_vkResetEvent( vkGetDeviceProcAddr( device, "vkResetEvent" ) );
+      vkCreateQueryPool     = PFN_vkCreateQueryPool( vkGetDeviceProcAddr( device, "vkCreateQueryPool" ) );
+      vkDestroyQueryPool    = PFN_vkDestroyQueryPool( vkGetDeviceProcAddr( device, "vkDestroyQueryPool" ) );
+      vkGetQueryPoolResults = PFN_vkGetQueryPoolResults( vkGetDeviceProcAddr( device, "vkGetQueryPoolResults" ) );
+      vkCreateBuffer        = PFN_vkCreateBuffer( vkGetDeviceProcAddr( device, "vkCreateBuffer" ) );
+      vkDestroyBuffer       = PFN_vkDestroyBuffer( vkGetDeviceProcAddr( device, "vkDestroyBuffer" ) );
+      vkCreateBufferView    = PFN_vkCreateBufferView( vkGetDeviceProcAddr( device, "vkCreateBufferView" ) );
+      vkDestroyBufferView   = PFN_vkDestroyBufferView( vkGetDeviceProcAddr( device, "vkDestroyBufferView" ) );
+      vkCreateImage         = PFN_vkCreateImage( vkGetDeviceProcAddr( device, "vkCreateImage" ) );
+      vkDestroyImage        = PFN_vkDestroyImage( vkGetDeviceProcAddr( device, "vkDestroyImage" ) );
+      vkGetImageSubresourceLayout =
+        PFN_vkGetImageSubresourceLayout( vkGetDeviceProcAddr( device, "vkGetImageSubresourceLayout" ) );
+      vkCreateImageView      = PFN_vkCreateImageView( vkGetDeviceProcAddr( device, "vkCreateImageView" ) );
+      vkDestroyImageView     = PFN_vkDestroyImageView( vkGetDeviceProcAddr( device, "vkDestroyImageView" ) );
+      vkCreateShaderModule   = PFN_vkCreateShaderModule( vkGetDeviceProcAddr( device, "vkCreateShaderModule" ) );
+      vkDestroyShaderModule  = PFN_vkDestroyShaderModule( vkGetDeviceProcAddr( device, "vkDestroyShaderModule" ) );
+      vkCreatePipelineCache  = PFN_vkCreatePipelineCache( vkGetDeviceProcAddr( device, "vkCreatePipelineCache" ) );
+      vkDestroyPipelineCache = PFN_vkDestroyPipelineCache( vkGetDeviceProcAddr( device, "vkDestroyPipelineCache" ) );
+      vkGetPipelineCacheData = PFN_vkGetPipelineCacheData( vkGetDeviceProcAddr( device, "vkGetPipelineCacheData" ) );
+      vkMergePipelineCaches  = PFN_vkMergePipelineCaches( vkGetDeviceProcAddr( device, "vkMergePipelineCaches" ) );
+      vkCreateGraphicsPipelines =
+        PFN_vkCreateGraphicsPipelines( vkGetDeviceProcAddr( device, "vkCreateGraphicsPipelines" ) );
+      vkCreateComputePipelines =
+        PFN_vkCreateComputePipelines( vkGetDeviceProcAddr( device, "vkCreateComputePipelines" ) );
+      vkDestroyPipeline       = PFN_vkDestroyPipeline( vkGetDeviceProcAddr( device, "vkDestroyPipeline" ) );
+      vkCreatePipelineLayout  = PFN_vkCreatePipelineLayout( vkGetDeviceProcAddr( device, "vkCreatePipelineLayout" ) );
+      vkDestroyPipelineLayout = PFN_vkDestroyPipelineLayout( vkGetDeviceProcAddr( device, "vkDestroyPipelineLayout" ) );
+      vkCreateSampler         = PFN_vkCreateSampler( vkGetDeviceProcAddr( device, "vkCreateSampler" ) );
+      vkDestroySampler        = PFN_vkDestroySampler( vkGetDeviceProcAddr( device, "vkDestroySampler" ) );
+      vkCreateDescriptorSetLayout =
+        PFN_vkCreateDescriptorSetLayout( vkGetDeviceProcAddr( device, "vkCreateDescriptorSetLayout" ) );
+      vkDestroyDescriptorSetLayout =
+        PFN_vkDestroyDescriptorSetLayout( vkGetDeviceProcAddr( device, "vkDestroyDescriptorSetLayout" ) );
+      vkCreateDescriptorPool  = PFN_vkCreateDescriptorPool( vkGetDeviceProcAddr( device, "vkCreateDescriptorPool" ) );
+      vkDestroyDescriptorPool = PFN_vkDestroyDescriptorPool( vkGetDeviceProcAddr( device, "vkDestroyDescriptorPool" ) );
+      vkResetDescriptorPool   = PFN_vkResetDescriptorPool( vkGetDeviceProcAddr( device, "vkResetDescriptorPool" ) );
       vkAllocateDescriptorSets =
         PFN_vkAllocateDescriptorSets( vkGetDeviceProcAddr( device, "vkAllocateDescriptorSets" ) );
-      vkAllocateMemory     = PFN_vkAllocateMemory( vkGetDeviceProcAddr( device, "vkAllocateMemory" ) );
-      vkBeginCommandBuffer = PFN_vkBeginCommandBuffer( vkGetDeviceProcAddr( device, "vkBeginCommandBuffer" ) );
-      vkBindAccelerationStructureMemoryNV =
-        PFN_vkBindAccelerationStructureMemoryNV( vkGetDeviceProcAddr( device, "vkBindAccelerationStructureMemoryNV" ) );
-      vkBindBufferMemory     = PFN_vkBindBufferMemory( vkGetDeviceProcAddr( device, "vkBindBufferMemory" ) );
-      vkBindBufferMemory2    = PFN_vkBindBufferMemory2( vkGetDeviceProcAddr( device, "vkBindBufferMemory2" ) );
-      vkBindBufferMemory2KHR = PFN_vkBindBufferMemory2KHR( vkGetDeviceProcAddr( device, "vkBindBufferMemory2KHR" ) );
-      if ( !vkBindBufferMemory2 )
-        vkBindBufferMemory2 = vkBindBufferMemory2KHR;
-      vkBindImageMemory     = PFN_vkBindImageMemory( vkGetDeviceProcAddr( device, "vkBindImageMemory" ) );
-      vkBindImageMemory2    = PFN_vkBindImageMemory2( vkGetDeviceProcAddr( device, "vkBindImageMemory2" ) );
-      vkBindImageMemory2KHR = PFN_vkBindImageMemory2KHR( vkGetDeviceProcAddr( device, "vkBindImageMemory2KHR" ) );
-      if ( !vkBindImageMemory2 )
-        vkBindImageMemory2 = vkBindImageMemory2KHR;
-#if defined( VK_ENABLE_BETA_EXTENSIONS )
-      vkBindVideoSessionMemoryKHR =
-        PFN_vkBindVideoSessionMemoryKHR( vkGetDeviceProcAddr( device, "vkBindVideoSessionMemoryKHR" ) );
-#endif /*VK_ENABLE_BETA_EXTENSIONS*/
-      vkBuildAccelerationStructuresKHR =
-        PFN_vkBuildAccelerationStructuresKHR( vkGetDeviceProcAddr( device, "vkBuildAccelerationStructuresKHR" ) );
-      vkCmdBeginConditionalRenderingEXT =
-        PFN_vkCmdBeginConditionalRenderingEXT( vkGetDeviceProcAddr( device, "vkCmdBeginConditionalRenderingEXT" ) );
-      vkCmdBeginDebugUtilsLabelEXT =
-        PFN_vkCmdBeginDebugUtilsLabelEXT( vkGetDeviceProcAddr( device, "vkCmdBeginDebugUtilsLabelEXT" ) );
-      vkCmdBeginQuery = PFN_vkCmdBeginQuery( vkGetDeviceProcAddr( device, "vkCmdBeginQuery" ) );
-      vkCmdBeginQueryIndexedEXT =
-        PFN_vkCmdBeginQueryIndexedEXT( vkGetDeviceProcAddr( device, "vkCmdBeginQueryIndexedEXT" ) );
-      vkCmdBeginRenderPass  = PFN_vkCmdBeginRenderPass( vkGetDeviceProcAddr( device, "vkCmdBeginRenderPass" ) );
-      vkCmdBeginRenderPass2 = PFN_vkCmdBeginRenderPass2( vkGetDeviceProcAddr( device, "vkCmdBeginRenderPass2" ) );
-      vkCmdBeginRenderPass2KHR =
-        PFN_vkCmdBeginRenderPass2KHR( vkGetDeviceProcAddr( device, "vkCmdBeginRenderPass2KHR" ) );
-      if ( !vkCmdBeginRenderPass2 )
-        vkCmdBeginRenderPass2 = vkCmdBeginRenderPass2KHR;
-      vkCmdBeginTransformFeedbackEXT =
-        PFN_vkCmdBeginTransformFeedbackEXT( vkGetDeviceProcAddr( device, "vkCmdBeginTransformFeedbackEXT" ) );
-#if defined( VK_ENABLE_BETA_EXTENSIONS )
-      vkCmdBeginVideoCodingKHR =
-        PFN_vkCmdBeginVideoCodingKHR( vkGetDeviceProcAddr( device, "vkCmdBeginVideoCodingKHR" ) );
-#endif /*VK_ENABLE_BETA_EXTENSIONS*/
+      vkFreeDescriptorSets   = PFN_vkFreeDescriptorSets( vkGetDeviceProcAddr( device, "vkFreeDescriptorSets" ) );
+      vkUpdateDescriptorSets = PFN_vkUpdateDescriptorSets( vkGetDeviceProcAddr( device, "vkUpdateDescriptorSets" ) );
+      vkCreateFramebuffer    = PFN_vkCreateFramebuffer( vkGetDeviceProcAddr( device, "vkCreateFramebuffer" ) );
+      vkDestroyFramebuffer   = PFN_vkDestroyFramebuffer( vkGetDeviceProcAddr( device, "vkDestroyFramebuffer" ) );
+      vkCreateRenderPass     = PFN_vkCreateRenderPass( vkGetDeviceProcAddr( device, "vkCreateRenderPass" ) );
+      vkDestroyRenderPass    = PFN_vkDestroyRenderPass( vkGetDeviceProcAddr( device, "vkDestroyRenderPass" ) );
+      vkGetRenderAreaGranularity =
+        PFN_vkGetRenderAreaGranularity( vkGetDeviceProcAddr( device, "vkGetRenderAreaGranularity" ) );
+      vkCreateCommandPool  = PFN_vkCreateCommandPool( vkGetDeviceProcAddr( device, "vkCreateCommandPool" ) );
+      vkDestroyCommandPool = PFN_vkDestroyCommandPool( vkGetDeviceProcAddr( device, "vkDestroyCommandPool" ) );
+      vkResetCommandPool   = PFN_vkResetCommandPool( vkGetDeviceProcAddr( device, "vkResetCommandPool" ) );
+      vkAllocateCommandBuffers =
+        PFN_vkAllocateCommandBuffers( vkGetDeviceProcAddr( device, "vkAllocateCommandBuffers" ) );
+      vkFreeCommandBuffers   = PFN_vkFreeCommandBuffers( vkGetDeviceProcAddr( device, "vkFreeCommandBuffers" ) );
+      vkBeginCommandBuffer   = PFN_vkBeginCommandBuffer( vkGetDeviceProcAddr( device, "vkBeginCommandBuffer" ) );
+      vkEndCommandBuffer     = PFN_vkEndCommandBuffer( vkGetDeviceProcAddr( device, "vkEndCommandBuffer" ) );
+      vkResetCommandBuffer   = PFN_vkResetCommandBuffer( vkGetDeviceProcAddr( device, "vkResetCommandBuffer" ) );
+      vkCmdBindPipeline      = PFN_vkCmdBindPipeline( vkGetDeviceProcAddr( device, "vkCmdBindPipeline" ) );
+      vkCmdSetViewport       = PFN_vkCmdSetViewport( vkGetDeviceProcAddr( device, "vkCmdSetViewport" ) );
+      vkCmdSetScissor        = PFN_vkCmdSetScissor( vkGetDeviceProcAddr( device, "vkCmdSetScissor" ) );
+      vkCmdSetLineWidth      = PFN_vkCmdSetLineWidth( vkGetDeviceProcAddr( device, "vkCmdSetLineWidth" ) );
+      vkCmdSetDepthBias      = PFN_vkCmdSetDepthBias( vkGetDeviceProcAddr( device, "vkCmdSetDepthBias" ) );
+      vkCmdSetBlendConstants = PFN_vkCmdSetBlendConstants( vkGetDeviceProcAddr( device, "vkCmdSetBlendConstants" ) );
+      vkCmdSetDepthBounds    = PFN_vkCmdSetDepthBounds( vkGetDeviceProcAddr( device, "vkCmdSetDepthBounds" ) );
+      vkCmdSetStencilCompareMask =
+        PFN_vkCmdSetStencilCompareMask( vkGetDeviceProcAddr( device, "vkCmdSetStencilCompareMask" ) );
+      vkCmdSetStencilWriteMask =
+        PFN_vkCmdSetStencilWriteMask( vkGetDeviceProcAddr( device, "vkCmdSetStencilWriteMask" ) );
+      vkCmdSetStencilReference =
+        PFN_vkCmdSetStencilReference( vkGetDeviceProcAddr( device, "vkCmdSetStencilReference" ) );
       vkCmdBindDescriptorSets = PFN_vkCmdBindDescriptorSets( vkGetDeviceProcAddr( device, "vkCmdBindDescriptorSets" ) );
       vkCmdBindIndexBuffer    = PFN_vkCmdBindIndexBuffer( vkGetDeviceProcAddr( device, "vkCmdBindIndexBuffer" ) );
-      vkCmdBindPipeline       = PFN_vkCmdBindPipeline( vkGetDeviceProcAddr( device, "vkCmdBindPipeline" ) );
-      vkCmdBindPipelineShaderGroupNV =
-        PFN_vkCmdBindPipelineShaderGroupNV( vkGetDeviceProcAddr( device, "vkCmdBindPipelineShaderGroupNV" ) );
-      vkCmdBindShadingRateImageNV =
-        PFN_vkCmdBindShadingRateImageNV( vkGetDeviceProcAddr( device, "vkCmdBindShadingRateImageNV" ) );
-      vkCmdBindTransformFeedbackBuffersEXT = PFN_vkCmdBindTransformFeedbackBuffersEXT(
-        vkGetDeviceProcAddr( device, "vkCmdBindTransformFeedbackBuffersEXT" ) );
-      vkCmdBindVertexBuffers = PFN_vkCmdBindVertexBuffers( vkGetDeviceProcAddr( device, "vkCmdBindVertexBuffers" ) );
-      vkCmdBindVertexBuffers2EXT =
-        PFN_vkCmdBindVertexBuffers2EXT( vkGetDeviceProcAddr( device, "vkCmdBindVertexBuffers2EXT" ) );
-      vkCmdBlitImage     = PFN_vkCmdBlitImage( vkGetDeviceProcAddr( device, "vkCmdBlitImage" ) );
-      vkCmdBlitImage2KHR = PFN_vkCmdBlitImage2KHR( vkGetDeviceProcAddr( device, "vkCmdBlitImage2KHR" ) );
-      vkCmdBuildAccelerationStructureNV =
-        PFN_vkCmdBuildAccelerationStructureNV( vkGetDeviceProcAddr( device, "vkCmdBuildAccelerationStructureNV" ) );
-      vkCmdBuildAccelerationStructuresIndirectKHR = PFN_vkCmdBuildAccelerationStructuresIndirectKHR(
-        vkGetDeviceProcAddr( device, "vkCmdBuildAccelerationStructuresIndirectKHR" ) );
-      vkCmdBuildAccelerationStructuresKHR =
-        PFN_vkCmdBuildAccelerationStructuresKHR( vkGetDeviceProcAddr( device, "vkCmdBuildAccelerationStructuresKHR" ) );
-      vkCmdClearAttachments = PFN_vkCmdClearAttachments( vkGetDeviceProcAddr( device, "vkCmdClearAttachments" ) );
-      vkCmdClearColorImage  = PFN_vkCmdClearColorImage( vkGetDeviceProcAddr( device, "vkCmdClearColorImage" ) );
+      vkCmdBindVertexBuffers  = PFN_vkCmdBindVertexBuffers( vkGetDeviceProcAddr( device, "vkCmdBindVertexBuffers" ) );
+      vkCmdDraw               = PFN_vkCmdDraw( vkGetDeviceProcAddr( device, "vkCmdDraw" ) );
+      vkCmdDrawIndexed        = PFN_vkCmdDrawIndexed( vkGetDeviceProcAddr( device, "vkCmdDrawIndexed" ) );
+      vkCmdDrawIndirect       = PFN_vkCmdDrawIndirect( vkGetDeviceProcAddr( device, "vkCmdDrawIndirect" ) );
+      vkCmdDrawIndexedIndirect =
+        PFN_vkCmdDrawIndexedIndirect( vkGetDeviceProcAddr( device, "vkCmdDrawIndexedIndirect" ) );
+      vkCmdDispatch          = PFN_vkCmdDispatch( vkGetDeviceProcAddr( device, "vkCmdDispatch" ) );
+      vkCmdDispatchIndirect  = PFN_vkCmdDispatchIndirect( vkGetDeviceProcAddr( device, "vkCmdDispatchIndirect" ) );
+      vkCmdCopyBuffer        = PFN_vkCmdCopyBuffer( vkGetDeviceProcAddr( device, "vkCmdCopyBuffer" ) );
+      vkCmdCopyImage         = PFN_vkCmdCopyImage( vkGetDeviceProcAddr( device, "vkCmdCopyImage" ) );
+      vkCmdBlitImage         = PFN_vkCmdBlitImage( vkGetDeviceProcAddr( device, "vkCmdBlitImage" ) );
+      vkCmdCopyBufferToImage = PFN_vkCmdCopyBufferToImage( vkGetDeviceProcAddr( device, "vkCmdCopyBufferToImage" ) );
+      vkCmdCopyImageToBuffer = PFN_vkCmdCopyImageToBuffer( vkGetDeviceProcAddr( device, "vkCmdCopyImageToBuffer" ) );
+      vkCmdUpdateBuffer      = PFN_vkCmdUpdateBuffer( vkGetDeviceProcAddr( device, "vkCmdUpdateBuffer" ) );
+      vkCmdFillBuffer        = PFN_vkCmdFillBuffer( vkGetDeviceProcAddr( device, "vkCmdFillBuffer" ) );
+      vkCmdClearColorImage   = PFN_vkCmdClearColorImage( vkGetDeviceProcAddr( device, "vkCmdClearColorImage" ) );
       vkCmdClearDepthStencilImage =
         PFN_vkCmdClearDepthStencilImage( vkGetDeviceProcAddr( device, "vkCmdClearDepthStencilImage" ) );
-#if defined( VK_ENABLE_BETA_EXTENSIONS )
-      vkCmdControlVideoCodingKHR =
-        PFN_vkCmdControlVideoCodingKHR( vkGetDeviceProcAddr( device, "vkCmdControlVideoCodingKHR" ) );
-#endif /*VK_ENABLE_BETA_EXTENSIONS*/
-      vkCmdCopyAccelerationStructureKHR =
-        PFN_vkCmdCopyAccelerationStructureKHR( vkGetDeviceProcAddr( device, "vkCmdCopyAccelerationStructureKHR" ) );
-      vkCmdCopyAccelerationStructureNV =
-        PFN_vkCmdCopyAccelerationStructureNV( vkGetDeviceProcAddr( device, "vkCmdCopyAccelerationStructureNV" ) );
-      vkCmdCopyAccelerationStructureToMemoryKHR = PFN_vkCmdCopyAccelerationStructureToMemoryKHR(
-        vkGetDeviceProcAddr( device, "vkCmdCopyAccelerationStructureToMemoryKHR" ) );
-      vkCmdCopyBuffer        = PFN_vkCmdCopyBuffer( vkGetDeviceProcAddr( device, "vkCmdCopyBuffer" ) );
-      vkCmdCopyBuffer2KHR    = PFN_vkCmdCopyBuffer2KHR( vkGetDeviceProcAddr( device, "vkCmdCopyBuffer2KHR" ) );
-      vkCmdCopyBufferToImage = PFN_vkCmdCopyBufferToImage( vkGetDeviceProcAddr( device, "vkCmdCopyBufferToImage" ) );
-      vkCmdCopyBufferToImage2KHR =
-        PFN_vkCmdCopyBufferToImage2KHR( vkGetDeviceProcAddr( device, "vkCmdCopyBufferToImage2KHR" ) );
-      vkCmdCopyImage         = PFN_vkCmdCopyImage( vkGetDeviceProcAddr( device, "vkCmdCopyImage" ) );
-      vkCmdCopyImage2KHR     = PFN_vkCmdCopyImage2KHR( vkGetDeviceProcAddr( device, "vkCmdCopyImage2KHR" ) );
-      vkCmdCopyImageToBuffer = PFN_vkCmdCopyImageToBuffer( vkGetDeviceProcAddr( device, "vkCmdCopyImageToBuffer" ) );
-      vkCmdCopyImageToBuffer2KHR =
-        PFN_vkCmdCopyImageToBuffer2KHR( vkGetDeviceProcAddr( device, "vkCmdCopyImageToBuffer2KHR" ) );
-      vkCmdCopyMemoryToAccelerationStructureKHR = PFN_vkCmdCopyMemoryToAccelerationStructureKHR(
-        vkGetDeviceProcAddr( device, "vkCmdCopyMemoryToAccelerationStructureKHR" ) );
+      vkCmdClearAttachments = PFN_vkCmdClearAttachments( vkGetDeviceProcAddr( device, "vkCmdClearAttachments" ) );
+      vkCmdResolveImage     = PFN_vkCmdResolveImage( vkGetDeviceProcAddr( device, "vkCmdResolveImage" ) );
+      vkCmdSetEvent         = PFN_vkCmdSetEvent( vkGetDeviceProcAddr( device, "vkCmdSetEvent" ) );
+      vkCmdResetEvent       = PFN_vkCmdResetEvent( vkGetDeviceProcAddr( device, "vkCmdResetEvent" ) );
+      vkCmdWaitEvents       = PFN_vkCmdWaitEvents( vkGetDeviceProcAddr( device, "vkCmdWaitEvents" ) );
+      vkCmdPipelineBarrier  = PFN_vkCmdPipelineBarrier( vkGetDeviceProcAddr( device, "vkCmdPipelineBarrier" ) );
+      vkCmdBeginQuery       = PFN_vkCmdBeginQuery( vkGetDeviceProcAddr( device, "vkCmdBeginQuery" ) );
+      vkCmdEndQuery         = PFN_vkCmdEndQuery( vkGetDeviceProcAddr( device, "vkCmdEndQuery" ) );
+      vkCmdResetQueryPool   = PFN_vkCmdResetQueryPool( vkGetDeviceProcAddr( device, "vkCmdResetQueryPool" ) );
+      vkCmdWriteTimestamp   = PFN_vkCmdWriteTimestamp( vkGetDeviceProcAddr( device, "vkCmdWriteTimestamp" ) );
       vkCmdCopyQueryPoolResults =
         PFN_vkCmdCopyQueryPoolResults( vkGetDeviceProcAddr( device, "vkCmdCopyQueryPoolResults" ) );
-      vkCmdCuLaunchKernelNVX = PFN_vkCmdCuLaunchKernelNVX( vkGetDeviceProcAddr( device, "vkCmdCuLaunchKernelNVX" ) );
+      vkCmdPushConstants   = PFN_vkCmdPushConstants( vkGetDeviceProcAddr( device, "vkCmdPushConstants" ) );
+      vkCmdBeginRenderPass = PFN_vkCmdBeginRenderPass( vkGetDeviceProcAddr( device, "vkCmdBeginRenderPass" ) );
+      vkCmdNextSubpass     = PFN_vkCmdNextSubpass( vkGetDeviceProcAddr( device, "vkCmdNextSubpass" ) );
+      vkCmdEndRenderPass   = PFN_vkCmdEndRenderPass( vkGetDeviceProcAddr( device, "vkCmdEndRenderPass" ) );
+      vkCmdExecuteCommands = PFN_vkCmdExecuteCommands( vkGetDeviceProcAddr( device, "vkCmdExecuteCommands" ) );
+
+      //=== VK_VERSION_1_1 ===
+      vkBindBufferMemory2 = PFN_vkBindBufferMemory2( vkGetDeviceProcAddr( device, "vkBindBufferMemory2" ) );
+      vkBindImageMemory2  = PFN_vkBindImageMemory2( vkGetDeviceProcAddr( device, "vkBindImageMemory2" ) );
+      vkGetDeviceGroupPeerMemoryFeatures =
+        PFN_vkGetDeviceGroupPeerMemoryFeatures( vkGetDeviceProcAddr( device, "vkGetDeviceGroupPeerMemoryFeatures" ) );
+      vkCmdSetDeviceMask = PFN_vkCmdSetDeviceMask( vkGetDeviceProcAddr( device, "vkCmdSetDeviceMask" ) );
+      vkCmdDispatchBase  = PFN_vkCmdDispatchBase( vkGetDeviceProcAddr( device, "vkCmdDispatchBase" ) );
+      vkGetImageMemoryRequirements2 =
+        PFN_vkGetImageMemoryRequirements2( vkGetDeviceProcAddr( device, "vkGetImageMemoryRequirements2" ) );
+      vkGetBufferMemoryRequirements2 =
+        PFN_vkGetBufferMemoryRequirements2( vkGetDeviceProcAddr( device, "vkGetBufferMemoryRequirements2" ) );
+      vkGetImageSparseMemoryRequirements2 =
+        PFN_vkGetImageSparseMemoryRequirements2( vkGetDeviceProcAddr( device, "vkGetImageSparseMemoryRequirements2" ) );
+      vkTrimCommandPool = PFN_vkTrimCommandPool( vkGetDeviceProcAddr( device, "vkTrimCommandPool" ) );
+      vkGetDeviceQueue2 = PFN_vkGetDeviceQueue2( vkGetDeviceProcAddr( device, "vkGetDeviceQueue2" ) );
+      vkCreateSamplerYcbcrConversion =
+        PFN_vkCreateSamplerYcbcrConversion( vkGetDeviceProcAddr( device, "vkCreateSamplerYcbcrConversion" ) );
+      vkDestroySamplerYcbcrConversion =
+        PFN_vkDestroySamplerYcbcrConversion( vkGetDeviceProcAddr( device, "vkDestroySamplerYcbcrConversion" ) );
+      vkCreateDescriptorUpdateTemplate =
+        PFN_vkCreateDescriptorUpdateTemplate( vkGetDeviceProcAddr( device, "vkCreateDescriptorUpdateTemplate" ) );
+      vkDestroyDescriptorUpdateTemplate =
+        PFN_vkDestroyDescriptorUpdateTemplate( vkGetDeviceProcAddr( device, "vkDestroyDescriptorUpdateTemplate" ) );
+      vkUpdateDescriptorSetWithTemplate =
+        PFN_vkUpdateDescriptorSetWithTemplate( vkGetDeviceProcAddr( device, "vkUpdateDescriptorSetWithTemplate" ) );
+      vkGetDescriptorSetLayoutSupport =
+        PFN_vkGetDescriptorSetLayoutSupport( vkGetDeviceProcAddr( device, "vkGetDescriptorSetLayoutSupport" ) );
+
+      //=== VK_VERSION_1_2 ===
+      vkCmdDrawIndirectCount = PFN_vkCmdDrawIndirectCount( vkGetDeviceProcAddr( device, "vkCmdDrawIndirectCount" ) );
+      vkCmdDrawIndexedIndirectCount =
+        PFN_vkCmdDrawIndexedIndirectCount( vkGetDeviceProcAddr( device, "vkCmdDrawIndexedIndirectCount" ) );
+      vkCreateRenderPass2   = PFN_vkCreateRenderPass2( vkGetDeviceProcAddr( device, "vkCreateRenderPass2" ) );
+      vkCmdBeginRenderPass2 = PFN_vkCmdBeginRenderPass2( vkGetDeviceProcAddr( device, "vkCmdBeginRenderPass2" ) );
+      vkCmdNextSubpass2     = PFN_vkCmdNextSubpass2( vkGetDeviceProcAddr( device, "vkCmdNextSubpass2" ) );
+      vkCmdEndRenderPass2   = PFN_vkCmdEndRenderPass2( vkGetDeviceProcAddr( device, "vkCmdEndRenderPass2" ) );
+      vkResetQueryPool      = PFN_vkResetQueryPool( vkGetDeviceProcAddr( device, "vkResetQueryPool" ) );
+      vkGetSemaphoreCounterValue =
+        PFN_vkGetSemaphoreCounterValue( vkGetDeviceProcAddr( device, "vkGetSemaphoreCounterValue" ) );
+      vkWaitSemaphores  = PFN_vkWaitSemaphores( vkGetDeviceProcAddr( device, "vkWaitSemaphores" ) );
+      vkSignalSemaphore = PFN_vkSignalSemaphore( vkGetDeviceProcAddr( device, "vkSignalSemaphore" ) );
+      vkGetBufferDeviceAddress =
+        PFN_vkGetBufferDeviceAddress( vkGetDeviceProcAddr( device, "vkGetBufferDeviceAddress" ) );
+      vkGetBufferOpaqueCaptureAddress =
+        PFN_vkGetBufferOpaqueCaptureAddress( vkGetDeviceProcAddr( device, "vkGetBufferOpaqueCaptureAddress" ) );
+      vkGetDeviceMemoryOpaqueCaptureAddress = PFN_vkGetDeviceMemoryOpaqueCaptureAddress(
+        vkGetDeviceProcAddr( device, "vkGetDeviceMemoryOpaqueCaptureAddress" ) );
+
+      //=== VK_KHR_swapchain ===
+      vkCreateSwapchainKHR    = PFN_vkCreateSwapchainKHR( vkGetDeviceProcAddr( device, "vkCreateSwapchainKHR" ) );
+      vkDestroySwapchainKHR   = PFN_vkDestroySwapchainKHR( vkGetDeviceProcAddr( device, "vkDestroySwapchainKHR" ) );
+      vkGetSwapchainImagesKHR = PFN_vkGetSwapchainImagesKHR( vkGetDeviceProcAddr( device, "vkGetSwapchainImagesKHR" ) );
+      vkAcquireNextImageKHR   = PFN_vkAcquireNextImageKHR( vkGetDeviceProcAddr( device, "vkAcquireNextImageKHR" ) );
+      vkQueuePresentKHR       = PFN_vkQueuePresentKHR( vkGetDeviceProcAddr( device, "vkQueuePresentKHR" ) );
+      vkGetDeviceGroupPresentCapabilitiesKHR = PFN_vkGetDeviceGroupPresentCapabilitiesKHR(
+        vkGetDeviceProcAddr( device, "vkGetDeviceGroupPresentCapabilitiesKHR" ) );
+      vkGetDeviceGroupSurfacePresentModesKHR = PFN_vkGetDeviceGroupSurfacePresentModesKHR(
+        vkGetDeviceProcAddr( device, "vkGetDeviceGroupSurfacePresentModesKHR" ) );
+      vkAcquireNextImage2KHR = PFN_vkAcquireNextImage2KHR( vkGetDeviceProcAddr( device, "vkAcquireNextImage2KHR" ) );
+
+      //=== VK_KHR_display_swapchain ===
+      vkCreateSharedSwapchainsKHR =
+        PFN_vkCreateSharedSwapchainsKHR( vkGetDeviceProcAddr( device, "vkCreateSharedSwapchainsKHR" ) );
+
+      //=== VK_EXT_debug_marker ===
+      vkDebugMarkerSetObjectTagEXT =
+        PFN_vkDebugMarkerSetObjectTagEXT( vkGetDeviceProcAddr( device, "vkDebugMarkerSetObjectTagEXT" ) );
+      vkDebugMarkerSetObjectNameEXT =
+        PFN_vkDebugMarkerSetObjectNameEXT( vkGetDeviceProcAddr( device, "vkDebugMarkerSetObjectNameEXT" ) );
       vkCmdDebugMarkerBeginEXT =
         PFN_vkCmdDebugMarkerBeginEXT( vkGetDeviceProcAddr( device, "vkCmdDebugMarkerBeginEXT" ) );
       vkCmdDebugMarkerEndEXT = PFN_vkCmdDebugMarkerEndEXT( vkGetDeviceProcAddr( device, "vkCmdDebugMarkerEndEXT" ) );
       vkCmdDebugMarkerInsertEXT =
         PFN_vkCmdDebugMarkerInsertEXT( vkGetDeviceProcAddr( device, "vkCmdDebugMarkerInsertEXT" ) );
+
 #if defined( VK_ENABLE_BETA_EXTENSIONS )
+      //=== VK_KHR_video_queue ===
+      vkCreateVideoSessionKHR = PFN_vkCreateVideoSessionKHR( vkGetDeviceProcAddr( device, "vkCreateVideoSessionKHR" ) );
+      vkDestroyVideoSessionKHR =
+        PFN_vkDestroyVideoSessionKHR( vkGetDeviceProcAddr( device, "vkDestroyVideoSessionKHR" ) );
+      vkGetVideoSessionMemoryRequirementsKHR = PFN_vkGetVideoSessionMemoryRequirementsKHR(
+        vkGetDeviceProcAddr( device, "vkGetVideoSessionMemoryRequirementsKHR" ) );
+      vkBindVideoSessionMemoryKHR =
+        PFN_vkBindVideoSessionMemoryKHR( vkGetDeviceProcAddr( device, "vkBindVideoSessionMemoryKHR" ) );
+      vkCreateVideoSessionParametersKHR =
+        PFN_vkCreateVideoSessionParametersKHR( vkGetDeviceProcAddr( device, "vkCreateVideoSessionParametersKHR" ) );
+      vkUpdateVideoSessionParametersKHR =
+        PFN_vkUpdateVideoSessionParametersKHR( vkGetDeviceProcAddr( device, "vkUpdateVideoSessionParametersKHR" ) );
+      vkDestroyVideoSessionParametersKHR =
+        PFN_vkDestroyVideoSessionParametersKHR( vkGetDeviceProcAddr( device, "vkDestroyVideoSessionParametersKHR" ) );
+      vkCmdBeginVideoCodingKHR =
+        PFN_vkCmdBeginVideoCodingKHR( vkGetDeviceProcAddr( device, "vkCmdBeginVideoCodingKHR" ) );
+      vkCmdEndVideoCodingKHR = PFN_vkCmdEndVideoCodingKHR( vkGetDeviceProcAddr( device, "vkCmdEndVideoCodingKHR" ) );
+      vkCmdControlVideoCodingKHR =
+        PFN_vkCmdControlVideoCodingKHR( vkGetDeviceProcAddr( device, "vkCmdControlVideoCodingKHR" ) );
+#endif /*VK_ENABLE_BETA_EXTENSIONS*/
+
+#if defined( VK_ENABLE_BETA_EXTENSIONS )
+      //=== VK_KHR_video_decode_queue ===
       vkCmdDecodeVideoKHR = PFN_vkCmdDecodeVideoKHR( vkGetDeviceProcAddr( device, "vkCmdDecodeVideoKHR" ) );
 #endif /*VK_ENABLE_BETA_EXTENSIONS*/
-      vkCmdDispatch        = PFN_vkCmdDispatch( vkGetDeviceProcAddr( device, "vkCmdDispatch" ) );
-      vkCmdDispatchBase    = PFN_vkCmdDispatchBase( vkGetDeviceProcAddr( device, "vkCmdDispatchBase" ) );
-      vkCmdDispatchBaseKHR = PFN_vkCmdDispatchBaseKHR( vkGetDeviceProcAddr( device, "vkCmdDispatchBaseKHR" ) );
-      if ( !vkCmdDispatchBase )
-        vkCmdDispatchBase = vkCmdDispatchBaseKHR;
-      vkCmdDispatchIndirect = PFN_vkCmdDispatchIndirect( vkGetDeviceProcAddr( device, "vkCmdDispatchIndirect" ) );
-      vkCmdDraw             = PFN_vkCmdDraw( vkGetDeviceProcAddr( device, "vkCmdDraw" ) );
-      vkCmdDrawIndexed      = PFN_vkCmdDrawIndexed( vkGetDeviceProcAddr( device, "vkCmdDrawIndexed" ) );
-      vkCmdDrawIndexedIndirect =
-        PFN_vkCmdDrawIndexedIndirect( vkGetDeviceProcAddr( device, "vkCmdDrawIndexedIndirect" ) );
-      vkCmdDrawIndexedIndirectCount =
-        PFN_vkCmdDrawIndexedIndirectCount( vkGetDeviceProcAddr( device, "vkCmdDrawIndexedIndirectCount" ) );
-      vkCmdDrawIndexedIndirectCountAMD =
-        PFN_vkCmdDrawIndexedIndirectCountAMD( vkGetDeviceProcAddr( device, "vkCmdDrawIndexedIndirectCountAMD" ) );
-      if ( !vkCmdDrawIndexedIndirectCount )
-        vkCmdDrawIndexedIndirectCount = vkCmdDrawIndexedIndirectCountAMD;
-      vkCmdDrawIndexedIndirectCountKHR =
-        PFN_vkCmdDrawIndexedIndirectCountKHR( vkGetDeviceProcAddr( device, "vkCmdDrawIndexedIndirectCountKHR" ) );
-      if ( !vkCmdDrawIndexedIndirectCount )
-        vkCmdDrawIndexedIndirectCount = vkCmdDrawIndexedIndirectCountKHR;
-      vkCmdDrawIndirect = PFN_vkCmdDrawIndirect( vkGetDeviceProcAddr( device, "vkCmdDrawIndirect" ) );
+
+      //=== VK_EXT_transform_feedback ===
+      vkCmdBindTransformFeedbackBuffersEXT = PFN_vkCmdBindTransformFeedbackBuffersEXT(
+        vkGetDeviceProcAddr( device, "vkCmdBindTransformFeedbackBuffersEXT" ) );
+      vkCmdBeginTransformFeedbackEXT =
+        PFN_vkCmdBeginTransformFeedbackEXT( vkGetDeviceProcAddr( device, "vkCmdBeginTransformFeedbackEXT" ) );
+      vkCmdEndTransformFeedbackEXT =
+        PFN_vkCmdEndTransformFeedbackEXT( vkGetDeviceProcAddr( device, "vkCmdEndTransformFeedbackEXT" ) );
+      vkCmdBeginQueryIndexedEXT =
+        PFN_vkCmdBeginQueryIndexedEXT( vkGetDeviceProcAddr( device, "vkCmdBeginQueryIndexedEXT" ) );
+      vkCmdEndQueryIndexedEXT = PFN_vkCmdEndQueryIndexedEXT( vkGetDeviceProcAddr( device, "vkCmdEndQueryIndexedEXT" ) );
       vkCmdDrawIndirectByteCountEXT =
         PFN_vkCmdDrawIndirectByteCountEXT( vkGetDeviceProcAddr( device, "vkCmdDrawIndirectByteCountEXT" ) );
-      vkCmdDrawIndirectCount = PFN_vkCmdDrawIndirectCount( vkGetDeviceProcAddr( device, "vkCmdDrawIndirectCount" ) );
+
+      //=== VK_NVX_binary_import ===
+      vkCreateCuModuleNVX    = PFN_vkCreateCuModuleNVX( vkGetDeviceProcAddr( device, "vkCreateCuModuleNVX" ) );
+      vkCreateCuFunctionNVX  = PFN_vkCreateCuFunctionNVX( vkGetDeviceProcAddr( device, "vkCreateCuFunctionNVX" ) );
+      vkDestroyCuModuleNVX   = PFN_vkDestroyCuModuleNVX( vkGetDeviceProcAddr( device, "vkDestroyCuModuleNVX" ) );
+      vkDestroyCuFunctionNVX = PFN_vkDestroyCuFunctionNVX( vkGetDeviceProcAddr( device, "vkDestroyCuFunctionNVX" ) );
+      vkCmdCuLaunchKernelNVX = PFN_vkCmdCuLaunchKernelNVX( vkGetDeviceProcAddr( device, "vkCmdCuLaunchKernelNVX" ) );
+
+      //=== VK_NVX_image_view_handle ===
+      vkGetImageViewHandleNVX = PFN_vkGetImageViewHandleNVX( vkGetDeviceProcAddr( device, "vkGetImageViewHandleNVX" ) );
+      vkGetImageViewAddressNVX =
+        PFN_vkGetImageViewAddressNVX( vkGetDeviceProcAddr( device, "vkGetImageViewAddressNVX" ) );
+
+      //=== VK_AMD_draw_indirect_count ===
       vkCmdDrawIndirectCountAMD =
         PFN_vkCmdDrawIndirectCountAMD( vkGetDeviceProcAddr( device, "vkCmdDrawIndirectCountAMD" ) );
       if ( !vkCmdDrawIndirectCount )
         vkCmdDrawIndirectCount = vkCmdDrawIndirectCountAMD;
-      vkCmdDrawIndirectCountKHR =
-        PFN_vkCmdDrawIndirectCountKHR( vkGetDeviceProcAddr( device, "vkCmdDrawIndirectCountKHR" ) );
-      if ( !vkCmdDrawIndirectCount )
-        vkCmdDrawIndirectCount = vkCmdDrawIndirectCountKHR;
-      vkCmdDrawMeshTasksIndirectCountNV =
-        PFN_vkCmdDrawMeshTasksIndirectCountNV( vkGetDeviceProcAddr( device, "vkCmdDrawMeshTasksIndirectCountNV" ) );
-      vkCmdDrawMeshTasksIndirectNV =
-        PFN_vkCmdDrawMeshTasksIndirectNV( vkGetDeviceProcAddr( device, "vkCmdDrawMeshTasksIndirectNV" ) );
-      vkCmdDrawMeshTasksNV = PFN_vkCmdDrawMeshTasksNV( vkGetDeviceProcAddr( device, "vkCmdDrawMeshTasksNV" ) );
-      vkCmdDrawMultiEXT    = PFN_vkCmdDrawMultiEXT( vkGetDeviceProcAddr( device, "vkCmdDrawMultiEXT" ) );
-      vkCmdDrawMultiIndexedEXT =
-        PFN_vkCmdDrawMultiIndexedEXT( vkGetDeviceProcAddr( device, "vkCmdDrawMultiIndexedEXT" ) );
-#if defined( VK_ENABLE_BETA_EXTENSIONS )
-      vkCmdEncodeVideoKHR = PFN_vkCmdEncodeVideoKHR( vkGetDeviceProcAddr( device, "vkCmdEncodeVideoKHR" ) );
-#endif /*VK_ENABLE_BETA_EXTENSIONS*/
-      vkCmdEndConditionalRenderingEXT =
-        PFN_vkCmdEndConditionalRenderingEXT( vkGetDeviceProcAddr( device, "vkCmdEndConditionalRenderingEXT" ) );
-      vkCmdEndDebugUtilsLabelEXT =
-        PFN_vkCmdEndDebugUtilsLabelEXT( vkGetDeviceProcAddr( device, "vkCmdEndDebugUtilsLabelEXT" ) );
-      vkCmdEndQuery           = PFN_vkCmdEndQuery( vkGetDeviceProcAddr( device, "vkCmdEndQuery" ) );
-      vkCmdEndQueryIndexedEXT = PFN_vkCmdEndQueryIndexedEXT( vkGetDeviceProcAddr( device, "vkCmdEndQueryIndexedEXT" ) );
-      vkCmdEndRenderPass      = PFN_vkCmdEndRenderPass( vkGetDeviceProcAddr( device, "vkCmdEndRenderPass" ) );
-      vkCmdEndRenderPass2     = PFN_vkCmdEndRenderPass2( vkGetDeviceProcAddr( device, "vkCmdEndRenderPass2" ) );
-      vkCmdEndRenderPass2KHR  = PFN_vkCmdEndRenderPass2KHR( vkGetDeviceProcAddr( device, "vkCmdEndRenderPass2KHR" ) );
-      if ( !vkCmdEndRenderPass2 )
-        vkCmdEndRenderPass2 = vkCmdEndRenderPass2KHR;
-      vkCmdEndTransformFeedbackEXT =
-        PFN_vkCmdEndTransformFeedbackEXT( vkGetDeviceProcAddr( device, "vkCmdEndTransformFeedbackEXT" ) );
-#if defined( VK_ENABLE_BETA_EXTENSIONS )
-      vkCmdEndVideoCodingKHR = PFN_vkCmdEndVideoCodingKHR( vkGetDeviceProcAddr( device, "vkCmdEndVideoCodingKHR" ) );
-#endif /*VK_ENABLE_BETA_EXTENSIONS*/
-      vkCmdExecuteCommands = PFN_vkCmdExecuteCommands( vkGetDeviceProcAddr( device, "vkCmdExecuteCommands" ) );
-      vkCmdExecuteGeneratedCommandsNV =
-        PFN_vkCmdExecuteGeneratedCommandsNV( vkGetDeviceProcAddr( device, "vkCmdExecuteGeneratedCommandsNV" ) );
-      vkCmdFillBuffer = PFN_vkCmdFillBuffer( vkGetDeviceProcAddr( device, "vkCmdFillBuffer" ) );
-      vkCmdInsertDebugUtilsLabelEXT =
-        PFN_vkCmdInsertDebugUtilsLabelEXT( vkGetDeviceProcAddr( device, "vkCmdInsertDebugUtilsLabelEXT" ) );
-      vkCmdNextSubpass     = PFN_vkCmdNextSubpass( vkGetDeviceProcAddr( device, "vkCmdNextSubpass" ) );
-      vkCmdNextSubpass2    = PFN_vkCmdNextSubpass2( vkGetDeviceProcAddr( device, "vkCmdNextSubpass2" ) );
-      vkCmdNextSubpass2KHR = PFN_vkCmdNextSubpass2KHR( vkGetDeviceProcAddr( device, "vkCmdNextSubpass2KHR" ) );
-      if ( !vkCmdNextSubpass2 )
-        vkCmdNextSubpass2 = vkCmdNextSubpass2KHR;
-      vkCmdPipelineBarrier = PFN_vkCmdPipelineBarrier( vkGetDeviceProcAddr( device, "vkCmdPipelineBarrier" ) );
-      vkCmdPipelineBarrier2KHR =
-        PFN_vkCmdPipelineBarrier2KHR( vkGetDeviceProcAddr( device, "vkCmdPipelineBarrier2KHR" ) );
-      vkCmdPreprocessGeneratedCommandsNV =
-        PFN_vkCmdPreprocessGeneratedCommandsNV( vkGetDeviceProcAddr( device, "vkCmdPreprocessGeneratedCommandsNV" ) );
-      vkCmdPushConstants = PFN_vkCmdPushConstants( vkGetDeviceProcAddr( device, "vkCmdPushConstants" ) );
+      vkCmdDrawIndexedIndirectCountAMD =
+        PFN_vkCmdDrawIndexedIndirectCountAMD( vkGetDeviceProcAddr( device, "vkCmdDrawIndexedIndirectCountAMD" ) );
+      if ( !vkCmdDrawIndexedIndirectCount )
+        vkCmdDrawIndexedIndirectCount = vkCmdDrawIndexedIndirectCountAMD;
+
+      //=== VK_AMD_shader_info ===
+      vkGetShaderInfoAMD = PFN_vkGetShaderInfoAMD( vkGetDeviceProcAddr( device, "vkGetShaderInfoAMD" ) );
+
+#if defined( VK_USE_PLATFORM_WIN32_KHR )
+      //=== VK_NV_external_memory_win32 ===
+      vkGetMemoryWin32HandleNV =
+        PFN_vkGetMemoryWin32HandleNV( vkGetDeviceProcAddr( device, "vkGetMemoryWin32HandleNV" ) );
+#endif /*VK_USE_PLATFORM_WIN32_KHR*/
+
+      //=== VK_KHR_device_group ===
+      vkGetDeviceGroupPeerMemoryFeaturesKHR = PFN_vkGetDeviceGroupPeerMemoryFeaturesKHR(
+        vkGetDeviceProcAddr( device, "vkGetDeviceGroupPeerMemoryFeaturesKHR" ) );
+      if ( !vkGetDeviceGroupPeerMemoryFeatures )
+        vkGetDeviceGroupPeerMemoryFeatures = vkGetDeviceGroupPeerMemoryFeaturesKHR;
+      vkCmdSetDeviceMaskKHR = PFN_vkCmdSetDeviceMaskKHR( vkGetDeviceProcAddr( device, "vkCmdSetDeviceMaskKHR" ) );
+      if ( !vkCmdSetDeviceMask )
+        vkCmdSetDeviceMask = vkCmdSetDeviceMaskKHR;
+      vkCmdDispatchBaseKHR = PFN_vkCmdDispatchBaseKHR( vkGetDeviceProcAddr( device, "vkCmdDispatchBaseKHR" ) );
+      if ( !vkCmdDispatchBase )
+        vkCmdDispatchBase = vkCmdDispatchBaseKHR;
+
+      //=== VK_KHR_maintenance1 ===
+      vkTrimCommandPoolKHR = PFN_vkTrimCommandPoolKHR( vkGetDeviceProcAddr( device, "vkTrimCommandPoolKHR" ) );
+      if ( !vkTrimCommandPool )
+        vkTrimCommandPool = vkTrimCommandPoolKHR;
+
+#if defined( VK_USE_PLATFORM_WIN32_KHR )
+      //=== VK_KHR_external_memory_win32 ===
+      vkGetMemoryWin32HandleKHR =
+        PFN_vkGetMemoryWin32HandleKHR( vkGetDeviceProcAddr( device, "vkGetMemoryWin32HandleKHR" ) );
+      vkGetMemoryWin32HandlePropertiesKHR =
+        PFN_vkGetMemoryWin32HandlePropertiesKHR( vkGetDeviceProcAddr( device, "vkGetMemoryWin32HandlePropertiesKHR" ) );
+#endif /*VK_USE_PLATFORM_WIN32_KHR*/
+
+      //=== VK_KHR_external_memory_fd ===
+      vkGetMemoryFdKHR = PFN_vkGetMemoryFdKHR( vkGetDeviceProcAddr( device, "vkGetMemoryFdKHR" ) );
+      vkGetMemoryFdPropertiesKHR =
+        PFN_vkGetMemoryFdPropertiesKHR( vkGetDeviceProcAddr( device, "vkGetMemoryFdPropertiesKHR" ) );
+
+#if defined( VK_USE_PLATFORM_WIN32_KHR )
+      //=== VK_KHR_external_semaphore_win32 ===
+      vkImportSemaphoreWin32HandleKHR =
+        PFN_vkImportSemaphoreWin32HandleKHR( vkGetDeviceProcAddr( device, "vkImportSemaphoreWin32HandleKHR" ) );
+      vkGetSemaphoreWin32HandleKHR =
+        PFN_vkGetSemaphoreWin32HandleKHR( vkGetDeviceProcAddr( device, "vkGetSemaphoreWin32HandleKHR" ) );
+#endif /*VK_USE_PLATFORM_WIN32_KHR*/
+
+      //=== VK_KHR_external_semaphore_fd ===
+      vkImportSemaphoreFdKHR = PFN_vkImportSemaphoreFdKHR( vkGetDeviceProcAddr( device, "vkImportSemaphoreFdKHR" ) );
+      vkGetSemaphoreFdKHR    = PFN_vkGetSemaphoreFdKHR( vkGetDeviceProcAddr( device, "vkGetSemaphoreFdKHR" ) );
+
+      //=== VK_KHR_push_descriptor ===
       vkCmdPushDescriptorSetKHR =
         PFN_vkCmdPushDescriptorSetKHR( vkGetDeviceProcAddr( device, "vkCmdPushDescriptorSetKHR" ) );
       vkCmdPushDescriptorSetWithTemplateKHR = PFN_vkCmdPushDescriptorSetWithTemplateKHR(
         vkGetDeviceProcAddr( device, "vkCmdPushDescriptorSetWithTemplateKHR" ) );
-      vkCmdResetEvent        = PFN_vkCmdResetEvent( vkGetDeviceProcAddr( device, "vkCmdResetEvent" ) );
-      vkCmdResetEvent2KHR    = PFN_vkCmdResetEvent2KHR( vkGetDeviceProcAddr( device, "vkCmdResetEvent2KHR" ) );
-      vkCmdResetQueryPool    = PFN_vkCmdResetQueryPool( vkGetDeviceProcAddr( device, "vkCmdResetQueryPool" ) );
-      vkCmdResolveImage      = PFN_vkCmdResolveImage( vkGetDeviceProcAddr( device, "vkCmdResolveImage" ) );
-      vkCmdResolveImage2KHR  = PFN_vkCmdResolveImage2KHR( vkGetDeviceProcAddr( device, "vkCmdResolveImage2KHR" ) );
-      vkCmdSetBlendConstants = PFN_vkCmdSetBlendConstants( vkGetDeviceProcAddr( device, "vkCmdSetBlendConstants" ) );
-      vkCmdSetCheckpointNV   = PFN_vkCmdSetCheckpointNV( vkGetDeviceProcAddr( device, "vkCmdSetCheckpointNV" ) );
-      vkCmdSetCoarseSampleOrderNV =
-        PFN_vkCmdSetCoarseSampleOrderNV( vkGetDeviceProcAddr( device, "vkCmdSetCoarseSampleOrderNV" ) );
-      vkCmdSetColorWriteEnableEXT =
-        PFN_vkCmdSetColorWriteEnableEXT( vkGetDeviceProcAddr( device, "vkCmdSetColorWriteEnableEXT" ) );
-      vkCmdSetCullModeEXT = PFN_vkCmdSetCullModeEXT( vkGetDeviceProcAddr( device, "vkCmdSetCullModeEXT" ) );
-      vkCmdSetDepthBias   = PFN_vkCmdSetDepthBias( vkGetDeviceProcAddr( device, "vkCmdSetDepthBias" ) );
-      vkCmdSetDepthBiasEnableEXT =
-        PFN_vkCmdSetDepthBiasEnableEXT( vkGetDeviceProcAddr( device, "vkCmdSetDepthBiasEnableEXT" ) );
-      vkCmdSetDepthBounds = PFN_vkCmdSetDepthBounds( vkGetDeviceProcAddr( device, "vkCmdSetDepthBounds" ) );
-      vkCmdSetDepthBoundsTestEnableEXT =
-        PFN_vkCmdSetDepthBoundsTestEnableEXT( vkGetDeviceProcAddr( device, "vkCmdSetDepthBoundsTestEnableEXT" ) );
-      vkCmdSetDepthCompareOpEXT =
-        PFN_vkCmdSetDepthCompareOpEXT( vkGetDeviceProcAddr( device, "vkCmdSetDepthCompareOpEXT" ) );
-      vkCmdSetDepthTestEnableEXT =
-        PFN_vkCmdSetDepthTestEnableEXT( vkGetDeviceProcAddr( device, "vkCmdSetDepthTestEnableEXT" ) );
-      vkCmdSetDepthWriteEnableEXT =
-        PFN_vkCmdSetDepthWriteEnableEXT( vkGetDeviceProcAddr( device, "vkCmdSetDepthWriteEnableEXT" ) );
-      vkCmdSetDeviceMask    = PFN_vkCmdSetDeviceMask( vkGetDeviceProcAddr( device, "vkCmdSetDeviceMask" ) );
-      vkCmdSetDeviceMaskKHR = PFN_vkCmdSetDeviceMaskKHR( vkGetDeviceProcAddr( device, "vkCmdSetDeviceMaskKHR" ) );
-      if ( !vkCmdSetDeviceMask )
-        vkCmdSetDeviceMask = vkCmdSetDeviceMaskKHR;
-      vkCmdSetDiscardRectangleEXT =
-        PFN_vkCmdSetDiscardRectangleEXT( vkGetDeviceProcAddr( device, "vkCmdSetDiscardRectangleEXT" ) );
-      vkCmdSetEvent     = PFN_vkCmdSetEvent( vkGetDeviceProcAddr( device, "vkCmdSetEvent" ) );
-      vkCmdSetEvent2KHR = PFN_vkCmdSetEvent2KHR( vkGetDeviceProcAddr( device, "vkCmdSetEvent2KHR" ) );
-      vkCmdSetExclusiveScissorNV =
-        PFN_vkCmdSetExclusiveScissorNV( vkGetDeviceProcAddr( device, "vkCmdSetExclusiveScissorNV" ) );
-      vkCmdSetFragmentShadingRateEnumNV =
-        PFN_vkCmdSetFragmentShadingRateEnumNV( vkGetDeviceProcAddr( device, "vkCmdSetFragmentShadingRateEnumNV" ) );
-      vkCmdSetFragmentShadingRateKHR =
-        PFN_vkCmdSetFragmentShadingRateKHR( vkGetDeviceProcAddr( device, "vkCmdSetFragmentShadingRateKHR" ) );
-      vkCmdSetFrontFaceEXT   = PFN_vkCmdSetFrontFaceEXT( vkGetDeviceProcAddr( device, "vkCmdSetFrontFaceEXT" ) );
-      vkCmdSetLineStippleEXT = PFN_vkCmdSetLineStippleEXT( vkGetDeviceProcAddr( device, "vkCmdSetLineStippleEXT" ) );
-      vkCmdSetLineWidth      = PFN_vkCmdSetLineWidth( vkGetDeviceProcAddr( device, "vkCmdSetLineWidth" ) );
-      vkCmdSetLogicOpEXT     = PFN_vkCmdSetLogicOpEXT( vkGetDeviceProcAddr( device, "vkCmdSetLogicOpEXT" ) );
-      vkCmdSetPatchControlPointsEXT =
-        PFN_vkCmdSetPatchControlPointsEXT( vkGetDeviceProcAddr( device, "vkCmdSetPatchControlPointsEXT" ) );
-      vkCmdSetPerformanceMarkerINTEL =
-        PFN_vkCmdSetPerformanceMarkerINTEL( vkGetDeviceProcAddr( device, "vkCmdSetPerformanceMarkerINTEL" ) );
-      vkCmdSetPerformanceOverrideINTEL =
-        PFN_vkCmdSetPerformanceOverrideINTEL( vkGetDeviceProcAddr( device, "vkCmdSetPerformanceOverrideINTEL" ) );
-      vkCmdSetPerformanceStreamMarkerINTEL = PFN_vkCmdSetPerformanceStreamMarkerINTEL(
-        vkGetDeviceProcAddr( device, "vkCmdSetPerformanceStreamMarkerINTEL" ) );
-      vkCmdSetPrimitiveRestartEnableEXT =
-        PFN_vkCmdSetPrimitiveRestartEnableEXT( vkGetDeviceProcAddr( device, "vkCmdSetPrimitiveRestartEnableEXT" ) );
-      vkCmdSetPrimitiveTopologyEXT =
-        PFN_vkCmdSetPrimitiveTopologyEXT( vkGetDeviceProcAddr( device, "vkCmdSetPrimitiveTopologyEXT" ) );
-      vkCmdSetRasterizerDiscardEnableEXT =
-        PFN_vkCmdSetRasterizerDiscardEnableEXT( vkGetDeviceProcAddr( device, "vkCmdSetRasterizerDiscardEnableEXT" ) );
-      vkCmdSetRayTracingPipelineStackSizeKHR = PFN_vkCmdSetRayTracingPipelineStackSizeKHR(
-        vkGetDeviceProcAddr( device, "vkCmdSetRayTracingPipelineStackSizeKHR" ) );
-      vkCmdSetSampleLocationsEXT =
-        PFN_vkCmdSetSampleLocationsEXT( vkGetDeviceProcAddr( device, "vkCmdSetSampleLocationsEXT" ) );
-      vkCmdSetScissor = PFN_vkCmdSetScissor( vkGetDeviceProcAddr( device, "vkCmdSetScissor" ) );
-      vkCmdSetScissorWithCountEXT =
-        PFN_vkCmdSetScissorWithCountEXT( vkGetDeviceProcAddr( device, "vkCmdSetScissorWithCountEXT" ) );
-      vkCmdSetStencilCompareMask =
-        PFN_vkCmdSetStencilCompareMask( vkGetDeviceProcAddr( device, "vkCmdSetStencilCompareMask" ) );
-      vkCmdSetStencilOpEXT = PFN_vkCmdSetStencilOpEXT( vkGetDeviceProcAddr( device, "vkCmdSetStencilOpEXT" ) );
-      vkCmdSetStencilReference =
-        PFN_vkCmdSetStencilReference( vkGetDeviceProcAddr( device, "vkCmdSetStencilReference" ) );
-      vkCmdSetStencilTestEnableEXT =
-        PFN_vkCmdSetStencilTestEnableEXT( vkGetDeviceProcAddr( device, "vkCmdSetStencilTestEnableEXT" ) );
-      vkCmdSetStencilWriteMask =
-        PFN_vkCmdSetStencilWriteMask( vkGetDeviceProcAddr( device, "vkCmdSetStencilWriteMask" ) );
-      vkCmdSetVertexInputEXT = PFN_vkCmdSetVertexInputEXT( vkGetDeviceProcAddr( device, "vkCmdSetVertexInputEXT" ) );
-      vkCmdSetViewport       = PFN_vkCmdSetViewport( vkGetDeviceProcAddr( device, "vkCmdSetViewport" ) );
-      vkCmdSetViewportShadingRatePaletteNV = PFN_vkCmdSetViewportShadingRatePaletteNV(
-        vkGetDeviceProcAddr( device, "vkCmdSetViewportShadingRatePaletteNV" ) );
+
+      //=== VK_EXT_conditional_rendering ===
+      vkCmdBeginConditionalRenderingEXT =
+        PFN_vkCmdBeginConditionalRenderingEXT( vkGetDeviceProcAddr( device, "vkCmdBeginConditionalRenderingEXT" ) );
+      vkCmdEndConditionalRenderingEXT =
+        PFN_vkCmdEndConditionalRenderingEXT( vkGetDeviceProcAddr( device, "vkCmdEndConditionalRenderingEXT" ) );
+
+      //=== VK_KHR_descriptor_update_template ===
+      vkCreateDescriptorUpdateTemplateKHR =
+        PFN_vkCreateDescriptorUpdateTemplateKHR( vkGetDeviceProcAddr( device, "vkCreateDescriptorUpdateTemplateKHR" ) );
+      if ( !vkCreateDescriptorUpdateTemplate )
+        vkCreateDescriptorUpdateTemplate = vkCreateDescriptorUpdateTemplateKHR;
+      vkDestroyDescriptorUpdateTemplateKHR = PFN_vkDestroyDescriptorUpdateTemplateKHR(
+        vkGetDeviceProcAddr( device, "vkDestroyDescriptorUpdateTemplateKHR" ) );
+      if ( !vkDestroyDescriptorUpdateTemplate )
+        vkDestroyDescriptorUpdateTemplate = vkDestroyDescriptorUpdateTemplateKHR;
+      vkUpdateDescriptorSetWithTemplateKHR = PFN_vkUpdateDescriptorSetWithTemplateKHR(
+        vkGetDeviceProcAddr( device, "vkUpdateDescriptorSetWithTemplateKHR" ) );
+      if ( !vkUpdateDescriptorSetWithTemplate )
+        vkUpdateDescriptorSetWithTemplate = vkUpdateDescriptorSetWithTemplateKHR;
+
+      //=== VK_NV_clip_space_w_scaling ===
       vkCmdSetViewportWScalingNV =
         PFN_vkCmdSetViewportWScalingNV( vkGetDeviceProcAddr( device, "vkCmdSetViewportWScalingNV" ) );
-      vkCmdSetViewportWithCountEXT =
-        PFN_vkCmdSetViewportWithCountEXT( vkGetDeviceProcAddr( device, "vkCmdSetViewportWithCountEXT" ) );
-      vkCmdSubpassShadingHUAWEI =
-        PFN_vkCmdSubpassShadingHUAWEI( vkGetDeviceProcAddr( device, "vkCmdSubpassShadingHUAWEI" ) );
-      vkCmdTraceRaysIndirectKHR =
-        PFN_vkCmdTraceRaysIndirectKHR( vkGetDeviceProcAddr( device, "vkCmdTraceRaysIndirectKHR" ) );
-      vkCmdTraceRaysKHR   = PFN_vkCmdTraceRaysKHR( vkGetDeviceProcAddr( device, "vkCmdTraceRaysKHR" ) );
-      vkCmdTraceRaysNV    = PFN_vkCmdTraceRaysNV( vkGetDeviceProcAddr( device, "vkCmdTraceRaysNV" ) );
-      vkCmdUpdateBuffer   = PFN_vkCmdUpdateBuffer( vkGetDeviceProcAddr( device, "vkCmdUpdateBuffer" ) );
-      vkCmdWaitEvents     = PFN_vkCmdWaitEvents( vkGetDeviceProcAddr( device, "vkCmdWaitEvents" ) );
-      vkCmdWaitEvents2KHR = PFN_vkCmdWaitEvents2KHR( vkGetDeviceProcAddr( device, "vkCmdWaitEvents2KHR" ) );
-      vkCmdWriteAccelerationStructuresPropertiesKHR = PFN_vkCmdWriteAccelerationStructuresPropertiesKHR(
-        vkGetDeviceProcAddr( device, "vkCmdWriteAccelerationStructuresPropertiesKHR" ) );
-      vkCmdWriteAccelerationStructuresPropertiesNV = PFN_vkCmdWriteAccelerationStructuresPropertiesNV(
-        vkGetDeviceProcAddr( device, "vkCmdWriteAccelerationStructuresPropertiesNV" ) );
-      vkCmdWriteBufferMarker2AMD =
-        PFN_vkCmdWriteBufferMarker2AMD( vkGetDeviceProcAddr( device, "vkCmdWriteBufferMarker2AMD" ) );
-      vkCmdWriteBufferMarkerAMD =
-        PFN_vkCmdWriteBufferMarkerAMD( vkGetDeviceProcAddr( device, "vkCmdWriteBufferMarkerAMD" ) );
-      vkCmdWriteTimestamp     = PFN_vkCmdWriteTimestamp( vkGetDeviceProcAddr( device, "vkCmdWriteTimestamp" ) );
-      vkCmdWriteTimestamp2KHR = PFN_vkCmdWriteTimestamp2KHR( vkGetDeviceProcAddr( device, "vkCmdWriteTimestamp2KHR" ) );
-      vkCompileDeferredNV     = PFN_vkCompileDeferredNV( vkGetDeviceProcAddr( device, "vkCompileDeferredNV" ) );
+
+      //=== VK_EXT_display_control ===
+      vkDisplayPowerControlEXT =
+        PFN_vkDisplayPowerControlEXT( vkGetDeviceProcAddr( device, "vkDisplayPowerControlEXT" ) );
+      vkRegisterDeviceEventEXT =
+        PFN_vkRegisterDeviceEventEXT( vkGetDeviceProcAddr( device, "vkRegisterDeviceEventEXT" ) );
+      vkRegisterDisplayEventEXT =
+        PFN_vkRegisterDisplayEventEXT( vkGetDeviceProcAddr( device, "vkRegisterDisplayEventEXT" ) );
+      vkGetSwapchainCounterEXT =
+        PFN_vkGetSwapchainCounterEXT( vkGetDeviceProcAddr( device, "vkGetSwapchainCounterEXT" ) );
+
+      //=== VK_GOOGLE_display_timing ===
+      vkGetRefreshCycleDurationGOOGLE =
+        PFN_vkGetRefreshCycleDurationGOOGLE( vkGetDeviceProcAddr( device, "vkGetRefreshCycleDurationGOOGLE" ) );
+      vkGetPastPresentationTimingGOOGLE =
+        PFN_vkGetPastPresentationTimingGOOGLE( vkGetDeviceProcAddr( device, "vkGetPastPresentationTimingGOOGLE" ) );
+
+      //=== VK_EXT_discard_rectangles ===
+      vkCmdSetDiscardRectangleEXT =
+        PFN_vkCmdSetDiscardRectangleEXT( vkGetDeviceProcAddr( device, "vkCmdSetDiscardRectangleEXT" ) );
+
+      //=== VK_EXT_hdr_metadata ===
+      vkSetHdrMetadataEXT = PFN_vkSetHdrMetadataEXT( vkGetDeviceProcAddr( device, "vkSetHdrMetadataEXT" ) );
+
+      //=== VK_KHR_create_renderpass2 ===
+      vkCreateRenderPass2KHR = PFN_vkCreateRenderPass2KHR( vkGetDeviceProcAddr( device, "vkCreateRenderPass2KHR" ) );
+      if ( !vkCreateRenderPass2 )
+        vkCreateRenderPass2 = vkCreateRenderPass2KHR;
+      vkCmdBeginRenderPass2KHR =
+        PFN_vkCmdBeginRenderPass2KHR( vkGetDeviceProcAddr( device, "vkCmdBeginRenderPass2KHR" ) );
+      if ( !vkCmdBeginRenderPass2 )
+        vkCmdBeginRenderPass2 = vkCmdBeginRenderPass2KHR;
+      vkCmdNextSubpass2KHR = PFN_vkCmdNextSubpass2KHR( vkGetDeviceProcAddr( device, "vkCmdNextSubpass2KHR" ) );
+      if ( !vkCmdNextSubpass2 )
+        vkCmdNextSubpass2 = vkCmdNextSubpass2KHR;
+      vkCmdEndRenderPass2KHR = PFN_vkCmdEndRenderPass2KHR( vkGetDeviceProcAddr( device, "vkCmdEndRenderPass2KHR" ) );
+      if ( !vkCmdEndRenderPass2 )
+        vkCmdEndRenderPass2 = vkCmdEndRenderPass2KHR;
+
+      //=== VK_KHR_shared_presentable_image ===
+      vkGetSwapchainStatusKHR = PFN_vkGetSwapchainStatusKHR( vkGetDeviceProcAddr( device, "vkGetSwapchainStatusKHR" ) );
+
+#if defined( VK_USE_PLATFORM_WIN32_KHR )
+      //=== VK_KHR_external_fence_win32 ===
+      vkImportFenceWin32HandleKHR =
+        PFN_vkImportFenceWin32HandleKHR( vkGetDeviceProcAddr( device, "vkImportFenceWin32HandleKHR" ) );
+      vkGetFenceWin32HandleKHR =
+        PFN_vkGetFenceWin32HandleKHR( vkGetDeviceProcAddr( device, "vkGetFenceWin32HandleKHR" ) );
+#endif /*VK_USE_PLATFORM_WIN32_KHR*/
+
+      //=== VK_KHR_external_fence_fd ===
+      vkImportFenceFdKHR = PFN_vkImportFenceFdKHR( vkGetDeviceProcAddr( device, "vkImportFenceFdKHR" ) );
+      vkGetFenceFdKHR    = PFN_vkGetFenceFdKHR( vkGetDeviceProcAddr( device, "vkGetFenceFdKHR" ) );
+
+      //=== VK_KHR_performance_query ===
+      vkAcquireProfilingLockKHR =
+        PFN_vkAcquireProfilingLockKHR( vkGetDeviceProcAddr( device, "vkAcquireProfilingLockKHR" ) );
+      vkReleaseProfilingLockKHR =
+        PFN_vkReleaseProfilingLockKHR( vkGetDeviceProcAddr( device, "vkReleaseProfilingLockKHR" ) );
+
+      //=== VK_EXT_debug_utils ===
+      vkSetDebugUtilsObjectNameEXT =
+        PFN_vkSetDebugUtilsObjectNameEXT( vkGetDeviceProcAddr( device, "vkSetDebugUtilsObjectNameEXT" ) );
+      vkSetDebugUtilsObjectTagEXT =
+        PFN_vkSetDebugUtilsObjectTagEXT( vkGetDeviceProcAddr( device, "vkSetDebugUtilsObjectTagEXT" ) );
+      vkQueueBeginDebugUtilsLabelEXT =
+        PFN_vkQueueBeginDebugUtilsLabelEXT( vkGetDeviceProcAddr( device, "vkQueueBeginDebugUtilsLabelEXT" ) );
+      vkQueueEndDebugUtilsLabelEXT =
+        PFN_vkQueueEndDebugUtilsLabelEXT( vkGetDeviceProcAddr( device, "vkQueueEndDebugUtilsLabelEXT" ) );
+      vkQueueInsertDebugUtilsLabelEXT =
+        PFN_vkQueueInsertDebugUtilsLabelEXT( vkGetDeviceProcAddr( device, "vkQueueInsertDebugUtilsLabelEXT" ) );
+      vkCmdBeginDebugUtilsLabelEXT =
+        PFN_vkCmdBeginDebugUtilsLabelEXT( vkGetDeviceProcAddr( device, "vkCmdBeginDebugUtilsLabelEXT" ) );
+      vkCmdEndDebugUtilsLabelEXT =
+        PFN_vkCmdEndDebugUtilsLabelEXT( vkGetDeviceProcAddr( device, "vkCmdEndDebugUtilsLabelEXT" ) );
+      vkCmdInsertDebugUtilsLabelEXT =
+        PFN_vkCmdInsertDebugUtilsLabelEXT( vkGetDeviceProcAddr( device, "vkCmdInsertDebugUtilsLabelEXT" ) );
+
+#if defined( VK_USE_PLATFORM_ANDROID_KHR )
+      //=== VK_ANDROID_external_memory_android_hardware_buffer ===
+      vkGetAndroidHardwareBufferPropertiesANDROID = PFN_vkGetAndroidHardwareBufferPropertiesANDROID(
+        vkGetDeviceProcAddr( device, "vkGetAndroidHardwareBufferPropertiesANDROID" ) );
+      vkGetMemoryAndroidHardwareBufferANDROID = PFN_vkGetMemoryAndroidHardwareBufferANDROID(
+        vkGetDeviceProcAddr( device, "vkGetMemoryAndroidHardwareBufferANDROID" ) );
+#endif /*VK_USE_PLATFORM_ANDROID_KHR*/
+
+      //=== VK_EXT_sample_locations ===
+      vkCmdSetSampleLocationsEXT =
+        PFN_vkCmdSetSampleLocationsEXT( vkGetDeviceProcAddr( device, "vkCmdSetSampleLocationsEXT" ) );
+
+      //=== VK_KHR_get_memory_requirements2 ===
+      vkGetImageMemoryRequirements2KHR =
+        PFN_vkGetImageMemoryRequirements2KHR( vkGetDeviceProcAddr( device, "vkGetImageMemoryRequirements2KHR" ) );
+      if ( !vkGetImageMemoryRequirements2 )
+        vkGetImageMemoryRequirements2 = vkGetImageMemoryRequirements2KHR;
+      vkGetBufferMemoryRequirements2KHR =
+        PFN_vkGetBufferMemoryRequirements2KHR( vkGetDeviceProcAddr( device, "vkGetBufferMemoryRequirements2KHR" ) );
+      if ( !vkGetBufferMemoryRequirements2 )
+        vkGetBufferMemoryRequirements2 = vkGetBufferMemoryRequirements2KHR;
+      vkGetImageSparseMemoryRequirements2KHR = PFN_vkGetImageSparseMemoryRequirements2KHR(
+        vkGetDeviceProcAddr( device, "vkGetImageSparseMemoryRequirements2KHR" ) );
+      if ( !vkGetImageSparseMemoryRequirements2 )
+        vkGetImageSparseMemoryRequirements2 = vkGetImageSparseMemoryRequirements2KHR;
+
+      //=== VK_KHR_acceleration_structure ===
+      vkCreateAccelerationStructureKHR =
+        PFN_vkCreateAccelerationStructureKHR( vkGetDeviceProcAddr( device, "vkCreateAccelerationStructureKHR" ) );
+      vkDestroyAccelerationStructureKHR =
+        PFN_vkDestroyAccelerationStructureKHR( vkGetDeviceProcAddr( device, "vkDestroyAccelerationStructureKHR" ) );
+      vkCmdBuildAccelerationStructuresKHR =
+        PFN_vkCmdBuildAccelerationStructuresKHR( vkGetDeviceProcAddr( device, "vkCmdBuildAccelerationStructuresKHR" ) );
+      vkCmdBuildAccelerationStructuresIndirectKHR = PFN_vkCmdBuildAccelerationStructuresIndirectKHR(
+        vkGetDeviceProcAddr( device, "vkCmdBuildAccelerationStructuresIndirectKHR" ) );
+      vkBuildAccelerationStructuresKHR =
+        PFN_vkBuildAccelerationStructuresKHR( vkGetDeviceProcAddr( device, "vkBuildAccelerationStructuresKHR" ) );
       vkCopyAccelerationStructureKHR =
         PFN_vkCopyAccelerationStructureKHR( vkGetDeviceProcAddr( device, "vkCopyAccelerationStructureKHR" ) );
       vkCopyAccelerationStructureToMemoryKHR = PFN_vkCopyAccelerationStructureToMemoryKHR(
         vkGetDeviceProcAddr( device, "vkCopyAccelerationStructureToMemoryKHR" ) );
       vkCopyMemoryToAccelerationStructureKHR = PFN_vkCopyMemoryToAccelerationStructureKHR(
         vkGetDeviceProcAddr( device, "vkCopyMemoryToAccelerationStructureKHR" ) );
-      vkCreateAccelerationStructureKHR =
-        PFN_vkCreateAccelerationStructureKHR( vkGetDeviceProcAddr( device, "vkCreateAccelerationStructureKHR" ) );
-      vkCreateAccelerationStructureNV =
-        PFN_vkCreateAccelerationStructureNV( vkGetDeviceProcAddr( device, "vkCreateAccelerationStructureNV" ) );
-      vkCreateBuffer      = PFN_vkCreateBuffer( vkGetDeviceProcAddr( device, "vkCreateBuffer" ) );
-      vkCreateBufferView  = PFN_vkCreateBufferView( vkGetDeviceProcAddr( device, "vkCreateBufferView" ) );
-      vkCreateCommandPool = PFN_vkCreateCommandPool( vkGetDeviceProcAddr( device, "vkCreateCommandPool" ) );
-      vkCreateComputePipelines =
-        PFN_vkCreateComputePipelines( vkGetDeviceProcAddr( device, "vkCreateComputePipelines" ) );
-      vkCreateCuFunctionNVX = PFN_vkCreateCuFunctionNVX( vkGetDeviceProcAddr( device, "vkCreateCuFunctionNVX" ) );
-      vkCreateCuModuleNVX   = PFN_vkCreateCuModuleNVX( vkGetDeviceProcAddr( device, "vkCreateCuModuleNVX" ) );
-      vkCreateDeferredOperationKHR =
-        PFN_vkCreateDeferredOperationKHR( vkGetDeviceProcAddr( device, "vkCreateDeferredOperationKHR" ) );
-      vkCreateDescriptorPool = PFN_vkCreateDescriptorPool( vkGetDeviceProcAddr( device, "vkCreateDescriptorPool" ) );
-      vkCreateDescriptorSetLayout =
-        PFN_vkCreateDescriptorSetLayout( vkGetDeviceProcAddr( device, "vkCreateDescriptorSetLayout" ) );
-      vkCreateDescriptorUpdateTemplate =
-        PFN_vkCreateDescriptorUpdateTemplate( vkGetDeviceProcAddr( device, "vkCreateDescriptorUpdateTemplate" ) );
-      vkCreateDescriptorUpdateTemplateKHR =
-        PFN_vkCreateDescriptorUpdateTemplateKHR( vkGetDeviceProcAddr( device, "vkCreateDescriptorUpdateTemplateKHR" ) );
-      if ( !vkCreateDescriptorUpdateTemplate )
-        vkCreateDescriptorUpdateTemplate = vkCreateDescriptorUpdateTemplateKHR;
-      vkCreateEvent       = PFN_vkCreateEvent( vkGetDeviceProcAddr( device, "vkCreateEvent" ) );
-      vkCreateFence       = PFN_vkCreateFence( vkGetDeviceProcAddr( device, "vkCreateFence" ) );
-      vkCreateFramebuffer = PFN_vkCreateFramebuffer( vkGetDeviceProcAddr( device, "vkCreateFramebuffer" ) );
-      vkCreateGraphicsPipelines =
-        PFN_vkCreateGraphicsPipelines( vkGetDeviceProcAddr( device, "vkCreateGraphicsPipelines" ) );
-      vkCreateImage     = PFN_vkCreateImage( vkGetDeviceProcAddr( device, "vkCreateImage" ) );
-      vkCreateImageView = PFN_vkCreateImageView( vkGetDeviceProcAddr( device, "vkCreateImageView" ) );
-      vkCreateIndirectCommandsLayoutNV =
-        PFN_vkCreateIndirectCommandsLayoutNV( vkGetDeviceProcAddr( device, "vkCreateIndirectCommandsLayoutNV" ) );
-      vkCreatePipelineCache  = PFN_vkCreatePipelineCache( vkGetDeviceProcAddr( device, "vkCreatePipelineCache" ) );
-      vkCreatePipelineLayout = PFN_vkCreatePipelineLayout( vkGetDeviceProcAddr( device, "vkCreatePipelineLayout" ) );
-      vkCreatePrivateDataSlotEXT =
-        PFN_vkCreatePrivateDataSlotEXT( vkGetDeviceProcAddr( device, "vkCreatePrivateDataSlotEXT" ) );
-      vkCreateQueryPool = PFN_vkCreateQueryPool( vkGetDeviceProcAddr( device, "vkCreateQueryPool" ) );
-      vkCreateRayTracingPipelinesKHR =
-        PFN_vkCreateRayTracingPipelinesKHR( vkGetDeviceProcAddr( device, "vkCreateRayTracingPipelinesKHR" ) );
-      vkCreateRayTracingPipelinesNV =
-        PFN_vkCreateRayTracingPipelinesNV( vkGetDeviceProcAddr( device, "vkCreateRayTracingPipelinesNV" ) );
-      vkCreateRenderPass     = PFN_vkCreateRenderPass( vkGetDeviceProcAddr( device, "vkCreateRenderPass" ) );
-      vkCreateRenderPass2    = PFN_vkCreateRenderPass2( vkGetDeviceProcAddr( device, "vkCreateRenderPass2" ) );
-      vkCreateRenderPass2KHR = PFN_vkCreateRenderPass2KHR( vkGetDeviceProcAddr( device, "vkCreateRenderPass2KHR" ) );
-      if ( !vkCreateRenderPass2 )
-        vkCreateRenderPass2 = vkCreateRenderPass2KHR;
-      vkCreateSampler = PFN_vkCreateSampler( vkGetDeviceProcAddr( device, "vkCreateSampler" ) );
-      vkCreateSamplerYcbcrConversion =
-        PFN_vkCreateSamplerYcbcrConversion( vkGetDeviceProcAddr( device, "vkCreateSamplerYcbcrConversion" ) );
+      vkWriteAccelerationStructuresPropertiesKHR = PFN_vkWriteAccelerationStructuresPropertiesKHR(
+        vkGetDeviceProcAddr( device, "vkWriteAccelerationStructuresPropertiesKHR" ) );
+      vkCmdCopyAccelerationStructureKHR =
+        PFN_vkCmdCopyAccelerationStructureKHR( vkGetDeviceProcAddr( device, "vkCmdCopyAccelerationStructureKHR" ) );
+      vkCmdCopyAccelerationStructureToMemoryKHR = PFN_vkCmdCopyAccelerationStructureToMemoryKHR(
+        vkGetDeviceProcAddr( device, "vkCmdCopyAccelerationStructureToMemoryKHR" ) );
+      vkCmdCopyMemoryToAccelerationStructureKHR = PFN_vkCmdCopyMemoryToAccelerationStructureKHR(
+        vkGetDeviceProcAddr( device, "vkCmdCopyMemoryToAccelerationStructureKHR" ) );
+      vkGetAccelerationStructureDeviceAddressKHR = PFN_vkGetAccelerationStructureDeviceAddressKHR(
+        vkGetDeviceProcAddr( device, "vkGetAccelerationStructureDeviceAddressKHR" ) );
+      vkCmdWriteAccelerationStructuresPropertiesKHR = PFN_vkCmdWriteAccelerationStructuresPropertiesKHR(
+        vkGetDeviceProcAddr( device, "vkCmdWriteAccelerationStructuresPropertiesKHR" ) );
+      vkGetDeviceAccelerationStructureCompatibilityKHR = PFN_vkGetDeviceAccelerationStructureCompatibilityKHR(
+        vkGetDeviceProcAddr( device, "vkGetDeviceAccelerationStructureCompatibilityKHR" ) );
+      vkGetAccelerationStructureBuildSizesKHR = PFN_vkGetAccelerationStructureBuildSizesKHR(
+        vkGetDeviceProcAddr( device, "vkGetAccelerationStructureBuildSizesKHR" ) );
+
+      //=== VK_KHR_sampler_ycbcr_conversion ===
       vkCreateSamplerYcbcrConversionKHR =
         PFN_vkCreateSamplerYcbcrConversionKHR( vkGetDeviceProcAddr( device, "vkCreateSamplerYcbcrConversionKHR" ) );
       if ( !vkCreateSamplerYcbcrConversion )
         vkCreateSamplerYcbcrConversion = vkCreateSamplerYcbcrConversionKHR;
-      vkCreateSemaphore    = PFN_vkCreateSemaphore( vkGetDeviceProcAddr( device, "vkCreateSemaphore" ) );
-      vkCreateShaderModule = PFN_vkCreateShaderModule( vkGetDeviceProcAddr( device, "vkCreateShaderModule" ) );
-      vkCreateSharedSwapchainsKHR =
-        PFN_vkCreateSharedSwapchainsKHR( vkGetDeviceProcAddr( device, "vkCreateSharedSwapchainsKHR" ) );
-      vkCreateSwapchainKHR = PFN_vkCreateSwapchainKHR( vkGetDeviceProcAddr( device, "vkCreateSwapchainKHR" ) );
-      vkCreateValidationCacheEXT =
-        PFN_vkCreateValidationCacheEXT( vkGetDeviceProcAddr( device, "vkCreateValidationCacheEXT" ) );
-#if defined( VK_ENABLE_BETA_EXTENSIONS )
-      vkCreateVideoSessionKHR = PFN_vkCreateVideoSessionKHR( vkGetDeviceProcAddr( device, "vkCreateVideoSessionKHR" ) );
-#endif /*VK_ENABLE_BETA_EXTENSIONS*/
-#if defined( VK_ENABLE_BETA_EXTENSIONS )
-      vkCreateVideoSessionParametersKHR =
-        PFN_vkCreateVideoSessionParametersKHR( vkGetDeviceProcAddr( device, "vkCreateVideoSessionParametersKHR" ) );
-#endif /*VK_ENABLE_BETA_EXTENSIONS*/
-      vkDebugMarkerSetObjectNameEXT =
-        PFN_vkDebugMarkerSetObjectNameEXT( vkGetDeviceProcAddr( device, "vkDebugMarkerSetObjectNameEXT" ) );
-      vkDebugMarkerSetObjectTagEXT =
-        PFN_vkDebugMarkerSetObjectTagEXT( vkGetDeviceProcAddr( device, "vkDebugMarkerSetObjectTagEXT" ) );
-      vkDeferredOperationJoinKHR =
-        PFN_vkDeferredOperationJoinKHR( vkGetDeviceProcAddr( device, "vkDeferredOperationJoinKHR" ) );
-      vkDestroyAccelerationStructureKHR =
-        PFN_vkDestroyAccelerationStructureKHR( vkGetDeviceProcAddr( device, "vkDestroyAccelerationStructureKHR" ) );
-      vkDestroyAccelerationStructureNV =
-        PFN_vkDestroyAccelerationStructureNV( vkGetDeviceProcAddr( device, "vkDestroyAccelerationStructureNV" ) );
-      vkDestroyBuffer        = PFN_vkDestroyBuffer( vkGetDeviceProcAddr( device, "vkDestroyBuffer" ) );
-      vkDestroyBufferView    = PFN_vkDestroyBufferView( vkGetDeviceProcAddr( device, "vkDestroyBufferView" ) );
-      vkDestroyCommandPool   = PFN_vkDestroyCommandPool( vkGetDeviceProcAddr( device, "vkDestroyCommandPool" ) );
-      vkDestroyCuFunctionNVX = PFN_vkDestroyCuFunctionNVX( vkGetDeviceProcAddr( device, "vkDestroyCuFunctionNVX" ) );
-      vkDestroyCuModuleNVX   = PFN_vkDestroyCuModuleNVX( vkGetDeviceProcAddr( device, "vkDestroyCuModuleNVX" ) );
-      vkDestroyDeferredOperationKHR =
-        PFN_vkDestroyDeferredOperationKHR( vkGetDeviceProcAddr( device, "vkDestroyDeferredOperationKHR" ) );
-      vkDestroyDescriptorPool = PFN_vkDestroyDescriptorPool( vkGetDeviceProcAddr( device, "vkDestroyDescriptorPool" ) );
-      vkDestroyDescriptorSetLayout =
-        PFN_vkDestroyDescriptorSetLayout( vkGetDeviceProcAddr( device, "vkDestroyDescriptorSetLayout" ) );
-      vkDestroyDescriptorUpdateTemplate =
-        PFN_vkDestroyDescriptorUpdateTemplate( vkGetDeviceProcAddr( device, "vkDestroyDescriptorUpdateTemplate" ) );
-      vkDestroyDescriptorUpdateTemplateKHR = PFN_vkDestroyDescriptorUpdateTemplateKHR(
-        vkGetDeviceProcAddr( device, "vkDestroyDescriptorUpdateTemplateKHR" ) );
-      if ( !vkDestroyDescriptorUpdateTemplate )
-        vkDestroyDescriptorUpdateTemplate = vkDestroyDescriptorUpdateTemplateKHR;
-      vkDestroyDevice      = PFN_vkDestroyDevice( vkGetDeviceProcAddr( device, "vkDestroyDevice" ) );
-      vkDestroyEvent       = PFN_vkDestroyEvent( vkGetDeviceProcAddr( device, "vkDestroyEvent" ) );
-      vkDestroyFence       = PFN_vkDestroyFence( vkGetDeviceProcAddr( device, "vkDestroyFence" ) );
-      vkDestroyFramebuffer = PFN_vkDestroyFramebuffer( vkGetDeviceProcAddr( device, "vkDestroyFramebuffer" ) );
-      vkDestroyImage       = PFN_vkDestroyImage( vkGetDeviceProcAddr( device, "vkDestroyImage" ) );
-      vkDestroyImageView   = PFN_vkDestroyImageView( vkGetDeviceProcAddr( device, "vkDestroyImageView" ) );
-      vkDestroyIndirectCommandsLayoutNV =
-        PFN_vkDestroyIndirectCommandsLayoutNV( vkGetDeviceProcAddr( device, "vkDestroyIndirectCommandsLayoutNV" ) );
-      vkDestroyPipeline       = PFN_vkDestroyPipeline( vkGetDeviceProcAddr( device, "vkDestroyPipeline" ) );
-      vkDestroyPipelineCache  = PFN_vkDestroyPipelineCache( vkGetDeviceProcAddr( device, "vkDestroyPipelineCache" ) );
-      vkDestroyPipelineLayout = PFN_vkDestroyPipelineLayout( vkGetDeviceProcAddr( device, "vkDestroyPipelineLayout" ) );
-      vkDestroyPrivateDataSlotEXT =
-        PFN_vkDestroyPrivateDataSlotEXT( vkGetDeviceProcAddr( device, "vkDestroyPrivateDataSlotEXT" ) );
-      vkDestroyQueryPool  = PFN_vkDestroyQueryPool( vkGetDeviceProcAddr( device, "vkDestroyQueryPool" ) );
-      vkDestroyRenderPass = PFN_vkDestroyRenderPass( vkGetDeviceProcAddr( device, "vkDestroyRenderPass" ) );
-      vkDestroySampler    = PFN_vkDestroySampler( vkGetDeviceProcAddr( device, "vkDestroySampler" ) );
-      vkDestroySamplerYcbcrConversion =
-        PFN_vkDestroySamplerYcbcrConversion( vkGetDeviceProcAddr( device, "vkDestroySamplerYcbcrConversion" ) );
       vkDestroySamplerYcbcrConversionKHR =
         PFN_vkDestroySamplerYcbcrConversionKHR( vkGetDeviceProcAddr( device, "vkDestroySamplerYcbcrConversionKHR" ) );
       if ( !vkDestroySamplerYcbcrConversion )
         vkDestroySamplerYcbcrConversion = vkDestroySamplerYcbcrConversionKHR;
-      vkDestroySemaphore    = PFN_vkDestroySemaphore( vkGetDeviceProcAddr( device, "vkDestroySemaphore" ) );
-      vkDestroyShaderModule = PFN_vkDestroyShaderModule( vkGetDeviceProcAddr( device, "vkDestroyShaderModule" ) );
-      vkDestroySwapchainKHR = PFN_vkDestroySwapchainKHR( vkGetDeviceProcAddr( device, "vkDestroySwapchainKHR" ) );
-      vkDestroyValidationCacheEXT =
-        PFN_vkDestroyValidationCacheEXT( vkGetDeviceProcAddr( device, "vkDestroyValidationCacheEXT" ) );
-#if defined( VK_ENABLE_BETA_EXTENSIONS )
-      vkDestroyVideoSessionKHR =
-        PFN_vkDestroyVideoSessionKHR( vkGetDeviceProcAddr( device, "vkDestroyVideoSessionKHR" ) );
-#endif /*VK_ENABLE_BETA_EXTENSIONS*/
-#if defined( VK_ENABLE_BETA_EXTENSIONS )
-      vkDestroyVideoSessionParametersKHR =
-        PFN_vkDestroyVideoSessionParametersKHR( vkGetDeviceProcAddr( device, "vkDestroyVideoSessionParametersKHR" ) );
-#endif /*VK_ENABLE_BETA_EXTENSIONS*/
-      vkDeviceWaitIdle = PFN_vkDeviceWaitIdle( vkGetDeviceProcAddr( device, "vkDeviceWaitIdle" ) );
-      vkDisplayPowerControlEXT =
-        PFN_vkDisplayPowerControlEXT( vkGetDeviceProcAddr( device, "vkDisplayPowerControlEXT" ) );
-      vkEndCommandBuffer = PFN_vkEndCommandBuffer( vkGetDeviceProcAddr( device, "vkEndCommandBuffer" ) );
-      vkFlushMappedMemoryRanges =
-        PFN_vkFlushMappedMemoryRanges( vkGetDeviceProcAddr( device, "vkFlushMappedMemoryRanges" ) );
-      vkFreeCommandBuffers = PFN_vkFreeCommandBuffers( vkGetDeviceProcAddr( device, "vkFreeCommandBuffers" ) );
-      vkFreeDescriptorSets = PFN_vkFreeDescriptorSets( vkGetDeviceProcAddr( device, "vkFreeDescriptorSets" ) );
-      vkFreeMemory         = PFN_vkFreeMemory( vkGetDeviceProcAddr( device, "vkFreeMemory" ) );
-      vkGetAccelerationStructureBuildSizesKHR = PFN_vkGetAccelerationStructureBuildSizesKHR(
-        vkGetDeviceProcAddr( device, "vkGetAccelerationStructureBuildSizesKHR" ) );
-      vkGetAccelerationStructureDeviceAddressKHR = PFN_vkGetAccelerationStructureDeviceAddressKHR(
-        vkGetDeviceProcAddr( device, "vkGetAccelerationStructureDeviceAddressKHR" ) );
-      vkGetAccelerationStructureHandleNV =
-        PFN_vkGetAccelerationStructureHandleNV( vkGetDeviceProcAddr( device, "vkGetAccelerationStructureHandleNV" ) );
-      vkGetAccelerationStructureMemoryRequirementsNV = PFN_vkGetAccelerationStructureMemoryRequirementsNV(
-        vkGetDeviceProcAddr( device, "vkGetAccelerationStructureMemoryRequirementsNV" ) );
-#if defined( VK_USE_PLATFORM_ANDROID_KHR )
-      vkGetAndroidHardwareBufferPropertiesANDROID = PFN_vkGetAndroidHardwareBufferPropertiesANDROID(
-        vkGetDeviceProcAddr( device, "vkGetAndroidHardwareBufferPropertiesANDROID" ) );
-#endif /*VK_USE_PLATFORM_ANDROID_KHR*/
-      vkGetBufferDeviceAddress =
-        PFN_vkGetBufferDeviceAddress( vkGetDeviceProcAddr( device, "vkGetBufferDeviceAddress" ) );
-      vkGetBufferDeviceAddressEXT =
-        PFN_vkGetBufferDeviceAddressEXT( vkGetDeviceProcAddr( device, "vkGetBufferDeviceAddressEXT" ) );
-      if ( !vkGetBufferDeviceAddress )
-        vkGetBufferDeviceAddress = vkGetBufferDeviceAddressEXT;
-      vkGetBufferDeviceAddressKHR =
-        PFN_vkGetBufferDeviceAddressKHR( vkGetDeviceProcAddr( device, "vkGetBufferDeviceAddressKHR" ) );
-      if ( !vkGetBufferDeviceAddress )
-        vkGetBufferDeviceAddress = vkGetBufferDeviceAddressKHR;
-      vkGetBufferMemoryRequirements =
-        PFN_vkGetBufferMemoryRequirements( vkGetDeviceProcAddr( device, "vkGetBufferMemoryRequirements" ) );
-      vkGetBufferMemoryRequirements2 =
-        PFN_vkGetBufferMemoryRequirements2( vkGetDeviceProcAddr( device, "vkGetBufferMemoryRequirements2" ) );
-      vkGetBufferMemoryRequirements2KHR =
-        PFN_vkGetBufferMemoryRequirements2KHR( vkGetDeviceProcAddr( device, "vkGetBufferMemoryRequirements2KHR" ) );
-      if ( !vkGetBufferMemoryRequirements2 )
-        vkGetBufferMemoryRequirements2 = vkGetBufferMemoryRequirements2KHR;
-      vkGetBufferOpaqueCaptureAddress =
-        PFN_vkGetBufferOpaqueCaptureAddress( vkGetDeviceProcAddr( device, "vkGetBufferOpaqueCaptureAddress" ) );
-      vkGetBufferOpaqueCaptureAddressKHR =
-        PFN_vkGetBufferOpaqueCaptureAddressKHR( vkGetDeviceProcAddr( device, "vkGetBufferOpaqueCaptureAddressKHR" ) );
-      if ( !vkGetBufferOpaqueCaptureAddress )
-        vkGetBufferOpaqueCaptureAddress = vkGetBufferOpaqueCaptureAddressKHR;
-      vkGetCalibratedTimestampsEXT =
-        PFN_vkGetCalibratedTimestampsEXT( vkGetDeviceProcAddr( device, "vkGetCalibratedTimestampsEXT" ) );
-      vkGetDeferredOperationMaxConcurrencyKHR = PFN_vkGetDeferredOperationMaxConcurrencyKHR(
-        vkGetDeviceProcAddr( device, "vkGetDeferredOperationMaxConcurrencyKHR" ) );
-      vkGetDeferredOperationResultKHR =
-        PFN_vkGetDeferredOperationResultKHR( vkGetDeviceProcAddr( device, "vkGetDeferredOperationResultKHR" ) );
-      vkGetDescriptorSetLayoutSupport =
-        PFN_vkGetDescriptorSetLayoutSupport( vkGetDeviceProcAddr( device, "vkGetDescriptorSetLayoutSupport" ) );
-      vkGetDescriptorSetLayoutSupportKHR =
-        PFN_vkGetDescriptorSetLayoutSupportKHR( vkGetDeviceProcAddr( device, "vkGetDescriptorSetLayoutSupportKHR" ) );
-      if ( !vkGetDescriptorSetLayoutSupport )
-        vkGetDescriptorSetLayoutSupport = vkGetDescriptorSetLayoutSupportKHR;
-      vkGetDeviceAccelerationStructureCompatibilityKHR = PFN_vkGetDeviceAccelerationStructureCompatibilityKHR(
-        vkGetDeviceProcAddr( device, "vkGetDeviceAccelerationStructureCompatibilityKHR" ) );
-      vkGetDeviceGroupPeerMemoryFeatures =
-        PFN_vkGetDeviceGroupPeerMemoryFeatures( vkGetDeviceProcAddr( device, "vkGetDeviceGroupPeerMemoryFeatures" ) );
-      vkGetDeviceGroupPeerMemoryFeaturesKHR = PFN_vkGetDeviceGroupPeerMemoryFeaturesKHR(
-        vkGetDeviceProcAddr( device, "vkGetDeviceGroupPeerMemoryFeaturesKHR" ) );
-      if ( !vkGetDeviceGroupPeerMemoryFeatures )
-        vkGetDeviceGroupPeerMemoryFeatures = vkGetDeviceGroupPeerMemoryFeaturesKHR;
-      vkGetDeviceGroupPresentCapabilitiesKHR = PFN_vkGetDeviceGroupPresentCapabilitiesKHR(
-        vkGetDeviceProcAddr( device, "vkGetDeviceGroupPresentCapabilitiesKHR" ) );
-#if defined( VK_USE_PLATFORM_WIN32_KHR )
-      vkGetDeviceGroupSurfacePresentModes2EXT = PFN_vkGetDeviceGroupSurfacePresentModes2EXT(
-        vkGetDeviceProcAddr( device, "vkGetDeviceGroupSurfacePresentModes2EXT" ) );
-#endif /*VK_USE_PLATFORM_WIN32_KHR*/
-      vkGetDeviceGroupSurfacePresentModesKHR = PFN_vkGetDeviceGroupSurfacePresentModesKHR(
-        vkGetDeviceProcAddr( device, "vkGetDeviceGroupSurfacePresentModesKHR" ) );
-      vkGetDeviceMemoryCommitment =
-        PFN_vkGetDeviceMemoryCommitment( vkGetDeviceProcAddr( device, "vkGetDeviceMemoryCommitment" ) );
-      vkGetDeviceMemoryOpaqueCaptureAddress = PFN_vkGetDeviceMemoryOpaqueCaptureAddress(
-        vkGetDeviceProcAddr( device, "vkGetDeviceMemoryOpaqueCaptureAddress" ) );
-      vkGetDeviceMemoryOpaqueCaptureAddressKHR = PFN_vkGetDeviceMemoryOpaqueCaptureAddressKHR(
-        vkGetDeviceProcAddr( device, "vkGetDeviceMemoryOpaqueCaptureAddressKHR" ) );
-      if ( !vkGetDeviceMemoryOpaqueCaptureAddress )
-        vkGetDeviceMemoryOpaqueCaptureAddress = vkGetDeviceMemoryOpaqueCaptureAddressKHR;
-      vkGetDeviceProcAddr = PFN_vkGetDeviceProcAddr( vkGetDeviceProcAddr( device, "vkGetDeviceProcAddr" ) );
-      vkGetDeviceQueue    = PFN_vkGetDeviceQueue( vkGetDeviceProcAddr( device, "vkGetDeviceQueue" ) );
-      vkGetDeviceQueue2   = PFN_vkGetDeviceQueue2( vkGetDeviceProcAddr( device, "vkGetDeviceQueue2" ) );
-      vkGetDeviceSubpassShadingMaxWorkgroupSizeHUAWEI = PFN_vkGetDeviceSubpassShadingMaxWorkgroupSizeHUAWEI(
-        vkGetDeviceProcAddr( device, "vkGetDeviceSubpassShadingMaxWorkgroupSizeHUAWEI" ) );
-      vkGetEventStatus = PFN_vkGetEventStatus( vkGetDeviceProcAddr( device, "vkGetEventStatus" ) );
-      vkGetFenceFdKHR  = PFN_vkGetFenceFdKHR( vkGetDeviceProcAddr( device, "vkGetFenceFdKHR" ) );
-      vkGetFenceStatus = PFN_vkGetFenceStatus( vkGetDeviceProcAddr( device, "vkGetFenceStatus" ) );
-#if defined( VK_USE_PLATFORM_WIN32_KHR )
-      vkGetFenceWin32HandleKHR =
-        PFN_vkGetFenceWin32HandleKHR( vkGetDeviceProcAddr( device, "vkGetFenceWin32HandleKHR" ) );
-#endif /*VK_USE_PLATFORM_WIN32_KHR*/
-      vkGetGeneratedCommandsMemoryRequirementsNV = PFN_vkGetGeneratedCommandsMemoryRequirementsNV(
-        vkGetDeviceProcAddr( device, "vkGetGeneratedCommandsMemoryRequirementsNV" ) );
+
+      //=== VK_KHR_bind_memory2 ===
+      vkBindBufferMemory2KHR = PFN_vkBindBufferMemory2KHR( vkGetDeviceProcAddr( device, "vkBindBufferMemory2KHR" ) );
+      if ( !vkBindBufferMemory2 )
+        vkBindBufferMemory2 = vkBindBufferMemory2KHR;
+      vkBindImageMemory2KHR = PFN_vkBindImageMemory2KHR( vkGetDeviceProcAddr( device, "vkBindImageMemory2KHR" ) );
+      if ( !vkBindImageMemory2 )
+        vkBindImageMemory2 = vkBindImageMemory2KHR;
+
+      //=== VK_EXT_image_drm_format_modifier ===
       vkGetImageDrmFormatModifierPropertiesEXT = PFN_vkGetImageDrmFormatModifierPropertiesEXT(
         vkGetDeviceProcAddr( device, "vkGetImageDrmFormatModifierPropertiesEXT" ) );
-      vkGetImageMemoryRequirements =
-        PFN_vkGetImageMemoryRequirements( vkGetDeviceProcAddr( device, "vkGetImageMemoryRequirements" ) );
-      vkGetImageMemoryRequirements2 =
-        PFN_vkGetImageMemoryRequirements2( vkGetDeviceProcAddr( device, "vkGetImageMemoryRequirements2" ) );
-      vkGetImageMemoryRequirements2KHR =
-        PFN_vkGetImageMemoryRequirements2KHR( vkGetDeviceProcAddr( device, "vkGetImageMemoryRequirements2KHR" ) );
-      if ( !vkGetImageMemoryRequirements2 )
-        vkGetImageMemoryRequirements2 = vkGetImageMemoryRequirements2KHR;
-      vkGetImageSparseMemoryRequirements =
-        PFN_vkGetImageSparseMemoryRequirements( vkGetDeviceProcAddr( device, "vkGetImageSparseMemoryRequirements" ) );
-      vkGetImageSparseMemoryRequirements2 =
-        PFN_vkGetImageSparseMemoryRequirements2( vkGetDeviceProcAddr( device, "vkGetImageSparseMemoryRequirements2" ) );
-      vkGetImageSparseMemoryRequirements2KHR = PFN_vkGetImageSparseMemoryRequirements2KHR(
-        vkGetDeviceProcAddr( device, "vkGetImageSparseMemoryRequirements2KHR" ) );
-      if ( !vkGetImageSparseMemoryRequirements2 )
-        vkGetImageSparseMemoryRequirements2 = vkGetImageSparseMemoryRequirements2KHR;
-      vkGetImageSubresourceLayout =
-        PFN_vkGetImageSubresourceLayout( vkGetDeviceProcAddr( device, "vkGetImageSubresourceLayout" ) );
-      vkGetImageViewAddressNVX =
-        PFN_vkGetImageViewAddressNVX( vkGetDeviceProcAddr( device, "vkGetImageViewAddressNVX" ) );
-      vkGetImageViewHandleNVX = PFN_vkGetImageViewHandleNVX( vkGetDeviceProcAddr( device, "vkGetImageViewHandleNVX" ) );
-#if defined( VK_USE_PLATFORM_ANDROID_KHR )
-      vkGetMemoryAndroidHardwareBufferANDROID = PFN_vkGetMemoryAndroidHardwareBufferANDROID(
-        vkGetDeviceProcAddr( device, "vkGetMemoryAndroidHardwareBufferANDROID" ) );
-#endif /*VK_USE_PLATFORM_ANDROID_KHR*/
-      vkGetMemoryFdKHR = PFN_vkGetMemoryFdKHR( vkGetDeviceProcAddr( device, "vkGetMemoryFdKHR" ) );
-      vkGetMemoryFdPropertiesKHR =
-        PFN_vkGetMemoryFdPropertiesKHR( vkGetDeviceProcAddr( device, "vkGetMemoryFdPropertiesKHR" ) );
-      vkGetMemoryHostPointerPropertiesEXT =
-        PFN_vkGetMemoryHostPointerPropertiesEXT( vkGetDeviceProcAddr( device, "vkGetMemoryHostPointerPropertiesEXT" ) );
-      vkGetMemoryRemoteAddressNV =
-        PFN_vkGetMemoryRemoteAddressNV( vkGetDeviceProcAddr( device, "vkGetMemoryRemoteAddressNV" ) );
-#if defined( VK_USE_PLATFORM_WIN32_KHR )
-      vkGetMemoryWin32HandleKHR =
-        PFN_vkGetMemoryWin32HandleKHR( vkGetDeviceProcAddr( device, "vkGetMemoryWin32HandleKHR" ) );
-#endif /*VK_USE_PLATFORM_WIN32_KHR*/
-#if defined( VK_USE_PLATFORM_WIN32_KHR )
-      vkGetMemoryWin32HandleNV =
-        PFN_vkGetMemoryWin32HandleNV( vkGetDeviceProcAddr( device, "vkGetMemoryWin32HandleNV" ) );
-#endif /*VK_USE_PLATFORM_WIN32_KHR*/
-#if defined( VK_USE_PLATFORM_WIN32_KHR )
-      vkGetMemoryWin32HandlePropertiesKHR =
-        PFN_vkGetMemoryWin32HandlePropertiesKHR( vkGetDeviceProcAddr( device, "vkGetMemoryWin32HandlePropertiesKHR" ) );
-#endif /*VK_USE_PLATFORM_WIN32_KHR*/
-#if defined( VK_USE_PLATFORM_FUCHSIA )
-      vkGetMemoryZirconHandleFUCHSIA =
-        PFN_vkGetMemoryZirconHandleFUCHSIA( vkGetDeviceProcAddr( device, "vkGetMemoryZirconHandleFUCHSIA" ) );
-#endif /*VK_USE_PLATFORM_FUCHSIA*/
-#if defined( VK_USE_PLATFORM_FUCHSIA )
-      vkGetMemoryZirconHandlePropertiesFUCHSIA = PFN_vkGetMemoryZirconHandlePropertiesFUCHSIA(
-        vkGetDeviceProcAddr( device, "vkGetMemoryZirconHandlePropertiesFUCHSIA" ) );
-#endif /*VK_USE_PLATFORM_FUCHSIA*/
-      vkGetPastPresentationTimingGOOGLE =
-        PFN_vkGetPastPresentationTimingGOOGLE( vkGetDeviceProcAddr( device, "vkGetPastPresentationTimingGOOGLE" ) );
-      vkGetPerformanceParameterINTEL =
-        PFN_vkGetPerformanceParameterINTEL( vkGetDeviceProcAddr( device, "vkGetPerformanceParameterINTEL" ) );
-      vkGetPipelineCacheData = PFN_vkGetPipelineCacheData( vkGetDeviceProcAddr( device, "vkGetPipelineCacheData" ) );
-      vkGetPipelineExecutableInternalRepresentationsKHR = PFN_vkGetPipelineExecutableInternalRepresentationsKHR(
-        vkGetDeviceProcAddr( device, "vkGetPipelineExecutableInternalRepresentationsKHR" ) );
-      vkGetPipelineExecutablePropertiesKHR = PFN_vkGetPipelineExecutablePropertiesKHR(
-        vkGetDeviceProcAddr( device, "vkGetPipelineExecutablePropertiesKHR" ) );
-      vkGetPipelineExecutableStatisticsKHR = PFN_vkGetPipelineExecutableStatisticsKHR(
-        vkGetDeviceProcAddr( device, "vkGetPipelineExecutableStatisticsKHR" ) );
-      vkGetPrivateDataEXT   = PFN_vkGetPrivateDataEXT( vkGetDeviceProcAddr( device, "vkGetPrivateDataEXT" ) );
-      vkGetQueryPoolResults = PFN_vkGetQueryPoolResults( vkGetDeviceProcAddr( device, "vkGetQueryPoolResults" ) );
-      vkGetQueueCheckpointData2NV =
-        PFN_vkGetQueueCheckpointData2NV( vkGetDeviceProcAddr( device, "vkGetQueueCheckpointData2NV" ) );
-      vkGetQueueCheckpointDataNV =
-        PFN_vkGetQueueCheckpointDataNV( vkGetDeviceProcAddr( device, "vkGetQueueCheckpointDataNV" ) );
-      vkGetRayTracingCaptureReplayShaderGroupHandlesKHR = PFN_vkGetRayTracingCaptureReplayShaderGroupHandlesKHR(
-        vkGetDeviceProcAddr( device, "vkGetRayTracingCaptureReplayShaderGroupHandlesKHR" ) );
-      vkGetRayTracingShaderGroupHandlesKHR = PFN_vkGetRayTracingShaderGroupHandlesKHR(
-        vkGetDeviceProcAddr( device, "vkGetRayTracingShaderGroupHandlesKHR" ) );
+
+      //=== VK_EXT_validation_cache ===
+      vkCreateValidationCacheEXT =
+        PFN_vkCreateValidationCacheEXT( vkGetDeviceProcAddr( device, "vkCreateValidationCacheEXT" ) );
+      vkDestroyValidationCacheEXT =
+        PFN_vkDestroyValidationCacheEXT( vkGetDeviceProcAddr( device, "vkDestroyValidationCacheEXT" ) );
+      vkMergeValidationCachesEXT =
+        PFN_vkMergeValidationCachesEXT( vkGetDeviceProcAddr( device, "vkMergeValidationCachesEXT" ) );
+      vkGetValidationCacheDataEXT =
+        PFN_vkGetValidationCacheDataEXT( vkGetDeviceProcAddr( device, "vkGetValidationCacheDataEXT" ) );
+
+      //=== VK_NV_shading_rate_image ===
+      vkCmdBindShadingRateImageNV =
+        PFN_vkCmdBindShadingRateImageNV( vkGetDeviceProcAddr( device, "vkCmdBindShadingRateImageNV" ) );
+      vkCmdSetViewportShadingRatePaletteNV = PFN_vkCmdSetViewportShadingRatePaletteNV(
+        vkGetDeviceProcAddr( device, "vkCmdSetViewportShadingRatePaletteNV" ) );
+      vkCmdSetCoarseSampleOrderNV =
+        PFN_vkCmdSetCoarseSampleOrderNV( vkGetDeviceProcAddr( device, "vkCmdSetCoarseSampleOrderNV" ) );
+
+      //=== VK_NV_ray_tracing ===
+      vkCreateAccelerationStructureNV =
+        PFN_vkCreateAccelerationStructureNV( vkGetDeviceProcAddr( device, "vkCreateAccelerationStructureNV" ) );
+      vkDestroyAccelerationStructureNV =
+        PFN_vkDestroyAccelerationStructureNV( vkGetDeviceProcAddr( device, "vkDestroyAccelerationStructureNV" ) );
+      vkGetAccelerationStructureMemoryRequirementsNV = PFN_vkGetAccelerationStructureMemoryRequirementsNV(
+        vkGetDeviceProcAddr( device, "vkGetAccelerationStructureMemoryRequirementsNV" ) );
+      vkBindAccelerationStructureMemoryNV =
+        PFN_vkBindAccelerationStructureMemoryNV( vkGetDeviceProcAddr( device, "vkBindAccelerationStructureMemoryNV" ) );
+      vkCmdBuildAccelerationStructureNV =
+        PFN_vkCmdBuildAccelerationStructureNV( vkGetDeviceProcAddr( device, "vkCmdBuildAccelerationStructureNV" ) );
+      vkCmdCopyAccelerationStructureNV =
+        PFN_vkCmdCopyAccelerationStructureNV( vkGetDeviceProcAddr( device, "vkCmdCopyAccelerationStructureNV" ) );
+      vkCmdTraceRaysNV = PFN_vkCmdTraceRaysNV( vkGetDeviceProcAddr( device, "vkCmdTraceRaysNV" ) );
+      vkCreateRayTracingPipelinesNV =
+        PFN_vkCreateRayTracingPipelinesNV( vkGetDeviceProcAddr( device, "vkCreateRayTracingPipelinesNV" ) );
       vkGetRayTracingShaderGroupHandlesNV =
         PFN_vkGetRayTracingShaderGroupHandlesNV( vkGetDeviceProcAddr( device, "vkGetRayTracingShaderGroupHandlesNV" ) );
       if ( !vkGetRayTracingShaderGroupHandlesKHR )
         vkGetRayTracingShaderGroupHandlesKHR = vkGetRayTracingShaderGroupHandlesNV;
-      vkGetRayTracingShaderGroupStackSizeKHR = PFN_vkGetRayTracingShaderGroupStackSizeKHR(
-        vkGetDeviceProcAddr( device, "vkGetRayTracingShaderGroupStackSizeKHR" ) );
-      vkGetRefreshCycleDurationGOOGLE =
-        PFN_vkGetRefreshCycleDurationGOOGLE( vkGetDeviceProcAddr( device, "vkGetRefreshCycleDurationGOOGLE" ) );
-      vkGetRenderAreaGranularity =
-        PFN_vkGetRenderAreaGranularity( vkGetDeviceProcAddr( device, "vkGetRenderAreaGranularity" ) );
-      vkGetSemaphoreCounterValue =
-        PFN_vkGetSemaphoreCounterValue( vkGetDeviceProcAddr( device, "vkGetSemaphoreCounterValue" ) );
+      vkGetAccelerationStructureHandleNV =
+        PFN_vkGetAccelerationStructureHandleNV( vkGetDeviceProcAddr( device, "vkGetAccelerationStructureHandleNV" ) );
+      vkCmdWriteAccelerationStructuresPropertiesNV = PFN_vkCmdWriteAccelerationStructuresPropertiesNV(
+        vkGetDeviceProcAddr( device, "vkCmdWriteAccelerationStructuresPropertiesNV" ) );
+      vkCompileDeferredNV = PFN_vkCompileDeferredNV( vkGetDeviceProcAddr( device, "vkCompileDeferredNV" ) );
+
+      //=== VK_KHR_maintenance3 ===
+      vkGetDescriptorSetLayoutSupportKHR =
+        PFN_vkGetDescriptorSetLayoutSupportKHR( vkGetDeviceProcAddr( device, "vkGetDescriptorSetLayoutSupportKHR" ) );
+      if ( !vkGetDescriptorSetLayoutSupport )
+        vkGetDescriptorSetLayoutSupport = vkGetDescriptorSetLayoutSupportKHR;
+
+      //=== VK_KHR_draw_indirect_count ===
+      vkCmdDrawIndirectCountKHR =
+        PFN_vkCmdDrawIndirectCountKHR( vkGetDeviceProcAddr( device, "vkCmdDrawIndirectCountKHR" ) );
+      if ( !vkCmdDrawIndirectCount )
+        vkCmdDrawIndirectCount = vkCmdDrawIndirectCountKHR;
+      vkCmdDrawIndexedIndirectCountKHR =
+        PFN_vkCmdDrawIndexedIndirectCountKHR( vkGetDeviceProcAddr( device, "vkCmdDrawIndexedIndirectCountKHR" ) );
+      if ( !vkCmdDrawIndexedIndirectCount )
+        vkCmdDrawIndexedIndirectCount = vkCmdDrawIndexedIndirectCountKHR;
+
+      //=== VK_EXT_external_memory_host ===
+      vkGetMemoryHostPointerPropertiesEXT =
+        PFN_vkGetMemoryHostPointerPropertiesEXT( vkGetDeviceProcAddr( device, "vkGetMemoryHostPointerPropertiesEXT" ) );
+
+      //=== VK_AMD_buffer_marker ===
+      vkCmdWriteBufferMarkerAMD =
+        PFN_vkCmdWriteBufferMarkerAMD( vkGetDeviceProcAddr( device, "vkCmdWriteBufferMarkerAMD" ) );
+
+      //=== VK_EXT_calibrated_timestamps ===
+      vkGetCalibratedTimestampsEXT =
+        PFN_vkGetCalibratedTimestampsEXT( vkGetDeviceProcAddr( device, "vkGetCalibratedTimestampsEXT" ) );
+
+      //=== VK_NV_mesh_shader ===
+      vkCmdDrawMeshTasksNV = PFN_vkCmdDrawMeshTasksNV( vkGetDeviceProcAddr( device, "vkCmdDrawMeshTasksNV" ) );
+      vkCmdDrawMeshTasksIndirectNV =
+        PFN_vkCmdDrawMeshTasksIndirectNV( vkGetDeviceProcAddr( device, "vkCmdDrawMeshTasksIndirectNV" ) );
+      vkCmdDrawMeshTasksIndirectCountNV =
+        PFN_vkCmdDrawMeshTasksIndirectCountNV( vkGetDeviceProcAddr( device, "vkCmdDrawMeshTasksIndirectCountNV" ) );
+
+      //=== VK_NV_scissor_exclusive ===
+      vkCmdSetExclusiveScissorNV =
+        PFN_vkCmdSetExclusiveScissorNV( vkGetDeviceProcAddr( device, "vkCmdSetExclusiveScissorNV" ) );
+
+      //=== VK_NV_device_diagnostic_checkpoints ===
+      vkCmdSetCheckpointNV = PFN_vkCmdSetCheckpointNV( vkGetDeviceProcAddr( device, "vkCmdSetCheckpointNV" ) );
+      vkGetQueueCheckpointDataNV =
+        PFN_vkGetQueueCheckpointDataNV( vkGetDeviceProcAddr( device, "vkGetQueueCheckpointDataNV" ) );
+
+      //=== VK_KHR_timeline_semaphore ===
       vkGetSemaphoreCounterValueKHR =
         PFN_vkGetSemaphoreCounterValueKHR( vkGetDeviceProcAddr( device, "vkGetSemaphoreCounterValueKHR" ) );
       if ( !vkGetSemaphoreCounterValue )
         vkGetSemaphoreCounterValue = vkGetSemaphoreCounterValueKHR;
-      vkGetSemaphoreFdKHR = PFN_vkGetSemaphoreFdKHR( vkGetDeviceProcAddr( device, "vkGetSemaphoreFdKHR" ) );
-#if defined( VK_USE_PLATFORM_WIN32_KHR )
-      vkGetSemaphoreWin32HandleKHR =
-        PFN_vkGetSemaphoreWin32HandleKHR( vkGetDeviceProcAddr( device, "vkGetSemaphoreWin32HandleKHR" ) );
-#endif /*VK_USE_PLATFORM_WIN32_KHR*/
-#if defined( VK_USE_PLATFORM_FUCHSIA )
-      vkGetSemaphoreZirconHandleFUCHSIA =
-        PFN_vkGetSemaphoreZirconHandleFUCHSIA( vkGetDeviceProcAddr( device, "vkGetSemaphoreZirconHandleFUCHSIA" ) );
-#endif /*VK_USE_PLATFORM_FUCHSIA*/
-      vkGetShaderInfoAMD = PFN_vkGetShaderInfoAMD( vkGetDeviceProcAddr( device, "vkGetShaderInfoAMD" ) );
-      vkGetSwapchainCounterEXT =
-        PFN_vkGetSwapchainCounterEXT( vkGetDeviceProcAddr( device, "vkGetSwapchainCounterEXT" ) );
-      vkGetSwapchainImagesKHR = PFN_vkGetSwapchainImagesKHR( vkGetDeviceProcAddr( device, "vkGetSwapchainImagesKHR" ) );
-      vkGetSwapchainStatusKHR = PFN_vkGetSwapchainStatusKHR( vkGetDeviceProcAddr( device, "vkGetSwapchainStatusKHR" ) );
-      vkGetValidationCacheDataEXT =
-        PFN_vkGetValidationCacheDataEXT( vkGetDeviceProcAddr( device, "vkGetValidationCacheDataEXT" ) );
-#if defined( VK_ENABLE_BETA_EXTENSIONS )
-      vkGetVideoSessionMemoryRequirementsKHR = PFN_vkGetVideoSessionMemoryRequirementsKHR(
-        vkGetDeviceProcAddr( device, "vkGetVideoSessionMemoryRequirementsKHR" ) );
-#endif /*VK_ENABLE_BETA_EXTENSIONS*/
-      vkImportFenceFdKHR = PFN_vkImportFenceFdKHR( vkGetDeviceProcAddr( device, "vkImportFenceFdKHR" ) );
-#if defined( VK_USE_PLATFORM_WIN32_KHR )
-      vkImportFenceWin32HandleKHR =
-        PFN_vkImportFenceWin32HandleKHR( vkGetDeviceProcAddr( device, "vkImportFenceWin32HandleKHR" ) );
-#endif /*VK_USE_PLATFORM_WIN32_KHR*/
-      vkImportSemaphoreFdKHR = PFN_vkImportSemaphoreFdKHR( vkGetDeviceProcAddr( device, "vkImportSemaphoreFdKHR" ) );
-#if defined( VK_USE_PLATFORM_WIN32_KHR )
-      vkImportSemaphoreWin32HandleKHR =
-        PFN_vkImportSemaphoreWin32HandleKHR( vkGetDeviceProcAddr( device, "vkImportSemaphoreWin32HandleKHR" ) );
-#endif /*VK_USE_PLATFORM_WIN32_KHR*/
-#if defined( VK_USE_PLATFORM_FUCHSIA )
-      vkImportSemaphoreZirconHandleFUCHSIA = PFN_vkImportSemaphoreZirconHandleFUCHSIA(
-        vkGetDeviceProcAddr( device, "vkImportSemaphoreZirconHandleFUCHSIA" ) );
-#endif /*VK_USE_PLATFORM_FUCHSIA*/
-      vkInitializePerformanceApiINTEL =
-        PFN_vkInitializePerformanceApiINTEL( vkGetDeviceProcAddr( device, "vkInitializePerformanceApiINTEL" ) );
-      vkInvalidateMappedMemoryRanges =
-        PFN_vkInvalidateMappedMemoryRanges( vkGetDeviceProcAddr( device, "vkInvalidateMappedMemoryRanges" ) );
-      vkMapMemory           = PFN_vkMapMemory( vkGetDeviceProcAddr( device, "vkMapMemory" ) );
-      vkMergePipelineCaches = PFN_vkMergePipelineCaches( vkGetDeviceProcAddr( device, "vkMergePipelineCaches" ) );
-      vkMergeValidationCachesEXT =
-        PFN_vkMergeValidationCachesEXT( vkGetDeviceProcAddr( device, "vkMergeValidationCachesEXT" ) );
-      vkQueueBeginDebugUtilsLabelEXT =
-        PFN_vkQueueBeginDebugUtilsLabelEXT( vkGetDeviceProcAddr( device, "vkQueueBeginDebugUtilsLabelEXT" ) );
-      vkQueueBindSparse = PFN_vkQueueBindSparse( vkGetDeviceProcAddr( device, "vkQueueBindSparse" ) );
-      vkQueueEndDebugUtilsLabelEXT =
-        PFN_vkQueueEndDebugUtilsLabelEXT( vkGetDeviceProcAddr( device, "vkQueueEndDebugUtilsLabelEXT" ) );
-      vkQueueInsertDebugUtilsLabelEXT =
-        PFN_vkQueueInsertDebugUtilsLabelEXT( vkGetDeviceProcAddr( device, "vkQueueInsertDebugUtilsLabelEXT" ) );
-      vkQueuePresentKHR = PFN_vkQueuePresentKHR( vkGetDeviceProcAddr( device, "vkQueuePresentKHR" ) );
-      vkQueueSetPerformanceConfigurationINTEL = PFN_vkQueueSetPerformanceConfigurationINTEL(
-        vkGetDeviceProcAddr( device, "vkQueueSetPerformanceConfigurationINTEL" ) );
-      vkQueueSubmit     = PFN_vkQueueSubmit( vkGetDeviceProcAddr( device, "vkQueueSubmit" ) );
-      vkQueueSubmit2KHR = PFN_vkQueueSubmit2KHR( vkGetDeviceProcAddr( device, "vkQueueSubmit2KHR" ) );
-      vkQueueWaitIdle   = PFN_vkQueueWaitIdle( vkGetDeviceProcAddr( device, "vkQueueWaitIdle" ) );
-      vkRegisterDeviceEventEXT =
-        PFN_vkRegisterDeviceEventEXT( vkGetDeviceProcAddr( device, "vkRegisterDeviceEventEXT" ) );
-      vkRegisterDisplayEventEXT =
-        PFN_vkRegisterDisplayEventEXT( vkGetDeviceProcAddr( device, "vkRegisterDisplayEventEXT" ) );
-#if defined( VK_USE_PLATFORM_WIN32_KHR )
-      vkReleaseFullScreenExclusiveModeEXT =
-        PFN_vkReleaseFullScreenExclusiveModeEXT( vkGetDeviceProcAddr( device, "vkReleaseFullScreenExclusiveModeEXT" ) );
-#endif /*VK_USE_PLATFORM_WIN32_KHR*/
-      vkReleasePerformanceConfigurationINTEL = PFN_vkReleasePerformanceConfigurationINTEL(
-        vkGetDeviceProcAddr( device, "vkReleasePerformanceConfigurationINTEL" ) );
-      vkReleaseProfilingLockKHR =
-        PFN_vkReleaseProfilingLockKHR( vkGetDeviceProcAddr( device, "vkReleaseProfilingLockKHR" ) );
-      vkResetCommandBuffer  = PFN_vkResetCommandBuffer( vkGetDeviceProcAddr( device, "vkResetCommandBuffer" ) );
-      vkResetCommandPool    = PFN_vkResetCommandPool( vkGetDeviceProcAddr( device, "vkResetCommandPool" ) );
-      vkResetDescriptorPool = PFN_vkResetDescriptorPool( vkGetDeviceProcAddr( device, "vkResetDescriptorPool" ) );
-      vkResetEvent          = PFN_vkResetEvent( vkGetDeviceProcAddr( device, "vkResetEvent" ) );
-      vkResetFences         = PFN_vkResetFences( vkGetDeviceProcAddr( device, "vkResetFences" ) );
-      vkResetQueryPool      = PFN_vkResetQueryPool( vkGetDeviceProcAddr( device, "vkResetQueryPool" ) );
-      vkResetQueryPoolEXT   = PFN_vkResetQueryPoolEXT( vkGetDeviceProcAddr( device, "vkResetQueryPoolEXT" ) );
-      if ( !vkResetQueryPool )
-        vkResetQueryPool = vkResetQueryPoolEXT;
-      vkSetDebugUtilsObjectNameEXT =
-        PFN_vkSetDebugUtilsObjectNameEXT( vkGetDeviceProcAddr( device, "vkSetDebugUtilsObjectNameEXT" ) );
-      vkSetDebugUtilsObjectTagEXT =
-        PFN_vkSetDebugUtilsObjectTagEXT( vkGetDeviceProcAddr( device, "vkSetDebugUtilsObjectTagEXT" ) );
-      vkSetEvent           = PFN_vkSetEvent( vkGetDeviceProcAddr( device, "vkSetEvent" ) );
-      vkSetHdrMetadataEXT  = PFN_vkSetHdrMetadataEXT( vkGetDeviceProcAddr( device, "vkSetHdrMetadataEXT" ) );
-      vkSetLocalDimmingAMD = PFN_vkSetLocalDimmingAMD( vkGetDeviceProcAddr( device, "vkSetLocalDimmingAMD" ) );
-      vkSetPrivateDataEXT  = PFN_vkSetPrivateDataEXT( vkGetDeviceProcAddr( device, "vkSetPrivateDataEXT" ) );
-      vkSignalSemaphore    = PFN_vkSignalSemaphore( vkGetDeviceProcAddr( device, "vkSignalSemaphore" ) );
-      vkSignalSemaphoreKHR = PFN_vkSignalSemaphoreKHR( vkGetDeviceProcAddr( device, "vkSignalSemaphoreKHR" ) );
-      if ( !vkSignalSemaphore )
-        vkSignalSemaphore = vkSignalSemaphoreKHR;
-      vkTrimCommandPool    = PFN_vkTrimCommandPool( vkGetDeviceProcAddr( device, "vkTrimCommandPool" ) );
-      vkTrimCommandPoolKHR = PFN_vkTrimCommandPoolKHR( vkGetDeviceProcAddr( device, "vkTrimCommandPoolKHR" ) );
-      if ( !vkTrimCommandPool )
-        vkTrimCommandPool = vkTrimCommandPoolKHR;
-      vkUninitializePerformanceApiINTEL =
-        PFN_vkUninitializePerformanceApiINTEL( vkGetDeviceProcAddr( device, "vkUninitializePerformanceApiINTEL" ) );
-      vkUnmapMemory = PFN_vkUnmapMemory( vkGetDeviceProcAddr( device, "vkUnmapMemory" ) );
-      vkUpdateDescriptorSetWithTemplate =
-        PFN_vkUpdateDescriptorSetWithTemplate( vkGetDeviceProcAddr( device, "vkUpdateDescriptorSetWithTemplate" ) );
-      vkUpdateDescriptorSetWithTemplateKHR = PFN_vkUpdateDescriptorSetWithTemplateKHR(
-        vkGetDeviceProcAddr( device, "vkUpdateDescriptorSetWithTemplateKHR" ) );
-      if ( !vkUpdateDescriptorSetWithTemplate )
-        vkUpdateDescriptorSetWithTemplate = vkUpdateDescriptorSetWithTemplateKHR;
-      vkUpdateDescriptorSets = PFN_vkUpdateDescriptorSets( vkGetDeviceProcAddr( device, "vkUpdateDescriptorSets" ) );
-#if defined( VK_ENABLE_BETA_EXTENSIONS )
-      vkUpdateVideoSessionParametersKHR =
-        PFN_vkUpdateVideoSessionParametersKHR( vkGetDeviceProcAddr( device, "vkUpdateVideoSessionParametersKHR" ) );
-#endif /*VK_ENABLE_BETA_EXTENSIONS*/
-      vkWaitForFences     = PFN_vkWaitForFences( vkGetDeviceProcAddr( device, "vkWaitForFences" ) );
-      vkWaitSemaphores    = PFN_vkWaitSemaphores( vkGetDeviceProcAddr( device, "vkWaitSemaphores" ) );
       vkWaitSemaphoresKHR = PFN_vkWaitSemaphoresKHR( vkGetDeviceProcAddr( device, "vkWaitSemaphoresKHR" ) );
       if ( !vkWaitSemaphores )
         vkWaitSemaphores = vkWaitSemaphoresKHR;
-      vkWriteAccelerationStructuresPropertiesKHR = PFN_vkWriteAccelerationStructuresPropertiesKHR(
-        vkGetDeviceProcAddr( device, "vkWriteAccelerationStructuresPropertiesKHR" ) );
+      vkSignalSemaphoreKHR = PFN_vkSignalSemaphoreKHR( vkGetDeviceProcAddr( device, "vkSignalSemaphoreKHR" ) );
+      if ( !vkSignalSemaphore )
+        vkSignalSemaphore = vkSignalSemaphoreKHR;
+
+      //=== VK_INTEL_performance_query ===
+      vkInitializePerformanceApiINTEL =
+        PFN_vkInitializePerformanceApiINTEL( vkGetDeviceProcAddr( device, "vkInitializePerformanceApiINTEL" ) );
+      vkUninitializePerformanceApiINTEL =
+        PFN_vkUninitializePerformanceApiINTEL( vkGetDeviceProcAddr( device, "vkUninitializePerformanceApiINTEL" ) );
+      vkCmdSetPerformanceMarkerINTEL =
+        PFN_vkCmdSetPerformanceMarkerINTEL( vkGetDeviceProcAddr( device, "vkCmdSetPerformanceMarkerINTEL" ) );
+      vkCmdSetPerformanceStreamMarkerINTEL = PFN_vkCmdSetPerformanceStreamMarkerINTEL(
+        vkGetDeviceProcAddr( device, "vkCmdSetPerformanceStreamMarkerINTEL" ) );
+      vkCmdSetPerformanceOverrideINTEL =
+        PFN_vkCmdSetPerformanceOverrideINTEL( vkGetDeviceProcAddr( device, "vkCmdSetPerformanceOverrideINTEL" ) );
+      vkAcquirePerformanceConfigurationINTEL = PFN_vkAcquirePerformanceConfigurationINTEL(
+        vkGetDeviceProcAddr( device, "vkAcquirePerformanceConfigurationINTEL" ) );
+      vkReleasePerformanceConfigurationINTEL = PFN_vkReleasePerformanceConfigurationINTEL(
+        vkGetDeviceProcAddr( device, "vkReleasePerformanceConfigurationINTEL" ) );
+      vkQueueSetPerformanceConfigurationINTEL = PFN_vkQueueSetPerformanceConfigurationINTEL(
+        vkGetDeviceProcAddr( device, "vkQueueSetPerformanceConfigurationINTEL" ) );
+      vkGetPerformanceParameterINTEL =
+        PFN_vkGetPerformanceParameterINTEL( vkGetDeviceProcAddr( device, "vkGetPerformanceParameterINTEL" ) );
+
+      //=== VK_AMD_display_native_hdr ===
+      vkSetLocalDimmingAMD = PFN_vkSetLocalDimmingAMD( vkGetDeviceProcAddr( device, "vkSetLocalDimmingAMD" ) );
+
+      //=== VK_KHR_fragment_shading_rate ===
+      vkCmdSetFragmentShadingRateKHR =
+        PFN_vkCmdSetFragmentShadingRateKHR( vkGetDeviceProcAddr( device, "vkCmdSetFragmentShadingRateKHR" ) );
+
+      //=== VK_EXT_buffer_device_address ===
+      vkGetBufferDeviceAddressEXT =
+        PFN_vkGetBufferDeviceAddressEXT( vkGetDeviceProcAddr( device, "vkGetBufferDeviceAddressEXT" ) );
+      if ( !vkGetBufferDeviceAddress )
+        vkGetBufferDeviceAddress = vkGetBufferDeviceAddressEXT;
+
+      //=== VK_KHR_present_wait ===
+      vkWaitForPresentKHR = PFN_vkWaitForPresentKHR( vkGetDeviceProcAddr( device, "vkWaitForPresentKHR" ) );
+
+#if defined( VK_USE_PLATFORM_WIN32_KHR )
+      //=== VK_EXT_full_screen_exclusive ===
+      vkAcquireFullScreenExclusiveModeEXT =
+        PFN_vkAcquireFullScreenExclusiveModeEXT( vkGetDeviceProcAddr( device, "vkAcquireFullScreenExclusiveModeEXT" ) );
+      vkReleaseFullScreenExclusiveModeEXT =
+        PFN_vkReleaseFullScreenExclusiveModeEXT( vkGetDeviceProcAddr( device, "vkReleaseFullScreenExclusiveModeEXT" ) );
+      vkGetDeviceGroupSurfacePresentModes2EXT = PFN_vkGetDeviceGroupSurfacePresentModes2EXT(
+        vkGetDeviceProcAddr( device, "vkGetDeviceGroupSurfacePresentModes2EXT" ) );
+#endif /*VK_USE_PLATFORM_WIN32_KHR*/
+
+      //=== VK_KHR_buffer_device_address ===
+      vkGetBufferDeviceAddressKHR =
+        PFN_vkGetBufferDeviceAddressKHR( vkGetDeviceProcAddr( device, "vkGetBufferDeviceAddressKHR" ) );
+      if ( !vkGetBufferDeviceAddress )
+        vkGetBufferDeviceAddress = vkGetBufferDeviceAddressKHR;
+      vkGetBufferOpaqueCaptureAddressKHR =
+        PFN_vkGetBufferOpaqueCaptureAddressKHR( vkGetDeviceProcAddr( device, "vkGetBufferOpaqueCaptureAddressKHR" ) );
+      if ( !vkGetBufferOpaqueCaptureAddress )
+        vkGetBufferOpaqueCaptureAddress = vkGetBufferOpaqueCaptureAddressKHR;
+      vkGetDeviceMemoryOpaqueCaptureAddressKHR = PFN_vkGetDeviceMemoryOpaqueCaptureAddressKHR(
+        vkGetDeviceProcAddr( device, "vkGetDeviceMemoryOpaqueCaptureAddressKHR" ) );
+      if ( !vkGetDeviceMemoryOpaqueCaptureAddress )
+        vkGetDeviceMemoryOpaqueCaptureAddress = vkGetDeviceMemoryOpaqueCaptureAddressKHR;
+
+      //=== VK_EXT_line_rasterization ===
+      vkCmdSetLineStippleEXT = PFN_vkCmdSetLineStippleEXT( vkGetDeviceProcAddr( device, "vkCmdSetLineStippleEXT" ) );
+
+      //=== VK_EXT_host_query_reset ===
+      vkResetQueryPoolEXT = PFN_vkResetQueryPoolEXT( vkGetDeviceProcAddr( device, "vkResetQueryPoolEXT" ) );
+      if ( !vkResetQueryPool )
+        vkResetQueryPool = vkResetQueryPoolEXT;
+
+      //=== VK_EXT_extended_dynamic_state ===
+      vkCmdSetCullModeEXT  = PFN_vkCmdSetCullModeEXT( vkGetDeviceProcAddr( device, "vkCmdSetCullModeEXT" ) );
+      vkCmdSetFrontFaceEXT = PFN_vkCmdSetFrontFaceEXT( vkGetDeviceProcAddr( device, "vkCmdSetFrontFaceEXT" ) );
+      vkCmdSetPrimitiveTopologyEXT =
+        PFN_vkCmdSetPrimitiveTopologyEXT( vkGetDeviceProcAddr( device, "vkCmdSetPrimitiveTopologyEXT" ) );
+      vkCmdSetViewportWithCountEXT =
+        PFN_vkCmdSetViewportWithCountEXT( vkGetDeviceProcAddr( device, "vkCmdSetViewportWithCountEXT" ) );
+      vkCmdSetScissorWithCountEXT =
+        PFN_vkCmdSetScissorWithCountEXT( vkGetDeviceProcAddr( device, "vkCmdSetScissorWithCountEXT" ) );
+      vkCmdBindVertexBuffers2EXT =
+        PFN_vkCmdBindVertexBuffers2EXT( vkGetDeviceProcAddr( device, "vkCmdBindVertexBuffers2EXT" ) );
+      vkCmdSetDepthTestEnableEXT =
+        PFN_vkCmdSetDepthTestEnableEXT( vkGetDeviceProcAddr( device, "vkCmdSetDepthTestEnableEXT" ) );
+      vkCmdSetDepthWriteEnableEXT =
+        PFN_vkCmdSetDepthWriteEnableEXT( vkGetDeviceProcAddr( device, "vkCmdSetDepthWriteEnableEXT" ) );
+      vkCmdSetDepthCompareOpEXT =
+        PFN_vkCmdSetDepthCompareOpEXT( vkGetDeviceProcAddr( device, "vkCmdSetDepthCompareOpEXT" ) );
+      vkCmdSetDepthBoundsTestEnableEXT =
+        PFN_vkCmdSetDepthBoundsTestEnableEXT( vkGetDeviceProcAddr( device, "vkCmdSetDepthBoundsTestEnableEXT" ) );
+      vkCmdSetStencilTestEnableEXT =
+        PFN_vkCmdSetStencilTestEnableEXT( vkGetDeviceProcAddr( device, "vkCmdSetStencilTestEnableEXT" ) );
+      vkCmdSetStencilOpEXT = PFN_vkCmdSetStencilOpEXT( vkGetDeviceProcAddr( device, "vkCmdSetStencilOpEXT" ) );
+
+      //=== VK_KHR_deferred_host_operations ===
+      vkCreateDeferredOperationKHR =
+        PFN_vkCreateDeferredOperationKHR( vkGetDeviceProcAddr( device, "vkCreateDeferredOperationKHR" ) );
+      vkDestroyDeferredOperationKHR =
+        PFN_vkDestroyDeferredOperationKHR( vkGetDeviceProcAddr( device, "vkDestroyDeferredOperationKHR" ) );
+      vkGetDeferredOperationMaxConcurrencyKHR = PFN_vkGetDeferredOperationMaxConcurrencyKHR(
+        vkGetDeviceProcAddr( device, "vkGetDeferredOperationMaxConcurrencyKHR" ) );
+      vkGetDeferredOperationResultKHR =
+        PFN_vkGetDeferredOperationResultKHR( vkGetDeviceProcAddr( device, "vkGetDeferredOperationResultKHR" ) );
+      vkDeferredOperationJoinKHR =
+        PFN_vkDeferredOperationJoinKHR( vkGetDeviceProcAddr( device, "vkDeferredOperationJoinKHR" ) );
+
+      //=== VK_KHR_pipeline_executable_properties ===
+      vkGetPipelineExecutablePropertiesKHR = PFN_vkGetPipelineExecutablePropertiesKHR(
+        vkGetDeviceProcAddr( device, "vkGetPipelineExecutablePropertiesKHR" ) );
+      vkGetPipelineExecutableStatisticsKHR = PFN_vkGetPipelineExecutableStatisticsKHR(
+        vkGetDeviceProcAddr( device, "vkGetPipelineExecutableStatisticsKHR" ) );
+      vkGetPipelineExecutableInternalRepresentationsKHR = PFN_vkGetPipelineExecutableInternalRepresentationsKHR(
+        vkGetDeviceProcAddr( device, "vkGetPipelineExecutableInternalRepresentationsKHR" ) );
+
+      //=== VK_NV_device_generated_commands ===
+      vkGetGeneratedCommandsMemoryRequirementsNV = PFN_vkGetGeneratedCommandsMemoryRequirementsNV(
+        vkGetDeviceProcAddr( device, "vkGetGeneratedCommandsMemoryRequirementsNV" ) );
+      vkCmdPreprocessGeneratedCommandsNV =
+        PFN_vkCmdPreprocessGeneratedCommandsNV( vkGetDeviceProcAddr( device, "vkCmdPreprocessGeneratedCommandsNV" ) );
+      vkCmdExecuteGeneratedCommandsNV =
+        PFN_vkCmdExecuteGeneratedCommandsNV( vkGetDeviceProcAddr( device, "vkCmdExecuteGeneratedCommandsNV" ) );
+      vkCmdBindPipelineShaderGroupNV =
+        PFN_vkCmdBindPipelineShaderGroupNV( vkGetDeviceProcAddr( device, "vkCmdBindPipelineShaderGroupNV" ) );
+      vkCreateIndirectCommandsLayoutNV =
+        PFN_vkCreateIndirectCommandsLayoutNV( vkGetDeviceProcAddr( device, "vkCreateIndirectCommandsLayoutNV" ) );
+      vkDestroyIndirectCommandsLayoutNV =
+        PFN_vkDestroyIndirectCommandsLayoutNV( vkGetDeviceProcAddr( device, "vkDestroyIndirectCommandsLayoutNV" ) );
+
+      //=== VK_EXT_private_data ===
+      vkCreatePrivateDataSlotEXT =
+        PFN_vkCreatePrivateDataSlotEXT( vkGetDeviceProcAddr( device, "vkCreatePrivateDataSlotEXT" ) );
+      vkDestroyPrivateDataSlotEXT =
+        PFN_vkDestroyPrivateDataSlotEXT( vkGetDeviceProcAddr( device, "vkDestroyPrivateDataSlotEXT" ) );
+      vkSetPrivateDataEXT = PFN_vkSetPrivateDataEXT( vkGetDeviceProcAddr( device, "vkSetPrivateDataEXT" ) );
+      vkGetPrivateDataEXT = PFN_vkGetPrivateDataEXT( vkGetDeviceProcAddr( device, "vkGetPrivateDataEXT" ) );
+
+#if defined( VK_ENABLE_BETA_EXTENSIONS )
+      //=== VK_KHR_video_encode_queue ===
+      vkCmdEncodeVideoKHR = PFN_vkCmdEncodeVideoKHR( vkGetDeviceProcAddr( device, "vkCmdEncodeVideoKHR" ) );
+#endif /*VK_ENABLE_BETA_EXTENSIONS*/
+
+      //=== VK_KHR_synchronization2 ===
+      vkCmdSetEvent2KHR   = PFN_vkCmdSetEvent2KHR( vkGetDeviceProcAddr( device, "vkCmdSetEvent2KHR" ) );
+      vkCmdResetEvent2KHR = PFN_vkCmdResetEvent2KHR( vkGetDeviceProcAddr( device, "vkCmdResetEvent2KHR" ) );
+      vkCmdWaitEvents2KHR = PFN_vkCmdWaitEvents2KHR( vkGetDeviceProcAddr( device, "vkCmdWaitEvents2KHR" ) );
+      vkCmdPipelineBarrier2KHR =
+        PFN_vkCmdPipelineBarrier2KHR( vkGetDeviceProcAddr( device, "vkCmdPipelineBarrier2KHR" ) );
+      vkCmdWriteTimestamp2KHR = PFN_vkCmdWriteTimestamp2KHR( vkGetDeviceProcAddr( device, "vkCmdWriteTimestamp2KHR" ) );
+      vkQueueSubmit2KHR       = PFN_vkQueueSubmit2KHR( vkGetDeviceProcAddr( device, "vkQueueSubmit2KHR" ) );
+      vkCmdWriteBufferMarker2AMD =
+        PFN_vkCmdWriteBufferMarker2AMD( vkGetDeviceProcAddr( device, "vkCmdWriteBufferMarker2AMD" ) );
+      vkGetQueueCheckpointData2NV =
+        PFN_vkGetQueueCheckpointData2NV( vkGetDeviceProcAddr( device, "vkGetQueueCheckpointData2NV" ) );
+
+      //=== VK_NV_fragment_shading_rate_enums ===
+      vkCmdSetFragmentShadingRateEnumNV =
+        PFN_vkCmdSetFragmentShadingRateEnumNV( vkGetDeviceProcAddr( device, "vkCmdSetFragmentShadingRateEnumNV" ) );
+
+      //=== VK_KHR_copy_commands2 ===
+      vkCmdCopyBuffer2KHR = PFN_vkCmdCopyBuffer2KHR( vkGetDeviceProcAddr( device, "vkCmdCopyBuffer2KHR" ) );
+      vkCmdCopyImage2KHR  = PFN_vkCmdCopyImage2KHR( vkGetDeviceProcAddr( device, "vkCmdCopyImage2KHR" ) );
+      vkCmdCopyBufferToImage2KHR =
+        PFN_vkCmdCopyBufferToImage2KHR( vkGetDeviceProcAddr( device, "vkCmdCopyBufferToImage2KHR" ) );
+      vkCmdCopyImageToBuffer2KHR =
+        PFN_vkCmdCopyImageToBuffer2KHR( vkGetDeviceProcAddr( device, "vkCmdCopyImageToBuffer2KHR" ) );
+      vkCmdBlitImage2KHR    = PFN_vkCmdBlitImage2KHR( vkGetDeviceProcAddr( device, "vkCmdBlitImage2KHR" ) );
+      vkCmdResolveImage2KHR = PFN_vkCmdResolveImage2KHR( vkGetDeviceProcAddr( device, "vkCmdResolveImage2KHR" ) );
+
+      //=== VK_KHR_ray_tracing_pipeline ===
+      vkCmdTraceRaysKHR = PFN_vkCmdTraceRaysKHR( vkGetDeviceProcAddr( device, "vkCmdTraceRaysKHR" ) );
+      vkCreateRayTracingPipelinesKHR =
+        PFN_vkCreateRayTracingPipelinesKHR( vkGetDeviceProcAddr( device, "vkCreateRayTracingPipelinesKHR" ) );
+      vkGetRayTracingShaderGroupHandlesKHR = PFN_vkGetRayTracingShaderGroupHandlesKHR(
+        vkGetDeviceProcAddr( device, "vkGetRayTracingShaderGroupHandlesKHR" ) );
+      vkGetRayTracingCaptureReplayShaderGroupHandlesKHR = PFN_vkGetRayTracingCaptureReplayShaderGroupHandlesKHR(
+        vkGetDeviceProcAddr( device, "vkGetRayTracingCaptureReplayShaderGroupHandlesKHR" ) );
+      vkCmdTraceRaysIndirectKHR =
+        PFN_vkCmdTraceRaysIndirectKHR( vkGetDeviceProcAddr( device, "vkCmdTraceRaysIndirectKHR" ) );
+      vkGetRayTracingShaderGroupStackSizeKHR = PFN_vkGetRayTracingShaderGroupStackSizeKHR(
+        vkGetDeviceProcAddr( device, "vkGetRayTracingShaderGroupStackSizeKHR" ) );
+      vkCmdSetRayTracingPipelineStackSizeKHR = PFN_vkCmdSetRayTracingPipelineStackSizeKHR(
+        vkGetDeviceProcAddr( device, "vkCmdSetRayTracingPipelineStackSizeKHR" ) );
+
+      //=== VK_EXT_vertex_input_dynamic_state ===
+      vkCmdSetVertexInputEXT = PFN_vkCmdSetVertexInputEXT( vkGetDeviceProcAddr( device, "vkCmdSetVertexInputEXT" ) );
+
+#if defined( VK_USE_PLATFORM_FUCHSIA )
+      //=== VK_FUCHSIA_external_memory ===
+      vkGetMemoryZirconHandleFUCHSIA =
+        PFN_vkGetMemoryZirconHandleFUCHSIA( vkGetDeviceProcAddr( device, "vkGetMemoryZirconHandleFUCHSIA" ) );
+      vkGetMemoryZirconHandlePropertiesFUCHSIA = PFN_vkGetMemoryZirconHandlePropertiesFUCHSIA(
+        vkGetDeviceProcAddr( device, "vkGetMemoryZirconHandlePropertiesFUCHSIA" ) );
+#endif /*VK_USE_PLATFORM_FUCHSIA*/
+
+#if defined( VK_USE_PLATFORM_FUCHSIA )
+      //=== VK_FUCHSIA_external_semaphore ===
+      vkImportSemaphoreZirconHandleFUCHSIA = PFN_vkImportSemaphoreZirconHandleFUCHSIA(
+        vkGetDeviceProcAddr( device, "vkImportSemaphoreZirconHandleFUCHSIA" ) );
+      vkGetSemaphoreZirconHandleFUCHSIA =
+        PFN_vkGetSemaphoreZirconHandleFUCHSIA( vkGetDeviceProcAddr( device, "vkGetSemaphoreZirconHandleFUCHSIA" ) );
+#endif /*VK_USE_PLATFORM_FUCHSIA*/
+
+      //=== VK_HUAWEI_subpass_shading ===
+      vkGetDeviceSubpassShadingMaxWorkgroupSizeHUAWEI = PFN_vkGetDeviceSubpassShadingMaxWorkgroupSizeHUAWEI(
+        vkGetDeviceProcAddr( device, "vkGetDeviceSubpassShadingMaxWorkgroupSizeHUAWEI" ) );
+      vkCmdSubpassShadingHUAWEI =
+        PFN_vkCmdSubpassShadingHUAWEI( vkGetDeviceProcAddr( device, "vkCmdSubpassShadingHUAWEI" ) );
+
+      //=== VK_HUAWEI_invocation_mask ===
+      vkCmdBindInvocationMaskHUAWEI =
+        PFN_vkCmdBindInvocationMaskHUAWEI( vkGetDeviceProcAddr( device, "vkCmdBindInvocationMaskHUAWEI" ) );
+
+      //=== VK_NV_external_memory_rdma ===
+      vkGetMemoryRemoteAddressNV =
+        PFN_vkGetMemoryRemoteAddressNV( vkGetDeviceProcAddr( device, "vkGetMemoryRemoteAddressNV" ) );
+
+      //=== VK_EXT_extended_dynamic_state2 ===
+      vkCmdSetPatchControlPointsEXT =
+        PFN_vkCmdSetPatchControlPointsEXT( vkGetDeviceProcAddr( device, "vkCmdSetPatchControlPointsEXT" ) );
+      vkCmdSetRasterizerDiscardEnableEXT =
+        PFN_vkCmdSetRasterizerDiscardEnableEXT( vkGetDeviceProcAddr( device, "vkCmdSetRasterizerDiscardEnableEXT" ) );
+      vkCmdSetDepthBiasEnableEXT =
+        PFN_vkCmdSetDepthBiasEnableEXT( vkGetDeviceProcAddr( device, "vkCmdSetDepthBiasEnableEXT" ) );
+      vkCmdSetLogicOpEXT = PFN_vkCmdSetLogicOpEXT( vkGetDeviceProcAddr( device, "vkCmdSetLogicOpEXT" ) );
+      vkCmdSetPrimitiveRestartEnableEXT =
+        PFN_vkCmdSetPrimitiveRestartEnableEXT( vkGetDeviceProcAddr( device, "vkCmdSetPrimitiveRestartEnableEXT" ) );
+
+      //=== VK_EXT_color_write_enable ===
+      vkCmdSetColorWriteEnableEXT =
+        PFN_vkCmdSetColorWriteEnableEXT( vkGetDeviceProcAddr( device, "vkCmdSetColorWriteEnableEXT" ) );
+
+      //=== VK_EXT_multi_draw ===
+      vkCmdDrawMultiEXT = PFN_vkCmdDrawMultiEXT( vkGetDeviceProcAddr( device, "vkCmdDrawMultiEXT" ) );
+      vkCmdDrawMultiIndexedEXT =
+        PFN_vkCmdDrawMultiIndexedEXT( vkGetDeviceProcAddr( device, "vkCmdDrawMultiIndexedEXT" ) );
     }
   };
-
 }  // namespace VULKAN_HPP_NAMESPACE
 
 namespace std
 {
-  template <>
-  struct hash<VULKAN_HPP_NAMESPACE::AccelerationStructureKHR>
+  //=======================
+  //=== HASH structures ===
+  //=======================
+
+  template <typename BitType>
+  struct hash<VULKAN_HPP_NAMESPACE::Flags<BitType>>
   {
-    std::size_t operator()( VULKAN_HPP_NAMESPACE::AccelerationStructureKHR const & accelerationStructureKHR ) const
-      VULKAN_HPP_NOEXCEPT
+    std::size_t operator()( VULKAN_HPP_NAMESPACE::Flags<BitType> const & flags ) const VULKAN_HPP_NOEXCEPT
     {
-      return std::hash<VkAccelerationStructureKHR>{}(
-        static_cast<VkAccelerationStructureKHR>( accelerationStructureKHR ) );
+      return std::hash<typename std::underlying_type<BitType>::type>{}(
+        static_cast<typename std::underlying_type<BitType>::type>( flags ) );
+    }
+  };
+
+  //=== VK_VERSION_1_0 ===
+
+  template <>
+  struct hash<VULKAN_HPP_NAMESPACE::Instance>
+  {
+    std::size_t operator()( VULKAN_HPP_NAMESPACE::Instance const & instance ) const VULKAN_HPP_NOEXCEPT
+    {
+      return std::hash<VkInstance>{}( static_cast<VkInstance>( instance ) );
     }
   };
 
   template <>
-  struct hash<VULKAN_HPP_NAMESPACE::AccelerationStructureNV>
+  struct hash<VULKAN_HPP_NAMESPACE::PhysicalDevice>
   {
-    std::size_t operator()( VULKAN_HPP_NAMESPACE::AccelerationStructureNV const & accelerationStructureNV ) const
-      VULKAN_HPP_NOEXCEPT
+    std::size_t operator()( VULKAN_HPP_NAMESPACE::PhysicalDevice const & physicalDevice ) const VULKAN_HPP_NOEXCEPT
     {
-      return std::hash<VkAccelerationStructureNV>{}(
-        static_cast<VkAccelerationStructureNV>( accelerationStructureNV ) );
+      return std::hash<VkPhysicalDevice>{}( static_cast<VkPhysicalDevice>( physicalDevice ) );
+    }
+  };
+
+  template <>
+  struct hash<VULKAN_HPP_NAMESPACE::Device>
+  {
+    std::size_t operator()( VULKAN_HPP_NAMESPACE::Device const & device ) const VULKAN_HPP_NOEXCEPT
+    {
+      return std::hash<VkDevice>{}( static_cast<VkDevice>( device ) );
+    }
+  };
+
+  template <>
+  struct hash<VULKAN_HPP_NAMESPACE::Queue>
+  {
+    std::size_t operator()( VULKAN_HPP_NAMESPACE::Queue const & queue ) const VULKAN_HPP_NOEXCEPT
+    {
+      return std::hash<VkQueue>{}( static_cast<VkQueue>( queue ) );
+    }
+  };
+
+  template <>
+  struct hash<VULKAN_HPP_NAMESPACE::DeviceMemory>
+  {
+    std::size_t operator()( VULKAN_HPP_NAMESPACE::DeviceMemory const & deviceMemory ) const VULKAN_HPP_NOEXCEPT
+    {
+      return std::hash<VkDeviceMemory>{}( static_cast<VkDeviceMemory>( deviceMemory ) );
+    }
+  };
+
+  template <>
+  struct hash<VULKAN_HPP_NAMESPACE::Fence>
+  {
+    std::size_t operator()( VULKAN_HPP_NAMESPACE::Fence const & fence ) const VULKAN_HPP_NOEXCEPT
+    {
+      return std::hash<VkFence>{}( static_cast<VkFence>( fence ) );
+    }
+  };
+
+  template <>
+  struct hash<VULKAN_HPP_NAMESPACE::Semaphore>
+  {
+    std::size_t operator()( VULKAN_HPP_NAMESPACE::Semaphore const & semaphore ) const VULKAN_HPP_NOEXCEPT
+    {
+      return std::hash<VkSemaphore>{}( static_cast<VkSemaphore>( semaphore ) );
+    }
+  };
+
+  template <>
+  struct hash<VULKAN_HPP_NAMESPACE::Event>
+  {
+    std::size_t operator()( VULKAN_HPP_NAMESPACE::Event const & event ) const VULKAN_HPP_NOEXCEPT
+    {
+      return std::hash<VkEvent>{}( static_cast<VkEvent>( event ) );
+    }
+  };
+
+  template <>
+  struct hash<VULKAN_HPP_NAMESPACE::QueryPool>
+  {
+    std::size_t operator()( VULKAN_HPP_NAMESPACE::QueryPool const & queryPool ) const VULKAN_HPP_NOEXCEPT
+    {
+      return std::hash<VkQueryPool>{}( static_cast<VkQueryPool>( queryPool ) );
     }
   };
 
@@ -12716,68 +13697,65 @@
   };
 
   template <>
-  struct hash<VULKAN_HPP_NAMESPACE::CommandBuffer>
+  struct hash<VULKAN_HPP_NAMESPACE::Image>
   {
-    std::size_t operator()( VULKAN_HPP_NAMESPACE::CommandBuffer const & commandBuffer ) const VULKAN_HPP_NOEXCEPT
+    std::size_t operator()( VULKAN_HPP_NAMESPACE::Image const & image ) const VULKAN_HPP_NOEXCEPT
     {
-      return std::hash<VkCommandBuffer>{}( static_cast<VkCommandBuffer>( commandBuffer ) );
+      return std::hash<VkImage>{}( static_cast<VkImage>( image ) );
     }
   };
 
   template <>
-  struct hash<VULKAN_HPP_NAMESPACE::CommandPool>
+  struct hash<VULKAN_HPP_NAMESPACE::ImageView>
   {
-    std::size_t operator()( VULKAN_HPP_NAMESPACE::CommandPool const & commandPool ) const VULKAN_HPP_NOEXCEPT
+    std::size_t operator()( VULKAN_HPP_NAMESPACE::ImageView const & imageView ) const VULKAN_HPP_NOEXCEPT
     {
-      return std::hash<VkCommandPool>{}( static_cast<VkCommandPool>( commandPool ) );
+      return std::hash<VkImageView>{}( static_cast<VkImageView>( imageView ) );
     }
   };
 
   template <>
-  struct hash<VULKAN_HPP_NAMESPACE::CuFunctionNVX>
+  struct hash<VULKAN_HPP_NAMESPACE::ShaderModule>
   {
-    std::size_t operator()( VULKAN_HPP_NAMESPACE::CuFunctionNVX const & cuFunctionNVX ) const VULKAN_HPP_NOEXCEPT
+    std::size_t operator()( VULKAN_HPP_NAMESPACE::ShaderModule const & shaderModule ) const VULKAN_HPP_NOEXCEPT
     {
-      return std::hash<VkCuFunctionNVX>{}( static_cast<VkCuFunctionNVX>( cuFunctionNVX ) );
+      return std::hash<VkShaderModule>{}( static_cast<VkShaderModule>( shaderModule ) );
     }
   };
 
   template <>
-  struct hash<VULKAN_HPP_NAMESPACE::CuModuleNVX>
+  struct hash<VULKAN_HPP_NAMESPACE::PipelineCache>
   {
-    std::size_t operator()( VULKAN_HPP_NAMESPACE::CuModuleNVX const & cuModuleNVX ) const VULKAN_HPP_NOEXCEPT
+    std::size_t operator()( VULKAN_HPP_NAMESPACE::PipelineCache const & pipelineCache ) const VULKAN_HPP_NOEXCEPT
     {
-      return std::hash<VkCuModuleNVX>{}( static_cast<VkCuModuleNVX>( cuModuleNVX ) );
+      return std::hash<VkPipelineCache>{}( static_cast<VkPipelineCache>( pipelineCache ) );
     }
   };
 
   template <>
-  struct hash<VULKAN_HPP_NAMESPACE::DebugReportCallbackEXT>
+  struct hash<VULKAN_HPP_NAMESPACE::Pipeline>
   {
-    std::size_t operator()( VULKAN_HPP_NAMESPACE::DebugReportCallbackEXT const & debugReportCallbackEXT ) const
-      VULKAN_HPP_NOEXCEPT
+    std::size_t operator()( VULKAN_HPP_NAMESPACE::Pipeline const & pipeline ) const VULKAN_HPP_NOEXCEPT
     {
-      return std::hash<VkDebugReportCallbackEXT>{}( static_cast<VkDebugReportCallbackEXT>( debugReportCallbackEXT ) );
+      return std::hash<VkPipeline>{}( static_cast<VkPipeline>( pipeline ) );
     }
   };
 
   template <>
-  struct hash<VULKAN_HPP_NAMESPACE::DebugUtilsMessengerEXT>
+  struct hash<VULKAN_HPP_NAMESPACE::PipelineLayout>
   {
-    std::size_t operator()( VULKAN_HPP_NAMESPACE::DebugUtilsMessengerEXT const & debugUtilsMessengerEXT ) const
-      VULKAN_HPP_NOEXCEPT
+    std::size_t operator()( VULKAN_HPP_NAMESPACE::PipelineLayout const & pipelineLayout ) const VULKAN_HPP_NOEXCEPT
     {
-      return std::hash<VkDebugUtilsMessengerEXT>{}( static_cast<VkDebugUtilsMessengerEXT>( debugUtilsMessengerEXT ) );
+      return std::hash<VkPipelineLayout>{}( static_cast<VkPipelineLayout>( pipelineLayout ) );
     }
   };
 
   template <>
-  struct hash<VULKAN_HPP_NAMESPACE::DeferredOperationKHR>
+  struct hash<VULKAN_HPP_NAMESPACE::Sampler>
   {
-    std::size_t
-      operator()( VULKAN_HPP_NAMESPACE::DeferredOperationKHR const & deferredOperationKHR ) const VULKAN_HPP_NOEXCEPT
+    std::size_t operator()( VULKAN_HPP_NAMESPACE::Sampler const & sampler ) const VULKAN_HPP_NOEXCEPT
     {
-      return std::hash<VkDeferredOperationKHR>{}( static_cast<VkDeferredOperationKHR>( deferredOperationKHR ) );
+      return std::hash<VkSampler>{}( static_cast<VkSampler>( sampler ) );
     }
   };
 
@@ -12810,6 +13788,54 @@
   };
 
   template <>
+  struct hash<VULKAN_HPP_NAMESPACE::Framebuffer>
+  {
+    std::size_t operator()( VULKAN_HPP_NAMESPACE::Framebuffer const & framebuffer ) const VULKAN_HPP_NOEXCEPT
+    {
+      return std::hash<VkFramebuffer>{}( static_cast<VkFramebuffer>( framebuffer ) );
+    }
+  };
+
+  template <>
+  struct hash<VULKAN_HPP_NAMESPACE::RenderPass>
+  {
+    std::size_t operator()( VULKAN_HPP_NAMESPACE::RenderPass const & renderPass ) const VULKAN_HPP_NOEXCEPT
+    {
+      return std::hash<VkRenderPass>{}( static_cast<VkRenderPass>( renderPass ) );
+    }
+  };
+
+  template <>
+  struct hash<VULKAN_HPP_NAMESPACE::CommandPool>
+  {
+    std::size_t operator()( VULKAN_HPP_NAMESPACE::CommandPool const & commandPool ) const VULKAN_HPP_NOEXCEPT
+    {
+      return std::hash<VkCommandPool>{}( static_cast<VkCommandPool>( commandPool ) );
+    }
+  };
+
+  template <>
+  struct hash<VULKAN_HPP_NAMESPACE::CommandBuffer>
+  {
+    std::size_t operator()( VULKAN_HPP_NAMESPACE::CommandBuffer const & commandBuffer ) const VULKAN_HPP_NOEXCEPT
+    {
+      return std::hash<VkCommandBuffer>{}( static_cast<VkCommandBuffer>( commandBuffer ) );
+    }
+  };
+
+  //=== VK_VERSION_1_1 ===
+
+  template <>
+  struct hash<VULKAN_HPP_NAMESPACE::SamplerYcbcrConversion>
+  {
+    std::size_t operator()( VULKAN_HPP_NAMESPACE::SamplerYcbcrConversion const & samplerYcbcrConversion ) const
+      VULKAN_HPP_NOEXCEPT
+    {
+      return std::hash<VkSamplerYcbcrConversion>{}( static_cast<VkSamplerYcbcrConversion>( samplerYcbcrConversion ) );
+    }
+  };
+
+  template <>
   struct hash<VULKAN_HPP_NAMESPACE::DescriptorUpdateTemplate>
   {
     std::size_t operator()( VULKAN_HPP_NAMESPACE::DescriptorUpdateTemplate const & descriptorUpdateTemplate ) const
@@ -12820,24 +13846,30 @@
     }
   };
 
+  //=== VK_KHR_surface ===
+
   template <>
-  struct hash<VULKAN_HPP_NAMESPACE::Device>
+  struct hash<VULKAN_HPP_NAMESPACE::SurfaceKHR>
   {
-    std::size_t operator()( VULKAN_HPP_NAMESPACE::Device const & device ) const VULKAN_HPP_NOEXCEPT
+    std::size_t operator()( VULKAN_HPP_NAMESPACE::SurfaceKHR const & surfaceKHR ) const VULKAN_HPP_NOEXCEPT
     {
-      return std::hash<VkDevice>{}( static_cast<VkDevice>( device ) );
+      return std::hash<VkSurfaceKHR>{}( static_cast<VkSurfaceKHR>( surfaceKHR ) );
     }
   };
 
+  //=== VK_KHR_swapchain ===
+
   template <>
-  struct hash<VULKAN_HPP_NAMESPACE::DeviceMemory>
+  struct hash<VULKAN_HPP_NAMESPACE::SwapchainKHR>
   {
-    std::size_t operator()( VULKAN_HPP_NAMESPACE::DeviceMemory const & deviceMemory ) const VULKAN_HPP_NOEXCEPT
+    std::size_t operator()( VULKAN_HPP_NAMESPACE::SwapchainKHR const & swapchainKHR ) const VULKAN_HPP_NOEXCEPT
     {
-      return std::hash<VkDeviceMemory>{}( static_cast<VkDeviceMemory>( deviceMemory ) );
+      return std::hash<VkSwapchainKHR>{}( static_cast<VkSwapchainKHR>( swapchainKHR ) );
     }
   };
 
+  //=== VK_KHR_display ===
+
   template <>
   struct hash<VULKAN_HPP_NAMESPACE::DisplayKHR>
   {
@@ -12856,70 +13888,113 @@
     }
   };
 
-  template <>
-  struct hash<VULKAN_HPP_NAMESPACE::Event>
-  {
-    std::size_t operator()( VULKAN_HPP_NAMESPACE::Event const & event ) const VULKAN_HPP_NOEXCEPT
-    {
-      return std::hash<VkEvent>{}( static_cast<VkEvent>( event ) );
-    }
-  };
+  //=== VK_EXT_debug_report ===
 
   template <>
-  struct hash<VULKAN_HPP_NAMESPACE::Fence>
+  struct hash<VULKAN_HPP_NAMESPACE::DebugReportCallbackEXT>
   {
-    std::size_t operator()( VULKAN_HPP_NAMESPACE::Fence const & fence ) const VULKAN_HPP_NOEXCEPT
-    {
-      return std::hash<VkFence>{}( static_cast<VkFence>( fence ) );
-    }
-  };
-
-  template <>
-  struct hash<VULKAN_HPP_NAMESPACE::Framebuffer>
-  {
-    std::size_t operator()( VULKAN_HPP_NAMESPACE::Framebuffer const & framebuffer ) const VULKAN_HPP_NOEXCEPT
-    {
-      return std::hash<VkFramebuffer>{}( static_cast<VkFramebuffer>( framebuffer ) );
-    }
-  };
-
-  template <>
-  struct hash<VULKAN_HPP_NAMESPACE::Image>
-  {
-    std::size_t operator()( VULKAN_HPP_NAMESPACE::Image const & image ) const VULKAN_HPP_NOEXCEPT
-    {
-      return std::hash<VkImage>{}( static_cast<VkImage>( image ) );
-    }
-  };
-
-  template <>
-  struct hash<VULKAN_HPP_NAMESPACE::ImageView>
-  {
-    std::size_t operator()( VULKAN_HPP_NAMESPACE::ImageView const & imageView ) const VULKAN_HPP_NOEXCEPT
-    {
-      return std::hash<VkImageView>{}( static_cast<VkImageView>( imageView ) );
-    }
-  };
-
-  template <>
-  struct hash<VULKAN_HPP_NAMESPACE::IndirectCommandsLayoutNV>
-  {
-    std::size_t operator()( VULKAN_HPP_NAMESPACE::IndirectCommandsLayoutNV const & indirectCommandsLayoutNV ) const
+    std::size_t operator()( VULKAN_HPP_NAMESPACE::DebugReportCallbackEXT const & debugReportCallbackEXT ) const
       VULKAN_HPP_NOEXCEPT
     {
-      return std::hash<VkIndirectCommandsLayoutNV>{}(
-        static_cast<VkIndirectCommandsLayoutNV>( indirectCommandsLayoutNV ) );
+      return std::hash<VkDebugReportCallbackEXT>{}( static_cast<VkDebugReportCallbackEXT>( debugReportCallbackEXT ) );
+    }
+  };
+
+#if defined( VK_ENABLE_BETA_EXTENSIONS )
+  //=== VK_KHR_video_queue ===
+
+  template <>
+  struct hash<VULKAN_HPP_NAMESPACE::VideoSessionKHR>
+  {
+    std::size_t operator()( VULKAN_HPP_NAMESPACE::VideoSessionKHR const & videoSessionKHR ) const VULKAN_HPP_NOEXCEPT
+    {
+      return std::hash<VkVideoSessionKHR>{}( static_cast<VkVideoSessionKHR>( videoSessionKHR ) );
     }
   };
 
   template <>
-  struct hash<VULKAN_HPP_NAMESPACE::Instance>
+  struct hash<VULKAN_HPP_NAMESPACE::VideoSessionParametersKHR>
   {
-    std::size_t operator()( VULKAN_HPP_NAMESPACE::Instance const & instance ) const VULKAN_HPP_NOEXCEPT
+    std::size_t operator()( VULKAN_HPP_NAMESPACE::VideoSessionParametersKHR const & videoSessionParametersKHR ) const
+      VULKAN_HPP_NOEXCEPT
     {
-      return std::hash<VkInstance>{}( static_cast<VkInstance>( instance ) );
+      return std::hash<VkVideoSessionParametersKHR>{}(
+        static_cast<VkVideoSessionParametersKHR>( videoSessionParametersKHR ) );
     }
   };
+#endif /*VK_ENABLE_BETA_EXTENSIONS*/
+
+  //=== VK_NVX_binary_import ===
+
+  template <>
+  struct hash<VULKAN_HPP_NAMESPACE::CuModuleNVX>
+  {
+    std::size_t operator()( VULKAN_HPP_NAMESPACE::CuModuleNVX const & cuModuleNVX ) const VULKAN_HPP_NOEXCEPT
+    {
+      return std::hash<VkCuModuleNVX>{}( static_cast<VkCuModuleNVX>( cuModuleNVX ) );
+    }
+  };
+
+  template <>
+  struct hash<VULKAN_HPP_NAMESPACE::CuFunctionNVX>
+  {
+    std::size_t operator()( VULKAN_HPP_NAMESPACE::CuFunctionNVX const & cuFunctionNVX ) const VULKAN_HPP_NOEXCEPT
+    {
+      return std::hash<VkCuFunctionNVX>{}( static_cast<VkCuFunctionNVX>( cuFunctionNVX ) );
+    }
+  };
+
+  //=== VK_EXT_debug_utils ===
+
+  template <>
+  struct hash<VULKAN_HPP_NAMESPACE::DebugUtilsMessengerEXT>
+  {
+    std::size_t operator()( VULKAN_HPP_NAMESPACE::DebugUtilsMessengerEXT const & debugUtilsMessengerEXT ) const
+      VULKAN_HPP_NOEXCEPT
+    {
+      return std::hash<VkDebugUtilsMessengerEXT>{}( static_cast<VkDebugUtilsMessengerEXT>( debugUtilsMessengerEXT ) );
+    }
+  };
+
+  //=== VK_KHR_acceleration_structure ===
+
+  template <>
+  struct hash<VULKAN_HPP_NAMESPACE::AccelerationStructureKHR>
+  {
+    std::size_t operator()( VULKAN_HPP_NAMESPACE::AccelerationStructureKHR const & accelerationStructureKHR ) const
+      VULKAN_HPP_NOEXCEPT
+    {
+      return std::hash<VkAccelerationStructureKHR>{}(
+        static_cast<VkAccelerationStructureKHR>( accelerationStructureKHR ) );
+    }
+  };
+
+  //=== VK_EXT_validation_cache ===
+
+  template <>
+  struct hash<VULKAN_HPP_NAMESPACE::ValidationCacheEXT>
+  {
+    std::size_t
+      operator()( VULKAN_HPP_NAMESPACE::ValidationCacheEXT const & validationCacheEXT ) const VULKAN_HPP_NOEXCEPT
+    {
+      return std::hash<VkValidationCacheEXT>{}( static_cast<VkValidationCacheEXT>( validationCacheEXT ) );
+    }
+  };
+
+  //=== VK_NV_ray_tracing ===
+
+  template <>
+  struct hash<VULKAN_HPP_NAMESPACE::AccelerationStructureNV>
+  {
+    std::size_t operator()( VULKAN_HPP_NAMESPACE::AccelerationStructureNV const & accelerationStructureNV ) const
+      VULKAN_HPP_NOEXCEPT
+    {
+      return std::hash<VkAccelerationStructureNV>{}(
+        static_cast<VkAccelerationStructureNV>( accelerationStructureNV ) );
+    }
+  };
+
+  //=== VK_INTEL_performance_query ===
 
   template <>
   struct hash<VULKAN_HPP_NAMESPACE::PerformanceConfigurationINTEL>
@@ -12932,41 +14007,32 @@
     }
   };
 
+  //=== VK_KHR_deferred_host_operations ===
+
   template <>
-  struct hash<VULKAN_HPP_NAMESPACE::PhysicalDevice>
+  struct hash<VULKAN_HPP_NAMESPACE::DeferredOperationKHR>
   {
-    std::size_t operator()( VULKAN_HPP_NAMESPACE::PhysicalDevice const & physicalDevice ) const VULKAN_HPP_NOEXCEPT
+    std::size_t
+      operator()( VULKAN_HPP_NAMESPACE::DeferredOperationKHR const & deferredOperationKHR ) const VULKAN_HPP_NOEXCEPT
     {
-      return std::hash<VkPhysicalDevice>{}( static_cast<VkPhysicalDevice>( physicalDevice ) );
+      return std::hash<VkDeferredOperationKHR>{}( static_cast<VkDeferredOperationKHR>( deferredOperationKHR ) );
     }
   };
 
+  //=== VK_NV_device_generated_commands ===
+
   template <>
-  struct hash<VULKAN_HPP_NAMESPACE::Pipeline>
+  struct hash<VULKAN_HPP_NAMESPACE::IndirectCommandsLayoutNV>
   {
-    std::size_t operator()( VULKAN_HPP_NAMESPACE::Pipeline const & pipeline ) const VULKAN_HPP_NOEXCEPT
+    std::size_t operator()( VULKAN_HPP_NAMESPACE::IndirectCommandsLayoutNV const & indirectCommandsLayoutNV ) const
+      VULKAN_HPP_NOEXCEPT
     {
-      return std::hash<VkPipeline>{}( static_cast<VkPipeline>( pipeline ) );
+      return std::hash<VkIndirectCommandsLayoutNV>{}(
+        static_cast<VkIndirectCommandsLayoutNV>( indirectCommandsLayoutNV ) );
     }
   };
 
-  template <>
-  struct hash<VULKAN_HPP_NAMESPACE::PipelineCache>
-  {
-    std::size_t operator()( VULKAN_HPP_NAMESPACE::PipelineCache const & pipelineCache ) const VULKAN_HPP_NOEXCEPT
-    {
-      return std::hash<VkPipelineCache>{}( static_cast<VkPipelineCache>( pipelineCache ) );
-    }
-  };
-
-  template <>
-  struct hash<VULKAN_HPP_NAMESPACE::PipelineLayout>
-  {
-    std::size_t operator()( VULKAN_HPP_NAMESPACE::PipelineLayout const & pipelineLayout ) const VULKAN_HPP_NOEXCEPT
-    {
-      return std::hash<VkPipelineLayout>{}( static_cast<VkPipelineLayout>( pipelineLayout ) );
-    }
-  };
+  //=== VK_EXT_private_data ===
 
   template <>
   struct hash<VULKAN_HPP_NAMESPACE::PrivateDataSlotEXT>
@@ -12978,120 +14044,5 @@
     }
   };
 
-  template <>
-  struct hash<VULKAN_HPP_NAMESPACE::QueryPool>
-  {
-    std::size_t operator()( VULKAN_HPP_NAMESPACE::QueryPool const & queryPool ) const VULKAN_HPP_NOEXCEPT
-    {
-      return std::hash<VkQueryPool>{}( static_cast<VkQueryPool>( queryPool ) );
-    }
-  };
-
-  template <>
-  struct hash<VULKAN_HPP_NAMESPACE::Queue>
-  {
-    std::size_t operator()( VULKAN_HPP_NAMESPACE::Queue const & queue ) const VULKAN_HPP_NOEXCEPT
-    {
-      return std::hash<VkQueue>{}( static_cast<VkQueue>( queue ) );
-    }
-  };
-
-  template <>
-  struct hash<VULKAN_HPP_NAMESPACE::RenderPass>
-  {
-    std::size_t operator()( VULKAN_HPP_NAMESPACE::RenderPass const & renderPass ) const VULKAN_HPP_NOEXCEPT
-    {
-      return std::hash<VkRenderPass>{}( static_cast<VkRenderPass>( renderPass ) );
-    }
-  };
-
-  template <>
-  struct hash<VULKAN_HPP_NAMESPACE::Sampler>
-  {
-    std::size_t operator()( VULKAN_HPP_NAMESPACE::Sampler const & sampler ) const VULKAN_HPP_NOEXCEPT
-    {
-      return std::hash<VkSampler>{}( static_cast<VkSampler>( sampler ) );
-    }
-  };
-
-  template <>
-  struct hash<VULKAN_HPP_NAMESPACE::SamplerYcbcrConversion>
-  {
-    std::size_t operator()( VULKAN_HPP_NAMESPACE::SamplerYcbcrConversion const & samplerYcbcrConversion ) const
-      VULKAN_HPP_NOEXCEPT
-    {
-      return std::hash<VkSamplerYcbcrConversion>{}( static_cast<VkSamplerYcbcrConversion>( samplerYcbcrConversion ) );
-    }
-  };
-
-  template <>
-  struct hash<VULKAN_HPP_NAMESPACE::Semaphore>
-  {
-    std::size_t operator()( VULKAN_HPP_NAMESPACE::Semaphore const & semaphore ) const VULKAN_HPP_NOEXCEPT
-    {
-      return std::hash<VkSemaphore>{}( static_cast<VkSemaphore>( semaphore ) );
-    }
-  };
-
-  template <>
-  struct hash<VULKAN_HPP_NAMESPACE::ShaderModule>
-  {
-    std::size_t operator()( VULKAN_HPP_NAMESPACE::ShaderModule const & shaderModule ) const VULKAN_HPP_NOEXCEPT
-    {
-      return std::hash<VkShaderModule>{}( static_cast<VkShaderModule>( shaderModule ) );
-    }
-  };
-
-  template <>
-  struct hash<VULKAN_HPP_NAMESPACE::SurfaceKHR>
-  {
-    std::size_t operator()( VULKAN_HPP_NAMESPACE::SurfaceKHR const & surfaceKHR ) const VULKAN_HPP_NOEXCEPT
-    {
-      return std::hash<VkSurfaceKHR>{}( static_cast<VkSurfaceKHR>( surfaceKHR ) );
-    }
-  };
-
-  template <>
-  struct hash<VULKAN_HPP_NAMESPACE::SwapchainKHR>
-  {
-    std::size_t operator()( VULKAN_HPP_NAMESPACE::SwapchainKHR const & swapchainKHR ) const VULKAN_HPP_NOEXCEPT
-    {
-      return std::hash<VkSwapchainKHR>{}( static_cast<VkSwapchainKHR>( swapchainKHR ) );
-    }
-  };
-
-  template <>
-  struct hash<VULKAN_HPP_NAMESPACE::ValidationCacheEXT>
-  {
-    std::size_t
-      operator()( VULKAN_HPP_NAMESPACE::ValidationCacheEXT const & validationCacheEXT ) const VULKAN_HPP_NOEXCEPT
-    {
-      return std::hash<VkValidationCacheEXT>{}( static_cast<VkValidationCacheEXT>( validationCacheEXT ) );
-    }
-  };
-
-#if defined( VK_ENABLE_BETA_EXTENSIONS )
-  template <>
-  struct hash<VULKAN_HPP_NAMESPACE::VideoSessionKHR>
-  {
-    std::size_t operator()( VULKAN_HPP_NAMESPACE::VideoSessionKHR const & videoSessionKHR ) const VULKAN_HPP_NOEXCEPT
-    {
-      return std::hash<VkVideoSessionKHR>{}( static_cast<VkVideoSessionKHR>( videoSessionKHR ) );
-    }
-  };
-#endif /*VK_ENABLE_BETA_EXTENSIONS*/
-
-#if defined( VK_ENABLE_BETA_EXTENSIONS )
-  template <>
-  struct hash<VULKAN_HPP_NAMESPACE::VideoSessionParametersKHR>
-  {
-    std::size_t operator()( VULKAN_HPP_NAMESPACE::VideoSessionParametersKHR const & videoSessionParametersKHR ) const
-      VULKAN_HPP_NOEXCEPT
-    {
-      return std::hash<VkVideoSessionParametersKHR>{}(
-        static_cast<VkVideoSessionParametersKHR>( videoSessionParametersKHR ) );
-    }
-  };
-#endif /*VK_ENABLE_BETA_EXTENSIONS*/
 }  // namespace std
 #endif
diff --git a/third_party/vulkan-deps/vulkan-headers/src/include/vulkan/vulkan_beta.h b/third_party/vulkan-deps/vulkan-headers/src/include/vulkan/vulkan_beta.h
index c615bb3..e2337ad 100644
--- a/third_party/vulkan-deps/vulkan-headers/src/include/vulkan/vulkan_beta.h
+++ b/third_party/vulkan-deps/vulkan-headers/src/include/vulkan/vulkan_beta.h
@@ -22,7 +22,7 @@
 #define VK_KHR_video_queue 1
 VK_DEFINE_NON_DISPATCHABLE_HANDLE(VkVideoSessionKHR)
 VK_DEFINE_NON_DISPATCHABLE_HANDLE(VkVideoSessionParametersKHR)
-#define VK_KHR_VIDEO_QUEUE_SPEC_VERSION   1
+#define VK_KHR_VIDEO_QUEUE_SPEC_VERSION   2
 #define VK_KHR_VIDEO_QUEUE_EXTENSION_NAME "VK_KHR_video_queue"
 
 typedef enum VkQueryResultStatusKHR {
@@ -66,12 +66,12 @@
 } VkVideoComponentBitDepthFlagBitsKHR;
 typedef VkFlags VkVideoComponentBitDepthFlagsKHR;
 
-typedef enum VkVideoCapabilitiesFlagBitsKHR {
-    VK_VIDEO_CAPABILITIES_PROTECTED_CONTENT_BIT_KHR = 0x00000001,
-    VK_VIDEO_CAPABILITIES_SEPARATE_REFERENCE_IMAGES_BIT_KHR = 0x00000002,
-    VK_VIDEO_CAPABILITIES_FLAG_BITS_MAX_ENUM_KHR = 0x7FFFFFFF
-} VkVideoCapabilitiesFlagBitsKHR;
-typedef VkFlags VkVideoCapabilitiesFlagsKHR;
+typedef enum VkVideoCapabilityFlagBitsKHR {
+    VK_VIDEO_CAPABILITY_PROTECTED_CONTENT_BIT_KHR = 0x00000001,
+    VK_VIDEO_CAPABILITY_SEPARATE_REFERENCE_IMAGES_BIT_KHR = 0x00000002,
+    VK_VIDEO_CAPABILITY_FLAG_BITS_MAX_ENUM_KHR = 0x7FFFFFFF
+} VkVideoCapabilityFlagBitsKHR;
+typedef VkFlags VkVideoCapabilityFlagsKHR;
 
 typedef enum VkVideoSessionCreateFlagBitsKHR {
     VK_VIDEO_SESSION_CREATE_DEFAULT_KHR = 0,
@@ -120,16 +120,16 @@
 } VkVideoProfilesKHR;
 
 typedef struct VkVideoCapabilitiesKHR {
-    VkStructureType                sType;
-    void*                          pNext;
-    VkVideoCapabilitiesFlagsKHR    capabilityFlags;
-    VkDeviceSize                   minBitstreamBufferOffsetAlignment;
-    VkDeviceSize                   minBitstreamBufferSizeAlignment;
-    VkExtent2D                     videoPictureExtentGranularity;
-    VkExtent2D                     minExtent;
-    VkExtent2D                     maxExtent;
-    uint32_t                       maxReferencePicturesSlotsCount;
-    uint32_t                       maxReferencePicturesActiveCount;
+    VkStructureType              sType;
+    void*                        pNext;
+    VkVideoCapabilityFlagsKHR    capabilityFlags;
+    VkDeviceSize                 minBitstreamBufferOffsetAlignment;
+    VkDeviceSize                 minBitstreamBufferSizeAlignment;
+    VkExtent2D                   videoPictureExtentGranularity;
+    VkExtent2D                   minExtent;
+    VkExtent2D                   maxExtent;
+    uint32_t                     maxReferencePicturesSlotsCount;
+    uint32_t                     maxReferencePicturesActiveCount;
 } VkVideoCapabilitiesKHR;
 
 typedef struct VkPhysicalDeviceVideoFormatInfoKHR {
@@ -433,10 +433,10 @@
 #define VK_EXT_video_encode_h264 1
 #include "vk_video/vulkan_video_codec_h264std.h"
 #include "vk_video/vulkan_video_codec_h264std_encode.h"
-#define VK_EXT_VIDEO_ENCODE_H264_SPEC_VERSION 1
+#define VK_EXT_VIDEO_ENCODE_H264_SPEC_VERSION 2
 #define VK_EXT_VIDEO_ENCODE_H264_EXTENSION_NAME "VK_EXT_video_encode_h264"
 
-typedef enum VkVideoEncodeH264CapabilitiesFlagBitsEXT {
+typedef enum VkVideoEncodeH264CapabilityFlagBitsEXT {
     VK_VIDEO_ENCODE_H264_CAPABILITY_CABAC_BIT_EXT = 0x00000001,
     VK_VIDEO_ENCODE_H264_CAPABILITY_CAVLC_BIT_EXT = 0x00000002,
     VK_VIDEO_ENCODE_H264_CAPABILITY_WEIGHTED_BI_PRED_IMPLICIT_BIT_EXT = 0x00000004,
@@ -448,9 +448,9 @@
     VK_VIDEO_ENCODE_H264_CAPABILITY_DEBLOCKING_FILTER_PARTIAL_BIT_EXT = 0x00000100,
     VK_VIDEO_ENCODE_H264_CAPABILITY_MULTIPLE_SLICE_PER_FRAME_BIT_EXT = 0x00000200,
     VK_VIDEO_ENCODE_H264_CAPABILITY_EVENLY_DISTRIBUTED_SLICE_SIZE_BIT_EXT = 0x00000400,
-    VK_VIDEO_ENCODE_H264_CAPABILITIES_FLAG_BITS_MAX_ENUM_EXT = 0x7FFFFFFF
-} VkVideoEncodeH264CapabilitiesFlagBitsEXT;
-typedef VkFlags VkVideoEncodeH264CapabilitiesFlagsEXT;
+    VK_VIDEO_ENCODE_H264_CAPABILITY_FLAG_BITS_MAX_ENUM_EXT = 0x7FFFFFFF
+} VkVideoEncodeH264CapabilityFlagBitsEXT;
+typedef VkFlags VkVideoEncodeH264CapabilityFlagsEXT;
 
 typedef enum VkVideoEncodeH264InputModeFlagBitsEXT {
     VK_VIDEO_ENCODE_H264_INPUT_MODE_FRAME_BIT_EXT = 0x00000001,
@@ -475,19 +475,19 @@
 } VkVideoEncodeH264CreateFlagBitsEXT;
 typedef VkFlags VkVideoEncodeH264CreateFlagsEXT;
 typedef struct VkVideoEncodeH264CapabilitiesEXT {
-    VkStructureType                          sType;
-    const void*                              pNext;
-    VkVideoEncodeH264CapabilitiesFlagsEXT    flags;
-    VkVideoEncodeH264InputModeFlagsEXT       inputModeFlags;
-    VkVideoEncodeH264OutputModeFlagsEXT      outputModeFlags;
-    VkExtent2D                               minPictureSizeInMbs;
-    VkExtent2D                               maxPictureSizeInMbs;
-    VkExtent2D                               inputImageDataAlignment;
-    uint8_t                                  maxNumL0ReferenceForP;
-    uint8_t                                  maxNumL0ReferenceForB;
-    uint8_t                                  maxNumL1Reference;
-    uint8_t                                  qualityLevelCount;
-    VkExtensionProperties                    stdExtensionVersion;
+    VkStructureType                        sType;
+    const void*                            pNext;
+    VkVideoEncodeH264CapabilityFlagsEXT    flags;
+    VkVideoEncodeH264InputModeFlagsEXT     inputModeFlags;
+    VkVideoEncodeH264OutputModeFlagsEXT    outputModeFlags;
+    VkExtent2D                             minPictureSizeInMbs;
+    VkExtent2D                             maxPictureSizeInMbs;
+    VkExtent2D                             inputImageDataAlignment;
+    uint8_t                                maxNumL0ReferenceForP;
+    uint8_t                                maxNumL0ReferenceForB;
+    uint8_t                                maxNumL1Reference;
+    uint8_t                                qualityLevelCount;
+    VkExtensionProperties                  stdExtensionVersion;
 } VkVideoEncodeH264CapabilitiesEXT;
 
 typedef struct VkVideoEncodeH264SessionCreateInfoEXT {
@@ -567,22 +567,22 @@
 
 #define VK_EXT_video_decode_h264 1
 #include "vk_video/vulkan_video_codec_h264std_decode.h"
-#define VK_EXT_VIDEO_DECODE_H264_SPEC_VERSION 1
+#define VK_EXT_VIDEO_DECODE_H264_SPEC_VERSION 3
 #define VK_EXT_VIDEO_DECODE_H264_EXTENSION_NAME "VK_EXT_video_decode_h264"
 
-typedef enum VkVideoDecodeH264FieldLayoutFlagBitsEXT {
-    VK_VIDEO_DECODE_H264_PROGRESSIVE_PICTURES_ONLY_EXT = 0,
-    VK_VIDEO_DECODE_H264_FIELD_LAYOUT_LINE_INTERLACED_PLANE_BIT_EXT = 0x00000001,
-    VK_VIDEO_DECODE_H264_FIELD_LAYOUT_SEPARATE_INTERLACED_PLANE_BIT_EXT = 0x00000002,
-    VK_VIDEO_DECODE_H264_FIELD_LAYOUT_FLAG_BITS_MAX_ENUM_EXT = 0x7FFFFFFF
-} VkVideoDecodeH264FieldLayoutFlagBitsEXT;
-typedef VkFlags VkVideoDecodeH264FieldLayoutFlagsEXT;
+typedef enum VkVideoDecodeH264PictureLayoutFlagBitsEXT {
+    VK_VIDEO_DECODE_H264_PICTURE_LAYOUT_PROGRESSIVE_EXT = 0,
+    VK_VIDEO_DECODE_H264_PICTURE_LAYOUT_INTERLACED_INTERLEAVED_LINES_BIT_EXT = 0x00000001,
+    VK_VIDEO_DECODE_H264_PICTURE_LAYOUT_INTERLACED_SEPARATE_PLANES_BIT_EXT = 0x00000002,
+    VK_VIDEO_DECODE_H264_PICTURE_LAYOUT_FLAG_BITS_MAX_ENUM_EXT = 0x7FFFFFFF
+} VkVideoDecodeH264PictureLayoutFlagBitsEXT;
+typedef VkFlags VkVideoDecodeH264PictureLayoutFlagsEXT;
 typedef VkFlags VkVideoDecodeH264CreateFlagsEXT;
 typedef struct VkVideoDecodeH264ProfileEXT {
-    VkStructureType                         sType;
-    const void*                             pNext;
-    StdVideoH264ProfileIdc                  stdProfileIdc;
-    VkVideoDecodeH264FieldLayoutFlagsEXT    fieldLayout;
+    VkStructureType                           sType;
+    const void*                               pNext;
+    StdVideoH264ProfileIdc                    stdProfileIdc;
+    VkVideoDecodeH264PictureLayoutFlagsEXT    pictureLayout;
 } VkVideoDecodeH264ProfileEXT;
 
 typedef struct VkVideoDecodeH264CapabilitiesEXT {
diff --git a/third_party/vulkan-deps/vulkan-headers/src/include/vulkan/vulkan_core.h b/third_party/vulkan-deps/vulkan-headers/src/include/vulkan/vulkan_core.h
index 53f9d48..36013cb 100644
--- a/third_party/vulkan-deps/vulkan-headers/src/include/vulkan/vulkan_core.h
+++ b/third_party/vulkan-deps/vulkan-headers/src/include/vulkan/vulkan_core.h
@@ -20,7 +20,7 @@
 
 
 #define VK_VERSION_1_0 1
-#include "vulkan/vk_platform.h"
+#include "vk_platform.h"
 
 #define VK_DEFINE_HANDLE(object) typedef struct object##_T* object;
 
@@ -72,7 +72,7 @@
 #define VK_API_VERSION_1_0 VK_MAKE_API_VERSION(0, 1, 0, 0)// Patch version should always be set to 0
 
 // Version of this file
-#define VK_HEADER_VERSION 184
+#define VK_HEADER_VERSION 190
 
 // Complete version of this file
 #define VK_HEADER_VERSION_COMPLETE VK_MAKE_API_VERSION(0, 1, 2, VK_HEADER_VERSION)
@@ -714,6 +714,7 @@
     VK_STRUCTURE_TYPE_BUFFER_DEVICE_ADDRESS_CREATE_INFO_EXT = 1000244002,
     VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TOOL_PROPERTIES_EXT = 1000245000,
     VK_STRUCTURE_TYPE_VALIDATION_FEATURES_EXT = 1000247000,
+    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PRESENT_WAIT_FEATURES_KHR = 1000248000,
     VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COOPERATIVE_MATRIX_FEATURES_NV = 1000249000,
     VK_STRUCTURE_TYPE_COOPERATIVE_MATRIX_PROPERTIES_NV = 1000249001,
     VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COOPERATIVE_MATRIX_PROPERTIES_NV = 1000249002,
@@ -741,6 +742,7 @@
     VK_STRUCTURE_TYPE_PIPELINE_EXECUTABLE_INFO_KHR = 1000269003,
     VK_STRUCTURE_TYPE_PIPELINE_EXECUTABLE_STATISTIC_KHR = 1000269004,
     VK_STRUCTURE_TYPE_PIPELINE_EXECUTABLE_INTERNAL_REPRESENTATION_KHR = 1000269005,
+    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_ATOMIC_FLOAT_2_FEATURES_EXT = 1000273000,
     VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_DEMOTE_TO_HELPER_INVOCATION_FEATURES_EXT = 1000276000,
     VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEVICE_GENERATED_COMMANDS_PROPERTIES_NV = 1000277000,
     VK_STRUCTURE_TYPE_GRAPHICS_SHADER_GROUP_CREATE_INFO_NV = 1000277001,
@@ -752,6 +754,8 @@
     VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEVICE_GENERATED_COMMANDS_FEATURES_NV = 1000277007,
     VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_INHERITED_VIEWPORT_SCISSOR_FEATURES_NV = 1000278000,
     VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_VIEWPORT_SCISSOR_INFO_NV = 1000278001,
+    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_INTEGER_DOT_PRODUCT_FEATURES_KHR = 1000280000,
+    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_INTEGER_DOT_PRODUCT_PROPERTIES_KHR = 1000280001,
     VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TEXEL_BUFFER_ALIGNMENT_FEATURES_EXT = 1000281000,
     VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TEXEL_BUFFER_ALIGNMENT_PROPERTIES_EXT = 1000281001,
     VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_RENDER_PASS_TRANSFORM_INFO_QCOM = 1000282000,
@@ -765,6 +769,8 @@
     VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CUSTOM_BORDER_COLOR_PROPERTIES_EXT = 1000287001,
     VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CUSTOM_BORDER_COLOR_FEATURES_EXT = 1000287002,
     VK_STRUCTURE_TYPE_PIPELINE_LIBRARY_CREATE_INFO_KHR = 1000290000,
+    VK_STRUCTURE_TYPE_PRESENT_ID_KHR = 1000294000,
+    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PRESENT_ID_FEATURES_KHR = 1000294001,
     VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PRIVATE_DATA_FEATURES_EXT = 1000295000,
     VK_STRUCTURE_TYPE_DEVICE_PRIVATE_DATA_CREATE_INFO_EXT = 1000295001,
     VK_STRUCTURE_TYPE_PRIVATE_DATA_SLOT_CREATE_INFO_EXT = 1000295002,
@@ -820,6 +826,7 @@
     VK_STRUCTURE_TYPE_VERTEX_INPUT_BINDING_DESCRIPTION_2_EXT = 1000352001,
     VK_STRUCTURE_TYPE_VERTEX_INPUT_ATTRIBUTE_DESCRIPTION_2_EXT = 1000352002,
     VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DRM_PROPERTIES_EXT = 1000353000,
+    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PRIMITIVE_TOPOLOGY_LIST_RESTART_FEATURES_EXT = 1000356000,
     VK_STRUCTURE_TYPE_IMPORT_MEMORY_ZIRCON_HANDLE_INFO_FUCHSIA = 1000364000,
     VK_STRUCTURE_TYPE_MEMORY_ZIRCON_HANDLE_PROPERTIES_FUCHSIA = 1000364001,
     VK_STRUCTURE_TYPE_MEMORY_GET_ZIRCON_HANDLE_INFO_FUCHSIA = 1000364002,
@@ -828,6 +835,7 @@
     VK_STRUCTURE_TYPE_SUBPASS_SHADING_PIPELINE_CREATE_INFO_HUAWEI = 1000369000,
     VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SUBPASS_SHADING_FEATURES_HUAWEI = 1000369001,
     VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SUBPASS_SHADING_PROPERTIES_HUAWEI = 1000369002,
+    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_INVOCATION_MASK_FEATURES_HUAWEI = 1000370000,
     VK_STRUCTURE_TYPE_MEMORY_GET_REMOTE_ADDRESS_INFO_NV = 1000371000,
     VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_MEMORY_RDMA_FEATURES_NV = 1000371001,
     VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTENDED_DYNAMIC_STATE_2_FEATURES_EXT = 1000377000,
@@ -1701,13 +1709,15 @@
     VK_ATTACHMENT_LOAD_OP_LOAD = 0,
     VK_ATTACHMENT_LOAD_OP_CLEAR = 1,
     VK_ATTACHMENT_LOAD_OP_DONT_CARE = 2,
+    VK_ATTACHMENT_LOAD_OP_NONE_EXT = 1000400000,
     VK_ATTACHMENT_LOAD_OP_MAX_ENUM = 0x7FFFFFFF
 } VkAttachmentLoadOp;
 
 typedef enum VkAttachmentStoreOp {
     VK_ATTACHMENT_STORE_OP_STORE = 0,
     VK_ATTACHMENT_STORE_OP_DONT_CARE = 1,
-    VK_ATTACHMENT_STORE_OP_NONE_QCOM = 1000301000,
+    VK_ATTACHMENT_STORE_OP_NONE_EXT = 1000301000,
+    VK_ATTACHMENT_STORE_OP_NONE_QCOM = VK_ATTACHMENT_STORE_OP_NONE_EXT,
     VK_ATTACHMENT_STORE_OP_MAX_ENUM = 0x7FFFFFFF
 } VkAttachmentStoreOp;
 
@@ -1919,6 +1929,7 @@
 #ifdef VK_ENABLE_BETA_EXTENSIONS
     VK_IMAGE_USAGE_VIDEO_ENCODE_DPB_BIT_KHR = 0x00008000,
 #endif
+    VK_IMAGE_USAGE_INVOCATION_MASK_BIT_HUAWEI = 0x00040000,
     VK_IMAGE_USAGE_SHADING_RATE_IMAGE_BIT_NV = VK_IMAGE_USAGE_FRAGMENT_SHADING_RATE_ATTACHMENT_BIT_KHR,
     VK_IMAGE_USAGE_FLAG_BITS_MAX_ENUM = 0x7FFFFFFF
 } VkImageUsageFlagBits;
@@ -2117,10 +2128,6 @@
     VK_IMAGE_VIEW_CREATE_FLAG_BITS_MAX_ENUM = 0x7FFFFFFF
 } VkImageViewCreateFlagBits;
 typedef VkFlags VkImageViewCreateFlags;
-
-typedef enum VkShaderModuleCreateFlagBits {
-    VK_SHADER_MODULE_CREATE_FLAG_BITS_MAX_ENUM = 0x7FFFFFFF
-} VkShaderModuleCreateFlagBits;
 typedef VkFlags VkShaderModuleCreateFlags;
 
 typedef enum VkPipelineCacheCreateFlagBits {
@@ -5276,6 +5283,7 @@
     VK_DRIVER_ID_MOLTENVK = 14,
     VK_DRIVER_ID_COREAVI_PROPRIETARY = 15,
     VK_DRIVER_ID_JUICE_PROPRIETARY = 16,
+    VK_DRIVER_ID_VERISILICON_PROPRIETARY = 17,
     VK_DRIVER_ID_AMD_PROPRIETARY_KHR = VK_DRIVER_ID_AMD_PROPRIETARY,
     VK_DRIVER_ID_AMD_OPEN_SOURCE_KHR = VK_DRIVER_ID_AMD_OPEN_SOURCE,
     VK_DRIVER_ID_MESA_RADV_KHR = VK_DRIVER_ID_MESA_RADV,
@@ -7674,6 +7682,26 @@
 
 
 
+#define VK_KHR_present_wait 1
+#define VK_KHR_PRESENT_WAIT_SPEC_VERSION  1
+#define VK_KHR_PRESENT_WAIT_EXTENSION_NAME "VK_KHR_present_wait"
+typedef struct VkPhysicalDevicePresentWaitFeaturesKHR {
+    VkStructureType    sType;
+    void*              pNext;
+    VkBool32           presentWait;
+} VkPhysicalDevicePresentWaitFeaturesKHR;
+
+typedef VkResult (VKAPI_PTR *PFN_vkWaitForPresentKHR)(VkDevice device, VkSwapchainKHR swapchain, uint64_t presentId, uint64_t timeout);
+
+#ifndef VK_NO_PROTOTYPES
+VKAPI_ATTR VkResult VKAPI_CALL vkWaitForPresentKHR(
+    VkDevice                                    device,
+    VkSwapchainKHR                              swapchain,
+    uint64_t                                    presentId,
+    uint64_t                                    timeout);
+#endif
+
+
 #define VK_KHR_uniform_buffer_standard_layout 1
 #define VK_KHR_UNIFORM_BUFFER_STANDARD_LAYOUT_SPEC_VERSION 1
 #define VK_KHR_UNIFORM_BUFFER_STANDARD_LAYOUT_EXTENSION_NAME "VK_KHR_uniform_buffer_standard_layout"
@@ -7838,6 +7866,52 @@
 #endif
 
 
+#define VK_KHR_shader_integer_dot_product 1
+#define VK_KHR_SHADER_INTEGER_DOT_PRODUCT_SPEC_VERSION 1
+#define VK_KHR_SHADER_INTEGER_DOT_PRODUCT_EXTENSION_NAME "VK_KHR_shader_integer_dot_product"
+typedef struct VkPhysicalDeviceShaderIntegerDotProductFeaturesKHR {
+    VkStructureType    sType;
+    void*              pNext;
+    VkBool32           shaderIntegerDotProduct;
+} VkPhysicalDeviceShaderIntegerDotProductFeaturesKHR;
+
+typedef struct VkPhysicalDeviceShaderIntegerDotProductPropertiesKHR {
+    VkStructureType    sType;
+    void*              pNext;
+    VkBool32           integerDotProduct8BitUnsignedAccelerated;
+    VkBool32           integerDotProduct8BitSignedAccelerated;
+    VkBool32           integerDotProduct8BitMixedSignednessAccelerated;
+    VkBool32           integerDotProduct4x8BitPackedUnsignedAccelerated;
+    VkBool32           integerDotProduct4x8BitPackedSignedAccelerated;
+    VkBool32           integerDotProduct4x8BitPackedMixedSignednessAccelerated;
+    VkBool32           integerDotProduct16BitUnsignedAccelerated;
+    VkBool32           integerDotProduct16BitSignedAccelerated;
+    VkBool32           integerDotProduct16BitMixedSignednessAccelerated;
+    VkBool32           integerDotProduct32BitUnsignedAccelerated;
+    VkBool32           integerDotProduct32BitSignedAccelerated;
+    VkBool32           integerDotProduct32BitMixedSignednessAccelerated;
+    VkBool32           integerDotProduct64BitUnsignedAccelerated;
+    VkBool32           integerDotProduct64BitSignedAccelerated;
+    VkBool32           integerDotProduct64BitMixedSignednessAccelerated;
+    VkBool32           integerDotProductAccumulatingSaturating8BitUnsignedAccelerated;
+    VkBool32           integerDotProductAccumulatingSaturating8BitSignedAccelerated;
+    VkBool32           integerDotProductAccumulatingSaturating8BitMixedSignednessAccelerated;
+    VkBool32           integerDotProductAccumulatingSaturating4x8BitPackedUnsignedAccelerated;
+    VkBool32           integerDotProductAccumulatingSaturating4x8BitPackedSignedAccelerated;
+    VkBool32           integerDotProductAccumulatingSaturating4x8BitPackedMixedSignednessAccelerated;
+    VkBool32           integerDotProductAccumulatingSaturating16BitUnsignedAccelerated;
+    VkBool32           integerDotProductAccumulatingSaturating16BitSignedAccelerated;
+    VkBool32           integerDotProductAccumulatingSaturating16BitMixedSignednessAccelerated;
+    VkBool32           integerDotProductAccumulatingSaturating32BitUnsignedAccelerated;
+    VkBool32           integerDotProductAccumulatingSaturating32BitSignedAccelerated;
+    VkBool32           integerDotProductAccumulatingSaturating32BitMixedSignednessAccelerated;
+    VkBool32           integerDotProductAccumulatingSaturating64BitUnsignedAccelerated;
+    VkBool32           integerDotProductAccumulatingSaturating64BitSignedAccelerated;
+    VkBool32           integerDotProductAccumulatingSaturating64BitMixedSignednessAccelerated;
+} VkPhysicalDeviceShaderIntegerDotProductPropertiesKHR;
+
+
+
 #define VK_KHR_pipeline_library 1
 #define VK_KHR_PIPELINE_LIBRARY_SPEC_VERSION 1
 #define VK_KHR_PIPELINE_LIBRARY_EXTENSION_NAME "VK_KHR_pipeline_library"
@@ -7855,6 +7929,24 @@
 #define VK_KHR_SHADER_NON_SEMANTIC_INFO_EXTENSION_NAME "VK_KHR_shader_non_semantic_info"
 
 
+#define VK_KHR_present_id 1
+#define VK_KHR_PRESENT_ID_SPEC_VERSION    1
+#define VK_KHR_PRESENT_ID_EXTENSION_NAME  "VK_KHR_present_id"
+typedef struct VkPresentIdKHR {
+    VkStructureType    sType;
+    const void*        pNext;
+    uint32_t           swapchainCount;
+    const uint64_t*    pPresentIds;
+} VkPresentIdKHR;
+
+typedef struct VkPhysicalDevicePresentIdFeaturesKHR {
+    VkStructureType    sType;
+    void*              pNext;
+    VkBool32           presentId;
+} VkPhysicalDevicePresentIdFeaturesKHR;
+
+
+
 #define VK_KHR_synchronization2 1
 typedef uint64_t VkFlags64;
 #define VK_KHR_SYNCHRONIZATION_2_SPEC_VERSION 1
@@ -7877,7 +7969,7 @@
 static const VkPipelineStageFlagBits2KHR VK_PIPELINE_STAGE_2_COLOR_ATTACHMENT_OUTPUT_BIT_KHR = 0x00000400ULL;
 static const VkPipelineStageFlagBits2KHR VK_PIPELINE_STAGE_2_COMPUTE_SHADER_BIT_KHR = 0x00000800ULL;
 static const VkPipelineStageFlagBits2KHR VK_PIPELINE_STAGE_2_ALL_TRANSFER_BIT_KHR = 0x00001000ULL;
-static const VkPipelineStageFlagBits2KHR VK_PIPELINE_STAGE_2_TRANSFER_BIT_KHR = 0x00001000;
+static const VkPipelineStageFlagBits2KHR VK_PIPELINE_STAGE_2_TRANSFER_BIT_KHR = 0x00001000ULL;
 static const VkPipelineStageFlagBits2KHR VK_PIPELINE_STAGE_2_BOTTOM_OF_PIPE_BIT_KHR = 0x00002000ULL;
 static const VkPipelineStageFlagBits2KHR VK_PIPELINE_STAGE_2_HOST_BIT_KHR = 0x00004000ULL;
 static const VkPipelineStageFlagBits2KHR VK_PIPELINE_STAGE_2_ALL_GRAPHICS_BIT_KHR = 0x00008000ULL;
@@ -7899,15 +7991,16 @@
 static const VkPipelineStageFlagBits2KHR VK_PIPELINE_STAGE_2_CONDITIONAL_RENDERING_BIT_EXT = 0x00040000ULL;
 static const VkPipelineStageFlagBits2KHR VK_PIPELINE_STAGE_2_COMMAND_PREPROCESS_BIT_NV = 0x00020000ULL;
 static const VkPipelineStageFlagBits2KHR VK_PIPELINE_STAGE_2_FRAGMENT_SHADING_RATE_ATTACHMENT_BIT_KHR = 0x00400000ULL;
-static const VkPipelineStageFlagBits2KHR VK_PIPELINE_STAGE_2_SHADING_RATE_IMAGE_BIT_NV = 0x00400000;
+static const VkPipelineStageFlagBits2KHR VK_PIPELINE_STAGE_2_SHADING_RATE_IMAGE_BIT_NV = 0x00400000ULL;
 static const VkPipelineStageFlagBits2KHR VK_PIPELINE_STAGE_2_ACCELERATION_STRUCTURE_BUILD_BIT_KHR = 0x02000000ULL;
 static const VkPipelineStageFlagBits2KHR VK_PIPELINE_STAGE_2_RAY_TRACING_SHADER_BIT_KHR = 0x00200000ULL;
-static const VkPipelineStageFlagBits2KHR VK_PIPELINE_STAGE_2_RAY_TRACING_SHADER_BIT_NV = 0x00200000;
-static const VkPipelineStageFlagBits2KHR VK_PIPELINE_STAGE_2_ACCELERATION_STRUCTURE_BUILD_BIT_NV = 0x02000000;
+static const VkPipelineStageFlagBits2KHR VK_PIPELINE_STAGE_2_RAY_TRACING_SHADER_BIT_NV = 0x00200000ULL;
+static const VkPipelineStageFlagBits2KHR VK_PIPELINE_STAGE_2_ACCELERATION_STRUCTURE_BUILD_BIT_NV = 0x02000000ULL;
 static const VkPipelineStageFlagBits2KHR VK_PIPELINE_STAGE_2_FRAGMENT_DENSITY_PROCESS_BIT_EXT = 0x00800000ULL;
 static const VkPipelineStageFlagBits2KHR VK_PIPELINE_STAGE_2_TASK_SHADER_BIT_NV = 0x00080000ULL;
 static const VkPipelineStageFlagBits2KHR VK_PIPELINE_STAGE_2_MESH_SHADER_BIT_NV = 0x00100000ULL;
 static const VkPipelineStageFlagBits2KHR VK_PIPELINE_STAGE_2_SUBPASS_SHADING_BIT_HUAWEI = 0x8000000000ULL;
+static const VkPipelineStageFlagBits2KHR VK_PIPELINE_STAGE_2_INVOCATION_MASK_BIT_HUAWEI = 0x10000000000ULL;
 
 typedef VkFlags64 VkAccessFlags2KHR;
 
@@ -7953,13 +8046,14 @@
 static const VkAccessFlagBits2KHR VK_ACCESS_2_COMMAND_PREPROCESS_READ_BIT_NV = 0x00020000ULL;
 static const VkAccessFlagBits2KHR VK_ACCESS_2_COMMAND_PREPROCESS_WRITE_BIT_NV = 0x00040000ULL;
 static const VkAccessFlagBits2KHR VK_ACCESS_2_FRAGMENT_SHADING_RATE_ATTACHMENT_READ_BIT_KHR = 0x00800000ULL;
-static const VkAccessFlagBits2KHR VK_ACCESS_2_SHADING_RATE_IMAGE_READ_BIT_NV = 0x00800000;
+static const VkAccessFlagBits2KHR VK_ACCESS_2_SHADING_RATE_IMAGE_READ_BIT_NV = 0x00800000ULL;
 static const VkAccessFlagBits2KHR VK_ACCESS_2_ACCELERATION_STRUCTURE_READ_BIT_KHR = 0x00200000ULL;
 static const VkAccessFlagBits2KHR VK_ACCESS_2_ACCELERATION_STRUCTURE_WRITE_BIT_KHR = 0x00400000ULL;
-static const VkAccessFlagBits2KHR VK_ACCESS_2_ACCELERATION_STRUCTURE_READ_BIT_NV = 0x00200000;
-static const VkAccessFlagBits2KHR VK_ACCESS_2_ACCELERATION_STRUCTURE_WRITE_BIT_NV = 0x00400000;
+static const VkAccessFlagBits2KHR VK_ACCESS_2_ACCELERATION_STRUCTURE_READ_BIT_NV = 0x00200000ULL;
+static const VkAccessFlagBits2KHR VK_ACCESS_2_ACCELERATION_STRUCTURE_WRITE_BIT_NV = 0x00400000ULL;
 static const VkAccessFlagBits2KHR VK_ACCESS_2_FRAGMENT_DENSITY_MAP_READ_BIT_EXT = 0x01000000ULL;
 static const VkAccessFlagBits2KHR VK_ACCESS_2_COLOR_ATTACHMENT_READ_NONCOHERENT_BIT_EXT = 0x00080000ULL;
+static const VkAccessFlagBits2KHR VK_ACCESS_2_INVOCATION_MASK_READ_BIT_HUAWEI = 0x8000000000ULL;
 
 
 typedef enum VkSubmitFlagBitsKHR {
@@ -10087,9 +10181,10 @@
 
 typedef enum VkGeometryInstanceFlagBitsKHR {
     VK_GEOMETRY_INSTANCE_TRIANGLE_FACING_CULL_DISABLE_BIT_KHR = 0x00000001,
-    VK_GEOMETRY_INSTANCE_TRIANGLE_FRONT_COUNTERCLOCKWISE_BIT_KHR = 0x00000002,
+    VK_GEOMETRY_INSTANCE_TRIANGLE_FLIP_FACING_BIT_KHR = 0x00000002,
     VK_GEOMETRY_INSTANCE_FORCE_OPAQUE_BIT_KHR = 0x00000004,
     VK_GEOMETRY_INSTANCE_FORCE_NO_OPAQUE_BIT_KHR = 0x00000008,
+    VK_GEOMETRY_INSTANCE_TRIANGLE_FRONT_COUNTERCLOCKWISE_BIT_KHR = VK_GEOMETRY_INSTANCE_TRIANGLE_FLIP_FACING_BIT_KHR,
     VK_GEOMETRY_INSTANCE_TRIANGLE_CULL_DISABLE_BIT_NV = VK_GEOMETRY_INSTANCE_TRIANGLE_FACING_CULL_DISABLE_BIT_KHR,
     VK_GEOMETRY_INSTANCE_TRIANGLE_FRONT_COUNTERCLOCKWISE_BIT_NV = VK_GEOMETRY_INSTANCE_TRIANGLE_FRONT_COUNTERCLOCKWISE_BIT_KHR,
     VK_GEOMETRY_INSTANCE_FORCE_OPAQUE_BIT_NV = VK_GEOMETRY_INSTANCE_FORCE_OPAQUE_BIT_KHR,
@@ -11600,6 +11695,28 @@
 #endif
 
 
+#define VK_EXT_shader_atomic_float2 1
+#define VK_EXT_SHADER_ATOMIC_FLOAT_2_SPEC_VERSION 1
+#define VK_EXT_SHADER_ATOMIC_FLOAT_2_EXTENSION_NAME "VK_EXT_shader_atomic_float2"
+typedef struct VkPhysicalDeviceShaderAtomicFloat2FeaturesEXT {
+    VkStructureType    sType;
+    void*              pNext;
+    VkBool32           shaderBufferFloat16Atomics;
+    VkBool32           shaderBufferFloat16AtomicAdd;
+    VkBool32           shaderBufferFloat16AtomicMinMax;
+    VkBool32           shaderBufferFloat32AtomicMinMax;
+    VkBool32           shaderBufferFloat64AtomicMinMax;
+    VkBool32           shaderSharedFloat16Atomics;
+    VkBool32           shaderSharedFloat16AtomicAdd;
+    VkBool32           shaderSharedFloat16AtomicMinMax;
+    VkBool32           shaderSharedFloat32AtomicMinMax;
+    VkBool32           shaderSharedFloat64AtomicMinMax;
+    VkBool32           shaderImageFloat32AtomicMinMax;
+    VkBool32           sparseImageFloat32AtomicMinMax;
+} VkPhysicalDeviceShaderAtomicFloat2FeaturesEXT;
+
+
+
 #define VK_EXT_shader_demote_to_helper_invocation 1
 #define VK_EXT_SHADER_DEMOTE_TO_HELPER_INVOCATION_SPEC_VERSION 1
 #define VK_EXT_SHADER_DEMOTE_TO_HELPER_INVOCATION_EXTENSION_NAME "VK_EXT_shader_demote_to_helper_invocation"
@@ -12382,6 +12499,18 @@
 
 
 
+#define VK_EXT_primitive_topology_list_restart 1
+#define VK_EXT_PRIMITIVE_TOPOLOGY_LIST_RESTART_SPEC_VERSION 1
+#define VK_EXT_PRIMITIVE_TOPOLOGY_LIST_RESTART_EXTENSION_NAME "VK_EXT_primitive_topology_list_restart"
+typedef struct VkPhysicalDevicePrimitiveTopologyListRestartFeaturesEXT {
+    VkStructureType    sType;
+    void*              pNext;
+    VkBool32           primitiveTopologyListRestart;
+    VkBool32           primitiveTopologyPatchListRestart;
+} VkPhysicalDevicePrimitiveTopologyListRestartFeaturesEXT;
+
+
+
 #define VK_HUAWEI_subpass_shading 1
 #define VK_HUAWEI_SUBPASS_SHADING_SPEC_VERSION 2
 #define VK_HUAWEI_SUBPASS_SHADING_EXTENSION_NAME "VK_HUAWEI_subpass_shading"
@@ -12418,6 +12547,25 @@
 #endif
 
 
+#define VK_HUAWEI_invocation_mask 1
+#define VK_HUAWEI_INVOCATION_MASK_SPEC_VERSION 1
+#define VK_HUAWEI_INVOCATION_MASK_EXTENSION_NAME "VK_HUAWEI_invocation_mask"
+typedef struct VkPhysicalDeviceInvocationMaskFeaturesHUAWEI {
+    VkStructureType    sType;
+    void*              pNext;
+    VkBool32           invocationMask;
+} VkPhysicalDeviceInvocationMaskFeaturesHUAWEI;
+
+typedef void (VKAPI_PTR *PFN_vkCmdBindInvocationMaskHUAWEI)(VkCommandBuffer commandBuffer, VkImageView imageView, VkImageLayout imageLayout);
+
+#ifndef VK_NO_PROTOTYPES
+VKAPI_ATTR void VKAPI_CALL vkCmdBindInvocationMaskHUAWEI(
+    VkCommandBuffer                             commandBuffer,
+    VkImageView                                 imageView,
+    VkImageLayout                               imageLayout);
+#endif
+
+
 #define VK_NV_external_memory_rdma 1
 typedef void* VkRemoteAddressNV;
 #define VK_NV_EXTERNAL_MEMORY_RDMA_SPEC_VERSION 1
@@ -12435,12 +12583,12 @@
     VkBool32           externalMemoryRDMA;
 } VkPhysicalDeviceExternalMemoryRDMAFeaturesNV;
 
-typedef VkResult (VKAPI_PTR *PFN_vkGetMemoryRemoteAddressNV)(VkDevice device, const VkMemoryGetRemoteAddressInfoNV* getMemoryRemoteAddressInfo, VkRemoteAddressNV* pAddress);
+typedef VkResult (VKAPI_PTR *PFN_vkGetMemoryRemoteAddressNV)(VkDevice device, const VkMemoryGetRemoteAddressInfoNV* pMemoryGetRemoteAddressInfo, VkRemoteAddressNV* pAddress);
 
 #ifndef VK_NO_PROTOTYPES
 VKAPI_ATTR VkResult VKAPI_CALL vkGetMemoryRemoteAddressNV(
     VkDevice                                    device,
-    const VkMemoryGetRemoteAddressInfoNV*       getMemoryRemoteAddressInfo,
+    const VkMemoryGetRemoteAddressInfoNV*       pMemoryGetRemoteAddressInfo,
     VkRemoteAddressNV*                          pAddress);
 #endif
 
@@ -12579,9 +12727,14 @@
 #endif
 
 
+#define VK_EXT_load_store_op_none 1
+#define VK_EXT_LOAD_STORE_OP_NONE_SPEC_VERSION 1
+#define VK_EXT_LOAD_STORE_OP_NONE_EXTENSION_NAME "VK_EXT_load_store_op_none"
+
+
 #define VK_KHR_acceleration_structure 1
 VK_DEFINE_NON_DISPATCHABLE_HANDLE(VkAccelerationStructureKHR)
-#define VK_KHR_ACCELERATION_STRUCTURE_SPEC_VERSION 11
+#define VK_KHR_ACCELERATION_STRUCTURE_SPEC_VERSION 12
 #define VK_KHR_ACCELERATION_STRUCTURE_EXTENSION_NAME "VK_KHR_acceleration_structure"
 
 typedef enum VkBuildAccelerationStructureModeKHR {
diff --git a/third_party/vulkan-deps/vulkan-headers/src/include/vulkan/vulkan_enums.hpp b/third_party/vulkan-deps/vulkan-headers/src/include/vulkan/vulkan_enums.hpp
index 5939c55..ca535a1 100644
--- a/third_party/vulkan-deps/vulkan-headers/src/include/vulkan/vulkan_enums.hpp
+++ b/third_party/vulkan-deps/vulkan-headers/src/include/vulkan/vulkan_enums.hpp
@@ -672,6 +672,7 @@
     eBufferDeviceAddressCreateInfoEXT            = VK_STRUCTURE_TYPE_BUFFER_DEVICE_ADDRESS_CREATE_INFO_EXT,
     ePhysicalDeviceToolPropertiesEXT             = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TOOL_PROPERTIES_EXT,
     eValidationFeaturesEXT                       = VK_STRUCTURE_TYPE_VALIDATION_FEATURES_EXT,
+    ePhysicalDevicePresentWaitFeaturesKHR        = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PRESENT_WAIT_FEATURES_KHR,
     ePhysicalDeviceCooperativeMatrixFeaturesNV   = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COOPERATIVE_MATRIX_FEATURES_NV,
     eCooperativeMatrixPropertiesNV               = VK_STRUCTURE_TYPE_COOPERATIVE_MATRIX_PROPERTIES_NV,
     ePhysicalDeviceCooperativeMatrixPropertiesNV = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COOPERATIVE_MATRIX_PROPERTIES_NV,
@@ -706,6 +707,7 @@
     ePipelineExecutableInfoKHR                   = VK_STRUCTURE_TYPE_PIPELINE_EXECUTABLE_INFO_KHR,
     ePipelineExecutableStatisticKHR              = VK_STRUCTURE_TYPE_PIPELINE_EXECUTABLE_STATISTIC_KHR,
     ePipelineExecutableInternalRepresentationKHR = VK_STRUCTURE_TYPE_PIPELINE_EXECUTABLE_INTERNAL_REPRESENTATION_KHR,
+    ePhysicalDeviceShaderAtomicFloat2FeaturesEXT = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_ATOMIC_FLOAT_2_FEATURES_EXT,
     ePhysicalDeviceShaderDemoteToHelperInvocationFeaturesEXT =
       VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_DEMOTE_TO_HELPER_INVOCATION_FEATURES_EXT,
     ePhysicalDeviceDeviceGeneratedCommandsPropertiesNV =
@@ -722,6 +724,10 @@
       VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_INHERITED_VIEWPORT_SCISSOR_FEATURES_NV,
     eCommandBufferInheritanceViewportScissorInfoNV =
       VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_VIEWPORT_SCISSOR_INFO_NV,
+    ePhysicalDeviceShaderIntegerDotProductFeaturesKHR =
+      VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_INTEGER_DOT_PRODUCT_FEATURES_KHR,
+    ePhysicalDeviceShaderIntegerDotProductPropertiesKHR =
+      VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_INTEGER_DOT_PRODUCT_PROPERTIES_KHR,
     ePhysicalDeviceTexelBufferAlignmentFeaturesEXT =
       VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TEXEL_BUFFER_ALIGNMENT_FEATURES_EXT,
     ePhysicalDeviceTexelBufferAlignmentPropertiesEXT =
@@ -739,6 +745,8 @@
       VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CUSTOM_BORDER_COLOR_PROPERTIES_EXT,
     ePhysicalDeviceCustomBorderColorFeaturesEXT = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CUSTOM_BORDER_COLOR_FEATURES_EXT,
     ePipelineLibraryCreateInfoKHR               = VK_STRUCTURE_TYPE_PIPELINE_LIBRARY_CREATE_INFO_KHR,
+    ePresentIdKHR                               = VK_STRUCTURE_TYPE_PRESENT_ID_KHR,
+    ePhysicalDevicePresentIdFeaturesKHR         = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PRESENT_ID_FEATURES_KHR,
     ePhysicalDevicePrivateDataFeaturesEXT       = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PRIVATE_DATA_FEATURES_EXT,
     eDevicePrivateDataCreateInfoEXT             = VK_STRUCTURE_TYPE_DEVICE_PRIVATE_DATA_CREATE_INFO_EXT,
     ePrivateDataSlotCreateInfoEXT               = VK_STRUCTURE_TYPE_PRIVATE_DATA_SLOT_CREATE_INFO_EXT,
@@ -808,6 +816,8 @@
     eVertexInputBindingDescription2EXT   = VK_STRUCTURE_TYPE_VERTEX_INPUT_BINDING_DESCRIPTION_2_EXT,
     eVertexInputAttributeDescription2EXT = VK_STRUCTURE_TYPE_VERTEX_INPUT_ATTRIBUTE_DESCRIPTION_2_EXT,
     ePhysicalDeviceDrmPropertiesEXT      = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DRM_PROPERTIES_EXT,
+    ePhysicalDevicePrimitiveTopologyListRestartFeaturesEXT =
+      VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PRIMITIVE_TOPOLOGY_LIST_RESTART_FEATURES_EXT,
 #if defined( VK_USE_PLATFORM_FUCHSIA )
     eImportMemoryZirconHandleInfoFUCHSIA    = VK_STRUCTURE_TYPE_IMPORT_MEMORY_ZIRCON_HANDLE_INFO_FUCHSIA,
     eMemoryZirconHandlePropertiesFUCHSIA    = VK_STRUCTURE_TYPE_MEMORY_ZIRCON_HANDLE_PROPERTIES_FUCHSIA,
@@ -818,6 +828,7 @@
     eSubpassShadingPipelineCreateInfoHUAWEI       = VK_STRUCTURE_TYPE_SUBPASS_SHADING_PIPELINE_CREATE_INFO_HUAWEI,
     ePhysicalDeviceSubpassShadingFeaturesHUAWEI   = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SUBPASS_SHADING_FEATURES_HUAWEI,
     ePhysicalDeviceSubpassShadingPropertiesHUAWEI = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SUBPASS_SHADING_PROPERTIES_HUAWEI,
+    ePhysicalDeviceInvocationMaskFeaturesHUAWEI   = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_INVOCATION_MASK_FEATURES_HUAWEI,
     eMemoryGetRemoteAddressInfoNV                 = VK_STRUCTURE_TYPE_MEMORY_GET_REMOTE_ADDRESS_INFO_NV,
     ePhysicalDeviceExternalMemoryRdmaFeaturesNV   = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_MEMORY_RDMA_FEATURES_NV,
     ePhysicalDeviceExtendedDynamicState2FeaturesEXT =
@@ -1549,6 +1560,7 @@
       case StructureType::eBufferDeviceAddressCreateInfoEXT: return "BufferDeviceAddressCreateInfoEXT";
       case StructureType::ePhysicalDeviceToolPropertiesEXT: return "PhysicalDeviceToolPropertiesEXT";
       case StructureType::eValidationFeaturesEXT: return "ValidationFeaturesEXT";
+      case StructureType::ePhysicalDevicePresentWaitFeaturesKHR: return "PhysicalDevicePresentWaitFeaturesKHR";
       case StructureType::ePhysicalDeviceCooperativeMatrixFeaturesNV:
         return "PhysicalDeviceCooperativeMatrixFeaturesNV";
       case StructureType::eCooperativeMatrixPropertiesNV: return "CooperativeMatrixPropertiesNV";
@@ -1594,6 +1606,8 @@
       case StructureType::ePipelineExecutableStatisticKHR: return "PipelineExecutableStatisticKHR";
       case StructureType::ePipelineExecutableInternalRepresentationKHR:
         return "PipelineExecutableInternalRepresentationKHR";
+      case StructureType::ePhysicalDeviceShaderAtomicFloat2FeaturesEXT:
+        return "PhysicalDeviceShaderAtomicFloat2FeaturesEXT";
       case StructureType::ePhysicalDeviceShaderDemoteToHelperInvocationFeaturesEXT:
         return "PhysicalDeviceShaderDemoteToHelperInvocationFeaturesEXT";
       case StructureType::ePhysicalDeviceDeviceGeneratedCommandsPropertiesNV:
@@ -1611,6 +1625,10 @@
         return "PhysicalDeviceInheritedViewportScissorFeaturesNV";
       case StructureType::eCommandBufferInheritanceViewportScissorInfoNV:
         return "CommandBufferInheritanceViewportScissorInfoNV";
+      case StructureType::ePhysicalDeviceShaderIntegerDotProductFeaturesKHR:
+        return "PhysicalDeviceShaderIntegerDotProductFeaturesKHR";
+      case StructureType::ePhysicalDeviceShaderIntegerDotProductPropertiesKHR:
+        return "PhysicalDeviceShaderIntegerDotProductPropertiesKHR";
       case StructureType::ePhysicalDeviceTexelBufferAlignmentFeaturesEXT:
         return "PhysicalDeviceTexelBufferAlignmentFeaturesEXT";
       case StructureType::ePhysicalDeviceTexelBufferAlignmentPropertiesEXT:
@@ -1630,6 +1648,8 @@
       case StructureType::ePhysicalDeviceCustomBorderColorFeaturesEXT:
         return "PhysicalDeviceCustomBorderColorFeaturesEXT";
       case StructureType::ePipelineLibraryCreateInfoKHR: return "PipelineLibraryCreateInfoKHR";
+      case StructureType::ePresentIdKHR: return "PresentIdKHR";
+      case StructureType::ePhysicalDevicePresentIdFeaturesKHR: return "PhysicalDevicePresentIdFeaturesKHR";
       case StructureType::ePhysicalDevicePrivateDataFeaturesEXT: return "PhysicalDevicePrivateDataFeaturesEXT";
       case StructureType::eDevicePrivateDataCreateInfoEXT: return "DevicePrivateDataCreateInfoEXT";
       case StructureType::ePrivateDataSlotCreateInfoEXT: return "PrivateDataSlotCreateInfoEXT";
@@ -1701,6 +1721,8 @@
       case StructureType::eVertexInputBindingDescription2EXT: return "VertexInputBindingDescription2EXT";
       case StructureType::eVertexInputAttributeDescription2EXT: return "VertexInputAttributeDescription2EXT";
       case StructureType::ePhysicalDeviceDrmPropertiesEXT: return "PhysicalDeviceDrmPropertiesEXT";
+      case StructureType::ePhysicalDevicePrimitiveTopologyListRestartFeaturesEXT:
+        return "PhysicalDevicePrimitiveTopologyListRestartFeaturesEXT";
 #if defined( VK_USE_PLATFORM_FUCHSIA )
       case StructureType::eImportMemoryZirconHandleInfoFUCHSIA: return "ImportMemoryZirconHandleInfoFUCHSIA";
       case StructureType::eMemoryZirconHandlePropertiesFUCHSIA: return "MemoryZirconHandlePropertiesFUCHSIA";
@@ -1713,6 +1735,8 @@
         return "PhysicalDeviceSubpassShadingFeaturesHUAWEI";
       case StructureType::ePhysicalDeviceSubpassShadingPropertiesHUAWEI:
         return "PhysicalDeviceSubpassShadingPropertiesHUAWEI";
+      case StructureType::ePhysicalDeviceInvocationMaskFeaturesHUAWEI:
+        return "PhysicalDeviceInvocationMaskFeaturesHUAWEI";
       case StructureType::eMemoryGetRemoteAddressInfoNV: return "MemoryGetRemoteAddressInfoNV";
       case StructureType::ePhysicalDeviceExternalMemoryRdmaFeaturesNV:
         return "PhysicalDeviceExternalMemoryRdmaFeaturesNV";
@@ -2629,7 +2653,8 @@
     eVideoEncodeSrcKHR = VK_IMAGE_USAGE_VIDEO_ENCODE_SRC_BIT_KHR,
     eVideoEncodeDpbKHR = VK_IMAGE_USAGE_VIDEO_ENCODE_DPB_BIT_KHR,
 #endif /*VK_ENABLE_BETA_EXTENSIONS*/
-    eShadingRateImageNV = VK_IMAGE_USAGE_SHADING_RATE_IMAGE_BIT_NV
+    eInvocationMaskHUAWEI = VK_IMAGE_USAGE_INVOCATION_MASK_BIT_HUAWEI,
+    eShadingRateImageNV   = VK_IMAGE_USAGE_SHADING_RATE_IMAGE_BIT_NV
   };
 
   VULKAN_HPP_INLINE std::string to_string( ImageUsageFlagBits value )
@@ -2656,6 +2681,7 @@
       case ImageUsageFlagBits::eVideoEncodeSrcKHR: return "VideoEncodeSrcKHR";
       case ImageUsageFlagBits::eVideoEncodeDpbKHR: return "VideoEncodeDpbKHR";
 #endif /*VK_ENABLE_BETA_EXTENSIONS*/
+      case ImageUsageFlagBits::eInvocationMaskHUAWEI: return "InvocationMaskHUAWEI";
       default: return "invalid ( " + VULKAN_HPP_NAMESPACE::toHexString( static_cast<uint32_t>( value ) ) + " )";
     }
   }
@@ -2821,18 +2847,22 @@
     }
   }
 
-  enum class DeviceQueueCreateFlagBits : VkDeviceQueueCreateFlags
+  enum class InstanceCreateFlagBits
   {
-    eProtected = VK_DEVICE_QUEUE_CREATE_PROTECTED_BIT
   };
 
-  VULKAN_HPP_INLINE std::string to_string( DeviceQueueCreateFlagBits value )
+  VULKAN_HPP_INLINE std::string to_string( InstanceCreateFlagBits )
   {
-    switch ( value )
-    {
-      case DeviceQueueCreateFlagBits::eProtected: return "Protected";
-      default: return "invalid ( " + VULKAN_HPP_NAMESPACE::toHexString( static_cast<uint32_t>( value ) ) + " )";
-    }
+    return "(void)";
+  }
+
+  enum class DeviceCreateFlagBits
+  {
+  };
+
+  VULKAN_HPP_INLINE std::string to_string( DeviceCreateFlagBits )
+  {
+    return "(void)";
   }
 
   enum class PipelineStageFlagBits : VkPipelineStageFlags
@@ -2904,6 +2934,15 @@
     }
   }
 
+  enum class MemoryMapFlagBits : VkMemoryMapFlags
+  {
+  };
+
+  VULKAN_HPP_INLINE std::string to_string( MemoryMapFlagBits )
+  {
+    return "(void)";
+  }
+
   enum class ImageAspectFlagBits : VkImageAspectFlags
   {
     eColor           = VK_IMAGE_ASPECT_COLOR_BIT,
@@ -2987,6 +3026,15 @@
     }
   }
 
+  enum class SemaphoreCreateFlagBits : VkSemaphoreCreateFlags
+  {
+  };
+
+  VULKAN_HPP_INLINE std::string to_string( SemaphoreCreateFlagBits )
+  {
+    return "(void)";
+  }
+
   enum class EventCreateFlagBits : VkEventCreateFlags
   {
     eDeviceOnlyKHR = VK_EVENT_CREATE_DEVICE_ONLY_BIT_KHR
@@ -3105,6 +3153,15 @@
     }
   }
 
+  enum class QueryPoolCreateFlagBits
+  {
+  };
+
+  VULKAN_HPP_INLINE std::string to_string( QueryPoolCreateFlagBits )
+  {
+    return "(void)";
+  }
+
   enum class BufferCreateFlagBits : VkBufferCreateFlags
   {
     eSparseBinding                 = VK_BUFFER_CREATE_SPARSE_BINDING_BIT,
@@ -3209,6 +3266,15 @@
     }
   }
 
+  enum class BufferViewCreateFlagBits : VkBufferViewCreateFlags
+  {
+  };
+
+  VULKAN_HPP_INLINE std::string to_string( BufferViewCreateFlagBits )
+  {
+    return "(void)";
+  }
+
   enum class ImageLayout
   {
     eUndefined                             = VK_IMAGE_LAYOUT_UNDEFINED,
@@ -3367,20 +3433,6 @@
     return "(void)";
   }
 
-  enum class PipelineCacheCreateFlagBits : VkPipelineCacheCreateFlags
-  {
-    eExternallySynchronizedEXT = VK_PIPELINE_CACHE_CREATE_EXTERNALLY_SYNCHRONIZED_BIT_EXT
-  };
-
-  VULKAN_HPP_INLINE std::string to_string( PipelineCacheCreateFlagBits value )
-  {
-    switch ( value )
-    {
-      case PipelineCacheCreateFlagBits::eExternallySynchronizedEXT: return "ExternallySynchronizedEXT";
-      default: return "invalid ( " + VULKAN_HPP_NAMESPACE::toHexString( static_cast<uint32_t>( value ) ) + " )";
-    }
-  }
-
   enum class BlendFactor
   {
     eZero                  = VK_BLEND_FACTOR_ZERO,
@@ -3982,6 +4034,96 @@
     }
   }
 
+  enum class PipelineColorBlendStateCreateFlagBits : VkPipelineColorBlendStateCreateFlags
+  {
+  };
+
+  VULKAN_HPP_INLINE std::string to_string( PipelineColorBlendStateCreateFlagBits )
+  {
+    return "(void)";
+  }
+
+  enum class PipelineDepthStencilStateCreateFlagBits : VkPipelineDepthStencilStateCreateFlags
+  {
+  };
+
+  VULKAN_HPP_INLINE std::string to_string( PipelineDepthStencilStateCreateFlagBits )
+  {
+    return "(void)";
+  }
+
+  enum class PipelineDynamicStateCreateFlagBits : VkPipelineDynamicStateCreateFlags
+  {
+  };
+
+  VULKAN_HPP_INLINE std::string to_string( PipelineDynamicStateCreateFlagBits )
+  {
+    return "(void)";
+  }
+
+  enum class PipelineInputAssemblyStateCreateFlagBits : VkPipelineInputAssemblyStateCreateFlags
+  {
+  };
+
+  VULKAN_HPP_INLINE std::string to_string( PipelineInputAssemblyStateCreateFlagBits )
+  {
+    return "(void)";
+  }
+
+  enum class PipelineLayoutCreateFlagBits : VkPipelineLayoutCreateFlags
+  {
+  };
+
+  VULKAN_HPP_INLINE std::string to_string( PipelineLayoutCreateFlagBits )
+  {
+    return "(void)";
+  }
+
+  enum class PipelineMultisampleStateCreateFlagBits : VkPipelineMultisampleStateCreateFlags
+  {
+  };
+
+  VULKAN_HPP_INLINE std::string to_string( PipelineMultisampleStateCreateFlagBits )
+  {
+    return "(void)";
+  }
+
+  enum class PipelineRasterizationStateCreateFlagBits : VkPipelineRasterizationStateCreateFlags
+  {
+  };
+
+  VULKAN_HPP_INLINE std::string to_string( PipelineRasterizationStateCreateFlagBits )
+  {
+    return "(void)";
+  }
+
+  enum class PipelineTessellationStateCreateFlagBits : VkPipelineTessellationStateCreateFlags
+  {
+  };
+
+  VULKAN_HPP_INLINE std::string to_string( PipelineTessellationStateCreateFlagBits )
+  {
+    return "(void)";
+  }
+
+  enum class PipelineVertexInputStateCreateFlagBits : VkPipelineVertexInputStateCreateFlags
+  {
+  };
+
+  VULKAN_HPP_INLINE std::string to_string( PipelineVertexInputStateCreateFlagBits )
+  {
+    return "(void)";
+  }
+
+  enum class PipelineViewportStateCreateFlagBits : VkPipelineViewportStateCreateFlags
+  {
+  };
+
+  VULKAN_HPP_INLINE std::string to_string( PipelineViewportStateCreateFlagBits )
+  {
+    return "(void)";
+  }
+
   enum class BorderColor
   {
     eFloatTransparentBlack = VK_BORDER_COLOR_FLOAT_TRANSPARENT_BLACK,
@@ -4164,6 +4306,15 @@
     }
   }
 
+  enum class DescriptorPoolResetFlagBits : VkDescriptorPoolResetFlags
+  {
+  };
+
+  VULKAN_HPP_INLINE std::string to_string( DescriptorPoolResetFlagBits )
+  {
+    return "(void)";
+  }
+
   enum class AccessFlagBits : VkAccessFlags
   {
     eIndirectCommandRead                  = VK_ACCESS_INDIRECT_COMMAND_READ_BIT,
@@ -4255,7 +4406,8 @@
   {
     eLoad     = VK_ATTACHMENT_LOAD_OP_LOAD,
     eClear    = VK_ATTACHMENT_LOAD_OP_CLEAR,
-    eDontCare = VK_ATTACHMENT_LOAD_OP_DONT_CARE
+    eDontCare = VK_ATTACHMENT_LOAD_OP_DONT_CARE,
+    eNoneEXT  = VK_ATTACHMENT_LOAD_OP_NONE_EXT
   };
 
   VULKAN_HPP_INLINE std::string to_string( AttachmentLoadOp value )
@@ -4265,6 +4417,7 @@
       case AttachmentLoadOp::eLoad: return "Load";
       case AttachmentLoadOp::eClear: return "Clear";
       case AttachmentLoadOp::eDontCare: return "DontCare";
+      case AttachmentLoadOp::eNoneEXT: return "NoneEXT";
       default: return "invalid ( " + VULKAN_HPP_NAMESPACE::toHexString( static_cast<uint32_t>( value ) ) + " )";
     }
   }
@@ -4273,6 +4426,7 @@
   {
     eStore    = VK_ATTACHMENT_STORE_OP_STORE,
     eDontCare = VK_ATTACHMENT_STORE_OP_DONT_CARE,
+    eNoneEXT  = VK_ATTACHMENT_STORE_OP_NONE_EXT,
     eNoneQCOM = VK_ATTACHMENT_STORE_OP_NONE_QCOM
   };
 
@@ -4282,7 +4436,7 @@
     {
       case AttachmentStoreOp::eStore: return "Store";
       case AttachmentStoreOp::eDontCare: return "DontCare";
-      case AttachmentStoreOp::eNoneQCOM: return "NoneQCOM";
+      case AttachmentStoreOp::eNoneEXT: return "NoneEXT";
       default: return "invalid ( " + VULKAN_HPP_NAMESPACE::toHexString( static_cast<uint32_t>( value ) ) + " )";
     }
   }
@@ -4527,159 +4681,6 @@
     }
   }
 
-  enum class InstanceCreateFlagBits
-  {
-  };
-
-  VULKAN_HPP_INLINE std::string to_string( InstanceCreateFlagBits )
-  {
-    return "(void)";
-  }
-
-  enum class DeviceCreateFlagBits
-  {
-  };
-
-  VULKAN_HPP_INLINE std::string to_string( DeviceCreateFlagBits )
-  {
-    return "(void)";
-  }
-
-  enum class MemoryMapFlagBits : VkMemoryMapFlags
-  {
-  };
-
-  VULKAN_HPP_INLINE std::string to_string( MemoryMapFlagBits )
-  {
-    return "(void)";
-  }
-
-  enum class SemaphoreCreateFlagBits : VkSemaphoreCreateFlags
-  {
-  };
-
-  VULKAN_HPP_INLINE std::string to_string( SemaphoreCreateFlagBits )
-  {
-    return "(void)";
-  }
-
-  enum class QueryPoolCreateFlagBits
-  {
-  };
-
-  VULKAN_HPP_INLINE std::string to_string( QueryPoolCreateFlagBits )
-  {
-    return "(void)";
-  }
-
-  enum class BufferViewCreateFlagBits : VkBufferViewCreateFlags
-  {
-  };
-
-  VULKAN_HPP_INLINE std::string to_string( BufferViewCreateFlagBits )
-  {
-    return "(void)";
-  }
-
-  enum class PipelineColorBlendStateCreateFlagBits : VkPipelineColorBlendStateCreateFlags
-  {
-  };
-
-  VULKAN_HPP_INLINE std::string to_string( PipelineColorBlendStateCreateFlagBits )
-  {
-    return "(void)";
-  }
-
-  enum class PipelineDepthStencilStateCreateFlagBits : VkPipelineDepthStencilStateCreateFlags
-  {
-  };
-
-  VULKAN_HPP_INLINE std::string to_string( PipelineDepthStencilStateCreateFlagBits )
-  {
-    return "(void)";
-  }
-
-  enum class PipelineDynamicStateCreateFlagBits : VkPipelineDynamicStateCreateFlags
-  {
-  };
-
-  VULKAN_HPP_INLINE std::string to_string( PipelineDynamicStateCreateFlagBits )
-  {
-    return "(void)";
-  }
-
-  enum class PipelineInputAssemblyStateCreateFlagBits : VkPipelineInputAssemblyStateCreateFlags
-  {
-  };
-
-  VULKAN_HPP_INLINE std::string to_string( PipelineInputAssemblyStateCreateFlagBits )
-  {
-    return "(void)";
-  }
-
-  enum class PipelineLayoutCreateFlagBits : VkPipelineLayoutCreateFlags
-  {
-  };
-
-  VULKAN_HPP_INLINE std::string to_string( PipelineLayoutCreateFlagBits )
-  {
-    return "(void)";
-  }
-
-  enum class PipelineMultisampleStateCreateFlagBits : VkPipelineMultisampleStateCreateFlags
-  {
-  };
-
-  VULKAN_HPP_INLINE std::string to_string( PipelineMultisampleStateCreateFlagBits )
-  {
-    return "(void)";
-  }
-
-  enum class PipelineRasterizationStateCreateFlagBits : VkPipelineRasterizationStateCreateFlags
-  {
-  };
-
-  VULKAN_HPP_INLINE std::string to_string( PipelineRasterizationStateCreateFlagBits )
-  {
-    return "(void)";
-  }
-
-  enum class PipelineTessellationStateCreateFlagBits : VkPipelineTessellationStateCreateFlags
-  {
-  };
-
-  VULKAN_HPP_INLINE std::string to_string( PipelineTessellationStateCreateFlagBits )
-  {
-    return "(void)";
-  }
-
-  enum class PipelineVertexInputStateCreateFlagBits : VkPipelineVertexInputStateCreateFlags
-  {
-  };
-
-  VULKAN_HPP_INLINE std::string to_string( PipelineVertexInputStateCreateFlagBits )
-  {
-    return "(void)";
-  }
-
-  enum class PipelineViewportStateCreateFlagBits : VkPipelineViewportStateCreateFlags
-  {
-  };
-
-  VULKAN_HPP_INLINE std::string to_string( PipelineViewportStateCreateFlagBits )
-  {
-    return "(void)";
-  }
-
-  enum class DescriptorPoolResetFlagBits : VkDescriptorPoolResetFlags
-  {
-  };
-
-  VULKAN_HPP_INLINE std::string to_string( DescriptorPoolResetFlagBits )
-  {
-    return "(void)";
-  }
-
   //=== VK_VERSION_1_1 ===
 
   enum class SubgroupFeatureFlagBits : VkSubgroupFeatureFlags
@@ -4752,6 +4753,15 @@
     }
   }
 
+  enum class CommandPoolTrimFlagBits : VkCommandPoolTrimFlags
+  {
+  };
+
+  VULKAN_HPP_INLINE std::string to_string( CommandPoolTrimFlagBits )
+  {
+    return "(void)";
+  }
+
   enum class PointClippingBehavior
   {
     eAllClipPlanes      = VK_POINT_CLIPPING_BEHAVIOR_ALL_CLIP_PLANES,
@@ -4786,6 +4796,20 @@
     }
   }
 
+  enum class DeviceQueueCreateFlagBits : VkDeviceQueueCreateFlags
+  {
+    eProtected = VK_DEVICE_QUEUE_CREATE_PROTECTED_BIT
+  };
+
+  VULKAN_HPP_INLINE std::string to_string( DeviceQueueCreateFlagBits value )
+  {
+    switch ( value )
+    {
+      case DeviceQueueCreateFlagBits::eProtected: return "Protected";
+      default: return "invalid ( " + VULKAN_HPP_NAMESPACE::toHexString( static_cast<uint32_t>( value ) ) + " )";
+    }
+  }
+
   enum class SamplerYcbcrModelConversion
   {
     eRgbIdentity   = VK_SAMPLER_YCBCR_MODEL_CONVERSION_RGB_IDENTITY,
@@ -4860,6 +4884,15 @@
     }
   }
 
+  enum class DescriptorUpdateTemplateCreateFlagBits : VkDescriptorUpdateTemplateCreateFlags
+  {
+  };
+
+  VULKAN_HPP_INLINE std::string to_string( DescriptorUpdateTemplateCreateFlagBits )
+  {
+    return "(void)";
+  }
+
   enum class ExternalMemoryHandleTypeFlagBits : VkExternalMemoryHandleTypeFlags
   {
     eOpaqueFd        = VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_FD_BIT,
@@ -5041,24 +5074,6 @@
     }
   }
 
-  enum class CommandPoolTrimFlagBits : VkCommandPoolTrimFlags
-  {
-  };
-
-  VULKAN_HPP_INLINE std::string to_string( CommandPoolTrimFlagBits )
-  {
-    return "(void)";
-  }
-
-  enum class DescriptorUpdateTemplateCreateFlagBits : VkDescriptorUpdateTemplateCreateFlags
-  {
-  };
-
-  VULKAN_HPP_INLINE std::string to_string( DescriptorUpdateTemplateCreateFlagBits )
-  {
-    return "(void)";
-  }
-
   //=== VK_VERSION_1_2 ===
 
   enum class DriverId
@@ -5078,7 +5093,8 @@
     eMesaLlvmpipe            = VK_DRIVER_ID_MESA_LLVMPIPE,
     eMoltenvk                = VK_DRIVER_ID_MOLTENVK,
     eCoreaviProprietary      = VK_DRIVER_ID_COREAVI_PROPRIETARY,
-    eJuiceProprietary        = VK_DRIVER_ID_JUICE_PROPRIETARY
+    eJuiceProprietary        = VK_DRIVER_ID_JUICE_PROPRIETARY,
+    eVerisiliconProprietary  = VK_DRIVER_ID_VERISILICON_PROPRIETARY
   };
   using DriverIdKHR = DriverId;
 
@@ -5102,6 +5118,7 @@
       case DriverId::eMoltenvk: return "Moltenvk";
       case DriverId::eCoreaviProprietary: return "CoreaviProprietary";
       case DriverId::eJuiceProprietary: return "JuiceProprietary";
+      case DriverId::eVerisiliconProprietary: return "VerisiliconProprietary";
       default: return "invalid ( " + VULKAN_HPP_NAMESPACE::toHexString( static_cast<uint32_t>( value ) ) + " )";
     }
   }
@@ -5690,18 +5707,18 @@
     }
   }
 
-  enum class VideoCapabilitiesFlagBitsKHR : VkVideoCapabilitiesFlagsKHR
+  enum class VideoCapabilityFlagBitsKHR : VkVideoCapabilityFlagsKHR
   {
-    eProtectedContent        = VK_VIDEO_CAPABILITIES_PROTECTED_CONTENT_BIT_KHR,
-    eSeparateReferenceImages = VK_VIDEO_CAPABILITIES_SEPARATE_REFERENCE_IMAGES_BIT_KHR
+    eProtectedContent        = VK_VIDEO_CAPABILITY_PROTECTED_CONTENT_BIT_KHR,
+    eSeparateReferenceImages = VK_VIDEO_CAPABILITY_SEPARATE_REFERENCE_IMAGES_BIT_KHR
   };
 
-  VULKAN_HPP_INLINE std::string to_string( VideoCapabilitiesFlagBitsKHR value )
+  VULKAN_HPP_INLINE std::string to_string( VideoCapabilityFlagBitsKHR value )
   {
     switch ( value )
     {
-      case VideoCapabilitiesFlagBitsKHR::eProtectedContent: return "ProtectedContent";
-      case VideoCapabilitiesFlagBitsKHR::eSeparateReferenceImages: return "SeparateReferenceImages";
+      case VideoCapabilityFlagBitsKHR::eProtectedContent: return "ProtectedContent";
+      case VideoCapabilityFlagBitsKHR::eSeparateReferenceImages: return "SeparateReferenceImages";
       default: return "invalid ( " + VULKAN_HPP_NAMESPACE::toHexString( static_cast<uint32_t>( value ) ) + " )";
     }
   }
@@ -5829,53 +5846,36 @@
 #if defined( VK_ENABLE_BETA_EXTENSIONS )
   //=== VK_EXT_video_encode_h264 ===
 
-  enum class VideoEncodeH264CapabilitiesFlagBitsEXT : VkVideoEncodeH264CapabilitiesFlagsEXT
+  enum class VideoEncodeH264CapabilityFlagBitsEXT : VkVideoEncodeH264CapabilityFlagsEXT
   {
-    eVkVideoEncodeH264CapabilityCabac = VK_VIDEO_ENCODE_H264_CAPABILITY_CABAC_BIT_EXT,
-    eVkVideoEncodeH264CapabilityCavlc = VK_VIDEO_ENCODE_H264_CAPABILITY_CAVLC_BIT_EXT,
-    eVkVideoEncodeH264CapabilityWeightedBiPredImplicit =
-      VK_VIDEO_ENCODE_H264_CAPABILITY_WEIGHTED_BI_PRED_IMPLICIT_BIT_EXT,
-    eVkVideoEncodeH264CapabilityTransform8X8         = VK_VIDEO_ENCODE_H264_CAPABILITY_TRANSFORM_8X8_BIT_EXT,
-    eVkVideoEncodeH264CapabilityChromaQpOffset       = VK_VIDEO_ENCODE_H264_CAPABILITY_CHROMA_QP_OFFSET_BIT_EXT,
-    eVkVideoEncodeH264CapabilitySecondChromaQpOffset = VK_VIDEO_ENCODE_H264_CAPABILITY_SECOND_CHROMA_QP_OFFSET_BIT_EXT,
-    eVkVideoEncodeH264CapabilityDeblockingFilterDisabled =
-      VK_VIDEO_ENCODE_H264_CAPABILITY_DEBLOCKING_FILTER_DISABLED_BIT_EXT,
-    eVkVideoEncodeH264CapabilityDeblockingFilterEnabled =
-      VK_VIDEO_ENCODE_H264_CAPABILITY_DEBLOCKING_FILTER_ENABLED_BIT_EXT,
-    eVkVideoEncodeH264CapabilityDeblockingFilterPartial =
-      VK_VIDEO_ENCODE_H264_CAPABILITY_DEBLOCKING_FILTER_PARTIAL_BIT_EXT,
-    eVkVideoEncodeH264CapabilityMultipleSlicePerFrame =
-      VK_VIDEO_ENCODE_H264_CAPABILITY_MULTIPLE_SLICE_PER_FRAME_BIT_EXT,
-    eVkVideoEncodeH264CapabilityEvenlyDistributedSliceSize =
-      VK_VIDEO_ENCODE_H264_CAPABILITY_EVENLY_DISTRIBUTED_SLICE_SIZE_BIT_EXT
+    eCabac                      = VK_VIDEO_ENCODE_H264_CAPABILITY_CABAC_BIT_EXT,
+    eCavlc                      = VK_VIDEO_ENCODE_H264_CAPABILITY_CAVLC_BIT_EXT,
+    eWeightedBiPredImplicit     = VK_VIDEO_ENCODE_H264_CAPABILITY_WEIGHTED_BI_PRED_IMPLICIT_BIT_EXT,
+    eTransform8X8               = VK_VIDEO_ENCODE_H264_CAPABILITY_TRANSFORM_8X8_BIT_EXT,
+    eChromaQpOffset             = VK_VIDEO_ENCODE_H264_CAPABILITY_CHROMA_QP_OFFSET_BIT_EXT,
+    eSecondChromaQpOffset       = VK_VIDEO_ENCODE_H264_CAPABILITY_SECOND_CHROMA_QP_OFFSET_BIT_EXT,
+    eDeblockingFilterDisabled   = VK_VIDEO_ENCODE_H264_CAPABILITY_DEBLOCKING_FILTER_DISABLED_BIT_EXT,
+    eDeblockingFilterEnabled    = VK_VIDEO_ENCODE_H264_CAPABILITY_DEBLOCKING_FILTER_ENABLED_BIT_EXT,
+    eDeblockingFilterPartial    = VK_VIDEO_ENCODE_H264_CAPABILITY_DEBLOCKING_FILTER_PARTIAL_BIT_EXT,
+    eMultipleSlicePerFrame      = VK_VIDEO_ENCODE_H264_CAPABILITY_MULTIPLE_SLICE_PER_FRAME_BIT_EXT,
+    eEvenlyDistributedSliceSize = VK_VIDEO_ENCODE_H264_CAPABILITY_EVENLY_DISTRIBUTED_SLICE_SIZE_BIT_EXT
   };
 
-  VULKAN_HPP_INLINE std::string to_string( VideoEncodeH264CapabilitiesFlagBitsEXT value )
+  VULKAN_HPP_INLINE std::string to_string( VideoEncodeH264CapabilityFlagBitsEXT value )
   {
     switch ( value )
     {
-      case VideoEncodeH264CapabilitiesFlagBitsEXT::eVkVideoEncodeH264CapabilityCabac:
-        return "VkVideoEncodeH264CapabilityCabac";
-      case VideoEncodeH264CapabilitiesFlagBitsEXT::eVkVideoEncodeH264CapabilityCavlc:
-        return "VkVideoEncodeH264CapabilityCavlc";
-      case VideoEncodeH264CapabilitiesFlagBitsEXT::eVkVideoEncodeH264CapabilityWeightedBiPredImplicit:
-        return "VkVideoEncodeH264CapabilityWeightedBiPredImplicit";
-      case VideoEncodeH264CapabilitiesFlagBitsEXT::eVkVideoEncodeH264CapabilityTransform8X8:
-        return "VkVideoEncodeH264CapabilityTransform8X8";
-      case VideoEncodeH264CapabilitiesFlagBitsEXT::eVkVideoEncodeH264CapabilityChromaQpOffset:
-        return "VkVideoEncodeH264CapabilityChromaQpOffset";
-      case VideoEncodeH264CapabilitiesFlagBitsEXT::eVkVideoEncodeH264CapabilitySecondChromaQpOffset:
-        return "VkVideoEncodeH264CapabilitySecondChromaQpOffset";
-      case VideoEncodeH264CapabilitiesFlagBitsEXT::eVkVideoEncodeH264CapabilityDeblockingFilterDisabled:
-        return "VkVideoEncodeH264CapabilityDeblockingFilterDisabled";
-      case VideoEncodeH264CapabilitiesFlagBitsEXT::eVkVideoEncodeH264CapabilityDeblockingFilterEnabled:
-        return "VkVideoEncodeH264CapabilityDeblockingFilterEnabled";
-      case VideoEncodeH264CapabilitiesFlagBitsEXT::eVkVideoEncodeH264CapabilityDeblockingFilterPartial:
-        return "VkVideoEncodeH264CapabilityDeblockingFilterPartial";
-      case VideoEncodeH264CapabilitiesFlagBitsEXT::eVkVideoEncodeH264CapabilityMultipleSlicePerFrame:
-        return "VkVideoEncodeH264CapabilityMultipleSlicePerFrame";
-      case VideoEncodeH264CapabilitiesFlagBitsEXT::eVkVideoEncodeH264CapabilityEvenlyDistributedSliceSize:
-        return "VkVideoEncodeH264CapabilityEvenlyDistributedSliceSize";
+      case VideoEncodeH264CapabilityFlagBitsEXT::eCabac: return "Cabac";
+      case VideoEncodeH264CapabilityFlagBitsEXT::eCavlc: return "Cavlc";
+      case VideoEncodeH264CapabilityFlagBitsEXT::eWeightedBiPredImplicit: return "WeightedBiPredImplicit";
+      case VideoEncodeH264CapabilityFlagBitsEXT::eTransform8X8: return "Transform8X8";
+      case VideoEncodeH264CapabilityFlagBitsEXT::eChromaQpOffset: return "ChromaQpOffset";
+      case VideoEncodeH264CapabilityFlagBitsEXT::eSecondChromaQpOffset: return "SecondChromaQpOffset";
+      case VideoEncodeH264CapabilityFlagBitsEXT::eDeblockingFilterDisabled: return "DeblockingFilterDisabled";
+      case VideoEncodeH264CapabilityFlagBitsEXT::eDeblockingFilterEnabled: return "DeblockingFilterEnabled";
+      case VideoEncodeH264CapabilityFlagBitsEXT::eDeblockingFilterPartial: return "DeblockingFilterPartial";
+      case VideoEncodeH264CapabilityFlagBitsEXT::eMultipleSlicePerFrame: return "MultipleSlicePerFrame";
+      case VideoEncodeH264CapabilityFlagBitsEXT::eEvenlyDistributedSliceSize: return "EvenlyDistributedSliceSize";
       default: return "invalid ( " + VULKAN_HPP_NAMESPACE::toHexString( static_cast<uint32_t>( value ) ) + " )";
     }
   }
@@ -5936,21 +5936,20 @@
 #if defined( VK_ENABLE_BETA_EXTENSIONS )
   //=== VK_EXT_video_decode_h264 ===
 
-  enum class VideoDecodeH264FieldLayoutFlagBitsEXT : VkVideoDecodeH264FieldLayoutFlagsEXT
+  enum class VideoDecodeH264PictureLayoutFlagBitsEXT : VkVideoDecodeH264PictureLayoutFlagsEXT
   {
-    eVkVideoDecodeH264ProgressivePicturesOnly = VK_VIDEO_DECODE_H264_PROGRESSIVE_PICTURES_ONLY_EXT,
-    eLineInterlacedPlane                      = VK_VIDEO_DECODE_H264_FIELD_LAYOUT_LINE_INTERLACED_PLANE_BIT_EXT,
-    eSeparateInterlacedPlane                  = VK_VIDEO_DECODE_H264_FIELD_LAYOUT_SEPARATE_INTERLACED_PLANE_BIT_EXT
+    eProgressive                = VK_VIDEO_DECODE_H264_PICTURE_LAYOUT_PROGRESSIVE_EXT,
+    eInterlacedInterleavedLines = VK_VIDEO_DECODE_H264_PICTURE_LAYOUT_INTERLACED_INTERLEAVED_LINES_BIT_EXT,
+    eInterlacedSeparatePlanes   = VK_VIDEO_DECODE_H264_PICTURE_LAYOUT_INTERLACED_SEPARATE_PLANES_BIT_EXT
   };
 
-  VULKAN_HPP_INLINE std::string to_string( VideoDecodeH264FieldLayoutFlagBitsEXT value )
+  VULKAN_HPP_INLINE std::string to_string( VideoDecodeH264PictureLayoutFlagBitsEXT value )
   {
     switch ( value )
     {
-      case VideoDecodeH264FieldLayoutFlagBitsEXT::eVkVideoDecodeH264ProgressivePicturesOnly:
-        return "VkVideoDecodeH264ProgressivePicturesOnly";
-      case VideoDecodeH264FieldLayoutFlagBitsEXT::eLineInterlacedPlane: return "LineInterlacedPlane";
-      case VideoDecodeH264FieldLayoutFlagBitsEXT::eSeparateInterlacedPlane: return "SeparateInterlacedPlane";
+      case VideoDecodeH264PictureLayoutFlagBitsEXT::eProgressive: return "Progressive";
+      case VideoDecodeH264PictureLayoutFlagBitsEXT::eInterlacedInterleavedLines: return "InterlacedInterleavedLines";
+      case VideoDecodeH264PictureLayoutFlagBitsEXT::eInterlacedSeparatePlanes: return "InterlacedSeparatePlanes";
       default: return "invalid ( " + VULKAN_HPP_NAMESPACE::toHexString( static_cast<uint32_t>( value ) ) + " )";
     }
   }
@@ -6535,11 +6534,13 @@
 
   enum class GeometryInstanceFlagBitsKHR : VkGeometryInstanceFlagsKHR
   {
-    eTriangleFacingCullDisable     = VK_GEOMETRY_INSTANCE_TRIANGLE_FACING_CULL_DISABLE_BIT_KHR,
-    eTriangleFrontCounterclockwise = VK_GEOMETRY_INSTANCE_TRIANGLE_FRONT_COUNTERCLOCKWISE_BIT_KHR,
-    eForceOpaque                   = VK_GEOMETRY_INSTANCE_FORCE_OPAQUE_BIT_KHR,
-    eForceNoOpaque                 = VK_GEOMETRY_INSTANCE_FORCE_NO_OPAQUE_BIT_KHR,
-    eTriangleCullDisable           = VK_GEOMETRY_INSTANCE_TRIANGLE_CULL_DISABLE_BIT_NV
+    eTriangleFacingCullDisable        = VK_GEOMETRY_INSTANCE_TRIANGLE_FACING_CULL_DISABLE_BIT_KHR,
+    eTriangleFlipFacing               = VK_GEOMETRY_INSTANCE_TRIANGLE_FLIP_FACING_BIT_KHR,
+    eForceOpaque                      = VK_GEOMETRY_INSTANCE_FORCE_OPAQUE_BIT_KHR,
+    eForceNoOpaque                    = VK_GEOMETRY_INSTANCE_FORCE_NO_OPAQUE_BIT_KHR,
+    eTriangleCullDisable              = VK_GEOMETRY_INSTANCE_TRIANGLE_CULL_DISABLE_BIT_NV,
+    eTriangleFrontCounterclockwiseKHR = VK_GEOMETRY_INSTANCE_TRIANGLE_FRONT_COUNTERCLOCKWISE_BIT_KHR,
+    eTriangleFrontCounterclockwise    = VK_GEOMETRY_INSTANCE_TRIANGLE_FRONT_COUNTERCLOCKWISE_BIT_NV
   };
   using GeometryInstanceFlagBitsNV = GeometryInstanceFlagBitsKHR;
 
@@ -6548,7 +6549,7 @@
     switch ( value )
     {
       case GeometryInstanceFlagBitsKHR::eTriangleFacingCullDisable: return "TriangleFacingCullDisable";
-      case GeometryInstanceFlagBitsKHR::eTriangleFrontCounterclockwise: return "TriangleFrontCounterclockwise";
+      case GeometryInstanceFlagBitsKHR::eTriangleFlipFacing: return "TriangleFlipFacing";
       case GeometryInstanceFlagBitsKHR::eForceOpaque: return "ForceOpaque";
       case GeometryInstanceFlagBitsKHR::eForceNoOpaque: return "ForceNoOpaque";
       default: return "invalid ( " + VULKAN_HPP_NAMESPACE::toHexString( static_cast<uint32_t>( value ) ) + " )";
@@ -7423,6 +7424,22 @@
     return "(void)";
   }
 
+  //=== VK_EXT_pipeline_creation_cache_control ===
+
+  enum class PipelineCacheCreateFlagBits : VkPipelineCacheCreateFlags
+  {
+    eExternallySynchronizedEXT = VK_PIPELINE_CACHE_CREATE_EXTERNALLY_SYNCHRONIZED_BIT_EXT
+  };
+
+  VULKAN_HPP_INLINE std::string to_string( PipelineCacheCreateFlagBits value )
+  {
+    switch ( value )
+    {
+      case PipelineCacheCreateFlagBits::eExternallySynchronizedEXT: return "ExternallySynchronizedEXT";
+      default: return "invalid ( " + VULKAN_HPP_NAMESPACE::toHexString( static_cast<uint32_t>( value ) ) + " )";
+    }
+  }
+
 #if defined( VK_ENABLE_BETA_EXTENSIONS )
   //=== VK_KHR_video_encode_queue ===
 
@@ -7540,6 +7557,7 @@
     eTaskShaderNV                  = VK_PIPELINE_STAGE_2_TASK_SHADER_BIT_NV,
     eMeshShaderNV                  = VK_PIPELINE_STAGE_2_MESH_SHADER_BIT_NV,
     eSubpassShadingHUAWEI          = VK_PIPELINE_STAGE_2_SUBPASS_SHADING_BIT_HUAWEI,
+    eInvocationMaskHUAWEI          = VK_PIPELINE_STAGE_2_INVOCATION_MASK_BIT_HUAWEI,
     eAccelerationStructureBuildNV  = VK_PIPELINE_STAGE_2_ACCELERATION_STRUCTURE_BUILD_BIT_NV,
     eRayTracingShaderNV            = VK_PIPELINE_STAGE_2_RAY_TRACING_SHADER_BIT_NV,
     eShadingRateImageNV            = VK_PIPELINE_STAGE_2_SHADING_RATE_IMAGE_BIT_NV,
@@ -7589,6 +7607,7 @@
       case PipelineStageFlagBits2KHR::eTaskShaderNV: return "TaskShaderNV";
       case PipelineStageFlagBits2KHR::eMeshShaderNV: return "MeshShaderNV";
       case PipelineStageFlagBits2KHR::eSubpassShadingHUAWEI: return "SubpassShadingHUAWEI";
+      case PipelineStageFlagBits2KHR::eInvocationMaskHUAWEI: return "InvocationMaskHUAWEI";
       default: return "invalid ( " + VULKAN_HPP_NAMESPACE::toHexString( static_cast<uint32_t>( value ) ) + " )";
     }
   }
@@ -7633,6 +7652,7 @@
     eAccelerationStructureWrite        = VK_ACCESS_2_ACCELERATION_STRUCTURE_WRITE_BIT_KHR,
     eFragmentDensityMapReadEXT         = VK_ACCESS_2_FRAGMENT_DENSITY_MAP_READ_BIT_EXT,
     eColorAttachmentReadNoncoherentEXT = VK_ACCESS_2_COLOR_ATTACHMENT_READ_NONCOHERENT_BIT_EXT,
+    eInvocationMaskReadHUAWEI          = VK_ACCESS_2_INVOCATION_MASK_READ_BIT_HUAWEI,
     eAccelerationStructureReadNV       = VK_ACCESS_2_ACCELERATION_STRUCTURE_READ_BIT_NV,
     eAccelerationStructureWriteNV      = VK_ACCESS_2_ACCELERATION_STRUCTURE_WRITE_BIT_NV,
     eShadingRateImageReadNV            = VK_ACCESS_2_SHADING_RATE_IMAGE_READ_BIT_NV
@@ -7680,6 +7700,7 @@
       case AccessFlagBits2KHR::eAccelerationStructureWrite: return "AccelerationStructureWrite";
       case AccessFlagBits2KHR::eFragmentDensityMapReadEXT: return "FragmentDensityMapReadEXT";
       case AccessFlagBits2KHR::eColorAttachmentReadNoncoherentEXT: return "ColorAttachmentReadNoncoherentEXT";
+      case AccessFlagBits2KHR::eInvocationMaskReadHUAWEI: return "InvocationMaskReadHUAWEI";
       default: return "invalid ( " + VULKAN_HPP_NAMESPACE::toHexString( static_cast<uint32_t>( value ) ) + " )";
     }
   }
@@ -8038,6 +8059,7 @@
     if ( value & FormatFeatureFlagBits::eVideoEncodeDpbKHR )
       result += "VideoEncodeDpbKHR | ";
 #endif /*VK_ENABLE_BETA_EXTENSIONS*/
+
     return "{ " + result.substr( 0, result.size() - 3 ) + " }";
   }
 
@@ -8120,6 +8142,7 @@
       result += "SampleLocationsCompatibleDepthEXT | ";
     if ( value & ImageCreateFlagBits::eSubsampledEXT )
       result += "SubsampledEXT | ";
+
     return "{ " + result.substr( 0, result.size() - 3 ) + " }";
   }
 
@@ -8145,6 +8168,7 @@
                  | VkFlags( ImageUsageFlagBits::eVideoEncodeDstKHR ) |
                  VkFlags( ImageUsageFlagBits::eVideoEncodeSrcKHR ) | VkFlags( ImageUsageFlagBits::eVideoEncodeDpbKHR )
 #endif /*VK_ENABLE_BETA_EXTENSIONS*/
+                 | VkFlags( ImageUsageFlagBits::eInvocationMaskHUAWEI )
     };
   };
 
@@ -8213,6 +8237,9 @@
     if ( value & ImageUsageFlagBits::eVideoEncodeDpbKHR )
       result += "VideoEncodeDpbKHR | ";
 #endif /*VK_ENABLE_BETA_EXTENSIONS*/
+    if ( value & ImageUsageFlagBits::eInvocationMaskHUAWEI )
+      result += "InvocationMaskHUAWEI | ";
+
     return "{ " + result.substr( 0, result.size() - 3 ) + " }";
   }
 
@@ -8267,6 +8294,7 @@
       result += "DeviceLocal | ";
     if ( value & MemoryHeapFlagBits::eMultiInstance )
       result += "MultiInstance | ";
+
     return "{ " + result.substr( 0, result.size() - 3 ) + " }";
   }
 
@@ -8334,6 +8362,7 @@
       result += "DeviceUncachedAMD | ";
     if ( value & MemoryPropertyFlagBits::eRdmaCapableNV )
       result += "RdmaCapableNV | ";
+
     return "{ " + result.substr( 0, result.size() - 3 ) + " }";
   }
 
@@ -8397,6 +8426,7 @@
     if ( value & QueueFlagBits::eVideoEncodeKHR )
       result += "VideoEncodeKHR | ";
 #endif /*VK_ENABLE_BETA_EXTENSIONS*/
+
     return "{ " + result.substr( 0, result.size() - 3 ) + " }";
   }
 
@@ -8457,6 +8487,7 @@
       result += "32 | ";
     if ( value & SampleCountFlagBits::e64 )
       result += "64 | ";
+
     return "{ " + result.substr( 0, result.size() - 3 ) + " }";
   }
 
@@ -8510,6 +8541,7 @@
     std::string result;
     if ( value & DeviceQueueCreateFlagBits::eProtected )
       result += "Protected | ";
+
     return "{ " + result.substr( 0, result.size() - 3 ) + " }";
   }
 
@@ -8621,6 +8653,7 @@
       result += "FragmentShadingRateAttachmentKHR | ";
     if ( value & PipelineStageFlagBits::eCommandPreprocessNV )
       result += "CommandPreprocessNV | ";
+
     return "{ " + result.substr( 0, result.size() - 3 ) + " }";
   }
 
@@ -8698,6 +8731,7 @@
       result += "MemoryPlane2EXT | ";
     if ( value & ImageAspectFlagBits::eMemoryPlane3EXT )
       result += "MemoryPlane3EXT | ";
+
     return "{ " + result.substr( 0, result.size() - 3 ) + " }";
   }
 
@@ -8750,6 +8784,7 @@
       result += "AlignedMipSize | ";
     if ( value & SparseImageFormatFlagBits::eNonstandardBlockSize )
       result += "NonstandardBlockSize | ";
+
     return "{ " + result.substr( 0, result.size() - 3 ) + " }";
   }
 
@@ -8796,6 +8831,7 @@
     std::string result;
     if ( value & SparseMemoryBindFlagBits::eMetadata )
       result += "Metadata | ";
+
     return "{ " + result.substr( 0, result.size() - 3 ) + " }";
   }
 
@@ -8841,6 +8877,7 @@
     std::string result;
     if ( value & FenceCreateFlagBits::eSignaled )
       result += "Signaled | ";
+
     return "{ " + result.substr( 0, result.size() - 3 ) + " }";
   }
 
@@ -8893,6 +8930,7 @@
     std::string result;
     if ( value & EventCreateFlagBits::eDeviceOnlyKHR )
       result += "DeviceOnlyKHR | ";
+
     return "{ " + result.substr( 0, result.size() - 3 ) + " }";
   }
 
@@ -8969,6 +9007,7 @@
       result += "TessellationEvaluationShaderInvocations | ";
     if ( value & QueryPipelineStatisticFlagBits::eComputeShaderInvocations )
       result += "ComputeShaderInvocations | ";
+
     return "{ " + result.substr( 0, result.size() - 3 ) + " }";
   }
 
@@ -9035,6 +9074,7 @@
     if ( value & QueryResultFlagBits::eWithStatusKHR )
       result += "WithStatusKHR | ";
 #endif /*VK_ENABLE_BETA_EXTENSIONS*/
+
     return "{ " + result.substr( 0, result.size() - 3 ) + " }";
   }
 
@@ -9090,6 +9130,7 @@
       result += "Protected | ";
     if ( value & BufferCreateFlagBits::eDeviceAddressCaptureReplay )
       result += "DeviceAddressCaptureReplay | ";
+
     return "{ " + result.substr( 0, result.size() - 3 ) + " }";
   }
 
@@ -9194,6 +9235,7 @@
     if ( value & BufferUsageFlagBits::eVideoEncodeSrcKHR )
       result += "VideoEncodeSrcKHR | ";
 #endif /*VK_ENABLE_BETA_EXTENSIONS*/
+
     return "{ " + result.substr( 0, result.size() - 3 ) + " }";
   }
 
@@ -9250,6 +9292,7 @@
       result += "FragmentDensityMapDynamicEXT | ";
     if ( value & ImageViewCreateFlagBits::eFragmentDensityMapDeferredEXT )
       result += "FragmentDensityMapDeferredEXT | ";
+
     return "{ " + result.substr( 0, result.size() - 3 ) + " }";
   }
 
@@ -9303,6 +9346,7 @@
     std::string result;
     if ( value & PipelineCacheCreateFlagBits::eExternallySynchronizedEXT )
       result += "ExternallySynchronizedEXT | ";
+
     return "{ " + result.substr( 0, result.size() - 3 ) + " }";
   }
 
@@ -9356,6 +9400,7 @@
       result += "B | ";
     if ( value & ColorComponentFlagBits::eA )
       result += "A | ";
+
     return "{ " + result.substr( 0, result.size() - 3 ) + " }";
   }
 
@@ -9404,6 +9449,7 @@
       result += "Front | ";
     if ( value & CullModeFlagBits::eBack )
       result += "Back | ";
+
     return "{ " + result.substr( 0, result.size() - 3 ) + " }";
   }
 
@@ -9511,6 +9557,7 @@
       result += "EarlyReturnOnFailureEXT | ";
     if ( value & PipelineCreateFlagBits::eRayTracingAllowMotionNV )
       result += "RayTracingAllowMotionNV | ";
+
     return "{ " + result.substr( 0, result.size() - 3 ) + " }";
   }
 
@@ -9602,6 +9649,7 @@
       result += "AllowVaryingSubgroupSizeEXT | ";
     if ( value & PipelineShaderStageCreateFlagBits::eRequireFullSubgroupsEXT )
       result += "RequireFullSubgroupsEXT | ";
+
     return "{ " + result.substr( 0, result.size() - 3 ) + " }";
   }
 
@@ -9704,6 +9752,7 @@
       result += "MeshNV | ";
     if ( value & ShaderStageFlagBits::eSubpassShadingHUAWEI )
       result += "SubpassShadingHUAWEI | ";
+
     return "{ " + result.substr( 0, result.size() - 3 ) + " }";
   }
 
@@ -9752,6 +9801,7 @@
       result += "SubsampledEXT | ";
     if ( value & SamplerCreateFlagBits::eSubsampledCoarseReconstructionEXT )
       result += "SubsampledCoarseReconstructionEXT | ";
+
     return "{ " + result.substr( 0, result.size() - 3 ) + " }";
   }
 
@@ -9804,6 +9854,7 @@
       result += "UpdateAfterBind | ";
     if ( value & DescriptorPoolCreateFlagBits::eHostOnlyVALVE )
       result += "HostOnlyVALVE | ";
+
     return "{ " + result.substr( 0, result.size() - 3 ) + " }";
   }
 
@@ -9863,6 +9914,7 @@
       result += "PushDescriptorKHR | ";
     if ( value & DescriptorSetLayoutCreateFlagBits::eHostOnlyPoolVALVE )
       result += "HostOnlyPoolVALVE | ";
+
     return "{ " + result.substr( 0, result.size() - 3 ) + " }";
   }
 
@@ -9981,6 +10033,7 @@
       result += "CommandPreprocessReadNV | ";
     if ( value & AccessFlagBits::eCommandPreprocessWriteNV )
       result += "CommandPreprocessWriteNV | ";
+
     return "{ " + result.substr( 0, result.size() - 3 ) + " }";
   }
 
@@ -10027,6 +10080,7 @@
     std::string result;
     if ( value & AttachmentDescriptionFlagBits::eMayAlias )
       result += "MayAlias | ";
+
     return "{ " + result.substr( 0, result.size() - 3 ) + " }";
   }
 
@@ -10077,6 +10131,7 @@
       result += "DeviceGroup | ";
     if ( value & DependencyFlagBits::eViewLocal )
       result += "ViewLocal | ";
+
     return "{ " + result.substr( 0, result.size() - 3 ) + " }";
   }
 
@@ -10123,6 +10178,7 @@
     std::string result;
     if ( value & FramebufferCreateFlagBits::eImageless )
       result += "Imageless | ";
+
     return "{ " + result.substr( 0, result.size() - 3 ) + " }";
   }
 
@@ -10169,6 +10225,7 @@
     std::string result;
     if ( value & RenderPassCreateFlagBits::eTransformQCOM )
       result += "TransformQCOM | ";
+
     return "{ " + result.substr( 0, result.size() - 3 ) + " }";
   }
 
@@ -10224,6 +10281,7 @@
       result += "FragmentRegionQCOM | ";
     if ( value & SubpassDescriptionFlagBits::eShaderResolveQCOM )
       result += "ShaderResolveQCOM | ";
+
     return "{ " + result.substr( 0, result.size() - 3 ) + " }";
   }
 
@@ -10276,6 +10334,7 @@
       result += "ResetCommandBuffer | ";
     if ( value & CommandPoolCreateFlagBits::eProtected )
       result += "Protected | ";
+
     return "{ " + result.substr( 0, result.size() - 3 ) + " }";
   }
 
@@ -10322,6 +10381,7 @@
     std::string result;
     if ( value & CommandPoolResetFlagBits::eReleaseResources )
       result += "ReleaseResources | ";
+
     return "{ " + result.substr( 0, result.size() - 3 ) + " }";
   }
 
@@ -10368,6 +10428,7 @@
     std::string result;
     if ( value & CommandBufferResetFlagBits::eReleaseResources )
       result += "ReleaseResources | ";
+
     return "{ " + result.substr( 0, result.size() - 3 ) + " }";
   }
 
@@ -10420,6 +10481,7 @@
       result += "RenderPassContinue | ";
     if ( value & CommandBufferUsageFlagBits::eSimultaneousUse )
       result += "SimultaneousUse | ";
+
     return "{ " + result.substr( 0, result.size() - 3 ) + " }";
   }
 
@@ -10465,6 +10527,7 @@
     std::string result;
     if ( value & QueryControlFlagBits::ePrecise )
       result += "Precise | ";
+
     return "{ " + result.substr( 0, result.size() - 3 ) + " }";
   }
 
@@ -10513,6 +10576,7 @@
       result += "Front | ";
     if ( value & StencilFaceFlagBits::eBack )
       result += "Back | ";
+
     return "{ " + result.substr( 0, result.size() - 3 ) + " }";
   }
 
@@ -10581,6 +10645,7 @@
       result += "Quad | ";
     if ( value & SubgroupFeatureFlagBits::ePartitionedNV )
       result += "PartitionedNV | ";
+
     return "{ " + result.substr( 0, result.size() - 3 ) + " }";
   }
 
@@ -10636,6 +10701,7 @@
       result += "GenericSrc | ";
     if ( value & PeerMemoryFeatureFlagBits::eGenericDst )
       result += "GenericDst | ";
+
     return "{ " + result.substr( 0, result.size() - 3 ) + " }";
   }
 
@@ -10689,6 +10755,7 @@
       result += "DeviceAddress | ";
     if ( value & MemoryAllocateFlagBits::eDeviceAddressCaptureReplay )
       result += "DeviceAddressCaptureReplay | ";
+
     return "{ " + result.substr( 0, result.size() - 3 ) + " }";
   }
 
@@ -10799,6 +10866,7 @@
 #endif /*VK_USE_PLATFORM_FUCHSIA*/
     if ( value & ExternalMemoryHandleTypeFlagBits::eRdmaAddressNV )
       result += "RdmaAddressNV | ";
+
     return "{ " + result.substr( 0, result.size() - 3 ) + " }";
   }
 
@@ -10853,6 +10921,7 @@
       result += "Exportable | ";
     if ( value & ExternalMemoryFeatureFlagBits::eImportable )
       result += "Importable | ";
+
     return "{ " + result.substr( 0, result.size() - 3 ) + " }";
   }
 
@@ -10910,6 +10979,7 @@
       result += "OpaqueWin32Kmt | ";
     if ( value & ExternalFenceHandleTypeFlagBits::eSyncFd )
       result += "SyncFd | ";
+
     return "{ " + result.substr( 0, result.size() - 3 ) + " }";
   }
 
@@ -10961,6 +11031,7 @@
       result += "Exportable | ";
     if ( value & ExternalFenceFeatureFlagBits::eImportable )
       result += "Importable | ";
+
     return "{ " + result.substr( 0, result.size() - 3 ) + " }";
   }
 
@@ -11008,6 +11079,7 @@
     std::string result;
     if ( value & FenceImportFlagBits::eTemporary )
       result += "Temporary | ";
+
     return "{ " + result.substr( 0, result.size() - 3 ) + " }";
   }
 
@@ -11056,6 +11128,7 @@
     std::string result;
     if ( value & SemaphoreImportFlagBits::eTemporary )
       result += "Temporary | ";
+
     return "{ " + result.substr( 0, result.size() - 3 ) + " }";
   }
 
@@ -11123,6 +11196,7 @@
     if ( value & ExternalSemaphoreHandleTypeFlagBits::eZirconEventFUCHSIA )
       result += "ZirconEventFUCHSIA | ";
 #endif /*VK_USE_PLATFORM_FUCHSIA*/
+
     return "{ " + result.substr( 0, result.size() - 3 ) + " }";
   }
 
@@ -11174,6 +11248,7 @@
       result += "Exportable | ";
     if ( value & ExternalSemaphoreFeatureFlagBits::eImportable )
       result += "Importable | ";
+
     return "{ " + result.substr( 0, result.size() - 3 ) + " }";
   }
 
@@ -11233,6 +11308,7 @@
       result += "PartiallyBound | ";
     if ( value & DescriptorBindingFlagBits::eVariableDescriptorCount )
       result += "VariableDescriptorCount | ";
+
     return "{ " + result.substr( 0, result.size() - 3 ) + " }";
   }
 
@@ -11288,6 +11364,7 @@
       result += "Min | ";
     if ( value & ResolveModeFlagBits::eMax )
       result += "Max | ";
+
     return "{ " + result.substr( 0, result.size() - 3 ) + " }";
   }
 
@@ -11335,6 +11412,7 @@
     std::string result;
     if ( value & SemaphoreWaitFlagBits::eAny )
       result += "Any | ";
+
     return "{ " + result.substr( 0, result.size() - 3 ) + " }";
   }
 
@@ -11390,6 +11468,7 @@
       result += "PostMultiplied | ";
     if ( value & CompositeAlphaFlagBitsKHR::eInherit )
       result += "Inherit | ";
+
     return "{ " + result.substr( 0, result.size() - 3 ) + " }";
   }
 
@@ -11444,6 +11523,7 @@
       result += "Protected | ";
     if ( value & SwapchainCreateFlagBitsKHR::eMutableFormat )
       result += "MutableFormat | ";
+
     return "{ " + result.substr( 0, result.size() - 3 ) + " }";
   }
 
@@ -11499,6 +11579,7 @@
       result += "Sum | ";
     if ( value & DeviceGroupPresentModeFlagBitsKHR::eLocalMultiDevice )
       result += "LocalMultiDevice | ";
+
     return "{ " + result.substr( 0, result.size() - 3 ) + " }";
   }
 
@@ -11562,6 +11643,7 @@
       result += "PerPixel | ";
     if ( value & DisplayPlaneAlphaFlagBitsKHR::ePerPixelPremultiplied )
       result += "PerPixelPremultiplied | ";
+
     return "{ " + result.substr( 0, result.size() - 3 ) + " }";
   }
 
@@ -11638,6 +11720,7 @@
       result += "HorizontalMirrorRotate270 | ";
     if ( value & SurfaceTransformFlagBitsKHR::eInherit )
       result += "Inherit | ";
+
     return "{ " + result.substr( 0, result.size() - 3 ) + " }";
   }
 
@@ -11751,6 +11834,7 @@
       result += "Error | ";
     if ( value & DebugReportFlagBitsEXT::eDebug )
       result += "Debug | ";
+
     return "{ " + result.substr( 0, result.size() - 3 ) + " }";
   }
 
@@ -11811,6 +11895,7 @@
     if ( value & VideoCodecOperationFlagBitsKHR::eDecodeH265EXT )
       result += "DecodeH265EXT | ";
 #  endif /*VK_ENABLE_BETA_EXTENSIONS*/
+
     return "{ " + result.substr( 0, result.size() - 3 ) + " }";
   }
 
@@ -11866,6 +11951,7 @@
       result += "422 | ";
     if ( value & VideoChromaSubsamplingFlagBitsKHR::e444 )
       result += "444 | ";
+
     return "{ " + result.substr( 0, result.size() - 3 ) + " }";
   }
 
@@ -11918,55 +12004,57 @@
       result += "10 | ";
     if ( value & VideoComponentBitDepthFlagBitsKHR::e12 )
       result += "12 | ";
+
     return "{ " + result.substr( 0, result.size() - 3 ) + " }";
   }
 
-  using VideoCapabilitiesFlagsKHR = Flags<VideoCapabilitiesFlagBitsKHR>;
+  using VideoCapabilityFlagsKHR = Flags<VideoCapabilityFlagBitsKHR>;
 
   template <>
-  struct FlagTraits<VideoCapabilitiesFlagBitsKHR>
+  struct FlagTraits<VideoCapabilityFlagBitsKHR>
   {
     enum : VkFlags
     {
-      allFlags = VkFlags( VideoCapabilitiesFlagBitsKHR::eProtectedContent ) |
-                 VkFlags( VideoCapabilitiesFlagBitsKHR::eSeparateReferenceImages )
+      allFlags = VkFlags( VideoCapabilityFlagBitsKHR::eProtectedContent ) |
+                 VkFlags( VideoCapabilityFlagBitsKHR::eSeparateReferenceImages )
     };
   };
 
-  VULKAN_HPP_INLINE VULKAN_HPP_CONSTEXPR VideoCapabilitiesFlagsKHR
-                                         operator|( VideoCapabilitiesFlagBitsKHR bit0, VideoCapabilitiesFlagBitsKHR bit1 ) VULKAN_HPP_NOEXCEPT
+  VULKAN_HPP_INLINE VULKAN_HPP_CONSTEXPR VideoCapabilityFlagsKHR
+                                         operator|( VideoCapabilityFlagBitsKHR bit0, VideoCapabilityFlagBitsKHR bit1 ) VULKAN_HPP_NOEXCEPT
   {
-    return VideoCapabilitiesFlagsKHR( bit0 ) | bit1;
+    return VideoCapabilityFlagsKHR( bit0 ) | bit1;
   }
 
-  VULKAN_HPP_INLINE VULKAN_HPP_CONSTEXPR VideoCapabilitiesFlagsKHR
-                                         operator&(VideoCapabilitiesFlagBitsKHR bit0, VideoCapabilitiesFlagBitsKHR bit1)VULKAN_HPP_NOEXCEPT
+  VULKAN_HPP_INLINE VULKAN_HPP_CONSTEXPR VideoCapabilityFlagsKHR
+                                         operator&(VideoCapabilityFlagBitsKHR bit0, VideoCapabilityFlagBitsKHR bit1)VULKAN_HPP_NOEXCEPT
   {
-    return VideoCapabilitiesFlagsKHR( bit0 ) & bit1;
+    return VideoCapabilityFlagsKHR( bit0 ) & bit1;
   }
 
-  VULKAN_HPP_INLINE VULKAN_HPP_CONSTEXPR VideoCapabilitiesFlagsKHR
-                                         operator^( VideoCapabilitiesFlagBitsKHR bit0, VideoCapabilitiesFlagBitsKHR bit1 ) VULKAN_HPP_NOEXCEPT
+  VULKAN_HPP_INLINE VULKAN_HPP_CONSTEXPR VideoCapabilityFlagsKHR
+                                         operator^( VideoCapabilityFlagBitsKHR bit0, VideoCapabilityFlagBitsKHR bit1 ) VULKAN_HPP_NOEXCEPT
   {
-    return VideoCapabilitiesFlagsKHR( bit0 ) ^ bit1;
+    return VideoCapabilityFlagsKHR( bit0 ) ^ bit1;
   }
 
-  VULKAN_HPP_INLINE VULKAN_HPP_CONSTEXPR VideoCapabilitiesFlagsKHR operator~( VideoCapabilitiesFlagBitsKHR bits )
+  VULKAN_HPP_INLINE VULKAN_HPP_CONSTEXPR VideoCapabilityFlagsKHR operator~( VideoCapabilityFlagBitsKHR bits )
     VULKAN_HPP_NOEXCEPT
   {
-    return ~( VideoCapabilitiesFlagsKHR( bits ) );
+    return ~( VideoCapabilityFlagsKHR( bits ) );
   }
 
-  VULKAN_HPP_INLINE std::string to_string( VideoCapabilitiesFlagsKHR value )
+  VULKAN_HPP_INLINE std::string to_string( VideoCapabilityFlagsKHR value )
   {
     if ( !value )
       return "{}";
 
     std::string result;
-    if ( value & VideoCapabilitiesFlagBitsKHR::eProtectedContent )
+    if ( value & VideoCapabilityFlagBitsKHR::eProtectedContent )
       result += "ProtectedContent | ";
-    if ( value & VideoCapabilitiesFlagBitsKHR::eSeparateReferenceImages )
+    if ( value & VideoCapabilityFlagBitsKHR::eSeparateReferenceImages )
       result += "SeparateReferenceImages | ";
+
     return "{ " + result.substr( 0, result.size() - 3 ) + " }";
   }
 
@@ -12014,6 +12102,7 @@
     std::string result;
     if ( value & VideoSessionCreateFlagBitsKHR::eProtectedContent )
       result += "ProtectedContent | ";
+
     return "{ " + result.substr( 0, result.size() - 3 ) + " }";
   }
 
@@ -12074,6 +12163,7 @@
     std::string result;
     if ( value & VideoCodingControlFlagBitsKHR::eReset )
       result += "Reset | ";
+
     return "{ " + result.substr( 0, result.size() - 3 ) + " }";
   }
 
@@ -12127,6 +12217,7 @@
       result += "Power | ";
     if ( value & VideoCodingQualityPresetFlagBitsKHR::eQuality )
       result += "Quality | ";
+
     return "{ " + result.substr( 0, result.size() - 3 ) + " }";
   }
 #endif /*VK_ENABLE_BETA_EXTENSIONS*/
@@ -12177,6 +12268,7 @@
     std::string result;
     if ( value & VideoDecodeFlagBitsKHR::eReserved0 )
       result += "Reserved0 | ";
+
     return "{ " + result.substr( 0, result.size() - 3 ) + " }";
   }
 #endif /*VK_ENABLE_BETA_EXTENSIONS*/
@@ -12193,80 +12285,80 @@
 #if defined( VK_ENABLE_BETA_EXTENSIONS )
   //=== VK_EXT_video_encode_h264 ===
 
-  using VideoEncodeH264CapabilitiesFlagsEXT = Flags<VideoEncodeH264CapabilitiesFlagBitsEXT>;
+  using VideoEncodeH264CapabilityFlagsEXT = Flags<VideoEncodeH264CapabilityFlagBitsEXT>;
 
   template <>
-  struct FlagTraits<VideoEncodeH264CapabilitiesFlagBitsEXT>
+  struct FlagTraits<VideoEncodeH264CapabilityFlagBitsEXT>
   {
     enum : VkFlags
     {
-      allFlags =
-        VkFlags( VideoEncodeH264CapabilitiesFlagBitsEXT::eVkVideoEncodeH264CapabilityCabac ) |
-        VkFlags( VideoEncodeH264CapabilitiesFlagBitsEXT::eVkVideoEncodeH264CapabilityCavlc ) |
-        VkFlags( VideoEncodeH264CapabilitiesFlagBitsEXT::eVkVideoEncodeH264CapabilityWeightedBiPredImplicit ) |
-        VkFlags( VideoEncodeH264CapabilitiesFlagBitsEXT::eVkVideoEncodeH264CapabilityTransform8X8 ) |
-        VkFlags( VideoEncodeH264CapabilitiesFlagBitsEXT::eVkVideoEncodeH264CapabilityChromaQpOffset ) |
-        VkFlags( VideoEncodeH264CapabilitiesFlagBitsEXT::eVkVideoEncodeH264CapabilitySecondChromaQpOffset ) |
-        VkFlags( VideoEncodeH264CapabilitiesFlagBitsEXT::eVkVideoEncodeH264CapabilityDeblockingFilterDisabled ) |
-        VkFlags( VideoEncodeH264CapabilitiesFlagBitsEXT::eVkVideoEncodeH264CapabilityDeblockingFilterEnabled ) |
-        VkFlags( VideoEncodeH264CapabilitiesFlagBitsEXT::eVkVideoEncodeH264CapabilityDeblockingFilterPartial ) |
-        VkFlags( VideoEncodeH264CapabilitiesFlagBitsEXT::eVkVideoEncodeH264CapabilityMultipleSlicePerFrame ) |
-        VkFlags( VideoEncodeH264CapabilitiesFlagBitsEXT::eVkVideoEncodeH264CapabilityEvenlyDistributedSliceSize )
+      allFlags = VkFlags( VideoEncodeH264CapabilityFlagBitsEXT::eCabac ) |
+                 VkFlags( VideoEncodeH264CapabilityFlagBitsEXT::eCavlc ) |
+                 VkFlags( VideoEncodeH264CapabilityFlagBitsEXT::eWeightedBiPredImplicit ) |
+                 VkFlags( VideoEncodeH264CapabilityFlagBitsEXT::eTransform8X8 ) |
+                 VkFlags( VideoEncodeH264CapabilityFlagBitsEXT::eChromaQpOffset ) |
+                 VkFlags( VideoEncodeH264CapabilityFlagBitsEXT::eSecondChromaQpOffset ) |
+                 VkFlags( VideoEncodeH264CapabilityFlagBitsEXT::eDeblockingFilterDisabled ) |
+                 VkFlags( VideoEncodeH264CapabilityFlagBitsEXT::eDeblockingFilterEnabled ) |
+                 VkFlags( VideoEncodeH264CapabilityFlagBitsEXT::eDeblockingFilterPartial ) |
+                 VkFlags( VideoEncodeH264CapabilityFlagBitsEXT::eMultipleSlicePerFrame ) |
+                 VkFlags( VideoEncodeH264CapabilityFlagBitsEXT::eEvenlyDistributedSliceSize )
     };
   };
 
-  VULKAN_HPP_INLINE VULKAN_HPP_CONSTEXPR VideoEncodeH264CapabilitiesFlagsEXT operator|(
-    VideoEncodeH264CapabilitiesFlagBitsEXT bit0, VideoEncodeH264CapabilitiesFlagBitsEXT bit1 ) VULKAN_HPP_NOEXCEPT
+  VULKAN_HPP_INLINE VULKAN_HPP_CONSTEXPR VideoEncodeH264CapabilityFlagsEXT operator|(
+    VideoEncodeH264CapabilityFlagBitsEXT bit0, VideoEncodeH264CapabilityFlagBitsEXT bit1 ) VULKAN_HPP_NOEXCEPT
   {
-    return VideoEncodeH264CapabilitiesFlagsEXT( bit0 ) | bit1;
+    return VideoEncodeH264CapabilityFlagsEXT( bit0 ) | bit1;
   }
 
-  VULKAN_HPP_INLINE VULKAN_HPP_CONSTEXPR VideoEncodeH264CapabilitiesFlagsEXT operator&(
-    VideoEncodeH264CapabilitiesFlagBitsEXT bit0, VideoEncodeH264CapabilitiesFlagBitsEXT bit1)VULKAN_HPP_NOEXCEPT
+  VULKAN_HPP_INLINE VULKAN_HPP_CONSTEXPR VideoEncodeH264CapabilityFlagsEXT
+                                         operator&(VideoEncodeH264CapabilityFlagBitsEXT bit0, VideoEncodeH264CapabilityFlagBitsEXT bit1)VULKAN_HPP_NOEXCEPT
   {
-    return VideoEncodeH264CapabilitiesFlagsEXT( bit0 ) & bit1;
+    return VideoEncodeH264CapabilityFlagsEXT( bit0 ) & bit1;
   }
 
-  VULKAN_HPP_INLINE VULKAN_HPP_CONSTEXPR VideoEncodeH264CapabilitiesFlagsEXT operator^(
-    VideoEncodeH264CapabilitiesFlagBitsEXT bit0, VideoEncodeH264CapabilitiesFlagBitsEXT bit1 ) VULKAN_HPP_NOEXCEPT
+  VULKAN_HPP_INLINE VULKAN_HPP_CONSTEXPR VideoEncodeH264CapabilityFlagsEXT operator^(
+    VideoEncodeH264CapabilityFlagBitsEXT bit0, VideoEncodeH264CapabilityFlagBitsEXT bit1 ) VULKAN_HPP_NOEXCEPT
   {
-    return VideoEncodeH264CapabilitiesFlagsEXT( bit0 ) ^ bit1;
+    return VideoEncodeH264CapabilityFlagsEXT( bit0 ) ^ bit1;
   }
 
-  VULKAN_HPP_INLINE VULKAN_HPP_CONSTEXPR VideoEncodeH264CapabilitiesFlagsEXT
-                                         operator~( VideoEncodeH264CapabilitiesFlagBitsEXT bits ) VULKAN_HPP_NOEXCEPT
+  VULKAN_HPP_INLINE VULKAN_HPP_CONSTEXPR VideoEncodeH264CapabilityFlagsEXT
+                                         operator~( VideoEncodeH264CapabilityFlagBitsEXT bits ) VULKAN_HPP_NOEXCEPT
   {
-    return ~( VideoEncodeH264CapabilitiesFlagsEXT( bits ) );
+    return ~( VideoEncodeH264CapabilityFlagsEXT( bits ) );
   }
 
-  VULKAN_HPP_INLINE std::string to_string( VideoEncodeH264CapabilitiesFlagsEXT value )
+  VULKAN_HPP_INLINE std::string to_string( VideoEncodeH264CapabilityFlagsEXT value )
   {
     if ( !value )
       return "{}";
 
     std::string result;
-    if ( value & VideoEncodeH264CapabilitiesFlagBitsEXT::eVkVideoEncodeH264CapabilityCabac )
-      result += "VkVideoEncodeH264CapabilityCabac | ";
-    if ( value & VideoEncodeH264CapabilitiesFlagBitsEXT::eVkVideoEncodeH264CapabilityCavlc )
-      result += "VkVideoEncodeH264CapabilityCavlc | ";
-    if ( value & VideoEncodeH264CapabilitiesFlagBitsEXT::eVkVideoEncodeH264CapabilityWeightedBiPredImplicit )
-      result += "VkVideoEncodeH264CapabilityWeightedBiPredImplicit | ";
-    if ( value & VideoEncodeH264CapabilitiesFlagBitsEXT::eVkVideoEncodeH264CapabilityTransform8X8 )
-      result += "VkVideoEncodeH264CapabilityTransform8X8 | ";
-    if ( value & VideoEncodeH264CapabilitiesFlagBitsEXT::eVkVideoEncodeH264CapabilityChromaQpOffset )
-      result += "VkVideoEncodeH264CapabilityChromaQpOffset | ";
-    if ( value & VideoEncodeH264CapabilitiesFlagBitsEXT::eVkVideoEncodeH264CapabilitySecondChromaQpOffset )
-      result += "VkVideoEncodeH264CapabilitySecondChromaQpOffset | ";
-    if ( value & VideoEncodeH264CapabilitiesFlagBitsEXT::eVkVideoEncodeH264CapabilityDeblockingFilterDisabled )
-      result += "VkVideoEncodeH264CapabilityDeblockingFilterDisabled | ";
-    if ( value & VideoEncodeH264CapabilitiesFlagBitsEXT::eVkVideoEncodeH264CapabilityDeblockingFilterEnabled )
-      result += "VkVideoEncodeH264CapabilityDeblockingFilterEnabled | ";
-    if ( value & VideoEncodeH264CapabilitiesFlagBitsEXT::eVkVideoEncodeH264CapabilityDeblockingFilterPartial )
-      result += "VkVideoEncodeH264CapabilityDeblockingFilterPartial | ";
-    if ( value & VideoEncodeH264CapabilitiesFlagBitsEXT::eVkVideoEncodeH264CapabilityMultipleSlicePerFrame )
-      result += "VkVideoEncodeH264CapabilityMultipleSlicePerFrame | ";
-    if ( value & VideoEncodeH264CapabilitiesFlagBitsEXT::eVkVideoEncodeH264CapabilityEvenlyDistributedSliceSize )
-      result += "VkVideoEncodeH264CapabilityEvenlyDistributedSliceSize | ";
+    if ( value & VideoEncodeH264CapabilityFlagBitsEXT::eCabac )
+      result += "Cabac | ";
+    if ( value & VideoEncodeH264CapabilityFlagBitsEXT::eCavlc )
+      result += "Cavlc | ";
+    if ( value & VideoEncodeH264CapabilityFlagBitsEXT::eWeightedBiPredImplicit )
+      result += "WeightedBiPredImplicit | ";
+    if ( value & VideoEncodeH264CapabilityFlagBitsEXT::eTransform8X8 )
+      result += "Transform8X8 | ";
+    if ( value & VideoEncodeH264CapabilityFlagBitsEXT::eChromaQpOffset )
+      result += "ChromaQpOffset | ";
+    if ( value & VideoEncodeH264CapabilityFlagBitsEXT::eSecondChromaQpOffset )
+      result += "SecondChromaQpOffset | ";
+    if ( value & VideoEncodeH264CapabilityFlagBitsEXT::eDeblockingFilterDisabled )
+      result += "DeblockingFilterDisabled | ";
+    if ( value & VideoEncodeH264CapabilityFlagBitsEXT::eDeblockingFilterEnabled )
+      result += "DeblockingFilterEnabled | ";
+    if ( value & VideoEncodeH264CapabilityFlagBitsEXT::eDeblockingFilterPartial )
+      result += "DeblockingFilterPartial | ";
+    if ( value & VideoEncodeH264CapabilityFlagBitsEXT::eMultipleSlicePerFrame )
+      result += "MultipleSlicePerFrame | ";
+    if ( value & VideoEncodeH264CapabilityFlagBitsEXT::eEvenlyDistributedSliceSize )
+      result += "EvenlyDistributedSliceSize | ";
+
     return "{ " + result.substr( 0, result.size() - 3 ) + " }";
   }
 
@@ -12319,6 +12411,7 @@
       result += "Slice | ";
     if ( value & VideoEncodeH264InputModeFlagBitsEXT::eNonVcl )
       result += "NonVcl | ";
+
     return "{ " + result.substr( 0, result.size() - 3 ) + " }";
   }
 
@@ -12371,6 +12464,7 @@
       result += "Slice | ";
     if ( value & VideoEncodeH264OutputModeFlagBitsEXT::eNonVcl )
       result += "NonVcl | ";
+
     return "{ " + result.substr( 0, result.size() - 3 ) + " }";
   }
 
@@ -12418,6 +12512,7 @@
     std::string result;
     if ( value & VideoEncodeH264CreateFlagBitsEXT::eReserved0 )
       result += "Reserved0 | ";
+
     return "{ " + result.substr( 0, result.size() - 3 ) + " }";
   }
 #endif /*VK_ENABLE_BETA_EXTENSIONS*/
@@ -12425,53 +12520,54 @@
 #if defined( VK_ENABLE_BETA_EXTENSIONS )
   //=== VK_EXT_video_decode_h264 ===
 
-  using VideoDecodeH264FieldLayoutFlagsEXT = Flags<VideoDecodeH264FieldLayoutFlagBitsEXT>;
+  using VideoDecodeH264PictureLayoutFlagsEXT = Flags<VideoDecodeH264PictureLayoutFlagBitsEXT>;
 
   template <>
-  struct FlagTraits<VideoDecodeH264FieldLayoutFlagBitsEXT>
+  struct FlagTraits<VideoDecodeH264PictureLayoutFlagBitsEXT>
   {
     enum : VkFlags
     {
-      allFlags = VkFlags( VideoDecodeH264FieldLayoutFlagBitsEXT::eVkVideoDecodeH264ProgressivePicturesOnly ) |
-                 VkFlags( VideoDecodeH264FieldLayoutFlagBitsEXT::eLineInterlacedPlane ) |
-                 VkFlags( VideoDecodeH264FieldLayoutFlagBitsEXT::eSeparateInterlacedPlane )
+      allFlags = VkFlags( VideoDecodeH264PictureLayoutFlagBitsEXT::eProgressive ) |
+                 VkFlags( VideoDecodeH264PictureLayoutFlagBitsEXT::eInterlacedInterleavedLines ) |
+                 VkFlags( VideoDecodeH264PictureLayoutFlagBitsEXT::eInterlacedSeparatePlanes )
     };
   };
 
-  VULKAN_HPP_INLINE VULKAN_HPP_CONSTEXPR VideoDecodeH264FieldLayoutFlagsEXT operator|(
-    VideoDecodeH264FieldLayoutFlagBitsEXT bit0, VideoDecodeH264FieldLayoutFlagBitsEXT bit1 ) VULKAN_HPP_NOEXCEPT
+  VULKAN_HPP_INLINE VULKAN_HPP_CONSTEXPR VideoDecodeH264PictureLayoutFlagsEXT operator|(
+    VideoDecodeH264PictureLayoutFlagBitsEXT bit0, VideoDecodeH264PictureLayoutFlagBitsEXT bit1 ) VULKAN_HPP_NOEXCEPT
   {
-    return VideoDecodeH264FieldLayoutFlagsEXT( bit0 ) | bit1;
+    return VideoDecodeH264PictureLayoutFlagsEXT( bit0 ) | bit1;
   }
 
-  VULKAN_HPP_INLINE VULKAN_HPP_CONSTEXPR VideoDecodeH264FieldLayoutFlagsEXT
-                                         operator&(VideoDecodeH264FieldLayoutFlagBitsEXT bit0, VideoDecodeH264FieldLayoutFlagBitsEXT bit1)VULKAN_HPP_NOEXCEPT
+  VULKAN_HPP_INLINE VULKAN_HPP_CONSTEXPR VideoDecodeH264PictureLayoutFlagsEXT operator&(
+    VideoDecodeH264PictureLayoutFlagBitsEXT bit0, VideoDecodeH264PictureLayoutFlagBitsEXT bit1)VULKAN_HPP_NOEXCEPT
   {
-    return VideoDecodeH264FieldLayoutFlagsEXT( bit0 ) & bit1;
+    return VideoDecodeH264PictureLayoutFlagsEXT( bit0 ) & bit1;
   }
 
-  VULKAN_HPP_INLINE VULKAN_HPP_CONSTEXPR VideoDecodeH264FieldLayoutFlagsEXT operator^(
-    VideoDecodeH264FieldLayoutFlagBitsEXT bit0, VideoDecodeH264FieldLayoutFlagBitsEXT bit1 ) VULKAN_HPP_NOEXCEPT
+  VULKAN_HPP_INLINE VULKAN_HPP_CONSTEXPR VideoDecodeH264PictureLayoutFlagsEXT operator^(
+    VideoDecodeH264PictureLayoutFlagBitsEXT bit0, VideoDecodeH264PictureLayoutFlagBitsEXT bit1 ) VULKAN_HPP_NOEXCEPT
   {
-    return VideoDecodeH264FieldLayoutFlagsEXT( bit0 ) ^ bit1;
+    return VideoDecodeH264PictureLayoutFlagsEXT( bit0 ) ^ bit1;
   }
 
-  VULKAN_HPP_INLINE VULKAN_HPP_CONSTEXPR VideoDecodeH264FieldLayoutFlagsEXT
-                                         operator~( VideoDecodeH264FieldLayoutFlagBitsEXT bits ) VULKAN_HPP_NOEXCEPT
+  VULKAN_HPP_INLINE VULKAN_HPP_CONSTEXPR VideoDecodeH264PictureLayoutFlagsEXT
+                                         operator~( VideoDecodeH264PictureLayoutFlagBitsEXT bits ) VULKAN_HPP_NOEXCEPT
   {
-    return ~( VideoDecodeH264FieldLayoutFlagsEXT( bits ) );
+    return ~( VideoDecodeH264PictureLayoutFlagsEXT( bits ) );
   }
 
-  VULKAN_HPP_INLINE std::string to_string( VideoDecodeH264FieldLayoutFlagsEXT value )
+  VULKAN_HPP_INLINE std::string to_string( VideoDecodeH264PictureLayoutFlagsEXT value )
   {
     if ( !value )
       return "{}";
 
     std::string result;
-    if ( value & VideoDecodeH264FieldLayoutFlagBitsEXT::eLineInterlacedPlane )
-      result += "LineInterlacedPlane | ";
-    if ( value & VideoDecodeH264FieldLayoutFlagBitsEXT::eSeparateInterlacedPlane )
-      result += "SeparateInterlacedPlane | ";
+    if ( value & VideoDecodeH264PictureLayoutFlagBitsEXT::eInterlacedInterleavedLines )
+      result += "InterlacedInterleavedLines | ";
+    if ( value & VideoDecodeH264PictureLayoutFlagBitsEXT::eInterlacedSeparatePlanes )
+      result += "InterlacedSeparatePlanes | ";
+
     return "{ " + result.substr( 0, result.size() - 3 ) + " }";
   }
 
@@ -12548,6 +12644,7 @@
       result += "D3D11Image | ";
     if ( value & ExternalMemoryHandleTypeFlagBitsNV::eD3D11ImageKmt )
       result += "D3D11ImageKmt | ";
+
     return "{ " + result.substr( 0, result.size() - 3 ) + " }";
   }
 
@@ -12600,6 +12697,7 @@
       result += "Exportable | ";
     if ( value & ExternalMemoryFeatureFlagBitsNV::eImportable )
       result += "Importable | ";
+
     return "{ " + result.substr( 0, result.size() - 3 ) + " }";
   }
 
@@ -12659,6 +12757,7 @@
     std::string result;
     if ( value & ConditionalRenderingFlagBitsEXT::eInverted )
       result += "Inverted | ";
+
     return "{ " + result.substr( 0, result.size() - 3 ) + " }";
   }
 
@@ -12707,6 +12806,7 @@
     std::string result;
     if ( value & SurfaceCounterFlagBitsEXT::eVblank )
       result += "Vblank | ";
+
     return "{ " + result.substr( 0, result.size() - 3 ) + " }";
   }
 
@@ -12795,6 +12895,7 @@
       result += "PerformanceImpacting | ";
     if ( value & PerformanceCounterDescriptionFlagBitsKHR::eConcurrentlyImpacted )
       result += "ConcurrentlyImpacted | ";
+
     return "{ " + result.substr( 0, result.size() - 3 ) + " }";
   }
 
@@ -12881,6 +12982,7 @@
       result += "Warning | ";
     if ( value & DebugUtilsMessageSeverityFlagBitsEXT::eError )
       result += "Error | ";
+
     return "{ " + result.substr( 0, result.size() - 3 ) + " }";
   }
 
@@ -12933,6 +13035,7 @@
       result += "Validation | ";
     if ( value & DebugUtilsMessageTypeFlagBitsEXT::ePerformance )
       result += "Performance | ";
+
     return "{ " + result.substr( 0, result.size() - 3 ) + " }";
   }
 
@@ -13007,6 +13110,7 @@
       result += "Opaque | ";
     if ( value & GeometryFlagBitsKHR::eNoDuplicateAnyHitInvocation )
       result += "NoDuplicateAnyHitInvocation | ";
+
     return "{ " + result.substr( 0, result.size() - 3 ) + " }";
   }
 
@@ -13018,7 +13122,7 @@
     enum : VkFlags
     {
       allFlags = VkFlags( GeometryInstanceFlagBitsKHR::eTriangleFacingCullDisable ) |
-                 VkFlags( GeometryInstanceFlagBitsKHR::eTriangleFrontCounterclockwise ) |
+                 VkFlags( GeometryInstanceFlagBitsKHR::eTriangleFlipFacing ) |
                  VkFlags( GeometryInstanceFlagBitsKHR::eForceOpaque ) |
                  VkFlags( GeometryInstanceFlagBitsKHR::eForceNoOpaque )
     };
@@ -13058,12 +13162,13 @@
     std::string result;
     if ( value & GeometryInstanceFlagBitsKHR::eTriangleFacingCullDisable )
       result += "TriangleFacingCullDisable | ";
-    if ( value & GeometryInstanceFlagBitsKHR::eTriangleFrontCounterclockwise )
-      result += "TriangleFrontCounterclockwise | ";
+    if ( value & GeometryInstanceFlagBitsKHR::eTriangleFlipFacing )
+      result += "TriangleFlipFacing | ";
     if ( value & GeometryInstanceFlagBitsKHR::eForceOpaque )
       result += "ForceOpaque | ";
     if ( value & GeometryInstanceFlagBitsKHR::eForceNoOpaque )
       result += "ForceNoOpaque | ";
+
     return "{ " + result.substr( 0, result.size() - 3 ) + " }";
   }
 
@@ -13127,6 +13232,7 @@
       result += "LowMemory | ";
     if ( value & BuildAccelerationStructureFlagBitsKHR::eMotionNV )
       result += "MotionNV | ";
+
     return "{ " + result.substr( 0, result.size() - 3 ) + " }";
   }
 
@@ -13176,6 +13282,7 @@
       result += "DeviceAddressCaptureReplay | ";
     if ( value & AccelerationStructureCreateFlagBitsKHR::eMotionNV )
       result += "MotionNV | ";
+
     return "{ " + result.substr( 0, result.size() - 3 ) + " }";
   }
 
@@ -13268,6 +13375,7 @@
       result += "ApplicationPipelineCacheHit | ";
     if ( value & PipelineCreationFeedbackFlagBitsEXT::eBasePipelineAcceleration )
       result += "BasePipelineAcceleration | ";
+
     return "{ " + result.substr( 0, result.size() - 3 ) + " }";
   }
 
@@ -13362,6 +13470,7 @@
       result += "DebugReporting | ";
     if ( value & ToolPurposeFlagBitsEXT::eDebugMarkers )
       result += "DebugMarkers | ";
+
     return "{ " + result.substr( 0, result.size() - 3 ) + " }";
   }
 
@@ -13428,6 +13537,7 @@
     std::string result;
     if ( value & IndirectStateFlagBitsNV::eFlagFrontface )
       result += "FlagFrontface | ";
+
     return "{ " + result.substr( 0, result.size() - 3 ) + " }";
   }
 
@@ -13480,6 +13590,7 @@
       result += "IndexedSequences | ";
     if ( value & IndirectCommandsLayoutUsageFlagBitsNV::eUnorderedSequences )
       result += "UnorderedSequences | ";
+
     return "{ " + result.substr( 0, result.size() - 3 ) + " }";
   }
 
@@ -13547,6 +13658,7 @@
     std::string result;
     if ( value & VideoEncodeFlagBitsKHR::eReserved0 )
       result += "Reserved0 | ";
+
     return "{ " + result.substr( 0, result.size() - 3 ) + " }";
   }
 
@@ -13594,6 +13706,7 @@
     std::string result;
     if ( value & VideoEncodeRateControlFlagBitsKHR::eReset )
       result += "Reset | ";
+
     return "{ " + result.substr( 0, result.size() - 3 ) + " }";
   }
 
@@ -13640,6 +13753,7 @@
       return "{}";
 
     std::string result;
+
     return "{ " + result.substr( 0, result.size() - 3 ) + " }";
   }
 #endif /*VK_ENABLE_BETA_EXTENSIONS*/
@@ -13695,6 +13809,7 @@
       result += "EnableResourceTracking | ";
     if ( value & DeviceDiagnosticsConfigFlagBitsNV::eEnableAutomaticCheckpoints )
       result += "EnableAutomaticCheckpoints | ";
+
     return "{ " + result.substr( 0, result.size() - 3 ) + " }";
   }
 
@@ -13737,7 +13852,8 @@
         VkFlags64( PipelineStageFlagBits2KHR::eRayTracingShader ) |
         VkFlags64( PipelineStageFlagBits2KHR::eFragmentDensityProcessEXT ) |
         VkFlags64( PipelineStageFlagBits2KHR::eTaskShaderNV ) | VkFlags64( PipelineStageFlagBits2KHR::eMeshShaderNV ) |
-        VkFlags64( PipelineStageFlagBits2KHR::eSubpassShadingHUAWEI )
+        VkFlags64( PipelineStageFlagBits2KHR::eSubpassShadingHUAWEI ) |
+        VkFlags64( PipelineStageFlagBits2KHR::eInvocationMaskHUAWEI )
     };
   };
 
@@ -13845,6 +13961,9 @@
       result += "MeshShaderNV | ";
     if ( value & PipelineStageFlagBits2KHR::eSubpassShadingHUAWEI )
       result += "SubpassShadingHUAWEI | ";
+    if ( value & PipelineStageFlagBits2KHR::eInvocationMaskHUAWEI )
+      result += "InvocationMaskHUAWEI | ";
+
     return "{ " + result.substr( 0, result.size() - 3 ) + " }";
   }
 
@@ -13881,7 +14000,8 @@
         VkFlags64( AccessFlagBits2KHR::eAccelerationStructureRead ) |
         VkFlags64( AccessFlagBits2KHR::eAccelerationStructureWrite ) |
         VkFlags64( AccessFlagBits2KHR::eFragmentDensityMapReadEXT ) |
-        VkFlags64( AccessFlagBits2KHR::eColorAttachmentReadNoncoherentEXT )
+        VkFlags64( AccessFlagBits2KHR::eColorAttachmentReadNoncoherentEXT ) |
+        VkFlags64( AccessFlagBits2KHR::eInvocationMaskReadHUAWEI )
     };
   };
 
@@ -13986,6 +14106,9 @@
       result += "FragmentDensityMapReadEXT | ";
     if ( value & AccessFlagBits2KHR::eColorAttachmentReadNoncoherentEXT )
       result += "ColorAttachmentReadNoncoherentEXT | ";
+    if ( value & AccessFlagBits2KHR::eInvocationMaskReadHUAWEI )
+      result += "InvocationMaskReadHUAWEI | ";
+
     return "{ " + result.substr( 0, result.size() - 3 ) + " }";
   }
 
@@ -14031,6 +14154,7 @@
     std::string result;
     if ( value & SubmitFlagBitsKHR::eProtected )
       result += "Protected | ";
+
     return "{ " + result.substr( 0, result.size() - 3 ) + " }";
   }
 
diff --git a/third_party/vulkan-deps/vulkan-headers/src/include/vulkan/vulkan_funcs.hpp b/third_party/vulkan-deps/vulkan-headers/src/include/vulkan/vulkan_funcs.hpp
index 7772205..d638fa7 100644
--- a/third_party/vulkan-deps/vulkan-headers/src/include/vulkan/vulkan_funcs.hpp
+++ b/third_party/vulkan-deps/vulkan-headers/src/include/vulkan/vulkan_funcs.hpp
@@ -23,6 +23,7 @@
                                                          VULKAN_HPP_NAMESPACE::Instance *                  pInstance,
                                                          Dispatch const &                                  d ) VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     return static_cast<Result>( d.vkCreateInstance( reinterpret_cast<const VkInstanceCreateInfo *>( pCreateInfo ),
                                                     reinterpret_cast<const VkAllocationCallbacks *>( pAllocator ),
                                                     reinterpret_cast<VkInstance *>( pInstance ) ) );
@@ -36,6 +37,7 @@
                     Optional<const AllocationCallbacks> allocator,
                     Dispatch const &                    d )
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     VULKAN_HPP_NAMESPACE::Instance instance;
     Result                         result = static_cast<Result>(
       d.vkCreateInstance( reinterpret_cast<const VkInstanceCreateInfo *>( &createInfo ),
@@ -53,6 +55,7 @@
                           Optional<const AllocationCallbacks> allocator,
                           Dispatch const &                    d )
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     VULKAN_HPP_NAMESPACE::Instance instance;
     Result                         result = static_cast<Result>(
       d.vkCreateInstance( reinterpret_cast<const VkInstanceCreateInfo *>( &createInfo ),
@@ -70,6 +73,7 @@
   VULKAN_HPP_INLINE void Instance::destroy( const VULKAN_HPP_NAMESPACE::AllocationCallbacks * pAllocator,
                                             Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkDestroyInstance( m_instance, reinterpret_cast<const VkAllocationCallbacks *>( pAllocator ) );
   }
 
@@ -78,6 +82,7 @@
   VULKAN_HPP_INLINE void Instance::destroy( Optional<const AllocationCallbacks> allocator,
                                             Dispatch const &                    d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkDestroyInstance( m_instance,
                          reinterpret_cast<const VkAllocationCallbacks *>(
                            static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) ) );
@@ -90,6 +95,7 @@
                                         VULKAN_HPP_NAMESPACE::PhysicalDevice * pPhysicalDevices,
                                         Dispatch const &                       d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     return static_cast<Result>( d.vkEnumeratePhysicalDevices(
       m_instance, pPhysicalDeviceCount, reinterpret_cast<VkPhysicalDevice *>( pPhysicalDevices ) ) );
   }
@@ -100,6 +106,7 @@
     typename ResultValueType<std::vector<PhysicalDevice, PhysicalDeviceAllocator>>::type
     Instance::enumeratePhysicalDevices( Dispatch const & d ) const
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     std::vector<PhysicalDevice, PhysicalDeviceAllocator> physicalDevices;
     uint32_t                                             physicalDeviceCount;
     Result                                               result;
@@ -130,6 +137,7 @@
     typename ResultValueType<std::vector<PhysicalDevice, PhysicalDeviceAllocator>>::type
     Instance::enumeratePhysicalDevices( PhysicalDeviceAllocator & physicalDeviceAllocator, Dispatch const & d ) const
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     std::vector<PhysicalDevice, PhysicalDeviceAllocator> physicalDevices( physicalDeviceAllocator );
     uint32_t                                             physicalDeviceCount;
     Result                                               result;
@@ -157,6 +165,7 @@
   VULKAN_HPP_INLINE void PhysicalDevice::getFeatures( VULKAN_HPP_NAMESPACE::PhysicalDeviceFeatures * pFeatures,
                                                       Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkGetPhysicalDeviceFeatures( m_physicalDevice, reinterpret_cast<VkPhysicalDeviceFeatures *>( pFeatures ) );
   }
 
@@ -165,6 +174,7 @@
   VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::PhysicalDeviceFeatures
                                          PhysicalDevice::getFeatures( Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     VULKAN_HPP_NAMESPACE::PhysicalDeviceFeatures features;
     d.vkGetPhysicalDeviceFeatures( m_physicalDevice, reinterpret_cast<VkPhysicalDeviceFeatures *>( &features ) );
     return features;
@@ -177,6 +187,7 @@
                                          VULKAN_HPP_NAMESPACE::FormatProperties * pFormatProperties,
                                          Dispatch const &                         d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkGetPhysicalDeviceFormatProperties(
       m_physicalDevice, static_cast<VkFormat>( format ), reinterpret_cast<VkFormatProperties *>( pFormatProperties ) );
   }
@@ -187,6 +198,7 @@
                                          PhysicalDevice::getFormatProperties( VULKAN_HPP_NAMESPACE::Format format,
                                          Dispatch const &             d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     VULKAN_HPP_NAMESPACE::FormatProperties formatProperties;
     d.vkGetPhysicalDeviceFormatProperties(
       m_physicalDevice, static_cast<VkFormat>( format ), reinterpret_cast<VkFormatProperties *>( &formatProperties ) );
@@ -204,6 +216,7 @@
                                               VULKAN_HPP_NAMESPACE::ImageFormatProperties * pImageFormatProperties,
                                               Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     return static_cast<Result>( d.vkGetPhysicalDeviceImageFormatProperties(
       m_physicalDevice,
       static_cast<VkFormat>( format ),
@@ -225,6 +238,7 @@
                                               VULKAN_HPP_NAMESPACE::ImageCreateFlags flags,
                                               Dispatch const &                       d ) const
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     VULKAN_HPP_NAMESPACE::ImageFormatProperties imageFormatProperties;
     Result result = static_cast<Result>( d.vkGetPhysicalDeviceImageFormatProperties(
       m_physicalDevice,
@@ -243,6 +257,7 @@
   VULKAN_HPP_INLINE void PhysicalDevice::getProperties( VULKAN_HPP_NAMESPACE::PhysicalDeviceProperties * pProperties,
                                                         Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkGetPhysicalDeviceProperties( m_physicalDevice, reinterpret_cast<VkPhysicalDeviceProperties *>( pProperties ) );
   }
 
@@ -251,6 +266,7 @@
   VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::PhysicalDeviceProperties
                                          PhysicalDevice::getProperties( Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     VULKAN_HPP_NAMESPACE::PhysicalDeviceProperties properties;
     d.vkGetPhysicalDeviceProperties( m_physicalDevice, reinterpret_cast<VkPhysicalDeviceProperties *>( &properties ) );
     return properties;
@@ -263,6 +279,7 @@
                                               VULKAN_HPP_NAMESPACE::QueueFamilyProperties * pQueueFamilyProperties,
                                               Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkGetPhysicalDeviceQueueFamilyProperties( m_physicalDevice,
                                                 pQueueFamilyPropertyCount,
                                                 reinterpret_cast<VkQueueFamilyProperties *>( pQueueFamilyProperties ) );
@@ -273,6 +290,7 @@
   VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE std::vector<QueueFamilyProperties, QueueFamilyPropertiesAllocator>
                                          PhysicalDevice::getQueueFamilyProperties( Dispatch const & d ) const
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     std::vector<QueueFamilyProperties, QueueFamilyPropertiesAllocator> queueFamilyProperties;
     uint32_t                                                           queueFamilyPropertyCount;
     d.vkGetPhysicalDeviceQueueFamilyProperties( m_physicalDevice, &queueFamilyPropertyCount, nullptr );
@@ -293,6 +311,7 @@
                                          PhysicalDevice::getQueueFamilyProperties( QueueFamilyPropertiesAllocator & queueFamilyPropertiesAllocator,
                                               Dispatch const &                 d ) const
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     std::vector<QueueFamilyProperties, QueueFamilyPropertiesAllocator> queueFamilyProperties(
       queueFamilyPropertiesAllocator );
     uint32_t queueFamilyPropertyCount;
@@ -312,6 +331,7 @@
     PhysicalDevice::getMemoryProperties( VULKAN_HPP_NAMESPACE::PhysicalDeviceMemoryProperties * pMemoryProperties,
                                          Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkGetPhysicalDeviceMemoryProperties( m_physicalDevice,
                                            reinterpret_cast<VkPhysicalDeviceMemoryProperties *>( pMemoryProperties ) );
   }
@@ -321,6 +341,7 @@
   VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::PhysicalDeviceMemoryProperties
                                          PhysicalDevice::getMemoryProperties( Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     VULKAN_HPP_NAMESPACE::PhysicalDeviceMemoryProperties memoryProperties;
     d.vkGetPhysicalDeviceMemoryProperties( m_physicalDevice,
                                            reinterpret_cast<VkPhysicalDeviceMemoryProperties *>( &memoryProperties ) );
@@ -332,6 +353,7 @@
   VULKAN_HPP_INLINE PFN_vkVoidFunction Instance::getProcAddr( const char *     pName,
                                                               Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     return d.vkGetInstanceProcAddr( m_instance, pName );
   }
 
@@ -340,6 +362,7 @@
   VULKAN_HPP_INLINE PFN_vkVoidFunction Instance::getProcAddr( const std::string & name,
                                                               Dispatch const &    d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     return d.vkGetInstanceProcAddr( m_instance, name.c_str() );
   }
 #endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/
@@ -348,6 +371,7 @@
   VULKAN_HPP_INLINE PFN_vkVoidFunction Device::getProcAddr( const char *     pName,
                                                             Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     return d.vkGetDeviceProcAddr( m_device, pName );
   }
 
@@ -356,6 +380,7 @@
   VULKAN_HPP_INLINE PFN_vkVoidFunction Device::getProcAddr( const std::string & name,
                                                             Dispatch const &    d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     return d.vkGetDeviceProcAddr( m_device, name.c_str() );
   }
 #endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/
@@ -367,6 +392,7 @@
                                   VULKAN_HPP_NAMESPACE::Device *                    pDevice,
                                   Dispatch const &                                  d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     return static_cast<Result>( d.vkCreateDevice( m_physicalDevice,
                                                   reinterpret_cast<const VkDeviceCreateInfo *>( pCreateInfo ),
                                                   reinterpret_cast<const VkAllocationCallbacks *>( pAllocator ),
@@ -380,6 +406,7 @@
                                   Optional<const AllocationCallbacks> allocator,
                                   Dispatch const &                    d ) const
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     VULKAN_HPP_NAMESPACE::Device device;
     Result                       result = static_cast<Result>(
       d.vkCreateDevice( m_physicalDevice,
@@ -398,6 +425,7 @@
                                         Optional<const AllocationCallbacks> allocator,
                                         Dispatch const &                    d ) const
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     VULKAN_HPP_NAMESPACE::Device device;
     Result                       result = static_cast<Result>(
       d.vkCreateDevice( m_physicalDevice,
@@ -416,6 +444,7 @@
   VULKAN_HPP_INLINE void Device::destroy( const VULKAN_HPP_NAMESPACE::AllocationCallbacks * pAllocator,
                                           Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkDestroyDevice( m_device, reinterpret_cast<const VkAllocationCallbacks *>( pAllocator ) );
   }
 
@@ -424,6 +453,7 @@
   VULKAN_HPP_INLINE void Device::destroy( Optional<const AllocationCallbacks> allocator,
                                           Dispatch const &                    d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkDestroyDevice( m_device,
                        reinterpret_cast<const VkAllocationCallbacks *>(
                          static_cast<const VULKAN_HPP_NAMESPACE::AllocationCallbacks *>( allocator ) ) );
@@ -437,6 +467,7 @@
                                                                                VULKAN_HPP_NAMESPACE::ExtensionProperties * pProperties,
                                                                                Dispatch const &                            d ) VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     return static_cast<Result>( d.vkEnumerateInstanceExtensionProperties(
       pLayerName, pPropertyCount, reinterpret_cast<VkExtensionProperties *>( pProperties ) ) );
   }
@@ -447,6 +478,7 @@
     typename ResultValueType<std::vector<ExtensionProperties, ExtensionPropertiesAllocator>>::type
     enumerateInstanceExtensionProperties( Optional<const std::string> layerName, Dispatch const & d )
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     std::vector<ExtensionProperties, ExtensionPropertiesAllocator> properties;
     uint32_t                                                       propertyCount;
     Result                                                         result;
@@ -482,6 +514,7 @@
                                           ExtensionPropertiesAllocator & extensionPropertiesAllocator,
                                           Dispatch const &               d )
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     std::vector<ExtensionProperties, ExtensionPropertiesAllocator> properties( extensionPropertiesAllocator );
     uint32_t                                                       propertyCount;
     Result                                                         result;
@@ -515,6 +548,7 @@
                                                         VULKAN_HPP_NAMESPACE::ExtensionProperties * pProperties,
                                                         Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     return static_cast<Result>( d.vkEnumerateDeviceExtensionProperties(
       m_physicalDevice, pLayerName, pPropertyCount, reinterpret_cast<VkExtensionProperties *>( pProperties ) ) );
   }
@@ -526,6 +560,7 @@
     PhysicalDevice::enumerateDeviceExtensionProperties( Optional<const std::string> layerName,
                                                         Dispatch const &            d ) const
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     std::vector<ExtensionProperties, ExtensionPropertiesAllocator> properties;
     uint32_t                                                       propertyCount;
     Result                                                         result;
@@ -562,6 +597,7 @@
                                                         ExtensionPropertiesAllocator & extensionPropertiesAllocator,
                                                         Dispatch const &               d ) const
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     std::vector<ExtensionProperties, ExtensionPropertiesAllocator> properties( extensionPropertiesAllocator );
     uint32_t                                                       propertyCount;
     Result                                                         result;
@@ -595,6 +631,7 @@
                                                                            VULKAN_HPP_NAMESPACE::LayerProperties * pProperties,
                                                                            Dispatch const &                        d ) VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     return static_cast<Result>(
       d.vkEnumerateInstanceLayerProperties( pPropertyCount, reinterpret_cast<VkLayerProperties *>( pProperties ) ) );
   }
@@ -605,6 +642,7 @@
     typename ResultValueType<std::vector<LayerProperties, LayerPropertiesAllocator>>::type
     enumerateInstanceLayerProperties( Dispatch const & d )
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     std::vector<LayerProperties, LayerPropertiesAllocator> properties;
     uint32_t                                               propertyCount;
     Result                                                 result;
@@ -634,6 +672,7 @@
     typename ResultValueType<std::vector<LayerProperties, LayerPropertiesAllocator>>::type
     enumerateInstanceLayerProperties( LayerPropertiesAllocator & layerPropertiesAllocator, Dispatch const & d )
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     std::vector<LayerProperties, LayerPropertiesAllocator> properties( layerPropertiesAllocator );
     uint32_t                                               propertyCount;
     Result                                                 result;
@@ -662,6 +701,7 @@
                                                     VULKAN_HPP_NAMESPACE::LayerProperties * pProperties,
                                                     Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     return static_cast<Result>( d.vkEnumerateDeviceLayerProperties(
       m_physicalDevice, pPropertyCount, reinterpret_cast<VkLayerProperties *>( pProperties ) ) );
   }
@@ -672,6 +712,7 @@
     typename ResultValueType<std::vector<LayerProperties, LayerPropertiesAllocator>>::type
     PhysicalDevice::enumerateDeviceLayerProperties( Dispatch const & d ) const
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     std::vector<LayerProperties, LayerPropertiesAllocator> properties;
     uint32_t                                               propertyCount;
     Result                                                 result;
@@ -703,6 +744,7 @@
     PhysicalDevice::enumerateDeviceLayerProperties( LayerPropertiesAllocator & layerPropertiesAllocator,
                                                     Dispatch const &           d ) const
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     std::vector<LayerProperties, LayerPropertiesAllocator> properties( layerPropertiesAllocator );
     uint32_t                                               propertyCount;
     Result                                                 result;
@@ -732,6 +774,7 @@
                                            VULKAN_HPP_NAMESPACE::Queue * pQueue,
                                            Dispatch const &              d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkGetDeviceQueue( m_device, queueFamilyIndex, queueIndex, reinterpret_cast<VkQueue *>( pQueue ) );
   }
 
@@ -740,6 +783,7 @@
   VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::Queue
                                          Device::getQueue( uint32_t queueFamilyIndex, uint32_t queueIndex, Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     VULKAN_HPP_NAMESPACE::Queue queue;
     d.vkGetDeviceQueue( m_device, queueFamilyIndex, queueIndex, reinterpret_cast<VkQueue *>( &queue ) );
     return queue;
@@ -752,6 +796,7 @@
                                                                VULKAN_HPP_NAMESPACE::Fence              fence,
                                                                Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     return static_cast<Result>( d.vkQueueSubmit(
       m_queue, submitCount, reinterpret_cast<const VkSubmitInfo *>( pSubmits ), static_cast<VkFence>( fence ) ) );
   }
@@ -763,6 +808,7 @@
                    VULKAN_HPP_NAMESPACE::Fence                                fence,
                    Dispatch const &                                           d ) const
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     Result result = static_cast<Result>( d.vkQueueSubmit( m_queue,
                                                           submits.size(),
                                                           reinterpret_cast<const VkSubmitInfo *>( submits.data() ),
@@ -775,6 +821,7 @@
   template <typename Dispatch>
   VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE Result Queue::waitIdle( Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     return static_cast<Result>( d.vkQueueWaitIdle( m_queue ) );
   }
 #else
@@ -782,6 +829,7 @@
   VULKAN_HPP_NODISCARD_WHEN_NO_EXCEPTIONS VULKAN_HPP_INLINE typename ResultValueType<void>::type
                                           Queue::waitIdle( Dispatch const & d ) const
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     Result result = static_cast<Result>( d.vkQueueWaitIdle( m_queue ) );
     return createResultValue( result, VULKAN_HPP_NAMESPACE_STRING "::Queue::waitIdle" );
   }
@@ -791,6 +839,7 @@
   template <typename Dispatch>
   VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE Result Device::waitIdle( Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     return static_cast<Result>( d.vkDeviceWaitIdle( m_device ) );
   }
 #else
@@ -798,6 +847,7 @@
   VULKAN_HPP_NODISCARD_WHEN_NO_EXCEPTIONS VULKAN_HPP_INLINE typename ResultValueType<void>::type
                                           Device::waitIdle( Dispatch const & d ) const
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     Result result = static_cast<Result>( d.vkDeviceWaitIdle( m_device ) );
     return createResultValue( result, VULKAN_HPP_NAMESPACE_STRING "::Device::waitIdle" );
   }
@@ -810,6 +860,7 @@
                             VULKAN_HPP_NAMESPACE::DeviceMemory *              pMemory,
                             Dispatch const &                                  d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     return static_cast<Result>( d.vkAllocateMemory( m_device,
                                                     reinterpret_cast<const VkMemoryAllocateInfo *>( pAllocateInfo ),
                                                     reinterpret_cast<const VkAllocationCallbacks *>( pAllocator ),
@@ -824,6 +875,7 @@
                             Optional<const AllocationCallbacks> allocator,
                             Dispatch const &                    d ) const
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     VULKAN_HPP_NAMESPACE::DeviceMemory memory;
     Result                             result = static_cast<Result>(
       d.vkAllocateMemory( m_device,
@@ -842,6 +894,7 @@
                                   Optional<const AllocationCallbacks> allocator,
                                   Dispatch const &                    d ) const
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     VULKAN_HPP_NAMESPACE::DeviceMemory memory;
     Result                             result = static_cast<Result>(
       d.vkAllocateMemory( m_device,
@@ -861,6 +914,7 @@
                                              const VULKAN_HPP_NAMESPACE::AllocationCallbacks * pAllocator,
                                              Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkFreeMemory(
       m_device, static_cast<VkDeviceMemory>( memory ), reinterpret_cast<const VkAllocationCallbacks *>( pAllocator ) );
   }
@@ -871,6 +925,7 @@
                                              Optional<const AllocationCallbacks> allocator,
                                              Dispatch const &                    d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkFreeMemory( m_device,
                     static_cast<VkDeviceMemory>( memory ),
                     reinterpret_cast<const VkAllocationCallbacks *>(
@@ -883,6 +938,7 @@
                                        const VULKAN_HPP_NAMESPACE::AllocationCallbacks * pAllocator,
                                        Dispatch const &                                  d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkFreeMemory(
       m_device, static_cast<VkDeviceMemory>( memory ), reinterpret_cast<const VkAllocationCallbacks *>( pAllocator ) );
   }
@@ -893,6 +949,7 @@
                                        Optional<const AllocationCallbacks> allocator,
                                        Dispatch const &                    d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkFreeMemory( m_device,
                     static_cast<VkDeviceMemory>( memory ),
                     reinterpret_cast<const VkAllocationCallbacks *>(
@@ -908,6 +965,7 @@
                                                                    void **                              ppData,
                                                                    Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     return static_cast<Result>( d.vkMapMemory( m_device,
                                                static_cast<VkDeviceMemory>( memory ),
                                                static_cast<VkDeviceSize>( offset ),
@@ -925,6 +983,7 @@
                        VULKAN_HPP_NAMESPACE::MemoryMapFlags flags,
                        Dispatch const &                     d ) const
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     void * pData;
     Result result = static_cast<Result>( d.vkMapMemory( m_device,
                                                         static_cast<VkDeviceMemory>( memory ),
@@ -940,6 +999,7 @@
   VULKAN_HPP_INLINE void Device::unmapMemory( VULKAN_HPP_NAMESPACE::DeviceMemory memory,
                                               Dispatch const &                   d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkUnmapMemory( m_device, static_cast<VkDeviceMemory>( memory ) );
   }
 
@@ -949,6 +1009,7 @@
                                      const VULKAN_HPP_NAMESPACE::MappedMemoryRange * pMemoryRanges,
                                      Dispatch const &                                d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     return static_cast<Result>( d.vkFlushMappedMemoryRanges(
       m_device, memoryRangeCount, reinterpret_cast<const VkMappedMemoryRange *>( pMemoryRanges ) ) );
   }
@@ -959,6 +1020,7 @@
                                           Device::flushMappedMemoryRanges( ArrayProxy<const VULKAN_HPP_NAMESPACE::MappedMemoryRange> const & memoryRanges,
                                      Dispatch const &                                                  d ) const
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     Result result = static_cast<Result>( d.vkFlushMappedMemoryRanges(
       m_device, memoryRanges.size(), reinterpret_cast<const VkMappedMemoryRange *>( memoryRanges.data() ) ) );
     return createResultValue( result, VULKAN_HPP_NAMESPACE_STRING "::Device::flushMappedMemoryRanges" );
@@ -971,6 +1033,7 @@
                                           const VULKAN_HPP_NAMESPACE::MappedMemoryRange * pMemoryRanges,
                                           Dispatch const &                                d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     return static_cast<Result>( d.vkInvalidateMappedMemoryRanges(
       m_device, memoryRangeCount, reinterpret_cast<const VkMappedMemoryRange *>( pMemoryRanges ) ) );
   }
@@ -981,6 +1044,7 @@
                                           Device::invalidateMappedMemoryRanges(
       ArrayProxy<const VULKAN_HPP_NAMESPACE::MappedMemoryRange> const & memoryRanges, Dispatch const & d ) const
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     Result result = static_cast<Result>( d.vkInvalidateMappedMemoryRanges(
       m_device, memoryRanges.size(), reinterpret_cast<const VkMappedMemoryRange *>( memoryRanges.data() ) ) );
     return createResultValue( result, VULKAN_HPP_NAMESPACE_STRING "::Device::invalidateMappedMemoryRanges" );
@@ -992,6 +1056,7 @@
                                                       VULKAN_HPP_NAMESPACE::DeviceSize * pCommittedMemoryInBytes,
                                                       Dispatch const &                   d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkGetDeviceMemoryCommitment(
       m_device, static_cast<VkDeviceMemory>( memory ), reinterpret_cast<VkDeviceSize *>( pCommittedMemoryInBytes ) );
   }
@@ -1002,6 +1067,7 @@
                                          Device::getMemoryCommitment( VULKAN_HPP_NAMESPACE::DeviceMemory memory,
                                  Dispatch const &                   d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     VULKAN_HPP_NAMESPACE::DeviceSize committedMemoryInBytes;
     d.vkGetDeviceMemoryCommitment(
       m_device, static_cast<VkDeviceMemory>( memory ), reinterpret_cast<VkDeviceSize *>( &committedMemoryInBytes ) );
@@ -1016,6 +1082,7 @@
                                                                           VULKAN_HPP_NAMESPACE::DeviceSize memoryOffset,
                                                                           Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     return static_cast<Result>( d.vkBindBufferMemory( m_device,
                                                       static_cast<VkBuffer>( buffer ),
                                                       static_cast<VkDeviceMemory>( memory ),
@@ -1029,6 +1096,7 @@
                               VULKAN_HPP_NAMESPACE::DeviceSize   memoryOffset,
                               Dispatch const &                   d ) const
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     Result result = static_cast<Result>( d.vkBindBufferMemory( m_device,
                                                                static_cast<VkBuffer>( buffer ),
                                                                static_cast<VkDeviceMemory>( memory ),
@@ -1044,6 +1112,7 @@
                                                                          VULKAN_HPP_NAMESPACE::DeviceSize memoryOffset,
                                                                          Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     return static_cast<Result>( d.vkBindImageMemory( m_device,
                                                      static_cast<VkImage>( image ),
                                                      static_cast<VkDeviceMemory>( memory ),
@@ -1057,6 +1126,7 @@
                              VULKAN_HPP_NAMESPACE::DeviceSize   memoryOffset,
                              Dispatch const &                   d ) const
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     Result result = static_cast<Result>( d.vkBindImageMemory( m_device,
                                                               static_cast<VkImage>( image ),
                                                               static_cast<VkDeviceMemory>( memory ),
@@ -1071,6 +1141,7 @@
                                          VULKAN_HPP_NAMESPACE::MemoryRequirements * pMemoryRequirements,
                                          Dispatch const &                           d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkGetBufferMemoryRequirements(
       m_device, static_cast<VkBuffer>( buffer ), reinterpret_cast<VkMemoryRequirements *>( pMemoryRequirements ) );
   }
@@ -1081,6 +1152,7 @@
                                          Device::getBufferMemoryRequirements( VULKAN_HPP_NAMESPACE::Buffer buffer,
                                          Dispatch const &             d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     VULKAN_HPP_NAMESPACE::MemoryRequirements memoryRequirements;
     d.vkGetBufferMemoryRequirements(
       m_device, static_cast<VkBuffer>( buffer ), reinterpret_cast<VkMemoryRequirements *>( &memoryRequirements ) );
@@ -1094,6 +1166,7 @@
                                         VULKAN_HPP_NAMESPACE::MemoryRequirements * pMemoryRequirements,
                                         Dispatch const &                           d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkGetImageMemoryRequirements(
       m_device, static_cast<VkImage>( image ), reinterpret_cast<VkMemoryRequirements *>( pMemoryRequirements ) );
   }
@@ -1104,6 +1177,7 @@
                                          Device::getImageMemoryRequirements( VULKAN_HPP_NAMESPACE::Image image,
                                         Dispatch const &            d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     VULKAN_HPP_NAMESPACE::MemoryRequirements memoryRequirements;
     d.vkGetImageMemoryRequirements(
       m_device, static_cast<VkImage>( image ), reinterpret_cast<VkMemoryRequirements *>( &memoryRequirements ) );
@@ -1118,6 +1192,7 @@
     VULKAN_HPP_NAMESPACE::SparseImageMemoryRequirements * pSparseMemoryRequirements,
     Dispatch const &                                      d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkGetImageSparseMemoryRequirements(
       m_device,
       static_cast<VkImage>( image ),
@@ -1131,6 +1206,7 @@
     VULKAN_HPP_INLINE std::vector<SparseImageMemoryRequirements, SparseImageMemoryRequirementsAllocator>
                       Device::getImageSparseMemoryRequirements( VULKAN_HPP_NAMESPACE::Image image, Dispatch const & d ) const
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     std::vector<SparseImageMemoryRequirements, SparseImageMemoryRequirementsAllocator> sparseMemoryRequirements;
     uint32_t                                                                           sparseMemoryRequirementCount;
     d.vkGetImageSparseMemoryRequirements(
@@ -1157,6 +1233,7 @@
       SparseImageMemoryRequirementsAllocator & sparseImageMemoryRequirementsAllocator,
       Dispatch const &                         d ) const
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     std::vector<SparseImageMemoryRequirements, SparseImageMemoryRequirementsAllocator> sparseMemoryRequirements(
       sparseImageMemoryRequirementsAllocator );
     uint32_t sparseMemoryRequirementCount;
@@ -1184,6 +1261,7 @@
                                                     VULKAN_HPP_NAMESPACE::SparseImageFormatProperties * pProperties,
                                                     Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkGetPhysicalDeviceSparseImageFormatProperties(
       m_physicalDevice,
       static_cast<VkFormat>( format ),
@@ -1205,6 +1283,7 @@
                                                     VULKAN_HPP_NAMESPACE::ImageTiling         tiling,
                                                     Dispatch const &                          d ) const
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     std::vector<SparseImageFormatProperties, SparseImageFormatPropertiesAllocator> properties;
     uint32_t                                                                       propertyCount;
     d.vkGetPhysicalDeviceSparseImageFormatProperties( m_physicalDevice,
@@ -1244,6 +1323,7 @@
       SparseImageFormatPropertiesAllocator &    sparseImageFormatPropertiesAllocator,
       Dispatch const &                          d ) const
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     std::vector<SparseImageFormatProperties, SparseImageFormatPropertiesAllocator> properties(
       sparseImageFormatPropertiesAllocator );
     uint32_t propertyCount;
@@ -1277,6 +1357,7 @@
                        VULKAN_HPP_NAMESPACE::Fence                  fence,
                        Dispatch const &                             d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     return static_cast<Result>( d.vkQueueBindSparse( m_queue,
                                                      bindInfoCount,
                                                      reinterpret_cast<const VkBindSparseInfo *>( pBindInfo ),
@@ -1290,6 +1371,7 @@
                        VULKAN_HPP_NAMESPACE::Fence                                    fence,
                        Dispatch const &                                               d ) const
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     Result result =
       static_cast<Result>( d.vkQueueBindSparse( m_queue,
                                                 bindInfo.size(),
@@ -1306,6 +1388,7 @@
                          VULKAN_HPP_NAMESPACE::Fence *                     pFence,
                          Dispatch const &                                  d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     return static_cast<Result>( d.vkCreateFence( m_device,
                                                  reinterpret_cast<const VkFenceCreateInfo *>( pCreateInfo ),
                                                  reinterpret_cast<const VkAllocationCallbacks *>( pAllocator ),
@@ -1319,6 +1402,7 @@
                          Optional<const AllocationCallbacks> allocator,
                          Dispatch const &                    d ) const
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     VULKAN_HPP_NAMESPACE::Fence fence;
     Result                      result = static_cast<Result>(
       d.vkCreateFence( m_device,
@@ -1337,6 +1421,7 @@
                                Optional<const AllocationCallbacks> allocator,
                                Dispatch const &                    d ) const
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     VULKAN_HPP_NAMESPACE::Fence fence;
     Result                      result = static_cast<Result>(
       d.vkCreateFence( m_device,
@@ -1356,6 +1441,7 @@
                                                const VULKAN_HPP_NAMESPACE::AllocationCallbacks * pAllocator,
                                                Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkDestroyFence(
       m_device, static_cast<VkFence>( fence ), reinterpret_cast<const VkAllocationCallbacks *>( pAllocator ) );
   }
@@ -1366,6 +1452,7 @@
                                                Optional<const AllocationCallbacks> allocator,
                                                Dispatch const &                    d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkDestroyFence( m_device,
                       static_cast<VkFence>( fence ),
                       reinterpret_cast<const VkAllocationCallbacks *>(
@@ -1378,6 +1465,7 @@
                                           const VULKAN_HPP_NAMESPACE::AllocationCallbacks * pAllocator,
                                           Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkDestroyFence(
       m_device, static_cast<VkFence>( fence ), reinterpret_cast<const VkAllocationCallbacks *>( pAllocator ) );
   }
@@ -1388,6 +1476,7 @@
                                           Optional<const AllocationCallbacks> allocator,
                                           Dispatch const &                    d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkDestroyFence( m_device,
                       static_cast<VkFence>( fence ),
                       reinterpret_cast<const VkAllocationCallbacks *>(
@@ -1400,6 +1489,7 @@
                                                                      const VULKAN_HPP_NAMESPACE::Fence * pFences,
                                                                      Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     return static_cast<Result>( d.vkResetFences( m_device, fenceCount, reinterpret_cast<const VkFence *>( pFences ) ) );
   }
 
@@ -1408,6 +1498,7 @@
   VULKAN_HPP_INLINE typename ResultValueType<void>::type
     Device::resetFences( ArrayProxy<const VULKAN_HPP_NAMESPACE::Fence> const & fences, Dispatch const & d ) const
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     Result result = static_cast<Result>(
       d.vkResetFences( m_device, fences.size(), reinterpret_cast<const VkFence *>( fences.data() ) ) );
     return createResultValue( result, VULKAN_HPP_NAMESPACE_STRING "::Device::resetFences" );
@@ -1419,6 +1510,7 @@
   VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE Result Device::getFenceStatus( VULKAN_HPP_NAMESPACE::Fence fence,
                                                                         Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     return static_cast<Result>( d.vkGetFenceStatus( m_device, static_cast<VkFence>( fence ) ) );
   }
 #else
@@ -1426,6 +1518,7 @@
   VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE Result Device::getFenceStatus( VULKAN_HPP_NAMESPACE::Fence fence,
                                                                         Dispatch const &            d ) const
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     Result result = static_cast<Result>( d.vkGetFenceStatus( m_device, static_cast<VkFence>( fence ) ) );
     return createResultValue( result,
                               VULKAN_HPP_NAMESPACE_STRING "::Device::getFenceStatus",
@@ -1440,6 +1533,7 @@
                                                                        uint64_t                            timeout,
                                                                        Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     return static_cast<Result>( d.vkWaitForFences(
       m_device, fenceCount, reinterpret_cast<const VkFence *>( pFences ), static_cast<VkBool32>( waitAll ), timeout ) );
   }
@@ -1452,6 +1546,7 @@
                            uint64_t                                              timeout,
                            Dispatch const &                                      d ) const
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     Result result = static_cast<Result>( d.vkWaitForFences( m_device,
                                                             fences.size(),
                                                             reinterpret_cast<const VkFence *>( fences.data() ),
@@ -1470,6 +1565,7 @@
                              VULKAN_HPP_NAMESPACE::Semaphore *                 pSemaphore,
                              Dispatch const &                                  d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     return static_cast<Result>( d.vkCreateSemaphore( m_device,
                                                      reinterpret_cast<const VkSemaphoreCreateInfo *>( pCreateInfo ),
                                                      reinterpret_cast<const VkAllocationCallbacks *>( pAllocator ),
@@ -1484,6 +1580,7 @@
                              Optional<const AllocationCallbacks> allocator,
                              Dispatch const &                    d ) const
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     VULKAN_HPP_NAMESPACE::Semaphore semaphore;
     Result                          result = static_cast<Result>(
       d.vkCreateSemaphore( m_device,
@@ -1502,6 +1599,7 @@
                                    Optional<const AllocationCallbacks> allocator,
                                    Dispatch const &                    d ) const
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     VULKAN_HPP_NAMESPACE::Semaphore semaphore;
     Result                          result = static_cast<Result>(
       d.vkCreateSemaphore( m_device,
@@ -1521,6 +1619,7 @@
                                                    const VULKAN_HPP_NAMESPACE::AllocationCallbacks * pAllocator,
                                                    Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkDestroySemaphore(
       m_device, static_cast<VkSemaphore>( semaphore ), reinterpret_cast<const VkAllocationCallbacks *>( pAllocator ) );
   }
@@ -1531,6 +1630,7 @@
                                                    Optional<const AllocationCallbacks> allocator,
                                                    Dispatch const &                    d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkDestroySemaphore( m_device,
                           static_cast<VkSemaphore>( semaphore ),
                           reinterpret_cast<const VkAllocationCallbacks *>(
@@ -1543,6 +1643,7 @@
                                           const VULKAN_HPP_NAMESPACE::AllocationCallbacks * pAllocator,
                                           Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkDestroySemaphore(
       m_device, static_cast<VkSemaphore>( semaphore ), reinterpret_cast<const VkAllocationCallbacks *>( pAllocator ) );
   }
@@ -1553,6 +1654,7 @@
                                           Optional<const AllocationCallbacks> allocator,
                                           Dispatch const &                    d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkDestroySemaphore( m_device,
                           static_cast<VkSemaphore>( semaphore ),
                           reinterpret_cast<const VkAllocationCallbacks *>(
@@ -1567,6 +1669,7 @@
                          VULKAN_HPP_NAMESPACE::Event *                     pEvent,
                          Dispatch const &                                  d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     return static_cast<Result>( d.vkCreateEvent( m_device,
                                                  reinterpret_cast<const VkEventCreateInfo *>( pCreateInfo ),
                                                  reinterpret_cast<const VkAllocationCallbacks *>( pAllocator ),
@@ -1580,6 +1683,7 @@
                          Optional<const AllocationCallbacks> allocator,
                          Dispatch const &                    d ) const
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     VULKAN_HPP_NAMESPACE::Event event;
     Result                      result = static_cast<Result>(
       d.vkCreateEvent( m_device,
@@ -1598,6 +1702,7 @@
                                Optional<const AllocationCallbacks> allocator,
                                Dispatch const &                    d ) const
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     VULKAN_HPP_NAMESPACE::Event event;
     Result                      result = static_cast<Result>(
       d.vkCreateEvent( m_device,
@@ -1617,6 +1722,7 @@
                                                const VULKAN_HPP_NAMESPACE::AllocationCallbacks * pAllocator,
                                                Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkDestroyEvent(
       m_device, static_cast<VkEvent>( event ), reinterpret_cast<const VkAllocationCallbacks *>( pAllocator ) );
   }
@@ -1627,6 +1733,7 @@
                                                Optional<const AllocationCallbacks> allocator,
                                                Dispatch const &                    d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkDestroyEvent( m_device,
                       static_cast<VkEvent>( event ),
                       reinterpret_cast<const VkAllocationCallbacks *>(
@@ -1639,6 +1746,7 @@
                                           const VULKAN_HPP_NAMESPACE::AllocationCallbacks * pAllocator,
                                           Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkDestroyEvent(
       m_device, static_cast<VkEvent>( event ), reinterpret_cast<const VkAllocationCallbacks *>( pAllocator ) );
   }
@@ -1649,6 +1757,7 @@
                                           Optional<const AllocationCallbacks> allocator,
                                           Dispatch const &                    d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkDestroyEvent( m_device,
                       static_cast<VkEvent>( event ),
                       reinterpret_cast<const VkAllocationCallbacks *>(
@@ -1661,6 +1770,7 @@
   VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE Result Device::getEventStatus( VULKAN_HPP_NAMESPACE::Event event,
                                                                         Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     return static_cast<Result>( d.vkGetEventStatus( m_device, static_cast<VkEvent>( event ) ) );
   }
 #else
@@ -1668,6 +1778,7 @@
   VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE Result Device::getEventStatus( VULKAN_HPP_NAMESPACE::Event event,
                                                                         Dispatch const &            d ) const
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     Result result = static_cast<Result>( d.vkGetEventStatus( m_device, static_cast<VkEvent>( event ) ) );
     return createResultValue( result,
                               VULKAN_HPP_NAMESPACE_STRING "::Device::getEventStatus",
@@ -1680,6 +1791,7 @@
   VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE Result Device::setEvent( VULKAN_HPP_NAMESPACE::Event event,
                                                                   Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     return static_cast<Result>( d.vkSetEvent( m_device, static_cast<VkEvent>( event ) ) );
   }
 #else
@@ -1687,6 +1799,7 @@
   VULKAN_HPP_NODISCARD_WHEN_NO_EXCEPTIONS VULKAN_HPP_INLINE typename ResultValueType<void>::type
                                           Device::setEvent( VULKAN_HPP_NAMESPACE::Event event, Dispatch const & d ) const
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     Result result = static_cast<Result>( d.vkSetEvent( m_device, static_cast<VkEvent>( event ) ) );
     return createResultValue( result, VULKAN_HPP_NAMESPACE_STRING "::Device::setEvent" );
   }
@@ -1697,6 +1810,7 @@
   VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE Result Device::resetEvent( VULKAN_HPP_NAMESPACE::Event event,
                                                                     Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     return static_cast<Result>( d.vkResetEvent( m_device, static_cast<VkEvent>( event ) ) );
   }
 #else
@@ -1704,6 +1818,7 @@
   VULKAN_HPP_INLINE typename ResultValueType<void>::type Device::resetEvent( VULKAN_HPP_NAMESPACE::Event event,
                                                                              Dispatch const &            d ) const
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     Result result = static_cast<Result>( d.vkResetEvent( m_device, static_cast<VkEvent>( event ) ) );
     return createResultValue( result, VULKAN_HPP_NAMESPACE_STRING "::Device::resetEvent" );
   }
@@ -1716,6 +1831,7 @@
                              VULKAN_HPP_NAMESPACE::QueryPool *                 pQueryPool,
                              Dispatch const &                                  d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     return static_cast<Result>( d.vkCreateQueryPool( m_device,
                                                      reinterpret_cast<const VkQueryPoolCreateInfo *>( pCreateInfo ),
                                                      reinterpret_cast<const VkAllocationCallbacks *>( pAllocator ),
@@ -1730,6 +1846,7 @@
                              Optional<const AllocationCallbacks> allocator,
                              Dispatch const &                    d ) const
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     VULKAN_HPP_NAMESPACE::QueryPool queryPool;
     Result                          result = static_cast<Result>(
       d.vkCreateQueryPool( m_device,
@@ -1748,6 +1865,7 @@
                                    Optional<const AllocationCallbacks> allocator,
                                    Dispatch const &                    d ) const
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     VULKAN_HPP_NAMESPACE::QueryPool queryPool;
     Result                          result = static_cast<Result>(
       d.vkCreateQueryPool( m_device,
@@ -1767,6 +1885,7 @@
                                                    const VULKAN_HPP_NAMESPACE::AllocationCallbacks * pAllocator,
                                                    Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkDestroyQueryPool(
       m_device, static_cast<VkQueryPool>( queryPool ), reinterpret_cast<const VkAllocationCallbacks *>( pAllocator ) );
   }
@@ -1777,6 +1896,7 @@
                                                    Optional<const AllocationCallbacks> allocator,
                                                    Dispatch const &                    d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkDestroyQueryPool( m_device,
                           static_cast<VkQueryPool>( queryPool ),
                           reinterpret_cast<const VkAllocationCallbacks *>(
@@ -1789,6 +1909,7 @@
                                           const VULKAN_HPP_NAMESPACE::AllocationCallbacks * pAllocator,
                                           Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkDestroyQueryPool(
       m_device, static_cast<VkQueryPool>( queryPool ), reinterpret_cast<const VkAllocationCallbacks *>( pAllocator ) );
   }
@@ -1799,6 +1920,7 @@
                                           Optional<const AllocationCallbacks> allocator,
                                           Dispatch const &                    d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkDestroyQueryPool( m_device,
                           static_cast<VkQueryPool>( queryPool ),
                           reinterpret_cast<const VkAllocationCallbacks *>(
@@ -1817,6 +1939,7 @@
                                  VULKAN_HPP_NAMESPACE::QueryResultFlags flags,
                                  Dispatch const &                       d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     return static_cast<Result>( d.vkGetQueryPoolResults( m_device,
                                                          static_cast<VkQueryPool>( queryPool ),
                                                          firstQuery,
@@ -1839,6 +1962,7 @@
                                                           VULKAN_HPP_NAMESPACE::QueryResultFlags flags,
                                                           Dispatch const &                       d ) const
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     Result result = static_cast<Result>( d.vkGetQueryPoolResults( m_device,
                                                                   static_cast<VkQueryPool>( queryPool ),
                                                                   firstQuery,
@@ -1862,6 +1986,7 @@
                                  VULKAN_HPP_NAMESPACE::QueryResultFlags flags,
                                  Dispatch const &                       d ) const
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     VULKAN_HPP_ASSERT( dataSize % sizeof( T ) == 0 );
     std::vector<T, Allocator> data( dataSize / sizeof( T ) );
     Result                    result = static_cast<Result>( d.vkGetQueryPoolResults( m_device,
@@ -1887,6 +2012,7 @@
                                 VULKAN_HPP_NAMESPACE::QueryResultFlags flags,
                                 Dispatch const &                       d ) const
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     T      data;
     Result result = static_cast<Result>( d.vkGetQueryPoolResults( m_device,
                                                                   static_cast<VkQueryPool>( queryPool ),
@@ -1910,6 +2036,7 @@
                           VULKAN_HPP_NAMESPACE::Buffer *                    pBuffer,
                           Dispatch const &                                  d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     return static_cast<Result>( d.vkCreateBuffer( m_device,
                                                   reinterpret_cast<const VkBufferCreateInfo *>( pCreateInfo ),
                                                   reinterpret_cast<const VkAllocationCallbacks *>( pAllocator ),
@@ -1923,6 +2050,7 @@
                           Optional<const AllocationCallbacks> allocator,
                           Dispatch const &                    d ) const
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     VULKAN_HPP_NAMESPACE::Buffer buffer;
     Result                       result = static_cast<Result>(
       d.vkCreateBuffer( m_device,
@@ -1941,6 +2069,7 @@
                                 Optional<const AllocationCallbacks> allocator,
                                 Dispatch const &                    d ) const
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     VULKAN_HPP_NAMESPACE::Buffer buffer;
     Result                       result = static_cast<Result>(
       d.vkCreateBuffer( m_device,
@@ -1960,6 +2089,7 @@
                                                 const VULKAN_HPP_NAMESPACE::AllocationCallbacks * pAllocator,
                                                 Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkDestroyBuffer(
       m_device, static_cast<VkBuffer>( buffer ), reinterpret_cast<const VkAllocationCallbacks *>( pAllocator ) );
   }
@@ -1970,6 +2100,7 @@
                                                 Optional<const AllocationCallbacks> allocator,
                                                 Dispatch const &                    d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkDestroyBuffer( m_device,
                        static_cast<VkBuffer>( buffer ),
                        reinterpret_cast<const VkAllocationCallbacks *>(
@@ -1982,6 +2113,7 @@
                                           const VULKAN_HPP_NAMESPACE::AllocationCallbacks * pAllocator,
                                           Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkDestroyBuffer(
       m_device, static_cast<VkBuffer>( buffer ), reinterpret_cast<const VkAllocationCallbacks *>( pAllocator ) );
   }
@@ -1992,6 +2124,7 @@
                                           Optional<const AllocationCallbacks> allocator,
                                           Dispatch const &                    d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkDestroyBuffer( m_device,
                        static_cast<VkBuffer>( buffer ),
                        reinterpret_cast<const VkAllocationCallbacks *>(
@@ -2006,6 +2139,7 @@
                               VULKAN_HPP_NAMESPACE::BufferView *                 pView,
                               Dispatch const &                                   d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     return static_cast<Result>( d.vkCreateBufferView( m_device,
                                                       reinterpret_cast<const VkBufferViewCreateInfo *>( pCreateInfo ),
                                                       reinterpret_cast<const VkAllocationCallbacks *>( pAllocator ),
@@ -2020,6 +2154,7 @@
                               Optional<const AllocationCallbacks> allocator,
                               Dispatch const &                    d ) const
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     VULKAN_HPP_NAMESPACE::BufferView view;
     Result                           result = static_cast<Result>(
       d.vkCreateBufferView( m_device,
@@ -2038,6 +2173,7 @@
                                     Optional<const AllocationCallbacks> allocator,
                                     Dispatch const &                    d ) const
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     VULKAN_HPP_NAMESPACE::BufferView view;
     Result                           result = static_cast<Result>(
       d.vkCreateBufferView( m_device,
@@ -2057,6 +2193,7 @@
                                                     const VULKAN_HPP_NAMESPACE::AllocationCallbacks * pAllocator,
                                                     Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkDestroyBufferView( m_device,
                            static_cast<VkBufferView>( bufferView ),
                            reinterpret_cast<const VkAllocationCallbacks *>( pAllocator ) );
@@ -2068,6 +2205,7 @@
                                                     Optional<const AllocationCallbacks> allocator,
                                                     Dispatch const &                    d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkDestroyBufferView( m_device,
                            static_cast<VkBufferView>( bufferView ),
                            reinterpret_cast<const VkAllocationCallbacks *>(
@@ -2080,6 +2218,7 @@
                                           const VULKAN_HPP_NAMESPACE::AllocationCallbacks * pAllocator,
                                           Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkDestroyBufferView( m_device,
                            static_cast<VkBufferView>( bufferView ),
                            reinterpret_cast<const VkAllocationCallbacks *>( pAllocator ) );
@@ -2091,6 +2230,7 @@
                                           Optional<const AllocationCallbacks> allocator,
                                           Dispatch const &                    d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkDestroyBufferView( m_device,
                            static_cast<VkBufferView>( bufferView ),
                            reinterpret_cast<const VkAllocationCallbacks *>(
@@ -2105,6 +2245,7 @@
                          VULKAN_HPP_NAMESPACE::Image *                     pImage,
                          Dispatch const &                                  d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     return static_cast<Result>( d.vkCreateImage( m_device,
                                                  reinterpret_cast<const VkImageCreateInfo *>( pCreateInfo ),
                                                  reinterpret_cast<const VkAllocationCallbacks *>( pAllocator ),
@@ -2118,6 +2259,7 @@
                          Optional<const AllocationCallbacks> allocator,
                          Dispatch const &                    d ) const
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     VULKAN_HPP_NAMESPACE::Image image;
     Result                      result = static_cast<Result>(
       d.vkCreateImage( m_device,
@@ -2136,6 +2278,7 @@
                                Optional<const AllocationCallbacks> allocator,
                                Dispatch const &                    d ) const
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     VULKAN_HPP_NAMESPACE::Image image;
     Result                      result = static_cast<Result>(
       d.vkCreateImage( m_device,
@@ -2155,6 +2298,7 @@
                                                const VULKAN_HPP_NAMESPACE::AllocationCallbacks * pAllocator,
                                                Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkDestroyImage(
       m_device, static_cast<VkImage>( image ), reinterpret_cast<const VkAllocationCallbacks *>( pAllocator ) );
   }
@@ -2165,6 +2309,7 @@
                                                Optional<const AllocationCallbacks> allocator,
                                                Dispatch const &                    d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkDestroyImage( m_device,
                       static_cast<VkImage>( image ),
                       reinterpret_cast<const VkAllocationCallbacks *>(
@@ -2177,6 +2322,7 @@
                                           const VULKAN_HPP_NAMESPACE::AllocationCallbacks * pAllocator,
                                           Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkDestroyImage(
       m_device, static_cast<VkImage>( image ), reinterpret_cast<const VkAllocationCallbacks *>( pAllocator ) );
   }
@@ -2187,6 +2333,7 @@
                                           Optional<const AllocationCallbacks> allocator,
                                           Dispatch const &                    d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkDestroyImage( m_device,
                       static_cast<VkImage>( image ),
                       reinterpret_cast<const VkAllocationCallbacks *>(
@@ -2200,6 +2347,7 @@
                                                             VULKAN_HPP_NAMESPACE::SubresourceLayout *      pLayout,
                                                             Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkGetImageSubresourceLayout( m_device,
                                    static_cast<VkImage>( image ),
                                    reinterpret_cast<const VkImageSubresource *>( pSubresource ),
@@ -2213,6 +2361,7 @@
                                        const ImageSubresource &    subresource,
                                        Dispatch const &            d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     VULKAN_HPP_NAMESPACE::SubresourceLayout layout;
     d.vkGetImageSubresourceLayout( m_device,
                                    static_cast<VkImage>( image ),
@@ -2229,6 +2378,7 @@
                              VULKAN_HPP_NAMESPACE::ImageView *                 pView,
                              Dispatch const &                                  d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     return static_cast<Result>( d.vkCreateImageView( m_device,
                                                      reinterpret_cast<const VkImageViewCreateInfo *>( pCreateInfo ),
                                                      reinterpret_cast<const VkAllocationCallbacks *>( pAllocator ),
@@ -2243,6 +2393,7 @@
                              Optional<const AllocationCallbacks> allocator,
                              Dispatch const &                    d ) const
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     VULKAN_HPP_NAMESPACE::ImageView view;
     Result                          result = static_cast<Result>(
       d.vkCreateImageView( m_device,
@@ -2261,6 +2412,7 @@
                                    Optional<const AllocationCallbacks> allocator,
                                    Dispatch const &                    d ) const
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     VULKAN_HPP_NAMESPACE::ImageView view;
     Result                          result = static_cast<Result>(
       d.vkCreateImageView( m_device,
@@ -2280,6 +2432,7 @@
                                                    const VULKAN_HPP_NAMESPACE::AllocationCallbacks * pAllocator,
                                                    Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkDestroyImageView(
       m_device, static_cast<VkImageView>( imageView ), reinterpret_cast<const VkAllocationCallbacks *>( pAllocator ) );
   }
@@ -2290,6 +2443,7 @@
                                                    Optional<const AllocationCallbacks> allocator,
                                                    Dispatch const &                    d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkDestroyImageView( m_device,
                           static_cast<VkImageView>( imageView ),
                           reinterpret_cast<const VkAllocationCallbacks *>(
@@ -2302,6 +2456,7 @@
                                           const VULKAN_HPP_NAMESPACE::AllocationCallbacks * pAllocator,
                                           Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkDestroyImageView(
       m_device, static_cast<VkImageView>( imageView ), reinterpret_cast<const VkAllocationCallbacks *>( pAllocator ) );
   }
@@ -2312,6 +2467,7 @@
                                           Optional<const AllocationCallbacks> allocator,
                                           Dispatch const &                    d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkDestroyImageView( m_device,
                           static_cast<VkImageView>( imageView ),
                           reinterpret_cast<const VkAllocationCallbacks *>(
@@ -2326,6 +2482,7 @@
                                 VULKAN_HPP_NAMESPACE::ShaderModule *                 pShaderModule,
                                 Dispatch const &                                     d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     return static_cast<Result>(
       d.vkCreateShaderModule( m_device,
                               reinterpret_cast<const VkShaderModuleCreateInfo *>( pCreateInfo ),
@@ -2341,6 +2498,7 @@
                                 Optional<const AllocationCallbacks> allocator,
                                 Dispatch const &                    d ) const
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     VULKAN_HPP_NAMESPACE::ShaderModule shaderModule;
     Result                             result = static_cast<Result>(
       d.vkCreateShaderModule( m_device,
@@ -2359,6 +2517,7 @@
                                       Optional<const AllocationCallbacks> allocator,
                                       Dispatch const &                    d ) const
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     VULKAN_HPP_NAMESPACE::ShaderModule shaderModule;
     Result                             result = static_cast<Result>(
       d.vkCreateShaderModule( m_device,
@@ -2378,6 +2537,7 @@
                                                       const VULKAN_HPP_NAMESPACE::AllocationCallbacks * pAllocator,
                                                       Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkDestroyShaderModule( m_device,
                              static_cast<VkShaderModule>( shaderModule ),
                              reinterpret_cast<const VkAllocationCallbacks *>( pAllocator ) );
@@ -2389,6 +2549,7 @@
                                                       Optional<const AllocationCallbacks> allocator,
                                                       Dispatch const &                    d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkDestroyShaderModule( m_device,
                              static_cast<VkShaderModule>( shaderModule ),
                              reinterpret_cast<const VkAllocationCallbacks *>(
@@ -2401,6 +2562,7 @@
                                           const VULKAN_HPP_NAMESPACE::AllocationCallbacks * pAllocator,
                                           Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkDestroyShaderModule( m_device,
                              static_cast<VkShaderModule>( shaderModule ),
                              reinterpret_cast<const VkAllocationCallbacks *>( pAllocator ) );
@@ -2412,6 +2574,7 @@
                                           Optional<const AllocationCallbacks> allocator,
                                           Dispatch const &                    d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkDestroyShaderModule( m_device,
                              static_cast<VkShaderModule>( shaderModule ),
                              reinterpret_cast<const VkAllocationCallbacks *>(
@@ -2426,6 +2589,7 @@
                                  VULKAN_HPP_NAMESPACE::PipelineCache *                 pPipelineCache,
                                  Dispatch const &                                      d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     return static_cast<Result>(
       d.vkCreatePipelineCache( m_device,
                                reinterpret_cast<const VkPipelineCacheCreateInfo *>( pCreateInfo ),
@@ -2441,6 +2605,7 @@
                                  Optional<const AllocationCallbacks> allocator,
                                  Dispatch const &                    d ) const
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     VULKAN_HPP_NAMESPACE::PipelineCache pipelineCache;
     Result                              result = static_cast<Result>(
       d.vkCreatePipelineCache( m_device,
@@ -2459,6 +2624,7 @@
                                        Optional<const AllocationCallbacks> allocator,
                                        Dispatch const &                    d ) const
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     VULKAN_HPP_NAMESPACE::PipelineCache pipelineCache;
     Result                              result = static_cast<Result>(
       d.vkCreatePipelineCache( m_device,
@@ -2478,6 +2644,7 @@
                                                        const VULKAN_HPP_NAMESPACE::AllocationCallbacks * pAllocator,
                                                        Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkDestroyPipelineCache( m_device,
                               static_cast<VkPipelineCache>( pipelineCache ),
                               reinterpret_cast<const VkAllocationCallbacks *>( pAllocator ) );
@@ -2489,6 +2656,7 @@
                                                        Optional<const AllocationCallbacks> allocator,
                                                        Dispatch const &                    d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkDestroyPipelineCache( m_device,
                               static_cast<VkPipelineCache>( pipelineCache ),
                               reinterpret_cast<const VkAllocationCallbacks *>(
@@ -2501,6 +2669,7 @@
                                           const VULKAN_HPP_NAMESPACE::AllocationCallbacks * pAllocator,
                                           Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkDestroyPipelineCache( m_device,
                               static_cast<VkPipelineCache>( pipelineCache ),
                               reinterpret_cast<const VkAllocationCallbacks *>( pAllocator ) );
@@ -2512,6 +2681,7 @@
                                           Optional<const AllocationCallbacks> allocator,
                                           Dispatch const &                    d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkDestroyPipelineCache( m_device,
                               static_cast<VkPipelineCache>( pipelineCache ),
                               reinterpret_cast<const VkAllocationCallbacks *>(
@@ -2526,6 +2696,7 @@
                                   void *                              pData,
                                   Dispatch const &                    d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     return static_cast<Result>(
       d.vkGetPipelineCacheData( m_device, static_cast<VkPipelineCache>( pipelineCache ), pDataSize, pData ) );
   }
@@ -2535,6 +2706,7 @@
   VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE typename ResultValueType<std::vector<uint8_t, Uint8_tAllocator>>::type
                        Device::getPipelineCacheData( VULKAN_HPP_NAMESPACE::PipelineCache pipelineCache, Dispatch const & d ) const
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     std::vector<uint8_t, Uint8_tAllocator> data;
     size_t                                 dataSize;
     Result                                 result;
@@ -2568,6 +2740,7 @@
                                   Uint8_tAllocator &                  uint8_tAllocator,
                                   Dispatch const &                    d ) const
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     std::vector<uint8_t, Uint8_tAllocator> data( uint8_tAllocator );
     size_t                                 dataSize;
     Result                                 result;
@@ -2600,6 +2773,7 @@
                                  const VULKAN_HPP_NAMESPACE::PipelineCache * pSrcCaches,
                                  Dispatch const &                            d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     return static_cast<Result>( d.vkMergePipelineCaches( m_device,
                                                          static_cast<VkPipelineCache>( dstCache ),
                                                          srcCacheCount,
@@ -2613,6 +2787,7 @@
                                  ArrayProxy<const VULKAN_HPP_NAMESPACE::PipelineCache> const & srcCaches,
                                  Dispatch const &                                              d ) const
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     Result result =
       static_cast<Result>( d.vkMergePipelineCaches( m_device,
                                                     static_cast<VkPipelineCache>( dstCache ),
@@ -2631,6 +2806,7 @@
                                      VULKAN_HPP_NAMESPACE::Pipeline *                         pPipelines,
                                      Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     return static_cast<Result>(
       d.vkCreateGraphicsPipelines( m_device,
                                    static_cast<VkPipelineCache>( pipelineCache ),
@@ -2649,6 +2825,7 @@
       Optional<const AllocationCallbacks>                                        allocator,
       Dispatch const &                                                           d ) const
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     std::vector<Pipeline, PipelineAllocator> pipelines( createInfos.size() );
     Result                                   result = static_cast<Result>(
       d.vkCreateGraphicsPipelines( m_device,
@@ -2677,6 +2854,7 @@
       PipelineAllocator &                                                        pipelineAllocator,
       Dispatch const &                                                           d ) const
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     std::vector<Pipeline, PipelineAllocator> pipelines( createInfos.size(), pipelineAllocator );
     Result                                   result = static_cast<Result>(
       d.vkCreateGraphicsPipelines( m_device,
@@ -2700,6 +2878,7 @@
                                     Optional<const AllocationCallbacks>                      allocator,
                                     Dispatch const &                                         d ) const
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     Pipeline pipeline;
     Result   result = static_cast<Result>(
       d.vkCreateGraphicsPipelines( m_device,
@@ -2725,6 +2904,7 @@
       Optional<const AllocationCallbacks>                                        allocator,
       Dispatch const &                                                           d ) const
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     std::vector<UniqueHandle<Pipeline, Dispatch>, PipelineAllocator> uniquePipelines;
     std::vector<Pipeline>                                            pipelines( createInfos.size() );
     Result                                                           result = static_cast<Result>(
@@ -2765,6 +2945,7 @@
       PipelineAllocator &                                                        pipelineAllocator,
       Dispatch const &                                                           d ) const
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     std::vector<UniqueHandle<Pipeline, Dispatch>, PipelineAllocator> uniquePipelines( pipelineAllocator );
     std::vector<Pipeline>                                            pipelines( createInfos.size() );
     Result                                                           result = static_cast<Result>(
@@ -2799,6 +2980,7 @@
                                           Optional<const AllocationCallbacks>                      allocator,
                                           Dispatch const &                                         d ) const
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     Pipeline pipeline;
     Result   result = static_cast<Result>(
       d.vkCreateGraphicsPipelines( m_device,
@@ -2828,6 +3010,7 @@
                                     VULKAN_HPP_NAMESPACE::Pipeline *                        pPipelines,
                                     Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     return static_cast<Result>(
       d.vkCreateComputePipelines( m_device,
                                   static_cast<VkPipelineCache>( pipelineCache ),
@@ -2846,6 +3029,7 @@
       Optional<const AllocationCallbacks>                                       allocator,
       Dispatch const &                                                          d ) const
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     std::vector<Pipeline, PipelineAllocator> pipelines( createInfos.size() );
     Result                                   result = static_cast<Result>(
       d.vkCreateComputePipelines( m_device,
@@ -2874,6 +3058,7 @@
       PipelineAllocator &                                                       pipelineAllocator,
       Dispatch const &                                                          d ) const
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     std::vector<Pipeline, PipelineAllocator> pipelines( createInfos.size(), pipelineAllocator );
     Result                                   result = static_cast<Result>(
       d.vkCreateComputePipelines( m_device,
@@ -2897,6 +3082,7 @@
                                    Optional<const AllocationCallbacks>                     allocator,
                                    Dispatch const &                                        d ) const
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     Pipeline pipeline;
     Result   result = static_cast<Result>(
       d.vkCreateComputePipelines( m_device,
@@ -2922,6 +3108,7 @@
       Optional<const AllocationCallbacks>                                       allocator,
       Dispatch const &                                                          d ) const
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     std::vector<UniqueHandle<Pipeline, Dispatch>, PipelineAllocator> uniquePipelines;
     std::vector<Pipeline>                                            pipelines( createInfos.size() );
     Result                                                           result = static_cast<Result>(
@@ -2962,6 +3149,7 @@
       PipelineAllocator &                                                       pipelineAllocator,
       Dispatch const &                                                          d ) const
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     std::vector<UniqueHandle<Pipeline, Dispatch>, PipelineAllocator> uniquePipelines( pipelineAllocator );
     std::vector<Pipeline>                                            pipelines( createInfos.size() );
     Result                                                           result = static_cast<Result>(
@@ -2996,6 +3184,7 @@
                                          Optional<const AllocationCallbacks>                     allocator,
                                          Dispatch const &                                        d ) const
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     Pipeline pipeline;
     Result   result = static_cast<Result>(
       d.vkCreateComputePipelines( m_device,
@@ -3021,6 +3210,7 @@
                                                   const VULKAN_HPP_NAMESPACE::AllocationCallbacks * pAllocator,
                                                   Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkDestroyPipeline(
       m_device, static_cast<VkPipeline>( pipeline ), reinterpret_cast<const VkAllocationCallbacks *>( pAllocator ) );
   }
@@ -3031,6 +3221,7 @@
                                                   Optional<const AllocationCallbacks> allocator,
                                                   Dispatch const &                    d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkDestroyPipeline( m_device,
                          static_cast<VkPipeline>( pipeline ),
                          reinterpret_cast<const VkAllocationCallbacks *>(
@@ -3043,6 +3234,7 @@
                                           const VULKAN_HPP_NAMESPACE::AllocationCallbacks * pAllocator,
                                           Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkDestroyPipeline(
       m_device, static_cast<VkPipeline>( pipeline ), reinterpret_cast<const VkAllocationCallbacks *>( pAllocator ) );
   }
@@ -3053,6 +3245,7 @@
                                           Optional<const AllocationCallbacks> allocator,
                                           Dispatch const &                    d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkDestroyPipeline( m_device,
                          static_cast<VkPipeline>( pipeline ),
                          reinterpret_cast<const VkAllocationCallbacks *>(
@@ -3067,6 +3260,7 @@
                                   VULKAN_HPP_NAMESPACE::PipelineLayout *                 pPipelineLayout,
                                   Dispatch const &                                       d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     return static_cast<Result>(
       d.vkCreatePipelineLayout( m_device,
                                 reinterpret_cast<const VkPipelineLayoutCreateInfo *>( pCreateInfo ),
@@ -3082,6 +3276,7 @@
                                   Optional<const AllocationCallbacks> allocator,
                                   Dispatch const &                    d ) const
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     VULKAN_HPP_NAMESPACE::PipelineLayout pipelineLayout;
     Result                               result = static_cast<Result>(
       d.vkCreatePipelineLayout( m_device,
@@ -3100,6 +3295,7 @@
                                         Optional<const AllocationCallbacks> allocator,
                                         Dispatch const &                    d ) const
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     VULKAN_HPP_NAMESPACE::PipelineLayout pipelineLayout;
     Result                               result = static_cast<Result>(
       d.vkCreatePipelineLayout( m_device,
@@ -3119,6 +3315,7 @@
                                                         const VULKAN_HPP_NAMESPACE::AllocationCallbacks * pAllocator,
                                                         Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkDestroyPipelineLayout( m_device,
                                static_cast<VkPipelineLayout>( pipelineLayout ),
                                reinterpret_cast<const VkAllocationCallbacks *>( pAllocator ) );
@@ -3130,6 +3327,7 @@
                                                         Optional<const AllocationCallbacks>  allocator,
                                                         Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkDestroyPipelineLayout( m_device,
                                static_cast<VkPipelineLayout>( pipelineLayout ),
                                reinterpret_cast<const VkAllocationCallbacks *>(
@@ -3142,6 +3340,7 @@
                                           const VULKAN_HPP_NAMESPACE::AllocationCallbacks * pAllocator,
                                           Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkDestroyPipelineLayout( m_device,
                                static_cast<VkPipelineLayout>( pipelineLayout ),
                                reinterpret_cast<const VkAllocationCallbacks *>( pAllocator ) );
@@ -3153,6 +3352,7 @@
                                           Optional<const AllocationCallbacks>  allocator,
                                           Dispatch const &                     d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkDestroyPipelineLayout( m_device,
                                static_cast<VkPipelineLayout>( pipelineLayout ),
                                reinterpret_cast<const VkAllocationCallbacks *>(
@@ -3167,6 +3367,7 @@
                            VULKAN_HPP_NAMESPACE::Sampler *                   pSampler,
                            Dispatch const &                                  d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     return static_cast<Result>( d.vkCreateSampler( m_device,
                                                    reinterpret_cast<const VkSamplerCreateInfo *>( pCreateInfo ),
                                                    reinterpret_cast<const VkAllocationCallbacks *>( pAllocator ),
@@ -3181,6 +3382,7 @@
                            Optional<const AllocationCallbacks> allocator,
                            Dispatch const &                    d ) const
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     VULKAN_HPP_NAMESPACE::Sampler sampler;
     Result                        result = static_cast<Result>(
       d.vkCreateSampler( m_device,
@@ -3199,6 +3401,7 @@
                                  Optional<const AllocationCallbacks> allocator,
                                  Dispatch const &                    d ) const
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     VULKAN_HPP_NAMESPACE::Sampler sampler;
     Result                        result = static_cast<Result>(
       d.vkCreateSampler( m_device,
@@ -3218,6 +3421,7 @@
                                                  const VULKAN_HPP_NAMESPACE::AllocationCallbacks * pAllocator,
                                                  Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkDestroySampler(
       m_device, static_cast<VkSampler>( sampler ), reinterpret_cast<const VkAllocationCallbacks *>( pAllocator ) );
   }
@@ -3228,6 +3432,7 @@
                                                  Optional<const AllocationCallbacks> allocator,
                                                  Dispatch const &                    d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkDestroySampler( m_device,
                         static_cast<VkSampler>( sampler ),
                         reinterpret_cast<const VkAllocationCallbacks *>(
@@ -3240,6 +3445,7 @@
                                           const VULKAN_HPP_NAMESPACE::AllocationCallbacks * pAllocator,
                                           Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkDestroySampler(
       m_device, static_cast<VkSampler>( sampler ), reinterpret_cast<const VkAllocationCallbacks *>( pAllocator ) );
   }
@@ -3250,6 +3456,7 @@
                                           Optional<const AllocationCallbacks> allocator,
                                           Dispatch const &                    d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkDestroySampler( m_device,
                         static_cast<VkSampler>( sampler ),
                         reinterpret_cast<const VkAllocationCallbacks *>(
@@ -3264,6 +3471,7 @@
                                        VULKAN_HPP_NAMESPACE::DescriptorSetLayout *                 pSetLayout,
                                        Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     return static_cast<Result>(
       d.vkCreateDescriptorSetLayout( m_device,
                                      reinterpret_cast<const VkDescriptorSetLayoutCreateInfo *>( pCreateInfo ),
@@ -3279,6 +3487,7 @@
                                        Optional<const AllocationCallbacks>   allocator,
                                        Dispatch const &                      d ) const
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     VULKAN_HPP_NAMESPACE::DescriptorSetLayout setLayout;
     Result                                    result = static_cast<Result>(
       d.vkCreateDescriptorSetLayout( m_device,
@@ -3297,6 +3506,7 @@
                                              Optional<const AllocationCallbacks>   allocator,
                                              Dispatch const &                      d ) const
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     VULKAN_HPP_NAMESPACE::DescriptorSetLayout setLayout;
     Result                                    result = static_cast<Result>(
       d.vkCreateDescriptorSetLayout( m_device,
@@ -3317,6 +3527,7 @@
                                         const VULKAN_HPP_NAMESPACE::AllocationCallbacks * pAllocator,
                                         Dispatch const &                                  d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkDestroyDescriptorSetLayout( m_device,
                                     static_cast<VkDescriptorSetLayout>( descriptorSetLayout ),
                                     reinterpret_cast<const VkAllocationCallbacks *>( pAllocator ) );
@@ -3329,6 +3540,7 @@
                                         Optional<const AllocationCallbacks>       allocator,
                                         Dispatch const &                          d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkDestroyDescriptorSetLayout( m_device,
                                     static_cast<VkDescriptorSetLayout>( descriptorSetLayout ),
                                     reinterpret_cast<const VkAllocationCallbacks *>(
@@ -3341,6 +3553,7 @@
                                           const VULKAN_HPP_NAMESPACE::AllocationCallbacks * pAllocator,
                                           Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkDestroyDescriptorSetLayout( m_device,
                                     static_cast<VkDescriptorSetLayout>( descriptorSetLayout ),
                                     reinterpret_cast<const VkAllocationCallbacks *>( pAllocator ) );
@@ -3352,6 +3565,7 @@
                                           Optional<const AllocationCallbacks>       allocator,
                                           Dispatch const &                          d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkDestroyDescriptorSetLayout( m_device,
                                     static_cast<VkDescriptorSetLayout>( descriptorSetLayout ),
                                     reinterpret_cast<const VkAllocationCallbacks *>(
@@ -3366,6 +3580,7 @@
                                   VULKAN_HPP_NAMESPACE::DescriptorPool *                 pDescriptorPool,
                                   Dispatch const &                                       d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     return static_cast<Result>(
       d.vkCreateDescriptorPool( m_device,
                                 reinterpret_cast<const VkDescriptorPoolCreateInfo *>( pCreateInfo ),
@@ -3381,6 +3596,7 @@
                                   Optional<const AllocationCallbacks> allocator,
                                   Dispatch const &                    d ) const
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     VULKAN_HPP_NAMESPACE::DescriptorPool descriptorPool;
     Result                               result = static_cast<Result>(
       d.vkCreateDescriptorPool( m_device,
@@ -3399,6 +3615,7 @@
                                         Optional<const AllocationCallbacks> allocator,
                                         Dispatch const &                    d ) const
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     VULKAN_HPP_NAMESPACE::DescriptorPool descriptorPool;
     Result                               result = static_cast<Result>(
       d.vkCreateDescriptorPool( m_device,
@@ -3418,6 +3635,7 @@
                                                         const VULKAN_HPP_NAMESPACE::AllocationCallbacks * pAllocator,
                                                         Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkDestroyDescriptorPool( m_device,
                                static_cast<VkDescriptorPool>( descriptorPool ),
                                reinterpret_cast<const VkAllocationCallbacks *>( pAllocator ) );
@@ -3429,6 +3647,7 @@
                                                         Optional<const AllocationCallbacks>  allocator,
                                                         Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkDestroyDescriptorPool( m_device,
                                static_cast<VkDescriptorPool>( descriptorPool ),
                                reinterpret_cast<const VkAllocationCallbacks *>(
@@ -3441,6 +3660,7 @@
                                           const VULKAN_HPP_NAMESPACE::AllocationCallbacks * pAllocator,
                                           Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkDestroyDescriptorPool( m_device,
                                static_cast<VkDescriptorPool>( descriptorPool ),
                                reinterpret_cast<const VkAllocationCallbacks *>( pAllocator ) );
@@ -3452,6 +3672,7 @@
                                           Optional<const AllocationCallbacks>  allocator,
                                           Dispatch const &                     d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkDestroyDescriptorPool( m_device,
                                static_cast<VkDescriptorPool>( descriptorPool ),
                                reinterpret_cast<const VkAllocationCallbacks *>(
@@ -3465,6 +3686,7 @@
                                                         VULKAN_HPP_NAMESPACE::DescriptorPoolResetFlags flags,
                                                         Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     return static_cast<Result>( d.vkResetDescriptorPool(
       m_device, static_cast<VkDescriptorPool>( descriptorPool ), static_cast<VkDescriptorPoolResetFlags>( flags ) ) );
   }
@@ -3475,6 +3697,7 @@
                                  VULKAN_HPP_NAMESPACE::DescriptorPoolResetFlags flags,
                                  Dispatch const &                               d ) const
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     Result result = static_cast<Result>( d.vkResetDescriptorPool(
       m_device, static_cast<VkDescriptorPool>( descriptorPool ), static_cast<VkDescriptorPoolResetFlags>( flags ) ) );
     return createResultValue( result, VULKAN_HPP_NAMESPACE_STRING "::Device::resetDescriptorPool" );
@@ -3487,6 +3710,7 @@
                                     VULKAN_HPP_NAMESPACE::DescriptorSet *                   pDescriptorSets,
                                     Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     return static_cast<Result>(
       d.vkAllocateDescriptorSets( m_device,
                                   reinterpret_cast<const VkDescriptorSetAllocateInfo *>( pAllocateInfo ),
@@ -3499,6 +3723,7 @@
     typename ResultValueType<std::vector<DescriptorSet, DescriptorSetAllocator>>::type
     Device::allocateDescriptorSets( const DescriptorSetAllocateInfo & allocateInfo, Dispatch const & d ) const
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     std::vector<DescriptorSet, DescriptorSetAllocator> descriptorSets( allocateInfo.descriptorSetCount );
     Result                                             result = static_cast<Result>(
       d.vkAllocateDescriptorSets( m_device,
@@ -3517,6 +3742,7 @@
                                     DescriptorSetAllocator &          descriptorSetAllocator,
                                     Dispatch const &                  d ) const
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     std::vector<DescriptorSet, DescriptorSetAllocator> descriptorSets( allocateInfo.descriptorSetCount,
                                                                        descriptorSetAllocator );
     Result                                             result = static_cast<Result>(
@@ -3532,6 +3758,7 @@
     typename ResultValueType<std::vector<UniqueHandle<DescriptorSet, Dispatch>, DescriptorSetAllocator>>::type
     Device::allocateDescriptorSetsUnique( const DescriptorSetAllocateInfo & allocateInfo, Dispatch const & d ) const
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     std::vector<UniqueHandle<DescriptorSet, Dispatch>, DescriptorSetAllocator> uniqueDescriptorSets;
     std::vector<DescriptorSet> descriptorSets( allocateInfo.descriptorSetCount );
     Result                     result = static_cast<Result>(
@@ -3562,6 +3789,7 @@
                                           DescriptorSetAllocator &          descriptorSetAllocator,
                                           Dispatch const &                  d ) const
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     std::vector<UniqueHandle<DescriptorSet, Dispatch>, DescriptorSetAllocator> uniqueDescriptorSets(
       descriptorSetAllocator );
     std::vector<DescriptorSet> descriptorSets( allocateInfo.descriptorSetCount );
@@ -3590,6 +3818,7 @@
                                                        const VULKAN_HPP_NAMESPACE::DescriptorSet * pDescriptorSets,
                                                        Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     return static_cast<Result>(
       d.vkFreeDescriptorSets( m_device,
                               static_cast<VkDescriptorPool>( descriptorPool ),
@@ -3604,6 +3833,7 @@
                                 ArrayProxy<const VULKAN_HPP_NAMESPACE::DescriptorSet> const & descriptorSets,
                                 Dispatch const &                                              d ) const
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     Result result = static_cast<Result>(
       d.vkFreeDescriptorSets( m_device,
                               static_cast<VkDescriptorPool>( descriptorPool ),
@@ -3619,6 +3849,7 @@
                                          const VULKAN_HPP_NAMESPACE::DescriptorSet * pDescriptorSets,
                                          Dispatch const &                            d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     return static_cast<Result>(
       d.vkFreeDescriptorSets( m_device,
                               static_cast<VkDescriptorPool>( descriptorPool ),
@@ -3633,6 +3864,7 @@
                   ArrayProxy<const VULKAN_HPP_NAMESPACE::DescriptorSet> const & descriptorSets,
                   Dispatch const &                                              d ) const
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     Result result = static_cast<Result>(
       d.vkFreeDescriptorSets( m_device,
                               static_cast<VkDescriptorPool>( descriptorPool ),
@@ -3650,6 +3882,7 @@
                                   const VULKAN_HPP_NAMESPACE::CopyDescriptorSet *  pDescriptorCopies,
                                   Dispatch const &                                 d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkUpdateDescriptorSets( m_device,
                               descriptorWriteCount,
                               reinterpret_cast<const VkWriteDescriptorSet *>( pDescriptorWrites ),
@@ -3664,6 +3897,7 @@
                                   ArrayProxy<const VULKAN_HPP_NAMESPACE::CopyDescriptorSet> const &  descriptorCopies,
                                   Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkUpdateDescriptorSets( m_device,
                               descriptorWrites.size(),
                               reinterpret_cast<const VkWriteDescriptorSet *>( descriptorWrites.data() ),
@@ -3679,6 +3913,7 @@
                                VULKAN_HPP_NAMESPACE::Framebuffer *                 pFramebuffer,
                                Dispatch const &                                    d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     return static_cast<Result>( d.vkCreateFramebuffer( m_device,
                                                        reinterpret_cast<const VkFramebufferCreateInfo *>( pCreateInfo ),
                                                        reinterpret_cast<const VkAllocationCallbacks *>( pAllocator ),
@@ -3693,6 +3928,7 @@
                                Optional<const AllocationCallbacks> allocator,
                                Dispatch const &                    d ) const
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     VULKAN_HPP_NAMESPACE::Framebuffer framebuffer;
     Result                            result = static_cast<Result>(
       d.vkCreateFramebuffer( m_device,
@@ -3711,6 +3947,7 @@
                                      Optional<const AllocationCallbacks> allocator,
                                      Dispatch const &                    d ) const
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     VULKAN_HPP_NAMESPACE::Framebuffer framebuffer;
     Result                            result = static_cast<Result>(
       d.vkCreateFramebuffer( m_device,
@@ -3730,6 +3967,7 @@
                                                      const VULKAN_HPP_NAMESPACE::AllocationCallbacks * pAllocator,
                                                      Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkDestroyFramebuffer( m_device,
                             static_cast<VkFramebuffer>( framebuffer ),
                             reinterpret_cast<const VkAllocationCallbacks *>( pAllocator ) );
@@ -3741,6 +3979,7 @@
                                                      Optional<const AllocationCallbacks> allocator,
                                                      Dispatch const &                    d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkDestroyFramebuffer( m_device,
                             static_cast<VkFramebuffer>( framebuffer ),
                             reinterpret_cast<const VkAllocationCallbacks *>(
@@ -3753,6 +3992,7 @@
                                           const VULKAN_HPP_NAMESPACE::AllocationCallbacks * pAllocator,
                                           Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkDestroyFramebuffer( m_device,
                             static_cast<VkFramebuffer>( framebuffer ),
                             reinterpret_cast<const VkAllocationCallbacks *>( pAllocator ) );
@@ -3764,6 +4004,7 @@
                                           Optional<const AllocationCallbacks> allocator,
                                           Dispatch const &                    d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkDestroyFramebuffer( m_device,
                             static_cast<VkFramebuffer>( framebuffer ),
                             reinterpret_cast<const VkAllocationCallbacks *>(
@@ -3778,6 +4019,7 @@
                               VULKAN_HPP_NAMESPACE::RenderPass *                 pRenderPass,
                               Dispatch const &                                   d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     return static_cast<Result>( d.vkCreateRenderPass( m_device,
                                                       reinterpret_cast<const VkRenderPassCreateInfo *>( pCreateInfo ),
                                                       reinterpret_cast<const VkAllocationCallbacks *>( pAllocator ),
@@ -3792,6 +4034,7 @@
                               Optional<const AllocationCallbacks> allocator,
                               Dispatch const &                    d ) const
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     VULKAN_HPP_NAMESPACE::RenderPass renderPass;
     Result                           result = static_cast<Result>(
       d.vkCreateRenderPass( m_device,
@@ -3810,6 +4053,7 @@
                                     Optional<const AllocationCallbacks> allocator,
                                     Dispatch const &                    d ) const
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     VULKAN_HPP_NAMESPACE::RenderPass renderPass;
     Result                           result = static_cast<Result>(
       d.vkCreateRenderPass( m_device,
@@ -3829,6 +4073,7 @@
                                                     const VULKAN_HPP_NAMESPACE::AllocationCallbacks * pAllocator,
                                                     Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkDestroyRenderPass( m_device,
                            static_cast<VkRenderPass>( renderPass ),
                            reinterpret_cast<const VkAllocationCallbacks *>( pAllocator ) );
@@ -3840,6 +4085,7 @@
                                                     Optional<const AllocationCallbacks> allocator,
                                                     Dispatch const &                    d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkDestroyRenderPass( m_device,
                            static_cast<VkRenderPass>( renderPass ),
                            reinterpret_cast<const VkAllocationCallbacks *>(
@@ -3852,6 +4098,7 @@
                                           const VULKAN_HPP_NAMESPACE::AllocationCallbacks * pAllocator,
                                           Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkDestroyRenderPass( m_device,
                            static_cast<VkRenderPass>( renderPass ),
                            reinterpret_cast<const VkAllocationCallbacks *>( pAllocator ) );
@@ -3863,6 +4110,7 @@
                                           Optional<const AllocationCallbacks> allocator,
                                           Dispatch const &                    d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkDestroyRenderPass( m_device,
                            static_cast<VkRenderPass>( renderPass ),
                            reinterpret_cast<const VkAllocationCallbacks *>(
@@ -3875,6 +4123,7 @@
                                                            VULKAN_HPP_NAMESPACE::Extent2D * pGranularity,
                                                            Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkGetRenderAreaGranularity(
       m_device, static_cast<VkRenderPass>( renderPass ), reinterpret_cast<VkExtent2D *>( pGranularity ) );
   }
@@ -3885,6 +4134,7 @@
                                          Device::getRenderAreaGranularity( VULKAN_HPP_NAMESPACE::RenderPass renderPass,
                                       Dispatch const &                 d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     VULKAN_HPP_NAMESPACE::Extent2D granularity;
     d.vkGetRenderAreaGranularity(
       m_device, static_cast<VkRenderPass>( renderPass ), reinterpret_cast<VkExtent2D *>( &granularity ) );
@@ -3899,6 +4149,7 @@
                                VULKAN_HPP_NAMESPACE::CommandPool *                 pCommandPool,
                                Dispatch const &                                    d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     return static_cast<Result>( d.vkCreateCommandPool( m_device,
                                                        reinterpret_cast<const VkCommandPoolCreateInfo *>( pCreateInfo ),
                                                        reinterpret_cast<const VkAllocationCallbacks *>( pAllocator ),
@@ -3913,6 +4164,7 @@
                                Optional<const AllocationCallbacks> allocator,
                                Dispatch const &                    d ) const
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     VULKAN_HPP_NAMESPACE::CommandPool commandPool;
     Result                            result = static_cast<Result>(
       d.vkCreateCommandPool( m_device,
@@ -3931,6 +4183,7 @@
                                      Optional<const AllocationCallbacks> allocator,
                                      Dispatch const &                    d ) const
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     VULKAN_HPP_NAMESPACE::CommandPool commandPool;
     Result                            result = static_cast<Result>(
       d.vkCreateCommandPool( m_device,
@@ -3950,6 +4203,7 @@
                                                      const VULKAN_HPP_NAMESPACE::AllocationCallbacks * pAllocator,
                                                      Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkDestroyCommandPool( m_device,
                             static_cast<VkCommandPool>( commandPool ),
                             reinterpret_cast<const VkAllocationCallbacks *>( pAllocator ) );
@@ -3961,6 +4215,7 @@
                                                      Optional<const AllocationCallbacks> allocator,
                                                      Dispatch const &                    d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkDestroyCommandPool( m_device,
                             static_cast<VkCommandPool>( commandPool ),
                             reinterpret_cast<const VkAllocationCallbacks *>(
@@ -3973,6 +4228,7 @@
                                           const VULKAN_HPP_NAMESPACE::AllocationCallbacks * pAllocator,
                                           Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkDestroyCommandPool( m_device,
                             static_cast<VkCommandPool>( commandPool ),
                             reinterpret_cast<const VkAllocationCallbacks *>( pAllocator ) );
@@ -3984,6 +4240,7 @@
                                           Optional<const AllocationCallbacks> allocator,
                                           Dispatch const &                    d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkDestroyCommandPool( m_device,
                             static_cast<VkCommandPool>( commandPool ),
                             reinterpret_cast<const VkAllocationCallbacks *>(
@@ -3998,6 +4255,7 @@
                               VULKAN_HPP_NAMESPACE::CommandPoolResetFlags flags,
                               Dispatch const &                            d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     return static_cast<Result>( d.vkResetCommandPool(
       m_device, static_cast<VkCommandPool>( commandPool ), static_cast<VkCommandPoolResetFlags>( flags ) ) );
   }
@@ -4008,6 +4266,7 @@
                               VULKAN_HPP_NAMESPACE::CommandPoolResetFlags flags,
                               Dispatch const &                            d ) const
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     Result result = static_cast<Result>( d.vkResetCommandPool(
       m_device, static_cast<VkCommandPool>( commandPool ), static_cast<VkCommandPoolResetFlags>( flags ) ) );
     return createResultValue( result, VULKAN_HPP_NAMESPACE_STRING "::Device::resetCommandPool" );
@@ -4020,6 +4279,7 @@
                                     VULKAN_HPP_NAMESPACE::CommandBuffer *                   pCommandBuffers,
                                     Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     return static_cast<Result>(
       d.vkAllocateCommandBuffers( m_device,
                                   reinterpret_cast<const VkCommandBufferAllocateInfo *>( pAllocateInfo ),
@@ -4032,6 +4292,7 @@
     typename ResultValueType<std::vector<CommandBuffer, CommandBufferAllocator>>::type
     Device::allocateCommandBuffers( const CommandBufferAllocateInfo & allocateInfo, Dispatch const & d ) const
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     std::vector<CommandBuffer, CommandBufferAllocator> commandBuffers( allocateInfo.commandBufferCount );
     Result                                             result = static_cast<Result>(
       d.vkAllocateCommandBuffers( m_device,
@@ -4050,6 +4311,7 @@
                                     CommandBufferAllocator &          commandBufferAllocator,
                                     Dispatch const &                  d ) const
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     std::vector<CommandBuffer, CommandBufferAllocator> commandBuffers( allocateInfo.commandBufferCount,
                                                                        commandBufferAllocator );
     Result                                             result = static_cast<Result>(
@@ -4065,6 +4327,7 @@
     typename ResultValueType<std::vector<UniqueHandle<CommandBuffer, Dispatch>, CommandBufferAllocator>>::type
     Device::allocateCommandBuffersUnique( const CommandBufferAllocateInfo & allocateInfo, Dispatch const & d ) const
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     std::vector<UniqueHandle<CommandBuffer, Dispatch>, CommandBufferAllocator> uniqueCommandBuffers;
     std::vector<CommandBuffer> commandBuffers( allocateInfo.commandBufferCount );
     Result                     result = static_cast<Result>(
@@ -4095,6 +4358,7 @@
                                           CommandBufferAllocator &          commandBufferAllocator,
                                           Dispatch const &                  d ) const
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     std::vector<UniqueHandle<CommandBuffer, Dispatch>, CommandBufferAllocator> uniqueCommandBuffers(
       commandBufferAllocator );
     std::vector<CommandBuffer> commandBuffers( allocateInfo.commandBufferCount );
@@ -4123,6 +4387,7 @@
                                                      const VULKAN_HPP_NAMESPACE::CommandBuffer * pCommandBuffers,
                                                      Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkFreeCommandBuffers( m_device,
                             static_cast<VkCommandPool>( commandPool ),
                             commandBufferCount,
@@ -4136,6 +4401,7 @@
                                 ArrayProxy<const VULKAN_HPP_NAMESPACE::CommandBuffer> const & commandBuffers,
                                 Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkFreeCommandBuffers( m_device,
                             static_cast<VkCommandPool>( commandPool ),
                             commandBuffers.size(),
@@ -4149,6 +4415,7 @@
                                        const VULKAN_HPP_NAMESPACE::CommandBuffer * pCommandBuffers,
                                        Dispatch const &                            d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkFreeCommandBuffers( m_device,
                             static_cast<VkCommandPool>( commandPool ),
                             commandBufferCount,
@@ -4161,6 +4428,7 @@
                                        ArrayProxy<const VULKAN_HPP_NAMESPACE::CommandBuffer> const & commandBuffers,
                                        Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkFreeCommandBuffers( m_device,
                             static_cast<VkCommandPool>( commandPool ),
                             commandBuffers.size(),
@@ -4172,6 +4440,7 @@
   VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE Result CommandBuffer::begin(
     const VULKAN_HPP_NAMESPACE::CommandBufferBeginInfo * pBeginInfo, Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     return static_cast<Result>(
       d.vkBeginCommandBuffer( m_commandBuffer, reinterpret_cast<const VkCommandBufferBeginInfo *>( pBeginInfo ) ) );
   }
@@ -4181,6 +4450,7 @@
   VULKAN_HPP_NODISCARD_WHEN_NO_EXCEPTIONS VULKAN_HPP_INLINE typename ResultValueType<void>::type
                                           CommandBuffer::begin( const CommandBufferBeginInfo & beginInfo, Dispatch const & d ) const
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     Result result = static_cast<Result>(
       d.vkBeginCommandBuffer( m_commandBuffer, reinterpret_cast<const VkCommandBufferBeginInfo *>( &beginInfo ) ) );
     return createResultValue( result, VULKAN_HPP_NAMESPACE_STRING "::CommandBuffer::begin" );
@@ -4191,6 +4461,7 @@
   template <typename Dispatch>
   VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE Result CommandBuffer::end( Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     return static_cast<Result>( d.vkEndCommandBuffer( m_commandBuffer ) );
   }
 #else
@@ -4198,6 +4469,7 @@
   VULKAN_HPP_NODISCARD_WHEN_NO_EXCEPTIONS VULKAN_HPP_INLINE typename ResultValueType<void>::type
                                           CommandBuffer::end( Dispatch const & d ) const
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     Result result = static_cast<Result>( d.vkEndCommandBuffer( m_commandBuffer ) );
     return createResultValue( result, VULKAN_HPP_NAMESPACE_STRING "::CommandBuffer::end" );
   }
@@ -4208,6 +4480,7 @@
   VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE Result CommandBuffer::reset(
     VULKAN_HPP_NAMESPACE::CommandBufferResetFlags flags, Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     return static_cast<Result>(
       d.vkResetCommandBuffer( m_commandBuffer, static_cast<VkCommandBufferResetFlags>( flags ) ) );
   }
@@ -4216,6 +4489,7 @@
   VULKAN_HPP_INLINE typename ResultValueType<void>::type
     CommandBuffer::reset( VULKAN_HPP_NAMESPACE::CommandBufferResetFlags flags, Dispatch const & d ) const
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     Result result =
       static_cast<Result>( d.vkResetCommandBuffer( m_commandBuffer, static_cast<VkCommandBufferResetFlags>( flags ) ) );
     return createResultValue( result, VULKAN_HPP_NAMESPACE_STRING "::CommandBuffer::reset" );
@@ -4227,6 +4501,7 @@
                                                       VULKAN_HPP_NAMESPACE::Pipeline          pipeline,
                                                       Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkCmdBindPipeline(
       m_commandBuffer, static_cast<VkPipelineBindPoint>( pipelineBindPoint ), static_cast<VkPipeline>( pipeline ) );
   }
@@ -4237,6 +4512,7 @@
                                                      const VULKAN_HPP_NAMESPACE::Viewport * pViewports,
                                                      Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkCmdSetViewport(
       m_commandBuffer, firstViewport, viewportCount, reinterpret_cast<const VkViewport *>( pViewports ) );
   }
@@ -4247,6 +4523,7 @@
                                                      ArrayProxy<const VULKAN_HPP_NAMESPACE::Viewport> const & viewports,
                                                      Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkCmdSetViewport(
       m_commandBuffer, firstViewport, viewports.size(), reinterpret_cast<const VkViewport *>( viewports.data() ) );
   }
@@ -4258,6 +4535,7 @@
                                                     const VULKAN_HPP_NAMESPACE::Rect2D * pScissors,
                                                     Dispatch const &                     d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkCmdSetScissor( m_commandBuffer, firstScissor, scissorCount, reinterpret_cast<const VkRect2D *>( pScissors ) );
   }
 
@@ -4267,6 +4545,7 @@
                                                     ArrayProxy<const VULKAN_HPP_NAMESPACE::Rect2D> const & scissors,
                                                     Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkCmdSetScissor(
       m_commandBuffer, firstScissor, scissors.size(), reinterpret_cast<const VkRect2D *>( scissors.data() ) );
   }
@@ -4275,6 +4554,7 @@
   template <typename Dispatch>
   VULKAN_HPP_INLINE void CommandBuffer::setLineWidth( float lineWidth, Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkCmdSetLineWidth( m_commandBuffer, lineWidth );
   }
 
@@ -4284,6 +4564,7 @@
                                                       float            depthBiasSlopeFactor,
                                                       Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkCmdSetDepthBias( m_commandBuffer, depthBiasConstantFactor, depthBiasClamp, depthBiasSlopeFactor );
   }
 
@@ -4291,6 +4572,7 @@
   VULKAN_HPP_INLINE void CommandBuffer::setBlendConstants( const float      blendConstants[4],
                                                            Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkCmdSetBlendConstants( m_commandBuffer, blendConstants );
   }
 
@@ -4299,6 +4581,7 @@
                                                         float            maxDepthBounds,
                                                         Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkCmdSetDepthBounds( m_commandBuffer, minDepthBounds, maxDepthBounds );
   }
 
@@ -4307,6 +4590,7 @@
                                                                uint32_t                               compareMask,
                                                                Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkCmdSetStencilCompareMask( m_commandBuffer, static_cast<VkStencilFaceFlags>( faceMask ), compareMask );
   }
 
@@ -4315,6 +4599,7 @@
                                                              uint32_t                               writeMask,
                                                              Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkCmdSetStencilWriteMask( m_commandBuffer, static_cast<VkStencilFaceFlags>( faceMask ), writeMask );
   }
 
@@ -4323,6 +4608,7 @@
                                                              uint32_t                               reference,
                                                              Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkCmdSetStencilReference( m_commandBuffer, static_cast<VkStencilFaceFlags>( faceMask ), reference );
   }
 
@@ -4336,6 +4622,7 @@
                                                             const uint32_t * pDynamicOffsets,
                                                             Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkCmdBindDescriptorSets( m_commandBuffer,
                                static_cast<VkPipelineBindPoint>( pipelineBindPoint ),
                                static_cast<VkPipelineLayout>( layout ),
@@ -4356,6 +4643,7 @@
                                        ArrayProxy<const uint32_t> const &                            dynamicOffsets,
                                        Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkCmdBindDescriptorSets( m_commandBuffer,
                                static_cast<VkPipelineBindPoint>( pipelineBindPoint ),
                                static_cast<VkPipelineLayout>( layout ),
@@ -4373,6 +4661,7 @@
                                                          VULKAN_HPP_NAMESPACE::IndexType  indexType,
                                                          Dispatch const &                 d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkCmdBindIndexBuffer( m_commandBuffer,
                             static_cast<VkBuffer>( buffer ),
                             static_cast<VkDeviceSize>( offset ),
@@ -4386,6 +4675,7 @@
                                                            const VULKAN_HPP_NAMESPACE::DeviceSize * pOffsets,
                                                            Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkCmdBindVertexBuffers( m_commandBuffer,
                               firstBinding,
                               bindingCount,
@@ -4401,6 +4691,7 @@
                                       ArrayProxy<const VULKAN_HPP_NAMESPACE::DeviceSize> const & offsets,
                                       Dispatch const & d ) const VULKAN_HPP_NOEXCEPT_WHEN_NO_EXCEPTIONS
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
 #  ifdef VULKAN_HPP_NO_EXCEPTIONS
     VULKAN_HPP_ASSERT( buffers.size() == offsets.size() );
 #  else
@@ -4426,6 +4717,7 @@
                                               uint32_t         firstInstance,
                                               Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkCmdDraw( m_commandBuffer, vertexCount, instanceCount, firstVertex, firstInstance );
   }
 
@@ -4437,6 +4729,7 @@
                                                      uint32_t         firstInstance,
                                                      Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkCmdDrawIndexed( m_commandBuffer, indexCount, instanceCount, firstIndex, vertexOffset, firstInstance );
   }
 
@@ -4447,6 +4740,7 @@
                                                       uint32_t                         stride,
                                                       Dispatch const &                 d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkCmdDrawIndirect(
       m_commandBuffer, static_cast<VkBuffer>( buffer ), static_cast<VkDeviceSize>( offset ), drawCount, stride );
   }
@@ -4458,6 +4752,7 @@
                                                              uint32_t                         stride,
                                                              Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkCmdDrawIndexedIndirect(
       m_commandBuffer, static_cast<VkBuffer>( buffer ), static_cast<VkDeviceSize>( offset ), drawCount, stride );
   }
@@ -4468,6 +4763,7 @@
                                                   uint32_t         groupCountZ,
                                                   Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkCmdDispatch( m_commandBuffer, groupCountX, groupCountY, groupCountZ );
   }
 
@@ -4476,6 +4772,7 @@
                                                           VULKAN_HPP_NAMESPACE::DeviceSize offset,
                                                           Dispatch const &                 d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkCmdDispatchIndirect( m_commandBuffer, static_cast<VkBuffer>( buffer ), static_cast<VkDeviceSize>( offset ) );
   }
 
@@ -4486,6 +4783,7 @@
                                                     const VULKAN_HPP_NAMESPACE::BufferCopy * pRegions,
                                                     Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkCmdCopyBuffer( m_commandBuffer,
                        static_cast<VkBuffer>( srcBuffer ),
                        static_cast<VkBuffer>( dstBuffer ),
@@ -4500,6 +4798,7 @@
                                                     ArrayProxy<const VULKAN_HPP_NAMESPACE::BufferCopy> const & regions,
                                                     Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkCmdCopyBuffer( m_commandBuffer,
                        static_cast<VkBuffer>( srcBuffer ),
                        static_cast<VkBuffer>( dstBuffer ),
@@ -4517,6 +4816,7 @@
                                                    const VULKAN_HPP_NAMESPACE::ImageCopy * pRegions,
                                                    Dispatch const &                        d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkCmdCopyImage( m_commandBuffer,
                       static_cast<VkImage>( srcImage ),
                       static_cast<VkImageLayout>( srcImageLayout ),
@@ -4535,6 +4835,7 @@
                                                    ArrayProxy<const VULKAN_HPP_NAMESPACE::ImageCopy> const & regions,
                                                    Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkCmdCopyImage( m_commandBuffer,
                       static_cast<VkImage>( srcImage ),
                       static_cast<VkImageLayout>( srcImageLayout ),
@@ -4555,6 +4856,7 @@
                                                    VULKAN_HPP_NAMESPACE::Filter            filter,
                                                    Dispatch const &                        d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkCmdBlitImage( m_commandBuffer,
                       static_cast<VkImage>( srcImage ),
                       static_cast<VkImageLayout>( srcImageLayout ),
@@ -4575,6 +4877,7 @@
                                                    VULKAN_HPP_NAMESPACE::Filter                              filter,
                                                    Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkCmdBlitImage( m_commandBuffer,
                       static_cast<VkImage>( srcImage ),
                       static_cast<VkImageLayout>( srcImageLayout ),
@@ -4594,6 +4897,7 @@
                                                            const VULKAN_HPP_NAMESPACE::BufferImageCopy * pRegions,
                                                            Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkCmdCopyBufferToImage( m_commandBuffer,
                               static_cast<VkBuffer>( srcBuffer ),
                               static_cast<VkImage>( dstImage ),
@@ -4611,6 +4915,7 @@
                                       ArrayProxy<const VULKAN_HPP_NAMESPACE::BufferImageCopy> const & regions,
                                       Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkCmdCopyBufferToImage( m_commandBuffer,
                               static_cast<VkBuffer>( srcBuffer ),
                               static_cast<VkImage>( dstImage ),
@@ -4628,6 +4933,7 @@
                                                            const VULKAN_HPP_NAMESPACE::BufferImageCopy * pRegions,
                                                            Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkCmdCopyImageToBuffer( m_commandBuffer,
                               static_cast<VkImage>( srcImage ),
                               static_cast<VkImageLayout>( srcImageLayout ),
@@ -4645,6 +4951,7 @@
                                       ArrayProxy<const VULKAN_HPP_NAMESPACE::BufferImageCopy> const & regions,
                                       Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkCmdCopyImageToBuffer( m_commandBuffer,
                               static_cast<VkImage>( srcImage ),
                               static_cast<VkImageLayout>( srcImageLayout ),
@@ -4661,6 +4968,7 @@
                                                       const void *                     pData,
                                                       Dispatch const &                 d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkCmdUpdateBuffer( m_commandBuffer,
                          static_cast<VkBuffer>( dstBuffer ),
                          static_cast<VkDeviceSize>( dstOffset ),
@@ -4675,6 +4983,7 @@
                                                       ArrayProxy<const T> const &      data,
                                                       Dispatch const &                 d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkCmdUpdateBuffer( m_commandBuffer,
                          static_cast<VkBuffer>( dstBuffer ),
                          static_cast<VkDeviceSize>( dstOffset ),
@@ -4690,6 +4999,7 @@
                                                     uint32_t                         data,
                                                     Dispatch const &                 d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkCmdFillBuffer( m_commandBuffer,
                        static_cast<VkBuffer>( dstBuffer ),
                        static_cast<VkDeviceSize>( dstOffset ),
@@ -4705,6 +5015,7 @@
                                                          const VULKAN_HPP_NAMESPACE::ImageSubresourceRange * pRanges,
                                                          Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkCmdClearColorImage( m_commandBuffer,
                             static_cast<VkImage>( image ),
                             static_cast<VkImageLayout>( imageLayout ),
@@ -4722,6 +5033,7 @@
                                     ArrayProxy<const VULKAN_HPP_NAMESPACE::ImageSubresourceRange> const & ranges,
                                     Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkCmdClearColorImage( m_commandBuffer,
                             static_cast<VkImage>( image ),
                             static_cast<VkImageLayout>( imageLayout ),
@@ -4740,6 +5052,7 @@
                                            const VULKAN_HPP_NAMESPACE::ImageSubresourceRange *  pRanges,
                                            Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkCmdClearDepthStencilImage( m_commandBuffer,
                                    static_cast<VkImage>( image ),
                                    static_cast<VkImageLayout>( imageLayout ),
@@ -4757,6 +5070,7 @@
                                            ArrayProxy<const VULKAN_HPP_NAMESPACE::ImageSubresourceRange> const & ranges,
                                            Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkCmdClearDepthStencilImage( m_commandBuffer,
                                    static_cast<VkImage>( image ),
                                    static_cast<VkImageLayout>( imageLayout ),
@@ -4773,6 +5087,7 @@
                                                           const VULKAN_HPP_NAMESPACE::ClearRect *       pRects,
                                                           Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkCmdClearAttachments( m_commandBuffer,
                              attachmentCount,
                              reinterpret_cast<const VkClearAttachment *>( pAttachments ),
@@ -4787,6 +5102,7 @@
                                      ArrayProxy<const VULKAN_HPP_NAMESPACE::ClearRect> const &       rects,
                                      Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkCmdClearAttachments( m_commandBuffer,
                              attachments.size(),
                              reinterpret_cast<const VkClearAttachment *>( attachments.data() ),
@@ -4804,6 +5120,7 @@
                                                       const VULKAN_HPP_NAMESPACE::ImageResolve * pRegions,
                                                       Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkCmdResolveImage( m_commandBuffer,
                          static_cast<VkImage>( srcImage ),
                          static_cast<VkImageLayout>( srcImageLayout ),
@@ -4823,6 +5140,7 @@
                                  ArrayProxy<const VULKAN_HPP_NAMESPACE::ImageResolve> const & regions,
                                  Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkCmdResolveImage( m_commandBuffer,
                          static_cast<VkImage>( srcImage ),
                          static_cast<VkImageLayout>( srcImageLayout ),
@@ -4838,6 +5156,7 @@
                                                   VULKAN_HPP_NAMESPACE::PipelineStageFlags stageMask,
                                                   Dispatch const &                         d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkCmdSetEvent( m_commandBuffer, static_cast<VkEvent>( event ), static_cast<VkPipelineStageFlags>( stageMask ) );
   }
 
@@ -4846,6 +5165,7 @@
                                                     VULKAN_HPP_NAMESPACE::PipelineStageFlags stageMask,
                                                     Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkCmdResetEvent( m_commandBuffer, static_cast<VkEvent>( event ), static_cast<VkPipelineStageFlags>( stageMask ) );
   }
 
@@ -4863,6 +5183,7 @@
                                const VULKAN_HPP_NAMESPACE::ImageMemoryBarrier *  pImageMemoryBarriers,
                                Dispatch const &                                  d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkCmdWaitEvents( m_commandBuffer,
                        eventCount,
                        reinterpret_cast<const VkEvent *>( pEvents ),
@@ -4887,6 +5208,7 @@
                                ArrayProxy<const VULKAN_HPP_NAMESPACE::ImageMemoryBarrier> const &  imageMemoryBarriers,
                                Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkCmdWaitEvents( m_commandBuffer,
                        events.size(),
                        reinterpret_cast<const VkEvent *>( events.data() ),
@@ -4914,6 +5236,7 @@
                                     const VULKAN_HPP_NAMESPACE::ImageMemoryBarrier *  pImageMemoryBarriers,
                                     Dispatch const &                                  d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkCmdPipelineBarrier( m_commandBuffer,
                             static_cast<VkPipelineStageFlags>( srcStageMask ),
                             static_cast<VkPipelineStageFlags>( dstStageMask ),
@@ -4937,6 +5260,7 @@
     ArrayProxy<const VULKAN_HPP_NAMESPACE::ImageMemoryBarrier> const &  imageMemoryBarriers,
     Dispatch const &                                                    d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkCmdPipelineBarrier( m_commandBuffer,
                             static_cast<VkPipelineStageFlags>( srcStageMask ),
                             static_cast<VkPipelineStageFlags>( dstStageMask ),
@@ -4956,6 +5280,7 @@
                                                     VULKAN_HPP_NAMESPACE::QueryControlFlags flags,
                                                     Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkCmdBeginQuery(
       m_commandBuffer, static_cast<VkQueryPool>( queryPool ), query, static_cast<VkQueryControlFlags>( flags ) );
   }
@@ -4965,6 +5290,7 @@
                                                   uint32_t                        query,
                                                   Dispatch const &                d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkCmdEndQuery( m_commandBuffer, static_cast<VkQueryPool>( queryPool ), query );
   }
 
@@ -4974,6 +5300,7 @@
                                                         uint32_t                        queryCount,
                                                         Dispatch const &                d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkCmdResetQueryPool( m_commandBuffer, static_cast<VkQueryPool>( queryPool ), firstQuery, queryCount );
   }
 
@@ -4983,6 +5310,7 @@
                                                         uint32_t                                    query,
                                                         Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkCmdWriteTimestamp( m_commandBuffer,
                            static_cast<VkPipelineStageFlagBits>( pipelineStage ),
                            static_cast<VkQueryPool>( queryPool ),
@@ -4999,6 +5327,7 @@
                                                               VULKAN_HPP_NAMESPACE::QueryResultFlags flags,
                                                               Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkCmdCopyQueryPoolResults( m_commandBuffer,
                                  static_cast<VkQueryPool>( queryPool ),
                                  firstQuery,
@@ -5017,6 +5346,7 @@
                                                        const void *                           pValues,
                                                        Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkCmdPushConstants( m_commandBuffer,
                           static_cast<VkPipelineLayout>( layout ),
                           static_cast<VkShaderStageFlags>( stageFlags ),
@@ -5033,6 +5363,7 @@
                                                        ArrayProxy<const T> const &            values,
                                                        Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkCmdPushConstants( m_commandBuffer,
                           static_cast<VkPipelineLayout>( layout ),
                           static_cast<VkShaderStageFlags>( stageFlags ),
@@ -5048,6 +5379,7 @@
                                     VULKAN_HPP_NAMESPACE::SubpassContents             contents,
                                     Dispatch const &                                  d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkCmdBeginRenderPass( m_commandBuffer,
                             reinterpret_cast<const VkRenderPassBeginInfo *>( pRenderPassBegin ),
                             static_cast<VkSubpassContents>( contents ) );
@@ -5059,6 +5391,7 @@
                                                          VULKAN_HPP_NAMESPACE::SubpassContents contents,
                                                          Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkCmdBeginRenderPass( m_commandBuffer,
                             reinterpret_cast<const VkRenderPassBeginInfo *>( &renderPassBegin ),
                             static_cast<VkSubpassContents>( contents ) );
@@ -5069,12 +5402,14 @@
   VULKAN_HPP_INLINE void CommandBuffer::nextSubpass( VULKAN_HPP_NAMESPACE::SubpassContents contents,
                                                      Dispatch const &                      d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkCmdNextSubpass( m_commandBuffer, static_cast<VkSubpassContents>( contents ) );
   }
 
   template <typename Dispatch>
   VULKAN_HPP_INLINE void CommandBuffer::endRenderPass( Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkCmdEndRenderPass( m_commandBuffer );
   }
 
@@ -5083,6 +5418,7 @@
                                                          const VULKAN_HPP_NAMESPACE::CommandBuffer * pCommandBuffers,
                                                          Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkCmdExecuteCommands(
       m_commandBuffer, commandBufferCount, reinterpret_cast<const VkCommandBuffer *>( pCommandBuffers ) );
   }
@@ -5093,6 +5429,7 @@
     CommandBuffer::executeCommands( ArrayProxy<const VULKAN_HPP_NAMESPACE::CommandBuffer> const & commandBuffers,
                                     Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkCmdExecuteCommands(
       m_commandBuffer, commandBuffers.size(), reinterpret_cast<const VkCommandBuffer *>( commandBuffers.data() ) );
   }
@@ -5104,6 +5441,7 @@
   VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE Result enumerateInstanceVersion( uint32_t *       pApiVersion,
                                                                           Dispatch const & d ) VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     return static_cast<Result>( d.vkEnumerateInstanceVersion( pApiVersion ) );
   }
 
@@ -5111,6 +5449,7 @@
   template <typename Dispatch>
   VULKAN_HPP_INLINE typename ResultValueType<uint32_t>::type enumerateInstanceVersion( Dispatch const & d )
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     uint32_t apiVersion;
     Result   result = static_cast<Result>( d.vkEnumerateInstanceVersion( &apiVersion ) );
     return createResultValue( result, apiVersion, VULKAN_HPP_NAMESPACE_STRING "::enumerateInstanceVersion" );
@@ -5123,6 +5462,7 @@
                                const VULKAN_HPP_NAMESPACE::BindBufferMemoryInfo * pBindInfos,
                                Dispatch const &                                   d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     return static_cast<Result>( d.vkBindBufferMemory2(
       m_device, bindInfoCount, reinterpret_cast<const VkBindBufferMemoryInfo *>( pBindInfos ) ) );
   }
@@ -5133,6 +5473,7 @@
                                           Device::bindBufferMemory2( ArrayProxy<const VULKAN_HPP_NAMESPACE::BindBufferMemoryInfo> const & bindInfos,
                                Dispatch const &                                                     d ) const
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     Result result = static_cast<Result>( d.vkBindBufferMemory2(
       m_device, bindInfos.size(), reinterpret_cast<const VkBindBufferMemoryInfo *>( bindInfos.data() ) ) );
     return createResultValue( result, VULKAN_HPP_NAMESPACE_STRING "::Device::bindBufferMemory2" );
@@ -5145,6 +5486,7 @@
                               const VULKAN_HPP_NAMESPACE::BindImageMemoryInfo * pBindInfos,
                               Dispatch const &                                  d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     return static_cast<Result>(
       d.vkBindImageMemory2( m_device, bindInfoCount, reinterpret_cast<const VkBindImageMemoryInfo *>( pBindInfos ) ) );
   }
@@ -5155,6 +5497,7 @@
                                           Device::bindImageMemory2( ArrayProxy<const VULKAN_HPP_NAMESPACE::BindImageMemoryInfo> const & bindInfos,
                               Dispatch const &                                                    d ) const
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     Result result = static_cast<Result>( d.vkBindImageMemory2(
       m_device, bindInfos.size(), reinterpret_cast<const VkBindImageMemoryInfo *>( bindInfos.data() ) ) );
     return createResultValue( result, VULKAN_HPP_NAMESPACE_STRING "::Device::bindImageMemory2" );
@@ -5169,6 +5512,7 @@
                                         VULKAN_HPP_NAMESPACE::PeerMemoryFeatureFlags * pPeerMemoryFeatures,
                                         Dispatch const &                               d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkGetDeviceGroupPeerMemoryFeatures( m_device,
                                           heapIndex,
                                           localDeviceIndex,
@@ -5184,6 +5528,7 @@
                                         uint32_t         remoteDeviceIndex,
                                         Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     VULKAN_HPP_NAMESPACE::PeerMemoryFeatureFlags peerMemoryFeatures;
     d.vkGetDeviceGroupPeerMemoryFeatures( m_device,
                                           heapIndex,
@@ -5198,6 +5543,7 @@
   VULKAN_HPP_INLINE void CommandBuffer::setDeviceMask( uint32_t         deviceMask,
                                                        Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkCmdSetDeviceMask( m_commandBuffer, deviceMask );
   }
 
@@ -5210,6 +5556,7 @@
                                                       uint32_t         groupCountZ,
                                                       Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkCmdDispatchBase( m_commandBuffer, baseGroupX, baseGroupY, baseGroupZ, groupCountX, groupCountY, groupCountZ );
   }
 
@@ -5219,6 +5566,7 @@
     VULKAN_HPP_NAMESPACE::PhysicalDeviceGroupProperties * pPhysicalDeviceGroupProperties,
     Dispatch const &                                      d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     return static_cast<Result>( d.vkEnumeratePhysicalDeviceGroups(
       m_instance,
       pPhysicalDeviceGroupCount,
@@ -5231,6 +5579,7 @@
     typename ResultValueType<std::vector<PhysicalDeviceGroupProperties, PhysicalDeviceGroupPropertiesAllocator>>::type
     Instance::enumeratePhysicalDeviceGroups( Dispatch const & d ) const
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     std::vector<PhysicalDeviceGroupProperties, PhysicalDeviceGroupPropertiesAllocator> physicalDeviceGroupProperties;
     uint32_t                                                                           physicalDeviceGroupCount;
     Result                                                                             result;
@@ -5266,6 +5615,7 @@
     Instance::enumeratePhysicalDeviceGroups(
       PhysicalDeviceGroupPropertiesAllocator & physicalDeviceGroupPropertiesAllocator, Dispatch const & d ) const
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     std::vector<PhysicalDeviceGroupProperties, PhysicalDeviceGroupPropertiesAllocator> physicalDeviceGroupProperties(
       physicalDeviceGroupPropertiesAllocator );
     uint32_t physicalDeviceGroupCount;
@@ -5299,6 +5649,7 @@
                                          VULKAN_HPP_NAMESPACE::MemoryRequirements2 *                pMemoryRequirements,
                                          Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkGetImageMemoryRequirements2( m_device,
                                      reinterpret_cast<const VkImageMemoryRequirementsInfo2 *>( pInfo ),
                                      reinterpret_cast<VkMemoryRequirements2 *>( pMemoryRequirements ) );
@@ -5310,6 +5661,7 @@
                                          Device::getImageMemoryRequirements2( const ImageMemoryRequirementsInfo2 & info,
                                          Dispatch const &                     d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     VULKAN_HPP_NAMESPACE::MemoryRequirements2 memoryRequirements;
     d.vkGetImageMemoryRequirements2( m_device,
                                      reinterpret_cast<const VkImageMemoryRequirementsInfo2 *>( &info ),
@@ -5322,6 +5674,7 @@
                                          Device::getImageMemoryRequirements2( const ImageMemoryRequirementsInfo2 & info,
                                          Dispatch const &                     d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     StructureChain<X, Y, Z...>                  structureChain;
     VULKAN_HPP_NAMESPACE::MemoryRequirements2 & memoryRequirements =
       structureChain.template get<VULKAN_HPP_NAMESPACE::MemoryRequirements2>();
@@ -5338,6 +5691,7 @@
                                           VULKAN_HPP_NAMESPACE::MemoryRequirements2 * pMemoryRequirements,
                                           Dispatch const &                            d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkGetBufferMemoryRequirements2( m_device,
                                       reinterpret_cast<const VkBufferMemoryRequirementsInfo2 *>( pInfo ),
                                       reinterpret_cast<VkMemoryRequirements2 *>( pMemoryRequirements ) );
@@ -5349,6 +5703,7 @@
                                          Device::getBufferMemoryRequirements2( const BufferMemoryRequirementsInfo2 & info,
                                           Dispatch const &                      d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     VULKAN_HPP_NAMESPACE::MemoryRequirements2 memoryRequirements;
     d.vkGetBufferMemoryRequirements2( m_device,
                                       reinterpret_cast<const VkBufferMemoryRequirementsInfo2 *>( &info ),
@@ -5361,6 +5716,7 @@
                                          Device::getBufferMemoryRequirements2( const BufferMemoryRequirementsInfo2 & info,
                                           Dispatch const &                      d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     StructureChain<X, Y, Z...>                  structureChain;
     VULKAN_HPP_NAMESPACE::MemoryRequirements2 & memoryRequirements =
       structureChain.template get<VULKAN_HPP_NAMESPACE::MemoryRequirements2>();
@@ -5378,6 +5734,7 @@
     VULKAN_HPP_NAMESPACE::SparseImageMemoryRequirements2 *           pSparseMemoryRequirements,
     Dispatch const &                                                 d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkGetImageSparseMemoryRequirements2(
       m_device,
       reinterpret_cast<const VkImageSparseMemoryRequirementsInfo2 *>( pInfo ),
@@ -5392,6 +5749,7 @@
                       Device::getImageSparseMemoryRequirements2( const ImageSparseMemoryRequirementsInfo2 & info,
                                                Dispatch const &                           d ) const
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     std::vector<SparseImageMemoryRequirements2, SparseImageMemoryRequirements2Allocator> sparseMemoryRequirements;
     uint32_t                                                                             sparseMemoryRequirementCount;
     d.vkGetImageSparseMemoryRequirements2( m_device,
@@ -5420,6 +5778,7 @@
       SparseImageMemoryRequirements2Allocator &  sparseImageMemoryRequirements2Allocator,
       Dispatch const &                           d ) const
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     std::vector<SparseImageMemoryRequirements2, SparseImageMemoryRequirements2Allocator> sparseMemoryRequirements(
       sparseImageMemoryRequirements2Allocator );
     uint32_t sparseMemoryRequirementCount;
@@ -5442,6 +5801,7 @@
   VULKAN_HPP_INLINE void PhysicalDevice::getFeatures2( VULKAN_HPP_NAMESPACE::PhysicalDeviceFeatures2 * pFeatures,
                                                        Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkGetPhysicalDeviceFeatures2( m_physicalDevice, reinterpret_cast<VkPhysicalDeviceFeatures2 *>( pFeatures ) );
   }
 
@@ -5450,6 +5810,7 @@
   VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::PhysicalDeviceFeatures2
                                          PhysicalDevice::getFeatures2( Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     VULKAN_HPP_NAMESPACE::PhysicalDeviceFeatures2 features;
     d.vkGetPhysicalDeviceFeatures2( m_physicalDevice, reinterpret_cast<VkPhysicalDeviceFeatures2 *>( &features ) );
     return features;
@@ -5459,6 +5820,7 @@
   VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE StructureChain<X, Y, Z...>
                                          PhysicalDevice::getFeatures2( Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     StructureChain<X, Y, Z...>                      structureChain;
     VULKAN_HPP_NAMESPACE::PhysicalDeviceFeatures2 & features =
       structureChain.template get<VULKAN_HPP_NAMESPACE::PhysicalDeviceFeatures2>();
@@ -5471,6 +5833,7 @@
   VULKAN_HPP_INLINE void PhysicalDevice::getProperties2( VULKAN_HPP_NAMESPACE::PhysicalDeviceProperties2 * pProperties,
                                                          Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkGetPhysicalDeviceProperties2( m_physicalDevice,
                                       reinterpret_cast<VkPhysicalDeviceProperties2 *>( pProperties ) );
   }
@@ -5480,6 +5843,7 @@
   VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::PhysicalDeviceProperties2
                                          PhysicalDevice::getProperties2( Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     VULKAN_HPP_NAMESPACE::PhysicalDeviceProperties2 properties;
     d.vkGetPhysicalDeviceProperties2( m_physicalDevice,
                                       reinterpret_cast<VkPhysicalDeviceProperties2 *>( &properties ) );
@@ -5490,6 +5854,7 @@
   VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE StructureChain<X, Y, Z...>
                                          PhysicalDevice::getProperties2( Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     StructureChain<X, Y, Z...>                        structureChain;
     VULKAN_HPP_NAMESPACE::PhysicalDeviceProperties2 & properties =
       structureChain.template get<VULKAN_HPP_NAMESPACE::PhysicalDeviceProperties2>();
@@ -5505,6 +5870,7 @@
                                           VULKAN_HPP_NAMESPACE::FormatProperties2 * pFormatProperties,
                                           Dispatch const &                          d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkGetPhysicalDeviceFormatProperties2(
       m_physicalDevice, static_cast<VkFormat>( format ), reinterpret_cast<VkFormatProperties2 *>( pFormatProperties ) );
   }
@@ -5515,6 +5881,7 @@
                                          PhysicalDevice::getFormatProperties2( VULKAN_HPP_NAMESPACE::Format format,
                                           Dispatch const &             d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     VULKAN_HPP_NAMESPACE::FormatProperties2 formatProperties;
     d.vkGetPhysicalDeviceFormatProperties2(
       m_physicalDevice, static_cast<VkFormat>( format ), reinterpret_cast<VkFormatProperties2 *>( &formatProperties ) );
@@ -5526,6 +5893,7 @@
                                          PhysicalDevice::getFormatProperties2( VULKAN_HPP_NAMESPACE::Format format,
                                           Dispatch const &             d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     StructureChain<X, Y, Z...>                structureChain;
     VULKAN_HPP_NAMESPACE::FormatProperties2 & formatProperties =
       structureChain.template get<VULKAN_HPP_NAMESPACE::FormatProperties2>();
@@ -5541,6 +5909,7 @@
     VULKAN_HPP_NAMESPACE::ImageFormatProperties2 *               pImageFormatProperties,
     Dispatch const &                                             d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     return static_cast<Result>( d.vkGetPhysicalDeviceImageFormatProperties2(
       m_physicalDevice,
       reinterpret_cast<const VkPhysicalDeviceImageFormatInfo2 *>( pImageFormatInfo ),
@@ -5554,6 +5923,7 @@
     PhysicalDevice::getImageFormatProperties2( const PhysicalDeviceImageFormatInfo2 & imageFormatInfo,
                                                Dispatch const &                       d ) const
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     VULKAN_HPP_NAMESPACE::ImageFormatProperties2 imageFormatProperties;
     Result result = static_cast<Result>( d.vkGetPhysicalDeviceImageFormatProperties2(
       m_physicalDevice,
@@ -5568,6 +5938,7 @@
                                           PhysicalDevice::getImageFormatProperties2( const PhysicalDeviceImageFormatInfo2 & imageFormatInfo,
                                                Dispatch const &                       d ) const
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     StructureChain<X, Y, Z...>                     structureChain;
     VULKAN_HPP_NAMESPACE::ImageFormatProperties2 & imageFormatProperties =
       structureChain.template get<VULKAN_HPP_NAMESPACE::ImageFormatProperties2>();
@@ -5586,6 +5957,7 @@
                                                VULKAN_HPP_NAMESPACE::QueueFamilyProperties2 * pQueueFamilyProperties,
                                                Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkGetPhysicalDeviceQueueFamilyProperties2(
       m_physicalDevice,
       pQueueFamilyPropertyCount,
@@ -5597,6 +5969,7 @@
   VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE std::vector<QueueFamilyProperties2, QueueFamilyProperties2Allocator>
                                          PhysicalDevice::getQueueFamilyProperties2( Dispatch const & d ) const
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     std::vector<QueueFamilyProperties2, QueueFamilyProperties2Allocator> queueFamilyProperties;
     uint32_t                                                             queueFamilyPropertyCount;
     d.vkGetPhysicalDeviceQueueFamilyProperties2( m_physicalDevice, &queueFamilyPropertyCount, nullptr );
@@ -5617,6 +5990,7 @@
                                          PhysicalDevice::getQueueFamilyProperties2( QueueFamilyProperties2Allocator & queueFamilyProperties2Allocator,
                                                Dispatch const &                  d ) const
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     std::vector<QueueFamilyProperties2, QueueFamilyProperties2Allocator> queueFamilyProperties(
       queueFamilyProperties2Allocator );
     uint32_t queueFamilyPropertyCount;
@@ -5634,6 +6008,7 @@
   VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE std::vector<StructureChain, StructureChainAllocator>
                                          PhysicalDevice::getQueueFamilyProperties2( Dispatch const & d ) const
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     uint32_t queueFamilyPropertyCount;
     d.vkGetPhysicalDeviceQueueFamilyProperties2( m_physicalDevice, &queueFamilyPropertyCount, nullptr );
     std::vector<StructureChain, StructureChainAllocator>      returnVector( queueFamilyPropertyCount );
@@ -5664,6 +6039,7 @@
                                          PhysicalDevice::getQueueFamilyProperties2( StructureChainAllocator & structureChainAllocator,
                                                Dispatch const &          d ) const
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     uint32_t queueFamilyPropertyCount;
     d.vkGetPhysicalDeviceQueueFamilyProperties2( m_physicalDevice, &queueFamilyPropertyCount, nullptr );
     std::vector<StructureChain, StructureChainAllocator>      returnVector( queueFamilyPropertyCount,
@@ -5692,6 +6068,7 @@
     PhysicalDevice::getMemoryProperties2( VULKAN_HPP_NAMESPACE::PhysicalDeviceMemoryProperties2 * pMemoryProperties,
                                           Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkGetPhysicalDeviceMemoryProperties2(
       m_physicalDevice, reinterpret_cast<VkPhysicalDeviceMemoryProperties2 *>( pMemoryProperties ) );
   }
@@ -5701,6 +6078,7 @@
   VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::PhysicalDeviceMemoryProperties2
                                          PhysicalDevice::getMemoryProperties2( Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     VULKAN_HPP_NAMESPACE::PhysicalDeviceMemoryProperties2 memoryProperties;
     d.vkGetPhysicalDeviceMemoryProperties2(
       m_physicalDevice, reinterpret_cast<VkPhysicalDeviceMemoryProperties2 *>( &memoryProperties ) );
@@ -5711,6 +6089,7 @@
   VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE StructureChain<X, Y, Z...>
                                          PhysicalDevice::getMemoryProperties2( Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     StructureChain<X, Y, Z...>                              structureChain;
     VULKAN_HPP_NAMESPACE::PhysicalDeviceMemoryProperties2 & memoryProperties =
       structureChain.template get<VULKAN_HPP_NAMESPACE::PhysicalDeviceMemoryProperties2>();
@@ -5727,6 +6106,7 @@
     VULKAN_HPP_NAMESPACE::SparseImageFormatProperties2 *               pProperties,
     Dispatch const &                                                   d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkGetPhysicalDeviceSparseImageFormatProperties2(
       m_physicalDevice,
       reinterpret_cast<const VkPhysicalDeviceSparseImageFormatInfo2 *>( pFormatInfo ),
@@ -5741,6 +6121,7 @@
                       PhysicalDevice::getSparseImageFormatProperties2( const PhysicalDeviceSparseImageFormatInfo2 & formatInfo,
                                                      Dispatch const &                             d ) const
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     std::vector<SparseImageFormatProperties2, SparseImageFormatProperties2Allocator> properties;
     uint32_t                                                                         propertyCount;
     d.vkGetPhysicalDeviceSparseImageFormatProperties2(
@@ -5770,6 +6151,7 @@
       SparseImageFormatProperties2Allocator &      sparseImageFormatProperties2Allocator,
       Dispatch const &                             d ) const
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     std::vector<SparseImageFormatProperties2, SparseImageFormatProperties2Allocator> properties(
       sparseImageFormatProperties2Allocator );
     uint32_t propertyCount;
@@ -5794,6 +6176,7 @@
                                                   VULKAN_HPP_NAMESPACE::CommandPoolTrimFlags flags,
                                                   Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkTrimCommandPool(
       m_device, static_cast<VkCommandPool>( commandPool ), static_cast<VkCommandPoolTrimFlags>( flags ) );
   }
@@ -5803,6 +6186,7 @@
                                             VULKAN_HPP_NAMESPACE::Queue *                  pQueue,
                                             Dispatch const &                               d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkGetDeviceQueue2(
       m_device, reinterpret_cast<const VkDeviceQueueInfo2 *>( pQueueInfo ), reinterpret_cast<VkQueue *>( pQueue ) );
   }
@@ -5812,6 +6196,7 @@
   VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::Queue
                                          Device::getQueue2( const DeviceQueueInfo2 & queueInfo, Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     VULKAN_HPP_NAMESPACE::Queue queue;
     d.vkGetDeviceQueue2(
       m_device, reinterpret_cast<const VkDeviceQueueInfo2 *>( &queueInfo ), reinterpret_cast<VkQueue *>( &queue ) );
@@ -5826,6 +6211,7 @@
                                           VULKAN_HPP_NAMESPACE::SamplerYcbcrConversion * pYcbcrConversion,
                                           Dispatch const &                               d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     return static_cast<Result>(
       d.vkCreateSamplerYcbcrConversion( m_device,
                                         reinterpret_cast<const VkSamplerYcbcrConversionCreateInfo *>( pCreateInfo ),
@@ -5841,6 +6227,7 @@
                                           Optional<const AllocationCallbacks>      allocator,
                                           Dispatch const &                         d ) const
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     VULKAN_HPP_NAMESPACE::SamplerYcbcrConversion ycbcrConversion;
     Result                                       result = static_cast<Result>(
       d.vkCreateSamplerYcbcrConversion( m_device,
@@ -5860,6 +6247,7 @@
                                                 Optional<const AllocationCallbacks>      allocator,
                                                 Dispatch const &                         d ) const
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     VULKAN_HPP_NAMESPACE::SamplerYcbcrConversion ycbcrConversion;
     Result                                       result = static_cast<Result>(
       d.vkCreateSamplerYcbcrConversion( m_device,
@@ -5880,6 +6268,7 @@
                                            const VULKAN_HPP_NAMESPACE::AllocationCallbacks * pAllocator,
                                            Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkDestroySamplerYcbcrConversion( m_device,
                                        static_cast<VkSamplerYcbcrConversion>( ycbcrConversion ),
                                        reinterpret_cast<const VkAllocationCallbacks *>( pAllocator ) );
@@ -5892,6 +6281,7 @@
                                            Optional<const AllocationCallbacks>          allocator,
                                            Dispatch const &                             d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkDestroySamplerYcbcrConversion(
       m_device,
       static_cast<VkSamplerYcbcrConversion>( ycbcrConversion ),
@@ -5905,6 +6295,7 @@
                                           const VULKAN_HPP_NAMESPACE::AllocationCallbacks * pAllocator,
                                           Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkDestroySamplerYcbcrConversion( m_device,
                                        static_cast<VkSamplerYcbcrConversion>( ycbcrConversion ),
                                        reinterpret_cast<const VkAllocationCallbacks *>( pAllocator ) );
@@ -5916,6 +6307,7 @@
                                           Optional<const AllocationCallbacks>          allocator,
                                           Dispatch const &                             d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkDestroySamplerYcbcrConversion(
       m_device,
       static_cast<VkSamplerYcbcrConversion>( ycbcrConversion ),
@@ -5931,6 +6323,7 @@
     VULKAN_HPP_NAMESPACE::DescriptorUpdateTemplate *                 pDescriptorUpdateTemplate,
     Dispatch const &                                                 d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     return static_cast<Result>( d.vkCreateDescriptorUpdateTemplate(
       m_device,
       reinterpret_cast<const VkDescriptorUpdateTemplateCreateInfo *>( pCreateInfo ),
@@ -5946,6 +6339,7 @@
                                             Optional<const AllocationCallbacks>        allocator,
                                             Dispatch const &                           d ) const
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     VULKAN_HPP_NAMESPACE::DescriptorUpdateTemplate descriptorUpdateTemplate;
     Result                                         result = static_cast<Result>( d.vkCreateDescriptorUpdateTemplate(
       m_device,
@@ -5965,6 +6359,7 @@
                                                   Optional<const AllocationCallbacks>        allocator,
                                                   Dispatch const &                           d ) const
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     VULKAN_HPP_NAMESPACE::DescriptorUpdateTemplate descriptorUpdateTemplate;
     Result                                         result = static_cast<Result>( d.vkCreateDescriptorUpdateTemplate(
       m_device,
@@ -5988,6 +6383,7 @@
                                              const VULKAN_HPP_NAMESPACE::AllocationCallbacks * pAllocator,
                                              Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkDestroyDescriptorUpdateTemplate( m_device,
                                          static_cast<VkDescriptorUpdateTemplate>( descriptorUpdateTemplate ),
                                          reinterpret_cast<const VkAllocationCallbacks *>( pAllocator ) );
@@ -6000,6 +6396,7 @@
                                              Optional<const AllocationCallbacks>            allocator,
                                              Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkDestroyDescriptorUpdateTemplate(
       m_device,
       static_cast<VkDescriptorUpdateTemplate>( descriptorUpdateTemplate ),
@@ -6013,6 +6410,7 @@
                                           const VULKAN_HPP_NAMESPACE::AllocationCallbacks * pAllocator,
                                           Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkDestroyDescriptorUpdateTemplate( m_device,
                                          static_cast<VkDescriptorUpdateTemplate>( descriptorUpdateTemplate ),
                                          reinterpret_cast<const VkAllocationCallbacks *>( pAllocator ) );
@@ -6024,6 +6422,7 @@
                                           Optional<const AllocationCallbacks>            allocator,
                                           Dispatch const &                               d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkDestroyDescriptorUpdateTemplate(
       m_device,
       static_cast<VkDescriptorUpdateTemplate>( descriptorUpdateTemplate ),
@@ -6039,6 +6438,7 @@
                                              const void *                                   pData,
                                              Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkUpdateDescriptorSetWithTemplate( m_device,
                                          static_cast<VkDescriptorSet>( descriptorSet ),
                                          static_cast<VkDescriptorUpdateTemplate>( descriptorUpdateTemplate ),
@@ -6051,6 +6451,7 @@
     VULKAN_HPP_NAMESPACE::ExternalBufferProperties *               pExternalBufferProperties,
     Dispatch const &                                               d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkGetPhysicalDeviceExternalBufferProperties(
       m_physicalDevice,
       reinterpret_cast<const VkPhysicalDeviceExternalBufferInfo *>( pExternalBufferInfo ),
@@ -6063,6 +6464,7 @@
                                          PhysicalDevice::getExternalBufferProperties( const PhysicalDeviceExternalBufferInfo & externalBufferInfo,
                                                  Dispatch const &                         d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     VULKAN_HPP_NAMESPACE::ExternalBufferProperties externalBufferProperties;
     d.vkGetPhysicalDeviceExternalBufferProperties(
       m_physicalDevice,
@@ -6078,6 +6480,7 @@
     VULKAN_HPP_NAMESPACE::ExternalFenceProperties *               pExternalFenceProperties,
     Dispatch const &                                              d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkGetPhysicalDeviceExternalFenceProperties(
       m_physicalDevice,
       reinterpret_cast<const VkPhysicalDeviceExternalFenceInfo *>( pExternalFenceInfo ),
@@ -6090,6 +6493,7 @@
                                          PhysicalDevice::getExternalFenceProperties( const PhysicalDeviceExternalFenceInfo & externalFenceInfo,
                                                 Dispatch const &                        d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     VULKAN_HPP_NAMESPACE::ExternalFenceProperties externalFenceProperties;
     d.vkGetPhysicalDeviceExternalFenceProperties(
       m_physicalDevice,
@@ -6105,6 +6509,7 @@
     VULKAN_HPP_NAMESPACE::ExternalSemaphoreProperties *               pExternalSemaphoreProperties,
     Dispatch const &                                                  d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkGetPhysicalDeviceExternalSemaphoreProperties(
       m_physicalDevice,
       reinterpret_cast<const VkPhysicalDeviceExternalSemaphoreInfo *>( pExternalSemaphoreInfo ),
@@ -6117,6 +6522,7 @@
                                          PhysicalDevice::getExternalSemaphoreProperties( const PhysicalDeviceExternalSemaphoreInfo & externalSemaphoreInfo,
                                                     Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     VULKAN_HPP_NAMESPACE::ExternalSemaphoreProperties externalSemaphoreProperties;
     d.vkGetPhysicalDeviceExternalSemaphoreProperties(
       m_physicalDevice,
@@ -6132,6 +6538,7 @@
                                            VULKAN_HPP_NAMESPACE::DescriptorSetLayoutSupport *          pSupport,
                                            Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkGetDescriptorSetLayoutSupport( m_device,
                                        reinterpret_cast<const VkDescriptorSetLayoutCreateInfo *>( pCreateInfo ),
                                        reinterpret_cast<VkDescriptorSetLayoutSupport *>( pSupport ) );
@@ -6143,6 +6550,7 @@
                                          Device::getDescriptorSetLayoutSupport( const DescriptorSetLayoutCreateInfo & createInfo,
                                            Dispatch const &                      d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     VULKAN_HPP_NAMESPACE::DescriptorSetLayoutSupport support;
     d.vkGetDescriptorSetLayoutSupport( m_device,
                                        reinterpret_cast<const VkDescriptorSetLayoutCreateInfo *>( &createInfo ),
@@ -6155,6 +6563,7 @@
                                          Device::getDescriptorSetLayoutSupport( const DescriptorSetLayoutCreateInfo & createInfo,
                                            Dispatch const &                      d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     StructureChain<X, Y, Z...>                         structureChain;
     VULKAN_HPP_NAMESPACE::DescriptorSetLayoutSupport & support =
       structureChain.template get<VULKAN_HPP_NAMESPACE::DescriptorSetLayoutSupport>();
@@ -6176,6 +6585,7 @@
                                                            uint32_t                         stride,
                                                            Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkCmdDrawIndirectCount( m_commandBuffer,
                               static_cast<VkBuffer>( buffer ),
                               static_cast<VkDeviceSize>( offset ),
@@ -6194,6 +6604,7 @@
                                                                   uint32_t                         stride,
                                                                   Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkCmdDrawIndexedIndirectCount( m_commandBuffer,
                                      static_cast<VkBuffer>( buffer ),
                                      static_cast<VkDeviceSize>( offset ),
@@ -6210,6 +6621,7 @@
                                VULKAN_HPP_NAMESPACE::RenderPass *                  pRenderPass,
                                Dispatch const &                                    d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     return static_cast<Result>( d.vkCreateRenderPass2( m_device,
                                                        reinterpret_cast<const VkRenderPassCreateInfo2 *>( pCreateInfo ),
                                                        reinterpret_cast<const VkAllocationCallbacks *>( pAllocator ),
@@ -6224,6 +6636,7 @@
                                Optional<const AllocationCallbacks> allocator,
                                Dispatch const &                    d ) const
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     VULKAN_HPP_NAMESPACE::RenderPass renderPass;
     Result                           result = static_cast<Result>(
       d.vkCreateRenderPass2( m_device,
@@ -6242,6 +6655,7 @@
                                      Optional<const AllocationCallbacks> allocator,
                                      Dispatch const &                    d ) const
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     VULKAN_HPP_NAMESPACE::RenderPass renderPass;
     Result                           result = static_cast<Result>(
       d.vkCreateRenderPass2( m_device,
@@ -6262,6 +6676,7 @@
                                      const VULKAN_HPP_NAMESPACE::SubpassBeginInfo *    pSubpassBeginInfo,
                                      Dispatch const &                                  d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkCmdBeginRenderPass2( m_commandBuffer,
                              reinterpret_cast<const VkRenderPassBeginInfo *>( pRenderPassBegin ),
                              reinterpret_cast<const VkSubpassBeginInfo *>( pSubpassBeginInfo ) );
@@ -6273,6 +6688,7 @@
                                                           const SubpassBeginInfo &    subpassBeginInfo,
                                                           Dispatch const &            d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkCmdBeginRenderPass2( m_commandBuffer,
                              reinterpret_cast<const VkRenderPassBeginInfo *>( &renderPassBegin ),
                              reinterpret_cast<const VkSubpassBeginInfo *>( &subpassBeginInfo ) );
@@ -6284,6 +6700,7 @@
                                                       const VULKAN_HPP_NAMESPACE::SubpassEndInfo *   pSubpassEndInfo,
                                                       Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkCmdNextSubpass2( m_commandBuffer,
                          reinterpret_cast<const VkSubpassBeginInfo *>( pSubpassBeginInfo ),
                          reinterpret_cast<const VkSubpassEndInfo *>( pSubpassEndInfo ) );
@@ -6295,6 +6712,7 @@
                                                       const SubpassEndInfo &   subpassEndInfo,
                                                       Dispatch const &         d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkCmdNextSubpass2( m_commandBuffer,
                          reinterpret_cast<const VkSubpassBeginInfo *>( &subpassBeginInfo ),
                          reinterpret_cast<const VkSubpassEndInfo *>( &subpassEndInfo ) );
@@ -6305,6 +6723,7 @@
   VULKAN_HPP_INLINE void CommandBuffer::endRenderPass2( const VULKAN_HPP_NAMESPACE::SubpassEndInfo * pSubpassEndInfo,
                                                         Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkCmdEndRenderPass2( m_commandBuffer, reinterpret_cast<const VkSubpassEndInfo *>( pSubpassEndInfo ) );
   }
 
@@ -6313,6 +6732,7 @@
   VULKAN_HPP_INLINE void CommandBuffer::endRenderPass2( const SubpassEndInfo & subpassEndInfo,
                                                         Dispatch const &       d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkCmdEndRenderPass2( m_commandBuffer, reinterpret_cast<const VkSubpassEndInfo *>( &subpassEndInfo ) );
   }
 #endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/
@@ -6323,6 +6743,7 @@
                                                  uint32_t                        queryCount,
                                                  Dispatch const &                d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkResetQueryPool( m_device, static_cast<VkQueryPool>( queryPool ), firstQuery, queryCount );
   }
 
@@ -6330,6 +6751,7 @@
   VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE Result Device::getSemaphoreCounterValue(
     VULKAN_HPP_NAMESPACE::Semaphore semaphore, uint64_t * pValue, Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     return static_cast<Result>(
       d.vkGetSemaphoreCounterValue( m_device, static_cast<VkSemaphore>( semaphore ), pValue ) );
   }
@@ -6339,6 +6761,7 @@
   VULKAN_HPP_NODISCARD_WHEN_NO_EXCEPTIONS VULKAN_HPP_INLINE typename ResultValueType<uint64_t>::type
                                           Device::getSemaphoreCounterValue( VULKAN_HPP_NAMESPACE::Semaphore semaphore, Dispatch const & d ) const
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     uint64_t value;
     Result   result =
       static_cast<Result>( d.vkGetSemaphoreCounterValue( m_device, static_cast<VkSemaphore>( semaphore ), &value ) );
@@ -6352,6 +6775,7 @@
                             uint64_t                                        timeout,
                             Dispatch const &                                d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     return static_cast<Result>(
       d.vkWaitSemaphores( m_device, reinterpret_cast<const VkSemaphoreWaitInfo *>( pWaitInfo ), timeout ) );
   }
@@ -6362,6 +6786,7 @@
                                                                         uint64_t                  timeout,
                                                                         Dispatch const &          d ) const
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     Result result = static_cast<Result>(
       d.vkWaitSemaphores( m_device, reinterpret_cast<const VkSemaphoreWaitInfo *>( &waitInfo ), timeout ) );
     return createResultValue( result,
@@ -6374,6 +6799,7 @@
   VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE Result Device::signalSemaphore(
     const VULKAN_HPP_NAMESPACE::SemaphoreSignalInfo * pSignalInfo, Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     return static_cast<Result>(
       d.vkSignalSemaphore( m_device, reinterpret_cast<const VkSemaphoreSignalInfo *>( pSignalInfo ) ) );
   }
@@ -6383,6 +6809,7 @@
   VULKAN_HPP_NODISCARD_WHEN_NO_EXCEPTIONS VULKAN_HPP_INLINE typename ResultValueType<void>::type
                                           Device::signalSemaphore( const SemaphoreSignalInfo & signalInfo, Dispatch const & d ) const
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     Result result = static_cast<Result>(
       d.vkSignalSemaphore( m_device, reinterpret_cast<const VkSemaphoreSignalInfo *>( &signalInfo ) ) );
     return createResultValue( result, VULKAN_HPP_NAMESPACE_STRING "::Device::signalSemaphore" );
@@ -6393,6 +6820,7 @@
   VULKAN_HPP_INLINE DeviceAddress Device::getBufferAddress( const VULKAN_HPP_NAMESPACE::BufferDeviceAddressInfo * pInfo,
                                                             Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     return static_cast<DeviceAddress>(
       d.vkGetBufferDeviceAddress( m_device, reinterpret_cast<const VkBufferDeviceAddressInfo *>( pInfo ) ) );
   }
@@ -6402,6 +6830,7 @@
   VULKAN_HPP_INLINE DeviceAddress Device::getBufferAddress( const BufferDeviceAddressInfo & info,
                                                             Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     return d.vkGetBufferDeviceAddress( m_device, reinterpret_cast<const VkBufferDeviceAddressInfo *>( &info ) );
   }
 #endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/
@@ -6410,6 +6839,7 @@
   VULKAN_HPP_INLINE uint64_t Device::getBufferOpaqueCaptureAddress(
     const VULKAN_HPP_NAMESPACE::BufferDeviceAddressInfo * pInfo, Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     return d.vkGetBufferOpaqueCaptureAddress( m_device, reinterpret_cast<const VkBufferDeviceAddressInfo *>( pInfo ) );
   }
 
@@ -6418,6 +6848,7 @@
   VULKAN_HPP_INLINE uint64_t Device::getBufferOpaqueCaptureAddress( const BufferDeviceAddressInfo & info,
                                                                     Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     return d.vkGetBufferOpaqueCaptureAddress( m_device, reinterpret_cast<const VkBufferDeviceAddressInfo *>( &info ) );
   }
 #endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/
@@ -6427,6 +6858,7 @@
                     Device::getMemoryOpaqueCaptureAddress( const VULKAN_HPP_NAMESPACE::DeviceMemoryOpaqueCaptureAddressInfo * pInfo,
                                            Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     return d.vkGetDeviceMemoryOpaqueCaptureAddress(
       m_device, reinterpret_cast<const VkDeviceMemoryOpaqueCaptureAddressInfo *>( pInfo ) );
   }
@@ -6436,6 +6868,7 @@
   VULKAN_HPP_INLINE uint64_t Device::getMemoryOpaqueCaptureAddress( const DeviceMemoryOpaqueCaptureAddressInfo & info,
                                                                     Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     return d.vkGetDeviceMemoryOpaqueCaptureAddress(
       m_device, reinterpret_cast<const VkDeviceMemoryOpaqueCaptureAddressInfo *>( &info ) );
   }
@@ -6448,6 +6881,7 @@
                                                       const VULKAN_HPP_NAMESPACE::AllocationCallbacks * pAllocator,
                                                       Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkDestroySurfaceKHR(
       m_instance, static_cast<VkSurfaceKHR>( surface ), reinterpret_cast<const VkAllocationCallbacks *>( pAllocator ) );
   }
@@ -6458,6 +6892,7 @@
                                                       Optional<const AllocationCallbacks> allocator,
                                                       Dispatch const &                    d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkDestroySurfaceKHR( m_instance,
                            static_cast<VkSurfaceKHR>( surface ),
                            reinterpret_cast<const VkAllocationCallbacks *>(
@@ -6470,6 +6905,7 @@
                                             const VULKAN_HPP_NAMESPACE::AllocationCallbacks * pAllocator,
                                             Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkDestroySurfaceKHR(
       m_instance, static_cast<VkSurfaceKHR>( surface ), reinterpret_cast<const VkAllocationCallbacks *>( pAllocator ) );
   }
@@ -6480,6 +6916,7 @@
                                             Optional<const AllocationCallbacks> allocator,
                                             Dispatch const &                    d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkDestroySurfaceKHR( m_instance,
                            static_cast<VkSurfaceKHR>( surface ),
                            reinterpret_cast<const VkAllocationCallbacks *>(
@@ -6494,6 +6931,7 @@
                                           VULKAN_HPP_NAMESPACE::Bool32 *   pSupported,
                                           Dispatch const &                 d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     return static_cast<Result>( d.vkGetPhysicalDeviceSurfaceSupportKHR( m_physicalDevice,
                                                                         queueFamilyIndex,
                                                                         static_cast<VkSurfaceKHR>( surface ),
@@ -6507,6 +6945,7 @@
                                           VULKAN_HPP_NAMESPACE::SurfaceKHR surface,
                                           Dispatch const &                 d ) const
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     VULKAN_HPP_NAMESPACE::Bool32 supported;
     Result                       result =
       static_cast<Result>( d.vkGetPhysicalDeviceSurfaceSupportKHR( m_physicalDevice,
@@ -6523,6 +6962,7 @@
                                                VULKAN_HPP_NAMESPACE::SurfaceCapabilitiesKHR * pSurfaceCapabilities,
                                                Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     return static_cast<Result>( d.vkGetPhysicalDeviceSurfaceCapabilitiesKHR(
       m_physicalDevice,
       static_cast<VkSurfaceKHR>( surface ),
@@ -6535,6 +6975,7 @@
     typename ResultValueType<VULKAN_HPP_NAMESPACE::SurfaceCapabilitiesKHR>::type
     PhysicalDevice::getSurfaceCapabilitiesKHR( VULKAN_HPP_NAMESPACE::SurfaceKHR surface, Dispatch const & d ) const
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     VULKAN_HPP_NAMESPACE::SurfaceCapabilitiesKHR surfaceCapabilities;
     Result result = static_cast<Result>( d.vkGetPhysicalDeviceSurfaceCapabilitiesKHR(
       m_physicalDevice,
@@ -6552,6 +6993,7 @@
                                           VULKAN_HPP_NAMESPACE::SurfaceFormatKHR * pSurfaceFormats,
                                           Dispatch const &                         d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     return static_cast<Result>(
       d.vkGetPhysicalDeviceSurfaceFormatsKHR( m_physicalDevice,
                                               static_cast<VkSurfaceKHR>( surface ),
@@ -6565,6 +7007,7 @@
     typename ResultValueType<std::vector<SurfaceFormatKHR, SurfaceFormatKHRAllocator>>::type
     PhysicalDevice::getSurfaceFormatsKHR( VULKAN_HPP_NAMESPACE::SurfaceKHR surface, Dispatch const & d ) const
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     std::vector<SurfaceFormatKHR, SurfaceFormatKHRAllocator> surfaceFormats;
     uint32_t                                                 surfaceFormatCount;
     Result                                                   result;
@@ -6601,6 +7044,7 @@
                                           SurfaceFormatKHRAllocator &      surfaceFormatKHRAllocator,
                                           Dispatch const &                 d ) const
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     std::vector<SurfaceFormatKHR, SurfaceFormatKHRAllocator> surfaceFormats( surfaceFormatKHRAllocator );
     uint32_t                                                 surfaceFormatCount;
     Result                                                   result;
@@ -6635,6 +7079,7 @@
                                                VULKAN_HPP_NAMESPACE::PresentModeKHR * pPresentModes,
                                                Dispatch const &                       d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     return static_cast<Result>(
       d.vkGetPhysicalDeviceSurfacePresentModesKHR( m_physicalDevice,
                                                    static_cast<VkSurfaceKHR>( surface ),
@@ -6648,6 +7093,7 @@
     typename ResultValueType<std::vector<PresentModeKHR, PresentModeKHRAllocator>>::type
     PhysicalDevice::getSurfacePresentModesKHR( VULKAN_HPP_NAMESPACE::SurfaceKHR surface, Dispatch const & d ) const
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     std::vector<PresentModeKHR, PresentModeKHRAllocator> presentModes;
     uint32_t                                             presentModeCount;
     Result                                               result;
@@ -6684,6 +7130,7 @@
                                                PresentModeKHRAllocator &        presentModeKHRAllocator,
                                                Dispatch const &                 d ) const
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     std::vector<PresentModeKHR, PresentModeKHRAllocator> presentModes( presentModeKHRAllocator );
     uint32_t                                             presentModeCount;
     Result                                               result;
@@ -6720,6 +7167,7 @@
                                 VULKAN_HPP_NAMESPACE::SwapchainKHR *                 pSwapchain,
                                 Dispatch const &                                     d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     return static_cast<Result>(
       d.vkCreateSwapchainKHR( m_device,
                               reinterpret_cast<const VkSwapchainCreateInfoKHR *>( pCreateInfo ),
@@ -6735,6 +7183,7 @@
                                 Optional<const AllocationCallbacks> allocator,
                                 Dispatch const &                    d ) const
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     VULKAN_HPP_NAMESPACE::SwapchainKHR swapchain;
     Result                             result = static_cast<Result>(
       d.vkCreateSwapchainKHR( m_device,
@@ -6753,6 +7202,7 @@
                                       Optional<const AllocationCallbacks> allocator,
                                       Dispatch const &                    d ) const
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     VULKAN_HPP_NAMESPACE::SwapchainKHR swapchain;
     Result                             result = static_cast<Result>(
       d.vkCreateSwapchainKHR( m_device,
@@ -6772,6 +7222,7 @@
                                                       const VULKAN_HPP_NAMESPACE::AllocationCallbacks * pAllocator,
                                                       Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkDestroySwapchainKHR( m_device,
                              static_cast<VkSwapchainKHR>( swapchain ),
                              reinterpret_cast<const VkAllocationCallbacks *>( pAllocator ) );
@@ -6783,6 +7234,7 @@
                                                       Optional<const AllocationCallbacks> allocator,
                                                       Dispatch const &                    d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkDestroySwapchainKHR( m_device,
                              static_cast<VkSwapchainKHR>( swapchain ),
                              reinterpret_cast<const VkAllocationCallbacks *>(
@@ -6795,6 +7247,7 @@
                                           const VULKAN_HPP_NAMESPACE::AllocationCallbacks * pAllocator,
                                           Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkDestroySwapchainKHR( m_device,
                              static_cast<VkSwapchainKHR>( swapchain ),
                              reinterpret_cast<const VkAllocationCallbacks *>( pAllocator ) );
@@ -6806,6 +7259,7 @@
                                           Optional<const AllocationCallbacks> allocator,
                                           Dispatch const &                    d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkDestroySwapchainKHR( m_device,
                              static_cast<VkSwapchainKHR>( swapchain ),
                              reinterpret_cast<const VkAllocationCallbacks *>(
@@ -6820,6 +7274,7 @@
                                    VULKAN_HPP_NAMESPACE::Image *      pSwapchainImages,
                                    Dispatch const &                   d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     return static_cast<Result>( d.vkGetSwapchainImagesKHR( m_device,
                                                            static_cast<VkSwapchainKHR>( swapchain ),
                                                            pSwapchainImageCount,
@@ -6831,6 +7286,7 @@
   VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE typename ResultValueType<std::vector<Image, ImageAllocator>>::type
                        Device::getSwapchainImagesKHR( VULKAN_HPP_NAMESPACE::SwapchainKHR swapchain, Dispatch const & d ) const
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     std::vector<Image, ImageAllocator> swapchainImages;
     uint32_t                           swapchainImageCount;
     Result                             result;
@@ -6865,6 +7321,7 @@
                                    ImageAllocator &                   imageAllocator,
                                    Dispatch const &                   d ) const
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     std::vector<Image, ImageAllocator> swapchainImages( imageAllocator );
     uint32_t                           swapchainImageCount;
     Result                             result;
@@ -6900,6 +7357,7 @@
                                  uint32_t *                         pImageIndex,
                                  Dispatch const &                   d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     return static_cast<Result>( d.vkAcquireNextImageKHR( m_device,
                                                          static_cast<VkSwapchainKHR>( swapchain ),
                                                          timeout,
@@ -6917,6 +7375,7 @@
                                  VULKAN_HPP_NAMESPACE::Fence        fence,
                                  Dispatch const &                   d ) const
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     uint32_t imageIndex;
     Result   result = static_cast<Result>( d.vkAcquireNextImageKHR( m_device,
                                                                   static_cast<VkSwapchainKHR>( swapchain ),
@@ -6938,6 +7397,7 @@
   VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE Result Queue::presentKHR(
     const VULKAN_HPP_NAMESPACE::PresentInfoKHR * pPresentInfo, Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     return static_cast<Result>(
       d.vkQueuePresentKHR( m_queue, reinterpret_cast<const VkPresentInfoKHR *>( pPresentInfo ) ) );
   }
@@ -6947,6 +7407,7 @@
   VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE Result Queue::presentKHR( const PresentInfoKHR & presentInfo,
                                                                    Dispatch const &       d ) const
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     Result result =
       static_cast<Result>( d.vkQueuePresentKHR( m_queue, reinterpret_cast<const VkPresentInfoKHR *>( &presentInfo ) ) );
     return createResultValue(
@@ -6961,6 +7422,7 @@
     VULKAN_HPP_NAMESPACE::DeviceGroupPresentCapabilitiesKHR * pDeviceGroupPresentCapabilities,
     Dispatch const &                                          d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     return static_cast<Result>( d.vkGetDeviceGroupPresentCapabilitiesKHR(
       m_device, reinterpret_cast<VkDeviceGroupPresentCapabilitiesKHR *>( pDeviceGroupPresentCapabilities ) ) );
   }
@@ -6971,6 +7433,7 @@
     typename ResultValueType<VULKAN_HPP_NAMESPACE::DeviceGroupPresentCapabilitiesKHR>::type
     Device::getGroupPresentCapabilitiesKHR( Dispatch const & d ) const
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     VULKAN_HPP_NAMESPACE::DeviceGroupPresentCapabilitiesKHR deviceGroupPresentCapabilities;
     Result result = static_cast<Result>( d.vkGetDeviceGroupPresentCapabilitiesKHR(
       m_device, reinterpret_cast<VkDeviceGroupPresentCapabilitiesKHR *>( &deviceGroupPresentCapabilities ) ) );
@@ -6985,6 +7448,7 @@
                                             VULKAN_HPP_NAMESPACE::DeviceGroupPresentModeFlagsKHR * pModes,
                                             Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     return static_cast<Result>(
       d.vkGetDeviceGroupSurfacePresentModesKHR( m_device,
                                                 static_cast<VkSurfaceKHR>( surface ),
@@ -6997,6 +7461,7 @@
     typename ResultValueType<VULKAN_HPP_NAMESPACE::DeviceGroupPresentModeFlagsKHR>::type
     Device::getGroupSurfacePresentModesKHR( VULKAN_HPP_NAMESPACE::SurfaceKHR surface, Dispatch const & d ) const
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     VULKAN_HPP_NAMESPACE::DeviceGroupPresentModeFlagsKHR modes;
     Result                                               result = static_cast<Result>(
       d.vkGetDeviceGroupSurfacePresentModesKHR( m_device,
@@ -7013,6 +7478,7 @@
                                              VULKAN_HPP_NAMESPACE::Rect2D *   pRects,
                                              Dispatch const &                 d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     return static_cast<Result>( d.vkGetPhysicalDevicePresentRectanglesKHR(
       m_physicalDevice, static_cast<VkSurfaceKHR>( surface ), pRectCount, reinterpret_cast<VkRect2D *>( pRects ) ) );
   }
@@ -7022,6 +7488,7 @@
   VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE typename ResultValueType<std::vector<Rect2D, Rect2DAllocator>>::type
                        PhysicalDevice::getPresentRectanglesKHR( VULKAN_HPP_NAMESPACE::SurfaceKHR surface, Dispatch const & d ) const
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     std::vector<Rect2D, Rect2DAllocator> rects;
     uint32_t                             rectCount;
     Result                               result;
@@ -7056,6 +7523,7 @@
                                              Rect2DAllocator &                rect2DAllocator,
                                              Dispatch const &                 d ) const
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     std::vector<Rect2D, Rect2DAllocator> rects( rect2DAllocator );
     uint32_t                             rectCount;
     Result                               result;
@@ -7088,6 +7556,7 @@
                                   uint32_t *                                            pImageIndex,
                                   Dispatch const &                                      d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     return static_cast<Result>( d.vkAcquireNextImage2KHR(
       m_device, reinterpret_cast<const VkAcquireNextImageInfoKHR *>( pAcquireInfo ), pImageIndex ) );
   }
@@ -7097,6 +7566,7 @@
   VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE ResultValue<uint32_t>
                                          Device::acquireNextImage2KHR( const AcquireNextImageInfoKHR & acquireInfo, Dispatch const & d ) const
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     uint32_t imageIndex;
     Result   result = static_cast<Result>( d.vkAcquireNextImage2KHR(
       m_device, reinterpret_cast<const VkAcquireNextImageInfoKHR *>( &acquireInfo ), &imageIndex ) );
@@ -7118,6 +7588,7 @@
                                              VULKAN_HPP_NAMESPACE::DisplayPropertiesKHR * pProperties,
                                              Dispatch const &                             d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     return static_cast<Result>( d.vkGetPhysicalDeviceDisplayPropertiesKHR(
       m_physicalDevice, pPropertyCount, reinterpret_cast<VkDisplayPropertiesKHR *>( pProperties ) ) );
   }
@@ -7128,6 +7599,7 @@
     typename ResultValueType<std::vector<DisplayPropertiesKHR, DisplayPropertiesKHRAllocator>>::type
     PhysicalDevice::getDisplayPropertiesKHR( Dispatch const & d ) const
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     std::vector<DisplayPropertiesKHR, DisplayPropertiesKHRAllocator> properties;
     uint32_t                                                         propertyCount;
     Result                                                           result;
@@ -7160,6 +7632,7 @@
     PhysicalDevice::getDisplayPropertiesKHR( DisplayPropertiesKHRAllocator & displayPropertiesKHRAllocator,
                                              Dispatch const &                d ) const
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     std::vector<DisplayPropertiesKHR, DisplayPropertiesKHRAllocator> properties( displayPropertiesKHRAllocator );
     uint32_t                                                         propertyCount;
     Result                                                           result;
@@ -7190,6 +7663,7 @@
                                                   VULKAN_HPP_NAMESPACE::DisplayPlanePropertiesKHR * pProperties,
                                                   Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     return static_cast<Result>( d.vkGetPhysicalDeviceDisplayPlanePropertiesKHR(
       m_physicalDevice, pPropertyCount, reinterpret_cast<VkDisplayPlanePropertiesKHR *>( pProperties ) ) );
   }
@@ -7200,6 +7674,7 @@
     typename ResultValueType<std::vector<DisplayPlanePropertiesKHR, DisplayPlanePropertiesKHRAllocator>>::type
     PhysicalDevice::getDisplayPlanePropertiesKHR( Dispatch const & d ) const
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     std::vector<DisplayPlanePropertiesKHR, DisplayPlanePropertiesKHRAllocator> properties;
     uint32_t                                                                   propertyCount;
     Result                                                                     result;
@@ -7232,6 +7707,7 @@
     PhysicalDevice::getDisplayPlanePropertiesKHR(
       DisplayPlanePropertiesKHRAllocator & displayPlanePropertiesKHRAllocator, Dispatch const & d ) const
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     std::vector<DisplayPlanePropertiesKHR, DisplayPlanePropertiesKHRAllocator> properties(
       displayPlanePropertiesKHRAllocator );
     uint32_t propertyCount;
@@ -7264,6 +7740,7 @@
                                                          VULKAN_HPP_NAMESPACE::DisplayKHR * pDisplays,
                                                          Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     return static_cast<Result>( d.vkGetDisplayPlaneSupportedDisplaysKHR(
       m_physicalDevice, planeIndex, pDisplayCount, reinterpret_cast<VkDisplayKHR *>( pDisplays ) ) );
   }
@@ -7273,6 +7750,7 @@
   VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE typename ResultValueType<std::vector<DisplayKHR, DisplayKHRAllocator>>::type
                        PhysicalDevice::getDisplayPlaneSupportedDisplaysKHR( uint32_t planeIndex, Dispatch const & d ) const
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     std::vector<DisplayKHR, DisplayKHRAllocator> displays;
     uint32_t                                     displayCount;
     Result                                       result;
@@ -7305,6 +7783,7 @@
                                                          DisplayKHRAllocator & displayKHRAllocator,
                                                          Dispatch const &      d ) const
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     std::vector<DisplayKHR, DisplayKHRAllocator> displays( displayKHRAllocator );
     uint32_t                                     displayCount;
     Result                                       result;
@@ -7336,6 +7815,7 @@
                                                  VULKAN_HPP_NAMESPACE::DisplayModePropertiesKHR * pProperties,
                                                  Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     return static_cast<Result>(
       d.vkGetDisplayModePropertiesKHR( m_physicalDevice,
                                        static_cast<VkDisplayKHR>( display ),
@@ -7349,6 +7829,7 @@
     typename ResultValueType<std::vector<DisplayModePropertiesKHR, DisplayModePropertiesKHRAllocator>>::type
     PhysicalDevice::getDisplayModePropertiesKHR( VULKAN_HPP_NAMESPACE::DisplayKHR display, Dispatch const & d ) const
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     std::vector<DisplayModePropertiesKHR, DisplayModePropertiesKHRAllocator> properties;
     uint32_t                                                                 propertyCount;
     Result                                                                   result;
@@ -7385,6 +7866,7 @@
                                                  DisplayModePropertiesKHRAllocator & displayModePropertiesKHRAllocator,
                                                  Dispatch const &                    d ) const
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     std::vector<DisplayModePropertiesKHR, DisplayModePropertiesKHRAllocator> properties(
       displayModePropertiesKHRAllocator );
     uint32_t propertyCount;
@@ -7421,6 +7903,7 @@
                                           VULKAN_HPP_NAMESPACE::DisplayModeKHR *                 pMode,
                                           Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     return static_cast<Result>(
       d.vkCreateDisplayModeKHR( m_physicalDevice,
                                 static_cast<VkDisplayKHR>( display ),
@@ -7438,6 +7921,7 @@
                                           Optional<const AllocationCallbacks> allocator,
                                           Dispatch const &                    d ) const
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     VULKAN_HPP_NAMESPACE::DisplayModeKHR mode;
     Result                               result = static_cast<Result>(
       d.vkCreateDisplayModeKHR( m_physicalDevice,
@@ -7458,6 +7942,7 @@
                                                 Optional<const AllocationCallbacks> allocator,
                                                 Dispatch const &                    d ) const
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     VULKAN_HPP_NAMESPACE::DisplayModeKHR mode;
     Result                               result = static_cast<Result>(
       d.vkCreateDisplayModeKHR( m_physicalDevice,
@@ -7480,6 +7965,7 @@
                                                     VULKAN_HPP_NAMESPACE::DisplayPlaneCapabilitiesKHR * pCapabilities,
                                                     Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     return static_cast<Result>(
       d.vkGetDisplayPlaneCapabilitiesKHR( m_physicalDevice,
                                           static_cast<VkDisplayModeKHR>( mode ),
@@ -7495,6 +7981,7 @@
                                                     uint32_t                             planeIndex,
                                                     Dispatch const &                     d ) const
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     VULKAN_HPP_NAMESPACE::DisplayPlaneCapabilitiesKHR capabilities;
     Result                                            result = static_cast<Result>(
       d.vkGetDisplayPlaneCapabilitiesKHR( m_physicalDevice,
@@ -7513,6 +8000,7 @@
                                             VULKAN_HPP_NAMESPACE::SurfaceKHR *                        pSurface,
                                             Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     return static_cast<Result>(
       d.vkCreateDisplayPlaneSurfaceKHR( m_instance,
                                         reinterpret_cast<const VkDisplaySurfaceCreateInfoKHR *>( pCreateInfo ),
@@ -7528,6 +8016,7 @@
                                             Optional<const AllocationCallbacks> allocator,
                                             Dispatch const &                    d ) const
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     VULKAN_HPP_NAMESPACE::SurfaceKHR surface;
     Result                           result = static_cast<Result>(
       d.vkCreateDisplayPlaneSurfaceKHR( m_instance,
@@ -7546,6 +8035,7 @@
                                                   Optional<const AllocationCallbacks> allocator,
                                                   Dispatch const &                    d ) const
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     VULKAN_HPP_NAMESPACE::SurfaceKHR surface;
     Result                           result = static_cast<Result>(
       d.vkCreateDisplayPlaneSurfaceKHR( m_instance,
@@ -7570,6 +8060,7 @@
                                        VULKAN_HPP_NAMESPACE::SwapchainKHR *                 pSwapchains,
                                        Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     return static_cast<Result>(
       d.vkCreateSharedSwapchainsKHR( m_device,
                                      swapchainCount,
@@ -7587,6 +8078,7 @@
       Optional<const AllocationCallbacks>                                    allocator,
       Dispatch const &                                                       d ) const
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     std::vector<SwapchainKHR, SwapchainKHRAllocator> swapchains( createInfos.size() );
     Result                                           result = static_cast<Result>(
       d.vkCreateSharedSwapchainsKHR( m_device,
@@ -7610,6 +8102,7 @@
       SwapchainKHRAllocator &                                                swapchainKHRAllocator,
       Dispatch const &                                                       d ) const
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     std::vector<SwapchainKHR, SwapchainKHRAllocator> swapchains( createInfos.size(), swapchainKHRAllocator );
     Result                                           result = static_cast<Result>(
       d.vkCreateSharedSwapchainsKHR( m_device,
@@ -7627,6 +8120,7 @@
                                       Optional<const AllocationCallbacks>                  allocator,
                                       Dispatch const &                                     d ) const
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     SwapchainKHR swapchain;
     Result       result = static_cast<Result>(
       d.vkCreateSharedSwapchainsKHR( m_device,
@@ -7647,6 +8141,7 @@
       Optional<const AllocationCallbacks>                                    allocator,
       Dispatch const &                                                       d ) const
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     std::vector<UniqueHandle<SwapchainKHR, Dispatch>, SwapchainKHRAllocator> uniqueSwapchains;
     std::vector<SwapchainKHR>                                                swapchains( createInfos.size() );
     Result                                                                   result = static_cast<Result>(
@@ -7682,6 +8177,7 @@
       SwapchainKHRAllocator &                                                swapchainKHRAllocator,
       Dispatch const &                                                       d ) const
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     std::vector<UniqueHandle<SwapchainKHR, Dispatch>, SwapchainKHRAllocator> uniqueSwapchains( swapchainKHRAllocator );
     std::vector<SwapchainKHR>                                                swapchains( createInfos.size() );
     Result                                                                   result = static_cast<Result>(
@@ -7711,6 +8207,7 @@
                                             Optional<const AllocationCallbacks>                  allocator,
                                             Dispatch const &                                     d ) const
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     SwapchainKHR swapchain;
     Result       result = static_cast<Result>(
       d.vkCreateSharedSwapchainsKHR( m_device,
@@ -7736,6 +8233,7 @@
                                     VULKAN_HPP_NAMESPACE::SurfaceKHR *                     pSurface,
                                     Dispatch const &                                       d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     return static_cast<Result>(
       d.vkCreateXlibSurfaceKHR( m_instance,
                                 reinterpret_cast<const VkXlibSurfaceCreateInfoKHR *>( pCreateInfo ),
@@ -7751,6 +8249,7 @@
                                     Optional<const AllocationCallbacks> allocator,
                                     Dispatch const &                    d ) const
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     VULKAN_HPP_NAMESPACE::SurfaceKHR surface;
     Result                           result = static_cast<Result>(
       d.vkCreateXlibSurfaceKHR( m_instance,
@@ -7769,6 +8268,7 @@
                                           Optional<const AllocationCallbacks> allocator,
                                           Dispatch const &                    d ) const
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     VULKAN_HPP_NAMESPACE::SurfaceKHR surface;
     Result                           result = static_cast<Result>(
       d.vkCreateXlibSurfaceKHR( m_instance,
@@ -7789,6 +8289,7 @@
                                                                           VisualID         visualID,
                                                                           Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     return static_cast<Bool32>(
       d.vkGetPhysicalDeviceXlibPresentationSupportKHR( m_physicalDevice, queueFamilyIndex, dpy, visualID ) );
   }
@@ -7800,6 +8301,7 @@
                                                                           VisualID         visualID,
                                                                           Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     return d.vkGetPhysicalDeviceXlibPresentationSupportKHR( m_physicalDevice, queueFamilyIndex, &dpy, visualID );
   }
 #  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/
@@ -7815,6 +8317,7 @@
                                    VULKAN_HPP_NAMESPACE::SurfaceKHR *                    pSurface,
                                    Dispatch const &                                      d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     return static_cast<Result>(
       d.vkCreateXcbSurfaceKHR( m_instance,
                                reinterpret_cast<const VkXcbSurfaceCreateInfoKHR *>( pCreateInfo ),
@@ -7830,6 +8333,7 @@
                                    Optional<const AllocationCallbacks> allocator,
                                    Dispatch const &                    d ) const
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     VULKAN_HPP_NAMESPACE::SurfaceKHR surface;
     Result                           result = static_cast<Result>(
       d.vkCreateXcbSurfaceKHR( m_instance,
@@ -7848,6 +8352,7 @@
                                          Optional<const AllocationCallbacks> allocator,
                                          Dispatch const &                    d ) const
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     VULKAN_HPP_NAMESPACE::SurfaceKHR surface;
     Result                           result = static_cast<Result>(
       d.vkCreateXcbSurfaceKHR( m_instance,
@@ -7868,6 +8373,7 @@
                                                                          xcb_visualid_t     visual_id,
                                                                          Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     return static_cast<Bool32>(
       d.vkGetPhysicalDeviceXcbPresentationSupportKHR( m_physicalDevice, queueFamilyIndex, connection, visual_id ) );
   }
@@ -7879,6 +8385,7 @@
                                                                          xcb_visualid_t     visual_id,
                                                                          Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     return d.vkGetPhysicalDeviceXcbPresentationSupportKHR( m_physicalDevice, queueFamilyIndex, &connection, visual_id );
   }
 #  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/
@@ -7894,6 +8401,7 @@
                                        VULKAN_HPP_NAMESPACE::SurfaceKHR *                        pSurface,
                                        Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     return static_cast<Result>(
       d.vkCreateWaylandSurfaceKHR( m_instance,
                                    reinterpret_cast<const VkWaylandSurfaceCreateInfoKHR *>( pCreateInfo ),
@@ -7909,6 +8417,7 @@
                                        Optional<const AllocationCallbacks> allocator,
                                        Dispatch const &                    d ) const
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     VULKAN_HPP_NAMESPACE::SurfaceKHR surface;
     Result                           result = static_cast<Result>(
       d.vkCreateWaylandSurfaceKHR( m_instance,
@@ -7927,6 +8436,7 @@
                                              Optional<const AllocationCallbacks> allocator,
                                              Dispatch const &                    d ) const
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     VULKAN_HPP_NAMESPACE::SurfaceKHR surface;
     Result                           result = static_cast<Result>(
       d.vkCreateWaylandSurfaceKHR( m_instance,
@@ -7945,6 +8455,7 @@
   VULKAN_HPP_INLINE Bool32 PhysicalDevice::getWaylandPresentationSupportKHR(
     uint32_t queueFamilyIndex, struct wl_display * display, Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     return static_cast<Bool32>(
       d.vkGetPhysicalDeviceWaylandPresentationSupportKHR( m_physicalDevice, queueFamilyIndex, display ) );
   }
@@ -7954,6 +8465,7 @@
   VULKAN_HPP_INLINE Bool32 PhysicalDevice::getWaylandPresentationSupportKHR(
     uint32_t queueFamilyIndex, struct wl_display & display, Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     return d.vkGetPhysicalDeviceWaylandPresentationSupportKHR( m_physicalDevice, queueFamilyIndex, &display );
   }
 #  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/
@@ -7969,6 +8481,7 @@
                                        VULKAN_HPP_NAMESPACE::SurfaceKHR *                        pSurface,
                                        Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     return static_cast<Result>(
       d.vkCreateAndroidSurfaceKHR( m_instance,
                                    reinterpret_cast<const VkAndroidSurfaceCreateInfoKHR *>( pCreateInfo ),
@@ -7984,6 +8497,7 @@
                                        Optional<const AllocationCallbacks> allocator,
                                        Dispatch const &                    d ) const
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     VULKAN_HPP_NAMESPACE::SurfaceKHR surface;
     Result                           result = static_cast<Result>(
       d.vkCreateAndroidSurfaceKHR( m_instance,
@@ -8002,6 +8516,7 @@
                                              Optional<const AllocationCallbacks> allocator,
                                              Dispatch const &                    d ) const
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     VULKAN_HPP_NAMESPACE::SurfaceKHR surface;
     Result                           result = static_cast<Result>(
       d.vkCreateAndroidSurfaceKHR( m_instance,
@@ -8027,6 +8542,7 @@
                                      VULKAN_HPP_NAMESPACE::SurfaceKHR *                      pSurface,
                                      Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     return static_cast<Result>(
       d.vkCreateWin32SurfaceKHR( m_instance,
                                  reinterpret_cast<const VkWin32SurfaceCreateInfoKHR *>( pCreateInfo ),
@@ -8042,6 +8558,7 @@
                                      Optional<const AllocationCallbacks> allocator,
                                      Dispatch const &                    d ) const
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     VULKAN_HPP_NAMESPACE::SurfaceKHR surface;
     Result                           result = static_cast<Result>(
       d.vkCreateWin32SurfaceKHR( m_instance,
@@ -8060,6 +8577,7 @@
                                            Optional<const AllocationCallbacks> allocator,
                                            Dispatch const &                    d ) const
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     VULKAN_HPP_NAMESPACE::SurfaceKHR surface;
     Result                           result = static_cast<Result>(
       d.vkCreateWin32SurfaceKHR( m_instance,
@@ -8078,6 +8596,7 @@
   VULKAN_HPP_INLINE Bool32 PhysicalDevice::getWin32PresentationSupportKHR(
     uint32_t queueFamilyIndex, Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     return static_cast<Bool32>(
       d.vkGetPhysicalDeviceWin32PresentationSupportKHR( m_physicalDevice, queueFamilyIndex ) );
   }
@@ -8092,6 +8611,7 @@
                                             VULKAN_HPP_NAMESPACE::DebugReportCallbackEXT *                 pCallback,
                                             Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     return static_cast<Result>(
       d.vkCreateDebugReportCallbackEXT( m_instance,
                                         reinterpret_cast<const VkDebugReportCallbackCreateInfoEXT *>( pCreateInfo ),
@@ -8106,6 +8626,7 @@
                                             Optional<const AllocationCallbacks>      allocator,
                                             Dispatch const &                         d ) const
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     VULKAN_HPP_NAMESPACE::DebugReportCallbackEXT callback;
     Result                                       result = static_cast<Result>(
       d.vkCreateDebugReportCallbackEXT( m_instance,
@@ -8124,6 +8645,7 @@
                                                   Optional<const AllocationCallbacks>      allocator,
                                                   Dispatch const &                         d ) const
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     VULKAN_HPP_NAMESPACE::DebugReportCallbackEXT callback;
     Result                                       result = static_cast<Result>(
       d.vkCreateDebugReportCallbackEXT( m_instance,
@@ -8144,6 +8666,7 @@
                                              const VULKAN_HPP_NAMESPACE::AllocationCallbacks * pAllocator,
                                              Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkDestroyDebugReportCallbackEXT( m_instance,
                                        static_cast<VkDebugReportCallbackEXT>( callback ),
                                        reinterpret_cast<const VkAllocationCallbacks *>( pAllocator ) );
@@ -8155,6 +8678,7 @@
                                                                   Optional<const AllocationCallbacks> allocator,
                                                                   Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkDestroyDebugReportCallbackEXT(
       m_instance,
       static_cast<VkDebugReportCallbackEXT>( callback ),
@@ -8168,6 +8692,7 @@
                                             const VULKAN_HPP_NAMESPACE::AllocationCallbacks * pAllocator,
                                             Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkDestroyDebugReportCallbackEXT( m_instance,
                                        static_cast<VkDebugReportCallbackEXT>( callback ),
                                        reinterpret_cast<const VkAllocationCallbacks *>( pAllocator ) );
@@ -8179,6 +8704,7 @@
                                             Optional<const AllocationCallbacks>          allocator,
                                             Dispatch const &                             d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkDestroyDebugReportCallbackEXT(
       m_instance,
       static_cast<VkDebugReportCallbackEXT>( callback ),
@@ -8197,6 +8723,7 @@
                                                           const char *                                   pMessage,
                                                           Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkDebugReportMessageEXT( m_instance,
                                static_cast<VkDebugReportFlagsEXT>( flags ),
                                static_cast<VkDebugReportObjectTypeEXT>( objectType ),
@@ -8218,6 +8745,7 @@
                                                           const std::string &                            message,
                                                           Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkDebugReportMessageEXT( m_instance,
                                static_cast<VkDebugReportFlagsEXT>( flags ),
                                static_cast<VkDebugReportObjectTypeEXT>( objectType ),
@@ -8235,6 +8763,7 @@
   VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE Result Device::debugMarkerSetObjectTagEXT(
     const VULKAN_HPP_NAMESPACE::DebugMarkerObjectTagInfoEXT * pTagInfo, Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     return static_cast<Result>(
       d.vkDebugMarkerSetObjectTagEXT( m_device, reinterpret_cast<const VkDebugMarkerObjectTagInfoEXT *>( pTagInfo ) ) );
   }
@@ -8244,6 +8773,7 @@
   VULKAN_HPP_NODISCARD_WHEN_NO_EXCEPTIONS VULKAN_HPP_INLINE typename ResultValueType<void>::type
                                           Device::debugMarkerSetObjectTagEXT( const DebugMarkerObjectTagInfoEXT & tagInfo, Dispatch const & d ) const
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     Result result = static_cast<Result>(
       d.vkDebugMarkerSetObjectTagEXT( m_device, reinterpret_cast<const VkDebugMarkerObjectTagInfoEXT *>( &tagInfo ) ) );
     return createResultValue( result, VULKAN_HPP_NAMESPACE_STRING "::Device::debugMarkerSetObjectTagEXT" );
@@ -8254,6 +8784,7 @@
   VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE Result Device::debugMarkerSetObjectNameEXT(
     const VULKAN_HPP_NAMESPACE::DebugMarkerObjectNameInfoEXT * pNameInfo, Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     return static_cast<Result>( d.vkDebugMarkerSetObjectNameEXT(
       m_device, reinterpret_cast<const VkDebugMarkerObjectNameInfoEXT *>( pNameInfo ) ) );
   }
@@ -8263,6 +8794,7 @@
   VULKAN_HPP_NODISCARD_WHEN_NO_EXCEPTIONS VULKAN_HPP_INLINE typename ResultValueType<void>::type
                                           Device::debugMarkerSetObjectNameEXT( const DebugMarkerObjectNameInfoEXT & nameInfo, Dispatch const & d ) const
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     Result result = static_cast<Result>( d.vkDebugMarkerSetObjectNameEXT(
       m_device, reinterpret_cast<const VkDebugMarkerObjectNameInfoEXT *>( &nameInfo ) ) );
     return createResultValue( result, VULKAN_HPP_NAMESPACE_STRING "::Device::debugMarkerSetObjectNameEXT" );
@@ -8274,6 +8806,7 @@
     CommandBuffer::debugMarkerBeginEXT( const VULKAN_HPP_NAMESPACE::DebugMarkerMarkerInfoEXT * pMarkerInfo,
                                         Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkCmdDebugMarkerBeginEXT( m_commandBuffer, reinterpret_cast<const VkDebugMarkerMarkerInfoEXT *>( pMarkerInfo ) );
   }
 
@@ -8282,6 +8815,7 @@
   VULKAN_HPP_INLINE void CommandBuffer::debugMarkerBeginEXT( const DebugMarkerMarkerInfoEXT & markerInfo,
                                                              Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkCmdDebugMarkerBeginEXT( m_commandBuffer, reinterpret_cast<const VkDebugMarkerMarkerInfoEXT *>( &markerInfo ) );
   }
 #endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/
@@ -8289,6 +8823,7 @@
   template <typename Dispatch>
   VULKAN_HPP_INLINE void CommandBuffer::debugMarkerEndEXT( Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkCmdDebugMarkerEndEXT( m_commandBuffer );
   }
 
@@ -8297,6 +8832,7 @@
     CommandBuffer::debugMarkerInsertEXT( const VULKAN_HPP_NAMESPACE::DebugMarkerMarkerInfoEXT * pMarkerInfo,
                                          Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkCmdDebugMarkerInsertEXT( m_commandBuffer, reinterpret_cast<const VkDebugMarkerMarkerInfoEXT *>( pMarkerInfo ) );
   }
 
@@ -8305,6 +8841,7 @@
   VULKAN_HPP_INLINE void CommandBuffer::debugMarkerInsertEXT( const DebugMarkerMarkerInfoEXT & markerInfo,
                                                               Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkCmdDebugMarkerInsertEXT( m_commandBuffer, reinterpret_cast<const VkDebugMarkerMarkerInfoEXT *>( &markerInfo ) );
   }
 #endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/
@@ -8318,6 +8855,7 @@
                                              VULKAN_HPP_NAMESPACE::VideoCapabilitiesKHR *  pCapabilities,
                                              Dispatch const &                              d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     return static_cast<Result>(
       d.vkGetPhysicalDeviceVideoCapabilitiesKHR( m_physicalDevice,
                                                  reinterpret_cast<const VkVideoProfileKHR *>( pVideoProfile ),
@@ -8330,6 +8868,7 @@
     typename ResultValueType<VULKAN_HPP_NAMESPACE::VideoCapabilitiesKHR>::type
     PhysicalDevice::getVideoCapabilitiesKHR( const VideoProfileKHR & videoProfile, Dispatch const & d ) const
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     VULKAN_HPP_NAMESPACE::VideoCapabilitiesKHR capabilities;
     Result                                     result = static_cast<Result>(
       d.vkGetPhysicalDeviceVideoCapabilitiesKHR( m_physicalDevice,
@@ -8343,6 +8882,7 @@
   VULKAN_HPP_NODISCARD_WHEN_NO_EXCEPTIONS VULKAN_HPP_INLINE typename ResultValueType<StructureChain<X, Y, Z...>>::type
                                           PhysicalDevice::getVideoCapabilitiesKHR( const VideoProfileKHR & videoProfile, Dispatch const & d ) const
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     StructureChain<X, Y, Z...>                   structureChain;
     VULKAN_HPP_NAMESPACE::VideoCapabilitiesKHR & capabilities =
       structureChain.template get<VULKAN_HPP_NAMESPACE::VideoCapabilitiesKHR>();
@@ -8362,6 +8902,7 @@
     VULKAN_HPP_NAMESPACE::VideoFormatPropertiesKHR *               pVideoFormatProperties,
     Dispatch const &                                               d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     return static_cast<Result>( d.vkGetPhysicalDeviceVideoFormatPropertiesKHR(
       m_physicalDevice,
       reinterpret_cast<const VkPhysicalDeviceVideoFormatInfoKHR *>( pVideoFormatInfo ),
@@ -8376,6 +8917,7 @@
     PhysicalDevice::getVideoFormatPropertiesKHR( const PhysicalDeviceVideoFormatInfoKHR & videoFormatInfo,
                                                  Dispatch const &                         d ) const
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     std::vector<VideoFormatPropertiesKHR, VideoFormatPropertiesKHRAllocator> videoFormatProperties;
     uint32_t                                                                 videoFormatPropertyCount;
     Result                                                                   result;
@@ -8415,6 +8957,7 @@
                                                  VideoFormatPropertiesKHRAllocator & videoFormatPropertiesKHRAllocator,
                                                  Dispatch const &                    d ) const
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     std::vector<VideoFormatPropertiesKHR, VideoFormatPropertiesKHRAllocator> videoFormatProperties(
       videoFormatPropertiesKHRAllocator );
     uint32_t videoFormatPropertyCount;
@@ -8453,6 +8996,7 @@
                                    VULKAN_HPP_NAMESPACE::VideoSessionKHR *                 pVideoSession,
                                    Dispatch const &                                        d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     return static_cast<Result>(
       d.vkCreateVideoSessionKHR( m_device,
                                  reinterpret_cast<const VkVideoSessionCreateInfoKHR *>( pCreateInfo ),
@@ -8468,6 +9012,7 @@
                                    Optional<const AllocationCallbacks> allocator,
                                    Dispatch const &                    d ) const
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     VULKAN_HPP_NAMESPACE::VideoSessionKHR videoSession;
     Result                                result = static_cast<Result>(
       d.vkCreateVideoSessionKHR( m_device,
@@ -8486,6 +9031,7 @@
                                          Optional<const AllocationCallbacks> allocator,
                                          Dispatch const &                    d ) const
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     VULKAN_HPP_NAMESPACE::VideoSessionKHR videoSession;
     Result                                result = static_cast<Result>(
       d.vkCreateVideoSessionKHR( m_device,
@@ -8505,6 +9051,7 @@
                                                          const VULKAN_HPP_NAMESPACE::AllocationCallbacks * pAllocator,
                                                          Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkDestroyVideoSessionKHR( m_device,
                                 static_cast<VkVideoSessionKHR>( videoSession ),
                                 reinterpret_cast<const VkAllocationCallbacks *>( pAllocator ) );
@@ -8516,6 +9063,7 @@
                                                          Optional<const AllocationCallbacks>   allocator,
                                                          Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkDestroyVideoSessionKHR( m_device,
                                 static_cast<VkVideoSessionKHR>( videoSession ),
                                 reinterpret_cast<const VkAllocationCallbacks *>(
@@ -8528,6 +9076,7 @@
                                           const VULKAN_HPP_NAMESPACE::AllocationCallbacks * pAllocator,
                                           Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkDestroyVideoSessionKHR( m_device,
                                 static_cast<VkVideoSessionKHR>( videoSession ),
                                 reinterpret_cast<const VkAllocationCallbacks *>( pAllocator ) );
@@ -8539,6 +9088,7 @@
                                           Optional<const AllocationCallbacks>   allocator,
                                           Dispatch const &                      d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkDestroyVideoSessionKHR( m_device,
                                 static_cast<VkVideoSessionKHR>( videoSession ),
                                 reinterpret_cast<const VkAllocationCallbacks *>(
@@ -8553,6 +9103,7 @@
     VULKAN_HPP_NAMESPACE::VideoGetMemoryPropertiesKHR * pVideoSessionMemoryRequirements,
     Dispatch const &                                    d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     return static_cast<Result>( d.vkGetVideoSessionMemoryRequirementsKHR(
       m_device,
       static_cast<VkVideoSessionKHR>( videoSession ),
@@ -8567,6 +9118,7 @@
     Device::getVideoSessionMemoryRequirementsKHR( VULKAN_HPP_NAMESPACE::VideoSessionKHR videoSession,
                                                   Dispatch const &                      d ) const
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     std::vector<VideoGetMemoryPropertiesKHR, VideoGetMemoryPropertiesKHRAllocator> videoSessionMemoryRequirements;
     uint32_t                                                                       videoSessionMemoryRequirementsCount;
     Result                                                                         result;
@@ -8607,6 +9159,7 @@
       VideoGetMemoryPropertiesKHRAllocator & videoGetMemoryPropertiesKHRAllocator,
       Dispatch const &                       d ) const
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     std::vector<VideoGetMemoryPropertiesKHR, VideoGetMemoryPropertiesKHRAllocator> videoSessionMemoryRequirements(
       videoGetMemoryPropertiesKHRAllocator );
     uint32_t videoSessionMemoryRequirementsCount;
@@ -8644,6 +9197,7 @@
                                        const VULKAN_HPP_NAMESPACE::VideoBindMemoryKHR * pVideoSessionBindMemories,
                                        Dispatch const &                                 d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     return static_cast<Result>(
       d.vkBindVideoSessionMemoryKHR( m_device,
                                      static_cast<VkVideoSessionKHR>( videoSession ),
@@ -8659,6 +9213,7 @@
       ArrayProxy<const VULKAN_HPP_NAMESPACE::VideoBindMemoryKHR> const & videoSessionBindMemories,
       Dispatch const &                                                   d ) const
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     Result result = static_cast<Result>( d.vkBindVideoSessionMemoryKHR(
       m_device,
       static_cast<VkVideoSessionKHR>( videoSession ),
@@ -8675,6 +9230,7 @@
     VULKAN_HPP_NAMESPACE::VideoSessionParametersKHR *                 pVideoSessionParameters,
     Dispatch const &                                                  d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     return static_cast<Result>( d.vkCreateVideoSessionParametersKHR(
       m_device,
       reinterpret_cast<const VkVideoSessionParametersCreateInfoKHR *>( pCreateInfo ),
@@ -8690,6 +9246,7 @@
                                              Optional<const AllocationCallbacks>         allocator,
                                              Dispatch const &                            d ) const
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     VULKAN_HPP_NAMESPACE::VideoSessionParametersKHR videoSessionParameters;
     Result                                          result = static_cast<Result>( d.vkCreateVideoSessionParametersKHR(
       m_device,
@@ -8709,6 +9266,7 @@
                                                    Optional<const AllocationCallbacks>         allocator,
                                                    Dispatch const &                            d ) const
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     VULKAN_HPP_NAMESPACE::VideoSessionParametersKHR videoSessionParameters;
     Result                                          result = static_cast<Result>( d.vkCreateVideoSessionParametersKHR(
       m_device,
@@ -8732,6 +9290,7 @@
     const VULKAN_HPP_NAMESPACE::VideoSessionParametersUpdateInfoKHR * pUpdateInfo,
     Dispatch const &                                                  d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     return static_cast<Result>( d.vkUpdateVideoSessionParametersKHR(
       m_device,
       static_cast<VkVideoSessionParametersKHR>( videoSessionParameters ),
@@ -8745,6 +9304,7 @@
                                              const VideoSessionParametersUpdateInfoKHR &     updateInfo,
                                              Dispatch const &                                d ) const
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     Result result = static_cast<Result>( d.vkUpdateVideoSessionParametersKHR(
       m_device,
       static_cast<VkVideoSessionParametersKHR>( videoSessionParameters ),
@@ -8759,6 +9319,7 @@
                                               const VULKAN_HPP_NAMESPACE::AllocationCallbacks * pAllocator,
                                               Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkDestroyVideoSessionParametersKHR( m_device,
                                           static_cast<VkVideoSessionParametersKHR>( videoSessionParameters ),
                                           reinterpret_cast<const VkAllocationCallbacks *>( pAllocator ) );
@@ -8771,6 +9332,7 @@
                                               Optional<const AllocationCallbacks>             allocator,
                                               Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkDestroyVideoSessionParametersKHR(
       m_device,
       static_cast<VkVideoSessionParametersKHR>( videoSessionParameters ),
@@ -8784,6 +9346,7 @@
                                           const VULKAN_HPP_NAMESPACE::AllocationCallbacks * pAllocator,
                                           Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkDestroyVideoSessionParametersKHR( m_device,
                                           static_cast<VkVideoSessionParametersKHR>( videoSessionParameters ),
                                           reinterpret_cast<const VkAllocationCallbacks *>( pAllocator ) );
@@ -8795,6 +9358,7 @@
                                           Optional<const AllocationCallbacks>             allocator,
                                           Dispatch const &                                d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkDestroyVideoSessionParametersKHR(
       m_device,
       static_cast<VkVideoSessionParametersKHR>( videoSessionParameters ),
@@ -8808,6 +9372,7 @@
     CommandBuffer::beginVideoCodingKHR( const VULKAN_HPP_NAMESPACE::VideoBeginCodingInfoKHR * pBeginInfo,
                                         Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkCmdBeginVideoCodingKHR( m_commandBuffer, reinterpret_cast<const VkVideoBeginCodingInfoKHR *>( pBeginInfo ) );
   }
 
@@ -8816,6 +9381,7 @@
   VULKAN_HPP_INLINE void CommandBuffer::beginVideoCodingKHR( const VideoBeginCodingInfoKHR & beginInfo,
                                                              Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkCmdBeginVideoCodingKHR( m_commandBuffer, reinterpret_cast<const VkVideoBeginCodingInfoKHR *>( &beginInfo ) );
   }
 #  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/
@@ -8825,6 +9391,7 @@
     CommandBuffer::endVideoCodingKHR( const VULKAN_HPP_NAMESPACE::VideoEndCodingInfoKHR * pEndCodingInfo,
                                       Dispatch const &                                    d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkCmdEndVideoCodingKHR( m_commandBuffer, reinterpret_cast<const VkVideoEndCodingInfoKHR *>( pEndCodingInfo ) );
   }
 
@@ -8833,6 +9400,7 @@
   VULKAN_HPP_INLINE void CommandBuffer::endVideoCodingKHR( const VideoEndCodingInfoKHR & endCodingInfo,
                                                            Dispatch const &              d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkCmdEndVideoCodingKHR( m_commandBuffer, reinterpret_cast<const VkVideoEndCodingInfoKHR *>( &endCodingInfo ) );
   }
 #  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/
@@ -8842,6 +9410,7 @@
     CommandBuffer::controlVideoCodingKHR( const VULKAN_HPP_NAMESPACE::VideoCodingControlInfoKHR * pCodingControlInfo,
                                           Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkCmdControlVideoCodingKHR( m_commandBuffer,
                                   reinterpret_cast<const VkVideoCodingControlInfoKHR *>( pCodingControlInfo ) );
   }
@@ -8851,6 +9420,7 @@
   VULKAN_HPP_INLINE void CommandBuffer::controlVideoCodingKHR( const VideoCodingControlInfoKHR & codingControlInfo,
                                                                Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkCmdControlVideoCodingKHR( m_commandBuffer,
                                   reinterpret_cast<const VkVideoCodingControlInfoKHR *>( &codingControlInfo ) );
   }
@@ -8864,6 +9434,7 @@
   VULKAN_HPP_INLINE void CommandBuffer::decodeVideoKHR( const VULKAN_HPP_NAMESPACE::VideoDecodeInfoKHR * pFrameInfo,
                                                         Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkCmdDecodeVideoKHR( m_commandBuffer, reinterpret_cast<const VkVideoDecodeInfoKHR *>( pFrameInfo ) );
   }
 
@@ -8872,6 +9443,7 @@
   VULKAN_HPP_INLINE void CommandBuffer::decodeVideoKHR( const VideoDecodeInfoKHR & frameInfo,
                                                         Dispatch const &           d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkCmdDecodeVideoKHR( m_commandBuffer, reinterpret_cast<const VkVideoDecodeInfoKHR *>( &frameInfo ) );
   }
 #  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/
@@ -8888,6 +9460,7 @@
                                                     const VULKAN_HPP_NAMESPACE::DeviceSize * pSizes,
                                                     Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkCmdBindTransformFeedbackBuffersEXT( m_commandBuffer,
                                             firstBinding,
                                             bindingCount,
@@ -8905,6 +9478,7 @@
                                                     ArrayProxy<const VULKAN_HPP_NAMESPACE::DeviceSize> const & sizes,
                                                     Dispatch const & d ) const VULKAN_HPP_NOEXCEPT_WHEN_NO_EXCEPTIONS
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
 #  ifdef VULKAN_HPP_NO_EXCEPTIONS
     VULKAN_HPP_ASSERT( buffers.size() == offsets.size() );
     VULKAN_HPP_ASSERT( sizes.empty() || buffers.size() == sizes.size() );
@@ -8938,6 +9512,7 @@
                                               const VULKAN_HPP_NAMESPACE::DeviceSize * pCounterBufferOffsets,
                                               Dispatch const &                         d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkCmdBeginTransformFeedbackEXT( m_commandBuffer,
                                       firstCounterBuffer,
                                       counterBufferCount,
@@ -8953,6 +9528,7 @@
     ArrayProxy<const VULKAN_HPP_NAMESPACE::DeviceSize> const & counterBufferOffsets,
     Dispatch const &                                           d ) const VULKAN_HPP_NOEXCEPT_WHEN_NO_EXCEPTIONS
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
 #  ifdef VULKAN_HPP_NO_EXCEPTIONS
     VULKAN_HPP_ASSERT( counterBufferOffsets.empty() || counterBuffers.size() == counterBufferOffsets.size() );
 #  else
@@ -8980,6 +9556,7 @@
                                             const VULKAN_HPP_NAMESPACE::DeviceSize * pCounterBufferOffsets,
                                             Dispatch const &                         d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkCmdEndTransformFeedbackEXT( m_commandBuffer,
                                     firstCounterBuffer,
                                     counterBufferCount,
@@ -8995,6 +9572,7 @@
     ArrayProxy<const VULKAN_HPP_NAMESPACE::DeviceSize> const & counterBufferOffsets,
     Dispatch const &                                           d ) const VULKAN_HPP_NOEXCEPT_WHEN_NO_EXCEPTIONS
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
 #  ifdef VULKAN_HPP_NO_EXCEPTIONS
     VULKAN_HPP_ASSERT( counterBufferOffsets.empty() || counterBuffers.size() == counterBufferOffsets.size() );
 #  else
@@ -9021,6 +9599,7 @@
                                                               uint32_t                                index,
                                                               Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkCmdBeginQueryIndexedEXT(
       m_commandBuffer, static_cast<VkQueryPool>( queryPool ), query, static_cast<VkQueryControlFlags>( flags ), index );
   }
@@ -9031,6 +9610,7 @@
                                                             uint32_t                        index,
                                                             Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkCmdEndQueryIndexedEXT( m_commandBuffer, static_cast<VkQueryPool>( queryPool ), query, index );
   }
 
@@ -9043,6 +9623,7 @@
                                                                   uint32_t                         vertexStride,
                                                                   Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkCmdDrawIndirectByteCountEXT( m_commandBuffer,
                                      instanceCount,
                                      firstInstance,
@@ -9061,6 +9642,7 @@
                                VULKAN_HPP_NAMESPACE::CuModuleNVX *                 pModule,
                                Dispatch const &                                    d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     return static_cast<Result>( d.vkCreateCuModuleNVX( m_device,
                                                        reinterpret_cast<const VkCuModuleCreateInfoNVX *>( pCreateInfo ),
                                                        reinterpret_cast<const VkAllocationCallbacks *>( pAllocator ),
@@ -9075,6 +9657,7 @@
                                Optional<const AllocationCallbacks> allocator,
                                Dispatch const &                    d ) const
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     VULKAN_HPP_NAMESPACE::CuModuleNVX module;
     Result                            result = static_cast<Result>(
       d.vkCreateCuModuleNVX( m_device,
@@ -9093,6 +9676,7 @@
                                      Optional<const AllocationCallbacks> allocator,
                                      Dispatch const &                    d ) const
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     VULKAN_HPP_NAMESPACE::CuModuleNVX module;
     Result                            result = static_cast<Result>(
       d.vkCreateCuModuleNVX( m_device,
@@ -9114,6 +9698,7 @@
                                  VULKAN_HPP_NAMESPACE::CuFunctionNVX *                 pFunction,
                                  Dispatch const &                                      d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     return static_cast<Result>(
       d.vkCreateCuFunctionNVX( m_device,
                                reinterpret_cast<const VkCuFunctionCreateInfoNVX *>( pCreateInfo ),
@@ -9129,6 +9714,7 @@
                                  Optional<const AllocationCallbacks> allocator,
                                  Dispatch const &                    d ) const
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     VULKAN_HPP_NAMESPACE::CuFunctionNVX function;
     Result                              result = static_cast<Result>(
       d.vkCreateCuFunctionNVX( m_device,
@@ -9147,6 +9733,7 @@
                                        Optional<const AllocationCallbacks> allocator,
                                        Dispatch const &                    d ) const
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     VULKAN_HPP_NAMESPACE::CuFunctionNVX function;
     Result                              result = static_cast<Result>(
       d.vkCreateCuFunctionNVX( m_device,
@@ -9166,6 +9753,7 @@
                                                      const VULKAN_HPP_NAMESPACE::AllocationCallbacks * pAllocator,
                                                      Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkDestroyCuModuleNVX(
       m_device, static_cast<VkCuModuleNVX>( module ), reinterpret_cast<const VkAllocationCallbacks *>( pAllocator ) );
   }
@@ -9176,6 +9764,7 @@
                                                      Optional<const AllocationCallbacks> allocator,
                                                      Dispatch const &                    d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkDestroyCuModuleNVX( m_device,
                             static_cast<VkCuModuleNVX>( module ),
                             reinterpret_cast<const VkAllocationCallbacks *>(
@@ -9188,6 +9777,7 @@
                                           const VULKAN_HPP_NAMESPACE::AllocationCallbacks * pAllocator,
                                           Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkDestroyCuModuleNVX(
       m_device, static_cast<VkCuModuleNVX>( module ), reinterpret_cast<const VkAllocationCallbacks *>( pAllocator ) );
   }
@@ -9198,6 +9788,7 @@
                                           Optional<const AllocationCallbacks> allocator,
                                           Dispatch const &                    d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkDestroyCuModuleNVX( m_device,
                             static_cast<VkCuModuleNVX>( module ),
                             reinterpret_cast<const VkAllocationCallbacks *>(
@@ -9210,6 +9801,7 @@
                                                        const VULKAN_HPP_NAMESPACE::AllocationCallbacks * pAllocator,
                                                        Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkDestroyCuFunctionNVX( m_device,
                               static_cast<VkCuFunctionNVX>( function ),
                               reinterpret_cast<const VkAllocationCallbacks *>( pAllocator ) );
@@ -9221,6 +9813,7 @@
                                                        Optional<const AllocationCallbacks> allocator,
                                                        Dispatch const &                    d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkDestroyCuFunctionNVX( m_device,
                               static_cast<VkCuFunctionNVX>( function ),
                               reinterpret_cast<const VkAllocationCallbacks *>(
@@ -9233,6 +9826,7 @@
                                           const VULKAN_HPP_NAMESPACE::AllocationCallbacks * pAllocator,
                                           Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkDestroyCuFunctionNVX( m_device,
                               static_cast<VkCuFunctionNVX>( function ),
                               reinterpret_cast<const VkAllocationCallbacks *>( pAllocator ) );
@@ -9244,6 +9838,7 @@
                                           Optional<const AllocationCallbacks> allocator,
                                           Dispatch const &                    d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkDestroyCuFunctionNVX( m_device,
                               static_cast<VkCuFunctionNVX>( function ),
                               reinterpret_cast<const VkAllocationCallbacks *>(
@@ -9255,6 +9850,7 @@
   VULKAN_HPP_INLINE void CommandBuffer::cuLaunchKernelNVX( const VULKAN_HPP_NAMESPACE::CuLaunchInfoNVX * pLaunchInfo,
                                                            Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkCmdCuLaunchKernelNVX( m_commandBuffer, reinterpret_cast<const VkCuLaunchInfoNVX *>( pLaunchInfo ) );
   }
 
@@ -9263,6 +9859,7 @@
   VULKAN_HPP_INLINE void CommandBuffer::cuLaunchKernelNVX( const CuLaunchInfoNVX & launchInfo,
                                                            Dispatch const &        d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkCmdCuLaunchKernelNVX( m_commandBuffer, reinterpret_cast<const VkCuLaunchInfoNVX *>( &launchInfo ) );
   }
 #endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/
@@ -9273,6 +9870,7 @@
   VULKAN_HPP_INLINE uint32_t Device::getImageViewHandleNVX( const VULKAN_HPP_NAMESPACE::ImageViewHandleInfoNVX * pInfo,
                                                             Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     return d.vkGetImageViewHandleNVX( m_device, reinterpret_cast<const VkImageViewHandleInfoNVX *>( pInfo ) );
   }
 
@@ -9281,6 +9879,7 @@
   VULKAN_HPP_INLINE uint32_t Device::getImageViewHandleNVX( const ImageViewHandleInfoNVX & info,
                                                             Dispatch const &               d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     return d.vkGetImageViewHandleNVX( m_device, reinterpret_cast<const VkImageViewHandleInfoNVX *>( &info ) );
   }
 #endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/
@@ -9291,6 +9890,7 @@
                                     VULKAN_HPP_NAMESPACE::ImageViewAddressPropertiesNVX * pProperties,
                                     Dispatch const &                                      d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     return static_cast<Result>(
       d.vkGetImageViewAddressNVX( m_device,
                                   static_cast<VkImageView>( imageView ),
@@ -9303,6 +9903,7 @@
     typename ResultValueType<VULKAN_HPP_NAMESPACE::ImageViewAddressPropertiesNVX>::type
     Device::getImageViewAddressNVX( VULKAN_HPP_NAMESPACE::ImageView imageView, Dispatch const & d ) const
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     VULKAN_HPP_NAMESPACE::ImageViewAddressPropertiesNVX properties;
     Result                                              result = static_cast<Result>(
       d.vkGetImageViewAddressNVX( m_device,
@@ -9323,6 +9924,7 @@
                                                               uint32_t                         stride,
                                                               Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkCmdDrawIndirectCountAMD( m_commandBuffer,
                                  static_cast<VkBuffer>( buffer ),
                                  static_cast<VkDeviceSize>( offset ),
@@ -9341,6 +9943,7 @@
                                                                      uint32_t                         stride,
                                                                      Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkCmdDrawIndexedIndirectCountAMD( m_commandBuffer,
                                         static_cast<VkBuffer>( buffer ),
                                         static_cast<VkDeviceSize>( offset ),
@@ -9361,6 +9964,7 @@
                               void *                                    pInfo,
                               Dispatch const &                          d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     return static_cast<Result>( d.vkGetShaderInfoAMD( m_device,
                                                       static_cast<VkPipeline>( pipeline ),
                                                       static_cast<VkShaderStageFlagBits>( shaderStage ),
@@ -9377,6 +9981,7 @@
                               VULKAN_HPP_NAMESPACE::ShaderInfoTypeAMD   infoType,
                               Dispatch const &                          d ) const
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     std::vector<uint8_t, Uint8_tAllocator> info;
     size_t                                 infoSize;
     Result                                 result;
@@ -9418,6 +10023,7 @@
                               Uint8_tAllocator &                        uint8_tAllocator,
                               Dispatch const &                          d ) const
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     std::vector<uint8_t, Uint8_tAllocator> info( uint8_tAllocator );
     size_t                                 infoSize;
     Result                                 result;
@@ -9459,6 +10065,7 @@
     VULKAN_HPP_NAMESPACE::SurfaceKHR *                                 pSurface,
     Dispatch const &                                                   d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     return static_cast<Result>( d.vkCreateStreamDescriptorSurfaceGGP(
       m_instance,
       reinterpret_cast<const VkStreamDescriptorSurfaceCreateInfoGGP *>( pCreateInfo ),
@@ -9474,6 +10081,7 @@
                                                 Optional<const AllocationCallbacks>          allocator,
                                                 Dispatch const &                             d ) const
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     VULKAN_HPP_NAMESPACE::SurfaceKHR surface;
     Result                           result = static_cast<Result>( d.vkCreateStreamDescriptorSurfaceGGP(
       m_instance,
@@ -9493,6 +10101,7 @@
                                                       Optional<const AllocationCallbacks>          allocator,
                                                       Dispatch const &                             d ) const
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     VULKAN_HPP_NAMESPACE::SurfaceKHR  surface;
     Result                            result = static_cast<Result>( d.vkCreateStreamDescriptorSurfaceGGP(
       m_instance,
@@ -9521,6 +10130,7 @@
     VULKAN_HPP_NAMESPACE::ExternalImageFormatPropertiesNV * pExternalImageFormatProperties,
     Dispatch const &                                        d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     return static_cast<Result>( d.vkGetPhysicalDeviceExternalImageFormatPropertiesNV(
       m_physicalDevice,
       static_cast<VkFormat>( format ),
@@ -9545,6 +10155,7 @@
       VULKAN_HPP_NAMESPACE::ExternalMemoryHandleTypeFlagsNV externalHandleType,
       Dispatch const &                                      d ) const
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     VULKAN_HPP_NAMESPACE::ExternalImageFormatPropertiesNV externalImageFormatProperties;
     Result result = static_cast<Result>( d.vkGetPhysicalDeviceExternalImageFormatPropertiesNV(
       m_physicalDevice,
@@ -9571,6 +10182,7 @@
                                     HANDLE *                                              pHandle,
                                     Dispatch const &                                      d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     return static_cast<Result>(
       d.vkGetMemoryWin32HandleNV( m_device,
                                   static_cast<VkDeviceMemory>( memory ),
@@ -9585,6 +10197,7 @@
                                     VULKAN_HPP_NAMESPACE::ExternalMemoryHandleTypeFlagsNV handleType,
                                     Dispatch const &                                      d ) const
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     HANDLE handle;
     Result result =
       static_cast<Result>( d.vkGetMemoryWin32HandleNV( m_device,
@@ -9602,6 +10215,7 @@
   VULKAN_HPP_INLINE void PhysicalDevice::getFeatures2KHR( VULKAN_HPP_NAMESPACE::PhysicalDeviceFeatures2 * pFeatures,
                                                           Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkGetPhysicalDeviceFeatures2KHR( m_physicalDevice, reinterpret_cast<VkPhysicalDeviceFeatures2 *>( pFeatures ) );
   }
 
@@ -9610,6 +10224,7 @@
   VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::PhysicalDeviceFeatures2
                                          PhysicalDevice::getFeatures2KHR( Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     VULKAN_HPP_NAMESPACE::PhysicalDeviceFeatures2 features;
     d.vkGetPhysicalDeviceFeatures2KHR( m_physicalDevice, reinterpret_cast<VkPhysicalDeviceFeatures2 *>( &features ) );
     return features;
@@ -9619,6 +10234,7 @@
   VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE StructureChain<X, Y, Z...>
                                          PhysicalDevice::getFeatures2KHR( Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     StructureChain<X, Y, Z...>                      structureChain;
     VULKAN_HPP_NAMESPACE::PhysicalDeviceFeatures2 & features =
       structureChain.template get<VULKAN_HPP_NAMESPACE::PhysicalDeviceFeatures2>();
@@ -9632,6 +10248,7 @@
     PhysicalDevice::getProperties2KHR( VULKAN_HPP_NAMESPACE::PhysicalDeviceProperties2 * pProperties,
                                        Dispatch const &                                  d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkGetPhysicalDeviceProperties2KHR( m_physicalDevice,
                                          reinterpret_cast<VkPhysicalDeviceProperties2 *>( pProperties ) );
   }
@@ -9641,6 +10258,7 @@
   VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::PhysicalDeviceProperties2
                                          PhysicalDevice::getProperties2KHR( Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     VULKAN_HPP_NAMESPACE::PhysicalDeviceProperties2 properties;
     d.vkGetPhysicalDeviceProperties2KHR( m_physicalDevice,
                                          reinterpret_cast<VkPhysicalDeviceProperties2 *>( &properties ) );
@@ -9651,6 +10269,7 @@
   VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE StructureChain<X, Y, Z...>
                                          PhysicalDevice::getProperties2KHR( Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     StructureChain<X, Y, Z...>                        structureChain;
     VULKAN_HPP_NAMESPACE::PhysicalDeviceProperties2 & properties =
       structureChain.template get<VULKAN_HPP_NAMESPACE::PhysicalDeviceProperties2>();
@@ -9666,6 +10285,7 @@
                                              VULKAN_HPP_NAMESPACE::FormatProperties2 * pFormatProperties,
                                              Dispatch const &                          d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkGetPhysicalDeviceFormatProperties2KHR(
       m_physicalDevice, static_cast<VkFormat>( format ), reinterpret_cast<VkFormatProperties2 *>( pFormatProperties ) );
   }
@@ -9676,6 +10296,7 @@
                                          PhysicalDevice::getFormatProperties2KHR( VULKAN_HPP_NAMESPACE::Format format,
                                              Dispatch const &             d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     VULKAN_HPP_NAMESPACE::FormatProperties2 formatProperties;
     d.vkGetPhysicalDeviceFormatProperties2KHR(
       m_physicalDevice, static_cast<VkFormat>( format ), reinterpret_cast<VkFormatProperties2 *>( &formatProperties ) );
@@ -9687,6 +10308,7 @@
                                          PhysicalDevice::getFormatProperties2KHR( VULKAN_HPP_NAMESPACE::Format format,
                                              Dispatch const &             d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     StructureChain<X, Y, Z...>                structureChain;
     VULKAN_HPP_NAMESPACE::FormatProperties2 & formatProperties =
       structureChain.template get<VULKAN_HPP_NAMESPACE::FormatProperties2>();
@@ -9702,6 +10324,7 @@
     VULKAN_HPP_NAMESPACE::ImageFormatProperties2 *               pImageFormatProperties,
     Dispatch const &                                             d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     return static_cast<Result>( d.vkGetPhysicalDeviceImageFormatProperties2KHR(
       m_physicalDevice,
       reinterpret_cast<const VkPhysicalDeviceImageFormatInfo2 *>( pImageFormatInfo ),
@@ -9715,6 +10338,7 @@
     PhysicalDevice::getImageFormatProperties2KHR( const PhysicalDeviceImageFormatInfo2 & imageFormatInfo,
                                                   Dispatch const &                       d ) const
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     VULKAN_HPP_NAMESPACE::ImageFormatProperties2 imageFormatProperties;
     Result result = static_cast<Result>( d.vkGetPhysicalDeviceImageFormatProperties2KHR(
       m_physicalDevice,
@@ -9729,6 +10353,7 @@
                                           PhysicalDevice::getImageFormatProperties2KHR( const PhysicalDeviceImageFormatInfo2 & imageFormatInfo,
                                                   Dispatch const &                       d ) const
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     StructureChain<X, Y, Z...>                     structureChain;
     VULKAN_HPP_NAMESPACE::ImageFormatProperties2 & imageFormatProperties =
       structureChain.template get<VULKAN_HPP_NAMESPACE::ImageFormatProperties2>();
@@ -9747,6 +10372,7 @@
                                                   VULKAN_HPP_NAMESPACE::QueueFamilyProperties2 * pQueueFamilyProperties,
                                                   Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkGetPhysicalDeviceQueueFamilyProperties2KHR(
       m_physicalDevice,
       pQueueFamilyPropertyCount,
@@ -9758,6 +10384,7 @@
   VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE std::vector<QueueFamilyProperties2, QueueFamilyProperties2Allocator>
                                          PhysicalDevice::getQueueFamilyProperties2KHR( Dispatch const & d ) const
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     std::vector<QueueFamilyProperties2, QueueFamilyProperties2Allocator> queueFamilyProperties;
     uint32_t                                                             queueFamilyPropertyCount;
     d.vkGetPhysicalDeviceQueueFamilyProperties2KHR( m_physicalDevice, &queueFamilyPropertyCount, nullptr );
@@ -9778,6 +10405,7 @@
                                          PhysicalDevice::getQueueFamilyProperties2KHR( QueueFamilyProperties2Allocator & queueFamilyProperties2Allocator,
                                                   Dispatch const &                  d ) const
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     std::vector<QueueFamilyProperties2, QueueFamilyProperties2Allocator> queueFamilyProperties(
       queueFamilyProperties2Allocator );
     uint32_t queueFamilyPropertyCount;
@@ -9795,6 +10423,7 @@
   VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE std::vector<StructureChain, StructureChainAllocator>
                                          PhysicalDevice::getQueueFamilyProperties2KHR( Dispatch const & d ) const
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     uint32_t queueFamilyPropertyCount;
     d.vkGetPhysicalDeviceQueueFamilyProperties2KHR( m_physicalDevice, &queueFamilyPropertyCount, nullptr );
     std::vector<StructureChain, StructureChainAllocator>      returnVector( queueFamilyPropertyCount );
@@ -9825,6 +10454,7 @@
                                          PhysicalDevice::getQueueFamilyProperties2KHR( StructureChainAllocator & structureChainAllocator,
                                                   Dispatch const &          d ) const
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     uint32_t queueFamilyPropertyCount;
     d.vkGetPhysicalDeviceQueueFamilyProperties2KHR( m_physicalDevice, &queueFamilyPropertyCount, nullptr );
     std::vector<StructureChain, StructureChainAllocator>      returnVector( queueFamilyPropertyCount,
@@ -9853,6 +10483,7 @@
     PhysicalDevice::getMemoryProperties2KHR( VULKAN_HPP_NAMESPACE::PhysicalDeviceMemoryProperties2 * pMemoryProperties,
                                              Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkGetPhysicalDeviceMemoryProperties2KHR(
       m_physicalDevice, reinterpret_cast<VkPhysicalDeviceMemoryProperties2 *>( pMemoryProperties ) );
   }
@@ -9862,6 +10493,7 @@
   VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::PhysicalDeviceMemoryProperties2
                                          PhysicalDevice::getMemoryProperties2KHR( Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     VULKAN_HPP_NAMESPACE::PhysicalDeviceMemoryProperties2 memoryProperties;
     d.vkGetPhysicalDeviceMemoryProperties2KHR(
       m_physicalDevice, reinterpret_cast<VkPhysicalDeviceMemoryProperties2 *>( &memoryProperties ) );
@@ -9872,6 +10504,7 @@
   VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE StructureChain<X, Y, Z...>
                                          PhysicalDevice::getMemoryProperties2KHR( Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     StructureChain<X, Y, Z...>                              structureChain;
     VULKAN_HPP_NAMESPACE::PhysicalDeviceMemoryProperties2 & memoryProperties =
       structureChain.template get<VULKAN_HPP_NAMESPACE::PhysicalDeviceMemoryProperties2>();
@@ -9888,6 +10521,7 @@
     VULKAN_HPP_NAMESPACE::SparseImageFormatProperties2 *               pProperties,
     Dispatch const &                                                   d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkGetPhysicalDeviceSparseImageFormatProperties2KHR(
       m_physicalDevice,
       reinterpret_cast<const VkPhysicalDeviceSparseImageFormatInfo2 *>( pFormatInfo ),
@@ -9902,6 +10536,7 @@
                       PhysicalDevice::getSparseImageFormatProperties2KHR( const PhysicalDeviceSparseImageFormatInfo2 & formatInfo,
                                                         Dispatch const &                             d ) const
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     std::vector<SparseImageFormatProperties2, SparseImageFormatProperties2Allocator> properties;
     uint32_t                                                                         propertyCount;
     d.vkGetPhysicalDeviceSparseImageFormatProperties2KHR(
@@ -9931,6 +10566,7 @@
       SparseImageFormatProperties2Allocator &      sparseImageFormatProperties2Allocator,
       Dispatch const &                             d ) const
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     std::vector<SparseImageFormatProperties2, SparseImageFormatProperties2Allocator> properties(
       sparseImageFormatProperties2Allocator );
     uint32_t propertyCount;
@@ -9960,6 +10596,7 @@
                                            VULKAN_HPP_NAMESPACE::PeerMemoryFeatureFlags * pPeerMemoryFeatures,
                                            Dispatch const &                               d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkGetDeviceGroupPeerMemoryFeaturesKHR( m_device,
                                              heapIndex,
                                              localDeviceIndex,
@@ -9975,6 +10612,7 @@
                                            uint32_t         remoteDeviceIndex,
                                            Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     VULKAN_HPP_NAMESPACE::PeerMemoryFeatureFlags peerMemoryFeatures;
     d.vkGetDeviceGroupPeerMemoryFeaturesKHR( m_device,
                                              heapIndex,
@@ -9989,6 +10627,7 @@
   VULKAN_HPP_INLINE void CommandBuffer::setDeviceMaskKHR( uint32_t         deviceMask,
                                                           Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkCmdSetDeviceMaskKHR( m_commandBuffer, deviceMask );
   }
 
@@ -10001,6 +10640,7 @@
                                                          uint32_t         groupCountZ,
                                                          Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkCmdDispatchBaseKHR(
       m_commandBuffer, baseGroupX, baseGroupY, baseGroupZ, groupCountX, groupCountY, groupCountZ );
   }
@@ -10015,6 +10655,7 @@
                                  VULKAN_HPP_NAMESPACE::SurfaceKHR *                  pSurface,
                                  Dispatch const &                                    d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     return static_cast<Result>( d.vkCreateViSurfaceNN( m_instance,
                                                        reinterpret_cast<const VkViSurfaceCreateInfoNN *>( pCreateInfo ),
                                                        reinterpret_cast<const VkAllocationCallbacks *>( pAllocator ),
@@ -10029,6 +10670,7 @@
                                  Optional<const AllocationCallbacks> allocator,
                                  Dispatch const &                    d ) const
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     VULKAN_HPP_NAMESPACE::SurfaceKHR surface;
     Result                           result = static_cast<Result>(
       d.vkCreateViSurfaceNN( m_instance,
@@ -10047,6 +10689,7 @@
                                        Optional<const AllocationCallbacks> allocator,
                                        Dispatch const &                    d ) const
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     VULKAN_HPP_NAMESPACE::SurfaceKHR surface;
     Result                           result = static_cast<Result>(
       d.vkCreateViSurfaceNN( m_instance,
@@ -10069,6 +10712,7 @@
                                                      VULKAN_HPP_NAMESPACE::CommandPoolTrimFlags flags,
                                                      Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkTrimCommandPoolKHR(
       m_device, static_cast<VkCommandPool>( commandPool ), static_cast<VkCommandPoolTrimFlags>( flags ) );
   }
@@ -10081,6 +10725,7 @@
     VULKAN_HPP_NAMESPACE::PhysicalDeviceGroupProperties * pPhysicalDeviceGroupProperties,
     Dispatch const &                                      d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     return static_cast<Result>( d.vkEnumeratePhysicalDeviceGroupsKHR(
       m_instance,
       pPhysicalDeviceGroupCount,
@@ -10093,6 +10738,7 @@
     typename ResultValueType<std::vector<PhysicalDeviceGroupProperties, PhysicalDeviceGroupPropertiesAllocator>>::type
     Instance::enumeratePhysicalDeviceGroupsKHR( Dispatch const & d ) const
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     std::vector<PhysicalDeviceGroupProperties, PhysicalDeviceGroupPropertiesAllocator> physicalDeviceGroupProperties;
     uint32_t                                                                           physicalDeviceGroupCount;
     Result                                                                             result;
@@ -10129,6 +10775,7 @@
     Instance::enumeratePhysicalDeviceGroupsKHR(
       PhysicalDeviceGroupPropertiesAllocator & physicalDeviceGroupPropertiesAllocator, Dispatch const & d ) const
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     std::vector<PhysicalDeviceGroupProperties, PhysicalDeviceGroupPropertiesAllocator> physicalDeviceGroupProperties(
       physicalDeviceGroupPropertiesAllocator );
     uint32_t physicalDeviceGroupCount;
@@ -10165,6 +10812,7 @@
     VULKAN_HPP_NAMESPACE::ExternalBufferProperties *               pExternalBufferProperties,
     Dispatch const &                                               d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkGetPhysicalDeviceExternalBufferPropertiesKHR(
       m_physicalDevice,
       reinterpret_cast<const VkPhysicalDeviceExternalBufferInfo *>( pExternalBufferInfo ),
@@ -10177,6 +10825,7 @@
                                          PhysicalDevice::getExternalBufferPropertiesKHR( const PhysicalDeviceExternalBufferInfo & externalBufferInfo,
                                                     Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     VULKAN_HPP_NAMESPACE::ExternalBufferProperties externalBufferProperties;
     d.vkGetPhysicalDeviceExternalBufferPropertiesKHR(
       m_physicalDevice,
@@ -10195,6 +10844,7 @@
                                      HANDLE *                                                  pHandle,
                                      Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     return static_cast<Result>( d.vkGetMemoryWin32HandleKHR(
       m_device, reinterpret_cast<const VkMemoryGetWin32HandleInfoKHR *>( pGetWin32HandleInfo ), pHandle ) );
   }
@@ -10204,6 +10854,7 @@
   VULKAN_HPP_NODISCARD_WHEN_NO_EXCEPTIONS VULKAN_HPP_INLINE typename ResultValueType<HANDLE>::type
                                           Device::getMemoryWin32HandleKHR( const MemoryGetWin32HandleInfoKHR & getWin32HandleInfo, Dispatch const & d ) const
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     HANDLE handle;
     Result result = static_cast<Result>( d.vkGetMemoryWin32HandleKHR(
       m_device, reinterpret_cast<const VkMemoryGetWin32HandleInfoKHR *>( &getWin32HandleInfo ), &handle ) );
@@ -10218,6 +10869,7 @@
     VULKAN_HPP_NAMESPACE::MemoryWin32HandlePropertiesKHR * pMemoryWin32HandleProperties,
     Dispatch const &                                       d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     return static_cast<Result>( d.vkGetMemoryWin32HandlePropertiesKHR(
       m_device,
       static_cast<VkExternalMemoryHandleTypeFlagBits>( handleType ),
@@ -10233,6 +10885,7 @@
                                                HANDLE                                                 handle,
                                                Dispatch const &                                       d ) const
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     VULKAN_HPP_NAMESPACE::MemoryWin32HandlePropertiesKHR memoryWin32HandleProperties;
     Result result = static_cast<Result>( d.vkGetMemoryWin32HandlePropertiesKHR(
       m_device,
@@ -10253,6 +10906,7 @@
                             int *                                            pFd,
                             Dispatch const &                                 d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     return static_cast<Result>(
       d.vkGetMemoryFdKHR( m_device, reinterpret_cast<const VkMemoryGetFdInfoKHR *>( pGetFdInfo ), pFd ) );
   }
@@ -10262,6 +10916,7 @@
   VULKAN_HPP_NODISCARD_WHEN_NO_EXCEPTIONS VULKAN_HPP_INLINE typename ResultValueType<int>::type
                                           Device::getMemoryFdKHR( const MemoryGetFdInfoKHR & getFdInfo, Dispatch const & d ) const
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     int    fd;
     Result result = static_cast<Result>(
       d.vkGetMemoryFdKHR( m_device, reinterpret_cast<const VkMemoryGetFdInfoKHR *>( &getFdInfo ), &fd ) );
@@ -10276,6 +10931,7 @@
                                       VULKAN_HPP_NAMESPACE::MemoryFdPropertiesKHR *          pMemoryFdProperties,
                                       Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     return static_cast<Result>(
       d.vkGetMemoryFdPropertiesKHR( m_device,
                                     static_cast<VkExternalMemoryHandleTypeFlagBits>( handleType ),
@@ -10291,6 +10947,7 @@
                                       int                                                    fd,
                                       Dispatch const &                                       d ) const
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     VULKAN_HPP_NAMESPACE::MemoryFdPropertiesKHR memoryFdProperties;
     Result                                      result = static_cast<Result>(
       d.vkGetMemoryFdPropertiesKHR( m_device,
@@ -10310,6 +10967,7 @@
     VULKAN_HPP_NAMESPACE::ExternalSemaphoreProperties *               pExternalSemaphoreProperties,
     Dispatch const &                                                  d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkGetPhysicalDeviceExternalSemaphorePropertiesKHR(
       m_physicalDevice,
       reinterpret_cast<const VkPhysicalDeviceExternalSemaphoreInfo *>( pExternalSemaphoreInfo ),
@@ -10322,6 +10980,7 @@
                                          PhysicalDevice::getExternalSemaphorePropertiesKHR(
       const PhysicalDeviceExternalSemaphoreInfo & externalSemaphoreInfo, Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     VULKAN_HPP_NAMESPACE::ExternalSemaphoreProperties externalSemaphoreProperties;
     d.vkGetPhysicalDeviceExternalSemaphorePropertiesKHR(
       m_physicalDevice,
@@ -10339,6 +10998,7 @@
     const VULKAN_HPP_NAMESPACE::ImportSemaphoreWin32HandleInfoKHR * pImportSemaphoreWin32HandleInfo,
     Dispatch const &                                                d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     return static_cast<Result>( d.vkImportSemaphoreWin32HandleKHR(
       m_device, reinterpret_cast<const VkImportSemaphoreWin32HandleInfoKHR *>( pImportSemaphoreWin32HandleInfo ) ) );
   }
@@ -10349,6 +11009,7 @@
                                           Device::importSemaphoreWin32HandleKHR( const ImportSemaphoreWin32HandleInfoKHR & importSemaphoreWin32HandleInfo,
                                            Dispatch const &                          d ) const
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     Result result = static_cast<Result>( d.vkImportSemaphoreWin32HandleKHR(
       m_device, reinterpret_cast<const VkImportSemaphoreWin32HandleInfoKHR *>( &importSemaphoreWin32HandleInfo ) ) );
     return createResultValue( result, VULKAN_HPP_NAMESPACE_STRING "::Device::importSemaphoreWin32HandleKHR" );
@@ -10361,6 +11022,7 @@
     HANDLE *                                                     pHandle,
     Dispatch const &                                             d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     return static_cast<Result>( d.vkGetSemaphoreWin32HandleKHR(
       m_device, reinterpret_cast<const VkSemaphoreGetWin32HandleInfoKHR *>( pGetWin32HandleInfo ), pHandle ) );
   }
@@ -10371,6 +11033,7 @@
                                           Device::getSemaphoreWin32HandleKHR( const SemaphoreGetWin32HandleInfoKHR & getWin32HandleInfo,
                                         Dispatch const &                       d ) const
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     HANDLE handle;
     Result result = static_cast<Result>( d.vkGetSemaphoreWin32HandleKHR(
       m_device, reinterpret_cast<const VkSemaphoreGetWin32HandleInfoKHR *>( &getWin32HandleInfo ), &handle ) );
@@ -10386,6 +11049,7 @@
                                          Device::importSemaphoreFdKHR( const VULKAN_HPP_NAMESPACE::ImportSemaphoreFdInfoKHR * pImportSemaphoreFdInfo,
                                   Dispatch const &                                       d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     return static_cast<Result>( d.vkImportSemaphoreFdKHR(
       m_device, reinterpret_cast<const VkImportSemaphoreFdInfoKHR *>( pImportSemaphoreFdInfo ) ) );
   }
@@ -10395,6 +11059,7 @@
   VULKAN_HPP_NODISCARD_WHEN_NO_EXCEPTIONS VULKAN_HPP_INLINE typename ResultValueType<void>::type
                                           Device::importSemaphoreFdKHR( const ImportSemaphoreFdInfoKHR & importSemaphoreFdInfo, Dispatch const & d ) const
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     Result result = static_cast<Result>( d.vkImportSemaphoreFdKHR(
       m_device, reinterpret_cast<const VkImportSemaphoreFdInfoKHR *>( &importSemaphoreFdInfo ) ) );
     return createResultValue( result, VULKAN_HPP_NAMESPACE_STRING "::Device::importSemaphoreFdKHR" );
@@ -10407,6 +11072,7 @@
                                int *                                               pFd,
                                Dispatch const &                                    d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     return static_cast<Result>(
       d.vkGetSemaphoreFdKHR( m_device, reinterpret_cast<const VkSemaphoreGetFdInfoKHR *>( pGetFdInfo ), pFd ) );
   }
@@ -10416,6 +11082,7 @@
   VULKAN_HPP_NODISCARD_WHEN_NO_EXCEPTIONS VULKAN_HPP_INLINE typename ResultValueType<int>::type
                                           Device::getSemaphoreFdKHR( const SemaphoreGetFdInfoKHR & getFdInfo, Dispatch const & d ) const
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     int    fd;
     Result result = static_cast<Result>(
       d.vkGetSemaphoreFdKHR( m_device, reinterpret_cast<const VkSemaphoreGetFdInfoKHR *>( &getFdInfo ), &fd ) );
@@ -10434,6 +11101,7 @@
                                          const VULKAN_HPP_NAMESPACE::WriteDescriptorSet * pDescriptorWrites,
                                          Dispatch const &                                 d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkCmdPushDescriptorSetKHR( m_commandBuffer,
                                  static_cast<VkPipelineBindPoint>( pipelineBindPoint ),
                                  static_cast<VkPipelineLayout>( layout ),
@@ -10451,6 +11119,7 @@
     ArrayProxy<const VULKAN_HPP_NAMESPACE::WriteDescriptorSet> const & descriptorWrites,
     Dispatch const &                                                   d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkCmdPushDescriptorSetKHR( m_commandBuffer,
                                  static_cast<VkPipelineBindPoint>( pipelineBindPoint ),
                                  static_cast<VkPipelineLayout>( layout ),
@@ -10468,6 +11137,7 @@
     const void *                                   pData,
     Dispatch const &                               d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkCmdPushDescriptorSetWithTemplateKHR( m_commandBuffer,
                                              static_cast<VkDescriptorUpdateTemplate>( descriptorUpdateTemplate ),
                                              static_cast<VkPipelineLayout>( layout ),
@@ -10482,6 +11152,7 @@
     const VULKAN_HPP_NAMESPACE::ConditionalRenderingBeginInfoEXT * pConditionalRenderingBegin,
     Dispatch const &                                               d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkCmdBeginConditionalRenderingEXT(
       m_commandBuffer, reinterpret_cast<const VkConditionalRenderingBeginInfoEXT *>( pConditionalRenderingBegin ) );
   }
@@ -10492,6 +11163,7 @@
     CommandBuffer::beginConditionalRenderingEXT( const ConditionalRenderingBeginInfoEXT & conditionalRenderingBegin,
                                                  Dispatch const &                         d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkCmdBeginConditionalRenderingEXT(
       m_commandBuffer, reinterpret_cast<const VkConditionalRenderingBeginInfoEXT *>( &conditionalRenderingBegin ) );
   }
@@ -10500,6 +11172,7 @@
   template <typename Dispatch>
   VULKAN_HPP_INLINE void CommandBuffer::endConditionalRenderingEXT( Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkCmdEndConditionalRenderingEXT( m_commandBuffer );
   }
 
@@ -10512,6 +11185,7 @@
     VULKAN_HPP_NAMESPACE::DescriptorUpdateTemplate *                 pDescriptorUpdateTemplate,
     Dispatch const &                                                 d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     return static_cast<Result>( d.vkCreateDescriptorUpdateTemplateKHR(
       m_device,
       reinterpret_cast<const VkDescriptorUpdateTemplateCreateInfo *>( pCreateInfo ),
@@ -10527,6 +11201,7 @@
                                                Optional<const AllocationCallbacks>        allocator,
                                                Dispatch const &                           d ) const
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     VULKAN_HPP_NAMESPACE::DescriptorUpdateTemplate descriptorUpdateTemplate;
     Result                                         result = static_cast<Result>( d.vkCreateDescriptorUpdateTemplateKHR(
       m_device,
@@ -10546,6 +11221,7 @@
                                                      Optional<const AllocationCallbacks>        allocator,
                                                      Dispatch const &                           d ) const
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     VULKAN_HPP_NAMESPACE::DescriptorUpdateTemplate descriptorUpdateTemplate;
     Result                                         result = static_cast<Result>( d.vkCreateDescriptorUpdateTemplateKHR(
       m_device,
@@ -10569,6 +11245,7 @@
                                                 const VULKAN_HPP_NAMESPACE::AllocationCallbacks * pAllocator,
                                                 Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkDestroyDescriptorUpdateTemplateKHR( m_device,
                                             static_cast<VkDescriptorUpdateTemplate>( descriptorUpdateTemplate ),
                                             reinterpret_cast<const VkAllocationCallbacks *>( pAllocator ) );
@@ -10581,6 +11258,7 @@
                                                 Optional<const AllocationCallbacks>            allocator,
                                                 Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkDestroyDescriptorUpdateTemplateKHR(
       m_device,
       static_cast<VkDescriptorUpdateTemplate>( descriptorUpdateTemplate ),
@@ -10596,6 +11274,7 @@
                                                 const void *                                   pData,
                                                 Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkUpdateDescriptorSetWithTemplateKHR( m_device,
                                             static_cast<VkDescriptorSet>( descriptorSet ),
                                             static_cast<VkDescriptorUpdateTemplate>( descriptorUpdateTemplate ),
@@ -10611,6 +11290,7 @@
                                           const VULKAN_HPP_NAMESPACE::ViewportWScalingNV * pViewportWScalings,
                                           Dispatch const &                                 d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkCmdSetViewportWScalingNV( m_commandBuffer,
                                   firstViewport,
                                   viewportCount,
@@ -10624,6 +11304,7 @@
     ArrayProxy<const VULKAN_HPP_NAMESPACE::ViewportWScalingNV> const & viewportWScalings,
     Dispatch const &                                                   d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkCmdSetViewportWScalingNV( m_commandBuffer,
                                   firstViewport,
                                   viewportWScalings.size(),
@@ -10638,6 +11319,7 @@
   VULKAN_HPP_INLINE Result PhysicalDevice::releaseDisplayEXT( VULKAN_HPP_NAMESPACE::DisplayKHR display,
                                                               Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     return static_cast<Result>( d.vkReleaseDisplayEXT( m_physicalDevice, static_cast<VkDisplayKHR>( display ) ) );
   }
 #else
@@ -10645,6 +11327,7 @@
   VULKAN_HPP_INLINE typename ResultValueType<void>::type
     PhysicalDevice::releaseDisplayEXT( VULKAN_HPP_NAMESPACE::DisplayKHR display, Dispatch const & d ) const
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     Result result =
       static_cast<Result>( d.vkReleaseDisplayEXT( m_physicalDevice, static_cast<VkDisplayKHR>( display ) ) );
     return createResultValue( result, VULKAN_HPP_NAMESPACE_STRING "::PhysicalDevice::releaseDisplayEXT" );
@@ -10658,6 +11341,7 @@
   VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE Result PhysicalDevice::acquireXlibDisplayEXT(
     Display * dpy, VULKAN_HPP_NAMESPACE::DisplayKHR display, Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     return static_cast<Result>(
       d.vkAcquireXlibDisplayEXT( m_physicalDevice, dpy, static_cast<VkDisplayKHR>( display ) ) );
   }
@@ -10669,6 +11353,7 @@
                                            VULKAN_HPP_NAMESPACE::DisplayKHR display,
                                            Dispatch const &                 d ) const
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     Result result =
       static_cast<Result>( d.vkAcquireXlibDisplayEXT( m_physicalDevice, &dpy, static_cast<VkDisplayKHR>( display ) ) );
     return createResultValue( result, VULKAN_HPP_NAMESPACE_STRING "::PhysicalDevice::acquireXlibDisplayEXT" );
@@ -10682,6 +11367,7 @@
                                               VULKAN_HPP_NAMESPACE::DisplayKHR * pDisplay,
                                               Dispatch const &                   d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     return static_cast<Result>(
       d.vkGetRandROutputDisplayEXT( m_physicalDevice, dpy, rrOutput, reinterpret_cast<VkDisplayKHR *>( pDisplay ) ) );
   }
@@ -10691,6 +11377,7 @@
   VULKAN_HPP_INLINE typename ResultValueType<VULKAN_HPP_NAMESPACE::DisplayKHR>::type
     PhysicalDevice::getRandROutputDisplayEXT( Display & dpy, RROutput rrOutput, Dispatch const & d ) const
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     VULKAN_HPP_NAMESPACE::DisplayKHR display;
     Result                           result = static_cast<Result>(
       d.vkGetRandROutputDisplayEXT( m_physicalDevice, &dpy, rrOutput, reinterpret_cast<VkDisplayKHR *>( &display ) ) );
@@ -10703,6 +11390,7 @@
   VULKAN_HPP_INLINE typename ResultValueType<UniqueHandle<VULKAN_HPP_NAMESPACE::DisplayKHR, Dispatch>>::type
     PhysicalDevice::getRandROutputDisplayEXTUnique( Display & dpy, RROutput rrOutput, Dispatch const & d ) const
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     VULKAN_HPP_NAMESPACE::DisplayKHR display;
     Result                           result = static_cast<Result>(
       d.vkGetRandROutputDisplayEXT( m_physicalDevice, &dpy, rrOutput, reinterpret_cast<VkDisplayKHR *>( &display ) ) );
@@ -10722,6 +11410,7 @@
                                                 VULKAN_HPP_NAMESPACE::SurfaceCapabilities2EXT * pSurfaceCapabilities,
                                                 Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     return static_cast<Result>( d.vkGetPhysicalDeviceSurfaceCapabilities2EXT(
       m_physicalDevice,
       static_cast<VkSurfaceKHR>( surface ),
@@ -10734,6 +11423,7 @@
     typename ResultValueType<VULKAN_HPP_NAMESPACE::SurfaceCapabilities2EXT>::type
     PhysicalDevice::getSurfaceCapabilities2EXT( VULKAN_HPP_NAMESPACE::SurfaceKHR surface, Dispatch const & d ) const
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     VULKAN_HPP_NAMESPACE::SurfaceCapabilities2EXT surfaceCapabilities;
     Result result = static_cast<Result>( d.vkGetPhysicalDeviceSurfaceCapabilities2EXT(
       m_physicalDevice,
@@ -10752,6 +11442,7 @@
                                     const VULKAN_HPP_NAMESPACE::DisplayPowerInfoEXT * pDisplayPowerInfo,
                                     Dispatch const &                                  d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     return static_cast<Result>(
       d.vkDisplayPowerControlEXT( m_device,
                                   static_cast<VkDisplayKHR>( display ),
@@ -10763,6 +11454,7 @@
   VULKAN_HPP_INLINE typename ResultValueType<void>::type Device::displayPowerControlEXT(
     VULKAN_HPP_NAMESPACE::DisplayKHR display, const DisplayPowerInfoEXT & displayPowerInfo, Dispatch const & d ) const
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     Result result = static_cast<Result>(
       d.vkDisplayPowerControlEXT( m_device,
                                   static_cast<VkDisplayKHR>( display ),
@@ -10778,6 +11470,7 @@
                               VULKAN_HPP_NAMESPACE::Fence *                     pFence,
                               Dispatch const &                                  d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     return static_cast<Result>(
       d.vkRegisterDeviceEventEXT( m_device,
                                   reinterpret_cast<const VkDeviceEventInfoEXT *>( pDeviceEventInfo ),
@@ -10792,6 +11485,7 @@
                               Optional<const AllocationCallbacks> allocator,
                               Dispatch const &                    d ) const
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     VULKAN_HPP_NAMESPACE::Fence fence;
     Result                      result = static_cast<Result>(
       d.vkRegisterDeviceEventEXT( m_device,
@@ -10809,6 +11503,7 @@
                                     Optional<const AllocationCallbacks> allocator,
                                     Dispatch const &                    d ) const
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     VULKAN_HPP_NAMESPACE::Fence fence;
     Result                      result = static_cast<Result>(
       d.vkRegisterDeviceEventEXT( m_device,
@@ -10831,6 +11526,7 @@
                                      VULKAN_HPP_NAMESPACE::Fence *                     pFence,
                                      Dispatch const &                                  d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     return static_cast<Result>(
       d.vkRegisterDisplayEventEXT( m_device,
                                    static_cast<VkDisplayKHR>( display ),
@@ -10847,6 +11543,7 @@
                                      Optional<const AllocationCallbacks> allocator,
                                      Dispatch const &                    d ) const
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     VULKAN_HPP_NAMESPACE::Fence fence;
     Result                      result = static_cast<Result>(
       d.vkRegisterDisplayEventEXT( m_device,
@@ -10866,6 +11563,7 @@
                                            Optional<const AllocationCallbacks> allocator,
                                            Dispatch const &                    d ) const
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     VULKAN_HPP_NAMESPACE::Fence fence;
     Result                      result = static_cast<Result>(
       d.vkRegisterDisplayEventEXT( m_device,
@@ -10888,6 +11586,7 @@
                                     uint64_t *                                      pCounterValue,
                                     Dispatch const &                                d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     return static_cast<Result>( d.vkGetSwapchainCounterEXT( m_device,
                                                             static_cast<VkSwapchainKHR>( swapchain ),
                                                             static_cast<VkSurfaceCounterFlagBitsEXT>( counter ),
@@ -10901,6 +11600,7 @@
                                     VULKAN_HPP_NAMESPACE::SurfaceCounterFlagBitsEXT counter,
                                     Dispatch const &                                d ) const
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     uint64_t counterValue;
     Result   result =
       static_cast<Result>( d.vkGetSwapchainCounterEXT( m_device,
@@ -10919,6 +11619,7 @@
                                            VULKAN_HPP_NAMESPACE::RefreshCycleDurationGOOGLE * pDisplayTimingProperties,
                                            Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     return static_cast<Result>( d.vkGetRefreshCycleDurationGOOGLE(
       m_device,
       static_cast<VkSwapchainKHR>( swapchain ),
@@ -10931,6 +11632,7 @@
     typename ResultValueType<VULKAN_HPP_NAMESPACE::RefreshCycleDurationGOOGLE>::type
     Device::getRefreshCycleDurationGOOGLE( VULKAN_HPP_NAMESPACE::SwapchainKHR swapchain, Dispatch const & d ) const
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     VULKAN_HPP_NAMESPACE::RefreshCycleDurationGOOGLE displayTimingProperties;
     Result                                           result = static_cast<Result>( d.vkGetRefreshCycleDurationGOOGLE(
       m_device,
@@ -10948,6 +11650,7 @@
                                              VULKAN_HPP_NAMESPACE::PastPresentationTimingGOOGLE * pPresentationTimings,
                                              Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     return static_cast<Result>( d.vkGetPastPresentationTimingGOOGLE(
       m_device,
       static_cast<VkSwapchainKHR>( swapchain ),
@@ -10961,6 +11664,7 @@
     typename ResultValueType<std::vector<PastPresentationTimingGOOGLE, PastPresentationTimingGOOGLEAllocator>>::type
     Device::getPastPresentationTimingGOOGLE( VULKAN_HPP_NAMESPACE::SwapchainKHR swapchain, Dispatch const & d ) const
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     std::vector<PastPresentationTimingGOOGLE, PastPresentationTimingGOOGLEAllocator> presentationTimings;
     uint32_t                                                                         presentationTimingCount;
     Result                                                                           result;
@@ -10999,6 +11703,7 @@
       PastPresentationTimingGOOGLEAllocator & pastPresentationTimingGOOGLEAllocator,
       Dispatch const &                        d ) const
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     std::vector<PastPresentationTimingGOOGLE, PastPresentationTimingGOOGLEAllocator> presentationTimings(
       pastPresentationTimingGOOGLEAllocator );
     uint32_t presentationTimingCount;
@@ -11035,6 +11740,7 @@
                                                                 const VULKAN_HPP_NAMESPACE::Rect2D * pDiscardRectangles,
                                                                 Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkCmdSetDiscardRectangleEXT( m_commandBuffer,
                                    firstDiscardRectangle,
                                    discardRectangleCount,
@@ -11048,6 +11754,7 @@
                                            ArrayProxy<const VULKAN_HPP_NAMESPACE::Rect2D> const & discardRectangles,
                                            Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkCmdSetDiscardRectangleEXT( m_commandBuffer,
                                    firstDiscardRectangle,
                                    discardRectangles.size(),
@@ -11063,6 +11770,7 @@
                                                     const VULKAN_HPP_NAMESPACE::HdrMetadataEXT * pMetadata,
                                                     Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkSetHdrMetadataEXT( m_device,
                            swapchainCount,
                            reinterpret_cast<const VkSwapchainKHR *>( pSwapchains ),
@@ -11076,6 +11784,7 @@
                                ArrayProxy<const VULKAN_HPP_NAMESPACE::HdrMetadataEXT> const & metadata,
                                Dispatch const & d ) const VULKAN_HPP_NOEXCEPT_WHEN_NO_EXCEPTIONS
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
 #  ifdef VULKAN_HPP_NO_EXCEPTIONS
     VULKAN_HPP_ASSERT( swapchains.size() == metadata.size() );
 #  else
@@ -11102,6 +11811,7 @@
                                   VULKAN_HPP_NAMESPACE::RenderPass *                  pRenderPass,
                                   Dispatch const &                                    d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     return static_cast<Result>(
       d.vkCreateRenderPass2KHR( m_device,
                                 reinterpret_cast<const VkRenderPassCreateInfo2 *>( pCreateInfo ),
@@ -11117,6 +11827,7 @@
                                   Optional<const AllocationCallbacks> allocator,
                                   Dispatch const &                    d ) const
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     VULKAN_HPP_NAMESPACE::RenderPass renderPass;
     Result                           result = static_cast<Result>(
       d.vkCreateRenderPass2KHR( m_device,
@@ -11135,6 +11846,7 @@
                                         Optional<const AllocationCallbacks> allocator,
                                         Dispatch const &                    d ) const
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     VULKAN_HPP_NAMESPACE::RenderPass renderPass;
     Result                           result = static_cast<Result>(
       d.vkCreateRenderPass2KHR( m_device,
@@ -11155,6 +11867,7 @@
                                         const VULKAN_HPP_NAMESPACE::SubpassBeginInfo *    pSubpassBeginInfo,
                                         Dispatch const &                                  d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkCmdBeginRenderPass2KHR( m_commandBuffer,
                                 reinterpret_cast<const VkRenderPassBeginInfo *>( pRenderPassBegin ),
                                 reinterpret_cast<const VkSubpassBeginInfo *>( pSubpassBeginInfo ) );
@@ -11166,6 +11879,7 @@
                                                              const SubpassBeginInfo &    subpassBeginInfo,
                                                              Dispatch const &            d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkCmdBeginRenderPass2KHR( m_commandBuffer,
                                 reinterpret_cast<const VkRenderPassBeginInfo *>( &renderPassBegin ),
                                 reinterpret_cast<const VkSubpassBeginInfo *>( &subpassBeginInfo ) );
@@ -11178,6 +11892,7 @@
                                     const VULKAN_HPP_NAMESPACE::SubpassEndInfo *   pSubpassEndInfo,
                                     Dispatch const &                               d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkCmdNextSubpass2KHR( m_commandBuffer,
                             reinterpret_cast<const VkSubpassBeginInfo *>( pSubpassBeginInfo ),
                             reinterpret_cast<const VkSubpassEndInfo *>( pSubpassEndInfo ) );
@@ -11189,6 +11904,7 @@
                                                          const SubpassEndInfo &   subpassEndInfo,
                                                          Dispatch const &         d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkCmdNextSubpass2KHR( m_commandBuffer,
                             reinterpret_cast<const VkSubpassBeginInfo *>( &subpassBeginInfo ),
                             reinterpret_cast<const VkSubpassEndInfo *>( &subpassEndInfo ) );
@@ -11199,6 +11915,7 @@
   VULKAN_HPP_INLINE void CommandBuffer::endRenderPass2KHR( const VULKAN_HPP_NAMESPACE::SubpassEndInfo * pSubpassEndInfo,
                                                            Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkCmdEndRenderPass2KHR( m_commandBuffer, reinterpret_cast<const VkSubpassEndInfo *>( pSubpassEndInfo ) );
   }
 
@@ -11207,6 +11924,7 @@
   VULKAN_HPP_INLINE void CommandBuffer::endRenderPass2KHR( const SubpassEndInfo & subpassEndInfo,
                                                            Dispatch const &       d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkCmdEndRenderPass2KHR( m_commandBuffer, reinterpret_cast<const VkSubpassEndInfo *>( &subpassEndInfo ) );
   }
 #endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/
@@ -11218,6 +11936,7 @@
   VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE Result Device::getSwapchainStatusKHR(
     VULKAN_HPP_NAMESPACE::SwapchainKHR swapchain, Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     return static_cast<Result>( d.vkGetSwapchainStatusKHR( m_device, static_cast<VkSwapchainKHR>( swapchain ) ) );
   }
 #else
@@ -11225,6 +11944,7 @@
   VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE Result
                                          Device::getSwapchainStatusKHR( VULKAN_HPP_NAMESPACE::SwapchainKHR swapchain, Dispatch const & d ) const
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     Result result =
       static_cast<Result>( d.vkGetSwapchainStatusKHR( m_device, static_cast<VkSwapchainKHR>( swapchain ) ) );
     return createResultValue(
@@ -11242,6 +11962,7 @@
     VULKAN_HPP_NAMESPACE::ExternalFenceProperties *               pExternalFenceProperties,
     Dispatch const &                                              d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkGetPhysicalDeviceExternalFencePropertiesKHR(
       m_physicalDevice,
       reinterpret_cast<const VkPhysicalDeviceExternalFenceInfo *>( pExternalFenceInfo ),
@@ -11254,6 +11975,7 @@
                                          PhysicalDevice::getExternalFencePropertiesKHR( const PhysicalDeviceExternalFenceInfo & externalFenceInfo,
                                                    Dispatch const &                        d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     VULKAN_HPP_NAMESPACE::ExternalFenceProperties externalFenceProperties;
     d.vkGetPhysicalDeviceExternalFencePropertiesKHR(
       m_physicalDevice,
@@ -11271,6 +11993,7 @@
     const VULKAN_HPP_NAMESPACE::ImportFenceWin32HandleInfoKHR * pImportFenceWin32HandleInfo,
     Dispatch const &                                            d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     return static_cast<Result>( d.vkImportFenceWin32HandleKHR(
       m_device, reinterpret_cast<const VkImportFenceWin32HandleInfoKHR *>( pImportFenceWin32HandleInfo ) ) );
   }
@@ -11281,6 +12004,7 @@
                                           Device::importFenceWin32HandleKHR( const ImportFenceWin32HandleInfoKHR & importFenceWin32HandleInfo,
                                        Dispatch const &                      d ) const
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     Result result = static_cast<Result>( d.vkImportFenceWin32HandleKHR(
       m_device, reinterpret_cast<const VkImportFenceWin32HandleInfoKHR *>( &importFenceWin32HandleInfo ) ) );
     return createResultValue( result, VULKAN_HPP_NAMESPACE_STRING "::Device::importFenceWin32HandleKHR" );
@@ -11293,6 +12017,7 @@
                                     HANDLE *                                                 pHandle,
                                     Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     return static_cast<Result>( d.vkGetFenceWin32HandleKHR(
       m_device, reinterpret_cast<const VkFenceGetWin32HandleInfoKHR *>( pGetWin32HandleInfo ), pHandle ) );
   }
@@ -11302,6 +12027,7 @@
   VULKAN_HPP_NODISCARD_WHEN_NO_EXCEPTIONS VULKAN_HPP_INLINE typename ResultValueType<HANDLE>::type
                                           Device::getFenceWin32HandleKHR( const FenceGetWin32HandleInfoKHR & getWin32HandleInfo, Dispatch const & d ) const
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     HANDLE handle;
     Result result = static_cast<Result>( d.vkGetFenceWin32HandleKHR(
       m_device, reinterpret_cast<const VkFenceGetWin32HandleInfoKHR *>( &getWin32HandleInfo ), &handle ) );
@@ -11317,6 +12043,7 @@
                                          Device::importFenceFdKHR( const VULKAN_HPP_NAMESPACE::ImportFenceFdInfoKHR * pImportFenceFdInfo,
                               Dispatch const &                                   d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     return static_cast<Result>(
       d.vkImportFenceFdKHR( m_device, reinterpret_cast<const VkImportFenceFdInfoKHR *>( pImportFenceFdInfo ) ) );
   }
@@ -11326,6 +12053,7 @@
   VULKAN_HPP_NODISCARD_WHEN_NO_EXCEPTIONS VULKAN_HPP_INLINE typename ResultValueType<void>::type
                                           Device::importFenceFdKHR( const ImportFenceFdInfoKHR & importFenceFdInfo, Dispatch const & d ) const
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     Result result = static_cast<Result>(
       d.vkImportFenceFdKHR( m_device, reinterpret_cast<const VkImportFenceFdInfoKHR *>( &importFenceFdInfo ) ) );
     return createResultValue( result, VULKAN_HPP_NAMESPACE_STRING "::Device::importFenceFdKHR" );
@@ -11338,6 +12066,7 @@
                            int *                                           pFd,
                            Dispatch const &                                d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     return static_cast<Result>(
       d.vkGetFenceFdKHR( m_device, reinterpret_cast<const VkFenceGetFdInfoKHR *>( pGetFdInfo ), pFd ) );
   }
@@ -11347,6 +12076,7 @@
   VULKAN_HPP_NODISCARD_WHEN_NO_EXCEPTIONS VULKAN_HPP_INLINE typename ResultValueType<int>::type
                                           Device::getFenceFdKHR( const FenceGetFdInfoKHR & getFdInfo, Dispatch const & d ) const
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     int    fd;
     Result result = static_cast<Result>(
       d.vkGetFenceFdKHR( m_device, reinterpret_cast<const VkFenceGetFdInfoKHR *>( &getFdInfo ), &fd ) );
@@ -11364,6 +12094,7 @@
     VULKAN_HPP_NAMESPACE::PerformanceCounterDescriptionKHR * pCounterDescriptions,
     Dispatch const &                                         d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     return static_cast<Result>( d.vkEnumeratePhysicalDeviceQueueFamilyPerformanceQueryCountersKHR(
       m_physicalDevice,
       queueFamilyIndex,
@@ -11382,6 +12113,7 @@
       ArrayProxy<VULKAN_HPP_NAMESPACE::PerformanceCounterKHR> const & counters,
       Dispatch const &                                                d ) const
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     std::vector<PerformanceCounterDescriptionKHR, Allocator> counterDescriptions;
     uint32_t                                                 counterCount;
     Result                                                   result;
@@ -11429,6 +12161,7 @@
       Allocator const &                                               vectorAllocator,
       Dispatch const &                                                d ) const
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     std::vector<PerformanceCounterDescriptionKHR, Allocator> counterDescriptions( vectorAllocator );
     uint32_t                                                 counterCount;
     Result                                                   result;
@@ -11471,6 +12204,7 @@
     PhysicalDevice::enumerateQueueFamilyPerformanceQueryCountersKHR( uint32_t         queueFamilyIndex,
                                                                      Dispatch const & d ) const
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     std::pair<std::vector<PerformanceCounterKHR, PerformanceCounterKHRAllocator>,
               std::vector<PerformanceCounterDescriptionKHR, PerformanceCounterDescriptionKHRAllocator>>
                                                                                                data;
@@ -11522,6 +12256,7 @@
       PerformanceCounterDescriptionKHRAllocator & performanceCounterDescriptionKHRAllocator,
       Dispatch const &                            d ) const
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     std::pair<std::vector<PerformanceCounterKHR, PerformanceCounterKHRAllocator>,
               std::vector<PerformanceCounterDescriptionKHR, PerformanceCounterDescriptionKHRAllocator>>
                                                                                                data( std::piecewise_construct,
@@ -11565,6 +12300,7 @@
     uint32_t *                                                      pNumPasses,
     Dispatch const &                                                d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkGetPhysicalDeviceQueueFamilyPerformanceQueryPassesKHR(
       m_physicalDevice,
       reinterpret_cast<const VkQueryPoolPerformanceCreateInfoKHR *>( pPerformanceQueryCreateInfo ),
@@ -11576,6 +12312,7 @@
   VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE uint32_t PhysicalDevice::getQueueFamilyPerformanceQueryPassesKHR(
     const QueryPoolPerformanceCreateInfoKHR & performanceQueryCreateInfo, Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     uint32_t numPasses;
     d.vkGetPhysicalDeviceQueueFamilyPerformanceQueryPassesKHR(
       m_physicalDevice,
@@ -11589,6 +12326,7 @@
   VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE Result Device::acquireProfilingLockKHR(
     const VULKAN_HPP_NAMESPACE::AcquireProfilingLockInfoKHR * pInfo, Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     return static_cast<Result>(
       d.vkAcquireProfilingLockKHR( m_device, reinterpret_cast<const VkAcquireProfilingLockInfoKHR *>( pInfo ) ) );
   }
@@ -11598,6 +12336,7 @@
   VULKAN_HPP_NODISCARD_WHEN_NO_EXCEPTIONS VULKAN_HPP_INLINE typename ResultValueType<void>::type
                                           Device::acquireProfilingLockKHR( const AcquireProfilingLockInfoKHR & info, Dispatch const & d ) const
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     Result result = static_cast<Result>(
       d.vkAcquireProfilingLockKHR( m_device, reinterpret_cast<const VkAcquireProfilingLockInfoKHR *>( &info ) ) );
     return createResultValue( result, VULKAN_HPP_NAMESPACE_STRING "::Device::acquireProfilingLockKHR" );
@@ -11607,6 +12346,7 @@
   template <typename Dispatch>
   VULKAN_HPP_INLINE void Device::releaseProfilingLockKHR( Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkReleaseProfilingLockKHR( m_device );
   }
 
@@ -11618,6 +12358,7 @@
     VULKAN_HPP_NAMESPACE::SurfaceCapabilities2KHR *             pSurfaceCapabilities,
     Dispatch const &                                            d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     return static_cast<Result>( d.vkGetPhysicalDeviceSurfaceCapabilities2KHR(
       m_physicalDevice,
       reinterpret_cast<const VkPhysicalDeviceSurfaceInfo2KHR *>( pSurfaceInfo ),
@@ -11631,6 +12372,7 @@
     PhysicalDevice::getSurfaceCapabilities2KHR( const PhysicalDeviceSurfaceInfo2KHR & surfaceInfo,
                                                 Dispatch const &                      d ) const
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     VULKAN_HPP_NAMESPACE::SurfaceCapabilities2KHR surfaceCapabilities;
     Result result = static_cast<Result>( d.vkGetPhysicalDeviceSurfaceCapabilities2KHR(
       m_physicalDevice,
@@ -11645,6 +12387,7 @@
                                           PhysicalDevice::getSurfaceCapabilities2KHR( const PhysicalDeviceSurfaceInfo2KHR & surfaceInfo,
                                                 Dispatch const &                      d ) const
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     StructureChain<X, Y, Z...>                      structureChain;
     VULKAN_HPP_NAMESPACE::SurfaceCapabilities2KHR & surfaceCapabilities =
       structureChain.template get<VULKAN_HPP_NAMESPACE::SurfaceCapabilities2KHR>();
@@ -11664,6 +12407,7 @@
                                            VULKAN_HPP_NAMESPACE::SurfaceFormat2KHR * pSurfaceFormats,
                                            Dispatch const &                          d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     return static_cast<Result>( d.vkGetPhysicalDeviceSurfaceFormats2KHR(
       m_physicalDevice,
       reinterpret_cast<const VkPhysicalDeviceSurfaceInfo2KHR *>( pSurfaceInfo ),
@@ -11677,6 +12421,7 @@
     typename ResultValueType<std::vector<SurfaceFormat2KHR, SurfaceFormat2KHRAllocator>>::type
     PhysicalDevice::getSurfaceFormats2KHR( const PhysicalDeviceSurfaceInfo2KHR & surfaceInfo, Dispatch const & d ) const
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     std::vector<SurfaceFormat2KHR, SurfaceFormat2KHRAllocator> surfaceFormats;
     uint32_t                                                   surfaceFormatCount;
     Result                                                     result;
@@ -11716,6 +12461,7 @@
                                            SurfaceFormat2KHRAllocator &          surfaceFormat2KHRAllocator,
                                            Dispatch const &                      d ) const
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     std::vector<SurfaceFormat2KHR, SurfaceFormat2KHRAllocator> surfaceFormats( surfaceFormat2KHRAllocator );
     uint32_t                                                   surfaceFormatCount;
     Result                                                     result;
@@ -11754,6 +12500,7 @@
                                               VULKAN_HPP_NAMESPACE::DisplayProperties2KHR * pProperties,
                                               Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     return static_cast<Result>( d.vkGetPhysicalDeviceDisplayProperties2KHR(
       m_physicalDevice, pPropertyCount, reinterpret_cast<VkDisplayProperties2KHR *>( pProperties ) ) );
   }
@@ -11764,6 +12511,7 @@
     typename ResultValueType<std::vector<DisplayProperties2KHR, DisplayProperties2KHRAllocator>>::type
     PhysicalDevice::getDisplayProperties2KHR( Dispatch const & d ) const
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     std::vector<DisplayProperties2KHR, DisplayProperties2KHRAllocator> properties;
     uint32_t                                                           propertyCount;
     Result                                                             result;
@@ -11796,6 +12544,7 @@
     PhysicalDevice::getDisplayProperties2KHR( DisplayProperties2KHRAllocator & displayProperties2KHRAllocator,
                                               Dispatch const &                 d ) const
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     std::vector<DisplayProperties2KHR, DisplayProperties2KHRAllocator> properties( displayProperties2KHRAllocator );
     uint32_t                                                           propertyCount;
     Result                                                             result;
@@ -11826,6 +12575,7 @@
                                                    VULKAN_HPP_NAMESPACE::DisplayPlaneProperties2KHR * pProperties,
                                                    Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     return static_cast<Result>( d.vkGetPhysicalDeviceDisplayPlaneProperties2KHR(
       m_physicalDevice, pPropertyCount, reinterpret_cast<VkDisplayPlaneProperties2KHR *>( pProperties ) ) );
   }
@@ -11836,6 +12586,7 @@
     typename ResultValueType<std::vector<DisplayPlaneProperties2KHR, DisplayPlaneProperties2KHRAllocator>>::type
     PhysicalDevice::getDisplayPlaneProperties2KHR( Dispatch const & d ) const
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     std::vector<DisplayPlaneProperties2KHR, DisplayPlaneProperties2KHRAllocator> properties;
     uint32_t                                                                     propertyCount;
     Result                                                                       result;
@@ -11868,6 +12619,7 @@
     PhysicalDevice::getDisplayPlaneProperties2KHR(
       DisplayPlaneProperties2KHRAllocator & displayPlaneProperties2KHRAllocator, Dispatch const & d ) const
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     std::vector<DisplayPlaneProperties2KHR, DisplayPlaneProperties2KHRAllocator> properties(
       displayPlaneProperties2KHRAllocator );
     uint32_t propertyCount;
@@ -11900,6 +12652,7 @@
                                                   VULKAN_HPP_NAMESPACE::DisplayModeProperties2KHR * pProperties,
                                                   Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     return static_cast<Result>(
       d.vkGetDisplayModeProperties2KHR( m_physicalDevice,
                                         static_cast<VkDisplayKHR>( display ),
@@ -11913,6 +12666,7 @@
     typename ResultValueType<std::vector<DisplayModeProperties2KHR, DisplayModeProperties2KHRAllocator>>::type
     PhysicalDevice::getDisplayModeProperties2KHR( VULKAN_HPP_NAMESPACE::DisplayKHR display, Dispatch const & d ) const
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     std::vector<DisplayModeProperties2KHR, DisplayModeProperties2KHRAllocator> properties;
     uint32_t                                                                   propertyCount;
     Result                                                                     result;
@@ -11950,6 +12704,7 @@
       DisplayModeProperties2KHRAllocator & displayModeProperties2KHRAllocator,
       Dispatch const &                     d ) const
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     std::vector<DisplayModeProperties2KHR, DisplayModeProperties2KHRAllocator> properties(
       displayModeProperties2KHRAllocator );
     uint32_t propertyCount;
@@ -11984,6 +12739,7 @@
     VULKAN_HPP_NAMESPACE::DisplayPlaneCapabilities2KHR * pCapabilities,
     Dispatch const &                                     d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     return static_cast<Result>(
       d.vkGetDisplayPlaneCapabilities2KHR( m_physicalDevice,
                                            reinterpret_cast<const VkDisplayPlaneInfo2KHR *>( pDisplayPlaneInfo ),
@@ -11997,6 +12753,7 @@
     PhysicalDevice::getDisplayPlaneCapabilities2KHR( const DisplayPlaneInfo2KHR & displayPlaneInfo,
                                                      Dispatch const &             d ) const
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     VULKAN_HPP_NAMESPACE::DisplayPlaneCapabilities2KHR capabilities;
     Result                                             result = static_cast<Result>(
       d.vkGetDisplayPlaneCapabilities2KHR( m_physicalDevice,
@@ -12017,6 +12774,7 @@
                                    VULKAN_HPP_NAMESPACE::SurfaceKHR *                    pSurface,
                                    Dispatch const &                                      d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     return static_cast<Result>(
       d.vkCreateIOSSurfaceMVK( m_instance,
                                reinterpret_cast<const VkIOSSurfaceCreateInfoMVK *>( pCreateInfo ),
@@ -12032,6 +12790,7 @@
                                    Optional<const AllocationCallbacks> allocator,
                                    Dispatch const &                    d ) const
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     VULKAN_HPP_NAMESPACE::SurfaceKHR surface;
     Result                           result = static_cast<Result>(
       d.vkCreateIOSSurfaceMVK( m_instance,
@@ -12050,6 +12809,7 @@
                                          Optional<const AllocationCallbacks> allocator,
                                          Dispatch const &                    d ) const
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     VULKAN_HPP_NAMESPACE::SurfaceKHR surface;
     Result                           result = static_cast<Result>(
       d.vkCreateIOSSurfaceMVK( m_instance,
@@ -12075,6 +12835,7 @@
                                      VULKAN_HPP_NAMESPACE::SurfaceKHR *                      pSurface,
                                      Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     return static_cast<Result>(
       d.vkCreateMacOSSurfaceMVK( m_instance,
                                  reinterpret_cast<const VkMacOSSurfaceCreateInfoMVK *>( pCreateInfo ),
@@ -12090,6 +12851,7 @@
                                      Optional<const AllocationCallbacks> allocator,
                                      Dispatch const &                    d ) const
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     VULKAN_HPP_NAMESPACE::SurfaceKHR surface;
     Result                           result = static_cast<Result>(
       d.vkCreateMacOSSurfaceMVK( m_instance,
@@ -12108,6 +12870,7 @@
                                            Optional<const AllocationCallbacks> allocator,
                                            Dispatch const &                    d ) const
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     VULKAN_HPP_NAMESPACE::SurfaceKHR surface;
     Result                           result = static_cast<Result>(
       d.vkCreateMacOSSurfaceMVK( m_instance,
@@ -12129,6 +12892,7 @@
   VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE Result Device::setDebugUtilsObjectNameEXT(
     const VULKAN_HPP_NAMESPACE::DebugUtilsObjectNameInfoEXT * pNameInfo, Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     return static_cast<Result>( d.vkSetDebugUtilsObjectNameEXT(
       m_device, reinterpret_cast<const VkDebugUtilsObjectNameInfoEXT *>( pNameInfo ) ) );
   }
@@ -12138,6 +12902,7 @@
   VULKAN_HPP_NODISCARD_WHEN_NO_EXCEPTIONS VULKAN_HPP_INLINE typename ResultValueType<void>::type
                                           Device::setDebugUtilsObjectNameEXT( const DebugUtilsObjectNameInfoEXT & nameInfo, Dispatch const & d ) const
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     Result result = static_cast<Result>( d.vkSetDebugUtilsObjectNameEXT(
       m_device, reinterpret_cast<const VkDebugUtilsObjectNameInfoEXT *>( &nameInfo ) ) );
     return createResultValue( result, VULKAN_HPP_NAMESPACE_STRING "::Device::setDebugUtilsObjectNameEXT" );
@@ -12148,6 +12913,7 @@
   VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE Result Device::setDebugUtilsObjectTagEXT(
     const VULKAN_HPP_NAMESPACE::DebugUtilsObjectTagInfoEXT * pTagInfo, Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     return static_cast<Result>(
       d.vkSetDebugUtilsObjectTagEXT( m_device, reinterpret_cast<const VkDebugUtilsObjectTagInfoEXT *>( pTagInfo ) ) );
   }
@@ -12157,6 +12923,7 @@
   VULKAN_HPP_NODISCARD_WHEN_NO_EXCEPTIONS VULKAN_HPP_INLINE typename ResultValueType<void>::type
                                           Device::setDebugUtilsObjectTagEXT( const DebugUtilsObjectTagInfoEXT & tagInfo, Dispatch const & d ) const
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     Result result = static_cast<Result>(
       d.vkSetDebugUtilsObjectTagEXT( m_device, reinterpret_cast<const VkDebugUtilsObjectTagInfoEXT *>( &tagInfo ) ) );
     return createResultValue( result, VULKAN_HPP_NAMESPACE_STRING "::Device::setDebugUtilsObjectTagEXT" );
@@ -12167,6 +12934,7 @@
   VULKAN_HPP_INLINE void Queue::beginDebugUtilsLabelEXT( const VULKAN_HPP_NAMESPACE::DebugUtilsLabelEXT * pLabelInfo,
                                                          Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkQueueBeginDebugUtilsLabelEXT( m_queue, reinterpret_cast<const VkDebugUtilsLabelEXT *>( pLabelInfo ) );
   }
 
@@ -12175,6 +12943,7 @@
   VULKAN_HPP_INLINE void Queue::beginDebugUtilsLabelEXT( const DebugUtilsLabelEXT & labelInfo,
                                                          Dispatch const &           d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkQueueBeginDebugUtilsLabelEXT( m_queue, reinterpret_cast<const VkDebugUtilsLabelEXT *>( &labelInfo ) );
   }
 #endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/
@@ -12182,6 +12951,7 @@
   template <typename Dispatch>
   VULKAN_HPP_INLINE void Queue::endDebugUtilsLabelEXT( Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkQueueEndDebugUtilsLabelEXT( m_queue );
   }
 
@@ -12189,6 +12959,7 @@
   VULKAN_HPP_INLINE void Queue::insertDebugUtilsLabelEXT( const VULKAN_HPP_NAMESPACE::DebugUtilsLabelEXT * pLabelInfo,
                                                           Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkQueueInsertDebugUtilsLabelEXT( m_queue, reinterpret_cast<const VkDebugUtilsLabelEXT *>( pLabelInfo ) );
   }
 
@@ -12197,6 +12968,7 @@
   VULKAN_HPP_INLINE void Queue::insertDebugUtilsLabelEXT( const DebugUtilsLabelEXT & labelInfo,
                                                           Dispatch const &           d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkQueueInsertDebugUtilsLabelEXT( m_queue, reinterpret_cast<const VkDebugUtilsLabelEXT *>( &labelInfo ) );
   }
 #endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/
@@ -12206,6 +12978,7 @@
     CommandBuffer::beginDebugUtilsLabelEXT( const VULKAN_HPP_NAMESPACE::DebugUtilsLabelEXT * pLabelInfo,
                                             Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkCmdBeginDebugUtilsLabelEXT( m_commandBuffer, reinterpret_cast<const VkDebugUtilsLabelEXT *>( pLabelInfo ) );
   }
 
@@ -12214,6 +12987,7 @@
   VULKAN_HPP_INLINE void CommandBuffer::beginDebugUtilsLabelEXT( const DebugUtilsLabelEXT & labelInfo,
                                                                  Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkCmdBeginDebugUtilsLabelEXT( m_commandBuffer, reinterpret_cast<const VkDebugUtilsLabelEXT *>( &labelInfo ) );
   }
 #endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/
@@ -12221,6 +12995,7 @@
   template <typename Dispatch>
   VULKAN_HPP_INLINE void CommandBuffer::endDebugUtilsLabelEXT( Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkCmdEndDebugUtilsLabelEXT( m_commandBuffer );
   }
 
@@ -12229,6 +13004,7 @@
     CommandBuffer::insertDebugUtilsLabelEXT( const VULKAN_HPP_NAMESPACE::DebugUtilsLabelEXT * pLabelInfo,
                                              Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkCmdInsertDebugUtilsLabelEXT( m_commandBuffer, reinterpret_cast<const VkDebugUtilsLabelEXT *>( pLabelInfo ) );
   }
 
@@ -12237,6 +13013,7 @@
   VULKAN_HPP_INLINE void CommandBuffer::insertDebugUtilsLabelEXT( const DebugUtilsLabelEXT & labelInfo,
                                                                   Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkCmdInsertDebugUtilsLabelEXT( m_commandBuffer, reinterpret_cast<const VkDebugUtilsLabelEXT *>( &labelInfo ) );
   }
 #endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/
@@ -12248,6 +13025,7 @@
                                             VULKAN_HPP_NAMESPACE::DebugUtilsMessengerEXT *                 pMessenger,
                                             Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     return static_cast<Result>(
       d.vkCreateDebugUtilsMessengerEXT( m_instance,
                                         reinterpret_cast<const VkDebugUtilsMessengerCreateInfoEXT *>( pCreateInfo ),
@@ -12262,6 +13040,7 @@
                                             Optional<const AllocationCallbacks>      allocator,
                                             Dispatch const &                         d ) const
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     VULKAN_HPP_NAMESPACE::DebugUtilsMessengerEXT messenger;
     Result                                       result = static_cast<Result>(
       d.vkCreateDebugUtilsMessengerEXT( m_instance,
@@ -12280,6 +13059,7 @@
                                                   Optional<const AllocationCallbacks>      allocator,
                                                   Dispatch const &                         d ) const
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     VULKAN_HPP_NAMESPACE::DebugUtilsMessengerEXT messenger;
     Result                                       result = static_cast<Result>(
       d.vkCreateDebugUtilsMessengerEXT( m_instance,
@@ -12300,6 +13080,7 @@
                                              const VULKAN_HPP_NAMESPACE::AllocationCallbacks * pAllocator,
                                              Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkDestroyDebugUtilsMessengerEXT( m_instance,
                                        static_cast<VkDebugUtilsMessengerEXT>( messenger ),
                                        reinterpret_cast<const VkAllocationCallbacks *>( pAllocator ) );
@@ -12312,6 +13093,7 @@
                                              Optional<const AllocationCallbacks>          allocator,
                                              Dispatch const &                             d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkDestroyDebugUtilsMessengerEXT(
       m_instance,
       static_cast<VkDebugUtilsMessengerEXT>( messenger ),
@@ -12325,6 +13107,7 @@
                                             const VULKAN_HPP_NAMESPACE::AllocationCallbacks * pAllocator,
                                             Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkDestroyDebugUtilsMessengerEXT( m_instance,
                                        static_cast<VkDebugUtilsMessengerEXT>( messenger ),
                                        reinterpret_cast<const VkAllocationCallbacks *>( pAllocator ) );
@@ -12336,6 +13119,7 @@
                                             Optional<const AllocationCallbacks>          allocator,
                                             Dispatch const &                             d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkDestroyDebugUtilsMessengerEXT(
       m_instance,
       static_cast<VkDebugUtilsMessengerEXT>( messenger ),
@@ -12351,6 +13135,7 @@
     const VULKAN_HPP_NAMESPACE::DebugUtilsMessengerCallbackDataEXT * pCallbackData,
     Dispatch const &                                                 d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkSubmitDebugUtilsMessageEXT( m_instance,
                                     static_cast<VkDebugUtilsMessageSeverityFlagBitsEXT>( messageSeverity ),
                                     static_cast<VkDebugUtilsMessageTypeFlagsEXT>( messageTypes ),
@@ -12365,6 +13150,7 @@
                                           const DebugUtilsMessengerCallbackDataEXT &                 callbackData,
                                           Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkSubmitDebugUtilsMessageEXT( m_instance,
                                     static_cast<VkDebugUtilsMessageSeverityFlagBitsEXT>( messageSeverity ),
                                     static_cast<VkDebugUtilsMessageTypeFlagsEXT>( messageTypes ),
@@ -12381,6 +13167,7 @@
     VULKAN_HPP_NAMESPACE::AndroidHardwareBufferPropertiesANDROID * pProperties,
     Dispatch const &                                               d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     return static_cast<Result>( d.vkGetAndroidHardwareBufferPropertiesANDROID(
       m_device, buffer, reinterpret_cast<VkAndroidHardwareBufferPropertiesANDROID *>( pProperties ) ) );
   }
@@ -12391,6 +13178,7 @@
     typename ResultValueType<VULKAN_HPP_NAMESPACE::AndroidHardwareBufferPropertiesANDROID>::type
     Device::getAndroidHardwareBufferPropertiesANDROID( const struct AHardwareBuffer & buffer, Dispatch const & d ) const
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     VULKAN_HPP_NAMESPACE::AndroidHardwareBufferPropertiesANDROID properties;
     Result result = static_cast<Result>( d.vkGetAndroidHardwareBufferPropertiesANDROID(
       m_device, &buffer, reinterpret_cast<VkAndroidHardwareBufferPropertiesANDROID *>( &properties ) ) );
@@ -12402,6 +13190,7 @@
   VULKAN_HPP_NODISCARD_WHEN_NO_EXCEPTIONS VULKAN_HPP_INLINE typename ResultValueType<StructureChain<X, Y, Z...>>::type
                                           Device::getAndroidHardwareBufferPropertiesANDROID( const struct AHardwareBuffer & buffer, Dispatch const & d ) const
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     StructureChain<X, Y, Z...>                                     structureChain;
     VULKAN_HPP_NAMESPACE::AndroidHardwareBufferPropertiesANDROID & properties =
       structureChain.template get<VULKAN_HPP_NAMESPACE::AndroidHardwareBufferPropertiesANDROID>();
@@ -12418,6 +13207,7 @@
     struct AHardwareBuffer **                                               pBuffer,
     Dispatch const &                                                        d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     return static_cast<Result>( d.vkGetMemoryAndroidHardwareBufferANDROID(
       m_device, reinterpret_cast<const VkMemoryGetAndroidHardwareBufferInfoANDROID *>( pInfo ), pBuffer ) );
   }
@@ -12428,6 +13218,7 @@
                                           Device::getMemoryAndroidHardwareBufferANDROID( const MemoryGetAndroidHardwareBufferInfoANDROID & info,
                                                    Dispatch const &                                  d ) const
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     struct AHardwareBuffer * buffer;
     Result                   result = static_cast<Result>( d.vkGetMemoryAndroidHardwareBufferANDROID(
       m_device, reinterpret_cast<const VkMemoryGetAndroidHardwareBufferInfoANDROID *>( &info ), &buffer ) );
@@ -12444,6 +13235,7 @@
     CommandBuffer::setSampleLocationsEXT( const VULKAN_HPP_NAMESPACE::SampleLocationsInfoEXT * pSampleLocationsInfo,
                                           Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkCmdSetSampleLocationsEXT( m_commandBuffer,
                                   reinterpret_cast<const VkSampleLocationsInfoEXT *>( pSampleLocationsInfo ) );
   }
@@ -12453,6 +13245,7 @@
   VULKAN_HPP_INLINE void CommandBuffer::setSampleLocationsEXT( const SampleLocationsInfoEXT & sampleLocationsInfo,
                                                                Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkCmdSetSampleLocationsEXT( m_commandBuffer,
                                   reinterpret_cast<const VkSampleLocationsInfoEXT *>( &sampleLocationsInfo ) );
   }
@@ -12464,6 +13257,7 @@
     VULKAN_HPP_NAMESPACE::MultisamplePropertiesEXT * pMultisampleProperties,
     Dispatch const &                                 d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkGetPhysicalDeviceMultisamplePropertiesEXT(
       m_physicalDevice,
       static_cast<VkSampleCountFlagBits>( samples ),
@@ -12476,6 +13270,7 @@
                                          PhysicalDevice::getMultisamplePropertiesEXT( VULKAN_HPP_NAMESPACE::SampleCountFlagBits samples,
                                                  Dispatch const &                          d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     VULKAN_HPP_NAMESPACE::MultisamplePropertiesEXT multisampleProperties;
     d.vkGetPhysicalDeviceMultisamplePropertiesEXT(
       m_physicalDevice,
@@ -12493,6 +13288,7 @@
                                             VULKAN_HPP_NAMESPACE::MemoryRequirements2 * pMemoryRequirements,
                                             Dispatch const &                            d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkGetImageMemoryRequirements2KHR( m_device,
                                         reinterpret_cast<const VkImageMemoryRequirementsInfo2 *>( pInfo ),
                                         reinterpret_cast<VkMemoryRequirements2 *>( pMemoryRequirements ) );
@@ -12504,6 +13300,7 @@
                                          Device::getImageMemoryRequirements2KHR( const ImageMemoryRequirementsInfo2 & info,
                                             Dispatch const &                     d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     VULKAN_HPP_NAMESPACE::MemoryRequirements2 memoryRequirements;
     d.vkGetImageMemoryRequirements2KHR( m_device,
                                         reinterpret_cast<const VkImageMemoryRequirementsInfo2 *>( &info ),
@@ -12516,6 +13313,7 @@
                                          Device::getImageMemoryRequirements2KHR( const ImageMemoryRequirementsInfo2 & info,
                                             Dispatch const &                     d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     StructureChain<X, Y, Z...>                  structureChain;
     VULKAN_HPP_NAMESPACE::MemoryRequirements2 & memoryRequirements =
       structureChain.template get<VULKAN_HPP_NAMESPACE::MemoryRequirements2>();
@@ -12532,6 +13330,7 @@
                                              VULKAN_HPP_NAMESPACE::MemoryRequirements2 * pMemoryRequirements,
                                              Dispatch const &                            d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkGetBufferMemoryRequirements2KHR( m_device,
                                          reinterpret_cast<const VkBufferMemoryRequirementsInfo2 *>( pInfo ),
                                          reinterpret_cast<VkMemoryRequirements2 *>( pMemoryRequirements ) );
@@ -12543,6 +13342,7 @@
                                          Device::getBufferMemoryRequirements2KHR( const BufferMemoryRequirementsInfo2 & info,
                                              Dispatch const &                      d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     VULKAN_HPP_NAMESPACE::MemoryRequirements2 memoryRequirements;
     d.vkGetBufferMemoryRequirements2KHR( m_device,
                                          reinterpret_cast<const VkBufferMemoryRequirementsInfo2 *>( &info ),
@@ -12555,6 +13355,7 @@
                                          Device::getBufferMemoryRequirements2KHR( const BufferMemoryRequirementsInfo2 & info,
                                              Dispatch const &                      d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     StructureChain<X, Y, Z...>                  structureChain;
     VULKAN_HPP_NAMESPACE::MemoryRequirements2 & memoryRequirements =
       structureChain.template get<VULKAN_HPP_NAMESPACE::MemoryRequirements2>();
@@ -12572,6 +13373,7 @@
     VULKAN_HPP_NAMESPACE::SparseImageMemoryRequirements2 *           pSparseMemoryRequirements,
     Dispatch const &                                                 d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkGetImageSparseMemoryRequirements2KHR(
       m_device,
       reinterpret_cast<const VkImageSparseMemoryRequirementsInfo2 *>( pInfo ),
@@ -12586,6 +13388,7 @@
                       Device::getImageSparseMemoryRequirements2KHR( const ImageSparseMemoryRequirementsInfo2 & info,
                                                   Dispatch const &                           d ) const
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     std::vector<SparseImageMemoryRequirements2, SparseImageMemoryRequirements2Allocator> sparseMemoryRequirements;
     uint32_t                                                                             sparseMemoryRequirementCount;
     d.vkGetImageSparseMemoryRequirements2KHR( m_device,
@@ -12614,6 +13417,7 @@
       SparseImageMemoryRequirements2Allocator &  sparseImageMemoryRequirements2Allocator,
       Dispatch const &                           d ) const
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     std::vector<SparseImageMemoryRequirements2, SparseImageMemoryRequirements2Allocator> sparseMemoryRequirements(
       sparseImageMemoryRequirements2Allocator );
     uint32_t sparseMemoryRequirementCount;
@@ -12641,6 +13445,7 @@
     VULKAN_HPP_NAMESPACE::AccelerationStructureKHR *                 pAccelerationStructure,
     Dispatch const &                                                 d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     return static_cast<Result>(
       d.vkCreateAccelerationStructureKHR( m_device,
                                           reinterpret_cast<const VkAccelerationStructureCreateInfoKHR *>( pCreateInfo ),
@@ -12656,6 +13461,7 @@
                                             Optional<const AllocationCallbacks>        allocator,
                                             Dispatch const &                           d ) const
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     VULKAN_HPP_NAMESPACE::AccelerationStructureKHR accelerationStructure;
     Result                                         result = static_cast<Result>( d.vkCreateAccelerationStructureKHR(
       m_device,
@@ -12675,6 +13481,7 @@
                                                   Optional<const AllocationCallbacks>        allocator,
                                                   Dispatch const &                           d ) const
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     VULKAN_HPP_NAMESPACE::AccelerationStructureKHR accelerationStructure;
     Result                                         result = static_cast<Result>( d.vkCreateAccelerationStructureKHR(
       m_device,
@@ -12698,6 +13505,7 @@
                                              const VULKAN_HPP_NAMESPACE::AllocationCallbacks * pAllocator,
                                              Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkDestroyAccelerationStructureKHR( m_device,
                                          static_cast<VkAccelerationStructureKHR>( accelerationStructure ),
                                          reinterpret_cast<const VkAllocationCallbacks *>( pAllocator ) );
@@ -12710,6 +13518,7 @@
                                              Optional<const AllocationCallbacks>            allocator,
                                              Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkDestroyAccelerationStructureKHR(
       m_device,
       static_cast<VkAccelerationStructureKHR>( accelerationStructure ),
@@ -12723,6 +13532,7 @@
                                           const VULKAN_HPP_NAMESPACE::AllocationCallbacks * pAllocator,
                                           Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkDestroyAccelerationStructureKHR( m_device,
                                          static_cast<VkAccelerationStructureKHR>( accelerationStructure ),
                                          reinterpret_cast<const VkAllocationCallbacks *>( pAllocator ) );
@@ -12734,6 +13544,7 @@
                                           Optional<const AllocationCallbacks>            allocator,
                                           Dispatch const &                               d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkDestroyAccelerationStructureKHR(
       m_device,
       static_cast<VkAccelerationStructureKHR>( accelerationStructure ),
@@ -12749,6 +13560,7 @@
     const VULKAN_HPP_NAMESPACE::AccelerationStructureBuildRangeInfoKHR * const * ppBuildRangeInfos,
     Dispatch const &                                                             d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkCmdBuildAccelerationStructuresKHR(
       m_commandBuffer,
       infoCount,
@@ -12763,6 +13575,7 @@
     ArrayProxy<const VULKAN_HPP_NAMESPACE::AccelerationStructureBuildRangeInfoKHR * const> const & pBuildRangeInfos,
     Dispatch const & d ) const VULKAN_HPP_NOEXCEPT_WHEN_NO_EXCEPTIONS
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
 #  ifdef VULKAN_HPP_NO_EXCEPTIONS
     VULKAN_HPP_ASSERT( infos.size() == pBuildRangeInfos.size() );
 #  else
@@ -12790,6 +13603,7 @@
     const uint32_t * const *                                                ppMaxPrimitiveCounts,
     Dispatch const &                                                        d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkCmdBuildAccelerationStructuresIndirectKHR(
       m_commandBuffer,
       infoCount,
@@ -12808,6 +13622,7 @@
     ArrayProxy<const uint32_t * const> const &                                                pMaxPrimitiveCounts,
     Dispatch const & d ) const VULKAN_HPP_NOEXCEPT_WHEN_NO_EXCEPTIONS
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
 #  ifdef VULKAN_HPP_NO_EXCEPTIONS
     VULKAN_HPP_ASSERT( infos.size() == indirectDeviceAddresses.size() );
     VULKAN_HPP_ASSERT( infos.size() == indirectStrides.size() );
@@ -12851,6 +13666,7 @@
     const VULKAN_HPP_NAMESPACE::AccelerationStructureBuildRangeInfoKHR * const * ppBuildRangeInfos,
     Dispatch const &                                                             d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     return static_cast<Result>( d.vkBuildAccelerationStructuresKHR(
       m_device,
       static_cast<VkDeferredOperationKHR>( deferredOperation ),
@@ -12867,6 +13683,7 @@
     ArrayProxy<const VULKAN_HPP_NAMESPACE::AccelerationStructureBuildRangeInfoKHR * const> const & pBuildRangeInfos,
     Dispatch const & d ) const VULKAN_HPP_NOEXCEPT_WHEN_NO_EXCEPTIONS
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
 #  ifdef VULKAN_HPP_NO_EXCEPTIONS
     VULKAN_HPP_ASSERT( infos.size() == pBuildRangeInfos.size() );
 #  else
@@ -12897,6 +13714,7 @@
                                           const VULKAN_HPP_NAMESPACE::CopyAccelerationStructureInfoKHR * pInfo,
                                           Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     return static_cast<Result>(
       d.vkCopyAccelerationStructureKHR( m_device,
                                         static_cast<VkDeferredOperationKHR>( deferredOperation ),
@@ -12910,6 +13728,7 @@
                                           const CopyAccelerationStructureInfoKHR &   info,
                                           Dispatch const &                           d ) const
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     Result result = static_cast<Result>(
       d.vkCopyAccelerationStructureKHR( m_device,
                                         static_cast<VkDeferredOperationKHR>( deferredOperation ),
@@ -12928,6 +13747,7 @@
     const VULKAN_HPP_NAMESPACE::CopyAccelerationStructureToMemoryInfoKHR * pInfo,
     Dispatch const &                                                       d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     return static_cast<Result>( d.vkCopyAccelerationStructureToMemoryKHR(
       m_device,
       static_cast<VkDeferredOperationKHR>( deferredOperation ),
@@ -12941,6 +13761,7 @@
                                                   const CopyAccelerationStructureToMemoryInfoKHR & info,
                                                   Dispatch const &                                 d ) const
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     Result result = static_cast<Result>( d.vkCopyAccelerationStructureToMemoryKHR(
       m_device,
       static_cast<VkDeferredOperationKHR>( deferredOperation ),
@@ -12959,6 +13780,7 @@
     const VULKAN_HPP_NAMESPACE::CopyMemoryToAccelerationStructureInfoKHR * pInfo,
     Dispatch const &                                                       d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     return static_cast<Result>( d.vkCopyMemoryToAccelerationStructureKHR(
       m_device,
       static_cast<VkDeferredOperationKHR>( deferredOperation ),
@@ -12972,6 +13794,7 @@
                                                   const CopyMemoryToAccelerationStructureInfoKHR & info,
                                                   Dispatch const &                                 d ) const
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     Result result = static_cast<Result>( d.vkCopyMemoryToAccelerationStructureKHR(
       m_device,
       static_cast<VkDeferredOperationKHR>( deferredOperation ),
@@ -12994,6 +13817,7 @@
     size_t                                                 stride,
     Dispatch const &                                       d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     return static_cast<Result>( d.vkWriteAccelerationStructuresPropertiesKHR(
       m_device,
       accelerationStructureCount,
@@ -13015,6 +13839,7 @@
       size_t                                                                   stride,
       Dispatch const &                                                         d ) const
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     Result result = static_cast<Result>( d.vkWriteAccelerationStructuresPropertiesKHR(
       m_device,
       accelerationStructures.size(),
@@ -13036,6 +13861,7 @@
       size_t                                                                   stride,
       Dispatch const &                                                         d ) const
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     VULKAN_HPP_ASSERT( dataSize % sizeof( T ) == 0 );
     std::vector<T, Allocator> data( dataSize / sizeof( T ) );
     Result                    result = static_cast<Result>( d.vkWriteAccelerationStructuresPropertiesKHR(
@@ -13058,6 +13884,7 @@
       size_t                                                                   stride,
       Dispatch const &                                                         d ) const
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     T      data;
     Result result = static_cast<Result>( d.vkWriteAccelerationStructuresPropertiesKHR(
       m_device,
@@ -13077,6 +13904,7 @@
     CommandBuffer::copyAccelerationStructureKHR( const VULKAN_HPP_NAMESPACE::CopyAccelerationStructureInfoKHR * pInfo,
                                                  Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkCmdCopyAccelerationStructureKHR( m_commandBuffer,
                                          reinterpret_cast<const VkCopyAccelerationStructureInfoKHR *>( pInfo ) );
   }
@@ -13086,6 +13914,7 @@
   VULKAN_HPP_INLINE void CommandBuffer::copyAccelerationStructureKHR( const CopyAccelerationStructureInfoKHR & info,
                                                                       Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkCmdCopyAccelerationStructureKHR( m_commandBuffer,
                                          reinterpret_cast<const VkCopyAccelerationStructureInfoKHR *>( &info ) );
   }
@@ -13096,6 +13925,7 @@
     const VULKAN_HPP_NAMESPACE::CopyAccelerationStructureToMemoryInfoKHR * pInfo,
     Dispatch const &                                                       d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkCmdCopyAccelerationStructureToMemoryKHR(
       m_commandBuffer, reinterpret_cast<const VkCopyAccelerationStructureToMemoryInfoKHR *>( pInfo ) );
   }
@@ -13106,6 +13936,7 @@
     CommandBuffer::copyAccelerationStructureToMemoryKHR( const CopyAccelerationStructureToMemoryInfoKHR & info,
                                                          Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkCmdCopyAccelerationStructureToMemoryKHR(
       m_commandBuffer, reinterpret_cast<const VkCopyAccelerationStructureToMemoryInfoKHR *>( &info ) );
   }
@@ -13116,6 +13947,7 @@
     const VULKAN_HPP_NAMESPACE::CopyMemoryToAccelerationStructureInfoKHR * pInfo,
     Dispatch const &                                                       d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkCmdCopyMemoryToAccelerationStructureKHR(
       m_commandBuffer, reinterpret_cast<const VkCopyMemoryToAccelerationStructureInfoKHR *>( pInfo ) );
   }
@@ -13126,6 +13958,7 @@
     CommandBuffer::copyMemoryToAccelerationStructureKHR( const CopyMemoryToAccelerationStructureInfoKHR & info,
                                                          Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkCmdCopyMemoryToAccelerationStructureKHR(
       m_commandBuffer, reinterpret_cast<const VkCopyMemoryToAccelerationStructureInfoKHR *>( &info ) );
   }
@@ -13136,6 +13969,7 @@
     const VULKAN_HPP_NAMESPACE::AccelerationStructureDeviceAddressInfoKHR * pInfo,
     Dispatch const &                                                        d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     return static_cast<DeviceAddress>( d.vkGetAccelerationStructureDeviceAddressKHR(
       m_device, reinterpret_cast<const VkAccelerationStructureDeviceAddressInfoKHR *>( pInfo ) ) );
   }
@@ -13145,6 +13979,7 @@
   VULKAN_HPP_INLINE DeviceAddress Device::getAccelerationStructureAddressKHR(
     const AccelerationStructureDeviceAddressInfoKHR & info, Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     return d.vkGetAccelerationStructureDeviceAddressKHR(
       m_device, reinterpret_cast<const VkAccelerationStructureDeviceAddressInfoKHR *>( &info ) );
   }
@@ -13159,6 +13994,7 @@
     uint32_t                                               firstQuery,
     Dispatch const &                                       d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkCmdWriteAccelerationStructuresPropertiesKHR(
       m_commandBuffer,
       accelerationStructureCount,
@@ -13177,6 +14013,7 @@
     uint32_t                                                                 firstQuery,
     Dispatch const &                                                         d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkCmdWriteAccelerationStructuresPropertiesKHR(
       m_commandBuffer,
       accelerationStructures.size(),
@@ -13193,6 +14030,7 @@
     VULKAN_HPP_NAMESPACE::AccelerationStructureCompatibilityKHR *     pCompatibility,
     Dispatch const &                                                  d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkGetDeviceAccelerationStructureCompatibilityKHR(
       m_device,
       reinterpret_cast<const VkAccelerationStructureVersionInfoKHR *>( pVersionInfo ),
@@ -13205,6 +14043,7 @@
                                          Device::getAccelerationStructureCompatibilityKHR( const AccelerationStructureVersionInfoKHR & versionInfo,
                                                       Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     VULKAN_HPP_NAMESPACE::AccelerationStructureCompatibilityKHR compatibility;
     d.vkGetDeviceAccelerationStructureCompatibilityKHR(
       m_device,
@@ -13222,6 +14061,7 @@
     VULKAN_HPP_NAMESPACE::AccelerationStructureBuildSizesInfoKHR *          pSizeInfo,
     Dispatch const &                                                        d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkGetAccelerationStructureBuildSizesKHR(
       m_device,
       static_cast<VkAccelerationStructureBuildTypeKHR>( buildType ),
@@ -13238,6 +14078,7 @@
                                                    ArrayProxy<const uint32_t> const & maxPrimitiveCounts,
                                                    Dispatch const & d ) const VULKAN_HPP_NOEXCEPT_WHEN_NO_EXCEPTIONS
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
 #  ifdef VULKAN_HPP_NO_EXCEPTIONS
     VULKAN_HPP_ASSERT( maxPrimitiveCounts.size() == buildInfo.geometryCount );
 #  else
@@ -13268,6 +14109,7 @@
                                              VULKAN_HPP_NAMESPACE::SamplerYcbcrConversion * pYcbcrConversion,
                                              Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     return static_cast<Result>(
       d.vkCreateSamplerYcbcrConversionKHR( m_device,
                                            reinterpret_cast<const VkSamplerYcbcrConversionCreateInfo *>( pCreateInfo ),
@@ -13283,6 +14125,7 @@
                                              Optional<const AllocationCallbacks>      allocator,
                                              Dispatch const &                         d ) const
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     VULKAN_HPP_NAMESPACE::SamplerYcbcrConversion ycbcrConversion;
     Result                                       result = static_cast<Result>( d.vkCreateSamplerYcbcrConversionKHR(
       m_device,
@@ -13302,6 +14145,7 @@
                                                    Optional<const AllocationCallbacks>      allocator,
                                                    Dispatch const &                         d ) const
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     VULKAN_HPP_NAMESPACE::SamplerYcbcrConversion ycbcrConversion;
     Result                                       result = static_cast<Result>( d.vkCreateSamplerYcbcrConversionKHR(
       m_device,
@@ -13322,6 +14166,7 @@
                                               const VULKAN_HPP_NAMESPACE::AllocationCallbacks * pAllocator,
                                               Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkDestroySamplerYcbcrConversionKHR( m_device,
                                           static_cast<VkSamplerYcbcrConversion>( ycbcrConversion ),
                                           reinterpret_cast<const VkAllocationCallbacks *>( pAllocator ) );
@@ -13334,6 +14179,7 @@
                                               Optional<const AllocationCallbacks>          allocator,
                                               Dispatch const &                             d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkDestroySamplerYcbcrConversionKHR(
       m_device,
       static_cast<VkSamplerYcbcrConversion>( ycbcrConversion ),
@@ -13350,6 +14196,7 @@
                                   const VULKAN_HPP_NAMESPACE::BindBufferMemoryInfo * pBindInfos,
                                   Dispatch const &                                   d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     return static_cast<Result>( d.vkBindBufferMemory2KHR(
       m_device, bindInfoCount, reinterpret_cast<const VkBindBufferMemoryInfo *>( pBindInfos ) ) );
   }
@@ -13360,6 +14207,7 @@
                                           Device::bindBufferMemory2KHR( ArrayProxy<const VULKAN_HPP_NAMESPACE::BindBufferMemoryInfo> const & bindInfos,
                                   Dispatch const &                                                     d ) const
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     Result result = static_cast<Result>( d.vkBindBufferMemory2KHR(
       m_device, bindInfos.size(), reinterpret_cast<const VkBindBufferMemoryInfo *>( bindInfos.data() ) ) );
     return createResultValue( result, VULKAN_HPP_NAMESPACE_STRING "::Device::bindBufferMemory2KHR" );
@@ -13372,6 +14220,7 @@
                                  const VULKAN_HPP_NAMESPACE::BindImageMemoryInfo * pBindInfos,
                                  Dispatch const &                                  d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     return static_cast<Result>( d.vkBindImageMemory2KHR(
       m_device, bindInfoCount, reinterpret_cast<const VkBindImageMemoryInfo *>( pBindInfos ) ) );
   }
@@ -13382,6 +14231,7 @@
                                           Device::bindImageMemory2KHR( ArrayProxy<const VULKAN_HPP_NAMESPACE::BindImageMemoryInfo> const & bindInfos,
                                  Dispatch const &                                                    d ) const
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     Result result = static_cast<Result>( d.vkBindImageMemory2KHR(
       m_device, bindInfos.size(), reinterpret_cast<const VkBindImageMemoryInfo *>( bindInfos.data() ) ) );
     return createResultValue( result, VULKAN_HPP_NAMESPACE_STRING "::Device::bindImageMemory2KHR" );
@@ -13396,6 +14246,7 @@
     VULKAN_HPP_NAMESPACE::ImageDrmFormatModifierPropertiesEXT * pProperties,
     Dispatch const &                                            d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     return static_cast<Result>( d.vkGetImageDrmFormatModifierPropertiesEXT(
       m_device,
       static_cast<VkImage>( image ),
@@ -13407,6 +14258,7 @@
   VULKAN_HPP_INLINE typename ResultValueType<VULKAN_HPP_NAMESPACE::ImageDrmFormatModifierPropertiesEXT>::type
     Device::getImageDrmFormatModifierPropertiesEXT( VULKAN_HPP_NAMESPACE::Image image, Dispatch const & d ) const
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     VULKAN_HPP_NAMESPACE::ImageDrmFormatModifierPropertiesEXT properties;
     Result result = static_cast<Result>( d.vkGetImageDrmFormatModifierPropertiesEXT(
       m_device,
@@ -13426,6 +14278,7 @@
                                       VULKAN_HPP_NAMESPACE::ValidationCacheEXT *                 pValidationCache,
                                       Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     return static_cast<Result>(
       d.vkCreateValidationCacheEXT( m_device,
                                     reinterpret_cast<const VkValidationCacheCreateInfoEXT *>( pCreateInfo ),
@@ -13440,6 +14293,7 @@
                                       Optional<const AllocationCallbacks>  allocator,
                                       Dispatch const &                     d ) const
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     VULKAN_HPP_NAMESPACE::ValidationCacheEXT validationCache;
     Result                                   result = static_cast<Result>(
       d.vkCreateValidationCacheEXT( m_device,
@@ -13458,6 +14312,7 @@
                                             Optional<const AllocationCallbacks>  allocator,
                                             Dispatch const &                     d ) const
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     VULKAN_HPP_NAMESPACE::ValidationCacheEXT validationCache;
     Result                                   result = static_cast<Result>(
       d.vkCreateValidationCacheEXT( m_device,
@@ -13478,6 +14333,7 @@
                                        const VULKAN_HPP_NAMESPACE::AllocationCallbacks * pAllocator,
                                        Dispatch const &                                  d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkDestroyValidationCacheEXT( m_device,
                                    static_cast<VkValidationCacheEXT>( validationCache ),
                                    reinterpret_cast<const VkAllocationCallbacks *>( pAllocator ) );
@@ -13489,6 +14345,7 @@
                                                             Optional<const AllocationCallbacks>      allocator,
                                                             Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkDestroyValidationCacheEXT( m_device,
                                    static_cast<VkValidationCacheEXT>( validationCache ),
                                    reinterpret_cast<const VkAllocationCallbacks *>(
@@ -13501,6 +14358,7 @@
                                           const VULKAN_HPP_NAMESPACE::AllocationCallbacks * pAllocator,
                                           Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkDestroyValidationCacheEXT( m_device,
                                    static_cast<VkValidationCacheEXT>( validationCache ),
                                    reinterpret_cast<const VkAllocationCallbacks *>( pAllocator ) );
@@ -13512,6 +14370,7 @@
                                           Optional<const AllocationCallbacks>      allocator,
                                           Dispatch const &                         d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkDestroyValidationCacheEXT( m_device,
                                    static_cast<VkValidationCacheEXT>( validationCache ),
                                    reinterpret_cast<const VkAllocationCallbacks *>(
@@ -13526,6 +14385,7 @@
                                       const VULKAN_HPP_NAMESPACE::ValidationCacheEXT * pSrcCaches,
                                       Dispatch const &                                 d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     return static_cast<Result>(
       d.vkMergeValidationCachesEXT( m_device,
                                     static_cast<VkValidationCacheEXT>( dstCache ),
@@ -13540,6 +14400,7 @@
                                       ArrayProxy<const VULKAN_HPP_NAMESPACE::ValidationCacheEXT> const & srcCaches,
                                       Dispatch const &                                                   d ) const
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     Result result = static_cast<Result>(
       d.vkMergeValidationCachesEXT( m_device,
                                     static_cast<VkValidationCacheEXT>( dstCache ),
@@ -13556,6 +14417,7 @@
                                        void *                                   pData,
                                        Dispatch const &                         d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     return static_cast<Result>( d.vkGetValidationCacheDataEXT(
       m_device, static_cast<VkValidationCacheEXT>( validationCache ), pDataSize, pData ) );
   }
@@ -13566,6 +14428,7 @@
                        Device::getValidationCacheDataEXT( VULKAN_HPP_NAMESPACE::ValidationCacheEXT validationCache,
                                        Dispatch const &                         d ) const
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     std::vector<uint8_t, Uint8_tAllocator> data;
     size_t                                 dataSize;
     Result                                 result;
@@ -13600,6 +14463,7 @@
                                        Uint8_tAllocator &                       uint8_tAllocator,
                                        Dispatch const &                         d ) const
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     std::vector<uint8_t, Uint8_tAllocator> data( uint8_tAllocator );
     size_t                                 dataSize;
     Result                                 result;
@@ -13633,6 +14497,7 @@
                                                                 VULKAN_HPP_NAMESPACE::ImageLayout imageLayout,
                                                                 Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkCmdBindShadingRateImageNV(
       m_commandBuffer, static_cast<VkImageView>( imageView ), static_cast<VkImageLayout>( imageLayout ) );
   }
@@ -13644,6 +14509,7 @@
     const VULKAN_HPP_NAMESPACE::ShadingRatePaletteNV * pShadingRatePalettes,
     Dispatch const &                                   d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkCmdSetViewportShadingRatePaletteNV( m_commandBuffer,
                                             firstViewport,
                                             viewportCount,
@@ -13657,6 +14523,7 @@
     ArrayProxy<const VULKAN_HPP_NAMESPACE::ShadingRatePaletteNV> const & shadingRatePalettes,
     Dispatch const &                                                     d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkCmdSetViewportShadingRatePaletteNV(
       m_commandBuffer,
       firstViewport,
@@ -13672,6 +14539,7 @@
                                            const VULKAN_HPP_NAMESPACE::CoarseSampleOrderCustomNV * pCustomSampleOrders,
                                            Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkCmdSetCoarseSampleOrderNV( m_commandBuffer,
                                    static_cast<VkCoarseSampleOrderTypeNV>( sampleOrderType ),
                                    customSampleOrderCount,
@@ -13685,6 +14553,7 @@
     ArrayProxy<const VULKAN_HPP_NAMESPACE::CoarseSampleOrderCustomNV> const & customSampleOrders,
     Dispatch const &                                                          d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkCmdSetCoarseSampleOrderNV( m_commandBuffer,
                                    static_cast<VkCoarseSampleOrderTypeNV>( sampleOrderType ),
                                    customSampleOrders.size(),
@@ -13701,6 +14570,7 @@
                                            VULKAN_HPP_NAMESPACE::AccelerationStructureNV * pAccelerationStructure,
                                            Dispatch const &                                d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     return static_cast<Result>(
       d.vkCreateAccelerationStructureNV( m_device,
                                          reinterpret_cast<const VkAccelerationStructureCreateInfoNV *>( pCreateInfo ),
@@ -13715,6 +14585,7 @@
                                            Optional<const AllocationCallbacks>       allocator,
                                            Dispatch const &                          d ) const
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     VULKAN_HPP_NAMESPACE::AccelerationStructureNV accelerationStructure;
     Result                                        result = static_cast<Result>( d.vkCreateAccelerationStructureNV(
       m_device,
@@ -13734,6 +14605,7 @@
                                                  Optional<const AllocationCallbacks>       allocator,
                                                  Dispatch const &                          d ) const
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     VULKAN_HPP_NAMESPACE::AccelerationStructureNV accelerationStructure;
     Result                                        result = static_cast<Result>( d.vkCreateAccelerationStructureNV(
       m_device,
@@ -13757,6 +14629,7 @@
                                             const VULKAN_HPP_NAMESPACE::AllocationCallbacks * pAllocator,
                                             Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkDestroyAccelerationStructureNV( m_device,
                                         static_cast<VkAccelerationStructureNV>( accelerationStructure ),
                                         reinterpret_cast<const VkAllocationCallbacks *>( pAllocator ) );
@@ -13769,6 +14642,7 @@
                                             Optional<const AllocationCallbacks>           allocator,
                                             Dispatch const &                              d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkDestroyAccelerationStructureNV(
       m_device,
       static_cast<VkAccelerationStructureNV>( accelerationStructure ),
@@ -13782,6 +14656,7 @@
                                           const VULKAN_HPP_NAMESPACE::AllocationCallbacks * pAllocator,
                                           Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkDestroyAccelerationStructureNV( m_device,
                                         static_cast<VkAccelerationStructureNV>( accelerationStructure ),
                                         reinterpret_cast<const VkAllocationCallbacks *>( pAllocator ) );
@@ -13793,6 +14668,7 @@
                                           Optional<const AllocationCallbacks>           allocator,
                                           Dispatch const &                              d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkDestroyAccelerationStructureNV(
       m_device,
       static_cast<VkAccelerationStructureNV>( accelerationStructure ),
@@ -13807,6 +14683,7 @@
     VULKAN_HPP_NAMESPACE::MemoryRequirements2KHR *                              pMemoryRequirements,
     Dispatch const &                                                            d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkGetAccelerationStructureMemoryRequirementsNV(
       m_device,
       reinterpret_cast<const VkAccelerationStructureMemoryRequirementsInfoNV *>( pInfo ),
@@ -13819,6 +14696,7 @@
                                          Device::getAccelerationStructureMemoryRequirementsNV( const AccelerationStructureMemoryRequirementsInfoNV & info,
                                                           Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     VULKAN_HPP_NAMESPACE::MemoryRequirements2KHR memoryRequirements;
     d.vkGetAccelerationStructureMemoryRequirementsNV(
       m_device,
@@ -13832,6 +14710,7 @@
                                          Device::getAccelerationStructureMemoryRequirementsNV( const AccelerationStructureMemoryRequirementsInfoNV & info,
                                                           Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     StructureChain<X, Y, Z...>                     structureChain;
     VULKAN_HPP_NAMESPACE::MemoryRequirements2KHR & memoryRequirements =
       structureChain.template get<VULKAN_HPP_NAMESPACE::MemoryRequirements2KHR>();
@@ -13849,6 +14728,7 @@
     const VULKAN_HPP_NAMESPACE::BindAccelerationStructureMemoryInfoNV * pBindInfos,
     Dispatch const &                                                    d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     return static_cast<Result>( d.vkBindAccelerationStructureMemoryNV(
       m_device, bindInfoCount, reinterpret_cast<const VkBindAccelerationStructureMemoryInfoNV *>( pBindInfos ) ) );
   }
@@ -13860,6 +14740,7 @@
       ArrayProxy<const VULKAN_HPP_NAMESPACE::BindAccelerationStructureMemoryInfoNV> const & bindInfos,
       Dispatch const &                                                                      d ) const
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     Result result = static_cast<Result>( d.vkBindAccelerationStructureMemoryNV(
       m_device,
       bindInfos.size(),
@@ -13880,6 +14761,7 @@
                                                  VULKAN_HPP_NAMESPACE::DeviceSize              scratchOffset,
                                                  Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkCmdBuildAccelerationStructureNV( m_commandBuffer,
                                          reinterpret_cast<const VkAccelerationStructureInfoNV *>( pInfo ),
                                          static_cast<VkBuffer>( instanceData ),
@@ -13903,6 +14785,7 @@
                                                                       VULKAN_HPP_NAMESPACE::DeviceSize scratchOffset,
                                                                       Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkCmdBuildAccelerationStructureNV( m_commandBuffer,
                                          reinterpret_cast<const VkAccelerationStructureInfoNV *>( &info ),
                                          static_cast<VkBuffer>( instanceData ),
@@ -13922,6 +14805,7 @@
                                                 VULKAN_HPP_NAMESPACE::CopyAccelerationStructureModeKHR mode,
                                                 Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkCmdCopyAccelerationStructureNV( m_commandBuffer,
                                         static_cast<VkAccelerationStructureNV>( dst ),
                                         static_cast<VkAccelerationStructureNV>( src ),
@@ -13945,6 +14829,7 @@
                                                      uint32_t                         depth,
                                                      Dispatch const &                 d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkCmdTraceRaysNV( m_commandBuffer,
                         static_cast<VkBuffer>( raygenShaderBindingTableBuffer ),
                         static_cast<VkDeviceSize>( raygenShaderBindingOffset ),
@@ -13971,6 +14856,7 @@
                                          VULKAN_HPP_NAMESPACE::Pipeline *                             pPipelines,
                                          Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     return static_cast<Result>(
       d.vkCreateRayTracingPipelinesNV( m_device,
                                        static_cast<VkPipelineCache>( pipelineCache ),
@@ -13989,6 +14875,7 @@
       Optional<const AllocationCallbacks>                                            allocator,
       Dispatch const &                                                               d ) const
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     std::vector<Pipeline, PipelineAllocator> pipelines( createInfos.size() );
     Result                                   result = static_cast<Result>(
       d.vkCreateRayTracingPipelinesNV( m_device,
@@ -14017,6 +14904,7 @@
       PipelineAllocator &                                                            pipelineAllocator,
       Dispatch const &                                                               d ) const
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     std::vector<Pipeline, PipelineAllocator> pipelines( createInfos.size(), pipelineAllocator );
     Result                                   result = static_cast<Result>(
       d.vkCreateRayTracingPipelinesNV( m_device,
@@ -14040,6 +14928,7 @@
                                         Optional<const AllocationCallbacks>                          allocator,
                                         Dispatch const &                                             d ) const
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     Pipeline pipeline;
     Result   result = static_cast<Result>(
       d.vkCreateRayTracingPipelinesNV( m_device,
@@ -14065,6 +14954,7 @@
       Optional<const AllocationCallbacks>                                            allocator,
       Dispatch const &                                                               d ) const
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     std::vector<UniqueHandle<Pipeline, Dispatch>, PipelineAllocator> uniquePipelines;
     std::vector<Pipeline>                                            pipelines( createInfos.size() );
     Result                                                           result = static_cast<Result>(
@@ -14105,6 +14995,7 @@
       PipelineAllocator &                                                            pipelineAllocator,
       Dispatch const &                                                               d ) const
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     std::vector<UniqueHandle<Pipeline, Dispatch>, PipelineAllocator> uniquePipelines( pipelineAllocator );
     std::vector<Pipeline>                                            pipelines( createInfos.size() );
     Result                                                           result = static_cast<Result>(
@@ -14139,6 +15030,7 @@
                                               Optional<const AllocationCallbacks>                          allocator,
                                               Dispatch const &                                             d ) const
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     Pipeline pipeline;
     Result   result = static_cast<Result>(
       d.vkCreateRayTracingPipelinesNV( m_device,
@@ -14168,6 +15060,7 @@
                                                void *                         pData,
                                                Dispatch const &               d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     return static_cast<Result>( d.vkGetRayTracingShaderGroupHandlesNV(
       m_device, static_cast<VkPipeline>( pipeline ), firstGroup, groupCount, dataSize, pData ) );
   }
@@ -14183,6 +15076,7 @@
       ArrayProxy<T> const &          data,
       Dispatch const &               d ) const
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     Result result =
       static_cast<Result>( d.vkGetRayTracingShaderGroupHandlesNV( m_device,
                                                                   static_cast<VkPipeline>( pipeline ),
@@ -14201,6 +15095,7 @@
                                                size_t                         dataSize,
                                                Dispatch const &               d ) const
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     VULKAN_HPP_ASSERT( dataSize % sizeof( T ) == 0 );
     std::vector<T, Allocator> data( dataSize / sizeof( T ) );
     Result                    result =
@@ -14220,6 +15115,7 @@
                                               uint32_t                       groupCount,
                                               Dispatch const &               d ) const
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     T      data;
     Result result = static_cast<Result>( d.vkGetRayTracingShaderGroupHandlesNV( m_device,
                                                                                 static_cast<VkPipeline>( pipeline ),
@@ -14238,6 +15134,7 @@
                                               void *                                        pData,
                                               Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     return static_cast<Result>( d.vkGetAccelerationStructureHandleNV(
       m_device, static_cast<VkAccelerationStructureNV>( accelerationStructure ), dataSize, pData ) );
   }
@@ -14251,6 +15148,7 @@
       ArrayProxy<T> const &                         data,
       Dispatch const &                              d ) const
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     Result result = static_cast<Result>(
       d.vkGetAccelerationStructureHandleNV( m_device,
                                             static_cast<VkAccelerationStructureNV>( accelerationStructure ),
@@ -14265,6 +15163,7 @@
                                               size_t                                        dataSize,
                                               Dispatch const &                              d ) const
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     VULKAN_HPP_ASSERT( dataSize % sizeof( T ) == 0 );
     std::vector<T, Allocator> data( dataSize / sizeof( T ) );
     Result                    result = static_cast<Result>(
@@ -14280,6 +15179,7 @@
                                           Device::getAccelerationStructureHandleNV( VULKAN_HPP_NAMESPACE::AccelerationStructureNV accelerationStructure,
                                               Dispatch const &                              d ) const
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     T      data;
     Result result = static_cast<Result>(
       d.vkGetAccelerationStructureHandleNV( m_device,
@@ -14299,6 +15199,7 @@
     uint32_t                                              firstQuery,
     Dispatch const &                                      d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkCmdWriteAccelerationStructuresPropertiesNV(
       m_commandBuffer,
       accelerationStructureCount,
@@ -14317,6 +15218,7 @@
     uint32_t                                                                firstQuery,
     Dispatch const &                                                        d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkCmdWriteAccelerationStructuresPropertiesNV(
       m_commandBuffer,
       accelerationStructures.size(),
@@ -14332,6 +15234,7 @@
   VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE Result Device::compileDeferredNV(
     VULKAN_HPP_NAMESPACE::Pipeline pipeline, uint32_t shader, Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     return static_cast<Result>( d.vkCompileDeferredNV( m_device, static_cast<VkPipeline>( pipeline ), shader ) );
   }
 #else
@@ -14339,6 +15242,7 @@
   VULKAN_HPP_NODISCARD_WHEN_NO_EXCEPTIONS VULKAN_HPP_INLINE typename ResultValueType<void>::type
                                           Device::compileDeferredNV( VULKAN_HPP_NAMESPACE::Pipeline pipeline, uint32_t shader, Dispatch const & d ) const
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     Result result =
       static_cast<Result>( d.vkCompileDeferredNV( m_device, static_cast<VkPipeline>( pipeline ), shader ) );
     return createResultValue( result, VULKAN_HPP_NAMESPACE_STRING "::Device::compileDeferredNV" );
@@ -14353,6 +15257,7 @@
                                               VULKAN_HPP_NAMESPACE::DescriptorSetLayoutSupport *          pSupport,
                                               Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkGetDescriptorSetLayoutSupportKHR( m_device,
                                           reinterpret_cast<const VkDescriptorSetLayoutCreateInfo *>( pCreateInfo ),
                                           reinterpret_cast<VkDescriptorSetLayoutSupport *>( pSupport ) );
@@ -14364,6 +15269,7 @@
                                          Device::getDescriptorSetLayoutSupportKHR( const DescriptorSetLayoutCreateInfo & createInfo,
                                               Dispatch const &                      d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     VULKAN_HPP_NAMESPACE::DescriptorSetLayoutSupport support;
     d.vkGetDescriptorSetLayoutSupportKHR( m_device,
                                           reinterpret_cast<const VkDescriptorSetLayoutCreateInfo *>( &createInfo ),
@@ -14376,6 +15282,7 @@
                                          Device::getDescriptorSetLayoutSupportKHR( const DescriptorSetLayoutCreateInfo & createInfo,
                                               Dispatch const &                      d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     StructureChain<X, Y, Z...>                         structureChain;
     VULKAN_HPP_NAMESPACE::DescriptorSetLayoutSupport & support =
       structureChain.template get<VULKAN_HPP_NAMESPACE::DescriptorSetLayoutSupport>();
@@ -14397,6 +15304,7 @@
                                                               uint32_t                         stride,
                                                               Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkCmdDrawIndirectCountKHR( m_commandBuffer,
                                  static_cast<VkBuffer>( buffer ),
                                  static_cast<VkDeviceSize>( offset ),
@@ -14415,6 +15323,7 @@
                                                                      uint32_t                         stride,
                                                                      Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkCmdDrawIndexedIndirectCountKHR( m_commandBuffer,
                                         static_cast<VkBuffer>( buffer ),
                                         static_cast<VkDeviceSize>( offset ),
@@ -14433,6 +15342,7 @@
     VULKAN_HPP_NAMESPACE::MemoryHostPointerPropertiesEXT * pMemoryHostPointerProperties,
     Dispatch const &                                       d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     return static_cast<Result>( d.vkGetMemoryHostPointerPropertiesEXT(
       m_device,
       static_cast<VkExternalMemoryHandleTypeFlagBits>( handleType ),
@@ -14448,6 +15358,7 @@
                                                const void *                                           pHostPointer,
                                                Dispatch const &                                       d ) const
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     VULKAN_HPP_NAMESPACE::MemoryHostPointerPropertiesEXT memoryHostPointerProperties;
     Result result = static_cast<Result>( d.vkGetMemoryHostPointerPropertiesEXT(
       m_device,
@@ -14468,6 +15379,7 @@
                                                               uint32_t                                    marker,
                                                               Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkCmdWriteBufferMarkerAMD( m_commandBuffer,
                                  static_cast<VkPipelineStageFlagBits>( pipelineStage ),
                                  static_cast<VkBuffer>( dstBuffer ),
@@ -14483,6 +15395,7 @@
                                                     VULKAN_HPP_NAMESPACE::TimeDomainEXT * pTimeDomains,
                                                     Dispatch const &                      d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     return static_cast<Result>( d.vkGetPhysicalDeviceCalibrateableTimeDomainsEXT(
       m_physicalDevice, pTimeDomainCount, reinterpret_cast<VkTimeDomainEXT *>( pTimeDomains ) ) );
   }
@@ -14493,6 +15406,7 @@
     typename ResultValueType<std::vector<TimeDomainEXT, TimeDomainEXTAllocator>>::type
     PhysicalDevice::getCalibrateableTimeDomainsEXT( Dispatch const & d ) const
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     std::vector<TimeDomainEXT, TimeDomainEXTAllocator> timeDomains;
     uint32_t                                           timeDomainCount;
     Result                                             result;
@@ -14525,6 +15439,7 @@
     PhysicalDevice::getCalibrateableTimeDomainsEXT( TimeDomainEXTAllocator & timeDomainEXTAllocator,
                                                     Dispatch const &         d ) const
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     std::vector<TimeDomainEXT, TimeDomainEXTAllocator> timeDomains( timeDomainEXTAllocator );
     uint32_t                                           timeDomainCount;
     Result                                             result;
@@ -14557,6 +15472,7 @@
                                         uint64_t *                                               pMaxDeviation,
                                         Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     return static_cast<Result>(
       d.vkGetCalibratedTimestampsEXT( m_device,
                                       timestampCount,
@@ -14574,6 +15490,7 @@
       ArrayProxy<uint64_t> const &                                               timestamps,
       Dispatch const &                                                           d ) const
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
 #  ifdef VULKAN_HPP_NO_EXCEPTIONS
     VULKAN_HPP_ASSERT( timestampInfos.size() == timestamps.size() );
 #  else
@@ -14601,6 +15518,7 @@
       ArrayProxy<const VULKAN_HPP_NAMESPACE::CalibratedTimestampInfoEXT> const & timestampInfos,
       Dispatch const &                                                           d ) const
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     std::pair<std::vector<uint64_t, Uint64_tAllocator>, uint64_t> data(
       std::piecewise_construct, std::forward_as_tuple( timestampInfos.size() ), std::forward_as_tuple( 0 ) );
     std::vector<uint64_t, Uint64_tAllocator> & timestamps   = data.first;
@@ -14625,6 +15543,7 @@
       Uint64_tAllocator &                                                        uint64_tAllocator,
       Dispatch const &                                                           d ) const
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     std::pair<std::vector<uint64_t, Uint64_tAllocator>, uint64_t> data(
       std::piecewise_construct,
       std::forward_as_tuple( timestampInfos.size(), uint64_tAllocator ),
@@ -14648,6 +15567,7 @@
                                                          uint32_t         firstTask,
                                                          Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkCmdDrawMeshTasksNV( m_commandBuffer, taskCount, firstTask );
   }
 
@@ -14658,6 +15578,7 @@
                                                                  uint32_t                         stride,
                                                                  Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkCmdDrawMeshTasksIndirectNV(
       m_commandBuffer, static_cast<VkBuffer>( buffer ), static_cast<VkDeviceSize>( offset ), drawCount, stride );
   }
@@ -14672,6 +15593,7 @@
                                                  uint32_t                         stride,
                                                  Dispatch const &                 d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkCmdDrawMeshTasksIndirectCountNV( m_commandBuffer,
                                          static_cast<VkBuffer>( buffer ),
                                          static_cast<VkDeviceSize>( offset ),
@@ -14689,6 +15611,7 @@
                                                                const VULKAN_HPP_NAMESPACE::Rect2D * pExclusiveScissors,
                                                                Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkCmdSetExclusiveScissorNV( m_commandBuffer,
                                   firstExclusiveScissor,
                                   exclusiveScissorCount,
@@ -14702,6 +15625,7 @@
                                           ArrayProxy<const VULKAN_HPP_NAMESPACE::Rect2D> const & exclusiveScissors,
                                           Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkCmdSetExclusiveScissorNV( m_commandBuffer,
                                   firstExclusiveScissor,
                                   exclusiveScissors.size(),
@@ -14715,6 +15639,7 @@
   VULKAN_HPP_INLINE void CommandBuffer::setCheckpointNV( const void *     pCheckpointMarker,
                                                          Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkCmdSetCheckpointNV( m_commandBuffer, pCheckpointMarker );
   }
 
@@ -14723,6 +15648,7 @@
                                                      VULKAN_HPP_NAMESPACE::CheckpointDataNV * pCheckpointData,
                                                      Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkGetQueueCheckpointDataNV(
       m_queue, pCheckpointDataCount, reinterpret_cast<VkCheckpointDataNV *>( pCheckpointData ) );
   }
@@ -14732,6 +15658,7 @@
   VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE std::vector<CheckpointDataNV, CheckpointDataNVAllocator>
                                          Queue::getCheckpointDataNV( Dispatch const & d ) const
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     std::vector<CheckpointDataNV, CheckpointDataNVAllocator> checkpointData;
     uint32_t                                                 checkpointDataCount;
     d.vkGetQueueCheckpointDataNV( m_queue, &checkpointDataCount, nullptr );
@@ -14749,6 +15676,7 @@
   VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE std::vector<CheckpointDataNV, CheckpointDataNVAllocator>
                                          Queue::getCheckpointDataNV( CheckpointDataNVAllocator & checkpointDataNVAllocator, Dispatch const & d ) const
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     std::vector<CheckpointDataNV, CheckpointDataNVAllocator> checkpointData( checkpointDataNVAllocator );
     uint32_t                                                 checkpointDataCount;
     d.vkGetQueueCheckpointDataNV( m_queue, &checkpointDataCount, nullptr );
@@ -14766,6 +15694,7 @@
   VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE Result Device::getSemaphoreCounterValueKHR(
     VULKAN_HPP_NAMESPACE::Semaphore semaphore, uint64_t * pValue, Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     return static_cast<Result>(
       d.vkGetSemaphoreCounterValueKHR( m_device, static_cast<VkSemaphore>( semaphore ), pValue ) );
   }
@@ -14775,6 +15704,7 @@
   VULKAN_HPP_NODISCARD_WHEN_NO_EXCEPTIONS VULKAN_HPP_INLINE typename ResultValueType<uint64_t>::type
                                           Device::getSemaphoreCounterValueKHR( VULKAN_HPP_NAMESPACE::Semaphore semaphore, Dispatch const & d ) const
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     uint64_t value;
     Result   result =
       static_cast<Result>( d.vkGetSemaphoreCounterValueKHR( m_device, static_cast<VkSemaphore>( semaphore ), &value ) );
@@ -14788,6 +15718,7 @@
                                uint64_t                                        timeout,
                                Dispatch const &                                d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     return static_cast<Result>(
       d.vkWaitSemaphoresKHR( m_device, reinterpret_cast<const VkSemaphoreWaitInfo *>( pWaitInfo ), timeout ) );
   }
@@ -14798,6 +15729,7 @@
                                                                            uint64_t                  timeout,
                                                                            Dispatch const &          d ) const
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     Result result = static_cast<Result>(
       d.vkWaitSemaphoresKHR( m_device, reinterpret_cast<const VkSemaphoreWaitInfo *>( &waitInfo ), timeout ) );
     return createResultValue( result,
@@ -14810,6 +15742,7 @@
   VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE Result Device::signalSemaphoreKHR(
     const VULKAN_HPP_NAMESPACE::SemaphoreSignalInfo * pSignalInfo, Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     return static_cast<Result>(
       d.vkSignalSemaphoreKHR( m_device, reinterpret_cast<const VkSemaphoreSignalInfo *>( pSignalInfo ) ) );
   }
@@ -14819,6 +15752,7 @@
   VULKAN_HPP_NODISCARD_WHEN_NO_EXCEPTIONS VULKAN_HPP_INLINE typename ResultValueType<void>::type
                                           Device::signalSemaphoreKHR( const SemaphoreSignalInfo & signalInfo, Dispatch const & d ) const
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     Result result = static_cast<Result>(
       d.vkSignalSemaphoreKHR( m_device, reinterpret_cast<const VkSemaphoreSignalInfo *>( &signalInfo ) ) );
     return createResultValue( result, VULKAN_HPP_NAMESPACE_STRING "::Device::signalSemaphoreKHR" );
@@ -14832,6 +15766,7 @@
     const VULKAN_HPP_NAMESPACE::InitializePerformanceApiInfoINTEL * pInitializeInfo,
     Dispatch const &                                                d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     return static_cast<Result>( d.vkInitializePerformanceApiINTEL(
       m_device, reinterpret_cast<const VkInitializePerformanceApiInfoINTEL *>( pInitializeInfo ) ) );
   }
@@ -14842,6 +15777,7 @@
                                           Device::initializePerformanceApiINTEL( const InitializePerformanceApiInfoINTEL & initializeInfo,
                                            Dispatch const &                          d ) const
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     Result result = static_cast<Result>( d.vkInitializePerformanceApiINTEL(
       m_device, reinterpret_cast<const VkInitializePerformanceApiInfoINTEL *>( &initializeInfo ) ) );
     return createResultValue( result, VULKAN_HPP_NAMESPACE_STRING "::Device::initializePerformanceApiINTEL" );
@@ -14851,6 +15787,7 @@
   template <typename Dispatch>
   VULKAN_HPP_INLINE void Device::uninitializePerformanceApiINTEL( Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkUninitializePerformanceApiINTEL( m_device );
   }
 
@@ -14858,6 +15795,7 @@
   VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE Result CommandBuffer::setPerformanceMarkerINTEL(
     const VULKAN_HPP_NAMESPACE::PerformanceMarkerInfoINTEL * pMarkerInfo, Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     return static_cast<Result>( d.vkCmdSetPerformanceMarkerINTEL(
       m_commandBuffer, reinterpret_cast<const VkPerformanceMarkerInfoINTEL *>( pMarkerInfo ) ) );
   }
@@ -14867,6 +15805,7 @@
   VULKAN_HPP_NODISCARD_WHEN_NO_EXCEPTIONS VULKAN_HPP_INLINE typename ResultValueType<void>::type
                                           CommandBuffer::setPerformanceMarkerINTEL( const PerformanceMarkerInfoINTEL & markerInfo, Dispatch const & d ) const
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     Result result = static_cast<Result>( d.vkCmdSetPerformanceMarkerINTEL(
       m_commandBuffer, reinterpret_cast<const VkPerformanceMarkerInfoINTEL *>( &markerInfo ) ) );
     return createResultValue( result, VULKAN_HPP_NAMESPACE_STRING "::CommandBuffer::setPerformanceMarkerINTEL" );
@@ -14878,6 +15817,7 @@
     const VULKAN_HPP_NAMESPACE::PerformanceStreamMarkerInfoINTEL * pMarkerInfo,
     Dispatch const &                                               d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     return static_cast<Result>( d.vkCmdSetPerformanceStreamMarkerINTEL(
       m_commandBuffer, reinterpret_cast<const VkPerformanceStreamMarkerInfoINTEL *>( pMarkerInfo ) ) );
   }
@@ -14888,6 +15828,7 @@
                                           CommandBuffer::setPerformanceStreamMarkerINTEL( const PerformanceStreamMarkerInfoINTEL & markerInfo,
                                                     Dispatch const &                         d ) const
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     Result result = static_cast<Result>( d.vkCmdSetPerformanceStreamMarkerINTEL(
       m_commandBuffer, reinterpret_cast<const VkPerformanceStreamMarkerInfoINTEL *>( &markerInfo ) ) );
     return createResultValue( result, VULKAN_HPP_NAMESPACE_STRING "::CommandBuffer::setPerformanceStreamMarkerINTEL" );
@@ -14899,6 +15840,7 @@
     const VULKAN_HPP_NAMESPACE::PerformanceOverrideInfoINTEL * pOverrideInfo,
     Dispatch const &                                           d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     return static_cast<Result>( d.vkCmdSetPerformanceOverrideINTEL(
       m_commandBuffer, reinterpret_cast<const VkPerformanceOverrideInfoINTEL *>( pOverrideInfo ) ) );
   }
@@ -14909,6 +15851,7 @@
                                           CommandBuffer::setPerformanceOverrideINTEL( const PerformanceOverrideInfoINTEL & overrideInfo,
                                                 Dispatch const &                     d ) const
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     Result result = static_cast<Result>( d.vkCmdSetPerformanceOverrideINTEL(
       m_commandBuffer, reinterpret_cast<const VkPerformanceOverrideInfoINTEL *>( &overrideInfo ) ) );
     return createResultValue( result, VULKAN_HPP_NAMESPACE_STRING "::CommandBuffer::setPerformanceOverrideINTEL" );
@@ -14921,6 +15864,7 @@
     VULKAN_HPP_NAMESPACE::PerformanceConfigurationINTEL *                  pConfiguration,
     Dispatch const &                                                       d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     return static_cast<Result>( d.vkAcquirePerformanceConfigurationINTEL(
       m_device,
       reinterpret_cast<const VkPerformanceConfigurationAcquireInfoINTEL *>( pAcquireInfo ),
@@ -14934,6 +15878,7 @@
     Device::acquirePerformanceConfigurationINTEL( const PerformanceConfigurationAcquireInfoINTEL & acquireInfo,
                                                   Dispatch const &                                 d ) const
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     VULKAN_HPP_NAMESPACE::PerformanceConfigurationINTEL configuration;
     Result result = static_cast<Result>( d.vkAcquirePerformanceConfigurationINTEL(
       m_device,
@@ -14950,6 +15895,7 @@
     Device::acquirePerformanceConfigurationINTELUnique( const PerformanceConfigurationAcquireInfoINTEL & acquireInfo,
                                                         Dispatch const &                                 d ) const
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     VULKAN_HPP_NAMESPACE::PerformanceConfigurationINTEL configuration;
     Result                          result = static_cast<Result>( d.vkAcquirePerformanceConfigurationINTEL(
       m_device,
@@ -14970,6 +15916,7 @@
   VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE Result Device::releasePerformanceConfigurationINTEL(
     VULKAN_HPP_NAMESPACE::PerformanceConfigurationINTEL configuration, Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     return static_cast<Result>( d.vkReleasePerformanceConfigurationINTEL(
       m_device, static_cast<VkPerformanceConfigurationINTEL>( configuration ) ) );
   }
@@ -14979,6 +15926,7 @@
                                           Device::releasePerformanceConfigurationINTEL( VULKAN_HPP_NAMESPACE::PerformanceConfigurationINTEL configuration,
                                                   Dispatch const &                                    d ) const
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     Result result = static_cast<Result>( d.vkReleasePerformanceConfigurationINTEL(
       m_device, static_cast<VkPerformanceConfigurationINTEL>( configuration ) ) );
     return createResultValue( result, VULKAN_HPP_NAMESPACE_STRING "::Device::releasePerformanceConfigurationINTEL" );
@@ -14990,6 +15938,7 @@
   VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE Result Device::release(
     VULKAN_HPP_NAMESPACE::PerformanceConfigurationINTEL configuration, Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     return static_cast<Result>( d.vkReleasePerformanceConfigurationINTEL(
       m_device, static_cast<VkPerformanceConfigurationINTEL>( configuration ) ) );
   }
@@ -14998,6 +15947,7 @@
   VULKAN_HPP_NODISCARD_WHEN_NO_EXCEPTIONS VULKAN_HPP_INLINE typename ResultValueType<void>::type
                                           Device::release( VULKAN_HPP_NAMESPACE::PerformanceConfigurationINTEL configuration, Dispatch const & d ) const
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     Result result = static_cast<Result>( d.vkReleasePerformanceConfigurationINTEL(
       m_device, static_cast<VkPerformanceConfigurationINTEL>( configuration ) ) );
     return createResultValue( result, VULKAN_HPP_NAMESPACE_STRING "::Device::release" );
@@ -15009,6 +15959,7 @@
   VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE Result Queue::setPerformanceConfigurationINTEL(
     VULKAN_HPP_NAMESPACE::PerformanceConfigurationINTEL configuration, Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     return static_cast<Result>( d.vkQueueSetPerformanceConfigurationINTEL(
       m_queue, static_cast<VkPerformanceConfigurationINTEL>( configuration ) ) );
   }
@@ -15018,6 +15969,7 @@
                                           Queue::setPerformanceConfigurationINTEL( VULKAN_HPP_NAMESPACE::PerformanceConfigurationINTEL configuration,
                                              Dispatch const &                                    d ) const
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     Result result = static_cast<Result>( d.vkQueueSetPerformanceConfigurationINTEL(
       m_queue, static_cast<VkPerformanceConfigurationINTEL>( configuration ) ) );
     return createResultValue( result, VULKAN_HPP_NAMESPACE_STRING "::Queue::setPerformanceConfigurationINTEL" );
@@ -15030,6 +15982,7 @@
                                           VULKAN_HPP_NAMESPACE::PerformanceValueINTEL *       pValue,
                                           Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     return static_cast<Result>(
       d.vkGetPerformanceParameterINTEL( m_device,
                                         static_cast<VkPerformanceParameterTypeINTEL>( parameter ),
@@ -15043,6 +15996,7 @@
     Device::getPerformanceParameterINTEL( VULKAN_HPP_NAMESPACE::PerformanceParameterTypeINTEL parameter,
                                           Dispatch const &                                    d ) const
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     VULKAN_HPP_NAMESPACE::PerformanceValueINTEL value;
     Result                                      result =
       static_cast<Result>( d.vkGetPerformanceParameterINTEL( m_device,
@@ -15059,6 +16013,7 @@
                                                      VULKAN_HPP_NAMESPACE::Bool32       localDimmingEnable,
                                                      Dispatch const &                   d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkSetLocalDimmingAMD(
       m_device, static_cast<VkSwapchainKHR>( swapChain ), static_cast<VkBool32>( localDimmingEnable ) );
   }
@@ -15073,6 +16028,7 @@
     VULKAN_HPP_NAMESPACE::SurfaceKHR *                              pSurface,
     Dispatch const &                                                d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     return static_cast<Result>(
       d.vkCreateImagePipeSurfaceFUCHSIA( m_instance,
                                          reinterpret_cast<const VkImagePipeSurfaceCreateInfoFUCHSIA *>( pCreateInfo ),
@@ -15088,6 +16044,7 @@
                                              Optional<const AllocationCallbacks>       allocator,
                                              Dispatch const &                          d ) const
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     VULKAN_HPP_NAMESPACE::SurfaceKHR surface;
     Result                           result = static_cast<Result>( d.vkCreateImagePipeSurfaceFUCHSIA(
       m_instance,
@@ -15107,6 +16064,7 @@
                                                    Optional<const AllocationCallbacks>       allocator,
                                                    Dispatch const &                          d ) const
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     VULKAN_HPP_NAMESPACE::SurfaceKHR  surface;
     Result                            result = static_cast<Result>( d.vkCreateImagePipeSurfaceFUCHSIA(
       m_instance,
@@ -15132,6 +16090,7 @@
                                      VULKAN_HPP_NAMESPACE::SurfaceKHR *                      pSurface,
                                      Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     return static_cast<Result>(
       d.vkCreateMetalSurfaceEXT( m_instance,
                                  reinterpret_cast<const VkMetalSurfaceCreateInfoEXT *>( pCreateInfo ),
@@ -15147,6 +16106,7 @@
                                      Optional<const AllocationCallbacks> allocator,
                                      Dispatch const &                    d ) const
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     VULKAN_HPP_NAMESPACE::SurfaceKHR surface;
     Result                           result = static_cast<Result>(
       d.vkCreateMetalSurfaceEXT( m_instance,
@@ -15165,6 +16125,7 @@
                                            Optional<const AllocationCallbacks> allocator,
                                            Dispatch const &                    d ) const
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     VULKAN_HPP_NAMESPACE::SurfaceKHR surface;
     Result                           result = static_cast<Result>(
       d.vkCreateMetalSurfaceEXT( m_instance,
@@ -15188,6 +16149,7 @@
     VULKAN_HPP_NAMESPACE::PhysicalDeviceFragmentShadingRateKHR * pFragmentShadingRates,
     Dispatch const &                                             d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     return static_cast<Result>( d.vkGetPhysicalDeviceFragmentShadingRatesKHR(
       m_physicalDevice,
       pFragmentShadingRateCount,
@@ -15200,6 +16162,7 @@
     std::vector<PhysicalDeviceFragmentShadingRateKHR, PhysicalDeviceFragmentShadingRateKHRAllocator>>::type
     PhysicalDevice::getFragmentShadingRatesKHR( Dispatch const & d ) const
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     std::vector<PhysicalDeviceFragmentShadingRateKHR, PhysicalDeviceFragmentShadingRateKHRAllocator>
              fragmentShadingRates;
     uint32_t fragmentShadingRateCount;
@@ -15237,6 +16200,7 @@
       PhysicalDeviceFragmentShadingRateKHRAllocator & physicalDeviceFragmentShadingRateKHRAllocator,
       Dispatch const &                                d ) const
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     std::vector<PhysicalDeviceFragmentShadingRateKHR, PhysicalDeviceFragmentShadingRateKHRAllocator>
              fragmentShadingRates( physicalDeviceFragmentShadingRateKHRAllocator );
     uint32_t fragmentShadingRateCount;
@@ -15270,6 +16234,7 @@
     const VULKAN_HPP_NAMESPACE::FragmentShadingRateCombinerOpKHR combinerOps[2],
     Dispatch const &                                             d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkCmdSetFragmentShadingRateKHR( m_commandBuffer,
                                       reinterpret_cast<const VkExtent2D *>( pFragmentSize ),
                                       reinterpret_cast<const VkFragmentShadingRateCombinerOpKHR *>( combinerOps ) );
@@ -15282,6 +16247,7 @@
     const VULKAN_HPP_NAMESPACE::FragmentShadingRateCombinerOpKHR combinerOps[2],
     Dispatch const &                                             d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkCmdSetFragmentShadingRateKHR( m_commandBuffer,
                                       reinterpret_cast<const VkExtent2D *>( &fragmentSize ),
                                       reinterpret_cast<const VkFragmentShadingRateCombinerOpKHR *>( combinerOps ) );
@@ -15294,6 +16260,7 @@
   VULKAN_HPP_INLINE DeviceAddress Device::getBufferAddressEXT(
     const VULKAN_HPP_NAMESPACE::BufferDeviceAddressInfo * pInfo, Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     return static_cast<DeviceAddress>(
       d.vkGetBufferDeviceAddressEXT( m_device, reinterpret_cast<const VkBufferDeviceAddressInfo *>( pInfo ) ) );
   }
@@ -15303,6 +16270,7 @@
   VULKAN_HPP_INLINE DeviceAddress Device::getBufferAddressEXT( const BufferDeviceAddressInfo & info,
                                                                Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     return d.vkGetBufferDeviceAddressEXT( m_device, reinterpret_cast<const VkBufferDeviceAddressInfo *>( &info ) );
   }
 #endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/
@@ -15315,6 +16283,7 @@
                                           VULKAN_HPP_NAMESPACE::PhysicalDeviceToolPropertiesEXT * pToolProperties,
                                           Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     return static_cast<Result>( d.vkGetPhysicalDeviceToolPropertiesEXT(
       m_physicalDevice, pToolCount, reinterpret_cast<VkPhysicalDeviceToolPropertiesEXT *>( pToolProperties ) ) );
   }
@@ -15325,6 +16294,7 @@
     std::vector<PhysicalDeviceToolPropertiesEXT, PhysicalDeviceToolPropertiesEXTAllocator>>::type
     PhysicalDevice::getToolPropertiesEXT( Dispatch const & d ) const
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     std::vector<PhysicalDeviceToolPropertiesEXT, PhysicalDeviceToolPropertiesEXTAllocator> toolProperties;
     uint32_t                                                                               toolCount;
     Result                                                                                 result;
@@ -15359,6 +16329,7 @@
     PhysicalDevice::getToolPropertiesEXT(
       PhysicalDeviceToolPropertiesEXTAllocator & physicalDeviceToolPropertiesEXTAllocator, Dispatch const & d ) const
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     std::vector<PhysicalDeviceToolPropertiesEXT, PhysicalDeviceToolPropertiesEXTAllocator> toolProperties(
       physicalDeviceToolPropertiesEXTAllocator );
     uint32_t toolCount;
@@ -15385,6 +16356,36 @@
   }
 #endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/
 
+  //=== VK_KHR_present_wait ===
+
+#ifdef VULKAN_HPP_DISABLE_ENHANCED_MODE
+  template <typename Dispatch>
+  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE Result
+                                         Device::waitForPresentKHR( VULKAN_HPP_NAMESPACE::SwapchainKHR swapchain,
+                               uint64_t                           presentId,
+                               uint64_t                           timeout,
+                               Dispatch const &                   d ) const VULKAN_HPP_NOEXCEPT
+  {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
+    return static_cast<Result>(
+      d.vkWaitForPresentKHR( m_device, static_cast<VkSwapchainKHR>( swapchain ), presentId, timeout ) );
+  }
+#else
+  template <typename Dispatch>
+  VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE Result Device::waitForPresentKHR( VULKAN_HPP_NAMESPACE::SwapchainKHR swapchain,
+                                                                           uint64_t                           presentId,
+                                                                           uint64_t                           timeout,
+                                                                           Dispatch const &                   d ) const
+  {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
+    Result result = static_cast<Result>(
+      d.vkWaitForPresentKHR( m_device, static_cast<VkSwapchainKHR>( swapchain ), presentId, timeout ) );
+    return createResultValue( result,
+                              VULKAN_HPP_NAMESPACE_STRING "::Device::waitForPresentKHR",
+                              { VULKAN_HPP_NAMESPACE::Result::eSuccess, VULKAN_HPP_NAMESPACE::Result::eTimeout } );
+  }
+#endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/
+
   //=== VK_NV_cooperative_matrix ===
 
   template <typename Dispatch>
@@ -15393,6 +16394,7 @@
                                                       VULKAN_HPP_NAMESPACE::CooperativeMatrixPropertiesNV * pProperties,
                                                       Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     return static_cast<Result>( d.vkGetPhysicalDeviceCooperativeMatrixPropertiesNV(
       m_physicalDevice, pPropertyCount, reinterpret_cast<VkCooperativeMatrixPropertiesNV *>( pProperties ) ) );
   }
@@ -15403,6 +16405,7 @@
     typename ResultValueType<std::vector<CooperativeMatrixPropertiesNV, CooperativeMatrixPropertiesNVAllocator>>::type
     PhysicalDevice::getCooperativeMatrixPropertiesNV( Dispatch const & d ) const
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     std::vector<CooperativeMatrixPropertiesNV, CooperativeMatrixPropertiesNVAllocator> properties;
     uint32_t                                                                           propertyCount;
     Result                                                                             result;
@@ -15438,6 +16441,7 @@
     PhysicalDevice::getCooperativeMatrixPropertiesNV(
       CooperativeMatrixPropertiesNVAllocator & cooperativeMatrixPropertiesNVAllocator, Dispatch const & d ) const
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     std::vector<CooperativeMatrixPropertiesNV, CooperativeMatrixPropertiesNVAllocator> properties(
       cooperativeMatrixPropertiesNVAllocator );
     uint32_t propertyCount;
@@ -15473,6 +16477,7 @@
     VULKAN_HPP_NAMESPACE::FramebufferMixedSamplesCombinationNV * pCombinations,
     Dispatch const &                                             d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     return static_cast<Result>( d.vkGetPhysicalDeviceSupportedFramebufferMixedSamplesCombinationsNV(
       m_physicalDevice,
       pCombinationCount,
@@ -15485,6 +16490,7 @@
     std::vector<FramebufferMixedSamplesCombinationNV, FramebufferMixedSamplesCombinationNVAllocator>>::type
     PhysicalDevice::getSupportedFramebufferMixedSamplesCombinationsNV( Dispatch const & d ) const
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     std::vector<FramebufferMixedSamplesCombinationNV, FramebufferMixedSamplesCombinationNVAllocator> combinations;
     uint32_t                                                                                         combinationCount;
     Result                                                                                           result;
@@ -15523,6 +16529,7 @@
       FramebufferMixedSamplesCombinationNVAllocator & framebufferMixedSamplesCombinationNVAllocator,
       Dispatch const &                                d ) const
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     std::vector<FramebufferMixedSamplesCombinationNV, FramebufferMixedSamplesCombinationNVAllocator> combinations(
       framebufferMixedSamplesCombinationNVAllocator );
     uint32_t combinationCount;
@@ -15562,6 +16569,7 @@
     VULKAN_HPP_NAMESPACE::PresentModeKHR *                      pPresentModes,
     Dispatch const &                                            d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     return static_cast<Result>( d.vkGetPhysicalDeviceSurfacePresentModes2EXT(
       m_physicalDevice,
       reinterpret_cast<const VkPhysicalDeviceSurfaceInfo2KHR *>( pSurfaceInfo ),
@@ -15576,6 +16584,7 @@
     PhysicalDevice::getSurfacePresentModes2EXT( const PhysicalDeviceSurfaceInfo2KHR & surfaceInfo,
                                                 Dispatch const &                      d ) const
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     std::vector<PresentModeKHR, PresentModeKHRAllocator> presentModes;
     uint32_t                                             presentModeCount;
     Result                                               result;
@@ -15615,6 +16624,7 @@
                                                 PresentModeKHRAllocator &             presentModeKHRAllocator,
                                                 Dispatch const &                      d ) const
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     std::vector<PresentModeKHR, PresentModeKHRAllocator> presentModes( presentModeKHRAllocator );
     uint32_t                                             presentModeCount;
     Result                                               result;
@@ -15650,6 +16660,7 @@
   VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE Result Device::acquireFullScreenExclusiveModeEXT(
     VULKAN_HPP_NAMESPACE::SwapchainKHR swapchain, Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     return static_cast<Result>(
       d.vkAcquireFullScreenExclusiveModeEXT( m_device, static_cast<VkSwapchainKHR>( swapchain ) ) );
   }
@@ -15658,6 +16669,7 @@
   VULKAN_HPP_NODISCARD_WHEN_NO_EXCEPTIONS VULKAN_HPP_INLINE typename ResultValueType<void>::type
     Device::acquireFullScreenExclusiveModeEXT( VULKAN_HPP_NAMESPACE::SwapchainKHR swapchain, Dispatch const & d ) const
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     Result result = static_cast<Result>(
       d.vkAcquireFullScreenExclusiveModeEXT( m_device, static_cast<VkSwapchainKHR>( swapchain ) ) );
     return createResultValue( result, VULKAN_HPP_NAMESPACE_STRING "::Device::acquireFullScreenExclusiveModeEXT" );
@@ -15669,6 +16681,7 @@
   VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE Result Device::releaseFullScreenExclusiveModeEXT(
     VULKAN_HPP_NAMESPACE::SwapchainKHR swapchain, Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     return static_cast<Result>(
       d.vkReleaseFullScreenExclusiveModeEXT( m_device, static_cast<VkSwapchainKHR>( swapchain ) ) );
   }
@@ -15677,6 +16690,7 @@
   VULKAN_HPP_NODISCARD_WHEN_NO_EXCEPTIONS VULKAN_HPP_INLINE typename ResultValueType<void>::type
     Device::releaseFullScreenExclusiveModeEXT( VULKAN_HPP_NAMESPACE::SwapchainKHR swapchain, Dispatch const & d ) const
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     Result result = static_cast<Result>(
       d.vkReleaseFullScreenExclusiveModeEXT( m_device, static_cast<VkSwapchainKHR>( swapchain ) ) );
     return createResultValue( result, VULKAN_HPP_NAMESPACE_STRING "::Device::releaseFullScreenExclusiveModeEXT" );
@@ -15689,6 +16703,7 @@
                                              VULKAN_HPP_NAMESPACE::DeviceGroupPresentModeFlagsKHR *      pModes,
                                              Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     return static_cast<Result>( d.vkGetDeviceGroupSurfacePresentModes2EXT(
       m_device,
       reinterpret_cast<const VkPhysicalDeviceSurfaceInfo2KHR *>( pSurfaceInfo ),
@@ -15702,6 +16717,7 @@
     Device::getGroupSurfacePresentModes2EXT( const PhysicalDeviceSurfaceInfo2KHR & surfaceInfo,
                                              Dispatch const &                      d ) const
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     VULKAN_HPP_NAMESPACE::DeviceGroupPresentModeFlagsKHR modes;
     Result result = static_cast<Result>( d.vkGetDeviceGroupSurfacePresentModes2EXT(
       m_device,
@@ -15721,6 +16737,7 @@
                                         VULKAN_HPP_NAMESPACE::SurfaceKHR *                         pSurface,
                                         Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     return static_cast<Result>(
       d.vkCreateHeadlessSurfaceEXT( m_instance,
                                     reinterpret_cast<const VkHeadlessSurfaceCreateInfoEXT *>( pCreateInfo ),
@@ -15736,6 +16753,7 @@
                                         Optional<const AllocationCallbacks>  allocator,
                                         Dispatch const &                     d ) const
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     VULKAN_HPP_NAMESPACE::SurfaceKHR surface;
     Result                           result = static_cast<Result>(
       d.vkCreateHeadlessSurfaceEXT( m_instance,
@@ -15754,6 +16772,7 @@
                                               Optional<const AllocationCallbacks>  allocator,
                                               Dispatch const &                     d ) const
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     VULKAN_HPP_NAMESPACE::SurfaceKHR surface;
     Result                           result = static_cast<Result>(
       d.vkCreateHeadlessSurfaceEXT( m_instance,
@@ -15774,6 +16793,7 @@
   VULKAN_HPP_INLINE DeviceAddress Device::getBufferAddressKHR(
     const VULKAN_HPP_NAMESPACE::BufferDeviceAddressInfo * pInfo, Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     return static_cast<DeviceAddress>(
       d.vkGetBufferDeviceAddressKHR( m_device, reinterpret_cast<const VkBufferDeviceAddressInfo *>( pInfo ) ) );
   }
@@ -15783,6 +16803,7 @@
   VULKAN_HPP_INLINE DeviceAddress Device::getBufferAddressKHR( const BufferDeviceAddressInfo & info,
                                                                Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     return d.vkGetBufferDeviceAddressKHR( m_device, reinterpret_cast<const VkBufferDeviceAddressInfo *>( &info ) );
   }
 #endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/
@@ -15791,6 +16812,7 @@
   VULKAN_HPP_INLINE uint64_t Device::getBufferOpaqueCaptureAddressKHR(
     const VULKAN_HPP_NAMESPACE::BufferDeviceAddressInfo * pInfo, Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     return d.vkGetBufferOpaqueCaptureAddressKHR( m_device,
                                                  reinterpret_cast<const VkBufferDeviceAddressInfo *>( pInfo ) );
   }
@@ -15800,6 +16822,7 @@
   VULKAN_HPP_INLINE uint64_t Device::getBufferOpaqueCaptureAddressKHR( const BufferDeviceAddressInfo & info,
                                                                        Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     return d.vkGetBufferOpaqueCaptureAddressKHR( m_device,
                                                  reinterpret_cast<const VkBufferDeviceAddressInfo *>( &info ) );
   }
@@ -15810,6 +16833,7 @@
                     Device::getMemoryOpaqueCaptureAddressKHR( const VULKAN_HPP_NAMESPACE::DeviceMemoryOpaqueCaptureAddressInfo * pInfo,
                                               Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     return d.vkGetDeviceMemoryOpaqueCaptureAddressKHR(
       m_device, reinterpret_cast<const VkDeviceMemoryOpaqueCaptureAddressInfo *>( pInfo ) );
   }
@@ -15819,6 +16843,7 @@
   VULKAN_HPP_INLINE uint64_t Device::getMemoryOpaqueCaptureAddressKHR(
     const DeviceMemoryOpaqueCaptureAddressInfo & info, Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     return d.vkGetDeviceMemoryOpaqueCaptureAddressKHR(
       m_device, reinterpret_cast<const VkDeviceMemoryOpaqueCaptureAddressInfo *>( &info ) );
   }
@@ -15831,6 +16856,7 @@
                                                            uint16_t         lineStipplePattern,
                                                            Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkCmdSetLineStippleEXT( m_commandBuffer, lineStippleFactor, lineStipplePattern );
   }
 
@@ -15842,6 +16868,7 @@
                                                     uint32_t                        queryCount,
                                                     Dispatch const &                d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkResetQueryPoolEXT( m_device, static_cast<VkQueryPool>( queryPool ), firstQuery, queryCount );
   }
 
@@ -15851,6 +16878,7 @@
   VULKAN_HPP_INLINE void CommandBuffer::setCullModeEXT( VULKAN_HPP_NAMESPACE::CullModeFlags cullMode,
                                                         Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkCmdSetCullModeEXT( m_commandBuffer, static_cast<VkCullModeFlags>( cullMode ) );
   }
 
@@ -15858,6 +16886,7 @@
   VULKAN_HPP_INLINE void CommandBuffer::setFrontFaceEXT( VULKAN_HPP_NAMESPACE::FrontFace frontFace,
                                                          Dispatch const &                d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkCmdSetFrontFaceEXT( m_commandBuffer, static_cast<VkFrontFace>( frontFace ) );
   }
 
@@ -15866,6 +16895,7 @@
     CommandBuffer::setPrimitiveTopologyEXT( VULKAN_HPP_NAMESPACE::PrimitiveTopology primitiveTopology,
                                             Dispatch const &                        d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkCmdSetPrimitiveTopologyEXT( m_commandBuffer, static_cast<VkPrimitiveTopology>( primitiveTopology ) );
   }
 
@@ -15874,6 +16904,7 @@
                                                                  const VULKAN_HPP_NAMESPACE::Viewport * pViewports,
                                                                  Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkCmdSetViewportWithCountEXT(
       m_commandBuffer, viewportCount, reinterpret_cast<const VkViewport *>( pViewports ) );
   }
@@ -15884,6 +16915,7 @@
     CommandBuffer::setViewportWithCountEXT( ArrayProxy<const VULKAN_HPP_NAMESPACE::Viewport> const & viewports,
                                             Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkCmdSetViewportWithCountEXT(
       m_commandBuffer, viewports.size(), reinterpret_cast<const VkViewport *>( viewports.data() ) );
   }
@@ -15894,6 +16926,7 @@
                                                                 const VULKAN_HPP_NAMESPACE::Rect2D * pScissors,
                                                                 Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkCmdSetScissorWithCountEXT( m_commandBuffer, scissorCount, reinterpret_cast<const VkRect2D *>( pScissors ) );
   }
 
@@ -15903,6 +16936,7 @@
     CommandBuffer::setScissorWithCountEXT( ArrayProxy<const VULKAN_HPP_NAMESPACE::Rect2D> const & scissors,
                                            Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkCmdSetScissorWithCountEXT(
       m_commandBuffer, scissors.size(), reinterpret_cast<const VkRect2D *>( scissors.data() ) );
   }
@@ -15917,6 +16951,7 @@
                                                                const VULKAN_HPP_NAMESPACE::DeviceSize * pStrides,
                                                                Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkCmdBindVertexBuffers2EXT( m_commandBuffer,
                                   firstBinding,
                                   bindingCount,
@@ -15936,6 +16971,7 @@
                                           ArrayProxy<const VULKAN_HPP_NAMESPACE::DeviceSize> const & strides,
                                           Dispatch const & d ) const VULKAN_HPP_NOEXCEPT_WHEN_NO_EXCEPTIONS
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
 #  ifdef VULKAN_HPP_NO_EXCEPTIONS
     VULKAN_HPP_ASSERT( buffers.size() == offsets.size() );
     VULKAN_HPP_ASSERT( sizes.empty() || buffers.size() == sizes.size() );
@@ -15972,6 +17008,7 @@
   VULKAN_HPP_INLINE void CommandBuffer::setDepthTestEnableEXT( VULKAN_HPP_NAMESPACE::Bool32 depthTestEnable,
                                                                Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkCmdSetDepthTestEnableEXT( m_commandBuffer, static_cast<VkBool32>( depthTestEnable ) );
   }
 
@@ -15979,6 +17016,7 @@
   VULKAN_HPP_INLINE void CommandBuffer::setDepthWriteEnableEXT( VULKAN_HPP_NAMESPACE::Bool32 depthWriteEnable,
                                                                 Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkCmdSetDepthWriteEnableEXT( m_commandBuffer, static_cast<VkBool32>( depthWriteEnable ) );
   }
 
@@ -15986,6 +17024,7 @@
   VULKAN_HPP_INLINE void CommandBuffer::setDepthCompareOpEXT( VULKAN_HPP_NAMESPACE::CompareOp depthCompareOp,
                                                               Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkCmdSetDepthCompareOpEXT( m_commandBuffer, static_cast<VkCompareOp>( depthCompareOp ) );
   }
 
@@ -15993,6 +17032,7 @@
   VULKAN_HPP_INLINE void CommandBuffer::setDepthBoundsTestEnableEXT( VULKAN_HPP_NAMESPACE::Bool32 depthBoundsTestEnable,
                                                                      Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkCmdSetDepthBoundsTestEnableEXT( m_commandBuffer, static_cast<VkBool32>( depthBoundsTestEnable ) );
   }
 
@@ -16000,6 +17040,7 @@
   VULKAN_HPP_INLINE void CommandBuffer::setStencilTestEnableEXT( VULKAN_HPP_NAMESPACE::Bool32 stencilTestEnable,
                                                                  Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkCmdSetStencilTestEnableEXT( m_commandBuffer, static_cast<VkBool32>( stencilTestEnable ) );
   }
 
@@ -16011,6 +17052,7 @@
                                                          VULKAN_HPP_NAMESPACE::CompareOp        compareOp,
                                                          Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkCmdSetStencilOpEXT( m_commandBuffer,
                             static_cast<VkStencilFaceFlags>( faceMask ),
                             static_cast<VkStencilOp>( failOp ),
@@ -16027,6 +17069,7 @@
                                         VULKAN_HPP_NAMESPACE::DeferredOperationKHR *      pDeferredOperation,
                                         Dispatch const &                                  d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     return static_cast<Result>(
       d.vkCreateDeferredOperationKHR( m_device,
                                       reinterpret_cast<const VkAllocationCallbacks *>( pAllocator ),
@@ -16038,6 +17081,7 @@
   VULKAN_HPP_INLINE typename ResultValueType<VULKAN_HPP_NAMESPACE::DeferredOperationKHR>::type
     Device::createDeferredOperationKHR( Optional<const AllocationCallbacks> allocator, Dispatch const & d ) const
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     VULKAN_HPP_NAMESPACE::DeferredOperationKHR deferredOperation;
     Result                                     result = static_cast<Result>(
       d.vkCreateDeferredOperationKHR( m_device,
@@ -16053,6 +17097,7 @@
   VULKAN_HPP_INLINE typename ResultValueType<UniqueHandle<VULKAN_HPP_NAMESPACE::DeferredOperationKHR, Dispatch>>::type
     Device::createDeferredOperationKHRUnique( Optional<const AllocationCallbacks> allocator, Dispatch const & d ) const
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     VULKAN_HPP_NAMESPACE::DeferredOperationKHR deferredOperation;
     Result                                     result = static_cast<Result>(
       d.vkCreateDeferredOperationKHR( m_device,
@@ -16072,6 +17117,7 @@
                                          const VULKAN_HPP_NAMESPACE::AllocationCallbacks * pAllocator,
                                          Dispatch const &                                  d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkDestroyDeferredOperationKHR( m_device,
                                      static_cast<VkDeferredOperationKHR>( operation ),
                                      reinterpret_cast<const VkAllocationCallbacks *>( pAllocator ) );
@@ -16083,6 +17129,7 @@
                                                               Optional<const AllocationCallbacks>        allocator,
                                                               Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkDestroyDeferredOperationKHR( m_device,
                                      static_cast<VkDeferredOperationKHR>( operation ),
                                      reinterpret_cast<const VkAllocationCallbacks *>(
@@ -16095,6 +17142,7 @@
                                           const VULKAN_HPP_NAMESPACE::AllocationCallbacks * pAllocator,
                                           Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkDestroyDeferredOperationKHR( m_device,
                                      static_cast<VkDeferredOperationKHR>( operation ),
                                      reinterpret_cast<const VkAllocationCallbacks *>( pAllocator ) );
@@ -16106,6 +17154,7 @@
                                           Optional<const AllocationCallbacks>        allocator,
                                           Dispatch const &                           d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkDestroyDeferredOperationKHR( m_device,
                                      static_cast<VkDeferredOperationKHR>( operation ),
                                      reinterpret_cast<const VkAllocationCallbacks *>(
@@ -16117,6 +17166,7 @@
   VULKAN_HPP_INLINE uint32_t Device::getDeferredOperationMaxConcurrencyKHR(
     VULKAN_HPP_NAMESPACE::DeferredOperationKHR operation, Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     return d.vkGetDeferredOperationMaxConcurrencyKHR( m_device, static_cast<VkDeferredOperationKHR>( operation ) );
   }
 
@@ -16125,6 +17175,7 @@
   VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE Result Device::getDeferredOperationResultKHR(
     VULKAN_HPP_NAMESPACE::DeferredOperationKHR operation, Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     return static_cast<Result>(
       d.vkGetDeferredOperationResultKHR( m_device, static_cast<VkDeferredOperationKHR>( operation ) ) );
   }
@@ -16133,6 +17184,7 @@
   VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE Result Device::getDeferredOperationResultKHR(
     VULKAN_HPP_NAMESPACE::DeferredOperationKHR operation, Dispatch const & d ) const
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     Result result = static_cast<Result>(
       d.vkGetDeferredOperationResultKHR( m_device, static_cast<VkDeferredOperationKHR>( operation ) ) );
     return createResultValue( result,
@@ -16146,6 +17198,7 @@
   VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE Result Device::deferredOperationJoinKHR(
     VULKAN_HPP_NAMESPACE::DeferredOperationKHR operation, Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     return static_cast<Result>(
       d.vkDeferredOperationJoinKHR( m_device, static_cast<VkDeferredOperationKHR>( operation ) ) );
   }
@@ -16154,6 +17207,7 @@
   VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE Result
                                          Device::deferredOperationJoinKHR( VULKAN_HPP_NAMESPACE::DeferredOperationKHR operation, Dispatch const & d ) const
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     Result result =
       static_cast<Result>( d.vkDeferredOperationJoinKHR( m_device, static_cast<VkDeferredOperationKHR>( operation ) ) );
     return createResultValue( result,
@@ -16173,6 +17227,7 @@
                                                 VULKAN_HPP_NAMESPACE::PipelineExecutablePropertiesKHR * pProperties,
                                                 Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     return static_cast<Result>(
       d.vkGetPipelineExecutablePropertiesKHR( m_device,
                                               reinterpret_cast<const VkPipelineInfoKHR *>( pPipelineInfo ),
@@ -16186,6 +17241,7 @@
     std::vector<PipelineExecutablePropertiesKHR, PipelineExecutablePropertiesKHRAllocator>>::type
     Device::getPipelineExecutablePropertiesKHR( const PipelineInfoKHR & pipelineInfo, Dispatch const & d ) const
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     std::vector<PipelineExecutablePropertiesKHR, PipelineExecutablePropertiesKHRAllocator> properties;
     uint32_t                                                                               executableCount;
     Result                                                                                 result;
@@ -16224,6 +17280,7 @@
       PipelineExecutablePropertiesKHRAllocator & pipelineExecutablePropertiesKHRAllocator,
       Dispatch const &                           d ) const
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     std::vector<PipelineExecutablePropertiesKHR, PipelineExecutablePropertiesKHRAllocator> properties(
       pipelineExecutablePropertiesKHRAllocator );
     uint32_t executableCount;
@@ -16259,6 +17316,7 @@
                                                 VULKAN_HPP_NAMESPACE::PipelineExecutableStatisticKHR *  pStatistics,
                                                 Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     return static_cast<Result>(
       d.vkGetPipelineExecutableStatisticsKHR( m_device,
                                               reinterpret_cast<const VkPipelineExecutableInfoKHR *>( pExecutableInfo ),
@@ -16273,6 +17331,7 @@
     Device::getPipelineExecutableStatisticsKHR( const PipelineExecutableInfoKHR & executableInfo,
                                                 Dispatch const &                  d ) const
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     std::vector<PipelineExecutableStatisticKHR, PipelineExecutableStatisticKHRAllocator> statistics;
     uint32_t                                                                             statisticCount;
     Result                                                                               result;
@@ -16314,6 +17373,7 @@
       PipelineExecutableStatisticKHRAllocator & pipelineExecutableStatisticKHRAllocator,
       Dispatch const &                          d ) const
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     std::vector<PipelineExecutableStatisticKHR, PipelineExecutableStatisticKHRAllocator> statistics(
       pipelineExecutableStatisticKHRAllocator );
     uint32_t statisticCount;
@@ -16352,6 +17412,7 @@
     VULKAN_HPP_NAMESPACE::PipelineExecutableInternalRepresentationKHR * pInternalRepresentations,
     Dispatch const &                                                    d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     return static_cast<Result>( d.vkGetPipelineExecutableInternalRepresentationsKHR(
       m_device,
       reinterpret_cast<const VkPipelineExecutableInfoKHR *>( pExecutableInfo ),
@@ -16367,6 +17428,7 @@
     Device::getPipelineExecutableInternalRepresentationsKHR( const PipelineExecutableInfoKHR & executableInfo,
                                                              Dispatch const &                  d ) const
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     std::vector<PipelineExecutableInternalRepresentationKHR, PipelineExecutableInternalRepresentationKHRAllocator>
              internalRepresentations;
     uint32_t internalRepresentationCount;
@@ -16412,6 +17474,7 @@
       PipelineExecutableInternalRepresentationKHRAllocator & pipelineExecutableInternalRepresentationKHRAllocator,
       Dispatch const &                                       d ) const
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     std::vector<PipelineExecutableInternalRepresentationKHR, PipelineExecutableInternalRepresentationKHRAllocator>
              internalRepresentations( pipelineExecutableInternalRepresentationKHRAllocator );
     uint32_t internalRepresentationCount;
@@ -16452,6 +17515,7 @@
     VULKAN_HPP_NAMESPACE::MemoryRequirements2 *                             pMemoryRequirements,
     Dispatch const &                                                        d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkGetGeneratedCommandsMemoryRequirementsNV(
       m_device,
       reinterpret_cast<const VkGeneratedCommandsMemoryRequirementsInfoNV *>( pInfo ),
@@ -16464,6 +17528,7 @@
                                          Device::getGeneratedCommandsMemoryRequirementsNV( const GeneratedCommandsMemoryRequirementsInfoNV & info,
                                                       Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     VULKAN_HPP_NAMESPACE::MemoryRequirements2 memoryRequirements;
     d.vkGetGeneratedCommandsMemoryRequirementsNV(
       m_device,
@@ -16477,6 +17542,7 @@
                                          Device::getGeneratedCommandsMemoryRequirementsNV( const GeneratedCommandsMemoryRequirementsInfoNV & info,
                                                       Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     StructureChain<X, Y, Z...>                  structureChain;
     VULKAN_HPP_NAMESPACE::MemoryRequirements2 & memoryRequirements =
       structureChain.template get<VULKAN_HPP_NAMESPACE::MemoryRequirements2>();
@@ -16493,6 +17559,7 @@
     const VULKAN_HPP_NAMESPACE::GeneratedCommandsInfoNV * pGeneratedCommandsInfo,
     Dispatch const &                                      d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkCmdPreprocessGeneratedCommandsNV(
       m_commandBuffer, reinterpret_cast<const VkGeneratedCommandsInfoNV *>( pGeneratedCommandsInfo ) );
   }
@@ -16503,6 +17570,7 @@
     CommandBuffer::preprocessGeneratedCommandsNV( const GeneratedCommandsInfoNV & generatedCommandsInfo,
                                                   Dispatch const &                d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkCmdPreprocessGeneratedCommandsNV(
       m_commandBuffer, reinterpret_cast<const VkGeneratedCommandsInfoNV *>( &generatedCommandsInfo ) );
   }
@@ -16514,6 +17582,7 @@
     const VULKAN_HPP_NAMESPACE::GeneratedCommandsInfoNV * pGeneratedCommandsInfo,
     Dispatch const &                                      d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkCmdExecuteGeneratedCommandsNV( m_commandBuffer,
                                        static_cast<VkBool32>( isPreprocessed ),
                                        reinterpret_cast<const VkGeneratedCommandsInfoNV *>( pGeneratedCommandsInfo ) );
@@ -16526,6 +17595,7 @@
                                                const GeneratedCommandsInfoNV & generatedCommandsInfo,
                                                Dispatch const &                d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkCmdExecuteGeneratedCommandsNV( m_commandBuffer,
                                        static_cast<VkBool32>( isPreprocessed ),
                                        reinterpret_cast<const VkGeneratedCommandsInfoNV *>( &generatedCommandsInfo ) );
@@ -16539,6 +17609,7 @@
                                               uint32_t                                groupIndex,
                                               Dispatch const &                        d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkCmdBindPipelineShaderGroupNV( m_commandBuffer,
                                       static_cast<VkPipelineBindPoint>( pipelineBindPoint ),
                                       static_cast<VkPipeline>( pipeline ),
@@ -16552,6 +17623,7 @@
     VULKAN_HPP_NAMESPACE::IndirectCommandsLayoutNV *                 pIndirectCommandsLayout,
     Dispatch const &                                                 d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     return static_cast<Result>(
       d.vkCreateIndirectCommandsLayoutNV( m_device,
                                           reinterpret_cast<const VkIndirectCommandsLayoutCreateInfoNV *>( pCreateInfo ),
@@ -16567,6 +17639,7 @@
                                             Optional<const AllocationCallbacks>        allocator,
                                             Dispatch const &                           d ) const
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     VULKAN_HPP_NAMESPACE::IndirectCommandsLayoutNV indirectCommandsLayout;
     Result                                         result = static_cast<Result>( d.vkCreateIndirectCommandsLayoutNV(
       m_device,
@@ -16586,6 +17659,7 @@
                                                   Optional<const AllocationCallbacks>        allocator,
                                                   Dispatch const &                           d ) const
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     VULKAN_HPP_NAMESPACE::IndirectCommandsLayoutNV indirectCommandsLayout;
     Result                                         result = static_cast<Result>( d.vkCreateIndirectCommandsLayoutNV(
       m_device,
@@ -16609,6 +17683,7 @@
                                              const VULKAN_HPP_NAMESPACE::AllocationCallbacks * pAllocator,
                                              Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkDestroyIndirectCommandsLayoutNV( m_device,
                                          static_cast<VkIndirectCommandsLayoutNV>( indirectCommandsLayout ),
                                          reinterpret_cast<const VkAllocationCallbacks *>( pAllocator ) );
@@ -16621,6 +17696,7 @@
                                              Optional<const AllocationCallbacks>            allocator,
                                              Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkDestroyIndirectCommandsLayoutNV(
       m_device,
       static_cast<VkIndirectCommandsLayoutNV>( indirectCommandsLayout ),
@@ -16634,6 +17710,7 @@
                                           const VULKAN_HPP_NAMESPACE::AllocationCallbacks * pAllocator,
                                           Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkDestroyIndirectCommandsLayoutNV( m_device,
                                          static_cast<VkIndirectCommandsLayoutNV>( indirectCommandsLayout ),
                                          reinterpret_cast<const VkAllocationCallbacks *>( pAllocator ) );
@@ -16645,6 +17722,7 @@
                                           Optional<const AllocationCallbacks>            allocator,
                                           Dispatch const &                               d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkDestroyIndirectCommandsLayoutNV(
       m_device,
       static_cast<VkIndirectCommandsLayoutNV>( indirectCommandsLayout ),
@@ -16660,6 +17738,7 @@
   VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE Result PhysicalDevice::acquireDrmDisplayEXT(
     int32_t drmFd, VULKAN_HPP_NAMESPACE::DisplayKHR display, Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     return static_cast<Result>(
       d.vkAcquireDrmDisplayEXT( m_physicalDevice, drmFd, static_cast<VkDisplayKHR>( display ) ) );
   }
@@ -16668,6 +17747,7 @@
   VULKAN_HPP_INLINE typename ResultValueType<void>::type PhysicalDevice::acquireDrmDisplayEXT(
     int32_t drmFd, VULKAN_HPP_NAMESPACE::DisplayKHR display, Dispatch const & d ) const
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     Result result =
       static_cast<Result>( d.vkAcquireDrmDisplayEXT( m_physicalDevice, drmFd, static_cast<VkDisplayKHR>( display ) ) );
     return createResultValue( result, VULKAN_HPP_NAMESPACE_STRING "::PhysicalDevice::acquireDrmDisplayEXT" );
@@ -16681,6 +17761,7 @@
                                       VULKAN_HPP_NAMESPACE::DisplayKHR * display,
                                       Dispatch const &                   d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     return static_cast<Result>(
       d.vkGetDrmDisplayEXT( m_physicalDevice, drmFd, connectorId, reinterpret_cast<VkDisplayKHR *>( display ) ) );
   }
@@ -16691,6 +17772,7 @@
     typename ResultValueType<VULKAN_HPP_NAMESPACE::DisplayKHR>::type
     PhysicalDevice::getDrmDisplayEXT( int32_t drmFd, uint32_t connectorId, Dispatch const & d ) const
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     VULKAN_HPP_NAMESPACE::DisplayKHR display;
     Result                           result = static_cast<Result>(
       d.vkGetDrmDisplayEXT( m_physicalDevice, drmFd, connectorId, reinterpret_cast<VkDisplayKHR *>( &display ) ) );
@@ -16703,6 +17785,7 @@
     typename ResultValueType<UniqueHandle<VULKAN_HPP_NAMESPACE::DisplayKHR, Dispatch>>::type
     PhysicalDevice::getDrmDisplayEXTUnique( int32_t drmFd, uint32_t connectorId, Dispatch const & d ) const
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     VULKAN_HPP_NAMESPACE::DisplayKHR display;
     Result                           result = static_cast<Result>(
       d.vkGetDrmDisplayEXT( m_physicalDevice, drmFd, connectorId, reinterpret_cast<VkDisplayKHR *>( &display ) ) );
@@ -16722,6 +17805,7 @@
                                       VULKAN_HPP_NAMESPACE::PrivateDataSlotEXT *                 pPrivateDataSlot,
                                       Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     return static_cast<Result>(
       d.vkCreatePrivateDataSlotEXT( m_device,
                                     reinterpret_cast<const VkPrivateDataSlotCreateInfoEXT *>( pCreateInfo ),
@@ -16736,6 +17820,7 @@
                                       Optional<const AllocationCallbacks>  allocator,
                                       Dispatch const &                     d ) const
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     VULKAN_HPP_NAMESPACE::PrivateDataSlotEXT privateDataSlot;
     Result                                   result = static_cast<Result>(
       d.vkCreatePrivateDataSlotEXT( m_device,
@@ -16754,6 +17839,7 @@
                                             Optional<const AllocationCallbacks>  allocator,
                                             Dispatch const &                     d ) const
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     VULKAN_HPP_NAMESPACE::PrivateDataSlotEXT privateDataSlot;
     Result                                   result = static_cast<Result>(
       d.vkCreatePrivateDataSlotEXT( m_device,
@@ -16774,6 +17860,7 @@
                                        const VULKAN_HPP_NAMESPACE::AllocationCallbacks * pAllocator,
                                        Dispatch const &                                  d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkDestroyPrivateDataSlotEXT( m_device,
                                    static_cast<VkPrivateDataSlotEXT>( privateDataSlot ),
                                    reinterpret_cast<const VkAllocationCallbacks *>( pAllocator ) );
@@ -16785,6 +17872,7 @@
                                                             Optional<const AllocationCallbacks>      allocator,
                                                             Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkDestroyPrivateDataSlotEXT( m_device,
                                    static_cast<VkPrivateDataSlotEXT>( privateDataSlot ),
                                    reinterpret_cast<const VkAllocationCallbacks *>(
@@ -16797,6 +17885,7 @@
                                           const VULKAN_HPP_NAMESPACE::AllocationCallbacks * pAllocator,
                                           Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkDestroyPrivateDataSlotEXT( m_device,
                                    static_cast<VkPrivateDataSlotEXT>( privateDataSlot ),
                                    reinterpret_cast<const VkAllocationCallbacks *>( pAllocator ) );
@@ -16808,6 +17897,7 @@
                                           Optional<const AllocationCallbacks>      allocator,
                                           Dispatch const &                         d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkDestroyPrivateDataSlotEXT( m_device,
                                    static_cast<VkPrivateDataSlotEXT>( privateDataSlot ),
                                    reinterpret_cast<const VkAllocationCallbacks *>(
@@ -16824,6 +17914,7 @@
                                uint64_t                                 data,
                                Dispatch const &                         d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     return static_cast<Result>( d.vkSetPrivateDataEXT( m_device,
                                                        static_cast<VkObjectType>( objectType ),
                                                        objectHandle,
@@ -16839,6 +17930,7 @@
                                uint64_t                                 data,
                                Dispatch const &                         d ) const
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     Result result = static_cast<Result>( d.vkSetPrivateDataEXT( m_device,
                                                                 static_cast<VkObjectType>( objectType ),
                                                                 objectHandle,
@@ -16855,6 +17947,7 @@
                                                     uint64_t *                               pData,
                                                     Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkGetPrivateDataEXT( m_device,
                            static_cast<VkObjectType>( objectType ),
                            objectHandle,
@@ -16870,6 +17963,7 @@
                                VULKAN_HPP_NAMESPACE::PrivateDataSlotEXT privateDataSlot,
                                Dispatch const &                         d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     uint64_t data;
     d.vkGetPrivateDataEXT( m_device,
                            static_cast<VkObjectType>( objectType ),
@@ -16887,6 +17981,7 @@
   VULKAN_HPP_INLINE void CommandBuffer::encodeVideoKHR( const VULKAN_HPP_NAMESPACE::VideoEncodeInfoKHR * pEncodeInfo,
                                                         Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkCmdEncodeVideoKHR( m_commandBuffer, reinterpret_cast<const VkVideoEncodeInfoKHR *>( pEncodeInfo ) );
   }
 
@@ -16895,6 +17990,7 @@
   VULKAN_HPP_INLINE void CommandBuffer::encodeVideoKHR( const VideoEncodeInfoKHR & encodeInfo,
                                                         Dispatch const &           d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkCmdEncodeVideoKHR( m_commandBuffer, reinterpret_cast<const VkVideoEncodeInfoKHR *>( &encodeInfo ) );
   }
 #  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/
@@ -16907,6 +18003,7 @@
                                                       const VULKAN_HPP_NAMESPACE::DependencyInfoKHR * pDependencyInfo,
                                                       Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkCmdSetEvent2KHR( m_commandBuffer,
                          static_cast<VkEvent>( event ),
                          reinterpret_cast<const VkDependencyInfoKHR *>( pDependencyInfo ) );
@@ -16918,6 +18015,7 @@
                                                       const DependencyInfoKHR &   dependencyInfo,
                                                       Dispatch const &            d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkCmdSetEvent2KHR( m_commandBuffer,
                          static_cast<VkEvent>( event ),
                          reinterpret_cast<const VkDependencyInfoKHR *>( &dependencyInfo ) );
@@ -16929,6 +18027,7 @@
                                                         VULKAN_HPP_NAMESPACE::PipelineStageFlags2KHR stageMask,
                                                         Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkCmdResetEvent2KHR(
       m_commandBuffer, static_cast<VkEvent>( event ), static_cast<VkPipelineStageFlags2KHR>( stageMask ) );
   }
@@ -16940,6 +18039,7 @@
                                    const VULKAN_HPP_NAMESPACE::DependencyInfoKHR * pDependencyInfos,
                                    Dispatch const &                                d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkCmdWaitEvents2KHR( m_commandBuffer,
                            eventCount,
                            reinterpret_cast<const VkEvent *>( pEvents ),
@@ -16953,6 +18053,7 @@
                                    ArrayProxy<const VULKAN_HPP_NAMESPACE::DependencyInfoKHR> const & dependencyInfos,
                                    Dispatch const & d ) const VULKAN_HPP_NOEXCEPT_WHEN_NO_EXCEPTIONS
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
 #  ifdef VULKAN_HPP_NO_EXCEPTIONS
     VULKAN_HPP_ASSERT( events.size() == dependencyInfos.size() );
 #  else
@@ -16975,6 +18076,7 @@
     CommandBuffer::pipelineBarrier2KHR( const VULKAN_HPP_NAMESPACE::DependencyInfoKHR * pDependencyInfo,
                                         Dispatch const &                                d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkCmdPipelineBarrier2KHR( m_commandBuffer, reinterpret_cast<const VkDependencyInfoKHR *>( pDependencyInfo ) );
   }
 
@@ -16983,6 +18085,7 @@
   VULKAN_HPP_INLINE void CommandBuffer::pipelineBarrier2KHR( const DependencyInfoKHR & dependencyInfo,
                                                              Dispatch const &          d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkCmdPipelineBarrier2KHR( m_commandBuffer, reinterpret_cast<const VkDependencyInfoKHR *>( &dependencyInfo ) );
   }
 #endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/
@@ -16993,6 +18096,7 @@
                                                             uint32_t                                     query,
                                                             Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkCmdWriteTimestamp2KHR(
       m_commandBuffer, static_cast<VkPipelineStageFlags2KHR>( stage ), static_cast<VkQueryPool>( queryPool ), query );
   }
@@ -17004,6 +18108,7 @@
                        VULKAN_HPP_NAMESPACE::Fence                  fence,
                        Dispatch const &                             d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     return static_cast<Result>( d.vkQueueSubmit2KHR(
       m_queue, submitCount, reinterpret_cast<const VkSubmitInfo2KHR *>( pSubmits ), static_cast<VkFence>( fence ) ) );
   }
@@ -17015,6 +18120,7 @@
                        VULKAN_HPP_NAMESPACE::Fence                                    fence,
                        Dispatch const &                                               d ) const
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     Result result =
       static_cast<Result>( d.vkQueueSubmit2KHR( m_queue,
                                                 submits.size(),
@@ -17031,6 +18137,7 @@
                                                                uint32_t                                     marker,
                                                                Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkCmdWriteBufferMarker2AMD( m_commandBuffer,
                                   static_cast<VkPipelineStageFlags2KHR>( stage ),
                                   static_cast<VkBuffer>( dstBuffer ),
@@ -17043,6 +18150,7 @@
                                                       VULKAN_HPP_NAMESPACE::CheckpointData2NV * pCheckpointData,
                                                       Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkGetQueueCheckpointData2NV(
       m_queue, pCheckpointDataCount, reinterpret_cast<VkCheckpointData2NV *>( pCheckpointData ) );
   }
@@ -17052,6 +18160,7 @@
   VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE std::vector<CheckpointData2NV, CheckpointData2NVAllocator>
                                          Queue::getCheckpointData2NV( Dispatch const & d ) const
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     std::vector<CheckpointData2NV, CheckpointData2NVAllocator> checkpointData;
     uint32_t                                                   checkpointDataCount;
     d.vkGetQueueCheckpointData2NV( m_queue, &checkpointDataCount, nullptr );
@@ -17069,6 +18178,7 @@
   VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE std::vector<CheckpointData2NV, CheckpointData2NVAllocator>
                                          Queue::getCheckpointData2NV( CheckpointData2NVAllocator & checkpointData2NVAllocator, Dispatch const & d ) const
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     std::vector<CheckpointData2NV, CheckpointData2NVAllocator> checkpointData( checkpointData2NVAllocator );
     uint32_t                                                   checkpointDataCount;
     d.vkGetQueueCheckpointData2NV( m_queue, &checkpointDataCount, nullptr );
@@ -17088,6 +18198,7 @@
     const VULKAN_HPP_NAMESPACE::FragmentShadingRateCombinerOpKHR combinerOps[2],
     Dispatch const &                                             d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkCmdSetFragmentShadingRateEnumNV( m_commandBuffer,
                                          static_cast<VkFragmentShadingRateNV>( shadingRate ),
                                          reinterpret_cast<const VkFragmentShadingRateCombinerOpKHR *>( combinerOps ) );
@@ -17100,6 +18211,7 @@
     CommandBuffer::copyBuffer2KHR( const VULKAN_HPP_NAMESPACE::CopyBufferInfo2KHR * pCopyBufferInfo,
                                    Dispatch const &                                 d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkCmdCopyBuffer2KHR( m_commandBuffer, reinterpret_cast<const VkCopyBufferInfo2KHR *>( pCopyBufferInfo ) );
   }
 
@@ -17108,6 +18220,7 @@
   VULKAN_HPP_INLINE void CommandBuffer::copyBuffer2KHR( const CopyBufferInfo2KHR & copyBufferInfo,
                                                         Dispatch const &           d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkCmdCopyBuffer2KHR( m_commandBuffer, reinterpret_cast<const VkCopyBufferInfo2KHR *>( &copyBufferInfo ) );
   }
 #endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/
@@ -17116,6 +18229,7 @@
   VULKAN_HPP_INLINE void CommandBuffer::copyImage2KHR( const VULKAN_HPP_NAMESPACE::CopyImageInfo2KHR * pCopyImageInfo,
                                                        Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkCmdCopyImage2KHR( m_commandBuffer, reinterpret_cast<const VkCopyImageInfo2KHR *>( pCopyImageInfo ) );
   }
 
@@ -17124,6 +18238,7 @@
   VULKAN_HPP_INLINE void CommandBuffer::copyImage2KHR( const CopyImageInfo2KHR & copyImageInfo,
                                                        Dispatch const &          d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkCmdCopyImage2KHR( m_commandBuffer, reinterpret_cast<const VkCopyImageInfo2KHR *>( &copyImageInfo ) );
   }
 #endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/
@@ -17133,6 +18248,7 @@
     const VULKAN_HPP_NAMESPACE::CopyBufferToImageInfo2KHR * pCopyBufferToImageInfo,
     Dispatch const &                                        d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkCmdCopyBufferToImage2KHR( m_commandBuffer,
                                   reinterpret_cast<const VkCopyBufferToImageInfo2KHR *>( pCopyBufferToImageInfo ) );
   }
@@ -17142,6 +18258,7 @@
   VULKAN_HPP_INLINE void CommandBuffer::copyBufferToImage2KHR( const CopyBufferToImageInfo2KHR & copyBufferToImageInfo,
                                                                Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkCmdCopyBufferToImage2KHR( m_commandBuffer,
                                   reinterpret_cast<const VkCopyBufferToImageInfo2KHR *>( &copyBufferToImageInfo ) );
   }
@@ -17152,6 +18269,7 @@
     const VULKAN_HPP_NAMESPACE::CopyImageToBufferInfo2KHR * pCopyImageToBufferInfo,
     Dispatch const &                                        d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkCmdCopyImageToBuffer2KHR( m_commandBuffer,
                                   reinterpret_cast<const VkCopyImageToBufferInfo2KHR *>( pCopyImageToBufferInfo ) );
   }
@@ -17161,6 +18279,7 @@
   VULKAN_HPP_INLINE void CommandBuffer::copyImageToBuffer2KHR( const CopyImageToBufferInfo2KHR & copyImageToBufferInfo,
                                                                Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkCmdCopyImageToBuffer2KHR( m_commandBuffer,
                                   reinterpret_cast<const VkCopyImageToBufferInfo2KHR *>( &copyImageToBufferInfo ) );
   }
@@ -17170,6 +18289,7 @@
   VULKAN_HPP_INLINE void CommandBuffer::blitImage2KHR( const VULKAN_HPP_NAMESPACE::BlitImageInfo2KHR * pBlitImageInfo,
                                                        Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkCmdBlitImage2KHR( m_commandBuffer, reinterpret_cast<const VkBlitImageInfo2KHR *>( pBlitImageInfo ) );
   }
 
@@ -17178,6 +18298,7 @@
   VULKAN_HPP_INLINE void CommandBuffer::blitImage2KHR( const BlitImageInfo2KHR & blitImageInfo,
                                                        Dispatch const &          d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkCmdBlitImage2KHR( m_commandBuffer, reinterpret_cast<const VkBlitImageInfo2KHR *>( &blitImageInfo ) );
   }
 #endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/
@@ -17187,6 +18308,7 @@
     CommandBuffer::resolveImage2KHR( const VULKAN_HPP_NAMESPACE::ResolveImageInfo2KHR * pResolveImageInfo,
                                      Dispatch const &                                   d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkCmdResolveImage2KHR( m_commandBuffer, reinterpret_cast<const VkResolveImageInfo2KHR *>( pResolveImageInfo ) );
   }
 
@@ -17195,6 +18317,7 @@
   VULKAN_HPP_INLINE void CommandBuffer::resolveImage2KHR( const ResolveImageInfo2KHR & resolveImageInfo,
                                                           Dispatch const &             d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkCmdResolveImage2KHR( m_commandBuffer, reinterpret_cast<const VkResolveImageInfo2KHR *>( &resolveImageInfo ) );
   }
 #endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/
@@ -17207,6 +18330,7 @@
   VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE Result PhysicalDevice::acquireWinrtDisplayNV(
     VULKAN_HPP_NAMESPACE::DisplayKHR display, Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     return static_cast<Result>( d.vkAcquireWinrtDisplayNV( m_physicalDevice, static_cast<VkDisplayKHR>( display ) ) );
   }
 #  else
@@ -17214,6 +18338,7 @@
   VULKAN_HPP_NODISCARD_WHEN_NO_EXCEPTIONS VULKAN_HPP_INLINE typename ResultValueType<void>::type
     PhysicalDevice::acquireWinrtDisplayNV( VULKAN_HPP_NAMESPACE::DisplayKHR display, Dispatch const & d ) const
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     Result result =
       static_cast<Result>( d.vkAcquireWinrtDisplayNV( m_physicalDevice, static_cast<VkDisplayKHR>( display ) ) );
     return createResultValue( result, VULKAN_HPP_NAMESPACE_STRING "::PhysicalDevice::acquireWinrtDisplayNV" );
@@ -17226,6 +18351,7 @@
                                        VULKAN_HPP_NAMESPACE::DisplayKHR * pDisplay,
                                        Dispatch const &                   d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     return static_cast<Result>(
       d.vkGetWinrtDisplayNV( m_physicalDevice, deviceRelativeId, reinterpret_cast<VkDisplayKHR *>( pDisplay ) ) );
   }
@@ -17236,6 +18362,7 @@
     typename ResultValueType<VULKAN_HPP_NAMESPACE::DisplayKHR>::type
     PhysicalDevice::getWinrtDisplayNV( uint32_t deviceRelativeId, Dispatch const & d ) const
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     VULKAN_HPP_NAMESPACE::DisplayKHR display;
     Result                           result = static_cast<Result>(
       d.vkGetWinrtDisplayNV( m_physicalDevice, deviceRelativeId, reinterpret_cast<VkDisplayKHR *>( &display ) ) );
@@ -17248,6 +18375,7 @@
     typename ResultValueType<UniqueHandle<VULKAN_HPP_NAMESPACE::DisplayKHR, Dispatch>>::type
     PhysicalDevice::getWinrtDisplayNVUnique( uint32_t deviceRelativeId, Dispatch const & d ) const
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     VULKAN_HPP_NAMESPACE::DisplayKHR display;
     Result                           result = static_cast<Result>(
       d.vkGetWinrtDisplayNV( m_physicalDevice, deviceRelativeId, reinterpret_cast<VkDisplayKHR *>( &display ) ) );
@@ -17269,6 +18397,7 @@
                                         VULKAN_HPP_NAMESPACE::SurfaceKHR *                         pSurface,
                                         Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     return static_cast<Result>(
       d.vkCreateDirectFBSurfaceEXT( m_instance,
                                     reinterpret_cast<const VkDirectFBSurfaceCreateInfoEXT *>( pCreateInfo ),
@@ -17284,6 +18413,7 @@
                                         Optional<const AllocationCallbacks>  allocator,
                                         Dispatch const &                     d ) const
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     VULKAN_HPP_NAMESPACE::SurfaceKHR surface;
     Result                           result = static_cast<Result>(
       d.vkCreateDirectFBSurfaceEXT( m_instance,
@@ -17302,6 +18432,7 @@
                                               Optional<const AllocationCallbacks>  allocator,
                                               Dispatch const &                     d ) const
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     VULKAN_HPP_NAMESPACE::SurfaceKHR surface;
     Result                           result = static_cast<Result>(
       d.vkCreateDirectFBSurfaceEXT( m_instance,
@@ -17320,6 +18451,7 @@
   VULKAN_HPP_INLINE Bool32 PhysicalDevice::getDirectFBPresentationSupportEXT(
     uint32_t queueFamilyIndex, IDirectFB * dfb, Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     return static_cast<Bool32>(
       d.vkGetPhysicalDeviceDirectFBPresentationSupportEXT( m_physicalDevice, queueFamilyIndex, dfb ) );
   }
@@ -17329,6 +18461,7 @@
   VULKAN_HPP_INLINE Bool32 PhysicalDevice::getDirectFBPresentationSupportEXT(
     uint32_t queueFamilyIndex, IDirectFB & dfb, Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     return d.vkGetPhysicalDeviceDirectFBPresentationSupportEXT( m_physicalDevice, queueFamilyIndex, &dfb );
   }
 #  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/
@@ -17347,6 +18480,7 @@
     uint32_t                                                    depth,
     Dispatch const &                                            d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkCmdTraceRaysKHR( m_commandBuffer,
                          reinterpret_cast<const VkStridedDeviceAddressRegionKHR *>( pRaygenShaderBindingTable ),
                          reinterpret_cast<const VkStridedDeviceAddressRegionKHR *>( pMissShaderBindingTable ),
@@ -17368,6 +18502,7 @@
                                                       uint32_t                              depth,
                                                       Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkCmdTraceRaysKHR( m_commandBuffer,
                          reinterpret_cast<const VkStridedDeviceAddressRegionKHR *>( &raygenShaderBindingTable ),
                          reinterpret_cast<const VkStridedDeviceAddressRegionKHR *>( &missShaderBindingTable ),
@@ -17389,6 +18524,7 @@
                                           VULKAN_HPP_NAMESPACE::Pipeline *                              pPipelines,
                                           Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     return static_cast<Result>(
       d.vkCreateRayTracingPipelinesKHR( m_device,
                                         static_cast<VkDeferredOperationKHR>( deferredOperation ),
@@ -17409,6 +18545,7 @@
       Optional<const AllocationCallbacks>                                             allocator,
       Dispatch const &                                                                d ) const
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     std::vector<Pipeline, PipelineAllocator> pipelines( createInfos.size() );
     Result                                   result = static_cast<Result>( d.vkCreateRayTracingPipelinesKHR(
       m_device,
@@ -17441,6 +18578,7 @@
       PipelineAllocator &                                                             pipelineAllocator,
       Dispatch const &                                                                d ) const
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     std::vector<Pipeline, PipelineAllocator> pipelines( createInfos.size(), pipelineAllocator );
     Result                                   result = static_cast<Result>( d.vkCreateRayTracingPipelinesKHR(
       m_device,
@@ -17468,6 +18606,7 @@
                                          Optional<const AllocationCallbacks>                           allocator,
                                          Dispatch const &                                              d ) const
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     Pipeline pipeline;
     Result   result = static_cast<Result>(
       d.vkCreateRayTracingPipelinesKHR( m_device,
@@ -17497,6 +18636,7 @@
       Optional<const AllocationCallbacks>                                             allocator,
       Dispatch const &                                                                d ) const
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     std::vector<UniqueHandle<Pipeline, Dispatch>, PipelineAllocator> uniquePipelines;
     std::vector<Pipeline>                                            pipelines( createInfos.size() );
     Result result = static_cast<Result>( d.vkCreateRayTracingPipelinesKHR(
@@ -17543,6 +18683,7 @@
       PipelineAllocator &                                                             pipelineAllocator,
       Dispatch const &                                                                d ) const
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     std::vector<UniqueHandle<Pipeline, Dispatch>, PipelineAllocator> uniquePipelines( pipelineAllocator );
     std::vector<Pipeline>                                            pipelines( createInfos.size() );
     Result result = static_cast<Result>( d.vkCreateRayTracingPipelinesKHR(
@@ -17583,6 +18724,7 @@
                                                Optional<const AllocationCallbacks>                           allocator,
                                                Dispatch const &                                              d ) const
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     Pipeline pipeline;
     Result   result = static_cast<Result>(
       d.vkCreateRayTracingPipelinesKHR( m_device,
@@ -17616,6 +18758,7 @@
                                                 void *                         pData,
                                                 Dispatch const &               d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     return static_cast<Result>( d.vkGetRayTracingShaderGroupHandlesKHR(
       m_device, static_cast<VkPipeline>( pipeline ), firstGroup, groupCount, dataSize, pData ) );
   }
@@ -17631,6 +18774,7 @@
       ArrayProxy<T> const &          data,
       Dispatch const &               d ) const
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     Result result =
       static_cast<Result>( d.vkGetRayTracingShaderGroupHandlesKHR( m_device,
                                                                    static_cast<VkPipeline>( pipeline ),
@@ -17649,6 +18793,7 @@
                                                 size_t                         dataSize,
                                                 Dispatch const &               d ) const
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     VULKAN_HPP_ASSERT( dataSize % sizeof( T ) == 0 );
     std::vector<T, Allocator> data( dataSize / sizeof( T ) );
     Result                    result =
@@ -17669,6 +18814,7 @@
                                                uint32_t                       groupCount,
                                                Dispatch const &               d ) const
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     T      data;
     Result result = static_cast<Result>( d.vkGetRayTracingShaderGroupHandlesKHR( m_device,
                                                                                  static_cast<VkPipeline>( pipeline ),
@@ -17689,6 +18835,7 @@
                                                              void *                         pData,
                                                              Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     return static_cast<Result>( d.vkGetRayTracingCaptureReplayShaderGroupHandlesKHR(
       m_device, static_cast<VkPipeline>( pipeline ), firstGroup, groupCount, dataSize, pData ) );
   }
@@ -17704,6 +18851,7 @@
       ArrayProxy<T> const &          data,
       Dispatch const &               d ) const
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     Result result = static_cast<Result>(
       d.vkGetRayTracingCaptureReplayShaderGroupHandlesKHR( m_device,
                                                            static_cast<VkPipeline>( pipeline ),
@@ -17723,6 +18871,7 @@
                                                              size_t                         dataSize,
                                                              Dispatch const &               d ) const
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     VULKAN_HPP_ASSERT( dataSize % sizeof( T ) == 0 );
     std::vector<T, Allocator> data( dataSize / sizeof( T ) );
     Result                    result = static_cast<Result>(
@@ -17743,6 +18892,7 @@
                                                             uint32_t                       groupCount,
                                                             Dispatch const &               d ) const
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     T      data;
     Result result =
       static_cast<Result>( d.vkGetRayTracingCaptureReplayShaderGroupHandlesKHR( m_device,
@@ -17765,6 +18915,7 @@
     VULKAN_HPP_NAMESPACE::DeviceAddress                         indirectDeviceAddress,
     Dispatch const &                                            d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkCmdTraceRaysIndirectKHR(
       m_commandBuffer,
       reinterpret_cast<const VkStridedDeviceAddressRegionKHR *>( pRaygenShaderBindingTable ),
@@ -17784,6 +18935,7 @@
                                          VULKAN_HPP_NAMESPACE::DeviceAddress   indirectDeviceAddress,
                                          Dispatch const &                      d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkCmdTraceRaysIndirectKHR(
       m_commandBuffer,
       reinterpret_cast<const VkStridedDeviceAddressRegionKHR *>( &raygenShaderBindingTable ),
@@ -17801,6 +18953,7 @@
                                                   VULKAN_HPP_NAMESPACE::ShaderGroupShaderKHR groupShader,
                                                   Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     return static_cast<DeviceSize>( d.vkGetRayTracingShaderGroupStackSizeKHR(
       m_device, static_cast<VkPipeline>( pipeline ), group, static_cast<VkShaderGroupShaderKHR>( groupShader ) ) );
   }
@@ -17810,6 +18963,7 @@
     CommandBuffer::setRayTracingPipelineStackSizeKHR( uint32_t         pipelineStackSize,
                                                       Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkCmdSetRayTracingPipelineStackSizeKHR( m_commandBuffer, pipelineStackSize );
   }
 
@@ -17823,6 +18977,7 @@
     const VULKAN_HPP_NAMESPACE::VertexInputAttributeDescription2EXT * pVertexAttributeDescriptions,
     Dispatch const &                                                  d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkCmdSetVertexInputEXT(
       m_commandBuffer,
       vertexBindingDescriptionCount,
@@ -17838,6 +18993,7 @@
     ArrayProxy<const VULKAN_HPP_NAMESPACE::VertexInputAttributeDescription2EXT> const & vertexAttributeDescriptions,
     Dispatch const &                                                                    d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkCmdSetVertexInputEXT(
       m_commandBuffer,
       vertexBindingDescriptions.size(),
@@ -17856,6 +19012,7 @@
     zx_handle_t *                                                  pZirconHandle,
     Dispatch const &                                               d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     return static_cast<Result>( d.vkGetMemoryZirconHandleFUCHSIA(
       m_device, reinterpret_cast<const VkMemoryGetZirconHandleInfoFUCHSIA *>( pGetZirconHandleInfo ), pZirconHandle ) );
   }
@@ -17866,6 +19023,7 @@
                                           Device::getMemoryZirconHandleFUCHSIA( const MemoryGetZirconHandleInfoFUCHSIA & getZirconHandleInfo,
                                           Dispatch const &                         d ) const
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     zx_handle_t zirconHandle;
     Result      result = static_cast<Result>( d.vkGetMemoryZirconHandleFUCHSIA(
       m_device, reinterpret_cast<const VkMemoryGetZirconHandleInfoFUCHSIA *>( &getZirconHandleInfo ), &zirconHandle ) );
@@ -17881,6 +19039,7 @@
     VULKAN_HPP_NAMESPACE::MemoryZirconHandlePropertiesFUCHSIA * pMemoryZirconHandleProperties,
     Dispatch const &                                            d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     return static_cast<Result>( d.vkGetMemoryZirconHandlePropertiesFUCHSIA(
       m_device,
       static_cast<VkExternalMemoryHandleTypeFlagBits>( handleType ),
@@ -17895,6 +19054,7 @@
                                                     zx_handle_t                                            zirconHandle,
                                                     Dispatch const &                                       d ) const
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     VULKAN_HPP_NAMESPACE::MemoryZirconHandlePropertiesFUCHSIA memoryZirconHandleProperties;
     Result result = static_cast<Result>( d.vkGetMemoryZirconHandlePropertiesFUCHSIA(
       m_device,
@@ -17916,6 +19076,7 @@
     const VULKAN_HPP_NAMESPACE::ImportSemaphoreZirconHandleInfoFUCHSIA * pImportSemaphoreZirconHandleInfo,
     Dispatch const &                                                     d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     return static_cast<Result>( d.vkImportSemaphoreZirconHandleFUCHSIA(
       m_device,
       reinterpret_cast<const VkImportSemaphoreZirconHandleInfoFUCHSIA *>( pImportSemaphoreZirconHandleInfo ) ) );
@@ -17927,6 +19088,7 @@
                                           Device::importSemaphoreZirconHandleFUCHSIA(
       const ImportSemaphoreZirconHandleInfoFUCHSIA & importSemaphoreZirconHandleInfo, Dispatch const & d ) const
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     Result result = static_cast<Result>( d.vkImportSemaphoreZirconHandleFUCHSIA(
       m_device,
       reinterpret_cast<const VkImportSemaphoreZirconHandleInfoFUCHSIA *>( &importSemaphoreZirconHandleInfo ) ) );
@@ -17940,6 +19102,7 @@
     zx_handle_t *                                                     pZirconHandle,
     Dispatch const &                                                  d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     return static_cast<Result>( d.vkGetSemaphoreZirconHandleFUCHSIA(
       m_device,
       reinterpret_cast<const VkSemaphoreGetZirconHandleInfoFUCHSIA *>( pGetZirconHandleInfo ),
@@ -17952,6 +19115,7 @@
                                           Device::getSemaphoreZirconHandleFUCHSIA( const SemaphoreGetZirconHandleInfoFUCHSIA & getZirconHandleInfo,
                                              Dispatch const &                            d ) const
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     zx_handle_t zirconHandle;
     Result      result = static_cast<Result>( d.vkGetSemaphoreZirconHandleFUCHSIA(
       m_device,
@@ -17971,6 +19135,7 @@
                                                      VULKAN_HPP_NAMESPACE::Extent2D * pMaxWorkgroupSize,
                                                      Dispatch const &                 d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     return static_cast<Result>( d.vkGetDeviceSubpassShadingMaxWorkgroupSizeHUAWEI(
       m_device, static_cast<VkRenderPass>( renderpass ), reinterpret_cast<VkExtent2D *>( pMaxWorkgroupSize ) ) );
   }
@@ -17981,6 +19146,7 @@
                                          Device::getSubpassShadingMaxWorkgroupSizeHUAWEI( VULKAN_HPP_NAMESPACE::RenderPass renderpass,
                                                      Dispatch const &                 d ) const
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     VULKAN_HPP_NAMESPACE::Extent2D maxWorkgroupSize;
     Result                         result = static_cast<Result>( d.vkGetDeviceSubpassShadingMaxWorkgroupSizeHUAWEI(
       m_device, static_cast<VkRenderPass>( renderpass ), reinterpret_cast<VkExtent2D *>( &maxWorkgroupSize ) ) );
@@ -17994,33 +19160,48 @@
   template <typename Dispatch>
   VULKAN_HPP_INLINE void CommandBuffer::subpassShadingHUAWEI( Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkCmdSubpassShadingHUAWEI( m_commandBuffer );
   }
 
+  //=== VK_HUAWEI_invocation_mask ===
+
+  template <typename Dispatch>
+  VULKAN_HPP_INLINE void CommandBuffer::bindInvocationMaskHUAWEI( VULKAN_HPP_NAMESPACE::ImageView   imageView,
+                                                                  VULKAN_HPP_NAMESPACE::ImageLayout imageLayout,
+                                                                  Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
+  {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
+    d.vkCmdBindInvocationMaskHUAWEI(
+      m_commandBuffer, static_cast<VkImageView>( imageView ), static_cast<VkImageLayout>( imageLayout ) );
+  }
+
   //=== VK_NV_external_memory_rdma ===
 
   template <typename Dispatch>
   VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE Result Device::getMemoryRemoteAddressNV(
-    const VULKAN_HPP_NAMESPACE::MemoryGetRemoteAddressInfoNV * getMemoryRemoteAddressInfo,
+    const VULKAN_HPP_NAMESPACE::MemoryGetRemoteAddressInfoNV * pMemoryGetRemoteAddressInfo,
     VULKAN_HPP_NAMESPACE::RemoteAddressNV *                    pAddress,
     Dispatch const &                                           d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     return static_cast<Result>( d.vkGetMemoryRemoteAddressNV(
       m_device,
-      reinterpret_cast<const VkMemoryGetRemoteAddressInfoNV *>( getMemoryRemoteAddressInfo ),
+      reinterpret_cast<const VkMemoryGetRemoteAddressInfoNV *>( pMemoryGetRemoteAddressInfo ),
       reinterpret_cast<VkRemoteAddressNV *>( pAddress ) ) );
   }
 
 #ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE
   template <typename Dispatch>
   VULKAN_HPP_INLINE typename ResultValueType<VULKAN_HPP_NAMESPACE::RemoteAddressNV>::type
-    Device::getMemoryRemoteAddressNV( const MemoryGetRemoteAddressInfoNV & getMemoryRemoteAddressInfo,
+    Device::getMemoryRemoteAddressNV( const MemoryGetRemoteAddressInfoNV & memoryGetRemoteAddressInfo,
                                       Dispatch const &                     d ) const
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     VULKAN_HPP_NAMESPACE::RemoteAddressNV address;
     Result                                result = static_cast<Result>( d.vkGetMemoryRemoteAddressNV(
       m_device,
-      reinterpret_cast<const VkMemoryGetRemoteAddressInfoNV *>( &getMemoryRemoteAddressInfo ),
+      reinterpret_cast<const VkMemoryGetRemoteAddressInfoNV *>( &memoryGetRemoteAddressInfo ),
       reinterpret_cast<VkRemoteAddressNV *>( &address ) ) );
     return createResultValue( result, address, VULKAN_HPP_NAMESPACE_STRING "::Device::getMemoryRemoteAddressNV" );
   }
@@ -18032,6 +19213,7 @@
   VULKAN_HPP_INLINE void CommandBuffer::setPatchControlPointsEXT( uint32_t         patchControlPoints,
                                                                   Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkCmdSetPatchControlPointsEXT( m_commandBuffer, patchControlPoints );
   }
 
@@ -18040,6 +19222,7 @@
     CommandBuffer::setRasterizerDiscardEnableEXT( VULKAN_HPP_NAMESPACE::Bool32 rasterizerDiscardEnable,
                                                   Dispatch const &             d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkCmdSetRasterizerDiscardEnableEXT( m_commandBuffer, static_cast<VkBool32>( rasterizerDiscardEnable ) );
   }
 
@@ -18047,6 +19230,7 @@
   VULKAN_HPP_INLINE void CommandBuffer::setDepthBiasEnableEXT( VULKAN_HPP_NAMESPACE::Bool32 depthBiasEnable,
                                                                Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkCmdSetDepthBiasEnableEXT( m_commandBuffer, static_cast<VkBool32>( depthBiasEnable ) );
   }
 
@@ -18054,6 +19238,7 @@
   VULKAN_HPP_INLINE void CommandBuffer::setLogicOpEXT( VULKAN_HPP_NAMESPACE::LogicOp logicOp,
                                                        Dispatch const &              d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkCmdSetLogicOpEXT( m_commandBuffer, static_cast<VkLogicOp>( logicOp ) );
   }
 
@@ -18062,6 +19247,7 @@
     CommandBuffer::setPrimitiveRestartEnableEXT( VULKAN_HPP_NAMESPACE::Bool32 primitiveRestartEnable,
                                                  Dispatch const &             d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkCmdSetPrimitiveRestartEnableEXT( m_commandBuffer, static_cast<VkBool32>( primitiveRestartEnable ) );
   }
 
@@ -18075,6 +19261,7 @@
                                       VULKAN_HPP_NAMESPACE::SurfaceKHR *                       pSurface,
                                       Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     return static_cast<Result>(
       d.vkCreateScreenSurfaceQNX( m_instance,
                                   reinterpret_cast<const VkScreenSurfaceCreateInfoQNX *>( pCreateInfo ),
@@ -18090,6 +19277,7 @@
                                       Optional<const AllocationCallbacks> allocator,
                                       Dispatch const &                    d ) const
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     VULKAN_HPP_NAMESPACE::SurfaceKHR surface;
     Result                           result = static_cast<Result>(
       d.vkCreateScreenSurfaceQNX( m_instance,
@@ -18108,6 +19296,7 @@
                                             Optional<const AllocationCallbacks> allocator,
                                             Dispatch const &                    d ) const
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     VULKAN_HPP_NAMESPACE::SurfaceKHR surface;
     Result                           result = static_cast<Result>(
       d.vkCreateScreenSurfaceQNX( m_instance,
@@ -18126,6 +19315,7 @@
   VULKAN_HPP_INLINE Bool32 PhysicalDevice::getScreenPresentationSupportQNX(
     uint32_t queueFamilyIndex, struct _screen_window * window, Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     return static_cast<Bool32>(
       d.vkGetPhysicalDeviceScreenPresentationSupportQNX( m_physicalDevice, queueFamilyIndex, window ) );
   }
@@ -18135,6 +19325,7 @@
   VULKAN_HPP_INLINE Bool32 PhysicalDevice::getScreenPresentationSupportQNX(
     uint32_t queueFamilyIndex, struct _screen_window & window, Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     return d.vkGetPhysicalDeviceScreenPresentationSupportQNX( m_physicalDevice, queueFamilyIndex, &window );
   }
 #  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/
@@ -18147,6 +19338,7 @@
                                                                 const VULKAN_HPP_NAMESPACE::Bool32 * pColorWriteEnables,
                                                                 Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkCmdSetColorWriteEnableEXT(
       m_commandBuffer, attachmentCount, reinterpret_cast<const VkBool32 *>( pColorWriteEnables ) );
   }
@@ -18157,6 +19349,7 @@
     CommandBuffer::setColorWriteEnableEXT( ArrayProxy<const VULKAN_HPP_NAMESPACE::Bool32> const & colorWriteEnables,
                                            Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkCmdSetColorWriteEnableEXT(
       m_commandBuffer, colorWriteEnables.size(), reinterpret_cast<const VkBool32 *>( colorWriteEnables.data() ) );
   }
@@ -18172,6 +19365,7 @@
                                                       uint32_t                                       stride,
                                                       Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkCmdDrawMultiEXT( m_commandBuffer,
                          drawCount,
                          reinterpret_cast<const VkMultiDrawInfoEXT *>( pVertexInfo ),
@@ -18189,6 +19383,7 @@
                                  uint32_t                                                         stride,
                                  Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkCmdDrawMultiEXT( m_commandBuffer,
                          vertexInfo.size(),
                          reinterpret_cast<const VkMultiDrawInfoEXT *>( vertexInfo.data() ),
@@ -18208,6 +19403,7 @@
                                         const int32_t *                                       pVertexOffset,
                                         Dispatch const & d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkCmdDrawMultiIndexedEXT( m_commandBuffer,
                                 drawCount,
                                 reinterpret_cast<const VkMultiDrawIndexedInfoEXT *>( pIndexInfo ),
@@ -18227,6 +19423,7 @@
     Optional<const int32_t>                                                 vertexOffset,
     Dispatch const &                                                        d ) const VULKAN_HPP_NOEXCEPT
   {
+    VULKAN_HPP_ASSERT( d.getVkHeaderVersion() == VK_HEADER_VERSION );
     d.vkCmdDrawMultiIndexedEXT( m_commandBuffer,
                                 indexInfo.size(),
                                 reinterpret_cast<const VkMultiDrawIndexedInfoEXT *>( indexInfo.data() ),
diff --git a/third_party/vulkan-deps/vulkan-headers/src/include/vulkan/vulkan_handles.hpp b/third_party/vulkan-deps/vulkan-headers/src/include/vulkan/vulkan_handles.hpp
index dfa915b..a06156e 100644
--- a/third_party/vulkan-deps/vulkan-headers/src/include/vulkan/vulkan_handles.hpp
+++ b/third_party/vulkan-deps/vulkan-headers/src/include/vulkan/vulkan_handles.hpp
@@ -10,984 +10,1229 @@
 
 namespace VULKAN_HPP_NAMESPACE
 {
-  struct AabbPositionsKHR;
-  using AabbPositionsNV = AabbPositionsKHR;
-  struct AccelerationStructureBuildGeometryInfoKHR;
-  struct AccelerationStructureBuildRangeInfoKHR;
-  struct AccelerationStructureBuildSizesInfoKHR;
-  struct AccelerationStructureCreateInfoKHR;
-  struct AccelerationStructureCreateInfoNV;
-  struct AccelerationStructureDeviceAddressInfoKHR;
-  struct AccelerationStructureGeometryAabbsDataKHR;
-  union AccelerationStructureGeometryDataKHR;
-  struct AccelerationStructureGeometryInstancesDataKHR;
-  struct AccelerationStructureGeometryKHR;
-  struct AccelerationStructureGeometryMotionTrianglesDataNV;
-  struct AccelerationStructureGeometryTrianglesDataKHR;
-  struct AccelerationStructureInfoNV;
-  struct AccelerationStructureInstanceKHR;
-  using AccelerationStructureInstanceNV = AccelerationStructureInstanceKHR;
-  struct AccelerationStructureMatrixMotionInstanceNV;
-  struct AccelerationStructureMemoryRequirementsInfoNV;
-  struct AccelerationStructureMotionInfoNV;
-  union AccelerationStructureMotionInstanceDataNV;
-  struct AccelerationStructureMotionInstanceNV;
-  struct AccelerationStructureSRTMotionInstanceNV;
-  struct AccelerationStructureVersionInfoKHR;
-  struct AcquireNextImageInfoKHR;
-  struct AcquireProfilingLockInfoKHR;
-  struct AllocationCallbacks;
-#if defined( VK_USE_PLATFORM_ANDROID_KHR )
-  struct AndroidHardwareBufferFormatPropertiesANDROID;
-#endif /*VK_USE_PLATFORM_ANDROID_KHR*/
-#if defined( VK_USE_PLATFORM_ANDROID_KHR )
-  struct AndroidHardwareBufferPropertiesANDROID;
-#endif /*VK_USE_PLATFORM_ANDROID_KHR*/
-#if defined( VK_USE_PLATFORM_ANDROID_KHR )
-  struct AndroidHardwareBufferUsageANDROID;
-#endif /*VK_USE_PLATFORM_ANDROID_KHR*/
-#if defined( VK_USE_PLATFORM_ANDROID_KHR )
-  struct AndroidSurfaceCreateInfoKHR;
-#endif /*VK_USE_PLATFORM_ANDROID_KHR*/
-  struct ApplicationInfo;
-  struct AttachmentDescription;
-  struct AttachmentDescription2;
-  using AttachmentDescription2KHR = AttachmentDescription2;
-  struct AttachmentDescriptionStencilLayout;
-  using AttachmentDescriptionStencilLayoutKHR = AttachmentDescriptionStencilLayout;
-  struct AttachmentReference;
-  struct AttachmentReference2;
-  using AttachmentReference2KHR = AttachmentReference2;
-  struct AttachmentReferenceStencilLayout;
-  using AttachmentReferenceStencilLayoutKHR = AttachmentReferenceStencilLayout;
-  struct AttachmentSampleLocationsEXT;
+  //===================================
+  //=== STRUCT forward declarations ===
+  //===================================
+
+  //=== VK_VERSION_1_0 ===
+  struct Extent2D;
+  struct Extent3D;
+  struct Offset2D;
+  struct Offset3D;
+  struct Rect2D;
   struct BaseInStructure;
   struct BaseOutStructure;
-  struct BindAccelerationStructureMemoryInfoNV;
-  struct BindBufferMemoryDeviceGroupInfo;
-  using BindBufferMemoryDeviceGroupInfoKHR = BindBufferMemoryDeviceGroupInfo;
-  struct BindBufferMemoryInfo;
-  using BindBufferMemoryInfoKHR = BindBufferMemoryInfo;
-  struct BindImageMemoryDeviceGroupInfo;
-  using BindImageMemoryDeviceGroupInfoKHR = BindImageMemoryDeviceGroupInfo;
-  struct BindImageMemoryInfo;
-  using BindImageMemoryInfoKHR = BindImageMemoryInfo;
-  struct BindImageMemorySwapchainInfoKHR;
-  struct BindImagePlaneMemoryInfo;
-  using BindImagePlaneMemoryInfoKHR = BindImagePlaneMemoryInfo;
-  struct BindIndexBufferIndirectCommandNV;
-  struct BindShaderGroupIndirectCommandNV;
-  struct BindSparseInfo;
-  struct BindVertexBufferIndirectCommandNV;
-  struct BlitImageInfo2KHR;
-  struct BufferCopy;
-  struct BufferCopy2KHR;
-  struct BufferCreateInfo;
-  struct BufferDeviceAddressCreateInfoEXT;
-  struct BufferDeviceAddressInfo;
-  using BufferDeviceAddressInfoEXT = BufferDeviceAddressInfo;
-  using BufferDeviceAddressInfoKHR = BufferDeviceAddressInfo;
-  struct BufferImageCopy;
-  struct BufferImageCopy2KHR;
   struct BufferMemoryBarrier;
-  struct BufferMemoryBarrier2KHR;
-  struct BufferMemoryRequirementsInfo2;
-  using BufferMemoryRequirementsInfo2KHR = BufferMemoryRequirementsInfo2;
-  struct BufferOpaqueCaptureAddressCreateInfo;
-  using BufferOpaqueCaptureAddressCreateInfoKHR = BufferOpaqueCaptureAddressCreateInfo;
+  struct DispatchIndirectCommand;
+  struct DrawIndexedIndirectCommand;
+  struct DrawIndirectCommand;
+  struct ImageMemoryBarrier;
+  struct MemoryBarrier;
+  struct PipelineCacheHeaderVersionOne;
+  struct AllocationCallbacks;
+  struct ApplicationInfo;
+  struct FormatProperties;
+  struct ImageFormatProperties;
+  struct InstanceCreateInfo;
+  struct MemoryHeap;
+  struct MemoryType;
+  struct PhysicalDeviceFeatures;
+  struct PhysicalDeviceLimits;
+  struct PhysicalDeviceMemoryProperties;
+  struct PhysicalDeviceProperties;
+  struct PhysicalDeviceSparseProperties;
+  struct QueueFamilyProperties;
+  struct DeviceCreateInfo;
+  struct DeviceQueueCreateInfo;
+  struct ExtensionProperties;
+  struct LayerProperties;
+  struct SubmitInfo;
+  struct MappedMemoryRange;
+  struct MemoryAllocateInfo;
+  struct MemoryRequirements;
+  struct BindSparseInfo;
+  struct ImageSubresource;
+  struct SparseBufferMemoryBindInfo;
+  struct SparseImageFormatProperties;
+  struct SparseImageMemoryBind;
+  struct SparseImageMemoryBindInfo;
+  struct SparseImageMemoryRequirements;
+  struct SparseImageOpaqueMemoryBindInfo;
+  struct SparseMemoryBind;
+  struct FenceCreateInfo;
+  struct SemaphoreCreateInfo;
+  struct EventCreateInfo;
+  struct QueryPoolCreateInfo;
+  struct BufferCreateInfo;
   struct BufferViewCreateInfo;
-  struct CalibratedTimestampInfoEXT;
-  struct CheckpointData2NV;
-  struct CheckpointDataNV;
+  struct ImageCreateInfo;
+  struct SubresourceLayout;
+  struct ComponentMapping;
+  struct ImageSubresourceRange;
+  struct ImageViewCreateInfo;
+  struct ShaderModuleCreateInfo;
+  struct PipelineCacheCreateInfo;
+  struct ComputePipelineCreateInfo;
+  struct GraphicsPipelineCreateInfo;
+  struct PipelineColorBlendAttachmentState;
+  struct PipelineColorBlendStateCreateInfo;
+  struct PipelineDepthStencilStateCreateInfo;
+  struct PipelineDynamicStateCreateInfo;
+  struct PipelineInputAssemblyStateCreateInfo;
+  struct PipelineMultisampleStateCreateInfo;
+  struct PipelineRasterizationStateCreateInfo;
+  struct PipelineShaderStageCreateInfo;
+  struct PipelineTessellationStateCreateInfo;
+  struct PipelineVertexInputStateCreateInfo;
+  struct PipelineViewportStateCreateInfo;
+  struct SpecializationInfo;
+  struct SpecializationMapEntry;
+  struct StencilOpState;
+  struct VertexInputAttributeDescription;
+  struct VertexInputBindingDescription;
+  struct Viewport;
+  struct PipelineLayoutCreateInfo;
+  struct PushConstantRange;
+  struct SamplerCreateInfo;
+  struct CopyDescriptorSet;
+  struct DescriptorBufferInfo;
+  struct DescriptorImageInfo;
+  struct DescriptorPoolCreateInfo;
+  struct DescriptorPoolSize;
+  struct DescriptorSetAllocateInfo;
+  struct DescriptorSetLayoutBinding;
+  struct DescriptorSetLayoutCreateInfo;
+  struct WriteDescriptorSet;
+  struct AttachmentDescription;
+  struct AttachmentReference;
+  struct FramebufferCreateInfo;
+  struct RenderPassCreateInfo;
+  struct SubpassDependency;
+  struct SubpassDescription;
+  struct CommandPoolCreateInfo;
+  struct CommandBufferAllocateInfo;
+  struct CommandBufferBeginInfo;
+  struct CommandBufferInheritanceInfo;
+  struct BufferCopy;
+  struct BufferImageCopy;
   struct ClearAttachment;
   union ClearColorValue;
   struct ClearDepthStencilValue;
   struct ClearRect;
   union ClearValue;
-  struct CoarseSampleLocationNV;
-  struct CoarseSampleOrderCustomNV;
-  struct CommandBufferAllocateInfo;
-  struct CommandBufferBeginInfo;
-  struct CommandBufferInheritanceConditionalRenderingInfoEXT;
-  struct CommandBufferInheritanceInfo;
-  struct CommandBufferInheritanceRenderPassTransformInfoQCOM;
-  struct CommandBufferInheritanceViewportScissorInfoNV;
-  struct CommandBufferSubmitInfoKHR;
-  struct CommandPoolCreateInfo;
-  struct ComponentMapping;
-  struct ComputePipelineCreateInfo;
-  struct ConditionalRenderingBeginInfoEXT;
+  struct ImageBlit;
+  struct ImageCopy;
+  struct ImageResolve;
+  struct ImageSubresourceLayers;
+  struct RenderPassBeginInfo;
+
+  //=== VK_VERSION_1_1 ===
+  struct PhysicalDeviceSubgroupProperties;
+  struct BindBufferMemoryInfo;
+  using BindBufferMemoryInfoKHR = BindBufferMemoryInfo;
+  struct BindImageMemoryInfo;
+  using BindImageMemoryInfoKHR = BindImageMemoryInfo;
+  struct PhysicalDevice16BitStorageFeatures;
+  using PhysicalDevice16BitStorageFeaturesKHR = PhysicalDevice16BitStorageFeatures;
+  struct MemoryDedicatedRequirements;
+  using MemoryDedicatedRequirementsKHR = MemoryDedicatedRequirements;
+  struct MemoryDedicatedAllocateInfo;
+  using MemoryDedicatedAllocateInfoKHR = MemoryDedicatedAllocateInfo;
+  struct MemoryAllocateFlagsInfo;
+  using MemoryAllocateFlagsInfoKHR = MemoryAllocateFlagsInfo;
+  struct DeviceGroupRenderPassBeginInfo;
+  using DeviceGroupRenderPassBeginInfoKHR = DeviceGroupRenderPassBeginInfo;
+  struct DeviceGroupCommandBufferBeginInfo;
+  using DeviceGroupCommandBufferBeginInfoKHR = DeviceGroupCommandBufferBeginInfo;
+  struct DeviceGroupSubmitInfo;
+  using DeviceGroupSubmitInfoKHR = DeviceGroupSubmitInfo;
+  struct DeviceGroupBindSparseInfo;
+  using DeviceGroupBindSparseInfoKHR = DeviceGroupBindSparseInfo;
+  struct BindBufferMemoryDeviceGroupInfo;
+  using BindBufferMemoryDeviceGroupInfoKHR = BindBufferMemoryDeviceGroupInfo;
+  struct BindImageMemoryDeviceGroupInfo;
+  using BindImageMemoryDeviceGroupInfoKHR = BindImageMemoryDeviceGroupInfo;
+  struct PhysicalDeviceGroupProperties;
+  using PhysicalDeviceGroupPropertiesKHR = PhysicalDeviceGroupProperties;
+  struct DeviceGroupDeviceCreateInfo;
+  using DeviceGroupDeviceCreateInfoKHR = DeviceGroupDeviceCreateInfo;
+  struct BufferMemoryRequirementsInfo2;
+  using BufferMemoryRequirementsInfo2KHR = BufferMemoryRequirementsInfo2;
+  struct ImageMemoryRequirementsInfo2;
+  using ImageMemoryRequirementsInfo2KHR = ImageMemoryRequirementsInfo2;
+  struct ImageSparseMemoryRequirementsInfo2;
+  using ImageSparseMemoryRequirementsInfo2KHR = ImageSparseMemoryRequirementsInfo2;
+  struct MemoryRequirements2;
+  using MemoryRequirements2KHR = MemoryRequirements2;
+  struct SparseImageMemoryRequirements2;
+  using SparseImageMemoryRequirements2KHR = SparseImageMemoryRequirements2;
+  struct PhysicalDeviceFeatures2;
+  using PhysicalDeviceFeatures2KHR = PhysicalDeviceFeatures2;
+  struct PhysicalDeviceProperties2;
+  using PhysicalDeviceProperties2KHR = PhysicalDeviceProperties2;
+  struct FormatProperties2;
+  using FormatProperties2KHR = FormatProperties2;
+  struct ImageFormatProperties2;
+  using ImageFormatProperties2KHR = ImageFormatProperties2;
+  struct PhysicalDeviceImageFormatInfo2;
+  using PhysicalDeviceImageFormatInfo2KHR = PhysicalDeviceImageFormatInfo2;
+  struct QueueFamilyProperties2;
+  using QueueFamilyProperties2KHR = QueueFamilyProperties2;
+  struct PhysicalDeviceMemoryProperties2;
+  using PhysicalDeviceMemoryProperties2KHR = PhysicalDeviceMemoryProperties2;
+  struct SparseImageFormatProperties2;
+  using SparseImageFormatProperties2KHR = SparseImageFormatProperties2;
+  struct PhysicalDeviceSparseImageFormatInfo2;
+  using PhysicalDeviceSparseImageFormatInfo2KHR = PhysicalDeviceSparseImageFormatInfo2;
+  struct PhysicalDevicePointClippingProperties;
+  using PhysicalDevicePointClippingPropertiesKHR = PhysicalDevicePointClippingProperties;
+  struct RenderPassInputAttachmentAspectCreateInfo;
+  using RenderPassInputAttachmentAspectCreateInfoKHR = RenderPassInputAttachmentAspectCreateInfo;
+  struct InputAttachmentAspectReference;
+  using InputAttachmentAspectReferenceKHR = InputAttachmentAspectReference;
+  struct ImageViewUsageCreateInfo;
+  using ImageViewUsageCreateInfoKHR = ImageViewUsageCreateInfo;
+  struct PipelineTessellationDomainOriginStateCreateInfo;
+  using PipelineTessellationDomainOriginStateCreateInfoKHR = PipelineTessellationDomainOriginStateCreateInfo;
+  struct RenderPassMultiviewCreateInfo;
+  using RenderPassMultiviewCreateInfoKHR = RenderPassMultiviewCreateInfo;
+  struct PhysicalDeviceMultiviewFeatures;
+  using PhysicalDeviceMultiviewFeaturesKHR = PhysicalDeviceMultiviewFeatures;
+  struct PhysicalDeviceMultiviewProperties;
+  using PhysicalDeviceMultiviewPropertiesKHR = PhysicalDeviceMultiviewProperties;
+  struct PhysicalDeviceVariablePointersFeatures;
+  using PhysicalDeviceVariablePointerFeatures     = PhysicalDeviceVariablePointersFeatures;
+  using PhysicalDeviceVariablePointerFeaturesKHR  = PhysicalDeviceVariablePointersFeatures;
+  using PhysicalDeviceVariablePointersFeaturesKHR = PhysicalDeviceVariablePointersFeatures;
+  struct PhysicalDeviceProtectedMemoryFeatures;
+  struct PhysicalDeviceProtectedMemoryProperties;
+  struct DeviceQueueInfo2;
+  struct ProtectedSubmitInfo;
+  struct SamplerYcbcrConversionCreateInfo;
+  using SamplerYcbcrConversionCreateInfoKHR = SamplerYcbcrConversionCreateInfo;
+  struct SamplerYcbcrConversionInfo;
+  using SamplerYcbcrConversionInfoKHR = SamplerYcbcrConversionInfo;
+  struct BindImagePlaneMemoryInfo;
+  using BindImagePlaneMemoryInfoKHR = BindImagePlaneMemoryInfo;
+  struct ImagePlaneMemoryRequirementsInfo;
+  using ImagePlaneMemoryRequirementsInfoKHR = ImagePlaneMemoryRequirementsInfo;
+  struct PhysicalDeviceSamplerYcbcrConversionFeatures;
+  using PhysicalDeviceSamplerYcbcrConversionFeaturesKHR = PhysicalDeviceSamplerYcbcrConversionFeatures;
+  struct SamplerYcbcrConversionImageFormatProperties;
+  using SamplerYcbcrConversionImageFormatPropertiesKHR = SamplerYcbcrConversionImageFormatProperties;
+  struct DescriptorUpdateTemplateEntry;
+  using DescriptorUpdateTemplateEntryKHR = DescriptorUpdateTemplateEntry;
+  struct DescriptorUpdateTemplateCreateInfo;
+  using DescriptorUpdateTemplateCreateInfoKHR = DescriptorUpdateTemplateCreateInfo;
+  struct ExternalMemoryProperties;
+  using ExternalMemoryPropertiesKHR = ExternalMemoryProperties;
+  struct PhysicalDeviceExternalImageFormatInfo;
+  using PhysicalDeviceExternalImageFormatInfoKHR = PhysicalDeviceExternalImageFormatInfo;
+  struct ExternalImageFormatProperties;
+  using ExternalImageFormatPropertiesKHR = ExternalImageFormatProperties;
+  struct PhysicalDeviceExternalBufferInfo;
+  using PhysicalDeviceExternalBufferInfoKHR = PhysicalDeviceExternalBufferInfo;
+  struct ExternalBufferProperties;
+  using ExternalBufferPropertiesKHR = ExternalBufferProperties;
+  struct PhysicalDeviceIDProperties;
+  using PhysicalDeviceIDPropertiesKHR = PhysicalDeviceIDProperties;
+  struct ExternalMemoryImageCreateInfo;
+  using ExternalMemoryImageCreateInfoKHR = ExternalMemoryImageCreateInfo;
+  struct ExternalMemoryBufferCreateInfo;
+  using ExternalMemoryBufferCreateInfoKHR = ExternalMemoryBufferCreateInfo;
+  struct ExportMemoryAllocateInfo;
+  using ExportMemoryAllocateInfoKHR = ExportMemoryAllocateInfo;
+  struct PhysicalDeviceExternalFenceInfo;
+  using PhysicalDeviceExternalFenceInfoKHR = PhysicalDeviceExternalFenceInfo;
+  struct ExternalFenceProperties;
+  using ExternalFencePropertiesKHR = ExternalFenceProperties;
+  struct ExportFenceCreateInfo;
+  using ExportFenceCreateInfoKHR = ExportFenceCreateInfo;
+  struct ExportSemaphoreCreateInfo;
+  using ExportSemaphoreCreateInfoKHR = ExportSemaphoreCreateInfo;
+  struct PhysicalDeviceExternalSemaphoreInfo;
+  using PhysicalDeviceExternalSemaphoreInfoKHR = PhysicalDeviceExternalSemaphoreInfo;
+  struct ExternalSemaphoreProperties;
+  using ExternalSemaphorePropertiesKHR = ExternalSemaphoreProperties;
+  struct PhysicalDeviceMaintenance3Properties;
+  using PhysicalDeviceMaintenance3PropertiesKHR = PhysicalDeviceMaintenance3Properties;
+  struct DescriptorSetLayoutSupport;
+  using DescriptorSetLayoutSupportKHR = DescriptorSetLayoutSupport;
+  struct PhysicalDeviceShaderDrawParametersFeatures;
+  using PhysicalDeviceShaderDrawParameterFeatures = PhysicalDeviceShaderDrawParametersFeatures;
+
+  //=== VK_VERSION_1_2 ===
+  struct PhysicalDeviceVulkan11Features;
+  struct PhysicalDeviceVulkan11Properties;
+  struct PhysicalDeviceVulkan12Features;
+  struct PhysicalDeviceVulkan12Properties;
+  struct ImageFormatListCreateInfo;
+  using ImageFormatListCreateInfoKHR = ImageFormatListCreateInfo;
+  struct RenderPassCreateInfo2;
+  using RenderPassCreateInfo2KHR = RenderPassCreateInfo2;
+  struct AttachmentDescription2;
+  using AttachmentDescription2KHR = AttachmentDescription2;
+  struct AttachmentReference2;
+  using AttachmentReference2KHR = AttachmentReference2;
+  struct SubpassDescription2;
+  using SubpassDescription2KHR = SubpassDescription2;
+  struct SubpassDependency2;
+  using SubpassDependency2KHR = SubpassDependency2;
+  struct SubpassBeginInfo;
+  using SubpassBeginInfoKHR = SubpassBeginInfo;
+  struct SubpassEndInfo;
+  using SubpassEndInfoKHR = SubpassEndInfo;
+  struct PhysicalDevice8BitStorageFeatures;
+  using PhysicalDevice8BitStorageFeaturesKHR = PhysicalDevice8BitStorageFeatures;
   struct ConformanceVersion;
   using ConformanceVersionKHR = ConformanceVersion;
-  struct CooperativeMatrixPropertiesNV;
-  struct CopyAccelerationStructureInfoKHR;
-  struct CopyAccelerationStructureToMemoryInfoKHR;
-  struct CopyBufferInfo2KHR;
-  struct CopyBufferToImageInfo2KHR;
-  struct CopyCommandTransformInfoQCOM;
-  struct CopyDescriptorSet;
-  struct CopyImageInfo2KHR;
-  struct CopyImageToBufferInfo2KHR;
-  struct CopyMemoryToAccelerationStructureInfoKHR;
-  struct CuFunctionCreateInfoNVX;
-  struct CuLaunchInfoNVX;
-  struct CuModuleCreateInfoNVX;
+  struct PhysicalDeviceDriverProperties;
+  using PhysicalDeviceDriverPropertiesKHR = PhysicalDeviceDriverProperties;
+  struct PhysicalDeviceShaderAtomicInt64Features;
+  using PhysicalDeviceShaderAtomicInt64FeaturesKHR = PhysicalDeviceShaderAtomicInt64Features;
+  struct PhysicalDeviceShaderFloat16Int8Features;
+  using PhysicalDeviceFloat16Int8FeaturesKHR       = PhysicalDeviceShaderFloat16Int8Features;
+  using PhysicalDeviceShaderFloat16Int8FeaturesKHR = PhysicalDeviceShaderFloat16Int8Features;
+  struct PhysicalDeviceFloatControlsProperties;
+  using PhysicalDeviceFloatControlsPropertiesKHR = PhysicalDeviceFloatControlsProperties;
+  struct DescriptorSetLayoutBindingFlagsCreateInfo;
+  using DescriptorSetLayoutBindingFlagsCreateInfoEXT = DescriptorSetLayoutBindingFlagsCreateInfo;
+  struct PhysicalDeviceDescriptorIndexingFeatures;
+  using PhysicalDeviceDescriptorIndexingFeaturesEXT = PhysicalDeviceDescriptorIndexingFeatures;
+  struct PhysicalDeviceDescriptorIndexingProperties;
+  using PhysicalDeviceDescriptorIndexingPropertiesEXT = PhysicalDeviceDescriptorIndexingProperties;
+  struct DescriptorSetVariableDescriptorCountAllocateInfo;
+  using DescriptorSetVariableDescriptorCountAllocateInfoEXT = DescriptorSetVariableDescriptorCountAllocateInfo;
+  struct DescriptorSetVariableDescriptorCountLayoutSupport;
+  using DescriptorSetVariableDescriptorCountLayoutSupportEXT = DescriptorSetVariableDescriptorCountLayoutSupport;
+  struct SubpassDescriptionDepthStencilResolve;
+  using SubpassDescriptionDepthStencilResolveKHR = SubpassDescriptionDepthStencilResolve;
+  struct PhysicalDeviceDepthStencilResolveProperties;
+  using PhysicalDeviceDepthStencilResolvePropertiesKHR = PhysicalDeviceDepthStencilResolveProperties;
+  struct PhysicalDeviceScalarBlockLayoutFeatures;
+  using PhysicalDeviceScalarBlockLayoutFeaturesEXT = PhysicalDeviceScalarBlockLayoutFeatures;
+  struct ImageStencilUsageCreateInfo;
+  using ImageStencilUsageCreateInfoEXT = ImageStencilUsageCreateInfo;
+  struct SamplerReductionModeCreateInfo;
+  using SamplerReductionModeCreateInfoEXT = SamplerReductionModeCreateInfo;
+  struct PhysicalDeviceSamplerFilterMinmaxProperties;
+  using PhysicalDeviceSamplerFilterMinmaxPropertiesEXT = PhysicalDeviceSamplerFilterMinmaxProperties;
+  struct PhysicalDeviceVulkanMemoryModelFeatures;
+  using PhysicalDeviceVulkanMemoryModelFeaturesKHR = PhysicalDeviceVulkanMemoryModelFeatures;
+  struct PhysicalDeviceImagelessFramebufferFeatures;
+  using PhysicalDeviceImagelessFramebufferFeaturesKHR = PhysicalDeviceImagelessFramebufferFeatures;
+  struct FramebufferAttachmentsCreateInfo;
+  using FramebufferAttachmentsCreateInfoKHR = FramebufferAttachmentsCreateInfo;
+  struct FramebufferAttachmentImageInfo;
+  using FramebufferAttachmentImageInfoKHR = FramebufferAttachmentImageInfo;
+  struct RenderPassAttachmentBeginInfo;
+  using RenderPassAttachmentBeginInfoKHR = RenderPassAttachmentBeginInfo;
+  struct PhysicalDeviceUniformBufferStandardLayoutFeatures;
+  using PhysicalDeviceUniformBufferStandardLayoutFeaturesKHR = PhysicalDeviceUniformBufferStandardLayoutFeatures;
+  struct PhysicalDeviceShaderSubgroupExtendedTypesFeatures;
+  using PhysicalDeviceShaderSubgroupExtendedTypesFeaturesKHR = PhysicalDeviceShaderSubgroupExtendedTypesFeatures;
+  struct PhysicalDeviceSeparateDepthStencilLayoutsFeatures;
+  using PhysicalDeviceSeparateDepthStencilLayoutsFeaturesKHR = PhysicalDeviceSeparateDepthStencilLayoutsFeatures;
+  struct AttachmentReferenceStencilLayout;
+  using AttachmentReferenceStencilLayoutKHR = AttachmentReferenceStencilLayout;
+  struct AttachmentDescriptionStencilLayout;
+  using AttachmentDescriptionStencilLayoutKHR = AttachmentDescriptionStencilLayout;
+  struct PhysicalDeviceHostQueryResetFeatures;
+  using PhysicalDeviceHostQueryResetFeaturesEXT = PhysicalDeviceHostQueryResetFeatures;
+  struct PhysicalDeviceTimelineSemaphoreFeatures;
+  using PhysicalDeviceTimelineSemaphoreFeaturesKHR = PhysicalDeviceTimelineSemaphoreFeatures;
+  struct PhysicalDeviceTimelineSemaphoreProperties;
+  using PhysicalDeviceTimelineSemaphorePropertiesKHR = PhysicalDeviceTimelineSemaphoreProperties;
+  struct SemaphoreTypeCreateInfo;
+  using SemaphoreTypeCreateInfoKHR = SemaphoreTypeCreateInfo;
+  struct TimelineSemaphoreSubmitInfo;
+  using TimelineSemaphoreSubmitInfoKHR = TimelineSemaphoreSubmitInfo;
+  struct SemaphoreWaitInfo;
+  using SemaphoreWaitInfoKHR = SemaphoreWaitInfo;
+  struct SemaphoreSignalInfo;
+  using SemaphoreSignalInfoKHR = SemaphoreSignalInfo;
+  struct PhysicalDeviceBufferDeviceAddressFeatures;
+  using PhysicalDeviceBufferDeviceAddressFeaturesKHR = PhysicalDeviceBufferDeviceAddressFeatures;
+  struct BufferDeviceAddressInfo;
+  using BufferDeviceAddressInfoEXT = BufferDeviceAddressInfo;
+  using BufferDeviceAddressInfoKHR = BufferDeviceAddressInfo;
+  struct BufferOpaqueCaptureAddressCreateInfo;
+  using BufferOpaqueCaptureAddressCreateInfoKHR = BufferOpaqueCaptureAddressCreateInfo;
+  struct MemoryOpaqueCaptureAddressAllocateInfo;
+  using MemoryOpaqueCaptureAddressAllocateInfoKHR = MemoryOpaqueCaptureAddressAllocateInfo;
+  struct DeviceMemoryOpaqueCaptureAddressInfo;
+  using DeviceMemoryOpaqueCaptureAddressInfoKHR = DeviceMemoryOpaqueCaptureAddressInfo;
+
+  //=== VK_KHR_surface ===
+  struct SurfaceCapabilitiesKHR;
+  struct SurfaceFormatKHR;
+
+  //=== VK_KHR_swapchain ===
+  struct SwapchainCreateInfoKHR;
+  struct PresentInfoKHR;
+  struct ImageSwapchainCreateInfoKHR;
+  struct BindImageMemorySwapchainInfoKHR;
+  struct AcquireNextImageInfoKHR;
+  struct DeviceGroupPresentCapabilitiesKHR;
+  struct DeviceGroupPresentInfoKHR;
+  struct DeviceGroupSwapchainCreateInfoKHR;
+
+  //=== VK_KHR_display ===
+  struct DisplayModeCreateInfoKHR;
+  struct DisplayModeParametersKHR;
+  struct DisplayModePropertiesKHR;
+  struct DisplayPlaneCapabilitiesKHR;
+  struct DisplayPlanePropertiesKHR;
+  struct DisplayPropertiesKHR;
+  struct DisplaySurfaceCreateInfoKHR;
+
+  //=== VK_KHR_display_swapchain ===
+  struct DisplayPresentInfoKHR;
+
+#if defined( VK_USE_PLATFORM_XLIB_KHR )
+  //=== VK_KHR_xlib_surface ===
+  struct XlibSurfaceCreateInfoKHR;
+#endif /*VK_USE_PLATFORM_XLIB_KHR*/
+
+#if defined( VK_USE_PLATFORM_XCB_KHR )
+  //=== VK_KHR_xcb_surface ===
+  struct XcbSurfaceCreateInfoKHR;
+#endif /*VK_USE_PLATFORM_XCB_KHR*/
+
+#if defined( VK_USE_PLATFORM_WAYLAND_KHR )
+  //=== VK_KHR_wayland_surface ===
+  struct WaylandSurfaceCreateInfoKHR;
+#endif /*VK_USE_PLATFORM_WAYLAND_KHR*/
+
+#if defined( VK_USE_PLATFORM_ANDROID_KHR )
+  //=== VK_KHR_android_surface ===
+  struct AndroidSurfaceCreateInfoKHR;
+#endif /*VK_USE_PLATFORM_ANDROID_KHR*/
+
 #if defined( VK_USE_PLATFORM_WIN32_KHR )
-  struct D3D12FenceSubmitInfoKHR;
+  //=== VK_KHR_win32_surface ===
+  struct Win32SurfaceCreateInfoKHR;
 #endif /*VK_USE_PLATFORM_WIN32_KHR*/
-  struct DebugMarkerMarkerInfoEXT;
+
+  //=== VK_EXT_debug_report ===
+  struct DebugReportCallbackCreateInfoEXT;
+
+  //=== VK_AMD_rasterization_order ===
+  struct PipelineRasterizationStateRasterizationOrderAMD;
+
+  //=== VK_EXT_debug_marker ===
   struct DebugMarkerObjectNameInfoEXT;
   struct DebugMarkerObjectTagInfoEXT;
-  struct DebugReportCallbackCreateInfoEXT;
+  struct DebugMarkerMarkerInfoEXT;
+
+#if defined( VK_ENABLE_BETA_EXTENSIONS )
+  //=== VK_KHR_video_queue ===
+  struct VideoQueueFamilyProperties2KHR;
+  struct VideoProfileKHR;
+  struct VideoProfilesKHR;
+  struct VideoCapabilitiesKHR;
+  struct PhysicalDeviceVideoFormatInfoKHR;
+  struct VideoFormatPropertiesKHR;
+  struct VideoPictureResourceKHR;
+  struct VideoReferenceSlotKHR;
+  struct VideoGetMemoryPropertiesKHR;
+  struct VideoBindMemoryKHR;
+  struct VideoSessionCreateInfoKHR;
+  struct VideoSessionParametersCreateInfoKHR;
+  struct VideoSessionParametersUpdateInfoKHR;
+  struct VideoBeginCodingInfoKHR;
+  struct VideoEndCodingInfoKHR;
+  struct VideoCodingControlInfoKHR;
+#endif /*VK_ENABLE_BETA_EXTENSIONS*/
+
+#if defined( VK_ENABLE_BETA_EXTENSIONS )
+  //=== VK_KHR_video_decode_queue ===
+  struct VideoDecodeInfoKHR;
+#endif /*VK_ENABLE_BETA_EXTENSIONS*/
+
+  //=== VK_NV_dedicated_allocation ===
+  struct DedicatedAllocationImageCreateInfoNV;
+  struct DedicatedAllocationBufferCreateInfoNV;
+  struct DedicatedAllocationMemoryAllocateInfoNV;
+
+  //=== VK_EXT_transform_feedback ===
+  struct PhysicalDeviceTransformFeedbackFeaturesEXT;
+  struct PhysicalDeviceTransformFeedbackPropertiesEXT;
+  struct PipelineRasterizationStateStreamCreateInfoEXT;
+
+  //=== VK_NVX_binary_import ===
+  struct CuModuleCreateInfoNVX;
+  struct CuFunctionCreateInfoNVX;
+  struct CuLaunchInfoNVX;
+
+  //=== VK_NVX_image_view_handle ===
+  struct ImageViewHandleInfoNVX;
+  struct ImageViewAddressPropertiesNVX;
+
+#if defined( VK_ENABLE_BETA_EXTENSIONS )
+  //=== VK_EXT_video_encode_h264 ===
+  struct VideoEncodeH264CapabilitiesEXT;
+  struct VideoEncodeH264SessionCreateInfoEXT;
+  struct VideoEncodeH264SessionParametersCreateInfoEXT;
+  struct VideoEncodeH264SessionParametersAddInfoEXT;
+  struct VideoEncodeH264VclFrameInfoEXT;
+  struct VideoEncodeH264EmitPictureParametersEXT;
+  struct VideoEncodeH264DpbSlotInfoEXT;
+  struct VideoEncodeH264NaluSliceEXT;
+  struct VideoEncodeH264ProfileEXT;
+#endif /*VK_ENABLE_BETA_EXTENSIONS*/
+
+#if defined( VK_ENABLE_BETA_EXTENSIONS )
+  //=== VK_EXT_video_decode_h264 ===
+  struct VideoDecodeH264ProfileEXT;
+  struct VideoDecodeH264CapabilitiesEXT;
+  struct VideoDecodeH264SessionCreateInfoEXT;
+  struct VideoDecodeH264SessionParametersCreateInfoEXT;
+  struct VideoDecodeH264SessionParametersAddInfoEXT;
+  struct VideoDecodeH264PictureInfoEXT;
+  struct VideoDecodeH264MvcEXT;
+  struct VideoDecodeH264DpbSlotInfoEXT;
+#endif /*VK_ENABLE_BETA_EXTENSIONS*/
+
+  //=== VK_AMD_texture_gather_bias_lod ===
+  struct TextureLODGatherFormatPropertiesAMD;
+
+  //=== VK_AMD_shader_info ===
+  struct ShaderResourceUsageAMD;
+  struct ShaderStatisticsInfoAMD;
+
+#if defined( VK_USE_PLATFORM_GGP )
+  //=== VK_GGP_stream_descriptor_surface ===
+  struct StreamDescriptorSurfaceCreateInfoGGP;
+#endif /*VK_USE_PLATFORM_GGP*/
+
+  //=== VK_NV_corner_sampled_image ===
+  struct PhysicalDeviceCornerSampledImageFeaturesNV;
+
+  //=== VK_NV_external_memory_capabilities ===
+  struct ExternalImageFormatPropertiesNV;
+
+  //=== VK_NV_external_memory ===
+  struct ExternalMemoryImageCreateInfoNV;
+  struct ExportMemoryAllocateInfoNV;
+
+#if defined( VK_USE_PLATFORM_WIN32_KHR )
+  //=== VK_NV_external_memory_win32 ===
+  struct ImportMemoryWin32HandleInfoNV;
+  struct ExportMemoryWin32HandleInfoNV;
+#endif /*VK_USE_PLATFORM_WIN32_KHR*/
+
+#if defined( VK_USE_PLATFORM_WIN32_KHR )
+  //=== VK_NV_win32_keyed_mutex ===
+  struct Win32KeyedMutexAcquireReleaseInfoNV;
+#endif /*VK_USE_PLATFORM_WIN32_KHR*/
+
+  //=== VK_EXT_validation_flags ===
+  struct ValidationFlagsEXT;
+
+#if defined( VK_USE_PLATFORM_VI_NN )
+  //=== VK_NN_vi_surface ===
+  struct ViSurfaceCreateInfoNN;
+#endif /*VK_USE_PLATFORM_VI_NN*/
+
+  //=== VK_EXT_texture_compression_astc_hdr ===
+  struct PhysicalDeviceTextureCompressionASTCHDRFeaturesEXT;
+
+  //=== VK_EXT_astc_decode_mode ===
+  struct ImageViewASTCDecodeModeEXT;
+  struct PhysicalDeviceASTCDecodeFeaturesEXT;
+
+#if defined( VK_USE_PLATFORM_WIN32_KHR )
+  //=== VK_KHR_external_memory_win32 ===
+  struct ImportMemoryWin32HandleInfoKHR;
+  struct ExportMemoryWin32HandleInfoKHR;
+  struct MemoryWin32HandlePropertiesKHR;
+  struct MemoryGetWin32HandleInfoKHR;
+#endif /*VK_USE_PLATFORM_WIN32_KHR*/
+
+  //=== VK_KHR_external_memory_fd ===
+  struct ImportMemoryFdInfoKHR;
+  struct MemoryFdPropertiesKHR;
+  struct MemoryGetFdInfoKHR;
+
+#if defined( VK_USE_PLATFORM_WIN32_KHR )
+  //=== VK_KHR_win32_keyed_mutex ===
+  struct Win32KeyedMutexAcquireReleaseInfoKHR;
+#endif /*VK_USE_PLATFORM_WIN32_KHR*/
+
+#if defined( VK_USE_PLATFORM_WIN32_KHR )
+  //=== VK_KHR_external_semaphore_win32 ===
+  struct ImportSemaphoreWin32HandleInfoKHR;
+  struct ExportSemaphoreWin32HandleInfoKHR;
+  struct D3D12FenceSubmitInfoKHR;
+  struct SemaphoreGetWin32HandleInfoKHR;
+#endif /*VK_USE_PLATFORM_WIN32_KHR*/
+
+  //=== VK_KHR_external_semaphore_fd ===
+  struct ImportSemaphoreFdInfoKHR;
+  struct SemaphoreGetFdInfoKHR;
+
+  //=== VK_KHR_push_descriptor ===
+  struct PhysicalDevicePushDescriptorPropertiesKHR;
+
+  //=== VK_EXT_conditional_rendering ===
+  struct ConditionalRenderingBeginInfoEXT;
+  struct PhysicalDeviceConditionalRenderingFeaturesEXT;
+  struct CommandBufferInheritanceConditionalRenderingInfoEXT;
+
+  //=== VK_KHR_incremental_present ===
+  struct PresentRegionsKHR;
+  struct PresentRegionKHR;
+  struct RectLayerKHR;
+
+  //=== VK_NV_clip_space_w_scaling ===
+  struct ViewportWScalingNV;
+  struct PipelineViewportWScalingStateCreateInfoNV;
+
+  //=== VK_EXT_display_surface_counter ===
+  struct SurfaceCapabilities2EXT;
+
+  //=== VK_EXT_display_control ===
+  struct DisplayPowerInfoEXT;
+  struct DeviceEventInfoEXT;
+  struct DisplayEventInfoEXT;
+  struct SwapchainCounterCreateInfoEXT;
+
+  //=== VK_GOOGLE_display_timing ===
+  struct RefreshCycleDurationGOOGLE;
+  struct PastPresentationTimingGOOGLE;
+  struct PresentTimesInfoGOOGLE;
+  struct PresentTimeGOOGLE;
+
+  //=== VK_NVX_multiview_per_view_attributes ===
+  struct PhysicalDeviceMultiviewPerViewAttributesPropertiesNVX;
+
+  //=== VK_NV_viewport_swizzle ===
+  struct ViewportSwizzleNV;
+  struct PipelineViewportSwizzleStateCreateInfoNV;
+
+  //=== VK_EXT_discard_rectangles ===
+  struct PhysicalDeviceDiscardRectanglePropertiesEXT;
+  struct PipelineDiscardRectangleStateCreateInfoEXT;
+
+  //=== VK_EXT_conservative_rasterization ===
+  struct PhysicalDeviceConservativeRasterizationPropertiesEXT;
+  struct PipelineRasterizationConservativeStateCreateInfoEXT;
+
+  //=== VK_EXT_depth_clip_enable ===
+  struct PhysicalDeviceDepthClipEnableFeaturesEXT;
+  struct PipelineRasterizationDepthClipStateCreateInfoEXT;
+
+  //=== VK_EXT_hdr_metadata ===
+  struct HdrMetadataEXT;
+  struct XYColorEXT;
+
+  //=== VK_KHR_shared_presentable_image ===
+  struct SharedPresentSurfaceCapabilitiesKHR;
+
+#if defined( VK_USE_PLATFORM_WIN32_KHR )
+  //=== VK_KHR_external_fence_win32 ===
+  struct ImportFenceWin32HandleInfoKHR;
+  struct ExportFenceWin32HandleInfoKHR;
+  struct FenceGetWin32HandleInfoKHR;
+#endif /*VK_USE_PLATFORM_WIN32_KHR*/
+
+  //=== VK_KHR_external_fence_fd ===
+  struct ImportFenceFdInfoKHR;
+  struct FenceGetFdInfoKHR;
+
+  //=== VK_KHR_performance_query ===
+  struct PhysicalDevicePerformanceQueryFeaturesKHR;
+  struct PhysicalDevicePerformanceQueryPropertiesKHR;
+  struct PerformanceCounterKHR;
+  struct PerformanceCounterDescriptionKHR;
+  struct QueryPoolPerformanceCreateInfoKHR;
+  union PerformanceCounterResultKHR;
+  struct AcquireProfilingLockInfoKHR;
+  struct PerformanceQuerySubmitInfoKHR;
+
+  //=== VK_KHR_get_surface_capabilities2 ===
+  struct PhysicalDeviceSurfaceInfo2KHR;
+  struct SurfaceCapabilities2KHR;
+  struct SurfaceFormat2KHR;
+
+  //=== VK_KHR_get_display_properties2 ===
+  struct DisplayProperties2KHR;
+  struct DisplayPlaneProperties2KHR;
+  struct DisplayModeProperties2KHR;
+  struct DisplayPlaneInfo2KHR;
+  struct DisplayPlaneCapabilities2KHR;
+
+#if defined( VK_USE_PLATFORM_IOS_MVK )
+  //=== VK_MVK_ios_surface ===
+  struct IOSSurfaceCreateInfoMVK;
+#endif /*VK_USE_PLATFORM_IOS_MVK*/
+
+#if defined( VK_USE_PLATFORM_MACOS_MVK )
+  //=== VK_MVK_macos_surface ===
+  struct MacOSSurfaceCreateInfoMVK;
+#endif /*VK_USE_PLATFORM_MACOS_MVK*/
+
+  //=== VK_EXT_debug_utils ===
   struct DebugUtilsLabelEXT;
   struct DebugUtilsMessengerCallbackDataEXT;
   struct DebugUtilsMessengerCreateInfoEXT;
   struct DebugUtilsObjectNameInfoEXT;
   struct DebugUtilsObjectTagInfoEXT;
-  struct DedicatedAllocationBufferCreateInfoNV;
-  struct DedicatedAllocationImageCreateInfoNV;
-  struct DedicatedAllocationMemoryAllocateInfoNV;
-  struct DependencyInfoKHR;
-  struct DescriptorBufferInfo;
-  struct DescriptorImageInfo;
-  struct DescriptorPoolCreateInfo;
-  struct DescriptorPoolInlineUniformBlockCreateInfoEXT;
-  struct DescriptorPoolSize;
-  struct DescriptorSetAllocateInfo;
-  struct DescriptorSetLayoutBinding;
-  struct DescriptorSetLayoutBindingFlagsCreateInfo;
-  using DescriptorSetLayoutBindingFlagsCreateInfoEXT = DescriptorSetLayoutBindingFlagsCreateInfo;
-  struct DescriptorSetLayoutCreateInfo;
-  struct DescriptorSetLayoutSupport;
-  using DescriptorSetLayoutSupportKHR = DescriptorSetLayoutSupport;
-  struct DescriptorSetVariableDescriptorCountAllocateInfo;
-  using DescriptorSetVariableDescriptorCountAllocateInfoEXT = DescriptorSetVariableDescriptorCountAllocateInfo;
-  struct DescriptorSetVariableDescriptorCountLayoutSupport;
-  using DescriptorSetVariableDescriptorCountLayoutSupportEXT = DescriptorSetVariableDescriptorCountLayoutSupport;
-  struct DescriptorUpdateTemplateCreateInfo;
-  using DescriptorUpdateTemplateCreateInfoKHR = DescriptorUpdateTemplateCreateInfo;
-  struct DescriptorUpdateTemplateEntry;
-  using DescriptorUpdateTemplateEntryKHR = DescriptorUpdateTemplateEntry;
-  struct DeviceCreateInfo;
-  struct DeviceDeviceMemoryReportCreateInfoEXT;
-  struct DeviceDiagnosticsConfigCreateInfoNV;
-  struct DeviceEventInfoEXT;
-  struct DeviceGroupBindSparseInfo;
-  using DeviceGroupBindSparseInfoKHR = DeviceGroupBindSparseInfo;
-  struct DeviceGroupCommandBufferBeginInfo;
-  using DeviceGroupCommandBufferBeginInfoKHR = DeviceGroupCommandBufferBeginInfo;
-  struct DeviceGroupDeviceCreateInfo;
-  using DeviceGroupDeviceCreateInfoKHR = DeviceGroupDeviceCreateInfo;
-  struct DeviceGroupPresentCapabilitiesKHR;
-  struct DeviceGroupPresentInfoKHR;
-  struct DeviceGroupRenderPassBeginInfo;
-  using DeviceGroupRenderPassBeginInfoKHR = DeviceGroupRenderPassBeginInfo;
-  struct DeviceGroupSubmitInfo;
-  using DeviceGroupSubmitInfoKHR = DeviceGroupSubmitInfo;
-  struct DeviceGroupSwapchainCreateInfoKHR;
-  struct DeviceMemoryOpaqueCaptureAddressInfo;
-  using DeviceMemoryOpaqueCaptureAddressInfoKHR = DeviceMemoryOpaqueCaptureAddressInfo;
-  struct DeviceMemoryOverallocationCreateInfoAMD;
-  struct DeviceMemoryReportCallbackDataEXT;
-  union DeviceOrHostAddressConstKHR;
-  union DeviceOrHostAddressKHR;
-  struct DevicePrivateDataCreateInfoEXT;
-  struct DeviceQueueCreateInfo;
-  struct DeviceQueueGlobalPriorityCreateInfoEXT;
-  struct DeviceQueueInfo2;
-#if defined( VK_USE_PLATFORM_DIRECTFB_EXT )
-  struct DirectFBSurfaceCreateInfoEXT;
-#endif /*VK_USE_PLATFORM_DIRECTFB_EXT*/
-  struct DispatchIndirectCommand;
-  struct DisplayEventInfoEXT;
-  struct DisplayModeCreateInfoKHR;
-  struct DisplayModeParametersKHR;
-  struct DisplayModeProperties2KHR;
-  struct DisplayModePropertiesKHR;
-  struct DisplayNativeHdrSurfaceCapabilitiesAMD;
-  struct DisplayPlaneCapabilities2KHR;
-  struct DisplayPlaneCapabilitiesKHR;
-  struct DisplayPlaneInfo2KHR;
-  struct DisplayPlaneProperties2KHR;
-  struct DisplayPlanePropertiesKHR;
-  struct DisplayPowerInfoEXT;
-  struct DisplayPresentInfoKHR;
-  struct DisplayProperties2KHR;
-  struct DisplayPropertiesKHR;
-  struct DisplaySurfaceCreateInfoKHR;
-  struct DrawIndexedIndirectCommand;
-  struct DrawIndirectCommand;
-  struct DrawMeshTasksIndirectCommandNV;
-  struct DrmFormatModifierPropertiesEXT;
-  struct DrmFormatModifierPropertiesListEXT;
-  struct EventCreateInfo;
-  struct ExportFenceCreateInfo;
-  using ExportFenceCreateInfoKHR = ExportFenceCreateInfo;
-#if defined( VK_USE_PLATFORM_WIN32_KHR )
-  struct ExportFenceWin32HandleInfoKHR;
-#endif /*VK_USE_PLATFORM_WIN32_KHR*/
-  struct ExportMemoryAllocateInfo;
-  using ExportMemoryAllocateInfoKHR = ExportMemoryAllocateInfo;
-  struct ExportMemoryAllocateInfoNV;
-#if defined( VK_USE_PLATFORM_WIN32_KHR )
-  struct ExportMemoryWin32HandleInfoKHR;
-#endif /*VK_USE_PLATFORM_WIN32_KHR*/
-#if defined( VK_USE_PLATFORM_WIN32_KHR )
-  struct ExportMemoryWin32HandleInfoNV;
-#endif /*VK_USE_PLATFORM_WIN32_KHR*/
-  struct ExportSemaphoreCreateInfo;
-  using ExportSemaphoreCreateInfoKHR = ExportSemaphoreCreateInfo;
-#if defined( VK_USE_PLATFORM_WIN32_KHR )
-  struct ExportSemaphoreWin32HandleInfoKHR;
-#endif /*VK_USE_PLATFORM_WIN32_KHR*/
-  struct ExtensionProperties;
-  struct Extent2D;
-  struct Extent3D;
-  struct ExternalBufferProperties;
-  using ExternalBufferPropertiesKHR = ExternalBufferProperties;
-  struct ExternalFenceProperties;
-  using ExternalFencePropertiesKHR = ExternalFenceProperties;
+
 #if defined( VK_USE_PLATFORM_ANDROID_KHR )
+  //=== VK_ANDROID_external_memory_android_hardware_buffer ===
+  struct AndroidHardwareBufferUsageANDROID;
+  struct AndroidHardwareBufferPropertiesANDROID;
+  struct AndroidHardwareBufferFormatPropertiesANDROID;
+  struct ImportAndroidHardwareBufferInfoANDROID;
+  struct MemoryGetAndroidHardwareBufferInfoANDROID;
   struct ExternalFormatANDROID;
 #endif /*VK_USE_PLATFORM_ANDROID_KHR*/
-  struct ExternalImageFormatProperties;
-  using ExternalImageFormatPropertiesKHR = ExternalImageFormatProperties;
-  struct ExternalImageFormatPropertiesNV;
-  struct ExternalMemoryBufferCreateInfo;
-  using ExternalMemoryBufferCreateInfoKHR = ExternalMemoryBufferCreateInfo;
-  struct ExternalMemoryImageCreateInfo;
-  using ExternalMemoryImageCreateInfoKHR = ExternalMemoryImageCreateInfo;
-  struct ExternalMemoryImageCreateInfoNV;
-  struct ExternalMemoryProperties;
-  using ExternalMemoryPropertiesKHR = ExternalMemoryProperties;
-  struct ExternalSemaphoreProperties;
-  using ExternalSemaphorePropertiesKHR = ExternalSemaphoreProperties;
-  struct FenceCreateInfo;
-  struct FenceGetFdInfoKHR;
-#if defined( VK_USE_PLATFORM_WIN32_KHR )
-  struct FenceGetWin32HandleInfoKHR;
-#endif /*VK_USE_PLATFORM_WIN32_KHR*/
-  struct FilterCubicImageViewImageFormatPropertiesEXT;
-  struct FormatProperties;
-  struct FormatProperties2;
-  using FormatProperties2KHR = FormatProperties2;
-  struct FragmentShadingRateAttachmentInfoKHR;
-  struct FramebufferAttachmentImageInfo;
-  using FramebufferAttachmentImageInfoKHR = FramebufferAttachmentImageInfo;
-  struct FramebufferAttachmentsCreateInfo;
-  using FramebufferAttachmentsCreateInfoKHR = FramebufferAttachmentsCreateInfo;
-  struct FramebufferCreateInfo;
-  struct FramebufferMixedSamplesCombinationNV;
-  struct GeneratedCommandsInfoNV;
-  struct GeneratedCommandsMemoryRequirementsInfoNV;
+
+  //=== VK_EXT_inline_uniform_block ===
+  struct PhysicalDeviceInlineUniformBlockFeaturesEXT;
+  struct PhysicalDeviceInlineUniformBlockPropertiesEXT;
+  struct WriteDescriptorSetInlineUniformBlockEXT;
+  struct DescriptorPoolInlineUniformBlockCreateInfoEXT;
+
+  //=== VK_EXT_sample_locations ===
+  struct SampleLocationEXT;
+  struct SampleLocationsInfoEXT;
+  struct AttachmentSampleLocationsEXT;
+  struct SubpassSampleLocationsEXT;
+  struct RenderPassSampleLocationsBeginInfoEXT;
+  struct PipelineSampleLocationsStateCreateInfoEXT;
+  struct PhysicalDeviceSampleLocationsPropertiesEXT;
+  struct MultisamplePropertiesEXT;
+
+  //=== VK_EXT_blend_operation_advanced ===
+  struct PhysicalDeviceBlendOperationAdvancedFeaturesEXT;
+  struct PhysicalDeviceBlendOperationAdvancedPropertiesEXT;
+  struct PipelineColorBlendAdvancedStateCreateInfoEXT;
+
+  //=== VK_NV_fragment_coverage_to_color ===
+  struct PipelineCoverageToColorStateCreateInfoNV;
+
+  //=== VK_KHR_acceleration_structure ===
+  union DeviceOrHostAddressKHR;
+  union DeviceOrHostAddressConstKHR;
+  struct AccelerationStructureBuildRangeInfoKHR;
+  struct AabbPositionsKHR;
+  using AabbPositionsNV = AabbPositionsKHR;
+  struct AccelerationStructureGeometryTrianglesDataKHR;
+  struct TransformMatrixKHR;
+  using TransformMatrixNV = TransformMatrixKHR;
+  struct AccelerationStructureBuildGeometryInfoKHR;
+  struct AccelerationStructureGeometryAabbsDataKHR;
+  struct AccelerationStructureInstanceKHR;
+  using AccelerationStructureInstanceNV = AccelerationStructureInstanceKHR;
+  struct AccelerationStructureGeometryInstancesDataKHR;
+  union AccelerationStructureGeometryDataKHR;
+  struct AccelerationStructureGeometryKHR;
+  struct AccelerationStructureCreateInfoKHR;
+  struct WriteDescriptorSetAccelerationStructureKHR;
+  struct PhysicalDeviceAccelerationStructureFeaturesKHR;
+  struct PhysicalDeviceAccelerationStructurePropertiesKHR;
+  struct AccelerationStructureDeviceAddressInfoKHR;
+  struct AccelerationStructureVersionInfoKHR;
+  struct CopyAccelerationStructureToMemoryInfoKHR;
+  struct CopyMemoryToAccelerationStructureInfoKHR;
+  struct CopyAccelerationStructureInfoKHR;
+  struct AccelerationStructureBuildSizesInfoKHR;
+
+  //=== VK_NV_framebuffer_mixed_samples ===
+  struct PipelineCoverageModulationStateCreateInfoNV;
+
+  //=== VK_NV_shader_sm_builtins ===
+  struct PhysicalDeviceShaderSMBuiltinsPropertiesNV;
+  struct PhysicalDeviceShaderSMBuiltinsFeaturesNV;
+
+  //=== VK_EXT_image_drm_format_modifier ===
+  struct DrmFormatModifierPropertiesListEXT;
+  struct DrmFormatModifierPropertiesEXT;
+  struct PhysicalDeviceImageDrmFormatModifierInfoEXT;
+  struct ImageDrmFormatModifierListCreateInfoEXT;
+  struct ImageDrmFormatModifierExplicitCreateInfoEXT;
+  struct ImageDrmFormatModifierPropertiesEXT;
+
+  //=== VK_EXT_validation_cache ===
+  struct ValidationCacheCreateInfoEXT;
+  struct ShaderModuleValidationCacheCreateInfoEXT;
+
+#if defined( VK_ENABLE_BETA_EXTENSIONS )
+  //=== VK_KHR_portability_subset ===
+  struct PhysicalDevicePortabilitySubsetFeaturesKHR;
+  struct PhysicalDevicePortabilitySubsetPropertiesKHR;
+#endif /*VK_ENABLE_BETA_EXTENSIONS*/
+
+  //=== VK_NV_shading_rate_image ===
+  struct ShadingRatePaletteNV;
+  struct PipelineViewportShadingRateImageStateCreateInfoNV;
+  struct PhysicalDeviceShadingRateImageFeaturesNV;
+  struct PhysicalDeviceShadingRateImagePropertiesNV;
+  struct CoarseSampleLocationNV;
+  struct CoarseSampleOrderCustomNV;
+  struct PipelineViewportCoarseSampleOrderStateCreateInfoNV;
+
+  //=== VK_NV_ray_tracing ===
+  struct RayTracingShaderGroupCreateInfoNV;
+  struct RayTracingPipelineCreateInfoNV;
+  struct GeometryTrianglesNV;
   struct GeometryAABBNV;
   struct GeometryDataNV;
   struct GeometryNV;
-  struct GeometryTrianglesNV;
-  struct GraphicsPipelineCreateInfo;
-  struct GraphicsPipelineShaderGroupsCreateInfoNV;
-  struct GraphicsShaderGroupCreateInfoNV;
-  struct HdrMetadataEXT;
-  struct HeadlessSurfaceCreateInfoEXT;
-#if defined( VK_USE_PLATFORM_IOS_MVK )
-  struct IOSSurfaceCreateInfoMVK;
-#endif /*VK_USE_PLATFORM_IOS_MVK*/
-  struct ImageBlit;
-  struct ImageBlit2KHR;
-  struct ImageCopy;
-  struct ImageCopy2KHR;
-  struct ImageCreateInfo;
-  struct ImageDrmFormatModifierExplicitCreateInfoEXT;
-  struct ImageDrmFormatModifierListCreateInfoEXT;
-  struct ImageDrmFormatModifierPropertiesEXT;
-  struct ImageFormatListCreateInfo;
-  using ImageFormatListCreateInfoKHR = ImageFormatListCreateInfo;
-  struct ImageFormatProperties;
-  struct ImageFormatProperties2;
-  using ImageFormatProperties2KHR = ImageFormatProperties2;
-  struct ImageMemoryBarrier;
-  struct ImageMemoryBarrier2KHR;
-  struct ImageMemoryRequirementsInfo2;
-  using ImageMemoryRequirementsInfo2KHR = ImageMemoryRequirementsInfo2;
-#if defined( VK_USE_PLATFORM_FUCHSIA )
-  struct ImagePipeSurfaceCreateInfoFUCHSIA;
-#endif /*VK_USE_PLATFORM_FUCHSIA*/
-  struct ImagePlaneMemoryRequirementsInfo;
-  using ImagePlaneMemoryRequirementsInfoKHR = ImagePlaneMemoryRequirementsInfo;
-  struct ImageResolve;
-  struct ImageResolve2KHR;
-  struct ImageSparseMemoryRequirementsInfo2;
-  using ImageSparseMemoryRequirementsInfo2KHR = ImageSparseMemoryRequirementsInfo2;
-  struct ImageStencilUsageCreateInfo;
-  using ImageStencilUsageCreateInfoEXT = ImageStencilUsageCreateInfo;
-  struct ImageSubresource;
-  struct ImageSubresourceLayers;
-  struct ImageSubresourceRange;
-  struct ImageSwapchainCreateInfoKHR;
-  struct ImageViewASTCDecodeModeEXT;
-  struct ImageViewAddressPropertiesNVX;
-  struct ImageViewCreateInfo;
-  struct ImageViewHandleInfoNVX;
-  struct ImageViewUsageCreateInfo;
-  using ImageViewUsageCreateInfoKHR = ImageViewUsageCreateInfo;
-#if defined( VK_USE_PLATFORM_ANDROID_KHR )
-  struct ImportAndroidHardwareBufferInfoANDROID;
-#endif /*VK_USE_PLATFORM_ANDROID_KHR*/
-  struct ImportFenceFdInfoKHR;
-#if defined( VK_USE_PLATFORM_WIN32_KHR )
-  struct ImportFenceWin32HandleInfoKHR;
-#endif /*VK_USE_PLATFORM_WIN32_KHR*/
-  struct ImportMemoryFdInfoKHR;
-  struct ImportMemoryHostPointerInfoEXT;
-#if defined( VK_USE_PLATFORM_WIN32_KHR )
-  struct ImportMemoryWin32HandleInfoKHR;
-#endif /*VK_USE_PLATFORM_WIN32_KHR*/
-#if defined( VK_USE_PLATFORM_WIN32_KHR )
-  struct ImportMemoryWin32HandleInfoNV;
-#endif /*VK_USE_PLATFORM_WIN32_KHR*/
-#if defined( VK_USE_PLATFORM_FUCHSIA )
-  struct ImportMemoryZirconHandleInfoFUCHSIA;
-#endif /*VK_USE_PLATFORM_FUCHSIA*/
-  struct ImportSemaphoreFdInfoKHR;
-#if defined( VK_USE_PLATFORM_WIN32_KHR )
-  struct ImportSemaphoreWin32HandleInfoKHR;
-#endif /*VK_USE_PLATFORM_WIN32_KHR*/
-#if defined( VK_USE_PLATFORM_FUCHSIA )
-  struct ImportSemaphoreZirconHandleInfoFUCHSIA;
-#endif /*VK_USE_PLATFORM_FUCHSIA*/
-  struct IndirectCommandsLayoutCreateInfoNV;
-  struct IndirectCommandsLayoutTokenNV;
-  struct IndirectCommandsStreamNV;
-  struct InitializePerformanceApiInfoINTEL;
-  struct InputAttachmentAspectReference;
-  using InputAttachmentAspectReferenceKHR = InputAttachmentAspectReference;
-  struct InstanceCreateInfo;
-  struct LayerProperties;
-#if defined( VK_USE_PLATFORM_MACOS_MVK )
-  struct MacOSSurfaceCreateInfoMVK;
-#endif /*VK_USE_PLATFORM_MACOS_MVK*/
-  struct MappedMemoryRange;
-  struct MemoryAllocateFlagsInfo;
-  using MemoryAllocateFlagsInfoKHR = MemoryAllocateFlagsInfo;
-  struct MemoryAllocateInfo;
-  struct MemoryBarrier;
-  struct MemoryBarrier2KHR;
-  struct MemoryDedicatedAllocateInfo;
-  using MemoryDedicatedAllocateInfoKHR = MemoryDedicatedAllocateInfo;
-  struct MemoryDedicatedRequirements;
-  using MemoryDedicatedRequirementsKHR = MemoryDedicatedRequirements;
-  struct MemoryFdPropertiesKHR;
-#if defined( VK_USE_PLATFORM_ANDROID_KHR )
-  struct MemoryGetAndroidHardwareBufferInfoANDROID;
-#endif /*VK_USE_PLATFORM_ANDROID_KHR*/
-  struct MemoryGetFdInfoKHR;
-  struct MemoryGetRemoteAddressInfoNV;
-#if defined( VK_USE_PLATFORM_WIN32_KHR )
-  struct MemoryGetWin32HandleInfoKHR;
-#endif /*VK_USE_PLATFORM_WIN32_KHR*/
-#if defined( VK_USE_PLATFORM_FUCHSIA )
-  struct MemoryGetZirconHandleInfoFUCHSIA;
-#endif /*VK_USE_PLATFORM_FUCHSIA*/
-  struct MemoryHeap;
-  struct MemoryHostPointerPropertiesEXT;
-  struct MemoryOpaqueCaptureAddressAllocateInfo;
-  using MemoryOpaqueCaptureAddressAllocateInfoKHR = MemoryOpaqueCaptureAddressAllocateInfo;
-  struct MemoryPriorityAllocateInfoEXT;
-  struct MemoryRequirements;
-  struct MemoryRequirements2;
-  using MemoryRequirements2KHR = MemoryRequirements2;
-  struct MemoryType;
-#if defined( VK_USE_PLATFORM_WIN32_KHR )
-  struct MemoryWin32HandlePropertiesKHR;
-#endif /*VK_USE_PLATFORM_WIN32_KHR*/
-#if defined( VK_USE_PLATFORM_FUCHSIA )
-  struct MemoryZirconHandlePropertiesFUCHSIA;
-#endif /*VK_USE_PLATFORM_FUCHSIA*/
-#if defined( VK_USE_PLATFORM_METAL_EXT )
-  struct MetalSurfaceCreateInfoEXT;
-#endif /*VK_USE_PLATFORM_METAL_EXT*/
-  struct MultiDrawIndexedInfoEXT;
-  struct MultiDrawInfoEXT;
-  struct MultisamplePropertiesEXT;
-  struct MutableDescriptorTypeCreateInfoVALVE;
-  struct MutableDescriptorTypeListVALVE;
-  struct Offset2D;
-  struct Offset3D;
-  struct PastPresentationTimingGOOGLE;
-  struct PerformanceConfigurationAcquireInfoINTEL;
-  struct PerformanceCounterDescriptionKHR;
-  struct PerformanceCounterKHR;
-  union PerformanceCounterResultKHR;
-  struct PerformanceMarkerInfoINTEL;
-  struct PerformanceOverrideInfoINTEL;
-  struct PerformanceQuerySubmitInfoKHR;
-  struct PerformanceStreamMarkerInfoINTEL;
-  union PerformanceValueDataINTEL;
-  struct PerformanceValueINTEL;
-  struct PhysicalDevice16BitStorageFeatures;
-  using PhysicalDevice16BitStorageFeaturesKHR = PhysicalDevice16BitStorageFeatures;
-  struct PhysicalDevice4444FormatsFeaturesEXT;
-  struct PhysicalDevice8BitStorageFeatures;
-  using PhysicalDevice8BitStorageFeaturesKHR = PhysicalDevice8BitStorageFeatures;
-  struct PhysicalDeviceASTCDecodeFeaturesEXT;
-  struct PhysicalDeviceAccelerationStructureFeaturesKHR;
-  struct PhysicalDeviceAccelerationStructurePropertiesKHR;
-  struct PhysicalDeviceBlendOperationAdvancedFeaturesEXT;
-  struct PhysicalDeviceBlendOperationAdvancedPropertiesEXT;
-  struct PhysicalDeviceBufferDeviceAddressFeatures;
-  using PhysicalDeviceBufferDeviceAddressFeaturesKHR = PhysicalDeviceBufferDeviceAddressFeatures;
-  struct PhysicalDeviceBufferDeviceAddressFeaturesEXT;
-  using PhysicalDeviceBufferAddressFeaturesEXT = PhysicalDeviceBufferDeviceAddressFeaturesEXT;
-  struct PhysicalDeviceCoherentMemoryFeaturesAMD;
-  struct PhysicalDeviceColorWriteEnableFeaturesEXT;
-  struct PhysicalDeviceComputeShaderDerivativesFeaturesNV;
-  struct PhysicalDeviceConditionalRenderingFeaturesEXT;
-  struct PhysicalDeviceConservativeRasterizationPropertiesEXT;
-  struct PhysicalDeviceCooperativeMatrixFeaturesNV;
-  struct PhysicalDeviceCooperativeMatrixPropertiesNV;
-  struct PhysicalDeviceCornerSampledImageFeaturesNV;
-  struct PhysicalDeviceCoverageReductionModeFeaturesNV;
-  struct PhysicalDeviceCustomBorderColorFeaturesEXT;
-  struct PhysicalDeviceCustomBorderColorPropertiesEXT;
-  struct PhysicalDeviceDedicatedAllocationImageAliasingFeaturesNV;
-  struct PhysicalDeviceDepthClipEnableFeaturesEXT;
-  struct PhysicalDeviceDepthStencilResolveProperties;
-  using PhysicalDeviceDepthStencilResolvePropertiesKHR = PhysicalDeviceDepthStencilResolveProperties;
-  struct PhysicalDeviceDescriptorIndexingFeatures;
-  using PhysicalDeviceDescriptorIndexingFeaturesEXT = PhysicalDeviceDescriptorIndexingFeatures;
-  struct PhysicalDeviceDescriptorIndexingProperties;
-  using PhysicalDeviceDescriptorIndexingPropertiesEXT = PhysicalDeviceDescriptorIndexingProperties;
-  struct PhysicalDeviceDeviceGeneratedCommandsFeaturesNV;
-  struct PhysicalDeviceDeviceGeneratedCommandsPropertiesNV;
-  struct PhysicalDeviceDeviceMemoryReportFeaturesEXT;
-  struct PhysicalDeviceDiagnosticsConfigFeaturesNV;
-  struct PhysicalDeviceDiscardRectanglePropertiesEXT;
-  struct PhysicalDeviceDriverProperties;
-  using PhysicalDeviceDriverPropertiesKHR = PhysicalDeviceDriverProperties;
-  struct PhysicalDeviceDrmPropertiesEXT;
-  struct PhysicalDeviceExclusiveScissorFeaturesNV;
-  struct PhysicalDeviceExtendedDynamicState2FeaturesEXT;
-  struct PhysicalDeviceExtendedDynamicStateFeaturesEXT;
-  struct PhysicalDeviceExternalBufferInfo;
-  using PhysicalDeviceExternalBufferInfoKHR = PhysicalDeviceExternalBufferInfo;
-  struct PhysicalDeviceExternalFenceInfo;
-  using PhysicalDeviceExternalFenceInfoKHR = PhysicalDeviceExternalFenceInfo;
-  struct PhysicalDeviceExternalImageFormatInfo;
-  using PhysicalDeviceExternalImageFormatInfoKHR = PhysicalDeviceExternalImageFormatInfo;
-  struct PhysicalDeviceExternalMemoryHostPropertiesEXT;
-  struct PhysicalDeviceExternalMemoryRDMAFeaturesNV;
-  struct PhysicalDeviceExternalSemaphoreInfo;
-  using PhysicalDeviceExternalSemaphoreInfoKHR = PhysicalDeviceExternalSemaphoreInfo;
-  struct PhysicalDeviceFeatures;
-  struct PhysicalDeviceFeatures2;
-  using PhysicalDeviceFeatures2KHR = PhysicalDeviceFeatures2;
-  struct PhysicalDeviceFloatControlsProperties;
-  using PhysicalDeviceFloatControlsPropertiesKHR = PhysicalDeviceFloatControlsProperties;
-  struct PhysicalDeviceFragmentDensityMap2FeaturesEXT;
-  struct PhysicalDeviceFragmentDensityMap2PropertiesEXT;
-  struct PhysicalDeviceFragmentDensityMapFeaturesEXT;
-  struct PhysicalDeviceFragmentDensityMapPropertiesEXT;
-  struct PhysicalDeviceFragmentShaderBarycentricFeaturesNV;
-  struct PhysicalDeviceFragmentShaderInterlockFeaturesEXT;
-  struct PhysicalDeviceFragmentShadingRateEnumsFeaturesNV;
-  struct PhysicalDeviceFragmentShadingRateEnumsPropertiesNV;
-  struct PhysicalDeviceFragmentShadingRateFeaturesKHR;
-  struct PhysicalDeviceFragmentShadingRateKHR;
-  struct PhysicalDeviceFragmentShadingRatePropertiesKHR;
-  struct PhysicalDeviceGlobalPriorityQueryFeaturesEXT;
-  struct PhysicalDeviceGroupProperties;
-  using PhysicalDeviceGroupPropertiesKHR = PhysicalDeviceGroupProperties;
-  struct PhysicalDeviceHostQueryResetFeatures;
-  using PhysicalDeviceHostQueryResetFeaturesEXT = PhysicalDeviceHostQueryResetFeatures;
-  struct PhysicalDeviceIDProperties;
-  using PhysicalDeviceIDPropertiesKHR = PhysicalDeviceIDProperties;
-  struct PhysicalDeviceImageDrmFormatModifierInfoEXT;
-  struct PhysicalDeviceImageFormatInfo2;
-  using PhysicalDeviceImageFormatInfo2KHR = PhysicalDeviceImageFormatInfo2;
-  struct PhysicalDeviceImageRobustnessFeaturesEXT;
-  struct PhysicalDeviceImageViewImageFormatInfoEXT;
-  struct PhysicalDeviceImagelessFramebufferFeatures;
-  using PhysicalDeviceImagelessFramebufferFeaturesKHR = PhysicalDeviceImagelessFramebufferFeatures;
-  struct PhysicalDeviceIndexTypeUint8FeaturesEXT;
-  struct PhysicalDeviceInheritedViewportScissorFeaturesNV;
-  struct PhysicalDeviceInlineUniformBlockFeaturesEXT;
-  struct PhysicalDeviceInlineUniformBlockPropertiesEXT;
-  struct PhysicalDeviceLimits;
-  struct PhysicalDeviceLineRasterizationFeaturesEXT;
-  struct PhysicalDeviceLineRasterizationPropertiesEXT;
-  struct PhysicalDeviceMaintenance3Properties;
-  using PhysicalDeviceMaintenance3PropertiesKHR = PhysicalDeviceMaintenance3Properties;
-  struct PhysicalDeviceMemoryBudgetPropertiesEXT;
-  struct PhysicalDeviceMemoryPriorityFeaturesEXT;
-  struct PhysicalDeviceMemoryProperties;
-  struct PhysicalDeviceMemoryProperties2;
-  using PhysicalDeviceMemoryProperties2KHR = PhysicalDeviceMemoryProperties2;
-  struct PhysicalDeviceMeshShaderFeaturesNV;
-  struct PhysicalDeviceMeshShaderPropertiesNV;
-  struct PhysicalDeviceMultiDrawFeaturesEXT;
-  struct PhysicalDeviceMultiDrawPropertiesEXT;
-  struct PhysicalDeviceMultiviewFeatures;
-  using PhysicalDeviceMultiviewFeaturesKHR = PhysicalDeviceMultiviewFeatures;
-  struct PhysicalDeviceMultiviewPerViewAttributesPropertiesNVX;
-  struct PhysicalDeviceMultiviewProperties;
-  using PhysicalDeviceMultiviewPropertiesKHR = PhysicalDeviceMultiviewProperties;
-  struct PhysicalDeviceMutableDescriptorTypeFeaturesVALVE;
-  struct PhysicalDevicePCIBusInfoPropertiesEXT;
-  struct PhysicalDevicePerformanceQueryFeaturesKHR;
-  struct PhysicalDevicePerformanceQueryPropertiesKHR;
-  struct PhysicalDevicePipelineCreationCacheControlFeaturesEXT;
-  struct PhysicalDevicePipelineExecutablePropertiesFeaturesKHR;
-  struct PhysicalDevicePointClippingProperties;
-  using PhysicalDevicePointClippingPropertiesKHR = PhysicalDevicePointClippingProperties;
-#if defined( VK_ENABLE_BETA_EXTENSIONS )
-  struct PhysicalDevicePortabilitySubsetFeaturesKHR;
-#endif /*VK_ENABLE_BETA_EXTENSIONS*/
-#if defined( VK_ENABLE_BETA_EXTENSIONS )
-  struct PhysicalDevicePortabilitySubsetPropertiesKHR;
-#endif /*VK_ENABLE_BETA_EXTENSIONS*/
-  struct PhysicalDevicePrivateDataFeaturesEXT;
-  struct PhysicalDeviceProperties;
-  struct PhysicalDeviceProperties2;
-  using PhysicalDeviceProperties2KHR = PhysicalDeviceProperties2;
-  struct PhysicalDeviceProtectedMemoryFeatures;
-  struct PhysicalDeviceProtectedMemoryProperties;
-  struct PhysicalDeviceProvokingVertexFeaturesEXT;
-  struct PhysicalDeviceProvokingVertexPropertiesEXT;
-  struct PhysicalDevicePushDescriptorPropertiesKHR;
-  struct PhysicalDeviceRayQueryFeaturesKHR;
-  struct PhysicalDeviceRayTracingMotionBlurFeaturesNV;
-  struct PhysicalDeviceRayTracingPipelineFeaturesKHR;
-  struct PhysicalDeviceRayTracingPipelinePropertiesKHR;
+  struct AccelerationStructureInfoNV;
+  struct AccelerationStructureCreateInfoNV;
+  struct BindAccelerationStructureMemoryInfoNV;
+  struct WriteDescriptorSetAccelerationStructureNV;
+  struct AccelerationStructureMemoryRequirementsInfoNV;
   struct PhysicalDeviceRayTracingPropertiesNV;
+
+  //=== VK_NV_representative_fragment_test ===
   struct PhysicalDeviceRepresentativeFragmentTestFeaturesNV;
-  struct PhysicalDeviceRobustness2FeaturesEXT;
-  struct PhysicalDeviceRobustness2PropertiesEXT;
-  struct PhysicalDeviceSampleLocationsPropertiesEXT;
-  struct PhysicalDeviceSamplerFilterMinmaxProperties;
-  using PhysicalDeviceSamplerFilterMinmaxPropertiesEXT = PhysicalDeviceSamplerFilterMinmaxProperties;
-  struct PhysicalDeviceSamplerYcbcrConversionFeatures;
-  using PhysicalDeviceSamplerYcbcrConversionFeaturesKHR = PhysicalDeviceSamplerYcbcrConversionFeatures;
-  struct PhysicalDeviceScalarBlockLayoutFeatures;
-  using PhysicalDeviceScalarBlockLayoutFeaturesEXT = PhysicalDeviceScalarBlockLayoutFeatures;
-  struct PhysicalDeviceSeparateDepthStencilLayoutsFeatures;
-  using PhysicalDeviceSeparateDepthStencilLayoutsFeaturesKHR = PhysicalDeviceSeparateDepthStencilLayoutsFeatures;
-  struct PhysicalDeviceShaderAtomicFloatFeaturesEXT;
-  struct PhysicalDeviceShaderAtomicInt64Features;
-  using PhysicalDeviceShaderAtomicInt64FeaturesKHR = PhysicalDeviceShaderAtomicInt64Features;
-  struct PhysicalDeviceShaderClockFeaturesKHR;
-  struct PhysicalDeviceShaderCoreProperties2AMD;
-  struct PhysicalDeviceShaderCorePropertiesAMD;
-  struct PhysicalDeviceShaderDemoteToHelperInvocationFeaturesEXT;
-  struct PhysicalDeviceShaderDrawParametersFeatures;
-  using PhysicalDeviceShaderDrawParameterFeatures = PhysicalDeviceShaderDrawParametersFeatures;
-  struct PhysicalDeviceShaderFloat16Int8Features;
-  using PhysicalDeviceFloat16Int8FeaturesKHR       = PhysicalDeviceShaderFloat16Int8Features;
-  using PhysicalDeviceShaderFloat16Int8FeaturesKHR = PhysicalDeviceShaderFloat16Int8Features;
-  struct PhysicalDeviceShaderImageAtomicInt64FeaturesEXT;
-  struct PhysicalDeviceShaderImageFootprintFeaturesNV;
-  struct PhysicalDeviceShaderIntegerFunctions2FeaturesINTEL;
-  struct PhysicalDeviceShaderSMBuiltinsFeaturesNV;
-  struct PhysicalDeviceShaderSMBuiltinsPropertiesNV;
-  struct PhysicalDeviceShaderSubgroupExtendedTypesFeatures;
-  using PhysicalDeviceShaderSubgroupExtendedTypesFeaturesKHR = PhysicalDeviceShaderSubgroupExtendedTypesFeatures;
-  struct PhysicalDeviceShaderSubgroupUniformControlFlowFeaturesKHR;
-  struct PhysicalDeviceShaderTerminateInvocationFeaturesKHR;
-  struct PhysicalDeviceShadingRateImageFeaturesNV;
-  struct PhysicalDeviceShadingRateImagePropertiesNV;
-  struct PhysicalDeviceSparseImageFormatInfo2;
-  using PhysicalDeviceSparseImageFormatInfo2KHR = PhysicalDeviceSparseImageFormatInfo2;
-  struct PhysicalDeviceSparseProperties;
-  struct PhysicalDeviceSubgroupProperties;
-  struct PhysicalDeviceSubgroupSizeControlFeaturesEXT;
-  struct PhysicalDeviceSubgroupSizeControlPropertiesEXT;
-  struct PhysicalDeviceSubpassShadingFeaturesHUAWEI;
-  struct PhysicalDeviceSubpassShadingPropertiesHUAWEI;
-  struct PhysicalDeviceSurfaceInfo2KHR;
-  struct PhysicalDeviceSynchronization2FeaturesKHR;
-  struct PhysicalDeviceTexelBufferAlignmentFeaturesEXT;
-  struct PhysicalDeviceTexelBufferAlignmentPropertiesEXT;
-  struct PhysicalDeviceTextureCompressionASTCHDRFeaturesEXT;
-  struct PhysicalDeviceTimelineSemaphoreFeatures;
-  using PhysicalDeviceTimelineSemaphoreFeaturesKHR = PhysicalDeviceTimelineSemaphoreFeatures;
-  struct PhysicalDeviceTimelineSemaphoreProperties;
-  using PhysicalDeviceTimelineSemaphorePropertiesKHR = PhysicalDeviceTimelineSemaphoreProperties;
-  struct PhysicalDeviceToolPropertiesEXT;
-  struct PhysicalDeviceTransformFeedbackFeaturesEXT;
-  struct PhysicalDeviceTransformFeedbackPropertiesEXT;
-  struct PhysicalDeviceUniformBufferStandardLayoutFeatures;
-  using PhysicalDeviceUniformBufferStandardLayoutFeaturesKHR = PhysicalDeviceUniformBufferStandardLayoutFeatures;
-  struct PhysicalDeviceVariablePointersFeatures;
-  using PhysicalDeviceVariablePointerFeatures     = PhysicalDeviceVariablePointersFeatures;
-  using PhysicalDeviceVariablePointerFeaturesKHR  = PhysicalDeviceVariablePointersFeatures;
-  using PhysicalDeviceVariablePointersFeaturesKHR = PhysicalDeviceVariablePointersFeatures;
-  struct PhysicalDeviceVertexAttributeDivisorFeaturesEXT;
-  struct PhysicalDeviceVertexAttributeDivisorPropertiesEXT;
-  struct PhysicalDeviceVertexInputDynamicStateFeaturesEXT;
-#if defined( VK_ENABLE_BETA_EXTENSIONS )
-  struct PhysicalDeviceVideoFormatInfoKHR;
-#endif /*VK_ENABLE_BETA_EXTENSIONS*/
-  struct PhysicalDeviceVulkan11Features;
-  struct PhysicalDeviceVulkan11Properties;
-  struct PhysicalDeviceVulkan12Features;
-  struct PhysicalDeviceVulkan12Properties;
-  struct PhysicalDeviceVulkanMemoryModelFeatures;
-  using PhysicalDeviceVulkanMemoryModelFeaturesKHR = PhysicalDeviceVulkanMemoryModelFeatures;
-  struct PhysicalDeviceWorkgroupMemoryExplicitLayoutFeaturesKHR;
-  struct PhysicalDeviceYcbcr2Plane444FormatsFeaturesEXT;
-  struct PhysicalDeviceYcbcrImageArraysFeaturesEXT;
-  struct PhysicalDeviceZeroInitializeWorkgroupMemoryFeaturesKHR;
-  struct PipelineCacheCreateInfo;
-  struct PipelineCacheHeaderVersionOne;
-  struct PipelineColorBlendAdvancedStateCreateInfoEXT;
-  struct PipelineColorBlendAttachmentState;
-  struct PipelineColorBlendStateCreateInfo;
-  struct PipelineColorWriteCreateInfoEXT;
-  struct PipelineCompilerControlCreateInfoAMD;
-  struct PipelineCoverageModulationStateCreateInfoNV;
-  struct PipelineCoverageReductionStateCreateInfoNV;
-  struct PipelineCoverageToColorStateCreateInfoNV;
-  struct PipelineCreationFeedbackCreateInfoEXT;
-  struct PipelineCreationFeedbackEXT;
-  struct PipelineDepthStencilStateCreateInfo;
-  struct PipelineDiscardRectangleStateCreateInfoEXT;
-  struct PipelineDynamicStateCreateInfo;
-  struct PipelineExecutableInfoKHR;
-  struct PipelineExecutableInternalRepresentationKHR;
-  struct PipelineExecutablePropertiesKHR;
-  struct PipelineExecutableStatisticKHR;
-  union PipelineExecutableStatisticValueKHR;
-  struct PipelineFragmentShadingRateEnumStateCreateInfoNV;
-  struct PipelineFragmentShadingRateStateCreateInfoKHR;
-  struct PipelineInfoKHR;
-  struct PipelineInputAssemblyStateCreateInfo;
-  struct PipelineLayoutCreateInfo;
-  struct PipelineLibraryCreateInfoKHR;
-  struct PipelineMultisampleStateCreateInfo;
-  struct PipelineRasterizationConservativeStateCreateInfoEXT;
-  struct PipelineRasterizationDepthClipStateCreateInfoEXT;
-  struct PipelineRasterizationLineStateCreateInfoEXT;
-  struct PipelineRasterizationProvokingVertexStateCreateInfoEXT;
-  struct PipelineRasterizationStateCreateInfo;
-  struct PipelineRasterizationStateRasterizationOrderAMD;
-  struct PipelineRasterizationStateStreamCreateInfoEXT;
   struct PipelineRepresentativeFragmentTestStateCreateInfoNV;
-  struct PipelineSampleLocationsStateCreateInfoEXT;
-  struct PipelineShaderStageCreateInfo;
-  struct PipelineShaderStageRequiredSubgroupSizeCreateInfoEXT;
-  struct PipelineTessellationDomainOriginStateCreateInfo;
-  using PipelineTessellationDomainOriginStateCreateInfoKHR = PipelineTessellationDomainOriginStateCreateInfo;
-  struct PipelineTessellationStateCreateInfo;
-  struct PipelineVertexInputDivisorStateCreateInfoEXT;
-  struct PipelineVertexInputStateCreateInfo;
-  struct PipelineViewportCoarseSampleOrderStateCreateInfoNV;
-  struct PipelineViewportExclusiveScissorStateCreateInfoNV;
-  struct PipelineViewportShadingRateImageStateCreateInfoNV;
-  struct PipelineViewportStateCreateInfo;
-  struct PipelineViewportSwizzleStateCreateInfoNV;
-  struct PipelineViewportWScalingStateCreateInfoNV;
-#if defined( VK_USE_PLATFORM_GGP )
-  struct PresentFrameTokenGGP;
-#endif /*VK_USE_PLATFORM_GGP*/
-  struct PresentInfoKHR;
-  struct PresentRegionKHR;
-  struct PresentRegionsKHR;
-  struct PresentTimeGOOGLE;
-  struct PresentTimesInfoGOOGLE;
-  struct PrivateDataSlotCreateInfoEXT;
-  struct ProtectedSubmitInfo;
-  struct PushConstantRange;
-  struct QueryPoolCreateInfo;
-  struct QueryPoolPerformanceCreateInfoKHR;
-  struct QueryPoolPerformanceQueryCreateInfoINTEL;
-  using QueryPoolCreateInfoINTEL = QueryPoolPerformanceQueryCreateInfoINTEL;
-  struct QueueFamilyCheckpointProperties2NV;
-  struct QueueFamilyCheckpointPropertiesNV;
-  struct QueueFamilyGlobalPriorityPropertiesEXT;
-  struct QueueFamilyProperties;
-  struct QueueFamilyProperties2;
-  using QueueFamilyProperties2KHR = QueueFamilyProperties2;
-  struct RayTracingPipelineCreateInfoKHR;
-  struct RayTracingPipelineCreateInfoNV;
-  struct RayTracingPipelineInterfaceCreateInfoKHR;
-  struct RayTracingShaderGroupCreateInfoKHR;
-  struct RayTracingShaderGroupCreateInfoNV;
-  struct Rect2D;
-  struct RectLayerKHR;
-  struct RefreshCycleDurationGOOGLE;
-  struct RenderPassAttachmentBeginInfo;
-  using RenderPassAttachmentBeginInfoKHR = RenderPassAttachmentBeginInfo;
-  struct RenderPassBeginInfo;
-  struct RenderPassCreateInfo;
-  struct RenderPassCreateInfo2;
-  using RenderPassCreateInfo2KHR = RenderPassCreateInfo2;
-  struct RenderPassFragmentDensityMapCreateInfoEXT;
-  struct RenderPassInputAttachmentAspectCreateInfo;
-  using RenderPassInputAttachmentAspectCreateInfoKHR = RenderPassInputAttachmentAspectCreateInfo;
-  struct RenderPassMultiviewCreateInfo;
-  using RenderPassMultiviewCreateInfoKHR = RenderPassMultiviewCreateInfo;
-  struct RenderPassSampleLocationsBeginInfoEXT;
-  struct RenderPassTransformBeginInfoQCOM;
-  struct ResolveImageInfo2KHR;
-  struct SRTDataNV;
-  struct SampleLocationEXT;
-  struct SampleLocationsInfoEXT;
-  struct SamplerCreateInfo;
-  struct SamplerCustomBorderColorCreateInfoEXT;
-  struct SamplerReductionModeCreateInfo;
-  using SamplerReductionModeCreateInfoEXT = SamplerReductionModeCreateInfo;
-  struct SamplerYcbcrConversionCreateInfo;
-  using SamplerYcbcrConversionCreateInfoKHR = SamplerYcbcrConversionCreateInfo;
-  struct SamplerYcbcrConversionImageFormatProperties;
-  using SamplerYcbcrConversionImageFormatPropertiesKHR = SamplerYcbcrConversionImageFormatProperties;
-  struct SamplerYcbcrConversionInfo;
-  using SamplerYcbcrConversionInfoKHR = SamplerYcbcrConversionInfo;
-#if defined( VK_USE_PLATFORM_SCREEN_QNX )
-  struct ScreenSurfaceCreateInfoQNX;
-#endif /*VK_USE_PLATFORM_SCREEN_QNX*/
-  struct SemaphoreCreateInfo;
-  struct SemaphoreGetFdInfoKHR;
-#if defined( VK_USE_PLATFORM_WIN32_KHR )
-  struct SemaphoreGetWin32HandleInfoKHR;
-#endif /*VK_USE_PLATFORM_WIN32_KHR*/
-#if defined( VK_USE_PLATFORM_FUCHSIA )
-  struct SemaphoreGetZirconHandleInfoFUCHSIA;
-#endif /*VK_USE_PLATFORM_FUCHSIA*/
-  struct SemaphoreSignalInfo;
-  using SemaphoreSignalInfoKHR = SemaphoreSignalInfo;
-  struct SemaphoreSubmitInfoKHR;
-  struct SemaphoreTypeCreateInfo;
-  using SemaphoreTypeCreateInfoKHR = SemaphoreTypeCreateInfo;
-  struct SemaphoreWaitInfo;
-  using SemaphoreWaitInfoKHR = SemaphoreWaitInfo;
-  struct SetStateFlagsIndirectCommandNV;
-  struct ShaderModuleCreateInfo;
-  struct ShaderModuleValidationCacheCreateInfoEXT;
-  struct ShaderResourceUsageAMD;
-  struct ShaderStatisticsInfoAMD;
-  struct ShadingRatePaletteNV;
-  struct SharedPresentSurfaceCapabilitiesKHR;
-  struct SparseBufferMemoryBindInfo;
-  struct SparseImageFormatProperties;
-  struct SparseImageFormatProperties2;
-  using SparseImageFormatProperties2KHR = SparseImageFormatProperties2;
-  struct SparseImageMemoryBind;
-  struct SparseImageMemoryBindInfo;
-  struct SparseImageMemoryRequirements;
-  struct SparseImageMemoryRequirements2;
-  using SparseImageMemoryRequirements2KHR = SparseImageMemoryRequirements2;
-  struct SparseImageOpaqueMemoryBindInfo;
-  struct SparseMemoryBind;
-  struct SpecializationInfo;
-  struct SpecializationMapEntry;
-  struct StencilOpState;
-#if defined( VK_USE_PLATFORM_GGP )
-  struct StreamDescriptorSurfaceCreateInfoGGP;
-#endif /*VK_USE_PLATFORM_GGP*/
-  struct StridedDeviceAddressRegionKHR;
-  struct SubmitInfo;
-  struct SubmitInfo2KHR;
-  struct SubpassBeginInfo;
-  using SubpassBeginInfoKHR = SubpassBeginInfo;
-  struct SubpassDependency;
-  struct SubpassDependency2;
-  using SubpassDependency2KHR = SubpassDependency2;
-  struct SubpassDescription;
-  struct SubpassDescription2;
-  using SubpassDescription2KHR = SubpassDescription2;
-  struct SubpassDescriptionDepthStencilResolve;
-  using SubpassDescriptionDepthStencilResolveKHR = SubpassDescriptionDepthStencilResolve;
-  struct SubpassEndInfo;
-  using SubpassEndInfoKHR = SubpassEndInfo;
-  struct SubpassSampleLocationsEXT;
-  struct SubpassShadingPipelineCreateInfoHUAWEI;
-  struct SubresourceLayout;
-  struct SurfaceCapabilities2EXT;
-  struct SurfaceCapabilities2KHR;
-#if defined( VK_USE_PLATFORM_WIN32_KHR )
-  struct SurfaceCapabilitiesFullScreenExclusiveEXT;
-#endif /*VK_USE_PLATFORM_WIN32_KHR*/
-  struct SurfaceCapabilitiesKHR;
-  struct SurfaceFormat2KHR;
-  struct SurfaceFormatKHR;
-#if defined( VK_USE_PLATFORM_WIN32_KHR )
-  struct SurfaceFullScreenExclusiveInfoEXT;
-#endif /*VK_USE_PLATFORM_WIN32_KHR*/
-#if defined( VK_USE_PLATFORM_WIN32_KHR )
-  struct SurfaceFullScreenExclusiveWin32InfoEXT;
-#endif /*VK_USE_PLATFORM_WIN32_KHR*/
-  struct SurfaceProtectedCapabilitiesKHR;
-  struct SwapchainCounterCreateInfoEXT;
-  struct SwapchainCreateInfoKHR;
-  struct SwapchainDisplayNativeHdrCreateInfoAMD;
-  struct TextureLODGatherFormatPropertiesAMD;
-  struct TimelineSemaphoreSubmitInfo;
-  using TimelineSemaphoreSubmitInfoKHR = TimelineSemaphoreSubmitInfo;
-  struct TraceRaysIndirectCommandKHR;
-  struct TransformMatrixKHR;
-  using TransformMatrixNV = TransformMatrixKHR;
-  struct ValidationCacheCreateInfoEXT;
-  struct ValidationFeaturesEXT;
-  struct ValidationFlagsEXT;
-  struct VertexInputAttributeDescription;
-  struct VertexInputAttributeDescription2EXT;
-  struct VertexInputBindingDescription;
-  struct VertexInputBindingDescription2EXT;
-  struct VertexInputBindingDivisorDescriptionEXT;
-#if defined( VK_USE_PLATFORM_VI_NN )
-  struct ViSurfaceCreateInfoNN;
-#endif /*VK_USE_PLATFORM_VI_NN*/
+
+  //=== VK_EXT_filter_cubic ===
+  struct PhysicalDeviceImageViewImageFormatInfoEXT;
+  struct FilterCubicImageViewImageFormatPropertiesEXT;
+
+  //=== VK_EXT_global_priority ===
+  struct DeviceQueueGlobalPriorityCreateInfoEXT;
+
+  //=== VK_EXT_external_memory_host ===
+  struct ImportMemoryHostPointerInfoEXT;
+  struct MemoryHostPointerPropertiesEXT;
+  struct PhysicalDeviceExternalMemoryHostPropertiesEXT;
+
+  //=== VK_KHR_shader_clock ===
+  struct PhysicalDeviceShaderClockFeaturesKHR;
+
+  //=== VK_AMD_pipeline_compiler_control ===
+  struct PipelineCompilerControlCreateInfoAMD;
+
+  //=== VK_EXT_calibrated_timestamps ===
+  struct CalibratedTimestampInfoEXT;
+
+  //=== VK_AMD_shader_core_properties ===
+  struct PhysicalDeviceShaderCorePropertiesAMD;
+
 #if defined( VK_ENABLE_BETA_EXTENSIONS )
-  struct VideoBeginCodingInfoKHR;
-#endif /*VK_ENABLE_BETA_EXTENSIONS*/
-#if defined( VK_ENABLE_BETA_EXTENSIONS )
-  struct VideoBindMemoryKHR;
-#endif /*VK_ENABLE_BETA_EXTENSIONS*/
-#if defined( VK_ENABLE_BETA_EXTENSIONS )
-  struct VideoCapabilitiesKHR;
-#endif /*VK_ENABLE_BETA_EXTENSIONS*/
-#if defined( VK_ENABLE_BETA_EXTENSIONS )
-  struct VideoCodingControlInfoKHR;
-#endif /*VK_ENABLE_BETA_EXTENSIONS*/
-#if defined( VK_ENABLE_BETA_EXTENSIONS )
-  struct VideoDecodeH264CapabilitiesEXT;
-#endif /*VK_ENABLE_BETA_EXTENSIONS*/
-#if defined( VK_ENABLE_BETA_EXTENSIONS )
-  struct VideoDecodeH264DpbSlotInfoEXT;
-#endif /*VK_ENABLE_BETA_EXTENSIONS*/
-#if defined( VK_ENABLE_BETA_EXTENSIONS )
-  struct VideoDecodeH264MvcEXT;
-#endif /*VK_ENABLE_BETA_EXTENSIONS*/
-#if defined( VK_ENABLE_BETA_EXTENSIONS )
-  struct VideoDecodeH264PictureInfoEXT;
-#endif /*VK_ENABLE_BETA_EXTENSIONS*/
-#if defined( VK_ENABLE_BETA_EXTENSIONS )
-  struct VideoDecodeH264ProfileEXT;
-#endif /*VK_ENABLE_BETA_EXTENSIONS*/
-#if defined( VK_ENABLE_BETA_EXTENSIONS )
-  struct VideoDecodeH264SessionCreateInfoEXT;
-#endif /*VK_ENABLE_BETA_EXTENSIONS*/
-#if defined( VK_ENABLE_BETA_EXTENSIONS )
-  struct VideoDecodeH264SessionParametersAddInfoEXT;
-#endif /*VK_ENABLE_BETA_EXTENSIONS*/
-#if defined( VK_ENABLE_BETA_EXTENSIONS )
-  struct VideoDecodeH264SessionParametersCreateInfoEXT;
-#endif /*VK_ENABLE_BETA_EXTENSIONS*/
-#if defined( VK_ENABLE_BETA_EXTENSIONS )
+  //=== VK_EXT_video_decode_h265 ===
+  struct VideoDecodeH265ProfileEXT;
   struct VideoDecodeH265CapabilitiesEXT;
-#endif /*VK_ENABLE_BETA_EXTENSIONS*/
-#if defined( VK_ENABLE_BETA_EXTENSIONS )
+  struct VideoDecodeH265SessionCreateInfoEXT;
+  struct VideoDecodeH265SessionParametersCreateInfoEXT;
+  struct VideoDecodeH265SessionParametersAddInfoEXT;
+  struct VideoDecodeH265PictureInfoEXT;
   struct VideoDecodeH265DpbSlotInfoEXT;
 #endif /*VK_ENABLE_BETA_EXTENSIONS*/
+
+  //=== VK_AMD_memory_overallocation_behavior ===
+  struct DeviceMemoryOverallocationCreateInfoAMD;
+
+  //=== VK_EXT_vertex_attribute_divisor ===
+  struct PhysicalDeviceVertexAttributeDivisorPropertiesEXT;
+  struct VertexInputBindingDivisorDescriptionEXT;
+  struct PipelineVertexInputDivisorStateCreateInfoEXT;
+  struct PhysicalDeviceVertexAttributeDivisorFeaturesEXT;
+
+#if defined( VK_USE_PLATFORM_GGP )
+  //=== VK_GGP_frame_token ===
+  struct PresentFrameTokenGGP;
+#endif /*VK_USE_PLATFORM_GGP*/
+
+  //=== VK_EXT_pipeline_creation_feedback ===
+  struct PipelineCreationFeedbackCreateInfoEXT;
+  struct PipelineCreationFeedbackEXT;
+
+  //=== VK_NV_compute_shader_derivatives ===
+  struct PhysicalDeviceComputeShaderDerivativesFeaturesNV;
+
+  //=== VK_NV_mesh_shader ===
+  struct PhysicalDeviceMeshShaderFeaturesNV;
+  struct PhysicalDeviceMeshShaderPropertiesNV;
+  struct DrawMeshTasksIndirectCommandNV;
+
+  //=== VK_NV_fragment_shader_barycentric ===
+  struct PhysicalDeviceFragmentShaderBarycentricFeaturesNV;
+
+  //=== VK_NV_shader_image_footprint ===
+  struct PhysicalDeviceShaderImageFootprintFeaturesNV;
+
+  //=== VK_NV_scissor_exclusive ===
+  struct PipelineViewportExclusiveScissorStateCreateInfoNV;
+  struct PhysicalDeviceExclusiveScissorFeaturesNV;
+
+  //=== VK_NV_device_diagnostic_checkpoints ===
+  struct QueueFamilyCheckpointPropertiesNV;
+  struct CheckpointDataNV;
+
+  //=== VK_INTEL_shader_integer_functions2 ===
+  struct PhysicalDeviceShaderIntegerFunctions2FeaturesINTEL;
+
+  //=== VK_INTEL_performance_query ===
+  union PerformanceValueDataINTEL;
+  struct PerformanceValueINTEL;
+  struct InitializePerformanceApiInfoINTEL;
+  struct QueryPoolPerformanceQueryCreateInfoINTEL;
+  using QueryPoolCreateInfoINTEL = QueryPoolPerformanceQueryCreateInfoINTEL;
+  struct PerformanceMarkerInfoINTEL;
+  struct PerformanceStreamMarkerInfoINTEL;
+  struct PerformanceOverrideInfoINTEL;
+  struct PerformanceConfigurationAcquireInfoINTEL;
+
+  //=== VK_EXT_pci_bus_info ===
+  struct PhysicalDevicePCIBusInfoPropertiesEXT;
+
+  //=== VK_AMD_display_native_hdr ===
+  struct DisplayNativeHdrSurfaceCapabilitiesAMD;
+  struct SwapchainDisplayNativeHdrCreateInfoAMD;
+
+#if defined( VK_USE_PLATFORM_FUCHSIA )
+  //=== VK_FUCHSIA_imagepipe_surface ===
+  struct ImagePipeSurfaceCreateInfoFUCHSIA;
+#endif /*VK_USE_PLATFORM_FUCHSIA*/
+
+  //=== VK_KHR_shader_terminate_invocation ===
+  struct PhysicalDeviceShaderTerminateInvocationFeaturesKHR;
+
+#if defined( VK_USE_PLATFORM_METAL_EXT )
+  //=== VK_EXT_metal_surface ===
+  struct MetalSurfaceCreateInfoEXT;
+#endif /*VK_USE_PLATFORM_METAL_EXT*/
+
+  //=== VK_EXT_fragment_density_map ===
+  struct PhysicalDeviceFragmentDensityMapFeaturesEXT;
+  struct PhysicalDeviceFragmentDensityMapPropertiesEXT;
+  struct RenderPassFragmentDensityMapCreateInfoEXT;
+
+  //=== VK_EXT_subgroup_size_control ===
+  struct PhysicalDeviceSubgroupSizeControlFeaturesEXT;
+  struct PhysicalDeviceSubgroupSizeControlPropertiesEXT;
+  struct PipelineShaderStageRequiredSubgroupSizeCreateInfoEXT;
+
+  //=== VK_KHR_fragment_shading_rate ===
+  struct FragmentShadingRateAttachmentInfoKHR;
+  struct PipelineFragmentShadingRateStateCreateInfoKHR;
+  struct PhysicalDeviceFragmentShadingRateFeaturesKHR;
+  struct PhysicalDeviceFragmentShadingRatePropertiesKHR;
+  struct PhysicalDeviceFragmentShadingRateKHR;
+
+  //=== VK_AMD_shader_core_properties2 ===
+  struct PhysicalDeviceShaderCoreProperties2AMD;
+
+  //=== VK_AMD_device_coherent_memory ===
+  struct PhysicalDeviceCoherentMemoryFeaturesAMD;
+
+  //=== VK_EXT_shader_image_atomic_int64 ===
+  struct PhysicalDeviceShaderImageAtomicInt64FeaturesEXT;
+
+  //=== VK_EXT_memory_budget ===
+  struct PhysicalDeviceMemoryBudgetPropertiesEXT;
+
+  //=== VK_EXT_memory_priority ===
+  struct PhysicalDeviceMemoryPriorityFeaturesEXT;
+  struct MemoryPriorityAllocateInfoEXT;
+
+  //=== VK_KHR_surface_protected_capabilities ===
+  struct SurfaceProtectedCapabilitiesKHR;
+
+  //=== VK_NV_dedicated_allocation_image_aliasing ===
+  struct PhysicalDeviceDedicatedAllocationImageAliasingFeaturesNV;
+
+  //=== VK_EXT_buffer_device_address ===
+  struct PhysicalDeviceBufferDeviceAddressFeaturesEXT;
+  using PhysicalDeviceBufferAddressFeaturesEXT = PhysicalDeviceBufferDeviceAddressFeaturesEXT;
+  struct BufferDeviceAddressCreateInfoEXT;
+
+  //=== VK_EXT_tooling_info ===
+  struct PhysicalDeviceToolPropertiesEXT;
+
+  //=== VK_EXT_validation_features ===
+  struct ValidationFeaturesEXT;
+
+  //=== VK_KHR_present_wait ===
+  struct PhysicalDevicePresentWaitFeaturesKHR;
+
+  //=== VK_NV_cooperative_matrix ===
+  struct CooperativeMatrixPropertiesNV;
+  struct PhysicalDeviceCooperativeMatrixFeaturesNV;
+  struct PhysicalDeviceCooperativeMatrixPropertiesNV;
+
+  //=== VK_NV_coverage_reduction_mode ===
+  struct PhysicalDeviceCoverageReductionModeFeaturesNV;
+  struct PipelineCoverageReductionStateCreateInfoNV;
+  struct FramebufferMixedSamplesCombinationNV;
+
+  //=== VK_EXT_fragment_shader_interlock ===
+  struct PhysicalDeviceFragmentShaderInterlockFeaturesEXT;
+
+  //=== VK_EXT_ycbcr_image_arrays ===
+  struct PhysicalDeviceYcbcrImageArraysFeaturesEXT;
+
+  //=== VK_EXT_provoking_vertex ===
+  struct PhysicalDeviceProvokingVertexFeaturesEXT;
+  struct PhysicalDeviceProvokingVertexPropertiesEXT;
+  struct PipelineRasterizationProvokingVertexStateCreateInfoEXT;
+
+#if defined( VK_USE_PLATFORM_WIN32_KHR )
+  //=== VK_EXT_full_screen_exclusive ===
+  struct SurfaceFullScreenExclusiveInfoEXT;
+  struct SurfaceCapabilitiesFullScreenExclusiveEXT;
+  struct SurfaceFullScreenExclusiveWin32InfoEXT;
+#endif /*VK_USE_PLATFORM_WIN32_KHR*/
+
+  //=== VK_EXT_headless_surface ===
+  struct HeadlessSurfaceCreateInfoEXT;
+
+  //=== VK_EXT_line_rasterization ===
+  struct PhysicalDeviceLineRasterizationFeaturesEXT;
+  struct PhysicalDeviceLineRasterizationPropertiesEXT;
+  struct PipelineRasterizationLineStateCreateInfoEXT;
+
+  //=== VK_EXT_shader_atomic_float ===
+  struct PhysicalDeviceShaderAtomicFloatFeaturesEXT;
+
+  //=== VK_EXT_index_type_uint8 ===
+  struct PhysicalDeviceIndexTypeUint8FeaturesEXT;
+
+  //=== VK_EXT_extended_dynamic_state ===
+  struct PhysicalDeviceExtendedDynamicStateFeaturesEXT;
+
+  //=== VK_KHR_pipeline_executable_properties ===
+  struct PhysicalDevicePipelineExecutablePropertiesFeaturesKHR;
+  struct PipelineInfoKHR;
+  struct PipelineExecutablePropertiesKHR;
+  struct PipelineExecutableInfoKHR;
+  union PipelineExecutableStatisticValueKHR;
+  struct PipelineExecutableStatisticKHR;
+  struct PipelineExecutableInternalRepresentationKHR;
+
+  //=== VK_EXT_shader_atomic_float2 ===
+  struct PhysicalDeviceShaderAtomicFloat2FeaturesEXT;
+
+  //=== VK_EXT_shader_demote_to_helper_invocation ===
+  struct PhysicalDeviceShaderDemoteToHelperInvocationFeaturesEXT;
+
+  //=== VK_NV_device_generated_commands ===
+  struct PhysicalDeviceDeviceGeneratedCommandsPropertiesNV;
+  struct PhysicalDeviceDeviceGeneratedCommandsFeaturesNV;
+  struct GraphicsShaderGroupCreateInfoNV;
+  struct GraphicsPipelineShaderGroupsCreateInfoNV;
+  struct BindShaderGroupIndirectCommandNV;
+  struct BindIndexBufferIndirectCommandNV;
+  struct BindVertexBufferIndirectCommandNV;
+  struct SetStateFlagsIndirectCommandNV;
+  struct IndirectCommandsStreamNV;
+  struct IndirectCommandsLayoutTokenNV;
+  struct IndirectCommandsLayoutCreateInfoNV;
+  struct GeneratedCommandsInfoNV;
+  struct GeneratedCommandsMemoryRequirementsInfoNV;
+
+  //=== VK_NV_inherited_viewport_scissor ===
+  struct PhysicalDeviceInheritedViewportScissorFeaturesNV;
+  struct CommandBufferInheritanceViewportScissorInfoNV;
+
+  //=== VK_KHR_shader_integer_dot_product ===
+  struct PhysicalDeviceShaderIntegerDotProductFeaturesKHR;
+  struct PhysicalDeviceShaderIntegerDotProductPropertiesKHR;
+
+  //=== VK_EXT_texel_buffer_alignment ===
+  struct PhysicalDeviceTexelBufferAlignmentFeaturesEXT;
+  struct PhysicalDeviceTexelBufferAlignmentPropertiesEXT;
+
+  //=== VK_QCOM_render_pass_transform ===
+  struct RenderPassTransformBeginInfoQCOM;
+  struct CommandBufferInheritanceRenderPassTransformInfoQCOM;
+
+  //=== VK_EXT_device_memory_report ===
+  struct PhysicalDeviceDeviceMemoryReportFeaturesEXT;
+  struct DeviceDeviceMemoryReportCreateInfoEXT;
+  struct DeviceMemoryReportCallbackDataEXT;
+
+  //=== VK_EXT_robustness2 ===
+  struct PhysicalDeviceRobustness2FeaturesEXT;
+  struct PhysicalDeviceRobustness2PropertiesEXT;
+
+  //=== VK_EXT_custom_border_color ===
+  struct SamplerCustomBorderColorCreateInfoEXT;
+  struct PhysicalDeviceCustomBorderColorPropertiesEXT;
+  struct PhysicalDeviceCustomBorderColorFeaturesEXT;
+
+  //=== VK_KHR_pipeline_library ===
+  struct PipelineLibraryCreateInfoKHR;
+
+  //=== VK_KHR_present_id ===
+  struct PresentIdKHR;
+  struct PhysicalDevicePresentIdFeaturesKHR;
+
+  //=== VK_EXT_private_data ===
+  struct PhysicalDevicePrivateDataFeaturesEXT;
+  struct DevicePrivateDataCreateInfoEXT;
+  struct PrivateDataSlotCreateInfoEXT;
+
+  //=== VK_EXT_pipeline_creation_cache_control ===
+  struct PhysicalDevicePipelineCreationCacheControlFeaturesEXT;
+
 #if defined( VK_ENABLE_BETA_EXTENSIONS )
-  struct VideoDecodeH265PictureInfoEXT;
-#endif /*VK_ENABLE_BETA_EXTENSIONS*/
-#if defined( VK_ENABLE_BETA_EXTENSIONS )
-  struct VideoDecodeH265ProfileEXT;
-#endif /*VK_ENABLE_BETA_EXTENSIONS*/
-#if defined( VK_ENABLE_BETA_EXTENSIONS )
-  struct VideoDecodeH265SessionCreateInfoEXT;
-#endif /*VK_ENABLE_BETA_EXTENSIONS*/
-#if defined( VK_ENABLE_BETA_EXTENSIONS )
-  struct VideoDecodeH265SessionParametersAddInfoEXT;
-#endif /*VK_ENABLE_BETA_EXTENSIONS*/
-#if defined( VK_ENABLE_BETA_EXTENSIONS )
-  struct VideoDecodeH265SessionParametersCreateInfoEXT;
-#endif /*VK_ENABLE_BETA_EXTENSIONS*/
-#if defined( VK_ENABLE_BETA_EXTENSIONS )
-  struct VideoDecodeInfoKHR;
-#endif /*VK_ENABLE_BETA_EXTENSIONS*/
-#if defined( VK_ENABLE_BETA_EXTENSIONS )
-  struct VideoEncodeH264CapabilitiesEXT;
-#endif /*VK_ENABLE_BETA_EXTENSIONS*/
-#if defined( VK_ENABLE_BETA_EXTENSIONS )
-  struct VideoEncodeH264DpbSlotInfoEXT;
-#endif /*VK_ENABLE_BETA_EXTENSIONS*/
-#if defined( VK_ENABLE_BETA_EXTENSIONS )
-  struct VideoEncodeH264EmitPictureParametersEXT;
-#endif /*VK_ENABLE_BETA_EXTENSIONS*/
-#if defined( VK_ENABLE_BETA_EXTENSIONS )
-  struct VideoEncodeH264NaluSliceEXT;
-#endif /*VK_ENABLE_BETA_EXTENSIONS*/
-#if defined( VK_ENABLE_BETA_EXTENSIONS )
-  struct VideoEncodeH264ProfileEXT;
-#endif /*VK_ENABLE_BETA_EXTENSIONS*/
-#if defined( VK_ENABLE_BETA_EXTENSIONS )
-  struct VideoEncodeH264SessionCreateInfoEXT;
-#endif /*VK_ENABLE_BETA_EXTENSIONS*/
-#if defined( VK_ENABLE_BETA_EXTENSIONS )
-  struct VideoEncodeH264SessionParametersAddInfoEXT;
-#endif /*VK_ENABLE_BETA_EXTENSIONS*/
-#if defined( VK_ENABLE_BETA_EXTENSIONS )
-  struct VideoEncodeH264SessionParametersCreateInfoEXT;
-#endif /*VK_ENABLE_BETA_EXTENSIONS*/
-#if defined( VK_ENABLE_BETA_EXTENSIONS )
-  struct VideoEncodeH264VclFrameInfoEXT;
-#endif /*VK_ENABLE_BETA_EXTENSIONS*/
-#if defined( VK_ENABLE_BETA_EXTENSIONS )
+  //=== VK_KHR_video_encode_queue ===
   struct VideoEncodeInfoKHR;
-#endif /*VK_ENABLE_BETA_EXTENSIONS*/
-#if defined( VK_ENABLE_BETA_EXTENSIONS )
   struct VideoEncodeRateControlInfoKHR;
 #endif /*VK_ENABLE_BETA_EXTENSIONS*/
-#if defined( VK_ENABLE_BETA_EXTENSIONS )
-  struct VideoEndCodingInfoKHR;
-#endif /*VK_ENABLE_BETA_EXTENSIONS*/
-#if defined( VK_ENABLE_BETA_EXTENSIONS )
-  struct VideoFormatPropertiesKHR;
-#endif /*VK_ENABLE_BETA_EXTENSIONS*/
-#if defined( VK_ENABLE_BETA_EXTENSIONS )
-  struct VideoGetMemoryPropertiesKHR;
-#endif /*VK_ENABLE_BETA_EXTENSIONS*/
-#if defined( VK_ENABLE_BETA_EXTENSIONS )
-  struct VideoPictureResourceKHR;
-#endif /*VK_ENABLE_BETA_EXTENSIONS*/
-#if defined( VK_ENABLE_BETA_EXTENSIONS )
-  struct VideoProfileKHR;
-#endif /*VK_ENABLE_BETA_EXTENSIONS*/
-#if defined( VK_ENABLE_BETA_EXTENSIONS )
-  struct VideoProfilesKHR;
-#endif /*VK_ENABLE_BETA_EXTENSIONS*/
-#if defined( VK_ENABLE_BETA_EXTENSIONS )
-  struct VideoQueueFamilyProperties2KHR;
-#endif /*VK_ENABLE_BETA_EXTENSIONS*/
-#if defined( VK_ENABLE_BETA_EXTENSIONS )
-  struct VideoReferenceSlotKHR;
-#endif /*VK_ENABLE_BETA_EXTENSIONS*/
-#if defined( VK_ENABLE_BETA_EXTENSIONS )
-  struct VideoSessionCreateInfoKHR;
-#endif /*VK_ENABLE_BETA_EXTENSIONS*/
-#if defined( VK_ENABLE_BETA_EXTENSIONS )
-  struct VideoSessionParametersCreateInfoKHR;
-#endif /*VK_ENABLE_BETA_EXTENSIONS*/
-#if defined( VK_ENABLE_BETA_EXTENSIONS )
-  struct VideoSessionParametersUpdateInfoKHR;
-#endif /*VK_ENABLE_BETA_EXTENSIONS*/
-  struct Viewport;
-  struct ViewportSwizzleNV;
-  struct ViewportWScalingNV;
-#if defined( VK_USE_PLATFORM_WAYLAND_KHR )
-  struct WaylandSurfaceCreateInfoKHR;
-#endif /*VK_USE_PLATFORM_WAYLAND_KHR*/
-#if defined( VK_USE_PLATFORM_WIN32_KHR )
-  struct Win32KeyedMutexAcquireReleaseInfoKHR;
-#endif /*VK_USE_PLATFORM_WIN32_KHR*/
-#if defined( VK_USE_PLATFORM_WIN32_KHR )
-  struct Win32KeyedMutexAcquireReleaseInfoNV;
-#endif /*VK_USE_PLATFORM_WIN32_KHR*/
-#if defined( VK_USE_PLATFORM_WIN32_KHR )
-  struct Win32SurfaceCreateInfoKHR;
-#endif /*VK_USE_PLATFORM_WIN32_KHR*/
-  struct WriteDescriptorSet;
-  struct WriteDescriptorSetAccelerationStructureKHR;
-  struct WriteDescriptorSetAccelerationStructureNV;
-  struct WriteDescriptorSetInlineUniformBlockEXT;
-  struct XYColorEXT;
-#if defined( VK_USE_PLATFORM_XCB_KHR )
-  struct XcbSurfaceCreateInfoKHR;
-#endif /*VK_USE_PLATFORM_XCB_KHR*/
-#if defined( VK_USE_PLATFORM_XLIB_KHR )
-  struct XlibSurfaceCreateInfoKHR;
-#endif /*VK_USE_PLATFORM_XLIB_KHR*/
+
+  //=== VK_NV_device_diagnostics_config ===
+  struct PhysicalDeviceDiagnosticsConfigFeaturesNV;
+  struct DeviceDiagnosticsConfigCreateInfoNV;
+
+  //=== VK_KHR_synchronization2 ===
+  struct MemoryBarrier2KHR;
+  struct BufferMemoryBarrier2KHR;
+  struct ImageMemoryBarrier2KHR;
+  struct DependencyInfoKHR;
+  struct SubmitInfo2KHR;
+  struct SemaphoreSubmitInfoKHR;
+  struct CommandBufferSubmitInfoKHR;
+  struct PhysicalDeviceSynchronization2FeaturesKHR;
+  struct QueueFamilyCheckpointProperties2NV;
+  struct CheckpointData2NV;
+
+  //=== VK_KHR_shader_subgroup_uniform_control_flow ===
+  struct PhysicalDeviceShaderSubgroupUniformControlFlowFeaturesKHR;
+
+  //=== VK_KHR_zero_initialize_workgroup_memory ===
+  struct PhysicalDeviceZeroInitializeWorkgroupMemoryFeaturesKHR;
+
+  //=== VK_NV_fragment_shading_rate_enums ===
+  struct PhysicalDeviceFragmentShadingRateEnumsFeaturesNV;
+  struct PhysicalDeviceFragmentShadingRateEnumsPropertiesNV;
+  struct PipelineFragmentShadingRateEnumStateCreateInfoNV;
+
+  //=== VK_NV_ray_tracing_motion_blur ===
+  struct AccelerationStructureGeometryMotionTrianglesDataNV;
+  struct AccelerationStructureMotionInfoNV;
+  struct AccelerationStructureMotionInstanceNV;
+  union AccelerationStructureMotionInstanceDataNV;
+  struct AccelerationStructureMatrixMotionInstanceNV;
+  struct AccelerationStructureSRTMotionInstanceNV;
+  struct SRTDataNV;
+  struct PhysicalDeviceRayTracingMotionBlurFeaturesNV;
+
+  //=== VK_EXT_ycbcr_2plane_444_formats ===
+  struct PhysicalDeviceYcbcr2Plane444FormatsFeaturesEXT;
+
+  //=== VK_EXT_fragment_density_map2 ===
+  struct PhysicalDeviceFragmentDensityMap2FeaturesEXT;
+  struct PhysicalDeviceFragmentDensityMap2PropertiesEXT;
+
+  //=== VK_QCOM_rotated_copy_commands ===
+  struct CopyCommandTransformInfoQCOM;
+
+  //=== VK_EXT_image_robustness ===
+  struct PhysicalDeviceImageRobustnessFeaturesEXT;
+
+  //=== VK_KHR_workgroup_memory_explicit_layout ===
+  struct PhysicalDeviceWorkgroupMemoryExplicitLayoutFeaturesKHR;
+
+  //=== VK_KHR_copy_commands2 ===
+  struct CopyBufferInfo2KHR;
+  struct CopyImageInfo2KHR;
+  struct CopyBufferToImageInfo2KHR;
+  struct CopyImageToBufferInfo2KHR;
+  struct BlitImageInfo2KHR;
+  struct ResolveImageInfo2KHR;
+  struct BufferCopy2KHR;
+  struct ImageCopy2KHR;
+  struct ImageBlit2KHR;
+  struct BufferImageCopy2KHR;
+  struct ImageResolve2KHR;
+
+  //=== VK_EXT_4444_formats ===
+  struct PhysicalDevice4444FormatsFeaturesEXT;
+
+#if defined( VK_USE_PLATFORM_DIRECTFB_EXT )
+  //=== VK_EXT_directfb_surface ===
+  struct DirectFBSurfaceCreateInfoEXT;
+#endif /*VK_USE_PLATFORM_DIRECTFB_EXT*/
+
+  //=== VK_KHR_ray_tracing_pipeline ===
+  struct RayTracingShaderGroupCreateInfoKHR;
+  struct RayTracingPipelineCreateInfoKHR;
+  struct PhysicalDeviceRayTracingPipelineFeaturesKHR;
+  struct PhysicalDeviceRayTracingPipelinePropertiesKHR;
+  struct StridedDeviceAddressRegionKHR;
+  struct TraceRaysIndirectCommandKHR;
+  struct RayTracingPipelineInterfaceCreateInfoKHR;
+
+  //=== VK_KHR_ray_query ===
+  struct PhysicalDeviceRayQueryFeaturesKHR;
+
+  //=== VK_VALVE_mutable_descriptor_type ===
+  struct PhysicalDeviceMutableDescriptorTypeFeaturesVALVE;
+  struct MutableDescriptorTypeListVALVE;
+  struct MutableDescriptorTypeCreateInfoVALVE;
+
+  //=== VK_EXT_vertex_input_dynamic_state ===
+  struct PhysicalDeviceVertexInputDynamicStateFeaturesEXT;
+  struct VertexInputBindingDescription2EXT;
+  struct VertexInputAttributeDescription2EXT;
+
+  //=== VK_EXT_physical_device_drm ===
+  struct PhysicalDeviceDrmPropertiesEXT;
+
+  //=== VK_EXT_primitive_topology_list_restart ===
+  struct PhysicalDevicePrimitiveTopologyListRestartFeaturesEXT;
+
+#if defined( VK_USE_PLATFORM_FUCHSIA )
+  //=== VK_FUCHSIA_external_memory ===
+  struct ImportMemoryZirconHandleInfoFUCHSIA;
+  struct MemoryZirconHandlePropertiesFUCHSIA;
+  struct MemoryGetZirconHandleInfoFUCHSIA;
+#endif /*VK_USE_PLATFORM_FUCHSIA*/
+
+#if defined( VK_USE_PLATFORM_FUCHSIA )
+  //=== VK_FUCHSIA_external_semaphore ===
+  struct ImportSemaphoreZirconHandleInfoFUCHSIA;
+  struct SemaphoreGetZirconHandleInfoFUCHSIA;
+#endif /*VK_USE_PLATFORM_FUCHSIA*/
+
+  //=== VK_HUAWEI_subpass_shading ===
+  struct SubpassShadingPipelineCreateInfoHUAWEI;
+  struct PhysicalDeviceSubpassShadingFeaturesHUAWEI;
+  struct PhysicalDeviceSubpassShadingPropertiesHUAWEI;
+
+  //=== VK_HUAWEI_invocation_mask ===
+  struct PhysicalDeviceInvocationMaskFeaturesHUAWEI;
+
+  //=== VK_NV_external_memory_rdma ===
+  struct MemoryGetRemoteAddressInfoNV;
+  struct PhysicalDeviceExternalMemoryRDMAFeaturesNV;
+
+  //=== VK_EXT_extended_dynamic_state2 ===
+  struct PhysicalDeviceExtendedDynamicState2FeaturesEXT;
+
+#if defined( VK_USE_PLATFORM_SCREEN_QNX )
+  //=== VK_QNX_screen_surface ===
+  struct ScreenSurfaceCreateInfoQNX;
+#endif /*VK_USE_PLATFORM_SCREEN_QNX*/
+
+  //=== VK_EXT_color_write_enable ===
+  struct PhysicalDeviceColorWriteEnableFeaturesEXT;
+  struct PipelineColorWriteCreateInfoEXT;
+
+  //=== VK_EXT_global_priority_query ===
+  struct PhysicalDeviceGlobalPriorityQueryFeaturesEXT;
+  struct QueueFamilyGlobalPriorityPropertiesEXT;
+
+  //=== VK_EXT_multi_draw ===
+  struct PhysicalDeviceMultiDrawFeaturesEXT;
+  struct PhysicalDeviceMultiDrawPropertiesEXT;
+  struct MultiDrawInfoEXT;
+  struct MultiDrawIndexedInfoEXT;
+
+  //===============
+  //=== HANDLEs ===
+  //===============
 
   class SurfaceKHR
   {
@@ -2131,100 +2376,6 @@
     static VULKAN_HPP_CONST_OR_CONSTEXPR bool value = true;
   };
 
-  class Pipeline
-  {
-  public:
-    using CType = VkPipeline;
-
-    static VULKAN_HPP_CONST_OR_CONSTEXPR VULKAN_HPP_NAMESPACE::ObjectType objectType =
-      VULKAN_HPP_NAMESPACE::ObjectType::ePipeline;
-    static VULKAN_HPP_CONST_OR_CONSTEXPR VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT debugReportObjectType =
-      VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT::ePipeline;
-
-  public:
-    VULKAN_HPP_CONSTEXPR         Pipeline() = default;
-    VULKAN_HPP_CONSTEXPR         Pipeline( std::nullptr_t ) VULKAN_HPP_NOEXCEPT {}
-    VULKAN_HPP_TYPESAFE_EXPLICIT Pipeline( VkPipeline pipeline ) VULKAN_HPP_NOEXCEPT : m_pipeline( pipeline ) {}
-
-#if defined( VULKAN_HPP_TYPESAFE_CONVERSION )
-    Pipeline & operator=( VkPipeline pipeline ) VULKAN_HPP_NOEXCEPT
-    {
-      m_pipeline = pipeline;
-      return *this;
-    }
-#endif
-
-    Pipeline & operator=( std::nullptr_t ) VULKAN_HPP_NOEXCEPT
-    {
-      m_pipeline = {};
-      return *this;
-    }
-
-#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )
-    auto operator<=>( Pipeline const & ) const = default;
-#else
-    bool operator==( Pipeline const & rhs ) const VULKAN_HPP_NOEXCEPT
-    {
-      return m_pipeline == rhs.m_pipeline;
-    }
-
-    bool operator!=( Pipeline const & rhs ) const VULKAN_HPP_NOEXCEPT
-    {
-      return m_pipeline != rhs.m_pipeline;
-    }
-
-    bool operator<( Pipeline const & rhs ) const VULKAN_HPP_NOEXCEPT
-    {
-      return m_pipeline < rhs.m_pipeline;
-    }
-#endif
-
-    VULKAN_HPP_TYPESAFE_EXPLICIT operator VkPipeline() const VULKAN_HPP_NOEXCEPT
-    {
-      return m_pipeline;
-    }
-
-    explicit operator bool() const VULKAN_HPP_NOEXCEPT
-    {
-      return m_pipeline != VK_NULL_HANDLE;
-    }
-
-    bool operator!() const VULKAN_HPP_NOEXCEPT
-    {
-      return m_pipeline == VK_NULL_HANDLE;
-    }
-
-  private:
-    VkPipeline m_pipeline = {};
-  };
-  static_assert( sizeof( VULKAN_HPP_NAMESPACE::Pipeline ) == sizeof( VkPipeline ),
-                 "handle and wrapper have different size!" );
-
-  template <>
-  struct VULKAN_HPP_DEPRECATED( "vk::cpp_type is deprecated. Use vk::CppType instead." ) cpp_type<ObjectType::ePipeline>
-  {
-    using type = VULKAN_HPP_NAMESPACE::Pipeline;
-  };
-
-  template <>
-  struct CppType<VULKAN_HPP_NAMESPACE::ObjectType, VULKAN_HPP_NAMESPACE::ObjectType::ePipeline>
-  {
-    using Type = VULKAN_HPP_NAMESPACE::Pipeline;
-  };
-
-  template <>
-  struct CppType<VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT,
-                 VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT::ePipeline>
-  {
-    using Type = VULKAN_HPP_NAMESPACE::Pipeline;
-  };
-
-  template <>
-  struct isVulkanHandleType<VULKAN_HPP_NAMESPACE::Pipeline>
-  {
-    static VULKAN_HPP_CONST_OR_CONSTEXPR bool value = true;
-  };
-
   class ImageView
   {
   public:
@@ -2320,6 +2471,100 @@
     static VULKAN_HPP_CONST_OR_CONSTEXPR bool value = true;
   };
 
+  class Pipeline
+  {
+  public:
+    using CType = VkPipeline;
+
+    static VULKAN_HPP_CONST_OR_CONSTEXPR VULKAN_HPP_NAMESPACE::ObjectType objectType =
+      VULKAN_HPP_NAMESPACE::ObjectType::ePipeline;
+    static VULKAN_HPP_CONST_OR_CONSTEXPR VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT debugReportObjectType =
+      VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT::ePipeline;
+
+  public:
+    VULKAN_HPP_CONSTEXPR         Pipeline() = default;
+    VULKAN_HPP_CONSTEXPR         Pipeline( std::nullptr_t ) VULKAN_HPP_NOEXCEPT {}
+    VULKAN_HPP_TYPESAFE_EXPLICIT Pipeline( VkPipeline pipeline ) VULKAN_HPP_NOEXCEPT : m_pipeline( pipeline ) {}
+
+#if defined( VULKAN_HPP_TYPESAFE_CONVERSION )
+    Pipeline & operator=( VkPipeline pipeline ) VULKAN_HPP_NOEXCEPT
+    {
+      m_pipeline = pipeline;
+      return *this;
+    }
+#endif
+
+    Pipeline & operator=( std::nullptr_t ) VULKAN_HPP_NOEXCEPT
+    {
+      m_pipeline = {};
+      return *this;
+    }
+
+#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )
+    auto operator<=>( Pipeline const & ) const = default;
+#else
+    bool operator==( Pipeline const & rhs ) const VULKAN_HPP_NOEXCEPT
+    {
+      return m_pipeline == rhs.m_pipeline;
+    }
+
+    bool operator!=( Pipeline const & rhs ) const VULKAN_HPP_NOEXCEPT
+    {
+      return m_pipeline != rhs.m_pipeline;
+    }
+
+    bool operator<( Pipeline const & rhs ) const VULKAN_HPP_NOEXCEPT
+    {
+      return m_pipeline < rhs.m_pipeline;
+    }
+#endif
+
+    VULKAN_HPP_TYPESAFE_EXPLICIT operator VkPipeline() const VULKAN_HPP_NOEXCEPT
+    {
+      return m_pipeline;
+    }
+
+    explicit operator bool() const VULKAN_HPP_NOEXCEPT
+    {
+      return m_pipeline != VK_NULL_HANDLE;
+    }
+
+    bool operator!() const VULKAN_HPP_NOEXCEPT
+    {
+      return m_pipeline == VK_NULL_HANDLE;
+    }
+
+  private:
+    VkPipeline m_pipeline = {};
+  };
+  static_assert( sizeof( VULKAN_HPP_NAMESPACE::Pipeline ) == sizeof( VkPipeline ),
+                 "handle and wrapper have different size!" );
+
+  template <>
+  struct VULKAN_HPP_DEPRECATED( "vk::cpp_type is deprecated. Use vk::CppType instead." ) cpp_type<ObjectType::ePipeline>
+  {
+    using type = VULKAN_HPP_NAMESPACE::Pipeline;
+  };
+
+  template <>
+  struct CppType<VULKAN_HPP_NAMESPACE::ObjectType, VULKAN_HPP_NAMESPACE::ObjectType::ePipeline>
+  {
+    using Type = VULKAN_HPP_NAMESPACE::Pipeline;
+  };
+
+  template <>
+  struct CppType<VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT,
+                 VULKAN_HPP_NAMESPACE::DebugReportObjectTypeEXT::ePipeline>
+  {
+    using Type = VULKAN_HPP_NAMESPACE::Pipeline;
+  };
+
+  template <>
+  struct isVulkanHandleType<VULKAN_HPP_NAMESPACE::Pipeline>
+  {
+    static VULKAN_HPP_CONST_OR_CONSTEXPR bool value = true;
+  };
+
   class Image
   {
   public:
@@ -4374,6 +4619,14 @@
     template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>
     void subpassShadingHUAWEI( Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;
 
+    //=== VK_HUAWEI_invocation_mask ===
+
+    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>
+    void
+      bindInvocationMaskHUAWEI( VULKAN_HPP_NAMESPACE::ImageView   imageView,
+                                VULKAN_HPP_NAMESPACE::ImageLayout imageLayout,
+                                Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;
+
     //=== VK_EXT_extended_dynamic_state2 ===
 
     template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>
@@ -10494,6 +10747,23 @@
                            Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;
 #endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/
 
+    //=== VK_KHR_present_wait ===
+
+#ifdef VULKAN_HPP_DISABLE_ENHANCED_MODE
+    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>
+    VULKAN_HPP_NODISCARD Result
+                         waitForPresentKHR( VULKAN_HPP_NAMESPACE::SwapchainKHR swapchain,
+                                            uint64_t                           presentId,
+                                            uint64_t                           timeout,
+                                            Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;
+#else
+    template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>
+    VULKAN_HPP_NODISCARD Result waitForPresentKHR( VULKAN_HPP_NAMESPACE::SwapchainKHR swapchain,
+                                                   uint64_t                           presentId,
+                                                   uint64_t                           timeout,
+                                                   Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;
+#endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/
+
 #if defined( VK_USE_PLATFORM_WIN32_KHR )
     //=== VK_EXT_full_screen_exclusive ===
 
@@ -11108,13 +11378,13 @@
 
     template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>
     VULKAN_HPP_NODISCARD Result
-                         getMemoryRemoteAddressNV( const VULKAN_HPP_NAMESPACE::MemoryGetRemoteAddressInfoNV * getMemoryRemoteAddressInfo,
+                         getMemoryRemoteAddressNV( const VULKAN_HPP_NAMESPACE::MemoryGetRemoteAddressInfoNV * pMemoryGetRemoteAddressInfo,
                                                    VULKAN_HPP_NAMESPACE::RemoteAddressNV *                    pAddress,
                                                    Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;
 #ifndef VULKAN_HPP_DISABLE_ENHANCED_MODE
     template <typename Dispatch = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>
     typename ResultValueType<VULKAN_HPP_NAMESPACE::RemoteAddressNV>::type
-      getMemoryRemoteAddressNV( const MemoryGetRemoteAddressInfoNV & getMemoryRemoteAddressInfo,
+      getMemoryRemoteAddressNV( const MemoryGetRemoteAddressInfoNV & memoryGetRemoteAddressInfo,
                                 Dispatch const & d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) const;
 #endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/
 
diff --git a/third_party/vulkan-deps/vulkan-headers/src/include/vulkan/vulkan_raii.hpp b/third_party/vulkan-deps/vulkan-headers/src/include/vulkan/vulkan_raii.hpp
index 0d939e3..390e527 100644
--- a/third_party/vulkan-deps/vulkan-headers/src/include/vulkan/vulkan_raii.hpp
+++ b/third_party/vulkan-deps/vulkan-headers/src/include/vulkan/vulkan_raii.hpp
@@ -32,29 +32,35 @@
 #  endif
     }
 
-    class ContextDispatcher
+    class ContextDispatcher : public DispatchLoaderBase
     {
     public:
       ContextDispatcher( PFN_vkGetInstanceProcAddr getProcAddr )
         : vkGetInstanceProcAddr( getProcAddr )
+        //=== VK_VERSION_1_0 ===
         , vkCreateInstance( PFN_vkCreateInstance( getProcAddr( NULL, "vkCreateInstance" ) ) )
         , vkEnumerateInstanceExtensionProperties( PFN_vkEnumerateInstanceExtensionProperties(
             getProcAddr( NULL, "vkEnumerateInstanceExtensionProperties" ) ) )
         , vkEnumerateInstanceLayerProperties(
             PFN_vkEnumerateInstanceLayerProperties( getProcAddr( NULL, "vkEnumerateInstanceLayerProperties" ) ) )
+        //=== VK_VERSION_1_1 ===
         , vkEnumerateInstanceVersion(
             PFN_vkEnumerateInstanceVersion( getProcAddr( NULL, "vkEnumerateInstanceVersion" ) ) )
       {}
 
     public:
-      PFN_vkGetInstanceProcAddr                  vkGetInstanceProcAddr                  = 0;
+      PFN_vkGetInstanceProcAddr vkGetInstanceProcAddr = 0;
+
+      //=== VK_VERSION_1_0 ===
       PFN_vkCreateInstance                       vkCreateInstance                       = 0;
       PFN_vkEnumerateInstanceExtensionProperties vkEnumerateInstanceExtensionProperties = 0;
       PFN_vkEnumerateInstanceLayerProperties     vkEnumerateInstanceLayerProperties     = 0;
-      PFN_vkEnumerateInstanceVersion             vkEnumerateInstanceVersion             = 0;
+
+      //=== VK_VERSION_1_1 ===
+      PFN_vkEnumerateInstanceVersion vkEnumerateInstanceVersion = 0;
     };
 
-    class InstanceDispatcher
+    class InstanceDispatcher : public DispatchLoaderBase
     {
     public:
       InstanceDispatcher( PFN_vkGetInstanceProcAddr getProcAddr ) : vkGetInstanceProcAddr( getProcAddr ) {}
@@ -65,438 +71,615 @@
 
       void init( VkInstance instance )
       {
-        vkAcquireDrmDisplayEXT =
-          PFN_vkAcquireDrmDisplayEXT( vkGetInstanceProcAddr( instance, "vkAcquireDrmDisplayEXT" ) );
-#  if defined( VK_USE_PLATFORM_WIN32_KHR )
-        vkAcquireWinrtDisplayNV =
-          PFN_vkAcquireWinrtDisplayNV( vkGetInstanceProcAddr( instance, "vkAcquireWinrtDisplayNV" ) );
-#  endif /*VK_USE_PLATFORM_WIN32_KHR*/
-#  if defined( VK_USE_PLATFORM_XLIB_XRANDR_EXT )
-        vkAcquireXlibDisplayEXT =
-          PFN_vkAcquireXlibDisplayEXT( vkGetInstanceProcAddr( instance, "vkAcquireXlibDisplayEXT" ) );
-#  endif /*VK_USE_PLATFORM_XLIB_XRANDR_EXT*/
-#  if defined( VK_USE_PLATFORM_ANDROID_KHR )
-        vkCreateAndroidSurfaceKHR =
-          PFN_vkCreateAndroidSurfaceKHR( vkGetInstanceProcAddr( instance, "vkCreateAndroidSurfaceKHR" ) );
-#  endif /*VK_USE_PLATFORM_ANDROID_KHR*/
-        vkCreateDebugReportCallbackEXT =
-          PFN_vkCreateDebugReportCallbackEXT( vkGetInstanceProcAddr( instance, "vkCreateDebugReportCallbackEXT" ) );
-        vkCreateDebugUtilsMessengerEXT =
-          PFN_vkCreateDebugUtilsMessengerEXT( vkGetInstanceProcAddr( instance, "vkCreateDebugUtilsMessengerEXT" ) );
-        vkCreateDevice = PFN_vkCreateDevice( vkGetInstanceProcAddr( instance, "vkCreateDevice" ) );
-#  if defined( VK_USE_PLATFORM_DIRECTFB_EXT )
-        vkCreateDirectFBSurfaceEXT =
-          PFN_vkCreateDirectFBSurfaceEXT( vkGetInstanceProcAddr( instance, "vkCreateDirectFBSurfaceEXT" ) );
-#  endif /*VK_USE_PLATFORM_DIRECTFB_EXT*/
-        vkCreateDisplayModeKHR =
-          PFN_vkCreateDisplayModeKHR( vkGetInstanceProcAddr( instance, "vkCreateDisplayModeKHR" ) );
-        vkCreateDisplayPlaneSurfaceKHR =
-          PFN_vkCreateDisplayPlaneSurfaceKHR( vkGetInstanceProcAddr( instance, "vkCreateDisplayPlaneSurfaceKHR" ) );
-        vkCreateHeadlessSurfaceEXT =
-          PFN_vkCreateHeadlessSurfaceEXT( vkGetInstanceProcAddr( instance, "vkCreateHeadlessSurfaceEXT" ) );
-#  if defined( VK_USE_PLATFORM_IOS_MVK )
-        vkCreateIOSSurfaceMVK = PFN_vkCreateIOSSurfaceMVK( vkGetInstanceProcAddr( instance, "vkCreateIOSSurfaceMVK" ) );
-#  endif /*VK_USE_PLATFORM_IOS_MVK*/
-#  if defined( VK_USE_PLATFORM_FUCHSIA )
-        vkCreateImagePipeSurfaceFUCHSIA =
-          PFN_vkCreateImagePipeSurfaceFUCHSIA( vkGetInstanceProcAddr( instance, "vkCreateImagePipeSurfaceFUCHSIA" ) );
-#  endif /*VK_USE_PLATFORM_FUCHSIA*/
-#  if defined( VK_USE_PLATFORM_MACOS_MVK )
-        vkCreateMacOSSurfaceMVK =
-          PFN_vkCreateMacOSSurfaceMVK( vkGetInstanceProcAddr( instance, "vkCreateMacOSSurfaceMVK" ) );
-#  endif /*VK_USE_PLATFORM_MACOS_MVK*/
-#  if defined( VK_USE_PLATFORM_METAL_EXT )
-        vkCreateMetalSurfaceEXT =
-          PFN_vkCreateMetalSurfaceEXT( vkGetInstanceProcAddr( instance, "vkCreateMetalSurfaceEXT" ) );
-#  endif /*VK_USE_PLATFORM_METAL_EXT*/
-#  if defined( VK_USE_PLATFORM_SCREEN_QNX )
-        vkCreateScreenSurfaceQNX =
-          PFN_vkCreateScreenSurfaceQNX( vkGetInstanceProcAddr( instance, "vkCreateScreenSurfaceQNX" ) );
-#  endif /*VK_USE_PLATFORM_SCREEN_QNX*/
-#  if defined( VK_USE_PLATFORM_GGP )
-        vkCreateStreamDescriptorSurfaceGGP = PFN_vkCreateStreamDescriptorSurfaceGGP(
-          vkGetInstanceProcAddr( instance, "vkCreateStreamDescriptorSurfaceGGP" ) );
-#  endif /*VK_USE_PLATFORM_GGP*/
-#  if defined( VK_USE_PLATFORM_VI_NN )
-        vkCreateViSurfaceNN = PFN_vkCreateViSurfaceNN( vkGetInstanceProcAddr( instance, "vkCreateViSurfaceNN" ) );
-#  endif /*VK_USE_PLATFORM_VI_NN*/
-#  if defined( VK_USE_PLATFORM_WAYLAND_KHR )
-        vkCreateWaylandSurfaceKHR =
-          PFN_vkCreateWaylandSurfaceKHR( vkGetInstanceProcAddr( instance, "vkCreateWaylandSurfaceKHR" ) );
-#  endif /*VK_USE_PLATFORM_WAYLAND_KHR*/
-#  if defined( VK_USE_PLATFORM_WIN32_KHR )
-        vkCreateWin32SurfaceKHR =
-          PFN_vkCreateWin32SurfaceKHR( vkGetInstanceProcAddr( instance, "vkCreateWin32SurfaceKHR" ) );
-#  endif /*VK_USE_PLATFORM_WIN32_KHR*/
-#  if defined( VK_USE_PLATFORM_XCB_KHR )
-        vkCreateXcbSurfaceKHR = PFN_vkCreateXcbSurfaceKHR( vkGetInstanceProcAddr( instance, "vkCreateXcbSurfaceKHR" ) );
-#  endif /*VK_USE_PLATFORM_XCB_KHR*/
-#  if defined( VK_USE_PLATFORM_XLIB_KHR )
-        vkCreateXlibSurfaceKHR =
-          PFN_vkCreateXlibSurfaceKHR( vkGetInstanceProcAddr( instance, "vkCreateXlibSurfaceKHR" ) );
-#  endif /*VK_USE_PLATFORM_XLIB_KHR*/
-        vkDebugReportMessageEXT =
-          PFN_vkDebugReportMessageEXT( vkGetInstanceProcAddr( instance, "vkDebugReportMessageEXT" ) );
-        vkDestroyDebugReportCallbackEXT =
-          PFN_vkDestroyDebugReportCallbackEXT( vkGetInstanceProcAddr( instance, "vkDestroyDebugReportCallbackEXT" ) );
-        vkDestroyDebugUtilsMessengerEXT =
-          PFN_vkDestroyDebugUtilsMessengerEXT( vkGetInstanceProcAddr( instance, "vkDestroyDebugUtilsMessengerEXT" ) );
-        vkDestroyInstance   = PFN_vkDestroyInstance( vkGetInstanceProcAddr( instance, "vkDestroyInstance" ) );
-        vkDestroySurfaceKHR = PFN_vkDestroySurfaceKHR( vkGetInstanceProcAddr( instance, "vkDestroySurfaceKHR" ) );
+        //=== VK_VERSION_1_0 ===
+        vkDestroyInstance = PFN_vkDestroyInstance( vkGetInstanceProcAddr( instance, "vkDestroyInstance" ) );
+        vkEnumeratePhysicalDevices =
+          PFN_vkEnumeratePhysicalDevices( vkGetInstanceProcAddr( instance, "vkEnumeratePhysicalDevices" ) );
+        vkGetPhysicalDeviceFeatures =
+          PFN_vkGetPhysicalDeviceFeatures( vkGetInstanceProcAddr( instance, "vkGetPhysicalDeviceFeatures" ) );
+        vkGetPhysicalDeviceFormatProperties = PFN_vkGetPhysicalDeviceFormatProperties(
+          vkGetInstanceProcAddr( instance, "vkGetPhysicalDeviceFormatProperties" ) );
+        vkGetPhysicalDeviceImageFormatProperties = PFN_vkGetPhysicalDeviceImageFormatProperties(
+          vkGetInstanceProcAddr( instance, "vkGetPhysicalDeviceImageFormatProperties" ) );
+        vkGetPhysicalDeviceProperties =
+          PFN_vkGetPhysicalDeviceProperties( vkGetInstanceProcAddr( instance, "vkGetPhysicalDeviceProperties" ) );
+        vkGetPhysicalDeviceQueueFamilyProperties = PFN_vkGetPhysicalDeviceQueueFamilyProperties(
+          vkGetInstanceProcAddr( instance, "vkGetPhysicalDeviceQueueFamilyProperties" ) );
+        vkGetPhysicalDeviceMemoryProperties = PFN_vkGetPhysicalDeviceMemoryProperties(
+          vkGetInstanceProcAddr( instance, "vkGetPhysicalDeviceMemoryProperties" ) );
+        vkGetInstanceProcAddr = PFN_vkGetInstanceProcAddr( vkGetInstanceProcAddr( instance, "vkGetInstanceProcAddr" ) );
+        vkCreateDevice        = PFN_vkCreateDevice( vkGetInstanceProcAddr( instance, "vkCreateDevice" ) );
         vkEnumerateDeviceExtensionProperties = PFN_vkEnumerateDeviceExtensionProperties(
           vkGetInstanceProcAddr( instance, "vkEnumerateDeviceExtensionProperties" ) );
         vkEnumerateDeviceLayerProperties =
           PFN_vkEnumerateDeviceLayerProperties( vkGetInstanceProcAddr( instance, "vkEnumerateDeviceLayerProperties" ) );
+        vkGetPhysicalDeviceSparseImageFormatProperties = PFN_vkGetPhysicalDeviceSparseImageFormatProperties(
+          vkGetInstanceProcAddr( instance, "vkGetPhysicalDeviceSparseImageFormatProperties" ) );
+
+        //=== VK_VERSION_1_1 ===
         vkEnumeratePhysicalDeviceGroups =
           PFN_vkEnumeratePhysicalDeviceGroups( vkGetInstanceProcAddr( instance, "vkEnumeratePhysicalDeviceGroups" ) );
+        vkGetPhysicalDeviceFeatures2 =
+          PFN_vkGetPhysicalDeviceFeatures2( vkGetInstanceProcAddr( instance, "vkGetPhysicalDeviceFeatures2" ) );
+        vkGetPhysicalDeviceProperties2 =
+          PFN_vkGetPhysicalDeviceProperties2( vkGetInstanceProcAddr( instance, "vkGetPhysicalDeviceProperties2" ) );
+        vkGetPhysicalDeviceFormatProperties2 = PFN_vkGetPhysicalDeviceFormatProperties2(
+          vkGetInstanceProcAddr( instance, "vkGetPhysicalDeviceFormatProperties2" ) );
+        vkGetPhysicalDeviceImageFormatProperties2 = PFN_vkGetPhysicalDeviceImageFormatProperties2(
+          vkGetInstanceProcAddr( instance, "vkGetPhysicalDeviceImageFormatProperties2" ) );
+        vkGetPhysicalDeviceQueueFamilyProperties2 = PFN_vkGetPhysicalDeviceQueueFamilyProperties2(
+          vkGetInstanceProcAddr( instance, "vkGetPhysicalDeviceQueueFamilyProperties2" ) );
+        vkGetPhysicalDeviceMemoryProperties2 = PFN_vkGetPhysicalDeviceMemoryProperties2(
+          vkGetInstanceProcAddr( instance, "vkGetPhysicalDeviceMemoryProperties2" ) );
+        vkGetPhysicalDeviceSparseImageFormatProperties2 = PFN_vkGetPhysicalDeviceSparseImageFormatProperties2(
+          vkGetInstanceProcAddr( instance, "vkGetPhysicalDeviceSparseImageFormatProperties2" ) );
+        vkGetPhysicalDeviceExternalBufferProperties = PFN_vkGetPhysicalDeviceExternalBufferProperties(
+          vkGetInstanceProcAddr( instance, "vkGetPhysicalDeviceExternalBufferProperties" ) );
+        vkGetPhysicalDeviceExternalFenceProperties = PFN_vkGetPhysicalDeviceExternalFenceProperties(
+          vkGetInstanceProcAddr( instance, "vkGetPhysicalDeviceExternalFenceProperties" ) );
+        vkGetPhysicalDeviceExternalSemaphoreProperties = PFN_vkGetPhysicalDeviceExternalSemaphoreProperties(
+          vkGetInstanceProcAddr( instance, "vkGetPhysicalDeviceExternalSemaphoreProperties" ) );
+
+        //=== VK_EXT_acquire_drm_display ===
+        vkAcquireDrmDisplayEXT =
+          PFN_vkAcquireDrmDisplayEXT( vkGetInstanceProcAddr( instance, "vkAcquireDrmDisplayEXT" ) );
+        vkGetDrmDisplayEXT = PFN_vkGetDrmDisplayEXT( vkGetInstanceProcAddr( instance, "vkGetDrmDisplayEXT" ) );
+
+#  if defined( VK_USE_PLATFORM_XLIB_XRANDR_EXT )
+        //=== VK_EXT_acquire_xlib_display ===
+        vkAcquireXlibDisplayEXT =
+          PFN_vkAcquireXlibDisplayEXT( vkGetInstanceProcAddr( instance, "vkAcquireXlibDisplayEXT" ) );
+        vkGetRandROutputDisplayEXT =
+          PFN_vkGetRandROutputDisplayEXT( vkGetInstanceProcAddr( instance, "vkGetRandROutputDisplayEXT" ) );
+#  endif /*VK_USE_PLATFORM_XLIB_XRANDR_EXT*/
+
+        //=== VK_EXT_calibrated_timestamps ===
+        vkGetPhysicalDeviceCalibrateableTimeDomainsEXT = PFN_vkGetPhysicalDeviceCalibrateableTimeDomainsEXT(
+          vkGetInstanceProcAddr( instance, "vkGetPhysicalDeviceCalibrateableTimeDomainsEXT" ) );
+
+        //=== VK_EXT_debug_report ===
+        vkCreateDebugReportCallbackEXT =
+          PFN_vkCreateDebugReportCallbackEXT( vkGetInstanceProcAddr( instance, "vkCreateDebugReportCallbackEXT" ) );
+        vkDestroyDebugReportCallbackEXT =
+          PFN_vkDestroyDebugReportCallbackEXT( vkGetInstanceProcAddr( instance, "vkDestroyDebugReportCallbackEXT" ) );
+        vkDebugReportMessageEXT =
+          PFN_vkDebugReportMessageEXT( vkGetInstanceProcAddr( instance, "vkDebugReportMessageEXT" ) );
+
+        //=== VK_EXT_debug_utils ===
+        vkCreateDebugUtilsMessengerEXT =
+          PFN_vkCreateDebugUtilsMessengerEXT( vkGetInstanceProcAddr( instance, "vkCreateDebugUtilsMessengerEXT" ) );
+        vkDestroyDebugUtilsMessengerEXT =
+          PFN_vkDestroyDebugUtilsMessengerEXT( vkGetInstanceProcAddr( instance, "vkDestroyDebugUtilsMessengerEXT" ) );
+        vkSubmitDebugUtilsMessageEXT =
+          PFN_vkSubmitDebugUtilsMessageEXT( vkGetInstanceProcAddr( instance, "vkSubmitDebugUtilsMessageEXT" ) );
+
+        //=== VK_EXT_direct_mode_display ===
+        vkReleaseDisplayEXT = PFN_vkReleaseDisplayEXT( vkGetInstanceProcAddr( instance, "vkReleaseDisplayEXT" ) );
+
+#  if defined( VK_USE_PLATFORM_DIRECTFB_EXT )
+        //=== VK_EXT_directfb_surface ===
+        vkCreateDirectFBSurfaceEXT =
+          PFN_vkCreateDirectFBSurfaceEXT( vkGetInstanceProcAddr( instance, "vkCreateDirectFBSurfaceEXT" ) );
+        vkGetPhysicalDeviceDirectFBPresentationSupportEXT = PFN_vkGetPhysicalDeviceDirectFBPresentationSupportEXT(
+          vkGetInstanceProcAddr( instance, "vkGetPhysicalDeviceDirectFBPresentationSupportEXT" ) );
+#  endif /*VK_USE_PLATFORM_DIRECTFB_EXT*/
+
+        //=== VK_EXT_display_surface_counter ===
+        vkGetPhysicalDeviceSurfaceCapabilities2EXT = PFN_vkGetPhysicalDeviceSurfaceCapabilities2EXT(
+          vkGetInstanceProcAddr( instance, "vkGetPhysicalDeviceSurfaceCapabilities2EXT" ) );
+
+#  if defined( VK_USE_PLATFORM_WIN32_KHR )
+        //=== VK_EXT_full_screen_exclusive ===
+        vkGetPhysicalDeviceSurfacePresentModes2EXT = PFN_vkGetPhysicalDeviceSurfacePresentModes2EXT(
+          vkGetInstanceProcAddr( instance, "vkGetPhysicalDeviceSurfacePresentModes2EXT" ) );
+#  endif /*VK_USE_PLATFORM_WIN32_KHR*/
+
+        //=== VK_EXT_headless_surface ===
+        vkCreateHeadlessSurfaceEXT =
+          PFN_vkCreateHeadlessSurfaceEXT( vkGetInstanceProcAddr( instance, "vkCreateHeadlessSurfaceEXT" ) );
+
+#  if defined( VK_USE_PLATFORM_METAL_EXT )
+        //=== VK_EXT_metal_surface ===
+        vkCreateMetalSurfaceEXT =
+          PFN_vkCreateMetalSurfaceEXT( vkGetInstanceProcAddr( instance, "vkCreateMetalSurfaceEXT" ) );
+#  endif /*VK_USE_PLATFORM_METAL_EXT*/
+
+        //=== VK_EXT_sample_locations ===
+        vkGetPhysicalDeviceMultisamplePropertiesEXT = PFN_vkGetPhysicalDeviceMultisamplePropertiesEXT(
+          vkGetInstanceProcAddr( instance, "vkGetPhysicalDeviceMultisamplePropertiesEXT" ) );
+
+        //=== VK_EXT_tooling_info ===
+        vkGetPhysicalDeviceToolPropertiesEXT = PFN_vkGetPhysicalDeviceToolPropertiesEXT(
+          vkGetInstanceProcAddr( instance, "vkGetPhysicalDeviceToolPropertiesEXT" ) );
+
+#  if defined( VK_USE_PLATFORM_FUCHSIA )
+        //=== VK_FUCHSIA_imagepipe_surface ===
+        vkCreateImagePipeSurfaceFUCHSIA =
+          PFN_vkCreateImagePipeSurfaceFUCHSIA( vkGetInstanceProcAddr( instance, "vkCreateImagePipeSurfaceFUCHSIA" ) );
+#  endif /*VK_USE_PLATFORM_FUCHSIA*/
+
+#  if defined( VK_USE_PLATFORM_GGP )
+        //=== VK_GGP_stream_descriptor_surface ===
+        vkCreateStreamDescriptorSurfaceGGP = PFN_vkCreateStreamDescriptorSurfaceGGP(
+          vkGetInstanceProcAddr( instance, "vkCreateStreamDescriptorSurfaceGGP" ) );
+#  endif /*VK_USE_PLATFORM_GGP*/
+
+#  if defined( VK_USE_PLATFORM_ANDROID_KHR )
+        //=== VK_KHR_android_surface ===
+        vkCreateAndroidSurfaceKHR =
+          PFN_vkCreateAndroidSurfaceKHR( vkGetInstanceProcAddr( instance, "vkCreateAndroidSurfaceKHR" ) );
+#  endif /*VK_USE_PLATFORM_ANDROID_KHR*/
+
+        //=== VK_KHR_device_group ===
+        vkGetPhysicalDevicePresentRectanglesKHR = PFN_vkGetPhysicalDevicePresentRectanglesKHR(
+          vkGetInstanceProcAddr( instance, "vkGetPhysicalDevicePresentRectanglesKHR" ) );
+
+        //=== VK_KHR_device_group_creation ===
         vkEnumeratePhysicalDeviceGroupsKHR = PFN_vkEnumeratePhysicalDeviceGroupsKHR(
           vkGetInstanceProcAddr( instance, "vkEnumeratePhysicalDeviceGroupsKHR" ) );
         if ( !vkEnumeratePhysicalDeviceGroups )
           vkEnumeratePhysicalDeviceGroups = vkEnumeratePhysicalDeviceGroupsKHR;
-        vkEnumeratePhysicalDeviceQueueFamilyPerformanceQueryCountersKHR =
-          PFN_vkEnumeratePhysicalDeviceQueueFamilyPerformanceQueryCountersKHR(
-            vkGetInstanceProcAddr( instance, "vkEnumeratePhysicalDeviceQueueFamilyPerformanceQueryCountersKHR" ) );
-        vkEnumeratePhysicalDevices =
-          PFN_vkEnumeratePhysicalDevices( vkGetInstanceProcAddr( instance, "vkEnumeratePhysicalDevices" ) );
-        vkGetDisplayModeProperties2KHR =
-          PFN_vkGetDisplayModeProperties2KHR( vkGetInstanceProcAddr( instance, "vkGetDisplayModeProperties2KHR" ) );
-        vkGetDisplayModePropertiesKHR =
-          PFN_vkGetDisplayModePropertiesKHR( vkGetInstanceProcAddr( instance, "vkGetDisplayModePropertiesKHR" ) );
-        vkGetDisplayPlaneCapabilities2KHR = PFN_vkGetDisplayPlaneCapabilities2KHR(
-          vkGetInstanceProcAddr( instance, "vkGetDisplayPlaneCapabilities2KHR" ) );
-        vkGetDisplayPlaneCapabilitiesKHR =
-          PFN_vkGetDisplayPlaneCapabilitiesKHR( vkGetInstanceProcAddr( instance, "vkGetDisplayPlaneCapabilitiesKHR" ) );
-        vkGetDisplayPlaneSupportedDisplaysKHR = PFN_vkGetDisplayPlaneSupportedDisplaysKHR(
-          vkGetInstanceProcAddr( instance, "vkGetDisplayPlaneSupportedDisplaysKHR" ) );
-        vkGetDrmDisplayEXT    = PFN_vkGetDrmDisplayEXT( vkGetInstanceProcAddr( instance, "vkGetDrmDisplayEXT" ) );
-        vkGetInstanceProcAddr = PFN_vkGetInstanceProcAddr( vkGetInstanceProcAddr( instance, "vkGetInstanceProcAddr" ) );
-        vkGetPhysicalDeviceCalibrateableTimeDomainsEXT = PFN_vkGetPhysicalDeviceCalibrateableTimeDomainsEXT(
-          vkGetInstanceProcAddr( instance, "vkGetPhysicalDeviceCalibrateableTimeDomainsEXT" ) );
-        vkGetPhysicalDeviceCooperativeMatrixPropertiesNV = PFN_vkGetPhysicalDeviceCooperativeMatrixPropertiesNV(
-          vkGetInstanceProcAddr( instance, "vkGetPhysicalDeviceCooperativeMatrixPropertiesNV" ) );
-#  if defined( VK_USE_PLATFORM_DIRECTFB_EXT )
-        vkGetPhysicalDeviceDirectFBPresentationSupportEXT = PFN_vkGetPhysicalDeviceDirectFBPresentationSupportEXT(
-          vkGetInstanceProcAddr( instance, "vkGetPhysicalDeviceDirectFBPresentationSupportEXT" ) );
-#  endif /*VK_USE_PLATFORM_DIRECTFB_EXT*/
-        vkGetPhysicalDeviceDisplayPlaneProperties2KHR = PFN_vkGetPhysicalDeviceDisplayPlaneProperties2KHR(
-          vkGetInstanceProcAddr( instance, "vkGetPhysicalDeviceDisplayPlaneProperties2KHR" ) );
-        vkGetPhysicalDeviceDisplayPlanePropertiesKHR = PFN_vkGetPhysicalDeviceDisplayPlanePropertiesKHR(
-          vkGetInstanceProcAddr( instance, "vkGetPhysicalDeviceDisplayPlanePropertiesKHR" ) );
-        vkGetPhysicalDeviceDisplayProperties2KHR = PFN_vkGetPhysicalDeviceDisplayProperties2KHR(
-          vkGetInstanceProcAddr( instance, "vkGetPhysicalDeviceDisplayProperties2KHR" ) );
+
+        //=== VK_KHR_display ===
         vkGetPhysicalDeviceDisplayPropertiesKHR = PFN_vkGetPhysicalDeviceDisplayPropertiesKHR(
           vkGetInstanceProcAddr( instance, "vkGetPhysicalDeviceDisplayPropertiesKHR" ) );
-        vkGetPhysicalDeviceExternalBufferProperties = PFN_vkGetPhysicalDeviceExternalBufferProperties(
-          vkGetInstanceProcAddr( instance, "vkGetPhysicalDeviceExternalBufferProperties" ) );
-        vkGetPhysicalDeviceExternalBufferPropertiesKHR = PFN_vkGetPhysicalDeviceExternalBufferPropertiesKHR(
-          vkGetInstanceProcAddr( instance, "vkGetPhysicalDeviceExternalBufferPropertiesKHR" ) );
-        if ( !vkGetPhysicalDeviceExternalBufferProperties )
-          vkGetPhysicalDeviceExternalBufferProperties = vkGetPhysicalDeviceExternalBufferPropertiesKHR;
-        vkGetPhysicalDeviceExternalFenceProperties = PFN_vkGetPhysicalDeviceExternalFenceProperties(
-          vkGetInstanceProcAddr( instance, "vkGetPhysicalDeviceExternalFenceProperties" ) );
+        vkGetPhysicalDeviceDisplayPlanePropertiesKHR = PFN_vkGetPhysicalDeviceDisplayPlanePropertiesKHR(
+          vkGetInstanceProcAddr( instance, "vkGetPhysicalDeviceDisplayPlanePropertiesKHR" ) );
+        vkGetDisplayPlaneSupportedDisplaysKHR = PFN_vkGetDisplayPlaneSupportedDisplaysKHR(
+          vkGetInstanceProcAddr( instance, "vkGetDisplayPlaneSupportedDisplaysKHR" ) );
+        vkGetDisplayModePropertiesKHR =
+          PFN_vkGetDisplayModePropertiesKHR( vkGetInstanceProcAddr( instance, "vkGetDisplayModePropertiesKHR" ) );
+        vkCreateDisplayModeKHR =
+          PFN_vkCreateDisplayModeKHR( vkGetInstanceProcAddr( instance, "vkCreateDisplayModeKHR" ) );
+        vkGetDisplayPlaneCapabilitiesKHR =
+          PFN_vkGetDisplayPlaneCapabilitiesKHR( vkGetInstanceProcAddr( instance, "vkGetDisplayPlaneCapabilitiesKHR" ) );
+        vkCreateDisplayPlaneSurfaceKHR =
+          PFN_vkCreateDisplayPlaneSurfaceKHR( vkGetInstanceProcAddr( instance, "vkCreateDisplayPlaneSurfaceKHR" ) );
+
+        //=== VK_KHR_external_fence_capabilities ===
         vkGetPhysicalDeviceExternalFencePropertiesKHR = PFN_vkGetPhysicalDeviceExternalFencePropertiesKHR(
           vkGetInstanceProcAddr( instance, "vkGetPhysicalDeviceExternalFencePropertiesKHR" ) );
         if ( !vkGetPhysicalDeviceExternalFenceProperties )
           vkGetPhysicalDeviceExternalFenceProperties = vkGetPhysicalDeviceExternalFencePropertiesKHR;
-        vkGetPhysicalDeviceExternalImageFormatPropertiesNV = PFN_vkGetPhysicalDeviceExternalImageFormatPropertiesNV(
-          vkGetInstanceProcAddr( instance, "vkGetPhysicalDeviceExternalImageFormatPropertiesNV" ) );
-        vkGetPhysicalDeviceExternalSemaphoreProperties = PFN_vkGetPhysicalDeviceExternalSemaphoreProperties(
-          vkGetInstanceProcAddr( instance, "vkGetPhysicalDeviceExternalSemaphoreProperties" ) );
+
+        //=== VK_KHR_external_memory_capabilities ===
+        vkGetPhysicalDeviceExternalBufferPropertiesKHR = PFN_vkGetPhysicalDeviceExternalBufferPropertiesKHR(
+          vkGetInstanceProcAddr( instance, "vkGetPhysicalDeviceExternalBufferPropertiesKHR" ) );
+        if ( !vkGetPhysicalDeviceExternalBufferProperties )
+          vkGetPhysicalDeviceExternalBufferProperties = vkGetPhysicalDeviceExternalBufferPropertiesKHR;
+
+        //=== VK_KHR_external_semaphore_capabilities ===
         vkGetPhysicalDeviceExternalSemaphorePropertiesKHR = PFN_vkGetPhysicalDeviceExternalSemaphorePropertiesKHR(
           vkGetInstanceProcAddr( instance, "vkGetPhysicalDeviceExternalSemaphorePropertiesKHR" ) );
         if ( !vkGetPhysicalDeviceExternalSemaphoreProperties )
           vkGetPhysicalDeviceExternalSemaphoreProperties = vkGetPhysicalDeviceExternalSemaphorePropertiesKHR;
-        vkGetPhysicalDeviceFeatures =
-          PFN_vkGetPhysicalDeviceFeatures( vkGetInstanceProcAddr( instance, "vkGetPhysicalDeviceFeatures" ) );
-        vkGetPhysicalDeviceFeatures2 =
-          PFN_vkGetPhysicalDeviceFeatures2( vkGetInstanceProcAddr( instance, "vkGetPhysicalDeviceFeatures2" ) );
+
+        //=== VK_KHR_fragment_shading_rate ===
+        vkGetPhysicalDeviceFragmentShadingRatesKHR = PFN_vkGetPhysicalDeviceFragmentShadingRatesKHR(
+          vkGetInstanceProcAddr( instance, "vkGetPhysicalDeviceFragmentShadingRatesKHR" ) );
+
+        //=== VK_KHR_get_display_properties2 ===
+        vkGetPhysicalDeviceDisplayProperties2KHR = PFN_vkGetPhysicalDeviceDisplayProperties2KHR(
+          vkGetInstanceProcAddr( instance, "vkGetPhysicalDeviceDisplayProperties2KHR" ) );
+        vkGetPhysicalDeviceDisplayPlaneProperties2KHR = PFN_vkGetPhysicalDeviceDisplayPlaneProperties2KHR(
+          vkGetInstanceProcAddr( instance, "vkGetPhysicalDeviceDisplayPlaneProperties2KHR" ) );
+        vkGetDisplayModeProperties2KHR =
+          PFN_vkGetDisplayModeProperties2KHR( vkGetInstanceProcAddr( instance, "vkGetDisplayModeProperties2KHR" ) );
+        vkGetDisplayPlaneCapabilities2KHR = PFN_vkGetDisplayPlaneCapabilities2KHR(
+          vkGetInstanceProcAddr( instance, "vkGetDisplayPlaneCapabilities2KHR" ) );
+
+        //=== VK_KHR_get_physical_device_properties2 ===
         vkGetPhysicalDeviceFeatures2KHR =
           PFN_vkGetPhysicalDeviceFeatures2KHR( vkGetInstanceProcAddr( instance, "vkGetPhysicalDeviceFeatures2KHR" ) );
         if ( !vkGetPhysicalDeviceFeatures2 )
           vkGetPhysicalDeviceFeatures2 = vkGetPhysicalDeviceFeatures2KHR;
-        vkGetPhysicalDeviceFormatProperties = PFN_vkGetPhysicalDeviceFormatProperties(
-          vkGetInstanceProcAddr( instance, "vkGetPhysicalDeviceFormatProperties" ) );
-        vkGetPhysicalDeviceFormatProperties2 = PFN_vkGetPhysicalDeviceFormatProperties2(
-          vkGetInstanceProcAddr( instance, "vkGetPhysicalDeviceFormatProperties2" ) );
-        vkGetPhysicalDeviceFormatProperties2KHR = PFN_vkGetPhysicalDeviceFormatProperties2KHR(
-          vkGetInstanceProcAddr( instance, "vkGetPhysicalDeviceFormatProperties2KHR" ) );
-        if ( !vkGetPhysicalDeviceFormatProperties2 )
-          vkGetPhysicalDeviceFormatProperties2 = vkGetPhysicalDeviceFormatProperties2KHR;
-        vkGetPhysicalDeviceFragmentShadingRatesKHR = PFN_vkGetPhysicalDeviceFragmentShadingRatesKHR(
-          vkGetInstanceProcAddr( instance, "vkGetPhysicalDeviceFragmentShadingRatesKHR" ) );
-        vkGetPhysicalDeviceImageFormatProperties = PFN_vkGetPhysicalDeviceImageFormatProperties(
-          vkGetInstanceProcAddr( instance, "vkGetPhysicalDeviceImageFormatProperties" ) );
-        vkGetPhysicalDeviceImageFormatProperties2 = PFN_vkGetPhysicalDeviceImageFormatProperties2(
-          vkGetInstanceProcAddr( instance, "vkGetPhysicalDeviceImageFormatProperties2" ) );
-        vkGetPhysicalDeviceImageFormatProperties2KHR = PFN_vkGetPhysicalDeviceImageFormatProperties2KHR(
-          vkGetInstanceProcAddr( instance, "vkGetPhysicalDeviceImageFormatProperties2KHR" ) );
-        if ( !vkGetPhysicalDeviceImageFormatProperties2 )
-          vkGetPhysicalDeviceImageFormatProperties2 = vkGetPhysicalDeviceImageFormatProperties2KHR;
-        vkGetPhysicalDeviceMemoryProperties = PFN_vkGetPhysicalDeviceMemoryProperties(
-          vkGetInstanceProcAddr( instance, "vkGetPhysicalDeviceMemoryProperties" ) );
-        vkGetPhysicalDeviceMemoryProperties2 = PFN_vkGetPhysicalDeviceMemoryProperties2(
-          vkGetInstanceProcAddr( instance, "vkGetPhysicalDeviceMemoryProperties2" ) );
-        vkGetPhysicalDeviceMemoryProperties2KHR = PFN_vkGetPhysicalDeviceMemoryProperties2KHR(
-          vkGetInstanceProcAddr( instance, "vkGetPhysicalDeviceMemoryProperties2KHR" ) );
-        if ( !vkGetPhysicalDeviceMemoryProperties2 )
-          vkGetPhysicalDeviceMemoryProperties2 = vkGetPhysicalDeviceMemoryProperties2KHR;
-        vkGetPhysicalDeviceMultisamplePropertiesEXT = PFN_vkGetPhysicalDeviceMultisamplePropertiesEXT(
-          vkGetInstanceProcAddr( instance, "vkGetPhysicalDeviceMultisamplePropertiesEXT" ) );
-        vkGetPhysicalDevicePresentRectanglesKHR = PFN_vkGetPhysicalDevicePresentRectanglesKHR(
-          vkGetInstanceProcAddr( instance, "vkGetPhysicalDevicePresentRectanglesKHR" ) );
-        vkGetPhysicalDeviceProperties =
-          PFN_vkGetPhysicalDeviceProperties( vkGetInstanceProcAddr( instance, "vkGetPhysicalDeviceProperties" ) );
-        vkGetPhysicalDeviceProperties2 =
-          PFN_vkGetPhysicalDeviceProperties2( vkGetInstanceProcAddr( instance, "vkGetPhysicalDeviceProperties2" ) );
         vkGetPhysicalDeviceProperties2KHR = PFN_vkGetPhysicalDeviceProperties2KHR(
           vkGetInstanceProcAddr( instance, "vkGetPhysicalDeviceProperties2KHR" ) );
         if ( !vkGetPhysicalDeviceProperties2 )
           vkGetPhysicalDeviceProperties2 = vkGetPhysicalDeviceProperties2KHR;
-        vkGetPhysicalDeviceQueueFamilyPerformanceQueryPassesKHR =
-          PFN_vkGetPhysicalDeviceQueueFamilyPerformanceQueryPassesKHR(
-            vkGetInstanceProcAddr( instance, "vkGetPhysicalDeviceQueueFamilyPerformanceQueryPassesKHR" ) );
-        vkGetPhysicalDeviceQueueFamilyProperties = PFN_vkGetPhysicalDeviceQueueFamilyProperties(
-          vkGetInstanceProcAddr( instance, "vkGetPhysicalDeviceQueueFamilyProperties" ) );
-        vkGetPhysicalDeviceQueueFamilyProperties2 = PFN_vkGetPhysicalDeviceQueueFamilyProperties2(
-          vkGetInstanceProcAddr( instance, "vkGetPhysicalDeviceQueueFamilyProperties2" ) );
+        vkGetPhysicalDeviceFormatProperties2KHR = PFN_vkGetPhysicalDeviceFormatProperties2KHR(
+          vkGetInstanceProcAddr( instance, "vkGetPhysicalDeviceFormatProperties2KHR" ) );
+        if ( !vkGetPhysicalDeviceFormatProperties2 )
+          vkGetPhysicalDeviceFormatProperties2 = vkGetPhysicalDeviceFormatProperties2KHR;
+        vkGetPhysicalDeviceImageFormatProperties2KHR = PFN_vkGetPhysicalDeviceImageFormatProperties2KHR(
+          vkGetInstanceProcAddr( instance, "vkGetPhysicalDeviceImageFormatProperties2KHR" ) );
+        if ( !vkGetPhysicalDeviceImageFormatProperties2 )
+          vkGetPhysicalDeviceImageFormatProperties2 = vkGetPhysicalDeviceImageFormatProperties2KHR;
         vkGetPhysicalDeviceQueueFamilyProperties2KHR = PFN_vkGetPhysicalDeviceQueueFamilyProperties2KHR(
           vkGetInstanceProcAddr( instance, "vkGetPhysicalDeviceQueueFamilyProperties2KHR" ) );
         if ( !vkGetPhysicalDeviceQueueFamilyProperties2 )
           vkGetPhysicalDeviceQueueFamilyProperties2 = vkGetPhysicalDeviceQueueFamilyProperties2KHR;
-#  if defined( VK_USE_PLATFORM_SCREEN_QNX )
-        vkGetPhysicalDeviceScreenPresentationSupportQNX = PFN_vkGetPhysicalDeviceScreenPresentationSupportQNX(
-          vkGetInstanceProcAddr( instance, "vkGetPhysicalDeviceScreenPresentationSupportQNX" ) );
-#  endif /*VK_USE_PLATFORM_SCREEN_QNX*/
-        vkGetPhysicalDeviceSparseImageFormatProperties = PFN_vkGetPhysicalDeviceSparseImageFormatProperties(
-          vkGetInstanceProcAddr( instance, "vkGetPhysicalDeviceSparseImageFormatProperties" ) );
-        vkGetPhysicalDeviceSparseImageFormatProperties2 = PFN_vkGetPhysicalDeviceSparseImageFormatProperties2(
-          vkGetInstanceProcAddr( instance, "vkGetPhysicalDeviceSparseImageFormatProperties2" ) );
+        vkGetPhysicalDeviceMemoryProperties2KHR = PFN_vkGetPhysicalDeviceMemoryProperties2KHR(
+          vkGetInstanceProcAddr( instance, "vkGetPhysicalDeviceMemoryProperties2KHR" ) );
+        if ( !vkGetPhysicalDeviceMemoryProperties2 )
+          vkGetPhysicalDeviceMemoryProperties2 = vkGetPhysicalDeviceMemoryProperties2KHR;
         vkGetPhysicalDeviceSparseImageFormatProperties2KHR = PFN_vkGetPhysicalDeviceSparseImageFormatProperties2KHR(
           vkGetInstanceProcAddr( instance, "vkGetPhysicalDeviceSparseImageFormatProperties2KHR" ) );
         if ( !vkGetPhysicalDeviceSparseImageFormatProperties2 )
           vkGetPhysicalDeviceSparseImageFormatProperties2 = vkGetPhysicalDeviceSparseImageFormatProperties2KHR;
-        vkGetPhysicalDeviceSupportedFramebufferMixedSamplesCombinationsNV =
-          PFN_vkGetPhysicalDeviceSupportedFramebufferMixedSamplesCombinationsNV(
-            vkGetInstanceProcAddr( instance, "vkGetPhysicalDeviceSupportedFramebufferMixedSamplesCombinationsNV" ) );
-        vkGetPhysicalDeviceSurfaceCapabilities2EXT = PFN_vkGetPhysicalDeviceSurfaceCapabilities2EXT(
-          vkGetInstanceProcAddr( instance, "vkGetPhysicalDeviceSurfaceCapabilities2EXT" ) );
+
+        //=== VK_KHR_get_surface_capabilities2 ===
         vkGetPhysicalDeviceSurfaceCapabilities2KHR = PFN_vkGetPhysicalDeviceSurfaceCapabilities2KHR(
           vkGetInstanceProcAddr( instance, "vkGetPhysicalDeviceSurfaceCapabilities2KHR" ) );
-        vkGetPhysicalDeviceSurfaceCapabilitiesKHR = PFN_vkGetPhysicalDeviceSurfaceCapabilitiesKHR(
-          vkGetInstanceProcAddr( instance, "vkGetPhysicalDeviceSurfaceCapabilitiesKHR" ) );
         vkGetPhysicalDeviceSurfaceFormats2KHR = PFN_vkGetPhysicalDeviceSurfaceFormats2KHR(
           vkGetInstanceProcAddr( instance, "vkGetPhysicalDeviceSurfaceFormats2KHR" ) );
-        vkGetPhysicalDeviceSurfaceFormatsKHR = PFN_vkGetPhysicalDeviceSurfaceFormatsKHR(
-          vkGetInstanceProcAddr( instance, "vkGetPhysicalDeviceSurfaceFormatsKHR" ) );
-#  if defined( VK_USE_PLATFORM_WIN32_KHR )
-        vkGetPhysicalDeviceSurfacePresentModes2EXT = PFN_vkGetPhysicalDeviceSurfacePresentModes2EXT(
-          vkGetInstanceProcAddr( instance, "vkGetPhysicalDeviceSurfacePresentModes2EXT" ) );
-#  endif /*VK_USE_PLATFORM_WIN32_KHR*/
-        vkGetPhysicalDeviceSurfacePresentModesKHR = PFN_vkGetPhysicalDeviceSurfacePresentModesKHR(
-          vkGetInstanceProcAddr( instance, "vkGetPhysicalDeviceSurfacePresentModesKHR" ) );
+
+        //=== VK_KHR_performance_query ===
+        vkEnumeratePhysicalDeviceQueueFamilyPerformanceQueryCountersKHR =
+          PFN_vkEnumeratePhysicalDeviceQueueFamilyPerformanceQueryCountersKHR(
+            vkGetInstanceProcAddr( instance, "vkEnumeratePhysicalDeviceQueueFamilyPerformanceQueryCountersKHR" ) );
+        vkGetPhysicalDeviceQueueFamilyPerformanceQueryPassesKHR =
+          PFN_vkGetPhysicalDeviceQueueFamilyPerformanceQueryPassesKHR(
+            vkGetInstanceProcAddr( instance, "vkGetPhysicalDeviceQueueFamilyPerformanceQueryPassesKHR" ) );
+
+        //=== VK_KHR_surface ===
+        vkDestroySurfaceKHR = PFN_vkDestroySurfaceKHR( vkGetInstanceProcAddr( instance, "vkDestroySurfaceKHR" ) );
         vkGetPhysicalDeviceSurfaceSupportKHR = PFN_vkGetPhysicalDeviceSurfaceSupportKHR(
           vkGetInstanceProcAddr( instance, "vkGetPhysicalDeviceSurfaceSupportKHR" ) );
-        vkGetPhysicalDeviceToolPropertiesEXT = PFN_vkGetPhysicalDeviceToolPropertiesEXT(
-          vkGetInstanceProcAddr( instance, "vkGetPhysicalDeviceToolPropertiesEXT" ) );
+        vkGetPhysicalDeviceSurfaceCapabilitiesKHR = PFN_vkGetPhysicalDeviceSurfaceCapabilitiesKHR(
+          vkGetInstanceProcAddr( instance, "vkGetPhysicalDeviceSurfaceCapabilitiesKHR" ) );
+        vkGetPhysicalDeviceSurfaceFormatsKHR = PFN_vkGetPhysicalDeviceSurfaceFormatsKHR(
+          vkGetInstanceProcAddr( instance, "vkGetPhysicalDeviceSurfaceFormatsKHR" ) );
+        vkGetPhysicalDeviceSurfacePresentModesKHR = PFN_vkGetPhysicalDeviceSurfacePresentModesKHR(
+          vkGetInstanceProcAddr( instance, "vkGetPhysicalDeviceSurfacePresentModesKHR" ) );
+
 #  if defined( VK_ENABLE_BETA_EXTENSIONS )
+        //=== VK_KHR_video_queue ===
         vkGetPhysicalDeviceVideoCapabilitiesKHR = PFN_vkGetPhysicalDeviceVideoCapabilitiesKHR(
           vkGetInstanceProcAddr( instance, "vkGetPhysicalDeviceVideoCapabilitiesKHR" ) );
-#  endif /*VK_ENABLE_BETA_EXTENSIONS*/
-#  if defined( VK_ENABLE_BETA_EXTENSIONS )
         vkGetPhysicalDeviceVideoFormatPropertiesKHR = PFN_vkGetPhysicalDeviceVideoFormatPropertiesKHR(
           vkGetInstanceProcAddr( instance, "vkGetPhysicalDeviceVideoFormatPropertiesKHR" ) );
 #  endif /*VK_ENABLE_BETA_EXTENSIONS*/
+
 #  if defined( VK_USE_PLATFORM_WAYLAND_KHR )
+        //=== VK_KHR_wayland_surface ===
+        vkCreateWaylandSurfaceKHR =
+          PFN_vkCreateWaylandSurfaceKHR( vkGetInstanceProcAddr( instance, "vkCreateWaylandSurfaceKHR" ) );
         vkGetPhysicalDeviceWaylandPresentationSupportKHR = PFN_vkGetPhysicalDeviceWaylandPresentationSupportKHR(
           vkGetInstanceProcAddr( instance, "vkGetPhysicalDeviceWaylandPresentationSupportKHR" ) );
 #  endif /*VK_USE_PLATFORM_WAYLAND_KHR*/
+
 #  if defined( VK_USE_PLATFORM_WIN32_KHR )
+        //=== VK_KHR_win32_surface ===
+        vkCreateWin32SurfaceKHR =
+          PFN_vkCreateWin32SurfaceKHR( vkGetInstanceProcAddr( instance, "vkCreateWin32SurfaceKHR" ) );
         vkGetPhysicalDeviceWin32PresentationSupportKHR = PFN_vkGetPhysicalDeviceWin32PresentationSupportKHR(
           vkGetInstanceProcAddr( instance, "vkGetPhysicalDeviceWin32PresentationSupportKHR" ) );
 #  endif /*VK_USE_PLATFORM_WIN32_KHR*/
+
 #  if defined( VK_USE_PLATFORM_XCB_KHR )
+        //=== VK_KHR_xcb_surface ===
+        vkCreateXcbSurfaceKHR = PFN_vkCreateXcbSurfaceKHR( vkGetInstanceProcAddr( instance, "vkCreateXcbSurfaceKHR" ) );
         vkGetPhysicalDeviceXcbPresentationSupportKHR = PFN_vkGetPhysicalDeviceXcbPresentationSupportKHR(
           vkGetInstanceProcAddr( instance, "vkGetPhysicalDeviceXcbPresentationSupportKHR" ) );
 #  endif /*VK_USE_PLATFORM_XCB_KHR*/
+
 #  if defined( VK_USE_PLATFORM_XLIB_KHR )
+        //=== VK_KHR_xlib_surface ===
+        vkCreateXlibSurfaceKHR =
+          PFN_vkCreateXlibSurfaceKHR( vkGetInstanceProcAddr( instance, "vkCreateXlibSurfaceKHR" ) );
         vkGetPhysicalDeviceXlibPresentationSupportKHR = PFN_vkGetPhysicalDeviceXlibPresentationSupportKHR(
           vkGetInstanceProcAddr( instance, "vkGetPhysicalDeviceXlibPresentationSupportKHR" ) );
 #  endif /*VK_USE_PLATFORM_XLIB_KHR*/
-#  if defined( VK_USE_PLATFORM_XLIB_XRANDR_EXT )
-        vkGetRandROutputDisplayEXT =
-          PFN_vkGetRandROutputDisplayEXT( vkGetInstanceProcAddr( instance, "vkGetRandROutputDisplayEXT" ) );
-#  endif /*VK_USE_PLATFORM_XLIB_XRANDR_EXT*/
+
+#  if defined( VK_USE_PLATFORM_IOS_MVK )
+        //=== VK_MVK_ios_surface ===
+        vkCreateIOSSurfaceMVK = PFN_vkCreateIOSSurfaceMVK( vkGetInstanceProcAddr( instance, "vkCreateIOSSurfaceMVK" ) );
+#  endif /*VK_USE_PLATFORM_IOS_MVK*/
+
+#  if defined( VK_USE_PLATFORM_MACOS_MVK )
+        //=== VK_MVK_macos_surface ===
+        vkCreateMacOSSurfaceMVK =
+          PFN_vkCreateMacOSSurfaceMVK( vkGetInstanceProcAddr( instance, "vkCreateMacOSSurfaceMVK" ) );
+#  endif /*VK_USE_PLATFORM_MACOS_MVK*/
+
+#  if defined( VK_USE_PLATFORM_VI_NN )
+        //=== VK_NN_vi_surface ===
+        vkCreateViSurfaceNN = PFN_vkCreateViSurfaceNN( vkGetInstanceProcAddr( instance, "vkCreateViSurfaceNN" ) );
+#  endif /*VK_USE_PLATFORM_VI_NN*/
+
 #  if defined( VK_USE_PLATFORM_WIN32_KHR )
+        //=== VK_NV_acquire_winrt_display ===
+        vkAcquireWinrtDisplayNV =
+          PFN_vkAcquireWinrtDisplayNV( vkGetInstanceProcAddr( instance, "vkAcquireWinrtDisplayNV" ) );
         vkGetWinrtDisplayNV = PFN_vkGetWinrtDisplayNV( vkGetInstanceProcAddr( instance, "vkGetWinrtDisplayNV" ) );
 #  endif /*VK_USE_PLATFORM_WIN32_KHR*/
-        vkReleaseDisplayEXT = PFN_vkReleaseDisplayEXT( vkGetInstanceProcAddr( instance, "vkReleaseDisplayEXT" ) );
-        vkSubmitDebugUtilsMessageEXT =
-          PFN_vkSubmitDebugUtilsMessageEXT( vkGetInstanceProcAddr( instance, "vkSubmitDebugUtilsMessageEXT" ) );
+
+        //=== VK_NV_cooperative_matrix ===
+        vkGetPhysicalDeviceCooperativeMatrixPropertiesNV = PFN_vkGetPhysicalDeviceCooperativeMatrixPropertiesNV(
+          vkGetInstanceProcAddr( instance, "vkGetPhysicalDeviceCooperativeMatrixPropertiesNV" ) );
+
+        //=== VK_NV_coverage_reduction_mode ===
+        vkGetPhysicalDeviceSupportedFramebufferMixedSamplesCombinationsNV =
+          PFN_vkGetPhysicalDeviceSupportedFramebufferMixedSamplesCombinationsNV(
+            vkGetInstanceProcAddr( instance, "vkGetPhysicalDeviceSupportedFramebufferMixedSamplesCombinationsNV" ) );
+
+        //=== VK_NV_external_memory_capabilities ===
+        vkGetPhysicalDeviceExternalImageFormatPropertiesNV = PFN_vkGetPhysicalDeviceExternalImageFormatPropertiesNV(
+          vkGetInstanceProcAddr( instance, "vkGetPhysicalDeviceExternalImageFormatPropertiesNV" ) );
+
+#  if defined( VK_USE_PLATFORM_SCREEN_QNX )
+        //=== VK_QNX_screen_surface ===
+        vkCreateScreenSurfaceQNX =
+          PFN_vkCreateScreenSurfaceQNX( vkGetInstanceProcAddr( instance, "vkCreateScreenSurfaceQNX" ) );
+        vkGetPhysicalDeviceScreenPresentationSupportQNX = PFN_vkGetPhysicalDeviceScreenPresentationSupportQNX(
+          vkGetInstanceProcAddr( instance, "vkGetPhysicalDeviceScreenPresentationSupportQNX" ) );
+#  endif /*VK_USE_PLATFORM_SCREEN_QNX*/
 
         vkGetDeviceProcAddr = PFN_vkGetDeviceProcAddr( vkGetInstanceProcAddr( instance, "vkGetDeviceProcAddr" ) );
       }
 
     public:
+      //=== VK_VERSION_1_0 ===
+      PFN_vkDestroyInstance                              vkDestroyInstance                              = 0;
+      PFN_vkEnumeratePhysicalDevices                     vkEnumeratePhysicalDevices                     = 0;
+      PFN_vkGetPhysicalDeviceFeatures                    vkGetPhysicalDeviceFeatures                    = 0;
+      PFN_vkGetPhysicalDeviceFormatProperties            vkGetPhysicalDeviceFormatProperties            = 0;
+      PFN_vkGetPhysicalDeviceImageFormatProperties       vkGetPhysicalDeviceImageFormatProperties       = 0;
+      PFN_vkGetPhysicalDeviceProperties                  vkGetPhysicalDeviceProperties                  = 0;
+      PFN_vkGetPhysicalDeviceQueueFamilyProperties       vkGetPhysicalDeviceQueueFamilyProperties       = 0;
+      PFN_vkGetPhysicalDeviceMemoryProperties            vkGetPhysicalDeviceMemoryProperties            = 0;
+      PFN_vkGetInstanceProcAddr                          vkGetInstanceProcAddr                          = 0;
+      PFN_vkCreateDevice                                 vkCreateDevice                                 = 0;
+      PFN_vkEnumerateDeviceExtensionProperties           vkEnumerateDeviceExtensionProperties           = 0;
+      PFN_vkEnumerateDeviceLayerProperties               vkEnumerateDeviceLayerProperties               = 0;
+      PFN_vkGetPhysicalDeviceSparseImageFormatProperties vkGetPhysicalDeviceSparseImageFormatProperties = 0;
+
+      //=== VK_VERSION_1_1 ===
+      PFN_vkEnumeratePhysicalDeviceGroups                 vkEnumeratePhysicalDeviceGroups                 = 0;
+      PFN_vkGetPhysicalDeviceFeatures2                    vkGetPhysicalDeviceFeatures2                    = 0;
+      PFN_vkGetPhysicalDeviceProperties2                  vkGetPhysicalDeviceProperties2                  = 0;
+      PFN_vkGetPhysicalDeviceFormatProperties2            vkGetPhysicalDeviceFormatProperties2            = 0;
+      PFN_vkGetPhysicalDeviceImageFormatProperties2       vkGetPhysicalDeviceImageFormatProperties2       = 0;
+      PFN_vkGetPhysicalDeviceQueueFamilyProperties2       vkGetPhysicalDeviceQueueFamilyProperties2       = 0;
+      PFN_vkGetPhysicalDeviceMemoryProperties2            vkGetPhysicalDeviceMemoryProperties2            = 0;
+      PFN_vkGetPhysicalDeviceSparseImageFormatProperties2 vkGetPhysicalDeviceSparseImageFormatProperties2 = 0;
+      PFN_vkGetPhysicalDeviceExternalBufferProperties     vkGetPhysicalDeviceExternalBufferProperties     = 0;
+      PFN_vkGetPhysicalDeviceExternalFenceProperties      vkGetPhysicalDeviceExternalFenceProperties      = 0;
+      PFN_vkGetPhysicalDeviceExternalSemaphoreProperties  vkGetPhysicalDeviceExternalSemaphoreProperties  = 0;
+
+      //=== VK_EXT_acquire_drm_display ===
       PFN_vkAcquireDrmDisplayEXT vkAcquireDrmDisplayEXT = 0;
-#  if defined( VK_USE_PLATFORM_WIN32_KHR )
-      PFN_vkAcquireWinrtDisplayNV vkAcquireWinrtDisplayNV = 0;
-#  endif /*VK_USE_PLATFORM_WIN32_KHR*/
+      PFN_vkGetDrmDisplayEXT     vkGetDrmDisplayEXT     = 0;
+
 #  if defined( VK_USE_PLATFORM_XLIB_XRANDR_EXT )
-      PFN_vkAcquireXlibDisplayEXT vkAcquireXlibDisplayEXT = 0;
-#  endif /*VK_USE_PLATFORM_XLIB_XRANDR_EXT*/
-#  if defined( VK_USE_PLATFORM_ANDROID_KHR )
-      PFN_vkCreateAndroidSurfaceKHR vkCreateAndroidSurfaceKHR = 0;
-#  endif /*VK_USE_PLATFORM_ANDROID_KHR*/
-      PFN_vkCreateDebugReportCallbackEXT vkCreateDebugReportCallbackEXT = 0;
-      PFN_vkCreateDebugUtilsMessengerEXT vkCreateDebugUtilsMessengerEXT = 0;
-      PFN_vkCreateDevice                 vkCreateDevice                 = 0;
-#  if defined( VK_USE_PLATFORM_DIRECTFB_EXT )
-      PFN_vkCreateDirectFBSurfaceEXT vkCreateDirectFBSurfaceEXT = 0;
-#  endif /*VK_USE_PLATFORM_DIRECTFB_EXT*/
-      PFN_vkCreateDisplayModeKHR         vkCreateDisplayModeKHR         = 0;
-      PFN_vkCreateDisplayPlaneSurfaceKHR vkCreateDisplayPlaneSurfaceKHR = 0;
-      PFN_vkCreateHeadlessSurfaceEXT     vkCreateHeadlessSurfaceEXT     = 0;
-#  if defined( VK_USE_PLATFORM_IOS_MVK )
-      PFN_vkCreateIOSSurfaceMVK vkCreateIOSSurfaceMVK = 0;
-#  endif /*VK_USE_PLATFORM_IOS_MVK*/
-#  if defined( VK_USE_PLATFORM_FUCHSIA )
-      PFN_vkCreateImagePipeSurfaceFUCHSIA vkCreateImagePipeSurfaceFUCHSIA = 0;
-#  endif /*VK_USE_PLATFORM_FUCHSIA*/
-#  if defined( VK_USE_PLATFORM_MACOS_MVK )
-      PFN_vkCreateMacOSSurfaceMVK vkCreateMacOSSurfaceMVK = 0;
-#  endif /*VK_USE_PLATFORM_MACOS_MVK*/
-#  if defined( VK_USE_PLATFORM_METAL_EXT )
-      PFN_vkCreateMetalSurfaceEXT vkCreateMetalSurfaceEXT = 0;
-#  endif /*VK_USE_PLATFORM_METAL_EXT*/
-#  if defined( VK_USE_PLATFORM_SCREEN_QNX )
-      PFN_vkCreateScreenSurfaceQNX vkCreateScreenSurfaceQNX = 0;
-#  endif /*VK_USE_PLATFORM_SCREEN_QNX*/
-#  if defined( VK_USE_PLATFORM_GGP )
-      PFN_vkCreateStreamDescriptorSurfaceGGP vkCreateStreamDescriptorSurfaceGGP = 0;
-#  endif /*VK_USE_PLATFORM_GGP*/
-#  if defined( VK_USE_PLATFORM_VI_NN )
-      PFN_vkCreateViSurfaceNN vkCreateViSurfaceNN = 0;
-#  endif /*VK_USE_PLATFORM_VI_NN*/
-#  if defined( VK_USE_PLATFORM_WAYLAND_KHR )
-      PFN_vkCreateWaylandSurfaceKHR vkCreateWaylandSurfaceKHR = 0;
-#  endif /*VK_USE_PLATFORM_WAYLAND_KHR*/
-#  if defined( VK_USE_PLATFORM_WIN32_KHR )
-      PFN_vkCreateWin32SurfaceKHR vkCreateWin32SurfaceKHR = 0;
-#  endif /*VK_USE_PLATFORM_WIN32_KHR*/
-#  if defined( VK_USE_PLATFORM_XCB_KHR )
-      PFN_vkCreateXcbSurfaceKHR vkCreateXcbSurfaceKHR = 0;
-#  endif /*VK_USE_PLATFORM_XCB_KHR*/
-#  if defined( VK_USE_PLATFORM_XLIB_KHR )
-      PFN_vkCreateXlibSurfaceKHR vkCreateXlibSurfaceKHR = 0;
-#  endif /*VK_USE_PLATFORM_XLIB_KHR*/
-      PFN_vkDebugReportMessageEXT              vkDebugReportMessageEXT              = 0;
-      PFN_vkDestroyDebugReportCallbackEXT      vkDestroyDebugReportCallbackEXT      = 0;
-      PFN_vkDestroyDebugUtilsMessengerEXT      vkDestroyDebugUtilsMessengerEXT      = 0;
-      PFN_vkDestroyInstance                    vkDestroyInstance                    = 0;
-      PFN_vkDestroySurfaceKHR                  vkDestroySurfaceKHR                  = 0;
-      PFN_vkEnumerateDeviceExtensionProperties vkEnumerateDeviceExtensionProperties = 0;
-      PFN_vkEnumerateDeviceLayerProperties     vkEnumerateDeviceLayerProperties     = 0;
-      PFN_vkEnumeratePhysicalDeviceGroups      vkEnumeratePhysicalDeviceGroups      = 0;
-      PFN_vkEnumeratePhysicalDeviceGroupsKHR   vkEnumeratePhysicalDeviceGroupsKHR   = 0;
-      PFN_vkEnumeratePhysicalDeviceQueueFamilyPerformanceQueryCountersKHR
-                                                           vkEnumeratePhysicalDeviceQueueFamilyPerformanceQueryCountersKHR = 0;
-      PFN_vkEnumeratePhysicalDevices                       vkEnumeratePhysicalDevices                       = 0;
-      PFN_vkGetDisplayModeProperties2KHR                   vkGetDisplayModeProperties2KHR                   = 0;
-      PFN_vkGetDisplayModePropertiesKHR                    vkGetDisplayModePropertiesKHR                    = 0;
-      PFN_vkGetDisplayPlaneCapabilities2KHR                vkGetDisplayPlaneCapabilities2KHR                = 0;
-      PFN_vkGetDisplayPlaneCapabilitiesKHR                 vkGetDisplayPlaneCapabilitiesKHR                 = 0;
-      PFN_vkGetDisplayPlaneSupportedDisplaysKHR            vkGetDisplayPlaneSupportedDisplaysKHR            = 0;
-      PFN_vkGetDrmDisplayEXT                               vkGetDrmDisplayEXT                               = 0;
-      PFN_vkGetInstanceProcAddr                            vkGetInstanceProcAddr                            = 0;
-      PFN_vkGetPhysicalDeviceCalibrateableTimeDomainsEXT   vkGetPhysicalDeviceCalibrateableTimeDomainsEXT   = 0;
-      PFN_vkGetPhysicalDeviceCooperativeMatrixPropertiesNV vkGetPhysicalDeviceCooperativeMatrixPropertiesNV = 0;
-#  if defined( VK_USE_PLATFORM_DIRECTFB_EXT )
-      PFN_vkGetPhysicalDeviceDirectFBPresentationSupportEXT vkGetPhysicalDeviceDirectFBPresentationSupportEXT = 0;
-#  endif /*VK_USE_PLATFORM_DIRECTFB_EXT*/
-      PFN_vkGetPhysicalDeviceDisplayPlaneProperties2KHR      vkGetPhysicalDeviceDisplayPlaneProperties2KHR      = 0;
-      PFN_vkGetPhysicalDeviceDisplayPlanePropertiesKHR       vkGetPhysicalDeviceDisplayPlanePropertiesKHR       = 0;
-      PFN_vkGetPhysicalDeviceDisplayProperties2KHR           vkGetPhysicalDeviceDisplayProperties2KHR           = 0;
-      PFN_vkGetPhysicalDeviceDisplayPropertiesKHR            vkGetPhysicalDeviceDisplayPropertiesKHR            = 0;
-      PFN_vkGetPhysicalDeviceExternalBufferProperties        vkGetPhysicalDeviceExternalBufferProperties        = 0;
-      PFN_vkGetPhysicalDeviceExternalBufferPropertiesKHR     vkGetPhysicalDeviceExternalBufferPropertiesKHR     = 0;
-      PFN_vkGetPhysicalDeviceExternalFenceProperties         vkGetPhysicalDeviceExternalFenceProperties         = 0;
-      PFN_vkGetPhysicalDeviceExternalFencePropertiesKHR      vkGetPhysicalDeviceExternalFencePropertiesKHR      = 0;
-      PFN_vkGetPhysicalDeviceExternalImageFormatPropertiesNV vkGetPhysicalDeviceExternalImageFormatPropertiesNV = 0;
-      PFN_vkGetPhysicalDeviceExternalSemaphoreProperties     vkGetPhysicalDeviceExternalSemaphoreProperties     = 0;
-      PFN_vkGetPhysicalDeviceExternalSemaphorePropertiesKHR  vkGetPhysicalDeviceExternalSemaphorePropertiesKHR  = 0;
-      PFN_vkGetPhysicalDeviceFeatures                        vkGetPhysicalDeviceFeatures                        = 0;
-      PFN_vkGetPhysicalDeviceFeatures2                       vkGetPhysicalDeviceFeatures2                       = 0;
-      PFN_vkGetPhysicalDeviceFeatures2KHR                    vkGetPhysicalDeviceFeatures2KHR                    = 0;
-      PFN_vkGetPhysicalDeviceFormatProperties                vkGetPhysicalDeviceFormatProperties                = 0;
-      PFN_vkGetPhysicalDeviceFormatProperties2               vkGetPhysicalDeviceFormatProperties2               = 0;
-      PFN_vkGetPhysicalDeviceFormatProperties2KHR            vkGetPhysicalDeviceFormatProperties2KHR            = 0;
-      PFN_vkGetPhysicalDeviceFragmentShadingRatesKHR         vkGetPhysicalDeviceFragmentShadingRatesKHR         = 0;
-      PFN_vkGetPhysicalDeviceImageFormatProperties           vkGetPhysicalDeviceImageFormatProperties           = 0;
-      PFN_vkGetPhysicalDeviceImageFormatProperties2          vkGetPhysicalDeviceImageFormatProperties2          = 0;
-      PFN_vkGetPhysicalDeviceImageFormatProperties2KHR       vkGetPhysicalDeviceImageFormatProperties2KHR       = 0;
-      PFN_vkGetPhysicalDeviceMemoryProperties                vkGetPhysicalDeviceMemoryProperties                = 0;
-      PFN_vkGetPhysicalDeviceMemoryProperties2               vkGetPhysicalDeviceMemoryProperties2               = 0;
-      PFN_vkGetPhysicalDeviceMemoryProperties2KHR            vkGetPhysicalDeviceMemoryProperties2KHR            = 0;
-      PFN_vkGetPhysicalDeviceMultisamplePropertiesEXT        vkGetPhysicalDeviceMultisamplePropertiesEXT        = 0;
-      PFN_vkGetPhysicalDevicePresentRectanglesKHR            vkGetPhysicalDevicePresentRectanglesKHR            = 0;
-      PFN_vkGetPhysicalDeviceProperties                      vkGetPhysicalDeviceProperties                      = 0;
-      PFN_vkGetPhysicalDeviceProperties2                     vkGetPhysicalDeviceProperties2                     = 0;
-      PFN_vkGetPhysicalDeviceProperties2KHR                  vkGetPhysicalDeviceProperties2KHR                  = 0;
-      PFN_vkGetPhysicalDeviceQueueFamilyPerformanceQueryPassesKHR
-                                                       vkGetPhysicalDeviceQueueFamilyPerformanceQueryPassesKHR = 0;
-      PFN_vkGetPhysicalDeviceQueueFamilyProperties     vkGetPhysicalDeviceQueueFamilyProperties                = 0;
-      PFN_vkGetPhysicalDeviceQueueFamilyProperties2    vkGetPhysicalDeviceQueueFamilyProperties2               = 0;
-      PFN_vkGetPhysicalDeviceQueueFamilyProperties2KHR vkGetPhysicalDeviceQueueFamilyProperties2KHR            = 0;
-#  if defined( VK_USE_PLATFORM_SCREEN_QNX )
-      PFN_vkGetPhysicalDeviceScreenPresentationSupportQNX vkGetPhysicalDeviceScreenPresentationSupportQNX = 0;
-#  endif /*VK_USE_PLATFORM_SCREEN_QNX*/
-      PFN_vkGetPhysicalDeviceSparseImageFormatProperties     vkGetPhysicalDeviceSparseImageFormatProperties     = 0;
-      PFN_vkGetPhysicalDeviceSparseImageFormatProperties2    vkGetPhysicalDeviceSparseImageFormatProperties2    = 0;
-      PFN_vkGetPhysicalDeviceSparseImageFormatProperties2KHR vkGetPhysicalDeviceSparseImageFormatProperties2KHR = 0;
-      PFN_vkGetPhysicalDeviceSupportedFramebufferMixedSamplesCombinationsNV
-                                                     vkGetPhysicalDeviceSupportedFramebufferMixedSamplesCombinationsNV = 0;
-      PFN_vkGetPhysicalDeviceSurfaceCapabilities2EXT vkGetPhysicalDeviceSurfaceCapabilities2EXT = 0;
-      PFN_vkGetPhysicalDeviceSurfaceCapabilities2KHR vkGetPhysicalDeviceSurfaceCapabilities2KHR = 0;
-      PFN_vkGetPhysicalDeviceSurfaceCapabilitiesKHR  vkGetPhysicalDeviceSurfaceCapabilitiesKHR  = 0;
-      PFN_vkGetPhysicalDeviceSurfaceFormats2KHR      vkGetPhysicalDeviceSurfaceFormats2KHR      = 0;
-      PFN_vkGetPhysicalDeviceSurfaceFormatsKHR       vkGetPhysicalDeviceSurfaceFormatsKHR       = 0;
-#  if defined( VK_USE_PLATFORM_WIN32_KHR )
-      PFN_vkGetPhysicalDeviceSurfacePresentModes2EXT vkGetPhysicalDeviceSurfacePresentModes2EXT = 0;
-#  endif /*VK_USE_PLATFORM_WIN32_KHR*/
-      PFN_vkGetPhysicalDeviceSurfacePresentModesKHR vkGetPhysicalDeviceSurfacePresentModesKHR = 0;
-      PFN_vkGetPhysicalDeviceSurfaceSupportKHR      vkGetPhysicalDeviceSurfaceSupportKHR      = 0;
-      PFN_vkGetPhysicalDeviceToolPropertiesEXT      vkGetPhysicalDeviceToolPropertiesEXT      = 0;
-#  if defined( VK_ENABLE_BETA_EXTENSIONS )
-      PFN_vkGetPhysicalDeviceVideoCapabilitiesKHR vkGetPhysicalDeviceVideoCapabilitiesKHR = 0;
-#  endif /*VK_ENABLE_BETA_EXTENSIONS*/
-#  if defined( VK_ENABLE_BETA_EXTENSIONS )
-      PFN_vkGetPhysicalDeviceVideoFormatPropertiesKHR vkGetPhysicalDeviceVideoFormatPropertiesKHR = 0;
-#  endif /*VK_ENABLE_BETA_EXTENSIONS*/
-#  if defined( VK_USE_PLATFORM_WAYLAND_KHR )
-      PFN_vkGetPhysicalDeviceWaylandPresentationSupportKHR vkGetPhysicalDeviceWaylandPresentationSupportKHR = 0;
-#  endif /*VK_USE_PLATFORM_WAYLAND_KHR*/
-#  if defined( VK_USE_PLATFORM_WIN32_KHR )
-      PFN_vkGetPhysicalDeviceWin32PresentationSupportKHR vkGetPhysicalDeviceWin32PresentationSupportKHR = 0;
-#  endif /*VK_USE_PLATFORM_WIN32_KHR*/
-#  if defined( VK_USE_PLATFORM_XCB_KHR )
-      PFN_vkGetPhysicalDeviceXcbPresentationSupportKHR vkGetPhysicalDeviceXcbPresentationSupportKHR = 0;
-#  endif /*VK_USE_PLATFORM_XCB_KHR*/
-#  if defined( VK_USE_PLATFORM_XLIB_KHR )
-      PFN_vkGetPhysicalDeviceXlibPresentationSupportKHR vkGetPhysicalDeviceXlibPresentationSupportKHR = 0;
-#  endif /*VK_USE_PLATFORM_XLIB_KHR*/
-#  if defined( VK_USE_PLATFORM_XLIB_XRANDR_EXT )
+      //=== VK_EXT_acquire_xlib_display ===
+      PFN_vkAcquireXlibDisplayEXT    vkAcquireXlibDisplayEXT    = 0;
       PFN_vkGetRandROutputDisplayEXT vkGetRandROutputDisplayEXT = 0;
+#  else
+      PFN_dummy vkAcquireXlibDisplayEXT_placeholder                           = 0;
+      PFN_dummy vkGetRandROutputDisplayEXT_placeholder                        = 0;
 #  endif /*VK_USE_PLATFORM_XLIB_XRANDR_EXT*/
+
+      //=== VK_EXT_calibrated_timestamps ===
+      PFN_vkGetPhysicalDeviceCalibrateableTimeDomainsEXT vkGetPhysicalDeviceCalibrateableTimeDomainsEXT = 0;
+
+      //=== VK_EXT_debug_report ===
+      PFN_vkCreateDebugReportCallbackEXT  vkCreateDebugReportCallbackEXT  = 0;
+      PFN_vkDestroyDebugReportCallbackEXT vkDestroyDebugReportCallbackEXT = 0;
+      PFN_vkDebugReportMessageEXT         vkDebugReportMessageEXT         = 0;
+
+      //=== VK_EXT_debug_utils ===
+      PFN_vkCreateDebugUtilsMessengerEXT  vkCreateDebugUtilsMessengerEXT  = 0;
+      PFN_vkDestroyDebugUtilsMessengerEXT vkDestroyDebugUtilsMessengerEXT = 0;
+      PFN_vkSubmitDebugUtilsMessageEXT    vkSubmitDebugUtilsMessageEXT    = 0;
+
+      //=== VK_EXT_direct_mode_display ===
+      PFN_vkReleaseDisplayEXT vkReleaseDisplayEXT = 0;
+
+#  if defined( VK_USE_PLATFORM_DIRECTFB_EXT )
+      //=== VK_EXT_directfb_surface ===
+      PFN_vkCreateDirectFBSurfaceEXT                        vkCreateDirectFBSurfaceEXT                        = 0;
+      PFN_vkGetPhysicalDeviceDirectFBPresentationSupportEXT vkGetPhysicalDeviceDirectFBPresentationSupportEXT = 0;
+#  else
+      PFN_dummy vkCreateDirectFBSurfaceEXT_placeholder                        = 0;
+      PFN_dummy vkGetPhysicalDeviceDirectFBPresentationSupportEXT_placeholder = 0;
+#  endif /*VK_USE_PLATFORM_DIRECTFB_EXT*/
+
+      //=== VK_EXT_display_surface_counter ===
+      PFN_vkGetPhysicalDeviceSurfaceCapabilities2EXT vkGetPhysicalDeviceSurfaceCapabilities2EXT = 0;
+
 #  if defined( VK_USE_PLATFORM_WIN32_KHR )
-      PFN_vkGetWinrtDisplayNV vkGetWinrtDisplayNV = 0;
+      //=== VK_EXT_full_screen_exclusive ===
+      PFN_vkGetPhysicalDeviceSurfacePresentModes2EXT vkGetPhysicalDeviceSurfacePresentModes2EXT = 0;
+#  else
+      PFN_dummy vkGetPhysicalDeviceSurfacePresentModes2EXT_placeholder        = 0;
 #  endif /*VK_USE_PLATFORM_WIN32_KHR*/
-      PFN_vkReleaseDisplayEXT          vkReleaseDisplayEXT          = 0;
-      PFN_vkSubmitDebugUtilsMessageEXT vkSubmitDebugUtilsMessageEXT = 0;
+
+      //=== VK_EXT_headless_surface ===
+      PFN_vkCreateHeadlessSurfaceEXT vkCreateHeadlessSurfaceEXT = 0;
+
+#  if defined( VK_USE_PLATFORM_METAL_EXT )
+      //=== VK_EXT_metal_surface ===
+      PFN_vkCreateMetalSurfaceEXT vkCreateMetalSurfaceEXT = 0;
+#  else
+      PFN_dummy vkCreateMetalSurfaceEXT_placeholder                           = 0;
+#  endif /*VK_USE_PLATFORM_METAL_EXT*/
+
+      //=== VK_EXT_sample_locations ===
+      PFN_vkGetPhysicalDeviceMultisamplePropertiesEXT vkGetPhysicalDeviceMultisamplePropertiesEXT = 0;
+
+      //=== VK_EXT_tooling_info ===
+      PFN_vkGetPhysicalDeviceToolPropertiesEXT vkGetPhysicalDeviceToolPropertiesEXT = 0;
+
+#  if defined( VK_USE_PLATFORM_FUCHSIA )
+      //=== VK_FUCHSIA_imagepipe_surface ===
+      PFN_vkCreateImagePipeSurfaceFUCHSIA vkCreateImagePipeSurfaceFUCHSIA = 0;
+#  else
+      PFN_dummy vkCreateImagePipeSurfaceFUCHSIA_placeholder                   = 0;
+#  endif /*VK_USE_PLATFORM_FUCHSIA*/
+
+#  if defined( VK_USE_PLATFORM_GGP )
+      //=== VK_GGP_stream_descriptor_surface ===
+      PFN_vkCreateStreamDescriptorSurfaceGGP vkCreateStreamDescriptorSurfaceGGP = 0;
+#  else
+      PFN_dummy vkCreateStreamDescriptorSurfaceGGP_placeholder                = 0;
+#  endif /*VK_USE_PLATFORM_GGP*/
+
+#  if defined( VK_USE_PLATFORM_ANDROID_KHR )
+      //=== VK_KHR_android_surface ===
+      PFN_vkCreateAndroidSurfaceKHR vkCreateAndroidSurfaceKHR = 0;
+#  else
+      PFN_dummy vkCreateAndroidSurfaceKHR_placeholder                         = 0;
+#  endif /*VK_USE_PLATFORM_ANDROID_KHR*/
+
+      //=== VK_KHR_device_group ===
+      PFN_vkGetPhysicalDevicePresentRectanglesKHR vkGetPhysicalDevicePresentRectanglesKHR = 0;
+
+      //=== VK_KHR_device_group_creation ===
+      PFN_vkEnumeratePhysicalDeviceGroupsKHR vkEnumeratePhysicalDeviceGroupsKHR = 0;
+
+      //=== VK_KHR_display ===
+      PFN_vkGetPhysicalDeviceDisplayPropertiesKHR      vkGetPhysicalDeviceDisplayPropertiesKHR      = 0;
+      PFN_vkGetPhysicalDeviceDisplayPlanePropertiesKHR vkGetPhysicalDeviceDisplayPlanePropertiesKHR = 0;
+      PFN_vkGetDisplayPlaneSupportedDisplaysKHR        vkGetDisplayPlaneSupportedDisplaysKHR        = 0;
+      PFN_vkGetDisplayModePropertiesKHR                vkGetDisplayModePropertiesKHR                = 0;
+      PFN_vkCreateDisplayModeKHR                       vkCreateDisplayModeKHR                       = 0;
+      PFN_vkGetDisplayPlaneCapabilitiesKHR             vkGetDisplayPlaneCapabilitiesKHR             = 0;
+      PFN_vkCreateDisplayPlaneSurfaceKHR               vkCreateDisplayPlaneSurfaceKHR               = 0;
+
+      //=== VK_KHR_external_fence_capabilities ===
+      PFN_vkGetPhysicalDeviceExternalFencePropertiesKHR vkGetPhysicalDeviceExternalFencePropertiesKHR = 0;
+
+      //=== VK_KHR_external_memory_capabilities ===
+      PFN_vkGetPhysicalDeviceExternalBufferPropertiesKHR vkGetPhysicalDeviceExternalBufferPropertiesKHR = 0;
+
+      //=== VK_KHR_external_semaphore_capabilities ===
+      PFN_vkGetPhysicalDeviceExternalSemaphorePropertiesKHR vkGetPhysicalDeviceExternalSemaphorePropertiesKHR = 0;
+
+      //=== VK_KHR_fragment_shading_rate ===
+      PFN_vkGetPhysicalDeviceFragmentShadingRatesKHR vkGetPhysicalDeviceFragmentShadingRatesKHR = 0;
+
+      //=== VK_KHR_get_display_properties2 ===
+      PFN_vkGetPhysicalDeviceDisplayProperties2KHR      vkGetPhysicalDeviceDisplayProperties2KHR      = 0;
+      PFN_vkGetPhysicalDeviceDisplayPlaneProperties2KHR vkGetPhysicalDeviceDisplayPlaneProperties2KHR = 0;
+      PFN_vkGetDisplayModeProperties2KHR                vkGetDisplayModeProperties2KHR                = 0;
+      PFN_vkGetDisplayPlaneCapabilities2KHR             vkGetDisplayPlaneCapabilities2KHR             = 0;
+
+      //=== VK_KHR_get_physical_device_properties2 ===
+      PFN_vkGetPhysicalDeviceFeatures2KHR                    vkGetPhysicalDeviceFeatures2KHR                    = 0;
+      PFN_vkGetPhysicalDeviceProperties2KHR                  vkGetPhysicalDeviceProperties2KHR                  = 0;
+      PFN_vkGetPhysicalDeviceFormatProperties2KHR            vkGetPhysicalDeviceFormatProperties2KHR            = 0;
+      PFN_vkGetPhysicalDeviceImageFormatProperties2KHR       vkGetPhysicalDeviceImageFormatProperties2KHR       = 0;
+      PFN_vkGetPhysicalDeviceQueueFamilyProperties2KHR       vkGetPhysicalDeviceQueueFamilyProperties2KHR       = 0;
+      PFN_vkGetPhysicalDeviceMemoryProperties2KHR            vkGetPhysicalDeviceMemoryProperties2KHR            = 0;
+      PFN_vkGetPhysicalDeviceSparseImageFormatProperties2KHR vkGetPhysicalDeviceSparseImageFormatProperties2KHR = 0;
+
+      //=== VK_KHR_get_surface_capabilities2 ===
+      PFN_vkGetPhysicalDeviceSurfaceCapabilities2KHR vkGetPhysicalDeviceSurfaceCapabilities2KHR = 0;
+      PFN_vkGetPhysicalDeviceSurfaceFormats2KHR      vkGetPhysicalDeviceSurfaceFormats2KHR      = 0;
+
+      //=== VK_KHR_performance_query ===
+      PFN_vkEnumeratePhysicalDeviceQueueFamilyPerformanceQueryCountersKHR
+        vkEnumeratePhysicalDeviceQueueFamilyPerformanceQueryCountersKHR = 0;
+      PFN_vkGetPhysicalDeviceQueueFamilyPerformanceQueryPassesKHR
+        vkGetPhysicalDeviceQueueFamilyPerformanceQueryPassesKHR = 0;
+
+      //=== VK_KHR_surface ===
+      PFN_vkDestroySurfaceKHR                       vkDestroySurfaceKHR                       = 0;
+      PFN_vkGetPhysicalDeviceSurfaceSupportKHR      vkGetPhysicalDeviceSurfaceSupportKHR      = 0;
+      PFN_vkGetPhysicalDeviceSurfaceCapabilitiesKHR vkGetPhysicalDeviceSurfaceCapabilitiesKHR = 0;
+      PFN_vkGetPhysicalDeviceSurfaceFormatsKHR      vkGetPhysicalDeviceSurfaceFormatsKHR      = 0;
+      PFN_vkGetPhysicalDeviceSurfacePresentModesKHR vkGetPhysicalDeviceSurfacePresentModesKHR = 0;
+
+#  if defined( VK_ENABLE_BETA_EXTENSIONS )
+      //=== VK_KHR_video_queue ===
+      PFN_vkGetPhysicalDeviceVideoCapabilitiesKHR     vkGetPhysicalDeviceVideoCapabilitiesKHR     = 0;
+      PFN_vkGetPhysicalDeviceVideoFormatPropertiesKHR vkGetPhysicalDeviceVideoFormatPropertiesKHR = 0;
+#  else
+      PFN_dummy vkGetPhysicalDeviceVideoCapabilitiesKHR_placeholder           = 0;
+      PFN_dummy vkGetPhysicalDeviceVideoFormatPropertiesKHR_placeholder       = 0;
+#  endif /*VK_ENABLE_BETA_EXTENSIONS*/
+
+#  if defined( VK_USE_PLATFORM_WAYLAND_KHR )
+      //=== VK_KHR_wayland_surface ===
+      PFN_vkCreateWaylandSurfaceKHR                        vkCreateWaylandSurfaceKHR                        = 0;
+      PFN_vkGetPhysicalDeviceWaylandPresentationSupportKHR vkGetPhysicalDeviceWaylandPresentationSupportKHR = 0;
+#  else
+      PFN_dummy vkCreateWaylandSurfaceKHR_placeholder                         = 0;
+      PFN_dummy vkGetPhysicalDeviceWaylandPresentationSupportKHR_placeholder  = 0;
+#  endif /*VK_USE_PLATFORM_WAYLAND_KHR*/
+
+#  if defined( VK_USE_PLATFORM_WIN32_KHR )
+      //=== VK_KHR_win32_surface ===
+      PFN_vkCreateWin32SurfaceKHR                        vkCreateWin32SurfaceKHR                        = 0;
+      PFN_vkGetPhysicalDeviceWin32PresentationSupportKHR vkGetPhysicalDeviceWin32PresentationSupportKHR = 0;
+#  else
+      PFN_dummy vkCreateWin32SurfaceKHR_placeholder                           = 0;
+      PFN_dummy vkGetPhysicalDeviceWin32PresentationSupportKHR_placeholder    = 0;
+#  endif /*VK_USE_PLATFORM_WIN32_KHR*/
+
+#  if defined( VK_USE_PLATFORM_XCB_KHR )
+      //=== VK_KHR_xcb_surface ===
+      PFN_vkCreateXcbSurfaceKHR                        vkCreateXcbSurfaceKHR                        = 0;
+      PFN_vkGetPhysicalDeviceXcbPresentationSupportKHR vkGetPhysicalDeviceXcbPresentationSupportKHR = 0;
+#  else
+      PFN_dummy vkCreateXcbSurfaceKHR_placeholder                             = 0;
+      PFN_dummy vkGetPhysicalDeviceXcbPresentationSupportKHR_placeholder      = 0;
+#  endif /*VK_USE_PLATFORM_XCB_KHR*/
+
+#  if defined( VK_USE_PLATFORM_XLIB_KHR )
+      //=== VK_KHR_xlib_surface ===
+      PFN_vkCreateXlibSurfaceKHR                        vkCreateXlibSurfaceKHR                        = 0;
+      PFN_vkGetPhysicalDeviceXlibPresentationSupportKHR vkGetPhysicalDeviceXlibPresentationSupportKHR = 0;
+#  else
+      PFN_dummy vkCreateXlibSurfaceKHR_placeholder                            = 0;
+      PFN_dummy vkGetPhysicalDeviceXlibPresentationSupportKHR_placeholder     = 0;
+#  endif /*VK_USE_PLATFORM_XLIB_KHR*/
+
+#  if defined( VK_USE_PLATFORM_IOS_MVK )
+      //=== VK_MVK_ios_surface ===
+      PFN_vkCreateIOSSurfaceMVK vkCreateIOSSurfaceMVK = 0;
+#  else
+      PFN_dummy vkCreateIOSSurfaceMVK_placeholder                             = 0;
+#  endif /*VK_USE_PLATFORM_IOS_MVK*/
+
+#  if defined( VK_USE_PLATFORM_MACOS_MVK )
+      //=== VK_MVK_macos_surface ===
+      PFN_vkCreateMacOSSurfaceMVK vkCreateMacOSSurfaceMVK = 0;
+#  else
+      PFN_dummy vkCreateMacOSSurfaceMVK_placeholder                           = 0;
+#  endif /*VK_USE_PLATFORM_MACOS_MVK*/
+
+#  if defined( VK_USE_PLATFORM_VI_NN )
+      //=== VK_NN_vi_surface ===
+      PFN_vkCreateViSurfaceNN vkCreateViSurfaceNN = 0;
+#  else
+      PFN_dummy vkCreateViSurfaceNN_placeholder                               = 0;
+#  endif /*VK_USE_PLATFORM_VI_NN*/
+
+#  if defined( VK_USE_PLATFORM_WIN32_KHR )
+      //=== VK_NV_acquire_winrt_display ===
+      PFN_vkAcquireWinrtDisplayNV vkAcquireWinrtDisplayNV = 0;
+      PFN_vkGetWinrtDisplayNV     vkGetWinrtDisplayNV     = 0;
+#  else
+      PFN_dummy vkAcquireWinrtDisplayNV_placeholder                           = 0;
+      PFN_dummy vkGetWinrtDisplayNV_placeholder                               = 0;
+#  endif /*VK_USE_PLATFORM_WIN32_KHR*/
+
+      //=== VK_NV_cooperative_matrix ===
+      PFN_vkGetPhysicalDeviceCooperativeMatrixPropertiesNV vkGetPhysicalDeviceCooperativeMatrixPropertiesNV = 0;
+
+      //=== VK_NV_coverage_reduction_mode ===
+      PFN_vkGetPhysicalDeviceSupportedFramebufferMixedSamplesCombinationsNV
+        vkGetPhysicalDeviceSupportedFramebufferMixedSamplesCombinationsNV = 0;
+
+      //=== VK_NV_external_memory_capabilities ===
+      PFN_vkGetPhysicalDeviceExternalImageFormatPropertiesNV vkGetPhysicalDeviceExternalImageFormatPropertiesNV = 0;
+
+#  if defined( VK_USE_PLATFORM_SCREEN_QNX )
+      //=== VK_QNX_screen_surface ===
+      PFN_vkCreateScreenSurfaceQNX                        vkCreateScreenSurfaceQNX                        = 0;
+      PFN_vkGetPhysicalDeviceScreenPresentationSupportQNX vkGetPhysicalDeviceScreenPresentationSupportQNX = 0;
+#  else
+      PFN_dummy vkCreateScreenSurfaceQNX_placeholder                          = 0;
+      PFN_dummy vkGetPhysicalDeviceScreenPresentationSupportQNX_placeholder   = 0;
+#  endif /*VK_USE_PLATFORM_SCREEN_QNX*/
 
       PFN_vkGetDeviceProcAddr vkGetDeviceProcAddr = 0;
     };
 
-    class DeviceDispatcher
+    class DeviceDispatcher : public DispatchLoaderBase
     {
     public:
       DeviceDispatcher( PFN_vkGetDeviceProcAddr getProcAddr ) : vkGetDeviceProcAddr( getProcAddr ) {}
@@ -507,1187 +690,1489 @@
 
       void init( VkDevice device )
       {
-#  if defined( VK_USE_PLATFORM_WIN32_KHR )
-        vkAcquireFullScreenExclusiveModeEXT = PFN_vkAcquireFullScreenExclusiveModeEXT(
-          vkGetDeviceProcAddr( device, "vkAcquireFullScreenExclusiveModeEXT" ) );
-#  endif /*VK_USE_PLATFORM_WIN32_KHR*/
-        vkAcquireNextImage2KHR = PFN_vkAcquireNextImage2KHR( vkGetDeviceProcAddr( device, "vkAcquireNextImage2KHR" ) );
-        vkAcquireNextImageKHR  = PFN_vkAcquireNextImageKHR( vkGetDeviceProcAddr( device, "vkAcquireNextImageKHR" ) );
-        vkAcquirePerformanceConfigurationINTEL = PFN_vkAcquirePerformanceConfigurationINTEL(
-          vkGetDeviceProcAddr( device, "vkAcquirePerformanceConfigurationINTEL" ) );
-        vkAcquireProfilingLockKHR =
-          PFN_vkAcquireProfilingLockKHR( vkGetDeviceProcAddr( device, "vkAcquireProfilingLockKHR" ) );
-        vkAllocateCommandBuffers =
-          PFN_vkAllocateCommandBuffers( vkGetDeviceProcAddr( device, "vkAllocateCommandBuffers" ) );
+        //=== VK_VERSION_1_0 ===
+        vkGetDeviceProcAddr = PFN_vkGetDeviceProcAddr( vkGetDeviceProcAddr( device, "vkGetDeviceProcAddr" ) );
+        vkDestroyDevice     = PFN_vkDestroyDevice( vkGetDeviceProcAddr( device, "vkDestroyDevice" ) );
+        vkGetDeviceQueue    = PFN_vkGetDeviceQueue( vkGetDeviceProcAddr( device, "vkGetDeviceQueue" ) );
+        vkQueueSubmit       = PFN_vkQueueSubmit( vkGetDeviceProcAddr( device, "vkQueueSubmit" ) );
+        vkQueueWaitIdle     = PFN_vkQueueWaitIdle( vkGetDeviceProcAddr( device, "vkQueueWaitIdle" ) );
+        vkDeviceWaitIdle    = PFN_vkDeviceWaitIdle( vkGetDeviceProcAddr( device, "vkDeviceWaitIdle" ) );
+        vkAllocateMemory    = PFN_vkAllocateMemory( vkGetDeviceProcAddr( device, "vkAllocateMemory" ) );
+        vkFreeMemory        = PFN_vkFreeMemory( vkGetDeviceProcAddr( device, "vkFreeMemory" ) );
+        vkMapMemory         = PFN_vkMapMemory( vkGetDeviceProcAddr( device, "vkMapMemory" ) );
+        vkUnmapMemory       = PFN_vkUnmapMemory( vkGetDeviceProcAddr( device, "vkUnmapMemory" ) );
+        vkFlushMappedMemoryRanges =
+          PFN_vkFlushMappedMemoryRanges( vkGetDeviceProcAddr( device, "vkFlushMappedMemoryRanges" ) );
+        vkInvalidateMappedMemoryRanges =
+          PFN_vkInvalidateMappedMemoryRanges( vkGetDeviceProcAddr( device, "vkInvalidateMappedMemoryRanges" ) );
+        vkGetDeviceMemoryCommitment =
+          PFN_vkGetDeviceMemoryCommitment( vkGetDeviceProcAddr( device, "vkGetDeviceMemoryCommitment" ) );
+        vkBindBufferMemory = PFN_vkBindBufferMemory( vkGetDeviceProcAddr( device, "vkBindBufferMemory" ) );
+        vkBindImageMemory  = PFN_vkBindImageMemory( vkGetDeviceProcAddr( device, "vkBindImageMemory" ) );
+        vkGetBufferMemoryRequirements =
+          PFN_vkGetBufferMemoryRequirements( vkGetDeviceProcAddr( device, "vkGetBufferMemoryRequirements" ) );
+        vkGetImageMemoryRequirements =
+          PFN_vkGetImageMemoryRequirements( vkGetDeviceProcAddr( device, "vkGetImageMemoryRequirements" ) );
+        vkGetImageSparseMemoryRequirements =
+          PFN_vkGetImageSparseMemoryRequirements( vkGetDeviceProcAddr( device, "vkGetImageSparseMemoryRequirements" ) );
+        vkQueueBindSparse     = PFN_vkQueueBindSparse( vkGetDeviceProcAddr( device, "vkQueueBindSparse" ) );
+        vkCreateFence         = PFN_vkCreateFence( vkGetDeviceProcAddr( device, "vkCreateFence" ) );
+        vkDestroyFence        = PFN_vkDestroyFence( vkGetDeviceProcAddr( device, "vkDestroyFence" ) );
+        vkResetFences         = PFN_vkResetFences( vkGetDeviceProcAddr( device, "vkResetFences" ) );
+        vkGetFenceStatus      = PFN_vkGetFenceStatus( vkGetDeviceProcAddr( device, "vkGetFenceStatus" ) );
+        vkWaitForFences       = PFN_vkWaitForFences( vkGetDeviceProcAddr( device, "vkWaitForFences" ) );
+        vkCreateSemaphore     = PFN_vkCreateSemaphore( vkGetDeviceProcAddr( device, "vkCreateSemaphore" ) );
+        vkDestroySemaphore    = PFN_vkDestroySemaphore( vkGetDeviceProcAddr( device, "vkDestroySemaphore" ) );
+        vkCreateEvent         = PFN_vkCreateEvent( vkGetDeviceProcAddr( device, "vkCreateEvent" ) );
+        vkDestroyEvent        = PFN_vkDestroyEvent( vkGetDeviceProcAddr( device, "vkDestroyEvent" ) );
+        vkGetEventStatus      = PFN_vkGetEventStatus( vkGetDeviceProcAddr( device, "vkGetEventStatus" ) );
+        vkSetEvent            = PFN_vkSetEvent( vkGetDeviceProcAddr( device, "vkSetEvent" ) );
+        vkResetEvent          = PFN_vkResetEvent( vkGetDeviceProcAddr( device, "vkResetEvent" ) );
+        vkCreateQueryPool     = PFN_vkCreateQueryPool( vkGetDeviceProcAddr( device, "vkCreateQueryPool" ) );
+        vkDestroyQueryPool    = PFN_vkDestroyQueryPool( vkGetDeviceProcAddr( device, "vkDestroyQueryPool" ) );
+        vkGetQueryPoolResults = PFN_vkGetQueryPoolResults( vkGetDeviceProcAddr( device, "vkGetQueryPoolResults" ) );
+        vkCreateBuffer        = PFN_vkCreateBuffer( vkGetDeviceProcAddr( device, "vkCreateBuffer" ) );
+        vkDestroyBuffer       = PFN_vkDestroyBuffer( vkGetDeviceProcAddr( device, "vkDestroyBuffer" ) );
+        vkCreateBufferView    = PFN_vkCreateBufferView( vkGetDeviceProcAddr( device, "vkCreateBufferView" ) );
+        vkDestroyBufferView   = PFN_vkDestroyBufferView( vkGetDeviceProcAddr( device, "vkDestroyBufferView" ) );
+        vkCreateImage         = PFN_vkCreateImage( vkGetDeviceProcAddr( device, "vkCreateImage" ) );
+        vkDestroyImage        = PFN_vkDestroyImage( vkGetDeviceProcAddr( device, "vkDestroyImage" ) );
+        vkGetImageSubresourceLayout =
+          PFN_vkGetImageSubresourceLayout( vkGetDeviceProcAddr( device, "vkGetImageSubresourceLayout" ) );
+        vkCreateImageView      = PFN_vkCreateImageView( vkGetDeviceProcAddr( device, "vkCreateImageView" ) );
+        vkDestroyImageView     = PFN_vkDestroyImageView( vkGetDeviceProcAddr( device, "vkDestroyImageView" ) );
+        vkCreateShaderModule   = PFN_vkCreateShaderModule( vkGetDeviceProcAddr( device, "vkCreateShaderModule" ) );
+        vkDestroyShaderModule  = PFN_vkDestroyShaderModule( vkGetDeviceProcAddr( device, "vkDestroyShaderModule" ) );
+        vkCreatePipelineCache  = PFN_vkCreatePipelineCache( vkGetDeviceProcAddr( device, "vkCreatePipelineCache" ) );
+        vkDestroyPipelineCache = PFN_vkDestroyPipelineCache( vkGetDeviceProcAddr( device, "vkDestroyPipelineCache" ) );
+        vkGetPipelineCacheData = PFN_vkGetPipelineCacheData( vkGetDeviceProcAddr( device, "vkGetPipelineCacheData" ) );
+        vkMergePipelineCaches  = PFN_vkMergePipelineCaches( vkGetDeviceProcAddr( device, "vkMergePipelineCaches" ) );
+        vkCreateGraphicsPipelines =
+          PFN_vkCreateGraphicsPipelines( vkGetDeviceProcAddr( device, "vkCreateGraphicsPipelines" ) );
+        vkCreateComputePipelines =
+          PFN_vkCreateComputePipelines( vkGetDeviceProcAddr( device, "vkCreateComputePipelines" ) );
+        vkDestroyPipeline      = PFN_vkDestroyPipeline( vkGetDeviceProcAddr( device, "vkDestroyPipeline" ) );
+        vkCreatePipelineLayout = PFN_vkCreatePipelineLayout( vkGetDeviceProcAddr( device, "vkCreatePipelineLayout" ) );
+        vkDestroyPipelineLayout =
+          PFN_vkDestroyPipelineLayout( vkGetDeviceProcAddr( device, "vkDestroyPipelineLayout" ) );
+        vkCreateSampler  = PFN_vkCreateSampler( vkGetDeviceProcAddr( device, "vkCreateSampler" ) );
+        vkDestroySampler = PFN_vkDestroySampler( vkGetDeviceProcAddr( device, "vkDestroySampler" ) );
+        vkCreateDescriptorSetLayout =
+          PFN_vkCreateDescriptorSetLayout( vkGetDeviceProcAddr( device, "vkCreateDescriptorSetLayout" ) );
+        vkDestroyDescriptorSetLayout =
+          PFN_vkDestroyDescriptorSetLayout( vkGetDeviceProcAddr( device, "vkDestroyDescriptorSetLayout" ) );
+        vkCreateDescriptorPool = PFN_vkCreateDescriptorPool( vkGetDeviceProcAddr( device, "vkCreateDescriptorPool" ) );
+        vkDestroyDescriptorPool =
+          PFN_vkDestroyDescriptorPool( vkGetDeviceProcAddr( device, "vkDestroyDescriptorPool" ) );
+        vkResetDescriptorPool = PFN_vkResetDescriptorPool( vkGetDeviceProcAddr( device, "vkResetDescriptorPool" ) );
         vkAllocateDescriptorSets =
           PFN_vkAllocateDescriptorSets( vkGetDeviceProcAddr( device, "vkAllocateDescriptorSets" ) );
-        vkAllocateMemory     = PFN_vkAllocateMemory( vkGetDeviceProcAddr( device, "vkAllocateMemory" ) );
-        vkBeginCommandBuffer = PFN_vkBeginCommandBuffer( vkGetDeviceProcAddr( device, "vkBeginCommandBuffer" ) );
-        vkBindAccelerationStructureMemoryNV = PFN_vkBindAccelerationStructureMemoryNV(
-          vkGetDeviceProcAddr( device, "vkBindAccelerationStructureMemoryNV" ) );
-        vkBindBufferMemory     = PFN_vkBindBufferMemory( vkGetDeviceProcAddr( device, "vkBindBufferMemory" ) );
-        vkBindBufferMemory2    = PFN_vkBindBufferMemory2( vkGetDeviceProcAddr( device, "vkBindBufferMemory2" ) );
-        vkBindBufferMemory2KHR = PFN_vkBindBufferMemory2KHR( vkGetDeviceProcAddr( device, "vkBindBufferMemory2KHR" ) );
-        if ( !vkBindBufferMemory2 )
-          vkBindBufferMemory2 = vkBindBufferMemory2KHR;
-        vkBindImageMemory     = PFN_vkBindImageMemory( vkGetDeviceProcAddr( device, "vkBindImageMemory" ) );
-        vkBindImageMemory2    = PFN_vkBindImageMemory2( vkGetDeviceProcAddr( device, "vkBindImageMemory2" ) );
-        vkBindImageMemory2KHR = PFN_vkBindImageMemory2KHR( vkGetDeviceProcAddr( device, "vkBindImageMemory2KHR" ) );
-        if ( !vkBindImageMemory2 )
-          vkBindImageMemory2 = vkBindImageMemory2KHR;
-#  if defined( VK_ENABLE_BETA_EXTENSIONS )
-        vkBindVideoSessionMemoryKHR =
-          PFN_vkBindVideoSessionMemoryKHR( vkGetDeviceProcAddr( device, "vkBindVideoSessionMemoryKHR" ) );
-#  endif /*VK_ENABLE_BETA_EXTENSIONS*/
-        vkBuildAccelerationStructuresKHR =
-          PFN_vkBuildAccelerationStructuresKHR( vkGetDeviceProcAddr( device, "vkBuildAccelerationStructuresKHR" ) );
-        vkCmdBeginConditionalRenderingEXT =
-          PFN_vkCmdBeginConditionalRenderingEXT( vkGetDeviceProcAddr( device, "vkCmdBeginConditionalRenderingEXT" ) );
-        vkCmdBeginDebugUtilsLabelEXT =
-          PFN_vkCmdBeginDebugUtilsLabelEXT( vkGetDeviceProcAddr( device, "vkCmdBeginDebugUtilsLabelEXT" ) );
-        vkCmdBeginQuery = PFN_vkCmdBeginQuery( vkGetDeviceProcAddr( device, "vkCmdBeginQuery" ) );
-        vkCmdBeginQueryIndexedEXT =
-          PFN_vkCmdBeginQueryIndexedEXT( vkGetDeviceProcAddr( device, "vkCmdBeginQueryIndexedEXT" ) );
-        vkCmdBeginRenderPass  = PFN_vkCmdBeginRenderPass( vkGetDeviceProcAddr( device, "vkCmdBeginRenderPass" ) );
-        vkCmdBeginRenderPass2 = PFN_vkCmdBeginRenderPass2( vkGetDeviceProcAddr( device, "vkCmdBeginRenderPass2" ) );
-        vkCmdBeginRenderPass2KHR =
-          PFN_vkCmdBeginRenderPass2KHR( vkGetDeviceProcAddr( device, "vkCmdBeginRenderPass2KHR" ) );
-        if ( !vkCmdBeginRenderPass2 )
-          vkCmdBeginRenderPass2 = vkCmdBeginRenderPass2KHR;
-        vkCmdBeginTransformFeedbackEXT =
-          PFN_vkCmdBeginTransformFeedbackEXT( vkGetDeviceProcAddr( device, "vkCmdBeginTransformFeedbackEXT" ) );
-#  if defined( VK_ENABLE_BETA_EXTENSIONS )
-        vkCmdBeginVideoCodingKHR =
-          PFN_vkCmdBeginVideoCodingKHR( vkGetDeviceProcAddr( device, "vkCmdBeginVideoCodingKHR" ) );
-#  endif /*VK_ENABLE_BETA_EXTENSIONS*/
+        vkFreeDescriptorSets   = PFN_vkFreeDescriptorSets( vkGetDeviceProcAddr( device, "vkFreeDescriptorSets" ) );
+        vkUpdateDescriptorSets = PFN_vkUpdateDescriptorSets( vkGetDeviceProcAddr( device, "vkUpdateDescriptorSets" ) );
+        vkCreateFramebuffer    = PFN_vkCreateFramebuffer( vkGetDeviceProcAddr( device, "vkCreateFramebuffer" ) );
+        vkDestroyFramebuffer   = PFN_vkDestroyFramebuffer( vkGetDeviceProcAddr( device, "vkDestroyFramebuffer" ) );
+        vkCreateRenderPass     = PFN_vkCreateRenderPass( vkGetDeviceProcAddr( device, "vkCreateRenderPass" ) );
+        vkDestroyRenderPass    = PFN_vkDestroyRenderPass( vkGetDeviceProcAddr( device, "vkDestroyRenderPass" ) );
+        vkGetRenderAreaGranularity =
+          PFN_vkGetRenderAreaGranularity( vkGetDeviceProcAddr( device, "vkGetRenderAreaGranularity" ) );
+        vkCreateCommandPool  = PFN_vkCreateCommandPool( vkGetDeviceProcAddr( device, "vkCreateCommandPool" ) );
+        vkDestroyCommandPool = PFN_vkDestroyCommandPool( vkGetDeviceProcAddr( device, "vkDestroyCommandPool" ) );
+        vkResetCommandPool   = PFN_vkResetCommandPool( vkGetDeviceProcAddr( device, "vkResetCommandPool" ) );
+        vkAllocateCommandBuffers =
+          PFN_vkAllocateCommandBuffers( vkGetDeviceProcAddr( device, "vkAllocateCommandBuffers" ) );
+        vkFreeCommandBuffers   = PFN_vkFreeCommandBuffers( vkGetDeviceProcAddr( device, "vkFreeCommandBuffers" ) );
+        vkBeginCommandBuffer   = PFN_vkBeginCommandBuffer( vkGetDeviceProcAddr( device, "vkBeginCommandBuffer" ) );
+        vkEndCommandBuffer     = PFN_vkEndCommandBuffer( vkGetDeviceProcAddr( device, "vkEndCommandBuffer" ) );
+        vkResetCommandBuffer   = PFN_vkResetCommandBuffer( vkGetDeviceProcAddr( device, "vkResetCommandBuffer" ) );
+        vkCmdBindPipeline      = PFN_vkCmdBindPipeline( vkGetDeviceProcAddr( device, "vkCmdBindPipeline" ) );
+        vkCmdSetViewport       = PFN_vkCmdSetViewport( vkGetDeviceProcAddr( device, "vkCmdSetViewport" ) );
+        vkCmdSetScissor        = PFN_vkCmdSetScissor( vkGetDeviceProcAddr( device, "vkCmdSetScissor" ) );
+        vkCmdSetLineWidth      = PFN_vkCmdSetLineWidth( vkGetDeviceProcAddr( device, "vkCmdSetLineWidth" ) );
+        vkCmdSetDepthBias      = PFN_vkCmdSetDepthBias( vkGetDeviceProcAddr( device, "vkCmdSetDepthBias" ) );
+        vkCmdSetBlendConstants = PFN_vkCmdSetBlendConstants( vkGetDeviceProcAddr( device, "vkCmdSetBlendConstants" ) );
+        vkCmdSetDepthBounds    = PFN_vkCmdSetDepthBounds( vkGetDeviceProcAddr( device, "vkCmdSetDepthBounds" ) );
+        vkCmdSetStencilCompareMask =
+          PFN_vkCmdSetStencilCompareMask( vkGetDeviceProcAddr( device, "vkCmdSetStencilCompareMask" ) );
+        vkCmdSetStencilWriteMask =
+          PFN_vkCmdSetStencilWriteMask( vkGetDeviceProcAddr( device, "vkCmdSetStencilWriteMask" ) );
+        vkCmdSetStencilReference =
+          PFN_vkCmdSetStencilReference( vkGetDeviceProcAddr( device, "vkCmdSetStencilReference" ) );
         vkCmdBindDescriptorSets =
           PFN_vkCmdBindDescriptorSets( vkGetDeviceProcAddr( device, "vkCmdBindDescriptorSets" ) );
-        vkCmdBindIndexBuffer = PFN_vkCmdBindIndexBuffer( vkGetDeviceProcAddr( device, "vkCmdBindIndexBuffer" ) );
-        vkCmdBindPipeline    = PFN_vkCmdBindPipeline( vkGetDeviceProcAddr( device, "vkCmdBindPipeline" ) );
-        vkCmdBindPipelineShaderGroupNV =
-          PFN_vkCmdBindPipelineShaderGroupNV( vkGetDeviceProcAddr( device, "vkCmdBindPipelineShaderGroupNV" ) );
-        vkCmdBindShadingRateImageNV =
-          PFN_vkCmdBindShadingRateImageNV( vkGetDeviceProcAddr( device, "vkCmdBindShadingRateImageNV" ) );
-        vkCmdBindTransformFeedbackBuffersEXT = PFN_vkCmdBindTransformFeedbackBuffersEXT(
-          vkGetDeviceProcAddr( device, "vkCmdBindTransformFeedbackBuffersEXT" ) );
+        vkCmdBindIndexBuffer   = PFN_vkCmdBindIndexBuffer( vkGetDeviceProcAddr( device, "vkCmdBindIndexBuffer" ) );
         vkCmdBindVertexBuffers = PFN_vkCmdBindVertexBuffers( vkGetDeviceProcAddr( device, "vkCmdBindVertexBuffers" ) );
-        vkCmdBindVertexBuffers2EXT =
-          PFN_vkCmdBindVertexBuffers2EXT( vkGetDeviceProcAddr( device, "vkCmdBindVertexBuffers2EXT" ) );
-        vkCmdBlitImage     = PFN_vkCmdBlitImage( vkGetDeviceProcAddr( device, "vkCmdBlitImage" ) );
-        vkCmdBlitImage2KHR = PFN_vkCmdBlitImage2KHR( vkGetDeviceProcAddr( device, "vkCmdBlitImage2KHR" ) );
-        vkCmdBuildAccelerationStructureNV =
-          PFN_vkCmdBuildAccelerationStructureNV( vkGetDeviceProcAddr( device, "vkCmdBuildAccelerationStructureNV" ) );
-        vkCmdBuildAccelerationStructuresIndirectKHR = PFN_vkCmdBuildAccelerationStructuresIndirectKHR(
-          vkGetDeviceProcAddr( device, "vkCmdBuildAccelerationStructuresIndirectKHR" ) );
-        vkCmdBuildAccelerationStructuresKHR = PFN_vkCmdBuildAccelerationStructuresKHR(
-          vkGetDeviceProcAddr( device, "vkCmdBuildAccelerationStructuresKHR" ) );
-        vkCmdClearAttachments = PFN_vkCmdClearAttachments( vkGetDeviceProcAddr( device, "vkCmdClearAttachments" ) );
-        vkCmdClearColorImage  = PFN_vkCmdClearColorImage( vkGetDeviceProcAddr( device, "vkCmdClearColorImage" ) );
+        vkCmdDraw              = PFN_vkCmdDraw( vkGetDeviceProcAddr( device, "vkCmdDraw" ) );
+        vkCmdDrawIndexed       = PFN_vkCmdDrawIndexed( vkGetDeviceProcAddr( device, "vkCmdDrawIndexed" ) );
+        vkCmdDrawIndirect      = PFN_vkCmdDrawIndirect( vkGetDeviceProcAddr( device, "vkCmdDrawIndirect" ) );
+        vkCmdDrawIndexedIndirect =
+          PFN_vkCmdDrawIndexedIndirect( vkGetDeviceProcAddr( device, "vkCmdDrawIndexedIndirect" ) );
+        vkCmdDispatch          = PFN_vkCmdDispatch( vkGetDeviceProcAddr( device, "vkCmdDispatch" ) );
+        vkCmdDispatchIndirect  = PFN_vkCmdDispatchIndirect( vkGetDeviceProcAddr( device, "vkCmdDispatchIndirect" ) );
+        vkCmdCopyBuffer        = PFN_vkCmdCopyBuffer( vkGetDeviceProcAddr( device, "vkCmdCopyBuffer" ) );
+        vkCmdCopyImage         = PFN_vkCmdCopyImage( vkGetDeviceProcAddr( device, "vkCmdCopyImage" ) );
+        vkCmdBlitImage         = PFN_vkCmdBlitImage( vkGetDeviceProcAddr( device, "vkCmdBlitImage" ) );
+        vkCmdCopyBufferToImage = PFN_vkCmdCopyBufferToImage( vkGetDeviceProcAddr( device, "vkCmdCopyBufferToImage" ) );
+        vkCmdCopyImageToBuffer = PFN_vkCmdCopyImageToBuffer( vkGetDeviceProcAddr( device, "vkCmdCopyImageToBuffer" ) );
+        vkCmdUpdateBuffer      = PFN_vkCmdUpdateBuffer( vkGetDeviceProcAddr( device, "vkCmdUpdateBuffer" ) );
+        vkCmdFillBuffer        = PFN_vkCmdFillBuffer( vkGetDeviceProcAddr( device, "vkCmdFillBuffer" ) );
+        vkCmdClearColorImage   = PFN_vkCmdClearColorImage( vkGetDeviceProcAddr( device, "vkCmdClearColorImage" ) );
         vkCmdClearDepthStencilImage =
           PFN_vkCmdClearDepthStencilImage( vkGetDeviceProcAddr( device, "vkCmdClearDepthStencilImage" ) );
-#  if defined( VK_ENABLE_BETA_EXTENSIONS )
-        vkCmdControlVideoCodingKHR =
-          PFN_vkCmdControlVideoCodingKHR( vkGetDeviceProcAddr( device, "vkCmdControlVideoCodingKHR" ) );
-#  endif /*VK_ENABLE_BETA_EXTENSIONS*/
-        vkCmdCopyAccelerationStructureKHR =
-          PFN_vkCmdCopyAccelerationStructureKHR( vkGetDeviceProcAddr( device, "vkCmdCopyAccelerationStructureKHR" ) );
-        vkCmdCopyAccelerationStructureNV =
-          PFN_vkCmdCopyAccelerationStructureNV( vkGetDeviceProcAddr( device, "vkCmdCopyAccelerationStructureNV" ) );
-        vkCmdCopyAccelerationStructureToMemoryKHR = PFN_vkCmdCopyAccelerationStructureToMemoryKHR(
-          vkGetDeviceProcAddr( device, "vkCmdCopyAccelerationStructureToMemoryKHR" ) );
-        vkCmdCopyBuffer        = PFN_vkCmdCopyBuffer( vkGetDeviceProcAddr( device, "vkCmdCopyBuffer" ) );
-        vkCmdCopyBuffer2KHR    = PFN_vkCmdCopyBuffer2KHR( vkGetDeviceProcAddr( device, "vkCmdCopyBuffer2KHR" ) );
-        vkCmdCopyBufferToImage = PFN_vkCmdCopyBufferToImage( vkGetDeviceProcAddr( device, "vkCmdCopyBufferToImage" ) );
-        vkCmdCopyBufferToImage2KHR =
-          PFN_vkCmdCopyBufferToImage2KHR( vkGetDeviceProcAddr( device, "vkCmdCopyBufferToImage2KHR" ) );
-        vkCmdCopyImage         = PFN_vkCmdCopyImage( vkGetDeviceProcAddr( device, "vkCmdCopyImage" ) );
-        vkCmdCopyImage2KHR     = PFN_vkCmdCopyImage2KHR( vkGetDeviceProcAddr( device, "vkCmdCopyImage2KHR" ) );
-        vkCmdCopyImageToBuffer = PFN_vkCmdCopyImageToBuffer( vkGetDeviceProcAddr( device, "vkCmdCopyImageToBuffer" ) );
-        vkCmdCopyImageToBuffer2KHR =
-          PFN_vkCmdCopyImageToBuffer2KHR( vkGetDeviceProcAddr( device, "vkCmdCopyImageToBuffer2KHR" ) );
-        vkCmdCopyMemoryToAccelerationStructureKHR = PFN_vkCmdCopyMemoryToAccelerationStructureKHR(
-          vkGetDeviceProcAddr( device, "vkCmdCopyMemoryToAccelerationStructureKHR" ) );
+        vkCmdClearAttachments = PFN_vkCmdClearAttachments( vkGetDeviceProcAddr( device, "vkCmdClearAttachments" ) );
+        vkCmdResolveImage     = PFN_vkCmdResolveImage( vkGetDeviceProcAddr( device, "vkCmdResolveImage" ) );
+        vkCmdSetEvent         = PFN_vkCmdSetEvent( vkGetDeviceProcAddr( device, "vkCmdSetEvent" ) );
+        vkCmdResetEvent       = PFN_vkCmdResetEvent( vkGetDeviceProcAddr( device, "vkCmdResetEvent" ) );
+        vkCmdWaitEvents       = PFN_vkCmdWaitEvents( vkGetDeviceProcAddr( device, "vkCmdWaitEvents" ) );
+        vkCmdPipelineBarrier  = PFN_vkCmdPipelineBarrier( vkGetDeviceProcAddr( device, "vkCmdPipelineBarrier" ) );
+        vkCmdBeginQuery       = PFN_vkCmdBeginQuery( vkGetDeviceProcAddr( device, "vkCmdBeginQuery" ) );
+        vkCmdEndQuery         = PFN_vkCmdEndQuery( vkGetDeviceProcAddr( device, "vkCmdEndQuery" ) );
+        vkCmdResetQueryPool   = PFN_vkCmdResetQueryPool( vkGetDeviceProcAddr( device, "vkCmdResetQueryPool" ) );
+        vkCmdWriteTimestamp   = PFN_vkCmdWriteTimestamp( vkGetDeviceProcAddr( device, "vkCmdWriteTimestamp" ) );
         vkCmdCopyQueryPoolResults =
           PFN_vkCmdCopyQueryPoolResults( vkGetDeviceProcAddr( device, "vkCmdCopyQueryPoolResults" ) );
-        vkCmdCuLaunchKernelNVX = PFN_vkCmdCuLaunchKernelNVX( vkGetDeviceProcAddr( device, "vkCmdCuLaunchKernelNVX" ) );
+        vkCmdPushConstants   = PFN_vkCmdPushConstants( vkGetDeviceProcAddr( device, "vkCmdPushConstants" ) );
+        vkCmdBeginRenderPass = PFN_vkCmdBeginRenderPass( vkGetDeviceProcAddr( device, "vkCmdBeginRenderPass" ) );
+        vkCmdNextSubpass     = PFN_vkCmdNextSubpass( vkGetDeviceProcAddr( device, "vkCmdNextSubpass" ) );
+        vkCmdEndRenderPass   = PFN_vkCmdEndRenderPass( vkGetDeviceProcAddr( device, "vkCmdEndRenderPass" ) );
+        vkCmdExecuteCommands = PFN_vkCmdExecuteCommands( vkGetDeviceProcAddr( device, "vkCmdExecuteCommands" ) );
+
+        //=== VK_VERSION_1_1 ===
+        vkBindBufferMemory2 = PFN_vkBindBufferMemory2( vkGetDeviceProcAddr( device, "vkBindBufferMemory2" ) );
+        vkBindImageMemory2  = PFN_vkBindImageMemory2( vkGetDeviceProcAddr( device, "vkBindImageMemory2" ) );
+        vkGetDeviceGroupPeerMemoryFeatures =
+          PFN_vkGetDeviceGroupPeerMemoryFeatures( vkGetDeviceProcAddr( device, "vkGetDeviceGroupPeerMemoryFeatures" ) );
+        vkCmdSetDeviceMask = PFN_vkCmdSetDeviceMask( vkGetDeviceProcAddr( device, "vkCmdSetDeviceMask" ) );
+        vkCmdDispatchBase  = PFN_vkCmdDispatchBase( vkGetDeviceProcAddr( device, "vkCmdDispatchBase" ) );
+        vkGetImageMemoryRequirements2 =
+          PFN_vkGetImageMemoryRequirements2( vkGetDeviceProcAddr( device, "vkGetImageMemoryRequirements2" ) );
+        vkGetBufferMemoryRequirements2 =
+          PFN_vkGetBufferMemoryRequirements2( vkGetDeviceProcAddr( device, "vkGetBufferMemoryRequirements2" ) );
+        vkGetImageSparseMemoryRequirements2 = PFN_vkGetImageSparseMemoryRequirements2(
+          vkGetDeviceProcAddr( device, "vkGetImageSparseMemoryRequirements2" ) );
+        vkTrimCommandPool = PFN_vkTrimCommandPool( vkGetDeviceProcAddr( device, "vkTrimCommandPool" ) );
+        vkGetDeviceQueue2 = PFN_vkGetDeviceQueue2( vkGetDeviceProcAddr( device, "vkGetDeviceQueue2" ) );
+        vkCreateSamplerYcbcrConversion =
+          PFN_vkCreateSamplerYcbcrConversion( vkGetDeviceProcAddr( device, "vkCreateSamplerYcbcrConversion" ) );
+        vkDestroySamplerYcbcrConversion =
+          PFN_vkDestroySamplerYcbcrConversion( vkGetDeviceProcAddr( device, "vkDestroySamplerYcbcrConversion" ) );
+        vkCreateDescriptorUpdateTemplate =
+          PFN_vkCreateDescriptorUpdateTemplate( vkGetDeviceProcAddr( device, "vkCreateDescriptorUpdateTemplate" ) );
+        vkDestroyDescriptorUpdateTemplate =
+          PFN_vkDestroyDescriptorUpdateTemplate( vkGetDeviceProcAddr( device, "vkDestroyDescriptorUpdateTemplate" ) );
+        vkUpdateDescriptorSetWithTemplate =
+          PFN_vkUpdateDescriptorSetWithTemplate( vkGetDeviceProcAddr( device, "vkUpdateDescriptorSetWithTemplate" ) );
+        vkGetDescriptorSetLayoutSupport =
+          PFN_vkGetDescriptorSetLayoutSupport( vkGetDeviceProcAddr( device, "vkGetDescriptorSetLayoutSupport" ) );
+
+        //=== VK_VERSION_1_2 ===
+        vkCmdDrawIndirectCount = PFN_vkCmdDrawIndirectCount( vkGetDeviceProcAddr( device, "vkCmdDrawIndirectCount" ) );
+        vkCmdDrawIndexedIndirectCount =
+          PFN_vkCmdDrawIndexedIndirectCount( vkGetDeviceProcAddr( device, "vkCmdDrawIndexedIndirectCount" ) );
+        vkCreateRenderPass2   = PFN_vkCreateRenderPass2( vkGetDeviceProcAddr( device, "vkCreateRenderPass2" ) );
+        vkCmdBeginRenderPass2 = PFN_vkCmdBeginRenderPass2( vkGetDeviceProcAddr( device, "vkCmdBeginRenderPass2" ) );
+        vkCmdNextSubpass2     = PFN_vkCmdNextSubpass2( vkGetDeviceProcAddr( device, "vkCmdNextSubpass2" ) );
+        vkCmdEndRenderPass2   = PFN_vkCmdEndRenderPass2( vkGetDeviceProcAddr( device, "vkCmdEndRenderPass2" ) );
+        vkResetQueryPool      = PFN_vkResetQueryPool( vkGetDeviceProcAddr( device, "vkResetQueryPool" ) );
+        vkGetSemaphoreCounterValue =
+          PFN_vkGetSemaphoreCounterValue( vkGetDeviceProcAddr( device, "vkGetSemaphoreCounterValue" ) );
+        vkWaitSemaphores  = PFN_vkWaitSemaphores( vkGetDeviceProcAddr( device, "vkWaitSemaphores" ) );
+        vkSignalSemaphore = PFN_vkSignalSemaphore( vkGetDeviceProcAddr( device, "vkSignalSemaphore" ) );
+        vkGetBufferDeviceAddress =
+          PFN_vkGetBufferDeviceAddress( vkGetDeviceProcAddr( device, "vkGetBufferDeviceAddress" ) );
+        vkGetBufferOpaqueCaptureAddress =
+          PFN_vkGetBufferOpaqueCaptureAddress( vkGetDeviceProcAddr( device, "vkGetBufferOpaqueCaptureAddress" ) );
+        vkGetDeviceMemoryOpaqueCaptureAddress = PFN_vkGetDeviceMemoryOpaqueCaptureAddress(
+          vkGetDeviceProcAddr( device, "vkGetDeviceMemoryOpaqueCaptureAddress" ) );
+
+        //=== VK_AMD_buffer_marker ===
+        vkCmdWriteBufferMarkerAMD =
+          PFN_vkCmdWriteBufferMarkerAMD( vkGetDeviceProcAddr( device, "vkCmdWriteBufferMarkerAMD" ) );
+
+        //=== VK_AMD_display_native_hdr ===
+        vkSetLocalDimmingAMD = PFN_vkSetLocalDimmingAMD( vkGetDeviceProcAddr( device, "vkSetLocalDimmingAMD" ) );
+
+        //=== VK_AMD_draw_indirect_count ===
+        vkCmdDrawIndirectCountAMD =
+          PFN_vkCmdDrawIndirectCountAMD( vkGetDeviceProcAddr( device, "vkCmdDrawIndirectCountAMD" ) );
+        if ( !vkCmdDrawIndirectCount )
+          vkCmdDrawIndirectCount = vkCmdDrawIndirectCountAMD;
+        vkCmdDrawIndexedIndirectCountAMD =
+          PFN_vkCmdDrawIndexedIndirectCountAMD( vkGetDeviceProcAddr( device, "vkCmdDrawIndexedIndirectCountAMD" ) );
+        if ( !vkCmdDrawIndexedIndirectCount )
+          vkCmdDrawIndexedIndirectCount = vkCmdDrawIndexedIndirectCountAMD;
+
+        //=== VK_AMD_shader_info ===
+        vkGetShaderInfoAMD = PFN_vkGetShaderInfoAMD( vkGetDeviceProcAddr( device, "vkGetShaderInfoAMD" ) );
+
+#  if defined( VK_USE_PLATFORM_ANDROID_KHR )
+        //=== VK_ANDROID_external_memory_android_hardware_buffer ===
+        vkGetAndroidHardwareBufferPropertiesANDROID = PFN_vkGetAndroidHardwareBufferPropertiesANDROID(
+          vkGetDeviceProcAddr( device, "vkGetAndroidHardwareBufferPropertiesANDROID" ) );
+        vkGetMemoryAndroidHardwareBufferANDROID = PFN_vkGetMemoryAndroidHardwareBufferANDROID(
+          vkGetDeviceProcAddr( device, "vkGetMemoryAndroidHardwareBufferANDROID" ) );
+#  endif /*VK_USE_PLATFORM_ANDROID_KHR*/
+
+        //=== VK_EXT_buffer_device_address ===
+        vkGetBufferDeviceAddressEXT =
+          PFN_vkGetBufferDeviceAddressEXT( vkGetDeviceProcAddr( device, "vkGetBufferDeviceAddressEXT" ) );
+        if ( !vkGetBufferDeviceAddress )
+          vkGetBufferDeviceAddress = vkGetBufferDeviceAddressEXT;
+
+        //=== VK_EXT_calibrated_timestamps ===
+        vkGetCalibratedTimestampsEXT =
+          PFN_vkGetCalibratedTimestampsEXT( vkGetDeviceProcAddr( device, "vkGetCalibratedTimestampsEXT" ) );
+
+        //=== VK_EXT_color_write_enable ===
+        vkCmdSetColorWriteEnableEXT =
+          PFN_vkCmdSetColorWriteEnableEXT( vkGetDeviceProcAddr( device, "vkCmdSetColorWriteEnableEXT" ) );
+
+        //=== VK_EXT_conditional_rendering ===
+        vkCmdBeginConditionalRenderingEXT =
+          PFN_vkCmdBeginConditionalRenderingEXT( vkGetDeviceProcAddr( device, "vkCmdBeginConditionalRenderingEXT" ) );
+        vkCmdEndConditionalRenderingEXT =
+          PFN_vkCmdEndConditionalRenderingEXT( vkGetDeviceProcAddr( device, "vkCmdEndConditionalRenderingEXT" ) );
+
+        //=== VK_EXT_debug_marker ===
+        vkDebugMarkerSetObjectTagEXT =
+          PFN_vkDebugMarkerSetObjectTagEXT( vkGetDeviceProcAddr( device, "vkDebugMarkerSetObjectTagEXT" ) );
+        vkDebugMarkerSetObjectNameEXT =
+          PFN_vkDebugMarkerSetObjectNameEXT( vkGetDeviceProcAddr( device, "vkDebugMarkerSetObjectNameEXT" ) );
         vkCmdDebugMarkerBeginEXT =
           PFN_vkCmdDebugMarkerBeginEXT( vkGetDeviceProcAddr( device, "vkCmdDebugMarkerBeginEXT" ) );
         vkCmdDebugMarkerEndEXT = PFN_vkCmdDebugMarkerEndEXT( vkGetDeviceProcAddr( device, "vkCmdDebugMarkerEndEXT" ) );
         vkCmdDebugMarkerInsertEXT =
           PFN_vkCmdDebugMarkerInsertEXT( vkGetDeviceProcAddr( device, "vkCmdDebugMarkerInsertEXT" ) );
-#  if defined( VK_ENABLE_BETA_EXTENSIONS )
-        vkCmdDecodeVideoKHR = PFN_vkCmdDecodeVideoKHR( vkGetDeviceProcAddr( device, "vkCmdDecodeVideoKHR" ) );
-#  endif /*VK_ENABLE_BETA_EXTENSIONS*/
-        vkCmdDispatch        = PFN_vkCmdDispatch( vkGetDeviceProcAddr( device, "vkCmdDispatch" ) );
-        vkCmdDispatchBase    = PFN_vkCmdDispatchBase( vkGetDeviceProcAddr( device, "vkCmdDispatchBase" ) );
-        vkCmdDispatchBaseKHR = PFN_vkCmdDispatchBaseKHR( vkGetDeviceProcAddr( device, "vkCmdDispatchBaseKHR" ) );
-        if ( !vkCmdDispatchBase )
-          vkCmdDispatchBase = vkCmdDispatchBaseKHR;
-        vkCmdDispatchIndirect = PFN_vkCmdDispatchIndirect( vkGetDeviceProcAddr( device, "vkCmdDispatchIndirect" ) );
-        vkCmdDraw             = PFN_vkCmdDraw( vkGetDeviceProcAddr( device, "vkCmdDraw" ) );
-        vkCmdDrawIndexed      = PFN_vkCmdDrawIndexed( vkGetDeviceProcAddr( device, "vkCmdDrawIndexed" ) );
-        vkCmdDrawIndexedIndirect =
-          PFN_vkCmdDrawIndexedIndirect( vkGetDeviceProcAddr( device, "vkCmdDrawIndexedIndirect" ) );
-        vkCmdDrawIndexedIndirectCount =
-          PFN_vkCmdDrawIndexedIndirectCount( vkGetDeviceProcAddr( device, "vkCmdDrawIndexedIndirectCount" ) );
-        vkCmdDrawIndexedIndirectCountAMD =
-          PFN_vkCmdDrawIndexedIndirectCountAMD( vkGetDeviceProcAddr( device, "vkCmdDrawIndexedIndirectCountAMD" ) );
-        if ( !vkCmdDrawIndexedIndirectCount )
-          vkCmdDrawIndexedIndirectCount = vkCmdDrawIndexedIndirectCountAMD;
-        vkCmdDrawIndexedIndirectCountKHR =
-          PFN_vkCmdDrawIndexedIndirectCountKHR( vkGetDeviceProcAddr( device, "vkCmdDrawIndexedIndirectCountKHR" ) );
-        if ( !vkCmdDrawIndexedIndirectCount )
-          vkCmdDrawIndexedIndirectCount = vkCmdDrawIndexedIndirectCountKHR;
-        vkCmdDrawIndirect = PFN_vkCmdDrawIndirect( vkGetDeviceProcAddr( device, "vkCmdDrawIndirect" ) );
-        vkCmdDrawIndirectByteCountEXT =
-          PFN_vkCmdDrawIndirectByteCountEXT( vkGetDeviceProcAddr( device, "vkCmdDrawIndirectByteCountEXT" ) );
-        vkCmdDrawIndirectCount = PFN_vkCmdDrawIndirectCount( vkGetDeviceProcAddr( device, "vkCmdDrawIndirectCount" ) );
-        vkCmdDrawIndirectCountAMD =
-          PFN_vkCmdDrawIndirectCountAMD( vkGetDeviceProcAddr( device, "vkCmdDrawIndirectCountAMD" ) );
-        if ( !vkCmdDrawIndirectCount )
-          vkCmdDrawIndirectCount = vkCmdDrawIndirectCountAMD;
-        vkCmdDrawIndirectCountKHR =
-          PFN_vkCmdDrawIndirectCountKHR( vkGetDeviceProcAddr( device, "vkCmdDrawIndirectCountKHR" ) );
-        if ( !vkCmdDrawIndirectCount )
-          vkCmdDrawIndirectCount = vkCmdDrawIndirectCountKHR;
-        vkCmdDrawMeshTasksIndirectCountNV =
-          PFN_vkCmdDrawMeshTasksIndirectCountNV( vkGetDeviceProcAddr( device, "vkCmdDrawMeshTasksIndirectCountNV" ) );
-        vkCmdDrawMeshTasksIndirectNV =
-          PFN_vkCmdDrawMeshTasksIndirectNV( vkGetDeviceProcAddr( device, "vkCmdDrawMeshTasksIndirectNV" ) );
-        vkCmdDrawMeshTasksNV = PFN_vkCmdDrawMeshTasksNV( vkGetDeviceProcAddr( device, "vkCmdDrawMeshTasksNV" ) );
-        vkCmdDrawMultiEXT    = PFN_vkCmdDrawMultiEXT( vkGetDeviceProcAddr( device, "vkCmdDrawMultiEXT" ) );
-        vkCmdDrawMultiIndexedEXT =
-          PFN_vkCmdDrawMultiIndexedEXT( vkGetDeviceProcAddr( device, "vkCmdDrawMultiIndexedEXT" ) );
-#  if defined( VK_ENABLE_BETA_EXTENSIONS )
-        vkCmdEncodeVideoKHR = PFN_vkCmdEncodeVideoKHR( vkGetDeviceProcAddr( device, "vkCmdEncodeVideoKHR" ) );
-#  endif /*VK_ENABLE_BETA_EXTENSIONS*/
-        vkCmdEndConditionalRenderingEXT =
-          PFN_vkCmdEndConditionalRenderingEXT( vkGetDeviceProcAddr( device, "vkCmdEndConditionalRenderingEXT" ) );
+
+        //=== VK_EXT_debug_utils ===
+        vkSetDebugUtilsObjectNameEXT =
+          PFN_vkSetDebugUtilsObjectNameEXT( vkGetDeviceProcAddr( device, "vkSetDebugUtilsObjectNameEXT" ) );
+        vkSetDebugUtilsObjectTagEXT =
+          PFN_vkSetDebugUtilsObjectTagEXT( vkGetDeviceProcAddr( device, "vkSetDebugUtilsObjectTagEXT" ) );
+        vkQueueBeginDebugUtilsLabelEXT =
+          PFN_vkQueueBeginDebugUtilsLabelEXT( vkGetDeviceProcAddr( device, "vkQueueBeginDebugUtilsLabelEXT" ) );
+        vkQueueEndDebugUtilsLabelEXT =
+          PFN_vkQueueEndDebugUtilsLabelEXT( vkGetDeviceProcAddr( device, "vkQueueEndDebugUtilsLabelEXT" ) );
+        vkQueueInsertDebugUtilsLabelEXT =
+          PFN_vkQueueInsertDebugUtilsLabelEXT( vkGetDeviceProcAddr( device, "vkQueueInsertDebugUtilsLabelEXT" ) );
+        vkCmdBeginDebugUtilsLabelEXT =
+          PFN_vkCmdBeginDebugUtilsLabelEXT( vkGetDeviceProcAddr( device, "vkCmdBeginDebugUtilsLabelEXT" ) );
         vkCmdEndDebugUtilsLabelEXT =
           PFN_vkCmdEndDebugUtilsLabelEXT( vkGetDeviceProcAddr( device, "vkCmdEndDebugUtilsLabelEXT" ) );
-        vkCmdEndQuery = PFN_vkCmdEndQuery( vkGetDeviceProcAddr( device, "vkCmdEndQuery" ) );
-        vkCmdEndQueryIndexedEXT =
-          PFN_vkCmdEndQueryIndexedEXT( vkGetDeviceProcAddr( device, "vkCmdEndQueryIndexedEXT" ) );
-        vkCmdEndRenderPass     = PFN_vkCmdEndRenderPass( vkGetDeviceProcAddr( device, "vkCmdEndRenderPass" ) );
-        vkCmdEndRenderPass2    = PFN_vkCmdEndRenderPass2( vkGetDeviceProcAddr( device, "vkCmdEndRenderPass2" ) );
-        vkCmdEndRenderPass2KHR = PFN_vkCmdEndRenderPass2KHR( vkGetDeviceProcAddr( device, "vkCmdEndRenderPass2KHR" ) );
-        if ( !vkCmdEndRenderPass2 )
-          vkCmdEndRenderPass2 = vkCmdEndRenderPass2KHR;
-        vkCmdEndTransformFeedbackEXT =
-          PFN_vkCmdEndTransformFeedbackEXT( vkGetDeviceProcAddr( device, "vkCmdEndTransformFeedbackEXT" ) );
-#  if defined( VK_ENABLE_BETA_EXTENSIONS )
-        vkCmdEndVideoCodingKHR = PFN_vkCmdEndVideoCodingKHR( vkGetDeviceProcAddr( device, "vkCmdEndVideoCodingKHR" ) );
-#  endif /*VK_ENABLE_BETA_EXTENSIONS*/
-        vkCmdExecuteCommands = PFN_vkCmdExecuteCommands( vkGetDeviceProcAddr( device, "vkCmdExecuteCommands" ) );
-        vkCmdExecuteGeneratedCommandsNV =
-          PFN_vkCmdExecuteGeneratedCommandsNV( vkGetDeviceProcAddr( device, "vkCmdExecuteGeneratedCommandsNV" ) );
-        vkCmdFillBuffer = PFN_vkCmdFillBuffer( vkGetDeviceProcAddr( device, "vkCmdFillBuffer" ) );
         vkCmdInsertDebugUtilsLabelEXT =
           PFN_vkCmdInsertDebugUtilsLabelEXT( vkGetDeviceProcAddr( device, "vkCmdInsertDebugUtilsLabelEXT" ) );
-        vkCmdNextSubpass     = PFN_vkCmdNextSubpass( vkGetDeviceProcAddr( device, "vkCmdNextSubpass" ) );
-        vkCmdNextSubpass2    = PFN_vkCmdNextSubpass2( vkGetDeviceProcAddr( device, "vkCmdNextSubpass2" ) );
-        vkCmdNextSubpass2KHR = PFN_vkCmdNextSubpass2KHR( vkGetDeviceProcAddr( device, "vkCmdNextSubpass2KHR" ) );
-        if ( !vkCmdNextSubpass2 )
-          vkCmdNextSubpass2 = vkCmdNextSubpass2KHR;
-        vkCmdPipelineBarrier = PFN_vkCmdPipelineBarrier( vkGetDeviceProcAddr( device, "vkCmdPipelineBarrier" ) );
-        vkCmdPipelineBarrier2KHR =
-          PFN_vkCmdPipelineBarrier2KHR( vkGetDeviceProcAddr( device, "vkCmdPipelineBarrier2KHR" ) );
-        vkCmdPreprocessGeneratedCommandsNV =
-          PFN_vkCmdPreprocessGeneratedCommandsNV( vkGetDeviceProcAddr( device, "vkCmdPreprocessGeneratedCommandsNV" ) );
-        vkCmdPushConstants = PFN_vkCmdPushConstants( vkGetDeviceProcAddr( device, "vkCmdPushConstants" ) );
-        vkCmdPushDescriptorSetKHR =
-          PFN_vkCmdPushDescriptorSetKHR( vkGetDeviceProcAddr( device, "vkCmdPushDescriptorSetKHR" ) );
-        vkCmdPushDescriptorSetWithTemplateKHR = PFN_vkCmdPushDescriptorSetWithTemplateKHR(
-          vkGetDeviceProcAddr( device, "vkCmdPushDescriptorSetWithTemplateKHR" ) );
-        vkCmdResetEvent        = PFN_vkCmdResetEvent( vkGetDeviceProcAddr( device, "vkCmdResetEvent" ) );
-        vkCmdResetEvent2KHR    = PFN_vkCmdResetEvent2KHR( vkGetDeviceProcAddr( device, "vkCmdResetEvent2KHR" ) );
-        vkCmdResetQueryPool    = PFN_vkCmdResetQueryPool( vkGetDeviceProcAddr( device, "vkCmdResetQueryPool" ) );
-        vkCmdResolveImage      = PFN_vkCmdResolveImage( vkGetDeviceProcAddr( device, "vkCmdResolveImage" ) );
-        vkCmdResolveImage2KHR  = PFN_vkCmdResolveImage2KHR( vkGetDeviceProcAddr( device, "vkCmdResolveImage2KHR" ) );
-        vkCmdSetBlendConstants = PFN_vkCmdSetBlendConstants( vkGetDeviceProcAddr( device, "vkCmdSetBlendConstants" ) );
-        vkCmdSetCheckpointNV   = PFN_vkCmdSetCheckpointNV( vkGetDeviceProcAddr( device, "vkCmdSetCheckpointNV" ) );
-        vkCmdSetCoarseSampleOrderNV =
-          PFN_vkCmdSetCoarseSampleOrderNV( vkGetDeviceProcAddr( device, "vkCmdSetCoarseSampleOrderNV" ) );
-        vkCmdSetColorWriteEnableEXT =
-          PFN_vkCmdSetColorWriteEnableEXT( vkGetDeviceProcAddr( device, "vkCmdSetColorWriteEnableEXT" ) );
-        vkCmdSetCullModeEXT = PFN_vkCmdSetCullModeEXT( vkGetDeviceProcAddr( device, "vkCmdSetCullModeEXT" ) );
-        vkCmdSetDepthBias   = PFN_vkCmdSetDepthBias( vkGetDeviceProcAddr( device, "vkCmdSetDepthBias" ) );
-        vkCmdSetDepthBiasEnableEXT =
-          PFN_vkCmdSetDepthBiasEnableEXT( vkGetDeviceProcAddr( device, "vkCmdSetDepthBiasEnableEXT" ) );
-        vkCmdSetDepthBounds = PFN_vkCmdSetDepthBounds( vkGetDeviceProcAddr( device, "vkCmdSetDepthBounds" ) );
-        vkCmdSetDepthBoundsTestEnableEXT =
-          PFN_vkCmdSetDepthBoundsTestEnableEXT( vkGetDeviceProcAddr( device, "vkCmdSetDepthBoundsTestEnableEXT" ) );
-        vkCmdSetDepthCompareOpEXT =
-          PFN_vkCmdSetDepthCompareOpEXT( vkGetDeviceProcAddr( device, "vkCmdSetDepthCompareOpEXT" ) );
+
+        //=== VK_EXT_discard_rectangles ===
+        vkCmdSetDiscardRectangleEXT =
+          PFN_vkCmdSetDiscardRectangleEXT( vkGetDeviceProcAddr( device, "vkCmdSetDiscardRectangleEXT" ) );
+
+        //=== VK_EXT_display_control ===
+        vkDisplayPowerControlEXT =
+          PFN_vkDisplayPowerControlEXT( vkGetDeviceProcAddr( device, "vkDisplayPowerControlEXT" ) );
+        vkRegisterDeviceEventEXT =
+          PFN_vkRegisterDeviceEventEXT( vkGetDeviceProcAddr( device, "vkRegisterDeviceEventEXT" ) );
+        vkRegisterDisplayEventEXT =
+          PFN_vkRegisterDisplayEventEXT( vkGetDeviceProcAddr( device, "vkRegisterDisplayEventEXT" ) );
+        vkGetSwapchainCounterEXT =
+          PFN_vkGetSwapchainCounterEXT( vkGetDeviceProcAddr( device, "vkGetSwapchainCounterEXT" ) );
+
+        //=== VK_EXT_extended_dynamic_state ===
+        vkCmdSetCullModeEXT  = PFN_vkCmdSetCullModeEXT( vkGetDeviceProcAddr( device, "vkCmdSetCullModeEXT" ) );
+        vkCmdSetFrontFaceEXT = PFN_vkCmdSetFrontFaceEXT( vkGetDeviceProcAddr( device, "vkCmdSetFrontFaceEXT" ) );
+        vkCmdSetPrimitiveTopologyEXT =
+          PFN_vkCmdSetPrimitiveTopologyEXT( vkGetDeviceProcAddr( device, "vkCmdSetPrimitiveTopologyEXT" ) );
+        vkCmdSetViewportWithCountEXT =
+          PFN_vkCmdSetViewportWithCountEXT( vkGetDeviceProcAddr( device, "vkCmdSetViewportWithCountEXT" ) );
+        vkCmdSetScissorWithCountEXT =
+          PFN_vkCmdSetScissorWithCountEXT( vkGetDeviceProcAddr( device, "vkCmdSetScissorWithCountEXT" ) );
+        vkCmdBindVertexBuffers2EXT =
+          PFN_vkCmdBindVertexBuffers2EXT( vkGetDeviceProcAddr( device, "vkCmdBindVertexBuffers2EXT" ) );
         vkCmdSetDepthTestEnableEXT =
           PFN_vkCmdSetDepthTestEnableEXT( vkGetDeviceProcAddr( device, "vkCmdSetDepthTestEnableEXT" ) );
         vkCmdSetDepthWriteEnableEXT =
           PFN_vkCmdSetDepthWriteEnableEXT( vkGetDeviceProcAddr( device, "vkCmdSetDepthWriteEnableEXT" ) );
-        vkCmdSetDeviceMask    = PFN_vkCmdSetDeviceMask( vkGetDeviceProcAddr( device, "vkCmdSetDeviceMask" ) );
-        vkCmdSetDeviceMaskKHR = PFN_vkCmdSetDeviceMaskKHR( vkGetDeviceProcAddr( device, "vkCmdSetDeviceMaskKHR" ) );
-        if ( !vkCmdSetDeviceMask )
-          vkCmdSetDeviceMask = vkCmdSetDeviceMaskKHR;
-        vkCmdSetDiscardRectangleEXT =
-          PFN_vkCmdSetDiscardRectangleEXT( vkGetDeviceProcAddr( device, "vkCmdSetDiscardRectangleEXT" ) );
-        vkCmdSetEvent     = PFN_vkCmdSetEvent( vkGetDeviceProcAddr( device, "vkCmdSetEvent" ) );
-        vkCmdSetEvent2KHR = PFN_vkCmdSetEvent2KHR( vkGetDeviceProcAddr( device, "vkCmdSetEvent2KHR" ) );
-        vkCmdSetExclusiveScissorNV =
-          PFN_vkCmdSetExclusiveScissorNV( vkGetDeviceProcAddr( device, "vkCmdSetExclusiveScissorNV" ) );
-        vkCmdSetFragmentShadingRateEnumNV =
-          PFN_vkCmdSetFragmentShadingRateEnumNV( vkGetDeviceProcAddr( device, "vkCmdSetFragmentShadingRateEnumNV" ) );
-        vkCmdSetFragmentShadingRateKHR =
-          PFN_vkCmdSetFragmentShadingRateKHR( vkGetDeviceProcAddr( device, "vkCmdSetFragmentShadingRateKHR" ) );
-        vkCmdSetFrontFaceEXT   = PFN_vkCmdSetFrontFaceEXT( vkGetDeviceProcAddr( device, "vkCmdSetFrontFaceEXT" ) );
-        vkCmdSetLineStippleEXT = PFN_vkCmdSetLineStippleEXT( vkGetDeviceProcAddr( device, "vkCmdSetLineStippleEXT" ) );
-        vkCmdSetLineWidth      = PFN_vkCmdSetLineWidth( vkGetDeviceProcAddr( device, "vkCmdSetLineWidth" ) );
-        vkCmdSetLogicOpEXT     = PFN_vkCmdSetLogicOpEXT( vkGetDeviceProcAddr( device, "vkCmdSetLogicOpEXT" ) );
-        vkCmdSetPatchControlPointsEXT =
-          PFN_vkCmdSetPatchControlPointsEXT( vkGetDeviceProcAddr( device, "vkCmdSetPatchControlPointsEXT" ) );
-        vkCmdSetPerformanceMarkerINTEL =
-          PFN_vkCmdSetPerformanceMarkerINTEL( vkGetDeviceProcAddr( device, "vkCmdSetPerformanceMarkerINTEL" ) );
-        vkCmdSetPerformanceOverrideINTEL =
-          PFN_vkCmdSetPerformanceOverrideINTEL( vkGetDeviceProcAddr( device, "vkCmdSetPerformanceOverrideINTEL" ) );
-        vkCmdSetPerformanceStreamMarkerINTEL = PFN_vkCmdSetPerformanceStreamMarkerINTEL(
-          vkGetDeviceProcAddr( device, "vkCmdSetPerformanceStreamMarkerINTEL" ) );
-        vkCmdSetPrimitiveRestartEnableEXT =
-          PFN_vkCmdSetPrimitiveRestartEnableEXT( vkGetDeviceProcAddr( device, "vkCmdSetPrimitiveRestartEnableEXT" ) );
-        vkCmdSetPrimitiveTopologyEXT =
-          PFN_vkCmdSetPrimitiveTopologyEXT( vkGetDeviceProcAddr( device, "vkCmdSetPrimitiveTopologyEXT" ) );
-        vkCmdSetRasterizerDiscardEnableEXT =
-          PFN_vkCmdSetRasterizerDiscardEnableEXT( vkGetDeviceProcAddr( device, "vkCmdSetRasterizerDiscardEnableEXT" ) );
-        vkCmdSetRayTracingPipelineStackSizeKHR = PFN_vkCmdSetRayTracingPipelineStackSizeKHR(
-          vkGetDeviceProcAddr( device, "vkCmdSetRayTracingPipelineStackSizeKHR" ) );
-        vkCmdSetSampleLocationsEXT =
-          PFN_vkCmdSetSampleLocationsEXT( vkGetDeviceProcAddr( device, "vkCmdSetSampleLocationsEXT" ) );
-        vkCmdSetScissor = PFN_vkCmdSetScissor( vkGetDeviceProcAddr( device, "vkCmdSetScissor" ) );
-        vkCmdSetScissorWithCountEXT =
-          PFN_vkCmdSetScissorWithCountEXT( vkGetDeviceProcAddr( device, "vkCmdSetScissorWithCountEXT" ) );
-        vkCmdSetStencilCompareMask =
-          PFN_vkCmdSetStencilCompareMask( vkGetDeviceProcAddr( device, "vkCmdSetStencilCompareMask" ) );
-        vkCmdSetStencilOpEXT = PFN_vkCmdSetStencilOpEXT( vkGetDeviceProcAddr( device, "vkCmdSetStencilOpEXT" ) );
-        vkCmdSetStencilReference =
-          PFN_vkCmdSetStencilReference( vkGetDeviceProcAddr( device, "vkCmdSetStencilReference" ) );
+        vkCmdSetDepthCompareOpEXT =
+          PFN_vkCmdSetDepthCompareOpEXT( vkGetDeviceProcAddr( device, "vkCmdSetDepthCompareOpEXT" ) );
+        vkCmdSetDepthBoundsTestEnableEXT =
+          PFN_vkCmdSetDepthBoundsTestEnableEXT( vkGetDeviceProcAddr( device, "vkCmdSetDepthBoundsTestEnableEXT" ) );
         vkCmdSetStencilTestEnableEXT =
           PFN_vkCmdSetStencilTestEnableEXT( vkGetDeviceProcAddr( device, "vkCmdSetStencilTestEnableEXT" ) );
-        vkCmdSetStencilWriteMask =
-          PFN_vkCmdSetStencilWriteMask( vkGetDeviceProcAddr( device, "vkCmdSetStencilWriteMask" ) );
+        vkCmdSetStencilOpEXT = PFN_vkCmdSetStencilOpEXT( vkGetDeviceProcAddr( device, "vkCmdSetStencilOpEXT" ) );
+
+        //=== VK_EXT_extended_dynamic_state2 ===
+        vkCmdSetPatchControlPointsEXT =
+          PFN_vkCmdSetPatchControlPointsEXT( vkGetDeviceProcAddr( device, "vkCmdSetPatchControlPointsEXT" ) );
+        vkCmdSetRasterizerDiscardEnableEXT =
+          PFN_vkCmdSetRasterizerDiscardEnableEXT( vkGetDeviceProcAddr( device, "vkCmdSetRasterizerDiscardEnableEXT" ) );
+        vkCmdSetDepthBiasEnableEXT =
+          PFN_vkCmdSetDepthBiasEnableEXT( vkGetDeviceProcAddr( device, "vkCmdSetDepthBiasEnableEXT" ) );
+        vkCmdSetLogicOpEXT = PFN_vkCmdSetLogicOpEXT( vkGetDeviceProcAddr( device, "vkCmdSetLogicOpEXT" ) );
+        vkCmdSetPrimitiveRestartEnableEXT =
+          PFN_vkCmdSetPrimitiveRestartEnableEXT( vkGetDeviceProcAddr( device, "vkCmdSetPrimitiveRestartEnableEXT" ) );
+
+        //=== VK_EXT_external_memory_host ===
+        vkGetMemoryHostPointerPropertiesEXT = PFN_vkGetMemoryHostPointerPropertiesEXT(
+          vkGetDeviceProcAddr( device, "vkGetMemoryHostPointerPropertiesEXT" ) );
+
+#  if defined( VK_USE_PLATFORM_WIN32_KHR )
+        //=== VK_EXT_full_screen_exclusive ===
+        vkAcquireFullScreenExclusiveModeEXT = PFN_vkAcquireFullScreenExclusiveModeEXT(
+          vkGetDeviceProcAddr( device, "vkAcquireFullScreenExclusiveModeEXT" ) );
+        vkReleaseFullScreenExclusiveModeEXT = PFN_vkReleaseFullScreenExclusiveModeEXT(
+          vkGetDeviceProcAddr( device, "vkReleaseFullScreenExclusiveModeEXT" ) );
+        vkGetDeviceGroupSurfacePresentModes2EXT = PFN_vkGetDeviceGroupSurfacePresentModes2EXT(
+          vkGetDeviceProcAddr( device, "vkGetDeviceGroupSurfacePresentModes2EXT" ) );
+#  endif /*VK_USE_PLATFORM_WIN32_KHR*/
+
+        //=== VK_EXT_hdr_metadata ===
+        vkSetHdrMetadataEXT = PFN_vkSetHdrMetadataEXT( vkGetDeviceProcAddr( device, "vkSetHdrMetadataEXT" ) );
+
+        //=== VK_EXT_host_query_reset ===
+        vkResetQueryPoolEXT = PFN_vkResetQueryPoolEXT( vkGetDeviceProcAddr( device, "vkResetQueryPoolEXT" ) );
+        if ( !vkResetQueryPool )
+          vkResetQueryPool = vkResetQueryPoolEXT;
+
+        //=== VK_EXT_image_drm_format_modifier ===
+        vkGetImageDrmFormatModifierPropertiesEXT = PFN_vkGetImageDrmFormatModifierPropertiesEXT(
+          vkGetDeviceProcAddr( device, "vkGetImageDrmFormatModifierPropertiesEXT" ) );
+
+        //=== VK_EXT_line_rasterization ===
+        vkCmdSetLineStippleEXT = PFN_vkCmdSetLineStippleEXT( vkGetDeviceProcAddr( device, "vkCmdSetLineStippleEXT" ) );
+
+        //=== VK_EXT_multi_draw ===
+        vkCmdDrawMultiEXT = PFN_vkCmdDrawMultiEXT( vkGetDeviceProcAddr( device, "vkCmdDrawMultiEXT" ) );
+        vkCmdDrawMultiIndexedEXT =
+          PFN_vkCmdDrawMultiIndexedEXT( vkGetDeviceProcAddr( device, "vkCmdDrawMultiIndexedEXT" ) );
+
+        //=== VK_EXT_private_data ===
+        vkCreatePrivateDataSlotEXT =
+          PFN_vkCreatePrivateDataSlotEXT( vkGetDeviceProcAddr( device, "vkCreatePrivateDataSlotEXT" ) );
+        vkDestroyPrivateDataSlotEXT =
+          PFN_vkDestroyPrivateDataSlotEXT( vkGetDeviceProcAddr( device, "vkDestroyPrivateDataSlotEXT" ) );
+        vkSetPrivateDataEXT = PFN_vkSetPrivateDataEXT( vkGetDeviceProcAddr( device, "vkSetPrivateDataEXT" ) );
+        vkGetPrivateDataEXT = PFN_vkGetPrivateDataEXT( vkGetDeviceProcAddr( device, "vkGetPrivateDataEXT" ) );
+
+        //=== VK_EXT_sample_locations ===
+        vkCmdSetSampleLocationsEXT =
+          PFN_vkCmdSetSampleLocationsEXT( vkGetDeviceProcAddr( device, "vkCmdSetSampleLocationsEXT" ) );
+
+        //=== VK_EXT_transform_feedback ===
+        vkCmdBindTransformFeedbackBuffersEXT = PFN_vkCmdBindTransformFeedbackBuffersEXT(
+          vkGetDeviceProcAddr( device, "vkCmdBindTransformFeedbackBuffersEXT" ) );
+        vkCmdBeginTransformFeedbackEXT =
+          PFN_vkCmdBeginTransformFeedbackEXT( vkGetDeviceProcAddr( device, "vkCmdBeginTransformFeedbackEXT" ) );
+        vkCmdEndTransformFeedbackEXT =
+          PFN_vkCmdEndTransformFeedbackEXT( vkGetDeviceProcAddr( device, "vkCmdEndTransformFeedbackEXT" ) );
+        vkCmdBeginQueryIndexedEXT =
+          PFN_vkCmdBeginQueryIndexedEXT( vkGetDeviceProcAddr( device, "vkCmdBeginQueryIndexedEXT" ) );
+        vkCmdEndQueryIndexedEXT =
+          PFN_vkCmdEndQueryIndexedEXT( vkGetDeviceProcAddr( device, "vkCmdEndQueryIndexedEXT" ) );
+        vkCmdDrawIndirectByteCountEXT =
+          PFN_vkCmdDrawIndirectByteCountEXT( vkGetDeviceProcAddr( device, "vkCmdDrawIndirectByteCountEXT" ) );
+
+        //=== VK_EXT_validation_cache ===
+        vkCreateValidationCacheEXT =
+          PFN_vkCreateValidationCacheEXT( vkGetDeviceProcAddr( device, "vkCreateValidationCacheEXT" ) );
+        vkDestroyValidationCacheEXT =
+          PFN_vkDestroyValidationCacheEXT( vkGetDeviceProcAddr( device, "vkDestroyValidationCacheEXT" ) );
+        vkMergeValidationCachesEXT =
+          PFN_vkMergeValidationCachesEXT( vkGetDeviceProcAddr( device, "vkMergeValidationCachesEXT" ) );
+        vkGetValidationCacheDataEXT =
+          PFN_vkGetValidationCacheDataEXT( vkGetDeviceProcAddr( device, "vkGetValidationCacheDataEXT" ) );
+
+        //=== VK_EXT_vertex_input_dynamic_state ===
         vkCmdSetVertexInputEXT = PFN_vkCmdSetVertexInputEXT( vkGetDeviceProcAddr( device, "vkCmdSetVertexInputEXT" ) );
-        vkCmdSetViewport       = PFN_vkCmdSetViewport( vkGetDeviceProcAddr( device, "vkCmdSetViewport" ) );
-        vkCmdSetViewportShadingRatePaletteNV = PFN_vkCmdSetViewportShadingRatePaletteNV(
-          vkGetDeviceProcAddr( device, "vkCmdSetViewportShadingRatePaletteNV" ) );
-        vkCmdSetViewportWScalingNV =
-          PFN_vkCmdSetViewportWScalingNV( vkGetDeviceProcAddr( device, "vkCmdSetViewportWScalingNV" ) );
-        vkCmdSetViewportWithCountEXT =
-          PFN_vkCmdSetViewportWithCountEXT( vkGetDeviceProcAddr( device, "vkCmdSetViewportWithCountEXT" ) );
+
+#  if defined( VK_USE_PLATFORM_FUCHSIA )
+        //=== VK_FUCHSIA_external_memory ===
+        vkGetMemoryZirconHandleFUCHSIA =
+          PFN_vkGetMemoryZirconHandleFUCHSIA( vkGetDeviceProcAddr( device, "vkGetMemoryZirconHandleFUCHSIA" ) );
+        vkGetMemoryZirconHandlePropertiesFUCHSIA = PFN_vkGetMemoryZirconHandlePropertiesFUCHSIA(
+          vkGetDeviceProcAddr( device, "vkGetMemoryZirconHandlePropertiesFUCHSIA" ) );
+#  endif /*VK_USE_PLATFORM_FUCHSIA*/
+
+#  if defined( VK_USE_PLATFORM_FUCHSIA )
+        //=== VK_FUCHSIA_external_semaphore ===
+        vkImportSemaphoreZirconHandleFUCHSIA = PFN_vkImportSemaphoreZirconHandleFUCHSIA(
+          vkGetDeviceProcAddr( device, "vkImportSemaphoreZirconHandleFUCHSIA" ) );
+        vkGetSemaphoreZirconHandleFUCHSIA =
+          PFN_vkGetSemaphoreZirconHandleFUCHSIA( vkGetDeviceProcAddr( device, "vkGetSemaphoreZirconHandleFUCHSIA" ) );
+#  endif /*VK_USE_PLATFORM_FUCHSIA*/
+
+        //=== VK_GOOGLE_display_timing ===
+        vkGetRefreshCycleDurationGOOGLE =
+          PFN_vkGetRefreshCycleDurationGOOGLE( vkGetDeviceProcAddr( device, "vkGetRefreshCycleDurationGOOGLE" ) );
+        vkGetPastPresentationTimingGOOGLE =
+          PFN_vkGetPastPresentationTimingGOOGLE( vkGetDeviceProcAddr( device, "vkGetPastPresentationTimingGOOGLE" ) );
+
+        //=== VK_HUAWEI_invocation_mask ===
+        vkCmdBindInvocationMaskHUAWEI =
+          PFN_vkCmdBindInvocationMaskHUAWEI( vkGetDeviceProcAddr( device, "vkCmdBindInvocationMaskHUAWEI" ) );
+
+        //=== VK_HUAWEI_subpass_shading ===
+        vkGetDeviceSubpassShadingMaxWorkgroupSizeHUAWEI = PFN_vkGetDeviceSubpassShadingMaxWorkgroupSizeHUAWEI(
+          vkGetDeviceProcAddr( device, "vkGetDeviceSubpassShadingMaxWorkgroupSizeHUAWEI" ) );
         vkCmdSubpassShadingHUAWEI =
           PFN_vkCmdSubpassShadingHUAWEI( vkGetDeviceProcAddr( device, "vkCmdSubpassShadingHUAWEI" ) );
-        vkCmdTraceRaysIndirectKHR =
-          PFN_vkCmdTraceRaysIndirectKHR( vkGetDeviceProcAddr( device, "vkCmdTraceRaysIndirectKHR" ) );
-        vkCmdTraceRaysKHR   = PFN_vkCmdTraceRaysKHR( vkGetDeviceProcAddr( device, "vkCmdTraceRaysKHR" ) );
-        vkCmdTraceRaysNV    = PFN_vkCmdTraceRaysNV( vkGetDeviceProcAddr( device, "vkCmdTraceRaysNV" ) );
-        vkCmdUpdateBuffer   = PFN_vkCmdUpdateBuffer( vkGetDeviceProcAddr( device, "vkCmdUpdateBuffer" ) );
-        vkCmdWaitEvents     = PFN_vkCmdWaitEvents( vkGetDeviceProcAddr( device, "vkCmdWaitEvents" ) );
-        vkCmdWaitEvents2KHR = PFN_vkCmdWaitEvents2KHR( vkGetDeviceProcAddr( device, "vkCmdWaitEvents2KHR" ) );
-        vkCmdWriteAccelerationStructuresPropertiesKHR = PFN_vkCmdWriteAccelerationStructuresPropertiesKHR(
-          vkGetDeviceProcAddr( device, "vkCmdWriteAccelerationStructuresPropertiesKHR" ) );
-        vkCmdWriteAccelerationStructuresPropertiesNV = PFN_vkCmdWriteAccelerationStructuresPropertiesNV(
-          vkGetDeviceProcAddr( device, "vkCmdWriteAccelerationStructuresPropertiesNV" ) );
-        vkCmdWriteBufferMarker2AMD =
-          PFN_vkCmdWriteBufferMarker2AMD( vkGetDeviceProcAddr( device, "vkCmdWriteBufferMarker2AMD" ) );
-        vkCmdWriteBufferMarkerAMD =
-          PFN_vkCmdWriteBufferMarkerAMD( vkGetDeviceProcAddr( device, "vkCmdWriteBufferMarkerAMD" ) );
-        vkCmdWriteTimestamp = PFN_vkCmdWriteTimestamp( vkGetDeviceProcAddr( device, "vkCmdWriteTimestamp" ) );
-        vkCmdWriteTimestamp2KHR =
-          PFN_vkCmdWriteTimestamp2KHR( vkGetDeviceProcAddr( device, "vkCmdWriteTimestamp2KHR" ) );
-        vkCompileDeferredNV = PFN_vkCompileDeferredNV( vkGetDeviceProcAddr( device, "vkCompileDeferredNV" ) );
+
+        //=== VK_INTEL_performance_query ===
+        vkInitializePerformanceApiINTEL =
+          PFN_vkInitializePerformanceApiINTEL( vkGetDeviceProcAddr( device, "vkInitializePerformanceApiINTEL" ) );
+        vkUninitializePerformanceApiINTEL =
+          PFN_vkUninitializePerformanceApiINTEL( vkGetDeviceProcAddr( device, "vkUninitializePerformanceApiINTEL" ) );
+        vkCmdSetPerformanceMarkerINTEL =
+          PFN_vkCmdSetPerformanceMarkerINTEL( vkGetDeviceProcAddr( device, "vkCmdSetPerformanceMarkerINTEL" ) );
+        vkCmdSetPerformanceStreamMarkerINTEL = PFN_vkCmdSetPerformanceStreamMarkerINTEL(
+          vkGetDeviceProcAddr( device, "vkCmdSetPerformanceStreamMarkerINTEL" ) );
+        vkCmdSetPerformanceOverrideINTEL =
+          PFN_vkCmdSetPerformanceOverrideINTEL( vkGetDeviceProcAddr( device, "vkCmdSetPerformanceOverrideINTEL" ) );
+        vkAcquirePerformanceConfigurationINTEL = PFN_vkAcquirePerformanceConfigurationINTEL(
+          vkGetDeviceProcAddr( device, "vkAcquirePerformanceConfigurationINTEL" ) );
+        vkReleasePerformanceConfigurationINTEL = PFN_vkReleasePerformanceConfigurationINTEL(
+          vkGetDeviceProcAddr( device, "vkReleasePerformanceConfigurationINTEL" ) );
+        vkQueueSetPerformanceConfigurationINTEL = PFN_vkQueueSetPerformanceConfigurationINTEL(
+          vkGetDeviceProcAddr( device, "vkQueueSetPerformanceConfigurationINTEL" ) );
+        vkGetPerformanceParameterINTEL =
+          PFN_vkGetPerformanceParameterINTEL( vkGetDeviceProcAddr( device, "vkGetPerformanceParameterINTEL" ) );
+
+        //=== VK_KHR_acceleration_structure ===
+        vkCreateAccelerationStructureKHR =
+          PFN_vkCreateAccelerationStructureKHR( vkGetDeviceProcAddr( device, "vkCreateAccelerationStructureKHR" ) );
+        vkDestroyAccelerationStructureKHR =
+          PFN_vkDestroyAccelerationStructureKHR( vkGetDeviceProcAddr( device, "vkDestroyAccelerationStructureKHR" ) );
+        vkCmdBuildAccelerationStructuresKHR = PFN_vkCmdBuildAccelerationStructuresKHR(
+          vkGetDeviceProcAddr( device, "vkCmdBuildAccelerationStructuresKHR" ) );
+        vkCmdBuildAccelerationStructuresIndirectKHR = PFN_vkCmdBuildAccelerationStructuresIndirectKHR(
+          vkGetDeviceProcAddr( device, "vkCmdBuildAccelerationStructuresIndirectKHR" ) );
+        vkBuildAccelerationStructuresKHR =
+          PFN_vkBuildAccelerationStructuresKHR( vkGetDeviceProcAddr( device, "vkBuildAccelerationStructuresKHR" ) );
         vkCopyAccelerationStructureKHR =
           PFN_vkCopyAccelerationStructureKHR( vkGetDeviceProcAddr( device, "vkCopyAccelerationStructureKHR" ) );
         vkCopyAccelerationStructureToMemoryKHR = PFN_vkCopyAccelerationStructureToMemoryKHR(
           vkGetDeviceProcAddr( device, "vkCopyAccelerationStructureToMemoryKHR" ) );
         vkCopyMemoryToAccelerationStructureKHR = PFN_vkCopyMemoryToAccelerationStructureKHR(
           vkGetDeviceProcAddr( device, "vkCopyMemoryToAccelerationStructureKHR" ) );
-        vkCreateAccelerationStructureKHR =
-          PFN_vkCreateAccelerationStructureKHR( vkGetDeviceProcAddr( device, "vkCreateAccelerationStructureKHR" ) );
-        vkCreateAccelerationStructureNV =
-          PFN_vkCreateAccelerationStructureNV( vkGetDeviceProcAddr( device, "vkCreateAccelerationStructureNV" ) );
-        vkCreateBuffer      = PFN_vkCreateBuffer( vkGetDeviceProcAddr( device, "vkCreateBuffer" ) );
-        vkCreateBufferView  = PFN_vkCreateBufferView( vkGetDeviceProcAddr( device, "vkCreateBufferView" ) );
-        vkCreateCommandPool = PFN_vkCreateCommandPool( vkGetDeviceProcAddr( device, "vkCreateCommandPool" ) );
-        vkCreateComputePipelines =
-          PFN_vkCreateComputePipelines( vkGetDeviceProcAddr( device, "vkCreateComputePipelines" ) );
-        vkCreateCuFunctionNVX = PFN_vkCreateCuFunctionNVX( vkGetDeviceProcAddr( device, "vkCreateCuFunctionNVX" ) );
-        vkCreateCuModuleNVX   = PFN_vkCreateCuModuleNVX( vkGetDeviceProcAddr( device, "vkCreateCuModuleNVX" ) );
-        vkCreateDeferredOperationKHR =
-          PFN_vkCreateDeferredOperationKHR( vkGetDeviceProcAddr( device, "vkCreateDeferredOperationKHR" ) );
-        vkCreateDescriptorPool = PFN_vkCreateDescriptorPool( vkGetDeviceProcAddr( device, "vkCreateDescriptorPool" ) );
-        vkCreateDescriptorSetLayout =
-          PFN_vkCreateDescriptorSetLayout( vkGetDeviceProcAddr( device, "vkCreateDescriptorSetLayout" ) );
-        vkCreateDescriptorUpdateTemplate =
-          PFN_vkCreateDescriptorUpdateTemplate( vkGetDeviceProcAddr( device, "vkCreateDescriptorUpdateTemplate" ) );
-        vkCreateDescriptorUpdateTemplateKHR = PFN_vkCreateDescriptorUpdateTemplateKHR(
-          vkGetDeviceProcAddr( device, "vkCreateDescriptorUpdateTemplateKHR" ) );
-        if ( !vkCreateDescriptorUpdateTemplate )
-          vkCreateDescriptorUpdateTemplate = vkCreateDescriptorUpdateTemplateKHR;
-        vkCreateEvent       = PFN_vkCreateEvent( vkGetDeviceProcAddr( device, "vkCreateEvent" ) );
-        vkCreateFence       = PFN_vkCreateFence( vkGetDeviceProcAddr( device, "vkCreateFence" ) );
-        vkCreateFramebuffer = PFN_vkCreateFramebuffer( vkGetDeviceProcAddr( device, "vkCreateFramebuffer" ) );
-        vkCreateGraphicsPipelines =
-          PFN_vkCreateGraphicsPipelines( vkGetDeviceProcAddr( device, "vkCreateGraphicsPipelines" ) );
-        vkCreateImage     = PFN_vkCreateImage( vkGetDeviceProcAddr( device, "vkCreateImage" ) );
-        vkCreateImageView = PFN_vkCreateImageView( vkGetDeviceProcAddr( device, "vkCreateImageView" ) );
-        vkCreateIndirectCommandsLayoutNV =
-          PFN_vkCreateIndirectCommandsLayoutNV( vkGetDeviceProcAddr( device, "vkCreateIndirectCommandsLayoutNV" ) );
-        vkCreatePipelineCache  = PFN_vkCreatePipelineCache( vkGetDeviceProcAddr( device, "vkCreatePipelineCache" ) );
-        vkCreatePipelineLayout = PFN_vkCreatePipelineLayout( vkGetDeviceProcAddr( device, "vkCreatePipelineLayout" ) );
-        vkCreatePrivateDataSlotEXT =
-          PFN_vkCreatePrivateDataSlotEXT( vkGetDeviceProcAddr( device, "vkCreatePrivateDataSlotEXT" ) );
-        vkCreateQueryPool = PFN_vkCreateQueryPool( vkGetDeviceProcAddr( device, "vkCreateQueryPool" ) );
-        vkCreateRayTracingPipelinesKHR =
-          PFN_vkCreateRayTracingPipelinesKHR( vkGetDeviceProcAddr( device, "vkCreateRayTracingPipelinesKHR" ) );
-        vkCreateRayTracingPipelinesNV =
-          PFN_vkCreateRayTracingPipelinesNV( vkGetDeviceProcAddr( device, "vkCreateRayTracingPipelinesNV" ) );
-        vkCreateRenderPass     = PFN_vkCreateRenderPass( vkGetDeviceProcAddr( device, "vkCreateRenderPass" ) );
-        vkCreateRenderPass2    = PFN_vkCreateRenderPass2( vkGetDeviceProcAddr( device, "vkCreateRenderPass2" ) );
-        vkCreateRenderPass2KHR = PFN_vkCreateRenderPass2KHR( vkGetDeviceProcAddr( device, "vkCreateRenderPass2KHR" ) );
-        if ( !vkCreateRenderPass2 )
-          vkCreateRenderPass2 = vkCreateRenderPass2KHR;
-        vkCreateSampler = PFN_vkCreateSampler( vkGetDeviceProcAddr( device, "vkCreateSampler" ) );
-        vkCreateSamplerYcbcrConversion =
-          PFN_vkCreateSamplerYcbcrConversion( vkGetDeviceProcAddr( device, "vkCreateSamplerYcbcrConversion" ) );
-        vkCreateSamplerYcbcrConversionKHR =
-          PFN_vkCreateSamplerYcbcrConversionKHR( vkGetDeviceProcAddr( device, "vkCreateSamplerYcbcrConversionKHR" ) );
-        if ( !vkCreateSamplerYcbcrConversion )
-          vkCreateSamplerYcbcrConversion = vkCreateSamplerYcbcrConversionKHR;
-        vkCreateSemaphore    = PFN_vkCreateSemaphore( vkGetDeviceProcAddr( device, "vkCreateSemaphore" ) );
-        vkCreateShaderModule = PFN_vkCreateShaderModule( vkGetDeviceProcAddr( device, "vkCreateShaderModule" ) );
-        vkCreateSharedSwapchainsKHR =
-          PFN_vkCreateSharedSwapchainsKHR( vkGetDeviceProcAddr( device, "vkCreateSharedSwapchainsKHR" ) );
-        vkCreateSwapchainKHR = PFN_vkCreateSwapchainKHR( vkGetDeviceProcAddr( device, "vkCreateSwapchainKHR" ) );
-        vkCreateValidationCacheEXT =
-          PFN_vkCreateValidationCacheEXT( vkGetDeviceProcAddr( device, "vkCreateValidationCacheEXT" ) );
-#  if defined( VK_ENABLE_BETA_EXTENSIONS )
-        vkCreateVideoSessionKHR =
-          PFN_vkCreateVideoSessionKHR( vkGetDeviceProcAddr( device, "vkCreateVideoSessionKHR" ) );
-#  endif /*VK_ENABLE_BETA_EXTENSIONS*/
-#  if defined( VK_ENABLE_BETA_EXTENSIONS )
-        vkCreateVideoSessionParametersKHR =
-          PFN_vkCreateVideoSessionParametersKHR( vkGetDeviceProcAddr( device, "vkCreateVideoSessionParametersKHR" ) );
-#  endif /*VK_ENABLE_BETA_EXTENSIONS*/
-        vkDebugMarkerSetObjectNameEXT =
-          PFN_vkDebugMarkerSetObjectNameEXT( vkGetDeviceProcAddr( device, "vkDebugMarkerSetObjectNameEXT" ) );
-        vkDebugMarkerSetObjectTagEXT =
-          PFN_vkDebugMarkerSetObjectTagEXT( vkGetDeviceProcAddr( device, "vkDebugMarkerSetObjectTagEXT" ) );
-        vkDeferredOperationJoinKHR =
-          PFN_vkDeferredOperationJoinKHR( vkGetDeviceProcAddr( device, "vkDeferredOperationJoinKHR" ) );
-        vkDestroyAccelerationStructureKHR =
-          PFN_vkDestroyAccelerationStructureKHR( vkGetDeviceProcAddr( device, "vkDestroyAccelerationStructureKHR" ) );
-        vkDestroyAccelerationStructureNV =
-          PFN_vkDestroyAccelerationStructureNV( vkGetDeviceProcAddr( device, "vkDestroyAccelerationStructureNV" ) );
-        vkDestroyBuffer        = PFN_vkDestroyBuffer( vkGetDeviceProcAddr( device, "vkDestroyBuffer" ) );
-        vkDestroyBufferView    = PFN_vkDestroyBufferView( vkGetDeviceProcAddr( device, "vkDestroyBufferView" ) );
-        vkDestroyCommandPool   = PFN_vkDestroyCommandPool( vkGetDeviceProcAddr( device, "vkDestroyCommandPool" ) );
-        vkDestroyCuFunctionNVX = PFN_vkDestroyCuFunctionNVX( vkGetDeviceProcAddr( device, "vkDestroyCuFunctionNVX" ) );
-        vkDestroyCuModuleNVX   = PFN_vkDestroyCuModuleNVX( vkGetDeviceProcAddr( device, "vkDestroyCuModuleNVX" ) );
-        vkDestroyDeferredOperationKHR =
-          PFN_vkDestroyDeferredOperationKHR( vkGetDeviceProcAddr( device, "vkDestroyDeferredOperationKHR" ) );
-        vkDestroyDescriptorPool =
-          PFN_vkDestroyDescriptorPool( vkGetDeviceProcAddr( device, "vkDestroyDescriptorPool" ) );
-        vkDestroyDescriptorSetLayout =
-          PFN_vkDestroyDescriptorSetLayout( vkGetDeviceProcAddr( device, "vkDestroyDescriptorSetLayout" ) );
-        vkDestroyDescriptorUpdateTemplate =
-          PFN_vkDestroyDescriptorUpdateTemplate( vkGetDeviceProcAddr( device, "vkDestroyDescriptorUpdateTemplate" ) );
-        vkDestroyDescriptorUpdateTemplateKHR = PFN_vkDestroyDescriptorUpdateTemplateKHR(
-          vkGetDeviceProcAddr( device, "vkDestroyDescriptorUpdateTemplateKHR" ) );
-        if ( !vkDestroyDescriptorUpdateTemplate )
-          vkDestroyDescriptorUpdateTemplate = vkDestroyDescriptorUpdateTemplateKHR;
-        vkDestroyDevice      = PFN_vkDestroyDevice( vkGetDeviceProcAddr( device, "vkDestroyDevice" ) );
-        vkDestroyEvent       = PFN_vkDestroyEvent( vkGetDeviceProcAddr( device, "vkDestroyEvent" ) );
-        vkDestroyFence       = PFN_vkDestroyFence( vkGetDeviceProcAddr( device, "vkDestroyFence" ) );
-        vkDestroyFramebuffer = PFN_vkDestroyFramebuffer( vkGetDeviceProcAddr( device, "vkDestroyFramebuffer" ) );
-        vkDestroyImage       = PFN_vkDestroyImage( vkGetDeviceProcAddr( device, "vkDestroyImage" ) );
-        vkDestroyImageView   = PFN_vkDestroyImageView( vkGetDeviceProcAddr( device, "vkDestroyImageView" ) );
-        vkDestroyIndirectCommandsLayoutNV =
-          PFN_vkDestroyIndirectCommandsLayoutNV( vkGetDeviceProcAddr( device, "vkDestroyIndirectCommandsLayoutNV" ) );
-        vkDestroyPipeline      = PFN_vkDestroyPipeline( vkGetDeviceProcAddr( device, "vkDestroyPipeline" ) );
-        vkDestroyPipelineCache = PFN_vkDestroyPipelineCache( vkGetDeviceProcAddr( device, "vkDestroyPipelineCache" ) );
-        vkDestroyPipelineLayout =
-          PFN_vkDestroyPipelineLayout( vkGetDeviceProcAddr( device, "vkDestroyPipelineLayout" ) );
-        vkDestroyPrivateDataSlotEXT =
-          PFN_vkDestroyPrivateDataSlotEXT( vkGetDeviceProcAddr( device, "vkDestroyPrivateDataSlotEXT" ) );
-        vkDestroyQueryPool  = PFN_vkDestroyQueryPool( vkGetDeviceProcAddr( device, "vkDestroyQueryPool" ) );
-        vkDestroyRenderPass = PFN_vkDestroyRenderPass( vkGetDeviceProcAddr( device, "vkDestroyRenderPass" ) );
-        vkDestroySampler    = PFN_vkDestroySampler( vkGetDeviceProcAddr( device, "vkDestroySampler" ) );
-        vkDestroySamplerYcbcrConversion =
-          PFN_vkDestroySamplerYcbcrConversion( vkGetDeviceProcAddr( device, "vkDestroySamplerYcbcrConversion" ) );
-        vkDestroySamplerYcbcrConversionKHR =
-          PFN_vkDestroySamplerYcbcrConversionKHR( vkGetDeviceProcAddr( device, "vkDestroySamplerYcbcrConversionKHR" ) );
-        if ( !vkDestroySamplerYcbcrConversion )
-          vkDestroySamplerYcbcrConversion = vkDestroySamplerYcbcrConversionKHR;
-        vkDestroySemaphore    = PFN_vkDestroySemaphore( vkGetDeviceProcAddr( device, "vkDestroySemaphore" ) );
-        vkDestroyShaderModule = PFN_vkDestroyShaderModule( vkGetDeviceProcAddr( device, "vkDestroyShaderModule" ) );
-        vkDestroySwapchainKHR = PFN_vkDestroySwapchainKHR( vkGetDeviceProcAddr( device, "vkDestroySwapchainKHR" ) );
-        vkDestroyValidationCacheEXT =
-          PFN_vkDestroyValidationCacheEXT( vkGetDeviceProcAddr( device, "vkDestroyValidationCacheEXT" ) );
-#  if defined( VK_ENABLE_BETA_EXTENSIONS )
-        vkDestroyVideoSessionKHR =
-          PFN_vkDestroyVideoSessionKHR( vkGetDeviceProcAddr( device, "vkDestroyVideoSessionKHR" ) );
-#  endif /*VK_ENABLE_BETA_EXTENSIONS*/
-#  if defined( VK_ENABLE_BETA_EXTENSIONS )
-        vkDestroyVideoSessionParametersKHR =
-          PFN_vkDestroyVideoSessionParametersKHR( vkGetDeviceProcAddr( device, "vkDestroyVideoSessionParametersKHR" ) );
-#  endif /*VK_ENABLE_BETA_EXTENSIONS*/
-        vkDeviceWaitIdle = PFN_vkDeviceWaitIdle( vkGetDeviceProcAddr( device, "vkDeviceWaitIdle" ) );
-        vkDisplayPowerControlEXT =
-          PFN_vkDisplayPowerControlEXT( vkGetDeviceProcAddr( device, "vkDisplayPowerControlEXT" ) );
-        vkEndCommandBuffer = PFN_vkEndCommandBuffer( vkGetDeviceProcAddr( device, "vkEndCommandBuffer" ) );
-        vkFlushMappedMemoryRanges =
-          PFN_vkFlushMappedMemoryRanges( vkGetDeviceProcAddr( device, "vkFlushMappedMemoryRanges" ) );
-        vkFreeCommandBuffers = PFN_vkFreeCommandBuffers( vkGetDeviceProcAddr( device, "vkFreeCommandBuffers" ) );
-        vkFreeDescriptorSets = PFN_vkFreeDescriptorSets( vkGetDeviceProcAddr( device, "vkFreeDescriptorSets" ) );
-        vkFreeMemory         = PFN_vkFreeMemory( vkGetDeviceProcAddr( device, "vkFreeMemory" ) );
-        vkGetAccelerationStructureBuildSizesKHR = PFN_vkGetAccelerationStructureBuildSizesKHR(
-          vkGetDeviceProcAddr( device, "vkGetAccelerationStructureBuildSizesKHR" ) );
+        vkWriteAccelerationStructuresPropertiesKHR = PFN_vkWriteAccelerationStructuresPropertiesKHR(
+          vkGetDeviceProcAddr( device, "vkWriteAccelerationStructuresPropertiesKHR" ) );
+        vkCmdCopyAccelerationStructureKHR =
+          PFN_vkCmdCopyAccelerationStructureKHR( vkGetDeviceProcAddr( device, "vkCmdCopyAccelerationStructureKHR" ) );
+        vkCmdCopyAccelerationStructureToMemoryKHR = PFN_vkCmdCopyAccelerationStructureToMemoryKHR(
+          vkGetDeviceProcAddr( device, "vkCmdCopyAccelerationStructureToMemoryKHR" ) );
+        vkCmdCopyMemoryToAccelerationStructureKHR = PFN_vkCmdCopyMemoryToAccelerationStructureKHR(
+          vkGetDeviceProcAddr( device, "vkCmdCopyMemoryToAccelerationStructureKHR" ) );
         vkGetAccelerationStructureDeviceAddressKHR = PFN_vkGetAccelerationStructureDeviceAddressKHR(
           vkGetDeviceProcAddr( device, "vkGetAccelerationStructureDeviceAddressKHR" ) );
-        vkGetAccelerationStructureHandleNV =
-          PFN_vkGetAccelerationStructureHandleNV( vkGetDeviceProcAddr( device, "vkGetAccelerationStructureHandleNV" ) );
-        vkGetAccelerationStructureMemoryRequirementsNV = PFN_vkGetAccelerationStructureMemoryRequirementsNV(
-          vkGetDeviceProcAddr( device, "vkGetAccelerationStructureMemoryRequirementsNV" ) );
-#  if defined( VK_USE_PLATFORM_ANDROID_KHR )
-        vkGetAndroidHardwareBufferPropertiesANDROID = PFN_vkGetAndroidHardwareBufferPropertiesANDROID(
-          vkGetDeviceProcAddr( device, "vkGetAndroidHardwareBufferPropertiesANDROID" ) );
-#  endif /*VK_USE_PLATFORM_ANDROID_KHR*/
-        vkGetBufferDeviceAddress =
-          PFN_vkGetBufferDeviceAddress( vkGetDeviceProcAddr( device, "vkGetBufferDeviceAddress" ) );
-        vkGetBufferDeviceAddressEXT =
-          PFN_vkGetBufferDeviceAddressEXT( vkGetDeviceProcAddr( device, "vkGetBufferDeviceAddressEXT" ) );
-        if ( !vkGetBufferDeviceAddress )
-          vkGetBufferDeviceAddress = vkGetBufferDeviceAddressEXT;
+        vkCmdWriteAccelerationStructuresPropertiesKHR = PFN_vkCmdWriteAccelerationStructuresPropertiesKHR(
+          vkGetDeviceProcAddr( device, "vkCmdWriteAccelerationStructuresPropertiesKHR" ) );
+        vkGetDeviceAccelerationStructureCompatibilityKHR = PFN_vkGetDeviceAccelerationStructureCompatibilityKHR(
+          vkGetDeviceProcAddr( device, "vkGetDeviceAccelerationStructureCompatibilityKHR" ) );
+        vkGetAccelerationStructureBuildSizesKHR = PFN_vkGetAccelerationStructureBuildSizesKHR(
+          vkGetDeviceProcAddr( device, "vkGetAccelerationStructureBuildSizesKHR" ) );
+
+        //=== VK_KHR_bind_memory2 ===
+        vkBindBufferMemory2KHR = PFN_vkBindBufferMemory2KHR( vkGetDeviceProcAddr( device, "vkBindBufferMemory2KHR" ) );
+        if ( !vkBindBufferMemory2 )
+          vkBindBufferMemory2 = vkBindBufferMemory2KHR;
+        vkBindImageMemory2KHR = PFN_vkBindImageMemory2KHR( vkGetDeviceProcAddr( device, "vkBindImageMemory2KHR" ) );
+        if ( !vkBindImageMemory2 )
+          vkBindImageMemory2 = vkBindImageMemory2KHR;
+
+        //=== VK_KHR_buffer_device_address ===
         vkGetBufferDeviceAddressKHR =
           PFN_vkGetBufferDeviceAddressKHR( vkGetDeviceProcAddr( device, "vkGetBufferDeviceAddressKHR" ) );
         if ( !vkGetBufferDeviceAddress )
           vkGetBufferDeviceAddress = vkGetBufferDeviceAddressKHR;
-        vkGetBufferMemoryRequirements =
-          PFN_vkGetBufferMemoryRequirements( vkGetDeviceProcAddr( device, "vkGetBufferMemoryRequirements" ) );
-        vkGetBufferMemoryRequirements2 =
-          PFN_vkGetBufferMemoryRequirements2( vkGetDeviceProcAddr( device, "vkGetBufferMemoryRequirements2" ) );
-        vkGetBufferMemoryRequirements2KHR =
-          PFN_vkGetBufferMemoryRequirements2KHR( vkGetDeviceProcAddr( device, "vkGetBufferMemoryRequirements2KHR" ) );
-        if ( !vkGetBufferMemoryRequirements2 )
-          vkGetBufferMemoryRequirements2 = vkGetBufferMemoryRequirements2KHR;
-        vkGetBufferOpaqueCaptureAddress =
-          PFN_vkGetBufferOpaqueCaptureAddress( vkGetDeviceProcAddr( device, "vkGetBufferOpaqueCaptureAddress" ) );
         vkGetBufferOpaqueCaptureAddressKHR =
           PFN_vkGetBufferOpaqueCaptureAddressKHR( vkGetDeviceProcAddr( device, "vkGetBufferOpaqueCaptureAddressKHR" ) );
         if ( !vkGetBufferOpaqueCaptureAddress )
           vkGetBufferOpaqueCaptureAddress = vkGetBufferOpaqueCaptureAddressKHR;
-        vkGetCalibratedTimestampsEXT =
-          PFN_vkGetCalibratedTimestampsEXT( vkGetDeviceProcAddr( device, "vkGetCalibratedTimestampsEXT" ) );
-        vkGetDeferredOperationMaxConcurrencyKHR = PFN_vkGetDeferredOperationMaxConcurrencyKHR(
-          vkGetDeviceProcAddr( device, "vkGetDeferredOperationMaxConcurrencyKHR" ) );
-        vkGetDeferredOperationResultKHR =
-          PFN_vkGetDeferredOperationResultKHR( vkGetDeviceProcAddr( device, "vkGetDeferredOperationResultKHR" ) );
-        vkGetDescriptorSetLayoutSupport =
-          PFN_vkGetDescriptorSetLayoutSupport( vkGetDeviceProcAddr( device, "vkGetDescriptorSetLayoutSupport" ) );
-        vkGetDescriptorSetLayoutSupportKHR =
-          PFN_vkGetDescriptorSetLayoutSupportKHR( vkGetDeviceProcAddr( device, "vkGetDescriptorSetLayoutSupportKHR" ) );
-        if ( !vkGetDescriptorSetLayoutSupport )
-          vkGetDescriptorSetLayoutSupport = vkGetDescriptorSetLayoutSupportKHR;
-        vkGetDeviceAccelerationStructureCompatibilityKHR = PFN_vkGetDeviceAccelerationStructureCompatibilityKHR(
-          vkGetDeviceProcAddr( device, "vkGetDeviceAccelerationStructureCompatibilityKHR" ) );
-        vkGetDeviceGroupPeerMemoryFeatures =
-          PFN_vkGetDeviceGroupPeerMemoryFeatures( vkGetDeviceProcAddr( device, "vkGetDeviceGroupPeerMemoryFeatures" ) );
-        vkGetDeviceGroupPeerMemoryFeaturesKHR = PFN_vkGetDeviceGroupPeerMemoryFeaturesKHR(
-          vkGetDeviceProcAddr( device, "vkGetDeviceGroupPeerMemoryFeaturesKHR" ) );
-        if ( !vkGetDeviceGroupPeerMemoryFeatures )
-          vkGetDeviceGroupPeerMemoryFeatures = vkGetDeviceGroupPeerMemoryFeaturesKHR;
-        vkGetDeviceGroupPresentCapabilitiesKHR = PFN_vkGetDeviceGroupPresentCapabilitiesKHR(
-          vkGetDeviceProcAddr( device, "vkGetDeviceGroupPresentCapabilitiesKHR" ) );
-#  if defined( VK_USE_PLATFORM_WIN32_KHR )
-        vkGetDeviceGroupSurfacePresentModes2EXT = PFN_vkGetDeviceGroupSurfacePresentModes2EXT(
-          vkGetDeviceProcAddr( device, "vkGetDeviceGroupSurfacePresentModes2EXT" ) );
-#  endif /*VK_USE_PLATFORM_WIN32_KHR*/
-        vkGetDeviceGroupSurfacePresentModesKHR = PFN_vkGetDeviceGroupSurfacePresentModesKHR(
-          vkGetDeviceProcAddr( device, "vkGetDeviceGroupSurfacePresentModesKHR" ) );
-        vkGetDeviceMemoryCommitment =
-          PFN_vkGetDeviceMemoryCommitment( vkGetDeviceProcAddr( device, "vkGetDeviceMemoryCommitment" ) );
-        vkGetDeviceMemoryOpaqueCaptureAddress = PFN_vkGetDeviceMemoryOpaqueCaptureAddress(
-          vkGetDeviceProcAddr( device, "vkGetDeviceMemoryOpaqueCaptureAddress" ) );
         vkGetDeviceMemoryOpaqueCaptureAddressKHR = PFN_vkGetDeviceMemoryOpaqueCaptureAddressKHR(
           vkGetDeviceProcAddr( device, "vkGetDeviceMemoryOpaqueCaptureAddressKHR" ) );
         if ( !vkGetDeviceMemoryOpaqueCaptureAddress )
           vkGetDeviceMemoryOpaqueCaptureAddress = vkGetDeviceMemoryOpaqueCaptureAddressKHR;
-        vkGetDeviceProcAddr = PFN_vkGetDeviceProcAddr( vkGetDeviceProcAddr( device, "vkGetDeviceProcAddr" ) );
-        vkGetDeviceQueue    = PFN_vkGetDeviceQueue( vkGetDeviceProcAddr( device, "vkGetDeviceQueue" ) );
-        vkGetDeviceQueue2   = PFN_vkGetDeviceQueue2( vkGetDeviceProcAddr( device, "vkGetDeviceQueue2" ) );
-        vkGetDeviceSubpassShadingMaxWorkgroupSizeHUAWEI = PFN_vkGetDeviceSubpassShadingMaxWorkgroupSizeHUAWEI(
-          vkGetDeviceProcAddr( device, "vkGetDeviceSubpassShadingMaxWorkgroupSizeHUAWEI" ) );
-        vkGetEventStatus = PFN_vkGetEventStatus( vkGetDeviceProcAddr( device, "vkGetEventStatus" ) );
-        vkGetFenceFdKHR  = PFN_vkGetFenceFdKHR( vkGetDeviceProcAddr( device, "vkGetFenceFdKHR" ) );
-        vkGetFenceStatus = PFN_vkGetFenceStatus( vkGetDeviceProcAddr( device, "vkGetFenceStatus" ) );
-#  if defined( VK_USE_PLATFORM_WIN32_KHR )
-        vkGetFenceWin32HandleKHR =
-          PFN_vkGetFenceWin32HandleKHR( vkGetDeviceProcAddr( device, "vkGetFenceWin32HandleKHR" ) );
-#  endif /*VK_USE_PLATFORM_WIN32_KHR*/
-        vkGetGeneratedCommandsMemoryRequirementsNV = PFN_vkGetGeneratedCommandsMemoryRequirementsNV(
-          vkGetDeviceProcAddr( device, "vkGetGeneratedCommandsMemoryRequirementsNV" ) );
-        vkGetImageDrmFormatModifierPropertiesEXT = PFN_vkGetImageDrmFormatModifierPropertiesEXT(
-          vkGetDeviceProcAddr( device, "vkGetImageDrmFormatModifierPropertiesEXT" ) );
-        vkGetImageMemoryRequirements =
-          PFN_vkGetImageMemoryRequirements( vkGetDeviceProcAddr( device, "vkGetImageMemoryRequirements" ) );
-        vkGetImageMemoryRequirements2 =
-          PFN_vkGetImageMemoryRequirements2( vkGetDeviceProcAddr( device, "vkGetImageMemoryRequirements2" ) );
-        vkGetImageMemoryRequirements2KHR =
-          PFN_vkGetImageMemoryRequirements2KHR( vkGetDeviceProcAddr( device, "vkGetImageMemoryRequirements2KHR" ) );
-        if ( !vkGetImageMemoryRequirements2 )
-          vkGetImageMemoryRequirements2 = vkGetImageMemoryRequirements2KHR;
-        vkGetImageSparseMemoryRequirements =
-          PFN_vkGetImageSparseMemoryRequirements( vkGetDeviceProcAddr( device, "vkGetImageSparseMemoryRequirements" ) );
-        vkGetImageSparseMemoryRequirements2 = PFN_vkGetImageSparseMemoryRequirements2(
-          vkGetDeviceProcAddr( device, "vkGetImageSparseMemoryRequirements2" ) );
-        vkGetImageSparseMemoryRequirements2KHR = PFN_vkGetImageSparseMemoryRequirements2KHR(
-          vkGetDeviceProcAddr( device, "vkGetImageSparseMemoryRequirements2KHR" ) );
-        if ( !vkGetImageSparseMemoryRequirements2 )
-          vkGetImageSparseMemoryRequirements2 = vkGetImageSparseMemoryRequirements2KHR;
-        vkGetImageSubresourceLayout =
-          PFN_vkGetImageSubresourceLayout( vkGetDeviceProcAddr( device, "vkGetImageSubresourceLayout" ) );
-        vkGetImageViewAddressNVX =
-          PFN_vkGetImageViewAddressNVX( vkGetDeviceProcAddr( device, "vkGetImageViewAddressNVX" ) );
-        vkGetImageViewHandleNVX =
-          PFN_vkGetImageViewHandleNVX( vkGetDeviceProcAddr( device, "vkGetImageViewHandleNVX" ) );
-#  if defined( VK_USE_PLATFORM_ANDROID_KHR )
-        vkGetMemoryAndroidHardwareBufferANDROID = PFN_vkGetMemoryAndroidHardwareBufferANDROID(
-          vkGetDeviceProcAddr( device, "vkGetMemoryAndroidHardwareBufferANDROID" ) );
-#  endif /*VK_USE_PLATFORM_ANDROID_KHR*/
-        vkGetMemoryFdKHR = PFN_vkGetMemoryFdKHR( vkGetDeviceProcAddr( device, "vkGetMemoryFdKHR" ) );
-        vkGetMemoryFdPropertiesKHR =
-          PFN_vkGetMemoryFdPropertiesKHR( vkGetDeviceProcAddr( device, "vkGetMemoryFdPropertiesKHR" ) );
-        vkGetMemoryHostPointerPropertiesEXT = PFN_vkGetMemoryHostPointerPropertiesEXT(
-          vkGetDeviceProcAddr( device, "vkGetMemoryHostPointerPropertiesEXT" ) );
-        vkGetMemoryRemoteAddressNV =
-          PFN_vkGetMemoryRemoteAddressNV( vkGetDeviceProcAddr( device, "vkGetMemoryRemoteAddressNV" ) );
-#  if defined( VK_USE_PLATFORM_WIN32_KHR )
-        vkGetMemoryWin32HandleKHR =
-          PFN_vkGetMemoryWin32HandleKHR( vkGetDeviceProcAddr( device, "vkGetMemoryWin32HandleKHR" ) );
-#  endif /*VK_USE_PLATFORM_WIN32_KHR*/
-#  if defined( VK_USE_PLATFORM_WIN32_KHR )
-        vkGetMemoryWin32HandleNV =
-          PFN_vkGetMemoryWin32HandleNV( vkGetDeviceProcAddr( device, "vkGetMemoryWin32HandleNV" ) );
-#  endif /*VK_USE_PLATFORM_WIN32_KHR*/
-#  if defined( VK_USE_PLATFORM_WIN32_KHR )
-        vkGetMemoryWin32HandlePropertiesKHR = PFN_vkGetMemoryWin32HandlePropertiesKHR(
-          vkGetDeviceProcAddr( device, "vkGetMemoryWin32HandlePropertiesKHR" ) );
-#  endif /*VK_USE_PLATFORM_WIN32_KHR*/
-#  if defined( VK_USE_PLATFORM_FUCHSIA )
-        vkGetMemoryZirconHandleFUCHSIA =
-          PFN_vkGetMemoryZirconHandleFUCHSIA( vkGetDeviceProcAddr( device, "vkGetMemoryZirconHandleFUCHSIA" ) );
-#  endif /*VK_USE_PLATFORM_FUCHSIA*/
-#  if defined( VK_USE_PLATFORM_FUCHSIA )
-        vkGetMemoryZirconHandlePropertiesFUCHSIA = PFN_vkGetMemoryZirconHandlePropertiesFUCHSIA(
-          vkGetDeviceProcAddr( device, "vkGetMemoryZirconHandlePropertiesFUCHSIA" ) );
-#  endif /*VK_USE_PLATFORM_FUCHSIA*/
-        vkGetPastPresentationTimingGOOGLE =
-          PFN_vkGetPastPresentationTimingGOOGLE( vkGetDeviceProcAddr( device, "vkGetPastPresentationTimingGOOGLE" ) );
-        vkGetPerformanceParameterINTEL =
-          PFN_vkGetPerformanceParameterINTEL( vkGetDeviceProcAddr( device, "vkGetPerformanceParameterINTEL" ) );
-        vkGetPipelineCacheData = PFN_vkGetPipelineCacheData( vkGetDeviceProcAddr( device, "vkGetPipelineCacheData" ) );
-        vkGetPipelineExecutableInternalRepresentationsKHR = PFN_vkGetPipelineExecutableInternalRepresentationsKHR(
-          vkGetDeviceProcAddr( device, "vkGetPipelineExecutableInternalRepresentationsKHR" ) );
-        vkGetPipelineExecutablePropertiesKHR = PFN_vkGetPipelineExecutablePropertiesKHR(
-          vkGetDeviceProcAddr( device, "vkGetPipelineExecutablePropertiesKHR" ) );
-        vkGetPipelineExecutableStatisticsKHR = PFN_vkGetPipelineExecutableStatisticsKHR(
-          vkGetDeviceProcAddr( device, "vkGetPipelineExecutableStatisticsKHR" ) );
-        vkGetPrivateDataEXT   = PFN_vkGetPrivateDataEXT( vkGetDeviceProcAddr( device, "vkGetPrivateDataEXT" ) );
-        vkGetQueryPoolResults = PFN_vkGetQueryPoolResults( vkGetDeviceProcAddr( device, "vkGetQueryPoolResults" ) );
-        vkGetQueueCheckpointData2NV =
-          PFN_vkGetQueueCheckpointData2NV( vkGetDeviceProcAddr( device, "vkGetQueueCheckpointData2NV" ) );
-        vkGetQueueCheckpointDataNV =
-          PFN_vkGetQueueCheckpointDataNV( vkGetDeviceProcAddr( device, "vkGetQueueCheckpointDataNV" ) );
-        vkGetRayTracingCaptureReplayShaderGroupHandlesKHR = PFN_vkGetRayTracingCaptureReplayShaderGroupHandlesKHR(
-          vkGetDeviceProcAddr( device, "vkGetRayTracingCaptureReplayShaderGroupHandlesKHR" ) );
-        vkGetRayTracingShaderGroupHandlesKHR = PFN_vkGetRayTracingShaderGroupHandlesKHR(
-          vkGetDeviceProcAddr( device, "vkGetRayTracingShaderGroupHandlesKHR" ) );
-        vkGetRayTracingShaderGroupHandlesNV = PFN_vkGetRayTracingShaderGroupHandlesNV(
-          vkGetDeviceProcAddr( device, "vkGetRayTracingShaderGroupHandlesNV" ) );
-        if ( !vkGetRayTracingShaderGroupHandlesKHR )
-          vkGetRayTracingShaderGroupHandlesKHR = vkGetRayTracingShaderGroupHandlesNV;
-        vkGetRayTracingShaderGroupStackSizeKHR = PFN_vkGetRayTracingShaderGroupStackSizeKHR(
-          vkGetDeviceProcAddr( device, "vkGetRayTracingShaderGroupStackSizeKHR" ) );
-        vkGetRefreshCycleDurationGOOGLE =
-          PFN_vkGetRefreshCycleDurationGOOGLE( vkGetDeviceProcAddr( device, "vkGetRefreshCycleDurationGOOGLE" ) );
-        vkGetRenderAreaGranularity =
-          PFN_vkGetRenderAreaGranularity( vkGetDeviceProcAddr( device, "vkGetRenderAreaGranularity" ) );
-        vkGetSemaphoreCounterValue =
-          PFN_vkGetSemaphoreCounterValue( vkGetDeviceProcAddr( device, "vkGetSemaphoreCounterValue" ) );
-        vkGetSemaphoreCounterValueKHR =
-          PFN_vkGetSemaphoreCounterValueKHR( vkGetDeviceProcAddr( device, "vkGetSemaphoreCounterValueKHR" ) );
-        if ( !vkGetSemaphoreCounterValue )
-          vkGetSemaphoreCounterValue = vkGetSemaphoreCounterValueKHR;
-        vkGetSemaphoreFdKHR = PFN_vkGetSemaphoreFdKHR( vkGetDeviceProcAddr( device, "vkGetSemaphoreFdKHR" ) );
-#  if defined( VK_USE_PLATFORM_WIN32_KHR )
-        vkGetSemaphoreWin32HandleKHR =
-          PFN_vkGetSemaphoreWin32HandleKHR( vkGetDeviceProcAddr( device, "vkGetSemaphoreWin32HandleKHR" ) );
-#  endif /*VK_USE_PLATFORM_WIN32_KHR*/
-#  if defined( VK_USE_PLATFORM_FUCHSIA )
-        vkGetSemaphoreZirconHandleFUCHSIA =
-          PFN_vkGetSemaphoreZirconHandleFUCHSIA( vkGetDeviceProcAddr( device, "vkGetSemaphoreZirconHandleFUCHSIA" ) );
-#  endif /*VK_USE_PLATFORM_FUCHSIA*/
-        vkGetShaderInfoAMD = PFN_vkGetShaderInfoAMD( vkGetDeviceProcAddr( device, "vkGetShaderInfoAMD" ) );
-        vkGetSwapchainCounterEXT =
-          PFN_vkGetSwapchainCounterEXT( vkGetDeviceProcAddr( device, "vkGetSwapchainCounterEXT" ) );
-        vkGetSwapchainImagesKHR =
-          PFN_vkGetSwapchainImagesKHR( vkGetDeviceProcAddr( device, "vkGetSwapchainImagesKHR" ) );
-        vkGetSwapchainStatusKHR =
-          PFN_vkGetSwapchainStatusKHR( vkGetDeviceProcAddr( device, "vkGetSwapchainStatusKHR" ) );
-        vkGetValidationCacheDataEXT =
-          PFN_vkGetValidationCacheDataEXT( vkGetDeviceProcAddr( device, "vkGetValidationCacheDataEXT" ) );
-#  if defined( VK_ENABLE_BETA_EXTENSIONS )
-        vkGetVideoSessionMemoryRequirementsKHR = PFN_vkGetVideoSessionMemoryRequirementsKHR(
-          vkGetDeviceProcAddr( device, "vkGetVideoSessionMemoryRequirementsKHR" ) );
-#  endif /*VK_ENABLE_BETA_EXTENSIONS*/
-        vkImportFenceFdKHR = PFN_vkImportFenceFdKHR( vkGetDeviceProcAddr( device, "vkImportFenceFdKHR" ) );
-#  if defined( VK_USE_PLATFORM_WIN32_KHR )
-        vkImportFenceWin32HandleKHR =
-          PFN_vkImportFenceWin32HandleKHR( vkGetDeviceProcAddr( device, "vkImportFenceWin32HandleKHR" ) );
-#  endif /*VK_USE_PLATFORM_WIN32_KHR*/
-        vkImportSemaphoreFdKHR = PFN_vkImportSemaphoreFdKHR( vkGetDeviceProcAddr( device, "vkImportSemaphoreFdKHR" ) );
-#  if defined( VK_USE_PLATFORM_WIN32_KHR )
-        vkImportSemaphoreWin32HandleKHR =
-          PFN_vkImportSemaphoreWin32HandleKHR( vkGetDeviceProcAddr( device, "vkImportSemaphoreWin32HandleKHR" ) );
-#  endif /*VK_USE_PLATFORM_WIN32_KHR*/
-#  if defined( VK_USE_PLATFORM_FUCHSIA )
-        vkImportSemaphoreZirconHandleFUCHSIA = PFN_vkImportSemaphoreZirconHandleFUCHSIA(
-          vkGetDeviceProcAddr( device, "vkImportSemaphoreZirconHandleFUCHSIA" ) );
-#  endif /*VK_USE_PLATFORM_FUCHSIA*/
-        vkInitializePerformanceApiINTEL =
-          PFN_vkInitializePerformanceApiINTEL( vkGetDeviceProcAddr( device, "vkInitializePerformanceApiINTEL" ) );
-        vkInvalidateMappedMemoryRanges =
-          PFN_vkInvalidateMappedMemoryRanges( vkGetDeviceProcAddr( device, "vkInvalidateMappedMemoryRanges" ) );
-        vkMapMemory           = PFN_vkMapMemory( vkGetDeviceProcAddr( device, "vkMapMemory" ) );
-        vkMergePipelineCaches = PFN_vkMergePipelineCaches( vkGetDeviceProcAddr( device, "vkMergePipelineCaches" ) );
-        vkMergeValidationCachesEXT =
-          PFN_vkMergeValidationCachesEXT( vkGetDeviceProcAddr( device, "vkMergeValidationCachesEXT" ) );
-        vkQueueBeginDebugUtilsLabelEXT =
-          PFN_vkQueueBeginDebugUtilsLabelEXT( vkGetDeviceProcAddr( device, "vkQueueBeginDebugUtilsLabelEXT" ) );
-        vkQueueBindSparse = PFN_vkQueueBindSparse( vkGetDeviceProcAddr( device, "vkQueueBindSparse" ) );
-        vkQueueEndDebugUtilsLabelEXT =
-          PFN_vkQueueEndDebugUtilsLabelEXT( vkGetDeviceProcAddr( device, "vkQueueEndDebugUtilsLabelEXT" ) );
-        vkQueueInsertDebugUtilsLabelEXT =
-          PFN_vkQueueInsertDebugUtilsLabelEXT( vkGetDeviceProcAddr( device, "vkQueueInsertDebugUtilsLabelEXT" ) );
-        vkQueuePresentKHR = PFN_vkQueuePresentKHR( vkGetDeviceProcAddr( device, "vkQueuePresentKHR" ) );
-        vkQueueSetPerformanceConfigurationINTEL = PFN_vkQueueSetPerformanceConfigurationINTEL(
-          vkGetDeviceProcAddr( device, "vkQueueSetPerformanceConfigurationINTEL" ) );
-        vkQueueSubmit     = PFN_vkQueueSubmit( vkGetDeviceProcAddr( device, "vkQueueSubmit" ) );
-        vkQueueSubmit2KHR = PFN_vkQueueSubmit2KHR( vkGetDeviceProcAddr( device, "vkQueueSubmit2KHR" ) );
-        vkQueueWaitIdle   = PFN_vkQueueWaitIdle( vkGetDeviceProcAddr( device, "vkQueueWaitIdle" ) );
-        vkRegisterDeviceEventEXT =
-          PFN_vkRegisterDeviceEventEXT( vkGetDeviceProcAddr( device, "vkRegisterDeviceEventEXT" ) );
-        vkRegisterDisplayEventEXT =
-          PFN_vkRegisterDisplayEventEXT( vkGetDeviceProcAddr( device, "vkRegisterDisplayEventEXT" ) );
-#  if defined( VK_USE_PLATFORM_WIN32_KHR )
-        vkReleaseFullScreenExclusiveModeEXT = PFN_vkReleaseFullScreenExclusiveModeEXT(
-          vkGetDeviceProcAddr( device, "vkReleaseFullScreenExclusiveModeEXT" ) );
-#  endif /*VK_USE_PLATFORM_WIN32_KHR*/
-        vkReleasePerformanceConfigurationINTEL = PFN_vkReleasePerformanceConfigurationINTEL(
-          vkGetDeviceProcAddr( device, "vkReleasePerformanceConfigurationINTEL" ) );
-        vkReleaseProfilingLockKHR =
-          PFN_vkReleaseProfilingLockKHR( vkGetDeviceProcAddr( device, "vkReleaseProfilingLockKHR" ) );
-        vkResetCommandBuffer  = PFN_vkResetCommandBuffer( vkGetDeviceProcAddr( device, "vkResetCommandBuffer" ) );
-        vkResetCommandPool    = PFN_vkResetCommandPool( vkGetDeviceProcAddr( device, "vkResetCommandPool" ) );
-        vkResetDescriptorPool = PFN_vkResetDescriptorPool( vkGetDeviceProcAddr( device, "vkResetDescriptorPool" ) );
-        vkResetEvent          = PFN_vkResetEvent( vkGetDeviceProcAddr( device, "vkResetEvent" ) );
-        vkResetFences         = PFN_vkResetFences( vkGetDeviceProcAddr( device, "vkResetFences" ) );
-        vkResetQueryPool      = PFN_vkResetQueryPool( vkGetDeviceProcAddr( device, "vkResetQueryPool" ) );
-        vkResetQueryPoolEXT   = PFN_vkResetQueryPoolEXT( vkGetDeviceProcAddr( device, "vkResetQueryPoolEXT" ) );
-        if ( !vkResetQueryPool )
-          vkResetQueryPool = vkResetQueryPoolEXT;
-        vkSetDebugUtilsObjectNameEXT =
-          PFN_vkSetDebugUtilsObjectNameEXT( vkGetDeviceProcAddr( device, "vkSetDebugUtilsObjectNameEXT" ) );
-        vkSetDebugUtilsObjectTagEXT =
-          PFN_vkSetDebugUtilsObjectTagEXT( vkGetDeviceProcAddr( device, "vkSetDebugUtilsObjectTagEXT" ) );
-        vkSetEvent           = PFN_vkSetEvent( vkGetDeviceProcAddr( device, "vkSetEvent" ) );
-        vkSetHdrMetadataEXT  = PFN_vkSetHdrMetadataEXT( vkGetDeviceProcAddr( device, "vkSetHdrMetadataEXT" ) );
-        vkSetLocalDimmingAMD = PFN_vkSetLocalDimmingAMD( vkGetDeviceProcAddr( device, "vkSetLocalDimmingAMD" ) );
-        vkSetPrivateDataEXT  = PFN_vkSetPrivateDataEXT( vkGetDeviceProcAddr( device, "vkSetPrivateDataEXT" ) );
-        vkSignalSemaphore    = PFN_vkSignalSemaphore( vkGetDeviceProcAddr( device, "vkSignalSemaphore" ) );
-        vkSignalSemaphoreKHR = PFN_vkSignalSemaphoreKHR( vkGetDeviceProcAddr( device, "vkSignalSemaphoreKHR" ) );
-        if ( !vkSignalSemaphore )
-          vkSignalSemaphore = vkSignalSemaphoreKHR;
-        vkTrimCommandPool    = PFN_vkTrimCommandPool( vkGetDeviceProcAddr( device, "vkTrimCommandPool" ) );
-        vkTrimCommandPoolKHR = PFN_vkTrimCommandPoolKHR( vkGetDeviceProcAddr( device, "vkTrimCommandPoolKHR" ) );
-        if ( !vkTrimCommandPool )
-          vkTrimCommandPool = vkTrimCommandPoolKHR;
-        vkUninitializePerformanceApiINTEL =
-          PFN_vkUninitializePerformanceApiINTEL( vkGetDeviceProcAddr( device, "vkUninitializePerformanceApiINTEL" ) );
-        vkUnmapMemory = PFN_vkUnmapMemory( vkGetDeviceProcAddr( device, "vkUnmapMemory" ) );
-        vkUpdateDescriptorSetWithTemplate =
-          PFN_vkUpdateDescriptorSetWithTemplate( vkGetDeviceProcAddr( device, "vkUpdateDescriptorSetWithTemplate" ) );
+
+        //=== VK_KHR_copy_commands2 ===
+        vkCmdCopyBuffer2KHR = PFN_vkCmdCopyBuffer2KHR( vkGetDeviceProcAddr( device, "vkCmdCopyBuffer2KHR" ) );
+        vkCmdCopyImage2KHR  = PFN_vkCmdCopyImage2KHR( vkGetDeviceProcAddr( device, "vkCmdCopyImage2KHR" ) );
+        vkCmdCopyBufferToImage2KHR =
+          PFN_vkCmdCopyBufferToImage2KHR( vkGetDeviceProcAddr( device, "vkCmdCopyBufferToImage2KHR" ) );
+        vkCmdCopyImageToBuffer2KHR =
+          PFN_vkCmdCopyImageToBuffer2KHR( vkGetDeviceProcAddr( device, "vkCmdCopyImageToBuffer2KHR" ) );
+        vkCmdBlitImage2KHR    = PFN_vkCmdBlitImage2KHR( vkGetDeviceProcAddr( device, "vkCmdBlitImage2KHR" ) );
+        vkCmdResolveImage2KHR = PFN_vkCmdResolveImage2KHR( vkGetDeviceProcAddr( device, "vkCmdResolveImage2KHR" ) );
+
+        //=== VK_KHR_create_renderpass2 ===
+        vkCreateRenderPass2KHR = PFN_vkCreateRenderPass2KHR( vkGetDeviceProcAddr( device, "vkCreateRenderPass2KHR" ) );
+        if ( !vkCreateRenderPass2 )
+          vkCreateRenderPass2 = vkCreateRenderPass2KHR;
+        vkCmdBeginRenderPass2KHR =
+          PFN_vkCmdBeginRenderPass2KHR( vkGetDeviceProcAddr( device, "vkCmdBeginRenderPass2KHR" ) );
+        if ( !vkCmdBeginRenderPass2 )
+          vkCmdBeginRenderPass2 = vkCmdBeginRenderPass2KHR;
+        vkCmdNextSubpass2KHR = PFN_vkCmdNextSubpass2KHR( vkGetDeviceProcAddr( device, "vkCmdNextSubpass2KHR" ) );
+        if ( !vkCmdNextSubpass2 )
+          vkCmdNextSubpass2 = vkCmdNextSubpass2KHR;
+        vkCmdEndRenderPass2KHR = PFN_vkCmdEndRenderPass2KHR( vkGetDeviceProcAddr( device, "vkCmdEndRenderPass2KHR" ) );
+        if ( !vkCmdEndRenderPass2 )
+          vkCmdEndRenderPass2 = vkCmdEndRenderPass2KHR;
+
+        //=== VK_KHR_deferred_host_operations ===
+        vkCreateDeferredOperationKHR =
+          PFN_vkCreateDeferredOperationKHR( vkGetDeviceProcAddr( device, "vkCreateDeferredOperationKHR" ) );
+        vkDestroyDeferredOperationKHR =
+          PFN_vkDestroyDeferredOperationKHR( vkGetDeviceProcAddr( device, "vkDestroyDeferredOperationKHR" ) );
+        vkGetDeferredOperationMaxConcurrencyKHR = PFN_vkGetDeferredOperationMaxConcurrencyKHR(
+          vkGetDeviceProcAddr( device, "vkGetDeferredOperationMaxConcurrencyKHR" ) );
+        vkGetDeferredOperationResultKHR =
+          PFN_vkGetDeferredOperationResultKHR( vkGetDeviceProcAddr( device, "vkGetDeferredOperationResultKHR" ) );
+        vkDeferredOperationJoinKHR =
+          PFN_vkDeferredOperationJoinKHR( vkGetDeviceProcAddr( device, "vkDeferredOperationJoinKHR" ) );
+
+        //=== VK_KHR_descriptor_update_template ===
+        vkCreateDescriptorUpdateTemplateKHR = PFN_vkCreateDescriptorUpdateTemplateKHR(
+          vkGetDeviceProcAddr( device, "vkCreateDescriptorUpdateTemplateKHR" ) );
+        if ( !vkCreateDescriptorUpdateTemplate )
+          vkCreateDescriptorUpdateTemplate = vkCreateDescriptorUpdateTemplateKHR;
+        vkDestroyDescriptorUpdateTemplateKHR = PFN_vkDestroyDescriptorUpdateTemplateKHR(
+          vkGetDeviceProcAddr( device, "vkDestroyDescriptorUpdateTemplateKHR" ) );
+        if ( !vkDestroyDescriptorUpdateTemplate )
+          vkDestroyDescriptorUpdateTemplate = vkDestroyDescriptorUpdateTemplateKHR;
         vkUpdateDescriptorSetWithTemplateKHR = PFN_vkUpdateDescriptorSetWithTemplateKHR(
           vkGetDeviceProcAddr( device, "vkUpdateDescriptorSetWithTemplateKHR" ) );
         if ( !vkUpdateDescriptorSetWithTemplate )
           vkUpdateDescriptorSetWithTemplate = vkUpdateDescriptorSetWithTemplateKHR;
-        vkUpdateDescriptorSets = PFN_vkUpdateDescriptorSets( vkGetDeviceProcAddr( device, "vkUpdateDescriptorSets" ) );
-#  if defined( VK_ENABLE_BETA_EXTENSIONS )
-        vkUpdateVideoSessionParametersKHR =
-          PFN_vkUpdateVideoSessionParametersKHR( vkGetDeviceProcAddr( device, "vkUpdateVideoSessionParametersKHR" ) );
-#  endif /*VK_ENABLE_BETA_EXTENSIONS*/
-        vkWaitForFences     = PFN_vkWaitForFences( vkGetDeviceProcAddr( device, "vkWaitForFences" ) );
-        vkWaitSemaphores    = PFN_vkWaitSemaphores( vkGetDeviceProcAddr( device, "vkWaitSemaphores" ) );
+        vkCmdPushDescriptorSetWithTemplateKHR = PFN_vkCmdPushDescriptorSetWithTemplateKHR(
+          vkGetDeviceProcAddr( device, "vkCmdPushDescriptorSetWithTemplateKHR" ) );
+
+        //=== VK_KHR_device_group ===
+        vkGetDeviceGroupPeerMemoryFeaturesKHR = PFN_vkGetDeviceGroupPeerMemoryFeaturesKHR(
+          vkGetDeviceProcAddr( device, "vkGetDeviceGroupPeerMemoryFeaturesKHR" ) );
+        if ( !vkGetDeviceGroupPeerMemoryFeatures )
+          vkGetDeviceGroupPeerMemoryFeatures = vkGetDeviceGroupPeerMemoryFeaturesKHR;
+        vkCmdSetDeviceMaskKHR = PFN_vkCmdSetDeviceMaskKHR( vkGetDeviceProcAddr( device, "vkCmdSetDeviceMaskKHR" ) );
+        if ( !vkCmdSetDeviceMask )
+          vkCmdSetDeviceMask = vkCmdSetDeviceMaskKHR;
+        vkCmdDispatchBaseKHR = PFN_vkCmdDispatchBaseKHR( vkGetDeviceProcAddr( device, "vkCmdDispatchBaseKHR" ) );
+        if ( !vkCmdDispatchBase )
+          vkCmdDispatchBase = vkCmdDispatchBaseKHR;
+        vkGetDeviceGroupPresentCapabilitiesKHR = PFN_vkGetDeviceGroupPresentCapabilitiesKHR(
+          vkGetDeviceProcAddr( device, "vkGetDeviceGroupPresentCapabilitiesKHR" ) );
+        vkGetDeviceGroupSurfacePresentModesKHR = PFN_vkGetDeviceGroupSurfacePresentModesKHR(
+          vkGetDeviceProcAddr( device, "vkGetDeviceGroupSurfacePresentModesKHR" ) );
+        vkAcquireNextImage2KHR = PFN_vkAcquireNextImage2KHR( vkGetDeviceProcAddr( device, "vkAcquireNextImage2KHR" ) );
+
+        //=== VK_KHR_display_swapchain ===
+        vkCreateSharedSwapchainsKHR =
+          PFN_vkCreateSharedSwapchainsKHR( vkGetDeviceProcAddr( device, "vkCreateSharedSwapchainsKHR" ) );
+
+        //=== VK_KHR_draw_indirect_count ===
+        vkCmdDrawIndirectCountKHR =
+          PFN_vkCmdDrawIndirectCountKHR( vkGetDeviceProcAddr( device, "vkCmdDrawIndirectCountKHR" ) );
+        if ( !vkCmdDrawIndirectCount )
+          vkCmdDrawIndirectCount = vkCmdDrawIndirectCountKHR;
+        vkCmdDrawIndexedIndirectCountKHR =
+          PFN_vkCmdDrawIndexedIndirectCountKHR( vkGetDeviceProcAddr( device, "vkCmdDrawIndexedIndirectCountKHR" ) );
+        if ( !vkCmdDrawIndexedIndirectCount )
+          vkCmdDrawIndexedIndirectCount = vkCmdDrawIndexedIndirectCountKHR;
+
+        //=== VK_KHR_external_fence_fd ===
+        vkImportFenceFdKHR = PFN_vkImportFenceFdKHR( vkGetDeviceProcAddr( device, "vkImportFenceFdKHR" ) );
+        vkGetFenceFdKHR    = PFN_vkGetFenceFdKHR( vkGetDeviceProcAddr( device, "vkGetFenceFdKHR" ) );
+
+#  if defined( VK_USE_PLATFORM_WIN32_KHR )
+        //=== VK_KHR_external_fence_win32 ===
+        vkImportFenceWin32HandleKHR =
+          PFN_vkImportFenceWin32HandleKHR( vkGetDeviceProcAddr( device, "vkImportFenceWin32HandleKHR" ) );
+        vkGetFenceWin32HandleKHR =
+          PFN_vkGetFenceWin32HandleKHR( vkGetDeviceProcAddr( device, "vkGetFenceWin32HandleKHR" ) );
+#  endif /*VK_USE_PLATFORM_WIN32_KHR*/
+
+        //=== VK_KHR_external_memory_fd ===
+        vkGetMemoryFdKHR = PFN_vkGetMemoryFdKHR( vkGetDeviceProcAddr( device, "vkGetMemoryFdKHR" ) );
+        vkGetMemoryFdPropertiesKHR =
+          PFN_vkGetMemoryFdPropertiesKHR( vkGetDeviceProcAddr( device, "vkGetMemoryFdPropertiesKHR" ) );
+
+#  if defined( VK_USE_PLATFORM_WIN32_KHR )
+        //=== VK_KHR_external_memory_win32 ===
+        vkGetMemoryWin32HandleKHR =
+          PFN_vkGetMemoryWin32HandleKHR( vkGetDeviceProcAddr( device, "vkGetMemoryWin32HandleKHR" ) );
+        vkGetMemoryWin32HandlePropertiesKHR = PFN_vkGetMemoryWin32HandlePropertiesKHR(
+          vkGetDeviceProcAddr( device, "vkGetMemoryWin32HandlePropertiesKHR" ) );
+#  endif /*VK_USE_PLATFORM_WIN32_KHR*/
+
+        //=== VK_KHR_external_semaphore_fd ===
+        vkImportSemaphoreFdKHR = PFN_vkImportSemaphoreFdKHR( vkGetDeviceProcAddr( device, "vkImportSemaphoreFdKHR" ) );
+        vkGetSemaphoreFdKHR    = PFN_vkGetSemaphoreFdKHR( vkGetDeviceProcAddr( device, "vkGetSemaphoreFdKHR" ) );
+
+#  if defined( VK_USE_PLATFORM_WIN32_KHR )
+        //=== VK_KHR_external_semaphore_win32 ===
+        vkImportSemaphoreWin32HandleKHR =
+          PFN_vkImportSemaphoreWin32HandleKHR( vkGetDeviceProcAddr( device, "vkImportSemaphoreWin32HandleKHR" ) );
+        vkGetSemaphoreWin32HandleKHR =
+          PFN_vkGetSemaphoreWin32HandleKHR( vkGetDeviceProcAddr( device, "vkGetSemaphoreWin32HandleKHR" ) );
+#  endif /*VK_USE_PLATFORM_WIN32_KHR*/
+
+        //=== VK_KHR_fragment_shading_rate ===
+        vkCmdSetFragmentShadingRateKHR =
+          PFN_vkCmdSetFragmentShadingRateKHR( vkGetDeviceProcAddr( device, "vkCmdSetFragmentShadingRateKHR" ) );
+
+        //=== VK_KHR_get_memory_requirements2 ===
+        vkGetImageMemoryRequirements2KHR =
+          PFN_vkGetImageMemoryRequirements2KHR( vkGetDeviceProcAddr( device, "vkGetImageMemoryRequirements2KHR" ) );
+        if ( !vkGetImageMemoryRequirements2 )
+          vkGetImageMemoryRequirements2 = vkGetImageMemoryRequirements2KHR;
+        vkGetBufferMemoryRequirements2KHR =
+          PFN_vkGetBufferMemoryRequirements2KHR( vkGetDeviceProcAddr( device, "vkGetBufferMemoryRequirements2KHR" ) );
+        if ( !vkGetBufferMemoryRequirements2 )
+          vkGetBufferMemoryRequirements2 = vkGetBufferMemoryRequirements2KHR;
+        vkGetImageSparseMemoryRequirements2KHR = PFN_vkGetImageSparseMemoryRequirements2KHR(
+          vkGetDeviceProcAddr( device, "vkGetImageSparseMemoryRequirements2KHR" ) );
+        if ( !vkGetImageSparseMemoryRequirements2 )
+          vkGetImageSparseMemoryRequirements2 = vkGetImageSparseMemoryRequirements2KHR;
+
+        //=== VK_KHR_maintenance1 ===
+        vkTrimCommandPoolKHR = PFN_vkTrimCommandPoolKHR( vkGetDeviceProcAddr( device, "vkTrimCommandPoolKHR" ) );
+        if ( !vkTrimCommandPool )
+          vkTrimCommandPool = vkTrimCommandPoolKHR;
+
+        //=== VK_KHR_maintenance3 ===
+        vkGetDescriptorSetLayoutSupportKHR =
+          PFN_vkGetDescriptorSetLayoutSupportKHR( vkGetDeviceProcAddr( device, "vkGetDescriptorSetLayoutSupportKHR" ) );
+        if ( !vkGetDescriptorSetLayoutSupport )
+          vkGetDescriptorSetLayoutSupport = vkGetDescriptorSetLayoutSupportKHR;
+
+        //=== VK_KHR_performance_query ===
+        vkAcquireProfilingLockKHR =
+          PFN_vkAcquireProfilingLockKHR( vkGetDeviceProcAddr( device, "vkAcquireProfilingLockKHR" ) );
+        vkReleaseProfilingLockKHR =
+          PFN_vkReleaseProfilingLockKHR( vkGetDeviceProcAddr( device, "vkReleaseProfilingLockKHR" ) );
+
+        //=== VK_KHR_pipeline_executable_properties ===
+        vkGetPipelineExecutablePropertiesKHR = PFN_vkGetPipelineExecutablePropertiesKHR(
+          vkGetDeviceProcAddr( device, "vkGetPipelineExecutablePropertiesKHR" ) );
+        vkGetPipelineExecutableStatisticsKHR = PFN_vkGetPipelineExecutableStatisticsKHR(
+          vkGetDeviceProcAddr( device, "vkGetPipelineExecutableStatisticsKHR" ) );
+        vkGetPipelineExecutableInternalRepresentationsKHR = PFN_vkGetPipelineExecutableInternalRepresentationsKHR(
+          vkGetDeviceProcAddr( device, "vkGetPipelineExecutableInternalRepresentationsKHR" ) );
+
+        //=== VK_KHR_present_wait ===
+        vkWaitForPresentKHR = PFN_vkWaitForPresentKHR( vkGetDeviceProcAddr( device, "vkWaitForPresentKHR" ) );
+
+        //=== VK_KHR_push_descriptor ===
+        vkCmdPushDescriptorSetKHR =
+          PFN_vkCmdPushDescriptorSetKHR( vkGetDeviceProcAddr( device, "vkCmdPushDescriptorSetKHR" ) );
+
+        //=== VK_KHR_ray_tracing_pipeline ===
+        vkCmdTraceRaysKHR = PFN_vkCmdTraceRaysKHR( vkGetDeviceProcAddr( device, "vkCmdTraceRaysKHR" ) );
+        vkCreateRayTracingPipelinesKHR =
+          PFN_vkCreateRayTracingPipelinesKHR( vkGetDeviceProcAddr( device, "vkCreateRayTracingPipelinesKHR" ) );
+        vkGetRayTracingShaderGroupHandlesKHR = PFN_vkGetRayTracingShaderGroupHandlesKHR(
+          vkGetDeviceProcAddr( device, "vkGetRayTracingShaderGroupHandlesKHR" ) );
+        vkGetRayTracingCaptureReplayShaderGroupHandlesKHR = PFN_vkGetRayTracingCaptureReplayShaderGroupHandlesKHR(
+          vkGetDeviceProcAddr( device, "vkGetRayTracingCaptureReplayShaderGroupHandlesKHR" ) );
+        vkCmdTraceRaysIndirectKHR =
+          PFN_vkCmdTraceRaysIndirectKHR( vkGetDeviceProcAddr( device, "vkCmdTraceRaysIndirectKHR" ) );
+        vkGetRayTracingShaderGroupStackSizeKHR = PFN_vkGetRayTracingShaderGroupStackSizeKHR(
+          vkGetDeviceProcAddr( device, "vkGetRayTracingShaderGroupStackSizeKHR" ) );
+        vkCmdSetRayTracingPipelineStackSizeKHR = PFN_vkCmdSetRayTracingPipelineStackSizeKHR(
+          vkGetDeviceProcAddr( device, "vkCmdSetRayTracingPipelineStackSizeKHR" ) );
+
+        //=== VK_KHR_sampler_ycbcr_conversion ===
+        vkCreateSamplerYcbcrConversionKHR =
+          PFN_vkCreateSamplerYcbcrConversionKHR( vkGetDeviceProcAddr( device, "vkCreateSamplerYcbcrConversionKHR" ) );
+        if ( !vkCreateSamplerYcbcrConversion )
+          vkCreateSamplerYcbcrConversion = vkCreateSamplerYcbcrConversionKHR;
+        vkDestroySamplerYcbcrConversionKHR =
+          PFN_vkDestroySamplerYcbcrConversionKHR( vkGetDeviceProcAddr( device, "vkDestroySamplerYcbcrConversionKHR" ) );
+        if ( !vkDestroySamplerYcbcrConversion )
+          vkDestroySamplerYcbcrConversion = vkDestroySamplerYcbcrConversionKHR;
+
+        //=== VK_KHR_shared_presentable_image ===
+        vkGetSwapchainStatusKHR =
+          PFN_vkGetSwapchainStatusKHR( vkGetDeviceProcAddr( device, "vkGetSwapchainStatusKHR" ) );
+
+        //=== VK_KHR_swapchain ===
+        vkCreateSwapchainKHR  = PFN_vkCreateSwapchainKHR( vkGetDeviceProcAddr( device, "vkCreateSwapchainKHR" ) );
+        vkDestroySwapchainKHR = PFN_vkDestroySwapchainKHR( vkGetDeviceProcAddr( device, "vkDestroySwapchainKHR" ) );
+        vkGetSwapchainImagesKHR =
+          PFN_vkGetSwapchainImagesKHR( vkGetDeviceProcAddr( device, "vkGetSwapchainImagesKHR" ) );
+        vkAcquireNextImageKHR = PFN_vkAcquireNextImageKHR( vkGetDeviceProcAddr( device, "vkAcquireNextImageKHR" ) );
+        vkQueuePresentKHR     = PFN_vkQueuePresentKHR( vkGetDeviceProcAddr( device, "vkQueuePresentKHR" ) );
+
+        //=== VK_KHR_synchronization2 ===
+        vkCmdSetEvent2KHR   = PFN_vkCmdSetEvent2KHR( vkGetDeviceProcAddr( device, "vkCmdSetEvent2KHR" ) );
+        vkCmdResetEvent2KHR = PFN_vkCmdResetEvent2KHR( vkGetDeviceProcAddr( device, "vkCmdResetEvent2KHR" ) );
+        vkCmdWaitEvents2KHR = PFN_vkCmdWaitEvents2KHR( vkGetDeviceProcAddr( device, "vkCmdWaitEvents2KHR" ) );
+        vkCmdPipelineBarrier2KHR =
+          PFN_vkCmdPipelineBarrier2KHR( vkGetDeviceProcAddr( device, "vkCmdPipelineBarrier2KHR" ) );
+        vkCmdWriteTimestamp2KHR =
+          PFN_vkCmdWriteTimestamp2KHR( vkGetDeviceProcAddr( device, "vkCmdWriteTimestamp2KHR" ) );
+        vkQueueSubmit2KHR = PFN_vkQueueSubmit2KHR( vkGetDeviceProcAddr( device, "vkQueueSubmit2KHR" ) );
+        vkCmdWriteBufferMarker2AMD =
+          PFN_vkCmdWriteBufferMarker2AMD( vkGetDeviceProcAddr( device, "vkCmdWriteBufferMarker2AMD" ) );
+        vkGetQueueCheckpointData2NV =
+          PFN_vkGetQueueCheckpointData2NV( vkGetDeviceProcAddr( device, "vkGetQueueCheckpointData2NV" ) );
+
+        //=== VK_KHR_timeline_semaphore ===
+        vkGetSemaphoreCounterValueKHR =
+          PFN_vkGetSemaphoreCounterValueKHR( vkGetDeviceProcAddr( device, "vkGetSemaphoreCounterValueKHR" ) );
+        if ( !vkGetSemaphoreCounterValue )
+          vkGetSemaphoreCounterValue = vkGetSemaphoreCounterValueKHR;
         vkWaitSemaphoresKHR = PFN_vkWaitSemaphoresKHR( vkGetDeviceProcAddr( device, "vkWaitSemaphoresKHR" ) );
         if ( !vkWaitSemaphores )
           vkWaitSemaphores = vkWaitSemaphoresKHR;
-        vkWriteAccelerationStructuresPropertiesKHR = PFN_vkWriteAccelerationStructuresPropertiesKHR(
-          vkGetDeviceProcAddr( device, "vkWriteAccelerationStructuresPropertiesKHR" ) );
+        vkSignalSemaphoreKHR = PFN_vkSignalSemaphoreKHR( vkGetDeviceProcAddr( device, "vkSignalSemaphoreKHR" ) );
+        if ( !vkSignalSemaphore )
+          vkSignalSemaphore = vkSignalSemaphoreKHR;
+
+#  if defined( VK_ENABLE_BETA_EXTENSIONS )
+        //=== VK_KHR_video_decode_queue ===
+        vkCmdDecodeVideoKHR = PFN_vkCmdDecodeVideoKHR( vkGetDeviceProcAddr( device, "vkCmdDecodeVideoKHR" ) );
+#  endif /*VK_ENABLE_BETA_EXTENSIONS*/
+
+#  if defined( VK_ENABLE_BETA_EXTENSIONS )
+        //=== VK_KHR_video_encode_queue ===
+        vkCmdEncodeVideoKHR = PFN_vkCmdEncodeVideoKHR( vkGetDeviceProcAddr( device, "vkCmdEncodeVideoKHR" ) );
+#  endif /*VK_ENABLE_BETA_EXTENSIONS*/
+
+#  if defined( VK_ENABLE_BETA_EXTENSIONS )
+        //=== VK_KHR_video_queue ===
+        vkCreateVideoSessionKHR =
+          PFN_vkCreateVideoSessionKHR( vkGetDeviceProcAddr( device, "vkCreateVideoSessionKHR" ) );
+        vkDestroyVideoSessionKHR =
+          PFN_vkDestroyVideoSessionKHR( vkGetDeviceProcAddr( device, "vkDestroyVideoSessionKHR" ) );
+        vkGetVideoSessionMemoryRequirementsKHR = PFN_vkGetVideoSessionMemoryRequirementsKHR(
+          vkGetDeviceProcAddr( device, "vkGetVideoSessionMemoryRequirementsKHR" ) );
+        vkBindVideoSessionMemoryKHR =
+          PFN_vkBindVideoSessionMemoryKHR( vkGetDeviceProcAddr( device, "vkBindVideoSessionMemoryKHR" ) );
+        vkCreateVideoSessionParametersKHR =
+          PFN_vkCreateVideoSessionParametersKHR( vkGetDeviceProcAddr( device, "vkCreateVideoSessionParametersKHR" ) );
+        vkUpdateVideoSessionParametersKHR =
+          PFN_vkUpdateVideoSessionParametersKHR( vkGetDeviceProcAddr( device, "vkUpdateVideoSessionParametersKHR" ) );
+        vkDestroyVideoSessionParametersKHR =
+          PFN_vkDestroyVideoSessionParametersKHR( vkGetDeviceProcAddr( device, "vkDestroyVideoSessionParametersKHR" ) );
+        vkCmdBeginVideoCodingKHR =
+          PFN_vkCmdBeginVideoCodingKHR( vkGetDeviceProcAddr( device, "vkCmdBeginVideoCodingKHR" ) );
+        vkCmdEndVideoCodingKHR = PFN_vkCmdEndVideoCodingKHR( vkGetDeviceProcAddr( device, "vkCmdEndVideoCodingKHR" ) );
+        vkCmdControlVideoCodingKHR =
+          PFN_vkCmdControlVideoCodingKHR( vkGetDeviceProcAddr( device, "vkCmdControlVideoCodingKHR" ) );
+#  endif /*VK_ENABLE_BETA_EXTENSIONS*/
+
+        //=== VK_NVX_binary_import ===
+        vkCreateCuModuleNVX    = PFN_vkCreateCuModuleNVX( vkGetDeviceProcAddr( device, "vkCreateCuModuleNVX" ) );
+        vkCreateCuFunctionNVX  = PFN_vkCreateCuFunctionNVX( vkGetDeviceProcAddr( device, "vkCreateCuFunctionNVX" ) );
+        vkDestroyCuModuleNVX   = PFN_vkDestroyCuModuleNVX( vkGetDeviceProcAddr( device, "vkDestroyCuModuleNVX" ) );
+        vkDestroyCuFunctionNVX = PFN_vkDestroyCuFunctionNVX( vkGetDeviceProcAddr( device, "vkDestroyCuFunctionNVX" ) );
+        vkCmdCuLaunchKernelNVX = PFN_vkCmdCuLaunchKernelNVX( vkGetDeviceProcAddr( device, "vkCmdCuLaunchKernelNVX" ) );
+
+        //=== VK_NVX_image_view_handle ===
+        vkGetImageViewHandleNVX =
+          PFN_vkGetImageViewHandleNVX( vkGetDeviceProcAddr( device, "vkGetImageViewHandleNVX" ) );
+        vkGetImageViewAddressNVX =
+          PFN_vkGetImageViewAddressNVX( vkGetDeviceProcAddr( device, "vkGetImageViewAddressNVX" ) );
+
+        //=== VK_NV_clip_space_w_scaling ===
+        vkCmdSetViewportWScalingNV =
+          PFN_vkCmdSetViewportWScalingNV( vkGetDeviceProcAddr( device, "vkCmdSetViewportWScalingNV" ) );
+
+        //=== VK_NV_device_diagnostic_checkpoints ===
+        vkCmdSetCheckpointNV = PFN_vkCmdSetCheckpointNV( vkGetDeviceProcAddr( device, "vkCmdSetCheckpointNV" ) );
+        vkGetQueueCheckpointDataNV =
+          PFN_vkGetQueueCheckpointDataNV( vkGetDeviceProcAddr( device, "vkGetQueueCheckpointDataNV" ) );
+
+        //=== VK_NV_device_generated_commands ===
+        vkGetGeneratedCommandsMemoryRequirementsNV = PFN_vkGetGeneratedCommandsMemoryRequirementsNV(
+          vkGetDeviceProcAddr( device, "vkGetGeneratedCommandsMemoryRequirementsNV" ) );
+        vkCmdPreprocessGeneratedCommandsNV =
+          PFN_vkCmdPreprocessGeneratedCommandsNV( vkGetDeviceProcAddr( device, "vkCmdPreprocessGeneratedCommandsNV" ) );
+        vkCmdExecuteGeneratedCommandsNV =
+          PFN_vkCmdExecuteGeneratedCommandsNV( vkGetDeviceProcAddr( device, "vkCmdExecuteGeneratedCommandsNV" ) );
+        vkCmdBindPipelineShaderGroupNV =
+          PFN_vkCmdBindPipelineShaderGroupNV( vkGetDeviceProcAddr( device, "vkCmdBindPipelineShaderGroupNV" ) );
+        vkCreateIndirectCommandsLayoutNV =
+          PFN_vkCreateIndirectCommandsLayoutNV( vkGetDeviceProcAddr( device, "vkCreateIndirectCommandsLayoutNV" ) );
+        vkDestroyIndirectCommandsLayoutNV =
+          PFN_vkDestroyIndirectCommandsLayoutNV( vkGetDeviceProcAddr( device, "vkDestroyIndirectCommandsLayoutNV" ) );
+
+        //=== VK_NV_external_memory_rdma ===
+        vkGetMemoryRemoteAddressNV =
+          PFN_vkGetMemoryRemoteAddressNV( vkGetDeviceProcAddr( device, "vkGetMemoryRemoteAddressNV" ) );
+
+#  if defined( VK_USE_PLATFORM_WIN32_KHR )
+        //=== VK_NV_external_memory_win32 ===
+        vkGetMemoryWin32HandleNV =
+          PFN_vkGetMemoryWin32HandleNV( vkGetDeviceProcAddr( device, "vkGetMemoryWin32HandleNV" ) );
+#  endif /*VK_USE_PLATFORM_WIN32_KHR*/
+
+        //=== VK_NV_fragment_shading_rate_enums ===
+        vkCmdSetFragmentShadingRateEnumNV =
+          PFN_vkCmdSetFragmentShadingRateEnumNV( vkGetDeviceProcAddr( device, "vkCmdSetFragmentShadingRateEnumNV" ) );
+
+        //=== VK_NV_mesh_shader ===
+        vkCmdDrawMeshTasksNV = PFN_vkCmdDrawMeshTasksNV( vkGetDeviceProcAddr( device, "vkCmdDrawMeshTasksNV" ) );
+        vkCmdDrawMeshTasksIndirectNV =
+          PFN_vkCmdDrawMeshTasksIndirectNV( vkGetDeviceProcAddr( device, "vkCmdDrawMeshTasksIndirectNV" ) );
+        vkCmdDrawMeshTasksIndirectCountNV =
+          PFN_vkCmdDrawMeshTasksIndirectCountNV( vkGetDeviceProcAddr( device, "vkCmdDrawMeshTasksIndirectCountNV" ) );
+
+        //=== VK_NV_ray_tracing ===
+        vkCreateAccelerationStructureNV =
+          PFN_vkCreateAccelerationStructureNV( vkGetDeviceProcAddr( device, "vkCreateAccelerationStructureNV" ) );
+        vkDestroyAccelerationStructureNV =
+          PFN_vkDestroyAccelerationStructureNV( vkGetDeviceProcAddr( device, "vkDestroyAccelerationStructureNV" ) );
+        vkGetAccelerationStructureMemoryRequirementsNV = PFN_vkGetAccelerationStructureMemoryRequirementsNV(
+          vkGetDeviceProcAddr( device, "vkGetAccelerationStructureMemoryRequirementsNV" ) );
+        vkBindAccelerationStructureMemoryNV = PFN_vkBindAccelerationStructureMemoryNV(
+          vkGetDeviceProcAddr( device, "vkBindAccelerationStructureMemoryNV" ) );
+        vkCmdBuildAccelerationStructureNV =
+          PFN_vkCmdBuildAccelerationStructureNV( vkGetDeviceProcAddr( device, "vkCmdBuildAccelerationStructureNV" ) );
+        vkCmdCopyAccelerationStructureNV =
+          PFN_vkCmdCopyAccelerationStructureNV( vkGetDeviceProcAddr( device, "vkCmdCopyAccelerationStructureNV" ) );
+        vkCmdTraceRaysNV = PFN_vkCmdTraceRaysNV( vkGetDeviceProcAddr( device, "vkCmdTraceRaysNV" ) );
+        vkCreateRayTracingPipelinesNV =
+          PFN_vkCreateRayTracingPipelinesNV( vkGetDeviceProcAddr( device, "vkCreateRayTracingPipelinesNV" ) );
+        vkGetRayTracingShaderGroupHandlesNV = PFN_vkGetRayTracingShaderGroupHandlesNV(
+          vkGetDeviceProcAddr( device, "vkGetRayTracingShaderGroupHandlesNV" ) );
+        if ( !vkGetRayTracingShaderGroupHandlesKHR )
+          vkGetRayTracingShaderGroupHandlesKHR = vkGetRayTracingShaderGroupHandlesNV;
+        vkGetAccelerationStructureHandleNV =
+          PFN_vkGetAccelerationStructureHandleNV( vkGetDeviceProcAddr( device, "vkGetAccelerationStructureHandleNV" ) );
+        vkCmdWriteAccelerationStructuresPropertiesNV = PFN_vkCmdWriteAccelerationStructuresPropertiesNV(
+          vkGetDeviceProcAddr( device, "vkCmdWriteAccelerationStructuresPropertiesNV" ) );
+        vkCompileDeferredNV = PFN_vkCompileDeferredNV( vkGetDeviceProcAddr( device, "vkCompileDeferredNV" ) );
+
+        //=== VK_NV_scissor_exclusive ===
+        vkCmdSetExclusiveScissorNV =
+          PFN_vkCmdSetExclusiveScissorNV( vkGetDeviceProcAddr( device, "vkCmdSetExclusiveScissorNV" ) );
+
+        //=== VK_NV_shading_rate_image ===
+        vkCmdBindShadingRateImageNV =
+          PFN_vkCmdBindShadingRateImageNV( vkGetDeviceProcAddr( device, "vkCmdBindShadingRateImageNV" ) );
+        vkCmdSetViewportShadingRatePaletteNV = PFN_vkCmdSetViewportShadingRatePaletteNV(
+          vkGetDeviceProcAddr( device, "vkCmdSetViewportShadingRatePaletteNV" ) );
+        vkCmdSetCoarseSampleOrderNV =
+          PFN_vkCmdSetCoarseSampleOrderNV( vkGetDeviceProcAddr( device, "vkCmdSetCoarseSampleOrderNV" ) );
       }
 
     public:
-#  if defined( VK_USE_PLATFORM_WIN32_KHR )
-      PFN_vkAcquireFullScreenExclusiveModeEXT vkAcquireFullScreenExclusiveModeEXT = 0;
-#  endif /*VK_USE_PLATFORM_WIN32_KHR*/
-      PFN_vkAcquireNextImage2KHR                 vkAcquireNextImage2KHR                 = 0;
-      PFN_vkAcquireNextImageKHR                  vkAcquireNextImageKHR                  = 0;
-      PFN_vkAcquirePerformanceConfigurationINTEL vkAcquirePerformanceConfigurationINTEL = 0;
-      PFN_vkAcquireProfilingLockKHR              vkAcquireProfilingLockKHR              = 0;
-      PFN_vkAllocateCommandBuffers               vkAllocateCommandBuffers               = 0;
-      PFN_vkAllocateDescriptorSets               vkAllocateDescriptorSets               = 0;
-      PFN_vkAllocateMemory                       vkAllocateMemory                       = 0;
-      PFN_vkBeginCommandBuffer                   vkBeginCommandBuffer                   = 0;
-      PFN_vkBindAccelerationStructureMemoryNV    vkBindAccelerationStructureMemoryNV    = 0;
-      PFN_vkBindBufferMemory                     vkBindBufferMemory                     = 0;
-      PFN_vkBindBufferMemory2                    vkBindBufferMemory2                    = 0;
-      PFN_vkBindBufferMemory2KHR                 vkBindBufferMemory2KHR                 = 0;
-      PFN_vkBindImageMemory                      vkBindImageMemory                      = 0;
-      PFN_vkBindImageMemory2                     vkBindImageMemory2                     = 0;
-      PFN_vkBindImageMemory2KHR                  vkBindImageMemory2KHR                  = 0;
-#  if defined( VK_ENABLE_BETA_EXTENSIONS )
-      PFN_vkBindVideoSessionMemoryKHR vkBindVideoSessionMemoryKHR = 0;
-#  endif /*VK_ENABLE_BETA_EXTENSIONS*/
-      PFN_vkBuildAccelerationStructuresKHR  vkBuildAccelerationStructuresKHR  = 0;
-      PFN_vkCmdBeginConditionalRenderingEXT vkCmdBeginConditionalRenderingEXT = 0;
-      PFN_vkCmdBeginDebugUtilsLabelEXT      vkCmdBeginDebugUtilsLabelEXT      = 0;
-      PFN_vkCmdBeginQuery                   vkCmdBeginQuery                   = 0;
-      PFN_vkCmdBeginQueryIndexedEXT         vkCmdBeginQueryIndexedEXT         = 0;
-      PFN_vkCmdBeginRenderPass              vkCmdBeginRenderPass              = 0;
-      PFN_vkCmdBeginRenderPass2             vkCmdBeginRenderPass2             = 0;
-      PFN_vkCmdBeginRenderPass2KHR          vkCmdBeginRenderPass2KHR          = 0;
-      PFN_vkCmdBeginTransformFeedbackEXT    vkCmdBeginTransformFeedbackEXT    = 0;
-#  if defined( VK_ENABLE_BETA_EXTENSIONS )
-      PFN_vkCmdBeginVideoCodingKHR vkCmdBeginVideoCodingKHR = 0;
-#  endif /*VK_ENABLE_BETA_EXTENSIONS*/
-      PFN_vkCmdBindDescriptorSets                     vkCmdBindDescriptorSets                     = 0;
-      PFN_vkCmdBindIndexBuffer                        vkCmdBindIndexBuffer                        = 0;
-      PFN_vkCmdBindPipeline                           vkCmdBindPipeline                           = 0;
-      PFN_vkCmdBindPipelineShaderGroupNV              vkCmdBindPipelineShaderGroupNV              = 0;
-      PFN_vkCmdBindShadingRateImageNV                 vkCmdBindShadingRateImageNV                 = 0;
-      PFN_vkCmdBindTransformFeedbackBuffersEXT        vkCmdBindTransformFeedbackBuffersEXT        = 0;
-      PFN_vkCmdBindVertexBuffers                      vkCmdBindVertexBuffers                      = 0;
-      PFN_vkCmdBindVertexBuffers2EXT                  vkCmdBindVertexBuffers2EXT                  = 0;
-      PFN_vkCmdBlitImage                              vkCmdBlitImage                              = 0;
-      PFN_vkCmdBlitImage2KHR                          vkCmdBlitImage2KHR                          = 0;
-      PFN_vkCmdBuildAccelerationStructureNV           vkCmdBuildAccelerationStructureNV           = 0;
-      PFN_vkCmdBuildAccelerationStructuresIndirectKHR vkCmdBuildAccelerationStructuresIndirectKHR = 0;
-      PFN_vkCmdBuildAccelerationStructuresKHR         vkCmdBuildAccelerationStructuresKHR         = 0;
-      PFN_vkCmdClearAttachments                       vkCmdClearAttachments                       = 0;
-      PFN_vkCmdClearColorImage                        vkCmdClearColorImage                        = 0;
-      PFN_vkCmdClearDepthStencilImage                 vkCmdClearDepthStencilImage                 = 0;
-#  if defined( VK_ENABLE_BETA_EXTENSIONS )
-      PFN_vkCmdControlVideoCodingKHR vkCmdControlVideoCodingKHR = 0;
-#  endif /*VK_ENABLE_BETA_EXTENSIONS*/
-      PFN_vkCmdCopyAccelerationStructureKHR         vkCmdCopyAccelerationStructureKHR         = 0;
-      PFN_vkCmdCopyAccelerationStructureNV          vkCmdCopyAccelerationStructureNV          = 0;
-      PFN_vkCmdCopyAccelerationStructureToMemoryKHR vkCmdCopyAccelerationStructureToMemoryKHR = 0;
-      PFN_vkCmdCopyBuffer                           vkCmdCopyBuffer                           = 0;
-      PFN_vkCmdCopyBuffer2KHR                       vkCmdCopyBuffer2KHR                       = 0;
-      PFN_vkCmdCopyBufferToImage                    vkCmdCopyBufferToImage                    = 0;
-      PFN_vkCmdCopyBufferToImage2KHR                vkCmdCopyBufferToImage2KHR                = 0;
-      PFN_vkCmdCopyImage                            vkCmdCopyImage                            = 0;
-      PFN_vkCmdCopyImage2KHR                        vkCmdCopyImage2KHR                        = 0;
-      PFN_vkCmdCopyImageToBuffer                    vkCmdCopyImageToBuffer                    = 0;
-      PFN_vkCmdCopyImageToBuffer2KHR                vkCmdCopyImageToBuffer2KHR                = 0;
-      PFN_vkCmdCopyMemoryToAccelerationStructureKHR vkCmdCopyMemoryToAccelerationStructureKHR = 0;
-      PFN_vkCmdCopyQueryPoolResults                 vkCmdCopyQueryPoolResults                 = 0;
-      PFN_vkCmdCuLaunchKernelNVX                    vkCmdCuLaunchKernelNVX                    = 0;
-      PFN_vkCmdDebugMarkerBeginEXT                  vkCmdDebugMarkerBeginEXT                  = 0;
-      PFN_vkCmdDebugMarkerEndEXT                    vkCmdDebugMarkerEndEXT                    = 0;
-      PFN_vkCmdDebugMarkerInsertEXT                 vkCmdDebugMarkerInsertEXT                 = 0;
-#  if defined( VK_ENABLE_BETA_EXTENSIONS )
-      PFN_vkCmdDecodeVideoKHR vkCmdDecodeVideoKHR = 0;
-#  endif /*VK_ENABLE_BETA_EXTENSIONS*/
-      PFN_vkCmdDispatch                     vkCmdDispatch                     = 0;
-      PFN_vkCmdDispatchBase                 vkCmdDispatchBase                 = 0;
-      PFN_vkCmdDispatchBaseKHR              vkCmdDispatchBaseKHR              = 0;
-      PFN_vkCmdDispatchIndirect             vkCmdDispatchIndirect             = 0;
-      PFN_vkCmdDraw                         vkCmdDraw                         = 0;
-      PFN_vkCmdDrawIndexed                  vkCmdDrawIndexed                  = 0;
-      PFN_vkCmdDrawIndexedIndirect          vkCmdDrawIndexedIndirect          = 0;
-      PFN_vkCmdDrawIndexedIndirectCount     vkCmdDrawIndexedIndirectCount     = 0;
-      PFN_vkCmdDrawIndexedIndirectCountAMD  vkCmdDrawIndexedIndirectCountAMD  = 0;
-      PFN_vkCmdDrawIndexedIndirectCountKHR  vkCmdDrawIndexedIndirectCountKHR  = 0;
-      PFN_vkCmdDrawIndirect                 vkCmdDrawIndirect                 = 0;
-      PFN_vkCmdDrawIndirectByteCountEXT     vkCmdDrawIndirectByteCountEXT     = 0;
-      PFN_vkCmdDrawIndirectCount            vkCmdDrawIndirectCount            = 0;
-      PFN_vkCmdDrawIndirectCountAMD         vkCmdDrawIndirectCountAMD         = 0;
-      PFN_vkCmdDrawIndirectCountKHR         vkCmdDrawIndirectCountKHR         = 0;
-      PFN_vkCmdDrawMeshTasksIndirectCountNV vkCmdDrawMeshTasksIndirectCountNV = 0;
-      PFN_vkCmdDrawMeshTasksIndirectNV      vkCmdDrawMeshTasksIndirectNV      = 0;
-      PFN_vkCmdDrawMeshTasksNV              vkCmdDrawMeshTasksNV              = 0;
-      PFN_vkCmdDrawMultiEXT                 vkCmdDrawMultiEXT                 = 0;
-      PFN_vkCmdDrawMultiIndexedEXT          vkCmdDrawMultiIndexedEXT          = 0;
-#  if defined( VK_ENABLE_BETA_EXTENSIONS )
-      PFN_vkCmdEncodeVideoKHR vkCmdEncodeVideoKHR = 0;
-#  endif /*VK_ENABLE_BETA_EXTENSIONS*/
-      PFN_vkCmdEndConditionalRenderingEXT vkCmdEndConditionalRenderingEXT = 0;
-      PFN_vkCmdEndDebugUtilsLabelEXT      vkCmdEndDebugUtilsLabelEXT      = 0;
-      PFN_vkCmdEndQuery                   vkCmdEndQuery                   = 0;
-      PFN_vkCmdEndQueryIndexedEXT         vkCmdEndQueryIndexedEXT         = 0;
-      PFN_vkCmdEndRenderPass              vkCmdEndRenderPass              = 0;
-      PFN_vkCmdEndRenderPass2             vkCmdEndRenderPass2             = 0;
-      PFN_vkCmdEndRenderPass2KHR          vkCmdEndRenderPass2KHR          = 0;
-      PFN_vkCmdEndTransformFeedbackEXT    vkCmdEndTransformFeedbackEXT    = 0;
-#  if defined( VK_ENABLE_BETA_EXTENSIONS )
-      PFN_vkCmdEndVideoCodingKHR vkCmdEndVideoCodingKHR = 0;
-#  endif /*VK_ENABLE_BETA_EXTENSIONS*/
-      PFN_vkCmdExecuteCommands                          vkCmdExecuteCommands                          = 0;
-      PFN_vkCmdExecuteGeneratedCommandsNV               vkCmdExecuteGeneratedCommandsNV               = 0;
-      PFN_vkCmdFillBuffer                               vkCmdFillBuffer                               = 0;
-      PFN_vkCmdInsertDebugUtilsLabelEXT                 vkCmdInsertDebugUtilsLabelEXT                 = 0;
-      PFN_vkCmdNextSubpass                              vkCmdNextSubpass                              = 0;
-      PFN_vkCmdNextSubpass2                             vkCmdNextSubpass2                             = 0;
-      PFN_vkCmdNextSubpass2KHR                          vkCmdNextSubpass2KHR                          = 0;
-      PFN_vkCmdPipelineBarrier                          vkCmdPipelineBarrier                          = 0;
-      PFN_vkCmdPipelineBarrier2KHR                      vkCmdPipelineBarrier2KHR                      = 0;
-      PFN_vkCmdPreprocessGeneratedCommandsNV            vkCmdPreprocessGeneratedCommandsNV            = 0;
-      PFN_vkCmdPushConstants                            vkCmdPushConstants                            = 0;
-      PFN_vkCmdPushDescriptorSetKHR                     vkCmdPushDescriptorSetKHR                     = 0;
-      PFN_vkCmdPushDescriptorSetWithTemplateKHR         vkCmdPushDescriptorSetWithTemplateKHR         = 0;
-      PFN_vkCmdResetEvent                               vkCmdResetEvent                               = 0;
-      PFN_vkCmdResetEvent2KHR                           vkCmdResetEvent2KHR                           = 0;
-      PFN_vkCmdResetQueryPool                           vkCmdResetQueryPool                           = 0;
-      PFN_vkCmdResolveImage                             vkCmdResolveImage                             = 0;
-      PFN_vkCmdResolveImage2KHR                         vkCmdResolveImage2KHR                         = 0;
-      PFN_vkCmdSetBlendConstants                        vkCmdSetBlendConstants                        = 0;
-      PFN_vkCmdSetCheckpointNV                          vkCmdSetCheckpointNV                          = 0;
-      PFN_vkCmdSetCoarseSampleOrderNV                   vkCmdSetCoarseSampleOrderNV                   = 0;
-      PFN_vkCmdSetColorWriteEnableEXT                   vkCmdSetColorWriteEnableEXT                   = 0;
-      PFN_vkCmdSetCullModeEXT                           vkCmdSetCullModeEXT                           = 0;
-      PFN_vkCmdSetDepthBias                             vkCmdSetDepthBias                             = 0;
-      PFN_vkCmdSetDepthBiasEnableEXT                    vkCmdSetDepthBiasEnableEXT                    = 0;
-      PFN_vkCmdSetDepthBounds                           vkCmdSetDepthBounds                           = 0;
-      PFN_vkCmdSetDepthBoundsTestEnableEXT              vkCmdSetDepthBoundsTestEnableEXT              = 0;
-      PFN_vkCmdSetDepthCompareOpEXT                     vkCmdSetDepthCompareOpEXT                     = 0;
-      PFN_vkCmdSetDepthTestEnableEXT                    vkCmdSetDepthTestEnableEXT                    = 0;
-      PFN_vkCmdSetDepthWriteEnableEXT                   vkCmdSetDepthWriteEnableEXT                   = 0;
-      PFN_vkCmdSetDeviceMask                            vkCmdSetDeviceMask                            = 0;
-      PFN_vkCmdSetDeviceMaskKHR                         vkCmdSetDeviceMaskKHR                         = 0;
-      PFN_vkCmdSetDiscardRectangleEXT                   vkCmdSetDiscardRectangleEXT                   = 0;
-      PFN_vkCmdSetEvent                                 vkCmdSetEvent                                 = 0;
-      PFN_vkCmdSetEvent2KHR                             vkCmdSetEvent2KHR                             = 0;
-      PFN_vkCmdSetExclusiveScissorNV                    vkCmdSetExclusiveScissorNV                    = 0;
-      PFN_vkCmdSetFragmentShadingRateEnumNV             vkCmdSetFragmentShadingRateEnumNV             = 0;
-      PFN_vkCmdSetFragmentShadingRateKHR                vkCmdSetFragmentShadingRateKHR                = 0;
-      PFN_vkCmdSetFrontFaceEXT                          vkCmdSetFrontFaceEXT                          = 0;
-      PFN_vkCmdSetLineStippleEXT                        vkCmdSetLineStippleEXT                        = 0;
-      PFN_vkCmdSetLineWidth                             vkCmdSetLineWidth                             = 0;
-      PFN_vkCmdSetLogicOpEXT                            vkCmdSetLogicOpEXT                            = 0;
-      PFN_vkCmdSetPatchControlPointsEXT                 vkCmdSetPatchControlPointsEXT                 = 0;
-      PFN_vkCmdSetPerformanceMarkerINTEL                vkCmdSetPerformanceMarkerINTEL                = 0;
-      PFN_vkCmdSetPerformanceOverrideINTEL              vkCmdSetPerformanceOverrideINTEL              = 0;
-      PFN_vkCmdSetPerformanceStreamMarkerINTEL          vkCmdSetPerformanceStreamMarkerINTEL          = 0;
-      PFN_vkCmdSetPrimitiveRestartEnableEXT             vkCmdSetPrimitiveRestartEnableEXT             = 0;
-      PFN_vkCmdSetPrimitiveTopologyEXT                  vkCmdSetPrimitiveTopologyEXT                  = 0;
-      PFN_vkCmdSetRasterizerDiscardEnableEXT            vkCmdSetRasterizerDiscardEnableEXT            = 0;
-      PFN_vkCmdSetRayTracingPipelineStackSizeKHR        vkCmdSetRayTracingPipelineStackSizeKHR        = 0;
-      PFN_vkCmdSetSampleLocationsEXT                    vkCmdSetSampleLocationsEXT                    = 0;
-      PFN_vkCmdSetScissor                               vkCmdSetScissor                               = 0;
-      PFN_vkCmdSetScissorWithCountEXT                   vkCmdSetScissorWithCountEXT                   = 0;
-      PFN_vkCmdSetStencilCompareMask                    vkCmdSetStencilCompareMask                    = 0;
-      PFN_vkCmdSetStencilOpEXT                          vkCmdSetStencilOpEXT                          = 0;
-      PFN_vkCmdSetStencilReference                      vkCmdSetStencilReference                      = 0;
-      PFN_vkCmdSetStencilTestEnableEXT                  vkCmdSetStencilTestEnableEXT                  = 0;
-      PFN_vkCmdSetStencilWriteMask                      vkCmdSetStencilWriteMask                      = 0;
-      PFN_vkCmdSetVertexInputEXT                        vkCmdSetVertexInputEXT                        = 0;
-      PFN_vkCmdSetViewport                              vkCmdSetViewport                              = 0;
-      PFN_vkCmdSetViewportShadingRatePaletteNV          vkCmdSetViewportShadingRatePaletteNV          = 0;
-      PFN_vkCmdSetViewportWScalingNV                    vkCmdSetViewportWScalingNV                    = 0;
-      PFN_vkCmdSetViewportWithCountEXT                  vkCmdSetViewportWithCountEXT                  = 0;
-      PFN_vkCmdSubpassShadingHUAWEI                     vkCmdSubpassShadingHUAWEI                     = 0;
-      PFN_vkCmdTraceRaysIndirectKHR                     vkCmdTraceRaysIndirectKHR                     = 0;
-      PFN_vkCmdTraceRaysKHR                             vkCmdTraceRaysKHR                             = 0;
-      PFN_vkCmdTraceRaysNV                              vkCmdTraceRaysNV                              = 0;
-      PFN_vkCmdUpdateBuffer                             vkCmdUpdateBuffer                             = 0;
-      PFN_vkCmdWaitEvents                               vkCmdWaitEvents                               = 0;
-      PFN_vkCmdWaitEvents2KHR                           vkCmdWaitEvents2KHR                           = 0;
-      PFN_vkCmdWriteAccelerationStructuresPropertiesKHR vkCmdWriteAccelerationStructuresPropertiesKHR = 0;
-      PFN_vkCmdWriteAccelerationStructuresPropertiesNV  vkCmdWriteAccelerationStructuresPropertiesNV  = 0;
-      PFN_vkCmdWriteBufferMarker2AMD                    vkCmdWriteBufferMarker2AMD                    = 0;
-      PFN_vkCmdWriteBufferMarkerAMD                     vkCmdWriteBufferMarkerAMD                     = 0;
-      PFN_vkCmdWriteTimestamp                           vkCmdWriteTimestamp                           = 0;
-      PFN_vkCmdWriteTimestamp2KHR                       vkCmdWriteTimestamp2KHR                       = 0;
-      PFN_vkCompileDeferredNV                           vkCompileDeferredNV                           = 0;
-      PFN_vkCopyAccelerationStructureKHR                vkCopyAccelerationStructureKHR                = 0;
-      PFN_vkCopyAccelerationStructureToMemoryKHR        vkCopyAccelerationStructureToMemoryKHR        = 0;
-      PFN_vkCopyMemoryToAccelerationStructureKHR        vkCopyMemoryToAccelerationStructureKHR        = 0;
-      PFN_vkCreateAccelerationStructureKHR              vkCreateAccelerationStructureKHR              = 0;
-      PFN_vkCreateAccelerationStructureNV               vkCreateAccelerationStructureNV               = 0;
-      PFN_vkCreateBuffer                                vkCreateBuffer                                = 0;
-      PFN_vkCreateBufferView                            vkCreateBufferView                            = 0;
-      PFN_vkCreateCommandPool                           vkCreateCommandPool                           = 0;
-      PFN_vkCreateComputePipelines                      vkCreateComputePipelines                      = 0;
-      PFN_vkCreateCuFunctionNVX                         vkCreateCuFunctionNVX                         = 0;
-      PFN_vkCreateCuModuleNVX                           vkCreateCuModuleNVX                           = 0;
-      PFN_vkCreateDeferredOperationKHR                  vkCreateDeferredOperationKHR                  = 0;
-      PFN_vkCreateDescriptorPool                        vkCreateDescriptorPool                        = 0;
-      PFN_vkCreateDescriptorSetLayout                   vkCreateDescriptorSetLayout                   = 0;
-      PFN_vkCreateDescriptorUpdateTemplate              vkCreateDescriptorUpdateTemplate              = 0;
-      PFN_vkCreateDescriptorUpdateTemplateKHR           vkCreateDescriptorUpdateTemplateKHR           = 0;
-      PFN_vkCreateEvent                                 vkCreateEvent                                 = 0;
-      PFN_vkCreateFence                                 vkCreateFence                                 = 0;
-      PFN_vkCreateFramebuffer                           vkCreateFramebuffer                           = 0;
-      PFN_vkCreateGraphicsPipelines                     vkCreateGraphicsPipelines                     = 0;
-      PFN_vkCreateImage                                 vkCreateImage                                 = 0;
-      PFN_vkCreateImageView                             vkCreateImageView                             = 0;
-      PFN_vkCreateIndirectCommandsLayoutNV              vkCreateIndirectCommandsLayoutNV              = 0;
-      PFN_vkCreatePipelineCache                         vkCreatePipelineCache                         = 0;
-      PFN_vkCreatePipelineLayout                        vkCreatePipelineLayout                        = 0;
-      PFN_vkCreatePrivateDataSlotEXT                    vkCreatePrivateDataSlotEXT                    = 0;
-      PFN_vkCreateQueryPool                             vkCreateQueryPool                             = 0;
-      PFN_vkCreateRayTracingPipelinesKHR                vkCreateRayTracingPipelinesKHR                = 0;
-      PFN_vkCreateRayTracingPipelinesNV                 vkCreateRayTracingPipelinesNV                 = 0;
-      PFN_vkCreateRenderPass                            vkCreateRenderPass                            = 0;
-      PFN_vkCreateRenderPass2                           vkCreateRenderPass2                           = 0;
-      PFN_vkCreateRenderPass2KHR                        vkCreateRenderPass2KHR                        = 0;
-      PFN_vkCreateSampler                               vkCreateSampler                               = 0;
-      PFN_vkCreateSamplerYcbcrConversion                vkCreateSamplerYcbcrConversion                = 0;
-      PFN_vkCreateSamplerYcbcrConversionKHR             vkCreateSamplerYcbcrConversionKHR             = 0;
-      PFN_vkCreateSemaphore                             vkCreateSemaphore                             = 0;
-      PFN_vkCreateShaderModule                          vkCreateShaderModule                          = 0;
-      PFN_vkCreateSharedSwapchainsKHR                   vkCreateSharedSwapchainsKHR                   = 0;
-      PFN_vkCreateSwapchainKHR                          vkCreateSwapchainKHR                          = 0;
-      PFN_vkCreateValidationCacheEXT                    vkCreateValidationCacheEXT                    = 0;
-#  if defined( VK_ENABLE_BETA_EXTENSIONS )
-      PFN_vkCreateVideoSessionKHR vkCreateVideoSessionKHR = 0;
-#  endif /*VK_ENABLE_BETA_EXTENSIONS*/
-#  if defined( VK_ENABLE_BETA_EXTENSIONS )
-      PFN_vkCreateVideoSessionParametersKHR vkCreateVideoSessionParametersKHR = 0;
-#  endif /*VK_ENABLE_BETA_EXTENSIONS*/
-      PFN_vkDebugMarkerSetObjectNameEXT        vkDebugMarkerSetObjectNameEXT        = 0;
-      PFN_vkDebugMarkerSetObjectTagEXT         vkDebugMarkerSetObjectTagEXT         = 0;
-      PFN_vkDeferredOperationJoinKHR           vkDeferredOperationJoinKHR           = 0;
-      PFN_vkDestroyAccelerationStructureKHR    vkDestroyAccelerationStructureKHR    = 0;
-      PFN_vkDestroyAccelerationStructureNV     vkDestroyAccelerationStructureNV     = 0;
-      PFN_vkDestroyBuffer                      vkDestroyBuffer                      = 0;
-      PFN_vkDestroyBufferView                  vkDestroyBufferView                  = 0;
-      PFN_vkDestroyCommandPool                 vkDestroyCommandPool                 = 0;
-      PFN_vkDestroyCuFunctionNVX               vkDestroyCuFunctionNVX               = 0;
-      PFN_vkDestroyCuModuleNVX                 vkDestroyCuModuleNVX                 = 0;
-      PFN_vkDestroyDeferredOperationKHR        vkDestroyDeferredOperationKHR        = 0;
-      PFN_vkDestroyDescriptorPool              vkDestroyDescriptorPool              = 0;
-      PFN_vkDestroyDescriptorSetLayout         vkDestroyDescriptorSetLayout         = 0;
-      PFN_vkDestroyDescriptorUpdateTemplate    vkDestroyDescriptorUpdateTemplate    = 0;
-      PFN_vkDestroyDescriptorUpdateTemplateKHR vkDestroyDescriptorUpdateTemplateKHR = 0;
-      PFN_vkDestroyDevice                      vkDestroyDevice                      = 0;
-      PFN_vkDestroyEvent                       vkDestroyEvent                       = 0;
-      PFN_vkDestroyFence                       vkDestroyFence                       = 0;
-      PFN_vkDestroyFramebuffer                 vkDestroyFramebuffer                 = 0;
-      PFN_vkDestroyImage                       vkDestroyImage                       = 0;
-      PFN_vkDestroyImageView                   vkDestroyImageView                   = 0;
-      PFN_vkDestroyIndirectCommandsLayoutNV    vkDestroyIndirectCommandsLayoutNV    = 0;
-      PFN_vkDestroyPipeline                    vkDestroyPipeline                    = 0;
-      PFN_vkDestroyPipelineCache               vkDestroyPipelineCache               = 0;
-      PFN_vkDestroyPipelineLayout              vkDestroyPipelineLayout              = 0;
-      PFN_vkDestroyPrivateDataSlotEXT          vkDestroyPrivateDataSlotEXT          = 0;
-      PFN_vkDestroyQueryPool                   vkDestroyQueryPool                   = 0;
-      PFN_vkDestroyRenderPass                  vkDestroyRenderPass                  = 0;
-      PFN_vkDestroySampler                     vkDestroySampler                     = 0;
-      PFN_vkDestroySamplerYcbcrConversion      vkDestroySamplerYcbcrConversion      = 0;
-      PFN_vkDestroySamplerYcbcrConversionKHR   vkDestroySamplerYcbcrConversionKHR   = 0;
-      PFN_vkDestroySemaphore                   vkDestroySemaphore                   = 0;
-      PFN_vkDestroyShaderModule                vkDestroyShaderModule                = 0;
-      PFN_vkDestroySwapchainKHR                vkDestroySwapchainKHR                = 0;
-      PFN_vkDestroyValidationCacheEXT          vkDestroyValidationCacheEXT          = 0;
-#  if defined( VK_ENABLE_BETA_EXTENSIONS )
-      PFN_vkDestroyVideoSessionKHR vkDestroyVideoSessionKHR = 0;
-#  endif /*VK_ENABLE_BETA_EXTENSIONS*/
-#  if defined( VK_ENABLE_BETA_EXTENSIONS )
-      PFN_vkDestroyVideoSessionParametersKHR vkDestroyVideoSessionParametersKHR = 0;
-#  endif /*VK_ENABLE_BETA_EXTENSIONS*/
-      PFN_vkDeviceWaitIdle                               vkDeviceWaitIdle                               = 0;
-      PFN_vkDisplayPowerControlEXT                       vkDisplayPowerControlEXT                       = 0;
-      PFN_vkEndCommandBuffer                             vkEndCommandBuffer                             = 0;
-      PFN_vkFlushMappedMemoryRanges                      vkFlushMappedMemoryRanges                      = 0;
-      PFN_vkFreeCommandBuffers                           vkFreeCommandBuffers                           = 0;
-      PFN_vkFreeDescriptorSets                           vkFreeDescriptorSets                           = 0;
-      PFN_vkFreeMemory                                   vkFreeMemory                                   = 0;
-      PFN_vkGetAccelerationStructureBuildSizesKHR        vkGetAccelerationStructureBuildSizesKHR        = 0;
-      PFN_vkGetAccelerationStructureDeviceAddressKHR     vkGetAccelerationStructureDeviceAddressKHR     = 0;
-      PFN_vkGetAccelerationStructureHandleNV             vkGetAccelerationStructureHandleNV             = 0;
-      PFN_vkGetAccelerationStructureMemoryRequirementsNV vkGetAccelerationStructureMemoryRequirementsNV = 0;
+      //=== VK_VERSION_1_0 ===
+      PFN_vkGetDeviceProcAddr                vkGetDeviceProcAddr                = 0;
+      PFN_vkDestroyDevice                    vkDestroyDevice                    = 0;
+      PFN_vkGetDeviceQueue                   vkGetDeviceQueue                   = 0;
+      PFN_vkQueueSubmit                      vkQueueSubmit                      = 0;
+      PFN_vkQueueWaitIdle                    vkQueueWaitIdle                    = 0;
+      PFN_vkDeviceWaitIdle                   vkDeviceWaitIdle                   = 0;
+      PFN_vkAllocateMemory                   vkAllocateMemory                   = 0;
+      PFN_vkFreeMemory                       vkFreeMemory                       = 0;
+      PFN_vkMapMemory                        vkMapMemory                        = 0;
+      PFN_vkUnmapMemory                      vkUnmapMemory                      = 0;
+      PFN_vkFlushMappedMemoryRanges          vkFlushMappedMemoryRanges          = 0;
+      PFN_vkInvalidateMappedMemoryRanges     vkInvalidateMappedMemoryRanges     = 0;
+      PFN_vkGetDeviceMemoryCommitment        vkGetDeviceMemoryCommitment        = 0;
+      PFN_vkBindBufferMemory                 vkBindBufferMemory                 = 0;
+      PFN_vkBindImageMemory                  vkBindImageMemory                  = 0;
+      PFN_vkGetBufferMemoryRequirements      vkGetBufferMemoryRequirements      = 0;
+      PFN_vkGetImageMemoryRequirements       vkGetImageMemoryRequirements       = 0;
+      PFN_vkGetImageSparseMemoryRequirements vkGetImageSparseMemoryRequirements = 0;
+      PFN_vkQueueBindSparse                  vkQueueBindSparse                  = 0;
+      PFN_vkCreateFence                      vkCreateFence                      = 0;
+      PFN_vkDestroyFence                     vkDestroyFence                     = 0;
+      PFN_vkResetFences                      vkResetFences                      = 0;
+      PFN_vkGetFenceStatus                   vkGetFenceStatus                   = 0;
+      PFN_vkWaitForFences                    vkWaitForFences                    = 0;
+      PFN_vkCreateSemaphore                  vkCreateSemaphore                  = 0;
+      PFN_vkDestroySemaphore                 vkDestroySemaphore                 = 0;
+      PFN_vkCreateEvent                      vkCreateEvent                      = 0;
+      PFN_vkDestroyEvent                     vkDestroyEvent                     = 0;
+      PFN_vkGetEventStatus                   vkGetEventStatus                   = 0;
+      PFN_vkSetEvent                         vkSetEvent                         = 0;
+      PFN_vkResetEvent                       vkResetEvent                       = 0;
+      PFN_vkCreateQueryPool                  vkCreateQueryPool                  = 0;
+      PFN_vkDestroyQueryPool                 vkDestroyQueryPool                 = 0;
+      PFN_vkGetQueryPoolResults              vkGetQueryPoolResults              = 0;
+      PFN_vkCreateBuffer                     vkCreateBuffer                     = 0;
+      PFN_vkDestroyBuffer                    vkDestroyBuffer                    = 0;
+      PFN_vkCreateBufferView                 vkCreateBufferView                 = 0;
+      PFN_vkDestroyBufferView                vkDestroyBufferView                = 0;
+      PFN_vkCreateImage                      vkCreateImage                      = 0;
+      PFN_vkDestroyImage                     vkDestroyImage                     = 0;
+      PFN_vkGetImageSubresourceLayout        vkGetImageSubresourceLayout        = 0;
+      PFN_vkCreateImageView                  vkCreateImageView                  = 0;
+      PFN_vkDestroyImageView                 vkDestroyImageView                 = 0;
+      PFN_vkCreateShaderModule               vkCreateShaderModule               = 0;
+      PFN_vkDestroyShaderModule              vkDestroyShaderModule              = 0;
+      PFN_vkCreatePipelineCache              vkCreatePipelineCache              = 0;
+      PFN_vkDestroyPipelineCache             vkDestroyPipelineCache             = 0;
+      PFN_vkGetPipelineCacheData             vkGetPipelineCacheData             = 0;
+      PFN_vkMergePipelineCaches              vkMergePipelineCaches              = 0;
+      PFN_vkCreateGraphicsPipelines          vkCreateGraphicsPipelines          = 0;
+      PFN_vkCreateComputePipelines           vkCreateComputePipelines           = 0;
+      PFN_vkDestroyPipeline                  vkDestroyPipeline                  = 0;
+      PFN_vkCreatePipelineLayout             vkCreatePipelineLayout             = 0;
+      PFN_vkDestroyPipelineLayout            vkDestroyPipelineLayout            = 0;
+      PFN_vkCreateSampler                    vkCreateSampler                    = 0;
+      PFN_vkDestroySampler                   vkDestroySampler                   = 0;
+      PFN_vkCreateDescriptorSetLayout        vkCreateDescriptorSetLayout        = 0;
+      PFN_vkDestroyDescriptorSetLayout       vkDestroyDescriptorSetLayout       = 0;
+      PFN_vkCreateDescriptorPool             vkCreateDescriptorPool             = 0;
+      PFN_vkDestroyDescriptorPool            vkDestroyDescriptorPool            = 0;
+      PFN_vkResetDescriptorPool              vkResetDescriptorPool              = 0;
+      PFN_vkAllocateDescriptorSets           vkAllocateDescriptorSets           = 0;
+      PFN_vkFreeDescriptorSets               vkFreeDescriptorSets               = 0;
+      PFN_vkUpdateDescriptorSets             vkUpdateDescriptorSets             = 0;
+      PFN_vkCreateFramebuffer                vkCreateFramebuffer                = 0;
+      PFN_vkDestroyFramebuffer               vkDestroyFramebuffer               = 0;
+      PFN_vkCreateRenderPass                 vkCreateRenderPass                 = 0;
+      PFN_vkDestroyRenderPass                vkDestroyRenderPass                = 0;
+      PFN_vkGetRenderAreaGranularity         vkGetRenderAreaGranularity         = 0;
+      PFN_vkCreateCommandPool                vkCreateCommandPool                = 0;
+      PFN_vkDestroyCommandPool               vkDestroyCommandPool               = 0;
+      PFN_vkResetCommandPool                 vkResetCommandPool                 = 0;
+      PFN_vkAllocateCommandBuffers           vkAllocateCommandBuffers           = 0;
+      PFN_vkFreeCommandBuffers               vkFreeCommandBuffers               = 0;
+      PFN_vkBeginCommandBuffer               vkBeginCommandBuffer               = 0;
+      PFN_vkEndCommandBuffer                 vkEndCommandBuffer                 = 0;
+      PFN_vkResetCommandBuffer               vkResetCommandBuffer               = 0;
+      PFN_vkCmdBindPipeline                  vkCmdBindPipeline                  = 0;
+      PFN_vkCmdSetViewport                   vkCmdSetViewport                   = 0;
+      PFN_vkCmdSetScissor                    vkCmdSetScissor                    = 0;
+      PFN_vkCmdSetLineWidth                  vkCmdSetLineWidth                  = 0;
+      PFN_vkCmdSetDepthBias                  vkCmdSetDepthBias                  = 0;
+      PFN_vkCmdSetBlendConstants             vkCmdSetBlendConstants             = 0;
+      PFN_vkCmdSetDepthBounds                vkCmdSetDepthBounds                = 0;
+      PFN_vkCmdSetStencilCompareMask         vkCmdSetStencilCompareMask         = 0;
+      PFN_vkCmdSetStencilWriteMask           vkCmdSetStencilWriteMask           = 0;
+      PFN_vkCmdSetStencilReference           vkCmdSetStencilReference           = 0;
+      PFN_vkCmdBindDescriptorSets            vkCmdBindDescriptorSets            = 0;
+      PFN_vkCmdBindIndexBuffer               vkCmdBindIndexBuffer               = 0;
+      PFN_vkCmdBindVertexBuffers             vkCmdBindVertexBuffers             = 0;
+      PFN_vkCmdDraw                          vkCmdDraw                          = 0;
+      PFN_vkCmdDrawIndexed                   vkCmdDrawIndexed                   = 0;
+      PFN_vkCmdDrawIndirect                  vkCmdDrawIndirect                  = 0;
+      PFN_vkCmdDrawIndexedIndirect           vkCmdDrawIndexedIndirect           = 0;
+      PFN_vkCmdDispatch                      vkCmdDispatch                      = 0;
+      PFN_vkCmdDispatchIndirect              vkCmdDispatchIndirect              = 0;
+      PFN_vkCmdCopyBuffer                    vkCmdCopyBuffer                    = 0;
+      PFN_vkCmdCopyImage                     vkCmdCopyImage                     = 0;
+      PFN_vkCmdBlitImage                     vkCmdBlitImage                     = 0;
+      PFN_vkCmdCopyBufferToImage             vkCmdCopyBufferToImage             = 0;
+      PFN_vkCmdCopyImageToBuffer             vkCmdCopyImageToBuffer             = 0;
+      PFN_vkCmdUpdateBuffer                  vkCmdUpdateBuffer                  = 0;
+      PFN_vkCmdFillBuffer                    vkCmdFillBuffer                    = 0;
+      PFN_vkCmdClearColorImage               vkCmdClearColorImage               = 0;
+      PFN_vkCmdClearDepthStencilImage        vkCmdClearDepthStencilImage        = 0;
+      PFN_vkCmdClearAttachments              vkCmdClearAttachments              = 0;
+      PFN_vkCmdResolveImage                  vkCmdResolveImage                  = 0;
+      PFN_vkCmdSetEvent                      vkCmdSetEvent                      = 0;
+      PFN_vkCmdResetEvent                    vkCmdResetEvent                    = 0;
+      PFN_vkCmdWaitEvents                    vkCmdWaitEvents                    = 0;
+      PFN_vkCmdPipelineBarrier               vkCmdPipelineBarrier               = 0;
+      PFN_vkCmdBeginQuery                    vkCmdBeginQuery                    = 0;
+      PFN_vkCmdEndQuery                      vkCmdEndQuery                      = 0;
+      PFN_vkCmdResetQueryPool                vkCmdResetQueryPool                = 0;
+      PFN_vkCmdWriteTimestamp                vkCmdWriteTimestamp                = 0;
+      PFN_vkCmdCopyQueryPoolResults          vkCmdCopyQueryPoolResults          = 0;
+      PFN_vkCmdPushConstants                 vkCmdPushConstants                 = 0;
+      PFN_vkCmdBeginRenderPass               vkCmdBeginRenderPass               = 0;
+      PFN_vkCmdNextSubpass                   vkCmdNextSubpass                   = 0;
+      PFN_vkCmdEndRenderPass                 vkCmdEndRenderPass                 = 0;
+      PFN_vkCmdExecuteCommands               vkCmdExecuteCommands               = 0;
+
+      //=== VK_VERSION_1_1 ===
+      PFN_vkBindBufferMemory2                 vkBindBufferMemory2                 = 0;
+      PFN_vkBindImageMemory2                  vkBindImageMemory2                  = 0;
+      PFN_vkGetDeviceGroupPeerMemoryFeatures  vkGetDeviceGroupPeerMemoryFeatures  = 0;
+      PFN_vkCmdSetDeviceMask                  vkCmdSetDeviceMask                  = 0;
+      PFN_vkCmdDispatchBase                   vkCmdDispatchBase                   = 0;
+      PFN_vkGetImageMemoryRequirements2       vkGetImageMemoryRequirements2       = 0;
+      PFN_vkGetBufferMemoryRequirements2      vkGetBufferMemoryRequirements2      = 0;
+      PFN_vkGetImageSparseMemoryRequirements2 vkGetImageSparseMemoryRequirements2 = 0;
+      PFN_vkTrimCommandPool                   vkTrimCommandPool                   = 0;
+      PFN_vkGetDeviceQueue2                   vkGetDeviceQueue2                   = 0;
+      PFN_vkCreateSamplerYcbcrConversion      vkCreateSamplerYcbcrConversion      = 0;
+      PFN_vkDestroySamplerYcbcrConversion     vkDestroySamplerYcbcrConversion     = 0;
+      PFN_vkCreateDescriptorUpdateTemplate    vkCreateDescriptorUpdateTemplate    = 0;
+      PFN_vkDestroyDescriptorUpdateTemplate   vkDestroyDescriptorUpdateTemplate   = 0;
+      PFN_vkUpdateDescriptorSetWithTemplate   vkUpdateDescriptorSetWithTemplate   = 0;
+      PFN_vkGetDescriptorSetLayoutSupport     vkGetDescriptorSetLayoutSupport     = 0;
+
+      //=== VK_VERSION_1_2 ===
+      PFN_vkCmdDrawIndirectCount                vkCmdDrawIndirectCount                = 0;
+      PFN_vkCmdDrawIndexedIndirectCount         vkCmdDrawIndexedIndirectCount         = 0;
+      PFN_vkCreateRenderPass2                   vkCreateRenderPass2                   = 0;
+      PFN_vkCmdBeginRenderPass2                 vkCmdBeginRenderPass2                 = 0;
+      PFN_vkCmdNextSubpass2                     vkCmdNextSubpass2                     = 0;
+      PFN_vkCmdEndRenderPass2                   vkCmdEndRenderPass2                   = 0;
+      PFN_vkResetQueryPool                      vkResetQueryPool                      = 0;
+      PFN_vkGetSemaphoreCounterValue            vkGetSemaphoreCounterValue            = 0;
+      PFN_vkWaitSemaphores                      vkWaitSemaphores                      = 0;
+      PFN_vkSignalSemaphore                     vkSignalSemaphore                     = 0;
+      PFN_vkGetBufferDeviceAddress              vkGetBufferDeviceAddress              = 0;
+      PFN_vkGetBufferOpaqueCaptureAddress       vkGetBufferOpaqueCaptureAddress       = 0;
+      PFN_vkGetDeviceMemoryOpaqueCaptureAddress vkGetDeviceMemoryOpaqueCaptureAddress = 0;
+
+      //=== VK_AMD_buffer_marker ===
+      PFN_vkCmdWriteBufferMarkerAMD vkCmdWriteBufferMarkerAMD = 0;
+
+      //=== VK_AMD_display_native_hdr ===
+      PFN_vkSetLocalDimmingAMD vkSetLocalDimmingAMD = 0;
+
+      //=== VK_AMD_draw_indirect_count ===
+      PFN_vkCmdDrawIndirectCountAMD        vkCmdDrawIndirectCountAMD        = 0;
+      PFN_vkCmdDrawIndexedIndirectCountAMD vkCmdDrawIndexedIndirectCountAMD = 0;
+
+      //=== VK_AMD_shader_info ===
+      PFN_vkGetShaderInfoAMD vkGetShaderInfoAMD = 0;
+
 #  if defined( VK_USE_PLATFORM_ANDROID_KHR )
+      //=== VK_ANDROID_external_memory_android_hardware_buffer ===
       PFN_vkGetAndroidHardwareBufferPropertiesANDROID vkGetAndroidHardwareBufferPropertiesANDROID = 0;
+      PFN_vkGetMemoryAndroidHardwareBufferANDROID     vkGetMemoryAndroidHardwareBufferANDROID     = 0;
+#  else
+      PFN_dummy vkGetAndroidHardwareBufferPropertiesANDROID_placeholder       = 0;
+      PFN_dummy vkGetMemoryAndroidHardwareBufferANDROID_placeholder           = 0;
 #  endif /*VK_USE_PLATFORM_ANDROID_KHR*/
-      PFN_vkGetBufferDeviceAddress                         vkGetBufferDeviceAddress                         = 0;
-      PFN_vkGetBufferDeviceAddressEXT                      vkGetBufferDeviceAddressEXT                      = 0;
-      PFN_vkGetBufferDeviceAddressKHR                      vkGetBufferDeviceAddressKHR                      = 0;
-      PFN_vkGetBufferMemoryRequirements                    vkGetBufferMemoryRequirements                    = 0;
-      PFN_vkGetBufferMemoryRequirements2                   vkGetBufferMemoryRequirements2                   = 0;
-      PFN_vkGetBufferMemoryRequirements2KHR                vkGetBufferMemoryRequirements2KHR                = 0;
-      PFN_vkGetBufferOpaqueCaptureAddress                  vkGetBufferOpaqueCaptureAddress                  = 0;
-      PFN_vkGetBufferOpaqueCaptureAddressKHR               vkGetBufferOpaqueCaptureAddressKHR               = 0;
-      PFN_vkGetCalibratedTimestampsEXT                     vkGetCalibratedTimestampsEXT                     = 0;
-      PFN_vkGetDeferredOperationMaxConcurrencyKHR          vkGetDeferredOperationMaxConcurrencyKHR          = 0;
-      PFN_vkGetDeferredOperationResultKHR                  vkGetDeferredOperationResultKHR                  = 0;
-      PFN_vkGetDescriptorSetLayoutSupport                  vkGetDescriptorSetLayoutSupport                  = 0;
-      PFN_vkGetDescriptorSetLayoutSupportKHR               vkGetDescriptorSetLayoutSupportKHR               = 0;
-      PFN_vkGetDeviceAccelerationStructureCompatibilityKHR vkGetDeviceAccelerationStructureCompatibilityKHR = 0;
-      PFN_vkGetDeviceGroupPeerMemoryFeatures               vkGetDeviceGroupPeerMemoryFeatures               = 0;
-      PFN_vkGetDeviceGroupPeerMemoryFeaturesKHR            vkGetDeviceGroupPeerMemoryFeaturesKHR            = 0;
-      PFN_vkGetDeviceGroupPresentCapabilitiesKHR           vkGetDeviceGroupPresentCapabilitiesKHR           = 0;
-#  if defined( VK_USE_PLATFORM_WIN32_KHR )
-      PFN_vkGetDeviceGroupSurfacePresentModes2EXT vkGetDeviceGroupSurfacePresentModes2EXT = 0;
-#  endif /*VK_USE_PLATFORM_WIN32_KHR*/
-      PFN_vkGetDeviceGroupSurfacePresentModesKHR          vkGetDeviceGroupSurfacePresentModesKHR          = 0;
-      PFN_vkGetDeviceMemoryCommitment                     vkGetDeviceMemoryCommitment                     = 0;
-      PFN_vkGetDeviceMemoryOpaqueCaptureAddress           vkGetDeviceMemoryOpaqueCaptureAddress           = 0;
-      PFN_vkGetDeviceMemoryOpaqueCaptureAddressKHR        vkGetDeviceMemoryOpaqueCaptureAddressKHR        = 0;
-      PFN_vkGetDeviceProcAddr                             vkGetDeviceProcAddr                             = 0;
-      PFN_vkGetDeviceQueue                                vkGetDeviceQueue                                = 0;
-      PFN_vkGetDeviceQueue2                               vkGetDeviceQueue2                               = 0;
-      PFN_vkGetDeviceSubpassShadingMaxWorkgroupSizeHUAWEI vkGetDeviceSubpassShadingMaxWorkgroupSizeHUAWEI = 0;
-      PFN_vkGetEventStatus                                vkGetEventStatus                                = 0;
-      PFN_vkGetFenceFdKHR                                 vkGetFenceFdKHR                                 = 0;
-      PFN_vkGetFenceStatus                                vkGetFenceStatus                                = 0;
-#  if defined( VK_USE_PLATFORM_WIN32_KHR )
-      PFN_vkGetFenceWin32HandleKHR vkGetFenceWin32HandleKHR = 0;
-#  endif /*VK_USE_PLATFORM_WIN32_KHR*/
-      PFN_vkGetGeneratedCommandsMemoryRequirementsNV vkGetGeneratedCommandsMemoryRequirementsNV = 0;
-      PFN_vkGetImageDrmFormatModifierPropertiesEXT   vkGetImageDrmFormatModifierPropertiesEXT   = 0;
-      PFN_vkGetImageMemoryRequirements               vkGetImageMemoryRequirements               = 0;
-      PFN_vkGetImageMemoryRequirements2              vkGetImageMemoryRequirements2              = 0;
-      PFN_vkGetImageMemoryRequirements2KHR           vkGetImageMemoryRequirements2KHR           = 0;
-      PFN_vkGetImageSparseMemoryRequirements         vkGetImageSparseMemoryRequirements         = 0;
-      PFN_vkGetImageSparseMemoryRequirements2        vkGetImageSparseMemoryRequirements2        = 0;
-      PFN_vkGetImageSparseMemoryRequirements2KHR     vkGetImageSparseMemoryRequirements2KHR     = 0;
-      PFN_vkGetImageSubresourceLayout                vkGetImageSubresourceLayout                = 0;
-      PFN_vkGetImageViewAddressNVX                   vkGetImageViewAddressNVX                   = 0;
-      PFN_vkGetImageViewHandleNVX                    vkGetImageViewHandleNVX                    = 0;
-#  if defined( VK_USE_PLATFORM_ANDROID_KHR )
-      PFN_vkGetMemoryAndroidHardwareBufferANDROID vkGetMemoryAndroidHardwareBufferANDROID = 0;
-#  endif /*VK_USE_PLATFORM_ANDROID_KHR*/
-      PFN_vkGetMemoryFdKHR                    vkGetMemoryFdKHR                    = 0;
-      PFN_vkGetMemoryFdPropertiesKHR          vkGetMemoryFdPropertiesKHR          = 0;
+
+      //=== VK_EXT_buffer_device_address ===
+      PFN_vkGetBufferDeviceAddressEXT vkGetBufferDeviceAddressEXT = 0;
+
+      //=== VK_EXT_calibrated_timestamps ===
+      PFN_vkGetCalibratedTimestampsEXT vkGetCalibratedTimestampsEXT = 0;
+
+      //=== VK_EXT_color_write_enable ===
+      PFN_vkCmdSetColorWriteEnableEXT vkCmdSetColorWriteEnableEXT = 0;
+
+      //=== VK_EXT_conditional_rendering ===
+      PFN_vkCmdBeginConditionalRenderingEXT vkCmdBeginConditionalRenderingEXT = 0;
+      PFN_vkCmdEndConditionalRenderingEXT   vkCmdEndConditionalRenderingEXT   = 0;
+
+      //=== VK_EXT_debug_marker ===
+      PFN_vkDebugMarkerSetObjectTagEXT  vkDebugMarkerSetObjectTagEXT  = 0;
+      PFN_vkDebugMarkerSetObjectNameEXT vkDebugMarkerSetObjectNameEXT = 0;
+      PFN_vkCmdDebugMarkerBeginEXT      vkCmdDebugMarkerBeginEXT      = 0;
+      PFN_vkCmdDebugMarkerEndEXT        vkCmdDebugMarkerEndEXT        = 0;
+      PFN_vkCmdDebugMarkerInsertEXT     vkCmdDebugMarkerInsertEXT     = 0;
+
+      //=== VK_EXT_debug_utils ===
+      PFN_vkSetDebugUtilsObjectNameEXT    vkSetDebugUtilsObjectNameEXT    = 0;
+      PFN_vkSetDebugUtilsObjectTagEXT     vkSetDebugUtilsObjectTagEXT     = 0;
+      PFN_vkQueueBeginDebugUtilsLabelEXT  vkQueueBeginDebugUtilsLabelEXT  = 0;
+      PFN_vkQueueEndDebugUtilsLabelEXT    vkQueueEndDebugUtilsLabelEXT    = 0;
+      PFN_vkQueueInsertDebugUtilsLabelEXT vkQueueInsertDebugUtilsLabelEXT = 0;
+      PFN_vkCmdBeginDebugUtilsLabelEXT    vkCmdBeginDebugUtilsLabelEXT    = 0;
+      PFN_vkCmdEndDebugUtilsLabelEXT      vkCmdEndDebugUtilsLabelEXT      = 0;
+      PFN_vkCmdInsertDebugUtilsLabelEXT   vkCmdInsertDebugUtilsLabelEXT   = 0;
+
+      //=== VK_EXT_discard_rectangles ===
+      PFN_vkCmdSetDiscardRectangleEXT vkCmdSetDiscardRectangleEXT = 0;
+
+      //=== VK_EXT_display_control ===
+      PFN_vkDisplayPowerControlEXT  vkDisplayPowerControlEXT  = 0;
+      PFN_vkRegisterDeviceEventEXT  vkRegisterDeviceEventEXT  = 0;
+      PFN_vkRegisterDisplayEventEXT vkRegisterDisplayEventEXT = 0;
+      PFN_vkGetSwapchainCounterEXT  vkGetSwapchainCounterEXT  = 0;
+
+      //=== VK_EXT_extended_dynamic_state ===
+      PFN_vkCmdSetCullModeEXT              vkCmdSetCullModeEXT              = 0;
+      PFN_vkCmdSetFrontFaceEXT             vkCmdSetFrontFaceEXT             = 0;
+      PFN_vkCmdSetPrimitiveTopologyEXT     vkCmdSetPrimitiveTopologyEXT     = 0;
+      PFN_vkCmdSetViewportWithCountEXT     vkCmdSetViewportWithCountEXT     = 0;
+      PFN_vkCmdSetScissorWithCountEXT      vkCmdSetScissorWithCountEXT      = 0;
+      PFN_vkCmdBindVertexBuffers2EXT       vkCmdBindVertexBuffers2EXT       = 0;
+      PFN_vkCmdSetDepthTestEnableEXT       vkCmdSetDepthTestEnableEXT       = 0;
+      PFN_vkCmdSetDepthWriteEnableEXT      vkCmdSetDepthWriteEnableEXT      = 0;
+      PFN_vkCmdSetDepthCompareOpEXT        vkCmdSetDepthCompareOpEXT        = 0;
+      PFN_vkCmdSetDepthBoundsTestEnableEXT vkCmdSetDepthBoundsTestEnableEXT = 0;
+      PFN_vkCmdSetStencilTestEnableEXT     vkCmdSetStencilTestEnableEXT     = 0;
+      PFN_vkCmdSetStencilOpEXT             vkCmdSetStencilOpEXT             = 0;
+
+      //=== VK_EXT_extended_dynamic_state2 ===
+      PFN_vkCmdSetPatchControlPointsEXT      vkCmdSetPatchControlPointsEXT      = 0;
+      PFN_vkCmdSetRasterizerDiscardEnableEXT vkCmdSetRasterizerDiscardEnableEXT = 0;
+      PFN_vkCmdSetDepthBiasEnableEXT         vkCmdSetDepthBiasEnableEXT         = 0;
+      PFN_vkCmdSetLogicOpEXT                 vkCmdSetLogicOpEXT                 = 0;
+      PFN_vkCmdSetPrimitiveRestartEnableEXT  vkCmdSetPrimitiveRestartEnableEXT  = 0;
+
+      //=== VK_EXT_external_memory_host ===
       PFN_vkGetMemoryHostPointerPropertiesEXT vkGetMemoryHostPointerPropertiesEXT = 0;
-      PFN_vkGetMemoryRemoteAddressNV          vkGetMemoryRemoteAddressNV          = 0;
+
 #  if defined( VK_USE_PLATFORM_WIN32_KHR )
-      PFN_vkGetMemoryWin32HandleKHR vkGetMemoryWin32HandleKHR = 0;
+      //=== VK_EXT_full_screen_exclusive ===
+      PFN_vkAcquireFullScreenExclusiveModeEXT     vkAcquireFullScreenExclusiveModeEXT     = 0;
+      PFN_vkReleaseFullScreenExclusiveModeEXT     vkReleaseFullScreenExclusiveModeEXT     = 0;
+      PFN_vkGetDeviceGroupSurfacePresentModes2EXT vkGetDeviceGroupSurfacePresentModes2EXT = 0;
+#  else
+      PFN_dummy vkAcquireFullScreenExclusiveModeEXT_placeholder               = 0;
+      PFN_dummy vkReleaseFullScreenExclusiveModeEXT_placeholder               = 0;
+      PFN_dummy vkGetDeviceGroupSurfacePresentModes2EXT_placeholder           = 0;
 #  endif /*VK_USE_PLATFORM_WIN32_KHR*/
-#  if defined( VK_USE_PLATFORM_WIN32_KHR )
-      PFN_vkGetMemoryWin32HandleNV vkGetMemoryWin32HandleNV = 0;
-#  endif /*VK_USE_PLATFORM_WIN32_KHR*/
-#  if defined( VK_USE_PLATFORM_WIN32_KHR )
-      PFN_vkGetMemoryWin32HandlePropertiesKHR vkGetMemoryWin32HandlePropertiesKHR = 0;
-#  endif /*VK_USE_PLATFORM_WIN32_KHR*/
+
+      //=== VK_EXT_hdr_metadata ===
+      PFN_vkSetHdrMetadataEXT vkSetHdrMetadataEXT = 0;
+
+      //=== VK_EXT_host_query_reset ===
+      PFN_vkResetQueryPoolEXT vkResetQueryPoolEXT = 0;
+
+      //=== VK_EXT_image_drm_format_modifier ===
+      PFN_vkGetImageDrmFormatModifierPropertiesEXT vkGetImageDrmFormatModifierPropertiesEXT = 0;
+
+      //=== VK_EXT_line_rasterization ===
+      PFN_vkCmdSetLineStippleEXT vkCmdSetLineStippleEXT = 0;
+
+      //=== VK_EXT_multi_draw ===
+      PFN_vkCmdDrawMultiEXT        vkCmdDrawMultiEXT        = 0;
+      PFN_vkCmdDrawMultiIndexedEXT vkCmdDrawMultiIndexedEXT = 0;
+
+      //=== VK_EXT_private_data ===
+      PFN_vkCreatePrivateDataSlotEXT  vkCreatePrivateDataSlotEXT  = 0;
+      PFN_vkDestroyPrivateDataSlotEXT vkDestroyPrivateDataSlotEXT = 0;
+      PFN_vkSetPrivateDataEXT         vkSetPrivateDataEXT         = 0;
+      PFN_vkGetPrivateDataEXT         vkGetPrivateDataEXT         = 0;
+
+      //=== VK_EXT_sample_locations ===
+      PFN_vkCmdSetSampleLocationsEXT vkCmdSetSampleLocationsEXT = 0;
+
+      //=== VK_EXT_transform_feedback ===
+      PFN_vkCmdBindTransformFeedbackBuffersEXT vkCmdBindTransformFeedbackBuffersEXT = 0;
+      PFN_vkCmdBeginTransformFeedbackEXT       vkCmdBeginTransformFeedbackEXT       = 0;
+      PFN_vkCmdEndTransformFeedbackEXT         vkCmdEndTransformFeedbackEXT         = 0;
+      PFN_vkCmdBeginQueryIndexedEXT            vkCmdBeginQueryIndexedEXT            = 0;
+      PFN_vkCmdEndQueryIndexedEXT              vkCmdEndQueryIndexedEXT              = 0;
+      PFN_vkCmdDrawIndirectByteCountEXT        vkCmdDrawIndirectByteCountEXT        = 0;
+
+      //=== VK_EXT_validation_cache ===
+      PFN_vkCreateValidationCacheEXT  vkCreateValidationCacheEXT  = 0;
+      PFN_vkDestroyValidationCacheEXT vkDestroyValidationCacheEXT = 0;
+      PFN_vkMergeValidationCachesEXT  vkMergeValidationCachesEXT  = 0;
+      PFN_vkGetValidationCacheDataEXT vkGetValidationCacheDataEXT = 0;
+
+      //=== VK_EXT_vertex_input_dynamic_state ===
+      PFN_vkCmdSetVertexInputEXT vkCmdSetVertexInputEXT = 0;
+
 #  if defined( VK_USE_PLATFORM_FUCHSIA )
-      PFN_vkGetMemoryZirconHandleFUCHSIA vkGetMemoryZirconHandleFUCHSIA = 0;
-#  endif /*VK_USE_PLATFORM_FUCHSIA*/
-#  if defined( VK_USE_PLATFORM_FUCHSIA )
+      //=== VK_FUCHSIA_external_memory ===
+      PFN_vkGetMemoryZirconHandleFUCHSIA           vkGetMemoryZirconHandleFUCHSIA           = 0;
       PFN_vkGetMemoryZirconHandlePropertiesFUCHSIA vkGetMemoryZirconHandlePropertiesFUCHSIA = 0;
+#  else
+      PFN_dummy vkGetMemoryZirconHandleFUCHSIA_placeholder                    = 0;
+      PFN_dummy vkGetMemoryZirconHandlePropertiesFUCHSIA_placeholder          = 0;
 #  endif /*VK_USE_PLATFORM_FUCHSIA*/
-      PFN_vkGetPastPresentationTimingGOOGLE                 vkGetPastPresentationTimingGOOGLE                 = 0;
-      PFN_vkGetPerformanceParameterINTEL                    vkGetPerformanceParameterINTEL                    = 0;
-      PFN_vkGetPipelineCacheData                            vkGetPipelineCacheData                            = 0;
-      PFN_vkGetPipelineExecutableInternalRepresentationsKHR vkGetPipelineExecutableInternalRepresentationsKHR = 0;
+
+#  if defined( VK_USE_PLATFORM_FUCHSIA )
+      //=== VK_FUCHSIA_external_semaphore ===
+      PFN_vkImportSemaphoreZirconHandleFUCHSIA vkImportSemaphoreZirconHandleFUCHSIA = 0;
+      PFN_vkGetSemaphoreZirconHandleFUCHSIA    vkGetSemaphoreZirconHandleFUCHSIA    = 0;
+#  else
+      PFN_dummy vkImportSemaphoreZirconHandleFUCHSIA_placeholder              = 0;
+      PFN_dummy vkGetSemaphoreZirconHandleFUCHSIA_placeholder                 = 0;
+#  endif /*VK_USE_PLATFORM_FUCHSIA*/
+
+      //=== VK_GOOGLE_display_timing ===
+      PFN_vkGetRefreshCycleDurationGOOGLE   vkGetRefreshCycleDurationGOOGLE   = 0;
+      PFN_vkGetPastPresentationTimingGOOGLE vkGetPastPresentationTimingGOOGLE = 0;
+
+      //=== VK_HUAWEI_invocation_mask ===
+      PFN_vkCmdBindInvocationMaskHUAWEI vkCmdBindInvocationMaskHUAWEI = 0;
+
+      //=== VK_HUAWEI_subpass_shading ===
+      PFN_vkGetDeviceSubpassShadingMaxWorkgroupSizeHUAWEI vkGetDeviceSubpassShadingMaxWorkgroupSizeHUAWEI = 0;
+      PFN_vkCmdSubpassShadingHUAWEI                       vkCmdSubpassShadingHUAWEI                       = 0;
+
+      //=== VK_INTEL_performance_query ===
+      PFN_vkInitializePerformanceApiINTEL         vkInitializePerformanceApiINTEL         = 0;
+      PFN_vkUninitializePerformanceApiINTEL       vkUninitializePerformanceApiINTEL       = 0;
+      PFN_vkCmdSetPerformanceMarkerINTEL          vkCmdSetPerformanceMarkerINTEL          = 0;
+      PFN_vkCmdSetPerformanceStreamMarkerINTEL    vkCmdSetPerformanceStreamMarkerINTEL    = 0;
+      PFN_vkCmdSetPerformanceOverrideINTEL        vkCmdSetPerformanceOverrideINTEL        = 0;
+      PFN_vkAcquirePerformanceConfigurationINTEL  vkAcquirePerformanceConfigurationINTEL  = 0;
+      PFN_vkReleasePerformanceConfigurationINTEL  vkReleasePerformanceConfigurationINTEL  = 0;
+      PFN_vkQueueSetPerformanceConfigurationINTEL vkQueueSetPerformanceConfigurationINTEL = 0;
+      PFN_vkGetPerformanceParameterINTEL          vkGetPerformanceParameterINTEL          = 0;
+
+      //=== VK_KHR_acceleration_structure ===
+      PFN_vkCreateAccelerationStructureKHR                 vkCreateAccelerationStructureKHR                 = 0;
+      PFN_vkDestroyAccelerationStructureKHR                vkDestroyAccelerationStructureKHR                = 0;
+      PFN_vkCmdBuildAccelerationStructuresKHR              vkCmdBuildAccelerationStructuresKHR              = 0;
+      PFN_vkCmdBuildAccelerationStructuresIndirectKHR      vkCmdBuildAccelerationStructuresIndirectKHR      = 0;
+      PFN_vkBuildAccelerationStructuresKHR                 vkBuildAccelerationStructuresKHR                 = 0;
+      PFN_vkCopyAccelerationStructureKHR                   vkCopyAccelerationStructureKHR                   = 0;
+      PFN_vkCopyAccelerationStructureToMemoryKHR           vkCopyAccelerationStructureToMemoryKHR           = 0;
+      PFN_vkCopyMemoryToAccelerationStructureKHR           vkCopyMemoryToAccelerationStructureKHR           = 0;
+      PFN_vkWriteAccelerationStructuresPropertiesKHR       vkWriteAccelerationStructuresPropertiesKHR       = 0;
+      PFN_vkCmdCopyAccelerationStructureKHR                vkCmdCopyAccelerationStructureKHR                = 0;
+      PFN_vkCmdCopyAccelerationStructureToMemoryKHR        vkCmdCopyAccelerationStructureToMemoryKHR        = 0;
+      PFN_vkCmdCopyMemoryToAccelerationStructureKHR        vkCmdCopyMemoryToAccelerationStructureKHR        = 0;
+      PFN_vkGetAccelerationStructureDeviceAddressKHR       vkGetAccelerationStructureDeviceAddressKHR       = 0;
+      PFN_vkCmdWriteAccelerationStructuresPropertiesKHR    vkCmdWriteAccelerationStructuresPropertiesKHR    = 0;
+      PFN_vkGetDeviceAccelerationStructureCompatibilityKHR vkGetDeviceAccelerationStructureCompatibilityKHR = 0;
+      PFN_vkGetAccelerationStructureBuildSizesKHR          vkGetAccelerationStructureBuildSizesKHR          = 0;
+
+      //=== VK_KHR_bind_memory2 ===
+      PFN_vkBindBufferMemory2KHR vkBindBufferMemory2KHR = 0;
+      PFN_vkBindImageMemory2KHR  vkBindImageMemory2KHR  = 0;
+
+      //=== VK_KHR_buffer_device_address ===
+      PFN_vkGetBufferDeviceAddressKHR              vkGetBufferDeviceAddressKHR              = 0;
+      PFN_vkGetBufferOpaqueCaptureAddressKHR       vkGetBufferOpaqueCaptureAddressKHR       = 0;
+      PFN_vkGetDeviceMemoryOpaqueCaptureAddressKHR vkGetDeviceMemoryOpaqueCaptureAddressKHR = 0;
+
+      //=== VK_KHR_copy_commands2 ===
+      PFN_vkCmdCopyBuffer2KHR        vkCmdCopyBuffer2KHR        = 0;
+      PFN_vkCmdCopyImage2KHR         vkCmdCopyImage2KHR         = 0;
+      PFN_vkCmdCopyBufferToImage2KHR vkCmdCopyBufferToImage2KHR = 0;
+      PFN_vkCmdCopyImageToBuffer2KHR vkCmdCopyImageToBuffer2KHR = 0;
+      PFN_vkCmdBlitImage2KHR         vkCmdBlitImage2KHR         = 0;
+      PFN_vkCmdResolveImage2KHR      vkCmdResolveImage2KHR      = 0;
+
+      //=== VK_KHR_create_renderpass2 ===
+      PFN_vkCreateRenderPass2KHR   vkCreateRenderPass2KHR   = 0;
+      PFN_vkCmdBeginRenderPass2KHR vkCmdBeginRenderPass2KHR = 0;
+      PFN_vkCmdNextSubpass2KHR     vkCmdNextSubpass2KHR     = 0;
+      PFN_vkCmdEndRenderPass2KHR   vkCmdEndRenderPass2KHR   = 0;
+
+      //=== VK_KHR_deferred_host_operations ===
+      PFN_vkCreateDeferredOperationKHR            vkCreateDeferredOperationKHR            = 0;
+      PFN_vkDestroyDeferredOperationKHR           vkDestroyDeferredOperationKHR           = 0;
+      PFN_vkGetDeferredOperationMaxConcurrencyKHR vkGetDeferredOperationMaxConcurrencyKHR = 0;
+      PFN_vkGetDeferredOperationResultKHR         vkGetDeferredOperationResultKHR         = 0;
+      PFN_vkDeferredOperationJoinKHR              vkDeferredOperationJoinKHR              = 0;
+
+      //=== VK_KHR_descriptor_update_template ===
+      PFN_vkCreateDescriptorUpdateTemplateKHR   vkCreateDescriptorUpdateTemplateKHR   = 0;
+      PFN_vkDestroyDescriptorUpdateTemplateKHR  vkDestroyDescriptorUpdateTemplateKHR  = 0;
+      PFN_vkUpdateDescriptorSetWithTemplateKHR  vkUpdateDescriptorSetWithTemplateKHR  = 0;
+      PFN_vkCmdPushDescriptorSetWithTemplateKHR vkCmdPushDescriptorSetWithTemplateKHR = 0;
+
+      //=== VK_KHR_device_group ===
+      PFN_vkGetDeviceGroupPeerMemoryFeaturesKHR  vkGetDeviceGroupPeerMemoryFeaturesKHR  = 0;
+      PFN_vkCmdSetDeviceMaskKHR                  vkCmdSetDeviceMaskKHR                  = 0;
+      PFN_vkCmdDispatchBaseKHR                   vkCmdDispatchBaseKHR                   = 0;
+      PFN_vkGetDeviceGroupPresentCapabilitiesKHR vkGetDeviceGroupPresentCapabilitiesKHR = 0;
+      PFN_vkGetDeviceGroupSurfacePresentModesKHR vkGetDeviceGroupSurfacePresentModesKHR = 0;
+      PFN_vkAcquireNextImage2KHR                 vkAcquireNextImage2KHR                 = 0;
+
+      //=== VK_KHR_display_swapchain ===
+      PFN_vkCreateSharedSwapchainsKHR vkCreateSharedSwapchainsKHR = 0;
+
+      //=== VK_KHR_draw_indirect_count ===
+      PFN_vkCmdDrawIndirectCountKHR        vkCmdDrawIndirectCountKHR        = 0;
+      PFN_vkCmdDrawIndexedIndirectCountKHR vkCmdDrawIndexedIndirectCountKHR = 0;
+
+      //=== VK_KHR_external_fence_fd ===
+      PFN_vkImportFenceFdKHR vkImportFenceFdKHR = 0;
+      PFN_vkGetFenceFdKHR    vkGetFenceFdKHR    = 0;
+
+#  if defined( VK_USE_PLATFORM_WIN32_KHR )
+      //=== VK_KHR_external_fence_win32 ===
+      PFN_vkImportFenceWin32HandleKHR vkImportFenceWin32HandleKHR = 0;
+      PFN_vkGetFenceWin32HandleKHR    vkGetFenceWin32HandleKHR    = 0;
+#  else
+      PFN_dummy vkImportFenceWin32HandleKHR_placeholder                       = 0;
+      PFN_dummy vkGetFenceWin32HandleKHR_placeholder                          = 0;
+#  endif /*VK_USE_PLATFORM_WIN32_KHR*/
+
+      //=== VK_KHR_external_memory_fd ===
+      PFN_vkGetMemoryFdKHR           vkGetMemoryFdKHR           = 0;
+      PFN_vkGetMemoryFdPropertiesKHR vkGetMemoryFdPropertiesKHR = 0;
+
+#  if defined( VK_USE_PLATFORM_WIN32_KHR )
+      //=== VK_KHR_external_memory_win32 ===
+      PFN_vkGetMemoryWin32HandleKHR           vkGetMemoryWin32HandleKHR           = 0;
+      PFN_vkGetMemoryWin32HandlePropertiesKHR vkGetMemoryWin32HandlePropertiesKHR = 0;
+#  else
+      PFN_dummy vkGetMemoryWin32HandleKHR_placeholder                         = 0;
+      PFN_dummy vkGetMemoryWin32HandlePropertiesKHR_placeholder               = 0;
+#  endif /*VK_USE_PLATFORM_WIN32_KHR*/
+
+      //=== VK_KHR_external_semaphore_fd ===
+      PFN_vkImportSemaphoreFdKHR vkImportSemaphoreFdKHR = 0;
+      PFN_vkGetSemaphoreFdKHR    vkGetSemaphoreFdKHR    = 0;
+
+#  if defined( VK_USE_PLATFORM_WIN32_KHR )
+      //=== VK_KHR_external_semaphore_win32 ===
+      PFN_vkImportSemaphoreWin32HandleKHR vkImportSemaphoreWin32HandleKHR = 0;
+      PFN_vkGetSemaphoreWin32HandleKHR    vkGetSemaphoreWin32HandleKHR    = 0;
+#  else
+      PFN_dummy vkImportSemaphoreWin32HandleKHR_placeholder                   = 0;
+      PFN_dummy vkGetSemaphoreWin32HandleKHR_placeholder                      = 0;
+#  endif /*VK_USE_PLATFORM_WIN32_KHR*/
+
+      //=== VK_KHR_fragment_shading_rate ===
+      PFN_vkCmdSetFragmentShadingRateKHR vkCmdSetFragmentShadingRateKHR = 0;
+
+      //=== VK_KHR_get_memory_requirements2 ===
+      PFN_vkGetImageMemoryRequirements2KHR       vkGetImageMemoryRequirements2KHR       = 0;
+      PFN_vkGetBufferMemoryRequirements2KHR      vkGetBufferMemoryRequirements2KHR      = 0;
+      PFN_vkGetImageSparseMemoryRequirements2KHR vkGetImageSparseMemoryRequirements2KHR = 0;
+
+      //=== VK_KHR_maintenance1 ===
+      PFN_vkTrimCommandPoolKHR vkTrimCommandPoolKHR = 0;
+
+      //=== VK_KHR_maintenance3 ===
+      PFN_vkGetDescriptorSetLayoutSupportKHR vkGetDescriptorSetLayoutSupportKHR = 0;
+
+      //=== VK_KHR_performance_query ===
+      PFN_vkAcquireProfilingLockKHR vkAcquireProfilingLockKHR = 0;
+      PFN_vkReleaseProfilingLockKHR vkReleaseProfilingLockKHR = 0;
+
+      //=== VK_KHR_pipeline_executable_properties ===
       PFN_vkGetPipelineExecutablePropertiesKHR              vkGetPipelineExecutablePropertiesKHR              = 0;
       PFN_vkGetPipelineExecutableStatisticsKHR              vkGetPipelineExecutableStatisticsKHR              = 0;
-      PFN_vkGetPrivateDataEXT                               vkGetPrivateDataEXT                               = 0;
-      PFN_vkGetQueryPoolResults                             vkGetQueryPoolResults                             = 0;
-      PFN_vkGetQueueCheckpointData2NV                       vkGetQueueCheckpointData2NV                       = 0;
-      PFN_vkGetQueueCheckpointDataNV                        vkGetQueueCheckpointDataNV                        = 0;
-      PFN_vkGetRayTracingCaptureReplayShaderGroupHandlesKHR vkGetRayTracingCaptureReplayShaderGroupHandlesKHR = 0;
+      PFN_vkGetPipelineExecutableInternalRepresentationsKHR vkGetPipelineExecutableInternalRepresentationsKHR = 0;
+
+      //=== VK_KHR_present_wait ===
+      PFN_vkWaitForPresentKHR vkWaitForPresentKHR = 0;
+
+      //=== VK_KHR_push_descriptor ===
+      PFN_vkCmdPushDescriptorSetKHR vkCmdPushDescriptorSetKHR = 0;
+
+      //=== VK_KHR_ray_tracing_pipeline ===
+      PFN_vkCmdTraceRaysKHR                                 vkCmdTraceRaysKHR                                 = 0;
+      PFN_vkCreateRayTracingPipelinesKHR                    vkCreateRayTracingPipelinesKHR                    = 0;
       PFN_vkGetRayTracingShaderGroupHandlesKHR              vkGetRayTracingShaderGroupHandlesKHR              = 0;
-      PFN_vkGetRayTracingShaderGroupHandlesNV               vkGetRayTracingShaderGroupHandlesNV               = 0;
+      PFN_vkGetRayTracingCaptureReplayShaderGroupHandlesKHR vkGetRayTracingCaptureReplayShaderGroupHandlesKHR = 0;
+      PFN_vkCmdTraceRaysIndirectKHR                         vkCmdTraceRaysIndirectKHR                         = 0;
       PFN_vkGetRayTracingShaderGroupStackSizeKHR            vkGetRayTracingShaderGroupStackSizeKHR            = 0;
-      PFN_vkGetRefreshCycleDurationGOOGLE                   vkGetRefreshCycleDurationGOOGLE                   = 0;
-      PFN_vkGetRenderAreaGranularity                        vkGetRenderAreaGranularity                        = 0;
-      PFN_vkGetSemaphoreCounterValue                        vkGetSemaphoreCounterValue                        = 0;
-      PFN_vkGetSemaphoreCounterValueKHR                     vkGetSemaphoreCounterValueKHR                     = 0;
-      PFN_vkGetSemaphoreFdKHR                               vkGetSemaphoreFdKHR                               = 0;
-#  if defined( VK_USE_PLATFORM_WIN32_KHR )
-      PFN_vkGetSemaphoreWin32HandleKHR vkGetSemaphoreWin32HandleKHR = 0;
-#  endif /*VK_USE_PLATFORM_WIN32_KHR*/
-#  if defined( VK_USE_PLATFORM_FUCHSIA )
-      PFN_vkGetSemaphoreZirconHandleFUCHSIA vkGetSemaphoreZirconHandleFUCHSIA = 0;
-#  endif /*VK_USE_PLATFORM_FUCHSIA*/
-      PFN_vkGetShaderInfoAMD          vkGetShaderInfoAMD          = 0;
-      PFN_vkGetSwapchainCounterEXT    vkGetSwapchainCounterEXT    = 0;
-      PFN_vkGetSwapchainImagesKHR     vkGetSwapchainImagesKHR     = 0;
-      PFN_vkGetSwapchainStatusKHR     vkGetSwapchainStatusKHR     = 0;
-      PFN_vkGetValidationCacheDataEXT vkGetValidationCacheDataEXT = 0;
+      PFN_vkCmdSetRayTracingPipelineStackSizeKHR            vkCmdSetRayTracingPipelineStackSizeKHR            = 0;
+
+      //=== VK_KHR_sampler_ycbcr_conversion ===
+      PFN_vkCreateSamplerYcbcrConversionKHR  vkCreateSamplerYcbcrConversionKHR  = 0;
+      PFN_vkDestroySamplerYcbcrConversionKHR vkDestroySamplerYcbcrConversionKHR = 0;
+
+      //=== VK_KHR_shared_presentable_image ===
+      PFN_vkGetSwapchainStatusKHR vkGetSwapchainStatusKHR = 0;
+
+      //=== VK_KHR_swapchain ===
+      PFN_vkCreateSwapchainKHR    vkCreateSwapchainKHR    = 0;
+      PFN_vkDestroySwapchainKHR   vkDestroySwapchainKHR   = 0;
+      PFN_vkGetSwapchainImagesKHR vkGetSwapchainImagesKHR = 0;
+      PFN_vkAcquireNextImageKHR   vkAcquireNextImageKHR   = 0;
+      PFN_vkQueuePresentKHR       vkQueuePresentKHR       = 0;
+
+      //=== VK_KHR_synchronization2 ===
+      PFN_vkCmdSetEvent2KHR           vkCmdSetEvent2KHR           = 0;
+      PFN_vkCmdResetEvent2KHR         vkCmdResetEvent2KHR         = 0;
+      PFN_vkCmdWaitEvents2KHR         vkCmdWaitEvents2KHR         = 0;
+      PFN_vkCmdPipelineBarrier2KHR    vkCmdPipelineBarrier2KHR    = 0;
+      PFN_vkCmdWriteTimestamp2KHR     vkCmdWriteTimestamp2KHR     = 0;
+      PFN_vkQueueSubmit2KHR           vkQueueSubmit2KHR           = 0;
+      PFN_vkCmdWriteBufferMarker2AMD  vkCmdWriteBufferMarker2AMD  = 0;
+      PFN_vkGetQueueCheckpointData2NV vkGetQueueCheckpointData2NV = 0;
+
+      //=== VK_KHR_timeline_semaphore ===
+      PFN_vkGetSemaphoreCounterValueKHR vkGetSemaphoreCounterValueKHR = 0;
+      PFN_vkWaitSemaphoresKHR           vkWaitSemaphoresKHR           = 0;
+      PFN_vkSignalSemaphoreKHR          vkSignalSemaphoreKHR          = 0;
+
 #  if defined( VK_ENABLE_BETA_EXTENSIONS )
+      //=== VK_KHR_video_decode_queue ===
+      PFN_vkCmdDecodeVideoKHR vkCmdDecodeVideoKHR = 0;
+#  else
+      PFN_dummy vkCmdDecodeVideoKHR_placeholder                               = 0;
+#  endif /*VK_ENABLE_BETA_EXTENSIONS*/
+
+#  if defined( VK_ENABLE_BETA_EXTENSIONS )
+      //=== VK_KHR_video_encode_queue ===
+      PFN_vkCmdEncodeVideoKHR vkCmdEncodeVideoKHR = 0;
+#  else
+      PFN_dummy vkCmdEncodeVideoKHR_placeholder                               = 0;
+#  endif /*VK_ENABLE_BETA_EXTENSIONS*/
+
+#  if defined( VK_ENABLE_BETA_EXTENSIONS )
+      //=== VK_KHR_video_queue ===
+      PFN_vkCreateVideoSessionKHR                vkCreateVideoSessionKHR                = 0;
+      PFN_vkDestroyVideoSessionKHR               vkDestroyVideoSessionKHR               = 0;
       PFN_vkGetVideoSessionMemoryRequirementsKHR vkGetVideoSessionMemoryRequirementsKHR = 0;
+      PFN_vkBindVideoSessionMemoryKHR            vkBindVideoSessionMemoryKHR            = 0;
+      PFN_vkCreateVideoSessionParametersKHR      vkCreateVideoSessionParametersKHR      = 0;
+      PFN_vkUpdateVideoSessionParametersKHR      vkUpdateVideoSessionParametersKHR      = 0;
+      PFN_vkDestroyVideoSessionParametersKHR     vkDestroyVideoSessionParametersKHR     = 0;
+      PFN_vkCmdBeginVideoCodingKHR               vkCmdBeginVideoCodingKHR               = 0;
+      PFN_vkCmdEndVideoCodingKHR                 vkCmdEndVideoCodingKHR                 = 0;
+      PFN_vkCmdControlVideoCodingKHR             vkCmdControlVideoCodingKHR             = 0;
+#  else
+      PFN_dummy vkCreateVideoSessionKHR_placeholder                           = 0;
+      PFN_dummy vkDestroyVideoSessionKHR_placeholder                          = 0;
+      PFN_dummy vkGetVideoSessionMemoryRequirementsKHR_placeholder            = 0;
+      PFN_dummy vkBindVideoSessionMemoryKHR_placeholder                       = 0;
+      PFN_dummy vkCreateVideoSessionParametersKHR_placeholder                 = 0;
+      PFN_dummy vkUpdateVideoSessionParametersKHR_placeholder                 = 0;
+      PFN_dummy vkDestroyVideoSessionParametersKHR_placeholder                = 0;
+      PFN_dummy vkCmdBeginVideoCodingKHR_placeholder                          = 0;
+      PFN_dummy vkCmdEndVideoCodingKHR_placeholder                            = 0;
+      PFN_dummy vkCmdControlVideoCodingKHR_placeholder                        = 0;
 #  endif /*VK_ENABLE_BETA_EXTENSIONS*/
-      PFN_vkImportFenceFdKHR vkImportFenceFdKHR = 0;
+
+      //=== VK_NVX_binary_import ===
+      PFN_vkCreateCuModuleNVX    vkCreateCuModuleNVX    = 0;
+      PFN_vkCreateCuFunctionNVX  vkCreateCuFunctionNVX  = 0;
+      PFN_vkDestroyCuModuleNVX   vkDestroyCuModuleNVX   = 0;
+      PFN_vkDestroyCuFunctionNVX vkDestroyCuFunctionNVX = 0;
+      PFN_vkCmdCuLaunchKernelNVX vkCmdCuLaunchKernelNVX = 0;
+
+      //=== VK_NVX_image_view_handle ===
+      PFN_vkGetImageViewHandleNVX  vkGetImageViewHandleNVX  = 0;
+      PFN_vkGetImageViewAddressNVX vkGetImageViewAddressNVX = 0;
+
+      //=== VK_NV_clip_space_w_scaling ===
+      PFN_vkCmdSetViewportWScalingNV vkCmdSetViewportWScalingNV = 0;
+
+      //=== VK_NV_device_diagnostic_checkpoints ===
+      PFN_vkCmdSetCheckpointNV       vkCmdSetCheckpointNV       = 0;
+      PFN_vkGetQueueCheckpointDataNV vkGetQueueCheckpointDataNV = 0;
+
+      //=== VK_NV_device_generated_commands ===
+      PFN_vkGetGeneratedCommandsMemoryRequirementsNV vkGetGeneratedCommandsMemoryRequirementsNV = 0;
+      PFN_vkCmdPreprocessGeneratedCommandsNV         vkCmdPreprocessGeneratedCommandsNV         = 0;
+      PFN_vkCmdExecuteGeneratedCommandsNV            vkCmdExecuteGeneratedCommandsNV            = 0;
+      PFN_vkCmdBindPipelineShaderGroupNV             vkCmdBindPipelineShaderGroupNV             = 0;
+      PFN_vkCreateIndirectCommandsLayoutNV           vkCreateIndirectCommandsLayoutNV           = 0;
+      PFN_vkDestroyIndirectCommandsLayoutNV          vkDestroyIndirectCommandsLayoutNV          = 0;
+
+      //=== VK_NV_external_memory_rdma ===
+      PFN_vkGetMemoryRemoteAddressNV vkGetMemoryRemoteAddressNV = 0;
+
 #  if defined( VK_USE_PLATFORM_WIN32_KHR )
-      PFN_vkImportFenceWin32HandleKHR vkImportFenceWin32HandleKHR = 0;
+      //=== VK_NV_external_memory_win32 ===
+      PFN_vkGetMemoryWin32HandleNV vkGetMemoryWin32HandleNV = 0;
+#  else
+      PFN_dummy vkGetMemoryWin32HandleNV_placeholder                          = 0;
 #  endif /*VK_USE_PLATFORM_WIN32_KHR*/
-      PFN_vkImportSemaphoreFdKHR vkImportSemaphoreFdKHR = 0;
-#  if defined( VK_USE_PLATFORM_WIN32_KHR )
-      PFN_vkImportSemaphoreWin32HandleKHR vkImportSemaphoreWin32HandleKHR = 0;
-#  endif /*VK_USE_PLATFORM_WIN32_KHR*/
-#  if defined( VK_USE_PLATFORM_FUCHSIA )
-      PFN_vkImportSemaphoreZirconHandleFUCHSIA vkImportSemaphoreZirconHandleFUCHSIA = 0;
-#  endif /*VK_USE_PLATFORM_FUCHSIA*/
-      PFN_vkInitializePerformanceApiINTEL         vkInitializePerformanceApiINTEL         = 0;
-      PFN_vkInvalidateMappedMemoryRanges          vkInvalidateMappedMemoryRanges          = 0;
-      PFN_vkMapMemory                             vkMapMemory                             = 0;
-      PFN_vkMergePipelineCaches                   vkMergePipelineCaches                   = 0;
-      PFN_vkMergeValidationCachesEXT              vkMergeValidationCachesEXT              = 0;
-      PFN_vkQueueBeginDebugUtilsLabelEXT          vkQueueBeginDebugUtilsLabelEXT          = 0;
-      PFN_vkQueueBindSparse                       vkQueueBindSparse                       = 0;
-      PFN_vkQueueEndDebugUtilsLabelEXT            vkQueueEndDebugUtilsLabelEXT            = 0;
-      PFN_vkQueueInsertDebugUtilsLabelEXT         vkQueueInsertDebugUtilsLabelEXT         = 0;
-      PFN_vkQueuePresentKHR                       vkQueuePresentKHR                       = 0;
-      PFN_vkQueueSetPerformanceConfigurationINTEL vkQueueSetPerformanceConfigurationINTEL = 0;
-      PFN_vkQueueSubmit                           vkQueueSubmit                           = 0;
-      PFN_vkQueueSubmit2KHR                       vkQueueSubmit2KHR                       = 0;
-      PFN_vkQueueWaitIdle                         vkQueueWaitIdle                         = 0;
-      PFN_vkRegisterDeviceEventEXT                vkRegisterDeviceEventEXT                = 0;
-      PFN_vkRegisterDisplayEventEXT               vkRegisterDisplayEventEXT               = 0;
-#  if defined( VK_USE_PLATFORM_WIN32_KHR )
-      PFN_vkReleaseFullScreenExclusiveModeEXT vkReleaseFullScreenExclusiveModeEXT = 0;
-#  endif /*VK_USE_PLATFORM_WIN32_KHR*/
-      PFN_vkReleasePerformanceConfigurationINTEL vkReleasePerformanceConfigurationINTEL = 0;
-      PFN_vkReleaseProfilingLockKHR              vkReleaseProfilingLockKHR              = 0;
-      PFN_vkResetCommandBuffer                   vkResetCommandBuffer                   = 0;
-      PFN_vkResetCommandPool                     vkResetCommandPool                     = 0;
-      PFN_vkResetDescriptorPool                  vkResetDescriptorPool                  = 0;
-      PFN_vkResetEvent                           vkResetEvent                           = 0;
-      PFN_vkResetFences                          vkResetFences                          = 0;
-      PFN_vkResetQueryPool                       vkResetQueryPool                       = 0;
-      PFN_vkResetQueryPoolEXT                    vkResetQueryPoolEXT                    = 0;
-      PFN_vkSetDebugUtilsObjectNameEXT           vkSetDebugUtilsObjectNameEXT           = 0;
-      PFN_vkSetDebugUtilsObjectTagEXT            vkSetDebugUtilsObjectTagEXT            = 0;
-      PFN_vkSetEvent                             vkSetEvent                             = 0;
-      PFN_vkSetHdrMetadataEXT                    vkSetHdrMetadataEXT                    = 0;
-      PFN_vkSetLocalDimmingAMD                   vkSetLocalDimmingAMD                   = 0;
-      PFN_vkSetPrivateDataEXT                    vkSetPrivateDataEXT                    = 0;
-      PFN_vkSignalSemaphore                      vkSignalSemaphore                      = 0;
-      PFN_vkSignalSemaphoreKHR                   vkSignalSemaphoreKHR                   = 0;
-      PFN_vkTrimCommandPool                      vkTrimCommandPool                      = 0;
-      PFN_vkTrimCommandPoolKHR                   vkTrimCommandPoolKHR                   = 0;
-      PFN_vkUninitializePerformanceApiINTEL      vkUninitializePerformanceApiINTEL      = 0;
-      PFN_vkUnmapMemory                          vkUnmapMemory                          = 0;
-      PFN_vkUpdateDescriptorSetWithTemplate      vkUpdateDescriptorSetWithTemplate      = 0;
-      PFN_vkUpdateDescriptorSetWithTemplateKHR   vkUpdateDescriptorSetWithTemplateKHR   = 0;
-      PFN_vkUpdateDescriptorSets                 vkUpdateDescriptorSets                 = 0;
-#  if defined( VK_ENABLE_BETA_EXTENSIONS )
-      PFN_vkUpdateVideoSessionParametersKHR vkUpdateVideoSessionParametersKHR = 0;
-#  endif /*VK_ENABLE_BETA_EXTENSIONS*/
-      PFN_vkWaitForFences                            vkWaitForFences                            = 0;
-      PFN_vkWaitSemaphores                           vkWaitSemaphores                           = 0;
-      PFN_vkWaitSemaphoresKHR                        vkWaitSemaphoresKHR                        = 0;
-      PFN_vkWriteAccelerationStructuresPropertiesKHR vkWriteAccelerationStructuresPropertiesKHR = 0;
+
+      //=== VK_NV_fragment_shading_rate_enums ===
+      PFN_vkCmdSetFragmentShadingRateEnumNV vkCmdSetFragmentShadingRateEnumNV = 0;
+
+      //=== VK_NV_mesh_shader ===
+      PFN_vkCmdDrawMeshTasksNV              vkCmdDrawMeshTasksNV              = 0;
+      PFN_vkCmdDrawMeshTasksIndirectNV      vkCmdDrawMeshTasksIndirectNV      = 0;
+      PFN_vkCmdDrawMeshTasksIndirectCountNV vkCmdDrawMeshTasksIndirectCountNV = 0;
+
+      //=== VK_NV_ray_tracing ===
+      PFN_vkCreateAccelerationStructureNV                vkCreateAccelerationStructureNV                = 0;
+      PFN_vkDestroyAccelerationStructureNV               vkDestroyAccelerationStructureNV               = 0;
+      PFN_vkGetAccelerationStructureMemoryRequirementsNV vkGetAccelerationStructureMemoryRequirementsNV = 0;
+      PFN_vkBindAccelerationStructureMemoryNV            vkBindAccelerationStructureMemoryNV            = 0;
+      PFN_vkCmdBuildAccelerationStructureNV              vkCmdBuildAccelerationStructureNV              = 0;
+      PFN_vkCmdCopyAccelerationStructureNV               vkCmdCopyAccelerationStructureNV               = 0;
+      PFN_vkCmdTraceRaysNV                               vkCmdTraceRaysNV                               = 0;
+      PFN_vkCreateRayTracingPipelinesNV                  vkCreateRayTracingPipelinesNV                  = 0;
+      PFN_vkGetRayTracingShaderGroupHandlesNV            vkGetRayTracingShaderGroupHandlesNV            = 0;
+      PFN_vkGetAccelerationStructureHandleNV             vkGetAccelerationStructureHandleNV             = 0;
+      PFN_vkCmdWriteAccelerationStructuresPropertiesNV   vkCmdWriteAccelerationStructuresPropertiesNV   = 0;
+      PFN_vkCompileDeferredNV                            vkCompileDeferredNV                            = 0;
+
+      //=== VK_NV_scissor_exclusive ===
+      PFN_vkCmdSetExclusiveScissorNV vkCmdSetExclusiveScissorNV = 0;
+
+      //=== VK_NV_shading_rate_image ===
+      PFN_vkCmdBindShadingRateImageNV          vkCmdBindShadingRateImageNV          = 0;
+      PFN_vkCmdSetViewportShadingRatePaletteNV vkCmdSetViewportShadingRatePaletteNV = 0;
+      PFN_vkCmdSetCoarseSampleOrderNV          vkCmdSetCoarseSampleOrderNV          = 0;
     };
 
+    //====================
+    //=== RAII HANDLES ===
+    //====================
+
     class Context
     {
     public:
@@ -1725,6 +2210,7 @@
 
       VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::ContextDispatcher const * getDispatcher() const
       {
+        VULKAN_HPP_ASSERT( m_dispatcher.getVkHeaderVersion() == VK_HEADER_VERSION );
         return &m_dispatcher;
       }
 
@@ -1784,7 +2270,7 @@
 #  if defined( VULKAN_HPP_RAII_ENABLE_DEFAULT_CONSTRUCTORS )
       Instance() = default;
 #  else
-      Instance()                      = delete;
+      Instance()                                                              = delete;
 #  endif
       Instance( Instance const & ) = delete;
       Instance( Instance && rhs ) VULKAN_HPP_NOEXCEPT
@@ -1815,6 +2301,7 @@
 
       VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::InstanceDispatcher const * getDispatcher() const
       {
+        VULKAN_HPP_ASSERT( m_dispatcher.getVkHeaderVersion() == VK_HEADER_VERSION );
         return &m_dispatcher;
       }
 
@@ -1891,7 +2378,7 @@
 #  if defined( VULKAN_HPP_RAII_ENABLE_DEFAULT_CONSTRUCTORS )
       PhysicalDevice() = default;
 #  else
-      PhysicalDevice()                = delete;
+      PhysicalDevice()                                                        = delete;
 #  endif
       PhysicalDevice( PhysicalDevice const & ) = delete;
       PhysicalDevice( PhysicalDevice && rhs ) VULKAN_HPP_NOEXCEPT
@@ -1916,6 +2403,7 @@
 
       VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::InstanceDispatcher const * getDispatcher() const
       {
+        VULKAN_HPP_ASSERT( m_dispatcher->getVkHeaderVersion() == VK_HEADER_VERSION );
         return m_dispatcher;
       }
 
@@ -2294,7 +2782,7 @@
 #  if defined( VULKAN_HPP_RAII_ENABLE_DEFAULT_CONSTRUCTORS )
       PhysicalDevices() = default;
 #  else
-      PhysicalDevices()               = delete;
+      PhysicalDevices()                                                       = delete;
 #  endif
       PhysicalDevices( PhysicalDevices const & ) = delete;
       PhysicalDevices( PhysicalDevices && rhs )  = default;
@@ -2354,7 +2842,7 @@
 #  if defined( VULKAN_HPP_RAII_ENABLE_DEFAULT_CONSTRUCTORS )
       Device() = default;
 #  else
-      Device()                        = delete;
+      Device()                                                                = delete;
 #  endif
       Device( Device const & ) = delete;
       Device( Device && rhs ) VULKAN_HPP_NOEXCEPT
@@ -2385,6 +2873,7 @@
 
       VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::DeviceDispatcher const * getDispatcher() const
       {
+        VULKAN_HPP_ASSERT( m_dispatcher.getVkHeaderVersion() == VK_HEADER_VERSION );
         return &m_dispatcher;
       }
 
@@ -2798,7 +3287,7 @@
       //=== VK_NV_external_memory_rdma ===
 
       VULKAN_HPP_NODISCARD VULKAN_HPP_NAMESPACE::RemoteAddressNV
-                           getMemoryRemoteAddressNV( const MemoryGetRemoteAddressInfoNV & getMemoryRemoteAddressInfo ) const;
+                           getMemoryRemoteAddressNV( const MemoryGetRemoteAddressInfoNV & memoryGetRemoteAddressInfo ) const;
 
     private:
       VULKAN_HPP_NAMESPACE::Device                                      m_device;
@@ -2861,7 +3350,7 @@
 #  if defined( VULKAN_HPP_RAII_ENABLE_DEFAULT_CONSTRUCTORS )
       AccelerationStructureKHR() = default;
 #  else
-      AccelerationStructureKHR()      = delete;
+      AccelerationStructureKHR()                                              = delete;
 #  endif
       AccelerationStructureKHR( AccelerationStructureKHR const & ) = delete;
       AccelerationStructureKHR( AccelerationStructureKHR && rhs ) VULKAN_HPP_NOEXCEPT
@@ -2897,6 +3386,7 @@
 
       VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::DeviceDispatcher const * getDispatcher() const
       {
+        VULKAN_HPP_ASSERT( m_dispatcher->getVkHeaderVersion() == VK_HEADER_VERSION );
         return m_dispatcher;
       }
 
@@ -2974,7 +3464,7 @@
 #  if defined( VULKAN_HPP_RAII_ENABLE_DEFAULT_CONSTRUCTORS )
       AccelerationStructureNV() = default;
 #  else
-      AccelerationStructureNV()       = delete;
+      AccelerationStructureNV()                                               = delete;
 #  endif
       AccelerationStructureNV( AccelerationStructureNV const & ) = delete;
       AccelerationStructureNV( AccelerationStructureNV && rhs ) VULKAN_HPP_NOEXCEPT
@@ -3010,6 +3500,7 @@
 
       VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::DeviceDispatcher const * getDispatcher() const
       {
+        VULKAN_HPP_ASSERT( m_dispatcher->getVkHeaderVersion() == VK_HEADER_VERSION );
         return m_dispatcher;
       }
 
@@ -3091,7 +3582,7 @@
 #  if defined( VULKAN_HPP_RAII_ENABLE_DEFAULT_CONSTRUCTORS )
       Buffer() = default;
 #  else
-      Buffer()                        = delete;
+      Buffer()                                                                = delete;
 #  endif
       Buffer( Buffer const & ) = delete;
       Buffer( Buffer && rhs ) VULKAN_HPP_NOEXCEPT
@@ -3124,6 +3615,7 @@
 
       VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::DeviceDispatcher const * getDispatcher() const
       {
+        VULKAN_HPP_ASSERT( m_dispatcher->getVkHeaderVersion() == VK_HEADER_VERSION );
         return m_dispatcher;
       }
 
@@ -3203,7 +3695,7 @@
 #  if defined( VULKAN_HPP_RAII_ENABLE_DEFAULT_CONSTRUCTORS )
       BufferView() = default;
 #  else
-      BufferView()                    = delete;
+      BufferView()                                                            = delete;
 #  endif
       BufferView( BufferView const & ) = delete;
       BufferView( BufferView && rhs ) VULKAN_HPP_NOEXCEPT
@@ -3236,6 +3728,7 @@
 
       VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::DeviceDispatcher const * getDispatcher() const
       {
+        VULKAN_HPP_ASSERT( m_dispatcher->getVkHeaderVersion() == VK_HEADER_VERSION );
         return m_dispatcher;
       }
 
@@ -3309,7 +3802,7 @@
 #  if defined( VULKAN_HPP_RAII_ENABLE_DEFAULT_CONSTRUCTORS )
       CommandPool() = default;
 #  else
-      CommandPool()                   = delete;
+      CommandPool()                                                           = delete;
 #  endif
       CommandPool( CommandPool const & ) = delete;
       CommandPool( CommandPool && rhs ) VULKAN_HPP_NOEXCEPT
@@ -3342,6 +3835,7 @@
 
       VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::DeviceDispatcher const * getDispatcher() const
       {
+        VULKAN_HPP_ASSERT( m_dispatcher->getVkHeaderVersion() == VK_HEADER_VERSION );
         return m_dispatcher;
       }
 
@@ -3417,7 +3911,7 @@
 #  if defined( VULKAN_HPP_RAII_ENABLE_DEFAULT_CONSTRUCTORS )
       CommandBuffer() = default;
 #  else
-      CommandBuffer()                 = delete;
+      CommandBuffer()                                                         = delete;
 #  endif
       CommandBuffer( CommandBuffer const & ) = delete;
       CommandBuffer( CommandBuffer && rhs ) VULKAN_HPP_NOEXCEPT
@@ -3451,6 +3945,7 @@
 
       VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::DeviceDispatcher const * getDispatcher() const
       {
+        VULKAN_HPP_ASSERT( m_dispatcher->getVkHeaderVersion() == VK_HEADER_VERSION );
         return m_dispatcher;
       }
 
@@ -3606,10 +4101,12 @@
                       ArrayProxy<const VULKAN_HPP_NAMESPACE::ImageResolve> const & regions ) const VULKAN_HPP_NOEXCEPT;
 
       void setEvent( VULKAN_HPP_NAMESPACE::Event              event,
-                     VULKAN_HPP_NAMESPACE::PipelineStageFlags stageMask ) const VULKAN_HPP_NOEXCEPT;
+                     VULKAN_HPP_NAMESPACE::PipelineStageFlags stageMask
+                                                              VULKAN_HPP_DEFAULT_ARGUMENT_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;
 
       void resetEvent( VULKAN_HPP_NAMESPACE::Event              event,
-                       VULKAN_HPP_NAMESPACE::PipelineStageFlags stageMask ) const VULKAN_HPP_NOEXCEPT;
+                       VULKAN_HPP_NAMESPACE::PipelineStageFlags stageMask
+                                                                VULKAN_HPP_DEFAULT_ARGUMENT_ASSIGNMENT ) const VULKAN_HPP_NOEXCEPT;
 
       void waitEvents( ArrayProxy<const VULKAN_HPP_NAMESPACE::Event> const &               events,
                        VULKAN_HPP_NAMESPACE::PipelineStageFlags                            srcStageMask,
@@ -4123,6 +4620,11 @@
 
       void subpassShadingHUAWEI() const VULKAN_HPP_NOEXCEPT;
 
+      //=== VK_HUAWEI_invocation_mask ===
+
+      void bindInvocationMaskHUAWEI( VULKAN_HPP_NAMESPACE::ImageView   imageView,
+                                     VULKAN_HPP_NAMESPACE::ImageLayout imageLayout ) const VULKAN_HPP_NOEXCEPT;
+
       //=== VK_EXT_extended_dynamic_state2 ===
 
       void setPatchControlPointsEXT( uint32_t patchControlPoints ) const VULKAN_HPP_NOEXCEPT;
@@ -4195,7 +4697,7 @@
 #  if defined( VULKAN_HPP_RAII_ENABLE_DEFAULT_CONSTRUCTORS )
       CommandBuffers() = default;
 #  else
-      CommandBuffers()                = delete;
+      CommandBuffers()                                                        = delete;
 #  endif
       CommandBuffers( CommandBuffers const & ) = delete;
       CommandBuffers( CommandBuffers && rhs )  = default;
@@ -4257,7 +4759,7 @@
 #  if defined( VULKAN_HPP_RAII_ENABLE_DEFAULT_CONSTRUCTORS )
       CuFunctionNVX() = default;
 #  else
-      CuFunctionNVX()                 = delete;
+      CuFunctionNVX()                                                         = delete;
 #  endif
       CuFunctionNVX( CuFunctionNVX const & ) = delete;
       CuFunctionNVX( CuFunctionNVX && rhs ) VULKAN_HPP_NOEXCEPT
@@ -4291,6 +4793,7 @@
 
       VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::DeviceDispatcher const * getDispatcher() const
       {
+        VULKAN_HPP_ASSERT( m_dispatcher->getVkHeaderVersion() == VK_HEADER_VERSION );
         return m_dispatcher;
       }
 
@@ -4364,7 +4867,7 @@
 #  if defined( VULKAN_HPP_RAII_ENABLE_DEFAULT_CONSTRUCTORS )
       CuModuleNVX() = default;
 #  else
-      CuModuleNVX()                   = delete;
+      CuModuleNVX()                                                           = delete;
 #  endif
       CuModuleNVX( CuModuleNVX const & ) = delete;
       CuModuleNVX( CuModuleNVX && rhs ) VULKAN_HPP_NOEXCEPT
@@ -4397,6 +4900,7 @@
 
       VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::DeviceDispatcher const * getDispatcher() const
       {
+        VULKAN_HPP_ASSERT( m_dispatcher->getVkHeaderVersion() == VK_HEADER_VERSION );
         return m_dispatcher;
       }
 
@@ -4474,7 +4978,7 @@
 #  if defined( VULKAN_HPP_RAII_ENABLE_DEFAULT_CONSTRUCTORS )
       DebugReportCallbackEXT() = default;
 #  else
-      DebugReportCallbackEXT()        = delete;
+      DebugReportCallbackEXT()                                                = delete;
 #  endif
       DebugReportCallbackEXT( DebugReportCallbackEXT const & ) = delete;
       DebugReportCallbackEXT( DebugReportCallbackEXT && rhs ) VULKAN_HPP_NOEXCEPT
@@ -4510,6 +5014,7 @@
 
       VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::InstanceDispatcher const * getDispatcher() const
       {
+        VULKAN_HPP_ASSERT( m_dispatcher->getVkHeaderVersion() == VK_HEADER_VERSION );
         return m_dispatcher;
       }
 
@@ -4587,7 +5092,7 @@
 #  if defined( VULKAN_HPP_RAII_ENABLE_DEFAULT_CONSTRUCTORS )
       DebugUtilsMessengerEXT() = default;
 #  else
-      DebugUtilsMessengerEXT()        = delete;
+      DebugUtilsMessengerEXT()                                                = delete;
 #  endif
       DebugUtilsMessengerEXT( DebugUtilsMessengerEXT const & ) = delete;
       DebugUtilsMessengerEXT( DebugUtilsMessengerEXT && rhs ) VULKAN_HPP_NOEXCEPT
@@ -4623,6 +5128,7 @@
 
       VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::InstanceDispatcher const * getDispatcher() const
       {
+        VULKAN_HPP_ASSERT( m_dispatcher->getVkHeaderVersion() == VK_HEADER_VERSION );
         return m_dispatcher;
       }
 
@@ -4698,7 +5204,7 @@
 #  if defined( VULKAN_HPP_RAII_ENABLE_DEFAULT_CONSTRUCTORS )
       DeferredOperationKHR() = default;
 #  else
-      DeferredOperationKHR()          = delete;
+      DeferredOperationKHR()                                                  = delete;
 #  endif
       DeferredOperationKHR( DeferredOperationKHR const & ) = delete;
       DeferredOperationKHR( DeferredOperationKHR && rhs ) VULKAN_HPP_NOEXCEPT
@@ -4734,6 +5240,7 @@
 
       VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::DeviceDispatcher const * getDispatcher() const
       {
+        VULKAN_HPP_ASSERT( m_dispatcher->getVkHeaderVersion() == VK_HEADER_VERSION );
         return m_dispatcher;
       }
 
@@ -4818,7 +5325,7 @@
 #  if defined( VULKAN_HPP_RAII_ENABLE_DEFAULT_CONSTRUCTORS )
       DescriptorPool() = default;
 #  else
-      DescriptorPool()                = delete;
+      DescriptorPool()                                                        = delete;
 #  endif
       DescriptorPool( DescriptorPool const & ) = delete;
       DescriptorPool( DescriptorPool && rhs ) VULKAN_HPP_NOEXCEPT
@@ -4852,6 +5359,7 @@
 
       VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::DeviceDispatcher const * getDispatcher() const
       {
+        VULKAN_HPP_ASSERT( m_dispatcher->getVkHeaderVersion() == VK_HEADER_VERSION );
         return m_dispatcher;
       }
 
@@ -4921,7 +5429,7 @@
 #  if defined( VULKAN_HPP_RAII_ENABLE_DEFAULT_CONSTRUCTORS )
       DescriptorSet() = default;
 #  else
-      DescriptorSet()                 = delete;
+      DescriptorSet()                                                         = delete;
 #  endif
       DescriptorSet( DescriptorSet const & ) = delete;
       DescriptorSet( DescriptorSet && rhs ) VULKAN_HPP_NOEXCEPT
@@ -4955,6 +5463,7 @@
 
       VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::DeviceDispatcher const * getDispatcher() const
       {
+        VULKAN_HPP_ASSERT( m_dispatcher->getVkHeaderVersion() == VK_HEADER_VERSION );
         return m_dispatcher;
       }
 
@@ -5019,7 +5528,7 @@
 #  if defined( VULKAN_HPP_RAII_ENABLE_DEFAULT_CONSTRUCTORS )
       DescriptorSets() = default;
 #  else
-      DescriptorSets()                = delete;
+      DescriptorSets()                                                        = delete;
 #  endif
       DescriptorSets( DescriptorSets const & ) = delete;
       DescriptorSets( DescriptorSets && rhs )  = default;
@@ -5082,7 +5591,7 @@
 #  if defined( VULKAN_HPP_RAII_ENABLE_DEFAULT_CONSTRUCTORS )
       DescriptorSetLayout() = default;
 #  else
-      DescriptorSetLayout()           = delete;
+      DescriptorSetLayout()                                                   = delete;
 #  endif
       DescriptorSetLayout( DescriptorSetLayout const & ) = delete;
       DescriptorSetLayout( DescriptorSetLayout && rhs ) VULKAN_HPP_NOEXCEPT
@@ -5118,6 +5627,7 @@
 
       VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::DeviceDispatcher const * getDispatcher() const
       {
+        VULKAN_HPP_ASSERT( m_dispatcher->getVkHeaderVersion() == VK_HEADER_VERSION );
         return m_dispatcher;
       }
 
@@ -5195,7 +5705,7 @@
 #  if defined( VULKAN_HPP_RAII_ENABLE_DEFAULT_CONSTRUCTORS )
       DescriptorUpdateTemplate() = default;
 #  else
-      DescriptorUpdateTemplate()      = delete;
+      DescriptorUpdateTemplate()                                              = delete;
 #  endif
       DescriptorUpdateTemplate( DescriptorUpdateTemplate const & ) = delete;
       DescriptorUpdateTemplate( DescriptorUpdateTemplate && rhs ) VULKAN_HPP_NOEXCEPT
@@ -5231,6 +5741,7 @@
 
       VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::DeviceDispatcher const * getDispatcher() const
       {
+        VULKAN_HPP_ASSERT( m_dispatcher->getVkHeaderVersion() == VK_HEADER_VERSION );
         return m_dispatcher;
       }
 
@@ -5306,7 +5817,7 @@
 #  if defined( VULKAN_HPP_RAII_ENABLE_DEFAULT_CONSTRUCTORS )
       DeviceMemory() = default;
 #  else
-      DeviceMemory()                  = delete;
+      DeviceMemory()                                                          = delete;
 #  endif
       DeviceMemory( DeviceMemory const & ) = delete;
       DeviceMemory( DeviceMemory && rhs ) VULKAN_HPP_NOEXCEPT
@@ -5339,6 +5850,7 @@
 
       VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::DeviceDispatcher const * getDispatcher() const
       {
+        VULKAN_HPP_ASSERT( m_dispatcher->getVkHeaderVersion() == VK_HEADER_VERSION );
         return m_dispatcher;
       }
 
@@ -5464,7 +5976,7 @@
 #  if defined( VULKAN_HPP_RAII_ENABLE_DEFAULT_CONSTRUCTORS )
       DisplayKHR() = default;
 #  else
-      DisplayKHR()                    = delete;
+      DisplayKHR()                                                            = delete;
 #  endif
       DisplayKHR( DisplayKHR const & ) = delete;
       DisplayKHR( DisplayKHR && rhs ) VULKAN_HPP_NOEXCEPT
@@ -5495,6 +6007,7 @@
 
       VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::InstanceDispatcher const * getDispatcher() const
       {
+        VULKAN_HPP_ASSERT( m_dispatcher->getVkHeaderVersion() == VK_HEADER_VERSION );
         return m_dispatcher;
       }
 
@@ -5570,7 +6083,7 @@
 #  if defined( VULKAN_HPP_RAII_ENABLE_DEFAULT_CONSTRUCTORS )
       DisplayKHRs() = default;
 #  else
-      DisplayKHRs()                   = delete;
+      DisplayKHRs()                                                           = delete;
 #  endif
       DisplayKHRs( DisplayKHRs const & ) = delete;
       DisplayKHRs( DisplayKHRs && rhs )  = default;
@@ -5620,7 +6133,7 @@
 #  if defined( VULKAN_HPP_RAII_ENABLE_DEFAULT_CONSTRUCTORS )
       DisplayModeKHR() = default;
 #  else
-      DisplayModeKHR()                = delete;
+      DisplayModeKHR()                                                        = delete;
 #  endif
       DisplayModeKHR( DisplayModeKHR const & ) = delete;
       DisplayModeKHR( DisplayModeKHR && rhs ) VULKAN_HPP_NOEXCEPT
@@ -5645,6 +6158,7 @@
 
       VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::InstanceDispatcher const * getDispatcher() const
       {
+        VULKAN_HPP_ASSERT( m_dispatcher->getVkHeaderVersion() == VK_HEADER_VERSION );
         return m_dispatcher;
       }
 
@@ -5722,7 +6236,7 @@
 #  if defined( VULKAN_HPP_RAII_ENABLE_DEFAULT_CONSTRUCTORS )
       Event() = default;
 #  else
-      Event()                         = delete;
+      Event()                                                                 = delete;
 #  endif
       Event( Event const & ) = delete;
       Event( Event && rhs ) VULKAN_HPP_NOEXCEPT
@@ -5755,6 +6269,7 @@
 
       VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::DeviceDispatcher const * getDispatcher() const
       {
+        VULKAN_HPP_ASSERT( m_dispatcher->getVkHeaderVersion() == VK_HEADER_VERSION );
         return m_dispatcher;
       }
 
@@ -5877,7 +6392,7 @@
 #  if defined( VULKAN_HPP_RAII_ENABLE_DEFAULT_CONSTRUCTORS )
       Fence() = default;
 #  else
-      Fence()                         = delete;
+      Fence()                                                                 = delete;
 #  endif
       Fence( Fence const & ) = delete;
       Fence( Fence && rhs ) VULKAN_HPP_NOEXCEPT
@@ -5910,6 +6425,7 @@
 
       VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::DeviceDispatcher const * getDispatcher() const
       {
+        VULKAN_HPP_ASSERT( m_dispatcher->getVkHeaderVersion() == VK_HEADER_VERSION );
         return m_dispatcher;
       }
 
@@ -5987,7 +6503,7 @@
 #  if defined( VULKAN_HPP_RAII_ENABLE_DEFAULT_CONSTRUCTORS )
       Framebuffer() = default;
 #  else
-      Framebuffer()                   = delete;
+      Framebuffer()                                                           = delete;
 #  endif
       Framebuffer( Framebuffer const & ) = delete;
       Framebuffer( Framebuffer && rhs ) VULKAN_HPP_NOEXCEPT
@@ -6020,6 +6536,7 @@
 
       VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::DeviceDispatcher const * getDispatcher() const
       {
+        VULKAN_HPP_ASSERT( m_dispatcher->getVkHeaderVersion() == VK_HEADER_VERSION );
         return m_dispatcher;
       }
 
@@ -6093,7 +6610,7 @@
 #  if defined( VULKAN_HPP_RAII_ENABLE_DEFAULT_CONSTRUCTORS )
       Image() = default;
 #  else
-      Image()                         = delete;
+      Image()                                                                 = delete;
 #  endif
       Image( Image const & ) = delete;
       Image( Image && rhs ) VULKAN_HPP_NOEXCEPT
@@ -6126,6 +6643,7 @@
 
       VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::DeviceDispatcher const * getDispatcher() const
       {
+        VULKAN_HPP_ASSERT( m_dispatcher->getVkHeaderVersion() == VK_HEADER_VERSION );
         return m_dispatcher;
       }
 
@@ -6216,7 +6734,7 @@
 #  if defined( VULKAN_HPP_RAII_ENABLE_DEFAULT_CONSTRUCTORS )
       ImageView() = default;
 #  else
-      ImageView()                     = delete;
+      ImageView()                                                             = delete;
 #  endif
       ImageView( ImageView const & ) = delete;
       ImageView( ImageView && rhs ) VULKAN_HPP_NOEXCEPT
@@ -6249,6 +6767,7 @@
 
       VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::DeviceDispatcher const * getDispatcher() const
       {
+        VULKAN_HPP_ASSERT( m_dispatcher->getVkHeaderVersion() == VK_HEADER_VERSION );
         return m_dispatcher;
       }
 
@@ -6330,7 +6849,7 @@
 #  if defined( VULKAN_HPP_RAII_ENABLE_DEFAULT_CONSTRUCTORS )
       IndirectCommandsLayoutNV() = default;
 #  else
-      IndirectCommandsLayoutNV()      = delete;
+      IndirectCommandsLayoutNV()                                              = delete;
 #  endif
       IndirectCommandsLayoutNV( IndirectCommandsLayoutNV const & ) = delete;
       IndirectCommandsLayoutNV( IndirectCommandsLayoutNV && rhs ) VULKAN_HPP_NOEXCEPT
@@ -6366,6 +6885,7 @@
 
       VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::DeviceDispatcher const * getDispatcher() const
       {
+        VULKAN_HPP_ASSERT( m_dispatcher->getVkHeaderVersion() == VK_HEADER_VERSION );
         return m_dispatcher;
       }
 
@@ -6434,7 +6954,7 @@
 #  if defined( VULKAN_HPP_RAII_ENABLE_DEFAULT_CONSTRUCTORS )
       PerformanceConfigurationINTEL() = default;
 #  else
-      PerformanceConfigurationINTEL() = delete;
+      PerformanceConfigurationINTEL()                                         = delete;
 #  endif
       PerformanceConfigurationINTEL( PerformanceConfigurationINTEL const & ) = delete;
       PerformanceConfigurationINTEL( PerformanceConfigurationINTEL && rhs ) VULKAN_HPP_NOEXCEPT
@@ -6468,6 +6988,7 @@
 
       VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::DeviceDispatcher const * getDispatcher() const
       {
+        VULKAN_HPP_ASSERT( m_dispatcher->getVkHeaderVersion() == VK_HEADER_VERSION );
         return m_dispatcher;
       }
 
@@ -6543,7 +7064,7 @@
 #  if defined( VULKAN_HPP_RAII_ENABLE_DEFAULT_CONSTRUCTORS )
       PipelineCache() = default;
 #  else
-      PipelineCache()                 = delete;
+      PipelineCache()                                                         = delete;
 #  endif
       PipelineCache( PipelineCache const & ) = delete;
       PipelineCache( PipelineCache && rhs ) VULKAN_HPP_NOEXCEPT
@@ -6577,6 +7098,7 @@
 
       VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::DeviceDispatcher const * getDispatcher() const
       {
+        VULKAN_HPP_ASSERT( m_dispatcher->getVkHeaderVersion() == VK_HEADER_VERSION );
         return m_dispatcher;
       }
 
@@ -6757,7 +7279,7 @@
 #  if defined( VULKAN_HPP_RAII_ENABLE_DEFAULT_CONSTRUCTORS )
       Pipeline() = default;
 #  else
-      Pipeline()                      = delete;
+      Pipeline()                                                              = delete;
 #  endif
       Pipeline( Pipeline const & ) = delete;
       Pipeline( Pipeline && rhs ) VULKAN_HPP_NOEXCEPT
@@ -6795,6 +7317,7 @@
 
       VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::DeviceDispatcher const * getDispatcher() const
       {
+        VULKAN_HPP_ASSERT( m_dispatcher->getVkHeaderVersion() == VK_HEADER_VERSION );
         return m_dispatcher;
       }
 
@@ -7019,7 +7542,7 @@
 #  if defined( VULKAN_HPP_RAII_ENABLE_DEFAULT_CONSTRUCTORS )
       Pipelines() = default;
 #  else
-      Pipelines()                     = delete;
+      Pipelines()                                                             = delete;
 #  endif
       Pipelines( Pipelines const & ) = delete;
       Pipelines( Pipelines && rhs )  = default;
@@ -7081,7 +7604,7 @@
 #  if defined( VULKAN_HPP_RAII_ENABLE_DEFAULT_CONSTRUCTORS )
       PipelineLayout() = default;
 #  else
-      PipelineLayout()                = delete;
+      PipelineLayout()                                                        = delete;
 #  endif
       PipelineLayout( PipelineLayout const & ) = delete;
       PipelineLayout( PipelineLayout && rhs ) VULKAN_HPP_NOEXCEPT
@@ -7115,6 +7638,7 @@
 
       VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::DeviceDispatcher const * getDispatcher() const
       {
+        VULKAN_HPP_ASSERT( m_dispatcher->getVkHeaderVersion() == VK_HEADER_VERSION );
         return m_dispatcher;
       }
 
@@ -7192,7 +7716,7 @@
 #  if defined( VULKAN_HPP_RAII_ENABLE_DEFAULT_CONSTRUCTORS )
       PrivateDataSlotEXT() = default;
 #  else
-      PrivateDataSlotEXT()            = delete;
+      PrivateDataSlotEXT()                                                    = delete;
 #  endif
       PrivateDataSlotEXT( PrivateDataSlotEXT const & ) = delete;
       PrivateDataSlotEXT( PrivateDataSlotEXT && rhs ) VULKAN_HPP_NOEXCEPT
@@ -7228,6 +7752,7 @@
 
       VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::DeviceDispatcher const * getDispatcher() const
       {
+        VULKAN_HPP_ASSERT( m_dispatcher->getVkHeaderVersion() == VK_HEADER_VERSION );
         return m_dispatcher;
       }
 
@@ -7301,7 +7826,7 @@
 #  if defined( VULKAN_HPP_RAII_ENABLE_DEFAULT_CONSTRUCTORS )
       QueryPool() = default;
 #  else
-      QueryPool()                     = delete;
+      QueryPool()                                                             = delete;
 #  endif
       QueryPool( QueryPool const & ) = delete;
       QueryPool( QueryPool && rhs ) VULKAN_HPP_NOEXCEPT
@@ -7334,6 +7859,7 @@
 
       VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::DeviceDispatcher const * getDispatcher() const
       {
+        VULKAN_HPP_ASSERT( m_dispatcher->getVkHeaderVersion() == VK_HEADER_VERSION );
         return m_dispatcher;
       }
 
@@ -7417,7 +7943,7 @@
 #  if defined( VULKAN_HPP_RAII_ENABLE_DEFAULT_CONSTRUCTORS )
       Queue() = default;
 #  else
-      Queue()                         = delete;
+      Queue()                                                                 = delete;
 #  endif
       Queue( Queue const & ) = delete;
       Queue( Queue && rhs ) VULKAN_HPP_NOEXCEPT
@@ -7442,6 +7968,7 @@
 
       VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::DeviceDispatcher const * getDispatcher() const
       {
+        VULKAN_HPP_ASSERT( m_dispatcher->getVkHeaderVersion() == VK_HEADER_VERSION );
         return m_dispatcher;
       }
 
@@ -7571,7 +8098,7 @@
 #  if defined( VULKAN_HPP_RAII_ENABLE_DEFAULT_CONSTRUCTORS )
       RenderPass() = default;
 #  else
-      RenderPass()                    = delete;
+      RenderPass()                                                            = delete;
 #  endif
       RenderPass( RenderPass const & ) = delete;
       RenderPass( RenderPass && rhs ) VULKAN_HPP_NOEXCEPT
@@ -7604,6 +8131,7 @@
 
       VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::DeviceDispatcher const * getDispatcher() const
       {
+        VULKAN_HPP_ASSERT( m_dispatcher->getVkHeaderVersion() == VK_HEADER_VERSION );
         return m_dispatcher;
       }
 
@@ -7626,7 +8154,7 @@
       //=== VK_HUAWEI_subpass_shading ===
 
       VULKAN_HPP_NODISCARD std::pair<VULKAN_HPP_NAMESPACE::Result, VULKAN_HPP_NAMESPACE::Extent2D>
-                           getDeviceSubpassShadingMaxWorkgroupSizeHUAWEI() const;
+                           getSubpassShadingMaxWorkgroupSizeHUAWEI() const;
 
     private:
       VULKAN_HPP_NAMESPACE::RenderPass                                          m_renderPass;
@@ -7686,7 +8214,7 @@
 #  if defined( VULKAN_HPP_RAII_ENABLE_DEFAULT_CONSTRUCTORS )
       Sampler() = default;
 #  else
-      Sampler()                       = delete;
+      Sampler()                                                               = delete;
 #  endif
       Sampler( Sampler const & ) = delete;
       Sampler( Sampler && rhs ) VULKAN_HPP_NOEXCEPT
@@ -7719,6 +8247,7 @@
 
       VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::DeviceDispatcher const * getDispatcher() const
       {
+        VULKAN_HPP_ASSERT( m_dispatcher->getVkHeaderVersion() == VK_HEADER_VERSION );
         return m_dispatcher;
       }
 
@@ -7796,7 +8325,7 @@
 #  if defined( VULKAN_HPP_RAII_ENABLE_DEFAULT_CONSTRUCTORS )
       SamplerYcbcrConversion() = default;
 #  else
-      SamplerYcbcrConversion()        = delete;
+      SamplerYcbcrConversion()                                                = delete;
 #  endif
       SamplerYcbcrConversion( SamplerYcbcrConversion const & ) = delete;
       SamplerYcbcrConversion( SamplerYcbcrConversion && rhs ) VULKAN_HPP_NOEXCEPT
@@ -7832,6 +8361,7 @@
 
       VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::DeviceDispatcher const * getDispatcher() const
       {
+        VULKAN_HPP_ASSERT( m_dispatcher->getVkHeaderVersion() == VK_HEADER_VERSION );
         return m_dispatcher;
       }
 
@@ -7905,7 +8435,7 @@
 #  if defined( VULKAN_HPP_RAII_ENABLE_DEFAULT_CONSTRUCTORS )
       Semaphore() = default;
 #  else
-      Semaphore()                     = delete;
+      Semaphore()                                                             = delete;
 #  endif
       Semaphore( Semaphore const & ) = delete;
       Semaphore( Semaphore && rhs ) VULKAN_HPP_NOEXCEPT
@@ -7938,6 +8468,7 @@
 
       VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::DeviceDispatcher const * getDispatcher() const
       {
+        VULKAN_HPP_ASSERT( m_dispatcher->getVkHeaderVersion() == VK_HEADER_VERSION );
         return m_dispatcher;
       }
 
@@ -8022,7 +8553,7 @@
 #  if defined( VULKAN_HPP_RAII_ENABLE_DEFAULT_CONSTRUCTORS )
       ShaderModule() = default;
 #  else
-      ShaderModule()                  = delete;
+      ShaderModule()                                                          = delete;
 #  endif
       ShaderModule( ShaderModule const & ) = delete;
       ShaderModule( ShaderModule && rhs ) VULKAN_HPP_NOEXCEPT
@@ -8056,6 +8587,7 @@
 
       VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::DeviceDispatcher const * getDispatcher() const
       {
+        VULKAN_HPP_ASSERT( m_dispatcher->getVkHeaderVersion() == VK_HEADER_VERSION );
         return m_dispatcher;
       }
 
@@ -8432,7 +8964,7 @@
 #  if defined( VULKAN_HPP_RAII_ENABLE_DEFAULT_CONSTRUCTORS )
       SurfaceKHR() = default;
 #  else
-      SurfaceKHR()                    = delete;
+      SurfaceKHR()                                                            = delete;
 #  endif
       SurfaceKHR( SurfaceKHR const & ) = delete;
       SurfaceKHR( SurfaceKHR && rhs ) VULKAN_HPP_NOEXCEPT
@@ -8465,6 +8997,7 @@
 
       VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::InstanceDispatcher const * getDispatcher() const
       {
+        VULKAN_HPP_ASSERT( m_dispatcher->getVkHeaderVersion() == VK_HEADER_VERSION );
         return m_dispatcher;
       }
 
@@ -8548,7 +9081,7 @@
 #  if defined( VULKAN_HPP_RAII_ENABLE_DEFAULT_CONSTRUCTORS )
       SwapchainKHR() = default;
 #  else
-      SwapchainKHR()                  = delete;
+      SwapchainKHR()                                                          = delete;
 #  endif
       SwapchainKHR( SwapchainKHR const & ) = delete;
       SwapchainKHR( SwapchainKHR && rhs ) VULKAN_HPP_NOEXCEPT
@@ -8582,6 +9115,7 @@
 
       VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::DeviceDispatcher const * getDispatcher() const
       {
+        VULKAN_HPP_ASSERT( m_dispatcher->getVkHeaderVersion() == VK_HEADER_VERSION );
         return m_dispatcher;
       }
 
@@ -8625,6 +9159,10 @@
 
       void setLocalDimmingAMD( VULKAN_HPP_NAMESPACE::Bool32 localDimmingEnable ) const VULKAN_HPP_NOEXCEPT;
 
+      //=== VK_KHR_present_wait ===
+
+      VULKAN_HPP_NODISCARD VULKAN_HPP_NAMESPACE::Result waitForPresent( uint64_t presentId, uint64_t timeout ) const;
+
 #  if defined( VK_USE_PLATFORM_WIN32_KHR )
       //=== VK_EXT_full_screen_exclusive ===
 
@@ -8679,7 +9217,7 @@
 #  if defined( VULKAN_HPP_RAII_ENABLE_DEFAULT_CONSTRUCTORS )
       SwapchainKHRs() = default;
 #  else
-      SwapchainKHRs()                 = delete;
+      SwapchainKHRs()                                                         = delete;
 #  endif
       SwapchainKHRs( SwapchainKHRs const & ) = delete;
       SwapchainKHRs( SwapchainKHRs && rhs )  = default;
@@ -8742,7 +9280,7 @@
 #  if defined( VULKAN_HPP_RAII_ENABLE_DEFAULT_CONSTRUCTORS )
       ValidationCacheEXT() = default;
 #  else
-      ValidationCacheEXT()            = delete;
+      ValidationCacheEXT()                                                    = delete;
 #  endif
       ValidationCacheEXT( ValidationCacheEXT const & ) = delete;
       ValidationCacheEXT( ValidationCacheEXT && rhs ) VULKAN_HPP_NOEXCEPT
@@ -8778,6 +9316,7 @@
 
       VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::DeviceDispatcher const * getDispatcher() const
       {
+        VULKAN_HPP_ASSERT( m_dispatcher->getVkHeaderVersion() == VK_HEADER_VERSION );
         return m_dispatcher;
       }
 
@@ -8896,6 +9435,7 @@
 
       VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::DeviceDispatcher const * getDispatcher() const
       {
+        VULKAN_HPP_ASSERT( m_dispatcher->getVkHeaderVersion() == VK_HEADER_VERSION );
         return m_dispatcher;
       }
 
@@ -9018,6 +9558,7 @@
 
       VULKAN_HPP_NAMESPACE::VULKAN_HPP_RAII_NAMESPACE::DeviceDispatcher const * getDispatcher() const
       {
+        VULKAN_HPP_ASSERT( m_dispatcher->getVkHeaderVersion() == VK_HEADER_VERSION );
         return m_dispatcher;
       }
 
@@ -14761,6 +15302,25 @@
       return toolProperties;
     }
 
+    //=== VK_KHR_present_wait ===
+
+    VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::Result
+                                           SwapchainKHR::waitForPresent( uint64_t presentId, uint64_t timeout ) const
+    {
+      VULKAN_HPP_ASSERT( getDispatcher()->vkWaitForPresentKHR &&
+                         "Function <vkWaitForPresentKHR> needs extension <VK_KHR_present_wait> enabled!" );
+
+      VULKAN_HPP_NAMESPACE::Result result =
+        static_cast<VULKAN_HPP_NAMESPACE::Result>( getDispatcher()->vkWaitForPresentKHR(
+          static_cast<VkDevice>( m_device ), static_cast<VkSwapchainKHR>( m_swapchainKHR ), presentId, timeout ) );
+      if ( ( result != VULKAN_HPP_NAMESPACE::Result::eSuccess ) &&
+           ( result != VULKAN_HPP_NAMESPACE::Result::eTimeout ) )
+      {
+        throwResultException( result, VULKAN_HPP_NAMESPACE_STRING "::SwapchainKHR::waitForPresent" );
+      }
+      return result;
+    }
+
     //=== VK_NV_cooperative_matrix ===
 
     VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE std::vector<VULKAN_HPP_NAMESPACE::CooperativeMatrixPropertiesNV>
@@ -15980,7 +16540,7 @@
     //=== VK_HUAWEI_subpass_shading ===
 
     VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE std::pair<VULKAN_HPP_NAMESPACE::Result, VULKAN_HPP_NAMESPACE::Extent2D>
-                                           RenderPass::getDeviceSubpassShadingMaxWorkgroupSizeHUAWEI() const
+                                           RenderPass::getSubpassShadingMaxWorkgroupSizeHUAWEI() const
     {
       VULKAN_HPP_ASSERT(
         getDispatcher()->vkGetDeviceSubpassShadingMaxWorkgroupSizeHUAWEI &&
@@ -15995,8 +16555,8 @@
       if ( ( result != VULKAN_HPP_NAMESPACE::Result::eSuccess ) &&
            ( result != VULKAN_HPP_NAMESPACE::Result::eIncomplete ) )
       {
-        throwResultException(
-          result, VULKAN_HPP_NAMESPACE_STRING "::RenderPass::getDeviceSubpassShadingMaxWorkgroupSizeHUAWEI" );
+        throwResultException( result,
+                              VULKAN_HPP_NAMESPACE_STRING "::RenderPass::getSubpassShadingMaxWorkgroupSizeHUAWEI" );
       }
       return std::make_pair( result, maxWorkgroupSize );
     }
@@ -16009,10 +16569,25 @@
       getDispatcher()->vkCmdSubpassShadingHUAWEI( static_cast<VkCommandBuffer>( m_commandBuffer ) );
     }
 
+    //=== VK_HUAWEI_invocation_mask ===
+
+    VULKAN_HPP_INLINE void
+      CommandBuffer::bindInvocationMaskHUAWEI( VULKAN_HPP_NAMESPACE::ImageView   imageView,
+                                               VULKAN_HPP_NAMESPACE::ImageLayout imageLayout ) const VULKAN_HPP_NOEXCEPT
+    {
+      VULKAN_HPP_ASSERT(
+        getDispatcher()->vkCmdBindInvocationMaskHUAWEI &&
+        "Function <vkCmdBindInvocationMaskHUAWEI> needs extension <VK_HUAWEI_invocation_mask> enabled!" );
+
+      getDispatcher()->vkCmdBindInvocationMaskHUAWEI( static_cast<VkCommandBuffer>( m_commandBuffer ),
+                                                      static_cast<VkImageView>( imageView ),
+                                                      static_cast<VkImageLayout>( imageLayout ) );
+    }
+
     //=== VK_NV_external_memory_rdma ===
 
     VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE VULKAN_HPP_NAMESPACE::RemoteAddressNV
-                                           Device::getMemoryRemoteAddressNV( const MemoryGetRemoteAddressInfoNV & getMemoryRemoteAddressInfo ) const
+                                           Device::getMemoryRemoteAddressNV( const MemoryGetRemoteAddressInfoNV & memoryGetRemoteAddressInfo ) const
     {
       VULKAN_HPP_ASSERT(
         getDispatcher()->vkGetMemoryRemoteAddressNV &&
@@ -16022,7 +16597,7 @@
       VULKAN_HPP_NAMESPACE::Result          result =
         static_cast<VULKAN_HPP_NAMESPACE::Result>( getDispatcher()->vkGetMemoryRemoteAddressNV(
           static_cast<VkDevice>( m_device ),
-          reinterpret_cast<const VkMemoryGetRemoteAddressInfoNV *>( &getMemoryRemoteAddressInfo ),
+          reinterpret_cast<const VkMemoryGetRemoteAddressInfoNV *>( &memoryGetRemoteAddressInfo ),
           reinterpret_cast<VkRemoteAddressNV *>( &address ) ) );
       if ( result != VULKAN_HPP_NAMESPACE::Result::eSuccess )
       {
diff --git a/third_party/vulkan-deps/vulkan-headers/src/include/vulkan/vulkan_structs.hpp b/third_party/vulkan-deps/vulkan-headers/src/include/vulkan/vulkan_structs.hpp
index 5bf398c..bb0332a 100644
--- a/third_party/vulkan-deps/vulkan-headers/src/include/vulkan/vulkan_structs.hpp
+++ b/third_party/vulkan-deps/vulkan-headers/src/include/vulkan/vulkan_structs.hpp
@@ -10,6 +10,10 @@
 
 namespace VULKAN_HPP_NAMESPACE
 {
+  //===============
+  //=== STRUCTS ===
+  //===============
+
   struct AabbPositionsKHR
   {
 #if !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )
@@ -42,6 +46,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     AabbPositionsKHR & setMinX( float minX_ ) VULKAN_HPP_NOEXCEPT
     {
       minX = minX_;
@@ -77,6 +82,7 @@
       maxZ = maxZ_;
       return *this;
     }
+#endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkAabbPositionsKHR const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -118,6 +124,7 @@
 
   union DeviceOrHostAddressConstKHR
   {
+#if !defined( VULKAN_HPP_NO_UNION_CONSTRUCTORS )
     DeviceOrHostAddressConstKHR( VULKAN_HPP_NAMESPACE::DeviceOrHostAddressConstKHR const & rhs ) VULKAN_HPP_NOEXCEPT
     {
       memcpy( static_cast<void *>( this ), &rhs, sizeof( VULKAN_HPP_NAMESPACE::DeviceOrHostAddressConstKHR ) );
@@ -128,7 +135,9 @@
     {}
 
     DeviceOrHostAddressConstKHR( const void * hostAddress_ ) : hostAddress( hostAddress_ ) {}
+#endif /*VULKAN_HPP_NO_UNION_CONSTRUCTORS*/
 
+#if !defined( VULKAN_HPP_NO_UNION_SETTERS )
     DeviceOrHostAddressConstKHR &
       setDeviceAddress( VULKAN_HPP_NAMESPACE::DeviceAddress deviceAddress_ ) VULKAN_HPP_NOEXCEPT
     {
@@ -141,6 +150,7 @@
       hostAddress = hostAddress_;
       return *this;
     }
+#endif /*VULKAN_HPP_NO_UNION_SETTERS*/
 
     VULKAN_HPP_NAMESPACE::DeviceOrHostAddressConstKHR &
       operator=( VULKAN_HPP_NAMESPACE::DeviceOrHostAddressConstKHR const & rhs ) VULKAN_HPP_NOEXCEPT
@@ -212,6 +222,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     AccelerationStructureGeometryTrianglesDataKHR & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -265,6 +276,7 @@
       transformData = transformData_;
       return *this;
     }
+#endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkAccelerationStructureGeometryTrianglesDataKHR const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -332,6 +344,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     AccelerationStructureGeometryAabbsDataKHR & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -351,6 +364,7 @@
       stride = stride_;
       return *this;
     }
+#endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkAccelerationStructureGeometryAabbsDataKHR const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -414,6 +428,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     AccelerationStructureGeometryInstancesDataKHR & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -433,6 +448,7 @@
       data = data_;
       return *this;
     }
+#endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkAccelerationStructureGeometryInstancesDataKHR const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -464,6 +480,7 @@
 
   union AccelerationStructureGeometryDataKHR
   {
+#if !defined( VULKAN_HPP_NO_UNION_CONSTRUCTORS )
     AccelerationStructureGeometryDataKHR( VULKAN_HPP_NAMESPACE::AccelerationStructureGeometryDataKHR const & rhs )
       VULKAN_HPP_NOEXCEPT
     {
@@ -483,7 +500,9 @@
       VULKAN_HPP_NAMESPACE::AccelerationStructureGeometryInstancesDataKHR instances_ )
       : instances( instances_ )
     {}
+#endif /*VULKAN_HPP_NO_UNION_CONSTRUCTORS*/
 
+#if !defined( VULKAN_HPP_NO_UNION_SETTERS )
     AccelerationStructureGeometryDataKHR & setTriangles(
       VULKAN_HPP_NAMESPACE::AccelerationStructureGeometryTrianglesDataKHR const & triangles_ ) VULKAN_HPP_NOEXCEPT
     {
@@ -504,6 +523,7 @@
       instances = instances_;
       return *this;
     }
+#endif /*VULKAN_HPP_NO_UNION_SETTERS*/
 
     VULKAN_HPP_NAMESPACE::AccelerationStructureGeometryDataKHR &
       operator=( VULKAN_HPP_NAMESPACE::AccelerationStructureGeometryDataKHR const & rhs ) VULKAN_HPP_NOEXCEPT
@@ -564,6 +584,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     AccelerationStructureGeometryKHR & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -589,6 +610,7 @@
       flags = flags_;
       return *this;
     }
+#endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkAccelerationStructureGeometryKHR const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -620,6 +642,7 @@
 
   union DeviceOrHostAddressKHR
   {
+#if !defined( VULKAN_HPP_NO_UNION_CONSTRUCTORS )
     DeviceOrHostAddressKHR( VULKAN_HPP_NAMESPACE::DeviceOrHostAddressKHR const & rhs ) VULKAN_HPP_NOEXCEPT
     {
       memcpy( static_cast<void *>( this ), &rhs, sizeof( VULKAN_HPP_NAMESPACE::DeviceOrHostAddressKHR ) );
@@ -629,7 +652,9 @@
     {}
 
     DeviceOrHostAddressKHR( void * hostAddress_ ) : hostAddress( hostAddress_ ) {}
+#endif /*VULKAN_HPP_NO_UNION_CONSTRUCTORS*/
 
+#if !defined( VULKAN_HPP_NO_UNION_SETTERS )
     DeviceOrHostAddressKHR & setDeviceAddress( VULKAN_HPP_NAMESPACE::DeviceAddress deviceAddress_ ) VULKAN_HPP_NOEXCEPT
     {
       deviceAddress = deviceAddress_;
@@ -641,6 +666,7 @@
       hostAddress = hostAddress_;
       return *this;
     }
+#endif /*VULKAN_HPP_NO_UNION_SETTERS*/
 
     VULKAN_HPP_NAMESPACE::DeviceOrHostAddressKHR &
       operator=( VULKAN_HPP_NAMESPACE::DeviceOrHostAddressKHR const & rhs ) VULKAN_HPP_NOEXCEPT
@@ -753,6 +779,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     AccelerationStructureBuildGeometryInfoKHR & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -807,7 +834,7 @@
       return *this;
     }
 
-#if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )
+#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )
     AccelerationStructureBuildGeometryInfoKHR & setGeometries(
       VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<
         const VULKAN_HPP_NAMESPACE::AccelerationStructureGeometryKHR> const & geometries_ ) VULKAN_HPP_NOEXCEPT
@@ -816,7 +843,7 @@
       pGeometries   = geometries_.data();
       return *this;
     }
-#endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/
+#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/
 
     AccelerationStructureBuildGeometryInfoKHR & setPpGeometries(
       const VULKAN_HPP_NAMESPACE::AccelerationStructureGeometryKHR * const * ppGeometries_ ) VULKAN_HPP_NOEXCEPT
@@ -825,7 +852,7 @@
       return *this;
     }
 
-#if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )
+#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )
     AccelerationStructureBuildGeometryInfoKHR & setPGeometries(
       VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<
         const VULKAN_HPP_NAMESPACE::AccelerationStructureGeometryKHR * const> const & pGeometries_ ) VULKAN_HPP_NOEXCEPT
@@ -834,7 +861,7 @@
       ppGeometries  = pGeometries_.data();
       return *this;
     }
-#endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/
+#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/
 
     AccelerationStructureBuildGeometryInfoKHR &
       setScratchData( VULKAN_HPP_NAMESPACE::DeviceOrHostAddressKHR const & scratchData_ ) VULKAN_HPP_NOEXCEPT
@@ -842,6 +869,7 @@
       scratchData = scratchData_;
       return *this;
     }
+#endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkAccelerationStructureBuildGeometryInfoKHR const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -912,6 +940,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     AccelerationStructureBuildRangeInfoKHR & setPrimitiveCount( uint32_t primitiveCount_ ) VULKAN_HPP_NOEXCEPT
     {
       primitiveCount = primitiveCount_;
@@ -935,6 +964,7 @@
       transformOffset = transformOffset_;
       return *this;
     }
+#endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkAccelerationStructureBuildRangeInfoKHR const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -1007,6 +1037,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     AccelerationStructureBuildSizesInfoKHR & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -1033,6 +1064,7 @@
       buildScratchSize = buildScratchSize_;
       return *this;
     }
+#endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkAccelerationStructureBuildSizesInfoKHR const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -1119,6 +1151,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     AccelerationStructureCreateInfoKHR & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -1163,6 +1196,7 @@
       deviceAddress = deviceAddress_;
       return *this;
     }
+#endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkAccelerationStructureCreateInfoKHR const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -1259,6 +1293,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     GeometryTrianglesNV & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -1330,6 +1365,7 @@
       transformOffset = transformOffset_;
       return *this;
     }
+#endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkGeometryTrianglesNV const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -1416,6 +1452,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     GeometryAABBNV & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -1445,6 +1482,7 @@
       offset = offset_;
       return *this;
     }
+#endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkGeometryAABBNV const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -1512,6 +1550,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     GeometryDataNV & setTriangles( VULKAN_HPP_NAMESPACE::GeometryTrianglesNV const & triangles_ ) VULKAN_HPP_NOEXCEPT
     {
       triangles = triangles_;
@@ -1523,6 +1562,7 @@
       aabbs = aabbs_;
       return *this;
     }
+#endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkGeometryDataNV const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -1585,6 +1625,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     GeometryNV & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -1608,6 +1649,7 @@
       flags = flags_;
       return *this;
     }
+#endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkGeometryNV const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -1700,6 +1742,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     AccelerationStructureInfoNV & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -1738,7 +1781,7 @@
       return *this;
     }
 
-#if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )
+#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )
     AccelerationStructureInfoNV & setGeometries(
       VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::GeometryNV> const & geometries_ )
       VULKAN_HPP_NOEXCEPT
@@ -1747,7 +1790,8 @@
       pGeometries   = geometries_.data();
       return *this;
     }
-#endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/
+#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/
+#endif   /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkAccelerationStructureInfoNV const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -1826,6 +1870,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     AccelerationStructureCreateInfoNV & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -1845,6 +1890,7 @@
       info = info_;
       return *this;
     }
+#endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkAccelerationStructureCreateInfoNV const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -1920,6 +1966,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     AccelerationStructureDeviceAddressInfoKHR & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -1932,6 +1979,7 @@
       accelerationStructure = accelerationStructure_;
       return *this;
     }
+#endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkAccelerationStructureDeviceAddressInfoKHR const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -2007,6 +2055,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     AccelerationStructureGeometryMotionTrianglesDataNV & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -2019,6 +2068,7 @@
       vertexData = vertexData_;
       return *this;
     }
+#endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkAccelerationStructureGeometryMotionTrianglesDataNV const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -2071,11 +2121,13 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     TransformMatrixKHR & setMatrix( std::array<std::array<float, 4>, 3> matrix_ ) VULKAN_HPP_NOEXCEPT
     {
       matrix = matrix_;
       return *this;
     }
+#endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkTransformMatrixKHR const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -2144,6 +2196,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     AccelerationStructureInstanceKHR &
       setTransform( VULKAN_HPP_NAMESPACE::TransformMatrixKHR const & transform_ ) VULKAN_HPP_NOEXCEPT
     {
@@ -2183,6 +2236,7 @@
       accelerationStructureReference = accelerationStructureReference_;
       return *this;
     }
+#endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkAccelerationStructureInstanceKHR const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -2265,6 +2319,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     AccelerationStructureMatrixMotionInstanceNV &
       setTransformT0( VULKAN_HPP_NAMESPACE::TransformMatrixKHR const & transformT0_ ) VULKAN_HPP_NOEXCEPT
     {
@@ -2312,6 +2367,7 @@
       accelerationStructureReference = accelerationStructureReference_;
       return *this;
     }
+#endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkAccelerationStructureMatrixMotionInstanceNV const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -2390,6 +2446,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     AccelerationStructureMemoryRequirementsInfoNV & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -2409,6 +2466,7 @@
       accelerationStructure = accelerationStructure_;
       return *this;
     }
+#endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkAccelerationStructureMemoryRequirementsInfoNV const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -2485,6 +2543,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     AccelerationStructureMotionInfoNV & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -2503,6 +2562,7 @@
       flags = flags_;
       return *this;
     }
+#endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkAccelerationStructureMotionInfoNV const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -2597,6 +2657,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     SRTDataNV & setSx( float sx_ ) VULKAN_HPP_NOEXCEPT
     {
       sx = sx_;
@@ -2692,6 +2753,7 @@
       tz = tz_;
       return *this;
     }
+#endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkSRTDataNV const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -2781,6 +2843,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     AccelerationStructureSRTMotionInstanceNV &
       setTransformT0( VULKAN_HPP_NAMESPACE::SRTDataNV const & transformT0_ ) VULKAN_HPP_NOEXCEPT
     {
@@ -2828,6 +2891,7 @@
       accelerationStructureReference = accelerationStructureReference_;
       return *this;
     }
+#endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkAccelerationStructureSRTMotionInstanceNV const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -2873,6 +2937,7 @@
 
   union AccelerationStructureMotionInstanceDataNV
   {
+#if !defined( VULKAN_HPP_NO_UNION_CONSTRUCTORS )
     AccelerationStructureMotionInstanceDataNV(
       VULKAN_HPP_NAMESPACE::AccelerationStructureMotionInstanceDataNV const & rhs ) VULKAN_HPP_NOEXCEPT
     {
@@ -2894,7 +2959,9 @@
       VULKAN_HPP_NAMESPACE::AccelerationStructureSRTMotionInstanceNV srtMotionInstance_ )
       : srtMotionInstance( srtMotionInstance_ )
     {}
+#endif /*VULKAN_HPP_NO_UNION_CONSTRUCTORS*/
 
+#if !defined( VULKAN_HPP_NO_UNION_SETTERS )
     AccelerationStructureMotionInstanceDataNV & setStaticInstance(
       VULKAN_HPP_NAMESPACE::AccelerationStructureInstanceKHR const & staticInstance_ ) VULKAN_HPP_NOEXCEPT
     {
@@ -2916,6 +2983,7 @@
       srtMotionInstance = srtMotionInstance_;
       return *this;
     }
+#endif /*VULKAN_HPP_NO_UNION_SETTERS*/
 
     VULKAN_HPP_NAMESPACE::AccelerationStructureMotionInstanceDataNV &
       operator=( VULKAN_HPP_NAMESPACE::AccelerationStructureMotionInstanceDataNV const & rhs ) VULKAN_HPP_NOEXCEPT
@@ -2978,6 +3046,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     AccelerationStructureMotionInstanceNV &
       setType( VULKAN_HPP_NAMESPACE::AccelerationStructureMotionInstanceTypeNV type_ ) VULKAN_HPP_NOEXCEPT
     {
@@ -2998,6 +3067,7 @@
       data = data_;
       return *this;
     }
+#endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkAccelerationStructureMotionInstanceNV const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -3049,6 +3119,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     AccelerationStructureVersionInfoKHR & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -3060,6 +3131,7 @@
       pVersionData = pVersionData_;
       return *this;
     }
+#endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkAccelerationStructureVersionInfoKHR const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -3135,6 +3207,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     AcquireNextImageInfoKHR & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -3170,6 +3243,7 @@
       deviceMask = deviceMask_;
       return *this;
     }
+#endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkAcquireNextImageInfoKHR const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -3245,6 +3319,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     AcquireProfilingLockInfoKHR & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -3263,6 +3338,7 @@
       timeout = timeout_;
       return *this;
     }
+#endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkAcquireProfilingLockInfoKHR const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -3338,6 +3414,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     AllocationCallbacks & setPUserData( void * pUserData_ ) VULKAN_HPP_NOEXCEPT
     {
       pUserData = pUserData_;
@@ -3374,6 +3451,7 @@
       pfnInternalFree = pfnInternalFree_;
       return *this;
     }
+#endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkAllocationCallbacks const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -3443,6 +3521,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     ComponentMapping & setR( VULKAN_HPP_NAMESPACE::ComponentSwizzle r_ ) VULKAN_HPP_NOEXCEPT
     {
       r = r_;
@@ -3466,6 +3545,7 @@
       a = a_;
       return *this;
     }
+#endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkComponentMapping const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -3783,6 +3863,7 @@
       return *this;
     }
 
+#  if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     AndroidSurfaceCreateInfoKHR & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -3801,6 +3882,7 @@
       window = window_;
       return *this;
     }
+#  endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkAndroidSurfaceCreateInfoKHR const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -3877,6 +3959,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     ApplicationInfo & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -3912,6 +3995,7 @@
       apiVersion = apiVersion_;
       return *this;
     }
+#endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkApplicationInfo const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -3998,6 +4082,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     AttachmentDescription & setFlags( VULKAN_HPP_NAMESPACE::AttachmentDescriptionFlags flags_ ) VULKAN_HPP_NOEXCEPT
     {
       flags = flags_;
@@ -4053,6 +4138,7 @@
       finalLayout = finalLayout_;
       return *this;
     }
+#endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkAttachmentDescription const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -4140,6 +4226,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     AttachmentDescription2 & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -4201,6 +4288,7 @@
       finalLayout = finalLayout_;
       return *this;
     }
+#endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkAttachmentDescription2 const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -4286,6 +4374,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     AttachmentDescriptionStencilLayout & setPNext( void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -4305,6 +4394,7 @@
       stencilFinalLayout = stencilFinalLayout_;
       return *this;
     }
+#endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkAttachmentDescriptionStencilLayout const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -4375,6 +4465,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     AttachmentReference & setAttachment( uint32_t attachment_ ) VULKAN_HPP_NOEXCEPT
     {
       attachment = attachment_;
@@ -4386,6 +4477,7 @@
       layout = layout_;
       return *this;
     }
+#endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkAttachmentReference const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -4450,6 +4542,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     AttachmentReference2 & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -4473,6 +4566,7 @@
       aspectMask = aspectMask_;
       return *this;
     }
+#endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkAttachmentReference2 const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -4546,6 +4640,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     AttachmentReferenceStencilLayout & setPNext( void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -4558,6 +4653,7 @@
       stencilLayout = stencilLayout_;
       return *this;
     }
+#endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkAttachmentReferenceStencilLayout const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -4621,6 +4717,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     Extent2D & setWidth( uint32_t width_ ) VULKAN_HPP_NOEXCEPT
     {
       width = width_;
@@ -4632,6 +4729,7 @@
       height = height_;
       return *this;
     }
+#endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkExtent2D const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -4688,6 +4786,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     SampleLocationEXT & setX( float x_ ) VULKAN_HPP_NOEXCEPT
     {
       x = x_;
@@ -4699,6 +4798,7 @@
       y = y_;
       return *this;
     }
+#endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkSampleLocationEXT const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -4779,6 +4879,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     SampleLocationsInfoEXT & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -4812,7 +4913,7 @@
       return *this;
     }
 
-#if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )
+#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )
     SampleLocationsInfoEXT & setSampleLocations(
       VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::SampleLocationEXT> const &
         sampleLocations_ ) VULKAN_HPP_NOEXCEPT
@@ -4821,7 +4922,8 @@
       pSampleLocations     = sampleLocations_.data();
       return *this;
     }
-#endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/
+#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/
+#endif   /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkSampleLocationsInfoEXT const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -4895,6 +4997,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     AttachmentSampleLocationsEXT & setAttachmentIndex( uint32_t attachmentIndex_ ) VULKAN_HPP_NOEXCEPT
     {
       attachmentIndex = attachmentIndex_;
@@ -4907,6 +5010,7 @@
       sampleLocationsInfo = sampleLocationsInfo_;
       return *this;
     }
+#endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkAttachmentSampleLocationsEXT const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -4963,11 +5067,13 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     BaseInStructure & setPNext( const struct VULKAN_HPP_NAMESPACE::BaseInStructure * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
       return *this;
     }
+#endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkBaseInStructure const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -5022,11 +5128,13 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     BaseOutStructure & setPNext( struct VULKAN_HPP_NAMESPACE::BaseOutStructure * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
       return *this;
     }
+#endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkBaseOutStructure const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -5113,6 +5221,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     BindAccelerationStructureMemoryInfoNV & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -5151,7 +5260,7 @@
       return *this;
     }
 
-#if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )
+#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )
     BindAccelerationStructureMemoryInfoNV & setDeviceIndices(
       VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const uint32_t> const & deviceIndices_ ) VULKAN_HPP_NOEXCEPT
     {
@@ -5159,7 +5268,8 @@
       pDeviceIndices   = deviceIndices_.data();
       return *this;
     }
-#endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/
+#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/
+#endif   /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkBindAccelerationStructureMemoryInfoNV const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -5244,6 +5354,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     BindBufferMemoryDeviceGroupInfo & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -5262,7 +5373,7 @@
       return *this;
     }
 
-#if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )
+#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )
     BindBufferMemoryDeviceGroupInfo & setDeviceIndices(
       VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const uint32_t> const & deviceIndices_ ) VULKAN_HPP_NOEXCEPT
     {
@@ -5270,7 +5381,8 @@
       pDeviceIndices   = deviceIndices_.data();
       return *this;
     }
-#endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/
+#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/
+#endif   /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkBindBufferMemoryDeviceGroupInfo const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -5345,6 +5457,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     BindBufferMemoryInfo & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -5368,6 +5481,7 @@
       memoryOffset = memoryOffset_;
       return *this;
     }
+#endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkBindBufferMemoryInfo const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -5433,6 +5547,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     Offset2D & setX( int32_t x_ ) VULKAN_HPP_NOEXCEPT
     {
       x = x_;
@@ -5444,6 +5559,7 @@
       y = y_;
       return *this;
     }
+#endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkOffset2D const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -5498,6 +5614,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     Rect2D & setOffset( VULKAN_HPP_NAMESPACE::Offset2D const & offset_ ) VULKAN_HPP_NOEXCEPT
     {
       offset = offset_;
@@ -5509,6 +5626,7 @@
       extent = extent_;
       return *this;
     }
+#endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkRect2D const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -5587,6 +5705,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     BindImageMemoryDeviceGroupInfo & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -5605,7 +5724,7 @@
       return *this;
     }
 
-#if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )
+#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )
     BindImageMemoryDeviceGroupInfo & setDeviceIndices(
       VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const uint32_t> const & deviceIndices_ ) VULKAN_HPP_NOEXCEPT
     {
@@ -5613,7 +5732,7 @@
       pDeviceIndices   = deviceIndices_.data();
       return *this;
     }
-#endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/
+#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/
 
     BindImageMemoryDeviceGroupInfo &
       setSplitInstanceBindRegionCount( uint32_t splitInstanceBindRegionCount_ ) VULKAN_HPP_NOEXCEPT
@@ -5629,7 +5748,7 @@
       return *this;
     }
 
-#if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )
+#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )
     BindImageMemoryDeviceGroupInfo & setSplitInstanceBindRegions(
       VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::Rect2D> const &
         splitInstanceBindRegions_ ) VULKAN_HPP_NOEXCEPT
@@ -5638,7 +5757,8 @@
       pSplitInstanceBindRegions    = splitInstanceBindRegions_.data();
       return *this;
     }
-#endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/
+#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/
+#endif   /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkBindImageMemoryDeviceGroupInfo const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -5717,6 +5837,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     BindImageMemoryInfo & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -5740,6 +5861,7 @@
       memoryOffset = memoryOffset_;
       return *this;
     }
+#endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkBindImageMemoryInfo const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -5813,6 +5935,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     BindImageMemorySwapchainInfoKHR & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -5830,6 +5953,7 @@
       imageIndex = imageIndex_;
       return *this;
     }
+#endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkBindImageMemorySwapchainInfoKHR const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -5901,6 +6025,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     BindImagePlaneMemoryInfo & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -5913,6 +6038,7 @@
       planeAspect = planeAspect_;
       return *this;
     }
+#endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkBindImagePlaneMemoryInfo const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -5983,6 +6109,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     BindIndexBufferIndirectCommandNV &
       setBufferAddress( VULKAN_HPP_NAMESPACE::DeviceAddress bufferAddress_ ) VULKAN_HPP_NOEXCEPT
     {
@@ -6001,6 +6128,7 @@
       indexType = indexType_;
       return *this;
     }
+#endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkBindIndexBufferIndirectCommandNV const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -6060,11 +6188,13 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     BindShaderGroupIndirectCommandNV & setGroupIndex( uint32_t groupIndex_ ) VULKAN_HPP_NOEXCEPT
     {
       groupIndex = groupIndex_;
       return *this;
     }
+#endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkBindShaderGroupIndirectCommandNV const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -6128,6 +6258,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     SparseMemoryBind & setResourceOffset( VULKAN_HPP_NAMESPACE::DeviceSize resourceOffset_ ) VULKAN_HPP_NOEXCEPT
     {
       resourceOffset = resourceOffset_;
@@ -6157,6 +6288,7 @@
       flags = flags_;
       return *this;
     }
+#endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkSparseMemoryBind const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -6231,6 +6363,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     SparseBufferMemoryBindInfo & setBuffer( VULKAN_HPP_NAMESPACE::Buffer buffer_ ) VULKAN_HPP_NOEXCEPT
     {
       buffer = buffer_;
@@ -6249,7 +6382,7 @@
       return *this;
     }
 
-#if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )
+#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )
     SparseBufferMemoryBindInfo & setBinds(
       VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::SparseMemoryBind> const & binds_ )
       VULKAN_HPP_NOEXCEPT
@@ -6258,7 +6391,8 @@
       pBinds    = binds_.data();
       return *this;
     }
-#endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/
+#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/
+#endif   /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkSparseBufferMemoryBindInfo const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -6331,6 +6465,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     SparseImageOpaqueMemoryBindInfo & setImage( VULKAN_HPP_NAMESPACE::Image image_ ) VULKAN_HPP_NOEXCEPT
     {
       image = image_;
@@ -6350,7 +6485,7 @@
       return *this;
     }
 
-#if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )
+#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )
     SparseImageOpaqueMemoryBindInfo & setBinds(
       VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::SparseMemoryBind> const & binds_ )
       VULKAN_HPP_NOEXCEPT
@@ -6359,7 +6494,8 @@
       pBinds    = binds_.data();
       return *this;
     }
-#endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/
+#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/
+#endif   /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkSparseImageOpaqueMemoryBindInfo const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -6421,6 +6557,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     ImageSubresource & setAspectMask( VULKAN_HPP_NAMESPACE::ImageAspectFlags aspectMask_ ) VULKAN_HPP_NOEXCEPT
     {
       aspectMask = aspectMask_;
@@ -6438,6 +6575,7 @@
       arrayLayer = arrayLayer_;
       return *this;
     }
+#endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkImageSubresource const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -6496,6 +6634,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     Offset3D & setX( int32_t x_ ) VULKAN_HPP_NOEXCEPT
     {
       x = x_;
@@ -6513,6 +6652,7 @@
       z = z_;
       return *this;
     }
+#endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkOffset3D const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -6573,6 +6713,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     Extent3D & setWidth( uint32_t width_ ) VULKAN_HPP_NOEXCEPT
     {
       width = width_;
@@ -6590,6 +6731,7 @@
       depth = depth_;
       return *this;
     }
+#endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkExtent3D const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -6657,6 +6799,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     SparseImageMemoryBind &
       setSubresource( VULKAN_HPP_NAMESPACE::ImageSubresource const & subresource_ ) VULKAN_HPP_NOEXCEPT
     {
@@ -6693,6 +6836,7 @@
       flags = flags_;
       return *this;
     }
+#endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkSparseImageMemoryBind const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -6768,6 +6912,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     SparseImageMemoryBindInfo & setImage( VULKAN_HPP_NAMESPACE::Image image_ ) VULKAN_HPP_NOEXCEPT
     {
       image = image_;
@@ -6787,7 +6932,7 @@
       return *this;
     }
 
-#if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )
+#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )
     SparseImageMemoryBindInfo & setBinds(
       VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::SparseImageMemoryBind> const & binds_ )
       VULKAN_HPP_NOEXCEPT
@@ -6796,7 +6941,8 @@
       pBinds    = binds_.data();
       return *this;
     }
-#endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/
+#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/
+#endif   /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkSparseImageMemoryBindInfo const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -6900,6 +7046,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     BindSparseInfo & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -6918,7 +7065,7 @@
       return *this;
     }
 
-#if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )
+#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )
     BindSparseInfo & setWaitSemaphores(
       VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::Semaphore> const & waitSemaphores_ )
       VULKAN_HPP_NOEXCEPT
@@ -6927,7 +7074,7 @@
       pWaitSemaphores    = waitSemaphores_.data();
       return *this;
     }
-#endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/
+#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/
 
     BindSparseInfo & setBufferBindCount( uint32_t bufferBindCount_ ) VULKAN_HPP_NOEXCEPT
     {
@@ -6942,7 +7089,7 @@
       return *this;
     }
 
-#if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )
+#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )
     BindSparseInfo & setBufferBinds(
       VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::SparseBufferMemoryBindInfo> const &
         bufferBinds_ ) VULKAN_HPP_NOEXCEPT
@@ -6951,7 +7098,7 @@
       pBufferBinds    = bufferBinds_.data();
       return *this;
     }
-#endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/
+#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/
 
     BindSparseInfo & setImageOpaqueBindCount( uint32_t imageOpaqueBindCount_ ) VULKAN_HPP_NOEXCEPT
     {
@@ -6966,7 +7113,7 @@
       return *this;
     }
 
-#if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )
+#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )
     BindSparseInfo & setImageOpaqueBinds(
       VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::SparseImageOpaqueMemoryBindInfo> const &
         imageOpaqueBinds_ ) VULKAN_HPP_NOEXCEPT
@@ -6975,7 +7122,7 @@
       pImageOpaqueBinds    = imageOpaqueBinds_.data();
       return *this;
     }
-#endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/
+#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/
 
     BindSparseInfo & setImageBindCount( uint32_t imageBindCount_ ) VULKAN_HPP_NOEXCEPT
     {
@@ -6990,7 +7137,7 @@
       return *this;
     }
 
-#if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )
+#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )
     BindSparseInfo & setImageBinds(
       VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::SparseImageMemoryBindInfo> const &
         imageBinds_ ) VULKAN_HPP_NOEXCEPT
@@ -6999,7 +7146,7 @@
       pImageBinds    = imageBinds_.data();
       return *this;
     }
-#endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/
+#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/
 
     BindSparseInfo & setSignalSemaphoreCount( uint32_t signalSemaphoreCount_ ) VULKAN_HPP_NOEXCEPT
     {
@@ -7014,7 +7161,7 @@
       return *this;
     }
 
-#if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )
+#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )
     BindSparseInfo & setSignalSemaphores(
       VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::Semaphore> const & signalSemaphores_ )
       VULKAN_HPP_NOEXCEPT
@@ -7023,7 +7170,8 @@
       pSignalSemaphores    = signalSemaphores_.data();
       return *this;
     }
-#endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/
+#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/
+#endif   /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkBindSparseInfo const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -7105,6 +7253,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     BindVertexBufferIndirectCommandNV &
       setBufferAddress( VULKAN_HPP_NAMESPACE::DeviceAddress bufferAddress_ ) VULKAN_HPP_NOEXCEPT
     {
@@ -7123,6 +7272,7 @@
       stride = stride_;
       return *this;
     }
+#endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkBindVertexBufferIndirectCommandNV const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -7187,6 +7337,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     ImageSubresourceLayers & setAspectMask( VULKAN_HPP_NAMESPACE::ImageAspectFlags aspectMask_ ) VULKAN_HPP_NOEXCEPT
     {
       aspectMask = aspectMask_;
@@ -7210,6 +7361,7 @@
       layerCount = layerCount_;
       return *this;
     }
+#endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkImageSubresourceLayers const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -7278,6 +7430,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     ImageBlit2KHR & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -7311,6 +7464,7 @@
       dstOffsets = dstOffsets_;
       return *this;
     }
+#endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkImageBlit2KHR const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -7412,6 +7566,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     BlitImageInfo2KHR & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -7454,7 +7609,7 @@
       return *this;
     }
 
-#if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )
+#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )
     BlitImageInfo2KHR & setRegions(
       VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::ImageBlit2KHR> const & regions_ )
       VULKAN_HPP_NOEXCEPT
@@ -7463,13 +7618,14 @@
       pRegions    = regions_.data();
       return *this;
     }
-#endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/
+#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/
 
     BlitImageInfo2KHR & setFilter( VULKAN_HPP_NAMESPACE::Filter filter_ ) VULKAN_HPP_NOEXCEPT
     {
       filter = filter_;
       return *this;
     }
+#endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkBlitImageInfo2KHR const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -7545,6 +7701,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     BufferCopy & setSrcOffset( VULKAN_HPP_NAMESPACE::DeviceSize srcOffset_ ) VULKAN_HPP_NOEXCEPT
     {
       srcOffset = srcOffset_;
@@ -7562,6 +7719,7 @@
       size = size_;
       return *this;
     }
+#endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkBufferCopy const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -7624,6 +7782,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     BufferCopy2KHR & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -7647,6 +7806,7 @@
       size = size_;
       return *this;
     }
+#endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkBufferCopy2KHR const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -7740,6 +7900,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     BufferCreateInfo & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -7782,7 +7943,7 @@
       return *this;
     }
 
-#if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )
+#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )
     BufferCreateInfo & setQueueFamilyIndices(
       VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const uint32_t> const & queueFamilyIndices_ ) VULKAN_HPP_NOEXCEPT
     {
@@ -7790,7 +7951,8 @@
       pQueueFamilyIndices   = queueFamilyIndices_.data();
       return *this;
     }
-#endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/
+#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/
+#endif   /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkBufferCreateInfo const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -7867,6 +8029,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     BufferDeviceAddressCreateInfoEXT & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -7879,6 +8042,7 @@
       deviceAddress = deviceAddress_;
       return *this;
     }
+#endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkBufferDeviceAddressCreateInfoEXT const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -7946,6 +8110,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     BufferDeviceAddressInfo & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -7957,6 +8122,7 @@
       buffer = buffer_;
       return *this;
     }
+#endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkBufferDeviceAddressInfo const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -8031,6 +8197,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     BufferImageCopy & setBufferOffset( VULKAN_HPP_NAMESPACE::DeviceSize bufferOffset_ ) VULKAN_HPP_NOEXCEPT
     {
       bufferOffset = bufferOffset_;
@@ -8067,6 +8234,7 @@
       imageExtent = imageExtent_;
       return *this;
     }
+#endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkBufferImageCopy const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -8141,6 +8309,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     BufferImageCopy2KHR & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -8183,6 +8352,7 @@
       imageExtent = imageExtent_;
       return *this;
     }
+#endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkBufferImageCopy2KHR const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -8269,6 +8439,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     BufferMemoryBarrier & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -8316,6 +8487,7 @@
       size = size_;
       return *this;
     }
+#endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkBufferMemoryBarrier const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -8407,6 +8579,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     BufferMemoryBarrier2KHR & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -8470,6 +8643,7 @@
       size = size_;
       return *this;
     }
+#endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkBufferMemoryBarrier2KHR const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -8549,6 +8723,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     BufferMemoryRequirementsInfo2 & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -8560,6 +8735,7 @@
       buffer = buffer_;
       return *this;
     }
+#endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkBufferMemoryRequirementsInfo2 const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -8631,6 +8807,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     BufferOpaqueCaptureAddressCreateInfo & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -8642,6 +8819,7 @@
       opaqueCaptureAddress = opaqueCaptureAddress_;
       return *this;
     }
+#endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkBufferOpaqueCaptureAddressCreateInfo const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -8719,6 +8897,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     BufferViewCreateInfo & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -8754,6 +8933,7 @@
       range = range_;
       return *this;
     }
+#endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkBufferViewCreateInfo const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -8828,6 +9008,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     CalibratedTimestampInfoEXT & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -8839,6 +9020,7 @@
       timeDomain = timeDomain_;
       return *this;
     }
+#endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkCalibratedTimestampInfoEXT const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -9020,6 +9202,7 @@
 
   union ClearColorValue
   {
+#if !defined( VULKAN_HPP_NO_UNION_CONSTRUCTORS )
     ClearColorValue( VULKAN_HPP_NAMESPACE::ClearColorValue const & rhs ) VULKAN_HPP_NOEXCEPT
     {
       memcpy( static_cast<void *>( this ), &rhs, sizeof( VULKAN_HPP_NAMESPACE::ClearColorValue ) );
@@ -9030,7 +9213,9 @@
     ClearColorValue( const std::array<int32_t, 4> & int32_ ) : int32( int32_ ) {}
 
     ClearColorValue( const std::array<uint32_t, 4> & uint32_ ) : uint32( uint32_ ) {}
+#endif /*VULKAN_HPP_NO_UNION_CONSTRUCTORS*/
 
+#if !defined( VULKAN_HPP_NO_UNION_SETTERS )
     ClearColorValue & setFloat32( std::array<float, 4> float32_ ) VULKAN_HPP_NOEXCEPT
     {
       float32 = float32_;
@@ -9048,6 +9233,7 @@
       uint32 = uint32_;
       return *this;
     }
+#endif /*VULKAN_HPP_NO_UNION_SETTERS*/
 
     VULKAN_HPP_NAMESPACE::ClearColorValue &
       operator=( VULKAN_HPP_NAMESPACE::ClearColorValue const & rhs ) VULKAN_HPP_NOEXCEPT
@@ -9095,6 +9281,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     ClearDepthStencilValue & setDepth( float depth_ ) VULKAN_HPP_NOEXCEPT
     {
       depth = depth_;
@@ -9106,6 +9293,7 @@
       stencil = stencil_;
       return *this;
     }
+#endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkClearDepthStencilValue const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -9141,6 +9329,7 @@
 
   union ClearValue
   {
+#if !defined( VULKAN_HPP_NO_UNION_CONSTRUCTORS )
     ClearValue( VULKAN_HPP_NAMESPACE::ClearValue const & rhs ) VULKAN_HPP_NOEXCEPT
     {
       memcpy( static_cast<void *>( this ), &rhs, sizeof( VULKAN_HPP_NAMESPACE::ClearValue ) );
@@ -9149,7 +9338,9 @@
     ClearValue( VULKAN_HPP_NAMESPACE::ClearColorValue color_ = {} ) : color( color_ ) {}
 
     ClearValue( VULKAN_HPP_NAMESPACE::ClearDepthStencilValue depthStencil_ ) : depthStencil( depthStencil_ ) {}
+#endif /*VULKAN_HPP_NO_UNION_CONSTRUCTORS*/
 
+#if !defined( VULKAN_HPP_NO_UNION_SETTERS )
     ClearValue & setColor( VULKAN_HPP_NAMESPACE::ClearColorValue const & color_ ) VULKAN_HPP_NOEXCEPT
     {
       color = color_;
@@ -9162,6 +9353,7 @@
       depthStencil = depthStencil_;
       return *this;
     }
+#endif /*VULKAN_HPP_NO_UNION_SETTERS*/
 
     VULKAN_HPP_NAMESPACE::ClearValue & operator=( VULKAN_HPP_NAMESPACE::ClearValue const & rhs ) VULKAN_HPP_NOEXCEPT
     {
@@ -9214,6 +9406,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     ClearAttachment & setAspectMask( VULKAN_HPP_NAMESPACE::ImageAspectFlags aspectMask_ ) VULKAN_HPP_NOEXCEPT
     {
       aspectMask = aspectMask_;
@@ -9231,6 +9424,7 @@
       clearValue = clearValue_;
       return *this;
     }
+#endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkClearAttachment const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -9275,6 +9469,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     ClearRect & setRect( VULKAN_HPP_NAMESPACE::Rect2D const & rect_ ) VULKAN_HPP_NOEXCEPT
     {
       rect = rect_;
@@ -9292,6 +9487,7 @@
       layerCount = layerCount_;
       return *this;
     }
+#endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkClearRect const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -9351,6 +9547,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     CoarseSampleLocationNV & setPixelX( uint32_t pixelX_ ) VULKAN_HPP_NOEXCEPT
     {
       pixelX = pixelX_;
@@ -9368,6 +9565,7 @@
       sample = sample_;
       return *this;
     }
+#endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkCoarseSampleLocationNV const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -9447,6 +9645,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     CoarseSampleOrderCustomNV &
       setShadingRate( VULKAN_HPP_NAMESPACE::ShadingRatePaletteEntryNV shadingRate_ ) VULKAN_HPP_NOEXCEPT
     {
@@ -9473,7 +9672,7 @@
       return *this;
     }
 
-#if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )
+#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )
     CoarseSampleOrderCustomNV & setSampleLocations(
       VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::CoarseSampleLocationNV> const &
         sampleLocations_ ) VULKAN_HPP_NOEXCEPT
@@ -9482,7 +9681,8 @@
       pSampleLocations    = sampleLocations_.data();
       return *this;
     }
-#endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/
+#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/
+#endif   /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkCoarseSampleOrderCustomNV const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -9553,6 +9753,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     CommandBufferAllocateInfo & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -9576,6 +9777,7 @@
       commandBufferCount = commandBufferCount_;
       return *this;
     }
+#endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkCommandBufferAllocateInfo const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -9658,6 +9860,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     CommandBufferInheritanceInfo & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -9702,6 +9905,7 @@
       pipelineStatistics = pipelineStatistics_;
       return *this;
     }
+#endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkCommandBufferInheritanceInfo const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -9780,6 +9984,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     CommandBufferBeginInfo & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -9798,6 +10003,7 @@
       pInheritanceInfo = pInheritanceInfo_;
       return *this;
     }
+#endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkCommandBufferBeginInfo const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -9873,6 +10079,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     CommandBufferInheritanceConditionalRenderingInfoEXT & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -9885,6 +10092,7 @@
       conditionalRenderingEnable = conditionalRenderingEnable_;
       return *this;
     }
+#endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkCommandBufferInheritanceConditionalRenderingInfoEXT const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -9964,6 +10172,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     CommandBufferInheritanceRenderPassTransformInfoQCOM & setPNext( void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -9983,6 +10192,7 @@
       renderArea = renderArea_;
       return *this;
     }
+#endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkCommandBufferInheritanceRenderPassTransformInfoQCOM const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -10058,6 +10268,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     Viewport & setX( float x_ ) VULKAN_HPP_NOEXCEPT
     {
       x = x_;
@@ -10093,6 +10304,7 @@
       maxDepth = maxDepth_;
       return *this;
     }
+#endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkViewport const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -10166,6 +10378,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     CommandBufferInheritanceViewportScissorInfoNV & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -10192,6 +10405,7 @@
       pViewportDepths = pViewportDepths_;
       return *this;
     }
+#endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkCommandBufferInheritanceViewportScissorInfoNV const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -10266,6 +10480,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     CommandBufferSubmitInfoKHR & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -10284,6 +10499,7 @@
       deviceMask = deviceMask_;
       return *this;
     }
+#endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkCommandBufferSubmitInfoKHR const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -10355,6 +10571,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     CommandPoolCreateInfo & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -10372,6 +10589,7 @@
       queueFamilyIndex = queueFamilyIndex_;
       return *this;
     }
+#endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkCommandPoolCreateInfo const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -10440,6 +10658,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     SpecializationMapEntry & setConstantID( uint32_t constantID_ ) VULKAN_HPP_NOEXCEPT
     {
       constantID = constantID_;
@@ -10457,6 +10676,7 @@
       size = size_;
       return *this;
     }
+#endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkSpecializationMapEntry const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -10532,6 +10752,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     SpecializationInfo & setMapEntryCount( uint32_t mapEntryCount_ ) VULKAN_HPP_NOEXCEPT
     {
       mapEntryCount = mapEntryCount_;
@@ -10545,7 +10766,7 @@
       return *this;
     }
 
-#if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )
+#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )
     SpecializationInfo & setMapEntries(
       VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::SpecializationMapEntry> const &
         mapEntries_ ) VULKAN_HPP_NOEXCEPT
@@ -10554,7 +10775,7 @@
       pMapEntries   = mapEntries_.data();
       return *this;
     }
-#endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/
+#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/
 
     SpecializationInfo & setDataSize( size_t dataSize_ ) VULKAN_HPP_NOEXCEPT
     {
@@ -10568,7 +10789,7 @@
       return *this;
     }
 
-#if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )
+#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )
     template <typename T>
     SpecializationInfo &
       setData( VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const T> const & data_ ) VULKAN_HPP_NOEXCEPT
@@ -10577,7 +10798,8 @@
       pData    = data_.data();
       return *this;
     }
-#endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/
+#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/
+#endif   /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkSpecializationInfo const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -10650,6 +10872,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     PipelineShaderStageCreateInfo & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -10687,6 +10910,7 @@
       pSpecializationInfo = pSpecializationInfo_;
       return *this;
     }
+#endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkPipelineShaderStageCreateInfo const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -10768,6 +10992,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     ComputePipelineCreateInfo & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -10805,6 +11030,7 @@
       basePipelineIndex = basePipelineIndex_;
       return *this;
     }
+#endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkComputePipelineCreateInfo const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -10884,6 +11110,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     ConditionalRenderingBeginInfoEXT & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -10908,6 +11135,7 @@
       flags = flags_;
       return *this;
     }
+#endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkConditionalRenderingBeginInfoEXT const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -10981,6 +11209,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     ConformanceVersion & setMajor( uint8_t major_ ) VULKAN_HPP_NOEXCEPT
     {
       major = major_;
@@ -11004,6 +11233,7 @@
       patch = patch_;
       return *this;
     }
+#endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkConformanceVersion const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -11082,6 +11312,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     CooperativeMatrixPropertiesNV & setPNext( void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -11135,6 +11366,7 @@
       scope = scope_;
       return *this;
     }
+#endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkCooperativeMatrixPropertiesNV const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -11218,6 +11450,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     CopyAccelerationStructureInfoKHR & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -11242,6 +11475,7 @@
       mode = mode_;
       return *this;
     }
+#endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkCopyAccelerationStructureInfoKHR const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -11324,6 +11558,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     CopyAccelerationStructureToMemoryInfoKHR & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -11350,6 +11585,7 @@
       mode = mode_;
       return *this;
     }
+#endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkCopyAccelerationStructureToMemoryInfoKHR const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -11426,6 +11662,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     CopyBufferInfo2KHR & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -11456,7 +11693,7 @@
       return *this;
     }
 
-#if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )
+#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )
     CopyBufferInfo2KHR & setRegions(
       VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::BufferCopy2KHR> const & regions_ )
       VULKAN_HPP_NOEXCEPT
@@ -11465,7 +11702,8 @@
       pRegions    = regions_.data();
       return *this;
     }
-#endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/
+#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/
+#endif   /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkCopyBufferInfo2KHR const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -11560,6 +11798,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     CopyBufferToImageInfo2KHR & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -11598,7 +11837,7 @@
       return *this;
     }
 
-#if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )
+#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )
     CopyBufferToImageInfo2KHR & setRegions(
       VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::BufferImageCopy2KHR> const & regions_ )
       VULKAN_HPP_NOEXCEPT
@@ -11607,7 +11846,8 @@
       pRegions    = regions_.data();
       return *this;
     }
-#endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/
+#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/
+#endif   /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkCopyBufferToImageInfo2KHR const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -11684,6 +11924,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     CopyCommandTransformInfoQCOM & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -11696,6 +11937,7 @@
       transform = transform_;
       return *this;
     }
+#endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkCopyCommandTransformInfoQCOM const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -11776,6 +12018,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     CopyDescriptorSet & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -11823,6 +12066,7 @@
       descriptorCount = descriptorCount_;
       return *this;
     }
+#endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkCopyDescriptorSet const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -11905,6 +12149,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     ImageCopy2KHR & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -11942,6 +12187,7 @@
       extent = extent_;
       return *this;
     }
+#endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkImageCopy2KHR const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -12040,6 +12286,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     CopyImageInfo2KHR & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -12082,7 +12329,7 @@
       return *this;
     }
 
-#if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )
+#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )
     CopyImageInfo2KHR & setRegions(
       VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::ImageCopy2KHR> const & regions_ )
       VULKAN_HPP_NOEXCEPT
@@ -12091,7 +12338,8 @@
       pRegions    = regions_.data();
       return *this;
     }
-#endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/
+#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/
+#endif   /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkCopyImageInfo2KHR const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -12190,6 +12438,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     CopyImageToBufferInfo2KHR & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -12228,7 +12477,7 @@
       return *this;
     }
 
-#if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )
+#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )
     CopyImageToBufferInfo2KHR & setRegions(
       VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::BufferImageCopy2KHR> const & regions_ )
       VULKAN_HPP_NOEXCEPT
@@ -12237,7 +12486,8 @@
       pRegions    = regions_.data();
       return *this;
     }
-#endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/
+#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/
+#endif   /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkCopyImageToBufferInfo2KHR const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -12322,6 +12572,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     CopyMemoryToAccelerationStructureInfoKHR & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -12348,6 +12599,7 @@
       mode = mode_;
       return *this;
     }
+#endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkCopyMemoryToAccelerationStructureInfoKHR const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -12407,6 +12659,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     CuFunctionCreateInfoNVX & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -12424,6 +12677,7 @@
       pName = pName_;
       return *this;
     }
+#endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkCuFunctionCreateInfoNVX const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -12538,6 +12792,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     CuLaunchInfoNVX & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -12604,7 +12859,7 @@
       return *this;
     }
 
-#if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )
+#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )
     CuLaunchInfoNVX &
       setParams( VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const void * const> const & params_ ) VULKAN_HPP_NOEXCEPT
     {
@@ -12612,7 +12867,7 @@
       pParams    = params_.data();
       return *this;
     }
-#endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/
+#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/
 
     CuLaunchInfoNVX & setExtraCount( size_t extraCount_ ) VULKAN_HPP_NOEXCEPT
     {
@@ -12626,7 +12881,7 @@
       return *this;
     }
 
-#if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )
+#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )
     CuLaunchInfoNVX &
       setExtras( VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const void * const> const & extras_ ) VULKAN_HPP_NOEXCEPT
     {
@@ -12634,7 +12889,8 @@
       pExtras    = extras_.data();
       return *this;
     }
-#endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/
+#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/
+#endif   /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkCuLaunchInfoNVX const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -12716,6 +12972,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     CuModuleCreateInfoNVX & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -12733,6 +12990,7 @@
       pData = pData_;
       return *this;
     }
+#endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkCuModuleCreateInfoNVX const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -12818,6 +13076,7 @@
       return *this;
     }
 
+#  if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     D3D12FenceSubmitInfoKHR & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -12836,7 +13095,7 @@
       return *this;
     }
 
-#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )
+#    if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )
     D3D12FenceSubmitInfoKHR & setWaitSemaphoreValues(
       VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const uint64_t> const & waitSemaphoreValues_ ) VULKAN_HPP_NOEXCEPT
     {
@@ -12844,7 +13103,7 @@
       pWaitSemaphoreValues     = waitSemaphoreValues_.data();
       return *this;
     }
-#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/
+#    endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/
 
     D3D12FenceSubmitInfoKHR & setSignalSemaphoreValuesCount( uint32_t signalSemaphoreValuesCount_ ) VULKAN_HPP_NOEXCEPT
     {
@@ -12858,7 +13117,7 @@
       return *this;
     }
 
-#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )
+#    if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )
     D3D12FenceSubmitInfoKHR & setSignalSemaphoreValues(
       VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const uint64_t> const & signalSemaphoreValues_ ) VULKAN_HPP_NOEXCEPT
     {
@@ -12866,7 +13125,8 @@
       pSignalSemaphoreValues     = signalSemaphoreValues_.data();
       return *this;
     }
-#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/
+#    endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/
+#  endif   /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkD3D12FenceSubmitInfoKHR const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -12944,6 +13204,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     DebugMarkerMarkerInfoEXT & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -12961,6 +13222,7 @@
       color = color_;
       return *this;
     }
+#endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkDebugMarkerMarkerInfoEXT const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -13035,6 +13297,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     DebugMarkerObjectNameInfoEXT & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -13059,6 +13322,7 @@
       pObjectName = pObjectName_;
       return *this;
     }
+#endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkDebugMarkerObjectNameInfoEXT const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -13154,6 +13418,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     DebugMarkerObjectTagInfoEXT & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -13191,7 +13456,7 @@
       return *this;
     }
 
-#if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )
+#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )
     template <typename T>
     DebugMarkerObjectTagInfoEXT &
       setTag( VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const T> const & tag_ ) VULKAN_HPP_NOEXCEPT
@@ -13200,7 +13465,8 @@
       pTag    = tag_.data();
       return *this;
     }
-#endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/
+#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/
+#endif   /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkDebugMarkerObjectTagInfoEXT const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -13280,6 +13546,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     DebugReportCallbackCreateInfoEXT & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -13303,6 +13570,7 @@
       pUserData = pUserData_;
       return *this;
     }
+#endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkDebugReportCallbackCreateInfoEXT const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -13375,6 +13643,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     DebugUtilsLabelEXT & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -13392,6 +13661,7 @@
       color = color_;
       return *this;
     }
+#endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkDebugUtilsLabelEXT const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -13466,6 +13736,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     DebugUtilsObjectNameInfoEXT & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -13489,6 +13760,7 @@
       pObjectName = pObjectName_;
       return *this;
     }
+#endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkDebugUtilsObjectNameInfoEXT const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -13606,6 +13878,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     DebugUtilsMessengerCallbackDataEXT & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -13650,7 +13923,7 @@
       return *this;
     }
 
-#if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )
+#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )
     DebugUtilsMessengerCallbackDataEXT & setQueueLabels(
       VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::DebugUtilsLabelEXT> const &
         queueLabels_ ) VULKAN_HPP_NOEXCEPT
@@ -13659,7 +13932,7 @@
       pQueueLabels    = queueLabels_.data();
       return *this;
     }
-#endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/
+#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/
 
     DebugUtilsMessengerCallbackDataEXT & setCmdBufLabelCount( uint32_t cmdBufLabelCount_ ) VULKAN_HPP_NOEXCEPT
     {
@@ -13674,7 +13947,7 @@
       return *this;
     }
 
-#if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )
+#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )
     DebugUtilsMessengerCallbackDataEXT & setCmdBufLabels(
       VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::DebugUtilsLabelEXT> const &
         cmdBufLabels_ ) VULKAN_HPP_NOEXCEPT
@@ -13683,7 +13956,7 @@
       pCmdBufLabels    = cmdBufLabels_.data();
       return *this;
     }
-#endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/
+#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/
 
     DebugUtilsMessengerCallbackDataEXT & setObjectCount( uint32_t objectCount_ ) VULKAN_HPP_NOEXCEPT
     {
@@ -13698,7 +13971,7 @@
       return *this;
     }
 
-#if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )
+#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )
     DebugUtilsMessengerCallbackDataEXT & setObjects(
       VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::DebugUtilsObjectNameInfoEXT> const &
         objects_ ) VULKAN_HPP_NOEXCEPT
@@ -13707,7 +13980,8 @@
       pObjects    = objects_.data();
       return *this;
     }
-#endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/
+#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/
+#endif   /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkDebugUtilsMessengerCallbackDataEXT const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -13799,6 +14073,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     DebugUtilsMessengerCreateInfoEXT & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -13838,6 +14113,7 @@
       pUserData = pUserData_;
       return *this;
     }
+#endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkDebugUtilsMessengerCreateInfoEXT const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -13935,6 +14211,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     DebugUtilsObjectTagInfoEXT & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -13971,7 +14248,7 @@
       return *this;
     }
 
-#if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )
+#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )
     template <typename T>
     DebugUtilsObjectTagInfoEXT &
       setTag( VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const T> const & tag_ ) VULKAN_HPP_NOEXCEPT
@@ -13980,7 +14257,8 @@
       pTag    = tag_.data();
       return *this;
     }
-#endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/
+#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/
+#endif   /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkDebugUtilsObjectTagInfoEXT const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -14058,6 +14336,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     DedicatedAllocationBufferCreateInfoNV & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -14070,6 +14349,7 @@
       dedicatedAllocation = dedicatedAllocation_;
       return *this;
     }
+#endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkDedicatedAllocationBufferCreateInfoNV const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -14141,6 +14421,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     DedicatedAllocationImageCreateInfoNV & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -14153,6 +14434,7 @@
       dedicatedAllocation = dedicatedAllocation_;
       return *this;
     }
+#endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkDedicatedAllocationImageCreateInfoNV const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -14227,6 +14509,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     DedicatedAllocationMemoryAllocateInfoNV & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -14244,6 +14527,7 @@
       buffer = buffer_;
       return *this;
     }
+#endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkDedicatedAllocationMemoryAllocateInfoNV const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -14320,6 +14604,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     MemoryBarrier2KHR & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -14351,6 +14636,7 @@
       dstAccessMask = dstAccessMask_;
       return *this;
     }
+#endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkMemoryBarrier2KHR const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -14427,6 +14713,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     ImageSubresourceRange & setAspectMask( VULKAN_HPP_NAMESPACE::ImageAspectFlags aspectMask_ ) VULKAN_HPP_NOEXCEPT
     {
       aspectMask = aspectMask_;
@@ -14456,6 +14743,7 @@
       layerCount = layerCount_;
       return *this;
     }
+#endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkImageSubresourceRange const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -14539,6 +14827,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     ImageMemoryBarrier2KHR & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -14609,6 +14898,7 @@
       subresourceRange = subresourceRange_;
       return *this;
     }
+#endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkImageMemoryBarrier2KHR const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -14721,6 +15011,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     DependencyInfoKHR & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -14746,7 +15037,7 @@
       return *this;
     }
 
-#if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )
+#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )
     DependencyInfoKHR & setMemoryBarriers(
       VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::MemoryBarrier2KHR> const &
         memoryBarriers_ ) VULKAN_HPP_NOEXCEPT
@@ -14755,7 +15046,7 @@
       pMemoryBarriers    = memoryBarriers_.data();
       return *this;
     }
-#endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/
+#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/
 
     DependencyInfoKHR & setBufferMemoryBarrierCount( uint32_t bufferMemoryBarrierCount_ ) VULKAN_HPP_NOEXCEPT
     {
@@ -14770,7 +15061,7 @@
       return *this;
     }
 
-#if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )
+#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )
     DependencyInfoKHR & setBufferMemoryBarriers(
       VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::BufferMemoryBarrier2KHR> const &
         bufferMemoryBarriers_ ) VULKAN_HPP_NOEXCEPT
@@ -14779,7 +15070,7 @@
       pBufferMemoryBarriers    = bufferMemoryBarriers_.data();
       return *this;
     }
-#endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/
+#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/
 
     DependencyInfoKHR & setImageMemoryBarrierCount( uint32_t imageMemoryBarrierCount_ ) VULKAN_HPP_NOEXCEPT
     {
@@ -14794,7 +15085,7 @@
       return *this;
     }
 
-#if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )
+#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )
     DependencyInfoKHR & setImageMemoryBarriers(
       VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::ImageMemoryBarrier2KHR> const &
         imageMemoryBarriers_ ) VULKAN_HPP_NOEXCEPT
@@ -14803,7 +15094,8 @@
       pImageMemoryBarriers    = imageMemoryBarriers_.data();
       return *this;
     }
-#endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/
+#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/
+#endif   /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkDependencyInfoKHR const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -14882,6 +15174,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     DescriptorBufferInfo & setBuffer( VULKAN_HPP_NAMESPACE::Buffer buffer_ ) VULKAN_HPP_NOEXCEPT
     {
       buffer = buffer_;
@@ -14899,6 +15192,7 @@
       range = range_;
       return *this;
     }
+#endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkDescriptorBufferInfo const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -14961,6 +15255,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     DescriptorImageInfo & setSampler( VULKAN_HPP_NAMESPACE::Sampler sampler_ ) VULKAN_HPP_NOEXCEPT
     {
       sampler = sampler_;
@@ -14978,6 +15273,7 @@
       imageLayout = imageLayout_;
       return *this;
     }
+#endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkDescriptorImageInfo const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -15038,6 +15334,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     DescriptorPoolSize & setType( VULKAN_HPP_NAMESPACE::DescriptorType type_ ) VULKAN_HPP_NOEXCEPT
     {
       type = type_;
@@ -15049,6 +15346,7 @@
       descriptorCount = descriptorCount_;
       return *this;
     }
+#endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkDescriptorPoolSize const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -15127,6 +15425,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     DescriptorPoolCreateInfo & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -15158,7 +15457,7 @@
       return *this;
     }
 
-#if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )
+#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )
     DescriptorPoolCreateInfo & setPoolSizes(
       VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::DescriptorPoolSize> const & poolSizes_ )
       VULKAN_HPP_NOEXCEPT
@@ -15167,7 +15466,8 @@
       pPoolSizes    = poolSizes_.data();
       return *this;
     }
-#endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/
+#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/
+#endif   /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkDescriptorPoolCreateInfo const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -15244,6 +15544,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     DescriptorPoolInlineUniformBlockCreateInfoEXT & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -15256,6 +15557,7 @@
       maxInlineUniformBlockBindings = maxInlineUniformBlockBindings_;
       return *this;
     }
+#endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkDescriptorPoolInlineUniformBlockCreateInfoEXT const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -15342,6 +15644,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     DescriptorSetAllocateInfo & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -15368,7 +15671,7 @@
       return *this;
     }
 
-#if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )
+#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )
     DescriptorSetAllocateInfo & setSetLayouts(
       VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::DescriptorSetLayout> const &
         setLayouts_ ) VULKAN_HPP_NOEXCEPT
@@ -15377,7 +15680,8 @@
       pSetLayouts        = setLayouts_.data();
       return *this;
     }
-#endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/
+#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/
+#endif   /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkDescriptorSetAllocateInfo const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -15469,6 +15773,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     DescriptorSetLayoutBinding & setBinding( uint32_t binding_ ) VULKAN_HPP_NOEXCEPT
     {
       binding = binding_;
@@ -15501,7 +15806,7 @@
       return *this;
     }
 
-#if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )
+#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )
     DescriptorSetLayoutBinding & setImmutableSamplers(
       VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::Sampler> const & immutableSamplers_ )
       VULKAN_HPP_NOEXCEPT
@@ -15510,7 +15815,8 @@
       pImmutableSamplers = immutableSamplers_.data();
       return *this;
     }
-#endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/
+#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/
+#endif   /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkDescriptorSetLayoutBinding const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -15592,6 +15898,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     DescriptorSetLayoutBindingFlagsCreateInfo & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -15611,7 +15918,7 @@
       return *this;
     }
 
-#if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )
+#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )
     DescriptorSetLayoutBindingFlagsCreateInfo & setBindingFlags(
       VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::DescriptorBindingFlags> const &
         bindingFlags_ ) VULKAN_HPP_NOEXCEPT
@@ -15620,7 +15927,8 @@
       pBindingFlags = bindingFlags_.data();
       return *this;
     }
-#endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/
+#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/
+#endif   /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkDescriptorSetLayoutBindingFlagsCreateInfo const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -15707,6 +16015,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     DescriptorSetLayoutCreateInfo & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -15733,7 +16042,7 @@
       return *this;
     }
 
-#if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )
+#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )
     DescriptorSetLayoutCreateInfo & setBindings(
       VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::DescriptorSetLayoutBinding> const &
         bindings_ ) VULKAN_HPP_NOEXCEPT
@@ -15742,7 +16051,8 @@
       pBindings    = bindings_.data();
       return *this;
     }
-#endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/
+#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/
+#endif   /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkDescriptorSetLayoutCreateInfo const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -15897,6 +16207,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     DescriptorSetVariableDescriptorCountAllocateInfo & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -15917,7 +16228,7 @@
       return *this;
     }
 
-#if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )
+#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )
     DescriptorSetVariableDescriptorCountAllocateInfo & setDescriptorCounts(
       VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const uint32_t> const & descriptorCounts_ ) VULKAN_HPP_NOEXCEPT
     {
@@ -15925,7 +16236,8 @@
       pDescriptorCounts  = descriptorCounts_.data();
       return *this;
     }
-#endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/
+#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/
+#endif   /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkDescriptorSetVariableDescriptorCountAllocateInfo const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -16082,6 +16394,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     DescriptorUpdateTemplateEntry & setDstBinding( uint32_t dstBinding_ ) VULKAN_HPP_NOEXCEPT
     {
       dstBinding = dstBinding_;
@@ -16118,6 +16431,7 @@
       stride = stride_;
       return *this;
     }
+#endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkDescriptorUpdateTemplateEntry const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -16226,6 +16540,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     DescriptorUpdateTemplateCreateInfo & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -16253,7 +16568,7 @@
       return *this;
     }
 
-#if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )
+#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )
     DescriptorUpdateTemplateCreateInfo & setDescriptorUpdateEntries(
       VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::DescriptorUpdateTemplateEntry> const &
         descriptorUpdateEntries_ ) VULKAN_HPP_NOEXCEPT
@@ -16262,7 +16577,7 @@
       pDescriptorUpdateEntries   = descriptorUpdateEntries_.data();
       return *this;
     }
-#endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/
+#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/
 
     DescriptorUpdateTemplateCreateInfo &
       setTemplateType( VULKAN_HPP_NAMESPACE::DescriptorUpdateTemplateType templateType_ ) VULKAN_HPP_NOEXCEPT
@@ -16297,6 +16612,7 @@
       set = set_;
       return *this;
     }
+#endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkDescriptorUpdateTemplateCreateInfo const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -16394,6 +16710,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     DeviceQueueCreateInfo & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -16424,7 +16741,7 @@
       return *this;
     }
 
-#if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )
+#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )
     DeviceQueueCreateInfo & setQueuePriorities(
       VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const float> const & queuePriorities_ ) VULKAN_HPP_NOEXCEPT
     {
@@ -16432,7 +16749,8 @@
       pQueuePriorities = queuePriorities_.data();
       return *this;
     }
-#endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/
+#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/
+#endif   /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkDeviceQueueCreateInfo const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -16610,6 +16928,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     PhysicalDeviceFeatures &
       setRobustBufferAccess( VULKAN_HPP_NAMESPACE::Bool32 robustBufferAccess_ ) VULKAN_HPP_NOEXCEPT
     {
@@ -16973,6 +17292,7 @@
       inheritedQueries = inheritedQueries_;
       return *this;
     }
+#endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkPhysicalDeviceFeatures const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -17157,6 +17477,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     DeviceCreateInfo & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -17182,7 +17503,7 @@
       return *this;
     }
 
-#if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )
+#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )
     DeviceCreateInfo & setQueueCreateInfos(
       VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::DeviceQueueCreateInfo> const &
         queueCreateInfos_ ) VULKAN_HPP_NOEXCEPT
@@ -17191,7 +17512,7 @@
       pQueueCreateInfos    = queueCreateInfos_.data();
       return *this;
     }
-#endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/
+#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/
 
     DeviceCreateInfo & setEnabledLayerCount( uint32_t enabledLayerCount_ ) VULKAN_HPP_NOEXCEPT
     {
@@ -17205,7 +17526,7 @@
       return *this;
     }
 
-#if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )
+#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )
     DeviceCreateInfo & setPEnabledLayerNames( VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const char * const> const &
                                                 pEnabledLayerNames_ ) VULKAN_HPP_NOEXCEPT
     {
@@ -17213,7 +17534,7 @@
       ppEnabledLayerNames = pEnabledLayerNames_.data();
       return *this;
     }
-#endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/
+#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/
 
     DeviceCreateInfo & setEnabledExtensionCount( uint32_t enabledExtensionCount_ ) VULKAN_HPP_NOEXCEPT
     {
@@ -17227,7 +17548,7 @@
       return *this;
     }
 
-#if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )
+#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )
     DeviceCreateInfo & setPEnabledExtensionNames(
       VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const char * const> const & pEnabledExtensionNames_ )
       VULKAN_HPP_NOEXCEPT
@@ -17236,7 +17557,7 @@
       ppEnabledExtensionNames = pEnabledExtensionNames_.data();
       return *this;
     }
-#endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/
+#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/
 
     DeviceCreateInfo &
       setPEnabledFeatures( const VULKAN_HPP_NAMESPACE::PhysicalDeviceFeatures * pEnabledFeatures_ ) VULKAN_HPP_NOEXCEPT
@@ -17244,6 +17565,7 @@
       pEnabledFeatures = pEnabledFeatures_;
       return *this;
     }
+#endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkDeviceCreateInfo const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -17330,6 +17652,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     DeviceDeviceMemoryReportCreateInfoEXT & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -17355,6 +17678,7 @@
       pUserData = pUserData_;
       return *this;
     }
+#endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkDeviceDeviceMemoryReportCreateInfoEXT const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -17428,6 +17752,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     DeviceDiagnosticsConfigCreateInfoNV & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -17440,6 +17765,7 @@
       flags = flags_;
       return *this;
     }
+#endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkDeviceDiagnosticsConfigCreateInfoNV const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -17509,6 +17835,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     DeviceEventInfoEXT & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -17520,6 +17847,7 @@
       deviceEvent = deviceEvent_;
       return *this;
     }
+#endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkDeviceEventInfoEXT const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -17589,6 +17917,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     DeviceGroupBindSparseInfo & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -17606,6 +17935,7 @@
       memoryDeviceIndex = memoryDeviceIndex_;
       return *this;
     }
+#endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkDeviceGroupBindSparseInfo const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -17678,6 +18008,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     DeviceGroupCommandBufferBeginInfo & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -17689,6 +18020,7 @@
       deviceMask = deviceMask_;
       return *this;
     }
+#endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkDeviceGroupCommandBufferBeginInfo const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -17770,6 +18102,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     DeviceGroupDeviceCreateInfo & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -17789,7 +18122,7 @@
       return *this;
     }
 
-#if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )
+#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )
     DeviceGroupDeviceCreateInfo & setPhysicalDevices(
       VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::PhysicalDevice> const &
         physicalDevices_ ) VULKAN_HPP_NOEXCEPT
@@ -17798,7 +18131,8 @@
       pPhysicalDevices    = physicalDevices_.data();
       return *this;
     }
-#endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/
+#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/
+#endif   /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkDeviceGroupDeviceCreateInfo const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -17959,6 +18293,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     DeviceGroupPresentInfoKHR & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -17977,7 +18312,7 @@
       return *this;
     }
 
-#if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )
+#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )
     DeviceGroupPresentInfoKHR & setDeviceMasks(
       VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const uint32_t> const & deviceMasks_ ) VULKAN_HPP_NOEXCEPT
     {
@@ -17985,7 +18320,7 @@
       pDeviceMasks   = deviceMasks_.data();
       return *this;
     }
-#endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/
+#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/
 
     DeviceGroupPresentInfoKHR &
       setMode( VULKAN_HPP_NAMESPACE::DeviceGroupPresentModeFlagBitsKHR mode_ ) VULKAN_HPP_NOEXCEPT
@@ -17993,6 +18328,7 @@
       mode = mode_;
       return *this;
     }
+#endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkDeviceGroupPresentInfoKHR const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -18080,6 +18416,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     DeviceGroupRenderPassBeginInfo & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -18105,7 +18442,7 @@
       return *this;
     }
 
-#if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )
+#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )
     DeviceGroupRenderPassBeginInfo & setDeviceRenderAreas(
       VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::Rect2D> const & deviceRenderAreas_ )
       VULKAN_HPP_NOEXCEPT
@@ -18114,7 +18451,8 @@
       pDeviceRenderAreas    = deviceRenderAreas_.data();
       return *this;
     }
-#endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/
+#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/
+#endif   /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkDeviceGroupRenderPassBeginInfo const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -18211,6 +18549,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     DeviceGroupSubmitInfo & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -18230,7 +18569,7 @@
       return *this;
     }
 
-#if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )
+#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )
     DeviceGroupSubmitInfo & setWaitSemaphoreDeviceIndices(
       VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const uint32_t> const & waitSemaphoreDeviceIndices_ )
       VULKAN_HPP_NOEXCEPT
@@ -18239,7 +18578,7 @@
       pWaitSemaphoreDeviceIndices = waitSemaphoreDeviceIndices_.data();
       return *this;
     }
-#endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/
+#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/
 
     DeviceGroupSubmitInfo & setCommandBufferCount( uint32_t commandBufferCount_ ) VULKAN_HPP_NOEXCEPT
     {
@@ -18254,7 +18593,7 @@
       return *this;
     }
 
-#if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )
+#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )
     DeviceGroupSubmitInfo & setCommandBufferDeviceMasks(
       VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const uint32_t> const & commandBufferDeviceMasks_ )
       VULKAN_HPP_NOEXCEPT
@@ -18263,7 +18602,7 @@
       pCommandBufferDeviceMasks = commandBufferDeviceMasks_.data();
       return *this;
     }
-#endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/
+#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/
 
     DeviceGroupSubmitInfo & setSignalSemaphoreCount( uint32_t signalSemaphoreCount_ ) VULKAN_HPP_NOEXCEPT
     {
@@ -18278,7 +18617,7 @@
       return *this;
     }
 
-#if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )
+#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )
     DeviceGroupSubmitInfo & setSignalSemaphoreDeviceIndices(
       VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const uint32_t> const & signalSemaphoreDeviceIndices_ )
       VULKAN_HPP_NOEXCEPT
@@ -18287,7 +18626,8 @@
       pSignalSemaphoreDeviceIndices = signalSemaphoreDeviceIndices_.data();
       return *this;
     }
-#endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/
+#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/
+#endif   /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkDeviceGroupSubmitInfo const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -18367,6 +18707,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     DeviceGroupSwapchainCreateInfoKHR & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -18379,6 +18720,7 @@
       modes = modes_;
       return *this;
     }
+#endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkDeviceGroupSwapchainCreateInfoKHR const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -18450,6 +18792,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     DeviceMemoryOpaqueCaptureAddressInfo & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -18461,6 +18804,7 @@
       memory = memory_;
       return *this;
     }
+#endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkDeviceMemoryOpaqueCaptureAddressInfo const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -18535,6 +18879,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     DeviceMemoryOverallocationCreateInfoAMD & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -18547,6 +18892,7 @@
       overallocationBehavior = overallocationBehavior_;
       return *this;
     }
+#endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkDeviceMemoryOverallocationCreateInfoAMD const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -18710,6 +19056,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     DevicePrivateDataCreateInfoEXT & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -18722,6 +19069,7 @@
       privateDataSlotRequestCount = privateDataSlotRequestCount_;
       return *this;
     }
+#endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkDevicePrivateDataCreateInfoEXT const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -18796,6 +19144,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     DeviceQueueGlobalPriorityCreateInfoEXT & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -18808,6 +19157,7 @@
       globalPriority = globalPriority_;
       return *this;
     }
+#endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkDeviceQueueGlobalPriorityCreateInfoEXT const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -18878,6 +19228,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     DeviceQueueInfo2 & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -18901,6 +19252,7 @@
       queueIndex = queueIndex_;
       return *this;
     }
+#endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkDeviceQueueInfo2 const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -18976,6 +19328,7 @@
       return *this;
     }
 
+#  if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     DirectFBSurfaceCreateInfoEXT & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -19000,6 +19353,7 @@
       surface = surface_;
       return *this;
     }
+#  endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkDirectFBSurfaceCreateInfoEXT const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -19071,6 +19425,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     DispatchIndirectCommand & setX( uint32_t x_ ) VULKAN_HPP_NOEXCEPT
     {
       x = x_;
@@ -19088,6 +19443,7 @@
       z = z_;
       return *this;
     }
+#endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkDispatchIndirectCommand const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -19150,6 +19506,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     DisplayEventInfoEXT & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -19161,6 +19518,7 @@
       displayEvent = displayEvent_;
       return *this;
     }
+#endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkDisplayEventInfoEXT const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -19226,6 +19584,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     DisplayModeParametersKHR &
       setVisibleRegion( VULKAN_HPP_NAMESPACE::Extent2D const & visibleRegion_ ) VULKAN_HPP_NOEXCEPT
     {
@@ -19238,6 +19597,7 @@
       refreshRate = refreshRate_;
       return *this;
     }
+#endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkDisplayModeParametersKHR const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -19300,6 +19660,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     DisplayModeCreateInfoKHR & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -19318,6 +19679,7 @@
       parameters = parameters_;
       return *this;
     }
+#endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkDisplayModeCreateInfoKHR const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -19738,6 +20100,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     DisplayPlaneInfo2KHR & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -19755,6 +20118,7 @@
       planeIndex = planeIndex_;
       return *this;
     }
+#endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkDisplayPlaneInfo2KHR const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -19952,6 +20316,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     DisplayPowerInfoEXT & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -19963,6 +20328,7 @@
       powerState = powerState_;
       return *this;
     }
+#endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkDisplayPowerInfoEXT const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -20033,6 +20399,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     DisplayPresentInfoKHR & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -20056,6 +20423,7 @@
       persistent = persistent_;
       return *this;
     }
+#endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkDisplayPresentInfoKHR const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -20285,6 +20653,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     DisplaySurfaceCreateInfoKHR & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -20343,6 +20712,7 @@
       imageExtent = imageExtent_;
       return *this;
     }
+#endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkDisplaySurfaceCreateInfoKHR const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -20428,6 +20798,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     DrawIndexedIndirectCommand & setIndexCount( uint32_t indexCount_ ) VULKAN_HPP_NOEXCEPT
     {
       indexCount = indexCount_;
@@ -20457,6 +20828,7 @@
       firstInstance = firstInstance_;
       return *this;
     }
+#endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkDrawIndexedIndirectCommand const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -20525,6 +20897,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     DrawIndirectCommand & setVertexCount( uint32_t vertexCount_ ) VULKAN_HPP_NOEXCEPT
     {
       vertexCount = vertexCount_;
@@ -20548,6 +20921,7 @@
       firstInstance = firstInstance_;
       return *this;
     }
+#endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkDrawIndirectCommand const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -20610,6 +20984,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     DrawMeshTasksIndirectCommandNV & setTaskCount( uint32_t taskCount_ ) VULKAN_HPP_NOEXCEPT
     {
       taskCount = taskCount_;
@@ -20621,6 +20996,7 @@
       firstTask = firstTask_;
       return *this;
     }
+#endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkDrawMeshTasksIndirectCommandNV const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -20829,6 +21205,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     EventCreateInfo & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -20840,6 +21217,7 @@
       flags = flags_;
       return *this;
     }
+#endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkEventCreateInfo const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -20906,6 +21284,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     ExportFenceCreateInfo & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -20918,6 +21297,7 @@
       handleTypes = handleTypes_;
       return *this;
     }
+#endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkExportFenceCreateInfo const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -20991,6 +21371,7 @@
       return *this;
     }
 
+#  if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     ExportFenceWin32HandleInfoKHR & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -21014,6 +21395,7 @@
       name = name_;
       return *this;
     }
+#  endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkExportFenceWin32HandleInfoKHR const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -21086,6 +21468,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     ExportMemoryAllocateInfo & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -21098,6 +21481,7 @@
       handleTypes = handleTypes_;
       return *this;
     }
+#endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkExportMemoryAllocateInfo const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -21167,6 +21551,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     ExportMemoryAllocateInfoNV & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -21179,6 +21564,7 @@
       handleTypes = handleTypes_;
       return *this;
     }
+#endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkExportMemoryAllocateInfoNV const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -21252,6 +21638,7 @@
       return *this;
     }
 
+#  if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     ExportMemoryWin32HandleInfoKHR & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -21275,6 +21662,7 @@
       name = name_;
       return *this;
     }
+#  endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkExportMemoryWin32HandleInfoKHR const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -21350,6 +21738,7 @@
       return *this;
     }
 
+#  if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     ExportMemoryWin32HandleInfoNV & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -21367,6 +21756,7 @@
       dwAccess = dwAccess_;
       return *this;
     }
+#  endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkExportMemoryWin32HandleInfoNV const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -21439,6 +21829,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     ExportSemaphoreCreateInfo & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -21451,6 +21842,7 @@
       handleTypes = handleTypes_;
       return *this;
     }
+#endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkExportSemaphoreCreateInfo const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -21526,6 +21918,7 @@
       return *this;
     }
 
+#  if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     ExportSemaphoreWin32HandleInfoKHR & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -21549,6 +21942,7 @@
       name = name_;
       return *this;
     }
+#  endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkExportSemaphoreWin32HandleInfoKHR const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -21887,6 +22281,7 @@
       return *this;
     }
 
+#  if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     ExternalFormatANDROID & setPNext( void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -21898,6 +22293,7 @@
       externalFormat = externalFormat_;
       return *this;
     }
+#  endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkExternalFormatANDROID const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -22175,6 +22571,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     ExternalMemoryBufferCreateInfo & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -22187,6 +22584,7 @@
       handleTypes = handleTypes_;
       return *this;
     }
+#endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkExternalMemoryBufferCreateInfo const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -22257,6 +22655,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     ExternalMemoryImageCreateInfo & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -22269,6 +22668,7 @@
       handleTypes = handleTypes_;
       return *this;
     }
+#endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkExternalMemoryImageCreateInfo const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -22339,6 +22739,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     ExternalMemoryImageCreateInfoNV & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -22351,6 +22752,7 @@
       handleTypes = handleTypes_;
       return *this;
     }
+#endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkExternalMemoryImageCreateInfoNV const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -22495,6 +22897,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     FenceCreateInfo & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -22506,6 +22909,7 @@
       flags = flags_;
       return *this;
     }
+#endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkFenceCreateInfo const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -22575,6 +22979,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     FenceGetFdInfoKHR & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -22593,6 +22998,7 @@
       handleType = handleType_;
       return *this;
     }
+#endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkFenceGetFdInfoKHR const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -22668,6 +23074,7 @@
       return *this;
     }
 
+#  if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     FenceGetWin32HandleInfoKHR & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -22686,6 +23093,7 @@
       handleType = handleType_;
       return *this;
     }
+#  endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkFenceGetWin32HandleInfoKHR const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -22968,6 +23376,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     FragmentShadingRateAttachmentInfoKHR & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -22987,6 +23396,7 @@
       shadingRateAttachmentTexelSize = shadingRateAttachmentTexelSize_;
       return *this;
     }
+#endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkFragmentShadingRateAttachmentInfoKHR const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -23089,6 +23499,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     FramebufferAttachmentImageInfo & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -23138,7 +23549,7 @@
       return *this;
     }
 
-#if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )
+#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )
     FramebufferAttachmentImageInfo & setViewFormats(
       VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::Format> const & viewFormats_ )
       VULKAN_HPP_NOEXCEPT
@@ -23147,7 +23558,8 @@
       pViewFormats    = viewFormats_.data();
       return *this;
     }
-#endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/
+#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/
+#endif   /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkFramebufferAttachmentImageInfo const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -23237,6 +23649,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     FramebufferAttachmentsCreateInfo & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -23257,7 +23670,7 @@
       return *this;
     }
 
-#if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )
+#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )
     FramebufferAttachmentsCreateInfo & setAttachmentImageInfos(
       VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::FramebufferAttachmentImageInfo> const &
         attachmentImageInfos_ ) VULKAN_HPP_NOEXCEPT
@@ -23266,7 +23679,8 @@
       pAttachmentImageInfos    = attachmentImageInfos_.data();
       return *this;
     }
-#endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/
+#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/
+#endif   /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkFramebufferAttachmentsCreateInfo const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -23368,6 +23782,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     FramebufferCreateInfo & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -23398,7 +23813,7 @@
       return *this;
     }
 
-#if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )
+#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )
     FramebufferCreateInfo & setAttachments(
       VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::ImageView> const & attachments_ )
       VULKAN_HPP_NOEXCEPT
@@ -23407,7 +23822,7 @@
       pAttachments    = attachments_.data();
       return *this;
     }
-#endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/
+#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/
 
     FramebufferCreateInfo & setWidth( uint32_t width_ ) VULKAN_HPP_NOEXCEPT
     {
@@ -23426,6 +23841,7 @@
       layers = layers_;
       return *this;
     }
+#endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkFramebufferCreateInfo const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -23584,6 +24000,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     IndirectCommandsStreamNV & setBuffer( VULKAN_HPP_NAMESPACE::Buffer buffer_ ) VULKAN_HPP_NOEXCEPT
     {
       buffer = buffer_;
@@ -23595,6 +24012,7 @@
       offset = offset_;
       return *this;
     }
+#endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkIndirectCommandsStreamNV const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -23710,6 +24128,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     GeneratedCommandsInfoNV & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -23749,7 +24168,7 @@
       return *this;
     }
 
-#if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )
+#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )
     GeneratedCommandsInfoNV & setStreams(
       VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::IndirectCommandsStreamNV> const &
         streams_ ) VULKAN_HPP_NOEXCEPT
@@ -23758,7 +24177,7 @@
       pStreams    = streams_.data();
       return *this;
     }
-#endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/
+#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/
 
     GeneratedCommandsInfoNV & setSequencesCount( uint32_t sequencesCount_ ) VULKAN_HPP_NOEXCEPT
     {
@@ -23812,6 +24231,7 @@
       sequencesIndexOffset = sequencesIndexOffset_;
       return *this;
     }
+#endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkGeneratedCommandsInfoNV const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -23910,6 +24330,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     GeneratedCommandsMemoryRequirementsInfoNV & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -23942,6 +24363,7 @@
       maxSequencesCount = maxSequencesCount_;
       return *this;
     }
+#endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkGeneratedCommandsMemoryRequirementsInfoNV const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -24019,6 +24441,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     VertexInputBindingDescription & setBinding( uint32_t binding_ ) VULKAN_HPP_NOEXCEPT
     {
       binding = binding_;
@@ -24036,6 +24459,7 @@
       inputRate = inputRate_;
       return *this;
     }
+#endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkVertexInputBindingDescription const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -24102,6 +24526,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     VertexInputAttributeDescription & setLocation( uint32_t location_ ) VULKAN_HPP_NOEXCEPT
     {
       location = location_;
@@ -24125,6 +24550,7 @@
       offset = offset_;
       return *this;
     }
+#endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkVertexInputAttributeDescription const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -24216,6 +24642,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     PipelineVertexInputStateCreateInfo & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -24243,7 +24670,7 @@
       return *this;
     }
 
-#if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )
+#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )
     PipelineVertexInputStateCreateInfo & setVertexBindingDescriptions(
       VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::VertexInputBindingDescription> const &
         vertexBindingDescriptions_ ) VULKAN_HPP_NOEXCEPT
@@ -24252,7 +24679,7 @@
       pVertexBindingDescriptions    = vertexBindingDescriptions_.data();
       return *this;
     }
-#endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/
+#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/
 
     PipelineVertexInputStateCreateInfo &
       setVertexAttributeDescriptionCount( uint32_t vertexAttributeDescriptionCount_ ) VULKAN_HPP_NOEXCEPT
@@ -24268,7 +24695,7 @@
       return *this;
     }
 
-#if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )
+#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )
     PipelineVertexInputStateCreateInfo & setVertexAttributeDescriptions(
       VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::VertexInputAttributeDescription> const &
         vertexAttributeDescriptions_ ) VULKAN_HPP_NOEXCEPT
@@ -24277,7 +24704,8 @@
       pVertexAttributeDescriptions    = vertexAttributeDescriptions_.data();
       return *this;
     }
-#endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/
+#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/
+#endif   /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkPipelineVertexInputStateCreateInfo const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -24361,6 +24789,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     PipelineInputAssemblyStateCreateInfo & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -24387,6 +24816,7 @@
       primitiveRestartEnable = primitiveRestartEnable_;
       return *this;
     }
+#endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkPipelineInputAssemblyStateCreateInfo const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -24463,6 +24893,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     PipelineTessellationStateCreateInfo & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -24481,6 +24912,7 @@
       patchControlPoints = patchControlPoints_;
       return *this;
     }
+#endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkPipelineTessellationStateCreateInfo const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -24573,6 +25005,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     PipelineViewportStateCreateInfo & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -24599,7 +25032,7 @@
       return *this;
     }
 
-#if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )
+#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )
     PipelineViewportStateCreateInfo & setViewports(
       VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::Viewport> const & viewports_ )
       VULKAN_HPP_NOEXCEPT
@@ -24608,7 +25041,7 @@
       pViewports    = viewports_.data();
       return *this;
     }
-#endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/
+#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/
 
     PipelineViewportStateCreateInfo & setScissorCount( uint32_t scissorCount_ ) VULKAN_HPP_NOEXCEPT
     {
@@ -24623,7 +25056,7 @@
       return *this;
     }
 
-#if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )
+#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )
     PipelineViewportStateCreateInfo &
       setScissors( VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::Rect2D> const & scissors_ )
         VULKAN_HPP_NOEXCEPT
@@ -24632,7 +25065,8 @@
       pScissors    = scissors_.data();
       return *this;
     }
-#endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/
+#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/
+#endif   /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkPipelineViewportStateCreateInfo const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -24730,6 +25164,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     PipelineRasterizationStateCreateInfo & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -24809,6 +25244,7 @@
       lineWidth = lineWidth_;
       return *this;
     }
+#endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkPipelineRasterizationStateCreateInfo const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -24908,6 +25344,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     PipelineMultisampleStateCreateInfo & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -24961,6 +25398,7 @@
       alphaToOneEnable = alphaToOneEnable_;
       return *this;
     }
+#endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkPipelineMultisampleStateCreateInfo const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -25047,6 +25485,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     StencilOpState & setFailOp( VULKAN_HPP_NAMESPACE::StencilOp failOp_ ) VULKAN_HPP_NOEXCEPT
     {
       failOp = failOp_;
@@ -25088,6 +25527,7 @@
       reference = reference_;
       return *this;
     }
+#endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkStencilOpState const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -25175,6 +25615,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     PipelineDepthStencilStateCreateInfo & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -25248,6 +25689,7 @@
       maxDepthBounds = maxDepthBounds_;
       return *this;
     }
+#endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkPipelineDepthStencilStateCreateInfo const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -25341,6 +25783,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     PipelineColorBlendAttachmentState & setBlendEnable( VULKAN_HPP_NAMESPACE::Bool32 blendEnable_ ) VULKAN_HPP_NOEXCEPT
     {
       blendEnable = blendEnable_;
@@ -25395,6 +25838,7 @@
       colorWriteMask = colorWriteMask_;
       return *this;
     }
+#endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkPipelineColorBlendAttachmentState const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -25494,6 +25938,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     PipelineColorBlendStateCreateInfo & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -25533,7 +25978,7 @@
       return *this;
     }
 
-#if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )
+#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )
     PipelineColorBlendStateCreateInfo & setAttachments(
       VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<
         const VULKAN_HPP_NAMESPACE::PipelineColorBlendAttachmentState> const & attachments_ ) VULKAN_HPP_NOEXCEPT
@@ -25542,13 +25987,14 @@
       pAttachments    = attachments_.data();
       return *this;
     }
-#endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/
+#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/
 
     PipelineColorBlendStateCreateInfo & setBlendConstants( std::array<float, 4> blendConstants_ ) VULKAN_HPP_NOEXCEPT
     {
       blendConstants = blendConstants_;
       return *this;
     }
+#endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkPipelineColorBlendStateCreateInfo const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -25640,6 +26086,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     PipelineDynamicStateCreateInfo & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -25666,7 +26113,7 @@
       return *this;
     }
 
-#if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )
+#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )
     PipelineDynamicStateCreateInfo & setDynamicStates(
       VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::DynamicState> const & dynamicStates_ )
       VULKAN_HPP_NOEXCEPT
@@ -25675,7 +26122,8 @@
       pDynamicStates    = dynamicStates_.data();
       return *this;
     }
-#endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/
+#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/
+#endif   /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkPipelineDynamicStateCreateInfo const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -25819,6 +26267,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     GraphicsPipelineCreateInfo & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -25844,7 +26293,7 @@
       return *this;
     }
 
-#if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )
+#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )
     GraphicsPipelineCreateInfo & setStages(
       VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::PipelineShaderStageCreateInfo> const &
         stages_ ) VULKAN_HPP_NOEXCEPT
@@ -25853,7 +26302,7 @@
       pStages    = stages_.data();
       return *this;
     }
-#endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/
+#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/
 
     GraphicsPipelineCreateInfo & setPVertexInputState(
       const VULKAN_HPP_NAMESPACE::PipelineVertexInputStateCreateInfo * pVertexInputState_ ) VULKAN_HPP_NOEXCEPT
@@ -25948,6 +26397,7 @@
       basePipelineIndex = basePipelineIndex_;
       return *this;
     }
+#endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkGraphicsPipelineCreateInfo const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -26060,6 +26510,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     GraphicsShaderGroupCreateInfoNV & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -26079,7 +26530,7 @@
       return *this;
     }
 
-#if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )
+#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )
     GraphicsShaderGroupCreateInfoNV & setStages(
       VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::PipelineShaderStageCreateInfo> const &
         stages_ ) VULKAN_HPP_NOEXCEPT
@@ -26088,7 +26539,7 @@
       pStages    = stages_.data();
       return *this;
     }
-#endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/
+#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/
 
     GraphicsShaderGroupCreateInfoNV & setPVertexInputState(
       const VULKAN_HPP_NAMESPACE::PipelineVertexInputStateCreateInfo * pVertexInputState_ ) VULKAN_HPP_NOEXCEPT
@@ -26103,6 +26554,7 @@
       pTessellationState = pTessellationState_;
       return *this;
     }
+#endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkGraphicsShaderGroupCreateInfoNV const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -26199,6 +26651,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     GraphicsPipelineShaderGroupsCreateInfoNV & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -26218,7 +26671,7 @@
       return *this;
     }
 
-#if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )
+#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )
     GraphicsPipelineShaderGroupsCreateInfoNV & setGroups(
       VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::GraphicsShaderGroupCreateInfoNV> const &
         groups_ ) VULKAN_HPP_NOEXCEPT
@@ -26227,7 +26680,7 @@
       pGroups    = groups_.data();
       return *this;
     }
-#endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/
+#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/
 
     GraphicsPipelineShaderGroupsCreateInfoNV & setPipelineCount( uint32_t pipelineCount_ ) VULKAN_HPP_NOEXCEPT
     {
@@ -26242,7 +26695,7 @@
       return *this;
     }
 
-#if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )
+#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )
     GraphicsPipelineShaderGroupsCreateInfoNV & setPipelines(
       VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::Pipeline> const & pipelines_ )
       VULKAN_HPP_NOEXCEPT
@@ -26251,7 +26704,8 @@
       pPipelines    = pipelines_.data();
       return *this;
     }
-#endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/
+#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/
+#endif   /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkGraphicsPipelineShaderGroupsCreateInfoNV const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -26321,6 +26775,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     XYColorEXT & setX( float x_ ) VULKAN_HPP_NOEXCEPT
     {
       x = x_;
@@ -26332,6 +26787,7 @@
       y = y_;
       return *this;
     }
+#endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkXYColorEXT const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -26403,6 +26859,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     HdrMetadataEXT & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -26459,6 +26916,7 @@
       maxFrameAverageLightLevel = maxFrameAverageLightLevel_;
       return *this;
     }
+#endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkHdrMetadataEXT const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -26536,6 +26994,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     HeadlessSurfaceCreateInfoEXT & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -26548,6 +27007,7 @@
       flags = flags_;
       return *this;
     }
+#endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkHeadlessSurfaceCreateInfoEXT const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -26618,6 +27078,7 @@
       return *this;
     }
 
+#  if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     IOSSurfaceCreateInfoMVK & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -26635,6 +27096,7 @@
       pView = pView_;
       return *this;
     }
+#  endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkIOSSurfaceCreateInfoMVK const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -26705,6 +27167,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     ImageBlit &
       setSrcSubresource( VULKAN_HPP_NAMESPACE::ImageSubresourceLayers const & srcSubresource_ ) VULKAN_HPP_NOEXCEPT
     {
@@ -26730,6 +27193,7 @@
       dstOffsets = dstOffsets_;
       return *this;
     }
+#endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkImageBlit const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -26794,6 +27258,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     ImageCopy &
       setSrcSubresource( VULKAN_HPP_NAMESPACE::ImageSubresourceLayers const & srcSubresource_ ) VULKAN_HPP_NOEXCEPT
     {
@@ -26825,6 +27290,7 @@
       extent = extent_;
       return *this;
     }
+#endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkImageCopy const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -26941,6 +27407,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     ImageCreateInfo & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -27019,7 +27486,7 @@
       return *this;
     }
 
-#if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )
+#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )
     ImageCreateInfo & setQueueFamilyIndices(
       VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const uint32_t> const & queueFamilyIndices_ ) VULKAN_HPP_NOEXCEPT
     {
@@ -27027,13 +27494,14 @@
       pQueueFamilyIndices   = queueFamilyIndices_.data();
       return *this;
     }
-#endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/
+#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/
 
     ImageCreateInfo & setInitialLayout( VULKAN_HPP_NAMESPACE::ImageLayout initialLayout_ ) VULKAN_HPP_NOEXCEPT
     {
       initialLayout = initialLayout_;
       return *this;
     }
+#endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkImageCreateInfo const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -27204,6 +27672,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     ImageDrmFormatModifierExplicitCreateInfoEXT & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -27231,7 +27700,7 @@
       return *this;
     }
 
-#if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )
+#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )
     ImageDrmFormatModifierExplicitCreateInfoEXT & setPlaneLayouts(
       VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::SubresourceLayout> const &
         planeLayouts_ ) VULKAN_HPP_NOEXCEPT
@@ -27240,7 +27709,8 @@
       pPlaneLayouts               = planeLayouts_.data();
       return *this;
     }
-#endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/
+#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/
+#endif   /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkImageDrmFormatModifierExplicitCreateInfoEXT const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -27328,6 +27798,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     ImageDrmFormatModifierListCreateInfoEXT & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -27348,7 +27819,7 @@
       return *this;
     }
 
-#if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )
+#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )
     ImageDrmFormatModifierListCreateInfoEXT & setDrmFormatModifiers(
       VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const uint64_t> const & drmFormatModifiers_ ) VULKAN_HPP_NOEXCEPT
     {
@@ -27356,7 +27827,8 @@
       pDrmFormatModifiers    = drmFormatModifiers_.data();
       return *this;
     }
-#endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/
+#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/
+#endif   /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkImageDrmFormatModifierListCreateInfoEXT const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -27508,6 +27980,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     ImageFormatListCreateInfo & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -27527,7 +28000,7 @@
       return *this;
     }
 
-#if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )
+#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )
     ImageFormatListCreateInfo & setViewFormats(
       VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::Format> const & viewFormats_ )
       VULKAN_HPP_NOEXCEPT
@@ -27536,7 +28009,8 @@
       pViewFormats    = viewFormats_.data();
       return *this;
     }
-#endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/
+#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/
+#endif   /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkImageFormatListCreateInfo const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -27689,6 +28163,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     ImageMemoryBarrier & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -27743,6 +28218,7 @@
       subresourceRange = subresourceRange_;
       return *this;
     }
+#endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkImageMemoryBarrier const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -27821,6 +28297,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     ImageMemoryRequirementsInfo2 & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -27832,6 +28309,7 @@
       image = image_;
       return *this;
     }
+#endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkImageMemoryRequirementsInfo2 const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -27906,6 +28384,7 @@
       return *this;
     }
 
+#  if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     ImagePipeSurfaceCreateInfoFUCHSIA & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -27924,6 +28403,7 @@
       imagePipeHandle = imagePipeHandle_;
       return *this;
     }
+#  endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkImagePipeSurfaceCreateInfoFUCHSIA const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -27997,6 +28477,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     ImagePlaneMemoryRequirementsInfo & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -28009,6 +28490,7 @@
       planeAspect = planeAspect_;
       return *this;
     }
+#endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkImagePlaneMemoryRequirementsInfo const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -28081,6 +28563,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     ImageResolve &
       setSrcSubresource( VULKAN_HPP_NAMESPACE::ImageSubresourceLayers const & srcSubresource_ ) VULKAN_HPP_NOEXCEPT
     {
@@ -28112,6 +28595,7 @@
       extent = extent_;
       return *this;
     }
+#endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkImageResolve const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -28181,6 +28665,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     ImageResolve2KHR & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -28218,6 +28703,7 @@
       extent = extent_;
       return *this;
     }
+#endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkImageResolve2KHR const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -28294,6 +28780,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     ImageSparseMemoryRequirementsInfo2 & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -28305,6 +28792,7 @@
       image = image_;
       return *this;
     }
+#endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkImageSparseMemoryRequirementsInfo2 const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -28375,6 +28863,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     ImageStencilUsageCreateInfo & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -28387,6 +28876,7 @@
       stencilUsage = stencilUsage_;
       return *this;
     }
+#endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkImageStencilUsageCreateInfo const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -28457,6 +28947,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     ImageSwapchainCreateInfoKHR & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -28468,6 +28959,7 @@
       swapchain = swapchain_;
       return *this;
     }
+#endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkImageSwapchainCreateInfoKHR const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -28537,6 +29029,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     ImageViewASTCDecodeModeEXT & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -28548,6 +29041,7 @@
       decodeMode = decodeMode_;
       return *this;
     }
+#endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkImageViewASTCDecodeModeEXT const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -28698,6 +29192,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     ImageViewCreateInfo & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -28741,6 +29236,7 @@
       subresourceRange = subresourceRange_;
       return *this;
     }
+#endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkImageViewCreateInfo const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -28819,6 +29315,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     ImageViewHandleInfoNVX & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -28843,6 +29340,7 @@
       sampler = sampler_;
       return *this;
     }
+#endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkImageViewHandleInfoNVX const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -28913,6 +29411,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     ImageViewUsageCreateInfo & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -28924,6 +29423,7 @@
       usage = usage_;
       return *this;
     }
+#endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkImageViewUsageCreateInfo const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -28997,6 +29497,7 @@
       return *this;
     }
 
+#  if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     ImportAndroidHardwareBufferInfoANDROID & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -29008,6 +29509,7 @@
       buffer = buffer_;
       return *this;
     }
+#  endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkImportAndroidHardwareBufferInfoANDROID const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -29083,6 +29585,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     ImportFenceFdInfoKHR & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -29113,6 +29616,7 @@
       fd = fd_;
       return *this;
     }
+#endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkImportFenceFdInfoKHR const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -29196,6 +29700,7 @@
       return *this;
     }
 
+#  if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     ImportFenceWin32HandleInfoKHR & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -29232,6 +29737,7 @@
       name = name_;
       return *this;
     }
+#  endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkImportFenceWin32HandleInfoKHR const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -29309,6 +29815,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     ImportMemoryFdInfoKHR & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -29327,6 +29834,7 @@
       fd = fd_;
       return *this;
     }
+#endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkImportMemoryFdInfoKHR const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -29400,6 +29908,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     ImportMemoryHostPointerInfoEXT & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -29418,6 +29927,7 @@
       pHostPointer = pHostPointer_;
       return *this;
     }
+#endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkImportMemoryHostPointerInfoEXT const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -29496,6 +30006,7 @@
       return *this;
     }
 
+#  if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     ImportMemoryWin32HandleInfoKHR & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -29520,6 +30031,7 @@
       name = name_;
       return *this;
     }
+#  endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkImportMemoryWin32HandleInfoKHR const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -29597,6 +30109,7 @@
       return *this;
     }
 
+#  if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     ImportMemoryWin32HandleInfoNV & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -29615,6 +30128,7 @@
       handle = handle_;
       return *this;
     }
+#  endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkImportMemoryWin32HandleInfoNV const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -29693,6 +30207,7 @@
       return *this;
     }
 
+#  if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     ImportMemoryZirconHandleInfoFUCHSIA & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -29711,6 +30226,7 @@
       handle = handle_;
       return *this;
     }
+#  endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkImportMemoryZirconHandleInfoFUCHSIA const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -29790,6 +30306,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     ImportSemaphoreFdInfoKHR & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -29820,6 +30337,7 @@
       fd = fd_;
       return *this;
     }
+#endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkImportSemaphoreFdInfoKHR const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -29904,6 +30422,7 @@
       return *this;
     }
 
+#  if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     ImportSemaphoreWin32HandleInfoKHR & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -29941,6 +30460,7 @@
       name = name_;
       return *this;
     }
+#  endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkImportSemaphoreWin32HandleInfoKHR const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -30029,6 +30549,7 @@
       return *this;
     }
 
+#  if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     ImportSemaphoreZirconHandleInfoFUCHSIA & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -30061,6 +30582,7 @@
       zirconHandle = zirconHandle_;
       return *this;
     }
+#  endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkImportSemaphoreZirconHandleInfoFUCHSIA const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -30203,6 +30725,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     IndirectCommandsLayoutTokenNV & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -30287,7 +30810,7 @@
       return *this;
     }
 
-#if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )
+#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )
     IndirectCommandsLayoutTokenNV & setIndexTypes(
       VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::IndexType> const & indexTypes_ )
       VULKAN_HPP_NOEXCEPT
@@ -30296,7 +30819,7 @@
       pIndexTypes    = indexTypes_.data();
       return *this;
     }
-#endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/
+#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/
 
     IndirectCommandsLayoutTokenNV & setPIndexTypeValues( const uint32_t * pIndexTypeValues_ ) VULKAN_HPP_NOEXCEPT
     {
@@ -30304,7 +30827,7 @@
       return *this;
     }
 
-#if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )
+#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )
     IndirectCommandsLayoutTokenNV & setIndexTypeValues(
       VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const uint32_t> const & indexTypeValues_ ) VULKAN_HPP_NOEXCEPT
     {
@@ -30312,7 +30835,8 @@
       pIndexTypeValues = indexTypeValues_.data();
       return *this;
     }
-#endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/
+#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/
+#endif   /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkIndirectCommandsLayoutTokenNV const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -30430,6 +30954,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     IndirectCommandsLayoutCreateInfoNV & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -30463,7 +30988,7 @@
       return *this;
     }
 
-#if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )
+#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )
     IndirectCommandsLayoutCreateInfoNV & setTokens(
       VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::IndirectCommandsLayoutTokenNV> const &
         tokens_ ) VULKAN_HPP_NOEXCEPT
@@ -30472,7 +30997,7 @@
       pTokens    = tokens_.data();
       return *this;
     }
-#endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/
+#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/
 
     IndirectCommandsLayoutCreateInfoNV & setStreamCount( uint32_t streamCount_ ) VULKAN_HPP_NOEXCEPT
     {
@@ -30486,7 +31011,7 @@
       return *this;
     }
 
-#if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )
+#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )
     IndirectCommandsLayoutCreateInfoNV & setStreamStrides(
       VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const uint32_t> const & streamStrides_ ) VULKAN_HPP_NOEXCEPT
     {
@@ -30494,7 +31019,8 @@
       pStreamStrides = streamStrides_.data();
       return *this;
     }
-#endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/
+#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/
+#endif   /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkIndirectCommandsLayoutCreateInfoNV const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -30572,6 +31098,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     InitializePerformanceApiInfoINTEL & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -30583,6 +31110,7 @@
       pUserData = pUserData_;
       return *this;
     }
+#endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkInitializePerformanceApiInfoINTEL const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -30653,6 +31181,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     InputAttachmentAspectReference & setSubpass( uint32_t subpass_ ) VULKAN_HPP_NOEXCEPT
     {
       subpass = subpass_;
@@ -30671,6 +31200,7 @@
       aspectMask = aspectMask_;
       return *this;
     }
+#endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkInputAttachmentAspectReference const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -30759,6 +31289,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     InstanceCreateInfo & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -30790,7 +31321,7 @@
       return *this;
     }
 
-#if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )
+#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )
     InstanceCreateInfo & setPEnabledLayerNames(
       VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const char * const> const & pEnabledLayerNames_ )
       VULKAN_HPP_NOEXCEPT
@@ -30799,7 +31330,7 @@
       ppEnabledLayerNames = pEnabledLayerNames_.data();
       return *this;
     }
-#endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/
+#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/
 
     InstanceCreateInfo & setEnabledExtensionCount( uint32_t enabledExtensionCount_ ) VULKAN_HPP_NOEXCEPT
     {
@@ -30813,7 +31344,7 @@
       return *this;
     }
 
-#if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )
+#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )
     InstanceCreateInfo & setPEnabledExtensionNames(
       VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const char * const> const & pEnabledExtensionNames_ )
       VULKAN_HPP_NOEXCEPT
@@ -30822,7 +31353,8 @@
       ppEnabledExtensionNames = pEnabledExtensionNames_.data();
       return *this;
     }
-#endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/
+#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/
+#endif   /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkInstanceCreateInfo const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -30965,6 +31497,7 @@
       return *this;
     }
 
+#  if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     MacOSSurfaceCreateInfoMVK & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -30982,6 +31515,7 @@
       pView = pView_;
       return *this;
     }
+#  endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkMacOSSurfaceCreateInfoMVK const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -31055,6 +31589,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     MappedMemoryRange & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -31078,6 +31613,7 @@
       size = size_;
       return *this;
     }
+#endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkMappedMemoryRange const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -31149,6 +31685,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     MemoryAllocateFlagsInfo & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -31166,6 +31703,7 @@
       deviceMask = deviceMask_;
       return *this;
     }
+#endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkMemoryAllocateFlagsInfo const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -31237,6 +31775,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     MemoryAllocateInfo & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -31254,6 +31793,7 @@
       memoryTypeIndex = memoryTypeIndex_;
       return *this;
     }
+#endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkMemoryAllocateInfo const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -31323,6 +31863,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     MemoryBarrier & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -31340,6 +31881,7 @@
       dstAccessMask = dstAccessMask_;
       return *this;
     }
+#endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkMemoryBarrier const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -31410,6 +31952,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     MemoryDedicatedAllocateInfo & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -31427,6 +31970,7 @@
       buffer = buffer_;
       return *this;
     }
+#endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkMemoryDedicatedAllocateInfo const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -31642,6 +32186,7 @@
       return *this;
     }
 
+#  if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     MemoryGetAndroidHardwareBufferInfoANDROID & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -31654,6 +32199,7 @@
       memory = memory_;
       return *this;
     }
+#  endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkMemoryGetAndroidHardwareBufferInfoANDROID const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -31727,6 +32273,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     MemoryGetFdInfoKHR & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -31745,6 +32292,7 @@
       handleType = handleType_;
       return *this;
     }
+#endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkMemoryGetFdInfoKHR const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -31819,6 +32367,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     MemoryGetRemoteAddressInfoNV & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -31837,6 +32386,7 @@
       handleType = handleType_;
       return *this;
     }
+#endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkMemoryGetRemoteAddressInfoNV const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -31913,6 +32463,7 @@
       return *this;
     }
 
+#  if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     MemoryGetWin32HandleInfoKHR & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -31931,6 +32482,7 @@
       handleType = handleType_;
       return *this;
     }
+#  endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkMemoryGetWin32HandleInfoKHR const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -32008,6 +32560,7 @@
       return *this;
     }
 
+#  if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     MemoryGetZirconHandleInfoFUCHSIA & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -32026,6 +32579,7 @@
       handleType = handleType_;
       return *this;
     }
+#  endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkMemoryGetZirconHandleInfoFUCHSIA const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -32224,6 +32778,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     MemoryOpaqueCaptureAddressAllocateInfo & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -32236,6 +32791,7 @@
       opaqueCaptureAddress = opaqueCaptureAddress_;
       return *this;
     }
+#endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkMemoryOpaqueCaptureAddressAllocateInfo const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -32305,6 +32861,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     MemoryPriorityAllocateInfoEXT & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -32316,6 +32873,7 @@
       priority = priority_;
       return *this;
     }
+#endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkMemoryPriorityAllocateInfoEXT const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -32709,6 +33267,7 @@
       return *this;
     }
 
+#  if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     MetalSurfaceCreateInfoEXT & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -32726,6 +33285,7 @@
       pLayer = pLayer_;
       return *this;
     }
+#  endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkMetalSurfaceCreateInfoEXT const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -32796,6 +33356,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     MultiDrawIndexedInfoEXT & setFirstIndex( uint32_t firstIndex_ ) VULKAN_HPP_NOEXCEPT
     {
       firstIndex = firstIndex_;
@@ -32813,6 +33374,7 @@
       vertexOffset = vertexOffset_;
       return *this;
     }
+#endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkMultiDrawIndexedInfoEXT const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -32871,6 +33433,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     MultiDrawInfoEXT & setFirstVertex( uint32_t firstVertex_ ) VULKAN_HPP_NOEXCEPT
     {
       firstVertex = firstVertex_;
@@ -32882,6 +33445,7 @@
       vertexCount = vertexCount_;
       return *this;
     }
+#endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkMultiDrawInfoEXT const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -33018,6 +33582,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     MutableDescriptorTypeListVALVE & setDescriptorTypeCount( uint32_t descriptorTypeCount_ ) VULKAN_HPP_NOEXCEPT
     {
       descriptorTypeCount = descriptorTypeCount_;
@@ -33031,7 +33596,7 @@
       return *this;
     }
 
-#if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )
+#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )
     MutableDescriptorTypeListVALVE & setDescriptorTypes(
       VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::DescriptorType> const &
         descriptorTypes_ ) VULKAN_HPP_NOEXCEPT
@@ -33040,7 +33605,8 @@
       pDescriptorTypes    = descriptorTypes_.data();
       return *this;
     }
-#endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/
+#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/
+#endif   /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkMutableDescriptorTypeListVALVE const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -33117,6 +33683,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     MutableDescriptorTypeCreateInfoVALVE & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -33137,7 +33704,7 @@
       return *this;
     }
 
-#if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )
+#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )
     MutableDescriptorTypeCreateInfoVALVE & setMutableDescriptorTypeLists(
       VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::MutableDescriptorTypeListVALVE> const &
         mutableDescriptorTypeLists_ ) VULKAN_HPP_NOEXCEPT
@@ -33146,7 +33713,8 @@
       pMutableDescriptorTypeLists    = mutableDescriptorTypeLists_.data();
       return *this;
     }
-#endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/
+#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/
+#endif   /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkMutableDescriptorTypeCreateInfoVALVE const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -33294,6 +33862,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     PerformanceConfigurationAcquireInfoINTEL & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -33306,6 +33875,7 @@
       type = type_;
       return *this;
     }
+#endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkPerformanceConfigurationAcquireInfoINTEL const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -33509,6 +34079,7 @@
 
   union PerformanceCounterResultKHR
   {
+#if !defined( VULKAN_HPP_NO_UNION_CONSTRUCTORS )
     PerformanceCounterResultKHR( VULKAN_HPP_NAMESPACE::PerformanceCounterResultKHR const & rhs ) VULKAN_HPP_NOEXCEPT
     {
       memcpy( static_cast<void *>( this ), &rhs, sizeof( VULKAN_HPP_NAMESPACE::PerformanceCounterResultKHR ) );
@@ -33525,7 +34096,9 @@
     PerformanceCounterResultKHR( float float32_ ) : float32( float32_ ) {}
 
     PerformanceCounterResultKHR( double float64_ ) : float64( float64_ ) {}
+#endif /*VULKAN_HPP_NO_UNION_CONSTRUCTORS*/
 
+#if !defined( VULKAN_HPP_NO_UNION_SETTERS )
     PerformanceCounterResultKHR & setInt32( int32_t int32_ ) VULKAN_HPP_NOEXCEPT
     {
       int32 = int32_;
@@ -33561,6 +34134,7 @@
       float64 = float64_;
       return *this;
     }
+#endif /*VULKAN_HPP_NO_UNION_SETTERS*/
 
     VULKAN_HPP_NAMESPACE::PerformanceCounterResultKHR &
       operator=( VULKAN_HPP_NAMESPACE::PerformanceCounterResultKHR const & rhs ) VULKAN_HPP_NOEXCEPT
@@ -33612,6 +34186,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     PerformanceMarkerInfoINTEL & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -33623,6 +34198,7 @@
       marker = marker_;
       return *this;
     }
+#endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkPerformanceMarkerInfoINTEL const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -33697,6 +34273,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     PerformanceOverrideInfoINTEL & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -33721,6 +34298,7 @@
       parameter = parameter_;
       return *this;
     }
+#endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkPerformanceOverrideInfoINTEL const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -33793,6 +34371,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     PerformanceQuerySubmitInfoKHR & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -33804,6 +34383,7 @@
       counterPassIndex = counterPassIndex_;
       return *this;
     }
+#endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkPerformanceQuerySubmitInfoKHR const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -33872,6 +34452,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     PerformanceStreamMarkerInfoINTEL & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -33883,6 +34464,7 @@
       marker = marker_;
       return *this;
     }
+#endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkPerformanceStreamMarkerInfoINTEL const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -33926,6 +34508,7 @@
 
   union PerformanceValueDataINTEL
   {
+#if !defined( VULKAN_HPP_NO_UNION_CONSTRUCTORS )
     PerformanceValueDataINTEL( VULKAN_HPP_NAMESPACE::PerformanceValueDataINTEL const & rhs ) VULKAN_HPP_NOEXCEPT
     {
       memcpy( static_cast<void *>( this ), &rhs, sizeof( VULKAN_HPP_NAMESPACE::PerformanceValueDataINTEL ) );
@@ -33938,7 +34521,9 @@
     PerformanceValueDataINTEL( float valueFloat_ ) : valueFloat( valueFloat_ ) {}
 
     PerformanceValueDataINTEL( const char * valueString_ ) : valueString( valueString_ ) {}
+#endif /*VULKAN_HPP_NO_UNION_CONSTRUCTORS*/
 
+#if !defined( VULKAN_HPP_NO_UNION_SETTERS )
     PerformanceValueDataINTEL & setValue32( uint32_t value32_ ) VULKAN_HPP_NOEXCEPT
     {
       value32 = value32_;
@@ -33968,6 +34553,7 @@
       valueString = valueString_;
       return *this;
     }
+#endif /*VULKAN_HPP_NO_UNION_SETTERS*/
 
     VULKAN_HPP_NAMESPACE::PerformanceValueDataINTEL &
       operator=( VULKAN_HPP_NAMESPACE::PerformanceValueDataINTEL const & rhs ) VULKAN_HPP_NOEXCEPT
@@ -34026,6 +34612,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     PerformanceValueINTEL & setType( VULKAN_HPP_NAMESPACE::PerformanceValueTypeINTEL type_ ) VULKAN_HPP_NOEXCEPT
     {
       type = type_;
@@ -34037,6 +34624,7 @@
       data = data_;
       return *this;
     }
+#endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkPerformanceValueINTEL const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -34092,6 +34680,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     PhysicalDevice16BitStorageFeatures & setPNext( void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -34125,6 +34714,7 @@
       storageInputOutput16 = storageInputOutput16_;
       return *this;
     }
+#endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkPhysicalDevice16BitStorageFeatures const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -34206,6 +34796,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     PhysicalDevice4444FormatsFeaturesEXT & setPNext( void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -34225,6 +34816,7 @@
       formatA4B4G4R4 = formatA4B4G4R4_;
       return *this;
     }
+#endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkPhysicalDevice4444FormatsFeaturesEXT const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -34301,6 +34893,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     PhysicalDevice8BitStorageFeatures & setPNext( void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -34327,6 +34920,7 @@
       storagePushConstant8 = storagePushConstant8_;
       return *this;
     }
+#endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkPhysicalDevice8BitStorageFeatures const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -34404,6 +34998,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     PhysicalDeviceASTCDecodeFeaturesEXT & setPNext( void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -34416,6 +35011,7 @@
       decodeModeSharedExponent = decodeModeSharedExponent_;
       return *this;
     }
+#endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkPhysicalDeviceASTCDecodeFeaturesEXT const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -34498,6 +35094,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     PhysicalDeviceAccelerationStructureFeaturesKHR & setPNext( void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -34538,6 +35135,7 @@
       descriptorBindingAccelerationStructureUpdateAfterBind = descriptorBindingAccelerationStructureUpdateAfterBind_;
       return *this;
     }
+#endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkPhysicalDeviceAccelerationStructureFeaturesKHR const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -34725,6 +35323,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     PhysicalDeviceBlendOperationAdvancedFeaturesEXT & setPNext( void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -34737,6 +35336,7 @@
       advancedBlendCoherentOperations = advancedBlendCoherentOperations_;
       return *this;
     }
+#endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkPhysicalDeviceBlendOperationAdvancedFeaturesEXT const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -34911,6 +35511,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     PhysicalDeviceBufferDeviceAddressFeatures & setPNext( void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -34937,6 +35538,7 @@
       bufferDeviceAddressMultiDevice = bufferDeviceAddressMultiDevice_;
       return *this;
     }
+#endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkPhysicalDeviceBufferDeviceAddressFeatures const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -35020,6 +35622,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     PhysicalDeviceBufferDeviceAddressFeaturesEXT & setPNext( void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -35046,6 +35649,7 @@
       bufferDeviceAddressMultiDevice = bufferDeviceAddressMultiDevice_;
       return *this;
     }
+#endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkPhysicalDeviceBufferDeviceAddressFeaturesEXT const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -35124,6 +35728,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     PhysicalDeviceCoherentMemoryFeaturesAMD & setPNext( void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -35136,6 +35741,7 @@
       deviceCoherentMemory = deviceCoherentMemory_;
       return *this;
     }
+#endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkPhysicalDeviceCoherentMemoryFeaturesAMD const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -35209,6 +35815,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     PhysicalDeviceColorWriteEnableFeaturesEXT & setPNext( void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -35221,6 +35828,7 @@
       colorWriteEnable = colorWriteEnable_;
       return *this;
     }
+#endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkPhysicalDeviceColorWriteEnableFeaturesEXT const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -35297,6 +35905,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     PhysicalDeviceComputeShaderDerivativesFeaturesNV & setPNext( void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -35316,6 +35925,7 @@
       computeDerivativeGroupLinear = computeDerivativeGroupLinear_;
       return *this;
     }
+#endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkPhysicalDeviceComputeShaderDerivativesFeaturesNV const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -35395,6 +36005,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     PhysicalDeviceConditionalRenderingFeaturesEXT & setPNext( void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -35414,6 +36025,7 @@
       inheritedConditionalRendering = inheritedConditionalRendering_;
       return *this;
     }
+#endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkPhysicalDeviceConditionalRenderingFeaturesEXT const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -35599,6 +36211,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     PhysicalDeviceCooperativeMatrixFeaturesNV & setPNext( void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -35618,6 +36231,7 @@
       cooperativeMatrixRobustBufferAccess = cooperativeMatrixRobustBufferAccess_;
       return *this;
     }
+#endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkPhysicalDeviceCooperativeMatrixFeaturesNV const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -35768,6 +36382,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     PhysicalDeviceCornerSampledImageFeaturesNV & setPNext( void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -35780,6 +36395,7 @@
       cornerSampledImage = cornerSampledImage_;
       return *this;
     }
+#endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkPhysicalDeviceCornerSampledImageFeaturesNV const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -35854,6 +36470,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     PhysicalDeviceCoverageReductionModeFeaturesNV & setPNext( void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -35866,6 +36483,7 @@
       coverageReductionMode = coverageReductionMode_;
       return *this;
     }
+#endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkPhysicalDeviceCoverageReductionModeFeaturesNV const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -35942,6 +36560,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     PhysicalDeviceCustomBorderColorFeaturesEXT & setPNext( void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -35961,6 +36580,7 @@
       customBorderColorWithoutFormat = customBorderColorWithoutFormat_;
       return *this;
     }
+#endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkPhysicalDeviceCustomBorderColorFeaturesEXT const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -36112,6 +36732,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     PhysicalDeviceDedicatedAllocationImageAliasingFeaturesNV & setPNext( void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -36124,6 +36745,7 @@
       dedicatedAllocationImageAliasing = dedicatedAllocationImageAliasing_;
       return *this;
     }
+#endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkPhysicalDeviceDedicatedAllocationImageAliasingFeaturesNV const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -36200,6 +36822,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     PhysicalDeviceDepthClipEnableFeaturesEXT & setPNext( void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -36212,6 +36835,7 @@
       depthClipEnable = depthClipEnable_;
       return *this;
     }
+#endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkPhysicalDeviceDepthClipEnableFeaturesEXT const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -36411,6 +37035,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     PhysicalDeviceDescriptorIndexingFeatures & setPNext( void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -36556,6 +37181,7 @@
       runtimeDescriptorArray = runtimeDescriptorArray_;
       return *this;
     }
+#endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkPhysicalDeviceDescriptorIndexingFeatures const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -36849,6 +37475,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     PhysicalDeviceDeviceGeneratedCommandsFeaturesNV & setPNext( void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -36861,6 +37488,7 @@
       deviceGeneratedCommands = deviceGeneratedCommands_;
       return *this;
     }
+#endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkPhysicalDeviceDeviceGeneratedCommandsFeaturesNV const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -37043,6 +37671,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     PhysicalDeviceDeviceMemoryReportFeaturesEXT & setPNext( void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -37055,6 +37684,7 @@
       deviceMemoryReport = deviceMemoryReport_;
       return *this;
     }
+#endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkPhysicalDeviceDeviceMemoryReportFeaturesEXT const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -37129,6 +37759,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     PhysicalDeviceDiagnosticsConfigFeaturesNV & setPNext( void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -37141,6 +37772,7 @@
       diagnosticsConfig = diagnosticsConfig_;
       return *this;
     }
+#endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkPhysicalDeviceDiagnosticsConfigFeaturesNV const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -37452,6 +38084,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     PhysicalDeviceExclusiveScissorFeaturesNV & setPNext( void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -37464,6 +38097,7 @@
       exclusiveScissor = exclusiveScissor_;
       return *this;
     }
+#endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkPhysicalDeviceExclusiveScissorFeaturesNV const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -37542,6 +38176,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     PhysicalDeviceExtendedDynamicState2FeaturesEXT & setPNext( void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -37568,6 +38203,7 @@
       extendedDynamicState2PatchControlPoints = extendedDynamicState2PatchControlPoints_;
       return *this;
     }
+#endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkPhysicalDeviceExtendedDynamicState2FeaturesEXT const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -37647,6 +38283,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     PhysicalDeviceExtendedDynamicStateFeaturesEXT & setPNext( void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -37659,6 +38296,7 @@
       extendedDynamicState = extendedDynamicState_;
       return *this;
     }
+#endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkPhysicalDeviceExtendedDynamicStateFeaturesEXT const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -37734,6 +38372,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     PhysicalDeviceExternalBufferInfo & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -37758,6 +38397,7 @@
       handleType = handleType_;
       return *this;
     }
+#endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkPhysicalDeviceExternalBufferInfo const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -37833,6 +38473,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     PhysicalDeviceExternalFenceInfo & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -37845,6 +38486,7 @@
       handleType = handleType_;
       return *this;
     }
+#endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkPhysicalDeviceExternalFenceInfo const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -37920,6 +38562,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     PhysicalDeviceExternalImageFormatInfo & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -37932,6 +38575,7 @@
       handleType = handleType_;
       return *this;
     }
+#endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkPhysicalDeviceExternalImageFormatInfo const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -38081,6 +38725,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     PhysicalDeviceExternalMemoryRDMAFeaturesNV & setPNext( void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -38093,6 +38738,7 @@
       externalMemoryRDMA = externalMemoryRDMA_;
       return *this;
     }
+#endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkPhysicalDeviceExternalMemoryRDMAFeaturesNV const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -38166,6 +38812,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     PhysicalDeviceExternalSemaphoreInfo & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -38178,6 +38825,7 @@
       handleType = handleType_;
       return *this;
     }
+#endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkPhysicalDeviceExternalSemaphoreInfo const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -38248,6 +38896,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     PhysicalDeviceFeatures2 & setPNext( void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -38260,6 +38909,7 @@
       features = features_;
       return *this;
     }
+#endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkPhysicalDeviceFeatures2 const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -38474,6 +39124,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     PhysicalDeviceFragmentDensityMap2FeaturesEXT & setPNext( void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -38486,6 +39137,7 @@
       fragmentDensityMapDeferred = fragmentDensityMapDeferred_;
       return *this;
     }
+#endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkPhysicalDeviceFragmentDensityMap2FeaturesEXT const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -38650,6 +39302,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     PhysicalDeviceFragmentDensityMapFeaturesEXT & setPNext( void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -38676,6 +39329,7 @@
       fragmentDensityMapNonSubsampledImages = fragmentDensityMapNonSubsampledImages_;
       return *this;
     }
+#endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkPhysicalDeviceFragmentDensityMapFeaturesEXT const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -38837,6 +39491,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     PhysicalDeviceFragmentShaderBarycentricFeaturesNV & setPNext( void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -38849,6 +39504,7 @@
       fragmentShaderBarycentric = fragmentShaderBarycentric_;
       return *this;
     }
+#endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkPhysicalDeviceFragmentShaderBarycentricFeaturesNV const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -38928,6 +39584,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     PhysicalDeviceFragmentShaderInterlockFeaturesEXT & setPNext( void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -38954,6 +39611,7 @@
       fragmentShaderShadingRateInterlock = fragmentShaderShadingRateInterlock_;
       return *this;
     }
+#endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkPhysicalDeviceFragmentShaderInterlockFeaturesEXT const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -39037,6 +39695,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     PhysicalDeviceFragmentShadingRateEnumsFeaturesNV & setPNext( void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -39063,6 +39722,7 @@
       noInvocationFragmentShadingRates = noInvocationFragmentShadingRates_;
       return *this;
     }
+#endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkPhysicalDeviceFragmentShadingRateEnumsFeaturesNV const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -39144,6 +39804,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     PhysicalDeviceFragmentShadingRateEnumsPropertiesNV & setPNext( void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -39156,6 +39817,7 @@
       maxFragmentShadingRateInvocationCount = maxFragmentShadingRateInvocationCount_;
       return *this;
     }
+#endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkPhysicalDeviceFragmentShadingRateEnumsPropertiesNV const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -39236,6 +39898,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     PhysicalDeviceFragmentShadingRateFeaturesKHR & setPNext( void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -39262,6 +39925,7 @@
       attachmentFragmentShadingRate = attachmentFragmentShadingRate_;
       return *this;
     }
+#endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkPhysicalDeviceFragmentShadingRateFeaturesKHR const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -39559,6 +40223,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     PhysicalDeviceGlobalPriorityQueryFeaturesEXT & setPNext( void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -39571,6 +40236,7 @@
       globalPriorityQuery = globalPriorityQuery_;
       return *this;
     }
+#endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkPhysicalDeviceGlobalPriorityQueryFeaturesEXT const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -39720,6 +40386,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     PhysicalDeviceHostQueryResetFeatures & setPNext( void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -39732,6 +40399,7 @@
       hostQueryReset = hostQueryReset_;
       return *this;
     }
+#endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkPhysicalDeviceHostQueryResetFeatures const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -39907,6 +40575,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     PhysicalDeviceImageDrmFormatModifierInfoEXT & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -39941,7 +40610,7 @@
       return *this;
     }
 
-#if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )
+#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )
     PhysicalDeviceImageDrmFormatModifierInfoEXT & setQueueFamilyIndices(
       VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const uint32_t> const & queueFamilyIndices_ ) VULKAN_HPP_NOEXCEPT
     {
@@ -39949,7 +40618,8 @@
       pQueueFamilyIndices   = queueFamilyIndices_.data();
       return *this;
     }
-#endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/
+#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/
+#endif   /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkPhysicalDeviceImageDrmFormatModifierInfoEXT const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -40033,6 +40703,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     PhysicalDeviceImageFormatInfo2 & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -40068,6 +40739,7 @@
       flags = flags_;
       return *this;
     }
+#endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkPhysicalDeviceImageFormatInfo2 const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -40147,6 +40819,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     PhysicalDeviceImageRobustnessFeaturesEXT & setPNext( void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -40159,6 +40832,7 @@
       robustImageAccess = robustImageAccess_;
       return *this;
     }
+#endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkPhysicalDeviceImageRobustnessFeaturesEXT const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -40234,6 +40908,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     PhysicalDeviceImageViewImageFormatInfoEXT & setPNext( void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -40246,6 +40921,7 @@
       imageViewType = imageViewType_;
       return *this;
     }
+#endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkPhysicalDeviceImageViewImageFormatInfoEXT const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -40320,6 +40996,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     PhysicalDeviceImagelessFramebufferFeatures & setPNext( void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -40332,6 +41009,7 @@
       imagelessFramebuffer = imagelessFramebuffer_;
       return *this;
     }
+#endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkPhysicalDeviceImagelessFramebufferFeatures const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -40406,6 +41084,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     PhysicalDeviceIndexTypeUint8FeaturesEXT & setPNext( void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -40418,6 +41097,7 @@
       indexTypeUint8 = indexTypeUint8_;
       return *this;
     }
+#endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkPhysicalDeviceIndexTypeUint8FeaturesEXT const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -40492,6 +41172,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     PhysicalDeviceInheritedViewportScissorFeaturesNV & setPNext( void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -40504,6 +41185,7 @@
       inheritedViewportScissor2D = inheritedViewportScissor2D_;
       return *this;
     }
+#endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkPhysicalDeviceInheritedViewportScissorFeaturesNV const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -40581,6 +41263,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     PhysicalDeviceInlineUniformBlockFeaturesEXT & setPNext( void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -40600,6 +41283,7 @@
       descriptorBindingInlineUniformBlockUpdateAfterBind = descriptorBindingInlineUniformBlockUpdateAfterBind_;
       return *this;
     }
+#endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkPhysicalDeviceInlineUniformBlockFeaturesEXT const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -40738,6 +41422,93 @@
     using Type = PhysicalDeviceInlineUniformBlockPropertiesEXT;
   };
 
+  struct PhysicalDeviceInvocationMaskFeaturesHUAWEI
+  {
+    static const bool                    allowDuplicate = false;
+    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType =
+      StructureType::ePhysicalDeviceInvocationMaskFeaturesHUAWEI;
+
+#if !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )
+    VULKAN_HPP_CONSTEXPR PhysicalDeviceInvocationMaskFeaturesHUAWEI( VULKAN_HPP_NAMESPACE::Bool32 invocationMask_ = {} )
+      VULKAN_HPP_NOEXCEPT : invocationMask( invocationMask_ )
+    {}
+
+    VULKAN_HPP_CONSTEXPR PhysicalDeviceInvocationMaskFeaturesHUAWEI(
+      PhysicalDeviceInvocationMaskFeaturesHUAWEI const & rhs ) VULKAN_HPP_NOEXCEPT = default;
+
+    PhysicalDeviceInvocationMaskFeaturesHUAWEI( VkPhysicalDeviceInvocationMaskFeaturesHUAWEI const & rhs )
+      VULKAN_HPP_NOEXCEPT
+      : PhysicalDeviceInvocationMaskFeaturesHUAWEI(
+          *reinterpret_cast<PhysicalDeviceInvocationMaskFeaturesHUAWEI const *>( &rhs ) )
+    {}
+#endif /*VULKAN_HPP_NO_STRUCT_CONSTRUCTORS*/
+
+    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceInvocationMaskFeaturesHUAWEI &
+                            operator=( PhysicalDeviceInvocationMaskFeaturesHUAWEI const & rhs ) VULKAN_HPP_NOEXCEPT = default;
+
+    PhysicalDeviceInvocationMaskFeaturesHUAWEI &
+      operator=( VkPhysicalDeviceInvocationMaskFeaturesHUAWEI const & rhs ) VULKAN_HPP_NOEXCEPT
+    {
+      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PhysicalDeviceInvocationMaskFeaturesHUAWEI const *>( &rhs );
+      return *this;
+    }
+
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
+    PhysicalDeviceInvocationMaskFeaturesHUAWEI & setPNext( void * pNext_ ) VULKAN_HPP_NOEXCEPT
+    {
+      pNext = pNext_;
+      return *this;
+    }
+
+    PhysicalDeviceInvocationMaskFeaturesHUAWEI &
+      setInvocationMask( VULKAN_HPP_NAMESPACE::Bool32 invocationMask_ ) VULKAN_HPP_NOEXCEPT
+    {
+      invocationMask = invocationMask_;
+      return *this;
+    }
+#endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
+
+    operator VkPhysicalDeviceInvocationMaskFeaturesHUAWEI const &() const VULKAN_HPP_NOEXCEPT
+    {
+      return *reinterpret_cast<const VkPhysicalDeviceInvocationMaskFeaturesHUAWEI *>( this );
+    }
+
+    operator VkPhysicalDeviceInvocationMaskFeaturesHUAWEI &() VULKAN_HPP_NOEXCEPT
+    {
+      return *reinterpret_cast<VkPhysicalDeviceInvocationMaskFeaturesHUAWEI *>( this );
+    }
+
+#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )
+    auto operator<=>( PhysicalDeviceInvocationMaskFeaturesHUAWEI const & ) const = default;
+#else
+    bool operator==( PhysicalDeviceInvocationMaskFeaturesHUAWEI const & rhs ) const VULKAN_HPP_NOEXCEPT
+    {
+      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( invocationMask == rhs.invocationMask );
+    }
+
+    bool operator!=( PhysicalDeviceInvocationMaskFeaturesHUAWEI const & rhs ) const VULKAN_HPP_NOEXCEPT
+    {
+      return !operator==( rhs );
+    }
+#endif
+
+  public:
+    VULKAN_HPP_NAMESPACE::StructureType sType          = StructureType::ePhysicalDeviceInvocationMaskFeaturesHUAWEI;
+    void *                              pNext          = {};
+    VULKAN_HPP_NAMESPACE::Bool32        invocationMask = {};
+  };
+  static_assert( sizeof( PhysicalDeviceInvocationMaskFeaturesHUAWEI ) ==
+                   sizeof( VkPhysicalDeviceInvocationMaskFeaturesHUAWEI ),
+                 "struct and wrapper have different size!" );
+  static_assert( std::is_standard_layout<PhysicalDeviceInvocationMaskFeaturesHUAWEI>::value,
+                 "struct wrapper is not a standard layout!" );
+
+  template <>
+  struct CppType<StructureType, StructureType::ePhysicalDeviceInvocationMaskFeaturesHUAWEI>
+  {
+    using Type = PhysicalDeviceInvocationMaskFeaturesHUAWEI;
+  };
+
   struct PhysicalDeviceLimits
   {
 #if !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )
@@ -41248,6 +42019,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     PhysicalDeviceLineRasterizationFeaturesEXT & setPNext( void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -41295,6 +42067,7 @@
       stippledSmoothLines = stippledSmoothLines_;
       return *this;
     }
+#endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkPhysicalDeviceLineRasterizationFeaturesEXT const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -41602,6 +42375,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     PhysicalDeviceMemoryPriorityFeaturesEXT & setPNext( void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -41614,6 +42388,7 @@
       memoryPriority = memoryPriority_;
       return *this;
     }
+#endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkPhysicalDeviceMemoryPriorityFeaturesEXT const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -41824,6 +42599,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     PhysicalDeviceMeshShaderFeaturesNV & setPNext( void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -41841,6 +42617,7 @@
       meshShader = meshShader_;
       return *this;
     }
+#endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkPhysicalDeviceMeshShaderFeaturesNV const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -42033,6 +42810,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     PhysicalDeviceMultiDrawFeaturesEXT & setPNext( void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -42044,6 +42822,7 @@
       multiDraw = multiDraw_;
       return *this;
     }
+#endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkPhysicalDeviceMultiDrawFeaturesEXT const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -42186,6 +42965,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     PhysicalDeviceMultiviewFeatures & setPNext( void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -42211,6 +42991,7 @@
       multiviewTessellationShader = multiviewTessellationShader_;
       return *this;
     }
+#endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkPhysicalDeviceMultiviewFeatures const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -42439,6 +43220,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     PhysicalDeviceMutableDescriptorTypeFeaturesVALVE & setPNext( void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -42451,6 +43233,7 @@
       mutableDescriptorType = mutableDescriptorType_;
       return *this;
     }
+#endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkPhysicalDeviceMutableDescriptorTypeFeaturesVALVE const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -42607,6 +43390,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     PhysicalDevicePerformanceQueryFeaturesKHR & setPNext( void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -42626,6 +43410,7 @@
       performanceCounterMultipleQueryPools = performanceCounterMultipleQueryPools_;
       return *this;
     }
+#endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkPhysicalDevicePerformanceQueryFeaturesKHR const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -42778,6 +43563,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     PhysicalDevicePipelineCreationCacheControlFeaturesEXT & setPNext( void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -42790,6 +43576,7 @@
       pipelineCreationCacheControl = pipelineCreationCacheControl_;
       return *this;
     }
+#endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkPhysicalDevicePipelineCreationCacheControlFeaturesEXT const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -42866,6 +43653,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     PhysicalDevicePipelineExecutablePropertiesFeaturesKHR & setPNext( void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -42878,6 +43666,7 @@
       pipelineExecutableInfo = pipelineExecutableInfo_;
       return *this;
     }
+#endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkPhysicalDevicePipelineExecutablePropertiesFeaturesKHR const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -43056,6 +43845,7 @@
       return *this;
     }
 
+#  if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     PhysicalDevicePortabilitySubsetFeaturesKHR & setPNext( void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -43165,6 +43955,7 @@
       vertexAttributeAccessBeyondStride = vertexAttributeAccessBeyondStride_;
       return *this;
     }
+#  endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkPhysicalDevicePortabilitySubsetFeaturesKHR const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -43267,6 +44058,7 @@
       return *this;
     }
 
+#  if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     PhysicalDevicePortabilitySubsetPropertiesKHR & setPNext( void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -43279,6 +44071,7 @@
       minVertexInputBindingStrideAlignment = minVertexInputBindingStrideAlignment_;
       return *this;
     }
+#  endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkPhysicalDevicePortabilitySubsetPropertiesKHR const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -43323,6 +44116,276 @@
   };
 #endif /*VK_ENABLE_BETA_EXTENSIONS*/
 
+  struct PhysicalDevicePresentIdFeaturesKHR
+  {
+    static const bool                    allowDuplicate = false;
+    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType =
+      StructureType::ePhysicalDevicePresentIdFeaturesKHR;
+
+#if !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )
+    VULKAN_HPP_CONSTEXPR
+      PhysicalDevicePresentIdFeaturesKHR( VULKAN_HPP_NAMESPACE::Bool32 presentId_ = {} ) VULKAN_HPP_NOEXCEPT
+      : presentId( presentId_ )
+    {}
+
+    VULKAN_HPP_CONSTEXPR PhysicalDevicePresentIdFeaturesKHR( PhysicalDevicePresentIdFeaturesKHR const & rhs )
+      VULKAN_HPP_NOEXCEPT = default;
+
+    PhysicalDevicePresentIdFeaturesKHR( VkPhysicalDevicePresentIdFeaturesKHR const & rhs ) VULKAN_HPP_NOEXCEPT
+      : PhysicalDevicePresentIdFeaturesKHR( *reinterpret_cast<PhysicalDevicePresentIdFeaturesKHR const *>( &rhs ) )
+    {}
+#endif /*VULKAN_HPP_NO_STRUCT_CONSTRUCTORS*/
+
+    VULKAN_HPP_CONSTEXPR_14 PhysicalDevicePresentIdFeaturesKHR &
+                            operator=( PhysicalDevicePresentIdFeaturesKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;
+
+    PhysicalDevicePresentIdFeaturesKHR &
+      operator=( VkPhysicalDevicePresentIdFeaturesKHR const & rhs ) VULKAN_HPP_NOEXCEPT
+    {
+      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PhysicalDevicePresentIdFeaturesKHR const *>( &rhs );
+      return *this;
+    }
+
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
+    PhysicalDevicePresentIdFeaturesKHR & setPNext( void * pNext_ ) VULKAN_HPP_NOEXCEPT
+    {
+      pNext = pNext_;
+      return *this;
+    }
+
+    PhysicalDevicePresentIdFeaturesKHR & setPresentId( VULKAN_HPP_NAMESPACE::Bool32 presentId_ ) VULKAN_HPP_NOEXCEPT
+    {
+      presentId = presentId_;
+      return *this;
+    }
+#endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
+
+    operator VkPhysicalDevicePresentIdFeaturesKHR const &() const VULKAN_HPP_NOEXCEPT
+    {
+      return *reinterpret_cast<const VkPhysicalDevicePresentIdFeaturesKHR *>( this );
+    }
+
+    operator VkPhysicalDevicePresentIdFeaturesKHR &() VULKAN_HPP_NOEXCEPT
+    {
+      return *reinterpret_cast<VkPhysicalDevicePresentIdFeaturesKHR *>( this );
+    }
+
+#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )
+    auto operator<=>( PhysicalDevicePresentIdFeaturesKHR const & ) const = default;
+#else
+    bool operator==( PhysicalDevicePresentIdFeaturesKHR const & rhs ) const VULKAN_HPP_NOEXCEPT
+    {
+      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( presentId == rhs.presentId );
+    }
+
+    bool operator!=( PhysicalDevicePresentIdFeaturesKHR const & rhs ) const VULKAN_HPP_NOEXCEPT
+    {
+      return !operator==( rhs );
+    }
+#endif
+
+  public:
+    VULKAN_HPP_NAMESPACE::StructureType sType     = StructureType::ePhysicalDevicePresentIdFeaturesKHR;
+    void *                              pNext     = {};
+    VULKAN_HPP_NAMESPACE::Bool32        presentId = {};
+  };
+  static_assert( sizeof( PhysicalDevicePresentIdFeaturesKHR ) == sizeof( VkPhysicalDevicePresentIdFeaturesKHR ),
+                 "struct and wrapper have different size!" );
+  static_assert( std::is_standard_layout<PhysicalDevicePresentIdFeaturesKHR>::value,
+                 "struct wrapper is not a standard layout!" );
+
+  template <>
+  struct CppType<StructureType, StructureType::ePhysicalDevicePresentIdFeaturesKHR>
+  {
+    using Type = PhysicalDevicePresentIdFeaturesKHR;
+  };
+
+  struct PhysicalDevicePresentWaitFeaturesKHR
+  {
+    static const bool                    allowDuplicate = false;
+    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType =
+      StructureType::ePhysicalDevicePresentWaitFeaturesKHR;
+
+#if !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )
+    VULKAN_HPP_CONSTEXPR
+      PhysicalDevicePresentWaitFeaturesKHR( VULKAN_HPP_NAMESPACE::Bool32 presentWait_ = {} ) VULKAN_HPP_NOEXCEPT
+      : presentWait( presentWait_ )
+    {}
+
+    VULKAN_HPP_CONSTEXPR PhysicalDevicePresentWaitFeaturesKHR( PhysicalDevicePresentWaitFeaturesKHR const & rhs )
+      VULKAN_HPP_NOEXCEPT = default;
+
+    PhysicalDevicePresentWaitFeaturesKHR( VkPhysicalDevicePresentWaitFeaturesKHR const & rhs ) VULKAN_HPP_NOEXCEPT
+      : PhysicalDevicePresentWaitFeaturesKHR( *reinterpret_cast<PhysicalDevicePresentWaitFeaturesKHR const *>( &rhs ) )
+    {}
+#endif /*VULKAN_HPP_NO_STRUCT_CONSTRUCTORS*/
+
+    VULKAN_HPP_CONSTEXPR_14 PhysicalDevicePresentWaitFeaturesKHR &
+                            operator=( PhysicalDevicePresentWaitFeaturesKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;
+
+    PhysicalDevicePresentWaitFeaturesKHR &
+      operator=( VkPhysicalDevicePresentWaitFeaturesKHR const & rhs ) VULKAN_HPP_NOEXCEPT
+    {
+      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PhysicalDevicePresentWaitFeaturesKHR const *>( &rhs );
+      return *this;
+    }
+
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
+    PhysicalDevicePresentWaitFeaturesKHR & setPNext( void * pNext_ ) VULKAN_HPP_NOEXCEPT
+    {
+      pNext = pNext_;
+      return *this;
+    }
+
+    PhysicalDevicePresentWaitFeaturesKHR &
+      setPresentWait( VULKAN_HPP_NAMESPACE::Bool32 presentWait_ ) VULKAN_HPP_NOEXCEPT
+    {
+      presentWait = presentWait_;
+      return *this;
+    }
+#endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
+
+    operator VkPhysicalDevicePresentWaitFeaturesKHR const &() const VULKAN_HPP_NOEXCEPT
+    {
+      return *reinterpret_cast<const VkPhysicalDevicePresentWaitFeaturesKHR *>( this );
+    }
+
+    operator VkPhysicalDevicePresentWaitFeaturesKHR &() VULKAN_HPP_NOEXCEPT
+    {
+      return *reinterpret_cast<VkPhysicalDevicePresentWaitFeaturesKHR *>( this );
+    }
+
+#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )
+    auto operator<=>( PhysicalDevicePresentWaitFeaturesKHR const & ) const = default;
+#else
+    bool operator==( PhysicalDevicePresentWaitFeaturesKHR const & rhs ) const VULKAN_HPP_NOEXCEPT
+    {
+      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( presentWait == rhs.presentWait );
+    }
+
+    bool operator!=( PhysicalDevicePresentWaitFeaturesKHR const & rhs ) const VULKAN_HPP_NOEXCEPT
+    {
+      return !operator==( rhs );
+    }
+#endif
+
+  public:
+    VULKAN_HPP_NAMESPACE::StructureType sType       = StructureType::ePhysicalDevicePresentWaitFeaturesKHR;
+    void *                              pNext       = {};
+    VULKAN_HPP_NAMESPACE::Bool32        presentWait = {};
+  };
+  static_assert( sizeof( PhysicalDevicePresentWaitFeaturesKHR ) == sizeof( VkPhysicalDevicePresentWaitFeaturesKHR ),
+                 "struct and wrapper have different size!" );
+  static_assert( std::is_standard_layout<PhysicalDevicePresentWaitFeaturesKHR>::value,
+                 "struct wrapper is not a standard layout!" );
+
+  template <>
+  struct CppType<StructureType, StructureType::ePhysicalDevicePresentWaitFeaturesKHR>
+  {
+    using Type = PhysicalDevicePresentWaitFeaturesKHR;
+  };
+
+  struct PhysicalDevicePrimitiveTopologyListRestartFeaturesEXT
+  {
+    static const bool                    allowDuplicate = false;
+    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType =
+      StructureType::ePhysicalDevicePrimitiveTopologyListRestartFeaturesEXT;
+
+#if !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )
+    VULKAN_HPP_CONSTEXPR PhysicalDevicePrimitiveTopologyListRestartFeaturesEXT(
+      VULKAN_HPP_NAMESPACE::Bool32 primitiveTopologyListRestart_      = {},
+      VULKAN_HPP_NAMESPACE::Bool32 primitiveTopologyPatchListRestart_ = {} ) VULKAN_HPP_NOEXCEPT
+      : primitiveTopologyListRestart( primitiveTopologyListRestart_ )
+      , primitiveTopologyPatchListRestart( primitiveTopologyPatchListRestart_ )
+    {}
+
+    VULKAN_HPP_CONSTEXPR PhysicalDevicePrimitiveTopologyListRestartFeaturesEXT(
+      PhysicalDevicePrimitiveTopologyListRestartFeaturesEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;
+
+    PhysicalDevicePrimitiveTopologyListRestartFeaturesEXT(
+      VkPhysicalDevicePrimitiveTopologyListRestartFeaturesEXT const & rhs ) VULKAN_HPP_NOEXCEPT
+      : PhysicalDevicePrimitiveTopologyListRestartFeaturesEXT(
+          *reinterpret_cast<PhysicalDevicePrimitiveTopologyListRestartFeaturesEXT const *>( &rhs ) )
+    {}
+#endif /*VULKAN_HPP_NO_STRUCT_CONSTRUCTORS*/
+
+    VULKAN_HPP_CONSTEXPR_14 PhysicalDevicePrimitiveTopologyListRestartFeaturesEXT &
+                            operator=( PhysicalDevicePrimitiveTopologyListRestartFeaturesEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;
+
+    PhysicalDevicePrimitiveTopologyListRestartFeaturesEXT &
+      operator=( VkPhysicalDevicePrimitiveTopologyListRestartFeaturesEXT const & rhs ) VULKAN_HPP_NOEXCEPT
+    {
+      *this =
+        *reinterpret_cast<VULKAN_HPP_NAMESPACE::PhysicalDevicePrimitiveTopologyListRestartFeaturesEXT const *>( &rhs );
+      return *this;
+    }
+
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
+    PhysicalDevicePrimitiveTopologyListRestartFeaturesEXT & setPNext( void * pNext_ ) VULKAN_HPP_NOEXCEPT
+    {
+      pNext = pNext_;
+      return *this;
+    }
+
+    PhysicalDevicePrimitiveTopologyListRestartFeaturesEXT &
+      setPrimitiveTopologyListRestart( VULKAN_HPP_NAMESPACE::Bool32 primitiveTopologyListRestart_ ) VULKAN_HPP_NOEXCEPT
+    {
+      primitiveTopologyListRestart = primitiveTopologyListRestart_;
+      return *this;
+    }
+
+    PhysicalDevicePrimitiveTopologyListRestartFeaturesEXT & setPrimitiveTopologyPatchListRestart(
+      VULKAN_HPP_NAMESPACE::Bool32 primitiveTopologyPatchListRestart_ ) VULKAN_HPP_NOEXCEPT
+    {
+      primitiveTopologyPatchListRestart = primitiveTopologyPatchListRestart_;
+      return *this;
+    }
+#endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
+
+    operator VkPhysicalDevicePrimitiveTopologyListRestartFeaturesEXT const &() const VULKAN_HPP_NOEXCEPT
+    {
+      return *reinterpret_cast<const VkPhysicalDevicePrimitiveTopologyListRestartFeaturesEXT *>( this );
+    }
+
+    operator VkPhysicalDevicePrimitiveTopologyListRestartFeaturesEXT &() VULKAN_HPP_NOEXCEPT
+    {
+      return *reinterpret_cast<VkPhysicalDevicePrimitiveTopologyListRestartFeaturesEXT *>( this );
+    }
+
+#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )
+    auto operator<=>( PhysicalDevicePrimitiveTopologyListRestartFeaturesEXT const & ) const = default;
+#else
+    bool operator==( PhysicalDevicePrimitiveTopologyListRestartFeaturesEXT const & rhs ) const VULKAN_HPP_NOEXCEPT
+    {
+      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) &&
+             ( primitiveTopologyListRestart == rhs.primitiveTopologyListRestart ) &&
+             ( primitiveTopologyPatchListRestart == rhs.primitiveTopologyPatchListRestart );
+    }
+
+    bool operator!=( PhysicalDevicePrimitiveTopologyListRestartFeaturesEXT const & rhs ) const VULKAN_HPP_NOEXCEPT
+    {
+      return !operator==( rhs );
+    }
+#endif
+
+  public:
+    VULKAN_HPP_NAMESPACE::StructureType sType = StructureType::ePhysicalDevicePrimitiveTopologyListRestartFeaturesEXT;
+    void *                              pNext = {};
+    VULKAN_HPP_NAMESPACE::Bool32        primitiveTopologyListRestart      = {};
+    VULKAN_HPP_NAMESPACE::Bool32        primitiveTopologyPatchListRestart = {};
+  };
+  static_assert( sizeof( PhysicalDevicePrimitiveTopologyListRestartFeaturesEXT ) ==
+                   sizeof( VkPhysicalDevicePrimitiveTopologyListRestartFeaturesEXT ),
+                 "struct and wrapper have different size!" );
+  static_assert( std::is_standard_layout<PhysicalDevicePrimitiveTopologyListRestartFeaturesEXT>::value,
+                 "struct wrapper is not a standard layout!" );
+
+  template <>
+  struct CppType<StructureType, StructureType::ePhysicalDevicePrimitiveTopologyListRestartFeaturesEXT>
+  {
+    using Type = PhysicalDevicePrimitiveTopologyListRestartFeaturesEXT;
+  };
+
   struct PhysicalDevicePrivateDataFeaturesEXT
   {
     static const bool                    allowDuplicate = false;
@@ -43353,6 +44416,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     PhysicalDevicePrivateDataFeaturesEXT & setPNext( void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -43365,6 +44429,7 @@
       privateData = privateData_;
       return *this;
     }
+#endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkPhysicalDevicePrivateDataFeaturesEXT const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -43662,6 +44727,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     PhysicalDeviceProtectedMemoryFeatures & setPNext( void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -43674,6 +44740,7 @@
       protectedMemory = protectedMemory_;
       return *this;
     }
+#endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkPhysicalDeviceProtectedMemoryFeatures const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -43821,6 +44888,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     PhysicalDeviceProvokingVertexFeaturesEXT & setPNext( void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -43840,6 +44908,7 @@
       transformFeedbackPreservesProvokingVertex = transformFeedbackPreservesProvokingVertex_;
       return *this;
     }
+#endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkPhysicalDeviceProvokingVertexFeaturesEXT const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -44065,6 +45134,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     PhysicalDeviceRayQueryFeaturesKHR & setPNext( void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -44076,6 +45146,7 @@
       rayQuery = rayQuery_;
       return *this;
     }
+#endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkPhysicalDeviceRayQueryFeaturesKHR const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -44151,6 +45222,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     PhysicalDeviceRayTracingMotionBlurFeaturesNV & setPNext( void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -44170,6 +45242,7 @@
       rayTracingMotionBlurPipelineTraceRaysIndirect = rayTracingMotionBlurPipelineTraceRaysIndirect_;
       return *this;
     }
+#endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkPhysicalDeviceRayTracingMotionBlurFeaturesNV const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -44254,6 +45327,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     PhysicalDeviceRayTracingPipelineFeaturesKHR & setPNext( void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -44294,6 +45368,7 @@
       rayTraversalPrimitiveCulling = rayTraversalPrimitiveCulling_;
       return *this;
     }
+#endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkPhysicalDeviceRayTracingPipelineFeaturesKHR const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -44578,6 +45653,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     PhysicalDeviceRepresentativeFragmentTestFeaturesNV & setPNext( void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -44590,6 +45666,7 @@
       representativeFragmentTest = representativeFragmentTest_;
       return *this;
     }
+#endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkPhysicalDeviceRepresentativeFragmentTestFeaturesNV const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -44667,6 +45744,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     PhysicalDeviceRobustness2FeaturesEXT & setPNext( void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -44693,6 +45771,7 @@
       nullDescriptor = nullDescriptor_;
       return *this;
     }
+#endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkPhysicalDeviceRobustness2FeaturesEXT const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -45014,6 +46093,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     PhysicalDeviceSamplerYcbcrConversionFeatures & setPNext( void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -45026,6 +46106,7 @@
       samplerYcbcrConversion = samplerYcbcrConversion_;
       return *this;
     }
+#endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkPhysicalDeviceSamplerYcbcrConversionFeatures const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -45100,6 +46181,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     PhysicalDeviceScalarBlockLayoutFeatures & setPNext( void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -45112,6 +46194,7 @@
       scalarBlockLayout = scalarBlockLayout_;
       return *this;
     }
+#endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkPhysicalDeviceScalarBlockLayoutFeatures const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -45188,6 +46271,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     PhysicalDeviceSeparateDepthStencilLayoutsFeatures & setPNext( void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -45200,6 +46284,7 @@
       separateDepthStencilLayouts = separateDepthStencilLayouts_;
       return *this;
     }
+#endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkPhysicalDeviceSeparateDepthStencilLayoutsFeatures const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -45244,6 +46329,216 @@
   };
   using PhysicalDeviceSeparateDepthStencilLayoutsFeaturesKHR = PhysicalDeviceSeparateDepthStencilLayoutsFeatures;
 
+  struct PhysicalDeviceShaderAtomicFloat2FeaturesEXT
+  {
+    static const bool                    allowDuplicate = false;
+    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType =
+      StructureType::ePhysicalDeviceShaderAtomicFloat2FeaturesEXT;
+
+#if !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )
+    VULKAN_HPP_CONSTEXPR PhysicalDeviceShaderAtomicFloat2FeaturesEXT(
+      VULKAN_HPP_NAMESPACE::Bool32 shaderBufferFloat16Atomics_      = {},
+      VULKAN_HPP_NAMESPACE::Bool32 shaderBufferFloat16AtomicAdd_    = {},
+      VULKAN_HPP_NAMESPACE::Bool32 shaderBufferFloat16AtomicMinMax_ = {},
+      VULKAN_HPP_NAMESPACE::Bool32 shaderBufferFloat32AtomicMinMax_ = {},
+      VULKAN_HPP_NAMESPACE::Bool32 shaderBufferFloat64AtomicMinMax_ = {},
+      VULKAN_HPP_NAMESPACE::Bool32 shaderSharedFloat16Atomics_      = {},
+      VULKAN_HPP_NAMESPACE::Bool32 shaderSharedFloat16AtomicAdd_    = {},
+      VULKAN_HPP_NAMESPACE::Bool32 shaderSharedFloat16AtomicMinMax_ = {},
+      VULKAN_HPP_NAMESPACE::Bool32 shaderSharedFloat32AtomicMinMax_ = {},
+      VULKAN_HPP_NAMESPACE::Bool32 shaderSharedFloat64AtomicMinMax_ = {},
+      VULKAN_HPP_NAMESPACE::Bool32 shaderImageFloat32AtomicMinMax_  = {},
+      VULKAN_HPP_NAMESPACE::Bool32 sparseImageFloat32AtomicMinMax_  = {} ) VULKAN_HPP_NOEXCEPT
+      : shaderBufferFloat16Atomics( shaderBufferFloat16Atomics_ )
+      , shaderBufferFloat16AtomicAdd( shaderBufferFloat16AtomicAdd_ )
+      , shaderBufferFloat16AtomicMinMax( shaderBufferFloat16AtomicMinMax_ )
+      , shaderBufferFloat32AtomicMinMax( shaderBufferFloat32AtomicMinMax_ )
+      , shaderBufferFloat64AtomicMinMax( shaderBufferFloat64AtomicMinMax_ )
+      , shaderSharedFloat16Atomics( shaderSharedFloat16Atomics_ )
+      , shaderSharedFloat16AtomicAdd( shaderSharedFloat16AtomicAdd_ )
+      , shaderSharedFloat16AtomicMinMax( shaderSharedFloat16AtomicMinMax_ )
+      , shaderSharedFloat32AtomicMinMax( shaderSharedFloat32AtomicMinMax_ )
+      , shaderSharedFloat64AtomicMinMax( shaderSharedFloat64AtomicMinMax_ )
+      , shaderImageFloat32AtomicMinMax( shaderImageFloat32AtomicMinMax_ )
+      , sparseImageFloat32AtomicMinMax( sparseImageFloat32AtomicMinMax_ )
+    {}
+
+    VULKAN_HPP_CONSTEXPR PhysicalDeviceShaderAtomicFloat2FeaturesEXT(
+      PhysicalDeviceShaderAtomicFloat2FeaturesEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;
+
+    PhysicalDeviceShaderAtomicFloat2FeaturesEXT( VkPhysicalDeviceShaderAtomicFloat2FeaturesEXT const & rhs )
+      VULKAN_HPP_NOEXCEPT
+      : PhysicalDeviceShaderAtomicFloat2FeaturesEXT(
+          *reinterpret_cast<PhysicalDeviceShaderAtomicFloat2FeaturesEXT const *>( &rhs ) )
+    {}
+#endif /*VULKAN_HPP_NO_STRUCT_CONSTRUCTORS*/
+
+    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceShaderAtomicFloat2FeaturesEXT &
+                            operator=( PhysicalDeviceShaderAtomicFloat2FeaturesEXT const & rhs ) VULKAN_HPP_NOEXCEPT = default;
+
+    PhysicalDeviceShaderAtomicFloat2FeaturesEXT &
+      operator=( VkPhysicalDeviceShaderAtomicFloat2FeaturesEXT const & rhs ) VULKAN_HPP_NOEXCEPT
+    {
+      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PhysicalDeviceShaderAtomicFloat2FeaturesEXT const *>( &rhs );
+      return *this;
+    }
+
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
+    PhysicalDeviceShaderAtomicFloat2FeaturesEXT & setPNext( void * pNext_ ) VULKAN_HPP_NOEXCEPT
+    {
+      pNext = pNext_;
+      return *this;
+    }
+
+    PhysicalDeviceShaderAtomicFloat2FeaturesEXT &
+      setShaderBufferFloat16Atomics( VULKAN_HPP_NAMESPACE::Bool32 shaderBufferFloat16Atomics_ ) VULKAN_HPP_NOEXCEPT
+    {
+      shaderBufferFloat16Atomics = shaderBufferFloat16Atomics_;
+      return *this;
+    }
+
+    PhysicalDeviceShaderAtomicFloat2FeaturesEXT &
+      setShaderBufferFloat16AtomicAdd( VULKAN_HPP_NAMESPACE::Bool32 shaderBufferFloat16AtomicAdd_ ) VULKAN_HPP_NOEXCEPT
+    {
+      shaderBufferFloat16AtomicAdd = shaderBufferFloat16AtomicAdd_;
+      return *this;
+    }
+
+    PhysicalDeviceShaderAtomicFloat2FeaturesEXT & setShaderBufferFloat16AtomicMinMax(
+      VULKAN_HPP_NAMESPACE::Bool32 shaderBufferFloat16AtomicMinMax_ ) VULKAN_HPP_NOEXCEPT
+    {
+      shaderBufferFloat16AtomicMinMax = shaderBufferFloat16AtomicMinMax_;
+      return *this;
+    }
+
+    PhysicalDeviceShaderAtomicFloat2FeaturesEXT & setShaderBufferFloat32AtomicMinMax(
+      VULKAN_HPP_NAMESPACE::Bool32 shaderBufferFloat32AtomicMinMax_ ) VULKAN_HPP_NOEXCEPT
+    {
+      shaderBufferFloat32AtomicMinMax = shaderBufferFloat32AtomicMinMax_;
+      return *this;
+    }
+
+    PhysicalDeviceShaderAtomicFloat2FeaturesEXT & setShaderBufferFloat64AtomicMinMax(
+      VULKAN_HPP_NAMESPACE::Bool32 shaderBufferFloat64AtomicMinMax_ ) VULKAN_HPP_NOEXCEPT
+    {
+      shaderBufferFloat64AtomicMinMax = shaderBufferFloat64AtomicMinMax_;
+      return *this;
+    }
+
+    PhysicalDeviceShaderAtomicFloat2FeaturesEXT &
+      setShaderSharedFloat16Atomics( VULKAN_HPP_NAMESPACE::Bool32 shaderSharedFloat16Atomics_ ) VULKAN_HPP_NOEXCEPT
+    {
+      shaderSharedFloat16Atomics = shaderSharedFloat16Atomics_;
+      return *this;
+    }
+
+    PhysicalDeviceShaderAtomicFloat2FeaturesEXT &
+      setShaderSharedFloat16AtomicAdd( VULKAN_HPP_NAMESPACE::Bool32 shaderSharedFloat16AtomicAdd_ ) VULKAN_HPP_NOEXCEPT
+    {
+      shaderSharedFloat16AtomicAdd = shaderSharedFloat16AtomicAdd_;
+      return *this;
+    }
+
+    PhysicalDeviceShaderAtomicFloat2FeaturesEXT & setShaderSharedFloat16AtomicMinMax(
+      VULKAN_HPP_NAMESPACE::Bool32 shaderSharedFloat16AtomicMinMax_ ) VULKAN_HPP_NOEXCEPT
+    {
+      shaderSharedFloat16AtomicMinMax = shaderSharedFloat16AtomicMinMax_;
+      return *this;
+    }
+
+    PhysicalDeviceShaderAtomicFloat2FeaturesEXT & setShaderSharedFloat32AtomicMinMax(
+      VULKAN_HPP_NAMESPACE::Bool32 shaderSharedFloat32AtomicMinMax_ ) VULKAN_HPP_NOEXCEPT
+    {
+      shaderSharedFloat32AtomicMinMax = shaderSharedFloat32AtomicMinMax_;
+      return *this;
+    }
+
+    PhysicalDeviceShaderAtomicFloat2FeaturesEXT & setShaderSharedFloat64AtomicMinMax(
+      VULKAN_HPP_NAMESPACE::Bool32 shaderSharedFloat64AtomicMinMax_ ) VULKAN_HPP_NOEXCEPT
+    {
+      shaderSharedFloat64AtomicMinMax = shaderSharedFloat64AtomicMinMax_;
+      return *this;
+    }
+
+    PhysicalDeviceShaderAtomicFloat2FeaturesEXT & setShaderImageFloat32AtomicMinMax(
+      VULKAN_HPP_NAMESPACE::Bool32 shaderImageFloat32AtomicMinMax_ ) VULKAN_HPP_NOEXCEPT
+    {
+      shaderImageFloat32AtomicMinMax = shaderImageFloat32AtomicMinMax_;
+      return *this;
+    }
+
+    PhysicalDeviceShaderAtomicFloat2FeaturesEXT & setSparseImageFloat32AtomicMinMax(
+      VULKAN_HPP_NAMESPACE::Bool32 sparseImageFloat32AtomicMinMax_ ) VULKAN_HPP_NOEXCEPT
+    {
+      sparseImageFloat32AtomicMinMax = sparseImageFloat32AtomicMinMax_;
+      return *this;
+    }
+#endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
+
+    operator VkPhysicalDeviceShaderAtomicFloat2FeaturesEXT const &() const VULKAN_HPP_NOEXCEPT
+    {
+      return *reinterpret_cast<const VkPhysicalDeviceShaderAtomicFloat2FeaturesEXT *>( this );
+    }
+
+    operator VkPhysicalDeviceShaderAtomicFloat2FeaturesEXT &() VULKAN_HPP_NOEXCEPT
+    {
+      return *reinterpret_cast<VkPhysicalDeviceShaderAtomicFloat2FeaturesEXT *>( this );
+    }
+
+#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )
+    auto operator<=>( PhysicalDeviceShaderAtomicFloat2FeaturesEXT const & ) const = default;
+#else
+    bool operator==( PhysicalDeviceShaderAtomicFloat2FeaturesEXT const & rhs ) const VULKAN_HPP_NOEXCEPT
+    {
+      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) &&
+             ( shaderBufferFloat16Atomics == rhs.shaderBufferFloat16Atomics ) &&
+             ( shaderBufferFloat16AtomicAdd == rhs.shaderBufferFloat16AtomicAdd ) &&
+             ( shaderBufferFloat16AtomicMinMax == rhs.shaderBufferFloat16AtomicMinMax ) &&
+             ( shaderBufferFloat32AtomicMinMax == rhs.shaderBufferFloat32AtomicMinMax ) &&
+             ( shaderBufferFloat64AtomicMinMax == rhs.shaderBufferFloat64AtomicMinMax ) &&
+             ( shaderSharedFloat16Atomics == rhs.shaderSharedFloat16Atomics ) &&
+             ( shaderSharedFloat16AtomicAdd == rhs.shaderSharedFloat16AtomicAdd ) &&
+             ( shaderSharedFloat16AtomicMinMax == rhs.shaderSharedFloat16AtomicMinMax ) &&
+             ( shaderSharedFloat32AtomicMinMax == rhs.shaderSharedFloat32AtomicMinMax ) &&
+             ( shaderSharedFloat64AtomicMinMax == rhs.shaderSharedFloat64AtomicMinMax ) &&
+             ( shaderImageFloat32AtomicMinMax == rhs.shaderImageFloat32AtomicMinMax ) &&
+             ( sparseImageFloat32AtomicMinMax == rhs.sparseImageFloat32AtomicMinMax );
+    }
+
+    bool operator!=( PhysicalDeviceShaderAtomicFloat2FeaturesEXT const & rhs ) const VULKAN_HPP_NOEXCEPT
+    {
+      return !operator==( rhs );
+    }
+#endif
+
+  public:
+    VULKAN_HPP_NAMESPACE::StructureType sType = StructureType::ePhysicalDeviceShaderAtomicFloat2FeaturesEXT;
+    void *                              pNext = {};
+    VULKAN_HPP_NAMESPACE::Bool32        shaderBufferFloat16Atomics      = {};
+    VULKAN_HPP_NAMESPACE::Bool32        shaderBufferFloat16AtomicAdd    = {};
+    VULKAN_HPP_NAMESPACE::Bool32        shaderBufferFloat16AtomicMinMax = {};
+    VULKAN_HPP_NAMESPACE::Bool32        shaderBufferFloat32AtomicMinMax = {};
+    VULKAN_HPP_NAMESPACE::Bool32        shaderBufferFloat64AtomicMinMax = {};
+    VULKAN_HPP_NAMESPACE::Bool32        shaderSharedFloat16Atomics      = {};
+    VULKAN_HPP_NAMESPACE::Bool32        shaderSharedFloat16AtomicAdd    = {};
+    VULKAN_HPP_NAMESPACE::Bool32        shaderSharedFloat16AtomicMinMax = {};
+    VULKAN_HPP_NAMESPACE::Bool32        shaderSharedFloat32AtomicMinMax = {};
+    VULKAN_HPP_NAMESPACE::Bool32        shaderSharedFloat64AtomicMinMax = {};
+    VULKAN_HPP_NAMESPACE::Bool32        shaderImageFloat32AtomicMinMax  = {};
+    VULKAN_HPP_NAMESPACE::Bool32        sparseImageFloat32AtomicMinMax  = {};
+  };
+  static_assert( sizeof( PhysicalDeviceShaderAtomicFloat2FeaturesEXT ) ==
+                   sizeof( VkPhysicalDeviceShaderAtomicFloat2FeaturesEXT ),
+                 "struct and wrapper have different size!" );
+  static_assert( std::is_standard_layout<PhysicalDeviceShaderAtomicFloat2FeaturesEXT>::value,
+                 "struct wrapper is not a standard layout!" );
+
+  template <>
+  struct CppType<StructureType, StructureType::ePhysicalDeviceShaderAtomicFloat2FeaturesEXT>
+  {
+    using Type = PhysicalDeviceShaderAtomicFloat2FeaturesEXT;
+  };
+
   struct PhysicalDeviceShaderAtomicFloatFeaturesEXT
   {
     static const bool                    allowDuplicate = false;
@@ -45298,6 +46593,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     PhysicalDeviceShaderAtomicFloatFeaturesEXT & setPNext( void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -45387,6 +46683,7 @@
       sparseImageFloat32AtomicAdd = sparseImageFloat32AtomicAdd_;
       return *this;
     }
+#endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkPhysicalDeviceShaderAtomicFloatFeaturesEXT const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -45485,6 +46782,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     PhysicalDeviceShaderAtomicInt64Features & setPNext( void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -45504,6 +46802,7 @@
       shaderSharedInt64Atomics = shaderSharedInt64Atomics_;
       return *this;
     }
+#endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkPhysicalDeviceShaderAtomicInt64Features const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -45582,6 +46881,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     PhysicalDeviceShaderClockFeaturesKHR & setPNext( void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -45601,6 +46901,7 @@
       shaderDeviceClock = shaderDeviceClock_;
       return *this;
     }
+#endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkPhysicalDeviceShaderClockFeaturesKHR const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -45870,6 +47171,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     PhysicalDeviceShaderDemoteToHelperInvocationFeaturesEXT & setPNext( void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -45882,6 +47184,7 @@
       shaderDemoteToHelperInvocation = shaderDemoteToHelperInvocation_;
       return *this;
     }
+#endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkPhysicalDeviceShaderDemoteToHelperInvocationFeaturesEXT const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -45957,6 +47260,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     PhysicalDeviceShaderDrawParametersFeatures & setPNext( void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -45969,6 +47273,7 @@
       shaderDrawParameters = shaderDrawParameters_;
       return *this;
     }
+#endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkPhysicalDeviceShaderDrawParametersFeatures const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -46045,6 +47350,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     PhysicalDeviceShaderFloat16Int8Features & setPNext( void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -46064,6 +47370,7 @@
       shaderInt8 = shaderInt8_;
       return *this;
     }
+#endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkPhysicalDeviceShaderFloat16Int8Features const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -46144,6 +47451,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     PhysicalDeviceShaderImageAtomicInt64FeaturesEXT & setPNext( void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -46163,6 +47471,7 @@
       sparseImageInt64Atomics = sparseImageInt64Atomics_;
       return *this;
     }
+#endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkPhysicalDeviceShaderImageAtomicInt64FeaturesEXT const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -46239,6 +47548,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     PhysicalDeviceShaderImageFootprintFeaturesNV & setPNext( void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -46251,6 +47561,7 @@
       imageFootprint = imageFootprint_;
       return *this;
     }
+#endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkPhysicalDeviceShaderImageFootprintFeaturesNV const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -46293,6 +47604,587 @@
     using Type = PhysicalDeviceShaderImageFootprintFeaturesNV;
   };
 
+  struct PhysicalDeviceShaderIntegerDotProductFeaturesKHR
+  {
+    static const bool                    allowDuplicate = false;
+    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType =
+      StructureType::ePhysicalDeviceShaderIntegerDotProductFeaturesKHR;
+
+#if !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )
+    VULKAN_HPP_CONSTEXPR PhysicalDeviceShaderIntegerDotProductFeaturesKHR(
+      VULKAN_HPP_NAMESPACE::Bool32 shaderIntegerDotProduct_ = {} ) VULKAN_HPP_NOEXCEPT
+      : shaderIntegerDotProduct( shaderIntegerDotProduct_ )
+    {}
+
+    VULKAN_HPP_CONSTEXPR PhysicalDeviceShaderIntegerDotProductFeaturesKHR(
+      PhysicalDeviceShaderIntegerDotProductFeaturesKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;
+
+    PhysicalDeviceShaderIntegerDotProductFeaturesKHR( VkPhysicalDeviceShaderIntegerDotProductFeaturesKHR const & rhs )
+      VULKAN_HPP_NOEXCEPT
+      : PhysicalDeviceShaderIntegerDotProductFeaturesKHR(
+          *reinterpret_cast<PhysicalDeviceShaderIntegerDotProductFeaturesKHR const *>( &rhs ) )
+    {}
+#endif /*VULKAN_HPP_NO_STRUCT_CONSTRUCTORS*/
+
+    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceShaderIntegerDotProductFeaturesKHR &
+                            operator=( PhysicalDeviceShaderIntegerDotProductFeaturesKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;
+
+    PhysicalDeviceShaderIntegerDotProductFeaturesKHR &
+      operator=( VkPhysicalDeviceShaderIntegerDotProductFeaturesKHR const & rhs ) VULKAN_HPP_NOEXCEPT
+    {
+      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PhysicalDeviceShaderIntegerDotProductFeaturesKHR const *>( &rhs );
+      return *this;
+    }
+
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
+    PhysicalDeviceShaderIntegerDotProductFeaturesKHR & setPNext( void * pNext_ ) VULKAN_HPP_NOEXCEPT
+    {
+      pNext = pNext_;
+      return *this;
+    }
+
+    PhysicalDeviceShaderIntegerDotProductFeaturesKHR &
+      setShaderIntegerDotProduct( VULKAN_HPP_NAMESPACE::Bool32 shaderIntegerDotProduct_ ) VULKAN_HPP_NOEXCEPT
+    {
+      shaderIntegerDotProduct = shaderIntegerDotProduct_;
+      return *this;
+    }
+#endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
+
+    operator VkPhysicalDeviceShaderIntegerDotProductFeaturesKHR const &() const VULKAN_HPP_NOEXCEPT
+    {
+      return *reinterpret_cast<const VkPhysicalDeviceShaderIntegerDotProductFeaturesKHR *>( this );
+    }
+
+    operator VkPhysicalDeviceShaderIntegerDotProductFeaturesKHR &() VULKAN_HPP_NOEXCEPT
+    {
+      return *reinterpret_cast<VkPhysicalDeviceShaderIntegerDotProductFeaturesKHR *>( this );
+    }
+
+#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )
+    auto operator<=>( PhysicalDeviceShaderIntegerDotProductFeaturesKHR const & ) const = default;
+#else
+    bool operator==( PhysicalDeviceShaderIntegerDotProductFeaturesKHR const & rhs ) const VULKAN_HPP_NOEXCEPT
+    {
+      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) &&
+             ( shaderIntegerDotProduct == rhs.shaderIntegerDotProduct );
+    }
+
+    bool operator!=( PhysicalDeviceShaderIntegerDotProductFeaturesKHR const & rhs ) const VULKAN_HPP_NOEXCEPT
+    {
+      return !operator==( rhs );
+    }
+#endif
+
+  public:
+    VULKAN_HPP_NAMESPACE::StructureType sType = StructureType::ePhysicalDeviceShaderIntegerDotProductFeaturesKHR;
+    void *                              pNext = {};
+    VULKAN_HPP_NAMESPACE::Bool32        shaderIntegerDotProduct = {};
+  };
+  static_assert( sizeof( PhysicalDeviceShaderIntegerDotProductFeaturesKHR ) ==
+                   sizeof( VkPhysicalDeviceShaderIntegerDotProductFeaturesKHR ),
+                 "struct and wrapper have different size!" );
+  static_assert( std::is_standard_layout<PhysicalDeviceShaderIntegerDotProductFeaturesKHR>::value,
+                 "struct wrapper is not a standard layout!" );
+
+  template <>
+  struct CppType<StructureType, StructureType::ePhysicalDeviceShaderIntegerDotProductFeaturesKHR>
+  {
+    using Type = PhysicalDeviceShaderIntegerDotProductFeaturesKHR;
+  };
+
+  struct PhysicalDeviceShaderIntegerDotProductPropertiesKHR
+  {
+    static const bool                    allowDuplicate = false;
+    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType =
+      StructureType::ePhysicalDeviceShaderIntegerDotProductPropertiesKHR;
+
+#if !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )
+    VULKAN_HPP_CONSTEXPR PhysicalDeviceShaderIntegerDotProductPropertiesKHR(
+      VULKAN_HPP_NAMESPACE::Bool32 integerDotProduct8BitUnsignedAccelerated_                                      = {},
+      VULKAN_HPP_NAMESPACE::Bool32 integerDotProduct8BitSignedAccelerated_                                        = {},
+      VULKAN_HPP_NAMESPACE::Bool32 integerDotProduct8BitMixedSignednessAccelerated_                               = {},
+      VULKAN_HPP_NAMESPACE::Bool32 integerDotProduct4x8BitPackedUnsignedAccelerated_                              = {},
+      VULKAN_HPP_NAMESPACE::Bool32 integerDotProduct4x8BitPackedSignedAccelerated_                                = {},
+      VULKAN_HPP_NAMESPACE::Bool32 integerDotProduct4x8BitPackedMixedSignednessAccelerated_                       = {},
+      VULKAN_HPP_NAMESPACE::Bool32 integerDotProduct16BitUnsignedAccelerated_                                     = {},
+      VULKAN_HPP_NAMESPACE::Bool32 integerDotProduct16BitSignedAccelerated_                                       = {},
+      VULKAN_HPP_NAMESPACE::Bool32 integerDotProduct16BitMixedSignednessAccelerated_                              = {},
+      VULKAN_HPP_NAMESPACE::Bool32 integerDotProduct32BitUnsignedAccelerated_                                     = {},
+      VULKAN_HPP_NAMESPACE::Bool32 integerDotProduct32BitSignedAccelerated_                                       = {},
+      VULKAN_HPP_NAMESPACE::Bool32 integerDotProduct32BitMixedSignednessAccelerated_                              = {},
+      VULKAN_HPP_NAMESPACE::Bool32 integerDotProduct64BitUnsignedAccelerated_                                     = {},
+      VULKAN_HPP_NAMESPACE::Bool32 integerDotProduct64BitSignedAccelerated_                                       = {},
+      VULKAN_HPP_NAMESPACE::Bool32 integerDotProduct64BitMixedSignednessAccelerated_                              = {},
+      VULKAN_HPP_NAMESPACE::Bool32 integerDotProductAccumulatingSaturating8BitUnsignedAccelerated_                = {},
+      VULKAN_HPP_NAMESPACE::Bool32 integerDotProductAccumulatingSaturating8BitSignedAccelerated_                  = {},
+      VULKAN_HPP_NAMESPACE::Bool32 integerDotProductAccumulatingSaturating8BitMixedSignednessAccelerated_         = {},
+      VULKAN_HPP_NAMESPACE::Bool32 integerDotProductAccumulatingSaturating4x8BitPackedUnsignedAccelerated_        = {},
+      VULKAN_HPP_NAMESPACE::Bool32 integerDotProductAccumulatingSaturating4x8BitPackedSignedAccelerated_          = {},
+      VULKAN_HPP_NAMESPACE::Bool32 integerDotProductAccumulatingSaturating4x8BitPackedMixedSignednessAccelerated_ = {},
+      VULKAN_HPP_NAMESPACE::Bool32 integerDotProductAccumulatingSaturating16BitUnsignedAccelerated_               = {},
+      VULKAN_HPP_NAMESPACE::Bool32 integerDotProductAccumulatingSaturating16BitSignedAccelerated_                 = {},
+      VULKAN_HPP_NAMESPACE::Bool32 integerDotProductAccumulatingSaturating16BitMixedSignednessAccelerated_        = {},
+      VULKAN_HPP_NAMESPACE::Bool32 integerDotProductAccumulatingSaturating32BitUnsignedAccelerated_               = {},
+      VULKAN_HPP_NAMESPACE::Bool32 integerDotProductAccumulatingSaturating32BitSignedAccelerated_                 = {},
+      VULKAN_HPP_NAMESPACE::Bool32 integerDotProductAccumulatingSaturating32BitMixedSignednessAccelerated_        = {},
+      VULKAN_HPP_NAMESPACE::Bool32 integerDotProductAccumulatingSaturating64BitUnsignedAccelerated_               = {},
+      VULKAN_HPP_NAMESPACE::Bool32 integerDotProductAccumulatingSaturating64BitSignedAccelerated_                 = {},
+      VULKAN_HPP_NAMESPACE::Bool32 integerDotProductAccumulatingSaturating64BitMixedSignednessAccelerated_        = {} )
+      VULKAN_HPP_NOEXCEPT
+      : integerDotProduct8BitUnsignedAccelerated( integerDotProduct8BitUnsignedAccelerated_ )
+      , integerDotProduct8BitSignedAccelerated( integerDotProduct8BitSignedAccelerated_ )
+      , integerDotProduct8BitMixedSignednessAccelerated( integerDotProduct8BitMixedSignednessAccelerated_ )
+      , integerDotProduct4x8BitPackedUnsignedAccelerated( integerDotProduct4x8BitPackedUnsignedAccelerated_ )
+      , integerDotProduct4x8BitPackedSignedAccelerated( integerDotProduct4x8BitPackedSignedAccelerated_ )
+      , integerDotProduct4x8BitPackedMixedSignednessAccelerated(
+          integerDotProduct4x8BitPackedMixedSignednessAccelerated_ )
+      , integerDotProduct16BitUnsignedAccelerated( integerDotProduct16BitUnsignedAccelerated_ )
+      , integerDotProduct16BitSignedAccelerated( integerDotProduct16BitSignedAccelerated_ )
+      , integerDotProduct16BitMixedSignednessAccelerated( integerDotProduct16BitMixedSignednessAccelerated_ )
+      , integerDotProduct32BitUnsignedAccelerated( integerDotProduct32BitUnsignedAccelerated_ )
+      , integerDotProduct32BitSignedAccelerated( integerDotProduct32BitSignedAccelerated_ )
+      , integerDotProduct32BitMixedSignednessAccelerated( integerDotProduct32BitMixedSignednessAccelerated_ )
+      , integerDotProduct64BitUnsignedAccelerated( integerDotProduct64BitUnsignedAccelerated_ )
+      , integerDotProduct64BitSignedAccelerated( integerDotProduct64BitSignedAccelerated_ )
+      , integerDotProduct64BitMixedSignednessAccelerated( integerDotProduct64BitMixedSignednessAccelerated_ )
+      , integerDotProductAccumulatingSaturating8BitUnsignedAccelerated(
+          integerDotProductAccumulatingSaturating8BitUnsignedAccelerated_ )
+      , integerDotProductAccumulatingSaturating8BitSignedAccelerated(
+          integerDotProductAccumulatingSaturating8BitSignedAccelerated_ )
+      , integerDotProductAccumulatingSaturating8BitMixedSignednessAccelerated(
+          integerDotProductAccumulatingSaturating8BitMixedSignednessAccelerated_ )
+      , integerDotProductAccumulatingSaturating4x8BitPackedUnsignedAccelerated(
+          integerDotProductAccumulatingSaturating4x8BitPackedUnsignedAccelerated_ )
+      , integerDotProductAccumulatingSaturating4x8BitPackedSignedAccelerated(
+          integerDotProductAccumulatingSaturating4x8BitPackedSignedAccelerated_ )
+      , integerDotProductAccumulatingSaturating4x8BitPackedMixedSignednessAccelerated(
+          integerDotProductAccumulatingSaturating4x8BitPackedMixedSignednessAccelerated_ )
+      , integerDotProductAccumulatingSaturating16BitUnsignedAccelerated(
+          integerDotProductAccumulatingSaturating16BitUnsignedAccelerated_ )
+      , integerDotProductAccumulatingSaturating16BitSignedAccelerated(
+          integerDotProductAccumulatingSaturating16BitSignedAccelerated_ )
+      , integerDotProductAccumulatingSaturating16BitMixedSignednessAccelerated(
+          integerDotProductAccumulatingSaturating16BitMixedSignednessAccelerated_ )
+      , integerDotProductAccumulatingSaturating32BitUnsignedAccelerated(
+          integerDotProductAccumulatingSaturating32BitUnsignedAccelerated_ )
+      , integerDotProductAccumulatingSaturating32BitSignedAccelerated(
+          integerDotProductAccumulatingSaturating32BitSignedAccelerated_ )
+      , integerDotProductAccumulatingSaturating32BitMixedSignednessAccelerated(
+          integerDotProductAccumulatingSaturating32BitMixedSignednessAccelerated_ )
+      , integerDotProductAccumulatingSaturating64BitUnsignedAccelerated(
+          integerDotProductAccumulatingSaturating64BitUnsignedAccelerated_ )
+      , integerDotProductAccumulatingSaturating64BitSignedAccelerated(
+          integerDotProductAccumulatingSaturating64BitSignedAccelerated_ )
+      , integerDotProductAccumulatingSaturating64BitMixedSignednessAccelerated(
+          integerDotProductAccumulatingSaturating64BitMixedSignednessAccelerated_ )
+    {}
+
+    VULKAN_HPP_CONSTEXPR PhysicalDeviceShaderIntegerDotProductPropertiesKHR(
+      PhysicalDeviceShaderIntegerDotProductPropertiesKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;
+
+    PhysicalDeviceShaderIntegerDotProductPropertiesKHR(
+      VkPhysicalDeviceShaderIntegerDotProductPropertiesKHR const & rhs ) VULKAN_HPP_NOEXCEPT
+      : PhysicalDeviceShaderIntegerDotProductPropertiesKHR(
+          *reinterpret_cast<PhysicalDeviceShaderIntegerDotProductPropertiesKHR const *>( &rhs ) )
+    {}
+#endif /*VULKAN_HPP_NO_STRUCT_CONSTRUCTORS*/
+
+    VULKAN_HPP_CONSTEXPR_14 PhysicalDeviceShaderIntegerDotProductPropertiesKHR &
+                            operator=( PhysicalDeviceShaderIntegerDotProductPropertiesKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;
+
+    PhysicalDeviceShaderIntegerDotProductPropertiesKHR &
+      operator=( VkPhysicalDeviceShaderIntegerDotProductPropertiesKHR const & rhs ) VULKAN_HPP_NOEXCEPT
+    {
+      *this =
+        *reinterpret_cast<VULKAN_HPP_NAMESPACE::PhysicalDeviceShaderIntegerDotProductPropertiesKHR const *>( &rhs );
+      return *this;
+    }
+
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
+    PhysicalDeviceShaderIntegerDotProductPropertiesKHR & setPNext( void * pNext_ ) VULKAN_HPP_NOEXCEPT
+    {
+      pNext = pNext_;
+      return *this;
+    }
+
+    PhysicalDeviceShaderIntegerDotProductPropertiesKHR & setIntegerDotProduct8BitUnsignedAccelerated(
+      VULKAN_HPP_NAMESPACE::Bool32 integerDotProduct8BitUnsignedAccelerated_ ) VULKAN_HPP_NOEXCEPT
+    {
+      integerDotProduct8BitUnsignedAccelerated = integerDotProduct8BitUnsignedAccelerated_;
+      return *this;
+    }
+
+    PhysicalDeviceShaderIntegerDotProductPropertiesKHR & setIntegerDotProduct8BitSignedAccelerated(
+      VULKAN_HPP_NAMESPACE::Bool32 integerDotProduct8BitSignedAccelerated_ ) VULKAN_HPP_NOEXCEPT
+    {
+      integerDotProduct8BitSignedAccelerated = integerDotProduct8BitSignedAccelerated_;
+      return *this;
+    }
+
+    PhysicalDeviceShaderIntegerDotProductPropertiesKHR & setIntegerDotProduct8BitMixedSignednessAccelerated(
+      VULKAN_HPP_NAMESPACE::Bool32 integerDotProduct8BitMixedSignednessAccelerated_ ) VULKAN_HPP_NOEXCEPT
+    {
+      integerDotProduct8BitMixedSignednessAccelerated = integerDotProduct8BitMixedSignednessAccelerated_;
+      return *this;
+    }
+
+    PhysicalDeviceShaderIntegerDotProductPropertiesKHR & setIntegerDotProduct4x8BitPackedUnsignedAccelerated(
+      VULKAN_HPP_NAMESPACE::Bool32 integerDotProduct4x8BitPackedUnsignedAccelerated_ ) VULKAN_HPP_NOEXCEPT
+    {
+      integerDotProduct4x8BitPackedUnsignedAccelerated = integerDotProduct4x8BitPackedUnsignedAccelerated_;
+      return *this;
+    }
+
+    PhysicalDeviceShaderIntegerDotProductPropertiesKHR & setIntegerDotProduct4x8BitPackedSignedAccelerated(
+      VULKAN_HPP_NAMESPACE::Bool32 integerDotProduct4x8BitPackedSignedAccelerated_ ) VULKAN_HPP_NOEXCEPT
+    {
+      integerDotProduct4x8BitPackedSignedAccelerated = integerDotProduct4x8BitPackedSignedAccelerated_;
+      return *this;
+    }
+
+    PhysicalDeviceShaderIntegerDotProductPropertiesKHR & setIntegerDotProduct4x8BitPackedMixedSignednessAccelerated(
+      VULKAN_HPP_NAMESPACE::Bool32 integerDotProduct4x8BitPackedMixedSignednessAccelerated_ ) VULKAN_HPP_NOEXCEPT
+    {
+      integerDotProduct4x8BitPackedMixedSignednessAccelerated =
+        integerDotProduct4x8BitPackedMixedSignednessAccelerated_;
+      return *this;
+    }
+
+    PhysicalDeviceShaderIntegerDotProductPropertiesKHR & setIntegerDotProduct16BitUnsignedAccelerated(
+      VULKAN_HPP_NAMESPACE::Bool32 integerDotProduct16BitUnsignedAccelerated_ ) VULKAN_HPP_NOEXCEPT
+    {
+      integerDotProduct16BitUnsignedAccelerated = integerDotProduct16BitUnsignedAccelerated_;
+      return *this;
+    }
+
+    PhysicalDeviceShaderIntegerDotProductPropertiesKHR & setIntegerDotProduct16BitSignedAccelerated(
+      VULKAN_HPP_NAMESPACE::Bool32 integerDotProduct16BitSignedAccelerated_ ) VULKAN_HPP_NOEXCEPT
+    {
+      integerDotProduct16BitSignedAccelerated = integerDotProduct16BitSignedAccelerated_;
+      return *this;
+    }
+
+    PhysicalDeviceShaderIntegerDotProductPropertiesKHR & setIntegerDotProduct16BitMixedSignednessAccelerated(
+      VULKAN_HPP_NAMESPACE::Bool32 integerDotProduct16BitMixedSignednessAccelerated_ ) VULKAN_HPP_NOEXCEPT
+    {
+      integerDotProduct16BitMixedSignednessAccelerated = integerDotProduct16BitMixedSignednessAccelerated_;
+      return *this;
+    }
+
+    PhysicalDeviceShaderIntegerDotProductPropertiesKHR & setIntegerDotProduct32BitUnsignedAccelerated(
+      VULKAN_HPP_NAMESPACE::Bool32 integerDotProduct32BitUnsignedAccelerated_ ) VULKAN_HPP_NOEXCEPT
+    {
+      integerDotProduct32BitUnsignedAccelerated = integerDotProduct32BitUnsignedAccelerated_;
+      return *this;
+    }
+
+    PhysicalDeviceShaderIntegerDotProductPropertiesKHR & setIntegerDotProduct32BitSignedAccelerated(
+      VULKAN_HPP_NAMESPACE::Bool32 integerDotProduct32BitSignedAccelerated_ ) VULKAN_HPP_NOEXCEPT
+    {
+      integerDotProduct32BitSignedAccelerated = integerDotProduct32BitSignedAccelerated_;
+      return *this;
+    }
+
+    PhysicalDeviceShaderIntegerDotProductPropertiesKHR & setIntegerDotProduct32BitMixedSignednessAccelerated(
+      VULKAN_HPP_NAMESPACE::Bool32 integerDotProduct32BitMixedSignednessAccelerated_ ) VULKAN_HPP_NOEXCEPT
+    {
+      integerDotProduct32BitMixedSignednessAccelerated = integerDotProduct32BitMixedSignednessAccelerated_;
+      return *this;
+    }
+
+    PhysicalDeviceShaderIntegerDotProductPropertiesKHR & setIntegerDotProduct64BitUnsignedAccelerated(
+      VULKAN_HPP_NAMESPACE::Bool32 integerDotProduct64BitUnsignedAccelerated_ ) VULKAN_HPP_NOEXCEPT
+    {
+      integerDotProduct64BitUnsignedAccelerated = integerDotProduct64BitUnsignedAccelerated_;
+      return *this;
+    }
+
+    PhysicalDeviceShaderIntegerDotProductPropertiesKHR & setIntegerDotProduct64BitSignedAccelerated(
+      VULKAN_HPP_NAMESPACE::Bool32 integerDotProduct64BitSignedAccelerated_ ) VULKAN_HPP_NOEXCEPT
+    {
+      integerDotProduct64BitSignedAccelerated = integerDotProduct64BitSignedAccelerated_;
+      return *this;
+    }
+
+    PhysicalDeviceShaderIntegerDotProductPropertiesKHR & setIntegerDotProduct64BitMixedSignednessAccelerated(
+      VULKAN_HPP_NAMESPACE::Bool32 integerDotProduct64BitMixedSignednessAccelerated_ ) VULKAN_HPP_NOEXCEPT
+    {
+      integerDotProduct64BitMixedSignednessAccelerated = integerDotProduct64BitMixedSignednessAccelerated_;
+      return *this;
+    }
+
+    PhysicalDeviceShaderIntegerDotProductPropertiesKHR &
+      setIntegerDotProductAccumulatingSaturating8BitUnsignedAccelerated(
+        VULKAN_HPP_NAMESPACE::Bool32 integerDotProductAccumulatingSaturating8BitUnsignedAccelerated_ )
+        VULKAN_HPP_NOEXCEPT
+    {
+      integerDotProductAccumulatingSaturating8BitUnsignedAccelerated =
+        integerDotProductAccumulatingSaturating8BitUnsignedAccelerated_;
+      return *this;
+    }
+
+    PhysicalDeviceShaderIntegerDotProductPropertiesKHR &
+      setIntegerDotProductAccumulatingSaturating8BitSignedAccelerated(
+        VULKAN_HPP_NAMESPACE::Bool32 integerDotProductAccumulatingSaturating8BitSignedAccelerated_ ) VULKAN_HPP_NOEXCEPT
+    {
+      integerDotProductAccumulatingSaturating8BitSignedAccelerated =
+        integerDotProductAccumulatingSaturating8BitSignedAccelerated_;
+      return *this;
+    }
+
+    PhysicalDeviceShaderIntegerDotProductPropertiesKHR &
+      setIntegerDotProductAccumulatingSaturating8BitMixedSignednessAccelerated(
+        VULKAN_HPP_NAMESPACE::Bool32 integerDotProductAccumulatingSaturating8BitMixedSignednessAccelerated_ )
+        VULKAN_HPP_NOEXCEPT
+    {
+      integerDotProductAccumulatingSaturating8BitMixedSignednessAccelerated =
+        integerDotProductAccumulatingSaturating8BitMixedSignednessAccelerated_;
+      return *this;
+    }
+
+    PhysicalDeviceShaderIntegerDotProductPropertiesKHR &
+      setIntegerDotProductAccumulatingSaturating4x8BitPackedUnsignedAccelerated(
+        VULKAN_HPP_NAMESPACE::Bool32 integerDotProductAccumulatingSaturating4x8BitPackedUnsignedAccelerated_ )
+        VULKAN_HPP_NOEXCEPT
+    {
+      integerDotProductAccumulatingSaturating4x8BitPackedUnsignedAccelerated =
+        integerDotProductAccumulatingSaturating4x8BitPackedUnsignedAccelerated_;
+      return *this;
+    }
+
+    PhysicalDeviceShaderIntegerDotProductPropertiesKHR &
+      setIntegerDotProductAccumulatingSaturating4x8BitPackedSignedAccelerated(
+        VULKAN_HPP_NAMESPACE::Bool32 integerDotProductAccumulatingSaturating4x8BitPackedSignedAccelerated_ )
+        VULKAN_HPP_NOEXCEPT
+    {
+      integerDotProductAccumulatingSaturating4x8BitPackedSignedAccelerated =
+        integerDotProductAccumulatingSaturating4x8BitPackedSignedAccelerated_;
+      return *this;
+    }
+
+    PhysicalDeviceShaderIntegerDotProductPropertiesKHR &
+      setIntegerDotProductAccumulatingSaturating4x8BitPackedMixedSignednessAccelerated(
+        VULKAN_HPP_NAMESPACE::Bool32 integerDotProductAccumulatingSaturating4x8BitPackedMixedSignednessAccelerated_ )
+        VULKAN_HPP_NOEXCEPT
+    {
+      integerDotProductAccumulatingSaturating4x8BitPackedMixedSignednessAccelerated =
+        integerDotProductAccumulatingSaturating4x8BitPackedMixedSignednessAccelerated_;
+      return *this;
+    }
+
+    PhysicalDeviceShaderIntegerDotProductPropertiesKHR &
+      setIntegerDotProductAccumulatingSaturating16BitUnsignedAccelerated(
+        VULKAN_HPP_NAMESPACE::Bool32 integerDotProductAccumulatingSaturating16BitUnsignedAccelerated_ )
+        VULKAN_HPP_NOEXCEPT
+    {
+      integerDotProductAccumulatingSaturating16BitUnsignedAccelerated =
+        integerDotProductAccumulatingSaturating16BitUnsignedAccelerated_;
+      return *this;
+    }
+
+    PhysicalDeviceShaderIntegerDotProductPropertiesKHR &
+      setIntegerDotProductAccumulatingSaturating16BitSignedAccelerated(
+        VULKAN_HPP_NAMESPACE::Bool32 integerDotProductAccumulatingSaturating16BitSignedAccelerated_ )
+        VULKAN_HPP_NOEXCEPT
+    {
+      integerDotProductAccumulatingSaturating16BitSignedAccelerated =
+        integerDotProductAccumulatingSaturating16BitSignedAccelerated_;
+      return *this;
+    }
+
+    PhysicalDeviceShaderIntegerDotProductPropertiesKHR &
+      setIntegerDotProductAccumulatingSaturating16BitMixedSignednessAccelerated(
+        VULKAN_HPP_NAMESPACE::Bool32 integerDotProductAccumulatingSaturating16BitMixedSignednessAccelerated_ )
+        VULKAN_HPP_NOEXCEPT
+    {
+      integerDotProductAccumulatingSaturating16BitMixedSignednessAccelerated =
+        integerDotProductAccumulatingSaturating16BitMixedSignednessAccelerated_;
+      return *this;
+    }
+
+    PhysicalDeviceShaderIntegerDotProductPropertiesKHR &
+      setIntegerDotProductAccumulatingSaturating32BitUnsignedAccelerated(
+        VULKAN_HPP_NAMESPACE::Bool32 integerDotProductAccumulatingSaturating32BitUnsignedAccelerated_ )
+        VULKAN_HPP_NOEXCEPT
+    {
+      integerDotProductAccumulatingSaturating32BitUnsignedAccelerated =
+        integerDotProductAccumulatingSaturating32BitUnsignedAccelerated_;
+      return *this;
+    }
+
+    PhysicalDeviceShaderIntegerDotProductPropertiesKHR &
+      setIntegerDotProductAccumulatingSaturating32BitSignedAccelerated(
+        VULKAN_HPP_NAMESPACE::Bool32 integerDotProductAccumulatingSaturating32BitSignedAccelerated_ )
+        VULKAN_HPP_NOEXCEPT
+    {
+      integerDotProductAccumulatingSaturating32BitSignedAccelerated =
+        integerDotProductAccumulatingSaturating32BitSignedAccelerated_;
+      return *this;
+    }
+
+    PhysicalDeviceShaderIntegerDotProductPropertiesKHR &
+      setIntegerDotProductAccumulatingSaturating32BitMixedSignednessAccelerated(
+        VULKAN_HPP_NAMESPACE::Bool32 integerDotProductAccumulatingSaturating32BitMixedSignednessAccelerated_ )
+        VULKAN_HPP_NOEXCEPT
+    {
+      integerDotProductAccumulatingSaturating32BitMixedSignednessAccelerated =
+        integerDotProductAccumulatingSaturating32BitMixedSignednessAccelerated_;
+      return *this;
+    }
+
+    PhysicalDeviceShaderIntegerDotProductPropertiesKHR &
+      setIntegerDotProductAccumulatingSaturating64BitUnsignedAccelerated(
+        VULKAN_HPP_NAMESPACE::Bool32 integerDotProductAccumulatingSaturating64BitUnsignedAccelerated_ )
+        VULKAN_HPP_NOEXCEPT
+    {
+      integerDotProductAccumulatingSaturating64BitUnsignedAccelerated =
+        integerDotProductAccumulatingSaturating64BitUnsignedAccelerated_;
+      return *this;
+    }
+
+    PhysicalDeviceShaderIntegerDotProductPropertiesKHR &
+      setIntegerDotProductAccumulatingSaturating64BitSignedAccelerated(
+        VULKAN_HPP_NAMESPACE::Bool32 integerDotProductAccumulatingSaturating64BitSignedAccelerated_ )
+        VULKAN_HPP_NOEXCEPT
+    {
+      integerDotProductAccumulatingSaturating64BitSignedAccelerated =
+        integerDotProductAccumulatingSaturating64BitSignedAccelerated_;
+      return *this;
+    }
+
+    PhysicalDeviceShaderIntegerDotProductPropertiesKHR &
+      setIntegerDotProductAccumulatingSaturating64BitMixedSignednessAccelerated(
+        VULKAN_HPP_NAMESPACE::Bool32 integerDotProductAccumulatingSaturating64BitMixedSignednessAccelerated_ )
+        VULKAN_HPP_NOEXCEPT
+    {
+      integerDotProductAccumulatingSaturating64BitMixedSignednessAccelerated =
+        integerDotProductAccumulatingSaturating64BitMixedSignednessAccelerated_;
+      return *this;
+    }
+#endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
+
+    operator VkPhysicalDeviceShaderIntegerDotProductPropertiesKHR const &() const VULKAN_HPP_NOEXCEPT
+    {
+      return *reinterpret_cast<const VkPhysicalDeviceShaderIntegerDotProductPropertiesKHR *>( this );
+    }
+
+    operator VkPhysicalDeviceShaderIntegerDotProductPropertiesKHR &() VULKAN_HPP_NOEXCEPT
+    {
+      return *reinterpret_cast<VkPhysicalDeviceShaderIntegerDotProductPropertiesKHR *>( this );
+    }
+
+#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )
+    auto operator<=>( PhysicalDeviceShaderIntegerDotProductPropertiesKHR const & ) const = default;
+#else
+    bool operator==( PhysicalDeviceShaderIntegerDotProductPropertiesKHR const & rhs ) const VULKAN_HPP_NOEXCEPT
+    {
+      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) &&
+             ( integerDotProduct8BitUnsignedAccelerated == rhs.integerDotProduct8BitUnsignedAccelerated ) &&
+             ( integerDotProduct8BitSignedAccelerated == rhs.integerDotProduct8BitSignedAccelerated ) &&
+             ( integerDotProduct8BitMixedSignednessAccelerated ==
+               rhs.integerDotProduct8BitMixedSignednessAccelerated ) &&
+             ( integerDotProduct4x8BitPackedUnsignedAccelerated ==
+               rhs.integerDotProduct4x8BitPackedUnsignedAccelerated ) &&
+             ( integerDotProduct4x8BitPackedSignedAccelerated == rhs.integerDotProduct4x8BitPackedSignedAccelerated ) &&
+             ( integerDotProduct4x8BitPackedMixedSignednessAccelerated ==
+               rhs.integerDotProduct4x8BitPackedMixedSignednessAccelerated ) &&
+             ( integerDotProduct16BitUnsignedAccelerated == rhs.integerDotProduct16BitUnsignedAccelerated ) &&
+             ( integerDotProduct16BitSignedAccelerated == rhs.integerDotProduct16BitSignedAccelerated ) &&
+             ( integerDotProduct16BitMixedSignednessAccelerated ==
+               rhs.integerDotProduct16BitMixedSignednessAccelerated ) &&
+             ( integerDotProduct32BitUnsignedAccelerated == rhs.integerDotProduct32BitUnsignedAccelerated ) &&
+             ( integerDotProduct32BitSignedAccelerated == rhs.integerDotProduct32BitSignedAccelerated ) &&
+             ( integerDotProduct32BitMixedSignednessAccelerated ==
+               rhs.integerDotProduct32BitMixedSignednessAccelerated ) &&
+             ( integerDotProduct64BitUnsignedAccelerated == rhs.integerDotProduct64BitUnsignedAccelerated ) &&
+             ( integerDotProduct64BitSignedAccelerated == rhs.integerDotProduct64BitSignedAccelerated ) &&
+             ( integerDotProduct64BitMixedSignednessAccelerated ==
+               rhs.integerDotProduct64BitMixedSignednessAccelerated ) &&
+             ( integerDotProductAccumulatingSaturating8BitUnsignedAccelerated ==
+               rhs.integerDotProductAccumulatingSaturating8BitUnsignedAccelerated ) &&
+             ( integerDotProductAccumulatingSaturating8BitSignedAccelerated ==
+               rhs.integerDotProductAccumulatingSaturating8BitSignedAccelerated ) &&
+             ( integerDotProductAccumulatingSaturating8BitMixedSignednessAccelerated ==
+               rhs.integerDotProductAccumulatingSaturating8BitMixedSignednessAccelerated ) &&
+             ( integerDotProductAccumulatingSaturating4x8BitPackedUnsignedAccelerated ==
+               rhs.integerDotProductAccumulatingSaturating4x8BitPackedUnsignedAccelerated ) &&
+             ( integerDotProductAccumulatingSaturating4x8BitPackedSignedAccelerated ==
+               rhs.integerDotProductAccumulatingSaturating4x8BitPackedSignedAccelerated ) &&
+             ( integerDotProductAccumulatingSaturating4x8BitPackedMixedSignednessAccelerated ==
+               rhs.integerDotProductAccumulatingSaturating4x8BitPackedMixedSignednessAccelerated ) &&
+             ( integerDotProductAccumulatingSaturating16BitUnsignedAccelerated ==
+               rhs.integerDotProductAccumulatingSaturating16BitUnsignedAccelerated ) &&
+             ( integerDotProductAccumulatingSaturating16BitSignedAccelerated ==
+               rhs.integerDotProductAccumulatingSaturating16BitSignedAccelerated ) &&
+             ( integerDotProductAccumulatingSaturating16BitMixedSignednessAccelerated ==
+               rhs.integerDotProductAccumulatingSaturating16BitMixedSignednessAccelerated ) &&
+             ( integerDotProductAccumulatingSaturating32BitUnsignedAccelerated ==
+               rhs.integerDotProductAccumulatingSaturating32BitUnsignedAccelerated ) &&
+             ( integerDotProductAccumulatingSaturating32BitSignedAccelerated ==
+               rhs.integerDotProductAccumulatingSaturating32BitSignedAccelerated ) &&
+             ( integerDotProductAccumulatingSaturating32BitMixedSignednessAccelerated ==
+               rhs.integerDotProductAccumulatingSaturating32BitMixedSignednessAccelerated ) &&
+             ( integerDotProductAccumulatingSaturating64BitUnsignedAccelerated ==
+               rhs.integerDotProductAccumulatingSaturating64BitUnsignedAccelerated ) &&
+             ( integerDotProductAccumulatingSaturating64BitSignedAccelerated ==
+               rhs.integerDotProductAccumulatingSaturating64BitSignedAccelerated ) &&
+             ( integerDotProductAccumulatingSaturating64BitMixedSignednessAccelerated ==
+               rhs.integerDotProductAccumulatingSaturating64BitMixedSignednessAccelerated );
+    }
+
+    bool operator!=( PhysicalDeviceShaderIntegerDotProductPropertiesKHR const & rhs ) const VULKAN_HPP_NOEXCEPT
+    {
+      return !operator==( rhs );
+    }
+#endif
+
+  public:
+    VULKAN_HPP_NAMESPACE::StructureType sType = StructureType::ePhysicalDeviceShaderIntegerDotProductPropertiesKHR;
+    void *                              pNext = {};
+    VULKAN_HPP_NAMESPACE::Bool32        integerDotProduct8BitUnsignedAccelerated                               = {};
+    VULKAN_HPP_NAMESPACE::Bool32        integerDotProduct8BitSignedAccelerated                                 = {};
+    VULKAN_HPP_NAMESPACE::Bool32        integerDotProduct8BitMixedSignednessAccelerated                        = {};
+    VULKAN_HPP_NAMESPACE::Bool32        integerDotProduct4x8BitPackedUnsignedAccelerated                       = {};
+    VULKAN_HPP_NAMESPACE::Bool32        integerDotProduct4x8BitPackedSignedAccelerated                         = {};
+    VULKAN_HPP_NAMESPACE::Bool32        integerDotProduct4x8BitPackedMixedSignednessAccelerated                = {};
+    VULKAN_HPP_NAMESPACE::Bool32        integerDotProduct16BitUnsignedAccelerated                              = {};
+    VULKAN_HPP_NAMESPACE::Bool32        integerDotProduct16BitSignedAccelerated                                = {};
+    VULKAN_HPP_NAMESPACE::Bool32        integerDotProduct16BitMixedSignednessAccelerated                       = {};
+    VULKAN_HPP_NAMESPACE::Bool32        integerDotProduct32BitUnsignedAccelerated                              = {};
+    VULKAN_HPP_NAMESPACE::Bool32        integerDotProduct32BitSignedAccelerated                                = {};
+    VULKAN_HPP_NAMESPACE::Bool32        integerDotProduct32BitMixedSignednessAccelerated                       = {};
+    VULKAN_HPP_NAMESPACE::Bool32        integerDotProduct64BitUnsignedAccelerated                              = {};
+    VULKAN_HPP_NAMESPACE::Bool32        integerDotProduct64BitSignedAccelerated                                = {};
+    VULKAN_HPP_NAMESPACE::Bool32        integerDotProduct64BitMixedSignednessAccelerated                       = {};
+    VULKAN_HPP_NAMESPACE::Bool32        integerDotProductAccumulatingSaturating8BitUnsignedAccelerated         = {};
+    VULKAN_HPP_NAMESPACE::Bool32        integerDotProductAccumulatingSaturating8BitSignedAccelerated           = {};
+    VULKAN_HPP_NAMESPACE::Bool32        integerDotProductAccumulatingSaturating8BitMixedSignednessAccelerated  = {};
+    VULKAN_HPP_NAMESPACE::Bool32        integerDotProductAccumulatingSaturating4x8BitPackedUnsignedAccelerated = {};
+    VULKAN_HPP_NAMESPACE::Bool32        integerDotProductAccumulatingSaturating4x8BitPackedSignedAccelerated   = {};
+    VULKAN_HPP_NAMESPACE::Bool32 integerDotProductAccumulatingSaturating4x8BitPackedMixedSignednessAccelerated = {};
+    VULKAN_HPP_NAMESPACE::Bool32 integerDotProductAccumulatingSaturating16BitUnsignedAccelerated               = {};
+    VULKAN_HPP_NAMESPACE::Bool32 integerDotProductAccumulatingSaturating16BitSignedAccelerated                 = {};
+    VULKAN_HPP_NAMESPACE::Bool32 integerDotProductAccumulatingSaturating16BitMixedSignednessAccelerated        = {};
+    VULKAN_HPP_NAMESPACE::Bool32 integerDotProductAccumulatingSaturating32BitUnsignedAccelerated               = {};
+    VULKAN_HPP_NAMESPACE::Bool32 integerDotProductAccumulatingSaturating32BitSignedAccelerated                 = {};
+    VULKAN_HPP_NAMESPACE::Bool32 integerDotProductAccumulatingSaturating32BitMixedSignednessAccelerated        = {};
+    VULKAN_HPP_NAMESPACE::Bool32 integerDotProductAccumulatingSaturating64BitUnsignedAccelerated               = {};
+    VULKAN_HPP_NAMESPACE::Bool32 integerDotProductAccumulatingSaturating64BitSignedAccelerated                 = {};
+    VULKAN_HPP_NAMESPACE::Bool32 integerDotProductAccumulatingSaturating64BitMixedSignednessAccelerated        = {};
+  };
+  static_assert( sizeof( PhysicalDeviceShaderIntegerDotProductPropertiesKHR ) ==
+                   sizeof( VkPhysicalDeviceShaderIntegerDotProductPropertiesKHR ),
+                 "struct and wrapper have different size!" );
+  static_assert( std::is_standard_layout<PhysicalDeviceShaderIntegerDotProductPropertiesKHR>::value,
+                 "struct wrapper is not a standard layout!" );
+
+  template <>
+  struct CppType<StructureType, StructureType::ePhysicalDeviceShaderIntegerDotProductPropertiesKHR>
+  {
+    using Type = PhysicalDeviceShaderIntegerDotProductPropertiesKHR;
+  };
+
   struct PhysicalDeviceShaderIntegerFunctions2FeaturesINTEL
   {
     static const bool                    allowDuplicate = false;
@@ -46326,6 +48218,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     PhysicalDeviceShaderIntegerFunctions2FeaturesINTEL & setPNext( void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -46338,6 +48231,7 @@
       shaderIntegerFunctions2 = shaderIntegerFunctions2_;
       return *this;
     }
+#endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkPhysicalDeviceShaderIntegerFunctions2FeaturesINTEL const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -46412,6 +48306,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     PhysicalDeviceShaderSMBuiltinsFeaturesNV & setPNext( void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -46424,6 +48319,7 @@
       shaderSMBuiltins = shaderSMBuiltins_;
       return *this;
     }
+#endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkPhysicalDeviceShaderSMBuiltinsFeaturesNV const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -46576,6 +48472,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     PhysicalDeviceShaderSubgroupExtendedTypesFeatures & setPNext( void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -46588,6 +48485,7 @@
       shaderSubgroupExtendedTypes = shaderSubgroupExtendedTypes_;
       return *this;
     }
+#endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkPhysicalDeviceShaderSubgroupExtendedTypesFeatures const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -46666,6 +48564,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     PhysicalDeviceShaderSubgroupUniformControlFlowFeaturesKHR & setPNext( void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -46678,6 +48577,7 @@
       shaderSubgroupUniformControlFlow = shaderSubgroupUniformControlFlow_;
       return *this;
     }
+#endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkPhysicalDeviceShaderSubgroupUniformControlFlowFeaturesKHR const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -46755,6 +48655,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     PhysicalDeviceShaderTerminateInvocationFeaturesKHR & setPNext( void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -46767,6 +48668,7 @@
       shaderTerminateInvocation = shaderTerminateInvocation_;
       return *this;
     }
+#endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkPhysicalDeviceShaderTerminateInvocationFeaturesKHR const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -46844,6 +48746,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     PhysicalDeviceShadingRateImageFeaturesNV & setPNext( void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -46863,6 +48766,7 @@
       shadingRateCoarseSampleOrder = shadingRateCoarseSampleOrder_;
       return *this;
     }
+#endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkPhysicalDeviceShadingRateImageFeaturesNV const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -47026,6 +48930,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     PhysicalDeviceSparseImageFormatInfo2 & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -47062,6 +48967,7 @@
       tiling = tiling_;
       return *this;
     }
+#endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkPhysicalDeviceSparseImageFormatInfo2 const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -47222,6 +49128,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     PhysicalDeviceSubgroupSizeControlFeaturesEXT & setPNext( void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -47241,6 +49148,7 @@
       computeFullSubgroups = computeFullSubgroups_;
       return *this;
     }
+#endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkPhysicalDeviceSubgroupSizeControlFeaturesEXT const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -47401,6 +49309,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     PhysicalDeviceSubpassShadingFeaturesHUAWEI & setPNext( void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -47413,6 +49322,7 @@
       subpassShading = subpassShading_;
       return *this;
     }
+#endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkPhysicalDeviceSubpassShadingFeaturesHUAWEI const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -47557,6 +49467,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     PhysicalDeviceSurfaceInfo2KHR & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -47568,6 +49479,7 @@
       surface = surface_;
       return *this;
     }
+#endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkPhysicalDeviceSurfaceInfo2KHR const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -47640,6 +49552,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     PhysicalDeviceSynchronization2FeaturesKHR & setPNext( void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -47652,6 +49565,7 @@
       synchronization2 = synchronization2_;
       return *this;
     }
+#endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkPhysicalDeviceSynchronization2FeaturesKHR const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -47726,6 +49640,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     PhysicalDeviceTexelBufferAlignmentFeaturesEXT & setPNext( void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -47738,6 +49653,7 @@
       texelBufferAlignment = texelBufferAlignment_;
       return *this;
     }
+#endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkPhysicalDeviceTexelBufferAlignmentFeaturesEXT const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -47899,6 +49815,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     PhysicalDeviceTextureCompressionASTCHDRFeaturesEXT & setPNext( void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -47911,6 +49828,7 @@
       textureCompressionASTC_HDR = textureCompressionASTC_HDR_;
       return *this;
     }
+#endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkPhysicalDeviceTextureCompressionASTCHDRFeaturesEXT const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -47984,6 +49902,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     PhysicalDeviceTimelineSemaphoreFeatures & setPNext( void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -47996,6 +49915,7 @@
       timelineSemaphore = timelineSemaphore_;
       return *this;
     }
+#endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkPhysicalDeviceTimelineSemaphoreFeatures const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -48228,6 +50148,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     PhysicalDeviceTransformFeedbackFeaturesEXT & setPNext( void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -48247,6 +50168,7 @@
       geometryStreams = geometryStreams_;
       return *this;
     }
+#endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkPhysicalDeviceTransformFeedbackFeaturesEXT const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -48434,6 +50356,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     PhysicalDeviceUniformBufferStandardLayoutFeatures & setPNext( void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -48446,6 +50369,7 @@
       uniformBufferStandardLayout = uniformBufferStandardLayout_;
       return *this;
     }
+#endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkPhysicalDeviceUniformBufferStandardLayoutFeatures const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -48523,6 +50447,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     PhysicalDeviceVariablePointersFeatures & setPNext( void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -48542,6 +50467,7 @@
       variablePointers = variablePointers_;
       return *this;
     }
+#endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkPhysicalDeviceVariablePointersFeatures const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -48623,6 +50549,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     PhysicalDeviceVertexAttributeDivisorFeaturesEXT & setPNext( void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -48642,6 +50569,7 @@
       vertexAttributeInstanceRateZeroDivisor = vertexAttributeInstanceRateZeroDivisor_;
       return *this;
     }
+#endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkPhysicalDeviceVertexAttributeDivisorFeaturesEXT const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -48794,6 +50722,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     PhysicalDeviceVertexInputDynamicStateFeaturesEXT & setPNext( void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -48806,6 +50735,7 @@
       vertexInputDynamicState = vertexInputDynamicState_;
       return *this;
     }
+#endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkPhysicalDeviceVertexInputDynamicStateFeaturesEXT const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -48883,6 +50813,7 @@
       return *this;
     }
 
+#  if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     VideoProfileKHR & setPNext( void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -48916,6 +50847,7 @@
       chromaBitDepth = chromaBitDepth_;
       return *this;
     }
+#  endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkVideoProfileKHR const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -48991,6 +50923,7 @@
       return *this;
     }
 
+#  if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     VideoProfilesKHR & setPNext( void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -49008,6 +50941,7 @@
       pProfiles = pProfiles_;
       return *this;
     }
+#  endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkVideoProfilesKHR const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -49175,6 +51109,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     PhysicalDeviceVulkan11Features & setPNext( void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -49263,6 +51198,7 @@
       shaderDrawParameters = shaderDrawParameters_;
       return *this;
     }
+#endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkPhysicalDeviceVulkan11Features const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -49567,6 +51503,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     PhysicalDeviceVulkan12Features & setPNext( void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -49899,6 +51836,7 @@
       subgroupBroadcastDynamicId = subgroupBroadcastDynamicId_;
       return *this;
     }
+#endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkPhysicalDeviceVulkan12Features const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -50356,6 +52294,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     PhysicalDeviceVulkanMemoryModelFeatures & setPNext( void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -50382,6 +52321,7 @@
       vulkanMemoryModelAvailabilityVisibilityChains = vulkanMemoryModelAvailabilityVisibilityChains_;
       return *this;
     }
+#endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkPhysicalDeviceVulkanMemoryModelFeatures const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -50468,6 +52408,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     PhysicalDeviceWorkgroupMemoryExplicitLayoutFeaturesKHR & setPNext( void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -50501,6 +52442,7 @@
       workgroupMemoryExplicitLayout16BitAccess = workgroupMemoryExplicitLayout16BitAccess_;
       return *this;
     }
+#endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkPhysicalDeviceWorkgroupMemoryExplicitLayoutFeaturesKHR const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -50582,6 +52524,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     PhysicalDeviceYcbcr2Plane444FormatsFeaturesEXT & setPNext( void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -50594,6 +52537,7 @@
       ycbcr2plane444Formats = ycbcr2plane444Formats_;
       return *this;
     }
+#endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkPhysicalDeviceYcbcr2Plane444FormatsFeaturesEXT const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -50667,6 +52611,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     PhysicalDeviceYcbcrImageArraysFeaturesEXT & setPNext( void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -50679,6 +52624,7 @@
       ycbcrImageArrays = ycbcrImageArrays_;
       return *this;
     }
+#endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkPhysicalDeviceYcbcrImageArraysFeaturesEXT const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -50754,6 +52700,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     PhysicalDeviceZeroInitializeWorkgroupMemoryFeaturesKHR & setPNext( void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -50766,6 +52713,7 @@
       shaderZeroInitializeWorkgroupMemory = shaderZeroInitializeWorkgroupMemory_;
       return *this;
     }
+#endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkPhysicalDeviceZeroInitializeWorkgroupMemoryFeaturesKHR const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -50847,6 +52795,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     PipelineCacheCreateInfo & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -50871,7 +52820,7 @@
       return *this;
     }
 
-#if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )
+#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )
     template <typename T>
     PipelineCacheCreateInfo &
       setInitialData( VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const T> const & initialData_ ) VULKAN_HPP_NOEXCEPT
@@ -50880,7 +52829,8 @@
       pInitialData    = initialData_.data();
       return *this;
     }
-#endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/
+#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/
+#endif   /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkPipelineCacheCreateInfo const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -50958,6 +52908,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     PipelineCacheHeaderVersionOne & setHeaderSize( uint32_t headerSize_ ) VULKAN_HPP_NOEXCEPT
     {
       headerSize = headerSize_;
@@ -50989,6 +52940,7 @@
       pipelineCacheUUID = pipelineCacheUUID_;
       return *this;
     }
+#endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkPipelineCacheHeaderVersionOne const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -51066,6 +53018,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     PipelineColorBlendAdvancedStateCreateInfoEXT & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -51092,6 +53045,7 @@
       blendOverlap = blendOverlap_;
       return *this;
     }
+#endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkPipelineColorBlendAdvancedStateCreateInfoEXT const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -51175,6 +53129,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     PipelineColorWriteCreateInfoEXT & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -51194,7 +53149,7 @@
       return *this;
     }
 
-#if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )
+#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )
     PipelineColorWriteCreateInfoEXT & setColorWriteEnables(
       VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::Bool32> const & colorWriteEnables_ )
       VULKAN_HPP_NOEXCEPT
@@ -51203,7 +53158,8 @@
       pColorWriteEnables = colorWriteEnables_.data();
       return *this;
     }
-#endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/
+#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/
+#endif   /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkPipelineColorWriteCreateInfoEXT const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -51277,6 +53233,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     PipelineCompilerControlCreateInfoAMD & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -51289,6 +53246,7 @@
       compilerControlFlags = compilerControlFlags_;
       return *this;
     }
+#endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkPipelineCompilerControlCreateInfoAMD const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -51385,6 +53343,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     PipelineCoverageModulationStateCreateInfoNV & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -51426,7 +53385,7 @@
       return *this;
     }
 
-#if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )
+#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )
     PipelineCoverageModulationStateCreateInfoNV & setCoverageModulationTable(
       VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const float> const & coverageModulationTable_ ) VULKAN_HPP_NOEXCEPT
     {
@@ -51434,7 +53393,8 @@
       pCoverageModulationTable     = coverageModulationTable_.data();
       return *this;
     }
-#endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/
+#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/
+#endif   /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkPipelineCoverageModulationStateCreateInfoNV const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -51521,6 +53481,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     PipelineCoverageReductionStateCreateInfoNV & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -51540,6 +53501,7 @@
       coverageReductionMode = coverageReductionMode_;
       return *this;
     }
+#endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkPipelineCoverageReductionStateCreateInfoNV const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -51621,6 +53583,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     PipelineCoverageToColorStateCreateInfoNV & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -51647,6 +53610,7 @@
       coverageToColorLocation = coverageToColorLocation_;
       return *this;
     }
+#endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkPipelineCoverageToColorStateCreateInfoNV const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -51799,6 +53763,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     PipelineCreationFeedbackCreateInfoEXT & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -51826,7 +53791,7 @@
       return *this;
     }
 
-#if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )
+#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )
     PipelineCreationFeedbackCreateInfoEXT & setPipelineStageCreationFeedbacks(
       VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<VULKAN_HPP_NAMESPACE::PipelineCreationFeedbackEXT> const &
         pipelineStageCreationFeedbacks_ ) VULKAN_HPP_NOEXCEPT
@@ -51835,7 +53800,8 @@
       pPipelineStageCreationFeedbacks    = pipelineStageCreationFeedbacks_.data();
       return *this;
     }
-#endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/
+#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/
+#endif   /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkPipelineCreationFeedbackCreateInfoEXT const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -51933,6 +53899,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     PipelineDiscardRectangleStateCreateInfoEXT & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -51967,7 +53934,7 @@
       return *this;
     }
 
-#if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )
+#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )
     PipelineDiscardRectangleStateCreateInfoEXT & setDiscardRectangles(
       VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::Rect2D> const & discardRectangles_ )
       VULKAN_HPP_NOEXCEPT
@@ -51976,7 +53943,8 @@
       pDiscardRectangles    = discardRectangles_.data();
       return *this;
     }
-#endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/
+#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/
+#endif   /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkPipelineDiscardRectangleStateCreateInfoEXT const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -52054,6 +54022,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     PipelineExecutableInfoKHR & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -52071,6 +54040,7 @@
       executableIndex = executableIndex_;
       return *this;
     }
+#endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkPipelineExecutableInfoKHR const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -52295,6 +54265,7 @@
 
   union PipelineExecutableStatisticValueKHR
   {
+#if !defined( VULKAN_HPP_NO_UNION_CONSTRUCTORS )
     PipelineExecutableStatisticValueKHR( VULKAN_HPP_NAMESPACE::PipelineExecutableStatisticValueKHR const & rhs )
       VULKAN_HPP_NOEXCEPT
     {
@@ -52308,7 +54279,9 @@
     PipelineExecutableStatisticValueKHR( uint64_t u64_ ) : u64( u64_ ) {}
 
     PipelineExecutableStatisticValueKHR( double f64_ ) : f64( f64_ ) {}
+#endif /*VULKAN_HPP_NO_UNION_CONSTRUCTORS*/
 
+#if !defined( VULKAN_HPP_NO_UNION_SETTERS )
     PipelineExecutableStatisticValueKHR & setB32( VULKAN_HPP_NAMESPACE::Bool32 b32_ ) VULKAN_HPP_NOEXCEPT
     {
       b32 = b32_;
@@ -52332,6 +54305,7 @@
       f64 = f64_;
       return *this;
     }
+#endif /*VULKAN_HPP_NO_UNION_SETTERS*/
 
     VULKAN_HPP_NAMESPACE::PipelineExecutableStatisticValueKHR &
       operator=( VULKAN_HPP_NAMESPACE::PipelineExecutableStatisticValueKHR const & rhs ) VULKAN_HPP_NOEXCEPT
@@ -52467,6 +54441,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     PipelineFragmentShadingRateEnumStateCreateInfoNV & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -52493,6 +54468,7 @@
       combinerOps = combinerOps_;
       return *this;
     }
+#endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkPipelineFragmentShadingRateEnumStateCreateInfoNV const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -52576,6 +54552,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     PipelineFragmentShadingRateStateCreateInfoKHR & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -52595,6 +54572,7 @@
       combinerOps = combinerOps_;
       return *this;
     }
+#endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkPipelineFragmentShadingRateStateCreateInfoKHR const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -52664,6 +54642,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     PipelineInfoKHR & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -52675,6 +54654,7 @@
       pipeline = pipeline_;
       return *this;
     }
+#endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkPipelineInfoKHR const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -52741,6 +54721,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     PushConstantRange & setStageFlags( VULKAN_HPP_NAMESPACE::ShaderStageFlags stageFlags_ ) VULKAN_HPP_NOEXCEPT
     {
       stageFlags = stageFlags_;
@@ -52758,6 +54739,7 @@
       size = size_;
       return *this;
     }
+#endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkPushConstantRange const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -52842,6 +54824,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     PipelineLayoutCreateInfo & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -52867,7 +54850,7 @@
       return *this;
     }
 
-#if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )
+#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )
     PipelineLayoutCreateInfo & setSetLayouts(
       VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::DescriptorSetLayout> const &
         setLayouts_ ) VULKAN_HPP_NOEXCEPT
@@ -52876,7 +54859,7 @@
       pSetLayouts    = setLayouts_.data();
       return *this;
     }
-#endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/
+#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/
 
     PipelineLayoutCreateInfo & setPushConstantRangeCount( uint32_t pushConstantRangeCount_ ) VULKAN_HPP_NOEXCEPT
     {
@@ -52891,7 +54874,7 @@
       return *this;
     }
 
-#if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )
+#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )
     PipelineLayoutCreateInfo & setPushConstantRanges(
       VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::PushConstantRange> const &
         pushConstantRanges_ ) VULKAN_HPP_NOEXCEPT
@@ -52900,7 +54883,8 @@
       pPushConstantRanges    = pushConstantRanges_.data();
       return *this;
     }
-#endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/
+#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/
+#endif   /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkPipelineLayoutCreateInfo const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -52985,6 +54969,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     PipelineLibraryCreateInfoKHR & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -53004,7 +54989,7 @@
       return *this;
     }
 
-#if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )
+#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )
     PipelineLibraryCreateInfoKHR & setLibraries(
       VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::Pipeline> const & libraries_ )
       VULKAN_HPP_NOEXCEPT
@@ -53013,7 +54998,8 @@
       pLibraries   = libraries_.data();
       return *this;
     }
-#endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/
+#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/
+#endif   /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkPipelineLibraryCreateInfoKHR const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -53095,6 +55081,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     PipelineRasterizationConservativeStateCreateInfoEXT & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -53121,6 +55108,7 @@
       extraPrimitiveOverestimationSize = extraPrimitiveOverestimationSize_;
       return *this;
     }
+#endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkPipelineRasterizationConservativeStateCreateInfoEXT const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -53202,6 +55190,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     PipelineRasterizationDepthClipStateCreateInfoEXT & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -53221,6 +55210,7 @@
       depthClipEnable = depthClipEnable_;
       return *this;
     }
+#endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkPipelineRasterizationDepthClipStateCreateInfoEXT const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -53304,6 +55294,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     PipelineRasterizationLineStateCreateInfoEXT & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -53337,6 +55328,7 @@
       lineStipplePattern = lineStipplePattern_;
       return *this;
     }
+#endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkPipelineRasterizationLineStateCreateInfoEXT const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -53420,6 +55412,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     PipelineRasterizationProvokingVertexStateCreateInfoEXT & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -53432,6 +55425,7 @@
       provokingVertexMode = provokingVertexMode_;
       return *this;
     }
+#endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkPipelineRasterizationProvokingVertexStateCreateInfoEXT const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -53508,6 +55502,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     PipelineRasterizationStateRasterizationOrderAMD & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -53520,6 +55515,7 @@
       rasterizationOrder = rasterizationOrder_;
       return *this;
     }
+#endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkPipelineRasterizationStateRasterizationOrderAMD const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -53597,6 +55593,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     PipelineRasterizationStateStreamCreateInfoEXT & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -53616,6 +55613,7 @@
       rasterizationStream = rasterizationStream_;
       return *this;
     }
+#endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkPipelineRasterizationStateStreamCreateInfoEXT const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -53693,6 +55691,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     PipelineRepresentativeFragmentTestStateCreateInfoNV & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -53705,6 +55704,7 @@
       representativeFragmentTestEnable = representativeFragmentTestEnable_;
       return *this;
     }
+#endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkPipelineRepresentativeFragmentTestStateCreateInfoNV const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -53782,6 +55782,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     PipelineSampleLocationsStateCreateInfoEXT & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -53801,6 +55802,7 @@
       sampleLocationsInfo = sampleLocationsInfo_;
       return *this;
     }
+#endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkPipelineSampleLocationsStateCreateInfoEXT const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -53952,6 +55954,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     PipelineTessellationDomainOriginStateCreateInfo & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -53964,6 +55967,7 @@
       domainOrigin = domainOrigin_;
       return *this;
     }
+#endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkPipelineTessellationDomainOriginStateCreateInfo const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -54036,6 +56040,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     VertexInputBindingDivisorDescriptionEXT & setBinding( uint32_t binding_ ) VULKAN_HPP_NOEXCEPT
     {
       binding = binding_;
@@ -54047,6 +56052,7 @@
       divisor = divisor_;
       return *this;
     }
+#endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkVertexInputBindingDivisorDescriptionEXT const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -54126,6 +56132,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     PipelineVertexInputDivisorStateCreateInfoEXT & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -54147,7 +56154,7 @@
       return *this;
     }
 
-#if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )
+#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )
     PipelineVertexInputDivisorStateCreateInfoEXT & setVertexBindingDivisors(
       VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<
         const VULKAN_HPP_NAMESPACE::VertexInputBindingDivisorDescriptionEXT> const & vertexBindingDivisors_ )
@@ -54157,7 +56164,8 @@
       pVertexBindingDivisors    = vertexBindingDivisors_.data();
       return *this;
     }
-#endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/
+#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/
+#endif   /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkPipelineVertexInputDivisorStateCreateInfoEXT const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -54252,6 +56260,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     PipelineViewportCoarseSampleOrderStateCreateInfoNV & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -54279,7 +56288,7 @@
       return *this;
     }
 
-#if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )
+#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )
     PipelineViewportCoarseSampleOrderStateCreateInfoNV & setCustomSampleOrders(
       VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::CoarseSampleOrderCustomNV> const &
         customSampleOrders_ ) VULKAN_HPP_NOEXCEPT
@@ -54288,7 +56297,8 @@
       pCustomSampleOrders    = customSampleOrders_.data();
       return *this;
     }
-#endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/
+#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/
+#endif   /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkPipelineViewportCoarseSampleOrderStateCreateInfoNV const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -54379,6 +56389,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     PipelineViewportExclusiveScissorStateCreateInfoNV & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -54399,7 +56410,7 @@
       return *this;
     }
 
-#if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )
+#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )
     PipelineViewportExclusiveScissorStateCreateInfoNV & setExclusiveScissors(
       VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::Rect2D> const & exclusiveScissors_ )
       VULKAN_HPP_NOEXCEPT
@@ -54408,7 +56419,8 @@
       pExclusiveScissors    = exclusiveScissors_.data();
       return *this;
     }
-#endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/
+#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/
+#endif   /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkPipelineViewportExclusiveScissorStateCreateInfoNV const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -54488,6 +56500,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     ShadingRatePaletteNV & setShadingRatePaletteEntryCount( uint32_t shadingRatePaletteEntryCount_ ) VULKAN_HPP_NOEXCEPT
     {
       shadingRatePaletteEntryCount = shadingRatePaletteEntryCount_;
@@ -54501,7 +56514,7 @@
       return *this;
     }
 
-#if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )
+#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )
     ShadingRatePaletteNV & setShadingRatePaletteEntries(
       VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::ShadingRatePaletteEntryNV> const &
         shadingRatePaletteEntries_ ) VULKAN_HPP_NOEXCEPT
@@ -54510,7 +56523,8 @@
       pShadingRatePaletteEntries   = shadingRatePaletteEntries_.data();
       return *this;
     }
-#endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/
+#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/
+#endif   /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkShadingRatePaletteNV const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -54593,6 +56607,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     PipelineViewportShadingRateImageStateCreateInfoNV & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -54619,7 +56634,7 @@
       return *this;
     }
 
-#if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )
+#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )
     PipelineViewportShadingRateImageStateCreateInfoNV & setShadingRatePalettes(
       VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::ShadingRatePaletteNV> const &
         shadingRatePalettes_ ) VULKAN_HPP_NOEXCEPT
@@ -54628,7 +56643,8 @@
       pShadingRatePalettes = shadingRatePalettes_.data();
       return *this;
     }
-#endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/
+#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/
+#endif   /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkPipelineViewportShadingRateImageStateCreateInfoNV const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -54709,6 +56725,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     ViewportSwizzleNV & setX( VULKAN_HPP_NAMESPACE::ViewportCoordinateSwizzleNV x_ ) VULKAN_HPP_NOEXCEPT
     {
       x = x_;
@@ -54732,6 +56749,7 @@
       w = w_;
       return *this;
     }
+#endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkViewportSwizzleNV const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -54814,6 +56832,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     PipelineViewportSwizzleStateCreateInfoNV & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -54840,7 +56859,7 @@
       return *this;
     }
 
-#if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )
+#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )
     PipelineViewportSwizzleStateCreateInfoNV & setViewportSwizzles(
       VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::ViewportSwizzleNV> const &
         viewportSwizzles_ ) VULKAN_HPP_NOEXCEPT
@@ -54849,7 +56868,8 @@
       pViewportSwizzles = viewportSwizzles_.data();
       return *this;
     }
-#endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/
+#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/
+#endif   /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkPipelineViewportSwizzleStateCreateInfoNV const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -54919,6 +56939,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     ViewportWScalingNV & setXcoeff( float xcoeff_ ) VULKAN_HPP_NOEXCEPT
     {
       xcoeff = xcoeff_;
@@ -54930,6 +56951,7 @@
       ycoeff = ycoeff_;
       return *this;
     }
+#endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkViewportWScalingNV const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -55010,6 +57032,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     PipelineViewportWScalingStateCreateInfoNV & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -55036,7 +57059,7 @@
       return *this;
     }
 
-#if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )
+#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )
     PipelineViewportWScalingStateCreateInfoNV & setViewportWScalings(
       VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::ViewportWScalingNV> const &
         viewportWScalings_ ) VULKAN_HPP_NOEXCEPT
@@ -55045,7 +57068,8 @@
       pViewportWScalings = viewportWScalings_.data();
       return *this;
     }
-#endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/
+#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/
+#endif   /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkPipelineViewportWScalingStateCreateInfoNV const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -55119,6 +57143,7 @@
       return *this;
     }
 
+#  if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     PresentFrameTokenGGP & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -55130,6 +57155,7 @@
       frameToken = frameToken_;
       return *this;
     }
+#  endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkPresentFrameTokenGGP const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -55172,6 +57198,109 @@
   };
 #endif /*VK_USE_PLATFORM_GGP*/
 
+  struct PresentIdKHR
+  {
+    static const bool                    allowDuplicate              = false;
+    static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType = StructureType::ePresentIdKHR;
+
+#if !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )
+    VULKAN_HPP_CONSTEXPR PresentIdKHR( uint32_t         swapchainCount_ = {},
+                                       const uint64_t * pPresentIds_    = {} ) VULKAN_HPP_NOEXCEPT
+      : swapchainCount( swapchainCount_ )
+      , pPresentIds( pPresentIds_ )
+    {}
+
+    VULKAN_HPP_CONSTEXPR PresentIdKHR( PresentIdKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;
+
+    PresentIdKHR( VkPresentIdKHR const & rhs ) VULKAN_HPP_NOEXCEPT
+      : PresentIdKHR( *reinterpret_cast<PresentIdKHR const *>( &rhs ) )
+    {}
+
+#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )
+    PresentIdKHR( VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const uint64_t> const & presentIds_ )
+      : swapchainCount( static_cast<uint32_t>( presentIds_.size() ) ), pPresentIds( presentIds_.data() )
+    {}
+#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/
+#endif   /*VULKAN_HPP_NO_STRUCT_CONSTRUCTORS*/
+
+    VULKAN_HPP_CONSTEXPR_14 PresentIdKHR & operator=( PresentIdKHR const & rhs ) VULKAN_HPP_NOEXCEPT = default;
+
+    PresentIdKHR & operator=( VkPresentIdKHR const & rhs ) VULKAN_HPP_NOEXCEPT
+    {
+      *this = *reinterpret_cast<VULKAN_HPP_NAMESPACE::PresentIdKHR const *>( &rhs );
+      return *this;
+    }
+
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
+    PresentIdKHR & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT
+    {
+      pNext = pNext_;
+      return *this;
+    }
+
+    PresentIdKHR & setSwapchainCount( uint32_t swapchainCount_ ) VULKAN_HPP_NOEXCEPT
+    {
+      swapchainCount = swapchainCount_;
+      return *this;
+    }
+
+    PresentIdKHR & setPPresentIds( const uint64_t * pPresentIds_ ) VULKAN_HPP_NOEXCEPT
+    {
+      pPresentIds = pPresentIds_;
+      return *this;
+    }
+
+#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )
+    PresentIdKHR & setPresentIds( VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const uint64_t> const & presentIds_ )
+      VULKAN_HPP_NOEXCEPT
+    {
+      swapchainCount = static_cast<uint32_t>( presentIds_.size() );
+      pPresentIds    = presentIds_.data();
+      return *this;
+    }
+#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/
+#endif   /*VULKAN_HPP_NO_STRUCT_SETTERS*/
+
+    operator VkPresentIdKHR const &() const VULKAN_HPP_NOEXCEPT
+    {
+      return *reinterpret_cast<const VkPresentIdKHR *>( this );
+    }
+
+    operator VkPresentIdKHR &() VULKAN_HPP_NOEXCEPT
+    {
+      return *reinterpret_cast<VkPresentIdKHR *>( this );
+    }
+
+#if defined( VULKAN_HPP_HAS_SPACESHIP_OPERATOR )
+    auto operator<=>( PresentIdKHR const & ) const = default;
+#else
+    bool operator==( PresentIdKHR const & rhs ) const VULKAN_HPP_NOEXCEPT
+    {
+      return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) && ( swapchainCount == rhs.swapchainCount ) &&
+             ( pPresentIds == rhs.pPresentIds );
+    }
+
+    bool operator!=( PresentIdKHR const & rhs ) const VULKAN_HPP_NOEXCEPT
+    {
+      return !operator==( rhs );
+    }
+#endif
+
+  public:
+    VULKAN_HPP_NAMESPACE::StructureType sType          = StructureType::ePresentIdKHR;
+    const void *                        pNext          = {};
+    uint32_t                            swapchainCount = {};
+    const uint64_t *                    pPresentIds    = {};
+  };
+  static_assert( sizeof( PresentIdKHR ) == sizeof( VkPresentIdKHR ), "struct and wrapper have different size!" );
+  static_assert( std::is_standard_layout<PresentIdKHR>::value, "struct wrapper is not a standard layout!" );
+
+  template <>
+  struct CppType<StructureType, StructureType::ePresentIdKHR>
+  {
+    using Type = PresentIdKHR;
+  };
+
   struct PresentInfoKHR
   {
     static const bool                    allowDuplicate              = false;
@@ -55246,6 +57375,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     PresentInfoKHR & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -55264,7 +57394,7 @@
       return *this;
     }
 
-#if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )
+#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )
     PresentInfoKHR & setWaitSemaphores(
       VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::Semaphore> const & waitSemaphores_ )
       VULKAN_HPP_NOEXCEPT
@@ -55273,7 +57403,7 @@
       pWaitSemaphores    = waitSemaphores_.data();
       return *this;
     }
-#endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/
+#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/
 
     PresentInfoKHR & setSwapchainCount( uint32_t swapchainCount_ ) VULKAN_HPP_NOEXCEPT
     {
@@ -55287,7 +57417,7 @@
       return *this;
     }
 
-#if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )
+#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )
     PresentInfoKHR & setSwapchains(
       VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::SwapchainKHR> const & swapchains_ )
       VULKAN_HPP_NOEXCEPT
@@ -55296,7 +57426,7 @@
       pSwapchains    = swapchains_.data();
       return *this;
     }
-#endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/
+#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/
 
     PresentInfoKHR & setPImageIndices( const uint32_t * pImageIndices_ ) VULKAN_HPP_NOEXCEPT
     {
@@ -55304,7 +57434,7 @@
       return *this;
     }
 
-#if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )
+#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )
     PresentInfoKHR & setImageIndices(
       VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const uint32_t> const & imageIndices_ ) VULKAN_HPP_NOEXCEPT
     {
@@ -55312,7 +57442,7 @@
       pImageIndices  = imageIndices_.data();
       return *this;
     }
-#endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/
+#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/
 
     PresentInfoKHR & setPResults( VULKAN_HPP_NAMESPACE::Result * pResults_ ) VULKAN_HPP_NOEXCEPT
     {
@@ -55320,7 +57450,7 @@
       return *this;
     }
 
-#if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )
+#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )
     PresentInfoKHR & setResults(
       VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<VULKAN_HPP_NAMESPACE::Result> const & results_ ) VULKAN_HPP_NOEXCEPT
     {
@@ -55328,7 +57458,8 @@
       pResults       = results_.data();
       return *this;
     }
-#endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/
+#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/
+#endif   /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkPresentInfoKHR const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -55406,6 +57537,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     RectLayerKHR & setOffset( VULKAN_HPP_NAMESPACE::Offset2D const & offset_ ) VULKAN_HPP_NOEXCEPT
     {
       offset = offset_;
@@ -55423,6 +57555,7 @@
       layer = layer_;
       return *this;
     }
+#endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkRectLayerKHR const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -55488,6 +57621,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     PresentRegionKHR & setRectangleCount( uint32_t rectangleCount_ ) VULKAN_HPP_NOEXCEPT
     {
       rectangleCount = rectangleCount_;
@@ -55500,7 +57634,7 @@
       return *this;
     }
 
-#if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )
+#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )
     PresentRegionKHR & setRectangles(
       VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::RectLayerKHR> const & rectangles_ )
       VULKAN_HPP_NOEXCEPT
@@ -55509,7 +57643,8 @@
       pRectangles    = rectangles_.data();
       return *this;
     }
-#endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/
+#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/
+#endif   /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkPresentRegionKHR const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -55579,6 +57714,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     PresentRegionsKHR & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -55597,7 +57733,7 @@
       return *this;
     }
 
-#if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )
+#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )
     PresentRegionsKHR & setRegions(
       VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::PresentRegionKHR> const & regions_ )
       VULKAN_HPP_NOEXCEPT
@@ -55606,7 +57742,8 @@
       pRegions       = regions_.data();
       return *this;
     }
-#endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/
+#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/
+#endif   /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkPresentRegionsKHR const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -55674,6 +57811,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     PresentTimeGOOGLE & setPresentID( uint32_t presentID_ ) VULKAN_HPP_NOEXCEPT
     {
       presentID = presentID_;
@@ -55685,6 +57823,7 @@
       desiredPresentTime = desiredPresentTime_;
       return *this;
     }
+#endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkPresentTimeGOOGLE const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -55754,6 +57893,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     PresentTimesInfoGOOGLE & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -55772,7 +57912,7 @@
       return *this;
     }
 
-#if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )
+#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )
     PresentTimesInfoGOOGLE & setTimes(
       VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::PresentTimeGOOGLE> const & times_ )
       VULKAN_HPP_NOEXCEPT
@@ -55781,7 +57921,8 @@
       pTimes         = times_.data();
       return *this;
     }
-#endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/
+#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/
+#endif   /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkPresentTimesInfoGOOGLE const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -55851,6 +57992,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     PrivateDataSlotCreateInfoEXT & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -55863,6 +58005,7 @@
       flags = flags_;
       return *this;
     }
+#endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkPrivateDataSlotCreateInfoEXT const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -55930,6 +58073,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     ProtectedSubmitInfo & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -55941,6 +58085,7 @@
       protectedSubmit = protectedSubmit_;
       return *this;
     }
+#endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkProtectedSubmitInfo const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -56014,6 +58159,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     QueryPoolCreateInfo & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -56044,6 +58190,7 @@
       pipelineStatistics = pipelineStatistics_;
       return *this;
     }
+#endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkQueryPoolCreateInfo const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -56131,6 +58278,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     QueryPoolPerformanceCreateInfoKHR & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -56155,7 +58303,7 @@
       return *this;
     }
 
-#if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )
+#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )
     QueryPoolPerformanceCreateInfoKHR & setCounterIndices(
       VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const uint32_t> const & counterIndices_ ) VULKAN_HPP_NOEXCEPT
     {
@@ -56163,7 +58311,8 @@
       pCounterIndices   = counterIndices_.data();
       return *this;
     }
-#endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/
+#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/
+#endif   /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkQueryPoolPerformanceCreateInfoKHR const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -56241,6 +58390,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     QueryPoolPerformanceQueryCreateInfoINTEL & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -56253,6 +58403,7 @@
       performanceCountersSampling = performanceCountersSampling_;
       return *this;
     }
+#endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkQueryPoolPerformanceQueryCreateInfoINTEL const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -56488,6 +58639,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     QueueFamilyGlobalPriorityPropertiesEXT & setPNext( void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -56507,6 +58659,7 @@
       priorities = priorities_;
       return *this;
     }
+#endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkQueueFamilyGlobalPriorityPropertiesEXT const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -56725,6 +58878,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     RayTracingShaderGroupCreateInfoKHR & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -56768,6 +58922,7 @@
       pShaderGroupCaptureReplayHandle = pShaderGroupCaptureReplayHandle_;
       return *this;
     }
+#endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkRayTracingShaderGroupCreateInfoKHR const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -56852,6 +59007,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     RayTracingPipelineInterfaceCreateInfoKHR & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -56871,6 +59027,7 @@
       maxPipelineRayHitAttributeSize = maxPipelineRayHitAttributeSize_;
       return *this;
     }
+#endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkRayTracingPipelineInterfaceCreateInfoKHR const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -56995,6 +59152,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     RayTracingPipelineCreateInfoKHR & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -57020,7 +59178,7 @@
       return *this;
     }
 
-#if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )
+#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )
     RayTracingPipelineCreateInfoKHR & setStages(
       VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::PipelineShaderStageCreateInfo> const &
         stages_ ) VULKAN_HPP_NOEXCEPT
@@ -57029,7 +59187,7 @@
       pStages    = stages_.data();
       return *this;
     }
-#endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/
+#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/
 
     RayTracingPipelineCreateInfoKHR & setGroupCount( uint32_t groupCount_ ) VULKAN_HPP_NOEXCEPT
     {
@@ -57044,7 +59202,7 @@
       return *this;
     }
 
-#if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )
+#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )
     RayTracingPipelineCreateInfoKHR &
       setGroups( VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<
                  const VULKAN_HPP_NAMESPACE::RayTracingShaderGroupCreateInfoKHR> const & groups_ ) VULKAN_HPP_NOEXCEPT
@@ -57053,7 +59211,7 @@
       pGroups    = groups_.data();
       return *this;
     }
-#endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/
+#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/
 
     RayTracingPipelineCreateInfoKHR &
       setMaxPipelineRayRecursionDepth( uint32_t maxPipelineRayRecursionDepth_ ) VULKAN_HPP_NOEXCEPT
@@ -57101,6 +59259,7 @@
       basePipelineIndex = basePipelineIndex_;
       return *this;
     }
+#endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkRayTracingPipelineCreateInfoKHR const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -57196,6 +59355,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     RayTracingShaderGroupCreateInfoNV & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -57232,6 +59392,7 @@
       intersectionShader = intersectionShader_;
       return *this;
     }
+#endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkRayTracingShaderGroupCreateInfoNV const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -57347,6 +59508,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     RayTracingPipelineCreateInfoNV & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -57372,7 +59534,7 @@
       return *this;
     }
 
-#if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )
+#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )
     RayTracingPipelineCreateInfoNV & setStages(
       VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::PipelineShaderStageCreateInfo> const &
         stages_ ) VULKAN_HPP_NOEXCEPT
@@ -57381,7 +59543,7 @@
       pStages    = stages_.data();
       return *this;
     }
-#endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/
+#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/
 
     RayTracingPipelineCreateInfoNV & setGroupCount( uint32_t groupCount_ ) VULKAN_HPP_NOEXCEPT
     {
@@ -57396,7 +59558,7 @@
       return *this;
     }
 
-#if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )
+#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )
     RayTracingPipelineCreateInfoNV &
       setGroups( VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<
                  const VULKAN_HPP_NAMESPACE::RayTracingShaderGroupCreateInfoNV> const & groups_ ) VULKAN_HPP_NOEXCEPT
@@ -57405,7 +59567,7 @@
       pGroups    = groups_.data();
       return *this;
     }
-#endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/
+#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/
 
     RayTracingPipelineCreateInfoNV & setMaxRecursionDepth( uint32_t maxRecursionDepth_ ) VULKAN_HPP_NOEXCEPT
     {
@@ -57431,6 +59593,7 @@
       basePipelineIndex = basePipelineIndex_;
       return *this;
     }
+#endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkRayTracingPipelineCreateInfoNV const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -57576,6 +59739,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     RenderPassAttachmentBeginInfo & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -57595,7 +59759,7 @@
       return *this;
     }
 
-#if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )
+#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )
     RenderPassAttachmentBeginInfo & setAttachments(
       VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::ImageView> const & attachments_ )
       VULKAN_HPP_NOEXCEPT
@@ -57604,7 +59768,8 @@
       pAttachments    = attachments_.data();
       return *this;
     }
-#endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/
+#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/
+#endif   /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkRenderPassAttachmentBeginInfo const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -57698,6 +59863,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     RenderPassBeginInfo & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -57734,7 +59900,7 @@
       return *this;
     }
 
-#if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )
+#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )
     RenderPassBeginInfo & setClearValues(
       VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::ClearValue> const & clearValues_ )
       VULKAN_HPP_NOEXCEPT
@@ -57743,7 +59909,8 @@
       pClearValues    = clearValues_.data();
       return *this;
     }
-#endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/
+#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/
+#endif   /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkRenderPassBeginInfo const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -57868,6 +60035,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     SubpassDescription & setFlags( VULKAN_HPP_NAMESPACE::SubpassDescriptionFlags flags_ ) VULKAN_HPP_NOEXCEPT
     {
       flags = flags_;
@@ -57894,7 +60062,7 @@
       return *this;
     }
 
-#if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )
+#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )
     SubpassDescription & setInputAttachments(
       VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::AttachmentReference> const &
         inputAttachments_ ) VULKAN_HPP_NOEXCEPT
@@ -57903,7 +60071,7 @@
       pInputAttachments    = inputAttachments_.data();
       return *this;
     }
-#endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/
+#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/
 
     SubpassDescription & setColorAttachmentCount( uint32_t colorAttachmentCount_ ) VULKAN_HPP_NOEXCEPT
     {
@@ -57918,7 +60086,7 @@
       return *this;
     }
 
-#if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )
+#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )
     SubpassDescription & setColorAttachments(
       VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::AttachmentReference> const &
         colorAttachments_ ) VULKAN_HPP_NOEXCEPT
@@ -57927,7 +60095,7 @@
       pColorAttachments    = colorAttachments_.data();
       return *this;
     }
-#endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/
+#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/
 
     SubpassDescription & setPResolveAttachments(
       const VULKAN_HPP_NAMESPACE::AttachmentReference * pResolveAttachments_ ) VULKAN_HPP_NOEXCEPT
@@ -57936,7 +60104,7 @@
       return *this;
     }
 
-#if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )
+#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )
     SubpassDescription & setResolveAttachments(
       VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::AttachmentReference> const &
         resolveAttachments_ ) VULKAN_HPP_NOEXCEPT
@@ -57945,7 +60113,7 @@
       pResolveAttachments  = resolveAttachments_.data();
       return *this;
     }
-#endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/
+#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/
 
     SubpassDescription & setPDepthStencilAttachment(
       const VULKAN_HPP_NAMESPACE::AttachmentReference * pDepthStencilAttachment_ ) VULKAN_HPP_NOEXCEPT
@@ -57966,7 +60134,7 @@
       return *this;
     }
 
-#if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )
+#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )
     SubpassDescription & setPreserveAttachments(
       VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const uint32_t> const & preserveAttachments_ ) VULKAN_HPP_NOEXCEPT
     {
@@ -57974,7 +60142,8 @@
       pPreserveAttachments    = preserveAttachments_.data();
       return *this;
     }
-#endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/
+#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/
+#endif   /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkSubpassDescription const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -58058,6 +60227,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     SubpassDependency & setSrcSubpass( uint32_t srcSubpass_ ) VULKAN_HPP_NOEXCEPT
     {
       srcSubpass = srcSubpass_;
@@ -58099,6 +60269,7 @@
       dependencyFlags = dependencyFlags_;
       return *this;
     }
+#endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkSubpassDependency const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -58198,6 +60369,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     RenderPassCreateInfo & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -58223,7 +60395,7 @@
       return *this;
     }
 
-#if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )
+#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )
     RenderPassCreateInfo & setAttachments(
       VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::AttachmentDescription> const &
         attachments_ ) VULKAN_HPP_NOEXCEPT
@@ -58232,7 +60404,7 @@
       pAttachments    = attachments_.data();
       return *this;
     }
-#endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/
+#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/
 
     RenderPassCreateInfo & setSubpassCount( uint32_t subpassCount_ ) VULKAN_HPP_NOEXCEPT
     {
@@ -58247,7 +60419,7 @@
       return *this;
     }
 
-#if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )
+#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )
     RenderPassCreateInfo & setSubpasses(
       VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::SubpassDescription> const & subpasses_ )
       VULKAN_HPP_NOEXCEPT
@@ -58256,7 +60428,7 @@
       pSubpasses   = subpasses_.data();
       return *this;
     }
-#endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/
+#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/
 
     RenderPassCreateInfo & setDependencyCount( uint32_t dependencyCount_ ) VULKAN_HPP_NOEXCEPT
     {
@@ -58271,7 +60443,7 @@
       return *this;
     }
 
-#if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )
+#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )
     RenderPassCreateInfo & setDependencies(
       VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::SubpassDependency> const &
         dependencies_ ) VULKAN_HPP_NOEXCEPT
@@ -58280,7 +60452,8 @@
       pDependencies   = dependencies_.data();
       return *this;
     }
-#endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/
+#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/
+#endif   /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkRenderPassCreateInfo const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -58415,6 +60588,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     SubpassDescription2 & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -58453,7 +60627,7 @@
       return *this;
     }
 
-#if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )
+#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )
     SubpassDescription2 & setInputAttachments(
       VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::AttachmentReference2> const &
         inputAttachments_ ) VULKAN_HPP_NOEXCEPT
@@ -58462,7 +60636,7 @@
       pInputAttachments    = inputAttachments_.data();
       return *this;
     }
-#endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/
+#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/
 
     SubpassDescription2 & setColorAttachmentCount( uint32_t colorAttachmentCount_ ) VULKAN_HPP_NOEXCEPT
     {
@@ -58477,7 +60651,7 @@
       return *this;
     }
 
-#if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )
+#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )
     SubpassDescription2 & setColorAttachments(
       VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::AttachmentReference2> const &
         colorAttachments_ ) VULKAN_HPP_NOEXCEPT
@@ -58486,7 +60660,7 @@
       pColorAttachments    = colorAttachments_.data();
       return *this;
     }
-#endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/
+#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/
 
     SubpassDescription2 & setPResolveAttachments(
       const VULKAN_HPP_NAMESPACE::AttachmentReference2 * pResolveAttachments_ ) VULKAN_HPP_NOEXCEPT
@@ -58495,7 +60669,7 @@
       return *this;
     }
 
-#if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )
+#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )
     SubpassDescription2 & setResolveAttachments(
       VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::AttachmentReference2> const &
         resolveAttachments_ ) VULKAN_HPP_NOEXCEPT
@@ -58504,7 +60678,7 @@
       pResolveAttachments  = resolveAttachments_.data();
       return *this;
     }
-#endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/
+#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/
 
     SubpassDescription2 & setPDepthStencilAttachment(
       const VULKAN_HPP_NAMESPACE::AttachmentReference2 * pDepthStencilAttachment_ ) VULKAN_HPP_NOEXCEPT
@@ -58525,7 +60699,7 @@
       return *this;
     }
 
-#if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )
+#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )
     SubpassDescription2 & setPreserveAttachments(
       VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const uint32_t> const & preserveAttachments_ ) VULKAN_HPP_NOEXCEPT
     {
@@ -58533,7 +60707,8 @@
       pPreserveAttachments    = preserveAttachments_.data();
       return *this;
     }
-#endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/
+#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/
+#endif   /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkSubpassDescription2 const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -58632,6 +60807,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     SubpassDependency2 & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -58686,6 +60862,7 @@
       viewOffset = viewOffset_;
       return *this;
     }
+#endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkSubpassDependency2 const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -58802,6 +60979,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     RenderPassCreateInfo2 & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -58827,7 +61005,7 @@
       return *this;
     }
 
-#if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )
+#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )
     RenderPassCreateInfo2 & setAttachments(
       VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::AttachmentDescription2> const &
         attachments_ ) VULKAN_HPP_NOEXCEPT
@@ -58836,7 +61014,7 @@
       pAttachments    = attachments_.data();
       return *this;
     }
-#endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/
+#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/
 
     RenderPassCreateInfo2 & setSubpassCount( uint32_t subpassCount_ ) VULKAN_HPP_NOEXCEPT
     {
@@ -58851,7 +61029,7 @@
       return *this;
     }
 
-#if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )
+#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )
     RenderPassCreateInfo2 & setSubpasses(
       VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::SubpassDescription2> const &
         subpasses_ ) VULKAN_HPP_NOEXCEPT
@@ -58860,7 +61038,7 @@
       pSubpasses   = subpasses_.data();
       return *this;
     }
-#endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/
+#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/
 
     RenderPassCreateInfo2 & setDependencyCount( uint32_t dependencyCount_ ) VULKAN_HPP_NOEXCEPT
     {
@@ -58875,7 +61053,7 @@
       return *this;
     }
 
-#if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )
+#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )
     RenderPassCreateInfo2 & setDependencies(
       VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::SubpassDependency2> const &
         dependencies_ ) VULKAN_HPP_NOEXCEPT
@@ -58884,7 +61062,7 @@
       pDependencies   = dependencies_.data();
       return *this;
     }
-#endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/
+#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/
 
     RenderPassCreateInfo2 & setCorrelatedViewMaskCount( uint32_t correlatedViewMaskCount_ ) VULKAN_HPP_NOEXCEPT
     {
@@ -58898,7 +61076,7 @@
       return *this;
     }
 
-#if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )
+#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )
     RenderPassCreateInfo2 & setCorrelatedViewMasks(
       VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const uint32_t> const & correlatedViewMasks_ ) VULKAN_HPP_NOEXCEPT
     {
@@ -58906,7 +61084,8 @@
       pCorrelatedViewMasks    = correlatedViewMasks_.data();
       return *this;
     }
-#endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/
+#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/
+#endif   /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkRenderPassCreateInfo2 const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -58993,6 +61172,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     RenderPassFragmentDensityMapCreateInfoEXT & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -59005,6 +61185,7 @@
       fragmentDensityMapAttachment = fragmentDensityMapAttachment_;
       return *this;
     }
+#endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkRenderPassFragmentDensityMapCreateInfoEXT const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -59091,6 +61272,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     RenderPassInputAttachmentAspectCreateInfo & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -59111,7 +61293,7 @@
       return *this;
     }
 
-#if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )
+#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )
     RenderPassInputAttachmentAspectCreateInfo & setAspectReferences(
       VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::InputAttachmentAspectReference> const &
         aspectReferences_ ) VULKAN_HPP_NOEXCEPT
@@ -59120,7 +61302,8 @@
       pAspectReferences    = aspectReferences_.data();
       return *this;
     }
-#endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/
+#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/
+#endif   /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkRenderPassInputAttachmentAspectCreateInfo const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -59217,6 +61400,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     RenderPassMultiviewCreateInfo & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -59235,7 +61419,7 @@
       return *this;
     }
 
-#if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )
+#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )
     RenderPassMultiviewCreateInfo & setViewMasks(
       VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const uint32_t> const & viewMasks_ ) VULKAN_HPP_NOEXCEPT
     {
@@ -59243,7 +61427,7 @@
       pViewMasks   = viewMasks_.data();
       return *this;
     }
-#endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/
+#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/
 
     RenderPassMultiviewCreateInfo & setDependencyCount( uint32_t dependencyCount_ ) VULKAN_HPP_NOEXCEPT
     {
@@ -59257,7 +61441,7 @@
       return *this;
     }
 
-#if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )
+#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )
     RenderPassMultiviewCreateInfo & setViewOffsets(
       VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const int32_t> const & viewOffsets_ ) VULKAN_HPP_NOEXCEPT
     {
@@ -59265,7 +61449,7 @@
       pViewOffsets    = viewOffsets_.data();
       return *this;
     }
-#endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/
+#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/
 
     RenderPassMultiviewCreateInfo & setCorrelationMaskCount( uint32_t correlationMaskCount_ ) VULKAN_HPP_NOEXCEPT
     {
@@ -59279,7 +61463,7 @@
       return *this;
     }
 
-#if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )
+#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )
     RenderPassMultiviewCreateInfo & setCorrelationMasks(
       VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const uint32_t> const & correlationMasks_ ) VULKAN_HPP_NOEXCEPT
     {
@@ -59287,7 +61471,8 @@
       pCorrelationMasks    = correlationMasks_.data();
       return *this;
     }
-#endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/
+#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/
+#endif   /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkRenderPassMultiviewCreateInfo const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -59365,6 +61550,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     SubpassSampleLocationsEXT & setSubpassIndex( uint32_t subpassIndex_ ) VULKAN_HPP_NOEXCEPT
     {
       subpassIndex = subpassIndex_;
@@ -59377,6 +61563,7 @@
       sampleLocationsInfo = sampleLocationsInfo_;
       return *this;
     }
+#endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkSubpassSampleLocationsEXT const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -59461,6 +61648,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     RenderPassSampleLocationsBeginInfoEXT & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -59482,7 +61670,7 @@
       return *this;
     }
 
-#if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )
+#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )
     RenderPassSampleLocationsBeginInfoEXT & setAttachmentInitialSampleLocations(
       VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::AttachmentSampleLocationsEXT> const &
         attachmentInitialSampleLocations_ ) VULKAN_HPP_NOEXCEPT
@@ -59491,7 +61679,7 @@
       pAttachmentInitialSampleLocations     = attachmentInitialSampleLocations_.data();
       return *this;
     }
-#endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/
+#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/
 
     RenderPassSampleLocationsBeginInfoEXT &
       setPostSubpassSampleLocationsCount( uint32_t postSubpassSampleLocationsCount_ ) VULKAN_HPP_NOEXCEPT
@@ -59507,7 +61695,7 @@
       return *this;
     }
 
-#if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )
+#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )
     RenderPassSampleLocationsBeginInfoEXT & setPostSubpassSampleLocations(
       VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::SubpassSampleLocationsEXT> const &
         postSubpassSampleLocations_ ) VULKAN_HPP_NOEXCEPT
@@ -59516,7 +61704,8 @@
       pPostSubpassSampleLocations     = postSubpassSampleLocations_.data();
       return *this;
     }
-#endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/
+#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/
+#endif   /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkRenderPassSampleLocationsBeginInfoEXT const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -59593,6 +61782,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     RenderPassTransformBeginInfoQCOM & setPNext( void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -59605,6 +61795,7 @@
       transform = transform_;
       return *this;
     }
+#endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkRenderPassTransformBeginInfoQCOM const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -59700,6 +61891,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     ResolveImageInfo2KHR & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -59742,7 +61934,7 @@
       return *this;
     }
 
-#if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )
+#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )
     ResolveImageInfo2KHR & setRegions(
       VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::ImageResolve2KHR> const & regions_ )
       VULKAN_HPP_NOEXCEPT
@@ -59751,7 +61943,8 @@
       pRegions    = regions_.data();
       return *this;
     }
-#endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/
+#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/
+#endif   /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkResolveImageInfo2KHR const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -59857,6 +62050,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     SamplerCreateInfo & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -59959,6 +62153,7 @@
       unnormalizedCoordinates = unnormalizedCoordinates_;
       return *this;
     }
+#endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkSamplerCreateInfo const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -60054,6 +62249,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     SamplerCustomBorderColorCreateInfoEXT & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -60072,6 +62268,7 @@
       format = format_;
       return *this;
     }
+#endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkSamplerCustomBorderColorCreateInfoEXT const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -60129,6 +62326,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     SamplerReductionModeCreateInfo & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -60141,6 +62339,7 @@
       reductionMode = reductionMode_;
       return *this;
     }
+#endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkSamplerReductionModeCreateInfo const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -60227,6 +62426,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     SamplerYcbcrConversionCreateInfo & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -60286,6 +62486,7 @@
       forceExplicitReconstruction = forceExplicitReconstruction_;
       return *this;
     }
+#endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkSamplerYcbcrConversionCreateInfo const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -60442,6 +62643,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     SamplerYcbcrConversionInfo & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -60454,6 +62656,7 @@
       conversion = conversion_;
       return *this;
     }
+#endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkSamplerYcbcrConversionInfo const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -60528,6 +62731,7 @@
       return *this;
     }
 
+#  if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     ScreenSurfaceCreateInfoQNX & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -60552,6 +62756,7 @@
       window = window_;
       return *this;
     }
+#  endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkScreenSurfaceCreateInfoQNX const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -60624,6 +62829,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     SemaphoreCreateInfo & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -60635,6 +62841,7 @@
       flags = flags_;
       return *this;
     }
+#endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkSemaphoreCreateInfo const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -60705,6 +62912,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     SemaphoreGetFdInfoKHR & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -60723,6 +62931,7 @@
       handleType = handleType_;
       return *this;
     }
+#endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkSemaphoreGetFdInfoKHR const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -60798,6 +63007,7 @@
       return *this;
     }
 
+#  if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     SemaphoreGetWin32HandleInfoKHR & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -60816,6 +63026,7 @@
       handleType = handleType_;
       return *this;
     }
+#  endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkSemaphoreGetWin32HandleInfoKHR const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -60895,6 +63106,7 @@
       return *this;
     }
 
+#  if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     SemaphoreGetZirconHandleInfoFUCHSIA & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -60913,6 +63125,7 @@
       handleType = handleType_;
       return *this;
     }
+#  endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkSemaphoreGetZirconHandleInfoFUCHSIA const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -60986,6 +63199,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     SemaphoreSignalInfo & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -61003,6 +63217,7 @@
       value = value_;
       return *this;
     }
+#endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkSemaphoreSignalInfo const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -61078,6 +63293,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     SemaphoreSubmitInfoKHR & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -61107,6 +63323,7 @@
       deviceIndex = deviceIndex_;
       return *this;
     }
+#endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkSemaphoreSubmitInfoKHR const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -61180,6 +63397,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     SemaphoreTypeCreateInfo & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -61197,6 +63415,7 @@
       initialValue = initialValue_;
       return *this;
     }
+#endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkSemaphoreTypeCreateInfo const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -61294,6 +63513,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     SemaphoreWaitInfo & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -61318,7 +63538,7 @@
       return *this;
     }
 
-#if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )
+#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )
     SemaphoreWaitInfo & setSemaphores(
       VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::Semaphore> const & semaphores_ )
       VULKAN_HPP_NOEXCEPT
@@ -61327,7 +63547,7 @@
       pSemaphores    = semaphores_.data();
       return *this;
     }
-#endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/
+#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/
 
     SemaphoreWaitInfo & setPValues( const uint64_t * pValues_ ) VULKAN_HPP_NOEXCEPT
     {
@@ -61335,7 +63555,7 @@
       return *this;
     }
 
-#if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )
+#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )
     SemaphoreWaitInfo &
       setValues( VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const uint64_t> const & values_ ) VULKAN_HPP_NOEXCEPT
     {
@@ -61343,7 +63563,8 @@
       pValues        = values_.data();
       return *this;
     }
-#endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/
+#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/
+#endif   /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkSemaphoreWaitInfo const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -61412,11 +63633,13 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     SetStateFlagsIndirectCommandNV & setData( uint32_t data_ ) VULKAN_HPP_NOEXCEPT
     {
       data = data_;
       return *this;
     }
+#endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkSetStateFlagsIndirectCommandNV const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -61487,6 +63710,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     ShaderModuleCreateInfo & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -61511,7 +63735,7 @@
       return *this;
     }
 
-#if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )
+#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )
     ShaderModuleCreateInfo &
       setCode( VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const uint32_t> const & code_ ) VULKAN_HPP_NOEXCEPT
     {
@@ -61519,7 +63743,8 @@
       pCode    = code_.data();
       return *this;
     }
-#endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/
+#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/
+#endif   /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkShaderModuleCreateInfo const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -61595,6 +63820,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     ShaderModuleValidationCacheCreateInfoEXT & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -61607,6 +63833,7 @@
       validationCache = validationCache_;
       return *this;
     }
+#endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkShaderModuleValidationCacheCreateInfoEXT const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -62171,6 +64398,7 @@
       return *this;
     }
 
+#  if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     StreamDescriptorSurfaceCreateInfoGGP & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -62190,6 +64418,7 @@
       streamDescriptor = streamDescriptor_;
       return *this;
     }
+#  endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkStreamDescriptorSurfaceCreateInfoGGP const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -62263,6 +64492,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     StridedDeviceAddressRegionKHR &
       setDeviceAddress( VULKAN_HPP_NAMESPACE::DeviceAddress deviceAddress_ ) VULKAN_HPP_NOEXCEPT
     {
@@ -62281,6 +64511,7 @@
       size = size_;
       return *this;
     }
+#endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkStridedDeviceAddressRegionKHR const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -62383,6 +64614,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     SubmitInfo & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -62401,7 +64633,7 @@
       return *this;
     }
 
-#if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )
+#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )
     SubmitInfo & setWaitSemaphores(
       VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::Semaphore> const & waitSemaphores_ )
       VULKAN_HPP_NOEXCEPT
@@ -62410,7 +64642,7 @@
       pWaitSemaphores    = waitSemaphores_.data();
       return *this;
     }
-#endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/
+#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/
 
     SubmitInfo &
       setPWaitDstStageMask( const VULKAN_HPP_NAMESPACE::PipelineStageFlags * pWaitDstStageMask_ ) VULKAN_HPP_NOEXCEPT
@@ -62419,7 +64651,7 @@
       return *this;
     }
 
-#if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )
+#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )
     SubmitInfo & setWaitDstStageMask(
       VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::PipelineStageFlags> const &
         waitDstStageMask_ ) VULKAN_HPP_NOEXCEPT
@@ -62428,7 +64660,7 @@
       pWaitDstStageMask  = waitDstStageMask_.data();
       return *this;
     }
-#endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/
+#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/
 
     SubmitInfo & setCommandBufferCount( uint32_t commandBufferCount_ ) VULKAN_HPP_NOEXCEPT
     {
@@ -62442,7 +64674,7 @@
       return *this;
     }
 
-#if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )
+#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )
     SubmitInfo & setCommandBuffers(
       VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::CommandBuffer> const & commandBuffers_ )
       VULKAN_HPP_NOEXCEPT
@@ -62451,7 +64683,7 @@
       pCommandBuffers    = commandBuffers_.data();
       return *this;
     }
-#endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/
+#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/
 
     SubmitInfo & setSignalSemaphoreCount( uint32_t signalSemaphoreCount_ ) VULKAN_HPP_NOEXCEPT
     {
@@ -62465,7 +64697,7 @@
       return *this;
     }
 
-#if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )
+#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )
     SubmitInfo & setSignalSemaphores(
       VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::Semaphore> const & signalSemaphores_ )
       VULKAN_HPP_NOEXCEPT
@@ -62474,7 +64706,8 @@
       pSignalSemaphores    = signalSemaphores_.data();
       return *this;
     }
-#endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/
+#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/
+#endif   /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkSubmitInfo const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -62580,6 +64813,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     SubmitInfo2KHR & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -62605,7 +64839,7 @@
       return *this;
     }
 
-#if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )
+#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )
     SubmitInfo2KHR & setWaitSemaphoreInfos(
       VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::SemaphoreSubmitInfoKHR> const &
         waitSemaphoreInfos_ ) VULKAN_HPP_NOEXCEPT
@@ -62614,7 +64848,7 @@
       pWaitSemaphoreInfos    = waitSemaphoreInfos_.data();
       return *this;
     }
-#endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/
+#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/
 
     SubmitInfo2KHR & setCommandBufferInfoCount( uint32_t commandBufferInfoCount_ ) VULKAN_HPP_NOEXCEPT
     {
@@ -62629,7 +64863,7 @@
       return *this;
     }
 
-#if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )
+#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )
     SubmitInfo2KHR & setCommandBufferInfos(
       VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::CommandBufferSubmitInfoKHR> const &
         commandBufferInfos_ ) VULKAN_HPP_NOEXCEPT
@@ -62638,7 +64872,7 @@
       pCommandBufferInfos    = commandBufferInfos_.data();
       return *this;
     }
-#endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/
+#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/
 
     SubmitInfo2KHR & setSignalSemaphoreInfoCount( uint32_t signalSemaphoreInfoCount_ ) VULKAN_HPP_NOEXCEPT
     {
@@ -62653,7 +64887,7 @@
       return *this;
     }
 
-#if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )
+#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )
     SubmitInfo2KHR & setSignalSemaphoreInfos(
       VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::SemaphoreSubmitInfoKHR> const &
         signalSemaphoreInfos_ ) VULKAN_HPP_NOEXCEPT
@@ -62662,7 +64896,8 @@
       pSignalSemaphoreInfos    = signalSemaphoreInfos_.data();
       return *this;
     }
-#endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/
+#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/
+#endif   /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkSubmitInfo2KHR const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -62740,6 +64975,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     SubpassBeginInfo & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -62751,6 +64987,7 @@
       contents = contents_;
       return *this;
     }
+#endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkSubpassBeginInfo const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -62827,6 +65064,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     SubpassDescriptionDepthStencilResolve & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -62853,6 +65091,7 @@
       pDepthStencilResolveAttachment = pDepthStencilResolveAttachment_;
       return *this;
     }
+#endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkSubpassDescriptionDepthStencilResolve const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -62922,11 +65161,13 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     SubpassEndInfo & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
       return *this;
     }
+#endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkSubpassEndInfo const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -63333,6 +65574,7 @@
       return *this;
     }
 
+#  if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     SurfaceCapabilitiesFullScreenExclusiveEXT & setPNext( void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -63345,6 +65587,7 @@
       fullScreenExclusiveSupported = fullScreenExclusiveSupported_;
       return *this;
     }
+#  endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkSurfaceCapabilitiesFullScreenExclusiveEXT const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -63544,6 +65787,7 @@
       return *this;
     }
 
+#  if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     SurfaceFullScreenExclusiveInfoEXT & setPNext( void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -63556,6 +65800,7 @@
       fullScreenExclusive = fullScreenExclusive_;
       return *this;
     }
+#  endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkSurfaceFullScreenExclusiveInfoEXT const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -63630,6 +65875,7 @@
       return *this;
     }
 
+#  if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     SurfaceFullScreenExclusiveWin32InfoEXT & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -63641,6 +65887,7 @@
       hmonitor = hmonitor_;
       return *this;
     }
+#  endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkSurfaceFullScreenExclusiveWin32InfoEXT const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -63711,6 +65958,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     SurfaceProtectedCapabilitiesKHR & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -63723,6 +65971,7 @@
       supportsProtected = supportsProtected_;
       return *this;
     }
+#endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkSurfaceProtectedCapabilitiesKHR const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -63792,6 +66041,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     SwapchainCounterCreateInfoEXT & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -63804,6 +66054,7 @@
       surfaceCounters = surfaceCounters_;
       return *this;
     }
+#endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkSwapchainCounterCreateInfoEXT const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -63942,6 +66193,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     SwapchainCreateInfoKHR & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -64016,7 +66268,7 @@
       return *this;
     }
 
-#if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )
+#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )
     SwapchainCreateInfoKHR & setQueueFamilyIndices(
       VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const uint32_t> const & queueFamilyIndices_ ) VULKAN_HPP_NOEXCEPT
     {
@@ -64024,7 +66276,7 @@
       pQueueFamilyIndices   = queueFamilyIndices_.data();
       return *this;
     }
-#endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/
+#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/
 
     SwapchainCreateInfoKHR &
       setPreTransform( VULKAN_HPP_NAMESPACE::SurfaceTransformFlagBitsKHR preTransform_ ) VULKAN_HPP_NOEXCEPT
@@ -64057,6 +66309,7 @@
       oldSwapchain = oldSwapchain_;
       return *this;
     }
+#endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkSwapchainCreateInfoKHR const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -64151,6 +66404,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     SwapchainDisplayNativeHdrCreateInfoAMD & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -64163,6 +66417,7 @@
       localDimmingEnable = localDimmingEnable_;
       return *this;
     }
+#endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkSwapchainDisplayNativeHdrCreateInfoAMD const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -64320,6 +66575,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     TimelineSemaphoreSubmitInfo & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -64338,7 +66594,7 @@
       return *this;
     }
 
-#if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )
+#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )
     TimelineSemaphoreSubmitInfo & setWaitSemaphoreValues(
       VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const uint64_t> const & waitSemaphoreValues_ ) VULKAN_HPP_NOEXCEPT
     {
@@ -64346,7 +66602,7 @@
       pWaitSemaphoreValues    = waitSemaphoreValues_.data();
       return *this;
     }
-#endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/
+#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/
 
     TimelineSemaphoreSubmitInfo &
       setSignalSemaphoreValueCount( uint32_t signalSemaphoreValueCount_ ) VULKAN_HPP_NOEXCEPT
@@ -64362,7 +66618,7 @@
       return *this;
     }
 
-#if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )
+#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )
     TimelineSemaphoreSubmitInfo & setSignalSemaphoreValues(
       VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const uint64_t> const & signalSemaphoreValues_ ) VULKAN_HPP_NOEXCEPT
     {
@@ -64370,7 +66626,8 @@
       pSignalSemaphoreValues    = signalSemaphoreValues_.data();
       return *this;
     }
-#endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/
+#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/
+#endif   /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkTimelineSemaphoreSubmitInfo const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -64452,6 +66709,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     TraceRaysIndirectCommandKHR & setWidth( uint32_t width_ ) VULKAN_HPP_NOEXCEPT
     {
       width = width_;
@@ -64469,6 +66727,7 @@
       depth = depth_;
       return *this;
     }
+#endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkTraceRaysIndirectCommandKHR const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -64543,6 +66802,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     ValidationCacheCreateInfoEXT & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -64568,7 +66828,7 @@
       return *this;
     }
 
-#if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )
+#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )
     template <typename T>
     ValidationCacheCreateInfoEXT &
       setInitialData( VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const T> const & initialData_ ) VULKAN_HPP_NOEXCEPT
@@ -64577,7 +66837,8 @@
       pInitialData    = initialData_.data();
       return *this;
     }
-#endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/
+#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/
+#endif   /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkValidationCacheCreateInfoEXT const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -64668,6 +66929,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     ValidationFeaturesEXT & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -64688,7 +66950,7 @@
       return *this;
     }
 
-#if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )
+#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )
     ValidationFeaturesEXT & setEnabledValidationFeatures(
       VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::ValidationFeatureEnableEXT> const &
         enabledValidationFeatures_ ) VULKAN_HPP_NOEXCEPT
@@ -64697,7 +66959,7 @@
       pEnabledValidationFeatures    = enabledValidationFeatures_.data();
       return *this;
     }
-#endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/
+#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/
 
     ValidationFeaturesEXT &
       setDisabledValidationFeatureCount( uint32_t disabledValidationFeatureCount_ ) VULKAN_HPP_NOEXCEPT
@@ -64713,7 +66975,7 @@
       return *this;
     }
 
-#if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )
+#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )
     ValidationFeaturesEXT & setDisabledValidationFeatures(
       VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::ValidationFeatureDisableEXT> const &
         disabledValidationFeatures_ ) VULKAN_HPP_NOEXCEPT
@@ -64722,7 +66984,8 @@
       pDisabledValidationFeatures    = disabledValidationFeatures_.data();
       return *this;
     }
-#endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/
+#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/
+#endif   /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkValidationFeaturesEXT const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -64808,6 +67071,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     ValidationFlagsEXT & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -64827,7 +67091,7 @@
       return *this;
     }
 
-#if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )
+#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )
     ValidationFlagsEXT & setDisabledValidationChecks(
       VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::ValidationCheckEXT> const &
         disabledValidationChecks_ ) VULKAN_HPP_NOEXCEPT
@@ -64836,7 +67100,8 @@
       pDisabledValidationChecks    = disabledValidationChecks_.data();
       return *this;
     }
-#endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/
+#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/
+#endif   /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkValidationFlagsEXT const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -64916,6 +67181,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     VertexInputAttributeDescription2EXT & setPNext( void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -64945,6 +67211,7 @@
       offset = offset_;
       return *this;
     }
+#endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkVertexInputAttributeDescription2EXT const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -65025,6 +67292,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     VertexInputBindingDescription2EXT & setPNext( void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -65055,6 +67323,7 @@
       divisor = divisor_;
       return *this;
     }
+#endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkVertexInputBindingDescription2EXT const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -65129,6 +67398,7 @@
       return *this;
     }
 
+#  if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     ViSurfaceCreateInfoNN & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -65146,6 +67416,7 @@
       window = window_;
       return *this;
     }
+#  endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkViSurfaceCreateInfoNN const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -65222,6 +67493,7 @@
       return *this;
     }
 
+#  if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     VideoPictureResourceKHR & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -65252,6 +67524,7 @@
       imageViewBinding = imageViewBinding_;
       return *this;
     }
+#  endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkVideoPictureResourceKHR const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -65328,6 +67601,7 @@
       return *this;
     }
 
+#  if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     VideoReferenceSlotKHR & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -65346,6 +67620,7 @@
       pPictureResource = pPictureResource_;
       return *this;
     }
+#  endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkVideoReferenceSlotKHR const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -65444,6 +67719,7 @@
       return *this;
     }
 
+#  if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     VideoBeginCodingInfoKHR & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -65489,7 +67765,7 @@
       return *this;
     }
 
-#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )
+#    if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )
     VideoBeginCodingInfoKHR & setReferenceSlots(
       VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::VideoReferenceSlotKHR> const &
         referenceSlots_ ) VULKAN_HPP_NOEXCEPT
@@ -65498,7 +67774,8 @@
       pReferenceSlots    = referenceSlots_.data();
       return *this;
     }
-#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/
+#    endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/
+#  endif   /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkVideoBeginCodingInfoKHR const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -65581,6 +67858,7 @@
       return *this;
     }
 
+#  if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     VideoBindMemoryKHR & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -65610,6 +67888,7 @@
       memorySize = memorySize_;
       return *this;
     }
+#  endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkVideoBindMemoryKHR const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -65662,7 +67941,7 @@
     static VULKAN_HPP_CONST_OR_CONSTEXPR StructureType structureType = StructureType::eVideoCapabilitiesKHR;
 
 #  if !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )
-    VULKAN_HPP_CONSTEXPR VideoCapabilitiesKHR( VULKAN_HPP_NAMESPACE::VideoCapabilitiesFlagsKHR capabilityFlags_    = {},
+    VULKAN_HPP_CONSTEXPR VideoCapabilitiesKHR( VULKAN_HPP_NAMESPACE::VideoCapabilityFlagsKHR capabilityFlags_      = {},
                                                VULKAN_HPP_NAMESPACE::DeviceSize minBitstreamBufferOffsetAlignment_ = {},
                                                VULKAN_HPP_NAMESPACE::DeviceSize minBitstreamBufferSizeAlignment_   = {},
                                                VULKAN_HPP_NAMESPACE::Extent2D   videoPictureExtentGranularity_     = {},
@@ -65727,16 +68006,16 @@
 #  endif
 
   public:
-    VULKAN_HPP_NAMESPACE::StructureType             sType           = StructureType::eVideoCapabilitiesKHR;
-    void *                                          pNext           = {};
-    VULKAN_HPP_NAMESPACE::VideoCapabilitiesFlagsKHR capabilityFlags = {};
-    VULKAN_HPP_NAMESPACE::DeviceSize                minBitstreamBufferOffsetAlignment = {};
-    VULKAN_HPP_NAMESPACE::DeviceSize                minBitstreamBufferSizeAlignment   = {};
-    VULKAN_HPP_NAMESPACE::Extent2D                  videoPictureExtentGranularity     = {};
-    VULKAN_HPP_NAMESPACE::Extent2D                  minExtent                         = {};
-    VULKAN_HPP_NAMESPACE::Extent2D                  maxExtent                         = {};
-    uint32_t                                        maxReferencePicturesSlotsCount    = {};
-    uint32_t                                        maxReferencePicturesActiveCount   = {};
+    VULKAN_HPP_NAMESPACE::StructureType           sType           = StructureType::eVideoCapabilitiesKHR;
+    void *                                        pNext           = {};
+    VULKAN_HPP_NAMESPACE::VideoCapabilityFlagsKHR capabilityFlags = {};
+    VULKAN_HPP_NAMESPACE::DeviceSize              minBitstreamBufferOffsetAlignment = {};
+    VULKAN_HPP_NAMESPACE::DeviceSize              minBitstreamBufferSizeAlignment   = {};
+    VULKAN_HPP_NAMESPACE::Extent2D                videoPictureExtentGranularity     = {};
+    VULKAN_HPP_NAMESPACE::Extent2D                minExtent                         = {};
+    VULKAN_HPP_NAMESPACE::Extent2D                maxExtent                         = {};
+    uint32_t                                      maxReferencePicturesSlotsCount    = {};
+    uint32_t                                      maxReferencePicturesActiveCount   = {};
   };
   static_assert( sizeof( VideoCapabilitiesKHR ) == sizeof( VkVideoCapabilitiesKHR ),
                  "struct and wrapper have different size!" );
@@ -65778,6 +68057,7 @@
       return *this;
     }
 
+#  if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     VideoCodingControlInfoKHR & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -65789,6 +68069,7 @@
       flags = flags_;
       return *this;
     }
+#  endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkVideoCodingControlInfoKHR const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -65938,6 +68219,7 @@
       return *this;
     }
 
+#  if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     VideoDecodeH264DpbSlotInfoEXT & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -65950,6 +68232,7 @@
       pStdReferenceInfo = pStdReferenceInfo_;
       return *this;
     }
+#  endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkVideoDecodeH264DpbSlotInfoEXT const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -66019,6 +68302,7 @@
       return *this;
     }
 
+#  if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     VideoDecodeH264MvcEXT & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -66030,6 +68314,7 @@
       pStdMvc = pStdMvc_;
       return *this;
     }
+#  endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkVideoDecodeH264MvcEXT const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -66113,6 +68398,7 @@
       return *this;
     }
 
+#  if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     VideoDecodeH264PictureInfoEXT & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -66138,7 +68424,7 @@
       return *this;
     }
 
-#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )
+#    if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )
     VideoDecodeH264PictureInfoEXT & setSlicesDataOffsets(
       VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const uint32_t> const & slicesDataOffsets_ ) VULKAN_HPP_NOEXCEPT
     {
@@ -66146,7 +68432,8 @@
       pSlicesDataOffsets = slicesDataOffsets_.data();
       return *this;
     }
-#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/
+#    endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/
+#  endif   /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkVideoDecodeH264PictureInfoEXT const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -66200,10 +68487,10 @@
 
 #  if !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )
     VULKAN_HPP_CONSTEXPR VideoDecodeH264ProfileEXT(
-      StdVideoH264ProfileIdc                                   stdProfileIdc_ = {},
-      VULKAN_HPP_NAMESPACE::VideoDecodeH264FieldLayoutFlagsEXT fieldLayout_   = {} ) VULKAN_HPP_NOEXCEPT
+      StdVideoH264ProfileIdc                                     stdProfileIdc_ = {},
+      VULKAN_HPP_NAMESPACE::VideoDecodeH264PictureLayoutFlagsEXT pictureLayout_ = {} ) VULKAN_HPP_NOEXCEPT
       : stdProfileIdc( stdProfileIdc_ )
-      , fieldLayout( fieldLayout_ )
+      , pictureLayout( pictureLayout_ )
     {}
 
     VULKAN_HPP_CONSTEXPR
@@ -66223,6 +68510,7 @@
       return *this;
     }
 
+#  if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     VideoDecodeH264ProfileEXT & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -66236,11 +68524,12 @@
     }
 
     VideoDecodeH264ProfileEXT &
-      setFieldLayout( VULKAN_HPP_NAMESPACE::VideoDecodeH264FieldLayoutFlagsEXT fieldLayout_ ) VULKAN_HPP_NOEXCEPT
+      setPictureLayout( VULKAN_HPP_NAMESPACE::VideoDecodeH264PictureLayoutFlagsEXT pictureLayout_ ) VULKAN_HPP_NOEXCEPT
     {
-      fieldLayout = fieldLayout_;
+      pictureLayout = pictureLayout_;
       return *this;
     }
+#  endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkVideoDecodeH264ProfileEXT const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -66259,7 +68548,7 @@
     {
       return ( sType == rhs.sType ) && ( pNext == rhs.pNext ) &&
              ( memcmp( &stdProfileIdc, &rhs.stdProfileIdc, sizeof( StdVideoH264ProfileIdc ) ) == 0 ) &&
-             ( fieldLayout == rhs.fieldLayout );
+             ( pictureLayout == rhs.pictureLayout );
     }
 
     bool operator!=( VideoDecodeH264ProfileEXT const & rhs ) const VULKAN_HPP_NOEXCEPT
@@ -66269,10 +68558,10 @@
 #  endif
 
   public:
-    VULKAN_HPP_NAMESPACE::StructureType                      sType         = StructureType::eVideoDecodeH264ProfileEXT;
-    const void *                                             pNext         = {};
-    StdVideoH264ProfileIdc                                   stdProfileIdc = {};
-    VULKAN_HPP_NAMESPACE::VideoDecodeH264FieldLayoutFlagsEXT fieldLayout   = {};
+    VULKAN_HPP_NAMESPACE::StructureType                        sType = StructureType::eVideoDecodeH264ProfileEXT;
+    const void *                                               pNext = {};
+    StdVideoH264ProfileIdc                                     stdProfileIdc = {};
+    VULKAN_HPP_NAMESPACE::VideoDecodeH264PictureLayoutFlagsEXT pictureLayout = {};
   };
   static_assert( sizeof( VideoDecodeH264ProfileEXT ) == sizeof( VkVideoDecodeH264ProfileEXT ),
                  "struct and wrapper have different size!" );
@@ -66319,6 +68608,7 @@
       return *this;
     }
 
+#  if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     VideoDecodeH264SessionCreateInfoEXT & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -66338,6 +68628,7 @@
       pStdExtensionVersion = pStdExtensionVersion_;
       return *this;
     }
+#  endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkVideoDecodeH264SessionCreateInfoEXT const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -66432,6 +68723,7 @@
       return *this;
     }
 
+#  if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     VideoDecodeH264SessionParametersAddInfoEXT & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -66451,7 +68743,7 @@
       return *this;
     }
 
-#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )
+#    if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )
     VideoDecodeH264SessionParametersAddInfoEXT &
       setSpsStd( VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const StdVideoH264SequenceParameterSet> const & spsStd_ )
         VULKAN_HPP_NOEXCEPT
@@ -66460,7 +68752,7 @@
       pSpsStd     = spsStd_.data();
       return *this;
     }
-#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/
+#    endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/
 
     VideoDecodeH264SessionParametersAddInfoEXT & setPpsStdCount( uint32_t ppsStdCount_ ) VULKAN_HPP_NOEXCEPT
     {
@@ -66475,7 +68767,7 @@
       return *this;
     }
 
-#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )
+#    if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )
     VideoDecodeH264SessionParametersAddInfoEXT &
       setPpsStd( VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const StdVideoH264PictureParameterSet> const & ppsStd_ )
         VULKAN_HPP_NOEXCEPT
@@ -66484,7 +68776,8 @@
       pPpsStd     = ppsStd_.data();
       return *this;
     }
-#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/
+#    endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/
+#  endif   /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkVideoDecodeH264SessionParametersAddInfoEXT const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -66570,6 +68863,7 @@
       return *this;
     }
 
+#  if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     VideoDecodeH264SessionParametersCreateInfoEXT & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -66594,6 +68888,7 @@
       pParametersAddInfo = pParametersAddInfo_;
       return *this;
     }
+#  endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkVideoDecodeH264SessionParametersCreateInfoEXT const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -66742,6 +69037,7 @@
       return *this;
     }
 
+#  if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     VideoDecodeH265DpbSlotInfoEXT & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -66754,6 +69050,7 @@
       pStdReferenceInfo = pStdReferenceInfo_;
       return *this;
     }
+#  endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkVideoDecodeH265DpbSlotInfoEXT const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -66838,6 +69135,7 @@
       return *this;
     }
 
+#  if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     VideoDecodeH265PictureInfoEXT & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -66863,7 +69161,7 @@
       return *this;
     }
 
-#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )
+#    if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )
     VideoDecodeH265PictureInfoEXT & setSlicesDataOffsets(
       VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const uint32_t> const & slicesDataOffsets_ ) VULKAN_HPP_NOEXCEPT
     {
@@ -66871,7 +69169,8 @@
       pSlicesDataOffsets = slicesDataOffsets_.data();
       return *this;
     }
-#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/
+#    endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/
+#  endif   /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkVideoDecodeH265PictureInfoEXT const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -66945,6 +69244,7 @@
       return *this;
     }
 
+#  if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     VideoDecodeH265ProfileEXT & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -66956,6 +69256,7 @@
       stdProfileIdc = stdProfileIdc_;
       return *this;
     }
+#  endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkVideoDecodeH265ProfileEXT const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -67032,6 +69333,7 @@
       return *this;
     }
 
+#  if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     VideoDecodeH265SessionCreateInfoEXT & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -67051,6 +69353,7 @@
       pStdExtensionVersion = pStdExtensionVersion_;
       return *this;
     }
+#  endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkVideoDecodeH265SessionCreateInfoEXT const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -67145,6 +69448,7 @@
       return *this;
     }
 
+#  if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     VideoDecodeH265SessionParametersAddInfoEXT & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -67164,7 +69468,7 @@
       return *this;
     }
 
-#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )
+#    if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )
     VideoDecodeH265SessionParametersAddInfoEXT &
       setSpsStd( VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const StdVideoH265SequenceParameterSet> const & spsStd_ )
         VULKAN_HPP_NOEXCEPT
@@ -67173,7 +69477,7 @@
       pSpsStd     = spsStd_.data();
       return *this;
     }
-#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/
+#    endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/
 
     VideoDecodeH265SessionParametersAddInfoEXT & setPpsStdCount( uint32_t ppsStdCount_ ) VULKAN_HPP_NOEXCEPT
     {
@@ -67188,7 +69492,7 @@
       return *this;
     }
 
-#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )
+#    if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )
     VideoDecodeH265SessionParametersAddInfoEXT &
       setPpsStd( VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const StdVideoH265PictureParameterSet> const & ppsStd_ )
         VULKAN_HPP_NOEXCEPT
@@ -67197,7 +69501,8 @@
       pPpsStd     = ppsStd_.data();
       return *this;
     }
-#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/
+#    endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/
+#  endif   /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkVideoDecodeH265SessionParametersAddInfoEXT const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -67283,6 +69588,7 @@
       return *this;
     }
 
+#  if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     VideoDecodeH265SessionParametersCreateInfoEXT & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -67307,6 +69613,7 @@
       pParametersAddInfo = pParametersAddInfo_;
       return *this;
     }
+#  endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkVideoDecodeH265SessionParametersCreateInfoEXT const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -67424,6 +69731,7 @@
       return *this;
     }
 
+#  if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     VideoDecodeInfoKHR & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -67493,7 +69801,7 @@
       return *this;
     }
 
-#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )
+#    if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )
     VideoDecodeInfoKHR & setReferenceSlots(
       VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::VideoReferenceSlotKHR> const &
         referenceSlots_ ) VULKAN_HPP_NOEXCEPT
@@ -67502,7 +69810,8 @@
       pReferenceSlots    = referenceSlots_.data();
       return *this;
     }
-#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/
+#    endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/
+#  endif   /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkVideoDecodeInfoKHR const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -67566,17 +69875,17 @@
 
 #  if !defined( VULKAN_HPP_NO_STRUCT_CONSTRUCTORS )
     VULKAN_HPP_CONSTEXPR_14 VideoEncodeH264CapabilitiesEXT(
-      VULKAN_HPP_NAMESPACE::VideoEncodeH264CapabilitiesFlagsEXT flags_                   = {},
-      VULKAN_HPP_NAMESPACE::VideoEncodeH264InputModeFlagsEXT    inputModeFlags_          = {},
-      VULKAN_HPP_NAMESPACE::VideoEncodeH264OutputModeFlagsEXT   outputModeFlags_         = {},
-      VULKAN_HPP_NAMESPACE::Extent2D                            minPictureSizeInMbs_     = {},
-      VULKAN_HPP_NAMESPACE::Extent2D                            maxPictureSizeInMbs_     = {},
-      VULKAN_HPP_NAMESPACE::Extent2D                            inputImageDataAlignment_ = {},
-      uint8_t                                                   maxNumL0ReferenceForP_   = {},
-      uint8_t                                                   maxNumL0ReferenceForB_   = {},
-      uint8_t                                                   maxNumL1Reference_       = {},
-      uint8_t                                                   qualityLevelCount_       = {},
-      VULKAN_HPP_NAMESPACE::ExtensionProperties                 stdExtensionVersion_     = {} ) VULKAN_HPP_NOEXCEPT
+      VULKAN_HPP_NAMESPACE::VideoEncodeH264CapabilityFlagsEXT flags_                   = {},
+      VULKAN_HPP_NAMESPACE::VideoEncodeH264InputModeFlagsEXT  inputModeFlags_          = {},
+      VULKAN_HPP_NAMESPACE::VideoEncodeH264OutputModeFlagsEXT outputModeFlags_         = {},
+      VULKAN_HPP_NAMESPACE::Extent2D                          minPictureSizeInMbs_     = {},
+      VULKAN_HPP_NAMESPACE::Extent2D                          maxPictureSizeInMbs_     = {},
+      VULKAN_HPP_NAMESPACE::Extent2D                          inputImageDataAlignment_ = {},
+      uint8_t                                                 maxNumL0ReferenceForP_   = {},
+      uint8_t                                                 maxNumL0ReferenceForB_   = {},
+      uint8_t                                                 maxNumL1Reference_       = {},
+      uint8_t                                                 qualityLevelCount_       = {},
+      VULKAN_HPP_NAMESPACE::ExtensionProperties               stdExtensionVersion_     = {} ) VULKAN_HPP_NOEXCEPT
       : flags( flags_ )
       , inputModeFlags( inputModeFlags_ )
       , outputModeFlags( outputModeFlags_ )
@@ -67607,6 +69916,7 @@
       return *this;
     }
 
+#  if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     VideoEncodeH264CapabilitiesEXT & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -67614,7 +69924,7 @@
     }
 
     VideoEncodeH264CapabilitiesEXT &
-      setFlags( VULKAN_HPP_NAMESPACE::VideoEncodeH264CapabilitiesFlagsEXT flags_ ) VULKAN_HPP_NOEXCEPT
+      setFlags( VULKAN_HPP_NAMESPACE::VideoEncodeH264CapabilityFlagsEXT flags_ ) VULKAN_HPP_NOEXCEPT
     {
       flags = flags_;
       return *this;
@@ -67685,6 +69995,7 @@
       stdExtensionVersion = stdExtensionVersion_;
       return *this;
     }
+#  endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkVideoEncodeH264CapabilitiesEXT const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -67717,19 +70028,19 @@
 #  endif
 
   public:
-    VULKAN_HPP_NAMESPACE::StructureType                       sType = StructureType::eVideoEncodeH264CapabilitiesEXT;
-    const void *                                              pNext = {};
-    VULKAN_HPP_NAMESPACE::VideoEncodeH264CapabilitiesFlagsEXT flags = {};
-    VULKAN_HPP_NAMESPACE::VideoEncodeH264InputModeFlagsEXT    inputModeFlags          = {};
-    VULKAN_HPP_NAMESPACE::VideoEncodeH264OutputModeFlagsEXT   outputModeFlags         = {};
-    VULKAN_HPP_NAMESPACE::Extent2D                            minPictureSizeInMbs     = {};
-    VULKAN_HPP_NAMESPACE::Extent2D                            maxPictureSizeInMbs     = {};
-    VULKAN_HPP_NAMESPACE::Extent2D                            inputImageDataAlignment = {};
-    uint8_t                                                   maxNumL0ReferenceForP   = {};
-    uint8_t                                                   maxNumL0ReferenceForB   = {};
-    uint8_t                                                   maxNumL1Reference       = {};
-    uint8_t                                                   qualityLevelCount       = {};
-    VULKAN_HPP_NAMESPACE::ExtensionProperties                 stdExtensionVersion     = {};
+    VULKAN_HPP_NAMESPACE::StructureType                     sType = StructureType::eVideoEncodeH264CapabilitiesEXT;
+    const void *                                            pNext = {};
+    VULKAN_HPP_NAMESPACE::VideoEncodeH264CapabilityFlagsEXT flags = {};
+    VULKAN_HPP_NAMESPACE::VideoEncodeH264InputModeFlagsEXT  inputModeFlags          = {};
+    VULKAN_HPP_NAMESPACE::VideoEncodeH264OutputModeFlagsEXT outputModeFlags         = {};
+    VULKAN_HPP_NAMESPACE::Extent2D                          minPictureSizeInMbs     = {};
+    VULKAN_HPP_NAMESPACE::Extent2D                          maxPictureSizeInMbs     = {};
+    VULKAN_HPP_NAMESPACE::Extent2D                          inputImageDataAlignment = {};
+    uint8_t                                                 maxNumL0ReferenceForP   = {};
+    uint8_t                                                 maxNumL0ReferenceForB   = {};
+    uint8_t                                                 maxNumL1Reference       = {};
+    uint8_t                                                 qualityLevelCount       = {};
+    VULKAN_HPP_NAMESPACE::ExtensionProperties               stdExtensionVersion     = {};
   };
   static_assert( sizeof( VideoEncodeH264CapabilitiesEXT ) == sizeof( VkVideoEncodeH264CapabilitiesEXT ),
                  "struct and wrapper have different size!" );
@@ -67774,6 +70085,7 @@
       return *this;
     }
 
+#  if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     VideoEncodeH264DpbSlotInfoEXT & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -67792,6 +70104,7 @@
       pStdPictureInfo = pStdPictureInfo_;
       return *this;
     }
+#  endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkVideoEncodeH264DpbSlotInfoEXT const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -67886,6 +70199,7 @@
       return *this;
     }
 
+#  if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     VideoEncodeH264EmitPictureParametersEXT & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -67917,7 +70231,7 @@
       return *this;
     }
 
-#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )
+#    if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )
     VideoEncodeH264EmitPictureParametersEXT & setPsIdEntries(
       VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const uint8_t> const & psIdEntries_ ) VULKAN_HPP_NOEXCEPT
     {
@@ -67925,7 +70239,8 @@
       ppsIdEntries    = psIdEntries_.data();
       return *this;
     }
-#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/
+#    endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/
+#  endif   /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkVideoEncodeH264EmitPictureParametersEXT const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -68042,6 +70357,7 @@
       return *this;
     }
 
+#  if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     VideoEncodeH264NaluSliceEXT & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -68074,7 +70390,7 @@
       return *this;
     }
 
-#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )
+#    if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )
     VideoEncodeH264NaluSliceEXT & setRefFinalList0Entries(
       VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::VideoEncodeH264DpbSlotInfoEXT> const &
         refFinalList0Entries_ ) VULKAN_HPP_NOEXCEPT
@@ -68083,7 +70399,7 @@
       pRefFinalList0Entries   = refFinalList0Entries_.data();
       return *this;
     }
-#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/
+#    endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/
 
     VideoEncodeH264NaluSliceEXT & setRefFinalList1EntryCount( uint8_t refFinalList1EntryCount_ ) VULKAN_HPP_NOEXCEPT
     {
@@ -68098,7 +70414,7 @@
       return *this;
     }
 
-#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )
+#    if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )
     VideoEncodeH264NaluSliceEXT & setRefFinalList1Entries(
       VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::VideoEncodeH264DpbSlotInfoEXT> const &
         refFinalList1Entries_ ) VULKAN_HPP_NOEXCEPT
@@ -68107,7 +70423,7 @@
       pRefFinalList1Entries   = refFinalList1Entries_.data();
       return *this;
     }
-#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/
+#    endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/
 
     VideoEncodeH264NaluSliceEXT & setPrecedingNaluBytes( uint32_t precedingNaluBytes_ ) VULKAN_HPP_NOEXCEPT
     {
@@ -68126,6 +70442,7 @@
       maxQp = maxQp_;
       return *this;
     }
+#  endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkVideoEncodeH264NaluSliceEXT const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -68209,6 +70526,7 @@
       return *this;
     }
 
+#  if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     VideoEncodeH264ProfileEXT & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -68220,6 +70538,7 @@
       stdProfileIdc = stdProfileIdc_;
       return *this;
     }
+#  endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkVideoEncodeH264ProfileEXT const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -68298,6 +70617,7 @@
       return *this;
     }
 
+#  if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     VideoEncodeH264SessionCreateInfoEXT & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -68324,6 +70644,7 @@
       pStdExtensionVersion = pStdExtensionVersion_;
       return *this;
     }
+#  endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkVideoEncodeH264SessionCreateInfoEXT const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -68419,6 +70740,7 @@
       return *this;
     }
 
+#  if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     VideoEncodeH264SessionParametersAddInfoEXT & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -68438,7 +70760,7 @@
       return *this;
     }
 
-#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )
+#    if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )
     VideoEncodeH264SessionParametersAddInfoEXT &
       setSpsStd( VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const StdVideoH264SequenceParameterSet> const & spsStd_ )
         VULKAN_HPP_NOEXCEPT
@@ -68447,7 +70769,7 @@
       pSpsStd     = spsStd_.data();
       return *this;
     }
-#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/
+#    endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/
 
     VideoEncodeH264SessionParametersAddInfoEXT & setPpsStdCount( uint32_t ppsStdCount_ ) VULKAN_HPP_NOEXCEPT
     {
@@ -68462,7 +70784,7 @@
       return *this;
     }
 
-#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )
+#    if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )
     VideoEncodeH264SessionParametersAddInfoEXT &
       setPpsStd( VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const StdVideoH264PictureParameterSet> const & ppsStd_ )
         VULKAN_HPP_NOEXCEPT
@@ -68471,7 +70793,8 @@
       pPpsStd     = ppsStd_.data();
       return *this;
     }
-#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/
+#    endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/
+#  endif   /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkVideoEncodeH264SessionParametersAddInfoEXT const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -68557,6 +70880,7 @@
       return *this;
     }
 
+#  if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     VideoEncodeH264SessionParametersCreateInfoEXT & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -68581,6 +70905,7 @@
       pParametersAddInfo = pParametersAddInfo_;
       return *this;
     }
+#  endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkVideoEncodeH264SessionParametersCreateInfoEXT const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -68687,6 +71012,7 @@
       return *this;
     }
 
+#  if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     VideoEncodeH264VclFrameInfoEXT & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -68707,7 +71033,7 @@
       return *this;
     }
 
-#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )
+#    if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )
     VideoEncodeH264VclFrameInfoEXT & setRefDefaultFinalList0Entries(
       VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::VideoEncodeH264DpbSlotInfoEXT> const &
         refDefaultFinalList0Entries_ ) VULKAN_HPP_NOEXCEPT
@@ -68716,7 +71042,7 @@
       pRefDefaultFinalList0Entries   = refDefaultFinalList0Entries_.data();
       return *this;
     }
-#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/
+#    endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/
 
     VideoEncodeH264VclFrameInfoEXT &
       setRefDefaultFinalList1EntryCount( uint8_t refDefaultFinalList1EntryCount_ ) VULKAN_HPP_NOEXCEPT
@@ -68732,7 +71058,7 @@
       return *this;
     }
 
-#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )
+#    if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )
     VideoEncodeH264VclFrameInfoEXT & setRefDefaultFinalList1Entries(
       VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::VideoEncodeH264DpbSlotInfoEXT> const &
         refDefaultFinalList1Entries_ ) VULKAN_HPP_NOEXCEPT
@@ -68741,7 +71067,7 @@
       pRefDefaultFinalList1Entries   = refDefaultFinalList1Entries_.data();
       return *this;
     }
-#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/
+#    endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/
 
     VideoEncodeH264VclFrameInfoEXT & setNaluSliceEntryCount( uint32_t naluSliceEntryCount_ ) VULKAN_HPP_NOEXCEPT
     {
@@ -68756,7 +71082,7 @@
       return *this;
     }
 
-#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )
+#    if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )
     VideoEncodeH264VclFrameInfoEXT & setNaluSliceEntries(
       VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::VideoEncodeH264NaluSliceEXT> const &
         naluSliceEntries_ ) VULKAN_HPP_NOEXCEPT
@@ -68765,7 +71091,7 @@
       pNaluSliceEntries   = naluSliceEntries_.data();
       return *this;
     }
-#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/
+#    endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/
 
     VideoEncodeH264VclFrameInfoEXT & setPCurrentPictureInfo(
       const VULKAN_HPP_NAMESPACE::VideoEncodeH264DpbSlotInfoEXT * pCurrentPictureInfo_ ) VULKAN_HPP_NOEXCEPT
@@ -68773,6 +71099,7 @@
       pCurrentPictureInfo = pCurrentPictureInfo_;
       return *this;
     }
+#  endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkVideoEncodeH264VclFrameInfoEXT const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -68898,6 +71225,7 @@
       return *this;
     }
 
+#  if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     VideoEncodeInfoKHR & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -68969,7 +71297,7 @@
       return *this;
     }
 
-#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )
+#    if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )
     VideoEncodeInfoKHR & setReferenceSlots(
       VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::VideoReferenceSlotKHR> const &
         referenceSlots_ ) VULKAN_HPP_NOEXCEPT
@@ -68978,7 +71306,8 @@
       pReferenceSlots    = referenceSlots_.data();
       return *this;
     }
-#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/
+#    endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/
+#  endif   /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkVideoEncodeInfoKHR const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -69077,6 +71406,7 @@
       return *this;
     }
 
+#  if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     VideoEncodeRateControlInfoKHR & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -69127,6 +71457,7 @@
       virtualBufferSizeInMs = virtualBufferSizeInMs_;
       return *this;
     }
+#  endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkVideoEncodeRateControlInfoKHR const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -69208,6 +71539,7 @@
       return *this;
     }
 
+#  if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     VideoEndCodingInfoKHR & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -69219,6 +71551,7 @@
       flags = flags_;
       return *this;
     }
+#  endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkVideoEndCodingInfoKHR const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -69359,6 +71692,7 @@
       return *this;
     }
 
+#  if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     VideoGetMemoryPropertiesKHR & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -69377,6 +71711,7 @@
       pMemoryRequirements = pMemoryRequirements_;
       return *this;
     }
+#  endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkVideoGetMemoryPropertiesKHR const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -69450,6 +71785,7 @@
       return *this;
     }
 
+#  if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     VideoQueueFamilyProperties2KHR & setPNext( void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -69462,6 +71798,7 @@
       videoCodecOperations = videoCodecOperations_;
       return *this;
     }
+#  endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkVideoQueueFamilyProperties2KHR const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -69547,6 +71884,7 @@
       return *this;
     }
 
+#  if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     VideoSessionCreateInfoKHR & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -69605,6 +71943,7 @@
       maxReferencePicturesActiveCount = maxReferencePicturesActiveCount_;
       return *this;
     }
+#  endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkVideoSessionCreateInfoKHR const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -69692,6 +72031,7 @@
       return *this;
     }
 
+#  if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     VideoSessionParametersCreateInfoKHR & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -69711,6 +72051,7 @@
       videoSession = videoSession_;
       return *this;
     }
+#  endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkVideoSessionParametersCreateInfoKHR const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -69786,6 +72127,7 @@
       return *this;
     }
 
+#  if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     VideoSessionParametersUpdateInfoKHR & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -69797,6 +72139,7 @@
       updateSequenceCount = updateSequenceCount_;
       return *this;
     }
+#  endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkVideoSessionParametersUpdateInfoKHR const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -69871,6 +72214,7 @@
       return *this;
     }
 
+#  if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     WaylandSurfaceCreateInfoKHR & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -69895,6 +72239,7 @@
       surface = surface_;
       return *this;
     }
+#  endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkWaylandSurfaceCreateInfoKHR const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -70037,6 +72382,7 @@
       return *this;
     }
 
+#  if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     Win32KeyedMutexAcquireReleaseInfoKHR & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -70056,7 +72402,7 @@
       return *this;
     }
 
-#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )
+#    if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )
     Win32KeyedMutexAcquireReleaseInfoKHR & setAcquireSyncs(
       VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::DeviceMemory> const & acquireSyncs_ )
       VULKAN_HPP_NOEXCEPT
@@ -70065,7 +72411,7 @@
       pAcquireSyncs = acquireSyncs_.data();
       return *this;
     }
-#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/
+#    endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/
 
     Win32KeyedMutexAcquireReleaseInfoKHR & setPAcquireKeys( const uint64_t * pAcquireKeys_ ) VULKAN_HPP_NOEXCEPT
     {
@@ -70073,7 +72419,7 @@
       return *this;
     }
 
-#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )
+#    if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )
     Win32KeyedMutexAcquireReleaseInfoKHR & setAcquireKeys(
       VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const uint64_t> const & acquireKeys_ ) VULKAN_HPP_NOEXCEPT
     {
@@ -70081,7 +72427,7 @@
       pAcquireKeys = acquireKeys_.data();
       return *this;
     }
-#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/
+#    endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/
 
     Win32KeyedMutexAcquireReleaseInfoKHR & setPAcquireTimeouts( const uint32_t * pAcquireTimeouts_ ) VULKAN_HPP_NOEXCEPT
     {
@@ -70089,7 +72435,7 @@
       return *this;
     }
 
-#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )
+#    if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )
     Win32KeyedMutexAcquireReleaseInfoKHR & setAcquireTimeouts(
       VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const uint32_t> const & acquireTimeouts_ ) VULKAN_HPP_NOEXCEPT
     {
@@ -70097,7 +72443,7 @@
       pAcquireTimeouts = acquireTimeouts_.data();
       return *this;
     }
-#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/
+#    endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/
 
     Win32KeyedMutexAcquireReleaseInfoKHR & setReleaseCount( uint32_t releaseCount_ ) VULKAN_HPP_NOEXCEPT
     {
@@ -70112,7 +72458,7 @@
       return *this;
     }
 
-#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )
+#    if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )
     Win32KeyedMutexAcquireReleaseInfoKHR & setReleaseSyncs(
       VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::DeviceMemory> const & releaseSyncs_ )
       VULKAN_HPP_NOEXCEPT
@@ -70121,7 +72467,7 @@
       pReleaseSyncs = releaseSyncs_.data();
       return *this;
     }
-#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/
+#    endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/
 
     Win32KeyedMutexAcquireReleaseInfoKHR & setPReleaseKeys( const uint64_t * pReleaseKeys_ ) VULKAN_HPP_NOEXCEPT
     {
@@ -70129,7 +72475,7 @@
       return *this;
     }
 
-#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )
+#    if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )
     Win32KeyedMutexAcquireReleaseInfoKHR & setReleaseKeys(
       VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const uint64_t> const & releaseKeys_ ) VULKAN_HPP_NOEXCEPT
     {
@@ -70137,7 +72483,8 @@
       pReleaseKeys = releaseKeys_.data();
       return *this;
     }
-#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/
+#    endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/
+#  endif   /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkWin32KeyedMutexAcquireReleaseInfoKHR const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -70286,6 +72633,7 @@
       return *this;
     }
 
+#  if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     Win32KeyedMutexAcquireReleaseInfoNV & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -70305,7 +72653,7 @@
       return *this;
     }
 
-#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )
+#    if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )
     Win32KeyedMutexAcquireReleaseInfoNV & setAcquireSyncs(
       VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::DeviceMemory> const & acquireSyncs_ )
       VULKAN_HPP_NOEXCEPT
@@ -70314,7 +72662,7 @@
       pAcquireSyncs = acquireSyncs_.data();
       return *this;
     }
-#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/
+#    endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/
 
     Win32KeyedMutexAcquireReleaseInfoNV & setPAcquireKeys( const uint64_t * pAcquireKeys_ ) VULKAN_HPP_NOEXCEPT
     {
@@ -70322,7 +72670,7 @@
       return *this;
     }
 
-#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )
+#    if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )
     Win32KeyedMutexAcquireReleaseInfoNV & setAcquireKeys(
       VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const uint64_t> const & acquireKeys_ ) VULKAN_HPP_NOEXCEPT
     {
@@ -70330,7 +72678,7 @@
       pAcquireKeys = acquireKeys_.data();
       return *this;
     }
-#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/
+#    endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/
 
     Win32KeyedMutexAcquireReleaseInfoNV &
       setPAcquireTimeoutMilliseconds( const uint32_t * pAcquireTimeoutMilliseconds_ ) VULKAN_HPP_NOEXCEPT
@@ -70339,7 +72687,7 @@
       return *this;
     }
 
-#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )
+#    if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )
     Win32KeyedMutexAcquireReleaseInfoNV & setAcquireTimeoutMilliseconds(
       VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const uint32_t> const & acquireTimeoutMilliseconds_ )
       VULKAN_HPP_NOEXCEPT
@@ -70348,7 +72696,7 @@
       pAcquireTimeoutMilliseconds = acquireTimeoutMilliseconds_.data();
       return *this;
     }
-#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/
+#    endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/
 
     Win32KeyedMutexAcquireReleaseInfoNV & setReleaseCount( uint32_t releaseCount_ ) VULKAN_HPP_NOEXCEPT
     {
@@ -70363,7 +72711,7 @@
       return *this;
     }
 
-#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )
+#    if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )
     Win32KeyedMutexAcquireReleaseInfoNV & setReleaseSyncs(
       VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::DeviceMemory> const & releaseSyncs_ )
       VULKAN_HPP_NOEXCEPT
@@ -70372,7 +72720,7 @@
       pReleaseSyncs = releaseSyncs_.data();
       return *this;
     }
-#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/
+#    endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/
 
     Win32KeyedMutexAcquireReleaseInfoNV & setPReleaseKeys( const uint64_t * pReleaseKeys_ ) VULKAN_HPP_NOEXCEPT
     {
@@ -70380,7 +72728,7 @@
       return *this;
     }
 
-#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )
+#    if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )
     Win32KeyedMutexAcquireReleaseInfoNV & setReleaseKeys(
       VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const uint64_t> const & releaseKeys_ ) VULKAN_HPP_NOEXCEPT
     {
@@ -70388,7 +72736,8 @@
       pReleaseKeys = releaseKeys_.data();
       return *this;
     }
-#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/
+#    endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/
+#  endif   /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkWin32KeyedMutexAcquireReleaseInfoNV const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -70473,6 +72822,7 @@
       return *this;
     }
 
+#  if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     Win32SurfaceCreateInfoKHR & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -70496,6 +72846,7 @@
       hwnd = hwnd_;
       return *this;
     }
+#  endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkWin32SurfaceCreateInfoKHR const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -70617,6 +72968,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     WriteDescriptorSet & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -70660,7 +73012,7 @@
       return *this;
     }
 
-#if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )
+#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )
     WriteDescriptorSet & setImageInfo(
       VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::DescriptorImageInfo> const &
         imageInfo_ ) VULKAN_HPP_NOEXCEPT
@@ -70669,7 +73021,7 @@
       pImageInfo      = imageInfo_.data();
       return *this;
     }
-#endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/
+#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/
 
     WriteDescriptorSet &
       setPBufferInfo( const VULKAN_HPP_NAMESPACE::DescriptorBufferInfo * pBufferInfo_ ) VULKAN_HPP_NOEXCEPT
@@ -70678,7 +73030,7 @@
       return *this;
     }
 
-#if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )
+#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )
     WriteDescriptorSet & setBufferInfo(
       VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::DescriptorBufferInfo> const &
         bufferInfo_ ) VULKAN_HPP_NOEXCEPT
@@ -70687,7 +73039,7 @@
       pBufferInfo     = bufferInfo_.data();
       return *this;
     }
-#endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/
+#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/
 
     WriteDescriptorSet &
       setPTexelBufferView( const VULKAN_HPP_NAMESPACE::BufferView * pTexelBufferView_ ) VULKAN_HPP_NOEXCEPT
@@ -70696,7 +73048,7 @@
       return *this;
     }
 
-#if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )
+#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )
     WriteDescriptorSet & setTexelBufferView(
       VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::BufferView> const & texelBufferView_ )
       VULKAN_HPP_NOEXCEPT
@@ -70705,7 +73057,8 @@
       pTexelBufferView = texelBufferView_.data();
       return *this;
     }
-#endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/
+#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/
+#endif   /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkWriteDescriptorSet const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -70800,6 +73153,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     WriteDescriptorSetAccelerationStructureKHR & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -70820,7 +73174,7 @@
       return *this;
     }
 
-#if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )
+#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )
     WriteDescriptorSetAccelerationStructureKHR & setAccelerationStructures(
       VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::AccelerationStructureKHR> const &
         accelerationStructures_ ) VULKAN_HPP_NOEXCEPT
@@ -70829,7 +73183,8 @@
       pAccelerationStructures    = accelerationStructures_.data();
       return *this;
     }
-#endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/
+#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/
+#endif   /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkWriteDescriptorSetAccelerationStructureKHR const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -70918,6 +73273,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     WriteDescriptorSetAccelerationStructureNV & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -70938,7 +73294,7 @@
       return *this;
     }
 
-#if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )
+#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )
     WriteDescriptorSetAccelerationStructureNV & setAccelerationStructures(
       VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const VULKAN_HPP_NAMESPACE::AccelerationStructureNV> const &
         accelerationStructures_ ) VULKAN_HPP_NOEXCEPT
@@ -70947,7 +73303,8 @@
       pAccelerationStructures    = accelerationStructures_.data();
       return *this;
     }
-#endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/
+#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/
+#endif   /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkWriteDescriptorSetAccelerationStructureNV const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -71032,6 +73389,7 @@
       return *this;
     }
 
+#if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     WriteDescriptorSetInlineUniformBlockEXT & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -71050,7 +73408,7 @@
       return *this;
     }
 
-#if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )
+#  if !defined( VULKAN_HPP_DISABLE_ENHANCED_MODE )
     template <typename T>
     WriteDescriptorSetInlineUniformBlockEXT &
       setData( VULKAN_HPP_NAMESPACE::ArrayProxyNoTemporaries<const T> const & data_ ) VULKAN_HPP_NOEXCEPT
@@ -71059,7 +73417,8 @@
       pData    = data_.data();
       return *this;
     }
-#endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/
+#  endif /*VULKAN_HPP_DISABLE_ENHANCED_MODE*/
+#endif   /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkWriteDescriptorSetInlineUniformBlockEXT const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -71134,6 +73493,7 @@
       return *this;
     }
 
+#  if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     XcbSurfaceCreateInfoKHR & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -71157,6 +73517,7 @@
       window = window_;
       return *this;
     }
+#  endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkXcbSurfaceCreateInfoKHR const &() const VULKAN_HPP_NOEXCEPT
     {
@@ -71232,6 +73593,7 @@
       return *this;
     }
 
+#  if !defined( VULKAN_HPP_NO_STRUCT_SETTERS )
     XlibSurfaceCreateInfoKHR & setPNext( const void * pNext_ ) VULKAN_HPP_NOEXCEPT
     {
       pNext = pNext_;
@@ -71255,6 +73617,7 @@
       window = window_;
       return *this;
     }
+#  endif /*VULKAN_HPP_NO_STRUCT_SETTERS*/
 
     operator VkXlibSurfaceCreateInfoKHR const &() const VULKAN_HPP_NOEXCEPT
     {
diff --git a/third_party/vulkan-deps/vulkan-headers/src/registry/generator.py b/third_party/vulkan-deps/vulkan-headers/src/registry/generator.py
index 19bbc3c..01274a3 100644
--- a/third_party/vulkan-deps/vulkan-headers/src/registry/generator.py
+++ b/third_party/vulkan-deps/vulkan-headers/src/registry/generator.py
@@ -553,7 +553,7 @@
                     # Work around this by chasing the aliases to get the actual value.
                     while numVal is None:
                         alias = self.registry.tree.find("enums/enum[@name='" + strVal + "']")
-                        (numVal, strVal) = self.enumToValue(alias, True)
+                        (numVal, strVal) = self.enumToValue(alias, True, bitwidth, True)
                     decl += "static const {} {} = {};\n".format(flagTypeName, name, strVal)
 
                 if numVal is not None:
diff --git a/third_party/vulkan-deps/vulkan-headers/src/registry/genvk.py b/third_party/vulkan-deps/vulkan-headers/src/registry/genvk.py
index 069ee68..becf580 100755
--- a/third_party/vulkan-deps/vulkan-headers/src/registry/genvk.py
+++ b/third_party/vulkan-deps/vulkan-headers/src/registry/genvk.py
@@ -601,7 +601,7 @@
     parser.add_argument('-time', action='store_true',
                         help='Enable timing')
     parser.add_argument('-validate', action='store_true',
-                        help='Enable XML group validation')
+                        help='Validate the registry properties and exit')
     parser.add_argument('-genpath', action='store', default='gen',
                         help='Path to generated files')
     parser.add_argument('-o', action='store', dest='directory',
@@ -635,8 +635,10 @@
     else:
         diag = None
 
-    # Create the API generator & generator options
-    (gen, options) = genTarget(args)
+    (gen, options) = (None, None)
+    if not args.validate:
+      # Create the API generator & generator options
+      (gen, options) = genTarget(args)
 
     # Create the registry object with the specified generator and generator
     # options. The options are set before XML loading as they may affect it.
@@ -653,7 +655,8 @@
     endTimer(args.time, '* Time to parse ElementTree =')
 
     if args.validate:
-        reg.validateGroups()
+        success = reg.validateRegistry()
+        sys.exit(0 if success else 1)
 
     if args.dump:
         logDiag('* Dumping registry to regdump.txt')
diff --git a/third_party/vulkan-deps/vulkan-headers/src/registry/reg.py b/third_party/vulkan-deps/vulkan-headers/src/registry/reg.py
index afb374d..699235a 100644
--- a/third_party/vulkan-deps/vulkan-headers/src/registry/reg.py
+++ b/third_party/vulkan-deps/vulkan-headers/src/registry/reg.py
@@ -1353,39 +1353,45 @@
         for cmd in self.apidict:
             self.apidict[cmd].resetState()
 
-    def validateGroups(self):
-        """Validate `group=` attributes on `<param>` and `<proto>` tags.
+    def __validateStructLimittypes(self, struct):
+        """Validate 'limittype' attributes for a single struct."""
+        limittypeDiags = namedtuple('limittypeDiags', ['missing', 'invalid'])
+        badFields = defaultdict(lambda : limittypeDiags(missing=[], invalid=[]))
+        validLimittypes = { 'min', 'max', 'bitmask', 'range', 'struct', 'noauto' }
+        for member in struct.getMembers():
+            memberName = member.findtext('name')
+            if memberName in ['sType', 'pNext']:
+                continue
+            limittype = member.get('limittype')
+            if not limittype:
+                badFields[struct.elem.get('name')].missing.append(memberName)
+            elif limittype == 'struct':
+                typeName = member.findtext('type')
+                memberType = self.typedict[typeName]
+                badFields.update(self.__validateStructLimittypes(memberType))
+            elif limittype not in validLimittypes:
+                badFields[struct.elem.get('name')].invalid.append(memberName)
+        return badFields
 
-        Check that `group=` attributes match actual groups"""
-        # Keep track of group names not in <group> tags
-        badGroup = {}
-        self.gen.logMsg('diag', 'VALIDATING GROUP ATTRIBUTES')
-        for cmd in self.reg.findall('commands/command'):
-            proto = cmd.find('proto')
-            # funcname = cmd.find('proto/name').text
-            group = proto.get('group')
-            if group is not None and group not in self.groupdict:
-                # self.gen.logMsg('diag', '*** Command ', funcname, ' has UNKNOWN return group ', group)
-                if group not in badGroup:
-                    badGroup[group] = 1
-                else:
-                    badGroup[group] = badGroup[group] + 1
+    def __validateLimittype(self):
+        """Validate 'limittype' attributes."""
+        self.gen.logMsg('diag', 'VALIDATING LIMITTYPE ATTRIBUTES')
+        badFields = self.__validateStructLimittypes(self.typedict['VkPhysicalDeviceProperties2'])
+        for featStructName in self.validextensionstructs['VkPhysicalDeviceProperties2']:
+            featStruct = self.typedict[featStructName]
+            badFields.update(self.__validateStructLimittypes(featStruct))
 
-            for param in cmd.findall('param'):
-                pname = param.find('name')
-                if pname is not None:
-                    pname = pname.text
-                else:
-                    pname = param.get('name')
-                group = param.get('group')
-                if group is not None and group not in self.groupdict:
-                    # self.gen.logMsg('diag', '*** Command ', funcname, ' param ', pname, ' has UNKNOWN group ', group)
-                    if group not in badGroup:
-                        badGroup[group] = 1
-                    else:
-                        badGroup[group] = badGroup[group] + 1
+        if badFields:
+            self.gen.logMsg('diag', 'SUMMARY OF FIELDS WITH INCORRECT LIMITTYPES')
+            for key in sorted(badFields.keys()):
+                diags = badFields[key]
+                if diags.missing:
+                    self.gen.logMsg('diag', '    ', key, 'missing limittype:', ', '.join(badFields[key].missing))
+                if diags.invalid:
+                    self.gen.logMsg('diag', '    ', key, 'invalid limittype:', ', '.join(badFields[key].invalid))
+            return False
+        return True
 
-        if badGroup:
-            self.gen.logMsg('diag', 'SUMMARY OF UNRECOGNIZED GROUPS')
-            for key in sorted(badGroup.keys()):
-                self.gen.logMsg('diag', '    ', key, ' occurred ', badGroup[key], ' times')
+    def validateRegistry(self):
+        """Validate properties of the registry."""
+        return self.__validateLimittype()
diff --git a/third_party/vulkan-deps/vulkan-headers/src/registry/validusage.json b/third_party/vulkan-deps/vulkan-headers/src/registry/validusage.json
index 9a515dd..2cf6aa8 100644
--- a/third_party/vulkan-deps/vulkan-headers/src/registry/validusage.json
+++ b/third_party/vulkan-deps/vulkan-headers/src/registry/validusage.json
@@ -1,9 +1,9 @@
 {
   "version info": {
     "schema version": 2,
-    "api version": "1.2.184",
-    "comment": "from git branch: github-main commit: 02c265fb0af1eb5e82651e6c001d3790101adf96",
-    "date": "2021-07-05 12:24:53Z"
+    "api version": "1.2.190",
+    "comment": "from git branch: github-main commit: e57864f6a51a2d56dc7f012b21957755c59aafa8",
+    "date": "2021-08-29 21:41:03Z"
   },
   "validation": {
     "vkGetInstanceProcAddr": {
@@ -62,13 +62,13 @@
       "(VK_EXT_debug_report,VK_EXT_debug_utils)+(VK_EXT_debug_report)": [
         {
           "vuid": "VUID-VkInstanceCreateInfo-pNext-04925",
-          "text": " If the <code>pNext</code> chain of <code>VkInstanceCreateInfo</code> includes a <code>VkDebugReportCallbackCreateInfoEXT</code> structure, the list of enabled extensions in <code>ppEnabledExtensionNames</code> <strong class=\"purple\">must</strong> contain VK_EXT_debug_report."
+          "text": " If the <code>pNext</code> chain of <code>VkInstanceCreateInfo</code> includes a <code>VkDebugReportCallbackCreateInfoEXT</code> structure, the list of enabled extensions in <code>ppEnabledExtensionNames</code> <strong class=\"purple\">must</strong> contain VK_EXT_debug_report"
         }
       ],
       "(VK_EXT_debug_report,VK_EXT_debug_utils)+(VK_EXT_debug_utils)": [
         {
           "vuid": "VUID-VkInstanceCreateInfo-pNext-04926",
-          "text": " If the <code>pNext</code> chain of <code>VkInstanceCreateInfo</code> includes a <code>VkDebugUtilsMessengerCreateInfoEXT</code> structure, the list of enabled extensions in <code>ppEnabledExtensionNames</code> <strong class=\"purple\">must</strong> contain VK_EXT_debug_utils."
+          "text": " If the <code>pNext</code> chain of <code>VkInstanceCreateInfo</code> includes a <code>VkDebugUtilsMessengerCreateInfoEXT</code> structure, the list of enabled extensions in <code>ppEnabledExtensionNames</code> <strong class=\"purple\">must</strong> contain VK_EXT_debug_utils"
         }
       ],
       "core": [
@@ -238,7 +238,7 @@
         },
         {
           "vuid": "VUID-VkPhysicalDeviceProperties2-pNext-pNext",
-          "text": " Each <code>pNext</code> member of any structure (including this one) in the <code>pNext</code> chain <strong class=\"purple\">must</strong> be either <code>NULL</code> or a pointer to a valid instance of <a href=\"#VkPhysicalDeviceAccelerationStructurePropertiesKHR\">VkPhysicalDeviceAccelerationStructurePropertiesKHR</a>, <a href=\"#VkPhysicalDeviceBlendOperationAdvancedPropertiesEXT\">VkPhysicalDeviceBlendOperationAdvancedPropertiesEXT</a>, <a href=\"#VkPhysicalDeviceConservativeRasterizationPropertiesEXT\">VkPhysicalDeviceConservativeRasterizationPropertiesEXT</a>, <a href=\"#VkPhysicalDeviceCooperativeMatrixPropertiesNV\">VkPhysicalDeviceCooperativeMatrixPropertiesNV</a>, <a href=\"#VkPhysicalDeviceCustomBorderColorPropertiesEXT\">VkPhysicalDeviceCustomBorderColorPropertiesEXT</a>, <a href=\"#VkPhysicalDeviceDepthStencilResolveProperties\">VkPhysicalDeviceDepthStencilResolveProperties</a>, <a href=\"#VkPhysicalDeviceDescriptorIndexingProperties\">VkPhysicalDeviceDescriptorIndexingProperties</a>, <a href=\"#VkPhysicalDeviceDeviceGeneratedCommandsPropertiesNV\">VkPhysicalDeviceDeviceGeneratedCommandsPropertiesNV</a>, <a href=\"#VkPhysicalDeviceDiscardRectanglePropertiesEXT\">VkPhysicalDeviceDiscardRectanglePropertiesEXT</a>, <a href=\"#VkPhysicalDeviceDriverProperties\">VkPhysicalDeviceDriverProperties</a>, <a href=\"#VkPhysicalDeviceDrmPropertiesEXT\">VkPhysicalDeviceDrmPropertiesEXT</a>, <a href=\"#VkPhysicalDeviceExternalMemoryHostPropertiesEXT\">VkPhysicalDeviceExternalMemoryHostPropertiesEXT</a>, <a href=\"#VkPhysicalDeviceFloatControlsProperties\">VkPhysicalDeviceFloatControlsProperties</a>, <a href=\"#VkPhysicalDeviceFragmentDensityMap2PropertiesEXT\">VkPhysicalDeviceFragmentDensityMap2PropertiesEXT</a>, <a href=\"#VkPhysicalDeviceFragmentDensityMapPropertiesEXT\">VkPhysicalDeviceFragmentDensityMapPropertiesEXT</a>, <a href=\"#VkPhysicalDeviceFragmentShadingRateEnumsPropertiesNV\">VkPhysicalDeviceFragmentShadingRateEnumsPropertiesNV</a>, <a href=\"#VkPhysicalDeviceFragmentShadingRatePropertiesKHR\">VkPhysicalDeviceFragmentShadingRatePropertiesKHR</a>, <a href=\"#VkPhysicalDeviceIDProperties\">VkPhysicalDeviceIDProperties</a>, <a href=\"#VkPhysicalDeviceInlineUniformBlockPropertiesEXT\">VkPhysicalDeviceInlineUniformBlockPropertiesEXT</a>, <a href=\"#VkPhysicalDeviceLineRasterizationPropertiesEXT\">VkPhysicalDeviceLineRasterizationPropertiesEXT</a>, <a href=\"#VkPhysicalDeviceMaintenance3Properties\">VkPhysicalDeviceMaintenance3Properties</a>, <a href=\"#VkPhysicalDeviceMeshShaderPropertiesNV\">VkPhysicalDeviceMeshShaderPropertiesNV</a>, <a href=\"#VkPhysicalDeviceMultiDrawPropertiesEXT\">VkPhysicalDeviceMultiDrawPropertiesEXT</a>, <a href=\"#VkPhysicalDeviceMultiviewPerViewAttributesPropertiesNVX\">VkPhysicalDeviceMultiviewPerViewAttributesPropertiesNVX</a>, <a href=\"#VkPhysicalDeviceMultiviewProperties\">VkPhysicalDeviceMultiviewProperties</a>, <a href=\"#VkPhysicalDevicePCIBusInfoPropertiesEXT\">VkPhysicalDevicePCIBusInfoPropertiesEXT</a>, <a href=\"#VkPhysicalDevicePerformanceQueryPropertiesKHR\">VkPhysicalDevicePerformanceQueryPropertiesKHR</a>, <a href=\"#VkPhysicalDevicePointClippingProperties\">VkPhysicalDevicePointClippingProperties</a>, <a href=\"#VkPhysicalDevicePortabilitySubsetPropertiesKHR\">VkPhysicalDevicePortabilitySubsetPropertiesKHR</a>, <a href=\"#VkPhysicalDeviceProtectedMemoryProperties\">VkPhysicalDeviceProtectedMemoryProperties</a>, <a href=\"#VkPhysicalDeviceProvokingVertexPropertiesEXT\">VkPhysicalDeviceProvokingVertexPropertiesEXT</a>, <a href=\"#VkPhysicalDevicePushDescriptorPropertiesKHR\">VkPhysicalDevicePushDescriptorPropertiesKHR</a>, <a href=\"#VkPhysicalDeviceRayTracingPipelinePropertiesKHR\">VkPhysicalDeviceRayTracingPipelinePropertiesKHR</a>, <a href=\"#VkPhysicalDeviceRayTracingPropertiesNV\">VkPhysicalDeviceRayTracingPropertiesNV</a>, <a href=\"#VkPhysicalDeviceRobustness2PropertiesEXT\">VkPhysicalDeviceRobustness2PropertiesEXT</a>, <a href=\"#VkPhysicalDeviceSampleLocationsPropertiesEXT\">VkPhysicalDeviceSampleLocationsPropertiesEXT</a>, <a href=\"#VkPhysicalDeviceSamplerFilterMinmaxProperties\">VkPhysicalDeviceSamplerFilterMinmaxProperties</a>, <a href=\"#VkPhysicalDeviceShaderCoreProperties2AMD\">VkPhysicalDeviceShaderCoreProperties2AMD</a>, <a href=\"#VkPhysicalDeviceShaderCorePropertiesAMD\">VkPhysicalDeviceShaderCorePropertiesAMD</a>, <a href=\"#VkPhysicalDeviceShaderSMBuiltinsPropertiesNV\">VkPhysicalDeviceShaderSMBuiltinsPropertiesNV</a>, <a href=\"#VkPhysicalDeviceShadingRateImagePropertiesNV\">VkPhysicalDeviceShadingRateImagePropertiesNV</a>, <a href=\"#VkPhysicalDeviceSubgroupProperties\">VkPhysicalDeviceSubgroupProperties</a>, <a href=\"#VkPhysicalDeviceSubgroupSizeControlPropertiesEXT\">VkPhysicalDeviceSubgroupSizeControlPropertiesEXT</a>, <a href=\"#VkPhysicalDeviceSubpassShadingPropertiesHUAWEI\">VkPhysicalDeviceSubpassShadingPropertiesHUAWEI</a>, <a href=\"#VkPhysicalDeviceTexelBufferAlignmentPropertiesEXT\">VkPhysicalDeviceTexelBufferAlignmentPropertiesEXT</a>, <a href=\"#VkPhysicalDeviceTimelineSemaphoreProperties\">VkPhysicalDeviceTimelineSemaphoreProperties</a>, <a href=\"#VkPhysicalDeviceTransformFeedbackPropertiesEXT\">VkPhysicalDeviceTransformFeedbackPropertiesEXT</a>, <a href=\"#VkPhysicalDeviceVertexAttributeDivisorPropertiesEXT\">VkPhysicalDeviceVertexAttributeDivisorPropertiesEXT</a>, <a href=\"#VkPhysicalDeviceVulkan11Properties\">VkPhysicalDeviceVulkan11Properties</a>, or <a href=\"#VkPhysicalDeviceVulkan12Properties\">VkPhysicalDeviceVulkan12Properties</a>"
+          "text": " Each <code>pNext</code> member of any structure (including this one) in the <code>pNext</code> chain <strong class=\"purple\">must</strong> be either <code>NULL</code> or a pointer to a valid instance of <a href=\"#VkPhysicalDeviceAccelerationStructurePropertiesKHR\">VkPhysicalDeviceAccelerationStructurePropertiesKHR</a>, <a href=\"#VkPhysicalDeviceBlendOperationAdvancedPropertiesEXT\">VkPhysicalDeviceBlendOperationAdvancedPropertiesEXT</a>, <a href=\"#VkPhysicalDeviceConservativeRasterizationPropertiesEXT\">VkPhysicalDeviceConservativeRasterizationPropertiesEXT</a>, <a href=\"#VkPhysicalDeviceCooperativeMatrixPropertiesNV\">VkPhysicalDeviceCooperativeMatrixPropertiesNV</a>, <a href=\"#VkPhysicalDeviceCustomBorderColorPropertiesEXT\">VkPhysicalDeviceCustomBorderColorPropertiesEXT</a>, <a href=\"#VkPhysicalDeviceDepthStencilResolveProperties\">VkPhysicalDeviceDepthStencilResolveProperties</a>, <a href=\"#VkPhysicalDeviceDescriptorIndexingProperties\">VkPhysicalDeviceDescriptorIndexingProperties</a>, <a href=\"#VkPhysicalDeviceDeviceGeneratedCommandsPropertiesNV\">VkPhysicalDeviceDeviceGeneratedCommandsPropertiesNV</a>, <a href=\"#VkPhysicalDeviceDiscardRectanglePropertiesEXT\">VkPhysicalDeviceDiscardRectanglePropertiesEXT</a>, <a href=\"#VkPhysicalDeviceDriverProperties\">VkPhysicalDeviceDriverProperties</a>, <a href=\"#VkPhysicalDeviceDrmPropertiesEXT\">VkPhysicalDeviceDrmPropertiesEXT</a>, <a href=\"#VkPhysicalDeviceExternalMemoryHostPropertiesEXT\">VkPhysicalDeviceExternalMemoryHostPropertiesEXT</a>, <a href=\"#VkPhysicalDeviceFloatControlsProperties\">VkPhysicalDeviceFloatControlsProperties</a>, <a href=\"#VkPhysicalDeviceFragmentDensityMap2PropertiesEXT\">VkPhysicalDeviceFragmentDensityMap2PropertiesEXT</a>, <a href=\"#VkPhysicalDeviceFragmentDensityMapPropertiesEXT\">VkPhysicalDeviceFragmentDensityMapPropertiesEXT</a>, <a href=\"#VkPhysicalDeviceFragmentShadingRateEnumsPropertiesNV\">VkPhysicalDeviceFragmentShadingRateEnumsPropertiesNV</a>, <a href=\"#VkPhysicalDeviceFragmentShadingRatePropertiesKHR\">VkPhysicalDeviceFragmentShadingRatePropertiesKHR</a>, <a href=\"#VkPhysicalDeviceIDProperties\">VkPhysicalDeviceIDProperties</a>, <a href=\"#VkPhysicalDeviceInlineUniformBlockPropertiesEXT\">VkPhysicalDeviceInlineUniformBlockPropertiesEXT</a>, <a href=\"#VkPhysicalDeviceLineRasterizationPropertiesEXT\">VkPhysicalDeviceLineRasterizationPropertiesEXT</a>, <a href=\"#VkPhysicalDeviceMaintenance3Properties\">VkPhysicalDeviceMaintenance3Properties</a>, <a href=\"#VkPhysicalDeviceMeshShaderPropertiesNV\">VkPhysicalDeviceMeshShaderPropertiesNV</a>, <a href=\"#VkPhysicalDeviceMultiDrawPropertiesEXT\">VkPhysicalDeviceMultiDrawPropertiesEXT</a>, <a href=\"#VkPhysicalDeviceMultiviewPerViewAttributesPropertiesNVX\">VkPhysicalDeviceMultiviewPerViewAttributesPropertiesNVX</a>, <a href=\"#VkPhysicalDeviceMultiviewProperties\">VkPhysicalDeviceMultiviewProperties</a>, <a href=\"#VkPhysicalDevicePCIBusInfoPropertiesEXT\">VkPhysicalDevicePCIBusInfoPropertiesEXT</a>, <a href=\"#VkPhysicalDevicePerformanceQueryPropertiesKHR\">VkPhysicalDevicePerformanceQueryPropertiesKHR</a>, <a href=\"#VkPhysicalDevicePointClippingProperties\">VkPhysicalDevicePointClippingProperties</a>, <a href=\"#VkPhysicalDevicePortabilitySubsetPropertiesKHR\">VkPhysicalDevicePortabilitySubsetPropertiesKHR</a>, <a href=\"#VkPhysicalDeviceProtectedMemoryProperties\">VkPhysicalDeviceProtectedMemoryProperties</a>, <a href=\"#VkPhysicalDeviceProvokingVertexPropertiesEXT\">VkPhysicalDeviceProvokingVertexPropertiesEXT</a>, <a href=\"#VkPhysicalDevicePushDescriptorPropertiesKHR\">VkPhysicalDevicePushDescriptorPropertiesKHR</a>, <a href=\"#VkPhysicalDeviceRayTracingPipelinePropertiesKHR\">VkPhysicalDeviceRayTracingPipelinePropertiesKHR</a>, <a href=\"#VkPhysicalDeviceRayTracingPropertiesNV\">VkPhysicalDeviceRayTracingPropertiesNV</a>, <a href=\"#VkPhysicalDeviceRobustness2PropertiesEXT\">VkPhysicalDeviceRobustness2PropertiesEXT</a>, <a href=\"#VkPhysicalDeviceSampleLocationsPropertiesEXT\">VkPhysicalDeviceSampleLocationsPropertiesEXT</a>, <a href=\"#VkPhysicalDeviceSamplerFilterMinmaxProperties\">VkPhysicalDeviceSamplerFilterMinmaxProperties</a>, <a href=\"#VkPhysicalDeviceShaderCoreProperties2AMD\">VkPhysicalDeviceShaderCoreProperties2AMD</a>, <a href=\"#VkPhysicalDeviceShaderCorePropertiesAMD\">VkPhysicalDeviceShaderCorePropertiesAMD</a>, <a href=\"#VkPhysicalDeviceShaderIntegerDotProductPropertiesKHR\">VkPhysicalDeviceShaderIntegerDotProductPropertiesKHR</a>, <a href=\"#VkPhysicalDeviceShaderSMBuiltinsPropertiesNV\">VkPhysicalDeviceShaderSMBuiltinsPropertiesNV</a>, <a href=\"#VkPhysicalDeviceShadingRateImagePropertiesNV\">VkPhysicalDeviceShadingRateImagePropertiesNV</a>, <a href=\"#VkPhysicalDeviceSubgroupProperties\">VkPhysicalDeviceSubgroupProperties</a>, <a href=\"#VkPhysicalDeviceSubgroupSizeControlPropertiesEXT\">VkPhysicalDeviceSubgroupSizeControlPropertiesEXT</a>, <a href=\"#VkPhysicalDeviceSubpassShadingPropertiesHUAWEI\">VkPhysicalDeviceSubpassShadingPropertiesHUAWEI</a>, <a href=\"#VkPhysicalDeviceTexelBufferAlignmentPropertiesEXT\">VkPhysicalDeviceTexelBufferAlignmentPropertiesEXT</a>, <a href=\"#VkPhysicalDeviceTimelineSemaphoreProperties\">VkPhysicalDeviceTimelineSemaphoreProperties</a>, <a href=\"#VkPhysicalDeviceTransformFeedbackPropertiesEXT\">VkPhysicalDeviceTransformFeedbackPropertiesEXT</a>, <a href=\"#VkPhysicalDeviceVertexAttributeDivisorPropertiesEXT\">VkPhysicalDeviceVertexAttributeDivisorPropertiesEXT</a>, <a href=\"#VkPhysicalDeviceVulkan11Properties\">VkPhysicalDeviceVulkan11Properties</a>, or <a href=\"#VkPhysicalDeviceVulkan12Properties\">VkPhysicalDeviceVulkan12Properties</a>"
         },
         {
           "vuid": "VUID-VkPhysicalDeviceProperties2-sType-unique",
@@ -294,6 +294,14 @@
         }
       ]
     },
+    "VkPhysicalDeviceShaderIntegerDotProductPropertiesKHR": {
+      "(VK_KHR_shader_integer_dot_product)": [
+        {
+          "vuid": "VUID-VkPhysicalDeviceShaderIntegerDotProductPropertiesKHR-sType-sType",
+          "text": " <code>sType</code> <strong class=\"purple\">must</strong> be <code>VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_INTEGER_DOT_PRODUCT_PROPERTIES_KHR</code>"
+        }
+      ]
+    },
     "vkGetPhysicalDeviceQueueFamilyProperties": {
       "core": [
         {
@@ -446,7 +454,7 @@
       "core": [
         {
           "vuid": "VUID-vkCreateDevice-ppEnabledExtensionNames-01387",
-          "text": " All <a href=\"#extendingvulkan-extensions-extensiondependencies\">required extensions</a> for each extension in the <a href=\"#VkDeviceCreateInfo\">VkDeviceCreateInfo</a>::<code>ppEnabledExtensionNames</code> list <strong class=\"purple\">must</strong> also be present in that list"
+          "text": " All <a href=\"#extendingvulkan-extensions-extensiondependencies\">required device extensions</a> for each extension in the <a href=\"#VkDeviceCreateInfo\">VkDeviceCreateInfo</a>::<code>ppEnabledExtensionNames</code> list <strong class=\"purple\">must</strong> also be present in that list"
         },
         {
           "vuid": "VUID-vkCreateDevice-physicalDevice-parameter",
@@ -558,7 +566,7 @@
       "(VK_KHR_portability_subset)": [
         {
           "vuid": "VUID-VkDeviceCreateInfo-pProperties-04451",
-          "text": " If the <code><a href=\"#VK_KHR_portability_subset\">[VK_KHR_portability_subset]</a></code> extension is included in <code>pProperties</code> of <a href=\"#vkEnumerateDeviceExtensionProperties\">vkEnumerateDeviceExtensionProperties</a>, <code>ppEnabledExtensions</code> <strong class=\"purple\">must</strong> include \"VK_KHR_portability_subset\"."
+          "text": " If the <code><a href=\"#VK_KHR_portability_subset\">[VK_KHR_portability_subset]</a></code> extension is included in <code>pProperties</code> of <a href=\"#vkEnumerateDeviceExtensionProperties\">vkEnumerateDeviceExtensionProperties</a>, <code>ppEnabledExtensions</code> <strong class=\"purple\">must</strong> include \"VK_KHR_portability_subset\""
         }
       ],
       "(VK_KHR_fragment_shading_rate,VK_NV_shading_rate_image)": [
@@ -605,6 +613,12 @@
           "text": " If <a href=\"#features-sparseImageFloat32AtomicAdd\"><code>sparseImageFloat32AtomicAdd</code></a> is enabled, <a href=\"#features-shaderImageFloat32AtomicAdd\"><code>shaderImageFloat32AtomicAdd</code></a> <strong class=\"purple\">must</strong> be enabled"
         }
       ],
+      "(VK_EXT_shader_atomic_float2)": [
+        {
+          "vuid": "VUID-VkDeviceCreateInfo-sparseImageFloat32AtomicMinMax-04975",
+          "text": " If <a href=\"#features-sparseImageFloat32AtomicMinMax\"><code>sparseImageFloat32AtomicMinMax</code></a> is enabled, <a href=\"#features-shaderImageFloat32AtomicMinMax\"><code>shaderImageFloat32AtomicMinMax</code></a> <strong class=\"purple\">must</strong> be enabled"
+        }
+      ],
       "core": [
         {
           "vuid": "VUID-VkDeviceCreateInfo-sType-sType",
@@ -612,7 +626,7 @@
         },
         {
           "vuid": "VUID-VkDeviceCreateInfo-pNext-pNext",
-          "text": " Each <code>pNext</code> member of any structure (including this one) in the <code>pNext</code> chain <strong class=\"purple\">must</strong> be either <code>NULL</code> or a pointer to a valid instance of <a href=\"#VkDeviceDeviceMemoryReportCreateInfoEXT\">VkDeviceDeviceMemoryReportCreateInfoEXT</a>, <a href=\"#VkDeviceDiagnosticsConfigCreateInfoNV\">VkDeviceDiagnosticsConfigCreateInfoNV</a>, <a href=\"#VkDeviceGroupDeviceCreateInfo\">VkDeviceGroupDeviceCreateInfo</a>, <a href=\"#VkDeviceMemoryOverallocationCreateInfoAMD\">VkDeviceMemoryOverallocationCreateInfoAMD</a>, <a href=\"#VkDevicePrivateDataCreateInfoEXT\">VkDevicePrivateDataCreateInfoEXT</a>, <a href=\"#VkPhysicalDevice16BitStorageFeatures\">VkPhysicalDevice16BitStorageFeatures</a>, <a href=\"#VkPhysicalDevice4444FormatsFeaturesEXT\">VkPhysicalDevice4444FormatsFeaturesEXT</a>, <a href=\"#VkPhysicalDevice8BitStorageFeatures\">VkPhysicalDevice8BitStorageFeatures</a>, <a href=\"#VkPhysicalDeviceASTCDecodeFeaturesEXT\">VkPhysicalDeviceASTCDecodeFeaturesEXT</a>, <a href=\"#VkPhysicalDeviceAccelerationStructureFeaturesKHR\">VkPhysicalDeviceAccelerationStructureFeaturesKHR</a>, <a href=\"#VkPhysicalDeviceBlendOperationAdvancedFeaturesEXT\">VkPhysicalDeviceBlendOperationAdvancedFeaturesEXT</a>, <a href=\"#VkPhysicalDeviceBufferDeviceAddressFeatures\">VkPhysicalDeviceBufferDeviceAddressFeatures</a>, <a href=\"#VkPhysicalDeviceBufferDeviceAddressFeaturesEXT\">VkPhysicalDeviceBufferDeviceAddressFeaturesEXT</a>, <a href=\"#VkPhysicalDeviceCoherentMemoryFeaturesAMD\">VkPhysicalDeviceCoherentMemoryFeaturesAMD</a>, <a href=\"#VkPhysicalDeviceColorWriteEnableFeaturesEXT\">VkPhysicalDeviceColorWriteEnableFeaturesEXT</a>, <a href=\"#VkPhysicalDeviceComputeShaderDerivativesFeaturesNV\">VkPhysicalDeviceComputeShaderDerivativesFeaturesNV</a>, <a href=\"#VkPhysicalDeviceConditionalRenderingFeaturesEXT\">VkPhysicalDeviceConditionalRenderingFeaturesEXT</a>, <a href=\"#VkPhysicalDeviceCooperativeMatrixFeaturesNV\">VkPhysicalDeviceCooperativeMatrixFeaturesNV</a>, <a href=\"#VkPhysicalDeviceCornerSampledImageFeaturesNV\">VkPhysicalDeviceCornerSampledImageFeaturesNV</a>, <a href=\"#VkPhysicalDeviceCoverageReductionModeFeaturesNV\">VkPhysicalDeviceCoverageReductionModeFeaturesNV</a>, <a href=\"#VkPhysicalDeviceCustomBorderColorFeaturesEXT\">VkPhysicalDeviceCustomBorderColorFeaturesEXT</a>, <a href=\"#VkPhysicalDeviceDedicatedAllocationImageAliasingFeaturesNV\">VkPhysicalDeviceDedicatedAllocationImageAliasingFeaturesNV</a>, <a href=\"#VkPhysicalDeviceDepthClipEnableFeaturesEXT\">VkPhysicalDeviceDepthClipEnableFeaturesEXT</a>, <a href=\"#VkPhysicalDeviceDescriptorIndexingFeatures\">VkPhysicalDeviceDescriptorIndexingFeatures</a>, <a href=\"#VkPhysicalDeviceDeviceGeneratedCommandsFeaturesNV\">VkPhysicalDeviceDeviceGeneratedCommandsFeaturesNV</a>, <a href=\"#VkPhysicalDeviceDeviceMemoryReportFeaturesEXT\">VkPhysicalDeviceDeviceMemoryReportFeaturesEXT</a>, <a href=\"#VkPhysicalDeviceDiagnosticsConfigFeaturesNV\">VkPhysicalDeviceDiagnosticsConfigFeaturesNV</a>, <a href=\"#VkPhysicalDeviceExclusiveScissorFeaturesNV\">VkPhysicalDeviceExclusiveScissorFeaturesNV</a>, <a href=\"#VkPhysicalDeviceExtendedDynamicState2FeaturesEXT\">VkPhysicalDeviceExtendedDynamicState2FeaturesEXT</a>, <a href=\"#VkPhysicalDeviceExtendedDynamicStateFeaturesEXT\">VkPhysicalDeviceExtendedDynamicStateFeaturesEXT</a>, <a href=\"#VkPhysicalDeviceExternalMemoryRDMAFeaturesNV\">VkPhysicalDeviceExternalMemoryRDMAFeaturesNV</a>, <a href=\"#VkPhysicalDeviceFeatures2\">VkPhysicalDeviceFeatures2</a>, <a href=\"#VkPhysicalDeviceFragmentDensityMap2FeaturesEXT\">VkPhysicalDeviceFragmentDensityMap2FeaturesEXT</a>, <a href=\"#VkPhysicalDeviceFragmentDensityMapFeaturesEXT\">VkPhysicalDeviceFragmentDensityMapFeaturesEXT</a>, <a href=\"#VkPhysicalDeviceFragmentShaderBarycentricFeaturesNV\">VkPhysicalDeviceFragmentShaderBarycentricFeaturesNV</a>, <a href=\"#VkPhysicalDeviceFragmentShaderInterlockFeaturesEXT\">VkPhysicalDeviceFragmentShaderInterlockFeaturesEXT</a>, <a href=\"#VkPhysicalDeviceFragmentShadingRateEnumsFeaturesNV\">VkPhysicalDeviceFragmentShadingRateEnumsFeaturesNV</a>, <a href=\"#VkPhysicalDeviceFragmentShadingRateFeaturesKHR\">VkPhysicalDeviceFragmentShadingRateFeaturesKHR</a>, <a href=\"#VkPhysicalDeviceGlobalPriorityQueryFeaturesEXT\">VkPhysicalDeviceGlobalPriorityQueryFeaturesEXT</a>, <a href=\"#VkPhysicalDeviceHostQueryResetFeatures\">VkPhysicalDeviceHostQueryResetFeatures</a>, <a href=\"#VkPhysicalDeviceImageRobustnessFeaturesEXT\">VkPhysicalDeviceImageRobustnessFeaturesEXT</a>, <a href=\"#VkPhysicalDeviceImagelessFramebufferFeatures\">VkPhysicalDeviceImagelessFramebufferFeatures</a>, <a href=\"#VkPhysicalDeviceIndexTypeUint8FeaturesEXT\">VkPhysicalDeviceIndexTypeUint8FeaturesEXT</a>, <a href=\"#VkPhysicalDeviceInheritedViewportScissorFeaturesNV\">VkPhysicalDeviceInheritedViewportScissorFeaturesNV</a>, <a href=\"#VkPhysicalDeviceInlineUniformBlockFeaturesEXT\">VkPhysicalDeviceInlineUniformBlockFeaturesEXT</a>, <a href=\"#VkPhysicalDeviceLineRasterizationFeaturesEXT\">VkPhysicalDeviceLineRasterizationFeaturesEXT</a>, <a href=\"#VkPhysicalDeviceMemoryPriorityFeaturesEXT\">VkPhysicalDeviceMemoryPriorityFeaturesEXT</a>, <a href=\"#VkPhysicalDeviceMeshShaderFeaturesNV\">VkPhysicalDeviceMeshShaderFeaturesNV</a>, <a href=\"#VkPhysicalDeviceMultiDrawFeaturesEXT\">VkPhysicalDeviceMultiDrawFeaturesEXT</a>, <a href=\"#VkPhysicalDeviceMultiviewFeatures\">VkPhysicalDeviceMultiviewFeatures</a>, <a href=\"#VkPhysicalDeviceMutableDescriptorTypeFeaturesVALVE\">VkPhysicalDeviceMutableDescriptorTypeFeaturesVALVE</a>, <a href=\"#VkPhysicalDevicePerformanceQueryFeaturesKHR\">VkPhysicalDevicePerformanceQueryFeaturesKHR</a>, <a href=\"#VkPhysicalDevicePipelineCreationCacheControlFeaturesEXT\">VkPhysicalDevicePipelineCreationCacheControlFeaturesEXT</a>, <a href=\"#VkPhysicalDevicePipelineExecutablePropertiesFeaturesKHR\">VkPhysicalDevicePipelineExecutablePropertiesFeaturesKHR</a>, <a href=\"#VkPhysicalDevicePortabilitySubsetFeaturesKHR\">VkPhysicalDevicePortabilitySubsetFeaturesKHR</a>, <a href=\"#VkPhysicalDevicePrivateDataFeaturesEXT\">VkPhysicalDevicePrivateDataFeaturesEXT</a>, <a href=\"#VkPhysicalDeviceProtectedMemoryFeatures\">VkPhysicalDeviceProtectedMemoryFeatures</a>, <a href=\"#VkPhysicalDeviceProvokingVertexFeaturesEXT\">VkPhysicalDeviceProvokingVertexFeaturesEXT</a>, <a href=\"#VkPhysicalDeviceRayQueryFeaturesKHR\">VkPhysicalDeviceRayQueryFeaturesKHR</a>, <a href=\"#VkPhysicalDeviceRayTracingMotionBlurFeaturesNV\">VkPhysicalDeviceRayTracingMotionBlurFeaturesNV</a>, <a href=\"#VkPhysicalDeviceRayTracingPipelineFeaturesKHR\">VkPhysicalDeviceRayTracingPipelineFeaturesKHR</a>, <a href=\"#VkPhysicalDeviceRepresentativeFragmentTestFeaturesNV\">VkPhysicalDeviceRepresentativeFragmentTestFeaturesNV</a>, <a href=\"#VkPhysicalDeviceRobustness2FeaturesEXT\">VkPhysicalDeviceRobustness2FeaturesEXT</a>, <a href=\"#VkPhysicalDeviceSamplerYcbcrConversionFeatures\">VkPhysicalDeviceSamplerYcbcrConversionFeatures</a>, <a href=\"#VkPhysicalDeviceScalarBlockLayoutFeatures\">VkPhysicalDeviceScalarBlockLayoutFeatures</a>, <a href=\"#VkPhysicalDeviceSeparateDepthStencilLayoutsFeatures\">VkPhysicalDeviceSeparateDepthStencilLayoutsFeatures</a>, <a href=\"#VkPhysicalDeviceShaderAtomicFloatFeaturesEXT\">VkPhysicalDeviceShaderAtomicFloatFeaturesEXT</a>, <a href=\"#VkPhysicalDeviceShaderAtomicInt64Features\">VkPhysicalDeviceShaderAtomicInt64Features</a>, <a href=\"#VkPhysicalDeviceShaderClockFeaturesKHR\">VkPhysicalDeviceShaderClockFeaturesKHR</a>, <a href=\"#VkPhysicalDeviceShaderDemoteToHelperInvocationFeaturesEXT\">VkPhysicalDeviceShaderDemoteToHelperInvocationFeaturesEXT</a>, <a href=\"#VkPhysicalDeviceShaderDrawParametersFeatures\">VkPhysicalDeviceShaderDrawParametersFeatures</a>, <a href=\"#VkPhysicalDeviceShaderFloat16Int8Features\">VkPhysicalDeviceShaderFloat16Int8Features</a>, <a href=\"#VkPhysicalDeviceShaderImageAtomicInt64FeaturesEXT\">VkPhysicalDeviceShaderImageAtomicInt64FeaturesEXT</a>, <a href=\"#VkPhysicalDeviceShaderImageFootprintFeaturesNV\">VkPhysicalDeviceShaderImageFootprintFeaturesNV</a>, <a href=\"#VkPhysicalDeviceShaderIntegerFunctions2FeaturesINTEL\">VkPhysicalDeviceShaderIntegerFunctions2FeaturesINTEL</a>, <a href=\"#VkPhysicalDeviceShaderSMBuiltinsFeaturesNV\">VkPhysicalDeviceShaderSMBuiltinsFeaturesNV</a>, <a href=\"#VkPhysicalDeviceShaderSubgroupExtendedTypesFeatures\">VkPhysicalDeviceShaderSubgroupExtendedTypesFeatures</a>, <a href=\"#VkPhysicalDeviceShaderSubgroupUniformControlFlowFeaturesKHR\">VkPhysicalDeviceShaderSubgroupUniformControlFlowFeaturesKHR</a>, <a href=\"#VkPhysicalDeviceShaderTerminateInvocationFeaturesKHR\">VkPhysicalDeviceShaderTerminateInvocationFeaturesKHR</a>, <a href=\"#VkPhysicalDeviceShadingRateImageFeaturesNV\">VkPhysicalDeviceShadingRateImageFeaturesNV</a>, <a href=\"#VkPhysicalDeviceSubgroupSizeControlFeaturesEXT\">VkPhysicalDeviceSubgroupSizeControlFeaturesEXT</a>, <a href=\"#VkPhysicalDeviceSubpassShadingFeaturesHUAWEI\">VkPhysicalDeviceSubpassShadingFeaturesHUAWEI</a>, <a href=\"#VkPhysicalDeviceSynchronization2FeaturesKHR\">VkPhysicalDeviceSynchronization2FeaturesKHR</a>, <a href=\"#VkPhysicalDeviceTexelBufferAlignmentFeaturesEXT\">VkPhysicalDeviceTexelBufferAlignmentFeaturesEXT</a>, <a href=\"#VkPhysicalDeviceTextureCompressionASTCHDRFeaturesEXT\">VkPhysicalDeviceTextureCompressionASTCHDRFeaturesEXT</a>, <a href=\"#VkPhysicalDeviceTimelineSemaphoreFeatures\">VkPhysicalDeviceTimelineSemaphoreFeatures</a>, <a href=\"#VkPhysicalDeviceTransformFeedbackFeaturesEXT\">VkPhysicalDeviceTransformFeedbackFeaturesEXT</a>, <a href=\"#VkPhysicalDeviceUniformBufferStandardLayoutFeatures\">VkPhysicalDeviceUniformBufferStandardLayoutFeatures</a>, <a href=\"#VkPhysicalDeviceVariablePointersFeatures\">VkPhysicalDeviceVariablePointersFeatures</a>, <a href=\"#VkPhysicalDeviceVertexAttributeDivisorFeaturesEXT\">VkPhysicalDeviceVertexAttributeDivisorFeaturesEXT</a>, <a href=\"#VkPhysicalDeviceVertexInputDynamicStateFeaturesEXT\">VkPhysicalDeviceVertexInputDynamicStateFeaturesEXT</a>, <a href=\"#VkPhysicalDeviceVulkan11Features\">VkPhysicalDeviceVulkan11Features</a>, <a href=\"#VkPhysicalDeviceVulkan12Features\">VkPhysicalDeviceVulkan12Features</a>, <a href=\"#VkPhysicalDeviceVulkanMemoryModelFeatures\">VkPhysicalDeviceVulkanMemoryModelFeatures</a>, <a href=\"#VkPhysicalDeviceWorkgroupMemoryExplicitLayoutFeaturesKHR\">VkPhysicalDeviceWorkgroupMemoryExplicitLayoutFeaturesKHR</a>, <a href=\"#VkPhysicalDeviceYcbcr2Plane444FormatsFeaturesEXT\">VkPhysicalDeviceYcbcr2Plane444FormatsFeaturesEXT</a>, <a href=\"#VkPhysicalDeviceYcbcrImageArraysFeaturesEXT\">VkPhysicalDeviceYcbcrImageArraysFeaturesEXT</a>, or <a href=\"#VkPhysicalDeviceZeroInitializeWorkgroupMemoryFeaturesKHR\">VkPhysicalDeviceZeroInitializeWorkgroupMemoryFeaturesKHR</a>"
+          "text": " Each <code>pNext</code> member of any structure (including this one) in the <code>pNext</code> chain <strong class=\"purple\">must</strong> be either <code>NULL</code> or a pointer to a valid instance of <a href=\"#VkDeviceDeviceMemoryReportCreateInfoEXT\">VkDeviceDeviceMemoryReportCreateInfoEXT</a>, <a href=\"#VkDeviceDiagnosticsConfigCreateInfoNV\">VkDeviceDiagnosticsConfigCreateInfoNV</a>, <a href=\"#VkDeviceGroupDeviceCreateInfo\">VkDeviceGroupDeviceCreateInfo</a>, <a href=\"#VkDeviceMemoryOverallocationCreateInfoAMD\">VkDeviceMemoryOverallocationCreateInfoAMD</a>, <a href=\"#VkDevicePrivateDataCreateInfoEXT\">VkDevicePrivateDataCreateInfoEXT</a>, <a href=\"#VkPhysicalDevice16BitStorageFeatures\">VkPhysicalDevice16BitStorageFeatures</a>, <a href=\"#VkPhysicalDevice4444FormatsFeaturesEXT\">VkPhysicalDevice4444FormatsFeaturesEXT</a>, <a href=\"#VkPhysicalDevice8BitStorageFeatures\">VkPhysicalDevice8BitStorageFeatures</a>, <a href=\"#VkPhysicalDeviceASTCDecodeFeaturesEXT\">VkPhysicalDeviceASTCDecodeFeaturesEXT</a>, <a href=\"#VkPhysicalDeviceAccelerationStructureFeaturesKHR\">VkPhysicalDeviceAccelerationStructureFeaturesKHR</a>, <a href=\"#VkPhysicalDeviceBlendOperationAdvancedFeaturesEXT\">VkPhysicalDeviceBlendOperationAdvancedFeaturesEXT</a>, <a href=\"#VkPhysicalDeviceBufferDeviceAddressFeatures\">VkPhysicalDeviceBufferDeviceAddressFeatures</a>, <a href=\"#VkPhysicalDeviceBufferDeviceAddressFeaturesEXT\">VkPhysicalDeviceBufferDeviceAddressFeaturesEXT</a>, <a href=\"#VkPhysicalDeviceCoherentMemoryFeaturesAMD\">VkPhysicalDeviceCoherentMemoryFeaturesAMD</a>, <a href=\"#VkPhysicalDeviceColorWriteEnableFeaturesEXT\">VkPhysicalDeviceColorWriteEnableFeaturesEXT</a>, <a href=\"#VkPhysicalDeviceComputeShaderDerivativesFeaturesNV\">VkPhysicalDeviceComputeShaderDerivativesFeaturesNV</a>, <a href=\"#VkPhysicalDeviceConditionalRenderingFeaturesEXT\">VkPhysicalDeviceConditionalRenderingFeaturesEXT</a>, <a href=\"#VkPhysicalDeviceCooperativeMatrixFeaturesNV\">VkPhysicalDeviceCooperativeMatrixFeaturesNV</a>, <a href=\"#VkPhysicalDeviceCornerSampledImageFeaturesNV\">VkPhysicalDeviceCornerSampledImageFeaturesNV</a>, <a href=\"#VkPhysicalDeviceCoverageReductionModeFeaturesNV\">VkPhysicalDeviceCoverageReductionModeFeaturesNV</a>, <a href=\"#VkPhysicalDeviceCustomBorderColorFeaturesEXT\">VkPhysicalDeviceCustomBorderColorFeaturesEXT</a>, <a href=\"#VkPhysicalDeviceDedicatedAllocationImageAliasingFeaturesNV\">VkPhysicalDeviceDedicatedAllocationImageAliasingFeaturesNV</a>, <a href=\"#VkPhysicalDeviceDepthClipEnableFeaturesEXT\">VkPhysicalDeviceDepthClipEnableFeaturesEXT</a>, <a href=\"#VkPhysicalDeviceDescriptorIndexingFeatures\">VkPhysicalDeviceDescriptorIndexingFeatures</a>, <a href=\"#VkPhysicalDeviceDeviceGeneratedCommandsFeaturesNV\">VkPhysicalDeviceDeviceGeneratedCommandsFeaturesNV</a>, <a href=\"#VkPhysicalDeviceDeviceMemoryReportFeaturesEXT\">VkPhysicalDeviceDeviceMemoryReportFeaturesEXT</a>, <a href=\"#VkPhysicalDeviceDiagnosticsConfigFeaturesNV\">VkPhysicalDeviceDiagnosticsConfigFeaturesNV</a>, <a href=\"#VkPhysicalDeviceExclusiveScissorFeaturesNV\">VkPhysicalDeviceExclusiveScissorFeaturesNV</a>, <a href=\"#VkPhysicalDeviceExtendedDynamicState2FeaturesEXT\">VkPhysicalDeviceExtendedDynamicState2FeaturesEXT</a>, <a href=\"#VkPhysicalDeviceExtendedDynamicStateFeaturesEXT\">VkPhysicalDeviceExtendedDynamicStateFeaturesEXT</a>, <a href=\"#VkPhysicalDeviceExternalMemoryRDMAFeaturesNV\">VkPhysicalDeviceExternalMemoryRDMAFeaturesNV</a>, <a href=\"#VkPhysicalDeviceFeatures2\">VkPhysicalDeviceFeatures2</a>, <a href=\"#VkPhysicalDeviceFragmentDensityMap2FeaturesEXT\">VkPhysicalDeviceFragmentDensityMap2FeaturesEXT</a>, <a href=\"#VkPhysicalDeviceFragmentDensityMapFeaturesEXT\">VkPhysicalDeviceFragmentDensityMapFeaturesEXT</a>, <a href=\"#VkPhysicalDeviceFragmentShaderBarycentricFeaturesNV\">VkPhysicalDeviceFragmentShaderBarycentricFeaturesNV</a>, <a href=\"#VkPhysicalDeviceFragmentShaderInterlockFeaturesEXT\">VkPhysicalDeviceFragmentShaderInterlockFeaturesEXT</a>, <a href=\"#VkPhysicalDeviceFragmentShadingRateEnumsFeaturesNV\">VkPhysicalDeviceFragmentShadingRateEnumsFeaturesNV</a>, <a href=\"#VkPhysicalDeviceFragmentShadingRateFeaturesKHR\">VkPhysicalDeviceFragmentShadingRateFeaturesKHR</a>, <a href=\"#VkPhysicalDeviceGlobalPriorityQueryFeaturesEXT\">VkPhysicalDeviceGlobalPriorityQueryFeaturesEXT</a>, <a href=\"#VkPhysicalDeviceHostQueryResetFeatures\">VkPhysicalDeviceHostQueryResetFeatures</a>, <a href=\"#VkPhysicalDeviceImageRobustnessFeaturesEXT\">VkPhysicalDeviceImageRobustnessFeaturesEXT</a>, <a href=\"#VkPhysicalDeviceImagelessFramebufferFeatures\">VkPhysicalDeviceImagelessFramebufferFeatures</a>, <a href=\"#VkPhysicalDeviceIndexTypeUint8FeaturesEXT\">VkPhysicalDeviceIndexTypeUint8FeaturesEXT</a>, <a href=\"#VkPhysicalDeviceInheritedViewportScissorFeaturesNV\">VkPhysicalDeviceInheritedViewportScissorFeaturesNV</a>, <a href=\"#VkPhysicalDeviceInlineUniformBlockFeaturesEXT\">VkPhysicalDeviceInlineUniformBlockFeaturesEXT</a>, <a href=\"#VkPhysicalDeviceInvocationMaskFeaturesHUAWEI\">VkPhysicalDeviceInvocationMaskFeaturesHUAWEI</a>, <a href=\"#VkPhysicalDeviceLineRasterizationFeaturesEXT\">VkPhysicalDeviceLineRasterizationFeaturesEXT</a>, <a href=\"#VkPhysicalDeviceMemoryPriorityFeaturesEXT\">VkPhysicalDeviceMemoryPriorityFeaturesEXT</a>, <a href=\"#VkPhysicalDeviceMeshShaderFeaturesNV\">VkPhysicalDeviceMeshShaderFeaturesNV</a>, <a href=\"#VkPhysicalDeviceMultiDrawFeaturesEXT\">VkPhysicalDeviceMultiDrawFeaturesEXT</a>, <a href=\"#VkPhysicalDeviceMultiviewFeatures\">VkPhysicalDeviceMultiviewFeatures</a>, <a href=\"#VkPhysicalDeviceMutableDescriptorTypeFeaturesVALVE\">VkPhysicalDeviceMutableDescriptorTypeFeaturesVALVE</a>, <a href=\"#VkPhysicalDevicePerformanceQueryFeaturesKHR\">VkPhysicalDevicePerformanceQueryFeaturesKHR</a>, <a href=\"#VkPhysicalDevicePipelineCreationCacheControlFeaturesEXT\">VkPhysicalDevicePipelineCreationCacheControlFeaturesEXT</a>, <a href=\"#VkPhysicalDevicePipelineExecutablePropertiesFeaturesKHR\">VkPhysicalDevicePipelineExecutablePropertiesFeaturesKHR</a>, <a href=\"#VkPhysicalDevicePortabilitySubsetFeaturesKHR\">VkPhysicalDevicePortabilitySubsetFeaturesKHR</a>, <a href=\"#VkPhysicalDevicePresentIdFeaturesKHR\">VkPhysicalDevicePresentIdFeaturesKHR</a>, <a href=\"#VkPhysicalDevicePresentWaitFeaturesKHR\">VkPhysicalDevicePresentWaitFeaturesKHR</a>, <a href=\"#VkPhysicalDevicePrimitiveTopologyListRestartFeaturesEXT\">VkPhysicalDevicePrimitiveTopologyListRestartFeaturesEXT</a>, <a href=\"#VkPhysicalDevicePrivateDataFeaturesEXT\">VkPhysicalDevicePrivateDataFeaturesEXT</a>, <a href=\"#VkPhysicalDeviceProtectedMemoryFeatures\">VkPhysicalDeviceProtectedMemoryFeatures</a>, <a href=\"#VkPhysicalDeviceProvokingVertexFeaturesEXT\">VkPhysicalDeviceProvokingVertexFeaturesEXT</a>, <a href=\"#VkPhysicalDeviceRayQueryFeaturesKHR\">VkPhysicalDeviceRayQueryFeaturesKHR</a>, <a href=\"#VkPhysicalDeviceRayTracingMotionBlurFeaturesNV\">VkPhysicalDeviceRayTracingMotionBlurFeaturesNV</a>, <a href=\"#VkPhysicalDeviceRayTracingPipelineFeaturesKHR\">VkPhysicalDeviceRayTracingPipelineFeaturesKHR</a>, <a href=\"#VkPhysicalDeviceRepresentativeFragmentTestFeaturesNV\">VkPhysicalDeviceRepresentativeFragmentTestFeaturesNV</a>, <a href=\"#VkPhysicalDeviceRobustness2FeaturesEXT\">VkPhysicalDeviceRobustness2FeaturesEXT</a>, <a href=\"#VkPhysicalDeviceSamplerYcbcrConversionFeatures\">VkPhysicalDeviceSamplerYcbcrConversionFeatures</a>, <a href=\"#VkPhysicalDeviceScalarBlockLayoutFeatures\">VkPhysicalDeviceScalarBlockLayoutFeatures</a>, <a href=\"#VkPhysicalDeviceSeparateDepthStencilLayoutsFeatures\">VkPhysicalDeviceSeparateDepthStencilLayoutsFeatures</a>, <a href=\"#VkPhysicalDeviceShaderAtomicFloat2FeaturesEXT\">VkPhysicalDeviceShaderAtomicFloat2FeaturesEXT</a>, <a href=\"#VkPhysicalDeviceShaderAtomicFloatFeaturesEXT\">VkPhysicalDeviceShaderAtomicFloatFeaturesEXT</a>, <a href=\"#VkPhysicalDeviceShaderAtomicInt64Features\">VkPhysicalDeviceShaderAtomicInt64Features</a>, <a href=\"#VkPhysicalDeviceShaderClockFeaturesKHR\">VkPhysicalDeviceShaderClockFeaturesKHR</a>, <a href=\"#VkPhysicalDeviceShaderDemoteToHelperInvocationFeaturesEXT\">VkPhysicalDeviceShaderDemoteToHelperInvocationFeaturesEXT</a>, <a href=\"#VkPhysicalDeviceShaderDrawParametersFeatures\">VkPhysicalDeviceShaderDrawParametersFeatures</a>, <a href=\"#VkPhysicalDeviceShaderFloat16Int8Features\">VkPhysicalDeviceShaderFloat16Int8Features</a>, <a href=\"#VkPhysicalDeviceShaderImageAtomicInt64FeaturesEXT\">VkPhysicalDeviceShaderImageAtomicInt64FeaturesEXT</a>, <a href=\"#VkPhysicalDeviceShaderImageFootprintFeaturesNV\">VkPhysicalDeviceShaderImageFootprintFeaturesNV</a>, <a href=\"#VkPhysicalDeviceShaderIntegerDotProductFeaturesKHR\">VkPhysicalDeviceShaderIntegerDotProductFeaturesKHR</a>, <a href=\"#VkPhysicalDeviceShaderIntegerFunctions2FeaturesINTEL\">VkPhysicalDeviceShaderIntegerFunctions2FeaturesINTEL</a>, <a href=\"#VkPhysicalDeviceShaderSMBuiltinsFeaturesNV\">VkPhysicalDeviceShaderSMBuiltinsFeaturesNV</a>, <a href=\"#VkPhysicalDeviceShaderSubgroupExtendedTypesFeatures\">VkPhysicalDeviceShaderSubgroupExtendedTypesFeatures</a>, <a href=\"#VkPhysicalDeviceShaderSubgroupUniformControlFlowFeaturesKHR\">VkPhysicalDeviceShaderSubgroupUniformControlFlowFeaturesKHR</a>, <a href=\"#VkPhysicalDeviceShaderTerminateInvocationFeaturesKHR\">VkPhysicalDeviceShaderTerminateInvocationFeaturesKHR</a>, <a href=\"#VkPhysicalDeviceShadingRateImageFeaturesNV\">VkPhysicalDeviceShadingRateImageFeaturesNV</a>, <a href=\"#VkPhysicalDeviceSubgroupSizeControlFeaturesEXT\">VkPhysicalDeviceSubgroupSizeControlFeaturesEXT</a>, <a href=\"#VkPhysicalDeviceSubpassShadingFeaturesHUAWEI\">VkPhysicalDeviceSubpassShadingFeaturesHUAWEI</a>, <a href=\"#VkPhysicalDeviceSynchronization2FeaturesKHR\">VkPhysicalDeviceSynchronization2FeaturesKHR</a>, <a href=\"#VkPhysicalDeviceTexelBufferAlignmentFeaturesEXT\">VkPhysicalDeviceTexelBufferAlignmentFeaturesEXT</a>, <a href=\"#VkPhysicalDeviceTextureCompressionASTCHDRFeaturesEXT\">VkPhysicalDeviceTextureCompressionASTCHDRFeaturesEXT</a>, <a href=\"#VkPhysicalDeviceTimelineSemaphoreFeatures\">VkPhysicalDeviceTimelineSemaphoreFeatures</a>, <a href=\"#VkPhysicalDeviceTransformFeedbackFeaturesEXT\">VkPhysicalDeviceTransformFeedbackFeaturesEXT</a>, <a href=\"#VkPhysicalDeviceUniformBufferStandardLayoutFeatures\">VkPhysicalDeviceUniformBufferStandardLayoutFeatures</a>, <a href=\"#VkPhysicalDeviceVariablePointersFeatures\">VkPhysicalDeviceVariablePointersFeatures</a>, <a href=\"#VkPhysicalDeviceVertexAttributeDivisorFeaturesEXT\">VkPhysicalDeviceVertexAttributeDivisorFeaturesEXT</a>, <a href=\"#VkPhysicalDeviceVertexInputDynamicStateFeaturesEXT\">VkPhysicalDeviceVertexInputDynamicStateFeaturesEXT</a>, <a href=\"#VkPhysicalDeviceVulkan11Features\">VkPhysicalDeviceVulkan11Features</a>, <a href=\"#VkPhysicalDeviceVulkan12Features\">VkPhysicalDeviceVulkan12Features</a>, <a href=\"#VkPhysicalDeviceVulkanMemoryModelFeatures\">VkPhysicalDeviceVulkanMemoryModelFeatures</a>, <a href=\"#VkPhysicalDeviceWorkgroupMemoryExplicitLayoutFeaturesKHR\">VkPhysicalDeviceWorkgroupMemoryExplicitLayoutFeaturesKHR</a>, <a href=\"#VkPhysicalDeviceYcbcr2Plane444FormatsFeaturesEXT\">VkPhysicalDeviceYcbcr2Plane444FormatsFeaturesEXT</a>, <a href=\"#VkPhysicalDeviceYcbcrImageArraysFeaturesEXT\">VkPhysicalDeviceYcbcrImageArraysFeaturesEXT</a>, or <a href=\"#VkPhysicalDeviceZeroInitializeWorkgroupMemoryFeaturesKHR\">VkPhysicalDeviceZeroInitializeWorkgroupMemoryFeaturesKHR</a>"
         },
         {
           "vuid": "VUID-VkDeviceCreateInfo-sType-unique",
@@ -822,7 +836,7 @@
         },
         {
           "vuid": "VUID-vkGetDeviceQueue-queueIndex-00385",
-          "text": " <code>queueIndex</code> <strong class=\"purple\">must</strong> be less than the number of queues created for the specified queue family index when <code>device</code> was created, via the <code>queueCount</code> member of the <a href=\"#VkDeviceQueueCreateInfo\">VkDeviceQueueCreateInfo</a> structure"
+          "text": " <code>queueIndex</code> <strong class=\"purple\">must</strong> be less than the value of <a href=\"#VkDeviceQueueCreateInfo\">VkDeviceQueueCreateInfo</a>::<code>queueCount</code> for the queue family indicated by <code>queueFamilyIndex</code> when <code>device</code> was created"
         },
         {
           "vuid": "VUID-vkGetDeviceQueue-flags-01841",
@@ -861,8 +875,12 @@
           "text": " <code>queueFamilyIndex</code> <strong class=\"purple\">must</strong> be one of the queue family indices specified when <code>device</code> was created, via the <a href=\"#VkDeviceQueueCreateInfo\">VkDeviceQueueCreateInfo</a> structure"
         },
         {
+          "vuid": "VUID-VkDeviceQueueInfo2-flags-06225",
+          "text": " <code>flags</code> <strong class=\"purple\">must</strong> be equal to <a href=\"#VkDeviceQueueCreateInfo\">VkDeviceQueueCreateInfo</a>::<code>flags</code> for a <a href=\"#VkDeviceQueueCreateInfo\">VkDeviceQueueCreateInfo</a> structure for the queue family indicated by <code>queueFamilyIndex</code> when <code>device</code> was created"
+        },
+        {
           "vuid": "VUID-VkDeviceQueueInfo2-queueIndex-01843",
-          "text": " <code>queueIndex</code> <strong class=\"purple\">must</strong> be less than the number of queues created for the specified queue family index and <a href=\"#VkDeviceQueueCreateFlags\">VkDeviceQueueCreateFlags</a> member <code>flags</code> equal to this <code>flags</code> value when <code>device</code> was created, via the <code>queueCount</code> member of the <a href=\"#VkDeviceQueueCreateInfo\">VkDeviceQueueCreateInfo</a> structure"
+          "text": " <code>queueIndex</code> <strong class=\"purple\">must</strong> be less than <a href=\"#VkDeviceQueueCreateInfo\">VkDeviceQueueCreateInfo</a>::<code>queueCount</code> for the corresponding queue family and flags indicated by <code>queueFamilyIndex</code> and <code>flags</code> when <code>device</code> was created"
         },
         {
           "vuid": "VUID-VkDeviceQueueInfo2-sType-sType",
@@ -1236,11 +1254,11 @@
         },
         {
           "vuid": "VUID-VkCommandBufferInheritanceViewportScissorInfoNV-viewportScissor2D-04785",
-          "text": " If <code>viewportScissor2D</code> is <code>VK_TRUE</code>, then <code>pViewportDepths</code> <strong class=\"purple\">must</strong> be a valid pointer to an array of <code>viewportDepthCount</code> valid <code>VkViewport</code> structures, except any requirements on <code>x</code>, <code>y</code>, <code>width</code>, and <code>height</code> do not apply."
+          "text": " If <code>viewportScissor2D</code> is <code>VK_TRUE</code>, then <code>pViewportDepths</code> <strong class=\"purple\">must</strong> be a valid pointer to an array of <code>viewportDepthCount</code> valid <code>VkViewport</code> structures, except any requirements on <code>x</code>, <code>y</code>, <code>width</code>, and <code>height</code> do not apply"
         },
         {
           "vuid": "VUID-VkCommandBufferInheritanceViewportScissorInfoNV-viewportScissor2D-04786",
-          "text": " If <code>viewportScissor2D</code> is <code>VK_TRUE</code>, then the command buffer <strong class=\"purple\">must</strong> be recorded with the <code>VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT</code>."
+          "text": " If <code>viewportScissor2D</code> is <code>VK_TRUE</code>, then the command buffer <strong class=\"purple\">must</strong> be recorded with the <code>VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT</code>"
         },
         {
           "vuid": "VUID-VkCommandBufferInheritanceViewportScissorInfoNV-sType-sType",
@@ -1513,6 +1531,12 @@
           "text": " If the <a href=\"#features-subpassShading\">subpass shading</a> feature is not enabled, pname:stageMask <strong class=\"purple\">must</strong> not contain <code>VK_PIPELINE_STAGE_2_SUBPASS_SHADING_BIT_HUAWEI</code>"
         }
       ],
+      "(VK_KHR_synchronization2)+(VK_HUAWEI_invocation_mask)": [
+        {
+          "vuid": "VUID-VkSemaphoreSubmitInfoKHR-stageMask-04995",
+          "text": " If the <a href=\"#features-invocationMask\">invocation mask image</a> feature is not enabled, pname:stageMask <strong class=\"purple\">must</strong> not contain <code>VK_PIPELINE_STAGE_2_INVOCATION_MASK_BIT_HUAWEI</code>"
+        }
+      ],
       "(VK_KHR_synchronization2)+(VK_KHR_device_group_creation,VK_VERSION_1_1)": [
         {
           "vuid": "VUID-VkSemaphoreSubmitInfoKHR-device-03889",
@@ -1762,11 +1786,11 @@
       "(VK_KHR_external_semaphore_win32)": [
         {
           "vuid": "VUID-VkD3D12FenceSubmitInfoKHR-waitSemaphoreValuesCount-00079",
-          "text": " <code>waitSemaphoreValuesCount</code> <strong class=\"purple\">must</strong> be the same value as <code>VkSubmitInfo</code>::<code>waitSemaphoreCount</code>, where <code>VkSubmitInfo</code> is in the <code>pNext</code> chain of this <code>VkD3D12FenceSubmitInfoKHR</code> structure."
+          "text": " <code>waitSemaphoreValuesCount</code> <strong class=\"purple\">must</strong> be the same value as <code>VkSubmitInfo</code>::<code>waitSemaphoreCount</code>, where <code>VkSubmitInfo</code> is in the <code>pNext</code> chain of this <code>VkD3D12FenceSubmitInfoKHR</code> structure"
         },
         {
           "vuid": "VUID-VkD3D12FenceSubmitInfoKHR-signalSemaphoreValuesCount-00080",
-          "text": " <code>signalSemaphoreValuesCount</code> <strong class=\"purple\">must</strong> be the same value as <code>VkSubmitInfo</code>::<code>signalSemaphoreCount</code>, where <code>VkSubmitInfo</code> is in the <code>pNext</code> chain of this <code>VkD3D12FenceSubmitInfoKHR</code> structure."
+          "text": " <code>signalSemaphoreValuesCount</code> <strong class=\"purple\">must</strong> be the same value as <code>VkSubmitInfo</code>::<code>signalSemaphoreCount</code>, where <code>VkSubmitInfo</code> is in the <code>pNext</code> chain of this <code>VkD3D12FenceSubmitInfoKHR</code> structure"
         },
         {
           "vuid": "VUID-VkD3D12FenceSubmitInfoKHR-sType-sType",
@@ -2794,27 +2818,27 @@
       "(VK_FUCHSIA_external_semaphore)": [
         {
           "vuid": "VUID-VkSemaphoreGetZirconHandleInfoFUCHSIA-handleType-04758",
-          "text": " <code>handleType</code> <strong class=\"purple\">must</strong> have been included in <a href=\"#VkExportSemaphoreCreateInfo\">VkExportSemaphoreCreateInfo</a>::<code>handleTypes</code> when <code>semaphore</code>&#8217;s current payload was created."
+          "text": " <code>handleType</code> <strong class=\"purple\">must</strong> have been included in <a href=\"#VkExportSemaphoreCreateInfo\">VkExportSemaphoreCreateInfo</a>::<code>handleTypes</code> when <code>semaphore</code>&#8217;s current payload was created"
         },
         {
           "vuid": "VUID-VkSemaphoreGetZirconHandleInfoFUCHSIA-semaphore-04759",
-          "text": " <code>semaphore</code> <strong class=\"purple\">must</strong> not currently have its payload replaced by an imported payload as described below in <a href=\"#synchronization-semaphores-importing\">Importing Semaphore Payloads</a> unless that imported payload&#8217;s handle type was included in <a href=\"#VkExternalSemaphoreProperties\">VkExternalSemaphoreProperties</a>::<code>exportFromImportedHandleTypes</code> for <code>handleType</code>."
+          "text": " <code>semaphore</code> <strong class=\"purple\">must</strong> not currently have its payload replaced by an imported payload as described below in <a href=\"#synchronization-semaphores-importing\">Importing Semaphore Payloads</a> unless that imported payload&#8217;s handle type was included in <a href=\"#VkExternalSemaphoreProperties\">VkExternalSemaphoreProperties</a>::<code>exportFromImportedHandleTypes</code> for <code>handleType</code>"
         },
         {
           "vuid": "VUID-VkSemaphoreGetZirconHandleInfoFUCHSIA-handleType-04760",
-          "text": " If <code>handleType</code> refers to a handle type with copy payload transference semantics, as defined below in <a href=\"#synchronization-semaphores-importing\">Importing Semaphore Payloads</a>, there <strong class=\"purple\">must</strong> be no queue waiting on <code>semaphore</code>."
+          "text": " If <code>handleType</code> refers to a handle type with copy payload transference semantics, as defined below in <a href=\"#synchronization-semaphores-importing\">Importing Semaphore Payloads</a>, there <strong class=\"purple\">must</strong> be no queue waiting on <code>semaphore</code>"
         },
         {
           "vuid": "VUID-VkSemaphoreGetZirconHandleInfoFUCHSIA-handleType-04761",
-          "text": " If <code>handleType</code> refers to a handle type with copy payload transference semantics, <code>semaphore</code> <strong class=\"purple\">must</strong> be signaled, or have an associated <a href=\"#synchronization-semaphores-signaling\">semaphore signal operation</a> pending execution."
+          "text": " If <code>handleType</code> refers to a handle type with copy payload transference semantics, <code>semaphore</code> <strong class=\"purple\">must</strong> be signaled, or have an associated <a href=\"#synchronization-semaphores-signaling\">semaphore signal operation</a> pending execution"
         },
         {
           "vuid": "VUID-VkSemaphoreGetZirconHandleInfoFUCHSIA-handleType-04762",
-          "text": " <code>handleType</code> <strong class=\"purple\">must</strong> be defined as a Zircon event handle."
+          "text": " <code>handleType</code> <strong class=\"purple\">must</strong> be defined as a Zircon event handle"
         },
         {
           "vuid": "VUID-VkSemaphoreGetZirconHandleInfoFUCHSIA-semaphore-04763",
-          "text": " <code>semaphore</code> <strong class=\"purple\">must</strong> have been created with a <a href=\"#VkSemaphoreType\">VkSemaphoreType</a> of <code>VK_SEMAPHORE_TYPE_BINARY</code>."
+          "text": " <code>semaphore</code> <strong class=\"purple\">must</strong> have been created with a <a href=\"#VkSemaphoreType\">VkSemaphoreType</a> of <code>VK_SEMAPHORE_TYPE_BINARY</code>"
         },
         {
           "vuid": "VUID-VkSemaphoreGetZirconHandleInfoFUCHSIA-sType-sType",
@@ -3134,15 +3158,15 @@
       "(VK_FUCHSIA_external_semaphore)": [
         {
           "vuid": "VUID-VkImportSemaphoreZirconHandleInfoFUCHSIA-handleType-04765",
-          "text": " <code>handleType</code> <strong class=\"purple\">must</strong> be a value included in the <a href=\"#synchronization-semaphore-handletypes-zircon-handle\">Handle Types Supported by <code>VkImportSemaphoreZirconHandleInfoFUCHSIA</code></a> table."
+          "text": " <code>handleType</code> <strong class=\"purple\">must</strong> be a value included in the <a href=\"#synchronization-semaphore-handletypes-zircon-handle\">Handle Types Supported by <code>VkImportSemaphoreZirconHandleInfoFUCHSIA</code></a> table"
         },
         {
           "vuid": "VUID-VkImportSemaphoreZirconHandleInfoFUCHSIA-zirconHandle-04766",
-          "text": " <code>zirconHandle</code> <strong class=\"purple\">must</strong> obey any requirements listed for <code>handleType</code> in <a href=\"#external-semaphore-handle-types-compatibility\">external semaphore handle types compatibility</a>."
+          "text": " <code>zirconHandle</code> <strong class=\"purple\">must</strong> obey any requirements listed for <code>handleType</code> in <a href=\"#external-semaphore-handle-types-compatibility\">external semaphore handle types compatibility</a>"
         },
         {
           "vuid": "VUID-VkImportSemaphoreZirconHandleInfoFUCHSIA-zirconHandle-04767",
-          "text": " <code>zirconHandle</code> <strong class=\"purple\">must</strong> have <code>ZX_RIGHTS_BASIC</code> and <code>ZX_RIGHTS_SIGNAL</code> rights."
+          "text": " <code>zirconHandle</code> <strong class=\"purple\">must</strong> have <code>ZX_RIGHTS_BASIC</code> and <code>ZX_RIGHTS_SIGNAL</code> rights"
         },
         {
           "vuid": "VUID-VkImportSemaphoreZirconHandleInfoFUCHSIA-sType-sType",
@@ -3168,7 +3192,7 @@
       "(VK_FUCHSIA_external_semaphore)+(VK_VERSION_1_2,VK_KHR_timeline_semaphore)": [
         {
           "vuid": "VUID-VkImportSemaphoreZirconHandleInfoFUCHSIA-semaphoreType-04768",
-          "text": " The <a href=\"#VkSemaphoreTypeCreateInfo\">VkSemaphoreTypeCreateInfo</a>::<code>semaphoreType</code> field <strong class=\"purple\">must</strong> not be <code>VK_SEMAPHORE_TYPE_TIMELINE</code>."
+          "text": " The <a href=\"#VkSemaphoreTypeCreateInfo\">VkSemaphoreTypeCreateInfo</a>::<code>semaphoreType</code> field <strong class=\"purple\">must</strong> not be <code>VK_SEMAPHORE_TYPE_TIMELINE</code>"
         }
       ]
     },
@@ -3176,7 +3200,7 @@
       "(VK_KHR_portability_subset)": [
         {
           "vuid": "VUID-vkCreateEvent-events-04468",
-          "text": " If the <code><a href=\"#VK_KHR_portability_subset\">[VK_KHR_portability_subset]</a></code> extension is enabled, and <a href=\"#VkPhysicalDevicePortabilitySubsetFeaturesKHR\">VkPhysicalDevicePortabilitySubsetFeaturesKHR</a>::<code>events</code> is <code>VK_FALSE</code>, then the implementation does not support <a href=\"#synchronization-events\">events</a>, and <a href=\"#vkCreateEvent\">vkCreateEvent</a> <strong class=\"purple\">must</strong> not be used."
+          "text": " If the <code><a href=\"#VK_KHR_portability_subset\">[VK_KHR_portability_subset]</a></code> extension is enabled, and <a href=\"#VkPhysicalDevicePortabilitySubsetFeaturesKHR\">VkPhysicalDevicePortabilitySubsetFeaturesKHR</a>::<code>events</code> is <code>VK_FALSE</code>, then the implementation does not support <a href=\"#synchronization-events\">events</a>, and <a href=\"#vkCreateEvent\">vkCreateEvent</a> <strong class=\"purple\">must</strong> not be used"
         }
       ],
       "core": [
@@ -3370,7 +3394,7 @@
       "(VK_KHR_synchronization2)+(VK_VERSION_1_1,VK_KHR_device_group)": [
         {
           "vuid": "VUID-vkCmdSetEvent2KHR-commandBuffer-03826",
-          "text": " The current device mask of <code>commandBuffer</code> <strong class=\"purple\">must</strong> include exactly one physical device."
+          "text": " The current device mask of <code>commandBuffer</code> <strong class=\"purple\">must</strong> include exactly one physical device"
         }
       ]
     },
@@ -3413,7 +3437,7 @@
           "text": " If the <a href=\"#features-tessellationShader\">tessellation shaders</a> feature is not enabled, pname:stageMask <strong class=\"purple\">must</strong> not contain <code>VK_PIPELINE_STAGE_TESSELLATION_CONTROL_SHADER_BIT</code> or <code>VK_PIPELINE_STAGE_TESSELLATION_EVALUATION_SHADER_BIT</code>"
         },
         {
-          "vuid": "VUID-vkCmdSetEvent-stageMask-4098",
+          "vuid": "VUID-vkCmdSetEvent-stageMask-04098",
           "text": " Any pipeline stage included in pname:stageMask <strong class=\"purple\">must</strong> be supported by the capabilities of the queue family specified by the <code>queueFamilyIndex</code> member of the <a href=\"#VkCommandPoolCreateInfo\">VkCommandPoolCreateInfo</a> structure that was used to create the <code>VkCommandPool</code> that <code>commandBuffer</code> was allocated from, as specified in the <a href=\"#synchronization-pipeline-stages-supported\">table of supported pipeline stages</a>"
         },
         {
@@ -3433,10 +3457,6 @@
           "text": " <code>stageMask</code> <strong class=\"purple\">must</strong> be a valid combination of <a href=\"#VkPipelineStageFlagBits\">VkPipelineStageFlagBits</a> values"
         },
         {
-          "vuid": "VUID-vkCmdSetEvent-stageMask-requiredbitmask",
-          "text": " <code>stageMask</code> <strong class=\"purple\">must</strong> not be <code>0</code>"
-        },
-        {
           "vuid": "VUID-vkCmdSetEvent-commandBuffer-recording",
           "text": " <code>commandBuffer</code> <strong class=\"purple\">must</strong> be in the <a href=\"#commandbuffers-lifecycle\">recording state</a>"
         },
@@ -3493,6 +3513,12 @@
           "text": " If the <a href=\"#features-synchronization2\"><code>synchronization2</code></a> feature is not enabled, pname:stageMask <strong class=\"purple\">must</strong> not be <code>0</code>"
         }
       ],
+      "!(VK_KHR_synchronization2)": [
+        {
+          "vuid": "VUID-vkCmdSetEvent-stageMask-04996",
+          "text": " pname:stageMask <strong class=\"purple\">must</strong> not be <code>0</code>"
+        }
+      ],
       "(VK_VERSION_1_1,VK_KHR_device_group)": [
         {
           "vuid": "VUID-vkCmdSetEvent-commandBuffer-01152",
@@ -3599,6 +3625,12 @@
           "text": " If the <a href=\"#features-subpassShading\">subpass shading</a> feature is not enabled, pname:stageMask <strong class=\"purple\">must</strong> not contain <code>VK_PIPELINE_STAGE_2_SUBPASS_SHADING_BIT_HUAWEI</code>"
         }
       ],
+      "(VK_KHR_synchronization2)+(VK_HUAWEI_invocation_mask)": [
+        {
+          "vuid": "VUID-vkCmdResetEvent2KHR-stageMask-04995",
+          "text": " If the <a href=\"#features-invocationMask\">invocation mask image</a> feature is not enabled, pname:stageMask <strong class=\"purple\">must</strong> not contain <code>VK_PIPELINE_STAGE_2_INVOCATION_MASK_BIT_HUAWEI</code>"
+        }
+      ],
       "(VK_KHR_synchronization2)+(VK_VERSION_1_1,VK_KHR_device_group)": [
         {
           "vuid": "VUID-vkCmdResetEvent2KHR-commandBuffer-03833",
@@ -3617,7 +3649,7 @@
           "text": " If the <a href=\"#features-tessellationShader\">tessellation shaders</a> feature is not enabled, pname:stageMask <strong class=\"purple\">must</strong> not contain <code>VK_PIPELINE_STAGE_TESSELLATION_CONTROL_SHADER_BIT</code> or <code>VK_PIPELINE_STAGE_TESSELLATION_EVALUATION_SHADER_BIT</code>"
         },
         {
-          "vuid": "VUID-vkCmdResetEvent-stageMask-4098",
+          "vuid": "VUID-vkCmdResetEvent-stageMask-04098",
           "text": " Any pipeline stage included in pname:stageMask <strong class=\"purple\">must</strong> be supported by the capabilities of the queue family specified by the <code>queueFamilyIndex</code> member of the <a href=\"#VkCommandPoolCreateInfo\">VkCommandPoolCreateInfo</a> structure that was used to create the <code>VkCommandPool</code> that <code>commandBuffer</code> was allocated from, as specified in the <a href=\"#synchronization-pipeline-stages-supported\">table of supported pipeline stages</a>"
         },
         {
@@ -3641,10 +3673,6 @@
           "text": " <code>stageMask</code> <strong class=\"purple\">must</strong> be a valid combination of <a href=\"#VkPipelineStageFlagBits\">VkPipelineStageFlagBits</a> values"
         },
         {
-          "vuid": "VUID-vkCmdResetEvent-stageMask-requiredbitmask",
-          "text": " <code>stageMask</code> <strong class=\"purple\">must</strong> not be <code>0</code>"
-        },
-        {
           "vuid": "VUID-vkCmdResetEvent-commandBuffer-recording",
           "text": " <code>commandBuffer</code> <strong class=\"purple\">must</strong> be in the <a href=\"#commandbuffers-lifecycle\">recording state</a>"
         },
@@ -3705,6 +3733,12 @@
           "text": " There <strong class=\"purple\">must</strong> be an execution dependency between <code>vkCmdResetEvent</code> and the execution of any <a href=\"#vkCmdWaitEvents2KHR\">vkCmdWaitEvents2KHR</a> that includes <code>event</code> in its <code>pEvents</code> parameter"
         }
       ],
+      "!(VK_KHR_synchronization2)": [
+        {
+          "vuid": "VUID-vkCmdResetEvent-stageMask-04996",
+          "text": " pname:stageMask <strong class=\"purple\">must</strong> not be <code>0</code>"
+        }
+      ],
       "(VK_VERSION_1_1,VK_KHR_device_group)": [
         {
           "vuid": "VUID-vkCmdResetEvent-commandBuffer-01157",
@@ -3799,7 +3833,7 @@
           "text": " If the <a href=\"#features-tessellationShader\">tessellation shaders</a> feature is not enabled, pname:srcStageMask <strong class=\"purple\">must</strong> not contain <code>VK_PIPELINE_STAGE_TESSELLATION_CONTROL_SHADER_BIT</code> or <code>VK_PIPELINE_STAGE_TESSELLATION_EVALUATION_SHADER_BIT</code>"
         },
         {
-          "vuid": "VUID-vkCmdWaitEvents-srcStageMask-4098",
+          "vuid": "VUID-vkCmdWaitEvents-srcStageMask-04098",
           "text": " Any pipeline stage included in pname:srcStageMask <strong class=\"purple\">must</strong> be supported by the capabilities of the queue family specified by the <code>queueFamilyIndex</code> member of the <a href=\"#VkCommandPoolCreateInfo\">VkCommandPoolCreateInfo</a> structure that was used to create the <code>VkCommandPool</code> that <code>commandBuffer</code> was allocated from, as specified in the <a href=\"#synchronization-pipeline-stages-supported\">table of supported pipeline stages</a>"
         },
         {
@@ -3811,7 +3845,7 @@
           "text": " If the <a href=\"#features-tessellationShader\">tessellation shaders</a> feature is not enabled, pname:dstStageMask <strong class=\"purple\">must</strong> not contain <code>VK_PIPELINE_STAGE_TESSELLATION_CONTROL_SHADER_BIT</code> or <code>VK_PIPELINE_STAGE_TESSELLATION_EVALUATION_SHADER_BIT</code>"
         },
         {
-          "vuid": "VUID-vkCmdWaitEvents-dstStageMask-4098",
+          "vuid": "VUID-vkCmdWaitEvents-dstStageMask-04098",
           "text": " Any pipeline stage included in pname:dstStageMask <strong class=\"purple\">must</strong> be supported by the capabilities of the queue family specified by the <code>queueFamilyIndex</code> member of the <a href=\"#VkCommandPoolCreateInfo\">VkCommandPoolCreateInfo</a> structure that was used to create the <code>VkCommandPool</code> that <code>commandBuffer</code> was allocated from, as specified in the <a href=\"#synchronization-pipeline-stages-supported\">table of supported pipeline stages</a>"
         },
         {
@@ -3967,6 +4001,16 @@
           "text": " Elements of <code>pEvents</code> <strong class=\"purple\">must</strong> not have been signaled by <a href=\"#vkCmdSetEvent2KHR\">vkCmdSetEvent2KHR</a>"
         }
       ],
+      "!(VK_KHR_synchronization2)": [
+        {
+          "vuid": "VUID-vkCmdWaitEvents-srcStageMask-04996",
+          "text": " pname:srcStageMask <strong class=\"purple\">must</strong> not be <code>0</code>"
+        },
+        {
+          "vuid": "VUID-vkCmdWaitEvents-dstStageMask-04996",
+          "text": " pname:dstStageMask <strong class=\"purple\">must</strong> not be <code>0</code>"
+        }
+      ],
       "(VK_VERSION_1_1,VK_KHR_device_group)": [
         {
           "vuid": "VUID-vkCmdWaitEvents-commandBuffer-01167",
@@ -4043,7 +4087,7 @@
           "text": " If the <a href=\"#features-tessellationShader\">tessellation shaders</a> feature is not enabled, pname:srcStageMask <strong class=\"purple\">must</strong> not contain <code>VK_PIPELINE_STAGE_TESSELLATION_CONTROL_SHADER_BIT</code> or <code>VK_PIPELINE_STAGE_TESSELLATION_EVALUATION_SHADER_BIT</code>"
         },
         {
-          "vuid": "VUID-vkCmdPipelineBarrier-srcStageMask-4098",
+          "vuid": "VUID-vkCmdPipelineBarrier-srcStageMask-04098",
           "text": " Any pipeline stage included in pname:srcStageMask <strong class=\"purple\">must</strong> be supported by the capabilities of the queue family specified by the <code>queueFamilyIndex</code> member of the <a href=\"#VkCommandPoolCreateInfo\">VkCommandPoolCreateInfo</a> structure that was used to create the <code>VkCommandPool</code> that <code>commandBuffer</code> was allocated from, as specified in the <a href=\"#synchronization-pipeline-stages-supported\">table of supported pipeline stages</a>"
         },
         {
@@ -4055,7 +4099,7 @@
           "text": " If the <a href=\"#features-tessellationShader\">tessellation shaders</a> feature is not enabled, pname:dstStageMask <strong class=\"purple\">must</strong> not contain <code>VK_PIPELINE_STAGE_TESSELLATION_CONTROL_SHADER_BIT</code> or <code>VK_PIPELINE_STAGE_TESSELLATION_EVALUATION_SHADER_BIT</code>"
         },
         {
-          "vuid": "VUID-vkCmdPipelineBarrier-dstStageMask-4098",
+          "vuid": "VUID-vkCmdPipelineBarrier-dstStageMask-04098",
           "text": " Any pipeline stage included in pname:dstStageMask <strong class=\"purple\">must</strong> be supported by the capabilities of the queue family specified by the <code>queueFamilyIndex</code> member of the <a href=\"#VkCommandPoolCreateInfo\">VkCommandPoolCreateInfo</a> structure that was used to create the <code>VkCommandPool</code> that <code>commandBuffer</code> was allocated from, as specified in the <a href=\"#synchronization-pipeline-stages-supported\">table of supported pipeline stages</a>"
         },
         {
@@ -4111,18 +4155,10 @@
           "text": " <code>srcStageMask</code> <strong class=\"purple\">must</strong> be a valid combination of <a href=\"#VkPipelineStageFlagBits\">VkPipelineStageFlagBits</a> values"
         },
         {
-          "vuid": "VUID-vkCmdPipelineBarrier-srcStageMask-requiredbitmask",
-          "text": " <code>srcStageMask</code> <strong class=\"purple\">must</strong> not be <code>0</code>"
-        },
-        {
           "vuid": "VUID-vkCmdPipelineBarrier-dstStageMask-parameter",
           "text": " <code>dstStageMask</code> <strong class=\"purple\">must</strong> be a valid combination of <a href=\"#VkPipelineStageFlagBits\">VkPipelineStageFlagBits</a> values"
         },
         {
-          "vuid": "VUID-vkCmdPipelineBarrier-dstStageMask-requiredbitmask",
-          "text": " <code>dstStageMask</code> <strong class=\"purple\">must</strong> not be <code>0</code>"
-        },
-        {
           "vuid": "VUID-vkCmdPipelineBarrier-dependencyFlags-parameter",
           "text": " <code>dependencyFlags</code> <strong class=\"purple\">must</strong> be a valid combination of <a href=\"#VkDependencyFlagBits\">VkDependencyFlagBits</a> values"
         },
@@ -4215,6 +4251,16 @@
           "text": " If the <a href=\"#features-synchronization2\"><code>synchronization2</code></a> feature is not enabled, pname:dstStageMask <strong class=\"purple\">must</strong> not be <code>0</code>"
         }
       ],
+      "!(VK_KHR_synchronization2)": [
+        {
+          "vuid": "VUID-vkCmdPipelineBarrier-srcStageMask-04996",
+          "text": " pname:srcStageMask <strong class=\"purple\">must</strong> not be <code>0</code>"
+        },
+        {
+          "vuid": "VUID-vkCmdPipelineBarrier-dstStageMask-04996",
+          "text": " pname:dstStageMask <strong class=\"purple\">must</strong> not be <code>0</code>"
+        }
+      ],
       "(VK_VERSION_1_1,VK_KHR_multiview)": [
         {
           "vuid": "VUID-vkCmdPipelineBarrier-dependencyFlags-01186",
@@ -4521,6 +4567,24 @@
           "text": " If the <a href=\"#features-subpassShading\">subpass shading</a> feature is not enabled, pname:dstStageMask <strong class=\"purple\">must</strong> not contain <code>VK_PIPELINE_STAGE_2_SUBPASS_SHADING_BIT_HUAWEI</code>"
         }
       ],
+      "(VK_KHR_synchronization2)+(VK_HUAWEI_invocation_mask)": [
+        {
+          "vuid": "VUID-VkMemoryBarrier2KHR-srcStageMask-04995",
+          "text": " If the <a href=\"#features-invocationMask\">invocation mask image</a> feature is not enabled, pname:srcStageMask <strong class=\"purple\">must</strong> not contain <code>VK_PIPELINE_STAGE_2_INVOCATION_MASK_BIT_HUAWEI</code>"
+        },
+        {
+          "vuid": "VUID-VkMemoryBarrier2KHR-srcAccessMask-04994",
+          "text": " If pname:srcAccessMask includes <code>VK_ACCESS_2_INVOCATION_MASK_READ_BIT_HUAWEI</code>, pname:srcStageMask <strong class=\"purple\">must</strong> include <code>VK_PIPELINE_STAGE_2_INVOCATION_MASK_BIT_HUAWEI</code>"
+        },
+        {
+          "vuid": "VUID-VkMemoryBarrier2KHR-dstStageMask-04995",
+          "text": " If the <a href=\"#features-invocationMask\">invocation mask image</a> feature is not enabled, pname:dstStageMask <strong class=\"purple\">must</strong> not contain <code>VK_PIPELINE_STAGE_2_INVOCATION_MASK_BIT_HUAWEI</code>"
+        },
+        {
+          "vuid": "VUID-VkMemoryBarrier2KHR-dstAccessMask-04994",
+          "text": " If pname:dstAccessMask includes <code>VK_ACCESS_2_INVOCATION_MASK_READ_BIT_HUAWEI</code>, pname:dstStageMask <strong class=\"purple\">must</strong> include <code>VK_PIPELINE_STAGE_2_INVOCATION_MASK_BIT_HUAWEI</code>"
+        }
+      ],
       "(VK_KHR_synchronization2)+(VK_NV_device_generated_commands)": [
         {
           "vuid": "VUID-VkMemoryBarrier2KHR-srcAccessMask-03924",
@@ -4552,7 +4616,7 @@
       "(VK_KHR_synchronization2)+(VK_KHR_acceleration_structure,VK_NV_ray_tracing)": [
         {
           "vuid": "VUID-VkMemoryBarrier2KHR-srcAccessMask-03927",
-          "text": " If pname:srcAccessMask includes <code>VK_ACCESS_2_ACCELERATION_STRUCTURE_READ_BIT_KHR</code>, pname:srcStageMask <strong class=\"purple\">must</strong> include <code>VK_PIPELINE_STAGE_2_ACCELERATION_STRUCTURE_BUILD_BIT_KHR</code>, <code>VK_PIPELINE_STAGE_2_RAY_TRACING_SHADER_BIT_KHR</code>, or <code>VK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT_KHR</code>"
+          "text": " If pname:srcAccessMask includes <code>VK_ACCESS_2_ACCELERATION_STRUCTURE_READ_BIT_KHR</code>, pname:srcStageMask <strong class=\"purple\">must</strong> include <code>VK_PIPELINE_STAGE_2_ACCELERATION_STRUCTURE_BUILD_BIT_KHR</code>, <code>VK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT_KHR</code>, or one of the <code>VK_PIPELINE_STAGE_*_SHADER_BIT</code> stages"
         },
         {
           "vuid": "VUID-VkMemoryBarrier2KHR-srcAccessMask-03928",
@@ -4560,13 +4624,53 @@
         },
         {
           "vuid": "VUID-VkMemoryBarrier2KHR-dstAccessMask-03927",
-          "text": " If pname:dstAccessMask includes <code>VK_ACCESS_2_ACCELERATION_STRUCTURE_READ_BIT_KHR</code>, pname:dstStageMask <strong class=\"purple\">must</strong> include <code>VK_PIPELINE_STAGE_2_ACCELERATION_STRUCTURE_BUILD_BIT_KHR</code>, <code>VK_PIPELINE_STAGE_2_RAY_TRACING_SHADER_BIT_KHR</code>, or <code>VK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT_KHR</code>"
+          "text": " If pname:dstAccessMask includes <code>VK_ACCESS_2_ACCELERATION_STRUCTURE_READ_BIT_KHR</code>, pname:dstStageMask <strong class=\"purple\">must</strong> include <code>VK_PIPELINE_STAGE_2_ACCELERATION_STRUCTURE_BUILD_BIT_KHR</code>, <code>VK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT_KHR</code>, or one of the <code>VK_PIPELINE_STAGE_*_SHADER_BIT</code> stages"
         },
         {
           "vuid": "VUID-VkMemoryBarrier2KHR-dstAccessMask-03928",
           "text": " If pname:dstAccessMask includes <code>VK_ACCESS_2_ACCELERATION_STRUCTURE_WRITE_BIT_KHR</code>, pname:dstStageMask <strong class=\"purple\">must</strong> include <code>VK_PIPELINE_STAGE_2_ACCELERATION_STRUCTURE_BUILD_BIT_KHR</code> or <code>VK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT_KHR</code>"
         }
       ],
+      "(VK_KHR_synchronization2)+(VK_KHR_acceleration_structure,VK_NV_ray_tracing)+!(VK_KHR_ray_query)+(VK_KHR_ray_tracing_pipeline,VK_NV_ray_tracing)": [
+        {
+          "vuid": "VUID-VkMemoryBarrier2KHR-srcAccessMask-06254",
+          "text": " If pname:srcAccessMask includes <code>VK_ACCESS_2_ACCELERATION_STRUCTURE_READ_BIT_KHR</code>, pname:srcStageMask <strong class=\"purple\">must</strong> not include any of the <code>VK_PIPELINE_STAGE_*_SHADER_BIT</code> stages except <code>VK_PIPELINE_STAGE_2_RAY_TRACING_SHADER_BIT_KHR</code>"
+        },
+        {
+          "vuid": "VUID-VkMemoryBarrier2KHR-dstAccessMask-06254",
+          "text": " If pname:dstAccessMask includes <code>VK_ACCESS_2_ACCELERATION_STRUCTURE_READ_BIT_KHR</code>, pname:dstStageMask <strong class=\"purple\">must</strong> not include any of the <code>VK_PIPELINE_STAGE_*_SHADER_BIT</code> stages except <code>VK_PIPELINE_STAGE_2_RAY_TRACING_SHADER_BIT_KHR</code>"
+        }
+      ],
+      "(VK_KHR_synchronization2)+(VK_KHR_acceleration_structure,VK_NV_ray_tracing)+!(VK_KHR_ray_query)+!(VK_KHR_ray_tracing_pipeline,VK_NV_ray_tracing)": [
+        {
+          "vuid": "VUID-VkMemoryBarrier2KHR-srcAccessMask-06255",
+          "text": " If pname:srcAccessMask includes <code>VK_ACCESS_2_ACCELERATION_STRUCTURE_READ_BIT_KHR</code>, pname:srcStageMask <strong class=\"purple\">must</strong> not include any of the <code>VK_PIPELINE_STAGE_*_SHADER_BIT</code> stages"
+        },
+        {
+          "vuid": "VUID-VkMemoryBarrier2KHR-dstAccessMask-06255",
+          "text": " If pname:dstAccessMask includes <code>VK_ACCESS_2_ACCELERATION_STRUCTURE_READ_BIT_KHR</code>, pname:dstStageMask <strong class=\"purple\">must</strong> not include any of the <code>VK_PIPELINE_STAGE_*_SHADER_BIT</code> stages"
+        }
+      ],
+      "(VK_KHR_synchronization2)+(VK_KHR_acceleration_structure,VK_NV_ray_tracing)+(VK_KHR_ray_query)+(VK_KHR_ray_tracing_pipeline,VK_NV_ray_tracing)": [
+        {
+          "vuid": "VUID-VkMemoryBarrier2KHR-rayQuery-06256",
+          "text": " If <a href=\"#features-rayQuery\"><code>rayQuery</code></a> is not enabled and pname:srcAccessMask includes <code>VK_ACCESS_2_ACCELERATION_STRUCTURE_READ_BIT_KHR</code>, pname:srcStageMask <strong class=\"purple\">must</strong> not include any of the <code>VK_PIPELINE_STAGE_*_SHADER_BIT</code> stages except <code>VK_PIPELINE_STAGE_2_RAY_TRACING_SHADER_BIT_KHR</code>"
+        },
+        {
+          "vuid": "VUID-VkMemoryBarrier2KHR-rayQuery-06256",
+          "text": " If <a href=\"#features-rayQuery\"><code>rayQuery</code></a> is not enabled and pname:dstAccessMask includes <code>VK_ACCESS_2_ACCELERATION_STRUCTURE_READ_BIT_KHR</code>, pname:dstStageMask <strong class=\"purple\">must</strong> not include any of the <code>VK_PIPELINE_STAGE_*_SHADER_BIT</code> stages except <code>VK_PIPELINE_STAGE_2_RAY_TRACING_SHADER_BIT_KHR</code>"
+        }
+      ],
+      "(VK_KHR_synchronization2)+(VK_KHR_acceleration_structure,VK_NV_ray_tracing)+(VK_KHR_ray_query)+!(VK_KHR_ray_tracing_pipeline,VK_NV_ray_tracing)": [
+        {
+          "vuid": "VUID-VkMemoryBarrier2KHR-rayQuery-06257",
+          "text": " If <a href=\"#features-rayQuery\"><code>rayQuery</code></a> is not enabled and pname:srcAccessMask includes <code>VK_ACCESS_2_ACCELERATION_STRUCTURE_READ_BIT_KHR</code>, pname:srcStageMask <strong class=\"purple\">must</strong> not include any of the <code>VK_PIPELINE_STAGE_*_SHADER_BIT</code> stages"
+        },
+        {
+          "vuid": "VUID-VkMemoryBarrier2KHR-rayQuery-06257",
+          "text": " If <a href=\"#features-rayQuery\"><code>rayQuery</code></a> is not enabled and pname:dstAccessMask includes <code>VK_ACCESS_2_ACCELERATION_STRUCTURE_READ_BIT_KHR</code>, pname:dstStageMask <strong class=\"purple\">must</strong> not include any of the <code>VK_PIPELINE_STAGE_*_SHADER_BIT</code> stages"
+        }
+      ],
       "(VK_KHR_synchronization2)+(VK_KHR_video_decode_queue)": [
         {
           "vuid": "VUID-VkMemoryBarrier2KHR-srcAccessMask-04858",
@@ -4951,6 +5055,24 @@
           "text": " If the <a href=\"#features-subpassShading\">subpass shading</a> feature is not enabled, pname:dstStageMask <strong class=\"purple\">must</strong> not contain <code>VK_PIPELINE_STAGE_2_SUBPASS_SHADING_BIT_HUAWEI</code>"
         }
       ],
+      "(VK_KHR_synchronization2)+(VK_HUAWEI_invocation_mask)": [
+        {
+          "vuid": "VUID-VkBufferMemoryBarrier2KHR-srcStageMask-04995",
+          "text": " If the <a href=\"#features-invocationMask\">invocation mask image</a> feature is not enabled, pname:srcStageMask <strong class=\"purple\">must</strong> not contain <code>VK_PIPELINE_STAGE_2_INVOCATION_MASK_BIT_HUAWEI</code>"
+        },
+        {
+          "vuid": "VUID-VkBufferMemoryBarrier2KHR-srcAccessMask-04994",
+          "text": " If pname:srcAccessMask includes <code>VK_ACCESS_2_INVOCATION_MASK_READ_BIT_HUAWEI</code>, pname:srcStageMask <strong class=\"purple\">must</strong> include <code>VK_PIPELINE_STAGE_2_INVOCATION_MASK_BIT_HUAWEI</code>"
+        },
+        {
+          "vuid": "VUID-VkBufferMemoryBarrier2KHR-dstStageMask-04995",
+          "text": " If the <a href=\"#features-invocationMask\">invocation mask image</a> feature is not enabled, pname:dstStageMask <strong class=\"purple\">must</strong> not contain <code>VK_PIPELINE_STAGE_2_INVOCATION_MASK_BIT_HUAWEI</code>"
+        },
+        {
+          "vuid": "VUID-VkBufferMemoryBarrier2KHR-dstAccessMask-04994",
+          "text": " If pname:dstAccessMask includes <code>VK_ACCESS_2_INVOCATION_MASK_READ_BIT_HUAWEI</code>, pname:dstStageMask <strong class=\"purple\">must</strong> include <code>VK_PIPELINE_STAGE_2_INVOCATION_MASK_BIT_HUAWEI</code>"
+        }
+      ],
       "(VK_KHR_synchronization2)+(VK_NV_device_generated_commands)": [
         {
           "vuid": "VUID-VkBufferMemoryBarrier2KHR-srcAccessMask-03924",
@@ -4982,7 +5104,7 @@
       "(VK_KHR_synchronization2)+(VK_KHR_acceleration_structure,VK_NV_ray_tracing)": [
         {
           "vuid": "VUID-VkBufferMemoryBarrier2KHR-srcAccessMask-03927",
-          "text": " If pname:srcAccessMask includes <code>VK_ACCESS_2_ACCELERATION_STRUCTURE_READ_BIT_KHR</code>, pname:srcStageMask <strong class=\"purple\">must</strong> include <code>VK_PIPELINE_STAGE_2_ACCELERATION_STRUCTURE_BUILD_BIT_KHR</code>, <code>VK_PIPELINE_STAGE_2_RAY_TRACING_SHADER_BIT_KHR</code>, or <code>VK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT_KHR</code>"
+          "text": " If pname:srcAccessMask includes <code>VK_ACCESS_2_ACCELERATION_STRUCTURE_READ_BIT_KHR</code>, pname:srcStageMask <strong class=\"purple\">must</strong> include <code>VK_PIPELINE_STAGE_2_ACCELERATION_STRUCTURE_BUILD_BIT_KHR</code>, <code>VK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT_KHR</code>, or one of the <code>VK_PIPELINE_STAGE_*_SHADER_BIT</code> stages"
         },
         {
           "vuid": "VUID-VkBufferMemoryBarrier2KHR-srcAccessMask-03928",
@@ -4990,13 +5112,53 @@
         },
         {
           "vuid": "VUID-VkBufferMemoryBarrier2KHR-dstAccessMask-03927",
-          "text": " If pname:dstAccessMask includes <code>VK_ACCESS_2_ACCELERATION_STRUCTURE_READ_BIT_KHR</code>, pname:dstStageMask <strong class=\"purple\">must</strong> include <code>VK_PIPELINE_STAGE_2_ACCELERATION_STRUCTURE_BUILD_BIT_KHR</code>, <code>VK_PIPELINE_STAGE_2_RAY_TRACING_SHADER_BIT_KHR</code>, or <code>VK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT_KHR</code>"
+          "text": " If pname:dstAccessMask includes <code>VK_ACCESS_2_ACCELERATION_STRUCTURE_READ_BIT_KHR</code>, pname:dstStageMask <strong class=\"purple\">must</strong> include <code>VK_PIPELINE_STAGE_2_ACCELERATION_STRUCTURE_BUILD_BIT_KHR</code>, <code>VK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT_KHR</code>, or one of the <code>VK_PIPELINE_STAGE_*_SHADER_BIT</code> stages"
         },
         {
           "vuid": "VUID-VkBufferMemoryBarrier2KHR-dstAccessMask-03928",
           "text": " If pname:dstAccessMask includes <code>VK_ACCESS_2_ACCELERATION_STRUCTURE_WRITE_BIT_KHR</code>, pname:dstStageMask <strong class=\"purple\">must</strong> include <code>VK_PIPELINE_STAGE_2_ACCELERATION_STRUCTURE_BUILD_BIT_KHR</code> or <code>VK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT_KHR</code>"
         }
       ],
+      "(VK_KHR_synchronization2)+(VK_KHR_acceleration_structure,VK_NV_ray_tracing)+!(VK_KHR_ray_query)+(VK_KHR_ray_tracing_pipeline,VK_NV_ray_tracing)": [
+        {
+          "vuid": "VUID-VkBufferMemoryBarrier2KHR-srcAccessMask-06254",
+          "text": " If pname:srcAccessMask includes <code>VK_ACCESS_2_ACCELERATION_STRUCTURE_READ_BIT_KHR</code>, pname:srcStageMask <strong class=\"purple\">must</strong> not include any of the <code>VK_PIPELINE_STAGE_*_SHADER_BIT</code> stages except <code>VK_PIPELINE_STAGE_2_RAY_TRACING_SHADER_BIT_KHR</code>"
+        },
+        {
+          "vuid": "VUID-VkBufferMemoryBarrier2KHR-dstAccessMask-06254",
+          "text": " If pname:dstAccessMask includes <code>VK_ACCESS_2_ACCELERATION_STRUCTURE_READ_BIT_KHR</code>, pname:dstStageMask <strong class=\"purple\">must</strong> not include any of the <code>VK_PIPELINE_STAGE_*_SHADER_BIT</code> stages except <code>VK_PIPELINE_STAGE_2_RAY_TRACING_SHADER_BIT_KHR</code>"
+        }
+      ],
+      "(VK_KHR_synchronization2)+(VK_KHR_acceleration_structure,VK_NV_ray_tracing)+!(VK_KHR_ray_query)+!(VK_KHR_ray_tracing_pipeline,VK_NV_ray_tracing)": [
+        {
+          "vuid": "VUID-VkBufferMemoryBarrier2KHR-srcAccessMask-06255",
+          "text": " If pname:srcAccessMask includes <code>VK_ACCESS_2_ACCELERATION_STRUCTURE_READ_BIT_KHR</code>, pname:srcStageMask <strong class=\"purple\">must</strong> not include any of the <code>VK_PIPELINE_STAGE_*_SHADER_BIT</code> stages"
+        },
+        {
+          "vuid": "VUID-VkBufferMemoryBarrier2KHR-dstAccessMask-06255",
+          "text": " If pname:dstAccessMask includes <code>VK_ACCESS_2_ACCELERATION_STRUCTURE_READ_BIT_KHR</code>, pname:dstStageMask <strong class=\"purple\">must</strong> not include any of the <code>VK_PIPELINE_STAGE_*_SHADER_BIT</code> stages"
+        }
+      ],
+      "(VK_KHR_synchronization2)+(VK_KHR_acceleration_structure,VK_NV_ray_tracing)+(VK_KHR_ray_query)+(VK_KHR_ray_tracing_pipeline,VK_NV_ray_tracing)": [
+        {
+          "vuid": "VUID-VkBufferMemoryBarrier2KHR-rayQuery-06256",
+          "text": " If <a href=\"#features-rayQuery\"><code>rayQuery</code></a> is not enabled and pname:srcAccessMask includes <code>VK_ACCESS_2_ACCELERATION_STRUCTURE_READ_BIT_KHR</code>, pname:srcStageMask <strong class=\"purple\">must</strong> not include any of the <code>VK_PIPELINE_STAGE_*_SHADER_BIT</code> stages except <code>VK_PIPELINE_STAGE_2_RAY_TRACING_SHADER_BIT_KHR</code>"
+        },
+        {
+          "vuid": "VUID-VkBufferMemoryBarrier2KHR-rayQuery-06256",
+          "text": " If <a href=\"#features-rayQuery\"><code>rayQuery</code></a> is not enabled and pname:dstAccessMask includes <code>VK_ACCESS_2_ACCELERATION_STRUCTURE_READ_BIT_KHR</code>, pname:dstStageMask <strong class=\"purple\">must</strong> not include any of the <code>VK_PIPELINE_STAGE_*_SHADER_BIT</code> stages except <code>VK_PIPELINE_STAGE_2_RAY_TRACING_SHADER_BIT_KHR</code>"
+        }
+      ],
+      "(VK_KHR_synchronization2)+(VK_KHR_acceleration_structure,VK_NV_ray_tracing)+(VK_KHR_ray_query)+!(VK_KHR_ray_tracing_pipeline,VK_NV_ray_tracing)": [
+        {
+          "vuid": "VUID-VkBufferMemoryBarrier2KHR-rayQuery-06257",
+          "text": " If <a href=\"#features-rayQuery\"><code>rayQuery</code></a> is not enabled and pname:srcAccessMask includes <code>VK_ACCESS_2_ACCELERATION_STRUCTURE_READ_BIT_KHR</code>, pname:srcStageMask <strong class=\"purple\">must</strong> not include any of the <code>VK_PIPELINE_STAGE_*_SHADER_BIT</code> stages"
+        },
+        {
+          "vuid": "VUID-VkBufferMemoryBarrier2KHR-rayQuery-06257",
+          "text": " If <a href=\"#features-rayQuery\"><code>rayQuery</code></a> is not enabled and pname:dstAccessMask includes <code>VK_ACCESS_2_ACCELERATION_STRUCTURE_READ_BIT_KHR</code>, pname:dstStageMask <strong class=\"purple\">must</strong> not include any of the <code>VK_PIPELINE_STAGE_*_SHADER_BIT</code> stages"
+        }
+      ],
       "(VK_KHR_synchronization2)+(VK_KHR_video_decode_queue)": [
         {
           "vuid": "VUID-VkBufferMemoryBarrier2KHR-srcAccessMask-04858",
@@ -5497,6 +5659,24 @@
           "text": " If the <a href=\"#features-subpassShading\">subpass shading</a> feature is not enabled, pname:dstStageMask <strong class=\"purple\">must</strong> not contain <code>VK_PIPELINE_STAGE_2_SUBPASS_SHADING_BIT_HUAWEI</code>"
         }
       ],
+      "(VK_KHR_synchronization2)+(VK_HUAWEI_invocation_mask)": [
+        {
+          "vuid": "VUID-VkImageMemoryBarrier2KHR-srcStageMask-04995",
+          "text": " If the <a href=\"#features-invocationMask\">invocation mask image</a> feature is not enabled, pname:srcStageMask <strong class=\"purple\">must</strong> not contain <code>VK_PIPELINE_STAGE_2_INVOCATION_MASK_BIT_HUAWEI</code>"
+        },
+        {
+          "vuid": "VUID-VkImageMemoryBarrier2KHR-srcAccessMask-04994",
+          "text": " If pname:srcAccessMask includes <code>VK_ACCESS_2_INVOCATION_MASK_READ_BIT_HUAWEI</code>, pname:srcStageMask <strong class=\"purple\">must</strong> include <code>VK_PIPELINE_STAGE_2_INVOCATION_MASK_BIT_HUAWEI</code>"
+        },
+        {
+          "vuid": "VUID-VkImageMemoryBarrier2KHR-dstStageMask-04995",
+          "text": " If the <a href=\"#features-invocationMask\">invocation mask image</a> feature is not enabled, pname:dstStageMask <strong class=\"purple\">must</strong> not contain <code>VK_PIPELINE_STAGE_2_INVOCATION_MASK_BIT_HUAWEI</code>"
+        },
+        {
+          "vuid": "VUID-VkImageMemoryBarrier2KHR-dstAccessMask-04994",
+          "text": " If pname:dstAccessMask includes <code>VK_ACCESS_2_INVOCATION_MASK_READ_BIT_HUAWEI</code>, pname:dstStageMask <strong class=\"purple\">must</strong> include <code>VK_PIPELINE_STAGE_2_INVOCATION_MASK_BIT_HUAWEI</code>"
+        }
+      ],
       "(VK_KHR_synchronization2)+(VK_NV_device_generated_commands)": [
         {
           "vuid": "VUID-VkImageMemoryBarrier2KHR-srcAccessMask-03924",
@@ -5528,7 +5708,7 @@
       "(VK_KHR_synchronization2)+(VK_KHR_acceleration_structure,VK_NV_ray_tracing)": [
         {
           "vuid": "VUID-VkImageMemoryBarrier2KHR-srcAccessMask-03927",
-          "text": " If pname:srcAccessMask includes <code>VK_ACCESS_2_ACCELERATION_STRUCTURE_READ_BIT_KHR</code>, pname:srcStageMask <strong class=\"purple\">must</strong> include <code>VK_PIPELINE_STAGE_2_ACCELERATION_STRUCTURE_BUILD_BIT_KHR</code>, <code>VK_PIPELINE_STAGE_2_RAY_TRACING_SHADER_BIT_KHR</code>, or <code>VK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT_KHR</code>"
+          "text": " If pname:srcAccessMask includes <code>VK_ACCESS_2_ACCELERATION_STRUCTURE_READ_BIT_KHR</code>, pname:srcStageMask <strong class=\"purple\">must</strong> include <code>VK_PIPELINE_STAGE_2_ACCELERATION_STRUCTURE_BUILD_BIT_KHR</code>, <code>VK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT_KHR</code>, or one of the <code>VK_PIPELINE_STAGE_*_SHADER_BIT</code> stages"
         },
         {
           "vuid": "VUID-VkImageMemoryBarrier2KHR-srcAccessMask-03928",
@@ -5536,13 +5716,53 @@
         },
         {
           "vuid": "VUID-VkImageMemoryBarrier2KHR-dstAccessMask-03927",
-          "text": " If pname:dstAccessMask includes <code>VK_ACCESS_2_ACCELERATION_STRUCTURE_READ_BIT_KHR</code>, pname:dstStageMask <strong class=\"purple\">must</strong> include <code>VK_PIPELINE_STAGE_2_ACCELERATION_STRUCTURE_BUILD_BIT_KHR</code>, <code>VK_PIPELINE_STAGE_2_RAY_TRACING_SHADER_BIT_KHR</code>, or <code>VK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT_KHR</code>"
+          "text": " If pname:dstAccessMask includes <code>VK_ACCESS_2_ACCELERATION_STRUCTURE_READ_BIT_KHR</code>, pname:dstStageMask <strong class=\"purple\">must</strong> include <code>VK_PIPELINE_STAGE_2_ACCELERATION_STRUCTURE_BUILD_BIT_KHR</code>, <code>VK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT_KHR</code>, or one of the <code>VK_PIPELINE_STAGE_*_SHADER_BIT</code> stages"
         },
         {
           "vuid": "VUID-VkImageMemoryBarrier2KHR-dstAccessMask-03928",
           "text": " If pname:dstAccessMask includes <code>VK_ACCESS_2_ACCELERATION_STRUCTURE_WRITE_BIT_KHR</code>, pname:dstStageMask <strong class=\"purple\">must</strong> include <code>VK_PIPELINE_STAGE_2_ACCELERATION_STRUCTURE_BUILD_BIT_KHR</code> or <code>VK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT_KHR</code>"
         }
       ],
+      "(VK_KHR_synchronization2)+(VK_KHR_acceleration_structure,VK_NV_ray_tracing)+!(VK_KHR_ray_query)+(VK_KHR_ray_tracing_pipeline,VK_NV_ray_tracing)": [
+        {
+          "vuid": "VUID-VkImageMemoryBarrier2KHR-srcAccessMask-06254",
+          "text": " If pname:srcAccessMask includes <code>VK_ACCESS_2_ACCELERATION_STRUCTURE_READ_BIT_KHR</code>, pname:srcStageMask <strong class=\"purple\">must</strong> not include any of the <code>VK_PIPELINE_STAGE_*_SHADER_BIT</code> stages except <code>VK_PIPELINE_STAGE_2_RAY_TRACING_SHADER_BIT_KHR</code>"
+        },
+        {
+          "vuid": "VUID-VkImageMemoryBarrier2KHR-dstAccessMask-06254",
+          "text": " If pname:dstAccessMask includes <code>VK_ACCESS_2_ACCELERATION_STRUCTURE_READ_BIT_KHR</code>, pname:dstStageMask <strong class=\"purple\">must</strong> not include any of the <code>VK_PIPELINE_STAGE_*_SHADER_BIT</code> stages except <code>VK_PIPELINE_STAGE_2_RAY_TRACING_SHADER_BIT_KHR</code>"
+        }
+      ],
+      "(VK_KHR_synchronization2)+(VK_KHR_acceleration_structure,VK_NV_ray_tracing)+!(VK_KHR_ray_query)+!(VK_KHR_ray_tracing_pipeline,VK_NV_ray_tracing)": [
+        {
+          "vuid": "VUID-VkImageMemoryBarrier2KHR-srcAccessMask-06255",
+          "text": " If pname:srcAccessMask includes <code>VK_ACCESS_2_ACCELERATION_STRUCTURE_READ_BIT_KHR</code>, pname:srcStageMask <strong class=\"purple\">must</strong> not include any of the <code>VK_PIPELINE_STAGE_*_SHADER_BIT</code> stages"
+        },
+        {
+          "vuid": "VUID-VkImageMemoryBarrier2KHR-dstAccessMask-06255",
+          "text": " If pname:dstAccessMask includes <code>VK_ACCESS_2_ACCELERATION_STRUCTURE_READ_BIT_KHR</code>, pname:dstStageMask <strong class=\"purple\">must</strong> not include any of the <code>VK_PIPELINE_STAGE_*_SHADER_BIT</code> stages"
+        }
+      ],
+      "(VK_KHR_synchronization2)+(VK_KHR_acceleration_structure,VK_NV_ray_tracing)+(VK_KHR_ray_query)+(VK_KHR_ray_tracing_pipeline,VK_NV_ray_tracing)": [
+        {
+          "vuid": "VUID-VkImageMemoryBarrier2KHR-rayQuery-06256",
+          "text": " If <a href=\"#features-rayQuery\"><code>rayQuery</code></a> is not enabled and pname:srcAccessMask includes <code>VK_ACCESS_2_ACCELERATION_STRUCTURE_READ_BIT_KHR</code>, pname:srcStageMask <strong class=\"purple\">must</strong> not include any of the <code>VK_PIPELINE_STAGE_*_SHADER_BIT</code> stages except <code>VK_PIPELINE_STAGE_2_RAY_TRACING_SHADER_BIT_KHR</code>"
+        },
+        {
+          "vuid": "VUID-VkImageMemoryBarrier2KHR-rayQuery-06256",
+          "text": " If <a href=\"#features-rayQuery\"><code>rayQuery</code></a> is not enabled and pname:dstAccessMask includes <code>VK_ACCESS_2_ACCELERATION_STRUCTURE_READ_BIT_KHR</code>, pname:dstStageMask <strong class=\"purple\">must</strong> not include any of the <code>VK_PIPELINE_STAGE_*_SHADER_BIT</code> stages except <code>VK_PIPELINE_STAGE_2_RAY_TRACING_SHADER_BIT_KHR</code>"
+        }
+      ],
+      "(VK_KHR_synchronization2)+(VK_KHR_acceleration_structure,VK_NV_ray_tracing)+(VK_KHR_ray_query)+!(VK_KHR_ray_tracing_pipeline,VK_NV_ray_tracing)": [
+        {
+          "vuid": "VUID-VkImageMemoryBarrier2KHR-rayQuery-06257",
+          "text": " If <a href=\"#features-rayQuery\"><code>rayQuery</code></a> is not enabled and pname:srcAccessMask includes <code>VK_ACCESS_2_ACCELERATION_STRUCTURE_READ_BIT_KHR</code>, pname:srcStageMask <strong class=\"purple\">must</strong> not include any of the <code>VK_PIPELINE_STAGE_*_SHADER_BIT</code> stages"
+        },
+        {
+          "vuid": "VUID-VkImageMemoryBarrier2KHR-rayQuery-06257",
+          "text": " If <a href=\"#features-rayQuery\"><code>rayQuery</code></a> is not enabled and pname:dstAccessMask includes <code>VK_ACCESS_2_ACCELERATION_STRUCTURE_READ_BIT_KHR</code>, pname:dstStageMask <strong class=\"purple\">must</strong> not include any of the <code>VK_PIPELINE_STAGE_*_SHADER_BIT</code> stages"
+        }
+      ],
       "(VK_KHR_synchronization2)+(VK_KHR_video_decode_queue)": [
         {
           "vuid": "VUID-VkImageMemoryBarrier2KHR-srcAccessMask-04858",
@@ -6514,6 +6734,26 @@
           "vuid": "VUID-VkSubpassDependency-dstStageMask-02102",
           "text": " If the <a href=\"#features-taskShader\">task shaders</a> feature is not enabled, <code>dstStageMask</code> <strong class=\"purple\">must</strong> not contain <code>VK_PIPELINE_STAGE_TASK_SHADER_BIT_NV</code>"
         }
+      ],
+      "(VK_KHR_synchronization2)": [
+        {
+          "vuid": "VUID-VkSubpassDependency-synchronization2-04984",
+          "text": " If the <a href=\"#features-synchronization2\"><code>synchronization2</code></a> feature is not enabled, <code>srcStageMask</code> <strong class=\"purple\">must</strong> not be <code>0</code>"
+        },
+        {
+          "vuid": "VUID-VkSubpassDependency-synchronization2-04985",
+          "text": " If the <a href=\"#features-synchronization2\"><code>synchronization2</code></a> feature is not enabled, <code>dstStageMask</code> <strong class=\"purple\">must</strong> not be <code>0</code>"
+        }
+      ],
+      "!(VK_KHR_synchronization2)": [
+        {
+          "vuid": "VUID-VkSubpassDependency-srcStageMask-04986",
+          "text": " <code>srcStageMask</code> <strong class=\"purple\">must</strong> not be <code>0</code>"
+        },
+        {
+          "vuid": "VUID-VkSubpassDependency-dstStageMask-04987",
+          "text": " <code>dstStageMask</code> <strong class=\"purple\">must</strong> not be <code>0</code>"
+        }
       ]
     },
     "vkCreateRenderPass2": {
@@ -6990,7 +7230,7 @@
         },
         {
           "vuid": "VUID-VkSubpassDescriptionDepthStencilResolve-pDepthStencilResolveAttachment-02651",
-          "text": " If <code>pDepthStencilResolveAttachment</code> is not <code>NULL</code> and does not have the value <code>VK_ATTACHMENT_UNUSED</code> then it <strong class=\"purple\">must</strong> have a format whose features contain <code>VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT</code>"
+          "text": " If <code>pDepthStencilResolveAttachment</code> is not <code>NULL</code> and does not have the value <code>VK_ATTACHMENT_UNUSED</code> then it <strong class=\"purple\">must</strong> have an image format whose <a href=\"#potential-format-features\">potential format features</a> contain <code>VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT</code>"
         },
         {
           "vuid": "VUID-VkSubpassDescriptionDepthStencilResolve-pDepthStencilResolveAttachment-03181",
@@ -7252,6 +7492,26 @@
           "vuid": "VUID-VkSubpassDependency2-dstStageMask-02106",
           "text": " If the <a href=\"#features-taskShader\">task shaders</a> feature is not enabled, <code>dstStageMask</code> <strong class=\"purple\">must</strong> not contain <code>VK_PIPELINE_STAGE_TASK_SHADER_BIT_NV</code>"
         }
+      ],
+      "(VK_VERSION_1_2,VK_KHR_create_renderpass2)+(VK_KHR_synchronization2)": [
+        {
+          "vuid": "VUID-VkSubpassDependency2-synchronization2-04988",
+          "text": " If the <a href=\"#features-synchronization2\"><code>synchronization2</code></a> feature is not enabled, <code>srcStageMask</code> <strong class=\"purple\">must</strong> not be <code>0</code>"
+        },
+        {
+          "vuid": "VUID-VkSubpassDependency2-synchronization2-04989",
+          "text": " If the <a href=\"#features-synchronization2\"><code>synchronization2</code></a> feature is not enabled, <code>dstStageMask</code> <strong class=\"purple\">must</strong> not be <code>0</code>"
+        }
+      ],
+      "(VK_VERSION_1_2,VK_KHR_create_renderpass2)+!(VK_KHR_synchronization2)": [
+        {
+          "vuid": "VUID-VkSubpassDependency2-srcStageMask-04990",
+          "text": " <code>srcStageMask</code> <strong class=\"purple\">must</strong> not be <code>0</code>"
+        },
+        {
+          "vuid": "VUID-VkSubpassDependency2-dstStageMask-04991",
+          "text": " <code>dstStageMask</code> <strong class=\"purple\">must</strong> not be <code>0</code>"
+        }
       ]
     },
     "vkDestroyRenderPass": {
@@ -7870,11 +8130,11 @@
         },
         {
           "vuid": "VUID-VkRenderPassBeginInfo-renderArea-02848",
-          "text": " <span class=\"eq\"><code>renderArea.offset.x</code> &#43; <code>renderArea.offset.width</code></span> <strong class=\"purple\">must</strong> be less than or equal to <a href=\"#VkFramebufferCreateInfo\">VkFramebufferCreateInfo</a>::<code>width</code> the <code>framebuffer</code> was created with"
+          "text": " <span class=\"eq\"><code>renderArea.offset.x</code> &#43; <code>renderArea.extent.width</code></span> <strong class=\"purple\">must</strong> be less than or equal to <a href=\"#VkFramebufferCreateInfo\">VkFramebufferCreateInfo</a>::<code>width</code> the <code>framebuffer</code> was created with"
         },
         {
           "vuid": "VUID-VkRenderPassBeginInfo-renderArea-02849",
-          "text": " <span class=\"eq\"><code>renderArea.offset.y</code> &#43; <code>renderArea.offset.height</code></span> <strong class=\"purple\">must</strong> be less than or equal to <a href=\"#VkFramebufferCreateInfo\">VkFramebufferCreateInfo</a>::<code>height</code> the <code>framebuffer</code> was created with"
+          "text": " <span class=\"eq\"><code>renderArea.offset.y</code> &#43; <code>renderArea.extent.height</code></span> <strong class=\"purple\">must</strong> be less than or equal to <a href=\"#VkFramebufferCreateInfo\">VkFramebufferCreateInfo</a>::<code>height</code> the <code>framebuffer</code> was created with"
         }
       ],
       "(VK_VERSION_1_1,VK_KHR_device_group)": [
@@ -7888,11 +8148,11 @@
         },
         {
           "vuid": "VUID-VkRenderPassBeginInfo-pNext-02852",
-          "text": " If the <code>pNext</code> chain does not contain <a href=\"#VkDeviceGroupRenderPassBeginInfo\">VkDeviceGroupRenderPassBeginInfo</a> or its <code>deviceRenderAreaCount</code> member is equal to 0, <span class=\"eq\"><code>renderArea.offset.x</code> &#43; <code>renderArea.offset.width</code></span> <strong class=\"purple\">must</strong> be less than or equal to <a href=\"#VkFramebufferCreateInfo\">VkFramebufferCreateInfo</a>::<code>width</code> the <code>framebuffer</code> was created with"
+          "text": " If the <code>pNext</code> chain does not contain <a href=\"#VkDeviceGroupRenderPassBeginInfo\">VkDeviceGroupRenderPassBeginInfo</a> or its <code>deviceRenderAreaCount</code> member is equal to 0, <span class=\"eq\"><code>renderArea.offset.x</code> &#43; <code>renderArea.extent.width</code></span> <strong class=\"purple\">must</strong> be less than or equal to <a href=\"#VkFramebufferCreateInfo\">VkFramebufferCreateInfo</a>::<code>width</code> the <code>framebuffer</code> was created with"
         },
         {
           "vuid": "VUID-VkRenderPassBeginInfo-pNext-02853",
-          "text": " If the <code>pNext</code> chain does not contain <a href=\"#VkDeviceGroupRenderPassBeginInfo\">VkDeviceGroupRenderPassBeginInfo</a> or its <code>deviceRenderAreaCount</code> member is equal to 0, <span class=\"eq\"><code>renderArea.offset.y</code> &#43; <code>renderArea.offset.height</code></span> <strong class=\"purple\">must</strong> be less than or equal to <a href=\"#VkFramebufferCreateInfo\">VkFramebufferCreateInfo</a>::<code>height</code> the <code>framebuffer</code> was created with"
+          "text": " If the <code>pNext</code> chain does not contain <a href=\"#VkDeviceGroupRenderPassBeginInfo\">VkDeviceGroupRenderPassBeginInfo</a> or its <code>deviceRenderAreaCount</code> member is equal to 0, <span class=\"eq\"><code>renderArea.offset.y</code> &#43; <code>renderArea.extent.height</code></span> <strong class=\"purple\">must</strong> be less than or equal to <a href=\"#VkFramebufferCreateInfo\">VkFramebufferCreateInfo</a>::<code>height</code> the <code>framebuffer</code> was created with"
         },
         {
           "vuid": "VUID-VkRenderPassBeginInfo-pNext-02854",
@@ -7904,11 +8164,11 @@
         },
         {
           "vuid": "VUID-VkRenderPassBeginInfo-pNext-02856",
-          "text": " If the <code>pNext</code> chain contains <a href=\"#VkDeviceGroupRenderPassBeginInfo\">VkDeviceGroupRenderPassBeginInfo</a>, <span class=\"eq\"><code>offset.x</code> &#43; <code>offset.width</code></span> of each element of <code>pDeviceRenderAreas</code> <strong class=\"purple\">must</strong> be less than or equal to <a href=\"#VkFramebufferCreateInfo\">VkFramebufferCreateInfo</a>::<code>width</code> the <code>framebuffer</code> was created with"
+          "text": " If the <code>pNext</code> chain contains <a href=\"#VkDeviceGroupRenderPassBeginInfo\">VkDeviceGroupRenderPassBeginInfo</a>, <span class=\"eq\"><code>offset.x</code> &#43; <code>extent.width</code></span> of each element of <code>pDeviceRenderAreas</code> <strong class=\"purple\">must</strong> be less than or equal to <a href=\"#VkFramebufferCreateInfo\">VkFramebufferCreateInfo</a>::<code>width</code> the <code>framebuffer</code> was created with"
         },
         {
           "vuid": "VUID-VkRenderPassBeginInfo-pNext-02857",
-          "text": " If the <code>pNext</code> chain contains <a href=\"#VkDeviceGroupRenderPassBeginInfo\">VkDeviceGroupRenderPassBeginInfo</a>, <span class=\"eq\"><code>offset.y</code> &#43; <code>offset.height</code></span> of each element of <code>pDeviceRenderAreas</code> <strong class=\"purple\">must</strong> be less than or equal to <a href=\"#VkFramebufferCreateInfo\">VkFramebufferCreateInfo</a>::<code>height</code> the <code>framebuffer</code> was created with"
+          "text": " If the <code>pNext</code> chain contains <a href=\"#VkDeviceGroupRenderPassBeginInfo\">VkDeviceGroupRenderPassBeginInfo</a>, <span class=\"eq\"><code>offset.y</code> &#43; <code>extent.height</code></span> of each element of <code>pDeviceRenderAreas</code> <strong class=\"purple\">must</strong> be less than or equal to <a href=\"#VkFramebufferCreateInfo\">VkFramebufferCreateInfo</a>::<code>height</code> the <code>framebuffer</code> was created with"
         }
       ],
       "(VK_VERSION_1_2,VK_KHR_imageless_framebuffer)": [
@@ -8856,7 +9116,7 @@
         },
         {
           "vuid": "VUID-VkPipelineShaderStageCreateInfo-module-04145",
-          "text": " The SPIR-V code that was used to create <code>module</code> <strong class=\"purple\">must</strong> be valid as described by the <a href=\"#spirv-spec\">Khronos SPIR-V Specification</a> after applying the specializations provided in <code>pSpecializationInfo</code>, if any, and then converting all specialization constants into fixed constants."
+          "text": " The SPIR-V code that was used to create <code>module</code> <strong class=\"purple\">must</strong> be valid as described by the <a href=\"#spirv-spec\">Khronos SPIR-V Specification</a> after applying the specializations provided in <code>pSpecializationInfo</code>, if any, and then converting all specialization constants into fixed constants"
         },
         {
           "vuid": "VUID-VkPipelineShaderStageCreateInfo-sType-sType",
@@ -8974,7 +9234,7 @@
       "(VK_HUAWEI_subpass_shading)": [
         {
           "vuid": "VUID-VkSubpassShadingPipelineCreateInfoHUAWEI-subpass-04946",
-          "text": " <code>subpass</code> <strong class=\"purple\">must</strong> be created with VK_PIPELINE_BIND_POINT_SUBPASS_SHADING_HUAWEI bind point."
+          "text": " <code>subpass</code> <strong class=\"purple\">must</strong> be created with VK_PIPELINE_BIND_POINT_SUBPASS_SHADING_HUAWEI bind point"
         },
         {
           "vuid": "VUID-VkSubpassShadingPipelineCreateInfoHUAWEI-sType-sType",
@@ -9604,11 +9864,11 @@
       "(VK_NV_fragment_shading_rate_enums)": [
         {
           "vuid": "VUID-VkGraphicsPipelineCreateInfo-pDynamicState-04569",
-          "text": " If the pipeline is being created with <a href=\"#pipeline-graphics-subsets-pre-rasterization\">pre-rasterization shader state</a> or <a href=\"#pipeline-graphics-subsets-fragment-shader\">fragment shader state</a>, and <code>VK_DYNAMIC_STATE_FRAGMENT_SHADING_RATE_KHR</code> is not included in <code>pDynamicState-&gt;pDynamicStates</code>, and the <a href=\"#features-fragmentShadingRateEnums\"><code>fragmentShadingRateEnums</code> feature</a> is not enabled, <a href=\"#VkPipelineFragmentShadingRateEnumStateCreateInfoNV\">VkPipelineFragmentShadingRateEnumStateCreateInfoNV</a>::<code>shadingRateType</code> <strong class=\"purple\">must</strong> be equal to <code>VK_FRAGMENT_SHADING_RATE_TYPE_FRAGMENT_SIZE_NV</code>."
+          "text": " If the pipeline is being created with <a href=\"#pipeline-graphics-subsets-pre-rasterization\">pre-rasterization shader state</a> or <a href=\"#pipeline-graphics-subsets-fragment-shader\">fragment shader state</a>, and <code>VK_DYNAMIC_STATE_FRAGMENT_SHADING_RATE_KHR</code> is not included in <code>pDynamicState-&gt;pDynamicStates</code>, and the <a href=\"#features-fragmentShadingRateEnums\"><code>fragmentShadingRateEnums</code> feature</a> is not enabled, <a href=\"#VkPipelineFragmentShadingRateEnumStateCreateInfoNV\">VkPipelineFragmentShadingRateEnumStateCreateInfoNV</a>::<code>shadingRateType</code> <strong class=\"purple\">must</strong> be equal to <code>VK_FRAGMENT_SHADING_RATE_TYPE_FRAGMENT_SIZE_NV</code>"
         },
         {
           "vuid": "VUID-VkGraphicsPipelineCreateInfo-pDynamicState-04570",
-          "text": " If the pipeline is being created with <a href=\"#pipeline-graphics-subsets-pre-rasterization\">pre-rasterization shader state</a> or <a href=\"#pipeline-graphics-subsets-fragment-shader\">fragment shader state</a>, and <code>VK_DYNAMIC_STATE_FRAGMENT_SHADING_RATE_KHR</code> is not included in <code>pDynamicState-&gt;pDynamicStates</code>, and the <a href=\"#features-pipelineFragmentShadingRate\"><code>pipelineFragmentShadingRate</code> feature</a> is not enabled, <a href=\"#VkPipelineFragmentShadingRateEnumStateCreateInfoNV\">VkPipelineFragmentShadingRateEnumStateCreateInfoNV</a>::<code>shadingRate</code> <strong class=\"purple\">must</strong> be equal to <code>VK_FRAGMENT_SHADING_RATE_1_INVOCATION_PER_PIXEL_NV</code>."
+          "text": " If the pipeline is being created with <a href=\"#pipeline-graphics-subsets-pre-rasterization\">pre-rasterization shader state</a> or <a href=\"#pipeline-graphics-subsets-fragment-shader\">fragment shader state</a>, and <code>VK_DYNAMIC_STATE_FRAGMENT_SHADING_RATE_KHR</code> is not included in <code>pDynamicState-&gt;pDynamicStates</code>, and the <a href=\"#features-pipelineFragmentShadingRate\"><code>pipelineFragmentShadingRate</code> feature</a> is not enabled, <a href=\"#VkPipelineFragmentShadingRateEnumStateCreateInfoNV\">VkPipelineFragmentShadingRateEnumStateCreateInfoNV</a>::<code>shadingRate</code> <strong class=\"purple\">must</strong> be equal to <code>VK_FRAGMENT_SHADING_RATE_1_INVOCATION_PER_PIXEL_NV</code>"
         },
         {
           "vuid": "VUID-VkGraphicsPipelineCreateInfo-pDynamicState-04571",
@@ -9624,11 +9884,11 @@
         },
         {
           "vuid": "VUID-VkGraphicsPipelineCreateInfo-None-04574",
-          "text": " If the pipeline is being created with <a href=\"#pipeline-graphics-subsets-pre-rasterization\">pre-rasterization shader state</a> or <a href=\"#pipeline-graphics-subsets-fragment-shader\">fragment shader state</a>, and the <a href=\"#limits-supersampleFragmentShadingRates\">supersampleFragmentShadingRates feature</a> is not enabled, <a href=\"#VkPipelineFragmentShadingRateEnumStateCreateInfoNV\">VkPipelineFragmentShadingRateEnumStateCreateInfoNV</a>::<code>shadingRate</code> <strong class=\"purple\">must</strong> not be equal to <code>VK_FRAGMENT_SHADING_RATE_2_INVOCATIONS_PER_PIXEL_NV</code>, <code>VK_FRAGMENT_SHADING_RATE_4_INVOCATIONS_PER_PIXEL_NV</code>, <code>VK_FRAGMENT_SHADING_RATE_8_INVOCATIONS_PER_PIXEL_NV</code>, or <code>VK_FRAGMENT_SHADING_RATE_16_INVOCATIONS_PER_PIXEL_NV</code>."
+          "text": " If the pipeline is being created with <a href=\"#pipeline-graphics-subsets-pre-rasterization\">pre-rasterization shader state</a> or <a href=\"#pipeline-graphics-subsets-fragment-shader\">fragment shader state</a>, and the <a href=\"#limits-supersampleFragmentShadingRates\">supersampleFragmentShadingRates feature</a> is not enabled, <a href=\"#VkPipelineFragmentShadingRateEnumStateCreateInfoNV\">VkPipelineFragmentShadingRateEnumStateCreateInfoNV</a>::<code>shadingRate</code> <strong class=\"purple\">must</strong> not be equal to <code>VK_FRAGMENT_SHADING_RATE_2_INVOCATIONS_PER_PIXEL_NV</code>, <code>VK_FRAGMENT_SHADING_RATE_4_INVOCATIONS_PER_PIXEL_NV</code>, <code>VK_FRAGMENT_SHADING_RATE_8_INVOCATIONS_PER_PIXEL_NV</code>, or <code>VK_FRAGMENT_SHADING_RATE_16_INVOCATIONS_PER_PIXEL_NV</code>"
         },
         {
           "vuid": "VUID-VkGraphicsPipelineCreateInfo-None-04575",
-          "text": " If the pipeline is being created with <a href=\"#pipeline-graphics-subsets-pre-rasterization\">pre-rasterization shader state</a> or <a href=\"#pipeline-graphics-subsets-fragment-shader\">fragment shader state</a>, and the <a href=\"#limits-noInvocationFragmentShadingRates\">noInvocationFragmentShadingRates feature</a> is not enabled, <a href=\"#VkPipelineFragmentShadingRateEnumStateCreateInfoNV\">VkPipelineFragmentShadingRateEnumStateCreateInfoNV</a>::<code>shadingRate</code> <strong class=\"purple\">must</strong> not be equal to <code>VK_FRAGMENT_SHADING_RATE_NO_INVOCATIONS_NV</code>."
+          "text": " If the pipeline is being created with <a href=\"#pipeline-graphics-subsets-pre-rasterization\">pre-rasterization shader state</a> or <a href=\"#pipeline-graphics-subsets-fragment-shader\">fragment shader state</a>, and the <a href=\"#limits-noInvocationFragmentShadingRates\">noInvocationFragmentShadingRates feature</a> is not enabled, <a href=\"#VkPipelineFragmentShadingRateEnumStateCreateInfoNV\">VkPipelineFragmentShadingRateEnumStateCreateInfoNV</a>::<code>shadingRate</code> <strong class=\"purple\">must</strong> not be equal to <code>VK_FRAGMENT_SHADING_RATE_NO_INVOCATIONS_NV</code>"
         }
       ],
       "(VK_EXT_vertex_input_dynamic_state)": [
@@ -9943,7 +10203,7 @@
           "text": " The number of resources in <code>layout</code> accessible to each shader stage that is used by the pipeline <strong class=\"purple\">must</strong> be less than or equal to <a href=\"#VkPhysicalDeviceLimits\">VkPhysicalDeviceLimits</a>::<code>maxPerStageResources</code>"
         },
         {
-          "vuid": "VUID-VkRayTracingPipelineCreateInfoNV-stage-03425",
+          "vuid": "VUID-VkRayTracingPipelineCreateInfoNV-stage-06232",
           "text": " The <code>stage</code> member of at least one element of <code>pStages</code> <strong class=\"purple\">must</strong> be <code>VK_SHADER_STAGE_RAYGEN_BIT_KHR</code>"
         },
         {
@@ -10090,7 +10350,7 @@
         },
         {
           "vuid": "VUID-VkRayTracingPipelineCreateInfoKHR-pLibraryInfo-03595",
-          "text": " If the <a href=\"#VK_KHR_pipeline_library\">VK_KHR_pipeline_library</a> extension is not enabled, <code>pLibraryInfo</code> and <code>pLibraryInterface</code> <strong class=\"purple\">must</strong> be <code>NULL</code>."
+          "text": " If the <a href=\"#VK_KHR_pipeline_library\">VK_KHR_pipeline_library</a> extension is not enabled, <code>pLibraryInfo</code> and <code>pLibraryInterface</code> <strong class=\"purple\">must</strong> be <code>NULL</code>"
         },
         {
           "vuid": "VUID-VkRayTracingPipelineCreateInfoKHR-flags-03470",
@@ -10834,13 +11094,13 @@
       "(VK_NV_inherited_viewport_scissor)": [
         {
           "vuid": "VUID-vkCmdBindPipeline-commandBuffer-04808",
-          "text": " If <code>commandBuffer</code> is a secondary command buffer with <a href=\"#VkCommandBufferInheritanceViewportScissorInfoNV\">VkCommandBufferInheritanceViewportScissorInfoNV</a>::<code>viewportScissor2D</code> enabled and <code>pipelineBindPoint</code> is <code>VK_PIPELINE_BIND_POINT_GRAPHICS</code>, then the <code>pipeline</code> <strong class=\"purple\">must</strong> have been created with <code>VK_DYNAMIC_STATE_VIEWPORT_WITH_COUNT_EXT</code> or <code>VK_DYNAMIC_STATE_VIEWPORT</code>, and <code>VK_DYNAMIC_STATE_SCISSOR_WITH_COUNT_EXT</code> or <code>VK_DYNAMIC_STATE_SCISSOR</code> enabled."
+          "text": " If <code>commandBuffer</code> is a secondary command buffer with <a href=\"#VkCommandBufferInheritanceViewportScissorInfoNV\">VkCommandBufferInheritanceViewportScissorInfoNV</a>::<code>viewportScissor2D</code> enabled and <code>pipelineBindPoint</code> is <code>VK_PIPELINE_BIND_POINT_GRAPHICS</code>, then the <code>pipeline</code> <strong class=\"purple\">must</strong> have been created with <code>VK_DYNAMIC_STATE_VIEWPORT_WITH_COUNT_EXT</code> or <code>VK_DYNAMIC_STATE_VIEWPORT</code>, and <code>VK_DYNAMIC_STATE_SCISSOR_WITH_COUNT_EXT</code> or <code>VK_DYNAMIC_STATE_SCISSOR</code> enabled"
         }
       ],
       "(VK_NV_inherited_viewport_scissor,VK_EXT_discard_rectangles)": [
         {
           "vuid": "VUID-vkCmdBindPipeline-commandBuffer-04809",
-          "text": " If <code>commandBuffer</code> is a secondary command buffer with <a href=\"#VkCommandBufferInheritanceViewportScissorInfoNV\">VkCommandBufferInheritanceViewportScissorInfoNV</a>::<code>viewportScissor2D</code> enabled and <code>pipelineBindPoint</code> is <code>VK_PIPELINE_BIND_POINT_GRAPHICS</code> and <code>pipeline</code> was created with <a href=\"#VkPipelineDiscardRectangleStateCreateInfoEXT\">VkPipelineDiscardRectangleStateCreateInfoEXT</a> structure and its <code>discardRectangleCount</code> member is not <code>0</code>, then the pipeline <strong class=\"purple\">must</strong> have been created with <code>VK_DYNAMIC_STATE_DISCARD_RECTANGLE_EXT</code> enabled."
+          "text": " If <code>commandBuffer</code> is a secondary command buffer with <a href=\"#VkCommandBufferInheritanceViewportScissorInfoNV\">VkCommandBufferInheritanceViewportScissorInfoNV</a>::<code>viewportScissor2D</code> enabled and <code>pipelineBindPoint</code> is <code>VK_PIPELINE_BIND_POINT_GRAPHICS</code> and <code>pipeline</code> was created with <a href=\"#VkPipelineDiscardRectangleStateCreateInfoEXT\">VkPipelineDiscardRectangleStateCreateInfoEXT</a> structure and its <code>discardRectangleCount</code> member is not <code>0</code>, then the pipeline <strong class=\"purple\">must</strong> have been created with <code>VK_DYNAMIC_STATE_DISCARD_RECTANGLE_EXT</code> enabled"
         }
       ],
       "(VK_EXT_provoking_vertex)": [
@@ -11224,15 +11484,15 @@
       "core": [
         {
           "vuid": "VUID-vkAllocateMemory-pAllocateInfo-01713",
-          "text": " <code>pAllocateInfo-&gt;allocationSize</code> <strong class=\"purple\">must</strong> be less than or equal to <a href=\"#VkPhysicalDeviceMemoryProperties\">VkPhysicalDeviceMemoryProperties</a>::<code>memoryHeaps</code>[<code>memindex</code>].<code>size</code> where <code>memindex</code> = <a href=\"#VkPhysicalDeviceMemoryProperties\">VkPhysicalDeviceMemoryProperties</a>::<code>memoryTypes</code>[<code>pAllocateInfo-&gt;memoryTypeIndex</code>].<code>heapIndex</code> as returned by <a href=\"#vkGetPhysicalDeviceMemoryProperties\">vkGetPhysicalDeviceMemoryProperties</a> for the <a href=\"#VkPhysicalDevice\">VkPhysicalDevice</a> that <code>device</code> was created from."
+          "text": " <code>pAllocateInfo-&gt;allocationSize</code> <strong class=\"purple\">must</strong> be less than or equal to <a href=\"#VkPhysicalDeviceMemoryProperties\">VkPhysicalDeviceMemoryProperties</a>::<code>memoryHeaps</code>[<code>memindex</code>].<code>size</code> where <code>memindex</code> = <a href=\"#VkPhysicalDeviceMemoryProperties\">VkPhysicalDeviceMemoryProperties</a>::<code>memoryTypes</code>[<code>pAllocateInfo-&gt;memoryTypeIndex</code>].<code>heapIndex</code> as returned by <a href=\"#vkGetPhysicalDeviceMemoryProperties\">vkGetPhysicalDeviceMemoryProperties</a> for the <a href=\"#VkPhysicalDevice\">VkPhysicalDevice</a> that <code>device</code> was created from"
         },
         {
           "vuid": "VUID-vkAllocateMemory-pAllocateInfo-01714",
-          "text": " <code>pAllocateInfo-&gt;memoryTypeIndex</code> <strong class=\"purple\">must</strong> be less than <a href=\"#VkPhysicalDeviceMemoryProperties\">VkPhysicalDeviceMemoryProperties</a>::<code>memoryTypeCount</code> as returned by <a href=\"#vkGetPhysicalDeviceMemoryProperties\">vkGetPhysicalDeviceMemoryProperties</a> for the <a href=\"#VkPhysicalDevice\">VkPhysicalDevice</a> that <code>device</code> was created from."
+          "text": " <code>pAllocateInfo-&gt;memoryTypeIndex</code> <strong class=\"purple\">must</strong> be less than <a href=\"#VkPhysicalDeviceMemoryProperties\">VkPhysicalDeviceMemoryProperties</a>::<code>memoryTypeCount</code> as returned by <a href=\"#vkGetPhysicalDeviceMemoryProperties\">vkGetPhysicalDeviceMemoryProperties</a> for the <a href=\"#VkPhysicalDevice\">VkPhysicalDevice</a> that <code>device</code> was created from"
         },
         {
           "vuid": "VUID-vkAllocateMemory-maxMemoryAllocationCount-04101",
-          "text": " There <strong class=\"purple\">must</strong> be less than <code>VkPhysicalDeviceLimits</code>::<code>maxMemoryAllocationCount</code> device memory allocations currently allocated on the device."
+          "text": " There <strong class=\"purple\">must</strong> be less than <code>VkPhysicalDeviceLimits</code>::<code>maxMemoryAllocationCount</code> device memory allocations currently allocated on the device"
         },
         {
           "vuid": "VUID-vkAllocateMemory-device-parameter",
@@ -11254,7 +11514,7 @@
       "(VK_AMD_device_coherent_memory)": [
         {
           "vuid": "VUID-vkAllocateMemory-deviceCoherentMemory-02790",
-          "text": " If the <a href=\"#features-deviceCoherentMemory\"><code>deviceCoherentMemory</code></a> feature is not enabled, <code>pAllocateInfo-&gt;memoryTypeIndex</code> <strong class=\"purple\">must</strong> not identify a memory type supporting <code>VK_MEMORY_PROPERTY_DEVICE_COHERENT_BIT_AMD</code>."
+          "text": " If the <a href=\"#features-deviceCoherentMemory\"><code>deviceCoherentMemory</code></a> feature is not enabled, <code>pAllocateInfo-&gt;memoryTypeIndex</code> <strong class=\"purple\">must</strong> not identify a memory type supporting <code>VK_MEMORY_PROPERTY_DEVICE_COHERENT_BIT_AMD</code>"
         }
       ]
     },
@@ -11268,7 +11528,7 @@
       "(VK_KHR_external_memory)+(VK_KHR_dedicated_allocation,VK_NV_dedicated_allocation)": [
         {
           "vuid": "VUID-VkMemoryAllocateInfo-pNext-00639",
-          "text": "     If the <code>pNext</code> chain includes a <code>VkExportMemoryAllocateInfo</code>     structure, and any of the handle types specified in     <code>VkExportMemoryAllocateInfo</code>::<code>handleTypes</code> require a dedicated     allocation, as reported by     <a href=\"#vkGetPhysicalDeviceImageFormatProperties2\">vkGetPhysicalDeviceImageFormatProperties2</a> in     <code>VkExternalImageFormatProperties</code>::<code>externalMemoryProperties.externalMemoryFeatures</code>     or     <code>VkExternalBufferProperties</code>::<code>externalMemoryProperties.externalMemoryFeatures</code>,     the <code>pNext</code> chain <strong class=\"purple\">must</strong> include a ifdef::VK_KHR_dedicated_allocation[<a href=\"#VkMemoryDedicatedAllocateInfo\">VkMemoryDedicatedAllocateInfo</a>]"
+          "text": " If the <code>pNext</code> chain includes a <code>VkExportMemoryAllocateInfo</code> structure, and any of the handle types specified in <code>VkExportMemoryAllocateInfo</code>::<code>handleTypes</code> require a dedicated allocation, as reported by <a href=\"#vkGetPhysicalDeviceImageFormatProperties2\">vkGetPhysicalDeviceImageFormatProperties2</a> in <code>VkExternalImageFormatProperties</code>::<code>externalMemoryProperties.externalMemoryFeatures</code> or <code>VkExternalBufferProperties</code>::<code>externalMemoryProperties.externalMemoryFeatures</code>, the <code>pNext</code> chain <strong class=\"purple\">must</strong> include a <a href=\"#VkMemoryDedicatedAllocateInfo\">VkMemoryDedicatedAllocateInfo</a> or <a href=\"#VkDedicatedAllocationMemoryAllocateInfoNV\">VkDedicatedAllocationMemoryAllocateInfoNV</a> structure with either its <code>image</code> or <code>buffer</code> member set to a value other than <a href=\"#VK_NULL_HANDLE\">VK_NULL_HANDLE</a>"
         }
       ],
       "(VK_KHR_external_memory)+(VK_NV_external_memory)": [
@@ -11286,7 +11546,7 @@
       "(VK_KHR_external_memory_fd)": [
         {
           "vuid": "VUID-VkMemoryAllocateInfo-allocationSize-01742",
-          "text": " If the parameters define an import operation, the external handle specified was created by the Vulkan API, and the external handle type is <code>VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_FD_BIT_KHR</code>, then the values of <code>allocationSize</code> and <code>memoryTypeIndex</code> <strong class=\"purple\">must</strong> match those specified when the payload being imported was created."
+          "text": " If the parameters define an import operation, the external handle specified was created by the Vulkan API, and the external handle type is <code>VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_FD_BIT_KHR</code>, then the values of <code>allocationSize</code> and <code>memoryTypeIndex</code> <strong class=\"purple\">must</strong> match those specified when the payload being imported was created"
         },
         {
           "vuid": "VUID-VkMemoryAllocateInfo-memoryTypeIndex-00648",
@@ -11296,11 +11556,11 @@
       "(VK_KHR_external_memory+VK_KHR_device_group)": [
         {
           "vuid": "VUID-VkMemoryAllocateInfo-None-00643",
-          "text": " If the parameters define an import operation and the external handle specified was created by the Vulkan API, the device mask specified by <a href=\"#VkMemoryAllocateFlagsInfo\">VkMemoryAllocateFlagsInfo</a> <strong class=\"purple\">must</strong> match that specified when the payload being imported was allocated."
+          "text": " If the parameters define an import operation and the external handle specified was created by the Vulkan API, the device mask specified by <a href=\"#VkMemoryAllocateFlagsInfo\">VkMemoryAllocateFlagsInfo</a> <strong class=\"purple\">must</strong> match that specified when the payload being imported was allocated"
         },
         {
           "vuid": "VUID-VkMemoryAllocateInfo-None-00644",
-          "text": " If the parameters define an import operation and the external handle specified was created by the Vulkan API, the list of physical devices that comprise the logical device passed to <a href=\"#vkAllocateMemory\">vkAllocateMemory</a> <strong class=\"purple\">must</strong> match the list of physical devices that comprise the logical device on which the payload was originally allocated."
+          "text": " If the parameters define an import operation and the external handle specified was created by the Vulkan API, the list of physical devices that comprise the logical device passed to <a href=\"#vkAllocateMemory\">vkAllocateMemory</a> <strong class=\"purple\">must</strong> match the list of physical devices that comprise the logical device on which the payload was originally allocated"
         }
       ],
       "(VK_KHR_external_memory_win32)": [
@@ -11310,11 +11570,11 @@
         },
         {
           "vuid": "VUID-VkMemoryAllocateInfo-allocationSize-01743",
-          "text": " If the parameters define an import operation, the external handle was created by the Vulkan API, and the external handle type is <code>VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_WIN32_BIT_KHR</code> or <code>VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_WIN32_KMT_BIT_KHR</code>, then the values of <code>allocationSize</code> and <code>memoryTypeIndex</code> <strong class=\"purple\">must</strong> match those specified when the payload being imported was created."
+          "text": " If the parameters define an import operation, the external handle was created by the Vulkan API, and the external handle type is <code>VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_WIN32_BIT_KHR</code> or <code>VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_WIN32_KMT_BIT_KHR</code>, then the values of <code>allocationSize</code> and <code>memoryTypeIndex</code> <strong class=\"purple\">must</strong> match those specified when the payload being imported was created"
         },
         {
           "vuid": "VUID-VkMemoryAllocateInfo-allocationSize-00647",
-          "text": " If the parameters define an import operation and the external handle type is <code>VK_EXTERNAL_MEMORY_HANDLE_TYPE_D3D12_HEAP_BIT</code>, <code>allocationSize</code> <strong class=\"purple\">must</strong> match the size specified when creating the Direct3D 12 heap from which the payload was extracted."
+          "text": " If the parameters define an import operation and the external handle type is <code>VK_EXTERNAL_MEMORY_HANDLE_TYPE_D3D12_HEAP_BIT</code>, <code>allocationSize</code> <strong class=\"purple\">must</strong> match the size specified when creating the Direct3D 12 heap from which the payload was extracted"
         }
       ],
       "(VK_VERSION_1_1)": [
@@ -11414,11 +11674,11 @@
       "(VK_FUCHSIA_external_memory)": [
         {
           "vuid": "VUID-VkMemoryAllocateInfo-None-04749",
-          "text": " If the parameters define an import operation and the external handle type is <code>VK_EXTERNAL_MEMORY_HANDLE_TYPE_ZIRCON_VMO_BIT_FUCHSIA</code>, the value of <code>memoryTypeIndex</code> <strong class=\"purple\">must</strong> be an index identifying a memory type from the <code>memoryTypeBits</code> field of the <a href=\"#VkMemoryZirconHandlePropertiesFUCHSIA\">VkMemoryZirconHandlePropertiesFUCHSIA</a> structure populated by a call to <a href=\"#vkGetMemoryZirconHandlePropertiesFUCHSIA\">vkGetMemoryZirconHandlePropertiesFUCHSIA</a>."
+          "text": " If the parameters define an import operation and the external handle type is <code>VK_EXTERNAL_MEMORY_HANDLE_TYPE_ZIRCON_VMO_BIT_FUCHSIA</code>, the value of <code>memoryTypeIndex</code> <strong class=\"purple\">must</strong> be an index identifying a memory type from the <code>memoryTypeBits</code> field of the <a href=\"#VkMemoryZirconHandlePropertiesFUCHSIA\">VkMemoryZirconHandlePropertiesFUCHSIA</a> structure populated by a call to <a href=\"#vkGetMemoryZirconHandlePropertiesFUCHSIA\">vkGetMemoryZirconHandlePropertiesFUCHSIA</a>"
         },
         {
           "vuid": "VUID-VkMemoryAllocateInfo-allocationSize-04750",
-          "text": " If the parameters define an import operation and the external handle type is <code>VK_EXTERNAL_MEMORY_HANDLE_TYPE_ZIRCON_VMO_BIT_FUCHSIA</code>, the value of <code>allocationSize</code> <strong class=\"purple\">must</strong> be greater than <code>0</code> and <strong class=\"purple\">must</strong> be less than or equal to the size of the VMO as determined by <code>zx_vmo_get_size</code>(<code>handle</code>) where <code>handle</code> is the VMO handle to the imported external memory."
+          "text": " If the parameters define an import operation and the external handle type is <code>VK_EXTERNAL_MEMORY_HANDLE_TYPE_ZIRCON_VMO_BIT_FUCHSIA</code>, the value of <code>allocationSize</code> <strong class=\"purple\">must</strong> be greater than <code>0</code> and <strong class=\"purple\">must</strong> be less than or equal to the size of the VMO as determined by <code>zx_vmo_get_size</code>(<code>handle</code>) where <code>handle</code> is the VMO handle to the imported external memory"
         }
       ],
       "core": [
@@ -11838,7 +12098,7 @@
         },
         {
           "vuid": "VUID-VkImportMemoryFdInfoKHR-handleType-00669",
-          "text": " If <code>handleType</code> is not <code>0</code>, it <strong class=\"purple\">must</strong> be <code>VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_FD_BIT</code>"
+          "text": " If <code>handleType</code> is not <code>0</code>, it <strong class=\"purple\">must</strong> be <code>VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_FD_BIT</code> or <code>VK_EXTERNAL_MEMORY_HANDLE_TYPE_DMA_BUF_BIT_EXT</code>"
         },
         {
           "vuid": "VUID-VkImportMemoryFdInfoKHR-handleType-00670",
@@ -11886,7 +12146,7 @@
         },
         {
           "vuid": "VUID-VkMemoryGetFdInfoKHR-handleType-00672",
-          "text": " <code>handleType</code> <strong class=\"purple\">must</strong> be <code>VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_FD_BIT</code>"
+          "text": " <code>handleType</code> <strong class=\"purple\">must</strong> be <code>VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_FD_BIT</code> or <code>VK_EXTERNAL_MEMORY_HANDLE_TYPE_DMA_BUF_BIT_EXT</code>"
         },
         {
           "vuid": "VUID-VkMemoryGetFdInfoKHR-sType-sType",
@@ -12129,8 +12389,8 @@
           "text": " <code>device</code> <strong class=\"purple\">must</strong> be a valid <a href=\"#VkDevice\">VkDevice</a> handle"
         },
         {
-          "vuid": "VUID-vkGetMemoryRemoteAddressNV-getMemoryRemoteAddressInfo-parameter",
-          "text": " <code>getMemoryRemoteAddressInfo</code> <strong class=\"purple\">must</strong> be a valid pointer to a valid <a href=\"#VkMemoryGetRemoteAddressInfoNV\">VkMemoryGetRemoteAddressInfoNV</a> structure"
+          "vuid": "VUID-vkGetMemoryRemoteAddressNV-pMemoryGetRemoteAddressInfo-parameter",
+          "text": " <code>pMemoryGetRemoteAddressInfo</code> <strong class=\"purple\">must</strong> be a valid pointer to a valid <a href=\"#VkMemoryGetRemoteAddressInfoNV\">VkMemoryGetRemoteAddressInfoNV</a> structure"
         },
         {
           "vuid": "VUID-vkGetMemoryRemoteAddressNV-pAddress-parameter",
@@ -12166,11 +12426,11 @@
       "(VK_FUCHSIA_external_memory)": [
         {
           "vuid": "VUID-VkImportMemoryZirconHandleInfoFUCHSIA-handleType-04771",
-          "text": " <code>handleType</code> <strong class=\"purple\">must</strong> be <code>VK_EXTERNAL_MEMORY_HANDLE_TYPE_ZIRCON_VMO_BIT_FUCHSIA</code>."
+          "text": " <code>handleType</code> <strong class=\"purple\">must</strong> be <code>VK_EXTERNAL_MEMORY_HANDLE_TYPE_ZIRCON_VMO_BIT_FUCHSIA</code>"
         },
         {
           "vuid": "VUID-VkImportMemoryZirconHandleInfoFUCHSIA-handle-04772",
-          "text": " <code>handle</code> must be a valid VMO handle."
+          "text": " <code>handle</code> must be a valid VMO handle"
         },
         {
           "vuid": "VUID-VkImportMemoryZirconHandleInfoFUCHSIA-sType-sType",
@@ -12186,11 +12446,11 @@
       "(VK_FUCHSIA_external_memory)": [
         {
           "vuid": "VUID-vkGetMemoryZirconHandlePropertiesFUCHSIA-handleType-04773",
-          "text": " <code>handleType</code> <strong class=\"purple\">must</strong> be <code>VK_EXTERNAL_MEMORY_HANDLE_TYPE_ZIRCON_VMO_BIT_FUCHSIA</code>."
+          "text": " <code>handleType</code> <strong class=\"purple\">must</strong> be <code>VK_EXTERNAL_MEMORY_HANDLE_TYPE_ZIRCON_VMO_BIT_FUCHSIA</code>"
         },
         {
           "vuid": "VUID-vkGetMemoryZirconHandlePropertiesFUCHSIA-zirconHandle-04774",
-          "text": " <code>zirconHandle</code> must reference a valid VMO."
+          "text": " <code>zirconHandle</code> must reference a valid VMO"
         },
         {
           "vuid": "VUID-vkGetMemoryZirconHandlePropertiesFUCHSIA-device-parameter",
@@ -12238,11 +12498,11 @@
       "(VK_FUCHSIA_external_memory)": [
         {
           "vuid": "VUID-VkMemoryGetZirconHandleInfoFUCHSIA-handleType-04775",
-          "text": " <code>handleType</code> <strong class=\"purple\">must</strong> be <code>VK_EXTERNAL_MEMORY_HANDLE_TYPE_ZIRCON_VMO_BIT_FUCHSIA</code>."
+          "text": " <code>handleType</code> <strong class=\"purple\">must</strong> be <code>VK_EXTERNAL_MEMORY_HANDLE_TYPE_ZIRCON_VMO_BIT_FUCHSIA</code>"
         },
         {
           "vuid": "VUID-VkMemoryGetZirconHandleInfoFUCHSIA-handleType-04776",
-          "text": " <code>handleType</code> <strong class=\"purple\">must</strong> have been included in the <code>handleTypes</code> field of the <code>VkExportMemoryAllocateInfo</code> structure when the external memory was allocated."
+          "text": " <code>handleType</code> <strong class=\"purple\">must</strong> have been included in the <code>handleTypes</code> field of the <code>VkExportMemoryAllocateInfo</code> structure when the external memory was allocated"
         },
         {
           "vuid": "VUID-VkMemoryGetZirconHandleInfoFUCHSIA-sType-sType",
@@ -12686,13 +12946,13 @@
       "(VK_KHR_video_decode_queue)": [
         {
           "vuid": "VUID-VkBufferCreateInfo-usage-04813",
-          "text": " If <code>usage</code> includes <code>VK_BUFFER_USAGE_VIDEO_DECODE_SRC_BIT_KHR</code>, <code>VK_BUFFER_USAGE_VIDEO_DECODE_DST_BIT_KHR</code>, then the <code>pNext</code> chain <strong class=\"purple\">must</strong> include a valid <a href=\"#VkVideoProfilesKHR\">VkVideoProfilesKHR</a> structure which includes at least one <a href=\"#VkVideoProfileKHR\">VkVideoProfileKHR</a> with a decode codec-operation."
+          "text": " If <code>usage</code> includes <code>VK_BUFFER_USAGE_VIDEO_DECODE_SRC_BIT_KHR</code>, <code>VK_BUFFER_USAGE_VIDEO_DECODE_DST_BIT_KHR</code>, then the <code>pNext</code> chain <strong class=\"purple\">must</strong> include a valid <a href=\"#VkVideoProfilesKHR\">VkVideoProfilesKHR</a> structure which includes at least one <a href=\"#VkVideoProfileKHR\">VkVideoProfileKHR</a> with a decode codec-operation"
         }
       ],
       "(VK_KHR_video_encode_queue)": [
         {
           "vuid": "VUID-VkBufferCreateInfo-usage-04814",
-          "text": " If <code>usage</code> includes <code>VK_BUFFER_USAGE_VIDEO_ENCODE_SRC_BIT_KHR</code>, <code>VK_BUFFER_USAGE_VIDEO_ENCODE_DST_BIT_KHR</code>, then the <code>pNext</code> chain <strong class=\"purple\">must</strong> include a valid <a href=\"#VkVideoProfilesKHR\">VkVideoProfilesKHR</a> structure which includes at least one <a href=\"#VkVideoProfileKHR\">VkVideoProfileKHR</a> with a encode codec-operation."
+          "text": " If <code>usage</code> includes <code>VK_BUFFER_USAGE_VIDEO_ENCODE_SRC_BIT_KHR</code>, <code>VK_BUFFER_USAGE_VIDEO_ENCODE_DST_BIT_KHR</code>, then the <code>pNext</code> chain <strong class=\"purple\">must</strong> include a valid <a href=\"#VkVideoProfilesKHR\">VkVideoProfilesKHR</a> structure which includes at least one <a href=\"#VkVideoProfileKHR\">VkVideoProfileKHR</a> with a encode codec-operation"
         }
       ]
     },
@@ -13270,7 +13530,7 @@
       "(VK_VERSION_1_1,VK_KHR_external_memory,VK_NV_external_memory)": [
         {
           "vuid": "VUID-VkImageCreateInfo-pNext-01443",
-          "text": "     If the <code>pNext</code> chain includes a ifdef::VK_VERSION_1_1,VK_KHR_external_memory[<a href=\"#VkExternalMemoryImageCreateInfo\">VkExternalMemoryImageCreateInfo</a>]"
+          "text": " If the <code>pNext</code> chain includes a <a href=\"#VkExternalMemoryImageCreateInfo\">VkExternalMemoryImageCreateInfo</a> or <a href=\"#VkExternalMemoryImageCreateInfoNV\">VkExternalMemoryImageCreateInfoNV</a> structure whose <code>handleTypes</code> member is not <code>0</code>, <code>initialLayout</code> <strong class=\"purple\">must</strong> be <code>VK_IMAGE_LAYOUT_UNDEFINED</code>"
         }
       ],
       "(VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion)": [
@@ -13399,14 +13659,20 @@
           "text": " If <code>usage</code> includes <code>VK_IMAGE_USAGE_SHADING_RATE_IMAGE_BIT_NV</code>, <code>tiling</code> <strong class=\"purple\">must</strong> be <code>VK_IMAGE_TILING_OPTIMAL</code>"
         }
       ],
+      "(VK_HUAWEI_invocation_mask)": [
+        {
+          "vuid": "VUID-VkImageCreateInfo-usage-04992",
+          "text": " If <code>usage</code> includes <code>VK_IMAGE_USAGE_INVOCATION_MASK_BIT_HUAWEI</code>, <code>tiling</code> <strong class=\"purple\">must</strong> be <code>VK_IMAGE_TILING_LINEAR</code>"
+        }
+      ],
       "(VK_KHR_portability_subset)": [
         {
           "vuid": "VUID-VkImageCreateInfo-imageView2DOn3DImage-04459",
-          "text": " If the <code><a href=\"#VK_KHR_portability_subset\">[VK_KHR_portability_subset]</a></code> extension is enabled, and <a href=\"#VkPhysicalDevicePortabilitySubsetFeaturesKHR\">VkPhysicalDevicePortabilitySubsetFeaturesKHR</a>::<code>imageView2DOn3DImage</code> is <code>VK_FALSE</code>, <code>flags</code> <strong class=\"purple\">must</strong> not contain <code>VK_IMAGE_CREATE_2D_ARRAY_COMPATIBLE_BIT</code>."
+          "text": " If the <code><a href=\"#VK_KHR_portability_subset\">[VK_KHR_portability_subset]</a></code> extension is enabled, and <a href=\"#VkPhysicalDevicePortabilitySubsetFeaturesKHR\">VkPhysicalDevicePortabilitySubsetFeaturesKHR</a>::<code>imageView2DOn3DImage</code> is <code>VK_FALSE</code>, <code>flags</code> <strong class=\"purple\">must</strong> not contain <code>VK_IMAGE_CREATE_2D_ARRAY_COMPATIBLE_BIT</code>"
         },
         {
           "vuid": "VUID-VkImageCreateInfo-multisampleArrayImage-04460",
-          "text": " If the <code><a href=\"#VK_KHR_portability_subset\">[VK_KHR_portability_subset]</a></code> extension is enabled, and <a href=\"#VkPhysicalDevicePortabilitySubsetFeaturesKHR\">VkPhysicalDevicePortabilitySubsetFeaturesKHR</a>::<code>multisampleArrayImage</code> is <code>VK_FALSE</code>, and <code>samples</code> is not <code>VK_SAMPLE_COUNT_1_BIT</code>, then <code>arrayLayers</code> <strong class=\"purple\">must</strong> be <code>1</code>."
+          "text": " If the <code><a href=\"#VK_KHR_portability_subset\">[VK_KHR_portability_subset]</a></code> extension is enabled, and <a href=\"#VkPhysicalDevicePortabilitySubsetFeaturesKHR\">VkPhysicalDevicePortabilitySubsetFeaturesKHR</a>::<code>multisampleArrayImage</code> is <code>VK_FALSE</code>, and <code>samples</code> is not <code>VK_SAMPLE_COUNT_1_BIT</code>, then <code>arrayLayers</code> <strong class=\"purple\">must</strong> be <code>1</code>"
         }
       ],
       "(VK_VERSION_1_2,VK_KHR_image_format_list)": [
@@ -13422,13 +13688,13 @@
       "(VK_KHR_video_decode_queue)": [
         {
           "vuid": "VUID-VkImageCreateInfo-usage-04815",
-          "text": " If <code>usage</code> includes <code>VK_IMAGE_USAGE_VIDEO_DECODE_DST_BIT_KHR</code>, <code>VK_IMAGE_USAGE_VIDEO_DECODE_SRC_BIT_KHR</code>, <code>VK_IMAGE_USAGE_VIDEO_DECODE_DPB_BIT_KHR</code>, then the <code>pNext</code> chain <strong class=\"purple\">must</strong> include a valid <a href=\"#VkVideoProfilesKHR\">VkVideoProfilesKHR</a> structure which includes at least one <a href=\"#VkVideoProfileKHR\">VkVideoProfileKHR</a> with a decode codec-operation."
+          "text": " If <code>usage</code> includes <code>VK_IMAGE_USAGE_VIDEO_DECODE_DST_BIT_KHR</code>, <code>VK_IMAGE_USAGE_VIDEO_DECODE_SRC_BIT_KHR</code>, <code>VK_IMAGE_USAGE_VIDEO_DECODE_DPB_BIT_KHR</code>, then the <code>pNext</code> chain <strong class=\"purple\">must</strong> include a valid <a href=\"#VkVideoProfilesKHR\">VkVideoProfilesKHR</a> structure which includes at least one <a href=\"#VkVideoProfileKHR\">VkVideoProfileKHR</a> with a decode codec-operation"
         }
       ],
       "(VK_KHR_video_encode_queue)": [
         {
           "vuid": "VUID-VkImageCreateInfo-usage-04816",
-          "text": " If <code>usage</code> includes <code>VK_IMAGE_USAGE_VIDEO_ENCODE_DST_BIT_KHR</code>, <code>VK_IMAGE_USAGE_VIDEO_ENCODE_SRC_BIT_KHR</code>, <code>VK_IMAGE_USAGE_VIDEO_ENCODE_DPB_BIT_KHR</code>, then the <code>pNext</code> chain <strong class=\"purple\">must</strong> include a valid <a href=\"#VkVideoProfilesKHR\">VkVideoProfilesKHR</a> structure which includes at least one <a href=\"#VkVideoProfileKHR\">VkVideoProfileKHR</a> with a encode codec-operation."
+          "text": " If <code>usage</code> includes <code>VK_IMAGE_USAGE_VIDEO_ENCODE_DST_BIT_KHR</code>, <code>VK_IMAGE_USAGE_VIDEO_ENCODE_SRC_BIT_KHR</code>, <code>VK_IMAGE_USAGE_VIDEO_ENCODE_DPB_BIT_KHR</code>, then the <code>pNext</code> chain <strong class=\"purple\">must</strong> include a valid <a href=\"#VkVideoProfilesKHR\">VkVideoProfilesKHR</a> structure which includes at least one <a href=\"#VkVideoProfileKHR\">VkVideoProfileKHR</a> with a encode codec-operation"
         }
       ]
     },
@@ -13771,10 +14037,6 @@
     "VkImageViewCreateInfo": {
       "core": [
         {
-          "vuid": "VUID-VkImageViewCreateInfo-imageViewType-04969",
-          "text": " <code>imageViewType</code> <strong class=\"purple\">must</strong> be compatible with the type of <code>image</code> as shown in the <a href=\"#resources-image-views-compatibility\">view type compatibility table</a>"
-        },
-        {
           "vuid": "VUID-VkImageViewCreateInfo-image-01003",
           "text": " If <code>image</code> was not created with <code>VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT</code> then <code>viewType</code> <strong class=\"purple\">must</strong> not be <code>VK_IMAGE_VIEW_TYPE_CUBE</code> or <code>VK_IMAGE_VIEW_TYPE_CUBE_ARRAY</code>"
         },
@@ -13824,15 +14086,15 @@
         },
         {
           "vuid": "VUID-VkImageViewCreateInfo-subResourceRange-01021",
-          "text": " <code>subresourceRange</code> and <code>viewType</code> <strong class=\"purple\">must</strong> be compatible with the image, as described in the <a href=\"#resources-image-views-compatibility\">compatibility table</a>"
+          "text": " <code>viewType</code> <strong class=\"purple\">must</strong> be compatible with the type of <code>image</code> as shown in the <a href=\"#resources-image-views-compatibility\">view type compatibility table</a>"
         },
         {
           "vuid": "VUID-VkImageViewCreateInfo-imageViewType-04973",
-          "text": " If <code>imageViewType</code> is <code>VK_IMAGE_VIEW_TYPE_1D</code>, <code>VK_IMAGE_VIEW_TYPE_2D</code>, or <code>VK_IMAGE_VIEW_TYPE_3D</code>; and <code>subresourceRange.layerCount</code> is not <code>VK_REMAINING_ARRAY_LAYERS</code>, then <code>subresourceRange.layerCount</code> <strong class=\"purple\">must</strong> be 1"
+          "text": " If <code>viewType</code> is <code>VK_IMAGE_VIEW_TYPE_1D</code>, <code>VK_IMAGE_VIEW_TYPE_2D</code>, or <code>VK_IMAGE_VIEW_TYPE_3D</code>; and <code>subresourceRange.layerCount</code> is not <code>VK_REMAINING_ARRAY_LAYERS</code>, then <code>subresourceRange.layerCount</code> <strong class=\"purple\">must</strong> be 1"
         },
         {
           "vuid": "VUID-VkImageViewCreateInfo-imageViewType-04974",
-          "text": " If <code>imageViewType</code> is <code>VK_IMAGE_VIEW_TYPE_1D</code>, <code>VK_IMAGE_VIEW_TYPE_2D</code>, or <code>VK_IMAGE_VIEW_TYPE_3D</code>; and <code>subresourceRange.layerCount</code> is <code>VK_REMAINING_ARRAY_LAYERS</code>, then the remaining number of layers <strong class=\"purple\">must</strong> be 1"
+          "text": " If <code>viewType</code> is <code>VK_IMAGE_VIEW_TYPE_1D</code>, <code>VK_IMAGE_VIEW_TYPE_2D</code>, or <code>VK_IMAGE_VIEW_TYPE_3D</code>; and <code>subresourceRange.layerCount</code> is <code>VK_REMAINING_ARRAY_LAYERS</code>, then the remaining number of layers <strong class=\"purple\">must</strong> be 1"
         },
         {
           "vuid": "VUID-VkImageViewCreateInfo-viewType-02960",
@@ -13894,15 +14156,15 @@
         },
         {
           "vuid": "VUID-VkImageViewCreateInfo-image-04970",
-          "text": " If <code>image</code> was created with <code>VK_IMAGE_TYPE_3D</code> and <code>imageViewType</code> is <code>VK_IMAGE_VIEW_TYPE_2D</code> or <code>VK_IMAGE_VIEW_TYPE_2D_ARRAY</code> then <code>subresourceRange.levelCount</code> <strong class=\"purple\">must</strong> be 1"
+          "text": " If <code>image</code> was created with <code>VK_IMAGE_TYPE_3D</code> and <code>viewType</code> is <code>VK_IMAGE_VIEW_TYPE_2D</code> or <code>VK_IMAGE_VIEW_TYPE_2D_ARRAY</code> then <code>subresourceRange.levelCount</code> <strong class=\"purple\">must</strong> be 1"
         },
         {
           "vuid": "VUID-VkImageViewCreateInfo-image-04971",
-          "text": " If <code>image</code> was created with <code>VK_IMAGE_TYPE_3D</code> and <code>imageViewType</code> is <code>VK_IMAGE_VIEW_TYPE_2D</code> or <code>VK_IMAGE_VIEW_TYPE_2D_ARRAY</code> then <code>flags</code> <strong class=\"purple\">must</strong> not contain any of <code>VK_IMAGE_CREATE_SPARSE_BINDING_BIT</code>, <code>VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT</code>, and <code>VK_IMAGE_CREATE_SPARSE_ALIASED_BIT</code>"
+          "text": " If <code>image</code> was created with <code>VK_IMAGE_TYPE_3D</code> and <code>viewType</code> is <code>VK_IMAGE_VIEW_TYPE_2D</code> or <code>VK_IMAGE_VIEW_TYPE_2D_ARRAY</code> then <code>flags</code> <strong class=\"purple\">must</strong> not contain any of <code>VK_IMAGE_CREATE_SPARSE_BINDING_BIT</code>, <code>VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT</code>, and <code>VK_IMAGE_CREATE_SPARSE_ALIASED_BIT</code>"
         },
         {
           "vuid": "VUID-VkImageViewCreateInfo-image-04972",
-          "text": " If <code>image</code> was created with a <code>samples</code> value not equal to <code>VK_SAMPLE_COUNT_1_BIT</code> then <code>imageViewType</code> <strong class=\"purple\">must</strong> be either <code>VK_IMAGE_VIEW_TYPE_2D</code> or <code>VK_IMAGE_VIEW_TYPE_2D_ARRAY</code>"
+          "text": " If <code>image</code> was created with a <code>samples</code> value not equal to <code>VK_SAMPLE_COUNT_1_BIT</code> then <code>viewType</code> <strong class=\"purple\">must</strong> be either <code>VK_IMAGE_VIEW_TYPE_2D</code> or <code>VK_IMAGE_VIEW_TYPE_2D_ARRAY</code>"
         },
         {
           "vuid": "VUID-VkImageViewCreateInfo-image-01482",
@@ -14071,6 +14333,12 @@
           "text": " If <code>image</code> was created with <code>flags</code> containing <code>VK_IMAGE_CREATE_SUBSAMPLED_BIT_EXT</code> and <code>usage</code> containing <code>VK_IMAGE_USAGE_SAMPLED_BIT</code>, <code>subresourceRange.layerCount</code> <strong class=\"purple\">must</strong> be less than or equal to <a href=\"#limits-maxSubsampledArrayLayers\"><code>VkPhysicalDeviceFragmentDensityMap2PropertiesEXT</code>::<code>maxSubsampledArrayLayers</code></a>"
         }
       ],
+      "(VK_EXT_fragment_density_map)+(VK_HUAWEI_invocation_mask)": [
+        {
+          "vuid": "VUID-VkImageViewCreateInfo-invocationMask-04993",
+          "text": " If the <a href=\"#features-invocationMask\"><code>invocationMask</code> feature</a> is enabled, and if <code>image</code> was created with <code>usage</code> containing <code>VK_IMAGE_USAGE_INVOCATION_MASK_BIT_HUAWEI</code>, <code>format</code> <strong class=\"purple\">must</strong> be <code>VK_FORMAT_R8_UINT</code>"
+        }
+      ],
       "(VK_VERSION_1_1,VK_KHR_maintenance2)+!(VK_VERSION_1_2+VK_EXT_separate_stencil_usage)": [
         {
           "vuid": "VUID-VkImageViewCreateInfo-pNext-02661",
@@ -14084,21 +14352,21 @@
         },
         {
           "vuid": "VUID-VkImageViewCreateInfo-pNext-02663",
-          "text": " If the <code>pNext</code> chain includes a <a href=\"#VkImageViewUsageCreateInfo\">VkImageViewUsageCreateInfo</a> structure, <code>image</code> was created with a <a href=\"#VkImageStencilUsageCreateInfo\">VkImageStencilUsageCreateInfo</a> structure included in the <code>pNext</code> chain of <a href=\"#VkImageCreateInfo\">VkImageCreateInfo</a>, and <code>subResourceRange.aspectMask</code> includes <code>VK_IMAGE_ASPECT_STENCIL_BIT</code>, the <code>usage</code> member of the <a href=\"#VkImageViewUsageCreateInfo\">VkImageViewUsageCreateInfo</a> instance <strong class=\"purple\">must</strong> not include any bits that were not set in the <code>usage</code> member of the <a href=\"#VkImageStencilUsageCreateInfo\">VkImageStencilUsageCreateInfo</a> structure used to create <code>image</code>"
+          "text": " If the <code>pNext</code> chain includes a <a href=\"#VkImageViewUsageCreateInfo\">VkImageViewUsageCreateInfo</a> structure, <code>image</code> was created with a <a href=\"#VkImageStencilUsageCreateInfo\">VkImageStencilUsageCreateInfo</a> structure included in the <code>pNext</code> chain of <a href=\"#VkImageCreateInfo\">VkImageCreateInfo</a>, and <code>subresourceRange.aspectMask</code> includes <code>VK_IMAGE_ASPECT_STENCIL_BIT</code>, the <code>usage</code> member of the <a href=\"#VkImageViewUsageCreateInfo\">VkImageViewUsageCreateInfo</a> instance <strong class=\"purple\">must</strong> not include any bits that were not set in the <code>usage</code> member of the <a href=\"#VkImageStencilUsageCreateInfo\">VkImageStencilUsageCreateInfo</a> structure used to create <code>image</code>"
         },
         {
           "vuid": "VUID-VkImageViewCreateInfo-pNext-02664",
-          "text": " If the <code>pNext</code> chain includes a <a href=\"#VkImageViewUsageCreateInfo\">VkImageViewUsageCreateInfo</a> structure, <code>image</code> was created with a <a href=\"#VkImageStencilUsageCreateInfo\">VkImageStencilUsageCreateInfo</a> structure included in the <code>pNext</code> chain of <a href=\"#VkImageCreateInfo\">VkImageCreateInfo</a>, and <code>subResourceRange.aspectMask</code> includes bits other than <code>VK_IMAGE_ASPECT_STENCIL_BIT</code>, the <code>usage</code> member of the <a href=\"#VkImageViewUsageCreateInfo\">VkImageViewUsageCreateInfo</a> structure <strong class=\"purple\">must</strong> not include any bits that were not set in the <code>usage</code> member of the <a href=\"#VkImageCreateInfo\">VkImageCreateInfo</a> structure used to create <code>image</code>"
+          "text": " If the <code>pNext</code> chain includes a <a href=\"#VkImageViewUsageCreateInfo\">VkImageViewUsageCreateInfo</a> structure, <code>image</code> was created with a <a href=\"#VkImageStencilUsageCreateInfo\">VkImageStencilUsageCreateInfo</a> structure included in the <code>pNext</code> chain of <a href=\"#VkImageCreateInfo\">VkImageCreateInfo</a>, and <code>subresourceRange.aspectMask</code> includes bits other than <code>VK_IMAGE_ASPECT_STENCIL_BIT</code>, the <code>usage</code> member of the <a href=\"#VkImageViewUsageCreateInfo\">VkImageViewUsageCreateInfo</a> structure <strong class=\"purple\">must</strong> not include any bits that were not set in the <code>usage</code> member of the <a href=\"#VkImageCreateInfo\">VkImageCreateInfo</a> structure used to create <code>image</code>"
         }
       ],
       "(VK_KHR_portability_subset)": [
         {
           "vuid": "VUID-VkImageViewCreateInfo-imageViewFormatSwizzle-04465",
-          "text": " If the <code><a href=\"#VK_KHR_portability_subset\">[VK_KHR_portability_subset]</a></code> extension is enabled, and <a href=\"#VkPhysicalDevicePortabilitySubsetFeaturesKHR\">VkPhysicalDevicePortabilitySubsetFeaturesKHR</a>::<code>imageViewFormatSwizzle</code> is <code>VK_FALSE</code>, all elements of <code>components</code> <strong class=\"purple\">must</strong> be <code>VK_COMPONENT_SWIZZLE_IDENTITY</code>."
+          "text": " If the <code><a href=\"#VK_KHR_portability_subset\">[VK_KHR_portability_subset]</a></code> extension is enabled, and <a href=\"#VkPhysicalDevicePortabilitySubsetFeaturesKHR\">VkPhysicalDevicePortabilitySubsetFeaturesKHR</a>::<code>imageViewFormatSwizzle</code> is <code>VK_FALSE</code>, all elements of <code>components</code> <strong class=\"purple\">must</strong> have the <a href=\"#resources-image-views-identity-mappings\">identity swizzle</a>"
         },
         {
           "vuid": "VUID-VkImageViewCreateInfo-imageViewFormatReinterpretation-04466",
-          "text": " If the <code><a href=\"#VK_KHR_portability_subset\">[VK_KHR_portability_subset]</a></code> extension is enabled, and <a href=\"#VkPhysicalDevicePortabilitySubsetFeaturesKHR\">VkPhysicalDevicePortabilitySubsetFeaturesKHR</a>::<code>imageViewFormatReinterpretation</code> is <code>VK_FALSE</code>, the <a href=\"#VkFormat\">VkFormat</a> in <code>format</code> <strong class=\"purple\">must</strong> not contain a different number of components, or a different number of bits in each component, than the format of the <code>VkImage</code> in <code>image</code>."
+          "text": " If the <code><a href=\"#VK_KHR_portability_subset\">[VK_KHR_portability_subset]</a></code> extension is enabled, and <a href=\"#VkPhysicalDevicePortabilitySubsetFeaturesKHR\">VkPhysicalDevicePortabilitySubsetFeaturesKHR</a>::<code>imageViewFormatReinterpretation</code> is <code>VK_FALSE</code>, the <a href=\"#VkFormat\">VkFormat</a> in <code>format</code> <strong class=\"purple\">must</strong> not contain a different number of components, or a different number of bits in each component, than the format of the <code>VkImage</code> in <code>image</code>"
         }
       ],
       "(VK_KHR_video_decode_queue)": [
@@ -15858,7 +16126,7 @@
       "core": [
         {
           "vuid": "VUID-vkCreateSampler-maxSamplerAllocationCount-04110",
-          "text": " There <strong class=\"purple\">must</strong> be less than <a href=\"#VkPhysicalDeviceLimits\">VkPhysicalDeviceLimits</a>::<code>maxSamplerAllocationCount</code> <a href=\"#VkSampler\">VkSampler</a> objects currently created on the device."
+          "text": " There <strong class=\"purple\">must</strong> be less than <a href=\"#VkPhysicalDeviceLimits\">VkPhysicalDeviceLimits</a>::<code>maxSamplerAllocationCount</code> <a href=\"#VkSampler\">VkSampler</a> objects currently created on the device"
         },
         {
           "vuid": "VUID-vkCreateSampler-device-parameter",
@@ -15976,7 +16244,7 @@
       "(VK_KHR_portability_subset)": [
         {
           "vuid": "VUID-VkSamplerCreateInfo-samplerMipLodBias-04467",
-          "text": " If the <code><a href=\"#VK_KHR_portability_subset\">[VK_KHR_portability_subset]</a></code> extension is enabled, and <a href=\"#VkPhysicalDevicePortabilitySubsetFeaturesKHR\">VkPhysicalDevicePortabilitySubsetFeaturesKHR</a>::<code>samplerMipLodBias</code> is <code>VK_FALSE</code>, <code>mipLodBias</code> <strong class=\"purple\">must</strong> be zero."
+          "text": " If the <code><a href=\"#VK_KHR_portability_subset\">[VK_KHR_portability_subset]</a></code> extension is enabled, and <a href=\"#VkPhysicalDevicePortabilitySubsetFeaturesKHR\">VkPhysicalDevicePortabilitySubsetFeaturesKHR</a>::<code>samplerMipLodBias</code> is <code>VK_FALSE</code>, <code>mipLodBias</code> <strong class=\"purple\">must</strong> be zero"
         }
       ],
       "(VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion)": [
@@ -16046,7 +16314,7 @@
       "(VK_EXT_custom_border_color)": [
         {
           "vuid": "VUID-VkSamplerCreateInfo-borderColor-04011",
-          "text": " If <code>borderColor</code> is one of <code>VK_BORDER_COLOR_FLOAT_CUSTOM_EXT</code> or <code>VK_BORDER_COLOR_INT_CUSTOM_EXT</code>, then a <a href=\"#VkSamplerCustomBorderColorCreateInfoEXT\">VkSamplerCustomBorderColorCreateInfoEXT</a> <strong class=\"purple\">must</strong> be present in the <code>pNext</code> chain"
+          "text": " If <code>borderColor</code> is one of <code>VK_BORDER_COLOR_FLOAT_CUSTOM_EXT</code> or <code>VK_BORDER_COLOR_INT_CUSTOM_EXT</code>, then a <a href=\"#VkSamplerCustomBorderColorCreateInfoEXT\">VkSamplerCustomBorderColorCreateInfoEXT</a> <strong class=\"purple\">must</strong> be included in the <code>pNext</code> chain"
         },
         {
           "vuid": "VUID-VkSamplerCreateInfo-customBorderColors-04085",
@@ -16054,7 +16322,7 @@
         },
         {
           "vuid": "VUID-VkSamplerCreateInfo-borderColor-04442",
-          "text": " If <code>borderColor</code> is one of <code>VK_BORDER_COLOR_FLOAT_CUSTOM_EXT</code> or <code>VK_BORDER_COLOR_INT_CUSTOM_EXT</code>, and <a href=\"#VkSamplerCustomBorderColorCreateInfoEXT\">VkSamplerCustomBorderColorCreateInfoEXT</a>::<code>format</code> is not <code>VK_FORMAT_UNDEFINED</code>, <a href=\"#VkSamplerCustomBorderColorCreateInfoEXT\">VkSamplerCustomBorderColorCreateInfoEXT</a>::<code>customBorderColor</code> <strong class=\"purple\">must</strong> be within the range of values representable in <code>format</code>."
+          "text": " If <code>borderColor</code> is one of <code>VK_BORDER_COLOR_FLOAT_CUSTOM_EXT</code> or <code>VK_BORDER_COLOR_INT_CUSTOM_EXT</code>, and <a href=\"#VkSamplerCustomBorderColorCreateInfoEXT\">VkSamplerCustomBorderColorCreateInfoEXT</a>::<code>format</code> is not <code>VK_FORMAT_UNDEFINED</code>, <a href=\"#VkSamplerCustomBorderColorCreateInfoEXT\">VkSamplerCustomBorderColorCreateInfoEXT</a>::<code>customBorderColor</code> <strong class=\"purple\">must</strong> be within the range of values representable in <code>format</code>"
         },
         {
           "vuid": "VUID-VkSamplerCreateInfo-None-04012",
@@ -16494,7 +16762,7 @@
       "(VK_VALVE_mutable_descriptor_type)": [
         {
           "vuid": "VUID-VkDescriptorSetLayoutBinding-descriptorType-04605",
-          "text": " If <code>descriptorType</code> is <code>VK_DESCRIPTOR_TYPE_MUTABLE_VALVE</code>, then <code>pImmutableSamplers</code> <strong class=\"purple\">must</strong> be <code>NULL</code>."
+          "text": " If <code>descriptorType</code> is <code>VK_DESCRIPTOR_TYPE_MUTABLE_VALVE</code>, then <code>pImmutableSamplers</code> <strong class=\"purple\">must</strong> be <code>NULL</code>"
         }
       ]
     },
@@ -17297,20 +17565,24 @@
       ]
     },
     "vkUpdateDescriptorSets": {
-      "!(VK_VERSION_1_2,VK_EXT_descriptor_indexing)": [
-        {
-          "vuid": "VUID-vkUpdateDescriptorSets-dstSet-00314",
-          "text": " The <code>dstSet</code> member of each element of <code>pDescriptorWrites</code> or <code>pDescriptorCopies</code> <strong class=\"purple\">must</strong> not be used by any command that was recorded to a command buffer which is in the <a href=\"#commandbuffers-lifecycle\">pending state</a>"
-        }
-      ],
-      "(VK_VERSION_1_2,VK_EXT_descriptor_indexing)": [
-        {
-          "vuid": "VUID-vkUpdateDescriptorSets-None-03047",
-          "text": " Descriptor bindings updated by this command which were created without the <code>VK_DESCRIPTOR_BINDING_UPDATE_AFTER_BIND_BIT</code> or <code>VK_DESCRIPTOR_BINDING_UPDATE_UNUSED_WHILE_PENDING_BIT</code> bits set <strong class=\"purple\">must</strong> not be used by any command that was recorded to a command buffer which is in the <a href=\"#commandbuffers-lifecycle\">pending state</a>"
-        }
-      ],
       "core": [
         {
+          "vuid": "VUID-vkUpdateDescriptorSets-pDescriptorWrites-06236",
+          "text": " For each element <span class=\"eq\">i</span> where <code>pDescriptorWrites</code>[i].<code>descriptorType</code> is <code>VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER</code> or <code>VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER</code>, elements of the <code>pTexelBufferView</code> member of <code>pDescriptorWrites</code>[i] <strong class=\"purple\">must</strong> have been created on <code>device</code>"
+        },
+        {
+          "vuid": "VUID-vkUpdateDescriptorSets-pDescriptorWrites-06237",
+          "text": " For each element <span class=\"eq\">i</span> where <code>pDescriptorWrites</code>[i].<code>descriptorType</code> is <code>VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER</code>, <code>VK_DESCRIPTOR_TYPE_STORAGE_BUFFER</code>, <code>VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC</code>, or <code>VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC</code>, the <code>buffer</code> member of any element of the <code>pBufferInfo</code> member of <code>pDescriptorWrites</code>[i] <strong class=\"purple\">must</strong> have been created on <code>device</code>"
+        },
+        {
+          "vuid": "VUID-vkUpdateDescriptorSets-pDescriptorWrites-06238",
+          "text": " For each element <span class=\"eq\">i</span> where <code>pDescriptorWrites</code>[i].<code>descriptorType</code> is <code>VK_DESCRIPTOR_TYPE_SAMPLER</code> or <code>VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER</code>, and <code>dstSet</code> was not allocated with a layout that included immutable samplers for <code>dstBinding</code> with <code>descriptorType</code>, the <code>sampler</code> member of any element of the <code>pImageInfo</code> member of <code>pDescriptorWrites</code>[i] <strong class=\"purple\">must</strong> have been created on <code>device</code>"
+        },
+        {
+          "vuid": "VUID-vkUpdateDescriptorSets-pDescriptorWrites-06239",
+          "text": " For each element <span class=\"eq\">i</span> where <code>pDescriptorWrites</code>[i].<code>descriptorType</code> is <code>VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE</code>, <code>VK_DESCRIPTOR_TYPE_STORAGE_IMAGE</code>, <code>VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT</code>, or <code>VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER</code> the <code>imageView</code> member of any element of <code>pDescriptorWrites</code>[i] <strong class=\"purple\">must</strong> have been created on <code>device</code>"
+        },
+        {
           "vuid": "VUID-vkUpdateDescriptorSets-device-parameter",
           "text": " <code>device</code> <strong class=\"purple\">must</strong> be a valid <a href=\"#VkDevice\">VkDevice</a> handle"
         },
@@ -17322,6 +17594,30 @@
           "vuid": "VUID-vkUpdateDescriptorSets-pDescriptorCopies-parameter",
           "text": " If <code>descriptorCopyCount</code> is not <code>0</code>, <code>pDescriptorCopies</code> <strong class=\"purple\">must</strong> be a valid pointer to an array of <code>descriptorCopyCount</code> valid <a href=\"#VkCopyDescriptorSet\">VkCopyDescriptorSet</a> structures"
         }
+      ],
+      "(VK_KHR_acceleration_structure)": [
+        {
+          "vuid": "VUID-vkUpdateDescriptorSets-pDescriptorWrites-06240",
+          "text": " For each element <span class=\"eq\">i</span> where <code>pDescriptorWrites</code>[i].<code>descriptorType</code> is <code>VK_DESCRIPTOR_TYPE_ACCELERATION_STRUCTURE_KHR</code>, elements of the <code>pAccelerationStructures</code> member of a <a href=\"#VkWriteDescriptorSetAccelerationStructureKHR\">VkWriteDescriptorSetAccelerationStructureKHR</a> structure in the <code>pNext</code> chain of <code>pDescriptorWrites</code>[i] <strong class=\"purple\">must</strong> have been created on <code>device</code>"
+        }
+      ],
+      "(VK_NV_ray_tracing)": [
+        {
+          "vuid": "VUID-vkUpdateDescriptorSets-pDescriptorWrites-06241",
+          "text": " For each element <span class=\"eq\">i</span> where <code>pDescriptorWrites</code>[i].<code>descriptorType</code> is <code>VK_DESCRIPTOR_TYPE_ACCELERATION_STRUCTURE_NV</code>, elements of the <code>pAccelerationStructures</code> member of a <a href=\"#VkWriteDescriptorSetAccelerationStructureNV\">VkWriteDescriptorSetAccelerationStructureNV</a> structure in the <code>pNext</code> chain of <code>pDescriptorWrites</code>[i] <strong class=\"purple\">must</strong> have been created on <code>device</code>"
+        }
+      ],
+      "!(VK_VERSION_1_2,VK_EXT_descriptor_indexing)": [
+        {
+          "vuid": "VUID-vkUpdateDescriptorSets-dstSet-00314",
+          "text": " The <code>dstSet</code> member of each element of <code>pDescriptorWrites</code> or <code>pDescriptorCopies</code> <strong class=\"purple\">must</strong> not be used by any command that was recorded to a command buffer which is in the <a href=\"#commandbuffers-lifecycle\">pending state</a>"
+        }
+      ],
+      "(VK_VERSION_1_2,VK_EXT_descriptor_indexing)": [
+        {
+          "vuid": "VUID-vkUpdateDescriptorSets-None-03047",
+          "text": " Descriptor bindings updated by this command which were created without the <code>VK_DESCRIPTOR_BINDING_UPDATE_AFTER_BIND_BIT</code> or <code>VK_DESCRIPTOR_BINDING_UPDATE_UNUSED_WHILE_PENDING_BIT</code> bits set <strong class=\"purple\">must</strong> not be used by any command that was recorded to a command buffer which is in the <a href=\"#commandbuffers-lifecycle\">pending state</a>"
+        }
       ]
     },
     "VkWriteDescriptorSet": {
@@ -17586,7 +17882,7 @@
       "(VK_KHR_portability_subset)": [
         {
           "vuid": "VUID-VkDescriptorImageInfo-mutableComparisonSamplers-04450",
-          "text": " If the <code><a href=\"#VK_KHR_portability_subset\">[VK_KHR_portability_subset]</a></code> extension is enabled, and <a href=\"#VkPhysicalDevicePortabilitySubsetFeaturesKHR\">VkPhysicalDevicePortabilitySubsetFeaturesKHR</a>::<code>mutableComparisonSamplers</code> is <code>VK_FALSE</code>, then <code>sampler</code> <strong class=\"purple\">must</strong> have been created with <a href=\"#VkSamplerCreateInfo\">VkSamplerCreateInfo</a>::<code>compareEnable</code> set to <code>VK_FALSE</code>."
+          "text": " If the <code><a href=\"#VK_KHR_portability_subset\">[VK_KHR_portability_subset]</a></code> extension is enabled, and <a href=\"#VkPhysicalDevicePortabilitySubsetFeaturesKHR\">VkPhysicalDevicePortabilitySubsetFeaturesKHR</a>::<code>mutableComparisonSamplers</code> is <code>VK_FALSE</code>, then <code>sampler</code> <strong class=\"purple\">must</strong> have been created with <a href=\"#VkSamplerCreateInfo\">VkSamplerCreateInfo</a>::<code>compareEnable</code> set to <code>VK_FALSE</code>"
         }
       ]
     },
@@ -18428,7 +18724,7 @@
         },
         {
           "vuid": "VUID-ClipDistancePerViewNV-ClipDistancePerViewNV-04194",
-          "text": " The variable decorated with <code>ClipDistancePerViewNV</code> <strong class=\"purple\">must</strong> also be decorated with the <code>PerViewNV</code> decoration."
+          "text": " The variable decorated with <code>ClipDistancePerViewNV</code> <strong class=\"purple\">must</strong> also be decorated with the <code>PerViewNV</code> decoration"
         },
         {
           "vuid": "VUID-ClipDistancePerViewNV-ClipDistancePerViewNV-04195",
@@ -18472,7 +18768,7 @@
         },
         {
           "vuid": "VUID-CullDistancePerViewNV-CullDistancePerViewNV-04203",
-          "text": " The variable decorated with <code>CullDistancePerViewNV</code> <strong class=\"purple\">must</strong> also be decorated with the <code>PerViewNV</code> decoration."
+          "text": " The variable decorated with <code>CullDistancePerViewNV</code> <strong class=\"purple\">must</strong> also be decorated with the <code>PerViewNV</code> decoration"
         },
         {
           "vuid": "VUID-CullDistancePerViewNV-CullDistancePerViewNV-04204",
@@ -18892,7 +19188,7 @@
         },
         {
           "vuid": "VUID-LayerPerViewNV-LayerPerViewNV-04279",
-          "text": " The variable decorated with <code>LayerPerViewNV</code> <strong class=\"purple\">must</strong> also be decorated with the <code>PerViewNV</code> decoration."
+          "text": " The variable decorated with <code>LayerPerViewNV</code> <strong class=\"purple\">must</strong> also be decorated with the <code>PerViewNV</code> decoration"
         },
         {
           "vuid": "VUID-LayerPerViewNV-LayerPerViewNV-04280",
@@ -19658,7 +19954,7 @@
         },
         {
           "vuid": "VUID-ViewportMaskPerViewNV-ViewportMaskPerViewNV-04417",
-          "text": " The array variable decorated with <code>ViewportMaskPerViewNV</code> <strong class=\"purple\">must</strong> only be indexed by a constant or specialization constant."
+          "text": " The array variable decorated with <code>ViewportMaskPerViewNV</code> <strong class=\"purple\">must</strong> only be indexed by a constant or specialization constant"
         }
       ]
     },
@@ -20410,7 +20706,7 @@
         },
         {
           "vuid": "VUID-vkGetQueryPoolResults-queryType-04519",
-          "text": " If the <code>queryType</code> used to create <code>queryPool</code> was <code>VK_QUERY_TYPE_PERFORMANCE_QUERY_KHR</code>, then <code>stride</code> <strong class=\"purple\">must</strong> be large enough to contain <code>VkQueryPoolPerformanceCreateInfoKHR</code>::<code>counterIndexCount</code> used to create <code>queryPool</code> times the size of <a href=\"#VkPerformanceCounterResultKHR\">VkPerformanceCounterResultKHR</a>."
+          "text": " If the <code>queryType</code> used to create <code>queryPool</code> was <code>VK_QUERY_TYPE_PERFORMANCE_QUERY_KHR</code>, then <code>stride</code> <strong class=\"purple\">must</strong> be large enough to contain <code>VkQueryPoolPerformanceCreateInfoKHR</code>::<code>counterIndexCount</code> used to create <code>queryPool</code> times the size of <a href=\"#VkPerformanceCounterResultKHR\">VkPerformanceCounterResultKHR</a>"
         },
         {
           "vuid": "VUID-vkGetQueryPoolResults-queryType-03230",
@@ -20526,7 +20822,7 @@
       "(VK_KHR_video_queue)": [
         {
           "vuid": "VUID-vkCmdCopyQueryPoolResults-queryType-04812",
-          "text": " <a href=\"#vkCmdCopyQueryPoolResults\">vkCmdCopyQueryPoolResults</a> <strong class=\"purple\">must</strong> not be called if the <code>queryType</code> used to create <code>queryPool</code> was"
+          "text": " <a href=\"#vkCmdCopyQueryPoolResults\">vkCmdCopyQueryPoolResults</a> <strong class=\"purple\">must</strong> not be called if the <code>queryType</code> used to create <code>queryPool</code> was <code>VK_QUERY_TYPE_VIDEO_ENCODE_BITSTREAM_BUFFER_RANGE_KHR</code> or <code>VK_QUERY_TYPE_RESULT_STATUS_ONLY_KHR</code>"
         }
       ]
     },
@@ -20637,6 +20933,12 @@
           "text": " If the <a href=\"#features-subpassShading\">subpass shading</a> feature is not enabled, pname:stage <strong class=\"purple\">must</strong> not contain <code>VK_PIPELINE_STAGE_2_SUBPASS_SHADING_BIT_HUAWEI</code>"
         }
       ],
+      "(VK_KHR_synchronization2)+(VK_HUAWEI_invocation_mask)": [
+        {
+          "vuid": "VUID-vkCmdWriteTimestamp2KHR-stage-04995",
+          "text": " If the <a href=\"#features-invocationMask\">invocation mask image</a> feature is not enabled, pname:stage <strong class=\"purple\">must</strong> not contain <code>VK_PIPELINE_STAGE_2_INVOCATION_MASK_BIT_HUAWEI</code>"
+        }
+      ],
       "(VK_KHR_synchronization2)+(VK_VERSION_1_1,VK_KHR_multiview)": [
         {
           "vuid": "VUID-vkCmdWriteTimestamp2KHR-None-03864",
@@ -22543,8 +22845,8 @@
       ],
       "core": [
         {
-          "vuid": "VUID-vkCmdCopyBufferToImage-pRegions-00172",
-          "text": " The image region specified by each element of <code>pRegions</code> <strong class=\"purple\">must</strong> be a region that is contained within <code>dstImage</code>"
+          "vuid": "VUID-vkCmdCopyBufferToImage-pRegions-06217",
+          "text": " The image region specified by each element of <code>pRegions</code> <strong class=\"purple\">must</strong> be contained within the specified <code>imageSubresource</code> of <code>dstImage</code>"
         },
         {
           "vuid": "VUID-vkCmdCopyBufferToImage-pRegions-00171",
@@ -22592,14 +22894,14 @@
         },
         {
           "vuid": "VUID-vkCmdCopyBufferToImage-commandBuffer-04477",
-          "text": " If the queue family used to create the <a href=\"#VkCommandPool\">VkCommandPool</a> which <code>commandBuffer</code> was allocated from does not support <code>VK_QUEUE_GRAPHICS_BIT</code>, for each element of <code>pRegions</code>, the <code>aspectMask</code> member of <code>imageSubresource</code> <strong class=\"purple\">must</strong> not be <code>VK_IMAGE_ASPECT_DEPTH_BIT</code> or <code>VK_IMAGE_ASPECT_STENCIL_BIT</code>."
+          "text": " If the queue family used to create the <a href=\"#VkCommandPool\">VkCommandPool</a> which <code>commandBuffer</code> was allocated from does not support <code>VK_QUEUE_GRAPHICS_BIT</code>, for each element of <code>pRegions</code>, the <code>aspectMask</code> member of <code>imageSubresource</code> <strong class=\"purple\">must</strong> not be <code>VK_IMAGE_ASPECT_DEPTH_BIT</code> or <code>VK_IMAGE_ASPECT_STENCIL_BIT</code>"
         },
         {
-          "vuid": "VUID-vkCmdCopyBufferToImage-imageOffset-00197",
+          "vuid": "VUID-vkCmdCopyBufferToImage-pRegions-06218",
           "text": " For each element of <code>pRegions</code>, <code>imageOffset.x</code> and <span class=\"eq\">(<code>imageExtent.width</code> &#43; <code>imageOffset.x</code>)</span> <strong class=\"purple\">must</strong> both be greater than or equal to <code>0</code> and less than or equal to the width of the specified <code>imageSubresource</code> of <code>dstImage</code>"
         },
         {
-          "vuid": "VUID-vkCmdCopyBufferToImage-imageOffset-00198",
+          "vuid": "VUID-vkCmdCopyBufferToImage-pRegions-06219",
           "text": " For each element of <code>pRegions</code>, <code>imageOffset.y</code> and <span class=\"eq\">(<code>imageExtent.height</code> &#43; <code>imageOffset.y</code>)</span> <strong class=\"purple\">must</strong> both be greater than or equal to <code>0</code> and less than or equal to the height of the specified <code>imageSubresource</code> of <code>dstImage</code>"
         },
         {
@@ -22775,8 +23077,8 @@
       ],
       "core": [
         {
-          "vuid": "VUID-vkCmdCopyImageToBuffer-pRegions-00182",
-          "text": " The image region specified by each element of <code>pRegions</code> <strong class=\"purple\">must</strong> be a region that is contained within <code>srcImage</code>"
+          "vuid": "VUID-vkCmdCopyImageToBuffer-pRegions-06220",
+          "text": " The image region specified by each element of <code>pRegions</code> <strong class=\"purple\">must</strong> be contained within the specified <code>imageSubresource</code> of <code>srcImage</code>"
         },
         {
           "vuid": "VUID-vkCmdCopyImageToBuffer-pRegions-00183",
@@ -22823,11 +23125,11 @@
           "text": " The <code>imageOffset</code> and <code>imageExtent</code> members of each element of <code>pRegions</code> <strong class=\"purple\">must</strong> respect the image transfer granularity requirements of <code>commandBuffer</code>&#8217;s command pool&#8217;s queue family, as described in <a href=\"#VkQueueFamilyProperties\">VkQueueFamilyProperties</a>"
         },
         {
-          "vuid": "VUID-vkCmdCopyImageToBuffer-imageOffset-00197",
+          "vuid": "VUID-vkCmdCopyImageToBuffer-pRegions-06221",
           "text": " For each element of <code>pRegions</code>, <code>imageOffset.x</code> and <span class=\"eq\">(<code>imageExtent.width</code> &#43; <code>imageOffset.x</code>)</span> <strong class=\"purple\">must</strong> both be greater than or equal to <code>0</code> and less than or equal to the width of the specified <code>imageSubresource</code> of <code>srcImage</code>"
         },
         {
-          "vuid": "VUID-vkCmdCopyImageToBuffer-imageOffset-00198",
+          "vuid": "VUID-vkCmdCopyImageToBuffer-pRegions-06222",
           "text": " For each element of <code>pRegions</code>, <code>imageOffset.y</code> and <span class=\"eq\">(imageExtent.height &#43; <code>imageOffset.y</code>)</span> <strong class=\"purple\">must</strong> both be greater than or equal to <code>0</code> and less than or equal to the height of the specified <code>imageSubresource</code> of <code>srcImage</code>"
         },
         {
@@ -23042,25 +23344,29 @@
       "(VK_KHR_copy_commands2)+!(VK_QCOM_rotated_copy_commands)": [
         {
           "vuid": "VUID-VkCopyBufferToImageInfo2KHR-pRegions-00172",
-          "text": " The image region specified by each element of <code>pRegions</code> <strong class=\"purple\">must</strong> be a region that is contained within <code>dstImage</code>"
+          "text": " The image region specified by each element of <code>pRegions</code> <strong class=\"purple\">must</strong> be contained within the specified <code>imageSubresource</code> of <code>dstImage</code>"
         }
       ],
       "(VK_KHR_copy_commands2)+(VK_QCOM_rotated_copy_commands)": [
         {
           "vuid": "VUID-VkCopyBufferToImageInfo2KHR-pRegions-04565",
-          "text": " If the image region specified by each element of <code>pRegions</code> does not contain <a href=\"#VkCopyCommandTransformInfoQCOM\">VkCopyCommandTransformInfoQCOM</a> in its <code>pNext</code> chain, it <strong class=\"purple\">must</strong> be a region that is contained within <code>dstImage</code>"
+          "text": " If the image region specified by each element of <code>pRegions</code> does not contain <a href=\"#VkCopyCommandTransformInfoQCOM\">VkCopyCommandTransformInfoQCOM</a> in its <code>pNext</code> chain, it <strong class=\"purple\">must</strong> be a region that is contained within the specified <code>imageSubresource</code> of <code>dstImage</code>"
         },
         {
           "vuid": "VUID-VkCopyBufferToImageInfo2KHR-pRegions-04554",
-          "text": " If the image region specified by each element of <code>pRegions</code> does contain <a href=\"#VkCopyCommandTransformInfoQCOM\">VkCopyCommandTransformInfoQCOM</a> in its <code>pNext</code> chain, the rotated destination region as described in <a href=\"#copies-buffers-images-rotation-addressing\">Buffer and Image Addressing with Rotation</a> <strong class=\"purple\">must</strong> be contained within <code>dstImage</code>."
+          "text": " If the image region specified by each element of <code>pRegions</code> contains <a href=\"#VkCopyCommandTransformInfoQCOM\">VkCopyCommandTransformInfoQCOM</a> in its <code>pNext</code> chain, the rotated destination region as described in <a href=\"#copies-buffers-images-rotation-addressing\">Buffer and Image Addressing with Rotation</a> <strong class=\"purple\">must</strong> be contained within <code>dstImage</code>"
         },
         {
           "vuid": "VUID-VkCopyBufferToImageInfo2KHR-pRegions-04555",
-          "text": " If any element of <code>pRegions</code> contains <a href=\"#VkCopyCommandTransformInfoQCOM\">VkCopyCommandTransformInfoQCOM</a> in its <code>pNext</code> chain, then the <code>dstImage</code> <strong class=\"purple\">must</strong> not be a <a href=\"#blocked-image\">blocked image</a>."
+          "text": " If any element of <code>pRegions</code> contains <a href=\"#VkCopyCommandTransformInfoQCOM\">VkCopyCommandTransformInfoQCOM</a> in its <code>pNext</code> chain, then <code>dstImage</code> <strong class=\"purple\">must</strong> not be a <a href=\"#blocked-image\">blocked image</a>"
         },
         {
-          "vuid": "VUID-VkCopyBufferToImageInfo2KHR-pRegions-04556",
-          "text": " If any element of <code>pRegions</code> contains <a href=\"#VkCopyCommandTransformInfoQCOM\">VkCopyCommandTransformInfoQCOM</a> in its <code>pNext</code> chain, then the <code>dstImage</code> <strong class=\"purple\">must</strong> be of type <code>VK_IMAGE_TYPE_2D</code> and <strong class=\"purple\">must</strong> not be a <a href=\"#formats-requiring-sampler-ycbcr-conversion\">multi-planar format</a>."
+          "vuid": "VUID-VkCopyBufferToImageInfo2KHR-pRegions-06203",
+          "text": " If any element of <code>pRegions</code> contains <a href=\"#VkCopyCommandTransformInfoQCOM\">VkCopyCommandTransformInfoQCOM</a> in its <code>pNext</code> chain, then <code>dstImage</code> <strong class=\"purple\">must</strong> be of type <code>VK_IMAGE_TYPE_2D</code>"
+        },
+        {
+          "vuid": "VUID-VkCopyBufferToImageInfo2KHR-pRegions-06204",
+          "text": " If any element of <code>pRegions</code> contains <a href=\"#VkCopyCommandTransformInfoQCOM\">VkCopyCommandTransformInfoQCOM</a> in its <code>pNext</code> chain, then <code>dstImage</code> <strong class=\"purple\">must</strong> not have a <a href=\"#formats-requiring-sampler-ycbcr-conversion\">multi-planar format</a>"
         }
       ],
       "(VK_KHR_copy_commands2)": [
@@ -23110,15 +23416,15 @@
         },
         {
           "vuid": "VUID-VkCopyBufferToImageInfo2KHR-commandBuffer-04477",
-          "text": " If the queue family used to create the <a href=\"#VkCommandPool\">VkCommandPool</a> which <code>commandBuffer</code> was allocated from does not support <code>VK_QUEUE_GRAPHICS_BIT</code>, for each element of <code>pRegions</code>, the <code>aspectMask</code> member of <code>imageSubresource</code> <strong class=\"purple\">must</strong> not be <code>VK_IMAGE_ASPECT_DEPTH_BIT</code> or <code>VK_IMAGE_ASPECT_STENCIL_BIT</code>."
+          "text": " If the queue family used to create the <a href=\"#VkCommandPool\">VkCommandPool</a> which <code>commandBuffer</code> was allocated from does not support <code>VK_QUEUE_GRAPHICS_BIT</code>, for each element of <code>pRegions</code>, the <code>aspectMask</code> member of <code>imageSubresource</code> <strong class=\"purple\">must</strong> not be <code>VK_IMAGE_ASPECT_DEPTH_BIT</code> or <code>VK_IMAGE_ASPECT_STENCIL_BIT</code>"
         },
         {
-          "vuid": "VUID-VkCopyBufferToImageInfo2KHR-imageOffset-00197",
-          "text": " For each element of <code>pRegions</code>"
+          "vuid": "VUID-VkCopyBufferToImageInfo2KHR-pRegions-06223",
+          "text": " For each element of <code>pRegions</code> not containing <a href=\"#VkCopyCommandTransformInfoQCOM\">VkCopyCommandTransformInfoQCOM</a> in its <code>pNext</code> chain, <code>imageOffset.x</code> and <span class=\"eq\">(<code>imageExtent.width</code> &#43; <code>imageOffset.x</code>)</span> <strong class=\"purple\">must</strong> both be greater than or equal to <code>0</code> and less than or equal to the width of the specified <code>imageSubresource</code> of <code>dstImage</code>"
         },
         {
-          "vuid": "VUID-VkCopyBufferToImageInfo2KHR-imageOffset-00198",
-          "text": " For each element of <code>pRegions</code>"
+          "vuid": "VUID-VkCopyBufferToImageInfo2KHR-pRegions-06224",
+          "text": " For each element of <code>pRegions</code> not containing <a href=\"#VkCopyCommandTransformInfoQCOM\">VkCopyCommandTransformInfoQCOM</a> in its <code>pNext</code> chain, <code>imageOffset.y</code> and <span class=\"eq\">(<code>imageExtent.height</code> &#43; <code>imageOffset.y</code>)</span> <strong class=\"purple\">must</strong> both be greater than or equal to <code>0</code> and less than or equal to the height of the specified <code>imageSubresource</code> of <code>dstImage</code>"
         },
         {
           "vuid": "VUID-VkCopyBufferToImageInfo2KHR-srcImage-00199",
@@ -23310,25 +23616,29 @@
       "(VK_KHR_copy_commands2)+!(VK_QCOM_rotated_copy_commands)": [
         {
           "vuid": "VUID-VkCopyImageToBufferInfo2KHR-pRegions-00182",
-          "text": " The image region specified by each element of <code>pRegions</code> <strong class=\"purple\">must</strong> be a region that is contained within <code>srcImage</code>"
+          "text": " The image region specified by each element of <code>pRegions</code> <strong class=\"purple\">must</strong> be contained within the specified <code>imageSubresource</code> of <code>srcImage</code>"
         }
       ],
       "(VK_KHR_copy_commands2)+(VK_QCOM_rotated_copy_commands)": [
         {
           "vuid": "VUID-VkCopyImageToBufferInfo2KHR-pRegions-04566",
-          "text": " If the image region specified by each element of <code>pRegions</code> does not contain <a href=\"#VkCopyCommandTransformInfoQCOM\">VkCopyCommandTransformInfoQCOM</a> in its <code>pNext</code> chain, it <strong class=\"purple\">must</strong> be a region that is contained within <code>srcImage</code>"
+          "text": " If the image region specified by each element of <code>pRegions</code> does not contain <a href=\"#VkCopyCommandTransformInfoQCOM\">VkCopyCommandTransformInfoQCOM</a> in its <code>pNext</code> chain, it <strong class=\"purple\">must</strong> be contained within the specified <code>imageSubresource</code> of <code>srcImage</code>"
         },
         {
           "vuid": "VUID-VkCopyImageToBufferInfo2KHR-pRegions-04557",
-          "text": " If the image region specified by each element of <code>pRegions</code> does contain <a href=\"#VkCopyCommandTransformInfoQCOM\">VkCopyCommandTransformInfoQCOM</a> in its <code>pNext</code> chain, the rotated source region as described in <a href=\"#copies-buffers-images-rotation-addressing\">Buffer and Image Addressing with Rotation</a> <strong class=\"purple\">must</strong> be contained within <code>srcImage</code>."
+          "text": " If the image region specified by each element of <code>pRegions</code> contains <a href=\"#VkCopyCommandTransformInfoQCOM\">VkCopyCommandTransformInfoQCOM</a> in its <code>pNext</code> chain, the rotated source region as described in <a href=\"#copies-buffers-images-rotation-addressing\">Buffer and Image Addressing with Rotation</a> <strong class=\"purple\">must</strong> be contained within <code>srcImage</code>"
         },
         {
           "vuid": "VUID-VkCopyImageToBufferInfo2KHR-pRegions-04558",
-          "text": " If any element of <code>pRegions</code> contains <a href=\"#VkCopyCommandTransformInfoQCOM\">VkCopyCommandTransformInfoQCOM</a> in its <code>pNext</code> chain, then the <code>srcImage</code> <strong class=\"purple\">must</strong> not be a <a href=\"#blocked-image\">blocked image</a>"
+          "text": " If any element of <code>pRegions</code> contains <a href=\"#VkCopyCommandTransformInfoQCOM\">VkCopyCommandTransformInfoQCOM</a> in its <code>pNext</code> chain, then <code>srcImage</code> <strong class=\"purple\">must</strong> not be a <a href=\"#blocked-image\">blocked image</a>"
         },
         {
-          "vuid": "VUID-VkCopyImageToBufferInfo2KHR-pRegions-04559",
-          "text": " If any element of <code>pRegions</code> contains <a href=\"#VkCopyCommandTransformInfoQCOM\">VkCopyCommandTransformInfoQCOM</a> in its <code>pNext</code> chain, then the <code>srcImage</code> <strong class=\"purple\">must</strong> be of type <code>VK_IMAGE_TYPE_2D</code>, and <strong class=\"purple\">must</strong> not be a <a href=\"#formats-requiring-sampler-ycbcr-conversion\">multi-planar format</a>."
+          "vuid": "VUID-VkCopyImageToBufferInfo2KHR-pRegions-06205",
+          "text": " If any element of <code>pRegions</code> contains <a href=\"#VkCopyCommandTransformInfoQCOM\">VkCopyCommandTransformInfoQCOM</a> in its <code>pNext</code> chain, then <code>srcImage</code> <strong class=\"purple\">must</strong> be of type <code>VK_IMAGE_TYPE_2D</code>"
+        },
+        {
+          "vuid": "VUID-VkCopyImageToBufferInfo2KHR-pRegions-06206",
+          "text": " If any element of <code>pRegions</code> contains <a href=\"#VkCopyCommandTransformInfoQCOM\">VkCopyCommandTransformInfoQCOM</a> in its <code>pNext</code> chain, then <code>srcImage</code> <strong class=\"purple\">must</strong> not have a <a href=\"#formats-requiring-sampler-ycbcr-conversion\">multi-planar format</a>"
         }
       ],
       "(VK_KHR_copy_commands2)": [
@@ -23378,11 +23688,11 @@
         },
         {
           "vuid": "VUID-VkCopyImageToBufferInfo2KHR-imageOffset-00197",
-          "text": " For each element of <code>pRegions</code>"
+          "text": " For each element of <code>pRegions</code> not containing <a href=\"#VkCopyCommandTransformInfoQCOM\">VkCopyCommandTransformInfoQCOM</a> in its <code>pNext</code> chain, <code>imageOffset.x</code> and <span class=\"eq\">(<code>imageExtent.width</code> &#43; <code>imageOffset.x</code>)</span> <strong class=\"purple\">must</strong> both be greater than or equal to <code>0</code> and less than or equal to the width of the specified <code>imageSubresource</code> of <code>srcImage</code>"
         },
         {
           "vuid": "VUID-VkCopyImageToBufferInfo2KHR-imageOffset-00198",
-          "text": " For each element of <code>pRegions</code>"
+          "text": " For each element of <code>pRegions</code> not containing <a href=\"#VkCopyCommandTransformInfoQCOM\">VkCopyCommandTransformInfoQCOM</a> in its <code>pNext</code> chain, <code>imageOffset.y</code> and <span class=\"eq\">(<code>imageExtent.height</code> &#43; <code>imageOffset.y</code>)</span> <strong class=\"purple\">must</strong> both be greater than or equal to <code>0</code> and less than or equal to the height of the specified <code>imageSubresource</code> of <code>srcImage</code>"
         },
         {
           "vuid": "VUID-VkCopyImageToBufferInfo2KHR-srcImage-00199",
@@ -23676,7 +23986,7 @@
         },
         {
           "vuid": "VUID-vkCmdBlitImage-srcImage-00240",
-          "text": " If either <code>srcImage</code> or <code>dstImage</code> is of type <code>VK_IMAGE_TYPE_3D</code>, then for each element of <code>pRegions</code>, <code>srcSubresource.baseArrayLayer</code> and <code>dstSubresource.baseArrayLayer</code> <strong class=\"purple\">must</strong> each be <code>0</code>, and <code>srcSubresource.layerCount</code> and <code>dstSubresource.layerCount</code> <strong class=\"purple\">must</strong> each be <code>1</code>."
+          "text": " If either <code>srcImage</code> or <code>dstImage</code> is of type <code>VK_IMAGE_TYPE_3D</code>, then for each element of <code>pRegions</code>, <code>srcSubresource.baseArrayLayer</code> and <code>dstSubresource.baseArrayLayer</code> <strong class=\"purple\">must</strong> each be <code>0</code>, and <code>srcSubresource.layerCount</code> and <code>dstSubresource.layerCount</code> <strong class=\"purple\">must</strong> each be <code>1</code>"
         },
         {
           "vuid": "VUID-vkCmdBlitImage-aspectMask-00241",
@@ -23972,7 +24282,7 @@
         },
         {
           "vuid": "VUID-VkBlitImageInfo2KHR-srcImage-00240",
-          "text": " If either <code>srcImage</code> or <code>dstImage</code> is of type <code>VK_IMAGE_TYPE_3D</code>, then for each element of <code>pRegions</code>, <code>srcSubresource.baseArrayLayer</code> and <code>dstSubresource.baseArrayLayer</code> <strong class=\"purple\">must</strong> each be <code>0</code>, and <code>srcSubresource.layerCount</code> and <code>dstSubresource.layerCount</code> <strong class=\"purple\">must</strong> each be <code>1</code>."
+          "text": " If either <code>srcImage</code> or <code>dstImage</code> is of type <code>VK_IMAGE_TYPE_3D</code>, then for each element of <code>pRegions</code>, <code>srcSubresource.baseArrayLayer</code> and <code>dstSubresource.baseArrayLayer</code> <strong class=\"purple\">must</strong> each be <code>0</code>, and <code>srcSubresource.layerCount</code> and <code>dstSubresource.layerCount</code> <strong class=\"purple\">must</strong> each be <code>1</code>"
         },
         {
           "vuid": "VUID-VkBlitImageInfo2KHR-aspectMask-00241",
@@ -24112,11 +24422,15 @@
       "(VK_KHR_copy_commands2)+(VK_QCOM_rotated_copy_commands)": [
         {
           "vuid": "VUID-VkBlitImageInfo2KHR-pRegions-04561",
-          "text": " If any element of <code>pRegions</code> contains <a href=\"#VkCopyCommandTransformInfoQCOM\">VkCopyCommandTransformInfoQCOM</a> in its <code>pNext</code> chain, then <code>srcImage</code> and <code>dstImage</code> <strong class=\"purple\">must</strong> not be a block-compressed image."
+          "text": " If any element of <code>pRegions</code> contains <a href=\"#VkCopyCommandTransformInfoQCOM\">VkCopyCommandTransformInfoQCOM</a> in its <code>pNext</code> chain, then <code>srcImage</code> and <code>dstImage</code> <strong class=\"purple\">must</strong> not be block-compressed images"
         },
         {
-          "vuid": "VUID-VkBlitImageInfo2KHR-pRegions-04562",
-          "text": " If any element of <code>pRegions</code> contains <a href=\"#VkCopyCommandTransformInfoQCOM\">VkCopyCommandTransformInfoQCOM</a> in its <code>pNext</code> chain, then the <code>srcImage</code> <strong class=\"purple\">must</strong> be of type <code>VK_IMAGE_TYPE_2D</code> and <strong class=\"purple\">must</strong> not be a <a href=\"#formats-requiring-sampler-ycbcr-conversion\">multi-planar format</a>."
+          "vuid": "VUID-VkBlitImageInfo2KHR-pRegions-06207",
+          "text": " If any element of <code>pRegions</code> contains <a href=\"#VkCopyCommandTransformInfoQCOM\">VkCopyCommandTransformInfoQCOM</a> in its <code>pNext</code> chain, then <code>srcImage</code> <strong class=\"purple\">must</strong> be of type <code>VK_IMAGE_TYPE_2D</code>"
+        },
+        {
+          "vuid": "VUID-VkBlitImageInfo2KHR-pRegions-06208",
+          "text": " If any element of <code>pRegions</code> contains <a href=\"#VkCopyCommandTransformInfoQCOM\">VkCopyCommandTransformInfoQCOM</a> in its <code>pNext</code> chain, then <code>srcImage</code> <strong class=\"purple\">must</strong> not have a <a href=\"#formats-requiring-sampler-ycbcr-conversion\">multi-planar format</a>"
         }
       ]
     },
@@ -24384,7 +24698,7 @@
         },
         {
           "vuid": "VUID-vkCmdWriteBufferMarker2AMD-dstOffset-03896",
-          "text": " <code>dstOffset</code> <strong class=\"purple\">must</strong> be less than or equal to the size of <code>dstBuffer</code> minus <code>4</code>."
+          "text": " <code>dstOffset</code> <strong class=\"purple\">must</strong> be less than or equal to the size of <code>dstBuffer</code> minus <code>4</code>"
         },
         {
           "vuid": "VUID-vkCmdWriteBufferMarker2AMD-dstBuffer-03897",
@@ -24466,6 +24780,12 @@
           "vuid": "VUID-vkCmdWriteBufferMarker2AMD-stage-04957",
           "text": " If the <a href=\"#features-subpassShading\">subpass shading</a> feature is not enabled, pname:stage <strong class=\"purple\">must</strong> not contain <code>VK_PIPELINE_STAGE_2_SUBPASS_SHADING_BIT_HUAWEI</code>"
         }
+      ],
+      "(VK_AMD_buffer_marker)+(VK_KHR_synchronization2)+(VK_HUAWEI_invocation_mask)": [
+        {
+          "vuid": "VUID-vkCmdWriteBufferMarker2AMD-stage-04995",
+          "text": " If the <a href=\"#features-invocationMask\">invocation mask image</a> feature is not enabled, pname:stage <strong class=\"purple\">must</strong> not contain <code>VK_PIPELINE_STAGE_2_INVOCATION_MASK_BIT_HUAWEI</code>"
+        }
       ]
     },
     "vkCmdWriteBufferMarkerAMD": {
@@ -24787,12 +25107,24 @@
       ]
     },
     "VkPipelineInputAssemblyStateCreateInfo": {
-      "core": [
+      "!(VK_EXT_primitive_topology_list_restart)": [
         {
           "vuid": "VUID-VkPipelineInputAssemblyStateCreateInfo-topology-00428",
           "text": " If <code>topology</code> is <code>VK_PRIMITIVE_TOPOLOGY_POINT_LIST</code>, <code>VK_PRIMITIVE_TOPOLOGY_LINE_LIST</code>, <code>VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST</code>, <code>VK_PRIMITIVE_TOPOLOGY_LINE_LIST_WITH_ADJACENCY</code>, <code>VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST_WITH_ADJACENCY</code> or <code>VK_PRIMITIVE_TOPOLOGY_PATCH_LIST</code>, <code>primitiveRestartEnable</code> <strong class=\"purple\">must</strong> be <code>VK_FALSE</code>"
+        }
+      ],
+      "(VK_EXT_primitive_topology_list_restart)": [
+        {
+          "vuid": "VUID-VkPipelineInputAssemblyStateCreateInfo-topology-06252",
+          "text": " If <code>topology</code> is <code>VK_PRIMITIVE_TOPOLOGY_POINT_LIST</code>, <code>VK_PRIMITIVE_TOPOLOGY_LINE_LIST</code>, <code>VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST</code>, <code>VK_PRIMITIVE_TOPOLOGY_LINE_LIST_WITH_ADJACENCY</code> or <code>VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST_WITH_ADJACENCY</code>, the <a href=\"#features-primitiveTopologyListRestart\"><code>primitiveTopologyListRestart</code></a> feature <strong class=\"purple\">must</strong> be enabled"
         },
         {
+          "vuid": "VUID-VkPipelineInputAssemblyStateCreateInfo-topology-06253",
+          "text": " If <code>topology</code> is <code>VK_PRIMITIVE_TOPOLOGY_PATCH_LIST</code>, the <a href=\"#features-primitiveTopologyPatchListRestart\"><code>primitiveTopologyPatchListRestart</code></a> feature <strong class=\"purple\">must</strong> be enabled"
+        }
+      ],
+      "core": [
+        {
           "vuid": "VUID-VkPipelineInputAssemblyStateCreateInfo-topology-00429",
           "text": " If the <a href=\"#features-geometryShader\">geometry shaders</a> feature is not enabled, <code>topology</code> <strong class=\"purple\">must</strong> not be any of <code>VK_PRIMITIVE_TOPOLOGY_LINE_LIST_WITH_ADJACENCY</code>, <code>VK_PRIMITIVE_TOPOLOGY_LINE_STRIP_WITH_ADJACENCY</code>, <code>VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST_WITH_ADJACENCY</code> or <code>VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP_WITH_ADJACENCY</code>"
         },
@@ -24820,7 +25152,7 @@
       "(VK_KHR_portability_subset)": [
         {
           "vuid": "VUID-VkPipelineInputAssemblyStateCreateInfo-triangleFans-04452",
-          "text": " If the <code><a href=\"#VK_KHR_portability_subset\">[VK_KHR_portability_subset]</a></code> extension is enabled, and <a href=\"#VkPhysicalDevicePortabilitySubsetFeaturesKHR\">VkPhysicalDevicePortabilitySubsetFeaturesKHR</a>::<code>triangleFans</code> is <code>VK_FALSE</code>, <code>topology</code> <strong class=\"purple\">must</strong> not be <code>VK_PRIMITIVE_TOPOLOGY_TRIANGLE_FAN</code>."
+          "text": " If the <code><a href=\"#VK_KHR_portability_subset\">[VK_KHR_portability_subset]</a></code> extension is enabled, and <a href=\"#VkPhysicalDevicePortabilitySubsetFeaturesKHR\">VkPhysicalDevicePortabilitySubsetFeaturesKHR</a>::<code>triangleFans</code> is <code>VK_FALSE</code>, <code>topology</code> <strong class=\"purple\">must</strong> not be <code>VK_PRIMITIVE_TOPOLOGY_TRIANGLE_FAN</code>"
         }
       ]
     },
@@ -24956,7 +25288,7 @@
         },
         {
           "vuid": "VUID-vkCmdDraw-commandBuffer-02701",
-          "text": " If the <code>VkPipeline</code> object bound to the pipeline bind point used by this command requires any dynamic state, that state <strong class=\"purple\">must</strong> have been set"
+          "text": " If the <code>VkPipeline</code> object bound to the pipeline bind point used by this command requires any dynamic state, that state <strong class=\"purple\">must</strong> have been set or inherited (if the <code><a href=\"#VK_NV_inherited_viewport_scissor\">VK_NV_inherited_viewport_scissor</a></code> extension is enabled) for <code>commandBuffer</code>, and done so after any previously bound pipeline with the corresponding state not specified as dynamic"
         },
         {
           "vuid": "VUID-vkCmdDraw-None-02859",
@@ -24984,11 +25316,11 @@
         },
         {
           "vuid": "VUID-vkCmdDraw-None-04115",
-          "text": " If a <a href=\"#VkImageView\">VkImageView</a> is accessed using <code>OpImageWrite</code> as a result of this command, then the <code>Type</code> of the <code>Texel</code> operand of that instruction <strong class=\"purple\">must</strong> have at least as many components as the image view&#8217;s format."
+          "text": " If a <a href=\"#VkImageView\">VkImageView</a> is accessed using <code>OpImageWrite</code> as a result of this command, then the <code>Type</code> of the <code>Texel</code> operand of that instruction <strong class=\"purple\">must</strong> have at least as many components as the image view&#8217;s format"
         },
         {
           "vuid": "VUID-vkCmdDraw-OpImageWrite-04469",
-          "text": " If a <a href=\"#VkBufferView\">VkBufferView</a> is accessed using <code>OpImageWrite</code> as a result of this command, then the <code>Type</code> of the <code>Texel</code> operand of that instruction <strong class=\"purple\">must</strong> have at least as many components as the buffer view&#8217;s format."
+          "text": " If a <a href=\"#VkBufferView\">VkBufferView</a> is accessed using <code>OpImageWrite</code> as a result of this command, then the <code>Type</code> of the <code>Texel</code> operand of that instruction <strong class=\"purple\">must</strong> have at least as many components as the buffer view&#8217;s format"
         },
         {
           "vuid": "VUID-vkCmdDraw-renderPass-02684",
@@ -25092,27 +25424,27 @@
       "(VK_EXT_shader_image_atomic_int64)": [
         {
           "vuid": "VUID-vkCmdDraw-SampledType-04470",
-          "text": " If a <a href=\"#VkImageView\">VkImageView</a> with a <a href=\"#VkFormat\">VkFormat</a> that has a 64-bit channel width is accessed as a result of this command, the <code>SampledType</code> of the <code>OpTypeImage</code> operand of that instruction <strong class=\"purple\">must</strong> have a <code>Width</code> of 64."
+          "text": " If a <a href=\"#VkImageView\">VkImageView</a> with a <a href=\"#VkFormat\">VkFormat</a> that has a 64-bit channel width is accessed as a result of this command, the <code>SampledType</code> of the <code>OpTypeImage</code> operand of that instruction <strong class=\"purple\">must</strong> have a <code>Width</code> of 64"
         },
         {
           "vuid": "VUID-vkCmdDraw-SampledType-04471",
-          "text": " If a <a href=\"#VkImageView\">VkImageView</a> with a <a href=\"#VkFormat\">VkFormat</a> that has a channel width less than 64-bit is accessed as a result of this command, the <code>SampledType</code> of the <code>OpTypeImage</code> operand of that instruction <strong class=\"purple\">must</strong> have a <code>Width</code> of 32."
+          "text": " If a <a href=\"#VkImageView\">VkImageView</a> with a <a href=\"#VkFormat\">VkFormat</a> that has a channel width less than 64-bit is accessed as a result of this command, the <code>SampledType</code> of the <code>OpTypeImage</code> operand of that instruction <strong class=\"purple\">must</strong> have a <code>Width</code> of 32"
         },
         {
           "vuid": "VUID-vkCmdDraw-SampledType-04472",
-          "text": " If a <a href=\"#VkBufferView\">VkBufferView</a> with a <a href=\"#VkFormat\">VkFormat</a> that has a 64-bit channel width is accessed as a result of this command, the <code>SampledType</code> of the <code>OpTypeImage</code> operand of that instruction <strong class=\"purple\">must</strong> have a <code>Width</code> of 64."
+          "text": " If a <a href=\"#VkBufferView\">VkBufferView</a> with a <a href=\"#VkFormat\">VkFormat</a> that has a 64-bit channel width is accessed as a result of this command, the <code>SampledType</code> of the <code>OpTypeImage</code> operand of that instruction <strong class=\"purple\">must</strong> have a <code>Width</code> of 64"
         },
         {
           "vuid": "VUID-vkCmdDraw-SampledType-04473",
-          "text": " If a <a href=\"#VkBufferView\">VkBufferView</a> with a <a href=\"#VkFormat\">VkFormat</a> that has a channel width less than 64-bit is accessed as a result of this command, the <code>SampledType</code> of the <code>OpTypeImage</code> operand of that instruction <strong class=\"purple\">must</strong> have a <code>Width</code> of 32."
+          "text": " If a <a href=\"#VkBufferView\">VkBufferView</a> with a <a href=\"#VkFormat\">VkFormat</a> that has a channel width less than 64-bit is accessed as a result of this command, the <code>SampledType</code> of the <code>OpTypeImage</code> operand of that instruction <strong class=\"purple\">must</strong> have a <code>Width</code> of 32"
         },
         {
           "vuid": "VUID-vkCmdDraw-sparseImageInt64Atomics-04474",
-          "text": " If the <a href=\"#features-sparseImageInt64Atomics\"><code>sparseImageInt64Atomics</code></a> feature is not enabled, <a href=\"#VkImage\">VkImage</a> objects created with the <code>VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT</code> flag <strong class=\"purple\">must</strong> not be accessed by atomic instructions through an <code>OpTypeImage</code> with a <code>SampledType</code> with a <code>Width</code> of 64 by this command."
+          "text": " If the <a href=\"#features-sparseImageInt64Atomics\"><code>sparseImageInt64Atomics</code></a> feature is not enabled, <a href=\"#VkImage\">VkImage</a> objects created with the <code>VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT</code> flag <strong class=\"purple\">must</strong> not be accessed by atomic instructions through an <code>OpTypeImage</code> with a <code>SampledType</code> with a <code>Width</code> of 64 by this command"
         },
         {
           "vuid": "VUID-vkCmdDraw-sparseImageInt64Atomics-04475",
-          "text": " If the <a href=\"#features-sparseImageInt64Atomics\"><code>sparseImageInt64Atomics</code></a> feature is not enabled, <a href=\"#VkBuffer\">VkBuffer</a> objects created with the <code>VK_BUFFER_CREATE_SPARSE_RESIDENCY_BIT</code> flag <strong class=\"purple\">must</strong> not be accessed by atomic instructions through an <code>OpTypeImage</code> with a <code>SampledType</code> with a <code>Width</code> of 64 by this command."
+          "text": " If the <a href=\"#features-sparseImageInt64Atomics\"><code>sparseImageInt64Atomics</code></a> feature is not enabled, <a href=\"#VkBuffer\">VkBuffer</a> objects created with the <code>VK_BUFFER_CREATE_SPARSE_RESIDENCY_BIT</code> flag <strong class=\"purple\">must</strong> not be accessed by atomic instructions through an <code>OpTypeImage</code> with a <code>SampledType</code> with a <code>Width</code> of 64 by this command"
         }
       ],
       "(VK_VERSION_1_1,VK_KHR_multiview)": [
@@ -25260,7 +25592,7 @@
         },
         {
           "vuid": "VUID-vkCmdDrawIndexed-commandBuffer-02701",
-          "text": " If the <code>VkPipeline</code> object bound to the pipeline bind point used by this command requires any dynamic state, that state <strong class=\"purple\">must</strong> have been set"
+          "text": " If the <code>VkPipeline</code> object bound to the pipeline bind point used by this command requires any dynamic state, that state <strong class=\"purple\">must</strong> have been set or inherited (if the <code><a href=\"#VK_NV_inherited_viewport_scissor\">VK_NV_inherited_viewport_scissor</a></code> extension is enabled) for <code>commandBuffer</code>, and done so after any previously bound pipeline with the corresponding state not specified as dynamic"
         },
         {
           "vuid": "VUID-vkCmdDrawIndexed-None-02859",
@@ -25288,11 +25620,11 @@
         },
         {
           "vuid": "VUID-vkCmdDrawIndexed-None-04115",
-          "text": " If a <a href=\"#VkImageView\">VkImageView</a> is accessed using <code>OpImageWrite</code> as a result of this command, then the <code>Type</code> of the <code>Texel</code> operand of that instruction <strong class=\"purple\">must</strong> have at least as many components as the image view&#8217;s format."
+          "text": " If a <a href=\"#VkImageView\">VkImageView</a> is accessed using <code>OpImageWrite</code> as a result of this command, then the <code>Type</code> of the <code>Texel</code> operand of that instruction <strong class=\"purple\">must</strong> have at least as many components as the image view&#8217;s format"
         },
         {
           "vuid": "VUID-vkCmdDrawIndexed-OpImageWrite-04469",
-          "text": " If a <a href=\"#VkBufferView\">VkBufferView</a> is accessed using <code>OpImageWrite</code> as a result of this command, then the <code>Type</code> of the <code>Texel</code> operand of that instruction <strong class=\"purple\">must</strong> have at least as many components as the buffer view&#8217;s format."
+          "text": " If a <a href=\"#VkBufferView\">VkBufferView</a> is accessed using <code>OpImageWrite</code> as a result of this command, then the <code>Type</code> of the <code>Texel</code> operand of that instruction <strong class=\"purple\">must</strong> have at least as many components as the buffer view&#8217;s format"
         },
         {
           "vuid": "VUID-vkCmdDrawIndexed-renderPass-02684",
@@ -25400,27 +25732,27 @@
       "(VK_EXT_shader_image_atomic_int64)": [
         {
           "vuid": "VUID-vkCmdDrawIndexed-SampledType-04470",
-          "text": " If a <a href=\"#VkImageView\">VkImageView</a> with a <a href=\"#VkFormat\">VkFormat</a> that has a 64-bit channel width is accessed as a result of this command, the <code>SampledType</code> of the <code>OpTypeImage</code> operand of that instruction <strong class=\"purple\">must</strong> have a <code>Width</code> of 64."
+          "text": " If a <a href=\"#VkImageView\">VkImageView</a> with a <a href=\"#VkFormat\">VkFormat</a> that has a 64-bit channel width is accessed as a result of this command, the <code>SampledType</code> of the <code>OpTypeImage</code> operand of that instruction <strong class=\"purple\">must</strong> have a <code>Width</code> of 64"
         },
         {
           "vuid": "VUID-vkCmdDrawIndexed-SampledType-04471",
-          "text": " If a <a href=\"#VkImageView\">VkImageView</a> with a <a href=\"#VkFormat\">VkFormat</a> that has a channel width less than 64-bit is accessed as a result of this command, the <code>SampledType</code> of the <code>OpTypeImage</code> operand of that instruction <strong class=\"purple\">must</strong> have a <code>Width</code> of 32."
+          "text": " If a <a href=\"#VkImageView\">VkImageView</a> with a <a href=\"#VkFormat\">VkFormat</a> that has a channel width less than 64-bit is accessed as a result of this command, the <code>SampledType</code> of the <code>OpTypeImage</code> operand of that instruction <strong class=\"purple\">must</strong> have a <code>Width</code> of 32"
         },
         {
           "vuid": "VUID-vkCmdDrawIndexed-SampledType-04472",
-          "text": " If a <a href=\"#VkBufferView\">VkBufferView</a> with a <a href=\"#VkFormat\">VkFormat</a> that has a 64-bit channel width is accessed as a result of this command, the <code>SampledType</code> of the <code>OpTypeImage</code> operand of that instruction <strong class=\"purple\">must</strong> have a <code>Width</code> of 64."
+          "text": " If a <a href=\"#VkBufferView\">VkBufferView</a> with a <a href=\"#VkFormat\">VkFormat</a> that has a 64-bit channel width is accessed as a result of this command, the <code>SampledType</code> of the <code>OpTypeImage</code> operand of that instruction <strong class=\"purple\">must</strong> have a <code>Width</code> of 64"
         },
         {
           "vuid": "VUID-vkCmdDrawIndexed-SampledType-04473",
-          "text": " If a <a href=\"#VkBufferView\">VkBufferView</a> with a <a href=\"#VkFormat\">VkFormat</a> that has a channel width less than 64-bit is accessed as a result of this command, the <code>SampledType</code> of the <code>OpTypeImage</code> operand of that instruction <strong class=\"purple\">must</strong> have a <code>Width</code> of 32."
+          "text": " If a <a href=\"#VkBufferView\">VkBufferView</a> with a <a href=\"#VkFormat\">VkFormat</a> that has a channel width less than 64-bit is accessed as a result of this command, the <code>SampledType</code> of the <code>OpTypeImage</code> operand of that instruction <strong class=\"purple\">must</strong> have a <code>Width</code> of 32"
         },
         {
           "vuid": "VUID-vkCmdDrawIndexed-sparseImageInt64Atomics-04474",
-          "text": " If the <a href=\"#features-sparseImageInt64Atomics\"><code>sparseImageInt64Atomics</code></a> feature is not enabled, <a href=\"#VkImage\">VkImage</a> objects created with the <code>VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT</code> flag <strong class=\"purple\">must</strong> not be accessed by atomic instructions through an <code>OpTypeImage</code> with a <code>SampledType</code> with a <code>Width</code> of 64 by this command."
+          "text": " If the <a href=\"#features-sparseImageInt64Atomics\"><code>sparseImageInt64Atomics</code></a> feature is not enabled, <a href=\"#VkImage\">VkImage</a> objects created with the <code>VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT</code> flag <strong class=\"purple\">must</strong> not be accessed by atomic instructions through an <code>OpTypeImage</code> with a <code>SampledType</code> with a <code>Width</code> of 64 by this command"
         },
         {
           "vuid": "VUID-vkCmdDrawIndexed-sparseImageInt64Atomics-04475",
-          "text": " If the <a href=\"#features-sparseImageInt64Atomics\"><code>sparseImageInt64Atomics</code></a> feature is not enabled, <a href=\"#VkBuffer\">VkBuffer</a> objects created with the <code>VK_BUFFER_CREATE_SPARSE_RESIDENCY_BIT</code> flag <strong class=\"purple\">must</strong> not be accessed by atomic instructions through an <code>OpTypeImage</code> with a <code>SampledType</code> with a <code>Width</code> of 64 by this command."
+          "text": " If the <a href=\"#features-sparseImageInt64Atomics\"><code>sparseImageInt64Atomics</code></a> feature is not enabled, <a href=\"#VkBuffer\">VkBuffer</a> objects created with the <code>VK_BUFFER_CREATE_SPARSE_RESIDENCY_BIT</code> flag <strong class=\"purple\">must</strong> not be accessed by atomic instructions through an <code>OpTypeImage</code> with a <code>SampledType</code> with a <code>Width</code> of 64 by this command"
         }
       ],
       "(VK_VERSION_1_1,VK_KHR_multiview)": [
@@ -25568,7 +25900,7 @@
         },
         {
           "vuid": "VUID-vkCmdDrawMultiEXT-commandBuffer-02701",
-          "text": " If the <code>VkPipeline</code> object bound to the pipeline bind point used by this command requires any dynamic state, that state <strong class=\"purple\">must</strong> have been set"
+          "text": " If the <code>VkPipeline</code> object bound to the pipeline bind point used by this command requires any dynamic state, that state <strong class=\"purple\">must</strong> have been set or inherited (if the <code><a href=\"#VK_NV_inherited_viewport_scissor\">VK_NV_inherited_viewport_scissor</a></code> extension is enabled) for <code>commandBuffer</code>, and done so after any previously bound pipeline with the corresponding state not specified as dynamic"
         },
         {
           "vuid": "VUID-vkCmdDrawMultiEXT-None-02859",
@@ -25596,11 +25928,11 @@
         },
         {
           "vuid": "VUID-vkCmdDrawMultiEXT-None-04115",
-          "text": " If a <a href=\"#VkImageView\">VkImageView</a> is accessed using <code>OpImageWrite</code> as a result of this command, then the <code>Type</code> of the <code>Texel</code> operand of that instruction <strong class=\"purple\">must</strong> have at least as many components as the image view&#8217;s format."
+          "text": " If a <a href=\"#VkImageView\">VkImageView</a> is accessed using <code>OpImageWrite</code> as a result of this command, then the <code>Type</code> of the <code>Texel</code> operand of that instruction <strong class=\"purple\">must</strong> have at least as many components as the image view&#8217;s format"
         },
         {
           "vuid": "VUID-vkCmdDrawMultiEXT-OpImageWrite-04469",
-          "text": " If a <a href=\"#VkBufferView\">VkBufferView</a> is accessed using <code>OpImageWrite</code> as a result of this command, then the <code>Type</code> of the <code>Texel</code> operand of that instruction <strong class=\"purple\">must</strong> have at least as many components as the buffer view&#8217;s format."
+          "text": " If a <a href=\"#VkBufferView\">VkBufferView</a> is accessed using <code>OpImageWrite</code> as a result of this command, then the <code>Type</code> of the <code>Texel</code> operand of that instruction <strong class=\"purple\">must</strong> have at least as many components as the buffer view&#8217;s format"
         },
         {
           "vuid": "VUID-vkCmdDrawMultiEXT-renderPass-02684",
@@ -25720,27 +26052,27 @@
       "(VK_EXT_multi_draw)+(VK_EXT_shader_image_atomic_int64)": [
         {
           "vuid": "VUID-vkCmdDrawMultiEXT-SampledType-04470",
-          "text": " If a <a href=\"#VkImageView\">VkImageView</a> with a <a href=\"#VkFormat\">VkFormat</a> that has a 64-bit channel width is accessed as a result of this command, the <code>SampledType</code> of the <code>OpTypeImage</code> operand of that instruction <strong class=\"purple\">must</strong> have a <code>Width</code> of 64."
+          "text": " If a <a href=\"#VkImageView\">VkImageView</a> with a <a href=\"#VkFormat\">VkFormat</a> that has a 64-bit channel width is accessed as a result of this command, the <code>SampledType</code> of the <code>OpTypeImage</code> operand of that instruction <strong class=\"purple\">must</strong> have a <code>Width</code> of 64"
         },
         {
           "vuid": "VUID-vkCmdDrawMultiEXT-SampledType-04471",
-          "text": " If a <a href=\"#VkImageView\">VkImageView</a> with a <a href=\"#VkFormat\">VkFormat</a> that has a channel width less than 64-bit is accessed as a result of this command, the <code>SampledType</code> of the <code>OpTypeImage</code> operand of that instruction <strong class=\"purple\">must</strong> have a <code>Width</code> of 32."
+          "text": " If a <a href=\"#VkImageView\">VkImageView</a> with a <a href=\"#VkFormat\">VkFormat</a> that has a channel width less than 64-bit is accessed as a result of this command, the <code>SampledType</code> of the <code>OpTypeImage</code> operand of that instruction <strong class=\"purple\">must</strong> have a <code>Width</code> of 32"
         },
         {
           "vuid": "VUID-vkCmdDrawMultiEXT-SampledType-04472",
-          "text": " If a <a href=\"#VkBufferView\">VkBufferView</a> with a <a href=\"#VkFormat\">VkFormat</a> that has a 64-bit channel width is accessed as a result of this command, the <code>SampledType</code> of the <code>OpTypeImage</code> operand of that instruction <strong class=\"purple\">must</strong> have a <code>Width</code> of 64."
+          "text": " If a <a href=\"#VkBufferView\">VkBufferView</a> with a <a href=\"#VkFormat\">VkFormat</a> that has a 64-bit channel width is accessed as a result of this command, the <code>SampledType</code> of the <code>OpTypeImage</code> operand of that instruction <strong class=\"purple\">must</strong> have a <code>Width</code> of 64"
         },
         {
           "vuid": "VUID-vkCmdDrawMultiEXT-SampledType-04473",
-          "text": " If a <a href=\"#VkBufferView\">VkBufferView</a> with a <a href=\"#VkFormat\">VkFormat</a> that has a channel width less than 64-bit is accessed as a result of this command, the <code>SampledType</code> of the <code>OpTypeImage</code> operand of that instruction <strong class=\"purple\">must</strong> have a <code>Width</code> of 32."
+          "text": " If a <a href=\"#VkBufferView\">VkBufferView</a> with a <a href=\"#VkFormat\">VkFormat</a> that has a channel width less than 64-bit is accessed as a result of this command, the <code>SampledType</code> of the <code>OpTypeImage</code> operand of that instruction <strong class=\"purple\">must</strong> have a <code>Width</code> of 32"
         },
         {
           "vuid": "VUID-vkCmdDrawMultiEXT-sparseImageInt64Atomics-04474",
-          "text": " If the <a href=\"#features-sparseImageInt64Atomics\"><code>sparseImageInt64Atomics</code></a> feature is not enabled, <a href=\"#VkImage\">VkImage</a> objects created with the <code>VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT</code> flag <strong class=\"purple\">must</strong> not be accessed by atomic instructions through an <code>OpTypeImage</code> with a <code>SampledType</code> with a <code>Width</code> of 64 by this command."
+          "text": " If the <a href=\"#features-sparseImageInt64Atomics\"><code>sparseImageInt64Atomics</code></a> feature is not enabled, <a href=\"#VkImage\">VkImage</a> objects created with the <code>VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT</code> flag <strong class=\"purple\">must</strong> not be accessed by atomic instructions through an <code>OpTypeImage</code> with a <code>SampledType</code> with a <code>Width</code> of 64 by this command"
         },
         {
           "vuid": "VUID-vkCmdDrawMultiEXT-sparseImageInt64Atomics-04475",
-          "text": " If the <a href=\"#features-sparseImageInt64Atomics\"><code>sparseImageInt64Atomics</code></a> feature is not enabled, <a href=\"#VkBuffer\">VkBuffer</a> objects created with the <code>VK_BUFFER_CREATE_SPARSE_RESIDENCY_BIT</code> flag <strong class=\"purple\">must</strong> not be accessed by atomic instructions through an <code>OpTypeImage</code> with a <code>SampledType</code> with a <code>Width</code> of 64 by this command."
+          "text": " If the <a href=\"#features-sparseImageInt64Atomics\"><code>sparseImageInt64Atomics</code></a> feature is not enabled, <a href=\"#VkBuffer\">VkBuffer</a> objects created with the <code>VK_BUFFER_CREATE_SPARSE_RESIDENCY_BIT</code> flag <strong class=\"purple\">must</strong> not be accessed by atomic instructions through an <code>OpTypeImage</code> with a <code>SampledType</code> with a <code>Width</code> of 64 by this command"
         }
       ],
       "(VK_EXT_multi_draw)+(VK_VERSION_1_1,VK_KHR_multiview)": [
@@ -25888,7 +26220,7 @@
         },
         {
           "vuid": "VUID-vkCmdDrawMultiIndexedEXT-commandBuffer-02701",
-          "text": " If the <code>VkPipeline</code> object bound to the pipeline bind point used by this command requires any dynamic state, that state <strong class=\"purple\">must</strong> have been set"
+          "text": " If the <code>VkPipeline</code> object bound to the pipeline bind point used by this command requires any dynamic state, that state <strong class=\"purple\">must</strong> have been set or inherited (if the <code><a href=\"#VK_NV_inherited_viewport_scissor\">VK_NV_inherited_viewport_scissor</a></code> extension is enabled) for <code>commandBuffer</code>, and done so after any previously bound pipeline with the corresponding state not specified as dynamic"
         },
         {
           "vuid": "VUID-vkCmdDrawMultiIndexedEXT-None-02859",
@@ -25916,11 +26248,11 @@
         },
         {
           "vuid": "VUID-vkCmdDrawMultiIndexedEXT-None-04115",
-          "text": " If a <a href=\"#VkImageView\">VkImageView</a> is accessed using <code>OpImageWrite</code> as a result of this command, then the <code>Type</code> of the <code>Texel</code> operand of that instruction <strong class=\"purple\">must</strong> have at least as many components as the image view&#8217;s format."
+          "text": " If a <a href=\"#VkImageView\">VkImageView</a> is accessed using <code>OpImageWrite</code> as a result of this command, then the <code>Type</code> of the <code>Texel</code> operand of that instruction <strong class=\"purple\">must</strong> have at least as many components as the image view&#8217;s format"
         },
         {
           "vuid": "VUID-vkCmdDrawMultiIndexedEXT-OpImageWrite-04469",
-          "text": " If a <a href=\"#VkBufferView\">VkBufferView</a> is accessed using <code>OpImageWrite</code> as a result of this command, then the <code>Type</code> of the <code>Texel</code> operand of that instruction <strong class=\"purple\">must</strong> have at least as many components as the buffer view&#8217;s format."
+          "text": " If a <a href=\"#VkBufferView\">VkBufferView</a> is accessed using <code>OpImageWrite</code> as a result of this command, then the <code>Type</code> of the <code>Texel</code> operand of that instruction <strong class=\"purple\">must</strong> have at least as many components as the buffer view&#8217;s format"
         },
         {
           "vuid": "VUID-vkCmdDrawMultiIndexedEXT-renderPass-02684",
@@ -26048,27 +26380,27 @@
       "(VK_EXT_multi_draw)+(VK_EXT_shader_image_atomic_int64)": [
         {
           "vuid": "VUID-vkCmdDrawMultiIndexedEXT-SampledType-04470",
-          "text": " If a <a href=\"#VkImageView\">VkImageView</a> with a <a href=\"#VkFormat\">VkFormat</a> that has a 64-bit channel width is accessed as a result of this command, the <code>SampledType</code> of the <code>OpTypeImage</code> operand of that instruction <strong class=\"purple\">must</strong> have a <code>Width</code> of 64."
+          "text": " If a <a href=\"#VkImageView\">VkImageView</a> with a <a href=\"#VkFormat\">VkFormat</a> that has a 64-bit channel width is accessed as a result of this command, the <code>SampledType</code> of the <code>OpTypeImage</code> operand of that instruction <strong class=\"purple\">must</strong> have a <code>Width</code> of 64"
         },
         {
           "vuid": "VUID-vkCmdDrawMultiIndexedEXT-SampledType-04471",
-          "text": " If a <a href=\"#VkImageView\">VkImageView</a> with a <a href=\"#VkFormat\">VkFormat</a> that has a channel width less than 64-bit is accessed as a result of this command, the <code>SampledType</code> of the <code>OpTypeImage</code> operand of that instruction <strong class=\"purple\">must</strong> have a <code>Width</code> of 32."
+          "text": " If a <a href=\"#VkImageView\">VkImageView</a> with a <a href=\"#VkFormat\">VkFormat</a> that has a channel width less than 64-bit is accessed as a result of this command, the <code>SampledType</code> of the <code>OpTypeImage</code> operand of that instruction <strong class=\"purple\">must</strong> have a <code>Width</code> of 32"
         },
         {
           "vuid": "VUID-vkCmdDrawMultiIndexedEXT-SampledType-04472",
-          "text": " If a <a href=\"#VkBufferView\">VkBufferView</a> with a <a href=\"#VkFormat\">VkFormat</a> that has a 64-bit channel width is accessed as a result of this command, the <code>SampledType</code> of the <code>OpTypeImage</code> operand of that instruction <strong class=\"purple\">must</strong> have a <code>Width</code> of 64."
+          "text": " If a <a href=\"#VkBufferView\">VkBufferView</a> with a <a href=\"#VkFormat\">VkFormat</a> that has a 64-bit channel width is accessed as a result of this command, the <code>SampledType</code> of the <code>OpTypeImage</code> operand of that instruction <strong class=\"purple\">must</strong> have a <code>Width</code> of 64"
         },
         {
           "vuid": "VUID-vkCmdDrawMultiIndexedEXT-SampledType-04473",
-          "text": " If a <a href=\"#VkBufferView\">VkBufferView</a> with a <a href=\"#VkFormat\">VkFormat</a> that has a channel width less than 64-bit is accessed as a result of this command, the <code>SampledType</code> of the <code>OpTypeImage</code> operand of that instruction <strong class=\"purple\">must</strong> have a <code>Width</code> of 32."
+          "text": " If a <a href=\"#VkBufferView\">VkBufferView</a> with a <a href=\"#VkFormat\">VkFormat</a> that has a channel width less than 64-bit is accessed as a result of this command, the <code>SampledType</code> of the <code>OpTypeImage</code> operand of that instruction <strong class=\"purple\">must</strong> have a <code>Width</code> of 32"
         },
         {
           "vuid": "VUID-vkCmdDrawMultiIndexedEXT-sparseImageInt64Atomics-04474",
-          "text": " If the <a href=\"#features-sparseImageInt64Atomics\"><code>sparseImageInt64Atomics</code></a> feature is not enabled, <a href=\"#VkImage\">VkImage</a> objects created with the <code>VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT</code> flag <strong class=\"purple\">must</strong> not be accessed by atomic instructions through an <code>OpTypeImage</code> with a <code>SampledType</code> with a <code>Width</code> of 64 by this command."
+          "text": " If the <a href=\"#features-sparseImageInt64Atomics\"><code>sparseImageInt64Atomics</code></a> feature is not enabled, <a href=\"#VkImage\">VkImage</a> objects created with the <code>VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT</code> flag <strong class=\"purple\">must</strong> not be accessed by atomic instructions through an <code>OpTypeImage</code> with a <code>SampledType</code> with a <code>Width</code> of 64 by this command"
         },
         {
           "vuid": "VUID-vkCmdDrawMultiIndexedEXT-sparseImageInt64Atomics-04475",
-          "text": " If the <a href=\"#features-sparseImageInt64Atomics\"><code>sparseImageInt64Atomics</code></a> feature is not enabled, <a href=\"#VkBuffer\">VkBuffer</a> objects created with the <code>VK_BUFFER_CREATE_SPARSE_RESIDENCY_BIT</code> flag <strong class=\"purple\">must</strong> not be accessed by atomic instructions through an <code>OpTypeImage</code> with a <code>SampledType</code> with a <code>Width</code> of 64 by this command."
+          "text": " If the <a href=\"#features-sparseImageInt64Atomics\"><code>sparseImageInt64Atomics</code></a> feature is not enabled, <a href=\"#VkBuffer\">VkBuffer</a> objects created with the <code>VK_BUFFER_CREATE_SPARSE_RESIDENCY_BIT</code> flag <strong class=\"purple\">must</strong> not be accessed by atomic instructions through an <code>OpTypeImage</code> with a <code>SampledType</code> with a <code>Width</code> of 64 by this command"
         }
       ],
       "(VK_EXT_multi_draw)+(VK_VERSION_1_1,VK_KHR_multiview)": [
@@ -26216,7 +26548,7 @@
         },
         {
           "vuid": "VUID-vkCmdDrawIndirect-commandBuffer-02701",
-          "text": " If the <code>VkPipeline</code> object bound to the pipeline bind point used by this command requires any dynamic state, that state <strong class=\"purple\">must</strong> have been set"
+          "text": " If the <code>VkPipeline</code> object bound to the pipeline bind point used by this command requires any dynamic state, that state <strong class=\"purple\">must</strong> have been set or inherited (if the <code><a href=\"#VK_NV_inherited_viewport_scissor\">VK_NV_inherited_viewport_scissor</a></code> extension is enabled) for <code>commandBuffer</code>, and done so after any previously bound pipeline with the corresponding state not specified as dynamic"
         },
         {
           "vuid": "VUID-vkCmdDrawIndirect-None-02859",
@@ -26244,11 +26576,11 @@
         },
         {
           "vuid": "VUID-vkCmdDrawIndirect-None-04115",
-          "text": " If a <a href=\"#VkImageView\">VkImageView</a> is accessed using <code>OpImageWrite</code> as a result of this command, then the <code>Type</code> of the <code>Texel</code> operand of that instruction <strong class=\"purple\">must</strong> have at least as many components as the image view&#8217;s format."
+          "text": " If a <a href=\"#VkImageView\">VkImageView</a> is accessed using <code>OpImageWrite</code> as a result of this command, then the <code>Type</code> of the <code>Texel</code> operand of that instruction <strong class=\"purple\">must</strong> have at least as many components as the image view&#8217;s format"
         },
         {
           "vuid": "VUID-vkCmdDrawIndirect-OpImageWrite-04469",
-          "text": " If a <a href=\"#VkBufferView\">VkBufferView</a> is accessed using <code>OpImageWrite</code> as a result of this command, then the <code>Type</code> of the <code>Texel</code> operand of that instruction <strong class=\"purple\">must</strong> have at least as many components as the buffer view&#8217;s format."
+          "text": " If a <a href=\"#VkBufferView\">VkBufferView</a> is accessed using <code>OpImageWrite</code> as a result of this command, then the <code>Type</code> of the <code>Texel</code> operand of that instruction <strong class=\"purple\">must</strong> have at least as many components as the buffer view&#8217;s format"
         },
         {
           "vuid": "VUID-vkCmdDrawIndirect-renderPass-02684",
@@ -26388,27 +26720,27 @@
       "(VK_EXT_shader_image_atomic_int64)": [
         {
           "vuid": "VUID-vkCmdDrawIndirect-SampledType-04470",
-          "text": " If a <a href=\"#VkImageView\">VkImageView</a> with a <a href=\"#VkFormat\">VkFormat</a> that has a 64-bit channel width is accessed as a result of this command, the <code>SampledType</code> of the <code>OpTypeImage</code> operand of that instruction <strong class=\"purple\">must</strong> have a <code>Width</code> of 64."
+          "text": " If a <a href=\"#VkImageView\">VkImageView</a> with a <a href=\"#VkFormat\">VkFormat</a> that has a 64-bit channel width is accessed as a result of this command, the <code>SampledType</code> of the <code>OpTypeImage</code> operand of that instruction <strong class=\"purple\">must</strong> have a <code>Width</code> of 64"
         },
         {
           "vuid": "VUID-vkCmdDrawIndirect-SampledType-04471",
-          "text": " If a <a href=\"#VkImageView\">VkImageView</a> with a <a href=\"#VkFormat\">VkFormat</a> that has a channel width less than 64-bit is accessed as a result of this command, the <code>SampledType</code> of the <code>OpTypeImage</code> operand of that instruction <strong class=\"purple\">must</strong> have a <code>Width</code> of 32."
+          "text": " If a <a href=\"#VkImageView\">VkImageView</a> with a <a href=\"#VkFormat\">VkFormat</a> that has a channel width less than 64-bit is accessed as a result of this command, the <code>SampledType</code> of the <code>OpTypeImage</code> operand of that instruction <strong class=\"purple\">must</strong> have a <code>Width</code> of 32"
         },
         {
           "vuid": "VUID-vkCmdDrawIndirect-SampledType-04472",
-          "text": " If a <a href=\"#VkBufferView\">VkBufferView</a> with a <a href=\"#VkFormat\">VkFormat</a> that has a 64-bit channel width is accessed as a result of this command, the <code>SampledType</code> of the <code>OpTypeImage</code> operand of that instruction <strong class=\"purple\">must</strong> have a <code>Width</code> of 64."
+          "text": " If a <a href=\"#VkBufferView\">VkBufferView</a> with a <a href=\"#VkFormat\">VkFormat</a> that has a 64-bit channel width is accessed as a result of this command, the <code>SampledType</code> of the <code>OpTypeImage</code> operand of that instruction <strong class=\"purple\">must</strong> have a <code>Width</code> of 64"
         },
         {
           "vuid": "VUID-vkCmdDrawIndirect-SampledType-04473",
-          "text": " If a <a href=\"#VkBufferView\">VkBufferView</a> with a <a href=\"#VkFormat\">VkFormat</a> that has a channel width less than 64-bit is accessed as a result of this command, the <code>SampledType</code> of the <code>OpTypeImage</code> operand of that instruction <strong class=\"purple\">must</strong> have a <code>Width</code> of 32."
+          "text": " If a <a href=\"#VkBufferView\">VkBufferView</a> with a <a href=\"#VkFormat\">VkFormat</a> that has a channel width less than 64-bit is accessed as a result of this command, the <code>SampledType</code> of the <code>OpTypeImage</code> operand of that instruction <strong class=\"purple\">must</strong> have a <code>Width</code> of 32"
         },
         {
           "vuid": "VUID-vkCmdDrawIndirect-sparseImageInt64Atomics-04474",
-          "text": " If the <a href=\"#features-sparseImageInt64Atomics\"><code>sparseImageInt64Atomics</code></a> feature is not enabled, <a href=\"#VkImage\">VkImage</a> objects created with the <code>VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT</code> flag <strong class=\"purple\">must</strong> not be accessed by atomic instructions through an <code>OpTypeImage</code> with a <code>SampledType</code> with a <code>Width</code> of 64 by this command."
+          "text": " If the <a href=\"#features-sparseImageInt64Atomics\"><code>sparseImageInt64Atomics</code></a> feature is not enabled, <a href=\"#VkImage\">VkImage</a> objects created with the <code>VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT</code> flag <strong class=\"purple\">must</strong> not be accessed by atomic instructions through an <code>OpTypeImage</code> with a <code>SampledType</code> with a <code>Width</code> of 64 by this command"
         },
         {
           "vuid": "VUID-vkCmdDrawIndirect-sparseImageInt64Atomics-04475",
-          "text": " If the <a href=\"#features-sparseImageInt64Atomics\"><code>sparseImageInt64Atomics</code></a> feature is not enabled, <a href=\"#VkBuffer\">VkBuffer</a> objects created with the <code>VK_BUFFER_CREATE_SPARSE_RESIDENCY_BIT</code> flag <strong class=\"purple\">must</strong> not be accessed by atomic instructions through an <code>OpTypeImage</code> with a <code>SampledType</code> with a <code>Width</code> of 64 by this command."
+          "text": " If the <a href=\"#features-sparseImageInt64Atomics\"><code>sparseImageInt64Atomics</code></a> feature is not enabled, <a href=\"#VkBuffer\">VkBuffer</a> objects created with the <code>VK_BUFFER_CREATE_SPARSE_RESIDENCY_BIT</code> flag <strong class=\"purple\">must</strong> not be accessed by atomic instructions through an <code>OpTypeImage</code> with a <code>SampledType</code> with a <code>Width</code> of 64 by this command"
         }
       ],
       "(VK_VERSION_1_1,VK_KHR_multiview)": [
@@ -26568,7 +26900,7 @@
         },
         {
           "vuid": "VUID-vkCmdDrawIndirectCount-commandBuffer-02701",
-          "text": " If the <code>VkPipeline</code> object bound to the pipeline bind point used by this command requires any dynamic state, that state <strong class=\"purple\">must</strong> have been set"
+          "text": " If the <code>VkPipeline</code> object bound to the pipeline bind point used by this command requires any dynamic state, that state <strong class=\"purple\">must</strong> have been set or inherited (if the <code><a href=\"#VK_NV_inherited_viewport_scissor\">VK_NV_inherited_viewport_scissor</a></code> extension is enabled) for <code>commandBuffer</code>, and done so after any previously bound pipeline with the corresponding state not specified as dynamic"
         },
         {
           "vuid": "VUID-vkCmdDrawIndirectCount-None-02859",
@@ -26596,11 +26928,11 @@
         },
         {
           "vuid": "VUID-vkCmdDrawIndirectCount-None-04115",
-          "text": " If a <a href=\"#VkImageView\">VkImageView</a> is accessed using <code>OpImageWrite</code> as a result of this command, then the <code>Type</code> of the <code>Texel</code> operand of that instruction <strong class=\"purple\">must</strong> have at least as many components as the image view&#8217;s format."
+          "text": " If a <a href=\"#VkImageView\">VkImageView</a> is accessed using <code>OpImageWrite</code> as a result of this command, then the <code>Type</code> of the <code>Texel</code> operand of that instruction <strong class=\"purple\">must</strong> have at least as many components as the image view&#8217;s format"
         },
         {
           "vuid": "VUID-vkCmdDrawIndirectCount-OpImageWrite-04469",
-          "text": " If a <a href=\"#VkBufferView\">VkBufferView</a> is accessed using <code>OpImageWrite</code> as a result of this command, then the <code>Type</code> of the <code>Texel</code> operand of that instruction <strong class=\"purple\">must</strong> have at least as many components as the buffer view&#8217;s format."
+          "text": " If a <a href=\"#VkBufferView\">VkBufferView</a> is accessed using <code>OpImageWrite</code> as a result of this command, then the <code>Type</code> of the <code>Texel</code> operand of that instruction <strong class=\"purple\">must</strong> have at least as many components as the buffer view&#8217;s format"
         },
         {
           "vuid": "VUID-vkCmdDrawIndirectCount-renderPass-02684",
@@ -26756,27 +27088,27 @@
       "(VK_VERSION_1_2,VK_KHR_draw_indirect_count)+(VK_EXT_shader_image_atomic_int64)": [
         {
           "vuid": "VUID-vkCmdDrawIndirectCount-SampledType-04470",
-          "text": " If a <a href=\"#VkImageView\">VkImageView</a> with a <a href=\"#VkFormat\">VkFormat</a> that has a 64-bit channel width is accessed as a result of this command, the <code>SampledType</code> of the <code>OpTypeImage</code> operand of that instruction <strong class=\"purple\">must</strong> have a <code>Width</code> of 64."
+          "text": " If a <a href=\"#VkImageView\">VkImageView</a> with a <a href=\"#VkFormat\">VkFormat</a> that has a 64-bit channel width is accessed as a result of this command, the <code>SampledType</code> of the <code>OpTypeImage</code> operand of that instruction <strong class=\"purple\">must</strong> have a <code>Width</code> of 64"
         },
         {
           "vuid": "VUID-vkCmdDrawIndirectCount-SampledType-04471",
-          "text": " If a <a href=\"#VkImageView\">VkImageView</a> with a <a href=\"#VkFormat\">VkFormat</a> that has a channel width less than 64-bit is accessed as a result of this command, the <code>SampledType</code> of the <code>OpTypeImage</code> operand of that instruction <strong class=\"purple\">must</strong> have a <code>Width</code> of 32."
+          "text": " If a <a href=\"#VkImageView\">VkImageView</a> with a <a href=\"#VkFormat\">VkFormat</a> that has a channel width less than 64-bit is accessed as a result of this command, the <code>SampledType</code> of the <code>OpTypeImage</code> operand of that instruction <strong class=\"purple\">must</strong> have a <code>Width</code> of 32"
         },
         {
           "vuid": "VUID-vkCmdDrawIndirectCount-SampledType-04472",
-          "text": " If a <a href=\"#VkBufferView\">VkBufferView</a> with a <a href=\"#VkFormat\">VkFormat</a> that has a 64-bit channel width is accessed as a result of this command, the <code>SampledType</code> of the <code>OpTypeImage</code> operand of that instruction <strong class=\"purple\">must</strong> have a <code>Width</code> of 64."
+          "text": " If a <a href=\"#VkBufferView\">VkBufferView</a> with a <a href=\"#VkFormat\">VkFormat</a> that has a 64-bit channel width is accessed as a result of this command, the <code>SampledType</code> of the <code>OpTypeImage</code> operand of that instruction <strong class=\"purple\">must</strong> have a <code>Width</code> of 64"
         },
         {
           "vuid": "VUID-vkCmdDrawIndirectCount-SampledType-04473",
-          "text": " If a <a href=\"#VkBufferView\">VkBufferView</a> with a <a href=\"#VkFormat\">VkFormat</a> that has a channel width less than 64-bit is accessed as a result of this command, the <code>SampledType</code> of the <code>OpTypeImage</code> operand of that instruction <strong class=\"purple\">must</strong> have a <code>Width</code> of 32."
+          "text": " If a <a href=\"#VkBufferView\">VkBufferView</a> with a <a href=\"#VkFormat\">VkFormat</a> that has a channel width less than 64-bit is accessed as a result of this command, the <code>SampledType</code> of the <code>OpTypeImage</code> operand of that instruction <strong class=\"purple\">must</strong> have a <code>Width</code> of 32"
         },
         {
           "vuid": "VUID-vkCmdDrawIndirectCount-sparseImageInt64Atomics-04474",
-          "text": " If the <a href=\"#features-sparseImageInt64Atomics\"><code>sparseImageInt64Atomics</code></a> feature is not enabled, <a href=\"#VkImage\">VkImage</a> objects created with the <code>VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT</code> flag <strong class=\"purple\">must</strong> not be accessed by atomic instructions through an <code>OpTypeImage</code> with a <code>SampledType</code> with a <code>Width</code> of 64 by this command."
+          "text": " If the <a href=\"#features-sparseImageInt64Atomics\"><code>sparseImageInt64Atomics</code></a> feature is not enabled, <a href=\"#VkImage\">VkImage</a> objects created with the <code>VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT</code> flag <strong class=\"purple\">must</strong> not be accessed by atomic instructions through an <code>OpTypeImage</code> with a <code>SampledType</code> with a <code>Width</code> of 64 by this command"
         },
         {
           "vuid": "VUID-vkCmdDrawIndirectCount-sparseImageInt64Atomics-04475",
-          "text": " If the <a href=\"#features-sparseImageInt64Atomics\"><code>sparseImageInt64Atomics</code></a> feature is not enabled, <a href=\"#VkBuffer\">VkBuffer</a> objects created with the <code>VK_BUFFER_CREATE_SPARSE_RESIDENCY_BIT</code> flag <strong class=\"purple\">must</strong> not be accessed by atomic instructions through an <code>OpTypeImage</code> with a <code>SampledType</code> with a <code>Width</code> of 64 by this command."
+          "text": " If the <a href=\"#features-sparseImageInt64Atomics\"><code>sparseImageInt64Atomics</code></a> feature is not enabled, <a href=\"#VkBuffer\">VkBuffer</a> objects created with the <code>VK_BUFFER_CREATE_SPARSE_RESIDENCY_BIT</code> flag <strong class=\"purple\">must</strong> not be accessed by atomic instructions through an <code>OpTypeImage</code> with a <code>SampledType</code> with a <code>Width</code> of 64 by this command"
         }
       ],
       "(VK_VERSION_1_2,VK_KHR_draw_indirect_count)+(VK_VERSION_1_1,VK_KHR_multiview)": [
@@ -26930,7 +27262,7 @@
         },
         {
           "vuid": "VUID-vkCmdDrawIndexedIndirect-commandBuffer-02701",
-          "text": " If the <code>VkPipeline</code> object bound to the pipeline bind point used by this command requires any dynamic state, that state <strong class=\"purple\">must</strong> have been set"
+          "text": " If the <code>VkPipeline</code> object bound to the pipeline bind point used by this command requires any dynamic state, that state <strong class=\"purple\">must</strong> have been set or inherited (if the <code><a href=\"#VK_NV_inherited_viewport_scissor\">VK_NV_inherited_viewport_scissor</a></code> extension is enabled) for <code>commandBuffer</code>, and done so after any previously bound pipeline with the corresponding state not specified as dynamic"
         },
         {
           "vuid": "VUID-vkCmdDrawIndexedIndirect-None-02859",
@@ -26958,11 +27290,11 @@
         },
         {
           "vuid": "VUID-vkCmdDrawIndexedIndirect-None-04115",
-          "text": " If a <a href=\"#VkImageView\">VkImageView</a> is accessed using <code>OpImageWrite</code> as a result of this command, then the <code>Type</code> of the <code>Texel</code> operand of that instruction <strong class=\"purple\">must</strong> have at least as many components as the image view&#8217;s format."
+          "text": " If a <a href=\"#VkImageView\">VkImageView</a> is accessed using <code>OpImageWrite</code> as a result of this command, then the <code>Type</code> of the <code>Texel</code> operand of that instruction <strong class=\"purple\">must</strong> have at least as many components as the image view&#8217;s format"
         },
         {
           "vuid": "VUID-vkCmdDrawIndexedIndirect-OpImageWrite-04469",
-          "text": " If a <a href=\"#VkBufferView\">VkBufferView</a> is accessed using <code>OpImageWrite</code> as a result of this command, then the <code>Type</code> of the <code>Texel</code> operand of that instruction <strong class=\"purple\">must</strong> have at least as many components as the buffer view&#8217;s format."
+          "text": " If a <a href=\"#VkBufferView\">VkBufferView</a> is accessed using <code>OpImageWrite</code> as a result of this command, then the <code>Type</code> of the <code>Texel</code> operand of that instruction <strong class=\"purple\">must</strong> have at least as many components as the buffer view&#8217;s format"
         },
         {
           "vuid": "VUID-vkCmdDrawIndexedIndirect-renderPass-02684",
@@ -27102,27 +27434,27 @@
       "(VK_EXT_shader_image_atomic_int64)": [
         {
           "vuid": "VUID-vkCmdDrawIndexedIndirect-SampledType-04470",
-          "text": " If a <a href=\"#VkImageView\">VkImageView</a> with a <a href=\"#VkFormat\">VkFormat</a> that has a 64-bit channel width is accessed as a result of this command, the <code>SampledType</code> of the <code>OpTypeImage</code> operand of that instruction <strong class=\"purple\">must</strong> have a <code>Width</code> of 64."
+          "text": " If a <a href=\"#VkImageView\">VkImageView</a> with a <a href=\"#VkFormat\">VkFormat</a> that has a 64-bit channel width is accessed as a result of this command, the <code>SampledType</code> of the <code>OpTypeImage</code> operand of that instruction <strong class=\"purple\">must</strong> have a <code>Width</code> of 64"
         },
         {
           "vuid": "VUID-vkCmdDrawIndexedIndirect-SampledType-04471",
-          "text": " If a <a href=\"#VkImageView\">VkImageView</a> with a <a href=\"#VkFormat\">VkFormat</a> that has a channel width less than 64-bit is accessed as a result of this command, the <code>SampledType</code> of the <code>OpTypeImage</code> operand of that instruction <strong class=\"purple\">must</strong> have a <code>Width</code> of 32."
+          "text": " If a <a href=\"#VkImageView\">VkImageView</a> with a <a href=\"#VkFormat\">VkFormat</a> that has a channel width less than 64-bit is accessed as a result of this command, the <code>SampledType</code> of the <code>OpTypeImage</code> operand of that instruction <strong class=\"purple\">must</strong> have a <code>Width</code> of 32"
         },
         {
           "vuid": "VUID-vkCmdDrawIndexedIndirect-SampledType-04472",
-          "text": " If a <a href=\"#VkBufferView\">VkBufferView</a> with a <a href=\"#VkFormat\">VkFormat</a> that has a 64-bit channel width is accessed as a result of this command, the <code>SampledType</code> of the <code>OpTypeImage</code> operand of that instruction <strong class=\"purple\">must</strong> have a <code>Width</code> of 64."
+          "text": " If a <a href=\"#VkBufferView\">VkBufferView</a> with a <a href=\"#VkFormat\">VkFormat</a> that has a 64-bit channel width is accessed as a result of this command, the <code>SampledType</code> of the <code>OpTypeImage</code> operand of that instruction <strong class=\"purple\">must</strong> have a <code>Width</code> of 64"
         },
         {
           "vuid": "VUID-vkCmdDrawIndexedIndirect-SampledType-04473",
-          "text": " If a <a href=\"#VkBufferView\">VkBufferView</a> with a <a href=\"#VkFormat\">VkFormat</a> that has a channel width less than 64-bit is accessed as a result of this command, the <code>SampledType</code> of the <code>OpTypeImage</code> operand of that instruction <strong class=\"purple\">must</strong> have a <code>Width</code> of 32."
+          "text": " If a <a href=\"#VkBufferView\">VkBufferView</a> with a <a href=\"#VkFormat\">VkFormat</a> that has a channel width less than 64-bit is accessed as a result of this command, the <code>SampledType</code> of the <code>OpTypeImage</code> operand of that instruction <strong class=\"purple\">must</strong> have a <code>Width</code> of 32"
         },
         {
           "vuid": "VUID-vkCmdDrawIndexedIndirect-sparseImageInt64Atomics-04474",
-          "text": " If the <a href=\"#features-sparseImageInt64Atomics\"><code>sparseImageInt64Atomics</code></a> feature is not enabled, <a href=\"#VkImage\">VkImage</a> objects created with the <code>VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT</code> flag <strong class=\"purple\">must</strong> not be accessed by atomic instructions through an <code>OpTypeImage</code> with a <code>SampledType</code> with a <code>Width</code> of 64 by this command."
+          "text": " If the <a href=\"#features-sparseImageInt64Atomics\"><code>sparseImageInt64Atomics</code></a> feature is not enabled, <a href=\"#VkImage\">VkImage</a> objects created with the <code>VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT</code> flag <strong class=\"purple\">must</strong> not be accessed by atomic instructions through an <code>OpTypeImage</code> with a <code>SampledType</code> with a <code>Width</code> of 64 by this command"
         },
         {
           "vuid": "VUID-vkCmdDrawIndexedIndirect-sparseImageInt64Atomics-04475",
-          "text": " If the <a href=\"#features-sparseImageInt64Atomics\"><code>sparseImageInt64Atomics</code></a> feature is not enabled, <a href=\"#VkBuffer\">VkBuffer</a> objects created with the <code>VK_BUFFER_CREATE_SPARSE_RESIDENCY_BIT</code> flag <strong class=\"purple\">must</strong> not be accessed by atomic instructions through an <code>OpTypeImage</code> with a <code>SampledType</code> with a <code>Width</code> of 64 by this command."
+          "text": " If the <a href=\"#features-sparseImageInt64Atomics\"><code>sparseImageInt64Atomics</code></a> feature is not enabled, <a href=\"#VkBuffer\">VkBuffer</a> objects created with the <code>VK_BUFFER_CREATE_SPARSE_RESIDENCY_BIT</code> flag <strong class=\"purple\">must</strong> not be accessed by atomic instructions through an <code>OpTypeImage</code> with a <code>SampledType</code> with a <code>Width</code> of 64 by this command"
         }
       ],
       "(VK_VERSION_1_1,VK_KHR_multiview)": [
@@ -27286,7 +27618,7 @@
         },
         {
           "vuid": "VUID-vkCmdDrawIndexedIndirectCount-commandBuffer-02701",
-          "text": " If the <code>VkPipeline</code> object bound to the pipeline bind point used by this command requires any dynamic state, that state <strong class=\"purple\">must</strong> have been set"
+          "text": " If the <code>VkPipeline</code> object bound to the pipeline bind point used by this command requires any dynamic state, that state <strong class=\"purple\">must</strong> have been set or inherited (if the <code><a href=\"#VK_NV_inherited_viewport_scissor\">VK_NV_inherited_viewport_scissor</a></code> extension is enabled) for <code>commandBuffer</code>, and done so after any previously bound pipeline with the corresponding state not specified as dynamic"
         },
         {
           "vuid": "VUID-vkCmdDrawIndexedIndirectCount-None-02859",
@@ -27314,11 +27646,11 @@
         },
         {
           "vuid": "VUID-vkCmdDrawIndexedIndirectCount-None-04115",
-          "text": " If a <a href=\"#VkImageView\">VkImageView</a> is accessed using <code>OpImageWrite</code> as a result of this command, then the <code>Type</code> of the <code>Texel</code> operand of that instruction <strong class=\"purple\">must</strong> have at least as many components as the image view&#8217;s format."
+          "text": " If a <a href=\"#VkImageView\">VkImageView</a> is accessed using <code>OpImageWrite</code> as a result of this command, then the <code>Type</code> of the <code>Texel</code> operand of that instruction <strong class=\"purple\">must</strong> have at least as many components as the image view&#8217;s format"
         },
         {
           "vuid": "VUID-vkCmdDrawIndexedIndirectCount-OpImageWrite-04469",
-          "text": " If a <a href=\"#VkBufferView\">VkBufferView</a> is accessed using <code>OpImageWrite</code> as a result of this command, then the <code>Type</code> of the <code>Texel</code> operand of that instruction <strong class=\"purple\">must</strong> have at least as many components as the buffer view&#8217;s format."
+          "text": " If a <a href=\"#VkBufferView\">VkBufferView</a> is accessed using <code>OpImageWrite</code> as a result of this command, then the <code>Type</code> of the <code>Texel</code> operand of that instruction <strong class=\"purple\">must</strong> have at least as many components as the buffer view&#8217;s format"
         },
         {
           "vuid": "VUID-vkCmdDrawIndexedIndirectCount-renderPass-02684",
@@ -27474,27 +27806,27 @@
       "(VK_VERSION_1_2,VK_KHR_draw_indirect_count)+(VK_EXT_shader_image_atomic_int64)": [
         {
           "vuid": "VUID-vkCmdDrawIndexedIndirectCount-SampledType-04470",
-          "text": " If a <a href=\"#VkImageView\">VkImageView</a> with a <a href=\"#VkFormat\">VkFormat</a> that has a 64-bit channel width is accessed as a result of this command, the <code>SampledType</code> of the <code>OpTypeImage</code> operand of that instruction <strong class=\"purple\">must</strong> have a <code>Width</code> of 64."
+          "text": " If a <a href=\"#VkImageView\">VkImageView</a> with a <a href=\"#VkFormat\">VkFormat</a> that has a 64-bit channel width is accessed as a result of this command, the <code>SampledType</code> of the <code>OpTypeImage</code> operand of that instruction <strong class=\"purple\">must</strong> have a <code>Width</code> of 64"
         },
         {
           "vuid": "VUID-vkCmdDrawIndexedIndirectCount-SampledType-04471",
-          "text": " If a <a href=\"#VkImageView\">VkImageView</a> with a <a href=\"#VkFormat\">VkFormat</a> that has a channel width less than 64-bit is accessed as a result of this command, the <code>SampledType</code> of the <code>OpTypeImage</code> operand of that instruction <strong class=\"purple\">must</strong> have a <code>Width</code> of 32."
+          "text": " If a <a href=\"#VkImageView\">VkImageView</a> with a <a href=\"#VkFormat\">VkFormat</a> that has a channel width less than 64-bit is accessed as a result of this command, the <code>SampledType</code> of the <code>OpTypeImage</code> operand of that instruction <strong class=\"purple\">must</strong> have a <code>Width</code> of 32"
         },
         {
           "vuid": "VUID-vkCmdDrawIndexedIndirectCount-SampledType-04472",
-          "text": " If a <a href=\"#VkBufferView\">VkBufferView</a> with a <a href=\"#VkFormat\">VkFormat</a> that has a 64-bit channel width is accessed as a result of this command, the <code>SampledType</code> of the <code>OpTypeImage</code> operand of that instruction <strong class=\"purple\">must</strong> have a <code>Width</code> of 64."
+          "text": " If a <a href=\"#VkBufferView\">VkBufferView</a> with a <a href=\"#VkFormat\">VkFormat</a> that has a 64-bit channel width is accessed as a result of this command, the <code>SampledType</code> of the <code>OpTypeImage</code> operand of that instruction <strong class=\"purple\">must</strong> have a <code>Width</code> of 64"
         },
         {
           "vuid": "VUID-vkCmdDrawIndexedIndirectCount-SampledType-04473",
-          "text": " If a <a href=\"#VkBufferView\">VkBufferView</a> with a <a href=\"#VkFormat\">VkFormat</a> that has a channel width less than 64-bit is accessed as a result of this command, the <code>SampledType</code> of the <code>OpTypeImage</code> operand of that instruction <strong class=\"purple\">must</strong> have a <code>Width</code> of 32."
+          "text": " If a <a href=\"#VkBufferView\">VkBufferView</a> with a <a href=\"#VkFormat\">VkFormat</a> that has a channel width less than 64-bit is accessed as a result of this command, the <code>SampledType</code> of the <code>OpTypeImage</code> operand of that instruction <strong class=\"purple\">must</strong> have a <code>Width</code> of 32"
         },
         {
           "vuid": "VUID-vkCmdDrawIndexedIndirectCount-sparseImageInt64Atomics-04474",
-          "text": " If the <a href=\"#features-sparseImageInt64Atomics\"><code>sparseImageInt64Atomics</code></a> feature is not enabled, <a href=\"#VkImage\">VkImage</a> objects created with the <code>VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT</code> flag <strong class=\"purple\">must</strong> not be accessed by atomic instructions through an <code>OpTypeImage</code> with a <code>SampledType</code> with a <code>Width</code> of 64 by this command."
+          "text": " If the <a href=\"#features-sparseImageInt64Atomics\"><code>sparseImageInt64Atomics</code></a> feature is not enabled, <a href=\"#VkImage\">VkImage</a> objects created with the <code>VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT</code> flag <strong class=\"purple\">must</strong> not be accessed by atomic instructions through an <code>OpTypeImage</code> with a <code>SampledType</code> with a <code>Width</code> of 64 by this command"
         },
         {
           "vuid": "VUID-vkCmdDrawIndexedIndirectCount-sparseImageInt64Atomics-04475",
-          "text": " If the <a href=\"#features-sparseImageInt64Atomics\"><code>sparseImageInt64Atomics</code></a> feature is not enabled, <a href=\"#VkBuffer\">VkBuffer</a> objects created with the <code>VK_BUFFER_CREATE_SPARSE_RESIDENCY_BIT</code> flag <strong class=\"purple\">must</strong> not be accessed by atomic instructions through an <code>OpTypeImage</code> with a <code>SampledType</code> with a <code>Width</code> of 64 by this command."
+          "text": " If the <a href=\"#features-sparseImageInt64Atomics\"><code>sparseImageInt64Atomics</code></a> feature is not enabled, <a href=\"#VkBuffer\">VkBuffer</a> objects created with the <code>VK_BUFFER_CREATE_SPARSE_RESIDENCY_BIT</code> flag <strong class=\"purple\">must</strong> not be accessed by atomic instructions through an <code>OpTypeImage</code> with a <code>SampledType</code> with a <code>Width</code> of 64 by this command"
         }
       ],
       "(VK_VERSION_1_2,VK_KHR_draw_indirect_count)+(VK_VERSION_1_1,VK_KHR_multiview)": [
@@ -27648,7 +27980,7 @@
         },
         {
           "vuid": "VUID-vkCmdDrawIndirectByteCountEXT-commandBuffer-02701",
-          "text": " If the <code>VkPipeline</code> object bound to the pipeline bind point used by this command requires any dynamic state, that state <strong class=\"purple\">must</strong> have been set"
+          "text": " If the <code>VkPipeline</code> object bound to the pipeline bind point used by this command requires any dynamic state, that state <strong class=\"purple\">must</strong> have been set or inherited (if the <code><a href=\"#VK_NV_inherited_viewport_scissor\">VK_NV_inherited_viewport_scissor</a></code> extension is enabled) for <code>commandBuffer</code>, and done so after any previously bound pipeline with the corresponding state not specified as dynamic"
         },
         {
           "vuid": "VUID-vkCmdDrawIndirectByteCountEXT-None-02859",
@@ -27676,11 +28008,11 @@
         },
         {
           "vuid": "VUID-vkCmdDrawIndirectByteCountEXT-None-04115",
-          "text": " If a <a href=\"#VkImageView\">VkImageView</a> is accessed using <code>OpImageWrite</code> as a result of this command, then the <code>Type</code> of the <code>Texel</code> operand of that instruction <strong class=\"purple\">must</strong> have at least as many components as the image view&#8217;s format."
+          "text": " If a <a href=\"#VkImageView\">VkImageView</a> is accessed using <code>OpImageWrite</code> as a result of this command, then the <code>Type</code> of the <code>Texel</code> operand of that instruction <strong class=\"purple\">must</strong> have at least as many components as the image view&#8217;s format"
         },
         {
           "vuid": "VUID-vkCmdDrawIndirectByteCountEXT-OpImageWrite-04469",
-          "text": " If a <a href=\"#VkBufferView\">VkBufferView</a> is accessed using <code>OpImageWrite</code> as a result of this command, then the <code>Type</code> of the <code>Texel</code> operand of that instruction <strong class=\"purple\">must</strong> have at least as many components as the buffer view&#8217;s format."
+          "text": " If a <a href=\"#VkBufferView\">VkBufferView</a> is accessed using <code>OpImageWrite</code> as a result of this command, then the <code>Type</code> of the <code>Texel</code> operand of that instruction <strong class=\"purple\">must</strong> have at least as many components as the buffer view&#8217;s format"
         },
         {
           "vuid": "VUID-vkCmdDrawIndirectByteCountEXT-renderPass-02684",
@@ -27808,27 +28140,27 @@
       "(VK_EXT_transform_feedback)+(VK_EXT_shader_image_atomic_int64)": [
         {
           "vuid": "VUID-vkCmdDrawIndirectByteCountEXT-SampledType-04470",
-          "text": " If a <a href=\"#VkImageView\">VkImageView</a> with a <a href=\"#VkFormat\">VkFormat</a> that has a 64-bit channel width is accessed as a result of this command, the <code>SampledType</code> of the <code>OpTypeImage</code> operand of that instruction <strong class=\"purple\">must</strong> have a <code>Width</code> of 64."
+          "text": " If a <a href=\"#VkImageView\">VkImageView</a> with a <a href=\"#VkFormat\">VkFormat</a> that has a 64-bit channel width is accessed as a result of this command, the <code>SampledType</code> of the <code>OpTypeImage</code> operand of that instruction <strong class=\"purple\">must</strong> have a <code>Width</code> of 64"
         },
         {
           "vuid": "VUID-vkCmdDrawIndirectByteCountEXT-SampledType-04471",
-          "text": " If a <a href=\"#VkImageView\">VkImageView</a> with a <a href=\"#VkFormat\">VkFormat</a> that has a channel width less than 64-bit is accessed as a result of this command, the <code>SampledType</code> of the <code>OpTypeImage</code> operand of that instruction <strong class=\"purple\">must</strong> have a <code>Width</code> of 32."
+          "text": " If a <a href=\"#VkImageView\">VkImageView</a> with a <a href=\"#VkFormat\">VkFormat</a> that has a channel width less than 64-bit is accessed as a result of this command, the <code>SampledType</code> of the <code>OpTypeImage</code> operand of that instruction <strong class=\"purple\">must</strong> have a <code>Width</code> of 32"
         },
         {
           "vuid": "VUID-vkCmdDrawIndirectByteCountEXT-SampledType-04472",
-          "text": " If a <a href=\"#VkBufferView\">VkBufferView</a> with a <a href=\"#VkFormat\">VkFormat</a> that has a 64-bit channel width is accessed as a result of this command, the <code>SampledType</code> of the <code>OpTypeImage</code> operand of that instruction <strong class=\"purple\">must</strong> have a <code>Width</code> of 64."
+          "text": " If a <a href=\"#VkBufferView\">VkBufferView</a> with a <a href=\"#VkFormat\">VkFormat</a> that has a 64-bit channel width is accessed as a result of this command, the <code>SampledType</code> of the <code>OpTypeImage</code> operand of that instruction <strong class=\"purple\">must</strong> have a <code>Width</code> of 64"
         },
         {
           "vuid": "VUID-vkCmdDrawIndirectByteCountEXT-SampledType-04473",
-          "text": " If a <a href=\"#VkBufferView\">VkBufferView</a> with a <a href=\"#VkFormat\">VkFormat</a> that has a channel width less than 64-bit is accessed as a result of this command, the <code>SampledType</code> of the <code>OpTypeImage</code> operand of that instruction <strong class=\"purple\">must</strong> have a <code>Width</code> of 32."
+          "text": " If a <a href=\"#VkBufferView\">VkBufferView</a> with a <a href=\"#VkFormat\">VkFormat</a> that has a channel width less than 64-bit is accessed as a result of this command, the <code>SampledType</code> of the <code>OpTypeImage</code> operand of that instruction <strong class=\"purple\">must</strong> have a <code>Width</code> of 32"
         },
         {
           "vuid": "VUID-vkCmdDrawIndirectByteCountEXT-sparseImageInt64Atomics-04474",
-          "text": " If the <a href=\"#features-sparseImageInt64Atomics\"><code>sparseImageInt64Atomics</code></a> feature is not enabled, <a href=\"#VkImage\">VkImage</a> objects created with the <code>VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT</code> flag <strong class=\"purple\">must</strong> not be accessed by atomic instructions through an <code>OpTypeImage</code> with a <code>SampledType</code> with a <code>Width</code> of 64 by this command."
+          "text": " If the <a href=\"#features-sparseImageInt64Atomics\"><code>sparseImageInt64Atomics</code></a> feature is not enabled, <a href=\"#VkImage\">VkImage</a> objects created with the <code>VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT</code> flag <strong class=\"purple\">must</strong> not be accessed by atomic instructions through an <code>OpTypeImage</code> with a <code>SampledType</code> with a <code>Width</code> of 64 by this command"
         },
         {
           "vuid": "VUID-vkCmdDrawIndirectByteCountEXT-sparseImageInt64Atomics-04475",
-          "text": " If the <a href=\"#features-sparseImageInt64Atomics\"><code>sparseImageInt64Atomics</code></a> feature is not enabled, <a href=\"#VkBuffer\">VkBuffer</a> objects created with the <code>VK_BUFFER_CREATE_SPARSE_RESIDENCY_BIT</code> flag <strong class=\"purple\">must</strong> not be accessed by atomic instructions through an <code>OpTypeImage</code> with a <code>SampledType</code> with a <code>Width</code> of 64 by this command."
+          "text": " If the <a href=\"#features-sparseImageInt64Atomics\"><code>sparseImageInt64Atomics</code></a> feature is not enabled, <a href=\"#VkBuffer\">VkBuffer</a> objects created with the <code>VK_BUFFER_CREATE_SPARSE_RESIDENCY_BIT</code> flag <strong class=\"purple\">must</strong> not be accessed by atomic instructions through an <code>OpTypeImage</code> with a <code>SampledType</code> with a <code>Width</code> of 64 by this command"
         }
       ],
       "(VK_EXT_transform_feedback)+(VK_VERSION_1_1,VK_KHR_multiview)": [
@@ -28064,7 +28396,7 @@
         },
         {
           "vuid": "VUID-vkCmdDrawMeshTasksNV-commandBuffer-02701",
-          "text": " If the <code>VkPipeline</code> object bound to the pipeline bind point used by this command requires any dynamic state, that state <strong class=\"purple\">must</strong> have been set"
+          "text": " If the <code>VkPipeline</code> object bound to the pipeline bind point used by this command requires any dynamic state, that state <strong class=\"purple\">must</strong> have been set or inherited (if the <code><a href=\"#VK_NV_inherited_viewport_scissor\">VK_NV_inherited_viewport_scissor</a></code> extension is enabled) for <code>commandBuffer</code>, and done so after any previously bound pipeline with the corresponding state not specified as dynamic"
         },
         {
           "vuid": "VUID-vkCmdDrawMeshTasksNV-None-02859",
@@ -28092,11 +28424,11 @@
         },
         {
           "vuid": "VUID-vkCmdDrawMeshTasksNV-None-04115",
-          "text": " If a <a href=\"#VkImageView\">VkImageView</a> is accessed using <code>OpImageWrite</code> as a result of this command, then the <code>Type</code> of the <code>Texel</code> operand of that instruction <strong class=\"purple\">must</strong> have at least as many components as the image view&#8217;s format."
+          "text": " If a <a href=\"#VkImageView\">VkImageView</a> is accessed using <code>OpImageWrite</code> as a result of this command, then the <code>Type</code> of the <code>Texel</code> operand of that instruction <strong class=\"purple\">must</strong> have at least as many components as the image view&#8217;s format"
         },
         {
           "vuid": "VUID-vkCmdDrawMeshTasksNV-OpImageWrite-04469",
-          "text": " If a <a href=\"#VkBufferView\">VkBufferView</a> is accessed using <code>OpImageWrite</code> as a result of this command, then the <code>Type</code> of the <code>Texel</code> operand of that instruction <strong class=\"purple\">must</strong> have at least as many components as the buffer view&#8217;s format."
+          "text": " If a <a href=\"#VkBufferView\">VkBufferView</a> is accessed using <code>OpImageWrite</code> as a result of this command, then the <code>Type</code> of the <code>Texel</code> operand of that instruction <strong class=\"purple\">must</strong> have at least as many components as the buffer view&#8217;s format"
         },
         {
           "vuid": "VUID-vkCmdDrawMeshTasksNV-renderPass-02684",
@@ -28180,27 +28512,27 @@
       "(VK_NV_mesh_shader)+(VK_EXT_shader_image_atomic_int64)": [
         {
           "vuid": "VUID-vkCmdDrawMeshTasksNV-SampledType-04470",
-          "text": " If a <a href=\"#VkImageView\">VkImageView</a> with a <a href=\"#VkFormat\">VkFormat</a> that has a 64-bit channel width is accessed as a result of this command, the <code>SampledType</code> of the <code>OpTypeImage</code> operand of that instruction <strong class=\"purple\">must</strong> have a <code>Width</code> of 64."
+          "text": " If a <a href=\"#VkImageView\">VkImageView</a> with a <a href=\"#VkFormat\">VkFormat</a> that has a 64-bit channel width is accessed as a result of this command, the <code>SampledType</code> of the <code>OpTypeImage</code> operand of that instruction <strong class=\"purple\">must</strong> have a <code>Width</code> of 64"
         },
         {
           "vuid": "VUID-vkCmdDrawMeshTasksNV-SampledType-04471",
-          "text": " If a <a href=\"#VkImageView\">VkImageView</a> with a <a href=\"#VkFormat\">VkFormat</a> that has a channel width less than 64-bit is accessed as a result of this command, the <code>SampledType</code> of the <code>OpTypeImage</code> operand of that instruction <strong class=\"purple\">must</strong> have a <code>Width</code> of 32."
+          "text": " If a <a href=\"#VkImageView\">VkImageView</a> with a <a href=\"#VkFormat\">VkFormat</a> that has a channel width less than 64-bit is accessed as a result of this command, the <code>SampledType</code> of the <code>OpTypeImage</code> operand of that instruction <strong class=\"purple\">must</strong> have a <code>Width</code> of 32"
         },
         {
           "vuid": "VUID-vkCmdDrawMeshTasksNV-SampledType-04472",
-          "text": " If a <a href=\"#VkBufferView\">VkBufferView</a> with a <a href=\"#VkFormat\">VkFormat</a> that has a 64-bit channel width is accessed as a result of this command, the <code>SampledType</code> of the <code>OpTypeImage</code> operand of that instruction <strong class=\"purple\">must</strong> have a <code>Width</code> of 64."
+          "text": " If a <a href=\"#VkBufferView\">VkBufferView</a> with a <a href=\"#VkFormat\">VkFormat</a> that has a 64-bit channel width is accessed as a result of this command, the <code>SampledType</code> of the <code>OpTypeImage</code> operand of that instruction <strong class=\"purple\">must</strong> have a <code>Width</code> of 64"
         },
         {
           "vuid": "VUID-vkCmdDrawMeshTasksNV-SampledType-04473",
-          "text": " If a <a href=\"#VkBufferView\">VkBufferView</a> with a <a href=\"#VkFormat\">VkFormat</a> that has a channel width less than 64-bit is accessed as a result of this command, the <code>SampledType</code> of the <code>OpTypeImage</code> operand of that instruction <strong class=\"purple\">must</strong> have a <code>Width</code> of 32."
+          "text": " If a <a href=\"#VkBufferView\">VkBufferView</a> with a <a href=\"#VkFormat\">VkFormat</a> that has a channel width less than 64-bit is accessed as a result of this command, the <code>SampledType</code> of the <code>OpTypeImage</code> operand of that instruction <strong class=\"purple\">must</strong> have a <code>Width</code> of 32"
         },
         {
           "vuid": "VUID-vkCmdDrawMeshTasksNV-sparseImageInt64Atomics-04474",
-          "text": " If the <a href=\"#features-sparseImageInt64Atomics\"><code>sparseImageInt64Atomics</code></a> feature is not enabled, <a href=\"#VkImage\">VkImage</a> objects created with the <code>VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT</code> flag <strong class=\"purple\">must</strong> not be accessed by atomic instructions through an <code>OpTypeImage</code> with a <code>SampledType</code> with a <code>Width</code> of 64 by this command."
+          "text": " If the <a href=\"#features-sparseImageInt64Atomics\"><code>sparseImageInt64Atomics</code></a> feature is not enabled, <a href=\"#VkImage\">VkImage</a> objects created with the <code>VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT</code> flag <strong class=\"purple\">must</strong> not be accessed by atomic instructions through an <code>OpTypeImage</code> with a <code>SampledType</code> with a <code>Width</code> of 64 by this command"
         },
         {
           "vuid": "VUID-vkCmdDrawMeshTasksNV-sparseImageInt64Atomics-04475",
-          "text": " If the <a href=\"#features-sparseImageInt64Atomics\"><code>sparseImageInt64Atomics</code></a> feature is not enabled, <a href=\"#VkBuffer\">VkBuffer</a> objects created with the <code>VK_BUFFER_CREATE_SPARSE_RESIDENCY_BIT</code> flag <strong class=\"purple\">must</strong> not be accessed by atomic instructions through an <code>OpTypeImage</code> with a <code>SampledType</code> with a <code>Width</code> of 64 by this command."
+          "text": " If the <a href=\"#features-sparseImageInt64Atomics\"><code>sparseImageInt64Atomics</code></a> feature is not enabled, <a href=\"#VkBuffer\">VkBuffer</a> objects created with the <code>VK_BUFFER_CREATE_SPARSE_RESIDENCY_BIT</code> flag <strong class=\"purple\">must</strong> not be accessed by atomic instructions through an <code>OpTypeImage</code> with a <code>SampledType</code> with a <code>Width</code> of 64 by this command"
         }
       ],
       "(VK_NV_mesh_shader)+(VK_VERSION_1_1,VK_KHR_multiview)": [
@@ -28348,7 +28680,7 @@
         },
         {
           "vuid": "VUID-vkCmdDrawMeshTasksIndirectNV-commandBuffer-02701",
-          "text": " If the <code>VkPipeline</code> object bound to the pipeline bind point used by this command requires any dynamic state, that state <strong class=\"purple\">must</strong> have been set"
+          "text": " If the <code>VkPipeline</code> object bound to the pipeline bind point used by this command requires any dynamic state, that state <strong class=\"purple\">must</strong> have been set or inherited (if the <code><a href=\"#VK_NV_inherited_viewport_scissor\">VK_NV_inherited_viewport_scissor</a></code> extension is enabled) for <code>commandBuffer</code>, and done so after any previously bound pipeline with the corresponding state not specified as dynamic"
         },
         {
           "vuid": "VUID-vkCmdDrawMeshTasksIndirectNV-None-02859",
@@ -28376,11 +28708,11 @@
         },
         {
           "vuid": "VUID-vkCmdDrawMeshTasksIndirectNV-None-04115",
-          "text": " If a <a href=\"#VkImageView\">VkImageView</a> is accessed using <code>OpImageWrite</code> as a result of this command, then the <code>Type</code> of the <code>Texel</code> operand of that instruction <strong class=\"purple\">must</strong> have at least as many components as the image view&#8217;s format."
+          "text": " If a <a href=\"#VkImageView\">VkImageView</a> is accessed using <code>OpImageWrite</code> as a result of this command, then the <code>Type</code> of the <code>Texel</code> operand of that instruction <strong class=\"purple\">must</strong> have at least as many components as the image view&#8217;s format"
         },
         {
           "vuid": "VUID-vkCmdDrawMeshTasksIndirectNV-OpImageWrite-04469",
-          "text": " If a <a href=\"#VkBufferView\">VkBufferView</a> is accessed using <code>OpImageWrite</code> as a result of this command, then the <code>Type</code> of the <code>Texel</code> operand of that instruction <strong class=\"purple\">must</strong> have at least as many components as the buffer view&#8217;s format."
+          "text": " If a <a href=\"#VkBufferView\">VkBufferView</a> is accessed using <code>OpImageWrite</code> as a result of this command, then the <code>Type</code> of the <code>Texel</code> operand of that instruction <strong class=\"purple\">must</strong> have at least as many components as the buffer view&#8217;s format"
         },
         {
           "vuid": "VUID-vkCmdDrawMeshTasksIndirectNV-renderPass-02684",
@@ -28504,27 +28836,27 @@
       "(VK_NV_mesh_shader)+(VK_EXT_shader_image_atomic_int64)": [
         {
           "vuid": "VUID-vkCmdDrawMeshTasksIndirectNV-SampledType-04470",
-          "text": " If a <a href=\"#VkImageView\">VkImageView</a> with a <a href=\"#VkFormat\">VkFormat</a> that has a 64-bit channel width is accessed as a result of this command, the <code>SampledType</code> of the <code>OpTypeImage</code> operand of that instruction <strong class=\"purple\">must</strong> have a <code>Width</code> of 64."
+          "text": " If a <a href=\"#VkImageView\">VkImageView</a> with a <a href=\"#VkFormat\">VkFormat</a> that has a 64-bit channel width is accessed as a result of this command, the <code>SampledType</code> of the <code>OpTypeImage</code> operand of that instruction <strong class=\"purple\">must</strong> have a <code>Width</code> of 64"
         },
         {
           "vuid": "VUID-vkCmdDrawMeshTasksIndirectNV-SampledType-04471",
-          "text": " If a <a href=\"#VkImageView\">VkImageView</a> with a <a href=\"#VkFormat\">VkFormat</a> that has a channel width less than 64-bit is accessed as a result of this command, the <code>SampledType</code> of the <code>OpTypeImage</code> operand of that instruction <strong class=\"purple\">must</strong> have a <code>Width</code> of 32."
+          "text": " If a <a href=\"#VkImageView\">VkImageView</a> with a <a href=\"#VkFormat\">VkFormat</a> that has a channel width less than 64-bit is accessed as a result of this command, the <code>SampledType</code> of the <code>OpTypeImage</code> operand of that instruction <strong class=\"purple\">must</strong> have a <code>Width</code> of 32"
         },
         {
           "vuid": "VUID-vkCmdDrawMeshTasksIndirectNV-SampledType-04472",
-          "text": " If a <a href=\"#VkBufferView\">VkBufferView</a> with a <a href=\"#VkFormat\">VkFormat</a> that has a 64-bit channel width is accessed as a result of this command, the <code>SampledType</code> of the <code>OpTypeImage</code> operand of that instruction <strong class=\"purple\">must</strong> have a <code>Width</code> of 64."
+          "text": " If a <a href=\"#VkBufferView\">VkBufferView</a> with a <a href=\"#VkFormat\">VkFormat</a> that has a 64-bit channel width is accessed as a result of this command, the <code>SampledType</code> of the <code>OpTypeImage</code> operand of that instruction <strong class=\"purple\">must</strong> have a <code>Width</code> of 64"
         },
         {
           "vuid": "VUID-vkCmdDrawMeshTasksIndirectNV-SampledType-04473",
-          "text": " If a <a href=\"#VkBufferView\">VkBufferView</a> with a <a href=\"#VkFormat\">VkFormat</a> that has a channel width less than 64-bit is accessed as a result of this command, the <code>SampledType</code> of the <code>OpTypeImage</code> operand of that instruction <strong class=\"purple\">must</strong> have a <code>Width</code> of 32."
+          "text": " If a <a href=\"#VkBufferView\">VkBufferView</a> with a <a href=\"#VkFormat\">VkFormat</a> that has a channel width less than 64-bit is accessed as a result of this command, the <code>SampledType</code> of the <code>OpTypeImage</code> operand of that instruction <strong class=\"purple\">must</strong> have a <code>Width</code> of 32"
         },
         {
           "vuid": "VUID-vkCmdDrawMeshTasksIndirectNV-sparseImageInt64Atomics-04474",
-          "text": " If the <a href=\"#features-sparseImageInt64Atomics\"><code>sparseImageInt64Atomics</code></a> feature is not enabled, <a href=\"#VkImage\">VkImage</a> objects created with the <code>VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT</code> flag <strong class=\"purple\">must</strong> not be accessed by atomic instructions through an <code>OpTypeImage</code> with a <code>SampledType</code> with a <code>Width</code> of 64 by this command."
+          "text": " If the <a href=\"#features-sparseImageInt64Atomics\"><code>sparseImageInt64Atomics</code></a> feature is not enabled, <a href=\"#VkImage\">VkImage</a> objects created with the <code>VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT</code> flag <strong class=\"purple\">must</strong> not be accessed by atomic instructions through an <code>OpTypeImage</code> with a <code>SampledType</code> with a <code>Width</code> of 64 by this command"
         },
         {
           "vuid": "VUID-vkCmdDrawMeshTasksIndirectNV-sparseImageInt64Atomics-04475",
-          "text": " If the <a href=\"#features-sparseImageInt64Atomics\"><code>sparseImageInt64Atomics</code></a> feature is not enabled, <a href=\"#VkBuffer\">VkBuffer</a> objects created with the <code>VK_BUFFER_CREATE_SPARSE_RESIDENCY_BIT</code> flag <strong class=\"purple\">must</strong> not be accessed by atomic instructions through an <code>OpTypeImage</code> with a <code>SampledType</code> with a <code>Width</code> of 64 by this command."
+          "text": " If the <a href=\"#features-sparseImageInt64Atomics\"><code>sparseImageInt64Atomics</code></a> feature is not enabled, <a href=\"#VkBuffer\">VkBuffer</a> objects created with the <code>VK_BUFFER_CREATE_SPARSE_RESIDENCY_BIT</code> flag <strong class=\"purple\">must</strong> not be accessed by atomic instructions through an <code>OpTypeImage</code> with a <code>SampledType</code> with a <code>Width</code> of 64 by this command"
         }
       ],
       "(VK_NV_mesh_shader)+(VK_VERSION_1_1,VK_KHR_multiview)": [
@@ -28680,7 +29012,7 @@
         },
         {
           "vuid": "VUID-vkCmdDrawMeshTasksIndirectCountNV-commandBuffer-02701",
-          "text": " If the <code>VkPipeline</code> object bound to the pipeline bind point used by this command requires any dynamic state, that state <strong class=\"purple\">must</strong> have been set"
+          "text": " If the <code>VkPipeline</code> object bound to the pipeline bind point used by this command requires any dynamic state, that state <strong class=\"purple\">must</strong> have been set or inherited (if the <code><a href=\"#VK_NV_inherited_viewport_scissor\">VK_NV_inherited_viewport_scissor</a></code> extension is enabled) for <code>commandBuffer</code>, and done so after any previously bound pipeline with the corresponding state not specified as dynamic"
         },
         {
           "vuid": "VUID-vkCmdDrawMeshTasksIndirectCountNV-None-02859",
@@ -28708,11 +29040,11 @@
         },
         {
           "vuid": "VUID-vkCmdDrawMeshTasksIndirectCountNV-None-04115",
-          "text": " If a <a href=\"#VkImageView\">VkImageView</a> is accessed using <code>OpImageWrite</code> as a result of this command, then the <code>Type</code> of the <code>Texel</code> operand of that instruction <strong class=\"purple\">must</strong> have at least as many components as the image view&#8217;s format."
+          "text": " If a <a href=\"#VkImageView\">VkImageView</a> is accessed using <code>OpImageWrite</code> as a result of this command, then the <code>Type</code> of the <code>Texel</code> operand of that instruction <strong class=\"purple\">must</strong> have at least as many components as the image view&#8217;s format"
         },
         {
           "vuid": "VUID-vkCmdDrawMeshTasksIndirectCountNV-OpImageWrite-04469",
-          "text": " If a <a href=\"#VkBufferView\">VkBufferView</a> is accessed using <code>OpImageWrite</code> as a result of this command, then the <code>Type</code> of the <code>Texel</code> operand of that instruction <strong class=\"purple\">must</strong> have at least as many components as the buffer view&#8217;s format."
+          "text": " If a <a href=\"#VkBufferView\">VkBufferView</a> is accessed using <code>OpImageWrite</code> as a result of this command, then the <code>Type</code> of the <code>Texel</code> operand of that instruction <strong class=\"purple\">must</strong> have at least as many components as the buffer view&#8217;s format"
         },
         {
           "vuid": "VUID-vkCmdDrawMeshTasksIndirectCountNV-renderPass-02684",
@@ -28856,27 +29188,27 @@
       "(VK_NV_mesh_shader)+(VK_EXT_shader_image_atomic_int64)": [
         {
           "vuid": "VUID-vkCmdDrawMeshTasksIndirectCountNV-SampledType-04470",
-          "text": " If a <a href=\"#VkImageView\">VkImageView</a> with a <a href=\"#VkFormat\">VkFormat</a> that has a 64-bit channel width is accessed as a result of this command, the <code>SampledType</code> of the <code>OpTypeImage</code> operand of that instruction <strong class=\"purple\">must</strong> have a <code>Width</code> of 64."
+          "text": " If a <a href=\"#VkImageView\">VkImageView</a> with a <a href=\"#VkFormat\">VkFormat</a> that has a 64-bit channel width is accessed as a result of this command, the <code>SampledType</code> of the <code>OpTypeImage</code> operand of that instruction <strong class=\"purple\">must</strong> have a <code>Width</code> of 64"
         },
         {
           "vuid": "VUID-vkCmdDrawMeshTasksIndirectCountNV-SampledType-04471",
-          "text": " If a <a href=\"#VkImageView\">VkImageView</a> with a <a href=\"#VkFormat\">VkFormat</a> that has a channel width less than 64-bit is accessed as a result of this command, the <code>SampledType</code> of the <code>OpTypeImage</code> operand of that instruction <strong class=\"purple\">must</strong> have a <code>Width</code> of 32."
+          "text": " If a <a href=\"#VkImageView\">VkImageView</a> with a <a href=\"#VkFormat\">VkFormat</a> that has a channel width less than 64-bit is accessed as a result of this command, the <code>SampledType</code> of the <code>OpTypeImage</code> operand of that instruction <strong class=\"purple\">must</strong> have a <code>Width</code> of 32"
         },
         {
           "vuid": "VUID-vkCmdDrawMeshTasksIndirectCountNV-SampledType-04472",
-          "text": " If a <a href=\"#VkBufferView\">VkBufferView</a> with a <a href=\"#VkFormat\">VkFormat</a> that has a 64-bit channel width is accessed as a result of this command, the <code>SampledType</code> of the <code>OpTypeImage</code> operand of that instruction <strong class=\"purple\">must</strong> have a <code>Width</code> of 64."
+          "text": " If a <a href=\"#VkBufferView\">VkBufferView</a> with a <a href=\"#VkFormat\">VkFormat</a> that has a 64-bit channel width is accessed as a result of this command, the <code>SampledType</code> of the <code>OpTypeImage</code> operand of that instruction <strong class=\"purple\">must</strong> have a <code>Width</code> of 64"
         },
         {
           "vuid": "VUID-vkCmdDrawMeshTasksIndirectCountNV-SampledType-04473",
-          "text": " If a <a href=\"#VkBufferView\">VkBufferView</a> with a <a href=\"#VkFormat\">VkFormat</a> that has a channel width less than 64-bit is accessed as a result of this command, the <code>SampledType</code> of the <code>OpTypeImage</code> operand of that instruction <strong class=\"purple\">must</strong> have a <code>Width</code> of 32."
+          "text": " If a <a href=\"#VkBufferView\">VkBufferView</a> with a <a href=\"#VkFormat\">VkFormat</a> that has a channel width less than 64-bit is accessed as a result of this command, the <code>SampledType</code> of the <code>OpTypeImage</code> operand of that instruction <strong class=\"purple\">must</strong> have a <code>Width</code> of 32"
         },
         {
           "vuid": "VUID-vkCmdDrawMeshTasksIndirectCountNV-sparseImageInt64Atomics-04474",
-          "text": " If the <a href=\"#features-sparseImageInt64Atomics\"><code>sparseImageInt64Atomics</code></a> feature is not enabled, <a href=\"#VkImage\">VkImage</a> objects created with the <code>VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT</code> flag <strong class=\"purple\">must</strong> not be accessed by atomic instructions through an <code>OpTypeImage</code> with a <code>SampledType</code> with a <code>Width</code> of 64 by this command."
+          "text": " If the <a href=\"#features-sparseImageInt64Atomics\"><code>sparseImageInt64Atomics</code></a> feature is not enabled, <a href=\"#VkImage\">VkImage</a> objects created with the <code>VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT</code> flag <strong class=\"purple\">must</strong> not be accessed by atomic instructions through an <code>OpTypeImage</code> with a <code>SampledType</code> with a <code>Width</code> of 64 by this command"
         },
         {
           "vuid": "VUID-vkCmdDrawMeshTasksIndirectCountNV-sparseImageInt64Atomics-04475",
-          "text": " If the <a href=\"#features-sparseImageInt64Atomics\"><code>sparseImageInt64Atomics</code></a> feature is not enabled, <a href=\"#VkBuffer\">VkBuffer</a> objects created with the <code>VK_BUFFER_CREATE_SPARSE_RESIDENCY_BIT</code> flag <strong class=\"purple\">must</strong> not be accessed by atomic instructions through an <code>OpTypeImage</code> with a <code>SampledType</code> with a <code>Width</code> of 64 by this command."
+          "text": " If the <a href=\"#features-sparseImageInt64Atomics\"><code>sparseImageInt64Atomics</code></a> feature is not enabled, <a href=\"#VkBuffer\">VkBuffer</a> objects created with the <code>VK_BUFFER_CREATE_SPARSE_RESIDENCY_BIT</code> flag <strong class=\"purple\">must</strong> not be accessed by atomic instructions through an <code>OpTypeImage</code> with a <code>SampledType</code> with a <code>Width</code> of 64 by this command"
         }
       ],
       "(VK_NV_mesh_shader)+(VK_VERSION_1_1,VK_KHR_multiview)": [
@@ -29064,7 +29396,7 @@
       "(VK_KHR_portability_subset)": [
         {
           "vuid": "VUID-VkVertexInputBindingDescription-stride-04456",
-          "text": " If the <code><a href=\"#VK_KHR_portability_subset\">[VK_KHR_portability_subset]</a></code> extension is enabled, <code>stride</code> <strong class=\"purple\">must</strong> be a multiple of, and at least as large as, <a href=\"#VkPhysicalDevicePortabilitySubsetPropertiesKHR\">VkPhysicalDevicePortabilitySubsetPropertiesKHR</a>::<code>minVertexInputBindingStrideAlignment</code>."
+          "text": " If the <code><a href=\"#VK_KHR_portability_subset\">[VK_KHR_portability_subset]</a></code> extension is enabled, <code>stride</code> <strong class=\"purple\">must</strong> be a multiple of, and at least as large as, <a href=\"#VkPhysicalDevicePortabilitySubsetPropertiesKHR\">VkPhysicalDevicePortabilitySubsetPropertiesKHR</a>::<code>minVertexInputBindingStrideAlignment</code>"
         }
       ]
     },
@@ -29094,7 +29426,7 @@
       "(VK_KHR_portability_subset)": [
         {
           "vuid": "VUID-VkVertexInputAttributeDescription-vertexAttributeAccessBeyondStride-04457",
-          "text": " If the <code><a href=\"#VK_KHR_portability_subset\">[VK_KHR_portability_subset]</a></code> extension is enabled, and <a href=\"#VkPhysicalDevicePortabilitySubsetFeaturesKHR\">VkPhysicalDevicePortabilitySubsetFeaturesKHR</a>::<code>vertexAttributeAccessBeyondStride</code> is <code>VK_FALSE</code>, the sum of <code>offset</code> plus the size of the vertex attribute data described by <code>format</code> <strong class=\"purple\">must</strong> not be greater than <code>stride</code> in the <a href=\"#VkVertexInputBindingDescription\">VkVertexInputBindingDescription</a> referenced in <code>binding</code>."
+          "text": " If the <code><a href=\"#VK_KHR_portability_subset\">[VK_KHR_portability_subset]</a></code> extension is enabled, and <a href=\"#VkPhysicalDevicePortabilitySubsetFeaturesKHR\">VkPhysicalDevicePortabilitySubsetFeaturesKHR</a>::<code>vertexAttributeAccessBeyondStride</code> is <code>VK_FALSE</code>, the sum of <code>offset</code> plus the size of the vertex attribute data described by <code>format</code> <strong class=\"purple\">must</strong> not be greater than <code>stride</code> in the <a href=\"#VkVertexInputBindingDescription\">VkVertexInputBindingDescription</a> referenced in <code>binding</code>"
         }
       ]
     },
@@ -29165,11 +29497,11 @@
           "text": " If the <a href=\"#features-vertexAttributeInstanceRateDivisor\">vertexAttributeInstanceRateDivisor</a> feature is not enabled, <code>divisor</code> <strong class=\"purple\">must</strong> be <code>1</code>"
         },
         {
-          "vuid": "VUID-VkVertexInputBindingDescription2EXT-divisor-04800",
+          "vuid": "VUID-VkVertexInputBindingDescription2EXT-divisor-06226",
           "text": " <code>divisor</code> <strong class=\"purple\">must</strong> be a value between <code>0</code> and <code>VkPhysicalDeviceVertexAttributeDivisorPropertiesEXT</code>::<code>maxVertexAttribDivisor</code>, inclusive"
         },
         {
-          "vuid": "VUID-VkVertexInputBindingDescription2EXT-divisor-04801",
+          "vuid": "VUID-VkVertexInputBindingDescription2EXT-divisor-06227",
           "text": " If <code>divisor</code> is not <code>1</code> then <code>inputRate</code> <strong class=\"purple\">must</strong> be of type <code>VK_VERTEX_INPUT_RATE_INSTANCE</code>"
         },
         {
@@ -29185,15 +29517,15 @@
     "VkVertexInputAttributeDescription2EXT": {
       "(VK_EXT_vertex_input_dynamic_state)": [
         {
-          "vuid": "VUID-VkVertexInputAttributeDescription2EXT-location-04802",
+          "vuid": "VUID-VkVertexInputAttributeDescription2EXT-location-06228",
           "text": " <code>location</code> <strong class=\"purple\">must</strong> be less than <code>VkPhysicalDeviceLimits</code>::<code>maxVertexInputAttributes</code>"
         },
         {
-          "vuid": "VUID-VkVertexInputAttributeDescription2EXT-binding-04803",
+          "vuid": "VUID-VkVertexInputAttributeDescription2EXT-binding-06229",
           "text": " <code>binding</code> <strong class=\"purple\">must</strong> be less than <code>VkPhysicalDeviceLimits</code>::<code>maxVertexInputBindings</code>"
         },
         {
-          "vuid": "VUID-VkVertexInputAttributeDescription2EXT-offset-04804",
+          "vuid": "VUID-VkVertexInputAttributeDescription2EXT-offset-06230",
           "text": " <code>offset</code> <strong class=\"purple\">must</strong> be less than or equal to <code>VkPhysicalDeviceLimits</code>::<code>maxVertexInputAttributeOffset</code>"
         },
         {
@@ -29212,7 +29544,7 @@
       "(VK_EXT_vertex_input_dynamic_state)+(VK_KHR_portability_subset)": [
         {
           "vuid": "VUID-VkVertexInputAttributeDescription2EXT-vertexAttributeAccessBeyondStride-04806",
-          "text": " If the <code><a href=\"#VK_KHR_portability_subset\">[VK_KHR_portability_subset]</a></code> extension is enabled, and <a href=\"#VkPhysicalDevicePortabilitySubsetFeaturesKHR\">VkPhysicalDevicePortabilitySubsetFeaturesKHR</a>::<code>vertexAttributeAccessBeyondStride</code> is <code>VK_FALSE</code>, the sum of <code>offset</code> plus the size of the vertex attribute data described by <code>format</code> <strong class=\"purple\">must</strong> not be greater than <code>stride</code> in the <a href=\"#VkVertexInputBindingDescription2EXT\">VkVertexInputBindingDescription2EXT</a> referenced in <code>binding</code>."
+          "text": " If the <code><a href=\"#VK_KHR_portability_subset\">[VK_KHR_portability_subset]</a></code> extension is enabled, and <a href=\"#VkPhysicalDevicePortabilitySubsetFeaturesKHR\">VkPhysicalDevicePortabilitySubsetFeaturesKHR</a>::<code>vertexAttributeAccessBeyondStride</code> is <code>VK_FALSE</code>, the sum of <code>offset</code> plus the size of the vertex attribute data described by <code>format</code> <strong class=\"purple\">must</strong> not be greater than <code>stride</code> in the <a href=\"#VkVertexInputBindingDescription2EXT\">VkVertexInputBindingDescription2EXT</a> referenced in <code>binding</code>"
         }
       ]
     },
@@ -29313,8 +29645,8 @@
           "text": " If <code>pStrides</code> is not <code>NULL</code> each element of <code>pStrides</code> <strong class=\"purple\">must</strong> be less than or equal to <code>VkPhysicalDeviceLimits</code>::<code>maxVertexInputBindingStride</code>"
         },
         {
-          "vuid": "VUID-vkCmdBindVertexBuffers2EXT-pStrides-03363",
-          "text": " If <code>pStrides</code> is not <code>NULL</code> each element of <code>pStrides</code> <strong class=\"purple\">must</strong> be greater than or equal to the maximum extent of all vertex input attributes fetched from the corresponding binding, where the extent is calculated as the <a href=\"#VkVertexInputAttributeDescription\">VkVertexInputAttributeDescription</a>::<code>offset</code> plus <a href=\"#VkVertexInputAttributeDescription\">VkVertexInputAttributeDescription</a>::<code>format</code> size"
+          "vuid": "VUID-vkCmdBindVertexBuffers2EXT-pStrides-06209",
+          "text": " If <code>pStrides</code> is not <code>NULL</code> each element of <code>pStrides</code> <strong class=\"purple\">must</strong> be either 0 or greater than or equal to the maximum extent of all vertex input attributes fetched from the corresponding binding, where the extent is calculated as the <a href=\"#VkVertexInputAttributeDescription\">VkVertexInputAttributeDescription</a>::<code>offset</code> plus <a href=\"#VkVertexInputAttributeDescription\">VkVertexInputAttributeDescription</a>::<code>format</code> size"
         },
         {
           "vuid": "VUID-vkCmdBindVertexBuffers2EXT-commandBuffer-parameter",
@@ -29322,7 +29654,7 @@
         },
         {
           "vuid": "VUID-vkCmdBindVertexBuffers2EXT-pBuffers-parameter",
-          "text": " <code>pBuffers</code> <strong class=\"purple\">must</strong> be a valid pointer to an array of <code>bindingCount</code> valid <a href=\"#VkBuffer\">VkBuffer</a> handles"
+          "text": " <code>pBuffers</code> <strong class=\"purple\">must</strong> be a valid pointer to an array of <code>bindingCount</code> valid or <a href=\"#VK_NULL_HANDLE\">VK_NULL_HANDLE</a> <a href=\"#VkBuffer\">VkBuffer</a> handles"
         },
         {
           "vuid": "VUID-vkCmdBindVertexBuffers2EXT-pOffsets-parameter",
@@ -29350,7 +29682,7 @@
         },
         {
           "vuid": "VUID-vkCmdBindVertexBuffers2EXT-commonparent",
-          "text": " Both of <code>commandBuffer</code>, and the elements of <code>pBuffers</code> <strong class=\"purple\">must</strong> have been created, allocated, or retrieved from the same <a href=\"#VkDevice\">VkDevice</a>"
+          "text": " Both of <code>commandBuffer</code>, and the elements of <code>pBuffers</code> that are valid handles of non-ignored parameters <strong class=\"purple\">must</strong> have been created, allocated, or retrieved from the same <a href=\"#VkDevice\">VkDevice</a>"
         }
       ],
       "(VK_EXT_extended_dynamic_state)+(VK_EXT_robustness2)": [
@@ -29547,6 +29879,10 @@
           "text": " For each buffer handle in the <code>pCounterBuffers</code> array that is not <a href=\"#VK_NULL_HANDLE\">VK_NULL_HANDLE</a> it <strong class=\"purple\">must</strong> have been created with a <code>usage</code> value containing <code>VK_BUFFER_USAGE_TRANSFORM_FEEDBACK_COUNTER_BUFFER_BIT_EXT</code>"
         },
         {
+          "vuid": "VUID-vkCmdBeginTransformFeedbackEXT-None-06233",
+          "text": " A valid graphics pipeline <strong class=\"purple\">must</strong> be bound to <code>VK_PIPELINE_BIND_POINT_GRAPHICS</code>"
+        },
+        {
           "vuid": "VUID-vkCmdBeginTransformFeedbackEXT-None-04128",
           "text": " The last <a href=\"#pipeline-graphics-subsets-pre-rasterization\">pre-rasterization shader stage</a> of the bound graphics pipeline <strong class=\"purple\">must</strong> have been declared with the <code>Xfb</code> execution mode"
         },
@@ -29862,7 +30198,7 @@
       "(VK_EXT_extended_dynamic_state)+(VK_NV_inherited_viewport_scissor)": [
         {
           "vuid": "VUID-vkCmdSetViewportWithCountEXT-commandBuffer-04819",
-          "text": " <code>commandBuffer</code> <strong class=\"purple\">must</strong> not have <a href=\"#VkCommandBufferInheritanceViewportScissorInfoNV\">VkCommandBufferInheritanceViewportScissorInfoNV</a>::<code>viewportScissor2D</code> enabled."
+          "text": " <code>commandBuffer</code> <strong class=\"purple\">must</strong> not have <a href=\"#VkCommandBufferInheritanceViewportScissorInfoNV\">VkCommandBufferInheritanceViewportScissorInfoNV</a>::<code>viewportScissor2D</code> enabled"
         }
       ]
     },
@@ -29916,7 +30252,7 @@
       "(VK_EXT_extended_dynamic_state)+(VK_NV_inherited_viewport_scissor)": [
         {
           "vuid": "VUID-vkCmdSetScissorWithCountEXT-commandBuffer-04820",
-          "text": " <code>commandBuffer</code> <strong class=\"purple\">must</strong> not have <a href=\"#VkCommandBufferInheritanceViewportScissorInfoNV\">VkCommandBufferInheritanceViewportScissorInfoNV</a>::<code>viewportScissor2D</code> enabled."
+          "text": " <code>commandBuffer</code> <strong class=\"purple\">must</strong> not have <a href=\"#VkCommandBufferInheritanceViewportScissorInfoNV\">VkCommandBufferInheritanceViewportScissorInfoNV</a>::<code>viewportScissor2D</code> enabled"
         }
       ]
     },
@@ -29958,7 +30294,7 @@
       "(VK_NV_inherited_viewport_scissor)": [
         {
           "vuid": "VUID-vkCmdSetViewport-commandBuffer-04821",
-          "text": " <code>commandBuffer</code> <strong class=\"purple\">must</strong> not have <a href=\"#VkCommandBufferInheritanceViewportScissorInfoNV\">VkCommandBufferInheritanceViewportScissorInfoNV</a>::<code>viewportScissor2D</code> enabled."
+          "text": " <code>commandBuffer</code> <strong class=\"purple\">must</strong> not have <a href=\"#VkCommandBufferInheritanceViewportScissorInfoNV\">VkCommandBufferInheritanceViewportScissorInfoNV</a>::<code>viewportScissor2D</code> enabled"
         }
       ]
     },
@@ -30084,7 +30420,7 @@
       "(VK_KHR_portability_subset)": [
         {
           "vuid": "VUID-VkPipelineRasterizationStateCreateInfo-pointPolygons-04458",
-          "text": " If the <code><a href=\"#VK_KHR_portability_subset\">[VK_KHR_portability_subset]</a></code> extension is enabled, and <a href=\"#VkPhysicalDevicePortabilitySubsetFeaturesKHR\">VkPhysicalDevicePortabilitySubsetFeaturesKHR</a>::<code>pointPolygons</code> is <code>VK_FALSE</code>, and <code>rasterizerDiscardEnable</code> is <code>VK_FALSE</code>, <code>polygonMode</code> <strong class=\"purple\">must</strong> not be <code>VK_POLYGON_MODE_POINT</code>."
+          "text": " If the <code><a href=\"#VK_KHR_portability_subset\">[VK_KHR_portability_subset]</a></code> extension is enabled, and <a href=\"#VkPhysicalDevicePortabilitySubsetFeaturesKHR\">VkPhysicalDevicePortabilitySubsetFeaturesKHR</a>::<code>pointPolygons</code> is <code>VK_FALSE</code>, and <code>rasterizerDiscardEnable</code> is <code>VK_FALSE</code>, <code>polygonMode</code> <strong class=\"purple\">must</strong> not be <code>VK_POLYGON_MODE_POINT</code>"
         }
       ]
     },
@@ -30936,7 +31272,7 @@
       "(VK_EXT_discard_rectangles)+(VK_NV_inherited_viewport_scissor)": [
         {
           "vuid": "VUID-vkCmdSetDiscardRectangleEXT-viewportScissor2D-04788",
-          "text": " If this command is recorded in a secondary command buffer with <a href=\"#VkCommandBufferInheritanceViewportScissorInfoNV\">VkCommandBufferInheritanceViewportScissorInfoNV</a>::<code>viewportScissor2D</code> enabled, then this function <strong class=\"purple\">must</strong> not be called."
+          "text": " If this command is recorded in a secondary command buffer with <a href=\"#VkCommandBufferInheritanceViewportScissorInfoNV\">VkCommandBufferInheritanceViewportScissorInfoNV</a>::<code>viewportScissor2D</code> enabled, then this function <strong class=\"purple\">must</strong> not be called"
         }
       ]
     },
@@ -30990,7 +31326,7 @@
       "(VK_NV_inherited_viewport_scissor)": [
         {
           "vuid": "VUID-vkCmdSetScissor-viewportScissor2D-04789",
-          "text": " If this command is recorded in a secondary command buffer with <a href=\"#VkCommandBufferInheritanceViewportScissorInfoNV\">VkCommandBufferInheritanceViewportScissorInfoNV</a>::<code>viewportScissor2D</code> enabled, then this function <strong class=\"purple\">must</strong> not be called."
+          "text": " If this command is recorded in a secondary command buffer with <a href=\"#VkCommandBufferInheritanceViewportScissorInfoNV\">VkCommandBufferInheritanceViewportScissorInfoNV</a>::<code>viewportScissor2D</code> enabled, then this function <strong class=\"purple\">must</strong> not be called"
         }
       ]
     },
@@ -31100,7 +31436,7 @@
       "(VK_KHR_portability_subset)": [
         {
           "vuid": "VUID-VkPipelineDepthStencilStateCreateInfo-separateStencilMaskRef-04453",
-          "text": " If the <code><a href=\"#VK_KHR_portability_subset\">[VK_KHR_portability_subset]</a></code> extension is enabled, and <a href=\"#VkPhysicalDevicePortabilitySubsetFeaturesKHR\">VkPhysicalDevicePortabilitySubsetFeaturesKHR</a>::<code>separateStencilMaskRef</code> is <code>VK_FALSE</code>, and the value of <a href=\"#VkPipelineDepthStencilStateCreateInfo\">VkPipelineDepthStencilStateCreateInfo</a>::<code>stencilTestEnable</code> is <code>VK_TRUE</code>, and the value of <a href=\"#VkPipelineRasterizationStateCreateInfo\">VkPipelineRasterizationStateCreateInfo</a>::<code>cullMode</code> is <code>VK_CULL_MODE_NONE</code>, the value of <code>reference</code> in each of the <a href=\"#VkStencilOpState\">VkStencilOpState</a> structs in <code>front</code> and <code>back</code> <strong class=\"purple\">must</strong> be the same."
+          "text": " If the <code><a href=\"#VK_KHR_portability_subset\">[VK_KHR_portability_subset]</a></code> extension is enabled, and <a href=\"#VkPhysicalDevicePortabilitySubsetFeaturesKHR\">VkPhysicalDevicePortabilitySubsetFeaturesKHR</a>::<code>separateStencilMaskRef</code> is <code>VK_FALSE</code>, and the value of <a href=\"#VkPipelineDepthStencilStateCreateInfo\">VkPipelineDepthStencilStateCreateInfo</a>::<code>stencilTestEnable</code> is <code>VK_TRUE</code>, and the value of <a href=\"#VkPipelineRasterizationStateCreateInfo\">VkPipelineRasterizationStateCreateInfo</a>::<code>cullMode</code> is <code>VK_CULL_MODE_NONE</code>, the value of <code>reference</code> in each of the <a href=\"#VkStencilOpState\">VkStencilOpState</a> structs in <code>front</code> and <code>back</code> <strong class=\"purple\">must</strong> be the same"
         }
       ]
     },
@@ -31576,11 +31912,11 @@
       "(VK_KHR_portability_subset)": [
         {
           "vuid": "VUID-VkPipelineColorBlendAttachmentState-constantAlphaColorBlendFactors-04454",
-          "text": " If the <code><a href=\"#VK_KHR_portability_subset\">[VK_KHR_portability_subset]</a></code> extension is enabled, and <a href=\"#VkPhysicalDevicePortabilitySubsetFeaturesKHR\">VkPhysicalDevicePortabilitySubsetFeaturesKHR</a>::<code>constantAlphaColorBlendFactors</code> is <code>VK_FALSE</code>, <code>srcColorBlendFactor</code> <strong class=\"purple\">must</strong> not be <code>VK_BLEND_FACTOR_CONSTANT_ALPHA</code> or <code>VK_BLEND_FACTOR_ONE_MINUS_CONSTANT_ALPHA</code>."
+          "text": " If the <code><a href=\"#VK_KHR_portability_subset\">[VK_KHR_portability_subset]</a></code> extension is enabled, and <a href=\"#VkPhysicalDevicePortabilitySubsetFeaturesKHR\">VkPhysicalDevicePortabilitySubsetFeaturesKHR</a>::<code>constantAlphaColorBlendFactors</code> is <code>VK_FALSE</code>, <code>srcColorBlendFactor</code> <strong class=\"purple\">must</strong> not be <code>VK_BLEND_FACTOR_CONSTANT_ALPHA</code> or <code>VK_BLEND_FACTOR_ONE_MINUS_CONSTANT_ALPHA</code>"
         },
         {
           "vuid": "VUID-VkPipelineColorBlendAttachmentState-constantAlphaColorBlendFactors-04455",
-          "text": " If the <code><a href=\"#VK_KHR_portability_subset\">[VK_KHR_portability_subset]</a></code> extension is enabled, and <a href=\"#VkPhysicalDevicePortabilitySubsetFeaturesKHR\">VkPhysicalDevicePortabilitySubsetFeaturesKHR</a>::<code>constantAlphaColorBlendFactors</code> is <code>VK_FALSE</code>, <code>dstColorBlendFactor</code> <strong class=\"purple\">must</strong> not be <code>VK_BLEND_FACTOR_CONSTANT_ALPHA</code> or <code>VK_BLEND_FACTOR_ONE_MINUS_CONSTANT_ALPHA</code>."
+          "text": " If the <code><a href=\"#VK_KHR_portability_subset\">[VK_KHR_portability_subset]</a></code> extension is enabled, and <a href=\"#VkPhysicalDevicePortabilitySubsetFeaturesKHR\">VkPhysicalDevicePortabilitySubsetFeaturesKHR</a>::<code>constantAlphaColorBlendFactors</code> is <code>VK_FALSE</code>, <code>dstColorBlendFactor</code> <strong class=\"purple\">must</strong> not be <code>VK_BLEND_FACTOR_CONSTANT_ALPHA</code> or <code>VK_BLEND_FACTOR_ONE_MINUS_CONSTANT_ALPHA</code>"
         }
       ]
     },
@@ -31732,7 +32068,7 @@
         },
         {
           "vuid": "VUID-vkCmdDispatch-commandBuffer-02701",
-          "text": " If the <code>VkPipeline</code> object bound to the pipeline bind point used by this command requires any dynamic state, that state <strong class=\"purple\">must</strong> have been set"
+          "text": " If the <code>VkPipeline</code> object bound to the pipeline bind point used by this command requires any dynamic state, that state <strong class=\"purple\">must</strong> have been set or inherited (if the <code><a href=\"#VK_NV_inherited_viewport_scissor\">VK_NV_inherited_viewport_scissor</a></code> extension is enabled) for <code>commandBuffer</code>, and done so after any previously bound pipeline with the corresponding state not specified as dynamic"
         },
         {
           "vuid": "VUID-vkCmdDispatch-None-02859",
@@ -31760,11 +32096,11 @@
         },
         {
           "vuid": "VUID-vkCmdDispatch-None-04115",
-          "text": " If a <a href=\"#VkImageView\">VkImageView</a> is accessed using <code>OpImageWrite</code> as a result of this command, then the <code>Type</code> of the <code>Texel</code> operand of that instruction <strong class=\"purple\">must</strong> have at least as many components as the image view&#8217;s format."
+          "text": " If a <a href=\"#VkImageView\">VkImageView</a> is accessed using <code>OpImageWrite</code> as a result of this command, then the <code>Type</code> of the <code>Texel</code> operand of that instruction <strong class=\"purple\">must</strong> have at least as many components as the image view&#8217;s format"
         },
         {
           "vuid": "VUID-vkCmdDispatch-OpImageWrite-04469",
-          "text": " If a <a href=\"#VkBufferView\">VkBufferView</a> is accessed using <code>OpImageWrite</code> as a result of this command, then the <code>Type</code> of the <code>Texel</code> operand of that instruction <strong class=\"purple\">must</strong> have at least as many components as the buffer view&#8217;s format."
+          "text": " If a <a href=\"#VkBufferView\">VkBufferView</a> is accessed using <code>OpImageWrite</code> as a result of this command, then the <code>Type</code> of the <code>Texel</code> operand of that instruction <strong class=\"purple\">must</strong> have at least as many components as the buffer view&#8217;s format"
         },
         {
           "vuid": "VUID-vkCmdDispatch-groupCountX-00386",
@@ -31844,27 +32180,27 @@
       "(VK_EXT_shader_image_atomic_int64)": [
         {
           "vuid": "VUID-vkCmdDispatch-SampledType-04470",
-          "text": " If a <a href=\"#VkImageView\">VkImageView</a> with a <a href=\"#VkFormat\">VkFormat</a> that has a 64-bit channel width is accessed as a result of this command, the <code>SampledType</code> of the <code>OpTypeImage</code> operand of that instruction <strong class=\"purple\">must</strong> have a <code>Width</code> of 64."
+          "text": " If a <a href=\"#VkImageView\">VkImageView</a> with a <a href=\"#VkFormat\">VkFormat</a> that has a 64-bit channel width is accessed as a result of this command, the <code>SampledType</code> of the <code>OpTypeImage</code> operand of that instruction <strong class=\"purple\">must</strong> have a <code>Width</code> of 64"
         },
         {
           "vuid": "VUID-vkCmdDispatch-SampledType-04471",
-          "text": " If a <a href=\"#VkImageView\">VkImageView</a> with a <a href=\"#VkFormat\">VkFormat</a> that has a channel width less than 64-bit is accessed as a result of this command, the <code>SampledType</code> of the <code>OpTypeImage</code> operand of that instruction <strong class=\"purple\">must</strong> have a <code>Width</code> of 32."
+          "text": " If a <a href=\"#VkImageView\">VkImageView</a> with a <a href=\"#VkFormat\">VkFormat</a> that has a channel width less than 64-bit is accessed as a result of this command, the <code>SampledType</code> of the <code>OpTypeImage</code> operand of that instruction <strong class=\"purple\">must</strong> have a <code>Width</code> of 32"
         },
         {
           "vuid": "VUID-vkCmdDispatch-SampledType-04472",
-          "text": " If a <a href=\"#VkBufferView\">VkBufferView</a> with a <a href=\"#VkFormat\">VkFormat</a> that has a 64-bit channel width is accessed as a result of this command, the <code>SampledType</code> of the <code>OpTypeImage</code> operand of that instruction <strong class=\"purple\">must</strong> have a <code>Width</code> of 64."
+          "text": " If a <a href=\"#VkBufferView\">VkBufferView</a> with a <a href=\"#VkFormat\">VkFormat</a> that has a 64-bit channel width is accessed as a result of this command, the <code>SampledType</code> of the <code>OpTypeImage</code> operand of that instruction <strong class=\"purple\">must</strong> have a <code>Width</code> of 64"
         },
         {
           "vuid": "VUID-vkCmdDispatch-SampledType-04473",
-          "text": " If a <a href=\"#VkBufferView\">VkBufferView</a> with a <a href=\"#VkFormat\">VkFormat</a> that has a channel width less than 64-bit is accessed as a result of this command, the <code>SampledType</code> of the <code>OpTypeImage</code> operand of that instruction <strong class=\"purple\">must</strong> have a <code>Width</code> of 32."
+          "text": " If a <a href=\"#VkBufferView\">VkBufferView</a> with a <a href=\"#VkFormat\">VkFormat</a> that has a channel width less than 64-bit is accessed as a result of this command, the <code>SampledType</code> of the <code>OpTypeImage</code> operand of that instruction <strong class=\"purple\">must</strong> have a <code>Width</code> of 32"
         },
         {
           "vuid": "VUID-vkCmdDispatch-sparseImageInt64Atomics-04474",
-          "text": " If the <a href=\"#features-sparseImageInt64Atomics\"><code>sparseImageInt64Atomics</code></a> feature is not enabled, <a href=\"#VkImage\">VkImage</a> objects created with the <code>VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT</code> flag <strong class=\"purple\">must</strong> not be accessed by atomic instructions through an <code>OpTypeImage</code> with a <code>SampledType</code> with a <code>Width</code> of 64 by this command."
+          "text": " If the <a href=\"#features-sparseImageInt64Atomics\"><code>sparseImageInt64Atomics</code></a> feature is not enabled, <a href=\"#VkImage\">VkImage</a> objects created with the <code>VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT</code> flag <strong class=\"purple\">must</strong> not be accessed by atomic instructions through an <code>OpTypeImage</code> with a <code>SampledType</code> with a <code>Width</code> of 64 by this command"
         },
         {
           "vuid": "VUID-vkCmdDispatch-sparseImageInt64Atomics-04475",
-          "text": " If the <a href=\"#features-sparseImageInt64Atomics\"><code>sparseImageInt64Atomics</code></a> feature is not enabled, <a href=\"#VkBuffer\">VkBuffer</a> objects created with the <code>VK_BUFFER_CREATE_SPARSE_RESIDENCY_BIT</code> flag <strong class=\"purple\">must</strong> not be accessed by atomic instructions through an <code>OpTypeImage</code> with a <code>SampledType</code> with a <code>Width</code> of 64 by this command."
+          "text": " If the <a href=\"#features-sparseImageInt64Atomics\"><code>sparseImageInt64Atomics</code></a> feature is not enabled, <a href=\"#VkBuffer\">VkBuffer</a> objects created with the <code>VK_BUFFER_CREATE_SPARSE_RESIDENCY_BIT</code> flag <strong class=\"purple\">must</strong> not be accessed by atomic instructions through an <code>OpTypeImage</code> with a <code>SampledType</code> with a <code>Width</code> of 64 by this command"
         }
       ]
     },
@@ -31900,7 +32236,7 @@
         },
         {
           "vuid": "VUID-vkCmdDispatchIndirect-commandBuffer-02701",
-          "text": " If the <code>VkPipeline</code> object bound to the pipeline bind point used by this command requires any dynamic state, that state <strong class=\"purple\">must</strong> have been set"
+          "text": " If the <code>VkPipeline</code> object bound to the pipeline bind point used by this command requires any dynamic state, that state <strong class=\"purple\">must</strong> have been set or inherited (if the <code><a href=\"#VK_NV_inherited_viewport_scissor\">VK_NV_inherited_viewport_scissor</a></code> extension is enabled) for <code>commandBuffer</code>, and done so after any previously bound pipeline with the corresponding state not specified as dynamic"
         },
         {
           "vuid": "VUID-vkCmdDispatchIndirect-None-02859",
@@ -31928,11 +32264,11 @@
         },
         {
           "vuid": "VUID-vkCmdDispatchIndirect-None-04115",
-          "text": " If a <a href=\"#VkImageView\">VkImageView</a> is accessed using <code>OpImageWrite</code> as a result of this command, then the <code>Type</code> of the <code>Texel</code> operand of that instruction <strong class=\"purple\">must</strong> have at least as many components as the image view&#8217;s format."
+          "text": " If a <a href=\"#VkImageView\">VkImageView</a> is accessed using <code>OpImageWrite</code> as a result of this command, then the <code>Type</code> of the <code>Texel</code> operand of that instruction <strong class=\"purple\">must</strong> have at least as many components as the image view&#8217;s format"
         },
         {
           "vuid": "VUID-vkCmdDispatchIndirect-OpImageWrite-04469",
-          "text": " If a <a href=\"#VkBufferView\">VkBufferView</a> is accessed using <code>OpImageWrite</code> as a result of this command, then the <code>Type</code> of the <code>Texel</code> operand of that instruction <strong class=\"purple\">must</strong> have at least as many components as the buffer view&#8217;s format."
+          "text": " If a <a href=\"#VkBufferView\">VkBufferView</a> is accessed using <code>OpImageWrite</code> as a result of this command, then the <code>Type</code> of the <code>Texel</code> operand of that instruction <strong class=\"purple\">must</strong> have at least as many components as the buffer view&#8217;s format"
         },
         {
           "vuid": "VUID-vkCmdDispatchIndirect-buffer-02708",
@@ -32016,27 +32352,27 @@
       "(VK_EXT_shader_image_atomic_int64)": [
         {
           "vuid": "VUID-vkCmdDispatchIndirect-SampledType-04470",
-          "text": " If a <a href=\"#VkImageView\">VkImageView</a> with a <a href=\"#VkFormat\">VkFormat</a> that has a 64-bit channel width is accessed as a result of this command, the <code>SampledType</code> of the <code>OpTypeImage</code> operand of that instruction <strong class=\"purple\">must</strong> have a <code>Width</code> of 64."
+          "text": " If a <a href=\"#VkImageView\">VkImageView</a> with a <a href=\"#VkFormat\">VkFormat</a> that has a 64-bit channel width is accessed as a result of this command, the <code>SampledType</code> of the <code>OpTypeImage</code> operand of that instruction <strong class=\"purple\">must</strong> have a <code>Width</code> of 64"
         },
         {
           "vuid": "VUID-vkCmdDispatchIndirect-SampledType-04471",
-          "text": " If a <a href=\"#VkImageView\">VkImageView</a> with a <a href=\"#VkFormat\">VkFormat</a> that has a channel width less than 64-bit is accessed as a result of this command, the <code>SampledType</code> of the <code>OpTypeImage</code> operand of that instruction <strong class=\"purple\">must</strong> have a <code>Width</code> of 32."
+          "text": " If a <a href=\"#VkImageView\">VkImageView</a> with a <a href=\"#VkFormat\">VkFormat</a> that has a channel width less than 64-bit is accessed as a result of this command, the <code>SampledType</code> of the <code>OpTypeImage</code> operand of that instruction <strong class=\"purple\">must</strong> have a <code>Width</code> of 32"
         },
         {
           "vuid": "VUID-vkCmdDispatchIndirect-SampledType-04472",
-          "text": " If a <a href=\"#VkBufferView\">VkBufferView</a> with a <a href=\"#VkFormat\">VkFormat</a> that has a 64-bit channel width is accessed as a result of this command, the <code>SampledType</code> of the <code>OpTypeImage</code> operand of that instruction <strong class=\"purple\">must</strong> have a <code>Width</code> of 64."
+          "text": " If a <a href=\"#VkBufferView\">VkBufferView</a> with a <a href=\"#VkFormat\">VkFormat</a> that has a 64-bit channel width is accessed as a result of this command, the <code>SampledType</code> of the <code>OpTypeImage</code> operand of that instruction <strong class=\"purple\">must</strong> have a <code>Width</code> of 64"
         },
         {
           "vuid": "VUID-vkCmdDispatchIndirect-SampledType-04473",
-          "text": " If a <a href=\"#VkBufferView\">VkBufferView</a> with a <a href=\"#VkFormat\">VkFormat</a> that has a channel width less than 64-bit is accessed as a result of this command, the <code>SampledType</code> of the <code>OpTypeImage</code> operand of that instruction <strong class=\"purple\">must</strong> have a <code>Width</code> of 32."
+          "text": " If a <a href=\"#VkBufferView\">VkBufferView</a> with a <a href=\"#VkFormat\">VkFormat</a> that has a channel width less than 64-bit is accessed as a result of this command, the <code>SampledType</code> of the <code>OpTypeImage</code> operand of that instruction <strong class=\"purple\">must</strong> have a <code>Width</code> of 32"
         },
         {
           "vuid": "VUID-vkCmdDispatchIndirect-sparseImageInt64Atomics-04474",
-          "text": " If the <a href=\"#features-sparseImageInt64Atomics\"><code>sparseImageInt64Atomics</code></a> feature is not enabled, <a href=\"#VkImage\">VkImage</a> objects created with the <code>VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT</code> flag <strong class=\"purple\">must</strong> not be accessed by atomic instructions through an <code>OpTypeImage</code> with a <code>SampledType</code> with a <code>Width</code> of 64 by this command."
+          "text": " If the <a href=\"#features-sparseImageInt64Atomics\"><code>sparseImageInt64Atomics</code></a> feature is not enabled, <a href=\"#VkImage\">VkImage</a> objects created with the <code>VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT</code> flag <strong class=\"purple\">must</strong> not be accessed by atomic instructions through an <code>OpTypeImage</code> with a <code>SampledType</code> with a <code>Width</code> of 64 by this command"
         },
         {
           "vuid": "VUID-vkCmdDispatchIndirect-sparseImageInt64Atomics-04475",
-          "text": " If the <a href=\"#features-sparseImageInt64Atomics\"><code>sparseImageInt64Atomics</code></a> feature is not enabled, <a href=\"#VkBuffer\">VkBuffer</a> objects created with the <code>VK_BUFFER_CREATE_SPARSE_RESIDENCY_BIT</code> flag <strong class=\"purple\">must</strong> not be accessed by atomic instructions through an <code>OpTypeImage</code> with a <code>SampledType</code> with a <code>Width</code> of 64 by this command."
+          "text": " If the <a href=\"#features-sparseImageInt64Atomics\"><code>sparseImageInt64Atomics</code></a> feature is not enabled, <a href=\"#VkBuffer\">VkBuffer</a> objects created with the <code>VK_BUFFER_CREATE_SPARSE_RESIDENCY_BIT</code> flag <strong class=\"purple\">must</strong> not be accessed by atomic instructions through an <code>OpTypeImage</code> with a <code>SampledType</code> with a <code>Width</code> of 64 by this command"
         }
       ]
     },
@@ -32088,7 +32424,7 @@
         },
         {
           "vuid": "VUID-vkCmdDispatchBase-commandBuffer-02701",
-          "text": " If the <code>VkPipeline</code> object bound to the pipeline bind point used by this command requires any dynamic state, that state <strong class=\"purple\">must</strong> have been set"
+          "text": " If the <code>VkPipeline</code> object bound to the pipeline bind point used by this command requires any dynamic state, that state <strong class=\"purple\">must</strong> have been set or inherited (if the <code><a href=\"#VK_NV_inherited_viewport_scissor\">VK_NV_inherited_viewport_scissor</a></code> extension is enabled) for <code>commandBuffer</code>, and done so after any previously bound pipeline with the corresponding state not specified as dynamic"
         },
         {
           "vuid": "VUID-vkCmdDispatchBase-None-02859",
@@ -32116,11 +32452,11 @@
         },
         {
           "vuid": "VUID-vkCmdDispatchBase-None-04115",
-          "text": " If a <a href=\"#VkImageView\">VkImageView</a> is accessed using <code>OpImageWrite</code> as a result of this command, then the <code>Type</code> of the <code>Texel</code> operand of that instruction <strong class=\"purple\">must</strong> have at least as many components as the image view&#8217;s format."
+          "text": " If a <a href=\"#VkImageView\">VkImageView</a> is accessed using <code>OpImageWrite</code> as a result of this command, then the <code>Type</code> of the <code>Texel</code> operand of that instruction <strong class=\"purple\">must</strong> have at least as many components as the image view&#8217;s format"
         },
         {
           "vuid": "VUID-vkCmdDispatchBase-OpImageWrite-04469",
-          "text": " If a <a href=\"#VkBufferView\">VkBufferView</a> is accessed using <code>OpImageWrite</code> as a result of this command, then the <code>Type</code> of the <code>Texel</code> operand of that instruction <strong class=\"purple\">must</strong> have at least as many components as the buffer view&#8217;s format."
+          "text": " If a <a href=\"#VkBufferView\">VkBufferView</a> is accessed using <code>OpImageWrite</code> as a result of this command, then the <code>Type</code> of the <code>Texel</code> operand of that instruction <strong class=\"purple\">must</strong> have at least as many components as the buffer view&#8217;s format"
         },
         {
           "vuid": "VUID-vkCmdDispatchBase-baseGroupX-00421",
@@ -32216,27 +32552,27 @@
       "(VK_VERSION_1_1,VK_KHR_device_group)+(VK_EXT_shader_image_atomic_int64)": [
         {
           "vuid": "VUID-vkCmdDispatchBase-SampledType-04470",
-          "text": " If a <a href=\"#VkImageView\">VkImageView</a> with a <a href=\"#VkFormat\">VkFormat</a> that has a 64-bit channel width is accessed as a result of this command, the <code>SampledType</code> of the <code>OpTypeImage</code> operand of that instruction <strong class=\"purple\">must</strong> have a <code>Width</code> of 64."
+          "text": " If a <a href=\"#VkImageView\">VkImageView</a> with a <a href=\"#VkFormat\">VkFormat</a> that has a 64-bit channel width is accessed as a result of this command, the <code>SampledType</code> of the <code>OpTypeImage</code> operand of that instruction <strong class=\"purple\">must</strong> have a <code>Width</code> of 64"
         },
         {
           "vuid": "VUID-vkCmdDispatchBase-SampledType-04471",
-          "text": " If a <a href=\"#VkImageView\">VkImageView</a> with a <a href=\"#VkFormat\">VkFormat</a> that has a channel width less than 64-bit is accessed as a result of this command, the <code>SampledType</code> of the <code>OpTypeImage</code> operand of that instruction <strong class=\"purple\">must</strong> have a <code>Width</code> of 32."
+          "text": " If a <a href=\"#VkImageView\">VkImageView</a> with a <a href=\"#VkFormat\">VkFormat</a> that has a channel width less than 64-bit is accessed as a result of this command, the <code>SampledType</code> of the <code>OpTypeImage</code> operand of that instruction <strong class=\"purple\">must</strong> have a <code>Width</code> of 32"
         },
         {
           "vuid": "VUID-vkCmdDispatchBase-SampledType-04472",
-          "text": " If a <a href=\"#VkBufferView\">VkBufferView</a> with a <a href=\"#VkFormat\">VkFormat</a> that has a 64-bit channel width is accessed as a result of this command, the <code>SampledType</code> of the <code>OpTypeImage</code> operand of that instruction <strong class=\"purple\">must</strong> have a <code>Width</code> of 64."
+          "text": " If a <a href=\"#VkBufferView\">VkBufferView</a> with a <a href=\"#VkFormat\">VkFormat</a> that has a 64-bit channel width is accessed as a result of this command, the <code>SampledType</code> of the <code>OpTypeImage</code> operand of that instruction <strong class=\"purple\">must</strong> have a <code>Width</code> of 64"
         },
         {
           "vuid": "VUID-vkCmdDispatchBase-SampledType-04473",
-          "text": " If a <a href=\"#VkBufferView\">VkBufferView</a> with a <a href=\"#VkFormat\">VkFormat</a> that has a channel width less than 64-bit is accessed as a result of this command, the <code>SampledType</code> of the <code>OpTypeImage</code> operand of that instruction <strong class=\"purple\">must</strong> have a <code>Width</code> of 32."
+          "text": " If a <a href=\"#VkBufferView\">VkBufferView</a> with a <a href=\"#VkFormat\">VkFormat</a> that has a channel width less than 64-bit is accessed as a result of this command, the <code>SampledType</code> of the <code>OpTypeImage</code> operand of that instruction <strong class=\"purple\">must</strong> have a <code>Width</code> of 32"
         },
         {
           "vuid": "VUID-vkCmdDispatchBase-sparseImageInt64Atomics-04474",
-          "text": " If the <a href=\"#features-sparseImageInt64Atomics\"><code>sparseImageInt64Atomics</code></a> feature is not enabled, <a href=\"#VkImage\">VkImage</a> objects created with the <code>VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT</code> flag <strong class=\"purple\">must</strong> not be accessed by atomic instructions through an <code>OpTypeImage</code> with a <code>SampledType</code> with a <code>Width</code> of 64 by this command."
+          "text": " If the <a href=\"#features-sparseImageInt64Atomics\"><code>sparseImageInt64Atomics</code></a> feature is not enabled, <a href=\"#VkImage\">VkImage</a> objects created with the <code>VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT</code> flag <strong class=\"purple\">must</strong> not be accessed by atomic instructions through an <code>OpTypeImage</code> with a <code>SampledType</code> with a <code>Width</code> of 64 by this command"
         },
         {
           "vuid": "VUID-vkCmdDispatchBase-sparseImageInt64Atomics-04475",
-          "text": " If the <a href=\"#features-sparseImageInt64Atomics\"><code>sparseImageInt64Atomics</code></a> feature is not enabled, <a href=\"#VkBuffer\">VkBuffer</a> objects created with the <code>VK_BUFFER_CREATE_SPARSE_RESIDENCY_BIT</code> flag <strong class=\"purple\">must</strong> not be accessed by atomic instructions through an <code>OpTypeImage</code> with a <code>SampledType</code> with a <code>Width</code> of 64 by this command."
+          "text": " If the <a href=\"#features-sparseImageInt64Atomics\"><code>sparseImageInt64Atomics</code></a> feature is not enabled, <a href=\"#VkBuffer\">VkBuffer</a> objects created with the <code>VK_BUFFER_CREATE_SPARSE_RESIDENCY_BIT</code> flag <strong class=\"purple\">must</strong> not be accessed by atomic instructions through an <code>OpTypeImage</code> with a <code>SampledType</code> with a <code>Width</code> of 64 by this command"
         }
       ]
     },
@@ -32272,7 +32608,7 @@
         },
         {
           "vuid": "VUID-vkCmdSubpassShadingHUAWEI-commandBuffer-02701",
-          "text": " If the <code>VkPipeline</code> object bound to the pipeline bind point used by this command requires any dynamic state, that state <strong class=\"purple\">must</strong> have been set"
+          "text": " If the <code>VkPipeline</code> object bound to the pipeline bind point used by this command requires any dynamic state, that state <strong class=\"purple\">must</strong> have been set or inherited (if the <code><a href=\"#VK_NV_inherited_viewport_scissor\">VK_NV_inherited_viewport_scissor</a></code> extension is enabled) for <code>commandBuffer</code>, and done so after any previously bound pipeline with the corresponding state not specified as dynamic"
         },
         {
           "vuid": "VUID-vkCmdSubpassShadingHUAWEI-None-02859",
@@ -32300,11 +32636,11 @@
         },
         {
           "vuid": "VUID-vkCmdSubpassShadingHUAWEI-None-04115",
-          "text": " If a <a href=\"#VkImageView\">VkImageView</a> is accessed using <code>OpImageWrite</code> as a result of this command, then the <code>Type</code> of the <code>Texel</code> operand of that instruction <strong class=\"purple\">must</strong> have at least as many components as the image view&#8217;s format."
+          "text": " If a <a href=\"#VkImageView\">VkImageView</a> is accessed using <code>OpImageWrite</code> as a result of this command, then the <code>Type</code> of the <code>Texel</code> operand of that instruction <strong class=\"purple\">must</strong> have at least as many components as the image view&#8217;s format"
         },
         {
           "vuid": "VUID-vkCmdSubpassShadingHUAWEI-OpImageWrite-04469",
-          "text": " If a <a href=\"#VkBufferView\">VkBufferView</a> is accessed using <code>OpImageWrite</code> as a result of this command, then the <code>Type</code> of the <code>Texel</code> operand of that instruction <strong class=\"purple\">must</strong> have at least as many components as the buffer view&#8217;s format."
+          "text": " If a <a href=\"#VkBufferView\">VkBufferView</a> is accessed using <code>OpImageWrite</code> as a result of this command, then the <code>Type</code> of the <code>Texel</code> operand of that instruction <strong class=\"purple\">must</strong> have at least as many components as the buffer view&#8217;s format"
         },
         {
           "vuid": "VUID-vkCmdSubpassShadingHUAWEI-None-04931",
@@ -32364,27 +32700,27 @@
       "(VK_HUAWEI_subpass_shading)+(VK_EXT_shader_image_atomic_int64)": [
         {
           "vuid": "VUID-vkCmdSubpassShadingHUAWEI-SampledType-04470",
-          "text": " If a <a href=\"#VkImageView\">VkImageView</a> with a <a href=\"#VkFormat\">VkFormat</a> that has a 64-bit channel width is accessed as a result of this command, the <code>SampledType</code> of the <code>OpTypeImage</code> operand of that instruction <strong class=\"purple\">must</strong> have a <code>Width</code> of 64."
+          "text": " If a <a href=\"#VkImageView\">VkImageView</a> with a <a href=\"#VkFormat\">VkFormat</a> that has a 64-bit channel width is accessed as a result of this command, the <code>SampledType</code> of the <code>OpTypeImage</code> operand of that instruction <strong class=\"purple\">must</strong> have a <code>Width</code> of 64"
         },
         {
           "vuid": "VUID-vkCmdSubpassShadingHUAWEI-SampledType-04471",
-          "text": " If a <a href=\"#VkImageView\">VkImageView</a> with a <a href=\"#VkFormat\">VkFormat</a> that has a channel width less than 64-bit is accessed as a result of this command, the <code>SampledType</code> of the <code>OpTypeImage</code> operand of that instruction <strong class=\"purple\">must</strong> have a <code>Width</code> of 32."
+          "text": " If a <a href=\"#VkImageView\">VkImageView</a> with a <a href=\"#VkFormat\">VkFormat</a> that has a channel width less than 64-bit is accessed as a result of this command, the <code>SampledType</code> of the <code>OpTypeImage</code> operand of that instruction <strong class=\"purple\">must</strong> have a <code>Width</code> of 32"
         },
         {
           "vuid": "VUID-vkCmdSubpassShadingHUAWEI-SampledType-04472",
-          "text": " If a <a href=\"#VkBufferView\">VkBufferView</a> with a <a href=\"#VkFormat\">VkFormat</a> that has a 64-bit channel width is accessed as a result of this command, the <code>SampledType</code> of the <code>OpTypeImage</code> operand of that instruction <strong class=\"purple\">must</strong> have a <code>Width</code> of 64."
+          "text": " If a <a href=\"#VkBufferView\">VkBufferView</a> with a <a href=\"#VkFormat\">VkFormat</a> that has a 64-bit channel width is accessed as a result of this command, the <code>SampledType</code> of the <code>OpTypeImage</code> operand of that instruction <strong class=\"purple\">must</strong> have a <code>Width</code> of 64"
         },
         {
           "vuid": "VUID-vkCmdSubpassShadingHUAWEI-SampledType-04473",
-          "text": " If a <a href=\"#VkBufferView\">VkBufferView</a> with a <a href=\"#VkFormat\">VkFormat</a> that has a channel width less than 64-bit is accessed as a result of this command, the <code>SampledType</code> of the <code>OpTypeImage</code> operand of that instruction <strong class=\"purple\">must</strong> have a <code>Width</code> of 32."
+          "text": " If a <a href=\"#VkBufferView\">VkBufferView</a> with a <a href=\"#VkFormat\">VkFormat</a> that has a channel width less than 64-bit is accessed as a result of this command, the <code>SampledType</code> of the <code>OpTypeImage</code> operand of that instruction <strong class=\"purple\">must</strong> have a <code>Width</code> of 32"
         },
         {
           "vuid": "VUID-vkCmdSubpassShadingHUAWEI-sparseImageInt64Atomics-04474",
-          "text": " If the <a href=\"#features-sparseImageInt64Atomics\"><code>sparseImageInt64Atomics</code></a> feature is not enabled, <a href=\"#VkImage\">VkImage</a> objects created with the <code>VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT</code> flag <strong class=\"purple\">must</strong> not be accessed by atomic instructions through an <code>OpTypeImage</code> with a <code>SampledType</code> with a <code>Width</code> of 64 by this command."
+          "text": " If the <a href=\"#features-sparseImageInt64Atomics\"><code>sparseImageInt64Atomics</code></a> feature is not enabled, <a href=\"#VkImage\">VkImage</a> objects created with the <code>VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT</code> flag <strong class=\"purple\">must</strong> not be accessed by atomic instructions through an <code>OpTypeImage</code> with a <code>SampledType</code> with a <code>Width</code> of 64 by this command"
         },
         {
           "vuid": "VUID-vkCmdSubpassShadingHUAWEI-sparseImageInt64Atomics-04475",
-          "text": " If the <a href=\"#features-sparseImageInt64Atomics\"><code>sparseImageInt64Atomics</code></a> feature is not enabled, <a href=\"#VkBuffer\">VkBuffer</a> objects created with the <code>VK_BUFFER_CREATE_SPARSE_RESIDENCY_BIT</code> flag <strong class=\"purple\">must</strong> not be accessed by atomic instructions through an <code>OpTypeImage</code> with a <code>SampledType</code> with a <code>Width</code> of 64 by this command."
+          "text": " If the <a href=\"#features-sparseImageInt64Atomics\"><code>sparseImageInt64Atomics</code></a> feature is not enabled, <a href=\"#VkBuffer\">VkBuffer</a> objects created with the <code>VK_BUFFER_CREATE_SPARSE_RESIDENCY_BIT</code> flag <strong class=\"purple\">must</strong> not be accessed by atomic instructions through an <code>OpTypeImage</code> with a <code>SampledType</code> with a <code>Width</code> of 64 by this command"
         }
       ]
     },
@@ -32744,7 +33080,7 @@
         },
         {
           "vuid": "VUID-vkCmdExecuteGeneratedCommandsNV-commandBuffer-02701",
-          "text": " If the <code>VkPipeline</code> object bound to the pipeline bind point used by this command requires any dynamic state, that state <strong class=\"purple\">must</strong> have been set"
+          "text": " If the <code>VkPipeline</code> object bound to the pipeline bind point used by this command requires any dynamic state, that state <strong class=\"purple\">must</strong> have been set or inherited (if the <code><a href=\"#VK_NV_inherited_viewport_scissor\">VK_NV_inherited_viewport_scissor</a></code> extension is enabled) for <code>commandBuffer</code>, and done so after any previously bound pipeline with the corresponding state not specified as dynamic"
         },
         {
           "vuid": "VUID-vkCmdExecuteGeneratedCommandsNV-None-02859",
@@ -32772,11 +33108,11 @@
         },
         {
           "vuid": "VUID-vkCmdExecuteGeneratedCommandsNV-None-04115",
-          "text": " If a <a href=\"#VkImageView\">VkImageView</a> is accessed using <code>OpImageWrite</code> as a result of this command, then the <code>Type</code> of the <code>Texel</code> operand of that instruction <strong class=\"purple\">must</strong> have at least as many components as the image view&#8217;s format."
+          "text": " If a <a href=\"#VkImageView\">VkImageView</a> is accessed using <code>OpImageWrite</code> as a result of this command, then the <code>Type</code> of the <code>Texel</code> operand of that instruction <strong class=\"purple\">must</strong> have at least as many components as the image view&#8217;s format"
         },
         {
           "vuid": "VUID-vkCmdExecuteGeneratedCommandsNV-OpImageWrite-04469",
-          "text": " If a <a href=\"#VkBufferView\">VkBufferView</a> is accessed using <code>OpImageWrite</code> as a result of this command, then the <code>Type</code> of the <code>Texel</code> operand of that instruction <strong class=\"purple\">must</strong> have at least as many components as the buffer view&#8217;s format."
+          "text": " If a <a href=\"#VkBufferView\">VkBufferView</a> is accessed using <code>OpImageWrite</code> as a result of this command, then the <code>Type</code> of the <code>Texel</code> operand of that instruction <strong class=\"purple\">must</strong> have at least as many components as the buffer view&#8217;s format"
         },
         {
           "vuid": "VUID-vkCmdExecuteGeneratedCommandsNV-renderPass-02684",
@@ -32888,27 +33224,27 @@
       "(VK_NV_device_generated_commands)+(VK_EXT_shader_image_atomic_int64)": [
         {
           "vuid": "VUID-vkCmdExecuteGeneratedCommandsNV-SampledType-04470",
-          "text": " If a <a href=\"#VkImageView\">VkImageView</a> with a <a href=\"#VkFormat\">VkFormat</a> that has a 64-bit channel width is accessed as a result of this command, the <code>SampledType</code> of the <code>OpTypeImage</code> operand of that instruction <strong class=\"purple\">must</strong> have a <code>Width</code> of 64."
+          "text": " If a <a href=\"#VkImageView\">VkImageView</a> with a <a href=\"#VkFormat\">VkFormat</a> that has a 64-bit channel width is accessed as a result of this command, the <code>SampledType</code> of the <code>OpTypeImage</code> operand of that instruction <strong class=\"purple\">must</strong> have a <code>Width</code> of 64"
         },
         {
           "vuid": "VUID-vkCmdExecuteGeneratedCommandsNV-SampledType-04471",
-          "text": " If a <a href=\"#VkImageView\">VkImageView</a> with a <a href=\"#VkFormat\">VkFormat</a> that has a channel width less than 64-bit is accessed as a result of this command, the <code>SampledType</code> of the <code>OpTypeImage</code> operand of that instruction <strong class=\"purple\">must</strong> have a <code>Width</code> of 32."
+          "text": " If a <a href=\"#VkImageView\">VkImageView</a> with a <a href=\"#VkFormat\">VkFormat</a> that has a channel width less than 64-bit is accessed as a result of this command, the <code>SampledType</code> of the <code>OpTypeImage</code> operand of that instruction <strong class=\"purple\">must</strong> have a <code>Width</code> of 32"
         },
         {
           "vuid": "VUID-vkCmdExecuteGeneratedCommandsNV-SampledType-04472",
-          "text": " If a <a href=\"#VkBufferView\">VkBufferView</a> with a <a href=\"#VkFormat\">VkFormat</a> that has a 64-bit channel width is accessed as a result of this command, the <code>SampledType</code> of the <code>OpTypeImage</code> operand of that instruction <strong class=\"purple\">must</strong> have a <code>Width</code> of 64."
+          "text": " If a <a href=\"#VkBufferView\">VkBufferView</a> with a <a href=\"#VkFormat\">VkFormat</a> that has a 64-bit channel width is accessed as a result of this command, the <code>SampledType</code> of the <code>OpTypeImage</code> operand of that instruction <strong class=\"purple\">must</strong> have a <code>Width</code> of 64"
         },
         {
           "vuid": "VUID-vkCmdExecuteGeneratedCommandsNV-SampledType-04473",
-          "text": " If a <a href=\"#VkBufferView\">VkBufferView</a> with a <a href=\"#VkFormat\">VkFormat</a> that has a channel width less than 64-bit is accessed as a result of this command, the <code>SampledType</code> of the <code>OpTypeImage</code> operand of that instruction <strong class=\"purple\">must</strong> have a <code>Width</code> of 32."
+          "text": " If a <a href=\"#VkBufferView\">VkBufferView</a> with a <a href=\"#VkFormat\">VkFormat</a> that has a channel width less than 64-bit is accessed as a result of this command, the <code>SampledType</code> of the <code>OpTypeImage</code> operand of that instruction <strong class=\"purple\">must</strong> have a <code>Width</code> of 32"
         },
         {
           "vuid": "VUID-vkCmdExecuteGeneratedCommandsNV-sparseImageInt64Atomics-04474",
-          "text": " If the <a href=\"#features-sparseImageInt64Atomics\"><code>sparseImageInt64Atomics</code></a> feature is not enabled, <a href=\"#VkImage\">VkImage</a> objects created with the <code>VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT</code> flag <strong class=\"purple\">must</strong> not be accessed by atomic instructions through an <code>OpTypeImage</code> with a <code>SampledType</code> with a <code>Width</code> of 64 by this command."
+          "text": " If the <a href=\"#features-sparseImageInt64Atomics\"><code>sparseImageInt64Atomics</code></a> feature is not enabled, <a href=\"#VkImage\">VkImage</a> objects created with the <code>VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT</code> flag <strong class=\"purple\">must</strong> not be accessed by atomic instructions through an <code>OpTypeImage</code> with a <code>SampledType</code> with a <code>Width</code> of 64 by this command"
         },
         {
           "vuid": "VUID-vkCmdExecuteGeneratedCommandsNV-sparseImageInt64Atomics-04475",
-          "text": " If the <a href=\"#features-sparseImageInt64Atomics\"><code>sparseImageInt64Atomics</code></a> feature is not enabled, <a href=\"#VkBuffer\">VkBuffer</a> objects created with the <code>VK_BUFFER_CREATE_SPARSE_RESIDENCY_BIT</code> flag <strong class=\"purple\">must</strong> not be accessed by atomic instructions through an <code>OpTypeImage</code> with a <code>SampledType</code> with a <code>Width</code> of 64 by this command."
+          "text": " If the <a href=\"#features-sparseImageInt64Atomics\"><code>sparseImageInt64Atomics</code></a> feature is not enabled, <a href=\"#VkBuffer\">VkBuffer</a> objects created with the <code>VK_BUFFER_CREATE_SPARSE_RESIDENCY_BIT</code> flag <strong class=\"purple\">must</strong> not be accessed by atomic instructions through an <code>OpTypeImage</code> with a <code>SampledType</code> with a <code>Width</code> of 64 by this command"
         }
       ],
       "(VK_NV_device_generated_commands)+(VK_VERSION_1_1,VK_KHR_multiview)": [
@@ -34048,11 +34384,11 @@
       "(VK_KHR_surface)+(VK_MVK_ios_surface)": [
         {
           "vuid": "VUID-VkIOSSurfaceCreateInfoMVK-pView-04143",
-          "text": " If <code>pView</code> is a <code>CAMetalLayer</code> object, it <strong class=\"purple\">must</strong> be a valid <code>CAMetalLayer</code>."
+          "text": " If <code>pView</code> is a <code>CAMetalLayer</code> object, it <strong class=\"purple\">must</strong> be a valid <code>CAMetalLayer</code>"
         },
         {
           "vuid": "VUID-VkIOSSurfaceCreateInfoMVK-pView-01316",
-          "text": " If <code>pView</code> is a <code>UIView</code> object, it <strong class=\"purple\">must</strong> be a valid <code>UIView</code>, <strong class=\"purple\">must</strong> be backed by a <code>CALayer</code> object of type <code>CAMetalLayer</code>, and <a href=\"#vkCreateIOSSurfaceMVK\">vkCreateIOSSurfaceMVK</a> <strong class=\"purple\">must</strong> be called on the main thread."
+          "text": " If <code>pView</code> is a <code>UIView</code> object, it <strong class=\"purple\">must</strong> be a valid <code>UIView</code>, <strong class=\"purple\">must</strong> be backed by a <code>CALayer</code> object of type <code>CAMetalLayer</code>, and <a href=\"#vkCreateIOSSurfaceMVK\">vkCreateIOSSurfaceMVK</a> <strong class=\"purple\">must</strong> be called on the main thread"
         },
         {
           "vuid": "VUID-VkIOSSurfaceCreateInfoMVK-sType-sType",
@@ -34092,11 +34428,11 @@
       "(VK_KHR_surface)+(VK_MVK_macos_surface)": [
         {
           "vuid": "VUID-VkMacOSSurfaceCreateInfoMVK-pView-04144",
-          "text": " If <code>pView</code> is a <code>CAMetalLayer</code> object, it <strong class=\"purple\">must</strong> be a valid <code>CAMetalLayer</code>."
+          "text": " If <code>pView</code> is a <code>CAMetalLayer</code> object, it <strong class=\"purple\">must</strong> be a valid <code>CAMetalLayer</code>"
         },
         {
           "vuid": "VUID-VkMacOSSurfaceCreateInfoMVK-pView-01317",
-          "text": " If <code>pView</code> is an <code>NSView</code> object, it <strong class=\"purple\">must</strong> be a valid <code>NSView</code>, <strong class=\"purple\">must</strong> be backed by a <code>CALayer</code> object of type <code>CAMetalLayer</code>, and <a href=\"#vkCreateMacOSSurfaceMVK\">vkCreateMacOSSurfaceMVK</a> <strong class=\"purple\">must</strong> be called on the main thread."
+          "text": " If <code>pView</code> is an <code>NSView</code> object, it <strong class=\"purple\">must</strong> be a valid <code>NSView</code>, <strong class=\"purple\">must</strong> be backed by a <code>CALayer</code> object of type <code>CAMetalLayer</code>, and <a href=\"#vkCreateMacOSSurfaceMVK\">vkCreateMacOSSurfaceMVK</a> <strong class=\"purple\">must</strong> be called on the main thread"
         },
         {
           "vuid": "VUID-VkMacOSSurfaceCreateInfoMVK-sType-sType",
@@ -34923,6 +35259,10 @@
     "vkGetPhysicalDeviceSurfaceCapabilitiesKHR": {
       "(VK_KHR_surface)": [
         {
+          "vuid": "VUID-vkGetPhysicalDeviceSurfaceCapabilitiesKHR-surface-06211",
+          "text": " <code>surface</code> <strong class=\"purple\">must</strong> be supported by <code>physicalDevice</code>, as reported by <a href=\"#vkGetPhysicalDeviceSurfaceSupportKHR\">vkGetPhysicalDeviceSurfaceSupportKHR</a> or an equivalent platform-specific mechanism"
+        },
+        {
           "vuid": "VUID-vkGetPhysicalDeviceSurfaceCapabilitiesKHR-physicalDevice-parameter",
           "text": " <code>physicalDevice</code> <strong class=\"purple\">must</strong> be a valid <a href=\"#VkPhysicalDevice\">VkPhysicalDevice</a> handle"
         },
@@ -34943,6 +35283,10 @@
     "vkGetPhysicalDeviceSurfaceCapabilities2KHR": {
       "(VK_KHR_surface)+(VK_KHR_get_surface_capabilities2)+(VK_EXT_full_screen_exclusive+VK_KHR_win32_surface)": [
         {
+          "vuid": "VUID-vkGetPhysicalDeviceSurfaceCapabilities2KHR-pSurfaceInfo-06210",
+          "text": " <code>pSurfaceInfo-&gt;surface</code> <strong class=\"purple\">must</strong> be supported by <code>physicalDevice</code>, as reported by <a href=\"#vkGetPhysicalDeviceSurfaceSupportKHR\">vkGetPhysicalDeviceSurfaceSupportKHR</a> or an equivalent platform-specific mechanism"
+        },
+        {
           "vuid": "VUID-vkGetPhysicalDeviceSurfaceCapabilities2KHR-pNext-02671",
           "text": " If a <a href=\"#VkSurfaceCapabilitiesFullScreenExclusiveEXT\">VkSurfaceCapabilitiesFullScreenExclusiveEXT</a> structure is included in the <code>pNext</code> chain of <code>pSurfaceCapabilities</code>, a <a href=\"#VkSurfaceFullScreenExclusiveWin32InfoEXT\">VkSurfaceFullScreenExclusiveWin32InfoEXT</a> structure <strong class=\"purple\">must</strong> be included in the <code>pNext</code> chain of <code>pSurfaceInfo</code>"
         }
@@ -35063,6 +35407,10 @@
     "vkGetPhysicalDeviceSurfaceCapabilities2EXT": {
       "(VK_KHR_surface)+(VK_EXT_display_surface_counter)": [
         {
+          "vuid": "VUID-vkGetPhysicalDeviceSurfaceCapabilities2EXT-surface-06211",
+          "text": " <code>surface</code> <strong class=\"purple\">must</strong> be supported by <code>physicalDevice</code>, as reported by <a href=\"#vkGetPhysicalDeviceSurfaceSupportKHR\">vkGetPhysicalDeviceSurfaceSupportKHR</a> or an equivalent platform-specific mechanism"
+        },
+        {
           "vuid": "VUID-vkGetPhysicalDeviceSurfaceCapabilities2EXT-physicalDevice-parameter",
           "text": " <code>physicalDevice</code> <strong class=\"purple\">must</strong> be a valid <a href=\"#VkPhysicalDevice\">VkPhysicalDevice</a> handle"
         },
@@ -35099,7 +35447,7 @@
     "vkGetPhysicalDeviceSurfaceFormatsKHR": {
       "(VK_KHR_surface)": [
         {
-          "vuid": "VUID-vkGetPhysicalDeviceSurfaceFormatsKHR-surface-02739",
+          "vuid": "VUID-vkGetPhysicalDeviceSurfaceFormatsKHR-surface-06211",
           "text": " <code>surface</code> <strong class=\"purple\">must</strong> be supported by <code>physicalDevice</code>, as reported by <a href=\"#vkGetPhysicalDeviceSurfaceSupportKHR\">vkGetPhysicalDeviceSurfaceSupportKHR</a> or an equivalent platform-specific mechanism"
         },
         {
@@ -35127,7 +35475,7 @@
     "vkGetPhysicalDeviceSurfaceFormats2KHR": {
       "(VK_KHR_surface)+(VK_KHR_get_surface_capabilities2)": [
         {
-          "vuid": "VUID-vkGetPhysicalDeviceSurfaceFormats2KHR-pSurfaceInfo-02740",
+          "vuid": "VUID-vkGetPhysicalDeviceSurfaceFormats2KHR-pSurfaceInfo-06210",
           "text": " <code>pSurfaceInfo-&gt;surface</code> <strong class=\"purple\">must</strong> be supported by <code>physicalDevice</code>, as reported by <a href=\"#vkGetPhysicalDeviceSurfaceSupportKHR\">vkGetPhysicalDeviceSurfaceSupportKHR</a> or an equivalent platform-specific mechanism"
         },
         {
@@ -35163,6 +35511,10 @@
     "vkGetPhysicalDeviceSurfacePresentModesKHR": {
       "(VK_KHR_surface)": [
         {
+          "vuid": "VUID-vkGetPhysicalDeviceSurfacePresentModesKHR-surface-06211",
+          "text": " <code>surface</code> <strong class=\"purple\">must</strong> be supported by <code>physicalDevice</code>, as reported by <a href=\"#vkGetPhysicalDeviceSurfaceSupportKHR\">vkGetPhysicalDeviceSurfaceSupportKHR</a> or an equivalent platform-specific mechanism"
+        },
+        {
           "vuid": "VUID-vkGetPhysicalDeviceSurfacePresentModesKHR-physicalDevice-parameter",
           "text": " <code>physicalDevice</code> <strong class=\"purple\">must</strong> be a valid <a href=\"#VkPhysicalDevice\">VkPhysicalDevice</a> handle"
         },
@@ -35187,6 +35539,10 @@
     "vkGetPhysicalDeviceSurfacePresentModes2EXT": {
       "(VK_KHR_surface)+(VK_EXT_full_screen_exclusive)": [
         {
+          "vuid": "VUID-vkGetPhysicalDeviceSurfacePresentModes2EXT-pSurfaceInfo-06210",
+          "text": " <code>pSurfaceInfo-&gt;surface</code> <strong class=\"purple\">must</strong> be supported by <code>physicalDevice</code>, as reported by <a href=\"#vkGetPhysicalDeviceSurfaceSupportKHR\">vkGetPhysicalDeviceSurfaceSupportKHR</a> or an equivalent platform-specific mechanism"
+        },
+        {
           "vuid": "VUID-vkGetPhysicalDeviceSurfacePresentModes2EXT-physicalDevice-parameter",
           "text": " <code>physicalDevice</code> <strong class=\"purple\">must</strong> be a valid <a href=\"#VkPhysicalDevice\">VkPhysicalDevice</a> handle"
         },
@@ -35271,6 +35627,10 @@
     "vkGetDeviceGroupSurfacePresentModesKHR": {
       "(VK_KHR_surface)+(VK_KHR_swapchain)+(VK_VERSION_1_1,VK_KHR_device_group)": [
         {
+          "vuid": "VUID-vkGetDeviceGroupSurfacePresentModesKHR-surface-06212",
+          "text": " <code>surface</code> <strong class=\"purple\">must</strong> be supported by all physical devices associated with <code>device</code>, as reported by <a href=\"#vkGetPhysicalDeviceSurfaceSupportKHR\">vkGetPhysicalDeviceSurfaceSupportKHR</a> or an equivalent platform-specific mechanism"
+        },
+        {
           "vuid": "VUID-vkGetDeviceGroupSurfacePresentModesKHR-device-parameter",
           "text": " <code>device</code> <strong class=\"purple\">must</strong> be a valid <a href=\"#VkDevice\">VkDevice</a> handle"
         },
@@ -35291,6 +35651,10 @@
     "vkGetDeviceGroupSurfacePresentModes2EXT": {
       "(VK_KHR_surface)+(VK_KHR_swapchain)+(VK_VERSION_1_1,VK_KHR_device_group)+(VK_EXT_full_screen_exclusive)": [
         {
+          "vuid": "VUID-vkGetDeviceGroupSurfacePresentModes2EXT-pSurfaceInfo-06213",
+          "text": " <code>pSurfaceInfo-&gt;surface</code> <strong class=\"purple\">must</strong> be supported by all physical devices associated with <code>device</code>, as reported by <a href=\"#vkGetPhysicalDeviceSurfaceSupportKHR\">vkGetPhysicalDeviceSurfaceSupportKHR</a> or an equivalent platform-specific mechanism"
+        },
+        {
           "vuid": "VUID-vkGetDeviceGroupSurfacePresentModes2EXT-device-parameter",
           "text": " <code>device</code> <strong class=\"purple\">must</strong> be a valid <a href=\"#VkDevice\">VkDevice</a> handle"
         },
@@ -35307,6 +35671,10 @@
     "vkGetPhysicalDevicePresentRectanglesKHR": {
       "(VK_KHR_surface)+(VK_KHR_swapchain)+(VK_VERSION_1_1,VK_KHR_device_group)": [
         {
+          "vuid": "VUID-vkGetPhysicalDevicePresentRectanglesKHR-surface-06211",
+          "text": " <code>surface</code> <strong class=\"purple\">must</strong> be supported by <code>physicalDevice</code>, as reported by <a href=\"#vkGetPhysicalDeviceSurfaceSupportKHR\">vkGetPhysicalDeviceSurfaceSupportKHR</a> or an equivalent platform-specific mechanism"
+        },
+        {
           "vuid": "VUID-vkGetPhysicalDevicePresentRectanglesKHR-physicalDevice-parameter",
           "text": " <code>physicalDevice</code> <strong class=\"purple\">must</strong> be a valid <a href=\"#VkPhysicalDevice\">VkPhysicalDevice</a> handle"
         },
@@ -35973,6 +36341,12 @@
           "text": " Each element of <code>pImageIndices</code> <strong class=\"purple\">must</strong> be the index of a presentable image acquired from the swapchain specified by the corresponding element of the <code>pSwapchains</code> array, and the presented image subresource <strong class=\"purple\">must</strong> be in the <code>VK_IMAGE_LAYOUT_PRESENT_SRC_KHR</code> or <code>VK_IMAGE_LAYOUT_SHARED_PRESENT_KHR</code> layout at the time the operation is executed on a <code>VkDevice</code>"
         }
       ],
+      "(VK_KHR_surface)+(VK_KHR_swapchain)+(VK_KHR_present_id)": [
+        {
+          "vuid": "VUID-VkPresentInfoKHR-pNext-06235",
+          "text": " If a <a href=\"#VkPresentIdKHR\">VkPresentIdKHR</a> structure is included in the <code>pNext</code> chain, and the <a href=\"#features-presentId\"><code>presentId</code></a> feature is not enabled, each <code>presentIds</code> entry in that structure <strong class=\"purple\">must</strong> be NULL"
+        }
+      ],
       "(VK_KHR_surface)+(VK_KHR_swapchain)": [
         {
           "vuid": "VUID-VkPresentInfoKHR-sType-sType",
@@ -35980,7 +36354,7 @@
         },
         {
           "vuid": "VUID-VkPresentInfoKHR-pNext-pNext",
-          "text": " Each <code>pNext</code> member of any structure (including this one) in the <code>pNext</code> chain <strong class=\"purple\">must</strong> be either <code>NULL</code> or a pointer to a valid instance of <a href=\"#VkDeviceGroupPresentInfoKHR\">VkDeviceGroupPresentInfoKHR</a>, <a href=\"#VkDisplayPresentInfoKHR\">VkDisplayPresentInfoKHR</a>, <a href=\"#VkPresentFrameTokenGGP\">VkPresentFrameTokenGGP</a>, <a href=\"#VkPresentRegionsKHR\">VkPresentRegionsKHR</a>, or <a href=\"#VkPresentTimesInfoGOOGLE\">VkPresentTimesInfoGOOGLE</a>"
+          "text": " Each <code>pNext</code> member of any structure (including this one) in the <code>pNext</code> chain <strong class=\"purple\">must</strong> be either <code>NULL</code> or a pointer to a valid instance of <a href=\"#VkDeviceGroupPresentInfoKHR\">VkDeviceGroupPresentInfoKHR</a>, <a href=\"#VkDisplayPresentInfoKHR\">VkDisplayPresentInfoKHR</a>, <a href=\"#VkPresentFrameTokenGGP\">VkPresentFrameTokenGGP</a>, <a href=\"#VkPresentIdKHR\">VkPresentIdKHR</a>, <a href=\"#VkPresentRegionsKHR\">VkPresentRegionsKHR</a>, or <a href=\"#VkPresentTimesInfoGOOGLE\">VkPresentTimesInfoGOOGLE</a>"
         },
         {
           "vuid": "VUID-VkPresentInfoKHR-sType-unique",
@@ -36044,7 +36418,7 @@
       "(VK_KHR_surface)+(VK_KHR_swapchain)+(VK_KHR_incremental_present)": [
         {
           "vuid": "VUID-VkRectLayerKHR-offset-04864",
-          "text": " The sum of <code>offset</code> and <code>extent</code>, after being transformed according to the <code>preTransform</code> member of the <a href=\"#VkSwapchainCreateInfoKHR\">VkSwapchainCreateInfoKHR</a> structure, <strong class=\"purple\">must</strong> be no greater than the <code>imageExtent</code> member of the <a href=\"#VkSwapchainCreateInfoKHR\">VkSwapchainCreateInfoKHR</a> structure passed to <a href=\"#vkCreateSwapchainKHR\">vkCreateSwapchainKHR</a>."
+          "text": " The sum of <code>offset</code> and <code>extent</code>, after being transformed according to the <code>preTransform</code> member of the <a href=\"#VkSwapchainCreateInfoKHR\">VkSwapchainCreateInfoKHR</a> structure, <strong class=\"purple\">must</strong> be no greater than the <code>imageExtent</code> member of the <a href=\"#VkSwapchainCreateInfoKHR\">VkSwapchainCreateInfoKHR</a> structure passed to <a href=\"#vkCreateSwapchainKHR\">vkCreateSwapchainKHR</a>"
         },
         {
           "vuid": "VUID-VkRectLayerKHR-layer-01262",
@@ -36136,6 +36510,54 @@
         }
       ]
     },
+    "VkPresentIdKHR": {
+      "(VK_KHR_surface)+(VK_KHR_swapchain)+(VK_KHR_present_id)": [
+        {
+          "vuid": "VUID-VkPresentIdKHR-swapchainCount-04998",
+          "text": " <code>swapchainCount</code> <strong class=\"purple\">must</strong> be the same value as <code>VkPresentInfoKHR</code>::<code>swapchainCount</code>, where this <code>VkPresentIdKHR</code> is in the pNext-chain of the <code>VkPresentInfoKHR</code> structure"
+        },
+        {
+          "vuid": "VUID-VkPresentIdKHR-presentIds-04999",
+          "text": " Each <code>presentIds</code> entry <strong class=\"purple\">must</strong> be greater than any previous <code>presentIds</code> entry passed for the associated <code>pSwapchains</code> entry"
+        },
+        {
+          "vuid": "VUID-VkPresentIdKHR-sType-sType",
+          "text": " <code>sType</code> <strong class=\"purple\">must</strong> be <code>VK_STRUCTURE_TYPE_PRESENT_ID_KHR</code>"
+        },
+        {
+          "vuid": "VUID-VkPresentIdKHR-pPresentIds-parameter",
+          "text": " If <code>pPresentIds</code> is not <code>NULL</code>, <code>pPresentIds</code> <strong class=\"purple\">must</strong> be a valid pointer to an array of <code>swapchainCount</code> <code>uint64_t</code> values"
+        },
+        {
+          "vuid": "VUID-VkPresentIdKHR-swapchainCount-arraylength",
+          "text": " <code>swapchainCount</code> <strong class=\"purple\">must</strong> be greater than <code>0</code>"
+        }
+      ]
+    },
+    "vkWaitForPresentKHR": {
+      "(VK_KHR_surface)+(VK_KHR_swapchain)+(VK_KHR_present_id)+(VK_KHR_present_wait)": [
+        {
+          "vuid": "VUID-vkWaitForPresentKHR-swapchain-04997",
+          "text": " <code>swapchain</code> <strong class=\"purple\">must</strong> not be in the retired state"
+        },
+        {
+          "vuid": "VUID-vkWaitForPresentKHR-presentWait-06234",
+          "text": " The <a href=\"#features-presentWait\"><code>presentWait</code></a> feature <strong class=\"purple\">must</strong> be enabled"
+        },
+        {
+          "vuid": "VUID-vkWaitForPresentKHR-device-parameter",
+          "text": " <code>device</code> <strong class=\"purple\">must</strong> be a valid <a href=\"#VkDevice\">VkDevice</a> handle"
+        },
+        {
+          "vuid": "VUID-vkWaitForPresentKHR-swapchain-parameter",
+          "text": " <code>swapchain</code> <strong class=\"purple\">must</strong> be a valid <a href=\"#VkSwapchainKHR\">VkSwapchainKHR</a> handle"
+        },
+        {
+          "vuid": "VUID-vkWaitForPresentKHR-commonparent",
+          "text": " Both of <code>device</code>, and <code>swapchain</code> <strong class=\"purple\">must</strong> have been created, allocated, or retrieved from the same <a href=\"#VkInstance\">VkInstance</a>"
+        }
+      ]
+    },
     "VkPresentFrameTokenGGP": {
       "(VK_KHR_surface)+(VK_KHR_swapchain)+(VK_GGP_frame_token)": [
         {
@@ -36420,7 +36842,7 @@
         },
         {
           "vuid": "VUID-vkCmdBuildAccelerationStructureNV-update-02490",
-          "text": " If <code>update</code> is <code>VK_TRUE</code>, <code>src</code> <strong class=\"purple\">must</strong> have been built before with <code>VK_BUILD_ACCELERATION_STRUCTURE_ALLOW_UPDATE_BIT_NV</code> set in <a href=\"#VkAccelerationStructureInfoNV\">VkAccelerationStructureInfoNV</a>::<code>flags</code>"
+          "text": " If <code>update</code> is <code>VK_TRUE</code>, <code>src</code> <strong class=\"purple\">must</strong> have previously been constructed with <code>VK_BUILD_ACCELERATION_STRUCTURE_ALLOW_UPDATE_BIT_NV</code> set in <a href=\"#VkAccelerationStructureInfoNV\">VkAccelerationStructureInfoNV</a>::<code>flags</code> in the original build"
         },
         {
           "vuid": "VUID-vkCmdBuildAccelerationStructureNV-update-02491",
@@ -36568,7 +36990,7 @@
         },
         {
           "vuid": "VUID-vkCmdBuildAccelerationStructuresKHR-pInfos-03667",
-          "text": " For each element of <code>pInfos</code>, if its <code>mode</code> member is <code>VK_BUILD_ACCELERATION_STRUCTURE_MODE_UPDATE_KHR</code>, its <code>srcAccelerationStructure</code> member <strong class=\"purple\">must</strong> have been built before with <code>VK_BUILD_ACCELERATION_STRUCTURE_ALLOW_UPDATE_BIT_KHR</code> set in <a href=\"#VkAccelerationStructureBuildGeometryInfoKHR\">VkAccelerationStructureBuildGeometryInfoKHR</a>::<code>flags</code>"
+          "text": " For each element of <code>pInfos</code>, if its <code>mode</code> member is <code>VK_BUILD_ACCELERATION_STRUCTURE_MODE_UPDATE_KHR</code>, its <code>srcAccelerationStructure</code> member <strong class=\"purple\">must</strong> have previously been constructed with <code>VK_BUILD_ACCELERATION_STRUCTURE_ALLOW_UPDATE_BIT_KHR</code> set in <a href=\"#VkAccelerationStructureBuildGeometryInfoKHR\">VkAccelerationStructureBuildGeometryInfoKHR</a>::<code>flags</code> in the build"
         },
         {
           "vuid": "VUID-vkCmdBuildAccelerationStructuresKHR-pInfos-03668",
@@ -36852,7 +37274,7 @@
         },
         {
           "vuid": "VUID-vkCmdBuildAccelerationStructuresIndirectKHR-pInfos-03667",
-          "text": " For each element of <code>pInfos</code>, if its <code>mode</code> member is <code>VK_BUILD_ACCELERATION_STRUCTURE_MODE_UPDATE_KHR</code>, its <code>srcAccelerationStructure</code> member <strong class=\"purple\">must</strong> have been built before with <code>VK_BUILD_ACCELERATION_STRUCTURE_ALLOW_UPDATE_BIT_KHR</code> set in <a href=\"#VkAccelerationStructureBuildGeometryInfoKHR\">VkAccelerationStructureBuildGeometryInfoKHR</a>::<code>flags</code>"
+          "text": " For each element of <code>pInfos</code>, if its <code>mode</code> member is <code>VK_BUILD_ACCELERATION_STRUCTURE_MODE_UPDATE_KHR</code>, its <code>srcAccelerationStructure</code> member <strong class=\"purple\">must</strong> have previously been constructed with <code>VK_BUILD_ACCELERATION_STRUCTURE_ALLOW_UPDATE_BIT_KHR</code> set in <a href=\"#VkAccelerationStructureBuildGeometryInfoKHR\">VkAccelerationStructureBuildGeometryInfoKHR</a>::<code>flags</code> in the build"
         },
         {
           "vuid": "VUID-vkCmdBuildAccelerationStructuresIndirectKHR-pInfos-03668",
@@ -37485,11 +37907,11 @@
           "text": " All acceleration structures in <code>pAccelerationStructures</code> <strong class=\"purple\">must</strong> have been built prior to the execution of this command"
         },
         {
-          "vuid": "VUID-vkCmdWriteAccelerationStructuresPropertiesNV-accelerationStructures-03431",
+          "vuid": "VUID-vkCmdWriteAccelerationStructuresPropertiesNV-pAccelerationStructures-06215",
           "text": " All acceleration structures in <code>pAccelerationStructures</code> <strong class=\"purple\">must</strong> have been built with <code>VK_BUILD_ACCELERATION_STRUCTURE_ALLOW_COMPACTION_BIT_KHR</code> if <code>queryType</code> is <code>VK_QUERY_TYPE_ACCELERATION_STRUCTURE_COMPACTED_SIZE_NV</code>"
         },
         {
-          "vuid": "VUID-vkCmdWriteAccelerationStructuresPropertiesNV-queryType-03432",
+          "vuid": "VUID-vkCmdWriteAccelerationStructuresPropertiesNV-queryType-06216",
           "text": " <code>queryType</code> <strong class=\"purple\">must</strong> be <code>VK_QUERY_TYPE_ACCELERATION_STRUCTURE_COMPACTED_SIZE_NV</code>"
         },
         {
@@ -37538,11 +37960,11 @@
         },
         {
           "vuid": "VUID-vkCmdCopyAccelerationStructureNV-src-04963",
-          "text": " The source acceleration structure <code>src</code> <strong class=\"purple\">must</strong> have been built prior to the execution of this command"
+          "text": " The source acceleration structure <code>src</code> <strong class=\"purple\">must</strong> have been constructed prior to the execution of this command"
         },
         {
           "vuid": "VUID-vkCmdCopyAccelerationStructureNV-src-03411",
-          "text": " If <code>mode</code> is <code>VK_COPY_ACCELERATION_STRUCTURE_MODE_COMPACT_KHR</code>, <code>src</code> <strong class=\"purple\">must</strong> have been built with <code>VK_BUILD_ACCELERATION_STRUCTURE_ALLOW_COMPACTION_BIT_KHR</code>"
+          "text": " If <code>mode</code> is <code>VK_COPY_ACCELERATION_STRUCTURE_MODE_COMPACT_KHR</code>, <code>src</code> <strong class=\"purple\">must</strong> have been constructed with <code>VK_BUILD_ACCELERATION_STRUCTURE_ALLOW_COMPACTION_BIT_KHR</code> in the build"
         },
         {
           "vuid": "VUID-vkCmdCopyAccelerationStructureNV-buffer-03718",
@@ -37626,11 +38048,11 @@
         },
         {
           "vuid": "VUID-VkCopyAccelerationStructureInfoKHR-src-04963",
-          "text": " The source acceleration structure <code>src</code> <strong class=\"purple\">must</strong> have been built prior to the execution of this command"
+          "text": " The source acceleration structure <code>src</code> <strong class=\"purple\">must</strong> have been constructed prior to the execution of this command"
         },
         {
           "vuid": "VUID-VkCopyAccelerationStructureInfoKHR-src-03411",
-          "text": " If <code>mode</code> is <code>VK_COPY_ACCELERATION_STRUCTURE_MODE_COMPACT_KHR</code>, <code>src</code> <strong class=\"purple\">must</strong> have been built with <code>VK_BUILD_ACCELERATION_STRUCTURE_ALLOW_COMPACTION_BIT_KHR</code>"
+          "text": " If <code>mode</code> is <code>VK_COPY_ACCELERATION_STRUCTURE_MODE_COMPACT_KHR</code>, <code>src</code> <strong class=\"purple\">must</strong> have been constructed with <code>VK_BUILD_ACCELERATION_STRUCTURE_ALLOW_COMPACTION_BIT_KHR</code> in the build"
         },
         {
           "vuid": "VUID-VkCopyAccelerationStructureInfoKHR-buffer-03718",
@@ -37710,7 +38132,7 @@
       "(VK_NV_ray_tracing,VK_KHR_acceleration_structure)": [
         {
           "vuid": "VUID-VkCopyAccelerationStructureToMemoryInfoKHR-src-04959",
-          "text": " The source acceleration structure <code>src</code> <strong class=\"purple\">must</strong> have been built prior to the execution of this command"
+          "text": " The source acceleration structure <code>src</code> <strong class=\"purple\">must</strong> have been constructed prior to the execution of this command"
         },
         {
           "vuid": "VUID-VkCopyAccelerationStructureToMemoryInfoKHR-dst-03561",
@@ -37742,7 +38164,7 @@
       "(VK_NV_ray_tracing,VK_KHR_acceleration_structure)": [
         {
           "vuid": "VUID-vkCmdCopyMemoryToAccelerationStructureKHR-pInfo-03742",
-          "text": " <code>pInfo-&gt;src.deviceAddress</code> <strong class=\"purple\">must</strong> be a valid device address for a buffer bound to device memory."
+          "text": " <code>pInfo-&gt;src.deviceAddress</code> <strong class=\"purple\">must</strong> be a valid device address for a buffer bound to device memory"
         },
         {
           "vuid": "VUID-vkCmdCopyMemoryToAccelerationStructureKHR-pInfo-03743",
@@ -37846,7 +38268,7 @@
         },
         {
           "vuid": "VUID-VkAccelerationStructureVersionInfoKHR-pVersionData-parameter",
-          "text": " <code>pVersionData</code> <strong class=\"purple\">must</strong> be a valid pointer to an array of <code>2</code>*<code>VK_UUID_SIZE</code> <code>uint8_t</code> values"
+          "text": " <code>pVersionData</code> <strong class=\"purple\">must</strong> be a valid pointer to an array of \\(2 \\times \\mathtt{VK\\_UUID\\_SIZE}\\) <code>uint8_t</code> values"
         }
       ]
     },
@@ -37922,7 +38344,7 @@
         },
         {
           "vuid": "VUID-vkBuildAccelerationStructuresKHR-pInfos-03667",
-          "text": " For each element of <code>pInfos</code>, if its <code>mode</code> member is <code>VK_BUILD_ACCELERATION_STRUCTURE_MODE_UPDATE_KHR</code>, its <code>srcAccelerationStructure</code> member <strong class=\"purple\">must</strong> have been built before with <code>VK_BUILD_ACCELERATION_STRUCTURE_ALLOW_UPDATE_BIT_KHR</code> set in <a href=\"#VkAccelerationStructureBuildGeometryInfoKHR\">VkAccelerationStructureBuildGeometryInfoKHR</a>::<code>flags</code>"
+          "text": " For each element of <code>pInfos</code>, if its <code>mode</code> member is <code>VK_BUILD_ACCELERATION_STRUCTURE_MODE_UPDATE_KHR</code>, its <code>srcAccelerationStructure</code> member <strong class=\"purple\">must</strong> have previously been constructed with <code>VK_BUILD_ACCELERATION_STRUCTURE_ALLOW_UPDATE_BIT_KHR</code> set in <a href=\"#VkAccelerationStructureBuildGeometryInfoKHR\">VkAccelerationStructureBuildGeometryInfoKHR</a>::<code>flags</code> in the build"
         },
         {
           "vuid": "VUID-vkBuildAccelerationStructuresKHR-pInfos-03668",
@@ -38354,7 +38776,7 @@
         },
         {
           "vuid": "VUID-vkCmdTraceRaysNV-commandBuffer-02701",
-          "text": " If the <code>VkPipeline</code> object bound to the pipeline bind point used by this command requires any dynamic state, that state <strong class=\"purple\">must</strong> have been set"
+          "text": " If the <code>VkPipeline</code> object bound to the pipeline bind point used by this command requires any dynamic state, that state <strong class=\"purple\">must</strong> have been set or inherited (if the <code><a href=\"#VK_NV_inherited_viewport_scissor\">VK_NV_inherited_viewport_scissor</a></code> extension is enabled) for <code>commandBuffer</code>, and done so after any previously bound pipeline with the corresponding state not specified as dynamic"
         },
         {
           "vuid": "VUID-vkCmdTraceRaysNV-None-02859",
@@ -38382,11 +38804,11 @@
         },
         {
           "vuid": "VUID-vkCmdTraceRaysNV-None-04115",
-          "text": " If a <a href=\"#VkImageView\">VkImageView</a> is accessed using <code>OpImageWrite</code> as a result of this command, then the <code>Type</code> of the <code>Texel</code> operand of that instruction <strong class=\"purple\">must</strong> have at least as many components as the image view&#8217;s format."
+          "text": " If a <a href=\"#VkImageView\">VkImageView</a> is accessed using <code>OpImageWrite</code> as a result of this command, then the <code>Type</code> of the <code>Texel</code> operand of that instruction <strong class=\"purple\">must</strong> have at least as many components as the image view&#8217;s format"
         },
         {
           "vuid": "VUID-vkCmdTraceRaysNV-OpImageWrite-04469",
-          "text": " If a <a href=\"#VkBufferView\">VkBufferView</a> is accessed using <code>OpImageWrite</code> as a result of this command, then the <code>Type</code> of the <code>Texel</code> operand of that instruction <strong class=\"purple\">must</strong> have at least as many components as the buffer view&#8217;s format."
+          "text": " If a <a href=\"#VkBufferView\">VkBufferView</a> is accessed using <code>OpImageWrite</code> as a result of this command, then the <code>Type</code> of the <code>Texel</code> operand of that instruction <strong class=\"purple\">must</strong> have at least as many components as the buffer view&#8217;s format"
         },
         {
           "vuid": "VUID-vkCmdTraceRaysNV-None-03429",
@@ -38398,7 +38820,7 @@
         },
         {
           "vuid": "VUID-vkCmdTraceRaysNV-maxRecursionDepth-03625",
-          "text": " This command <strong class=\"purple\">must</strong> not cause a trace ray instruction to be executed from a shader invocation with a <a href=\"#ray-tracing-recursion-depth\">recursion depth</a> greater than the value of <code>maxRecursionDepth</code> used to create the bound ray tracing pipeline"
+          "text": " This command <strong class=\"purple\">must</strong> not cause a pipeline trace ray instruction to be executed from a shader invocation with a <a href=\"#ray-tracing-recursion-depth\">recursion depth</a> greater than the value of <code>maxRecursionDepth</code> used to create the bound ray tracing pipeline"
         },
         {
           "vuid": "VUID-vkCmdTraceRaysNV-raygenShaderBindingTableBuffer-04042",
@@ -38558,27 +38980,27 @@
       "(VK_NV_ray_tracing,VK_KHR_ray_tracing_pipeline)+(VK_NV_ray_tracing)+(VK_EXT_shader_image_atomic_int64)": [
         {
           "vuid": "VUID-vkCmdTraceRaysNV-SampledType-04470",
-          "text": " If a <a href=\"#VkImageView\">VkImageView</a> with a <a href=\"#VkFormat\">VkFormat</a> that has a 64-bit channel width is accessed as a result of this command, the <code>SampledType</code> of the <code>OpTypeImage</code> operand of that instruction <strong class=\"purple\">must</strong> have a <code>Width</code> of 64."
+          "text": " If a <a href=\"#VkImageView\">VkImageView</a> with a <a href=\"#VkFormat\">VkFormat</a> that has a 64-bit channel width is accessed as a result of this command, the <code>SampledType</code> of the <code>OpTypeImage</code> operand of that instruction <strong class=\"purple\">must</strong> have a <code>Width</code> of 64"
         },
         {
           "vuid": "VUID-vkCmdTraceRaysNV-SampledType-04471",
-          "text": " If a <a href=\"#VkImageView\">VkImageView</a> with a <a href=\"#VkFormat\">VkFormat</a> that has a channel width less than 64-bit is accessed as a result of this command, the <code>SampledType</code> of the <code>OpTypeImage</code> operand of that instruction <strong class=\"purple\">must</strong> have a <code>Width</code> of 32."
+          "text": " If a <a href=\"#VkImageView\">VkImageView</a> with a <a href=\"#VkFormat\">VkFormat</a> that has a channel width less than 64-bit is accessed as a result of this command, the <code>SampledType</code> of the <code>OpTypeImage</code> operand of that instruction <strong class=\"purple\">must</strong> have a <code>Width</code> of 32"
         },
         {
           "vuid": "VUID-vkCmdTraceRaysNV-SampledType-04472",
-          "text": " If a <a href=\"#VkBufferView\">VkBufferView</a> with a <a href=\"#VkFormat\">VkFormat</a> that has a 64-bit channel width is accessed as a result of this command, the <code>SampledType</code> of the <code>OpTypeImage</code> operand of that instruction <strong class=\"purple\">must</strong> have a <code>Width</code> of 64."
+          "text": " If a <a href=\"#VkBufferView\">VkBufferView</a> with a <a href=\"#VkFormat\">VkFormat</a> that has a 64-bit channel width is accessed as a result of this command, the <code>SampledType</code> of the <code>OpTypeImage</code> operand of that instruction <strong class=\"purple\">must</strong> have a <code>Width</code> of 64"
         },
         {
           "vuid": "VUID-vkCmdTraceRaysNV-SampledType-04473",
-          "text": " If a <a href=\"#VkBufferView\">VkBufferView</a> with a <a href=\"#VkFormat\">VkFormat</a> that has a channel width less than 64-bit is accessed as a result of this command, the <code>SampledType</code> of the <code>OpTypeImage</code> operand of that instruction <strong class=\"purple\">must</strong> have a <code>Width</code> of 32."
+          "text": " If a <a href=\"#VkBufferView\">VkBufferView</a> with a <a href=\"#VkFormat\">VkFormat</a> that has a channel width less than 64-bit is accessed as a result of this command, the <code>SampledType</code> of the <code>OpTypeImage</code> operand of that instruction <strong class=\"purple\">must</strong> have a <code>Width</code> of 32"
         },
         {
           "vuid": "VUID-vkCmdTraceRaysNV-sparseImageInt64Atomics-04474",
-          "text": " If the <a href=\"#features-sparseImageInt64Atomics\"><code>sparseImageInt64Atomics</code></a> feature is not enabled, <a href=\"#VkImage\">VkImage</a> objects created with the <code>VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT</code> flag <strong class=\"purple\">must</strong> not be accessed by atomic instructions through an <code>OpTypeImage</code> with a <code>SampledType</code> with a <code>Width</code> of 64 by this command."
+          "text": " If the <a href=\"#features-sparseImageInt64Atomics\"><code>sparseImageInt64Atomics</code></a> feature is not enabled, <a href=\"#VkImage\">VkImage</a> objects created with the <code>VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT</code> flag <strong class=\"purple\">must</strong> not be accessed by atomic instructions through an <code>OpTypeImage</code> with a <code>SampledType</code> with a <code>Width</code> of 64 by this command"
         },
         {
           "vuid": "VUID-vkCmdTraceRaysNV-sparseImageInt64Atomics-04475",
-          "text": " If the <a href=\"#features-sparseImageInt64Atomics\"><code>sparseImageInt64Atomics</code></a> feature is not enabled, <a href=\"#VkBuffer\">VkBuffer</a> objects created with the <code>VK_BUFFER_CREATE_SPARSE_RESIDENCY_BIT</code> flag <strong class=\"purple\">must</strong> not be accessed by atomic instructions through an <code>OpTypeImage</code> with a <code>SampledType</code> with a <code>Width</code> of 64 by this command."
+          "text": " If the <a href=\"#features-sparseImageInt64Atomics\"><code>sparseImageInt64Atomics</code></a> feature is not enabled, <a href=\"#VkBuffer\">VkBuffer</a> objects created with the <code>VK_BUFFER_CREATE_SPARSE_RESIDENCY_BIT</code> flag <strong class=\"purple\">must</strong> not be accessed by atomic instructions through an <code>OpTypeImage</code> with a <code>SampledType</code> with a <code>Width</code> of 64 by this command"
         }
       ]
     },
@@ -38614,7 +39036,7 @@
         },
         {
           "vuid": "VUID-vkCmdTraceRaysKHR-commandBuffer-02701",
-          "text": " If the <code>VkPipeline</code> object bound to the pipeline bind point used by this command requires any dynamic state, that state <strong class=\"purple\">must</strong> have been set"
+          "text": " If the <code>VkPipeline</code> object bound to the pipeline bind point used by this command requires any dynamic state, that state <strong class=\"purple\">must</strong> have been set or inherited (if the <code><a href=\"#VK_NV_inherited_viewport_scissor\">VK_NV_inherited_viewport_scissor</a></code> extension is enabled) for <code>commandBuffer</code>, and done so after any previously bound pipeline with the corresponding state not specified as dynamic"
         },
         {
           "vuid": "VUID-vkCmdTraceRaysKHR-None-02859",
@@ -38642,11 +39064,11 @@
         },
         {
           "vuid": "VUID-vkCmdTraceRaysKHR-None-04115",
-          "text": " If a <a href=\"#VkImageView\">VkImageView</a> is accessed using <code>OpImageWrite</code> as a result of this command, then the <code>Type</code> of the <code>Texel</code> operand of that instruction <strong class=\"purple\">must</strong> have at least as many components as the image view&#8217;s format."
+          "text": " If a <a href=\"#VkImageView\">VkImageView</a> is accessed using <code>OpImageWrite</code> as a result of this command, then the <code>Type</code> of the <code>Texel</code> operand of that instruction <strong class=\"purple\">must</strong> have at least as many components as the image view&#8217;s format"
         },
         {
           "vuid": "VUID-vkCmdTraceRaysKHR-OpImageWrite-04469",
-          "text": " If a <a href=\"#VkBufferView\">VkBufferView</a> is accessed using <code>OpImageWrite</code> as a result of this command, then the <code>Type</code> of the <code>Texel</code> operand of that instruction <strong class=\"purple\">must</strong> have at least as many components as the buffer view&#8217;s format."
+          "text": " If a <a href=\"#VkBufferView\">VkBufferView</a> is accessed using <code>OpImageWrite</code> as a result of this command, then the <code>Type</code> of the <code>Texel</code> operand of that instruction <strong class=\"purple\">must</strong> have at least as many components as the buffer view&#8217;s format"
         },
         {
           "vuid": "VUID-vkCmdTraceRaysKHR-None-03429",
@@ -38854,27 +39276,27 @@
       "(VK_NV_ray_tracing,VK_KHR_ray_tracing_pipeline)+(VK_KHR_ray_tracing_pipeline)+(VK_EXT_shader_image_atomic_int64)": [
         {
           "vuid": "VUID-vkCmdTraceRaysKHR-SampledType-04470",
-          "text": " If a <a href=\"#VkImageView\">VkImageView</a> with a <a href=\"#VkFormat\">VkFormat</a> that has a 64-bit channel width is accessed as a result of this command, the <code>SampledType</code> of the <code>OpTypeImage</code> operand of that instruction <strong class=\"purple\">must</strong> have a <code>Width</code> of 64."
+          "text": " If a <a href=\"#VkImageView\">VkImageView</a> with a <a href=\"#VkFormat\">VkFormat</a> that has a 64-bit channel width is accessed as a result of this command, the <code>SampledType</code> of the <code>OpTypeImage</code> operand of that instruction <strong class=\"purple\">must</strong> have a <code>Width</code> of 64"
         },
         {
           "vuid": "VUID-vkCmdTraceRaysKHR-SampledType-04471",
-          "text": " If a <a href=\"#VkImageView\">VkImageView</a> with a <a href=\"#VkFormat\">VkFormat</a> that has a channel width less than 64-bit is accessed as a result of this command, the <code>SampledType</code> of the <code>OpTypeImage</code> operand of that instruction <strong class=\"purple\">must</strong> have a <code>Width</code> of 32."
+          "text": " If a <a href=\"#VkImageView\">VkImageView</a> with a <a href=\"#VkFormat\">VkFormat</a> that has a channel width less than 64-bit is accessed as a result of this command, the <code>SampledType</code> of the <code>OpTypeImage</code> operand of that instruction <strong class=\"purple\">must</strong> have a <code>Width</code> of 32"
         },
         {
           "vuid": "VUID-vkCmdTraceRaysKHR-SampledType-04472",
-          "text": " If a <a href=\"#VkBufferView\">VkBufferView</a> with a <a href=\"#VkFormat\">VkFormat</a> that has a 64-bit channel width is accessed as a result of this command, the <code>SampledType</code> of the <code>OpTypeImage</code> operand of that instruction <strong class=\"purple\">must</strong> have a <code>Width</code> of 64."
+          "text": " If a <a href=\"#VkBufferView\">VkBufferView</a> with a <a href=\"#VkFormat\">VkFormat</a> that has a 64-bit channel width is accessed as a result of this command, the <code>SampledType</code> of the <code>OpTypeImage</code> operand of that instruction <strong class=\"purple\">must</strong> have a <code>Width</code> of 64"
         },
         {
           "vuid": "VUID-vkCmdTraceRaysKHR-SampledType-04473",
-          "text": " If a <a href=\"#VkBufferView\">VkBufferView</a> with a <a href=\"#VkFormat\">VkFormat</a> that has a channel width less than 64-bit is accessed as a result of this command, the <code>SampledType</code> of the <code>OpTypeImage</code> operand of that instruction <strong class=\"purple\">must</strong> have a <code>Width</code> of 32."
+          "text": " If a <a href=\"#VkBufferView\">VkBufferView</a> with a <a href=\"#VkFormat\">VkFormat</a> that has a channel width less than 64-bit is accessed as a result of this command, the <code>SampledType</code> of the <code>OpTypeImage</code> operand of that instruction <strong class=\"purple\">must</strong> have a <code>Width</code> of 32"
         },
         {
           "vuid": "VUID-vkCmdTraceRaysKHR-sparseImageInt64Atomics-04474",
-          "text": " If the <a href=\"#features-sparseImageInt64Atomics\"><code>sparseImageInt64Atomics</code></a> feature is not enabled, <a href=\"#VkImage\">VkImage</a> objects created with the <code>VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT</code> flag <strong class=\"purple\">must</strong> not be accessed by atomic instructions through an <code>OpTypeImage</code> with a <code>SampledType</code> with a <code>Width</code> of 64 by this command."
+          "text": " If the <a href=\"#features-sparseImageInt64Atomics\"><code>sparseImageInt64Atomics</code></a> feature is not enabled, <a href=\"#VkImage\">VkImage</a> objects created with the <code>VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT</code> flag <strong class=\"purple\">must</strong> not be accessed by atomic instructions through an <code>OpTypeImage</code> with a <code>SampledType</code> with a <code>Width</code> of 64 by this command"
         },
         {
           "vuid": "VUID-vkCmdTraceRaysKHR-sparseImageInt64Atomics-04475",
-          "text": " If the <a href=\"#features-sparseImageInt64Atomics\"><code>sparseImageInt64Atomics</code></a> feature is not enabled, <a href=\"#VkBuffer\">VkBuffer</a> objects created with the <code>VK_BUFFER_CREATE_SPARSE_RESIDENCY_BIT</code> flag <strong class=\"purple\">must</strong> not be accessed by atomic instructions through an <code>OpTypeImage</code> with a <code>SampledType</code> with a <code>Width</code> of 64 by this command."
+          "text": " If the <a href=\"#features-sparseImageInt64Atomics\"><code>sparseImageInt64Atomics</code></a> feature is not enabled, <a href=\"#VkBuffer\">VkBuffer</a> objects created with the <code>VK_BUFFER_CREATE_SPARSE_RESIDENCY_BIT</code> flag <strong class=\"purple\">must</strong> not be accessed by atomic instructions through an <code>OpTypeImage</code> with a <code>SampledType</code> with a <code>Width</code> of 64 by this command"
         }
       ]
     },
@@ -38890,6 +39312,70 @@
         }
       ]
     },
+    "vkCmdBindInvocationMaskHUAWEI": {
+      "(VK_NV_ray_tracing,VK_KHR_ray_tracing_pipeline)+(VK_KHR_ray_tracing_pipeline)+(VK_HUAWEI_invocation_mask)": [
+        {
+          "vuid": "VUID-vkCmdBindInvocationMaskHUAWEI-None-04976",
+          "text": " The <a href=\"#features-invocationMask\">invocation mask image</a> feature <strong class=\"purple\">must</strong> be enabled"
+        },
+        {
+          "vuid": "VUID-vkCmdBindInvocationMaskHUAWEI-imageView-04977",
+          "text": " If <code>imageView</code> is not <a href=\"#VK_NULL_HANDLE\">VK_NULL_HANDLE</a>, it <strong class=\"purple\">must</strong> be a valid <a href=\"#VkImageView\">VkImageView</a> handle of type <code>VK_IMAGE_VIEW_TYPE_2D</code>"
+        },
+        {
+          "vuid": "VUID-vkCmdBindInvocationMaskHUAWEI-imageView-04978",
+          "text": " If <code>imageView</code> is not <a href=\"#VK_NULL_HANDLE\">VK_NULL_HANDLE</a>, it <strong class=\"purple\">must</strong> have a format of <code>VK_FORMAT_R8_UINT</code>"
+        },
+        {
+          "vuid": "VUID-vkCmdBindInvocationMaskHUAWEI-imageView-04979",
+          "text": " If <code>imageView</code> is not <a href=\"#VK_NULL_HANDLE\">VK_NULL_HANDLE</a>, it <strong class=\"purple\">must</strong> have been created with <code>VK_IMAGE_USAGE_INVOCATION_MASK_BIT_HUAWEI</code> set"
+        },
+        {
+          "vuid": "VUID-vkCmdBindInvocationMaskHUAWEI-imageView-04980",
+          "text": " If <code>imageView</code> is not <a href=\"#VK_NULL_HANDLE\">VK_NULL_HANDLE</a>, <code>imageLayout</code> <strong class=\"purple\">must</strong> be <code>VK_IMAGE_LAYOUT_GENERAL</code>"
+        },
+        {
+          "vuid": "VUID-vkCmdBindInvocationMaskHUAWEI-width-04981",
+          "text": " Thread mask image resolution must match the <code>width</code> and <code>height</code> in <a href=\"#vkCmdTraceRaysKHR\">vkCmdTraceRaysKHR</a>"
+        },
+        {
+          "vuid": "VUID-vkCmdBindInvocationMaskHUAWEI-None-04982",
+          "text": " Each element in the invocation mask image <strong class=\"purple\">must</strong> have the value <code>0</code> or <code>1</code>. The value 1 means the invocation is active"
+        },
+        {
+          "vuid": "VUID-vkCmdBindInvocationMaskHUAWEI-width-04983",
+          "text": " <code>width</code> in <a href=\"#vkCmdTraceRaysKHR\">vkCmdTraceRaysKHR</a> should be 1"
+        },
+        {
+          "vuid": "VUID-vkCmdBindInvocationMaskHUAWEI-commandBuffer-parameter",
+          "text": " <code>commandBuffer</code> <strong class=\"purple\">must</strong> be a valid <a href=\"#VkCommandBuffer\">VkCommandBuffer</a> handle"
+        },
+        {
+          "vuid": "VUID-vkCmdBindInvocationMaskHUAWEI-imageView-parameter",
+          "text": " If <code>imageView</code> is not <a href=\"#VK_NULL_HANDLE\">VK_NULL_HANDLE</a>, <code>imageView</code> <strong class=\"purple\">must</strong> be a valid <a href=\"#VkImageView\">VkImageView</a> handle"
+        },
+        {
+          "vuid": "VUID-vkCmdBindInvocationMaskHUAWEI-imageLayout-parameter",
+          "text": " <code>imageLayout</code> <strong class=\"purple\">must</strong> be a valid <a href=\"#VkImageLayout\">VkImageLayout</a> value"
+        },
+        {
+          "vuid": "VUID-vkCmdBindInvocationMaskHUAWEI-commandBuffer-recording",
+          "text": " <code>commandBuffer</code> <strong class=\"purple\">must</strong> be in the <a href=\"#commandbuffers-lifecycle\">recording state</a>"
+        },
+        {
+          "vuid": "VUID-vkCmdBindInvocationMaskHUAWEI-commandBuffer-cmdpool",
+          "text": " The <code>VkCommandPool</code> that <code>commandBuffer</code> was allocated from <strong class=\"purple\">must</strong> support compute operations"
+        },
+        {
+          "vuid": "VUID-vkCmdBindInvocationMaskHUAWEI-renderpass",
+          "text": " This command <strong class=\"purple\">must</strong> only be called outside of a render pass instance"
+        },
+        {
+          "vuid": "VUID-vkCmdBindInvocationMaskHUAWEI-commonparent",
+          "text": " Both of <code>commandBuffer</code>, and <code>imageView</code> that are valid handles of non-ignored parameters <strong class=\"purple\">must</strong> have been created, allocated, or retrieved from the same <a href=\"#VkDevice\">VkDevice</a>"
+        }
+      ]
+    },
     "vkCmdTraceRaysIndirectKHR": {
       "(VK_NV_ray_tracing,VK_KHR_ray_tracing_pipeline)+(VK_KHR_ray_tracing_pipeline)": [
         {
@@ -38922,7 +39408,7 @@
         },
         {
           "vuid": "VUID-vkCmdTraceRaysIndirectKHR-commandBuffer-02701",
-          "text": " If the <code>VkPipeline</code> object bound to the pipeline bind point used by this command requires any dynamic state, that state <strong class=\"purple\">must</strong> have been set"
+          "text": " If the <code>VkPipeline</code> object bound to the pipeline bind point used by this command requires any dynamic state, that state <strong class=\"purple\">must</strong> have been set or inherited (if the <code><a href=\"#VK_NV_inherited_viewport_scissor\">VK_NV_inherited_viewport_scissor</a></code> extension is enabled) for <code>commandBuffer</code>, and done so after any previously bound pipeline with the corresponding state not specified as dynamic"
         },
         {
           "vuid": "VUID-vkCmdTraceRaysIndirectKHR-None-02859",
@@ -38950,11 +39436,11 @@
         },
         {
           "vuid": "VUID-vkCmdTraceRaysIndirectKHR-None-04115",
-          "text": " If a <a href=\"#VkImageView\">VkImageView</a> is accessed using <code>OpImageWrite</code> as a result of this command, then the <code>Type</code> of the <code>Texel</code> operand of that instruction <strong class=\"purple\">must</strong> have at least as many components as the image view&#8217;s format."
+          "text": " If a <a href=\"#VkImageView\">VkImageView</a> is accessed using <code>OpImageWrite</code> as a result of this command, then the <code>Type</code> of the <code>Texel</code> operand of that instruction <strong class=\"purple\">must</strong> have at least as many components as the image view&#8217;s format"
         },
         {
           "vuid": "VUID-vkCmdTraceRaysIndirectKHR-OpImageWrite-04469",
-          "text": " If a <a href=\"#VkBufferView\">VkBufferView</a> is accessed using <code>OpImageWrite</code> as a result of this command, then the <code>Type</code> of the <code>Texel</code> operand of that instruction <strong class=\"purple\">must</strong> have at least as many components as the buffer view&#8217;s format."
+          "text": " If a <a href=\"#VkBufferView\">VkBufferView</a> is accessed using <code>OpImageWrite</code> as a result of this command, then the <code>Type</code> of the <code>Texel</code> operand of that instruction <strong class=\"purple\">must</strong> have at least as many components as the buffer view&#8217;s format"
         },
         {
           "vuid": "VUID-vkCmdTraceRaysIndirectKHR-None-03429",
@@ -39166,27 +39652,27 @@
       "(VK_NV_ray_tracing,VK_KHR_ray_tracing_pipeline)+(VK_KHR_ray_tracing_pipeline)+(VK_EXT_shader_image_atomic_int64)": [
         {
           "vuid": "VUID-vkCmdTraceRaysIndirectKHR-SampledType-04470",
-          "text": " If a <a href=\"#VkImageView\">VkImageView</a> with a <a href=\"#VkFormat\">VkFormat</a> that has a 64-bit channel width is accessed as a result of this command, the <code>SampledType</code> of the <code>OpTypeImage</code> operand of that instruction <strong class=\"purple\">must</strong> have a <code>Width</code> of 64."
+          "text": " If a <a href=\"#VkImageView\">VkImageView</a> with a <a href=\"#VkFormat\">VkFormat</a> that has a 64-bit channel width is accessed as a result of this command, the <code>SampledType</code> of the <code>OpTypeImage</code> operand of that instruction <strong class=\"purple\">must</strong> have a <code>Width</code> of 64"
         },
         {
           "vuid": "VUID-vkCmdTraceRaysIndirectKHR-SampledType-04471",
-          "text": " If a <a href=\"#VkImageView\">VkImageView</a> with a <a href=\"#VkFormat\">VkFormat</a> that has a channel width less than 64-bit is accessed as a result of this command, the <code>SampledType</code> of the <code>OpTypeImage</code> operand of that instruction <strong class=\"purple\">must</strong> have a <code>Width</code> of 32."
+          "text": " If a <a href=\"#VkImageView\">VkImageView</a> with a <a href=\"#VkFormat\">VkFormat</a> that has a channel width less than 64-bit is accessed as a result of this command, the <code>SampledType</code> of the <code>OpTypeImage</code> operand of that instruction <strong class=\"purple\">must</strong> have a <code>Width</code> of 32"
         },
         {
           "vuid": "VUID-vkCmdTraceRaysIndirectKHR-SampledType-04472",
-          "text": " If a <a href=\"#VkBufferView\">VkBufferView</a> with a <a href=\"#VkFormat\">VkFormat</a> that has a 64-bit channel width is accessed as a result of this command, the <code>SampledType</code> of the <code>OpTypeImage</code> operand of that instruction <strong class=\"purple\">must</strong> have a <code>Width</code> of 64."
+          "text": " If a <a href=\"#VkBufferView\">VkBufferView</a> with a <a href=\"#VkFormat\">VkFormat</a> that has a 64-bit channel width is accessed as a result of this command, the <code>SampledType</code> of the <code>OpTypeImage</code> operand of that instruction <strong class=\"purple\">must</strong> have a <code>Width</code> of 64"
         },
         {
           "vuid": "VUID-vkCmdTraceRaysIndirectKHR-SampledType-04473",
-          "text": " If a <a href=\"#VkBufferView\">VkBufferView</a> with a <a href=\"#VkFormat\">VkFormat</a> that has a channel width less than 64-bit is accessed as a result of this command, the <code>SampledType</code> of the <code>OpTypeImage</code> operand of that instruction <strong class=\"purple\">must</strong> have a <code>Width</code> of 32."
+          "text": " If a <a href=\"#VkBufferView\">VkBufferView</a> with a <a href=\"#VkFormat\">VkFormat</a> that has a channel width less than 64-bit is accessed as a result of this command, the <code>SampledType</code> of the <code>OpTypeImage</code> operand of that instruction <strong class=\"purple\">must</strong> have a <code>Width</code> of 32"
         },
         {
           "vuid": "VUID-vkCmdTraceRaysIndirectKHR-sparseImageInt64Atomics-04474",
-          "text": " If the <a href=\"#features-sparseImageInt64Atomics\"><code>sparseImageInt64Atomics</code></a> feature is not enabled, <a href=\"#VkImage\">VkImage</a> objects created with the <code>VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT</code> flag <strong class=\"purple\">must</strong> not be accessed by atomic instructions through an <code>OpTypeImage</code> with a <code>SampledType</code> with a <code>Width</code> of 64 by this command."
+          "text": " If the <a href=\"#features-sparseImageInt64Atomics\"><code>sparseImageInt64Atomics</code></a> feature is not enabled, <a href=\"#VkImage\">VkImage</a> objects created with the <code>VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT</code> flag <strong class=\"purple\">must</strong> not be accessed by atomic instructions through an <code>OpTypeImage</code> with a <code>SampledType</code> with a <code>Width</code> of 64 by this command"
         },
         {
           "vuid": "VUID-vkCmdTraceRaysIndirectKHR-sparseImageInt64Atomics-04475",
-          "text": " If the <a href=\"#features-sparseImageInt64Atomics\"><code>sparseImageInt64Atomics</code></a> feature is not enabled, <a href=\"#VkBuffer\">VkBuffer</a> objects created with the <code>VK_BUFFER_CREATE_SPARSE_RESIDENCY_BIT</code> flag <strong class=\"purple\">must</strong> not be accessed by atomic instructions through an <code>OpTypeImage</code> with a <code>SampledType</code> with a <code>Width</code> of 64 by this command."
+          "text": " If the <a href=\"#features-sparseImageInt64Atomics\"><code>sparseImageInt64Atomics</code></a> feature is not enabled, <a href=\"#VkBuffer\">VkBuffer</a> objects created with the <code>VK_BUFFER_CREATE_SPARSE_RESIDENCY_BIT</code> flag <strong class=\"purple\">must</strong> not be accessed by atomic instructions through an <code>OpTypeImage</code> with a <code>SampledType</code> with a <code>Width</code> of 64 by this command"
         }
       ],
       "(VK_NV_ray_tracing,VK_KHR_ray_tracing_pipeline)+(VK_KHR_ray_tracing_pipeline)+(VK_NV_ray_tracing_motion_blur)": [
@@ -39304,7 +39790,7 @@
       "(VK_KHR_video_queue)": [
         {
           "vuid": "VUID-vkGetPhysicalDeviceVideoFormatPropertiesKHR-imageUsage-04844",
-          "text": " The <code>imageUsage</code> enum of <a href=\"#VkPhysicalDeviceVideoFormatInfoKHR\">VkPhysicalDeviceVideoFormatInfoKHR</a> <strong class=\"purple\">must</strong> contain at least one of the following video image usage bit(s): <code>VK_IMAGE_USAGE_VIDEO_DECODE_DST_BIT_KHR</code>, <code>VK_IMAGE_USAGE_VIDEO_DECODE_DPB_BIT_KHR</code>, <code>VK_IMAGE_USAGE_VIDEO_ENCODE_SRC_BIT_KHR</code>, or <code>VK_IMAGE_USAGE_VIDEO_ENCODE_DPB_BIT_KHR</code>."
+          "text": " The <code>imageUsage</code> enum of <a href=\"#VkPhysicalDeviceVideoFormatInfoKHR\">VkPhysicalDeviceVideoFormatInfoKHR</a> <strong class=\"purple\">must</strong> contain at least one of the following video image usage bit(s): <code>VK_IMAGE_USAGE_VIDEO_DECODE_DST_BIT_KHR</code>, <code>VK_IMAGE_USAGE_VIDEO_DECODE_DPB_BIT_KHR</code>, <code>VK_IMAGE_USAGE_VIDEO_ENCODE_SRC_BIT_KHR</code>, or <code>VK_IMAGE_USAGE_VIDEO_ENCODE_DPB_BIT_KHR</code>"
         },
         {
           "vuid": "VUID-vkGetPhysicalDeviceVideoFormatPropertiesKHR-physicalDevice-parameter",
@@ -39384,43 +39870,43 @@
       "(VK_KHR_video_queue)": [
         {
           "vuid": "VUID-VkVideoSessionCreateInfoKHR-pVideoProfile-04845",
-          "text": " <code>pVideoProfile</code> <strong class=\"purple\">must</strong> be a pointer to a valid <a href=\"#VkVideoProfileKHR\">VkVideoProfileKHR</a> structure whose <code>pNext</code> chain <strong class=\"purple\">must</strong> include a valid codec-specific profile structure."
+          "text": " <code>pVideoProfile</code> <strong class=\"purple\">must</strong> be a pointer to a valid <a href=\"#VkVideoProfileKHR\">VkVideoProfileKHR</a> structure whose <code>pNext</code> chain <strong class=\"purple\">must</strong> include a valid codec-specific profile structure"
         },
         {
           "vuid": "VUID-VkVideoSessionCreateInfoKHR-maxReferencePicturesSlotsCount-04846",
-          "text": " If <a href=\"#reference-picture\">Reference Pictures</a> are required for use with the created video session, the <code>maxReferencePicturesSlotsCount</code> <strong class=\"purple\">must</strong> be set to a value bigger than <code>0</code>."
+          "text": " If <a href=\"#reference-picture\">Reference Pictures</a> are required for use with the created video session, the <code>maxReferencePicturesSlotsCount</code> <strong class=\"purple\">must</strong> be set to a value bigger than <code>0</code>"
         },
         {
           "vuid": "VUID-VkVideoSessionCreateInfoKHR-maxReferencePicturesSlotsCount-04847",
-          "text": " <code>maxReferencePicturesSlotsCount</code> <strong class=\"purple\">cannot</strong> exceed the implementation reported <a href=\"#VkVideoCapabilitiesKHR\">VkVideoCapabilitiesKHR</a>::<code>maxReferencePicturesSlotsCount</code>."
+          "text": " <code>maxReferencePicturesSlotsCount</code> <strong class=\"purple\">cannot</strong> exceed the implementation reported <a href=\"#VkVideoCapabilitiesKHR\">VkVideoCapabilitiesKHR</a>::<code>maxReferencePicturesSlotsCount</code>"
         },
         {
           "vuid": "VUID-VkVideoSessionCreateInfoKHR-maxReferencePicturesActiveCount-04848",
-          "text": " If <a href=\"#reference-picture\">Reference Pictures</a> are required for use with the created video session, the <code>maxReferencePicturesActiveCount</code> <strong class=\"purple\">must</strong> be set to a value bigger than <code>0</code>."
+          "text": " If <a href=\"#reference-picture\">Reference Pictures</a> are required for use with the created video session, the <code>maxReferencePicturesActiveCount</code> <strong class=\"purple\">must</strong> be set to a value bigger than <code>0</code>"
         },
         {
           "vuid": "VUID-VkVideoSessionCreateInfoKHR-maxReferencePicturesActiveCount-04849",
-          "text": " <code>maxReferencePicturesActiveCount</code> <strong class=\"purple\">cannot</strong> exceed the implementation reported <a href=\"#VkVideoCapabilitiesKHR\">VkVideoCapabilitiesKHR</a>::<code>maxReferencePicturesActiveCount</code>."
+          "text": " <code>maxReferencePicturesActiveCount</code> <strong class=\"purple\">cannot</strong> exceed the implementation reported <a href=\"#VkVideoCapabilitiesKHR\">VkVideoCapabilitiesKHR</a>::<code>maxReferencePicturesActiveCount</code>"
         },
         {
           "vuid": "VUID-VkVideoSessionCreateInfoKHR-maxReferencePicturesActiveCount-04850",
-          "text": " <code>maxReferencePicturesActiveCount</code> <strong class=\"purple\">cannot</strong> exceed the <code>maxReferencePicturesSlotsCount</code>."
+          "text": " <code>maxReferencePicturesActiveCount</code> <strong class=\"purple\">cannot</strong> exceed the <code>maxReferencePicturesSlotsCount</code>"
         },
         {
           "vuid": "VUID-VkVideoSessionCreateInfoKHR-maxCodedExtent-04851",
-          "text": " <code>maxCodedExtent</code> <strong class=\"purple\">cannot</strong> be smaller than <a href=\"#VkVideoCapabilitiesKHR\">VkVideoCapabilitiesKHR</a>::<code>minExtent</code> and bigger than <a href=\"#VkVideoCapabilitiesKHR\">VkVideoCapabilitiesKHR</a>::<code>maxExtent</code>."
+          "text": " <code>maxCodedExtent</code> <strong class=\"purple\">cannot</strong> be smaller than <a href=\"#VkVideoCapabilitiesKHR\">VkVideoCapabilitiesKHR</a>::<code>minExtent</code> and bigger than <a href=\"#VkVideoCapabilitiesKHR\">VkVideoCapabilitiesKHR</a>::<code>maxExtent</code>"
         },
         {
           "vuid": "VUID-VkVideoSessionCreateInfoKHR-referencePicturesFormat-04852",
-          "text": " <code>referencePicturesFormat</code> <strong class=\"purple\">must</strong> be one of the supported formats in <a href=\"#VkVideoFormatPropertiesKHR\">VkVideoFormatPropertiesKHR</a> <code>format</code> returned by the <a href=\"#vkGetPhysicalDeviceVideoFormatPropertiesKHR\">vkGetPhysicalDeviceVideoFormatPropertiesKHR</a> when the <a href=\"#VkPhysicalDeviceVideoFormatInfoKHR\">VkPhysicalDeviceVideoFormatInfoKHR</a> <code>imageUsage</code> contains <code>VK_IMAGE_USAGE_VIDEO_DECODE_DPB_BIT_KHR</code> or <code>VK_IMAGE_USAGE_VIDEO_ENCODE_DPB_BIT_KHR</code> depending on the session codec operation."
+          "text": " <code>referencePicturesFormat</code> <strong class=\"purple\">must</strong> be one of the supported formats in <a href=\"#VkVideoFormatPropertiesKHR\">VkVideoFormatPropertiesKHR</a> <code>format</code> returned by the <a href=\"#vkGetPhysicalDeviceVideoFormatPropertiesKHR\">vkGetPhysicalDeviceVideoFormatPropertiesKHR</a> when the <a href=\"#VkPhysicalDeviceVideoFormatInfoKHR\">VkPhysicalDeviceVideoFormatInfoKHR</a> <code>imageUsage</code> contains <code>VK_IMAGE_USAGE_VIDEO_DECODE_DPB_BIT_KHR</code> or <code>VK_IMAGE_USAGE_VIDEO_ENCODE_DPB_BIT_KHR</code> depending on the session codec operation"
         },
         {
           "vuid": "VUID-VkVideoSessionCreateInfoKHR-pictureFormat-04853",
-          "text": " <code>pictureFormat</code> for decode output <strong class=\"purple\">must</strong> be one of the supported formats in <a href=\"#VkVideoFormatPropertiesKHR\">VkVideoFormatPropertiesKHR</a> <code>format</code> returned by the <a href=\"#vkGetPhysicalDeviceVideoFormatPropertiesKHR\">vkGetPhysicalDeviceVideoFormatPropertiesKHR</a> when the <a href=\"#VkPhysicalDeviceVideoFormatInfoKHR\">VkPhysicalDeviceVideoFormatInfoKHR</a> <code>imageUsage</code> contains <code>VK_IMAGE_USAGE_VIDEO_DECODE_DST_BIT_KHR</code>."
+          "text": " <code>pictureFormat</code> for decode output <strong class=\"purple\">must</strong> be one of the supported formats in <a href=\"#VkVideoFormatPropertiesKHR\">VkVideoFormatPropertiesKHR</a> <code>format</code> returned by the <a href=\"#vkGetPhysicalDeviceVideoFormatPropertiesKHR\">vkGetPhysicalDeviceVideoFormatPropertiesKHR</a> when the <a href=\"#VkPhysicalDeviceVideoFormatInfoKHR\">VkPhysicalDeviceVideoFormatInfoKHR</a> <code>imageUsage</code> contains <code>VK_IMAGE_USAGE_VIDEO_DECODE_DST_BIT_KHR</code>"
         },
         {
           "vuid": "VUID-VkVideoSessionCreateInfoKHR-pictureFormat-04854",
-          "text": " <code>pictureFormat</code> targeting encode operations <strong class=\"purple\">must</strong> be one of the supported formats in <a href=\"#VkVideoFormatPropertiesKHR\">VkVideoFormatPropertiesKHR</a> <code>format</code> returned by the <a href=\"#vkGetPhysicalDeviceVideoFormatPropertiesKHR\">vkGetPhysicalDeviceVideoFormatPropertiesKHR</a> when the <a href=\"#VkPhysicalDeviceVideoFormatInfoKHR\">VkPhysicalDeviceVideoFormatInfoKHR</a> <code>imageUsage</code> contains <code>VK_IMAGE_USAGE_VIDEO_ENCODE_SRC_BIT_KHR</code>."
+          "text": " <code>pictureFormat</code> targeting encode operations <strong class=\"purple\">must</strong> be one of the supported formats in <a href=\"#VkVideoFormatPropertiesKHR\">VkVideoFormatPropertiesKHR</a> <code>format</code> returned by the <a href=\"#vkGetPhysicalDeviceVideoFormatPropertiesKHR\">vkGetPhysicalDeviceVideoFormatPropertiesKHR</a> when the <a href=\"#VkPhysicalDeviceVideoFormatInfoKHR\">VkPhysicalDeviceVideoFormatInfoKHR</a> <code>imageUsage</code> contains <code>VK_IMAGE_USAGE_VIDEO_ENCODE_SRC_BIT_KHR</code>"
         },
         {
           "vuid": "VUID-VkVideoSessionCreateInfoKHR-sType-sType",
@@ -39576,7 +40062,7 @@
       "(VK_KHR_video_queue)": [
         {
           "vuid": "VUID-VkVideoSessionParametersCreateInfoKHR-videoSessionParametersTemplate-04855",
-          "text": " If <code>videoSessionParametersTemplate</code> represents a valid handle, it <strong class=\"purple\">must</strong> have been created against <code>videoSession</code>."
+          "text": " If <code>videoSessionParametersTemplate</code> represents a valid handle, it <strong class=\"purple\">must</strong> have been created against <code>videoSession</code>"
         },
         {
           "vuid": "VUID-VkVideoSessionParametersCreateInfoKHR-sType-sType",
@@ -39688,11 +40174,11 @@
       "(VK_KHR_video_queue)": [
         {
           "vuid": "VUID-VkVideoBeginCodingInfoKHR-referenceSlotCount-04856",
-          "text": " <a href=\"#VkVideoBeginCodingInfoKHR\">VkVideoBeginCodingInfoKHR</a>::<code>referenceSlotCount</code> <strong class=\"purple\">must</strong> not exceed the value specified in <a href=\"#VkVideoSessionCreateInfoKHR\">VkVideoSessionCreateInfoKHR</a>::<code>maxReferencePicturesSlotsCount</code> when creating the video session object that is being provided in <code>videoSession</code>."
+          "text": " <a href=\"#VkVideoBeginCodingInfoKHR\">VkVideoBeginCodingInfoKHR</a>::<code>referenceSlotCount</code> <strong class=\"purple\">must</strong> not exceed the value specified in <a href=\"#VkVideoSessionCreateInfoKHR\">VkVideoSessionCreateInfoKHR</a>::<code>maxReferencePicturesSlotsCount</code> when creating the video session object that is being provided in <code>videoSession</code>"
         },
         {
           "vuid": "VUID-VkVideoBeginCodingInfoKHR-videoSessionParameters-04857",
-          "text": " If <code>videoSessionParameters</code> is not <a href=\"#VK_NULL_HANDLE\">VK_NULL_HANDLE</a>, it <strong class=\"purple\">must</strong> have been created using <code>videoSession</code> as a parent object."
+          "text": " If <code>videoSessionParameters</code> is not <a href=\"#VK_NULL_HANDLE\">VK_NULL_HANDLE</a>, it <strong class=\"purple\">must</strong> have been created using <code>videoSession</code> as a parent object"
         },
         {
           "vuid": "VUID-VkVideoBeginCodingInfoKHR-sType-sType",
@@ -39943,12 +40429,12 @@
           "text": " <code>sType</code> <strong class=\"purple\">must</strong> be <code>VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_PROFILE_EXT</code>"
         },
         {
-          "vuid": "VUID-VkVideoDecodeH264ProfileEXT-fieldLayout-parameter",
-          "text": " <code>fieldLayout</code> <strong class=\"purple\">must</strong> be a valid combination of <a href=\"#VkVideoDecodeH264FieldLayoutFlagBitsEXT\">VkVideoDecodeH264FieldLayoutFlagBitsEXT</a> values"
+          "vuid": "VUID-VkVideoDecodeH264ProfileEXT-pictureLayout-parameter",
+          "text": " <code>pictureLayout</code> <strong class=\"purple\">must</strong> be a valid combination of <a href=\"#VkVideoDecodeH264PictureLayoutFlagBitsEXT\">VkVideoDecodeH264PictureLayoutFlagBitsEXT</a> values"
         },
         {
-          "vuid": "VUID-VkVideoDecodeH264ProfileEXT-fieldLayout-requiredbitmask",
-          "text": " <code>fieldLayout</code> <strong class=\"purple\">must</strong> not be <code>0</code>"
+          "vuid": "VUID-VkVideoDecodeH264ProfileEXT-pictureLayout-requiredbitmask",
+          "text": " <code>pictureLayout</code> <strong class=\"purple\">must</strong> not be <code>0</code>"
         }
       ]
     },
@@ -39992,31 +40478,31 @@
       "(VK_EXT_video_decode_h264)": [
         {
           "vuid": "VUID-VkVideoDecodeH264SessionParametersAddInfoEXT-spsStdCount-04822",
-          "text": " The values of <code>spsStdCount</code> and <code>ppsStdCount</code> <strong class=\"purple\">must</strong> be less than or equal to the values of <code>maxSpsStdCount</code> and <code>maxPpsStdCount</code>, respectively."
+          "text": " The values of <code>spsStdCount</code> and <code>ppsStdCount</code> <strong class=\"purple\">must</strong> be less than or equal to the values of <code>maxSpsStdCount</code> and <code>maxPpsStdCount</code>, respectively"
         },
         {
           "vuid": "VUID-VkVideoDecodeH264SessionParametersAddInfoEXT-maxSpsStdCount-04823",
-          "text": " When the <code>maxSpsStdCount</code> number of parameters of type StdVideoH264SequenceParameterSet in the Video Session Parameters object is reached, no additional parameters of that type can be added to this object. <code>VK_ERROR_TOO_MANY_OBJECTS</code> will be returned if an attempt is made to add additional data to this object at this point."
+          "text": " When the <code>maxSpsStdCount</code> number of parameters of type StdVideoH264SequenceParameterSet in the Video Session Parameters object is reached, no additional parameters of that type can be added to this object. <code>VK_ERROR_TOO_MANY_OBJECTS</code> will be returned if an attempt is made to add additional data to this object at this point"
         },
         {
           "vuid": "VUID-VkVideoDecodeH264SessionParametersAddInfoEXT-maxPpsStdCount-04824",
-          "text": " When the <code>maxPpsStdCount</code> number of parameters of type StdVideoH264PictureParameterSet in the Video Session Parameters object is reached, no additional parameters of that type can be added to this object. <code>VK_ERROR_TOO_MANY_OBJECTS</code> will be returned if an attempt is made to add additional data to this object at this point."
+          "text": " When the <code>maxPpsStdCount</code> number of parameters of type StdVideoH264PictureParameterSet in the Video Session Parameters object is reached, no additional parameters of that type can be added to this object. <code>VK_ERROR_TOO_MANY_OBJECTS</code> will be returned if an attempt is made to add additional data to this object at this point"
         },
         {
           "vuid": "VUID-VkVideoDecodeH264SessionParametersAddInfoEXT-None-04825",
-          "text": " Each entry to be added <strong class=\"purple\">must</strong> have a unique, to the rest of the parameter array entries and the existing parameters in the Video Session Parameters Object that is being updated, SPS-PPS IDs."
+          "text": " Each entry to be added <strong class=\"purple\">must</strong> have a unique, to the rest of the parameter array entries and the existing parameters in the Video Session Parameters Object that is being updated, SPS-PPS IDs"
         },
         {
           "vuid": "VUID-VkVideoDecodeH264SessionParametersAddInfoEXT-None-04826",
-          "text": " Parameter entries that already exist in Video Session Parameters object with a particular SPS-PPS IDs <strong class=\"purple\">cannot</strong> be replaced nor updated."
+          "text": " Parameter entries that already exist in Video Session Parameters object with a particular SPS-PPS IDs <strong class=\"purple\">cannot</strong> be replaced nor updated"
         },
         {
           "vuid": "VUID-VkVideoDecodeH264SessionParametersAddInfoEXT-None-04827",
-          "text": " When creating a new object using a Video Session Parameters as a template, the array&#8217;s parameters with the same SPS-PPS IDs as the ones from the template take precedence."
+          "text": " When creating a new object using a Video Session Parameters as a template, the array&#8217;s parameters with the same SPS-PPS IDs as the ones from the template take precedence"
         },
         {
           "vuid": "VUID-VkVideoDecodeH264SessionParametersAddInfoEXT-None-04828",
-          "text": " SPS/PPS parameters <strong class=\"purple\">must</strong> comply with the limits specified in <a href=\"#VkVideoSessionCreateInfoKHR\">VkVideoSessionCreateInfoKHR</a> during Video Session creation."
+          "text": " SPS/PPS parameters <strong class=\"purple\">must</strong> comply with the limits specified in <a href=\"#VkVideoSessionCreateInfoKHR\">VkVideoSessionCreateInfoKHR</a> during Video Session creation"
         },
         {
           "vuid": "VUID-VkVideoDecodeH264SessionParametersAddInfoEXT-sType-sType",
@@ -40132,35 +40618,35 @@
       "(VK_EXT_video_decode_h265)": [
         {
           "vuid": "VUID-VkVideoDecodeH265SessionParametersAddInfoEXT-vpsStdCount-04829",
-          "text": " The values of <code>vpsStdCount</code>, <code>spsStdCount</code> and <code>ppsStdCount</code> <strong class=\"purple\">must</strong> be less than or equal to the values of <code>maxVpsStdCount</code>, <code>maxSpsStdCount</code> and <code>maxPpsStdCount</code>, respectively."
+          "text": " The values of <code>vpsStdCount</code>, <code>spsStdCount</code> and <code>ppsStdCount</code> <strong class=\"purple\">must</strong> be less than or equal to the values of <code>maxVpsStdCount</code>, <code>maxSpsStdCount</code> and <code>maxPpsStdCount</code>, respectively"
         },
         {
           "vuid": "VUID-VkVideoDecodeH265SessionParametersAddInfoEXT-maxVpsStdCount-04830",
-          "text": " When the <code>maxVpsStdCount</code> number of parameters of type StdVideoH265VideoParameterSet in the Video Session Parameters object is reached, no additional parameters of that type can be added to the object. <code>VK_ERROR_TOO_MANY_OBJECTS</code> will be returned if an attempt is made to add additional data to this object at this point."
+          "text": " When the <code>maxVpsStdCount</code> number of parameters of type StdVideoH265VideoParameterSet in the Video Session Parameters object is reached, no additional parameters of that type can be added to the object. <code>VK_ERROR_TOO_MANY_OBJECTS</code> will be returned if an attempt is made to add additional data to this object at this point"
         },
         {
           "vuid": "VUID-VkVideoDecodeH265SessionParametersAddInfoEXT-maxSpsStdCount-04831",
-          "text": " When the <code>maxSpsStdCount</code> number of parameters of type StdVideoH265SequenceParameterSet in the Video Session Parameters object is reached, no additional parameters of that type can be added to the object. <code>VK_ERROR_TOO_MANY_OBJECTS</code> will be returned if an attempt is made to add additional data to this object at this point."
+          "text": " When the <code>maxSpsStdCount</code> number of parameters of type StdVideoH265SequenceParameterSet in the Video Session Parameters object is reached, no additional parameters of that type can be added to the object. <code>VK_ERROR_TOO_MANY_OBJECTS</code> will be returned if an attempt is made to add additional data to this object at this point"
         },
         {
           "vuid": "VUID-VkVideoDecodeH265SessionParametersAddInfoEXT-maxPpsStdCount-04832",
-          "text": " When the <code>maxPpsStdCount</code> number of parameters of type StdVideoH265PictureParameterSet in the Video Session Parameters object is reached, no additional parameters of that type can be added to the object. <code>VK_ERROR_TOO_MANY_OBJECTS</code> will be returned if an attempt is made to add additional data to this object at this point."
+          "text": " When the <code>maxPpsStdCount</code> number of parameters of type StdVideoH265PictureParameterSet in the Video Session Parameters object is reached, no additional parameters of that type can be added to the object. <code>VK_ERROR_TOO_MANY_OBJECTS</code> will be returned if an attempt is made to add additional data to this object at this point"
         },
         {
           "vuid": "VUID-VkVideoDecodeH265SessionParametersAddInfoEXT-None-04833",
-          "text": " Each entry to be added <strong class=\"purple\">must</strong> have a unique, to the rest of the parameter array entries and the existing parameters in the Video Session Parameters Object that is being updated, VPS-SPS-PPS IDs."
+          "text": " Each entry to be added <strong class=\"purple\">must</strong> have a unique, to the rest of the parameter array entries and the existing parameters in the Video Session Parameters Object that is being updated, VPS-SPS-PPS IDs"
         },
         {
           "vuid": "VUID-VkVideoDecodeH265SessionParametersAddInfoEXT-None-04834",
-          "text": " Parameter entries that already exist in Video Session Parameters object with a particular VPS-SPS-PPS IDs <strong class=\"purple\">cannot</strong> be replaced nor updated."
+          "text": " Parameter entries that already exist in Video Session Parameters object with a particular VPS-SPS-PPS IDs <strong class=\"purple\">cannot</strong> be replaced nor updated"
         },
         {
           "vuid": "VUID-VkVideoDecodeH265SessionParametersAddInfoEXT-None-04835",
-          "text": " When creating a new object using a Video Session Parameters as a template, the array&#8217;s parameters with the same VPS-SPS-PPS IDs as the ones from the template take precedence."
+          "text": " When creating a new object using a Video Session Parameters as a template, the array&#8217;s parameters with the same VPS-SPS-PPS IDs as the ones from the template take precedence"
         },
         {
           "vuid": "VUID-VkVideoDecodeH265SessionParametersAddInfoEXT-None-04836",
-          "text": " VPS/SPS/PPS parameters <strong class=\"purple\">must</strong> comply with the limits specified in <a href=\"#VkVideoSessionCreateInfoKHR\">VkVideoSessionCreateInfoKHR</a> during Video Session creation."
+          "text": " VPS/SPS/PPS parameters <strong class=\"purple\">must</strong> comply with the limits specified in <a href=\"#VkVideoSessionCreateInfoKHR\">VkVideoSessionCreateInfoKHR</a> during Video Session creation"
         },
         {
           "vuid": "VUID-VkVideoDecodeH265SessionParametersAddInfoEXT-sType-sType",
@@ -40320,7 +40806,7 @@
         },
         {
           "vuid": "VUID-VkVideoEncodeH264CapabilitiesEXT-flags-parameter",
-          "text": " <code>flags</code> <strong class=\"purple\">must</strong> be a valid combination of <a href=\"#VkVideoEncodeH264CapabilitiesFlagBitsEXT\">VkVideoEncodeH264CapabilitiesFlagBitsEXT</a> values"
+          "text": " <code>flags</code> <strong class=\"purple\">must</strong> be a valid combination of <a href=\"#VkVideoEncodeH264CapabilityFlagBitsEXT\">VkVideoEncodeH264CapabilityFlagBitsEXT</a> values"
         },
         {
           "vuid": "VUID-VkVideoEncodeH264CapabilitiesEXT-flags-requiredbitmask",
@@ -40384,31 +40870,31 @@
       "(VK_EXT_video_encode_h264)": [
         {
           "vuid": "VUID-VkVideoEncodeH264SessionParametersAddInfoEXT-spsStdCount-04837",
-          "text": " The values of <code>spsStdCount</code> and <code>ppsStdCount</code> <strong class=\"purple\">must</strong> be less than or equal to the values of <code>maxSpsStdCount</code> and <code>maxPpsStdCount</code>, respectively."
+          "text": " The values of <code>spsStdCount</code> and <code>ppsStdCount</code> <strong class=\"purple\">must</strong> be less than or equal to the values of <code>maxSpsStdCount</code> and <code>maxPpsStdCount</code>, respectively"
         },
         {
           "vuid": "VUID-VkVideoEncodeH264SessionParametersAddInfoEXT-maxSpsStdCount-04838",
-          "text": " When the <code>maxSpsStdCount</code> number of parameters of type StdVideoH264SequenceParameterSet in the Video Session Parameters object is reached, no additional parameters of that type can be added to the object. <code>VK_ERROR_TOO_MANY_OBJECTS</code> will be returned if an attempt is made to add additional data to this object at this point."
+          "text": " When the <code>maxSpsStdCount</code> number of parameters of type StdVideoH264SequenceParameterSet in the Video Session Parameters object is reached, no additional parameters of that type can be added to the object. <code>VK_ERROR_TOO_MANY_OBJECTS</code> will be returned if an attempt is made to add additional data to this object at this point"
         },
         {
           "vuid": "VUID-VkVideoEncodeH264SessionParametersAddInfoEXT-maxPpsStdCount-04839",
-          "text": " When the <code>maxPpsStdCount</code> number of parameters of type StdVideoH264PictureParameterSet in the Video Session Parameters object is reached, no additional parameters of that type can be added to the object. <code>VK_ERROR_TOO_MANY_OBJECTS</code> will be returned if an attempt is made to add additional data to this object at this point."
+          "text": " When the <code>maxPpsStdCount</code> number of parameters of type StdVideoH264PictureParameterSet in the Video Session Parameters object is reached, no additional parameters of that type can be added to the object. <code>VK_ERROR_TOO_MANY_OBJECTS</code> will be returned if an attempt is made to add additional data to this object at this point"
         },
         {
           "vuid": "VUID-VkVideoEncodeH264SessionParametersAddInfoEXT-None-04840",
-          "text": " Each entry to be added <strong class=\"purple\">must</strong> have a unique, to the rest of the parameter array entries and the existing parameters in the Video Session Parameters Object that is being updated, SPS-PPS IDs."
+          "text": " Each entry to be added <strong class=\"purple\">must</strong> have a unique, to the rest of the parameter array entries and the existing parameters in the Video Session Parameters Object that is being updated, SPS-PPS IDs"
         },
         {
           "vuid": "VUID-VkVideoEncodeH264SessionParametersAddInfoEXT-None-04841",
-          "text": " Parameter entries that already exist in Video Session Parameters object with a particular SPS-PPS IDs <strong class=\"purple\">cannot</strong> be replaced nor updated."
+          "text": " Parameter entries that already exist in Video Session Parameters object with a particular SPS-PPS IDs <strong class=\"purple\">cannot</strong> be replaced nor updated"
         },
         {
           "vuid": "VUID-VkVideoEncodeH264SessionParametersAddInfoEXT-None-04842",
-          "text": " When creating a new object using a Video Session Parameters as a template, the array&#8217;s parameters with the same SPS-PPS IDs as the ones from the template take precedence."
+          "text": " When creating a new object using a Video Session Parameters as a template, the array&#8217;s parameters with the same SPS-PPS IDs as the ones from the template take precedence"
         },
         {
           "vuid": "VUID-VkVideoEncodeH264SessionParametersAddInfoEXT-None-04843",
-          "text": " SPS/PPS parameters <strong class=\"purple\">must</strong> comply with the limits specified in <a href=\"#VkVideoSessionCreateInfoKHR\">VkVideoSessionCreateInfoKHR</a> during Video Session creation."
+          "text": " SPS/PPS parameters <strong class=\"purple\">must</strong> comply with the limits specified in <a href=\"#VkVideoSessionCreateInfoKHR\">VkVideoSessionCreateInfoKHR</a> during Video Session creation"
         },
         {
           "vuid": "VUID-VkVideoEncodeH264SessionParametersAddInfoEXT-sType-sType",
@@ -40680,6 +41166,14 @@
         }
       ]
     },
+    "VkPhysicalDeviceShaderAtomicFloat2FeaturesEXT": {
+      "(VK_EXT_shader_atomic_float2)": [
+        {
+          "vuid": "VUID-VkPhysicalDeviceShaderAtomicFloat2FeaturesEXT-sType-sType",
+          "text": " <code>sType</code> <strong class=\"purple\">must</strong> be <code>VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_ATOMIC_FLOAT_2_FEATURES_EXT</code>"
+        }
+      ]
+    },
     "VkPhysicalDeviceShaderAtomicInt64Features": {
       "(VK_VERSION_1_2,VK_KHR_shader_atomic_int64)": [
         {
@@ -40896,6 +41390,14 @@
         }
       ]
     },
+    "VkPhysicalDeviceInvocationMaskFeaturesHUAWEI": {
+      "(VK_HUAWEI_invocation_mask)": [
+        {
+          "vuid": "VUID-VkPhysicalDeviceInvocationMaskFeaturesHUAWEI-sType-sType",
+          "text": " <code>sType</code> <strong class=\"purple\">must</strong> be <code>VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_INVOCATION_MASK_FEATURES_HUAWEI</code>"
+        }
+      ]
+    },
     "VkPhysicalDeviceScalarBlockLayoutFeatures": {
       "(VK_VERSION_1_2,VK_EXT_scalar_block_layout)": [
         {
@@ -41032,6 +41534,14 @@
         }
       ]
     },
+    "VkPhysicalDevicePrimitiveTopologyListRestartFeaturesEXT": {
+      "(VK_EXT_primitive_topology_list_restart)": [
+        {
+          "vuid": "VUID-VkPhysicalDevicePrimitiveTopologyListRestartFeaturesEXT-sType-sType",
+          "text": " <code>sType</code> <strong class=\"purple\">must</strong> be <code>VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PRIMITIVE_TOPOLOGY_LIST_RESTART_FEATURES_EXT</code>"
+        }
+      ]
+    },
     "VkPhysicalDeviceShaderSMBuiltinsFeaturesNV": {
       "(VK_NV_shader_sm_builtins)": [
         {
@@ -41384,6 +41894,30 @@
         }
       ]
     },
+    "VkPhysicalDevicePresentIdFeaturesKHR": {
+      "(VK_KHR_present_id)": [
+        {
+          "vuid": "VUID-VkPhysicalDevicePresentIdFeaturesKHR-sType-sType",
+          "text": " <code>sType</code> <strong class=\"purple\">must</strong> be <code>VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PRESENT_ID_FEATURES_KHR</code>"
+        }
+      ]
+    },
+    "VkPhysicalDevicePresentWaitFeaturesKHR": {
+      "(VK_KHR_present_wait)": [
+        {
+          "vuid": "VUID-VkPhysicalDevicePresentWaitFeaturesKHR-sType-sType",
+          "text": " <code>sType</code> <strong class=\"purple\">must</strong> be <code>VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PRESENT_WAIT_FEATURES_KHR</code>"
+        }
+      ]
+    },
+    "VkPhysicalDeviceShaderIntegerDotProductFeaturesKHR": {
+      "(VK_KHR_shader_integer_dot_product)": [
+        {
+          "vuid": "VUID-VkPhysicalDeviceShaderIntegerDotProductFeaturesKHR-sType-sType",
+          "text": " <code>sType</code> <strong class=\"purple\">must</strong> be <code>VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_INTEGER_DOT_PRODUCT_FEATURES_KHR</code>"
+        }
+      ]
+    },
     "VkPhysicalDevicePushDescriptorPropertiesKHR": {
       "(VK_KHR_push_descriptor)": [
         {
@@ -42518,7 +43052,7 @@
       "(VK_EXT_debug_utils)": [
         {
           "vuid": "VUID-PFN_vkDebugUtilsMessengerCallbackEXT-None-04769",
-          "text": " The callback <strong class=\"purple\">must</strong> not make calls to any Vulkan commands."
+          "text": " The callback <strong class=\"purple\">must</strong> not make calls to any Vulkan commands"
         }
       ]
     },
@@ -43034,7 +43568,7 @@
         },
         {
           "vuid": "VUID-StandaloneSpirv-None-04642",
-          "text": " <strong>Scope</strong> for <strong>Non Uniform Group Operations</strong> <strong class=\"purple\">must</strong> be limited to <strong>Subgroup</strong>"
+          "text": " <strong>Scope</strong> for <a href=\"#shaders-group-operations\">group operations</a> <strong class=\"purple\">must</strong> be limited to <strong>Subgroup</strong>"
         },
         {
           "vuid": "VUID-StandaloneSpirv-None-04643",
@@ -43074,7 +43608,7 @@
         },
         {
           "vuid": "VUID-StandaloneSpirv-OpVariable-04734",
-          "text": " Any <code>OpVariable</code> with an <code>Initializer</code> operand and <strong>Workgroup</strong> as its <strong>Storage Class</strong> operand <strong class=\"purple\">must</strong> use <code>OpConstantNull</code> as the initializer."
+          "text": " Any <code>OpVariable</code> with an <code>Initializer</code> operand and <strong>Workgroup</strong> as its <strong>Storage Class</strong> operand <strong class=\"purple\">must</strong> use <code>OpConstantNull</code> as the initializer"
         },
         {
           "vuid": "VUID-StandaloneSpirv-OpReadClockKHR-04652",
@@ -43102,7 +43636,7 @@
         },
         {
           "vuid": "VUID-StandaloneSpirv-Image-04965",
-          "text": " The converted bit width, signedness, and numeric type of the <code>Image</code> <code>Format</code> operand of an <code>OpTypeImage</code> <strong class=\"purple\">must</strong> match the <code>Sampled</code> <code>Type</code>, as defined in <a href=\"#spirvenv-format-type-matching\">Image Format and Type Matching</a>."
+          "text": " The converted bit width, signedness, and numeric type of the <code>Image</code> <code>Format</code> operand of an <code>OpTypeImage</code> <strong class=\"purple\">must</strong> match the <code>Sampled</code> <code>Type</code>, as defined in <a href=\"#spirvenv-format-type-matching\">Image Format and Type Matching</a>"
         },
         {
           "vuid": "VUID-StandaloneSpirv-OpImageTexelPointer-04658",
@@ -43113,6 +43647,10 @@
           "text": " <code>OpImageQuerySizeLod</code>, <code>OpImageQueryLod</code>, and <code>OpImageQueryLevels</code> <strong class=\"purple\">must</strong> only consume an &#8220;Image&#8221; operand whose type has its &#8220;Sampled&#8221; operand set to 1"
         },
         {
+          "vuid": "VUID-StandaloneSpirv-OpTypeImage-06214",
+          "text": " An <code>OpTypeImage</code> with a &#8220;Dim&#8221; operand of <code>SubpassData</code> <strong class=\"purple\">must</strong> have an &#8220;Arrayed&#8221; operand of 0 (non-arrayed) and a &#8220;Sampled&#8221; operand of 2 (storage image)"
+        },
+        {
           "vuid": "VUID-StandaloneSpirv-SubpassData-04660",
           "text": " The <span class=\"eq\">(u,v)</span> coordinates used for a <code>SubpassData</code> <strong class=\"purple\">must</strong> be the &lt;id&gt; of a constant vector <span class=\"eq\">(0,0)</span>, or if a layer coordinate is used, <strong class=\"purple\">must</strong> be a vector that was formed with constant 0 for the <span class=\"eq\">u</span> and <span class=\"eq\">v</span> components"
         },
@@ -43138,7 +43676,7 @@
         },
         {
           "vuid": "VUID-StandaloneSpirv-OpImage-04777",
-          "text": " <code>OpImage*Dref</code> <strong class=\"purple\">must</strong> not consume an image whose <code>Dim</code> is 3D."
+          "text": " <code>OpImage*Dref</code> <strong class=\"purple\">must</strong> not consume an image whose <code>Dim</code> is 3D"
         },
         {
           "vuid": "VUID-StandaloneSpirv-OpTypeAccelerationStructureKHR-04665",
@@ -43202,11 +43740,19 @@
         },
         {
           "vuid": "VUID-StandaloneSpirv-Flat-04670",
-          "text": " The <code>Flat</code>, <code>NoPerspective</code>, <code>Sample</code>, and <code>Centroid</code> decorations <strong class=\"purple\">must</strong> not be used on variables with storage class other than <code>Input</code> or on variables used in the interface of non-fragment shader entry points"
+          "text": " The <code>Flat</code>, <code>NoPerspective</code>, <code>Sample</code>, and <code>Centroid</code> decorations <strong class=\"purple\">must</strong> only be used on variables with the <code>Output</code> or <code>Input</code> storage class"
+        },
+        {
+          "vuid": "VUID-StandaloneSpirv-Flat-06201",
+          "text": " The <code>Flat</code>, <code>NoPerspective</code>, <code>Sample</code>, and <code>Centroid</code> decorations <strong class=\"purple\">must</strong> not be used on variables with the <code>Output</code> storage class in a fragment shader"
+        },
+        {
+          "vuid": "VUID-StandaloneSpirv-Flat-06202",
+          "text": " The <code>Flat</code>, <code>NoPerspective</code>, <code>Sample</code>, and <code>Centroid</code> decorations <strong class=\"purple\">must</strong> not be used on variables with the <code>Input</code> storage class in a vertex shader"
         },
         {
           "vuid": "VUID-StandaloneSpirv-Flat-04744",
-          "text": " The <code>Flat</code> decorations <strong class=\"purple\">must</strong> be used on variables with storage class of <code>Input</code> in a fragment shader stage that are a scalar integer, vector of integer, or any double-precision floating-point type"
+          "text": " Any variable with integer or double-precision floating-point type and with <code>Input</code> storage class in a fragment shader, <strong class=\"purple\">must</strong> be decorated <code>Flat</code>"
         },
         {
           "vuid": "VUID-StandaloneSpirv-ViewportRelativeNV-04672",
@@ -43246,7 +43792,7 @@
         },
         {
           "vuid": "VUID-StandaloneSpirv-Function-04681",
-          "text": " A type <em>T</em> that is an array sized with a specialization constant <strong class=\"purple\">must</strong> neither be, nor be contained in, the type <em>T2</em> of a variable <em>V</em>, unless either: a) <em>T</em> is equal to <em>T2</em>, b) <em>V</em> is declared in the <code>Function</code>, or <code>Private</code> storage classes, c) <em>V</em> is a non-Block variable in the <code>Workgroup</code> storage class, or d) <em>V</em> is an interface variable with an additional level of arrayness, <a href=\"#interfaces-iointerfaces-matching\">as described in interface matching</a>, and <em>T</em> is the member type of the array type <em>T2</em>."
+          "text": " A type <em>T</em> that is an array sized with a specialization constant <strong class=\"purple\">must</strong> neither be, nor be contained in, the type <em>T2</em> of a variable <em>V</em>, unless either: a) <em>T</em> is equal to <em>T2</em>, b) <em>V</em> is declared in the <code>Function</code>, or <code>Private</code> storage classes, c) <em>V</em> is a non-Block variable in the <code>Workgroup</code> storage class, or d) <em>V</em> is an interface variable with an additional level of arrayness, <a href=\"#interfaces-iointerfaces-matching\">as described in interface matching</a>, and <em>T</em> is the member type of the array type <em>T2</em>"
         },
         {
           "vuid": "VUID-StandaloneSpirv-OpControlBarrier-04682",
diff --git a/third_party/vulkan-deps/vulkan-headers/src/registry/vk.xml b/third_party/vulkan-deps/vulkan-headers/src/registry/vk.xml
index 6651269..50d55cd 100644
--- a/third_party/vulkan-deps/vulkan-headers/src/registry/vk.xml
+++ b/third_party/vulkan-deps/vulkan-headers/src/registry/vk.xml
@@ -67,7 +67,7 @@
         <tag name="EXT"         author="Multivendor"                   contact="Jon Leech @oddhack"/>
         <tag name="MESA"        author="Mesa open source project"      contact="Chad Versace @chadversary, Daniel Stone @fooishbar, David Airlie @airlied, Jason Ekstrand @jekstrand"/>
         <tag name="INTEL"       author="Intel Corporation"             contact="Slawek Grajewski @sgrajewski"/>
-        <tag name="HUAWEI"      author="Huawei Technologies Co. Ltd."  contact="Hueilong Wang @wyvernathuawei"/>
+        <tag name="HUAWEI"      author="Huawei Technologies Co. Ltd."  contact="Hueilong Wang @wyvernathuawei, Yunpeng Zhu @yunxingzhu"/>
         <tag name="VALVE"       author="Valve Corporation"             contact="Pierre-Loup Griffais @plagman, Joshua Ashton @Joshua-Ashton, Hans-Kristian Arntzen @HansKristian-Work"/>
         <tag name="QNX"         author="BlackBerry Limited"            contact="Mike Gorchak @mgorchak-blackberry"/>
         <tag name="JUICE"       author="Juice Technologies, Inc."      contact="David McCloskey @damcclos, Dean Beeler @canadacow"/>
@@ -75,7 +75,7 @@
     </tags>
 
     <types comment="Vulkan type definitions">
-        <type name="vk_platform" category="include">#include "vulkan/vk_platform.h"</type>
+        <type name="vk_platform" category="include">#include "vk_platform.h"</type>
 
             <comment>WSI extensions</comment>
 
@@ -155,7 +155,7 @@
         <type category="define" requires="VK_MAKE_API_VERSION">// Vulkan 1.2 version number
 #define <name>VK_API_VERSION_1_2</name> <type>VK_MAKE_API_VERSION</type>(0, 1, 2, 0)// Patch version should always be set to 0</type>
         <type category="define">// Version of this file
-#define <name>VK_HEADER_VERSION</name> 184</type>
+#define <name>VK_HEADER_VERSION</name> 190</type>
         <type category="define" requires="VK_HEADER_VERSION">// Complete version of this file
 #define <name>VK_HEADER_VERSION_COMPLETE</name> <type>VK_MAKE_API_VERSION</type>(0, 1, 2, VK_HEADER_VERSION)</type>
 
@@ -261,12 +261,11 @@
         <type requires="VkPipelineCreateFlagBits"         category="bitmask">typedef <type>VkFlags</type> <name>VkPipelineCreateFlags</name>;</type>
         <type requires="VkColorComponentFlagBits"         category="bitmask">typedef <type>VkFlags</type> <name>VkColorComponentFlags</name>;</type>
         <type requires="VkFenceCreateFlagBits"            category="bitmask">typedef <type>VkFlags</type> <name>VkFenceCreateFlags</name>;</type>
-            <comment>When VkSemaphoreCreateFlagBits is first extended, need to add a requires= attribute for it to VkSemaphoreCreateFlags</comment>
         <type                                             category="bitmask">typedef <type>VkFlags</type> <name>VkSemaphoreCreateFlags</name>;</type>
         <type requires="VkFormatFeatureFlagBits"          category="bitmask">typedef <type>VkFlags</type> <name>VkFormatFeatureFlags</name>;</type>
         <type requires="VkQueryControlFlagBits"           category="bitmask">typedef <type>VkFlags</type> <name>VkQueryControlFlags</name>;</type>
         <type requires="VkQueryResultFlagBits"            category="bitmask">typedef <type>VkFlags</type> <name>VkQueryResultFlags</name>;</type>
-        <type requires="VkShaderModuleCreateFlagBits"     category="bitmask">typedef <type>VkFlags</type> <name>VkShaderModuleCreateFlags</name>;</type>
+        <type                                             category="bitmask">typedef <type>VkFlags</type> <name>VkShaderModuleCreateFlags</name>;</type>
         <type requires="VkEventCreateFlagBits"            category="bitmask">typedef <type>VkFlags</type> <name>VkEventCreateFlags</name>;</type>
         <type requires="VkCommandPoolCreateFlagBits"      category="bitmask">typedef <type>VkFlags</type> <name>VkCommandPoolCreateFlags</name>;</type>
         <type requires="VkCommandPoolResetFlagBits"       category="bitmask">typedef <type>VkFlags</type> <name>VkCommandPoolResetFlags</name>;</type>
@@ -386,7 +385,7 @@
 
             <comment>Video Core extension</comment>
         <type requires="VkVideoCodecOperationFlagBitsKHR"           category="bitmask">typedef <type>VkFlags</type> <name>VkVideoCodecOperationFlagsKHR</name>;</type>
-        <type requires="VkVideoCapabilitiesFlagBitsKHR"             category="bitmask">typedef <type>VkFlags</type> <name>VkVideoCapabilitiesFlagsKHR</name>;</type>
+        <type requires="VkVideoCapabilityFlagBitsKHR"               category="bitmask">typedef <type>VkFlags</type> <name>VkVideoCapabilityFlagsKHR</name>;</type>
         <type requires="VkVideoSessionCreateFlagBitsKHR"            category="bitmask">typedef <type>VkFlags</type> <name>VkVideoSessionCreateFlagsKHR</name>;</type>
         <type                                                       category="bitmask">typedef <type>VkFlags</type> <name>VkVideoBeginCodingFlagsKHR</name>;</type>
         <type                                                       category="bitmask">typedef <type>VkFlags</type> <name>VkVideoEndCodingFlagsKHR</name>;</type>
@@ -397,7 +396,7 @@
         <type requires="VkVideoDecodeFlagBitsKHR"                   category="bitmask">typedef <type>VkFlags</type> <name>VkVideoDecodeFlagsKHR</name>;</type>
 
             <comment>Video Decode H.264 extension</comment>
-        <type requires="VkVideoDecodeH264FieldLayoutFlagBitsEXT"    category="bitmask">typedef <type>VkFlags</type> <name>VkVideoDecodeH264FieldLayoutFlagsEXT</name>;</type>
+        <type requires="VkVideoDecodeH264PictureLayoutFlagBitsEXT"  category="bitmask">typedef <type>VkFlags</type> <name>VkVideoDecodeH264PictureLayoutFlagsEXT</name>;</type>
         <type                                                       category="bitmask">typedef <type>VkFlags</type> <name>VkVideoDecodeH264CreateFlagsEXT</name>;</type>
 
             <comment>Video Decode H.265 extension</comment>
@@ -411,7 +410,7 @@
         <type requires="VkVideoComponentBitDepthFlagBitsKHR"        category="bitmask">typedef <type>VkFlags</type> <name>VkVideoComponentBitDepthFlagsKHR</name>;</type>
 
             <comment>Video Encode H.264 extension</comment>
-        <type requires="VkVideoEncodeH264CapabilitiesFlagBitsEXT"   category="bitmask">typedef <type>VkFlags</type> <name>VkVideoEncodeH264CapabilitiesFlagsEXT</name>;</type>
+        <type requires="VkVideoEncodeH264CapabilityFlagBitsEXT"     category="bitmask">typedef <type>VkFlags</type> <name>VkVideoEncodeH264CapabilityFlagsEXT</name>;</type>
         <type requires="VkVideoEncodeH264InputModeFlagBitsEXT"      category="bitmask">typedef <type>VkFlags</type> <name>VkVideoEncodeH264InputModeFlagsEXT</name>;</type>
         <type requires="VkVideoEncodeH264OutputModeFlagBitsEXT"     category="bitmask">typedef <type>VkFlags</type> <name>VkVideoEncodeH264OutputModeFlagsEXT</name>;</type>
         <type requires="VkVideoEncodeH264CreateFlagBitsEXT"         category="bitmask">typedef <type>VkFlags</type> <name>VkVideoEncodeH264CreateFlagsEXT</name>;</type>
@@ -548,7 +547,7 @@
         <type name="VkObjectType" category="enum"/>
         <type name="VkEventCreateFlagBits" category="enum"/>
         <type name="VkPipelineLayoutCreateFlagBits" category="enum"/>
-            <comment>When VkSemaphoreCreateFlagBits is first extended, need to add a type enum tag for it here</comment>
+        <type name="VkSemaphoreCreateFlagBits" category="enum"/>
 
         <comment>Extensions</comment>
         <type name="VkIndirectCommandsLayoutUsageFlagBitsNV" category="enum"/>
@@ -698,7 +697,7 @@
         <type name="VkVideoCodecOperationFlagBitsKHR" category="enum"/>
         <type name="VkVideoChromaSubsamplingFlagBitsKHR" category="enum"/>
         <type name="VkVideoComponentBitDepthFlagBitsKHR" category="enum"/>
-        <type name="VkVideoCapabilitiesFlagBitsKHR" category="enum"/>
+        <type name="VkVideoCapabilityFlagBitsKHR" category="enum"/>
         <type name="VkVideoSessionCreateFlagBitsKHR" category="enum"/>
         <type name="VkVideoCodingQualityPresetFlagBitsKHR" category="enum"/>
         <type name="VkVideoCodingControlFlagBitsKHR" category="enum"/>
@@ -708,7 +707,7 @@
         <type name="VkVideoDecodeFlagBitsKHR" category="enum"/>
 
             <comment>Video H.264 Decode extensions</comment>
-        <type name="VkVideoDecodeH264FieldLayoutFlagBitsEXT" category="enum"/>
+        <type name="VkVideoDecodeH264PictureLayoutFlagBitsEXT" category="enum"/>
 
             <comment>Video H.265 Decode extensions</comment>
 
@@ -718,7 +717,7 @@
         <type name="VkVideoEncodeRateControlModeFlagBitsKHR" category="enum"/>
 
            <comment>Video H.264 Encode extensions</comment>
-        <type name="VkVideoEncodeH264CapabilitiesFlagBitsEXT"   category="enum"/>
+        <type name="VkVideoEncodeH264CapabilityFlagBitsEXT"     category="enum"/>
         <type name="VkVideoEncodeH264InputModeFlagBitsEXT"      category="enum"/>
         <type name="VkVideoEncodeH264OutputModeFlagBitsEXT"     category="enum"/>
         <type name="VkVideoEncodeH264CreateFlagBitsEXT"         category="enum"/>
@@ -2087,7 +2086,7 @@
         <type category="struct" name="VkPhysicalDeviceMultiDrawPropertiesEXT" structextends="VkPhysicalDeviceProperties2" returnedonly="true">
             <member values="VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTI_DRAW_PROPERTIES_EXT"><type>VkStructureType</type> <name>sType</name></member>
             <member optional="true"><type>void</type>*    <name>pNext</name></member>
-            <member><type>uint32_t</type>         <name>maxMultiDrawCount</name></member>
+            <member limittype="max"><type>uint32_t</type>         <name>maxMultiDrawCount</name></member>
         </type>
         <type category="struct" name="VkGraphicsShaderGroupCreateInfoNV">
             <member values="VK_STRUCTURE_TYPE_GRAPHICS_SHADER_GROUP_CREATE_INFO_NV"><type>VkStructureType</type> <name>sType</name></member>
@@ -2360,18 +2359,18 @@
         </type>
         <type category="struct" name="VkImportMemoryZirconHandleInfoFUCHSIA" structextends="VkMemoryAllocateInfo">
             <member values="VK_STRUCTURE_TYPE_IMPORT_MEMORY_ZIRCON_HANDLE_INFO_FUCHSIA"><type>VkStructureType</type> <name>sType</name></member>
-            <member>const <type>void</type>*                      <name>pNext</name></member>
+            <member optional="true">const <type>void</type>*                      <name>pNext</name></member>
             <member optional="true"><type>VkExternalMemoryHandleTypeFlagBits</type> <name>handleType</name></member>
             <member optional="true"><type>zx_handle_t</type>           <name>handle</name></member>
         </type>
         <type category="struct" name="VkMemoryZirconHandlePropertiesFUCHSIA" returnedonly="true">
             <member values="VK_STRUCTURE_TYPE_MEMORY_ZIRCON_HANDLE_PROPERTIES_FUCHSIA"><type>VkStructureType</type> <name>sType</name></member>
-            <member><type>void</type>*                            <name>pNext</name></member>
+            <member optional="true"><type>void</type>*                            <name>pNext</name></member>
             <member><type>uint32_t</type>                         <name>memoryTypeBits</name></member>
         </type>
         <type category="struct" name="VkMemoryGetZirconHandleInfoFUCHSIA">
             <member values="VK_STRUCTURE_TYPE_MEMORY_GET_ZIRCON_HANDLE_INFO_FUCHSIA"><type>VkStructureType</type> <name>sType</name></member>
-            <member>const <type>void</type>*                      <name>pNext</name></member>
+            <member optional="true">const <type>void</type>*                      <name>pNext</name></member>
             <member><type>VkDeviceMemory</type>                   <name>memory</name></member>
             <member><type>VkExternalMemoryHandleTypeFlagBits</type> <name>handleType</name></member>
         </type>
@@ -2759,6 +2758,22 @@
             <member><type>float</type>   <name>x</name></member>
             <member><type>float</type>   <name>y</name></member>
         </type>
+        <type category="struct" name="VkPhysicalDevicePresentIdFeaturesKHR" structextends="VkPhysicalDeviceFeatures2,VkDeviceCreateInfo">
+            <member values="VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PRESENT_ID_FEATURES_KHR"><type>VkStructureType</type> <name>sType</name></member>
+            <member optional="true"><type>void</type>*            <name>pNext</name></member>
+            <member><type>VkBool32</type>                         <name>presentId</name><comment>Present ID in VkPresentInfoKHR</comment></member>
+        </type>
+        <type category="struct" name="VkPresentIdKHR" structextends="VkPresentInfoKHR">
+            <member values="VK_STRUCTURE_TYPE_PRESENT_ID_KHR"><type>VkStructureType</type> <name>sType</name></member>
+            <member optional="true">const <type>void</type>*                      <name>pNext</name></member>
+            <member><type>uint32_t</type>                         <name>swapchainCount</name><comment>Copy of VkPresentInfoKHR::swapchainCount</comment></member>
+            <member len="swapchainCount" optional="true">const <type>uint64_t</type>* <name>pPresentIds</name><comment>Present ID values for each swapchain</comment></member>
+        </type>
+        <type category="struct" name="VkPhysicalDevicePresentWaitFeaturesKHR" structextends="VkPhysicalDeviceFeatures2,VkDeviceCreateInfo">
+            <member values="VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PRESENT_WAIT_FEATURES_KHR"><type>VkStructureType</type> <name>sType</name></member>
+            <member optional="true"><type>void</type>*            <name>pNext</name></member>
+            <member><type>VkBool32</type>                         <name>presentWait</name><comment>vkWaitForPresentKHR is supported</comment></member>
+        </type>
         <type category="struct" name="VkHdrMetadataEXT">
                 <comment>Display primary in chromaticity coordinates</comment>
             <member values="VK_STRUCTURE_TYPE_HDR_METADATA_EXT"><type>VkStructureType</type> <name>sType</name></member>
@@ -3160,7 +3175,7 @@
         </type>
         <type category="struct" name="VkPhysicalDeviceMultiDrawFeaturesEXT" structextends="VkPhysicalDeviceFeatures2,VkDeviceCreateInfo">
             <member values="VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTI_DRAW_FEATURES_EXT"><type>VkStructureType</type> <name>sType</name></member>
-            <member noautovalidity="true"><type>void</type>*                     <name>pNext</name></member>
+            <member optional="true" noautovalidity="true"><type>void</type>*                     <name>pNext</name></member>
             <member><type>VkBool32</type>                                        <name>multiDraw</name></member>
         </type>
         <type category="struct" name="VkPhysicalDeviceBlendOperationAdvancedPropertiesEXT" returnedonly="true" structextends="VkPhysicalDeviceProperties2">
@@ -3335,7 +3350,7 @@
         </type>
         <type category="struct" name="VkPhysicalDeviceGlobalPriorityQueryFeaturesEXT" structextends="VkPhysicalDeviceFeatures2,VkDeviceCreateInfo">
             <member values="VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_GLOBAL_PRIORITY_QUERY_FEATURES_EXT"><type>VkStructureType</type> <name>sType</name></member>
-            <member noautovalidity="true"><type>void</type>* <name>pNext</name></member>
+            <member optional="true" noautovalidity="true"><type>void</type>* <name>pNext</name></member>
             <member><type>VkBool32</type>                    <name>globalPriorityQuery</name></member>
         </type>
         <type category="struct" name="VkQueueFamilyGlobalPriorityPropertiesEXT" structextends="VkQueueFamilyProperties2">
@@ -3781,6 +3796,22 @@
             <member><type>VkBool32</type>                            <name>sparseImageFloat32Atomics</name></member>
             <member><type>VkBool32</type>                            <name>sparseImageFloat32AtomicAdd</name></member>
         </type>
+        <type category="struct" name="VkPhysicalDeviceShaderAtomicFloat2FeaturesEXT" structextends="VkPhysicalDeviceFeatures2,VkDeviceCreateInfo">
+            <member values="VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_ATOMIC_FLOAT_2_FEATURES_EXT"><type>VkStructureType</type> <name>sType</name></member>
+            <member optional="true"><type>void</type>*                               <name>pNext</name></member>
+            <member><type>VkBool32</type>                            <name>shaderBufferFloat16Atomics</name></member>
+            <member><type>VkBool32</type>                            <name>shaderBufferFloat16AtomicAdd</name></member>
+            <member><type>VkBool32</type>                            <name>shaderBufferFloat16AtomicMinMax</name></member>
+            <member><type>VkBool32</type>                            <name>shaderBufferFloat32AtomicMinMax</name></member>
+            <member><type>VkBool32</type>                            <name>shaderBufferFloat64AtomicMinMax</name></member>
+            <member><type>VkBool32</type>                            <name>shaderSharedFloat16Atomics</name></member>
+            <member><type>VkBool32</type>                            <name>shaderSharedFloat16AtomicAdd</name></member>
+            <member><type>VkBool32</type>                            <name>shaderSharedFloat16AtomicMinMax</name></member>
+            <member><type>VkBool32</type>                            <name>shaderSharedFloat32AtomicMinMax</name></member>
+            <member><type>VkBool32</type>                            <name>shaderSharedFloat64AtomicMinMax</name></member>
+            <member><type>VkBool32</type>                            <name>shaderImageFloat32AtomicMinMax</name></member>
+            <member><type>VkBool32</type>                            <name>sparseImageFloat32AtomicMinMax</name></member>
+        </type>
         <type category="struct" name="VkPhysicalDeviceVertexAttributeDivisorFeaturesEXT" structextends="VkPhysicalDeviceFeatures2,VkDeviceCreateInfo">
             <member values="VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VERTEX_ATTRIBUTE_DIVISOR_FEATURES_EXT"><type>VkStructureType</type> <name>sType</name></member>
             <member optional="true"><type>void</type>*        <name>pNext</name></member>
@@ -3922,6 +3953,11 @@
             <member limittype="max"><type>uint32_t</type>                            <name>shadingRatePaletteSize</name></member>
             <member limittype="max"><type>uint32_t</type>                            <name>shadingRateMaxCoarseSamples</name></member>
         </type>
+        <type category="struct" name="VkPhysicalDeviceInvocationMaskFeaturesHUAWEI" structextends="VkPhysicalDeviceFeatures2,VkDeviceCreateInfo">
+            <member values="VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_INVOCATION_MASK_FEATURES_HUAWEI"><type>VkStructureType</type> <name>sType</name></member>
+            <member optional="true"><type>void</type>*                               <name>pNext</name></member>
+            <member><type>VkBool32</type>                            <name>invocationMask</name></member>
+        </type>
         <type category="struct" name="VkCoarseSampleLocationNV">
             <member><type>uint32_t</type>                            <name>pixelX</name></member>
             <member><type>uint32_t</type>                            <name>pixelY</name></member>
@@ -4604,6 +4640,12 @@
             <member optional="true"><type>void</type>*    <name>pNext</name></member>
             <member><type>VkImageLayout</type>                  <name>stencilLayout</name></member>
         </type>
+        <type category="struct" name="VkPhysicalDevicePrimitiveTopologyListRestartFeaturesEXT" structextends="VkPhysicalDeviceFeatures2,VkDeviceCreateInfo">
+            <member values="VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PRIMITIVE_TOPOLOGY_LIST_RESTART_FEATURES_EXT"><type>VkStructureType</type> <name>sType</name></member>
+            <member optional="true"><type>void</type>*        <name>pNext</name></member>
+            <member><type>VkBool32</type>                     <name>primitiveTopologyListRestart</name></member>
+            <member><type>VkBool32</type>                     <name>primitiveTopologyPatchListRestart</name></member>
+        </type>
         <type category="struct" name="VkAttachmentReferenceStencilLayoutKHR"                   alias="VkAttachmentReferenceStencilLayout"/>
         <type category="struct" name="VkAttachmentDescriptionStencilLayout" structextends="VkAttachmentDescription2">
             <member values="VK_STRUCTURE_TYPE_ATTACHMENT_DESCRIPTION_STENCIL_LAYOUT"><type>VkStructureType</type><name>sType</name></member>
@@ -4698,7 +4740,7 @@
         </type>
         <type category="struct" name="VkSubpassShadingPipelineCreateInfoHUAWEI" returnedonly="true" structextends="VkComputePipelineCreateInfo">
             <member values="VK_STRUCTURE_TYPE_SUBPASS_SHADING_PIPELINE_CREATE_INFO_HUAWEI"><type>VkStructureType</type> <name>sType</name></member>
-            <member><type>void</type>*                  <name>pNext</name></member>
+            <member optional="true"><type>void</type>*                  <name>pNext</name></member>
             <member><type>VkRenderPass</type>           <name>renderPass</name></member>
             <member><type>uint32_t</type>               <name>subpass</name></member>
         </type>
@@ -5028,7 +5070,7 @@
         <type category="struct" name="VkAccelerationStructureVersionInfoKHR">
             <member values="VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_VERSION_INFO_KHR"><type>VkStructureType</type> <name>sType</name></member>
             <member optional="true">const <type>void</type>*                                            <name>pNext</name></member>
-            <member len="2*ename:VK_UUID_SIZE" altlen="2*VK_UUID_SIZE">const <type>uint8_t</type>*                    <name>pVersionData</name></member>
+            <member len="latexmath:[2 \times \mathtt{VK\_UUID\_SIZE}]" altlen="2*VK_UUID_SIZE">const <type>uint8_t</type>*                    <name>pVersionData</name></member>
         </type>
         <type category="struct" name="VkCopyAccelerationStructureInfoKHR">
             <member values="VK_STRUCTURE_TYPE_COPY_ACCELERATION_STRUCTURE_INFO_KHR"><type>VkStructureType</type> <name>sType</name></member>
@@ -5103,12 +5145,12 @@
         </type>
         <type category="struct" name="VkPhysicalDeviceZeroInitializeWorkgroupMemoryFeaturesKHR" structextends="VkPhysicalDeviceFeatures2,VkDeviceCreateInfo">
             <member values="VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ZERO_INITIALIZE_WORKGROUP_MEMORY_FEATURES_KHR"><type>VkStructureType</type> <name>sType</name></member>
-            <member><type>void</type>*          <name>pNext</name></member>
+            <member optional="true"><type>void</type>*          <name>pNext</name></member>
             <member><type>VkBool32</type>       <name>shaderZeroInitializeWorkgroupMemory</name></member>
         </type>
         <type category="struct" name="VkPhysicalDeviceShaderSubgroupUniformControlFlowFeaturesKHR" structextends="VkPhysicalDeviceFeatures2,VkDeviceCreateInfo">
             <member values="VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_SUBGROUP_UNIFORM_CONTROL_FLOW_FEATURES_KHR"><type>VkStructureType</type> <name>sType</name></member>
-            <member><type>void</type>*    <name>pNext</name></member>
+            <member optional="true"><type>void</type>*    <name>pNext</name></member>
             <member><type>VkBool32</type> <name>shaderSubgroupUniformControlFlow</name></member>
         </type>
         <type category="struct" name="VkPhysicalDeviceRobustness2FeaturesEXT" structextends="VkPhysicalDeviceFeatures2,VkDeviceCreateInfo">
@@ -5131,7 +5173,7 @@
         </type>
         <type category="struct" name="VkPhysicalDeviceWorkgroupMemoryExplicitLayoutFeaturesKHR" structextends="VkPhysicalDeviceFeatures2,VkDeviceCreateInfo">
             <member values="VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_WORKGROUP_MEMORY_EXPLICIT_LAYOUT_FEATURES_KHR"><type>VkStructureType</type> <name>sType</name></member>
-            <member noautovalidity="true"><type>void</type>*        <name>pNext</name></member>
+            <member optional="true" noautovalidity="true"><type>void</type>*        <name>pNext</name></member>
             <member><type>VkBool32</type>                           <name>workgroupMemoryExplicitLayout</name></member>
             <member><type>VkBool32</type>                           <name>workgroupMemoryExplicitLayoutScalarBlockLayout</name></member>
             <member><type>VkBool32</type>                           <name>workgroupMemoryExplicitLayout8BitAccess</name></member>
@@ -5357,7 +5399,7 @@
         </type>
         <type category="struct" name="VkPhysicalDeviceMutableDescriptorTypeFeaturesVALVE" structextends="VkPhysicalDeviceFeatures2,VkDeviceCreateInfo">
             <member values="VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MUTABLE_DESCRIPTOR_TYPE_FEATURES_VALVE"><type>VkStructureType</type> <name>sType</name></member>
-            <member noautovalidity="true"><type>void</type>*                     <name>pNext</name></member>
+            <member optional="true" noautovalidity="true"><type>void</type>*                     <name>pNext</name></member>
             <member><type>VkBool32</type>                                        <name>mutableDescriptorType</name></member>
         </type>
         <type category="struct" name="VkMutableDescriptorTypeListVALVE">
@@ -5366,23 +5408,23 @@
         </type>
         <type category="struct" name="VkMutableDescriptorTypeCreateInfoVALVE" structextends="VkDescriptorSetLayoutCreateInfo,VkDescriptorPoolCreateInfo">
             <member values="VK_STRUCTURE_TYPE_MUTABLE_DESCRIPTOR_TYPE_CREATE_INFO_VALVE"><type>VkStructureType</type> <name>sType</name></member>
-            <member>const <type>void</type>*                                                                      <name>pNext</name></member>
+            <member optional="true">const <type>void</type>*                                                                      <name>pNext</name></member>
             <member optional="true"><type>uint32_t</type>                                                         <name>mutableDescriptorTypeListCount</name></member>
             <member len="mutableDescriptorTypeListCount">const <type>VkMutableDescriptorTypeListVALVE</type>* <name>pMutableDescriptorTypeLists</name></member>
         </type>
         <type category="struct" name="VkPhysicalDeviceVertexInputDynamicStateFeaturesEXT" structextends="VkPhysicalDeviceFeatures2,VkDeviceCreateInfo">
             <member values="VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VERTEX_INPUT_DYNAMIC_STATE_FEATURES_EXT"><type>VkStructureType</type> <name>sType</name></member>
-            <member noautovalidity="true"><type>void</type>*        <name>pNext</name></member>
+            <member optional="true" noautovalidity="true"><type>void</type>*        <name>pNext</name></member>
             <member><type>VkBool32</type>                           <name>vertexInputDynamicState</name></member>
         </type>
         <type category="struct" name="VkPhysicalDeviceExternalMemoryRDMAFeaturesNV" structextends="VkPhysicalDeviceFeatures2,VkDeviceCreateInfo">
             <member values="VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_MEMORY_RDMA_FEATURES_NV"><type>VkStructureType</type> <name>sType</name></member>
-            <member noautovalidity="true"><type>void</type>*        <name>pNext</name></member>
+            <member optional="true" noautovalidity="true"><type>void</type>*        <name>pNext</name></member>
             <member><type>VkBool32</type>                           <name>externalMemoryRDMA</name></member>
         </type>
         <type category="struct" name="VkVertexInputBindingDescription2EXT">
             <member values="VK_STRUCTURE_TYPE_VERTEX_INPUT_BINDING_DESCRIPTION_2_EXT"><type>VkStructureType</type><name>sType</name></member>
-            <member noautovalidity="true"><type>void</type>*    <name>pNext</name></member>
+            <member optional="true" noautovalidity="true"><type>void</type>*    <name>pNext</name></member>
             <member><type>uint32_t</type>                       <name>binding</name></member>
             <member><type>uint32_t</type>                       <name>stride</name></member>
             <member><type>VkVertexInputRate</type>              <name>inputRate</name></member>
@@ -5390,7 +5432,7 @@
         </type>
         <type category="struct" name="VkVertexInputAttributeDescription2EXT">
             <member values="VK_STRUCTURE_TYPE_VERTEX_INPUT_ATTRIBUTE_DESCRIPTION_2_EXT"><type>VkStructureType</type><name>sType</name></member>
-            <member noautovalidity="true"><type>void</type>*    <name>pNext</name></member>
+            <member optional="true" noautovalidity="true"><type>void</type>*    <name>pNext</name></member>
             <member><type>uint32_t</type>                       <name>location</name><comment>location of the shader vertex attrib</comment></member>
             <member><type>uint32_t</type>                       <name>binding</name><comment>Vertex buffer binding id</comment></member>
             <member><type>VkFormat</type>                       <name>format</name><comment>format of source data</comment></member>
@@ -5409,7 +5451,7 @@
         </type>
         <type category="struct" name="VkMemoryBarrier2KHR" structextends="VkSubpassDependency2">
             <member values="VK_STRUCTURE_TYPE_MEMORY_BARRIER_2_KHR"><type>VkStructureType</type> <name>sType</name></member>
-            <member>const <type>void</type>*                               <name>pNext</name></member>
+            <member optional="true">const <type>void</type>*                               <name>pNext</name></member>
             <member optional="true"><type>VkPipelineStageFlags2KHR</type>  <name>srcStageMask</name></member>
             <member optional="true"><type>VkAccessFlags2KHR</type>         <name>srcAccessMask</name></member>
             <member optional="true"><type>VkPipelineStageFlags2KHR</type>  <name>dstStageMask</name></member>
@@ -5417,7 +5459,7 @@
         </type>
         <type category="struct" name="VkImageMemoryBarrier2KHR">
             <member values="VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER_2_KHR"><type>VkStructureType</type> <name>sType</name></member>
-            <member>const <type>void</type>*                               <name>pNext</name></member>
+            <member optional="true">const <type>void</type>*                               <name>pNext</name></member>
             <member optional="true"><type>VkPipelineStageFlags2KHR</type>  <name>srcStageMask</name></member>
             <member optional="true"><type>VkAccessFlags2KHR</type>         <name>srcAccessMask</name></member>
             <member optional="true"><type>VkPipelineStageFlags2KHR</type>  <name>dstStageMask</name></member>
@@ -5431,7 +5473,7 @@
         </type>
         <type category="struct" name="VkBufferMemoryBarrier2KHR">
             <member values="VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER_2_KHR"><type>VkStructureType</type> <name>sType</name></member>
-            <member>const <type>void</type>*                               <name>pNext</name></member>
+            <member optional="true">const <type>void</type>*                               <name>pNext</name></member>
             <member optional="true"><type>VkPipelineStageFlags2KHR</type>  <name>srcStageMask</name></member>
             <member optional="true"><type>VkAccessFlags2KHR</type>         <name>srcAccessMask</name></member>
             <member optional="true"><type>VkPipelineStageFlags2KHR</type>  <name>dstStageMask</name></member>
@@ -5444,7 +5486,7 @@
         </type>
         <type category="struct" name="VkDependencyInfoKHR">
             <member values="VK_STRUCTURE_TYPE_DEPENDENCY_INFO_KHR"><type>VkStructureType</type> <name>sType</name></member>
-            <member>const <type>void</type>*                               <name>pNext</name></member>
+            <member optional="true">const <type>void</type>*                               <name>pNext</name></member>
             <member optional="true"><type>VkDependencyFlags</type>         <name>dependencyFlags</name></member>
             <member optional="true"><type>uint32_t</type>                  <name>memoryBarrierCount</name></member>
             <member len="memoryBarrierCount">const <type>VkMemoryBarrier2KHR</type>* <name>pMemoryBarriers</name></member>
@@ -5455,7 +5497,7 @@
         </type>
         <type category="struct" name="VkSemaphoreSubmitInfoKHR">
             <member values="VK_STRUCTURE_TYPE_SEMAPHORE_SUBMIT_INFO_KHR"><type>VkStructureType</type>       <name>sType</name></member>
-            <member>const <type>void</type>*                                                                <name>pNext</name></member>
+            <member optional="true">const <type>void</type>*                                                                <name>pNext</name></member>
             <member><type>VkSemaphore</type>                                                                <name>semaphore</name></member>
             <member><type>uint64_t</type>                                                                   <name>value</name></member>
             <member optional="true"><type>VkPipelineStageFlags2KHR</type>                                   <name>stageMask</name></member>
@@ -5463,13 +5505,13 @@
         </type>
         <type category="struct" name="VkCommandBufferSubmitInfoKHR">
             <member values="VK_STRUCTURE_TYPE_COMMAND_BUFFER_SUBMIT_INFO_KHR"><type>VkStructureType</type>  <name>sType</name></member>
-            <member>const <type>void</type>*                                                                <name>pNext</name></member>
+            <member optional="true">const <type>void</type>*                                                                <name>pNext</name></member>
             <member><type>VkCommandBuffer</type>                                                            <name>commandBuffer</name></member>
             <member><type>uint32_t</type>                                                                   <name>deviceMask</name></member>
         </type>
         <type category="struct" name="VkSubmitInfo2KHR">
             <member values="VK_STRUCTURE_TYPE_SUBMIT_INFO_2_KHR"><type>VkStructureType</type>               <name>sType</name></member>
-            <member>const <type>void</type>*                                                                <name>pNext</name></member>
+            <member optional="true">const <type>void</type>*                                                                <name>pNext</name></member>
             <member optional="true"><type>VkSubmitFlagsKHR</type>                                           <name>flags</name></member>
             <member optional="true"><type>uint32_t</type>                                                   <name>waitSemaphoreInfoCount</name></member>
             <member len="waitSemaphoreInfoCount">const <type>VkSemaphoreSubmitInfoKHR</type>*               <name>pWaitSemaphoreInfos</name></member>
@@ -5480,45 +5522,45 @@
         </type>
         <type category="struct" name="VkQueueFamilyCheckpointProperties2NV" structextends="VkQueueFamilyProperties2" returnedonly="true">
             <member values="VK_STRUCTURE_TYPE_QUEUE_FAMILY_CHECKPOINT_PROPERTIES_2_NV"><type>VkStructureType</type> <name>sType</name></member>
-            <member><type>void</type>*           <name>pNext</name></member>
+            <member optional="true"><type>void</type>*           <name>pNext</name></member>
             <member><type>VkPipelineStageFlags2KHR</type> <name>checkpointExecutionStageMask</name></member>
         </type>
         <type category="struct" name="VkCheckpointData2NV" returnedonly="true">
             <member values="VK_STRUCTURE_TYPE_CHECKPOINT_DATA_2_NV"><type>VkStructureType</type> <name>sType</name></member>
-            <member><type>void</type>*                  <name>pNext</name></member>
+            <member optional="true"><type>void</type>*                  <name>pNext</name></member>
             <member><type>VkPipelineStageFlags2KHR</type>   <name>stage</name></member>
             <member noautovalidity="true"><type>void</type>* <name>pCheckpointMarker</name></member>
         </type>
         <type category="struct" name="VkPhysicalDeviceSynchronization2FeaturesKHR" structextends="VkPhysicalDeviceFeatures2,VkDeviceCreateInfo">
             <member values="VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SYNCHRONIZATION_2_FEATURES_KHR"><type>VkStructureType</type> <name>sType</name></member>
-            <member noautovalidity="true"><type>void</type>*        <name>pNext</name></member>
+            <member optional="true" noautovalidity="true"><type>void</type>*        <name>pNext</name></member>
             <member><type>VkBool32</type>                           <name>synchronization2</name></member>
         </type>
         <type category="struct" name="VkVideoQueueFamilyProperties2KHR" structextends="VkQueueFamilyProperties2">
           <member values="VK_STRUCTURE_TYPE_VIDEO_QUEUE_FAMILY_PROPERTIES_2_KHR"><type>VkStructureType</type><name>sType</name></member>
-          <member><type>void</type>*                              <name>pNext</name></member>
+          <member optional="true"><type>void</type>*                              <name>pNext</name></member>
           <member><type>VkVideoCodecOperationFlagsKHR</type>      <name>videoCodecOperations</name></member>
         </type>
         <type category="struct" name="VkVideoProfilesKHR" structextends="VkFormatProperties2,VkImageCreateInfo,VkImageViewCreateInfo,VkBufferCreateInfo">
           <member values="VK_STRUCTURE_TYPE_VIDEO_PROFILES_KHR"><type>VkStructureType</type><name>sType</name></member>
-          <member><type>void</type>*                              <name>pNext</name></member>
+          <member optional="true"><type>void</type>*                              <name>pNext</name></member>
           <member><type>uint32_t</type>                           <name>profileCount</name></member>
           <member>const <type>VkVideoProfileKHR</type>*           <name>pProfiles</name></member>
         </type>
         <type category="struct" name="VkPhysicalDeviceVideoFormatInfoKHR" returnedonly="true">
           <member values="VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VIDEO_FORMAT_INFO_KHR"><type>VkStructureType</type><name>sType</name></member>
-          <member><type>void</type>*                              <name>pNext</name></member>
+          <member optional="true"><type>void</type>*                              <name>pNext</name></member>
           <member><type>VkImageUsageFlags</type>                  <name>imageUsage</name></member>
           <member>const <type>VkVideoProfilesKHR</type>*          <name>pVideoProfiles</name></member>
         </type>
         <type category="struct" name="VkVideoFormatPropertiesKHR" returnedonly="true">
           <member values="VK_STRUCTURE_TYPE_VIDEO_FORMAT_PROPERTIES_KHR"><type>VkStructureType</type><name>sType</name></member>
-          <member><type>void</type>*                              <name>pNext</name></member>
+          <member optional="true"><type>void</type>*                              <name>pNext</name></member>
           <member><type>VkFormat</type>                           <name>format</name></member>
         </type>
         <type category="struct" name="VkVideoProfileKHR" structextends="VkQueryPoolCreateInfo,VkFormatProperties2,VkImageCreateInfo,VkImageViewCreateInfo,VkBufferCreateInfo">
           <member values="VK_STRUCTURE_TYPE_VIDEO_PROFILE_KHR"><type>VkStructureType</type><name>sType</name></member>
-          <member><type>void</type>*                              <name>pNext</name></member>
+          <member optional="true"><type>void</type>*                              <name>pNext</name></member>
           <member><type>VkVideoCodecOperationFlagBitsKHR</type>   <name>videoCodecOperation</name></member>
           <member><type>VkVideoChromaSubsamplingFlagsKHR</type>   <name>chromaSubsampling</name></member>
           <member><type>VkVideoComponentBitDepthFlagsKHR</type>   <name>lumaBitDepth</name></member>
@@ -5526,8 +5568,8 @@
         </type>
         <type category="struct" name="VkVideoCapabilitiesKHR" returnedonly="true">
           <member values="VK_STRUCTURE_TYPE_VIDEO_CAPABILITIES_KHR"><type>VkStructureType</type><name>sType</name></member>
-          <member><type>void</type>*                            <name>pNext</name></member>
-          <member><type>VkVideoCapabilitiesFlagsKHR</type>      <name>capabilityFlags</name></member>
+          <member optional="true"><type>void</type>*                            <name>pNext</name></member>
+          <member><type>VkVideoCapabilityFlagsKHR</type>        <name>capabilityFlags</name></member>
           <member><type>VkDeviceSize</type>                     <name>minBitstreamBufferOffsetAlignment</name></member>
           <member><type>VkDeviceSize</type>                     <name>minBitstreamBufferSizeAlignment</name></member>
           <member><type>VkExtent2D</type>                       <name>videoPictureExtentGranularity</name></member>
@@ -5538,13 +5580,13 @@
         </type>
         <type category="struct" name="VkVideoGetMemoryPropertiesKHR">
           <member values="VK_STRUCTURE_TYPE_VIDEO_GET_MEMORY_PROPERTIES_KHR"><type>VkStructureType</type><name>sType</name></member>
-          <member>const <type>void</type>*                       <name>pNext</name></member>
+          <member optional="true">const <type>void</type>*                       <name>pNext</name></member>
           <member><type>uint32_t</type>                          <name>memoryBindIndex</name></member>
           <member><type>VkMemoryRequirements2</type>*            <name>pMemoryRequirements</name></member>
         </type>
         <type category="struct" name="VkVideoBindMemoryKHR">
           <member values="VK_STRUCTURE_TYPE_VIDEO_BIND_MEMORY_KHR"><type>VkStructureType</type><name>sType</name></member>
-          <member>const <type>void</type>*                       <name>pNext</name></member>
+          <member optional="true">const <type>void</type>*                       <name>pNext</name></member>
           <member><type>uint32_t</type>                          <name>memoryBindIndex</name></member>
           <member><type>VkDeviceMemory</type>                    <name>memory</name></member>
           <member><type>VkDeviceSize</type>                      <name>memoryOffset</name></member>
@@ -5552,7 +5594,7 @@
         </type>
         <type category="struct" name="VkVideoPictureResourceKHR">
           <member values="VK_STRUCTURE_TYPE_VIDEO_PICTURE_RESOURCE_KHR"><type>VkStructureType</type><name>sType</name></member>
-          <member>const <type>void</type>*        <name>pNext</name></member>
+          <member optional="true">const <type>void</type>*        <name>pNext</name></member>
           <member><type>VkOffset2D</type>         <name>codedOffset</name><comment>The offset to be used for the picture resource, currently only used in field mode</comment></member>
           <member><type>VkExtent2D</type>         <name>codedExtent</name><comment>The extent to be used for the picture resource</comment></member>
           <member><type>uint32_t</type>           <name>baseArrayLayer</name><comment>TThe first array layer to be accessed for the Decode or Encode Operations</comment></member>
@@ -5560,13 +5602,13 @@
         </type>
         <type category="struct" name="VkVideoReferenceSlotKHR">
           <member values="VK_STRUCTURE_TYPE_VIDEO_REFERENCE_SLOT_KHR"><type>VkStructureType</type><name>sType</name></member>
-          <member>const <type>void</type>*        <name>pNext</name></member>
+          <member optional="true">const <type>void</type>*        <name>pNext</name></member>
           <member><type>int8_t</type>             <name>slotIndex</name><comment>The reference slot index</comment></member>
           <member>const <type>VkVideoPictureResourceKHR</type>* <name>pPictureResource</name><comment>The reference picture resource</comment></member>
         </type>
         <type category="struct" name="VkVideoDecodeInfoKHR">
           <member values="VK_STRUCTURE_TYPE_VIDEO_DECODE_INFO_KHR"><type>VkStructureType</type><name>sType</name></member>
-          <member>const <type>void</type>*                            <name>pNext</name></member>
+          <member optional="true">const <type>void</type>*                            <name>pNext</name></member>
           <member optional="true"><type>VkVideoDecodeFlagsKHR</type>  <name>flags</name></member>
           <member><type>VkOffset2D</type>                             <name>codedOffset</name></member>
           <member><type>VkExtent2D</type>                             <name>codedExtent</name></member>
@@ -5608,20 +5650,20 @@
         <type requires="vk_video/vulkan_video_codec_h264std_decode.h" name="StdVideoDecodeH264MvcElementFlags"/>
         <type category="struct" name="VkVideoDecodeH264ProfileEXT" structextends="VkVideoProfileKHR">
           <member values="VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_PROFILE_EXT"><type>VkStructureType</type><name>sType</name></member>
-          <member>const <type>void</type>*                          <name>pNext</name></member>
-          <member><type>StdVideoH264ProfileIdc</type>               <name>stdProfileIdc</name></member>
-          <member><type>VkVideoDecodeH264FieldLayoutFlagsEXT</type> <name>fieldLayout</name></member>
+          <member optional="true">const <type>void</type>*                            <name>pNext</name></member>
+          <member><type>StdVideoH264ProfileIdc</type>                 <name>stdProfileIdc</name></member>
+          <member><type>VkVideoDecodeH264PictureLayoutFlagsEXT</type> <name>pictureLayout</name></member>
         </type>
         <type category="struct" name="VkVideoDecodeH264CapabilitiesEXT" returnedonly="true" structextends="VkVideoCapabilitiesKHR">
           <member values="VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_CAPABILITIES_EXT"><type>VkStructureType</type><name>sType</name></member>
-          <member><type>void</type>*                            <name>pNext</name></member>
+          <member optional="true"><type>void</type>*                            <name>pNext</name></member>
           <member><type>uint32_t</type>                         <name>maxLevel</name></member>
           <member><type>VkOffset2D</type>                       <name>fieldOffsetGranularity</name></member>
           <member><type>VkExtensionProperties</type>            <name>stdExtensionVersion</name></member>
         </type>
         <type category="struct" name="VkVideoDecodeH264SessionCreateInfoEXT" structextends="VkVideoSessionCreateInfoKHR">
           <member values="VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_SESSION_CREATE_INFO_EXT"><type>VkStructureType</type><name>sType</name></member>
-          <member>const <type>void</type>*                      <name>pNext</name></member>
+          <member optional="true">const <type>void</type>*                      <name>pNext</name></member>
           <member><type>VkVideoDecodeH264CreateFlagsEXT</type>  <name>flags</name></member>
           <member>const <type>VkExtensionProperties</type>*     <name>pStdExtensionVersion</name></member>
         </type>
@@ -5629,7 +5671,7 @@
         <type requires="vk_video/vulkan_video_codec_h264std.h" name="StdVideoH264PictureParameterSet"/>
         <type category="struct" name="VkVideoDecodeH264SessionParametersAddInfoEXT" structextends="VkVideoSessionParametersUpdateInfoKHR">
           <member values="VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_SESSION_PARAMETERS_ADD_INFO_EXT"><type>VkStructureType</type><name>sType</name></member>
-          <member>const <type>void</type>*                                                               <name>pNext</name></member>
+          <member optional="true">const <type>void</type>*                                                               <name>pNext</name></member>
           <member><type>uint32_t</type>                                                                  <name>spsStdCount</name></member>
           <member len="spsStdCount" optional="true">const <type>StdVideoH264SequenceParameterSet</type>* <name>pSpsStd</name></member>
           <member><type>uint32_t</type>                                                                  <name>ppsStdCount</name></member>
@@ -5637,26 +5679,26 @@
         </type>
         <type category="struct" name="VkVideoDecodeH264SessionParametersCreateInfoEXT" structextends="VkVideoSessionParametersCreateInfoKHR">
           <member values="VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_SESSION_PARAMETERS_CREATE_INFO_EXT"><type>VkStructureType</type><name>sType</name></member>
-          <member>const <type>void</type>*                                                               <name>pNext</name></member>
+          <member optional="true">const <type>void</type>*                                                               <name>pNext</name></member>
           <member><type>uint32_t</type>                                                                  <name>maxSpsStdCount</name></member>
           <member><type>uint32_t</type>                                                                  <name>maxPpsStdCount</name></member>
           <member optional="true">const <type>VkVideoDecodeH264SessionParametersAddInfoEXT</type>*       <name>pParametersAddInfo</name></member>
         </type>
         <type category="struct" name="VkVideoDecodeH264PictureInfoEXT" structextends="VkVideoDecodeInfoKHR">
           <member values="VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_PICTURE_INFO_EXT"><type>VkStructureType</type><name>sType</name></member>
-          <member noautovalidity="true">const <type>void</type>*     <name>pNext</name></member>
+          <member optional="true" noautovalidity="true">const <type>void</type>*     <name>pNext</name></member>
           <member>const <type>StdVideoDecodeH264PictureInfo</type>*  <name>pStdPictureInfo</name></member>
           <member><type>uint32_t</type>                              <name>slicesCount</name></member>
           <member len="slicesCount">const <type>uint32_t</type>*     <name>pSlicesDataOffsets</name></member>
         </type>
         <type category="struct" name="VkVideoDecodeH264DpbSlotInfoEXT" structextends="VkVideoReferenceSlotKHR">
           <member values="VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_DPB_SLOT_INFO_EXT"><type>VkStructureType</type><name>sType</name></member>
-          <member>const <type>void</type>*                            <name>pNext</name></member>
+          <member optional="true">const <type>void</type>*                            <name>pNext</name></member>
           <member>const <type>StdVideoDecodeH264ReferenceInfo</type>* <name>pStdReferenceInfo</name></member>
         </type>
         <type category="struct" name="VkVideoDecodeH264MvcEXT" structextends="VkVideoDecodeH264PictureInfoEXT">
           <member values="VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_MVC_EXT"><type>VkStructureType</type><name>sType</name></member>
-          <member noautovalidity="true">const <type>void</type>*<name>pNext</name></member>
+          <member optional="true" noautovalidity="true">const <type>void</type>*<name>pNext</name></member>
           <member>const <type>StdVideoDecodeH264Mvc</type>*   <name>pStdMvc</name></member>
         </type>
         <type category="include" name="vk_video/vulkan_video_codec_h265std.h">#include "vk_video/vulkan_video_codec_h265std.h"</type>
@@ -5683,24 +5725,24 @@
         <type requires="vk_video/vulkan_video_codec_h265std_decode.h" name="StdVideoDecodeH265ReferenceInfoFlags"/>
         <type category="struct" name="VkVideoDecodeH265ProfileEXT" structextends="VkVideoProfileKHR">
           <member values="VK_STRUCTURE_TYPE_VIDEO_DECODE_H265_PROFILE_EXT"><type>VkStructureType</type><name>sType</name></member>
-          <member>const <type>void</type>*                    <name>pNext</name></member>
+          <member optional="true">const <type>void</type>*                    <name>pNext</name></member>
           <member><type>StdVideoH265ProfileIdc</type>         <name>stdProfileIdc</name></member>
         </type>
         <type category="struct" name="VkVideoDecodeH265CapabilitiesEXT" returnedonly="true" structextends="VkVideoCapabilitiesKHR">
           <member values="VK_STRUCTURE_TYPE_VIDEO_DECODE_H265_CAPABILITIES_EXT"><type>VkStructureType</type><name>sType</name></member>
-          <member><type>void</type>*                            <name>pNext</name></member>
+          <member optional="true"><type>void</type>*                            <name>pNext</name></member>
           <member><type>uint32_t</type>                         <name>maxLevel</name></member>
           <member><type>VkExtensionProperties</type>            <name>stdExtensionVersion</name></member>
         </type>
         <type category="struct" name="VkVideoDecodeH265SessionCreateInfoEXT" structextends="VkVideoSessionCreateInfoKHR">
           <member values="VK_STRUCTURE_TYPE_VIDEO_DECODE_H265_SESSION_CREATE_INFO_EXT"><type>VkStructureType</type><name>sType</name></member>
-          <member>const <type>void</type>*                      <name>pNext</name></member>
+          <member optional="true">const <type>void</type>*                      <name>pNext</name></member>
           <member><type>VkVideoDecodeH265CreateFlagsEXT</type>  <name>flags</name></member>
           <member>const <type>VkExtensionProperties</type>*     <name>pStdExtensionVersion</name></member>
         </type>
         <type category="struct" name="VkVideoDecodeH265SessionParametersAddInfoEXT" structextends="VkVideoSessionParametersUpdateInfoKHR">
           <member values="VK_STRUCTURE_TYPE_VIDEO_DECODE_H265_SESSION_PARAMETERS_ADD_INFO_EXT"><type>VkStructureType</type><name>sType</name></member>
-          <member>const <type>void</type>*                                                               <name>pNext</name></member>
+          <member optional="true">const <type>void</type>*                                                               <name>pNext</name></member>
           <member><type>uint32_t</type>                                                                  <name>spsStdCount</name></member>
           <member len="spsStdCount" optional="true">const <type>StdVideoH265SequenceParameterSet</type>* <name>pSpsStd</name></member>
           <member><type>uint32_t</type>                                                                  <name>ppsStdCount</name></member>
@@ -5708,26 +5750,26 @@
         </type>
         <type category="struct" name="VkVideoDecodeH265SessionParametersCreateInfoEXT" structextends="VkVideoSessionParametersCreateInfoKHR">
           <member values="VK_STRUCTURE_TYPE_VIDEO_DECODE_H265_SESSION_PARAMETERS_CREATE_INFO_EXT"><type>VkStructureType</type><name>sType</name></member>
-          <member>const <type>void</type>*                                                         <name>pNext</name></member>
+          <member optional="true">const <type>void</type>*                                                         <name>pNext</name></member>
           <member><type>uint32_t</type>                                                            <name>maxSpsStdCount</name></member>
           <member><type>uint32_t</type>                                                            <name>maxPpsStdCount</name></member>
           <member optional="true">const <type>VkVideoDecodeH265SessionParametersAddInfoEXT</type>* <name>pParametersAddInfo</name></member>
         </type>
         <type category="struct" name="VkVideoDecodeH265PictureInfoEXT" structextends="VkVideoDecodeInfoKHR">
           <member values="VK_STRUCTURE_TYPE_VIDEO_DECODE_H265_PICTURE_INFO_EXT"><type>VkStructureType</type><name>sType</name></member>
-          <member>const <type>void</type>*                        <name>pNext</name></member>
+          <member optional="true">const <type>void</type>*                        <name>pNext</name></member>
           <member><type>StdVideoDecodeH265PictureInfo</type>*     <name>pStdPictureInfo</name></member>
           <member><type>uint32_t</type>                           <name>slicesCount</name></member>
           <member len="slicesCount">const <type>uint32_t</type>*  <name>pSlicesDataOffsets</name></member>
         </type>
         <type category="struct" name="VkVideoDecodeH265DpbSlotInfoEXT" structextends="VkVideoReferenceSlotKHR">
           <member values="VK_STRUCTURE_TYPE_VIDEO_DECODE_H265_DPB_SLOT_INFO_EXT"><type>VkStructureType</type><name>sType</name></member>
-          <member>const <type>void</type>*                             <name>pNext</name></member>
+          <member optional="true">const <type>void</type>*                             <name>pNext</name></member>
           <member>const <type>StdVideoDecodeH265ReferenceInfo</type>*  <name>pStdReferenceInfo</name></member>
         </type>
         <type category="struct" name="VkVideoSessionCreateInfoKHR">
           <member values="VK_STRUCTURE_TYPE_VIDEO_SESSION_CREATE_INFO_KHR"><type>VkStructureType</type><name>sType</name></member>
-          <member>const <type>void</type>*                                   <name>pNext</name></member>
+          <member optional="true">const <type>void</type>*                                   <name>pNext</name></member>
           <member><type>uint32_t</type>                                      <name>queueFamilyIndex</name></member>
           <member optional="true"><type>VkVideoSessionCreateFlagsKHR</type>  <name>flags</name></member>
           <member>const <type>VkVideoProfileKHR</type>*                      <name>pVideoProfile</name></member>
@@ -5739,18 +5781,18 @@
         </type>
         <type category="struct" name="VkVideoSessionParametersCreateInfoKHR">
           <member values="VK_STRUCTURE_TYPE_VIDEO_SESSION_PARAMETERS_CREATE_INFO_KHR"><type>VkStructureType</type><name>sType</name></member>
-          <member>const <type>void</type>*                                            <name>pNext</name></member>
+          <member optional="true">const <type>void</type>*                                            <name>pNext</name></member>
           <member><type>VkVideoSessionParametersKHR</type>                            <name>videoSessionParametersTemplate</name></member>
           <member><type>VkVideoSessionKHR</type>                                      <name>videoSession</name></member>
         </type>
         <type category="struct" name="VkVideoSessionParametersUpdateInfoKHR">
           <member values="VK_STRUCTURE_TYPE_VIDEO_SESSION_PARAMETERS_UPDATE_INFO_KHR"><type>VkStructureType</type><name>sType</name></member>
-          <member>const <type>void</type>*                                            <name>pNext</name></member>
+          <member optional="true">const <type>void</type>*                                            <name>pNext</name></member>
           <member><type>uint32_t</type>                                               <name>updateSequenceCount</name></member>
         </type>
         <type category="struct" name="VkVideoBeginCodingInfoKHR">
           <member values="VK_STRUCTURE_TYPE_VIDEO_BEGIN_CODING_INFO_KHR"><type>VkStructureType</type><name>sType</name></member>
-          <member>const <type>void</type>*                                             <name>pNext</name></member>
+          <member optional="true">const <type>void</type>*                                             <name>pNext</name></member>
           <member optional="true"><type>VkVideoBeginCodingFlagsKHR</type>              <name>flags</name></member>
           <member><type>VkVideoCodingQualityPresetFlagsKHR</type>                      <name>codecQualityPreset</name></member>
           <member><type>VkVideoSessionKHR</type>                                       <name>videoSession</name></member>
@@ -5760,12 +5802,12 @@
         </type>
         <type category="struct" name="VkVideoEndCodingInfoKHR">
           <member values="VK_STRUCTURE_TYPE_VIDEO_END_CODING_INFO_KHR"><type>VkStructureType</type><name>sType</name></member>
-          <member>const <type>void</type>*                              <name>pNext</name></member>
+          <member optional="true">const <type>void</type>*                              <name>pNext</name></member>
           <member optional="true"><type>VkVideoEndCodingFlagsKHR</type> <name>flags</name></member>
         </type>
         <type category="struct" name="VkVideoCodingControlInfoKHR">
           <member values="VK_STRUCTURE_TYPE_VIDEO_CODING_CONTROL_INFO_KHR"><type>VkStructureType</type><name>sType</name></member>
-          <member>const <type>void</type>*                                  <name>pNext</name></member>
+          <member optional="true">const <type>void</type>*                                  <name>pNext</name></member>
           <member optional="true"><type>VkVideoCodingControlFlagsKHR</type> <name>flags</name></member>
         </type>
         <type category="struct" name="VkVideoEncodeInfoKHR">
@@ -5784,7 +5826,7 @@
         </type>
         <type category="struct" name="VkVideoEncodeRateControlInfoKHR" structextends="VkVideoCodingControlInfoKHR">
           <member values="VK_STRUCTURE_TYPE_VIDEO_ENCODE_RATE_CONTROL_INFO_KHR"><type>VkStructureType</type><name>sType</name></member>
-          <member>const <type>void</type>*                              <name>pNext</name></member>
+          <member optional="true">const <type>void</type>*                              <name>pNext</name></member>
           <member><type>VkVideoEncodeRateControlFlagsKHR</type>         <name>flags</name></member>
           <member><type>VkVideoEncodeRateControlModeFlagBitsKHR</type>  <name>rateControlMode</name></member>
           <member><type>uint32_t</type>                                 <name>averageBitrate</name></member>
@@ -5795,8 +5837,8 @@
         </type>
         <type category="struct" name="VkVideoEncodeH264CapabilitiesEXT" structextends="VkVideoCapabilitiesKHR">
           <member values="VK_STRUCTURE_TYPE_VIDEO_ENCODE_H264_CAPABILITIES_EXT"><type>VkStructureType</type><name>sType</name></member>
-          <member>const <type>void</type>*                           <name>pNext</name></member>
-          <member><type>VkVideoEncodeH264CapabilitiesFlagsEXT</type> <name>flags</name></member>
+          <member optional="true">const <type>void</type>*                           <name>pNext</name></member>
+          <member><type>VkVideoEncodeH264CapabilityFlagsEXT</type>   <name>flags</name></member>
           <member><type>VkVideoEncodeH264InputModeFlagsEXT</type>    <name>inputModeFlags</name></member>
           <member><type>VkVideoEncodeH264OutputModeFlagsEXT</type>   <name>outputModeFlags</name></member>
           <member><type>VkExtent2D</type>                            <name>minPictureSizeInMbs</name></member>
@@ -5810,7 +5852,7 @@
         </type>
         <type category="struct" name="VkVideoEncodeH264SessionCreateInfoEXT" structextends="VkVideoSessionCreateInfoKHR">
           <member values="VK_STRUCTURE_TYPE_VIDEO_ENCODE_H264_SESSION_CREATE_INFO_EXT"><type>VkStructureType</type><name>sType</name></member>
-          <member>const <type>void</type>*                     <name>pNext</name></member>
+          <member optional="true">const <type>void</type>*                     <name>pNext</name></member>
           <member><type>VkVideoEncodeH264CreateFlagsEXT</type> <name>flags</name></member>
           <member><type>VkExtent2D</type>                      <name>maxPictureSizeInMbs</name></member>
           <member>const <type>VkExtensionProperties</type>*    <name>pStdExtensionVersion</name></member>
@@ -5826,7 +5868,7 @@
         <type requires="vk_video/vulkan_video_codec_h264std_encode.h" name="StdVideoEncodeH264RefPicMarkingEntry"/>
         <type category="struct" name="VkVideoEncodeH264SessionParametersAddInfoEXT" structextends="VkVideoSessionParametersUpdateInfoKHR">
           <member values="VK_STRUCTURE_TYPE_VIDEO_ENCODE_H264_SESSION_PARAMETERS_ADD_INFO_EXT"><type>VkStructureType</type><name>sType</name></member>
-          <member>const <type>void</type>*                                                               <name>pNext</name></member>
+          <member optional="true">const <type>void</type>*                                                               <name>pNext</name></member>
           <member><type>uint32_t</type>                                                                  <name>spsStdCount</name></member>
           <member len="spsStdCount" optional="true">const <type>StdVideoH264SequenceParameterSet</type>* <name>pSpsStd</name></member>
           <member><type>uint32_t</type>                                                                  <name>ppsStdCount</name></member>
@@ -5834,20 +5876,20 @@
         </type>
         <type category="struct" name="VkVideoEncodeH264SessionParametersCreateInfoEXT" structextends="VkVideoSessionParametersCreateInfoKHR">
           <member values="VK_STRUCTURE_TYPE_VIDEO_ENCODE_H264_SESSION_PARAMETERS_CREATE_INFO_EXT"><type>VkStructureType</type><name>sType</name></member>
-          <member>const <type>void</type>*                                                         <name>pNext</name></member>
+          <member optional="true">const <type>void</type>*                                                         <name>pNext</name></member>
           <member><type>uint32_t</type>                                                            <name>maxSpsStdCount</name></member>
           <member><type>uint32_t</type>                                                            <name>maxPpsStdCount</name></member>
           <member optional="true">const <type>VkVideoEncodeH264SessionParametersAddInfoEXT</type>* <name>pParametersAddInfo</name></member>
         </type>
         <type category="struct" name="VkVideoEncodeH264DpbSlotInfoEXT">
           <member values="VK_STRUCTURE_TYPE_VIDEO_ENCODE_H264_DPB_SLOT_INFO_EXT"><type>VkStructureType</type><name>sType</name></member>
-          <member>const <type>void</type>*                                                          <name>pNext</name></member>
+          <member optional="true">const <type>void</type>*                                                          <name>pNext</name></member>
           <member><type>int8_t</type>                                                               <name>slotIndex</name></member>
           <member>const <type>StdVideoEncodeH264PictureInfo</type>*                                 <name>pStdPictureInfo</name></member>
         </type>
         <type category="struct" name="VkVideoEncodeH264VclFrameInfoEXT" structextends="VkVideoEncodeInfoKHR">
           <member values="VK_STRUCTURE_TYPE_VIDEO_ENCODE_H264_VCL_FRAME_INFO_EXT"><type>VkStructureType</type><name>sType</name></member>
-          <member>const <type>void</type>*                                                          <name>pNext</name></member>
+          <member optional="true">const <type>void</type>*                                                          <name>pNext</name></member>
           <member><type>uint8_t</type>                                                              <name>refDefaultFinalList0EntryCount</name></member>
           <member len="refDefaultFinalList0EntryCount">const <type>VkVideoEncodeH264DpbSlotInfoEXT</type>* <name>pRefDefaultFinalList0Entries</name></member>
           <member><type>uint8_t</type>                                                              <name>refDefaultFinalList1EntryCount</name></member>
@@ -5858,7 +5900,7 @@
         </type>
         <type category="struct" name="VkVideoEncodeH264EmitPictureParametersEXT" structextends="VkVideoEncodeInfoKHR">
           <member values="VK_STRUCTURE_TYPE_VIDEO_ENCODE_H264_EMIT_PICTURE_PARAMETERS_EXT"><type>VkStructureType</type><name>sType</name></member>
-          <member>const <type>void</type>*                             <name>pNext</name></member>
+          <member optional="true">const <type>void</type>*                             <name>pNext</name></member>
           <member><type>uint8_t</type>                                 <name>spsId</name></member>
           <member><type>VkBool32</type>                                <name>emitSpsEnable</name></member>
           <member><type>uint32_t</type>                                <name>ppsIdEntryCount</name></member>
@@ -5866,12 +5908,12 @@
         </type>
         <type category="struct" name="VkVideoEncodeH264ProfileEXT" structextends="VkVideoProfileKHR">
           <member values="VK_STRUCTURE_TYPE_VIDEO_ENCODE_H264_PROFILE_EXT"><type>VkStructureType</type><name>sType</name></member>
-          <member>const <type>void</type>*                    <name>pNext</name></member>
+          <member optional="true">const <type>void</type>*                    <name>pNext</name></member>
           <member><type>StdVideoH264ProfileIdc</type>         <name>stdProfileIdc</name></member>
         </type>
         <type category="struct" name="VkVideoEncodeH264NaluSliceEXT">
           <member values="VK_STRUCTURE_TYPE_VIDEO_ENCODE_H264_NALU_SLICE_EXT"><type>VkStructureType</type><name>sType</name></member>
-          <member>const <type>void</type>*                                     <name>pNext</name></member>
+          <member optional="true">const <type>void</type>*                                     <name>pNext</name></member>
           <member>const <type>StdVideoEncodeH264SliceHeader</type>*            <name>pSliceHeaderStd</name></member>
           <member><type>uint32_t</type>                                        <name>mbCount</name></member>
           <member><type>uint8_t</type>                                         <name>refFinalList0EntryCount</name></member>
@@ -5884,12 +5926,12 @@
         </type>
         <type category="struct" name="VkPhysicalDeviceInheritedViewportScissorFeaturesNV" structextends="VkPhysicalDeviceFeatures2,VkDeviceCreateInfo">
           <member values="VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_INHERITED_VIEWPORT_SCISSOR_FEATURES_NV"><type>VkStructureType</type> <name>sType</name></member>
-          <member><type>void</type>*                               <name>pNext</name></member>
+          <member optional="true"><type>void</type>*                               <name>pNext</name></member>
           <member><type>VkBool32</type>                            <name>inheritedViewportScissor2D</name></member>
         </type>
         <type category="struct" name="VkCommandBufferInheritanceViewportScissorInfoNV" structextends="VkCommandBufferInheritanceInfo">
           <member values="VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_VIEWPORT_SCISSOR_INFO_NV"><type>VkStructureType</type> <name>sType</name></member>
-          <member>const <type>void</type>*                                    <name>pNext</name></member>
+          <member optional="true">const <type>void</type>*                                    <name>pNext</name></member>
           <member><type>VkBool32</type>                                       <name>viewportScissor2D</name></member>
           <member><type>uint32_t</type>                                       <name>viewportDepthCount</name></member>
           <member noautovalidity="true">const <type>VkViewport</type>*        <name>pViewportDepths</name></member>
@@ -5901,36 +5943,36 @@
         </type>
         <type category="struct" name="VkPhysicalDeviceProvokingVertexFeaturesEXT" structextends="VkPhysicalDeviceFeatures2,VkDeviceCreateInfo">
             <member values="VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROVOKING_VERTEX_FEATURES_EXT"><type>VkStructureType</type> <name>sType</name></member>
-            <member noautovalidity="true"><type>void</type>*        <name>pNext</name></member>
+            <member optional="true" noautovalidity="true"><type>void</type>*        <name>pNext</name></member>
             <member><type>VkBool32</type>                           <name>provokingVertexLast</name></member>
             <member><type>VkBool32</type>                           <name>transformFeedbackPreservesProvokingVertex</name></member>
         </type>
         <type category="struct" name="VkPhysicalDeviceProvokingVertexPropertiesEXT" returnedonly="true" structextends="VkPhysicalDeviceProperties2">
             <member values="VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROVOKING_VERTEX_PROPERTIES_EXT"><type>VkStructureType</type> <name>sType</name></member>
-            <member><type>void</type>*                               <name>pNext</name></member>
-            <member><type>VkBool32</type>                            <name>provokingVertexModePerPipeline</name></member>
-            <member><type>VkBool32</type>                            <name>transformFeedbackPreservesTriangleFanProvokingVertex</name></member>
+            <member optional="true"><type>void</type>*                               <name>pNext</name></member>
+            <member limittype="bitmask"><type>VkBool32</type>                            <name>provokingVertexModePerPipeline</name></member>
+            <member limittype="bitmask"><type>VkBool32</type>                            <name>transformFeedbackPreservesTriangleFanProvokingVertex</name></member>
         </type>
         <type category="struct" name="VkPipelineRasterizationProvokingVertexStateCreateInfoEXT" structextends="VkPipelineRasterizationStateCreateInfo">
             <member values="VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_PROVOKING_VERTEX_STATE_CREATE_INFO_EXT"><type>VkStructureType</type> <name>sType</name></member>
-            <member>const <type>void</type>*                        <name>pNext</name></member>
+            <member optional="true">const <type>void</type>*                        <name>pNext</name></member>
             <member><type>VkProvokingVertexModeEXT</type>           <name>provokingVertexMode</name></member>
         </type>
         <type category="struct" name="VkCuModuleCreateInfoNVX">
             <member values="VK_STRUCTURE_TYPE_CU_MODULE_CREATE_INFO_NVX"><type>VkStructureType</type> <name>sType</name></member>
-            <member>const <type>void</type>*            <name>pNext</name></member>
+            <member optional="true">const <type>void</type>*            <name>pNext</name></member>
             <member><type>size_t</type>                 <name>dataSize</name></member>
             <member>const <type>void</type>*            <name>pData</name></member>
         </type>
         <type category="struct" name="VkCuFunctionCreateInfoNVX">
             <member values="VK_STRUCTURE_TYPE_CU_FUNCTION_CREATE_INFO_NVX"><type>VkStructureType</type> <name>sType</name></member>
-            <member>const <type>void</type>*                        <name>pNext</name></member>
+            <member optional="true">const <type>void</type>*                        <name>pNext</name></member>
             <member><type>VkCuModuleNVX</type>                      <name>module</name></member>
             <member len="null-terminated">const <type>char</type>*  <name>pName</name></member>
         </type>
         <type category="struct" name="VkCuLaunchInfoNVX">
             <member values="VK_STRUCTURE_TYPE_CU_LAUNCH_INFO_NVX"><type>VkStructureType</type> <name>sType</name></member>
-            <member>const <type>void</type>*            <name>pNext</name></member>
+            <member optional="true">const <type>void</type>*            <name>pNext</name></member>
             <member><type>VkCuFunctionNVX</type>        <name>function</name></member>
             <member><type>uint32_t</type>               <name>gridDimX</name></member>
             <member><type>uint32_t</type>               <name>gridDimY</name></member>
@@ -5944,19 +5986,58 @@
             <member><type>size_t</type>                 <name>extraCount</name></member>
             <member len="extraCount">const <type>void</type>* const *    <name>pExtras</name></member>
         </type>
+        <type category="struct" name="VkPhysicalDeviceShaderIntegerDotProductFeaturesKHR" structextends="VkPhysicalDeviceFeatures2,VkDeviceCreateInfo">
+            <member values="VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_INTEGER_DOT_PRODUCT_FEATURES_KHR"><type>VkStructureType</type> <name>sType</name></member>
+            <member optional="true"><type>void</type>*               <name>pNext</name></member>
+            <member><type>VkBool32</type>                            <name>shaderIntegerDotProduct</name></member>
+        </type>
+        <type category="struct" name="VkPhysicalDeviceShaderIntegerDotProductPropertiesKHR" structextends="VkPhysicalDeviceProperties2">
+            <member values="VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_INTEGER_DOT_PRODUCT_PROPERTIES_KHR"><type>VkStructureType</type> <name>sType</name></member>
+            <member optional="true"><type>void</type>*               <name>pNext</name></member>
+            <member limittype="bitmask"><type>VkBool32</type>        <name>integerDotProduct8BitUnsignedAccelerated</name></member>
+            <member limittype="bitmask"><type>VkBool32</type>        <name>integerDotProduct8BitSignedAccelerated</name></member>
+            <member limittype="bitmask"><type>VkBool32</type>        <name>integerDotProduct8BitMixedSignednessAccelerated</name></member>
+            <member limittype="bitmask"><type>VkBool32</type>        <name>integerDotProduct4x8BitPackedUnsignedAccelerated</name></member>
+            <member limittype="bitmask"><type>VkBool32</type>        <name>integerDotProduct4x8BitPackedSignedAccelerated</name></member>
+            <member limittype="bitmask"><type>VkBool32</type>        <name>integerDotProduct4x8BitPackedMixedSignednessAccelerated</name></member>
+            <member limittype="bitmask"><type>VkBool32</type>        <name>integerDotProduct16BitUnsignedAccelerated</name></member>
+            <member limittype="bitmask"><type>VkBool32</type>        <name>integerDotProduct16BitSignedAccelerated</name></member>
+            <member limittype="bitmask"><type>VkBool32</type>        <name>integerDotProduct16BitMixedSignednessAccelerated</name></member>
+            <member limittype="bitmask"><type>VkBool32</type>        <name>integerDotProduct32BitUnsignedAccelerated</name></member>
+            <member limittype="bitmask"><type>VkBool32</type>        <name>integerDotProduct32BitSignedAccelerated</name></member>
+            <member limittype="bitmask"><type>VkBool32</type>        <name>integerDotProduct32BitMixedSignednessAccelerated</name></member>
+            <member limittype="bitmask"><type>VkBool32</type>        <name>integerDotProduct64BitUnsignedAccelerated</name></member>
+            <member limittype="bitmask"><type>VkBool32</type>        <name>integerDotProduct64BitSignedAccelerated</name></member>
+            <member limittype="bitmask"><type>VkBool32</type>        <name>integerDotProduct64BitMixedSignednessAccelerated</name></member>
+            <member limittype="bitmask"><type>VkBool32</type>        <name>integerDotProductAccumulatingSaturating8BitUnsignedAccelerated</name></member>
+            <member limittype="bitmask"><type>VkBool32</type>        <name>integerDotProductAccumulatingSaturating8BitSignedAccelerated</name></member>
+            <member limittype="bitmask"><type>VkBool32</type>        <name>integerDotProductAccumulatingSaturating8BitMixedSignednessAccelerated</name></member>
+            <member limittype="bitmask"><type>VkBool32</type>        <name>integerDotProductAccumulatingSaturating4x8BitPackedUnsignedAccelerated</name></member>
+            <member limittype="bitmask"><type>VkBool32</type>        <name>integerDotProductAccumulatingSaturating4x8BitPackedSignedAccelerated</name></member>
+            <member limittype="bitmask"><type>VkBool32</type>        <name>integerDotProductAccumulatingSaturating4x8BitPackedMixedSignednessAccelerated</name></member>
+            <member limittype="bitmask"><type>VkBool32</type>        <name>integerDotProductAccumulatingSaturating16BitUnsignedAccelerated</name></member>
+            <member limittype="bitmask"><type>VkBool32</type>        <name>integerDotProductAccumulatingSaturating16BitSignedAccelerated</name></member>
+            <member limittype="bitmask"><type>VkBool32</type>        <name>integerDotProductAccumulatingSaturating16BitMixedSignednessAccelerated</name></member>
+            <member limittype="bitmask"><type>VkBool32</type>        <name>integerDotProductAccumulatingSaturating32BitUnsignedAccelerated</name></member>
+            <member limittype="bitmask"><type>VkBool32</type>        <name>integerDotProductAccumulatingSaturating32BitSignedAccelerated</name></member>
+            <member limittype="bitmask"><type>VkBool32</type>        <name>integerDotProductAccumulatingSaturating32BitMixedSignednessAccelerated</name></member>
+            <member limittype="bitmask"><type>VkBool32</type>        <name>integerDotProductAccumulatingSaturating64BitUnsignedAccelerated</name></member>
+            <member limittype="bitmask"><type>VkBool32</type>        <name>integerDotProductAccumulatingSaturating64BitSignedAccelerated</name></member>
+            <member limittype="bitmask"><type>VkBool32</type>        <name>integerDotProductAccumulatingSaturating64BitMixedSignednessAccelerated</name></member>
+        </type>
         <type category="struct" name="VkPhysicalDeviceDrmPropertiesEXT" returnedonly="true" structextends="VkPhysicalDeviceProperties2">
             <member values="VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DRM_PROPERTIES_EXT"><type>VkStructureType</type> <name>sType</name></member>
-            <member><type>void</type>* <name>pNext</name></member>
-            <member><type>VkBool32</type> <name>hasPrimary</name></member>
-            <member><type>VkBool32</type> <name>hasRender</name></member>
-            <member><type>int64_t</type> <name>primaryMajor</name></member>
-            <member><type>int64_t</type> <name>primaryMinor</name></member>
-            <member><type>int64_t</type> <name>renderMajor</name></member>
-            <member><type>int64_t</type> <name>renderMinor</name></member>
+            <member optional="true"><type>void</type>* <name>pNext</name></member>
+            <member limittype="bitmask"><type>VkBool32</type> <name>hasPrimary</name></member>
+            <member limittype="bitmask"><type>VkBool32</type> <name>hasRender</name></member>
+            <member limittype="noauto"><type>int64_t</type> <name>primaryMajor</name></member>
+            <member limittype="noauto"><type>int64_t</type> <name>primaryMinor</name></member>
+            <member limittype="noauto"><type>int64_t</type> <name>renderMajor</name></member>
+            <member limittype="noauto"><type>int64_t</type> <name>renderMinor</name></member>
         </type>
         <type category="struct" name="VkPhysicalDeviceRayTracingMotionBlurFeaturesNV" structextends="VkPhysicalDeviceFeatures2,VkDeviceCreateInfo">
             <member values="VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_TRACING_MOTION_BLUR_FEATURES_NV"><type>VkStructureType</type> <name>sType</name></member>
-            <member noautovalidity="true"><type>void</type>*        <name>pNext</name></member>
+            <member optional="true" noautovalidity="true"><type>void</type>*        <name>pNext</name></member>
             <member><type>VkBool32</type>                           <name>rayTracingMotionBlur</name></member>
             <member><type>VkBool32</type>                           <name>rayTracingMotionBlurPipelineTraceRaysIndirect</name></member>
         </type>
@@ -6155,7 +6236,8 @@
     <enums name="VkPipelineCacheHeaderVersion" type="enum">
         <enum value="1"     name="VK_PIPELINE_CACHE_HEADER_VERSION_ONE"/>
     </enums>
-    <enums name="VkPipelineCacheCreateFlagBits" type="bitmask"></enums>
+    <enums name="VkPipelineCacheCreateFlagBits" type="bitmask">
+    </enums>
     <enums name="VkPrimitiveTopology" type="enum">
         <enum value="0"     name="VK_PRIMITIVE_TOPOLOGY_POINT_LIST"/>
         <enum value="1"     name="VK_PRIMITIVE_TOPOLOGY_LINE_LIST"/>
@@ -6614,8 +6696,10 @@
         <enum bitpos="1"    name="VK_CULL_MODE_BACK_BIT"/>
         <enum value="0x00000003" name="VK_CULL_MODE_FRONT_AND_BACK"/>
     </enums>
-    <enums name="VkRenderPassCreateFlagBits" type="bitmask"></enums>
-    <enums name="VkDeviceQueueCreateFlagBits" type="bitmask"></enums>
+    <enums name="VkRenderPassCreateFlagBits" type="bitmask">
+    </enums>
+    <enums name="VkDeviceQueueCreateFlagBits" type="bitmask">
+    </enums>
     <enums name="VkMemoryPropertyFlagBits" type="bitmask">
         <enum bitpos="0"    name="VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT"               comment="If otherwise stated, then allocate memory on device"/>
         <enum bitpos="1"    name="VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT"               comment="Memory is mappable by host"/>
@@ -6708,7 +6792,8 @@
     <enums name="VkFenceCreateFlagBits" type="bitmask">
         <enum bitpos="0"    name="VK_FENCE_CREATE_SIGNALED_BIT"/>
     </enums>
-        <comment>When VkSemaphoreCreateFlagBits is first extended, need to add a bitmask enums tag for it here</comment>
+    <enums name="VkSemaphoreCreateFlagBits" type="bitmask">
+    </enums>
     <enums name="VkFormatFeatureFlagBits" type="bitmask">
         <enum bitpos="0"    name="VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT"               comment="Format can be used for sampled images (SAMPLED_IMAGE and COMBINED_IMAGE_SAMPLER descriptor types)"/>
         <enum bitpos="1"    name="VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT"               comment="Format can be used for storage images (STORAGE_IMAGE descriptor type)"/>
@@ -7190,6 +7275,7 @@
         <enum value="14"      name="VK_DRIVER_ID_MOLTENVK"                      comment="MoltenVK"/>
         <enum value="15"      name="VK_DRIVER_ID_COREAVI_PROPRIETARY"           comment="Core Avionics &amp; Industrial Inc."/>
         <enum value="16"      name="VK_DRIVER_ID_JUICE_PROPRIETARY"             comment="Juice Technologies, Inc."/>
+        <enum value="17"      name="VK_DRIVER_ID_VERISILICON_PROPRIETARY"       comment="Verisilicon, Inc."/>
     </enums>
     <enums name="VkConditionalRenderingFlagBitsEXT" type="bitmask">
         <enum bitpos="0"    name="VK_CONDITIONAL_RENDERING_INVERTED_BIT_EXT"/>
@@ -7223,9 +7309,10 @@
     </enums>
     <enums name="VkGeometryInstanceFlagBitsKHR" type="bitmask">
         <enum bitpos="0" name="VK_GEOMETRY_INSTANCE_TRIANGLE_FACING_CULL_DISABLE_BIT_KHR"/>
-        <enum bitpos="1" name="VK_GEOMETRY_INSTANCE_TRIANGLE_FRONT_COUNTERCLOCKWISE_BIT_KHR"/>
+        <enum bitpos="1" name="VK_GEOMETRY_INSTANCE_TRIANGLE_FLIP_FACING_BIT_KHR"/>
         <enum bitpos="2" name="VK_GEOMETRY_INSTANCE_FORCE_OPAQUE_BIT_KHR"/>
         <enum bitpos="3" name="VK_GEOMETRY_INSTANCE_FORCE_NO_OPAQUE_BIT_KHR"/>
+        <enum            name="VK_GEOMETRY_INSTANCE_TRIANGLE_FRONT_COUNTERCLOCKWISE_BIT_KHR" alias="VK_GEOMETRY_INSTANCE_TRIANGLE_FLIP_FACING_BIT_KHR"/>
     </enums>
     <enums name="VkGeometryFlagBitsKHR" type="bitmask">
         <enum bitpos="0" name="VK_GEOMETRY_OPAQUE_BIT_KHR"/>
@@ -7527,9 +7614,9 @@
         <enum bitpos="2"    name="VK_VIDEO_COMPONENT_BIT_DEPTH_10_BIT_KHR"/>
         <enum bitpos="4"    name="VK_VIDEO_COMPONENT_BIT_DEPTH_12_BIT_KHR"/>
     </enums>
-    <enums name="VkVideoCapabilitiesFlagBitsKHR" type="bitmask">
-        <enum bitpos="0"    name="VK_VIDEO_CAPABILITIES_PROTECTED_CONTENT_BIT_KHR"/>
-        <enum bitpos="1"    name="VK_VIDEO_CAPABILITIES_SEPARATE_REFERENCE_IMAGES_BIT_KHR"/>
+    <enums name="VkVideoCapabilityFlagBitsKHR" type="bitmask">
+        <enum bitpos="0"    name="VK_VIDEO_CAPABILITY_PROTECTED_CONTENT_BIT_KHR"/>
+        <enum bitpos="1"    name="VK_VIDEO_CAPABILITY_SEPARATE_REFERENCE_IMAGES_BIT_KHR"/>
     </enums>
     <enums name="VkVideoSessionCreateFlagBitsKHR" type="bitmask">
         <enum value="0"     name="VK_VIDEO_SESSION_CREATE_DEFAULT_KHR"/>
@@ -7541,10 +7628,10 @@
         <enum bitpos="1"       name="VK_VIDEO_CODING_QUALITY_PRESET_POWER_BIT_KHR"/>
         <enum bitpos="2"       name="VK_VIDEO_CODING_QUALITY_PRESET_QUALITY_BIT_KHR"/>
     </enums>
-    <enums name="VkVideoDecodeH264FieldLayoutFlagBitsEXT" type="bitmask">
-        <enum value="0"       name="VK_VIDEO_DECODE_H264_PROGRESSIVE_PICTURES_ONLY_EXT"/>
-        <enum bitpos="0"      name="VK_VIDEO_DECODE_H264_FIELD_LAYOUT_LINE_INTERLACED_PLANE_BIT_EXT"/>
-        <enum bitpos="1"      name="VK_VIDEO_DECODE_H264_FIELD_LAYOUT_SEPARATE_INTERLACED_PLANE_BIT_EXT"/>
+    <enums name="VkVideoDecodeH264PictureLayoutFlagBitsEXT" type="bitmask">
+        <enum value="0"       name="VK_VIDEO_DECODE_H264_PICTURE_LAYOUT_PROGRESSIVE_EXT"/>
+        <enum bitpos="0"      name="VK_VIDEO_DECODE_H264_PICTURE_LAYOUT_INTERLACED_INTERLEAVED_LINES_BIT_EXT"/>
+        <enum bitpos="1"      name="VK_VIDEO_DECODE_H264_PICTURE_LAYOUT_INTERLACED_SEPARATE_PLANES_BIT_EXT"/>
     </enums>
     <enums name="VkVideoCodingControlFlagBitsKHR" type="bitmask">
         <enum value="0"     name="VK_VIDEO_CODING_CONTROL_DEFAULT_KHR"/>
@@ -7572,7 +7659,7 @@
         <enum value="1"      name="VK_VIDEO_ENCODE_RATE_CONTROL_MODE_CBR_BIT_KHR"/>
         <enum value="2"      name="VK_VIDEO_ENCODE_RATE_CONTROL_MODE_VBR_BIT_KHR"/>
     </enums>
-    <enums name="VkVideoEncodeH264CapabilitiesFlagBitsEXT" type="bitmask">
+    <enums name="VkVideoEncodeH264CapabilityFlagBitsEXT" type="bitmask">
         <enum bitpos="0"      name="VK_VIDEO_ENCODE_H264_CAPABILITY_CABAC_BIT_EXT"/>
         <enum bitpos="1"      name="VK_VIDEO_ENCODE_H264_CAPABILITY_CAVLC_BIT_EXT"/>
         <enum bitpos="2"      name="VK_VIDEO_ENCODE_H264_CAPABILITY_WEIGHTED_BI_PRED_IMPLICIT_BIT_EXT"/>
@@ -8494,13 +8581,13 @@
             <proto><type>void</type> <name>vkCmdSetEvent</name></proto>
             <param externsync="true"><type>VkCommandBuffer</type> <name>commandBuffer</name></param>
             <param><type>VkEvent</type> <name>event</name></param>
-            <param><type>VkPipelineStageFlags</type> <name>stageMask</name></param>
+            <param optional="true"><type>VkPipelineStageFlags</type> <name>stageMask</name></param>
         </command>
         <command queues="graphics,compute" renderpass="outside" cmdbufferlevel="primary,secondary">
             <proto><type>void</type> <name>vkCmdResetEvent</name></proto>
             <param externsync="true"><type>VkCommandBuffer</type> <name>commandBuffer</name></param>
             <param><type>VkEvent</type> <name>event</name></param>
-            <param><type>VkPipelineStageFlags</type> <name>stageMask</name></param>
+            <param optional="true"><type>VkPipelineStageFlags</type> <name>stageMask</name></param>
         </command>
         <command queues="graphics,compute" renderpass="both" cmdbufferlevel="primary,secondary">
             <proto><type>void</type> <name>vkCmdWaitEvents</name></proto>
@@ -8519,8 +8606,8 @@
         <command queues="transfer,graphics,compute" renderpass="both" cmdbufferlevel="primary,secondary">
             <proto><type>void</type> <name>vkCmdPipelineBarrier</name></proto>
             <param externsync="true"><type>VkCommandBuffer</type> <name>commandBuffer</name></param>
-            <param><type>VkPipelineStageFlags</type> <name>srcStageMask</name></param>
-            <param><type>VkPipelineStageFlags</type> <name>dstStageMask</name></param>
+            <param optional="true"><type>VkPipelineStageFlags</type> <name>srcStageMask</name></param>
+            <param optional="true"><type>VkPipelineStageFlags</type> <name>dstStageMask</name></param>
             <param optional="true"><type>VkDependencyFlags</type> <name>dependencyFlags</name></param>
             <param optional="true"><type>uint32_t</type> <name>memoryBarrierCount</name></param>
             <param len="memoryBarrierCount">const <type>VkMemoryBarrier</type>* <name>pMemoryBarriers</name></param>
@@ -9051,7 +9138,7 @@
         <command successcodes="VK_SUCCESS" errorcodes="VK_ERROR_INVALID_EXTERNAL_HANDLE">
             <proto><type>VkResult</type> <name>vkGetMemoryRemoteAddressNV</name></proto>
             <param><type>VkDevice</type> <name>device</name></param>
-            <param>const <type>VkMemoryGetRemoteAddressInfoNV</type>* <name>getMemoryRemoteAddressInfo</name></param>
+            <param>const <type>VkMemoryGetRemoteAddressInfoNV</type>* <name>pMemoryGetRemoteAddressInfo</name></param>
             <param><type>VkRemoteAddressNV</type>* <name>pAddress</name></param>
         </command>
         <command>
@@ -9817,6 +9904,12 @@
             <param optional="true">const <type>VkAllocationCallbacks</type>* <name>pAllocator</name></param>
             <param><type>VkAccelerationStructureNV</type>* <name>pAccelerationStructure</name></param>
         </command>
+        <command queues="compute" renderpass="outside" cmdbufferlevel="primary,secondary">
+            <proto><type>void</type> <name>vkCmdBindInvocationMaskHUAWEI</name></proto>
+            <param externsync="true"><type>VkCommandBuffer</type> <name>commandBuffer</name></param>
+            <param optional="true"><type>VkImageView</type> <name>imageView</name></param>
+            <param><type>VkImageLayout</type> <name>imageLayout</name></param>
+        </command>
         <command>
             <proto><type>void</type> <name>vkDestroyAccelerationStructureKHR</name></proto>
             <param><type>VkDevice</type> <name>device</name></param>
@@ -10297,7 +10390,7 @@
             <param externsync="true"><type>VkCommandBuffer</type> <name>commandBuffer</name></param>
             <param><type>uint32_t</type> <name>firstBinding</name></param>
             <param><type>uint32_t</type> <name>bindingCount</name></param>
-            <param len="bindingCount">const <type>VkBuffer</type>* <name>pBuffers</name></param>
+            <param len="bindingCount" optional="false,true">const <type>VkBuffer</type>* <name>pBuffers</name></param>
             <param len="bindingCount">const <type>VkDeviceSize</type>* <name>pOffsets</name></param>
             <param optional="true" len="bindingCount">const <type>VkDeviceSize</type>* <name>pSizes</name></param>
             <param optional="true" len="bindingCount">const <type>VkDeviceSize</type>* <name>pStrides</name></param>
@@ -10640,6 +10733,13 @@
             <param><type>uint32_t</type> <name>connectorId</name></param>
             <param><type>VkDisplayKHR</type>* <name>display</name></param>
         </command>
+        <command successcodes="VK_SUCCESS,VK_TIMEOUT" errorcodes="VK_ERROR_OUT_OF_HOST_MEMORY,VK_ERROR_OUT_OF_DEVICE_MEMORY,VK_ERROR_DEVICE_LOST">
+            <proto><type>VkResult</type> <name>vkWaitForPresentKHR</name></proto>
+            <param><type>VkDevice</type> <name>device</name></param>
+            <param externsync="true"><type>VkSwapchainKHR</type> <name>swapchain</name></param>
+            <param><type>uint64_t</type> <name>presentId</name></param>
+            <param><type>uint64_t</type> <name>timeout</name></param>
+        </command>
     </commands>
 
     <feature api="vulkan" name="VK_VERSION_1_0" number="1.0" comment="Vulkan core API interface definitions">
@@ -10724,7 +10824,7 @@
             <type name="VkImageUsageFlagBits"/>
             <type name="VkImageUsageFlags"/>
             <type name="VkInstance"/>
-            <type name="VkInstanceCreateFlags"/>
+            <type name="VkInstanceCreateFlags" comment="Will add VkInstanceCreateFlagBits when bits are defined in the future"/>
             <type name="VkInstanceCreateInfo"/>
             <type name="VkInternalAllocationType"/>
             <type name="VkMemoryHeap"/>
@@ -10760,10 +10860,9 @@
         </require>
         <require comment="Device commands">
             <type name="VkDevice"/>
-            <type name="VkDeviceCreateFlags"/>
+            <type name="VkDeviceCreateFlags" comment="Will add VkDeviceCreateFlagBits when bits are defined in the future"/>
             <type name="VkDeviceCreateInfo"/>
-            <type name="VkDeviceQueueCreateFlagBits"/>
-            <type name="VkDeviceQueueCreateFlags"/>
+            <type name="VkDeviceQueueCreateFlags" comment="VkDeviceQueueCreateFlagBits was added later"/>
             <type name="VkDeviceQueueCreateInfo"/>
             <command name="vkCreateDevice"/>
             <command name="vkDestroyDevice"/>
@@ -10841,7 +10940,7 @@
         </require>
         <require comment="Queue semaphore commands">
             <type name="VkSemaphore"/>
-            <type name="VkSemaphoreCreateFlags"/>
+            <type name="VkSemaphoreCreateFlags" comment="Will add VkSemaphoreCreateFlagBits when bits are defined in the future"/>
             <type name="VkSemaphoreCreateInfo"/>
             <command name="vkCreateSemaphore"/>
             <command name="vkDestroySemaphore"/>
@@ -10861,7 +10960,7 @@
             <type name="VkQueryPipelineStatisticFlagBits"/>
             <type name="VkQueryPipelineStatisticFlags"/>
             <type name="VkQueryPool"/>
-            <type name="VkQueryPoolCreateFlags"/>
+            <type name="VkQueryPoolCreateFlags" comment="Will add VkQueryPoolCreateFlagBits when bits are defined in the future"/>
             <type name="VkQueryPoolCreateInfo"/>
             <type name="VkQueryResultFlagBits"/>
             <type name="VkQueryResultFlags"/>
@@ -10883,7 +10982,7 @@
         </require>
         <require comment="Buffer view commands">
             <type name="VkBufferView"/>
-            <type name="VkBufferViewCreateFlags" comment="Will need FlagBits type eventually"/>
+            <type name="VkBufferViewCreateFlags" comment="Will add VkBufferViewFlagBits when bits are defined in the future"/>
             <type name="VkBufferViewCreateInfo"/>
             <command name="vkCreateBufferView"/>
             <command name="vkDestroyBufferView"/>
@@ -10911,7 +11010,6 @@
         </require>
         <require comment="Shader commands">
             <type name="VkShaderModule"/>
-            <type name="VkShaderModuleCreateFlagBits"/>
             <type name="VkShaderModuleCreateFlags"/>
             <type name="VkShaderModuleCreateInfo"/>
             <command name="vkCreateShaderModule"/>
@@ -10919,8 +11017,7 @@
         </require>
         <require comment="Pipeline Cache commands">
             <type name="VkPipelineCache"/>
-            <type name="VkPipelineCacheCreateFlagBits"/>
-            <type name="VkPipelineCacheCreateFlags"/>
+            <type name="VkPipelineCacheCreateFlags" comment="VkPipelineCacheCreateFlagBits was added later"/>
             <type name="VkPipelineCacheCreateInfo"/>
             <command name="vkCreatePipelineCache"/>
             <command name="vkDestroyPipelineCache"/>
@@ -10942,29 +11039,29 @@
             <type name="VkLogicOp"/>
             <type name="VkPipeline"/>
             <type name="VkPipelineColorBlendAttachmentState"/>
-            <type name="VkPipelineColorBlendStateCreateFlags" comment="Will need FlagBits type eventually"/>
+            <type name="VkPipelineColorBlendStateCreateFlags" comment="Will add VkPipeline*StateFlagBits when bits are defined in the future"/>
             <type name="VkPipelineColorBlendStateCreateInfo"/>
             <type name="VkPipelineCreateFlagBits"/>
             <type name="VkPipelineCreateFlags"/>
-            <type name="VkPipelineDepthStencilStateCreateFlags" comment="Will need FlagBits type eventually"/>
+            <type name="VkPipelineDepthStencilStateCreateFlags" comment="Will add VkPipeline*StateFlagBits when bits are defined in the future"/>
             <type name="VkPipelineDepthStencilStateCreateInfo"/>
-            <type name="VkPipelineDynamicStateCreateFlags" comment="Will need FlagBits type eventually"/>
+            <type name="VkPipelineDynamicStateCreateFlags" comment="Will add VkPipeline*StateFlagBits when bits are defined in the future"/>
             <type name="VkPipelineDynamicStateCreateInfo"/>
-            <type name="VkPipelineInputAssemblyStateCreateFlags" comment="Will need FlagBits type eventually"/>
+            <type name="VkPipelineInputAssemblyStateCreateFlags" comment="Will add VkPipeline*StateFlagBits when bits are defined in the future"/>
             <type name="VkPipelineInputAssemblyStateCreateInfo"/>
-            <type name="VkPipelineLayoutCreateFlags" comment="Will need FlagBits type eventually"/>
-            <type name="VkPipelineMultisampleStateCreateFlags" comment="Will need FlagBits type eventually"/>
+            <type name="VkPipelineLayoutCreateFlags" comment="Will add VkPipelineLayoutCreateFlagBits when bits are defined in the future"/>
+            <type name="VkPipelineMultisampleStateCreateFlags" comment="Will add VkPipelineMultisampleStateCreateFlagBits when bits are defined in the future"/>
             <type name="VkPipelineMultisampleStateCreateInfo"/>
-            <type name="VkPipelineRasterizationStateCreateFlags" comment="Will need FlagBits type eventually"/>
+            <type name="VkPipelineRasterizationStateCreateFlags" comment="Will add VkPipelineRasterizationStateCreateFlagBits when bits are defined in the future"/>
             <type name="VkPipelineRasterizationStateCreateInfo"/>
             <type name="VkPipelineShaderStageCreateFlagBits"/>
             <type name="VkPipelineShaderStageCreateFlags"/>
             <type name="VkPipelineShaderStageCreateInfo"/>
-            <type name="VkPipelineTessellationStateCreateFlags" comment="Will need FlagBits type eventually"/>
+            <type name="VkPipelineTessellationStateCreateFlags" comment="Will add VkPipelineTessellationStateCreateFlagBits when bits are defined in the future"/>
             <type name="VkPipelineTessellationStateCreateInfo"/>
-            <type name="VkPipelineVertexInputStateCreateFlags" comment="Will need FlagBits type eventually"/>
+            <type name="VkPipelineVertexInputStateCreateFlags" comment="Will add VkPipelineVertexInputStateCreateFlagBits when bits are defined in the future"/>
             <type name="VkPipelineVertexInputStateCreateInfo"/>
-            <type name="VkPipelineViewportStateCreateFlags" comment="Will need FlagBits type eventually"/>
+            <type name="VkPipelineViewportStateCreateFlags" comment="Will add VkPipelineViewportStateCreateFlagBits when bits are defined in the future"/>
             <type name="VkPipelineViewportStateCreateInfo"/>
             <type name="VkPolygonMode"/>
             <type name="VkPrimitiveTopology"/>
@@ -11317,6 +11414,7 @@
             <enum extends="VkStructureType" extnumber="146" offset="3"          name="VK_STRUCTURE_TYPE_DEVICE_QUEUE_INFO_2"/>
             <enum bitpos="4"  extends="VkQueueFlagBits"                         name="VK_QUEUE_PROTECTED_BIT" comment="Queues may support protected operations"/>
             <enum bitpos="0"  extends="VkDeviceQueueCreateFlagBits"             name="VK_DEVICE_QUEUE_CREATE_PROTECTED_BIT" comment="Queue is a protected-capable device queue"/>
+            <type name="VkDeviceQueueCreateFlagBits" comment="This is a temporary workaround for processors not recognizing that VK_DEVICE_QUEUE_CREATE_PROTECTED_BIT above also requires this type"/>
             <enum bitpos="5"  extends="VkMemoryPropertyFlagBits"                name="VK_MEMORY_PROPERTY_PROTECTED_BIT" comment="Memory is protected"/>
             <enum bitpos="3"  extends="VkBufferCreateFlagBits"                  name="VK_BUFFER_CREATE_PROTECTED_BIT" comment="Buffer requires protected memory"/>
             <enum bitpos="11" extends="VkImageCreateFlagBits"                   name="VK_IMAGE_CREATE_PROTECTED_BIT" comment="Image requires protected memory"/>
@@ -11983,7 +12081,7 @@
         </extension>
         <extension name="VK_KHR_video_queue" number="24" type="device" requires="VK_KHR_get_physical_device_properties2,VK_KHR_sampler_ycbcr_conversion" author="KHR" contact="Tony Zlatinski @tzlatinski" provisional="true" platform="provisional" supported="vulkan">
             <require>
-                <enum value="1"                                         name="VK_KHR_VIDEO_QUEUE_SPEC_VERSION"/>
+                <enum value="2"                                         name="VK_KHR_VIDEO_QUEUE_SPEC_VERSION"/>
                 <enum value="&quot;VK_KHR_video_queue&quot;"            name="VK_KHR_VIDEO_QUEUE_EXTENSION_NAME"/>
                 <enum offset="0" extends="VkStructureType"              name="VK_STRUCTURE_TYPE_VIDEO_PROFILE_KHR" protect="VK_ENABLE_BETA_EXTENSIONS"/>
                 <enum offset="1" extends="VkStructureType"              name="VK_STRUCTURE_TYPE_VIDEO_CAPABILITIES_KHR" protect="VK_ENABLE_BETA_EXTENSIONS"/>
@@ -12017,8 +12115,8 @@
                 <type name="VkVideoChromaSubsamplingFlagsKHR"/>
                 <type name="VkVideoComponentBitDepthFlagBitsKHR"/>
                 <type name="VkVideoComponentBitDepthFlagsKHR"/>
-                <type name="VkVideoCapabilitiesFlagBitsKHR"/>
-                <type name="VkVideoCapabilitiesFlagsKHR"/>
+                <type name="VkVideoCapabilityFlagBitsKHR"/>
+                <type name="VkVideoCapabilityFlagsKHR"/>
                 <type name="VkVideoSessionCreateFlagBitsKHR"/>
                 <type name="VkVideoSessionCreateFlagsKHR"/>
                 <type name="VkVideoBeginCodingFlagsKHR"/>
@@ -12227,7 +12325,7 @@
         </extension>
         <extension name="VK_EXT_video_encode_h264" number="39" type="device" requires="VK_KHR_video_encode_queue" author="KHR" contact="Ahmed Abdelkhalek @aabdelkh" provisional="true" platform="provisional" supported="vulkan">
             <require>
-                <enum value="1"                                                 name="VK_EXT_VIDEO_ENCODE_H264_SPEC_VERSION"/>
+                <enum value="2"                                                 name="VK_EXT_VIDEO_ENCODE_H264_SPEC_VERSION"/>
                 <enum value="&quot;VK_EXT_video_encode_h264&quot;"              name="VK_EXT_VIDEO_ENCODE_H264_EXTENSION_NAME"/>
                 <enum offset="0" extends="VkStructureType"                      name="VK_STRUCTURE_TYPE_VIDEO_ENCODE_H264_CAPABILITIES_EXT" protect="VK_ENABLE_BETA_EXTENSIONS"/>
                 <enum offset="1" extends="VkStructureType"                      name="VK_STRUCTURE_TYPE_VIDEO_ENCODE_H264_SESSION_CREATE_INFO_EXT" protect="VK_ENABLE_BETA_EXTENSIONS"/>
@@ -12240,8 +12338,8 @@
                 <enum offset="8" extends="VkStructureType"                      name="VK_STRUCTURE_TYPE_VIDEO_ENCODE_H264_PROFILE_EXT" protect="VK_ENABLE_BETA_EXTENSIONS"/>
                 <enum bitpos="16" extends="VkVideoCodecOperationFlagBitsKHR"    name="VK_VIDEO_CODEC_OPERATION_ENCODE_H264_BIT_EXT" protect="VK_ENABLE_BETA_EXTENSIONS"/>
 
-                <type name="VkVideoEncodeH264CapabilitiesFlagBitsEXT"/>
-                <type name="VkVideoEncodeH264CapabilitiesFlagsEXT"/>
+                <type name="VkVideoEncodeH264CapabilityFlagBitsEXT"/>
+                <type name="VkVideoEncodeH264CapabilityFlagsEXT"/>
                 <type name="VkVideoEncodeH264InputModeFlagBitsEXT"/>
                 <type name="VkVideoEncodeH264InputModeFlagsEXT"/>
                 <type name="VkVideoEncodeH264OutputModeFlagBitsEXT"/>
@@ -12267,7 +12365,7 @@
         </extension>
         <extension name="VK_EXT_video_decode_h264" number="41" type="device" requires="VK_KHR_video_decode_queue" author="KHR" contact="peter.fang@amd.com" provisional="true" platform="provisional" supported="vulkan">
             <require>
-                <enum value="1"                                              name="VK_EXT_VIDEO_DECODE_H264_SPEC_VERSION"/>
+                <enum value="3"                                              name="VK_EXT_VIDEO_DECODE_H264_SPEC_VERSION"/>
                 <enum value="&quot;VK_EXT_video_decode_h264&quot;"           name="VK_EXT_VIDEO_DECODE_H264_EXTENSION_NAME"/>
                 <enum offset="0" extends="VkStructureType"                   name="VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_CAPABILITIES_EXT" protect="VK_ENABLE_BETA_EXTENSIONS"/>
                 <enum offset="1" extends="VkStructureType"                   name="VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_SESSION_CREATE_INFO_EXT" protect="VK_ENABLE_BETA_EXTENSIONS"/>
@@ -12278,8 +12376,8 @@
                 <enum offset="6" extends="VkStructureType"                   name="VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_SESSION_PARAMETERS_ADD_INFO_EXT" protect="VK_ENABLE_BETA_EXTENSIONS"/>
                 <enum offset="7" extends="VkStructureType"                   name="VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_DPB_SLOT_INFO_EXT" protect="VK_ENABLE_BETA_EXTENSIONS"/>
                 <enum bitpos="0" extends="VkVideoCodecOperationFlagBitsKHR"  name="VK_VIDEO_CODEC_OPERATION_DECODE_H264_BIT_EXT" protect="VK_ENABLE_BETA_EXTENSIONS"/>
-                <type name="VkVideoDecodeH264FieldLayoutFlagBitsEXT"/>
-                <type name="VkVideoDecodeH264FieldLayoutFlagsEXT"/>
+                <type name="VkVideoDecodeH264PictureLayoutFlagBitsEXT"/>
+                <type name="VkVideoDecodeH264PictureLayoutFlagsEXT"/>
                 <type name="VkVideoDecodeH264CreateFlagsEXT"/>
                 <type name="VkVideoDecodeH264ProfileEXT"/>
                 <type name="VkVideoDecodeH264CapabilitiesEXT"/>
@@ -13654,7 +13752,7 @@
         </extension>
         <extension name="VK_KHR_acceleration_structure" number="151" type="device" requiresCore="1.1" requires="VK_EXT_descriptor_indexing,VK_KHR_buffer_device_address,VK_KHR_deferred_host_operations" author="KHR" contact="Daniel Koch @dgkoch" supported="vulkan" sortorder="1">
             <require>
-                <enum value="11"                                            name="VK_KHR_ACCELERATION_STRUCTURE_SPEC_VERSION"/>
+                <enum value="12"                                            name="VK_KHR_ACCELERATION_STRUCTURE_SPEC_VERSION"/>
                 <enum value="&quot;VK_KHR_acceleration_structure&quot;"     name="VK_KHR_ACCELERATION_STRUCTURE_EXTENSION_NAME"/>
                 <enum offset="7"  extends="VkStructureType"                 name="VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET_ACCELERATION_STRUCTURE_KHR"/>
                 <enum offset="0"  extends="VkStructureType"                 name="VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_BUILD_GEOMETRY_INFO_KHR"/>
@@ -14301,7 +14399,7 @@
                 <type name="VkPipelineCompilerControlCreateInfoAMD"/>
             </require>
         </extension>
-        <extension name="VK_EXT_calibrated_timestamps" number="185" type="device" author="EXT" contact="Daniel Rakos @drakos-amd" supported="vulkan">
+        <extension name="VK_EXT_calibrated_timestamps" number="185" type="device" requires="VK_KHR_get_physical_device_properties2" author="EXT" contact="Daniel Rakos @drakos-amd" supported="vulkan">
             <require>
                 <enum value="2"                                             name="VK_EXT_CALIBRATED_TIMESTAMPS_SPEC_VERSION"/>
                 <enum value="&quot;VK_EXT_calibrated_timestamps&quot;"      name="VK_EXT_CALIBRATED_TIMESTAMPS_EXTENSION_NAME"/>
@@ -14981,10 +15079,13 @@
                 <type name="VkValidationFeatureDisableEXT"/>
             </require>
         </extension>
-        <extension name="VK_KHR_extension_249" number="249" author="KHR" contact="Keith Packard @keithp" supported="disabled">
+        <extension name="VK_KHR_present_wait" number="249" type="device" requires="VK_KHR_swapchain,VK_KHR_present_id" author="KHR" contact="Keith Packard @keithp" supported="vulkan">
             <require>
-                <enum value="0"                                             name="VK_KHR_EXTENSION_249_SPEC_VERSION"/>
-                <enum value="&quot;VK_KHR_extension_249&quot;"              name="VK_KHR_EXTENSION_249_EXTENSION_NAME"/>
+                <enum value="1"                                         name="VK_KHR_PRESENT_WAIT_SPEC_VERSION"/>
+                <enum value="&quot;VK_KHR_present_wait&quot;"           name="VK_KHR_PRESENT_WAIT_EXTENSION_NAME"/>
+                <command name="vkWaitForPresentKHR"/>
+                <enum offset="0" extends="VkStructureType"              name="VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PRESENT_WAIT_FEATURES_KHR"/>
+                <type name="VkPhysicalDevicePresentWaitFeaturesKHR"/>
             </require>
         </extension>
         <extension name="VK_NV_cooperative_matrix" number="250" type="device" requires="VK_KHR_get_physical_device_properties2" author="NV" contact="Jeff Bolz @jeffbolznv" supported="vulkan">
@@ -15276,10 +15377,12 @@
                 <enum value="&quot;VK_KHR_extension_273&quot;"              name="VK_INTEL_extension_273"/>
             </require>
         </extension>
-        <extension name="VK_INTEL_extension_274" number="274" type="device" author="INTEL" contact="Jason Ekstrand @jekstrand" supported="disabled">
+        <extension name="VK_EXT_shader_atomic_float2" number="274" type="device" requires="VK_EXT_shader_atomic_float" author="EXT" contact="Jason Ekstrand @jekstrand" supported="vulkan">
             <require>
-                <enum value="0"                                             name="VK_INTEL_EXTENSION_274_SPEC_VERSION"/>
-                <enum value="&quot;VK_KHR_extension_274&quot;"              name="VK_INTEL_extension_274"/>
+                <enum value="1"                                             name="VK_EXT_SHADER_ATOMIC_FLOAT_2_SPEC_VERSION"/>
+                <enum value="&quot;VK_EXT_shader_atomic_float2&quot;"       name="VK_EXT_SHADER_ATOMIC_FLOAT_2_EXTENSION_NAME"/>
+                <enum offset="0" extends="VkStructureType"                  name="VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_ATOMIC_FLOAT_2_FEATURES_EXT"/>
+                <type name="VkPhysicalDeviceShaderAtomicFloat2FeaturesEXT"/>
             </require>
         </extension>
         <extension name="VK_KHR_extension_275" number="275" type="instance" author="KHR" contact="Lionel Landwerlin @llandwerlin" supported="disabled">
@@ -15362,10 +15465,14 @@
                 <enum value="&quot;VK_KHR_extension_280&quot;"              name="VK_KHR_extension_280"/>
             </require>
         </extension>
-        <extension name="VK_ARM_extension_281" number="281" type="device" author="ARM" contact="Kevin Petit @kevinpetit" supported="disabled">
+        <extension name="VK_KHR_shader_integer_dot_product" number="281" type="device" author="KHR" requires="VK_KHR_get_physical_device_properties2" contact="Kevin Petit @kevinpetit" supported="vulkan">
             <require>
-                <enum value="0"                                             name="VK_ARM_EXTENSION_281_SPEC_VERSION"/>
-                <enum value="&quot;VK_ARM_extension_281&quot;"              name="VK_ARM_extension_281"/>
+                <enum value="1"                                             name="VK_KHR_SHADER_INTEGER_DOT_PRODUCT_SPEC_VERSION"/>
+                <enum value="&quot;VK_KHR_shader_integer_dot_product&quot;" name="VK_KHR_SHADER_INTEGER_DOT_PRODUCT_EXTENSION_NAME"/>
+                <enum offset="0" extends="VkStructureType"                  name="VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_INTEGER_DOT_PRODUCT_FEATURES_KHR"/>
+                <enum offset="1" extends="VkStructureType"                  name="VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_INTEGER_DOT_PRODUCT_PROPERTIES_KHR"/>
+                <type name="VkPhysicalDeviceShaderIntegerDotProductFeaturesKHR"/>
+                <type name="VkPhysicalDeviceShaderIntegerDotProductPropertiesKHR"/>
             </require>
         </extension>
         <extension name="VK_EXT_texel_buffer_alignment" number="282" type="device" requires="VK_KHR_get_physical_device_properties2" author="EXT" contact="Jeff Bolz @jeffbolznv" supported="vulkan">
@@ -15516,10 +15623,14 @@
                 <enum value="&quot;VK_KHR_shader_non_semantic_info&quot;"   name="VK_KHR_SHADER_NON_SEMANTIC_INFO_EXTENSION_NAME"/>
             </require>
         </extension>
-        <extension name="VK_KHR_extension_295" number="295" author="KHR" contact="Keith Packard @keithp" supported="disabled">
+        <extension name="VK_KHR_present_id" number="295" type="device" requires="VK_KHR_swapchain" author="KHR" contact="Keith Packard @keithp" supported="vulkan">
             <require>
-                <enum value="0"                                             name="VK_KHR_EXTENSION_295_SPEC_VERSION"/>
-                <enum value="&quot;VK_KHR_extension_295&quot;"              name="VK_KHR_EXTENSION_295_EXTENSION_NAME"/>
+                <enum value="1"                                         name="VK_KHR_PRESENT_ID_SPEC_VERSION"/>
+                <enum value="&quot;VK_KHR_present_id&quot;"             name="VK_KHR_PRESENT_ID_EXTENSION_NAME"/>
+                <enum offset="0" extends="VkStructureType"              name="VK_STRUCTURE_TYPE_PRESENT_ID_KHR"/>
+                <type name="VkPresentIdKHR"/>
+                <enum offset="1" extends="VkStructureType"              name="VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PRESENT_ID_FEATURES_KHR"/>
+                <type name="VkPhysicalDevicePresentIdFeaturesKHR"/>
             </require>
         </extension>
         <extension name="VK_EXT_private_data" number="296" type="device" author="NV" contact="Matthew Rusch @mattruschnv" supported="vulkan">
@@ -15565,6 +15676,7 @@
                 <enum extends="VkResult"            name="VK_ERROR_PIPELINE_COMPILE_REQUIRED_EXT" alias="VK_PIPELINE_COMPILE_REQUIRED_EXT"/>
                 <enum bitpos="0"  extends="VkPipelineCacheCreateFlagBits"
                     name="VK_PIPELINE_CACHE_CREATE_EXTERNALLY_SYNCHRONIZED_BIT_EXT"/>
+                <type name="VkPipelineCacheCreateFlagBits" comment="This is a temporary workaround for processors not recognizing that VK_PIPELINE_CACHE_CREATE_EXTERNALLY_SYNCHRONIZED_BIT_EXT above also requires this type"/>
             </require>
         </extension>
         <extension name="VK_KHR_extension_299" number="299" author="KHR" contact="Mark Bellamy @mark.bellamy_arm" supported="disabled">
@@ -15627,7 +15739,7 @@
             <require>
                 <enum value="2"                                             name="VK_QCOM_RENDER_PASS_STORE_OPS_SPEC_VERSION"/>
                 <enum value="&quot;VK_QCOM_render_pass_store_ops&quot;"     name="VK_QCOM_RENDER_PASS_STORE_OPS_EXTENSION_NAME"/>
-                <enum offset="0" extends="VkAttachmentStoreOp"              name="VK_ATTACHMENT_STORE_OP_NONE_QCOM"/>
+                <enum extends="VkAttachmentStoreOp"                         name="VK_ATTACHMENT_STORE_OP_NONE_QCOM" alias="VK_ATTACHMENT_STORE_OP_NONE_EXT"/>
             </require>
         </extension>
         <extension name="VK_QCOM_extension_303" number="303" author="QCOM" contact="Bill Licea-Kane @wwlk" supported="disabled">
@@ -16028,6 +16140,7 @@
             <require>
                 <enum value="0"                                             name="VK_EXT_EXTENSION_340_SPEC_VERSION"/>
                 <enum value="&quot;VK_EXT_extension_340&quot;"              name="VK_EXT_EXTENSION_340_EXTENSION_NAME"/>
+                <enum bitpos="19" extends="VkImageUsageFlagBits"            name="VK_IMAGE_USAGE_RESERVED_19_BIT_EXT"/>
             </require>
         </extension>
         <extension name="VK_EXT_4444_formats" number="341" type="device" requires="VK_KHR_get_physical_device_properties2" author="EXT" contact="Joshua Ashton @Joshua-Ashton" supported="vulkan">
@@ -16145,10 +16258,12 @@
                 <enum value="&quot;VK_EXT_vertex_attribute_aliasing&quot;"  name="VK_EXT_VERTEX_ATTRIBUTE_ALIASING_EXTENSION_NAME"/>
             </require>
         </extension>
-        <extension name="VK_EXT_extension_357" number="357" author="EXT" contact="Courtney Goeltzenleuchter @courtney-g" supported="disabled" specialuse="glemulation">
+        <extension name="VK_EXT_primitive_topology_list_restart" number="357" type="device" author="EXT" contact="Shahbaz Youssefi @syoussefi" supported="vulkan" specialuse="glemulation">
             <require>
-                <enum value="0"                                             name="VK_EXT_EXTENSION_357"/>
-                <enum value="&quot;VK_EXT_extension_357&quot;"              name="VK_EXT_EXTENSION_357"/>
+                <enum value="1"                                             name="VK_EXT_PRIMITIVE_TOPOLOGY_LIST_RESTART_SPEC_VERSION"/>
+                <enum value="&quot;VK_EXT_primitive_topology_list_restart&quot;"           name="VK_EXT_PRIMITIVE_TOPOLOGY_LIST_RESTART_EXTENSION_NAME"/>
+                <enum offset="0" extends="VkStructureType"                  name="VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PRIMITIVE_TOPOLOGY_LIST_RESTART_FEATURES_EXT"/>
+                <type name="VkPhysicalDevicePrimitiveTopologyListRestartFeaturesEXT"/>
             </require>
         </extension>
         <extension name="VK_KHR_extension_358" number="358" author="KHR" contact="Jeff Bolz @jeffbolznv" supported="disabled">
@@ -16257,13 +16372,16 @@
                 <command name="vkCmdSubpassShadingHUAWEI"/>
             </require>
         </extension>
-        <extension name="VK_HUAWEI_extension_371" number="371" author="HUAWEI" contact="Hueilong Wang @wyvernathuawei" supported="disabled">
+        <extension name="VK_HUAWEI_invocation_mask" number="371" type="device" requires="VK_KHR_ray_tracing_pipeline,VK_KHR_synchronization2" author="Huawei" contact="Yunpeng Zhu @yunxingzhu" supported="vulkan">
             <require>
-                <enum value="0"                                         name="VK_HUAWEI_EXTENSION_371_SPEC_VERSION"/>
-                <enum value="&quot;VK_HUAWEI_extension_371&quot;"         name="VK_HUAWEI_EXTENSION_371_EXTENSION_NAME"/>
-                <enum bitpos="39" extends="VkAccessFlagBits2KHR"          name="VK_ACCESS_2_RESERVED_39_BIT_HUAWEI"/>
-                <enum bitpos="18" extends="VkImageUsageFlagBits"             name="VK_IMAGE_USAGE_RESERVED_18_BIT_HUAWEI"/>
-                <enum bitpos="40" extends="VkPipelineStageFlagBits2KHR"     name="VK_PIPELINE_STAGE_2_RESERVED_40_BIT_HUAWEI"/>
+                <enum value="1"                                              name="VK_HUAWEI_INVOCATION_MASK_SPEC_VERSION"/>
+                <enum value="&quot;VK_HUAWEI_invocation_mask&quot;"        name="VK_HUAWEI_INVOCATION_MASK_EXTENSION_NAME"/>
+                <enum offset="0" extends="VkStructureType"                   name="VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_INVOCATION_MASK_FEATURES_HUAWEI"/>
+                <enum bitpos="39" extends="VkAccessFlagBits2KHR"             name="VK_ACCESS_2_INVOCATION_MASK_READ_BIT_HUAWEI"/>
+                <enum bitpos="18" extends="VkImageUsageFlagBits"             name="VK_IMAGE_USAGE_INVOCATION_MASK_BIT_HUAWEI"/>
+                <enum bitpos="40" extends="VkPipelineStageFlagBits2KHR"      name="VK_PIPELINE_STAGE_2_INVOCATION_MASK_BIT_HUAWEI"/>
+                <type name="VkPhysicalDeviceInvocationMaskFeaturesHUAWEI"/>
+                <command name="vkCmdBindInvocationMaskHUAWEI"/>
             </require>
         </extension>
         <extension name="VK_NV_external_memory_rdma" number="372" type="device" requires="VK_KHR_external_memory" author="NV" contact="Carsten Rohde @crohde" supported="vulkan">
@@ -16489,10 +16607,12 @@
                 <enum value="&quot;VK_JUICE_extension_400&quot;"        name="VK_JUICE_EXTENSION_400_EXTENSION_NAME"/>
             </require>
         </extension>
-        <extension name="VK_KHR_extension_401" number="401" author="KHR" contact="Shahbaz Youssefi @syoussefi" supported="disabled">
+        <extension name="VK_EXT_load_store_op_none" number="401" author="EXT" type="device" contact="Shahbaz Youssefi @syoussefi" supported="vulkan">
             <require>
-                <enum value="0"                                         name="VK_KHR_EXTENSION_401_SPEC_VERSION"/>
-                <enum value="&quot;VK_KHR_extension_401&quot;"          name="VK_KHR_EXTENSION_401_EXTENSION_NAME"/>
+                <enum value="1"                                         name="VK_EXT_LOAD_STORE_OP_NONE_SPEC_VERSION"/>
+                <enum value="&quot;VK_EXT_load_store_op_none&quot;"          name="VK_EXT_LOAD_STORE_OP_NONE_EXTENSION_NAME"/>
+                <enum offset="0" extends="VkAttachmentLoadOp" name="VK_ATTACHMENT_LOAD_OP_NONE_EXT"/>
+                <enum offset="0" extends="VkAttachmentStoreOp" extnumber="302" name="VK_ATTACHMENT_STORE_OP_NONE_EXT"/>
             </require>
         </extension>
         <extension name="VK_FB_extension_402" number="402" author="FB" contact="Artem Bolgar @artyom17" supported="disabled">
@@ -16609,6 +16729,25 @@
                 <enum value="&quot;VK_EXT_extension_420&quot;"              name="VK_EXT_EXTENSION_420_EXTENSION_NAME"/>
             </require>
         </extension>
+        <extension name="VK_KHR_extension_421" number="421" author="KHR" contact="Hans-Kristian Arntzen @HansKristian-Work" supported="disabled">
+            <require>
+                <enum value="0"                                             name="VK_KHR_EXTENSION_421_SPEC_VERSION"/>
+                <enum value="&quot;VK_KHR_extension_421&quot;"              name="VK_KHR_EXTENSION_421_EXTENSION_NAME"/>
+            </require>
+        </extension>
+        <extension name="VK_EXT_extension_422" number="422" author="EXT" contact="Graeme Leese @gnl21" supported="disabled">
+            <require>
+                <enum value="0"                                             name="VK_EXT_EXTENSION_422_SPEC_VERSION"/>
+                <enum value="&quot;VK_EXT_extension_422&quot;"              name="VK_EXT_EXTENSION_422_EXTENSION_NAME"/>
+            </require>
+        </extension>
+        <extension name="VK_EXT_disable_cube_map_wrap" number="423" author="EXT" contact="Georg Lehmann @DadSchoorse" supported="disabled">
+            <require>
+                <enum value="0"                                             name="VK_EXT_DISABLE_CUBE_MAP_WRAP_SPEC_VERSION"/>
+                <enum value="&quot;VK_EXT_disable_cube_map_wrap&quot;"      name="VK_EXT_DISABLE_CUBE_MAP_WRAP_EXTENSION_NAME"/>
+                <enum bitpos="2"  extends="VkSamplerCreateFlagBits"         name="VK_SAMPLER_CREATE_RESERVED_2_BIT_EXT"/>
+            </require>
+        </extension>
 
     </extensions>
     <spirvextensions comment="SPIR-V Extensions allowed in Vulkan and what is required to use it">
@@ -16785,6 +16924,15 @@
         <spirvextension name="SPV_KHR_subgroup_uniform_control_flow">
             <enable extension="VK_KHR_shader_subgroup_uniform_control_flow"/>
         </spirvextension>
+        <spirvextension name="SPV_EXT_shader_atomic_float_min_max">
+            <enable extension="VK_EXT_shader_atomic_float2"/>
+        </spirvextension>
+        <spirvextension name="SPV_EXT_shader_atomic_float16_add">
+            <enable extension="VK_EXT_shader_atomic_float2"/>
+        </spirvextension>
+        <spirvextension name="SPV_KHR_integer_dot_product">
+            <enable extension="VK_KHR_shader_integer_dot_product"/>
+        </spirvextension>
     </spirvextensions>
     <spirvcapabilities comment="SPIR-V Capabilities allowed in Vulkan and what is required to use it">
         <spirvcapability name="Matrix">
@@ -16831,16 +16979,32 @@
             <enable struct="VkPhysicalDeviceVulkan12Features" feature="shaderSharedInt64Atomics" requires="VK_VERSION_1_2,VK_KHR_shader_atomic_int64"/>
             <enable struct="VkPhysicalDeviceShaderImageAtomicInt64FeaturesEXT" feature="shaderImageInt64Atomics" requires="VK_EXT_shader_image_atomic_int64"/>
         </spirvcapability>
+        <spirvcapability name="AtomicFloat16AddEXT">
+            <enable struct="VkPhysicalDeviceShaderAtomicFloat2FeaturesEXT" feature="shaderBufferFloat16AtomicAdd" requires="VK_EXT_shader_atomic_float2"/>
+            <enable struct="VkPhysicalDeviceShaderAtomicFloat2FeaturesEXT" feature="shaderSharedFloat16AtomicAdd" requires="VK_EXT_shader_atomic_float2"/>
+        </spirvcapability>
         <spirvcapability name="AtomicFloat32AddEXT">
             <enable struct="VkPhysicalDeviceShaderAtomicFloatFeaturesEXT" feature="shaderBufferFloat32AtomicAdd" requires="VK_EXT_shader_atomic_float"/>
             <enable struct="VkPhysicalDeviceShaderAtomicFloatFeaturesEXT" feature="shaderSharedFloat32AtomicAdd" requires="VK_EXT_shader_atomic_float"/>
             <enable struct="VkPhysicalDeviceShaderAtomicFloatFeaturesEXT" feature="shaderImageFloat32AtomicAdd" requires="VK_EXT_shader_atomic_float"/>
-            <enable struct="VkPhysicalDeviceShaderAtomicFloatFeaturesEXT" feature="sparseImageFloat32AtomicAdd" requires="VK_EXT_shader_atomic_float"/>
         </spirvcapability>
         <spirvcapability name="AtomicFloat64AddEXT">
             <enable struct="VkPhysicalDeviceShaderAtomicFloatFeaturesEXT" feature="shaderBufferFloat64AtomicAdd" requires="VK_EXT_shader_atomic_float"/>
             <enable struct="VkPhysicalDeviceShaderAtomicFloatFeaturesEXT" feature="shaderSharedFloat64AtomicAdd" requires="VK_EXT_shader_atomic_float"/>
         </spirvcapability>
+        <spirvcapability name="AtomicFloat16MinMaxEXT">
+            <enable struct="VkPhysicalDeviceShaderAtomicFloat2FeaturesEXT" feature="shaderBufferFloat16AtomicMinMax" requires="VK_EXT_shader_atomic_float2"/>
+            <enable struct="VkPhysicalDeviceShaderAtomicFloat2FeaturesEXT" feature="shaderSharedFloat16AtomicMinMax" requires="VK_EXT_shader_atomic_float2"/>
+        </spirvcapability>
+        <spirvcapability name="AtomicFloat32MinMaxEXT">
+            <enable struct="VkPhysicalDeviceShaderAtomicFloat2FeaturesEXT" feature="shaderBufferFloat32AtomicMinMax" requires="VK_EXT_shader_atomic_float2"/>
+            <enable struct="VkPhysicalDeviceShaderAtomicFloat2FeaturesEXT" feature="shaderSharedFloat32AtomicMinMax" requires="VK_EXT_shader_atomic_float2"/>
+            <enable struct="VkPhysicalDeviceShaderAtomicFloat2FeaturesEXT" feature="shaderImageFloat32AtomicMinMax" requires="VK_EXT_shader_atomic_float2"/>
+        </spirvcapability>
+        <spirvcapability name="AtomicFloat64MinMaxEXT">
+            <enable struct="VkPhysicalDeviceShaderAtomicFloat2FeaturesEXT" feature="shaderBufferFloat64AtomicMinMax" requires="VK_EXT_shader_atomic_float2"/>
+            <enable struct="VkPhysicalDeviceShaderAtomicFloat2FeaturesEXT" feature="shaderSharedFloat64AtomicMinMax" requires="VK_EXT_shader_atomic_float2"/>
+        </spirvcapability>
         <spirvcapability name="Int64ImageEXT">
             <enable struct="VkPhysicalDeviceShaderImageAtomicInt64FeaturesEXT" feature="shaderImageInt64Atomics" requires="VK_EXT_shader_image_atomic_int64"/>
         </spirvcapability>
@@ -17188,5 +17352,17 @@
         <spirvcapability name="WorkgroupMemoryExplicitLayout16BitAccessKHR">
             <enable struct="VkPhysicalDeviceWorkgroupMemoryExplicitLayoutFeaturesKHR" feature="workgroupMemoryExplicitLayout16BitAccess" requires="VK_KHR_workgroup_memory_explicit_layout"/>
         </spirvcapability>
+        <spirvcapability name="DotProductInputAllKHR">
+            <enable struct="VkPhysicalDeviceShaderIntegerDotProductFeaturesKHR" feature="shaderIntegerDotProduct" requires="VK_KHR_shader_integer_dot_product"/>
+        </spirvcapability>
+        <spirvcapability name="DotProductInput4x8BitKHR">
+            <enable struct="VkPhysicalDeviceShaderIntegerDotProductFeaturesKHR" feature="shaderIntegerDotProduct" requires="VK_KHR_shader_integer_dot_product"/>
+        </spirvcapability>
+        <spirvcapability name="DotProductInput4x8BitPackedKHR">
+            <enable struct="VkPhysicalDeviceShaderIntegerDotProductFeaturesKHR" feature="shaderIntegerDotProduct" requires="VK_KHR_shader_integer_dot_product"/>
+        </spirvcapability>
+        <spirvcapability name="DotProductKHR">
+            <enable struct="VkPhysicalDeviceShaderIntegerDotProductFeaturesKHR" feature="shaderIntegerDotProduct" requires="VK_KHR_shader_integer_dot_product"/>
+        </spirvcapability>
     </spirvcapabilities>
 </registry>
diff --git a/third_party/vulkan_memory_allocator/.gitignore b/third_party/vulkan_memory_allocator/.gitignore
index dc84959..f56901a 100644
--- a/third_party/vulkan_memory_allocator/.gitignore
+++ b/third_party/vulkan_memory_allocator/.gitignore
@@ -1,2 +1,13 @@
-build/
+/bin/*
 
+/build/*
+!/build/src/
+/build/src/*
+!/build/src/Release/
+/build/src/Release/*
+!/build/src/Release/VmaSample.exe
+!/build/src/VmaReplay/
+/build/src/VmaReplay/*
+!/build/src/VmaReplay/Release/
+/build/src/VmaReplay/Release/*
+!/build/src/VmaReplay/Release/VmaReplay.exe
diff --git a/third_party/vulkan_memory_allocator/.travis.yml b/third_party/vulkan_memory_allocator/.travis.yml
index 6a59b1e..a0f293b 100644
--- a/third_party/vulkan_memory_allocator/.travis.yml
+++ b/third_party/vulkan_memory_allocator/.travis.yml
@@ -1,7 +1,7 @@
 language: cpp
 sudo: required
 os: linux
-dist: trusty
+dist: bionic
 
 branches:
   only:
@@ -12,24 +12,22 @@
   - gcc
 
 before_script:
-  - sudo apt-get install 
+  - sudo apt-get install
+  - eval "${MATRIX_EVAL}"
 
 install:
-  - wget https://github.com/premake/premake-core/releases/download/v5.0.0-alpha11/premake-5.0.0-alpha11-linux.tar.gz?Human=true -O premake-5.0.0-alpha11-linux.tar.gz
-  - tar -xzvf premake-5.0.0-alpha11-linux.tar.gz
   - sudo apt-get -qq update
   - sudo apt-get install -y libassimp-dev libglm-dev graphviz libxcb-dri3-0 libxcb-present0 libpciaccess0 cmake libpng-dev libxcb-dri3-dev libx11-dev libx11-xcb-dev libmirclient-dev libwayland-dev libxrandr-dev
   - export VK_VERSION=1.2.131.1
-  - wget -O vulkansdk-linux-x86_64-$VK_VERSION.tar.gz https://sdk.lunarg.com/sdk/download/$VK_VERSION/linux/vulkansdk-linux-x86_64-$VK_VERSION.tar.gz
+  - wget -O vulkansdk-linux-x86_64-$VK_VERSION.tar.gz https://sdk.lunarg.com/sdk/download/$VK_VERSION/linux/vulkansdk-linux-x86_64-$VK_VERSION.tar.gz?Human=true
   - tar zxf vulkansdk-linux-x86_64-$VK_VERSION.tar.gz
   - export VULKAN_SDK=$TRAVIS_BUILD_DIR/$VK_VERSION/x86_64
 
 script:
-  - cd premake
-  - ../premake5 gmake
-  - cd ../build
-  - make config=debug_linux-x64
-  - cd ..
+  - mkdir build
+  - cd build
+  - cmake ..
+  - make
 
 notifications:
   email:
diff --git a/third_party/vulkan_memory_allocator/BUILD.gn b/third_party/vulkan_memory_allocator/BUILD.gn
index 495bf9c..e8e4d78 100644
--- a/third_party/vulkan_memory_allocator/BUILD.gn
+++ b/third_party/vulkan_memory_allocator/BUILD.gn
@@ -4,10 +4,15 @@
 #
 # Custom GN integration for VulkanMemoryAllocator.
 
+declare_args() {
+  vma_vulkan_headers_dir = "//third_party/vulkan-deps/vulkan-headers/src"
+}
+
 config("vulkan_memory_allocator_config") {
-  include_dirs = [ "src" ]
+  include_dirs = [ "include" ]
   if (is_clang) {
     cflags_cc = [
+      "-Wno-deprecated-copy",
       "-Wno-implicit-fallthrough",
       "-Wno-nullability-completeness",
       "-Wno-suggest-destructor-override",
@@ -29,15 +34,9 @@
 
 source_set("vulkan_memory_allocator") {
   sources = [
-    "src/vk_mem_alloc.h",
+    "include/vk_mem_alloc.h",
     "vma.cpp",
   ]
-  deps = [ "//third_party/vulkan-deps/vulkan-headers/src:vulkan_headers" ]
+  deps = [ "${vma_vulkan_headers_dir}:vulkan_headers" ]
   public_configs = [ ":vulkan_memory_allocator_config" ]
 }
-
-# TODO: remove this target when chrome and ANGLE are updated to use
-# vulkan_memory_allocator
-source_set("vulkan_memory_allocator_with_usage") {
-  public_deps = [ ":vulkan_memory_allocator" ]
-}
diff --git a/third_party/vulkan_memory_allocator/CMakeLists.txt b/third_party/vulkan_memory_allocator/CMakeLists.txt
new file mode 100644
index 0000000..3c323ce
--- /dev/null
+++ b/third_party/vulkan_memory_allocator/CMakeLists.txt
@@ -0,0 +1,33 @@
+cmake_minimum_required(VERSION 3.9)
+
+project(VulkanMemoryAllocator)
+
+find_package(Vulkan REQUIRED)
+
+# VulkanMemoryAllocator contains an sample application and VmaReplay which are not build by default
+option(VMA_BUILD_SAMPLE "Build VulkanMemoryAllocator sample application" OFF)
+option(VMA_BUILD_SAMPLE_SHADERS "Build VulkanMemoryAllocator sample application's shaders" OFF)
+option(VMA_BUILD_REPLAY "Build VulkanMemoryAllocator replay application" OFF)
+
+message(STATUS "VMA_BUILD_SAMPLE = ${VMA_BUILD_SAMPLE}")
+message(STATUS "VMA_BUILD_SAMPLE_SHADERS = ${VMA_BUILD_SAMPLE_SHADERS}")
+message(STATUS "VMA_BUILD_REPLAY = ${VMA_BUILD_REPLAY}")
+
+option(VMA_RECORDING_ENABLED "Enable VMA memory recording for debugging" OFF)
+option(VMA_USE_STL_CONTAINERS "Use C++ STL containers instead of VMA's containers" OFF)
+option(VMA_STATIC_VULKAN_FUNCTIONS "Link statically with Vulkan API" OFF)
+option(VMA_DYNAMIC_VULKAN_FUNCTIONS "Fetch pointers to Vulkan functions internally (no static linking)" ON)
+option(VMA_DEBUG_ALWAYS_DEDICATED_MEMORY "Every allocation will have its own memory block" OFF)
+option(VMA_DEBUG_INITIALIZE_ALLOCATIONS "Automatically fill new allocations and destroyed allocations with some bit pattern" OFF)
+option(VMA_DEBUG_GLOBAL_MUTEX "Enable single mutex protecting all entry calls to the library" OFF)
+option(VMA_DEBUG_DONT_EXCEED_MAX_MEMORY_ALLOCATION_COUNT "Never exceed VkPhysicalDeviceLimits::maxMemoryAllocationCount and return error" OFF)
+
+message(STATUS "VMA_RECORDING_ENABLED = ${VMA_RECORDING_ENABLED}")
+message(STATUS "VMA_USE_STL_CONTAINERS = ${VMA_USE_STL_CONTAINERS}")
+message(STATUS "VMA_DYNAMIC_VULKAN_FUNCTIONS = ${VMA_DYNAMIC_VULKAN_FUNCTIONS}")
+message(STATUS "VMA_DEBUG_ALWAYS_DEDICATED_MEMORY = ${VMA_DEBUG_ALWAYS_DEDICATED_MEMORY}")
+message(STATUS "VMA_DEBUG_INITIALIZE_ALLOCATIONS = ${VMA_DEBUG_INITIALIZE_ALLOCATIONS}")
+message(STATUS "VMA_DEBUG_GLOBAL_MUTEX = ${VMA_DEBUG_GLOBAL_MUTEX}")
+message(STATUS "VMA_DEBUG_DONT_EXCEED_MAX_MEMORY_ALLOCATION_COUNT = ${VMA_DEBUG_DONT_EXCEED_MAX_MEMORY_ALLOCATION_COUNT}")
+
+add_subdirectory(src)
diff --git a/third_party/vulkan_memory_allocator/src/Doxyfile b/third_party/vulkan_memory_allocator/Doxyfile
similarity index 92%
rename from third_party/vulkan_memory_allocator/src/Doxyfile
rename to third_party/vulkan_memory_allocator/Doxyfile
index 7950829..5629175 100644
--- a/third_party/vulkan_memory_allocator/src/Doxyfile
+++ b/third_party/vulkan_memory_allocator/Doxyfile
@@ -1,4 +1,4 @@
-# Doxyfile 1.8.16
+# Doxyfile 1.9.1
 
 # This file describes the settings to be used by the documentation system
 # doxygen (www.doxygen.org) for a project.
@@ -58,7 +58,7 @@
 # entered, it will be relative to the location where doxygen was started. If
 # left blank the current directory will be used.
 
-OUTPUT_DIRECTORY       = ../docs
+OUTPUT_DIRECTORY       = docs
 
 # If the CREATE_SUBDIRS tag is set to YES then doxygen will create 4096 sub-
 # directories (in 2 levels) under the output directory of each output format and
@@ -227,6 +227,14 @@
 
 MULTILINE_CPP_IS_BRIEF = NO
 
+# By default Python docstrings are displayed as preformatted text and doxygen's
+# special commands cannot be used. By setting PYTHON_DOCSTRING to NO the
+# doxygen's special commands can be used and the contents of the docstring
+# documentation blocks is shown as doxygen documentation.
+# The default value is: YES.
+
+PYTHON_DOCSTRING       = YES
+
 # If the INHERIT_DOCS tag is set to YES then an undocumented member inherits the
 # documentation from any documented member that it re-implements.
 # The default value is: YES.
@@ -263,12 +271,6 @@
 
 ALIASES                =
 
-# This tag can be used to specify a number of word-keyword mappings (TCL only).
-# A mapping has the form "name=value". For example adding "class=itcl::class"
-# will allow you to use the command class in the itcl::class meaning.
-
-TCL_SUBST              =
-
 # Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C sources
 # only. Doxygen will then generate output that is more tailored for C. For
 # instance, some of the names that are used will be different. The list of all
@@ -309,19 +311,22 @@
 # parses. With this tag you can assign which parser to use for a given
 # extension. Doxygen has a built-in mapping, but you can override or extend it
 # using this tag. The format is ext=language, where ext is a file extension, and
-# language is one of the parsers supported by doxygen: IDL, Java, Javascript,
-# Csharp (C#), C, C++, D, PHP, md (Markdown), Objective-C, Python, Slice,
+# language is one of the parsers supported by doxygen: IDL, Java, JavaScript,
+# Csharp (C#), C, C++, D, PHP, md (Markdown), Objective-C, Python, Slice, VHDL,
 # Fortran (fixed format Fortran: FortranFixed, free formatted Fortran:
 # FortranFree, unknown formatted Fortran: Fortran. In the later case the parser
 # tries to guess whether the code is fixed or free formatted code, this is the
-# default for Fortran type files), VHDL, tcl. For instance to make doxygen treat
-# .inc files as Fortran files (default is PHP), and .f files as C (default is
-# Fortran), use: inc=Fortran f=C.
+# default for Fortran type files). For instance to make doxygen treat .inc files
+# as Fortran files (default is PHP), and .f files as C (default is Fortran),
+# use: inc=Fortran f=C.
 #
 # Note: For files without extension you can use no_extension as a placeholder.
 #
 # Note that for custom extensions you also need to set FILE_PATTERNS otherwise
-# the files are not read by doxygen.
+# the files are not read by doxygen. When specifying no_extension you should add
+# * to the FILE_PATTERNS.
+#
+# Note see also the list of default file extension mappings.
 
 EXTENSION_MAPPING      =
 
@@ -455,6 +460,19 @@
 
 LOOKUP_CACHE_SIZE      = 0
 
+# The NUM_PROC_THREADS specifies the number threads doxygen is allowed to use
+# during processing. When set to 0 doxygen will based this on the number of
+# cores available in the system. You can set it explicitly to a value larger
+# than 0 to get more control over the balance between CPU load and processing
+# speed. At this moment only the input processing can be done using multiple
+# threads. Since this is still an experimental feature the default is set to 1,
+# which efficively disables parallel processing. Please report any issues you
+# encounter. Generating dot graphs in parallel is controlled by the
+# DOT_NUM_THREADS setting.
+# Minimum value: 0, maximum value: 32, default value: 1.
+
+NUM_PROC_THREADS       = 1
+
 #---------------------------------------------------------------------------
 # Build related configuration options
 #---------------------------------------------------------------------------
@@ -518,6 +536,13 @@
 
 EXTRACT_ANON_NSPACES   = NO
 
+# If this flag is set to YES, the name of an unnamed parameter in a declaration
+# will be determined by the corresponding definition. By default unnamed
+# parameters remain unnamed in the output.
+# The default value is: YES.
+
+RESOLVE_UNNAMED_PARAMS = YES
+
 # If the HIDE_UNDOC_MEMBERS tag is set to YES, doxygen will hide all
 # undocumented members inside documented classes or files. If set to NO these
 # members will be included in the various overviews, but no documentation
@@ -535,8 +560,8 @@
 HIDE_UNDOC_CLASSES     = NO
 
 # If the HIDE_FRIEND_COMPOUNDS tag is set to YES, doxygen will hide all friend
-# (class|struct|union) declarations. If set to NO, these declarations will be
-# included in the documentation.
+# declarations. If set to NO, these declarations will be included in the
+# documentation.
 # The default value is: NO.
 
 HIDE_FRIEND_COMPOUNDS  = NO
@@ -555,11 +580,18 @@
 
 INTERNAL_DOCS          = NO
 
-# If the CASE_SENSE_NAMES tag is set to NO then doxygen will only generate file
-# names in lower-case letters. If set to YES, upper-case letters are also
-# allowed. This is useful if you have classes or files whose names only differ
-# in case and if your file system supports case sensitive file names. Windows
-# (including Cygwin) ands Mac users are advised to set this option to NO.
+# With the correct setting of option CASE_SENSE_NAMES doxygen will better be
+# able to match the capabilities of the underlying filesystem. In case the
+# filesystem is case sensitive (i.e. it supports files in the same directory
+# whose names only differ in casing), the option must be set to YES to properly
+# deal with such files in case they appear in the input. For filesystems that
+# are not case sensitive the option should be be set to NO to properly deal with
+# output files written for symbols that only differ in casing, such as for two
+# classes, one named CLASS and the other named Class, and to also support
+# references to files without having to specify the exact matching casing. On
+# Windows (including Cygwin) and MacOS, users should typically set this option
+# to NO, whereas on Linux or other Unix flavors it should typically be set to
+# YES.
 # The default value is: system dependent.
 
 CASE_SENSE_NAMES       = NO
@@ -798,7 +830,10 @@
 WARN_NO_PARAMDOC       = NO
 
 # If the WARN_AS_ERROR tag is set to YES then doxygen will immediately stop when
-# a warning is encountered.
+# a warning is encountered. If the WARN_AS_ERROR tag is set to FAIL_ON_WARNINGS
+# then doxygen will continue running as if WARN_AS_ERROR tag is set to NO, but
+# at the end of the doxygen process doxygen will return with a non-zero status.
+# Possible values are: NO, YES and FAIL_ON_WARNINGS.
 # The default value is: NO.
 
 WARN_AS_ERROR          = NO
@@ -829,13 +864,13 @@
 # spaces. See also FILE_PATTERNS and EXTENSION_MAPPING
 # Note: If this tag is empty the current directory is searched.
 
-INPUT                  = vk_mem_alloc.h
+INPUT                  = include/vk_mem_alloc.h
 
 # This tag can be used to specify the character encoding of the source files
 # that doxygen parses. Internally doxygen uses the UTF-8 encoding. Doxygen uses
 # libiconv (or the iconv built into libc) for the transcoding. See the libiconv
-# documentation (see: https://www.gnu.org/software/libiconv/) for the list of
-# possible encodings.
+# documentation (see:
+# https://www.gnu.org/software/libiconv/) for the list of possible encodings.
 # The default value is: UTF-8.
 
 INPUT_ENCODING         = UTF-8
@@ -848,11 +883,15 @@
 # need to set EXTENSION_MAPPING for the extension otherwise the files are not
 # read by doxygen.
 #
+# Note the list of default checked file patterns might differ from the list of
+# default file extension mappings.
+#
 # If left blank the following patterns are tested:*.c, *.cc, *.cxx, *.cpp,
 # *.c++, *.java, *.ii, *.ixx, *.ipp, *.i++, *.inl, *.idl, *.ddl, *.odl, *.h,
 # *.hh, *.hxx, *.hpp, *.h++, *.cs, *.d, *.php, *.php4, *.php5, *.phtml, *.inc,
-# *.m, *.markdown, *.md, *.mm, *.dox, *.py, *.pyw, *.f90, *.f95, *.f03, *.f08,
-# *.f, *.for, *.tcl, *.vhd, *.vhdl, *.ucf, *.qsf and *.ice.
+# *.m, *.markdown, *.md, *.mm, *.dox (to be provided as doxygen C comment),
+# *.py, *.pyw, *.f90, *.f95, *.f03, *.f08, *.f18, *.f, *.for, *.vhd, *.vhdl,
+# *.ucf, *.qsf and *.ice.
 
 FILE_PATTERNS          = *.c \
                          *.cc \
@@ -1110,16 +1149,22 @@
 VERBATIM_HEADERS       = YES
 
 # If the CLANG_ASSISTED_PARSING tag is set to YES then doxygen will use the
-# clang parser (see: http://clang.llvm.org/) for more accurate parsing at the
-# cost of reduced performance. This can be particularly helpful with template
-# rich C++ code for which doxygen's built-in parser lacks the necessary type
-# information.
+# clang parser (see:
+# http://clang.llvm.org/) for more accurate parsing at the cost of reduced
+# performance. This can be particularly helpful with template rich C++ code for
+# which doxygen's built-in parser lacks the necessary type information.
 # Note: The availability of this option depends on whether or not doxygen was
 # generated with the -Duse_libclang=ON option for CMake.
 # The default value is: NO.
 
 CLANG_ASSISTED_PARSING = NO
 
+# If clang assisted parsing is enabled and the CLANG_ADD_INC_PATHS tag is set to
+# YES then doxygen will add the directory of each input to the include path.
+# The default value is: YES.
+
+CLANG_ADD_INC_PATHS    = YES
+
 # If clang assisted parsing is enabled you can provide the compiler with command
 # line options that you would normally use when invoking the compiler. Note that
 # the include paths will already be set by doxygen for the files and directories
@@ -1129,10 +1174,13 @@
 CLANG_OPTIONS          =
 
 # If clang assisted parsing is enabled you can provide the clang parser with the
-# path to the compilation database (see:
-# http://clang.llvm.org/docs/HowToSetupToolingForLLVM.html) used when the files
-# were built. This is equivalent to specifying the "-p" option to a clang tool,
-# such as clang-check. These options will then be passed to the parser.
+# path to the directory containing a file called compile_commands.json. This
+# file is the compilation database (see:
+# http://clang.llvm.org/docs/HowToSetupToolingForLLVM.html) containing the
+# options used when the source files were built. This is equivalent to
+# specifying the -p option to a clang tool, such as clang-check. These options
+# will then be passed to the parser. Any options specified with CLANG_OPTIONS
+# will be added as well.
 # Note: The availability of this option depends on whether or not doxygen was
 # generated with the -Duse_libclang=ON option for CMake.
 
@@ -1149,13 +1197,6 @@
 
 ALPHABETICAL_INDEX     = YES
 
-# The COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns in
-# which the alphabetical index list will be split.
-# Minimum value: 1, maximum value: 20, default value: 5.
-# This tag requires that the tag ALPHABETICAL_INDEX is set to YES.
-
-COLS_IN_ALPHA_INDEX    = 5
-
 # In case all classes in a project start with a common prefix, all classes will
 # be put under the same header in the alphabetical index. The IGNORE_PREFIX tag
 # can be used to specify a prefix (or a list of prefixes) that should be ignored
@@ -1294,9 +1335,9 @@
 
 # If the HTML_DYNAMIC_MENUS tag is set to YES then the generated HTML
 # documentation will contain a main index with vertical navigation menus that
-# are dynamically created via Javascript. If disabled, the navigation index will
+# are dynamically created via JavaScript. If disabled, the navigation index will
 # consists of multiple levels of tabs that are statically embedded in every HTML
-# page. Disable this option to support browsers that do not have Javascript,
+# page. Disable this option to support browsers that do not have JavaScript,
 # like the Qt help browser.
 # The default value is: YES.
 # This tag requires that the tag GENERATE_HTML is set to YES.
@@ -1326,10 +1367,11 @@
 
 # If the GENERATE_DOCSET tag is set to YES, additional index files will be
 # generated that can be used as input for Apple's Xcode 3 integrated development
-# environment (see: https://developer.apple.com/xcode/), introduced with OSX
-# 10.5 (Leopard). To create a documentation set, doxygen will generate a
-# Makefile in the HTML output directory. Running make will produce the docset in
-# that directory and running make install will install the docset in
+# environment (see:
+# https://developer.apple.com/xcode/), introduced with OSX 10.5 (Leopard). To
+# create a documentation set, doxygen will generate a Makefile in the HTML
+# output directory. Running make will produce the docset in that directory and
+# running make install will install the docset in
 # ~/Library/Developer/Shared/Documentation/DocSets so that Xcode will find it at
 # startup. See https://developer.apple.com/library/archive/featuredarticles/Doxy
 # genXcode/_index.html for more information.
@@ -1371,8 +1413,8 @@
 # If the GENERATE_HTMLHELP tag is set to YES then doxygen generates three
 # additional HTML index files: index.hhp, index.hhc, and index.hhk. The
 # index.hhp is a project file that can be read by Microsoft's HTML Help Workshop
-# (see: https://www.microsoft.com/en-us/download/details.aspx?id=21138) on
-# Windows.
+# (see:
+# https://www.microsoft.com/en-us/download/details.aspx?id=21138) on Windows.
 #
 # The HTML Help Workshop contains a compiler that can convert all HTML output
 # generated by doxygen into a single compiled HTML file (.chm). Compiled HTML
@@ -1402,7 +1444,7 @@
 HHC_LOCATION           =
 
 # The GENERATE_CHI flag controls if a separate .chi index file is generated
-# (YES) or that it should be included in the master .chm file (NO).
+# (YES) or that it should be included in the main .chm file (NO).
 # The default value is: NO.
 # This tag requires that the tag GENERATE_HTMLHELP is set to YES.
 
@@ -1447,7 +1489,8 @@
 
 # The QHP_NAMESPACE tag specifies the namespace to use when generating Qt Help
 # Project output. For more information please see Qt Help Project / Namespace
-# (see: https://doc.qt.io/archives/qt-4.8/qthelpproject.html#namespace).
+# (see:
+# https://doc.qt.io/archives/qt-4.8/qthelpproject.html#namespace).
 # The default value is: org.doxygen.Project.
 # This tag requires that the tag GENERATE_QHP is set to YES.
 
@@ -1455,8 +1498,8 @@
 
 # The QHP_VIRTUAL_FOLDER tag specifies the namespace to use when generating Qt
 # Help Project output. For more information please see Qt Help Project / Virtual
-# Folders (see: https://doc.qt.io/archives/qt-4.8/qthelpproject.html#virtual-
-# folders).
+# Folders (see:
+# https://doc.qt.io/archives/qt-4.8/qthelpproject.html#virtual-folders).
 # The default value is: doc.
 # This tag requires that the tag GENERATE_QHP is set to YES.
 
@@ -1464,16 +1507,16 @@
 
 # If the QHP_CUST_FILTER_NAME tag is set, it specifies the name of a custom
 # filter to add. For more information please see Qt Help Project / Custom
-# Filters (see: https://doc.qt.io/archives/qt-4.8/qthelpproject.html#custom-
-# filters).
+# Filters (see:
+# https://doc.qt.io/archives/qt-4.8/qthelpproject.html#custom-filters).
 # This tag requires that the tag GENERATE_QHP is set to YES.
 
 QHP_CUST_FILTER_NAME   =
 
 # The QHP_CUST_FILTER_ATTRS tag specifies the list of the attributes of the
 # custom filter to add. For more information please see Qt Help Project / Custom
-# Filters (see: https://doc.qt.io/archives/qt-4.8/qthelpproject.html#custom-
-# filters).
+# Filters (see:
+# https://doc.qt.io/archives/qt-4.8/qthelpproject.html#custom-filters).
 # This tag requires that the tag GENERATE_QHP is set to YES.
 
 QHP_CUST_FILTER_ATTRS  =
@@ -1485,9 +1528,9 @@
 
 QHP_SECT_FILTER_ATTRS  =
 
-# The QHG_LOCATION tag can be used to specify the location of Qt's
-# qhelpgenerator. If non-empty doxygen will try to run qhelpgenerator on the
-# generated .qhp file.
+# The QHG_LOCATION tag can be used to specify the location (absolute path
+# including file name) of Qt's qhelpgenerator. If non-empty doxygen will try to
+# run qhelpgenerator on the generated .qhp file.
 # This tag requires that the tag GENERATE_QHP is set to YES.
 
 QHG_LOCATION           =
@@ -1564,6 +1607,17 @@
 
 EXT_LINKS_IN_WINDOW    = NO
 
+# If the HTML_FORMULA_FORMAT option is set to svg, doxygen will use the pdf2svg
+# tool (see https://github.com/dawbarton/pdf2svg) or inkscape (see
+# https://inkscape.org) to generate formulas as SVG images instead of PNGs for
+# the HTML output. These images will generally look nicer at scaled resolutions.
+# Possible values are: png (the default) and svg (looks nicer but requires the
+# pdf2svg or inkscape tool).
+# The default value is: png.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_FORMULA_FORMAT    = png
+
 # Use this tag to change the font size of LaTeX formulas included as images in
 # the HTML documentation. When you change the font size after a successful
 # doxygen run you need to manually remove any form_*.png images from the HTML
@@ -1584,8 +1638,14 @@
 
 FORMULA_TRANSPARENT    = YES
 
+# The FORMULA_MACROFILE can contain LaTeX \newcommand and \renewcommand commands
+# to create new LaTeX commands to be used in formulas as building blocks. See
+# the section "Including formulas" for details.
+
+FORMULA_MACROFILE      =
+
 # Enable the USE_MATHJAX option to render LaTeX formulas using MathJax (see
-# https://www.mathjax.org) which uses client side Javascript for the rendering
+# https://www.mathjax.org) which uses client side JavaScript for the rendering
 # instead of using pre-rendered bitmaps. Use this if you do not have LaTeX
 # installed or if you want to formulas look prettier in the HTML output. When
 # enabled you may also need to install MathJax separately and configure the path
@@ -1597,7 +1657,7 @@
 
 # When MathJax is enabled you can set the default output format to be used for
 # the MathJax output. See the MathJax site (see:
-# http://docs.mathjax.org/en/latest/output.html) for more details.
+# http://docs.mathjax.org/en/v2.7-latest/output.html) for more details.
 # Possible values are: HTML-CSS (which is slower, but has the best
 # compatibility), NativeMML (i.e. MathML) and SVG.
 # The default value is: HTML-CSS.
@@ -1613,7 +1673,7 @@
 # Content Delivery Network so you can quickly see the result without installing
 # MathJax. However, it is strongly recommended to install a local copy of
 # MathJax from https://www.mathjax.org before deployment.
-# The default value is: https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.5/.
+# The default value is: https://cdn.jsdelivr.net/npm/mathjax@2.
 # This tag requires that the tag USE_MATHJAX is set to YES.
 
 MATHJAX_RELPATH        = http://cdn.mathjax.org/mathjax/latest
@@ -1627,7 +1687,8 @@
 
 # The MATHJAX_CODEFILE tag can be used to specify a file with javascript pieces
 # of code that will be used on startup of the MathJax code. See the MathJax site
-# (see: http://docs.mathjax.org/en/latest/output.html) for more details. For an
+# (see:
+# http://docs.mathjax.org/en/v2.7-latest/output.html) for more details. For an
 # example see the documentation.
 # This tag requires that the tag USE_MATHJAX is set to YES.
 
@@ -1655,7 +1716,7 @@
 SEARCHENGINE           = YES
 
 # When the SERVER_BASED_SEARCH tag is enabled the search engine will be
-# implemented using a web server instead of a web client using Javascript. There
+# implemented using a web server instead of a web client using JavaScript. There
 # are two flavors of web server based searching depending on the EXTERNAL_SEARCH
 # setting. When disabled, doxygen will generate a PHP script for searching and
 # an index file used by the script. When EXTERNAL_SEARCH is enabled the indexing
@@ -1674,7 +1735,8 @@
 #
 # Doxygen ships with an example indexer (doxyindexer) and search engine
 # (doxysearch.cgi) which are based on the open source search engine library
-# Xapian (see: https://xapian.org/).
+# Xapian (see:
+# https://xapian.org/).
 #
 # See the section "External Indexing and Searching" for details.
 # The default value is: NO.
@@ -1687,8 +1749,9 @@
 #
 # Doxygen ships with an example indexer (doxyindexer) and search engine
 # (doxysearch.cgi) which are based on the open source search engine library
-# Xapian (see: https://xapian.org/). See the section "External Indexing and
-# Searching" for details.
+# Xapian (see:
+# https://xapian.org/). See the section "External Indexing and Searching" for
+# details.
 # This tag requires that the tag SEARCHENGINE is set to YES.
 
 SEARCHENGINE_URL       =
@@ -1852,9 +1915,11 @@
 
 PDF_HYPERLINKS         = YES
 
-# If the USE_PDFLATEX tag is set to YES, doxygen will use pdflatex to generate
-# the PDF file directly from the LaTeX files. Set this option to YES, to get a
-# higher quality PDF documentation.
+# If the USE_PDFLATEX tag is set to YES, doxygen will use the engine as
+# specified with LATEX_CMD_NAME to generate the PDF file directly from the LaTeX
+# files. Set this option to YES, to get a higher quality PDF documentation.
+#
+# See also section LATEX_CMD_NAME for selecting the engine.
 # The default value is: YES.
 # This tag requires that the tag GENERATE_LATEX is set to YES.
 
@@ -2188,7 +2253,13 @@
 # recursively expanded use the := operator instead of the = operator.
 # This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
 
-PREDEFINED             = VMA_CALL_PRE= VMA_CALL_POST= VMA_NOT_NULL= VMA_NULLABLE= VMA_LEN_IF_NOT_NULL(len)= VMA_NOT_NULL_NON_DISPATCHABLE= VMA_NULLABLE_NON_DISPATCHABLE=
+PREDEFINED             = VMA_CALL_PRE= \
+                         VMA_CALL_POST= \
+                         VMA_NOT_NULL= \
+                         VMA_NULLABLE= \
+                         VMA_LEN_IF_NOT_NULL(len)= \
+                         VMA_NOT_NULL_NON_DISPATCHABLE= \
+                         VMA_NULLABLE_NON_DISPATCHABLE=
 
 # If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then this
 # tag can be used to specify a list of macro names that should be expanded. The
@@ -2365,10 +2436,32 @@
 # but if the number exceeds 15, the total amount of fields shown is limited to
 # 10.
 # Minimum value: 0, maximum value: 100, default value: 10.
-# This tag requires that the tag HAVE_DOT is set to YES.
+# This tag requires that the tag UML_LOOK is set to YES.
 
 UML_LIMIT_NUM_FIELDS   = 10
 
+# If the DOT_UML_DETAILS tag is set to NO, doxygen will show attributes and
+# methods without types and arguments in the UML graphs. If the DOT_UML_DETAILS
+# tag is set to YES, doxygen will add type and arguments for attributes and
+# methods in the UML graphs. If the DOT_UML_DETAILS tag is set to NONE, doxygen
+# will not generate fields with class member information in the UML graphs. The
+# class diagrams will look similar to the default class diagrams but using UML
+# notation for the relationships.
+# Possible values are: NO, YES and NONE.
+# The default value is: NO.
+# This tag requires that the tag UML_LOOK is set to YES.
+
+DOT_UML_DETAILS        = NO
+
+# The DOT_WRAP_THRESHOLD tag can be used to set the maximum number of characters
+# to display on a single line. If the actual line length exceeds this threshold
+# significantly it will wrapped across multiple lines. Some heuristics are apply
+# to avoid ugly line breaks.
+# Minimum value: 0, maximum value: 1000, default value: 17.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_WRAP_THRESHOLD     = 17
+
 # If the TEMPLATE_RELATIONS tag is set to YES then the inheritance and
 # collaboration graphs will show the relations between templates and their
 # instances.
@@ -2558,9 +2651,11 @@
 
 GENERATE_LEGEND        = YES
 
-# If the DOT_CLEANUP tag is set to YES, doxygen will remove the intermediate dot
+# If the DOT_CLEANUP tag is set to YES, doxygen will remove the intermediate
 # files that are used to generate the various graphs.
+#
+# Note: This setting is not only used for dot files but also for msc and
+# plantuml temporary files.
 # The default value is: YES.
-# This tag requires that the tag HAVE_DOT is set to YES.
 
 DOT_CLEANUP            = YES
diff --git a/third_party/vulkan_memory_allocator/LICENSE.txt b/third_party/vulkan_memory_allocator/LICENSE.txt
index bee6af7..71e824f 100644
--- a/third_party/vulkan_memory_allocator/LICENSE.txt
+++ b/third_party/vulkan_memory_allocator/LICENSE.txt
@@ -1,4 +1,4 @@
-Copyright (c) 2017-2020 Advanced Micro Devices, Inc. All rights reserved.
+Copyright (c) 2017-2021 Advanced Micro Devices, Inc. All rights reserved.
 
 Permission is hereby granted, free of charge, to any person obtaining a copy
 of this software and associated documentation files (the "Software"), to deal
diff --git a/third_party/vulkan_memory_allocator/README.md b/third_party/vulkan_memory_allocator/README.md
index b583893..b1e2dba 100644
--- a/third_party/vulkan_memory_allocator/README.md
+++ b/third_party/vulkan_memory_allocator/README.md
@@ -2,7 +2,7 @@
 
 Easy to integrate Vulkan memory allocation library.
 
-**Documentation:** See [Vulkan Memory Allocator](https://gpuopen-librariesandsdks.github.io/VulkanMemoryAllocator/html/) (generated from Doxygen-style comments in [src/vk_mem_alloc.h](src/vk_mem_alloc.h))
+**Documentation:** See [Vulkan Memory Allocator](https://gpuopen-librariesandsdks.github.io/VulkanMemoryAllocator/html/) (generated from Doxygen-style comments in [include/vk_mem_alloc.h](include/vk_mem_alloc.h))
 
 **License:** MIT. See [LICENSE.txt](LICENSE.txt)
 
@@ -13,7 +13,7 @@
 **Build status:**
 
 - Windows: [![Build status](https://ci.appveyor.com/api/projects/status/4vlcrb0emkaio2pn/branch/master?svg=true)](https://ci.appveyor.com/project/adam-sawicki-amd/vulkanmemoryallocator/branch/master)  
-- Linux: [![Build Status](https://travis-ci.org/GPUOpen-LibrariesAndSDKs/VulkanMemoryAllocator.svg?branch=master)](https://travis-ci.org/GPUOpen-LibrariesAndSDKs/VulkanMemoryAllocator)
+- Linux: [![Build Status](https://travis-ci.com/GPUOpen-LibrariesAndSDKs/VulkanMemoryAllocator.svg?branch=master)](https://travis-ci.com/GPUOpen-LibrariesAndSDKs/VulkanMemoryAllocator)
 
 # Problem
 
@@ -37,11 +37,12 @@
 Additional features:
 
 - Well-documented - description of all functions and structures provided, along with chapters that contain general description and example code.
-- Thread-safety: Library is designed to be used by multithreaded code.
+- Thread-safety: Library is designed to be used in multithreaded code. Access to a single device memory block referred by different buffers and textures (binding, mapping) is synchronized internally.
 - Configuration: Fill optional members of CreateInfo structure to provide custom CPU memory allocator, pointers to Vulkan functions and other parameters.
 - Customization: Predefine appropriate macros to provide your own implementation of all external facilities used by the library, from assert, mutex, and atomic, to vector and linked list. 
 - Support for memory mapping, reference-counted internally. Support for persistently mapped memory: Just allocate with appropriate flag and you get access to mapped pointer.
 - Support for non-coherent memory. Functions that flush/invalidate memory. `nonCoherentAtomSize` is respected automatically.
+- Support for resource aliasing (overlap).
 - Support for sparse binding and sparse residency: Convenience functions that allocate or free multiple memory pages at once.
 - Custom memory pools: Create a pool with desired parameters (e.g. fixed or limited maximum size) and allocate memory out of it.
 - Linear allocator: Create a pool with linear algorithm and use it for much faster allocations and deallocations in free-at-once, stack, double stack, or ring buffer fashion.
@@ -93,9 +94,45 @@
 
 `VmaAllocation` is an object that represents memory assigned to this buffer. It can be queried for parameters like Vulkan memory handle and offset.
 
+# How to build
+
+On Windows it is recommended to use [CMake UI](https://cmake.org/runningcmake/). Alternatively you can generate a Visual Studio project map using CMake in command line: `cmake -B./build/ -DCMAKE_BUILD_TYPE=Debug -G "Visual Studio 16 2019" -A x64 ./`
+
+On Linux:
+
+```
+mkdir build
+cd build
+cmake ..
+make
+```
+
+The following targets are available
+
+| Target | Description | CMake option | Default setting |
+| ------------- | ------------- | ------------- | ------------- |
+| VmaSample | VMA sample application | `VMA_BUILD_SAMPLE` | `OFF` |
+| VmaBuildSampleShaders | Shaders for VmaSample | `VMA_BUILD_SAMPLE_SHADERS` | `OFF` |
+| VmaReplay | Replay tool for VMA .csv trace files | `VMA_BUILD_REPLAY` | `OFF` |
+
+Please note that while VulkanMemoryAllocator library is supported on other platforms besides Windows, VmaSample and VmaReplay are not.
+
+These CMake options are available
+
+| CMake option | Description | Default setting |
+| ------------- | ------------- | ------------- |
+| `VMA_RECORDING_ENABLED` | Enable VMA memory recording for debugging | `OFF` |
+| `VMA_USE_STL_CONTAINERS` | Use C++ STL containers instead of VMA's containers | `OFF` |
+| `VMA_STATIC_VULKAN_FUNCTIONS` | Link statically with Vulkan API | `OFF` |
+| `VMA_DYNAMIC_VULKAN_FUNCTIONS` | Fetch pointers to Vulkan functions internally (no static linking) | `ON` |
+| `VMA_DEBUG_ALWAYS_DEDICATED_MEMORY` | Every allocation will have its own memory block | `OFF` |
+| `VMA_DEBUG_INITIALIZE_ALLOCATIONS` | Automatically fill new allocations and destroyed allocations with some bit pattern | `OFF` |
+| `VMA_DEBUG_GLOBAL_MUTEX` | Enable single mutex protecting all entry calls to the library | `OFF` |
+| `VMA_DEBUG_DONT_EXCEED_MAX_MEMORY_ALLOCATION_COUNT` | Never exceed [VkPhysicalDeviceLimits::maxMemoryAllocationCount](https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#limits-maxMemoryAllocationCount) and return error | `OFF` |
+
 # Binaries
 
-The release comes with precompiled binary executables for "VulkanSample" application which contains test suite and "VmaReplay" tool. They are compiled using Visual Studio 2017, so they require appropriate libraries to work, including "vcruntime140.dll" and "msvcp140.dll". If their launch fails with error message telling about those files missing, please download and install [Microsoft Visual C++ Redistributable for Visual Studio 2015, 2017 and 2019](https://support.microsoft.com/en-us/help/2977003/the-latest-supported-visual-c-downloads), "x64" version.
+The release comes with precompiled binary executables for "VulkanSample" application which contains test suite and "VmaReplay" tool. They are compiled using Visual Studio 2019, so they require appropriate libraries to work, including "MSVCP140.dll", "VCRUNTIME140.dll", "VCRUNTIME140_1.dll". If their launch fails with error message telling about those files missing, please download and install [Microsoft Visual C++ Redistributable for Visual Studio 2015, 2017 and 2019](https://support.microsoft.com/en-us/help/2977003/the-latest-supported-visual-c-downloads), "x64" version.
 
 # Read more
 
@@ -103,9 +140,11 @@
 
 # Software using this library
 
+- **[Detroit: Become Human](https://gpuopen.com/learn/porting-detroit-3/)**
 - **[Vulkan Samples](https://github.com/LunarG/VulkanSamples)** - official Khronos Vulkan samples. License: Apache-style.
 - **[Anvil](https://github.com/GPUOpen-LibrariesAndSDKs/Anvil)** - cross-platform framework for Vulkan. License: MIT.
 - **[Filament](https://github.com/google/filament)** - physically based rendering engine for Android, Windows, Linux and macOS, from Google. Apache License 2.0.
+- **[Atypical Games - proprietary game engine](https://developer.samsung.com/galaxy-gamedev/gamedev-blog/infinitejet.html)**
 - **[Flax Engine](https://flaxengine.com/)**
 - **[Lightweight Java Game Library (LWJGL)](https://www.lwjgl.org/)** - includes binding of the library for Java. License: BSD.
 - **[PowerVR SDK](https://github.com/powervr-graphics/Native_SDK)** - C++ cross-platform 3D graphics SDK, from Imagination. License: MIT.
@@ -115,6 +154,7 @@
 - **[vkDOOM3](https://github.com/DustinHLand/vkDOOM3)** - Vulkan port of GPL DOOM 3 BFG Edition. License: GNU GPL.
 - **[vkQuake2](https://github.com/kondrak/vkQuake2)** - vanilla Quake 2 with Vulkan support. License: GNU GPL.
 - **[Vulkan Best Practice for Mobile Developers](https://github.com/ARM-software/vulkan_best_practice_for_mobile_developers)** from ARM. License: MIT.
+- **[RPCS3](https://github.com/RPCS3/rpcs3)** - PlayStation 3 emulator/debugger. License: GNU GPLv2.
 
 [Many other projects on GitHub](https://github.com/search?q=AMD_VULKAN_MEMORY_ALLOCATOR_H&type=Code) and some game development studios that use Vulkan in their games.
 
diff --git a/third_party/vulkan_memory_allocator/bin/Shader.frag.spv b/third_party/vulkan_memory_allocator/bin/Shader.frag.spv
deleted file mode 100644
index f09dacb..0000000
--- a/third_party/vulkan_memory_allocator/bin/Shader.frag.spv
+++ /dev/null
Binary files differ
diff --git a/third_party/vulkan_memory_allocator/bin/Shader.vert.spv b/third_party/vulkan_memory_allocator/bin/Shader.vert.spv
deleted file mode 100644
index 7b42b9e..0000000
--- a/third_party/vulkan_memory_allocator/bin/Shader.vert.spv
+++ /dev/null
Binary files differ
diff --git a/third_party/vulkan_memory_allocator/bin/SparseBindingTest.comp.spv b/third_party/vulkan_memory_allocator/bin/SparseBindingTest.comp.spv
deleted file mode 100644
index d56e0a9..0000000
--- a/third_party/vulkan_memory_allocator/bin/SparseBindingTest.comp.spv
+++ /dev/null
Binary files differ
diff --git a/third_party/vulkan_memory_allocator/bin/VmaReplay_Release_vs2017.exe b/third_party/vulkan_memory_allocator/bin/VmaReplay_Release_vs2017.exe
deleted file mode 100644
index eb99d7f..0000000
--- a/third_party/vulkan_memory_allocator/bin/VmaReplay_Release_vs2017.exe
+++ /dev/null
Binary files differ
diff --git a/third_party/vulkan_memory_allocator/bin/VulkanSample_Release_vs2017.exe b/third_party/vulkan_memory_allocator/bin/VulkanSample_Release_vs2017.exe
deleted file mode 100644
index c195d29..0000000
--- a/third_party/vulkan_memory_allocator/bin/VulkanSample_Release_vs2017.exe
+++ /dev/null
Binary files differ
diff --git a/third_party/vulkan_memory_allocator/build/src/Release/VmaSample.exe b/third_party/vulkan_memory_allocator/build/src/Release/VmaSample.exe
new file mode 100644
index 0000000..8ec81f5
--- /dev/null
+++ b/third_party/vulkan_memory_allocator/build/src/Release/VmaSample.exe
Binary files differ
diff --git a/third_party/vulkan_memory_allocator/build/src/VmaReplay/Release/VmaReplay.exe b/third_party/vulkan_memory_allocator/build/src/VmaReplay/Release/VmaReplay.exe
new file mode 100644
index 0000000..3c9faf1
--- /dev/null
+++ b/third_party/vulkan_memory_allocator/build/src/VmaReplay/Release/VmaReplay.exe
Binary files differ
diff --git a/third_party/vulkan_memory_allocator/docs/gfx/Aliasing.png b/third_party/vulkan_memory_allocator/docs/gfx/Aliasing.png
new file mode 100644
index 0000000..5f37edb
--- /dev/null
+++ b/third_party/vulkan_memory_allocator/docs/gfx/Aliasing.png
Binary files differ
diff --git a/third_party/vulkan_memory_allocator/docs/html/allocation_annotation.html b/third_party/vulkan_memory_allocator/docs/html/allocation_annotation.html
index 222ed57..312e409 100644
--- a/third_party/vulkan_memory_allocator/docs/html/allocation_annotation.html
+++ b/third_party/vulkan_memory_allocator/docs/html/allocation_annotation.html
@@ -3,7 +3,7 @@
 <head>
 <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
 <meta http-equiv="X-UA-Compatible" content="IE=9"/>
-<meta name="generator" content="Doxygen 1.8.18"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
 <meta name="viewport" content="width=device-width, initial-scale=1"/>
 <title>Vulkan Memory Allocator: Allocation names and user data</title>
 <link href="tabs.css" rel="stylesheet" type="text/css"/>
@@ -29,10 +29,10 @@
 </table>
 </div>
 <!-- end header part -->
-<!-- Generated by Doxygen 1.8.18 -->
+<!-- Generated by Doxygen 1.9.1 -->
 <script type="text/javascript">
 /* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
-var searchBox = new SearchBox("searchBox", "search",false,'Search');
+var searchBox = new SearchBox("searchBox", "search",false,'Search','.html');
 /* @license-end */
 </script>
 <script type="text/javascript" src="menudata.js"></script>
@@ -84,10 +84,19 @@
 <div class="line">VkBuffer buffer;</div>
 <div class="line"><a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation;</div>
 <div class="line"><a class="code" href="vk__mem__alloc_8h.html#ac72ee55598617e8eecca384e746bab51">vmaCreateBuffer</a>(allocator, &amp;bufferInfo, &amp;allocCreateInfo, &amp;buffer, &amp;allocation, <span class="keyword">nullptr</span>);</div>
+<div class="ttc" id="astruct_vma_allocation_create_info_html"><div class="ttname"><a href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a></div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2879</div></div>
+<div class="ttc" id="astruct_vma_allocation_create_info_html_a8259e85c272683434f4abb4ddddffe19"><div class="ttname"><a href="struct_vma_allocation_create_info.html#a8259e85c272683434f4abb4ddddffe19">VmaAllocationCreateInfo::pUserData</a></div><div class="ttdeci">void * pUserData</div><div class="ttdoc">Custom general-purpose pointer that will be stored in VmaAllocation, can be read as VmaAllocationInfo...</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2918</div></div>
+<div class="ttc" id="astruct_vma_allocation_create_info_html_accb8b06b1f677d858cb9af20705fa910"><div class="ttname"><a href="struct_vma_allocation_create_info.html#accb8b06b1f677d858cb9af20705fa910">VmaAllocationCreateInfo::usage</a></div><div class="ttdeci">VmaMemoryUsage usage</div><div class="ttdoc">Intended usage of memory.</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2887</div></div>
+<div class="ttc" id="astruct_vma_allocation_html"><div class="ttname"><a href="struct_vma_allocation.html">VmaAllocation</a></div><div class="ttdoc">Represents single memory allocation.</div></div>
+<div class="ttc" id="avk__mem__alloc_8h_html_aa5846affa1e9da3800e3e78fae2305ccac6b5dc1432d88647aa4cd456246eadf7"><div class="ttname"><a href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305ccac6b5dc1432d88647aa4cd456246eadf7">VMA_MEMORY_USAGE_GPU_ONLY</a></div><div class="ttdeci">@ VMA_MEMORY_USAGE_GPU_ONLY</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2721</div></div>
+<div class="ttc" id="avk__mem__alloc_8h_html_ac72ee55598617e8eecca384e746bab51"><div class="ttname"><a href="vk__mem__alloc_8h.html#ac72ee55598617e8eecca384e746bab51">vmaCreateBuffer</a></div><div class="ttdeci">VkResult vmaCreateBuffer(VmaAllocator allocator, const VkBufferCreateInfo *pBufferCreateInfo, const VmaAllocationCreateInfo *pAllocationCreateInfo, VkBuffer *pBuffer, VmaAllocation *pAllocation, VmaAllocationInfo *pAllocationInfo)</div></div>
 </div><!-- fragment --><p>The pointer may be later retrieved as <a class="el" href="struct_vma_allocation_info.html#adc507656149c04de7ed95d0042ba2a13" title="Custom general-purpose pointer that was passed as VmaAllocationCreateInfo::pUserData or set using vma...">VmaAllocationInfo::pUserData</a>:</p>
 <div class="fragment"><div class="line"><a class="code" href="struct_vma_allocation_info.html">VmaAllocationInfo</a> allocInfo;</div>
 <div class="line"><a class="code" href="vk__mem__alloc_8h.html#a86dd08aba8633bfa4ad0df2e76481d8b">vmaGetAllocationInfo</a>(allocator, allocation, &amp;allocInfo);</div>
 <div class="line">MyBufferMetadata* pMetadata = (MyBufferMetadata*)allocInfo.<a class="code" href="struct_vma_allocation_info.html#adc507656149c04de7ed95d0042ba2a13">pUserData</a>;</div>
+<div class="ttc" id="astruct_vma_allocation_info_html"><div class="ttname"><a href="struct_vma_allocation_info.html">VmaAllocationInfo</a></div><div class="ttdoc">Parameters of VmaAllocation objects, that can be retrieved using function vmaGetAllocationInfo().</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:3229</div></div>
+<div class="ttc" id="astruct_vma_allocation_info_html_adc507656149c04de7ed95d0042ba2a13"><div class="ttname"><a href="struct_vma_allocation_info.html#adc507656149c04de7ed95d0042ba2a13">VmaAllocationInfo::pUserData</a></div><div class="ttdeci">void * pUserData</div><div class="ttdoc">Custom general-purpose pointer that was passed as VmaAllocationCreateInfo::pUserData or set using vma...</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:3278</div></div>
+<div class="ttc" id="avk__mem__alloc_8h_html_a86dd08aba8633bfa4ad0df2e76481d8b"><div class="ttname"><a href="vk__mem__alloc_8h.html#a86dd08aba8633bfa4ad0df2e76481d8b">vmaGetAllocationInfo</a></div><div class="ttdeci">void vmaGetAllocationInfo(VmaAllocator allocator, VmaAllocation allocation, VmaAllocationInfo *pAllocationInfo)</div><div class="ttdoc">Returns current information about specified allocation and atomically marks it as used in current fra...</div></div>
 </div><!-- fragment --><p>It can also be changed using function <a class="el" href="vk__mem__alloc_8h.html#af9147d31ffc11d62fc187bde283ed14f" title="Sets pUserData in given allocation to new value.">vmaSetAllocationUserData()</a>.</p>
 <p>Values of (non-zero) allocations' <code>pUserData</code> are printed in JSON report created by <a class="el" href="vk__mem__alloc_8h.html#aa4fee7eb5253377599ef4fd38c93c2a0" title="Builds and returns statistics as string in JSON format.">vmaBuildStatsString()</a>, in hexadecimal form.</p>
 <h1><a class="anchor" id="allocation_names"></a>
@@ -107,6 +116,9 @@
 <div class="line">VkImage image;</div>
 <div class="line"><a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation;</div>
 <div class="line"><a class="code" href="vk__mem__alloc_8h.html#a02a94f25679275851a53e82eacbcfc73">vmaCreateImage</a>(allocator, &amp;imageInfo, &amp;allocCreateInfo, &amp;image, &amp;allocation, <span class="keyword">nullptr</span>);</div>
+<div class="ttc" id="astruct_vma_allocation_create_info_html_add09658ac14fe290ace25470ddd6d41b"><div class="ttname"><a href="struct_vma_allocation_create_info.html#add09658ac14fe290ace25470ddd6d41b">VmaAllocationCreateInfo::flags</a></div><div class="ttdeci">VmaAllocationCreateFlags flags</div><div class="ttdoc">Use VmaAllocationCreateFlagBits enum.</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2881</div></div>
+<div class="ttc" id="avk__mem__alloc_8h_html_a02a94f25679275851a53e82eacbcfc73"><div class="ttname"><a href="vk__mem__alloc_8h.html#a02a94f25679275851a53e82eacbcfc73">vmaCreateImage</a></div><div class="ttdeci">VkResult vmaCreateImage(VmaAllocator allocator, const VkImageCreateInfo *pImageCreateInfo, const VmaAllocationCreateInfo *pAllocationCreateInfo, VkImage *pImage, VmaAllocation *pAllocation, VmaAllocationInfo *pAllocationInfo)</div><div class="ttdoc">Function similar to vmaCreateBuffer().</div></div>
+<div class="ttc" id="avk__mem__alloc_8h_html_ad9889c10c798b040d59c92f257cae597aa6f24f821cd6a7c5e4a443f7bf59c520"><div class="ttname"><a href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597aa6f24f821cd6a7c5e4a443f7bf59c520">VMA_ALLOCATION_CREATE_USER_DATA_COPY_STRING_BIT</a></div><div class="ttdeci">@ VMA_ALLOCATION_CREATE_USER_DATA_COPY_STRING_BIT</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2824</div></div>
 </div><!-- fragment --><p>The value of <code>pUserData</code> pointer of the allocation will be different than the one you passed when setting allocation's name - pointing to a buffer managed internally that holds copy of the string.</p>
 <div class="fragment"><div class="line"><a class="code" href="struct_vma_allocation_info.html">VmaAllocationInfo</a> allocInfo;</div>
 <div class="line"><a class="code" href="vk__mem__alloc_8h.html#a86dd08aba8633bfa4ad0df2e76481d8b">vmaGetAllocationInfo</a>(allocator, allocation, &amp;allocInfo);</div>
@@ -116,23 +128,9 @@
 <dl class="section note"><dt>Note</dt><dd>Passing string name to VMA allocation doesn't automatically set it to the Vulkan buffer or image created with it. You must do it manually using an extension like VK_EXT_debug_utils, which is independent of this library. </dd></dl>
 </div></div><!-- contents -->
 </div><!-- PageDoc -->
-<div class="ttc" id="avk__mem__alloc_8h_html_ad9889c10c798b040d59c92f257cae597aa6f24f821cd6a7c5e4a443f7bf59c520"><div class="ttname"><a href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597aa6f24f821cd6a7c5e4a443f7bf59c520">VMA_ALLOCATION_CREATE_USER_DATA_COPY_STRING_BIT</a></div><div class="ttdeci">@ VMA_ALLOCATION_CREATE_USER_DATA_COPY_STRING_BIT</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2680</div></div>
-<div class="ttc" id="astruct_vma_allocation_create_info_html_a8259e85c272683434f4abb4ddddffe19"><div class="ttname"><a href="struct_vma_allocation_create_info.html#a8259e85c272683434f4abb4ddddffe19">VmaAllocationCreateInfo::pUserData</a></div><div class="ttdeci">void * pUserData</div><div class="ttdoc">Custom general-purpose pointer that will be stored in VmaAllocation, can be read as VmaAllocationInfo...</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2774</div></div>
-<div class="ttc" id="avk__mem__alloc_8h_html_a86dd08aba8633bfa4ad0df2e76481d8b"><div class="ttname"><a href="vk__mem__alloc_8h.html#a86dd08aba8633bfa4ad0df2e76481d8b">vmaGetAllocationInfo</a></div><div class="ttdeci">void vmaGetAllocationInfo(VmaAllocator allocator, VmaAllocation allocation, VmaAllocationInfo *pAllocationInfo)</div><div class="ttdoc">Returns current information about specified allocation and atomically marks it as used in current fra...</div></div>
-<div class="ttc" id="astruct_vma_allocation_html"><div class="ttname"><a href="struct_vma_allocation.html">VmaAllocation</a></div><div class="ttdoc">Represents single memory allocation.</div></div>
-<div class="ttc" id="avk__mem__alloc_8h_html_aa5846affa1e9da3800e3e78fae2305ccac6b5dc1432d88647aa4cd456246eadf7"><div class="ttname"><a href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305ccac6b5dc1432d88647aa4cd456246eadf7">VMA_MEMORY_USAGE_GPU_ONLY</a></div><div class="ttdeci">@ VMA_MEMORY_USAGE_GPU_ONLY</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2577</div></div>
-<div class="ttc" id="avk__mem__alloc_8h_html_a02a94f25679275851a53e82eacbcfc73"><div class="ttname"><a href="vk__mem__alloc_8h.html#a02a94f25679275851a53e82eacbcfc73">vmaCreateImage</a></div><div class="ttdeci">VkResult vmaCreateImage(VmaAllocator allocator, const VkImageCreateInfo *pImageCreateInfo, const VmaAllocationCreateInfo *pAllocationCreateInfo, VkImage *pImage, VmaAllocation *pAllocation, VmaAllocationInfo *pAllocationInfo)</div><div class="ttdoc">Function similar to vmaCreateBuffer().</div></div>
-<div class="ttc" id="astruct_vma_allocation_create_info_html_accb8b06b1f677d858cb9af20705fa910"><div class="ttname"><a href="struct_vma_allocation_create_info.html#accb8b06b1f677d858cb9af20705fa910">VmaAllocationCreateInfo::usage</a></div><div class="ttdeci">VmaMemoryUsage usage</div><div class="ttdoc">Intended usage of memory.</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2743</div></div>
-<div class="ttc" id="astruct_vma_allocation_info_html_adc507656149c04de7ed95d0042ba2a13"><div class="ttname"><a href="struct_vma_allocation_info.html#adc507656149c04de7ed95d0042ba2a13">VmaAllocationInfo::pUserData</a></div><div class="ttdeci">void * pUserData</div><div class="ttdoc">Custom general-purpose pointer that was passed as VmaAllocationCreateInfo::pUserData or set using vma...</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:3110</div></div>
-<div class="ttc" id="avk__mem__alloc_8h_html_ac72ee55598617e8eecca384e746bab51"><div class="ttname"><a href="vk__mem__alloc_8h.html#ac72ee55598617e8eecca384e746bab51">vmaCreateBuffer</a></div><div class="ttdeci">VkResult vmaCreateBuffer(VmaAllocator allocator, const VkBufferCreateInfo *pBufferCreateInfo, const VmaAllocationCreateInfo *pAllocationCreateInfo, VkBuffer *pBuffer, VmaAllocation *pAllocation, VmaAllocationInfo *pAllocationInfo)</div></div>
-<div class="ttc" id="astruct_vma_allocation_create_info_html_add09658ac14fe290ace25470ddd6d41b"><div class="ttname"><a href="struct_vma_allocation_create_info.html#add09658ac14fe290ace25470ddd6d41b">VmaAllocationCreateInfo::flags</a></div><div class="ttdeci">VmaAllocationCreateFlags flags</div><div class="ttdoc">Use VmaAllocationCreateFlagBits enum.</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2737</div></div>
-<div class="ttc" id="astruct_vma_allocation_create_info_html"><div class="ttname"><a href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a></div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2735</div></div>
-<div class="ttc" id="astruct_vma_allocation_info_html"><div class="ttname"><a href="struct_vma_allocation_info.html">VmaAllocationInfo</a></div><div class="ttdoc">Parameters of VmaAllocation objects, that can be retrieved using function vmaGetAllocationInfo().</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:3072</div></div>
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated by &#160;<a href="http://www.doxygen.org/index.html">
-<img class="footer" src="doxygen.png" alt="doxygen"/>
-</a> 1.8.18
+Generated by&#160;<a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.1
 </small></address>
 </body>
 </html>
diff --git a/third_party/vulkan_memory_allocator/docs/html/annotated.html b/third_party/vulkan_memory_allocator/docs/html/annotated.html
index 93b8a20..5d50e51 100644
--- a/third_party/vulkan_memory_allocator/docs/html/annotated.html
+++ b/third_party/vulkan_memory_allocator/docs/html/annotated.html
@@ -3,7 +3,7 @@
 <head>
 <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
 <meta http-equiv="X-UA-Compatible" content="IE=9"/>
-<meta name="generator" content="Doxygen 1.8.18"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
 <meta name="viewport" content="width=device-width, initial-scale=1"/>
 <title>Vulkan Memory Allocator: Class List</title>
 <link href="tabs.css" rel="stylesheet" type="text/css"/>
@@ -29,10 +29,10 @@
 </table>
 </div>
 <!-- end header part -->
-<!-- Generated by Doxygen 1.8.18 -->
+<!-- Generated by Doxygen 1.9.1 -->
 <script type="text/javascript">
 /* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
-var searchBox = new SearchBox("searchBox", "search",false,'Search');
+var searchBox = new SearchBox("searchBox", "search",false,'Search','.html');
 /* @license-end */
 </script>
 <script type="text/javascript" src="menudata.js"></script>
@@ -93,9 +93,7 @@
 </div><!-- contents -->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated by &#160;<a href="http://www.doxygen.org/index.html">
-<img class="footer" src="doxygen.png" alt="doxygen"/>
-</a> 1.8.18
+Generated by&#160;<a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.1
 </small></address>
 </body>
 </html>
diff --git a/third_party/vulkan_memory_allocator/docs/html/choosing_memory_type.html b/third_party/vulkan_memory_allocator/docs/html/choosing_memory_type.html
index fd7d09a..db95c57 100644
--- a/third_party/vulkan_memory_allocator/docs/html/choosing_memory_type.html
+++ b/third_party/vulkan_memory_allocator/docs/html/choosing_memory_type.html
@@ -3,7 +3,7 @@
 <head>
 <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
 <meta http-equiv="X-UA-Compatible" content="IE=9"/>
-<meta name="generator" content="Doxygen 1.8.18"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
 <meta name="viewport" content="width=device-width, initial-scale=1"/>
 <title>Vulkan Memory Allocator: Choosing memory type</title>
 <link href="tabs.css" rel="stylesheet" type="text/css"/>
@@ -29,10 +29,10 @@
 </table>
 </div>
 <!-- end header part -->
-<!-- Generated by Doxygen 1.8.18 -->
+<!-- Generated by Doxygen 1.9.1 -->
 <script type="text/javascript">
 /* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
-var searchBox = new SearchBox("searchBox", "search",false,'Search');
+var searchBox = new SearchBox("searchBox", "search",false,'Search','.html');
 /* @license-end */
 </script>
 <script type="text/javascript" src="menudata.js"></script>
@@ -93,6 +93,11 @@
 <div class="line">VkBuffer buffer;</div>
 <div class="line"><a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation;</div>
 <div class="line"><a class="code" href="vk__mem__alloc_8h.html#ac72ee55598617e8eecca384e746bab51">vmaCreateBuffer</a>(allocator, &amp;bufferInfo, &amp;allocInfo, &amp;buffer, &amp;allocation, <span class="keyword">nullptr</span>);</div>
+<div class="ttc" id="astruct_vma_allocation_create_info_html"><div class="ttname"><a href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a></div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2879</div></div>
+<div class="ttc" id="astruct_vma_allocation_create_info_html_accb8b06b1f677d858cb9af20705fa910"><div class="ttname"><a href="struct_vma_allocation_create_info.html#accb8b06b1f677d858cb9af20705fa910">VmaAllocationCreateInfo::usage</a></div><div class="ttdeci">VmaMemoryUsage usage</div><div class="ttdoc">Intended usage of memory.</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2887</div></div>
+<div class="ttc" id="astruct_vma_allocation_html"><div class="ttname"><a href="struct_vma_allocation.html">VmaAllocation</a></div><div class="ttdoc">Represents single memory allocation.</div></div>
+<div class="ttc" id="avk__mem__alloc_8h_html_aa5846affa1e9da3800e3e78fae2305ccac6b5dc1432d88647aa4cd456246eadf7"><div class="ttname"><a href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305ccac6b5dc1432d88647aa4cd456246eadf7">VMA_MEMORY_USAGE_GPU_ONLY</a></div><div class="ttdeci">@ VMA_MEMORY_USAGE_GPU_ONLY</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2721</div></div>
+<div class="ttc" id="avk__mem__alloc_8h_html_ac72ee55598617e8eecca384e746bab51"><div class="ttname"><a href="vk__mem__alloc_8h.html#ac72ee55598617e8eecca384e746bab51">vmaCreateBuffer</a></div><div class="ttdeci">VkResult vmaCreateBuffer(VmaAllocator allocator, const VkBufferCreateInfo *pBufferCreateInfo, const VmaAllocationCreateInfo *pAllocationCreateInfo, VkBuffer *pBuffer, VmaAllocation *pAllocation, VmaAllocationInfo *pAllocationInfo)</div></div>
 </div><!-- fragment --><h1><a class="anchor" id="choosing_memory_type_required_preferred_flags"></a>
 Required and preferred flags</h1>
 <p>You can specify more detailed requirements by filling members <a class="el" href="struct_vma_allocation_create_info.html#a9166390303ff42d783305bc31c2b6b90" title="Flags that must be set in a Memory Type chosen for an allocation.">VmaAllocationCreateInfo::requiredFlags</a> and <a class="el" href="struct_vma_allocation_create_info.html#a7fe8d81a1ad10b2a2faacacee5b15d6d" title="Flags that preferably should be set in a memory type chosen for an allocation.">VmaAllocationCreateInfo::preferredFlags</a> with a combination of bits from enum <code>VkMemoryPropertyFlags</code>. For example, if you want to create a buffer that will be persistently mapped on host (so it must be <code>HOST_VISIBLE</code>) and preferably will also be <code>HOST_COHERENT</code> and <code>HOST_CACHED</code>, use following code:</p>
@@ -104,6 +109,10 @@
 <div class="line">VkBuffer buffer;</div>
 <div class="line"><a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation;</div>
 <div class="line"><a class="code" href="vk__mem__alloc_8h.html#ac72ee55598617e8eecca384e746bab51">vmaCreateBuffer</a>(allocator, &amp;bufferInfo, &amp;allocInfo, &amp;buffer, &amp;allocation, <span class="keyword">nullptr</span>);</div>
+<div class="ttc" id="astruct_vma_allocation_create_info_html_a7fe8d81a1ad10b2a2faacacee5b15d6d"><div class="ttname"><a href="struct_vma_allocation_create_info.html#a7fe8d81a1ad10b2a2faacacee5b15d6d">VmaAllocationCreateInfo::preferredFlags</a></div><div class="ttdeci">VkMemoryPropertyFlags preferredFlags</div><div class="ttdoc">Flags that preferably should be set in a memory type chosen for an allocation.</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2897</div></div>
+<div class="ttc" id="astruct_vma_allocation_create_info_html_a9166390303ff42d783305bc31c2b6b90"><div class="ttname"><a href="struct_vma_allocation_create_info.html#a9166390303ff42d783305bc31c2b6b90">VmaAllocationCreateInfo::requiredFlags</a></div><div class="ttdeci">VkMemoryPropertyFlags requiredFlags</div><div class="ttdoc">Flags that must be set in a Memory Type chosen for an allocation.</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2892</div></div>
+<div class="ttc" id="astruct_vma_allocation_create_info_html_add09658ac14fe290ace25470ddd6d41b"><div class="ttname"><a href="struct_vma_allocation_create_info.html#add09658ac14fe290ace25470ddd6d41b">VmaAllocationCreateInfo::flags</a></div><div class="ttdeci">VmaAllocationCreateFlags flags</div><div class="ttdoc">Use VmaAllocationCreateFlagBits enum.</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2881</div></div>
+<div class="ttc" id="avk__mem__alloc_8h_html_ad9889c10c798b040d59c92f257cae597a11da372cc3a82931c5e5d6146cd9dd1f"><div class="ttname"><a href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a11da372cc3a82931c5e5d6146cd9dd1f">VMA_ALLOCATION_CREATE_MAPPED_BIT</a></div><div class="ttdeci">@ VMA_ALLOCATION_CREATE_MAPPED_BIT</div><div class="ttdoc">Set this flag to use a memory that will be persistently mapped and retrieve pointer to it.</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2798</div></div>
 </div><!-- fragment --><p>A memory type is chosen that has all the required flags and as many preferred flags set as possible.</p>
 <p>If you use <a class="el" href="struct_vma_allocation_create_info.html#accb8b06b1f677d858cb9af20705fa910" title="Intended usage of memory.">VmaAllocationCreateInfo::usage</a>, it is just internally converted to a set of required and preferred flags.</p>
 <h1><a class="anchor" id="choosing_memory_type_explicit_memory_types"></a>
@@ -118,6 +127,7 @@
 <div class="line">VkBuffer buffer;</div>
 <div class="line"><a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation;</div>
 <div class="line"><a class="code" href="vk__mem__alloc_8h.html#ac72ee55598617e8eecca384e746bab51">vmaCreateBuffer</a>(allocator, &amp;bufferInfo, &amp;allocInfo, &amp;buffer, &amp;allocation, <span class="keyword">nullptr</span>);</div>
+<div class="ttc" id="astruct_vma_allocation_create_info_html_a3bf940c0271d85d6ba32a4d820075055"><div class="ttname"><a href="struct_vma_allocation_create_info.html#a3bf940c0271d85d6ba32a4d820075055">VmaAllocationCreateInfo::memoryTypeBits</a></div><div class="ttdeci">uint32_t memoryTypeBits</div><div class="ttdoc">Bitmask containing one bit set for every memory type acceptable for this allocation.</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2905</div></div>
 </div><!-- fragment --><h1><a class="anchor" id="choosing_memory_type_custom_memory_pools"></a>
 Custom memory pools</h1>
 <p>If you allocate from custom memory pool, all the ways of specifying memory requirements described above are not applicable and the aforementioned members of <a class="el" href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a> structure are ignored. Memory type is selected explicitly when creating the pool and then used to make all the allocations from that pool. For further details, see <a class="el" href="custom_memory_pools.html">Custom memory pools</a>.</p>
@@ -131,21 +141,9 @@
 </ul>
 </div></div><!-- contents -->
 </div><!-- PageDoc -->
-<div class="ttc" id="astruct_vma_allocation_html"><div class="ttname"><a href="struct_vma_allocation.html">VmaAllocation</a></div><div class="ttdoc">Represents single memory allocation.</div></div>
-<div class="ttc" id="avk__mem__alloc_8h_html_aa5846affa1e9da3800e3e78fae2305ccac6b5dc1432d88647aa4cd456246eadf7"><div class="ttname"><a href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305ccac6b5dc1432d88647aa4cd456246eadf7">VMA_MEMORY_USAGE_GPU_ONLY</a></div><div class="ttdeci">@ VMA_MEMORY_USAGE_GPU_ONLY</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2577</div></div>
-<div class="ttc" id="astruct_vma_allocation_create_info_html_a9166390303ff42d783305bc31c2b6b90"><div class="ttname"><a href="struct_vma_allocation_create_info.html#a9166390303ff42d783305bc31c2b6b90">VmaAllocationCreateInfo::requiredFlags</a></div><div class="ttdeci">VkMemoryPropertyFlags requiredFlags</div><div class="ttdoc">Flags that must be set in a Memory Type chosen for an allocation.</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2748</div></div>
-<div class="ttc" id="astruct_vma_allocation_create_info_html_accb8b06b1f677d858cb9af20705fa910"><div class="ttname"><a href="struct_vma_allocation_create_info.html#accb8b06b1f677d858cb9af20705fa910">VmaAllocationCreateInfo::usage</a></div><div class="ttdeci">VmaMemoryUsage usage</div><div class="ttdoc">Intended usage of memory.</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2743</div></div>
-<div class="ttc" id="avk__mem__alloc_8h_html_ac72ee55598617e8eecca384e746bab51"><div class="ttname"><a href="vk__mem__alloc_8h.html#ac72ee55598617e8eecca384e746bab51">vmaCreateBuffer</a></div><div class="ttdeci">VkResult vmaCreateBuffer(VmaAllocator allocator, const VkBufferCreateInfo *pBufferCreateInfo, const VmaAllocationCreateInfo *pAllocationCreateInfo, VkBuffer *pBuffer, VmaAllocation *pAllocation, VmaAllocationInfo *pAllocationInfo)</div></div>
-<div class="ttc" id="avk__mem__alloc_8h_html_ad9889c10c798b040d59c92f257cae597a11da372cc3a82931c5e5d6146cd9dd1f"><div class="ttname"><a href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a11da372cc3a82931c5e5d6146cd9dd1f">VMA_ALLOCATION_CREATE_MAPPED_BIT</a></div><div class="ttdeci">@ VMA_ALLOCATION_CREATE_MAPPED_BIT</div><div class="ttdoc">Set this flag to use a memory that will be persistently mapped and retrieve pointer to it.</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2654</div></div>
-<div class="ttc" id="astruct_vma_allocation_create_info_html_add09658ac14fe290ace25470ddd6d41b"><div class="ttname"><a href="struct_vma_allocation_create_info.html#add09658ac14fe290ace25470ddd6d41b">VmaAllocationCreateInfo::flags</a></div><div class="ttdeci">VmaAllocationCreateFlags flags</div><div class="ttdoc">Use VmaAllocationCreateFlagBits enum.</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2737</div></div>
-<div class="ttc" id="astruct_vma_allocation_create_info_html"><div class="ttname"><a href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a></div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2735</div></div>
-<div class="ttc" id="astruct_vma_allocation_create_info_html_a7fe8d81a1ad10b2a2faacacee5b15d6d"><div class="ttname"><a href="struct_vma_allocation_create_info.html#a7fe8d81a1ad10b2a2faacacee5b15d6d">VmaAllocationCreateInfo::preferredFlags</a></div><div class="ttdeci">VkMemoryPropertyFlags preferredFlags</div><div class="ttdoc">Flags that preferably should be set in a memory type chosen for an allocation.</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2753</div></div>
-<div class="ttc" id="astruct_vma_allocation_create_info_html_a3bf940c0271d85d6ba32a4d820075055"><div class="ttname"><a href="struct_vma_allocation_create_info.html#a3bf940c0271d85d6ba32a4d820075055">VmaAllocationCreateInfo::memoryTypeBits</a></div><div class="ttdeci">uint32_t memoryTypeBits</div><div class="ttdoc">Bitmask containing one bit set for every memory type acceptable for this allocation.</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2761</div></div>
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated by &#160;<a href="http://www.doxygen.org/index.html">
-<img class="footer" src="doxygen.png" alt="doxygen"/>
-</a> 1.8.18
+Generated by&#160;<a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.1
 </small></address>
 </body>
 </html>
diff --git a/third_party/vulkan_memory_allocator/docs/html/classes.html b/third_party/vulkan_memory_allocator/docs/html/classes.html
index 03fb6ed..e63f3fa 100644
--- a/third_party/vulkan_memory_allocator/docs/html/classes.html
+++ b/third_party/vulkan_memory_allocator/docs/html/classes.html
@@ -3,7 +3,7 @@
 <head>
 <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
 <meta http-equiv="X-UA-Compatible" content="IE=9"/>
-<meta name="generator" content="Doxygen 1.8.18"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
 <meta name="viewport" content="width=device-width, initial-scale=1"/>
 <title>Vulkan Memory Allocator: Class Index</title>
 <link href="tabs.css" rel="stylesheet" type="text/css"/>
@@ -29,10 +29,10 @@
 </table>
 </div>
 <!-- end header part -->
-<!-- Generated by Doxygen 1.8.18 -->
+<!-- Generated by Doxygen 1.9.1 -->
 <script type="text/javascript">
 /* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
-var searchBox = new SearchBox("searchBox", "search",false,'Search');
+var searchBox = new SearchBox("searchBox", "search",false,'Search','.html');
 /* @license-end */
 </script>
 <script type="text/javascript" src="menudata.js"></script>
@@ -65,45 +65,16 @@
 <div class="title">Class Index</div>  </div>
 </div><!--header-->
 <div class="contents">
-<div class="qindex"><a class="qindex" href="#letter_v">v</a></div>
-<table class="classindex">
-<tr><td rowspan="2" valign="bottom"><a name="letter_v"></a><table border="0" cellspacing="0" cellpadding="0"><tr><td><div class="ah">&#160;&#160;v&#160;&#160;</div></td></tr></table>
-</td>
-<td valign="top"><a class="el" href="struct_vma_allocator.html">VmaAllocator</a>&#160;&#160;&#160;</td>
-<td valign="top"><a class="el" href="struct_vma_defragmentation_info.html">VmaDefragmentationInfo</a>&#160;&#160;&#160;</td>
-<td valign="top"><a class="el" href="struct_vma_device_memory_callbacks.html">VmaDeviceMemoryCallbacks</a>&#160;&#160;&#160;</td>
-<td valign="top"><a class="el" href="struct_vma_stat_info.html">VmaStatInfo</a>&#160;&#160;&#160;</td>
-</tr>
-<tr><td valign="top"><a class="el" href="struct_vma_allocator_create_info.html">VmaAllocatorCreateInfo</a>&#160;&#160;&#160;</td>
-<td valign="top"><a class="el" href="struct_vma_defragmentation_info2.html">VmaDefragmentationInfo2</a>&#160;&#160;&#160;</td>
-<td valign="top"><a class="el" href="struct_vma_pool.html">VmaPool</a>&#160;&#160;&#160;</td>
-<td valign="top"><a class="el" href="struct_vma_stats.html">VmaStats</a>&#160;&#160;&#160;</td>
-</tr>
-<tr><td valign="top"><a class="el" href="struct_vma_allocation.html">VmaAllocation</a>&#160;&#160;&#160;</td>
-<td valign="top"><a class="el" href="struct_vma_allocator_info.html">VmaAllocatorInfo</a>&#160;&#160;&#160;</td>
-<td valign="top"><a class="el" href="struct_vma_defragmentation_pass_info.html">VmaDefragmentationPassInfo</a>&#160;&#160;&#160;</td>
-<td valign="top"><a class="el" href="struct_vma_pool_create_info.html">VmaPoolCreateInfo</a>&#160;&#160;&#160;</td>
-<td valign="top"><a class="el" href="struct_vma_vulkan_functions.html">VmaVulkanFunctions</a>&#160;&#160;&#160;</td>
-</tr>
-<tr><td valign="top"><a class="el" href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a>&#160;&#160;&#160;</td>
-<td valign="top"><a class="el" href="struct_vma_budget.html">VmaBudget</a>&#160;&#160;&#160;</td>
-<td valign="top"><a class="el" href="struct_vma_defragmentation_pass_move_info.html">VmaDefragmentationPassMoveInfo</a>&#160;&#160;&#160;</td>
-<td valign="top"><a class="el" href="struct_vma_pool_stats.html">VmaPoolStats</a>&#160;&#160;&#160;</td>
-<td></td></tr>
-<tr><td valign="top"><a class="el" href="struct_vma_allocation_info.html">VmaAllocationInfo</a>&#160;&#160;&#160;</td>
-<td valign="top"><a class="el" href="struct_vma_defragmentation_context.html">VmaDefragmentationContext</a>&#160;&#160;&#160;</td>
-<td valign="top"><a class="el" href="struct_vma_defragmentation_stats.html">VmaDefragmentationStats</a>&#160;&#160;&#160;</td>
-<td valign="top"><a class="el" href="struct_vma_record_settings.html">VmaRecordSettings</a>&#160;&#160;&#160;</td>
-<td></td></tr>
-<tr><td></td><td></td><td></td><td></td><td></td></tr>
-</table>
-<div class="qindex"><a class="qindex" href="#letter_v">v</a></div>
+<div class="qindex"><a class="qindex" href="#letter_V">V</a></div>
+<div class="classindex">
+<dl class="classindex even">
+<dt class="alphachar"><a name="letter_V">V</a></dt>
+<dd><a class="el" href="struct_vma_allocation.html">VmaAllocation</a></dd><dd><a class="el" href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a></dd><dd><a class="el" href="struct_vma_allocation_info.html">VmaAllocationInfo</a></dd><dd><a class="el" href="struct_vma_allocator.html">VmaAllocator</a></dd><dd><a class="el" href="struct_vma_allocator_create_info.html">VmaAllocatorCreateInfo</a></dd><dd><a class="el" href="struct_vma_allocator_info.html">VmaAllocatorInfo</a></dd><dd><a class="el" href="struct_vma_budget.html">VmaBudget</a></dd><dd><a class="el" href="struct_vma_defragmentation_context.html">VmaDefragmentationContext</a></dd><dd><a class="el" href="struct_vma_defragmentation_info.html">VmaDefragmentationInfo</a></dd><dd><a class="el" href="struct_vma_defragmentation_info2.html">VmaDefragmentationInfo2</a></dd><dd><a class="el" href="struct_vma_defragmentation_pass_info.html">VmaDefragmentationPassInfo</a></dd><dd><a class="el" href="struct_vma_defragmentation_pass_move_info.html">VmaDefragmentationPassMoveInfo</a></dd><dd><a class="el" href="struct_vma_defragmentation_stats.html">VmaDefragmentationStats</a></dd><dd><a class="el" href="struct_vma_device_memory_callbacks.html">VmaDeviceMemoryCallbacks</a></dd><dd><a class="el" href="struct_vma_pool.html">VmaPool</a></dd><dd><a class="el" href="struct_vma_pool_create_info.html">VmaPoolCreateInfo</a></dd><dd><a class="el" href="struct_vma_pool_stats.html">VmaPoolStats</a></dd><dd><a class="el" href="struct_vma_record_settings.html">VmaRecordSettings</a></dd><dd><a class="el" href="struct_vma_stat_info.html">VmaStatInfo</a></dd><dd><a class="el" href="struct_vma_stats.html">VmaStats</a></dd><dd><a class="el" href="struct_vma_vulkan_functions.html">VmaVulkanFunctions</a></dd></dl>
+</div>
 </div><!-- contents -->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated by &#160;<a href="http://www.doxygen.org/index.html">
-<img class="footer" src="doxygen.png" alt="doxygen"/>
-</a> 1.8.18
+Generated by&#160;<a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.1
 </small></address>
 </body>
 </html>
diff --git a/third_party/vulkan_memory_allocator/docs/html/configuration.html b/third_party/vulkan_memory_allocator/docs/html/configuration.html
index 0d0e3c2..555858a 100644
--- a/third_party/vulkan_memory_allocator/docs/html/configuration.html
+++ b/third_party/vulkan_memory_allocator/docs/html/configuration.html
@@ -3,7 +3,7 @@
 <head>
 <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
 <meta http-equiv="X-UA-Compatible" content="IE=9"/>
-<meta name="generator" content="Doxygen 1.8.18"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
 <meta name="viewport" content="width=device-width, initial-scale=1"/>
 <title>Vulkan Memory Allocator: Configuration</title>
 <link href="tabs.css" rel="stylesheet" type="text/css"/>
@@ -29,10 +29,10 @@
 </table>
 </div>
 <!-- end header part -->
-<!-- Generated by Doxygen 1.8.18 -->
+<!-- Generated by Doxygen 1.9.1 -->
 <script type="text/javascript">
 /* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
-var searchBox = new SearchBox("searchBox", "search",false,'Search');
+var searchBox = new SearchBox("searchBox", "search",false,'Search','.html');
 /* @license-end */
 </script>
 <script type="text/javascript" src="menudata.js"></script>
@@ -88,16 +88,14 @@
 <p>The library makes calls to <code>vkAllocateMemory()</code> and <code>vkFreeMemory()</code> internally. You can setup callbacks to be informed about these calls, e.g. for the purpose of gathering some statistics. To do it, fill optional member <a class="el" href="struct_vma_allocator_create_info.html#af1380969b5e1ea4c3184a877892d260e" title="Informative callbacks for vkAllocateMemory, vkFreeMemory. Optional.">VmaAllocatorCreateInfo::pDeviceMemoryCallbacks</a>.</p>
 <h1><a class="anchor" id="heap_memory_limit"></a>
 Device heap memory limit</h1>
-<p>When device memory of certain heap runs out of free space, new allocations may fail (returning error code) or they may succeed, silently pushing some existing memory blocks from GPU VRAM to system RAM (which degrades performance). This behavior is implementation-dependant - it depends on GPU vendor and graphics driver.</p>
+<p>When device memory of certain heap runs out of free space, new allocations may fail (returning error code) or they may succeed, silently pushing some existing memory blocks from GPU VRAM to system RAM (which degrades performance). This behavior is implementation-dependent - it depends on GPU vendor and graphics driver.</p>
 <p>On AMD cards it can be controlled while creating Vulkan device object by using VK_AMD_memory_overallocation_behavior extension, if available.</p>
 <p>Alternatively, if you want to test how your program behaves with limited amount of Vulkan device memory available without switching your graphics card to one that really has smaller VRAM, you can use a feature of this library intended for this purpose. To do it, fill optional member <a class="el" href="struct_vma_allocator_create_info.html#a31c192aa6cbffa33279f6d9f0c47c44b" title="Either null or a pointer to an array of limits on maximum number of bytes that can be allocated out o...">VmaAllocatorCreateInfo::pHeapSizeLimit</a>. </p>
 </div></div><!-- contents -->
 </div><!-- PageDoc -->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated by &#160;<a href="http://www.doxygen.org/index.html">
-<img class="footer" src="doxygen.png" alt="doxygen"/>
-</a> 1.8.18
+Generated by&#160;<a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.1
 </small></address>
 </body>
 </html>
diff --git a/third_party/vulkan_memory_allocator/docs/html/custom_memory_pools.html b/third_party/vulkan_memory_allocator/docs/html/custom_memory_pools.html
index ac2f74b..2d9ec9a 100644
--- a/third_party/vulkan_memory_allocator/docs/html/custom_memory_pools.html
+++ b/third_party/vulkan_memory_allocator/docs/html/custom_memory_pools.html
@@ -3,7 +3,7 @@
 <head>
 <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
 <meta http-equiv="X-UA-Compatible" content="IE=9"/>
-<meta name="generator" content="Doxygen 1.8.18"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
 <meta name="viewport" content="width=device-width, initial-scale=1"/>
 <title>Vulkan Memory Allocator: Custom memory pools</title>
 <link href="tabs.css" rel="stylesheet" type="text/css"/>
@@ -29,10 +29,10 @@
 </table>
 </div>
 <!-- end header part -->
-<!-- Generated by Doxygen 1.8.18 -->
+<!-- Generated by Doxygen 1.9.1 -->
 <script type="text/javascript">
 /* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
-var searchBox = new SearchBox("searchBox", "search",false,'Search');
+var searchBox = new SearchBox("searchBox", "search",false,'Search','.html');
 /* @license-end */
 </script>
 <script type="text/javascript" src="menudata.js"></script>
@@ -105,9 +105,21 @@
 <div class="line"><a class="code" href="struct_vma_allocation.html">VmaAllocation</a> alloc;</div>
 <div class="line"><a class="code" href="struct_vma_allocation_info.html">VmaAllocationInfo</a> allocInfo;</div>
 <div class="line"><a class="code" href="vk__mem__alloc_8h.html#ac72ee55598617e8eecca384e746bab51">vmaCreateBuffer</a>(allocator, &amp;bufCreateInfo, &amp;allocCreateInfo, &amp;buf, &amp;alloc, &amp;allocInfo);</div>
+<div class="ttc" id="astruct_vma_allocation_create_info_html"><div class="ttname"><a href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a></div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2879</div></div>
+<div class="ttc" id="astruct_vma_allocation_create_info_html_a6272c0555cfd1fe28bff1afeb6190150"><div class="ttname"><a href="struct_vma_allocation_create_info.html#a6272c0555cfd1fe28bff1afeb6190150">VmaAllocationCreateInfo::pool</a></div><div class="ttdeci">VmaPool pool</div><div class="ttdoc">Pool that this allocation should be created in.</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2911</div></div>
+<div class="ttc" id="astruct_vma_allocation_html"><div class="ttname"><a href="struct_vma_allocation.html">VmaAllocation</a></div><div class="ttdoc">Represents single memory allocation.</div></div>
+<div class="ttc" id="astruct_vma_allocation_info_html"><div class="ttname"><a href="struct_vma_allocation_info.html">VmaAllocationInfo</a></div><div class="ttdoc">Parameters of VmaAllocation objects, that can be retrieved using function vmaGetAllocationInfo().</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:3229</div></div>
+<div class="ttc" id="astruct_vma_pool_create_info_html"><div class="ttname"><a href="struct_vma_pool_create_info.html">VmaPoolCreateInfo</a></div><div class="ttdoc">Describes parameter of created VmaPool.</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:3047</div></div>
+<div class="ttc" id="astruct_vma_pool_create_info_html_a596fa76b685d3f1f688f84a709a5b319"><div class="ttname"><a href="struct_vma_pool_create_info.html#a596fa76b685d3f1f688f84a709a5b319">VmaPoolCreateInfo::memoryTypeIndex</a></div><div class="ttdeci">uint32_t memoryTypeIndex</div><div class="ttdoc">Vulkan memory type index to allocate this pool from.</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:3050</div></div>
+<div class="ttc" id="astruct_vma_pool_create_info_html_ae41142f2834fcdc82baa4883c187b75c"><div class="ttname"><a href="struct_vma_pool_create_info.html#ae41142f2834fcdc82baa4883c187b75c">VmaPoolCreateInfo::maxBlockCount</a></div><div class="ttdeci">size_t maxBlockCount</div><div class="ttdoc">Maximum number of blocks that can be allocated in this pool. Optional.</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:3075</div></div>
+<div class="ttc" id="astruct_vma_pool_html"><div class="ttname"><a href="struct_vma_pool.html">VmaPool</a></div><div class="ttdoc">Represents custom memory pool.</div></div>
+<div class="ttc" id="avk__mem__alloc_8h_html_a5c8770ded7c59c8caac6de0c2cb00b50"><div class="ttname"><a href="vk__mem__alloc_8h.html#a5c8770ded7c59c8caac6de0c2cb00b50">vmaCreatePool</a></div><div class="ttdeci">VkResult vmaCreatePool(VmaAllocator allocator, const VmaPoolCreateInfo *pCreateInfo, VmaPool *pPool)</div><div class="ttdoc">Allocates Vulkan device memory and creates VmaPool object.</div></div>
+<div class="ttc" id="avk__mem__alloc_8h_html_ac72ee55598617e8eecca384e746bab51"><div class="ttname"><a href="vk__mem__alloc_8h.html#ac72ee55598617e8eecca384e746bab51">vmaCreateBuffer</a></div><div class="ttdeci">VkResult vmaCreateBuffer(VmaAllocator allocator, const VkBufferCreateInfo *pBufferCreateInfo, const VmaAllocationCreateInfo *pAllocationCreateInfo, VkBuffer *pBuffer, VmaAllocation *pAllocation, VmaAllocationInfo *pAllocationInfo)</div></div>
 </div><!-- fragment --><p>You have to free all allocations made from this pool before destroying it.</p>
 <div class="fragment"><div class="line"><a class="code" href="vk__mem__alloc_8h.html#a0d9f4e4ba5bf9aab1f1c746387753d77">vmaDestroyBuffer</a>(allocator, buf, alloc);</div>
 <div class="line"><a class="code" href="vk__mem__alloc_8h.html#a5485779c8f1948238fc4e92232fa65e1">vmaDestroyPool</a>(allocator, pool);</div>
+<div class="ttc" id="avk__mem__alloc_8h_html_a0d9f4e4ba5bf9aab1f1c746387753d77"><div class="ttname"><a href="vk__mem__alloc_8h.html#a0d9f4e4ba5bf9aab1f1c746387753d77">vmaDestroyBuffer</a></div><div class="ttdeci">void vmaDestroyBuffer(VmaAllocator allocator, VkBuffer buffer, VmaAllocation allocation)</div><div class="ttdoc">Destroys Vulkan buffer and frees allocated memory.</div></div>
+<div class="ttc" id="avk__mem__alloc_8h_html_a5485779c8f1948238fc4e92232fa65e1"><div class="ttname"><a href="vk__mem__alloc_8h.html#a5485779c8f1948238fc4e92232fa65e1">vmaDestroyPool</a></div><div class="ttdeci">void vmaDestroyPool(VmaAllocator allocator, VmaPool pool)</div><div class="ttdoc">Destroys VmaPool object and frees Vulkan device memory.</div></div>
 </div><!-- fragment --><h1><a class="anchor" id="custom_memory_pools_MemTypeIndex"></a>
 Choosing memory type index</h1>
 <p>When creating a pool, you must explicitly specify memory type index. To find the one suitable for your buffers or images, you can use helper functions <a class="el" href="vk__mem__alloc_8h.html#ae790ab9ffaf7667fb8f62523e6897888" title="Helps to find memoryTypeIndex, given VkBufferCreateInfo and VmaAllocationCreateInfo.">vmaFindMemoryTypeIndexForBufferInfo()</a>, <a class="el" href="vk__mem__alloc_8h.html#a088da83d8eaf3ce9056d9ea0b981d472" title="Helps to find memoryTypeIndex, given VkImageCreateInfo and VmaAllocationCreateInfo.">vmaFindMemoryTypeIndexForImageInfo()</a>. You need to provide structures with example parameters of buffers or images that you are going to create in that pool.</p>
@@ -124,6 +136,9 @@
 <div class="line"><a class="code" href="struct_vma_pool_create_info.html">VmaPoolCreateInfo</a> poolCreateInfo = {};</div>
 <div class="line">poolCreateInfo.<a class="code" href="struct_vma_pool_create_info.html#a596fa76b685d3f1f688f84a709a5b319">memoryTypeIndex</a> = memTypeIndex;</div>
 <div class="line"><span class="comment">// ...</span></div>
+<div class="ttc" id="astruct_vma_allocation_create_info_html_accb8b06b1f677d858cb9af20705fa910"><div class="ttname"><a href="struct_vma_allocation_create_info.html#accb8b06b1f677d858cb9af20705fa910">VmaAllocationCreateInfo::usage</a></div><div class="ttdeci">VmaMemoryUsage usage</div><div class="ttdoc">Intended usage of memory.</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2887</div></div>
+<div class="ttc" id="avk__mem__alloc_8h_html_aa5846affa1e9da3800e3e78fae2305ccac6b5dc1432d88647aa4cd456246eadf7"><div class="ttname"><a href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305ccac6b5dc1432d88647aa4cd456246eadf7">VMA_MEMORY_USAGE_GPU_ONLY</a></div><div class="ttdeci">@ VMA_MEMORY_USAGE_GPU_ONLY</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2721</div></div>
+<div class="ttc" id="avk__mem__alloc_8h_html_ae790ab9ffaf7667fb8f62523e6897888"><div class="ttname"><a href="vk__mem__alloc_8h.html#ae790ab9ffaf7667fb8f62523e6897888">vmaFindMemoryTypeIndexForBufferInfo</a></div><div class="ttdeci">VkResult vmaFindMemoryTypeIndexForBufferInfo(VmaAllocator allocator, const VkBufferCreateInfo *pBufferCreateInfo, const VmaAllocationCreateInfo *pAllocationCreateInfo, uint32_t *pMemoryTypeIndex)</div><div class="ttdoc">Helps to find memoryTypeIndex, given VkBufferCreateInfo and VmaAllocationCreateInfo.</div></div>
 </div><!-- fragment --><p>When creating buffers/images allocated in that pool, provide following parameters:</p>
 <ul>
 <li><code>VkBufferCreateInfo</code>: Prefer to pass same parameters as above. Otherwise you risk creating resources in a memory type that is not suitable for them, which may result in undefined behavior. Using different <code>VK_BUFFER_USAGE_</code> flags may work, but you shouldn't create images in a pool intended for buffers or the other way around.</li>
@@ -180,26 +195,9 @@
 </ul>
 </div></div><!-- contents -->
 </div><!-- PageDoc -->
-<div class="ttc" id="astruct_vma_pool_create_info_html_a596fa76b685d3f1f688f84a709a5b319"><div class="ttname"><a href="struct_vma_pool_create_info.html#a596fa76b685d3f1f688f84a709a5b319">VmaPoolCreateInfo::memoryTypeIndex</a></div><div class="ttdeci">uint32_t memoryTypeIndex</div><div class="ttdoc">Vulkan memory type index to allocate this pool from.</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2899</div></div>
-<div class="ttc" id="astruct_vma_allocation_create_info_html_a6272c0555cfd1fe28bff1afeb6190150"><div class="ttname"><a href="struct_vma_allocation_create_info.html#a6272c0555cfd1fe28bff1afeb6190150">VmaAllocationCreateInfo::pool</a></div><div class="ttdeci">VmaPool pool</div><div class="ttdoc">Pool that this allocation should be created in.</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2767</div></div>
-<div class="ttc" id="avk__mem__alloc_8h_html_a5485779c8f1948238fc4e92232fa65e1"><div class="ttname"><a href="vk__mem__alloc_8h.html#a5485779c8f1948238fc4e92232fa65e1">vmaDestroyPool</a></div><div class="ttdeci">void vmaDestroyPool(VmaAllocator allocator, VmaPool pool)</div><div class="ttdoc">Destroys VmaPool object and frees Vulkan device memory.</div></div>
-<div class="ttc" id="astruct_vma_allocation_html"><div class="ttname"><a href="struct_vma_allocation.html">VmaAllocation</a></div><div class="ttdoc">Represents single memory allocation.</div></div>
-<div class="ttc" id="avk__mem__alloc_8h_html_aa5846affa1e9da3800e3e78fae2305ccac6b5dc1432d88647aa4cd456246eadf7"><div class="ttname"><a href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305ccac6b5dc1432d88647aa4cd456246eadf7">VMA_MEMORY_USAGE_GPU_ONLY</a></div><div class="ttdeci">@ VMA_MEMORY_USAGE_GPU_ONLY</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2577</div></div>
-<div class="ttc" id="avk__mem__alloc_8h_html_a5c8770ded7c59c8caac6de0c2cb00b50"><div class="ttname"><a href="vk__mem__alloc_8h.html#a5c8770ded7c59c8caac6de0c2cb00b50">vmaCreatePool</a></div><div class="ttdeci">VkResult vmaCreatePool(VmaAllocator allocator, const VmaPoolCreateInfo *pCreateInfo, VmaPool *pPool)</div><div class="ttdoc">Allocates Vulkan device memory and creates VmaPool object.</div></div>
-<div class="ttc" id="astruct_vma_pool_create_info_html_ae41142f2834fcdc82baa4883c187b75c"><div class="ttname"><a href="struct_vma_pool_create_info.html#ae41142f2834fcdc82baa4883c187b75c">VmaPoolCreateInfo::maxBlockCount</a></div><div class="ttdeci">size_t maxBlockCount</div><div class="ttdoc">Maximum number of blocks that can be allocated in this pool. Optional.</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2924</div></div>
-<div class="ttc" id="astruct_vma_pool_create_info_html"><div class="ttname"><a href="struct_vma_pool_create_info.html">VmaPoolCreateInfo</a></div><div class="ttdoc">Describes parameter of created VmaPool.</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2896</div></div>
-<div class="ttc" id="astruct_vma_pool_html"><div class="ttname"><a href="struct_vma_pool.html">VmaPool</a></div><div class="ttdoc">Represents custom memory pool.</div></div>
-<div class="ttc" id="avk__mem__alloc_8h_html_ae790ab9ffaf7667fb8f62523e6897888"><div class="ttname"><a href="vk__mem__alloc_8h.html#ae790ab9ffaf7667fb8f62523e6897888">vmaFindMemoryTypeIndexForBufferInfo</a></div><div class="ttdeci">VkResult vmaFindMemoryTypeIndexForBufferInfo(VmaAllocator allocator, const VkBufferCreateInfo *pBufferCreateInfo, const VmaAllocationCreateInfo *pAllocationCreateInfo, uint32_t *pMemoryTypeIndex)</div><div class="ttdoc">Helps to find memoryTypeIndex, given VkBufferCreateInfo and VmaAllocationCreateInfo.</div></div>
-<div class="ttc" id="astruct_vma_allocation_create_info_html_accb8b06b1f677d858cb9af20705fa910"><div class="ttname"><a href="struct_vma_allocation_create_info.html#accb8b06b1f677d858cb9af20705fa910">VmaAllocationCreateInfo::usage</a></div><div class="ttdeci">VmaMemoryUsage usage</div><div class="ttdoc">Intended usage of memory.</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2743</div></div>
-<div class="ttc" id="avk__mem__alloc_8h_html_ac72ee55598617e8eecca384e746bab51"><div class="ttname"><a href="vk__mem__alloc_8h.html#ac72ee55598617e8eecca384e746bab51">vmaCreateBuffer</a></div><div class="ttdeci">VkResult vmaCreateBuffer(VmaAllocator allocator, const VkBufferCreateInfo *pBufferCreateInfo, const VmaAllocationCreateInfo *pAllocationCreateInfo, VkBuffer *pBuffer, VmaAllocation *pAllocation, VmaAllocationInfo *pAllocationInfo)</div></div>
-<div class="ttc" id="avk__mem__alloc_8h_html_a0d9f4e4ba5bf9aab1f1c746387753d77"><div class="ttname"><a href="vk__mem__alloc_8h.html#a0d9f4e4ba5bf9aab1f1c746387753d77">vmaDestroyBuffer</a></div><div class="ttdeci">void vmaDestroyBuffer(VmaAllocator allocator, VkBuffer buffer, VmaAllocation allocation)</div><div class="ttdoc">Destroys Vulkan buffer and frees allocated memory.</div></div>
-<div class="ttc" id="astruct_vma_allocation_create_info_html"><div class="ttname"><a href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a></div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2735</div></div>
-<div class="ttc" id="astruct_vma_allocation_info_html"><div class="ttname"><a href="struct_vma_allocation_info.html">VmaAllocationInfo</a></div><div class="ttdoc">Parameters of VmaAllocation objects, that can be retrieved using function vmaGetAllocationInfo().</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:3072</div></div>
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated by &#160;<a href="http://www.doxygen.org/index.html">
-<img class="footer" src="doxygen.png" alt="doxygen"/>
-</a> 1.8.18
+Generated by&#160;<a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.1
 </small></address>
 </body>
 </html>
diff --git a/third_party/vulkan_memory_allocator/docs/html/debugging_memory_usage.html b/third_party/vulkan_memory_allocator/docs/html/debugging_memory_usage.html
index a999df6..ce21667 100644
--- a/third_party/vulkan_memory_allocator/docs/html/debugging_memory_usage.html
+++ b/third_party/vulkan_memory_allocator/docs/html/debugging_memory_usage.html
@@ -3,7 +3,7 @@
 <head>
 <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
 <meta http-equiv="X-UA-Compatible" content="IE=9"/>
-<meta name="generator" content="Doxygen 1.8.18"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
 <meta name="viewport" content="width=device-width, initial-scale=1"/>
 <title>Vulkan Memory Allocator: Debugging incorrect memory usage</title>
 <link href="tabs.css" rel="stylesheet" type="text/css"/>
@@ -29,10 +29,10 @@
 </table>
 </div>
 <!-- end header part -->
-<!-- Generated by Doxygen 1.8.18 -->
+<!-- Generated by Doxygen 1.9.1 -->
 <script type="text/javascript">
 /* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
-var searchBox = new SearchBox("searchBox", "search",false,'Search');
+var searchBox = new SearchBox("searchBox", "search",false,'Search','.html');
 /* @license-end */
 </script>
 <script type="text/javascript" src="menudata.js"></script>
@@ -106,9 +106,7 @@
 </div><!-- PageDoc -->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated by &#160;<a href="http://www.doxygen.org/index.html">
-<img class="footer" src="doxygen.png" alt="doxygen"/>
-</a> 1.8.18
+Generated by&#160;<a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.1
 </small></address>
 </body>
 </html>
diff --git a/third_party/vulkan_memory_allocator/docs/html/defragmentation.html b/third_party/vulkan_memory_allocator/docs/html/defragmentation.html
index ae7591b..3174fd0 100644
--- a/third_party/vulkan_memory_allocator/docs/html/defragmentation.html
+++ b/third_party/vulkan_memory_allocator/docs/html/defragmentation.html
@@ -3,7 +3,7 @@
 <head>
 <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
 <meta http-equiv="X-UA-Compatible" content="IE=9"/>
-<meta name="generator" content="Doxygen 1.8.18"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
 <meta name="viewport" content="width=device-width, initial-scale=1"/>
 <title>Vulkan Memory Allocator: Defragmentation</title>
 <link href="tabs.css" rel="stylesheet" type="text/css"/>
@@ -29,10 +29,10 @@
 </table>
 </div>
 <!-- end header part -->
-<!-- Generated by Doxygen 1.8.18 -->
+<!-- Generated by Doxygen 1.9.1 -->
 <script type="text/javascript">
 /* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
-var searchBox = new SearchBox("searchBox", "search",false,'Search');
+var searchBox = new SearchBox("searchBox", "search",false,'Search','.html');
 /* @license-end */
 </script>
 <script type="text/javascript" src="menudata.js"></script>
@@ -73,7 +73,7 @@
 <p>To mitigate this problem, you can use defragmentation feature: structure <a class="el" href="struct_vma_defragmentation_info2.html" title="Parameters for defragmentation.">VmaDefragmentationInfo2</a>, function <a class="el" href="vk__mem__alloc_8h.html#a36ba776fd7fd5cb1e9359fdc0d8e6e8a" title="Begins defragmentation process.">vmaDefragmentationBegin()</a>, <a class="el" href="vk__mem__alloc_8h.html#a8774e20e91e245aae959ba63efa15dd2" title="Ends defragmentation process.">vmaDefragmentationEnd()</a>. Given set of allocations, this function can move them to compact used memory, ensure more continuous free space and possibly also free some <code>VkDeviceMemory</code> blocks.</p>
 <p>What the defragmentation does is:</p>
 <ul>
-<li>Updates <a class="el" href="struct_vma_allocation.html" title="Represents single memory allocation.">VmaAllocation</a> objects to point to new <code>VkDeviceMemory</code> and offset. After allocation has been moved, its <a class="el" href="struct_vma_allocation_info.html#ae0bfb7dfdf79a76ffefc9a94677a2f67" title="Handle to Vulkan memory object.">VmaAllocationInfo::deviceMemory</a> and/or <a class="el" href="struct_vma_allocation_info.html#a4a3c732388dbdc7a23f9365b00825268" title="Offset into deviceMemory object to the beginning of this allocation, in bytes. (deviceMemory,...">VmaAllocationInfo::offset</a> changes. You must query them again using <a class="el" href="vk__mem__alloc_8h.html#a86dd08aba8633bfa4ad0df2e76481d8b" title="Returns current information about specified allocation and atomically marks it as used in current fra...">vmaGetAllocationInfo()</a> if you need them.</li>
+<li>Updates <a class="el" href="struct_vma_allocation.html" title="Represents single memory allocation.">VmaAllocation</a> objects to point to new <code>VkDeviceMemory</code> and offset. After allocation has been moved, its <a class="el" href="struct_vma_allocation_info.html#ae0bfb7dfdf79a76ffefc9a94677a2f67" title="Handle to Vulkan memory object.">VmaAllocationInfo::deviceMemory</a> and/or <a class="el" href="struct_vma_allocation_info.html#a4a3c732388dbdc7a23f9365b00825268" title="Offset in VkDeviceMemory object to the beginning of this allocation, in bytes. (deviceMemory,...">VmaAllocationInfo::offset</a> changes. You must query them again using <a class="el" href="vk__mem__alloc_8h.html#a86dd08aba8633bfa4ad0df2e76481d8b" title="Returns current information about specified allocation and atomically marks it as used in current fra...">vmaGetAllocationInfo()</a> if you need them.</li>
 <li>Moves actual data in memory.</li>
 </ul>
 <p>What it doesn't do, so you need to do it yourself:</p>
@@ -120,15 +120,28 @@
 <div class="line">        <span class="comment">// Create new buffer with same parameters.</span></div>
 <div class="line">        VkBufferCreateInfo bufferInfo = ...;</div>
 <div class="line">        vkCreateBuffer(device, &amp;bufferInfo, <span class="keyword">nullptr</span>, &amp;buffers[i]);</div>
-<div class="line">            </div>
+<div class="line"> </div>
 <div class="line">        <span class="comment">// You can make dummy call to vkGetBufferMemoryRequirements here to silence validation layer warning.</span></div>
-<div class="line">            </div>
+<div class="line"> </div>
 <div class="line">        <span class="comment">// Bind new buffer to new memory region. Data contained in it is already moved.</span></div>
 <div class="line">        <a class="code" href="struct_vma_allocation_info.html">VmaAllocationInfo</a> allocInfo;</div>
 <div class="line">        <a class="code" href="vk__mem__alloc_8h.html#a86dd08aba8633bfa4ad0df2e76481d8b">vmaGetAllocationInfo</a>(allocator, allocations[i], &amp;allocInfo);</div>
 <div class="line">        <a class="code" href="vk__mem__alloc_8h.html#a6b0929b914b60cf2d45cac4bf3547470">vmaBindBufferMemory</a>(allocator, allocations[i], buffers[i]);</div>
 <div class="line">    }</div>
 <div class="line">}</div>
+<div class="ttc" id="astruct_vma_allocation_info_html"><div class="ttname"><a href="struct_vma_allocation_info.html">VmaAllocationInfo</a></div><div class="ttdoc">Parameters of VmaAllocation objects, that can be retrieved using function vmaGetAllocationInfo().</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:3229</div></div>
+<div class="ttc" id="astruct_vma_allocator_html"><div class="ttname"><a href="struct_vma_allocator.html">VmaAllocator</a></div><div class="ttdoc">Represents main object of this library initialized.</div></div>
+<div class="ttc" id="astruct_vma_defragmentation_context_html"><div class="ttname"><a href="struct_vma_defragmentation_context.html">VmaDefragmentationContext</a></div><div class="ttdoc">Represents Opaque object that represents started defragmentation process.</div></div>
+<div class="ttc" id="astruct_vma_defragmentation_info2_html"><div class="ttname"><a href="struct_vma_defragmentation_info2.html">VmaDefragmentationInfo2</a></div><div class="ttdoc">Parameters for defragmentation.</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:3628</div></div>
+<div class="ttc" id="astruct_vma_defragmentation_info2_html_a3cf86ab32c1da779b4923d301a3056ba"><div class="ttname"><a href="struct_vma_defragmentation_info2.html#a3cf86ab32c1da779b4923d301a3056ba">VmaDefragmentationInfo2::allocationCount</a></div><div class="ttdeci">uint32_t allocationCount</div><div class="ttdoc">Number of allocations in pAllocations array.</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:3634</div></div>
+<div class="ttc" id="astruct_vma_defragmentation_info2_html_a76d51a644dc7f5405d0cdd0025ecd0cc"><div class="ttname"><a href="struct_vma_defragmentation_info2.html#a76d51a644dc7f5405d0cdd0025ecd0cc">VmaDefragmentationInfo2::pAllocationsChanged</a></div><div class="ttdeci">VkBool32 * pAllocationsChanged</div><div class="ttdoc">Optional, output. Pointer to array that will be filled with information whether the allocation at cer...</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:3649</div></div>
+<div class="ttc" id="astruct_vma_defragmentation_info2_html_a94c2c7223d52878445a8cccce396b671"><div class="ttname"><a href="struct_vma_defragmentation_info2.html#a94c2c7223d52878445a8cccce396b671">VmaDefragmentationInfo2::maxCpuAllocationsToMove</a></div><div class="ttdeci">uint32_t maxCpuAllocationsToMove</div><div class="ttdoc">Maximum number of allocations that can be moved to a different place using transfers on CPU side,...</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:3678</div></div>
+<div class="ttc" id="astruct_vma_defragmentation_info2_html_ab6d288f29d028156cf73542d630a2e32"><div class="ttname"><a href="struct_vma_defragmentation_info2.html#ab6d288f29d028156cf73542d630a2e32">VmaDefragmentationInfo2::pAllocations</a></div><div class="ttdeci">const VmaAllocation * pAllocations</div><div class="ttdoc">Pointer to array of allocations that can be defragmented.</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:3643</div></div>
+<div class="ttc" id="astruct_vma_defragmentation_info2_html_af78e1ea40c22d85137b65f6b384a4d0a"><div class="ttname"><a href="struct_vma_defragmentation_info2.html#af78e1ea40c22d85137b65f6b384a4d0a">VmaDefragmentationInfo2::maxCpuBytesToMove</a></div><div class="ttdeci">VkDeviceSize maxCpuBytesToMove</div><div class="ttdoc">Maximum total numbers of bytes that can be copied while moving allocations to different places using ...</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:3673</div></div>
+<div class="ttc" id="avk__mem__alloc_8h_html_a36ba776fd7fd5cb1e9359fdc0d8e6e8a"><div class="ttname"><a href="vk__mem__alloc_8h.html#a36ba776fd7fd5cb1e9359fdc0d8e6e8a">vmaDefragmentationBegin</a></div><div class="ttdeci">VkResult vmaDefragmentationBegin(VmaAllocator allocator, const VmaDefragmentationInfo2 *pInfo, VmaDefragmentationStats *pStats, VmaDefragmentationContext *pContext)</div><div class="ttdoc">Begins defragmentation process.</div></div>
+<div class="ttc" id="avk__mem__alloc_8h_html_a6b0929b914b60cf2d45cac4bf3547470"><div class="ttname"><a href="vk__mem__alloc_8h.html#a6b0929b914b60cf2d45cac4bf3547470">vmaBindBufferMemory</a></div><div class="ttdeci">VkResult vmaBindBufferMemory(VmaAllocator allocator, VmaAllocation allocation, VkBuffer buffer)</div><div class="ttdoc">Binds buffer to allocation.</div></div>
+<div class="ttc" id="avk__mem__alloc_8h_html_a86dd08aba8633bfa4ad0df2e76481d8b"><div class="ttname"><a href="vk__mem__alloc_8h.html#a86dd08aba8633bfa4ad0df2e76481d8b">vmaGetAllocationInfo</a></div><div class="ttdeci">void vmaGetAllocationInfo(VmaAllocator allocator, VmaAllocation allocation, VmaAllocationInfo *pAllocationInfo)</div><div class="ttdoc">Returns current information about specified allocation and atomically marks it as used in current fra...</div></div>
+<div class="ttc" id="avk__mem__alloc_8h_html_a8774e20e91e245aae959ba63efa15dd2"><div class="ttname"><a href="vk__mem__alloc_8h.html#a8774e20e91e245aae959ba63efa15dd2">vmaDefragmentationEnd</a></div><div class="ttdeci">VkResult vmaDefragmentationEnd(VmaAllocator allocator, VmaDefragmentationContext context)</div><div class="ttdoc">Ends defragmentation process.</div></div>
 </div><!-- fragment --><p>Setting <a class="el" href="struct_vma_defragmentation_info2.html#a76d51a644dc7f5405d0cdd0025ecd0cc" title="Optional, output. Pointer to array that will be filled with information whether the allocation at cer...">VmaDefragmentationInfo2::pAllocationsChanged</a> is optional. This output array tells whether particular allocation in <a class="el" href="struct_vma_defragmentation_info2.html#ab6d288f29d028156cf73542d630a2e32" title="Pointer to array of allocations that can be defragmented.">VmaDefragmentationInfo2::pAllocations</a> at the same index has been modified during defragmentation. You can pass null, but you then need to query every allocation passed to defragmentation for new parameters using <a class="el" href="vk__mem__alloc_8h.html#a86dd08aba8633bfa4ad0df2e76481d8b" title="Returns current information about specified allocation and atomically marks it as used in current fra...">vmaGetAllocationInfo()</a> if you might need to recreate and rebind a buffer or image associated with it.</p>
 <p>If you use <a class="el" href="choosing_memory_type.html#choosing_memory_type_custom_memory_pools">Custom memory pools</a>, you can fill <a class="el" href="struct_vma_defragmentation_info2.html#a7e70aa2a1081d849dcc7829b19d3ec9d" title="Numer of pools in pPools array.">VmaDefragmentationInfo2::poolCount</a> and <a class="el" href="struct_vma_defragmentation_info2.html#a3c9c6aa5c97d5670f8e362b3a6f3029b" title="Either null or pointer to array of pools to be defragmented.">VmaDefragmentationInfo2::pPools</a> instead of <a class="el" href="struct_vma_defragmentation_info2.html#a3cf86ab32c1da779b4923d301a3056ba" title="Number of allocations in pAllocations array.">VmaDefragmentationInfo2::allocationCount</a> and <a class="el" href="struct_vma_defragmentation_info2.html#ab6d288f29d028156cf73542d630a2e32" title="Pointer to array of allocations that can be defragmented.">VmaDefragmentationInfo2::pAllocations</a> to defragment all allocations in given pools. You cannot use <a class="el" href="struct_vma_defragmentation_info2.html#a76d51a644dc7f5405d0cdd0025ecd0cc" title="Optional, output. Pointer to array that will be filled with information whether the allocation at cer...">VmaDefragmentationInfo2::pAllocationsChanged</a> in that case. You can also combine both methods.</p>
 <h1><a class="anchor" id="defragmentation_gpu"></a>
@@ -181,15 +194,18 @@
 <div class="line">        <span class="comment">// Create new buffer with same parameters.</span></div>
 <div class="line">        VkBufferCreateInfo bufferInfo = ...;</div>
 <div class="line">        vkCreateBuffer(device, &amp;bufferInfo, <span class="keyword">nullptr</span>, &amp;buffers[i]);</div>
-<div class="line">            </div>
+<div class="line"> </div>
 <div class="line">        <span class="comment">// You can make dummy call to vkGetBufferMemoryRequirements here to silence validation layer warning.</span></div>
-<div class="line">            </div>
+<div class="line"> </div>
 <div class="line">        <span class="comment">// Bind new buffer to new memory region. Data contained in it is already moved.</span></div>
 <div class="line">        <a class="code" href="struct_vma_allocation_info.html">VmaAllocationInfo</a> allocInfo;</div>
 <div class="line">        <a class="code" href="vk__mem__alloc_8h.html#a86dd08aba8633bfa4ad0df2e76481d8b">vmaGetAllocationInfo</a>(allocator, allocations[i], &amp;allocInfo);</div>
 <div class="line">        <a class="code" href="vk__mem__alloc_8h.html#a6b0929b914b60cf2d45cac4bf3547470">vmaBindBufferMemory</a>(allocator, allocations[i], buffers[i]);</div>
 <div class="line">    }</div>
 <div class="line">}</div>
+<div class="ttc" id="astruct_vma_defragmentation_info2_html_a40d53d33e71ba0b66f844ed63c05a3f6"><div class="ttname"><a href="struct_vma_defragmentation_info2.html#a40d53d33e71ba0b66f844ed63c05a3f6">VmaDefragmentationInfo2::maxGpuAllocationsToMove</a></div><div class="ttdeci">uint32_t maxGpuAllocationsToMove</div><div class="ttdoc">Maximum number of allocations that can be moved to a different place using transfers on GPU side,...</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:3688</div></div>
+<div class="ttc" id="astruct_vma_defragmentation_info2_html_a4ddbc898d0afe1518f863a3763628f08"><div class="ttname"><a href="struct_vma_defragmentation_info2.html#a4ddbc898d0afe1518f863a3763628f08">VmaDefragmentationInfo2::maxGpuBytesToMove</a></div><div class="ttdeci">VkDeviceSize maxGpuBytesToMove</div><div class="ttdoc">Maximum total numbers of bytes that can be copied while moving allocations to different places using ...</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:3683</div></div>
+<div class="ttc" id="astruct_vma_defragmentation_info2_html_a7f71f39590c5316771493d2333f9c1bd"><div class="ttname"><a href="struct_vma_defragmentation_info2.html#a7f71f39590c5316771493d2333f9c1bd">VmaDefragmentationInfo2::commandBuffer</a></div><div class="ttdeci">VkCommandBuffer commandBuffer</div><div class="ttdoc">Optional. Command buffer where GPU copy commands will be posted.</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:3697</div></div>
 </div><!-- fragment --><p>You can combine these two methods by specifying non-zero <code>maxGpu*</code> as well as <code>maxCpu*</code> parameters. The library automatically chooses best method to defragment each memory pool.</p>
 <p>You may try not to block your entire program to wait until defragmentation finishes, but do it in the background, as long as you carefully fullfill requirements described in function <a class="el" href="vk__mem__alloc_8h.html#a36ba776fd7fd5cb1e9359fdc0d8e6e8a" title="Begins defragmentation process.">vmaDefragmentationBegin()</a>.</p>
 <h1><a class="anchor" id="defragmentation_additional_notes"></a>
@@ -202,7 +218,7 @@
 <p>Defragmentation of images created with <code>VK_IMAGE_TILING_OPTIMAL</code> or in any other layout may give undefined results.</p>
 <p>If you defragment allocations bound to images, new images to be bound to new memory region after defragmentation should be created with <code>VK_IMAGE_LAYOUT_PREINITIALIZED</code> and then transitioned to their original layout from before defragmentation if needed using an image memory barrier.</p>
 <p>While using defragmentation, you may experience validation layer warnings, which you just need to ignore. See <a class="el" href="general_considerations.html#general_considerations_validation_layer_warnings">Validation layer warnings</a>.</p>
-<p>Please don't expect memory to be fully compacted after defragmentation. Algorithms inside are based on some heuristics that try to maximize number of Vulkan memory blocks to make totally empty to release them, as well as to maximimze continuous empty space inside remaining blocks, while minimizing the number and size of allocations that need to be moved. Some fragmentation may still remain - this is normal.</p>
+<p>Please don't expect memory to be fully compacted after defragmentation. Algorithms inside are based on some heuristics that try to maximize number of Vulkan memory blocks to make totally empty to release them, as well as to maximize continuous empty space inside remaining blocks, while minimizing the number and size of allocations that need to be moved. Some fragmentation may still remain - this is normal.</p>
 <h1><a class="anchor" id="defragmentation_custom_algorithm"></a>
 Writing custom defragmentation algorithm</h1>
 <p>If you want to implement your own, custom defragmentation algorithm, there is infrastructure prepared for that, but it is not exposed through the library API - you need to hack its source code. Here are steps needed to do this:</p>
@@ -214,27 +230,9 @@
 </ol>
 </div></div><!-- contents -->
 </div><!-- PageDoc -->
-<div class="ttc" id="astruct_vma_defragmentation_info2_html_a3cf86ab32c1da779b4923d301a3056ba"><div class="ttname"><a href="struct_vma_defragmentation_info2.html#a3cf86ab32c1da779b4923d301a3056ba">VmaDefragmentationInfo2::allocationCount</a></div><div class="ttdeci">uint32_t allocationCount</div><div class="ttdoc">Number of allocations in pAllocations array.</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:3478</div></div>
-<div class="ttc" id="astruct_vma_allocator_html"><div class="ttname"><a href="struct_vma_allocator.html">VmaAllocator</a></div><div class="ttdoc">Represents main object of this library initialized.</div></div>
-<div class="ttc" id="avk__mem__alloc_8h_html_a86dd08aba8633bfa4ad0df2e76481d8b"><div class="ttname"><a href="vk__mem__alloc_8h.html#a86dd08aba8633bfa4ad0df2e76481d8b">vmaGetAllocationInfo</a></div><div class="ttdeci">void vmaGetAllocationInfo(VmaAllocator allocator, VmaAllocation allocation, VmaAllocationInfo *pAllocationInfo)</div><div class="ttdoc">Returns current information about specified allocation and atomically marks it as used in current fra...</div></div>
-<div class="ttc" id="avk__mem__alloc_8h_html_a8774e20e91e245aae959ba63efa15dd2"><div class="ttname"><a href="vk__mem__alloc_8h.html#a8774e20e91e245aae959ba63efa15dd2">vmaDefragmentationEnd</a></div><div class="ttdeci">VkResult vmaDefragmentationEnd(VmaAllocator allocator, VmaDefragmentationContext context)</div><div class="ttdoc">Ends defragmentation process.</div></div>
-<div class="ttc" id="astruct_vma_defragmentation_info2_html_a4ddbc898d0afe1518f863a3763628f08"><div class="ttname"><a href="struct_vma_defragmentation_info2.html#a4ddbc898d0afe1518f863a3763628f08">VmaDefragmentationInfo2::maxGpuBytesToMove</a></div><div class="ttdeci">VkDeviceSize maxGpuBytesToMove</div><div class="ttdoc">Maximum total numbers of bytes that can be copied while moving allocations to different places using ...</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:3527</div></div>
-<div class="ttc" id="astruct_vma_defragmentation_info2_html_a7f71f39590c5316771493d2333f9c1bd"><div class="ttname"><a href="struct_vma_defragmentation_info2.html#a7f71f39590c5316771493d2333f9c1bd">VmaDefragmentationInfo2::commandBuffer</a></div><div class="ttdeci">VkCommandBuffer commandBuffer</div><div class="ttdoc">Optional. Command buffer where GPU copy commands will be posted.</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:3541</div></div>
-<div class="ttc" id="astruct_vma_defragmentation_info2_html"><div class="ttname"><a href="struct_vma_defragmentation_info2.html">VmaDefragmentationInfo2</a></div><div class="ttdoc">Parameters for defragmentation.</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:3472</div></div>
-<div class="ttc" id="avk__mem__alloc_8h_html_a6b0929b914b60cf2d45cac4bf3547470"><div class="ttname"><a href="vk__mem__alloc_8h.html#a6b0929b914b60cf2d45cac4bf3547470">vmaBindBufferMemory</a></div><div class="ttdeci">VkResult vmaBindBufferMemory(VmaAllocator allocator, VmaAllocation allocation, VkBuffer buffer)</div><div class="ttdoc">Binds buffer to allocation.</div></div>
-<div class="ttc" id="astruct_vma_defragmentation_info2_html_ab6d288f29d028156cf73542d630a2e32"><div class="ttname"><a href="struct_vma_defragmentation_info2.html#ab6d288f29d028156cf73542d630a2e32">VmaDefragmentationInfo2::pAllocations</a></div><div class="ttdeci">const VmaAllocation * pAllocations</div><div class="ttdoc">Pointer to array of allocations that can be defragmented.</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:3487</div></div>
-<div class="ttc" id="astruct_vma_defragmentation_info2_html_a40d53d33e71ba0b66f844ed63c05a3f6"><div class="ttname"><a href="struct_vma_defragmentation_info2.html#a40d53d33e71ba0b66f844ed63c05a3f6">VmaDefragmentationInfo2::maxGpuAllocationsToMove</a></div><div class="ttdeci">uint32_t maxGpuAllocationsToMove</div><div class="ttdoc">Maximum number of allocations that can be moved to a different place using transfers on GPU side,...</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:3532</div></div>
-<div class="ttc" id="astruct_vma_defragmentation_info2_html_af78e1ea40c22d85137b65f6b384a4d0a"><div class="ttname"><a href="struct_vma_defragmentation_info2.html#af78e1ea40c22d85137b65f6b384a4d0a">VmaDefragmentationInfo2::maxCpuBytesToMove</a></div><div class="ttdeci">VkDeviceSize maxCpuBytesToMove</div><div class="ttdoc">Maximum total numbers of bytes that can be copied while moving allocations to different places using ...</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:3517</div></div>
-<div class="ttc" id="avk__mem__alloc_8h_html_a36ba776fd7fd5cb1e9359fdc0d8e6e8a"><div class="ttname"><a href="vk__mem__alloc_8h.html#a36ba776fd7fd5cb1e9359fdc0d8e6e8a">vmaDefragmentationBegin</a></div><div class="ttdeci">VkResult vmaDefragmentationBegin(VmaAllocator allocator, const VmaDefragmentationInfo2 *pInfo, VmaDefragmentationStats *pStats, VmaDefragmentationContext *pContext)</div><div class="ttdoc">Begins defragmentation process.</div></div>
-<div class="ttc" id="astruct_vma_defragmentation_info2_html_a76d51a644dc7f5405d0cdd0025ecd0cc"><div class="ttname"><a href="struct_vma_defragmentation_info2.html#a76d51a644dc7f5405d0cdd0025ecd0cc">VmaDefragmentationInfo2::pAllocationsChanged</a></div><div class="ttdeci">VkBool32 * pAllocationsChanged</div><div class="ttdoc">Optional, output. Pointer to array that will be filled with information whether the allocation at cer...</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:3493</div></div>
-<div class="ttc" id="astruct_vma_allocation_info_html"><div class="ttname"><a href="struct_vma_allocation_info.html">VmaAllocationInfo</a></div><div class="ttdoc">Parameters of VmaAllocation objects, that can be retrieved using function vmaGetAllocationInfo().</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:3072</div></div>
-<div class="ttc" id="astruct_vma_defragmentation_context_html"><div class="ttname"><a href="struct_vma_defragmentation_context.html">VmaDefragmentationContext</a></div><div class="ttdoc">Represents Opaque object that represents started defragmentation process.</div></div>
-<div class="ttc" id="astruct_vma_defragmentation_info2_html_a94c2c7223d52878445a8cccce396b671"><div class="ttname"><a href="struct_vma_defragmentation_info2.html#a94c2c7223d52878445a8cccce396b671">VmaDefragmentationInfo2::maxCpuAllocationsToMove</a></div><div class="ttdeci">uint32_t maxCpuAllocationsToMove</div><div class="ttdoc">Maximum number of allocations that can be moved to a different place using transfers on CPU side,...</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:3522</div></div>
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated by &#160;<a href="http://www.doxygen.org/index.html">
-<img class="footer" src="doxygen.png" alt="doxygen"/>
-</a> 1.8.18
+Generated by&#160;<a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.1
 </small></address>
 </body>
 </html>
diff --git a/third_party/vulkan_memory_allocator/docs/html/deprecated.html b/third_party/vulkan_memory_allocator/docs/html/deprecated.html
index 1d092b0..033bb68 100644
--- a/third_party/vulkan_memory_allocator/docs/html/deprecated.html
+++ b/third_party/vulkan_memory_allocator/docs/html/deprecated.html
@@ -3,7 +3,7 @@
 <head>
 <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
 <meta http-equiv="X-UA-Compatible" content="IE=9"/>
-<meta name="generator" content="Doxygen 1.8.18"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
 <meta name="viewport" content="width=device-width, initial-scale=1"/>
 <title>Vulkan Memory Allocator: Deprecated List</title>
 <link href="tabs.css" rel="stylesheet" type="text/css"/>
@@ -29,10 +29,10 @@
 </table>
 </div>
 <!-- end header part -->
-<!-- Generated by Doxygen 1.8.18 -->
+<!-- Generated by Doxygen 1.9.1 -->
 <script type="text/javascript">
 /* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
-var searchBox = new SearchBox("searchBox", "search",false,'Search');
+var searchBox = new SearchBox("searchBox", "search",false,'Search','.html');
 /* @license-end */
 </script>
 <script type="text/javascript" src="menudata.js"></script>
@@ -66,20 +66,16 @@
 </div><!--header-->
 <div class="contents">
 <div class="textblock"><dl class="reflist">
-<dt>Member <a class="el" href="vk__mem__alloc_8h.html#a0ff488958ca72b28e545880463cb8696">vmaResizeAllocation</a>  (<a class="el" href="struct_vma_allocator.html" title="Represents main object of this library initialized.">VmaAllocator</a> allocator, <a class="el" href="struct_vma_allocation.html" title="Represents single memory allocation.">VmaAllocation</a> allocation, VkDeviceSize newSize)</dt>
-<dd><a class="anchor" id="_deprecated000001"></a> In version 2.2.0 it used to try to change allocation's size without moving or reallocating it. In current version it returns <code>VK_SUCCESS</code> only if <code>newSize</code> equals current allocation's size. Otherwise returns <code>VK_ERROR_OUT_OF_POOL_MEMORY</code>, indicating that allocation's size could not be changed.  </dd>
-<dt>Member <a class="el" href="vk__mem__alloc_8h.html#a2bf47f96bf92bed2a49461bd9af3acfa">VmaDefragmentationInfo</a>  </dt>
-<dd><a class="anchor" id="_deprecated000002"></a>This is a part of the old interface. It is recommended to use structure <a class="el" href="struct_vma_defragmentation_info2.html" title="Parameters for defragmentation.">VmaDefragmentationInfo2</a> and function <a class="el" href="vk__mem__alloc_8h.html#a36ba776fd7fd5cb1e9359fdc0d8e6e8a" title="Begins defragmentation process.">vmaDefragmentationBegin()</a> instead.  </dd>
 <dt>Member <a class="el" href="vk__mem__alloc_8h.html#a9f0f8f56db5f7f57fe4454f465142dac">vmaDefragment</a>  (<a class="el" href="struct_vma_allocator.html" title="Represents main object of this library initialized.">VmaAllocator</a> allocator, const <a class="el" href="struct_vma_allocation.html" title="Represents single memory allocation.">VmaAllocation</a> *pAllocations, size_t allocationCount, VkBool32 *pAllocationsChanged, const <a class="el" href="struct_vma_defragmentation_info.html" title="Deprecated. Optional configuration parameters to be passed to function vmaDefragment().">VmaDefragmentationInfo</a> *pDefragmentationInfo, <a class="el" href="struct_vma_defragmentation_stats.html" title="Statistics returned by function vmaDefragment().">VmaDefragmentationStats</a> *pDefragmentationStats)</dt>
-<dd><a class="anchor" id="_deprecated000003"></a>This is a part of the old interface. It is recommended to use structure <a class="el" href="struct_vma_defragmentation_info2.html" title="Parameters for defragmentation.">VmaDefragmentationInfo2</a> and function <a class="el" href="vk__mem__alloc_8h.html#a36ba776fd7fd5cb1e9359fdc0d8e6e8a" title="Begins defragmentation process.">vmaDefragmentationBegin()</a> instead.</dd>
+<dd><a class="anchor" id="_deprecated000002"></a>This is a part of the old interface. It is recommended to use structure <a class="el" href="struct_vma_defragmentation_info2.html" title="Parameters for defragmentation.">VmaDefragmentationInfo2</a> and function <a class="el" href="vk__mem__alloc_8h.html#a36ba776fd7fd5cb1e9359fdc0d8e6e8a" title="Begins defragmentation process.">vmaDefragmentationBegin()</a> instead. </dd>
+<dt>Member <a class="el" href="vk__mem__alloc_8h.html#a2bf47f96bf92bed2a49461bd9af3acfa">VmaDefragmentationInfo</a>  </dt>
+<dd><a class="anchor" id="_deprecated000001"></a>This is a part of the old interface. It is recommended to use structure <a class="el" href="struct_vma_defragmentation_info2.html" title="Parameters for defragmentation.">VmaDefragmentationInfo2</a> and function <a class="el" href="vk__mem__alloc_8h.html#a36ba776fd7fd5cb1e9359fdc0d8e6e8a" title="Begins defragmentation process.">vmaDefragmentationBegin()</a> instead. </dd>
 </dl>
 </div></div><!-- contents -->
 </div><!-- PageDoc -->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated by &#160;<a href="http://www.doxygen.org/index.html">
-<img class="footer" src="doxygen.png" alt="doxygen"/>
-</a> 1.8.18
+Generated by&#160;<a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.1
 </small></address>
 </body>
 </html>
diff --git a/third_party/vulkan_memory_allocator/docs/html/dir_d44c64559bbebec7f509842c48db8b23.html b/third_party/vulkan_memory_allocator/docs/html/dir_d44c64559bbebec7f509842c48db8b23.html
new file mode 100644
index 0000000..32f53c1
--- /dev/null
+++ b/third_party/vulkan_memory_allocator/docs/html/dir_d44c64559bbebec7f509842c48db8b23.html
@@ -0,0 +1,84 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>Vulkan Memory Allocator: include Directory Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">Vulkan Memory Allocator
+   </div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.9.1 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+var searchBox = new SearchBox("searchBox", "search",false,'Search','.html');
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+/* @license-end */</script>
+<div id="main-nav"></div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+     onmouseover="return searchBox.OnSearchSelectShow()"
+     onmouseout="return searchBox.OnSearchSelectHide()"
+     onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div id="nav-path" class="navpath">
+  <ul>
+<li class="navelem"><a class="el" href="dir_d44c64559bbebec7f509842c48db8b23.html">include</a></li>  </ul>
+</div>
+</div><!-- top -->
+<div class="header">
+  <div class="headertitle">
+<div class="title">include Directory Reference</div>  </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="files"></a>
+Files</h2></td></tr>
+<tr class="memitem:vk__mem__alloc_8h"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="vk__mem__alloc_8h.html">vk_mem_alloc.h</a> <a href="vk__mem__alloc_8h_source.html">[code]</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+</div><!-- contents -->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by&#160;<a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.1
+</small></address>
+</body>
+</html>
diff --git a/third_party/vulkan_memory_allocator/docs/html/doxygen.css b/third_party/vulkan_memory_allocator/docs/html/doxygen.css
index 5e35db3..ffbff02 100644
--- a/third_party/vulkan_memory_allocator/docs/html/doxygen.css
+++ b/third_party/vulkan_memory_allocator/docs/html/doxygen.css
@@ -1,4 +1,4 @@
-/* The standard CSS for doxygen 1.8.18 */
+/* The standard CSS for doxygen 1.9.1 */
 
 body, table, div, p, dl {
 	font: 400 14px/22px Roboto,sans-serif;
@@ -66,7 +66,7 @@
 	margin-top: 2px;
 }
 
-th p.starttd, p.intertd, p.endtd {
+th p.starttd, th p.intertd, th p.endtd {
         font-size: 100%;
         font-weight: 700;
 }
@@ -103,30 +103,96 @@
 }
 
 span.legend {
-        font-size: 70%;
-        text-align: center;
-}
-
-h3.version {
-        font-size: 90%;
-        text-align: center;
-}
-
-div.qindex, div.navtab{
-	background-color: #EBEFF6;
-	border: 1px solid #A3B4D7;
+	font-size: 70%;
 	text-align: center;
 }
 
-div.qindex, div.navpath {
-	width: 100%;
-	line-height: 140%;
+h3.version {
+	font-size: 90%;
+	text-align: center;
 }
 
 div.navtab {
-	margin-right: 15px;
+	border-right: 1px solid #A3B4D7;
+	padding-right: 15px;
+	text-align: right;
+	line-height: 110%;
 }
 
+div.navtab table {
+	border-spacing: 0;
+}
+
+td.navtab {
+	padding-right: 6px;
+	padding-left: 6px;
+}
+td.navtabHL {
+	background-image: url('tab_a.png');
+	background-repeat:repeat-x;
+	padding-right: 6px;
+	padding-left: 6px;
+}
+
+td.navtabHL a, td.navtabHL a:visited {
+	color: #fff;
+	text-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0);
+}
+
+a.navtab {
+	font-weight: bold;
+}
+
+div.qindex{
+	text-align: center;
+	width: 100%;
+	line-height: 140%;
+	font-size: 130%;
+	color: #A0A0A0;
+}
+
+dt.alphachar{
+	font-size: 180%;
+	font-weight: bold;
+}
+
+.alphachar a{
+	color: black;
+}
+
+.alphachar a:hover, .alphachar a:visited{
+	text-decoration: none;
+}
+
+.classindex dl {
+	padding: 25px;
+	column-count:1
+}
+
+.classindex dd {
+	display:inline-block;
+	margin-left: 50px;
+	width: 90%;
+	line-height: 1.15em;
+}
+
+.classindex dl.odd {
+	background-color: #F8F9FC;
+}
+
+@media(min-width: 1120px) {
+	.classindex dl {
+		column-count:2
+	}
+}
+
+@media(min-width: 1320px) {
+	.classindex dl {
+		column-count:3
+	}
+}
+
+
 /* @group Link Styling */
 
 a {
@@ -143,17 +209,6 @@
 	text-decoration: underline;
 }
 
-a.qindex {
-	font-weight: bold;
-}
-
-a.qindexHL {
-	font-weight: bold;
-	background-color: #9CAFD4;
-	color: #FFFFFF;
-	border: 1px double #869DCA;
-}
-
 .contents a.qindexHL:visited {
         color: #FFFFFF;
 }
@@ -1358,10 +1413,12 @@
         font-weight:bold;
         margin-right:10px;
         padding:5px;
+        text-align:right;
+        width:52px;
 }
 
 dl.citelist dd {
-        margin:2px 0;
+        margin:2px 0 2px 72px;
         padding:5px 0;
 }
 
@@ -1424,6 +1481,12 @@
         margin-left: 45px;
 }
 
+span.emoji {
+        /* font family used at the site: https://unicode.org/emoji/charts/full-emoji-list.html
+         * font-family: "Noto Color Emoji", "Apple Color Emoji", "Segoe UI Emoji", Times, Symbola, Aegyptus, Code2000, Code2001, Code2002, Musica, serif, LastResort;
+         */
+}
+
 .PageDocRTL-title div.toc li.level1 {
   margin-left: 0 !important;
   margin-right: 0;
diff --git a/third_party/vulkan_memory_allocator/docs/html/doxygen.png b/third_party/vulkan_memory_allocator/docs/html/doxygen.png
deleted file mode 100644
index 3ff17d8..0000000
--- a/third_party/vulkan_memory_allocator/docs/html/doxygen.png
+++ /dev/null
Binary files differ
diff --git a/third_party/vulkan_memory_allocator/docs/html/doxygen.svg b/third_party/vulkan_memory_allocator/docs/html/doxygen.svg
new file mode 100644
index 0000000..d42dad5
--- /dev/null
+++ b/third_party/vulkan_memory_allocator/docs/html/doxygen.svg
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg version="1.1" viewBox="0 0 104 31" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+ <defs>
+  <linearGradient id="a">
+   <stop stop-color="#5373B4" offset="0"/>
+   <stop stop-color="#7C95C6" offset="1"/>
+  </linearGradient>
+  <linearGradient id="d" x1="31.474" x2="31.474" y1="24.821" y2="26.773" gradientUnits="userSpaceOnUse" xlink:href="#a"/>
+  <linearGradient id="c" x1="31.474" x2="31.474" y1="24.821" y2="26.773" gradientTransform="matrix(.6816 0 0 1.0248 72.391 -.91809)" gradientUnits="userSpaceOnUse" xlink:href="#a"/>
+  <linearGradient id="b" x1="56.295" x2="56.295" y1="24.622" y2="26.574" gradientUnits="userSpaceOnUse" xlink:href="#a"/>
+  <linearGradient id="e" x1="49.067" x2="48.956" y1="19.719" y2="9.5227" gradientTransform="matrix(.97968 0 0 1.0207 -.25579 -.25579)" gradientUnits="userSpaceOnUse">
+   <stop stop-color="#C0CCE3" offset="0"/>
+   <stop stop-color="#EEF1F7" offset="1"/>
+  </linearGradient>
+  <filter id="f" x="-.010676" y="-.045304" width="1.0214" height="1.0906" color-interpolation-filters="sRGB">
+   <feGaussianBlur stdDeviation="0.45293203"/>
+  </filter>
+ </defs>
+ <g>
+  <path transform="translate(-2.5759 -27.848)" d="m13.609 32.203v6.8633h-0.05078c-0.40533-0.66867-0.96254-1.1715-1.6719-1.5059-0.69244-0.35193-1.4282-0.52734-2.2051-0.52734-0.96267 0-1.807 0.2027-2.5332 0.60742-0.72622 0.38713-1.3344 0.90556-1.8242 1.5566-0.47289 0.65108-0.83456 1.4092-1.0879 2.2715-0.23644 0.84464-0.35547 1.7236-0.35547 2.6387 0 0.95022 0.11902 1.8643 0.35547 2.7441 0.25333 0.87983 0.615 1.6633 1.0879 2.3496 0.48978 0.66867 1.1065 1.2066 1.8496 1.6113 0.74311 0.38713 1.6044 0.58008 2.584 0.58008 0.86133 0 1.6311-0.15787 2.3066-0.47461 0.69244-0.33434 1.2497-0.87227 1.6719-1.6113h0.05078v1.7422h3.4199v-18.846zm12.875 4.8301c-1.0302 0-1.9596 0.17541-2.7871 0.52734-0.82756 0.33434-1.5358 0.81965-2.127 1.4531-0.59111 0.61588-1.0483 1.3721-1.3691 2.2695-0.32089 0.87983-0.48047 1.866-0.48047 2.957s0.15958 2.0752 0.48047 2.9551c0.32089 0.87983 0.77803 1.6361 1.3691 2.2695 0.59111 0.61588 1.2994 1.0914 2.127 1.4258 0.82756 0.33434 1.7569 0.50195 2.7871 0.50195 1.0302 0 1.9596-0.16762 2.7871-0.50195 0.84444-0.33434 1.5612-0.8099 2.1523-1.4258 0.59111-0.63348 1.0483-1.3897 1.3691-2.2695 0.32089-0.87983 0.48047-1.8641 0.48047-2.9551s-0.15958-2.0772-0.48047-2.957c-0.32089-0.89743-0.77803-1.6536-1.3691-2.2695-0.59111-0.63348-1.3079-1.1188-2.1523-1.4531-0.82756-0.35193-1.7569-0.52734-2.7871-0.52734zm41.715 0c-0.912 0-1.7223 0.18516-2.4316 0.55469-0.69244 0.36953-1.2752 0.87043-1.748 1.5039-0.47289 0.61588-0.83651 1.337-1.0898 2.1641-0.23645 0.80944-0.35352 1.6553-0.35352 2.5352 0 0.93262 0.10007 1.8214 0.30273 2.666 0.21956 0.82704 0.55767 1.556 1.0137 2.1895 0.456 0.61588 1.0387 1.109 1.748 1.4785 0.70933 0.35193 1.5536 0.5293 2.5332 0.5293 0.79378 0 1.5446-0.16762 2.2539-0.50195 0.72622-0.35193 1.2834-0.88986 1.6719-1.6113h0.05078v1.7949c0.01689 0.96782-0.21071 1.7689-0.68359 2.4023-0.456 0.63348-1.1898 0.95117-2.2031 0.95117-0.64178 0-1.2075-0.14228-1.6973-0.42383-0.48978-0.26395-0.81939-0.74731-0.98828-1.4512h-3.5723c0.05067 0.77425 0.25276 1.435 0.60742 1.9805 0.37156 0.56309 0.8287 1.0192 1.3691 1.3711 0.55733 0.35193 1.1656 0.60726 1.8242 0.76562 0.67556 0.17597 1.3328 0.26562 1.9746 0.26562 1.5031 0 2.7025-0.21245 3.5977-0.63477 0.89511-0.42232 1.5798-0.94076 2.0527-1.5566 0.47289-0.59829 0.777-1.2493 0.91211-1.9531 0.152-0.70386 0.22656-1.3295 0.22656-1.875v-12.775h-3.4199v1.8223h-0.05078c-0.43911-0.79185-0.98782-1.3551-1.6465-1.6895-0.64178-0.33434-1.3926-0.50195-2.2539-0.50195zm16.523 0c-0.99644 0-1.9088 0.18516-2.7363 0.55469-0.81067 0.36953-1.5124 0.88018-2.1035 1.5312-0.59111 0.63348-1.0463 1.3897-1.3672 2.2695s-0.48047 1.831-0.48047 2.8516c0 1.0558 0.15108 2.0225 0.45508 2.9023 0.32089 0.87983 0.76758 1.6361 1.3418 2.2695 0.57422 0.63348 1.276 1.1266 2.1035 1.4785 0.82756 0.33434 1.7569 0.50195 2.7871 0.50195 1.4862 0 2.7517-0.35277 3.7988-1.0566 1.0471-0.70387 1.8254-1.8733 2.332-3.5098h-3.168c-0.11822 0.42232-0.43934 0.82772-0.96289 1.2148-0.52355 0.36953-1.1468 0.55274-1.873 0.55273-1.0133 0-1.7916-0.27286-2.332-0.81836-0.54044-0.5455-0.83605-1.4245-0.88672-2.6387h9.4492c0.06756-1.0558-0.01551-2.0673-0.25195-3.0352-0.23644-0.96782-0.62557-1.8293-1.166-2.5859-0.52356-0.75666-1.1998-1.355-2.0273-1.7949-0.82756-0.45751-1.7974-0.6875-2.9121-0.6875zm16.189 0c-0.76 0-1.5023 0.18516-2.2285 0.55469-0.72622 0.35193-1.3174 0.92299-1.7734 1.7148h-0.07617v-1.9004h-3.4199v13.646h3.5977v-7.1523c0-1.3901 0.21909-2.3841 0.6582-2.9824 0.43911-0.61588 1.1494-0.92383 2.1289-0.92383 0.86133 0 1.4611 0.28066 1.7988 0.84375 0.33777 0.5455 0.50586 1.3816 0.50586 2.5078v7.707h3.5976v-8.3926c0-0.84464-0.0765-1.6106-0.22851-2.2969-0.13511-0.70387-0.37971-1.2925-0.73438-1.7676-0.35466-0.49271-0.84386-0.87277-1.4688-1.1367-0.608-0.28155-1.3948-0.42188-2.3574-0.42188zm-66.063 0.36914 4.3066 6.4668-4.7129 7.1797h4.0293l2.7363-4.3027 2.7344 4.3027h4.1055l-4.8398-7.2578 4.3066-6.3887h-3.9766l-2.2793 3.5645-2.3066-3.5645zm13.275 0 4.584 12.803c0.10133 0.26395 0.15234 0.54461 0.15234 0.84375 0 0.40472-0.11707 0.77504-0.35352 1.1094-0.21956 0.33434-0.56617 0.52729-1.0391 0.58008-0.35467 0.0176-0.70979 0.0098-1.0645-0.02539-0.35467-0.03519-0.70128-0.07028-1.0391-0.10547v3.0879c0.37156 0.03519 0.73518 0.06051 1.0898 0.07813 0.37156 0.03519 0.74368 0.05273 1.1152 0.05273 1.2329 0 2.1943-0.23778 2.8867-0.71289 0.69244-0.47511 1.2326-1.2664 1.6211-2.375l5.4727-15.336h-3.7246l-2.8613 9.3438h-0.05078l-2.9648-9.3438zm-37.48 2.4551c0.59111 0 1.0823 0.12279 1.4707 0.36914 0.38844 0.24635 0.6991 0.57184 0.93555 0.97656 0.25333 0.38713 0.43187 0.84515 0.5332 1.373 0.10133 0.5103 0.15234 1.0482 0.15234 1.6113 0 0.56309-0.05101 1.1069-0.15234 1.6348-0.10133 0.5279-0.27137 1.0035-0.50781 1.4258-0.23644 0.40472-0.5556 0.73021-0.96094 0.97656-0.38844 0.24635-0.87959 0.36914-1.4707 0.36914-0.55733 0-1.038-0.12279-1.4434-0.36914-0.38844-0.26395-0.71806-0.59723-0.98828-1.002-0.25333-0.42232-0.43842-0.89788-0.55664-1.4258s-0.17773-1.0561-0.17773-1.584c-1e-7 -0.56309 0.05101-1.0991 0.15234-1.6094 0.11822-0.5279 0.29481-0.99567 0.53125-1.4004 0.25333-0.40472 0.58295-0.73021 0.98828-0.97656 0.40533-0.24635 0.90303-0.36914 1.4941-0.36914zm15.84 0c0.608 0 1.1142 0.13253 1.5195 0.39648 0.42222 0.24635 0.75184 0.57184 0.98828 0.97656 0.25333 0.40472 0.42992 0.87054 0.53125 1.3984 0.10133 0.5279 0.15234 1.0658 0.15234 1.6113 0 0.5455-0.05101 1.0815-0.15234 1.6094-0.10134 0.5103-0.27792 0.97612-0.53125 1.3984-0.23644 0.40472-0.56606 0.73021-0.98828 0.97656-0.40533 0.24635-0.91153 0.36914-1.5195 0.36914-0.608 0-1.1142-0.12279-1.5195-0.36914s-0.73495-0.57184-0.98828-0.97656c-0.23644-0.42232-0.40648-0.88814-0.50781-1.3984-0.10133-0.5279-0.15234-1.0639-0.15234-1.6094 0-0.5455 0.05101-1.0834 0.15234-1.6113 0.10133-0.5279 0.27137-0.99371 0.50781-1.3984 0.25333-0.40472 0.58295-0.73021 0.98828-0.97656 0.40533-0.26395 0.91153-0.39648 1.5195-0.39648zm42.602 0c0.59111 0 1.0803 0.11499 1.4688 0.34375 0.38844 0.22876 0.70105 0.5367 0.9375 0.92383 0.23644 0.38713 0.40648 0.8354 0.50781 1.3457 0.10133 0.49271 0.15039 1.0209 0.15039 1.584 0 0.4927-0.06606 0.96827-0.20117 1.4258-0.11822 0.43992-0.30526 0.83557-0.55859 1.1875-0.25333 0.35193-0.57445 0.63259-0.96289 0.84375-0.38844 0.21116-0.83513 0.31836-1.3418 0.31836-0.55733 0-1.021-0.12474-1.3926-0.37109-0.37156-0.24635-0.67566-0.56209-0.91211-0.94922-0.21956-0.38713-0.38109-0.81786-0.48242-1.293-0.08444-0.49271-0.12695-0.98581-0.12695-1.4785 0-0.5103 0.05101-0.99366 0.15234-1.4512 0.11822-0.47511 0.29676-0.89025 0.5332-1.2422 0.25333-0.36953 0.55744-0.65993 0.91211-0.87109 0.37156-0.21116 0.80974-0.31641 1.3164-0.31641zm15.535 0c0.87822 0 1.529 0.24753 1.9512 0.74023 0.43911 0.49271 0.74322 1.2138 0.91211 2.1641h-5.8535c0.01689-0.26395 0.0679-0.5641 0.15234-0.89844 0.10133-0.33434 0.26287-0.65008 0.48242-0.94922 0.23644-0.29914 0.54055-0.54667 0.91211-0.74023 0.38845-0.21116 0.86914-0.31641 1.4434-0.31641z" filter="url(#f)" opacity=".3" stroke="#969696" xlink:href="#path141"/>
+  <path d="m0.97202 24.161 43.605-0.0019 0.0508 3.3061-43.6 0.04174z" fill="url(#d)" stroke="#000" stroke-width=".5"/>
+  <path d="m10.283 3.5547v6.8633h-0.05078c-0.40533-0.66867-0.96254-1.1715-1.6719-1.5059-0.69244-0.35193-1.4282-0.52734-2.2051-0.52734-0.96267 0-1.807 0.2027-2.5332 0.60742-0.72622 0.38713-1.3344 0.90556-1.8242 1.5566-0.47289 0.65108-0.83456 1.4092-1.0879 2.2715-0.23644 0.84464-0.35547 1.7236-0.35547 2.6387 0 0.95022 0.11902 1.8643 0.35547 2.7441 0.25333 0.87983 0.615 1.6633 1.0879 2.3496 0.48978 0.66867 1.1065 1.2066 1.8496 1.6113 0.74311 0.38713 1.6044 0.58008 2.584 0.58008 0.86133 0 1.6311-0.15787 2.3066-0.47461 0.69244-0.33434 1.2497-0.87227 1.6719-1.6113h0.05078v1.7422h3.4199v-18.846zm12.875 4.8301c-1.0302 0-1.9596 0.17541-2.7871 0.52734-0.82756 0.33434-1.5358 0.81965-2.127 1.4531-0.59111 0.61588-1.0483 1.3721-1.3691 2.2695-0.32089 0.87983-0.48047 1.866-0.48047 2.957s0.15958 2.0752 0.48047 2.9551c0.32089 0.87983 0.77803 1.6361 1.3691 2.2695 0.59111 0.61588 1.2994 1.0914 2.127 1.4258 0.82756 0.33434 1.7569 0.50195 2.7871 0.50195 1.0302 0 1.9596-0.16762 2.7871-0.50195 0.84444-0.33434 1.5612-0.8099 2.1523-1.4258 0.59111-0.63348 1.0483-1.3897 1.3691-2.2695 0.32089-0.87983 0.48047-1.8641 0.48047-2.9551s-0.15958-2.0772-0.48047-2.957c-0.32089-0.89743-0.77803-1.6536-1.3691-2.2695-0.59111-0.63348-1.3079-1.1188-2.1523-1.4531-0.82756-0.35193-1.7569-0.52734-2.7871-0.52734zm41.715 0c-0.912 0-1.7223 0.18516-2.4316 0.55469-0.69244 0.36953-1.2752 0.87043-1.748 1.5039-0.47289 0.61588-0.83651 1.337-1.0898 2.1641-0.23644 0.80944-0.35352 1.6553-0.35352 2.5352 0 0.93262 0.10007 1.8214 0.30273 2.666 0.21956 0.82704 0.55767 1.556 1.0137 2.1895 0.456 0.61588 1.0387 1.109 1.748 1.4785 0.70933 0.35193 1.5536 0.5293 2.5332 0.5293 0.79378 0 1.5446-0.16762 2.2539-0.50195 0.72622-0.35193 1.2834-0.88986 1.6719-1.6113h0.05078v1.7949c0.01689 0.96782-0.21071 1.7689-0.68359 2.4023-0.456 0.63348-1.1898 0.95117-2.2031 0.95117-0.64178 0-1.2075-0.14228-1.6973-0.42383-0.48978-0.26395-0.81939-0.74731-0.98828-1.4512h-3.5723c0.05067 0.77425 0.25276 1.435 0.60742 1.9805 0.37156 0.56309 0.8287 1.0192 1.3691 1.3711 0.55733 0.35193 1.1656 0.60726 1.8242 0.76562 0.67556 0.17597 1.3328 0.26562 1.9746 0.26562 1.5031 0 2.7025-0.21245 3.5977-0.63477 0.89511-0.42232 1.5798-0.94076 2.0527-1.5566 0.47289-0.59829 0.777-1.2493 0.91211-1.9531 0.152-0.70386 0.22656-1.3295 0.22656-1.875v-12.775h-3.4199v1.8223h-0.05078c-0.43911-0.79185-0.98782-1.3551-1.6465-1.6895-0.64178-0.33434-1.3926-0.50195-2.2539-0.50195zm16.523 0c-0.99644 0-1.9088 0.18516-2.7363 0.55469-0.81067 0.36953-1.5124 0.88017-2.1035 1.5312-0.59111 0.63348-1.0463 1.3897-1.3672 2.2695s-0.48047 1.831-0.48047 2.8516c0 1.0558 0.15108 2.0225 0.45508 2.9023 0.32089 0.87983 0.76758 1.6361 1.3418 2.2695 0.57422 0.63348 1.276 1.1266 2.1035 1.4785 0.82756 0.33434 1.7569 0.50195 2.7871 0.50195 1.4862 0 2.7517-0.35278 3.7988-1.0566 1.0471-0.70386 1.8254-1.8733 2.332-3.5098h-3.168c-0.11822 0.42232-0.43934 0.82772-0.96289 1.2148-0.52355 0.36953-1.1468 0.55274-1.873 0.55273-1.0133 0-1.7916-0.27286-2.332-0.81836-0.54044-0.5455-0.83605-1.4245-0.88672-2.6387h9.4492c0.06756-1.0558-0.01551-2.0673-0.25195-3.0352-0.23644-0.96782-0.62557-1.8293-1.166-2.5859-0.52356-0.75666-1.1998-1.355-2.0273-1.7949-0.82756-0.45751-1.7974-0.6875-2.9121-0.6875zm16.189 0c-0.76 0-1.5023 0.18516-2.2285 0.55469-0.72622 0.35193-1.3174 0.923-1.7734 1.7148h-0.07617v-1.9004h-3.4199v13.646h3.5977v-7.1523c0-1.3901 0.21909-2.3841 0.6582-2.9824 0.43911-0.61588 1.1494-0.92383 2.1289-0.92383 0.86133 0 1.461 0.28066 1.7988 0.84375 0.33778 0.5455 0.50586 1.3816 0.50586 2.5078v7.707h3.5977v-8.3926c0-0.84464-0.0765-1.6106-0.22852-2.2969-0.13511-0.70387-0.3797-1.2925-0.73437-1.7676-0.35466-0.49271-0.84386-0.87277-1.4688-1.1367-0.608-0.28155-1.3948-0.42188-2.3574-0.42188zm-66.062 0.36914 4.3066 6.4668-4.7129 7.1797h4.0293l2.7363-4.3027 2.7344 4.3027h4.1055l-4.8398-7.2578 4.3066-6.3887h-3.9766l-2.2793 3.5645-2.3066-3.5645zm13.275 0 4.584 12.803c0.10133 0.26395 0.15234 0.54461 0.15234 0.84375 0 0.40472-0.11707 0.77504-0.35352 1.1094-0.21956 0.33434-0.56617 0.52729-1.0391 0.58008-0.35467 0.0176-0.70979 0.0098-1.0645-0.02539-0.35467-0.03519-0.70128-0.07027-1.0391-0.10547v3.0879c0.37156 0.03519 0.73518 0.06052 1.0898 0.07813 0.37156 0.03519 0.74368 0.05273 1.1152 0.05273 1.2329 0 2.1943-0.23778 2.8867-0.71289 0.69244-0.47511 1.2326-1.2664 1.6211-2.375l5.4727-15.336h-3.7246l-2.8613 9.3437h-0.05078l-2.9648-9.3437zm-37.48 2.4551c0.59111 0 1.0823 0.12279 1.4707 0.36914s0.6991 0.57184 0.93555 0.97656c0.25333 0.38713 0.43187 0.84515 0.5332 1.373 0.10133 0.5103 0.15234 1.0482 0.15234 1.6113 0 0.56309-0.05101 1.1069-0.15234 1.6348-0.10133 0.5279-0.27137 1.0035-0.50781 1.4258-0.23644 0.40472-0.5556 0.73021-0.96094 0.97656-0.38844 0.24635-0.87959 0.36914-1.4707 0.36914-0.55733 0-1.038-0.12279-1.4434-0.36914-0.38844-0.26395-0.71806-0.59723-0.98828-1.002-0.25333-0.42232-0.43842-0.89788-0.55664-1.4258s-0.17773-1.0561-0.17773-1.584c-1e-7 -0.56309 0.05101-1.0991 0.15234-1.6094 0.11822-0.5279 0.29481-0.99567 0.53125-1.4004 0.25333-0.40472 0.58295-0.73021 0.98828-0.97656 0.40533-0.24635 0.90303-0.36914 1.4941-0.36914zm15.84 0c0.608 0 1.1142 0.13254 1.5195 0.39648 0.42222 0.24635 0.75184 0.57184 0.98828 0.97656 0.25333 0.40472 0.42992 0.87054 0.53125 1.3984 0.10133 0.5279 0.15234 1.0658 0.15234 1.6113 0 0.5455-0.05101 1.0815-0.15234 1.6094-0.10133 0.5103-0.27792 0.97612-0.53125 1.3984-0.23644 0.40472-0.56606 0.73021-0.98828 0.97656-0.40533 0.24635-0.91153 0.36914-1.5195 0.36914-0.608 0-1.1142-0.12279-1.5195-0.36914s-0.73495-0.57184-0.98828-0.97656c-0.23644-0.42232-0.40648-0.88813-0.50781-1.3984-0.10133-0.5279-0.15234-1.0639-0.15234-1.6094 0-0.5455 0.05101-1.0834 0.15234-1.6113 0.10133-0.5279 0.27137-0.99371 0.50781-1.3984 0.25333-0.40472 0.58295-0.73021 0.98828-0.97656 0.40533-0.26395 0.91153-0.39648 1.5195-0.39648zm42.602 0c0.59111 0 1.0803 0.11499 1.4688 0.34375 0.38844 0.22876 0.70106 0.5367 0.9375 0.92383 0.23644 0.38713 0.40648 0.8354 0.50781 1.3457 0.10133 0.49271 0.15039 1.0209 0.15039 1.584 0 0.49271-0.06606 0.96827-0.20117 1.4258-0.11822 0.43992-0.30526 0.83557-0.55859 1.1875-0.25333 0.35193-0.57445 0.63259-0.96289 0.84375-0.38844 0.21116-0.83513 0.31836-1.3418 0.31836-0.55733 0-1.021-0.12474-1.3926-0.37109-0.37156-0.24635-0.67566-0.56209-0.91211-0.94922-0.21956-0.38713-0.38109-0.81786-0.48242-1.293-0.08444-0.49271-0.12695-0.98581-0.12695-1.4785 0-0.5103 0.05101-0.99366 0.15234-1.4512 0.11822-0.47511 0.29676-0.89026 0.5332-1.2422 0.25333-0.36953 0.55744-0.65993 0.91211-0.87109 0.37156-0.21116 0.80974-0.31641 1.3164-0.31641zm15.535 0c0.87822 0 1.529 0.24753 1.9512 0.74024 0.43911 0.49271 0.74322 1.2138 0.91211 2.1641h-5.8535c0.01689-0.26395 0.0679-0.5641 0.15234-0.89844 0.10133-0.33434 0.26287-0.65008 0.48242-0.94922 0.23644-0.29914 0.54055-0.54667 0.91211-0.74023 0.38845-0.21116 0.86914-0.31641 1.4434-0.31641z" fill="url(#e)" stroke="#4665A2" stroke-width=".7"/>
+  <path d="m52.988 27.291c0.99602-1.0359 1.3944-1.8725 1.7928-3.1076l3.8247-0.03984c0.3113 1.6096 0.82413 2.5137 1.6335 3.1474z" fill="url(#b)" stroke="#000" stroke-width=".5"/>
+  <path d="m73.89 24.04 28.885-0.2011-0.12476 3.3879-31.033 0.16229c1.2621-1.0234 1.9665-2.2859 2.2724-3.3491z" fill="url(#c)" stroke="#000" stroke-width=".41788"/>
+ </g>
+</svg>
diff --git a/third_party/vulkan_memory_allocator/docs/html/enabling_buffer_device_address.html b/third_party/vulkan_memory_allocator/docs/html/enabling_buffer_device_address.html
index 3e83bd3..d02eb88 100644
--- a/third_party/vulkan_memory_allocator/docs/html/enabling_buffer_device_address.html
+++ b/third_party/vulkan_memory_allocator/docs/html/enabling_buffer_device_address.html
@@ -3,7 +3,7 @@
 <head>
 <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
 <meta http-equiv="X-UA-Compatible" content="IE=9"/>
-<meta name="generator" content="Doxygen 1.8.18"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
 <meta name="viewport" content="width=device-width, initial-scale=1"/>
 <title>Vulkan Memory Allocator: Enabling buffer device address</title>
 <link href="tabs.css" rel="stylesheet" type="text/css"/>
@@ -29,10 +29,10 @@
 </table>
 </div>
 <!-- end header part -->
-<!-- Generated by Doxygen 1.8.18 -->
+<!-- Generated by Doxygen 1.9.1 -->
 <script type="text/javascript">
 /* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
-var searchBox = new SearchBox("searchBox", "search",false,'Search');
+var searchBox = new SearchBox("searchBox", "search",false,'Search','.html');
 /* @license-end */
 </script>
 <script type="text/javascript" src="menudata.js"></script>
@@ -90,9 +90,7 @@
 </div><!-- PageDoc -->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated by &#160;<a href="http://www.doxygen.org/index.html">
-<img class="footer" src="doxygen.png" alt="doxygen"/>
-</a> 1.8.18
+Generated by&#160;<a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.1
 </small></address>
 </body>
 </html>
diff --git a/third_party/vulkan_memory_allocator/docs/html/files.html b/third_party/vulkan_memory_allocator/docs/html/files.html
index 1d4907f..2037f34 100644
--- a/third_party/vulkan_memory_allocator/docs/html/files.html
+++ b/third_party/vulkan_memory_allocator/docs/html/files.html
@@ -3,7 +3,7 @@
 <head>
 <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
 <meta http-equiv="X-UA-Compatible" content="IE=9"/>
-<meta name="generator" content="Doxygen 1.8.18"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
 <meta name="viewport" content="width=device-width, initial-scale=1"/>
 <title>Vulkan Memory Allocator: File List</title>
 <link href="tabs.css" rel="stylesheet" type="text/css"/>
@@ -29,10 +29,10 @@
 </table>
 </div>
 <!-- end header part -->
-<!-- Generated by Doxygen 1.8.18 -->
+<!-- Generated by Doxygen 1.9.1 -->
 <script type="text/javascript">
 /* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
-var searchBox = new SearchBox("searchBox", "search",false,'Search');
+var searchBox = new SearchBox("searchBox", "search",false,'Search','.html');
 /* @license-end */
 </script>
 <script type="text/javascript" src="menudata.js"></script>
@@ -66,16 +66,15 @@
 </div><!--header-->
 <div class="contents">
 <div class="textblock">Here is a list of all files with brief descriptions:</div><div class="directory">
-<table class="directory">
-<tr id="row_0_" class="even"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><a href="vk__mem__alloc_8h_source.html"><span class="icondoc"></span></a><a class="el" href="vk__mem__alloc_8h.html" target="_self">vk_mem_alloc.h</a></td><td class="desc"></td></tr>
+<div class="levels">[detail level <span onclick="javascript:toggleLevel(1);">1</span><span onclick="javascript:toggleLevel(2);">2</span>]</div><table class="directory">
+<tr id="row_0_" class="even"><td class="entry"><span style="width:0px;display:inline-block;">&#160;</span><span id="arr_0_" class="arrow" onclick="toggleFolder('0_')">&#9660;</span><span id="img_0_" class="iconfopen" onclick="toggleFolder('0_')">&#160;</span><a class="el" href="dir_d44c64559bbebec7f509842c48db8b23.html" target="_self">include</a></td><td class="desc"></td></tr>
+<tr id="row_0_0_"><td class="entry"><span style="width:32px;display:inline-block;">&#160;</span><a href="vk__mem__alloc_8h_source.html"><span class="icondoc"></span></a><a class="el" href="vk__mem__alloc_8h.html" target="_self">vk_mem_alloc.h</a></td><td class="desc"></td></tr>
 </table>
 </div><!-- directory -->
 </div><!-- contents -->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated by &#160;<a href="http://www.doxygen.org/index.html">
-<img class="footer" src="doxygen.png" alt="doxygen"/>
-</a> 1.8.18
+Generated by&#160;<a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.1
 </small></address>
 </body>
 </html>
diff --git a/third_party/vulkan_memory_allocator/docs/html/functions.html b/third_party/vulkan_memory_allocator/docs/html/functions.html
index 3568a4f..e6facd2 100644
--- a/third_party/vulkan_memory_allocator/docs/html/functions.html
+++ b/third_party/vulkan_memory_allocator/docs/html/functions.html
@@ -3,7 +3,7 @@
 <head>
 <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
 <meta http-equiv="X-UA-Compatible" content="IE=9"/>
-<meta name="generator" content="Doxygen 1.8.18"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
 <meta name="viewport" content="width=device-width, initial-scale=1"/>
 <title>Vulkan Memory Allocator: Class Members</title>
 <link href="tabs.css" rel="stylesheet" type="text/css"/>
@@ -29,10 +29,10 @@
 </table>
 </div>
 <!-- end header part -->
-<!-- Generated by Doxygen 1.8.18 -->
+<!-- Generated by Doxygen 1.9.1 -->
 <script type="text/javascript">
 /* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
-var searchBox = new SearchBox("searchBox", "search",false,'Search');
+var searchBox = new SearchBox("searchBox", "search",false,'Search','.html');
 /* @license-end */
 </script>
 <script type="text/javascript" src="menudata.js"></script>
@@ -265,6 +265,10 @@
 <li>preferredLargeHeapBlockSize
 : <a class="el" href="struct_vma_allocator_create_info.html#a8e4714298e3121cdd8b214a1ae7a637a">VmaAllocatorCreateInfo</a>
 </li>
+<li>priority
+: <a class="el" href="struct_vma_allocation_create_info.html#a983d39e1a2e63649d78a960aa2fdd0f7">VmaAllocationCreateInfo</a>
+, <a class="el" href="struct_vma_pool_create_info.html#a16e686c688f6725f119ebf6e24ab5274">VmaPoolCreateInfo</a>
+</li>
 <li>pUserData
 : <a class="el" href="struct_vma_allocation_create_info.html#a8259e85c272683434f4abb4ddddffe19">VmaAllocationCreateInfo</a>
 , <a class="el" href="struct_vma_allocation_info.html#adc507656149c04de7ed95d0042ba2a13">VmaAllocationInfo</a>
@@ -388,9 +392,7 @@
 </div><!-- contents -->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated by &#160;<a href="http://www.doxygen.org/index.html">
-<img class="footer" src="doxygen.png" alt="doxygen"/>
-</a> 1.8.18
+Generated by&#160;<a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.1
 </small></address>
 </body>
 </html>
diff --git a/third_party/vulkan_memory_allocator/docs/html/functions_vars.html b/third_party/vulkan_memory_allocator/docs/html/functions_vars.html
index 930ecb3..f6a20f2 100644
--- a/third_party/vulkan_memory_allocator/docs/html/functions_vars.html
+++ b/third_party/vulkan_memory_allocator/docs/html/functions_vars.html
@@ -3,7 +3,7 @@
 <head>
 <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
 <meta http-equiv="X-UA-Compatible" content="IE=9"/>
-<meta name="generator" content="Doxygen 1.8.18"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
 <meta name="viewport" content="width=device-width, initial-scale=1"/>
 <title>Vulkan Memory Allocator: Class Members - Variables</title>
 <link href="tabs.css" rel="stylesheet" type="text/css"/>
@@ -29,10 +29,10 @@
 </table>
 </div>
 <!-- end header part -->
-<!-- Generated by Doxygen 1.8.18 -->
+<!-- Generated by Doxygen 1.9.1 -->
 <script type="text/javascript">
 /* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
-var searchBox = new SearchBox("searchBox", "search",false,'Search');
+var searchBox = new SearchBox("searchBox", "search",false,'Search','.html');
 /* @license-end */
 </script>
 <script type="text/javascript" src="menudata.js"></script>
@@ -265,6 +265,10 @@
 <li>preferredLargeHeapBlockSize
 : <a class="el" href="struct_vma_allocator_create_info.html#a8e4714298e3121cdd8b214a1ae7a637a">VmaAllocatorCreateInfo</a>
 </li>
+<li>priority
+: <a class="el" href="struct_vma_allocation_create_info.html#a983d39e1a2e63649d78a960aa2fdd0f7">VmaAllocationCreateInfo</a>
+, <a class="el" href="struct_vma_pool_create_info.html#a16e686c688f6725f119ebf6e24ab5274">VmaPoolCreateInfo</a>
+</li>
 <li>pUserData
 : <a class="el" href="struct_vma_allocation_create_info.html#a8259e85c272683434f4abb4ddddffe19">VmaAllocationCreateInfo</a>
 , <a class="el" href="struct_vma_allocation_info.html#adc507656149c04de7ed95d0042ba2a13">VmaAllocationInfo</a>
@@ -388,9 +392,7 @@
 </div><!-- contents -->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated by &#160;<a href="http://www.doxygen.org/index.html">
-<img class="footer" src="doxygen.png" alt="doxygen"/>
-</a> 1.8.18
+Generated by&#160;<a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.1
 </small></address>
 </body>
 </html>
diff --git a/third_party/vulkan_memory_allocator/docs/html/general_considerations.html b/third_party/vulkan_memory_allocator/docs/html/general_considerations.html
index 4d5efb9..eba9e82 100644
--- a/third_party/vulkan_memory_allocator/docs/html/general_considerations.html
+++ b/third_party/vulkan_memory_allocator/docs/html/general_considerations.html
@@ -3,7 +3,7 @@
 <head>
 <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
 <meta http-equiv="X-UA-Compatible" content="IE=9"/>
-<meta name="generator" content="Doxygen 1.8.18"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
 <meta name="viewport" content="width=device-width, initial-scale=1"/>
 <title>Vulkan Memory Allocator: General considerations</title>
 <link href="tabs.css" rel="stylesheet" type="text/css"/>
@@ -29,10 +29,10 @@
 </table>
 </div>
 <!-- end header part -->
-<!-- Generated by Doxygen 1.8.18 -->
+<!-- Generated by Doxygen 1.9.1 -->
 <script type="text/javascript">
 /* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
-var searchBox = new SearchBox("searchBox", "search",false,'Search');
+var searchBox = new SearchBox("searchBox", "search",false,'Search','.html');
 /* @license-end */
 </script>
 <script type="text/javascript" src="menudata.js"></script>
@@ -90,7 +90,7 @@
 </ul>
 </li>
 <li><em>Non-linear image 0xebc91 is aliased with linear buffer 0xeb8e4 which may indicate a bug.</em><ul>
-<li>It happens when you use lost allocations, and a new image or buffer is created in place of an existing object that bacame lost.</li>
+<li>It happens when you use lost allocations, and a new image or buffer is created in place of an existing object that became lost.</li>
 <li>It may happen also when you use <a class="el" href="defragmentation.html">defragmentation</a>.</li>
 </ul>
 </li>
@@ -111,10 +111,11 @@
 Features not supported</h1>
 <p>Features deliberately excluded from the scope of this library:</p>
 <ul>
-<li>Data transfer. Uploading (straming) and downloading data of buffers and images between CPU and GPU memory and related synchronization is responsibility of the user. Defining some "texture" object that would automatically stream its data from a staging copy in CPU memory to GPU memory would rather be a feature of another, higher-level library implemented on top of VMA.</li>
+<li>Data transfer. Uploading (streaming) and downloading data of buffers and images between CPU and GPU memory and related synchronization is responsibility of the user. Defining some "texture" object that would automatically stream its data from a staging copy in CPU memory to GPU memory would rather be a feature of another, higher-level library implemented on top of VMA.</li>
 <li>Allocations for imported/exported external memory. They tend to require explicit memory type index and dedicated allocation anyway, so they don't interact with main features of this library. Such special purpose allocations should be made manually, using <code>vkCreateBuffer()</code> and <code>vkAllocateMemory()</code>.</li>
+<li>Sub-allocation of parts of one large buffer. Although recommended as a good practice, it is the user's responsibility to implement such logic on top of VMA.</li>
 <li>Recreation of buffers and images. Although the library has functions for buffer and image creation (<a class="el" href="vk__mem__alloc_8h.html#ac72ee55598617e8eecca384e746bab51">vmaCreateBuffer()</a>, <a class="el" href="vk__mem__alloc_8h.html#a02a94f25679275851a53e82eacbcfc73" title="Function similar to vmaCreateBuffer().">vmaCreateImage()</a>), you need to recreate these objects yourself after defragmentation. That's because the big structures <code>VkBufferCreateInfo</code>, <code>VkImageCreateInfo</code> are not stored in <a class="el" href="struct_vma_allocation.html" title="Represents single memory allocation.">VmaAllocation</a> object.</li>
-<li>Handling CPU memory allocation failures. When dynamically creating small C++ objects in CPU memory (not Vulkan memory), allocation failures are not checked and handled gracefully, because that would complicate code significantly and is usually not needed in desktop PC applications anyway.</li>
+<li>Handling CPU memory allocation failures. When dynamically creating small C++ objects in CPU memory (not Vulkan memory), allocation failures are not checked and handled gracefully, because that would complicate code significantly and is usually not needed in desktop PC applications anyway. Success of an allocation is just checked with an assert.</li>
 <li>Code free of any compiler warnings. Maintaining the library to compile and work correctly on so many different platforms is hard enough. Being free of any warnings, on any version of any compiler, is simply not feasible.</li>
 <li>This is a C++ library with C interface. Bindings or ports to any other programming languages are welcomed as external projects and are not going to be included into this repository. </li>
 </ul>
@@ -122,9 +123,7 @@
 </div><!-- PageDoc -->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated by &#160;<a href="http://www.doxygen.org/index.html">
-<img class="footer" src="doxygen.png" alt="doxygen"/>
-</a> 1.8.18
+Generated by&#160;<a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.1
 </small></address>
 </body>
 </html>
diff --git a/third_party/vulkan_memory_allocator/docs/html/globals.html b/third_party/vulkan_memory_allocator/docs/html/globals.html
index a5991b5..fb5edae 100644
--- a/third_party/vulkan_memory_allocator/docs/html/globals.html
+++ b/third_party/vulkan_memory_allocator/docs/html/globals.html
@@ -3,7 +3,7 @@
 <head>
 <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
 <meta http-equiv="X-UA-Compatible" content="IE=9"/>
-<meta name="generator" content="Doxygen 1.8.18"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
 <meta name="viewport" content="width=device-width, initial-scale=1"/>
 <title>Vulkan Memory Allocator: File Members</title>
 <link href="tabs.css" rel="stylesheet" type="text/css"/>
@@ -29,10 +29,10 @@
 </table>
 </div>
 <!-- end header part -->
-<!-- Generated by Doxygen 1.8.18 -->
+<!-- Generated by Doxygen 1.9.1 -->
 <script type="text/javascript">
 /* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
-var searchBox = new SearchBox("searchBox", "search",false,'Search');
+var searchBox = new SearchBox("searchBox", "search",false,'Search','.html');
 /* @license-end */
 </script>
 <script type="text/javascript" src="menudata.js"></script>
@@ -63,13 +63,6 @@
 <div class="contents">
 <div class="textblock">Here is a list of all file members with links to the files they belong to:</div>
 
-<h3><a id="index_n"></a>- n -</h3><ul>
-<li>NOMINMAX
-: <a class="el" href="vk__mem__alloc_8h.html#a9f918755b601cf4bffca775992e6fb90">vk_mem_alloc.h</a>
-</li>
-</ul>
-
-
 <h3><a id="index_p"></a>- p -</h3><ul>
 <li>PFN_vmaAllocateDeviceMemoryFunction
 : <a class="el" href="vk__mem__alloc_8h.html#a7e1ed85f7799600b03ad51a77acc21f3">vk_mem_alloc.h</a>
@@ -141,6 +134,9 @@
 <li>VMA_ALLOCATOR_CREATE_EXT_MEMORY_BUDGET_BIT
 : <a class="el" href="vk__mem__alloc_8h.html#a4f87c9100d154a65a4ad495f7763cf7ca4d4687863f7bd4b418c6006dc04400b0">vk_mem_alloc.h</a>
 </li>
+<li>VMA_ALLOCATOR_CREATE_EXT_MEMORY_PRIORITY_BIT
+: <a class="el" href="vk__mem__alloc_8h.html#a4f87c9100d154a65a4ad495f7763cf7caffdd7a5169be3dbd7cbf6b3619e4f78a">vk_mem_alloc.h</a>
+</li>
 <li>VMA_ALLOCATOR_CREATE_EXTERNALLY_SYNCHRONIZED_BIT
 : <a class="el" href="vk__mem__alloc_8h.html#a4f87c9100d154a65a4ad495f7763cf7ca4816ddaed324ba110172ca608a20f29d">vk_mem_alloc.h</a>
 </li>
@@ -171,6 +167,9 @@
 <li>VMA_MEMORY_BUDGET
 : <a class="el" href="vk__mem__alloc_8h.html#a05decf1cf4ebf767beba7acca6c1ec3a">vk_mem_alloc.h</a>
 </li>
+<li>VMA_MEMORY_PRIORITY
+: <a class="el" href="vk__mem__alloc_8h.html#a81af8a3a87e34bbb493848143cde43e4">vk_mem_alloc.h</a>
+</li>
 <li>VMA_MEMORY_USAGE_CPU_COPY
 : <a class="el" href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305cca416a444d4d0fc20067c3f76f32ff2500">vk_mem_alloc.h</a>
 </li>
@@ -415,10 +414,10 @@
 : <a class="el" href="vk__mem__alloc_8h.html#ad5bd1243512d099706de88168992f069">vk_mem_alloc.h</a>
 </li>
 <li>VmaMemoryUsage
-: <a class="el" href="vk__mem__alloc_8h.html#a806e8499dde802e59eb72a1dc811c35f">vk_mem_alloc.h</a>
+: <a class="el" href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305cc">vk_mem_alloc.h</a>
 </li>
 <li>VmaPoolCreateFlagBits
-: <a class="el" href="vk__mem__alloc_8h.html#a4d4f2efc2509157a9e4ecd4fd7942303">vk_mem_alloc.h</a>
+: <a class="el" href="vk__mem__alloc_8h.html#a9a7c45f9c863695d98c83fa5ac940fe7">vk_mem_alloc.h</a>
 </li>
 <li>VmaPoolCreateFlags
 : <a class="el" href="vk__mem__alloc_8h.html#a2770e325ea42e087c1b91fdf46d0292a">vk_mem_alloc.h</a>
@@ -438,9 +437,6 @@
 <li>VmaRecordSettings
 : <a class="el" href="vk__mem__alloc_8h.html#a16e21c877101493fce582664cd8754fc">vk_mem_alloc.h</a>
 </li>
-<li>vmaResizeAllocation()
-: <a class="el" href="vk__mem__alloc_8h.html#a0ff488958ca72b28e545880463cb8696">vk_mem_alloc.h</a>
-</li>
 <li>vmaSetAllocationUserData()
 : <a class="el" href="vk__mem__alloc_8h.html#af9147d31ffc11d62fc187bde283ed14f">vk_mem_alloc.h</a>
 </li>
@@ -469,9 +465,7 @@
 </div><!-- contents -->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated by &#160;<a href="http://www.doxygen.org/index.html">
-<img class="footer" src="doxygen.png" alt="doxygen"/>
-</a> 1.8.18
+Generated by&#160;<a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.1
 </small></address>
 </body>
 </html>
diff --git a/third_party/vulkan_memory_allocator/docs/html/globals_defs.html b/third_party/vulkan_memory_allocator/docs/html/globals_defs.html
index 955b7f4..26dd4e0 100644
--- a/third_party/vulkan_memory_allocator/docs/html/globals_defs.html
+++ b/third_party/vulkan_memory_allocator/docs/html/globals_defs.html
@@ -3,7 +3,7 @@
 <head>
 <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
 <meta http-equiv="X-UA-Compatible" content="IE=9"/>
-<meta name="generator" content="Doxygen 1.8.18"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
 <meta name="viewport" content="width=device-width, initial-scale=1"/>
 <title>Vulkan Memory Allocator: File Members</title>
 <link href="tabs.css" rel="stylesheet" type="text/css"/>
@@ -29,10 +29,10 @@
 </table>
 </div>
 <!-- end header part -->
-<!-- Generated by Doxygen 1.8.18 -->
+<!-- Generated by Doxygen 1.9.1 -->
 <script type="text/javascript">
 /* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
-var searchBox = new SearchBox("searchBox", "search",false,'Search');
+var searchBox = new SearchBox("searchBox", "search",false,'Search','.html');
 /* @license-end */
 </script>
 <script type="text/javascript" src="menudata.js"></script>
@@ -62,9 +62,6 @@
 
 <div class="contents">
 &#160;<ul>
-<li>NOMINMAX
-: <a class="el" href="vk__mem__alloc_8h.html#a9f918755b601cf4bffca775992e6fb90">vk_mem_alloc.h</a>
-</li>
 <li>VMA_BIND_MEMORY2
 : <a class="el" href="vk__mem__alloc_8h.html#a88bef97f86d70a34a4c0746e09a2680d">vk_mem_alloc.h</a>
 </li>
@@ -77,6 +74,9 @@
 <li>VMA_MEMORY_BUDGET
 : <a class="el" href="vk__mem__alloc_8h.html#a05decf1cf4ebf767beba7acca6c1ec3a">vk_mem_alloc.h</a>
 </li>
+<li>VMA_MEMORY_PRIORITY
+: <a class="el" href="vk__mem__alloc_8h.html#a81af8a3a87e34bbb493848143cde43e4">vk_mem_alloc.h</a>
+</li>
 <li>VMA_RECORDING_ENABLED
 : <a class="el" href="vk__mem__alloc_8h.html#a1f0c126759fc96ccb6e2d23c101d770c">vk_mem_alloc.h</a>
 </li>
@@ -90,9 +90,7 @@
 </div><!-- contents -->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated by &#160;<a href="http://www.doxygen.org/index.html">
-<img class="footer" src="doxygen.png" alt="doxygen"/>
-</a> 1.8.18
+Generated by&#160;<a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.1
 </small></address>
 </body>
 </html>
diff --git a/third_party/vulkan_memory_allocator/docs/html/globals_enum.html b/third_party/vulkan_memory_allocator/docs/html/globals_enum.html
index 9b9665d..1d58808 100644
--- a/third_party/vulkan_memory_allocator/docs/html/globals_enum.html
+++ b/third_party/vulkan_memory_allocator/docs/html/globals_enum.html
@@ -3,7 +3,7 @@
 <head>
 <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
 <meta http-equiv="X-UA-Compatible" content="IE=9"/>
-<meta name="generator" content="Doxygen 1.8.18"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
 <meta name="viewport" content="width=device-width, initial-scale=1"/>
 <title>Vulkan Memory Allocator: File Members</title>
 <link href="tabs.css" rel="stylesheet" type="text/css"/>
@@ -29,10 +29,10 @@
 </table>
 </div>
 <!-- end header part -->
-<!-- Generated by Doxygen 1.8.18 -->
+<!-- Generated by Doxygen 1.9.1 -->
 <script type="text/javascript">
 /* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
-var searchBox = new SearchBox("searchBox", "search",false,'Search');
+var searchBox = new SearchBox("searchBox", "search",false,'Search','.html');
 /* @license-end */
 </script>
 <script type="text/javascript" src="menudata.js"></script>
@@ -84,9 +84,7 @@
 </div><!-- contents -->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated by &#160;<a href="http://www.doxygen.org/index.html">
-<img class="footer" src="doxygen.png" alt="doxygen"/>
-</a> 1.8.18
+Generated by&#160;<a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.1
 </small></address>
 </body>
 </html>
diff --git a/third_party/vulkan_memory_allocator/docs/html/globals_eval.html b/third_party/vulkan_memory_allocator/docs/html/globals_eval.html
index 9da621a..b370fa0 100644
--- a/third_party/vulkan_memory_allocator/docs/html/globals_eval.html
+++ b/third_party/vulkan_memory_allocator/docs/html/globals_eval.html
@@ -3,7 +3,7 @@
 <head>
 <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
 <meta http-equiv="X-UA-Compatible" content="IE=9"/>
-<meta name="generator" content="Doxygen 1.8.18"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
 <meta name="viewport" content="width=device-width, initial-scale=1"/>
 <title>Vulkan Memory Allocator: File Members</title>
 <link href="tabs.css" rel="stylesheet" type="text/css"/>
@@ -29,10 +29,10 @@
 </table>
 </div>
 <!-- end header part -->
-<!-- Generated by Doxygen 1.8.18 -->
+<!-- Generated by Doxygen 1.9.1 -->
 <script type="text/javascript">
 /* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
-var searchBox = new SearchBox("searchBox", "search",false,'Search');
+var searchBox = new SearchBox("searchBox", "search",false,'Search','.html');
 /* @license-end */
 </script>
 <script type="text/javascript" src="menudata.js"></script>
@@ -124,6 +124,9 @@
 <li>VMA_ALLOCATOR_CREATE_EXT_MEMORY_BUDGET_BIT
 : <a class="el" href="vk__mem__alloc_8h.html#a4f87c9100d154a65a4ad495f7763cf7ca4d4687863f7bd4b418c6006dc04400b0">vk_mem_alloc.h</a>
 </li>
+<li>VMA_ALLOCATOR_CREATE_EXT_MEMORY_PRIORITY_BIT
+: <a class="el" href="vk__mem__alloc_8h.html#a4f87c9100d154a65a4ad495f7763cf7caffdd7a5169be3dbd7cbf6b3619e4f78a">vk_mem_alloc.h</a>
+</li>
 <li>VMA_ALLOCATOR_CREATE_EXTERNALLY_SYNCHRONIZED_BIT
 : <a class="el" href="vk__mem__alloc_8h.html#a4f87c9100d154a65a4ad495f7763cf7ca4816ddaed324ba110172ca608a20f29d">vk_mem_alloc.h</a>
 </li>
@@ -191,9 +194,7 @@
 </div><!-- contents -->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated by &#160;<a href="http://www.doxygen.org/index.html">
-<img class="footer" src="doxygen.png" alt="doxygen"/>
-</a> 1.8.18
+Generated by&#160;<a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.1
 </small></address>
 </body>
 </html>
diff --git a/third_party/vulkan_memory_allocator/docs/html/globals_func.html b/third_party/vulkan_memory_allocator/docs/html/globals_func.html
index 431055e..533bb8d 100644
--- a/third_party/vulkan_memory_allocator/docs/html/globals_func.html
+++ b/third_party/vulkan_memory_allocator/docs/html/globals_func.html
@@ -3,7 +3,7 @@
 <head>
 <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
 <meta http-equiv="X-UA-Compatible" content="IE=9"/>
-<meta name="generator" content="Doxygen 1.8.18"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
 <meta name="viewport" content="width=device-width, initial-scale=1"/>
 <title>Vulkan Memory Allocator: File Members</title>
 <link href="tabs.css" rel="stylesheet" type="text/css"/>
@@ -29,10 +29,10 @@
 </table>
 </div>
 <!-- end header part -->
-<!-- Generated by Doxygen 1.8.18 -->
+<!-- Generated by Doxygen 1.9.1 -->
 <script type="text/javascript">
 /* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
-var searchBox = new SearchBox("searchBox", "search",false,'Search');
+var searchBox = new SearchBox("searchBox", "search",false,'Search','.html');
 /* @license-end */
 </script>
 <script type="text/javascript" src="menudata.js"></script>
@@ -202,9 +202,6 @@
 <li>vmaMapMemory()
 : <a class="el" href="vk__mem__alloc_8h.html#ad5bd1243512d099706de88168992f069">vk_mem_alloc.h</a>
 </li>
-<li>vmaResizeAllocation()
-: <a class="el" href="vk__mem__alloc_8h.html#a0ff488958ca72b28e545880463cb8696">vk_mem_alloc.h</a>
-</li>
 <li>vmaSetAllocationUserData()
 : <a class="el" href="vk__mem__alloc_8h.html#af9147d31ffc11d62fc187bde283ed14f">vk_mem_alloc.h</a>
 </li>
@@ -224,9 +221,7 @@
 </div><!-- contents -->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated by &#160;<a href="http://www.doxygen.org/index.html">
-<img class="footer" src="doxygen.png" alt="doxygen"/>
-</a> 1.8.18
+Generated by&#160;<a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.1
 </small></address>
 </body>
 </html>
diff --git a/third_party/vulkan_memory_allocator/docs/html/globals_type.html b/third_party/vulkan_memory_allocator/docs/html/globals_type.html
index 8c6ae8d..b54a1cf 100644
--- a/third_party/vulkan_memory_allocator/docs/html/globals_type.html
+++ b/third_party/vulkan_memory_allocator/docs/html/globals_type.html
@@ -3,7 +3,7 @@
 <head>
 <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
 <meta http-equiv="X-UA-Compatible" content="IE=9"/>
-<meta name="generator" content="Doxygen 1.8.18"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
 <meta name="viewport" content="width=device-width, initial-scale=1"/>
 <title>Vulkan Memory Allocator: File Members</title>
 <link href="tabs.css" rel="stylesheet" type="text/css"/>
@@ -29,10 +29,10 @@
 </table>
 </div>
 <!-- end header part -->
-<!-- Generated by Doxygen 1.8.18 -->
+<!-- Generated by Doxygen 1.9.1 -->
 <script type="text/javascript">
 /* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
-var searchBox = new SearchBox("searchBox", "search",false,'Search');
+var searchBox = new SearchBox("searchBox", "search",false,'Search','.html');
 /* @license-end */
 </script>
 <script type="text/javascript" src="menudata.js"></script>
@@ -156,9 +156,7 @@
 </div><!-- contents -->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated by &#160;<a href="http://www.doxygen.org/index.html">
-<img class="footer" src="doxygen.png" alt="doxygen"/>
-</a> 1.8.18
+Generated by&#160;<a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.1
 </small></address>
 </body>
 </html>
diff --git a/third_party/vulkan_memory_allocator/docs/html/index.html b/third_party/vulkan_memory_allocator/docs/html/index.html
index b07b0c9..81203d8 100644
--- a/third_party/vulkan_memory_allocator/docs/html/index.html
+++ b/third_party/vulkan_memory_allocator/docs/html/index.html
@@ -3,7 +3,7 @@
 <head>
 <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
 <meta http-equiv="X-UA-Compatible" content="IE=9"/>
-<meta name="generator" content="Doxygen 1.8.18"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
 <meta name="viewport" content="width=device-width, initial-scale=1"/>
 <title>Vulkan Memory Allocator: Vulkan Memory Allocator</title>
 <link href="tabs.css" rel="stylesheet" type="text/css"/>
@@ -29,10 +29,10 @@
 </table>
 </div>
 <!-- end header part -->
-<!-- Generated by Doxygen 1.8.18 -->
+<!-- Generated by Doxygen 1.9.1 -->
 <script type="text/javascript">
 /* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
-var searchBox = new SearchBox("searchBox", "search",false,'Search');
+var searchBox = new SearchBox("searchBox", "search",false,'Search','.html');
 /* @license-end */
 </script>
 <script type="text/javascript" src="menudata.js"></script>
@@ -65,8 +65,8 @@
 <div class="title">Vulkan Memory Allocator </div>  </div>
 </div><!--header-->
 <div class="contents">
-<div class="textblock"><p><b>Version 3.0.0-development</b> (2020-03-23)</p>
-<p>Copyright (c) 2017-2020 Advanced Micro Devices, Inc. All rights reserved. <br  />
+<div class="textblock"><p><b>Version 3.0.0-development</b> (2021-02-16)</p>
+<p>Copyright (c) 2017-2021 Advanced Micro Devices, Inc. All rights reserved. <br  />
 License: MIT</p>
 <p>Documentation of all members: <a class="el" href="vk__mem__alloc_8h.html">vk_mem_alloc.h</a></p>
 <h1><a class="anchor" id="main_table_of_contents"></a>
@@ -99,6 +99,7 @@
 <li><a class="el" href="staying_within_budget.html#staying_within_budget_controlling_memory_usage">Controlling memory usage</a></li>
 </ul>
 </li>
+<li><a class="el" href="resource_aliasing.html">Resource aliasing (overlap)</a></li>
 <li><a class="el" href="custom_memory_pools.html">Custom memory pools</a><ul>
 <li><a class="el" href="custom_memory_pools.html#custom_memory_pools_MemTypeIndex">Choosing memory type index</a></li>
 <li><a class="el" href="custom_memory_pools.html#linear_algorithm">Linear allocation algorithm</a><ul>
@@ -172,9 +173,7 @@
 </div><!-- contents -->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated by &#160;<a href="http://www.doxygen.org/index.html">
-<img class="footer" src="doxygen.png" alt="doxygen"/>
-</a> 1.8.18
+Generated by&#160;<a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.1
 </small></address>
 </body>
 </html>
diff --git a/third_party/vulkan_memory_allocator/docs/html/lost_allocations.html b/third_party/vulkan_memory_allocator/docs/html/lost_allocations.html
index bd85c13..57bab4b 100644
--- a/third_party/vulkan_memory_allocator/docs/html/lost_allocations.html
+++ b/third_party/vulkan_memory_allocator/docs/html/lost_allocations.html
@@ -3,7 +3,7 @@
 <head>
 <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
 <meta http-equiv="X-UA-Compatible" content="IE=9"/>
-<meta name="generator" content="Doxygen 1.8.18"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
 <meta name="viewport" content="width=device-width, initial-scale=1"/>
 <title>Vulkan Memory Allocator: Lost allocations</title>
 <link href="tabs.css" rel="stylesheet" type="text/css"/>
@@ -29,10 +29,10 @@
 </table>
 </div>
 <!-- end header part -->
-<!-- Generated by Doxygen 1.8.18 -->
+<!-- Generated by Doxygen 1.9.1 -->
 <script type="text/javascript">
 /* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
-var searchBox = new SearchBox("searchBox", "search",false,'Search');
+var searchBox = new SearchBox("searchBox", "search",false,'Search','.html');
 /* @license-end */
 </script>
 <script type="text/javascript" src="menudata.js"></script>
@@ -117,6 +117,16 @@
 <div class="line"> </div>
 <div class="line">    <a class="code" href="vk__mem__alloc_8h.html#ac72ee55598617e8eecca384e746bab51">vmaCreateBuffer</a>(allocator, &amp;bufCreateInfo, &amp;allocCreateInfo, &amp;m_Buf, &amp;m_Alloc, <span class="keyword">nullptr</span>);</div>
 <div class="line">}</div>
+<div class="ttc" id="astruct_vma_allocation_create_info_html"><div class="ttname"><a href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a></div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2879</div></div>
+<div class="ttc" id="astruct_vma_allocation_create_info_html_accb8b06b1f677d858cb9af20705fa910"><div class="ttname"><a href="struct_vma_allocation_create_info.html#accb8b06b1f677d858cb9af20705fa910">VmaAllocationCreateInfo::usage</a></div><div class="ttdeci">VmaMemoryUsage usage</div><div class="ttdoc">Intended usage of memory.</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2887</div></div>
+<div class="ttc" id="astruct_vma_allocation_create_info_html_add09658ac14fe290ace25470ddd6d41b"><div class="ttname"><a href="struct_vma_allocation_create_info.html#add09658ac14fe290ace25470ddd6d41b">VmaAllocationCreateInfo::flags</a></div><div class="ttdeci">VmaAllocationCreateFlags flags</div><div class="ttdoc">Use VmaAllocationCreateFlagBits enum.</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2881</div></div>
+<div class="ttc" id="astruct_vma_allocation_html"><div class="ttname"><a href="struct_vma_allocation.html">VmaAllocation</a></div><div class="ttdoc">Represents single memory allocation.</div></div>
+<div class="ttc" id="avk__mem__alloc_8h_html_a0d9f4e4ba5bf9aab1f1c746387753d77"><div class="ttname"><a href="vk__mem__alloc_8h.html#a0d9f4e4ba5bf9aab1f1c746387753d77">vmaDestroyBuffer</a></div><div class="ttdeci">void vmaDestroyBuffer(VmaAllocator allocator, VkBuffer buffer, VmaAllocation allocation)</div><div class="ttdoc">Destroys Vulkan buffer and frees allocated memory.</div></div>
+<div class="ttc" id="avk__mem__alloc_8h_html_a43d8ba9673c846f049089a5029d5c73a"><div class="ttname"><a href="vk__mem__alloc_8h.html#a43d8ba9673c846f049089a5029d5c73a">vmaTouchAllocation</a></div><div class="ttdeci">VkBool32 vmaTouchAllocation(VmaAllocator allocator, VmaAllocation allocation)</div><div class="ttdoc">Returns VK_TRUE if allocation is not lost and atomically marks it as used in current frame.</div></div>
+<div class="ttc" id="avk__mem__alloc_8h_html_aa5846affa1e9da3800e3e78fae2305ccac6b5dc1432d88647aa4cd456246eadf7"><div class="ttname"><a href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305ccac6b5dc1432d88647aa4cd456246eadf7">VMA_MEMORY_USAGE_GPU_ONLY</a></div><div class="ttdeci">@ VMA_MEMORY_USAGE_GPU_ONLY</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2721</div></div>
+<div class="ttc" id="avk__mem__alloc_8h_html_ac72ee55598617e8eecca384e746bab51"><div class="ttname"><a href="vk__mem__alloc_8h.html#ac72ee55598617e8eecca384e746bab51">vmaCreateBuffer</a></div><div class="ttdeci">VkResult vmaCreateBuffer(VmaAllocator allocator, const VkBufferCreateInfo *pBufferCreateInfo, const VmaAllocationCreateInfo *pAllocationCreateInfo, VkBuffer *pBuffer, VmaAllocation *pAllocation, VmaAllocationInfo *pAllocationInfo)</div></div>
+<div class="ttc" id="avk__mem__alloc_8h_html_ad9889c10c798b040d59c92f257cae597a5f436af6c8fe8540573a6d22627a6fd2"><div class="ttname"><a href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a5f436af6c8fe8540573a6d22627a6fd2">VMA_ALLOCATION_CREATE_CAN_BECOME_LOST_BIT</a></div><div class="ttdeci">@ VMA_ALLOCATION_CREATE_CAN_BECOME_LOST_BIT</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2811</div></div>
+<div class="ttc" id="avk__mem__alloc_8h_html_ad9889c10c798b040d59c92f257cae597a68686d0ce9beb0d4d1b9f2b8b1389a7e"><div class="ttname"><a href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a68686d0ce9beb0d4d1b9f2b8b1389a7e">VMA_ALLOCATION_CREATE_CAN_MAKE_OTHER_LOST_BIT</a></div><div class="ttdeci">@ VMA_ALLOCATION_CREATE_CAN_MAKE_OTHER_LOST_BIT</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2818</div></div>
 </div><!-- fragment --><p>When using lost allocations, you may see some Vulkan validation layer warnings about overlapping regions of memory bound to different kinds of buffers and images. This is still valid as long as you implement proper handling of lost allocations (like in the example above) and don't use them.</p>
 <p>You can create an allocation that is already in lost state from the beginning using function <a class="el" href="vk__mem__alloc_8h.html#ae5c9657d9e94756269145b01c05d16f1" title="Creates new allocation that is in lost state from the beginning.">vmaCreateLostAllocation()</a>. It may be useful if you need a "dummy" allocation that is not null.</p>
 <p>You can call function <a class="el" href="vk__mem__alloc_8h.html#a736bd6cbda886f36c891727e73bd4024" title="Marks all allocations in given pool as lost if they are not used in current frame or VmaPoolCreateInf...">vmaMakePoolAllocationsLost()</a> to set all eligible allocations in a specified custom pool to lost state. Allocations that have been "touched" in current frame or <a class="el" href="struct_vma_pool_create_info.html#a9437e43ffbb644dbbf7fc4e50cfad6aa" title="Maximum number of additional frames that are in use at the same time as current frame.">VmaPoolCreateInfo::frameInUseCount</a> frames back cannot become lost.</p>
@@ -124,21 +134,9 @@
 <p>Yes, although it has no visible effect. Calls to <a class="el" href="vk__mem__alloc_8h.html#a86dd08aba8633bfa4ad0df2e76481d8b" title="Returns current information about specified allocation and atomically marks it as used in current fra...">vmaGetAllocationInfo()</a> and <a class="el" href="vk__mem__alloc_8h.html#a43d8ba9673c846f049089a5029d5c73a" title="Returns VK_TRUE if allocation is not lost and atomically marks it as used in current frame.">vmaTouchAllocation()</a> update last use frame index also for allocations that cannot become lost, but the only way to observe it is to dump internal allocator state using <a class="el" href="vk__mem__alloc_8h.html#aa4fee7eb5253377599ef4fd38c93c2a0" title="Builds and returns statistics as string in JSON format.">vmaBuildStatsString()</a>. You can use this feature for debugging purposes to explicitly mark allocations that you use in current frame and then analyze JSON dump to see for how long each allocation stays unused. </p>
 </div></div><!-- contents -->
 </div><!-- PageDoc -->
-<div class="ttc" id="avk__mem__alloc_8h_html_a43d8ba9673c846f049089a5029d5c73a"><div class="ttname"><a href="vk__mem__alloc_8h.html#a43d8ba9673c846f049089a5029d5c73a">vmaTouchAllocation</a></div><div class="ttdeci">VkBool32 vmaTouchAllocation(VmaAllocator allocator, VmaAllocation allocation)</div><div class="ttdoc">Returns VK_TRUE if allocation is not lost and atomically marks it as used in current frame.</div></div>
-<div class="ttc" id="avk__mem__alloc_8h_html_ad9889c10c798b040d59c92f257cae597a5f436af6c8fe8540573a6d22627a6fd2"><div class="ttname"><a href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a5f436af6c8fe8540573a6d22627a6fd2">VMA_ALLOCATION_CREATE_CAN_BECOME_LOST_BIT</a></div><div class="ttdeci">@ VMA_ALLOCATION_CREATE_CAN_BECOME_LOST_BIT</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2667</div></div>
-<div class="ttc" id="astruct_vma_allocation_html"><div class="ttname"><a href="struct_vma_allocation.html">VmaAllocation</a></div><div class="ttdoc">Represents single memory allocation.</div></div>
-<div class="ttc" id="avk__mem__alloc_8h_html_aa5846affa1e9da3800e3e78fae2305ccac6b5dc1432d88647aa4cd456246eadf7"><div class="ttname"><a href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305ccac6b5dc1432d88647aa4cd456246eadf7">VMA_MEMORY_USAGE_GPU_ONLY</a></div><div class="ttdeci">@ VMA_MEMORY_USAGE_GPU_ONLY</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2577</div></div>
-<div class="ttc" id="avk__mem__alloc_8h_html_ad9889c10c798b040d59c92f257cae597a68686d0ce9beb0d4d1b9f2b8b1389a7e"><div class="ttname"><a href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a68686d0ce9beb0d4d1b9f2b8b1389a7e">VMA_ALLOCATION_CREATE_CAN_MAKE_OTHER_LOST_BIT</a></div><div class="ttdeci">@ VMA_ALLOCATION_CREATE_CAN_MAKE_OTHER_LOST_BIT</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2674</div></div>
-<div class="ttc" id="astruct_vma_allocation_create_info_html_accb8b06b1f677d858cb9af20705fa910"><div class="ttname"><a href="struct_vma_allocation_create_info.html#accb8b06b1f677d858cb9af20705fa910">VmaAllocationCreateInfo::usage</a></div><div class="ttdeci">VmaMemoryUsage usage</div><div class="ttdoc">Intended usage of memory.</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2743</div></div>
-<div class="ttc" id="avk__mem__alloc_8h_html_ac72ee55598617e8eecca384e746bab51"><div class="ttname"><a href="vk__mem__alloc_8h.html#ac72ee55598617e8eecca384e746bab51">vmaCreateBuffer</a></div><div class="ttdeci">VkResult vmaCreateBuffer(VmaAllocator allocator, const VkBufferCreateInfo *pBufferCreateInfo, const VmaAllocationCreateInfo *pAllocationCreateInfo, VkBuffer *pBuffer, VmaAllocation *pAllocation, VmaAllocationInfo *pAllocationInfo)</div></div>
-<div class="ttc" id="avk__mem__alloc_8h_html_a0d9f4e4ba5bf9aab1f1c746387753d77"><div class="ttname"><a href="vk__mem__alloc_8h.html#a0d9f4e4ba5bf9aab1f1c746387753d77">vmaDestroyBuffer</a></div><div class="ttdeci">void vmaDestroyBuffer(VmaAllocator allocator, VkBuffer buffer, VmaAllocation allocation)</div><div class="ttdoc">Destroys Vulkan buffer and frees allocated memory.</div></div>
-<div class="ttc" id="astruct_vma_allocation_create_info_html_add09658ac14fe290ace25470ddd6d41b"><div class="ttname"><a href="struct_vma_allocation_create_info.html#add09658ac14fe290ace25470ddd6d41b">VmaAllocationCreateInfo::flags</a></div><div class="ttdeci">VmaAllocationCreateFlags flags</div><div class="ttdoc">Use VmaAllocationCreateFlagBits enum.</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2737</div></div>
-<div class="ttc" id="astruct_vma_allocation_create_info_html"><div class="ttname"><a href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a></div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2735</div></div>
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated by &#160;<a href="http://www.doxygen.org/index.html">
-<img class="footer" src="doxygen.png" alt="doxygen"/>
-</a> 1.8.18
+Generated by&#160;<a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.1
 </small></address>
 </body>
 </html>
diff --git a/third_party/vulkan_memory_allocator/docs/html/memory_mapping.html b/third_party/vulkan_memory_allocator/docs/html/memory_mapping.html
index 110af7c..4204b48 100644
--- a/third_party/vulkan_memory_allocator/docs/html/memory_mapping.html
+++ b/third_party/vulkan_memory_allocator/docs/html/memory_mapping.html
@@ -3,7 +3,7 @@
 <head>
 <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
 <meta http-equiv="X-UA-Compatible" content="IE=9"/>
-<meta name="generator" content="Doxygen 1.8.18"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
 <meta name="viewport" content="width=device-width, initial-scale=1"/>
 <title>Vulkan Memory Allocator: Memory mapping</title>
 <link href="tabs.css" rel="stylesheet" type="text/css"/>
@@ -29,10 +29,10 @@
 </table>
 </div>
 <!-- end header part -->
-<!-- Generated by Doxygen 1.8.18 -->
+<!-- Generated by Doxygen 1.9.1 -->
 <script type="text/javascript">
 /* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
-var searchBox = new SearchBox("searchBox", "search",false,'Search');
+var searchBox = new SearchBox("searchBox", "search",false,'Search','.html');
 /* @license-end */
 </script>
 <script type="text/javascript" src="menudata.js"></script>
@@ -91,6 +91,10 @@
 <div class="line"><a class="code" href="vk__mem__alloc_8h.html#ad5bd1243512d099706de88168992f069">vmaMapMemory</a>(allocator, constantBufferAllocation, &amp;mappedData);</div>
 <div class="line">memcpy(mappedData, &amp;constantBufferData, <span class="keyword">sizeof</span>(constantBufferData));</div>
 <div class="line"><a class="code" href="vk__mem__alloc_8h.html#a9bc268595cb33f6ec4d519cfce81ff45">vmaUnmapMemory</a>(allocator, constantBufferAllocation);</div>
+<div class="ttc" id="astruct_vma_allocation_html"><div class="ttname"><a href="struct_vma_allocation.html">VmaAllocation</a></div><div class="ttdoc">Represents single memory allocation.</div></div>
+<div class="ttc" id="astruct_vma_allocator_html"><div class="ttname"><a href="struct_vma_allocator.html">VmaAllocator</a></div><div class="ttdoc">Represents main object of this library initialized.</div></div>
+<div class="ttc" id="avk__mem__alloc_8h_html_a9bc268595cb33f6ec4d519cfce81ff45"><div class="ttname"><a href="vk__mem__alloc_8h.html#a9bc268595cb33f6ec4d519cfce81ff45">vmaUnmapMemory</a></div><div class="ttdeci">void vmaUnmapMemory(VmaAllocator allocator, VmaAllocation allocation)</div><div class="ttdoc">Unmaps memory represented by given allocation, mapped previously using vmaMapMemory().</div></div>
+<div class="ttc" id="avk__mem__alloc_8h_html_ad5bd1243512d099706de88168992f069"><div class="ttname"><a href="vk__mem__alloc_8h.html#ad5bd1243512d099706de88168992f069">vmaMapMemory</a></div><div class="ttdeci">VkResult vmaMapMemory(VmaAllocator allocator, VmaAllocation allocation, void **ppData)</div><div class="ttdoc">Maps memory represented by given allocation and returns pointer to it.</div></div>
 </div><!-- fragment --><p>When mapping, you may see a warning from Vulkan validation layer similar to this one:</p>
 <p><em>Mapping an image with layout VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL can result in undefined behavior if this memory is used by the device. Only GENERAL or PREINITIALIZED should be used.</em></p>
 <p>It happens because the library maps entire <code>VkDeviceMemory</code> block, where different types of images and buffers may end up together, especially on GPUs with unified memory like Intel. You can safely ignore it if you are sure you access only memory of the intended object that you wanted to map.</p>
@@ -112,10 +116,17 @@
 <div class="line"> </div>
 <div class="line"><span class="comment">// Buffer is already mapped. You can access its memory.</span></div>
 <div class="line">memcpy(allocInfo.<a class="code" href="struct_vma_allocation_info.html#a5eeffbe2d2f30f53370ff14aefbadbe2">pMappedData</a>, &amp;constantBufferData, <span class="keyword">sizeof</span>(constantBufferData));</div>
+<div class="ttc" id="astruct_vma_allocation_create_info_html"><div class="ttname"><a href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a></div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2879</div></div>
+<div class="ttc" id="astruct_vma_allocation_create_info_html_accb8b06b1f677d858cb9af20705fa910"><div class="ttname"><a href="struct_vma_allocation_create_info.html#accb8b06b1f677d858cb9af20705fa910">VmaAllocationCreateInfo::usage</a></div><div class="ttdeci">VmaMemoryUsage usage</div><div class="ttdoc">Intended usage of memory.</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2887</div></div>
+<div class="ttc" id="astruct_vma_allocation_create_info_html_add09658ac14fe290ace25470ddd6d41b"><div class="ttname"><a href="struct_vma_allocation_create_info.html#add09658ac14fe290ace25470ddd6d41b">VmaAllocationCreateInfo::flags</a></div><div class="ttdeci">VmaAllocationCreateFlags flags</div><div class="ttdoc">Use VmaAllocationCreateFlagBits enum.</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2881</div></div>
+<div class="ttc" id="astruct_vma_allocation_info_html"><div class="ttname"><a href="struct_vma_allocation_info.html">VmaAllocationInfo</a></div><div class="ttdoc">Parameters of VmaAllocation objects, that can be retrieved using function vmaGetAllocationInfo().</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:3229</div></div>
+<div class="ttc" id="astruct_vma_allocation_info_html_a5eeffbe2d2f30f53370ff14aefbadbe2"><div class="ttname"><a href="struct_vma_allocation_info.html#a5eeffbe2d2f30f53370ff14aefbadbe2">VmaAllocationInfo::pMappedData</a></div><div class="ttdeci">void * pMappedData</div><div class="ttdoc">Pointer to the beginning of this allocation as mapped data.</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:3273</div></div>
+<div class="ttc" id="avk__mem__alloc_8h_html_aa5846affa1e9da3800e3e78fae2305cca40bdf4cddeffeb12f43d45ca1286e0a5"><div class="ttname"><a href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305cca40bdf4cddeffeb12f43d45ca1286e0a5">VMA_MEMORY_USAGE_CPU_ONLY</a></div><div class="ttdeci">@ VMA_MEMORY_USAGE_CPU_ONLY</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2731</div></div>
+<div class="ttc" id="avk__mem__alloc_8h_html_ac72ee55598617e8eecca384e746bab51"><div class="ttname"><a href="vk__mem__alloc_8h.html#ac72ee55598617e8eecca384e746bab51">vmaCreateBuffer</a></div><div class="ttdeci">VkResult vmaCreateBuffer(VmaAllocator allocator, const VkBufferCreateInfo *pBufferCreateInfo, const VmaAllocationCreateInfo *pAllocationCreateInfo, VkBuffer *pBuffer, VmaAllocation *pAllocation, VmaAllocationInfo *pAllocationInfo)</div></div>
+<div class="ttc" id="avk__mem__alloc_8h_html_ad9889c10c798b040d59c92f257cae597a11da372cc3a82931c5e5d6146cd9dd1f"><div class="ttname"><a href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a11da372cc3a82931c5e5d6146cd9dd1f">VMA_ALLOCATION_CREATE_MAPPED_BIT</a></div><div class="ttdeci">@ VMA_ALLOCATION_CREATE_MAPPED_BIT</div><div class="ttdoc">Set this flag to use a memory that will be persistently mapped and retrieve pointer to it.</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2798</div></div>
 </div><!-- fragment --><p>There are some exceptions though, when you should consider mapping memory only for a short period of time:</p>
 <ul>
 <li>When operating system is Windows 7 or 8.x (Windows 10 is not affected because it uses WDDM2), device is discrete AMD GPU, and memory type is the special 256 MiB pool of <code>DEVICE_LOCAL + HOST_VISIBLE</code> memory (selected when you use <a class="el" href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305cca9066b52c5a7079bb74a69aaf8b92ff67">VMA_MEMORY_USAGE_CPU_TO_GPU</a>), then whenever a memory block allocated from this memory type stays mapped for the time of any call to <code>vkQueueSubmit()</code> or <code>vkQueuePresentKHR()</code>, this block is migrated by WDDM to system RAM, which degrades performance. It doesn't matter if that particular memory block is actually used by the command buffer being submitted.</li>
-<li>On Mac/MoltenVK there is a known bug - <a href="https://github.com/KhronosGroup/MoltenVK/issues/175">Issue #175</a> which requires unmapping before GPU can see updated texture.</li>
 <li>Keeping many large memory blocks mapped may impact performance or stability of some debugging tools.</li>
 </ul>
 <h1><a class="anchor" id="memory_mapping_cache_control"></a>
@@ -143,7 +154,7 @@
 <div class="line"> </div>
 <div class="line">VkMemoryPropertyFlags memFlags;</div>
 <div class="line"><a class="code" href="vk__mem__alloc_8h.html#a8701444752eb5de4464adb5a2b514bca">vmaGetMemoryTypeProperties</a>(allocator, allocInfo.<a class="code" href="struct_vma_allocation_info.html#a7f6b0aa58c135e488e6b40a388dad9d5">memoryType</a>, &amp;memFlags);</div>
-<div class="line"><span class="keywordflow">if</span>((memFlags &amp; VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT) == 0)</div>
+<div class="line"><span class="keywordflow">if</span>((memFlags &amp; VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT) != 0)</div>
 <div class="line">{</div>
 <div class="line">    <span class="comment">// Allocation ended up in mappable memory. You can map it and access it directly.</span></div>
 <div class="line">    <span class="keywordtype">void</span>* mappedData;</div>
@@ -156,6 +167,10 @@
 <div class="line">    <span class="comment">// Allocation ended up in non-mappable memory.</span></div>
 <div class="line">    <span class="comment">// You need to create CPU-side buffer in VMA_MEMORY_USAGE_CPU_ONLY and make a transfer.</span></div>
 <div class="line">}</div>
+<div class="ttc" id="astruct_vma_allocation_create_info_html_a7fe8d81a1ad10b2a2faacacee5b15d6d"><div class="ttname"><a href="struct_vma_allocation_create_info.html#a7fe8d81a1ad10b2a2faacacee5b15d6d">VmaAllocationCreateInfo::preferredFlags</a></div><div class="ttdeci">VkMemoryPropertyFlags preferredFlags</div><div class="ttdoc">Flags that preferably should be set in a memory type chosen for an allocation.</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2897</div></div>
+<div class="ttc" id="astruct_vma_allocation_info_html_a7f6b0aa58c135e488e6b40a388dad9d5"><div class="ttname"><a href="struct_vma_allocation_info.html#a7f6b0aa58c135e488e6b40a388dad9d5">VmaAllocationInfo::memoryType</a></div><div class="ttdeci">uint32_t memoryType</div><div class="ttdoc">Memory type index that this allocation was allocated from.</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:3234</div></div>
+<div class="ttc" id="avk__mem__alloc_8h_html_a8701444752eb5de4464adb5a2b514bca"><div class="ttname"><a href="vk__mem__alloc_8h.html#a8701444752eb5de4464adb5a2b514bca">vmaGetMemoryTypeProperties</a></div><div class="ttdeci">void vmaGetMemoryTypeProperties(VmaAllocator allocator, uint32_t memoryTypeIndex, VkMemoryPropertyFlags *pFlags)</div><div class="ttdoc">Given Memory Type Index, returns Property Flags of this memory type.</div></div>
+<div class="ttc" id="avk__mem__alloc_8h_html_aa5846affa1e9da3800e3e78fae2305ccac6b5dc1432d88647aa4cd456246eadf7"><div class="ttname"><a href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305ccac6b5dc1432d88647aa4cd456246eadf7">VMA_MEMORY_USAGE_GPU_ONLY</a></div><div class="ttdeci">@ VMA_MEMORY_USAGE_GPU_ONLY</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2721</div></div>
 </div><!-- fragment --><p>You can even use <a class="el" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a11da372cc3a82931c5e5d6146cd9dd1f" title="Set this flag to use a memory that will be persistently mapped and retrieve pointer to it.">VMA_ALLOCATION_CREATE_MAPPED_BIT</a> flag while creating allocations that are not necessarily <code>HOST_VISIBLE</code> (e.g. using <a class="el" href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305ccac6b5dc1432d88647aa4cd456246eadf7">VMA_MEMORY_USAGE_GPU_ONLY</a>). If the allocation ends up in memory type that is <code>HOST_VISIBLE</code>, it will be persistently mapped and you can use it directly. If not, the flag is just ignored. Example:</p>
 <div class="fragment"><div class="line">VkBufferCreateInfo bufCreateInfo = { VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO };</div>
 <div class="line">bufCreateInfo.size = <span class="keyword">sizeof</span>(ConstantBuffer);</div>
@@ -170,7 +185,7 @@
 <div class="line"><a class="code" href="struct_vma_allocation_info.html">VmaAllocationInfo</a> allocInfo;</div>
 <div class="line"><a class="code" href="vk__mem__alloc_8h.html#ac72ee55598617e8eecca384e746bab51">vmaCreateBuffer</a>(allocator, &amp;bufCreateInfo, &amp;allocCreateInfo, &amp;buf, &amp;alloc, &amp;allocInfo);</div>
 <div class="line"> </div>
-<div class="line"><span class="keywordflow">if</span>(allocInfo.<a class="code" href="struct_vma_allocation_info.html#adc507656149c04de7ed95d0042ba2a13">pUserData</a> != <span class="keyword">nullptr</span>)</div>
+<div class="line"><span class="keywordflow">if</span>(allocInfo.<a class="code" href="struct_vma_allocation_info.html#a5eeffbe2d2f30f53370ff14aefbadbe2">pMappedData</a> != <span class="keyword">nullptr</span>)</div>
 <div class="line">{</div>
 <div class="line">    <span class="comment">// Allocation ended up in mappable memory.</span></div>
 <div class="line">    <span class="comment">// It&#39;s persistently mapped. You can access it directly.</span></div>
@@ -183,28 +198,9 @@
 <div class="line">}</div>
 </div><!-- fragment --> </div></div><!-- contents -->
 </div><!-- PageDoc -->
-<div class="ttc" id="avk__mem__alloc_8h_html_a9bc268595cb33f6ec4d519cfce81ff45"><div class="ttname"><a href="vk__mem__alloc_8h.html#a9bc268595cb33f6ec4d519cfce81ff45">vmaUnmapMemory</a></div><div class="ttdeci">void vmaUnmapMemory(VmaAllocator allocator, VmaAllocation allocation)</div><div class="ttdoc">Unmaps memory represented by given allocation, mapped previously using vmaMapMemory().</div></div>
-<div class="ttc" id="astruct_vma_allocator_html"><div class="ttname"><a href="struct_vma_allocator.html">VmaAllocator</a></div><div class="ttdoc">Represents main object of this library initialized.</div></div>
-<div class="ttc" id="avk__mem__alloc_8h_html_a8701444752eb5de4464adb5a2b514bca"><div class="ttname"><a href="vk__mem__alloc_8h.html#a8701444752eb5de4464adb5a2b514bca">vmaGetMemoryTypeProperties</a></div><div class="ttdeci">void vmaGetMemoryTypeProperties(VmaAllocator allocator, uint32_t memoryTypeIndex, VkMemoryPropertyFlags *pFlags)</div><div class="ttdoc">Given Memory Type Index, returns Property Flags of this memory type.</div></div>
-<div class="ttc" id="avk__mem__alloc_8h_html_aa5846affa1e9da3800e3e78fae2305cca40bdf4cddeffeb12f43d45ca1286e0a5"><div class="ttname"><a href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305cca40bdf4cddeffeb12f43d45ca1286e0a5">VMA_MEMORY_USAGE_CPU_ONLY</a></div><div class="ttdeci">@ VMA_MEMORY_USAGE_CPU_ONLY</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2587</div></div>
-<div class="ttc" id="astruct_vma_allocation_html"><div class="ttname"><a href="struct_vma_allocation.html">VmaAllocation</a></div><div class="ttdoc">Represents single memory allocation.</div></div>
-<div class="ttc" id="avk__mem__alloc_8h_html_aa5846affa1e9da3800e3e78fae2305ccac6b5dc1432d88647aa4cd456246eadf7"><div class="ttname"><a href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305ccac6b5dc1432d88647aa4cd456246eadf7">VMA_MEMORY_USAGE_GPU_ONLY</a></div><div class="ttdeci">@ VMA_MEMORY_USAGE_GPU_ONLY</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2577</div></div>
-<div class="ttc" id="avk__mem__alloc_8h_html_ad5bd1243512d099706de88168992f069"><div class="ttname"><a href="vk__mem__alloc_8h.html#ad5bd1243512d099706de88168992f069">vmaMapMemory</a></div><div class="ttdeci">VkResult vmaMapMemory(VmaAllocator allocator, VmaAllocation allocation, void **ppData)</div><div class="ttdoc">Maps memory represented by given allocation and returns pointer to it.</div></div>
-<div class="ttc" id="astruct_vma_allocation_info_html_a5eeffbe2d2f30f53370ff14aefbadbe2"><div class="ttname"><a href="struct_vma_allocation_info.html#a5eeffbe2d2f30f53370ff14aefbadbe2">VmaAllocationInfo::pMappedData</a></div><div class="ttdeci">void * pMappedData</div><div class="ttdoc">Pointer to the beginning of this allocation as mapped data.</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:3105</div></div>
-<div class="ttc" id="astruct_vma_allocation_create_info_html_accb8b06b1f677d858cb9af20705fa910"><div class="ttname"><a href="struct_vma_allocation_create_info.html#accb8b06b1f677d858cb9af20705fa910">VmaAllocationCreateInfo::usage</a></div><div class="ttdeci">VmaMemoryUsage usage</div><div class="ttdoc">Intended usage of memory.</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2743</div></div>
-<div class="ttc" id="astruct_vma_allocation_info_html_adc507656149c04de7ed95d0042ba2a13"><div class="ttname"><a href="struct_vma_allocation_info.html#adc507656149c04de7ed95d0042ba2a13">VmaAllocationInfo::pUserData</a></div><div class="ttdeci">void * pUserData</div><div class="ttdoc">Custom general-purpose pointer that was passed as VmaAllocationCreateInfo::pUserData or set using vma...</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:3110</div></div>
-<div class="ttc" id="avk__mem__alloc_8h_html_ac72ee55598617e8eecca384e746bab51"><div class="ttname"><a href="vk__mem__alloc_8h.html#ac72ee55598617e8eecca384e746bab51">vmaCreateBuffer</a></div><div class="ttdeci">VkResult vmaCreateBuffer(VmaAllocator allocator, const VkBufferCreateInfo *pBufferCreateInfo, const VmaAllocationCreateInfo *pAllocationCreateInfo, VkBuffer *pBuffer, VmaAllocation *pAllocation, VmaAllocationInfo *pAllocationInfo)</div></div>
-<div class="ttc" id="astruct_vma_allocation_info_html_a7f6b0aa58c135e488e6b40a388dad9d5"><div class="ttname"><a href="struct_vma_allocation_info.html#a7f6b0aa58c135e488e6b40a388dad9d5">VmaAllocationInfo::memoryType</a></div><div class="ttdeci">uint32_t memoryType</div><div class="ttdoc">Memory type index that this allocation was allocated from.</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:3077</div></div>
-<div class="ttc" id="avk__mem__alloc_8h_html_ad9889c10c798b040d59c92f257cae597a11da372cc3a82931c5e5d6146cd9dd1f"><div class="ttname"><a href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a11da372cc3a82931c5e5d6146cd9dd1f">VMA_ALLOCATION_CREATE_MAPPED_BIT</a></div><div class="ttdeci">@ VMA_ALLOCATION_CREATE_MAPPED_BIT</div><div class="ttdoc">Set this flag to use a memory that will be persistently mapped and retrieve pointer to it.</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2654</div></div>
-<div class="ttc" id="astruct_vma_allocation_create_info_html_add09658ac14fe290ace25470ddd6d41b"><div class="ttname"><a href="struct_vma_allocation_create_info.html#add09658ac14fe290ace25470ddd6d41b">VmaAllocationCreateInfo::flags</a></div><div class="ttdeci">VmaAllocationCreateFlags flags</div><div class="ttdoc">Use VmaAllocationCreateFlagBits enum.</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2737</div></div>
-<div class="ttc" id="astruct_vma_allocation_create_info_html"><div class="ttname"><a href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a></div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2735</div></div>
-<div class="ttc" id="astruct_vma_allocation_create_info_html_a7fe8d81a1ad10b2a2faacacee5b15d6d"><div class="ttname"><a href="struct_vma_allocation_create_info.html#a7fe8d81a1ad10b2a2faacacee5b15d6d">VmaAllocationCreateInfo::preferredFlags</a></div><div class="ttdeci">VkMemoryPropertyFlags preferredFlags</div><div class="ttdoc">Flags that preferably should be set in a memory type chosen for an allocation.</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2753</div></div>
-<div class="ttc" id="astruct_vma_allocation_info_html"><div class="ttname"><a href="struct_vma_allocation_info.html">VmaAllocationInfo</a></div><div class="ttdoc">Parameters of VmaAllocation objects, that can be retrieved using function vmaGetAllocationInfo().</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:3072</div></div>
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated by &#160;<a href="http://www.doxygen.org/index.html">
-<img class="footer" src="doxygen.png" alt="doxygen"/>
-</a> 1.8.18
+Generated by&#160;<a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.1
 </small></address>
 </body>
 </html>
diff --git a/third_party/vulkan_memory_allocator/docs/html/menu.js b/third_party/vulkan_memory_allocator/docs/html/menu.js
index d18a2fe..2fe2214 100644
--- a/third_party/vulkan_memory_allocator/docs/html/menu.js
+++ b/third_party/vulkan_memory_allocator/docs/html/menu.js
@@ -41,9 +41,9 @@
   $('#main-nav').children(':first').addClass('sm sm-dox').attr('id','main-menu');
   if (searchEnabled) {
     if (serverSide) {
-      $('#main-menu').append('<li style="float:right"><div id="MSearchBox" class="MSearchBoxInactive"><div class="left"><form id="FSearchBox" action="'+relPath+searchPage+'" method="get"><img id="MSearchSelect" src="'+relPath+'search/mag.png" alt=""/><input type="text" id="MSearchField" name="query" value="'+search+'" size="20" accesskey="S" onfocus="searchBox.OnSearchFieldFocus(true)" onblur="searchBox.OnSearchFieldFocus(false)"></form></div><div class="right"></div></div></li>');
+      $('#main-menu').append('<li style="float:right"><div id="MSearchBox" class="MSearchBoxInactive"><div class="left"><form id="FSearchBox" action="'+relPath+searchPage+'" method="get"><img id="MSearchSelect" src="'+relPath+'search/mag.svg" alt=""/><input type="text" id="MSearchField" name="query" value="'+search+'" size="20" accesskey="S" onfocus="searchBox.OnSearchFieldFocus(true)" onblur="searchBox.OnSearchFieldFocus(false)"></form></div><div class="right"></div></div></li>');
     } else {
-      $('#main-menu').append('<li style="float:right"><div id="MSearchBox" class="MSearchBoxInactive"><span class="left"><img id="MSearchSelect" src="'+relPath+'search/mag_sel.png" onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" alt=""/><input type="text" id="MSearchField" value="'+search+'" accesskey="S" onfocus="searchBox.OnSearchFieldFocus(true)" onblur="searchBox.OnSearchFieldFocus(false)" onkeyup="searchBox.OnSearchFieldChange(event)"/></span><span class="right"><a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="'+relPath+'search/close.png" alt=""/></a></span></div></li>');
+      $('#main-menu').append('<li style="float:right"><div id="MSearchBox" class="MSearchBoxInactive"><span class="left"><img id="MSearchSelect" src="'+relPath+'search/mag_sel.svg" onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" alt=""/><input type="text" id="MSearchField" value="'+search+'" accesskey="S" onfocus="searchBox.OnSearchFieldFocus(true)" onblur="searchBox.OnSearchFieldFocus(false)" onkeyup="searchBox.OnSearchFieldChange(event)"/></span><span class="right"><a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="'+relPath+'search/close.svg" alt=""/></a></span></div></li>');
     }
   }
   $('#main-menu').smartmenus();
diff --git a/third_party/vulkan_memory_allocator/docs/html/menudata.js b/third_party/vulkan_memory_allocator/docs/html/menudata.js
index e8e5bdc..a08761f 100644
--- a/third_party/vulkan_memory_allocator/docs/html/menudata.js
+++ b/third_party/vulkan_memory_allocator/docs/html/menudata.js
@@ -63,7 +63,6 @@
 {text:"File List",url:"files.html"},
 {text:"File Members",url:"globals.html",children:[
 {text:"All",url:"globals.html",children:[
-{text:"n",url:"globals.html#index_n"},
 {text:"p",url:"globals.html#index_p"},
 {text:"v",url:"globals.html#index_v"}]},
 {text:"Functions",url:"globals_func.html",children:[
diff --git a/third_party/vulkan_memory_allocator/docs/html/pages.html b/third_party/vulkan_memory_allocator/docs/html/pages.html
index bc43b88..6525b8f 100644
--- a/third_party/vulkan_memory_allocator/docs/html/pages.html
+++ b/third_party/vulkan_memory_allocator/docs/html/pages.html
@@ -3,7 +3,7 @@
 <head>
 <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
 <meta http-equiv="X-UA-Compatible" content="IE=9"/>
-<meta name="generator" content="Doxygen 1.8.18"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
 <meta name="viewport" content="width=device-width, initial-scale=1"/>
 <title>Vulkan Memory Allocator: Related Pages</title>
 <link href="tabs.css" rel="stylesheet" type="text/css"/>
@@ -29,10 +29,10 @@
 </table>
 </div>
 <!-- end header part -->
-<!-- Generated by Doxygen 1.8.18 -->
+<!-- Generated by Doxygen 1.9.1 -->
 <script type="text/javascript">
 /* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
-var searchBox = new SearchBox("searchBox", "search",false,'Search');
+var searchBox = new SearchBox("searchBox", "search",false,'Search','.html');
 /* @license-end */
 </script>
 <script type="text/javascript" src="menudata.js"></script>
@@ -73,9 +73,7 @@
 </div><!-- contents -->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated by &#160;<a href="http://www.doxygen.org/index.html">
-<img class="footer" src="doxygen.png" alt="doxygen"/>
-</a> 1.8.18
+Generated by&#160;<a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.1
 </small></address>
 </body>
 </html>
diff --git a/third_party/vulkan_memory_allocator/docs/html/quick_start.html b/third_party/vulkan_memory_allocator/docs/html/quick_start.html
index 4c42a37..5ed820b 100644
--- a/third_party/vulkan_memory_allocator/docs/html/quick_start.html
+++ b/third_party/vulkan_memory_allocator/docs/html/quick_start.html
@@ -3,7 +3,7 @@
 <head>
 <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
 <meta http-equiv="X-UA-Compatible" content="IE=9"/>
-<meta name="generator" content="Doxygen 1.8.18"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
 <meta name="viewport" content="width=device-width, initial-scale=1"/>
 <title>Vulkan Memory Allocator: Quick start</title>
 <link href="tabs.css" rel="stylesheet" type="text/css"/>
@@ -29,10 +29,10 @@
 </table>
 </div>
 <!-- end header part -->
-<!-- Generated by Doxygen 1.8.18 -->
+<!-- Generated by Doxygen 1.9.1 -->
 <script type="text/javascript">
 /* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
-var searchBox = new SearchBox("searchBox", "search",false,'Search');
+var searchBox = new SearchBox("searchBox", "search",false,'Search','.html');
 /* @license-end */
 </script>
 <script type="text/javascript" src="menudata.js"></script>
@@ -76,13 +76,19 @@
 <p>To do it properly:</p>
 <ol type="1">
 <li>Include "vk_mem_alloc.h" file in each CPP file where you want to use the library. This includes declarations of all members of the library.</li>
-<li>In exacly one CPP file define following macro before this include. It enables also internal definitions.</li>
+<li>In exactly one CPP file define following macro before this include. It enables also internal definitions.</li>
 </ol>
 <div class="fragment"><div class="line"><span class="preprocessor">#define VMA_IMPLEMENTATION</span></div>
 <div class="line"><span class="preprocessor">#include &quot;vk_mem_alloc.h&quot;</span></div>
 </div><!-- fragment --><p>It may be a good idea to create dedicated CPP file just for this purpose.</p>
 <p>Note on language: This library is written in C++, but has C-compatible interface. Thus you can include and use <a class="el" href="vk__mem__alloc_8h.html">vk_mem_alloc.h</a> in C or C++ code, but full implementation with <code>VMA_IMPLEMENTATION</code> macro must be compiled as C++, NOT as C.</p>
 <p>Please note that this library includes header <code>&lt;vulkan/vulkan.h&gt;</code>, which in turn includes <code>&lt;windows.h&gt;</code> on Windows. If you need some specific macros defined before including these headers (like <code>WIN32_LEAN_AND_MEAN</code> or <code>WINVER</code> for Windows, <code>VK_USE_PLATFORM_WIN32_KHR</code> for Vulkan), you must define them before every <code>#include</code> of this library.</p>
+<p>You may need to configure the way you import Vulkan functions.</p>
+<ul>
+<li>By default, VMA assumes you you link statically with Vulkan API. If this is not the case, <code>#define VMA_STATIC_VULKAN_FUNCTIONS 0</code> before <code>#include</code> of the VMA implementation and use another way.</li>
+<li>You can <code>#define VMA_DYNAMIC_VULKAN_FUNCTIONS 1</code> and make sure <code>vkGetInstanceProcAddr</code> and <code>vkGetDeviceProcAddr</code> globals are defined. All the remaining Vulkan functions will be fetched automatically.</li>
+<li>Finally, you can provide your own pointers to all Vulkan functions needed by VMA using structure member <a class="el" href="struct_vma_allocator_create_info.html#a3dc197be3227da7338b1643f70db36bd" title="Pointers to Vulkan functions. Can be null.">VmaAllocatorCreateInfo::pVulkanFunctions</a>, if you fetched them in some custom way e.g. using some loader like <a href="https://github.com/zeux/volk">Volk</a>.</li>
+</ul>
 <h1><a class="anchor" id="quick_start_initialization"></a>
 Initialization</h1>
 <p>At program startup:</p>
@@ -91,13 +97,22 @@
 <li>Fill <a class="el" href="struct_vma_allocator_create_info.html" title="Description of a Allocator to be created.">VmaAllocatorCreateInfo</a> structure and create <a class="el" href="struct_vma_allocator.html" title="Represents main object of this library initialized.">VmaAllocator</a> object by calling <a class="el" href="vk__mem__alloc_8h.html#a200692051ddb34240248234f5f4c17bb" title="Creates Allocator object.">vmaCreateAllocator()</a>.</li>
 </ol>
 <div class="fragment"><div class="line"><a class="code" href="struct_vma_allocator_create_info.html">VmaAllocatorCreateInfo</a> allocatorInfo = {};</div>
+<div class="line">allocatorInfo.<a class="code" href="struct_vma_allocator_create_info.html#ae0ffc55139b54520a6bb704b29ffc285">vulkanApiVersion</a> = VK_API_VERSION_1_2;</div>
 <div class="line">allocatorInfo.<a class="code" href="struct_vma_allocator_create_info.html#a08230f04ae6ccf8a78150a9e829a7156">physicalDevice</a> = physicalDevice;</div>
 <div class="line">allocatorInfo.<a class="code" href="struct_vma_allocator_create_info.html#ad924ddd77b04039c88d0c09b0ffcd500">device</a> = device;</div>
 <div class="line">allocatorInfo.<a class="code" href="struct_vma_allocator_create_info.html#a70dd42e29b1df1d1b9b61532ae0b370b">instance</a> = instance;</div>
 <div class="line"> </div>
 <div class="line"><a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator;</div>
 <div class="line"><a class="code" href="vk__mem__alloc_8h.html#a200692051ddb34240248234f5f4c17bb">vmaCreateAllocator</a>(&amp;allocatorInfo, &amp;allocator);</div>
-</div><!-- fragment --><h1><a class="anchor" id="quick_start_resource_allocation"></a>
+<div class="ttc" id="astruct_vma_allocator_create_info_html"><div class="ttname"><a href="struct_vma_allocator_create_info.html">VmaAllocatorCreateInfo</a></div><div class="ttdoc">Description of a Allocator to be created.</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2413</div></div>
+<div class="ttc" id="astruct_vma_allocator_create_info_html_a08230f04ae6ccf8a78150a9e829a7156"><div class="ttname"><a href="struct_vma_allocator_create_info.html#a08230f04ae6ccf8a78150a9e829a7156">VmaAllocatorCreateInfo::physicalDevice</a></div><div class="ttdeci">VkPhysicalDevice physicalDevice</div><div class="ttdoc">Vulkan physical device.</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2418</div></div>
+<div class="ttc" id="astruct_vma_allocator_create_info_html_a70dd42e29b1df1d1b9b61532ae0b370b"><div class="ttname"><a href="struct_vma_allocator_create_info.html#a70dd42e29b1df1d1b9b61532ae0b370b">VmaAllocatorCreateInfo::instance</a></div><div class="ttdeci">VkInstance instance</div><div class="ttdoc">Handle to Vulkan instance object.</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2487</div></div>
+<div class="ttc" id="astruct_vma_allocator_create_info_html_ad924ddd77b04039c88d0c09b0ffcd500"><div class="ttname"><a href="struct_vma_allocator_create_info.html#ad924ddd77b04039c88d0c09b0ffcd500">VmaAllocatorCreateInfo::device</a></div><div class="ttdeci">VkDevice device</div><div class="ttdoc">Vulkan device.</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2421</div></div>
+<div class="ttc" id="astruct_vma_allocator_create_info_html_ae0ffc55139b54520a6bb704b29ffc285"><div class="ttname"><a href="struct_vma_allocator_create_info.html#ae0ffc55139b54520a6bb704b29ffc285">VmaAllocatorCreateInfo::vulkanApiVersion</a></div><div class="ttdeci">uint32_t vulkanApiVersion</div><div class="ttdoc">Optional. The highest version of Vulkan that the application is designed to use.</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2496</div></div>
+<div class="ttc" id="astruct_vma_allocator_html"><div class="ttname"><a href="struct_vma_allocator.html">VmaAllocator</a></div><div class="ttdoc">Represents main object of this library initialized.</div></div>
+<div class="ttc" id="avk__mem__alloc_8h_html_a200692051ddb34240248234f5f4c17bb"><div class="ttname"><a href="vk__mem__alloc_8h.html#a200692051ddb34240248234f5f4c17bb">vmaCreateAllocator</a></div><div class="ttdeci">VkResult vmaCreateAllocator(const VmaAllocatorCreateInfo *pCreateInfo, VmaAllocator *pAllocator)</div><div class="ttdoc">Creates Allocator object.</div></div>
+</div><!-- fragment --><p>Only members <code>physicalDevice</code>, <code>device</code>, <code>instance</code> are required. However, you should inform the library which Vulkan version do you use by setting <a class="el" href="struct_vma_allocator_create_info.html#ae0ffc55139b54520a6bb704b29ffc285" title="Optional. The highest version of Vulkan that the application is designed to use.">VmaAllocatorCreateInfo::vulkanApiVersion</a> and which extensions did you enable by setting <a class="el" href="struct_vma_allocator_create_info.html#a392ea2ecbaff93f91a7c49f735ad4346" title="Flags for created allocator. Use VmaAllocatorCreateFlagBits enum.">VmaAllocatorCreateInfo::flags</a> (like <a class="el" href="vk__mem__alloc_8h.html#a4f87c9100d154a65a4ad495f7763cf7ca5f1b28b0414319d1687e1f2b30ab0089">VMA_ALLOCATOR_CREATE_BUFFER_DEVICE_ADDRESS_BIT</a> for VK_KHR_buffer_device_address). Otherwise, VMA would use only features of Vulkan 1.0 core with no extensions.</p>
+<h1><a class="anchor" id="quick_start_resource_allocation"></a>
 Resource allocation</h1>
 <p>When you want to create a buffer or image:</p>
 <ol type="1">
@@ -115,29 +130,21 @@
 <div class="line">VkBuffer buffer;</div>
 <div class="line"><a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation;</div>
 <div class="line"><a class="code" href="vk__mem__alloc_8h.html#ac72ee55598617e8eecca384e746bab51">vmaCreateBuffer</a>(allocator, &amp;bufferInfo, &amp;allocInfo, &amp;buffer, &amp;allocation, <span class="keyword">nullptr</span>);</div>
+<div class="ttc" id="astruct_vma_allocation_create_info_html"><div class="ttname"><a href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a></div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2879</div></div>
+<div class="ttc" id="astruct_vma_allocation_create_info_html_accb8b06b1f677d858cb9af20705fa910"><div class="ttname"><a href="struct_vma_allocation_create_info.html#accb8b06b1f677d858cb9af20705fa910">VmaAllocationCreateInfo::usage</a></div><div class="ttdeci">VmaMemoryUsage usage</div><div class="ttdoc">Intended usage of memory.</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2887</div></div>
+<div class="ttc" id="astruct_vma_allocation_html"><div class="ttname"><a href="struct_vma_allocation.html">VmaAllocation</a></div><div class="ttdoc">Represents single memory allocation.</div></div>
+<div class="ttc" id="avk__mem__alloc_8h_html_aa5846affa1e9da3800e3e78fae2305ccac6b5dc1432d88647aa4cd456246eadf7"><div class="ttname"><a href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305ccac6b5dc1432d88647aa4cd456246eadf7">VMA_MEMORY_USAGE_GPU_ONLY</a></div><div class="ttdeci">@ VMA_MEMORY_USAGE_GPU_ONLY</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2721</div></div>
+<div class="ttc" id="avk__mem__alloc_8h_html_ac72ee55598617e8eecca384e746bab51"><div class="ttname"><a href="vk__mem__alloc_8h.html#ac72ee55598617e8eecca384e746bab51">vmaCreateBuffer</a></div><div class="ttdeci">VkResult vmaCreateBuffer(VmaAllocator allocator, const VkBufferCreateInfo *pBufferCreateInfo, const VmaAllocationCreateInfo *pAllocationCreateInfo, VkBuffer *pBuffer, VmaAllocation *pAllocation, VmaAllocationInfo *pAllocationInfo)</div></div>
 </div><!-- fragment --><p>Don't forget to destroy your objects when no longer needed:</p>
 <div class="fragment"><div class="line"><a class="code" href="vk__mem__alloc_8h.html#a0d9f4e4ba5bf9aab1f1c746387753d77">vmaDestroyBuffer</a>(allocator, buffer, allocation);</div>
 <div class="line"><a class="code" href="vk__mem__alloc_8h.html#aa8d164061c88f22fb1fd3c8f3534bc1d">vmaDestroyAllocator</a>(allocator);</div>
+<div class="ttc" id="avk__mem__alloc_8h_html_a0d9f4e4ba5bf9aab1f1c746387753d77"><div class="ttname"><a href="vk__mem__alloc_8h.html#a0d9f4e4ba5bf9aab1f1c746387753d77">vmaDestroyBuffer</a></div><div class="ttdeci">void vmaDestroyBuffer(VmaAllocator allocator, VkBuffer buffer, VmaAllocation allocation)</div><div class="ttdoc">Destroys Vulkan buffer and frees allocated memory.</div></div>
+<div class="ttc" id="avk__mem__alloc_8h_html_aa8d164061c88f22fb1fd3c8f3534bc1d"><div class="ttname"><a href="vk__mem__alloc_8h.html#aa8d164061c88f22fb1fd3c8f3534bc1d">vmaDestroyAllocator</a></div><div class="ttdeci">void vmaDestroyAllocator(VmaAllocator allocator)</div><div class="ttdoc">Destroys allocator object.</div></div>
 </div><!-- fragment --> </div></div><!-- contents -->
 </div><!-- PageDoc -->
-<div class="ttc" id="astruct_vma_allocator_create_info_html_a08230f04ae6ccf8a78150a9e829a7156"><div class="ttname"><a href="struct_vma_allocator_create_info.html#a08230f04ae6ccf8a78150a9e829a7156">VmaAllocatorCreateInfo::physicalDevice</a></div><div class="ttdeci">VkPhysicalDevice physicalDevice</div><div class="ttdoc">Vulkan physical device.</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2274</div></div>
-<div class="ttc" id="astruct_vma_allocator_html"><div class="ttname"><a href="struct_vma_allocator.html">VmaAllocator</a></div><div class="ttdoc">Represents main object of this library initialized.</div></div>
-<div class="ttc" id="astruct_vma_allocator_create_info_html"><div class="ttname"><a href="struct_vma_allocator_create_info.html">VmaAllocatorCreateInfo</a></div><div class="ttdoc">Description of a Allocator to be created.</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2269</div></div>
-<div class="ttc" id="astruct_vma_allocation_html"><div class="ttname"><a href="struct_vma_allocation.html">VmaAllocation</a></div><div class="ttdoc">Represents single memory allocation.</div></div>
-<div class="ttc" id="avk__mem__alloc_8h_html_aa5846affa1e9da3800e3e78fae2305ccac6b5dc1432d88647aa4cd456246eadf7"><div class="ttname"><a href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305ccac6b5dc1432d88647aa4cd456246eadf7">VMA_MEMORY_USAGE_GPU_ONLY</a></div><div class="ttdeci">@ VMA_MEMORY_USAGE_GPU_ONLY</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2577</div></div>
-<div class="ttc" id="avk__mem__alloc_8h_html_aa8d164061c88f22fb1fd3c8f3534bc1d"><div class="ttname"><a href="vk__mem__alloc_8h.html#aa8d164061c88f22fb1fd3c8f3534bc1d">vmaDestroyAllocator</a></div><div class="ttdeci">void vmaDestroyAllocator(VmaAllocator allocator)</div><div class="ttdoc">Destroys allocator object.</div></div>
-<div class="ttc" id="astruct_vma_allocator_create_info_html_ad924ddd77b04039c88d0c09b0ffcd500"><div class="ttname"><a href="struct_vma_allocator_create_info.html#ad924ddd77b04039c88d0c09b0ffcd500">VmaAllocatorCreateInfo::device</a></div><div class="ttdeci">VkDevice device</div><div class="ttdoc">Vulkan device.</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2277</div></div>
-<div class="ttc" id="astruct_vma_allocation_create_info_html_accb8b06b1f677d858cb9af20705fa910"><div class="ttname"><a href="struct_vma_allocation_create_info.html#accb8b06b1f677d858cb9af20705fa910">VmaAllocationCreateInfo::usage</a></div><div class="ttdeci">VmaMemoryUsage usage</div><div class="ttdoc">Intended usage of memory.</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2743</div></div>
-<div class="ttc" id="avk__mem__alloc_8h_html_ac72ee55598617e8eecca384e746bab51"><div class="ttname"><a href="vk__mem__alloc_8h.html#ac72ee55598617e8eecca384e746bab51">vmaCreateBuffer</a></div><div class="ttdeci">VkResult vmaCreateBuffer(VmaAllocator allocator, const VkBufferCreateInfo *pBufferCreateInfo, const VmaAllocationCreateInfo *pAllocationCreateInfo, VkBuffer *pBuffer, VmaAllocation *pAllocation, VmaAllocationInfo *pAllocationInfo)</div></div>
-<div class="ttc" id="avk__mem__alloc_8h_html_a200692051ddb34240248234f5f4c17bb"><div class="ttname"><a href="vk__mem__alloc_8h.html#a200692051ddb34240248234f5f4c17bb">vmaCreateAllocator</a></div><div class="ttdeci">VkResult vmaCreateAllocator(const VmaAllocatorCreateInfo *pCreateInfo, VmaAllocator *pAllocator)</div><div class="ttdoc">Creates Allocator object.</div></div>
-<div class="ttc" id="astruct_vma_allocator_create_info_html_a70dd42e29b1df1d1b9b61532ae0b370b"><div class="ttname"><a href="struct_vma_allocator_create_info.html#a70dd42e29b1df1d1b9b61532ae0b370b">VmaAllocatorCreateInfo::instance</a></div><div class="ttdeci">VkInstance instance</div><div class="ttdoc">Handle to Vulkan instance object.</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2343</div></div>
-<div class="ttc" id="avk__mem__alloc_8h_html_a0d9f4e4ba5bf9aab1f1c746387753d77"><div class="ttname"><a href="vk__mem__alloc_8h.html#a0d9f4e4ba5bf9aab1f1c746387753d77">vmaDestroyBuffer</a></div><div class="ttdeci">void vmaDestroyBuffer(VmaAllocator allocator, VkBuffer buffer, VmaAllocation allocation)</div><div class="ttdoc">Destroys Vulkan buffer and frees allocated memory.</div></div>
-<div class="ttc" id="astruct_vma_allocation_create_info_html"><div class="ttname"><a href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a></div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2735</div></div>
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated by &#160;<a href="http://www.doxygen.org/index.html">
-<img class="footer" src="doxygen.png" alt="doxygen"/>
-</a> 1.8.18
+Generated by&#160;<a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.1
 </small></address>
 </body>
 </html>
diff --git a/third_party/vulkan_memory_allocator/docs/html/record_and_replay.html b/third_party/vulkan_memory_allocator/docs/html/record_and_replay.html
index 5b49757..972cb67 100644
--- a/third_party/vulkan_memory_allocator/docs/html/record_and_replay.html
+++ b/third_party/vulkan_memory_allocator/docs/html/record_and_replay.html
@@ -3,7 +3,7 @@
 <head>
 <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
 <meta http-equiv="X-UA-Compatible" content="IE=9"/>
-<meta name="generator" content="Doxygen 1.8.18"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
 <meta name="viewport" content="width=device-width, initial-scale=1"/>
 <title>Vulkan Memory Allocator: Record and replay</title>
 <link href="tabs.css" rel="stylesheet" type="text/css"/>
@@ -29,10 +29,10 @@
 </table>
 </div>
 <!-- end header part -->
-<!-- Generated by Doxygen 1.8.18 -->
+<!-- Generated by Doxygen 1.9.1 -->
 <script type="text/javascript">
 /* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
-var searchBox = new SearchBox("searchBox", "search",false,'Search');
+var searchBox = new SearchBox("searchBox", "search",false,'Search','.html');
 /* @license-end */
 </script>
 <script type="text/javascript" src="menudata.js"></script>
@@ -83,7 +83,7 @@
 <div class="fragment"><div class="line"><span class="preprocessor">#define VMA_RECORDING_ENABLED 1</span></div>
 </div><!-- fragment --><p><b>To record sequence of calls to a file:</b> Fill in <a class="el" href="struct_vma_allocator_create_info.html#ace2aa4877b16a42b0b7673d4e26000ee" title="Parameters for recording of VMA calls. Can be null.">VmaAllocatorCreateInfo::pRecordSettings</a> member while creating <a class="el" href="struct_vma_allocator.html" title="Represents main object of this library initialized.">VmaAllocator</a> object. File is opened and written during whole lifetime of the allocator.</p>
 <p><b>To replay file:</b> Use VmaReplay - standalone command-line program. Precompiled binary can be found in "bin" directory. Its source can be found in "src/VmaReplay" directory. Its project is generated by Premake. Command line syntax is printed when the program is launched without parameters. Basic usage: </p><pre class="fragment">VmaReplay.exe MyRecording.csv
-</pre><p><b>Documentation of file format</b> can be found in file: "docs/Recording file format.md". It's a human-readable, text file in CSV format (Comma Separated Values).</p>
+</pre><p> <b>Documentation of file format</b> can be found in file: "docs/Recording file format.md". It's a human-readable, text file in CSV format (Comma Separated Values).</p>
 <h1><a class="anchor" id="record_and_replay_additional_considerations"></a>
 Additional considerations</h1>
 <ul>
@@ -94,9 +94,7 @@
 </div><!-- PageDoc -->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated by &#160;<a href="http://www.doxygen.org/index.html">
-<img class="footer" src="doxygen.png" alt="doxygen"/>
-</a> 1.8.18
+Generated by&#160;<a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.1
 </small></address>
 </body>
 </html>
diff --git a/third_party/vulkan_memory_allocator/docs/html/resource_aliasing.html b/third_party/vulkan_memory_allocator/docs/html/resource_aliasing.html
new file mode 100644
index 0000000..ff6b467
--- /dev/null
+++ b/third_party/vulkan_memory_allocator/docs/html/resource_aliasing.html
@@ -0,0 +1,161 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>Vulkan Memory Allocator: Resource aliasing (overlap)</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">Vulkan Memory Allocator
+   </div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.9.1 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+var searchBox = new SearchBox("searchBox", "search",false,'Search','.html');
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+/* @license-end */</script>
+<div id="main-nav"></div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+     onmouseover="return searchBox.OnSearchSelectShow()"
+     onmouseout="return searchBox.OnSearchSelectHide()"
+     onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div id="nav-path" class="navpath">
+  <ul>
+<li class="navelem"><a class="el" href="index.html">Vulkan Memory Allocator</a></li>  </ul>
+</div>
+</div><!-- top -->
+<div class="PageDoc"><div class="header">
+  <div class="headertitle">
+<div class="title">Resource aliasing (overlap) </div>  </div>
+</div><!--header-->
+<div class="contents">
+<div class="textblock"><p>New explicit graphics APIs (Vulkan and Direct3D 12), thanks to manual memory management, give an opportunity to alias (overlap) multiple resources in the same region of memory - a feature not available in the old APIs (Direct3D 11, OpenGL). It can be useful to save video memory, but it must be used with caution.</p>
+<p>For example, if you know the flow of your whole render frame in advance, you are going to use some intermediate textures or buffers only during a small range of render passes, and you know these ranges don't overlap in time, you can bind these resources to the same place in memory, even if they have completely different parameters (width, height, format etc.).</p>
+<p><img src="../gfx/Aliasing.png" alt="Resource aliasing (overlap)" class="inline"/></p>
+<p>Such scenario is possible using VMA, but you need to create your images manually. Then you need to calculate parameters of an allocation to be made using formula:</p>
+<ul>
+<li>allocation size = max(size of each image)</li>
+<li>allocation alignment = max(alignment of each image)</li>
+<li>allocation memoryTypeBits = bitwise AND(memoryTypeBits of each image)</li>
+</ul>
+<p>Following example shows two different images bound to the same place in memory, allocated to fit largest of them.</p>
+<div class="fragment"><div class="line"><span class="comment">// A 512x512 texture to be sampled.</span></div>
+<div class="line">VkImageCreateInfo img1CreateInfo = { VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO };</div>
+<div class="line">img1CreateInfo.imageType = VK_IMAGE_TYPE_2D;</div>
+<div class="line">img1CreateInfo.extent.width = 512;</div>
+<div class="line">img1CreateInfo.extent.height = 512;</div>
+<div class="line">img1CreateInfo.extent.depth = 1;</div>
+<div class="line">img1CreateInfo.mipLevels = 10;</div>
+<div class="line">img1CreateInfo.arrayLayers = 1;</div>
+<div class="line">img1CreateInfo.format = VK_FORMAT_R8G8B8A8_SRGB;</div>
+<div class="line">img1CreateInfo.tiling = VK_IMAGE_TILING_OPTIMAL;</div>
+<div class="line">img1CreateInfo.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;</div>
+<div class="line">img1CreateInfo.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_SAMPLED_BIT;</div>
+<div class="line">img1CreateInfo.samples = VK_SAMPLE_COUNT_1_BIT;</div>
+<div class="line"> </div>
+<div class="line"><span class="comment">// A full screen texture to be used as color attachment.</span></div>
+<div class="line">VkImageCreateInfo img2CreateInfo = { VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO };</div>
+<div class="line">img2CreateInfo.imageType = VK_IMAGE_TYPE_2D;</div>
+<div class="line">img2CreateInfo.extent.width = 1920;</div>
+<div class="line">img2CreateInfo.extent.height = 1080;</div>
+<div class="line">img2CreateInfo.extent.depth = 1;</div>
+<div class="line">img2CreateInfo.mipLevels = 1;</div>
+<div class="line">img2CreateInfo.arrayLayers = 1;</div>
+<div class="line">img2CreateInfo.format = VK_FORMAT_R8G8B8A8_UNORM;</div>
+<div class="line">img2CreateInfo.tiling = VK_IMAGE_TILING_OPTIMAL;</div>
+<div class="line">img2CreateInfo.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;</div>
+<div class="line">img2CreateInfo.usage = VK_IMAGE_USAGE_SAMPLED_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;</div>
+<div class="line">img2CreateInfo.samples = VK_SAMPLE_COUNT_1_BIT;</div>
+<div class="line"> </div>
+<div class="line">VkImage img1;</div>
+<div class="line">res = vkCreateImage(device, &amp;img1CreateInfo, <span class="keyword">nullptr</span>, &amp;img1);</div>
+<div class="line">VkImage img2;</div>
+<div class="line">res = vkCreateImage(device, &amp;img2CreateInfo, <span class="keyword">nullptr</span>, &amp;img2);</div>
+<div class="line"> </div>
+<div class="line">VkMemoryRequirements img1MemReq;</div>
+<div class="line">vkGetImageMemoryRequirements(device, img1, &amp;img1MemReq);</div>
+<div class="line">VkMemoryRequirements img2MemReq;</div>
+<div class="line">vkGetImageMemoryRequirements(device, img2, &amp;img2MemReq);</div>
+<div class="line"> </div>
+<div class="line">VkMemoryRequirements finalMemReq = {};</div>
+<div class="line">finalMemReq.size = std::max(img1MemReq.size, img2MemReq.size);</div>
+<div class="line">finalMemReq.alignment = std::max(img1MemReq.alignment, img2MemReq.alignment);</div>
+<div class="line">finalMemReq.memoryTypeBits = img1MemReq.memoryTypeBits &amp; img2MemReq.memoryTypeBits;</div>
+<div class="line"><span class="comment">// Validate if(finalMemReq.memoryTypeBits != 0)</span></div>
+<div class="line"> </div>
+<div class="line"><a class="code" href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a> allocCreateInfo = {};</div>
+<div class="line">allocCreateInfo.<a class="code" href="struct_vma_allocation_create_info.html#accb8b06b1f677d858cb9af20705fa910">usage</a> = <a class="code" href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305ccac6b5dc1432d88647aa4cd456246eadf7">VMA_MEMORY_USAGE_GPU_ONLY</a>;</div>
+<div class="line"> </div>
+<div class="line"><a class="code" href="struct_vma_allocation.html">VmaAllocation</a> alloc;</div>
+<div class="line">res = <a class="code" href="vk__mem__alloc_8h.html#abf28077dbf82d0908b8acbe8ee8dd9b8">vmaAllocateMemory</a>(allocator, &amp;finalMemReq, &amp;allocCreateInfo, &amp;alloc, <span class="keyword">nullptr</span>);</div>
+<div class="line"> </div>
+<div class="line">res = <a class="code" href="vk__mem__alloc_8h.html#a3d3ca45799923aa5d138e9e5f9eb2da5">vmaBindImageMemory</a>(allocator, alloc, img1);</div>
+<div class="line">res = <a class="code" href="vk__mem__alloc_8h.html#a3d3ca45799923aa5d138e9e5f9eb2da5">vmaBindImageMemory</a>(allocator, alloc, img2);</div>
+<div class="line"> </div>
+<div class="line"><span class="comment">// You can use img1, img2 here, but not at the same time!</span></div>
+<div class="line"> </div>
+<div class="line"><a class="code" href="vk__mem__alloc_8h.html#a5fea5518972ae9094b1526cbcb19b05f">vmaFreeMemory</a>(allocator, alloc);</div>
+<div class="line">vkDestroyImage(allocator, img2, <span class="keyword">nullptr</span>);</div>
+<div class="line">vkDestroyImage(allocator, img1, <span class="keyword">nullptr</span>);</div>
+<div class="ttc" id="astruct_vma_allocation_create_info_html"><div class="ttname"><a href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a></div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2879</div></div>
+<div class="ttc" id="astruct_vma_allocation_create_info_html_accb8b06b1f677d858cb9af20705fa910"><div class="ttname"><a href="struct_vma_allocation_create_info.html#accb8b06b1f677d858cb9af20705fa910">VmaAllocationCreateInfo::usage</a></div><div class="ttdeci">VmaMemoryUsage usage</div><div class="ttdoc">Intended usage of memory.</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2887</div></div>
+<div class="ttc" id="astruct_vma_allocation_html"><div class="ttname"><a href="struct_vma_allocation.html">VmaAllocation</a></div><div class="ttdoc">Represents single memory allocation.</div></div>
+<div class="ttc" id="avk__mem__alloc_8h_html_a3d3ca45799923aa5d138e9e5f9eb2da5"><div class="ttname"><a href="vk__mem__alloc_8h.html#a3d3ca45799923aa5d138e9e5f9eb2da5">vmaBindImageMemory</a></div><div class="ttdeci">VkResult vmaBindImageMemory(VmaAllocator allocator, VmaAllocation allocation, VkImage image)</div><div class="ttdoc">Binds image to allocation.</div></div>
+<div class="ttc" id="avk__mem__alloc_8h_html_a5fea5518972ae9094b1526cbcb19b05f"><div class="ttname"><a href="vk__mem__alloc_8h.html#a5fea5518972ae9094b1526cbcb19b05f">vmaFreeMemory</a></div><div class="ttdeci">void vmaFreeMemory(VmaAllocator allocator, const VmaAllocation allocation)</div><div class="ttdoc">Frees memory previously allocated using vmaAllocateMemory(), vmaAllocateMemoryForBuffer(),...</div></div>
+<div class="ttc" id="avk__mem__alloc_8h_html_aa5846affa1e9da3800e3e78fae2305ccac6b5dc1432d88647aa4cd456246eadf7"><div class="ttname"><a href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305ccac6b5dc1432d88647aa4cd456246eadf7">VMA_MEMORY_USAGE_GPU_ONLY</a></div><div class="ttdeci">@ VMA_MEMORY_USAGE_GPU_ONLY</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2721</div></div>
+<div class="ttc" id="avk__mem__alloc_8h_html_abf28077dbf82d0908b8acbe8ee8dd9b8"><div class="ttname"><a href="vk__mem__alloc_8h.html#abf28077dbf82d0908b8acbe8ee8dd9b8">vmaAllocateMemory</a></div><div class="ttdeci">VkResult vmaAllocateMemory(VmaAllocator allocator, const VkMemoryRequirements *pVkMemoryRequirements, const VmaAllocationCreateInfo *pCreateInfo, VmaAllocation *pAllocation, VmaAllocationInfo *pAllocationInfo)</div><div class="ttdoc">General purpose memory allocation.</div></div>
+</div><!-- fragment --><p>Remember that using resources that alias in memory requires proper synchronization. You need to issue a memory barrier to make sure commands that use <code>img1</code> and <code>img2</code> don't overlap on GPU timeline. You also need to treat a resource after aliasing as uninitialized - containing garbage data. For example, if you use <code>img1</code> and then want to use <code>img2</code>, you need to issue an image memory barrier for <code>img2</code> with <code>oldLayout</code> = <code>VK_IMAGE_LAYOUT_UNDEFINED</code>.</p>
+<p>Additional considerations:</p>
+<ul>
+<li>Vulkan also allows to interpret contents of memory between aliasing resources consistently in some cases. See chapter 11.8. "Memory Aliasing" of Vulkan specification or <code>VK_IMAGE_CREATE_ALIAS_BIT</code> flag.</li>
+<li>You can create more complex layout where different images and buffers are bound at different offsets inside one large allocation. For example, one can imagine a big texture used in some render passes, aliasing with a set of many small buffers used between in some further passes. To bind a resource at non-zero offset of an allocation, use <a class="el" href="vk__mem__alloc_8h.html#a927c944f45e0f2941182abb6f608e64a" title="Binds buffer to allocation with additional parameters.">vmaBindBufferMemory2()</a> / <a class="el" href="vk__mem__alloc_8h.html#aa8251ee81b0045a443e35b8e8aa021bc" title="Binds image to allocation with additional parameters.">vmaBindImageMemory2()</a>.</li>
+<li>Before allocating memory for the resources you want to alias, check <code>memoryTypeBits</code> returned in memory requirements of each resource to make sure the bits overlap. Some GPUs may expose multiple memory types suitable e.g. only for buffers or images with <code>COLOR_ATTACHMENT</code> usage, so the sets of memory types supported by your resources may be disjoint. Aliasing them is not possible in that case. </li>
+</ul>
+</div></div><!-- contents -->
+</div><!-- PageDoc -->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by&#160;<a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.1
+</small></address>
+</body>
+</html>
diff --git a/third_party/vulkan_memory_allocator/docs/html/search/all_0.html b/third_party/vulkan_memory_allocator/docs/html/search/all_0.html
index ea50fff..1ec5b2d 100644
--- a/third_party/vulkan_memory_allocator/docs/html/search/all_0.html
+++ b/third_party/vulkan_memory_allocator/docs/html/search/all_0.html
@@ -1,7 +1,8 @@
 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html><head><title></title>
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head><title></title>
 <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
-<meta name="generator" content="Doxygen 1.8.18"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
 <link rel="stylesheet" type="text/css" href="search.css"/>
 <script type="text/javascript" src="all_0.js"></script>
 <script type="text/javascript" src="search.js"></script>
@@ -10,14 +11,14 @@
 <div id="SRIndex">
 <div class="SRStatus" id="Loading">Loading...</div>
 <div id="SRResults"></div>
-<script type="text/javascript"><!--
+<script type="text/javascript">
 /* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
 createResults();
 /* @license-end */
---></script>
+</script>
 <div class="SRStatus" id="Searching">Searching...</div>
 <div class="SRStatus" id="NoMatches">No Matches</div>
-<script type="text/javascript"><!--
+<script type="text/javascript">
 /* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
 document.getElementById("Loading").style.display="none";
 document.getElementById("NoMatches").style.display="none";
@@ -30,7 +31,7 @@
   }
 });
 /* @license-end */
---></script>
+</script>
 </div>
 </body>
 </html>
diff --git a/third_party/vulkan_memory_allocator/docs/html/search/all_1.html b/third_party/vulkan_memory_allocator/docs/html/search/all_1.html
index 86b0682..9f80e90 100644
--- a/third_party/vulkan_memory_allocator/docs/html/search/all_1.html
+++ b/third_party/vulkan_memory_allocator/docs/html/search/all_1.html
@@ -1,7 +1,8 @@
 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html><head><title></title>
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head><title></title>
 <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
-<meta name="generator" content="Doxygen 1.8.18"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
 <link rel="stylesheet" type="text/css" href="search.css"/>
 <script type="text/javascript" src="all_1.js"></script>
 <script type="text/javascript" src="search.js"></script>
@@ -10,14 +11,14 @@
 <div id="SRIndex">
 <div class="SRStatus" id="Loading">Loading...</div>
 <div id="SRResults"></div>
-<script type="text/javascript"><!--
+<script type="text/javascript">
 /* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
 createResults();
 /* @license-end */
---></script>
+</script>
 <div class="SRStatus" id="Searching">Searching...</div>
 <div class="SRStatus" id="NoMatches">No Matches</div>
-<script type="text/javascript"><!--
+<script type="text/javascript">
 /* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
 document.getElementById("Loading").style.display="none";
 document.getElementById("NoMatches").style.display="none";
@@ -30,7 +31,7 @@
   }
 });
 /* @license-end */
---></script>
+</script>
 </div>
 </body>
 </html>
diff --git a/third_party/vulkan_memory_allocator/docs/html/search/all_10.html b/third_party/vulkan_memory_allocator/docs/html/search/all_10.html
index b910674..3bf1196 100644
--- a/third_party/vulkan_memory_allocator/docs/html/search/all_10.html
+++ b/third_party/vulkan_memory_allocator/docs/html/search/all_10.html
@@ -1,7 +1,8 @@
 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html><head><title></title>
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head><title></title>
 <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
-<meta name="generator" content="Doxygen 1.8.18"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
 <link rel="stylesheet" type="text/css" href="search.css"/>
 <script type="text/javascript" src="all_10.js"></script>
 <script type="text/javascript" src="search.js"></script>
@@ -10,14 +11,14 @@
 <div id="SRIndex">
 <div class="SRStatus" id="Loading">Loading...</div>
 <div id="SRResults"></div>
-<script type="text/javascript"><!--
+<script type="text/javascript">
 /* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
 createResults();
 /* @license-end */
---></script>
+</script>
 <div class="SRStatus" id="Searching">Searching...</div>
 <div class="SRStatus" id="NoMatches">No Matches</div>
-<script type="text/javascript"><!--
+<script type="text/javascript">
 /* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
 document.getElementById("Loading").style.display="none";
 document.getElementById("NoMatches").style.display="none";
@@ -30,7 +31,7 @@
   }
 });
 /* @license-end */
---></script>
+</script>
 </div>
 </body>
 </html>
diff --git a/third_party/vulkan_memory_allocator/docs/html/search/all_10.js b/third_party/vulkan_memory_allocator/docs/html/search/all_10.js
index 628d913..730aac6 100644
--- a/third_party/vulkan_memory_allocator/docs/html/search/all_10.js
+++ b/third_party/vulkan_memory_allocator/docs/html/search/all_10.js
@@ -1,4 +1,11 @@
 var searchData=
 [
-  ['total_75',['total',['../struct_vma_stats.html#a2e8f5b3353f2fefef3c27f29e245a1f9',1,'VmaStats']]]
+  ['unusedbytes_77',['unusedBytes',['../struct_vma_stat_info.html#a1859d290aca2cd582d8dc25922092669',1,'VmaStatInfo']]],
+  ['unusedrangecount_78',['unusedRangeCount',['../struct_vma_stat_info.html#ae06129c771bfebfd6468a7f4276502a9',1,'VmaStatInfo::unusedRangeCount()'],['../struct_vma_pool_stats.html#ae4f3546ffa4d1e598b64d8e6134854f4',1,'VmaPoolStats::unusedRangeCount()']]],
+  ['unusedrangesizeavg_79',['unusedRangeSizeAvg',['../struct_vma_stat_info.html#a2f9b3452af90c9768a30b7fb6ae194fc',1,'VmaStatInfo']]],
+  ['unusedrangesizemax_80',['unusedRangeSizeMax',['../struct_vma_stat_info.html#a5ba1a2476c4d39b10f7e2f7ebbb72ac4',1,'VmaStatInfo::unusedRangeSizeMax()'],['../struct_vma_pool_stats.html#ab4c8f52dd42ab01998f60f0b6acc722b',1,'VmaPoolStats::unusedRangeSizeMax()']]],
+  ['unusedrangesizemin_81',['unusedRangeSizeMin',['../struct_vma_stat_info.html#aedeba931324f16589cd2416c0d2dd0d4',1,'VmaStatInfo']]],
+  ['unusedsize_82',['unusedSize',['../struct_vma_pool_stats.html#ad7c54874724fce7b06aba526202d82a8',1,'VmaPoolStats']]],
+  ['usage_83',['usage',['../struct_vma_budget.html#a84dd1ecca8b0110259eb206dbadb11f6',1,'VmaBudget::usage()'],['../struct_vma_allocation_create_info.html#accb8b06b1f677d858cb9af20705fa910',1,'VmaAllocationCreateInfo::usage()']]],
+  ['usedbytes_84',['usedBytes',['../struct_vma_stat_info.html#ab0c6c73837e5a70c749fbd4f6064895a',1,'VmaStatInfo']]]
 ];
diff --git a/third_party/vulkan_memory_allocator/docs/html/search/all_11.html b/third_party/vulkan_memory_allocator/docs/html/search/all_11.html
index 459c977..c9f79d2 100644
--- a/third_party/vulkan_memory_allocator/docs/html/search/all_11.html
+++ b/third_party/vulkan_memory_allocator/docs/html/search/all_11.html
@@ -1,7 +1,8 @@
 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html><head><title></title>
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head><title></title>
 <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
-<meta name="generator" content="Doxygen 1.8.18"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
 <link rel="stylesheet" type="text/css" href="search.css"/>
 <script type="text/javascript" src="all_11.js"></script>
 <script type="text/javascript" src="search.js"></script>
@@ -10,14 +11,14 @@
 <div id="SRIndex">
 <div class="SRStatus" id="Loading">Loading...</div>
 <div id="SRResults"></div>
-<script type="text/javascript"><!--
+<script type="text/javascript">
 /* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
 createResults();
 /* @license-end */
---></script>
+</script>
 <div class="SRStatus" id="Searching">Searching...</div>
 <div class="SRStatus" id="NoMatches">No Matches</div>
-<script type="text/javascript"><!--
+<script type="text/javascript">
 /* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
 document.getElementById("Loading").style.display="none";
 document.getElementById("NoMatches").style.display="none";
@@ -30,7 +31,7 @@
   }
 });
 /* @license-end */
---></script>
+</script>
 </div>
 </body>
 </html>
diff --git a/third_party/vulkan_memory_allocator/docs/html/search/all_11.js b/third_party/vulkan_memory_allocator/docs/html/search/all_11.js
index c96bee2..75a2986 100644
--- a/third_party/vulkan_memory_allocator/docs/html/search/all_11.js
+++ b/third_party/vulkan_memory_allocator/docs/html/search/all_11.js
@@ -1,11 +1,158 @@
 var searchData=
 [
-  ['unusedbytes_76',['unusedBytes',['../struct_vma_stat_info.html#a1859d290aca2cd582d8dc25922092669',1,'VmaStatInfo']]],
-  ['unusedrangecount_77',['unusedRangeCount',['../struct_vma_stat_info.html#ae06129c771bfebfd6468a7f4276502a9',1,'VmaStatInfo::unusedRangeCount()'],['../struct_vma_pool_stats.html#ae4f3546ffa4d1e598b64d8e6134854f4',1,'VmaPoolStats::unusedRangeCount()']]],
-  ['unusedrangesizeavg_78',['unusedRangeSizeAvg',['../struct_vma_stat_info.html#a2f9b3452af90c9768a30b7fb6ae194fc',1,'VmaStatInfo']]],
-  ['unusedrangesizemax_79',['unusedRangeSizeMax',['../struct_vma_stat_info.html#a5ba1a2476c4d39b10f7e2f7ebbb72ac4',1,'VmaStatInfo::unusedRangeSizeMax()'],['../struct_vma_pool_stats.html#ab4c8f52dd42ab01998f60f0b6acc722b',1,'VmaPoolStats::unusedRangeSizeMax()']]],
-  ['unusedrangesizemin_80',['unusedRangeSizeMin',['../struct_vma_stat_info.html#aedeba931324f16589cd2416c0d2dd0d4',1,'VmaStatInfo']]],
-  ['unusedsize_81',['unusedSize',['../struct_vma_pool_stats.html#ad7c54874724fce7b06aba526202d82a8',1,'VmaPoolStats']]],
-  ['usage_82',['usage',['../struct_vma_budget.html#a84dd1ecca8b0110259eb206dbadb11f6',1,'VmaBudget::usage()'],['../struct_vma_allocation_create_info.html#accb8b06b1f677d858cb9af20705fa910',1,'VmaAllocationCreateInfo::usage()']]],
-  ['usedbytes_83',['usedBytes',['../struct_vma_stat_info.html#ab0c6c73837e5a70c749fbd4f6064895a',1,'VmaStatInfo']]]
+  ['vk_5famd_5fdevice_5fcoherent_5fmemory_85',['VK_AMD_device_coherent_memory',['../vk_amd_device_coherent_memory.html',1,'index']]],
+  ['vk_5fkhr_5fdedicated_5fallocation_86',['VK_KHR_dedicated_allocation',['../vk_khr_dedicated_allocation.html',1,'index']]],
+  ['vk_5fmem_5falloc_2eh_87',['vk_mem_alloc.h',['../vk__mem__alloc_8h.html',1,'']]],
+  ['vkallocatememory_88',['vkAllocateMemory',['../struct_vma_vulkan_functions.html#a2943bf99dfd784a0e8f599d987e22e6c',1,'VmaVulkanFunctions']]],
+  ['vkbindbuffermemory_89',['vkBindBufferMemory',['../struct_vma_vulkan_functions.html#a94fc4f3a605d9880bb3c0ba2c2fc80b2',1,'VmaVulkanFunctions']]],
+  ['vkbindimagememory_90',['vkBindImageMemory',['../struct_vma_vulkan_functions.html#a1338d96a128a5ade648b8d934907c637',1,'VmaVulkanFunctions']]],
+  ['vkcmdcopybuffer_91',['vkCmdCopyBuffer',['../struct_vma_vulkan_functions.html#ae5c0db8c89a3b82593dc16aa6a49fa3a',1,'VmaVulkanFunctions']]],
+  ['vkcreatebuffer_92',['vkCreateBuffer',['../struct_vma_vulkan_functions.html#ae8084315a25006271a2edfc3a447519f',1,'VmaVulkanFunctions']]],
+  ['vkcreateimage_93',['vkCreateImage',['../struct_vma_vulkan_functions.html#a23ebe70be515b9b5010a1d691200e325',1,'VmaVulkanFunctions']]],
+  ['vkdestroybuffer_94',['vkDestroyBuffer',['../struct_vma_vulkan_functions.html#a7e054606faddb07f0e8556f3ed317d45',1,'VmaVulkanFunctions']]],
+  ['vkdestroyimage_95',['vkDestroyImage',['../struct_vma_vulkan_functions.html#a90b898227039b1dcb3520f6e91f09ffa',1,'VmaVulkanFunctions']]],
+  ['vkflushmappedmemoryranges_96',['vkFlushMappedMemoryRanges',['../struct_vma_vulkan_functions.html#a33c322f4c4ad2810f8a9c97a277572f9',1,'VmaVulkanFunctions']]],
+  ['vkfreememory_97',['vkFreeMemory',['../struct_vma_vulkan_functions.html#a4c658701778564d62034255b5dda91b4',1,'VmaVulkanFunctions']]],
+  ['vkgetbuffermemoryrequirements_98',['vkGetBufferMemoryRequirements',['../struct_vma_vulkan_functions.html#a5b92901df89a4194b0d12f6071d4d143',1,'VmaVulkanFunctions']]],
+  ['vkgetimagememoryrequirements_99',['vkGetImageMemoryRequirements',['../struct_vma_vulkan_functions.html#a475f6f49f8debe4d10800592606d53f4',1,'VmaVulkanFunctions']]],
+  ['vkgetphysicaldevicememoryproperties_100',['vkGetPhysicalDeviceMemoryProperties',['../struct_vma_vulkan_functions.html#a60d25c33bba06bb8592e6875cbaa9830',1,'VmaVulkanFunctions']]],
+  ['vkgetphysicaldeviceproperties_101',['vkGetPhysicalDeviceProperties',['../struct_vma_vulkan_functions.html#a77b7a74082823e865dd6546623468f96',1,'VmaVulkanFunctions']]],
+  ['vkinvalidatemappedmemoryranges_102',['vkInvalidateMappedMemoryRanges',['../struct_vma_vulkan_functions.html#a5c1093bc32386a8060c37c9f282078a1',1,'VmaVulkanFunctions']]],
+  ['vkmapmemory_103',['vkMapMemory',['../struct_vma_vulkan_functions.html#ab5c1f38dea3a2cf00dc9eb4f57218c49',1,'VmaVulkanFunctions']]],
+  ['vkunmapmemory_104',['vkUnmapMemory',['../struct_vma_vulkan_functions.html#acc798589736f0becb317fc2196c1d8b9',1,'VmaVulkanFunctions']]],
+  ['vma_5fallocation_5fcreate_5fcan_5fbecome_5flost_5fbit_105',['VMA_ALLOCATION_CREATE_CAN_BECOME_LOST_BIT',['../vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a5f436af6c8fe8540573a6d22627a6fd2',1,'vk_mem_alloc.h']]],
+  ['vma_5fallocation_5fcreate_5fcan_5fmake_5fother_5flost_5fbit_106',['VMA_ALLOCATION_CREATE_CAN_MAKE_OTHER_LOST_BIT',['../vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a68686d0ce9beb0d4d1b9f2b8b1389a7e',1,'vk_mem_alloc.h']]],
+  ['vma_5fallocation_5fcreate_5fdedicated_5fmemory_5fbit_107',['VMA_ALLOCATION_CREATE_DEDICATED_MEMORY_BIT',['../vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a3fc311d855c2ff53f1090ef5c722b38f',1,'vk_mem_alloc.h']]],
+  ['vma_5fallocation_5fcreate_5fdont_5fbind_5fbit_108',['VMA_ALLOCATION_CREATE_DONT_BIND_BIT',['../vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a2310568c62208af432724305fe29ccea',1,'vk_mem_alloc.h']]],
+  ['vma_5fallocation_5fcreate_5fflag_5fbits_5fmax_5fenum_109',['VMA_ALLOCATION_CREATE_FLAG_BITS_MAX_ENUM',['../vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597ae5633ec569f4899cf8f29e7385b2f882',1,'vk_mem_alloc.h']]],
+  ['vma_5fallocation_5fcreate_5fmapped_5fbit_110',['VMA_ALLOCATION_CREATE_MAPPED_BIT',['../vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a11da372cc3a82931c5e5d6146cd9dd1f',1,'vk_mem_alloc.h']]],
+  ['vma_5fallocation_5fcreate_5fnever_5fallocate_5fbit_111',['VMA_ALLOCATION_CREATE_NEVER_ALLOCATE_BIT',['../vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a89759603401014eb325eb22a3839f2ff',1,'vk_mem_alloc.h']]],
+  ['vma_5fallocation_5fcreate_5fstrategy_5fbest_5ffit_5fbit_112',['VMA_ALLOCATION_CREATE_STRATEGY_BEST_FIT_BIT',['../vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a839826775c62319466441f86496f036d',1,'vk_mem_alloc.h']]],
+  ['vma_5fallocation_5fcreate_5fstrategy_5ffirst_5ffit_5fbit_113',['VMA_ALLOCATION_CREATE_STRATEGY_FIRST_FIT_BIT',['../vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a33eb2052674f3ad92386c714a65fb777',1,'vk_mem_alloc.h']]],
+  ['vma_5fallocation_5fcreate_5fstrategy_5fmask_114',['VMA_ALLOCATION_CREATE_STRATEGY_MASK',['../vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a8e16845d81ae3d27c47106d4770d5c7e',1,'vk_mem_alloc.h']]],
+  ['vma_5fallocation_5fcreate_5fstrategy_5fmin_5ffragmentation_5fbit_115',['VMA_ALLOCATION_CREATE_STRATEGY_MIN_FRAGMENTATION_BIT',['../vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a621b704103eb3360230c860acf36e706',1,'vk_mem_alloc.h']]],
+  ['vma_5fallocation_5fcreate_5fstrategy_5fmin_5fmemory_5fbit_116',['VMA_ALLOCATION_CREATE_STRATEGY_MIN_MEMORY_BIT',['../vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a8af1210cf591784afa026d94998f735d',1,'vk_mem_alloc.h']]],
+  ['vma_5fallocation_5fcreate_5fstrategy_5fmin_5ftime_5fbit_117',['VMA_ALLOCATION_CREATE_STRATEGY_MIN_TIME_BIT',['../vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a0729e932b7ea170e3a128cad96c5cf6d',1,'vk_mem_alloc.h']]],
+  ['vma_5fallocation_5fcreate_5fstrategy_5fworst_5ffit_5fbit_118',['VMA_ALLOCATION_CREATE_STRATEGY_WORST_FIT_BIT',['../vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597ad242a04f802e25fef0b880afe8bb0a62',1,'vk_mem_alloc.h']]],
+  ['vma_5fallocation_5fcreate_5fupper_5faddress_5fbit_119',['VMA_ALLOCATION_CREATE_UPPER_ADDRESS_BIT',['../vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a42ba3a2d2c7117953210b7c3ef8da0df',1,'vk_mem_alloc.h']]],
+  ['vma_5fallocation_5fcreate_5fuser_5fdata_5fcopy_5fstring_5fbit_120',['VMA_ALLOCATION_CREATE_USER_DATA_COPY_STRING_BIT',['../vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597aa6f24f821cd6a7c5e4a443f7bf59c520',1,'vk_mem_alloc.h']]],
+  ['vma_5fallocation_5fcreate_5fwithin_5fbudget_5fbit_121',['VMA_ALLOCATION_CREATE_WITHIN_BUDGET_BIT',['../vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597ab8b1764f3e9022368e440c057783b92d',1,'vk_mem_alloc.h']]],
+  ['vma_5fallocator_5fcreate_5famd_5fdevice_5fcoherent_5fmemory_5fbit_122',['VMA_ALLOCATOR_CREATE_AMD_DEVICE_COHERENT_MEMORY_BIT',['../vk__mem__alloc_8h.html#a4f87c9100d154a65a4ad495f7763cf7ca2acce4886d8078552efa38878413970f',1,'vk_mem_alloc.h']]],
+  ['vma_5fallocator_5fcreate_5fbuffer_5fdevice_5faddress_5fbit_123',['VMA_ALLOCATOR_CREATE_BUFFER_DEVICE_ADDRESS_BIT',['../vk__mem__alloc_8h.html#a4f87c9100d154a65a4ad495f7763cf7ca5f1b28b0414319d1687e1f2b30ab0089',1,'vk_mem_alloc.h']]],
+  ['vma_5fallocator_5fcreate_5fext_5fmemory_5fbudget_5fbit_124',['VMA_ALLOCATOR_CREATE_EXT_MEMORY_BUDGET_BIT',['../vk__mem__alloc_8h.html#a4f87c9100d154a65a4ad495f7763cf7ca4d4687863f7bd4b418c6006dc04400b0',1,'vk_mem_alloc.h']]],
+  ['vma_5fallocator_5fcreate_5fext_5fmemory_5fpriority_5fbit_125',['VMA_ALLOCATOR_CREATE_EXT_MEMORY_PRIORITY_BIT',['../vk__mem__alloc_8h.html#a4f87c9100d154a65a4ad495f7763cf7caffdd7a5169be3dbd7cbf6b3619e4f78a',1,'vk_mem_alloc.h']]],
+  ['vma_5fallocator_5fcreate_5fexternally_5fsynchronized_5fbit_126',['VMA_ALLOCATOR_CREATE_EXTERNALLY_SYNCHRONIZED_BIT',['../vk__mem__alloc_8h.html#a4f87c9100d154a65a4ad495f7763cf7ca4816ddaed324ba110172ca608a20f29d',1,'vk_mem_alloc.h']]],
+  ['vma_5fallocator_5fcreate_5fflag_5fbits_5fmax_5fenum_127',['VMA_ALLOCATOR_CREATE_FLAG_BITS_MAX_ENUM',['../vk__mem__alloc_8h.html#a4f87c9100d154a65a4ad495f7763cf7cae4d5ad929caba5f23eb502b13bd5286c',1,'vk_mem_alloc.h']]],
+  ['vma_5fallocator_5fcreate_5fkhr_5fbind_5fmemory2_5fbit_128',['VMA_ALLOCATOR_CREATE_KHR_BIND_MEMORY2_BIT',['../vk__mem__alloc_8h.html#a4f87c9100d154a65a4ad495f7763cf7ca8fb75bf07cd184ab903596295e863dee',1,'vk_mem_alloc.h']]],
+  ['vma_5fallocator_5fcreate_5fkhr_5fdedicated_5fallocation_5fbit_129',['VMA_ALLOCATOR_CREATE_KHR_DEDICATED_ALLOCATION_BIT',['../vk__mem__alloc_8h.html#a4f87c9100d154a65a4ad495f7763cf7cace7da7cc6e71a625dfa763c55a597878',1,'vk_mem_alloc.h']]],
+  ['vma_5fbind_5fmemory2_130',['VMA_BIND_MEMORY2',['../vk__mem__alloc_8h.html#a88bef97f86d70a34a4c0746e09a2680d',1,'vk_mem_alloc.h']]],
+  ['vma_5fbuffer_5fdevice_5faddress_131',['VMA_BUFFER_DEVICE_ADDRESS',['../vk__mem__alloc_8h.html#a7f9d5e71b70dd1a137c303a8a8262c10',1,'vk_mem_alloc.h']]],
+  ['vma_5fdedicated_5fallocation_132',['VMA_DEDICATED_ALLOCATION',['../vk__mem__alloc_8h.html#af7b860e63b96d11e44ae8587ba06bbf4',1,'vk_mem_alloc.h']]],
+  ['vma_5fdefragmentation_5fflag_5fbits_5fmax_5fenum_133',['VMA_DEFRAGMENTATION_FLAG_BITS_MAX_ENUM',['../vk__mem__alloc_8h.html#a6552a65b71d16f378c6994b3ceaef50cab87ec33154803bfeb5ac2b379f1d6a97',1,'vk_mem_alloc.h']]],
+  ['vma_5fdefragmentation_5fflag_5fincremental_134',['VMA_DEFRAGMENTATION_FLAG_INCREMENTAL',['../vk__mem__alloc_8h.html#a6552a65b71d16f378c6994b3ceaef50ca31af49446af2459284a568ce2f3fdd33',1,'vk_mem_alloc.h']]],
+  ['vma_5fmemory_5fbudget_135',['VMA_MEMORY_BUDGET',['../vk__mem__alloc_8h.html#a05decf1cf4ebf767beba7acca6c1ec3a',1,'vk_mem_alloc.h']]],
+  ['vma_5fmemory_5fpriority_136',['VMA_MEMORY_PRIORITY',['../vk__mem__alloc_8h.html#a81af8a3a87e34bbb493848143cde43e4',1,'vk_mem_alloc.h']]],
+  ['vma_5fmemory_5fusage_5fcpu_5fcopy_137',['VMA_MEMORY_USAGE_CPU_COPY',['../vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305cca416a444d4d0fc20067c3f76f32ff2500',1,'vk_mem_alloc.h']]],
+  ['vma_5fmemory_5fusage_5fcpu_5fonly_138',['VMA_MEMORY_USAGE_CPU_ONLY',['../vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305cca40bdf4cddeffeb12f43d45ca1286e0a5',1,'vk_mem_alloc.h']]],
+  ['vma_5fmemory_5fusage_5fcpu_5fto_5fgpu_139',['VMA_MEMORY_USAGE_CPU_TO_GPU',['../vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305cca9066b52c5a7079bb74a69aaf8b92ff67',1,'vk_mem_alloc.h']]],
+  ['vma_5fmemory_5fusage_5fgpu_5flazily_5fallocated_140',['VMA_MEMORY_USAGE_GPU_LAZILY_ALLOCATED',['../vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305cca835333d9072db63a653818030e17614d',1,'vk_mem_alloc.h']]],
+  ['vma_5fmemory_5fusage_5fgpu_5fonly_141',['VMA_MEMORY_USAGE_GPU_ONLY',['../vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305ccac6b5dc1432d88647aa4cd456246eadf7',1,'vk_mem_alloc.h']]],
+  ['vma_5fmemory_5fusage_5fgpu_5fto_5fcpu_142',['VMA_MEMORY_USAGE_GPU_TO_CPU',['../vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305cca7b586d2fdaf82a463b58f581ed72be27',1,'vk_mem_alloc.h']]],
+  ['vma_5fmemory_5fusage_5fmax_5fenum_143',['VMA_MEMORY_USAGE_MAX_ENUM',['../vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305cca091e69437ef693e8d0d287f1c719ba6e',1,'vk_mem_alloc.h']]],
+  ['vma_5fmemory_5fusage_5funknown_144',['VMA_MEMORY_USAGE_UNKNOWN',['../vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305ccaf50d27e34e0925cf3a63db8c839121dd',1,'vk_mem_alloc.h']]],
+  ['vma_5fpool_5fcreate_5falgorithm_5fmask_145',['VMA_POOL_CREATE_ALGORITHM_MASK',['../vk__mem__alloc_8h.html#a9a7c45f9c863695d98c83fa5ac940fe7af4d270f8f42517a0f70037ceb6ac1d9c',1,'vk_mem_alloc.h']]],
+  ['vma_5fpool_5fcreate_5fbuddy_5falgorithm_5fbit_146',['VMA_POOL_CREATE_BUDDY_ALGORITHM_BIT',['../vk__mem__alloc_8h.html#a9a7c45f9c863695d98c83fa5ac940fe7a97a0dc38e5161b780594d998d313d35e',1,'vk_mem_alloc.h']]],
+  ['vma_5fpool_5fcreate_5fflag_5fbits_5fmax_5fenum_147',['VMA_POOL_CREATE_FLAG_BITS_MAX_ENUM',['../vk__mem__alloc_8h.html#a9a7c45f9c863695d98c83fa5ac940fe7a1c7312bea9ea246846b9054fd6bd6aec',1,'vk_mem_alloc.h']]],
+  ['vma_5fpool_5fcreate_5fignore_5fbuffer_5fimage_5fgranularity_5fbit_148',['VMA_POOL_CREATE_IGNORE_BUFFER_IMAGE_GRANULARITY_BIT',['../vk__mem__alloc_8h.html#a9a7c45f9c863695d98c83fa5ac940fe7a9f1a499508a8edb4e8ba40aa0290a3d2',1,'vk_mem_alloc.h']]],
+  ['vma_5fpool_5fcreate_5flinear_5falgorithm_5fbit_149',['VMA_POOL_CREATE_LINEAR_ALGORITHM_BIT',['../vk__mem__alloc_8h.html#a9a7c45f9c863695d98c83fa5ac940fe7a13c8a444197c67866be9cb05599fc726',1,'vk_mem_alloc.h']]],
+  ['vma_5frecord_5fflag_5fbits_5fmax_5fenum_150',['VMA_RECORD_FLAG_BITS_MAX_ENUM',['../vk__mem__alloc_8h.html#a4dd2c44642312a147a4e93373a6e64d2a20dd17d69966dbffa054739d6090b85e',1,'vk_mem_alloc.h']]],
+  ['vma_5frecord_5fflush_5fafter_5fcall_5fbit_151',['VMA_RECORD_FLUSH_AFTER_CALL_BIT',['../vk__mem__alloc_8h.html#a4dd2c44642312a147a4e93373a6e64d2a8e7ab322e8732654be627c4ea8f36cc7',1,'vk_mem_alloc.h']]],
+  ['vma_5frecording_5fenabled_152',['VMA_RECORDING_ENABLED',['../vk__mem__alloc_8h.html#a1f0c126759fc96ccb6e2d23c101d770c',1,'vk_mem_alloc.h']]],
+  ['vma_5fstats_5fstring_5fenabled_153',['VMA_STATS_STRING_ENABLED',['../vk__mem__alloc_8h.html#ae25f0d55fd91cb166f002b63244800e1',1,'vk_mem_alloc.h']]],
+  ['vma_5fvulkan_5fversion_154',['VMA_VULKAN_VERSION',['../vk__mem__alloc_8h.html#a1a2407c283893638cc039bb31fcd74b6',1,'vk_mem_alloc.h']]],
+  ['vmaallocatememory_155',['vmaAllocateMemory',['../vk__mem__alloc_8h.html#abf28077dbf82d0908b8acbe8ee8dd9b8',1,'vk_mem_alloc.h']]],
+  ['vmaallocatememoryforbuffer_156',['vmaAllocateMemoryForBuffer',['../vk__mem__alloc_8h.html#a7fdf64415b6c3d83c454f28d2c53df7b',1,'vk_mem_alloc.h']]],
+  ['vmaallocatememoryforimage_157',['vmaAllocateMemoryForImage',['../vk__mem__alloc_8h.html#a0faa3f9e5fb233d29d1e00390650febb',1,'vk_mem_alloc.h']]],
+  ['vmaallocatememorypages_158',['vmaAllocateMemoryPages',['../vk__mem__alloc_8h.html#ad37e82e492b3de38fc3f4cffd9ad0ae1',1,'vk_mem_alloc.h']]],
+  ['vmaallocation_159',['VmaAllocation',['../struct_vma_allocation.html',1,'']]],
+  ['vmaallocationcreateflagbits_160',['VmaAllocationCreateFlagBits',['../vk__mem__alloc_8h.html#a4fceecc301f4064dc808d3cd6c038941',1,'VmaAllocationCreateFlagBits():&#160;vk_mem_alloc.h'],['../vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597',1,'VmaAllocationCreateFlagBits():&#160;vk_mem_alloc.h']]],
+  ['vmaallocationcreateflags_161',['VmaAllocationCreateFlags',['../vk__mem__alloc_8h.html#a5225e5e11f8376f6a31a1791f3d6e817',1,'vk_mem_alloc.h']]],
+  ['vmaallocationcreateinfo_162',['VmaAllocationCreateInfo',['../struct_vma_allocation_create_info.html',1,'VmaAllocationCreateInfo'],['../vk__mem__alloc_8h.html#a3bf110892ea2fb4649fedb68488d026a',1,'VmaAllocationCreateInfo():&#160;vk_mem_alloc.h']]],
+  ['vmaallocationinfo_163',['VmaAllocationInfo',['../struct_vma_allocation_info.html',1,'VmaAllocationInfo'],['../vk__mem__alloc_8h.html#a1cf7774606721026a68aabe3af2e5b50',1,'VmaAllocationInfo():&#160;vk_mem_alloc.h']]],
+  ['vmaallocator_164',['VmaAllocator',['../struct_vma_allocator.html',1,'']]],
+  ['vmaallocatorcreateflagbits_165',['VmaAllocatorCreateFlagBits',['../vk__mem__alloc_8h.html#afd73b95e737ee7e76f827cb5472f559f',1,'VmaAllocatorCreateFlagBits():&#160;vk_mem_alloc.h'],['../vk__mem__alloc_8h.html#a4f87c9100d154a65a4ad495f7763cf7c',1,'VmaAllocatorCreateFlagBits():&#160;vk_mem_alloc.h']]],
+  ['vmaallocatorcreateflags_166',['VmaAllocatorCreateFlags',['../vk__mem__alloc_8h.html#acfe6863e160722c2c1bbcf7573fddc4d',1,'vk_mem_alloc.h']]],
+  ['vmaallocatorcreateinfo_167',['VmaAllocatorCreateInfo',['../struct_vma_allocator_create_info.html',1,'VmaAllocatorCreateInfo'],['../vk__mem__alloc_8h.html#aad9652301d33759b83e52d4f3605a14a',1,'VmaAllocatorCreateInfo():&#160;vk_mem_alloc.h']]],
+  ['vmaallocatorinfo_168',['VmaAllocatorInfo',['../struct_vma_allocator_info.html',1,'VmaAllocatorInfo'],['../vk__mem__alloc_8h.html#a1988031b0223fdbd564250fa1edd942c',1,'VmaAllocatorInfo():&#160;vk_mem_alloc.h']]],
+  ['vmabegindefragmentationpass_169',['vmaBeginDefragmentationPass',['../vk__mem__alloc_8h.html#ac0f01545b6262f7d4d128fc8f8e5c77b',1,'vk_mem_alloc.h']]],
+  ['vmabindbuffermemory_170',['vmaBindBufferMemory',['../vk__mem__alloc_8h.html#a6b0929b914b60cf2d45cac4bf3547470',1,'vk_mem_alloc.h']]],
+  ['vmabindbuffermemory2_171',['vmaBindBufferMemory2',['../vk__mem__alloc_8h.html#a927c944f45e0f2941182abb6f608e64a',1,'vk_mem_alloc.h']]],
+  ['vmabindimagememory_172',['vmaBindImageMemory',['../vk__mem__alloc_8h.html#a3d3ca45799923aa5d138e9e5f9eb2da5',1,'vk_mem_alloc.h']]],
+  ['vmabindimagememory2_173',['vmaBindImageMemory2',['../vk__mem__alloc_8h.html#aa8251ee81b0045a443e35b8e8aa021bc',1,'vk_mem_alloc.h']]],
+  ['vmabudget_174',['VmaBudget',['../struct_vma_budget.html',1,'VmaBudget'],['../vk__mem__alloc_8h.html#aa078667e71b1ef24e87a6a30d128381d',1,'VmaBudget():&#160;vk_mem_alloc.h']]],
+  ['vmabuildstatsstring_175',['vmaBuildStatsString',['../vk__mem__alloc_8h.html#aa4fee7eb5253377599ef4fd38c93c2a0',1,'vk_mem_alloc.h']]],
+  ['vmacalculatestats_176',['vmaCalculateStats',['../vk__mem__alloc_8h.html#a333b61c1788cb23559177531e6a93ca3',1,'vk_mem_alloc.h']]],
+  ['vmacheckcorruption_177',['vmaCheckCorruption',['../vk__mem__alloc_8h.html#a49329a7f030dafcf82f7b73334c22e98',1,'vk_mem_alloc.h']]],
+  ['vmacheckpoolcorruption_178',['vmaCheckPoolCorruption',['../vk__mem__alloc_8h.html#ad535935619c7a549bf837e1bb0068f89',1,'vk_mem_alloc.h']]],
+  ['vmacreateallocator_179',['vmaCreateAllocator',['../vk__mem__alloc_8h.html#a200692051ddb34240248234f5f4c17bb',1,'vk_mem_alloc.h']]],
+  ['vmacreatebuffer_180',['vmaCreateBuffer',['../vk__mem__alloc_8h.html#ac72ee55598617e8eecca384e746bab51',1,'vk_mem_alloc.h']]],
+  ['vmacreateimage_181',['vmaCreateImage',['../vk__mem__alloc_8h.html#a02a94f25679275851a53e82eacbcfc73',1,'vk_mem_alloc.h']]],
+  ['vmacreatelostallocation_182',['vmaCreateLostAllocation',['../vk__mem__alloc_8h.html#ae5c9657d9e94756269145b01c05d16f1',1,'vk_mem_alloc.h']]],
+  ['vmacreatepool_183',['vmaCreatePool',['../vk__mem__alloc_8h.html#a5c8770ded7c59c8caac6de0c2cb00b50',1,'vk_mem_alloc.h']]],
+  ['vmadefragment_184',['vmaDefragment',['../vk__mem__alloc_8h.html#a9f0f8f56db5f7f57fe4454f465142dac',1,'vk_mem_alloc.h']]],
+  ['vmadefragmentationbegin_185',['vmaDefragmentationBegin',['../vk__mem__alloc_8h.html#a36ba776fd7fd5cb1e9359fdc0d8e6e8a',1,'vk_mem_alloc.h']]],
+  ['vmadefragmentationcontext_186',['VmaDefragmentationContext',['../struct_vma_defragmentation_context.html',1,'']]],
+  ['vmadefragmentationend_187',['vmaDefragmentationEnd',['../vk__mem__alloc_8h.html#a8774e20e91e245aae959ba63efa15dd2',1,'vk_mem_alloc.h']]],
+  ['vmadefragmentationflagbits_188',['VmaDefragmentationFlagBits',['../vk__mem__alloc_8h.html#a6552a65b71d16f378c6994b3ceaef50c',1,'VmaDefragmentationFlagBits():&#160;vk_mem_alloc.h'],['../vk__mem__alloc_8h.html#a13415cc0b443353a7b5abda300b833fc',1,'VmaDefragmentationFlagBits():&#160;vk_mem_alloc.h']]],
+  ['vmadefragmentationflags_189',['VmaDefragmentationFlags',['../vk__mem__alloc_8h.html#a88a77cef37e5d3c4fc9eb328885d048d',1,'vk_mem_alloc.h']]],
+  ['vmadefragmentationinfo_190',['VmaDefragmentationInfo',['../struct_vma_defragmentation_info.html',1,'VmaDefragmentationInfo'],['../vk__mem__alloc_8h.html#a2bf47f96bf92bed2a49461bd9af3acfa',1,'VmaDefragmentationInfo():&#160;vk_mem_alloc.h']]],
+  ['vmadefragmentationinfo2_191',['VmaDefragmentationInfo2',['../struct_vma_defragmentation_info2.html',1,'VmaDefragmentationInfo2'],['../vk__mem__alloc_8h.html#ad6daeffaa670ce6d11a203a6224c9937',1,'VmaDefragmentationInfo2():&#160;vk_mem_alloc.h']]],
+  ['vmadefragmentationpassinfo_192',['VmaDefragmentationPassInfo',['../struct_vma_defragmentation_pass_info.html',1,'VmaDefragmentationPassInfo'],['../vk__mem__alloc_8h.html#a72aebd522242d56abea67b4f47f6549e',1,'VmaDefragmentationPassInfo():&#160;vk_mem_alloc.h']]],
+  ['vmadefragmentationpassmoveinfo_193',['VmaDefragmentationPassMoveInfo',['../struct_vma_defragmentation_pass_move_info.html',1,'VmaDefragmentationPassMoveInfo'],['../vk__mem__alloc_8h.html#ad6799e8e2b1527abfc84d33bc44aeaf5',1,'VmaDefragmentationPassMoveInfo():&#160;vk_mem_alloc.h']]],
+  ['vmadefragmentationstats_194',['VmaDefragmentationStats',['../struct_vma_defragmentation_stats.html',1,'VmaDefragmentationStats'],['../vk__mem__alloc_8h.html#ad94034192259c2e34a4d1c5e27810403',1,'VmaDefragmentationStats():&#160;vk_mem_alloc.h']]],
+  ['vmadestroyallocator_195',['vmaDestroyAllocator',['../vk__mem__alloc_8h.html#aa8d164061c88f22fb1fd3c8f3534bc1d',1,'vk_mem_alloc.h']]],
+  ['vmadestroybuffer_196',['vmaDestroyBuffer',['../vk__mem__alloc_8h.html#a0d9f4e4ba5bf9aab1f1c746387753d77',1,'vk_mem_alloc.h']]],
+  ['vmadestroyimage_197',['vmaDestroyImage',['../vk__mem__alloc_8h.html#ae50d2cb3b4a3bfd4dd40987234e50e7e',1,'vk_mem_alloc.h']]],
+  ['vmadestroypool_198',['vmaDestroyPool',['../vk__mem__alloc_8h.html#a5485779c8f1948238fc4e92232fa65e1',1,'vk_mem_alloc.h']]],
+  ['vmadevicememorycallbacks_199',['VmaDeviceMemoryCallbacks',['../struct_vma_device_memory_callbacks.html',1,'VmaDeviceMemoryCallbacks'],['../vk__mem__alloc_8h.html#a77692d3c8770ea8882d573206bd27b2b',1,'VmaDeviceMemoryCallbacks():&#160;vk_mem_alloc.h']]],
+  ['vmaenddefragmentationpass_200',['vmaEndDefragmentationPass',['../vk__mem__alloc_8h.html#a1b9ffa538bed905af55c747cc48963bd',1,'vk_mem_alloc.h']]],
+  ['vmafindmemorytypeindex_201',['vmaFindMemoryTypeIndex',['../vk__mem__alloc_8h.html#aef15a94b58fbcb0fe706d5720e84a74a',1,'vk_mem_alloc.h']]],
+  ['vmafindmemorytypeindexforbufferinfo_202',['vmaFindMemoryTypeIndexForBufferInfo',['../vk__mem__alloc_8h.html#ae790ab9ffaf7667fb8f62523e6897888',1,'vk_mem_alloc.h']]],
+  ['vmafindmemorytypeindexforimageinfo_203',['vmaFindMemoryTypeIndexForImageInfo',['../vk__mem__alloc_8h.html#a088da83d8eaf3ce9056d9ea0b981d472',1,'vk_mem_alloc.h']]],
+  ['vmaflushallocation_204',['vmaFlushAllocation',['../vk__mem__alloc_8h.html#a30c37c1eec6025f397be41644f48490f',1,'vk_mem_alloc.h']]],
+  ['vmaflushallocations_205',['vmaFlushAllocations',['../vk__mem__alloc_8h.html#ac3dd00da721875ed99fa8a881922bdfc',1,'vk_mem_alloc.h']]],
+  ['vmafreememory_206',['vmaFreeMemory',['../vk__mem__alloc_8h.html#a5fea5518972ae9094b1526cbcb19b05f',1,'vk_mem_alloc.h']]],
+  ['vmafreememorypages_207',['vmaFreeMemoryPages',['../vk__mem__alloc_8h.html#a834b1e4aef395c0a1d56a28e69a4a17e',1,'vk_mem_alloc.h']]],
+  ['vmafreestatsstring_208',['vmaFreeStatsString',['../vk__mem__alloc_8h.html#a3104eb30d8122c84dd8541063f145288',1,'vk_mem_alloc.h']]],
+  ['vmagetallocationinfo_209',['vmaGetAllocationInfo',['../vk__mem__alloc_8h.html#a86dd08aba8633bfa4ad0df2e76481d8b',1,'vk_mem_alloc.h']]],
+  ['vmagetallocatorinfo_210',['vmaGetAllocatorInfo',['../vk__mem__alloc_8h.html#afa02231a791b37255720d566a52683e7',1,'vk_mem_alloc.h']]],
+  ['vmagetbudget_211',['vmaGetBudget',['../vk__mem__alloc_8h.html#aec0ed24ebea2d0099eed5f801daaefba',1,'vk_mem_alloc.h']]],
+  ['vmagetmemoryproperties_212',['vmaGetMemoryProperties',['../vk__mem__alloc_8h.html#ab88db292a17974f911182543fda52d19',1,'vk_mem_alloc.h']]],
+  ['vmagetmemorytypeproperties_213',['vmaGetMemoryTypeProperties',['../vk__mem__alloc_8h.html#a8701444752eb5de4464adb5a2b514bca',1,'vk_mem_alloc.h']]],
+  ['vmagetphysicaldeviceproperties_214',['vmaGetPhysicalDeviceProperties',['../vk__mem__alloc_8h.html#aecabf7b6e91ea87d0316fa0a9e014fe0',1,'vk_mem_alloc.h']]],
+  ['vmagetpoolname_215',['vmaGetPoolName',['../vk__mem__alloc_8h.html#af09b4e4eafdbee812e8d73ddf960f030',1,'vk_mem_alloc.h']]],
+  ['vmagetpoolstats_216',['vmaGetPoolStats',['../vk__mem__alloc_8h.html#ae8bf76997b234ef68aad922616df4153',1,'vk_mem_alloc.h']]],
+  ['vmainvalidateallocation_217',['vmaInvalidateAllocation',['../vk__mem__alloc_8h.html#aaa8412919139ef413a4215ac6a290fae',1,'vk_mem_alloc.h']]],
+  ['vmainvalidateallocations_218',['vmaInvalidateAllocations',['../vk__mem__alloc_8h.html#ab25b558d75f7378ec944a1522fdcc3c5',1,'vk_mem_alloc.h']]],
+  ['vmamakepoolallocationslost_219',['vmaMakePoolAllocationsLost',['../vk__mem__alloc_8h.html#a736bd6cbda886f36c891727e73bd4024',1,'vk_mem_alloc.h']]],
+  ['vmamapmemory_220',['vmaMapMemory',['../vk__mem__alloc_8h.html#ad5bd1243512d099706de88168992f069',1,'vk_mem_alloc.h']]],
+  ['vmamemoryusage_221',['VmaMemoryUsage',['../vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305cc',1,'VmaMemoryUsage():&#160;vk_mem_alloc.h'],['../vk__mem__alloc_8h.html#a806e8499dde802e59eb72a1dc811c35f',1,'VmaMemoryUsage():&#160;vk_mem_alloc.h']]],
+  ['vmapool_222',['VmaPool',['../struct_vma_pool.html',1,'']]],
+  ['vmapoolcreateflagbits_223',['VmaPoolCreateFlagBits',['../vk__mem__alloc_8h.html#a4d4f2efc2509157a9e4ecd4fd7942303',1,'VmaPoolCreateFlagBits():&#160;vk_mem_alloc.h'],['../vk__mem__alloc_8h.html#a9a7c45f9c863695d98c83fa5ac940fe7',1,'VmaPoolCreateFlagBits():&#160;vk_mem_alloc.h']]],
+  ['vmapoolcreateflags_224',['VmaPoolCreateFlags',['../vk__mem__alloc_8h.html#a2770e325ea42e087c1b91fdf46d0292a',1,'vk_mem_alloc.h']]],
+  ['vmapoolcreateinfo_225',['VmaPoolCreateInfo',['../vk__mem__alloc_8h.html#a1017aa83489c0eee8d2163d2bf253f67',1,'VmaPoolCreateInfo():&#160;vk_mem_alloc.h'],['../struct_vma_pool_create_info.html',1,'VmaPoolCreateInfo']]],
+  ['vmapoolstats_226',['VmaPoolStats',['../struct_vma_pool_stats.html',1,'VmaPoolStats'],['../vk__mem__alloc_8h.html#a4759a2d9f99c19ba7627553c847132f1',1,'VmaPoolStats():&#160;vk_mem_alloc.h']]],
+  ['vmarecordflagbits_227',['VmaRecordFlagBits',['../vk__mem__alloc_8h.html#a4dd2c44642312a147a4e93373a6e64d2',1,'VmaRecordFlagBits():&#160;vk_mem_alloc.h'],['../vk__mem__alloc_8h.html#acd24d5eb58abff7e1f43cb32a1ba1413',1,'VmaRecordFlagBits():&#160;vk_mem_alloc.h']]],
+  ['vmarecordflags_228',['VmaRecordFlags',['../vk__mem__alloc_8h.html#af3929a1a4547c592fc0b0e55ef452828',1,'vk_mem_alloc.h']]],
+  ['vmarecordsettings_229',['VmaRecordSettings',['../struct_vma_record_settings.html',1,'VmaRecordSettings'],['../vk__mem__alloc_8h.html#a16e21c877101493fce582664cd8754fc',1,'VmaRecordSettings():&#160;vk_mem_alloc.h']]],
+  ['vmasetallocationuserdata_230',['vmaSetAllocationUserData',['../vk__mem__alloc_8h.html#af9147d31ffc11d62fc187bde283ed14f',1,'vk_mem_alloc.h']]],
+  ['vmasetcurrentframeindex_231',['vmaSetCurrentFrameIndex',['../vk__mem__alloc_8h.html#ade56bf8dc9f5a5eaddf5f119ed525236',1,'vk_mem_alloc.h']]],
+  ['vmasetpoolname_232',['vmaSetPoolName',['../vk__mem__alloc_8h.html#adbae3a0b4ab078024462fc85c37f3b58',1,'vk_mem_alloc.h']]],
+  ['vmastatinfo_233',['VmaStatInfo',['../struct_vma_stat_info.html',1,'VmaStatInfo'],['../vk__mem__alloc_8h.html#aec5b57e29c97b5d69c6d5654d60df878',1,'VmaStatInfo():&#160;vk_mem_alloc.h']]],
+  ['vmastats_234',['VmaStats',['../struct_vma_stats.html',1,'VmaStats'],['../vk__mem__alloc_8h.html#a21813b2efdf3836767a9058cd8a94034',1,'VmaStats():&#160;vk_mem_alloc.h']]],
+  ['vmatouchallocation_235',['vmaTouchAllocation',['../vk__mem__alloc_8h.html#a43d8ba9673c846f049089a5029d5c73a',1,'vk_mem_alloc.h']]],
+  ['vmaunmapmemory_236',['vmaUnmapMemory',['../vk__mem__alloc_8h.html#a9bc268595cb33f6ec4d519cfce81ff45',1,'vk_mem_alloc.h']]],
+  ['vmavulkanfunctions_237',['VmaVulkanFunctions',['../vk__mem__alloc_8h.html#abb0a8e3b5040d847571cca6c7f9a8074',1,'VmaVulkanFunctions():&#160;vk_mem_alloc.h'],['../struct_vma_vulkan_functions.html',1,'VmaVulkanFunctions']]],
+  ['vulkan_20memory_20allocator_238',['Vulkan Memory Allocator',['../index.html',1,'']]],
+  ['vulkanapiversion_239',['vulkanApiVersion',['../struct_vma_allocator_create_info.html#ae0ffc55139b54520a6bb704b29ffc285',1,'VmaAllocatorCreateInfo']]]
 ];
diff --git a/third_party/vulkan_memory_allocator/docs/html/search/all_12.html b/third_party/vulkan_memory_allocator/docs/html/search/all_12.html
deleted file mode 100644
index 290ee76..0000000
--- a/third_party/vulkan_memory_allocator/docs/html/search/all_12.html
+++ /dev/null
@@ -1,36 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html><head><title></title>
-<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
-<meta name="generator" content="Doxygen 1.8.18"/>
-<link rel="stylesheet" type="text/css" href="search.css"/>
-<script type="text/javascript" src="all_12.js"></script>
-<script type="text/javascript" src="search.js"></script>
-</head>
-<body class="SRPage">
-<div id="SRIndex">
-<div class="SRStatus" id="Loading">Loading...</div>
-<div id="SRResults"></div>
-<script type="text/javascript"><!--
-/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
-createResults();
-/* @license-end */
---></script>
-<div class="SRStatus" id="Searching">Searching...</div>
-<div class="SRStatus" id="NoMatches">No Matches</div>
-<script type="text/javascript"><!--
-/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
-document.getElementById("Loading").style.display="none";
-document.getElementById("NoMatches").style.display="none";
-var searchResults = new SearchResults("searchResults");
-searchResults.Search();
-window.addEventListener("message", function(event) {
-  if (event.data == "take_focus") {
-    var elem = searchResults.NavNext(0);
-    if (elem) elem.focus();
-  }
-});
-/* @license-end */
---></script>
-</div>
-</body>
-</html>
diff --git a/third_party/vulkan_memory_allocator/docs/html/search/all_12.js b/third_party/vulkan_memory_allocator/docs/html/search/all_12.js
deleted file mode 100644
index 1ca905f..0000000
--- a/third_party/vulkan_memory_allocator/docs/html/search/all_12.js
+++ /dev/null
@@ -1,157 +0,0 @@
-var searchData=
-[
-  ['vulkan_20memory_20allocator_84',['Vulkan Memory Allocator',['../index.html',1,'']]],
-  ['vk_5famd_5fdevice_5fcoherent_5fmemory_85',['VK_AMD_device_coherent_memory',['../vk_amd_device_coherent_memory.html',1,'index']]],
-  ['vk_5fkhr_5fdedicated_5fallocation_86',['VK_KHR_dedicated_allocation',['../vk_khr_dedicated_allocation.html',1,'index']]],
-  ['vk_5fmem_5falloc_2eh_87',['vk_mem_alloc.h',['../vk__mem__alloc_8h.html',1,'']]],
-  ['vkallocatememory_88',['vkAllocateMemory',['../struct_vma_vulkan_functions.html#a2943bf99dfd784a0e8f599d987e22e6c',1,'VmaVulkanFunctions']]],
-  ['vkbindbuffermemory_89',['vkBindBufferMemory',['../struct_vma_vulkan_functions.html#a94fc4f3a605d9880bb3c0ba2c2fc80b2',1,'VmaVulkanFunctions']]],
-  ['vkbindimagememory_90',['vkBindImageMemory',['../struct_vma_vulkan_functions.html#a1338d96a128a5ade648b8d934907c637',1,'VmaVulkanFunctions']]],
-  ['vkcmdcopybuffer_91',['vkCmdCopyBuffer',['../struct_vma_vulkan_functions.html#ae5c0db8c89a3b82593dc16aa6a49fa3a',1,'VmaVulkanFunctions']]],
-  ['vkcreatebuffer_92',['vkCreateBuffer',['../struct_vma_vulkan_functions.html#ae8084315a25006271a2edfc3a447519f',1,'VmaVulkanFunctions']]],
-  ['vkcreateimage_93',['vkCreateImage',['../struct_vma_vulkan_functions.html#a23ebe70be515b9b5010a1d691200e325',1,'VmaVulkanFunctions']]],
-  ['vkdestroybuffer_94',['vkDestroyBuffer',['../struct_vma_vulkan_functions.html#a7e054606faddb07f0e8556f3ed317d45',1,'VmaVulkanFunctions']]],
-  ['vkdestroyimage_95',['vkDestroyImage',['../struct_vma_vulkan_functions.html#a90b898227039b1dcb3520f6e91f09ffa',1,'VmaVulkanFunctions']]],
-  ['vkflushmappedmemoryranges_96',['vkFlushMappedMemoryRanges',['../struct_vma_vulkan_functions.html#a33c322f4c4ad2810f8a9c97a277572f9',1,'VmaVulkanFunctions']]],
-  ['vkfreememory_97',['vkFreeMemory',['../struct_vma_vulkan_functions.html#a4c658701778564d62034255b5dda91b4',1,'VmaVulkanFunctions']]],
-  ['vkgetbuffermemoryrequirements_98',['vkGetBufferMemoryRequirements',['../struct_vma_vulkan_functions.html#a5b92901df89a4194b0d12f6071d4d143',1,'VmaVulkanFunctions']]],
-  ['vkgetimagememoryrequirements_99',['vkGetImageMemoryRequirements',['../struct_vma_vulkan_functions.html#a475f6f49f8debe4d10800592606d53f4',1,'VmaVulkanFunctions']]],
-  ['vkgetphysicaldevicememoryproperties_100',['vkGetPhysicalDeviceMemoryProperties',['../struct_vma_vulkan_functions.html#a60d25c33bba06bb8592e6875cbaa9830',1,'VmaVulkanFunctions']]],
-  ['vkgetphysicaldeviceproperties_101',['vkGetPhysicalDeviceProperties',['../struct_vma_vulkan_functions.html#a77b7a74082823e865dd6546623468f96',1,'VmaVulkanFunctions']]],
-  ['vkinvalidatemappedmemoryranges_102',['vkInvalidateMappedMemoryRanges',['../struct_vma_vulkan_functions.html#a5c1093bc32386a8060c37c9f282078a1',1,'VmaVulkanFunctions']]],
-  ['vkmapmemory_103',['vkMapMemory',['../struct_vma_vulkan_functions.html#ab5c1f38dea3a2cf00dc9eb4f57218c49',1,'VmaVulkanFunctions']]],
-  ['vkunmapmemory_104',['vkUnmapMemory',['../struct_vma_vulkan_functions.html#acc798589736f0becb317fc2196c1d8b9',1,'VmaVulkanFunctions']]],
-  ['vma_5fallocation_5fcreate_5fcan_5fbecome_5flost_5fbit_105',['VMA_ALLOCATION_CREATE_CAN_BECOME_LOST_BIT',['../vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a5f436af6c8fe8540573a6d22627a6fd2',1,'vk_mem_alloc.h']]],
-  ['vma_5fallocation_5fcreate_5fcan_5fmake_5fother_5flost_5fbit_106',['VMA_ALLOCATION_CREATE_CAN_MAKE_OTHER_LOST_BIT',['../vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a68686d0ce9beb0d4d1b9f2b8b1389a7e',1,'vk_mem_alloc.h']]],
-  ['vma_5fallocation_5fcreate_5fdedicated_5fmemory_5fbit_107',['VMA_ALLOCATION_CREATE_DEDICATED_MEMORY_BIT',['../vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a3fc311d855c2ff53f1090ef5c722b38f',1,'vk_mem_alloc.h']]],
-  ['vma_5fallocation_5fcreate_5fdont_5fbind_5fbit_108',['VMA_ALLOCATION_CREATE_DONT_BIND_BIT',['../vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a2310568c62208af432724305fe29ccea',1,'vk_mem_alloc.h']]],
-  ['vma_5fallocation_5fcreate_5fflag_5fbits_5fmax_5fenum_109',['VMA_ALLOCATION_CREATE_FLAG_BITS_MAX_ENUM',['../vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597ae5633ec569f4899cf8f29e7385b2f882',1,'vk_mem_alloc.h']]],
-  ['vma_5fallocation_5fcreate_5fmapped_5fbit_110',['VMA_ALLOCATION_CREATE_MAPPED_BIT',['../vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a11da372cc3a82931c5e5d6146cd9dd1f',1,'vk_mem_alloc.h']]],
-  ['vma_5fallocation_5fcreate_5fnever_5fallocate_5fbit_111',['VMA_ALLOCATION_CREATE_NEVER_ALLOCATE_BIT',['../vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a89759603401014eb325eb22a3839f2ff',1,'vk_mem_alloc.h']]],
-  ['vma_5fallocation_5fcreate_5fstrategy_5fbest_5ffit_5fbit_112',['VMA_ALLOCATION_CREATE_STRATEGY_BEST_FIT_BIT',['../vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a839826775c62319466441f86496f036d',1,'vk_mem_alloc.h']]],
-  ['vma_5fallocation_5fcreate_5fstrategy_5ffirst_5ffit_5fbit_113',['VMA_ALLOCATION_CREATE_STRATEGY_FIRST_FIT_BIT',['../vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a33eb2052674f3ad92386c714a65fb777',1,'vk_mem_alloc.h']]],
-  ['vma_5fallocation_5fcreate_5fstrategy_5fmask_114',['VMA_ALLOCATION_CREATE_STRATEGY_MASK',['../vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a8e16845d81ae3d27c47106d4770d5c7e',1,'vk_mem_alloc.h']]],
-  ['vma_5fallocation_5fcreate_5fstrategy_5fmin_5ffragmentation_5fbit_115',['VMA_ALLOCATION_CREATE_STRATEGY_MIN_FRAGMENTATION_BIT',['../vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a621b704103eb3360230c860acf36e706',1,'vk_mem_alloc.h']]],
-  ['vma_5fallocation_5fcreate_5fstrategy_5fmin_5fmemory_5fbit_116',['VMA_ALLOCATION_CREATE_STRATEGY_MIN_MEMORY_BIT',['../vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a8af1210cf591784afa026d94998f735d',1,'vk_mem_alloc.h']]],
-  ['vma_5fallocation_5fcreate_5fstrategy_5fmin_5ftime_5fbit_117',['VMA_ALLOCATION_CREATE_STRATEGY_MIN_TIME_BIT',['../vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a0729e932b7ea170e3a128cad96c5cf6d',1,'vk_mem_alloc.h']]],
-  ['vma_5fallocation_5fcreate_5fstrategy_5fworst_5ffit_5fbit_118',['VMA_ALLOCATION_CREATE_STRATEGY_WORST_FIT_BIT',['../vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597ad242a04f802e25fef0b880afe8bb0a62',1,'vk_mem_alloc.h']]],
-  ['vma_5fallocation_5fcreate_5fupper_5faddress_5fbit_119',['VMA_ALLOCATION_CREATE_UPPER_ADDRESS_BIT',['../vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a42ba3a2d2c7117953210b7c3ef8da0df',1,'vk_mem_alloc.h']]],
-  ['vma_5fallocation_5fcreate_5fuser_5fdata_5fcopy_5fstring_5fbit_120',['VMA_ALLOCATION_CREATE_USER_DATA_COPY_STRING_BIT',['../vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597aa6f24f821cd6a7c5e4a443f7bf59c520',1,'vk_mem_alloc.h']]],
-  ['vma_5fallocation_5fcreate_5fwithin_5fbudget_5fbit_121',['VMA_ALLOCATION_CREATE_WITHIN_BUDGET_BIT',['../vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597ab8b1764f3e9022368e440c057783b92d',1,'vk_mem_alloc.h']]],
-  ['vma_5fallocator_5fcreate_5famd_5fdevice_5fcoherent_5fmemory_5fbit_122',['VMA_ALLOCATOR_CREATE_AMD_DEVICE_COHERENT_MEMORY_BIT',['../vk__mem__alloc_8h.html#a4f87c9100d154a65a4ad495f7763cf7ca2acce4886d8078552efa38878413970f',1,'vk_mem_alloc.h']]],
-  ['vma_5fallocator_5fcreate_5fbuffer_5fdevice_5faddress_5fbit_123',['VMA_ALLOCATOR_CREATE_BUFFER_DEVICE_ADDRESS_BIT',['../vk__mem__alloc_8h.html#a4f87c9100d154a65a4ad495f7763cf7ca5f1b28b0414319d1687e1f2b30ab0089',1,'vk_mem_alloc.h']]],
-  ['vma_5fallocator_5fcreate_5fext_5fmemory_5fbudget_5fbit_124',['VMA_ALLOCATOR_CREATE_EXT_MEMORY_BUDGET_BIT',['../vk__mem__alloc_8h.html#a4f87c9100d154a65a4ad495f7763cf7ca4d4687863f7bd4b418c6006dc04400b0',1,'vk_mem_alloc.h']]],
-  ['vma_5fallocator_5fcreate_5fexternally_5fsynchronized_5fbit_125',['VMA_ALLOCATOR_CREATE_EXTERNALLY_SYNCHRONIZED_BIT',['../vk__mem__alloc_8h.html#a4f87c9100d154a65a4ad495f7763cf7ca4816ddaed324ba110172ca608a20f29d',1,'vk_mem_alloc.h']]],
-  ['vma_5fallocator_5fcreate_5fflag_5fbits_5fmax_5fenum_126',['VMA_ALLOCATOR_CREATE_FLAG_BITS_MAX_ENUM',['../vk__mem__alloc_8h.html#a4f87c9100d154a65a4ad495f7763cf7cae4d5ad929caba5f23eb502b13bd5286c',1,'vk_mem_alloc.h']]],
-  ['vma_5fallocator_5fcreate_5fkhr_5fbind_5fmemory2_5fbit_127',['VMA_ALLOCATOR_CREATE_KHR_BIND_MEMORY2_BIT',['../vk__mem__alloc_8h.html#a4f87c9100d154a65a4ad495f7763cf7ca8fb75bf07cd184ab903596295e863dee',1,'vk_mem_alloc.h']]],
-  ['vma_5fallocator_5fcreate_5fkhr_5fdedicated_5fallocation_5fbit_128',['VMA_ALLOCATOR_CREATE_KHR_DEDICATED_ALLOCATION_BIT',['../vk__mem__alloc_8h.html#a4f87c9100d154a65a4ad495f7763cf7cace7da7cc6e71a625dfa763c55a597878',1,'vk_mem_alloc.h']]],
-  ['vma_5fbind_5fmemory2_129',['VMA_BIND_MEMORY2',['../vk__mem__alloc_8h.html#a88bef97f86d70a34a4c0746e09a2680d',1,'vk_mem_alloc.h']]],
-  ['vma_5fbuffer_5fdevice_5faddress_130',['VMA_BUFFER_DEVICE_ADDRESS',['../vk__mem__alloc_8h.html#a7f9d5e71b70dd1a137c303a8a8262c10',1,'vk_mem_alloc.h']]],
-  ['vma_5fdedicated_5fallocation_131',['VMA_DEDICATED_ALLOCATION',['../vk__mem__alloc_8h.html#af7b860e63b96d11e44ae8587ba06bbf4',1,'vk_mem_alloc.h']]],
-  ['vma_5fdefragmentation_5fflag_5fbits_5fmax_5fenum_132',['VMA_DEFRAGMENTATION_FLAG_BITS_MAX_ENUM',['../vk__mem__alloc_8h.html#a6552a65b71d16f378c6994b3ceaef50cab87ec33154803bfeb5ac2b379f1d6a97',1,'vk_mem_alloc.h']]],
-  ['vma_5fdefragmentation_5fflag_5fincremental_133',['VMA_DEFRAGMENTATION_FLAG_INCREMENTAL',['../vk__mem__alloc_8h.html#a6552a65b71d16f378c6994b3ceaef50ca31af49446af2459284a568ce2f3fdd33',1,'vk_mem_alloc.h']]],
-  ['vma_5fmemory_5fbudget_134',['VMA_MEMORY_BUDGET',['../vk__mem__alloc_8h.html#a05decf1cf4ebf767beba7acca6c1ec3a',1,'vk_mem_alloc.h']]],
-  ['vma_5fmemory_5fusage_5fcpu_5fcopy_135',['VMA_MEMORY_USAGE_CPU_COPY',['../vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305cca416a444d4d0fc20067c3f76f32ff2500',1,'vk_mem_alloc.h']]],
-  ['vma_5fmemory_5fusage_5fcpu_5fonly_136',['VMA_MEMORY_USAGE_CPU_ONLY',['../vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305cca40bdf4cddeffeb12f43d45ca1286e0a5',1,'vk_mem_alloc.h']]],
-  ['vma_5fmemory_5fusage_5fcpu_5fto_5fgpu_137',['VMA_MEMORY_USAGE_CPU_TO_GPU',['../vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305cca9066b52c5a7079bb74a69aaf8b92ff67',1,'vk_mem_alloc.h']]],
-  ['vma_5fmemory_5fusage_5fgpu_5flazily_5fallocated_138',['VMA_MEMORY_USAGE_GPU_LAZILY_ALLOCATED',['../vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305cca835333d9072db63a653818030e17614d',1,'vk_mem_alloc.h']]],
-  ['vma_5fmemory_5fusage_5fgpu_5fonly_139',['VMA_MEMORY_USAGE_GPU_ONLY',['../vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305ccac6b5dc1432d88647aa4cd456246eadf7',1,'vk_mem_alloc.h']]],
-  ['vma_5fmemory_5fusage_5fgpu_5fto_5fcpu_140',['VMA_MEMORY_USAGE_GPU_TO_CPU',['../vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305cca7b586d2fdaf82a463b58f581ed72be27',1,'vk_mem_alloc.h']]],
-  ['vma_5fmemory_5fusage_5fmax_5fenum_141',['VMA_MEMORY_USAGE_MAX_ENUM',['../vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305cca091e69437ef693e8d0d287f1c719ba6e',1,'vk_mem_alloc.h']]],
-  ['vma_5fmemory_5fusage_5funknown_142',['VMA_MEMORY_USAGE_UNKNOWN',['../vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305ccaf50d27e34e0925cf3a63db8c839121dd',1,'vk_mem_alloc.h']]],
-  ['vma_5fpool_5fcreate_5falgorithm_5fmask_143',['VMA_POOL_CREATE_ALGORITHM_MASK',['../vk__mem__alloc_8h.html#a9a7c45f9c863695d98c83fa5ac940fe7af4d270f8f42517a0f70037ceb6ac1d9c',1,'vk_mem_alloc.h']]],
-  ['vma_5fpool_5fcreate_5fbuddy_5falgorithm_5fbit_144',['VMA_POOL_CREATE_BUDDY_ALGORITHM_BIT',['../vk__mem__alloc_8h.html#a9a7c45f9c863695d98c83fa5ac940fe7a97a0dc38e5161b780594d998d313d35e',1,'vk_mem_alloc.h']]],
-  ['vma_5fpool_5fcreate_5fflag_5fbits_5fmax_5fenum_145',['VMA_POOL_CREATE_FLAG_BITS_MAX_ENUM',['../vk__mem__alloc_8h.html#a9a7c45f9c863695d98c83fa5ac940fe7a1c7312bea9ea246846b9054fd6bd6aec',1,'vk_mem_alloc.h']]],
-  ['vma_5fpool_5fcreate_5fignore_5fbuffer_5fimage_5fgranularity_5fbit_146',['VMA_POOL_CREATE_IGNORE_BUFFER_IMAGE_GRANULARITY_BIT',['../vk__mem__alloc_8h.html#a9a7c45f9c863695d98c83fa5ac940fe7a9f1a499508a8edb4e8ba40aa0290a3d2',1,'vk_mem_alloc.h']]],
-  ['vma_5fpool_5fcreate_5flinear_5falgorithm_5fbit_147',['VMA_POOL_CREATE_LINEAR_ALGORITHM_BIT',['../vk__mem__alloc_8h.html#a9a7c45f9c863695d98c83fa5ac940fe7a13c8a444197c67866be9cb05599fc726',1,'vk_mem_alloc.h']]],
-  ['vma_5frecord_5fflag_5fbits_5fmax_5fenum_148',['VMA_RECORD_FLAG_BITS_MAX_ENUM',['../vk__mem__alloc_8h.html#a4dd2c44642312a147a4e93373a6e64d2a20dd17d69966dbffa054739d6090b85e',1,'vk_mem_alloc.h']]],
-  ['vma_5frecord_5fflush_5fafter_5fcall_5fbit_149',['VMA_RECORD_FLUSH_AFTER_CALL_BIT',['../vk__mem__alloc_8h.html#a4dd2c44642312a147a4e93373a6e64d2a8e7ab322e8732654be627c4ea8f36cc7',1,'vk_mem_alloc.h']]],
-  ['vma_5frecording_5fenabled_150',['VMA_RECORDING_ENABLED',['../vk__mem__alloc_8h.html#a1f0c126759fc96ccb6e2d23c101d770c',1,'vk_mem_alloc.h']]],
-  ['vma_5fstats_5fstring_5fenabled_151',['VMA_STATS_STRING_ENABLED',['../vk__mem__alloc_8h.html#ae25f0d55fd91cb166f002b63244800e1',1,'vk_mem_alloc.h']]],
-  ['vma_5fvulkan_5fversion_152',['VMA_VULKAN_VERSION',['../vk__mem__alloc_8h.html#a1a2407c283893638cc039bb31fcd74b6',1,'vk_mem_alloc.h']]],
-  ['vmaallocatememory_153',['vmaAllocateMemory',['../vk__mem__alloc_8h.html#abf28077dbf82d0908b8acbe8ee8dd9b8',1,'vk_mem_alloc.h']]],
-  ['vmaallocatememoryforbuffer_154',['vmaAllocateMemoryForBuffer',['../vk__mem__alloc_8h.html#a7fdf64415b6c3d83c454f28d2c53df7b',1,'vk_mem_alloc.h']]],
-  ['vmaallocatememoryforimage_155',['vmaAllocateMemoryForImage',['../vk__mem__alloc_8h.html#a0faa3f9e5fb233d29d1e00390650febb',1,'vk_mem_alloc.h']]],
-  ['vmaallocatememorypages_156',['vmaAllocateMemoryPages',['../vk__mem__alloc_8h.html#ad37e82e492b3de38fc3f4cffd9ad0ae1',1,'vk_mem_alloc.h']]],
-  ['vmaallocation_157',['VmaAllocation',['../struct_vma_allocation.html',1,'']]],
-  ['vmaallocationcreateflagbits_158',['VmaAllocationCreateFlagBits',['../vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597',1,'VmaAllocationCreateFlagBits():&#160;vk_mem_alloc.h'],['../vk__mem__alloc_8h.html#a4fceecc301f4064dc808d3cd6c038941',1,'VmaAllocationCreateFlagBits():&#160;vk_mem_alloc.h']]],
-  ['vmaallocationcreateflags_159',['VmaAllocationCreateFlags',['../vk__mem__alloc_8h.html#a5225e5e11f8376f6a31a1791f3d6e817',1,'vk_mem_alloc.h']]],
-  ['vmaallocationcreateinfo_160',['VmaAllocationCreateInfo',['../struct_vma_allocation_create_info.html',1,'VmaAllocationCreateInfo'],['../vk__mem__alloc_8h.html#a3bf110892ea2fb4649fedb68488d026a',1,'VmaAllocationCreateInfo():&#160;vk_mem_alloc.h']]],
-  ['vmaallocationinfo_161',['VmaAllocationInfo',['../struct_vma_allocation_info.html',1,'VmaAllocationInfo'],['../vk__mem__alloc_8h.html#a1cf7774606721026a68aabe3af2e5b50',1,'VmaAllocationInfo():&#160;vk_mem_alloc.h']]],
-  ['vmaallocator_162',['VmaAllocator',['../struct_vma_allocator.html',1,'']]],
-  ['vmaallocatorcreateflagbits_163',['VmaAllocatorCreateFlagBits',['../vk__mem__alloc_8h.html#a4f87c9100d154a65a4ad495f7763cf7c',1,'VmaAllocatorCreateFlagBits():&#160;vk_mem_alloc.h'],['../vk__mem__alloc_8h.html#afd73b95e737ee7e76f827cb5472f559f',1,'VmaAllocatorCreateFlagBits():&#160;vk_mem_alloc.h']]],
-  ['vmaallocatorcreateflags_164',['VmaAllocatorCreateFlags',['../vk__mem__alloc_8h.html#acfe6863e160722c2c1bbcf7573fddc4d',1,'vk_mem_alloc.h']]],
-  ['vmaallocatorcreateinfo_165',['VmaAllocatorCreateInfo',['../struct_vma_allocator_create_info.html',1,'VmaAllocatorCreateInfo'],['../vk__mem__alloc_8h.html#aad9652301d33759b83e52d4f3605a14a',1,'VmaAllocatorCreateInfo():&#160;vk_mem_alloc.h']]],
-  ['vmaallocatorinfo_166',['VmaAllocatorInfo',['../struct_vma_allocator_info.html',1,'VmaAllocatorInfo'],['../vk__mem__alloc_8h.html#a1988031b0223fdbd564250fa1edd942c',1,'VmaAllocatorInfo():&#160;vk_mem_alloc.h']]],
-  ['vmabegindefragmentationpass_167',['vmaBeginDefragmentationPass',['../vk__mem__alloc_8h.html#ac0f01545b6262f7d4d128fc8f8e5c77b',1,'vk_mem_alloc.h']]],
-  ['vmabindbuffermemory_168',['vmaBindBufferMemory',['../vk__mem__alloc_8h.html#a6b0929b914b60cf2d45cac4bf3547470',1,'vk_mem_alloc.h']]],
-  ['vmabindbuffermemory2_169',['vmaBindBufferMemory2',['../vk__mem__alloc_8h.html#a927c944f45e0f2941182abb6f608e64a',1,'vk_mem_alloc.h']]],
-  ['vmabindimagememory_170',['vmaBindImageMemory',['../vk__mem__alloc_8h.html#a3d3ca45799923aa5d138e9e5f9eb2da5',1,'vk_mem_alloc.h']]],
-  ['vmabindimagememory2_171',['vmaBindImageMemory2',['../vk__mem__alloc_8h.html#aa8251ee81b0045a443e35b8e8aa021bc',1,'vk_mem_alloc.h']]],
-  ['vmabudget_172',['VmaBudget',['../struct_vma_budget.html',1,'VmaBudget'],['../vk__mem__alloc_8h.html#aa078667e71b1ef24e87a6a30d128381d',1,'VmaBudget():&#160;vk_mem_alloc.h']]],
-  ['vmabuildstatsstring_173',['vmaBuildStatsString',['../vk__mem__alloc_8h.html#aa4fee7eb5253377599ef4fd38c93c2a0',1,'vk_mem_alloc.h']]],
-  ['vmacalculatestats_174',['vmaCalculateStats',['../vk__mem__alloc_8h.html#a333b61c1788cb23559177531e6a93ca3',1,'vk_mem_alloc.h']]],
-  ['vmacheckcorruption_175',['vmaCheckCorruption',['../vk__mem__alloc_8h.html#a49329a7f030dafcf82f7b73334c22e98',1,'vk_mem_alloc.h']]],
-  ['vmacheckpoolcorruption_176',['vmaCheckPoolCorruption',['../vk__mem__alloc_8h.html#ad535935619c7a549bf837e1bb0068f89',1,'vk_mem_alloc.h']]],
-  ['vmacreateallocator_177',['vmaCreateAllocator',['../vk__mem__alloc_8h.html#a200692051ddb34240248234f5f4c17bb',1,'vk_mem_alloc.h']]],
-  ['vmacreatebuffer_178',['vmaCreateBuffer',['../vk__mem__alloc_8h.html#ac72ee55598617e8eecca384e746bab51',1,'vk_mem_alloc.h']]],
-  ['vmacreateimage_179',['vmaCreateImage',['../vk__mem__alloc_8h.html#a02a94f25679275851a53e82eacbcfc73',1,'vk_mem_alloc.h']]],
-  ['vmacreatelostallocation_180',['vmaCreateLostAllocation',['../vk__mem__alloc_8h.html#ae5c9657d9e94756269145b01c05d16f1',1,'vk_mem_alloc.h']]],
-  ['vmacreatepool_181',['vmaCreatePool',['../vk__mem__alloc_8h.html#a5c8770ded7c59c8caac6de0c2cb00b50',1,'vk_mem_alloc.h']]],
-  ['vmadefragment_182',['vmaDefragment',['../vk__mem__alloc_8h.html#a9f0f8f56db5f7f57fe4454f465142dac',1,'vk_mem_alloc.h']]],
-  ['vmadefragmentationbegin_183',['vmaDefragmentationBegin',['../vk__mem__alloc_8h.html#a36ba776fd7fd5cb1e9359fdc0d8e6e8a',1,'vk_mem_alloc.h']]],
-  ['vmadefragmentationcontext_184',['VmaDefragmentationContext',['../struct_vma_defragmentation_context.html',1,'']]],
-  ['vmadefragmentationend_185',['vmaDefragmentationEnd',['../vk__mem__alloc_8h.html#a8774e20e91e245aae959ba63efa15dd2',1,'vk_mem_alloc.h']]],
-  ['vmadefragmentationflagbits_186',['VmaDefragmentationFlagBits',['../vk__mem__alloc_8h.html#a6552a65b71d16f378c6994b3ceaef50c',1,'VmaDefragmentationFlagBits():&#160;vk_mem_alloc.h'],['../vk__mem__alloc_8h.html#a13415cc0b443353a7b5abda300b833fc',1,'VmaDefragmentationFlagBits():&#160;vk_mem_alloc.h']]],
-  ['vmadefragmentationflags_187',['VmaDefragmentationFlags',['../vk__mem__alloc_8h.html#a88a77cef37e5d3c4fc9eb328885d048d',1,'vk_mem_alloc.h']]],
-  ['vmadefragmentationinfo_188',['VmaDefragmentationInfo',['../struct_vma_defragmentation_info.html',1,'VmaDefragmentationInfo'],['../vk__mem__alloc_8h.html#a2bf47f96bf92bed2a49461bd9af3acfa',1,'VmaDefragmentationInfo():&#160;vk_mem_alloc.h']]],
-  ['vmadefragmentationinfo2_189',['VmaDefragmentationInfo2',['../struct_vma_defragmentation_info2.html',1,'VmaDefragmentationInfo2'],['../vk__mem__alloc_8h.html#ad6daeffaa670ce6d11a203a6224c9937',1,'VmaDefragmentationInfo2():&#160;vk_mem_alloc.h']]],
-  ['vmadefragmentationpassinfo_190',['VmaDefragmentationPassInfo',['../struct_vma_defragmentation_pass_info.html',1,'VmaDefragmentationPassInfo'],['../vk__mem__alloc_8h.html#a72aebd522242d56abea67b4f47f6549e',1,'VmaDefragmentationPassInfo():&#160;vk_mem_alloc.h']]],
-  ['vmadefragmentationpassmoveinfo_191',['VmaDefragmentationPassMoveInfo',['../struct_vma_defragmentation_pass_move_info.html',1,'VmaDefragmentationPassMoveInfo'],['../vk__mem__alloc_8h.html#ad6799e8e2b1527abfc84d33bc44aeaf5',1,'VmaDefragmentationPassMoveInfo():&#160;vk_mem_alloc.h']]],
-  ['vmadefragmentationstats_192',['VmaDefragmentationStats',['../struct_vma_defragmentation_stats.html',1,'VmaDefragmentationStats'],['../vk__mem__alloc_8h.html#ad94034192259c2e34a4d1c5e27810403',1,'VmaDefragmentationStats():&#160;vk_mem_alloc.h']]],
-  ['vmadestroyallocator_193',['vmaDestroyAllocator',['../vk__mem__alloc_8h.html#aa8d164061c88f22fb1fd3c8f3534bc1d',1,'vk_mem_alloc.h']]],
-  ['vmadestroybuffer_194',['vmaDestroyBuffer',['../vk__mem__alloc_8h.html#a0d9f4e4ba5bf9aab1f1c746387753d77',1,'vk_mem_alloc.h']]],
-  ['vmadestroyimage_195',['vmaDestroyImage',['../vk__mem__alloc_8h.html#ae50d2cb3b4a3bfd4dd40987234e50e7e',1,'vk_mem_alloc.h']]],
-  ['vmadestroypool_196',['vmaDestroyPool',['../vk__mem__alloc_8h.html#a5485779c8f1948238fc4e92232fa65e1',1,'vk_mem_alloc.h']]],
-  ['vmadevicememorycallbacks_197',['VmaDeviceMemoryCallbacks',['../struct_vma_device_memory_callbacks.html',1,'VmaDeviceMemoryCallbacks'],['../vk__mem__alloc_8h.html#a77692d3c8770ea8882d573206bd27b2b',1,'VmaDeviceMemoryCallbacks():&#160;vk_mem_alloc.h']]],
-  ['vmaenddefragmentationpass_198',['vmaEndDefragmentationPass',['../vk__mem__alloc_8h.html#a1b9ffa538bed905af55c747cc48963bd',1,'vk_mem_alloc.h']]],
-  ['vmafindmemorytypeindex_199',['vmaFindMemoryTypeIndex',['../vk__mem__alloc_8h.html#aef15a94b58fbcb0fe706d5720e84a74a',1,'vk_mem_alloc.h']]],
-  ['vmafindmemorytypeindexforbufferinfo_200',['vmaFindMemoryTypeIndexForBufferInfo',['../vk__mem__alloc_8h.html#ae790ab9ffaf7667fb8f62523e6897888',1,'vk_mem_alloc.h']]],
-  ['vmafindmemorytypeindexforimageinfo_201',['vmaFindMemoryTypeIndexForImageInfo',['../vk__mem__alloc_8h.html#a088da83d8eaf3ce9056d9ea0b981d472',1,'vk_mem_alloc.h']]],
-  ['vmaflushallocation_202',['vmaFlushAllocation',['../vk__mem__alloc_8h.html#a30c37c1eec6025f397be41644f48490f',1,'vk_mem_alloc.h']]],
-  ['vmaflushallocations_203',['vmaFlushAllocations',['../vk__mem__alloc_8h.html#ac3dd00da721875ed99fa8a881922bdfc',1,'vk_mem_alloc.h']]],
-  ['vmafreememory_204',['vmaFreeMemory',['../vk__mem__alloc_8h.html#a5fea5518972ae9094b1526cbcb19b05f',1,'vk_mem_alloc.h']]],
-  ['vmafreememorypages_205',['vmaFreeMemoryPages',['../vk__mem__alloc_8h.html#a834b1e4aef395c0a1d56a28e69a4a17e',1,'vk_mem_alloc.h']]],
-  ['vmafreestatsstring_206',['vmaFreeStatsString',['../vk__mem__alloc_8h.html#a3104eb30d8122c84dd8541063f145288',1,'vk_mem_alloc.h']]],
-  ['vmagetallocationinfo_207',['vmaGetAllocationInfo',['../vk__mem__alloc_8h.html#a86dd08aba8633bfa4ad0df2e76481d8b',1,'vk_mem_alloc.h']]],
-  ['vmagetallocatorinfo_208',['vmaGetAllocatorInfo',['../vk__mem__alloc_8h.html#afa02231a791b37255720d566a52683e7',1,'vk_mem_alloc.h']]],
-  ['vmagetbudget_209',['vmaGetBudget',['../vk__mem__alloc_8h.html#aec0ed24ebea2d0099eed5f801daaefba',1,'vk_mem_alloc.h']]],
-  ['vmagetmemoryproperties_210',['vmaGetMemoryProperties',['../vk__mem__alloc_8h.html#ab88db292a17974f911182543fda52d19',1,'vk_mem_alloc.h']]],
-  ['vmagetmemorytypeproperties_211',['vmaGetMemoryTypeProperties',['../vk__mem__alloc_8h.html#a8701444752eb5de4464adb5a2b514bca',1,'vk_mem_alloc.h']]],
-  ['vmagetphysicaldeviceproperties_212',['vmaGetPhysicalDeviceProperties',['../vk__mem__alloc_8h.html#aecabf7b6e91ea87d0316fa0a9e014fe0',1,'vk_mem_alloc.h']]],
-  ['vmagetpoolname_213',['vmaGetPoolName',['../vk__mem__alloc_8h.html#af09b4e4eafdbee812e8d73ddf960f030',1,'vk_mem_alloc.h']]],
-  ['vmagetpoolstats_214',['vmaGetPoolStats',['../vk__mem__alloc_8h.html#ae8bf76997b234ef68aad922616df4153',1,'vk_mem_alloc.h']]],
-  ['vmainvalidateallocation_215',['vmaInvalidateAllocation',['../vk__mem__alloc_8h.html#aaa8412919139ef413a4215ac6a290fae',1,'vk_mem_alloc.h']]],
-  ['vmainvalidateallocations_216',['vmaInvalidateAllocations',['../vk__mem__alloc_8h.html#ab25b558d75f7378ec944a1522fdcc3c5',1,'vk_mem_alloc.h']]],
-  ['vmamakepoolallocationslost_217',['vmaMakePoolAllocationsLost',['../vk__mem__alloc_8h.html#a736bd6cbda886f36c891727e73bd4024',1,'vk_mem_alloc.h']]],
-  ['vmamapmemory_218',['vmaMapMemory',['../vk__mem__alloc_8h.html#ad5bd1243512d099706de88168992f069',1,'vk_mem_alloc.h']]],
-  ['vmamemoryusage_219',['VmaMemoryUsage',['../vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305cc',1,'VmaMemoryUsage():&#160;vk_mem_alloc.h'],['../vk__mem__alloc_8h.html#a806e8499dde802e59eb72a1dc811c35f',1,'VmaMemoryUsage():&#160;vk_mem_alloc.h']]],
-  ['vmapool_220',['VmaPool',['../struct_vma_pool.html',1,'']]],
-  ['vmapoolcreateflagbits_221',['VmaPoolCreateFlagBits',['../vk__mem__alloc_8h.html#a9a7c45f9c863695d98c83fa5ac940fe7',1,'VmaPoolCreateFlagBits():&#160;vk_mem_alloc.h'],['../vk__mem__alloc_8h.html#a4d4f2efc2509157a9e4ecd4fd7942303',1,'VmaPoolCreateFlagBits():&#160;vk_mem_alloc.h']]],
-  ['vmapoolcreateflags_222',['VmaPoolCreateFlags',['../vk__mem__alloc_8h.html#a2770e325ea42e087c1b91fdf46d0292a',1,'vk_mem_alloc.h']]],
-  ['vmapoolcreateinfo_223',['VmaPoolCreateInfo',['../struct_vma_pool_create_info.html',1,'VmaPoolCreateInfo'],['../vk__mem__alloc_8h.html#a1017aa83489c0eee8d2163d2bf253f67',1,'VmaPoolCreateInfo():&#160;vk_mem_alloc.h']]],
-  ['vmapoolstats_224',['VmaPoolStats',['../struct_vma_pool_stats.html',1,'VmaPoolStats'],['../vk__mem__alloc_8h.html#a4759a2d9f99c19ba7627553c847132f1',1,'VmaPoolStats():&#160;vk_mem_alloc.h']]],
-  ['vmarecordflagbits_225',['VmaRecordFlagBits',['../vk__mem__alloc_8h.html#a4dd2c44642312a147a4e93373a6e64d2',1,'VmaRecordFlagBits():&#160;vk_mem_alloc.h'],['../vk__mem__alloc_8h.html#acd24d5eb58abff7e1f43cb32a1ba1413',1,'VmaRecordFlagBits():&#160;vk_mem_alloc.h']]],
-  ['vmarecordflags_226',['VmaRecordFlags',['../vk__mem__alloc_8h.html#af3929a1a4547c592fc0b0e55ef452828',1,'vk_mem_alloc.h']]],
-  ['vmarecordsettings_227',['VmaRecordSettings',['../struct_vma_record_settings.html',1,'VmaRecordSettings'],['../vk__mem__alloc_8h.html#a16e21c877101493fce582664cd8754fc',1,'VmaRecordSettings():&#160;vk_mem_alloc.h']]],
-  ['vmaresizeallocation_228',['vmaResizeAllocation',['../vk__mem__alloc_8h.html#a0ff488958ca72b28e545880463cb8696',1,'vk_mem_alloc.h']]],
-  ['vmasetallocationuserdata_229',['vmaSetAllocationUserData',['../vk__mem__alloc_8h.html#af9147d31ffc11d62fc187bde283ed14f',1,'vk_mem_alloc.h']]],
-  ['vmasetcurrentframeindex_230',['vmaSetCurrentFrameIndex',['../vk__mem__alloc_8h.html#ade56bf8dc9f5a5eaddf5f119ed525236',1,'vk_mem_alloc.h']]],
-  ['vmasetpoolname_231',['vmaSetPoolName',['../vk__mem__alloc_8h.html#adbae3a0b4ab078024462fc85c37f3b58',1,'vk_mem_alloc.h']]],
-  ['vmastatinfo_232',['VmaStatInfo',['../struct_vma_stat_info.html',1,'VmaStatInfo'],['../vk__mem__alloc_8h.html#aec5b57e29c97b5d69c6d5654d60df878',1,'VmaStatInfo():&#160;vk_mem_alloc.h']]],
-  ['vmastats_233',['VmaStats',['../struct_vma_stats.html',1,'VmaStats'],['../vk__mem__alloc_8h.html#a21813b2efdf3836767a9058cd8a94034',1,'VmaStats():&#160;vk_mem_alloc.h']]],
-  ['vmatouchallocation_234',['vmaTouchAllocation',['../vk__mem__alloc_8h.html#a43d8ba9673c846f049089a5029d5c73a',1,'vk_mem_alloc.h']]],
-  ['vmaunmapmemory_235',['vmaUnmapMemory',['../vk__mem__alloc_8h.html#a9bc268595cb33f6ec4d519cfce81ff45',1,'vk_mem_alloc.h']]],
-  ['vmavulkanfunctions_236',['VmaVulkanFunctions',['../struct_vma_vulkan_functions.html',1,'VmaVulkanFunctions'],['../vk__mem__alloc_8h.html#abb0a8e3b5040d847571cca6c7f9a8074',1,'VmaVulkanFunctions():&#160;vk_mem_alloc.h']]],
-  ['vulkanapiversion_237',['vulkanApiVersion',['../struct_vma_allocator_create_info.html#ae0ffc55139b54520a6bb704b29ffc285',1,'VmaAllocatorCreateInfo']]]
-];
diff --git a/third_party/vulkan_memory_allocator/docs/html/search/all_2.html b/third_party/vulkan_memory_allocator/docs/html/search/all_2.html
index ffa7873..02cfffc 100644
--- a/third_party/vulkan_memory_allocator/docs/html/search/all_2.html
+++ b/third_party/vulkan_memory_allocator/docs/html/search/all_2.html
@@ -1,7 +1,8 @@
 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html><head><title></title>
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head><title></title>
 <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
-<meta name="generator" content="Doxygen 1.8.18"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
 <link rel="stylesheet" type="text/css" href="search.css"/>
 <script type="text/javascript" src="all_2.js"></script>
 <script type="text/javascript" src="search.js"></script>
@@ -10,14 +11,14 @@
 <div id="SRIndex">
 <div class="SRStatus" id="Loading">Loading...</div>
 <div id="SRResults"></div>
-<script type="text/javascript"><!--
+<script type="text/javascript">
 /* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
 createResults();
 /* @license-end */
---></script>
+</script>
 <div class="SRStatus" id="Searching">Searching...</div>
 <div class="SRStatus" id="NoMatches">No Matches</div>
-<script type="text/javascript"><!--
+<script type="text/javascript">
 /* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
 document.getElementById("Loading").style.display="none";
 document.getElementById("NoMatches").style.display="none";
@@ -30,7 +31,7 @@
   }
 });
 /* @license-end */
---></script>
+</script>
 </div>
 </body>
 </html>
diff --git a/third_party/vulkan_memory_allocator/docs/html/search/all_3.html b/third_party/vulkan_memory_allocator/docs/html/search/all_3.html
index f9df19b..39767b8 100644
--- a/third_party/vulkan_memory_allocator/docs/html/search/all_3.html
+++ b/third_party/vulkan_memory_allocator/docs/html/search/all_3.html
@@ -1,7 +1,8 @@
 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html><head><title></title>
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head><title></title>
 <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
-<meta name="generator" content="Doxygen 1.8.18"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
 <link rel="stylesheet" type="text/css" href="search.css"/>
 <script type="text/javascript" src="all_3.js"></script>
 <script type="text/javascript" src="search.js"></script>
@@ -10,14 +11,14 @@
 <div id="SRIndex">
 <div class="SRStatus" id="Loading">Loading...</div>
 <div id="SRResults"></div>
-<script type="text/javascript"><!--
+<script type="text/javascript">
 /* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
 createResults();
 /* @license-end */
---></script>
+</script>
 <div class="SRStatus" id="Searching">Searching...</div>
 <div class="SRStatus" id="NoMatches">No Matches</div>
-<script type="text/javascript"><!--
+<script type="text/javascript">
 /* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
 document.getElementById("Loading").style.display="none";
 document.getElementById("NoMatches").style.display="none";
@@ -30,7 +31,7 @@
   }
 });
 /* @license-end */
---></script>
+</script>
 </div>
 </body>
 </html>
diff --git a/third_party/vulkan_memory_allocator/docs/html/search/all_4.html b/third_party/vulkan_memory_allocator/docs/html/search/all_4.html
index aa2c933..fc40463 100644
--- a/third_party/vulkan_memory_allocator/docs/html/search/all_4.html
+++ b/third_party/vulkan_memory_allocator/docs/html/search/all_4.html
@@ -1,7 +1,8 @@
 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html><head><title></title>
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head><title></title>
 <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
-<meta name="generator" content="Doxygen 1.8.18"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
 <link rel="stylesheet" type="text/css" href="search.css"/>
 <script type="text/javascript" src="all_4.js"></script>
 <script type="text/javascript" src="search.js"></script>
@@ -10,14 +11,14 @@
 <div id="SRIndex">
 <div class="SRStatus" id="Loading">Loading...</div>
 <div id="SRResults"></div>
-<script type="text/javascript"><!--
+<script type="text/javascript">
 /* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
 createResults();
 /* @license-end */
---></script>
+</script>
 <div class="SRStatus" id="Searching">Searching...</div>
 <div class="SRStatus" id="NoMatches">No Matches</div>
-<script type="text/javascript"><!--
+<script type="text/javascript">
 /* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
 document.getElementById("Loading").style.display="none";
 document.getElementById("NoMatches").style.display="none";
@@ -30,7 +31,7 @@
   }
 });
 /* @license-end */
---></script>
+</script>
 </div>
 </body>
 </html>
diff --git a/third_party/vulkan_memory_allocator/docs/html/search/all_5.html b/third_party/vulkan_memory_allocator/docs/html/search/all_5.html
index 71848af..9dd9344 100644
--- a/third_party/vulkan_memory_allocator/docs/html/search/all_5.html
+++ b/third_party/vulkan_memory_allocator/docs/html/search/all_5.html
@@ -1,7 +1,8 @@
 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html><head><title></title>
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head><title></title>
 <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
-<meta name="generator" content="Doxygen 1.8.18"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
 <link rel="stylesheet" type="text/css" href="search.css"/>
 <script type="text/javascript" src="all_5.js"></script>
 <script type="text/javascript" src="search.js"></script>
@@ -10,14 +11,14 @@
 <div id="SRIndex">
 <div class="SRStatus" id="Loading">Loading...</div>
 <div id="SRResults"></div>
-<script type="text/javascript"><!--
+<script type="text/javascript">
 /* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
 createResults();
 /* @license-end */
---></script>
+</script>
 <div class="SRStatus" id="Searching">Searching...</div>
 <div class="SRStatus" id="NoMatches">No Matches</div>
-<script type="text/javascript"><!--
+<script type="text/javascript">
 /* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
 document.getElementById("Loading").style.display="none";
 document.getElementById("NoMatches").style.display="none";
@@ -30,7 +31,7 @@
   }
 });
 /* @license-end */
---></script>
+</script>
 </div>
 </body>
 </html>
diff --git a/third_party/vulkan_memory_allocator/docs/html/search/all_6.html b/third_party/vulkan_memory_allocator/docs/html/search/all_6.html
index a24601b..f1e516d 100644
--- a/third_party/vulkan_memory_allocator/docs/html/search/all_6.html
+++ b/third_party/vulkan_memory_allocator/docs/html/search/all_6.html
@@ -1,7 +1,8 @@
 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html><head><title></title>
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head><title></title>
 <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
-<meta name="generator" content="Doxygen 1.8.18"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
 <link rel="stylesheet" type="text/css" href="search.css"/>
 <script type="text/javascript" src="all_6.js"></script>
 <script type="text/javascript" src="search.js"></script>
@@ -10,14 +11,14 @@
 <div id="SRIndex">
 <div class="SRStatus" id="Loading">Loading...</div>
 <div id="SRResults"></div>
-<script type="text/javascript"><!--
+<script type="text/javascript">
 /* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
 createResults();
 /* @license-end */
---></script>
+</script>
 <div class="SRStatus" id="Searching">Searching...</div>
 <div class="SRStatus" id="NoMatches">No Matches</div>
-<script type="text/javascript"><!--
+<script type="text/javascript">
 /* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
 document.getElementById("Loading").style.display="none";
 document.getElementById("NoMatches").style.display="none";
@@ -30,7 +31,7 @@
   }
 });
 /* @license-end */
---></script>
+</script>
 </div>
 </body>
 </html>
diff --git a/third_party/vulkan_memory_allocator/docs/html/search/all_7.html b/third_party/vulkan_memory_allocator/docs/html/search/all_7.html
index e42e45b..8ddbf6c 100644
--- a/third_party/vulkan_memory_allocator/docs/html/search/all_7.html
+++ b/third_party/vulkan_memory_allocator/docs/html/search/all_7.html
@@ -1,7 +1,8 @@
 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html><head><title></title>
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head><title></title>
 <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
-<meta name="generator" content="Doxygen 1.8.18"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
 <link rel="stylesheet" type="text/css" href="search.css"/>
 <script type="text/javascript" src="all_7.js"></script>
 <script type="text/javascript" src="search.js"></script>
@@ -10,14 +11,14 @@
 <div id="SRIndex">
 <div class="SRStatus" id="Loading">Loading...</div>
 <div id="SRResults"></div>
-<script type="text/javascript"><!--
+<script type="text/javascript">
 /* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
 createResults();
 /* @license-end */
---></script>
+</script>
 <div class="SRStatus" id="Searching">Searching...</div>
 <div class="SRStatus" id="NoMatches">No Matches</div>
-<script type="text/javascript"><!--
+<script type="text/javascript">
 /* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
 document.getElementById("Loading").style.display="none";
 document.getElementById("NoMatches").style.display="none";
@@ -30,7 +31,7 @@
   }
 });
 /* @license-end */
---></script>
+</script>
 </div>
 </body>
 </html>
diff --git a/third_party/vulkan_memory_allocator/docs/html/search/all_8.html b/third_party/vulkan_memory_allocator/docs/html/search/all_8.html
index 888e619..83c55ae 100644
--- a/third_party/vulkan_memory_allocator/docs/html/search/all_8.html
+++ b/third_party/vulkan_memory_allocator/docs/html/search/all_8.html
@@ -1,7 +1,8 @@
 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html><head><title></title>
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head><title></title>
 <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
-<meta name="generator" content="Doxygen 1.8.18"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
 <link rel="stylesheet" type="text/css" href="search.css"/>
 <script type="text/javascript" src="all_8.js"></script>
 <script type="text/javascript" src="search.js"></script>
@@ -10,14 +11,14 @@
 <div id="SRIndex">
 <div class="SRStatus" id="Loading">Loading...</div>
 <div id="SRResults"></div>
-<script type="text/javascript"><!--
+<script type="text/javascript">
 /* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
 createResults();
 /* @license-end */
---></script>
+</script>
 <div class="SRStatus" id="Searching">Searching...</div>
 <div class="SRStatus" id="NoMatches">No Matches</div>
-<script type="text/javascript"><!--
+<script type="text/javascript">
 /* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
 document.getElementById("Loading").style.display="none";
 document.getElementById("NoMatches").style.display="none";
@@ -30,7 +31,7 @@
   }
 });
 /* @license-end */
---></script>
+</script>
 </div>
 </body>
 </html>
diff --git a/third_party/vulkan_memory_allocator/docs/html/search/all_9.html b/third_party/vulkan_memory_allocator/docs/html/search/all_9.html
index dc988f4..1e263c1 100644
--- a/third_party/vulkan_memory_allocator/docs/html/search/all_9.html
+++ b/third_party/vulkan_memory_allocator/docs/html/search/all_9.html
@@ -1,7 +1,8 @@
 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html><head><title></title>
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head><title></title>
 <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
-<meta name="generator" content="Doxygen 1.8.18"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
 <link rel="stylesheet" type="text/css" href="search.css"/>
 <script type="text/javascript" src="all_9.js"></script>
 <script type="text/javascript" src="search.js"></script>
@@ -10,14 +11,14 @@
 <div id="SRIndex">
 <div class="SRStatus" id="Loading">Loading...</div>
 <div id="SRResults"></div>
-<script type="text/javascript"><!--
+<script type="text/javascript">
 /* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
 createResults();
 /* @license-end */
---></script>
+</script>
 <div class="SRStatus" id="Searching">Searching...</div>
 <div class="SRStatus" id="NoMatches">No Matches</div>
-<script type="text/javascript"><!--
+<script type="text/javascript">
 /* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
 document.getElementById("Loading").style.display="none";
 document.getElementById("NoMatches").style.display="none";
@@ -30,7 +31,7 @@
   }
 });
 /* @license-end */
---></script>
+</script>
 </div>
 </body>
 </html>
diff --git a/third_party/vulkan_memory_allocator/docs/html/search/all_a.html b/third_party/vulkan_memory_allocator/docs/html/search/all_a.html
index 0ce816b..3a6cac1 100644
--- a/third_party/vulkan_memory_allocator/docs/html/search/all_a.html
+++ b/third_party/vulkan_memory_allocator/docs/html/search/all_a.html
@@ -1,7 +1,8 @@
 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html><head><title></title>
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head><title></title>
 <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
-<meta name="generator" content="Doxygen 1.8.18"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
 <link rel="stylesheet" type="text/css" href="search.css"/>
 <script type="text/javascript" src="all_a.js"></script>
 <script type="text/javascript" src="search.js"></script>
@@ -10,14 +11,14 @@
 <div id="SRIndex">
 <div class="SRStatus" id="Loading">Loading...</div>
 <div id="SRResults"></div>
-<script type="text/javascript"><!--
+<script type="text/javascript">
 /* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
 createResults();
 /* @license-end */
---></script>
+</script>
 <div class="SRStatus" id="Searching">Searching...</div>
 <div class="SRStatus" id="NoMatches">No Matches</div>
-<script type="text/javascript"><!--
+<script type="text/javascript">
 /* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
 document.getElementById("Loading").style.display="none";
 document.getElementById("NoMatches").style.display="none";
@@ -30,7 +31,7 @@
   }
 });
 /* @license-end */
---></script>
+</script>
 </div>
 </body>
 </html>
diff --git a/third_party/vulkan_memory_allocator/docs/html/search/all_a.js b/third_party/vulkan_memory_allocator/docs/html/search/all_a.js
index 3b32bbf..4612195 100644
--- a/third_party/vulkan_memory_allocator/docs/html/search/all_a.js
+++ b/third_party/vulkan_memory_allocator/docs/html/search/all_a.js
@@ -1,4 +1,4 @@
 var searchData=
 [
-  ['nominmax_45',['NOMINMAX',['../vk__mem__alloc_8h.html#a9f918755b601cf4bffca775992e6fb90',1,'vk_mem_alloc.h']]]
+  ['offset_45',['offset',['../struct_vma_allocation_info.html#a4a3c732388dbdc7a23f9365b00825268',1,'VmaAllocationInfo::offset()'],['../struct_vma_defragmentation_pass_move_info.html#a8ab4508bc03625b0653c880576be96c6',1,'VmaDefragmentationPassMoveInfo::offset()']]]
 ];
diff --git a/third_party/vulkan_memory_allocator/docs/html/search/all_b.html b/third_party/vulkan_memory_allocator/docs/html/search/all_b.html
index 28c2413..130deb4 100644
--- a/third_party/vulkan_memory_allocator/docs/html/search/all_b.html
+++ b/third_party/vulkan_memory_allocator/docs/html/search/all_b.html
@@ -1,7 +1,8 @@
 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html><head><title></title>
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head><title></title>
 <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
-<meta name="generator" content="Doxygen 1.8.18"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
 <link rel="stylesheet" type="text/css" href="search.css"/>
 <script type="text/javascript" src="all_b.js"></script>
 <script type="text/javascript" src="search.js"></script>
@@ -10,14 +11,14 @@
 <div id="SRIndex">
 <div class="SRStatus" id="Loading">Loading...</div>
 <div id="SRResults"></div>
-<script type="text/javascript"><!--
+<script type="text/javascript">
 /* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
 createResults();
 /* @license-end */
---></script>
+</script>
 <div class="SRStatus" id="Searching">Searching...</div>
 <div class="SRStatus" id="NoMatches">No Matches</div>
-<script type="text/javascript"><!--
+<script type="text/javascript">
 /* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
 document.getElementById("Loading").style.display="none";
 document.getElementById("NoMatches").style.display="none";
@@ -30,7 +31,7 @@
   }
 });
 /* @license-end */
---></script>
+</script>
 </div>
 </body>
 </html>
diff --git a/third_party/vulkan_memory_allocator/docs/html/search/all_b.js b/third_party/vulkan_memory_allocator/docs/html/search/all_b.js
index 25ff2bb..9907bb7 100644
--- a/third_party/vulkan_memory_allocator/docs/html/search/all_b.js
+++ b/third_party/vulkan_memory_allocator/docs/html/search/all_b.js
@@ -1,4 +1,25 @@
 var searchData=
 [
-  ['offset_46',['offset',['../struct_vma_allocation_info.html#a4a3c732388dbdc7a23f9365b00825268',1,'VmaAllocationInfo::offset()'],['../struct_vma_defragmentation_pass_move_info.html#a8ab4508bc03625b0653c880576be96c6',1,'VmaDefragmentationPassMoveInfo::offset()']]]
+  ['pallocationcallbacks_46',['pAllocationCallbacks',['../struct_vma_allocator_create_info.html#a6e409087e3be55400d0e4ccbe43c608d',1,'VmaAllocatorCreateInfo']]],
+  ['pallocations_47',['pAllocations',['../struct_vma_defragmentation_info2.html#ab6d288f29d028156cf73542d630a2e32',1,'VmaDefragmentationInfo2']]],
+  ['pallocationschanged_48',['pAllocationsChanged',['../struct_vma_defragmentation_info2.html#a76d51a644dc7f5405d0cdd0025ecd0cc',1,'VmaDefragmentationInfo2']]],
+  ['pdevicememorycallbacks_49',['pDeviceMemoryCallbacks',['../struct_vma_allocator_create_info.html#af1380969b5e1ea4c3184a877892d260e',1,'VmaAllocatorCreateInfo']]],
+  ['pfilepath_50',['pFilePath',['../struct_vma_record_settings.html#a6cb1fdbf6bcb610b68f2010dd629e89d',1,'VmaRecordSettings']]],
+  ['pfn_5fvmaallocatedevicememoryfunction_51',['PFN_vmaAllocateDeviceMemoryFunction',['../vk__mem__alloc_8h.html#a7e1ed85f7799600b03ad51a77acc21f3',1,'vk_mem_alloc.h']]],
+  ['pfn_5fvmafreedevicememoryfunction_52',['PFN_vmaFreeDeviceMemoryFunction',['../vk__mem__alloc_8h.html#a154ccaaf53dc2c36378f80f0c4f3679b',1,'vk_mem_alloc.h']]],
+  ['pfnallocate_53',['pfnAllocate',['../struct_vma_device_memory_callbacks.html#a4f17f7b255101e733b44d5633aceabfb',1,'VmaDeviceMemoryCallbacks']]],
+  ['pfnfree_54',['pfnFree',['../struct_vma_device_memory_callbacks.html#abe8a3328bbc916f6f712fdb6b299444c',1,'VmaDeviceMemoryCallbacks']]],
+  ['pheapsizelimit_55',['pHeapSizeLimit',['../struct_vma_allocator_create_info.html#a31c192aa6cbffa33279f6d9f0c47c44b',1,'VmaAllocatorCreateInfo']]],
+  ['physicaldevice_56',['physicalDevice',['../struct_vma_allocator_create_info.html#a08230f04ae6ccf8a78150a9e829a7156',1,'VmaAllocatorCreateInfo::physicalDevice()'],['../struct_vma_allocator_info.html#aba2b703f96e51d567717e1fb2935b47a',1,'VmaAllocatorInfo::physicalDevice()']]],
+  ['pmappeddata_57',['pMappedData',['../struct_vma_allocation_info.html#a5eeffbe2d2f30f53370ff14aefbadbe2',1,'VmaAllocationInfo']]],
+  ['pmoves_58',['pMoves',['../struct_vma_defragmentation_pass_info.html#acbd42d4a3357999da130a95cd99a3792',1,'VmaDefragmentationPassInfo']]],
+  ['pool_59',['pool',['../struct_vma_allocation_create_info.html#a6272c0555cfd1fe28bff1afeb6190150',1,'VmaAllocationCreateInfo']]],
+  ['poolcount_60',['poolCount',['../struct_vma_defragmentation_info2.html#a7e70aa2a1081d849dcc7829b19d3ec9d',1,'VmaDefragmentationInfo2']]],
+  ['ppools_61',['pPools',['../struct_vma_defragmentation_info2.html#a3c9c6aa5c97d5670f8e362b3a6f3029b',1,'VmaDefragmentationInfo2']]],
+  ['precordsettings_62',['pRecordSettings',['../struct_vma_allocator_create_info.html#ace2aa4877b16a42b0b7673d4e26000ee',1,'VmaAllocatorCreateInfo']]],
+  ['preferredflags_63',['preferredFlags',['../struct_vma_allocation_create_info.html#a7fe8d81a1ad10b2a2faacacee5b15d6d',1,'VmaAllocationCreateInfo']]],
+  ['preferredlargeheapblocksize_64',['preferredLargeHeapBlockSize',['../struct_vma_allocator_create_info.html#a8e4714298e3121cdd8b214a1ae7a637a',1,'VmaAllocatorCreateInfo']]],
+  ['priority_65',['priority',['../struct_vma_allocation_create_info.html#a983d39e1a2e63649d78a960aa2fdd0f7',1,'VmaAllocationCreateInfo::priority()'],['../struct_vma_pool_create_info.html#a16e686c688f6725f119ebf6e24ab5274',1,'VmaPoolCreateInfo::priority()']]],
+  ['puserdata_66',['pUserData',['../struct_vma_device_memory_callbacks.html#a24052de0937ddd54015a2df0363903c6',1,'VmaDeviceMemoryCallbacks::pUserData()'],['../struct_vma_allocation_create_info.html#a8259e85c272683434f4abb4ddddffe19',1,'VmaAllocationCreateInfo::pUserData()'],['../struct_vma_allocation_info.html#adc507656149c04de7ed95d0042ba2a13',1,'VmaAllocationInfo::pUserData()']]],
+  ['pvulkanfunctions_67',['pVulkanFunctions',['../struct_vma_allocator_create_info.html#a3dc197be3227da7338b1643f70db36bd',1,'VmaAllocatorCreateInfo']]]
 ];
diff --git a/third_party/vulkan_memory_allocator/docs/html/search/all_c.html b/third_party/vulkan_memory_allocator/docs/html/search/all_c.html
index 39fc49b..3dd5af0 100644
--- a/third_party/vulkan_memory_allocator/docs/html/search/all_c.html
+++ b/third_party/vulkan_memory_allocator/docs/html/search/all_c.html
@@ -1,7 +1,8 @@
 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html><head><title></title>
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head><title></title>
 <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
-<meta name="generator" content="Doxygen 1.8.18"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
 <link rel="stylesheet" type="text/css" href="search.css"/>
 <script type="text/javascript" src="all_c.js"></script>
 <script type="text/javascript" src="search.js"></script>
@@ -10,14 +11,14 @@
 <div id="SRIndex">
 <div class="SRStatus" id="Loading">Loading...</div>
 <div id="SRResults"></div>
-<script type="text/javascript"><!--
+<script type="text/javascript">
 /* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
 createResults();
 /* @license-end */
---></script>
+</script>
 <div class="SRStatus" id="Searching">Searching...</div>
 <div class="SRStatus" id="NoMatches">No Matches</div>
-<script type="text/javascript"><!--
+<script type="text/javascript">
 /* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
 document.getElementById("Loading").style.display="none";
 document.getElementById("NoMatches").style.display="none";
@@ -30,7 +31,7 @@
   }
 });
 /* @license-end */
---></script>
+</script>
 </div>
 </body>
 </html>
diff --git a/third_party/vulkan_memory_allocator/docs/html/search/all_c.js b/third_party/vulkan_memory_allocator/docs/html/search/all_c.js
index 7a5b1d2..d58e218 100644
--- a/third_party/vulkan_memory_allocator/docs/html/search/all_c.js
+++ b/third_party/vulkan_memory_allocator/docs/html/search/all_c.js
@@ -1,24 +1,4 @@
 var searchData=
 [
-  ['pallocationcallbacks_47',['pAllocationCallbacks',['../struct_vma_allocator_create_info.html#a6e409087e3be55400d0e4ccbe43c608d',1,'VmaAllocatorCreateInfo']]],
-  ['pallocations_48',['pAllocations',['../struct_vma_defragmentation_info2.html#ab6d288f29d028156cf73542d630a2e32',1,'VmaDefragmentationInfo2']]],
-  ['pallocationschanged_49',['pAllocationsChanged',['../struct_vma_defragmentation_info2.html#a76d51a644dc7f5405d0cdd0025ecd0cc',1,'VmaDefragmentationInfo2']]],
-  ['pdevicememorycallbacks_50',['pDeviceMemoryCallbacks',['../struct_vma_allocator_create_info.html#af1380969b5e1ea4c3184a877892d260e',1,'VmaAllocatorCreateInfo']]],
-  ['pfilepath_51',['pFilePath',['../struct_vma_record_settings.html#a6cb1fdbf6bcb610b68f2010dd629e89d',1,'VmaRecordSettings']]],
-  ['pfn_5fvmaallocatedevicememoryfunction_52',['PFN_vmaAllocateDeviceMemoryFunction',['../vk__mem__alloc_8h.html#a7e1ed85f7799600b03ad51a77acc21f3',1,'vk_mem_alloc.h']]],
-  ['pfn_5fvmafreedevicememoryfunction_53',['PFN_vmaFreeDeviceMemoryFunction',['../vk__mem__alloc_8h.html#a154ccaaf53dc2c36378f80f0c4f3679b',1,'vk_mem_alloc.h']]],
-  ['pfnallocate_54',['pfnAllocate',['../struct_vma_device_memory_callbacks.html#a4f17f7b255101e733b44d5633aceabfb',1,'VmaDeviceMemoryCallbacks']]],
-  ['pfnfree_55',['pfnFree',['../struct_vma_device_memory_callbacks.html#abe8a3328bbc916f6f712fdb6b299444c',1,'VmaDeviceMemoryCallbacks']]],
-  ['pheapsizelimit_56',['pHeapSizeLimit',['../struct_vma_allocator_create_info.html#a31c192aa6cbffa33279f6d9f0c47c44b',1,'VmaAllocatorCreateInfo']]],
-  ['physicaldevice_57',['physicalDevice',['../struct_vma_allocator_create_info.html#a08230f04ae6ccf8a78150a9e829a7156',1,'VmaAllocatorCreateInfo::physicalDevice()'],['../struct_vma_allocator_info.html#aba2b703f96e51d567717e1fb2935b47a',1,'VmaAllocatorInfo::physicalDevice()']]],
-  ['pmappeddata_58',['pMappedData',['../struct_vma_allocation_info.html#a5eeffbe2d2f30f53370ff14aefbadbe2',1,'VmaAllocationInfo']]],
-  ['pmoves_59',['pMoves',['../struct_vma_defragmentation_pass_info.html#acbd42d4a3357999da130a95cd99a3792',1,'VmaDefragmentationPassInfo']]],
-  ['pool_60',['pool',['../struct_vma_allocation_create_info.html#a6272c0555cfd1fe28bff1afeb6190150',1,'VmaAllocationCreateInfo']]],
-  ['poolcount_61',['poolCount',['../struct_vma_defragmentation_info2.html#a7e70aa2a1081d849dcc7829b19d3ec9d',1,'VmaDefragmentationInfo2']]],
-  ['ppools_62',['pPools',['../struct_vma_defragmentation_info2.html#a3c9c6aa5c97d5670f8e362b3a6f3029b',1,'VmaDefragmentationInfo2']]],
-  ['precordsettings_63',['pRecordSettings',['../struct_vma_allocator_create_info.html#ace2aa4877b16a42b0b7673d4e26000ee',1,'VmaAllocatorCreateInfo']]],
-  ['preferredflags_64',['preferredFlags',['../struct_vma_allocation_create_info.html#a7fe8d81a1ad10b2a2faacacee5b15d6d',1,'VmaAllocationCreateInfo']]],
-  ['preferredlargeheapblocksize_65',['preferredLargeHeapBlockSize',['../struct_vma_allocator_create_info.html#a8e4714298e3121cdd8b214a1ae7a637a',1,'VmaAllocatorCreateInfo']]],
-  ['puserdata_66',['pUserData',['../struct_vma_device_memory_callbacks.html#a24052de0937ddd54015a2df0363903c6',1,'VmaDeviceMemoryCallbacks::pUserData()'],['../struct_vma_allocation_create_info.html#a8259e85c272683434f4abb4ddddffe19',1,'VmaAllocationCreateInfo::pUserData()'],['../struct_vma_allocation_info.html#adc507656149c04de7ed95d0042ba2a13',1,'VmaAllocationInfo::pUserData()']]],
-  ['pvulkanfunctions_67',['pVulkanFunctions',['../struct_vma_allocator_create_info.html#a3dc197be3227da7338b1643f70db36bd',1,'VmaAllocatorCreateInfo']]]
+  ['quick_20start_68',['Quick start',['../quick_start.html',1,'index']]]
 ];
diff --git a/third_party/vulkan_memory_allocator/docs/html/search/all_d.html b/third_party/vulkan_memory_allocator/docs/html/search/all_d.html
index cc470e5..af7f2f0 100644
--- a/third_party/vulkan_memory_allocator/docs/html/search/all_d.html
+++ b/third_party/vulkan_memory_allocator/docs/html/search/all_d.html
@@ -1,7 +1,8 @@
 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html><head><title></title>
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head><title></title>
 <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
-<meta name="generator" content="Doxygen 1.8.18"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
 <link rel="stylesheet" type="text/css" href="search.css"/>
 <script type="text/javascript" src="all_d.js"></script>
 <script type="text/javascript" src="search.js"></script>
@@ -10,14 +11,14 @@
 <div id="SRIndex">
 <div class="SRStatus" id="Loading">Loading...</div>
 <div id="SRResults"></div>
-<script type="text/javascript"><!--
+<script type="text/javascript">
 /* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
 createResults();
 /* @license-end */
---></script>
+</script>
 <div class="SRStatus" id="Searching">Searching...</div>
 <div class="SRStatus" id="NoMatches">No Matches</div>
-<script type="text/javascript"><!--
+<script type="text/javascript">
 /* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
 document.getElementById("Loading").style.display="none";
 document.getElementById("NoMatches").style.display="none";
@@ -30,7 +31,7 @@
   }
 });
 /* @license-end */
---></script>
+</script>
 </div>
 </body>
 </html>
diff --git a/third_party/vulkan_memory_allocator/docs/html/search/all_d.js b/third_party/vulkan_memory_allocator/docs/html/search/all_d.js
index d58e218..1d3630a 100644
--- a/third_party/vulkan_memory_allocator/docs/html/search/all_d.js
+++ b/third_party/vulkan_memory_allocator/docs/html/search/all_d.js
@@ -1,4 +1,7 @@
 var searchData=
 [
-  ['quick_20start_68',['Quick start',['../quick_start.html',1,'index']]]
+  ['recommended_20usage_20patterns_69',['Recommended usage patterns',['../usage_patterns.html',1,'index']]],
+  ['record_20and_20replay_70',['Record and replay',['../record_and_replay.html',1,'index']]],
+  ['requiredflags_71',['requiredFlags',['../struct_vma_allocation_create_info.html#a9166390303ff42d783305bc31c2b6b90',1,'VmaAllocationCreateInfo']]],
+  ['resource_20aliasing_20_28overlap_29_72',['Resource aliasing (overlap)',['../resource_aliasing.html',1,'index']]]
 ];
diff --git a/third_party/vulkan_memory_allocator/docs/html/search/all_e.html b/third_party/vulkan_memory_allocator/docs/html/search/all_e.html
index 57cce76..e25df42 100644
--- a/third_party/vulkan_memory_allocator/docs/html/search/all_e.html
+++ b/third_party/vulkan_memory_allocator/docs/html/search/all_e.html
@@ -1,7 +1,8 @@
 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html><head><title></title>
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head><title></title>
 <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
-<meta name="generator" content="Doxygen 1.8.18"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
 <link rel="stylesheet" type="text/css" href="search.css"/>
 <script type="text/javascript" src="all_e.js"></script>
 <script type="text/javascript" src="search.js"></script>
@@ -10,14 +11,14 @@
 <div id="SRIndex">
 <div class="SRStatus" id="Loading">Loading...</div>
 <div id="SRResults"></div>
-<script type="text/javascript"><!--
+<script type="text/javascript">
 /* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
 createResults();
 /* @license-end */
---></script>
+</script>
 <div class="SRStatus" id="Searching">Searching...</div>
 <div class="SRStatus" id="NoMatches">No Matches</div>
-<script type="text/javascript"><!--
+<script type="text/javascript">
 /* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
 document.getElementById("Loading").style.display="none";
 document.getElementById("NoMatches").style.display="none";
@@ -30,7 +31,7 @@
   }
 });
 /* @license-end */
---></script>
+</script>
 </div>
 </body>
 </html>
diff --git a/third_party/vulkan_memory_allocator/docs/html/search/all_e.js b/third_party/vulkan_memory_allocator/docs/html/search/all_e.js
index 09d81d2..03fa2d8 100644
--- a/third_party/vulkan_memory_allocator/docs/html/search/all_e.js
+++ b/third_party/vulkan_memory_allocator/docs/html/search/all_e.js
@@ -1,6 +1,6 @@
 var searchData=
 [
-  ['record_20and_20replay_69',['Record and replay',['../record_and_replay.html',1,'index']]],
-  ['requiredflags_70',['requiredFlags',['../struct_vma_allocation_create_info.html#a9166390303ff42d783305bc31c2b6b90',1,'VmaAllocationCreateInfo']]],
-  ['recommended_20usage_20patterns_71',['Recommended usage patterns',['../usage_patterns.html',1,'index']]]
+  ['size_73',['size',['../struct_vma_pool_stats.html#a326807b2de2b0931cee4ed9a5f2e420c',1,'VmaPoolStats::size()'],['../struct_vma_allocation_info.html#aac76d113a6a5ccbb09fea00fb25fd18f',1,'VmaAllocationInfo::size()']]],
+  ['statistics_74',['Statistics',['../statistics.html',1,'index']]],
+  ['staying_20within_20budget_75',['Staying within budget',['../staying_within_budget.html',1,'index']]]
 ];
diff --git a/third_party/vulkan_memory_allocator/docs/html/search/all_f.html b/third_party/vulkan_memory_allocator/docs/html/search/all_f.html
index ac1e704..b23da6c 100644
--- a/third_party/vulkan_memory_allocator/docs/html/search/all_f.html
+++ b/third_party/vulkan_memory_allocator/docs/html/search/all_f.html
@@ -1,7 +1,8 @@
 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html><head><title></title>
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head><title></title>
 <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
-<meta name="generator" content="Doxygen 1.8.18"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
 <link rel="stylesheet" type="text/css" href="search.css"/>
 <script type="text/javascript" src="all_f.js"></script>
 <script type="text/javascript" src="search.js"></script>
@@ -10,14 +11,14 @@
 <div id="SRIndex">
 <div class="SRStatus" id="Loading">Loading...</div>
 <div id="SRResults"></div>
-<script type="text/javascript"><!--
+<script type="text/javascript">
 /* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
 createResults();
 /* @license-end */
---></script>
+</script>
 <div class="SRStatus" id="Searching">Searching...</div>
 <div class="SRStatus" id="NoMatches">No Matches</div>
-<script type="text/javascript"><!--
+<script type="text/javascript">
 /* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
 document.getElementById("Loading").style.display="none";
 document.getElementById("NoMatches").style.display="none";
@@ -30,7 +31,7 @@
   }
 });
 /* @license-end */
---></script>
+</script>
 </div>
 </body>
 </html>
diff --git a/third_party/vulkan_memory_allocator/docs/html/search/all_f.js b/third_party/vulkan_memory_allocator/docs/html/search/all_f.js
index 20d416e..be734f5 100644
--- a/third_party/vulkan_memory_allocator/docs/html/search/all_f.js
+++ b/third_party/vulkan_memory_allocator/docs/html/search/all_f.js
@@ -1,6 +1,4 @@
 var searchData=
 [
-  ['size_72',['size',['../struct_vma_pool_stats.html#a326807b2de2b0931cee4ed9a5f2e420c',1,'VmaPoolStats::size()'],['../struct_vma_allocation_info.html#aac76d113a6a5ccbb09fea00fb25fd18f',1,'VmaAllocationInfo::size()']]],
-  ['statistics_73',['Statistics',['../statistics.html',1,'index']]],
-  ['staying_20within_20budget_74',['Staying within budget',['../staying_within_budget.html',1,'index']]]
+  ['total_76',['total',['../struct_vma_stats.html#a2e8f5b3353f2fefef3c27f29e245a1f9',1,'VmaStats']]]
 ];
diff --git a/third_party/vulkan_memory_allocator/docs/html/search/classes_0.html b/third_party/vulkan_memory_allocator/docs/html/search/classes_0.html
index 5b441a3..af8159e 100644
--- a/third_party/vulkan_memory_allocator/docs/html/search/classes_0.html
+++ b/third_party/vulkan_memory_allocator/docs/html/search/classes_0.html
@@ -1,7 +1,8 @@
 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html><head><title></title>
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head><title></title>
 <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
-<meta name="generator" content="Doxygen 1.8.18"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
 <link rel="stylesheet" type="text/css" href="search.css"/>
 <script type="text/javascript" src="classes_0.js"></script>
 <script type="text/javascript" src="search.js"></script>
@@ -10,14 +11,14 @@
 <div id="SRIndex">
 <div class="SRStatus" id="Loading">Loading...</div>
 <div id="SRResults"></div>
-<script type="text/javascript"><!--
+<script type="text/javascript">
 /* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
 createResults();
 /* @license-end */
---></script>
+</script>
 <div class="SRStatus" id="Searching">Searching...</div>
 <div class="SRStatus" id="NoMatches">No Matches</div>
-<script type="text/javascript"><!--
+<script type="text/javascript">
 /* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
 document.getElementById("Loading").style.display="none";
 document.getElementById("NoMatches").style.display="none";
@@ -30,7 +31,7 @@
   }
 });
 /* @license-end */
---></script>
+</script>
 </div>
 </body>
 </html>
diff --git a/third_party/vulkan_memory_allocator/docs/html/search/classes_0.js b/third_party/vulkan_memory_allocator/docs/html/search/classes_0.js
index 71d8cb1..f7b0e84 100644
--- a/third_party/vulkan_memory_allocator/docs/html/search/classes_0.js
+++ b/third_party/vulkan_memory_allocator/docs/html/search/classes_0.js
@@ -1,24 +1,24 @@
 var searchData=
 [
-  ['vmaallocation_238',['VmaAllocation',['../struct_vma_allocation.html',1,'']]],
-  ['vmaallocationcreateinfo_239',['VmaAllocationCreateInfo',['../struct_vma_allocation_create_info.html',1,'']]],
-  ['vmaallocationinfo_240',['VmaAllocationInfo',['../struct_vma_allocation_info.html',1,'']]],
-  ['vmaallocator_241',['VmaAllocator',['../struct_vma_allocator.html',1,'']]],
-  ['vmaallocatorcreateinfo_242',['VmaAllocatorCreateInfo',['../struct_vma_allocator_create_info.html',1,'']]],
-  ['vmaallocatorinfo_243',['VmaAllocatorInfo',['../struct_vma_allocator_info.html',1,'']]],
-  ['vmabudget_244',['VmaBudget',['../struct_vma_budget.html',1,'']]],
-  ['vmadefragmentationcontext_245',['VmaDefragmentationContext',['../struct_vma_defragmentation_context.html',1,'']]],
-  ['vmadefragmentationinfo_246',['VmaDefragmentationInfo',['../struct_vma_defragmentation_info.html',1,'']]],
-  ['vmadefragmentationinfo2_247',['VmaDefragmentationInfo2',['../struct_vma_defragmentation_info2.html',1,'']]],
-  ['vmadefragmentationpassinfo_248',['VmaDefragmentationPassInfo',['../struct_vma_defragmentation_pass_info.html',1,'']]],
-  ['vmadefragmentationpassmoveinfo_249',['VmaDefragmentationPassMoveInfo',['../struct_vma_defragmentation_pass_move_info.html',1,'']]],
-  ['vmadefragmentationstats_250',['VmaDefragmentationStats',['../struct_vma_defragmentation_stats.html',1,'']]],
-  ['vmadevicememorycallbacks_251',['VmaDeviceMemoryCallbacks',['../struct_vma_device_memory_callbacks.html',1,'']]],
-  ['vmapool_252',['VmaPool',['../struct_vma_pool.html',1,'']]],
-  ['vmapoolcreateinfo_253',['VmaPoolCreateInfo',['../struct_vma_pool_create_info.html',1,'']]],
-  ['vmapoolstats_254',['VmaPoolStats',['../struct_vma_pool_stats.html',1,'']]],
-  ['vmarecordsettings_255',['VmaRecordSettings',['../struct_vma_record_settings.html',1,'']]],
-  ['vmastatinfo_256',['VmaStatInfo',['../struct_vma_stat_info.html',1,'']]],
-  ['vmastats_257',['VmaStats',['../struct_vma_stats.html',1,'']]],
-  ['vmavulkanfunctions_258',['VmaVulkanFunctions',['../struct_vma_vulkan_functions.html',1,'']]]
+  ['vmaallocation_240',['VmaAllocation',['../struct_vma_allocation.html',1,'']]],
+  ['vmaallocationcreateinfo_241',['VmaAllocationCreateInfo',['../struct_vma_allocation_create_info.html',1,'']]],
+  ['vmaallocationinfo_242',['VmaAllocationInfo',['../struct_vma_allocation_info.html',1,'']]],
+  ['vmaallocator_243',['VmaAllocator',['../struct_vma_allocator.html',1,'']]],
+  ['vmaallocatorcreateinfo_244',['VmaAllocatorCreateInfo',['../struct_vma_allocator_create_info.html',1,'']]],
+  ['vmaallocatorinfo_245',['VmaAllocatorInfo',['../struct_vma_allocator_info.html',1,'']]],
+  ['vmabudget_246',['VmaBudget',['../struct_vma_budget.html',1,'']]],
+  ['vmadefragmentationcontext_247',['VmaDefragmentationContext',['../struct_vma_defragmentation_context.html',1,'']]],
+  ['vmadefragmentationinfo_248',['VmaDefragmentationInfo',['../struct_vma_defragmentation_info.html',1,'']]],
+  ['vmadefragmentationinfo2_249',['VmaDefragmentationInfo2',['../struct_vma_defragmentation_info2.html',1,'']]],
+  ['vmadefragmentationpassinfo_250',['VmaDefragmentationPassInfo',['../struct_vma_defragmentation_pass_info.html',1,'']]],
+  ['vmadefragmentationpassmoveinfo_251',['VmaDefragmentationPassMoveInfo',['../struct_vma_defragmentation_pass_move_info.html',1,'']]],
+  ['vmadefragmentationstats_252',['VmaDefragmentationStats',['../struct_vma_defragmentation_stats.html',1,'']]],
+  ['vmadevicememorycallbacks_253',['VmaDeviceMemoryCallbacks',['../struct_vma_device_memory_callbacks.html',1,'']]],
+  ['vmapool_254',['VmaPool',['../struct_vma_pool.html',1,'']]],
+  ['vmapoolcreateinfo_255',['VmaPoolCreateInfo',['../struct_vma_pool_create_info.html',1,'']]],
+  ['vmapoolstats_256',['VmaPoolStats',['../struct_vma_pool_stats.html',1,'']]],
+  ['vmarecordsettings_257',['VmaRecordSettings',['../struct_vma_record_settings.html',1,'']]],
+  ['vmastatinfo_258',['VmaStatInfo',['../struct_vma_stat_info.html',1,'']]],
+  ['vmastats_259',['VmaStats',['../struct_vma_stats.html',1,'']]],
+  ['vmavulkanfunctions_260',['VmaVulkanFunctions',['../struct_vma_vulkan_functions.html',1,'']]]
 ];
diff --git a/third_party/vulkan_memory_allocator/docs/html/search/classes_1.html b/third_party/vulkan_memory_allocator/docs/html/search/classes_1.html
deleted file mode 100644
index baeb182..0000000
--- a/third_party/vulkan_memory_allocator/docs/html/search/classes_1.html
+++ /dev/null
@@ -1,30 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html><head><title></title>
-<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
-<meta name="generator" content="Doxygen 1.8.16"/>
-<link rel="stylesheet" type="text/css" href="search.css"/>
-<script type="text/javascript" src="classes_1.js"></script>
-<script type="text/javascript" src="search.js"></script>
-</head>
-<body class="SRPage">
-<div id="SRIndex">
-<div class="SRStatus" id="Loading">Loading...</div>
-<div id="SRResults"></div>
-<script type="text/javascript"><!--
-/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
-createResults();
-/* @license-end */
---></script>
-<div class="SRStatus" id="Searching">Searching...</div>
-<div class="SRStatus" id="NoMatches">No Matches</div>
-<script type="text/javascript"><!--
-/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
-document.getElementById("Loading").style.display="none";
-document.getElementById("NoMatches").style.display="none";
-var searchResults = new SearchResults("searchResults");
-searchResults.Search();
-/* @license-end */
---></script>
-</div>
-</body>
-</html>
diff --git a/third_party/vulkan_memory_allocator/docs/html/search/classes_1.js b/third_party/vulkan_memory_allocator/docs/html/search/classes_1.js
deleted file mode 100644
index 58b1ed2..0000000
--- a/third_party/vulkan_memory_allocator/docs/html/search/classes_1.js
+++ /dev/null
@@ -1,22 +0,0 @@
-var searchData=
-[
-  ['vmaallocation_232',['VmaAllocation',['../struct_vma_allocation.html',1,'']]],
-  ['vmaallocationinfo_233',['VmaAllocationInfo',['../struct_vma_allocation_info.html',1,'']]],
-  ['vmaallocator_234',['VmaAllocator',['../struct_vma_allocator.html',1,'']]],
-  ['vmaallocatorcreateinfo_235',['VmaAllocatorCreateInfo',['../struct_vma_allocator_create_info.html',1,'']]],
-  ['vmabudget_236',['VmaBudget',['../struct_vma_budget.html',1,'']]],
-  ['vmadefragmentationcontext_237',['VmaDefragmentationContext',['../struct_vma_defragmentation_context.html',1,'']]],
-  ['vmadefragmentationinfo_238',['VmaDefragmentationInfo',['../struct_vma_defragmentation_info.html',1,'']]],
-  ['vmadefragmentationinfo2_239',['VmaDefragmentationInfo2',['../struct_vma_defragmentation_info2.html',1,'']]],
-  ['vmadefragmentationpassinfo_240',['VmaDefragmentationPassInfo',['../struct_vma_defragmentation_pass_info.html',1,'']]],
-  ['vmadefragmentationpassmoveinfo_241',['VmaDefragmentationPassMoveInfo',['../struct_vma_defragmentation_pass_move_info.html',1,'']]],
-  ['vmadefragmentationstats_242',['VmaDefragmentationStats',['../struct_vma_defragmentation_stats.html',1,'']]],
-  ['vmadevicememorycallbacks_243',['VmaDeviceMemoryCallbacks',['../struct_vma_device_memory_callbacks.html',1,'']]],
-  ['vmapool_244',['VmaPool',['../struct_vma_pool.html',1,'']]],
-  ['vmapoolcreateinfo_245',['VmaPoolCreateInfo',['../struct_vma_pool_create_info.html',1,'']]],
-  ['vmapoolstats_246',['VmaPoolStats',['../struct_vma_pool_stats.html',1,'']]],
-  ['vmarecordsettings_247',['VmaRecordSettings',['../struct_vma_record_settings.html',1,'']]],
-  ['vmastatinfo_248',['VmaStatInfo',['../struct_vma_stat_info.html',1,'']]],
-  ['vmastats_249',['VmaStats',['../struct_vma_stats.html',1,'']]],
-  ['vmavulkanfunctions_250',['VmaVulkanFunctions',['../struct_vma_vulkan_functions.html',1,'']]]
-];
diff --git a/third_party/vulkan_memory_allocator/docs/html/search/close.png b/third_party/vulkan_memory_allocator/docs/html/search/close.png
deleted file mode 100644
index 9342d3d..0000000
--- a/third_party/vulkan_memory_allocator/docs/html/search/close.png
+++ /dev/null
Binary files differ
diff --git a/third_party/vulkan_memory_allocator/docs/html/search/close.svg b/third_party/vulkan_memory_allocator/docs/html/search/close.svg
new file mode 100644
index 0000000..a933eea
--- /dev/null
+++ b/third_party/vulkan_memory_allocator/docs/html/search/close.svg
@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   viewBox="0 0 11 11"
+   height="11"
+   width="11"
+   id="svg2"
+   version="1.1">
+  <metadata
+     id="metadata8">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title></dc:title>
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <defs
+     id="defs6" />
+  <path
+     id="path12"
+     d="M 5.5 0.5 A 5 5 0 0 0 0.5 5.5 A 5 5 0 0 0 5.5 10.5 A 5 5 0 0 0 10.5 5.5 A 5 5 0 0 0 5.5 0.5 z M 3.5820312 3 A 0.58291923 0.58291923 0 0 1 4 3.1757812 L 5.5 4.6757812 L 7 3.1757812 A 0.58291923 0.58291923 0 0 1 7.4003906 3 A 0.58291923 0.58291923 0 0 1 7.8242188 4 L 6.3242188 5.5 L 7.8242188 7 A 0.58291923 0.58291923 0 1 1 7 7.8242188 L 5.5 6.3242188 L 4 7.8242188 A 0.58291923 0.58291923 0 1 1 3.1757812 7 L 4.6757812 5.5 L 3.1757812 4 A 0.58291923 0.58291923 0 0 1 3.5820312 3 z "
+     style="stroke-width:1.09870648;fill:#bababa;fill-opacity:1" />
+</svg>
diff --git a/third_party/vulkan_memory_allocator/docs/html/search/defines_0.html b/third_party/vulkan_memory_allocator/docs/html/search/defines_0.html
index 54b9bc5..15cc3de 100644
--- a/third_party/vulkan_memory_allocator/docs/html/search/defines_0.html
+++ b/third_party/vulkan_memory_allocator/docs/html/search/defines_0.html
@@ -1,7 +1,8 @@
 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html><head><title></title>
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head><title></title>
 <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
-<meta name="generator" content="Doxygen 1.8.18"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
 <link rel="stylesheet" type="text/css" href="search.css"/>
 <script type="text/javascript" src="defines_0.js"></script>
 <script type="text/javascript" src="search.js"></script>
@@ -10,14 +11,14 @@
 <div id="SRIndex">
 <div class="SRStatus" id="Loading">Loading...</div>
 <div id="SRResults"></div>
-<script type="text/javascript"><!--
+<script type="text/javascript">
 /* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
 createResults();
 /* @license-end */
---></script>
+</script>
 <div class="SRStatus" id="Searching">Searching...</div>
 <div class="SRStatus" id="NoMatches">No Matches</div>
-<script type="text/javascript"><!--
+<script type="text/javascript">
 /* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
 document.getElementById("Loading").style.display="none";
 document.getElementById("NoMatches").style.display="none";
@@ -30,7 +31,7 @@
   }
 });
 /* @license-end */
---></script>
+</script>
 </div>
 </body>
 </html>
diff --git a/third_party/vulkan_memory_allocator/docs/html/search/defines_0.js b/third_party/vulkan_memory_allocator/docs/html/search/defines_0.js
index 615c3c4..34117b3 100644
--- a/third_party/vulkan_memory_allocator/docs/html/search/defines_0.js
+++ b/third_party/vulkan_memory_allocator/docs/html/search/defines_0.js
@@ -1,4 +1,11 @@
 var searchData=
 [
-  ['nominmax_472',['NOMINMAX',['../vk__mem__alloc_8h.html#a9f918755b601cf4bffca775992e6fb90',1,'vk_mem_alloc.h']]]
+  ['vma_5fbind_5fmemory2_475',['VMA_BIND_MEMORY2',['../vk__mem__alloc_8h.html#a88bef97f86d70a34a4c0746e09a2680d',1,'vk_mem_alloc.h']]],
+  ['vma_5fbuffer_5fdevice_5faddress_476',['VMA_BUFFER_DEVICE_ADDRESS',['../vk__mem__alloc_8h.html#a7f9d5e71b70dd1a137c303a8a8262c10',1,'vk_mem_alloc.h']]],
+  ['vma_5fdedicated_5fallocation_477',['VMA_DEDICATED_ALLOCATION',['../vk__mem__alloc_8h.html#af7b860e63b96d11e44ae8587ba06bbf4',1,'vk_mem_alloc.h']]],
+  ['vma_5fmemory_5fbudget_478',['VMA_MEMORY_BUDGET',['../vk__mem__alloc_8h.html#a05decf1cf4ebf767beba7acca6c1ec3a',1,'vk_mem_alloc.h']]],
+  ['vma_5fmemory_5fpriority_479',['VMA_MEMORY_PRIORITY',['../vk__mem__alloc_8h.html#a81af8a3a87e34bbb493848143cde43e4',1,'vk_mem_alloc.h']]],
+  ['vma_5frecording_5fenabled_480',['VMA_RECORDING_ENABLED',['../vk__mem__alloc_8h.html#a1f0c126759fc96ccb6e2d23c101d770c',1,'vk_mem_alloc.h']]],
+  ['vma_5fstats_5fstring_5fenabled_481',['VMA_STATS_STRING_ENABLED',['../vk__mem__alloc_8h.html#ae25f0d55fd91cb166f002b63244800e1',1,'vk_mem_alloc.h']]],
+  ['vma_5fvulkan_5fversion_482',['VMA_VULKAN_VERSION',['../vk__mem__alloc_8h.html#a1a2407c283893638cc039bb31fcd74b6',1,'vk_mem_alloc.h']]]
 ];
diff --git a/third_party/vulkan_memory_allocator/docs/html/search/defines_1.html b/third_party/vulkan_memory_allocator/docs/html/search/defines_1.html
deleted file mode 100644
index 024d8be..0000000
--- a/third_party/vulkan_memory_allocator/docs/html/search/defines_1.html
+++ /dev/null
@@ -1,36 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html><head><title></title>
-<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
-<meta name="generator" content="Doxygen 1.8.18"/>
-<link rel="stylesheet" type="text/css" href="search.css"/>
-<script type="text/javascript" src="defines_1.js"></script>
-<script type="text/javascript" src="search.js"></script>
-</head>
-<body class="SRPage">
-<div id="SRIndex">
-<div class="SRStatus" id="Loading">Loading...</div>
-<div id="SRResults"></div>
-<script type="text/javascript"><!--
-/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
-createResults();
-/* @license-end */
---></script>
-<div class="SRStatus" id="Searching">Searching...</div>
-<div class="SRStatus" id="NoMatches">No Matches</div>
-<script type="text/javascript"><!--
-/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
-document.getElementById("Loading").style.display="none";
-document.getElementById("NoMatches").style.display="none";
-var searchResults = new SearchResults("searchResults");
-searchResults.Search();
-window.addEventListener("message", function(event) {
-  if (event.data == "take_focus") {
-    var elem = searchResults.NavNext(0);
-    if (elem) elem.focus();
-  }
-});
-/* @license-end */
---></script>
-</div>
-</body>
-</html>
diff --git a/third_party/vulkan_memory_allocator/docs/html/search/defines_1.js b/third_party/vulkan_memory_allocator/docs/html/search/defines_1.js
deleted file mode 100644
index 997e6ba..0000000
--- a/third_party/vulkan_memory_allocator/docs/html/search/defines_1.js
+++ /dev/null
@@ -1,10 +0,0 @@
-var searchData=
-[
-  ['vma_5fbind_5fmemory2_473',['VMA_BIND_MEMORY2',['../vk__mem__alloc_8h.html#a88bef97f86d70a34a4c0746e09a2680d',1,'vk_mem_alloc.h']]],
-  ['vma_5fbuffer_5fdevice_5faddress_474',['VMA_BUFFER_DEVICE_ADDRESS',['../vk__mem__alloc_8h.html#a7f9d5e71b70dd1a137c303a8a8262c10',1,'vk_mem_alloc.h']]],
-  ['vma_5fdedicated_5fallocation_475',['VMA_DEDICATED_ALLOCATION',['../vk__mem__alloc_8h.html#af7b860e63b96d11e44ae8587ba06bbf4',1,'vk_mem_alloc.h']]],
-  ['vma_5fmemory_5fbudget_476',['VMA_MEMORY_BUDGET',['../vk__mem__alloc_8h.html#a05decf1cf4ebf767beba7acca6c1ec3a',1,'vk_mem_alloc.h']]],
-  ['vma_5frecording_5fenabled_477',['VMA_RECORDING_ENABLED',['../vk__mem__alloc_8h.html#a1f0c126759fc96ccb6e2d23c101d770c',1,'vk_mem_alloc.h']]],
-  ['vma_5fstats_5fstring_5fenabled_478',['VMA_STATS_STRING_ENABLED',['../vk__mem__alloc_8h.html#ae25f0d55fd91cb166f002b63244800e1',1,'vk_mem_alloc.h']]],
-  ['vma_5fvulkan_5fversion_479',['VMA_VULKAN_VERSION',['../vk__mem__alloc_8h.html#a1a2407c283893638cc039bb31fcd74b6',1,'vk_mem_alloc.h']]]
-];
diff --git a/third_party/vulkan_memory_allocator/docs/html/search/enums_0.html b/third_party/vulkan_memory_allocator/docs/html/search/enums_0.html
index e99c489..141fff5 100644
--- a/third_party/vulkan_memory_allocator/docs/html/search/enums_0.html
+++ b/third_party/vulkan_memory_allocator/docs/html/search/enums_0.html
@@ -1,7 +1,8 @@
 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html><head><title></title>
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head><title></title>
 <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
-<meta name="generator" content="Doxygen 1.8.18"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
 <link rel="stylesheet" type="text/css" href="search.css"/>
 <script type="text/javascript" src="enums_0.js"></script>
 <script type="text/javascript" src="search.js"></script>
@@ -10,14 +11,14 @@
 <div id="SRIndex">
 <div class="SRStatus" id="Loading">Loading...</div>
 <div id="SRResults"></div>
-<script type="text/javascript"><!--
+<script type="text/javascript">
 /* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
 createResults();
 /* @license-end */
---></script>
+</script>
 <div class="SRStatus" id="Searching">Searching...</div>
 <div class="SRStatus" id="NoMatches">No Matches</div>
-<script type="text/javascript"><!--
+<script type="text/javascript">
 /* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
 document.getElementById("Loading").style.display="none";
 document.getElementById("NoMatches").style.display="none";
@@ -30,7 +31,7 @@
   }
 });
 /* @license-end */
---></script>
+</script>
 </div>
 </body>
 </html>
diff --git a/third_party/vulkan_memory_allocator/docs/html/search/enums_0.js b/third_party/vulkan_memory_allocator/docs/html/search/enums_0.js
index a65c89d..734333c 100644
--- a/third_party/vulkan_memory_allocator/docs/html/search/enums_0.js
+++ b/third_party/vulkan_memory_allocator/docs/html/search/enums_0.js
@@ -1,9 +1,9 @@
 var searchData=
 [
-  ['vmaallocationcreateflagbits_425',['VmaAllocationCreateFlagBits',['../vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597',1,'vk_mem_alloc.h']]],
-  ['vmaallocatorcreateflagbits_426',['VmaAllocatorCreateFlagBits',['../vk__mem__alloc_8h.html#a4f87c9100d154a65a4ad495f7763cf7c',1,'vk_mem_alloc.h']]],
-  ['vmadefragmentationflagbits_427',['VmaDefragmentationFlagBits',['../vk__mem__alloc_8h.html#a6552a65b71d16f378c6994b3ceaef50c',1,'vk_mem_alloc.h']]],
-  ['vmamemoryusage_428',['VmaMemoryUsage',['../vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305cc',1,'vk_mem_alloc.h']]],
-  ['vmapoolcreateflagbits_429',['VmaPoolCreateFlagBits',['../vk__mem__alloc_8h.html#a9a7c45f9c863695d98c83fa5ac940fe7',1,'vk_mem_alloc.h']]],
-  ['vmarecordflagbits_430',['VmaRecordFlagBits',['../vk__mem__alloc_8h.html#a4dd2c44642312a147a4e93373a6e64d2',1,'vk_mem_alloc.h']]]
+  ['vmaallocationcreateflagbits_427',['VmaAllocationCreateFlagBits',['../vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597',1,'vk_mem_alloc.h']]],
+  ['vmaallocatorcreateflagbits_428',['VmaAllocatorCreateFlagBits',['../vk__mem__alloc_8h.html#a4f87c9100d154a65a4ad495f7763cf7c',1,'vk_mem_alloc.h']]],
+  ['vmadefragmentationflagbits_429',['VmaDefragmentationFlagBits',['../vk__mem__alloc_8h.html#a6552a65b71d16f378c6994b3ceaef50c',1,'vk_mem_alloc.h']]],
+  ['vmamemoryusage_430',['VmaMemoryUsage',['../vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305cc',1,'vk_mem_alloc.h']]],
+  ['vmapoolcreateflagbits_431',['VmaPoolCreateFlagBits',['../vk__mem__alloc_8h.html#a9a7c45f9c863695d98c83fa5ac940fe7',1,'vk_mem_alloc.h']]],
+  ['vmarecordflagbits_432',['VmaRecordFlagBits',['../vk__mem__alloc_8h.html#a4dd2c44642312a147a4e93373a6e64d2',1,'vk_mem_alloc.h']]]
 ];
diff --git a/third_party/vulkan_memory_allocator/docs/html/search/enumvalues_0.html b/third_party/vulkan_memory_allocator/docs/html/search/enumvalues_0.html
index f740569..0d131d9 100644
--- a/third_party/vulkan_memory_allocator/docs/html/search/enumvalues_0.html
+++ b/third_party/vulkan_memory_allocator/docs/html/search/enumvalues_0.html
@@ -1,7 +1,8 @@
 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html><head><title></title>
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head><title></title>
 <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
-<meta name="generator" content="Doxygen 1.8.18"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
 <link rel="stylesheet" type="text/css" href="search.css"/>
 <script type="text/javascript" src="enumvalues_0.js"></script>
 <script type="text/javascript" src="search.js"></script>
@@ -10,14 +11,14 @@
 <div id="SRIndex">
 <div class="SRStatus" id="Loading">Loading...</div>
 <div id="SRResults"></div>
-<script type="text/javascript"><!--
+<script type="text/javascript">
 /* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
 createResults();
 /* @license-end */
---></script>
+</script>
 <div class="SRStatus" id="Searching">Searching...</div>
 <div class="SRStatus" id="NoMatches">No Matches</div>
-<script type="text/javascript"><!--
+<script type="text/javascript">
 /* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
 document.getElementById("Loading").style.display="none";
 document.getElementById("NoMatches").style.display="none";
@@ -30,7 +31,7 @@
   }
 });
 /* @license-end */
---></script>
+</script>
 </div>
 </body>
 </html>
diff --git a/third_party/vulkan_memory_allocator/docs/html/search/enumvalues_0.js b/third_party/vulkan_memory_allocator/docs/html/search/enumvalues_0.js
index 82bd66b..74bac7a 100644
--- a/third_party/vulkan_memory_allocator/docs/html/search/enumvalues_0.js
+++ b/third_party/vulkan_memory_allocator/docs/html/search/enumvalues_0.js
@@ -1,44 +1,45 @@
 var searchData=
 [
-  ['vma_5fallocation_5fcreate_5fcan_5fbecome_5flost_5fbit_431',['VMA_ALLOCATION_CREATE_CAN_BECOME_LOST_BIT',['../vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a5f436af6c8fe8540573a6d22627a6fd2',1,'vk_mem_alloc.h']]],
-  ['vma_5fallocation_5fcreate_5fcan_5fmake_5fother_5flost_5fbit_432',['VMA_ALLOCATION_CREATE_CAN_MAKE_OTHER_LOST_BIT',['../vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a68686d0ce9beb0d4d1b9f2b8b1389a7e',1,'vk_mem_alloc.h']]],
-  ['vma_5fallocation_5fcreate_5fdedicated_5fmemory_5fbit_433',['VMA_ALLOCATION_CREATE_DEDICATED_MEMORY_BIT',['../vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a3fc311d855c2ff53f1090ef5c722b38f',1,'vk_mem_alloc.h']]],
-  ['vma_5fallocation_5fcreate_5fdont_5fbind_5fbit_434',['VMA_ALLOCATION_CREATE_DONT_BIND_BIT',['../vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a2310568c62208af432724305fe29ccea',1,'vk_mem_alloc.h']]],
-  ['vma_5fallocation_5fcreate_5fflag_5fbits_5fmax_5fenum_435',['VMA_ALLOCATION_CREATE_FLAG_BITS_MAX_ENUM',['../vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597ae5633ec569f4899cf8f29e7385b2f882',1,'vk_mem_alloc.h']]],
-  ['vma_5fallocation_5fcreate_5fmapped_5fbit_436',['VMA_ALLOCATION_CREATE_MAPPED_BIT',['../vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a11da372cc3a82931c5e5d6146cd9dd1f',1,'vk_mem_alloc.h']]],
-  ['vma_5fallocation_5fcreate_5fnever_5fallocate_5fbit_437',['VMA_ALLOCATION_CREATE_NEVER_ALLOCATE_BIT',['../vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a89759603401014eb325eb22a3839f2ff',1,'vk_mem_alloc.h']]],
-  ['vma_5fallocation_5fcreate_5fstrategy_5fbest_5ffit_5fbit_438',['VMA_ALLOCATION_CREATE_STRATEGY_BEST_FIT_BIT',['../vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a839826775c62319466441f86496f036d',1,'vk_mem_alloc.h']]],
-  ['vma_5fallocation_5fcreate_5fstrategy_5ffirst_5ffit_5fbit_439',['VMA_ALLOCATION_CREATE_STRATEGY_FIRST_FIT_BIT',['../vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a33eb2052674f3ad92386c714a65fb777',1,'vk_mem_alloc.h']]],
-  ['vma_5fallocation_5fcreate_5fstrategy_5fmask_440',['VMA_ALLOCATION_CREATE_STRATEGY_MASK',['../vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a8e16845d81ae3d27c47106d4770d5c7e',1,'vk_mem_alloc.h']]],
-  ['vma_5fallocation_5fcreate_5fstrategy_5fmin_5ffragmentation_5fbit_441',['VMA_ALLOCATION_CREATE_STRATEGY_MIN_FRAGMENTATION_BIT',['../vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a621b704103eb3360230c860acf36e706',1,'vk_mem_alloc.h']]],
-  ['vma_5fallocation_5fcreate_5fstrategy_5fmin_5fmemory_5fbit_442',['VMA_ALLOCATION_CREATE_STRATEGY_MIN_MEMORY_BIT',['../vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a8af1210cf591784afa026d94998f735d',1,'vk_mem_alloc.h']]],
-  ['vma_5fallocation_5fcreate_5fstrategy_5fmin_5ftime_5fbit_443',['VMA_ALLOCATION_CREATE_STRATEGY_MIN_TIME_BIT',['../vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a0729e932b7ea170e3a128cad96c5cf6d',1,'vk_mem_alloc.h']]],
-  ['vma_5fallocation_5fcreate_5fstrategy_5fworst_5ffit_5fbit_444',['VMA_ALLOCATION_CREATE_STRATEGY_WORST_FIT_BIT',['../vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597ad242a04f802e25fef0b880afe8bb0a62',1,'vk_mem_alloc.h']]],
-  ['vma_5fallocation_5fcreate_5fupper_5faddress_5fbit_445',['VMA_ALLOCATION_CREATE_UPPER_ADDRESS_BIT',['../vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a42ba3a2d2c7117953210b7c3ef8da0df',1,'vk_mem_alloc.h']]],
-  ['vma_5fallocation_5fcreate_5fuser_5fdata_5fcopy_5fstring_5fbit_446',['VMA_ALLOCATION_CREATE_USER_DATA_COPY_STRING_BIT',['../vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597aa6f24f821cd6a7c5e4a443f7bf59c520',1,'vk_mem_alloc.h']]],
-  ['vma_5fallocation_5fcreate_5fwithin_5fbudget_5fbit_447',['VMA_ALLOCATION_CREATE_WITHIN_BUDGET_BIT',['../vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597ab8b1764f3e9022368e440c057783b92d',1,'vk_mem_alloc.h']]],
-  ['vma_5fallocator_5fcreate_5famd_5fdevice_5fcoherent_5fmemory_5fbit_448',['VMA_ALLOCATOR_CREATE_AMD_DEVICE_COHERENT_MEMORY_BIT',['../vk__mem__alloc_8h.html#a4f87c9100d154a65a4ad495f7763cf7ca2acce4886d8078552efa38878413970f',1,'vk_mem_alloc.h']]],
-  ['vma_5fallocator_5fcreate_5fbuffer_5fdevice_5faddress_5fbit_449',['VMA_ALLOCATOR_CREATE_BUFFER_DEVICE_ADDRESS_BIT',['../vk__mem__alloc_8h.html#a4f87c9100d154a65a4ad495f7763cf7ca5f1b28b0414319d1687e1f2b30ab0089',1,'vk_mem_alloc.h']]],
-  ['vma_5fallocator_5fcreate_5fext_5fmemory_5fbudget_5fbit_450',['VMA_ALLOCATOR_CREATE_EXT_MEMORY_BUDGET_BIT',['../vk__mem__alloc_8h.html#a4f87c9100d154a65a4ad495f7763cf7ca4d4687863f7bd4b418c6006dc04400b0',1,'vk_mem_alloc.h']]],
-  ['vma_5fallocator_5fcreate_5fexternally_5fsynchronized_5fbit_451',['VMA_ALLOCATOR_CREATE_EXTERNALLY_SYNCHRONIZED_BIT',['../vk__mem__alloc_8h.html#a4f87c9100d154a65a4ad495f7763cf7ca4816ddaed324ba110172ca608a20f29d',1,'vk_mem_alloc.h']]],
-  ['vma_5fallocator_5fcreate_5fflag_5fbits_5fmax_5fenum_452',['VMA_ALLOCATOR_CREATE_FLAG_BITS_MAX_ENUM',['../vk__mem__alloc_8h.html#a4f87c9100d154a65a4ad495f7763cf7cae4d5ad929caba5f23eb502b13bd5286c',1,'vk_mem_alloc.h']]],
-  ['vma_5fallocator_5fcreate_5fkhr_5fbind_5fmemory2_5fbit_453',['VMA_ALLOCATOR_CREATE_KHR_BIND_MEMORY2_BIT',['../vk__mem__alloc_8h.html#a4f87c9100d154a65a4ad495f7763cf7ca8fb75bf07cd184ab903596295e863dee',1,'vk_mem_alloc.h']]],
-  ['vma_5fallocator_5fcreate_5fkhr_5fdedicated_5fallocation_5fbit_454',['VMA_ALLOCATOR_CREATE_KHR_DEDICATED_ALLOCATION_BIT',['../vk__mem__alloc_8h.html#a4f87c9100d154a65a4ad495f7763cf7cace7da7cc6e71a625dfa763c55a597878',1,'vk_mem_alloc.h']]],
-  ['vma_5fdefragmentation_5fflag_5fbits_5fmax_5fenum_455',['VMA_DEFRAGMENTATION_FLAG_BITS_MAX_ENUM',['../vk__mem__alloc_8h.html#a6552a65b71d16f378c6994b3ceaef50cab87ec33154803bfeb5ac2b379f1d6a97',1,'vk_mem_alloc.h']]],
-  ['vma_5fdefragmentation_5fflag_5fincremental_456',['VMA_DEFRAGMENTATION_FLAG_INCREMENTAL',['../vk__mem__alloc_8h.html#a6552a65b71d16f378c6994b3ceaef50ca31af49446af2459284a568ce2f3fdd33',1,'vk_mem_alloc.h']]],
-  ['vma_5fmemory_5fusage_5fcpu_5fcopy_457',['VMA_MEMORY_USAGE_CPU_COPY',['../vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305cca416a444d4d0fc20067c3f76f32ff2500',1,'vk_mem_alloc.h']]],
-  ['vma_5fmemory_5fusage_5fcpu_5fonly_458',['VMA_MEMORY_USAGE_CPU_ONLY',['../vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305cca40bdf4cddeffeb12f43d45ca1286e0a5',1,'vk_mem_alloc.h']]],
-  ['vma_5fmemory_5fusage_5fcpu_5fto_5fgpu_459',['VMA_MEMORY_USAGE_CPU_TO_GPU',['../vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305cca9066b52c5a7079bb74a69aaf8b92ff67',1,'vk_mem_alloc.h']]],
-  ['vma_5fmemory_5fusage_5fgpu_5flazily_5fallocated_460',['VMA_MEMORY_USAGE_GPU_LAZILY_ALLOCATED',['../vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305cca835333d9072db63a653818030e17614d',1,'vk_mem_alloc.h']]],
-  ['vma_5fmemory_5fusage_5fgpu_5fonly_461',['VMA_MEMORY_USAGE_GPU_ONLY',['../vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305ccac6b5dc1432d88647aa4cd456246eadf7',1,'vk_mem_alloc.h']]],
-  ['vma_5fmemory_5fusage_5fgpu_5fto_5fcpu_462',['VMA_MEMORY_USAGE_GPU_TO_CPU',['../vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305cca7b586d2fdaf82a463b58f581ed72be27',1,'vk_mem_alloc.h']]],
-  ['vma_5fmemory_5fusage_5fmax_5fenum_463',['VMA_MEMORY_USAGE_MAX_ENUM',['../vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305cca091e69437ef693e8d0d287f1c719ba6e',1,'vk_mem_alloc.h']]],
-  ['vma_5fmemory_5fusage_5funknown_464',['VMA_MEMORY_USAGE_UNKNOWN',['../vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305ccaf50d27e34e0925cf3a63db8c839121dd',1,'vk_mem_alloc.h']]],
-  ['vma_5fpool_5fcreate_5falgorithm_5fmask_465',['VMA_POOL_CREATE_ALGORITHM_MASK',['../vk__mem__alloc_8h.html#a9a7c45f9c863695d98c83fa5ac940fe7af4d270f8f42517a0f70037ceb6ac1d9c',1,'vk_mem_alloc.h']]],
-  ['vma_5fpool_5fcreate_5fbuddy_5falgorithm_5fbit_466',['VMA_POOL_CREATE_BUDDY_ALGORITHM_BIT',['../vk__mem__alloc_8h.html#a9a7c45f9c863695d98c83fa5ac940fe7a97a0dc38e5161b780594d998d313d35e',1,'vk_mem_alloc.h']]],
-  ['vma_5fpool_5fcreate_5fflag_5fbits_5fmax_5fenum_467',['VMA_POOL_CREATE_FLAG_BITS_MAX_ENUM',['../vk__mem__alloc_8h.html#a9a7c45f9c863695d98c83fa5ac940fe7a1c7312bea9ea246846b9054fd6bd6aec',1,'vk_mem_alloc.h']]],
-  ['vma_5fpool_5fcreate_5fignore_5fbuffer_5fimage_5fgranularity_5fbit_468',['VMA_POOL_CREATE_IGNORE_BUFFER_IMAGE_GRANULARITY_BIT',['../vk__mem__alloc_8h.html#a9a7c45f9c863695d98c83fa5ac940fe7a9f1a499508a8edb4e8ba40aa0290a3d2',1,'vk_mem_alloc.h']]],
-  ['vma_5fpool_5fcreate_5flinear_5falgorithm_5fbit_469',['VMA_POOL_CREATE_LINEAR_ALGORITHM_BIT',['../vk__mem__alloc_8h.html#a9a7c45f9c863695d98c83fa5ac940fe7a13c8a444197c67866be9cb05599fc726',1,'vk_mem_alloc.h']]],
-  ['vma_5frecord_5fflag_5fbits_5fmax_5fenum_470',['VMA_RECORD_FLAG_BITS_MAX_ENUM',['../vk__mem__alloc_8h.html#a4dd2c44642312a147a4e93373a6e64d2a20dd17d69966dbffa054739d6090b85e',1,'vk_mem_alloc.h']]],
-  ['vma_5frecord_5fflush_5fafter_5fcall_5fbit_471',['VMA_RECORD_FLUSH_AFTER_CALL_BIT',['../vk__mem__alloc_8h.html#a4dd2c44642312a147a4e93373a6e64d2a8e7ab322e8732654be627c4ea8f36cc7',1,'vk_mem_alloc.h']]]
+  ['vma_5fallocation_5fcreate_5fcan_5fbecome_5flost_5fbit_433',['VMA_ALLOCATION_CREATE_CAN_BECOME_LOST_BIT',['../vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a5f436af6c8fe8540573a6d22627a6fd2',1,'vk_mem_alloc.h']]],
+  ['vma_5fallocation_5fcreate_5fcan_5fmake_5fother_5flost_5fbit_434',['VMA_ALLOCATION_CREATE_CAN_MAKE_OTHER_LOST_BIT',['../vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a68686d0ce9beb0d4d1b9f2b8b1389a7e',1,'vk_mem_alloc.h']]],
+  ['vma_5fallocation_5fcreate_5fdedicated_5fmemory_5fbit_435',['VMA_ALLOCATION_CREATE_DEDICATED_MEMORY_BIT',['../vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a3fc311d855c2ff53f1090ef5c722b38f',1,'vk_mem_alloc.h']]],
+  ['vma_5fallocation_5fcreate_5fdont_5fbind_5fbit_436',['VMA_ALLOCATION_CREATE_DONT_BIND_BIT',['../vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a2310568c62208af432724305fe29ccea',1,'vk_mem_alloc.h']]],
+  ['vma_5fallocation_5fcreate_5fflag_5fbits_5fmax_5fenum_437',['VMA_ALLOCATION_CREATE_FLAG_BITS_MAX_ENUM',['../vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597ae5633ec569f4899cf8f29e7385b2f882',1,'vk_mem_alloc.h']]],
+  ['vma_5fallocation_5fcreate_5fmapped_5fbit_438',['VMA_ALLOCATION_CREATE_MAPPED_BIT',['../vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a11da372cc3a82931c5e5d6146cd9dd1f',1,'vk_mem_alloc.h']]],
+  ['vma_5fallocation_5fcreate_5fnever_5fallocate_5fbit_439',['VMA_ALLOCATION_CREATE_NEVER_ALLOCATE_BIT',['../vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a89759603401014eb325eb22a3839f2ff',1,'vk_mem_alloc.h']]],
+  ['vma_5fallocation_5fcreate_5fstrategy_5fbest_5ffit_5fbit_440',['VMA_ALLOCATION_CREATE_STRATEGY_BEST_FIT_BIT',['../vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a839826775c62319466441f86496f036d',1,'vk_mem_alloc.h']]],
+  ['vma_5fallocation_5fcreate_5fstrategy_5ffirst_5ffit_5fbit_441',['VMA_ALLOCATION_CREATE_STRATEGY_FIRST_FIT_BIT',['../vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a33eb2052674f3ad92386c714a65fb777',1,'vk_mem_alloc.h']]],
+  ['vma_5fallocation_5fcreate_5fstrategy_5fmask_442',['VMA_ALLOCATION_CREATE_STRATEGY_MASK',['../vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a8e16845d81ae3d27c47106d4770d5c7e',1,'vk_mem_alloc.h']]],
+  ['vma_5fallocation_5fcreate_5fstrategy_5fmin_5ffragmentation_5fbit_443',['VMA_ALLOCATION_CREATE_STRATEGY_MIN_FRAGMENTATION_BIT',['../vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a621b704103eb3360230c860acf36e706',1,'vk_mem_alloc.h']]],
+  ['vma_5fallocation_5fcreate_5fstrategy_5fmin_5fmemory_5fbit_444',['VMA_ALLOCATION_CREATE_STRATEGY_MIN_MEMORY_BIT',['../vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a8af1210cf591784afa026d94998f735d',1,'vk_mem_alloc.h']]],
+  ['vma_5fallocation_5fcreate_5fstrategy_5fmin_5ftime_5fbit_445',['VMA_ALLOCATION_CREATE_STRATEGY_MIN_TIME_BIT',['../vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a0729e932b7ea170e3a128cad96c5cf6d',1,'vk_mem_alloc.h']]],
+  ['vma_5fallocation_5fcreate_5fstrategy_5fworst_5ffit_5fbit_446',['VMA_ALLOCATION_CREATE_STRATEGY_WORST_FIT_BIT',['../vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597ad242a04f802e25fef0b880afe8bb0a62',1,'vk_mem_alloc.h']]],
+  ['vma_5fallocation_5fcreate_5fupper_5faddress_5fbit_447',['VMA_ALLOCATION_CREATE_UPPER_ADDRESS_BIT',['../vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a42ba3a2d2c7117953210b7c3ef8da0df',1,'vk_mem_alloc.h']]],
+  ['vma_5fallocation_5fcreate_5fuser_5fdata_5fcopy_5fstring_5fbit_448',['VMA_ALLOCATION_CREATE_USER_DATA_COPY_STRING_BIT',['../vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597aa6f24f821cd6a7c5e4a443f7bf59c520',1,'vk_mem_alloc.h']]],
+  ['vma_5fallocation_5fcreate_5fwithin_5fbudget_5fbit_449',['VMA_ALLOCATION_CREATE_WITHIN_BUDGET_BIT',['../vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597ab8b1764f3e9022368e440c057783b92d',1,'vk_mem_alloc.h']]],
+  ['vma_5fallocator_5fcreate_5famd_5fdevice_5fcoherent_5fmemory_5fbit_450',['VMA_ALLOCATOR_CREATE_AMD_DEVICE_COHERENT_MEMORY_BIT',['../vk__mem__alloc_8h.html#a4f87c9100d154a65a4ad495f7763cf7ca2acce4886d8078552efa38878413970f',1,'vk_mem_alloc.h']]],
+  ['vma_5fallocator_5fcreate_5fbuffer_5fdevice_5faddress_5fbit_451',['VMA_ALLOCATOR_CREATE_BUFFER_DEVICE_ADDRESS_BIT',['../vk__mem__alloc_8h.html#a4f87c9100d154a65a4ad495f7763cf7ca5f1b28b0414319d1687e1f2b30ab0089',1,'vk_mem_alloc.h']]],
+  ['vma_5fallocator_5fcreate_5fext_5fmemory_5fbudget_5fbit_452',['VMA_ALLOCATOR_CREATE_EXT_MEMORY_BUDGET_BIT',['../vk__mem__alloc_8h.html#a4f87c9100d154a65a4ad495f7763cf7ca4d4687863f7bd4b418c6006dc04400b0',1,'vk_mem_alloc.h']]],
+  ['vma_5fallocator_5fcreate_5fext_5fmemory_5fpriority_5fbit_453',['VMA_ALLOCATOR_CREATE_EXT_MEMORY_PRIORITY_BIT',['../vk__mem__alloc_8h.html#a4f87c9100d154a65a4ad495f7763cf7caffdd7a5169be3dbd7cbf6b3619e4f78a',1,'vk_mem_alloc.h']]],
+  ['vma_5fallocator_5fcreate_5fexternally_5fsynchronized_5fbit_454',['VMA_ALLOCATOR_CREATE_EXTERNALLY_SYNCHRONIZED_BIT',['../vk__mem__alloc_8h.html#a4f87c9100d154a65a4ad495f7763cf7ca4816ddaed324ba110172ca608a20f29d',1,'vk_mem_alloc.h']]],
+  ['vma_5fallocator_5fcreate_5fflag_5fbits_5fmax_5fenum_455',['VMA_ALLOCATOR_CREATE_FLAG_BITS_MAX_ENUM',['../vk__mem__alloc_8h.html#a4f87c9100d154a65a4ad495f7763cf7cae4d5ad929caba5f23eb502b13bd5286c',1,'vk_mem_alloc.h']]],
+  ['vma_5fallocator_5fcreate_5fkhr_5fbind_5fmemory2_5fbit_456',['VMA_ALLOCATOR_CREATE_KHR_BIND_MEMORY2_BIT',['../vk__mem__alloc_8h.html#a4f87c9100d154a65a4ad495f7763cf7ca8fb75bf07cd184ab903596295e863dee',1,'vk_mem_alloc.h']]],
+  ['vma_5fallocator_5fcreate_5fkhr_5fdedicated_5fallocation_5fbit_457',['VMA_ALLOCATOR_CREATE_KHR_DEDICATED_ALLOCATION_BIT',['../vk__mem__alloc_8h.html#a4f87c9100d154a65a4ad495f7763cf7cace7da7cc6e71a625dfa763c55a597878',1,'vk_mem_alloc.h']]],
+  ['vma_5fdefragmentation_5fflag_5fbits_5fmax_5fenum_458',['VMA_DEFRAGMENTATION_FLAG_BITS_MAX_ENUM',['../vk__mem__alloc_8h.html#a6552a65b71d16f378c6994b3ceaef50cab87ec33154803bfeb5ac2b379f1d6a97',1,'vk_mem_alloc.h']]],
+  ['vma_5fdefragmentation_5fflag_5fincremental_459',['VMA_DEFRAGMENTATION_FLAG_INCREMENTAL',['../vk__mem__alloc_8h.html#a6552a65b71d16f378c6994b3ceaef50ca31af49446af2459284a568ce2f3fdd33',1,'vk_mem_alloc.h']]],
+  ['vma_5fmemory_5fusage_5fcpu_5fcopy_460',['VMA_MEMORY_USAGE_CPU_COPY',['../vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305cca416a444d4d0fc20067c3f76f32ff2500',1,'vk_mem_alloc.h']]],
+  ['vma_5fmemory_5fusage_5fcpu_5fonly_461',['VMA_MEMORY_USAGE_CPU_ONLY',['../vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305cca40bdf4cddeffeb12f43d45ca1286e0a5',1,'vk_mem_alloc.h']]],
+  ['vma_5fmemory_5fusage_5fcpu_5fto_5fgpu_462',['VMA_MEMORY_USAGE_CPU_TO_GPU',['../vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305cca9066b52c5a7079bb74a69aaf8b92ff67',1,'vk_mem_alloc.h']]],
+  ['vma_5fmemory_5fusage_5fgpu_5flazily_5fallocated_463',['VMA_MEMORY_USAGE_GPU_LAZILY_ALLOCATED',['../vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305cca835333d9072db63a653818030e17614d',1,'vk_mem_alloc.h']]],
+  ['vma_5fmemory_5fusage_5fgpu_5fonly_464',['VMA_MEMORY_USAGE_GPU_ONLY',['../vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305ccac6b5dc1432d88647aa4cd456246eadf7',1,'vk_mem_alloc.h']]],
+  ['vma_5fmemory_5fusage_5fgpu_5fto_5fcpu_465',['VMA_MEMORY_USAGE_GPU_TO_CPU',['../vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305cca7b586d2fdaf82a463b58f581ed72be27',1,'vk_mem_alloc.h']]],
+  ['vma_5fmemory_5fusage_5fmax_5fenum_466',['VMA_MEMORY_USAGE_MAX_ENUM',['../vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305cca091e69437ef693e8d0d287f1c719ba6e',1,'vk_mem_alloc.h']]],
+  ['vma_5fmemory_5fusage_5funknown_467',['VMA_MEMORY_USAGE_UNKNOWN',['../vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305ccaf50d27e34e0925cf3a63db8c839121dd',1,'vk_mem_alloc.h']]],
+  ['vma_5fpool_5fcreate_5falgorithm_5fmask_468',['VMA_POOL_CREATE_ALGORITHM_MASK',['../vk__mem__alloc_8h.html#a9a7c45f9c863695d98c83fa5ac940fe7af4d270f8f42517a0f70037ceb6ac1d9c',1,'vk_mem_alloc.h']]],
+  ['vma_5fpool_5fcreate_5fbuddy_5falgorithm_5fbit_469',['VMA_POOL_CREATE_BUDDY_ALGORITHM_BIT',['../vk__mem__alloc_8h.html#a9a7c45f9c863695d98c83fa5ac940fe7a97a0dc38e5161b780594d998d313d35e',1,'vk_mem_alloc.h']]],
+  ['vma_5fpool_5fcreate_5fflag_5fbits_5fmax_5fenum_470',['VMA_POOL_CREATE_FLAG_BITS_MAX_ENUM',['../vk__mem__alloc_8h.html#a9a7c45f9c863695d98c83fa5ac940fe7a1c7312bea9ea246846b9054fd6bd6aec',1,'vk_mem_alloc.h']]],
+  ['vma_5fpool_5fcreate_5fignore_5fbuffer_5fimage_5fgranularity_5fbit_471',['VMA_POOL_CREATE_IGNORE_BUFFER_IMAGE_GRANULARITY_BIT',['../vk__mem__alloc_8h.html#a9a7c45f9c863695d98c83fa5ac940fe7a9f1a499508a8edb4e8ba40aa0290a3d2',1,'vk_mem_alloc.h']]],
+  ['vma_5fpool_5fcreate_5flinear_5falgorithm_5fbit_472',['VMA_POOL_CREATE_LINEAR_ALGORITHM_BIT',['../vk__mem__alloc_8h.html#a9a7c45f9c863695d98c83fa5ac940fe7a13c8a444197c67866be9cb05599fc726',1,'vk_mem_alloc.h']]],
+  ['vma_5frecord_5fflag_5fbits_5fmax_5fenum_473',['VMA_RECORD_FLAG_BITS_MAX_ENUM',['../vk__mem__alloc_8h.html#a4dd2c44642312a147a4e93373a6e64d2a20dd17d69966dbffa054739d6090b85e',1,'vk_mem_alloc.h']]],
+  ['vma_5frecord_5fflush_5fafter_5fcall_5fbit_474',['VMA_RECORD_FLUSH_AFTER_CALL_BIT',['../vk__mem__alloc_8h.html#a4dd2c44642312a147a4e93373a6e64d2a8e7ab322e8732654be627c4ea8f36cc7',1,'vk_mem_alloc.h']]]
 ];
diff --git a/third_party/vulkan_memory_allocator/docs/html/search/files_0.html b/third_party/vulkan_memory_allocator/docs/html/search/files_0.html
index 182d7eb..9498842 100644
--- a/third_party/vulkan_memory_allocator/docs/html/search/files_0.html
+++ b/third_party/vulkan_memory_allocator/docs/html/search/files_0.html
@@ -1,7 +1,8 @@
 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html><head><title></title>
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head><title></title>
 <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
-<meta name="generator" content="Doxygen 1.8.18"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
 <link rel="stylesheet" type="text/css" href="search.css"/>
 <script type="text/javascript" src="files_0.js"></script>
 <script type="text/javascript" src="search.js"></script>
@@ -10,14 +11,14 @@
 <div id="SRIndex">
 <div class="SRStatus" id="Loading">Loading...</div>
 <div id="SRResults"></div>
-<script type="text/javascript"><!--
+<script type="text/javascript">
 /* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
 createResults();
 /* @license-end */
---></script>
+</script>
 <div class="SRStatus" id="Searching">Searching...</div>
 <div class="SRStatus" id="NoMatches">No Matches</div>
-<script type="text/javascript"><!--
+<script type="text/javascript">
 /* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
 document.getElementById("Loading").style.display="none";
 document.getElementById("NoMatches").style.display="none";
@@ -30,7 +31,7 @@
   }
 });
 /* @license-end */
---></script>
+</script>
 </div>
 </body>
 </html>
diff --git a/third_party/vulkan_memory_allocator/docs/html/search/files_0.js b/third_party/vulkan_memory_allocator/docs/html/search/files_0.js
index 4c467ee..10428fd 100644
--- a/third_party/vulkan_memory_allocator/docs/html/search/files_0.js
+++ b/third_party/vulkan_memory_allocator/docs/html/search/files_0.js
@@ -1,4 +1,4 @@
 var searchData=
 [
-  ['vk_5fmem_5falloc_2eh_259',['vk_mem_alloc.h',['../vk__mem__alloc_8h.html',1,'']]]
+  ['vk_5fmem_5falloc_2eh_261',['vk_mem_alloc.h',['../vk__mem__alloc_8h.html',1,'']]]
 ];
diff --git a/third_party/vulkan_memory_allocator/docs/html/search/functions_0.html b/third_party/vulkan_memory_allocator/docs/html/search/functions_0.html
index 4fcbb9c..eb4c501 100644
--- a/third_party/vulkan_memory_allocator/docs/html/search/functions_0.html
+++ b/third_party/vulkan_memory_allocator/docs/html/search/functions_0.html
@@ -1,7 +1,8 @@
 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html><head><title></title>
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head><title></title>
 <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
-<meta name="generator" content="Doxygen 1.8.18"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
 <link rel="stylesheet" type="text/css" href="search.css"/>
 <script type="text/javascript" src="functions_0.js"></script>
 <script type="text/javascript" src="search.js"></script>
@@ -10,14 +11,14 @@
 <div id="SRIndex">
 <div class="SRStatus" id="Loading">Loading...</div>
 <div id="SRResults"></div>
-<script type="text/javascript"><!--
+<script type="text/javascript">
 /* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
 createResults();
 /* @license-end */
---></script>
+</script>
 <div class="SRStatus" id="Searching">Searching...</div>
 <div class="SRStatus" id="NoMatches">No Matches</div>
-<script type="text/javascript"><!--
+<script type="text/javascript">
 /* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
 document.getElementById("Loading").style.display="none";
 document.getElementById("NoMatches").style.display="none";
@@ -30,7 +31,7 @@
   }
 });
 /* @license-end */
---></script>
+</script>
 </div>
 </body>
 </html>
diff --git a/third_party/vulkan_memory_allocator/docs/html/search/functions_0.js b/third_party/vulkan_memory_allocator/docs/html/search/functions_0.js
index ed18dfa..6940455 100644
--- a/third_party/vulkan_memory_allocator/docs/html/search/functions_0.js
+++ b/third_party/vulkan_memory_allocator/docs/html/search/functions_0.js
@@ -1,55 +1,54 @@
 var searchData=
 [
-  ['vmaallocatememory_260',['vmaAllocateMemory',['../vk__mem__alloc_8h.html#abf28077dbf82d0908b8acbe8ee8dd9b8',1,'vk_mem_alloc.h']]],
-  ['vmaallocatememoryforbuffer_261',['vmaAllocateMemoryForBuffer',['../vk__mem__alloc_8h.html#a7fdf64415b6c3d83c454f28d2c53df7b',1,'vk_mem_alloc.h']]],
-  ['vmaallocatememoryforimage_262',['vmaAllocateMemoryForImage',['../vk__mem__alloc_8h.html#a0faa3f9e5fb233d29d1e00390650febb',1,'vk_mem_alloc.h']]],
-  ['vmaallocatememorypages_263',['vmaAllocateMemoryPages',['../vk__mem__alloc_8h.html#ad37e82e492b3de38fc3f4cffd9ad0ae1',1,'vk_mem_alloc.h']]],
-  ['vmabegindefragmentationpass_264',['vmaBeginDefragmentationPass',['../vk__mem__alloc_8h.html#ac0f01545b6262f7d4d128fc8f8e5c77b',1,'vk_mem_alloc.h']]],
-  ['vmabindbuffermemory_265',['vmaBindBufferMemory',['../vk__mem__alloc_8h.html#a6b0929b914b60cf2d45cac4bf3547470',1,'vk_mem_alloc.h']]],
-  ['vmabindbuffermemory2_266',['vmaBindBufferMemory2',['../vk__mem__alloc_8h.html#a927c944f45e0f2941182abb6f608e64a',1,'vk_mem_alloc.h']]],
-  ['vmabindimagememory_267',['vmaBindImageMemory',['../vk__mem__alloc_8h.html#a3d3ca45799923aa5d138e9e5f9eb2da5',1,'vk_mem_alloc.h']]],
-  ['vmabindimagememory2_268',['vmaBindImageMemory2',['../vk__mem__alloc_8h.html#aa8251ee81b0045a443e35b8e8aa021bc',1,'vk_mem_alloc.h']]],
-  ['vmabuildstatsstring_269',['vmaBuildStatsString',['../vk__mem__alloc_8h.html#aa4fee7eb5253377599ef4fd38c93c2a0',1,'vk_mem_alloc.h']]],
-  ['vmacalculatestats_270',['vmaCalculateStats',['../vk__mem__alloc_8h.html#a333b61c1788cb23559177531e6a93ca3',1,'vk_mem_alloc.h']]],
-  ['vmacheckcorruption_271',['vmaCheckCorruption',['../vk__mem__alloc_8h.html#a49329a7f030dafcf82f7b73334c22e98',1,'vk_mem_alloc.h']]],
-  ['vmacheckpoolcorruption_272',['vmaCheckPoolCorruption',['../vk__mem__alloc_8h.html#ad535935619c7a549bf837e1bb0068f89',1,'vk_mem_alloc.h']]],
-  ['vmacreateallocator_273',['vmaCreateAllocator',['../vk__mem__alloc_8h.html#a200692051ddb34240248234f5f4c17bb',1,'vk_mem_alloc.h']]],
-  ['vmacreatebuffer_274',['vmaCreateBuffer',['../vk__mem__alloc_8h.html#ac72ee55598617e8eecca384e746bab51',1,'vk_mem_alloc.h']]],
-  ['vmacreateimage_275',['vmaCreateImage',['../vk__mem__alloc_8h.html#a02a94f25679275851a53e82eacbcfc73',1,'vk_mem_alloc.h']]],
-  ['vmacreatelostallocation_276',['vmaCreateLostAllocation',['../vk__mem__alloc_8h.html#ae5c9657d9e94756269145b01c05d16f1',1,'vk_mem_alloc.h']]],
-  ['vmacreatepool_277',['vmaCreatePool',['../vk__mem__alloc_8h.html#a5c8770ded7c59c8caac6de0c2cb00b50',1,'vk_mem_alloc.h']]],
-  ['vmadefragment_278',['vmaDefragment',['../vk__mem__alloc_8h.html#a9f0f8f56db5f7f57fe4454f465142dac',1,'vk_mem_alloc.h']]],
-  ['vmadefragmentationbegin_279',['vmaDefragmentationBegin',['../vk__mem__alloc_8h.html#a36ba776fd7fd5cb1e9359fdc0d8e6e8a',1,'vk_mem_alloc.h']]],
-  ['vmadefragmentationend_280',['vmaDefragmentationEnd',['../vk__mem__alloc_8h.html#a8774e20e91e245aae959ba63efa15dd2',1,'vk_mem_alloc.h']]],
-  ['vmadestroyallocator_281',['vmaDestroyAllocator',['../vk__mem__alloc_8h.html#aa8d164061c88f22fb1fd3c8f3534bc1d',1,'vk_mem_alloc.h']]],
-  ['vmadestroybuffer_282',['vmaDestroyBuffer',['../vk__mem__alloc_8h.html#a0d9f4e4ba5bf9aab1f1c746387753d77',1,'vk_mem_alloc.h']]],
-  ['vmadestroyimage_283',['vmaDestroyImage',['../vk__mem__alloc_8h.html#ae50d2cb3b4a3bfd4dd40987234e50e7e',1,'vk_mem_alloc.h']]],
-  ['vmadestroypool_284',['vmaDestroyPool',['../vk__mem__alloc_8h.html#a5485779c8f1948238fc4e92232fa65e1',1,'vk_mem_alloc.h']]],
-  ['vmaenddefragmentationpass_285',['vmaEndDefragmentationPass',['../vk__mem__alloc_8h.html#a1b9ffa538bed905af55c747cc48963bd',1,'vk_mem_alloc.h']]],
-  ['vmafindmemorytypeindex_286',['vmaFindMemoryTypeIndex',['../vk__mem__alloc_8h.html#aef15a94b58fbcb0fe706d5720e84a74a',1,'vk_mem_alloc.h']]],
-  ['vmafindmemorytypeindexforbufferinfo_287',['vmaFindMemoryTypeIndexForBufferInfo',['../vk__mem__alloc_8h.html#ae790ab9ffaf7667fb8f62523e6897888',1,'vk_mem_alloc.h']]],
-  ['vmafindmemorytypeindexforimageinfo_288',['vmaFindMemoryTypeIndexForImageInfo',['../vk__mem__alloc_8h.html#a088da83d8eaf3ce9056d9ea0b981d472',1,'vk_mem_alloc.h']]],
-  ['vmaflushallocation_289',['vmaFlushAllocation',['../vk__mem__alloc_8h.html#a30c37c1eec6025f397be41644f48490f',1,'vk_mem_alloc.h']]],
-  ['vmaflushallocations_290',['vmaFlushAllocations',['../vk__mem__alloc_8h.html#ac3dd00da721875ed99fa8a881922bdfc',1,'vk_mem_alloc.h']]],
-  ['vmafreememory_291',['vmaFreeMemory',['../vk__mem__alloc_8h.html#a5fea5518972ae9094b1526cbcb19b05f',1,'vk_mem_alloc.h']]],
-  ['vmafreememorypages_292',['vmaFreeMemoryPages',['../vk__mem__alloc_8h.html#a834b1e4aef395c0a1d56a28e69a4a17e',1,'vk_mem_alloc.h']]],
-  ['vmafreestatsstring_293',['vmaFreeStatsString',['../vk__mem__alloc_8h.html#a3104eb30d8122c84dd8541063f145288',1,'vk_mem_alloc.h']]],
-  ['vmagetallocationinfo_294',['vmaGetAllocationInfo',['../vk__mem__alloc_8h.html#a86dd08aba8633bfa4ad0df2e76481d8b',1,'vk_mem_alloc.h']]],
-  ['vmagetallocatorinfo_295',['vmaGetAllocatorInfo',['../vk__mem__alloc_8h.html#afa02231a791b37255720d566a52683e7',1,'vk_mem_alloc.h']]],
-  ['vmagetbudget_296',['vmaGetBudget',['../vk__mem__alloc_8h.html#aec0ed24ebea2d0099eed5f801daaefba',1,'vk_mem_alloc.h']]],
-  ['vmagetmemoryproperties_297',['vmaGetMemoryProperties',['../vk__mem__alloc_8h.html#ab88db292a17974f911182543fda52d19',1,'vk_mem_alloc.h']]],
-  ['vmagetmemorytypeproperties_298',['vmaGetMemoryTypeProperties',['../vk__mem__alloc_8h.html#a8701444752eb5de4464adb5a2b514bca',1,'vk_mem_alloc.h']]],
-  ['vmagetphysicaldeviceproperties_299',['vmaGetPhysicalDeviceProperties',['../vk__mem__alloc_8h.html#aecabf7b6e91ea87d0316fa0a9e014fe0',1,'vk_mem_alloc.h']]],
-  ['vmagetpoolname_300',['vmaGetPoolName',['../vk__mem__alloc_8h.html#af09b4e4eafdbee812e8d73ddf960f030',1,'vk_mem_alloc.h']]],
-  ['vmagetpoolstats_301',['vmaGetPoolStats',['../vk__mem__alloc_8h.html#ae8bf76997b234ef68aad922616df4153',1,'vk_mem_alloc.h']]],
-  ['vmainvalidateallocation_302',['vmaInvalidateAllocation',['../vk__mem__alloc_8h.html#aaa8412919139ef413a4215ac6a290fae',1,'vk_mem_alloc.h']]],
-  ['vmainvalidateallocations_303',['vmaInvalidateAllocations',['../vk__mem__alloc_8h.html#ab25b558d75f7378ec944a1522fdcc3c5',1,'vk_mem_alloc.h']]],
-  ['vmamakepoolallocationslost_304',['vmaMakePoolAllocationsLost',['../vk__mem__alloc_8h.html#a736bd6cbda886f36c891727e73bd4024',1,'vk_mem_alloc.h']]],
-  ['vmamapmemory_305',['vmaMapMemory',['../vk__mem__alloc_8h.html#ad5bd1243512d099706de88168992f069',1,'vk_mem_alloc.h']]],
-  ['vmaresizeallocation_306',['vmaResizeAllocation',['../vk__mem__alloc_8h.html#a0ff488958ca72b28e545880463cb8696',1,'vk_mem_alloc.h']]],
-  ['vmasetallocationuserdata_307',['vmaSetAllocationUserData',['../vk__mem__alloc_8h.html#af9147d31ffc11d62fc187bde283ed14f',1,'vk_mem_alloc.h']]],
-  ['vmasetcurrentframeindex_308',['vmaSetCurrentFrameIndex',['../vk__mem__alloc_8h.html#ade56bf8dc9f5a5eaddf5f119ed525236',1,'vk_mem_alloc.h']]],
-  ['vmasetpoolname_309',['vmaSetPoolName',['../vk__mem__alloc_8h.html#adbae3a0b4ab078024462fc85c37f3b58',1,'vk_mem_alloc.h']]],
-  ['vmatouchallocation_310',['vmaTouchAllocation',['../vk__mem__alloc_8h.html#a43d8ba9673c846f049089a5029d5c73a',1,'vk_mem_alloc.h']]],
-  ['vmaunmapmemory_311',['vmaUnmapMemory',['../vk__mem__alloc_8h.html#a9bc268595cb33f6ec4d519cfce81ff45',1,'vk_mem_alloc.h']]]
+  ['vmaallocatememory_262',['vmaAllocateMemory',['../vk__mem__alloc_8h.html#abf28077dbf82d0908b8acbe8ee8dd9b8',1,'vk_mem_alloc.h']]],
+  ['vmaallocatememoryforbuffer_263',['vmaAllocateMemoryForBuffer',['../vk__mem__alloc_8h.html#a7fdf64415b6c3d83c454f28d2c53df7b',1,'vk_mem_alloc.h']]],
+  ['vmaallocatememoryforimage_264',['vmaAllocateMemoryForImage',['../vk__mem__alloc_8h.html#a0faa3f9e5fb233d29d1e00390650febb',1,'vk_mem_alloc.h']]],
+  ['vmaallocatememorypages_265',['vmaAllocateMemoryPages',['../vk__mem__alloc_8h.html#ad37e82e492b3de38fc3f4cffd9ad0ae1',1,'vk_mem_alloc.h']]],
+  ['vmabegindefragmentationpass_266',['vmaBeginDefragmentationPass',['../vk__mem__alloc_8h.html#ac0f01545b6262f7d4d128fc8f8e5c77b',1,'vk_mem_alloc.h']]],
+  ['vmabindbuffermemory_267',['vmaBindBufferMemory',['../vk__mem__alloc_8h.html#a6b0929b914b60cf2d45cac4bf3547470',1,'vk_mem_alloc.h']]],
+  ['vmabindbuffermemory2_268',['vmaBindBufferMemory2',['../vk__mem__alloc_8h.html#a927c944f45e0f2941182abb6f608e64a',1,'vk_mem_alloc.h']]],
+  ['vmabindimagememory_269',['vmaBindImageMemory',['../vk__mem__alloc_8h.html#a3d3ca45799923aa5d138e9e5f9eb2da5',1,'vk_mem_alloc.h']]],
+  ['vmabindimagememory2_270',['vmaBindImageMemory2',['../vk__mem__alloc_8h.html#aa8251ee81b0045a443e35b8e8aa021bc',1,'vk_mem_alloc.h']]],
+  ['vmabuildstatsstring_271',['vmaBuildStatsString',['../vk__mem__alloc_8h.html#aa4fee7eb5253377599ef4fd38c93c2a0',1,'vk_mem_alloc.h']]],
+  ['vmacalculatestats_272',['vmaCalculateStats',['../vk__mem__alloc_8h.html#a333b61c1788cb23559177531e6a93ca3',1,'vk_mem_alloc.h']]],
+  ['vmacheckcorruption_273',['vmaCheckCorruption',['../vk__mem__alloc_8h.html#a49329a7f030dafcf82f7b73334c22e98',1,'vk_mem_alloc.h']]],
+  ['vmacheckpoolcorruption_274',['vmaCheckPoolCorruption',['../vk__mem__alloc_8h.html#ad535935619c7a549bf837e1bb0068f89',1,'vk_mem_alloc.h']]],
+  ['vmacreateallocator_275',['vmaCreateAllocator',['../vk__mem__alloc_8h.html#a200692051ddb34240248234f5f4c17bb',1,'vk_mem_alloc.h']]],
+  ['vmacreatebuffer_276',['vmaCreateBuffer',['../vk__mem__alloc_8h.html#ac72ee55598617e8eecca384e746bab51',1,'vk_mem_alloc.h']]],
+  ['vmacreateimage_277',['vmaCreateImage',['../vk__mem__alloc_8h.html#a02a94f25679275851a53e82eacbcfc73',1,'vk_mem_alloc.h']]],
+  ['vmacreatelostallocation_278',['vmaCreateLostAllocation',['../vk__mem__alloc_8h.html#ae5c9657d9e94756269145b01c05d16f1',1,'vk_mem_alloc.h']]],
+  ['vmacreatepool_279',['vmaCreatePool',['../vk__mem__alloc_8h.html#a5c8770ded7c59c8caac6de0c2cb00b50',1,'vk_mem_alloc.h']]],
+  ['vmadefragment_280',['vmaDefragment',['../vk__mem__alloc_8h.html#a9f0f8f56db5f7f57fe4454f465142dac',1,'vk_mem_alloc.h']]],
+  ['vmadefragmentationbegin_281',['vmaDefragmentationBegin',['../vk__mem__alloc_8h.html#a36ba776fd7fd5cb1e9359fdc0d8e6e8a',1,'vk_mem_alloc.h']]],
+  ['vmadefragmentationend_282',['vmaDefragmentationEnd',['../vk__mem__alloc_8h.html#a8774e20e91e245aae959ba63efa15dd2',1,'vk_mem_alloc.h']]],
+  ['vmadestroyallocator_283',['vmaDestroyAllocator',['../vk__mem__alloc_8h.html#aa8d164061c88f22fb1fd3c8f3534bc1d',1,'vk_mem_alloc.h']]],
+  ['vmadestroybuffer_284',['vmaDestroyBuffer',['../vk__mem__alloc_8h.html#a0d9f4e4ba5bf9aab1f1c746387753d77',1,'vk_mem_alloc.h']]],
+  ['vmadestroyimage_285',['vmaDestroyImage',['../vk__mem__alloc_8h.html#ae50d2cb3b4a3bfd4dd40987234e50e7e',1,'vk_mem_alloc.h']]],
+  ['vmadestroypool_286',['vmaDestroyPool',['../vk__mem__alloc_8h.html#a5485779c8f1948238fc4e92232fa65e1',1,'vk_mem_alloc.h']]],
+  ['vmaenddefragmentationpass_287',['vmaEndDefragmentationPass',['../vk__mem__alloc_8h.html#a1b9ffa538bed905af55c747cc48963bd',1,'vk_mem_alloc.h']]],
+  ['vmafindmemorytypeindex_288',['vmaFindMemoryTypeIndex',['../vk__mem__alloc_8h.html#aef15a94b58fbcb0fe706d5720e84a74a',1,'vk_mem_alloc.h']]],
+  ['vmafindmemorytypeindexforbufferinfo_289',['vmaFindMemoryTypeIndexForBufferInfo',['../vk__mem__alloc_8h.html#ae790ab9ffaf7667fb8f62523e6897888',1,'vk_mem_alloc.h']]],
+  ['vmafindmemorytypeindexforimageinfo_290',['vmaFindMemoryTypeIndexForImageInfo',['../vk__mem__alloc_8h.html#a088da83d8eaf3ce9056d9ea0b981d472',1,'vk_mem_alloc.h']]],
+  ['vmaflushallocation_291',['vmaFlushAllocation',['../vk__mem__alloc_8h.html#a30c37c1eec6025f397be41644f48490f',1,'vk_mem_alloc.h']]],
+  ['vmaflushallocations_292',['vmaFlushAllocations',['../vk__mem__alloc_8h.html#ac3dd00da721875ed99fa8a881922bdfc',1,'vk_mem_alloc.h']]],
+  ['vmafreememory_293',['vmaFreeMemory',['../vk__mem__alloc_8h.html#a5fea5518972ae9094b1526cbcb19b05f',1,'vk_mem_alloc.h']]],
+  ['vmafreememorypages_294',['vmaFreeMemoryPages',['../vk__mem__alloc_8h.html#a834b1e4aef395c0a1d56a28e69a4a17e',1,'vk_mem_alloc.h']]],
+  ['vmafreestatsstring_295',['vmaFreeStatsString',['../vk__mem__alloc_8h.html#a3104eb30d8122c84dd8541063f145288',1,'vk_mem_alloc.h']]],
+  ['vmagetallocationinfo_296',['vmaGetAllocationInfo',['../vk__mem__alloc_8h.html#a86dd08aba8633bfa4ad0df2e76481d8b',1,'vk_mem_alloc.h']]],
+  ['vmagetallocatorinfo_297',['vmaGetAllocatorInfo',['../vk__mem__alloc_8h.html#afa02231a791b37255720d566a52683e7',1,'vk_mem_alloc.h']]],
+  ['vmagetbudget_298',['vmaGetBudget',['../vk__mem__alloc_8h.html#aec0ed24ebea2d0099eed5f801daaefba',1,'vk_mem_alloc.h']]],
+  ['vmagetmemoryproperties_299',['vmaGetMemoryProperties',['../vk__mem__alloc_8h.html#ab88db292a17974f911182543fda52d19',1,'vk_mem_alloc.h']]],
+  ['vmagetmemorytypeproperties_300',['vmaGetMemoryTypeProperties',['../vk__mem__alloc_8h.html#a8701444752eb5de4464adb5a2b514bca',1,'vk_mem_alloc.h']]],
+  ['vmagetphysicaldeviceproperties_301',['vmaGetPhysicalDeviceProperties',['../vk__mem__alloc_8h.html#aecabf7b6e91ea87d0316fa0a9e014fe0',1,'vk_mem_alloc.h']]],
+  ['vmagetpoolname_302',['vmaGetPoolName',['../vk__mem__alloc_8h.html#af09b4e4eafdbee812e8d73ddf960f030',1,'vk_mem_alloc.h']]],
+  ['vmagetpoolstats_303',['vmaGetPoolStats',['../vk__mem__alloc_8h.html#ae8bf76997b234ef68aad922616df4153',1,'vk_mem_alloc.h']]],
+  ['vmainvalidateallocation_304',['vmaInvalidateAllocation',['../vk__mem__alloc_8h.html#aaa8412919139ef413a4215ac6a290fae',1,'vk_mem_alloc.h']]],
+  ['vmainvalidateallocations_305',['vmaInvalidateAllocations',['../vk__mem__alloc_8h.html#ab25b558d75f7378ec944a1522fdcc3c5',1,'vk_mem_alloc.h']]],
+  ['vmamakepoolallocationslost_306',['vmaMakePoolAllocationsLost',['../vk__mem__alloc_8h.html#a736bd6cbda886f36c891727e73bd4024',1,'vk_mem_alloc.h']]],
+  ['vmamapmemory_307',['vmaMapMemory',['../vk__mem__alloc_8h.html#ad5bd1243512d099706de88168992f069',1,'vk_mem_alloc.h']]],
+  ['vmasetallocationuserdata_308',['vmaSetAllocationUserData',['../vk__mem__alloc_8h.html#af9147d31ffc11d62fc187bde283ed14f',1,'vk_mem_alloc.h']]],
+  ['vmasetcurrentframeindex_309',['vmaSetCurrentFrameIndex',['../vk__mem__alloc_8h.html#ade56bf8dc9f5a5eaddf5f119ed525236',1,'vk_mem_alloc.h']]],
+  ['vmasetpoolname_310',['vmaSetPoolName',['../vk__mem__alloc_8h.html#adbae3a0b4ab078024462fc85c37f3b58',1,'vk_mem_alloc.h']]],
+  ['vmatouchallocation_311',['vmaTouchAllocation',['../vk__mem__alloc_8h.html#a43d8ba9673c846f049089a5029d5c73a',1,'vk_mem_alloc.h']]],
+  ['vmaunmapmemory_312',['vmaUnmapMemory',['../vk__mem__alloc_8h.html#a9bc268595cb33f6ec4d519cfce81ff45',1,'vk_mem_alloc.h']]]
 ];
diff --git a/third_party/vulkan_memory_allocator/docs/html/search/mag_sel.png b/third_party/vulkan_memory_allocator/docs/html/search/mag_sel.png
deleted file mode 100644
index 39c0ed5..0000000
--- a/third_party/vulkan_memory_allocator/docs/html/search/mag_sel.png
+++ /dev/null
Binary files differ
diff --git a/third_party/vulkan_memory_allocator/docs/html/search/mag_sel.svg b/third_party/vulkan_memory_allocator/docs/html/search/mag_sel.svg
new file mode 100644
index 0000000..03626f6
--- /dev/null
+++ b/third_party/vulkan_memory_allocator/docs/html/search/mag_sel.svg
@@ -0,0 +1,74 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   version="1.1"
+   id="svg2"
+   width="20"
+   height="19"
+   viewBox="0 0 20 19"
+   sodipodi:docname="mag_sel.svg"
+   inkscape:version="0.92.5 (2060ec1f9f, 2020-04-08)">
+  <metadata
+     id="metadata8">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title></dc:title>
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <defs
+     id="defs6" />
+  <sodipodi:namedview
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1"
+     objecttolerance="10"
+     gridtolerance="10"
+     guidetolerance="10"
+     inkscape:pageopacity="0"
+     inkscape:pageshadow="2"
+     inkscape:window-width="1920"
+     inkscape:window-height="2096"
+     id="namedview4"
+     showgrid="false"
+     fit-margin-top="0"
+     fit-margin-left="0"
+     fit-margin-right="0"
+     fit-margin-bottom="0"
+     inkscape:zoom="32"
+     inkscape:cx="5.9792688"
+     inkscape:cy="1.1436277"
+     inkscape:window-x="1920"
+     inkscape:window-y="27"
+     inkscape:window-maximized="0"
+     inkscape:current-layer="svg2" />
+  <circle
+     style="fill:#000000;fill-opacity:0;stroke:#656565;stroke-width:1.4;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:none"
+     id="path4611"
+     cx="5.5"
+     cy="8.5"
+     r="3.5" />
+  <path
+     style="fill:#656565;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+     d="M 11,7 13.5,10 16,7 Z"
+     id="path4609"
+     inkscape:connector-curvature="0"
+     sodipodi:nodetypes="cccc" />
+  <path
+     style="fill:none;stroke:#656565;stroke-width:1.4;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+     d="m 8.1085854,11.109059 2.7823556,2.782356"
+     id="path4630"
+     inkscape:connector-curvature="0" />
+</svg>
diff --git a/third_party/vulkan_memory_allocator/docs/html/search/nomatches.html b/third_party/vulkan_memory_allocator/docs/html/search/nomatches.html
index 4377320..2b9360b 100644
--- a/third_party/vulkan_memory_allocator/docs/html/search/nomatches.html
+++ b/third_party/vulkan_memory_allocator/docs/html/search/nomatches.html
@@ -1,5 +1,6 @@
 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html><head><title></title>
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head><title></title>
 <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
 <link rel="stylesheet" type="text/css" href="search.css"/>
 <script type="text/javascript" src="search.js"></script>
diff --git a/third_party/vulkan_memory_allocator/docs/html/search/pages_0.html b/third_party/vulkan_memory_allocator/docs/html/search/pages_0.html
index ca7755f..8517b48 100644
--- a/third_party/vulkan_memory_allocator/docs/html/search/pages_0.html
+++ b/third_party/vulkan_memory_allocator/docs/html/search/pages_0.html
@@ -1,7 +1,8 @@
 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html><head><title></title>
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head><title></title>
 <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
-<meta name="generator" content="Doxygen 1.8.18"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
 <link rel="stylesheet" type="text/css" href="search.css"/>
 <script type="text/javascript" src="pages_0.js"></script>
 <script type="text/javascript" src="search.js"></script>
@@ -10,14 +11,14 @@
 <div id="SRIndex">
 <div class="SRStatus" id="Loading">Loading...</div>
 <div id="SRResults"></div>
-<script type="text/javascript"><!--
+<script type="text/javascript">
 /* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
 createResults();
 /* @license-end */
---></script>
+</script>
 <div class="SRStatus" id="Searching">Searching...</div>
 <div class="SRStatus" id="NoMatches">No Matches</div>
-<script type="text/javascript"><!--
+<script type="text/javascript">
 /* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
 document.getElementById("Loading").style.display="none";
 document.getElementById("NoMatches").style.display="none";
@@ -30,7 +31,7 @@
   }
 });
 /* @license-end */
---></script>
+</script>
 </div>
 </body>
 </html>
diff --git a/third_party/vulkan_memory_allocator/docs/html/search/pages_0.js b/third_party/vulkan_memory_allocator/docs/html/search/pages_0.js
index 3b385d3..25ac023 100644
--- a/third_party/vulkan_memory_allocator/docs/html/search/pages_0.js
+++ b/third_party/vulkan_memory_allocator/docs/html/search/pages_0.js
@@ -1,4 +1,4 @@
 var searchData=
 [
-  ['allocation_20names_20and_20user_20data_480',['Allocation names and user data',['../allocation_annotation.html',1,'index']]]
+  ['allocation_20names_20and_20user_20data_483',['Allocation names and user data',['../allocation_annotation.html',1,'index']]]
 ];
diff --git a/third_party/vulkan_memory_allocator/docs/html/search/pages_1.html b/third_party/vulkan_memory_allocator/docs/html/search/pages_1.html
index 4e469b4..a0fb679 100644
--- a/third_party/vulkan_memory_allocator/docs/html/search/pages_1.html
+++ b/third_party/vulkan_memory_allocator/docs/html/search/pages_1.html
@@ -1,7 +1,8 @@
 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html><head><title></title>
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head><title></title>
 <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
-<meta name="generator" content="Doxygen 1.8.18"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
 <link rel="stylesheet" type="text/css" href="search.css"/>
 <script type="text/javascript" src="pages_1.js"></script>
 <script type="text/javascript" src="search.js"></script>
@@ -10,14 +11,14 @@
 <div id="SRIndex">
 <div class="SRStatus" id="Loading">Loading...</div>
 <div id="SRResults"></div>
-<script type="text/javascript"><!--
+<script type="text/javascript">
 /* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
 createResults();
 /* @license-end */
---></script>
+</script>
 <div class="SRStatus" id="Searching">Searching...</div>
 <div class="SRStatus" id="NoMatches">No Matches</div>
-<script type="text/javascript"><!--
+<script type="text/javascript">
 /* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
 document.getElementById("Loading").style.display="none";
 document.getElementById("NoMatches").style.display="none";
@@ -30,7 +31,7 @@
   }
 });
 /* @license-end */
---></script>
+</script>
 </div>
 </body>
 </html>
diff --git a/third_party/vulkan_memory_allocator/docs/html/search/pages_1.js b/third_party/vulkan_memory_allocator/docs/html/search/pages_1.js
index 23ebec4..bc544e5 100644
--- a/third_party/vulkan_memory_allocator/docs/html/search/pages_1.js
+++ b/third_party/vulkan_memory_allocator/docs/html/search/pages_1.js
@@ -1,6 +1,6 @@
 var searchData=
 [
-  ['choosing_20memory_20type_481',['Choosing memory type',['../choosing_memory_type.html',1,'index']]],
-  ['configuration_482',['Configuration',['../configuration.html',1,'index']]],
-  ['custom_20memory_20pools_483',['Custom memory pools',['../custom_memory_pools.html',1,'index']]]
+  ['choosing_20memory_20type_484',['Choosing memory type',['../choosing_memory_type.html',1,'index']]],
+  ['configuration_485',['Configuration',['../configuration.html',1,'index']]],
+  ['custom_20memory_20pools_486',['Custom memory pools',['../custom_memory_pools.html',1,'index']]]
 ];
diff --git a/third_party/vulkan_memory_allocator/docs/html/search/pages_2.html b/third_party/vulkan_memory_allocator/docs/html/search/pages_2.html
index 7029153..084edfd 100644
--- a/third_party/vulkan_memory_allocator/docs/html/search/pages_2.html
+++ b/third_party/vulkan_memory_allocator/docs/html/search/pages_2.html
@@ -1,7 +1,8 @@
 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html><head><title></title>
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head><title></title>
 <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
-<meta name="generator" content="Doxygen 1.8.18"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
 <link rel="stylesheet" type="text/css" href="search.css"/>
 <script type="text/javascript" src="pages_2.js"></script>
 <script type="text/javascript" src="search.js"></script>
@@ -10,14 +11,14 @@
 <div id="SRIndex">
 <div class="SRStatus" id="Loading">Loading...</div>
 <div id="SRResults"></div>
-<script type="text/javascript"><!--
+<script type="text/javascript">
 /* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
 createResults();
 /* @license-end */
---></script>
+</script>
 <div class="SRStatus" id="Searching">Searching...</div>
 <div class="SRStatus" id="NoMatches">No Matches</div>
-<script type="text/javascript"><!--
+<script type="text/javascript">
 /* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
 document.getElementById("Loading").style.display="none";
 document.getElementById("NoMatches").style.display="none";
@@ -30,7 +31,7 @@
   }
 });
 /* @license-end */
---></script>
+</script>
 </div>
 </body>
 </html>
diff --git a/third_party/vulkan_memory_allocator/docs/html/search/pages_2.js b/third_party/vulkan_memory_allocator/docs/html/search/pages_2.js
index 687395c..a3326f9 100644
--- a/third_party/vulkan_memory_allocator/docs/html/search/pages_2.js
+++ b/third_party/vulkan_memory_allocator/docs/html/search/pages_2.js
@@ -1,6 +1,6 @@
 var searchData=
 [
-  ['debugging_20incorrect_20memory_20usage_484',['Debugging incorrect memory usage',['../debugging_memory_usage.html',1,'index']]],
-  ['defragmentation_485',['Defragmentation',['../defragmentation.html',1,'index']]],
-  ['deprecated_20list_486',['Deprecated List',['../deprecated.html',1,'']]]
+  ['debugging_20incorrect_20memory_20usage_487',['Debugging incorrect memory usage',['../debugging_memory_usage.html',1,'index']]],
+  ['defragmentation_488',['Defragmentation',['../defragmentation.html',1,'index']]],
+  ['deprecated_20list_489',['Deprecated List',['../deprecated.html',1,'']]]
 ];
diff --git a/third_party/vulkan_memory_allocator/docs/html/search/pages_3.html b/third_party/vulkan_memory_allocator/docs/html/search/pages_3.html
index fce1ba4..c0b45b0 100644
--- a/third_party/vulkan_memory_allocator/docs/html/search/pages_3.html
+++ b/third_party/vulkan_memory_allocator/docs/html/search/pages_3.html
@@ -1,7 +1,8 @@
 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html><head><title></title>
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head><title></title>
 <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
-<meta name="generator" content="Doxygen 1.8.18"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
 <link rel="stylesheet" type="text/css" href="search.css"/>
 <script type="text/javascript" src="pages_3.js"></script>
 <script type="text/javascript" src="search.js"></script>
@@ -10,14 +11,14 @@
 <div id="SRIndex">
 <div class="SRStatus" id="Loading">Loading...</div>
 <div id="SRResults"></div>
-<script type="text/javascript"><!--
+<script type="text/javascript">
 /* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
 createResults();
 /* @license-end */
---></script>
+</script>
 <div class="SRStatus" id="Searching">Searching...</div>
 <div class="SRStatus" id="NoMatches">No Matches</div>
-<script type="text/javascript"><!--
+<script type="text/javascript">
 /* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
 document.getElementById("Loading").style.display="none";
 document.getElementById("NoMatches").style.display="none";
@@ -30,7 +31,7 @@
   }
 });
 /* @license-end */
---></script>
+</script>
 </div>
 </body>
 </html>
diff --git a/third_party/vulkan_memory_allocator/docs/html/search/pages_3.js b/third_party/vulkan_memory_allocator/docs/html/search/pages_3.js
index 1491c8e..6d55588 100644
--- a/third_party/vulkan_memory_allocator/docs/html/search/pages_3.js
+++ b/third_party/vulkan_memory_allocator/docs/html/search/pages_3.js
@@ -1,4 +1,4 @@
 var searchData=
 [
-  ['enabling_20buffer_20device_20address_487',['Enabling buffer device address',['../enabling_buffer_device_address.html',1,'index']]]
+  ['enabling_20buffer_20device_20address_490',['Enabling buffer device address',['../enabling_buffer_device_address.html',1,'index']]]
 ];
diff --git a/third_party/vulkan_memory_allocator/docs/html/search/pages_4.html b/third_party/vulkan_memory_allocator/docs/html/search/pages_4.html
index 6303829..0f05c2e 100644
--- a/third_party/vulkan_memory_allocator/docs/html/search/pages_4.html
+++ b/third_party/vulkan_memory_allocator/docs/html/search/pages_4.html
@@ -1,7 +1,8 @@
 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html><head><title></title>
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head><title></title>
 <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
-<meta name="generator" content="Doxygen 1.8.18"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
 <link rel="stylesheet" type="text/css" href="search.css"/>
 <script type="text/javascript" src="pages_4.js"></script>
 <script type="text/javascript" src="search.js"></script>
@@ -10,14 +11,14 @@
 <div id="SRIndex">
 <div class="SRStatus" id="Loading">Loading...</div>
 <div id="SRResults"></div>
-<script type="text/javascript"><!--
+<script type="text/javascript">
 /* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
 createResults();
 /* @license-end */
---></script>
+</script>
 <div class="SRStatus" id="Searching">Searching...</div>
 <div class="SRStatus" id="NoMatches">No Matches</div>
-<script type="text/javascript"><!--
+<script type="text/javascript">
 /* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
 document.getElementById("Loading").style.display="none";
 document.getElementById("NoMatches").style.display="none";
@@ -30,7 +31,7 @@
   }
 });
 /* @license-end */
---></script>
+</script>
 </div>
 </body>
 </html>
diff --git a/third_party/vulkan_memory_allocator/docs/html/search/pages_4.js b/third_party/vulkan_memory_allocator/docs/html/search/pages_4.js
index d9b7b32..24152c1 100644
--- a/third_party/vulkan_memory_allocator/docs/html/search/pages_4.js
+++ b/third_party/vulkan_memory_allocator/docs/html/search/pages_4.js
@@ -1,4 +1,4 @@
 var searchData=
 [
-  ['general_20considerations_488',['General considerations',['../general_considerations.html',1,'index']]]
+  ['general_20considerations_491',['General considerations',['../general_considerations.html',1,'index']]]
 ];
diff --git a/third_party/vulkan_memory_allocator/docs/html/search/pages_5.html b/third_party/vulkan_memory_allocator/docs/html/search/pages_5.html
index adf59e2..27e2b6c 100644
--- a/third_party/vulkan_memory_allocator/docs/html/search/pages_5.html
+++ b/third_party/vulkan_memory_allocator/docs/html/search/pages_5.html
@@ -1,7 +1,8 @@
 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html><head><title></title>
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head><title></title>
 <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
-<meta name="generator" content="Doxygen 1.8.18"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
 <link rel="stylesheet" type="text/css" href="search.css"/>
 <script type="text/javascript" src="pages_5.js"></script>
 <script type="text/javascript" src="search.js"></script>
@@ -10,14 +11,14 @@
 <div id="SRIndex">
 <div class="SRStatus" id="Loading">Loading...</div>
 <div id="SRResults"></div>
-<script type="text/javascript"><!--
+<script type="text/javascript">
 /* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
 createResults();
 /* @license-end */
---></script>
+</script>
 <div class="SRStatus" id="Searching">Searching...</div>
 <div class="SRStatus" id="NoMatches">No Matches</div>
-<script type="text/javascript"><!--
+<script type="text/javascript">
 /* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
 document.getElementById("Loading").style.display="none";
 document.getElementById("NoMatches").style.display="none";
@@ -30,7 +31,7 @@
   }
 });
 /* @license-end */
---></script>
+</script>
 </div>
 </body>
 </html>
diff --git a/third_party/vulkan_memory_allocator/docs/html/search/pages_5.js b/third_party/vulkan_memory_allocator/docs/html/search/pages_5.js
index caa7a41..3fb7c9e 100644
--- a/third_party/vulkan_memory_allocator/docs/html/search/pages_5.js
+++ b/third_party/vulkan_memory_allocator/docs/html/search/pages_5.js
@@ -1,4 +1,4 @@
 var searchData=
 [
-  ['lost_20allocations_489',['Lost allocations',['../lost_allocations.html',1,'index']]]
+  ['lost_20allocations_492',['Lost allocations',['../lost_allocations.html',1,'index']]]
 ];
diff --git a/third_party/vulkan_memory_allocator/docs/html/search/pages_6.html b/third_party/vulkan_memory_allocator/docs/html/search/pages_6.html
index 575871b..39300b6 100644
--- a/third_party/vulkan_memory_allocator/docs/html/search/pages_6.html
+++ b/third_party/vulkan_memory_allocator/docs/html/search/pages_6.html
@@ -1,7 +1,8 @@
 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html><head><title></title>
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head><title></title>
 <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
-<meta name="generator" content="Doxygen 1.8.18"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
 <link rel="stylesheet" type="text/css" href="search.css"/>
 <script type="text/javascript" src="pages_6.js"></script>
 <script type="text/javascript" src="search.js"></script>
@@ -10,14 +11,14 @@
 <div id="SRIndex">
 <div class="SRStatus" id="Loading">Loading...</div>
 <div id="SRResults"></div>
-<script type="text/javascript"><!--
+<script type="text/javascript">
 /* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
 createResults();
 /* @license-end */
---></script>
+</script>
 <div class="SRStatus" id="Searching">Searching...</div>
 <div class="SRStatus" id="NoMatches">No Matches</div>
-<script type="text/javascript"><!--
+<script type="text/javascript">
 /* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
 document.getElementById("Loading").style.display="none";
 document.getElementById("NoMatches").style.display="none";
@@ -30,7 +31,7 @@
   }
 });
 /* @license-end */
---></script>
+</script>
 </div>
 </body>
 </html>
diff --git a/third_party/vulkan_memory_allocator/docs/html/search/pages_6.js b/third_party/vulkan_memory_allocator/docs/html/search/pages_6.js
index 733175b..90c7a07 100644
--- a/third_party/vulkan_memory_allocator/docs/html/search/pages_6.js
+++ b/third_party/vulkan_memory_allocator/docs/html/search/pages_6.js
@@ -1,4 +1,4 @@
 var searchData=
 [
-  ['memory_20mapping_490',['Memory mapping',['../memory_mapping.html',1,'index']]]
+  ['memory_20mapping_493',['Memory mapping',['../memory_mapping.html',1,'index']]]
 ];
diff --git a/third_party/vulkan_memory_allocator/docs/html/search/pages_7.html b/third_party/vulkan_memory_allocator/docs/html/search/pages_7.html
index c355685..c005fe5 100644
--- a/third_party/vulkan_memory_allocator/docs/html/search/pages_7.html
+++ b/third_party/vulkan_memory_allocator/docs/html/search/pages_7.html
@@ -1,7 +1,8 @@
 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html><head><title></title>
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head><title></title>
 <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
-<meta name="generator" content="Doxygen 1.8.18"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
 <link rel="stylesheet" type="text/css" href="search.css"/>
 <script type="text/javascript" src="pages_7.js"></script>
 <script type="text/javascript" src="search.js"></script>
@@ -10,14 +11,14 @@
 <div id="SRIndex">
 <div class="SRStatus" id="Loading">Loading...</div>
 <div id="SRResults"></div>
-<script type="text/javascript"><!--
+<script type="text/javascript">
 /* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
 createResults();
 /* @license-end */
---></script>
+</script>
 <div class="SRStatus" id="Searching">Searching...</div>
 <div class="SRStatus" id="NoMatches">No Matches</div>
-<script type="text/javascript"><!--
+<script type="text/javascript">
 /* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
 document.getElementById("Loading").style.display="none";
 document.getElementById("NoMatches").style.display="none";
@@ -30,7 +31,7 @@
   }
 });
 /* @license-end */
---></script>
+</script>
 </div>
 </body>
 </html>
diff --git a/third_party/vulkan_memory_allocator/docs/html/search/pages_7.js b/third_party/vulkan_memory_allocator/docs/html/search/pages_7.js
index 2a1dc52..ea54719 100644
--- a/third_party/vulkan_memory_allocator/docs/html/search/pages_7.js
+++ b/third_party/vulkan_memory_allocator/docs/html/search/pages_7.js
@@ -1,4 +1,4 @@
 var searchData=
 [
-  ['quick_20start_491',['Quick start',['../quick_start.html',1,'index']]]
+  ['quick_20start_494',['Quick start',['../quick_start.html',1,'index']]]
 ];
diff --git a/third_party/vulkan_memory_allocator/docs/html/search/pages_8.html b/third_party/vulkan_memory_allocator/docs/html/search/pages_8.html
index bb5201a..c942aa2 100644
--- a/third_party/vulkan_memory_allocator/docs/html/search/pages_8.html
+++ b/third_party/vulkan_memory_allocator/docs/html/search/pages_8.html
@@ -1,7 +1,8 @@
 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html><head><title></title>
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head><title></title>
 <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
-<meta name="generator" content="Doxygen 1.8.18"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
 <link rel="stylesheet" type="text/css" href="search.css"/>
 <script type="text/javascript" src="pages_8.js"></script>
 <script type="text/javascript" src="search.js"></script>
@@ -10,14 +11,14 @@
 <div id="SRIndex">
 <div class="SRStatus" id="Loading">Loading...</div>
 <div id="SRResults"></div>
-<script type="text/javascript"><!--
+<script type="text/javascript">
 /* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
 createResults();
 /* @license-end */
---></script>
+</script>
 <div class="SRStatus" id="Searching">Searching...</div>
 <div class="SRStatus" id="NoMatches">No Matches</div>
-<script type="text/javascript"><!--
+<script type="text/javascript">
 /* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
 document.getElementById("Loading").style.display="none";
 document.getElementById("NoMatches").style.display="none";
@@ -30,7 +31,7 @@
   }
 });
 /* @license-end */
---></script>
+</script>
 </div>
 </body>
 </html>
diff --git a/third_party/vulkan_memory_allocator/docs/html/search/pages_8.js b/third_party/vulkan_memory_allocator/docs/html/search/pages_8.js
index f0b034c..348ea46 100644
--- a/third_party/vulkan_memory_allocator/docs/html/search/pages_8.js
+++ b/third_party/vulkan_memory_allocator/docs/html/search/pages_8.js
@@ -1,5 +1,6 @@
 var searchData=
 [
-  ['record_20and_20replay_492',['Record and replay',['../record_and_replay.html',1,'index']]],
-  ['recommended_20usage_20patterns_493',['Recommended usage patterns',['../usage_patterns.html',1,'index']]]
+  ['recommended_20usage_20patterns_495',['Recommended usage patterns',['../usage_patterns.html',1,'index']]],
+  ['record_20and_20replay_496',['Record and replay',['../record_and_replay.html',1,'index']]],
+  ['resource_20aliasing_20_28overlap_29_497',['Resource aliasing (overlap)',['../resource_aliasing.html',1,'index']]]
 ];
diff --git a/third_party/vulkan_memory_allocator/docs/html/search/pages_9.html b/third_party/vulkan_memory_allocator/docs/html/search/pages_9.html
index d1d1170..4199c40 100644
--- a/third_party/vulkan_memory_allocator/docs/html/search/pages_9.html
+++ b/third_party/vulkan_memory_allocator/docs/html/search/pages_9.html
@@ -1,7 +1,8 @@
 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html><head><title></title>
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head><title></title>
 <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
-<meta name="generator" content="Doxygen 1.8.18"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
 <link rel="stylesheet" type="text/css" href="search.css"/>
 <script type="text/javascript" src="pages_9.js"></script>
 <script type="text/javascript" src="search.js"></script>
@@ -10,14 +11,14 @@
 <div id="SRIndex">
 <div class="SRStatus" id="Loading">Loading...</div>
 <div id="SRResults"></div>
-<script type="text/javascript"><!--
+<script type="text/javascript">
 /* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
 createResults();
 /* @license-end */
---></script>
+</script>
 <div class="SRStatus" id="Searching">Searching...</div>
 <div class="SRStatus" id="NoMatches">No Matches</div>
-<script type="text/javascript"><!--
+<script type="text/javascript">
 /* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
 document.getElementById("Loading").style.display="none";
 document.getElementById("NoMatches").style.display="none";
@@ -30,7 +31,7 @@
   }
 });
 /* @license-end */
---></script>
+</script>
 </div>
 </body>
 </html>
diff --git a/third_party/vulkan_memory_allocator/docs/html/search/pages_9.js b/third_party/vulkan_memory_allocator/docs/html/search/pages_9.js
index eacae9b..e9d588e 100644
--- a/third_party/vulkan_memory_allocator/docs/html/search/pages_9.js
+++ b/third_party/vulkan_memory_allocator/docs/html/search/pages_9.js
@@ -1,5 +1,5 @@
 var searchData=
 [
-  ['statistics_494',['Statistics',['../statistics.html',1,'index']]],
-  ['staying_20within_20budget_495',['Staying within budget',['../staying_within_budget.html',1,'index']]]
+  ['statistics_498',['Statistics',['../statistics.html',1,'index']]],
+  ['staying_20within_20budget_499',['Staying within budget',['../staying_within_budget.html',1,'index']]]
 ];
diff --git a/third_party/vulkan_memory_allocator/docs/html/search/pages_a.html b/third_party/vulkan_memory_allocator/docs/html/search/pages_a.html
index 6c10030..2cc9d19 100644
--- a/third_party/vulkan_memory_allocator/docs/html/search/pages_a.html
+++ b/third_party/vulkan_memory_allocator/docs/html/search/pages_a.html
@@ -1,7 +1,8 @@
 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html><head><title></title>
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head><title></title>
 <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
-<meta name="generator" content="Doxygen 1.8.18"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
 <link rel="stylesheet" type="text/css" href="search.css"/>
 <script type="text/javascript" src="pages_a.js"></script>
 <script type="text/javascript" src="search.js"></script>
@@ -10,14 +11,14 @@
 <div id="SRIndex">
 <div class="SRStatus" id="Loading">Loading...</div>
 <div id="SRResults"></div>
-<script type="text/javascript"><!--
+<script type="text/javascript">
 /* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
 createResults();
 /* @license-end */
---></script>
+</script>
 <div class="SRStatus" id="Searching">Searching...</div>
 <div class="SRStatus" id="NoMatches">No Matches</div>
-<script type="text/javascript"><!--
+<script type="text/javascript">
 /* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
 document.getElementById("Loading").style.display="none";
 document.getElementById("NoMatches").style.display="none";
@@ -30,7 +31,7 @@
   }
 });
 /* @license-end */
---></script>
+</script>
 </div>
 </body>
 </html>
diff --git a/third_party/vulkan_memory_allocator/docs/html/search/pages_a.js b/third_party/vulkan_memory_allocator/docs/html/search/pages_a.js
index b8e1a18..bf4af17 100644
--- a/third_party/vulkan_memory_allocator/docs/html/search/pages_a.js
+++ b/third_party/vulkan_memory_allocator/docs/html/search/pages_a.js
@@ -1,6 +1,6 @@
 var searchData=
 [
-  ['vulkan_20memory_20allocator_496',['Vulkan Memory Allocator',['../index.html',1,'']]],
-  ['vk_5famd_5fdevice_5fcoherent_5fmemory_497',['VK_AMD_device_coherent_memory',['../vk_amd_device_coherent_memory.html',1,'index']]],
-  ['vk_5fkhr_5fdedicated_5fallocation_498',['VK_KHR_dedicated_allocation',['../vk_khr_dedicated_allocation.html',1,'index']]]
+  ['vk_5famd_5fdevice_5fcoherent_5fmemory_500',['VK_AMD_device_coherent_memory',['../vk_amd_device_coherent_memory.html',1,'index']]],
+  ['vk_5fkhr_5fdedicated_5fallocation_501',['VK_KHR_dedicated_allocation',['../vk_khr_dedicated_allocation.html',1,'index']]],
+  ['vulkan_20memory_20allocator_502',['Vulkan Memory Allocator',['../index.html',1,'']]]
 ];
diff --git a/third_party/vulkan_memory_allocator/docs/html/search/search.css b/third_party/vulkan_memory_allocator/docs/html/search/search.css
index 3cf9df9..9074198 100644
--- a/third_party/vulkan_memory_allocator/docs/html/search/search.css
+++ b/third_party/vulkan_memory_allocator/docs/html/search/search.css
@@ -1,98 +1,82 @@
 /*---------------- Search Box */
 
-#FSearchBox {
-    float: left;
-}
-
 #MSearchBox {
     white-space : nowrap;
-    float: none;
-    margin-top: 8px;
-    right: 0px;
-    width: 170px;
-    height: 24px;
+    background: white;
+    border-radius: 0.65em;
+    box-shadow: inset 0.5px 0.5px 3px 0px #555;
     z-index: 102;
 }
 
-#MSearchBox .left
-{
-    display:block;
-    position:absolute;
-    left:10px;
-    width:20px;
-    height:19px;
-    background:url('search_l.png') no-repeat;
-    background-position:right;
+#MSearchBox .left {
+    display: inline-block;
+    vertical-align: middle;
+    height: 1.4em;
 }
 
 #MSearchSelect {
-    display:block;
-    position:absolute;
-    width:20px;
-    height:19px;
-}
-
-.left #MSearchSelect {
-    left:4px;
-}
-
-.right #MSearchSelect {
-    right:5px;
+    display: inline-block;
+    vertical-align: middle;
+    height: 1.4em;
+    padding: 0 0 0 0.3em;
+    margin: 0;
 }
 
 #MSearchField {
-    display:block;
-    position:absolute;
-    height:19px;
-    background:url('search_m.png') repeat-x;
+    display: inline-block;
+    vertical-align: middle;
+    width: 7.5em;
+    height: 1.1em;
+    margin: 0 0.15em;
+    padding: 0;
+    line-height: 1em;
     border:none;
-    width:115px;
-    margin-left:20px;
-    padding-left:4px;
     color: #909090;
     outline: none;
-    font: 9pt Arial, Verdana, sans-serif;
+    font-family: Arial, Verdana, sans-serif;
     -webkit-border-radius: 0px;
+    border-radius: 0px;
+    background: none;
 }
 
-#FSearchBox #MSearchField {
-    margin-left:15px;
-}
 
 #MSearchBox .right {
-    display:block;
-    position:absolute;
-    right:10px;
-    top:8px;
-    width:20px;
-    height:19px;
-    background:url('search_r.png') no-repeat;
-    background-position:left;
+    display: inline-block;
+    vertical-align: middle;
+    width: 1.4em;
+    height: 1.4em;
 }
 
 #MSearchClose {
     display: none;
-    position: absolute;
-    top: 4px;
+    font-size: inherit;
     background : none;
     border: none;
-    margin: 0px 4px 0px 0px;
-    padding: 0px 0px;
+    margin: 0;
+    padding: 0;
     outline: none;
+
 }
 
-.left #MSearchClose {
-    left: 6px;
-}
-
-.right #MSearchClose {
-    right: 2px;
+#MSearchCloseImg {
+    height: 1.4em;
+    padding: 0.3em;
+    margin: 0;
 }
 
 .MSearchBoxActive #MSearchField {
     color: #000000;
 }
 
+#main-menu > li:last-child {
+    /* This <li> object is the parent of the search bar */
+    display: flex;
+    justify-content: center;
+    align-items: center;
+    height: 36px;
+    margin-right: 1em;
+}
+
 /*---------------- Search filter selection */
 
 #MSearchSelectWindow {
@@ -220,19 +204,21 @@
 
 span.SRScope {
     padding-left: 4px;
+    font-family: Arial, Verdana, sans-serif;
 }
 
 .SRPage .SRStatus {
     padding: 2px 5px;
     font-size: 8pt;
     font-style: italic;
+    font-family: Arial, Verdana, sans-serif;
 }
 
 .SRResult {
     display: none;
 }
 
-DIV.searchresults {
+div.searchresults {
     margin-left: 10px;
     margin-right: 10px;
 }
diff --git a/third_party/vulkan_memory_allocator/docs/html/search/search.js b/third_party/vulkan_memory_allocator/docs/html/search/search.js
index ff2b8c8..fb226f7 100644
--- a/third_party/vulkan_memory_allocator/docs/html/search/search.js
+++ b/third_party/vulkan_memory_allocator/docs/html/search/search.js
@@ -80,9 +80,10 @@
           storing this instance.  Is needed to be able to set timeouts.
    resultPath - path to use for external files
 */
-function SearchBox(name, resultsPath, inFrame, label)
+function SearchBox(name, resultsPath, inFrame, label, extension)
 {
   if (!name || !resultsPath) {  alert("Missing parameters to SearchBox."); }
+  if (!extension || extension == "") { extension = ".html"; }
 
   // ---------- Instance variables
   this.name                  = name;
@@ -97,6 +98,7 @@
   this.searchActive          = false;
   this.insideFrame           = inFrame;
   this.searchLabel           = label;
+  this.extension             = extension;
 
   // ----------- DOM Elements
 
@@ -347,13 +349,13 @@
     if (idx!=-1)
     {
        var hexCode=idx.toString(16);
-       resultsPage = this.resultsPath + '/' + indexSectionNames[this.searchIndex] + '_' + hexCode + '.html';
+       resultsPage = this.resultsPath + '/' + indexSectionNames[this.searchIndex] + '_' + hexCode + this.extension;
        resultsPageWithSearch = resultsPage+'?'+escape(searchValue);
        hasResultsPage = true;
     }
     else // nothing available for this search term
     {
-       resultsPage = this.resultsPath + '/nomatches.html';
+       resultsPage = this.resultsPath + '/nomatches' + this.extension;
        resultsPageWithSearch = resultsPage;
        hasResultsPage = false;
     }
@@ -364,7 +366,7 @@
     if (domPopupSearchResultsWindow.style.display!='block')
     {
        var domSearchBox = this.DOMSearchBox();
-       this.DOMSearchClose().style.display = 'inline';
+       this.DOMSearchClose().style.display = 'inline-block';
        if (this.insideFrame)
        {
          var domPopupSearchResults = this.DOMPopupSearchResults();
@@ -439,12 +441,12 @@
 
       while (element && element!=parentElement)
       {
-        if (element.nodeName == 'DIV' && element.className == 'SRChildren')
+        if (element.nodeName.toLowerCase() == 'div' && element.className == 'SRChildren')
         {
           return element;
         }
 
-        if (element.nodeName == 'DIV' && element.hasChildNodes())
+        if (element.nodeName.toLowerCase() == 'div' && element.hasChildNodes())
         {
            element = element.firstChild;
         }
diff --git a/third_party/vulkan_memory_allocator/docs/html/search/searchdata.js b/third_party/vulkan_memory_allocator/docs/html/search/searchdata.js
index 6a7e9be..f2ec6e4 100644
--- a/third_party/vulkan_memory_allocator/docs/html/search/searchdata.js
+++ b/third_party/vulkan_memory_allocator/docs/html/search/searchdata.js
@@ -1,6 +1,6 @@
 var indexSectionsWithContent =
 {
-  0: "abcdefgilmnopqrstuv",
+  0: "abcdefgilmopqrstuv",
   1: "v",
   2: "v",
   3: "v",
@@ -8,7 +8,7 @@
   5: "pv",
   6: "v",
   7: "v",
-  8: "nv",
+  8: "v",
   9: "acdeglmqrsv"
 };
 
diff --git a/third_party/vulkan_memory_allocator/docs/html/search/typedefs_0.html b/third_party/vulkan_memory_allocator/docs/html/search/typedefs_0.html
index 43353ee..a4684c4 100644
--- a/third_party/vulkan_memory_allocator/docs/html/search/typedefs_0.html
+++ b/third_party/vulkan_memory_allocator/docs/html/search/typedefs_0.html
@@ -1,7 +1,8 @@
 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html><head><title></title>
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head><title></title>
 <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
-<meta name="generator" content="Doxygen 1.8.18"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
 <link rel="stylesheet" type="text/css" href="search.css"/>
 <script type="text/javascript" src="typedefs_0.js"></script>
 <script type="text/javascript" src="search.js"></script>
@@ -10,14 +11,14 @@
 <div id="SRIndex">
 <div class="SRStatus" id="Loading">Loading...</div>
 <div id="SRResults"></div>
-<script type="text/javascript"><!--
+<script type="text/javascript">
 /* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
 createResults();
 /* @license-end */
---></script>
+</script>
 <div class="SRStatus" id="Searching">Searching...</div>
 <div class="SRStatus" id="NoMatches">No Matches</div>
-<script type="text/javascript"><!--
+<script type="text/javascript">
 /* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
 document.getElementById("Loading").style.display="none";
 document.getElementById("NoMatches").style.display="none";
@@ -30,7 +31,7 @@
   }
 });
 /* @license-end */
---></script>
+</script>
 </div>
 </body>
 </html>
diff --git a/third_party/vulkan_memory_allocator/docs/html/search/typedefs_0.js b/third_party/vulkan_memory_allocator/docs/html/search/typedefs_0.js
index 6475b90..25302c7 100644
--- a/third_party/vulkan_memory_allocator/docs/html/search/typedefs_0.js
+++ b/third_party/vulkan_memory_allocator/docs/html/search/typedefs_0.js
@@ -1,5 +1,5 @@
 var searchData=
 [
-  ['pfn_5fvmaallocatedevicememoryfunction_395',['PFN_vmaAllocateDeviceMemoryFunction',['../vk__mem__alloc_8h.html#a7e1ed85f7799600b03ad51a77acc21f3',1,'vk_mem_alloc.h']]],
-  ['pfn_5fvmafreedevicememoryfunction_396',['PFN_vmaFreeDeviceMemoryFunction',['../vk__mem__alloc_8h.html#a154ccaaf53dc2c36378f80f0c4f3679b',1,'vk_mem_alloc.h']]]
+  ['pfn_5fvmaallocatedevicememoryfunction_397',['PFN_vmaAllocateDeviceMemoryFunction',['../vk__mem__alloc_8h.html#a7e1ed85f7799600b03ad51a77acc21f3',1,'vk_mem_alloc.h']]],
+  ['pfn_5fvmafreedevicememoryfunction_398',['PFN_vmaFreeDeviceMemoryFunction',['../vk__mem__alloc_8h.html#a154ccaaf53dc2c36378f80f0c4f3679b',1,'vk_mem_alloc.h']]]
 ];
diff --git a/third_party/vulkan_memory_allocator/docs/html/search/typedefs_1.html b/third_party/vulkan_memory_allocator/docs/html/search/typedefs_1.html
index 84e9542..46cf01e 100644
--- a/third_party/vulkan_memory_allocator/docs/html/search/typedefs_1.html
+++ b/third_party/vulkan_memory_allocator/docs/html/search/typedefs_1.html
@@ -1,7 +1,8 @@
 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html><head><title></title>
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head><title></title>
 <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
-<meta name="generator" content="Doxygen 1.8.18"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
 <link rel="stylesheet" type="text/css" href="search.css"/>
 <script type="text/javascript" src="typedefs_1.js"></script>
 <script type="text/javascript" src="search.js"></script>
@@ -10,14 +11,14 @@
 <div id="SRIndex">
 <div class="SRStatus" id="Loading">Loading...</div>
 <div id="SRResults"></div>
-<script type="text/javascript"><!--
+<script type="text/javascript">
 /* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
 createResults();
 /* @license-end */
---></script>
+</script>
 <div class="SRStatus" id="Searching">Searching...</div>
 <div class="SRStatus" id="NoMatches">No Matches</div>
-<script type="text/javascript"><!--
+<script type="text/javascript">
 /* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
 document.getElementById("Loading").style.display="none";
 document.getElementById("NoMatches").style.display="none";
@@ -30,7 +31,7 @@
   }
 });
 /* @license-end */
---></script>
+</script>
 </div>
 </body>
 </html>
diff --git a/third_party/vulkan_memory_allocator/docs/html/search/typedefs_1.js b/third_party/vulkan_memory_allocator/docs/html/search/typedefs_1.js
index cd8fdb1..ff31250 100644
--- a/third_party/vulkan_memory_allocator/docs/html/search/typedefs_1.js
+++ b/third_party/vulkan_memory_allocator/docs/html/search/typedefs_1.js
@@ -1,31 +1,31 @@
 var searchData=
 [
-  ['vmaallocationcreateflagbits_397',['VmaAllocationCreateFlagBits',['../vk__mem__alloc_8h.html#a4fceecc301f4064dc808d3cd6c038941',1,'vk_mem_alloc.h']]],
-  ['vmaallocationcreateflags_398',['VmaAllocationCreateFlags',['../vk__mem__alloc_8h.html#a5225e5e11f8376f6a31a1791f3d6e817',1,'vk_mem_alloc.h']]],
-  ['vmaallocationcreateinfo_399',['VmaAllocationCreateInfo',['../vk__mem__alloc_8h.html#a3bf110892ea2fb4649fedb68488d026a',1,'vk_mem_alloc.h']]],
-  ['vmaallocationinfo_400',['VmaAllocationInfo',['../vk__mem__alloc_8h.html#a1cf7774606721026a68aabe3af2e5b50',1,'vk_mem_alloc.h']]],
-  ['vmaallocatorcreateflagbits_401',['VmaAllocatorCreateFlagBits',['../vk__mem__alloc_8h.html#afd73b95e737ee7e76f827cb5472f559f',1,'vk_mem_alloc.h']]],
-  ['vmaallocatorcreateflags_402',['VmaAllocatorCreateFlags',['../vk__mem__alloc_8h.html#acfe6863e160722c2c1bbcf7573fddc4d',1,'vk_mem_alloc.h']]],
-  ['vmaallocatorcreateinfo_403',['VmaAllocatorCreateInfo',['../vk__mem__alloc_8h.html#aad9652301d33759b83e52d4f3605a14a',1,'vk_mem_alloc.h']]],
-  ['vmaallocatorinfo_404',['VmaAllocatorInfo',['../vk__mem__alloc_8h.html#a1988031b0223fdbd564250fa1edd942c',1,'vk_mem_alloc.h']]],
-  ['vmabudget_405',['VmaBudget',['../vk__mem__alloc_8h.html#aa078667e71b1ef24e87a6a30d128381d',1,'vk_mem_alloc.h']]],
-  ['vmadefragmentationflagbits_406',['VmaDefragmentationFlagBits',['../vk__mem__alloc_8h.html#a13415cc0b443353a7b5abda300b833fc',1,'vk_mem_alloc.h']]],
-  ['vmadefragmentationflags_407',['VmaDefragmentationFlags',['../vk__mem__alloc_8h.html#a88a77cef37e5d3c4fc9eb328885d048d',1,'vk_mem_alloc.h']]],
-  ['vmadefragmentationinfo_408',['VmaDefragmentationInfo',['../vk__mem__alloc_8h.html#a2bf47f96bf92bed2a49461bd9af3acfa',1,'vk_mem_alloc.h']]],
-  ['vmadefragmentationinfo2_409',['VmaDefragmentationInfo2',['../vk__mem__alloc_8h.html#ad6daeffaa670ce6d11a203a6224c9937',1,'vk_mem_alloc.h']]],
-  ['vmadefragmentationpassinfo_410',['VmaDefragmentationPassInfo',['../vk__mem__alloc_8h.html#a72aebd522242d56abea67b4f47f6549e',1,'vk_mem_alloc.h']]],
-  ['vmadefragmentationpassmoveinfo_411',['VmaDefragmentationPassMoveInfo',['../vk__mem__alloc_8h.html#ad6799e8e2b1527abfc84d33bc44aeaf5',1,'vk_mem_alloc.h']]],
-  ['vmadefragmentationstats_412',['VmaDefragmentationStats',['../vk__mem__alloc_8h.html#ad94034192259c2e34a4d1c5e27810403',1,'vk_mem_alloc.h']]],
-  ['vmadevicememorycallbacks_413',['VmaDeviceMemoryCallbacks',['../vk__mem__alloc_8h.html#a77692d3c8770ea8882d573206bd27b2b',1,'vk_mem_alloc.h']]],
-  ['vmamemoryusage_414',['VmaMemoryUsage',['../vk__mem__alloc_8h.html#a806e8499dde802e59eb72a1dc811c35f',1,'vk_mem_alloc.h']]],
-  ['vmapoolcreateflagbits_415',['VmaPoolCreateFlagBits',['../vk__mem__alloc_8h.html#a4d4f2efc2509157a9e4ecd4fd7942303',1,'vk_mem_alloc.h']]],
-  ['vmapoolcreateflags_416',['VmaPoolCreateFlags',['../vk__mem__alloc_8h.html#a2770e325ea42e087c1b91fdf46d0292a',1,'vk_mem_alloc.h']]],
-  ['vmapoolcreateinfo_417',['VmaPoolCreateInfo',['../vk__mem__alloc_8h.html#a1017aa83489c0eee8d2163d2bf253f67',1,'vk_mem_alloc.h']]],
-  ['vmapoolstats_418',['VmaPoolStats',['../vk__mem__alloc_8h.html#a4759a2d9f99c19ba7627553c847132f1',1,'vk_mem_alloc.h']]],
-  ['vmarecordflagbits_419',['VmaRecordFlagBits',['../vk__mem__alloc_8h.html#acd24d5eb58abff7e1f43cb32a1ba1413',1,'vk_mem_alloc.h']]],
-  ['vmarecordflags_420',['VmaRecordFlags',['../vk__mem__alloc_8h.html#af3929a1a4547c592fc0b0e55ef452828',1,'vk_mem_alloc.h']]],
-  ['vmarecordsettings_421',['VmaRecordSettings',['../vk__mem__alloc_8h.html#a16e21c877101493fce582664cd8754fc',1,'vk_mem_alloc.h']]],
-  ['vmastatinfo_422',['VmaStatInfo',['../vk__mem__alloc_8h.html#aec5b57e29c97b5d69c6d5654d60df878',1,'vk_mem_alloc.h']]],
-  ['vmastats_423',['VmaStats',['../vk__mem__alloc_8h.html#a21813b2efdf3836767a9058cd8a94034',1,'vk_mem_alloc.h']]],
-  ['vmavulkanfunctions_424',['VmaVulkanFunctions',['../vk__mem__alloc_8h.html#abb0a8e3b5040d847571cca6c7f9a8074',1,'vk_mem_alloc.h']]]
+  ['vmaallocationcreateflagbits_399',['VmaAllocationCreateFlagBits',['../vk__mem__alloc_8h.html#a4fceecc301f4064dc808d3cd6c038941',1,'vk_mem_alloc.h']]],
+  ['vmaallocationcreateflags_400',['VmaAllocationCreateFlags',['../vk__mem__alloc_8h.html#a5225e5e11f8376f6a31a1791f3d6e817',1,'vk_mem_alloc.h']]],
+  ['vmaallocationcreateinfo_401',['VmaAllocationCreateInfo',['../vk__mem__alloc_8h.html#a3bf110892ea2fb4649fedb68488d026a',1,'vk_mem_alloc.h']]],
+  ['vmaallocationinfo_402',['VmaAllocationInfo',['../vk__mem__alloc_8h.html#a1cf7774606721026a68aabe3af2e5b50',1,'vk_mem_alloc.h']]],
+  ['vmaallocatorcreateflagbits_403',['VmaAllocatorCreateFlagBits',['../vk__mem__alloc_8h.html#afd73b95e737ee7e76f827cb5472f559f',1,'vk_mem_alloc.h']]],
+  ['vmaallocatorcreateflags_404',['VmaAllocatorCreateFlags',['../vk__mem__alloc_8h.html#acfe6863e160722c2c1bbcf7573fddc4d',1,'vk_mem_alloc.h']]],
+  ['vmaallocatorcreateinfo_405',['VmaAllocatorCreateInfo',['../vk__mem__alloc_8h.html#aad9652301d33759b83e52d4f3605a14a',1,'vk_mem_alloc.h']]],
+  ['vmaallocatorinfo_406',['VmaAllocatorInfo',['../vk__mem__alloc_8h.html#a1988031b0223fdbd564250fa1edd942c',1,'vk_mem_alloc.h']]],
+  ['vmabudget_407',['VmaBudget',['../vk__mem__alloc_8h.html#aa078667e71b1ef24e87a6a30d128381d',1,'vk_mem_alloc.h']]],
+  ['vmadefragmentationflagbits_408',['VmaDefragmentationFlagBits',['../vk__mem__alloc_8h.html#a13415cc0b443353a7b5abda300b833fc',1,'vk_mem_alloc.h']]],
+  ['vmadefragmentationflags_409',['VmaDefragmentationFlags',['../vk__mem__alloc_8h.html#a88a77cef37e5d3c4fc9eb328885d048d',1,'vk_mem_alloc.h']]],
+  ['vmadefragmentationinfo_410',['VmaDefragmentationInfo',['../vk__mem__alloc_8h.html#a2bf47f96bf92bed2a49461bd9af3acfa',1,'vk_mem_alloc.h']]],
+  ['vmadefragmentationinfo2_411',['VmaDefragmentationInfo2',['../vk__mem__alloc_8h.html#ad6daeffaa670ce6d11a203a6224c9937',1,'vk_mem_alloc.h']]],
+  ['vmadefragmentationpassinfo_412',['VmaDefragmentationPassInfo',['../vk__mem__alloc_8h.html#a72aebd522242d56abea67b4f47f6549e',1,'vk_mem_alloc.h']]],
+  ['vmadefragmentationpassmoveinfo_413',['VmaDefragmentationPassMoveInfo',['../vk__mem__alloc_8h.html#ad6799e8e2b1527abfc84d33bc44aeaf5',1,'vk_mem_alloc.h']]],
+  ['vmadefragmentationstats_414',['VmaDefragmentationStats',['../vk__mem__alloc_8h.html#ad94034192259c2e34a4d1c5e27810403',1,'vk_mem_alloc.h']]],
+  ['vmadevicememorycallbacks_415',['VmaDeviceMemoryCallbacks',['../vk__mem__alloc_8h.html#a77692d3c8770ea8882d573206bd27b2b',1,'vk_mem_alloc.h']]],
+  ['vmamemoryusage_416',['VmaMemoryUsage',['../vk__mem__alloc_8h.html#a806e8499dde802e59eb72a1dc811c35f',1,'vk_mem_alloc.h']]],
+  ['vmapoolcreateflagbits_417',['VmaPoolCreateFlagBits',['../vk__mem__alloc_8h.html#a4d4f2efc2509157a9e4ecd4fd7942303',1,'vk_mem_alloc.h']]],
+  ['vmapoolcreateflags_418',['VmaPoolCreateFlags',['../vk__mem__alloc_8h.html#a2770e325ea42e087c1b91fdf46d0292a',1,'vk_mem_alloc.h']]],
+  ['vmapoolcreateinfo_419',['VmaPoolCreateInfo',['../vk__mem__alloc_8h.html#a1017aa83489c0eee8d2163d2bf253f67',1,'vk_mem_alloc.h']]],
+  ['vmapoolstats_420',['VmaPoolStats',['../vk__mem__alloc_8h.html#a4759a2d9f99c19ba7627553c847132f1',1,'vk_mem_alloc.h']]],
+  ['vmarecordflagbits_421',['VmaRecordFlagBits',['../vk__mem__alloc_8h.html#acd24d5eb58abff7e1f43cb32a1ba1413',1,'vk_mem_alloc.h']]],
+  ['vmarecordflags_422',['VmaRecordFlags',['../vk__mem__alloc_8h.html#af3929a1a4547c592fc0b0e55ef452828',1,'vk_mem_alloc.h']]],
+  ['vmarecordsettings_423',['VmaRecordSettings',['../vk__mem__alloc_8h.html#a16e21c877101493fce582664cd8754fc',1,'vk_mem_alloc.h']]],
+  ['vmastatinfo_424',['VmaStatInfo',['../vk__mem__alloc_8h.html#aec5b57e29c97b5d69c6d5654d60df878',1,'vk_mem_alloc.h']]],
+  ['vmastats_425',['VmaStats',['../vk__mem__alloc_8h.html#a21813b2efdf3836767a9058cd8a94034',1,'vk_mem_alloc.h']]],
+  ['vmavulkanfunctions_426',['VmaVulkanFunctions',['../vk__mem__alloc_8h.html#abb0a8e3b5040d847571cca6c7f9a8074',1,'vk_mem_alloc.h']]]
 ];
diff --git a/third_party/vulkan_memory_allocator/docs/html/search/variables_0.html b/third_party/vulkan_memory_allocator/docs/html/search/variables_0.html
index 9ce246b..1e477c0 100644
--- a/third_party/vulkan_memory_allocator/docs/html/search/variables_0.html
+++ b/third_party/vulkan_memory_allocator/docs/html/search/variables_0.html
@@ -1,7 +1,8 @@
 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html><head><title></title>
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head><title></title>
 <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
-<meta name="generator" content="Doxygen 1.8.18"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
 <link rel="stylesheet" type="text/css" href="search.css"/>
 <script type="text/javascript" src="variables_0.js"></script>
 <script type="text/javascript" src="search.js"></script>
@@ -10,14 +11,14 @@
 <div id="SRIndex">
 <div class="SRStatus" id="Loading">Loading...</div>
 <div id="SRResults"></div>
-<script type="text/javascript"><!--
+<script type="text/javascript">
 /* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
 createResults();
 /* @license-end */
---></script>
+</script>
 <div class="SRStatus" id="Searching">Searching...</div>
 <div class="SRStatus" id="NoMatches">No Matches</div>
-<script type="text/javascript"><!--
+<script type="text/javascript">
 /* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
 document.getElementById("Loading").style.display="none";
 document.getElementById("NoMatches").style.display="none";
@@ -30,7 +31,7 @@
   }
 });
 /* @license-end */
---></script>
+</script>
 </div>
 </body>
 </html>
diff --git a/third_party/vulkan_memory_allocator/docs/html/search/variables_0.js b/third_party/vulkan_memory_allocator/docs/html/search/variables_0.js
index c301aa7..b736596 100644
--- a/third_party/vulkan_memory_allocator/docs/html/search/variables_0.js
+++ b/third_party/vulkan_memory_allocator/docs/html/search/variables_0.js
@@ -1,10 +1,10 @@
 var searchData=
 [
-  ['allocation_312',['allocation',['../struct_vma_defragmentation_pass_move_info.html#ae885c861c2dd8d622e6c19e281d035cc',1,'VmaDefragmentationPassMoveInfo']]],
-  ['allocationbytes_313',['allocationBytes',['../struct_vma_budget.html#a7e2a6583ebd63e194951c542563804d8',1,'VmaBudget']]],
-  ['allocationcount_314',['allocationCount',['../struct_vma_stat_info.html#a537741e4d5cdddc1c0ab95ec650afaff',1,'VmaStatInfo::allocationCount()'],['../struct_vma_pool_stats.html#ad1924eb54fffa45e9e0e65670c8fe5eb',1,'VmaPoolStats::allocationCount()'],['../struct_vma_defragmentation_info2.html#a3cf86ab32c1da779b4923d301a3056ba',1,'VmaDefragmentationInfo2::allocationCount()']]],
-  ['allocationsizeavg_315',['allocationSizeAvg',['../struct_vma_stat_info.html#a1081a039964e566c672e7a2347f9e599',1,'VmaStatInfo']]],
-  ['allocationsizemax_316',['allocationSizeMax',['../struct_vma_stat_info.html#a17e9733a5ecd76287d4db6e66f71f50c',1,'VmaStatInfo']]],
-  ['allocationsizemin_317',['allocationSizeMin',['../struct_vma_stat_info.html#ade8b40bd3139c04aabd2fc538a356fea',1,'VmaStatInfo']]],
-  ['allocationsmoved_318',['allocationsMoved',['../struct_vma_defragmentation_stats.html#aefeabf130022008eadd75999478af3f9',1,'VmaDefragmentationStats']]]
+  ['allocation_313',['allocation',['../struct_vma_defragmentation_pass_move_info.html#ae885c861c2dd8d622e6c19e281d035cc',1,'VmaDefragmentationPassMoveInfo']]],
+  ['allocationbytes_314',['allocationBytes',['../struct_vma_budget.html#a7e2a6583ebd63e194951c542563804d8',1,'VmaBudget']]],
+  ['allocationcount_315',['allocationCount',['../struct_vma_stat_info.html#a537741e4d5cdddc1c0ab95ec650afaff',1,'VmaStatInfo::allocationCount()'],['../struct_vma_pool_stats.html#ad1924eb54fffa45e9e0e65670c8fe5eb',1,'VmaPoolStats::allocationCount()'],['../struct_vma_defragmentation_info2.html#a3cf86ab32c1da779b4923d301a3056ba',1,'VmaDefragmentationInfo2::allocationCount()']]],
+  ['allocationsizeavg_316',['allocationSizeAvg',['../struct_vma_stat_info.html#a1081a039964e566c672e7a2347f9e599',1,'VmaStatInfo']]],
+  ['allocationsizemax_317',['allocationSizeMax',['../struct_vma_stat_info.html#a17e9733a5ecd76287d4db6e66f71f50c',1,'VmaStatInfo']]],
+  ['allocationsizemin_318',['allocationSizeMin',['../struct_vma_stat_info.html#ade8b40bd3139c04aabd2fc538a356fea',1,'VmaStatInfo']]],
+  ['allocationsmoved_319',['allocationsMoved',['../struct_vma_defragmentation_stats.html#aefeabf130022008eadd75999478af3f9',1,'VmaDefragmentationStats']]]
 ];
diff --git a/third_party/vulkan_memory_allocator/docs/html/search/variables_1.html b/third_party/vulkan_memory_allocator/docs/html/search/variables_1.html
index 5802cec..ea73d9a 100644
--- a/third_party/vulkan_memory_allocator/docs/html/search/variables_1.html
+++ b/third_party/vulkan_memory_allocator/docs/html/search/variables_1.html
@@ -1,7 +1,8 @@
 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html><head><title></title>
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head><title></title>
 <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
-<meta name="generator" content="Doxygen 1.8.18"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
 <link rel="stylesheet" type="text/css" href="search.css"/>
 <script type="text/javascript" src="variables_1.js"></script>
 <script type="text/javascript" src="search.js"></script>
@@ -10,14 +11,14 @@
 <div id="SRIndex">
 <div class="SRStatus" id="Loading">Loading...</div>
 <div id="SRResults"></div>
-<script type="text/javascript"><!--
+<script type="text/javascript">
 /* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
 createResults();
 /* @license-end */
---></script>
+</script>
 <div class="SRStatus" id="Searching">Searching...</div>
 <div class="SRStatus" id="NoMatches">No Matches</div>
-<script type="text/javascript"><!--
+<script type="text/javascript">
 /* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
 document.getElementById("Loading").style.display="none";
 document.getElementById("NoMatches").style.display="none";
@@ -30,7 +31,7 @@
   }
 });
 /* @license-end */
---></script>
+</script>
 </div>
 </body>
 </html>
diff --git a/third_party/vulkan_memory_allocator/docs/html/search/variables_1.js b/third_party/vulkan_memory_allocator/docs/html/search/variables_1.js
index 8b6acfe..71f3c5d 100644
--- a/third_party/vulkan_memory_allocator/docs/html/search/variables_1.js
+++ b/third_party/vulkan_memory_allocator/docs/html/search/variables_1.js
@@ -1,9 +1,9 @@
 var searchData=
 [
-  ['blockbytes_319',['blockBytes',['../struct_vma_budget.html#a58b492901baab685f466199124e514a0',1,'VmaBudget']]],
-  ['blockcount_320',['blockCount',['../struct_vma_stat_info.html#abc4bb7cd611900778464c56e50c970a4',1,'VmaStatInfo::blockCount()'],['../struct_vma_pool_stats.html#aa0b5cb45cef6f18571cefb03b9a230e7',1,'VmaPoolStats::blockCount()']]],
-  ['blocksize_321',['blockSize',['../struct_vma_pool_create_info.html#aa4265160536cdb9be821b7686c16c676',1,'VmaPoolCreateInfo']]],
-  ['budget_322',['budget',['../struct_vma_budget.html#ab82e1d1754c2d210d0bdf90220bc6cdd',1,'VmaBudget']]],
-  ['bytesfreed_323',['bytesFreed',['../struct_vma_defragmentation_stats.html#ab0cb9ac0dbc106c77e384ea676422f28',1,'VmaDefragmentationStats']]],
-  ['bytesmoved_324',['bytesMoved',['../struct_vma_defragmentation_stats.html#a36f9d5df2a10ba2a36b16e126d60572d',1,'VmaDefragmentationStats']]]
+  ['blockbytes_320',['blockBytes',['../struct_vma_budget.html#a58b492901baab685f466199124e514a0',1,'VmaBudget']]],
+  ['blockcount_321',['blockCount',['../struct_vma_stat_info.html#abc4bb7cd611900778464c56e50c970a4',1,'VmaStatInfo::blockCount()'],['../struct_vma_pool_stats.html#aa0b5cb45cef6f18571cefb03b9a230e7',1,'VmaPoolStats::blockCount()']]],
+  ['blocksize_322',['blockSize',['../struct_vma_pool_create_info.html#aa4265160536cdb9be821b7686c16c676',1,'VmaPoolCreateInfo']]],
+  ['budget_323',['budget',['../struct_vma_budget.html#ab82e1d1754c2d210d0bdf90220bc6cdd',1,'VmaBudget']]],
+  ['bytesfreed_324',['bytesFreed',['../struct_vma_defragmentation_stats.html#ab0cb9ac0dbc106c77e384ea676422f28',1,'VmaDefragmentationStats']]],
+  ['bytesmoved_325',['bytesMoved',['../struct_vma_defragmentation_stats.html#a36f9d5df2a10ba2a36b16e126d60572d',1,'VmaDefragmentationStats']]]
 ];
diff --git a/third_party/vulkan_memory_allocator/docs/html/search/variables_2.html b/third_party/vulkan_memory_allocator/docs/html/search/variables_2.html
index 00291e5..0580462 100644
--- a/third_party/vulkan_memory_allocator/docs/html/search/variables_2.html
+++ b/third_party/vulkan_memory_allocator/docs/html/search/variables_2.html
@@ -1,7 +1,8 @@
 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html><head><title></title>
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head><title></title>
 <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
-<meta name="generator" content="Doxygen 1.8.18"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
 <link rel="stylesheet" type="text/css" href="search.css"/>
 <script type="text/javascript" src="variables_2.js"></script>
 <script type="text/javascript" src="search.js"></script>
@@ -10,14 +11,14 @@
 <div id="SRIndex">
 <div class="SRStatus" id="Loading">Loading...</div>
 <div id="SRResults"></div>
-<script type="text/javascript"><!--
+<script type="text/javascript">
 /* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
 createResults();
 /* @license-end */
---></script>
+</script>
 <div class="SRStatus" id="Searching">Searching...</div>
 <div class="SRStatus" id="NoMatches">No Matches</div>
-<script type="text/javascript"><!--
+<script type="text/javascript">
 /* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
 document.getElementById("Loading").style.display="none";
 document.getElementById("NoMatches").style.display="none";
@@ -30,7 +31,7 @@
   }
 });
 /* @license-end */
---></script>
+</script>
 </div>
 </body>
 </html>
diff --git a/third_party/vulkan_memory_allocator/docs/html/search/variables_2.js b/third_party/vulkan_memory_allocator/docs/html/search/variables_2.js
index 3754879..edcfe09 100644
--- a/third_party/vulkan_memory_allocator/docs/html/search/variables_2.js
+++ b/third_party/vulkan_memory_allocator/docs/html/search/variables_2.js
@@ -1,4 +1,4 @@
 var searchData=
 [
-  ['commandbuffer_325',['commandBuffer',['../struct_vma_defragmentation_info2.html#a7f71f39590c5316771493d2333f9c1bd',1,'VmaDefragmentationInfo2']]]
+  ['commandbuffer_326',['commandBuffer',['../struct_vma_defragmentation_info2.html#a7f71f39590c5316771493d2333f9c1bd',1,'VmaDefragmentationInfo2']]]
 ];
diff --git a/third_party/vulkan_memory_allocator/docs/html/search/variables_3.html b/third_party/vulkan_memory_allocator/docs/html/search/variables_3.html
index 0e5389b..0d69e76 100644
--- a/third_party/vulkan_memory_allocator/docs/html/search/variables_3.html
+++ b/third_party/vulkan_memory_allocator/docs/html/search/variables_3.html
@@ -1,7 +1,8 @@
 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html><head><title></title>
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head><title></title>
 <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
-<meta name="generator" content="Doxygen 1.8.18"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
 <link rel="stylesheet" type="text/css" href="search.css"/>
 <script type="text/javascript" src="variables_3.js"></script>
 <script type="text/javascript" src="search.js"></script>
@@ -10,14 +11,14 @@
 <div id="SRIndex">
 <div class="SRStatus" id="Loading">Loading...</div>
 <div id="SRResults"></div>
-<script type="text/javascript"><!--
+<script type="text/javascript">
 /* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
 createResults();
 /* @license-end */
---></script>
+</script>
 <div class="SRStatus" id="Searching">Searching...</div>
 <div class="SRStatus" id="NoMatches">No Matches</div>
-<script type="text/javascript"><!--
+<script type="text/javascript">
 /* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
 document.getElementById("Loading").style.display="none";
 document.getElementById("NoMatches").style.display="none";
@@ -30,7 +31,7 @@
   }
 });
 /* @license-end */
---></script>
+</script>
 </div>
 </body>
 </html>
diff --git a/third_party/vulkan_memory_allocator/docs/html/search/variables_3.js b/third_party/vulkan_memory_allocator/docs/html/search/variables_3.js
index 3335fa9..65200bb 100644
--- a/third_party/vulkan_memory_allocator/docs/html/search/variables_3.js
+++ b/third_party/vulkan_memory_allocator/docs/html/search/variables_3.js
@@ -1,6 +1,6 @@
 var searchData=
 [
-  ['device_326',['device',['../struct_vma_allocator_create_info.html#ad924ddd77b04039c88d0c09b0ffcd500',1,'VmaAllocatorCreateInfo::device()'],['../struct_vma_allocator_info.html#a012b4c485bf3b0ea8921352c5ee0c357',1,'VmaAllocatorInfo::device()']]],
-  ['devicememory_327',['deviceMemory',['../struct_vma_allocation_info.html#ae0bfb7dfdf79a76ffefc9a94677a2f67',1,'VmaAllocationInfo']]],
-  ['devicememoryblocksfreed_328',['deviceMemoryBlocksFreed',['../struct_vma_defragmentation_stats.html#a0113f1877904a5d1ee8f409216ff276b',1,'VmaDefragmentationStats']]]
+  ['device_327',['device',['../struct_vma_allocator_create_info.html#ad924ddd77b04039c88d0c09b0ffcd500',1,'VmaAllocatorCreateInfo::device()'],['../struct_vma_allocator_info.html#a012b4c485bf3b0ea8921352c5ee0c357',1,'VmaAllocatorInfo::device()']]],
+  ['devicememory_328',['deviceMemory',['../struct_vma_allocation_info.html#ae0bfb7dfdf79a76ffefc9a94677a2f67',1,'VmaAllocationInfo']]],
+  ['devicememoryblocksfreed_329',['deviceMemoryBlocksFreed',['../struct_vma_defragmentation_stats.html#a0113f1877904a5d1ee8f409216ff276b',1,'VmaDefragmentationStats']]]
 ];
diff --git a/third_party/vulkan_memory_allocator/docs/html/search/variables_4.html b/third_party/vulkan_memory_allocator/docs/html/search/variables_4.html
index 789a86b..a4b6506 100644
--- a/third_party/vulkan_memory_allocator/docs/html/search/variables_4.html
+++ b/third_party/vulkan_memory_allocator/docs/html/search/variables_4.html
@@ -1,7 +1,8 @@
 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html><head><title></title>
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head><title></title>
 <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
-<meta name="generator" content="Doxygen 1.8.18"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
 <link rel="stylesheet" type="text/css" href="search.css"/>
 <script type="text/javascript" src="variables_4.js"></script>
 <script type="text/javascript" src="search.js"></script>
@@ -10,14 +11,14 @@
 <div id="SRIndex">
 <div class="SRStatus" id="Loading">Loading...</div>
 <div id="SRResults"></div>
-<script type="text/javascript"><!--
+<script type="text/javascript">
 /* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
 createResults();
 /* @license-end */
---></script>
+</script>
 <div class="SRStatus" id="Searching">Searching...</div>
 <div class="SRStatus" id="NoMatches">No Matches</div>
-<script type="text/javascript"><!--
+<script type="text/javascript">
 /* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
 document.getElementById("Loading").style.display="none";
 document.getElementById("NoMatches").style.display="none";
@@ -30,7 +31,7 @@
   }
 });
 /* @license-end */
---></script>
+</script>
 </div>
 </body>
 </html>
diff --git a/third_party/vulkan_memory_allocator/docs/html/search/variables_4.js b/third_party/vulkan_memory_allocator/docs/html/search/variables_4.js
index 332a035..31b9769 100644
--- a/third_party/vulkan_memory_allocator/docs/html/search/variables_4.js
+++ b/third_party/vulkan_memory_allocator/docs/html/search/variables_4.js
@@ -1,5 +1,5 @@
 var searchData=
 [
-  ['flags_329',['flags',['../struct_vma_record_settings.html#ad8fdcc92119ae7a8c08c1a564c01d63a',1,'VmaRecordSettings::flags()'],['../struct_vma_allocator_create_info.html#a392ea2ecbaff93f91a7c49f735ad4346',1,'VmaAllocatorCreateInfo::flags()'],['../struct_vma_allocation_create_info.html#add09658ac14fe290ace25470ddd6d41b',1,'VmaAllocationCreateInfo::flags()'],['../struct_vma_pool_create_info.html#a8405139f63d078340ae74513a59f5446',1,'VmaPoolCreateInfo::flags()'],['../struct_vma_defragmentation_info2.html#a53e844ee5633e229cf6daf14b2d9fff9',1,'VmaDefragmentationInfo2::flags()']]],
-  ['frameinusecount_330',['frameInUseCount',['../struct_vma_allocator_create_info.html#a21ea188dd212b8171cb9ecbed4a2a3a7',1,'VmaAllocatorCreateInfo::frameInUseCount()'],['../struct_vma_pool_create_info.html#a9437e43ffbb644dbbf7fc4e50cfad6aa',1,'VmaPoolCreateInfo::frameInUseCount()']]]
+  ['flags_330',['flags',['../struct_vma_record_settings.html#ad8fdcc92119ae7a8c08c1a564c01d63a',1,'VmaRecordSettings::flags()'],['../struct_vma_allocator_create_info.html#a392ea2ecbaff93f91a7c49f735ad4346',1,'VmaAllocatorCreateInfo::flags()'],['../struct_vma_allocation_create_info.html#add09658ac14fe290ace25470ddd6d41b',1,'VmaAllocationCreateInfo::flags()'],['../struct_vma_pool_create_info.html#a8405139f63d078340ae74513a59f5446',1,'VmaPoolCreateInfo::flags()'],['../struct_vma_defragmentation_info2.html#a53e844ee5633e229cf6daf14b2d9fff9',1,'VmaDefragmentationInfo2::flags()']]],
+  ['frameinusecount_331',['frameInUseCount',['../struct_vma_allocator_create_info.html#a21ea188dd212b8171cb9ecbed4a2a3a7',1,'VmaAllocatorCreateInfo::frameInUseCount()'],['../struct_vma_pool_create_info.html#a9437e43ffbb644dbbf7fc4e50cfad6aa',1,'VmaPoolCreateInfo::frameInUseCount()']]]
 ];
diff --git a/third_party/vulkan_memory_allocator/docs/html/search/variables_5.html b/third_party/vulkan_memory_allocator/docs/html/search/variables_5.html
index c7873eb..7e345d1 100644
--- a/third_party/vulkan_memory_allocator/docs/html/search/variables_5.html
+++ b/third_party/vulkan_memory_allocator/docs/html/search/variables_5.html
@@ -1,7 +1,8 @@
 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html><head><title></title>
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head><title></title>
 <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
-<meta name="generator" content="Doxygen 1.8.18"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
 <link rel="stylesheet" type="text/css" href="search.css"/>
 <script type="text/javascript" src="variables_5.js"></script>
 <script type="text/javascript" src="search.js"></script>
@@ -10,14 +11,14 @@
 <div id="SRIndex">
 <div class="SRStatus" id="Loading">Loading...</div>
 <div id="SRResults"></div>
-<script type="text/javascript"><!--
+<script type="text/javascript">
 /* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
 createResults();
 /* @license-end */
---></script>
+</script>
 <div class="SRStatus" id="Searching">Searching...</div>
 <div class="SRStatus" id="NoMatches">No Matches</div>
-<script type="text/javascript"><!--
+<script type="text/javascript">
 /* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
 document.getElementById("Loading").style.display="none";
 document.getElementById("NoMatches").style.display="none";
@@ -30,7 +31,7 @@
   }
 });
 /* @license-end */
---></script>
+</script>
 </div>
 </body>
 </html>
diff --git a/third_party/vulkan_memory_allocator/docs/html/search/variables_5.js b/third_party/vulkan_memory_allocator/docs/html/search/variables_5.js
index 7327328..0aad120 100644
--- a/third_party/vulkan_memory_allocator/docs/html/search/variables_5.js
+++ b/third_party/vulkan_memory_allocator/docs/html/search/variables_5.js
@@ -1,4 +1,4 @@
 var searchData=
 [
-  ['instance_331',['instance',['../struct_vma_allocator_create_info.html#a70dd42e29b1df1d1b9b61532ae0b370b',1,'VmaAllocatorCreateInfo::instance()'],['../struct_vma_allocator_info.html#a2ed6a4d2d3fea039d66a13f15d0ce5fe',1,'VmaAllocatorInfo::instance()']]]
+  ['instance_332',['instance',['../struct_vma_allocator_create_info.html#a70dd42e29b1df1d1b9b61532ae0b370b',1,'VmaAllocatorCreateInfo::instance()'],['../struct_vma_allocator_info.html#a2ed6a4d2d3fea039d66a13f15d0ce5fe',1,'VmaAllocatorInfo::instance()']]]
 ];
diff --git a/third_party/vulkan_memory_allocator/docs/html/search/variables_6.html b/third_party/vulkan_memory_allocator/docs/html/search/variables_6.html
index a588588..7d48e75 100644
--- a/third_party/vulkan_memory_allocator/docs/html/search/variables_6.html
+++ b/third_party/vulkan_memory_allocator/docs/html/search/variables_6.html
@@ -1,7 +1,8 @@
 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html><head><title></title>
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head><title></title>
 <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
-<meta name="generator" content="Doxygen 1.8.18"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
 <link rel="stylesheet" type="text/css" href="search.css"/>
 <script type="text/javascript" src="variables_6.js"></script>
 <script type="text/javascript" src="search.js"></script>
@@ -10,14 +11,14 @@
 <div id="SRIndex">
 <div class="SRStatus" id="Loading">Loading...</div>
 <div id="SRResults"></div>
-<script type="text/javascript"><!--
+<script type="text/javascript">
 /* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
 createResults();
 /* @license-end */
---></script>
+</script>
 <div class="SRStatus" id="Searching">Searching...</div>
 <div class="SRStatus" id="NoMatches">No Matches</div>
-<script type="text/javascript"><!--
+<script type="text/javascript">
 /* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
 document.getElementById("Loading").style.display="none";
 document.getElementById("NoMatches").style.display="none";
@@ -30,7 +31,7 @@
   }
 });
 /* @license-end */
---></script>
+</script>
 </div>
 </body>
 </html>
diff --git a/third_party/vulkan_memory_allocator/docs/html/search/variables_6.js b/third_party/vulkan_memory_allocator/docs/html/search/variables_6.js
index 6f721c4..168f828 100644
--- a/third_party/vulkan_memory_allocator/docs/html/search/variables_6.js
+++ b/third_party/vulkan_memory_allocator/docs/html/search/variables_6.js
@@ -1,17 +1,17 @@
 var searchData=
 [
-  ['maxallocationstomove_332',['maxAllocationsToMove',['../struct_vma_defragmentation_info.html#aa7c7304e13c71f604c907196c4e28fbc',1,'VmaDefragmentationInfo']]],
-  ['maxblockcount_333',['maxBlockCount',['../struct_vma_pool_create_info.html#ae41142f2834fcdc82baa4883c187b75c',1,'VmaPoolCreateInfo']]],
-  ['maxbytestomove_334',['maxBytesToMove',['../struct_vma_defragmentation_info.html#acb311c940a777270e67e1b81c5ab6a1d',1,'VmaDefragmentationInfo']]],
-  ['maxcpuallocationstomove_335',['maxCpuAllocationsToMove',['../struct_vma_defragmentation_info2.html#a94c2c7223d52878445a8cccce396b671',1,'VmaDefragmentationInfo2']]],
-  ['maxcpubytestomove_336',['maxCpuBytesToMove',['../struct_vma_defragmentation_info2.html#af78e1ea40c22d85137b65f6b384a4d0a',1,'VmaDefragmentationInfo2']]],
-  ['maxgpuallocationstomove_337',['maxGpuAllocationsToMove',['../struct_vma_defragmentation_info2.html#a40d53d33e71ba0b66f844ed63c05a3f6',1,'VmaDefragmentationInfo2']]],
-  ['maxgpubytestomove_338',['maxGpuBytesToMove',['../struct_vma_defragmentation_info2.html#a4ddbc898d0afe1518f863a3763628f08',1,'VmaDefragmentationInfo2']]],
-  ['memory_339',['memory',['../struct_vma_defragmentation_pass_move_info.html#a06eb0c8690aa0d3478a036753492e769',1,'VmaDefragmentationPassMoveInfo']]],
-  ['memoryheap_340',['memoryHeap',['../struct_vma_stats.html#a0e6611508c29a187f0fd14ff1a0329c0',1,'VmaStats']]],
-  ['memorytype_341',['memoryType',['../struct_vma_stats.html#a13e3caf754be79352c42408756309331',1,'VmaStats::memoryType()'],['../struct_vma_allocation_info.html#a7f6b0aa58c135e488e6b40a388dad9d5',1,'VmaAllocationInfo::memoryType()']]],
-  ['memorytypebits_342',['memoryTypeBits',['../struct_vma_allocation_create_info.html#a3bf940c0271d85d6ba32a4d820075055',1,'VmaAllocationCreateInfo']]],
-  ['memorytypeindex_343',['memoryTypeIndex',['../struct_vma_pool_create_info.html#a596fa76b685d3f1f688f84a709a5b319',1,'VmaPoolCreateInfo']]],
-  ['minblockcount_344',['minBlockCount',['../struct_vma_pool_create_info.html#ad8006fb803185c0a699d30f3e9a865ae',1,'VmaPoolCreateInfo']]],
-  ['movecount_345',['moveCount',['../struct_vma_defragmentation_pass_info.html#ac1086e657ba995f8d1f4e49b83dcfb6c',1,'VmaDefragmentationPassInfo']]]
+  ['maxallocationstomove_333',['maxAllocationsToMove',['../struct_vma_defragmentation_info.html#aa7c7304e13c71f604c907196c4e28fbc',1,'VmaDefragmentationInfo']]],
+  ['maxblockcount_334',['maxBlockCount',['../struct_vma_pool_create_info.html#ae41142f2834fcdc82baa4883c187b75c',1,'VmaPoolCreateInfo']]],
+  ['maxbytestomove_335',['maxBytesToMove',['../struct_vma_defragmentation_info.html#acb311c940a777270e67e1b81c5ab6a1d',1,'VmaDefragmentationInfo']]],
+  ['maxcpuallocationstomove_336',['maxCpuAllocationsToMove',['../struct_vma_defragmentation_info2.html#a94c2c7223d52878445a8cccce396b671',1,'VmaDefragmentationInfo2']]],
+  ['maxcpubytestomove_337',['maxCpuBytesToMove',['../struct_vma_defragmentation_info2.html#af78e1ea40c22d85137b65f6b384a4d0a',1,'VmaDefragmentationInfo2']]],
+  ['maxgpuallocationstomove_338',['maxGpuAllocationsToMove',['../struct_vma_defragmentation_info2.html#a40d53d33e71ba0b66f844ed63c05a3f6',1,'VmaDefragmentationInfo2']]],
+  ['maxgpubytestomove_339',['maxGpuBytesToMove',['../struct_vma_defragmentation_info2.html#a4ddbc898d0afe1518f863a3763628f08',1,'VmaDefragmentationInfo2']]],
+  ['memory_340',['memory',['../struct_vma_defragmentation_pass_move_info.html#a06eb0c8690aa0d3478a036753492e769',1,'VmaDefragmentationPassMoveInfo']]],
+  ['memoryheap_341',['memoryHeap',['../struct_vma_stats.html#a0e6611508c29a187f0fd14ff1a0329c0',1,'VmaStats']]],
+  ['memorytype_342',['memoryType',['../struct_vma_stats.html#a13e3caf754be79352c42408756309331',1,'VmaStats::memoryType()'],['../struct_vma_allocation_info.html#a7f6b0aa58c135e488e6b40a388dad9d5',1,'VmaAllocationInfo::memoryType()']]],
+  ['memorytypebits_343',['memoryTypeBits',['../struct_vma_allocation_create_info.html#a3bf940c0271d85d6ba32a4d820075055',1,'VmaAllocationCreateInfo']]],
+  ['memorytypeindex_344',['memoryTypeIndex',['../struct_vma_pool_create_info.html#a596fa76b685d3f1f688f84a709a5b319',1,'VmaPoolCreateInfo']]],
+  ['minblockcount_345',['minBlockCount',['../struct_vma_pool_create_info.html#ad8006fb803185c0a699d30f3e9a865ae',1,'VmaPoolCreateInfo']]],
+  ['movecount_346',['moveCount',['../struct_vma_defragmentation_pass_info.html#ac1086e657ba995f8d1f4e49b83dcfb6c',1,'VmaDefragmentationPassInfo']]]
 ];
diff --git a/third_party/vulkan_memory_allocator/docs/html/search/variables_7.html b/third_party/vulkan_memory_allocator/docs/html/search/variables_7.html
index b09b295..5c26340 100644
--- a/third_party/vulkan_memory_allocator/docs/html/search/variables_7.html
+++ b/third_party/vulkan_memory_allocator/docs/html/search/variables_7.html
@@ -1,7 +1,8 @@
 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html><head><title></title>
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head><title></title>
 <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
-<meta name="generator" content="Doxygen 1.8.18"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
 <link rel="stylesheet" type="text/css" href="search.css"/>
 <script type="text/javascript" src="variables_7.js"></script>
 <script type="text/javascript" src="search.js"></script>
@@ -10,14 +11,14 @@
 <div id="SRIndex">
 <div class="SRStatus" id="Loading">Loading...</div>
 <div id="SRResults"></div>
-<script type="text/javascript"><!--
+<script type="text/javascript">
 /* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
 createResults();
 /* @license-end */
---></script>
+</script>
 <div class="SRStatus" id="Searching">Searching...</div>
 <div class="SRStatus" id="NoMatches">No Matches</div>
-<script type="text/javascript"><!--
+<script type="text/javascript">
 /* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
 document.getElementById("Loading").style.display="none";
 document.getElementById("NoMatches").style.display="none";
@@ -30,7 +31,7 @@
   }
 });
 /* @license-end */
---></script>
+</script>
 </div>
 </body>
 </html>
diff --git a/third_party/vulkan_memory_allocator/docs/html/search/variables_7.js b/third_party/vulkan_memory_allocator/docs/html/search/variables_7.js
index 13aadd0..e68edf1 100644
--- a/third_party/vulkan_memory_allocator/docs/html/search/variables_7.js
+++ b/third_party/vulkan_memory_allocator/docs/html/search/variables_7.js
@@ -1,4 +1,4 @@
 var searchData=
 [
-  ['offset_346',['offset',['../struct_vma_allocation_info.html#a4a3c732388dbdc7a23f9365b00825268',1,'VmaAllocationInfo::offset()'],['../struct_vma_defragmentation_pass_move_info.html#a8ab4508bc03625b0653c880576be96c6',1,'VmaDefragmentationPassMoveInfo::offset()']]]
+  ['offset_347',['offset',['../struct_vma_allocation_info.html#a4a3c732388dbdc7a23f9365b00825268',1,'VmaAllocationInfo::offset()'],['../struct_vma_defragmentation_pass_move_info.html#a8ab4508bc03625b0653c880576be96c6',1,'VmaDefragmentationPassMoveInfo::offset()']]]
 ];
diff --git a/third_party/vulkan_memory_allocator/docs/html/search/variables_8.html b/third_party/vulkan_memory_allocator/docs/html/search/variables_8.html
index a479f8e..dc9ec54 100644
--- a/third_party/vulkan_memory_allocator/docs/html/search/variables_8.html
+++ b/third_party/vulkan_memory_allocator/docs/html/search/variables_8.html
@@ -1,7 +1,8 @@
 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html><head><title></title>
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head><title></title>
 <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
-<meta name="generator" content="Doxygen 1.8.18"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
 <link rel="stylesheet" type="text/css" href="search.css"/>
 <script type="text/javascript" src="variables_8.js"></script>
 <script type="text/javascript" src="search.js"></script>
@@ -10,14 +11,14 @@
 <div id="SRIndex">
 <div class="SRStatus" id="Loading">Loading...</div>
 <div id="SRResults"></div>
-<script type="text/javascript"><!--
+<script type="text/javascript">
 /* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
 createResults();
 /* @license-end */
---></script>
+</script>
 <div class="SRStatus" id="Searching">Searching...</div>
 <div class="SRStatus" id="NoMatches">No Matches</div>
-<script type="text/javascript"><!--
+<script type="text/javascript">
 /* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
 document.getElementById("Loading").style.display="none";
 document.getElementById("NoMatches").style.display="none";
@@ -30,7 +31,7 @@
   }
 });
 /* @license-end */
---></script>
+</script>
 </div>
 </body>
 </html>
diff --git a/third_party/vulkan_memory_allocator/docs/html/search/variables_8.js b/third_party/vulkan_memory_allocator/docs/html/search/variables_8.js
index 408b163..22a6742 100644
--- a/third_party/vulkan_memory_allocator/docs/html/search/variables_8.js
+++ b/third_party/vulkan_memory_allocator/docs/html/search/variables_8.js
@@ -1,22 +1,23 @@
 var searchData=
 [
-  ['pallocationcallbacks_347',['pAllocationCallbacks',['../struct_vma_allocator_create_info.html#a6e409087e3be55400d0e4ccbe43c608d',1,'VmaAllocatorCreateInfo']]],
-  ['pallocations_348',['pAllocations',['../struct_vma_defragmentation_info2.html#ab6d288f29d028156cf73542d630a2e32',1,'VmaDefragmentationInfo2']]],
-  ['pallocationschanged_349',['pAllocationsChanged',['../struct_vma_defragmentation_info2.html#a76d51a644dc7f5405d0cdd0025ecd0cc',1,'VmaDefragmentationInfo2']]],
-  ['pdevicememorycallbacks_350',['pDeviceMemoryCallbacks',['../struct_vma_allocator_create_info.html#af1380969b5e1ea4c3184a877892d260e',1,'VmaAllocatorCreateInfo']]],
-  ['pfilepath_351',['pFilePath',['../struct_vma_record_settings.html#a6cb1fdbf6bcb610b68f2010dd629e89d',1,'VmaRecordSettings']]],
-  ['pfnallocate_352',['pfnAllocate',['../struct_vma_device_memory_callbacks.html#a4f17f7b255101e733b44d5633aceabfb',1,'VmaDeviceMemoryCallbacks']]],
-  ['pfnfree_353',['pfnFree',['../struct_vma_device_memory_callbacks.html#abe8a3328bbc916f6f712fdb6b299444c',1,'VmaDeviceMemoryCallbacks']]],
-  ['pheapsizelimit_354',['pHeapSizeLimit',['../struct_vma_allocator_create_info.html#a31c192aa6cbffa33279f6d9f0c47c44b',1,'VmaAllocatorCreateInfo']]],
-  ['physicaldevice_355',['physicalDevice',['../struct_vma_allocator_create_info.html#a08230f04ae6ccf8a78150a9e829a7156',1,'VmaAllocatorCreateInfo::physicalDevice()'],['../struct_vma_allocator_info.html#aba2b703f96e51d567717e1fb2935b47a',1,'VmaAllocatorInfo::physicalDevice()']]],
-  ['pmappeddata_356',['pMappedData',['../struct_vma_allocation_info.html#a5eeffbe2d2f30f53370ff14aefbadbe2',1,'VmaAllocationInfo']]],
-  ['pmoves_357',['pMoves',['../struct_vma_defragmentation_pass_info.html#acbd42d4a3357999da130a95cd99a3792',1,'VmaDefragmentationPassInfo']]],
-  ['pool_358',['pool',['../struct_vma_allocation_create_info.html#a6272c0555cfd1fe28bff1afeb6190150',1,'VmaAllocationCreateInfo']]],
-  ['poolcount_359',['poolCount',['../struct_vma_defragmentation_info2.html#a7e70aa2a1081d849dcc7829b19d3ec9d',1,'VmaDefragmentationInfo2']]],
-  ['ppools_360',['pPools',['../struct_vma_defragmentation_info2.html#a3c9c6aa5c97d5670f8e362b3a6f3029b',1,'VmaDefragmentationInfo2']]],
-  ['precordsettings_361',['pRecordSettings',['../struct_vma_allocator_create_info.html#ace2aa4877b16a42b0b7673d4e26000ee',1,'VmaAllocatorCreateInfo']]],
-  ['preferredflags_362',['preferredFlags',['../struct_vma_allocation_create_info.html#a7fe8d81a1ad10b2a2faacacee5b15d6d',1,'VmaAllocationCreateInfo']]],
-  ['preferredlargeheapblocksize_363',['preferredLargeHeapBlockSize',['../struct_vma_allocator_create_info.html#a8e4714298e3121cdd8b214a1ae7a637a',1,'VmaAllocatorCreateInfo']]],
-  ['puserdata_364',['pUserData',['../struct_vma_device_memory_callbacks.html#a24052de0937ddd54015a2df0363903c6',1,'VmaDeviceMemoryCallbacks::pUserData()'],['../struct_vma_allocation_create_info.html#a8259e85c272683434f4abb4ddddffe19',1,'VmaAllocationCreateInfo::pUserData()'],['../struct_vma_allocation_info.html#adc507656149c04de7ed95d0042ba2a13',1,'VmaAllocationInfo::pUserData()']]],
-  ['pvulkanfunctions_365',['pVulkanFunctions',['../struct_vma_allocator_create_info.html#a3dc197be3227da7338b1643f70db36bd',1,'VmaAllocatorCreateInfo']]]
+  ['pallocationcallbacks_348',['pAllocationCallbacks',['../struct_vma_allocator_create_info.html#a6e409087e3be55400d0e4ccbe43c608d',1,'VmaAllocatorCreateInfo']]],
+  ['pallocations_349',['pAllocations',['../struct_vma_defragmentation_info2.html#ab6d288f29d028156cf73542d630a2e32',1,'VmaDefragmentationInfo2']]],
+  ['pallocationschanged_350',['pAllocationsChanged',['../struct_vma_defragmentation_info2.html#a76d51a644dc7f5405d0cdd0025ecd0cc',1,'VmaDefragmentationInfo2']]],
+  ['pdevicememorycallbacks_351',['pDeviceMemoryCallbacks',['../struct_vma_allocator_create_info.html#af1380969b5e1ea4c3184a877892d260e',1,'VmaAllocatorCreateInfo']]],
+  ['pfilepath_352',['pFilePath',['../struct_vma_record_settings.html#a6cb1fdbf6bcb610b68f2010dd629e89d',1,'VmaRecordSettings']]],
+  ['pfnallocate_353',['pfnAllocate',['../struct_vma_device_memory_callbacks.html#a4f17f7b255101e733b44d5633aceabfb',1,'VmaDeviceMemoryCallbacks']]],
+  ['pfnfree_354',['pfnFree',['../struct_vma_device_memory_callbacks.html#abe8a3328bbc916f6f712fdb6b299444c',1,'VmaDeviceMemoryCallbacks']]],
+  ['pheapsizelimit_355',['pHeapSizeLimit',['../struct_vma_allocator_create_info.html#a31c192aa6cbffa33279f6d9f0c47c44b',1,'VmaAllocatorCreateInfo']]],
+  ['physicaldevice_356',['physicalDevice',['../struct_vma_allocator_create_info.html#a08230f04ae6ccf8a78150a9e829a7156',1,'VmaAllocatorCreateInfo::physicalDevice()'],['../struct_vma_allocator_info.html#aba2b703f96e51d567717e1fb2935b47a',1,'VmaAllocatorInfo::physicalDevice()']]],
+  ['pmappeddata_357',['pMappedData',['../struct_vma_allocation_info.html#a5eeffbe2d2f30f53370ff14aefbadbe2',1,'VmaAllocationInfo']]],
+  ['pmoves_358',['pMoves',['../struct_vma_defragmentation_pass_info.html#acbd42d4a3357999da130a95cd99a3792',1,'VmaDefragmentationPassInfo']]],
+  ['pool_359',['pool',['../struct_vma_allocation_create_info.html#a6272c0555cfd1fe28bff1afeb6190150',1,'VmaAllocationCreateInfo']]],
+  ['poolcount_360',['poolCount',['../struct_vma_defragmentation_info2.html#a7e70aa2a1081d849dcc7829b19d3ec9d',1,'VmaDefragmentationInfo2']]],
+  ['ppools_361',['pPools',['../struct_vma_defragmentation_info2.html#a3c9c6aa5c97d5670f8e362b3a6f3029b',1,'VmaDefragmentationInfo2']]],
+  ['precordsettings_362',['pRecordSettings',['../struct_vma_allocator_create_info.html#ace2aa4877b16a42b0b7673d4e26000ee',1,'VmaAllocatorCreateInfo']]],
+  ['preferredflags_363',['preferredFlags',['../struct_vma_allocation_create_info.html#a7fe8d81a1ad10b2a2faacacee5b15d6d',1,'VmaAllocationCreateInfo']]],
+  ['preferredlargeheapblocksize_364',['preferredLargeHeapBlockSize',['../struct_vma_allocator_create_info.html#a8e4714298e3121cdd8b214a1ae7a637a',1,'VmaAllocatorCreateInfo']]],
+  ['priority_365',['priority',['../struct_vma_allocation_create_info.html#a983d39e1a2e63649d78a960aa2fdd0f7',1,'VmaAllocationCreateInfo::priority()'],['../struct_vma_pool_create_info.html#a16e686c688f6725f119ebf6e24ab5274',1,'VmaPoolCreateInfo::priority()']]],
+  ['puserdata_366',['pUserData',['../struct_vma_device_memory_callbacks.html#a24052de0937ddd54015a2df0363903c6',1,'VmaDeviceMemoryCallbacks::pUserData()'],['../struct_vma_allocation_create_info.html#a8259e85c272683434f4abb4ddddffe19',1,'VmaAllocationCreateInfo::pUserData()'],['../struct_vma_allocation_info.html#adc507656149c04de7ed95d0042ba2a13',1,'VmaAllocationInfo::pUserData()']]],
+  ['pvulkanfunctions_367',['pVulkanFunctions',['../struct_vma_allocator_create_info.html#a3dc197be3227da7338b1643f70db36bd',1,'VmaAllocatorCreateInfo']]]
 ];
diff --git a/third_party/vulkan_memory_allocator/docs/html/search/variables_9.html b/third_party/vulkan_memory_allocator/docs/html/search/variables_9.html
index 97cc440..7b01475 100644
--- a/third_party/vulkan_memory_allocator/docs/html/search/variables_9.html
+++ b/third_party/vulkan_memory_allocator/docs/html/search/variables_9.html
@@ -1,7 +1,8 @@
 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html><head><title></title>
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head><title></title>
 <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
-<meta name="generator" content="Doxygen 1.8.18"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
 <link rel="stylesheet" type="text/css" href="search.css"/>
 <script type="text/javascript" src="variables_9.js"></script>
 <script type="text/javascript" src="search.js"></script>
@@ -10,14 +11,14 @@
 <div id="SRIndex">
 <div class="SRStatus" id="Loading">Loading...</div>
 <div id="SRResults"></div>
-<script type="text/javascript"><!--
+<script type="text/javascript">
 /* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
 createResults();
 /* @license-end */
---></script>
+</script>
 <div class="SRStatus" id="Searching">Searching...</div>
 <div class="SRStatus" id="NoMatches">No Matches</div>
-<script type="text/javascript"><!--
+<script type="text/javascript">
 /* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
 document.getElementById("Loading").style.display="none";
 document.getElementById("NoMatches").style.display="none";
@@ -30,7 +31,7 @@
   }
 });
 /* @license-end */
---></script>
+</script>
 </div>
 </body>
 </html>
diff --git a/third_party/vulkan_memory_allocator/docs/html/search/variables_9.js b/third_party/vulkan_memory_allocator/docs/html/search/variables_9.js
index 464801a..18f4728 100644
--- a/third_party/vulkan_memory_allocator/docs/html/search/variables_9.js
+++ b/third_party/vulkan_memory_allocator/docs/html/search/variables_9.js
@@ -1,4 +1,4 @@
 var searchData=
 [
-  ['requiredflags_366',['requiredFlags',['../struct_vma_allocation_create_info.html#a9166390303ff42d783305bc31c2b6b90',1,'VmaAllocationCreateInfo']]]
+  ['requiredflags_368',['requiredFlags',['../struct_vma_allocation_create_info.html#a9166390303ff42d783305bc31c2b6b90',1,'VmaAllocationCreateInfo']]]
 ];
diff --git a/third_party/vulkan_memory_allocator/docs/html/search/variables_a.html b/third_party/vulkan_memory_allocator/docs/html/search/variables_a.html
index 0107448..52a724d 100644
--- a/third_party/vulkan_memory_allocator/docs/html/search/variables_a.html
+++ b/third_party/vulkan_memory_allocator/docs/html/search/variables_a.html
@@ -1,7 +1,8 @@
 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html><head><title></title>
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head><title></title>
 <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
-<meta name="generator" content="Doxygen 1.8.18"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
 <link rel="stylesheet" type="text/css" href="search.css"/>
 <script type="text/javascript" src="variables_a.js"></script>
 <script type="text/javascript" src="search.js"></script>
@@ -10,14 +11,14 @@
 <div id="SRIndex">
 <div class="SRStatus" id="Loading">Loading...</div>
 <div id="SRResults"></div>
-<script type="text/javascript"><!--
+<script type="text/javascript">
 /* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
 createResults();
 /* @license-end */
---></script>
+</script>
 <div class="SRStatus" id="Searching">Searching...</div>
 <div class="SRStatus" id="NoMatches">No Matches</div>
-<script type="text/javascript"><!--
+<script type="text/javascript">
 /* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
 document.getElementById("Loading").style.display="none";
 document.getElementById("NoMatches").style.display="none";
@@ -30,7 +31,7 @@
   }
 });
 /* @license-end */
---></script>
+</script>
 </div>
 </body>
 </html>
diff --git a/third_party/vulkan_memory_allocator/docs/html/search/variables_a.js b/third_party/vulkan_memory_allocator/docs/html/search/variables_a.js
index 096c052..d9db73f 100644
--- a/third_party/vulkan_memory_allocator/docs/html/search/variables_a.js
+++ b/third_party/vulkan_memory_allocator/docs/html/search/variables_a.js
@@ -1,4 +1,4 @@
 var searchData=
 [
-  ['size_367',['size',['../struct_vma_pool_stats.html#a326807b2de2b0931cee4ed9a5f2e420c',1,'VmaPoolStats::size()'],['../struct_vma_allocation_info.html#aac76d113a6a5ccbb09fea00fb25fd18f',1,'VmaAllocationInfo::size()']]]
+  ['size_369',['size',['../struct_vma_pool_stats.html#a326807b2de2b0931cee4ed9a5f2e420c',1,'VmaPoolStats::size()'],['../struct_vma_allocation_info.html#aac76d113a6a5ccbb09fea00fb25fd18f',1,'VmaAllocationInfo::size()']]]
 ];
diff --git a/third_party/vulkan_memory_allocator/docs/html/search/variables_b.html b/third_party/vulkan_memory_allocator/docs/html/search/variables_b.html
index e5b2fd9..f376b27 100644
--- a/third_party/vulkan_memory_allocator/docs/html/search/variables_b.html
+++ b/third_party/vulkan_memory_allocator/docs/html/search/variables_b.html
@@ -1,7 +1,8 @@
 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html><head><title></title>
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head><title></title>
 <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
-<meta name="generator" content="Doxygen 1.8.18"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
 <link rel="stylesheet" type="text/css" href="search.css"/>
 <script type="text/javascript" src="variables_b.js"></script>
 <script type="text/javascript" src="search.js"></script>
@@ -10,14 +11,14 @@
 <div id="SRIndex">
 <div class="SRStatus" id="Loading">Loading...</div>
 <div id="SRResults"></div>
-<script type="text/javascript"><!--
+<script type="text/javascript">
 /* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
 createResults();
 /* @license-end */
---></script>
+</script>
 <div class="SRStatus" id="Searching">Searching...</div>
 <div class="SRStatus" id="NoMatches">No Matches</div>
-<script type="text/javascript"><!--
+<script type="text/javascript">
 /* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
 document.getElementById("Loading").style.display="none";
 document.getElementById("NoMatches").style.display="none";
@@ -30,7 +31,7 @@
   }
 });
 /* @license-end */
---></script>
+</script>
 </div>
 </body>
 </html>
diff --git a/third_party/vulkan_memory_allocator/docs/html/search/variables_b.js b/third_party/vulkan_memory_allocator/docs/html/search/variables_b.js
index 8ba1d7d..2132c6b 100644
--- a/third_party/vulkan_memory_allocator/docs/html/search/variables_b.js
+++ b/third_party/vulkan_memory_allocator/docs/html/search/variables_b.js
@@ -1,4 +1,4 @@
 var searchData=
 [
-  ['total_368',['total',['../struct_vma_stats.html#a2e8f5b3353f2fefef3c27f29e245a1f9',1,'VmaStats']]]
+  ['total_370',['total',['../struct_vma_stats.html#a2e8f5b3353f2fefef3c27f29e245a1f9',1,'VmaStats']]]
 ];
diff --git a/third_party/vulkan_memory_allocator/docs/html/search/variables_c.html b/third_party/vulkan_memory_allocator/docs/html/search/variables_c.html
index f3e9989..6019eba 100644
--- a/third_party/vulkan_memory_allocator/docs/html/search/variables_c.html
+++ b/third_party/vulkan_memory_allocator/docs/html/search/variables_c.html
@@ -1,7 +1,8 @@
 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html><head><title></title>
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head><title></title>
 <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
-<meta name="generator" content="Doxygen 1.8.18"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
 <link rel="stylesheet" type="text/css" href="search.css"/>
 <script type="text/javascript" src="variables_c.js"></script>
 <script type="text/javascript" src="search.js"></script>
@@ -10,14 +11,14 @@
 <div id="SRIndex">
 <div class="SRStatus" id="Loading">Loading...</div>
 <div id="SRResults"></div>
-<script type="text/javascript"><!--
+<script type="text/javascript">
 /* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
 createResults();
 /* @license-end */
---></script>
+</script>
 <div class="SRStatus" id="Searching">Searching...</div>
 <div class="SRStatus" id="NoMatches">No Matches</div>
-<script type="text/javascript"><!--
+<script type="text/javascript">
 /* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
 document.getElementById("Loading").style.display="none";
 document.getElementById("NoMatches").style.display="none";
@@ -30,7 +31,7 @@
   }
 });
 /* @license-end */
---></script>
+</script>
 </div>
 </body>
 </html>
diff --git a/third_party/vulkan_memory_allocator/docs/html/search/variables_c.js b/third_party/vulkan_memory_allocator/docs/html/search/variables_c.js
index a6b01a4..9a7df57 100644
--- a/third_party/vulkan_memory_allocator/docs/html/search/variables_c.js
+++ b/third_party/vulkan_memory_allocator/docs/html/search/variables_c.js
@@ -1,11 +1,11 @@
 var searchData=
 [
-  ['unusedbytes_369',['unusedBytes',['../struct_vma_stat_info.html#a1859d290aca2cd582d8dc25922092669',1,'VmaStatInfo']]],
-  ['unusedrangecount_370',['unusedRangeCount',['../struct_vma_stat_info.html#ae06129c771bfebfd6468a7f4276502a9',1,'VmaStatInfo::unusedRangeCount()'],['../struct_vma_pool_stats.html#ae4f3546ffa4d1e598b64d8e6134854f4',1,'VmaPoolStats::unusedRangeCount()']]],
-  ['unusedrangesizeavg_371',['unusedRangeSizeAvg',['../struct_vma_stat_info.html#a2f9b3452af90c9768a30b7fb6ae194fc',1,'VmaStatInfo']]],
-  ['unusedrangesizemax_372',['unusedRangeSizeMax',['../struct_vma_stat_info.html#a5ba1a2476c4d39b10f7e2f7ebbb72ac4',1,'VmaStatInfo::unusedRangeSizeMax()'],['../struct_vma_pool_stats.html#ab4c8f52dd42ab01998f60f0b6acc722b',1,'VmaPoolStats::unusedRangeSizeMax()']]],
-  ['unusedrangesizemin_373',['unusedRangeSizeMin',['../struct_vma_stat_info.html#aedeba931324f16589cd2416c0d2dd0d4',1,'VmaStatInfo']]],
-  ['unusedsize_374',['unusedSize',['../struct_vma_pool_stats.html#ad7c54874724fce7b06aba526202d82a8',1,'VmaPoolStats']]],
-  ['usage_375',['usage',['../struct_vma_budget.html#a84dd1ecca8b0110259eb206dbadb11f6',1,'VmaBudget::usage()'],['../struct_vma_allocation_create_info.html#accb8b06b1f677d858cb9af20705fa910',1,'VmaAllocationCreateInfo::usage()']]],
-  ['usedbytes_376',['usedBytes',['../struct_vma_stat_info.html#ab0c6c73837e5a70c749fbd4f6064895a',1,'VmaStatInfo']]]
+  ['unusedbytes_371',['unusedBytes',['../struct_vma_stat_info.html#a1859d290aca2cd582d8dc25922092669',1,'VmaStatInfo']]],
+  ['unusedrangecount_372',['unusedRangeCount',['../struct_vma_stat_info.html#ae06129c771bfebfd6468a7f4276502a9',1,'VmaStatInfo::unusedRangeCount()'],['../struct_vma_pool_stats.html#ae4f3546ffa4d1e598b64d8e6134854f4',1,'VmaPoolStats::unusedRangeCount()']]],
+  ['unusedrangesizeavg_373',['unusedRangeSizeAvg',['../struct_vma_stat_info.html#a2f9b3452af90c9768a30b7fb6ae194fc',1,'VmaStatInfo']]],
+  ['unusedrangesizemax_374',['unusedRangeSizeMax',['../struct_vma_stat_info.html#a5ba1a2476c4d39b10f7e2f7ebbb72ac4',1,'VmaStatInfo::unusedRangeSizeMax()'],['../struct_vma_pool_stats.html#ab4c8f52dd42ab01998f60f0b6acc722b',1,'VmaPoolStats::unusedRangeSizeMax()']]],
+  ['unusedrangesizemin_375',['unusedRangeSizeMin',['../struct_vma_stat_info.html#aedeba931324f16589cd2416c0d2dd0d4',1,'VmaStatInfo']]],
+  ['unusedsize_376',['unusedSize',['../struct_vma_pool_stats.html#ad7c54874724fce7b06aba526202d82a8',1,'VmaPoolStats']]],
+  ['usage_377',['usage',['../struct_vma_budget.html#a84dd1ecca8b0110259eb206dbadb11f6',1,'VmaBudget::usage()'],['../struct_vma_allocation_create_info.html#accb8b06b1f677d858cb9af20705fa910',1,'VmaAllocationCreateInfo::usage()']]],
+  ['usedbytes_378',['usedBytes',['../struct_vma_stat_info.html#ab0c6c73837e5a70c749fbd4f6064895a',1,'VmaStatInfo']]]
 ];
diff --git a/third_party/vulkan_memory_allocator/docs/html/search/variables_d.html b/third_party/vulkan_memory_allocator/docs/html/search/variables_d.html
index 478ae0e..f61ae75 100644
--- a/third_party/vulkan_memory_allocator/docs/html/search/variables_d.html
+++ b/third_party/vulkan_memory_allocator/docs/html/search/variables_d.html
@@ -1,7 +1,8 @@
 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html><head><title></title>
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head><title></title>
 <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
-<meta name="generator" content="Doxygen 1.8.18"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
 <link rel="stylesheet" type="text/css" href="search.css"/>
 <script type="text/javascript" src="variables_d.js"></script>
 <script type="text/javascript" src="search.js"></script>
@@ -10,14 +11,14 @@
 <div id="SRIndex">
 <div class="SRStatus" id="Loading">Loading...</div>
 <div id="SRResults"></div>
-<script type="text/javascript"><!--
+<script type="text/javascript">
 /* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
 createResults();
 /* @license-end */
---></script>
+</script>
 <div class="SRStatus" id="Searching">Searching...</div>
 <div class="SRStatus" id="NoMatches">No Matches</div>
-<script type="text/javascript"><!--
+<script type="text/javascript">
 /* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
 document.getElementById("Loading").style.display="none";
 document.getElementById("NoMatches").style.display="none";
@@ -30,7 +31,7 @@
   }
 });
 /* @license-end */
---></script>
+</script>
 </div>
 </body>
 </html>
diff --git a/third_party/vulkan_memory_allocator/docs/html/search/variables_d.js b/third_party/vulkan_memory_allocator/docs/html/search/variables_d.js
index 108e48a..54b59a5 100644
--- a/third_party/vulkan_memory_allocator/docs/html/search/variables_d.js
+++ b/third_party/vulkan_memory_allocator/docs/html/search/variables_d.js
@@ -1,21 +1,21 @@
 var searchData=
 [
-  ['vkallocatememory_377',['vkAllocateMemory',['../struct_vma_vulkan_functions.html#a2943bf99dfd784a0e8f599d987e22e6c',1,'VmaVulkanFunctions']]],
-  ['vkbindbuffermemory_378',['vkBindBufferMemory',['../struct_vma_vulkan_functions.html#a94fc4f3a605d9880bb3c0ba2c2fc80b2',1,'VmaVulkanFunctions']]],
-  ['vkbindimagememory_379',['vkBindImageMemory',['../struct_vma_vulkan_functions.html#a1338d96a128a5ade648b8d934907c637',1,'VmaVulkanFunctions']]],
-  ['vkcmdcopybuffer_380',['vkCmdCopyBuffer',['../struct_vma_vulkan_functions.html#ae5c0db8c89a3b82593dc16aa6a49fa3a',1,'VmaVulkanFunctions']]],
-  ['vkcreatebuffer_381',['vkCreateBuffer',['../struct_vma_vulkan_functions.html#ae8084315a25006271a2edfc3a447519f',1,'VmaVulkanFunctions']]],
-  ['vkcreateimage_382',['vkCreateImage',['../struct_vma_vulkan_functions.html#a23ebe70be515b9b5010a1d691200e325',1,'VmaVulkanFunctions']]],
-  ['vkdestroybuffer_383',['vkDestroyBuffer',['../struct_vma_vulkan_functions.html#a7e054606faddb07f0e8556f3ed317d45',1,'VmaVulkanFunctions']]],
-  ['vkdestroyimage_384',['vkDestroyImage',['../struct_vma_vulkan_functions.html#a90b898227039b1dcb3520f6e91f09ffa',1,'VmaVulkanFunctions']]],
-  ['vkflushmappedmemoryranges_385',['vkFlushMappedMemoryRanges',['../struct_vma_vulkan_functions.html#a33c322f4c4ad2810f8a9c97a277572f9',1,'VmaVulkanFunctions']]],
-  ['vkfreememory_386',['vkFreeMemory',['../struct_vma_vulkan_functions.html#a4c658701778564d62034255b5dda91b4',1,'VmaVulkanFunctions']]],
-  ['vkgetbuffermemoryrequirements_387',['vkGetBufferMemoryRequirements',['../struct_vma_vulkan_functions.html#a5b92901df89a4194b0d12f6071d4d143',1,'VmaVulkanFunctions']]],
-  ['vkgetimagememoryrequirements_388',['vkGetImageMemoryRequirements',['../struct_vma_vulkan_functions.html#a475f6f49f8debe4d10800592606d53f4',1,'VmaVulkanFunctions']]],
-  ['vkgetphysicaldevicememoryproperties_389',['vkGetPhysicalDeviceMemoryProperties',['../struct_vma_vulkan_functions.html#a60d25c33bba06bb8592e6875cbaa9830',1,'VmaVulkanFunctions']]],
-  ['vkgetphysicaldeviceproperties_390',['vkGetPhysicalDeviceProperties',['../struct_vma_vulkan_functions.html#a77b7a74082823e865dd6546623468f96',1,'VmaVulkanFunctions']]],
-  ['vkinvalidatemappedmemoryranges_391',['vkInvalidateMappedMemoryRanges',['../struct_vma_vulkan_functions.html#a5c1093bc32386a8060c37c9f282078a1',1,'VmaVulkanFunctions']]],
-  ['vkmapmemory_392',['vkMapMemory',['../struct_vma_vulkan_functions.html#ab5c1f38dea3a2cf00dc9eb4f57218c49',1,'VmaVulkanFunctions']]],
-  ['vkunmapmemory_393',['vkUnmapMemory',['../struct_vma_vulkan_functions.html#acc798589736f0becb317fc2196c1d8b9',1,'VmaVulkanFunctions']]],
-  ['vulkanapiversion_394',['vulkanApiVersion',['../struct_vma_allocator_create_info.html#ae0ffc55139b54520a6bb704b29ffc285',1,'VmaAllocatorCreateInfo']]]
+  ['vkallocatememory_379',['vkAllocateMemory',['../struct_vma_vulkan_functions.html#a2943bf99dfd784a0e8f599d987e22e6c',1,'VmaVulkanFunctions']]],
+  ['vkbindbuffermemory_380',['vkBindBufferMemory',['../struct_vma_vulkan_functions.html#a94fc4f3a605d9880bb3c0ba2c2fc80b2',1,'VmaVulkanFunctions']]],
+  ['vkbindimagememory_381',['vkBindImageMemory',['../struct_vma_vulkan_functions.html#a1338d96a128a5ade648b8d934907c637',1,'VmaVulkanFunctions']]],
+  ['vkcmdcopybuffer_382',['vkCmdCopyBuffer',['../struct_vma_vulkan_functions.html#ae5c0db8c89a3b82593dc16aa6a49fa3a',1,'VmaVulkanFunctions']]],
+  ['vkcreatebuffer_383',['vkCreateBuffer',['../struct_vma_vulkan_functions.html#ae8084315a25006271a2edfc3a447519f',1,'VmaVulkanFunctions']]],
+  ['vkcreateimage_384',['vkCreateImage',['../struct_vma_vulkan_functions.html#a23ebe70be515b9b5010a1d691200e325',1,'VmaVulkanFunctions']]],
+  ['vkdestroybuffer_385',['vkDestroyBuffer',['../struct_vma_vulkan_functions.html#a7e054606faddb07f0e8556f3ed317d45',1,'VmaVulkanFunctions']]],
+  ['vkdestroyimage_386',['vkDestroyImage',['../struct_vma_vulkan_functions.html#a90b898227039b1dcb3520f6e91f09ffa',1,'VmaVulkanFunctions']]],
+  ['vkflushmappedmemoryranges_387',['vkFlushMappedMemoryRanges',['../struct_vma_vulkan_functions.html#a33c322f4c4ad2810f8a9c97a277572f9',1,'VmaVulkanFunctions']]],
+  ['vkfreememory_388',['vkFreeMemory',['../struct_vma_vulkan_functions.html#a4c658701778564d62034255b5dda91b4',1,'VmaVulkanFunctions']]],
+  ['vkgetbuffermemoryrequirements_389',['vkGetBufferMemoryRequirements',['../struct_vma_vulkan_functions.html#a5b92901df89a4194b0d12f6071d4d143',1,'VmaVulkanFunctions']]],
+  ['vkgetimagememoryrequirements_390',['vkGetImageMemoryRequirements',['../struct_vma_vulkan_functions.html#a475f6f49f8debe4d10800592606d53f4',1,'VmaVulkanFunctions']]],
+  ['vkgetphysicaldevicememoryproperties_391',['vkGetPhysicalDeviceMemoryProperties',['../struct_vma_vulkan_functions.html#a60d25c33bba06bb8592e6875cbaa9830',1,'VmaVulkanFunctions']]],
+  ['vkgetphysicaldeviceproperties_392',['vkGetPhysicalDeviceProperties',['../struct_vma_vulkan_functions.html#a77b7a74082823e865dd6546623468f96',1,'VmaVulkanFunctions']]],
+  ['vkinvalidatemappedmemoryranges_393',['vkInvalidateMappedMemoryRanges',['../struct_vma_vulkan_functions.html#a5c1093bc32386a8060c37c9f282078a1',1,'VmaVulkanFunctions']]],
+  ['vkmapmemory_394',['vkMapMemory',['../struct_vma_vulkan_functions.html#ab5c1f38dea3a2cf00dc9eb4f57218c49',1,'VmaVulkanFunctions']]],
+  ['vkunmapmemory_395',['vkUnmapMemory',['../struct_vma_vulkan_functions.html#acc798589736f0becb317fc2196c1d8b9',1,'VmaVulkanFunctions']]],
+  ['vulkanapiversion_396',['vulkanApiVersion',['../struct_vma_allocator_create_info.html#ae0ffc55139b54520a6bb704b29ffc285',1,'VmaAllocatorCreateInfo']]]
 ];
diff --git a/third_party/vulkan_memory_allocator/docs/html/statistics.html b/third_party/vulkan_memory_allocator/docs/html/statistics.html
index 51a415b..796dbf8 100644
--- a/third_party/vulkan_memory_allocator/docs/html/statistics.html
+++ b/third_party/vulkan_memory_allocator/docs/html/statistics.html
@@ -3,7 +3,7 @@
 <head>
 <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
 <meta http-equiv="X-UA-Compatible" content="IE=9"/>
-<meta name="generator" content="Doxygen 1.8.18"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
 <meta name="viewport" content="width=device-width, initial-scale=1"/>
 <title>Vulkan Memory Allocator: Statistics</title>
 <link href="tabs.css" rel="stylesheet" type="text/css"/>
@@ -29,10 +29,10 @@
 </table>
 </div>
 <!-- end header part -->
-<!-- Generated by Doxygen 1.8.18 -->
+<!-- Generated by Doxygen 1.9.1 -->
 <script type="text/javascript">
 /* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
-var searchBox = new SearchBox("searchBox", "search",false,'Search');
+var searchBox = new SearchBox("searchBox", "search",false,'Search','.html');
 /* @license-end */
 </script>
 <script type="text/javascript" src="menudata.js"></script>
@@ -84,9 +84,7 @@
 </div><!-- PageDoc -->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated by &#160;<a href="http://www.doxygen.org/index.html">
-<img class="footer" src="doxygen.png" alt="doxygen"/>
-</a> 1.8.18
+Generated by&#160;<a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.1
 </small></address>
 </body>
 </html>
diff --git a/third_party/vulkan_memory_allocator/docs/html/staying_within_budget.html b/third_party/vulkan_memory_allocator/docs/html/staying_within_budget.html
index a7a17c3..d43cb5b 100644
--- a/third_party/vulkan_memory_allocator/docs/html/staying_within_budget.html
+++ b/third_party/vulkan_memory_allocator/docs/html/staying_within_budget.html
@@ -3,7 +3,7 @@
 <head>
 <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
 <meta http-equiv="X-UA-Compatible" content="IE=9"/>
-<meta name="generator" content="Doxygen 1.8.18"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
 <meta name="viewport" content="width=device-width, initial-scale=1"/>
 <title>Vulkan Memory Allocator: Staying within budget</title>
 <link href="tabs.css" rel="stylesheet" type="text/css"/>
@@ -29,10 +29,10 @@
 </table>
 </div>
 <!-- end header part -->
-<!-- Generated by Doxygen 1.8.18 -->
+<!-- Generated by Doxygen 1.9.1 -->
 <script type="text/javascript">
 /* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
-var searchBox = new SearchBox("searchBox", "search",false,'Search');
+var searchBox = new SearchBox("searchBox", "search",false,'Search','.html');
 /* @license-end */
 </script>
 <script type="text/javascript" src="menudata.js"></script>
@@ -98,9 +98,7 @@
 </div><!-- PageDoc -->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated by &#160;<a href="http://www.doxygen.org/index.html">
-<img class="footer" src="doxygen.png" alt="doxygen"/>
-</a> 1.8.18
+Generated by&#160;<a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.1
 </small></address>
 </body>
 </html>
diff --git a/third_party/vulkan_memory_allocator/docs/html/struct__-members.html b/third_party/vulkan_memory_allocator/docs/html/struct__-members.html
deleted file mode 100644
index afd2f73..0000000
--- a/third_party/vulkan_memory_allocator/docs/html/struct__-members.html
+++ /dev/null
@@ -1,86 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml">
-<head>
-<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
-<meta http-equiv="X-UA-Compatible" content="IE=9"/>
-<meta name="generator" content="Doxygen 1.8.16"/>
-<meta name="viewport" content="width=device-width, initial-scale=1"/>
-<title>Vulkan Memory Allocator: Member List</title>
-<link href="tabs.css" rel="stylesheet" type="text/css"/>
-<script type="text/javascript" src="jquery.js"></script>
-<script type="text/javascript" src="dynsections.js"></script>
-<link href="search/search.css" rel="stylesheet" type="text/css"/>
-<script type="text/javascript" src="search/searchdata.js"></script>
-<script type="text/javascript" src="search/search.js"></script>
-<link href="doxygen.css" rel="stylesheet" type="text/css" />
-</head>
-<body>
-<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
-<div id="titlearea">
-<table cellspacing="0" cellpadding="0">
- <tbody>
- <tr style="height: 56px;">
-  <td id="projectalign" style="padding-left: 0.5em;">
-   <div id="projectname">Vulkan Memory Allocator
-   </div>
-  </td>
- </tr>
- </tbody>
-</table>
-</div>
-<!-- end header part -->
-<!-- Generated by Doxygen 1.8.16 -->
-<script type="text/javascript">
-/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
-var searchBox = new SearchBox("searchBox", "search",false,'Search');
-/* @license-end */
-</script>
-<script type="text/javascript" src="menudata.js"></script>
-<script type="text/javascript" src="menu.js"></script>
-<script type="text/javascript">
-/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
-$(function() {
-  initMenu('',true,false,'search.php','Search');
-  $(document).ready(function() { init_search(); });
-});
-/* @license-end */</script>
-<div id="main-nav"></div>
-<!-- window showing the filter options -->
-<div id="MSearchSelectWindow"
-     onmouseover="return searchBox.OnSearchSelectShow()"
-     onmouseout="return searchBox.OnSearchSelectHide()"
-     onkeydown="return searchBox.OnSearchSelectKey(event)">
-</div>
-
-<!-- iframe showing the search results (closed by default) -->
-<div id="MSearchResultsWindow">
-<iframe src="javascript:void(0)" frameborder="0" 
-        name="MSearchResults" id="MSearchResults">
-</iframe>
-</div>
-
-</div><!-- top -->
-<div class="header">
-  <div class="headertitle">
-<div class="title">_ Member List</div>  </div>
-</div><!--header-->
-<div class="contents">
-
-<p>This is the complete list of members for <a class="el" href="struct__.html">_</a>, including all inherited members.</p>
-<table class="directory">
-  <tr class="even"><td class="entry"><a class="el" href="struct__.html#af6d5d67c61d2394656ca210d0d2b9b40">flags</a></td><td class="entry"><a class="el" href="struct__.html">_</a></td><td class="entry"></td></tr>
-  <tr><td class="entry"><a class="el" href="struct__.html#a531171590e30aa2ba2b8a50ee976b9d2">memoryTypeBits</a></td><td class="entry"><a class="el" href="struct__.html">_</a></td><td class="entry"></td></tr>
-  <tr class="even"><td class="entry"><a class="el" href="struct__.html#ac913e1c322e4782ac6114632a2dfb1e3">pool</a></td><td class="entry"><a class="el" href="struct__.html">_</a></td><td class="entry"></td></tr>
-  <tr><td class="entry"><a class="el" href="struct__.html#aeda060f3275a7d0308c4c688a37883cd">preferredFlags</a></td><td class="entry"><a class="el" href="struct__.html">_</a></td><td class="entry"></td></tr>
-  <tr class="even"><td class="entry"><a class="el" href="struct__.html#a146a1894242756b1be7ac16901ba2bc0">pUserData</a></td><td class="entry"><a class="el" href="struct__.html">_</a></td><td class="entry"></td></tr>
-  <tr><td class="entry"><a class="el" href="struct__.html#a9985e0a1c36944cd1eeb38c9acccdd68">requiredFlags</a></td><td class="entry"><a class="el" href="struct__.html">_</a></td><td class="entry"></td></tr>
-  <tr class="even"><td class="entry"><a class="el" href="struct__.html#a11b2bf964ead1c04f043b9eca68d8807">usage</a></td><td class="entry"><a class="el" href="struct__.html">_</a></td><td class="entry"></td></tr>
-</table></div><!-- contents -->
-<!-- start footer part -->
-<hr class="footer"/><address class="footer"><small>
-Generated by &#160;<a href="http://www.doxygen.org/index.html">
-<img class="footer" src="doxygen.png" alt="doxygen"/>
-</a> 1.8.16
-</small></address>
-</body>
-</html>
diff --git a/third_party/vulkan_memory_allocator/docs/html/struct__.html b/third_party/vulkan_memory_allocator/docs/html/struct__.html
deleted file mode 100644
index 0823c40..0000000
--- a/third_party/vulkan_memory_allocator/docs/html/struct__.html
+++ /dev/null
@@ -1,232 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml">
-<head>
-<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
-<meta http-equiv="X-UA-Compatible" content="IE=9"/>
-<meta name="generator" content="Doxygen 1.8.16"/>
-<meta name="viewport" content="width=device-width, initial-scale=1"/>
-<title>Vulkan Memory Allocator: _ Struct Reference</title>
-<link href="tabs.css" rel="stylesheet" type="text/css"/>
-<script type="text/javascript" src="jquery.js"></script>
-<script type="text/javascript" src="dynsections.js"></script>
-<link href="search/search.css" rel="stylesheet" type="text/css"/>
-<script type="text/javascript" src="search/searchdata.js"></script>
-<script type="text/javascript" src="search/search.js"></script>
-<link href="doxygen.css" rel="stylesheet" type="text/css" />
-</head>
-<body>
-<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
-<div id="titlearea">
-<table cellspacing="0" cellpadding="0">
- <tbody>
- <tr style="height: 56px;">
-  <td id="projectalign" style="padding-left: 0.5em;">
-   <div id="projectname">Vulkan Memory Allocator
-   </div>
-  </td>
- </tr>
- </tbody>
-</table>
-</div>
-<!-- end header part -->
-<!-- Generated by Doxygen 1.8.16 -->
-<script type="text/javascript">
-/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
-var searchBox = new SearchBox("searchBox", "search",false,'Search');
-/* @license-end */
-</script>
-<script type="text/javascript" src="menudata.js"></script>
-<script type="text/javascript" src="menu.js"></script>
-<script type="text/javascript">
-/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
-$(function() {
-  initMenu('',true,false,'search.php','Search');
-  $(document).ready(function() { init_search(); });
-});
-/* @license-end */</script>
-<div id="main-nav"></div>
-<!-- window showing the filter options -->
-<div id="MSearchSelectWindow"
-     onmouseover="return searchBox.OnSearchSelectShow()"
-     onmouseout="return searchBox.OnSearchSelectHide()"
-     onkeydown="return searchBox.OnSearchSelectKey(event)">
-</div>
-
-<!-- iframe showing the search results (closed by default) -->
-<div id="MSearchResultsWindow">
-<iframe src="javascript:void(0)" frameborder="0" 
-        name="MSearchResults" id="MSearchResults">
-</iframe>
-</div>
-
-</div><!-- top -->
-<div class="header">
-  <div class="summary">
-<a href="#pub-attribs">Public Attributes</a> &#124;
-<a href="struct__-members.html">List of all members</a>  </div>
-  <div class="headertitle">
-<div class="title">_ Struct Reference</div>  </div>
-</div><!--header-->
-<div class="contents">
-
-<p><code>#include &lt;<a class="el" href="vk__mem__alloc_8h_source.html">vk_mem_alloc.h</a>&gt;</code></p>
-<table class="memberdecls">
-<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-attribs"></a>
-Public Attributes</h2></td></tr>
-<tr class="memitem:af6d5d67c61d2394656ca210d0d2b9b40"><td class="memItemLeft" align="right" valign="top"><a class="el" href="vk__mem__alloc_8h.html#a5225e5e11f8376f6a31a1791f3d6e817">VmaAllocationCreateFlags</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct__.html#af6d5d67c61d2394656ca210d0d2b9b40">flags</a></td></tr>
-<tr class="memdesc:af6d5d67c61d2394656ca210d0d2b9b40"><td class="mdescLeft">&#160;</td><td class="mdescRight">Use <a class="el" href="vk__mem__alloc_8h.html#abf6bf6748c7a9fe7ce5b7835c0f56af4" title="Flags to be passed as VmaAllocationCreateInfo::flags.">VmaAllocationCreateFlagBits</a> enum.  <a href="struct__.html#af6d5d67c61d2394656ca210d0d2b9b40">More...</a><br /></td></tr>
-<tr class="separator:af6d5d67c61d2394656ca210d0d2b9b40"><td class="memSeparator" colspan="2">&#160;</td></tr>
-<tr class="memitem:a11b2bf964ead1c04f043b9eca68d8807"><td class="memItemLeft" align="right" valign="top"><a class="el" href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305cc">VmaMemoryUsage</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct__.html#a11b2bf964ead1c04f043b9eca68d8807">usage</a></td></tr>
-<tr class="memdesc:a11b2bf964ead1c04f043b9eca68d8807"><td class="mdescLeft">&#160;</td><td class="mdescRight">Intended usage of memory.  <a href="struct__.html#a11b2bf964ead1c04f043b9eca68d8807">More...</a><br /></td></tr>
-<tr class="separator:a11b2bf964ead1c04f043b9eca68d8807"><td class="memSeparator" colspan="2">&#160;</td></tr>
-<tr class="memitem:a9985e0a1c36944cd1eeb38c9acccdd68"><td class="memItemLeft" align="right" valign="top">VkMemoryPropertyFlags&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct__.html#a9985e0a1c36944cd1eeb38c9acccdd68">requiredFlags</a></td></tr>
-<tr class="memdesc:a9985e0a1c36944cd1eeb38c9acccdd68"><td class="mdescLeft">&#160;</td><td class="mdescRight">Flags that must be set in a Memory Type chosen for an allocation.  <a href="struct__.html#a9985e0a1c36944cd1eeb38c9acccdd68">More...</a><br /></td></tr>
-<tr class="separator:a9985e0a1c36944cd1eeb38c9acccdd68"><td class="memSeparator" colspan="2">&#160;</td></tr>
-<tr class="memitem:aeda060f3275a7d0308c4c688a37883cd"><td class="memItemLeft" align="right" valign="top">VkMemoryPropertyFlags&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct__.html#aeda060f3275a7d0308c4c688a37883cd">preferredFlags</a></td></tr>
-<tr class="memdesc:aeda060f3275a7d0308c4c688a37883cd"><td class="mdescLeft">&#160;</td><td class="mdescRight">Flags that preferably should be set in a memory type chosen for an allocation.  <a href="struct__.html#aeda060f3275a7d0308c4c688a37883cd">More...</a><br /></td></tr>
-<tr class="separator:aeda060f3275a7d0308c4c688a37883cd"><td class="memSeparator" colspan="2">&#160;</td></tr>
-<tr class="memitem:a531171590e30aa2ba2b8a50ee976b9d2"><td class="memItemLeft" align="right" valign="top">uint32_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct__.html#a531171590e30aa2ba2b8a50ee976b9d2">memoryTypeBits</a></td></tr>
-<tr class="memdesc:a531171590e30aa2ba2b8a50ee976b9d2"><td class="mdescLeft">&#160;</td><td class="mdescRight">Bitmask containing one bit set for every memory type acceptable for this allocation.  <a href="struct__.html#a531171590e30aa2ba2b8a50ee976b9d2">More...</a><br /></td></tr>
-<tr class="separator:a531171590e30aa2ba2b8a50ee976b9d2"><td class="memSeparator" colspan="2">&#160;</td></tr>
-<tr class="memitem:ac913e1c322e4782ac6114632a2dfb1e3"><td class="memItemLeft" align="right" valign="top"><a class="el" href="struct_vma_pool.html">VmaPool</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct__.html#ac913e1c322e4782ac6114632a2dfb1e3">pool</a></td></tr>
-<tr class="memdesc:ac913e1c322e4782ac6114632a2dfb1e3"><td class="mdescLeft">&#160;</td><td class="mdescRight">Pool that this allocation should be created in.  <a href="struct__.html#ac913e1c322e4782ac6114632a2dfb1e3">More...</a><br /></td></tr>
-<tr class="separator:ac913e1c322e4782ac6114632a2dfb1e3"><td class="memSeparator" colspan="2">&#160;</td></tr>
-<tr class="memitem:a146a1894242756b1be7ac16901ba2bc0"><td class="memItemLeft" align="right" valign="top">void *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct__.html#a146a1894242756b1be7ac16901ba2bc0">pUserData</a></td></tr>
-<tr class="memdesc:a146a1894242756b1be7ac16901ba2bc0"><td class="mdescLeft">&#160;</td><td class="mdescRight">Custom general-purpose pointer that will be stored in <a class="el" href="struct_vma_allocation.html" title="Represents single memory allocation.">VmaAllocation</a>, can be read as <a class="el" href="struct_vma_allocation_info.html#adc507656149c04de7ed95d0042ba2a13" title="Custom general-purpose pointer that was passed as VmaAllocationCreateInfo::pUserData or set using vma...">VmaAllocationInfo::pUserData</a> and changed using <a class="el" href="vk__mem__alloc_8h.html#af9147d31ffc11d62fc187bde283ed14f" title="Sets pUserData in given allocation to new value.">vmaSetAllocationUserData()</a>.  <a href="struct__.html#a146a1894242756b1be7ac16901ba2bc0">More...</a><br /></td></tr>
-<tr class="separator:a146a1894242756b1be7ac16901ba2bc0"><td class="memSeparator" colspan="2">&#160;</td></tr>
-</table>
-<h2 class="groupheader">Member Data Documentation</h2>
-<a id="af6d5d67c61d2394656ca210d0d2b9b40"></a>
-<h2 class="memtitle"><span class="permalink"><a href="#af6d5d67c61d2394656ca210d0d2b9b40">&#9670;&nbsp;</a></span>flags</h2>
-
-<div class="memitem">
-<div class="memproto">
-      <table class="memname">
-        <tr>
-          <td class="memname"><a class="el" href="vk__mem__alloc_8h.html#a5225e5e11f8376f6a31a1791f3d6e817">VmaAllocationCreateFlags</a> _::flags</td>
-        </tr>
-      </table>
-</div><div class="memdoc">
-
-<p>Use <a class="el" href="vk__mem__alloc_8h.html#abf6bf6748c7a9fe7ce5b7835c0f56af4" title="Flags to be passed as VmaAllocationCreateInfo::flags.">VmaAllocationCreateFlagBits</a> enum. </p>
-
-</div>
-</div>
-<a id="a531171590e30aa2ba2b8a50ee976b9d2"></a>
-<h2 class="memtitle"><span class="permalink"><a href="#a531171590e30aa2ba2b8a50ee976b9d2">&#9670;&nbsp;</a></span>memoryTypeBits</h2>
-
-<div class="memitem">
-<div class="memproto">
-      <table class="memname">
-        <tr>
-          <td class="memname">uint32_t _::memoryTypeBits</td>
-        </tr>
-      </table>
-</div><div class="memdoc">
-
-<p>Bitmask containing one bit set for every memory type acceptable for this allocation. </p>
-<p>Value 0 is equivalent to <code>UINT32_MAX</code> - it means any memory type is accepted if it meets other requirements specified by this structure, with no further restrictions on memory type index. <br  />
-If <code>pool</code> is not null, this member is ignored. </p>
-
-</div>
-</div>
-<a id="ac913e1c322e4782ac6114632a2dfb1e3"></a>
-<h2 class="memtitle"><span class="permalink"><a href="#ac913e1c322e4782ac6114632a2dfb1e3">&#9670;&nbsp;</a></span>pool</h2>
-
-<div class="memitem">
-<div class="memproto">
-      <table class="memname">
-        <tr>
-          <td class="memname"><a class="el" href="struct_vma_pool.html">VmaPool</a> _::pool</td>
-        </tr>
-      </table>
-</div><div class="memdoc">
-
-<p>Pool that this allocation should be created in. </p>
-<p>Leave <code>VK_NULL_HANDLE</code> to allocate from default pool. If not null, members: <code>usage</code>, <code>requiredFlags</code>, <code>preferredFlags</code>, <code>memoryTypeBits</code> are ignored. </p>
-
-</div>
-</div>
-<a id="aeda060f3275a7d0308c4c688a37883cd"></a>
-<h2 class="memtitle"><span class="permalink"><a href="#aeda060f3275a7d0308c4c688a37883cd">&#9670;&nbsp;</a></span>preferredFlags</h2>
-
-<div class="memitem">
-<div class="memproto">
-      <table class="memname">
-        <tr>
-          <td class="memname">VkMemoryPropertyFlags _::preferredFlags</td>
-        </tr>
-      </table>
-</div><div class="memdoc">
-
-<p>Flags that preferably should be set in a memory type chosen for an allocation. </p>
-<p>Set to 0 if no additional flags are prefered. <br  />
-If <code>pool</code> is not null, this member is ignored. </p>
-
-</div>
-</div>
-<a id="a146a1894242756b1be7ac16901ba2bc0"></a>
-<h2 class="memtitle"><span class="permalink"><a href="#a146a1894242756b1be7ac16901ba2bc0">&#9670;&nbsp;</a></span>pUserData</h2>
-
-<div class="memitem">
-<div class="memproto">
-      <table class="memname">
-        <tr>
-          <td class="memname">void* _::pUserData</td>
-        </tr>
-      </table>
-</div><div class="memdoc">
-
-<p>Custom general-purpose pointer that will be stored in <a class="el" href="struct_vma_allocation.html" title="Represents single memory allocation.">VmaAllocation</a>, can be read as <a class="el" href="struct_vma_allocation_info.html#adc507656149c04de7ed95d0042ba2a13" title="Custom general-purpose pointer that was passed as VmaAllocationCreateInfo::pUserData or set using vma...">VmaAllocationInfo::pUserData</a> and changed using <a class="el" href="vk__mem__alloc_8h.html#af9147d31ffc11d62fc187bde283ed14f" title="Sets pUserData in given allocation to new value.">vmaSetAllocationUserData()</a>. </p>
-<p>If <a class="el" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597aa6f24f821cd6a7c5e4a443f7bf59c520">VMA_ALLOCATION_CREATE_USER_DATA_COPY_STRING_BIT</a> is used, it must be either null or pointer to a null-terminated string. The string will be then copied to internal buffer, so it doesn't need to be valid after allocation call. </p>
-
-</div>
-</div>
-<a id="a9985e0a1c36944cd1eeb38c9acccdd68"></a>
-<h2 class="memtitle"><span class="permalink"><a href="#a9985e0a1c36944cd1eeb38c9acccdd68">&#9670;&nbsp;</a></span>requiredFlags</h2>
-
-<div class="memitem">
-<div class="memproto">
-      <table class="memname">
-        <tr>
-          <td class="memname">VkMemoryPropertyFlags _::requiredFlags</td>
-        </tr>
-      </table>
-</div><div class="memdoc">
-
-<p>Flags that must be set in a Memory Type chosen for an allocation. </p>
-<p>Leave 0 if you specify memory requirements in other way. <br  />
-If <code>pool</code> is not null, this member is ignored. </p>
-
-</div>
-</div>
-<a id="a11b2bf964ead1c04f043b9eca68d8807"></a>
-<h2 class="memtitle"><span class="permalink"><a href="#a11b2bf964ead1c04f043b9eca68d8807">&#9670;&nbsp;</a></span>usage</h2>
-
-<div class="memitem">
-<div class="memproto">
-      <table class="memname">
-        <tr>
-          <td class="memname"><a class="el" href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305cc">VmaMemoryUsage</a> _::usage</td>
-        </tr>
-      </table>
-</div><div class="memdoc">
-
-<p>Intended usage of memory. </p>
-<p>You can leave <a class="el" href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305ccaf50d27e34e0925cf3a63db8c839121dd">VMA_MEMORY_USAGE_UNKNOWN</a> if you specify memory requirements in other way. <br  />
-If <code>pool</code> is not null, this member is ignored. </p>
-
-</div>
-</div>
-<hr/>The documentation for this struct was generated from the following file:<ul>
-<li><a class="el" href="vk__mem__alloc_8h_source.html">vk_mem_alloc.h</a></li>
-</ul>
-</div><!-- contents -->
-<!-- start footer part -->
-<hr class="footer"/><address class="footer"><small>
-Generated by &#160;<a href="http://www.doxygen.org/index.html">
-<img class="footer" src="doxygen.png" alt="doxygen"/>
-</a> 1.8.16
-</small></address>
-</body>
-</html>
diff --git a/third_party/vulkan_memory_allocator/docs/html/struct_vma_allocation.html b/third_party/vulkan_memory_allocator/docs/html/struct_vma_allocation.html
index c84ebf0..fa8c5ca 100644
--- a/third_party/vulkan_memory_allocator/docs/html/struct_vma_allocation.html
+++ b/third_party/vulkan_memory_allocator/docs/html/struct_vma_allocation.html
@@ -3,7 +3,7 @@
 <head>
 <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
 <meta http-equiv="X-UA-Compatible" content="IE=9"/>
-<meta name="generator" content="Doxygen 1.8.18"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
 <meta name="viewport" content="width=device-width, initial-scale=1"/>
 <title>Vulkan Memory Allocator: VmaAllocation Struct Reference</title>
 <link href="tabs.css" rel="stylesheet" type="text/css"/>
@@ -29,10 +29,10 @@
 </table>
 </div>
 <!-- end header part -->
-<!-- Generated by Doxygen 1.8.18 -->
+<!-- Generated by Doxygen 1.9.1 -->
 <script type="text/javascript">
 /* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
-var searchBox = new SearchBox("searchBox", "search",false,'Search');
+var searchBox = new SearchBox("searchBox", "search",false,'Search','.html');
 /* @license-end */
 </script>
 <script type="text/javascript" src="menudata.js"></script>
@@ -78,14 +78,12 @@
 <p>The object also remembers its size and some other information. To retrieve this information, use function <a class="el" href="vk__mem__alloc_8h.html#a86dd08aba8633bfa4ad0df2e76481d8b" title="Returns current information about specified allocation and atomically marks it as used in current fra...">vmaGetAllocationInfo()</a> and inspect returned structure <a class="el" href="struct_vma_allocation_info.html" title="Parameters of VmaAllocation objects, that can be retrieved using function vmaGetAllocationInfo().">VmaAllocationInfo</a>.</p>
 <p>Some kinds allocations can be in lost state. For more information, see <a class="el" href="lost_allocations.html">Lost allocations</a>. </p>
 </div><hr/>The documentation for this struct was generated from the following file:<ul>
-<li><a class="el" href="vk__mem__alloc_8h_source.html">vk_mem_alloc.h</a></li>
+<li>include/<a class="el" href="vk__mem__alloc_8h_source.html">vk_mem_alloc.h</a></li>
 </ul>
 </div><!-- contents -->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated by &#160;<a href="http://www.doxygen.org/index.html">
-<img class="footer" src="doxygen.png" alt="doxygen"/>
-</a> 1.8.18
+Generated by&#160;<a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.1
 </small></address>
 </body>
 </html>
diff --git a/third_party/vulkan_memory_allocator/docs/html/struct_vma_allocation_create_info-members.html b/third_party/vulkan_memory_allocator/docs/html/struct_vma_allocation_create_info-members.html
index fa34e40..a97d4f7 100644
--- a/third_party/vulkan_memory_allocator/docs/html/struct_vma_allocation_create_info-members.html
+++ b/third_party/vulkan_memory_allocator/docs/html/struct_vma_allocation_create_info-members.html
@@ -3,7 +3,7 @@
 <head>
 <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
 <meta http-equiv="X-UA-Compatible" content="IE=9"/>
-<meta name="generator" content="Doxygen 1.8.18"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
 <meta name="viewport" content="width=device-width, initial-scale=1"/>
 <title>Vulkan Memory Allocator: Member List</title>
 <link href="tabs.css" rel="stylesheet" type="text/css"/>
@@ -29,10 +29,10 @@
 </table>
 </div>
 <!-- end header part -->
-<!-- Generated by Doxygen 1.8.18 -->
+<!-- Generated by Doxygen 1.9.1 -->
 <script type="text/javascript">
 /* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
-var searchBox = new SearchBox("searchBox", "search",false,'Search');
+var searchBox = new SearchBox("searchBox", "search",false,'Search','.html');
 /* @license-end */
 </script>
 <script type="text/javascript" src="menudata.js"></script>
@@ -72,15 +72,14 @@
   <tr><td class="entry"><a class="el" href="struct_vma_allocation_create_info.html#a3bf940c0271d85d6ba32a4d820075055">memoryTypeBits</a></td><td class="entry"><a class="el" href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a></td><td class="entry"></td></tr>
   <tr class="even"><td class="entry"><a class="el" href="struct_vma_allocation_create_info.html#a6272c0555cfd1fe28bff1afeb6190150">pool</a></td><td class="entry"><a class="el" href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a></td><td class="entry"></td></tr>
   <tr><td class="entry"><a class="el" href="struct_vma_allocation_create_info.html#a7fe8d81a1ad10b2a2faacacee5b15d6d">preferredFlags</a></td><td class="entry"><a class="el" href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a></td><td class="entry"></td></tr>
-  <tr class="even"><td class="entry"><a class="el" href="struct_vma_allocation_create_info.html#a8259e85c272683434f4abb4ddddffe19">pUserData</a></td><td class="entry"><a class="el" href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a></td><td class="entry"></td></tr>
-  <tr><td class="entry"><a class="el" href="struct_vma_allocation_create_info.html#a9166390303ff42d783305bc31c2b6b90">requiredFlags</a></td><td class="entry"><a class="el" href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a></td><td class="entry"></td></tr>
-  <tr class="even"><td class="entry"><a class="el" href="struct_vma_allocation_create_info.html#accb8b06b1f677d858cb9af20705fa910">usage</a></td><td class="entry"><a class="el" href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a></td><td class="entry"></td></tr>
+  <tr class="even"><td class="entry"><a class="el" href="struct_vma_allocation_create_info.html#a983d39e1a2e63649d78a960aa2fdd0f7">priority</a></td><td class="entry"><a class="el" href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a></td><td class="entry"></td></tr>
+  <tr><td class="entry"><a class="el" href="struct_vma_allocation_create_info.html#a8259e85c272683434f4abb4ddddffe19">pUserData</a></td><td class="entry"><a class="el" href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a></td><td class="entry"></td></tr>
+  <tr class="even"><td class="entry"><a class="el" href="struct_vma_allocation_create_info.html#a9166390303ff42d783305bc31c2b6b90">requiredFlags</a></td><td class="entry"><a class="el" href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a></td><td class="entry"></td></tr>
+  <tr><td class="entry"><a class="el" href="struct_vma_allocation_create_info.html#accb8b06b1f677d858cb9af20705fa910">usage</a></td><td class="entry"><a class="el" href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a></td><td class="entry"></td></tr>
 </table></div><!-- contents -->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated by &#160;<a href="http://www.doxygen.org/index.html">
-<img class="footer" src="doxygen.png" alt="doxygen"/>
-</a> 1.8.18
+Generated by&#160;<a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.1
 </small></address>
 </body>
 </html>
diff --git a/third_party/vulkan_memory_allocator/docs/html/struct_vma_allocation_create_info.html b/third_party/vulkan_memory_allocator/docs/html/struct_vma_allocation_create_info.html
index 5e7e09d..8bf1e6a 100644
--- a/third_party/vulkan_memory_allocator/docs/html/struct_vma_allocation_create_info.html
+++ b/third_party/vulkan_memory_allocator/docs/html/struct_vma_allocation_create_info.html
@@ -3,7 +3,7 @@
 <head>
 <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
 <meta http-equiv="X-UA-Compatible" content="IE=9"/>
-<meta name="generator" content="Doxygen 1.8.18"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
 <meta name="viewport" content="width=device-width, initial-scale=1"/>
 <title>Vulkan Memory Allocator: VmaAllocationCreateInfo Struct Reference</title>
 <link href="tabs.css" rel="stylesheet" type="text/css"/>
@@ -29,10 +29,10 @@
 </table>
 </div>
 <!-- end header part -->
-<!-- Generated by Doxygen 1.8.18 -->
+<!-- Generated by Doxygen 1.9.1 -->
 <script type="text/javascript">
 /* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
-var searchBox = new SearchBox("searchBox", "search",false,'Search');
+var searchBox = new SearchBox("searchBox", "search",false,'Search','.html');
 /* @license-end */
 </script>
 <script type="text/javascript" src="menudata.js"></script>
@@ -94,6 +94,9 @@
 <tr class="memitem:a8259e85c272683434f4abb4ddddffe19"><td class="memItemLeft" align="right" valign="top">void *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_vma_allocation_create_info.html#a8259e85c272683434f4abb4ddddffe19">pUserData</a></td></tr>
 <tr class="memdesc:a8259e85c272683434f4abb4ddddffe19"><td class="mdescLeft">&#160;</td><td class="mdescRight">Custom general-purpose pointer that will be stored in <a class="el" href="struct_vma_allocation.html" title="Represents single memory allocation.">VmaAllocation</a>, can be read as <a class="el" href="struct_vma_allocation_info.html#adc507656149c04de7ed95d0042ba2a13" title="Custom general-purpose pointer that was passed as VmaAllocationCreateInfo::pUserData or set using vma...">VmaAllocationInfo::pUserData</a> and changed using <a class="el" href="vk__mem__alloc_8h.html#af9147d31ffc11d62fc187bde283ed14f" title="Sets pUserData in given allocation to new value.">vmaSetAllocationUserData()</a>.  <a href="struct_vma_allocation_create_info.html#a8259e85c272683434f4abb4ddddffe19">More...</a><br /></td></tr>
 <tr class="separator:a8259e85c272683434f4abb4ddddffe19"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a983d39e1a2e63649d78a960aa2fdd0f7"><td class="memItemLeft" align="right" valign="top">float&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_vma_allocation_create_info.html#a983d39e1a2e63649d78a960aa2fdd0f7">priority</a></td></tr>
+<tr class="memdesc:a983d39e1a2e63649d78a960aa2fdd0f7"><td class="mdescLeft">&#160;</td><td class="mdescRight">A floating-point value between 0 and 1, indicating the priority of the allocation relative to other memory allocations.  <a href="struct_vma_allocation_create_info.html#a983d39e1a2e63649d78a960aa2fdd0f7">More...</a><br /></td></tr>
+<tr class="separator:a983d39e1a2e63649d78a960aa2fdd0f7"><td class="memSeparator" colspan="2">&#160;</td></tr>
 </table>
 <h2 class="groupheader">Member Data Documentation</h2>
 <a id="add09658ac14fe290ace25470ddd6d41b"></a>
@@ -160,11 +163,28 @@
 </div><div class="memdoc">
 
 <p>Flags that preferably should be set in a memory type chosen for an allocation. </p>
-<p>Set to 0 if no additional flags are prefered. <br  />
+<p>Set to 0 if no additional flags are preferred. <br  />
 If <code>pool</code> is not null, this member is ignored. </p>
 
 </div>
 </div>
+<a id="a983d39e1a2e63649d78a960aa2fdd0f7"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a983d39e1a2e63649d78a960aa2fdd0f7">&#9670;&nbsp;</a></span>priority</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">float VmaAllocationCreateInfo::priority</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>A floating-point value between 0 and 1, indicating the priority of the allocation relative to other memory allocations. </p>
+<p>It is used only when <a class="el" href="vk__mem__alloc_8h.html#a4f87c9100d154a65a4ad495f7763cf7caffdd7a5169be3dbd7cbf6b3619e4f78a">VMA_ALLOCATOR_CREATE_EXT_MEMORY_PRIORITY_BIT</a> flag was used during creation of the <a class="el" href="struct_vma_allocator.html" title="Represents main object of this library initialized.">VmaAllocator</a> object and this allocation ends up as dedicated or is explicitly forced as dedicated using <a class="el" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a3fc311d855c2ff53f1090ef5c722b38f" title="Set this flag if the allocation should have its own memory block.">VMA_ALLOCATION_CREATE_DEDICATED_MEMORY_BIT</a>. Otherwise, it has the priority of a memory block where it is placed and this variable is ignored. </p>
+
+</div>
+</div>
 <a id="a8259e85c272683434f4abb4ddddffe19"></a>
 <h2 class="memtitle"><span class="permalink"><a href="#a8259e85c272683434f4abb4ddddffe19">&#9670;&nbsp;</a></span>pUserData</h2>
 
@@ -219,14 +239,12 @@
 </div>
 </div>
 <hr/>The documentation for this struct was generated from the following file:<ul>
-<li><a class="el" href="vk__mem__alloc_8h_source.html">vk_mem_alloc.h</a></li>
+<li>include/<a class="el" href="vk__mem__alloc_8h_source.html">vk_mem_alloc.h</a></li>
 </ul>
 </div><!-- contents -->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated by &#160;<a href="http://www.doxygen.org/index.html">
-<img class="footer" src="doxygen.png" alt="doxygen"/>
-</a> 1.8.18
+Generated by&#160;<a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.1
 </small></address>
 </body>
 </html>
diff --git a/third_party/vulkan_memory_allocator/docs/html/struct_vma_allocation_info-members.html b/third_party/vulkan_memory_allocator/docs/html/struct_vma_allocation_info-members.html
index 8c1c590..7556c0a 100644
--- a/third_party/vulkan_memory_allocator/docs/html/struct_vma_allocation_info-members.html
+++ b/third_party/vulkan_memory_allocator/docs/html/struct_vma_allocation_info-members.html
@@ -3,7 +3,7 @@
 <head>
 <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
 <meta http-equiv="X-UA-Compatible" content="IE=9"/>
-<meta name="generator" content="Doxygen 1.8.18"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
 <meta name="viewport" content="width=device-width, initial-scale=1"/>
 <title>Vulkan Memory Allocator: Member List</title>
 <link href="tabs.css" rel="stylesheet" type="text/css"/>
@@ -29,10 +29,10 @@
 </table>
 </div>
 <!-- end header part -->
-<!-- Generated by Doxygen 1.8.18 -->
+<!-- Generated by Doxygen 1.9.1 -->
 <script type="text/javascript">
 /* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
-var searchBox = new SearchBox("searchBox", "search",false,'Search');
+var searchBox = new SearchBox("searchBox", "search",false,'Search','.html');
 /* @license-end */
 </script>
 <script type="text/javascript" src="menudata.js"></script>
@@ -77,9 +77,7 @@
 </table></div><!-- contents -->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated by &#160;<a href="http://www.doxygen.org/index.html">
-<img class="footer" src="doxygen.png" alt="doxygen"/>
-</a> 1.8.18
+Generated by&#160;<a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.1
 </small></address>
 </body>
 </html>
diff --git a/third_party/vulkan_memory_allocator/docs/html/struct_vma_allocation_info.html b/third_party/vulkan_memory_allocator/docs/html/struct_vma_allocation_info.html
index ec5e23b..85de4aa 100644
--- a/third_party/vulkan_memory_allocator/docs/html/struct_vma_allocation_info.html
+++ b/third_party/vulkan_memory_allocator/docs/html/struct_vma_allocation_info.html
@@ -3,7 +3,7 @@
 <head>
 <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
 <meta http-equiv="X-UA-Compatible" content="IE=9"/>
-<meta name="generator" content="Doxygen 1.8.18"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
 <meta name="viewport" content="width=device-width, initial-scale=1"/>
 <title>Vulkan Memory Allocator: VmaAllocationInfo Struct Reference</title>
 <link href="tabs.css" rel="stylesheet" type="text/css"/>
@@ -29,10 +29,10 @@
 </table>
 </div>
 <!-- end header part -->
-<!-- Generated by Doxygen 1.8.18 -->
+<!-- Generated by Doxygen 1.9.1 -->
 <script type="text/javascript">
 /* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
-var searchBox = new SearchBox("searchBox", "search",false,'Search');
+var searchBox = new SearchBox("searchBox", "search",false,'Search','.html');
 /* @license-end */
 </script>
 <script type="text/javascript" src="menudata.js"></script>
@@ -83,7 +83,7 @@
 <tr class="memdesc:ae0bfb7dfdf79a76ffefc9a94677a2f67"><td class="mdescLeft">&#160;</td><td class="mdescRight">Handle to Vulkan memory object.  <a href="struct_vma_allocation_info.html#ae0bfb7dfdf79a76ffefc9a94677a2f67">More...</a><br /></td></tr>
 <tr class="separator:ae0bfb7dfdf79a76ffefc9a94677a2f67"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:a4a3c732388dbdc7a23f9365b00825268"><td class="memItemLeft" align="right" valign="top">VkDeviceSize&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_vma_allocation_info.html#a4a3c732388dbdc7a23f9365b00825268">offset</a></td></tr>
-<tr class="memdesc:a4a3c732388dbdc7a23f9365b00825268"><td class="mdescLeft">&#160;</td><td class="mdescRight">Offset into deviceMemory object to the beginning of this allocation, in bytes. (deviceMemory, offset) pair is unique to this allocation.  <a href="struct_vma_allocation_info.html#a4a3c732388dbdc7a23f9365b00825268">More...</a><br /></td></tr>
+<tr class="memdesc:a4a3c732388dbdc7a23f9365b00825268"><td class="mdescLeft">&#160;</td><td class="mdescRight">Offset in <code>VkDeviceMemory</code> object to the beginning of this allocation, in bytes. <code>(deviceMemory, offset)</code> pair is unique to this allocation.  <a href="struct_vma_allocation_info.html#a4a3c732388dbdc7a23f9365b00825268">More...</a><br /></td></tr>
 <tr class="separator:a4a3c732388dbdc7a23f9365b00825268"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:aac76d113a6a5ccbb09fea00fb25fd18f"><td class="memItemLeft" align="right" valign="top">VkDeviceSize&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_vma_allocation_info.html#aac76d113a6a5ccbb09fea00fb25fd18f">size</a></td></tr>
 <tr class="memdesc:aac76d113a6a5ccbb09fea00fb25fd18f"><td class="mdescLeft">&#160;</td><td class="mdescRight">Size of this allocation, in bytes.  <a href="struct_vma_allocation_info.html#aac76d113a6a5ccbb09fea00fb25fd18f">More...</a><br /></td></tr>
@@ -146,7 +146,8 @@
       </table>
 </div><div class="memdoc">
 
-<p>Offset into deviceMemory object to the beginning of this allocation, in bytes. (deviceMemory, offset) pair is unique to this allocation. </p>
+<p>Offset in <code>VkDeviceMemory</code> object to the beginning of this allocation, in bytes. <code>(deviceMemory, offset)</code> pair is unique to this allocation. </p>
+<p>You usually don't need to use this offset. If you create a buffer or an image together with the allocation using e.g. function <a class="el" href="vk__mem__alloc_8h.html#ac72ee55598617e8eecca384e746bab51">vmaCreateBuffer()</a>, <a class="el" href="vk__mem__alloc_8h.html#a02a94f25679275851a53e82eacbcfc73" title="Function similar to vmaCreateBuffer().">vmaCreateImage()</a>, functions that operate on these resources refer to the beginning of the buffer or image, not entire device memory block. Functions like <a class="el" href="vk__mem__alloc_8h.html#ad5bd1243512d099706de88168992f069" title="Maps memory represented by given allocation and returns pointer to it.">vmaMapMemory()</a>, <a class="el" href="vk__mem__alloc_8h.html#a6b0929b914b60cf2d45cac4bf3547470" title="Binds buffer to allocation.">vmaBindBufferMemory()</a> also refer to the beginning of the allocation and apply this offset automatically.</p>
 <p>It can change after call to <a class="el" href="vk__mem__alloc_8h.html#a9f0f8f56db5f7f57fe4454f465142dac" title="Deprecated. Compacts memory by moving allocations.">vmaDefragment()</a> if this allocation is passed to the function, or if allocation is lost. </p>
 
 </div>
@@ -199,19 +200,18 @@
 </div><div class="memdoc">
 
 <p>Size of this allocation, in bytes. </p>
-<p>It never changes, unless allocation is lost. </p>
+<p>It never changes, unless allocation is lost.</p>
+<dl class="section note"><dt>Note</dt><dd>Allocation size returned in this variable may be greater than the size requested for the resource e.g. as <code>VkBufferCreateInfo::size</code>. Whole size of the allocation is accessible for operations on memory e.g. using a pointer after mapping with <a class="el" href="vk__mem__alloc_8h.html#ad5bd1243512d099706de88168992f069" title="Maps memory represented by given allocation and returns pointer to it.">vmaMapMemory()</a>, but operations on the resource e.g. using <code>vkCmdCopyBuffer</code> must be limited to the size of the resource. </dd></dl>
 
 </div>
 </div>
 <hr/>The documentation for this struct was generated from the following file:<ul>
-<li><a class="el" href="vk__mem__alloc_8h_source.html">vk_mem_alloc.h</a></li>
+<li>include/<a class="el" href="vk__mem__alloc_8h_source.html">vk_mem_alloc.h</a></li>
 </ul>
 </div><!-- contents -->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated by &#160;<a href="http://www.doxygen.org/index.html">
-<img class="footer" src="doxygen.png" alt="doxygen"/>
-</a> 1.8.18
+Generated by&#160;<a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.1
 </small></address>
 </body>
 </html>
diff --git a/third_party/vulkan_memory_allocator/docs/html/struct_vma_allocator.html b/third_party/vulkan_memory_allocator/docs/html/struct_vma_allocator.html
index 18cd419..0ef385f 100644
--- a/third_party/vulkan_memory_allocator/docs/html/struct_vma_allocator.html
+++ b/third_party/vulkan_memory_allocator/docs/html/struct_vma_allocator.html
@@ -3,7 +3,7 @@
 <head>
 <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
 <meta http-equiv="X-UA-Compatible" content="IE=9"/>
-<meta name="generator" content="Doxygen 1.8.18"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
 <meta name="viewport" content="width=device-width, initial-scale=1"/>
 <title>Vulkan Memory Allocator: VmaAllocator Struct Reference</title>
 <link href="tabs.css" rel="stylesheet" type="text/css"/>
@@ -29,10 +29,10 @@
 </table>
 </div>
 <!-- end header part -->
-<!-- Generated by Doxygen 1.8.18 -->
+<!-- Generated by Doxygen 1.9.1 -->
 <script type="text/javascript">
 /* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
-var searchBox = new SearchBox("searchBox", "search",false,'Search');
+var searchBox = new SearchBox("searchBox", "search",false,'Search','.html');
 /* @license-end */
 </script>
 <script type="text/javascript" src="menudata.js"></script>
@@ -75,14 +75,12 @@
 <p>Fill structure <a class="el" href="struct_vma_allocator_create_info.html" title="Description of a Allocator to be created.">VmaAllocatorCreateInfo</a> and call function <a class="el" href="vk__mem__alloc_8h.html#a200692051ddb34240248234f5f4c17bb" title="Creates Allocator object.">vmaCreateAllocator()</a> to create it. Call function <a class="el" href="vk__mem__alloc_8h.html#aa8d164061c88f22fb1fd3c8f3534bc1d" title="Destroys allocator object.">vmaDestroyAllocator()</a> to destroy it.</p>
 <p>It is recommended to create just one object of this type per <code>VkDevice</code> object, right after Vulkan is initialized and keep it alive until before Vulkan device is destroyed. </p>
 </div><hr/>The documentation for this struct was generated from the following file:<ul>
-<li><a class="el" href="vk__mem__alloc_8h_source.html">vk_mem_alloc.h</a></li>
+<li>include/<a class="el" href="vk__mem__alloc_8h_source.html">vk_mem_alloc.h</a></li>
 </ul>
 </div><!-- contents -->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated by &#160;<a href="http://www.doxygen.org/index.html">
-<img class="footer" src="doxygen.png" alt="doxygen"/>
-</a> 1.8.18
+Generated by&#160;<a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.1
 </small></address>
 </body>
 </html>
diff --git a/third_party/vulkan_memory_allocator/docs/html/struct_vma_allocator_create_info-members.html b/third_party/vulkan_memory_allocator/docs/html/struct_vma_allocator_create_info-members.html
index d84d606..732b6ce 100644
--- a/third_party/vulkan_memory_allocator/docs/html/struct_vma_allocator_create_info-members.html
+++ b/third_party/vulkan_memory_allocator/docs/html/struct_vma_allocator_create_info-members.html
@@ -3,7 +3,7 @@
 <head>
 <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
 <meta http-equiv="X-UA-Compatible" content="IE=9"/>
-<meta name="generator" content="Doxygen 1.8.18"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
 <meta name="viewport" content="width=device-width, initial-scale=1"/>
 <title>Vulkan Memory Allocator: Member List</title>
 <link href="tabs.css" rel="stylesheet" type="text/css"/>
@@ -29,10 +29,10 @@
 </table>
 </div>
 <!-- end header part -->
-<!-- Generated by Doxygen 1.8.18 -->
+<!-- Generated by Doxygen 1.9.1 -->
 <script type="text/javascript">
 /* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
-var searchBox = new SearchBox("searchBox", "search",false,'Search');
+var searchBox = new SearchBox("searchBox", "search",false,'Search','.html');
 /* @license-end */
 </script>
 <script type="text/javascript" src="menudata.js"></script>
@@ -83,9 +83,7 @@
 </table></div><!-- contents -->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated by &#160;<a href="http://www.doxygen.org/index.html">
-<img class="footer" src="doxygen.png" alt="doxygen"/>
-</a> 1.8.18
+Generated by&#160;<a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.1
 </small></address>
 </body>
 </html>
diff --git a/third_party/vulkan_memory_allocator/docs/html/struct_vma_allocator_create_info.html b/third_party/vulkan_memory_allocator/docs/html/struct_vma_allocator_create_info.html
index 55e25a4..4a9b64b 100644
--- a/third_party/vulkan_memory_allocator/docs/html/struct_vma_allocator_create_info.html
+++ b/third_party/vulkan_memory_allocator/docs/html/struct_vma_allocator_create_info.html
@@ -3,7 +3,7 @@
 <head>
 <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
 <meta http-equiv="X-UA-Compatible" content="IE=9"/>
-<meta name="generator" content="Doxygen 1.8.18"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
 <meta name="viewport" content="width=device-width, initial-scale=1"/>
 <title>Vulkan Memory Allocator: VmaAllocatorCreateInfo Struct Reference</title>
 <link href="tabs.css" rel="stylesheet" type="text/css"/>
@@ -29,10 +29,10 @@
 </table>
 </div>
 <!-- end header part -->
-<!-- Generated by Doxygen 1.8.18 -->
+<!-- Generated by Doxygen 1.9.1 -->
 <script type="text/javascript">
 /* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
-var searchBox = new SearchBox("searchBox", "search",false,'Search');
+var searchBox = new SearchBox("searchBox", "search",false,'Search','.html');
 /* @license-end */
 </script>
 <script type="text/javascript" src="menudata.js"></script>
@@ -324,19 +324,17 @@
 </div><div class="memdoc">
 
 <p>Optional. The highest version of Vulkan that the application is designed to use. </p>
-<p>It must be a value in the format as created by macro <code>VK_MAKE_VERSION</code> or a constant like: <code>VK_API_VERSION_1_1</code>, <code>VK_API_VERSION_1_0</code>. The patch version number specified is ignored. Only the major and minor versions are considered. It must be less or equal (preferably equal) to value as passed to <code>vkCreateInstance</code> as <code>VkApplicationInfo::apiVersion</code>. Only versions 1.0 and 1.1 are supported by the current implementation. Leaving it initialized to zero is equivalent to <code>VK_API_VERSION_1_0</code>. </p>
+<p>It must be a value in the format as created by macro <code>VK_MAKE_VERSION</code> or a constant like: <code>VK_API_VERSION_1_1</code>, <code>VK_API_VERSION_1_0</code>. The patch version number specified is ignored. Only the major and minor versions are considered. It must be less or equal (preferably equal) to value as passed to <code>vkCreateInstance</code> as <code>VkApplicationInfo::apiVersion</code>. Only versions 1.0, 1.1, 1.2 are supported by the current implementation. Leaving it initialized to zero is equivalent to <code>VK_API_VERSION_1_0</code>. </p>
 
 </div>
 </div>
 <hr/>The documentation for this struct was generated from the following file:<ul>
-<li><a class="el" href="vk__mem__alloc_8h_source.html">vk_mem_alloc.h</a></li>
+<li>include/<a class="el" href="vk__mem__alloc_8h_source.html">vk_mem_alloc.h</a></li>
 </ul>
 </div><!-- contents -->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated by &#160;<a href="http://www.doxygen.org/index.html">
-<img class="footer" src="doxygen.png" alt="doxygen"/>
-</a> 1.8.18
+Generated by&#160;<a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.1
 </small></address>
 </body>
 </html>
diff --git a/third_party/vulkan_memory_allocator/docs/html/struct_vma_allocator_info-members.html b/third_party/vulkan_memory_allocator/docs/html/struct_vma_allocator_info-members.html
index 6f54c42..e3bfe36 100644
--- a/third_party/vulkan_memory_allocator/docs/html/struct_vma_allocator_info-members.html
+++ b/third_party/vulkan_memory_allocator/docs/html/struct_vma_allocator_info-members.html
@@ -3,7 +3,7 @@
 <head>
 <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
 <meta http-equiv="X-UA-Compatible" content="IE=9"/>
-<meta name="generator" content="Doxygen 1.8.18"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
 <meta name="viewport" content="width=device-width, initial-scale=1"/>
 <title>Vulkan Memory Allocator: Member List</title>
 <link href="tabs.css" rel="stylesheet" type="text/css"/>
@@ -29,10 +29,10 @@
 </table>
 </div>
 <!-- end header part -->
-<!-- Generated by Doxygen 1.8.18 -->
+<!-- Generated by Doxygen 1.9.1 -->
 <script type="text/javascript">
 /* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
-var searchBox = new SearchBox("searchBox", "search",false,'Search');
+var searchBox = new SearchBox("searchBox", "search",false,'Search','.html');
 /* @license-end */
 </script>
 <script type="text/javascript" src="menudata.js"></script>
@@ -74,9 +74,7 @@
 </table></div><!-- contents -->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated by &#160;<a href="http://www.doxygen.org/index.html">
-<img class="footer" src="doxygen.png" alt="doxygen"/>
-</a> 1.8.18
+Generated by&#160;<a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.1
 </small></address>
 </body>
 </html>
diff --git a/third_party/vulkan_memory_allocator/docs/html/struct_vma_allocator_info.html b/third_party/vulkan_memory_allocator/docs/html/struct_vma_allocator_info.html
index b0db0a2..4457391 100644
--- a/third_party/vulkan_memory_allocator/docs/html/struct_vma_allocator_info.html
+++ b/third_party/vulkan_memory_allocator/docs/html/struct_vma_allocator_info.html
@@ -3,7 +3,7 @@
 <head>
 <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
 <meta http-equiv="X-UA-Compatible" content="IE=9"/>
-<meta name="generator" content="Doxygen 1.8.18"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
 <meta name="viewport" content="width=device-width, initial-scale=1"/>
 <title>Vulkan Memory Allocator: VmaAllocatorInfo Struct Reference</title>
 <link href="tabs.css" rel="stylesheet" type="text/css"/>
@@ -29,10 +29,10 @@
 </table>
 </div>
 <!-- end header part -->
-<!-- Generated by Doxygen 1.8.18 -->
+<!-- Generated by Doxygen 1.9.1 -->
 <script type="text/javascript">
 /* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
-var searchBox = new SearchBox("searchBox", "search",false,'Search');
+var searchBox = new SearchBox("searchBox", "search",false,'Search','.html');
 /* @license-end */
 </script>
 <script type="text/javascript" src="menudata.js"></script>
@@ -141,14 +141,12 @@
 </div>
 </div>
 <hr/>The documentation for this struct was generated from the following file:<ul>
-<li><a class="el" href="vk__mem__alloc_8h_source.html">vk_mem_alloc.h</a></li>
+<li>include/<a class="el" href="vk__mem__alloc_8h_source.html">vk_mem_alloc.h</a></li>
 </ul>
 </div><!-- contents -->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated by &#160;<a href="http://www.doxygen.org/index.html">
-<img class="footer" src="doxygen.png" alt="doxygen"/>
-</a> 1.8.18
+Generated by&#160;<a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.1
 </small></address>
 </body>
 </html>
diff --git a/third_party/vulkan_memory_allocator/docs/html/struct_vma_budget-members.html b/third_party/vulkan_memory_allocator/docs/html/struct_vma_budget-members.html
index 4dcad33..209d1a2 100644
--- a/third_party/vulkan_memory_allocator/docs/html/struct_vma_budget-members.html
+++ b/third_party/vulkan_memory_allocator/docs/html/struct_vma_budget-members.html
@@ -3,7 +3,7 @@
 <head>
 <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
 <meta http-equiv="X-UA-Compatible" content="IE=9"/>
-<meta name="generator" content="Doxygen 1.8.18"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
 <meta name="viewport" content="width=device-width, initial-scale=1"/>
 <title>Vulkan Memory Allocator: Member List</title>
 <link href="tabs.css" rel="stylesheet" type="text/css"/>
@@ -29,10 +29,10 @@
 </table>
 </div>
 <!-- end header part -->
-<!-- Generated by Doxygen 1.8.18 -->
+<!-- Generated by Doxygen 1.9.1 -->
 <script type="text/javascript">
 /* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
-var searchBox = new SearchBox("searchBox", "search",false,'Search');
+var searchBox = new SearchBox("searchBox", "search",false,'Search','.html');
 /* @license-end */
 </script>
 <script type="text/javascript" src="menudata.js"></script>
@@ -75,9 +75,7 @@
 </table></div><!-- contents -->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated by &#160;<a href="http://www.doxygen.org/index.html">
-<img class="footer" src="doxygen.png" alt="doxygen"/>
-</a> 1.8.18
+Generated by&#160;<a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.1
 </small></address>
 </body>
 </html>
diff --git a/third_party/vulkan_memory_allocator/docs/html/struct_vma_budget.html b/third_party/vulkan_memory_allocator/docs/html/struct_vma_budget.html
index 805a788..c5dae45 100644
--- a/third_party/vulkan_memory_allocator/docs/html/struct_vma_budget.html
+++ b/third_party/vulkan_memory_allocator/docs/html/struct_vma_budget.html
@@ -3,7 +3,7 @@
 <head>
 <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
 <meta http-equiv="X-UA-Compatible" content="IE=9"/>
-<meta name="generator" content="Doxygen 1.8.18"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
 <meta name="viewport" content="width=device-width, initial-scale=1"/>
 <title>Vulkan Memory Allocator: VmaBudget Struct Reference</title>
 <link href="tabs.css" rel="stylesheet" type="text/css"/>
@@ -29,10 +29,10 @@
 </table>
 </div>
 <!-- end header part -->
-<!-- Generated by Doxygen 1.8.18 -->
+<!-- Generated by Doxygen 1.9.1 -->
 <script type="text/javascript">
 /* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
-var searchBox = new SearchBox("searchBox", "search",false,'Search');
+var searchBox = new SearchBox("searchBox", "search",false,'Search','.html');
 /* @license-end */
 </script>
 <script type="text/javascript" src="menudata.js"></script>
@@ -163,14 +163,12 @@
 </div>
 </div>
 <hr/>The documentation for this struct was generated from the following file:<ul>
-<li><a class="el" href="vk__mem__alloc_8h_source.html">vk_mem_alloc.h</a></li>
+<li>include/<a class="el" href="vk__mem__alloc_8h_source.html">vk_mem_alloc.h</a></li>
 </ul>
 </div><!-- contents -->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated by &#160;<a href="http://www.doxygen.org/index.html">
-<img class="footer" src="doxygen.png" alt="doxygen"/>
-</a> 1.8.18
+Generated by&#160;<a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.1
 </small></address>
 </body>
 </html>
diff --git a/third_party/vulkan_memory_allocator/docs/html/struct_vma_defragmentation_context.html b/third_party/vulkan_memory_allocator/docs/html/struct_vma_defragmentation_context.html
index 1652720..74e29b9 100644
--- a/third_party/vulkan_memory_allocator/docs/html/struct_vma_defragmentation_context.html
+++ b/third_party/vulkan_memory_allocator/docs/html/struct_vma_defragmentation_context.html
@@ -3,7 +3,7 @@
 <head>
 <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
 <meta http-equiv="X-UA-Compatible" content="IE=9"/>
-<meta name="generator" content="Doxygen 1.8.18"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
 <meta name="viewport" content="width=device-width, initial-scale=1"/>
 <title>Vulkan Memory Allocator: VmaDefragmentationContext Struct Reference</title>
 <link href="tabs.css" rel="stylesheet" type="text/css"/>
@@ -29,10 +29,10 @@
 </table>
 </div>
 <!-- end header part -->
-<!-- Generated by Doxygen 1.8.18 -->
+<!-- Generated by Doxygen 1.9.1 -->
 <script type="text/javascript">
 /* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
-var searchBox = new SearchBox("searchBox", "search",false,'Search');
+var searchBox = new SearchBox("searchBox", "search",false,'Search','.html');
 /* @license-end */
 </script>
 <script type="text/javascript" src="menudata.js"></script>
@@ -74,14 +74,12 @@
 <div class="textblock"><p>Represents Opaque object that represents started defragmentation process. </p>
 <p>Fill structure <a class="el" href="struct_vma_defragmentation_info2.html" title="Parameters for defragmentation.">VmaDefragmentationInfo2</a> and call function <a class="el" href="vk__mem__alloc_8h.html#a36ba776fd7fd5cb1e9359fdc0d8e6e8a" title="Begins defragmentation process.">vmaDefragmentationBegin()</a> to create it. Call function <a class="el" href="vk__mem__alloc_8h.html#a8774e20e91e245aae959ba63efa15dd2" title="Ends defragmentation process.">vmaDefragmentationEnd()</a> to destroy it. </p>
 </div><hr/>The documentation for this struct was generated from the following file:<ul>
-<li><a class="el" href="vk__mem__alloc_8h_source.html">vk_mem_alloc.h</a></li>
+<li>include/<a class="el" href="vk__mem__alloc_8h_source.html">vk_mem_alloc.h</a></li>
 </ul>
 </div><!-- contents -->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated by &#160;<a href="http://www.doxygen.org/index.html">
-<img class="footer" src="doxygen.png" alt="doxygen"/>
-</a> 1.8.18
+Generated by&#160;<a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.1
 </small></address>
 </body>
 </html>
diff --git a/third_party/vulkan_memory_allocator/docs/html/struct_vma_defragmentation_info-members.html b/third_party/vulkan_memory_allocator/docs/html/struct_vma_defragmentation_info-members.html
index 3d74842..9ca5100 100644
--- a/third_party/vulkan_memory_allocator/docs/html/struct_vma_defragmentation_info-members.html
+++ b/third_party/vulkan_memory_allocator/docs/html/struct_vma_defragmentation_info-members.html
@@ -3,7 +3,7 @@
 <head>
 <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
 <meta http-equiv="X-UA-Compatible" content="IE=9"/>
-<meta name="generator" content="Doxygen 1.8.18"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
 <meta name="viewport" content="width=device-width, initial-scale=1"/>
 <title>Vulkan Memory Allocator: Member List</title>
 <link href="tabs.css" rel="stylesheet" type="text/css"/>
@@ -29,10 +29,10 @@
 </table>
 </div>
 <!-- end header part -->
-<!-- Generated by Doxygen 1.8.18 -->
+<!-- Generated by Doxygen 1.9.1 -->
 <script type="text/javascript">
 /* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
-var searchBox = new SearchBox("searchBox", "search",false,'Search');
+var searchBox = new SearchBox("searchBox", "search",false,'Search','.html');
 /* @license-end */
 </script>
 <script type="text/javascript" src="menudata.js"></script>
@@ -73,9 +73,7 @@
 </table></div><!-- contents -->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated by &#160;<a href="http://www.doxygen.org/index.html">
-<img class="footer" src="doxygen.png" alt="doxygen"/>
-</a> 1.8.18
+Generated by&#160;<a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.1
 </small></address>
 </body>
 </html>
diff --git a/third_party/vulkan_memory_allocator/docs/html/struct_vma_defragmentation_info.html b/third_party/vulkan_memory_allocator/docs/html/struct_vma_defragmentation_info.html
index ca01ea2..36e76c5 100644
--- a/third_party/vulkan_memory_allocator/docs/html/struct_vma_defragmentation_info.html
+++ b/third_party/vulkan_memory_allocator/docs/html/struct_vma_defragmentation_info.html
@@ -3,7 +3,7 @@
 <head>
 <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
 <meta http-equiv="X-UA-Compatible" content="IE=9"/>
-<meta name="generator" content="Doxygen 1.8.18"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
 <meta name="viewport" content="width=device-width, initial-scale=1"/>
 <title>Vulkan Memory Allocator: VmaDefragmentationInfo Struct Reference</title>
 <link href="tabs.css" rel="stylesheet" type="text/css"/>
@@ -29,10 +29,10 @@
 </table>
 </div>
 <!-- end header part -->
-<!-- Generated by Doxygen 1.8.18 -->
+<!-- Generated by Doxygen 1.9.1 -->
 <script type="text/javascript">
 /* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
-var searchBox = new SearchBox("searchBox", "search",false,'Search');
+var searchBox = new SearchBox("searchBox", "search",false,'Search','.html');
 /* @license-end */
 </script>
 <script type="text/javascript" src="menudata.js"></script>
@@ -85,7 +85,7 @@
 </table>
 <a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
 <div class="textblock"><p>Deprecated. Optional configuration parameters to be passed to function <a class="el" href="vk__mem__alloc_8h.html#a9f0f8f56db5f7f57fe4454f465142dac" title="Deprecated. Compacts memory by moving allocations.">vmaDefragment()</a>. </p>
-<dl class="deprecated"><dt><b><a class="el" href="deprecated.html#_deprecated000002">Deprecated:</a></b></dt><dd>This is a part of the old interface. It is recommended to use structure <a class="el" href="struct_vma_defragmentation_info2.html" title="Parameters for defragmentation.">VmaDefragmentationInfo2</a> and function <a class="el" href="vk__mem__alloc_8h.html#a36ba776fd7fd5cb1e9359fdc0d8e6e8a" title="Begins defragmentation process.">vmaDefragmentationBegin()</a> instead. </dd></dl>
+<dl class="deprecated"><dt><b><a class="el" href="deprecated.html#_deprecated000001">Deprecated:</a></b></dt><dd>This is a part of the old interface. It is recommended to use structure <a class="el" href="struct_vma_defragmentation_info2.html" title="Parameters for defragmentation.">VmaDefragmentationInfo2</a> and function <a class="el" href="vk__mem__alloc_8h.html#a36ba776fd7fd5cb1e9359fdc0d8e6e8a" title="Begins defragmentation process.">vmaDefragmentationBegin()</a> instead. </dd></dl>
 </div><h2 class="groupheader">Member Data Documentation</h2>
 <a id="aa7c7304e13c71f604c907196c4e28fbc"></a>
 <h2 class="memtitle"><span class="permalink"><a href="#aa7c7304e13c71f604c907196c4e28fbc">&#9670;&nbsp;</a></span>maxAllocationsToMove</h2>
@@ -122,14 +122,12 @@
 </div>
 </div>
 <hr/>The documentation for this struct was generated from the following file:<ul>
-<li><a class="el" href="vk__mem__alloc_8h_source.html">vk_mem_alloc.h</a></li>
+<li>include/<a class="el" href="vk__mem__alloc_8h_source.html">vk_mem_alloc.h</a></li>
 </ul>
 </div><!-- contents -->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated by &#160;<a href="http://www.doxygen.org/index.html">
-<img class="footer" src="doxygen.png" alt="doxygen"/>
-</a> 1.8.18
+Generated by&#160;<a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.1
 </small></address>
 </body>
 </html>
diff --git a/third_party/vulkan_memory_allocator/docs/html/struct_vma_defragmentation_info2-members.html b/third_party/vulkan_memory_allocator/docs/html/struct_vma_defragmentation_info2-members.html
index 4268da5..3c01166 100644
--- a/third_party/vulkan_memory_allocator/docs/html/struct_vma_defragmentation_info2-members.html
+++ b/third_party/vulkan_memory_allocator/docs/html/struct_vma_defragmentation_info2-members.html
@@ -3,7 +3,7 @@
 <head>
 <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
 <meta http-equiv="X-UA-Compatible" content="IE=9"/>
-<meta name="generator" content="Doxygen 1.8.18"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
 <meta name="viewport" content="width=device-width, initial-scale=1"/>
 <title>Vulkan Memory Allocator: Member List</title>
 <link href="tabs.css" rel="stylesheet" type="text/css"/>
@@ -29,10 +29,10 @@
 </table>
 </div>
 <!-- end header part -->
-<!-- Generated by Doxygen 1.8.18 -->
+<!-- Generated by Doxygen 1.9.1 -->
 <script type="text/javascript">
 /* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
-var searchBox = new SearchBox("searchBox", "search",false,'Search');
+var searchBox = new SearchBox("searchBox", "search",false,'Search','.html');
 /* @license-end */
 </script>
 <script type="text/javascript" src="menudata.js"></script>
@@ -82,9 +82,7 @@
 </table></div><!-- contents -->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated by &#160;<a href="http://www.doxygen.org/index.html">
-<img class="footer" src="doxygen.png" alt="doxygen"/>
-</a> 1.8.18
+Generated by&#160;<a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.1
 </small></address>
 </body>
 </html>
diff --git a/third_party/vulkan_memory_allocator/docs/html/struct_vma_defragmentation_info2.html b/third_party/vulkan_memory_allocator/docs/html/struct_vma_defragmentation_info2.html
index 2ae1ba3..9894ec2 100644
--- a/third_party/vulkan_memory_allocator/docs/html/struct_vma_defragmentation_info2.html
+++ b/third_party/vulkan_memory_allocator/docs/html/struct_vma_defragmentation_info2.html
@@ -3,7 +3,7 @@
 <head>
 <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
 <meta http-equiv="X-UA-Compatible" content="IE=9"/>
-<meta name="generator" content="Doxygen 1.8.18"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
 <meta name="viewport" content="width=device-width, initial-scale=1"/>
 <title>Vulkan Memory Allocator: VmaDefragmentationInfo2 Struct Reference</title>
 <link href="tabs.css" rel="stylesheet" type="text/css"/>
@@ -29,10 +29,10 @@
 </table>
 </div>
 <!-- end header part -->
-<!-- Generated by Doxygen 1.8.18 -->
+<!-- Generated by Doxygen 1.9.1 -->
 <script type="text/javascript">
 /* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
-var searchBox = new SearchBox("searchBox", "search",false,'Search');
+var searchBox = new SearchBox("searchBox", "search",false,'Search','.html');
 /* @license-end */
 </script>
 <script type="text/javascript" src="menudata.js"></script>
@@ -302,14 +302,12 @@
 </div>
 </div>
 <hr/>The documentation for this struct was generated from the following file:<ul>
-<li><a class="el" href="vk__mem__alloc_8h_source.html">vk_mem_alloc.h</a></li>
+<li>include/<a class="el" href="vk__mem__alloc_8h_source.html">vk_mem_alloc.h</a></li>
 </ul>
 </div><!-- contents -->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated by &#160;<a href="http://www.doxygen.org/index.html">
-<img class="footer" src="doxygen.png" alt="doxygen"/>
-</a> 1.8.18
+Generated by&#160;<a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.1
 </small></address>
 </body>
 </html>
diff --git a/third_party/vulkan_memory_allocator/docs/html/struct_vma_defragmentation_pass_info-members.html b/third_party/vulkan_memory_allocator/docs/html/struct_vma_defragmentation_pass_info-members.html
index c61accd..472df8c 100644
--- a/third_party/vulkan_memory_allocator/docs/html/struct_vma_defragmentation_pass_info-members.html
+++ b/third_party/vulkan_memory_allocator/docs/html/struct_vma_defragmentation_pass_info-members.html
@@ -3,7 +3,7 @@
 <head>
 <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
 <meta http-equiv="X-UA-Compatible" content="IE=9"/>
-<meta name="generator" content="Doxygen 1.8.18"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
 <meta name="viewport" content="width=device-width, initial-scale=1"/>
 <title>Vulkan Memory Allocator: Member List</title>
 <link href="tabs.css" rel="stylesheet" type="text/css"/>
@@ -29,10 +29,10 @@
 </table>
 </div>
 <!-- end header part -->
-<!-- Generated by Doxygen 1.8.18 -->
+<!-- Generated by Doxygen 1.9.1 -->
 <script type="text/javascript">
 /* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
-var searchBox = new SearchBox("searchBox", "search",false,'Search');
+var searchBox = new SearchBox("searchBox", "search",false,'Search','.html');
 /* @license-end */
 </script>
 <script type="text/javascript" src="menudata.js"></script>
@@ -73,9 +73,7 @@
 </table></div><!-- contents -->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated by &#160;<a href="http://www.doxygen.org/index.html">
-<img class="footer" src="doxygen.png" alt="doxygen"/>
-</a> 1.8.18
+Generated by&#160;<a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.1
 </small></address>
 </body>
 </html>
diff --git a/third_party/vulkan_memory_allocator/docs/html/struct_vma_defragmentation_pass_info.html b/third_party/vulkan_memory_allocator/docs/html/struct_vma_defragmentation_pass_info.html
index a05b954..fa74c06 100644
--- a/third_party/vulkan_memory_allocator/docs/html/struct_vma_defragmentation_pass_info.html
+++ b/third_party/vulkan_memory_allocator/docs/html/struct_vma_defragmentation_pass_info.html
@@ -3,7 +3,7 @@
 <head>
 <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
 <meta http-equiv="X-UA-Compatible" content="IE=9"/>
-<meta name="generator" content="Doxygen 1.8.18"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
 <meta name="viewport" content="width=device-width, initial-scale=1"/>
 <title>Vulkan Memory Allocator: VmaDefragmentationPassInfo Struct Reference</title>
 <link href="tabs.css" rel="stylesheet" type="text/css"/>
@@ -29,10 +29,10 @@
 </table>
 </div>
 <!-- end header part -->
-<!-- Generated by Doxygen 1.8.18 -->
+<!-- Generated by Doxygen 1.9.1 -->
 <script type="text/javascript">
 /* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
-var searchBox = new SearchBox("searchBox", "search",false,'Search');
+var searchBox = new SearchBox("searchBox", "search",false,'Search','.html');
 /* @license-end */
 </script>
 <script type="text/javascript" src="menudata.js"></script>
@@ -114,14 +114,12 @@
 </div>
 </div>
 <hr/>The documentation for this struct was generated from the following file:<ul>
-<li><a class="el" href="vk__mem__alloc_8h_source.html">vk_mem_alloc.h</a></li>
+<li>include/<a class="el" href="vk__mem__alloc_8h_source.html">vk_mem_alloc.h</a></li>
 </ul>
 </div><!-- contents -->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated by &#160;<a href="http://www.doxygen.org/index.html">
-<img class="footer" src="doxygen.png" alt="doxygen"/>
-</a> 1.8.18
+Generated by&#160;<a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.1
 </small></address>
 </body>
 </html>
diff --git a/third_party/vulkan_memory_allocator/docs/html/struct_vma_defragmentation_pass_move_info-members.html b/third_party/vulkan_memory_allocator/docs/html/struct_vma_defragmentation_pass_move_info-members.html
index b3ffa28..61f0179 100644
--- a/third_party/vulkan_memory_allocator/docs/html/struct_vma_defragmentation_pass_move_info-members.html
+++ b/third_party/vulkan_memory_allocator/docs/html/struct_vma_defragmentation_pass_move_info-members.html
@@ -3,7 +3,7 @@
 <head>
 <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
 <meta http-equiv="X-UA-Compatible" content="IE=9"/>
-<meta name="generator" content="Doxygen 1.8.18"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
 <meta name="viewport" content="width=device-width, initial-scale=1"/>
 <title>Vulkan Memory Allocator: Member List</title>
 <link href="tabs.css" rel="stylesheet" type="text/css"/>
@@ -29,10 +29,10 @@
 </table>
 </div>
 <!-- end header part -->
-<!-- Generated by Doxygen 1.8.18 -->
+<!-- Generated by Doxygen 1.9.1 -->
 <script type="text/javascript">
 /* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
-var searchBox = new SearchBox("searchBox", "search",false,'Search');
+var searchBox = new SearchBox("searchBox", "search",false,'Search','.html');
 /* @license-end */
 </script>
 <script type="text/javascript" src="menudata.js"></script>
@@ -74,9 +74,7 @@
 </table></div><!-- contents -->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated by &#160;<a href="http://www.doxygen.org/index.html">
-<img class="footer" src="doxygen.png" alt="doxygen"/>
-</a> 1.8.18
+Generated by&#160;<a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.1
 </small></address>
 </body>
 </html>
diff --git a/third_party/vulkan_memory_allocator/docs/html/struct_vma_defragmentation_pass_move_info.html b/third_party/vulkan_memory_allocator/docs/html/struct_vma_defragmentation_pass_move_info.html
index 091055e..5486f41 100644
--- a/third_party/vulkan_memory_allocator/docs/html/struct_vma_defragmentation_pass_move_info.html
+++ b/third_party/vulkan_memory_allocator/docs/html/struct_vma_defragmentation_pass_move_info.html
@@ -3,7 +3,7 @@
 <head>
 <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
 <meta http-equiv="X-UA-Compatible" content="IE=9"/>
-<meta name="generator" content="Doxygen 1.8.18"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
 <meta name="viewport" content="width=device-width, initial-scale=1"/>
 <title>Vulkan Memory Allocator: VmaDefragmentationPassMoveInfo Struct Reference</title>
 <link href="tabs.css" rel="stylesheet" type="text/css"/>
@@ -29,10 +29,10 @@
 </table>
 </div>
 <!-- end header part -->
-<!-- Generated by Doxygen 1.8.18 -->
+<!-- Generated by Doxygen 1.9.1 -->
 <script type="text/javascript">
 /* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
-var searchBox = new SearchBox("searchBox", "search",false,'Search');
+var searchBox = new SearchBox("searchBox", "search",false,'Search','.html');
 /* @license-end */
 </script>
 <script type="text/javascript" src="menudata.js"></script>
@@ -124,14 +124,12 @@
 </div>
 </div>
 <hr/>The documentation for this struct was generated from the following file:<ul>
-<li><a class="el" href="vk__mem__alloc_8h_source.html">vk_mem_alloc.h</a></li>
+<li>include/<a class="el" href="vk__mem__alloc_8h_source.html">vk_mem_alloc.h</a></li>
 </ul>
 </div><!-- contents -->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated by &#160;<a href="http://www.doxygen.org/index.html">
-<img class="footer" src="doxygen.png" alt="doxygen"/>
-</a> 1.8.18
+Generated by&#160;<a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.1
 </small></address>
 </body>
 </html>
diff --git a/third_party/vulkan_memory_allocator/docs/html/struct_vma_defragmentation_stats-members.html b/third_party/vulkan_memory_allocator/docs/html/struct_vma_defragmentation_stats-members.html
index 30ec73e..ac8b730 100644
--- a/third_party/vulkan_memory_allocator/docs/html/struct_vma_defragmentation_stats-members.html
+++ b/third_party/vulkan_memory_allocator/docs/html/struct_vma_defragmentation_stats-members.html
@@ -3,7 +3,7 @@
 <head>
 <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
 <meta http-equiv="X-UA-Compatible" content="IE=9"/>
-<meta name="generator" content="Doxygen 1.8.18"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
 <meta name="viewport" content="width=device-width, initial-scale=1"/>
 <title>Vulkan Memory Allocator: Member List</title>
 <link href="tabs.css" rel="stylesheet" type="text/css"/>
@@ -29,10 +29,10 @@
 </table>
 </div>
 <!-- end header part -->
-<!-- Generated by Doxygen 1.8.18 -->
+<!-- Generated by Doxygen 1.9.1 -->
 <script type="text/javascript">
 /* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
-var searchBox = new SearchBox("searchBox", "search",false,'Search');
+var searchBox = new SearchBox("searchBox", "search",false,'Search','.html');
 /* @license-end */
 </script>
 <script type="text/javascript" src="menudata.js"></script>
@@ -75,9 +75,7 @@
 </table></div><!-- contents -->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated by &#160;<a href="http://www.doxygen.org/index.html">
-<img class="footer" src="doxygen.png" alt="doxygen"/>
-</a> 1.8.18
+Generated by&#160;<a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.1
 </small></address>
 </body>
 </html>
diff --git a/third_party/vulkan_memory_allocator/docs/html/struct_vma_defragmentation_stats.html b/third_party/vulkan_memory_allocator/docs/html/struct_vma_defragmentation_stats.html
index 2274eae..40acee8 100644
--- a/third_party/vulkan_memory_allocator/docs/html/struct_vma_defragmentation_stats.html
+++ b/third_party/vulkan_memory_allocator/docs/html/struct_vma_defragmentation_stats.html
@@ -3,7 +3,7 @@
 <head>
 <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
 <meta http-equiv="X-UA-Compatible" content="IE=9"/>
-<meta name="generator" content="Doxygen 1.8.18"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
 <meta name="viewport" content="width=device-width, initial-scale=1"/>
 <title>Vulkan Memory Allocator: VmaDefragmentationStats Struct Reference</title>
 <link href="tabs.css" rel="stylesheet" type="text/css"/>
@@ -29,10 +29,10 @@
 </table>
 </div>
 <!-- end header part -->
-<!-- Generated by Doxygen 1.8.18 -->
+<!-- Generated by Doxygen 1.9.1 -->
 <script type="text/javascript">
 /* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
-var searchBox = new SearchBox("searchBox", "search",false,'Search');
+var searchBox = new SearchBox("searchBox", "search",false,'Search','.html');
 /* @license-end */
 </script>
 <script type="text/javascript" src="menudata.js"></script>
@@ -157,14 +157,12 @@
 </div>
 </div>
 <hr/>The documentation for this struct was generated from the following file:<ul>
-<li><a class="el" href="vk__mem__alloc_8h_source.html">vk_mem_alloc.h</a></li>
+<li>include/<a class="el" href="vk__mem__alloc_8h_source.html">vk_mem_alloc.h</a></li>
 </ul>
 </div><!-- contents -->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated by &#160;<a href="http://www.doxygen.org/index.html">
-<img class="footer" src="doxygen.png" alt="doxygen"/>
-</a> 1.8.18
+Generated by&#160;<a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.1
 </small></address>
 </body>
 </html>
diff --git a/third_party/vulkan_memory_allocator/docs/html/struct_vma_device_memory_callbacks-members.html b/third_party/vulkan_memory_allocator/docs/html/struct_vma_device_memory_callbacks-members.html
index 6415ea6..4c3ff43 100644
--- a/third_party/vulkan_memory_allocator/docs/html/struct_vma_device_memory_callbacks-members.html
+++ b/third_party/vulkan_memory_allocator/docs/html/struct_vma_device_memory_callbacks-members.html
@@ -3,7 +3,7 @@
 <head>
 <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
 <meta http-equiv="X-UA-Compatible" content="IE=9"/>
-<meta name="generator" content="Doxygen 1.8.18"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
 <meta name="viewport" content="width=device-width, initial-scale=1"/>
 <title>Vulkan Memory Allocator: Member List</title>
 <link href="tabs.css" rel="stylesheet" type="text/css"/>
@@ -29,10 +29,10 @@
 </table>
 </div>
 <!-- end header part -->
-<!-- Generated by Doxygen 1.8.18 -->
+<!-- Generated by Doxygen 1.9.1 -->
 <script type="text/javascript">
 /* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
-var searchBox = new SearchBox("searchBox", "search",false,'Search');
+var searchBox = new SearchBox("searchBox", "search",false,'Search','.html');
 /* @license-end */
 </script>
 <script type="text/javascript" src="menudata.js"></script>
@@ -74,9 +74,7 @@
 </table></div><!-- contents -->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated by &#160;<a href="http://www.doxygen.org/index.html">
-<img class="footer" src="doxygen.png" alt="doxygen"/>
-</a> 1.8.18
+Generated by&#160;<a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.1
 </small></address>
 </body>
 </html>
diff --git a/third_party/vulkan_memory_allocator/docs/html/struct_vma_device_memory_callbacks.html b/third_party/vulkan_memory_allocator/docs/html/struct_vma_device_memory_callbacks.html
index cb79c0b..6cc3a20 100644
--- a/third_party/vulkan_memory_allocator/docs/html/struct_vma_device_memory_callbacks.html
+++ b/third_party/vulkan_memory_allocator/docs/html/struct_vma_device_memory_callbacks.html
@@ -3,7 +3,7 @@
 <head>
 <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
 <meta http-equiv="X-UA-Compatible" content="IE=9"/>
-<meta name="generator" content="Doxygen 1.8.18"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
 <meta name="viewport" content="width=device-width, initial-scale=1"/>
 <title>Vulkan Memory Allocator: VmaDeviceMemoryCallbacks Struct Reference</title>
 <link href="tabs.css" rel="stylesheet" type="text/css"/>
@@ -29,10 +29,10 @@
 </table>
 </div>
 <!-- end header part -->
-<!-- Generated by Doxygen 1.8.18 -->
+<!-- Generated by Doxygen 1.9.1 -->
 <script type="text/javascript">
 /* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
-var searchBox = new SearchBox("searchBox", "search",false,'Search');
+var searchBox = new SearchBox("searchBox", "search",false,'Search','.html');
 /* @license-end */
 </script>
 <script type="text/javascript" src="menudata.js"></script>
@@ -140,14 +140,12 @@
 </div>
 </div>
 <hr/>The documentation for this struct was generated from the following file:<ul>
-<li><a class="el" href="vk__mem__alloc_8h_source.html">vk_mem_alloc.h</a></li>
+<li>include/<a class="el" href="vk__mem__alloc_8h_source.html">vk_mem_alloc.h</a></li>
 </ul>
 </div><!-- contents -->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated by &#160;<a href="http://www.doxygen.org/index.html">
-<img class="footer" src="doxygen.png" alt="doxygen"/>
-</a> 1.8.18
+Generated by&#160;<a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.1
 </small></address>
 </body>
 </html>
diff --git a/third_party/vulkan_memory_allocator/docs/html/struct_vma_pool.html b/third_party/vulkan_memory_allocator/docs/html/struct_vma_pool.html
index b33366b..b9eaa8b 100644
--- a/third_party/vulkan_memory_allocator/docs/html/struct_vma_pool.html
+++ b/third_party/vulkan_memory_allocator/docs/html/struct_vma_pool.html
@@ -3,7 +3,7 @@
 <head>
 <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
 <meta http-equiv="X-UA-Compatible" content="IE=9"/>
-<meta name="generator" content="Doxygen 1.8.18"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
 <meta name="viewport" content="width=device-width, initial-scale=1"/>
 <title>Vulkan Memory Allocator: VmaPool Struct Reference</title>
 <link href="tabs.css" rel="stylesheet" type="text/css"/>
@@ -29,10 +29,10 @@
 </table>
 </div>
 <!-- end header part -->
-<!-- Generated by Doxygen 1.8.18 -->
+<!-- Generated by Doxygen 1.9.1 -->
 <script type="text/javascript">
 /* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
-var searchBox = new SearchBox("searchBox", "search",false,'Search');
+var searchBox = new SearchBox("searchBox", "search",false,'Search','.html');
 /* @license-end */
 </script>
 <script type="text/javascript" src="menudata.js"></script>
@@ -75,14 +75,12 @@
 <p>Fill structure <a class="el" href="struct_vma_pool_create_info.html" title="Describes parameter of created VmaPool.">VmaPoolCreateInfo</a> and call function <a class="el" href="vk__mem__alloc_8h.html#a5c8770ded7c59c8caac6de0c2cb00b50" title="Allocates Vulkan device memory and creates VmaPool object.">vmaCreatePool()</a> to create it. Call function <a class="el" href="vk__mem__alloc_8h.html#a5485779c8f1948238fc4e92232fa65e1" title="Destroys VmaPool object and frees Vulkan device memory.">vmaDestroyPool()</a> to destroy it.</p>
 <p>For more information see <a class="el" href="choosing_memory_type.html#choosing_memory_type_custom_memory_pools">Custom memory pools</a>. </p>
 </div><hr/>The documentation for this struct was generated from the following file:<ul>
-<li><a class="el" href="vk__mem__alloc_8h_source.html">vk_mem_alloc.h</a></li>
+<li>include/<a class="el" href="vk__mem__alloc_8h_source.html">vk_mem_alloc.h</a></li>
 </ul>
 </div><!-- contents -->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated by &#160;<a href="http://www.doxygen.org/index.html">
-<img class="footer" src="doxygen.png" alt="doxygen"/>
-</a> 1.8.18
+Generated by&#160;<a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.1
 </small></address>
 </body>
 </html>
diff --git a/third_party/vulkan_memory_allocator/docs/html/struct_vma_pool_create_info-members.html b/third_party/vulkan_memory_allocator/docs/html/struct_vma_pool_create_info-members.html
index b6dafc1..484aaff 100644
--- a/third_party/vulkan_memory_allocator/docs/html/struct_vma_pool_create_info-members.html
+++ b/third_party/vulkan_memory_allocator/docs/html/struct_vma_pool_create_info-members.html
@@ -3,7 +3,7 @@
 <head>
 <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
 <meta http-equiv="X-UA-Compatible" content="IE=9"/>
-<meta name="generator" content="Doxygen 1.8.18"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
 <meta name="viewport" content="width=device-width, initial-scale=1"/>
 <title>Vulkan Memory Allocator: Member List</title>
 <link href="tabs.css" rel="stylesheet" type="text/css"/>
@@ -29,10 +29,10 @@
 </table>
 </div>
 <!-- end header part -->
-<!-- Generated by Doxygen 1.8.18 -->
+<!-- Generated by Doxygen 1.9.1 -->
 <script type="text/javascript">
 /* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
-var searchBox = new SearchBox("searchBox", "search",false,'Search');
+var searchBox = new SearchBox("searchBox", "search",false,'Search','.html');
 /* @license-end */
 </script>
 <script type="text/javascript" src="menudata.js"></script>
@@ -74,12 +74,11 @@
   <tr><td class="entry"><a class="el" href="struct_vma_pool_create_info.html#ae41142f2834fcdc82baa4883c187b75c">maxBlockCount</a></td><td class="entry"><a class="el" href="struct_vma_pool_create_info.html">VmaPoolCreateInfo</a></td><td class="entry"></td></tr>
   <tr class="even"><td class="entry"><a class="el" href="struct_vma_pool_create_info.html#a596fa76b685d3f1f688f84a709a5b319">memoryTypeIndex</a></td><td class="entry"><a class="el" href="struct_vma_pool_create_info.html">VmaPoolCreateInfo</a></td><td class="entry"></td></tr>
   <tr><td class="entry"><a class="el" href="struct_vma_pool_create_info.html#ad8006fb803185c0a699d30f3e9a865ae">minBlockCount</a></td><td class="entry"><a class="el" href="struct_vma_pool_create_info.html">VmaPoolCreateInfo</a></td><td class="entry"></td></tr>
+  <tr class="even"><td class="entry"><a class="el" href="struct_vma_pool_create_info.html#a16e686c688f6725f119ebf6e24ab5274">priority</a></td><td class="entry"><a class="el" href="struct_vma_pool_create_info.html">VmaPoolCreateInfo</a></td><td class="entry"></td></tr>
 </table></div><!-- contents -->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated by &#160;<a href="http://www.doxygen.org/index.html">
-<img class="footer" src="doxygen.png" alt="doxygen"/>
-</a> 1.8.18
+Generated by&#160;<a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.1
 </small></address>
 </body>
 </html>
diff --git a/third_party/vulkan_memory_allocator/docs/html/struct_vma_pool_create_info.html b/third_party/vulkan_memory_allocator/docs/html/struct_vma_pool_create_info.html
index 7d657f7..d587f1f 100644
--- a/third_party/vulkan_memory_allocator/docs/html/struct_vma_pool_create_info.html
+++ b/third_party/vulkan_memory_allocator/docs/html/struct_vma_pool_create_info.html
@@ -3,7 +3,7 @@
 <head>
 <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
 <meta http-equiv="X-UA-Compatible" content="IE=9"/>
-<meta name="generator" content="Doxygen 1.8.18"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
 <meta name="viewport" content="width=device-width, initial-scale=1"/>
 <title>Vulkan Memory Allocator: VmaPoolCreateInfo Struct Reference</title>
 <link href="tabs.css" rel="stylesheet" type="text/css"/>
@@ -29,10 +29,10 @@
 </table>
 </div>
 <!-- end header part -->
-<!-- Generated by Doxygen 1.8.18 -->
+<!-- Generated by Doxygen 1.9.1 -->
 <script type="text/javascript">
 /* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
-var searchBox = new SearchBox("searchBox", "search",false,'Search');
+var searchBox = new SearchBox("searchBox", "search",false,'Search','.html');
 /* @license-end */
 </script>
 <script type="text/javascript" src="menudata.js"></script>
@@ -94,6 +94,9 @@
 <tr class="memitem:a9437e43ffbb644dbbf7fc4e50cfad6aa"><td class="memItemLeft" align="right" valign="top">uint32_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_vma_pool_create_info.html#a9437e43ffbb644dbbf7fc4e50cfad6aa">frameInUseCount</a></td></tr>
 <tr class="memdesc:a9437e43ffbb644dbbf7fc4e50cfad6aa"><td class="mdescLeft">&#160;</td><td class="mdescRight">Maximum number of additional frames that are in use at the same time as current frame.  <a href="struct_vma_pool_create_info.html#a9437e43ffbb644dbbf7fc4e50cfad6aa">More...</a><br /></td></tr>
 <tr class="separator:a9437e43ffbb644dbbf7fc4e50cfad6aa"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a16e686c688f6725f119ebf6e24ab5274"><td class="memItemLeft" align="right" valign="top">float&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_vma_pool_create_info.html#a16e686c688f6725f119ebf6e24ab5274">priority</a></td></tr>
+<tr class="memdesc:a16e686c688f6725f119ebf6e24ab5274"><td class="mdescLeft">&#160;</td><td class="mdescRight">A floating-point value between 0 and 1, indicating the priority of the allocations in this pool relative to other memory allocations.  <a href="struct_vma_pool_create_info.html#a16e686c688f6725f119ebf6e24ab5274">More...</a><br /></td></tr>
+<tr class="separator:a16e686c688f6725f119ebf6e24ab5274"><td class="memSeparator" colspan="2">&#160;</td></tr>
 </table>
 <a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
 <div class="textblock"><p>Describes parameter of created <a class="el" href="struct_vma_pool.html" title="Represents custom memory pool.">VmaPool</a>. </p>
@@ -202,15 +205,30 @@
 
 </div>
 </div>
+<a id="a16e686c688f6725f119ebf6e24ab5274"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a16e686c688f6725f119ebf6e24ab5274">&#9670;&nbsp;</a></span>priority</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">float VmaPoolCreateInfo::priority</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>A floating-point value between 0 and 1, indicating the priority of the allocations in this pool relative to other memory allocations. </p>
+<p>It is used only when <a class="el" href="vk__mem__alloc_8h.html#a4f87c9100d154a65a4ad495f7763cf7caffdd7a5169be3dbd7cbf6b3619e4f78a">VMA_ALLOCATOR_CREATE_EXT_MEMORY_PRIORITY_BIT</a> flag was used during creation of the <a class="el" href="struct_vma_allocator.html" title="Represents main object of this library initialized.">VmaAllocator</a> object. Otherwise, this variable is ignored. </p>
+
+</div>
+</div>
 <hr/>The documentation for this struct was generated from the following file:<ul>
-<li><a class="el" href="vk__mem__alloc_8h_source.html">vk_mem_alloc.h</a></li>
+<li>include/<a class="el" href="vk__mem__alloc_8h_source.html">vk_mem_alloc.h</a></li>
 </ul>
 </div><!-- contents -->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated by &#160;<a href="http://www.doxygen.org/index.html">
-<img class="footer" src="doxygen.png" alt="doxygen"/>
-</a> 1.8.18
+Generated by&#160;<a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.1
 </small></address>
 </body>
 </html>
diff --git a/third_party/vulkan_memory_allocator/docs/html/struct_vma_pool_stats-members.html b/third_party/vulkan_memory_allocator/docs/html/struct_vma_pool_stats-members.html
index 7452dce..14d90f6 100644
--- a/third_party/vulkan_memory_allocator/docs/html/struct_vma_pool_stats-members.html
+++ b/third_party/vulkan_memory_allocator/docs/html/struct_vma_pool_stats-members.html
@@ -3,7 +3,7 @@
 <head>
 <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
 <meta http-equiv="X-UA-Compatible" content="IE=9"/>
-<meta name="generator" content="Doxygen 1.8.18"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
 <meta name="viewport" content="width=device-width, initial-scale=1"/>
 <title>Vulkan Memory Allocator: Member List</title>
 <link href="tabs.css" rel="stylesheet" type="text/css"/>
@@ -29,10 +29,10 @@
 </table>
 </div>
 <!-- end header part -->
-<!-- Generated by Doxygen 1.8.18 -->
+<!-- Generated by Doxygen 1.9.1 -->
 <script type="text/javascript">
 /* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
-var searchBox = new SearchBox("searchBox", "search",false,'Search');
+var searchBox = new SearchBox("searchBox", "search",false,'Search','.html');
 /* @license-end */
 </script>
 <script type="text/javascript" src="menudata.js"></script>
@@ -77,9 +77,7 @@
 </table></div><!-- contents -->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated by &#160;<a href="http://www.doxygen.org/index.html">
-<img class="footer" src="doxygen.png" alt="doxygen"/>
-</a> 1.8.18
+Generated by&#160;<a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.1
 </small></address>
 </body>
 </html>
diff --git a/third_party/vulkan_memory_allocator/docs/html/struct_vma_pool_stats.html b/third_party/vulkan_memory_allocator/docs/html/struct_vma_pool_stats.html
index fdb5ac7..1769912 100644
--- a/third_party/vulkan_memory_allocator/docs/html/struct_vma_pool_stats.html
+++ b/third_party/vulkan_memory_allocator/docs/html/struct_vma_pool_stats.html
@@ -3,7 +3,7 @@
 <head>
 <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
 <meta http-equiv="X-UA-Compatible" content="IE=9"/>
-<meta name="generator" content="Doxygen 1.8.18"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
 <meta name="viewport" content="width=device-width, initial-scale=1"/>
 <title>Vulkan Memory Allocator: VmaPoolStats Struct Reference</title>
 <link href="tabs.css" rel="stylesheet" type="text/css"/>
@@ -29,10 +29,10 @@
 </table>
 </div>
 <!-- end header part -->
-<!-- Generated by Doxygen 1.8.18 -->
+<!-- Generated by Doxygen 1.9.1 -->
 <script type="text/javascript">
 /* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
-var searchBox = new SearchBox("searchBox", "search",false,'Search');
+var searchBox = new SearchBox("searchBox", "search",false,'Search','.html');
 /* @license-end */
 </script>
 <script type="text/javascript" src="menudata.js"></script>
@@ -196,14 +196,12 @@
 </div>
 </div>
 <hr/>The documentation for this struct was generated from the following file:<ul>
-<li><a class="el" href="vk__mem__alloc_8h_source.html">vk_mem_alloc.h</a></li>
+<li>include/<a class="el" href="vk__mem__alloc_8h_source.html">vk_mem_alloc.h</a></li>
 </ul>
 </div><!-- contents -->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated by &#160;<a href="http://www.doxygen.org/index.html">
-<img class="footer" src="doxygen.png" alt="doxygen"/>
-</a> 1.8.18
+Generated by&#160;<a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.1
 </small></address>
 </body>
 </html>
diff --git a/third_party/vulkan_memory_allocator/docs/html/struct_vma_record_settings-members.html b/third_party/vulkan_memory_allocator/docs/html/struct_vma_record_settings-members.html
index 0366ab7..c7eef40 100644
--- a/third_party/vulkan_memory_allocator/docs/html/struct_vma_record_settings-members.html
+++ b/third_party/vulkan_memory_allocator/docs/html/struct_vma_record_settings-members.html
@@ -3,7 +3,7 @@
 <head>
 <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
 <meta http-equiv="X-UA-Compatible" content="IE=9"/>
-<meta name="generator" content="Doxygen 1.8.18"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
 <meta name="viewport" content="width=device-width, initial-scale=1"/>
 <title>Vulkan Memory Allocator: Member List</title>
 <link href="tabs.css" rel="stylesheet" type="text/css"/>
@@ -29,10 +29,10 @@
 </table>
 </div>
 <!-- end header part -->
-<!-- Generated by Doxygen 1.8.18 -->
+<!-- Generated by Doxygen 1.9.1 -->
 <script type="text/javascript">
 /* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
-var searchBox = new SearchBox("searchBox", "search",false,'Search');
+var searchBox = new SearchBox("searchBox", "search",false,'Search','.html');
 /* @license-end */
 </script>
 <script type="text/javascript" src="menudata.js"></script>
@@ -73,9 +73,7 @@
 </table></div><!-- contents -->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated by &#160;<a href="http://www.doxygen.org/index.html">
-<img class="footer" src="doxygen.png" alt="doxygen"/>
-</a> 1.8.18
+Generated by&#160;<a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.1
 </small></address>
 </body>
 </html>
diff --git a/third_party/vulkan_memory_allocator/docs/html/struct_vma_record_settings.html b/third_party/vulkan_memory_allocator/docs/html/struct_vma_record_settings.html
index 2d5b3a6..9ba37eb 100644
--- a/third_party/vulkan_memory_allocator/docs/html/struct_vma_record_settings.html
+++ b/third_party/vulkan_memory_allocator/docs/html/struct_vma_record_settings.html
@@ -3,7 +3,7 @@
 <head>
 <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
 <meta http-equiv="X-UA-Compatible" content="IE=9"/>
-<meta name="generator" content="Doxygen 1.8.18"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
 <meta name="viewport" content="width=device-width, initial-scale=1"/>
 <title>Vulkan Memory Allocator: VmaRecordSettings Struct Reference</title>
 <link href="tabs.css" rel="stylesheet" type="text/css"/>
@@ -29,10 +29,10 @@
 </table>
 </div>
 <!-- end header part -->
-<!-- Generated by Doxygen 1.8.18 -->
+<!-- Generated by Doxygen 1.9.1 -->
 <script type="text/javascript">
 /* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
-var searchBox = new SearchBox("searchBox", "search",false,'Search');
+var searchBox = new SearchBox("searchBox", "search",false,'Search','.html');
 /* @license-end */
 </script>
 <script type="text/javascript" src="menudata.js"></script>
@@ -120,14 +120,12 @@
 </div>
 </div>
 <hr/>The documentation for this struct was generated from the following file:<ul>
-<li><a class="el" href="vk__mem__alloc_8h_source.html">vk_mem_alloc.h</a></li>
+<li>include/<a class="el" href="vk__mem__alloc_8h_source.html">vk_mem_alloc.h</a></li>
 </ul>
 </div><!-- contents -->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated by &#160;<a href="http://www.doxygen.org/index.html">
-<img class="footer" src="doxygen.png" alt="doxygen"/>
-</a> 1.8.18
+Generated by&#160;<a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.1
 </small></address>
 </body>
 </html>
diff --git a/third_party/vulkan_memory_allocator/docs/html/struct_vma_stat_info-members.html b/third_party/vulkan_memory_allocator/docs/html/struct_vma_stat_info-members.html
index 48aa658..332e116 100644
--- a/third_party/vulkan_memory_allocator/docs/html/struct_vma_stat_info-members.html
+++ b/third_party/vulkan_memory_allocator/docs/html/struct_vma_stat_info-members.html
@@ -3,7 +3,7 @@
 <head>
 <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
 <meta http-equiv="X-UA-Compatible" content="IE=9"/>
-<meta name="generator" content="Doxygen 1.8.18"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
 <meta name="viewport" content="width=device-width, initial-scale=1"/>
 <title>Vulkan Memory Allocator: Member List</title>
 <link href="tabs.css" rel="stylesheet" type="text/css"/>
@@ -29,10 +29,10 @@
 </table>
 </div>
 <!-- end header part -->
-<!-- Generated by Doxygen 1.8.18 -->
+<!-- Generated by Doxygen 1.9.1 -->
 <script type="text/javascript">
 /* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
-var searchBox = new SearchBox("searchBox", "search",false,'Search');
+var searchBox = new SearchBox("searchBox", "search",false,'Search','.html');
 /* @license-end */
 </script>
 <script type="text/javascript" src="menudata.js"></script>
@@ -82,9 +82,7 @@
 </table></div><!-- contents -->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated by &#160;<a href="http://www.doxygen.org/index.html">
-<img class="footer" src="doxygen.png" alt="doxygen"/>
-</a> 1.8.18
+Generated by&#160;<a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.1
 </small></address>
 </body>
 </html>
diff --git a/third_party/vulkan_memory_allocator/docs/html/struct_vma_stat_info.html b/third_party/vulkan_memory_allocator/docs/html/struct_vma_stat_info.html
index 30a2882..61d63d9 100644
--- a/third_party/vulkan_memory_allocator/docs/html/struct_vma_stat_info.html
+++ b/third_party/vulkan_memory_allocator/docs/html/struct_vma_stat_info.html
@@ -3,7 +3,7 @@
 <head>
 <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
 <meta http-equiv="X-UA-Compatible" content="IE=9"/>
-<meta name="generator" content="Doxygen 1.8.18"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
 <meta name="viewport" content="width=device-width, initial-scale=1"/>
 <title>Vulkan Memory Allocator: VmaStatInfo Struct Reference</title>
 <link href="tabs.css" rel="stylesheet" type="text/css"/>
@@ -29,10 +29,10 @@
 </table>
 </div>
 <!-- end header part -->
-<!-- Generated by Doxygen 1.8.18 -->
+<!-- Generated by Doxygen 1.9.1 -->
 <script type="text/javascript">
 /* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
-var searchBox = new SearchBox("searchBox", "search",false,'Search');
+var searchBox = new SearchBox("searchBox", "search",false,'Search','.html');
 /* @license-end */
 </script>
 <script type="text/javascript" src="menudata.js"></script>
@@ -272,14 +272,12 @@
 </div>
 </div>
 <hr/>The documentation for this struct was generated from the following file:<ul>
-<li><a class="el" href="vk__mem__alloc_8h_source.html">vk_mem_alloc.h</a></li>
+<li>include/<a class="el" href="vk__mem__alloc_8h_source.html">vk_mem_alloc.h</a></li>
 </ul>
 </div><!-- contents -->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated by &#160;<a href="http://www.doxygen.org/index.html">
-<img class="footer" src="doxygen.png" alt="doxygen"/>
-</a> 1.8.18
+Generated by&#160;<a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.1
 </small></address>
 </body>
 </html>
diff --git a/third_party/vulkan_memory_allocator/docs/html/struct_vma_stats-members.html b/third_party/vulkan_memory_allocator/docs/html/struct_vma_stats-members.html
index 6d042f1..14ae84a 100644
--- a/third_party/vulkan_memory_allocator/docs/html/struct_vma_stats-members.html
+++ b/third_party/vulkan_memory_allocator/docs/html/struct_vma_stats-members.html
@@ -3,7 +3,7 @@
 <head>
 <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
 <meta http-equiv="X-UA-Compatible" content="IE=9"/>
-<meta name="generator" content="Doxygen 1.8.18"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
 <meta name="viewport" content="width=device-width, initial-scale=1"/>
 <title>Vulkan Memory Allocator: Member List</title>
 <link href="tabs.css" rel="stylesheet" type="text/css"/>
@@ -29,10 +29,10 @@
 </table>
 </div>
 <!-- end header part -->
-<!-- Generated by Doxygen 1.8.18 -->
+<!-- Generated by Doxygen 1.9.1 -->
 <script type="text/javascript">
 /* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
-var searchBox = new SearchBox("searchBox", "search",false,'Search');
+var searchBox = new SearchBox("searchBox", "search",false,'Search','.html');
 /* @license-end */
 </script>
 <script type="text/javascript" src="menudata.js"></script>
@@ -74,9 +74,7 @@
 </table></div><!-- contents -->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated by &#160;<a href="http://www.doxygen.org/index.html">
-<img class="footer" src="doxygen.png" alt="doxygen"/>
-</a> 1.8.18
+Generated by&#160;<a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.1
 </small></address>
 </body>
 </html>
diff --git a/third_party/vulkan_memory_allocator/docs/html/struct_vma_stats.html b/third_party/vulkan_memory_allocator/docs/html/struct_vma_stats.html
index 34e2489..6df74e3 100644
--- a/third_party/vulkan_memory_allocator/docs/html/struct_vma_stats.html
+++ b/third_party/vulkan_memory_allocator/docs/html/struct_vma_stats.html
@@ -3,7 +3,7 @@
 <head>
 <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
 <meta http-equiv="X-UA-Compatible" content="IE=9"/>
-<meta name="generator" content="Doxygen 1.8.18"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
 <meta name="viewport" content="width=device-width, initial-scale=1"/>
 <title>Vulkan Memory Allocator: VmaStats Struct Reference</title>
 <link href="tabs.css" rel="stylesheet" type="text/css"/>
@@ -29,10 +29,10 @@
 </table>
 </div>
 <!-- end header part -->
-<!-- Generated by Doxygen 1.8.18 -->
+<!-- Generated by Doxygen 1.9.1 -->
 <script type="text/javascript">
 /* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
-var searchBox = new SearchBox("searchBox", "search",false,'Search');
+var searchBox = new SearchBox("searchBox", "search",false,'Search','.html');
 /* @license-end */
 </script>
 <script type="text/javascript" src="menudata.js"></script>
@@ -129,14 +129,12 @@
 </div>
 </div>
 <hr/>The documentation for this struct was generated from the following file:<ul>
-<li><a class="el" href="vk__mem__alloc_8h_source.html">vk_mem_alloc.h</a></li>
+<li>include/<a class="el" href="vk__mem__alloc_8h_source.html">vk_mem_alloc.h</a></li>
 </ul>
 </div><!-- contents -->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated by &#160;<a href="http://www.doxygen.org/index.html">
-<img class="footer" src="doxygen.png" alt="doxygen"/>
-</a> 1.8.18
+Generated by&#160;<a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.1
 </small></address>
 </body>
 </html>
diff --git a/third_party/vulkan_memory_allocator/docs/html/struct_vma_vulkan_functions-members.html b/third_party/vulkan_memory_allocator/docs/html/struct_vma_vulkan_functions-members.html
index de7979f..877721c 100644
--- a/third_party/vulkan_memory_allocator/docs/html/struct_vma_vulkan_functions-members.html
+++ b/third_party/vulkan_memory_allocator/docs/html/struct_vma_vulkan_functions-members.html
@@ -3,7 +3,7 @@
 <head>
 <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
 <meta http-equiv="X-UA-Compatible" content="IE=9"/>
-<meta name="generator" content="Doxygen 1.8.18"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
 <meta name="viewport" content="width=device-width, initial-scale=1"/>
 <title>Vulkan Memory Allocator: Member List</title>
 <link href="tabs.css" rel="stylesheet" type="text/css"/>
@@ -29,10 +29,10 @@
 </table>
 </div>
 <!-- end header part -->
-<!-- Generated by Doxygen 1.8.18 -->
+<!-- Generated by Doxygen 1.9.1 -->
 <script type="text/javascript">
 /* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
-var searchBox = new SearchBox("searchBox", "search",false,'Search');
+var searchBox = new SearchBox("searchBox", "search",false,'Search','.html');
 /* @license-end */
 </script>
 <script type="text/javascript" src="menudata.js"></script>
@@ -88,9 +88,7 @@
 </table></div><!-- contents -->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated by &#160;<a href="http://www.doxygen.org/index.html">
-<img class="footer" src="doxygen.png" alt="doxygen"/>
-</a> 1.8.18
+Generated by&#160;<a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.1
 </small></address>
 </body>
 </html>
diff --git a/third_party/vulkan_memory_allocator/docs/html/struct_vma_vulkan_functions.html b/third_party/vulkan_memory_allocator/docs/html/struct_vma_vulkan_functions.html
index 51e10c3..342de5a 100644
--- a/third_party/vulkan_memory_allocator/docs/html/struct_vma_vulkan_functions.html
+++ b/third_party/vulkan_memory_allocator/docs/html/struct_vma_vulkan_functions.html
@@ -3,7 +3,7 @@
 <head>
 <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
 <meta http-equiv="X-UA-Compatible" content="IE=9"/>
-<meta name="generator" content="Doxygen 1.8.18"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
 <meta name="viewport" content="width=device-width, initial-scale=1"/>
 <title>Vulkan Memory Allocator: VmaVulkanFunctions Struct Reference</title>
 <link href="tabs.css" rel="stylesheet" type="text/css"/>
@@ -29,10 +29,10 @@
 </table>
 </div>
 <!-- end header part -->
-<!-- Generated by Doxygen 1.8.18 -->
+<!-- Generated by Doxygen 1.9.1 -->
 <script type="text/javascript">
 /* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
-var searchBox = new SearchBox("searchBox", "search",false,'Search');
+var searchBox = new SearchBox("searchBox", "search",false,'Search','.html');
 /* @license-end */
 </script>
 <script type="text/javascript" src="menudata.js"></script>
@@ -354,14 +354,12 @@
 </div>
 </div>
 <hr/>The documentation for this struct was generated from the following file:<ul>
-<li><a class="el" href="vk__mem__alloc_8h_source.html">vk_mem_alloc.h</a></li>
+<li>include/<a class="el" href="vk__mem__alloc_8h_source.html">vk_mem_alloc.h</a></li>
 </ul>
 </div><!-- contents -->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated by &#160;<a href="http://www.doxygen.org/index.html">
-<img class="footer" src="doxygen.png" alt="doxygen"/>
-</a> 1.8.18
+Generated by&#160;<a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.1
 </small></address>
 </body>
 </html>
diff --git a/third_party/vulkan_memory_allocator/docs/html/usage_patterns.html b/third_party/vulkan_memory_allocator/docs/html/usage_patterns.html
index 2b08d92..d57a74c 100644
--- a/third_party/vulkan_memory_allocator/docs/html/usage_patterns.html
+++ b/third_party/vulkan_memory_allocator/docs/html/usage_patterns.html
@@ -3,7 +3,7 @@
 <head>
 <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
 <meta http-equiv="X-UA-Compatible" content="IE=9"/>
-<meta name="generator" content="Doxygen 1.8.18"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
 <meta name="viewport" content="width=device-width, initial-scale=1"/>
 <title>Vulkan Memory Allocator: Recommended usage patterns</title>
 <link href="tabs.css" rel="stylesheet" type="text/css"/>
@@ -29,10 +29,10 @@
 </table>
 </div>
 <!-- end header part -->
-<!-- Generated by Doxygen 1.8.18 -->
+<!-- Generated by Doxygen 1.9.1 -->
 <script type="text/javascript">
 /* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
-var searchBox = new SearchBox("searchBox", "search",false,'Search');
+var searchBox = new SearchBox("searchBox", "search",false,'Search','.html');
 /* @license-end */
 </script>
 <script type="text/javascript" src="menudata.js"></script>
@@ -114,7 +114,7 @@
 </ol>
 <p>Which solution is the most efficient depends on your resource and especially on the GPU. It is best to measure it and then make the decision. Some general recommendations:</p>
 <ul>
-<li>On integrated graphics use (2) or (3) to avoid unnecesary time and memory overhead related to using a second copy and making transfer.</li>
+<li>On integrated graphics use (2) or (3) to avoid unnecessary time and memory overhead related to using a second copy and making transfer.</li>
 <li>For small resources (e.g. constant buffers) use (2). Discrete AMD cards have special 256 MiB pool of video memory that is directly mappable. Even if the resource ends up in system memory, its data may be cached on GPU after first fetch over PCIe bus.</li>
 <li>For larger resources (e.g. textures), decide between (1) and (2). You may want to differentiate NVIDIA and AMD, e.g. by looking for memory type that is both <code>DEVICE_LOCAL</code> and <code>HOST_VISIBLE</code>. When you find it, use (2), otherwise use (1).</li>
 </ul>
@@ -130,9 +130,7 @@
 </div><!-- PageDoc -->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated by &#160;<a href="http://www.doxygen.org/index.html">
-<img class="footer" src="doxygen.png" alt="doxygen"/>
-</a> 1.8.18
+Generated by&#160;<a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.1
 </small></address>
 </body>
 </html>
diff --git a/third_party/vulkan_memory_allocator/docs/html/vk__mem__alloc_8h.html b/third_party/vulkan_memory_allocator/docs/html/vk__mem__alloc_8h.html
index f0a0d00..f568ef9 100644
--- a/third_party/vulkan_memory_allocator/docs/html/vk__mem__alloc_8h.html
+++ b/third_party/vulkan_memory_allocator/docs/html/vk__mem__alloc_8h.html
@@ -3,9 +3,9 @@
 <head>
 <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
 <meta http-equiv="X-UA-Compatible" content="IE=9"/>
-<meta name="generator" content="Doxygen 1.8.18"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
 <meta name="viewport" content="width=device-width, initial-scale=1"/>
-<title>Vulkan Memory Allocator: vk_mem_alloc.h File Reference</title>
+<title>Vulkan Memory Allocator: include/vk_mem_alloc.h File Reference</title>
 <link href="tabs.css" rel="stylesheet" type="text/css"/>
 <script type="text/javascript" src="jquery.js"></script>
 <script type="text/javascript" src="dynsections.js"></script>
@@ -29,10 +29,10 @@
 </table>
 </div>
 <!-- end header part -->
-<!-- Generated by Doxygen 1.8.18 -->
+<!-- Generated by Doxygen 1.9.1 -->
 <script type="text/javascript">
 /* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
-var searchBox = new SearchBox("searchBox", "search",false,'Search');
+var searchBox = new SearchBox("searchBox", "search",false,'Search','.html');
 /* @license-end */
 </script>
 <script type="text/javascript" src="menudata.js"></script>
@@ -59,6 +59,10 @@
 </iframe>
 </div>
 
+<div id="nav-path" class="navpath">
+  <ul>
+<li class="navelem"><a class="el" href="dir_d44c64559bbebec7f509842c48db8b23.html">include</a></li>  </ul>
+</div>
 </div><!-- top -->
 <div class="header">
   <div class="summary">
@@ -131,8 +135,6 @@
 Macros</h2></td></tr>
 <tr class="memitem:a1f0c126759fc96ccb6e2d23c101d770c"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="vk__mem__alloc_8h.html#a1f0c126759fc96ccb6e2d23c101d770c">VMA_RECORDING_ENABLED</a>&#160;&#160;&#160;0</td></tr>
 <tr class="separator:a1f0c126759fc96ccb6e2d23c101d770c"><td class="memSeparator" colspan="2">&#160;</td></tr>
-<tr class="memitem:a9f918755b601cf4bffca775992e6fb90"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="vk__mem__alloc_8h.html#a9f918755b601cf4bffca775992e6fb90">NOMINMAX</a></td></tr>
-<tr class="separator:a9f918755b601cf4bffca775992e6fb90"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:a1a2407c283893638cc039bb31fcd74b6"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="vk__mem__alloc_8h.html#a1a2407c283893638cc039bb31fcd74b6">VMA_VULKAN_VERSION</a>&#160;&#160;&#160;1000000</td></tr>
 <tr class="separator:a1a2407c283893638cc039bb31fcd74b6"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:af7b860e63b96d11e44ae8587ba06bbf4"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="vk__mem__alloc_8h.html#af7b860e63b96d11e44ae8587ba06bbf4">VMA_DEDICATED_ALLOCATION</a>&#160;&#160;&#160;0</td></tr>
@@ -143,6 +145,8 @@
 <tr class="separator:a05decf1cf4ebf767beba7acca6c1ec3a"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:a7f9d5e71b70dd1a137c303a8a8262c10"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="vk__mem__alloc_8h.html#a7f9d5e71b70dd1a137c303a8a8262c10">VMA_BUFFER_DEVICE_ADDRESS</a>&#160;&#160;&#160;0</td></tr>
 <tr class="separator:a7f9d5e71b70dd1a137c303a8a8262c10"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a81af8a3a87e34bbb493848143cde43e4"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="vk__mem__alloc_8h.html#a81af8a3a87e34bbb493848143cde43e4">VMA_MEMORY_PRIORITY</a>&#160;&#160;&#160;0</td></tr>
+<tr class="separator:a81af8a3a87e34bbb493848143cde43e4"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:ae25f0d55fd91cb166f002b63244800e1"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="vk__mem__alloc_8h.html#ae25f0d55fd91cb166f002b63244800e1">VMA_STATS_STRING_ENABLED</a>&#160;&#160;&#160;1</td></tr>
 <tr class="separator:ae25f0d55fd91cb166f002b63244800e1"><td class="memSeparator" colspan="2">&#160;</td></tr>
 </table><table class="memberdecls">
@@ -234,75 +238,76 @@
 <tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="enum-members"></a>
 Enumerations</h2></td></tr>
 <tr class="memitem:a4f87c9100d154a65a4ad495f7763cf7c"><td class="memItemLeft" align="right" valign="top">enum &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="vk__mem__alloc_8h.html#a4f87c9100d154a65a4ad495f7763cf7c">VmaAllocatorCreateFlagBits</a> { <br />
-&#160;&#160;<a class="el" href="vk__mem__alloc_8h.html#a4f87c9100d154a65a4ad495f7763cf7ca4816ddaed324ba110172ca608a20f29d">VMA_ALLOCATOR_CREATE_EXTERNALLY_SYNCHRONIZED_BIT</a> = 0x00000001, 
-<a class="el" href="vk__mem__alloc_8h.html#a4f87c9100d154a65a4ad495f7763cf7cace7da7cc6e71a625dfa763c55a597878">VMA_ALLOCATOR_CREATE_KHR_DEDICATED_ALLOCATION_BIT</a> = 0x00000002, 
-<a class="el" href="vk__mem__alloc_8h.html#a4f87c9100d154a65a4ad495f7763cf7ca8fb75bf07cd184ab903596295e863dee">VMA_ALLOCATOR_CREATE_KHR_BIND_MEMORY2_BIT</a> = 0x00000004, 
-<a class="el" href="vk__mem__alloc_8h.html#a4f87c9100d154a65a4ad495f7763cf7ca4d4687863f7bd4b418c6006dc04400b0">VMA_ALLOCATOR_CREATE_EXT_MEMORY_BUDGET_BIT</a> = 0x00000008, 
-<br />
-&#160;&#160;<a class="el" href="vk__mem__alloc_8h.html#a4f87c9100d154a65a4ad495f7763cf7ca2acce4886d8078552efa38878413970f">VMA_ALLOCATOR_CREATE_AMD_DEVICE_COHERENT_MEMORY_BIT</a> = 0x00000010, 
-<a class="el" href="vk__mem__alloc_8h.html#a4f87c9100d154a65a4ad495f7763cf7ca5f1b28b0414319d1687e1f2b30ab0089">VMA_ALLOCATOR_CREATE_BUFFER_DEVICE_ADDRESS_BIT</a> = 0x00000020, 
-<a class="el" href="vk__mem__alloc_8h.html#a4f87c9100d154a65a4ad495f7763cf7cae4d5ad929caba5f23eb502b13bd5286c">VMA_ALLOCATOR_CREATE_FLAG_BITS_MAX_ENUM</a> = 0x7FFFFFFF
+&#160;&#160;<a class="el" href="vk__mem__alloc_8h.html#a4f87c9100d154a65a4ad495f7763cf7ca4816ddaed324ba110172ca608a20f29d">VMA_ALLOCATOR_CREATE_EXTERNALLY_SYNCHRONIZED_BIT</a> = 0x00000001
+, <a class="el" href="vk__mem__alloc_8h.html#a4f87c9100d154a65a4ad495f7763cf7cace7da7cc6e71a625dfa763c55a597878">VMA_ALLOCATOR_CREATE_KHR_DEDICATED_ALLOCATION_BIT</a> = 0x00000002
+, <a class="el" href="vk__mem__alloc_8h.html#a4f87c9100d154a65a4ad495f7763cf7ca8fb75bf07cd184ab903596295e863dee">VMA_ALLOCATOR_CREATE_KHR_BIND_MEMORY2_BIT</a> = 0x00000004
+, <a class="el" href="vk__mem__alloc_8h.html#a4f87c9100d154a65a4ad495f7763cf7ca4d4687863f7bd4b418c6006dc04400b0">VMA_ALLOCATOR_CREATE_EXT_MEMORY_BUDGET_BIT</a> = 0x00000008
+, <br />
+&#160;&#160;<a class="el" href="vk__mem__alloc_8h.html#a4f87c9100d154a65a4ad495f7763cf7ca2acce4886d8078552efa38878413970f">VMA_ALLOCATOR_CREATE_AMD_DEVICE_COHERENT_MEMORY_BIT</a> = 0x00000010
+, <a class="el" href="vk__mem__alloc_8h.html#a4f87c9100d154a65a4ad495f7763cf7ca5f1b28b0414319d1687e1f2b30ab0089">VMA_ALLOCATOR_CREATE_BUFFER_DEVICE_ADDRESS_BIT</a> = 0x00000020
+, <a class="el" href="vk__mem__alloc_8h.html#a4f87c9100d154a65a4ad495f7763cf7caffdd7a5169be3dbd7cbf6b3619e4f78a">VMA_ALLOCATOR_CREATE_EXT_MEMORY_PRIORITY_BIT</a> = 0x00000040
+, <a class="el" href="vk__mem__alloc_8h.html#a4f87c9100d154a65a4ad495f7763cf7cae4d5ad929caba5f23eb502b13bd5286c">VMA_ALLOCATOR_CREATE_FLAG_BITS_MAX_ENUM</a> = 0x7FFFFFFF
 <br />
  }</td></tr>
 <tr class="memdesc:a4f87c9100d154a65a4ad495f7763cf7c"><td class="mdescLeft">&#160;</td><td class="mdescRight">Flags for created <a class="el" href="struct_vma_allocator.html" title="Represents main object of this library initialized.">VmaAllocator</a>.  <a href="vk__mem__alloc_8h.html#a4f87c9100d154a65a4ad495f7763cf7c">More...</a><br /></td></tr>
 <tr class="separator:a4f87c9100d154a65a4ad495f7763cf7c"><td class="memSeparator" colspan="2">&#160;</td></tr>
-<tr class="memitem:a4dd2c44642312a147a4e93373a6e64d2"><td class="memItemLeft" align="right" valign="top">enum &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="vk__mem__alloc_8h.html#a4dd2c44642312a147a4e93373a6e64d2">VmaRecordFlagBits</a> { <a class="el" href="vk__mem__alloc_8h.html#a4dd2c44642312a147a4e93373a6e64d2a8e7ab322e8732654be627c4ea8f36cc7">VMA_RECORD_FLUSH_AFTER_CALL_BIT</a> = 0x00000001, 
-<a class="el" href="vk__mem__alloc_8h.html#a4dd2c44642312a147a4e93373a6e64d2a20dd17d69966dbffa054739d6090b85e">VMA_RECORD_FLAG_BITS_MAX_ENUM</a> = 0x7FFFFFFF
+<tr class="memitem:a4dd2c44642312a147a4e93373a6e64d2"><td class="memItemLeft" align="right" valign="top">enum &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="vk__mem__alloc_8h.html#a4dd2c44642312a147a4e93373a6e64d2">VmaRecordFlagBits</a> { <a class="el" href="vk__mem__alloc_8h.html#a4dd2c44642312a147a4e93373a6e64d2a8e7ab322e8732654be627c4ea8f36cc7">VMA_RECORD_FLUSH_AFTER_CALL_BIT</a> = 0x00000001
+, <a class="el" href="vk__mem__alloc_8h.html#a4dd2c44642312a147a4e93373a6e64d2a20dd17d69966dbffa054739d6090b85e">VMA_RECORD_FLAG_BITS_MAX_ENUM</a> = 0x7FFFFFFF
  }</td></tr>
 <tr class="memdesc:a4dd2c44642312a147a4e93373a6e64d2"><td class="mdescLeft">&#160;</td><td class="mdescRight">Flags to be used in <a class="el" href="struct_vma_record_settings.html#ad8fdcc92119ae7a8c08c1a564c01d63a" title="Flags for recording. Use VmaRecordFlagBits enum.">VmaRecordSettings::flags</a>.  <a href="vk__mem__alloc_8h.html#a4dd2c44642312a147a4e93373a6e64d2">More...</a><br /></td></tr>
 <tr class="separator:a4dd2c44642312a147a4e93373a6e64d2"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:aa5846affa1e9da3800e3e78fae2305cc"><td class="memItemLeft" align="right" valign="top">enum &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305cc">VmaMemoryUsage</a> { <br />
-&#160;&#160;<a class="el" href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305ccaf50d27e34e0925cf3a63db8c839121dd">VMA_MEMORY_USAGE_UNKNOWN</a> = 0, 
-<a class="el" href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305ccac6b5dc1432d88647aa4cd456246eadf7">VMA_MEMORY_USAGE_GPU_ONLY</a> = 1, 
-<a class="el" href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305cca40bdf4cddeffeb12f43d45ca1286e0a5">VMA_MEMORY_USAGE_CPU_ONLY</a> = 2, 
-<a class="el" href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305cca9066b52c5a7079bb74a69aaf8b92ff67">VMA_MEMORY_USAGE_CPU_TO_GPU</a> = 3, 
-<br />
-&#160;&#160;<a class="el" href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305cca7b586d2fdaf82a463b58f581ed72be27">VMA_MEMORY_USAGE_GPU_TO_CPU</a> = 4, 
-<a class="el" href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305cca416a444d4d0fc20067c3f76f32ff2500">VMA_MEMORY_USAGE_CPU_COPY</a> = 5, 
-<a class="el" href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305cca835333d9072db63a653818030e17614d">VMA_MEMORY_USAGE_GPU_LAZILY_ALLOCATED</a> = 6, 
-<a class="el" href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305cca091e69437ef693e8d0d287f1c719ba6e">VMA_MEMORY_USAGE_MAX_ENUM</a> = 0x7FFFFFFF
+&#160;&#160;<a class="el" href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305ccaf50d27e34e0925cf3a63db8c839121dd">VMA_MEMORY_USAGE_UNKNOWN</a> = 0
+, <a class="el" href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305ccac6b5dc1432d88647aa4cd456246eadf7">VMA_MEMORY_USAGE_GPU_ONLY</a> = 1
+, <a class="el" href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305cca40bdf4cddeffeb12f43d45ca1286e0a5">VMA_MEMORY_USAGE_CPU_ONLY</a> = 2
+, <a class="el" href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305cca9066b52c5a7079bb74a69aaf8b92ff67">VMA_MEMORY_USAGE_CPU_TO_GPU</a> = 3
+, <br />
+&#160;&#160;<a class="el" href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305cca7b586d2fdaf82a463b58f581ed72be27">VMA_MEMORY_USAGE_GPU_TO_CPU</a> = 4
+, <a class="el" href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305cca416a444d4d0fc20067c3f76f32ff2500">VMA_MEMORY_USAGE_CPU_COPY</a> = 5
+, <a class="el" href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305cca835333d9072db63a653818030e17614d">VMA_MEMORY_USAGE_GPU_LAZILY_ALLOCATED</a> = 6
+, <a class="el" href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305cca091e69437ef693e8d0d287f1c719ba6e">VMA_MEMORY_USAGE_MAX_ENUM</a> = 0x7FFFFFFF
 <br />
  }</td></tr>
 <tr class="separator:aa5846affa1e9da3800e3e78fae2305cc"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:ad9889c10c798b040d59c92f257cae597"><td class="memItemLeft" align="right" valign="top">enum &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597">VmaAllocationCreateFlagBits</a> { <br />
-&#160;&#160;<a class="el" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a3fc311d855c2ff53f1090ef5c722b38f">VMA_ALLOCATION_CREATE_DEDICATED_MEMORY_BIT</a> = 0x00000001, 
-<a class="el" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a89759603401014eb325eb22a3839f2ff">VMA_ALLOCATION_CREATE_NEVER_ALLOCATE_BIT</a> = 0x00000002, 
-<a class="el" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a11da372cc3a82931c5e5d6146cd9dd1f">VMA_ALLOCATION_CREATE_MAPPED_BIT</a> = 0x00000004, 
-<a class="el" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a5f436af6c8fe8540573a6d22627a6fd2">VMA_ALLOCATION_CREATE_CAN_BECOME_LOST_BIT</a> = 0x00000008, 
-<br />
-&#160;&#160;<a class="el" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a68686d0ce9beb0d4d1b9f2b8b1389a7e">VMA_ALLOCATION_CREATE_CAN_MAKE_OTHER_LOST_BIT</a> = 0x00000010, 
-<a class="el" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597aa6f24f821cd6a7c5e4a443f7bf59c520">VMA_ALLOCATION_CREATE_USER_DATA_COPY_STRING_BIT</a> = 0x00000020, 
-<a class="el" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a42ba3a2d2c7117953210b7c3ef8da0df">VMA_ALLOCATION_CREATE_UPPER_ADDRESS_BIT</a> = 0x00000040, 
-<a class="el" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a2310568c62208af432724305fe29ccea">VMA_ALLOCATION_CREATE_DONT_BIND_BIT</a> = 0x00000080, 
-<br />
-&#160;&#160;<a class="el" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597ab8b1764f3e9022368e440c057783b92d">VMA_ALLOCATION_CREATE_WITHIN_BUDGET_BIT</a> = 0x00000100, 
-<a class="el" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a839826775c62319466441f86496f036d">VMA_ALLOCATION_CREATE_STRATEGY_BEST_FIT_BIT</a> = 0x00010000, 
-<a class="el" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597ad242a04f802e25fef0b880afe8bb0a62">VMA_ALLOCATION_CREATE_STRATEGY_WORST_FIT_BIT</a> = 0x00020000, 
-<a class="el" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a33eb2052674f3ad92386c714a65fb777">VMA_ALLOCATION_CREATE_STRATEGY_FIRST_FIT_BIT</a> = 0x00040000, 
-<br />
-&#160;&#160;<a class="el" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a8af1210cf591784afa026d94998f735d">VMA_ALLOCATION_CREATE_STRATEGY_MIN_MEMORY_BIT</a> = VMA_ALLOCATION_CREATE_STRATEGY_BEST_FIT_BIT, 
-<a class="el" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a0729e932b7ea170e3a128cad96c5cf6d">VMA_ALLOCATION_CREATE_STRATEGY_MIN_TIME_BIT</a> = VMA_ALLOCATION_CREATE_STRATEGY_FIRST_FIT_BIT, 
-<a class="el" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a621b704103eb3360230c860acf36e706">VMA_ALLOCATION_CREATE_STRATEGY_MIN_FRAGMENTATION_BIT</a> = VMA_ALLOCATION_CREATE_STRATEGY_WORST_FIT_BIT, 
-<a class="el" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a8e16845d81ae3d27c47106d4770d5c7e">VMA_ALLOCATION_CREATE_STRATEGY_MASK</a>, 
-<br />
+&#160;&#160;<a class="el" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a3fc311d855c2ff53f1090ef5c722b38f">VMA_ALLOCATION_CREATE_DEDICATED_MEMORY_BIT</a> = 0x00000001
+, <a class="el" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a89759603401014eb325eb22a3839f2ff">VMA_ALLOCATION_CREATE_NEVER_ALLOCATE_BIT</a> = 0x00000002
+, <a class="el" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a11da372cc3a82931c5e5d6146cd9dd1f">VMA_ALLOCATION_CREATE_MAPPED_BIT</a> = 0x00000004
+, <a class="el" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a5f436af6c8fe8540573a6d22627a6fd2">VMA_ALLOCATION_CREATE_CAN_BECOME_LOST_BIT</a> = 0x00000008
+, <br />
+&#160;&#160;<a class="el" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a68686d0ce9beb0d4d1b9f2b8b1389a7e">VMA_ALLOCATION_CREATE_CAN_MAKE_OTHER_LOST_BIT</a> = 0x00000010
+, <a class="el" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597aa6f24f821cd6a7c5e4a443f7bf59c520">VMA_ALLOCATION_CREATE_USER_DATA_COPY_STRING_BIT</a> = 0x00000020
+, <a class="el" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a42ba3a2d2c7117953210b7c3ef8da0df">VMA_ALLOCATION_CREATE_UPPER_ADDRESS_BIT</a> = 0x00000040
+, <a class="el" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a2310568c62208af432724305fe29ccea">VMA_ALLOCATION_CREATE_DONT_BIND_BIT</a> = 0x00000080
+, <br />
+&#160;&#160;<a class="el" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597ab8b1764f3e9022368e440c057783b92d">VMA_ALLOCATION_CREATE_WITHIN_BUDGET_BIT</a> = 0x00000100
+, <a class="el" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a839826775c62319466441f86496f036d">VMA_ALLOCATION_CREATE_STRATEGY_BEST_FIT_BIT</a> = 0x00010000
+, <a class="el" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597ad242a04f802e25fef0b880afe8bb0a62">VMA_ALLOCATION_CREATE_STRATEGY_WORST_FIT_BIT</a> = 0x00020000
+, <a class="el" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a33eb2052674f3ad92386c714a65fb777">VMA_ALLOCATION_CREATE_STRATEGY_FIRST_FIT_BIT</a> = 0x00040000
+, <br />
+&#160;&#160;<a class="el" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a8af1210cf591784afa026d94998f735d">VMA_ALLOCATION_CREATE_STRATEGY_MIN_MEMORY_BIT</a> = VMA_ALLOCATION_CREATE_STRATEGY_BEST_FIT_BIT
+, <a class="el" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a0729e932b7ea170e3a128cad96c5cf6d">VMA_ALLOCATION_CREATE_STRATEGY_MIN_TIME_BIT</a> = VMA_ALLOCATION_CREATE_STRATEGY_FIRST_FIT_BIT
+, <a class="el" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a621b704103eb3360230c860acf36e706">VMA_ALLOCATION_CREATE_STRATEGY_MIN_FRAGMENTATION_BIT</a> = VMA_ALLOCATION_CREATE_STRATEGY_WORST_FIT_BIT
+, <a class="el" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a8e16845d81ae3d27c47106d4770d5c7e">VMA_ALLOCATION_CREATE_STRATEGY_MASK</a>
+, <br />
 &#160;&#160;<a class="el" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597ae5633ec569f4899cf8f29e7385b2f882">VMA_ALLOCATION_CREATE_FLAG_BITS_MAX_ENUM</a> = 0x7FFFFFFF
 <br />
  }</td></tr>
 <tr class="memdesc:ad9889c10c798b040d59c92f257cae597"><td class="mdescLeft">&#160;</td><td class="mdescRight">Flags to be passed as <a class="el" href="struct_vma_allocation_create_info.html#add09658ac14fe290ace25470ddd6d41b" title="Use VmaAllocationCreateFlagBits enum.">VmaAllocationCreateInfo::flags</a>.  <a href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597">More...</a><br /></td></tr>
 <tr class="separator:ad9889c10c798b040d59c92f257cae597"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:a9a7c45f9c863695d98c83fa5ac940fe7"><td class="memItemLeft" align="right" valign="top">enum &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="vk__mem__alloc_8h.html#a9a7c45f9c863695d98c83fa5ac940fe7">VmaPoolCreateFlagBits</a> { <br />
-&#160;&#160;<a class="el" href="vk__mem__alloc_8h.html#a9a7c45f9c863695d98c83fa5ac940fe7a9f1a499508a8edb4e8ba40aa0290a3d2">VMA_POOL_CREATE_IGNORE_BUFFER_IMAGE_GRANULARITY_BIT</a> = 0x00000002, 
-<a class="el" href="vk__mem__alloc_8h.html#a9a7c45f9c863695d98c83fa5ac940fe7a13c8a444197c67866be9cb05599fc726">VMA_POOL_CREATE_LINEAR_ALGORITHM_BIT</a> = 0x00000004, 
-<a class="el" href="vk__mem__alloc_8h.html#a9a7c45f9c863695d98c83fa5ac940fe7a97a0dc38e5161b780594d998d313d35e">VMA_POOL_CREATE_BUDDY_ALGORITHM_BIT</a> = 0x00000008, 
-<a class="el" href="vk__mem__alloc_8h.html#a9a7c45f9c863695d98c83fa5ac940fe7af4d270f8f42517a0f70037ceb6ac1d9c">VMA_POOL_CREATE_ALGORITHM_MASK</a>, 
-<br />
+&#160;&#160;<a class="el" href="vk__mem__alloc_8h.html#a9a7c45f9c863695d98c83fa5ac940fe7a9f1a499508a8edb4e8ba40aa0290a3d2">VMA_POOL_CREATE_IGNORE_BUFFER_IMAGE_GRANULARITY_BIT</a> = 0x00000002
+, <a class="el" href="vk__mem__alloc_8h.html#a9a7c45f9c863695d98c83fa5ac940fe7a13c8a444197c67866be9cb05599fc726">VMA_POOL_CREATE_LINEAR_ALGORITHM_BIT</a> = 0x00000004
+, <a class="el" href="vk__mem__alloc_8h.html#a9a7c45f9c863695d98c83fa5ac940fe7a97a0dc38e5161b780594d998d313d35e">VMA_POOL_CREATE_BUDDY_ALGORITHM_BIT</a> = 0x00000008
+, <a class="el" href="vk__mem__alloc_8h.html#a9a7c45f9c863695d98c83fa5ac940fe7af4d270f8f42517a0f70037ceb6ac1d9c">VMA_POOL_CREATE_ALGORITHM_MASK</a>
+, <br />
 &#160;&#160;<a class="el" href="vk__mem__alloc_8h.html#a9a7c45f9c863695d98c83fa5ac940fe7a1c7312bea9ea246846b9054fd6bd6aec">VMA_POOL_CREATE_FLAG_BITS_MAX_ENUM</a> = 0x7FFFFFFF
 <br />
  }</td></tr>
 <tr class="memdesc:a9a7c45f9c863695d98c83fa5ac940fe7"><td class="mdescLeft">&#160;</td><td class="mdescRight">Flags to be passed as <a class="el" href="struct_vma_pool_create_info.html#a8405139f63d078340ae74513a59f5446" title="Use combination of VmaPoolCreateFlagBits.">VmaPoolCreateInfo::flags</a>.  <a href="vk__mem__alloc_8h.html#a9a7c45f9c863695d98c83fa5ac940fe7">More...</a><br /></td></tr>
 <tr class="separator:a9a7c45f9c863695d98c83fa5ac940fe7"><td class="memSeparator" colspan="2">&#160;</td></tr>
-<tr class="memitem:a6552a65b71d16f378c6994b3ceaef50c"><td class="memItemLeft" align="right" valign="top">enum &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="vk__mem__alloc_8h.html#a6552a65b71d16f378c6994b3ceaef50c">VmaDefragmentationFlagBits</a> { <a class="el" href="vk__mem__alloc_8h.html#a6552a65b71d16f378c6994b3ceaef50ca31af49446af2459284a568ce2f3fdd33">VMA_DEFRAGMENTATION_FLAG_INCREMENTAL</a> = 0x1, 
-<a class="el" href="vk__mem__alloc_8h.html#a6552a65b71d16f378c6994b3ceaef50cab87ec33154803bfeb5ac2b379f1d6a97">VMA_DEFRAGMENTATION_FLAG_BITS_MAX_ENUM</a> = 0x7FFFFFFF
+<tr class="memitem:a6552a65b71d16f378c6994b3ceaef50c"><td class="memItemLeft" align="right" valign="top">enum &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="vk__mem__alloc_8h.html#a6552a65b71d16f378c6994b3ceaef50c">VmaDefragmentationFlagBits</a> { <a class="el" href="vk__mem__alloc_8h.html#a6552a65b71d16f378c6994b3ceaef50ca31af49446af2459284a568ce2f3fdd33">VMA_DEFRAGMENTATION_FLAG_INCREMENTAL</a> = 0x1
+, <a class="el" href="vk__mem__alloc_8h.html#a6552a65b71d16f378c6994b3ceaef50cab87ec33154803bfeb5ac2b379f1d6a97">VMA_DEFRAGMENTATION_FLAG_BITS_MAX_ENUM</a> = 0x7FFFFFFF
  }</td></tr>
 <tr class="memdesc:a6552a65b71d16f378c6994b3ceaef50c"><td class="mdescLeft">&#160;</td><td class="mdescRight">Flags to be used in <a class="el" href="vk__mem__alloc_8h.html#a36ba776fd7fd5cb1e9359fdc0d8e6e8a" title="Begins defragmentation process.">vmaDefragmentationBegin()</a>. None at the moment. Reserved for future use.  <a href="vk__mem__alloc_8h.html#a6552a65b71d16f378c6994b3ceaef50c">More...</a><br /></td></tr>
 <tr class="separator:a6552a65b71d16f378c6994b3ceaef50c"><td class="memSeparator" colspan="2">&#160;</td></tr>
@@ -386,9 +391,6 @@
 <tr class="memitem:a834b1e4aef395c0a1d56a28e69a4a17e"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="vk__mem__alloc_8h.html#a834b1e4aef395c0a1d56a28e69a4a17e">vmaFreeMemoryPages</a> (<a class="el" href="struct_vma_allocator.html">VmaAllocator</a> allocator, size_t allocationCount, const <a class="el" href="struct_vma_allocation.html">VmaAllocation</a> *pAllocations)</td></tr>
 <tr class="memdesc:a834b1e4aef395c0a1d56a28e69a4a17e"><td class="mdescLeft">&#160;</td><td class="mdescRight">Frees memory and destroys multiple allocations.  <a href="vk__mem__alloc_8h.html#a834b1e4aef395c0a1d56a28e69a4a17e">More...</a><br /></td></tr>
 <tr class="separator:a834b1e4aef395c0a1d56a28e69a4a17e"><td class="memSeparator" colspan="2">&#160;</td></tr>
-<tr class="memitem:a0ff488958ca72b28e545880463cb8696"><td class="memItemLeft" align="right" valign="top">VkResult&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="vk__mem__alloc_8h.html#a0ff488958ca72b28e545880463cb8696">vmaResizeAllocation</a> (<a class="el" href="struct_vma_allocator.html">VmaAllocator</a> allocator, <a class="el" href="struct_vma_allocation.html">VmaAllocation</a> allocation, VkDeviceSize newSize)</td></tr>
-<tr class="memdesc:a0ff488958ca72b28e545880463cb8696"><td class="mdescLeft">&#160;</td><td class="mdescRight">Deprecated.  <a href="vk__mem__alloc_8h.html#a0ff488958ca72b28e545880463cb8696">More...</a><br /></td></tr>
-<tr class="separator:a0ff488958ca72b28e545880463cb8696"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:a86dd08aba8633bfa4ad0df2e76481d8b"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="vk__mem__alloc_8h.html#a86dd08aba8633bfa4ad0df2e76481d8b">vmaGetAllocationInfo</a> (<a class="el" href="struct_vma_allocator.html">VmaAllocator</a> allocator, <a class="el" href="struct_vma_allocation.html">VmaAllocation</a> allocation, <a class="el" href="struct_vma_allocation_info.html">VmaAllocationInfo</a> *pAllocationInfo)</td></tr>
 <tr class="memdesc:a86dd08aba8633bfa4ad0df2e76481d8b"><td class="mdescLeft">&#160;</td><td class="mdescRight">Returns current information about specified allocation and atomically marks it as used in current frame.  <a href="vk__mem__alloc_8h.html#a86dd08aba8633bfa4ad0df2e76481d8b">More...</a><br /></td></tr>
 <tr class="separator:a86dd08aba8633bfa4ad0df2e76481d8b"><td class="memSeparator" colspan="2">&#160;</td></tr>
@@ -460,20 +462,6 @@
 <tr class="separator:ae50d2cb3b4a3bfd4dd40987234e50e7e"><td class="memSeparator" colspan="2">&#160;</td></tr>
 </table>
 <h2 class="groupheader">Macro Definition Documentation</h2>
-<a id="a9f918755b601cf4bffca775992e6fb90"></a>
-<h2 class="memtitle"><span class="permalink"><a href="#a9f918755b601cf4bffca775992e6fb90">&#9670;&nbsp;</a></span>NOMINMAX</h2>
-
-<div class="memitem">
-<div class="memproto">
-      <table class="memname">
-        <tr>
-          <td class="memname">#define NOMINMAX</td>
-        </tr>
-      </table>
-</div><div class="memdoc">
-
-</div>
-</div>
 <a id="a88bef97f86d70a34a4c0746e09a2680d"></a>
 <h2 class="memtitle"><span class="permalink"><a href="#a88bef97f86d70a34a4c0746e09a2680d">&#9670;&nbsp;</a></span>VMA_BIND_MEMORY2</h2>
 
@@ -530,6 +518,20 @@
 
 </div>
 </div>
+<a id="a81af8a3a87e34bbb493848143cde43e4"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a81af8a3a87e34bbb493848143cde43e4">&#9670;&nbsp;</a></span>VMA_MEMORY_PRIORITY</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define VMA_MEMORY_PRIORITY&#160;&#160;&#160;0</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+</div>
+</div>
 <a id="a1f0c126759fc96ccb6e2d23c101d770c"></a>
 <h2 class="memtitle"><span class="permalink"><a href="#a1f0c126759fc96ccb6e2d23c101d770c">&#9670;&nbsp;</a></span>VMA_RECORDING_ENABLED</h2>
 
@@ -786,7 +788,7 @@
 </div><div class="memdoc">
 
 <p>Deprecated. Optional configuration parameters to be passed to function <a class="el" href="vk__mem__alloc_8h.html#a9f0f8f56db5f7f57fe4454f465142dac" title="Deprecated. Compacts memory by moving allocations.">vmaDefragment()</a>. </p>
-<dl class="deprecated"><dt><b><a class="el" href="deprecated.html#_deprecated000002">Deprecated:</a></b></dt><dd>This is a part of the old interface. It is recommended to use structure <a class="el" href="struct_vma_defragmentation_info2.html" title="Parameters for defragmentation.">VmaDefragmentationInfo2</a> and function <a class="el" href="vk__mem__alloc_8h.html#a36ba776fd7fd5cb1e9359fdc0d8e6e8a" title="Begins defragmentation process.">vmaDefragmentationBegin()</a> instead. </dd></dl>
+<dl class="deprecated"><dt><b><a class="el" href="deprecated.html#_deprecated000001">Deprecated:</a></b></dt><dd>This is a part of the old interface. It is recommended to use structure <a class="el" href="struct_vma_defragmentation_info2.html" title="Parameters for defragmentation.">VmaDefragmentationInfo2</a> and function <a class="el" href="vk__mem__alloc_8h.html#a36ba776fd7fd5cb1e9359fdc0d8e6e8a" title="Begins defragmentation process.">vmaDefragmentationBegin()</a> instead. </dd></dl>
 
 </div>
 </div>
@@ -1069,7 +1071,7 @@
 </td></tr>
 <tr><td class="fieldname"><a id="ad9889c10c798b040d59c92f257cae597a11da372cc3a82931c5e5d6146cd9dd1f"></a>VMA_ALLOCATION_CREATE_MAPPED_BIT&#160;</td><td class="fielddoc"><p>Set this flag to use a memory that will be persistently mapped and retrieve pointer to it. </p>
 <p>Pointer to mapped memory will be returned through <a class="el" href="struct_vma_allocation_info.html#a5eeffbe2d2f30f53370ff14aefbadbe2" title="Pointer to the beginning of this allocation as mapped data.">VmaAllocationInfo::pMappedData</a>.</p>
-<p>Is it valid to use this flag for allocation made from memory type that is not <code>HOST_VISIBLE</code>. This flag is then ignored and memory is not mapped. This is useful if you need an allocation that is efficient to use on GPU (<code>DEVICE_LOCAL</code>) and still want to map it directly if possible on platforms that support it (e.g. Intel GPU).</p>
+<p>It is valid to use this flag for allocation made from memory type that is not <code>HOST_VISIBLE</code>. This flag is then ignored and memory is not mapped. This is useful if you need an allocation that is efficient to use on GPU (<code>DEVICE_LOCAL</code>) and still want to map it directly if possible on platforms that support it (e.g. Intel GPU).</p>
 <p>You should not use this flag together with <a class="el" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a5f436af6c8fe8540573a6d22627a6fd2">VMA_ALLOCATION_CREATE_CAN_BECOME_LOST_BIT</a>. </p>
 </td></tr>
 <tr><td class="fieldname"><a id="ad9889c10c798b040d59c92f257cae597a5f436af6c8fe8540573a6d22627a6fd2"></a>VMA_ALLOCATION_CREATE_CAN_BECOME_LOST_BIT&#160;</td><td class="fielddoc"><p>Allocation created with this flag can become lost as a result of another allocation with <a class="el" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a68686d0ce9beb0d4d1b9f2b8b1389a7e">VMA_ALLOCATION_CREATE_CAN_MAKE_OTHER_LOST_BIT</a> flag, so you must check it before use.</p>
@@ -1128,7 +1130,7 @@
 </td></tr>
 <tr><td class="fieldname"><a id="a4f87c9100d154a65a4ad495f7763cf7cace7da7cc6e71a625dfa763c55a597878"></a>VMA_ALLOCATOR_CREATE_KHR_DEDICATED_ALLOCATION_BIT&#160;</td><td class="fielddoc"><p>Enables usage of VK_KHR_dedicated_allocation extension. </p>
 <p>The flag works only if <a class="el" href="struct_vma_allocator_create_info.html#ae0ffc55139b54520a6bb704b29ffc285" title="Optional. The highest version of Vulkan that the application is designed to use.">VmaAllocatorCreateInfo::vulkanApiVersion</a> <code>== VK_API_VERSION_1_0</code>. When it's <code>VK_API_VERSION_1_1</code>, the flag is ignored because the extension has been promoted to Vulkan 1.1.</p>
-<p>Using this extenion will automatically allocate dedicated blocks of memory for some buffers and images instead of suballocating place for them out of bigger memory blocks (as if you explicitly used <a class="el" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a3fc311d855c2ff53f1090ef5c722b38f" title="Set this flag if the allocation should have its own memory block.">VMA_ALLOCATION_CREATE_DEDICATED_MEMORY_BIT</a> flag) when it is recommended by the driver. It may improve performance on some GPUs.</p>
+<p>Using this extension will automatically allocate dedicated blocks of memory for some buffers and images instead of suballocating place for them out of bigger memory blocks (as if you explicitly used <a class="el" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a3fc311d855c2ff53f1090ef5c722b38f" title="Set this flag if the allocation should have its own memory block.">VMA_ALLOCATION_CREATE_DEDICATED_MEMORY_BIT</a> flag) when it is recommended by the driver. It may improve performance on some GPUs.</p>
 <p>You may set this flag only if you found out that following device extensions are supported, you enabled them while creating Vulkan device passed as <a class="el" href="struct_vma_allocator_create_info.html#ad924ddd77b04039c88d0c09b0ffcd500" title="Vulkan device.">VmaAllocatorCreateInfo::device</a>, and you want them to be used internally by this library:</p>
 <ul>
 <li>VK_KHR_get_memory_requirements2 (device extension)</li>
@@ -1162,11 +1164,16 @@
 <p>You may set this flag only if you:</p>
 <ol type="1">
 <li>(For Vulkan version &lt; 1.2) Found as available and enabled device extension VK_KHR_buffer_device_address. This extension is promoted to core Vulkan 1.2.</li>
-<li>Found as available and enabled device feature <code>VkPhysicalDeviceBufferDeviceAddressFeatures*::bufferDeviceAddress</code>.</li>
+<li>Found as available and enabled device feature <code>VkPhysicalDeviceBufferDeviceAddressFeatures::bufferDeviceAddress</code>.</li>
 </ol>
-<p>When this flag is set, you can create buffers with <code>VK_BUFFER_USAGE_SHADER_DEVICE_ADDRESS_BIT*</code> using VMA. The library automatically adds <code>VK_MEMORY_ALLOCATE_DEVICE_ADDRESS_BIT*</code> to allocated memory blocks wherever it might be needed.</p>
+<p>When this flag is set, you can create buffers with <code>VK_BUFFER_USAGE_SHADER_DEVICE_ADDRESS_BIT</code> using VMA. The library automatically adds <code>VK_MEMORY_ALLOCATE_DEVICE_ADDRESS_BIT</code> to allocated memory blocks wherever it might be needed.</p>
 <p>For more information, see documentation chapter <a class="el" href="enabling_buffer_device_address.html">Enabling buffer device address</a>. </p>
 </td></tr>
+<tr><td class="fieldname"><a id="a4f87c9100d154a65a4ad495f7763cf7caffdd7a5169be3dbd7cbf6b3619e4f78a"></a>VMA_ALLOCATOR_CREATE_EXT_MEMORY_PRIORITY_BIT&#160;</td><td class="fielddoc"><p>Enables usage of VK_EXT_memory_priority extension in the library.</p>
+<p>You may set this flag only if you found available and enabled this device extension, along with <code>VkPhysicalDeviceMemoryPriorityFeaturesEXT::memoryPriority == VK_TRUE</code>, while creating Vulkan device passed as <a class="el" href="struct_vma_allocator_create_info.html#ad924ddd77b04039c88d0c09b0ffcd500" title="Vulkan device.">VmaAllocatorCreateInfo::device</a>.</p>
+<p>When this flag is used, <a class="el" href="struct_vma_allocation_create_info.html#a983d39e1a2e63649d78a960aa2fdd0f7" title="A floating-point value between 0 and 1, indicating the priority of the allocation relative to other m...">VmaAllocationCreateInfo::priority</a> and <a class="el" href="struct_vma_pool_create_info.html#a16e686c688f6725f119ebf6e24ab5274" title="A floating-point value between 0 and 1, indicating the priority of the allocations in this pool relat...">VmaPoolCreateInfo::priority</a> are used to set priorities of allocated Vulkan memory. Without it, these variables are ignored.</p>
+<p>A priority must be a floating-point value between 0 and 1, indicating the priority of the allocation relative to other memory allocations. Larger values are higher priority. The granularity of the priorities is implementation-dependent. It is automatically passed to every call to <code>vkAllocateMemory</code> done by the library using structure <code>VkMemoryPriorityAllocateInfoEXT</code>. The value to be used for default priority is 0.5. For more details, see the documentation of the VK_EXT_memory_priority extension. </p>
+</td></tr>
 <tr><td class="fieldname"><a id="a4f87c9100d154a65a4ad495f7763cf7cae4d5ad929caba5f23eb502b13bd5286c"></a>VMA_ALLOCATOR_CREATE_FLAG_BITS_MAX_ENUM&#160;</td><td class="fielddoc"></td></tr>
 </table>
 
@@ -1644,13 +1651,13 @@
 <p>Binds buffer to allocation with additional parameters. </p>
 <dl class="params"><dt>Parameters</dt><dd>
   <table class="params">
-    <tr><td class="paramname">allocationLocalOffset</td><td>Additional offset to be added while binding, relative to the beginnig of the <code>allocation</code>. Normally it should be 0. </td></tr>
+    <tr><td class="paramname">allocationLocalOffset</td><td>Additional offset to be added while binding, relative to the beginning of the <code>allocation</code>. Normally it should be 0. </td></tr>
     <tr><td class="paramname">pNext</td><td>A chain of structures to be attached to <code>VkBindBufferMemoryInfoKHR</code> structure used internally. Normally it should be null.</td></tr>
   </table>
   </dd>
 </dl>
 <p>This function is similar to <a class="el" href="vk__mem__alloc_8h.html#a6b0929b914b60cf2d45cac4bf3547470" title="Binds buffer to allocation.">vmaBindBufferMemory()</a>, but it provides additional parameters.</p>
-<p>If <code>pNext</code> is not null, <a class="el" href="struct_vma_allocator.html" title="Represents main object of this library initialized.">VmaAllocator</a> object must have been created with <a class="el" href="vk__mem__alloc_8h.html#a4f87c9100d154a65a4ad495f7763cf7ca8fb75bf07cd184ab903596295e863dee">VMA_ALLOCATOR_CREATE_KHR_BIND_MEMORY2_BIT</a> flag or with <a class="el" href="struct_vma_allocator_create_info.html#ae0ffc55139b54520a6bb704b29ffc285" title="Optional. The highest version of Vulkan that the application is designed to use.">VmaAllocatorCreateInfo::vulkanApiVersion</a> <code>== VK_API_VERSION_1_1</code>. Otherwise the call fails. </p>
+<p>If <code>pNext</code> is not null, <a class="el" href="struct_vma_allocator.html" title="Represents main object of this library initialized.">VmaAllocator</a> object must have been created with <a class="el" href="vk__mem__alloc_8h.html#a4f87c9100d154a65a4ad495f7763cf7ca8fb75bf07cd184ab903596295e863dee">VMA_ALLOCATOR_CREATE_KHR_BIND_MEMORY2_BIT</a> flag or with <a class="el" href="struct_vma_allocator_create_info.html#ae0ffc55139b54520a6bb704b29ffc285" title="Optional. The highest version of Vulkan that the application is designed to use.">VmaAllocatorCreateInfo::vulkanApiVersion</a> <code>&gt;= VK_API_VERSION_1_1</code>. Otherwise the call fails. </p>
 
 </div>
 </div>
@@ -1739,13 +1746,13 @@
 <p>Binds image to allocation with additional parameters. </p>
 <dl class="params"><dt>Parameters</dt><dd>
   <table class="params">
-    <tr><td class="paramname">allocationLocalOffset</td><td>Additional offset to be added while binding, relative to the beginnig of the <code>allocation</code>. Normally it should be 0. </td></tr>
+    <tr><td class="paramname">allocationLocalOffset</td><td>Additional offset to be added while binding, relative to the beginning of the <code>allocation</code>. Normally it should be 0. </td></tr>
     <tr><td class="paramname">pNext</td><td>A chain of structures to be attached to <code>VkBindImageMemoryInfoKHR</code> structure used internally. Normally it should be null.</td></tr>
   </table>
   </dd>
 </dl>
 <p>This function is similar to <a class="el" href="vk__mem__alloc_8h.html#a3d3ca45799923aa5d138e9e5f9eb2da5" title="Binds image to allocation.">vmaBindImageMemory()</a>, but it provides additional parameters.</p>
-<p>If <code>pNext</code> is not null, <a class="el" href="struct_vma_allocator.html" title="Represents main object of this library initialized.">VmaAllocator</a> object must have been created with <a class="el" href="vk__mem__alloc_8h.html#a4f87c9100d154a65a4ad495f7763cf7ca8fb75bf07cd184ab903596295e863dee">VMA_ALLOCATOR_CREATE_KHR_BIND_MEMORY2_BIT</a> flag or with <a class="el" href="struct_vma_allocator_create_info.html#ae0ffc55139b54520a6bb704b29ffc285" title="Optional. The highest version of Vulkan that the application is designed to use.">VmaAllocatorCreateInfo::vulkanApiVersion</a> <code>== VK_API_VERSION_1_1</code>. Otherwise the call fails. </p>
+<p>If <code>pNext</code> is not null, <a class="el" href="struct_vma_allocator.html" title="Represents main object of this library initialized.">VmaAllocator</a> object must have been created with <a class="el" href="vk__mem__alloc_8h.html#a4f87c9100d154a65a4ad495f7763cf7ca8fb75bf07cd184ab903596295e863dee">VMA_ALLOCATOR_CREATE_KHR_BIND_MEMORY2_BIT</a> flag or with <a class="el" href="struct_vma_allocator_create_info.html#ae0ffc55139b54520a6bb704b29ffc285" title="Optional. The highest version of Vulkan that the application is designed to use.">VmaAllocatorCreateInfo::vulkanApiVersion</a> <code>&gt;= VK_API_VERSION_1_1</code>. Otherwise the call fails. </p>
 
 </div>
 </div>
@@ -2000,7 +2007,8 @@
 </ol>
 <p>If any of these operations fail, buffer and allocation are not created, returned value is negative error code, *pBuffer and *pAllocation are null.</p>
 <p>If the function succeeded, you must destroy both buffer and allocation when you no longer need them using either convenience function <a class="el" href="vk__mem__alloc_8h.html#a0d9f4e4ba5bf9aab1f1c746387753d77" title="Destroys Vulkan buffer and frees allocated memory.">vmaDestroyBuffer()</a> or separately, using <code>vkDestroyBuffer()</code> and <a class="el" href="vk__mem__alloc_8h.html#a5fea5518972ae9094b1526cbcb19b05f" title="Frees memory previously allocated using vmaAllocateMemory(), vmaAllocateMemoryForBuffer(),...">vmaFreeMemory()</a>.</p>
-<p>If VMA_ALLOCATOR_CREATE_KHR_DEDICATED_ALLOCATION_BIT flag was used, VK_KHR_dedicated_allocation extension is used internally to query driver whether it requires or prefers the new buffer to have dedicated allocation. If yes, and if dedicated allocation is possible (<a class="el" href="struct_vma_allocation_create_info.html#a6272c0555cfd1fe28bff1afeb6190150" title="Pool that this allocation should be created in.">VmaAllocationCreateInfo::pool</a> is null and VMA_ALLOCATION_CREATE_NEVER_ALLOCATE_BIT is not used), it creates dedicated allocation for this buffer, just like when using VMA_ALLOCATION_CREATE_DEDICATED_MEMORY_BIT. </p>
+<p>If <a class="el" href="vk__mem__alloc_8h.html#a4f87c9100d154a65a4ad495f7763cf7cace7da7cc6e71a625dfa763c55a597878" title="Enables usage of VK_KHR_dedicated_allocation extension.">VMA_ALLOCATOR_CREATE_KHR_DEDICATED_ALLOCATION_BIT</a> flag was used, VK_KHR_dedicated_allocation extension is used internally to query driver whether it requires or prefers the new buffer to have dedicated allocation. If yes, and if dedicated allocation is possible (<a class="el" href="struct_vma_allocation_create_info.html#a6272c0555cfd1fe28bff1afeb6190150" title="Pool that this allocation should be created in.">VmaAllocationCreateInfo::pool</a> is null and <a class="el" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a89759603401014eb325eb22a3839f2ff" title="Set this flag to only try to allocate from existing VkDeviceMemory blocks and never create new such b...">VMA_ALLOCATION_CREATE_NEVER_ALLOCATE_BIT</a> is not used), it creates dedicated allocation for this buffer, just like when using <a class="el" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a3fc311d855c2ff53f1090ef5c722b38f" title="Set this flag if the allocation should have its own memory block.">VMA_ALLOCATION_CREATE_DEDICATED_MEMORY_BIT</a>.</p>
+<dl class="section note"><dt>Note</dt><dd>This function creates a new <code>VkBuffer</code>. Sub-allocation of parts of one large buffer, although recommended as a good practice, is out of scope of this library and could be implemented by the user as a higher-level logic on top of VMA. </dd></dl>
 
 </div>
 </div>
@@ -2197,7 +2205,7 @@
   </dd>
 </dl>
 <dl class="section return"><dt>Returns</dt><dd><code>VK_SUCCESS</code> if completed, negative error code in case of error.</dd></dl>
-<dl class="deprecated"><dt><b><a class="el" href="deprecated.html#_deprecated000003">Deprecated:</a></b></dt><dd>This is a part of the old interface. It is recommended to use structure <a class="el" href="struct_vma_defragmentation_info2.html" title="Parameters for defragmentation.">VmaDefragmentationInfo2</a> and function <a class="el" href="vk__mem__alloc_8h.html#a36ba776fd7fd5cb1e9359fdc0d8e6e8a" title="Begins defragmentation process.">vmaDefragmentationBegin()</a> instead.</dd></dl>
+<dl class="deprecated"><dt><b><a class="el" href="deprecated.html#_deprecated000002">Deprecated:</a></b></dt><dd>This is a part of the old interface. It is recommended to use structure <a class="el" href="struct_vma_defragmentation_info2.html" title="Parameters for defragmentation.">VmaDefragmentationInfo2</a> and function <a class="el" href="vk__mem__alloc_8h.html#a36ba776fd7fd5cb1e9359fdc0d8e6e8a" title="Begins defragmentation process.">vmaDefragmentationBegin()</a> instead.</dd></dl>
 <p>This function works by moving allocations to different places (different <code>VkDeviceMemory</code> objects and/or different offsets) in order to optimize memory usage. Only allocations that are in <code>pAllocations</code> array can be moved. All other allocations are considered nonmovable in this call. Basic rules:</p>
 <ul>
 <li>Only allocations made in memory types that have <code>VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT</code> and <code>VK_MEMORY_PROPERTY_HOST_COHERENT_BIT</code> flags can be compacted. You may pass other allocations but it makes no sense - these will never be moved.</li>
@@ -2360,6 +2368,7 @@
 <p>This is just a convenience function equivalent to:</p>
 <div class="fragment"><div class="line">vkDestroyBuffer(device, buffer, allocationCallbacks);</div>
 <div class="line"><a class="code" href="vk__mem__alloc_8h.html#a5fea5518972ae9094b1526cbcb19b05f">vmaFreeMemory</a>(allocator, allocation);</div>
+<div class="ttc" id="avk__mem__alloc_8h_html_a5fea5518972ae9094b1526cbcb19b05f"><div class="ttname"><a href="vk__mem__alloc_8h.html#a5fea5518972ae9094b1526cbcb19b05f">vmaFreeMemory</a></div><div class="ttdeci">void vmaFreeMemory(VmaAllocator allocator, const VmaAllocation allocation)</div><div class="ttdoc">Frees memory previously allocated using vmaAllocateMemory(), vmaAllocateMemoryForBuffer(),...</div></div>
 </div><!-- fragment --><p>It it safe to pass null as buffer and/or allocation. </p>
 
 </div>
@@ -2852,7 +2861,7 @@
 </div><div class="memdoc">
 
 <p>Returns current information about specified allocation and atomically marks it as used in current frame. </p>
-<p>Current paramters of given allocation are returned in <code>pAllocationInfo</code>.</p>
+<p>Current paramteres of given allocation are returned in <code>pAllocationInfo</code>.</p>
 <p>This function also atomically "touches" allocation - marks it as used in current frame, just like <a class="el" href="vk__mem__alloc_8h.html#a43d8ba9673c846f049089a5029d5c73a" title="Returns VK_TRUE if allocation is not lost and atomically marks it as used in current frame.">vmaTouchAllocation()</a>. If the allocation is in lost state, <code>pAllocationInfo-&gt;deviceMemory == VK_NULL_HANDLE</code>.</p>
 <p>Although this function uses atomics and doesn't lock any mutex, so it should be quite efficient, you can avoid calling it too often.</p>
 <ul>
@@ -3296,7 +3305,7 @@
 </div><div class="memdoc">
 
 <p>Maps memory represented by given allocation and returns pointer to it. </p>
-<p>Maps memory represented by given allocation to make it accessible to CPU code. When succeeded, <code>*ppData</code> contains pointer to first byte of this memory. If the allocation is part of bigger <code>VkDeviceMemory</code> block, the pointer is correctly offseted to the beginning of region assigned to this particular allocation.</p>
+<p>Maps memory represented by given allocation to make it accessible to CPU code. When succeeded, <code>*ppData</code> contains pointer to first byte of this memory. If the allocation is part of bigger <code>VkDeviceMemory</code> block, the pointer is correctly offsetted to the beginning of region assigned to this particular allocation.</p>
 <p>Mapping is internally reference-counted and synchronized, so despite raw Vulkan function <code>vkMapMemory()</code> cannot be used to map same block of <code>VkDeviceMemory</code> multiple times simultaneously, it is safe to call this function on allocations assigned to the same memory block. Actual Vulkan memory will be mapped on first mapping and unmapped on last unmapping.</p>
 <p>If the function succeeded, you must call <a class="el" href="vk__mem__alloc_8h.html#a9bc268595cb33f6ec4d519cfce81ff45" title="Unmaps memory represented by given allocation, mapped previously using vmaMapMemory().">vmaUnmapMemory()</a> to unmap the allocation when mapping is no longer needed or before freeing the allocation, at the latest.</p>
 <p>It also safe to call this function multiple times on the same allocation. You must call <a class="el" href="vk__mem__alloc_8h.html#a9bc268595cb33f6ec4d519cfce81ff45" title="Unmaps memory represented by given allocation, mapped previously using vmaMapMemory().">vmaUnmapMemory()</a> same number of times as you called <a class="el" href="vk__mem__alloc_8h.html#ad5bd1243512d099706de88168992f069" title="Maps memory represented by given allocation and returns pointer to it.">vmaMapMemory()</a>.</p>
@@ -3307,43 +3316,6 @@
 
 </div>
 </div>
-<a id="a0ff488958ca72b28e545880463cb8696"></a>
-<h2 class="memtitle"><span class="permalink"><a href="#a0ff488958ca72b28e545880463cb8696">&#9670;&nbsp;</a></span>vmaResizeAllocation()</h2>
-
-<div class="memitem">
-<div class="memproto">
-      <table class="memname">
-        <tr>
-          <td class="memname">VkResult vmaResizeAllocation </td>
-          <td>(</td>
-          <td class="paramtype"><a class="el" href="struct_vma_allocator.html">VmaAllocator</a>&#160;</td>
-          <td class="paramname"><em>allocator</em>, </td>
-        </tr>
-        <tr>
-          <td class="paramkey"></td>
-          <td></td>
-          <td class="paramtype"><a class="el" href="struct_vma_allocation.html">VmaAllocation</a>&#160;</td>
-          <td class="paramname"><em>allocation</em>, </td>
-        </tr>
-        <tr>
-          <td class="paramkey"></td>
-          <td></td>
-          <td class="paramtype">VkDeviceSize&#160;</td>
-          <td class="paramname"><em>newSize</em>&#160;</td>
-        </tr>
-        <tr>
-          <td></td>
-          <td>)</td>
-          <td></td><td></td>
-        </tr>
-      </table>
-</div><div class="memdoc">
-
-<p>Deprecated. </p>
-<dl class="deprecated"><dt><b><a class="el" href="deprecated.html#_deprecated000001">Deprecated:</a></b></dt><dd>In version 2.2.0 it used to try to change allocation's size without moving or reallocating it. In current version it returns <code>VK_SUCCESS</code> only if <code>newSize</code> equals current allocation's size. Otherwise returns <code>VK_ERROR_OUT_OF_POOL_MEMORY</code>, indicating that allocation's size could not be changed. </dd></dl>
-
-</div>
-</div>
 <a id="af9147d31ffc11d62fc187bde283ed14f"></a>
 <h2 class="memtitle"><span class="permalink"><a href="#af9147d31ffc11d62fc187bde283ed14f">&#9670;&nbsp;</a></span>vmaSetAllocationUserData()</h2>
 
@@ -3516,12 +3488,9 @@
 </div>
 </div>
 </div><!-- contents -->
-<div class="ttc" id="avk__mem__alloc_8h_html_a5fea5518972ae9094b1526cbcb19b05f"><div class="ttname"><a href="vk__mem__alloc_8h.html#a5fea5518972ae9094b1526cbcb19b05f">vmaFreeMemory</a></div><div class="ttdeci">void vmaFreeMemory(VmaAllocator allocator, const VmaAllocation allocation)</div><div class="ttdoc">Frees memory previously allocated using vmaAllocateMemory(), vmaAllocateMemoryForBuffer(),...</div></div>
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated by &#160;<a href="http://www.doxygen.org/index.html">
-<img class="footer" src="doxygen.png" alt="doxygen"/>
-</a> 1.8.18
+Generated by&#160;<a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.1
 </small></address>
 </body>
 </html>
diff --git a/third_party/vulkan_memory_allocator/docs/html/vk__mem__alloc_8h_source.html b/third_party/vulkan_memory_allocator/docs/html/vk__mem__alloc_8h_source.html
index 58d3da8..2f4f341 100644
--- a/third_party/vulkan_memory_allocator/docs/html/vk__mem__alloc_8h_source.html
+++ b/third_party/vulkan_memory_allocator/docs/html/vk__mem__alloc_8h_source.html
@@ -3,9 +3,9 @@
 <head>
 <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
 <meta http-equiv="X-UA-Compatible" content="IE=9"/>
-<meta name="generator" content="Doxygen 1.8.18"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
 <meta name="viewport" content="width=device-width, initial-scale=1"/>
-<title>Vulkan Memory Allocator: vk_mem_alloc.h Source File</title>
+<title>Vulkan Memory Allocator: include/vk_mem_alloc.h Source File</title>
 <link href="tabs.css" rel="stylesheet" type="text/css"/>
 <script type="text/javascript" src="jquery.js"></script>
 <script type="text/javascript" src="dynsections.js"></script>
@@ -29,10 +29,10 @@
 </table>
 </div>
 <!-- end header part -->
-<!-- Generated by Doxygen 1.8.18 -->
+<!-- Generated by Doxygen 1.9.1 -->
 <script type="text/javascript">
 /* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
-var searchBox = new SearchBox("searchBox", "search",false,'Search');
+var searchBox = new SearchBox("searchBox", "search",false,'Search','.html');
 /* @license-end */
 </script>
 <script type="text/javascript" src="menudata.js"></script>
@@ -45,7 +45,6 @@
 });
 /* @license-end */</script>
 <div id="main-nav"></div>
-</div><!-- top -->
 <!-- window showing the filter options -->
 <div id="MSearchSelectWindow"
      onmouseover="return searchBox.OnSearchSelectShow()"
@@ -60,13 +59,18 @@
 </iframe>
 </div>
 
+<div id="nav-path" class="navpath">
+  <ul>
+<li class="navelem"><a class="el" href="dir_d44c64559bbebec7f509842c48db8b23.html">include</a></li>  </ul>
+</div>
+</div><!-- top -->
 <div class="header">
   <div class="headertitle">
 <div class="title">vk_mem_alloc.h</div>  </div>
 </div><!--header-->
 <div class="contents">
 <a href="vk__mem__alloc_8h.html">Go to the documentation of this file.</a><div class="fragment"><div class="line"><a name="l00001"></a><span class="lineno">    1</span>&#160;<span class="comment">//</span></div>
-<div class="line"><a name="l00002"></a><span class="lineno">    2</span>&#160;<span class="comment">// Copyright (c) 2017-2020 Advanced Micro Devices, Inc. All rights reserved.</span></div>
+<div class="line"><a name="l00002"></a><span class="lineno">    2</span>&#160;<span class="comment">// Copyright (c) 2017-2021 Advanced Micro Devices, Inc. All rights reserved.</span></div>
 <div class="line"><a name="l00003"></a><span class="lineno">    3</span>&#160;<span class="comment">//</span></div>
 <div class="line"><a name="l00004"></a><span class="lineno">    4</span>&#160;<span class="comment">// Permission is hereby granted, free of charge, to any person obtaining a copy</span></div>
 <div class="line"><a name="l00005"></a><span class="lineno">    5</span>&#160;<span class="comment">// of this software and associated documentation files (the &quot;Software&quot;), to deal</span></div>
@@ -90,7486 +94,7315 @@
 <div class="line"><a name="l00023"></a><span class="lineno">   23</span>&#160;<span class="preprocessor">#ifndef AMD_VULKAN_MEMORY_ALLOCATOR_H</span></div>
 <div class="line"><a name="l00024"></a><span class="lineno">   24</span>&#160;<span class="preprocessor">#define AMD_VULKAN_MEMORY_ALLOCATOR_H</span></div>
 <div class="line"><a name="l00025"></a><span class="lineno">   25</span>&#160; </div>
-<div class="line"><a name="l01892"></a><span class="lineno"> 1892</span>&#160;<span class="preprocessor">#if VMA_RECORDING_ENABLED</span></div>
-<div class="line"><a name="l01893"></a><span class="lineno"> 1893</span>&#160;<span class="preprocessor">    #include &lt;chrono&gt;</span></div>
-<div class="line"><a name="l01894"></a><span class="lineno"> 1894</span>&#160;<span class="preprocessor">    #if defined(_WIN32)</span></div>
-<div class="line"><a name="l01895"></a><span class="lineno"> 1895</span>&#160;<span class="preprocessor">        #include &lt;windows.h&gt;</span></div>
-<div class="line"><a name="l01896"></a><span class="lineno"> 1896</span>&#160;<span class="preprocessor">    #else</span></div>
-<div class="line"><a name="l01897"></a><span class="lineno"> 1897</span>&#160;<span class="preprocessor">        #include &lt;sstream&gt;</span></div>
-<div class="line"><a name="l01898"></a><span class="lineno"> 1898</span>&#160;<span class="preprocessor">        #include &lt;thread&gt;</span></div>
-<div class="line"><a name="l01899"></a><span class="lineno"> 1899</span>&#160;<span class="preprocessor">    #endif</span></div>
-<div class="line"><a name="l01900"></a><span class="lineno"> 1900</span>&#160;<span class="preprocessor">#endif</span></div>
-<div class="line"><a name="l01901"></a><span class="lineno"> 1901</span>&#160; </div>
-<div class="line"><a name="l01902"></a><span class="lineno"> 1902</span>&#160;<span class="preprocessor">#ifdef __cplusplus</span></div>
-<div class="line"><a name="l01903"></a><span class="lineno"> 1903</span>&#160;<span class="keyword">extern</span> <span class="stringliteral">&quot;C&quot;</span> {</div>
-<div class="line"><a name="l01904"></a><span class="lineno"> 1904</span>&#160;<span class="preprocessor">#endif</span></div>
-<div class="line"><a name="l01905"></a><span class="lineno"> 1905</span>&#160; </div>
-<div class="line"><a name="l01906"></a><span class="lineno"> 1906</span>&#160;<span class="comment">/*</span></div>
-<div class="line"><a name="l01907"></a><span class="lineno"> 1907</span>&#160;<span class="comment">Define this macro to 0/1 to disable/enable support for recording functionality,</span></div>
-<div class="line"><a name="l01908"></a><span class="lineno"> 1908</span>&#160;<span class="comment">available through VmaAllocatorCreateInfo::pRecordSettings.</span></div>
-<div class="line"><a name="l01909"></a><span class="lineno"> 1909</span>&#160;<span class="comment">*/</span></div>
-<div class="line"><a name="l01910"></a><span class="lineno"> 1910</span>&#160;<span class="preprocessor">#ifndef VMA_RECORDING_ENABLED</span></div>
-<div class="line"><a name="l01911"></a><span class="lineno"> 1911</span>&#160;<span class="preprocessor">    #define VMA_RECORDING_ENABLED 0</span></div>
-<div class="line"><a name="l01912"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#a1f0c126759fc96ccb6e2d23c101d770c"> 1912</a></span>&#160;<span class="preprocessor">#endif</span></div>
-<div class="line"><a name="l01913"></a><span class="lineno"> 1913</span>&#160; </div>
-<div class="line"><a name="l01914"></a><span class="lineno"> 1914</span>&#160;<span class="preprocessor">#ifndef NOMINMAX</span></div>
-<div class="line"><a name="l01915"></a><span class="lineno"> 1915</span>&#160;<span class="preprocessor">    #define NOMINMAX // For windows.h</span></div>
-<div class="line"><a name="l01916"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#a9f918755b601cf4bffca775992e6fb90"> 1916</a></span>&#160;<span class="preprocessor">#endif</span></div>
-<div class="line"><a name="l01917"></a><span class="lineno"> 1917</span>&#160; </div>
-<div class="line"><a name="l01918"></a><span class="lineno"> 1918</span>&#160;<span class="preprocessor">#if defined(__ANDROID__) &amp;&amp; defined(VK_NO_PROTOTYPES) &amp;&amp; VMA_STATIC_VULKAN_FUNCTIONS</span></div>
-<div class="line"><a name="l01919"></a><span class="lineno"> 1919</span>&#160;    <span class="keyword">extern</span> PFN_vkGetInstanceProcAddr vkGetInstanceProcAddr;</div>
-<div class="line"><a name="l01920"></a><span class="lineno"> 1920</span>&#160;    <span class="keyword">extern</span> PFN_vkGetDeviceProcAddr vkGetDeviceProcAddr;</div>
-<div class="line"><a name="l01921"></a><span class="lineno"> 1921</span>&#160;    <span class="keyword">extern</span> PFN_vkGetPhysicalDeviceProperties vkGetPhysicalDeviceProperties;</div>
-<div class="line"><a name="l01922"></a><span class="lineno"> 1922</span>&#160;    <span class="keyword">extern</span> PFN_vkGetPhysicalDeviceMemoryProperties vkGetPhysicalDeviceMemoryProperties;</div>
-<div class="line"><a name="l01923"></a><span class="lineno"> 1923</span>&#160;    <span class="keyword">extern</span> PFN_vkAllocateMemory vkAllocateMemory;</div>
-<div class="line"><a name="l01924"></a><span class="lineno"> 1924</span>&#160;    <span class="keyword">extern</span> PFN_vkFreeMemory vkFreeMemory;</div>
-<div class="line"><a name="l01925"></a><span class="lineno"> 1925</span>&#160;    <span class="keyword">extern</span> PFN_vkMapMemory vkMapMemory;</div>
-<div class="line"><a name="l01926"></a><span class="lineno"> 1926</span>&#160;    <span class="keyword">extern</span> PFN_vkUnmapMemory vkUnmapMemory;</div>
-<div class="line"><a name="l01927"></a><span class="lineno"> 1927</span>&#160;    <span class="keyword">extern</span> PFN_vkFlushMappedMemoryRanges vkFlushMappedMemoryRanges;</div>
-<div class="line"><a name="l01928"></a><span class="lineno"> 1928</span>&#160;    <span class="keyword">extern</span> PFN_vkInvalidateMappedMemoryRanges vkInvalidateMappedMemoryRanges;</div>
-<div class="line"><a name="l01929"></a><span class="lineno"> 1929</span>&#160;    <span class="keyword">extern</span> PFN_vkBindBufferMemory vkBindBufferMemory;</div>
-<div class="line"><a name="l01930"></a><span class="lineno"> 1930</span>&#160;    <span class="keyword">extern</span> PFN_vkBindImageMemory vkBindImageMemory;</div>
-<div class="line"><a name="l01931"></a><span class="lineno"> 1931</span>&#160;    <span class="keyword">extern</span> PFN_vkGetBufferMemoryRequirements vkGetBufferMemoryRequirements;</div>
-<div class="line"><a name="l01932"></a><span class="lineno"> 1932</span>&#160;    <span class="keyword">extern</span> PFN_vkGetImageMemoryRequirements vkGetImageMemoryRequirements;</div>
-<div class="line"><a name="l01933"></a><span class="lineno"> 1933</span>&#160;    <span class="keyword">extern</span> PFN_vkCreateBuffer vkCreateBuffer;</div>
-<div class="line"><a name="l01934"></a><span class="lineno"> 1934</span>&#160;    <span class="keyword">extern</span> PFN_vkDestroyBuffer vkDestroyBuffer;</div>
-<div class="line"><a name="l01935"></a><span class="lineno"> 1935</span>&#160;    <span class="keyword">extern</span> PFN_vkCreateImage vkCreateImage;</div>
-<div class="line"><a name="l01936"></a><span class="lineno"> 1936</span>&#160;    <span class="keyword">extern</span> PFN_vkDestroyImage vkDestroyImage;</div>
-<div class="line"><a name="l01937"></a><span class="lineno"> 1937</span>&#160;    <span class="keyword">extern</span> PFN_vkCmdCopyBuffer vkCmdCopyBuffer;</div>
-<div class="line"><a name="l01938"></a><span class="lineno"> 1938</span>&#160;<span class="preprocessor">    #if VMA_VULKAN_VERSION &gt;= 1001000</span></div>
-<div class="line"><a name="l01939"></a><span class="lineno"> 1939</span>&#160;        <span class="keyword">extern</span> PFN_vkGetBufferMemoryRequirements2 vkGetBufferMemoryRequirements2;</div>
-<div class="line"><a name="l01940"></a><span class="lineno"> 1940</span>&#160;        <span class="keyword">extern</span> PFN_vkGetImageMemoryRequirements2 vkGetImageMemoryRequirements2;</div>
-<div class="line"><a name="l01941"></a><span class="lineno"> 1941</span>&#160;        <span class="keyword">extern</span> PFN_vkBindBufferMemory2 vkBindBufferMemory2;</div>
-<div class="line"><a name="l01942"></a><span class="lineno"> 1942</span>&#160;        <span class="keyword">extern</span> PFN_vkBindImageMemory2 vkBindImageMemory2;</div>
-<div class="line"><a name="l01943"></a><span class="lineno"> 1943</span>&#160;        <span class="keyword">extern</span> PFN_vkGetPhysicalDeviceMemoryProperties2 vkGetPhysicalDeviceMemoryProperties2;</div>
-<div class="line"><a name="l01944"></a><span class="lineno"> 1944</span>&#160;<span class="preprocessor">    #endif // #if VMA_VULKAN_VERSION &gt;= 1001000</span></div>
-<div class="line"><a name="l01945"></a><span class="lineno"> 1945</span>&#160;<span class="preprocessor">#endif // #if defined(__ANDROID__) &amp;&amp; VMA_STATIC_VULKAN_FUNCTIONS &amp;&amp; VK_NO_PROTOTYPES</span></div>
-<div class="line"><a name="l01946"></a><span class="lineno"> 1946</span>&#160; </div>
-<div class="line"><a name="l01947"></a><span class="lineno"> 1947</span>&#160;<span class="preprocessor">#ifndef VULKAN_H_</span></div>
-<div class="line"><a name="l01948"></a><span class="lineno"> 1948</span>&#160;<span class="preprocessor">    #include &lt;vulkan/vulkan.h&gt;</span></div>
-<div class="line"><a name="l01949"></a><span class="lineno"> 1949</span>&#160;<span class="preprocessor">#endif</span></div>
-<div class="line"><a name="l01950"></a><span class="lineno"> 1950</span>&#160; </div>
-<div class="line"><a name="l01951"></a><span class="lineno"> 1951</span>&#160;<span class="comment">// Define this macro to declare maximum supported Vulkan version in format AAABBBCCC,</span></div>
-<div class="line"><a name="l01952"></a><span class="lineno"> 1952</span>&#160;<span class="comment">// where AAA = major, BBB = minor, CCC = patch.</span></div>
-<div class="line"><a name="l01953"></a><span class="lineno"> 1953</span>&#160;<span class="comment">// If you want to use version &gt; 1.0, it still needs to be enabled via VmaAllocatorCreateInfo::vulkanApiVersion.</span></div>
-<div class="line"><a name="l01954"></a><span class="lineno"> 1954</span>&#160;<span class="preprocessor">#if !defined(VMA_VULKAN_VERSION)</span></div>
-<div class="line"><a name="l01955"></a><span class="lineno"> 1955</span>&#160;<span class="preprocessor">    #if defined(VK_VERSION_1_2)</span></div>
-<div class="line"><a name="l01956"></a><span class="lineno"> 1956</span>&#160;<span class="preprocessor">        #define VMA_VULKAN_VERSION 1002000</span></div>
-<div class="line"><a name="l01957"></a><span class="lineno"> 1957</span>&#160;<span class="preprocessor">    #elif defined(VK_VERSION_1_1)</span></div>
-<div class="line"><a name="l01958"></a><span class="lineno"> 1958</span>&#160;<span class="preprocessor">        #define VMA_VULKAN_VERSION 1001000</span></div>
-<div class="line"><a name="l01959"></a><span class="lineno"> 1959</span>&#160;<span class="preprocessor">    #else</span></div>
-<div class="line"><a name="l01960"></a><span class="lineno"> 1960</span>&#160;<span class="preprocessor">        #define VMA_VULKAN_VERSION 1000000</span></div>
-<div class="line"><a name="l01961"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#a1a2407c283893638cc039bb31fcd74b6"> 1961</a></span>&#160;<span class="preprocessor">    #endif</span></div>
-<div class="line"><a name="l01962"></a><span class="lineno"> 1962</span>&#160;<span class="preprocessor">#endif</span></div>
-<div class="line"><a name="l01963"></a><span class="lineno"> 1963</span>&#160; </div>
-<div class="line"><a name="l01964"></a><span class="lineno"> 1964</span>&#160;<span class="preprocessor">#if !defined(VMA_DEDICATED_ALLOCATION)</span></div>
-<div class="line"><a name="l01965"></a><span class="lineno"> 1965</span>&#160;<span class="preprocessor">    #if VK_KHR_get_memory_requirements2 &amp;&amp; VK_KHR_dedicated_allocation</span></div>
-<div class="line"><a name="l01966"></a><span class="lineno"> 1966</span>&#160;<span class="preprocessor">        #define VMA_DEDICATED_ALLOCATION 1</span></div>
-<div class="line"><a name="l01967"></a><span class="lineno"> 1967</span>&#160;<span class="preprocessor">    #else</span></div>
-<div class="line"><a name="l01968"></a><span class="lineno"> 1968</span>&#160;<span class="preprocessor">        #define VMA_DEDICATED_ALLOCATION 0</span></div>
-<div class="line"><a name="l01969"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#af7b860e63b96d11e44ae8587ba06bbf4"> 1969</a></span>&#160;<span class="preprocessor">    #endif</span></div>
-<div class="line"><a name="l01970"></a><span class="lineno"> 1970</span>&#160;<span class="preprocessor">#endif</span></div>
-<div class="line"><a name="l01971"></a><span class="lineno"> 1971</span>&#160; </div>
-<div class="line"><a name="l01972"></a><span class="lineno"> 1972</span>&#160;<span class="preprocessor">#if !defined(VMA_BIND_MEMORY2)</span></div>
-<div class="line"><a name="l01973"></a><span class="lineno"> 1973</span>&#160;<span class="preprocessor">    #if VK_KHR_bind_memory2</span></div>
-<div class="line"><a name="l01974"></a><span class="lineno"> 1974</span>&#160;<span class="preprocessor">        #define VMA_BIND_MEMORY2 1</span></div>
-<div class="line"><a name="l01975"></a><span class="lineno"> 1975</span>&#160;<span class="preprocessor">    #else</span></div>
-<div class="line"><a name="l01976"></a><span class="lineno"> 1976</span>&#160;<span class="preprocessor">        #define VMA_BIND_MEMORY2 0</span></div>
-<div class="line"><a name="l01977"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#a88bef97f86d70a34a4c0746e09a2680d"> 1977</a></span>&#160;<span class="preprocessor">    #endif</span></div>
-<div class="line"><a name="l01978"></a><span class="lineno"> 1978</span>&#160;<span class="preprocessor">#endif</span></div>
-<div class="line"><a name="l01979"></a><span class="lineno"> 1979</span>&#160; </div>
-<div class="line"><a name="l01980"></a><span class="lineno"> 1980</span>&#160;<span class="preprocessor">#if !defined(VMA_MEMORY_BUDGET)</span></div>
-<div class="line"><a name="l01981"></a><span class="lineno"> 1981</span>&#160;<span class="preprocessor">    #if VK_EXT_memory_budget &amp;&amp; (VK_KHR_get_physical_device_properties2 || VMA_VULKAN_VERSION &gt;= 1001000)</span></div>
-<div class="line"><a name="l01982"></a><span class="lineno"> 1982</span>&#160;<span class="preprocessor">        #define VMA_MEMORY_BUDGET 1</span></div>
-<div class="line"><a name="l01983"></a><span class="lineno"> 1983</span>&#160;<span class="preprocessor">    #else</span></div>
-<div class="line"><a name="l01984"></a><span class="lineno"> 1984</span>&#160;<span class="preprocessor">        #define VMA_MEMORY_BUDGET 0</span></div>
-<div class="line"><a name="l01985"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#a05decf1cf4ebf767beba7acca6c1ec3a"> 1985</a></span>&#160;<span class="preprocessor">    #endif</span></div>
-<div class="line"><a name="l01986"></a><span class="lineno"> 1986</span>&#160;<span class="preprocessor">#endif</span></div>
-<div class="line"><a name="l01987"></a><span class="lineno"> 1987</span>&#160; </div>
-<div class="line"><a name="l01988"></a><span class="lineno"> 1988</span>&#160;<span class="comment">// Defined to 1 when VK_KHR_buffer_device_address device extension or equivalent core Vulkan 1.2 feature is defined in its headers.</span></div>
-<div class="line"><a name="l01989"></a><span class="lineno"> 1989</span>&#160;<span class="preprocessor">#if !defined(VMA_BUFFER_DEVICE_ADDRESS)</span></div>
-<div class="line"><a name="l01990"></a><span class="lineno"> 1990</span>&#160;<span class="preprocessor">    #if VK_KHR_buffer_device_address || VMA_VULKAN_VERSION &gt;= 1002000</span></div>
-<div class="line"><a name="l01991"></a><span class="lineno"> 1991</span>&#160;<span class="preprocessor">        #define VMA_BUFFER_DEVICE_ADDRESS 1</span></div>
-<div class="line"><a name="l01992"></a><span class="lineno"> 1992</span>&#160;<span class="preprocessor">    #else</span></div>
-<div class="line"><a name="l01993"></a><span class="lineno"> 1993</span>&#160;<span class="preprocessor">        #define VMA_BUFFER_DEVICE_ADDRESS 0</span></div>
-<div class="line"><a name="l01994"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#a7f9d5e71b70dd1a137c303a8a8262c10"> 1994</a></span>&#160;<span class="preprocessor">    #endif</span></div>
-<div class="line"><a name="l01995"></a><span class="lineno"> 1995</span>&#160;<span class="preprocessor">#endif</span></div>
-<div class="line"><a name="l01996"></a><span class="lineno"> 1996</span>&#160; </div>
-<div class="line"><a name="l01997"></a><span class="lineno"> 1997</span>&#160;<span class="comment">// Define these macros to decorate all public functions with additional code,</span></div>
-<div class="line"><a name="l01998"></a><span class="lineno"> 1998</span>&#160;<span class="comment">// before and after returned type, appropriately. This may be useful for</span></div>
-<div class="line"><a name="l01999"></a><span class="lineno"> 1999</span>&#160;<span class="comment">// exporing the functions when compiling VMA as a separate library. Example:</span></div>
-<div class="line"><a name="l02000"></a><span class="lineno"> 2000</span>&#160;<span class="comment">// #define VMA_CALL_PRE  __declspec(dllexport)</span></div>
-<div class="line"><a name="l02001"></a><span class="lineno"> 2001</span>&#160;<span class="comment">// #define VMA_CALL_POST __cdecl</span></div>
-<div class="line"><a name="l02002"></a><span class="lineno"> 2002</span>&#160;<span class="preprocessor">#ifndef VMA_CALL_PRE</span></div>
-<div class="line"><a name="l02003"></a><span class="lineno"> 2003</span>&#160;<span class="preprocessor">    #define VMA_CALL_PRE</span></div>
-<div class="line"><a name="l02004"></a><span class="lineno"> 2004</span>&#160;<span class="preprocessor">#endif</span></div>
-<div class="line"><a name="l02005"></a><span class="lineno"> 2005</span>&#160;<span class="preprocessor">#ifndef VMA_CALL_POST</span></div>
-<div class="line"><a name="l02006"></a><span class="lineno"> 2006</span>&#160;<span class="preprocessor">    #define VMA_CALL_POST</span></div>
-<div class="line"><a name="l02007"></a><span class="lineno"> 2007</span>&#160;<span class="preprocessor">#endif</span></div>
-<div class="line"><a name="l02008"></a><span class="lineno"> 2008</span>&#160; </div>
-<div class="line"><a name="l02009"></a><span class="lineno"> 2009</span>&#160;<span class="comment">// Define this macro to decorate pointers with an attribute specifying the</span></div>
-<div class="line"><a name="l02010"></a><span class="lineno"> 2010</span>&#160;<span class="comment">// length of the array they point to if they are not null.</span></div>
-<div class="line"><a name="l02011"></a><span class="lineno"> 2011</span>&#160;<span class="comment">//</span></div>
-<div class="line"><a name="l02012"></a><span class="lineno"> 2012</span>&#160;<span class="comment">// The length may be one of</span></div>
-<div class="line"><a name="l02013"></a><span class="lineno"> 2013</span>&#160;<span class="comment">// - The name of another parameter in the argument list where the pointer is declared</span></div>
-<div class="line"><a name="l02014"></a><span class="lineno"> 2014</span>&#160;<span class="comment">// - The name of another member in the struct where the pointer is declared</span></div>
-<div class="line"><a name="l02015"></a><span class="lineno"> 2015</span>&#160;<span class="comment">// - The name of a member of a struct type, meaning the value of that member in</span></div>
-<div class="line"><a name="l02016"></a><span class="lineno"> 2016</span>&#160;<span class="comment">//   the context of the call. For example</span></div>
-<div class="line"><a name="l02017"></a><span class="lineno"> 2017</span>&#160;<span class="comment">//   VMA_LEN_IF_NOT_NULL(&quot;VkPhysicalDeviceMemoryProperties::memoryHeapCount&quot;),</span></div>
-<div class="line"><a name="l02018"></a><span class="lineno"> 2018</span>&#160;<span class="comment">//   this means the number of memory heaps available in the device associated</span></div>
-<div class="line"><a name="l02019"></a><span class="lineno"> 2019</span>&#160;<span class="comment">//   with the VmaAllocator being dealt with.</span></div>
-<div class="line"><a name="l02020"></a><span class="lineno"> 2020</span>&#160;<span class="preprocessor">#ifndef VMA_LEN_IF_NOT_NULL</span></div>
-<div class="line"><a name="l02021"></a><span class="lineno"> 2021</span>&#160;<span class="preprocessor">    #define VMA_LEN_IF_NOT_NULL(len)</span></div>
+<div class="line"><a name="l02020"></a><span class="lineno"> 2020</span>&#160;<span class="preprocessor">#ifdef __cplusplus</span></div>
+<div class="line"><a name="l02021"></a><span class="lineno"> 2021</span>&#160;<span class="keyword">extern</span> <span class="stringliteral">&quot;C&quot;</span> {</div>
 <div class="line"><a name="l02022"></a><span class="lineno"> 2022</span>&#160;<span class="preprocessor">#endif</span></div>
 <div class="line"><a name="l02023"></a><span class="lineno"> 2023</span>&#160; </div>
-<div class="line"><a name="l02024"></a><span class="lineno"> 2024</span>&#160;<span class="comment">// The VMA_NULLABLE macro is defined to be _Nullable when compiling with Clang.</span></div>
-<div class="line"><a name="l02025"></a><span class="lineno"> 2025</span>&#160;<span class="comment">// see: https://clang.llvm.org/docs/AttributeReference.html#nullable</span></div>
-<div class="line"><a name="l02026"></a><span class="lineno"> 2026</span>&#160;<span class="preprocessor">#ifndef VMA_NULLABLE</span></div>
-<div class="line"><a name="l02027"></a><span class="lineno"> 2027</span>&#160;<span class="preprocessor">    #ifdef __clang__</span></div>
-<div class="line"><a name="l02028"></a><span class="lineno"> 2028</span>&#160;<span class="preprocessor">        #define VMA_NULLABLE _Nullable</span></div>
-<div class="line"><a name="l02029"></a><span class="lineno"> 2029</span>&#160;<span class="preprocessor">    #else</span></div>
-<div class="line"><a name="l02030"></a><span class="lineno"> 2030</span>&#160;<span class="preprocessor">        #define VMA_NULLABLE</span></div>
-<div class="line"><a name="l02031"></a><span class="lineno"> 2031</span>&#160;<span class="preprocessor">    #endif</span></div>
-<div class="line"><a name="l02032"></a><span class="lineno"> 2032</span>&#160;<span class="preprocessor">#endif</span></div>
-<div class="line"><a name="l02033"></a><span class="lineno"> 2033</span>&#160; </div>
-<div class="line"><a name="l02034"></a><span class="lineno"> 2034</span>&#160;<span class="comment">// The VMA_NOT_NULL macro is defined to be _Nonnull when compiling with Clang.</span></div>
-<div class="line"><a name="l02035"></a><span class="lineno"> 2035</span>&#160;<span class="comment">// see: https://clang.llvm.org/docs/AttributeReference.html#nonnull</span></div>
-<div class="line"><a name="l02036"></a><span class="lineno"> 2036</span>&#160;<span class="preprocessor">#ifndef VMA_NOT_NULL</span></div>
-<div class="line"><a name="l02037"></a><span class="lineno"> 2037</span>&#160;<span class="preprocessor">    #ifdef __clang__</span></div>
-<div class="line"><a name="l02038"></a><span class="lineno"> 2038</span>&#160;<span class="preprocessor">        #define VMA_NOT_NULL _Nonnull</span></div>
-<div class="line"><a name="l02039"></a><span class="lineno"> 2039</span>&#160;<span class="preprocessor">    #else</span></div>
-<div class="line"><a name="l02040"></a><span class="lineno"> 2040</span>&#160;<span class="preprocessor">        #define VMA_NOT_NULL</span></div>
-<div class="line"><a name="l02041"></a><span class="lineno"> 2041</span>&#160;<span class="preprocessor">    #endif</span></div>
-<div class="line"><a name="l02042"></a><span class="lineno"> 2042</span>&#160;<span class="preprocessor">#endif</span></div>
-<div class="line"><a name="l02043"></a><span class="lineno"> 2043</span>&#160; </div>
-<div class="line"><a name="l02044"></a><span class="lineno"> 2044</span>&#160;<span class="comment">// If non-dispatchable handles are represented as pointers then we can give</span></div>
-<div class="line"><a name="l02045"></a><span class="lineno"> 2045</span>&#160;<span class="comment">// then nullability annotations</span></div>
-<div class="line"><a name="l02046"></a><span class="lineno"> 2046</span>&#160;<span class="preprocessor">#ifndef VMA_NOT_NULL_NON_DISPATCHABLE</span></div>
-<div class="line"><a name="l02047"></a><span class="lineno"> 2047</span>&#160;<span class="preprocessor">    #if defined(__LP64__) || defined(_WIN64) || (defined(__x86_64__) &amp;&amp; !defined(__ILP32__) ) || defined(_M_X64) || defined(__ia64) || defined (_M_IA64) || defined(__aarch64__) || defined(__powerpc64__)</span></div>
-<div class="line"><a name="l02048"></a><span class="lineno"> 2048</span>&#160;<span class="preprocessor">        #define VMA_NOT_NULL_NON_DISPATCHABLE VMA_NOT_NULL</span></div>
-<div class="line"><a name="l02049"></a><span class="lineno"> 2049</span>&#160;<span class="preprocessor">    #else</span></div>
-<div class="line"><a name="l02050"></a><span class="lineno"> 2050</span>&#160;<span class="preprocessor">        #define VMA_NOT_NULL_NON_DISPATCHABLE</span></div>
-<div class="line"><a name="l02051"></a><span class="lineno"> 2051</span>&#160;<span class="preprocessor">    #endif</span></div>
-<div class="line"><a name="l02052"></a><span class="lineno"> 2052</span>&#160;<span class="preprocessor">#endif</span></div>
-<div class="line"><a name="l02053"></a><span class="lineno"> 2053</span>&#160; </div>
-<div class="line"><a name="l02054"></a><span class="lineno"> 2054</span>&#160;<span class="preprocessor">#ifndef VMA_NULLABLE_NON_DISPATCHABLE</span></div>
-<div class="line"><a name="l02055"></a><span class="lineno"> 2055</span>&#160;<span class="preprocessor">    #if defined(__LP64__) || defined(_WIN64) || (defined(__x86_64__) &amp;&amp; !defined(__ILP32__) ) || defined(_M_X64) || defined(__ia64) || defined (_M_IA64) || defined(__aarch64__) || defined(__powerpc64__)</span></div>
-<div class="line"><a name="l02056"></a><span class="lineno"> 2056</span>&#160;<span class="preprocessor">        #define VMA_NULLABLE_NON_DISPATCHABLE VMA_NULLABLE</span></div>
-<div class="line"><a name="l02057"></a><span class="lineno"> 2057</span>&#160;<span class="preprocessor">    #else</span></div>
-<div class="line"><a name="l02058"></a><span class="lineno"> 2058</span>&#160;<span class="preprocessor">        #define VMA_NULLABLE_NON_DISPATCHABLE</span></div>
-<div class="line"><a name="l02059"></a><span class="lineno"> 2059</span>&#160;<span class="preprocessor">    #endif</span></div>
-<div class="line"><a name="l02060"></a><span class="lineno"> 2060</span>&#160;<span class="preprocessor">#endif</span></div>
-<div class="line"><a name="l02061"></a><span class="lineno"> 2061</span>&#160; </div>
-<div class="line"><a name="l02071"></a><span class="lineno"> 2071</span>&#160;VK_DEFINE_HANDLE(<a class="code" href="struct_vma_allocator.html">VmaAllocator</a>)</div>
-<div class="line"><a name="l02072"></a><span class="lineno"> 2072</span>&#160; </div>
-<div class="line"><a name="l02073"></a><span class="lineno"> 2073</span>&#160;<span class="keyword">typedef</span> void (VKAPI_PTR *<a class="code" href="vk__mem__alloc_8h.html#a7e1ed85f7799600b03ad51a77acc21f3">PFN_vmaAllocateDeviceMemoryFunction</a>)(</div>
-<div class="line"><a name="l02075"></a><span class="lineno"> 2075</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> VMA_NOT_NULL                    allocator,</div>
-<div class="line"><a name="l02076"></a><span class="lineno"> 2076</span>&#160;    uint32_t                                     memoryType,</div>
-<div class="line"><a name="l02077"></a><span class="lineno"> 2077</span>&#160;    VkDeviceMemory VMA_NOT_NULL_NON_DISPATCHABLE memory,</div>
-<div class="line"><a name="l02078"></a><span class="lineno"> 2078</span>&#160;    VkDeviceSize                                 size,</div>
-<div class="line"><a name="l02079"></a><span class="lineno"> 2079</span>&#160;    <span class="keywordtype">void</span>* VMA_NULLABLE                           pUserData);</div>
-<div class="line"><a name="l02081"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#a154ccaaf53dc2c36378f80f0c4f3679b"> 2081</a></span>&#160;<span class="keyword">typedef</span> void (VKAPI_PTR *<a class="code" href="vk__mem__alloc_8h.html#a154ccaaf53dc2c36378f80f0c4f3679b">PFN_vmaFreeDeviceMemoryFunction</a>)(</div>
-<div class="line"><a name="l02082"></a><span class="lineno"> 2082</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> VMA_NOT_NULL                    allocator,</div>
-<div class="line"><a name="l02083"></a><span class="lineno"> 2083</span>&#160;    uint32_t                                     memoryType,</div>
-<div class="line"><a name="l02084"></a><span class="lineno"> 2084</span>&#160;    VkDeviceMemory VMA_NOT_NULL_NON_DISPATCHABLE memory,</div>
-<div class="line"><a name="l02085"></a><span class="lineno"> 2085</span>&#160;    VkDeviceSize                                 size,</div>
-<div class="line"><a name="l02086"></a><span class="lineno"> 2086</span>&#160;    <span class="keywordtype">void</span>* VMA_NULLABLE                           pUserData);</div>
-<div class="line"><a name="l02087"></a><span class="lineno"> 2087</span>&#160; </div>
-<div class="line"><a name="l02095"></a><span class="lineno"><a class="line" href="struct_vma_device_memory_callbacks.html"> 2095</a></span>&#160;<span class="keyword">typedef</span> <span class="keyword">struct </span><a class="code" href="struct_vma_device_memory_callbacks.html">VmaDeviceMemoryCallbacks</a> {</div>
-<div class="line"><a name="l02097"></a><span class="lineno"><a class="line" href="struct_vma_device_memory_callbacks.html#a4f17f7b255101e733b44d5633aceabfb"> 2097</a></span>&#160;    <a class="code" href="vk__mem__alloc_8h.html#a7e1ed85f7799600b03ad51a77acc21f3">PFN_vmaAllocateDeviceMemoryFunction</a> VMA_NULLABLE <a class="code" href="struct_vma_device_memory_callbacks.html#a4f17f7b255101e733b44d5633aceabfb">pfnAllocate</a>;</div>
-<div class="line"><a name="l02099"></a><span class="lineno"><a class="line" href="struct_vma_device_memory_callbacks.html#abe8a3328bbc916f6f712fdb6b299444c"> 2099</a></span>&#160;    <a class="code" href="vk__mem__alloc_8h.html#a154ccaaf53dc2c36378f80f0c4f3679b">PFN_vmaFreeDeviceMemoryFunction</a> VMA_NULLABLE <a class="code" href="struct_vma_device_memory_callbacks.html#abe8a3328bbc916f6f712fdb6b299444c">pfnFree</a>;</div>
-<div class="line"><a name="l02101"></a><span class="lineno"><a class="line" href="struct_vma_device_memory_callbacks.html#a24052de0937ddd54015a2df0363903c6"> 2101</a></span>&#160;    <span class="keywordtype">void</span>* VMA_NULLABLE <a class="code" href="struct_vma_device_memory_callbacks.html#a24052de0937ddd54015a2df0363903c6">pUserData</a>;</div>
-<div class="line"><a name="l02102"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#a77692d3c8770ea8882d573206bd27b2b"> 2102</a></span>&#160;} <a class="code" href="vk__mem__alloc_8h.html#a77692d3c8770ea8882d573206bd27b2b">VmaDeviceMemoryCallbacks</a>;</div>
-<div class="line"><a name="l02103"></a><span class="lineno"> 2103</span>&#160; </div>
-<div class="line"><a name="l02105"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#a4f87c9100d154a65a4ad495f7763cf7c"> 2105</a></span>&#160;<span class="keyword">typedef</span> <span class="keyword">enum</span> <a class="code" href="vk__mem__alloc_8h.html#a4f87c9100d154a65a4ad495f7763cf7c">VmaAllocatorCreateFlagBits</a> {</div>
-<div class="line"><a name="l02110"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#a4f87c9100d154a65a4ad495f7763cf7ca4816ddaed324ba110172ca608a20f29d"> 2110</a></span>&#160;    <a class="code" href="vk__mem__alloc_8h.html#a4f87c9100d154a65a4ad495f7763cf7ca4816ddaed324ba110172ca608a20f29d">VMA_ALLOCATOR_CREATE_EXTERNALLY_SYNCHRONIZED_BIT</a> = 0x00000001,</div>
-<div class="line"><a name="l02135"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#a4f87c9100d154a65a4ad495f7763cf7cace7da7cc6e71a625dfa763c55a597878"> 2135</a></span>&#160;    <a class="code" href="vk__mem__alloc_8h.html#a4f87c9100d154a65a4ad495f7763cf7cace7da7cc6e71a625dfa763c55a597878">VMA_ALLOCATOR_CREATE_KHR_DEDICATED_ALLOCATION_BIT</a> = 0x00000002,</div>
-<div class="line"><a name="l02150"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#a4f87c9100d154a65a4ad495f7763cf7ca8fb75bf07cd184ab903596295e863dee"> 2150</a></span>&#160;    <a class="code" href="vk__mem__alloc_8h.html#a4f87c9100d154a65a4ad495f7763cf7ca8fb75bf07cd184ab903596295e863dee">VMA_ALLOCATOR_CREATE_KHR_BIND_MEMORY2_BIT</a> = 0x00000004,</div>
-<div class="line"><a name="l02162"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#a4f87c9100d154a65a4ad495f7763cf7ca4d4687863f7bd4b418c6006dc04400b0"> 2162</a></span>&#160;    <a class="code" href="vk__mem__alloc_8h.html#a4f87c9100d154a65a4ad495f7763cf7ca4d4687863f7bd4b418c6006dc04400b0">VMA_ALLOCATOR_CREATE_EXT_MEMORY_BUDGET_BIT</a> = 0x00000008,</div>
-<div class="line"><a name="l02180"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#a4f87c9100d154a65a4ad495f7763cf7ca2acce4886d8078552efa38878413970f"> 2180</a></span>&#160;    <a class="code" href="vk__mem__alloc_8h.html#a4f87c9100d154a65a4ad495f7763cf7ca2acce4886d8078552efa38878413970f">VMA_ALLOCATOR_CREATE_AMD_DEVICE_COHERENT_MEMORY_BIT</a> = 0x00000010,</div>
-<div class="line"><a name="l02198"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#a4f87c9100d154a65a4ad495f7763cf7ca5f1b28b0414319d1687e1f2b30ab0089"> 2198</a></span>&#160;    <a class="code" href="vk__mem__alloc_8h.html#a4f87c9100d154a65a4ad495f7763cf7ca5f1b28b0414319d1687e1f2b30ab0089">VMA_ALLOCATOR_CREATE_BUFFER_DEVICE_ADDRESS_BIT</a> = 0x00000020,</div>
+<div class="line"><a name="l02024"></a><span class="lineno"> 2024</span>&#160;<span class="comment">/*</span></div>
+<div class="line"><a name="l02025"></a><span class="lineno"> 2025</span>&#160;<span class="comment">Define this macro to 0/1 to disable/enable support for recording functionality,</span></div>
+<div class="line"><a name="l02026"></a><span class="lineno"> 2026</span>&#160;<span class="comment">available through VmaAllocatorCreateInfo::pRecordSettings.</span></div>
+<div class="line"><a name="l02027"></a><span class="lineno"> 2027</span>&#160;<span class="comment">*/</span></div>
+<div class="line"><a name="l02028"></a><span class="lineno"> 2028</span>&#160;<span class="preprocessor">#ifndef VMA_RECORDING_ENABLED</span></div>
+<div class="line"><a name="l02029"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#a1f0c126759fc96ccb6e2d23c101d770c"> 2029</a></span>&#160;<span class="preprocessor">    #define VMA_RECORDING_ENABLED 0</span></div>
+<div class="line"><a name="l02030"></a><span class="lineno"> 2030</span>&#160;<span class="preprocessor">#endif</span></div>
+<div class="line"><a name="l02031"></a><span class="lineno"> 2031</span>&#160; </div>
+<div class="line"><a name="l02032"></a><span class="lineno"> 2032</span>&#160;<span class="preprocessor">#if !defined(NOMINMAX) &amp;&amp; defined(VMA_IMPLEMENTATION)</span></div>
+<div class="line"><a name="l02033"></a><span class="lineno"> 2033</span>&#160;<span class="preprocessor">    #define NOMINMAX </span><span class="comment">// For windows.h</span></div>
+<div class="line"><a name="l02034"></a><span class="lineno"> 2034</span>&#160;<span class="preprocessor">#endif</span></div>
+<div class="line"><a name="l02035"></a><span class="lineno"> 2035</span>&#160; </div>
+<div class="line"><a name="l02036"></a><span class="lineno"> 2036</span>&#160;<span class="preprocessor">#if defined(__ANDROID__) &amp;&amp; defined(VK_NO_PROTOTYPES) &amp;&amp; VMA_STATIC_VULKAN_FUNCTIONS</span></div>
+<div class="line"><a name="l02037"></a><span class="lineno"> 2037</span>&#160;    <span class="keyword">extern</span> PFN_vkGetInstanceProcAddr vkGetInstanceProcAddr;</div>
+<div class="line"><a name="l02038"></a><span class="lineno"> 2038</span>&#160;    <span class="keyword">extern</span> PFN_vkGetDeviceProcAddr vkGetDeviceProcAddr;</div>
+<div class="line"><a name="l02039"></a><span class="lineno"> 2039</span>&#160;    <span class="keyword">extern</span> PFN_vkGetPhysicalDeviceProperties vkGetPhysicalDeviceProperties;</div>
+<div class="line"><a name="l02040"></a><span class="lineno"> 2040</span>&#160;    <span class="keyword">extern</span> PFN_vkGetPhysicalDeviceMemoryProperties vkGetPhysicalDeviceMemoryProperties;</div>
+<div class="line"><a name="l02041"></a><span class="lineno"> 2041</span>&#160;    <span class="keyword">extern</span> PFN_vkAllocateMemory vkAllocateMemory;</div>
+<div class="line"><a name="l02042"></a><span class="lineno"> 2042</span>&#160;    <span class="keyword">extern</span> PFN_vkFreeMemory vkFreeMemory;</div>
+<div class="line"><a name="l02043"></a><span class="lineno"> 2043</span>&#160;    <span class="keyword">extern</span> PFN_vkMapMemory vkMapMemory;</div>
+<div class="line"><a name="l02044"></a><span class="lineno"> 2044</span>&#160;    <span class="keyword">extern</span> PFN_vkUnmapMemory vkUnmapMemory;</div>
+<div class="line"><a name="l02045"></a><span class="lineno"> 2045</span>&#160;    <span class="keyword">extern</span> PFN_vkFlushMappedMemoryRanges vkFlushMappedMemoryRanges;</div>
+<div class="line"><a name="l02046"></a><span class="lineno"> 2046</span>&#160;    <span class="keyword">extern</span> PFN_vkInvalidateMappedMemoryRanges vkInvalidateMappedMemoryRanges;</div>
+<div class="line"><a name="l02047"></a><span class="lineno"> 2047</span>&#160;    <span class="keyword">extern</span> PFN_vkBindBufferMemory vkBindBufferMemory;</div>
+<div class="line"><a name="l02048"></a><span class="lineno"> 2048</span>&#160;    <span class="keyword">extern</span> PFN_vkBindImageMemory vkBindImageMemory;</div>
+<div class="line"><a name="l02049"></a><span class="lineno"> 2049</span>&#160;    <span class="keyword">extern</span> PFN_vkGetBufferMemoryRequirements vkGetBufferMemoryRequirements;</div>
+<div class="line"><a name="l02050"></a><span class="lineno"> 2050</span>&#160;    <span class="keyword">extern</span> PFN_vkGetImageMemoryRequirements vkGetImageMemoryRequirements;</div>
+<div class="line"><a name="l02051"></a><span class="lineno"> 2051</span>&#160;    <span class="keyword">extern</span> PFN_vkCreateBuffer vkCreateBuffer;</div>
+<div class="line"><a name="l02052"></a><span class="lineno"> 2052</span>&#160;    <span class="keyword">extern</span> PFN_vkDestroyBuffer vkDestroyBuffer;</div>
+<div class="line"><a name="l02053"></a><span class="lineno"> 2053</span>&#160;    <span class="keyword">extern</span> PFN_vkCreateImage vkCreateImage;</div>
+<div class="line"><a name="l02054"></a><span class="lineno"> 2054</span>&#160;    <span class="keyword">extern</span> PFN_vkDestroyImage vkDestroyImage;</div>
+<div class="line"><a name="l02055"></a><span class="lineno"> 2055</span>&#160;    <span class="keyword">extern</span> PFN_vkCmdCopyBuffer vkCmdCopyBuffer;</div>
+<div class="line"><a name="l02056"></a><span class="lineno"> 2056</span>&#160;<span class="preprocessor">    #if VMA_VULKAN_VERSION &gt;= 1001000</span></div>
+<div class="line"><a name="l02057"></a><span class="lineno"> 2057</span>&#160;        <span class="keyword">extern</span> PFN_vkGetBufferMemoryRequirements2 vkGetBufferMemoryRequirements2;</div>
+<div class="line"><a name="l02058"></a><span class="lineno"> 2058</span>&#160;        <span class="keyword">extern</span> PFN_vkGetImageMemoryRequirements2 vkGetImageMemoryRequirements2;</div>
+<div class="line"><a name="l02059"></a><span class="lineno"> 2059</span>&#160;        <span class="keyword">extern</span> PFN_vkBindBufferMemory2 vkBindBufferMemory2;</div>
+<div class="line"><a name="l02060"></a><span class="lineno"> 2060</span>&#160;        <span class="keyword">extern</span> PFN_vkBindImageMemory2 vkBindImageMemory2;</div>
+<div class="line"><a name="l02061"></a><span class="lineno"> 2061</span>&#160;        <span class="keyword">extern</span> PFN_vkGetPhysicalDeviceMemoryProperties2 vkGetPhysicalDeviceMemoryProperties2;</div>
+<div class="line"><a name="l02062"></a><span class="lineno"> 2062</span>&#160;<span class="preprocessor">    #endif </span><span class="comment">// #if VMA_VULKAN_VERSION &gt;= 1001000</span></div>
+<div class="line"><a name="l02063"></a><span class="lineno"> 2063</span>&#160;<span class="preprocessor">#endif </span><span class="comment">// #if defined(__ANDROID__) &amp;&amp; VMA_STATIC_VULKAN_FUNCTIONS &amp;&amp; VK_NO_PROTOTYPES</span></div>
+<div class="line"><a name="l02064"></a><span class="lineno"> 2064</span>&#160; </div>
+<div class="line"><a name="l02065"></a><span class="lineno"> 2065</span>&#160;<span class="preprocessor">#ifndef VULKAN_H_</span></div>
+<div class="line"><a name="l02066"></a><span class="lineno"> 2066</span>&#160;<span class="preprocessor">    #include &lt;vulkan/vulkan.h&gt;</span></div>
+<div class="line"><a name="l02067"></a><span class="lineno"> 2067</span>&#160;<span class="preprocessor">#endif</span></div>
+<div class="line"><a name="l02068"></a><span class="lineno"> 2068</span>&#160; </div>
+<div class="line"><a name="l02069"></a><span class="lineno"> 2069</span>&#160;<span class="comment">// Define this macro to declare maximum supported Vulkan version in format AAABBBCCC,</span></div>
+<div class="line"><a name="l02070"></a><span class="lineno"> 2070</span>&#160;<span class="comment">// where AAA = major, BBB = minor, CCC = patch.</span></div>
+<div class="line"><a name="l02071"></a><span class="lineno"> 2071</span>&#160;<span class="comment">// If you want to use version &gt; 1.0, it still needs to be enabled via VmaAllocatorCreateInfo::vulkanApiVersion.</span></div>
+<div class="line"><a name="l02072"></a><span class="lineno"> 2072</span>&#160;<span class="preprocessor">#if !defined(VMA_VULKAN_VERSION)</span></div>
+<div class="line"><a name="l02073"></a><span class="lineno"> 2073</span>&#160;<span class="preprocessor">    #if defined(VK_VERSION_1_2)</span></div>
+<div class="line"><a name="l02074"></a><span class="lineno"> 2074</span>&#160;<span class="preprocessor">        #define VMA_VULKAN_VERSION 1002000</span></div>
+<div class="line"><a name="l02075"></a><span class="lineno"> 2075</span>&#160;<span class="preprocessor">    #elif defined(VK_VERSION_1_1)</span></div>
+<div class="line"><a name="l02076"></a><span class="lineno"> 2076</span>&#160;<span class="preprocessor">        #define VMA_VULKAN_VERSION 1001000</span></div>
+<div class="line"><a name="l02077"></a><span class="lineno"> 2077</span>&#160;<span class="preprocessor">    #else</span></div>
+<div class="line"><a name="l02078"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#a1a2407c283893638cc039bb31fcd74b6"> 2078</a></span>&#160;<span class="preprocessor">        #define VMA_VULKAN_VERSION 1000000</span></div>
+<div class="line"><a name="l02079"></a><span class="lineno"> 2079</span>&#160;<span class="preprocessor">    #endif</span></div>
+<div class="line"><a name="l02080"></a><span class="lineno"> 2080</span>&#160;<span class="preprocessor">#endif</span></div>
+<div class="line"><a name="l02081"></a><span class="lineno"> 2081</span>&#160; </div>
+<div class="line"><a name="l02082"></a><span class="lineno"> 2082</span>&#160;<span class="preprocessor">#if !defined(VMA_DEDICATED_ALLOCATION)</span></div>
+<div class="line"><a name="l02083"></a><span class="lineno"> 2083</span>&#160;<span class="preprocessor">    #if VK_KHR_get_memory_requirements2 &amp;&amp; VK_KHR_dedicated_allocation</span></div>
+<div class="line"><a name="l02084"></a><span class="lineno"> 2084</span>&#160;<span class="preprocessor">        #define VMA_DEDICATED_ALLOCATION 1</span></div>
+<div class="line"><a name="l02085"></a><span class="lineno"> 2085</span>&#160;<span class="preprocessor">    #else</span></div>
+<div class="line"><a name="l02086"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#af7b860e63b96d11e44ae8587ba06bbf4"> 2086</a></span>&#160;<span class="preprocessor">        #define VMA_DEDICATED_ALLOCATION 0</span></div>
+<div class="line"><a name="l02087"></a><span class="lineno"> 2087</span>&#160;<span class="preprocessor">    #endif</span></div>
+<div class="line"><a name="l02088"></a><span class="lineno"> 2088</span>&#160;<span class="preprocessor">#endif</span></div>
+<div class="line"><a name="l02089"></a><span class="lineno"> 2089</span>&#160; </div>
+<div class="line"><a name="l02090"></a><span class="lineno"> 2090</span>&#160;<span class="preprocessor">#if !defined(VMA_BIND_MEMORY2)</span></div>
+<div class="line"><a name="l02091"></a><span class="lineno"> 2091</span>&#160;<span class="preprocessor">    #if VK_KHR_bind_memory2</span></div>
+<div class="line"><a name="l02092"></a><span class="lineno"> 2092</span>&#160;<span class="preprocessor">        #define VMA_BIND_MEMORY2 1</span></div>
+<div class="line"><a name="l02093"></a><span class="lineno"> 2093</span>&#160;<span class="preprocessor">    #else</span></div>
+<div class="line"><a name="l02094"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#a88bef97f86d70a34a4c0746e09a2680d"> 2094</a></span>&#160;<span class="preprocessor">        #define VMA_BIND_MEMORY2 0</span></div>
+<div class="line"><a name="l02095"></a><span class="lineno"> 2095</span>&#160;<span class="preprocessor">    #endif</span></div>
+<div class="line"><a name="l02096"></a><span class="lineno"> 2096</span>&#160;<span class="preprocessor">#endif</span></div>
+<div class="line"><a name="l02097"></a><span class="lineno"> 2097</span>&#160; </div>
+<div class="line"><a name="l02098"></a><span class="lineno"> 2098</span>&#160;<span class="preprocessor">#if !defined(VMA_MEMORY_BUDGET)</span></div>
+<div class="line"><a name="l02099"></a><span class="lineno"> 2099</span>&#160;<span class="preprocessor">    #if VK_EXT_memory_budget &amp;&amp; (VK_KHR_get_physical_device_properties2 || VMA_VULKAN_VERSION &gt;= 1001000)</span></div>
+<div class="line"><a name="l02100"></a><span class="lineno"> 2100</span>&#160;<span class="preprocessor">        #define VMA_MEMORY_BUDGET 1</span></div>
+<div class="line"><a name="l02101"></a><span class="lineno"> 2101</span>&#160;<span class="preprocessor">    #else</span></div>
+<div class="line"><a name="l02102"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#a05decf1cf4ebf767beba7acca6c1ec3a"> 2102</a></span>&#160;<span class="preprocessor">        #define VMA_MEMORY_BUDGET 0</span></div>
+<div class="line"><a name="l02103"></a><span class="lineno"> 2103</span>&#160;<span class="preprocessor">    #endif</span></div>
+<div class="line"><a name="l02104"></a><span class="lineno"> 2104</span>&#160;<span class="preprocessor">#endif</span></div>
+<div class="line"><a name="l02105"></a><span class="lineno"> 2105</span>&#160; </div>
+<div class="line"><a name="l02106"></a><span class="lineno"> 2106</span>&#160;<span class="comment">// Defined to 1 when VK_KHR_buffer_device_address device extension or equivalent core Vulkan 1.2 feature is defined in its headers.</span></div>
+<div class="line"><a name="l02107"></a><span class="lineno"> 2107</span>&#160;<span class="preprocessor">#if !defined(VMA_BUFFER_DEVICE_ADDRESS)</span></div>
+<div class="line"><a name="l02108"></a><span class="lineno"> 2108</span>&#160;<span class="preprocessor">    #if VK_KHR_buffer_device_address || VMA_VULKAN_VERSION &gt;= 1002000</span></div>
+<div class="line"><a name="l02109"></a><span class="lineno"> 2109</span>&#160;<span class="preprocessor">        #define VMA_BUFFER_DEVICE_ADDRESS 1</span></div>
+<div class="line"><a name="l02110"></a><span class="lineno"> 2110</span>&#160;<span class="preprocessor">    #else</span></div>
+<div class="line"><a name="l02111"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#a7f9d5e71b70dd1a137c303a8a8262c10"> 2111</a></span>&#160;<span class="preprocessor">        #define VMA_BUFFER_DEVICE_ADDRESS 0</span></div>
+<div class="line"><a name="l02112"></a><span class="lineno"> 2112</span>&#160;<span class="preprocessor">    #endif</span></div>
+<div class="line"><a name="l02113"></a><span class="lineno"> 2113</span>&#160;<span class="preprocessor">#endif</span></div>
+<div class="line"><a name="l02114"></a><span class="lineno"> 2114</span>&#160; </div>
+<div class="line"><a name="l02115"></a><span class="lineno"> 2115</span>&#160;<span class="comment">// Defined to 1 when VK_EXT_memory_priority device extension is defined in Vulkan headers.</span></div>
+<div class="line"><a name="l02116"></a><span class="lineno"> 2116</span>&#160;<span class="preprocessor">#if !defined(VMA_MEMORY_PRIORITY)</span></div>
+<div class="line"><a name="l02117"></a><span class="lineno"> 2117</span>&#160;<span class="preprocessor">    #if VK_EXT_memory_priority</span></div>
+<div class="line"><a name="l02118"></a><span class="lineno"> 2118</span>&#160;<span class="preprocessor">        #define VMA_MEMORY_PRIORITY 1</span></div>
+<div class="line"><a name="l02119"></a><span class="lineno"> 2119</span>&#160;<span class="preprocessor">    #else</span></div>
+<div class="line"><a name="l02120"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#a81af8a3a87e34bbb493848143cde43e4"> 2120</a></span>&#160;<span class="preprocessor">        #define VMA_MEMORY_PRIORITY 0</span></div>
+<div class="line"><a name="l02121"></a><span class="lineno"> 2121</span>&#160;<span class="preprocessor">    #endif</span></div>
+<div class="line"><a name="l02122"></a><span class="lineno"> 2122</span>&#160;<span class="preprocessor">#endif</span></div>
+<div class="line"><a name="l02123"></a><span class="lineno"> 2123</span>&#160; </div>
+<div class="line"><a name="l02124"></a><span class="lineno"> 2124</span>&#160;<span class="comment">// Define these macros to decorate all public functions with additional code,</span></div>
+<div class="line"><a name="l02125"></a><span class="lineno"> 2125</span>&#160;<span class="comment">// before and after returned type, appropriately. This may be useful for</span></div>
+<div class="line"><a name="l02126"></a><span class="lineno"> 2126</span>&#160;<span class="comment">// exporting the functions when compiling VMA as a separate library. Example:</span></div>
+<div class="line"><a name="l02127"></a><span class="lineno"> 2127</span>&#160;<span class="comment">// #define VMA_CALL_PRE  __declspec(dllexport)</span></div>
+<div class="line"><a name="l02128"></a><span class="lineno"> 2128</span>&#160;<span class="comment">// #define VMA_CALL_POST __cdecl</span></div>
+<div class="line"><a name="l02129"></a><span class="lineno"> 2129</span>&#160;<span class="preprocessor">#ifndef VMA_CALL_PRE</span></div>
+<div class="line"><a name="l02130"></a><span class="lineno"> 2130</span>&#160;<span class="preprocessor">    #define VMA_CALL_PRE</span></div>
+<div class="line"><a name="l02131"></a><span class="lineno"> 2131</span>&#160;<span class="preprocessor">#endif</span></div>
+<div class="line"><a name="l02132"></a><span class="lineno"> 2132</span>&#160;<span class="preprocessor">#ifndef VMA_CALL_POST</span></div>
+<div class="line"><a name="l02133"></a><span class="lineno"> 2133</span>&#160;<span class="preprocessor">    #define VMA_CALL_POST</span></div>
+<div class="line"><a name="l02134"></a><span class="lineno"> 2134</span>&#160;<span class="preprocessor">#endif</span></div>
+<div class="line"><a name="l02135"></a><span class="lineno"> 2135</span>&#160; </div>
+<div class="line"><a name="l02136"></a><span class="lineno"> 2136</span>&#160;<span class="comment">// Define this macro to decorate pointers with an attribute specifying the</span></div>
+<div class="line"><a name="l02137"></a><span class="lineno"> 2137</span>&#160;<span class="comment">// length of the array they point to if they are not null.</span></div>
+<div class="line"><a name="l02138"></a><span class="lineno"> 2138</span>&#160;<span class="comment">//</span></div>
+<div class="line"><a name="l02139"></a><span class="lineno"> 2139</span>&#160;<span class="comment">// The length may be one of</span></div>
+<div class="line"><a name="l02140"></a><span class="lineno"> 2140</span>&#160;<span class="comment">// - The name of another parameter in the argument list where the pointer is declared</span></div>
+<div class="line"><a name="l02141"></a><span class="lineno"> 2141</span>&#160;<span class="comment">// - The name of another member in the struct where the pointer is declared</span></div>
+<div class="line"><a name="l02142"></a><span class="lineno"> 2142</span>&#160;<span class="comment">// - The name of a member of a struct type, meaning the value of that member in</span></div>
+<div class="line"><a name="l02143"></a><span class="lineno"> 2143</span>&#160;<span class="comment">//   the context of the call. For example</span></div>
+<div class="line"><a name="l02144"></a><span class="lineno"> 2144</span>&#160;<span class="comment">//   VMA_LEN_IF_NOT_NULL(&quot;VkPhysicalDeviceMemoryProperties::memoryHeapCount&quot;),</span></div>
+<div class="line"><a name="l02145"></a><span class="lineno"> 2145</span>&#160;<span class="comment">//   this means the number of memory heaps available in the device associated</span></div>
+<div class="line"><a name="l02146"></a><span class="lineno"> 2146</span>&#160;<span class="comment">//   with the VmaAllocator being dealt with.</span></div>
+<div class="line"><a name="l02147"></a><span class="lineno"> 2147</span>&#160;<span class="preprocessor">#ifndef VMA_LEN_IF_NOT_NULL</span></div>
+<div class="line"><a name="l02148"></a><span class="lineno"> 2148</span>&#160;<span class="preprocessor">    #define VMA_LEN_IF_NOT_NULL(len)</span></div>
+<div class="line"><a name="l02149"></a><span class="lineno"> 2149</span>&#160;<span class="preprocessor">#endif</span></div>
+<div class="line"><a name="l02150"></a><span class="lineno"> 2150</span>&#160; </div>
+<div class="line"><a name="l02151"></a><span class="lineno"> 2151</span>&#160;<span class="comment">// The VMA_NULLABLE macro is defined to be _Nullable when compiling with Clang.</span></div>
+<div class="line"><a name="l02152"></a><span class="lineno"> 2152</span>&#160;<span class="comment">// see: https://clang.llvm.org/docs/AttributeReference.html#nullable</span></div>
+<div class="line"><a name="l02153"></a><span class="lineno"> 2153</span>&#160;<span class="preprocessor">#ifndef VMA_NULLABLE</span></div>
+<div class="line"><a name="l02154"></a><span class="lineno"> 2154</span>&#160;<span class="preprocessor">    #ifdef __clang__</span></div>
+<div class="line"><a name="l02155"></a><span class="lineno"> 2155</span>&#160;<span class="preprocessor">        #define VMA_NULLABLE _Nullable</span></div>
+<div class="line"><a name="l02156"></a><span class="lineno"> 2156</span>&#160;<span class="preprocessor">    #else</span></div>
+<div class="line"><a name="l02157"></a><span class="lineno"> 2157</span>&#160;<span class="preprocessor">        #define VMA_NULLABLE</span></div>
+<div class="line"><a name="l02158"></a><span class="lineno"> 2158</span>&#160;<span class="preprocessor">    #endif</span></div>
+<div class="line"><a name="l02159"></a><span class="lineno"> 2159</span>&#160;<span class="preprocessor">#endif</span></div>
+<div class="line"><a name="l02160"></a><span class="lineno"> 2160</span>&#160; </div>
+<div class="line"><a name="l02161"></a><span class="lineno"> 2161</span>&#160;<span class="comment">// The VMA_NOT_NULL macro is defined to be _Nonnull when compiling with Clang.</span></div>
+<div class="line"><a name="l02162"></a><span class="lineno"> 2162</span>&#160;<span class="comment">// see: https://clang.llvm.org/docs/AttributeReference.html#nonnull</span></div>
+<div class="line"><a name="l02163"></a><span class="lineno"> 2163</span>&#160;<span class="preprocessor">#ifndef VMA_NOT_NULL</span></div>
+<div class="line"><a name="l02164"></a><span class="lineno"> 2164</span>&#160;<span class="preprocessor">    #ifdef __clang__</span></div>
+<div class="line"><a name="l02165"></a><span class="lineno"> 2165</span>&#160;<span class="preprocessor">        #define VMA_NOT_NULL _Nonnull</span></div>
+<div class="line"><a name="l02166"></a><span class="lineno"> 2166</span>&#160;<span class="preprocessor">    #else</span></div>
+<div class="line"><a name="l02167"></a><span class="lineno"> 2167</span>&#160;<span class="preprocessor">        #define VMA_NOT_NULL</span></div>
+<div class="line"><a name="l02168"></a><span class="lineno"> 2168</span>&#160;<span class="preprocessor">    #endif</span></div>
+<div class="line"><a name="l02169"></a><span class="lineno"> 2169</span>&#160;<span class="preprocessor">#endif</span></div>
+<div class="line"><a name="l02170"></a><span class="lineno"> 2170</span>&#160; </div>
+<div class="line"><a name="l02171"></a><span class="lineno"> 2171</span>&#160;<span class="comment">// If non-dispatchable handles are represented as pointers then we can give</span></div>
+<div class="line"><a name="l02172"></a><span class="lineno"> 2172</span>&#160;<span class="comment">// then nullability annotations</span></div>
+<div class="line"><a name="l02173"></a><span class="lineno"> 2173</span>&#160;<span class="preprocessor">#ifndef VMA_NOT_NULL_NON_DISPATCHABLE</span></div>
+<div class="line"><a name="l02174"></a><span class="lineno"> 2174</span>&#160;<span class="preprocessor">    #if defined(__LP64__) || defined(_WIN64) || (defined(__x86_64__) &amp;&amp; !defined(__ILP32__) ) || defined(_M_X64) || defined(__ia64) || defined (_M_IA64) || defined(__aarch64__) || defined(__powerpc64__)</span></div>
+<div class="line"><a name="l02175"></a><span class="lineno"> 2175</span>&#160;<span class="preprocessor">        #define VMA_NOT_NULL_NON_DISPATCHABLE VMA_NOT_NULL</span></div>
+<div class="line"><a name="l02176"></a><span class="lineno"> 2176</span>&#160;<span class="preprocessor">    #else</span></div>
+<div class="line"><a name="l02177"></a><span class="lineno"> 2177</span>&#160;<span class="preprocessor">        #define VMA_NOT_NULL_NON_DISPATCHABLE</span></div>
+<div class="line"><a name="l02178"></a><span class="lineno"> 2178</span>&#160;<span class="preprocessor">    #endif</span></div>
+<div class="line"><a name="l02179"></a><span class="lineno"> 2179</span>&#160;<span class="preprocessor">#endif</span></div>
+<div class="line"><a name="l02180"></a><span class="lineno"> 2180</span>&#160; </div>
+<div class="line"><a name="l02181"></a><span class="lineno"> 2181</span>&#160;<span class="preprocessor">#ifndef VMA_NULLABLE_NON_DISPATCHABLE</span></div>
+<div class="line"><a name="l02182"></a><span class="lineno"> 2182</span>&#160;<span class="preprocessor">    #if defined(__LP64__) || defined(_WIN64) || (defined(__x86_64__) &amp;&amp; !defined(__ILP32__) ) || defined(_M_X64) || defined(__ia64) || defined (_M_IA64) || defined(__aarch64__) || defined(__powerpc64__)</span></div>
+<div class="line"><a name="l02183"></a><span class="lineno"> 2183</span>&#160;<span class="preprocessor">        #define VMA_NULLABLE_NON_DISPATCHABLE VMA_NULLABLE</span></div>
+<div class="line"><a name="l02184"></a><span class="lineno"> 2184</span>&#160;<span class="preprocessor">    #else</span></div>
+<div class="line"><a name="l02185"></a><span class="lineno"> 2185</span>&#160;<span class="preprocessor">        #define VMA_NULLABLE_NON_DISPATCHABLE</span></div>
+<div class="line"><a name="l02186"></a><span class="lineno"> 2186</span>&#160;<span class="preprocessor">    #endif</span></div>
+<div class="line"><a name="l02187"></a><span class="lineno"> 2187</span>&#160;<span class="preprocessor">#endif</span></div>
+<div class="line"><a name="l02188"></a><span class="lineno"> 2188</span>&#160; </div>
+<div class="line"><a name="l02198"></a><span class="lineno"> 2198</span>&#160;VK_DEFINE_HANDLE(<a class="code" href="struct_vma_allocator.html">VmaAllocator</a>)</div>
 <div class="line"><a name="l02199"></a><span class="lineno"> 2199</span>&#160; </div>
-<div class="line"><a name="l02200"></a><span class="lineno"> 2200</span>&#160;    <a class="code" href="vk__mem__alloc_8h.html#a4f87c9100d154a65a4ad495f7763cf7cae4d5ad929caba5f23eb502b13bd5286c">VMA_ALLOCATOR_CREATE_FLAG_BITS_MAX_ENUM</a> = 0x7FFFFFFF</div>
-<div class="line"><a name="l02201"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#afd73b95e737ee7e76f827cb5472f559f"> 2201</a></span>&#160;} <a class="code" href="vk__mem__alloc_8h.html#a4f87c9100d154a65a4ad495f7763cf7c">VmaAllocatorCreateFlagBits</a>;</div>
-<div class="line"><a name="l02202"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#acfe6863e160722c2c1bbcf7573fddc4d"> 2202</a></span>&#160;<span class="keyword">typedef</span> VkFlags <a class="code" href="vk__mem__alloc_8h.html#acfe6863e160722c2c1bbcf7573fddc4d">VmaAllocatorCreateFlags</a>;</div>
-<div class="line"><a name="l02203"></a><span class="lineno"> 2203</span>&#160; </div>
-<div class="line"><a name="l02208"></a><span class="lineno"><a class="line" href="struct_vma_vulkan_functions.html"> 2208</a></span>&#160;<span class="keyword">typedef</span> <span class="keyword">struct </span><a class="code" href="struct_vma_vulkan_functions.html">VmaVulkanFunctions</a> {</div>
-<div class="line"><a name="l02209"></a><span class="lineno"><a class="line" href="struct_vma_vulkan_functions.html#a77b7a74082823e865dd6546623468f96"> 2209</a></span>&#160;    PFN_vkGetPhysicalDeviceProperties VMA_NULLABLE <a class="code" href="struct_vma_vulkan_functions.html#a77b7a74082823e865dd6546623468f96">vkGetPhysicalDeviceProperties</a>;</div>
-<div class="line"><a name="l02210"></a><span class="lineno"><a class="line" href="struct_vma_vulkan_functions.html#a60d25c33bba06bb8592e6875cbaa9830"> 2210</a></span>&#160;    PFN_vkGetPhysicalDeviceMemoryProperties VMA_NULLABLE <a class="code" href="struct_vma_vulkan_functions.html#a60d25c33bba06bb8592e6875cbaa9830">vkGetPhysicalDeviceMemoryProperties</a>;</div>
-<div class="line"><a name="l02211"></a><span class="lineno"><a class="line" href="struct_vma_vulkan_functions.html#a2943bf99dfd784a0e8f599d987e22e6c"> 2211</a></span>&#160;    PFN_vkAllocateMemory VMA_NULLABLE <a class="code" href="struct_vma_vulkan_functions.html#a2943bf99dfd784a0e8f599d987e22e6c">vkAllocateMemory</a>;</div>
-<div class="line"><a name="l02212"></a><span class="lineno"><a class="line" href="struct_vma_vulkan_functions.html#a4c658701778564d62034255b5dda91b4"> 2212</a></span>&#160;    PFN_vkFreeMemory VMA_NULLABLE <a class="code" href="struct_vma_vulkan_functions.html#a4c658701778564d62034255b5dda91b4">vkFreeMemory</a>;</div>
-<div class="line"><a name="l02213"></a><span class="lineno"><a class="line" href="struct_vma_vulkan_functions.html#ab5c1f38dea3a2cf00dc9eb4f57218c49"> 2213</a></span>&#160;    PFN_vkMapMemory VMA_NULLABLE <a class="code" href="struct_vma_vulkan_functions.html#ab5c1f38dea3a2cf00dc9eb4f57218c49">vkMapMemory</a>;</div>
-<div class="line"><a name="l02214"></a><span class="lineno"><a class="line" href="struct_vma_vulkan_functions.html#acc798589736f0becb317fc2196c1d8b9"> 2214</a></span>&#160;    PFN_vkUnmapMemory VMA_NULLABLE <a class="code" href="struct_vma_vulkan_functions.html#acc798589736f0becb317fc2196c1d8b9">vkUnmapMemory</a>;</div>
-<div class="line"><a name="l02215"></a><span class="lineno"><a class="line" href="struct_vma_vulkan_functions.html#a33c322f4c4ad2810f8a9c97a277572f9"> 2215</a></span>&#160;    PFN_vkFlushMappedMemoryRanges VMA_NULLABLE <a class="code" href="struct_vma_vulkan_functions.html#a33c322f4c4ad2810f8a9c97a277572f9">vkFlushMappedMemoryRanges</a>;</div>
-<div class="line"><a name="l02216"></a><span class="lineno"><a class="line" href="struct_vma_vulkan_functions.html#a5c1093bc32386a8060c37c9f282078a1"> 2216</a></span>&#160;    PFN_vkInvalidateMappedMemoryRanges VMA_NULLABLE <a class="code" href="struct_vma_vulkan_functions.html#a5c1093bc32386a8060c37c9f282078a1">vkInvalidateMappedMemoryRanges</a>;</div>
-<div class="line"><a name="l02217"></a><span class="lineno"><a class="line" href="struct_vma_vulkan_functions.html#a94fc4f3a605d9880bb3c0ba2c2fc80b2"> 2217</a></span>&#160;    PFN_vkBindBufferMemory VMA_NULLABLE <a class="code" href="struct_vma_vulkan_functions.html#a94fc4f3a605d9880bb3c0ba2c2fc80b2">vkBindBufferMemory</a>;</div>
-<div class="line"><a name="l02218"></a><span class="lineno"><a class="line" href="struct_vma_vulkan_functions.html#a1338d96a128a5ade648b8d934907c637"> 2218</a></span>&#160;    PFN_vkBindImageMemory VMA_NULLABLE <a class="code" href="struct_vma_vulkan_functions.html#a1338d96a128a5ade648b8d934907c637">vkBindImageMemory</a>;</div>
-<div class="line"><a name="l02219"></a><span class="lineno"><a class="line" href="struct_vma_vulkan_functions.html#a5b92901df89a4194b0d12f6071d4d143"> 2219</a></span>&#160;    PFN_vkGetBufferMemoryRequirements VMA_NULLABLE <a class="code" href="struct_vma_vulkan_functions.html#a5b92901df89a4194b0d12f6071d4d143">vkGetBufferMemoryRequirements</a>;</div>
-<div class="line"><a name="l02220"></a><span class="lineno"><a class="line" href="struct_vma_vulkan_functions.html#a475f6f49f8debe4d10800592606d53f4"> 2220</a></span>&#160;    PFN_vkGetImageMemoryRequirements VMA_NULLABLE <a class="code" href="struct_vma_vulkan_functions.html#a475f6f49f8debe4d10800592606d53f4">vkGetImageMemoryRequirements</a>;</div>
-<div class="line"><a name="l02221"></a><span class="lineno"><a class="line" href="struct_vma_vulkan_functions.html#ae8084315a25006271a2edfc3a447519f"> 2221</a></span>&#160;    PFN_vkCreateBuffer VMA_NULLABLE <a class="code" href="struct_vma_vulkan_functions.html#ae8084315a25006271a2edfc3a447519f">vkCreateBuffer</a>;</div>
-<div class="line"><a name="l02222"></a><span class="lineno"><a class="line" href="struct_vma_vulkan_functions.html#a7e054606faddb07f0e8556f3ed317d45"> 2222</a></span>&#160;    PFN_vkDestroyBuffer VMA_NULLABLE <a class="code" href="struct_vma_vulkan_functions.html#a7e054606faddb07f0e8556f3ed317d45">vkDestroyBuffer</a>;</div>
-<div class="line"><a name="l02223"></a><span class="lineno"><a class="line" href="struct_vma_vulkan_functions.html#a23ebe70be515b9b5010a1d691200e325"> 2223</a></span>&#160;    PFN_vkCreateImage VMA_NULLABLE <a class="code" href="struct_vma_vulkan_functions.html#a23ebe70be515b9b5010a1d691200e325">vkCreateImage</a>;</div>
-<div class="line"><a name="l02224"></a><span class="lineno"><a class="line" href="struct_vma_vulkan_functions.html#a90b898227039b1dcb3520f6e91f09ffa"> 2224</a></span>&#160;    PFN_vkDestroyImage VMA_NULLABLE <a class="code" href="struct_vma_vulkan_functions.html#a90b898227039b1dcb3520f6e91f09ffa">vkDestroyImage</a>;</div>
-<div class="line"><a name="l02225"></a><span class="lineno"><a class="line" href="struct_vma_vulkan_functions.html#ae5c0db8c89a3b82593dc16aa6a49fa3a"> 2225</a></span>&#160;    PFN_vkCmdCopyBuffer VMA_NULLABLE <a class="code" href="struct_vma_vulkan_functions.html#ae5c0db8c89a3b82593dc16aa6a49fa3a">vkCmdCopyBuffer</a>;</div>
-<div class="line"><a name="l02226"></a><span class="lineno"> 2226</span>&#160;<span class="preprocessor">#if VMA_DEDICATED_ALLOCATION || VMA_VULKAN_VERSION &gt;= 1001000</span></div>
-<div class="line"><a name="l02227"></a><span class="lineno"> 2227</span>&#160;    PFN_vkGetBufferMemoryRequirements2KHR VMA_NULLABLE vkGetBufferMemoryRequirements2KHR;</div>
-<div class="line"><a name="l02228"></a><span class="lineno"> 2228</span>&#160;    PFN_vkGetImageMemoryRequirements2KHR VMA_NULLABLE vkGetImageMemoryRequirements2KHR;</div>
-<div class="line"><a name="l02229"></a><span class="lineno"> 2229</span>&#160;<span class="preprocessor">#endif</span></div>
-<div class="line"><a name="l02230"></a><span class="lineno"> 2230</span>&#160;<span class="preprocessor">#if VMA_BIND_MEMORY2 || VMA_VULKAN_VERSION &gt;= 1001000</span></div>
-<div class="line"><a name="l02231"></a><span class="lineno"> 2231</span>&#160;    PFN_vkBindBufferMemory2KHR VMA_NULLABLE vkBindBufferMemory2KHR;</div>
-<div class="line"><a name="l02232"></a><span class="lineno"> 2232</span>&#160;    PFN_vkBindImageMemory2KHR VMA_NULLABLE vkBindImageMemory2KHR;</div>
-<div class="line"><a name="l02233"></a><span class="lineno"> 2233</span>&#160;<span class="preprocessor">#endif</span></div>
-<div class="line"><a name="l02234"></a><span class="lineno"> 2234</span>&#160;<span class="preprocessor">#if VMA_MEMORY_BUDGET || VMA_VULKAN_VERSION &gt;= 1001000</span></div>
-<div class="line"><a name="l02235"></a><span class="lineno"> 2235</span>&#160;    PFN_vkGetPhysicalDeviceMemoryProperties2KHR VMA_NULLABLE vkGetPhysicalDeviceMemoryProperties2KHR;</div>
-<div class="line"><a name="l02236"></a><span class="lineno"> 2236</span>&#160;<span class="preprocessor">#endif</span></div>
-<div class="line"><a name="l02237"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#abb0a8e3b5040d847571cca6c7f9a8074"> 2237</a></span>&#160;} <a class="code" href="vk__mem__alloc_8h.html#abb0a8e3b5040d847571cca6c7f9a8074">VmaVulkanFunctions</a>;</div>
-<div class="line"><a name="l02238"></a><span class="lineno"> 2238</span>&#160; </div>
-<div class="line"><a name="l02240"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#a4dd2c44642312a147a4e93373a6e64d2"> 2240</a></span>&#160;<span class="keyword">typedef</span> <span class="keyword">enum</span> <a class="code" href="vk__mem__alloc_8h.html#a4dd2c44642312a147a4e93373a6e64d2">VmaRecordFlagBits</a> {</div>
-<div class="line"><a name="l02246"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#a4dd2c44642312a147a4e93373a6e64d2a8e7ab322e8732654be627c4ea8f36cc7"> 2246</a></span>&#160;    <a class="code" href="vk__mem__alloc_8h.html#a4dd2c44642312a147a4e93373a6e64d2a8e7ab322e8732654be627c4ea8f36cc7">VMA_RECORD_FLUSH_AFTER_CALL_BIT</a> = 0x00000001,</div>
-<div class="line"><a name="l02247"></a><span class="lineno"> 2247</span>&#160;    </div>
-<div class="line"><a name="l02248"></a><span class="lineno"> 2248</span>&#160;    <a class="code" href="vk__mem__alloc_8h.html#a4dd2c44642312a147a4e93373a6e64d2a20dd17d69966dbffa054739d6090b85e">VMA_RECORD_FLAG_BITS_MAX_ENUM</a> = 0x7FFFFFFF</div>
-<div class="line"><a name="l02249"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#acd24d5eb58abff7e1f43cb32a1ba1413"> 2249</a></span>&#160;} <a class="code" href="vk__mem__alloc_8h.html#a4dd2c44642312a147a4e93373a6e64d2">VmaRecordFlagBits</a>;</div>
-<div class="line"><a name="l02250"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#af3929a1a4547c592fc0b0e55ef452828"> 2250</a></span>&#160;<span class="keyword">typedef</span> VkFlags <a class="code" href="vk__mem__alloc_8h.html#af3929a1a4547c592fc0b0e55ef452828">VmaRecordFlags</a>;</div>
-<div class="line"><a name="l02251"></a><span class="lineno"> 2251</span>&#160; </div>
-<div class="line"><a name="l02253"></a><span class="lineno"><a class="line" href="struct_vma_record_settings.html"> 2253</a></span>&#160;<span class="keyword">typedef</span> <span class="keyword">struct </span><a class="code" href="struct_vma_record_settings.html">VmaRecordSettings</a></div>
-<div class="line"><a name="l02254"></a><span class="lineno"> 2254</span>&#160;{</div>
-<div class="line"><a name="l02256"></a><span class="lineno"><a class="line" href="struct_vma_record_settings.html#ad8fdcc92119ae7a8c08c1a564c01d63a"> 2256</a></span>&#160;    <a class="code" href="vk__mem__alloc_8h.html#af3929a1a4547c592fc0b0e55ef452828">VmaRecordFlags</a> <a class="code" href="struct_vma_record_settings.html#ad8fdcc92119ae7a8c08c1a564c01d63a">flags</a>;</div>
-<div class="line"><a name="l02264"></a><span class="lineno"><a class="line" href="struct_vma_record_settings.html#a6cb1fdbf6bcb610b68f2010dd629e89d"> 2264</a></span>&#160;    <span class="keyword">const</span> <span class="keywordtype">char</span>* VMA_NOT_NULL <a class="code" href="struct_vma_record_settings.html#a6cb1fdbf6bcb610b68f2010dd629e89d">pFilePath</a>;</div>
-<div class="line"><a name="l02265"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#a16e21c877101493fce582664cd8754fc"> 2265</a></span>&#160;} <a class="code" href="vk__mem__alloc_8h.html#a16e21c877101493fce582664cd8754fc">VmaRecordSettings</a>;</div>
-<div class="line"><a name="l02266"></a><span class="lineno"> 2266</span>&#160; </div>
-<div class="line"><a name="l02268"></a><span class="lineno"><a class="line" href="struct_vma_allocator_create_info.html"> 2268</a></span>&#160;<span class="keyword">typedef</span> <span class="keyword">struct </span><a class="code" href="struct_vma_allocator_create_info.html">VmaAllocatorCreateInfo</a></div>
-<div class="line"><a name="l02269"></a><span class="lineno"> 2269</span>&#160;{</div>
-<div class="line"><a name="l02271"></a><span class="lineno"><a class="line" href="struct_vma_allocator_create_info.html#a392ea2ecbaff93f91a7c49f735ad4346"> 2271</a></span>&#160;    <a class="code" href="vk__mem__alloc_8h.html#acfe6863e160722c2c1bbcf7573fddc4d">VmaAllocatorCreateFlags</a> <a class="code" href="struct_vma_allocator_create_info.html#a392ea2ecbaff93f91a7c49f735ad4346">flags</a>;</div>
-<div class="line"><a name="l02273"></a><span class="lineno"> 2273</span>&#160; </div>
-<div class="line"><a name="l02274"></a><span class="lineno"><a class="line" href="struct_vma_allocator_create_info.html#a08230f04ae6ccf8a78150a9e829a7156"> 2274</a></span>&#160;    VkPhysicalDevice VMA_NOT_NULL <a class="code" href="struct_vma_allocator_create_info.html#a08230f04ae6ccf8a78150a9e829a7156">physicalDevice</a>;</div>
-<div class="line"><a name="l02276"></a><span class="lineno"> 2276</span>&#160; </div>
-<div class="line"><a name="l02277"></a><span class="lineno"><a class="line" href="struct_vma_allocator_create_info.html#ad924ddd77b04039c88d0c09b0ffcd500"> 2277</a></span>&#160;    VkDevice VMA_NOT_NULL <a class="code" href="struct_vma_allocator_create_info.html#ad924ddd77b04039c88d0c09b0ffcd500">device</a>;</div>
-<div class="line"><a name="l02279"></a><span class="lineno"> 2279</span>&#160; </div>
-<div class="line"><a name="l02280"></a><span class="lineno"><a class="line" href="struct_vma_allocator_create_info.html#a8e4714298e3121cdd8b214a1ae7a637a"> 2280</a></span>&#160;    VkDeviceSize <a class="code" href="struct_vma_allocator_create_info.html#a8e4714298e3121cdd8b214a1ae7a637a">preferredLargeHeapBlockSize</a>;</div>
-<div class="line"><a name="l02282"></a><span class="lineno"> 2282</span>&#160; </div>
-<div class="line"><a name="l02283"></a><span class="lineno"><a class="line" href="struct_vma_allocator_create_info.html#a6e409087e3be55400d0e4ccbe43c608d"> 2283</a></span>&#160;    <span class="keyword">const</span> VkAllocationCallbacks* VMA_NULLABLE <a class="code" href="struct_vma_allocator_create_info.html#a6e409087e3be55400d0e4ccbe43c608d">pAllocationCallbacks</a>;</div>
-<div class="line"><a name="l02285"></a><span class="lineno"> 2285</span>&#160; </div>
-<div class="line"><a name="l02286"></a><span class="lineno"><a class="line" href="struct_vma_allocator_create_info.html#af1380969b5e1ea4c3184a877892d260e"> 2286</a></span>&#160;    <span class="keyword">const</span> <a class="code" href="struct_vma_device_memory_callbacks.html">VmaDeviceMemoryCallbacks</a>* VMA_NULLABLE <a class="code" href="struct_vma_allocator_create_info.html#af1380969b5e1ea4c3184a877892d260e">pDeviceMemoryCallbacks</a>;</div>
-<div class="line"><a name="l02300"></a><span class="lineno"><a class="line" href="struct_vma_allocator_create_info.html#a21ea188dd212b8171cb9ecbed4a2a3a7"> 2300</a></span>&#160;    uint32_t <a class="code" href="struct_vma_allocator_create_info.html#a21ea188dd212b8171cb9ecbed4a2a3a7">frameInUseCount</a>;</div>
-<div class="line"><a name="l02325"></a><span class="lineno"><a class="line" href="struct_vma_allocator_create_info.html#a31c192aa6cbffa33279f6d9f0c47c44b"> 2325</a></span>&#160;    <span class="keyword">const</span> VkDeviceSize* VMA_NULLABLE VMA_LEN_IF_NOT_NULL(<span class="stringliteral">&quot;VkPhysicalDeviceMemoryProperties::memoryHeapCount&quot;</span>) <a class="code" href="struct_vma_allocator_create_info.html#a31c192aa6cbffa33279f6d9f0c47c44b">pHeapSizeLimit</a>;</div>
-<div class="line"><a name="l02326"></a><span class="lineno"> 2326</span>&#160; </div>
-<div class="line"><a name="l02331"></a><span class="lineno"><a class="line" href="struct_vma_allocator_create_info.html#a3dc197be3227da7338b1643f70db36bd"> 2331</a></span>&#160;    const <a class="code" href="struct_vma_vulkan_functions.html">VmaVulkanFunctions</a>* VMA_NULLABLE <a class="code" href="struct_vma_allocator_create_info.html#a3dc197be3227da7338b1643f70db36bd">pVulkanFunctions</a>;</div>
-<div class="line"><a name="l02338"></a><span class="lineno"><a class="line" href="struct_vma_allocator_create_info.html#ace2aa4877b16a42b0b7673d4e26000ee"> 2338</a></span>&#160;    const <a class="code" href="struct_vma_record_settings.html">VmaRecordSettings</a>* VMA_NULLABLE <a class="code" href="struct_vma_allocator_create_info.html#ace2aa4877b16a42b0b7673d4e26000ee">pRecordSettings</a>;</div>
-<div class="line"><a name="l02343"></a><span class="lineno"><a class="line" href="struct_vma_allocator_create_info.html#a70dd42e29b1df1d1b9b61532ae0b370b"> 2343</a></span>&#160;    VkInstance VMA_NOT_NULL <a class="code" href="struct_vma_allocator_create_info.html#a70dd42e29b1df1d1b9b61532ae0b370b">instance</a>;</div>
-<div class="line"><a name="l02352"></a><span class="lineno"><a class="line" href="struct_vma_allocator_create_info.html#ae0ffc55139b54520a6bb704b29ffc285"> 2352</a></span>&#160;    uint32_t <a class="code" href="struct_vma_allocator_create_info.html#ae0ffc55139b54520a6bb704b29ffc285">vulkanApiVersion</a>;</div>
-<div class="line"><a name="l02353"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#aad9652301d33759b83e52d4f3605a14a"> 2353</a></span>&#160;} <a class="code" href="struct_vma_allocator_create_info.html">VmaAllocatorCreateInfo</a>;</div>
-<div class="line"><a name="l02354"></a><span class="lineno"> 2354</span>&#160; </div>
-<div class="line"><a name="l02356"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#a200692051ddb34240248234f5f4c17bb"> 2356</a></span>&#160;VMA_CALL_PRE VkResult VMA_CALL_POST <a class="code" href="vk__mem__alloc_8h.html#a200692051ddb34240248234f5f4c17bb">vmaCreateAllocator</a>(</div>
-<div class="line"><a name="l02357"></a><span class="lineno"> 2357</span>&#160;    const <a class="code" href="struct_vma_allocator_create_info.html">VmaAllocatorCreateInfo</a>* VMA_NOT_NULL pCreateInfo,</div>
-<div class="line"><a name="l02358"></a><span class="lineno"> 2358</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> VMA_NULLABLE * VMA_NOT_NULL pAllocator);</div>
-<div class="line"><a name="l02359"></a><span class="lineno"> 2359</span>&#160; </div>
-<div class="line"><a name="l02361"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#aa8d164061c88f22fb1fd3c8f3534bc1d"> 2361</a></span>&#160;VMA_CALL_PRE <span class="keywordtype">void</span> VMA_CALL_POST <a class="code" href="vk__mem__alloc_8h.html#aa8d164061c88f22fb1fd3c8f3534bc1d">vmaDestroyAllocator</a>(</div>
-<div class="line"><a name="l02362"></a><span class="lineno"> 2362</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> VMA_NULLABLE allocator);</div>
-<div class="line"><a name="l02363"></a><span class="lineno"> 2363</span>&#160; </div>
-<div class="line"><a name="l02366"></a><span class="lineno"><a class="line" href="struct_vma_allocator_info.html"> 2366</a></span>&#160;typedef struct <a class="code" href="struct_vma_allocator_info.html">VmaAllocatorInfo</a></div>
-<div class="line"><a name="l02367"></a><span class="lineno"> 2367</span>&#160;{</div>
-<div class="line"><a name="l02372"></a><span class="lineno"><a class="line" href="struct_vma_allocator_info.html#a2ed6a4d2d3fea039d66a13f15d0ce5fe"> 2372</a></span>&#160;    VkInstance VMA_NOT_NULL <a class="code" href="struct_vma_allocator_info.html#a2ed6a4d2d3fea039d66a13f15d0ce5fe">instance</a>;</div>
-<div class="line"><a name="l02377"></a><span class="lineno"><a class="line" href="struct_vma_allocator_info.html#aba2b703f96e51d567717e1fb2935b47a"> 2377</a></span>&#160;    VkPhysicalDevice VMA_NOT_NULL <a class="code" href="struct_vma_allocator_info.html#aba2b703f96e51d567717e1fb2935b47a">physicalDevice</a>;</div>
-<div class="line"><a name="l02382"></a><span class="lineno"><a class="line" href="struct_vma_allocator_info.html#a012b4c485bf3b0ea8921352c5ee0c357"> 2382</a></span>&#160;    VkDevice VMA_NOT_NULL <a class="code" href="struct_vma_allocator_info.html#a012b4c485bf3b0ea8921352c5ee0c357">device</a>;</div>
-<div class="line"><a name="l02383"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#a1988031b0223fdbd564250fa1edd942c"> 2383</a></span>&#160;} <a class="code" href="vk__mem__alloc_8h.html#a1988031b0223fdbd564250fa1edd942c">VmaAllocatorInfo</a>;</div>
-<div class="line"><a name="l02384"></a><span class="lineno"> 2384</span>&#160; </div>
-<div class="line"><a name="l02390"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#afa02231a791b37255720d566a52683e7"> 2390</a></span>&#160;VMA_CALL_PRE <span class="keywordtype">void</span> VMA_CALL_POST <a class="code" href="vk__mem__alloc_8h.html#afa02231a791b37255720d566a52683e7">vmaGetAllocatorInfo</a>(<a class="code" href="struct_vma_allocator.html">VmaAllocator</a> VMA_NOT_NULL allocator, <a class="code" href="struct_vma_allocator_info.html">VmaAllocatorInfo</a>* VMA_NOT_NULL pAllocatorInfo);</div>
+<div class="line"><a name="l02200"></a><span class="lineno"> 2200</span>&#160;<span class="keyword">typedef</span> void (VKAPI_PTR *<a class="code" href="vk__mem__alloc_8h.html#a7e1ed85f7799600b03ad51a77acc21f3">PFN_vmaAllocateDeviceMemoryFunction</a>)(</div>
+<div class="line"><a name="l02202"></a><span class="lineno"> 2202</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> VMA_NOT_NULL                    allocator,</div>
+<div class="line"><a name="l02203"></a><span class="lineno"> 2203</span>&#160;    uint32_t                                     memoryType,</div>
+<div class="line"><a name="l02204"></a><span class="lineno"> 2204</span>&#160;    VkDeviceMemory VMA_NOT_NULL_NON_DISPATCHABLE memory,</div>
+<div class="line"><a name="l02205"></a><span class="lineno"> 2205</span>&#160;    VkDeviceSize                                 size,</div>
+<div class="line"><a name="l02206"></a><span class="lineno"> 2206</span>&#160;    <span class="keywordtype">void</span>* VMA_NULLABLE                           pUserData);</div>
+<div class="line"><a name="l02208"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#a154ccaaf53dc2c36378f80f0c4f3679b"> 2208</a></span>&#160;<span class="keyword">typedef</span> void (VKAPI_PTR *<a class="code" href="vk__mem__alloc_8h.html#a154ccaaf53dc2c36378f80f0c4f3679b">PFN_vmaFreeDeviceMemoryFunction</a>)(</div>
+<div class="line"><a name="l02209"></a><span class="lineno"> 2209</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> VMA_NOT_NULL                    allocator,</div>
+<div class="line"><a name="l02210"></a><span class="lineno"> 2210</span>&#160;    uint32_t                                     memoryType,</div>
+<div class="line"><a name="l02211"></a><span class="lineno"> 2211</span>&#160;    VkDeviceMemory VMA_NOT_NULL_NON_DISPATCHABLE memory,</div>
+<div class="line"><a name="l02212"></a><span class="lineno"> 2212</span>&#160;    VkDeviceSize                                 size,</div>
+<div class="line"><a name="l02213"></a><span class="lineno"> 2213</span>&#160;    <span class="keywordtype">void</span>* VMA_NULLABLE                           pUserData);</div>
+<div class="line"><a name="l02214"></a><span class="lineno"> 2214</span>&#160; </div>
+<div class="line"><a name="l02222"></a><span class="lineno"><a class="line" href="struct_vma_device_memory_callbacks.html"> 2222</a></span>&#160;<span class="keyword">typedef</span> <span class="keyword">struct </span><a class="code" href="struct_vma_device_memory_callbacks.html">VmaDeviceMemoryCallbacks</a> {</div>
+<div class="line"><a name="l02224"></a><span class="lineno"><a class="line" href="struct_vma_device_memory_callbacks.html#a4f17f7b255101e733b44d5633aceabfb"> 2224</a></span>&#160;    <a class="code" href="vk__mem__alloc_8h.html#a7e1ed85f7799600b03ad51a77acc21f3">PFN_vmaAllocateDeviceMemoryFunction</a> VMA_NULLABLE <a class="code" href="struct_vma_device_memory_callbacks.html#a4f17f7b255101e733b44d5633aceabfb">pfnAllocate</a>;</div>
+<div class="line"><a name="l02226"></a><span class="lineno"><a class="line" href="struct_vma_device_memory_callbacks.html#abe8a3328bbc916f6f712fdb6b299444c"> 2226</a></span>&#160;    <a class="code" href="vk__mem__alloc_8h.html#a154ccaaf53dc2c36378f80f0c4f3679b">PFN_vmaFreeDeviceMemoryFunction</a> VMA_NULLABLE <a class="code" href="struct_vma_device_memory_callbacks.html#abe8a3328bbc916f6f712fdb6b299444c">pfnFree</a>;</div>
+<div class="line"><a name="l02228"></a><span class="lineno"><a class="line" href="struct_vma_device_memory_callbacks.html#a24052de0937ddd54015a2df0363903c6"> 2228</a></span>&#160;    <span class="keywordtype">void</span>* VMA_NULLABLE <a class="code" href="struct_vma_device_memory_callbacks.html#a24052de0937ddd54015a2df0363903c6">pUserData</a>;</div>
+<div class="line"><a name="l02229"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#a77692d3c8770ea8882d573206bd27b2b"> 2229</a></span>&#160;} <a class="code" href="vk__mem__alloc_8h.html#a77692d3c8770ea8882d573206bd27b2b">VmaDeviceMemoryCallbacks</a>;</div>
+<div class="line"><a name="l02230"></a><span class="lineno"> 2230</span>&#160; </div>
+<div class="line"><a name="l02232"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#a4f87c9100d154a65a4ad495f7763cf7c"> 2232</a></span>&#160;<span class="keyword">typedef</span> <span class="keyword">enum</span> <a class="code" href="vk__mem__alloc_8h.html#a4f87c9100d154a65a4ad495f7763cf7c">VmaAllocatorCreateFlagBits</a> {</div>
+<div class="line"><a name="l02237"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#a4f87c9100d154a65a4ad495f7763cf7ca4816ddaed324ba110172ca608a20f29d"> 2237</a></span>&#160;    <a class="code" href="vk__mem__alloc_8h.html#a4f87c9100d154a65a4ad495f7763cf7ca4816ddaed324ba110172ca608a20f29d">VMA_ALLOCATOR_CREATE_EXTERNALLY_SYNCHRONIZED_BIT</a> = 0x00000001,</div>
+<div class="line"><a name="l02262"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#a4f87c9100d154a65a4ad495f7763cf7cace7da7cc6e71a625dfa763c55a597878"> 2262</a></span>&#160;    <a class="code" href="vk__mem__alloc_8h.html#a4f87c9100d154a65a4ad495f7763cf7cace7da7cc6e71a625dfa763c55a597878">VMA_ALLOCATOR_CREATE_KHR_DEDICATED_ALLOCATION_BIT</a> = 0x00000002,</div>
+<div class="line"><a name="l02277"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#a4f87c9100d154a65a4ad495f7763cf7ca8fb75bf07cd184ab903596295e863dee"> 2277</a></span>&#160;    <a class="code" href="vk__mem__alloc_8h.html#a4f87c9100d154a65a4ad495f7763cf7ca8fb75bf07cd184ab903596295e863dee">VMA_ALLOCATOR_CREATE_KHR_BIND_MEMORY2_BIT</a> = 0x00000004,</div>
+<div class="line"><a name="l02289"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#a4f87c9100d154a65a4ad495f7763cf7ca4d4687863f7bd4b418c6006dc04400b0"> 2289</a></span>&#160;    <a class="code" href="vk__mem__alloc_8h.html#a4f87c9100d154a65a4ad495f7763cf7ca4d4687863f7bd4b418c6006dc04400b0">VMA_ALLOCATOR_CREATE_EXT_MEMORY_BUDGET_BIT</a> = 0x00000008,</div>
+<div class="line"><a name="l02307"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#a4f87c9100d154a65a4ad495f7763cf7ca2acce4886d8078552efa38878413970f"> 2307</a></span>&#160;    <a class="code" href="vk__mem__alloc_8h.html#a4f87c9100d154a65a4ad495f7763cf7ca2acce4886d8078552efa38878413970f">VMA_ALLOCATOR_CREATE_AMD_DEVICE_COHERENT_MEMORY_BIT</a> = 0x00000010,</div>
+<div class="line"><a name="l02325"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#a4f87c9100d154a65a4ad495f7763cf7ca5f1b28b0414319d1687e1f2b30ab0089"> 2325</a></span>&#160;    <a class="code" href="vk__mem__alloc_8h.html#a4f87c9100d154a65a4ad495f7763cf7ca5f1b28b0414319d1687e1f2b30ab0089">VMA_ALLOCATOR_CREATE_BUFFER_DEVICE_ADDRESS_BIT</a> = 0x00000020,</div>
+<div class="line"><a name="l02342"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#a4f87c9100d154a65a4ad495f7763cf7caffdd7a5169be3dbd7cbf6b3619e4f78a"> 2342</a></span>&#160;    <a class="code" href="vk__mem__alloc_8h.html#a4f87c9100d154a65a4ad495f7763cf7caffdd7a5169be3dbd7cbf6b3619e4f78a">VMA_ALLOCATOR_CREATE_EXT_MEMORY_PRIORITY_BIT</a> = 0x00000040,</div>
+<div class="line"><a name="l02343"></a><span class="lineno"> 2343</span>&#160; </div>
+<div class="line"><a name="l02344"></a><span class="lineno"> 2344</span>&#160;    <a class="code" href="vk__mem__alloc_8h.html#a4f87c9100d154a65a4ad495f7763cf7cae4d5ad929caba5f23eb502b13bd5286c">VMA_ALLOCATOR_CREATE_FLAG_BITS_MAX_ENUM</a> = 0x7FFFFFFF</div>
+<div class="line"><a name="l02345"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#a4f87c9100d154a65a4ad495f7763cf7cae4d5ad929caba5f23eb502b13bd5286c"> 2345</a></span>&#160;} <a class="code" href="vk__mem__alloc_8h.html#a4f87c9100d154a65a4ad495f7763cf7c">VmaAllocatorCreateFlagBits</a>;</div>
+<div class="line"><a name="l02346"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#acfe6863e160722c2c1bbcf7573fddc4d"> 2346</a></span>&#160;<span class="keyword">typedef</span> VkFlags <a class="code" href="vk__mem__alloc_8h.html#acfe6863e160722c2c1bbcf7573fddc4d">VmaAllocatorCreateFlags</a>;</div>
+<div class="line"><a name="l02347"></a><span class="lineno"> 2347</span>&#160; </div>
+<div class="line"><a name="l02352"></a><span class="lineno"><a class="line" href="struct_vma_vulkan_functions.html"> 2352</a></span>&#160;<span class="keyword">typedef</span> <span class="keyword">struct </span><a class="code" href="struct_vma_vulkan_functions.html">VmaVulkanFunctions</a> {</div>
+<div class="line"><a name="l02353"></a><span class="lineno"><a class="line" href="struct_vma_vulkan_functions.html#a77b7a74082823e865dd6546623468f96"> 2353</a></span>&#160;    PFN_vkGetPhysicalDeviceProperties VMA_NULLABLE <a class="code" href="struct_vma_vulkan_functions.html#a77b7a74082823e865dd6546623468f96">vkGetPhysicalDeviceProperties</a>;</div>
+<div class="line"><a name="l02354"></a><span class="lineno"><a class="line" href="struct_vma_vulkan_functions.html#a60d25c33bba06bb8592e6875cbaa9830"> 2354</a></span>&#160;    PFN_vkGetPhysicalDeviceMemoryProperties VMA_NULLABLE <a class="code" href="struct_vma_vulkan_functions.html#a60d25c33bba06bb8592e6875cbaa9830">vkGetPhysicalDeviceMemoryProperties</a>;</div>
+<div class="line"><a name="l02355"></a><span class="lineno"><a class="line" href="struct_vma_vulkan_functions.html#a2943bf99dfd784a0e8f599d987e22e6c"> 2355</a></span>&#160;    PFN_vkAllocateMemory VMA_NULLABLE <a class="code" href="struct_vma_vulkan_functions.html#a2943bf99dfd784a0e8f599d987e22e6c">vkAllocateMemory</a>;</div>
+<div class="line"><a name="l02356"></a><span class="lineno"><a class="line" href="struct_vma_vulkan_functions.html#a4c658701778564d62034255b5dda91b4"> 2356</a></span>&#160;    PFN_vkFreeMemory VMA_NULLABLE <a class="code" href="struct_vma_vulkan_functions.html#a4c658701778564d62034255b5dda91b4">vkFreeMemory</a>;</div>
+<div class="line"><a name="l02357"></a><span class="lineno"><a class="line" href="struct_vma_vulkan_functions.html#ab5c1f38dea3a2cf00dc9eb4f57218c49"> 2357</a></span>&#160;    PFN_vkMapMemory VMA_NULLABLE <a class="code" href="struct_vma_vulkan_functions.html#ab5c1f38dea3a2cf00dc9eb4f57218c49">vkMapMemory</a>;</div>
+<div class="line"><a name="l02358"></a><span class="lineno"><a class="line" href="struct_vma_vulkan_functions.html#acc798589736f0becb317fc2196c1d8b9"> 2358</a></span>&#160;    PFN_vkUnmapMemory VMA_NULLABLE <a class="code" href="struct_vma_vulkan_functions.html#acc798589736f0becb317fc2196c1d8b9">vkUnmapMemory</a>;</div>
+<div class="line"><a name="l02359"></a><span class="lineno"><a class="line" href="struct_vma_vulkan_functions.html#a33c322f4c4ad2810f8a9c97a277572f9"> 2359</a></span>&#160;    PFN_vkFlushMappedMemoryRanges VMA_NULLABLE <a class="code" href="struct_vma_vulkan_functions.html#a33c322f4c4ad2810f8a9c97a277572f9">vkFlushMappedMemoryRanges</a>;</div>
+<div class="line"><a name="l02360"></a><span class="lineno"><a class="line" href="struct_vma_vulkan_functions.html#a5c1093bc32386a8060c37c9f282078a1"> 2360</a></span>&#160;    PFN_vkInvalidateMappedMemoryRanges VMA_NULLABLE <a class="code" href="struct_vma_vulkan_functions.html#a5c1093bc32386a8060c37c9f282078a1">vkInvalidateMappedMemoryRanges</a>;</div>
+<div class="line"><a name="l02361"></a><span class="lineno"><a class="line" href="struct_vma_vulkan_functions.html#a94fc4f3a605d9880bb3c0ba2c2fc80b2"> 2361</a></span>&#160;    PFN_vkBindBufferMemory VMA_NULLABLE <a class="code" href="struct_vma_vulkan_functions.html#a94fc4f3a605d9880bb3c0ba2c2fc80b2">vkBindBufferMemory</a>;</div>
+<div class="line"><a name="l02362"></a><span class="lineno"><a class="line" href="struct_vma_vulkan_functions.html#a1338d96a128a5ade648b8d934907c637"> 2362</a></span>&#160;    PFN_vkBindImageMemory VMA_NULLABLE <a class="code" href="struct_vma_vulkan_functions.html#a1338d96a128a5ade648b8d934907c637">vkBindImageMemory</a>;</div>
+<div class="line"><a name="l02363"></a><span class="lineno"><a class="line" href="struct_vma_vulkan_functions.html#a5b92901df89a4194b0d12f6071d4d143"> 2363</a></span>&#160;    PFN_vkGetBufferMemoryRequirements VMA_NULLABLE <a class="code" href="struct_vma_vulkan_functions.html#a5b92901df89a4194b0d12f6071d4d143">vkGetBufferMemoryRequirements</a>;</div>
+<div class="line"><a name="l02364"></a><span class="lineno"><a class="line" href="struct_vma_vulkan_functions.html#a475f6f49f8debe4d10800592606d53f4"> 2364</a></span>&#160;    PFN_vkGetImageMemoryRequirements VMA_NULLABLE <a class="code" href="struct_vma_vulkan_functions.html#a475f6f49f8debe4d10800592606d53f4">vkGetImageMemoryRequirements</a>;</div>
+<div class="line"><a name="l02365"></a><span class="lineno"><a class="line" href="struct_vma_vulkan_functions.html#ae8084315a25006271a2edfc3a447519f"> 2365</a></span>&#160;    PFN_vkCreateBuffer VMA_NULLABLE <a class="code" href="struct_vma_vulkan_functions.html#ae8084315a25006271a2edfc3a447519f">vkCreateBuffer</a>;</div>
+<div class="line"><a name="l02366"></a><span class="lineno"><a class="line" href="struct_vma_vulkan_functions.html#a7e054606faddb07f0e8556f3ed317d45"> 2366</a></span>&#160;    PFN_vkDestroyBuffer VMA_NULLABLE <a class="code" href="struct_vma_vulkan_functions.html#a7e054606faddb07f0e8556f3ed317d45">vkDestroyBuffer</a>;</div>
+<div class="line"><a name="l02367"></a><span class="lineno"><a class="line" href="struct_vma_vulkan_functions.html#a23ebe70be515b9b5010a1d691200e325"> 2367</a></span>&#160;    PFN_vkCreateImage VMA_NULLABLE <a class="code" href="struct_vma_vulkan_functions.html#a23ebe70be515b9b5010a1d691200e325">vkCreateImage</a>;</div>
+<div class="line"><a name="l02368"></a><span class="lineno"><a class="line" href="struct_vma_vulkan_functions.html#a90b898227039b1dcb3520f6e91f09ffa"> 2368</a></span>&#160;    PFN_vkDestroyImage VMA_NULLABLE <a class="code" href="struct_vma_vulkan_functions.html#a90b898227039b1dcb3520f6e91f09ffa">vkDestroyImage</a>;</div>
+<div class="line"><a name="l02369"></a><span class="lineno"><a class="line" href="struct_vma_vulkan_functions.html#ae5c0db8c89a3b82593dc16aa6a49fa3a"> 2369</a></span>&#160;    PFN_vkCmdCopyBuffer VMA_NULLABLE <a class="code" href="struct_vma_vulkan_functions.html#ae5c0db8c89a3b82593dc16aa6a49fa3a">vkCmdCopyBuffer</a>;</div>
+<div class="line"><a name="l02370"></a><span class="lineno"> 2370</span>&#160;<span class="preprocessor">#if VMA_DEDICATED_ALLOCATION || VMA_VULKAN_VERSION &gt;= 1001000</span></div>
+<div class="line"><a name="l02371"></a><span class="lineno"> 2371</span>&#160;    PFN_vkGetBufferMemoryRequirements2KHR VMA_NULLABLE vkGetBufferMemoryRequirements2KHR;</div>
+<div class="line"><a name="l02372"></a><span class="lineno"> 2372</span>&#160;    PFN_vkGetImageMemoryRequirements2KHR VMA_NULLABLE vkGetImageMemoryRequirements2KHR;</div>
+<div class="line"><a name="l02373"></a><span class="lineno"> 2373</span>&#160;<span class="preprocessor">#endif</span></div>
+<div class="line"><a name="l02374"></a><span class="lineno"> 2374</span>&#160;<span class="preprocessor">#if VMA_BIND_MEMORY2 || VMA_VULKAN_VERSION &gt;= 1001000</span></div>
+<div class="line"><a name="l02375"></a><span class="lineno"> 2375</span>&#160;    PFN_vkBindBufferMemory2KHR VMA_NULLABLE vkBindBufferMemory2KHR;</div>
+<div class="line"><a name="l02376"></a><span class="lineno"> 2376</span>&#160;    PFN_vkBindImageMemory2KHR VMA_NULLABLE vkBindImageMemory2KHR;</div>
+<div class="line"><a name="l02377"></a><span class="lineno"> 2377</span>&#160;<span class="preprocessor">#endif</span></div>
+<div class="line"><a name="l02378"></a><span class="lineno"> 2378</span>&#160;<span class="preprocessor">#if VMA_MEMORY_BUDGET || VMA_VULKAN_VERSION &gt;= 1001000</span></div>
+<div class="line"><a name="l02379"></a><span class="lineno"> 2379</span>&#160;    PFN_vkGetPhysicalDeviceMemoryProperties2KHR VMA_NULLABLE vkGetPhysicalDeviceMemoryProperties2KHR;</div>
+<div class="line"><a name="l02380"></a><span class="lineno"> 2380</span>&#160;<span class="preprocessor">#endif</span></div>
+<div class="line"><a name="l02381"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#abb0a8e3b5040d847571cca6c7f9a8074"> 2381</a></span>&#160;} <a class="code" href="vk__mem__alloc_8h.html#abb0a8e3b5040d847571cca6c7f9a8074">VmaVulkanFunctions</a>;</div>
+<div class="line"><a name="l02382"></a><span class="lineno"> 2382</span>&#160; </div>
+<div class="line"><a name="l02384"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#a4dd2c44642312a147a4e93373a6e64d2"> 2384</a></span>&#160;<span class="keyword">typedef</span> <span class="keyword">enum</span> <a class="code" href="vk__mem__alloc_8h.html#a4dd2c44642312a147a4e93373a6e64d2">VmaRecordFlagBits</a> {</div>
+<div class="line"><a name="l02390"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#a4dd2c44642312a147a4e93373a6e64d2a8e7ab322e8732654be627c4ea8f36cc7"> 2390</a></span>&#160;    <a class="code" href="vk__mem__alloc_8h.html#a4dd2c44642312a147a4e93373a6e64d2a8e7ab322e8732654be627c4ea8f36cc7">VMA_RECORD_FLUSH_AFTER_CALL_BIT</a> = 0x00000001,</div>
 <div class="line"><a name="l02391"></a><span class="lineno"> 2391</span>&#160; </div>
-<div class="line"><a name="l02396"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#aecabf7b6e91ea87d0316fa0a9e014fe0"> 2396</a></span>&#160;VMA_CALL_PRE <span class="keywordtype">void</span> VMA_CALL_POST <a class="code" href="vk__mem__alloc_8h.html#aecabf7b6e91ea87d0316fa0a9e014fe0">vmaGetPhysicalDeviceProperties</a>(</div>
-<div class="line"><a name="l02397"></a><span class="lineno"> 2397</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> VMA_NOT_NULL allocator,</div>
-<div class="line"><a name="l02398"></a><span class="lineno"> 2398</span>&#160;    <span class="keyword">const</span> VkPhysicalDeviceProperties* VMA_NULLABLE * VMA_NOT_NULL ppPhysicalDeviceProperties);</div>
-<div class="line"><a name="l02399"></a><span class="lineno"> 2399</span>&#160; </div>
-<div class="line"><a name="l02404"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#ab88db292a17974f911182543fda52d19"> 2404</a></span>&#160;VMA_CALL_PRE <span class="keywordtype">void</span> VMA_CALL_POST <a class="code" href="vk__mem__alloc_8h.html#ab88db292a17974f911182543fda52d19">vmaGetMemoryProperties</a>(</div>
-<div class="line"><a name="l02405"></a><span class="lineno"> 2405</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> VMA_NOT_NULL allocator,</div>
-<div class="line"><a name="l02406"></a><span class="lineno"> 2406</span>&#160;    <span class="keyword">const</span> VkPhysicalDeviceMemoryProperties* VMA_NULLABLE * VMA_NOT_NULL ppPhysicalDeviceMemoryProperties);</div>
-<div class="line"><a name="l02407"></a><span class="lineno"> 2407</span>&#160; </div>
-<div class="line"><a name="l02414"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#a8701444752eb5de4464adb5a2b514bca"> 2414</a></span>&#160;VMA_CALL_PRE <span class="keywordtype">void</span> VMA_CALL_POST <a class="code" href="vk__mem__alloc_8h.html#a8701444752eb5de4464adb5a2b514bca">vmaGetMemoryTypeProperties</a>(</div>
-<div class="line"><a name="l02415"></a><span class="lineno"> 2415</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> VMA_NOT_NULL allocator,</div>
-<div class="line"><a name="l02416"></a><span class="lineno"> 2416</span>&#160;    uint32_t memoryTypeIndex,</div>
-<div class="line"><a name="l02417"></a><span class="lineno"> 2417</span>&#160;    VkMemoryPropertyFlags* VMA_NOT_NULL pFlags);</div>
-<div class="line"><a name="l02418"></a><span class="lineno"> 2418</span>&#160; </div>
-<div class="line"><a name="l02427"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#ade56bf8dc9f5a5eaddf5f119ed525236"> 2427</a></span>&#160;VMA_CALL_PRE <span class="keywordtype">void</span> VMA_CALL_POST <a class="code" href="vk__mem__alloc_8h.html#ade56bf8dc9f5a5eaddf5f119ed525236">vmaSetCurrentFrameIndex</a>(</div>
-<div class="line"><a name="l02428"></a><span class="lineno"> 2428</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> VMA_NOT_NULL allocator,</div>
-<div class="line"><a name="l02429"></a><span class="lineno"> 2429</span>&#160;    uint32_t frameIndex);</div>
-<div class="line"><a name="l02430"></a><span class="lineno"> 2430</span>&#160; </div>
-<div class="line"><a name="l02433"></a><span class="lineno"><a class="line" href="struct_vma_stat_info.html"> 2433</a></span>&#160;<span class="keyword">typedef</span> <span class="keyword">struct </span><a class="code" href="struct_vma_stat_info.html">VmaStatInfo</a></div>
-<div class="line"><a name="l02434"></a><span class="lineno"> 2434</span>&#160;{</div>
-<div class="line"><a name="l02436"></a><span class="lineno"><a class="line" href="struct_vma_stat_info.html#abc4bb7cd611900778464c56e50c970a4"> 2436</a></span>&#160;    uint32_t <a class="code" href="struct_vma_stat_info.html#abc4bb7cd611900778464c56e50c970a4">blockCount</a>;</div>
-<div class="line"><a name="l02438"></a><span class="lineno"><a class="line" href="struct_vma_stat_info.html#a537741e4d5cdddc1c0ab95ec650afaff"> 2438</a></span>&#160;    uint32_t <a class="code" href="struct_vma_stat_info.html#a537741e4d5cdddc1c0ab95ec650afaff">allocationCount</a>;</div>
-<div class="line"><a name="l02440"></a><span class="lineno"><a class="line" href="struct_vma_stat_info.html#ae06129c771bfebfd6468a7f4276502a9"> 2440</a></span>&#160;    uint32_t <a class="code" href="struct_vma_stat_info.html#ae06129c771bfebfd6468a7f4276502a9">unusedRangeCount</a>;</div>
-<div class="line"><a name="l02442"></a><span class="lineno"><a class="line" href="struct_vma_stat_info.html#ab0c6c73837e5a70c749fbd4f6064895a"> 2442</a></span>&#160;    VkDeviceSize <a class="code" href="struct_vma_stat_info.html#ab0c6c73837e5a70c749fbd4f6064895a">usedBytes</a>;</div>
-<div class="line"><a name="l02444"></a><span class="lineno"><a class="line" href="struct_vma_stat_info.html#a1859d290aca2cd582d8dc25922092669"> 2444</a></span>&#160;    VkDeviceSize <a class="code" href="struct_vma_stat_info.html#a1859d290aca2cd582d8dc25922092669">unusedBytes</a>;</div>
-<div class="line"><a name="l02445"></a><span class="lineno"><a class="line" href="struct_vma_stat_info.html#ade8b40bd3139c04aabd2fc538a356fea"> 2445</a></span>&#160;    VkDeviceSize <a class="code" href="struct_vma_stat_info.html#ade8b40bd3139c04aabd2fc538a356fea">allocationSizeMin</a>, allocationSizeAvg, allocationSizeMax;</div>
-<div class="line"><a name="l02446"></a><span class="lineno"><a class="line" href="struct_vma_stat_info.html#aedeba931324f16589cd2416c0d2dd0d4"> 2446</a></span>&#160;    VkDeviceSize <a class="code" href="struct_vma_stat_info.html#aedeba931324f16589cd2416c0d2dd0d4">unusedRangeSizeMin</a>, unusedRangeSizeAvg, unusedRangeSizeMax;</div>
-<div class="line"><a name="l02447"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#aec5b57e29c97b5d69c6d5654d60df878"> 2447</a></span>&#160;} <a class="code" href="vk__mem__alloc_8h.html#aec5b57e29c97b5d69c6d5654d60df878">VmaStatInfo</a>;</div>
-<div class="line"><a name="l02448"></a><span class="lineno"> 2448</span>&#160; </div>
-<div class="line"><a name="l02450"></a><span class="lineno"><a class="line" href="struct_vma_stats.html"> 2450</a></span>&#160;<span class="keyword">typedef</span> <span class="keyword">struct </span><a class="code" href="struct_vma_stats.html">VmaStats</a></div>
-<div class="line"><a name="l02451"></a><span class="lineno"> 2451</span>&#160;{</div>
-<div class="line"><a name="l02452"></a><span class="lineno"><a class="line" href="struct_vma_stats.html#a13e3caf754be79352c42408756309331"> 2452</a></span>&#160;    <a class="code" href="struct_vma_stat_info.html">VmaStatInfo</a> memoryType[VK_MAX_MEMORY_TYPES];</div>
-<div class="line"><a name="l02453"></a><span class="lineno"><a class="line" href="struct_vma_stats.html#a0e6611508c29a187f0fd14ff1a0329c0"> 2453</a></span>&#160;    <a class="code" href="struct_vma_stat_info.html">VmaStatInfo</a> memoryHeap[VK_MAX_MEMORY_HEAPS];</div>
-<div class="line"><a name="l02454"></a><span class="lineno"><a class="line" href="struct_vma_stats.html#a2e8f5b3353f2fefef3c27f29e245a1f9"> 2454</a></span>&#160;    <a class="code" href="struct_vma_stat_info.html">VmaStatInfo</a> <a class="code" href="struct_vma_stats.html#a2e8f5b3353f2fefef3c27f29e245a1f9">total</a>;</div>
-<div class="line"><a name="l02455"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#a21813b2efdf3836767a9058cd8a94034"> 2455</a></span>&#160;} <a class="code" href="vk__mem__alloc_8h.html#a21813b2efdf3836767a9058cd8a94034">VmaStats</a>;</div>
-<div class="line"><a name="l02456"></a><span class="lineno"> 2456</span>&#160; </div>
-<div class="line"><a name="l02466"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#a333b61c1788cb23559177531e6a93ca3"> 2466</a></span>&#160;VMA_CALL_PRE <span class="keywordtype">void</span> VMA_CALL_POST <a class="code" href="vk__mem__alloc_8h.html#a333b61c1788cb23559177531e6a93ca3">vmaCalculateStats</a>(</div>
-<div class="line"><a name="l02467"></a><span class="lineno"> 2467</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> VMA_NOT_NULL allocator,</div>
-<div class="line"><a name="l02468"></a><span class="lineno"> 2468</span>&#160;    <a class="code" href="struct_vma_stats.html">VmaStats</a>* VMA_NOT_NULL pStats);</div>
-<div class="line"><a name="l02469"></a><span class="lineno"> 2469</span>&#160; </div>
-<div class="line"><a name="l02472"></a><span class="lineno"><a class="line" href="struct_vma_budget.html"> 2472</a></span>&#160;<span class="keyword">typedef</span> <span class="keyword">struct </span><a class="code" href="struct_vma_budget.html">VmaBudget</a></div>
-<div class="line"><a name="l02473"></a><span class="lineno"> 2473</span>&#160;{</div>
-<div class="line"><a name="l02476"></a><span class="lineno"><a class="line" href="struct_vma_budget.html#a58b492901baab685f466199124e514a0"> 2476</a></span>&#160;    VkDeviceSize <a class="code" href="struct_vma_budget.html#a58b492901baab685f466199124e514a0">blockBytes</a>;</div>
-<div class="line"><a name="l02477"></a><span class="lineno"> 2477</span>&#160;    </div>
-<div class="line"><a name="l02487"></a><span class="lineno"><a class="line" href="struct_vma_budget.html#a7e2a6583ebd63e194951c542563804d8"> 2487</a></span>&#160;    VkDeviceSize <a class="code" href="struct_vma_budget.html#a7e2a6583ebd63e194951c542563804d8">allocationBytes</a>;</div>
-<div class="line"><a name="l02488"></a><span class="lineno"> 2488</span>&#160;    </div>
-<div class="line"><a name="l02497"></a><span class="lineno"><a class="line" href="struct_vma_budget.html#a84dd1ecca8b0110259eb206dbadb11f6"> 2497</a></span>&#160;    VkDeviceSize <a class="code" href="struct_vma_budget.html#a84dd1ecca8b0110259eb206dbadb11f6">usage</a>;</div>
-<div class="line"><a name="l02498"></a><span class="lineno"> 2498</span>&#160;    </div>
-<div class="line"><a name="l02508"></a><span class="lineno"><a class="line" href="struct_vma_budget.html#ab82e1d1754c2d210d0bdf90220bc6cdd"> 2508</a></span>&#160;    VkDeviceSize <a class="code" href="struct_vma_budget.html#ab82e1d1754c2d210d0bdf90220bc6cdd">budget</a>;</div>
-<div class="line"><a name="l02509"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#aa078667e71b1ef24e87a6a30d128381d"> 2509</a></span>&#160;} <a class="code" href="vk__mem__alloc_8h.html#aa078667e71b1ef24e87a6a30d128381d">VmaBudget</a>;</div>
-<div class="line"><a name="l02510"></a><span class="lineno"> 2510</span>&#160; </div>
-<div class="line"><a name="l02521"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#aec0ed24ebea2d0099eed5f801daaefba"> 2521</a></span>&#160;VMA_CALL_PRE <span class="keywordtype">void</span> VMA_CALL_POST <a class="code" href="vk__mem__alloc_8h.html#aec0ed24ebea2d0099eed5f801daaefba">vmaGetBudget</a>(</div>
-<div class="line"><a name="l02522"></a><span class="lineno"> 2522</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> VMA_NOT_NULL allocator,</div>
-<div class="line"><a name="l02523"></a><span class="lineno"> 2523</span>&#160;    <a class="code" href="struct_vma_budget.html">VmaBudget</a>* VMA_NOT_NULL pBudget);</div>
-<div class="line"><a name="l02524"></a><span class="lineno"> 2524</span>&#160; </div>
-<div class="line"><a name="l02525"></a><span class="lineno"> 2525</span>&#160;<span class="preprocessor">#ifndef VMA_STATS_STRING_ENABLED</span></div>
-<div class="line"><a name="l02526"></a><span class="lineno"> 2526</span>&#160;<span class="preprocessor">#define VMA_STATS_STRING_ENABLED 1</span></div>
-<div class="line"><a name="l02527"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#ae25f0d55fd91cb166f002b63244800e1"> 2527</a></span>&#160;<span class="preprocessor">#endif</span></div>
+<div class="line"><a name="l02392"></a><span class="lineno"> 2392</span>&#160;    <a class="code" href="vk__mem__alloc_8h.html#a4dd2c44642312a147a4e93373a6e64d2a20dd17d69966dbffa054739d6090b85e">VMA_RECORD_FLAG_BITS_MAX_ENUM</a> = 0x7FFFFFFF</div>
+<div class="line"><a name="l02393"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#a4dd2c44642312a147a4e93373a6e64d2a20dd17d69966dbffa054739d6090b85e"> 2393</a></span>&#160;} <a class="code" href="vk__mem__alloc_8h.html#a4dd2c44642312a147a4e93373a6e64d2">VmaRecordFlagBits</a>;</div>
+<div class="line"><a name="l02394"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#af3929a1a4547c592fc0b0e55ef452828"> 2394</a></span>&#160;<span class="keyword">typedef</span> VkFlags <a class="code" href="vk__mem__alloc_8h.html#af3929a1a4547c592fc0b0e55ef452828">VmaRecordFlags</a>;</div>
+<div class="line"><a name="l02395"></a><span class="lineno"> 2395</span>&#160; </div>
+<div class="line"><a name="l02397"></a><span class="lineno"><a class="line" href="struct_vma_record_settings.html"> 2397</a></span>&#160;<span class="keyword">typedef</span> <span class="keyword">struct </span><a class="code" href="struct_vma_record_settings.html">VmaRecordSettings</a></div>
+<div class="line"><a name="l02398"></a><span class="lineno"> 2398</span>&#160;{</div>
+<div class="line"><a name="l02400"></a><span class="lineno"><a class="line" href="struct_vma_record_settings.html#ad8fdcc92119ae7a8c08c1a564c01d63a"> 2400</a></span>&#160;    <a class="code" href="vk__mem__alloc_8h.html#af3929a1a4547c592fc0b0e55ef452828">VmaRecordFlags</a> <a class="code" href="struct_vma_record_settings.html#ad8fdcc92119ae7a8c08c1a564c01d63a">flags</a>;</div>
+<div class="line"><a name="l02408"></a><span class="lineno"><a class="line" href="struct_vma_record_settings.html#a6cb1fdbf6bcb610b68f2010dd629e89d"> 2408</a></span>&#160;    <span class="keyword">const</span> <span class="keywordtype">char</span>* VMA_NOT_NULL <a class="code" href="struct_vma_record_settings.html#a6cb1fdbf6bcb610b68f2010dd629e89d">pFilePath</a>;</div>
+<div class="line"><a name="l02409"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#a16e21c877101493fce582664cd8754fc"> 2409</a></span>&#160;} <a class="code" href="vk__mem__alloc_8h.html#a16e21c877101493fce582664cd8754fc">VmaRecordSettings</a>;</div>
+<div class="line"><a name="l02410"></a><span class="lineno"> 2410</span>&#160; </div>
+<div class="line"><a name="l02412"></a><span class="lineno"><a class="line" href="struct_vma_allocator_create_info.html"> 2412</a></span>&#160;<span class="keyword">typedef</span> <span class="keyword">struct </span><a class="code" href="struct_vma_allocator_create_info.html">VmaAllocatorCreateInfo</a></div>
+<div class="line"><a name="l02413"></a><span class="lineno"> 2413</span>&#160;{</div>
+<div class="line"><a name="l02415"></a><span class="lineno"><a class="line" href="struct_vma_allocator_create_info.html#a392ea2ecbaff93f91a7c49f735ad4346"> 2415</a></span>&#160;    <a class="code" href="vk__mem__alloc_8h.html#acfe6863e160722c2c1bbcf7573fddc4d">VmaAllocatorCreateFlags</a> <a class="code" href="struct_vma_allocator_create_info.html#a392ea2ecbaff93f91a7c49f735ad4346">flags</a>;</div>
+<div class="line"><a name="l02417"></a><span class="lineno"> 2417</span>&#160; </div>
+<div class="line"><a name="l02418"></a><span class="lineno"><a class="line" href="struct_vma_allocator_create_info.html#a08230f04ae6ccf8a78150a9e829a7156"> 2418</a></span>&#160;    VkPhysicalDevice VMA_NOT_NULL <a class="code" href="struct_vma_allocator_create_info.html#a08230f04ae6ccf8a78150a9e829a7156">physicalDevice</a>;</div>
+<div class="line"><a name="l02420"></a><span class="lineno"> 2420</span>&#160; </div>
+<div class="line"><a name="l02421"></a><span class="lineno"><a class="line" href="struct_vma_allocator_create_info.html#ad924ddd77b04039c88d0c09b0ffcd500"> 2421</a></span>&#160;    VkDevice VMA_NOT_NULL <a class="code" href="struct_vma_allocator_create_info.html#ad924ddd77b04039c88d0c09b0ffcd500">device</a>;</div>
+<div class="line"><a name="l02423"></a><span class="lineno"> 2423</span>&#160; </div>
+<div class="line"><a name="l02424"></a><span class="lineno"><a class="line" href="struct_vma_allocator_create_info.html#a8e4714298e3121cdd8b214a1ae7a637a"> 2424</a></span>&#160;    VkDeviceSize <a class="code" href="struct_vma_allocator_create_info.html#a8e4714298e3121cdd8b214a1ae7a637a">preferredLargeHeapBlockSize</a>;</div>
+<div class="line"><a name="l02426"></a><span class="lineno"> 2426</span>&#160; </div>
+<div class="line"><a name="l02427"></a><span class="lineno"><a class="line" href="struct_vma_allocator_create_info.html#a6e409087e3be55400d0e4ccbe43c608d"> 2427</a></span>&#160;    <span class="keyword">const</span> VkAllocationCallbacks* VMA_NULLABLE <a class="code" href="struct_vma_allocator_create_info.html#a6e409087e3be55400d0e4ccbe43c608d">pAllocationCallbacks</a>;</div>
+<div class="line"><a name="l02429"></a><span class="lineno"> 2429</span>&#160; </div>
+<div class="line"><a name="l02430"></a><span class="lineno"><a class="line" href="struct_vma_allocator_create_info.html#af1380969b5e1ea4c3184a877892d260e"> 2430</a></span>&#160;    <span class="keyword">const</span> <a class="code" href="struct_vma_device_memory_callbacks.html">VmaDeviceMemoryCallbacks</a>* VMA_NULLABLE <a class="code" href="struct_vma_allocator_create_info.html#af1380969b5e1ea4c3184a877892d260e">pDeviceMemoryCallbacks</a>;</div>
+<div class="line"><a name="l02444"></a><span class="lineno"><a class="line" href="struct_vma_allocator_create_info.html#a21ea188dd212b8171cb9ecbed4a2a3a7"> 2444</a></span>&#160;    uint32_t <a class="code" href="struct_vma_allocator_create_info.html#a21ea188dd212b8171cb9ecbed4a2a3a7">frameInUseCount</a>;</div>
+<div class="line"><a name="l02469"></a><span class="lineno"><a class="line" href="struct_vma_allocator_create_info.html#a31c192aa6cbffa33279f6d9f0c47c44b"> 2469</a></span>&#160;    <span class="keyword">const</span> VkDeviceSize* VMA_NULLABLE VMA_LEN_IF_NOT_NULL(<span class="stringliteral">&quot;VkPhysicalDeviceMemoryProperties::memoryHeapCount&quot;</span>) <a class="code" href="struct_vma_allocator_create_info.html#a31c192aa6cbffa33279f6d9f0c47c44b">pHeapSizeLimit</a>;</div>
+<div class="line"><a name="l02470"></a><span class="lineno"> 2470</span>&#160; </div>
+<div class="line"><a name="l02475"></a><span class="lineno"><a class="line" href="struct_vma_allocator_create_info.html#a3dc197be3227da7338b1643f70db36bd"> 2475</a></span>&#160;    const <a class="code" href="struct_vma_vulkan_functions.html">VmaVulkanFunctions</a>* VMA_NULLABLE <a class="code" href="struct_vma_allocator_create_info.html#a3dc197be3227da7338b1643f70db36bd">pVulkanFunctions</a>;</div>
+<div class="line"><a name="l02482"></a><span class="lineno"><a class="line" href="struct_vma_allocator_create_info.html#ace2aa4877b16a42b0b7673d4e26000ee"> 2482</a></span>&#160;    const <a class="code" href="struct_vma_record_settings.html">VmaRecordSettings</a>* VMA_NULLABLE <a class="code" href="struct_vma_allocator_create_info.html#ace2aa4877b16a42b0b7673d4e26000ee">pRecordSettings</a>;</div>
+<div class="line"><a name="l02487"></a><span class="lineno"><a class="line" href="struct_vma_allocator_create_info.html#a70dd42e29b1df1d1b9b61532ae0b370b"> 2487</a></span>&#160;    VkInstance VMA_NOT_NULL <a class="code" href="struct_vma_allocator_create_info.html#a70dd42e29b1df1d1b9b61532ae0b370b">instance</a>;</div>
+<div class="line"><a name="l02496"></a><span class="lineno"><a class="line" href="struct_vma_allocator_create_info.html#ae0ffc55139b54520a6bb704b29ffc285"> 2496</a></span>&#160;    uint32_t <a class="code" href="struct_vma_allocator_create_info.html#ae0ffc55139b54520a6bb704b29ffc285">vulkanApiVersion</a>;</div>
+<div class="line"><a name="l02497"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#aad9652301d33759b83e52d4f3605a14a"> 2497</a></span>&#160;} <a class="code" href="struct_vma_allocator_create_info.html">VmaAllocatorCreateInfo</a>;</div>
+<div class="line"><a name="l02498"></a><span class="lineno"> 2498</span>&#160; </div>
+<div class="line"><a name="l02500"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#a200692051ddb34240248234f5f4c17bb"> 2500</a></span>&#160;VMA_CALL_PRE VkResult VMA_CALL_POST <a class="code" href="vk__mem__alloc_8h.html#a200692051ddb34240248234f5f4c17bb">vmaCreateAllocator</a>(</div>
+<div class="line"><a name="l02501"></a><span class="lineno"> 2501</span>&#160;    const <a class="code" href="struct_vma_allocator_create_info.html">VmaAllocatorCreateInfo</a>* VMA_NOT_NULL pCreateInfo,</div>
+<div class="line"><a name="l02502"></a><span class="lineno"> 2502</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> VMA_NULLABLE * VMA_NOT_NULL pAllocator);</div>
+<div class="line"><a name="l02503"></a><span class="lineno"> 2503</span>&#160; </div>
+<div class="line"><a name="l02505"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#aa8d164061c88f22fb1fd3c8f3534bc1d"> 2505</a></span>&#160;VMA_CALL_PRE <span class="keywordtype">void</span> VMA_CALL_POST <a class="code" href="vk__mem__alloc_8h.html#aa8d164061c88f22fb1fd3c8f3534bc1d">vmaDestroyAllocator</a>(</div>
+<div class="line"><a name="l02506"></a><span class="lineno"> 2506</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> VMA_NULLABLE allocator);</div>
+<div class="line"><a name="l02507"></a><span class="lineno"> 2507</span>&#160; </div>
+<div class="line"><a name="l02510"></a><span class="lineno"><a class="line" href="struct_vma_allocator_info.html"> 2510</a></span>&#160;typedef struct <a class="code" href="struct_vma_allocator_info.html">VmaAllocatorInfo</a></div>
+<div class="line"><a name="l02511"></a><span class="lineno"> 2511</span>&#160;{</div>
+<div class="line"><a name="l02516"></a><span class="lineno"><a class="line" href="struct_vma_allocator_info.html#a2ed6a4d2d3fea039d66a13f15d0ce5fe"> 2516</a></span>&#160;    VkInstance VMA_NOT_NULL <a class="code" href="struct_vma_allocator_info.html#a2ed6a4d2d3fea039d66a13f15d0ce5fe">instance</a>;</div>
+<div class="line"><a name="l02521"></a><span class="lineno"><a class="line" href="struct_vma_allocator_info.html#aba2b703f96e51d567717e1fb2935b47a"> 2521</a></span>&#160;    VkPhysicalDevice VMA_NOT_NULL <a class="code" href="struct_vma_allocator_info.html#aba2b703f96e51d567717e1fb2935b47a">physicalDevice</a>;</div>
+<div class="line"><a name="l02526"></a><span class="lineno"><a class="line" href="struct_vma_allocator_info.html#a012b4c485bf3b0ea8921352c5ee0c357"> 2526</a></span>&#160;    VkDevice VMA_NOT_NULL <a class="code" href="struct_vma_allocator_info.html#a012b4c485bf3b0ea8921352c5ee0c357">device</a>;</div>
+<div class="line"><a name="l02527"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#a1988031b0223fdbd564250fa1edd942c"> 2527</a></span>&#160;} <a class="code" href="vk__mem__alloc_8h.html#a1988031b0223fdbd564250fa1edd942c">VmaAllocatorInfo</a>;</div>
 <div class="line"><a name="l02528"></a><span class="lineno"> 2528</span>&#160; </div>
-<div class="line"><a name="l02529"></a><span class="lineno"> 2529</span>&#160;<span class="preprocessor">#if VMA_STATS_STRING_ENABLED</span></div>
-<div class="line"><a name="l02530"></a><span class="lineno"> 2530</span>&#160; </div>
-<div class="line"><a name="l02532"></a><span class="lineno"> 2532</span>&#160; </div>
-<div class="line"><a name="l02534"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#aa4fee7eb5253377599ef4fd38c93c2a0"> 2534</a></span>&#160;VMA_CALL_PRE <span class="keywordtype">void</span> VMA_CALL_POST <a class="code" href="vk__mem__alloc_8h.html#aa4fee7eb5253377599ef4fd38c93c2a0">vmaBuildStatsString</a>(</div>
-<div class="line"><a name="l02535"></a><span class="lineno"> 2535</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> VMA_NOT_NULL allocator,</div>
-<div class="line"><a name="l02536"></a><span class="lineno"> 2536</span>&#160;    <span class="keywordtype">char</span>* VMA_NULLABLE * VMA_NOT_NULL ppStatsString,</div>
-<div class="line"><a name="l02537"></a><span class="lineno"> 2537</span>&#160;    VkBool32 detailedMap);</div>
-<div class="line"><a name="l02538"></a><span class="lineno"> 2538</span>&#160; </div>
-<div class="line"><a name="l02539"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#a3104eb30d8122c84dd8541063f145288"> 2539</a></span>&#160;VMA_CALL_PRE <span class="keywordtype">void</span> VMA_CALL_POST <a class="code" href="vk__mem__alloc_8h.html#a3104eb30d8122c84dd8541063f145288">vmaFreeStatsString</a>(</div>
-<div class="line"><a name="l02540"></a><span class="lineno"> 2540</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> VMA_NOT_NULL allocator,</div>
-<div class="line"><a name="l02541"></a><span class="lineno"> 2541</span>&#160;    <span class="keywordtype">char</span>* VMA_NULLABLE pStatsString);</div>
-<div class="line"><a name="l02542"></a><span class="lineno"> 2542</span>&#160; </div>
-<div class="line"><a name="l02543"></a><span class="lineno"> 2543</span>&#160;<span class="preprocessor">#endif // #if VMA_STATS_STRING_ENABLED</span></div>
-<div class="line"><a name="l02544"></a><span class="lineno"> 2544</span>&#160; </div>
-<div class="line"><a name="l02553"></a><span class="lineno"> 2553</span>&#160;VK_DEFINE_HANDLE(<a class="code" href="struct_vma_pool.html">VmaPool</a>)</div>
-<div class="line"><a name="l02554"></a><span class="lineno"> 2554</span>&#160; </div>
-<div class="line"><a name="l02555"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305cc"> 2555</a></span>&#160;typedef enum <a class="code" href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305cc">VmaMemoryUsage</a></div>
-<div class="line"><a name="l02556"></a><span class="lineno"> 2556</span>&#160;{</div>
-<div class="line"><a name="l02560"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305ccaf50d27e34e0925cf3a63db8c839121dd"> 2560</a></span>&#160;    <a class="code" href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305ccaf50d27e34e0925cf3a63db8c839121dd">VMA_MEMORY_USAGE_UNKNOWN</a> = 0,</div>
-<div class="line"><a name="l02577"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305ccac6b5dc1432d88647aa4cd456246eadf7"> 2577</a></span>&#160;    <a class="code" href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305ccac6b5dc1432d88647aa4cd456246eadf7">VMA_MEMORY_USAGE_GPU_ONLY</a> = 1,</div>
-<div class="line"><a name="l02587"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305cca40bdf4cddeffeb12f43d45ca1286e0a5"> 2587</a></span>&#160;    <a class="code" href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305cca40bdf4cddeffeb12f43d45ca1286e0a5">VMA_MEMORY_USAGE_CPU_ONLY</a> = 2,</div>
-<div class="line"><a name="l02594"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305cca9066b52c5a7079bb74a69aaf8b92ff67"> 2594</a></span>&#160;    <a class="code" href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305cca9066b52c5a7079bb74a69aaf8b92ff67">VMA_MEMORY_USAGE_CPU_TO_GPU</a> = 3,</div>
-<div class="line"><a name="l02603"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305cca7b586d2fdaf82a463b58f581ed72be27"> 2603</a></span>&#160;    <a class="code" href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305cca7b586d2fdaf82a463b58f581ed72be27">VMA_MEMORY_USAGE_GPU_TO_CPU</a> = 4,</div>
-<div class="line"><a name="l02609"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305cca416a444d4d0fc20067c3f76f32ff2500"> 2609</a></span>&#160;    <a class="code" href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305cca416a444d4d0fc20067c3f76f32ff2500">VMA_MEMORY_USAGE_CPU_COPY</a> = 5,</div>
-<div class="line"><a name="l02617"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305cca835333d9072db63a653818030e17614d"> 2617</a></span>&#160;    <a class="code" href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305cca835333d9072db63a653818030e17614d">VMA_MEMORY_USAGE_GPU_LAZILY_ALLOCATED</a> = 6,</div>
-<div class="line"><a name="l02618"></a><span class="lineno"> 2618</span>&#160; </div>
-<div class="line"><a name="l02619"></a><span class="lineno"> 2619</span>&#160;    <a class="code" href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305cca091e69437ef693e8d0d287f1c719ba6e">VMA_MEMORY_USAGE_MAX_ENUM</a> = 0x7FFFFFFF</div>
-<div class="line"><a name="l02620"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#a806e8499dde802e59eb72a1dc811c35f"> 2620</a></span>&#160;} <a class="code" href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305cc">VmaMemoryUsage</a>;</div>
+<div class="line"><a name="l02534"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#afa02231a791b37255720d566a52683e7"> 2534</a></span>&#160;VMA_CALL_PRE <span class="keywordtype">void</span> VMA_CALL_POST <a class="code" href="vk__mem__alloc_8h.html#afa02231a791b37255720d566a52683e7">vmaGetAllocatorInfo</a>(<a class="code" href="struct_vma_allocator.html">VmaAllocator</a> VMA_NOT_NULL allocator, <a class="code" href="struct_vma_allocator_info.html">VmaAllocatorInfo</a>* VMA_NOT_NULL pAllocatorInfo);</div>
+<div class="line"><a name="l02535"></a><span class="lineno"> 2535</span>&#160; </div>
+<div class="line"><a name="l02540"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#aecabf7b6e91ea87d0316fa0a9e014fe0"> 2540</a></span>&#160;VMA_CALL_PRE <span class="keywordtype">void</span> VMA_CALL_POST <a class="code" href="vk__mem__alloc_8h.html#aecabf7b6e91ea87d0316fa0a9e014fe0">vmaGetPhysicalDeviceProperties</a>(</div>
+<div class="line"><a name="l02541"></a><span class="lineno"> 2541</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> VMA_NOT_NULL allocator,</div>
+<div class="line"><a name="l02542"></a><span class="lineno"> 2542</span>&#160;    <span class="keyword">const</span> VkPhysicalDeviceProperties* VMA_NULLABLE * VMA_NOT_NULL ppPhysicalDeviceProperties);</div>
+<div class="line"><a name="l02543"></a><span class="lineno"> 2543</span>&#160; </div>
+<div class="line"><a name="l02548"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#ab88db292a17974f911182543fda52d19"> 2548</a></span>&#160;VMA_CALL_PRE <span class="keywordtype">void</span> VMA_CALL_POST <a class="code" href="vk__mem__alloc_8h.html#ab88db292a17974f911182543fda52d19">vmaGetMemoryProperties</a>(</div>
+<div class="line"><a name="l02549"></a><span class="lineno"> 2549</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> VMA_NOT_NULL allocator,</div>
+<div class="line"><a name="l02550"></a><span class="lineno"> 2550</span>&#160;    <span class="keyword">const</span> VkPhysicalDeviceMemoryProperties* VMA_NULLABLE * VMA_NOT_NULL ppPhysicalDeviceMemoryProperties);</div>
+<div class="line"><a name="l02551"></a><span class="lineno"> 2551</span>&#160; </div>
+<div class="line"><a name="l02558"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#a8701444752eb5de4464adb5a2b514bca"> 2558</a></span>&#160;VMA_CALL_PRE <span class="keywordtype">void</span> VMA_CALL_POST <a class="code" href="vk__mem__alloc_8h.html#a8701444752eb5de4464adb5a2b514bca">vmaGetMemoryTypeProperties</a>(</div>
+<div class="line"><a name="l02559"></a><span class="lineno"> 2559</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> VMA_NOT_NULL allocator,</div>
+<div class="line"><a name="l02560"></a><span class="lineno"> 2560</span>&#160;    uint32_t memoryTypeIndex,</div>
+<div class="line"><a name="l02561"></a><span class="lineno"> 2561</span>&#160;    VkMemoryPropertyFlags* VMA_NOT_NULL pFlags);</div>
+<div class="line"><a name="l02562"></a><span class="lineno"> 2562</span>&#160; </div>
+<div class="line"><a name="l02571"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#ade56bf8dc9f5a5eaddf5f119ed525236"> 2571</a></span>&#160;VMA_CALL_PRE <span class="keywordtype">void</span> VMA_CALL_POST <a class="code" href="vk__mem__alloc_8h.html#ade56bf8dc9f5a5eaddf5f119ed525236">vmaSetCurrentFrameIndex</a>(</div>
+<div class="line"><a name="l02572"></a><span class="lineno"> 2572</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> VMA_NOT_NULL allocator,</div>
+<div class="line"><a name="l02573"></a><span class="lineno"> 2573</span>&#160;    uint32_t frameIndex);</div>
+<div class="line"><a name="l02574"></a><span class="lineno"> 2574</span>&#160; </div>
+<div class="line"><a name="l02577"></a><span class="lineno"><a class="line" href="struct_vma_stat_info.html"> 2577</a></span>&#160;<span class="keyword">typedef</span> <span class="keyword">struct </span><a class="code" href="struct_vma_stat_info.html">VmaStatInfo</a></div>
+<div class="line"><a name="l02578"></a><span class="lineno"> 2578</span>&#160;{</div>
+<div class="line"><a name="l02580"></a><span class="lineno"><a class="line" href="struct_vma_stat_info.html#abc4bb7cd611900778464c56e50c970a4"> 2580</a></span>&#160;    uint32_t <a class="code" href="struct_vma_stat_info.html#abc4bb7cd611900778464c56e50c970a4">blockCount</a>;</div>
+<div class="line"><a name="l02582"></a><span class="lineno"><a class="line" href="struct_vma_stat_info.html#a537741e4d5cdddc1c0ab95ec650afaff"> 2582</a></span>&#160;    uint32_t <a class="code" href="struct_vma_stat_info.html#a537741e4d5cdddc1c0ab95ec650afaff">allocationCount</a>;</div>
+<div class="line"><a name="l02584"></a><span class="lineno"><a class="line" href="struct_vma_stat_info.html#ae06129c771bfebfd6468a7f4276502a9"> 2584</a></span>&#160;    uint32_t <a class="code" href="struct_vma_stat_info.html#ae06129c771bfebfd6468a7f4276502a9">unusedRangeCount</a>;</div>
+<div class="line"><a name="l02586"></a><span class="lineno"><a class="line" href="struct_vma_stat_info.html#ab0c6c73837e5a70c749fbd4f6064895a"> 2586</a></span>&#160;    VkDeviceSize <a class="code" href="struct_vma_stat_info.html#ab0c6c73837e5a70c749fbd4f6064895a">usedBytes</a>;</div>
+<div class="line"><a name="l02588"></a><span class="lineno"><a class="line" href="struct_vma_stat_info.html#a1859d290aca2cd582d8dc25922092669"> 2588</a></span>&#160;    VkDeviceSize <a class="code" href="struct_vma_stat_info.html#a1859d290aca2cd582d8dc25922092669">unusedBytes</a>;</div>
+<div class="line"><a name="l02589"></a><span class="lineno"><a class="line" href="struct_vma_stat_info.html#a1081a039964e566c672e7a2347f9e599"> 2589</a></span>&#160;    VkDeviceSize allocationSizeMin, <a class="code" href="struct_vma_stat_info.html#a1081a039964e566c672e7a2347f9e599">allocationSizeAvg</a>, allocationSizeMax;</div>
+<div class="line"><a name="l02590"></a><span class="lineno"><a class="line" href="struct_vma_stat_info.html#a2f9b3452af90c9768a30b7fb6ae194fc"> 2590</a></span>&#160;    VkDeviceSize unusedRangeSizeMin, <a class="code" href="struct_vma_stat_info.html#a2f9b3452af90c9768a30b7fb6ae194fc">unusedRangeSizeAvg</a>, unusedRangeSizeMax;</div>
+<div class="line"><a name="l02591"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#aec5b57e29c97b5d69c6d5654d60df878"> 2591</a></span>&#160;} <a class="code" href="vk__mem__alloc_8h.html#aec5b57e29c97b5d69c6d5654d60df878">VmaStatInfo</a>;</div>
+<div class="line"><a name="l02592"></a><span class="lineno"> 2592</span>&#160; </div>
+<div class="line"><a name="l02594"></a><span class="lineno"><a class="line" href="struct_vma_stats.html"> 2594</a></span>&#160;<span class="keyword">typedef</span> <span class="keyword">struct </span><a class="code" href="struct_vma_stats.html">VmaStats</a></div>
+<div class="line"><a name="l02595"></a><span class="lineno"> 2595</span>&#160;{</div>
+<div class="line"><a name="l02596"></a><span class="lineno"><a class="line" href="struct_vma_stats.html#a13e3caf754be79352c42408756309331"> 2596</a></span>&#160;    <a class="code" href="struct_vma_stat_info.html">VmaStatInfo</a> memoryType[VK_MAX_MEMORY_TYPES];</div>
+<div class="line"><a name="l02597"></a><span class="lineno"><a class="line" href="struct_vma_stats.html#a0e6611508c29a187f0fd14ff1a0329c0"> 2597</a></span>&#160;    <a class="code" href="struct_vma_stat_info.html">VmaStatInfo</a> memoryHeap[VK_MAX_MEMORY_HEAPS];</div>
+<div class="line"><a name="l02598"></a><span class="lineno"><a class="line" href="struct_vma_stats.html#a2e8f5b3353f2fefef3c27f29e245a1f9"> 2598</a></span>&#160;    <a class="code" href="struct_vma_stat_info.html">VmaStatInfo</a> <a class="code" href="struct_vma_stats.html#a2e8f5b3353f2fefef3c27f29e245a1f9">total</a>;</div>
+<div class="line"><a name="l02599"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#a21813b2efdf3836767a9058cd8a94034"> 2599</a></span>&#160;} <a class="code" href="vk__mem__alloc_8h.html#a21813b2efdf3836767a9058cd8a94034">VmaStats</a>;</div>
+<div class="line"><a name="l02600"></a><span class="lineno"> 2600</span>&#160; </div>
+<div class="line"><a name="l02610"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#a333b61c1788cb23559177531e6a93ca3"> 2610</a></span>&#160;VMA_CALL_PRE <span class="keywordtype">void</span> VMA_CALL_POST <a class="code" href="vk__mem__alloc_8h.html#a333b61c1788cb23559177531e6a93ca3">vmaCalculateStats</a>(</div>
+<div class="line"><a name="l02611"></a><span class="lineno"> 2611</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> VMA_NOT_NULL allocator,</div>
+<div class="line"><a name="l02612"></a><span class="lineno"> 2612</span>&#160;    <a class="code" href="struct_vma_stats.html">VmaStats</a>* VMA_NOT_NULL pStats);</div>
+<div class="line"><a name="l02613"></a><span class="lineno"> 2613</span>&#160; </div>
+<div class="line"><a name="l02616"></a><span class="lineno"><a class="line" href="struct_vma_budget.html"> 2616</a></span>&#160;<span class="keyword">typedef</span> <span class="keyword">struct </span><a class="code" href="struct_vma_budget.html">VmaBudget</a></div>
+<div class="line"><a name="l02617"></a><span class="lineno"> 2617</span>&#160;{</div>
+<div class="line"><a name="l02620"></a><span class="lineno"><a class="line" href="struct_vma_budget.html#a58b492901baab685f466199124e514a0"> 2620</a></span>&#160;    VkDeviceSize <a class="code" href="struct_vma_budget.html#a58b492901baab685f466199124e514a0">blockBytes</a>;</div>
 <div class="line"><a name="l02621"></a><span class="lineno"> 2621</span>&#160; </div>
-<div class="line"><a name="l02623"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597"> 2623</a></span>&#160;<span class="keyword">typedef</span> <span class="keyword">enum</span> <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597">VmaAllocationCreateFlagBits</a> {</div>
-<div class="line"><a name="l02630"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a3fc311d855c2ff53f1090ef5c722b38f"> 2630</a></span>&#160;    <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a3fc311d855c2ff53f1090ef5c722b38f">VMA_ALLOCATION_CREATE_DEDICATED_MEMORY_BIT</a> = 0x00000001,</div>
-<div class="line"><a name="l02631"></a><span class="lineno"> 2631</span>&#160; </div>
-<div class="line"><a name="l02641"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a89759603401014eb325eb22a3839f2ff"> 2641</a></span>&#160;    <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a89759603401014eb325eb22a3839f2ff">VMA_ALLOCATION_CREATE_NEVER_ALLOCATE_BIT</a> = 0x00000002,</div>
-<div class="line"><a name="l02654"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a11da372cc3a82931c5e5d6146cd9dd1f"> 2654</a></span>&#160;    <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a11da372cc3a82931c5e5d6146cd9dd1f">VMA_ALLOCATION_CREATE_MAPPED_BIT</a> = 0x00000004,</div>
-<div class="line"><a name="l02667"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a5f436af6c8fe8540573a6d22627a6fd2"> 2667</a></span>&#160;    <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a5f436af6c8fe8540573a6d22627a6fd2">VMA_ALLOCATION_CREATE_CAN_BECOME_LOST_BIT</a> = 0x00000008,</div>
-<div class="line"><a name="l02674"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a68686d0ce9beb0d4d1b9f2b8b1389a7e"> 2674</a></span>&#160;    <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a68686d0ce9beb0d4d1b9f2b8b1389a7e">VMA_ALLOCATION_CREATE_CAN_MAKE_OTHER_LOST_BIT</a> = 0x00000010,</div>
-<div class="line"><a name="l02680"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597aa6f24f821cd6a7c5e4a443f7bf59c520"> 2680</a></span>&#160;    <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597aa6f24f821cd6a7c5e4a443f7bf59c520">VMA_ALLOCATION_CREATE_USER_DATA_COPY_STRING_BIT</a> = 0x00000020,</div>
-<div class="line"><a name="l02685"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a42ba3a2d2c7117953210b7c3ef8da0df"> 2685</a></span>&#160;    <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a42ba3a2d2c7117953210b7c3ef8da0df">VMA_ALLOCATION_CREATE_UPPER_ADDRESS_BIT</a> = 0x00000040,</div>
-<div class="line"><a name="l02691"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a2310568c62208af432724305fe29ccea"> 2691</a></span>&#160;    <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a2310568c62208af432724305fe29ccea">VMA_ALLOCATION_CREATE_DONT_BIND_BIT</a> = 0x00000080,</div>
-<div class="line"><a name="l02695"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597ab8b1764f3e9022368e440c057783b92d"> 2695</a></span>&#160;    <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597ab8b1764f3e9022368e440c057783b92d">VMA_ALLOCATION_CREATE_WITHIN_BUDGET_BIT</a> = 0x00000100,</div>
-<div class="line"><a name="l02696"></a><span class="lineno"> 2696</span>&#160; </div>
-<div class="line"><a name="l02700"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a839826775c62319466441f86496f036d"> 2700</a></span>&#160;    <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a839826775c62319466441f86496f036d">VMA_ALLOCATION_CREATE_STRATEGY_BEST_FIT_BIT</a>  = 0x00010000,</div>
-<div class="line"><a name="l02704"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597ad242a04f802e25fef0b880afe8bb0a62"> 2704</a></span>&#160;    <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597ad242a04f802e25fef0b880afe8bb0a62">VMA_ALLOCATION_CREATE_STRATEGY_WORST_FIT_BIT</a> = 0x00020000,</div>
-<div class="line"><a name="l02711"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a33eb2052674f3ad92386c714a65fb777"> 2711</a></span>&#160;    <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a33eb2052674f3ad92386c714a65fb777">VMA_ALLOCATION_CREATE_STRATEGY_FIRST_FIT_BIT</a> = 0x00040000,</div>
-<div class="line"><a name="l02712"></a><span class="lineno"> 2712</span>&#160; </div>
-<div class="line"><a name="l02715"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a8af1210cf591784afa026d94998f735d"> 2715</a></span>&#160;    <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a8af1210cf591784afa026d94998f735d">VMA_ALLOCATION_CREATE_STRATEGY_MIN_MEMORY_BIT</a> = <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a839826775c62319466441f86496f036d">VMA_ALLOCATION_CREATE_STRATEGY_BEST_FIT_BIT</a>,</div>
-<div class="line"><a name="l02718"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a0729e932b7ea170e3a128cad96c5cf6d"> 2718</a></span>&#160;    <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a0729e932b7ea170e3a128cad96c5cf6d">VMA_ALLOCATION_CREATE_STRATEGY_MIN_TIME_BIT</a> = <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a33eb2052674f3ad92386c714a65fb777">VMA_ALLOCATION_CREATE_STRATEGY_FIRST_FIT_BIT</a>,</div>
-<div class="line"><a name="l02721"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a621b704103eb3360230c860acf36e706"> 2721</a></span>&#160;    <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a621b704103eb3360230c860acf36e706">VMA_ALLOCATION_CREATE_STRATEGY_MIN_FRAGMENTATION_BIT</a> = <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597ad242a04f802e25fef0b880afe8bb0a62">VMA_ALLOCATION_CREATE_STRATEGY_WORST_FIT_BIT</a>,</div>
-<div class="line"><a name="l02722"></a><span class="lineno"> 2722</span>&#160; </div>
-<div class="line"><a name="l02725"></a><span class="lineno"> 2725</span>&#160;    <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a8e16845d81ae3d27c47106d4770d5c7e">VMA_ALLOCATION_CREATE_STRATEGY_MASK</a> =</div>
-<div class="line"><a name="l02726"></a><span class="lineno"> 2726</span>&#160;        <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a839826775c62319466441f86496f036d">VMA_ALLOCATION_CREATE_STRATEGY_BEST_FIT_BIT</a> |</div>
-<div class="line"><a name="l02727"></a><span class="lineno"> 2727</span>&#160;        <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597ad242a04f802e25fef0b880afe8bb0a62">VMA_ALLOCATION_CREATE_STRATEGY_WORST_FIT_BIT</a> |</div>
-<div class="line"><a name="l02728"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a8e16845d81ae3d27c47106d4770d5c7e"> 2728</a></span>&#160;        <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a33eb2052674f3ad92386c714a65fb777">VMA_ALLOCATION_CREATE_STRATEGY_FIRST_FIT_BIT</a>,</div>
-<div class="line"><a name="l02729"></a><span class="lineno"> 2729</span>&#160; </div>
-<div class="line"><a name="l02730"></a><span class="lineno"> 2730</span>&#160;    <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597ae5633ec569f4899cf8f29e7385b2f882">VMA_ALLOCATION_CREATE_FLAG_BITS_MAX_ENUM</a> = 0x7FFFFFFF</div>
-<div class="line"><a name="l02731"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#a4fceecc301f4064dc808d3cd6c038941"> 2731</a></span>&#160;} <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597">VmaAllocationCreateFlagBits</a>;</div>
-<div class="line"><a name="l02732"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#a5225e5e11f8376f6a31a1791f3d6e817"> 2732</a></span>&#160;<span class="keyword">typedef</span> VkFlags <a class="code" href="vk__mem__alloc_8h.html#a5225e5e11f8376f6a31a1791f3d6e817">VmaAllocationCreateFlags</a>;</div>
-<div class="line"><a name="l02733"></a><span class="lineno"> 2733</span>&#160; </div>
-<div class="line"><a name="l02734"></a><span class="lineno"><a class="line" href="struct_vma_allocation_create_info.html"> 2734</a></span>&#160;<span class="keyword">typedef</span> <span class="keyword">struct </span><a class="code" href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a></div>
-<div class="line"><a name="l02735"></a><span class="lineno"> 2735</span>&#160;{</div>
-<div class="line"><a name="l02737"></a><span class="lineno"><a class="line" href="struct_vma_allocation_create_info.html#add09658ac14fe290ace25470ddd6d41b"> 2737</a></span>&#160;    <a class="code" href="vk__mem__alloc_8h.html#a5225e5e11f8376f6a31a1791f3d6e817">VmaAllocationCreateFlags</a> <a class="code" href="struct_vma_allocation_create_info.html#add09658ac14fe290ace25470ddd6d41b">flags</a>;</div>
-<div class="line"><a name="l02743"></a><span class="lineno"><a class="line" href="struct_vma_allocation_create_info.html#accb8b06b1f677d858cb9af20705fa910"> 2743</a></span>&#160;    <a class="code" href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305cc">VmaMemoryUsage</a> <a class="code" href="struct_vma_allocation_create_info.html#accb8b06b1f677d858cb9af20705fa910">usage</a>;</div>
-<div class="line"><a name="l02748"></a><span class="lineno"><a class="line" href="struct_vma_allocation_create_info.html#a9166390303ff42d783305bc31c2b6b90"> 2748</a></span>&#160;    VkMemoryPropertyFlags <a class="code" href="struct_vma_allocation_create_info.html#a9166390303ff42d783305bc31c2b6b90">requiredFlags</a>;</div>
-<div class="line"><a name="l02753"></a><span class="lineno"><a class="line" href="struct_vma_allocation_create_info.html#a7fe8d81a1ad10b2a2faacacee5b15d6d"> 2753</a></span>&#160;    VkMemoryPropertyFlags <a class="code" href="struct_vma_allocation_create_info.html#a7fe8d81a1ad10b2a2faacacee5b15d6d">preferredFlags</a>;</div>
-<div class="line"><a name="l02761"></a><span class="lineno"><a class="line" href="struct_vma_allocation_create_info.html#a3bf940c0271d85d6ba32a4d820075055"> 2761</a></span>&#160;    uint32_t <a class="code" href="struct_vma_allocation_create_info.html#a3bf940c0271d85d6ba32a4d820075055">memoryTypeBits</a>;</div>
-<div class="line"><a name="l02767"></a><span class="lineno"><a class="line" href="struct_vma_allocation_create_info.html#a6272c0555cfd1fe28bff1afeb6190150"> 2767</a></span>&#160;    <a class="code" href="struct_vma_pool.html">VmaPool</a> VMA_NULLABLE <a class="code" href="struct_vma_allocation_create_info.html#a6272c0555cfd1fe28bff1afeb6190150">pool</a>;</div>
-<div class="line"><a name="l02774"></a><span class="lineno"><a class="line" href="struct_vma_allocation_create_info.html#a8259e85c272683434f4abb4ddddffe19"> 2774</a></span>&#160;    <span class="keywordtype">void</span>* VMA_NULLABLE <a class="code" href="struct_vma_allocation_create_info.html#a8259e85c272683434f4abb4ddddffe19">pUserData</a>;</div>
-<div class="line"><a name="l02775"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#a3bf110892ea2fb4649fedb68488d026a"> 2775</a></span>&#160;} <a class="code" href="vk__mem__alloc_8h.html#a3bf110892ea2fb4649fedb68488d026a">VmaAllocationCreateInfo</a>;</div>
-<div class="line"><a name="l02776"></a><span class="lineno"> 2776</span>&#160; </div>
-<div class="line"><a name="l02793"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#aef15a94b58fbcb0fe706d5720e84a74a"> 2793</a></span>&#160;VMA_CALL_PRE VkResult VMA_CALL_POST <a class="code" href="vk__mem__alloc_8h.html#aef15a94b58fbcb0fe706d5720e84a74a">vmaFindMemoryTypeIndex</a>(</div>
-<div class="line"><a name="l02794"></a><span class="lineno"> 2794</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> VMA_NOT_NULL allocator,</div>
-<div class="line"><a name="l02795"></a><span class="lineno"> 2795</span>&#160;    uint32_t memoryTypeBits,</div>
-<div class="line"><a name="l02796"></a><span class="lineno"> 2796</span>&#160;    <span class="keyword">const</span> <a class="code" href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a>* VMA_NOT_NULL pAllocationCreateInfo,</div>
-<div class="line"><a name="l02797"></a><span class="lineno"> 2797</span>&#160;    uint32_t* VMA_NOT_NULL pMemoryTypeIndex);</div>
-<div class="line"><a name="l02798"></a><span class="lineno"> 2798</span>&#160; </div>
-<div class="line"><a name="l02811"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#ae790ab9ffaf7667fb8f62523e6897888"> 2811</a></span>&#160;VMA_CALL_PRE VkResult VMA_CALL_POST <a class="code" href="vk__mem__alloc_8h.html#ae790ab9ffaf7667fb8f62523e6897888">vmaFindMemoryTypeIndexForBufferInfo</a>(</div>
-<div class="line"><a name="l02812"></a><span class="lineno"> 2812</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> VMA_NOT_NULL allocator,</div>
-<div class="line"><a name="l02813"></a><span class="lineno"> 2813</span>&#160;    <span class="keyword">const</span> VkBufferCreateInfo* VMA_NOT_NULL pBufferCreateInfo,</div>
-<div class="line"><a name="l02814"></a><span class="lineno"> 2814</span>&#160;    <span class="keyword">const</span> <a class="code" href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a>* VMA_NOT_NULL pAllocationCreateInfo,</div>
-<div class="line"><a name="l02815"></a><span class="lineno"> 2815</span>&#160;    uint32_t* VMA_NOT_NULL pMemoryTypeIndex);</div>
-<div class="line"><a name="l02816"></a><span class="lineno"> 2816</span>&#160; </div>
-<div class="line"><a name="l02829"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#a088da83d8eaf3ce9056d9ea0b981d472"> 2829</a></span>&#160;VMA_CALL_PRE VkResult VMA_CALL_POST <a class="code" href="vk__mem__alloc_8h.html#a088da83d8eaf3ce9056d9ea0b981d472">vmaFindMemoryTypeIndexForImageInfo</a>(</div>
-<div class="line"><a name="l02830"></a><span class="lineno"> 2830</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> VMA_NOT_NULL allocator,</div>
-<div class="line"><a name="l02831"></a><span class="lineno"> 2831</span>&#160;    <span class="keyword">const</span> VkImageCreateInfo* VMA_NOT_NULL pImageCreateInfo,</div>
-<div class="line"><a name="l02832"></a><span class="lineno"> 2832</span>&#160;    <span class="keyword">const</span> <a class="code" href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a>* VMA_NOT_NULL pAllocationCreateInfo,</div>
-<div class="line"><a name="l02833"></a><span class="lineno"> 2833</span>&#160;    uint32_t* VMA_NOT_NULL pMemoryTypeIndex);</div>
-<div class="line"><a name="l02834"></a><span class="lineno"> 2834</span>&#160; </div>
-<div class="line"><a name="l02836"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#a9a7c45f9c863695d98c83fa5ac940fe7"> 2836</a></span>&#160;<span class="keyword">typedef</span> <span class="keyword">enum</span> <a class="code" href="vk__mem__alloc_8h.html#a9a7c45f9c863695d98c83fa5ac940fe7">VmaPoolCreateFlagBits</a> {</div>
-<div class="line"><a name="l02854"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#a9a7c45f9c863695d98c83fa5ac940fe7a9f1a499508a8edb4e8ba40aa0290a3d2"> 2854</a></span>&#160;    <a class="code" href="vk__mem__alloc_8h.html#a9a7c45f9c863695d98c83fa5ac940fe7a9f1a499508a8edb4e8ba40aa0290a3d2">VMA_POOL_CREATE_IGNORE_BUFFER_IMAGE_GRANULARITY_BIT</a> = 0x00000002,</div>
-<div class="line"><a name="l02855"></a><span class="lineno"> 2855</span>&#160; </div>
-<div class="line"><a name="l02871"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#a9a7c45f9c863695d98c83fa5ac940fe7a13c8a444197c67866be9cb05599fc726"> 2871</a></span>&#160;    <a class="code" href="vk__mem__alloc_8h.html#a9a7c45f9c863695d98c83fa5ac940fe7a13c8a444197c67866be9cb05599fc726">VMA_POOL_CREATE_LINEAR_ALGORITHM_BIT</a> = 0x00000004,</div>
-<div class="line"><a name="l02872"></a><span class="lineno"> 2872</span>&#160; </div>
-<div class="line"><a name="l02882"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#a9a7c45f9c863695d98c83fa5ac940fe7a97a0dc38e5161b780594d998d313d35e"> 2882</a></span>&#160;    <a class="code" href="vk__mem__alloc_8h.html#a9a7c45f9c863695d98c83fa5ac940fe7a97a0dc38e5161b780594d998d313d35e">VMA_POOL_CREATE_BUDDY_ALGORITHM_BIT</a> = 0x00000008,</div>
-<div class="line"><a name="l02883"></a><span class="lineno"> 2883</span>&#160; </div>
-<div class="line"><a name="l02886"></a><span class="lineno"> 2886</span>&#160;    <a class="code" href="vk__mem__alloc_8h.html#a9a7c45f9c863695d98c83fa5ac940fe7af4d270f8f42517a0f70037ceb6ac1d9c">VMA_POOL_CREATE_ALGORITHM_MASK</a> =</div>
-<div class="line"><a name="l02887"></a><span class="lineno"> 2887</span>&#160;        <a class="code" href="vk__mem__alloc_8h.html#a9a7c45f9c863695d98c83fa5ac940fe7a13c8a444197c67866be9cb05599fc726">VMA_POOL_CREATE_LINEAR_ALGORITHM_BIT</a> |</div>
-<div class="line"><a name="l02888"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#a9a7c45f9c863695d98c83fa5ac940fe7af4d270f8f42517a0f70037ceb6ac1d9c"> 2888</a></span>&#160;        <a class="code" href="vk__mem__alloc_8h.html#a9a7c45f9c863695d98c83fa5ac940fe7a97a0dc38e5161b780594d998d313d35e">VMA_POOL_CREATE_BUDDY_ALGORITHM_BIT</a>,</div>
-<div class="line"><a name="l02889"></a><span class="lineno"> 2889</span>&#160; </div>
-<div class="line"><a name="l02890"></a><span class="lineno"> 2890</span>&#160;    <a class="code" href="vk__mem__alloc_8h.html#a9a7c45f9c863695d98c83fa5ac940fe7a1c7312bea9ea246846b9054fd6bd6aec">VMA_POOL_CREATE_FLAG_BITS_MAX_ENUM</a> = 0x7FFFFFFF</div>
-<div class="line"><a name="l02891"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#a4d4f2efc2509157a9e4ecd4fd7942303"> 2891</a></span>&#160;} <a class="code" href="vk__mem__alloc_8h.html#a9a7c45f9c863695d98c83fa5ac940fe7">VmaPoolCreateFlagBits</a>;</div>
-<div class="line"><a name="l02892"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#a2770e325ea42e087c1b91fdf46d0292a"> 2892</a></span>&#160;<span class="keyword">typedef</span> VkFlags <a class="code" href="vk__mem__alloc_8h.html#a2770e325ea42e087c1b91fdf46d0292a">VmaPoolCreateFlags</a>;</div>
-<div class="line"><a name="l02893"></a><span class="lineno"> 2893</span>&#160; </div>
-<div class="line"><a name="l02896"></a><span class="lineno"><a class="line" href="struct_vma_pool_create_info.html"> 2896</a></span>&#160;<span class="keyword">typedef</span> <span class="keyword">struct </span><a class="code" href="struct_vma_pool_create_info.html">VmaPoolCreateInfo</a> {</div>
-<div class="line"><a name="l02899"></a><span class="lineno"><a class="line" href="struct_vma_pool_create_info.html#a596fa76b685d3f1f688f84a709a5b319"> 2899</a></span>&#160;    uint32_t <a class="code" href="struct_vma_pool_create_info.html#a596fa76b685d3f1f688f84a709a5b319">memoryTypeIndex</a>;</div>
-<div class="line"><a name="l02902"></a><span class="lineno"><a class="line" href="struct_vma_pool_create_info.html#a8405139f63d078340ae74513a59f5446"> 2902</a></span>&#160;    <a class="code" href="vk__mem__alloc_8h.html#a2770e325ea42e087c1b91fdf46d0292a">VmaPoolCreateFlags</a> <a class="code" href="struct_vma_pool_create_info.html#a8405139f63d078340ae74513a59f5446">flags</a>;</div>
-<div class="line"><a name="l02911"></a><span class="lineno"><a class="line" href="struct_vma_pool_create_info.html#aa4265160536cdb9be821b7686c16c676"> 2911</a></span>&#160;    VkDeviceSize <a class="code" href="struct_vma_pool_create_info.html#aa4265160536cdb9be821b7686c16c676">blockSize</a>;</div>
-<div class="line"><a name="l02916"></a><span class="lineno"><a class="line" href="struct_vma_pool_create_info.html#ad8006fb803185c0a699d30f3e9a865ae"> 2916</a></span>&#160;    <span class="keywordtype">size_t</span> <a class="code" href="struct_vma_pool_create_info.html#ad8006fb803185c0a699d30f3e9a865ae">minBlockCount</a>;</div>
-<div class="line"><a name="l02924"></a><span class="lineno"><a class="line" href="struct_vma_pool_create_info.html#ae41142f2834fcdc82baa4883c187b75c"> 2924</a></span>&#160;    <span class="keywordtype">size_t</span> <a class="code" href="struct_vma_pool_create_info.html#ae41142f2834fcdc82baa4883c187b75c">maxBlockCount</a>;</div>
-<div class="line"><a name="l02938"></a><span class="lineno"><a class="line" href="struct_vma_pool_create_info.html#a9437e43ffbb644dbbf7fc4e50cfad6aa"> 2938</a></span>&#160;    uint32_t <a class="code" href="struct_vma_pool_create_info.html#a9437e43ffbb644dbbf7fc4e50cfad6aa">frameInUseCount</a>;</div>
-<div class="line"><a name="l02939"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#a1017aa83489c0eee8d2163d2bf253f67"> 2939</a></span>&#160;} <a class="code" href="vk__mem__alloc_8h.html#a1017aa83489c0eee8d2163d2bf253f67">VmaPoolCreateInfo</a>;</div>
-<div class="line"><a name="l02940"></a><span class="lineno"> 2940</span>&#160; </div>
-<div class="line"><a name="l02943"></a><span class="lineno"><a class="line" href="struct_vma_pool_stats.html"> 2943</a></span>&#160;<span class="keyword">typedef</span> <span class="keyword">struct </span><a class="code" href="struct_vma_pool_stats.html">VmaPoolStats</a> {</div>
-<div class="line"><a name="l02946"></a><span class="lineno"><a class="line" href="struct_vma_pool_stats.html#a326807b2de2b0931cee4ed9a5f2e420c"> 2946</a></span>&#160;    VkDeviceSize <a class="code" href="struct_vma_pool_stats.html#a326807b2de2b0931cee4ed9a5f2e420c">size</a>;</div>
-<div class="line"><a name="l02949"></a><span class="lineno"><a class="line" href="struct_vma_pool_stats.html#ad7c54874724fce7b06aba526202d82a8"> 2949</a></span>&#160;    VkDeviceSize <a class="code" href="struct_vma_pool_stats.html#ad7c54874724fce7b06aba526202d82a8">unusedSize</a>;</div>
-<div class="line"><a name="l02952"></a><span class="lineno"><a class="line" href="struct_vma_pool_stats.html#ad1924eb54fffa45e9e0e65670c8fe5eb"> 2952</a></span>&#160;    <span class="keywordtype">size_t</span> <a class="code" href="struct_vma_pool_stats.html#ad1924eb54fffa45e9e0e65670c8fe5eb">allocationCount</a>;</div>
-<div class="line"><a name="l02955"></a><span class="lineno"><a class="line" href="struct_vma_pool_stats.html#ae4f3546ffa4d1e598b64d8e6134854f4"> 2955</a></span>&#160;    <span class="keywordtype">size_t</span> <a class="code" href="struct_vma_pool_stats.html#ae4f3546ffa4d1e598b64d8e6134854f4">unusedRangeCount</a>;</div>
-<div class="line"><a name="l02962"></a><span class="lineno"><a class="line" href="struct_vma_pool_stats.html#ab4c8f52dd42ab01998f60f0b6acc722b"> 2962</a></span>&#160;    VkDeviceSize <a class="code" href="struct_vma_pool_stats.html#ab4c8f52dd42ab01998f60f0b6acc722b">unusedRangeSizeMax</a>;</div>
-<div class="line"><a name="l02965"></a><span class="lineno"><a class="line" href="struct_vma_pool_stats.html#aa0b5cb45cef6f18571cefb03b9a230e7"> 2965</a></span>&#160;    <span class="keywordtype">size_t</span> <a class="code" href="struct_vma_pool_stats.html#aa0b5cb45cef6f18571cefb03b9a230e7">blockCount</a>;</div>
-<div class="line"><a name="l02966"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#a4759a2d9f99c19ba7627553c847132f1"> 2966</a></span>&#160;} <a class="code" href="vk__mem__alloc_8h.html#a4759a2d9f99c19ba7627553c847132f1">VmaPoolStats</a>;</div>
+<div class="line"><a name="l02631"></a><span class="lineno"><a class="line" href="struct_vma_budget.html#a7e2a6583ebd63e194951c542563804d8"> 2631</a></span>&#160;    VkDeviceSize <a class="code" href="struct_vma_budget.html#a7e2a6583ebd63e194951c542563804d8">allocationBytes</a>;</div>
+<div class="line"><a name="l02632"></a><span class="lineno"> 2632</span>&#160; </div>
+<div class="line"><a name="l02641"></a><span class="lineno"><a class="line" href="struct_vma_budget.html#a84dd1ecca8b0110259eb206dbadb11f6"> 2641</a></span>&#160;    VkDeviceSize <a class="code" href="struct_vma_budget.html#a84dd1ecca8b0110259eb206dbadb11f6">usage</a>;</div>
+<div class="line"><a name="l02642"></a><span class="lineno"> 2642</span>&#160; </div>
+<div class="line"><a name="l02652"></a><span class="lineno"><a class="line" href="struct_vma_budget.html#ab82e1d1754c2d210d0bdf90220bc6cdd"> 2652</a></span>&#160;    VkDeviceSize <a class="code" href="struct_vma_budget.html#ab82e1d1754c2d210d0bdf90220bc6cdd">budget</a>;</div>
+<div class="line"><a name="l02653"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#aa078667e71b1ef24e87a6a30d128381d"> 2653</a></span>&#160;} <a class="code" href="vk__mem__alloc_8h.html#aa078667e71b1ef24e87a6a30d128381d">VmaBudget</a>;</div>
+<div class="line"><a name="l02654"></a><span class="lineno"> 2654</span>&#160; </div>
+<div class="line"><a name="l02665"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#aec0ed24ebea2d0099eed5f801daaefba"> 2665</a></span>&#160;VMA_CALL_PRE <span class="keywordtype">void</span> VMA_CALL_POST <a class="code" href="vk__mem__alloc_8h.html#aec0ed24ebea2d0099eed5f801daaefba">vmaGetBudget</a>(</div>
+<div class="line"><a name="l02666"></a><span class="lineno"> 2666</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> VMA_NOT_NULL allocator,</div>
+<div class="line"><a name="l02667"></a><span class="lineno"> 2667</span>&#160;    <a class="code" href="struct_vma_budget.html">VmaBudget</a>* VMA_NOT_NULL pBudget);</div>
+<div class="line"><a name="l02668"></a><span class="lineno"> 2668</span>&#160; </div>
+<div class="line"><a name="l02669"></a><span class="lineno"> 2669</span>&#160;<span class="preprocessor">#ifndef VMA_STATS_STRING_ENABLED</span></div>
+<div class="line"><a name="l02670"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#ae25f0d55fd91cb166f002b63244800e1"> 2670</a></span>&#160;<span class="preprocessor">#define VMA_STATS_STRING_ENABLED 1</span></div>
+<div class="line"><a name="l02671"></a><span class="lineno"> 2671</span>&#160;<span class="preprocessor">#endif</span></div>
+<div class="line"><a name="l02672"></a><span class="lineno"> 2672</span>&#160; </div>
+<div class="line"><a name="l02673"></a><span class="lineno"> 2673</span>&#160;<span class="preprocessor">#if VMA_STATS_STRING_ENABLED</span></div>
+<div class="line"><a name="l02674"></a><span class="lineno"> 2674</span>&#160; </div>
+<div class="line"><a name="l02676"></a><span class="lineno"> 2676</span>&#160; </div>
+<div class="line"><a name="l02678"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#aa4fee7eb5253377599ef4fd38c93c2a0"> 2678</a></span>&#160;VMA_CALL_PRE <span class="keywordtype">void</span> VMA_CALL_POST <a class="code" href="vk__mem__alloc_8h.html#aa4fee7eb5253377599ef4fd38c93c2a0">vmaBuildStatsString</a>(</div>
+<div class="line"><a name="l02679"></a><span class="lineno"> 2679</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> VMA_NOT_NULL allocator,</div>
+<div class="line"><a name="l02680"></a><span class="lineno"> 2680</span>&#160;    <span class="keywordtype">char</span>* VMA_NULLABLE * VMA_NOT_NULL ppStatsString,</div>
+<div class="line"><a name="l02681"></a><span class="lineno"> 2681</span>&#160;    VkBool32 detailedMap);</div>
+<div class="line"><a name="l02682"></a><span class="lineno"> 2682</span>&#160; </div>
+<div class="line"><a name="l02683"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#a3104eb30d8122c84dd8541063f145288"> 2683</a></span>&#160;VMA_CALL_PRE <span class="keywordtype">void</span> VMA_CALL_POST <a class="code" href="vk__mem__alloc_8h.html#a3104eb30d8122c84dd8541063f145288">vmaFreeStatsString</a>(</div>
+<div class="line"><a name="l02684"></a><span class="lineno"> 2684</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> VMA_NOT_NULL allocator,</div>
+<div class="line"><a name="l02685"></a><span class="lineno"> 2685</span>&#160;    <span class="keywordtype">char</span>* VMA_NULLABLE pStatsString);</div>
+<div class="line"><a name="l02686"></a><span class="lineno"> 2686</span>&#160; </div>
+<div class="line"><a name="l02687"></a><span class="lineno"> 2687</span>&#160;<span class="preprocessor">#endif </span><span class="comment">// #if VMA_STATS_STRING_ENABLED</span></div>
+<div class="line"><a name="l02688"></a><span class="lineno"> 2688</span>&#160; </div>
+<div class="line"><a name="l02697"></a><span class="lineno"> 2697</span>&#160;VK_DEFINE_HANDLE(<a class="code" href="struct_vma_pool.html">VmaPool</a>)</div>
+<div class="line"><a name="l02698"></a><span class="lineno"> 2698</span>&#160; </div>
+<div class="line"><a name="l02699"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305cc"> 2699</a></span>&#160;typedef enum <a class="code" href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305cc">VmaMemoryUsage</a></div>
+<div class="line"><a name="l02700"></a><span class="lineno"> 2700</span>&#160;{</div>
+<div class="line"><a name="l02704"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305ccaf50d27e34e0925cf3a63db8c839121dd"> 2704</a></span>&#160;    <a class="code" href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305ccaf50d27e34e0925cf3a63db8c839121dd">VMA_MEMORY_USAGE_UNKNOWN</a> = 0,</div>
+<div class="line"><a name="l02721"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305ccac6b5dc1432d88647aa4cd456246eadf7"> 2721</a></span>&#160;    <a class="code" href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305ccac6b5dc1432d88647aa4cd456246eadf7">VMA_MEMORY_USAGE_GPU_ONLY</a> = 1,</div>
+<div class="line"><a name="l02731"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305cca40bdf4cddeffeb12f43d45ca1286e0a5"> 2731</a></span>&#160;    <a class="code" href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305cca40bdf4cddeffeb12f43d45ca1286e0a5">VMA_MEMORY_USAGE_CPU_ONLY</a> = 2,</div>
+<div class="line"><a name="l02738"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305cca9066b52c5a7079bb74a69aaf8b92ff67"> 2738</a></span>&#160;    <a class="code" href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305cca9066b52c5a7079bb74a69aaf8b92ff67">VMA_MEMORY_USAGE_CPU_TO_GPU</a> = 3,</div>
+<div class="line"><a name="l02747"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305cca7b586d2fdaf82a463b58f581ed72be27"> 2747</a></span>&#160;    <a class="code" href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305cca7b586d2fdaf82a463b58f581ed72be27">VMA_MEMORY_USAGE_GPU_TO_CPU</a> = 4,</div>
+<div class="line"><a name="l02753"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305cca416a444d4d0fc20067c3f76f32ff2500"> 2753</a></span>&#160;    <a class="code" href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305cca416a444d4d0fc20067c3f76f32ff2500">VMA_MEMORY_USAGE_CPU_COPY</a> = 5,</div>
+<div class="line"><a name="l02761"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305cca835333d9072db63a653818030e17614d"> 2761</a></span>&#160;    <a class="code" href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305cca835333d9072db63a653818030e17614d">VMA_MEMORY_USAGE_GPU_LAZILY_ALLOCATED</a> = 6,</div>
+<div class="line"><a name="l02762"></a><span class="lineno"> 2762</span>&#160; </div>
+<div class="line"><a name="l02763"></a><span class="lineno"> 2763</span>&#160;    <a class="code" href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305cca091e69437ef693e8d0d287f1c719ba6e">VMA_MEMORY_USAGE_MAX_ENUM</a> = 0x7FFFFFFF</div>
+<div class="line"><a name="l02764"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305cca091e69437ef693e8d0d287f1c719ba6e"> 2764</a></span>&#160;} <a class="code" href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305cc">VmaMemoryUsage</a>;</div>
+<div class="line"><a name="l02765"></a><span class="lineno"> 2765</span>&#160; </div>
+<div class="line"><a name="l02767"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597"> 2767</a></span>&#160;<span class="keyword">typedef</span> <span class="keyword">enum</span> <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597">VmaAllocationCreateFlagBits</a> {</div>
+<div class="line"><a name="l02774"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a3fc311d855c2ff53f1090ef5c722b38f"> 2774</a></span>&#160;    <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a3fc311d855c2ff53f1090ef5c722b38f">VMA_ALLOCATION_CREATE_DEDICATED_MEMORY_BIT</a> = 0x00000001,</div>
+<div class="line"><a name="l02775"></a><span class="lineno"> 2775</span>&#160; </div>
+<div class="line"><a name="l02785"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a89759603401014eb325eb22a3839f2ff"> 2785</a></span>&#160;    <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a89759603401014eb325eb22a3839f2ff">VMA_ALLOCATION_CREATE_NEVER_ALLOCATE_BIT</a> = 0x00000002,</div>
+<div class="line"><a name="l02798"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a11da372cc3a82931c5e5d6146cd9dd1f"> 2798</a></span>&#160;    <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a11da372cc3a82931c5e5d6146cd9dd1f">VMA_ALLOCATION_CREATE_MAPPED_BIT</a> = 0x00000004,</div>
+<div class="line"><a name="l02811"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a5f436af6c8fe8540573a6d22627a6fd2"> 2811</a></span>&#160;    <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a5f436af6c8fe8540573a6d22627a6fd2">VMA_ALLOCATION_CREATE_CAN_BECOME_LOST_BIT</a> = 0x00000008,</div>
+<div class="line"><a name="l02818"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a68686d0ce9beb0d4d1b9f2b8b1389a7e"> 2818</a></span>&#160;    <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a68686d0ce9beb0d4d1b9f2b8b1389a7e">VMA_ALLOCATION_CREATE_CAN_MAKE_OTHER_LOST_BIT</a> = 0x00000010,</div>
+<div class="line"><a name="l02824"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597aa6f24f821cd6a7c5e4a443f7bf59c520"> 2824</a></span>&#160;    <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597aa6f24f821cd6a7c5e4a443f7bf59c520">VMA_ALLOCATION_CREATE_USER_DATA_COPY_STRING_BIT</a> = 0x00000020,</div>
+<div class="line"><a name="l02829"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a42ba3a2d2c7117953210b7c3ef8da0df"> 2829</a></span>&#160;    <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a42ba3a2d2c7117953210b7c3ef8da0df">VMA_ALLOCATION_CREATE_UPPER_ADDRESS_BIT</a> = 0x00000040,</div>
+<div class="line"><a name="l02835"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a2310568c62208af432724305fe29ccea"> 2835</a></span>&#160;    <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a2310568c62208af432724305fe29ccea">VMA_ALLOCATION_CREATE_DONT_BIND_BIT</a> = 0x00000080,</div>
+<div class="line"><a name="l02839"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597ab8b1764f3e9022368e440c057783b92d"> 2839</a></span>&#160;    <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597ab8b1764f3e9022368e440c057783b92d">VMA_ALLOCATION_CREATE_WITHIN_BUDGET_BIT</a> = 0x00000100,</div>
+<div class="line"><a name="l02840"></a><span class="lineno"> 2840</span>&#160; </div>
+<div class="line"><a name="l02844"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a839826775c62319466441f86496f036d"> 2844</a></span>&#160;    <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a839826775c62319466441f86496f036d">VMA_ALLOCATION_CREATE_STRATEGY_BEST_FIT_BIT</a>  = 0x00010000,</div>
+<div class="line"><a name="l02848"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597ad242a04f802e25fef0b880afe8bb0a62"> 2848</a></span>&#160;    <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597ad242a04f802e25fef0b880afe8bb0a62">VMA_ALLOCATION_CREATE_STRATEGY_WORST_FIT_BIT</a> = 0x00020000,</div>
+<div class="line"><a name="l02855"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a33eb2052674f3ad92386c714a65fb777"> 2855</a></span>&#160;    <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a33eb2052674f3ad92386c714a65fb777">VMA_ALLOCATION_CREATE_STRATEGY_FIRST_FIT_BIT</a> = 0x00040000,</div>
+<div class="line"><a name="l02856"></a><span class="lineno"> 2856</span>&#160; </div>
+<div class="line"><a name="l02859"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a8af1210cf591784afa026d94998f735d"> 2859</a></span>&#160;    <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a8af1210cf591784afa026d94998f735d">VMA_ALLOCATION_CREATE_STRATEGY_MIN_MEMORY_BIT</a> = <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a839826775c62319466441f86496f036d">VMA_ALLOCATION_CREATE_STRATEGY_BEST_FIT_BIT</a>,</div>
+<div class="line"><a name="l02862"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a0729e932b7ea170e3a128cad96c5cf6d"> 2862</a></span>&#160;    <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a0729e932b7ea170e3a128cad96c5cf6d">VMA_ALLOCATION_CREATE_STRATEGY_MIN_TIME_BIT</a> = <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a33eb2052674f3ad92386c714a65fb777">VMA_ALLOCATION_CREATE_STRATEGY_FIRST_FIT_BIT</a>,</div>
+<div class="line"><a name="l02865"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a621b704103eb3360230c860acf36e706"> 2865</a></span>&#160;    <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a621b704103eb3360230c860acf36e706">VMA_ALLOCATION_CREATE_STRATEGY_MIN_FRAGMENTATION_BIT</a> = <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597ad242a04f802e25fef0b880afe8bb0a62">VMA_ALLOCATION_CREATE_STRATEGY_WORST_FIT_BIT</a>,</div>
+<div class="line"><a name="l02866"></a><span class="lineno"> 2866</span>&#160; </div>
+<div class="line"><a name="l02869"></a><span class="lineno"> 2869</span>&#160;    <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a8e16845d81ae3d27c47106d4770d5c7e">VMA_ALLOCATION_CREATE_STRATEGY_MASK</a> =</div>
+<div class="line"><a name="l02870"></a><span class="lineno"> 2870</span>&#160;        <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a839826775c62319466441f86496f036d">VMA_ALLOCATION_CREATE_STRATEGY_BEST_FIT_BIT</a> |</div>
+<div class="line"><a name="l02871"></a><span class="lineno"> 2871</span>&#160;        <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597ad242a04f802e25fef0b880afe8bb0a62">VMA_ALLOCATION_CREATE_STRATEGY_WORST_FIT_BIT</a> |</div>
+<div class="line"><a name="l02872"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a8e16845d81ae3d27c47106d4770d5c7e"> 2872</a></span>&#160;        <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a33eb2052674f3ad92386c714a65fb777">VMA_ALLOCATION_CREATE_STRATEGY_FIRST_FIT_BIT</a>,</div>
+<div class="line"><a name="l02873"></a><span class="lineno"> 2873</span>&#160; </div>
+<div class="line"><a name="l02874"></a><span class="lineno"> 2874</span>&#160;    <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597ae5633ec569f4899cf8f29e7385b2f882">VMA_ALLOCATION_CREATE_FLAG_BITS_MAX_ENUM</a> = 0x7FFFFFFF</div>
+<div class="line"><a name="l02875"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597ae5633ec569f4899cf8f29e7385b2f882"> 2875</a></span>&#160;} <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597">VmaAllocationCreateFlagBits</a>;</div>
+<div class="line"><a name="l02876"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#a5225e5e11f8376f6a31a1791f3d6e817"> 2876</a></span>&#160;<span class="keyword">typedef</span> VkFlags <a class="code" href="vk__mem__alloc_8h.html#a5225e5e11f8376f6a31a1791f3d6e817">VmaAllocationCreateFlags</a>;</div>
+<div class="line"><a name="l02877"></a><span class="lineno"> 2877</span>&#160; </div>
+<div class="line"><a name="l02878"></a><span class="lineno"><a class="line" href="struct_vma_allocation_create_info.html"> 2878</a></span>&#160;<span class="keyword">typedef</span> <span class="keyword">struct </span><a class="code" href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a></div>
+<div class="line"><a name="l02879"></a><span class="lineno"> 2879</span>&#160;{</div>
+<div class="line"><a name="l02881"></a><span class="lineno"><a class="line" href="struct_vma_allocation_create_info.html#add09658ac14fe290ace25470ddd6d41b"> 2881</a></span>&#160;    <a class="code" href="vk__mem__alloc_8h.html#a5225e5e11f8376f6a31a1791f3d6e817">VmaAllocationCreateFlags</a> <a class="code" href="struct_vma_allocation_create_info.html#add09658ac14fe290ace25470ddd6d41b">flags</a>;</div>
+<div class="line"><a name="l02887"></a><span class="lineno"><a class="line" href="struct_vma_allocation_create_info.html#accb8b06b1f677d858cb9af20705fa910"> 2887</a></span>&#160;    <a class="code" href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305cc">VmaMemoryUsage</a> <a class="code" href="struct_vma_allocation_create_info.html#accb8b06b1f677d858cb9af20705fa910">usage</a>;</div>
+<div class="line"><a name="l02892"></a><span class="lineno"><a class="line" href="struct_vma_allocation_create_info.html#a9166390303ff42d783305bc31c2b6b90"> 2892</a></span>&#160;    VkMemoryPropertyFlags <a class="code" href="struct_vma_allocation_create_info.html#a9166390303ff42d783305bc31c2b6b90">requiredFlags</a>;</div>
+<div class="line"><a name="l02897"></a><span class="lineno"><a class="line" href="struct_vma_allocation_create_info.html#a7fe8d81a1ad10b2a2faacacee5b15d6d"> 2897</a></span>&#160;    VkMemoryPropertyFlags <a class="code" href="struct_vma_allocation_create_info.html#a7fe8d81a1ad10b2a2faacacee5b15d6d">preferredFlags</a>;</div>
+<div class="line"><a name="l02905"></a><span class="lineno"><a class="line" href="struct_vma_allocation_create_info.html#a3bf940c0271d85d6ba32a4d820075055"> 2905</a></span>&#160;    uint32_t <a class="code" href="struct_vma_allocation_create_info.html#a3bf940c0271d85d6ba32a4d820075055">memoryTypeBits</a>;</div>
+<div class="line"><a name="l02911"></a><span class="lineno"><a class="line" href="struct_vma_allocation_create_info.html#a6272c0555cfd1fe28bff1afeb6190150"> 2911</a></span>&#160;    <a class="code" href="struct_vma_pool.html">VmaPool</a> VMA_NULLABLE <a class="code" href="struct_vma_allocation_create_info.html#a6272c0555cfd1fe28bff1afeb6190150">pool</a>;</div>
+<div class="line"><a name="l02918"></a><span class="lineno"><a class="line" href="struct_vma_allocation_create_info.html#a8259e85c272683434f4abb4ddddffe19"> 2918</a></span>&#160;    <span class="keywordtype">void</span>* VMA_NULLABLE <a class="code" href="struct_vma_allocation_create_info.html#a8259e85c272683434f4abb4ddddffe19">pUserData</a>;</div>
+<div class="line"><a name="l02925"></a><span class="lineno"><a class="line" href="struct_vma_allocation_create_info.html#a983d39e1a2e63649d78a960aa2fdd0f7"> 2925</a></span>&#160;    <span class="keywordtype">float</span> <a class="code" href="struct_vma_allocation_create_info.html#a983d39e1a2e63649d78a960aa2fdd0f7">priority</a>;</div>
+<div class="line"><a name="l02926"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#a3bf110892ea2fb4649fedb68488d026a"> 2926</a></span>&#160;} <a class="code" href="vk__mem__alloc_8h.html#a3bf110892ea2fb4649fedb68488d026a">VmaAllocationCreateInfo</a>;</div>
+<div class="line"><a name="l02927"></a><span class="lineno"> 2927</span>&#160; </div>
+<div class="line"><a name="l02944"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#aef15a94b58fbcb0fe706d5720e84a74a"> 2944</a></span>&#160;VMA_CALL_PRE VkResult VMA_CALL_POST <a class="code" href="vk__mem__alloc_8h.html#aef15a94b58fbcb0fe706d5720e84a74a">vmaFindMemoryTypeIndex</a>(</div>
+<div class="line"><a name="l02945"></a><span class="lineno"> 2945</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> VMA_NOT_NULL allocator,</div>
+<div class="line"><a name="l02946"></a><span class="lineno"> 2946</span>&#160;    uint32_t memoryTypeBits,</div>
+<div class="line"><a name="l02947"></a><span class="lineno"> 2947</span>&#160;    <span class="keyword">const</span> <a class="code" href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a>* VMA_NOT_NULL pAllocationCreateInfo,</div>
+<div class="line"><a name="l02948"></a><span class="lineno"> 2948</span>&#160;    uint32_t* VMA_NOT_NULL pMemoryTypeIndex);</div>
+<div class="line"><a name="l02949"></a><span class="lineno"> 2949</span>&#160; </div>
+<div class="line"><a name="l02962"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#ae790ab9ffaf7667fb8f62523e6897888"> 2962</a></span>&#160;VMA_CALL_PRE VkResult VMA_CALL_POST <a class="code" href="vk__mem__alloc_8h.html#ae790ab9ffaf7667fb8f62523e6897888">vmaFindMemoryTypeIndexForBufferInfo</a>(</div>
+<div class="line"><a name="l02963"></a><span class="lineno"> 2963</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> VMA_NOT_NULL allocator,</div>
+<div class="line"><a name="l02964"></a><span class="lineno"> 2964</span>&#160;    <span class="keyword">const</span> VkBufferCreateInfo* VMA_NOT_NULL pBufferCreateInfo,</div>
+<div class="line"><a name="l02965"></a><span class="lineno"> 2965</span>&#160;    <span class="keyword">const</span> <a class="code" href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a>* VMA_NOT_NULL pAllocationCreateInfo,</div>
+<div class="line"><a name="l02966"></a><span class="lineno"> 2966</span>&#160;    uint32_t* VMA_NOT_NULL pMemoryTypeIndex);</div>
 <div class="line"><a name="l02967"></a><span class="lineno"> 2967</span>&#160; </div>
-<div class="line"><a name="l02974"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#a5c8770ded7c59c8caac6de0c2cb00b50"> 2974</a></span>&#160;VMA_CALL_PRE VkResult VMA_CALL_POST <a class="code" href="vk__mem__alloc_8h.html#a5c8770ded7c59c8caac6de0c2cb00b50">vmaCreatePool</a>(</div>
-<div class="line"><a name="l02975"></a><span class="lineno"> 2975</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> VMA_NOT_NULL allocator,</div>
-<div class="line"><a name="l02976"></a><span class="lineno"> 2976</span>&#160;    <span class="keyword">const</span> <a class="code" href="struct_vma_pool_create_info.html">VmaPoolCreateInfo</a>* VMA_NOT_NULL pCreateInfo,</div>
-<div class="line"><a name="l02977"></a><span class="lineno"> 2977</span>&#160;    <a class="code" href="struct_vma_pool.html">VmaPool</a> VMA_NULLABLE * VMA_NOT_NULL pPool);</div>
-<div class="line"><a name="l02978"></a><span class="lineno"> 2978</span>&#160; </div>
-<div class="line"><a name="l02981"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#a5485779c8f1948238fc4e92232fa65e1"> 2981</a></span>&#160;VMA_CALL_PRE <span class="keywordtype">void</span> VMA_CALL_POST <a class="code" href="vk__mem__alloc_8h.html#a5485779c8f1948238fc4e92232fa65e1">vmaDestroyPool</a>(</div>
-<div class="line"><a name="l02982"></a><span class="lineno"> 2982</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> VMA_NOT_NULL allocator,</div>
-<div class="line"><a name="l02983"></a><span class="lineno"> 2983</span>&#160;    <a class="code" href="struct_vma_pool.html">VmaPool</a> VMA_NULLABLE pool);</div>
-<div class="line"><a name="l02984"></a><span class="lineno"> 2984</span>&#160; </div>
-<div class="line"><a name="l02991"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#ae8bf76997b234ef68aad922616df4153"> 2991</a></span>&#160;VMA_CALL_PRE <span class="keywordtype">void</span> VMA_CALL_POST <a class="code" href="vk__mem__alloc_8h.html#ae8bf76997b234ef68aad922616df4153">vmaGetPoolStats</a>(</div>
-<div class="line"><a name="l02992"></a><span class="lineno"> 2992</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> VMA_NOT_NULL allocator,</div>
-<div class="line"><a name="l02993"></a><span class="lineno"> 2993</span>&#160;    <a class="code" href="struct_vma_pool.html">VmaPool</a> VMA_NOT_NULL pool,</div>
-<div class="line"><a name="l02994"></a><span class="lineno"> 2994</span>&#160;    <a class="code" href="struct_vma_pool_stats.html">VmaPoolStats</a>* VMA_NOT_NULL pPoolStats);</div>
-<div class="line"><a name="l02995"></a><span class="lineno"> 2995</span>&#160; </div>
-<div class="line"><a name="l03002"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#a736bd6cbda886f36c891727e73bd4024"> 3002</a></span>&#160;VMA_CALL_PRE <span class="keywordtype">void</span> VMA_CALL_POST <a class="code" href="vk__mem__alloc_8h.html#a736bd6cbda886f36c891727e73bd4024">vmaMakePoolAllocationsLost</a>(</div>
-<div class="line"><a name="l03003"></a><span class="lineno"> 3003</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> VMA_NOT_NULL allocator,</div>
-<div class="line"><a name="l03004"></a><span class="lineno"> 3004</span>&#160;    <a class="code" href="struct_vma_pool.html">VmaPool</a> VMA_NOT_NULL pool,</div>
-<div class="line"><a name="l03005"></a><span class="lineno"> 3005</span>&#160;    <span class="keywordtype">size_t</span>* VMA_NULLABLE pLostAllocationCount);</div>
+<div class="line"><a name="l02980"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#a088da83d8eaf3ce9056d9ea0b981d472"> 2980</a></span>&#160;VMA_CALL_PRE VkResult VMA_CALL_POST <a class="code" href="vk__mem__alloc_8h.html#a088da83d8eaf3ce9056d9ea0b981d472">vmaFindMemoryTypeIndexForImageInfo</a>(</div>
+<div class="line"><a name="l02981"></a><span class="lineno"> 2981</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> VMA_NOT_NULL allocator,</div>
+<div class="line"><a name="l02982"></a><span class="lineno"> 2982</span>&#160;    <span class="keyword">const</span> VkImageCreateInfo* VMA_NOT_NULL pImageCreateInfo,</div>
+<div class="line"><a name="l02983"></a><span class="lineno"> 2983</span>&#160;    <span class="keyword">const</span> <a class="code" href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a>* VMA_NOT_NULL pAllocationCreateInfo,</div>
+<div class="line"><a name="l02984"></a><span class="lineno"> 2984</span>&#160;    uint32_t* VMA_NOT_NULL pMemoryTypeIndex);</div>
+<div class="line"><a name="l02985"></a><span class="lineno"> 2985</span>&#160; </div>
+<div class="line"><a name="l02987"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#a9a7c45f9c863695d98c83fa5ac940fe7"> 2987</a></span>&#160;<span class="keyword">typedef</span> <span class="keyword">enum</span> <a class="code" href="vk__mem__alloc_8h.html#a9a7c45f9c863695d98c83fa5ac940fe7">VmaPoolCreateFlagBits</a> {</div>
+<div class="line"><a name="l03005"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#a9a7c45f9c863695d98c83fa5ac940fe7a9f1a499508a8edb4e8ba40aa0290a3d2"> 3005</a></span>&#160;    <a class="code" href="vk__mem__alloc_8h.html#a9a7c45f9c863695d98c83fa5ac940fe7a9f1a499508a8edb4e8ba40aa0290a3d2">VMA_POOL_CREATE_IGNORE_BUFFER_IMAGE_GRANULARITY_BIT</a> = 0x00000002,</div>
 <div class="line"><a name="l03006"></a><span class="lineno"> 3006</span>&#160; </div>
-<div class="line"><a name="l03021"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#ad535935619c7a549bf837e1bb0068f89"> 3021</a></span>&#160;VMA_CALL_PRE VkResult VMA_CALL_POST <a class="code" href="vk__mem__alloc_8h.html#ad535935619c7a549bf837e1bb0068f89">vmaCheckPoolCorruption</a>(<a class="code" href="struct_vma_allocator.html">VmaAllocator</a> VMA_NOT_NULL allocator, <a class="code" href="struct_vma_pool.html">VmaPool</a> VMA_NOT_NULL pool);</div>
-<div class="line"><a name="l03022"></a><span class="lineno"> 3022</span>&#160; </div>
-<div class="line"><a name="l03029"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#af09b4e4eafdbee812e8d73ddf960f030"> 3029</a></span>&#160;VMA_CALL_PRE <span class="keywordtype">void</span> VMA_CALL_POST <a class="code" href="vk__mem__alloc_8h.html#af09b4e4eafdbee812e8d73ddf960f030">vmaGetPoolName</a>(</div>
-<div class="line"><a name="l03030"></a><span class="lineno"> 3030</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> VMA_NOT_NULL allocator,</div>
-<div class="line"><a name="l03031"></a><span class="lineno"> 3031</span>&#160;    <a class="code" href="struct_vma_pool.html">VmaPool</a> VMA_NOT_NULL pool,</div>
-<div class="line"><a name="l03032"></a><span class="lineno"> 3032</span>&#160;    <span class="keyword">const</span> <span class="keywordtype">char</span>* VMA_NULLABLE * VMA_NOT_NULL ppName);</div>
-<div class="line"><a name="l03033"></a><span class="lineno"> 3033</span>&#160; </div>
-<div class="line"><a name="l03039"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#adbae3a0b4ab078024462fc85c37f3b58"> 3039</a></span>&#160;VMA_CALL_PRE <span class="keywordtype">void</span> VMA_CALL_POST <a class="code" href="vk__mem__alloc_8h.html#adbae3a0b4ab078024462fc85c37f3b58">vmaSetPoolName</a>(</div>
-<div class="line"><a name="l03040"></a><span class="lineno"> 3040</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> VMA_NOT_NULL allocator,</div>
-<div class="line"><a name="l03041"></a><span class="lineno"> 3041</span>&#160;    <a class="code" href="struct_vma_pool.html">VmaPool</a> VMA_NOT_NULL pool,</div>
-<div class="line"><a name="l03042"></a><span class="lineno"> 3042</span>&#160;    <span class="keyword">const</span> <span class="keywordtype">char</span>* VMA_NULLABLE pName);</div>
-<div class="line"><a name="l03043"></a><span class="lineno"> 3043</span>&#160; </div>
-<div class="line"><a name="l03068"></a><span class="lineno"> 3068</span>&#160;VK_DEFINE_HANDLE(<a class="code" href="struct_vma_allocation.html">VmaAllocation</a>)</div>
-<div class="line"><a name="l03069"></a><span class="lineno"> 3069</span>&#160; </div>
-<div class="line"><a name="l03070"></a><span class="lineno"> 3070</span>&#160; </div>
-<div class="line"><a name="l03072"></a><span class="lineno"><a class="line" href="struct_vma_allocation_info.html"> 3072</a></span>&#160;typedef struct <a class="code" href="struct_vma_allocation_info.html">VmaAllocationInfo</a> {</div>
-<div class="line"><a name="l03077"></a><span class="lineno"><a class="line" href="struct_vma_allocation_info.html#a7f6b0aa58c135e488e6b40a388dad9d5"> 3077</a></span>&#160;    uint32_t <a class="code" href="struct_vma_allocation_info.html#a7f6b0aa58c135e488e6b40a388dad9d5">memoryType</a>;</div>
-<div class="line"><a name="l03086"></a><span class="lineno"><a class="line" href="struct_vma_allocation_info.html#ae0bfb7dfdf79a76ffefc9a94677a2f67"> 3086</a></span>&#160;    VkDeviceMemory VMA_NULLABLE_NON_DISPATCHABLE <a class="code" href="struct_vma_allocation_info.html#ae0bfb7dfdf79a76ffefc9a94677a2f67">deviceMemory</a>;</div>
-<div class="line"><a name="l03091"></a><span class="lineno"><a class="line" href="struct_vma_allocation_info.html#a4a3c732388dbdc7a23f9365b00825268"> 3091</a></span>&#160;    VkDeviceSize <a class="code" href="struct_vma_allocation_info.html#a4a3c732388dbdc7a23f9365b00825268">offset</a>;</div>
-<div class="line"><a name="l03096"></a><span class="lineno"><a class="line" href="struct_vma_allocation_info.html#aac76d113a6a5ccbb09fea00fb25fd18f"> 3096</a></span>&#160;    VkDeviceSize <a class="code" href="struct_vma_allocation_info.html#aac76d113a6a5ccbb09fea00fb25fd18f">size</a>;</div>
-<div class="line"><a name="l03105"></a><span class="lineno"><a class="line" href="struct_vma_allocation_info.html#a5eeffbe2d2f30f53370ff14aefbadbe2"> 3105</a></span>&#160;    <span class="keywordtype">void</span>* VMA_NULLABLE <a class="code" href="struct_vma_allocation_info.html#a5eeffbe2d2f30f53370ff14aefbadbe2">pMappedData</a>;</div>
-<div class="line"><a name="l03110"></a><span class="lineno"><a class="line" href="struct_vma_allocation_info.html#adc507656149c04de7ed95d0042ba2a13"> 3110</a></span>&#160;    <span class="keywordtype">void</span>* VMA_NULLABLE <a class="code" href="struct_vma_allocation_info.html#adc507656149c04de7ed95d0042ba2a13">pUserData</a>;</div>
-<div class="line"><a name="l03111"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#a1cf7774606721026a68aabe3af2e5b50"> 3111</a></span>&#160;} <a class="code" href="vk__mem__alloc_8h.html#a1cf7774606721026a68aabe3af2e5b50">VmaAllocationInfo</a>;</div>
-<div class="line"><a name="l03112"></a><span class="lineno"> 3112</span>&#160; </div>
-<div class="line"><a name="l03123"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#abf28077dbf82d0908b8acbe8ee8dd9b8"> 3123</a></span>&#160;VMA_CALL_PRE VkResult VMA_CALL_POST <a class="code" href="vk__mem__alloc_8h.html#abf28077dbf82d0908b8acbe8ee8dd9b8">vmaAllocateMemory</a>(</div>
-<div class="line"><a name="l03124"></a><span class="lineno"> 3124</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> VMA_NOT_NULL allocator,</div>
-<div class="line"><a name="l03125"></a><span class="lineno"> 3125</span>&#160;    <span class="keyword">const</span> VkMemoryRequirements* VMA_NOT_NULL pVkMemoryRequirements,</div>
-<div class="line"><a name="l03126"></a><span class="lineno"> 3126</span>&#160;    <span class="keyword">const</span> <a class="code" href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a>* VMA_NOT_NULL pCreateInfo,</div>
-<div class="line"><a name="l03127"></a><span class="lineno"> 3127</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> VMA_NULLABLE * VMA_NOT_NULL pAllocation,</div>
-<div class="line"><a name="l03128"></a><span class="lineno"> 3128</span>&#160;    <a class="code" href="struct_vma_allocation_info.html">VmaAllocationInfo</a>* VMA_NULLABLE pAllocationInfo);</div>
-<div class="line"><a name="l03129"></a><span class="lineno"> 3129</span>&#160; </div>
-<div class="line"><a name="l03149"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#ad37e82e492b3de38fc3f4cffd9ad0ae1"> 3149</a></span>&#160;VMA_CALL_PRE VkResult VMA_CALL_POST <a class="code" href="vk__mem__alloc_8h.html#ad37e82e492b3de38fc3f4cffd9ad0ae1">vmaAllocateMemoryPages</a>(</div>
-<div class="line"><a name="l03150"></a><span class="lineno"> 3150</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> VMA_NOT_NULL allocator,</div>
-<div class="line"><a name="l03151"></a><span class="lineno"> 3151</span>&#160;    <span class="keyword">const</span> VkMemoryRequirements* VMA_NOT_NULL VMA_LEN_IF_NOT_NULL(allocationCount) pVkMemoryRequirements,</div>
-<div class="line"><a name="l03152"></a><span class="lineno"> 3152</span>&#160;    <span class="keyword">const</span> <a class="code" href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a>* VMA_NOT_NULL VMA_LEN_IF_NOT_NULL(allocationCount) pCreateInfo,</div>
-<div class="line"><a name="l03153"></a><span class="lineno"> 3153</span>&#160;    <span class="keywordtype">size_t</span> allocationCount,</div>
-<div class="line"><a name="l03154"></a><span class="lineno"> 3154</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> VMA_NULLABLE * VMA_NOT_NULL VMA_LEN_IF_NOT_NULL(allocationCount) pAllocations,</div>
-<div class="line"><a name="l03155"></a><span class="lineno"> 3155</span>&#160;    <a class="code" href="struct_vma_allocation_info.html">VmaAllocationInfo</a>* VMA_NULLABLE VMA_LEN_IF_NOT_NULL(allocationCount) pAllocationInfo);</div>
-<div class="line"><a name="l03156"></a><span class="lineno"> 3156</span>&#160; </div>
-<div class="line"><a name="l03163"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#a7fdf64415b6c3d83c454f28d2c53df7b"> 3163</a></span>&#160;VMA_CALL_PRE VkResult VMA_CALL_POST <a class="code" href="vk__mem__alloc_8h.html#a7fdf64415b6c3d83c454f28d2c53df7b">vmaAllocateMemoryForBuffer</a>(</div>
-<div class="line"><a name="l03164"></a><span class="lineno"> 3164</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> VMA_NOT_NULL allocator,</div>
-<div class="line"><a name="l03165"></a><span class="lineno"> 3165</span>&#160;    VkBuffer VMA_NOT_NULL_NON_DISPATCHABLE buffer,</div>
-<div class="line"><a name="l03166"></a><span class="lineno"> 3166</span>&#160;    <span class="keyword">const</span> <a class="code" href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a>* VMA_NOT_NULL pCreateInfo,</div>
-<div class="line"><a name="l03167"></a><span class="lineno"> 3167</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> VMA_NULLABLE * VMA_NOT_NULL pAllocation,</div>
-<div class="line"><a name="l03168"></a><span class="lineno"> 3168</span>&#160;    <a class="code" href="struct_vma_allocation_info.html">VmaAllocationInfo</a>* VMA_NULLABLE pAllocationInfo);</div>
-<div class="line"><a name="l03169"></a><span class="lineno"> 3169</span>&#160; </div>
-<div class="line"><a name="l03171"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#a0faa3f9e5fb233d29d1e00390650febb"> 3171</a></span>&#160;VMA_CALL_PRE VkResult VMA_CALL_POST <a class="code" href="vk__mem__alloc_8h.html#a0faa3f9e5fb233d29d1e00390650febb">vmaAllocateMemoryForImage</a>(</div>
-<div class="line"><a name="l03172"></a><span class="lineno"> 3172</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> VMA_NOT_NULL allocator,</div>
-<div class="line"><a name="l03173"></a><span class="lineno"> 3173</span>&#160;    VkImage VMA_NOT_NULL_NON_DISPATCHABLE image,</div>
-<div class="line"><a name="l03174"></a><span class="lineno"> 3174</span>&#160;    <span class="keyword">const</span> <a class="code" href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a>* VMA_NOT_NULL pCreateInfo,</div>
-<div class="line"><a name="l03175"></a><span class="lineno"> 3175</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> VMA_NULLABLE * VMA_NOT_NULL pAllocation,</div>
-<div class="line"><a name="l03176"></a><span class="lineno"> 3176</span>&#160;    <a class="code" href="struct_vma_allocation_info.html">VmaAllocationInfo</a>* VMA_NULLABLE pAllocationInfo);</div>
-<div class="line"><a name="l03177"></a><span class="lineno"> 3177</span>&#160; </div>
-<div class="line"><a name="l03182"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#a5fea5518972ae9094b1526cbcb19b05f"> 3182</a></span>&#160;VMA_CALL_PRE <span class="keywordtype">void</span> VMA_CALL_POST <a class="code" href="vk__mem__alloc_8h.html#a5fea5518972ae9094b1526cbcb19b05f">vmaFreeMemory</a>(</div>
-<div class="line"><a name="l03183"></a><span class="lineno"> 3183</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> VMA_NOT_NULL allocator,</div>
-<div class="line"><a name="l03184"></a><span class="lineno"> 3184</span>&#160;    <span class="keyword">const</span> <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> VMA_NULLABLE allocation);</div>
-<div class="line"><a name="l03185"></a><span class="lineno"> 3185</span>&#160; </div>
-<div class="line"><a name="l03196"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#a834b1e4aef395c0a1d56a28e69a4a17e"> 3196</a></span>&#160;VMA_CALL_PRE <span class="keywordtype">void</span> VMA_CALL_POST <a class="code" href="vk__mem__alloc_8h.html#a834b1e4aef395c0a1d56a28e69a4a17e">vmaFreeMemoryPages</a>(</div>
+<div class="line"><a name="l03022"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#a9a7c45f9c863695d98c83fa5ac940fe7a13c8a444197c67866be9cb05599fc726"> 3022</a></span>&#160;    <a class="code" href="vk__mem__alloc_8h.html#a9a7c45f9c863695d98c83fa5ac940fe7a13c8a444197c67866be9cb05599fc726">VMA_POOL_CREATE_LINEAR_ALGORITHM_BIT</a> = 0x00000004,</div>
+<div class="line"><a name="l03023"></a><span class="lineno"> 3023</span>&#160; </div>
+<div class="line"><a name="l03033"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#a9a7c45f9c863695d98c83fa5ac940fe7a97a0dc38e5161b780594d998d313d35e"> 3033</a></span>&#160;    <a class="code" href="vk__mem__alloc_8h.html#a9a7c45f9c863695d98c83fa5ac940fe7a97a0dc38e5161b780594d998d313d35e">VMA_POOL_CREATE_BUDDY_ALGORITHM_BIT</a> = 0x00000008,</div>
+<div class="line"><a name="l03034"></a><span class="lineno"> 3034</span>&#160; </div>
+<div class="line"><a name="l03037"></a><span class="lineno"> 3037</span>&#160;    <a class="code" href="vk__mem__alloc_8h.html#a9a7c45f9c863695d98c83fa5ac940fe7af4d270f8f42517a0f70037ceb6ac1d9c">VMA_POOL_CREATE_ALGORITHM_MASK</a> =</div>
+<div class="line"><a name="l03038"></a><span class="lineno"> 3038</span>&#160;        <a class="code" href="vk__mem__alloc_8h.html#a9a7c45f9c863695d98c83fa5ac940fe7a13c8a444197c67866be9cb05599fc726">VMA_POOL_CREATE_LINEAR_ALGORITHM_BIT</a> |</div>
+<div class="line"><a name="l03039"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#a9a7c45f9c863695d98c83fa5ac940fe7af4d270f8f42517a0f70037ceb6ac1d9c"> 3039</a></span>&#160;        <a class="code" href="vk__mem__alloc_8h.html#a9a7c45f9c863695d98c83fa5ac940fe7a97a0dc38e5161b780594d998d313d35e">VMA_POOL_CREATE_BUDDY_ALGORITHM_BIT</a>,</div>
+<div class="line"><a name="l03040"></a><span class="lineno"> 3040</span>&#160; </div>
+<div class="line"><a name="l03041"></a><span class="lineno"> 3041</span>&#160;    <a class="code" href="vk__mem__alloc_8h.html#a9a7c45f9c863695d98c83fa5ac940fe7a1c7312bea9ea246846b9054fd6bd6aec">VMA_POOL_CREATE_FLAG_BITS_MAX_ENUM</a> = 0x7FFFFFFF</div>
+<div class="line"><a name="l03042"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#a9a7c45f9c863695d98c83fa5ac940fe7a1c7312bea9ea246846b9054fd6bd6aec"> 3042</a></span>&#160;} <a class="code" href="vk__mem__alloc_8h.html#a9a7c45f9c863695d98c83fa5ac940fe7">VmaPoolCreateFlagBits</a>;</div>
+<div class="line"><a name="l03043"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#a2770e325ea42e087c1b91fdf46d0292a"> 3043</a></span>&#160;<span class="keyword">typedef</span> VkFlags <a class="code" href="vk__mem__alloc_8h.html#a2770e325ea42e087c1b91fdf46d0292a">VmaPoolCreateFlags</a>;</div>
+<div class="line"><a name="l03044"></a><span class="lineno"> 3044</span>&#160; </div>
+<div class="line"><a name="l03047"></a><span class="lineno"><a class="line" href="struct_vma_pool_create_info.html"> 3047</a></span>&#160;<span class="keyword">typedef</span> <span class="keyword">struct </span><a class="code" href="struct_vma_pool_create_info.html">VmaPoolCreateInfo</a> {</div>
+<div class="line"><a name="l03050"></a><span class="lineno"><a class="line" href="struct_vma_pool_create_info.html#a596fa76b685d3f1f688f84a709a5b319"> 3050</a></span>&#160;    uint32_t <a class="code" href="struct_vma_pool_create_info.html#a596fa76b685d3f1f688f84a709a5b319">memoryTypeIndex</a>;</div>
+<div class="line"><a name="l03053"></a><span class="lineno"><a class="line" href="struct_vma_pool_create_info.html#a8405139f63d078340ae74513a59f5446"> 3053</a></span>&#160;    <a class="code" href="vk__mem__alloc_8h.html#a2770e325ea42e087c1b91fdf46d0292a">VmaPoolCreateFlags</a> <a class="code" href="struct_vma_pool_create_info.html#a8405139f63d078340ae74513a59f5446">flags</a>;</div>
+<div class="line"><a name="l03062"></a><span class="lineno"><a class="line" href="struct_vma_pool_create_info.html#aa4265160536cdb9be821b7686c16c676"> 3062</a></span>&#160;    VkDeviceSize <a class="code" href="struct_vma_pool_create_info.html#aa4265160536cdb9be821b7686c16c676">blockSize</a>;</div>
+<div class="line"><a name="l03067"></a><span class="lineno"><a class="line" href="struct_vma_pool_create_info.html#ad8006fb803185c0a699d30f3e9a865ae"> 3067</a></span>&#160;    <span class="keywordtype">size_t</span> <a class="code" href="struct_vma_pool_create_info.html#ad8006fb803185c0a699d30f3e9a865ae">minBlockCount</a>;</div>
+<div class="line"><a name="l03075"></a><span class="lineno"><a class="line" href="struct_vma_pool_create_info.html#ae41142f2834fcdc82baa4883c187b75c"> 3075</a></span>&#160;    <span class="keywordtype">size_t</span> <a class="code" href="struct_vma_pool_create_info.html#ae41142f2834fcdc82baa4883c187b75c">maxBlockCount</a>;</div>
+<div class="line"><a name="l03089"></a><span class="lineno"><a class="line" href="struct_vma_pool_create_info.html#a9437e43ffbb644dbbf7fc4e50cfad6aa"> 3089</a></span>&#160;    uint32_t <a class="code" href="struct_vma_pool_create_info.html#a9437e43ffbb644dbbf7fc4e50cfad6aa">frameInUseCount</a>;</div>
+<div class="line"><a name="l03095"></a><span class="lineno"><a class="line" href="struct_vma_pool_create_info.html#a16e686c688f6725f119ebf6e24ab5274"> 3095</a></span>&#160;    <span class="keywordtype">float</span> <a class="code" href="struct_vma_pool_create_info.html#a16e686c688f6725f119ebf6e24ab5274">priority</a>;</div>
+<div class="line"><a name="l03096"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#a1017aa83489c0eee8d2163d2bf253f67"> 3096</a></span>&#160;} <a class="code" href="vk__mem__alloc_8h.html#a1017aa83489c0eee8d2163d2bf253f67">VmaPoolCreateInfo</a>;</div>
+<div class="line"><a name="l03097"></a><span class="lineno"> 3097</span>&#160; </div>
+<div class="line"><a name="l03100"></a><span class="lineno"><a class="line" href="struct_vma_pool_stats.html"> 3100</a></span>&#160;<span class="keyword">typedef</span> <span class="keyword">struct </span><a class="code" href="struct_vma_pool_stats.html">VmaPoolStats</a> {</div>
+<div class="line"><a name="l03103"></a><span class="lineno"><a class="line" href="struct_vma_pool_stats.html#a326807b2de2b0931cee4ed9a5f2e420c"> 3103</a></span>&#160;    VkDeviceSize <a class="code" href="struct_vma_pool_stats.html#a326807b2de2b0931cee4ed9a5f2e420c">size</a>;</div>
+<div class="line"><a name="l03106"></a><span class="lineno"><a class="line" href="struct_vma_pool_stats.html#ad7c54874724fce7b06aba526202d82a8"> 3106</a></span>&#160;    VkDeviceSize <a class="code" href="struct_vma_pool_stats.html#ad7c54874724fce7b06aba526202d82a8">unusedSize</a>;</div>
+<div class="line"><a name="l03109"></a><span class="lineno"><a class="line" href="struct_vma_pool_stats.html#ad1924eb54fffa45e9e0e65670c8fe5eb"> 3109</a></span>&#160;    <span class="keywordtype">size_t</span> <a class="code" href="struct_vma_pool_stats.html#ad1924eb54fffa45e9e0e65670c8fe5eb">allocationCount</a>;</div>
+<div class="line"><a name="l03112"></a><span class="lineno"><a class="line" href="struct_vma_pool_stats.html#ae4f3546ffa4d1e598b64d8e6134854f4"> 3112</a></span>&#160;    <span class="keywordtype">size_t</span> <a class="code" href="struct_vma_pool_stats.html#ae4f3546ffa4d1e598b64d8e6134854f4">unusedRangeCount</a>;</div>
+<div class="line"><a name="l03119"></a><span class="lineno"><a class="line" href="struct_vma_pool_stats.html#ab4c8f52dd42ab01998f60f0b6acc722b"> 3119</a></span>&#160;    VkDeviceSize <a class="code" href="struct_vma_pool_stats.html#ab4c8f52dd42ab01998f60f0b6acc722b">unusedRangeSizeMax</a>;</div>
+<div class="line"><a name="l03122"></a><span class="lineno"><a class="line" href="struct_vma_pool_stats.html#aa0b5cb45cef6f18571cefb03b9a230e7"> 3122</a></span>&#160;    <span class="keywordtype">size_t</span> <a class="code" href="struct_vma_pool_stats.html#aa0b5cb45cef6f18571cefb03b9a230e7">blockCount</a>;</div>
+<div class="line"><a name="l03123"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#a4759a2d9f99c19ba7627553c847132f1"> 3123</a></span>&#160;} <a class="code" href="vk__mem__alloc_8h.html#a4759a2d9f99c19ba7627553c847132f1">VmaPoolStats</a>;</div>
+<div class="line"><a name="l03124"></a><span class="lineno"> 3124</span>&#160; </div>
+<div class="line"><a name="l03131"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#a5c8770ded7c59c8caac6de0c2cb00b50"> 3131</a></span>&#160;VMA_CALL_PRE VkResult VMA_CALL_POST <a class="code" href="vk__mem__alloc_8h.html#a5c8770ded7c59c8caac6de0c2cb00b50">vmaCreatePool</a>(</div>
+<div class="line"><a name="l03132"></a><span class="lineno"> 3132</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> VMA_NOT_NULL allocator,</div>
+<div class="line"><a name="l03133"></a><span class="lineno"> 3133</span>&#160;    <span class="keyword">const</span> <a class="code" href="struct_vma_pool_create_info.html">VmaPoolCreateInfo</a>* VMA_NOT_NULL pCreateInfo,</div>
+<div class="line"><a name="l03134"></a><span class="lineno"> 3134</span>&#160;    <a class="code" href="struct_vma_pool.html">VmaPool</a> VMA_NULLABLE * VMA_NOT_NULL pPool);</div>
+<div class="line"><a name="l03135"></a><span class="lineno"> 3135</span>&#160; </div>
+<div class="line"><a name="l03138"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#a5485779c8f1948238fc4e92232fa65e1"> 3138</a></span>&#160;VMA_CALL_PRE <span class="keywordtype">void</span> VMA_CALL_POST <a class="code" href="vk__mem__alloc_8h.html#a5485779c8f1948238fc4e92232fa65e1">vmaDestroyPool</a>(</div>
+<div class="line"><a name="l03139"></a><span class="lineno"> 3139</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> VMA_NOT_NULL allocator,</div>
+<div class="line"><a name="l03140"></a><span class="lineno"> 3140</span>&#160;    <a class="code" href="struct_vma_pool.html">VmaPool</a> VMA_NULLABLE pool);</div>
+<div class="line"><a name="l03141"></a><span class="lineno"> 3141</span>&#160; </div>
+<div class="line"><a name="l03148"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#ae8bf76997b234ef68aad922616df4153"> 3148</a></span>&#160;VMA_CALL_PRE <span class="keywordtype">void</span> VMA_CALL_POST <a class="code" href="vk__mem__alloc_8h.html#ae8bf76997b234ef68aad922616df4153">vmaGetPoolStats</a>(</div>
+<div class="line"><a name="l03149"></a><span class="lineno"> 3149</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> VMA_NOT_NULL allocator,</div>
+<div class="line"><a name="l03150"></a><span class="lineno"> 3150</span>&#160;    <a class="code" href="struct_vma_pool.html">VmaPool</a> VMA_NOT_NULL pool,</div>
+<div class="line"><a name="l03151"></a><span class="lineno"> 3151</span>&#160;    <a class="code" href="struct_vma_pool_stats.html">VmaPoolStats</a>* VMA_NOT_NULL pPoolStats);</div>
+<div class="line"><a name="l03152"></a><span class="lineno"> 3152</span>&#160; </div>
+<div class="line"><a name="l03159"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#a736bd6cbda886f36c891727e73bd4024"> 3159</a></span>&#160;VMA_CALL_PRE <span class="keywordtype">void</span> VMA_CALL_POST <a class="code" href="vk__mem__alloc_8h.html#a736bd6cbda886f36c891727e73bd4024">vmaMakePoolAllocationsLost</a>(</div>
+<div class="line"><a name="l03160"></a><span class="lineno"> 3160</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> VMA_NOT_NULL allocator,</div>
+<div class="line"><a name="l03161"></a><span class="lineno"> 3161</span>&#160;    <a class="code" href="struct_vma_pool.html">VmaPool</a> VMA_NOT_NULL pool,</div>
+<div class="line"><a name="l03162"></a><span class="lineno"> 3162</span>&#160;    <span class="keywordtype">size_t</span>* VMA_NULLABLE pLostAllocationCount);</div>
+<div class="line"><a name="l03163"></a><span class="lineno"> 3163</span>&#160; </div>
+<div class="line"><a name="l03178"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#ad535935619c7a549bf837e1bb0068f89"> 3178</a></span>&#160;VMA_CALL_PRE VkResult VMA_CALL_POST <a class="code" href="vk__mem__alloc_8h.html#ad535935619c7a549bf837e1bb0068f89">vmaCheckPoolCorruption</a>(<a class="code" href="struct_vma_allocator.html">VmaAllocator</a> VMA_NOT_NULL allocator, <a class="code" href="struct_vma_pool.html">VmaPool</a> VMA_NOT_NULL pool);</div>
+<div class="line"><a name="l03179"></a><span class="lineno"> 3179</span>&#160; </div>
+<div class="line"><a name="l03186"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#af09b4e4eafdbee812e8d73ddf960f030"> 3186</a></span>&#160;VMA_CALL_PRE <span class="keywordtype">void</span> VMA_CALL_POST <a class="code" href="vk__mem__alloc_8h.html#af09b4e4eafdbee812e8d73ddf960f030">vmaGetPoolName</a>(</div>
+<div class="line"><a name="l03187"></a><span class="lineno"> 3187</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> VMA_NOT_NULL allocator,</div>
+<div class="line"><a name="l03188"></a><span class="lineno"> 3188</span>&#160;    <a class="code" href="struct_vma_pool.html">VmaPool</a> VMA_NOT_NULL pool,</div>
+<div class="line"><a name="l03189"></a><span class="lineno"> 3189</span>&#160;    <span class="keyword">const</span> <span class="keywordtype">char</span>* VMA_NULLABLE * VMA_NOT_NULL ppName);</div>
+<div class="line"><a name="l03190"></a><span class="lineno"> 3190</span>&#160; </div>
+<div class="line"><a name="l03196"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#adbae3a0b4ab078024462fc85c37f3b58"> 3196</a></span>&#160;VMA_CALL_PRE <span class="keywordtype">void</span> VMA_CALL_POST <a class="code" href="vk__mem__alloc_8h.html#adbae3a0b4ab078024462fc85c37f3b58">vmaSetPoolName</a>(</div>
 <div class="line"><a name="l03197"></a><span class="lineno"> 3197</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> VMA_NOT_NULL allocator,</div>
-<div class="line"><a name="l03198"></a><span class="lineno"> 3198</span>&#160;    <span class="keywordtype">size_t</span> allocationCount,</div>
-<div class="line"><a name="l03199"></a><span class="lineno"> 3199</span>&#160;    <span class="keyword">const</span> <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> VMA_NULLABLE * VMA_NOT_NULL VMA_LEN_IF_NOT_NULL(allocationCount) pAllocations);</div>
+<div class="line"><a name="l03198"></a><span class="lineno"> 3198</span>&#160;    <a class="code" href="struct_vma_pool.html">VmaPool</a> VMA_NOT_NULL pool,</div>
+<div class="line"><a name="l03199"></a><span class="lineno"> 3199</span>&#160;    <span class="keyword">const</span> <span class="keywordtype">char</span>* VMA_NULLABLE pName);</div>
 <div class="line"><a name="l03200"></a><span class="lineno"> 3200</span>&#160; </div>
-<div class="line"><a name="l03208"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#a0ff488958ca72b28e545880463cb8696"> 3208</a></span>&#160;VMA_CALL_PRE VkResult VMA_CALL_POST <a class="code" href="vk__mem__alloc_8h.html#a0ff488958ca72b28e545880463cb8696">vmaResizeAllocation</a>(</div>
-<div class="line"><a name="l03209"></a><span class="lineno"> 3209</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> VMA_NOT_NULL allocator,</div>
-<div class="line"><a name="l03210"></a><span class="lineno"> 3210</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> VMA_NOT_NULL allocation,</div>
-<div class="line"><a name="l03211"></a><span class="lineno"> 3211</span>&#160;    VkDeviceSize newSize);</div>
-<div class="line"><a name="l03212"></a><span class="lineno"> 3212</span>&#160; </div>
-<div class="line"><a name="l03229"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#a86dd08aba8633bfa4ad0df2e76481d8b"> 3229</a></span>&#160;VMA_CALL_PRE <span class="keywordtype">void</span> VMA_CALL_POST <a class="code" href="vk__mem__alloc_8h.html#a86dd08aba8633bfa4ad0df2e76481d8b">vmaGetAllocationInfo</a>(</div>
-<div class="line"><a name="l03230"></a><span class="lineno"> 3230</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> VMA_NOT_NULL allocator,</div>
-<div class="line"><a name="l03231"></a><span class="lineno"> 3231</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> VMA_NOT_NULL allocation,</div>
-<div class="line"><a name="l03232"></a><span class="lineno"> 3232</span>&#160;    <a class="code" href="struct_vma_allocation_info.html">VmaAllocationInfo</a>* VMA_NOT_NULL pAllocationInfo);</div>
-<div class="line"><a name="l03233"></a><span class="lineno"> 3233</span>&#160; </div>
-<div class="line"><a name="l03248"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#a43d8ba9673c846f049089a5029d5c73a"> 3248</a></span>&#160;VMA_CALL_PRE VkBool32 VMA_CALL_POST <a class="code" href="vk__mem__alloc_8h.html#a43d8ba9673c846f049089a5029d5c73a">vmaTouchAllocation</a>(</div>
-<div class="line"><a name="l03249"></a><span class="lineno"> 3249</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> VMA_NOT_NULL allocator,</div>
-<div class="line"><a name="l03250"></a><span class="lineno"> 3250</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> VMA_NOT_NULL allocation);</div>
-<div class="line"><a name="l03251"></a><span class="lineno"> 3251</span>&#160; </div>
-<div class="line"><a name="l03265"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#af9147d31ffc11d62fc187bde283ed14f"> 3265</a></span>&#160;VMA_CALL_PRE <span class="keywordtype">void</span> VMA_CALL_POST <a class="code" href="vk__mem__alloc_8h.html#af9147d31ffc11d62fc187bde283ed14f">vmaSetAllocationUserData</a>(</div>
-<div class="line"><a name="l03266"></a><span class="lineno"> 3266</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> VMA_NOT_NULL allocator,</div>
-<div class="line"><a name="l03267"></a><span class="lineno"> 3267</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> VMA_NOT_NULL allocation,</div>
-<div class="line"><a name="l03268"></a><span class="lineno"> 3268</span>&#160;    <span class="keywordtype">void</span>* VMA_NULLABLE pUserData);</div>
-<div class="line"><a name="l03269"></a><span class="lineno"> 3269</span>&#160; </div>
-<div class="line"><a name="l03280"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#ae5c9657d9e94756269145b01c05d16f1"> 3280</a></span>&#160;VMA_CALL_PRE <span class="keywordtype">void</span> VMA_CALL_POST <a class="code" href="vk__mem__alloc_8h.html#ae5c9657d9e94756269145b01c05d16f1">vmaCreateLostAllocation</a>(</div>
-<div class="line"><a name="l03281"></a><span class="lineno"> 3281</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> VMA_NOT_NULL allocator,</div>
-<div class="line"><a name="l03282"></a><span class="lineno"> 3282</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> VMA_NULLABLE * VMA_NOT_NULL pAllocation);</div>
-<div class="line"><a name="l03283"></a><span class="lineno"> 3283</span>&#160; </div>
-<div class="line"><a name="l03322"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#ad5bd1243512d099706de88168992f069"> 3322</a></span>&#160;VMA_CALL_PRE VkResult VMA_CALL_POST <a class="code" href="vk__mem__alloc_8h.html#ad5bd1243512d099706de88168992f069">vmaMapMemory</a>(</div>
-<div class="line"><a name="l03323"></a><span class="lineno"> 3323</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> VMA_NOT_NULL allocator,</div>
-<div class="line"><a name="l03324"></a><span class="lineno"> 3324</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> VMA_NOT_NULL allocation,</div>
-<div class="line"><a name="l03325"></a><span class="lineno"> 3325</span>&#160;    <span class="keywordtype">void</span>* VMA_NULLABLE * VMA_NOT_NULL ppData);</div>
-<div class="line"><a name="l03326"></a><span class="lineno"> 3326</span>&#160; </div>
-<div class="line"><a name="l03335"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#a9bc268595cb33f6ec4d519cfce81ff45"> 3335</a></span>&#160;VMA_CALL_PRE <span class="keywordtype">void</span> VMA_CALL_POST <a class="code" href="vk__mem__alloc_8h.html#a9bc268595cb33f6ec4d519cfce81ff45">vmaUnmapMemory</a>(</div>
-<div class="line"><a name="l03336"></a><span class="lineno"> 3336</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> VMA_NOT_NULL allocator,</div>
-<div class="line"><a name="l03337"></a><span class="lineno"> 3337</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> VMA_NOT_NULL allocation);</div>
-<div class="line"><a name="l03338"></a><span class="lineno"> 3338</span>&#160; </div>
-<div class="line"><a name="l03360"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#a30c37c1eec6025f397be41644f48490f"> 3360</a></span>&#160;VMA_CALL_PRE VkResult VMA_CALL_POST <a class="code" href="vk__mem__alloc_8h.html#a30c37c1eec6025f397be41644f48490f">vmaFlushAllocation</a>(</div>
-<div class="line"><a name="l03361"></a><span class="lineno"> 3361</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> VMA_NOT_NULL allocator,</div>
-<div class="line"><a name="l03362"></a><span class="lineno"> 3362</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> VMA_NOT_NULL allocation,</div>
-<div class="line"><a name="l03363"></a><span class="lineno"> 3363</span>&#160;    VkDeviceSize offset,</div>
-<div class="line"><a name="l03364"></a><span class="lineno"> 3364</span>&#160;    VkDeviceSize size);</div>
-<div class="line"><a name="l03365"></a><span class="lineno"> 3365</span>&#160; </div>
-<div class="line"><a name="l03387"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#aaa8412919139ef413a4215ac6a290fae"> 3387</a></span>&#160;VMA_CALL_PRE VkResult VMA_CALL_POST <a class="code" href="vk__mem__alloc_8h.html#aaa8412919139ef413a4215ac6a290fae">vmaInvalidateAllocation</a>(</div>
-<div class="line"><a name="l03388"></a><span class="lineno"> 3388</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> VMA_NOT_NULL allocator,</div>
-<div class="line"><a name="l03389"></a><span class="lineno"> 3389</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> VMA_NOT_NULL allocation,</div>
-<div class="line"><a name="l03390"></a><span class="lineno"> 3390</span>&#160;    VkDeviceSize offset,</div>
-<div class="line"><a name="l03391"></a><span class="lineno"> 3391</span>&#160;    VkDeviceSize size);</div>
-<div class="line"><a name="l03392"></a><span class="lineno"> 3392</span>&#160; </div>
-<div class="line"><a name="l03407"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#ac3dd00da721875ed99fa8a881922bdfc"> 3407</a></span>&#160;VMA_CALL_PRE VkResult VMA_CALL_POST <a class="code" href="vk__mem__alloc_8h.html#ac3dd00da721875ed99fa8a881922bdfc">vmaFlushAllocations</a>(</div>
-<div class="line"><a name="l03408"></a><span class="lineno"> 3408</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> VMA_NOT_NULL allocator,</div>
-<div class="line"><a name="l03409"></a><span class="lineno"> 3409</span>&#160;    uint32_t allocationCount,</div>
-<div class="line"><a name="l03410"></a><span class="lineno"> 3410</span>&#160;    <span class="keyword">const</span> <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> VMA_NOT_NULL * VMA_NULLABLE VMA_LEN_IF_NOT_NULL(allocationCount) allocations,</div>
-<div class="line"><a name="l03411"></a><span class="lineno"> 3411</span>&#160;    <span class="keyword">const</span> VkDeviceSize* VMA_NULLABLE VMA_LEN_IF_NOT_NULL(allocationCount) offsets,</div>
-<div class="line"><a name="l03412"></a><span class="lineno"> 3412</span>&#160;    <span class="keyword">const</span> VkDeviceSize* VMA_NULLABLE VMA_LEN_IF_NOT_NULL(allocationCount) sizes);</div>
-<div class="line"><a name="l03413"></a><span class="lineno"> 3413</span>&#160; </div>
-<div class="line"><a name="l03428"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#ab25b558d75f7378ec944a1522fdcc3c5"> 3428</a></span>&#160;VMA_CALL_PRE VkResult VMA_CALL_POST <a class="code" href="vk__mem__alloc_8h.html#ab25b558d75f7378ec944a1522fdcc3c5">vmaInvalidateAllocations</a>(</div>
-<div class="line"><a name="l03429"></a><span class="lineno"> 3429</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> VMA_NOT_NULL allocator,</div>
-<div class="line"><a name="l03430"></a><span class="lineno"> 3430</span>&#160;    uint32_t allocationCount,</div>
-<div class="line"><a name="l03431"></a><span class="lineno"> 3431</span>&#160;    <span class="keyword">const</span> <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> VMA_NOT_NULL * VMA_NULLABLE VMA_LEN_IF_NOT_NULL(allocationCount) allocations,</div>
-<div class="line"><a name="l03432"></a><span class="lineno"> 3432</span>&#160;    <span class="keyword">const</span> VkDeviceSize* VMA_NULLABLE VMA_LEN_IF_NOT_NULL(allocationCount) offsets,</div>
-<div class="line"><a name="l03433"></a><span class="lineno"> 3433</span>&#160;    <span class="keyword">const</span> VkDeviceSize* VMA_NULLABLE VMA_LEN_IF_NOT_NULL(allocationCount) sizes);</div>
-<div class="line"><a name="l03434"></a><span class="lineno"> 3434</span>&#160; </div>
-<div class="line"><a name="l03451"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#a49329a7f030dafcf82f7b73334c22e98"> 3451</a></span>&#160;VMA_CALL_PRE VkResult VMA_CALL_POST <a class="code" href="vk__mem__alloc_8h.html#a49329a7f030dafcf82f7b73334c22e98">vmaCheckCorruption</a>(<a class="code" href="struct_vma_allocator.html">VmaAllocator</a> VMA_NOT_NULL allocator, uint32_t memoryTypeBits);</div>
-<div class="line"><a name="l03452"></a><span class="lineno"> 3452</span>&#160; </div>
-<div class="line"><a name="l03459"></a><span class="lineno"> 3459</span>&#160;VK_DEFINE_HANDLE(<a class="code" href="struct_vma_defragmentation_context.html">VmaDefragmentationContext</a>)</div>
-<div class="line"><a name="l03460"></a><span class="lineno"> 3460</span>&#160; </div>
-<div class="line"><a name="l03461"></a><span class="lineno"> 3461</span>&#160;<span class="keyword">typedef</span> <span class="keyword">enum</span> <a class="code" href="vk__mem__alloc_8h.html#a6552a65b71d16f378c6994b3ceaef50c">VmaDefragmentationFlagBits</a> {</div>
-<div class="line"><a name="l03463"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#a6552a65b71d16f378c6994b3ceaef50ca31af49446af2459284a568ce2f3fdd33"> 3463</a></span>&#160;    <a class="code" href="vk__mem__alloc_8h.html#a6552a65b71d16f378c6994b3ceaef50ca31af49446af2459284a568ce2f3fdd33">VMA_DEFRAGMENTATION_FLAG_INCREMENTAL</a> = 0x1,</div>
-<div class="line"><a name="l03464"></a><span class="lineno"> 3464</span>&#160;    <a class="code" href="vk__mem__alloc_8h.html#a6552a65b71d16f378c6994b3ceaef50cab87ec33154803bfeb5ac2b379f1d6a97">VMA_DEFRAGMENTATION_FLAG_BITS_MAX_ENUM</a> = 0x7FFFFFFF</div>
-<div class="line"><a name="l03465"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#a13415cc0b443353a7b5abda300b833fc"> 3465</a></span>&#160;} <a class="code" href="vk__mem__alloc_8h.html#a6552a65b71d16f378c6994b3ceaef50c">VmaDefragmentationFlagBits</a>;</div>
-<div class="line"><a name="l03466"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#a88a77cef37e5d3c4fc9eb328885d048d"> 3466</a></span>&#160;<span class="keyword">typedef</span> VkFlags <a class="code" href="vk__mem__alloc_8h.html#a88a77cef37e5d3c4fc9eb328885d048d">VmaDefragmentationFlags</a>;</div>
-<div class="line"><a name="l03467"></a><span class="lineno"> 3467</span>&#160; </div>
-<div class="line"><a name="l03472"></a><span class="lineno"><a class="line" href="struct_vma_defragmentation_info2.html"> 3472</a></span>&#160;<span class="keyword">typedef</span> <span class="keyword">struct </span><a class="code" href="struct_vma_defragmentation_info2.html">VmaDefragmentationInfo2</a> {</div>
-<div class="line"><a name="l03475"></a><span class="lineno"><a class="line" href="struct_vma_defragmentation_info2.html#a53e844ee5633e229cf6daf14b2d9fff9"> 3475</a></span>&#160;    <a class="code" href="vk__mem__alloc_8h.html#a88a77cef37e5d3c4fc9eb328885d048d">VmaDefragmentationFlags</a> <a class="code" href="struct_vma_defragmentation_info2.html#a53e844ee5633e229cf6daf14b2d9fff9">flags</a>;</div>
-<div class="line"><a name="l03478"></a><span class="lineno"><a class="line" href="struct_vma_defragmentation_info2.html#a3cf86ab32c1da779b4923d301a3056ba"> 3478</a></span>&#160;    uint32_t <a class="code" href="struct_vma_defragmentation_info2.html#a3cf86ab32c1da779b4923d301a3056ba">allocationCount</a>;</div>
-<div class="line"><a name="l03487"></a><span class="lineno"><a class="line" href="struct_vma_defragmentation_info2.html#ab6d288f29d028156cf73542d630a2e32"> 3487</a></span>&#160;    <span class="keyword">const</span> <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> VMA_NOT_NULL * VMA_NULLABLE VMA_LEN_IF_NOT_NULL(allocationCount) <a class="code" href="struct_vma_defragmentation_info2.html#ab6d288f29d028156cf73542d630a2e32">pAllocations</a>;</div>
-<div class="line"><a name="l03493"></a><span class="lineno"><a class="line" href="struct_vma_defragmentation_info2.html#a76d51a644dc7f5405d0cdd0025ecd0cc"> 3493</a></span>&#160;    VkBool32* VMA_NULLABLE VMA_LEN_IF_NOT_NULL(allocationCount) <a class="code" href="struct_vma_defragmentation_info2.html#a76d51a644dc7f5405d0cdd0025ecd0cc">pAllocationsChanged</a>;</div>
-<div class="line"><a name="l03496"></a><span class="lineno"><a class="line" href="struct_vma_defragmentation_info2.html#a7e70aa2a1081d849dcc7829b19d3ec9d"> 3496</a></span>&#160;    uint32_t <a class="code" href="struct_vma_defragmentation_info2.html#a7e70aa2a1081d849dcc7829b19d3ec9d">poolCount</a>;</div>
-<div class="line"><a name="l03512"></a><span class="lineno"><a class="line" href="struct_vma_defragmentation_info2.html#a3c9c6aa5c97d5670f8e362b3a6f3029b"> 3512</a></span>&#160;    <span class="keyword">const</span> <a class="code" href="struct_vma_pool.html">VmaPool</a> VMA_NOT_NULL * VMA_NULLABLE VMA_LEN_IF_NOT_NULL(poolCount) <a class="code" href="struct_vma_defragmentation_info2.html#a3c9c6aa5c97d5670f8e362b3a6f3029b">pPools</a>;</div>
-<div class="line"><a name="l03517"></a><span class="lineno"><a class="line" href="struct_vma_defragmentation_info2.html#af78e1ea40c22d85137b65f6b384a4d0a"> 3517</a></span>&#160;    VkDeviceSize <a class="code" href="struct_vma_defragmentation_info2.html#af78e1ea40c22d85137b65f6b384a4d0a">maxCpuBytesToMove</a>;</div>
-<div class="line"><a name="l03522"></a><span class="lineno"><a class="line" href="struct_vma_defragmentation_info2.html#a94c2c7223d52878445a8cccce396b671"> 3522</a></span>&#160;    uint32_t <a class="code" href="struct_vma_defragmentation_info2.html#a94c2c7223d52878445a8cccce396b671">maxCpuAllocationsToMove</a>;</div>
-<div class="line"><a name="l03527"></a><span class="lineno"><a class="line" href="struct_vma_defragmentation_info2.html#a4ddbc898d0afe1518f863a3763628f08"> 3527</a></span>&#160;    VkDeviceSize <a class="code" href="struct_vma_defragmentation_info2.html#a4ddbc898d0afe1518f863a3763628f08">maxGpuBytesToMove</a>;</div>
-<div class="line"><a name="l03532"></a><span class="lineno"><a class="line" href="struct_vma_defragmentation_info2.html#a40d53d33e71ba0b66f844ed63c05a3f6"> 3532</a></span>&#160;    uint32_t <a class="code" href="struct_vma_defragmentation_info2.html#a40d53d33e71ba0b66f844ed63c05a3f6">maxGpuAllocationsToMove</a>;</div>
-<div class="line"><a name="l03541"></a><span class="lineno"><a class="line" href="struct_vma_defragmentation_info2.html#a7f71f39590c5316771493d2333f9c1bd"> 3541</a></span>&#160;    VkCommandBuffer VMA_NULLABLE <a class="code" href="struct_vma_defragmentation_info2.html#a7f71f39590c5316771493d2333f9c1bd">commandBuffer</a>;</div>
-<div class="line"><a name="l03542"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#ad6daeffaa670ce6d11a203a6224c9937"> 3542</a></span>&#160;} <a class="code" href="vk__mem__alloc_8h.html#ad6daeffaa670ce6d11a203a6224c9937">VmaDefragmentationInfo2</a>;</div>
-<div class="line"><a name="l03543"></a><span class="lineno"> 3543</span>&#160; </div>
-<div class="line"><a name="l03544"></a><span class="lineno"><a class="line" href="struct_vma_defragmentation_pass_move_info.html"> 3544</a></span>&#160;<span class="keyword">typedef</span> <span class="keyword">struct </span><a class="code" href="struct_vma_defragmentation_pass_move_info.html">VmaDefragmentationPassMoveInfo</a> {</div>
-<div class="line"><a name="l03545"></a><span class="lineno"><a class="line" href="struct_vma_defragmentation_pass_move_info.html#ae885c861c2dd8d622e6c19e281d035cc"> 3545</a></span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> VMA_NOT_NULL <a class="code" href="struct_vma_defragmentation_pass_move_info.html#ae885c861c2dd8d622e6c19e281d035cc">allocation</a>;</div>
-<div class="line"><a name="l03546"></a><span class="lineno"><a class="line" href="struct_vma_defragmentation_pass_move_info.html#a06eb0c8690aa0d3478a036753492e769"> 3546</a></span>&#160;    VkDeviceMemory VMA_NOT_NULL_NON_DISPATCHABLE <a class="code" href="struct_vma_defragmentation_pass_move_info.html#a06eb0c8690aa0d3478a036753492e769">memory</a>;</div>
-<div class="line"><a name="l03547"></a><span class="lineno"><a class="line" href="struct_vma_defragmentation_pass_move_info.html#a8ab4508bc03625b0653c880576be96c6"> 3547</a></span>&#160;    VkDeviceSize <a class="code" href="struct_vma_defragmentation_pass_move_info.html#a8ab4508bc03625b0653c880576be96c6">offset</a>;</div>
-<div class="line"><a name="l03548"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#ad6799e8e2b1527abfc84d33bc44aeaf5"> 3548</a></span>&#160;} <a class="code" href="vk__mem__alloc_8h.html#ad6799e8e2b1527abfc84d33bc44aeaf5">VmaDefragmentationPassMoveInfo</a>;</div>
-<div class="line"><a name="l03549"></a><span class="lineno"> 3549</span>&#160; </div>
-<div class="line"><a name="l03554"></a><span class="lineno"><a class="line" href="struct_vma_defragmentation_pass_info.html"> 3554</a></span>&#160;<span class="keyword">typedef</span> <span class="keyword">struct </span><a class="code" href="struct_vma_defragmentation_pass_info.html">VmaDefragmentationPassInfo</a> {</div>
-<div class="line"><a name="l03555"></a><span class="lineno"><a class="line" href="struct_vma_defragmentation_pass_info.html#ac1086e657ba995f8d1f4e49b83dcfb6c"> 3555</a></span>&#160;    uint32_t <a class="code" href="struct_vma_defragmentation_pass_info.html#ac1086e657ba995f8d1f4e49b83dcfb6c">moveCount</a>;</div>
-<div class="line"><a name="l03556"></a><span class="lineno"><a class="line" href="struct_vma_defragmentation_pass_info.html#acbd42d4a3357999da130a95cd99a3792"> 3556</a></span>&#160;    <a class="code" href="struct_vma_defragmentation_pass_move_info.html">VmaDefragmentationPassMoveInfo</a>* VMA_NOT_NULL VMA_LEN_IF_NOT_NULL(moveCount) <a class="code" href="struct_vma_defragmentation_pass_info.html#acbd42d4a3357999da130a95cd99a3792">pMoves</a>;</div>
-<div class="line"><a name="l03557"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#a72aebd522242d56abea67b4f47f6549e"> 3557</a></span>&#160;} <a class="code" href="vk__mem__alloc_8h.html#a72aebd522242d56abea67b4f47f6549e">VmaDefragmentationPassInfo</a>;</div>
-<div class="line"><a name="l03558"></a><span class="lineno"> 3558</span>&#160; </div>
-<div class="line"><a name="l03563"></a><span class="lineno"><a class="line" href="struct_vma_defragmentation_info.html"> 3563</a></span>&#160;<span class="keyword">typedef</span> <span class="keyword">struct </span><a class="code" href="struct_vma_defragmentation_info.html">VmaDefragmentationInfo</a> {</div>
-<div class="line"><a name="l03568"></a><span class="lineno"><a class="line" href="struct_vma_defragmentation_info.html#acb311c940a777270e67e1b81c5ab6a1d"> 3568</a></span>&#160;    VkDeviceSize <a class="code" href="struct_vma_defragmentation_info.html#acb311c940a777270e67e1b81c5ab6a1d">maxBytesToMove</a>;</div>
-<div class="line"><a name="l03573"></a><span class="lineno"><a class="line" href="struct_vma_defragmentation_info.html#aa7c7304e13c71f604c907196c4e28fbc"> 3573</a></span>&#160;    uint32_t <a class="code" href="struct_vma_defragmentation_info.html#aa7c7304e13c71f604c907196c4e28fbc">maxAllocationsToMove</a>;</div>
-<div class="line"><a name="l03574"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#a2bf47f96bf92bed2a49461bd9af3acfa"> 3574</a></span>&#160;} <a class="code" href="vk__mem__alloc_8h.html#a2bf47f96bf92bed2a49461bd9af3acfa">VmaDefragmentationInfo</a>;</div>
-<div class="line"><a name="l03575"></a><span class="lineno"> 3575</span>&#160; </div>
-<div class="line"><a name="l03577"></a><span class="lineno"><a class="line" href="struct_vma_defragmentation_stats.html"> 3577</a></span>&#160;<span class="keyword">typedef</span> <span class="keyword">struct </span><a class="code" href="struct_vma_defragmentation_stats.html">VmaDefragmentationStats</a> {</div>
-<div class="line"><a name="l03579"></a><span class="lineno"><a class="line" href="struct_vma_defragmentation_stats.html#a36f9d5df2a10ba2a36b16e126d60572d"> 3579</a></span>&#160;    VkDeviceSize <a class="code" href="struct_vma_defragmentation_stats.html#a36f9d5df2a10ba2a36b16e126d60572d">bytesMoved</a>;</div>
-<div class="line"><a name="l03581"></a><span class="lineno"><a class="line" href="struct_vma_defragmentation_stats.html#ab0cb9ac0dbc106c77e384ea676422f28"> 3581</a></span>&#160;    VkDeviceSize <a class="code" href="struct_vma_defragmentation_stats.html#ab0cb9ac0dbc106c77e384ea676422f28">bytesFreed</a>;</div>
-<div class="line"><a name="l03583"></a><span class="lineno"><a class="line" href="struct_vma_defragmentation_stats.html#aefeabf130022008eadd75999478af3f9"> 3583</a></span>&#160;    uint32_t <a class="code" href="struct_vma_defragmentation_stats.html#aefeabf130022008eadd75999478af3f9">allocationsMoved</a>;</div>
-<div class="line"><a name="l03585"></a><span class="lineno"><a class="line" href="struct_vma_defragmentation_stats.html#a0113f1877904a5d1ee8f409216ff276b"> 3585</a></span>&#160;    uint32_t <a class="code" href="struct_vma_defragmentation_stats.html#a0113f1877904a5d1ee8f409216ff276b">deviceMemoryBlocksFreed</a>;</div>
-<div class="line"><a name="l03586"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#ad94034192259c2e34a4d1c5e27810403"> 3586</a></span>&#160;} <a class="code" href="vk__mem__alloc_8h.html#ad94034192259c2e34a4d1c5e27810403">VmaDefragmentationStats</a>;</div>
-<div class="line"><a name="l03587"></a><span class="lineno"> 3587</span>&#160; </div>
-<div class="line"><a name="l03617"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#a36ba776fd7fd5cb1e9359fdc0d8e6e8a"> 3617</a></span>&#160;VMA_CALL_PRE VkResult VMA_CALL_POST <a class="code" href="vk__mem__alloc_8h.html#a36ba776fd7fd5cb1e9359fdc0d8e6e8a">vmaDefragmentationBegin</a>(</div>
-<div class="line"><a name="l03618"></a><span class="lineno"> 3618</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> VMA_NOT_NULL allocator,</div>
-<div class="line"><a name="l03619"></a><span class="lineno"> 3619</span>&#160;    <span class="keyword">const</span> <a class="code" href="struct_vma_defragmentation_info2.html">VmaDefragmentationInfo2</a>* VMA_NOT_NULL pInfo,</div>
-<div class="line"><a name="l03620"></a><span class="lineno"> 3620</span>&#160;    <a class="code" href="struct_vma_defragmentation_stats.html">VmaDefragmentationStats</a>* VMA_NULLABLE pStats,</div>
-<div class="line"><a name="l03621"></a><span class="lineno"> 3621</span>&#160;    <a class="code" href="struct_vma_defragmentation_context.html">VmaDefragmentationContext</a> VMA_NULLABLE * VMA_NOT_NULL pContext);</div>
-<div class="line"><a name="l03622"></a><span class="lineno"> 3622</span>&#160; </div>
-<div class="line"><a name="l03628"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#a8774e20e91e245aae959ba63efa15dd2"> 3628</a></span>&#160;VMA_CALL_PRE VkResult VMA_CALL_POST <a class="code" href="vk__mem__alloc_8h.html#a8774e20e91e245aae959ba63efa15dd2">vmaDefragmentationEnd</a>(</div>
-<div class="line"><a name="l03629"></a><span class="lineno"> 3629</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> VMA_NOT_NULL allocator,</div>
-<div class="line"><a name="l03630"></a><span class="lineno"> 3630</span>&#160;    <a class="code" href="struct_vma_defragmentation_context.html">VmaDefragmentationContext</a> VMA_NULLABLE context);</div>
-<div class="line"><a name="l03631"></a><span class="lineno"> 3631</span>&#160; </div>
-<div class="line"><a name="l03632"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#ac0f01545b6262f7d4d128fc8f8e5c77b"> 3632</a></span>&#160;VMA_CALL_PRE VkResult VMA_CALL_POST <a class="code" href="vk__mem__alloc_8h.html#ac0f01545b6262f7d4d128fc8f8e5c77b">vmaBeginDefragmentationPass</a>(</div>
-<div class="line"><a name="l03633"></a><span class="lineno"> 3633</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> VMA_NOT_NULL allocator,</div>
-<div class="line"><a name="l03634"></a><span class="lineno"> 3634</span>&#160;    <a class="code" href="struct_vma_defragmentation_context.html">VmaDefragmentationContext</a> VMA_NULLABLE context,</div>
-<div class="line"><a name="l03635"></a><span class="lineno"> 3635</span>&#160;    <a class="code" href="struct_vma_defragmentation_pass_info.html">VmaDefragmentationPassInfo</a>* VMA_NOT_NULL pInfo</div>
-<div class="line"><a name="l03636"></a><span class="lineno"> 3636</span>&#160;);</div>
-<div class="line"><a name="l03637"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#a1b9ffa538bed905af55c747cc48963bd"> 3637</a></span>&#160;VMA_CALL_PRE VkResult VMA_CALL_POST <a class="code" href="vk__mem__alloc_8h.html#a1b9ffa538bed905af55c747cc48963bd">vmaEndDefragmentationPass</a>(</div>
-<div class="line"><a name="l03638"></a><span class="lineno"> 3638</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> VMA_NOT_NULL allocator,</div>
-<div class="line"><a name="l03639"></a><span class="lineno"> 3639</span>&#160;    <a class="code" href="struct_vma_defragmentation_context.html">VmaDefragmentationContext</a> VMA_NULLABLE context</div>
-<div class="line"><a name="l03640"></a><span class="lineno"> 3640</span>&#160;);</div>
-<div class="line"><a name="l03641"></a><span class="lineno"> 3641</span>&#160; </div>
-<div class="line"><a name="l03682"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#a9f0f8f56db5f7f57fe4454f465142dac"> 3682</a></span>&#160;VMA_CALL_PRE VkResult VMA_CALL_POST <a class="code" href="vk__mem__alloc_8h.html#a9f0f8f56db5f7f57fe4454f465142dac">vmaDefragment</a>(</div>
-<div class="line"><a name="l03683"></a><span class="lineno"> 3683</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> VMA_NOT_NULL allocator,</div>
-<div class="line"><a name="l03684"></a><span class="lineno"> 3684</span>&#160;    <span class="keyword">const</span> <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> VMA_NOT_NULL * VMA_NOT_NULL VMA_LEN_IF_NOT_NULL(allocationCount) pAllocations,</div>
-<div class="line"><a name="l03685"></a><span class="lineno"> 3685</span>&#160;    <span class="keywordtype">size_t</span> allocationCount,</div>
-<div class="line"><a name="l03686"></a><span class="lineno"> 3686</span>&#160;    VkBool32* VMA_NULLABLE VMA_LEN_IF_NOT_NULL(allocationCount) pAllocationsChanged,</div>
-<div class="line"><a name="l03687"></a><span class="lineno"> 3687</span>&#160;    <span class="keyword">const</span> <a class="code" href="struct_vma_defragmentation_info.html">VmaDefragmentationInfo</a>* VMA_NULLABLE pDefragmentationInfo,</div>
-<div class="line"><a name="l03688"></a><span class="lineno"> 3688</span>&#160;    <a class="code" href="struct_vma_defragmentation_stats.html">VmaDefragmentationStats</a>* VMA_NULLABLE pDefragmentationStats);</div>
-<div class="line"><a name="l03689"></a><span class="lineno"> 3689</span>&#160; </div>
-<div class="line"><a name="l03702"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#a6b0929b914b60cf2d45cac4bf3547470"> 3702</a></span>&#160;VMA_CALL_PRE VkResult VMA_CALL_POST <a class="code" href="vk__mem__alloc_8h.html#a6b0929b914b60cf2d45cac4bf3547470">vmaBindBufferMemory</a>(</div>
-<div class="line"><a name="l03703"></a><span class="lineno"> 3703</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> VMA_NOT_NULL allocator,</div>
-<div class="line"><a name="l03704"></a><span class="lineno"> 3704</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> VMA_NOT_NULL allocation,</div>
-<div class="line"><a name="l03705"></a><span class="lineno"> 3705</span>&#160;    VkBuffer VMA_NOT_NULL_NON_DISPATCHABLE buffer);</div>
-<div class="line"><a name="l03706"></a><span class="lineno"> 3706</span>&#160; </div>
-<div class="line"><a name="l03717"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#a927c944f45e0f2941182abb6f608e64a"> 3717</a></span>&#160;VMA_CALL_PRE VkResult VMA_CALL_POST <a class="code" href="vk__mem__alloc_8h.html#a927c944f45e0f2941182abb6f608e64a">vmaBindBufferMemory2</a>(</div>
-<div class="line"><a name="l03718"></a><span class="lineno"> 3718</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> VMA_NOT_NULL allocator,</div>
-<div class="line"><a name="l03719"></a><span class="lineno"> 3719</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> VMA_NOT_NULL allocation,</div>
-<div class="line"><a name="l03720"></a><span class="lineno"> 3720</span>&#160;    VkDeviceSize allocationLocalOffset,</div>
-<div class="line"><a name="l03721"></a><span class="lineno"> 3721</span>&#160;    VkBuffer VMA_NOT_NULL_NON_DISPATCHABLE buffer,</div>
-<div class="line"><a name="l03722"></a><span class="lineno"> 3722</span>&#160;    <span class="keyword">const</span> <span class="keywordtype">void</span>* VMA_NULLABLE pNext);</div>
-<div class="line"><a name="l03723"></a><span class="lineno"> 3723</span>&#160; </div>
-<div class="line"><a name="l03736"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#a3d3ca45799923aa5d138e9e5f9eb2da5"> 3736</a></span>&#160;VMA_CALL_PRE VkResult VMA_CALL_POST <a class="code" href="vk__mem__alloc_8h.html#a3d3ca45799923aa5d138e9e5f9eb2da5">vmaBindImageMemory</a>(</div>
-<div class="line"><a name="l03737"></a><span class="lineno"> 3737</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> VMA_NOT_NULL allocator,</div>
-<div class="line"><a name="l03738"></a><span class="lineno"> 3738</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> VMA_NOT_NULL allocation,</div>
-<div class="line"><a name="l03739"></a><span class="lineno"> 3739</span>&#160;    VkImage VMA_NOT_NULL_NON_DISPATCHABLE image);</div>
-<div class="line"><a name="l03740"></a><span class="lineno"> 3740</span>&#160; </div>
-<div class="line"><a name="l03751"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#aa8251ee81b0045a443e35b8e8aa021bc"> 3751</a></span>&#160;VMA_CALL_PRE VkResult VMA_CALL_POST <a class="code" href="vk__mem__alloc_8h.html#aa8251ee81b0045a443e35b8e8aa021bc">vmaBindImageMemory2</a>(</div>
-<div class="line"><a name="l03752"></a><span class="lineno"> 3752</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> VMA_NOT_NULL allocator,</div>
-<div class="line"><a name="l03753"></a><span class="lineno"> 3753</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> VMA_NOT_NULL allocation,</div>
-<div class="line"><a name="l03754"></a><span class="lineno"> 3754</span>&#160;    VkDeviceSize allocationLocalOffset,</div>
-<div class="line"><a name="l03755"></a><span class="lineno"> 3755</span>&#160;    VkImage VMA_NOT_NULL_NON_DISPATCHABLE image,</div>
-<div class="line"><a name="l03756"></a><span class="lineno"> 3756</span>&#160;    <span class="keyword">const</span> <span class="keywordtype">void</span>* VMA_NULLABLE pNext);</div>
-<div class="line"><a name="l03757"></a><span class="lineno"> 3757</span>&#160; </div>
-<div class="line"><a name="l03784"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#ac72ee55598617e8eecca384e746bab51"> 3784</a></span>&#160;VMA_CALL_PRE VkResult VMA_CALL_POST <a class="code" href="vk__mem__alloc_8h.html#ac72ee55598617e8eecca384e746bab51">vmaCreateBuffer</a>(</div>
+<div class="line"><a name="l03225"></a><span class="lineno"> 3225</span>&#160;VK_DEFINE_HANDLE(<a class="code" href="struct_vma_allocation.html">VmaAllocation</a>)</div>
+<div class="line"><a name="l03226"></a><span class="lineno"> 3226</span>&#160; </div>
+<div class="line"><a name="l03227"></a><span class="lineno"> 3227</span>&#160; </div>
+<div class="line"><a name="l03229"></a><span class="lineno"><a class="line" href="struct_vma_allocation_info.html"> 3229</a></span>&#160;typedef struct <a class="code" href="struct_vma_allocation_info.html">VmaAllocationInfo</a> {</div>
+<div class="line"><a name="l03234"></a><span class="lineno"><a class="line" href="struct_vma_allocation_info.html#a7f6b0aa58c135e488e6b40a388dad9d5"> 3234</a></span>&#160;    uint32_t <a class="code" href="struct_vma_allocation_info.html#a7f6b0aa58c135e488e6b40a388dad9d5">memoryType</a>;</div>
+<div class="line"><a name="l03243"></a><span class="lineno"><a class="line" href="struct_vma_allocation_info.html#ae0bfb7dfdf79a76ffefc9a94677a2f67"> 3243</a></span>&#160;    VkDeviceMemory VMA_NULLABLE_NON_DISPATCHABLE <a class="code" href="struct_vma_allocation_info.html#ae0bfb7dfdf79a76ffefc9a94677a2f67">deviceMemory</a>;</div>
+<div class="line"><a name="l03253"></a><span class="lineno"><a class="line" href="struct_vma_allocation_info.html#a4a3c732388dbdc7a23f9365b00825268"> 3253</a></span>&#160;    VkDeviceSize <a class="code" href="struct_vma_allocation_info.html#a4a3c732388dbdc7a23f9365b00825268">offset</a>;</div>
+<div class="line"><a name="l03264"></a><span class="lineno"><a class="line" href="struct_vma_allocation_info.html#aac76d113a6a5ccbb09fea00fb25fd18f"> 3264</a></span>&#160;    VkDeviceSize <a class="code" href="struct_vma_allocation_info.html#aac76d113a6a5ccbb09fea00fb25fd18f">size</a>;</div>
+<div class="line"><a name="l03273"></a><span class="lineno"><a class="line" href="struct_vma_allocation_info.html#a5eeffbe2d2f30f53370ff14aefbadbe2"> 3273</a></span>&#160;    <span class="keywordtype">void</span>* VMA_NULLABLE <a class="code" href="struct_vma_allocation_info.html#a5eeffbe2d2f30f53370ff14aefbadbe2">pMappedData</a>;</div>
+<div class="line"><a name="l03278"></a><span class="lineno"><a class="line" href="struct_vma_allocation_info.html#adc507656149c04de7ed95d0042ba2a13"> 3278</a></span>&#160;    <span class="keywordtype">void</span>* VMA_NULLABLE <a class="code" href="struct_vma_allocation_info.html#adc507656149c04de7ed95d0042ba2a13">pUserData</a>;</div>
+<div class="line"><a name="l03279"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#a1cf7774606721026a68aabe3af2e5b50"> 3279</a></span>&#160;} <a class="code" href="vk__mem__alloc_8h.html#a1cf7774606721026a68aabe3af2e5b50">VmaAllocationInfo</a>;</div>
+<div class="line"><a name="l03280"></a><span class="lineno"> 3280</span>&#160; </div>
+<div class="line"><a name="l03291"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#abf28077dbf82d0908b8acbe8ee8dd9b8"> 3291</a></span>&#160;VMA_CALL_PRE VkResult VMA_CALL_POST <a class="code" href="vk__mem__alloc_8h.html#abf28077dbf82d0908b8acbe8ee8dd9b8">vmaAllocateMemory</a>(</div>
+<div class="line"><a name="l03292"></a><span class="lineno"> 3292</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> VMA_NOT_NULL allocator,</div>
+<div class="line"><a name="l03293"></a><span class="lineno"> 3293</span>&#160;    <span class="keyword">const</span> VkMemoryRequirements* VMA_NOT_NULL pVkMemoryRequirements,</div>
+<div class="line"><a name="l03294"></a><span class="lineno"> 3294</span>&#160;    <span class="keyword">const</span> <a class="code" href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a>* VMA_NOT_NULL pCreateInfo,</div>
+<div class="line"><a name="l03295"></a><span class="lineno"> 3295</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> VMA_NULLABLE * VMA_NOT_NULL pAllocation,</div>
+<div class="line"><a name="l03296"></a><span class="lineno"> 3296</span>&#160;    <a class="code" href="struct_vma_allocation_info.html">VmaAllocationInfo</a>* VMA_NULLABLE pAllocationInfo);</div>
+<div class="line"><a name="l03297"></a><span class="lineno"> 3297</span>&#160; </div>
+<div class="line"><a name="l03317"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#ad37e82e492b3de38fc3f4cffd9ad0ae1"> 3317</a></span>&#160;VMA_CALL_PRE VkResult VMA_CALL_POST <a class="code" href="vk__mem__alloc_8h.html#ad37e82e492b3de38fc3f4cffd9ad0ae1">vmaAllocateMemoryPages</a>(</div>
+<div class="line"><a name="l03318"></a><span class="lineno"> 3318</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> VMA_NOT_NULL allocator,</div>
+<div class="line"><a name="l03319"></a><span class="lineno"> 3319</span>&#160;    <span class="keyword">const</span> VkMemoryRequirements* VMA_NOT_NULL VMA_LEN_IF_NOT_NULL(allocationCount) pVkMemoryRequirements,</div>
+<div class="line"><a name="l03320"></a><span class="lineno"> 3320</span>&#160;    <span class="keyword">const</span> <a class="code" href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a>* VMA_NOT_NULL VMA_LEN_IF_NOT_NULL(allocationCount) pCreateInfo,</div>
+<div class="line"><a name="l03321"></a><span class="lineno"> 3321</span>&#160;    <span class="keywordtype">size_t</span> allocationCount,</div>
+<div class="line"><a name="l03322"></a><span class="lineno"> 3322</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> VMA_NULLABLE * VMA_NOT_NULL VMA_LEN_IF_NOT_NULL(allocationCount) pAllocations,</div>
+<div class="line"><a name="l03323"></a><span class="lineno"> 3323</span>&#160;    <a class="code" href="struct_vma_allocation_info.html">VmaAllocationInfo</a>* VMA_NULLABLE VMA_LEN_IF_NOT_NULL(allocationCount) pAllocationInfo);</div>
+<div class="line"><a name="l03324"></a><span class="lineno"> 3324</span>&#160; </div>
+<div class="line"><a name="l03331"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#a7fdf64415b6c3d83c454f28d2c53df7b"> 3331</a></span>&#160;VMA_CALL_PRE VkResult VMA_CALL_POST <a class="code" href="vk__mem__alloc_8h.html#a7fdf64415b6c3d83c454f28d2c53df7b">vmaAllocateMemoryForBuffer</a>(</div>
+<div class="line"><a name="l03332"></a><span class="lineno"> 3332</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> VMA_NOT_NULL allocator,</div>
+<div class="line"><a name="l03333"></a><span class="lineno"> 3333</span>&#160;    VkBuffer VMA_NOT_NULL_NON_DISPATCHABLE buffer,</div>
+<div class="line"><a name="l03334"></a><span class="lineno"> 3334</span>&#160;    <span class="keyword">const</span> <a class="code" href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a>* VMA_NOT_NULL pCreateInfo,</div>
+<div class="line"><a name="l03335"></a><span class="lineno"> 3335</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> VMA_NULLABLE * VMA_NOT_NULL pAllocation,</div>
+<div class="line"><a name="l03336"></a><span class="lineno"> 3336</span>&#160;    <a class="code" href="struct_vma_allocation_info.html">VmaAllocationInfo</a>* VMA_NULLABLE pAllocationInfo);</div>
+<div class="line"><a name="l03337"></a><span class="lineno"> 3337</span>&#160; </div>
+<div class="line"><a name="l03339"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#a0faa3f9e5fb233d29d1e00390650febb"> 3339</a></span>&#160;VMA_CALL_PRE VkResult VMA_CALL_POST <a class="code" href="vk__mem__alloc_8h.html#a0faa3f9e5fb233d29d1e00390650febb">vmaAllocateMemoryForImage</a>(</div>
+<div class="line"><a name="l03340"></a><span class="lineno"> 3340</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> VMA_NOT_NULL allocator,</div>
+<div class="line"><a name="l03341"></a><span class="lineno"> 3341</span>&#160;    VkImage VMA_NOT_NULL_NON_DISPATCHABLE image,</div>
+<div class="line"><a name="l03342"></a><span class="lineno"> 3342</span>&#160;    <span class="keyword">const</span> <a class="code" href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a>* VMA_NOT_NULL pCreateInfo,</div>
+<div class="line"><a name="l03343"></a><span class="lineno"> 3343</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> VMA_NULLABLE * VMA_NOT_NULL pAllocation,</div>
+<div class="line"><a name="l03344"></a><span class="lineno"> 3344</span>&#160;    <a class="code" href="struct_vma_allocation_info.html">VmaAllocationInfo</a>* VMA_NULLABLE pAllocationInfo);</div>
+<div class="line"><a name="l03345"></a><span class="lineno"> 3345</span>&#160; </div>
+<div class="line"><a name="l03350"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#a5fea5518972ae9094b1526cbcb19b05f"> 3350</a></span>&#160;VMA_CALL_PRE <span class="keywordtype">void</span> VMA_CALL_POST <a class="code" href="vk__mem__alloc_8h.html#a5fea5518972ae9094b1526cbcb19b05f">vmaFreeMemory</a>(</div>
+<div class="line"><a name="l03351"></a><span class="lineno"> 3351</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> VMA_NOT_NULL allocator,</div>
+<div class="line"><a name="l03352"></a><span class="lineno"> 3352</span>&#160;    <span class="keyword">const</span> <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> VMA_NULLABLE allocation);</div>
+<div class="line"><a name="l03353"></a><span class="lineno"> 3353</span>&#160; </div>
+<div class="line"><a name="l03364"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#a834b1e4aef395c0a1d56a28e69a4a17e"> 3364</a></span>&#160;VMA_CALL_PRE <span class="keywordtype">void</span> VMA_CALL_POST <a class="code" href="vk__mem__alloc_8h.html#a834b1e4aef395c0a1d56a28e69a4a17e">vmaFreeMemoryPages</a>(</div>
+<div class="line"><a name="l03365"></a><span class="lineno"> 3365</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> VMA_NOT_NULL allocator,</div>
+<div class="line"><a name="l03366"></a><span class="lineno"> 3366</span>&#160;    <span class="keywordtype">size_t</span> allocationCount,</div>
+<div class="line"><a name="l03367"></a><span class="lineno"> 3367</span>&#160;    <span class="keyword">const</span> <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> VMA_NULLABLE * VMA_NOT_NULL VMA_LEN_IF_NOT_NULL(allocationCount) pAllocations);</div>
+<div class="line"><a name="l03368"></a><span class="lineno"> 3368</span>&#160; </div>
+<div class="line"><a name="l03385"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#a86dd08aba8633bfa4ad0df2e76481d8b"> 3385</a></span>&#160;VMA_CALL_PRE <span class="keywordtype">void</span> VMA_CALL_POST <a class="code" href="vk__mem__alloc_8h.html#a86dd08aba8633bfa4ad0df2e76481d8b">vmaGetAllocationInfo</a>(</div>
+<div class="line"><a name="l03386"></a><span class="lineno"> 3386</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> VMA_NOT_NULL allocator,</div>
+<div class="line"><a name="l03387"></a><span class="lineno"> 3387</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> VMA_NOT_NULL allocation,</div>
+<div class="line"><a name="l03388"></a><span class="lineno"> 3388</span>&#160;    <a class="code" href="struct_vma_allocation_info.html">VmaAllocationInfo</a>* VMA_NOT_NULL pAllocationInfo);</div>
+<div class="line"><a name="l03389"></a><span class="lineno"> 3389</span>&#160; </div>
+<div class="line"><a name="l03404"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#a43d8ba9673c846f049089a5029d5c73a"> 3404</a></span>&#160;VMA_CALL_PRE VkBool32 VMA_CALL_POST <a class="code" href="vk__mem__alloc_8h.html#a43d8ba9673c846f049089a5029d5c73a">vmaTouchAllocation</a>(</div>
+<div class="line"><a name="l03405"></a><span class="lineno"> 3405</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> VMA_NOT_NULL allocator,</div>
+<div class="line"><a name="l03406"></a><span class="lineno"> 3406</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> VMA_NOT_NULL allocation);</div>
+<div class="line"><a name="l03407"></a><span class="lineno"> 3407</span>&#160; </div>
+<div class="line"><a name="l03421"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#af9147d31ffc11d62fc187bde283ed14f"> 3421</a></span>&#160;VMA_CALL_PRE <span class="keywordtype">void</span> VMA_CALL_POST <a class="code" href="vk__mem__alloc_8h.html#af9147d31ffc11d62fc187bde283ed14f">vmaSetAllocationUserData</a>(</div>
+<div class="line"><a name="l03422"></a><span class="lineno"> 3422</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> VMA_NOT_NULL allocator,</div>
+<div class="line"><a name="l03423"></a><span class="lineno"> 3423</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> VMA_NOT_NULL allocation,</div>
+<div class="line"><a name="l03424"></a><span class="lineno"> 3424</span>&#160;    <span class="keywordtype">void</span>* VMA_NULLABLE pUserData);</div>
+<div class="line"><a name="l03425"></a><span class="lineno"> 3425</span>&#160; </div>
+<div class="line"><a name="l03436"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#ae5c9657d9e94756269145b01c05d16f1"> 3436</a></span>&#160;VMA_CALL_PRE <span class="keywordtype">void</span> VMA_CALL_POST <a class="code" href="vk__mem__alloc_8h.html#ae5c9657d9e94756269145b01c05d16f1">vmaCreateLostAllocation</a>(</div>
+<div class="line"><a name="l03437"></a><span class="lineno"> 3437</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> VMA_NOT_NULL allocator,</div>
+<div class="line"><a name="l03438"></a><span class="lineno"> 3438</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> VMA_NULLABLE * VMA_NOT_NULL pAllocation);</div>
+<div class="line"><a name="l03439"></a><span class="lineno"> 3439</span>&#160; </div>
+<div class="line"><a name="l03478"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#ad5bd1243512d099706de88168992f069"> 3478</a></span>&#160;VMA_CALL_PRE VkResult VMA_CALL_POST <a class="code" href="vk__mem__alloc_8h.html#ad5bd1243512d099706de88168992f069">vmaMapMemory</a>(</div>
+<div class="line"><a name="l03479"></a><span class="lineno"> 3479</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> VMA_NOT_NULL allocator,</div>
+<div class="line"><a name="l03480"></a><span class="lineno"> 3480</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> VMA_NOT_NULL allocation,</div>
+<div class="line"><a name="l03481"></a><span class="lineno"> 3481</span>&#160;    <span class="keywordtype">void</span>* VMA_NULLABLE * VMA_NOT_NULL ppData);</div>
+<div class="line"><a name="l03482"></a><span class="lineno"> 3482</span>&#160; </div>
+<div class="line"><a name="l03491"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#a9bc268595cb33f6ec4d519cfce81ff45"> 3491</a></span>&#160;VMA_CALL_PRE <span class="keywordtype">void</span> VMA_CALL_POST <a class="code" href="vk__mem__alloc_8h.html#a9bc268595cb33f6ec4d519cfce81ff45">vmaUnmapMemory</a>(</div>
+<div class="line"><a name="l03492"></a><span class="lineno"> 3492</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> VMA_NOT_NULL allocator,</div>
+<div class="line"><a name="l03493"></a><span class="lineno"> 3493</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> VMA_NOT_NULL allocation);</div>
+<div class="line"><a name="l03494"></a><span class="lineno"> 3494</span>&#160; </div>
+<div class="line"><a name="l03516"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#a30c37c1eec6025f397be41644f48490f"> 3516</a></span>&#160;VMA_CALL_PRE VkResult VMA_CALL_POST <a class="code" href="vk__mem__alloc_8h.html#a30c37c1eec6025f397be41644f48490f">vmaFlushAllocation</a>(</div>
+<div class="line"><a name="l03517"></a><span class="lineno"> 3517</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> VMA_NOT_NULL allocator,</div>
+<div class="line"><a name="l03518"></a><span class="lineno"> 3518</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> VMA_NOT_NULL allocation,</div>
+<div class="line"><a name="l03519"></a><span class="lineno"> 3519</span>&#160;    VkDeviceSize offset,</div>
+<div class="line"><a name="l03520"></a><span class="lineno"> 3520</span>&#160;    VkDeviceSize size);</div>
+<div class="line"><a name="l03521"></a><span class="lineno"> 3521</span>&#160; </div>
+<div class="line"><a name="l03543"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#aaa8412919139ef413a4215ac6a290fae"> 3543</a></span>&#160;VMA_CALL_PRE VkResult VMA_CALL_POST <a class="code" href="vk__mem__alloc_8h.html#aaa8412919139ef413a4215ac6a290fae">vmaInvalidateAllocation</a>(</div>
+<div class="line"><a name="l03544"></a><span class="lineno"> 3544</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> VMA_NOT_NULL allocator,</div>
+<div class="line"><a name="l03545"></a><span class="lineno"> 3545</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> VMA_NOT_NULL allocation,</div>
+<div class="line"><a name="l03546"></a><span class="lineno"> 3546</span>&#160;    VkDeviceSize offset,</div>
+<div class="line"><a name="l03547"></a><span class="lineno"> 3547</span>&#160;    VkDeviceSize size);</div>
+<div class="line"><a name="l03548"></a><span class="lineno"> 3548</span>&#160; </div>
+<div class="line"><a name="l03563"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#ac3dd00da721875ed99fa8a881922bdfc"> 3563</a></span>&#160;VMA_CALL_PRE VkResult VMA_CALL_POST <a class="code" href="vk__mem__alloc_8h.html#ac3dd00da721875ed99fa8a881922bdfc">vmaFlushAllocations</a>(</div>
+<div class="line"><a name="l03564"></a><span class="lineno"> 3564</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> VMA_NOT_NULL allocator,</div>
+<div class="line"><a name="l03565"></a><span class="lineno"> 3565</span>&#160;    uint32_t allocationCount,</div>
+<div class="line"><a name="l03566"></a><span class="lineno"> 3566</span>&#160;    <span class="keyword">const</span> <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> VMA_NOT_NULL * VMA_NULLABLE VMA_LEN_IF_NOT_NULL(allocationCount) allocations,</div>
+<div class="line"><a name="l03567"></a><span class="lineno"> 3567</span>&#160;    <span class="keyword">const</span> VkDeviceSize* VMA_NULLABLE VMA_LEN_IF_NOT_NULL(allocationCount) offsets,</div>
+<div class="line"><a name="l03568"></a><span class="lineno"> 3568</span>&#160;    <span class="keyword">const</span> VkDeviceSize* VMA_NULLABLE VMA_LEN_IF_NOT_NULL(allocationCount) sizes);</div>
+<div class="line"><a name="l03569"></a><span class="lineno"> 3569</span>&#160; </div>
+<div class="line"><a name="l03584"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#ab25b558d75f7378ec944a1522fdcc3c5"> 3584</a></span>&#160;VMA_CALL_PRE VkResult VMA_CALL_POST <a class="code" href="vk__mem__alloc_8h.html#ab25b558d75f7378ec944a1522fdcc3c5">vmaInvalidateAllocations</a>(</div>
+<div class="line"><a name="l03585"></a><span class="lineno"> 3585</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> VMA_NOT_NULL allocator,</div>
+<div class="line"><a name="l03586"></a><span class="lineno"> 3586</span>&#160;    uint32_t allocationCount,</div>
+<div class="line"><a name="l03587"></a><span class="lineno"> 3587</span>&#160;    <span class="keyword">const</span> <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> VMA_NOT_NULL * VMA_NULLABLE VMA_LEN_IF_NOT_NULL(allocationCount) allocations,</div>
+<div class="line"><a name="l03588"></a><span class="lineno"> 3588</span>&#160;    <span class="keyword">const</span> VkDeviceSize* VMA_NULLABLE VMA_LEN_IF_NOT_NULL(allocationCount) offsets,</div>
+<div class="line"><a name="l03589"></a><span class="lineno"> 3589</span>&#160;    <span class="keyword">const</span> VkDeviceSize* VMA_NULLABLE VMA_LEN_IF_NOT_NULL(allocationCount) sizes);</div>
+<div class="line"><a name="l03590"></a><span class="lineno"> 3590</span>&#160; </div>
+<div class="line"><a name="l03607"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#a49329a7f030dafcf82f7b73334c22e98"> 3607</a></span>&#160;VMA_CALL_PRE VkResult VMA_CALL_POST <a class="code" href="vk__mem__alloc_8h.html#a49329a7f030dafcf82f7b73334c22e98">vmaCheckCorruption</a>(<a class="code" href="struct_vma_allocator.html">VmaAllocator</a> VMA_NOT_NULL allocator, uint32_t memoryTypeBits);</div>
+<div class="line"><a name="l03608"></a><span class="lineno"> 3608</span>&#160; </div>
+<div class="line"><a name="l03615"></a><span class="lineno"> 3615</span>&#160;VK_DEFINE_HANDLE(<a class="code" href="struct_vma_defragmentation_context.html">VmaDefragmentationContext</a>)</div>
+<div class="line"><a name="l03616"></a><span class="lineno"> 3616</span>&#160; </div>
+<div class="line"><a name="l03617"></a><span class="lineno"> 3617</span>&#160;<span class="keyword">typedef</span> <span class="keyword">enum</span> <a class="code" href="vk__mem__alloc_8h.html#a6552a65b71d16f378c6994b3ceaef50c">VmaDefragmentationFlagBits</a> {</div>
+<div class="line"><a name="l03619"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#a6552a65b71d16f378c6994b3ceaef50ca31af49446af2459284a568ce2f3fdd33"> 3619</a></span>&#160;    <a class="code" href="vk__mem__alloc_8h.html#a6552a65b71d16f378c6994b3ceaef50ca31af49446af2459284a568ce2f3fdd33">VMA_DEFRAGMENTATION_FLAG_INCREMENTAL</a> = 0x1,</div>
+<div class="line"><a name="l03620"></a><span class="lineno"> 3620</span>&#160;    <a class="code" href="vk__mem__alloc_8h.html#a6552a65b71d16f378c6994b3ceaef50cab87ec33154803bfeb5ac2b379f1d6a97">VMA_DEFRAGMENTATION_FLAG_BITS_MAX_ENUM</a> = 0x7FFFFFFF</div>
+<div class="line"><a name="l03621"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#a6552a65b71d16f378c6994b3ceaef50cab87ec33154803bfeb5ac2b379f1d6a97"> 3621</a></span>&#160;} <a class="code" href="vk__mem__alloc_8h.html#a6552a65b71d16f378c6994b3ceaef50c">VmaDefragmentationFlagBits</a>;</div>
+<div class="line"><a name="l03622"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#a88a77cef37e5d3c4fc9eb328885d048d"> 3622</a></span>&#160;<span class="keyword">typedef</span> VkFlags <a class="code" href="vk__mem__alloc_8h.html#a88a77cef37e5d3c4fc9eb328885d048d">VmaDefragmentationFlags</a>;</div>
+<div class="line"><a name="l03623"></a><span class="lineno"> 3623</span>&#160; </div>
+<div class="line"><a name="l03628"></a><span class="lineno"><a class="line" href="struct_vma_defragmentation_info2.html"> 3628</a></span>&#160;<span class="keyword">typedef</span> <span class="keyword">struct </span><a class="code" href="struct_vma_defragmentation_info2.html">VmaDefragmentationInfo2</a> {</div>
+<div class="line"><a name="l03631"></a><span class="lineno"><a class="line" href="struct_vma_defragmentation_info2.html#a53e844ee5633e229cf6daf14b2d9fff9"> 3631</a></span>&#160;    <a class="code" href="vk__mem__alloc_8h.html#a88a77cef37e5d3c4fc9eb328885d048d">VmaDefragmentationFlags</a> <a class="code" href="struct_vma_defragmentation_info2.html#a53e844ee5633e229cf6daf14b2d9fff9">flags</a>;</div>
+<div class="line"><a name="l03634"></a><span class="lineno"><a class="line" href="struct_vma_defragmentation_info2.html#a3cf86ab32c1da779b4923d301a3056ba"> 3634</a></span>&#160;    uint32_t <a class="code" href="struct_vma_defragmentation_info2.html#a3cf86ab32c1da779b4923d301a3056ba">allocationCount</a>;</div>
+<div class="line"><a name="l03643"></a><span class="lineno"><a class="line" href="struct_vma_defragmentation_info2.html#ab6d288f29d028156cf73542d630a2e32"> 3643</a></span>&#160;    <span class="keyword">const</span> <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> VMA_NOT_NULL * VMA_NULLABLE VMA_LEN_IF_NOT_NULL(allocationCount) <a class="code" href="struct_vma_defragmentation_info2.html#ab6d288f29d028156cf73542d630a2e32">pAllocations</a>;</div>
+<div class="line"><a name="l03649"></a><span class="lineno"><a class="line" href="struct_vma_defragmentation_info2.html#a76d51a644dc7f5405d0cdd0025ecd0cc"> 3649</a></span>&#160;    VkBool32* VMA_NULLABLE VMA_LEN_IF_NOT_NULL(allocationCount) <a class="code" href="struct_vma_defragmentation_info2.html#a76d51a644dc7f5405d0cdd0025ecd0cc">pAllocationsChanged</a>;</div>
+<div class="line"><a name="l03652"></a><span class="lineno"><a class="line" href="struct_vma_defragmentation_info2.html#a7e70aa2a1081d849dcc7829b19d3ec9d"> 3652</a></span>&#160;    uint32_t <a class="code" href="struct_vma_defragmentation_info2.html#a7e70aa2a1081d849dcc7829b19d3ec9d">poolCount</a>;</div>
+<div class="line"><a name="l03668"></a><span class="lineno"><a class="line" href="struct_vma_defragmentation_info2.html#a3c9c6aa5c97d5670f8e362b3a6f3029b"> 3668</a></span>&#160;    <span class="keyword">const</span> <a class="code" href="struct_vma_pool.html">VmaPool</a> VMA_NOT_NULL * VMA_NULLABLE VMA_LEN_IF_NOT_NULL(poolCount) <a class="code" href="struct_vma_defragmentation_info2.html#a3c9c6aa5c97d5670f8e362b3a6f3029b">pPools</a>;</div>
+<div class="line"><a name="l03673"></a><span class="lineno"><a class="line" href="struct_vma_defragmentation_info2.html#af78e1ea40c22d85137b65f6b384a4d0a"> 3673</a></span>&#160;    VkDeviceSize <a class="code" href="struct_vma_defragmentation_info2.html#af78e1ea40c22d85137b65f6b384a4d0a">maxCpuBytesToMove</a>;</div>
+<div class="line"><a name="l03678"></a><span class="lineno"><a class="line" href="struct_vma_defragmentation_info2.html#a94c2c7223d52878445a8cccce396b671"> 3678</a></span>&#160;    uint32_t <a class="code" href="struct_vma_defragmentation_info2.html#a94c2c7223d52878445a8cccce396b671">maxCpuAllocationsToMove</a>;</div>
+<div class="line"><a name="l03683"></a><span class="lineno"><a class="line" href="struct_vma_defragmentation_info2.html#a4ddbc898d0afe1518f863a3763628f08"> 3683</a></span>&#160;    VkDeviceSize <a class="code" href="struct_vma_defragmentation_info2.html#a4ddbc898d0afe1518f863a3763628f08">maxGpuBytesToMove</a>;</div>
+<div class="line"><a name="l03688"></a><span class="lineno"><a class="line" href="struct_vma_defragmentation_info2.html#a40d53d33e71ba0b66f844ed63c05a3f6"> 3688</a></span>&#160;    uint32_t <a class="code" href="struct_vma_defragmentation_info2.html#a40d53d33e71ba0b66f844ed63c05a3f6">maxGpuAllocationsToMove</a>;</div>
+<div class="line"><a name="l03697"></a><span class="lineno"><a class="line" href="struct_vma_defragmentation_info2.html#a7f71f39590c5316771493d2333f9c1bd"> 3697</a></span>&#160;    VkCommandBuffer VMA_NULLABLE <a class="code" href="struct_vma_defragmentation_info2.html#a7f71f39590c5316771493d2333f9c1bd">commandBuffer</a>;</div>
+<div class="line"><a name="l03698"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#ad6daeffaa670ce6d11a203a6224c9937"> 3698</a></span>&#160;} <a class="code" href="vk__mem__alloc_8h.html#ad6daeffaa670ce6d11a203a6224c9937">VmaDefragmentationInfo2</a>;</div>
+<div class="line"><a name="l03699"></a><span class="lineno"> 3699</span>&#160; </div>
+<div class="line"><a name="l03700"></a><span class="lineno"><a class="line" href="struct_vma_defragmentation_pass_move_info.html"> 3700</a></span>&#160;<span class="keyword">typedef</span> <span class="keyword">struct </span><a class="code" href="struct_vma_defragmentation_pass_move_info.html">VmaDefragmentationPassMoveInfo</a> {</div>
+<div class="line"><a name="l03701"></a><span class="lineno"><a class="line" href="struct_vma_defragmentation_pass_move_info.html#ae885c861c2dd8d622e6c19e281d035cc"> 3701</a></span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> VMA_NOT_NULL <a class="code" href="struct_vma_defragmentation_pass_move_info.html#ae885c861c2dd8d622e6c19e281d035cc">allocation</a>;</div>
+<div class="line"><a name="l03702"></a><span class="lineno"><a class="line" href="struct_vma_defragmentation_pass_move_info.html#a06eb0c8690aa0d3478a036753492e769"> 3702</a></span>&#160;    VkDeviceMemory VMA_NOT_NULL_NON_DISPATCHABLE <a class="code" href="struct_vma_defragmentation_pass_move_info.html#a06eb0c8690aa0d3478a036753492e769">memory</a>;</div>
+<div class="line"><a name="l03703"></a><span class="lineno"><a class="line" href="struct_vma_defragmentation_pass_move_info.html#a8ab4508bc03625b0653c880576be96c6"> 3703</a></span>&#160;    VkDeviceSize <a class="code" href="struct_vma_defragmentation_pass_move_info.html#a8ab4508bc03625b0653c880576be96c6">offset</a>;</div>
+<div class="line"><a name="l03704"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#ad6799e8e2b1527abfc84d33bc44aeaf5"> 3704</a></span>&#160;} <a class="code" href="vk__mem__alloc_8h.html#ad6799e8e2b1527abfc84d33bc44aeaf5">VmaDefragmentationPassMoveInfo</a>;</div>
+<div class="line"><a name="l03705"></a><span class="lineno"> 3705</span>&#160; </div>
+<div class="line"><a name="l03710"></a><span class="lineno"><a class="line" href="struct_vma_defragmentation_pass_info.html"> 3710</a></span>&#160;<span class="keyword">typedef</span> <span class="keyword">struct </span><a class="code" href="struct_vma_defragmentation_pass_info.html">VmaDefragmentationPassInfo</a> {</div>
+<div class="line"><a name="l03711"></a><span class="lineno"><a class="line" href="struct_vma_defragmentation_pass_info.html#ac1086e657ba995f8d1f4e49b83dcfb6c"> 3711</a></span>&#160;    uint32_t <a class="code" href="struct_vma_defragmentation_pass_info.html#ac1086e657ba995f8d1f4e49b83dcfb6c">moveCount</a>;</div>
+<div class="line"><a name="l03712"></a><span class="lineno"><a class="line" href="struct_vma_defragmentation_pass_info.html#acbd42d4a3357999da130a95cd99a3792"> 3712</a></span>&#160;    <a class="code" href="struct_vma_defragmentation_pass_move_info.html">VmaDefragmentationPassMoveInfo</a>* VMA_NOT_NULL VMA_LEN_IF_NOT_NULL(moveCount) <a class="code" href="struct_vma_defragmentation_pass_info.html#acbd42d4a3357999da130a95cd99a3792">pMoves</a>;</div>
+<div class="line"><a name="l03713"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#a72aebd522242d56abea67b4f47f6549e"> 3713</a></span>&#160;} <a class="code" href="vk__mem__alloc_8h.html#a72aebd522242d56abea67b4f47f6549e">VmaDefragmentationPassInfo</a>;</div>
+<div class="line"><a name="l03714"></a><span class="lineno"> 3714</span>&#160; </div>
+<div class="line"><a name="l03719"></a><span class="lineno"><a class="line" href="struct_vma_defragmentation_info.html"> 3719</a></span>&#160;<span class="keyword">typedef</span> <span class="keyword">struct </span><a class="code" href="struct_vma_defragmentation_info.html">VmaDefragmentationInfo</a> {</div>
+<div class="line"><a name="l03724"></a><span class="lineno"><a class="line" href="struct_vma_defragmentation_info.html#acb311c940a777270e67e1b81c5ab6a1d"> 3724</a></span>&#160;    VkDeviceSize <a class="code" href="struct_vma_defragmentation_info.html#acb311c940a777270e67e1b81c5ab6a1d">maxBytesToMove</a>;</div>
+<div class="line"><a name="l03729"></a><span class="lineno"><a class="line" href="struct_vma_defragmentation_info.html#aa7c7304e13c71f604c907196c4e28fbc"> 3729</a></span>&#160;    uint32_t <a class="code" href="struct_vma_defragmentation_info.html#aa7c7304e13c71f604c907196c4e28fbc">maxAllocationsToMove</a>;</div>
+<div class="line"><a name="l03730"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#a2bf47f96bf92bed2a49461bd9af3acfa"> 3730</a></span>&#160;} <a class="code" href="vk__mem__alloc_8h.html#a2bf47f96bf92bed2a49461bd9af3acfa">VmaDefragmentationInfo</a>;</div>
+<div class="line"><a name="l03731"></a><span class="lineno"> 3731</span>&#160; </div>
+<div class="line"><a name="l03733"></a><span class="lineno"><a class="line" href="struct_vma_defragmentation_stats.html"> 3733</a></span>&#160;<span class="keyword">typedef</span> <span class="keyword">struct </span><a class="code" href="struct_vma_defragmentation_stats.html">VmaDefragmentationStats</a> {</div>
+<div class="line"><a name="l03735"></a><span class="lineno"><a class="line" href="struct_vma_defragmentation_stats.html#a36f9d5df2a10ba2a36b16e126d60572d"> 3735</a></span>&#160;    VkDeviceSize <a class="code" href="struct_vma_defragmentation_stats.html#a36f9d5df2a10ba2a36b16e126d60572d">bytesMoved</a>;</div>
+<div class="line"><a name="l03737"></a><span class="lineno"><a class="line" href="struct_vma_defragmentation_stats.html#ab0cb9ac0dbc106c77e384ea676422f28"> 3737</a></span>&#160;    VkDeviceSize <a class="code" href="struct_vma_defragmentation_stats.html#ab0cb9ac0dbc106c77e384ea676422f28">bytesFreed</a>;</div>
+<div class="line"><a name="l03739"></a><span class="lineno"><a class="line" href="struct_vma_defragmentation_stats.html#aefeabf130022008eadd75999478af3f9"> 3739</a></span>&#160;    uint32_t <a class="code" href="struct_vma_defragmentation_stats.html#aefeabf130022008eadd75999478af3f9">allocationsMoved</a>;</div>
+<div class="line"><a name="l03741"></a><span class="lineno"><a class="line" href="struct_vma_defragmentation_stats.html#a0113f1877904a5d1ee8f409216ff276b"> 3741</a></span>&#160;    uint32_t <a class="code" href="struct_vma_defragmentation_stats.html#a0113f1877904a5d1ee8f409216ff276b">deviceMemoryBlocksFreed</a>;</div>
+<div class="line"><a name="l03742"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#ad94034192259c2e34a4d1c5e27810403"> 3742</a></span>&#160;} <a class="code" href="vk__mem__alloc_8h.html#ad94034192259c2e34a4d1c5e27810403">VmaDefragmentationStats</a>;</div>
+<div class="line"><a name="l03743"></a><span class="lineno"> 3743</span>&#160; </div>
+<div class="line"><a name="l03773"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#a36ba776fd7fd5cb1e9359fdc0d8e6e8a"> 3773</a></span>&#160;VMA_CALL_PRE VkResult VMA_CALL_POST <a class="code" href="vk__mem__alloc_8h.html#a36ba776fd7fd5cb1e9359fdc0d8e6e8a">vmaDefragmentationBegin</a>(</div>
+<div class="line"><a name="l03774"></a><span class="lineno"> 3774</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> VMA_NOT_NULL allocator,</div>
+<div class="line"><a name="l03775"></a><span class="lineno"> 3775</span>&#160;    <span class="keyword">const</span> <a class="code" href="struct_vma_defragmentation_info2.html">VmaDefragmentationInfo2</a>* VMA_NOT_NULL pInfo,</div>
+<div class="line"><a name="l03776"></a><span class="lineno"> 3776</span>&#160;    <a class="code" href="struct_vma_defragmentation_stats.html">VmaDefragmentationStats</a>* VMA_NULLABLE pStats,</div>
+<div class="line"><a name="l03777"></a><span class="lineno"> 3777</span>&#160;    <a class="code" href="struct_vma_defragmentation_context.html">VmaDefragmentationContext</a> VMA_NULLABLE * VMA_NOT_NULL pContext);</div>
+<div class="line"><a name="l03778"></a><span class="lineno"> 3778</span>&#160; </div>
+<div class="line"><a name="l03784"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#a8774e20e91e245aae959ba63efa15dd2"> 3784</a></span>&#160;VMA_CALL_PRE VkResult VMA_CALL_POST <a class="code" href="vk__mem__alloc_8h.html#a8774e20e91e245aae959ba63efa15dd2">vmaDefragmentationEnd</a>(</div>
 <div class="line"><a name="l03785"></a><span class="lineno"> 3785</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> VMA_NOT_NULL allocator,</div>
-<div class="line"><a name="l03786"></a><span class="lineno"> 3786</span>&#160;    <span class="keyword">const</span> VkBufferCreateInfo* VMA_NOT_NULL pBufferCreateInfo,</div>
-<div class="line"><a name="l03787"></a><span class="lineno"> 3787</span>&#160;    <span class="keyword">const</span> <a class="code" href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a>* VMA_NOT_NULL pAllocationCreateInfo,</div>
-<div class="line"><a name="l03788"></a><span class="lineno"> 3788</span>&#160;    VkBuffer VMA_NULLABLE_NON_DISPATCHABLE * VMA_NOT_NULL pBuffer,</div>
-<div class="line"><a name="l03789"></a><span class="lineno"> 3789</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> VMA_NULLABLE * VMA_NOT_NULL pAllocation,</div>
-<div class="line"><a name="l03790"></a><span class="lineno"> 3790</span>&#160;    <a class="code" href="struct_vma_allocation_info.html">VmaAllocationInfo</a>* VMA_NULLABLE pAllocationInfo);</div>
-<div class="line"><a name="l03791"></a><span class="lineno"> 3791</span>&#160; </div>
-<div class="line"><a name="l03803"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#a0d9f4e4ba5bf9aab1f1c746387753d77"> 3803</a></span>&#160;VMA_CALL_PRE <span class="keywordtype">void</span> VMA_CALL_POST <a class="code" href="vk__mem__alloc_8h.html#a0d9f4e4ba5bf9aab1f1c746387753d77">vmaDestroyBuffer</a>(</div>
-<div class="line"><a name="l03804"></a><span class="lineno"> 3804</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> VMA_NOT_NULL allocator,</div>
-<div class="line"><a name="l03805"></a><span class="lineno"> 3805</span>&#160;    VkBuffer VMA_NULLABLE_NON_DISPATCHABLE buffer,</div>
-<div class="line"><a name="l03806"></a><span class="lineno"> 3806</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> VMA_NULLABLE allocation);</div>
-<div class="line"><a name="l03807"></a><span class="lineno"> 3807</span>&#160; </div>
-<div class="line"><a name="l03809"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#a02a94f25679275851a53e82eacbcfc73"> 3809</a></span>&#160;VMA_CALL_PRE VkResult VMA_CALL_POST <a class="code" href="vk__mem__alloc_8h.html#a02a94f25679275851a53e82eacbcfc73">vmaCreateImage</a>(</div>
-<div class="line"><a name="l03810"></a><span class="lineno"> 3810</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> VMA_NOT_NULL allocator,</div>
-<div class="line"><a name="l03811"></a><span class="lineno"> 3811</span>&#160;    <span class="keyword">const</span> VkImageCreateInfo* VMA_NOT_NULL pImageCreateInfo,</div>
-<div class="line"><a name="l03812"></a><span class="lineno"> 3812</span>&#160;    <span class="keyword">const</span> <a class="code" href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a>* VMA_NOT_NULL pAllocationCreateInfo,</div>
-<div class="line"><a name="l03813"></a><span class="lineno"> 3813</span>&#160;    VkImage VMA_NULLABLE_NON_DISPATCHABLE * VMA_NOT_NULL pImage,</div>
-<div class="line"><a name="l03814"></a><span class="lineno"> 3814</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> VMA_NULLABLE * VMA_NOT_NULL pAllocation,</div>
-<div class="line"><a name="l03815"></a><span class="lineno"> 3815</span>&#160;    <a class="code" href="struct_vma_allocation_info.html">VmaAllocationInfo</a>* VMA_NULLABLE pAllocationInfo);</div>
-<div class="line"><a name="l03816"></a><span class="lineno"> 3816</span>&#160; </div>
-<div class="line"><a name="l03828"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#ae50d2cb3b4a3bfd4dd40987234e50e7e"> 3828</a></span>&#160;VMA_CALL_PRE <span class="keywordtype">void</span> VMA_CALL_POST <a class="code" href="vk__mem__alloc_8h.html#ae50d2cb3b4a3bfd4dd40987234e50e7e">vmaDestroyImage</a>(</div>
-<div class="line"><a name="l03829"></a><span class="lineno"> 3829</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> VMA_NOT_NULL allocator,</div>
-<div class="line"><a name="l03830"></a><span class="lineno"> 3830</span>&#160;    VkImage VMA_NULLABLE_NON_DISPATCHABLE image,</div>
-<div class="line"><a name="l03831"></a><span class="lineno"> 3831</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> VMA_NULLABLE allocation);</div>
-<div class="line"><a name="l03832"></a><span class="lineno"> 3832</span>&#160; </div>
-<div class="line"><a name="l03833"></a><span class="lineno"> 3833</span>&#160;<span class="preprocessor">#ifdef __cplusplus</span></div>
-<div class="line"><a name="l03834"></a><span class="lineno"> 3834</span>&#160;}</div>
-<div class="line"><a name="l03835"></a><span class="lineno"> 3835</span>&#160;<span class="preprocessor">#endif</span></div>
-<div class="line"><a name="l03836"></a><span class="lineno"> 3836</span>&#160; </div>
-<div class="line"><a name="l03837"></a><span class="lineno"> 3837</span>&#160;<span class="preprocessor">#endif // AMD_VULKAN_MEMORY_ALLOCATOR_H</span></div>
-<div class="line"><a name="l03838"></a><span class="lineno"> 3838</span>&#160; </div>
-<div class="line"><a name="l03839"></a><span class="lineno"> 3839</span>&#160;<span class="comment">// For Visual Studio IntelliSense.</span></div>
-<div class="line"><a name="l03840"></a><span class="lineno"> 3840</span>&#160;<span class="preprocessor">#if defined(__cplusplus) &amp;&amp; defined(__INTELLISENSE__)</span></div>
-<div class="line"><a name="l03841"></a><span class="lineno"> 3841</span>&#160;<span class="preprocessor">#define VMA_IMPLEMENTATION</span></div>
-<div class="line"><a name="l03842"></a><span class="lineno"> 3842</span>&#160;<span class="preprocessor">#endif</span></div>
-<div class="line"><a name="l03843"></a><span class="lineno"> 3843</span>&#160; </div>
-<div class="line"><a name="l03844"></a><span class="lineno"> 3844</span>&#160;<span class="preprocessor">#ifdef VMA_IMPLEMENTATION</span></div>
-<div class="line"><a name="l03845"></a><span class="lineno"> 3845</span>&#160;<span class="preprocessor">#undef VMA_IMPLEMENTATION</span></div>
-<div class="line"><a name="l03846"></a><span class="lineno"> 3846</span>&#160; </div>
-<div class="line"><a name="l03847"></a><span class="lineno"> 3847</span>&#160;<span class="preprocessor">#include &lt;cstdint&gt;</span></div>
-<div class="line"><a name="l03848"></a><span class="lineno"> 3848</span>&#160;<span class="preprocessor">#include &lt;cstdlib&gt;</span></div>
-<div class="line"><a name="l03849"></a><span class="lineno"> 3849</span>&#160;<span class="preprocessor">#include &lt;cstring&gt;</span></div>
-<div class="line"><a name="l03850"></a><span class="lineno"> 3850</span>&#160;<span class="preprocessor">#include &lt;utility&gt;</span></div>
-<div class="line"><a name="l03851"></a><span class="lineno"> 3851</span>&#160; </div>
-<div class="line"><a name="l03852"></a><span class="lineno"> 3852</span>&#160;<span class="comment">/*******************************************************************************</span></div>
-<div class="line"><a name="l03853"></a><span class="lineno"> 3853</span>&#160;<span class="comment">CONFIGURATION SECTION</span></div>
-<div class="line"><a name="l03854"></a><span class="lineno"> 3854</span>&#160;<span class="comment"></span> </div>
-<div class="line"><a name="l03855"></a><span class="lineno"> 3855</span>&#160;<span class="comment">Define some of these macros before each #include of this header or change them</span></div>
-<div class="line"><a name="l03856"></a><span class="lineno"> 3856</span>&#160;<span class="comment">here if you need other then default behavior depending on your environment.</span></div>
-<div class="line"><a name="l03857"></a><span class="lineno"> 3857</span>&#160;<span class="comment">*/</span></div>
-<div class="line"><a name="l03858"></a><span class="lineno"> 3858</span>&#160; </div>
-<div class="line"><a name="l03859"></a><span class="lineno"> 3859</span>&#160;<span class="comment">/*</span></div>
-<div class="line"><a name="l03860"></a><span class="lineno"> 3860</span>&#160;<span class="comment">Define this macro to 1 to make the library fetch pointers to Vulkan functions</span></div>
-<div class="line"><a name="l03861"></a><span class="lineno"> 3861</span>&#160;<span class="comment">internally, like:</span></div>
-<div class="line"><a name="l03862"></a><span class="lineno"> 3862</span>&#160;<span class="comment"></span> </div>
-<div class="line"><a name="l03863"></a><span class="lineno"> 3863</span>&#160;<span class="comment">    vulkanFunctions.vkAllocateMemory = &amp;vkAllocateMemory;</span></div>
-<div class="line"><a name="l03864"></a><span class="lineno"> 3864</span>&#160;<span class="comment">*/</span></div>
-<div class="line"><a name="l03865"></a><span class="lineno"> 3865</span>&#160;<span class="preprocessor">#if !defined(VMA_STATIC_VULKAN_FUNCTIONS) &amp;&amp; !defined(VK_NO_PROTOTYPES)</span></div>
-<div class="line"><a name="l03866"></a><span class="lineno"> 3866</span>&#160;<span class="preprocessor">    #define VMA_STATIC_VULKAN_FUNCTIONS 1</span></div>
-<div class="line"><a name="l03867"></a><span class="lineno"> 3867</span>&#160;<span class="preprocessor">#endif</span></div>
-<div class="line"><a name="l03868"></a><span class="lineno"> 3868</span>&#160; </div>
-<div class="line"><a name="l03869"></a><span class="lineno"> 3869</span>&#160;<span class="comment">/*</span></div>
-<div class="line"><a name="l03870"></a><span class="lineno"> 3870</span>&#160;<span class="comment">Define this macro to 1 to make the library fetch pointers to Vulkan functions</span></div>
-<div class="line"><a name="l03871"></a><span class="lineno"> 3871</span>&#160;<span class="comment">internally, like:</span></div>
-<div class="line"><a name="l03872"></a><span class="lineno"> 3872</span>&#160;<span class="comment"></span> </div>
-<div class="line"><a name="l03873"></a><span class="lineno"> 3873</span>&#160;<span class="comment">    vulkanFunctions.vkAllocateMemory = (PFN_vkAllocateMemory)vkGetDeviceProcAddr(m_hDevice, vkAllocateMemory);</span></div>
-<div class="line"><a name="l03874"></a><span class="lineno"> 3874</span>&#160;<span class="comment">*/</span></div>
-<div class="line"><a name="l03875"></a><span class="lineno"> 3875</span>&#160;<span class="preprocessor">#if !defined(VMA_DYNAMIC_VULKAN_FUNCTIONS)</span></div>
-<div class="line"><a name="l03876"></a><span class="lineno"> 3876</span>&#160;<span class="preprocessor">    #define VMA_DYNAMIC_VULKAN_FUNCTIONS 1</span></div>
-<div class="line"><a name="l03877"></a><span class="lineno"> 3877</span>&#160;<span class="preprocessor">#endif</span></div>
-<div class="line"><a name="l03878"></a><span class="lineno"> 3878</span>&#160; </div>
-<div class="line"><a name="l03879"></a><span class="lineno"> 3879</span>&#160;<span class="comment">// Define this macro to 1 to make the library use STL containers instead of its own implementation.</span></div>
-<div class="line"><a name="l03880"></a><span class="lineno"> 3880</span>&#160;<span class="comment">//#define VMA_USE_STL_CONTAINERS 1</span></div>
-<div class="line"><a name="l03881"></a><span class="lineno"> 3881</span>&#160; </div>
-<div class="line"><a name="l03882"></a><span class="lineno"> 3882</span>&#160;<span class="comment">/* Set this macro to 1 to make the library including and using STL containers:</span></div>
-<div class="line"><a name="l03883"></a><span class="lineno"> 3883</span>&#160;<span class="comment">std::pair, std::vector, std::list, std::unordered_map.</span></div>
-<div class="line"><a name="l03884"></a><span class="lineno"> 3884</span>&#160;<span class="comment"></span> </div>
-<div class="line"><a name="l03885"></a><span class="lineno"> 3885</span>&#160;<span class="comment">Set it to 0 or undefined to make the library using its own implementation of</span></div>
-<div class="line"><a name="l03886"></a><span class="lineno"> 3886</span>&#160;<span class="comment">the containers.</span></div>
-<div class="line"><a name="l03887"></a><span class="lineno"> 3887</span>&#160;<span class="comment">*/</span></div>
-<div class="line"><a name="l03888"></a><span class="lineno"> 3888</span>&#160;<span class="preprocessor">#if VMA_USE_STL_CONTAINERS</span></div>
-<div class="line"><a name="l03889"></a><span class="lineno"> 3889</span>&#160;<span class="preprocessor">   #define VMA_USE_STL_VECTOR 1</span></div>
-<div class="line"><a name="l03890"></a><span class="lineno"> 3890</span>&#160;<span class="preprocessor">   #define VMA_USE_STL_UNORDERED_MAP 1</span></div>
-<div class="line"><a name="l03891"></a><span class="lineno"> 3891</span>&#160;<span class="preprocessor">   #define VMA_USE_STL_LIST 1</span></div>
-<div class="line"><a name="l03892"></a><span class="lineno"> 3892</span>&#160;<span class="preprocessor">#endif</span></div>
-<div class="line"><a name="l03893"></a><span class="lineno"> 3893</span>&#160; </div>
-<div class="line"><a name="l03894"></a><span class="lineno"> 3894</span>&#160;<span class="preprocessor">#ifndef VMA_USE_STL_SHARED_MUTEX</span></div>
-<div class="line"><a name="l03895"></a><span class="lineno"> 3895</span>&#160;    <span class="comment">// Compiler conforms to C++17.</span></div>
-<div class="line"><a name="l03896"></a><span class="lineno"> 3896</span>&#160;<span class="preprocessor">    #if __cplusplus &gt;= 201703L</span></div>
-<div class="line"><a name="l03897"></a><span class="lineno"> 3897</span>&#160;<span class="preprocessor">        #define VMA_USE_STL_SHARED_MUTEX 1</span></div>
-<div class="line"><a name="l03898"></a><span class="lineno"> 3898</span>&#160;    <span class="comment">// Visual studio defines __cplusplus properly only when passed additional parameter: /Zc:__cplusplus</span></div>
-<div class="line"><a name="l03899"></a><span class="lineno"> 3899</span>&#160;    <span class="comment">// Otherwise it&#39;s always 199711L, despite shared_mutex works since Visual Studio 2015 Update 2.</span></div>
-<div class="line"><a name="l03900"></a><span class="lineno"> 3900</span>&#160;    <span class="comment">// See: https://blogs.msdn.microsoft.com/vcblog/2018/04/09/msvc-now-correctly-reports-__cplusplus/</span></div>
-<div class="line"><a name="l03901"></a><span class="lineno"> 3901</span>&#160;<span class="preprocessor">    #elif defined(_MSC_FULL_VER) &amp;&amp; _MSC_FULL_VER &gt;= 190023918 &amp;&amp; __cplusplus == 199711L &amp;&amp; _MSVC_LANG &gt;= 201703L</span></div>
-<div class="line"><a name="l03902"></a><span class="lineno"> 3902</span>&#160;<span class="preprocessor">        #define VMA_USE_STL_SHARED_MUTEX 1</span></div>
-<div class="line"><a name="l03903"></a><span class="lineno"> 3903</span>&#160;<span class="preprocessor">    #else</span></div>
-<div class="line"><a name="l03904"></a><span class="lineno"> 3904</span>&#160;<span class="preprocessor">        #define VMA_USE_STL_SHARED_MUTEX 0</span></div>
-<div class="line"><a name="l03905"></a><span class="lineno"> 3905</span>&#160;<span class="preprocessor">    #endif</span></div>
-<div class="line"><a name="l03906"></a><span class="lineno"> 3906</span>&#160;<span class="preprocessor">#endif</span></div>
-<div class="line"><a name="l03907"></a><span class="lineno"> 3907</span>&#160; </div>
-<div class="line"><a name="l03908"></a><span class="lineno"> 3908</span>&#160;<span class="comment">/*</span></div>
-<div class="line"><a name="l03909"></a><span class="lineno"> 3909</span>&#160;<span class="comment">THESE INCLUDES ARE NOT ENABLED BY DEFAULT.</span></div>
-<div class="line"><a name="l03910"></a><span class="lineno"> 3910</span>&#160;<span class="comment">Library has its own container implementation.</span></div>
-<div class="line"><a name="l03911"></a><span class="lineno"> 3911</span>&#160;<span class="comment">*/</span></div>
-<div class="line"><a name="l03912"></a><span class="lineno"> 3912</span>&#160;<span class="preprocessor">#if VMA_USE_STL_VECTOR</span></div>
-<div class="line"><a name="l03913"></a><span class="lineno"> 3913</span>&#160;<span class="preprocessor">   #include &lt;vector&gt;</span></div>
-<div class="line"><a name="l03914"></a><span class="lineno"> 3914</span>&#160;<span class="preprocessor">#endif</span></div>
-<div class="line"><a name="l03915"></a><span class="lineno"> 3915</span>&#160; </div>
-<div class="line"><a name="l03916"></a><span class="lineno"> 3916</span>&#160;<span class="preprocessor">#if VMA_USE_STL_UNORDERED_MAP</span></div>
-<div class="line"><a name="l03917"></a><span class="lineno"> 3917</span>&#160;<span class="preprocessor">   #include &lt;unordered_map&gt;</span></div>
-<div class="line"><a name="l03918"></a><span class="lineno"> 3918</span>&#160;<span class="preprocessor">#endif</span></div>
-<div class="line"><a name="l03919"></a><span class="lineno"> 3919</span>&#160; </div>
-<div class="line"><a name="l03920"></a><span class="lineno"> 3920</span>&#160;<span class="preprocessor">#if VMA_USE_STL_LIST</span></div>
-<div class="line"><a name="l03921"></a><span class="lineno"> 3921</span>&#160;<span class="preprocessor">   #include &lt;list&gt;</span></div>
-<div class="line"><a name="l03922"></a><span class="lineno"> 3922</span>&#160;<span class="preprocessor">#endif</span></div>
-<div class="line"><a name="l03923"></a><span class="lineno"> 3923</span>&#160; </div>
-<div class="line"><a name="l03924"></a><span class="lineno"> 3924</span>&#160;<span class="comment">/*</span></div>
-<div class="line"><a name="l03925"></a><span class="lineno"> 3925</span>&#160;<span class="comment">Following headers are used in this CONFIGURATION section only, so feel free to</span></div>
-<div class="line"><a name="l03926"></a><span class="lineno"> 3926</span>&#160;<span class="comment">remove them if not needed.</span></div>
-<div class="line"><a name="l03927"></a><span class="lineno"> 3927</span>&#160;<span class="comment">*/</span></div>
-<div class="line"><a name="l03928"></a><span class="lineno"> 3928</span>&#160;<span class="preprocessor">#include &lt;cassert&gt;</span> <span class="comment">// for assert</span></div>
-<div class="line"><a name="l03929"></a><span class="lineno"> 3929</span>&#160;<span class="preprocessor">#include &lt;algorithm&gt;</span> <span class="comment">// for min, max</span></div>
-<div class="line"><a name="l03930"></a><span class="lineno"> 3930</span>&#160;<span class="preprocessor">#include &lt;mutex&gt;</span></div>
-<div class="line"><a name="l03931"></a><span class="lineno"> 3931</span>&#160; </div>
-<div class="line"><a name="l03932"></a><span class="lineno"> 3932</span>&#160;<span class="preprocessor">#ifndef VMA_NULL</span></div>
-<div class="line"><a name="l03933"></a><span class="lineno"> 3933</span>&#160;   <span class="comment">// Value used as null pointer. Define it to e.g.: nullptr, NULL, 0, (void*)0.</span></div>
-<div class="line"><a name="l03934"></a><span class="lineno"> 3934</span>&#160;<span class="preprocessor">   #define VMA_NULL   nullptr</span></div>
-<div class="line"><a name="l03935"></a><span class="lineno"> 3935</span>&#160;<span class="preprocessor">#endif</span></div>
-<div class="line"><a name="l03936"></a><span class="lineno"> 3936</span>&#160; </div>
-<div class="line"><a name="l03937"></a><span class="lineno"> 3937</span>&#160;<span class="preprocessor">#if defined(__ANDROID_API__) &amp;&amp; (__ANDROID_API__ &lt; 16)</span></div>
-<div class="line"><a name="l03938"></a><span class="lineno"> 3938</span>&#160;<span class="preprocessor">#include &lt;cstdlib&gt;</span></div>
-<div class="line"><a name="l03939"></a><span class="lineno"> 3939</span>&#160;<span class="keywordtype">void</span> *aligned_alloc(<span class="keywordtype">size_t</span> alignment, <span class="keywordtype">size_t</span> size)</div>
-<div class="line"><a name="l03940"></a><span class="lineno"> 3940</span>&#160;{</div>
-<div class="line"><a name="l03941"></a><span class="lineno"> 3941</span>&#160;    <span class="comment">// alignment must be &gt;= sizeof(void*)</span></div>
-<div class="line"><a name="l03942"></a><span class="lineno"> 3942</span>&#160;    <span class="keywordflow">if</span>(alignment &lt; <span class="keyword">sizeof</span>(<span class="keywordtype">void</span>*))</div>
-<div class="line"><a name="l03943"></a><span class="lineno"> 3943</span>&#160;    {</div>
-<div class="line"><a name="l03944"></a><span class="lineno"> 3944</span>&#160;        alignment = <span class="keyword">sizeof</span>(<span class="keywordtype">void</span>*);</div>
-<div class="line"><a name="l03945"></a><span class="lineno"> 3945</span>&#160;    }</div>
-<div class="line"><a name="l03946"></a><span class="lineno"> 3946</span>&#160; </div>
-<div class="line"><a name="l03947"></a><span class="lineno"> 3947</span>&#160;    <span class="keywordflow">return</span> memalign(alignment, size);</div>
-<div class="line"><a name="l03948"></a><span class="lineno"> 3948</span>&#160;}</div>
-<div class="line"><a name="l03949"></a><span class="lineno"> 3949</span>&#160;<span class="preprocessor">#elif defined(__APPLE__) || defined(__ANDROID__) || (defined(__linux__) &amp;&amp; defined(__GLIBCXX__) &amp;&amp; !defined(_GLIBCXX_HAVE_ALIGNED_ALLOC))</span></div>
-<div class="line"><a name="l03950"></a><span class="lineno"> 3950</span>&#160;<span class="preprocessor">#include &lt;cstdlib&gt;</span></div>
-<div class="line"><a name="l03951"></a><span class="lineno"> 3951</span>&#160;<span class="keywordtype">void</span> *aligned_alloc(<span class="keywordtype">size_t</span> alignment, <span class="keywordtype">size_t</span> size)</div>
-<div class="line"><a name="l03952"></a><span class="lineno"> 3952</span>&#160;{</div>
-<div class="line"><a name="l03953"></a><span class="lineno"> 3953</span>&#160;    <span class="comment">// alignment must be &gt;= sizeof(void*)</span></div>
-<div class="line"><a name="l03954"></a><span class="lineno"> 3954</span>&#160;    <span class="keywordflow">if</span>(alignment &lt; <span class="keyword">sizeof</span>(<span class="keywordtype">void</span>*))</div>
-<div class="line"><a name="l03955"></a><span class="lineno"> 3955</span>&#160;    {</div>
-<div class="line"><a name="l03956"></a><span class="lineno"> 3956</span>&#160;        alignment = <span class="keyword">sizeof</span>(<span class="keywordtype">void</span>*);</div>
-<div class="line"><a name="l03957"></a><span class="lineno"> 3957</span>&#160;    }</div>
-<div class="line"><a name="l03958"></a><span class="lineno"> 3958</span>&#160; </div>
-<div class="line"><a name="l03959"></a><span class="lineno"> 3959</span>&#160;    <span class="keywordtype">void</span> *pointer;</div>
-<div class="line"><a name="l03960"></a><span class="lineno"> 3960</span>&#160;    <span class="keywordflow">if</span>(posix_memalign(&amp;pointer, alignment, size) == 0)</div>
-<div class="line"><a name="l03961"></a><span class="lineno"> 3961</span>&#160;        <span class="keywordflow">return</span> pointer;</div>
-<div class="line"><a name="l03962"></a><span class="lineno"> 3962</span>&#160;    <span class="keywordflow">return</span> VMA_NULL;</div>
-<div class="line"><a name="l03963"></a><span class="lineno"> 3963</span>&#160;}</div>
-<div class="line"><a name="l03964"></a><span class="lineno"> 3964</span>&#160;<span class="preprocessor">#endif</span></div>
-<div class="line"><a name="l03965"></a><span class="lineno"> 3965</span>&#160; </div>
-<div class="line"><a name="l03966"></a><span class="lineno"> 3966</span>&#160;<span class="comment">// If your compiler is not compatible with C++11 and definition of</span></div>
-<div class="line"><a name="l03967"></a><span class="lineno"> 3967</span>&#160;<span class="comment">// aligned_alloc() function is missing, uncommeting following line may help:</span></div>
-<div class="line"><a name="l03968"></a><span class="lineno"> 3968</span>&#160; </div>
-<div class="line"><a name="l03969"></a><span class="lineno"> 3969</span>&#160;<span class="comment">//#include &lt;malloc.h&gt;</span></div>
-<div class="line"><a name="l03970"></a><span class="lineno"> 3970</span>&#160; </div>
-<div class="line"><a name="l03971"></a><span class="lineno"> 3971</span>&#160;<span class="comment">// Normal assert to check for programmer&#39;s errors, especially in Debug configuration.</span></div>
-<div class="line"><a name="l03972"></a><span class="lineno"> 3972</span>&#160;<span class="preprocessor">#ifndef VMA_ASSERT</span></div>
-<div class="line"><a name="l03973"></a><span class="lineno"> 3973</span>&#160;<span class="preprocessor">   #ifdef NDEBUG</span></div>
-<div class="line"><a name="l03974"></a><span class="lineno"> 3974</span>&#160;<span class="preprocessor">       #define VMA_ASSERT(expr)</span></div>
-<div class="line"><a name="l03975"></a><span class="lineno"> 3975</span>&#160;<span class="preprocessor">   #else</span></div>
-<div class="line"><a name="l03976"></a><span class="lineno"> 3976</span>&#160;<span class="preprocessor">       #define VMA_ASSERT(expr)         assert(expr)</span></div>
-<div class="line"><a name="l03977"></a><span class="lineno"> 3977</span>&#160;<span class="preprocessor">   #endif</span></div>
-<div class="line"><a name="l03978"></a><span class="lineno"> 3978</span>&#160;<span class="preprocessor">#endif</span></div>
-<div class="line"><a name="l03979"></a><span class="lineno"> 3979</span>&#160; </div>
-<div class="line"><a name="l03980"></a><span class="lineno"> 3980</span>&#160;<span class="comment">// Assert that will be called very often, like inside data structures e.g. operator[].</span></div>
-<div class="line"><a name="l03981"></a><span class="lineno"> 3981</span>&#160;<span class="comment">// Making it non-empty can make program slow.</span></div>
-<div class="line"><a name="l03982"></a><span class="lineno"> 3982</span>&#160;<span class="preprocessor">#ifndef VMA_HEAVY_ASSERT</span></div>
-<div class="line"><a name="l03983"></a><span class="lineno"> 3983</span>&#160;<span class="preprocessor">   #ifdef NDEBUG</span></div>
-<div class="line"><a name="l03984"></a><span class="lineno"> 3984</span>&#160;<span class="preprocessor">       #define VMA_HEAVY_ASSERT(expr)</span></div>
-<div class="line"><a name="l03985"></a><span class="lineno"> 3985</span>&#160;<span class="preprocessor">   #else</span></div>
-<div class="line"><a name="l03986"></a><span class="lineno"> 3986</span>&#160;<span class="preprocessor">       #define VMA_HEAVY_ASSERT(expr)   //VMA_ASSERT(expr)</span></div>
-<div class="line"><a name="l03987"></a><span class="lineno"> 3987</span>&#160;<span class="preprocessor">   #endif</span></div>
-<div class="line"><a name="l03988"></a><span class="lineno"> 3988</span>&#160;<span class="preprocessor">#endif</span></div>
-<div class="line"><a name="l03989"></a><span class="lineno"> 3989</span>&#160; </div>
-<div class="line"><a name="l03990"></a><span class="lineno"> 3990</span>&#160;<span class="preprocessor">#ifndef VMA_ALIGN_OF</span></div>
-<div class="line"><a name="l03991"></a><span class="lineno"> 3991</span>&#160;<span class="preprocessor">   #define VMA_ALIGN_OF(type)       (__alignof(type))</span></div>
-<div class="line"><a name="l03992"></a><span class="lineno"> 3992</span>&#160;<span class="preprocessor">#endif</span></div>
-<div class="line"><a name="l03993"></a><span class="lineno"> 3993</span>&#160; </div>
-<div class="line"><a name="l03994"></a><span class="lineno"> 3994</span>&#160;<span class="preprocessor">#ifndef VMA_SYSTEM_ALIGNED_MALLOC</span></div>
-<div class="line"><a name="l03995"></a><span class="lineno"> 3995</span>&#160;<span class="preprocessor">   #if defined(_WIN32)</span></div>
-<div class="line"><a name="l03996"></a><span class="lineno"> 3996</span>&#160;<span class="preprocessor">       #define VMA_SYSTEM_ALIGNED_MALLOC(size, alignment)   (_aligned_malloc((size), (alignment)))</span></div>
-<div class="line"><a name="l03997"></a><span class="lineno"> 3997</span>&#160;<span class="preprocessor">   #else</span></div>
-<div class="line"><a name="l03998"></a><span class="lineno"> 3998</span>&#160;<span class="preprocessor">       #define VMA_SYSTEM_ALIGNED_MALLOC(size, alignment)   (aligned_alloc((alignment), (size) ))</span></div>
-<div class="line"><a name="l03999"></a><span class="lineno"> 3999</span>&#160;<span class="preprocessor">   #endif</span></div>
-<div class="line"><a name="l04000"></a><span class="lineno"> 4000</span>&#160;<span class="preprocessor">#endif</span></div>
-<div class="line"><a name="l04001"></a><span class="lineno"> 4001</span>&#160; </div>
-<div class="line"><a name="l04002"></a><span class="lineno"> 4002</span>&#160;<span class="preprocessor">#ifndef VMA_SYSTEM_FREE</span></div>
-<div class="line"><a name="l04003"></a><span class="lineno"> 4003</span>&#160;<span class="preprocessor">   #if defined(_WIN32)</span></div>
-<div class="line"><a name="l04004"></a><span class="lineno"> 4004</span>&#160;<span class="preprocessor">       #define VMA_SYSTEM_FREE(ptr)   _aligned_free(ptr)</span></div>
-<div class="line"><a name="l04005"></a><span class="lineno"> 4005</span>&#160;<span class="preprocessor">   #else</span></div>
-<div class="line"><a name="l04006"></a><span class="lineno"> 4006</span>&#160;<span class="preprocessor">       #define VMA_SYSTEM_FREE(ptr)   free(ptr)</span></div>
-<div class="line"><a name="l04007"></a><span class="lineno"> 4007</span>&#160;<span class="preprocessor">   #endif</span></div>
-<div class="line"><a name="l04008"></a><span class="lineno"> 4008</span>&#160;<span class="preprocessor">#endif</span></div>
-<div class="line"><a name="l04009"></a><span class="lineno"> 4009</span>&#160; </div>
-<div class="line"><a name="l04010"></a><span class="lineno"> 4010</span>&#160;<span class="preprocessor">#ifndef VMA_MIN</span></div>
-<div class="line"><a name="l04011"></a><span class="lineno"> 4011</span>&#160;<span class="preprocessor">   #define VMA_MIN(v1, v2)    (std::min((v1), (v2)))</span></div>
-<div class="line"><a name="l04012"></a><span class="lineno"> 4012</span>&#160;<span class="preprocessor">#endif</span></div>
-<div class="line"><a name="l04013"></a><span class="lineno"> 4013</span>&#160; </div>
-<div class="line"><a name="l04014"></a><span class="lineno"> 4014</span>&#160;<span class="preprocessor">#ifndef VMA_MAX</span></div>
-<div class="line"><a name="l04015"></a><span class="lineno"> 4015</span>&#160;<span class="preprocessor">   #define VMA_MAX(v1, v2)    (std::max((v1), (v2)))</span></div>
-<div class="line"><a name="l04016"></a><span class="lineno"> 4016</span>&#160;<span class="preprocessor">#endif</span></div>
-<div class="line"><a name="l04017"></a><span class="lineno"> 4017</span>&#160; </div>
-<div class="line"><a name="l04018"></a><span class="lineno"> 4018</span>&#160;<span class="preprocessor">#ifndef VMA_SWAP</span></div>
-<div class="line"><a name="l04019"></a><span class="lineno"> 4019</span>&#160;<span class="preprocessor">   #define VMA_SWAP(v1, v2)   std::swap((v1), (v2))</span></div>
+<div class="line"><a name="l03786"></a><span class="lineno"> 3786</span>&#160;    <a class="code" href="struct_vma_defragmentation_context.html">VmaDefragmentationContext</a> VMA_NULLABLE context);</div>
+<div class="line"><a name="l03787"></a><span class="lineno"> 3787</span>&#160; </div>
+<div class="line"><a name="l03788"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#ac0f01545b6262f7d4d128fc8f8e5c77b"> 3788</a></span>&#160;VMA_CALL_PRE VkResult VMA_CALL_POST <a class="code" href="vk__mem__alloc_8h.html#ac0f01545b6262f7d4d128fc8f8e5c77b">vmaBeginDefragmentationPass</a>(</div>
+<div class="line"><a name="l03789"></a><span class="lineno"> 3789</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> VMA_NOT_NULL allocator,</div>
+<div class="line"><a name="l03790"></a><span class="lineno"> 3790</span>&#160;    <a class="code" href="struct_vma_defragmentation_context.html">VmaDefragmentationContext</a> VMA_NULLABLE context,</div>
+<div class="line"><a name="l03791"></a><span class="lineno"> 3791</span>&#160;    <a class="code" href="struct_vma_defragmentation_pass_info.html">VmaDefragmentationPassInfo</a>* VMA_NOT_NULL pInfo</div>
+<div class="line"><a name="l03792"></a><span class="lineno"> 3792</span>&#160;);</div>
+<div class="line"><a name="l03793"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#a1b9ffa538bed905af55c747cc48963bd"> 3793</a></span>&#160;VMA_CALL_PRE VkResult VMA_CALL_POST <a class="code" href="vk__mem__alloc_8h.html#a1b9ffa538bed905af55c747cc48963bd">vmaEndDefragmentationPass</a>(</div>
+<div class="line"><a name="l03794"></a><span class="lineno"> 3794</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> VMA_NOT_NULL allocator,</div>
+<div class="line"><a name="l03795"></a><span class="lineno"> 3795</span>&#160;    <a class="code" href="struct_vma_defragmentation_context.html">VmaDefragmentationContext</a> VMA_NULLABLE context</div>
+<div class="line"><a name="l03796"></a><span class="lineno"> 3796</span>&#160;);</div>
+<div class="line"><a name="l03797"></a><span class="lineno"> 3797</span>&#160; </div>
+<div class="line"><a name="l03838"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#a9f0f8f56db5f7f57fe4454f465142dac"> 3838</a></span>&#160;VMA_CALL_PRE VkResult VMA_CALL_POST <a class="code" href="vk__mem__alloc_8h.html#a9f0f8f56db5f7f57fe4454f465142dac">vmaDefragment</a>(</div>
+<div class="line"><a name="l03839"></a><span class="lineno"> 3839</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> VMA_NOT_NULL allocator,</div>
+<div class="line"><a name="l03840"></a><span class="lineno"> 3840</span>&#160;    <span class="keyword">const</span> <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> VMA_NOT_NULL * VMA_NOT_NULL VMA_LEN_IF_NOT_NULL(allocationCount) pAllocations,</div>
+<div class="line"><a name="l03841"></a><span class="lineno"> 3841</span>&#160;    <span class="keywordtype">size_t</span> allocationCount,</div>
+<div class="line"><a name="l03842"></a><span class="lineno"> 3842</span>&#160;    VkBool32* VMA_NULLABLE VMA_LEN_IF_NOT_NULL(allocationCount) pAllocationsChanged,</div>
+<div class="line"><a name="l03843"></a><span class="lineno"> 3843</span>&#160;    <span class="keyword">const</span> <a class="code" href="struct_vma_defragmentation_info.html">VmaDefragmentationInfo</a>* VMA_NULLABLE pDefragmentationInfo,</div>
+<div class="line"><a name="l03844"></a><span class="lineno"> 3844</span>&#160;    <a class="code" href="struct_vma_defragmentation_stats.html">VmaDefragmentationStats</a>* VMA_NULLABLE pDefragmentationStats);</div>
+<div class="line"><a name="l03845"></a><span class="lineno"> 3845</span>&#160; </div>
+<div class="line"><a name="l03858"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#a6b0929b914b60cf2d45cac4bf3547470"> 3858</a></span>&#160;VMA_CALL_PRE VkResult VMA_CALL_POST <a class="code" href="vk__mem__alloc_8h.html#a6b0929b914b60cf2d45cac4bf3547470">vmaBindBufferMemory</a>(</div>
+<div class="line"><a name="l03859"></a><span class="lineno"> 3859</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> VMA_NOT_NULL allocator,</div>
+<div class="line"><a name="l03860"></a><span class="lineno"> 3860</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> VMA_NOT_NULL allocation,</div>
+<div class="line"><a name="l03861"></a><span class="lineno"> 3861</span>&#160;    VkBuffer VMA_NOT_NULL_NON_DISPATCHABLE buffer);</div>
+<div class="line"><a name="l03862"></a><span class="lineno"> 3862</span>&#160; </div>
+<div class="line"><a name="l03873"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#a927c944f45e0f2941182abb6f608e64a"> 3873</a></span>&#160;VMA_CALL_PRE VkResult VMA_CALL_POST <a class="code" href="vk__mem__alloc_8h.html#a927c944f45e0f2941182abb6f608e64a">vmaBindBufferMemory2</a>(</div>
+<div class="line"><a name="l03874"></a><span class="lineno"> 3874</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> VMA_NOT_NULL allocator,</div>
+<div class="line"><a name="l03875"></a><span class="lineno"> 3875</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> VMA_NOT_NULL allocation,</div>
+<div class="line"><a name="l03876"></a><span class="lineno"> 3876</span>&#160;    VkDeviceSize allocationLocalOffset,</div>
+<div class="line"><a name="l03877"></a><span class="lineno"> 3877</span>&#160;    VkBuffer VMA_NOT_NULL_NON_DISPATCHABLE buffer,</div>
+<div class="line"><a name="l03878"></a><span class="lineno"> 3878</span>&#160;    <span class="keyword">const</span> <span class="keywordtype">void</span>* VMA_NULLABLE pNext);</div>
+<div class="line"><a name="l03879"></a><span class="lineno"> 3879</span>&#160; </div>
+<div class="line"><a name="l03892"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#a3d3ca45799923aa5d138e9e5f9eb2da5"> 3892</a></span>&#160;VMA_CALL_PRE VkResult VMA_CALL_POST <a class="code" href="vk__mem__alloc_8h.html#a3d3ca45799923aa5d138e9e5f9eb2da5">vmaBindImageMemory</a>(</div>
+<div class="line"><a name="l03893"></a><span class="lineno"> 3893</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> VMA_NOT_NULL allocator,</div>
+<div class="line"><a name="l03894"></a><span class="lineno"> 3894</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> VMA_NOT_NULL allocation,</div>
+<div class="line"><a name="l03895"></a><span class="lineno"> 3895</span>&#160;    VkImage VMA_NOT_NULL_NON_DISPATCHABLE image);</div>
+<div class="line"><a name="l03896"></a><span class="lineno"> 3896</span>&#160; </div>
+<div class="line"><a name="l03907"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#aa8251ee81b0045a443e35b8e8aa021bc"> 3907</a></span>&#160;VMA_CALL_PRE VkResult VMA_CALL_POST <a class="code" href="vk__mem__alloc_8h.html#aa8251ee81b0045a443e35b8e8aa021bc">vmaBindImageMemory2</a>(</div>
+<div class="line"><a name="l03908"></a><span class="lineno"> 3908</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> VMA_NOT_NULL allocator,</div>
+<div class="line"><a name="l03909"></a><span class="lineno"> 3909</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> VMA_NOT_NULL allocation,</div>
+<div class="line"><a name="l03910"></a><span class="lineno"> 3910</span>&#160;    VkDeviceSize allocationLocalOffset,</div>
+<div class="line"><a name="l03911"></a><span class="lineno"> 3911</span>&#160;    VkImage VMA_NOT_NULL_NON_DISPATCHABLE image,</div>
+<div class="line"><a name="l03912"></a><span class="lineno"> 3912</span>&#160;    <span class="keyword">const</span> <span class="keywordtype">void</span>* VMA_NULLABLE pNext);</div>
+<div class="line"><a name="l03913"></a><span class="lineno"> 3913</span>&#160; </div>
+<div class="line"><a name="l03944"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#ac72ee55598617e8eecca384e746bab51"> 3944</a></span>&#160;VMA_CALL_PRE VkResult VMA_CALL_POST <a class="code" href="vk__mem__alloc_8h.html#ac72ee55598617e8eecca384e746bab51">vmaCreateBuffer</a>(</div>
+<div class="line"><a name="l03945"></a><span class="lineno"> 3945</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> VMA_NOT_NULL allocator,</div>
+<div class="line"><a name="l03946"></a><span class="lineno"> 3946</span>&#160;    <span class="keyword">const</span> VkBufferCreateInfo* VMA_NOT_NULL pBufferCreateInfo,</div>
+<div class="line"><a name="l03947"></a><span class="lineno"> 3947</span>&#160;    <span class="keyword">const</span> <a class="code" href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a>* VMA_NOT_NULL pAllocationCreateInfo,</div>
+<div class="line"><a name="l03948"></a><span class="lineno"> 3948</span>&#160;    VkBuffer VMA_NULLABLE_NON_DISPATCHABLE * VMA_NOT_NULL pBuffer,</div>
+<div class="line"><a name="l03949"></a><span class="lineno"> 3949</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> VMA_NULLABLE * VMA_NOT_NULL pAllocation,</div>
+<div class="line"><a name="l03950"></a><span class="lineno"> 3950</span>&#160;    <a class="code" href="struct_vma_allocation_info.html">VmaAllocationInfo</a>* VMA_NULLABLE pAllocationInfo);</div>
+<div class="line"><a name="l03951"></a><span class="lineno"> 3951</span>&#160; </div>
+<div class="line"><a name="l03963"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#a0d9f4e4ba5bf9aab1f1c746387753d77"> 3963</a></span>&#160;VMA_CALL_PRE <span class="keywordtype">void</span> VMA_CALL_POST <a class="code" href="vk__mem__alloc_8h.html#a0d9f4e4ba5bf9aab1f1c746387753d77">vmaDestroyBuffer</a>(</div>
+<div class="line"><a name="l03964"></a><span class="lineno"> 3964</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> VMA_NOT_NULL allocator,</div>
+<div class="line"><a name="l03965"></a><span class="lineno"> 3965</span>&#160;    VkBuffer VMA_NULLABLE_NON_DISPATCHABLE buffer,</div>
+<div class="line"><a name="l03966"></a><span class="lineno"> 3966</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> VMA_NULLABLE allocation);</div>
+<div class="line"><a name="l03967"></a><span class="lineno"> 3967</span>&#160; </div>
+<div class="line"><a name="l03969"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#a02a94f25679275851a53e82eacbcfc73"> 3969</a></span>&#160;VMA_CALL_PRE VkResult VMA_CALL_POST <a class="code" href="vk__mem__alloc_8h.html#a02a94f25679275851a53e82eacbcfc73">vmaCreateImage</a>(</div>
+<div class="line"><a name="l03970"></a><span class="lineno"> 3970</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> VMA_NOT_NULL allocator,</div>
+<div class="line"><a name="l03971"></a><span class="lineno"> 3971</span>&#160;    <span class="keyword">const</span> VkImageCreateInfo* VMA_NOT_NULL pImageCreateInfo,</div>
+<div class="line"><a name="l03972"></a><span class="lineno"> 3972</span>&#160;    <span class="keyword">const</span> <a class="code" href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a>* VMA_NOT_NULL pAllocationCreateInfo,</div>
+<div class="line"><a name="l03973"></a><span class="lineno"> 3973</span>&#160;    VkImage VMA_NULLABLE_NON_DISPATCHABLE * VMA_NOT_NULL pImage,</div>
+<div class="line"><a name="l03974"></a><span class="lineno"> 3974</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> VMA_NULLABLE * VMA_NOT_NULL pAllocation,</div>
+<div class="line"><a name="l03975"></a><span class="lineno"> 3975</span>&#160;    <a class="code" href="struct_vma_allocation_info.html">VmaAllocationInfo</a>* VMA_NULLABLE pAllocationInfo);</div>
+<div class="line"><a name="l03976"></a><span class="lineno"> 3976</span>&#160; </div>
+<div class="line"><a name="l03988"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#ae50d2cb3b4a3bfd4dd40987234e50e7e"> 3988</a></span>&#160;VMA_CALL_PRE <span class="keywordtype">void</span> VMA_CALL_POST <a class="code" href="vk__mem__alloc_8h.html#ae50d2cb3b4a3bfd4dd40987234e50e7e">vmaDestroyImage</a>(</div>
+<div class="line"><a name="l03989"></a><span class="lineno"> 3989</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> VMA_NOT_NULL allocator,</div>
+<div class="line"><a name="l03990"></a><span class="lineno"> 3990</span>&#160;    VkImage VMA_NULLABLE_NON_DISPATCHABLE image,</div>
+<div class="line"><a name="l03991"></a><span class="lineno"> 3991</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> VMA_NULLABLE allocation);</div>
+<div class="line"><a name="l03992"></a><span class="lineno"> 3992</span>&#160; </div>
+<div class="line"><a name="l03993"></a><span class="lineno"> 3993</span>&#160;<span class="preprocessor">#ifdef __cplusplus</span></div>
+<div class="line"><a name="l03994"></a><span class="lineno"> 3994</span>&#160;}</div>
+<div class="line"><a name="l03995"></a><span class="lineno"> 3995</span>&#160;<span class="preprocessor">#endif</span></div>
+<div class="line"><a name="l03996"></a><span class="lineno"> 3996</span>&#160; </div>
+<div class="line"><a name="l03997"></a><span class="lineno"> 3997</span>&#160;<span class="preprocessor">#endif </span><span class="comment">// AMD_VULKAN_MEMORY_ALLOCATOR_H</span></div>
+<div class="line"><a name="l03998"></a><span class="lineno"> 3998</span>&#160; </div>
+<div class="line"><a name="l03999"></a><span class="lineno"> 3999</span>&#160;<span class="comment">// For Visual Studio IntelliSense.</span></div>
+<div class="line"><a name="l04000"></a><span class="lineno"> 4000</span>&#160;<span class="preprocessor">#if defined(__cplusplus) &amp;&amp; defined(__INTELLISENSE__)</span></div>
+<div class="line"><a name="l04001"></a><span class="lineno"> 4001</span>&#160;<span class="preprocessor">#define VMA_IMPLEMENTATION</span></div>
+<div class="line"><a name="l04002"></a><span class="lineno"> 4002</span>&#160;<span class="preprocessor">#endif</span></div>
+<div class="line"><a name="l04003"></a><span class="lineno"> 4003</span>&#160; </div>
+<div class="line"><a name="l04004"></a><span class="lineno"> 4004</span>&#160;<span class="preprocessor">#ifdef VMA_IMPLEMENTATION</span></div>
+<div class="line"><a name="l04005"></a><span class="lineno"> 4005</span>&#160;<span class="preprocessor">#undef VMA_IMPLEMENTATION</span></div>
+<div class="line"><a name="l04006"></a><span class="lineno"> 4006</span>&#160; </div>
+<div class="line"><a name="l04007"></a><span class="lineno"> 4007</span>&#160;<span class="preprocessor">#include &lt;cstdint&gt;</span></div>
+<div class="line"><a name="l04008"></a><span class="lineno"> 4008</span>&#160;<span class="preprocessor">#include &lt;cstdlib&gt;</span></div>
+<div class="line"><a name="l04009"></a><span class="lineno"> 4009</span>&#160;<span class="preprocessor">#include &lt;cstring&gt;</span></div>
+<div class="line"><a name="l04010"></a><span class="lineno"> 4010</span>&#160;<span class="preprocessor">#include &lt;utility&gt;</span></div>
+<div class="line"><a name="l04011"></a><span class="lineno"> 4011</span>&#160; </div>
+<div class="line"><a name="l04012"></a><span class="lineno"> 4012</span>&#160;<span class="preprocessor">#if VMA_RECORDING_ENABLED</span></div>
+<div class="line"><a name="l04013"></a><span class="lineno"> 4013</span>&#160;<span class="preprocessor">    #include &lt;chrono&gt;</span></div>
+<div class="line"><a name="l04014"></a><span class="lineno"> 4014</span>&#160;<span class="preprocessor">    #if defined(_WIN32)</span></div>
+<div class="line"><a name="l04015"></a><span class="lineno"> 4015</span>&#160;<span class="preprocessor">        #include &lt;windows.h&gt;</span></div>
+<div class="line"><a name="l04016"></a><span class="lineno"> 4016</span>&#160;<span class="preprocessor">    #else</span></div>
+<div class="line"><a name="l04017"></a><span class="lineno"> 4017</span>&#160;<span class="preprocessor">        #include &lt;sstream&gt;</span></div>
+<div class="line"><a name="l04018"></a><span class="lineno"> 4018</span>&#160;<span class="preprocessor">        #include &lt;thread&gt;</span></div>
+<div class="line"><a name="l04019"></a><span class="lineno"> 4019</span>&#160;<span class="preprocessor">    #endif</span></div>
 <div class="line"><a name="l04020"></a><span class="lineno"> 4020</span>&#160;<span class="preprocessor">#endif</span></div>
 <div class="line"><a name="l04021"></a><span class="lineno"> 4021</span>&#160; </div>
-<div class="line"><a name="l04022"></a><span class="lineno"> 4022</span>&#160;<span class="preprocessor">#ifndef VMA_SORT</span></div>
-<div class="line"><a name="l04023"></a><span class="lineno"> 4023</span>&#160;<span class="preprocessor">   #define VMA_SORT(beg, end, cmp)  std::sort(beg, end, cmp)</span></div>
-<div class="line"><a name="l04024"></a><span class="lineno"> 4024</span>&#160;<span class="preprocessor">#endif</span></div>
-<div class="line"><a name="l04025"></a><span class="lineno"> 4025</span>&#160; </div>
-<div class="line"><a name="l04026"></a><span class="lineno"> 4026</span>&#160;<span class="preprocessor">#ifndef VMA_DEBUG_LOG</span></div>
-<div class="line"><a name="l04027"></a><span class="lineno"> 4027</span>&#160;<span class="preprocessor">   #define VMA_DEBUG_LOG(format, ...)</span></div>
-<div class="line"><a name="l04028"></a><span class="lineno"> 4028</span>&#160;   <span class="comment">/*</span></div>
-<div class="line"><a name="l04029"></a><span class="lineno"> 4029</span>&#160;<span class="comment">   #define VMA_DEBUG_LOG(format, ...) do { \</span></div>
-<div class="line"><a name="l04030"></a><span class="lineno"> 4030</span>&#160;<span class="comment">       printf(format, __VA_ARGS__); \</span></div>
-<div class="line"><a name="l04031"></a><span class="lineno"> 4031</span>&#160;<span class="comment">       printf(&quot;\n&quot;); \</span></div>
-<div class="line"><a name="l04032"></a><span class="lineno"> 4032</span>&#160;<span class="comment">   } while(false)</span></div>
-<div class="line"><a name="l04033"></a><span class="lineno"> 4033</span>&#160;<span class="comment">   */</span></div>
-<div class="line"><a name="l04034"></a><span class="lineno"> 4034</span>&#160;<span class="preprocessor">#endif</span></div>
-<div class="line"><a name="l04035"></a><span class="lineno"> 4035</span>&#160; </div>
-<div class="line"><a name="l04036"></a><span class="lineno"> 4036</span>&#160;<span class="comment">// Define this macro to 1 to enable functions: vmaBuildStatsString, vmaFreeStatsString.</span></div>
-<div class="line"><a name="l04037"></a><span class="lineno"> 4037</span>&#160;<span class="preprocessor">#if VMA_STATS_STRING_ENABLED</span></div>
-<div class="line"><a name="l04038"></a><span class="lineno"> 4038</span>&#160;    <span class="keyword">static</span> <span class="keyword">inline</span> <span class="keywordtype">void</span> VmaUint32ToStr(<span class="keywordtype">char</span>* outStr, <span class="keywordtype">size_t</span> strLen, uint32_t num)</div>
-<div class="line"><a name="l04039"></a><span class="lineno"> 4039</span>&#160;    {</div>
-<div class="line"><a name="l04040"></a><span class="lineno"> 4040</span>&#160;        snprintf(outStr, strLen, <span class="stringliteral">&quot;%u&quot;</span>, <span class="keyword">static_cast&lt;</span><span class="keywordtype">unsigned</span> <span class="keywordtype">int</span><span class="keyword">&gt;</span>(num));</div>
-<div class="line"><a name="l04041"></a><span class="lineno"> 4041</span>&#160;    }</div>
-<div class="line"><a name="l04042"></a><span class="lineno"> 4042</span>&#160;    <span class="keyword">static</span> <span class="keyword">inline</span> <span class="keywordtype">void</span> VmaUint64ToStr(<span class="keywordtype">char</span>* outStr, <span class="keywordtype">size_t</span> strLen, uint64_t num)</div>
-<div class="line"><a name="l04043"></a><span class="lineno"> 4043</span>&#160;    {</div>
-<div class="line"><a name="l04044"></a><span class="lineno"> 4044</span>&#160;        snprintf(outStr, strLen, <span class="stringliteral">&quot;%llu&quot;</span>, <span class="keyword">static_cast&lt;</span><span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> <span class="keywordtype">long</span><span class="keyword">&gt;</span>(num));</div>
-<div class="line"><a name="l04045"></a><span class="lineno"> 4045</span>&#160;    }</div>
-<div class="line"><a name="l04046"></a><span class="lineno"> 4046</span>&#160;    <span class="keyword">static</span> <span class="keyword">inline</span> <span class="keywordtype">void</span> VmaPtrToStr(<span class="keywordtype">char</span>* outStr, <span class="keywordtype">size_t</span> strLen, <span class="keyword">const</span> <span class="keywordtype">void</span>* ptr)</div>
-<div class="line"><a name="l04047"></a><span class="lineno"> 4047</span>&#160;    {</div>
-<div class="line"><a name="l04048"></a><span class="lineno"> 4048</span>&#160;        snprintf(outStr, strLen, <span class="stringliteral">&quot;%p&quot;</span>, ptr);</div>
-<div class="line"><a name="l04049"></a><span class="lineno"> 4049</span>&#160;    }</div>
-<div class="line"><a name="l04050"></a><span class="lineno"> 4050</span>&#160;<span class="preprocessor">#endif</span></div>
-<div class="line"><a name="l04051"></a><span class="lineno"> 4051</span>&#160; </div>
-<div class="line"><a name="l04052"></a><span class="lineno"> 4052</span>&#160;<span class="preprocessor">#ifndef VMA_MUTEX</span></div>
-<div class="line"><a name="l04053"></a><span class="lineno"> 4053</span>&#160;    <span class="keyword">class </span>VmaMutex</div>
-<div class="line"><a name="l04054"></a><span class="lineno"> 4054</span>&#160;    {</div>
-<div class="line"><a name="l04055"></a><span class="lineno"> 4055</span>&#160;    <span class="keyword">public</span>:</div>
-<div class="line"><a name="l04056"></a><span class="lineno"> 4056</span>&#160;        <span class="keywordtype">void</span> Lock() { m_Mutex.lock(); }</div>
-<div class="line"><a name="l04057"></a><span class="lineno"> 4057</span>&#160;        <span class="keywordtype">void</span> Unlock() { m_Mutex.unlock(); }</div>
-<div class="line"><a name="l04058"></a><span class="lineno"> 4058</span>&#160;        <span class="keywordtype">bool</span> TryLock() { <span class="keywordflow">return</span> m_Mutex.try_lock(); }</div>
-<div class="line"><a name="l04059"></a><span class="lineno"> 4059</span>&#160;    <span class="keyword">private</span>:</div>
-<div class="line"><a name="l04060"></a><span class="lineno"> 4060</span>&#160;        std::mutex m_Mutex;</div>
-<div class="line"><a name="l04061"></a><span class="lineno"> 4061</span>&#160;    };</div>
-<div class="line"><a name="l04062"></a><span class="lineno"> 4062</span>&#160;<span class="preprocessor">    #define VMA_MUTEX VmaMutex</span></div>
-<div class="line"><a name="l04063"></a><span class="lineno"> 4063</span>&#160;<span class="preprocessor">#endif</span></div>
-<div class="line"><a name="l04064"></a><span class="lineno"> 4064</span>&#160; </div>
-<div class="line"><a name="l04065"></a><span class="lineno"> 4065</span>&#160;<span class="comment">// Read-write mutex, where &quot;read&quot; is shared access, &quot;write&quot; is exclusive access.</span></div>
-<div class="line"><a name="l04066"></a><span class="lineno"> 4066</span>&#160;<span class="preprocessor">#ifndef VMA_RW_MUTEX</span></div>
-<div class="line"><a name="l04067"></a><span class="lineno"> 4067</span>&#160;<span class="preprocessor">    #if VMA_USE_STL_SHARED_MUTEX</span></div>
-<div class="line"><a name="l04068"></a><span class="lineno"> 4068</span>&#160;        <span class="comment">// Use std::shared_mutex from C++17.</span></div>
-<div class="line"><a name="l04069"></a><span class="lineno"> 4069</span>&#160;<span class="preprocessor">        #include &lt;shared_mutex&gt;</span></div>
-<div class="line"><a name="l04070"></a><span class="lineno"> 4070</span>&#160;        <span class="keyword">class </span>VmaRWMutex</div>
-<div class="line"><a name="l04071"></a><span class="lineno"> 4071</span>&#160;        {</div>
-<div class="line"><a name="l04072"></a><span class="lineno"> 4072</span>&#160;        <span class="keyword">public</span>:</div>
-<div class="line"><a name="l04073"></a><span class="lineno"> 4073</span>&#160;            <span class="keywordtype">void</span> LockRead() { m_Mutex.lock_shared(); }</div>
-<div class="line"><a name="l04074"></a><span class="lineno"> 4074</span>&#160;            <span class="keywordtype">void</span> UnlockRead() { m_Mutex.unlock_shared(); }</div>
-<div class="line"><a name="l04075"></a><span class="lineno"> 4075</span>&#160;            <span class="keywordtype">bool</span> TryLockRead() { <span class="keywordflow">return</span> m_Mutex.try_lock_shared(); }</div>
-<div class="line"><a name="l04076"></a><span class="lineno"> 4076</span>&#160;            <span class="keywordtype">void</span> LockWrite() { m_Mutex.lock(); }</div>
-<div class="line"><a name="l04077"></a><span class="lineno"> 4077</span>&#160;            <span class="keywordtype">void</span> UnlockWrite() { m_Mutex.unlock(); }</div>
-<div class="line"><a name="l04078"></a><span class="lineno"> 4078</span>&#160;            <span class="keywordtype">bool</span> TryLockWrite() { <span class="keywordflow">return</span> m_Mutex.try_lock(); }</div>
-<div class="line"><a name="l04079"></a><span class="lineno"> 4079</span>&#160;        <span class="keyword">private</span>:</div>
-<div class="line"><a name="l04080"></a><span class="lineno"> 4080</span>&#160;            std::shared_mutex m_Mutex;</div>
-<div class="line"><a name="l04081"></a><span class="lineno"> 4081</span>&#160;        };</div>
-<div class="line"><a name="l04082"></a><span class="lineno"> 4082</span>&#160;<span class="preprocessor">        #define VMA_RW_MUTEX VmaRWMutex</span></div>
-<div class="line"><a name="l04083"></a><span class="lineno"> 4083</span>&#160;<span class="preprocessor">    #elif defined(_WIN32) &amp;&amp; defined(WINVER) &amp;&amp; WINVER &gt;= 0x0600</span></div>
-<div class="line"><a name="l04084"></a><span class="lineno"> 4084</span>&#160;        <span class="comment">// Use SRWLOCK from WinAPI.</span></div>
-<div class="line"><a name="l04085"></a><span class="lineno"> 4085</span>&#160;        <span class="comment">// Minimum supported client = Windows Vista, server = Windows Server 2008.</span></div>
-<div class="line"><a name="l04086"></a><span class="lineno"> 4086</span>&#160;        <span class="keyword">class </span>VmaRWMutex</div>
-<div class="line"><a name="l04087"></a><span class="lineno"> 4087</span>&#160;        {</div>
-<div class="line"><a name="l04088"></a><span class="lineno"> 4088</span>&#160;        <span class="keyword">public</span>:</div>
-<div class="line"><a name="l04089"></a><span class="lineno"> 4089</span>&#160;            VmaRWMutex() { InitializeSRWLock(&amp;m_Lock); }</div>
-<div class="line"><a name="l04090"></a><span class="lineno"> 4090</span>&#160;            <span class="keywordtype">void</span> LockRead() { AcquireSRWLockShared(&amp;m_Lock); }</div>
-<div class="line"><a name="l04091"></a><span class="lineno"> 4091</span>&#160;            <span class="keywordtype">void</span> UnlockRead() { ReleaseSRWLockShared(&amp;m_Lock); }</div>
-<div class="line"><a name="l04092"></a><span class="lineno"> 4092</span>&#160;            <span class="keywordtype">bool</span> TryLockRead() { <span class="keywordflow">return</span> TryAcquireSRWLockShared(&amp;m_Lock) != FALSE; }</div>
-<div class="line"><a name="l04093"></a><span class="lineno"> 4093</span>&#160;            <span class="keywordtype">void</span> LockWrite() { AcquireSRWLockExclusive(&amp;m_Lock); }</div>
-<div class="line"><a name="l04094"></a><span class="lineno"> 4094</span>&#160;            <span class="keywordtype">void</span> UnlockWrite() { ReleaseSRWLockExclusive(&amp;m_Lock); }</div>
-<div class="line"><a name="l04095"></a><span class="lineno"> 4095</span>&#160;            <span class="keywordtype">bool</span> TryLockWrite() { <span class="keywordflow">return</span> TryAcquireSRWLockExclusive(&amp;m_Lock) != FALSE; }</div>
-<div class="line"><a name="l04096"></a><span class="lineno"> 4096</span>&#160;        <span class="keyword">private</span>:</div>
-<div class="line"><a name="l04097"></a><span class="lineno"> 4097</span>&#160;            SRWLOCK m_Lock;</div>
-<div class="line"><a name="l04098"></a><span class="lineno"> 4098</span>&#160;        };</div>
-<div class="line"><a name="l04099"></a><span class="lineno"> 4099</span>&#160;<span class="preprocessor">        #define VMA_RW_MUTEX VmaRWMutex</span></div>
-<div class="line"><a name="l04100"></a><span class="lineno"> 4100</span>&#160;<span class="preprocessor">    #else</span></div>
-<div class="line"><a name="l04101"></a><span class="lineno"> 4101</span>&#160;        <span class="comment">// Less efficient fallback: Use normal mutex.</span></div>
-<div class="line"><a name="l04102"></a><span class="lineno"> 4102</span>&#160;        <span class="keyword">class </span>VmaRWMutex</div>
-<div class="line"><a name="l04103"></a><span class="lineno"> 4103</span>&#160;        {</div>
-<div class="line"><a name="l04104"></a><span class="lineno"> 4104</span>&#160;        <span class="keyword">public</span>:</div>
-<div class="line"><a name="l04105"></a><span class="lineno"> 4105</span>&#160;            <span class="keywordtype">void</span> LockRead() { m_Mutex.Lock(); }</div>
-<div class="line"><a name="l04106"></a><span class="lineno"> 4106</span>&#160;            <span class="keywordtype">void</span> UnlockRead() { m_Mutex.Unlock(); }</div>
-<div class="line"><a name="l04107"></a><span class="lineno"> 4107</span>&#160;            <span class="keywordtype">bool</span> TryLockRead() { <span class="keywordflow">return</span> m_Mutex.TryLock(); }</div>
-<div class="line"><a name="l04108"></a><span class="lineno"> 4108</span>&#160;            <span class="keywordtype">void</span> LockWrite() { m_Mutex.Lock(); }</div>
-<div class="line"><a name="l04109"></a><span class="lineno"> 4109</span>&#160;            <span class="keywordtype">void</span> UnlockWrite() { m_Mutex.Unlock(); }</div>
-<div class="line"><a name="l04110"></a><span class="lineno"> 4110</span>&#160;            <span class="keywordtype">bool</span> TryLockWrite() { <span class="keywordflow">return</span> m_Mutex.TryLock(); }</div>
-<div class="line"><a name="l04111"></a><span class="lineno"> 4111</span>&#160;        <span class="keyword">private</span>:</div>
-<div class="line"><a name="l04112"></a><span class="lineno"> 4112</span>&#160;            VMA_MUTEX m_Mutex;</div>
-<div class="line"><a name="l04113"></a><span class="lineno"> 4113</span>&#160;        };</div>
-<div class="line"><a name="l04114"></a><span class="lineno"> 4114</span>&#160;<span class="preprocessor">        #define VMA_RW_MUTEX VmaRWMutex</span></div>
-<div class="line"><a name="l04115"></a><span class="lineno"> 4115</span>&#160;<span class="preprocessor">    #endif // #if VMA_USE_STL_SHARED_MUTEX</span></div>
-<div class="line"><a name="l04116"></a><span class="lineno"> 4116</span>&#160;<span class="preprocessor">#endif // #ifndef VMA_RW_MUTEX</span></div>
-<div class="line"><a name="l04117"></a><span class="lineno"> 4117</span>&#160; </div>
-<div class="line"><a name="l04118"></a><span class="lineno"> 4118</span>&#160;<span class="comment">/*</span></div>
-<div class="line"><a name="l04119"></a><span class="lineno"> 4119</span>&#160;<span class="comment">If providing your own implementation, you need to implement a subset of std::atomic.</span></div>
-<div class="line"><a name="l04120"></a><span class="lineno"> 4120</span>&#160;<span class="comment">*/</span></div>
-<div class="line"><a name="l04121"></a><span class="lineno"> 4121</span>&#160;<span class="preprocessor">#ifndef VMA_ATOMIC_UINT32</span></div>
-<div class="line"><a name="l04122"></a><span class="lineno"> 4122</span>&#160;<span class="preprocessor">    #include &lt;atomic&gt;</span></div>
-<div class="line"><a name="l04123"></a><span class="lineno"> 4123</span>&#160;<span class="preprocessor">    #define VMA_ATOMIC_UINT32 std::atomic&lt;uint32_t&gt;</span></div>
-<div class="line"><a name="l04124"></a><span class="lineno"> 4124</span>&#160;<span class="preprocessor">#endif</span></div>
+<div class="line"><a name="l04022"></a><span class="lineno"> 4022</span>&#160;<span class="comment">/*******************************************************************************</span></div>
+<div class="line"><a name="l04023"></a><span class="lineno"> 4023</span>&#160;<span class="comment">CONFIGURATION SECTION</span></div>
+<div class="line"><a name="l04024"></a><span class="lineno"> 4024</span>&#160;<span class="comment"></span> </div>
+<div class="line"><a name="l04025"></a><span class="lineno"> 4025</span>&#160;<span class="comment">Define some of these macros before each #include of this header or change them</span></div>
+<div class="line"><a name="l04026"></a><span class="lineno"> 4026</span>&#160;<span class="comment">here if you need other then default behavior depending on your environment.</span></div>
+<div class="line"><a name="l04027"></a><span class="lineno"> 4027</span>&#160;<span class="comment">*/</span></div>
+<div class="line"><a name="l04028"></a><span class="lineno"> 4028</span>&#160; </div>
+<div class="line"><a name="l04029"></a><span class="lineno"> 4029</span>&#160;<span class="comment">/*</span></div>
+<div class="line"><a name="l04030"></a><span class="lineno"> 4030</span>&#160;<span class="comment">Define this macro to 1 to make the library fetch pointers to Vulkan functions</span></div>
+<div class="line"><a name="l04031"></a><span class="lineno"> 4031</span>&#160;<span class="comment">internally, like:</span></div>
+<div class="line"><a name="l04032"></a><span class="lineno"> 4032</span>&#160;<span class="comment"></span> </div>
+<div class="line"><a name="l04033"></a><span class="lineno"> 4033</span>&#160;<span class="comment">    vulkanFunctions.vkAllocateMemory = &amp;vkAllocateMemory;</span></div>
+<div class="line"><a name="l04034"></a><span class="lineno"> 4034</span>&#160;<span class="comment">*/</span></div>
+<div class="line"><a name="l04035"></a><span class="lineno"> 4035</span>&#160;<span class="preprocessor">#if !defined(VMA_STATIC_VULKAN_FUNCTIONS) &amp;&amp; !defined(VK_NO_PROTOTYPES)</span></div>
+<div class="line"><a name="l04036"></a><span class="lineno"> 4036</span>&#160;<span class="preprocessor">    #define VMA_STATIC_VULKAN_FUNCTIONS 1</span></div>
+<div class="line"><a name="l04037"></a><span class="lineno"> 4037</span>&#160;<span class="preprocessor">#endif</span></div>
+<div class="line"><a name="l04038"></a><span class="lineno"> 4038</span>&#160; </div>
+<div class="line"><a name="l04039"></a><span class="lineno"> 4039</span>&#160;<span class="comment">/*</span></div>
+<div class="line"><a name="l04040"></a><span class="lineno"> 4040</span>&#160;<span class="comment">Define this macro to 1 to make the library fetch pointers to Vulkan functions</span></div>
+<div class="line"><a name="l04041"></a><span class="lineno"> 4041</span>&#160;<span class="comment">internally, like:</span></div>
+<div class="line"><a name="l04042"></a><span class="lineno"> 4042</span>&#160;<span class="comment"></span> </div>
+<div class="line"><a name="l04043"></a><span class="lineno"> 4043</span>&#160;<span class="comment">    vulkanFunctions.vkAllocateMemory = (PFN_vkAllocateMemory)vkGetDeviceProcAddr(m_hDevice, vkAllocateMemory);</span></div>
+<div class="line"><a name="l04044"></a><span class="lineno"> 4044</span>&#160;<span class="comment">*/</span></div>
+<div class="line"><a name="l04045"></a><span class="lineno"> 4045</span>&#160;<span class="preprocessor">#if !defined(VMA_DYNAMIC_VULKAN_FUNCTIONS)</span></div>
+<div class="line"><a name="l04046"></a><span class="lineno"> 4046</span>&#160;<span class="preprocessor">    #define VMA_DYNAMIC_VULKAN_FUNCTIONS 1</span></div>
+<div class="line"><a name="l04047"></a><span class="lineno"> 4047</span>&#160;<span class="preprocessor">    #if defined(VK_NO_PROTOTYPES)</span></div>
+<div class="line"><a name="l04048"></a><span class="lineno"> 4048</span>&#160;        <span class="keyword">extern</span> PFN_vkGetInstanceProcAddr vkGetInstanceProcAddr;</div>
+<div class="line"><a name="l04049"></a><span class="lineno"> 4049</span>&#160;        <span class="keyword">extern</span> PFN_vkGetDeviceProcAddr vkGetDeviceProcAddr;</div>
+<div class="line"><a name="l04050"></a><span class="lineno"> 4050</span>&#160;<span class="preprocessor">    #endif</span></div>
+<div class="line"><a name="l04051"></a><span class="lineno"> 4051</span>&#160;<span class="preprocessor">#endif</span></div>
+<div class="line"><a name="l04052"></a><span class="lineno"> 4052</span>&#160; </div>
+<div class="line"><a name="l04053"></a><span class="lineno"> 4053</span>&#160;<span class="comment">// Define this macro to 1 to make the library use STL containers instead of its own implementation.</span></div>
+<div class="line"><a name="l04054"></a><span class="lineno"> 4054</span>&#160;<span class="comment">//#define VMA_USE_STL_CONTAINERS 1</span></div>
+<div class="line"><a name="l04055"></a><span class="lineno"> 4055</span>&#160; </div>
+<div class="line"><a name="l04056"></a><span class="lineno"> 4056</span>&#160;<span class="comment">/* Set this macro to 1 to make the library including and using STL containers:</span></div>
+<div class="line"><a name="l04057"></a><span class="lineno"> 4057</span>&#160;<span class="comment">std::pair, std::vector, std::list, std::unordered_map.</span></div>
+<div class="line"><a name="l04058"></a><span class="lineno"> 4058</span>&#160;<span class="comment"></span> </div>
+<div class="line"><a name="l04059"></a><span class="lineno"> 4059</span>&#160;<span class="comment">Set it to 0 or undefined to make the library using its own implementation of</span></div>
+<div class="line"><a name="l04060"></a><span class="lineno"> 4060</span>&#160;<span class="comment">the containers.</span></div>
+<div class="line"><a name="l04061"></a><span class="lineno"> 4061</span>&#160;<span class="comment">*/</span></div>
+<div class="line"><a name="l04062"></a><span class="lineno"> 4062</span>&#160;<span class="preprocessor">#if VMA_USE_STL_CONTAINERS</span></div>
+<div class="line"><a name="l04063"></a><span class="lineno"> 4063</span>&#160;<span class="preprocessor">   #define VMA_USE_STL_VECTOR 1</span></div>
+<div class="line"><a name="l04064"></a><span class="lineno"> 4064</span>&#160;<span class="preprocessor">   #define VMA_USE_STL_UNORDERED_MAP 1</span></div>
+<div class="line"><a name="l04065"></a><span class="lineno"> 4065</span>&#160;<span class="preprocessor">   #define VMA_USE_STL_LIST 1</span></div>
+<div class="line"><a name="l04066"></a><span class="lineno"> 4066</span>&#160;<span class="preprocessor">#endif</span></div>
+<div class="line"><a name="l04067"></a><span class="lineno"> 4067</span>&#160; </div>
+<div class="line"><a name="l04068"></a><span class="lineno"> 4068</span>&#160;<span class="preprocessor">#ifndef VMA_USE_STL_SHARED_MUTEX</span></div>
+<div class="line"><a name="l04069"></a><span class="lineno"> 4069</span>&#160;    <span class="comment">// Compiler conforms to C++17.</span></div>
+<div class="line"><a name="l04070"></a><span class="lineno"> 4070</span>&#160;<span class="preprocessor">    #if __cplusplus &gt;= 201703L</span></div>
+<div class="line"><a name="l04071"></a><span class="lineno"> 4071</span>&#160;<span class="preprocessor">        #define VMA_USE_STL_SHARED_MUTEX 1</span></div>
+<div class="line"><a name="l04072"></a><span class="lineno"> 4072</span>&#160;    <span class="comment">// Visual studio defines __cplusplus properly only when passed additional parameter: /Zc:__cplusplus</span></div>
+<div class="line"><a name="l04073"></a><span class="lineno"> 4073</span>&#160;    <span class="comment">// Otherwise it&#39;s always 199711L, despite shared_mutex works since Visual Studio 2015 Update 2.</span></div>
+<div class="line"><a name="l04074"></a><span class="lineno"> 4074</span>&#160;    <span class="comment">// See: https://blogs.msdn.microsoft.com/vcblog/2018/04/09/msvc-now-correctly-reports-__cplusplus/</span></div>
+<div class="line"><a name="l04075"></a><span class="lineno"> 4075</span>&#160;<span class="preprocessor">    #elif defined(_MSC_FULL_VER) &amp;&amp; _MSC_FULL_VER &gt;= 190023918 &amp;&amp; __cplusplus == 199711L &amp;&amp; _MSVC_LANG &gt;= 201703L</span></div>
+<div class="line"><a name="l04076"></a><span class="lineno"> 4076</span>&#160;<span class="preprocessor">        #define VMA_USE_STL_SHARED_MUTEX 1</span></div>
+<div class="line"><a name="l04077"></a><span class="lineno"> 4077</span>&#160;<span class="preprocessor">    #else</span></div>
+<div class="line"><a name="l04078"></a><span class="lineno"> 4078</span>&#160;<span class="preprocessor">        #define VMA_USE_STL_SHARED_MUTEX 0</span></div>
+<div class="line"><a name="l04079"></a><span class="lineno"> 4079</span>&#160;<span class="preprocessor">    #endif</span></div>
+<div class="line"><a name="l04080"></a><span class="lineno"> 4080</span>&#160;<span class="preprocessor">#endif</span></div>
+<div class="line"><a name="l04081"></a><span class="lineno"> 4081</span>&#160; </div>
+<div class="line"><a name="l04082"></a><span class="lineno"> 4082</span>&#160;<span class="comment">/*</span></div>
+<div class="line"><a name="l04083"></a><span class="lineno"> 4083</span>&#160;<span class="comment">THESE INCLUDES ARE NOT ENABLED BY DEFAULT.</span></div>
+<div class="line"><a name="l04084"></a><span class="lineno"> 4084</span>&#160;<span class="comment">Library has its own container implementation.</span></div>
+<div class="line"><a name="l04085"></a><span class="lineno"> 4085</span>&#160;<span class="comment">*/</span></div>
+<div class="line"><a name="l04086"></a><span class="lineno"> 4086</span>&#160;<span class="preprocessor">#if VMA_USE_STL_VECTOR</span></div>
+<div class="line"><a name="l04087"></a><span class="lineno"> 4087</span>&#160;<span class="preprocessor">   #include &lt;vector&gt;</span></div>
+<div class="line"><a name="l04088"></a><span class="lineno"> 4088</span>&#160;<span class="preprocessor">#endif</span></div>
+<div class="line"><a name="l04089"></a><span class="lineno"> 4089</span>&#160; </div>
+<div class="line"><a name="l04090"></a><span class="lineno"> 4090</span>&#160;<span class="preprocessor">#if VMA_USE_STL_UNORDERED_MAP</span></div>
+<div class="line"><a name="l04091"></a><span class="lineno"> 4091</span>&#160;<span class="preprocessor">   #include &lt;unordered_map&gt;</span></div>
+<div class="line"><a name="l04092"></a><span class="lineno"> 4092</span>&#160;<span class="preprocessor">#endif</span></div>
+<div class="line"><a name="l04093"></a><span class="lineno"> 4093</span>&#160; </div>
+<div class="line"><a name="l04094"></a><span class="lineno"> 4094</span>&#160;<span class="preprocessor">#if VMA_USE_STL_LIST</span></div>
+<div class="line"><a name="l04095"></a><span class="lineno"> 4095</span>&#160;<span class="preprocessor">   #include &lt;list&gt;</span></div>
+<div class="line"><a name="l04096"></a><span class="lineno"> 4096</span>&#160;<span class="preprocessor">#endif</span></div>
+<div class="line"><a name="l04097"></a><span class="lineno"> 4097</span>&#160; </div>
+<div class="line"><a name="l04098"></a><span class="lineno"> 4098</span>&#160;<span class="comment">/*</span></div>
+<div class="line"><a name="l04099"></a><span class="lineno"> 4099</span>&#160;<span class="comment">Following headers are used in this CONFIGURATION section only, so feel free to</span></div>
+<div class="line"><a name="l04100"></a><span class="lineno"> 4100</span>&#160;<span class="comment">remove them if not needed.</span></div>
+<div class="line"><a name="l04101"></a><span class="lineno"> 4101</span>&#160;<span class="comment">*/</span></div>
+<div class="line"><a name="l04102"></a><span class="lineno"> 4102</span>&#160;<span class="preprocessor">#include &lt;cassert&gt;</span> <span class="comment">// for assert</span></div>
+<div class="line"><a name="l04103"></a><span class="lineno"> 4103</span>&#160;<span class="preprocessor">#include &lt;algorithm&gt;</span> <span class="comment">// for min, max</span></div>
+<div class="line"><a name="l04104"></a><span class="lineno"> 4104</span>&#160;<span class="preprocessor">#include &lt;mutex&gt;</span></div>
+<div class="line"><a name="l04105"></a><span class="lineno"> 4105</span>&#160; </div>
+<div class="line"><a name="l04106"></a><span class="lineno"> 4106</span>&#160;<span class="preprocessor">#ifndef VMA_NULL</span></div>
+<div class="line"><a name="l04107"></a><span class="lineno"> 4107</span>&#160;   <span class="comment">// Value used as null pointer. Define it to e.g.: nullptr, NULL, 0, (void*)0.</span></div>
+<div class="line"><a name="l04108"></a><span class="lineno"> 4108</span>&#160;<span class="preprocessor">   #define VMA_NULL   nullptr</span></div>
+<div class="line"><a name="l04109"></a><span class="lineno"> 4109</span>&#160;<span class="preprocessor">#endif</span></div>
+<div class="line"><a name="l04110"></a><span class="lineno"> 4110</span>&#160; </div>
+<div class="line"><a name="l04111"></a><span class="lineno"> 4111</span>&#160;<span class="preprocessor">#if defined(__ANDROID_API__) &amp;&amp; (__ANDROID_API__ &lt; 16)</span></div>
+<div class="line"><a name="l04112"></a><span class="lineno"> 4112</span>&#160;<span class="preprocessor">#include &lt;cstdlib&gt;</span></div>
+<div class="line"><a name="l04113"></a><span class="lineno"> 4113</span>&#160;<span class="keyword">static</span> <span class="keywordtype">void</span>* vma_aligned_alloc(<span class="keywordtype">size_t</span> alignment, <span class="keywordtype">size_t</span> size)</div>
+<div class="line"><a name="l04114"></a><span class="lineno"> 4114</span>&#160;{</div>
+<div class="line"><a name="l04115"></a><span class="lineno"> 4115</span>&#160;    <span class="comment">// alignment must be &gt;= sizeof(void*)</span></div>
+<div class="line"><a name="l04116"></a><span class="lineno"> 4116</span>&#160;    <span class="keywordflow">if</span>(alignment &lt; <span class="keyword">sizeof</span>(<span class="keywordtype">void</span>*))</div>
+<div class="line"><a name="l04117"></a><span class="lineno"> 4117</span>&#160;    {</div>
+<div class="line"><a name="l04118"></a><span class="lineno"> 4118</span>&#160;        alignment = <span class="keyword">sizeof</span>(<span class="keywordtype">void</span>*);</div>
+<div class="line"><a name="l04119"></a><span class="lineno"> 4119</span>&#160;    }</div>
+<div class="line"><a name="l04120"></a><span class="lineno"> 4120</span>&#160; </div>
+<div class="line"><a name="l04121"></a><span class="lineno"> 4121</span>&#160;    <span class="keywordflow">return</span> memalign(alignment, size);</div>
+<div class="line"><a name="l04122"></a><span class="lineno"> 4122</span>&#160;}</div>
+<div class="line"><a name="l04123"></a><span class="lineno"> 4123</span>&#160;<span class="preprocessor">#elif defined(__APPLE__) || defined(__ANDROID__) || (defined(__linux__) &amp;&amp; defined(__GLIBCXX__) &amp;&amp; !defined(_GLIBCXX_HAVE_ALIGNED_ALLOC))</span></div>
+<div class="line"><a name="l04124"></a><span class="lineno"> 4124</span>&#160;<span class="preprocessor">#include &lt;cstdlib&gt;</span></div>
 <div class="line"><a name="l04125"></a><span class="lineno"> 4125</span>&#160; </div>
-<div class="line"><a name="l04126"></a><span class="lineno"> 4126</span>&#160;<span class="preprocessor">#ifndef VMA_ATOMIC_UINT64</span></div>
-<div class="line"><a name="l04127"></a><span class="lineno"> 4127</span>&#160;<span class="preprocessor">    #include &lt;atomic&gt;</span></div>
-<div class="line"><a name="l04128"></a><span class="lineno"> 4128</span>&#160;<span class="preprocessor">    #define VMA_ATOMIC_UINT64 std::atomic&lt;uint64_t&gt;</span></div>
-<div class="line"><a name="l04129"></a><span class="lineno"> 4129</span>&#160;<span class="preprocessor">#endif</span></div>
-<div class="line"><a name="l04130"></a><span class="lineno"> 4130</span>&#160; </div>
-<div class="line"><a name="l04131"></a><span class="lineno"> 4131</span>&#160;<span class="preprocessor">#ifndef VMA_DEBUG_ALWAYS_DEDICATED_MEMORY</span></div>
-<div class="line"><a name="l04132"></a><span class="lineno"> 4132</span>&#160; </div>
-<div class="line"><a name="l04136"></a><span class="lineno"> 4136</span>&#160;<span class="preprocessor">    #define VMA_DEBUG_ALWAYS_DEDICATED_MEMORY (0)</span></div>
-<div class="line"><a name="l04137"></a><span class="lineno"> 4137</span>&#160;<span class="preprocessor">#endif</span></div>
-<div class="line"><a name="l04138"></a><span class="lineno"> 4138</span>&#160; </div>
-<div class="line"><a name="l04139"></a><span class="lineno"> 4139</span>&#160;<span class="preprocessor">#ifndef VMA_DEBUG_ALIGNMENT</span></div>
-<div class="line"><a name="l04140"></a><span class="lineno"> 4140</span>&#160; </div>
-<div class="line"><a name="l04144"></a><span class="lineno"> 4144</span>&#160;<span class="preprocessor">    #define VMA_DEBUG_ALIGNMENT (1)</span></div>
-<div class="line"><a name="l04145"></a><span class="lineno"> 4145</span>&#160;<span class="preprocessor">#endif</span></div>
-<div class="line"><a name="l04146"></a><span class="lineno"> 4146</span>&#160; </div>
-<div class="line"><a name="l04147"></a><span class="lineno"> 4147</span>&#160;<span class="preprocessor">#ifndef VMA_DEBUG_MARGIN</span></div>
-<div class="line"><a name="l04148"></a><span class="lineno"> 4148</span>&#160; </div>
-<div class="line"><a name="l04152"></a><span class="lineno"> 4152</span>&#160;<span class="preprocessor">    #define VMA_DEBUG_MARGIN (0)</span></div>
-<div class="line"><a name="l04153"></a><span class="lineno"> 4153</span>&#160;<span class="preprocessor">#endif</span></div>
-<div class="line"><a name="l04154"></a><span class="lineno"> 4154</span>&#160; </div>
-<div class="line"><a name="l04155"></a><span class="lineno"> 4155</span>&#160;<span class="preprocessor">#ifndef VMA_DEBUG_INITIALIZE_ALLOCATIONS</span></div>
-<div class="line"><a name="l04156"></a><span class="lineno"> 4156</span>&#160; </div>
-<div class="line"><a name="l04160"></a><span class="lineno"> 4160</span>&#160;<span class="preprocessor">    #define VMA_DEBUG_INITIALIZE_ALLOCATIONS (0)</span></div>
-<div class="line"><a name="l04161"></a><span class="lineno"> 4161</span>&#160;<span class="preprocessor">#endif</span></div>
-<div class="line"><a name="l04162"></a><span class="lineno"> 4162</span>&#160; </div>
-<div class="line"><a name="l04163"></a><span class="lineno"> 4163</span>&#160;<span class="preprocessor">#ifndef VMA_DEBUG_DETECT_CORRUPTION</span></div>
-<div class="line"><a name="l04164"></a><span class="lineno"> 4164</span>&#160; </div>
-<div class="line"><a name="l04169"></a><span class="lineno"> 4169</span>&#160;<span class="preprocessor">    #define VMA_DEBUG_DETECT_CORRUPTION (0)</span></div>
-<div class="line"><a name="l04170"></a><span class="lineno"> 4170</span>&#160;<span class="preprocessor">#endif</span></div>
-<div class="line"><a name="l04171"></a><span class="lineno"> 4171</span>&#160; </div>
-<div class="line"><a name="l04172"></a><span class="lineno"> 4172</span>&#160;<span class="preprocessor">#ifndef VMA_DEBUG_GLOBAL_MUTEX</span></div>
-<div class="line"><a name="l04173"></a><span class="lineno"> 4173</span>&#160; </div>
-<div class="line"><a name="l04177"></a><span class="lineno"> 4177</span>&#160;<span class="preprocessor">    #define VMA_DEBUG_GLOBAL_MUTEX (0)</span></div>
-<div class="line"><a name="l04178"></a><span class="lineno"> 4178</span>&#160;<span class="preprocessor">#endif</span></div>
-<div class="line"><a name="l04179"></a><span class="lineno"> 4179</span>&#160; </div>
-<div class="line"><a name="l04180"></a><span class="lineno"> 4180</span>&#160;<span class="preprocessor">#ifndef VMA_DEBUG_MIN_BUFFER_IMAGE_GRANULARITY</span></div>
+<div class="line"><a name="l04126"></a><span class="lineno"> 4126</span>&#160;<span class="preprocessor">#if defined(__APPLE__)</span></div>
+<div class="line"><a name="l04127"></a><span class="lineno"> 4127</span>&#160;<span class="preprocessor">#include &lt;AvailabilityMacros.h&gt;</span></div>
+<div class="line"><a name="l04128"></a><span class="lineno"> 4128</span>&#160;<span class="preprocessor">#endif</span></div>
+<div class="line"><a name="l04129"></a><span class="lineno"> 4129</span>&#160; </div>
+<div class="line"><a name="l04130"></a><span class="lineno"> 4130</span>&#160;<span class="keyword">static</span> <span class="keywordtype">void</span>* vma_aligned_alloc(<span class="keywordtype">size_t</span> alignment, <span class="keywordtype">size_t</span> size)</div>
+<div class="line"><a name="l04131"></a><span class="lineno"> 4131</span>&#160;{</div>
+<div class="line"><a name="l04132"></a><span class="lineno"> 4132</span>&#160;<span class="preprocessor">#if defined(__APPLE__) &amp;&amp; (defined(MAC_OS_X_VERSION_10_16) || defined(__IPHONE_14_0))</span></div>
+<div class="line"><a name="l04133"></a><span class="lineno"> 4133</span>&#160;<span class="preprocessor">#if MAC_OS_X_VERSION_MAX_ALLOWED &gt;= MAC_OS_X_VERSION_10_16 || __IPHONE_OS_VERSION_MAX_ALLOWED &gt;= __IPHONE_14_0</span></div>
+<div class="line"><a name="l04134"></a><span class="lineno"> 4134</span>&#160;    <span class="comment">// For C++14, usr/include/malloc/_malloc.h declares aligned_alloc()) only</span></div>
+<div class="line"><a name="l04135"></a><span class="lineno"> 4135</span>&#160;    <span class="comment">// with the MacOSX11.0 SDK in Xcode 12 (which is what adds</span></div>
+<div class="line"><a name="l04136"></a><span class="lineno"> 4136</span>&#160;    <span class="comment">// MAC_OS_X_VERSION_10_16), even though the function is marked</span></div>
+<div class="line"><a name="l04137"></a><span class="lineno"> 4137</span>&#160;    <span class="comment">// availabe for 10.15. That&#39;s why the preprocessor checks for 10.16 but</span></div>
+<div class="line"><a name="l04138"></a><span class="lineno"> 4138</span>&#160;    <span class="comment">// the __builtin_available checks for 10.15.</span></div>
+<div class="line"><a name="l04139"></a><span class="lineno"> 4139</span>&#160;    <span class="comment">// People who use C++17 could call aligned_alloc with the 10.15 SDK already.</span></div>
+<div class="line"><a name="l04140"></a><span class="lineno"> 4140</span>&#160;    <span class="keywordflow">if</span> (__builtin_available(macOS 10.15, iOS 13, *))</div>
+<div class="line"><a name="l04141"></a><span class="lineno"> 4141</span>&#160;        <span class="keywordflow">return</span> aligned_alloc(alignment, size);</div>
+<div class="line"><a name="l04142"></a><span class="lineno"> 4142</span>&#160;<span class="preprocessor">#endif</span></div>
+<div class="line"><a name="l04143"></a><span class="lineno"> 4143</span>&#160;<span class="preprocessor">#endif</span></div>
+<div class="line"><a name="l04144"></a><span class="lineno"> 4144</span>&#160;    <span class="comment">// alignment must be &gt;= sizeof(void*)</span></div>
+<div class="line"><a name="l04145"></a><span class="lineno"> 4145</span>&#160;    <span class="keywordflow">if</span>(alignment &lt; <span class="keyword">sizeof</span>(<span class="keywordtype">void</span>*))</div>
+<div class="line"><a name="l04146"></a><span class="lineno"> 4146</span>&#160;    {</div>
+<div class="line"><a name="l04147"></a><span class="lineno"> 4147</span>&#160;        alignment = <span class="keyword">sizeof</span>(<span class="keywordtype">void</span>*);</div>
+<div class="line"><a name="l04148"></a><span class="lineno"> 4148</span>&#160;    }</div>
+<div class="line"><a name="l04149"></a><span class="lineno"> 4149</span>&#160; </div>
+<div class="line"><a name="l04150"></a><span class="lineno"> 4150</span>&#160;    <span class="keywordtype">void</span> *pointer;</div>
+<div class="line"><a name="l04151"></a><span class="lineno"> 4151</span>&#160;    <span class="keywordflow">if</span>(posix_memalign(&amp;pointer, alignment, size) == 0)</div>
+<div class="line"><a name="l04152"></a><span class="lineno"> 4152</span>&#160;        <span class="keywordflow">return</span> pointer;</div>
+<div class="line"><a name="l04153"></a><span class="lineno"> 4153</span>&#160;    <span class="keywordflow">return</span> VMA_NULL;</div>
+<div class="line"><a name="l04154"></a><span class="lineno"> 4154</span>&#160;}</div>
+<div class="line"><a name="l04155"></a><span class="lineno"> 4155</span>&#160;<span class="preprocessor">#elif defined(_WIN32)</span></div>
+<div class="line"><a name="l04156"></a><span class="lineno"> 4156</span>&#160;<span class="keyword">static</span> <span class="keywordtype">void</span>* vma_aligned_alloc(<span class="keywordtype">size_t</span> alignment, <span class="keywordtype">size_t</span> size)</div>
+<div class="line"><a name="l04157"></a><span class="lineno"> 4157</span>&#160;{</div>
+<div class="line"><a name="l04158"></a><span class="lineno"> 4158</span>&#160;    <span class="keywordflow">return</span> _aligned_malloc(size, alignment);</div>
+<div class="line"><a name="l04159"></a><span class="lineno"> 4159</span>&#160;}</div>
+<div class="line"><a name="l04160"></a><span class="lineno"> 4160</span>&#160;<span class="preprocessor">#else</span></div>
+<div class="line"><a name="l04161"></a><span class="lineno"> 4161</span>&#160;<span class="keyword">static</span> <span class="keywordtype">void</span>* vma_aligned_alloc(<span class="keywordtype">size_t</span> alignment, <span class="keywordtype">size_t</span> size)</div>
+<div class="line"><a name="l04162"></a><span class="lineno"> 4162</span>&#160;{</div>
+<div class="line"><a name="l04163"></a><span class="lineno"> 4163</span>&#160;    <span class="keywordflow">return</span> aligned_alloc(alignment, size);</div>
+<div class="line"><a name="l04164"></a><span class="lineno"> 4164</span>&#160;}</div>
+<div class="line"><a name="l04165"></a><span class="lineno"> 4165</span>&#160;<span class="preprocessor">#endif</span></div>
+<div class="line"><a name="l04166"></a><span class="lineno"> 4166</span>&#160; </div>
+<div class="line"><a name="l04167"></a><span class="lineno"> 4167</span>&#160;<span class="preprocessor">#if defined(_WIN32)</span></div>
+<div class="line"><a name="l04168"></a><span class="lineno"> 4168</span>&#160;<span class="keyword">static</span> <span class="keywordtype">void</span> vma_aligned_free(<span class="keywordtype">void</span>* ptr)</div>
+<div class="line"><a name="l04169"></a><span class="lineno"> 4169</span>&#160;{</div>
+<div class="line"><a name="l04170"></a><span class="lineno"> 4170</span>&#160;    _aligned_free(ptr);</div>
+<div class="line"><a name="l04171"></a><span class="lineno"> 4171</span>&#160;}</div>
+<div class="line"><a name="l04172"></a><span class="lineno"> 4172</span>&#160;<span class="preprocessor">#else</span></div>
+<div class="line"><a name="l04173"></a><span class="lineno"> 4173</span>&#160;<span class="keyword">static</span> <span class="keywordtype">void</span> vma_aligned_free(<span class="keywordtype">void</span>* VMA_NULLABLE ptr)</div>
+<div class="line"><a name="l04174"></a><span class="lineno"> 4174</span>&#160;{</div>
+<div class="line"><a name="l04175"></a><span class="lineno"> 4175</span>&#160;    free(ptr);</div>
+<div class="line"><a name="l04176"></a><span class="lineno"> 4176</span>&#160;}</div>
+<div class="line"><a name="l04177"></a><span class="lineno"> 4177</span>&#160;<span class="preprocessor">#endif</span></div>
+<div class="line"><a name="l04178"></a><span class="lineno"> 4178</span>&#160; </div>
+<div class="line"><a name="l04179"></a><span class="lineno"> 4179</span>&#160;<span class="comment">// If your compiler is not compatible with C++11 and definition of</span></div>
+<div class="line"><a name="l04180"></a><span class="lineno"> 4180</span>&#160;<span class="comment">// aligned_alloc() function is missing, uncommeting following line may help:</span></div>
 <div class="line"><a name="l04181"></a><span class="lineno"> 4181</span>&#160; </div>
-<div class="line"><a name="l04185"></a><span class="lineno"> 4185</span>&#160;<span class="preprocessor">    #define VMA_DEBUG_MIN_BUFFER_IMAGE_GRANULARITY (1)</span></div>
-<div class="line"><a name="l04186"></a><span class="lineno"> 4186</span>&#160;<span class="preprocessor">#endif</span></div>
-<div class="line"><a name="l04187"></a><span class="lineno"> 4187</span>&#160; </div>
-<div class="line"><a name="l04188"></a><span class="lineno"> 4188</span>&#160;<span class="preprocessor">#ifndef VMA_SMALL_HEAP_MAX_SIZE</span></div>
-<div class="line"><a name="l04189"></a><span class="lineno"> 4189</span>&#160;<span class="preprocessor">   #define VMA_SMALL_HEAP_MAX_SIZE (1024ull * 1024 * 1024)</span></div>
+<div class="line"><a name="l04182"></a><span class="lineno"> 4182</span>&#160;<span class="comment">//#include &lt;malloc.h&gt;</span></div>
+<div class="line"><a name="l04183"></a><span class="lineno"> 4183</span>&#160; </div>
+<div class="line"><a name="l04184"></a><span class="lineno"> 4184</span>&#160;<span class="comment">// Normal assert to check for programmer&#39;s errors, especially in Debug configuration.</span></div>
+<div class="line"><a name="l04185"></a><span class="lineno"> 4185</span>&#160;<span class="preprocessor">#ifndef VMA_ASSERT</span></div>
+<div class="line"><a name="l04186"></a><span class="lineno"> 4186</span>&#160;<span class="preprocessor">   #ifdef NDEBUG</span></div>
+<div class="line"><a name="l04187"></a><span class="lineno"> 4187</span>&#160;<span class="preprocessor">       #define VMA_ASSERT(expr)</span></div>
+<div class="line"><a name="l04188"></a><span class="lineno"> 4188</span>&#160;<span class="preprocessor">   #else</span></div>
+<div class="line"><a name="l04189"></a><span class="lineno"> 4189</span>&#160;<span class="preprocessor">       #define VMA_ASSERT(expr)         assert(expr)</span></div>
+<div class="line"><a name="l04190"></a><span class="lineno"> 4190</span>&#160;<span class="preprocessor">   #endif</span></div>
 <div class="line"><a name="l04191"></a><span class="lineno"> 4191</span>&#160;<span class="preprocessor">#endif</span></div>
 <div class="line"><a name="l04192"></a><span class="lineno"> 4192</span>&#160; </div>
-<div class="line"><a name="l04193"></a><span class="lineno"> 4193</span>&#160;<span class="preprocessor">#ifndef VMA_DEFAULT_LARGE_HEAP_BLOCK_SIZE</span></div>
-<div class="line"><a name="l04194"></a><span class="lineno"> 4194</span>&#160;<span class="preprocessor">   #define VMA_DEFAULT_LARGE_HEAP_BLOCK_SIZE (256ull * 1024 * 1024)</span></div>
-<div class="line"><a name="l04196"></a><span class="lineno"> 4196</span>&#160;<span class="preprocessor">#endif</span></div>
-<div class="line"><a name="l04197"></a><span class="lineno"> 4197</span>&#160; </div>
-<div class="line"><a name="l04198"></a><span class="lineno"> 4198</span>&#160;<span class="preprocessor">#ifndef VMA_CLASS_NO_COPY</span></div>
-<div class="line"><a name="l04199"></a><span class="lineno"> 4199</span>&#160;<span class="preprocessor">    #define VMA_CLASS_NO_COPY(className) \</span></div>
-<div class="line"><a name="l04200"></a><span class="lineno"> 4200</span>&#160;<span class="preprocessor">        private: \</span></div>
-<div class="line"><a name="l04201"></a><span class="lineno"> 4201</span>&#160;<span class="preprocessor">            className(const className&amp;) = delete; \</span></div>
-<div class="line"><a name="l04202"></a><span class="lineno"> 4202</span>&#160;<span class="preprocessor">            className&amp; operator=(const className&amp;) = delete;</span></div>
-<div class="line"><a name="l04203"></a><span class="lineno"> 4203</span>&#160;<span class="preprocessor">#endif</span></div>
-<div class="line"><a name="l04204"></a><span class="lineno"> 4204</span>&#160; </div>
-<div class="line"><a name="l04205"></a><span class="lineno"> 4205</span>&#160;<span class="keyword">static</span> <span class="keyword">const</span> uint32_t VMA_FRAME_INDEX_LOST = UINT32_MAX;</div>
+<div class="line"><a name="l04193"></a><span class="lineno"> 4193</span>&#160;<span class="comment">// Assert that will be called very often, like inside data structures e.g. operator[].</span></div>
+<div class="line"><a name="l04194"></a><span class="lineno"> 4194</span>&#160;<span class="comment">// Making it non-empty can make program slow.</span></div>
+<div class="line"><a name="l04195"></a><span class="lineno"> 4195</span>&#160;<span class="preprocessor">#ifndef VMA_HEAVY_ASSERT</span></div>
+<div class="line"><a name="l04196"></a><span class="lineno"> 4196</span>&#160;<span class="preprocessor">   #ifdef NDEBUG</span></div>
+<div class="line"><a name="l04197"></a><span class="lineno"> 4197</span>&#160;<span class="preprocessor">       #define VMA_HEAVY_ASSERT(expr)</span></div>
+<div class="line"><a name="l04198"></a><span class="lineno"> 4198</span>&#160;<span class="preprocessor">   #else</span></div>
+<div class="line"><a name="l04199"></a><span class="lineno"> 4199</span>&#160;<span class="preprocessor">       #define VMA_HEAVY_ASSERT(expr)   </span><span class="comment">//VMA_ASSERT(expr)</span></div>
+<div class="line"><a name="l04200"></a><span class="lineno"> 4200</span>&#160;<span class="preprocessor">   #endif</span></div>
+<div class="line"><a name="l04201"></a><span class="lineno"> 4201</span>&#160;<span class="preprocessor">#endif</span></div>
+<div class="line"><a name="l04202"></a><span class="lineno"> 4202</span>&#160; </div>
+<div class="line"><a name="l04203"></a><span class="lineno"> 4203</span>&#160;<span class="preprocessor">#ifndef VMA_ALIGN_OF</span></div>
+<div class="line"><a name="l04204"></a><span class="lineno"> 4204</span>&#160;<span class="preprocessor">   #define VMA_ALIGN_OF(type)       (__alignof(type))</span></div>
+<div class="line"><a name="l04205"></a><span class="lineno"> 4205</span>&#160;<span class="preprocessor">#endif</span></div>
 <div class="line"><a name="l04206"></a><span class="lineno"> 4206</span>&#160; </div>
-<div class="line"><a name="l04207"></a><span class="lineno"> 4207</span>&#160;<span class="comment">// Decimal 2139416166, float NaN, little-endian binary 66 E6 84 7F.</span></div>
-<div class="line"><a name="l04208"></a><span class="lineno"> 4208</span>&#160;<span class="keyword">static</span> <span class="keyword">const</span> uint32_t VMA_CORRUPTION_DETECTION_MAGIC_VALUE = 0x7F84E666;</div>
-<div class="line"><a name="l04209"></a><span class="lineno"> 4209</span>&#160; </div>
-<div class="line"><a name="l04210"></a><span class="lineno"> 4210</span>&#160;<span class="keyword">static</span> <span class="keyword">const</span> uint8_t VMA_ALLOCATION_FILL_PATTERN_CREATED   = 0xDC;</div>
-<div class="line"><a name="l04211"></a><span class="lineno"> 4211</span>&#160;<span class="keyword">static</span> <span class="keyword">const</span> uint8_t VMA_ALLOCATION_FILL_PATTERN_DESTROYED = 0xEF;</div>
-<div class="line"><a name="l04212"></a><span class="lineno"> 4212</span>&#160; </div>
-<div class="line"><a name="l04213"></a><span class="lineno"> 4213</span>&#160;<span class="comment">/*******************************************************************************</span></div>
-<div class="line"><a name="l04214"></a><span class="lineno"> 4214</span>&#160;<span class="comment">END OF CONFIGURATION</span></div>
-<div class="line"><a name="l04215"></a><span class="lineno"> 4215</span>&#160;<span class="comment">*/</span></div>
-<div class="line"><a name="l04216"></a><span class="lineno"> 4216</span>&#160; </div>
-<div class="line"><a name="l04217"></a><span class="lineno"> 4217</span>&#160;<span class="comment">// # Copy of some Vulkan definitions so we don&#39;t need to check their existence just to handle few constants.</span></div>
-<div class="line"><a name="l04218"></a><span class="lineno"> 4218</span>&#160; </div>
-<div class="line"><a name="l04219"></a><span class="lineno"> 4219</span>&#160;<span class="keyword">static</span> <span class="keyword">const</span> uint32_t VK_MEMORY_PROPERTY_DEVICE_COHERENT_BIT_AMD_COPY = 0x00000040;</div>
-<div class="line"><a name="l04220"></a><span class="lineno"> 4220</span>&#160;<span class="keyword">static</span> <span class="keyword">const</span> uint32_t VK_MEMORY_PROPERTY_DEVICE_UNCACHED_BIT_AMD_COPY = 0x00000080;</div>
-<div class="line"><a name="l04221"></a><span class="lineno"> 4221</span>&#160;<span class="keyword">static</span> <span class="keyword">const</span> uint32_t VK_BUFFER_USAGE_SHADER_DEVICE_ADDRESS_BIT_COPY = 0x00020000;</div>
-<div class="line"><a name="l04222"></a><span class="lineno"> 4222</span>&#160; </div>
-<div class="line"><a name="l04223"></a><span class="lineno"> 4223</span>&#160;<span class="keyword">static</span> <span class="keyword">const</span> uint32_t VMA_ALLOCATION_INTERNAL_STRATEGY_MIN_OFFSET = 0x10000000u;</div>
-<div class="line"><a name="l04224"></a><span class="lineno"> 4224</span>&#160; </div>
-<div class="line"><a name="l04225"></a><span class="lineno"> 4225</span>&#160;<span class="keyword">static</span> VkAllocationCallbacks VmaEmptyAllocationCallbacks = {</div>
-<div class="line"><a name="l04226"></a><span class="lineno"> 4226</span>&#160;    VMA_NULL, VMA_NULL, VMA_NULL, VMA_NULL, VMA_NULL, VMA_NULL };</div>
+<div class="line"><a name="l04207"></a><span class="lineno"> 4207</span>&#160;<span class="preprocessor">#ifndef VMA_SYSTEM_ALIGNED_MALLOC</span></div>
+<div class="line"><a name="l04208"></a><span class="lineno"> 4208</span>&#160;<span class="preprocessor">   #define VMA_SYSTEM_ALIGNED_MALLOC(size, alignment) vma_aligned_alloc((alignment), (size))</span></div>
+<div class="line"><a name="l04209"></a><span class="lineno"> 4209</span>&#160;<span class="preprocessor">#endif</span></div>
+<div class="line"><a name="l04210"></a><span class="lineno"> 4210</span>&#160; </div>
+<div class="line"><a name="l04211"></a><span class="lineno"> 4211</span>&#160;<span class="preprocessor">#ifndef VMA_SYSTEM_ALIGNED_FREE</span></div>
+<div class="line"><a name="l04212"></a><span class="lineno"> 4212</span>&#160;   <span class="comment">// VMA_SYSTEM_FREE is the old name, but might have been defined by the user</span></div>
+<div class="line"><a name="l04213"></a><span class="lineno"> 4213</span>&#160;<span class="preprocessor">   #if defined(VMA_SYSTEM_FREE)</span></div>
+<div class="line"><a name="l04214"></a><span class="lineno"> 4214</span>&#160;<span class="preprocessor">      #define VMA_SYSTEM_ALIGNED_FREE(ptr)     VMA_SYSTEM_FREE(ptr)</span></div>
+<div class="line"><a name="l04215"></a><span class="lineno"> 4215</span>&#160;<span class="preprocessor">   #else</span></div>
+<div class="line"><a name="l04216"></a><span class="lineno"> 4216</span>&#160;<span class="preprocessor">      #define VMA_SYSTEM_ALIGNED_FREE(ptr)     vma_aligned_free(ptr)</span></div>
+<div class="line"><a name="l04217"></a><span class="lineno"> 4217</span>&#160;<span class="preprocessor">    #endif</span></div>
+<div class="line"><a name="l04218"></a><span class="lineno"> 4218</span>&#160;<span class="preprocessor">#endif</span></div>
+<div class="line"><a name="l04219"></a><span class="lineno"> 4219</span>&#160; </div>
+<div class="line"><a name="l04220"></a><span class="lineno"> 4220</span>&#160;<span class="preprocessor">#ifndef VMA_MIN</span></div>
+<div class="line"><a name="l04221"></a><span class="lineno"> 4221</span>&#160;<span class="preprocessor">   #define VMA_MIN(v1, v2)    (std::min((v1), (v2)))</span></div>
+<div class="line"><a name="l04222"></a><span class="lineno"> 4222</span>&#160;<span class="preprocessor">#endif</span></div>
+<div class="line"><a name="l04223"></a><span class="lineno"> 4223</span>&#160; </div>
+<div class="line"><a name="l04224"></a><span class="lineno"> 4224</span>&#160;<span class="preprocessor">#ifndef VMA_MAX</span></div>
+<div class="line"><a name="l04225"></a><span class="lineno"> 4225</span>&#160;<span class="preprocessor">   #define VMA_MAX(v1, v2)    (std::max((v1), (v2)))</span></div>
+<div class="line"><a name="l04226"></a><span class="lineno"> 4226</span>&#160;<span class="preprocessor">#endif</span></div>
 <div class="line"><a name="l04227"></a><span class="lineno"> 4227</span>&#160; </div>
-<div class="line"><a name="l04228"></a><span class="lineno"> 4228</span>&#160;<span class="comment">// Returns number of bits set to 1 in (v).</span></div>
-<div class="line"><a name="l04229"></a><span class="lineno"> 4229</span>&#160;<span class="keyword">static</span> <span class="keyword">inline</span> uint32_t VmaCountBitsSet(uint32_t v)</div>
-<div class="line"><a name="l04230"></a><span class="lineno"> 4230</span>&#160;{</div>
-<div class="line"><a name="l04231"></a><span class="lineno"> 4231</span>&#160;    uint32_t c = v - ((v &gt;&gt; 1) &amp; 0x55555555);</div>
-<div class="line"><a name="l04232"></a><span class="lineno"> 4232</span>&#160;    c = ((c &gt;&gt;  2) &amp; 0x33333333) + (c &amp; 0x33333333);</div>
-<div class="line"><a name="l04233"></a><span class="lineno"> 4233</span>&#160;    c = ((c &gt;&gt;  4) + c) &amp; 0x0F0F0F0F;</div>
-<div class="line"><a name="l04234"></a><span class="lineno"> 4234</span>&#160;    c = ((c &gt;&gt;  8) + c) &amp; 0x00FF00FF;</div>
-<div class="line"><a name="l04235"></a><span class="lineno"> 4235</span>&#160;    c = ((c &gt;&gt; 16) + c) &amp; 0x0000FFFF;</div>
-<div class="line"><a name="l04236"></a><span class="lineno"> 4236</span>&#160;    <span class="keywordflow">return</span> c;</div>
-<div class="line"><a name="l04237"></a><span class="lineno"> 4237</span>&#160;}</div>
-<div class="line"><a name="l04238"></a><span class="lineno"> 4238</span>&#160; </div>
-<div class="line"><a name="l04239"></a><span class="lineno"> 4239</span>&#160;<span class="comment">// Aligns given value up to nearest multiply of align value. For example: VmaAlignUp(11, 8) = 16.</span></div>
-<div class="line"><a name="l04240"></a><span class="lineno"> 4240</span>&#160;<span class="comment">// Use types like uint32_t, uint64_t as T.</span></div>
-<div class="line"><a name="l04241"></a><span class="lineno"> 4241</span>&#160;<span class="keyword">template</span> &lt;<span class="keyword">typename</span> T&gt;</div>
-<div class="line"><a name="l04242"></a><span class="lineno"> 4242</span>&#160;<span class="keyword">static</span> <span class="keyword">inline</span> T VmaAlignUp(T val, T align)</div>
-<div class="line"><a name="l04243"></a><span class="lineno"> 4243</span>&#160;{</div>
-<div class="line"><a name="l04244"></a><span class="lineno"> 4244</span>&#160;    <span class="keywordflow">return</span> (val + align - 1) / align * align;</div>
-<div class="line"><a name="l04245"></a><span class="lineno"> 4245</span>&#160;}</div>
-<div class="line"><a name="l04246"></a><span class="lineno"> 4246</span>&#160;<span class="comment">// Aligns given value down to nearest multiply of align value. For example: VmaAlignUp(11, 8) = 8.</span></div>
-<div class="line"><a name="l04247"></a><span class="lineno"> 4247</span>&#160;<span class="comment">// Use types like uint32_t, uint64_t as T.</span></div>
-<div class="line"><a name="l04248"></a><span class="lineno"> 4248</span>&#160;<span class="keyword">template</span> &lt;<span class="keyword">typename</span> T&gt;</div>
-<div class="line"><a name="l04249"></a><span class="lineno"> 4249</span>&#160;<span class="keyword">static</span> <span class="keyword">inline</span> T VmaAlignDown(T val, T align)</div>
-<div class="line"><a name="l04250"></a><span class="lineno"> 4250</span>&#160;{</div>
-<div class="line"><a name="l04251"></a><span class="lineno"> 4251</span>&#160;    <span class="keywordflow">return</span> val / align * align;</div>
-<div class="line"><a name="l04252"></a><span class="lineno"> 4252</span>&#160;}</div>
-<div class="line"><a name="l04253"></a><span class="lineno"> 4253</span>&#160; </div>
-<div class="line"><a name="l04254"></a><span class="lineno"> 4254</span>&#160;<span class="comment">// Division with mathematical rounding to nearest number.</span></div>
-<div class="line"><a name="l04255"></a><span class="lineno"> 4255</span>&#160;<span class="keyword">template</span> &lt;<span class="keyword">typename</span> T&gt;</div>
-<div class="line"><a name="l04256"></a><span class="lineno"> 4256</span>&#160;<span class="keyword">static</span> <span class="keyword">inline</span> T VmaRoundDiv(T x, T y)</div>
-<div class="line"><a name="l04257"></a><span class="lineno"> 4257</span>&#160;{</div>
-<div class="line"><a name="l04258"></a><span class="lineno"> 4258</span>&#160;    <span class="keywordflow">return</span> (x + (y / (T)2)) / y;</div>
-<div class="line"><a name="l04259"></a><span class="lineno"> 4259</span>&#160;}</div>
-<div class="line"><a name="l04260"></a><span class="lineno"> 4260</span>&#160; </div>
-<div class="line"><a name="l04261"></a><span class="lineno"> 4261</span>&#160;<span class="comment">/*</span></div>
-<div class="line"><a name="l04262"></a><span class="lineno"> 4262</span>&#160;<span class="comment">Returns true if given number is a power of two.</span></div>
-<div class="line"><a name="l04263"></a><span class="lineno"> 4263</span>&#160;<span class="comment">T must be unsigned integer number or signed integer but always nonnegative.</span></div>
-<div class="line"><a name="l04264"></a><span class="lineno"> 4264</span>&#160;<span class="comment">For 0 returns true.</span></div>
-<div class="line"><a name="l04265"></a><span class="lineno"> 4265</span>&#160;<span class="comment">*/</span></div>
-<div class="line"><a name="l04266"></a><span class="lineno"> 4266</span>&#160;<span class="keyword">template</span> &lt;<span class="keyword">typename</span> T&gt;</div>
-<div class="line"><a name="l04267"></a><span class="lineno"> 4267</span>&#160;<span class="keyword">inline</span> <span class="keywordtype">bool</span> VmaIsPow2(T x)</div>
-<div class="line"><a name="l04268"></a><span class="lineno"> 4268</span>&#160;{</div>
-<div class="line"><a name="l04269"></a><span class="lineno"> 4269</span>&#160;    <span class="keywordflow">return</span> (x &amp; (x-1)) == 0;</div>
-<div class="line"><a name="l04270"></a><span class="lineno"> 4270</span>&#160;}</div>
-<div class="line"><a name="l04271"></a><span class="lineno"> 4271</span>&#160; </div>
-<div class="line"><a name="l04272"></a><span class="lineno"> 4272</span>&#160;<span class="comment">// Returns smallest power of 2 greater or equal to v.</span></div>
-<div class="line"><a name="l04273"></a><span class="lineno"> 4273</span>&#160;<span class="keyword">static</span> <span class="keyword">inline</span> uint32_t VmaNextPow2(uint32_t v)</div>
-<div class="line"><a name="l04274"></a><span class="lineno"> 4274</span>&#160;{</div>
-<div class="line"><a name="l04275"></a><span class="lineno"> 4275</span>&#160;    v--;</div>
-<div class="line"><a name="l04276"></a><span class="lineno"> 4276</span>&#160;    v |= v &gt;&gt; 1;</div>
-<div class="line"><a name="l04277"></a><span class="lineno"> 4277</span>&#160;    v |= v &gt;&gt; 2;</div>
-<div class="line"><a name="l04278"></a><span class="lineno"> 4278</span>&#160;    v |= v &gt;&gt; 4;</div>
-<div class="line"><a name="l04279"></a><span class="lineno"> 4279</span>&#160;    v |= v &gt;&gt; 8;</div>
-<div class="line"><a name="l04280"></a><span class="lineno"> 4280</span>&#160;    v |= v &gt;&gt; 16;</div>
-<div class="line"><a name="l04281"></a><span class="lineno"> 4281</span>&#160;    v++;</div>
-<div class="line"><a name="l04282"></a><span class="lineno"> 4282</span>&#160;    <span class="keywordflow">return</span> v;</div>
-<div class="line"><a name="l04283"></a><span class="lineno"> 4283</span>&#160;}</div>
-<div class="line"><a name="l04284"></a><span class="lineno"> 4284</span>&#160;<span class="keyword">static</span> <span class="keyword">inline</span> uint64_t VmaNextPow2(uint64_t v)</div>
-<div class="line"><a name="l04285"></a><span class="lineno"> 4285</span>&#160;{</div>
-<div class="line"><a name="l04286"></a><span class="lineno"> 4286</span>&#160;    v--;</div>
-<div class="line"><a name="l04287"></a><span class="lineno"> 4287</span>&#160;    v |= v &gt;&gt; 1;</div>
-<div class="line"><a name="l04288"></a><span class="lineno"> 4288</span>&#160;    v |= v &gt;&gt; 2;</div>
-<div class="line"><a name="l04289"></a><span class="lineno"> 4289</span>&#160;    v |= v &gt;&gt; 4;</div>
-<div class="line"><a name="l04290"></a><span class="lineno"> 4290</span>&#160;    v |= v &gt;&gt; 8;</div>
-<div class="line"><a name="l04291"></a><span class="lineno"> 4291</span>&#160;    v |= v &gt;&gt; 16;</div>
-<div class="line"><a name="l04292"></a><span class="lineno"> 4292</span>&#160;    v |= v &gt;&gt; 32;</div>
-<div class="line"><a name="l04293"></a><span class="lineno"> 4293</span>&#160;    v++;</div>
-<div class="line"><a name="l04294"></a><span class="lineno"> 4294</span>&#160;    <span class="keywordflow">return</span> v;</div>
-<div class="line"><a name="l04295"></a><span class="lineno"> 4295</span>&#160;}</div>
-<div class="line"><a name="l04296"></a><span class="lineno"> 4296</span>&#160; </div>
-<div class="line"><a name="l04297"></a><span class="lineno"> 4297</span>&#160;<span class="comment">// Returns largest power of 2 less or equal to v.</span></div>
-<div class="line"><a name="l04298"></a><span class="lineno"> 4298</span>&#160;<span class="keyword">static</span> <span class="keyword">inline</span> uint32_t VmaPrevPow2(uint32_t v)</div>
-<div class="line"><a name="l04299"></a><span class="lineno"> 4299</span>&#160;{</div>
-<div class="line"><a name="l04300"></a><span class="lineno"> 4300</span>&#160;    v |= v &gt;&gt; 1;</div>
-<div class="line"><a name="l04301"></a><span class="lineno"> 4301</span>&#160;    v |= v &gt;&gt; 2;</div>
-<div class="line"><a name="l04302"></a><span class="lineno"> 4302</span>&#160;    v |= v &gt;&gt; 4;</div>
-<div class="line"><a name="l04303"></a><span class="lineno"> 4303</span>&#160;    v |= v &gt;&gt; 8;</div>
-<div class="line"><a name="l04304"></a><span class="lineno"> 4304</span>&#160;    v |= v &gt;&gt; 16;</div>
-<div class="line"><a name="l04305"></a><span class="lineno"> 4305</span>&#160;    v = v ^ (v &gt;&gt; 1);</div>
-<div class="line"><a name="l04306"></a><span class="lineno"> 4306</span>&#160;    <span class="keywordflow">return</span> v;</div>
-<div class="line"><a name="l04307"></a><span class="lineno"> 4307</span>&#160;}</div>
-<div class="line"><a name="l04308"></a><span class="lineno"> 4308</span>&#160;<span class="keyword">static</span> <span class="keyword">inline</span> uint64_t VmaPrevPow2(uint64_t v)</div>
-<div class="line"><a name="l04309"></a><span class="lineno"> 4309</span>&#160;{</div>
-<div class="line"><a name="l04310"></a><span class="lineno"> 4310</span>&#160;    v |= v &gt;&gt; 1;</div>
-<div class="line"><a name="l04311"></a><span class="lineno"> 4311</span>&#160;    v |= v &gt;&gt; 2;</div>
-<div class="line"><a name="l04312"></a><span class="lineno"> 4312</span>&#160;    v |= v &gt;&gt; 4;</div>
-<div class="line"><a name="l04313"></a><span class="lineno"> 4313</span>&#160;    v |= v &gt;&gt; 8;</div>
-<div class="line"><a name="l04314"></a><span class="lineno"> 4314</span>&#160;    v |= v &gt;&gt; 16;</div>
-<div class="line"><a name="l04315"></a><span class="lineno"> 4315</span>&#160;    v |= v &gt;&gt; 32;</div>
-<div class="line"><a name="l04316"></a><span class="lineno"> 4316</span>&#160;    v = v ^ (v &gt;&gt; 1);</div>
-<div class="line"><a name="l04317"></a><span class="lineno"> 4317</span>&#160;    <span class="keywordflow">return</span> v;</div>
-<div class="line"><a name="l04318"></a><span class="lineno"> 4318</span>&#160;}</div>
-<div class="line"><a name="l04319"></a><span class="lineno"> 4319</span>&#160; </div>
-<div class="line"><a name="l04320"></a><span class="lineno"> 4320</span>&#160;<span class="keyword">static</span> <span class="keyword">inline</span> <span class="keywordtype">bool</span> VmaStrIsEmpty(<span class="keyword">const</span> <span class="keywordtype">char</span>* pStr)</div>
-<div class="line"><a name="l04321"></a><span class="lineno"> 4321</span>&#160;{</div>
-<div class="line"><a name="l04322"></a><span class="lineno"> 4322</span>&#160;    <span class="keywordflow">return</span> pStr == VMA_NULL || *pStr == <span class="charliteral">&#39;\0&#39;</span>;</div>
-<div class="line"><a name="l04323"></a><span class="lineno"> 4323</span>&#160;}</div>
-<div class="line"><a name="l04324"></a><span class="lineno"> 4324</span>&#160; </div>
-<div class="line"><a name="l04325"></a><span class="lineno"> 4325</span>&#160;<span class="preprocessor">#if VMA_STATS_STRING_ENABLED</span></div>
-<div class="line"><a name="l04326"></a><span class="lineno"> 4326</span>&#160; </div>
-<div class="line"><a name="l04327"></a><span class="lineno"> 4327</span>&#160;<span class="keyword">static</span> <span class="keyword">const</span> <span class="keywordtype">char</span>* VmaAlgorithmToStr(uint32_t algorithm)</div>
-<div class="line"><a name="l04328"></a><span class="lineno"> 4328</span>&#160;{</div>
-<div class="line"><a name="l04329"></a><span class="lineno"> 4329</span>&#160;    <span class="keywordflow">switch</span>(algorithm)</div>
-<div class="line"><a name="l04330"></a><span class="lineno"> 4330</span>&#160;    {</div>
-<div class="line"><a name="l04331"></a><span class="lineno"> 4331</span>&#160;    <span class="keywordflow">case</span> <a class="code" href="vk__mem__alloc_8h.html#a9a7c45f9c863695d98c83fa5ac940fe7a13c8a444197c67866be9cb05599fc726">VMA_POOL_CREATE_LINEAR_ALGORITHM_BIT</a>:</div>
-<div class="line"><a name="l04332"></a><span class="lineno"> 4332</span>&#160;        <span class="keywordflow">return</span> <span class="stringliteral">&quot;Linear&quot;</span>;</div>
-<div class="line"><a name="l04333"></a><span class="lineno"> 4333</span>&#160;    <span class="keywordflow">case</span> <a class="code" href="vk__mem__alloc_8h.html#a9a7c45f9c863695d98c83fa5ac940fe7a97a0dc38e5161b780594d998d313d35e">VMA_POOL_CREATE_BUDDY_ALGORITHM_BIT</a>:</div>
-<div class="line"><a name="l04334"></a><span class="lineno"> 4334</span>&#160;        <span class="keywordflow">return</span> <span class="stringliteral">&quot;Buddy&quot;</span>;</div>
-<div class="line"><a name="l04335"></a><span class="lineno"> 4335</span>&#160;    <span class="keywordflow">case</span> 0:</div>
-<div class="line"><a name="l04336"></a><span class="lineno"> 4336</span>&#160;        <span class="keywordflow">return</span> <span class="stringliteral">&quot;Default&quot;</span>;</div>
-<div class="line"><a name="l04337"></a><span class="lineno"> 4337</span>&#160;    <span class="keywordflow">default</span>:</div>
-<div class="line"><a name="l04338"></a><span class="lineno"> 4338</span>&#160;        VMA_ASSERT(0);</div>
-<div class="line"><a name="l04339"></a><span class="lineno"> 4339</span>&#160;        <span class="keywordflow">return</span> <span class="stringliteral">&quot;&quot;</span>;</div>
-<div class="line"><a name="l04340"></a><span class="lineno"> 4340</span>&#160;    }</div>
-<div class="line"><a name="l04341"></a><span class="lineno"> 4341</span>&#160;}</div>
-<div class="line"><a name="l04342"></a><span class="lineno"> 4342</span>&#160; </div>
-<div class="line"><a name="l04343"></a><span class="lineno"> 4343</span>&#160;<span class="preprocessor">#endif // #if VMA_STATS_STRING_ENABLED</span></div>
-<div class="line"><a name="l04344"></a><span class="lineno"> 4344</span>&#160; </div>
-<div class="line"><a name="l04345"></a><span class="lineno"> 4345</span>&#160;<span class="preprocessor">#ifndef VMA_SORT</span></div>
-<div class="line"><a name="l04346"></a><span class="lineno"> 4346</span>&#160; </div>
-<div class="line"><a name="l04347"></a><span class="lineno"> 4347</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> Iterator, <span class="keyword">typename</span> Compare&gt;</div>
-<div class="line"><a name="l04348"></a><span class="lineno"> 4348</span>&#160;Iterator VmaQuickSortPartition(Iterator beg, Iterator end, Compare cmp)</div>
-<div class="line"><a name="l04349"></a><span class="lineno"> 4349</span>&#160;{</div>
-<div class="line"><a name="l04350"></a><span class="lineno"> 4350</span>&#160;    Iterator centerValue = end; --centerValue;</div>
-<div class="line"><a name="l04351"></a><span class="lineno"> 4351</span>&#160;    Iterator insertIndex = beg;</div>
-<div class="line"><a name="l04352"></a><span class="lineno"> 4352</span>&#160;    <span class="keywordflow">for</span>(Iterator memTypeIndex = beg; memTypeIndex &lt; centerValue; ++memTypeIndex)</div>
-<div class="line"><a name="l04353"></a><span class="lineno"> 4353</span>&#160;    {</div>
-<div class="line"><a name="l04354"></a><span class="lineno"> 4354</span>&#160;        <span class="keywordflow">if</span>(cmp(*memTypeIndex, *centerValue))</div>
-<div class="line"><a name="l04355"></a><span class="lineno"> 4355</span>&#160;        {</div>
-<div class="line"><a name="l04356"></a><span class="lineno"> 4356</span>&#160;            <span class="keywordflow">if</span>(insertIndex != memTypeIndex)</div>
-<div class="line"><a name="l04357"></a><span class="lineno"> 4357</span>&#160;            {</div>
-<div class="line"><a name="l04358"></a><span class="lineno"> 4358</span>&#160;                VMA_SWAP(*memTypeIndex, *insertIndex);</div>
-<div class="line"><a name="l04359"></a><span class="lineno"> 4359</span>&#160;            }</div>
-<div class="line"><a name="l04360"></a><span class="lineno"> 4360</span>&#160;            ++insertIndex;</div>
-<div class="line"><a name="l04361"></a><span class="lineno"> 4361</span>&#160;        }</div>
-<div class="line"><a name="l04362"></a><span class="lineno"> 4362</span>&#160;    }</div>
-<div class="line"><a name="l04363"></a><span class="lineno"> 4363</span>&#160;    <span class="keywordflow">if</span>(insertIndex != centerValue)</div>
-<div class="line"><a name="l04364"></a><span class="lineno"> 4364</span>&#160;    {</div>
-<div class="line"><a name="l04365"></a><span class="lineno"> 4365</span>&#160;        VMA_SWAP(*insertIndex, *centerValue);</div>
-<div class="line"><a name="l04366"></a><span class="lineno"> 4366</span>&#160;    }</div>
-<div class="line"><a name="l04367"></a><span class="lineno"> 4367</span>&#160;    <span class="keywordflow">return</span> insertIndex;</div>
-<div class="line"><a name="l04368"></a><span class="lineno"> 4368</span>&#160;}</div>
-<div class="line"><a name="l04369"></a><span class="lineno"> 4369</span>&#160; </div>
-<div class="line"><a name="l04370"></a><span class="lineno"> 4370</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> Iterator, <span class="keyword">typename</span> Compare&gt;</div>
-<div class="line"><a name="l04371"></a><span class="lineno"> 4371</span>&#160;<span class="keywordtype">void</span> VmaQuickSort(Iterator beg, Iterator end, Compare cmp)</div>
-<div class="line"><a name="l04372"></a><span class="lineno"> 4372</span>&#160;{</div>
-<div class="line"><a name="l04373"></a><span class="lineno"> 4373</span>&#160;    <span class="keywordflow">if</span>(beg &lt; end)</div>
-<div class="line"><a name="l04374"></a><span class="lineno"> 4374</span>&#160;    {</div>
-<div class="line"><a name="l04375"></a><span class="lineno"> 4375</span>&#160;        Iterator it = VmaQuickSortPartition&lt;Iterator, Compare&gt;(beg, end, cmp);</div>
-<div class="line"><a name="l04376"></a><span class="lineno"> 4376</span>&#160;        VmaQuickSort&lt;Iterator, Compare&gt;(beg, it, cmp);</div>
-<div class="line"><a name="l04377"></a><span class="lineno"> 4377</span>&#160;        VmaQuickSort&lt;Iterator, Compare&gt;(it + 1, end, cmp);</div>
-<div class="line"><a name="l04378"></a><span class="lineno"> 4378</span>&#160;    }</div>
-<div class="line"><a name="l04379"></a><span class="lineno"> 4379</span>&#160;}</div>
-<div class="line"><a name="l04380"></a><span class="lineno"> 4380</span>&#160; </div>
-<div class="line"><a name="l04381"></a><span class="lineno"> 4381</span>&#160;<span class="preprocessor">#define VMA_SORT(beg, end, cmp) VmaQuickSort(beg, end, cmp)</span></div>
-<div class="line"><a name="l04382"></a><span class="lineno"> 4382</span>&#160; </div>
-<div class="line"><a name="l04383"></a><span class="lineno"> 4383</span>&#160;<span class="preprocessor">#endif // #ifndef VMA_SORT</span></div>
-<div class="line"><a name="l04384"></a><span class="lineno"> 4384</span>&#160; </div>
-<div class="line"><a name="l04385"></a><span class="lineno"> 4385</span>&#160;<span class="comment">/*</span></div>
-<div class="line"><a name="l04386"></a><span class="lineno"> 4386</span>&#160;<span class="comment">Returns true if two memory blocks occupy overlapping pages.</span></div>
-<div class="line"><a name="l04387"></a><span class="lineno"> 4387</span>&#160;<span class="comment">ResourceA must be in less memory offset than ResourceB.</span></div>
-<div class="line"><a name="l04388"></a><span class="lineno"> 4388</span>&#160;<span class="comment"></span> </div>
-<div class="line"><a name="l04389"></a><span class="lineno"> 4389</span>&#160;<span class="comment">Algorithm is based on &quot;Vulkan 1.0.39 - A Specification (with all registered Vulkan extensions)&quot;</span></div>
-<div class="line"><a name="l04390"></a><span class="lineno"> 4390</span>&#160;<span class="comment">chapter 11.6 &quot;Resource Memory Association&quot;, paragraph &quot;Buffer-Image Granularity&quot;.</span></div>
-<div class="line"><a name="l04391"></a><span class="lineno"> 4391</span>&#160;<span class="comment">*/</span></div>
-<div class="line"><a name="l04392"></a><span class="lineno"> 4392</span>&#160;<span class="keyword">static</span> <span class="keyword">inline</span> <span class="keywordtype">bool</span> VmaBlocksOnSamePage(</div>
-<div class="line"><a name="l04393"></a><span class="lineno"> 4393</span>&#160;    VkDeviceSize resourceAOffset,</div>
-<div class="line"><a name="l04394"></a><span class="lineno"> 4394</span>&#160;    VkDeviceSize resourceASize,</div>
-<div class="line"><a name="l04395"></a><span class="lineno"> 4395</span>&#160;    VkDeviceSize resourceBOffset,</div>
-<div class="line"><a name="l04396"></a><span class="lineno"> 4396</span>&#160;    VkDeviceSize pageSize)</div>
-<div class="line"><a name="l04397"></a><span class="lineno"> 4397</span>&#160;{</div>
-<div class="line"><a name="l04398"></a><span class="lineno"> 4398</span>&#160;    VMA_ASSERT(resourceAOffset + resourceASize &lt;= resourceBOffset &amp;&amp; resourceASize &gt; 0 &amp;&amp; pageSize &gt; 0);</div>
-<div class="line"><a name="l04399"></a><span class="lineno"> 4399</span>&#160;    VkDeviceSize resourceAEnd = resourceAOffset + resourceASize - 1;</div>
-<div class="line"><a name="l04400"></a><span class="lineno"> 4400</span>&#160;    VkDeviceSize resourceAEndPage = resourceAEnd &amp; ~(pageSize - 1);</div>
-<div class="line"><a name="l04401"></a><span class="lineno"> 4401</span>&#160;    VkDeviceSize resourceBStart = resourceBOffset;</div>
-<div class="line"><a name="l04402"></a><span class="lineno"> 4402</span>&#160;    VkDeviceSize resourceBStartPage = resourceBStart &amp; ~(pageSize - 1);</div>
-<div class="line"><a name="l04403"></a><span class="lineno"> 4403</span>&#160;    <span class="keywordflow">return</span> resourceAEndPage == resourceBStartPage;</div>
-<div class="line"><a name="l04404"></a><span class="lineno"> 4404</span>&#160;}</div>
+<div class="line"><a name="l04228"></a><span class="lineno"> 4228</span>&#160;<span class="preprocessor">#ifndef VMA_SWAP</span></div>
+<div class="line"><a name="l04229"></a><span class="lineno"> 4229</span>&#160;<span class="preprocessor">   #define VMA_SWAP(v1, v2)   std::swap((v1), (v2))</span></div>
+<div class="line"><a name="l04230"></a><span class="lineno"> 4230</span>&#160;<span class="preprocessor">#endif</span></div>
+<div class="line"><a name="l04231"></a><span class="lineno"> 4231</span>&#160; </div>
+<div class="line"><a name="l04232"></a><span class="lineno"> 4232</span>&#160;<span class="preprocessor">#ifndef VMA_SORT</span></div>
+<div class="line"><a name="l04233"></a><span class="lineno"> 4233</span>&#160;<span class="preprocessor">   #define VMA_SORT(beg, end, cmp)  std::sort(beg, end, cmp)</span></div>
+<div class="line"><a name="l04234"></a><span class="lineno"> 4234</span>&#160;<span class="preprocessor">#endif</span></div>
+<div class="line"><a name="l04235"></a><span class="lineno"> 4235</span>&#160; </div>
+<div class="line"><a name="l04236"></a><span class="lineno"> 4236</span>&#160;<span class="preprocessor">#ifndef VMA_DEBUG_LOG</span></div>
+<div class="line"><a name="l04237"></a><span class="lineno"> 4237</span>&#160;<span class="preprocessor">   #define VMA_DEBUG_LOG(format, ...)</span></div>
+<div class="line"><a name="l04238"></a><span class="lineno"> 4238</span>&#160;   <span class="comment">/*</span></div>
+<div class="line"><a name="l04239"></a><span class="lineno"> 4239</span>&#160;<span class="comment">   #define VMA_DEBUG_LOG(format, ...) do { \</span></div>
+<div class="line"><a name="l04240"></a><span class="lineno"> 4240</span>&#160;<span class="comment">       printf(format, __VA_ARGS__); \</span></div>
+<div class="line"><a name="l04241"></a><span class="lineno"> 4241</span>&#160;<span class="comment">       printf(&quot;\n&quot;); \</span></div>
+<div class="line"><a name="l04242"></a><span class="lineno"> 4242</span>&#160;<span class="comment">   } while(false)</span></div>
+<div class="line"><a name="l04243"></a><span class="lineno"> 4243</span>&#160;<span class="comment">   */</span></div>
+<div class="line"><a name="l04244"></a><span class="lineno"> 4244</span>&#160;<span class="preprocessor">#endif</span></div>
+<div class="line"><a name="l04245"></a><span class="lineno"> 4245</span>&#160; </div>
+<div class="line"><a name="l04246"></a><span class="lineno"> 4246</span>&#160;<span class="comment">// Define this macro to 1 to enable functions: vmaBuildStatsString, vmaFreeStatsString.</span></div>
+<div class="line"><a name="l04247"></a><span class="lineno"> 4247</span>&#160;<span class="preprocessor">#if VMA_STATS_STRING_ENABLED</span></div>
+<div class="line"><a name="l04248"></a><span class="lineno"> 4248</span>&#160;    <span class="keyword">static</span> <span class="keyword">inline</span> <span class="keywordtype">void</span> VmaUint32ToStr(<span class="keywordtype">char</span>* VMA_NOT_NULL outStr, <span class="keywordtype">size_t</span> strLen, uint32_t num)</div>
+<div class="line"><a name="l04249"></a><span class="lineno"> 4249</span>&#160;    {</div>
+<div class="line"><a name="l04250"></a><span class="lineno"> 4250</span>&#160;        snprintf(outStr, strLen, <span class="stringliteral">&quot;%u&quot;</span>, <span class="keyword">static_cast&lt;</span><span class="keywordtype">unsigned</span> <span class="keywordtype">int</span><span class="keyword">&gt;</span>(num));</div>
+<div class="line"><a name="l04251"></a><span class="lineno"> 4251</span>&#160;    }</div>
+<div class="line"><a name="l04252"></a><span class="lineno"> 4252</span>&#160;    <span class="keyword">static</span> <span class="keyword">inline</span> <span class="keywordtype">void</span> VmaUint64ToStr(<span class="keywordtype">char</span>* VMA_NOT_NULL outStr, <span class="keywordtype">size_t</span> strLen, uint64_t num)</div>
+<div class="line"><a name="l04253"></a><span class="lineno"> 4253</span>&#160;    {</div>
+<div class="line"><a name="l04254"></a><span class="lineno"> 4254</span>&#160;        snprintf(outStr, strLen, <span class="stringliteral">&quot;%llu&quot;</span>, <span class="keyword">static_cast&lt;</span><span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> <span class="keywordtype">long</span><span class="keyword">&gt;</span>(num));</div>
+<div class="line"><a name="l04255"></a><span class="lineno"> 4255</span>&#160;    }</div>
+<div class="line"><a name="l04256"></a><span class="lineno"> 4256</span>&#160;    <span class="keyword">static</span> <span class="keyword">inline</span> <span class="keywordtype">void</span> VmaPtrToStr(<span class="keywordtype">char</span>* VMA_NOT_NULL outStr, <span class="keywordtype">size_t</span> strLen, <span class="keyword">const</span> <span class="keywordtype">void</span>* ptr)</div>
+<div class="line"><a name="l04257"></a><span class="lineno"> 4257</span>&#160;    {</div>
+<div class="line"><a name="l04258"></a><span class="lineno"> 4258</span>&#160;        snprintf(outStr, strLen, <span class="stringliteral">&quot;%p&quot;</span>, ptr);</div>
+<div class="line"><a name="l04259"></a><span class="lineno"> 4259</span>&#160;    }</div>
+<div class="line"><a name="l04260"></a><span class="lineno"> 4260</span>&#160;<span class="preprocessor">#endif</span></div>
+<div class="line"><a name="l04261"></a><span class="lineno"> 4261</span>&#160; </div>
+<div class="line"><a name="l04262"></a><span class="lineno"> 4262</span>&#160;<span class="preprocessor">#ifndef VMA_MUTEX</span></div>
+<div class="line"><a name="l04263"></a><span class="lineno"> 4263</span>&#160;    <span class="keyword">class </span>VmaMutex</div>
+<div class="line"><a name="l04264"></a><span class="lineno"> 4264</span>&#160;    {</div>
+<div class="line"><a name="l04265"></a><span class="lineno"> 4265</span>&#160;    <span class="keyword">public</span>:</div>
+<div class="line"><a name="l04266"></a><span class="lineno"> 4266</span>&#160;        <span class="keywordtype">void</span> Lock() { m_Mutex.lock(); }</div>
+<div class="line"><a name="l04267"></a><span class="lineno"> 4267</span>&#160;        <span class="keywordtype">void</span> Unlock() { m_Mutex.unlock(); }</div>
+<div class="line"><a name="l04268"></a><span class="lineno"> 4268</span>&#160;        <span class="keywordtype">bool</span> TryLock() { <span class="keywordflow">return</span> m_Mutex.try_lock(); }</div>
+<div class="line"><a name="l04269"></a><span class="lineno"> 4269</span>&#160;    <span class="keyword">private</span>:</div>
+<div class="line"><a name="l04270"></a><span class="lineno"> 4270</span>&#160;        std::mutex m_Mutex;</div>
+<div class="line"><a name="l04271"></a><span class="lineno"> 4271</span>&#160;    };</div>
+<div class="line"><a name="l04272"></a><span class="lineno"> 4272</span>&#160;<span class="preprocessor">    #define VMA_MUTEX VmaMutex</span></div>
+<div class="line"><a name="l04273"></a><span class="lineno"> 4273</span>&#160;<span class="preprocessor">#endif</span></div>
+<div class="line"><a name="l04274"></a><span class="lineno"> 4274</span>&#160; </div>
+<div class="line"><a name="l04275"></a><span class="lineno"> 4275</span>&#160;<span class="comment">// Read-write mutex, where &quot;read&quot; is shared access, &quot;write&quot; is exclusive access.</span></div>
+<div class="line"><a name="l04276"></a><span class="lineno"> 4276</span>&#160;<span class="preprocessor">#ifndef VMA_RW_MUTEX</span></div>
+<div class="line"><a name="l04277"></a><span class="lineno"> 4277</span>&#160;<span class="preprocessor">    #if VMA_USE_STL_SHARED_MUTEX</span></div>
+<div class="line"><a name="l04278"></a><span class="lineno"> 4278</span>&#160;        <span class="comment">// Use std::shared_mutex from C++17.</span></div>
+<div class="line"><a name="l04279"></a><span class="lineno"> 4279</span>&#160;<span class="preprocessor">        #include &lt;shared_mutex&gt;</span></div>
+<div class="line"><a name="l04280"></a><span class="lineno"> 4280</span>&#160;        <span class="keyword">class </span>VmaRWMutex</div>
+<div class="line"><a name="l04281"></a><span class="lineno"> 4281</span>&#160;        {</div>
+<div class="line"><a name="l04282"></a><span class="lineno"> 4282</span>&#160;        <span class="keyword">public</span>:</div>
+<div class="line"><a name="l04283"></a><span class="lineno"> 4283</span>&#160;            <span class="keywordtype">void</span> LockRead() { m_Mutex.lock_shared(); }</div>
+<div class="line"><a name="l04284"></a><span class="lineno"> 4284</span>&#160;            <span class="keywordtype">void</span> UnlockRead() { m_Mutex.unlock_shared(); }</div>
+<div class="line"><a name="l04285"></a><span class="lineno"> 4285</span>&#160;            <span class="keywordtype">bool</span> TryLockRead() { <span class="keywordflow">return</span> m_Mutex.try_lock_shared(); }</div>
+<div class="line"><a name="l04286"></a><span class="lineno"> 4286</span>&#160;            <span class="keywordtype">void</span> LockWrite() { m_Mutex.lock(); }</div>
+<div class="line"><a name="l04287"></a><span class="lineno"> 4287</span>&#160;            <span class="keywordtype">void</span> UnlockWrite() { m_Mutex.unlock(); }</div>
+<div class="line"><a name="l04288"></a><span class="lineno"> 4288</span>&#160;            <span class="keywordtype">bool</span> TryLockWrite() { <span class="keywordflow">return</span> m_Mutex.try_lock(); }</div>
+<div class="line"><a name="l04289"></a><span class="lineno"> 4289</span>&#160;        <span class="keyword">private</span>:</div>
+<div class="line"><a name="l04290"></a><span class="lineno"> 4290</span>&#160;            std::shared_mutex m_Mutex;</div>
+<div class="line"><a name="l04291"></a><span class="lineno"> 4291</span>&#160;        };</div>
+<div class="line"><a name="l04292"></a><span class="lineno"> 4292</span>&#160;<span class="preprocessor">        #define VMA_RW_MUTEX VmaRWMutex</span></div>
+<div class="line"><a name="l04293"></a><span class="lineno"> 4293</span>&#160;<span class="preprocessor">    #elif defined(_WIN32) &amp;&amp; defined(WINVER) &amp;&amp; WINVER &gt;= 0x0600</span></div>
+<div class="line"><a name="l04294"></a><span class="lineno"> 4294</span>&#160;        <span class="comment">// Use SRWLOCK from WinAPI.</span></div>
+<div class="line"><a name="l04295"></a><span class="lineno"> 4295</span>&#160;        <span class="comment">// Minimum supported client = Windows Vista, server = Windows Server 2008.</span></div>
+<div class="line"><a name="l04296"></a><span class="lineno"> 4296</span>&#160;        <span class="keyword">class </span>VmaRWMutex</div>
+<div class="line"><a name="l04297"></a><span class="lineno"> 4297</span>&#160;        {</div>
+<div class="line"><a name="l04298"></a><span class="lineno"> 4298</span>&#160;        <span class="keyword">public</span>:</div>
+<div class="line"><a name="l04299"></a><span class="lineno"> 4299</span>&#160;            VmaRWMutex() { InitializeSRWLock(&amp;m_Lock); }</div>
+<div class="line"><a name="l04300"></a><span class="lineno"> 4300</span>&#160;            <span class="keywordtype">void</span> LockRead() { AcquireSRWLockShared(&amp;m_Lock); }</div>
+<div class="line"><a name="l04301"></a><span class="lineno"> 4301</span>&#160;            <span class="keywordtype">void</span> UnlockRead() { ReleaseSRWLockShared(&amp;m_Lock); }</div>
+<div class="line"><a name="l04302"></a><span class="lineno"> 4302</span>&#160;            <span class="keywordtype">bool</span> TryLockRead() { <span class="keywordflow">return</span> TryAcquireSRWLockShared(&amp;m_Lock) != FALSE; }</div>
+<div class="line"><a name="l04303"></a><span class="lineno"> 4303</span>&#160;            <span class="keywordtype">void</span> LockWrite() { AcquireSRWLockExclusive(&amp;m_Lock); }</div>
+<div class="line"><a name="l04304"></a><span class="lineno"> 4304</span>&#160;            <span class="keywordtype">void</span> UnlockWrite() { ReleaseSRWLockExclusive(&amp;m_Lock); }</div>
+<div class="line"><a name="l04305"></a><span class="lineno"> 4305</span>&#160;            <span class="keywordtype">bool</span> TryLockWrite() { <span class="keywordflow">return</span> TryAcquireSRWLockExclusive(&amp;m_Lock) != FALSE; }</div>
+<div class="line"><a name="l04306"></a><span class="lineno"> 4306</span>&#160;        <span class="keyword">private</span>:</div>
+<div class="line"><a name="l04307"></a><span class="lineno"> 4307</span>&#160;            SRWLOCK m_Lock;</div>
+<div class="line"><a name="l04308"></a><span class="lineno"> 4308</span>&#160;        };</div>
+<div class="line"><a name="l04309"></a><span class="lineno"> 4309</span>&#160;<span class="preprocessor">        #define VMA_RW_MUTEX VmaRWMutex</span></div>
+<div class="line"><a name="l04310"></a><span class="lineno"> 4310</span>&#160;<span class="preprocessor">    #else</span></div>
+<div class="line"><a name="l04311"></a><span class="lineno"> 4311</span>&#160;        <span class="comment">// Less efficient fallback: Use normal mutex.</span></div>
+<div class="line"><a name="l04312"></a><span class="lineno"> 4312</span>&#160;        <span class="keyword">class </span>VmaRWMutex</div>
+<div class="line"><a name="l04313"></a><span class="lineno"> 4313</span>&#160;        {</div>
+<div class="line"><a name="l04314"></a><span class="lineno"> 4314</span>&#160;        <span class="keyword">public</span>:</div>
+<div class="line"><a name="l04315"></a><span class="lineno"> 4315</span>&#160;            <span class="keywordtype">void</span> LockRead() { m_Mutex.Lock(); }</div>
+<div class="line"><a name="l04316"></a><span class="lineno"> 4316</span>&#160;            <span class="keywordtype">void</span> UnlockRead() { m_Mutex.Unlock(); }</div>
+<div class="line"><a name="l04317"></a><span class="lineno"> 4317</span>&#160;            <span class="keywordtype">bool</span> TryLockRead() { <span class="keywordflow">return</span> m_Mutex.TryLock(); }</div>
+<div class="line"><a name="l04318"></a><span class="lineno"> 4318</span>&#160;            <span class="keywordtype">void</span> LockWrite() { m_Mutex.Lock(); }</div>
+<div class="line"><a name="l04319"></a><span class="lineno"> 4319</span>&#160;            <span class="keywordtype">void</span> UnlockWrite() { m_Mutex.Unlock(); }</div>
+<div class="line"><a name="l04320"></a><span class="lineno"> 4320</span>&#160;            <span class="keywordtype">bool</span> TryLockWrite() { <span class="keywordflow">return</span> m_Mutex.TryLock(); }</div>
+<div class="line"><a name="l04321"></a><span class="lineno"> 4321</span>&#160;        <span class="keyword">private</span>:</div>
+<div class="line"><a name="l04322"></a><span class="lineno"> 4322</span>&#160;            VMA_MUTEX m_Mutex;</div>
+<div class="line"><a name="l04323"></a><span class="lineno"> 4323</span>&#160;        };</div>
+<div class="line"><a name="l04324"></a><span class="lineno"> 4324</span>&#160;<span class="preprocessor">        #define VMA_RW_MUTEX VmaRWMutex</span></div>
+<div class="line"><a name="l04325"></a><span class="lineno"> 4325</span>&#160;<span class="preprocessor">    #endif </span><span class="comment">// #if VMA_USE_STL_SHARED_MUTEX</span></div>
+<div class="line"><a name="l04326"></a><span class="lineno"> 4326</span>&#160;<span class="preprocessor">#endif </span><span class="comment">// #ifndef VMA_RW_MUTEX</span></div>
+<div class="line"><a name="l04327"></a><span class="lineno"> 4327</span>&#160; </div>
+<div class="line"><a name="l04328"></a><span class="lineno"> 4328</span>&#160;<span class="comment">/*</span></div>
+<div class="line"><a name="l04329"></a><span class="lineno"> 4329</span>&#160;<span class="comment">If providing your own implementation, you need to implement a subset of std::atomic.</span></div>
+<div class="line"><a name="l04330"></a><span class="lineno"> 4330</span>&#160;<span class="comment">*/</span></div>
+<div class="line"><a name="l04331"></a><span class="lineno"> 4331</span>&#160;<span class="preprocessor">#ifndef VMA_ATOMIC_UINT32</span></div>
+<div class="line"><a name="l04332"></a><span class="lineno"> 4332</span>&#160;<span class="preprocessor">    #include &lt;atomic&gt;</span></div>
+<div class="line"><a name="l04333"></a><span class="lineno"> 4333</span>&#160;<span class="preprocessor">    #define VMA_ATOMIC_UINT32 std::atomic&lt;uint32_t&gt;</span></div>
+<div class="line"><a name="l04334"></a><span class="lineno"> 4334</span>&#160;<span class="preprocessor">#endif</span></div>
+<div class="line"><a name="l04335"></a><span class="lineno"> 4335</span>&#160; </div>
+<div class="line"><a name="l04336"></a><span class="lineno"> 4336</span>&#160;<span class="preprocessor">#ifndef VMA_ATOMIC_UINT64</span></div>
+<div class="line"><a name="l04337"></a><span class="lineno"> 4337</span>&#160;<span class="preprocessor">    #include &lt;atomic&gt;</span></div>
+<div class="line"><a name="l04338"></a><span class="lineno"> 4338</span>&#160;<span class="preprocessor">    #define VMA_ATOMIC_UINT64 std::atomic&lt;uint64_t&gt;</span></div>
+<div class="line"><a name="l04339"></a><span class="lineno"> 4339</span>&#160;<span class="preprocessor">#endif</span></div>
+<div class="line"><a name="l04340"></a><span class="lineno"> 4340</span>&#160; </div>
+<div class="line"><a name="l04341"></a><span class="lineno"> 4341</span>&#160;<span class="preprocessor">#ifndef VMA_DEBUG_ALWAYS_DEDICATED_MEMORY</span></div>
+<div class="line"><a name="l04346"></a><span class="lineno"> 4346</span>&#160;<span class="preprocessor">    #define VMA_DEBUG_ALWAYS_DEDICATED_MEMORY (0)</span></div>
+<div class="line"><a name="l04347"></a><span class="lineno"> 4347</span>&#160;<span class="preprocessor">#endif</span></div>
+<div class="line"><a name="l04348"></a><span class="lineno"> 4348</span>&#160; </div>
+<div class="line"><a name="l04349"></a><span class="lineno"> 4349</span>&#160;<span class="preprocessor">#ifndef VMA_DEBUG_ALIGNMENT</span></div>
+<div class="line"><a name="l04354"></a><span class="lineno"> 4354</span>&#160;<span class="preprocessor">    #define VMA_DEBUG_ALIGNMENT (1)</span></div>
+<div class="line"><a name="l04355"></a><span class="lineno"> 4355</span>&#160;<span class="preprocessor">#endif</span></div>
+<div class="line"><a name="l04356"></a><span class="lineno"> 4356</span>&#160; </div>
+<div class="line"><a name="l04357"></a><span class="lineno"> 4357</span>&#160;<span class="preprocessor">#ifndef VMA_DEBUG_MARGIN</span></div>
+<div class="line"><a name="l04362"></a><span class="lineno"> 4362</span>&#160;<span class="preprocessor">    #define VMA_DEBUG_MARGIN (0)</span></div>
+<div class="line"><a name="l04363"></a><span class="lineno"> 4363</span>&#160;<span class="preprocessor">#endif</span></div>
+<div class="line"><a name="l04364"></a><span class="lineno"> 4364</span>&#160; </div>
+<div class="line"><a name="l04365"></a><span class="lineno"> 4365</span>&#160;<span class="preprocessor">#ifndef VMA_DEBUG_INITIALIZE_ALLOCATIONS</span></div>
+<div class="line"><a name="l04370"></a><span class="lineno"> 4370</span>&#160;<span class="preprocessor">    #define VMA_DEBUG_INITIALIZE_ALLOCATIONS (0)</span></div>
+<div class="line"><a name="l04371"></a><span class="lineno"> 4371</span>&#160;<span class="preprocessor">#endif</span></div>
+<div class="line"><a name="l04372"></a><span class="lineno"> 4372</span>&#160; </div>
+<div class="line"><a name="l04373"></a><span class="lineno"> 4373</span>&#160;<span class="preprocessor">#ifndef VMA_DEBUG_DETECT_CORRUPTION</span></div>
+<div class="line"><a name="l04379"></a><span class="lineno"> 4379</span>&#160;<span class="preprocessor">    #define VMA_DEBUG_DETECT_CORRUPTION (0)</span></div>
+<div class="line"><a name="l04380"></a><span class="lineno"> 4380</span>&#160;<span class="preprocessor">#endif</span></div>
+<div class="line"><a name="l04381"></a><span class="lineno"> 4381</span>&#160; </div>
+<div class="line"><a name="l04382"></a><span class="lineno"> 4382</span>&#160;<span class="preprocessor">#ifndef VMA_DEBUG_GLOBAL_MUTEX</span></div>
+<div class="line"><a name="l04387"></a><span class="lineno"> 4387</span>&#160;<span class="preprocessor">    #define VMA_DEBUG_GLOBAL_MUTEX (0)</span></div>
+<div class="line"><a name="l04388"></a><span class="lineno"> 4388</span>&#160;<span class="preprocessor">#endif</span></div>
+<div class="line"><a name="l04389"></a><span class="lineno"> 4389</span>&#160; </div>
+<div class="line"><a name="l04390"></a><span class="lineno"> 4390</span>&#160;<span class="preprocessor">#ifndef VMA_DEBUG_MIN_BUFFER_IMAGE_GRANULARITY</span></div>
+<div class="line"><a name="l04395"></a><span class="lineno"> 4395</span>&#160;<span class="preprocessor">    #define VMA_DEBUG_MIN_BUFFER_IMAGE_GRANULARITY (1)</span></div>
+<div class="line"><a name="l04396"></a><span class="lineno"> 4396</span>&#160;<span class="preprocessor">#endif</span></div>
+<div class="line"><a name="l04397"></a><span class="lineno"> 4397</span>&#160; </div>
+<div class="line"><a name="l04398"></a><span class="lineno"> 4398</span>&#160;<span class="preprocessor">#ifndef VMA_DEBUG_DONT_EXCEED_MAX_MEMORY_ALLOCATION_COUNT</span></div>
+<div class="line"><a name="l04399"></a><span class="lineno"> 4399</span>&#160;    <span class="comment">/*</span></div>
+<div class="line"><a name="l04400"></a><span class="lineno"> 4400</span>&#160;<span class="comment">    Set this to 1 to make VMA never exceed VkPhysicalDeviceLimits::maxMemoryAllocationCount</span></div>
+<div class="line"><a name="l04401"></a><span class="lineno"> 4401</span>&#160;<span class="comment">    and return error instead of leaving up to Vulkan implementation what to do in such cases.</span></div>
+<div class="line"><a name="l04402"></a><span class="lineno"> 4402</span>&#160;<span class="comment">    */</span></div>
+<div class="line"><a name="l04403"></a><span class="lineno"> 4403</span>&#160;<span class="preprocessor">    #define VMA_DEBUG_DONT_EXCEED_MAX_MEMORY_ALLOCATION_COUNT (0)</span></div>
+<div class="line"><a name="l04404"></a><span class="lineno"> 4404</span>&#160;<span class="preprocessor">#endif</span></div>
 <div class="line"><a name="l04405"></a><span class="lineno"> 4405</span>&#160; </div>
-<div class="line"><a name="l04406"></a><span class="lineno"> 4406</span>&#160;<span class="keyword">enum</span> VmaSuballocationType</div>
-<div class="line"><a name="l04407"></a><span class="lineno"> 4407</span>&#160;{</div>
-<div class="line"><a name="l04408"></a><span class="lineno"> 4408</span>&#160;    VMA_SUBALLOCATION_TYPE_FREE = 0,</div>
-<div class="line"><a name="l04409"></a><span class="lineno"> 4409</span>&#160;    VMA_SUBALLOCATION_TYPE_UNKNOWN = 1,</div>
-<div class="line"><a name="l04410"></a><span class="lineno"> 4410</span>&#160;    VMA_SUBALLOCATION_TYPE_BUFFER = 2,</div>
-<div class="line"><a name="l04411"></a><span class="lineno"> 4411</span>&#160;    VMA_SUBALLOCATION_TYPE_IMAGE_UNKNOWN = 3,</div>
-<div class="line"><a name="l04412"></a><span class="lineno"> 4412</span>&#160;    VMA_SUBALLOCATION_TYPE_IMAGE_LINEAR = 4,</div>
-<div class="line"><a name="l04413"></a><span class="lineno"> 4413</span>&#160;    VMA_SUBALLOCATION_TYPE_IMAGE_OPTIMAL = 5,</div>
-<div class="line"><a name="l04414"></a><span class="lineno"> 4414</span>&#160;    VMA_SUBALLOCATION_TYPE_MAX_ENUM = 0x7FFFFFFF</div>
-<div class="line"><a name="l04415"></a><span class="lineno"> 4415</span>&#160;};</div>
-<div class="line"><a name="l04416"></a><span class="lineno"> 4416</span>&#160; </div>
-<div class="line"><a name="l04417"></a><span class="lineno"> 4417</span>&#160;<span class="comment">/*</span></div>
-<div class="line"><a name="l04418"></a><span class="lineno"> 4418</span>&#160;<span class="comment">Returns true if given suballocation types could conflict and must respect</span></div>
-<div class="line"><a name="l04419"></a><span class="lineno"> 4419</span>&#160;<span class="comment">VkPhysicalDeviceLimits::bufferImageGranularity. They conflict if one is buffer</span></div>
-<div class="line"><a name="l04420"></a><span class="lineno"> 4420</span>&#160;<span class="comment">or linear image and another one is optimal image. If type is unknown, behave</span></div>
-<div class="line"><a name="l04421"></a><span class="lineno"> 4421</span>&#160;<span class="comment">conservatively.</span></div>
-<div class="line"><a name="l04422"></a><span class="lineno"> 4422</span>&#160;<span class="comment">*/</span></div>
-<div class="line"><a name="l04423"></a><span class="lineno"> 4423</span>&#160;<span class="keyword">static</span> <span class="keyword">inline</span> <span class="keywordtype">bool</span> VmaIsBufferImageGranularityConflict(</div>
-<div class="line"><a name="l04424"></a><span class="lineno"> 4424</span>&#160;    VmaSuballocationType suballocType1,</div>
-<div class="line"><a name="l04425"></a><span class="lineno"> 4425</span>&#160;    VmaSuballocationType suballocType2)</div>
-<div class="line"><a name="l04426"></a><span class="lineno"> 4426</span>&#160;{</div>
-<div class="line"><a name="l04427"></a><span class="lineno"> 4427</span>&#160;    <span class="keywordflow">if</span>(suballocType1 &gt; suballocType2)</div>
-<div class="line"><a name="l04428"></a><span class="lineno"> 4428</span>&#160;    {</div>
-<div class="line"><a name="l04429"></a><span class="lineno"> 4429</span>&#160;        VMA_SWAP(suballocType1, suballocType2);</div>
-<div class="line"><a name="l04430"></a><span class="lineno"> 4430</span>&#160;    }</div>
-<div class="line"><a name="l04431"></a><span class="lineno"> 4431</span>&#160;    </div>
-<div class="line"><a name="l04432"></a><span class="lineno"> 4432</span>&#160;    <span class="keywordflow">switch</span>(suballocType1)</div>
-<div class="line"><a name="l04433"></a><span class="lineno"> 4433</span>&#160;    {</div>
-<div class="line"><a name="l04434"></a><span class="lineno"> 4434</span>&#160;    <span class="keywordflow">case</span> VMA_SUBALLOCATION_TYPE_FREE:</div>
-<div class="line"><a name="l04435"></a><span class="lineno"> 4435</span>&#160;        <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
-<div class="line"><a name="l04436"></a><span class="lineno"> 4436</span>&#160;    <span class="keywordflow">case</span> VMA_SUBALLOCATION_TYPE_UNKNOWN:</div>
-<div class="line"><a name="l04437"></a><span class="lineno"> 4437</span>&#160;        <span class="keywordflow">return</span> <span class="keyword">true</span>;</div>
-<div class="line"><a name="l04438"></a><span class="lineno"> 4438</span>&#160;    <span class="keywordflow">case</span> VMA_SUBALLOCATION_TYPE_BUFFER:</div>
-<div class="line"><a name="l04439"></a><span class="lineno"> 4439</span>&#160;        <span class="keywordflow">return</span></div>
-<div class="line"><a name="l04440"></a><span class="lineno"> 4440</span>&#160;            suballocType2 == VMA_SUBALLOCATION_TYPE_IMAGE_UNKNOWN ||</div>
-<div class="line"><a name="l04441"></a><span class="lineno"> 4441</span>&#160;            suballocType2 == VMA_SUBALLOCATION_TYPE_IMAGE_OPTIMAL;</div>
-<div class="line"><a name="l04442"></a><span class="lineno"> 4442</span>&#160;    <span class="keywordflow">case</span> VMA_SUBALLOCATION_TYPE_IMAGE_UNKNOWN:</div>
-<div class="line"><a name="l04443"></a><span class="lineno"> 4443</span>&#160;        <span class="keywordflow">return</span></div>
-<div class="line"><a name="l04444"></a><span class="lineno"> 4444</span>&#160;            suballocType2 == VMA_SUBALLOCATION_TYPE_IMAGE_UNKNOWN ||</div>
-<div class="line"><a name="l04445"></a><span class="lineno"> 4445</span>&#160;            suballocType2 == VMA_SUBALLOCATION_TYPE_IMAGE_LINEAR ||</div>
-<div class="line"><a name="l04446"></a><span class="lineno"> 4446</span>&#160;            suballocType2 == VMA_SUBALLOCATION_TYPE_IMAGE_OPTIMAL;</div>
-<div class="line"><a name="l04447"></a><span class="lineno"> 4447</span>&#160;    <span class="keywordflow">case</span> VMA_SUBALLOCATION_TYPE_IMAGE_LINEAR:</div>
-<div class="line"><a name="l04448"></a><span class="lineno"> 4448</span>&#160;        <span class="keywordflow">return</span></div>
-<div class="line"><a name="l04449"></a><span class="lineno"> 4449</span>&#160;            suballocType2 == VMA_SUBALLOCATION_TYPE_IMAGE_OPTIMAL;</div>
-<div class="line"><a name="l04450"></a><span class="lineno"> 4450</span>&#160;    <span class="keywordflow">case</span> VMA_SUBALLOCATION_TYPE_IMAGE_OPTIMAL:</div>
-<div class="line"><a name="l04451"></a><span class="lineno"> 4451</span>&#160;        <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
-<div class="line"><a name="l04452"></a><span class="lineno"> 4452</span>&#160;    <span class="keywordflow">default</span>:</div>
-<div class="line"><a name="l04453"></a><span class="lineno"> 4453</span>&#160;        VMA_ASSERT(0);</div>
-<div class="line"><a name="l04454"></a><span class="lineno"> 4454</span>&#160;        <span class="keywordflow">return</span> <span class="keyword">true</span>;</div>
-<div class="line"><a name="l04455"></a><span class="lineno"> 4455</span>&#160;    }</div>
-<div class="line"><a name="l04456"></a><span class="lineno"> 4456</span>&#160;}</div>
-<div class="line"><a name="l04457"></a><span class="lineno"> 4457</span>&#160; </div>
-<div class="line"><a name="l04458"></a><span class="lineno"> 4458</span>&#160;<span class="keyword">static</span> <span class="keywordtype">void</span> VmaWriteMagicValue(<span class="keywordtype">void</span>* pData, VkDeviceSize offset)</div>
-<div class="line"><a name="l04459"></a><span class="lineno"> 4459</span>&#160;{</div>
-<div class="line"><a name="l04460"></a><span class="lineno"> 4460</span>&#160;<span class="preprocessor">#if VMA_DEBUG_MARGIN &gt; 0 &amp;&amp; VMA_DEBUG_DETECT_CORRUPTION</span></div>
-<div class="line"><a name="l04461"></a><span class="lineno"> 4461</span>&#160;    uint32_t* pDst = (uint32_t*)((<span class="keywordtype">char</span>*)pData + offset);</div>
-<div class="line"><a name="l04462"></a><span class="lineno"> 4462</span>&#160;    <span class="keyword">const</span> <span class="keywordtype">size_t</span> numberCount = VMA_DEBUG_MARGIN / <span class="keyword">sizeof</span>(uint32_t);</div>
-<div class="line"><a name="l04463"></a><span class="lineno"> 4463</span>&#160;    <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> i = 0; i &lt; numberCount; ++i, ++pDst)</div>
-<div class="line"><a name="l04464"></a><span class="lineno"> 4464</span>&#160;    {</div>
-<div class="line"><a name="l04465"></a><span class="lineno"> 4465</span>&#160;        *pDst = VMA_CORRUPTION_DETECTION_MAGIC_VALUE;</div>
-<div class="line"><a name="l04466"></a><span class="lineno"> 4466</span>&#160;    }</div>
-<div class="line"><a name="l04467"></a><span class="lineno"> 4467</span>&#160;<span class="preprocessor">#else</span></div>
-<div class="line"><a name="l04468"></a><span class="lineno"> 4468</span>&#160;    <span class="comment">// no-op</span></div>
-<div class="line"><a name="l04469"></a><span class="lineno"> 4469</span>&#160;<span class="preprocessor">#endif</span></div>
-<div class="line"><a name="l04470"></a><span class="lineno"> 4470</span>&#160;}</div>
-<div class="line"><a name="l04471"></a><span class="lineno"> 4471</span>&#160; </div>
-<div class="line"><a name="l04472"></a><span class="lineno"> 4472</span>&#160;<span class="keyword">static</span> <span class="keywordtype">bool</span> VmaValidateMagicValue(<span class="keyword">const</span> <span class="keywordtype">void</span>* pData, VkDeviceSize offset)</div>
-<div class="line"><a name="l04473"></a><span class="lineno"> 4473</span>&#160;{</div>
-<div class="line"><a name="l04474"></a><span class="lineno"> 4474</span>&#160;<span class="preprocessor">#if VMA_DEBUG_MARGIN &gt; 0 &amp;&amp; VMA_DEBUG_DETECT_CORRUPTION</span></div>
-<div class="line"><a name="l04475"></a><span class="lineno"> 4475</span>&#160;    <span class="keyword">const</span> uint32_t* pSrc = (<span class="keyword">const</span> uint32_t*)((<span class="keyword">const</span> <span class="keywordtype">char</span>*)pData + offset);</div>
-<div class="line"><a name="l04476"></a><span class="lineno"> 4476</span>&#160;    <span class="keyword">const</span> <span class="keywordtype">size_t</span> numberCount = VMA_DEBUG_MARGIN / <span class="keyword">sizeof</span>(uint32_t);</div>
-<div class="line"><a name="l04477"></a><span class="lineno"> 4477</span>&#160;    <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> i = 0; i &lt; numberCount; ++i, ++pSrc)</div>
-<div class="line"><a name="l04478"></a><span class="lineno"> 4478</span>&#160;    {</div>
-<div class="line"><a name="l04479"></a><span class="lineno"> 4479</span>&#160;        <span class="keywordflow">if</span>(*pSrc != VMA_CORRUPTION_DETECTION_MAGIC_VALUE)</div>
-<div class="line"><a name="l04480"></a><span class="lineno"> 4480</span>&#160;        {</div>
-<div class="line"><a name="l04481"></a><span class="lineno"> 4481</span>&#160;            <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
-<div class="line"><a name="l04482"></a><span class="lineno"> 4482</span>&#160;        }</div>
-<div class="line"><a name="l04483"></a><span class="lineno"> 4483</span>&#160;    }</div>
-<div class="line"><a name="l04484"></a><span class="lineno"> 4484</span>&#160;<span class="preprocessor">#endif</span></div>
-<div class="line"><a name="l04485"></a><span class="lineno"> 4485</span>&#160;    <span class="keywordflow">return</span> <span class="keyword">true</span>;</div>
-<div class="line"><a name="l04486"></a><span class="lineno"> 4486</span>&#160;}</div>
-<div class="line"><a name="l04487"></a><span class="lineno"> 4487</span>&#160; </div>
-<div class="line"><a name="l04488"></a><span class="lineno"> 4488</span>&#160;<span class="comment">/*</span></div>
-<div class="line"><a name="l04489"></a><span class="lineno"> 4489</span>&#160;<span class="comment">Fills structure with parameters of an example buffer to be used for transfers</span></div>
-<div class="line"><a name="l04490"></a><span class="lineno"> 4490</span>&#160;<span class="comment">during GPU memory defragmentation.</span></div>
-<div class="line"><a name="l04491"></a><span class="lineno"> 4491</span>&#160;<span class="comment">*/</span></div>
-<div class="line"><a name="l04492"></a><span class="lineno"> 4492</span>&#160;<span class="keyword">static</span> <span class="keywordtype">void</span> VmaFillGpuDefragmentationBufferCreateInfo(VkBufferCreateInfo&amp; outBufCreateInfo)</div>
-<div class="line"><a name="l04493"></a><span class="lineno"> 4493</span>&#160;{</div>
-<div class="line"><a name="l04494"></a><span class="lineno"> 4494</span>&#160;    memset(&amp;outBufCreateInfo, 0, <span class="keyword">sizeof</span>(outBufCreateInfo));</div>
-<div class="line"><a name="l04495"></a><span class="lineno"> 4495</span>&#160;    outBufCreateInfo.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;</div>
-<div class="line"><a name="l04496"></a><span class="lineno"> 4496</span>&#160;    outBufCreateInfo.usage = VK_BUFFER_USAGE_TRANSFER_SRC_BIT | VK_BUFFER_USAGE_TRANSFER_DST_BIT;</div>
-<div class="line"><a name="l04497"></a><span class="lineno"> 4497</span>&#160;    outBufCreateInfo.size = (VkDeviceSize)VMA_DEFAULT_LARGE_HEAP_BLOCK_SIZE; <span class="comment">// Example size.</span></div>
-<div class="line"><a name="l04498"></a><span class="lineno"> 4498</span>&#160;}</div>
-<div class="line"><a name="l04499"></a><span class="lineno"> 4499</span>&#160; </div>
-<div class="line"><a name="l04500"></a><span class="lineno"> 4500</span>&#160;<span class="comment">// Helper RAII class to lock a mutex in constructor and unlock it in destructor (at the end of scope).</span></div>
-<div class="line"><a name="l04501"></a><span class="lineno"> 4501</span>&#160;<span class="keyword">struct </span>VmaMutexLock</div>
-<div class="line"><a name="l04502"></a><span class="lineno"> 4502</span>&#160;{</div>
-<div class="line"><a name="l04503"></a><span class="lineno"> 4503</span>&#160;    VMA_CLASS_NO_COPY(VmaMutexLock)</div>
-<div class="line"><a name="l04504"></a><span class="lineno"> 4504</span>&#160;<span class="keyword">public</span>:</div>
-<div class="line"><a name="l04505"></a><span class="lineno"> 4505</span>&#160;    VmaMutexLock(VMA_MUTEX&amp; mutex, <span class="keywordtype">bool</span> useMutex = <span class="keyword">true</span>) :</div>
-<div class="line"><a name="l04506"></a><span class="lineno"> 4506</span>&#160;        m_pMutex(useMutex ? &amp;mutex : VMA_NULL)</div>
-<div class="line"><a name="l04507"></a><span class="lineno"> 4507</span>&#160;    { <span class="keywordflow">if</span>(m_pMutex) { m_pMutex-&gt;Lock(); } }</div>
-<div class="line"><a name="l04508"></a><span class="lineno"> 4508</span>&#160;    ~VmaMutexLock()</div>
-<div class="line"><a name="l04509"></a><span class="lineno"> 4509</span>&#160;    { <span class="keywordflow">if</span>(m_pMutex) { m_pMutex-&gt;Unlock(); } }</div>
-<div class="line"><a name="l04510"></a><span class="lineno"> 4510</span>&#160;<span class="keyword">private</span>:</div>
-<div class="line"><a name="l04511"></a><span class="lineno"> 4511</span>&#160;    VMA_MUTEX* m_pMutex;</div>
-<div class="line"><a name="l04512"></a><span class="lineno"> 4512</span>&#160;};</div>
-<div class="line"><a name="l04513"></a><span class="lineno"> 4513</span>&#160; </div>
-<div class="line"><a name="l04514"></a><span class="lineno"> 4514</span>&#160;<span class="comment">// Helper RAII class to lock a RW mutex in constructor and unlock it in destructor (at the end of scope), for reading.</span></div>
-<div class="line"><a name="l04515"></a><span class="lineno"> 4515</span>&#160;<span class="keyword">struct </span>VmaMutexLockRead</div>
-<div class="line"><a name="l04516"></a><span class="lineno"> 4516</span>&#160;{</div>
-<div class="line"><a name="l04517"></a><span class="lineno"> 4517</span>&#160;    VMA_CLASS_NO_COPY(VmaMutexLockRead)</div>
-<div class="line"><a name="l04518"></a><span class="lineno"> 4518</span>&#160;<span class="keyword">public</span>:</div>
-<div class="line"><a name="l04519"></a><span class="lineno"> 4519</span>&#160;    VmaMutexLockRead(VMA_RW_MUTEX&amp; mutex, <span class="keywordtype">bool</span> useMutex) :</div>
-<div class="line"><a name="l04520"></a><span class="lineno"> 4520</span>&#160;        m_pMutex(useMutex ? &amp;mutex : VMA_NULL)</div>
-<div class="line"><a name="l04521"></a><span class="lineno"> 4521</span>&#160;    { <span class="keywordflow">if</span>(m_pMutex) { m_pMutex-&gt;LockRead(); } }</div>
-<div class="line"><a name="l04522"></a><span class="lineno"> 4522</span>&#160;    ~VmaMutexLockRead() { <span class="keywordflow">if</span>(m_pMutex) { m_pMutex-&gt;UnlockRead(); } }</div>
-<div class="line"><a name="l04523"></a><span class="lineno"> 4523</span>&#160;<span class="keyword">private</span>:</div>
-<div class="line"><a name="l04524"></a><span class="lineno"> 4524</span>&#160;    VMA_RW_MUTEX* m_pMutex;</div>
-<div class="line"><a name="l04525"></a><span class="lineno"> 4525</span>&#160;};</div>
-<div class="line"><a name="l04526"></a><span class="lineno"> 4526</span>&#160; </div>
-<div class="line"><a name="l04527"></a><span class="lineno"> 4527</span>&#160;<span class="comment">// Helper RAII class to lock a RW mutex in constructor and unlock it in destructor (at the end of scope), for writing.</span></div>
-<div class="line"><a name="l04528"></a><span class="lineno"> 4528</span>&#160;<span class="keyword">struct </span>VmaMutexLockWrite</div>
+<div class="line"><a name="l04406"></a><span class="lineno"> 4406</span>&#160;<span class="preprocessor">#ifndef VMA_SMALL_HEAP_MAX_SIZE</span></div>
+<div class="line"><a name="l04408"></a><span class="lineno"> 4408</span>&#160;<span class="preprocessor">   #define VMA_SMALL_HEAP_MAX_SIZE (1024ull * 1024 * 1024)</span></div>
+<div class="line"><a name="l04409"></a><span class="lineno"> 4409</span>&#160;<span class="preprocessor">#endif</span></div>
+<div class="line"><a name="l04410"></a><span class="lineno"> 4410</span>&#160; </div>
+<div class="line"><a name="l04411"></a><span class="lineno"> 4411</span>&#160;<span class="preprocessor">#ifndef VMA_DEFAULT_LARGE_HEAP_BLOCK_SIZE</span></div>
+<div class="line"><a name="l04413"></a><span class="lineno"> 4413</span>&#160;<span class="preprocessor">   #define VMA_DEFAULT_LARGE_HEAP_BLOCK_SIZE (256ull * 1024 * 1024)</span></div>
+<div class="line"><a name="l04414"></a><span class="lineno"> 4414</span>&#160;<span class="preprocessor">#endif</span></div>
+<div class="line"><a name="l04415"></a><span class="lineno"> 4415</span>&#160; </div>
+<div class="line"><a name="l04416"></a><span class="lineno"> 4416</span>&#160;<span class="preprocessor">#ifndef VMA_CLASS_NO_COPY</span></div>
+<div class="line"><a name="l04417"></a><span class="lineno"> 4417</span>&#160;<span class="preprocessor">    #define VMA_CLASS_NO_COPY(className) \</span></div>
+<div class="line"><a name="l04418"></a><span class="lineno"> 4418</span>&#160;<span class="preprocessor">        private: \</span></div>
+<div class="line"><a name="l04419"></a><span class="lineno"> 4419</span>&#160;<span class="preprocessor">            className(const className&amp;) = delete; \</span></div>
+<div class="line"><a name="l04420"></a><span class="lineno"> 4420</span>&#160;<span class="preprocessor">            className&amp; operator=(const className&amp;) = delete;</span></div>
+<div class="line"><a name="l04421"></a><span class="lineno"> 4421</span>&#160;<span class="preprocessor">#endif</span></div>
+<div class="line"><a name="l04422"></a><span class="lineno"> 4422</span>&#160; </div>
+<div class="line"><a name="l04423"></a><span class="lineno"> 4423</span>&#160;<span class="keyword">static</span> <span class="keyword">const</span> uint32_t VMA_FRAME_INDEX_LOST = UINT32_MAX;</div>
+<div class="line"><a name="l04424"></a><span class="lineno"> 4424</span>&#160; </div>
+<div class="line"><a name="l04425"></a><span class="lineno"> 4425</span>&#160;<span class="comment">// Decimal 2139416166, float NaN, little-endian binary 66 E6 84 7F.</span></div>
+<div class="line"><a name="l04426"></a><span class="lineno"> 4426</span>&#160;<span class="keyword">static</span> <span class="keyword">const</span> uint32_t VMA_CORRUPTION_DETECTION_MAGIC_VALUE = 0x7F84E666;</div>
+<div class="line"><a name="l04427"></a><span class="lineno"> 4427</span>&#160; </div>
+<div class="line"><a name="l04428"></a><span class="lineno"> 4428</span>&#160;<span class="keyword">static</span> <span class="keyword">const</span> uint8_t VMA_ALLOCATION_FILL_PATTERN_CREATED   = 0xDC;</div>
+<div class="line"><a name="l04429"></a><span class="lineno"> 4429</span>&#160;<span class="keyword">static</span> <span class="keyword">const</span> uint8_t VMA_ALLOCATION_FILL_PATTERN_DESTROYED = 0xEF;</div>
+<div class="line"><a name="l04430"></a><span class="lineno"> 4430</span>&#160; </div>
+<div class="line"><a name="l04431"></a><span class="lineno"> 4431</span>&#160;<span class="comment">/*******************************************************************************</span></div>
+<div class="line"><a name="l04432"></a><span class="lineno"> 4432</span>&#160;<span class="comment">END OF CONFIGURATION</span></div>
+<div class="line"><a name="l04433"></a><span class="lineno"> 4433</span>&#160;<span class="comment">*/</span></div>
+<div class="line"><a name="l04434"></a><span class="lineno"> 4434</span>&#160; </div>
+<div class="line"><a name="l04435"></a><span class="lineno"> 4435</span>&#160;<span class="comment">// # Copy of some Vulkan definitions so we don&#39;t need to check their existence just to handle few constants.</span></div>
+<div class="line"><a name="l04436"></a><span class="lineno"> 4436</span>&#160; </div>
+<div class="line"><a name="l04437"></a><span class="lineno"> 4437</span>&#160;<span class="keyword">static</span> <span class="keyword">const</span> uint32_t VK_MEMORY_PROPERTY_DEVICE_COHERENT_BIT_AMD_COPY = 0x00000040;</div>
+<div class="line"><a name="l04438"></a><span class="lineno"> 4438</span>&#160;<span class="keyword">static</span> <span class="keyword">const</span> uint32_t VK_MEMORY_PROPERTY_DEVICE_UNCACHED_BIT_AMD_COPY = 0x00000080;</div>
+<div class="line"><a name="l04439"></a><span class="lineno"> 4439</span>&#160;<span class="keyword">static</span> <span class="keyword">const</span> uint32_t VK_BUFFER_USAGE_SHADER_DEVICE_ADDRESS_BIT_COPY = 0x00020000;</div>
+<div class="line"><a name="l04440"></a><span class="lineno"> 4440</span>&#160; </div>
+<div class="line"><a name="l04441"></a><span class="lineno"> 4441</span>&#160;<span class="keyword">static</span> <span class="keyword">const</span> uint32_t VMA_ALLOCATION_INTERNAL_STRATEGY_MIN_OFFSET = 0x10000000u;</div>
+<div class="line"><a name="l04442"></a><span class="lineno"> 4442</span>&#160; </div>
+<div class="line"><a name="l04443"></a><span class="lineno"> 4443</span>&#160;<span class="keyword">static</span> VkAllocationCallbacks VmaEmptyAllocationCallbacks = {</div>
+<div class="line"><a name="l04444"></a><span class="lineno"> 4444</span>&#160;    VMA_NULL, VMA_NULL, VMA_NULL, VMA_NULL, VMA_NULL, VMA_NULL };</div>
+<div class="line"><a name="l04445"></a><span class="lineno"> 4445</span>&#160; </div>
+<div class="line"><a name="l04446"></a><span class="lineno"> 4446</span>&#160;<span class="comment">// Returns number of bits set to 1 in (v).</span></div>
+<div class="line"><a name="l04447"></a><span class="lineno"> 4447</span>&#160;<span class="keyword">static</span> <span class="keyword">inline</span> uint32_t VmaCountBitsSet(uint32_t v)</div>
+<div class="line"><a name="l04448"></a><span class="lineno"> 4448</span>&#160;{</div>
+<div class="line"><a name="l04449"></a><span class="lineno"> 4449</span>&#160;    uint32_t c = v - ((v &gt;&gt; 1) &amp; 0x55555555);</div>
+<div class="line"><a name="l04450"></a><span class="lineno"> 4450</span>&#160;    c = ((c &gt;&gt;  2) &amp; 0x33333333) + (c &amp; 0x33333333);</div>
+<div class="line"><a name="l04451"></a><span class="lineno"> 4451</span>&#160;    c = ((c &gt;&gt;  4) + c) &amp; 0x0F0F0F0F;</div>
+<div class="line"><a name="l04452"></a><span class="lineno"> 4452</span>&#160;    c = ((c &gt;&gt;  8) + c) &amp; 0x00FF00FF;</div>
+<div class="line"><a name="l04453"></a><span class="lineno"> 4453</span>&#160;    c = ((c &gt;&gt; 16) + c) &amp; 0x0000FFFF;</div>
+<div class="line"><a name="l04454"></a><span class="lineno"> 4454</span>&#160;    <span class="keywordflow">return</span> c;</div>
+<div class="line"><a name="l04455"></a><span class="lineno"> 4455</span>&#160;}</div>
+<div class="line"><a name="l04456"></a><span class="lineno"> 4456</span>&#160; </div>
+<div class="line"><a name="l04457"></a><span class="lineno"> 4457</span>&#160;<span class="comment">/*</span></div>
+<div class="line"><a name="l04458"></a><span class="lineno"> 4458</span>&#160;<span class="comment">Returns true if given number is a power of two.</span></div>
+<div class="line"><a name="l04459"></a><span class="lineno"> 4459</span>&#160;<span class="comment">T must be unsigned integer number or signed integer but always nonnegative.</span></div>
+<div class="line"><a name="l04460"></a><span class="lineno"> 4460</span>&#160;<span class="comment">For 0 returns true.</span></div>
+<div class="line"><a name="l04461"></a><span class="lineno"> 4461</span>&#160;<span class="comment">*/</span></div>
+<div class="line"><a name="l04462"></a><span class="lineno"> 4462</span>&#160;<span class="keyword">template</span> &lt;<span class="keyword">typename</span> T&gt;</div>
+<div class="line"><a name="l04463"></a><span class="lineno"> 4463</span>&#160;<span class="keyword">inline</span> <span class="keywordtype">bool</span> VmaIsPow2(T x)</div>
+<div class="line"><a name="l04464"></a><span class="lineno"> 4464</span>&#160;{</div>
+<div class="line"><a name="l04465"></a><span class="lineno"> 4465</span>&#160;    <span class="keywordflow">return</span> (x &amp; (x-1)) == 0;</div>
+<div class="line"><a name="l04466"></a><span class="lineno"> 4466</span>&#160;}</div>
+<div class="line"><a name="l04467"></a><span class="lineno"> 4467</span>&#160; </div>
+<div class="line"><a name="l04468"></a><span class="lineno"> 4468</span>&#160;<span class="comment">// Aligns given value up to nearest multiply of align value. For example: VmaAlignUp(11, 8) = 16.</span></div>
+<div class="line"><a name="l04469"></a><span class="lineno"> 4469</span>&#160;<span class="comment">// Use types like uint32_t, uint64_t as T.</span></div>
+<div class="line"><a name="l04470"></a><span class="lineno"> 4470</span>&#160;<span class="keyword">template</span> &lt;<span class="keyword">typename</span> T&gt;</div>
+<div class="line"><a name="l04471"></a><span class="lineno"> 4471</span>&#160;<span class="keyword">static</span> <span class="keyword">inline</span> T VmaAlignUp(T val, T alignment)</div>
+<div class="line"><a name="l04472"></a><span class="lineno"> 4472</span>&#160;{</div>
+<div class="line"><a name="l04473"></a><span class="lineno"> 4473</span>&#160;    VMA_HEAVY_ASSERT(VmaIsPow2(alignment));</div>
+<div class="line"><a name="l04474"></a><span class="lineno"> 4474</span>&#160;    <span class="keywordflow">return</span> (val + alignment - 1) &amp; ~(alignment - 1);</div>
+<div class="line"><a name="l04475"></a><span class="lineno"> 4475</span>&#160;}</div>
+<div class="line"><a name="l04476"></a><span class="lineno"> 4476</span>&#160;<span class="comment">// Aligns given value down to nearest multiply of align value. For example: VmaAlignUp(11, 8) = 8.</span></div>
+<div class="line"><a name="l04477"></a><span class="lineno"> 4477</span>&#160;<span class="comment">// Use types like uint32_t, uint64_t as T.</span></div>
+<div class="line"><a name="l04478"></a><span class="lineno"> 4478</span>&#160;<span class="keyword">template</span> &lt;<span class="keyword">typename</span> T&gt;</div>
+<div class="line"><a name="l04479"></a><span class="lineno"> 4479</span>&#160;<span class="keyword">static</span> <span class="keyword">inline</span> T VmaAlignDown(T val, T alignment)</div>
+<div class="line"><a name="l04480"></a><span class="lineno"> 4480</span>&#160;{</div>
+<div class="line"><a name="l04481"></a><span class="lineno"> 4481</span>&#160;    VMA_HEAVY_ASSERT(VmaIsPow2(alignment));</div>
+<div class="line"><a name="l04482"></a><span class="lineno"> 4482</span>&#160;    <span class="keywordflow">return</span> val &amp; ~(alignment - 1);</div>
+<div class="line"><a name="l04483"></a><span class="lineno"> 4483</span>&#160;}</div>
+<div class="line"><a name="l04484"></a><span class="lineno"> 4484</span>&#160; </div>
+<div class="line"><a name="l04485"></a><span class="lineno"> 4485</span>&#160;<span class="comment">// Division with mathematical rounding to nearest number.</span></div>
+<div class="line"><a name="l04486"></a><span class="lineno"> 4486</span>&#160;<span class="keyword">template</span> &lt;<span class="keyword">typename</span> T&gt;</div>
+<div class="line"><a name="l04487"></a><span class="lineno"> 4487</span>&#160;<span class="keyword">static</span> <span class="keyword">inline</span> T VmaRoundDiv(T x, T y)</div>
+<div class="line"><a name="l04488"></a><span class="lineno"> 4488</span>&#160;{</div>
+<div class="line"><a name="l04489"></a><span class="lineno"> 4489</span>&#160;    <span class="keywordflow">return</span> (x + (y / (T)2)) / y;</div>
+<div class="line"><a name="l04490"></a><span class="lineno"> 4490</span>&#160;}</div>
+<div class="line"><a name="l04491"></a><span class="lineno"> 4491</span>&#160; </div>
+<div class="line"><a name="l04492"></a><span class="lineno"> 4492</span>&#160;<span class="comment">// Returns smallest power of 2 greater or equal to v.</span></div>
+<div class="line"><a name="l04493"></a><span class="lineno"> 4493</span>&#160;<span class="keyword">static</span> <span class="keyword">inline</span> uint32_t VmaNextPow2(uint32_t v)</div>
+<div class="line"><a name="l04494"></a><span class="lineno"> 4494</span>&#160;{</div>
+<div class="line"><a name="l04495"></a><span class="lineno"> 4495</span>&#160;    v--;</div>
+<div class="line"><a name="l04496"></a><span class="lineno"> 4496</span>&#160;    v |= v &gt;&gt; 1;</div>
+<div class="line"><a name="l04497"></a><span class="lineno"> 4497</span>&#160;    v |= v &gt;&gt; 2;</div>
+<div class="line"><a name="l04498"></a><span class="lineno"> 4498</span>&#160;    v |= v &gt;&gt; 4;</div>
+<div class="line"><a name="l04499"></a><span class="lineno"> 4499</span>&#160;    v |= v &gt;&gt; 8;</div>
+<div class="line"><a name="l04500"></a><span class="lineno"> 4500</span>&#160;    v |= v &gt;&gt; 16;</div>
+<div class="line"><a name="l04501"></a><span class="lineno"> 4501</span>&#160;    v++;</div>
+<div class="line"><a name="l04502"></a><span class="lineno"> 4502</span>&#160;    <span class="keywordflow">return</span> v;</div>
+<div class="line"><a name="l04503"></a><span class="lineno"> 4503</span>&#160;}</div>
+<div class="line"><a name="l04504"></a><span class="lineno"> 4504</span>&#160;<span class="keyword">static</span> <span class="keyword">inline</span> uint64_t VmaNextPow2(uint64_t v)</div>
+<div class="line"><a name="l04505"></a><span class="lineno"> 4505</span>&#160;{</div>
+<div class="line"><a name="l04506"></a><span class="lineno"> 4506</span>&#160;    v--;</div>
+<div class="line"><a name="l04507"></a><span class="lineno"> 4507</span>&#160;    v |= v &gt;&gt; 1;</div>
+<div class="line"><a name="l04508"></a><span class="lineno"> 4508</span>&#160;    v |= v &gt;&gt; 2;</div>
+<div class="line"><a name="l04509"></a><span class="lineno"> 4509</span>&#160;    v |= v &gt;&gt; 4;</div>
+<div class="line"><a name="l04510"></a><span class="lineno"> 4510</span>&#160;    v |= v &gt;&gt; 8;</div>
+<div class="line"><a name="l04511"></a><span class="lineno"> 4511</span>&#160;    v |= v &gt;&gt; 16;</div>
+<div class="line"><a name="l04512"></a><span class="lineno"> 4512</span>&#160;    v |= v &gt;&gt; 32;</div>
+<div class="line"><a name="l04513"></a><span class="lineno"> 4513</span>&#160;    v++;</div>
+<div class="line"><a name="l04514"></a><span class="lineno"> 4514</span>&#160;    <span class="keywordflow">return</span> v;</div>
+<div class="line"><a name="l04515"></a><span class="lineno"> 4515</span>&#160;}</div>
+<div class="line"><a name="l04516"></a><span class="lineno"> 4516</span>&#160; </div>
+<div class="line"><a name="l04517"></a><span class="lineno"> 4517</span>&#160;<span class="comment">// Returns largest power of 2 less or equal to v.</span></div>
+<div class="line"><a name="l04518"></a><span class="lineno"> 4518</span>&#160;<span class="keyword">static</span> <span class="keyword">inline</span> uint32_t VmaPrevPow2(uint32_t v)</div>
+<div class="line"><a name="l04519"></a><span class="lineno"> 4519</span>&#160;{</div>
+<div class="line"><a name="l04520"></a><span class="lineno"> 4520</span>&#160;    v |= v &gt;&gt; 1;</div>
+<div class="line"><a name="l04521"></a><span class="lineno"> 4521</span>&#160;    v |= v &gt;&gt; 2;</div>
+<div class="line"><a name="l04522"></a><span class="lineno"> 4522</span>&#160;    v |= v &gt;&gt; 4;</div>
+<div class="line"><a name="l04523"></a><span class="lineno"> 4523</span>&#160;    v |= v &gt;&gt; 8;</div>
+<div class="line"><a name="l04524"></a><span class="lineno"> 4524</span>&#160;    v |= v &gt;&gt; 16;</div>
+<div class="line"><a name="l04525"></a><span class="lineno"> 4525</span>&#160;    v = v ^ (v &gt;&gt; 1);</div>
+<div class="line"><a name="l04526"></a><span class="lineno"> 4526</span>&#160;    <span class="keywordflow">return</span> v;</div>
+<div class="line"><a name="l04527"></a><span class="lineno"> 4527</span>&#160;}</div>
+<div class="line"><a name="l04528"></a><span class="lineno"> 4528</span>&#160;<span class="keyword">static</span> <span class="keyword">inline</span> uint64_t VmaPrevPow2(uint64_t v)</div>
 <div class="line"><a name="l04529"></a><span class="lineno"> 4529</span>&#160;{</div>
-<div class="line"><a name="l04530"></a><span class="lineno"> 4530</span>&#160;    VMA_CLASS_NO_COPY(VmaMutexLockWrite)</div>
-<div class="line"><a name="l04531"></a><span class="lineno"> 4531</span>&#160;<span class="keyword">public</span>:</div>
-<div class="line"><a name="l04532"></a><span class="lineno"> 4532</span>&#160;    VmaMutexLockWrite(VMA_RW_MUTEX&amp; mutex, <span class="keywordtype">bool</span> useMutex) :</div>
-<div class="line"><a name="l04533"></a><span class="lineno"> 4533</span>&#160;        m_pMutex(useMutex ? &amp;mutex : VMA_NULL)</div>
-<div class="line"><a name="l04534"></a><span class="lineno"> 4534</span>&#160;    { <span class="keywordflow">if</span>(m_pMutex) { m_pMutex-&gt;LockWrite(); } }</div>
-<div class="line"><a name="l04535"></a><span class="lineno"> 4535</span>&#160;    ~VmaMutexLockWrite() { <span class="keywordflow">if</span>(m_pMutex) { m_pMutex-&gt;UnlockWrite(); } }</div>
-<div class="line"><a name="l04536"></a><span class="lineno"> 4536</span>&#160;<span class="keyword">private</span>:</div>
-<div class="line"><a name="l04537"></a><span class="lineno"> 4537</span>&#160;    VMA_RW_MUTEX* m_pMutex;</div>
-<div class="line"><a name="l04538"></a><span class="lineno"> 4538</span>&#160;};</div>
+<div class="line"><a name="l04530"></a><span class="lineno"> 4530</span>&#160;    v |= v &gt;&gt; 1;</div>
+<div class="line"><a name="l04531"></a><span class="lineno"> 4531</span>&#160;    v |= v &gt;&gt; 2;</div>
+<div class="line"><a name="l04532"></a><span class="lineno"> 4532</span>&#160;    v |= v &gt;&gt; 4;</div>
+<div class="line"><a name="l04533"></a><span class="lineno"> 4533</span>&#160;    v |= v &gt;&gt; 8;</div>
+<div class="line"><a name="l04534"></a><span class="lineno"> 4534</span>&#160;    v |= v &gt;&gt; 16;</div>
+<div class="line"><a name="l04535"></a><span class="lineno"> 4535</span>&#160;    v |= v &gt;&gt; 32;</div>
+<div class="line"><a name="l04536"></a><span class="lineno"> 4536</span>&#160;    v = v ^ (v &gt;&gt; 1);</div>
+<div class="line"><a name="l04537"></a><span class="lineno"> 4537</span>&#160;    <span class="keywordflow">return</span> v;</div>
+<div class="line"><a name="l04538"></a><span class="lineno"> 4538</span>&#160;}</div>
 <div class="line"><a name="l04539"></a><span class="lineno"> 4539</span>&#160; </div>
-<div class="line"><a name="l04540"></a><span class="lineno"> 4540</span>&#160;<span class="preprocessor">#if VMA_DEBUG_GLOBAL_MUTEX</span></div>
-<div class="line"><a name="l04541"></a><span class="lineno"> 4541</span>&#160;    <span class="keyword">static</span> VMA_MUTEX gDebugGlobalMutex;</div>
-<div class="line"><a name="l04542"></a><span class="lineno"> 4542</span>&#160;<span class="preprocessor">    #define VMA_DEBUG_GLOBAL_MUTEX_LOCK VmaMutexLock debugGlobalMutexLock(gDebugGlobalMutex, true);</span></div>
-<div class="line"><a name="l04543"></a><span class="lineno"> 4543</span>&#160;<span class="preprocessor">#else</span></div>
-<div class="line"><a name="l04544"></a><span class="lineno"> 4544</span>&#160;<span class="preprocessor">    #define VMA_DEBUG_GLOBAL_MUTEX_LOCK</span></div>
-<div class="line"><a name="l04545"></a><span class="lineno"> 4545</span>&#160;<span class="preprocessor">#endif</span></div>
+<div class="line"><a name="l04540"></a><span class="lineno"> 4540</span>&#160;<span class="keyword">static</span> <span class="keyword">inline</span> <span class="keywordtype">bool</span> VmaStrIsEmpty(<span class="keyword">const</span> <span class="keywordtype">char</span>* pStr)</div>
+<div class="line"><a name="l04541"></a><span class="lineno"> 4541</span>&#160;{</div>
+<div class="line"><a name="l04542"></a><span class="lineno"> 4542</span>&#160;    <span class="keywordflow">return</span> pStr == VMA_NULL || *pStr == <span class="charliteral">&#39;\0&#39;</span>;</div>
+<div class="line"><a name="l04543"></a><span class="lineno"> 4543</span>&#160;}</div>
+<div class="line"><a name="l04544"></a><span class="lineno"> 4544</span>&#160; </div>
+<div class="line"><a name="l04545"></a><span class="lineno"> 4545</span>&#160;<span class="preprocessor">#if VMA_STATS_STRING_ENABLED</span></div>
 <div class="line"><a name="l04546"></a><span class="lineno"> 4546</span>&#160; </div>
-<div class="line"><a name="l04547"></a><span class="lineno"> 4547</span>&#160;<span class="comment">// Minimum size of a free suballocation to register it in the free suballocation collection.</span></div>
-<div class="line"><a name="l04548"></a><span class="lineno"> 4548</span>&#160;<span class="keyword">static</span> <span class="keyword">const</span> VkDeviceSize VMA_MIN_FREE_SUBALLOCATION_SIZE_TO_REGISTER = 16;</div>
-<div class="line"><a name="l04549"></a><span class="lineno"> 4549</span>&#160; </div>
-<div class="line"><a name="l04550"></a><span class="lineno"> 4550</span>&#160;<span class="comment">/*</span></div>
-<div class="line"><a name="l04551"></a><span class="lineno"> 4551</span>&#160;<span class="comment">Performs binary search and returns iterator to first element that is greater or</span></div>
-<div class="line"><a name="l04552"></a><span class="lineno"> 4552</span>&#160;<span class="comment">equal to (key), according to comparison (cmp).</span></div>
-<div class="line"><a name="l04553"></a><span class="lineno"> 4553</span>&#160;<span class="comment"></span> </div>
-<div class="line"><a name="l04554"></a><span class="lineno"> 4554</span>&#160;<span class="comment">Cmp should return true if first argument is less than second argument.</span></div>
-<div class="line"><a name="l04555"></a><span class="lineno"> 4555</span>&#160;<span class="comment"></span> </div>
-<div class="line"><a name="l04556"></a><span class="lineno"> 4556</span>&#160;<span class="comment">Returned value is the found element, if present in the collection or place where</span></div>
-<div class="line"><a name="l04557"></a><span class="lineno"> 4557</span>&#160;<span class="comment">new element with value (key) should be inserted.</span></div>
-<div class="line"><a name="l04558"></a><span class="lineno"> 4558</span>&#160;<span class="comment">*/</span></div>
-<div class="line"><a name="l04559"></a><span class="lineno"> 4559</span>&#160;<span class="keyword">template</span> &lt;<span class="keyword">typename</span> CmpLess, <span class="keyword">typename</span> IterT, <span class="keyword">typename</span> KeyT&gt;</div>
-<div class="line"><a name="l04560"></a><span class="lineno"> 4560</span>&#160;<span class="keyword">static</span> IterT VmaBinaryFindFirstNotLess(IterT beg, IterT end, <span class="keyword">const</span> KeyT &amp;key, <span class="keyword">const</span> CmpLess&amp; cmp)</div>
-<div class="line"><a name="l04561"></a><span class="lineno"> 4561</span>&#160;{</div>
-<div class="line"><a name="l04562"></a><span class="lineno"> 4562</span>&#160;    <span class="keywordtype">size_t</span> down = 0, up = (end - beg);</div>
-<div class="line"><a name="l04563"></a><span class="lineno"> 4563</span>&#160;    <span class="keywordflow">while</span>(down &lt; up)</div>
-<div class="line"><a name="l04564"></a><span class="lineno"> 4564</span>&#160;    {</div>
-<div class="line"><a name="l04565"></a><span class="lineno"> 4565</span>&#160;        <span class="keyword">const</span> <span class="keywordtype">size_t</span> mid = (down + up) / 2;</div>
-<div class="line"><a name="l04566"></a><span class="lineno"> 4566</span>&#160;        <span class="keywordflow">if</span>(cmp(*(beg+mid), key))</div>
-<div class="line"><a name="l04567"></a><span class="lineno"> 4567</span>&#160;        {</div>
-<div class="line"><a name="l04568"></a><span class="lineno"> 4568</span>&#160;            down = mid + 1;</div>
-<div class="line"><a name="l04569"></a><span class="lineno"> 4569</span>&#160;        }</div>
-<div class="line"><a name="l04570"></a><span class="lineno"> 4570</span>&#160;        <span class="keywordflow">else</span></div>
-<div class="line"><a name="l04571"></a><span class="lineno"> 4571</span>&#160;        {</div>
-<div class="line"><a name="l04572"></a><span class="lineno"> 4572</span>&#160;            up = mid;</div>
-<div class="line"><a name="l04573"></a><span class="lineno"> 4573</span>&#160;        }</div>
-<div class="line"><a name="l04574"></a><span class="lineno"> 4574</span>&#160;    }</div>
-<div class="line"><a name="l04575"></a><span class="lineno"> 4575</span>&#160;    <span class="keywordflow">return</span> beg + down;</div>
-<div class="line"><a name="l04576"></a><span class="lineno"> 4576</span>&#160;}</div>
-<div class="line"><a name="l04577"></a><span class="lineno"> 4577</span>&#160; </div>
-<div class="line"><a name="l04578"></a><span class="lineno"> 4578</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> CmpLess, <span class="keyword">typename</span> IterT, <span class="keyword">typename</span> KeyT&gt;</div>
-<div class="line"><a name="l04579"></a><span class="lineno"> 4579</span>&#160;IterT VmaBinaryFindSorted(<span class="keyword">const</span> IterT&amp; beg, <span class="keyword">const</span> IterT&amp; end, <span class="keyword">const</span> KeyT&amp; value, <span class="keyword">const</span> CmpLess&amp; cmp)</div>
-<div class="line"><a name="l04580"></a><span class="lineno"> 4580</span>&#160;{</div>
-<div class="line"><a name="l04581"></a><span class="lineno"> 4581</span>&#160;    IterT it = VmaBinaryFindFirstNotLess&lt;CmpLess, IterT, KeyT&gt;(</div>
-<div class="line"><a name="l04582"></a><span class="lineno"> 4582</span>&#160;        beg, end, value, cmp);</div>
-<div class="line"><a name="l04583"></a><span class="lineno"> 4583</span>&#160;    <span class="keywordflow">if</span>(it == end ||</div>
-<div class="line"><a name="l04584"></a><span class="lineno"> 4584</span>&#160;        (!cmp(*it, value) &amp;&amp; !cmp(value, *it)))</div>
-<div class="line"><a name="l04585"></a><span class="lineno"> 4585</span>&#160;    {</div>
-<div class="line"><a name="l04586"></a><span class="lineno"> 4586</span>&#160;        <span class="keywordflow">return</span> it;</div>
-<div class="line"><a name="l04587"></a><span class="lineno"> 4587</span>&#160;    }</div>
-<div class="line"><a name="l04588"></a><span class="lineno"> 4588</span>&#160;    <span class="keywordflow">return</span> end;</div>
-<div class="line"><a name="l04589"></a><span class="lineno"> 4589</span>&#160;}</div>
-<div class="line"><a name="l04590"></a><span class="lineno"> 4590</span>&#160; </div>
-<div class="line"><a name="l04591"></a><span class="lineno"> 4591</span>&#160;<span class="comment">/*</span></div>
-<div class="line"><a name="l04592"></a><span class="lineno"> 4592</span>&#160;<span class="comment">Returns true if all pointers in the array are not-null and unique.</span></div>
-<div class="line"><a name="l04593"></a><span class="lineno"> 4593</span>&#160;<span class="comment">Warning! O(n^2) complexity. Use only inside VMA_HEAVY_ASSERT.</span></div>
-<div class="line"><a name="l04594"></a><span class="lineno"> 4594</span>&#160;<span class="comment">T must be pointer type, e.g. VmaAllocation, VmaPool.</span></div>
-<div class="line"><a name="l04595"></a><span class="lineno"> 4595</span>&#160;<span class="comment">*/</span></div>
-<div class="line"><a name="l04596"></a><span class="lineno"> 4596</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt;</div>
-<div class="line"><a name="l04597"></a><span class="lineno"> 4597</span>&#160;<span class="keyword">static</span> <span class="keywordtype">bool</span> VmaValidatePointerArray(uint32_t count, <span class="keyword">const</span> T* arr)</div>
-<div class="line"><a name="l04598"></a><span class="lineno"> 4598</span>&#160;{</div>
-<div class="line"><a name="l04599"></a><span class="lineno"> 4599</span>&#160;    <span class="keywordflow">for</span>(uint32_t i = 0; i &lt; count; ++i)</div>
-<div class="line"><a name="l04600"></a><span class="lineno"> 4600</span>&#160;    {</div>
-<div class="line"><a name="l04601"></a><span class="lineno"> 4601</span>&#160;        <span class="keyword">const</span> T iPtr = arr[i];</div>
-<div class="line"><a name="l04602"></a><span class="lineno"> 4602</span>&#160;        <span class="keywordflow">if</span>(iPtr == VMA_NULL)</div>
-<div class="line"><a name="l04603"></a><span class="lineno"> 4603</span>&#160;        {</div>
-<div class="line"><a name="l04604"></a><span class="lineno"> 4604</span>&#160;            <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
-<div class="line"><a name="l04605"></a><span class="lineno"> 4605</span>&#160;        }</div>
-<div class="line"><a name="l04606"></a><span class="lineno"> 4606</span>&#160;        <span class="keywordflow">for</span>(uint32_t j = i + 1; j &lt; count; ++j)</div>
-<div class="line"><a name="l04607"></a><span class="lineno"> 4607</span>&#160;        {</div>
-<div class="line"><a name="l04608"></a><span class="lineno"> 4608</span>&#160;            <span class="keywordflow">if</span>(iPtr == arr[j])</div>
-<div class="line"><a name="l04609"></a><span class="lineno"> 4609</span>&#160;            {</div>
-<div class="line"><a name="l04610"></a><span class="lineno"> 4610</span>&#160;                <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
-<div class="line"><a name="l04611"></a><span class="lineno"> 4611</span>&#160;            }</div>
-<div class="line"><a name="l04612"></a><span class="lineno"> 4612</span>&#160;        }</div>
-<div class="line"><a name="l04613"></a><span class="lineno"> 4613</span>&#160;    }</div>
-<div class="line"><a name="l04614"></a><span class="lineno"> 4614</span>&#160;    <span class="keywordflow">return</span> <span class="keyword">true</span>;</div>
-<div class="line"><a name="l04615"></a><span class="lineno"> 4615</span>&#160;}</div>
-<div class="line"><a name="l04616"></a><span class="lineno"> 4616</span>&#160; </div>
-<div class="line"><a name="l04617"></a><span class="lineno"> 4617</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> MainT, <span class="keyword">typename</span> NewT&gt;</div>
-<div class="line"><a name="l04618"></a><span class="lineno"> 4618</span>&#160;<span class="keyword">static</span> <span class="keyword">inline</span> <span class="keywordtype">void</span> VmaPnextChainPushFront(MainT* mainStruct, NewT* newStruct)</div>
-<div class="line"><a name="l04619"></a><span class="lineno"> 4619</span>&#160;{</div>
-<div class="line"><a name="l04620"></a><span class="lineno"> 4620</span>&#160;    newStruct-&gt;pNext = mainStruct-&gt;pNext;</div>
-<div class="line"><a name="l04621"></a><span class="lineno"> 4621</span>&#160;    mainStruct-&gt;pNext = newStruct;</div>
-<div class="line"><a name="l04622"></a><span class="lineno"> 4622</span>&#160;}</div>
-<div class="line"><a name="l04623"></a><span class="lineno"> 4623</span>&#160; </div>
-<div class="line"><a name="l04625"></a><span class="lineno"> 4625</span>&#160;<span class="comment">// Memory allocation</span></div>
-<div class="line"><a name="l04626"></a><span class="lineno"> 4626</span>&#160; </div>
-<div class="line"><a name="l04627"></a><span class="lineno"> 4627</span>&#160;<span class="keyword">static</span> <span class="keywordtype">void</span>* VmaMalloc(<span class="keyword">const</span> VkAllocationCallbacks* pAllocationCallbacks, <span class="keywordtype">size_t</span> size, <span class="keywordtype">size_t</span> alignment)</div>
-<div class="line"><a name="l04628"></a><span class="lineno"> 4628</span>&#160;{</div>
-<div class="line"><a name="l04629"></a><span class="lineno"> 4629</span>&#160;    <span class="keywordflow">if</span>((pAllocationCallbacks != VMA_NULL) &amp;&amp;</div>
-<div class="line"><a name="l04630"></a><span class="lineno"> 4630</span>&#160;        (pAllocationCallbacks-&gt;pfnAllocation != VMA_NULL))</div>
-<div class="line"><a name="l04631"></a><span class="lineno"> 4631</span>&#160;    {</div>
-<div class="line"><a name="l04632"></a><span class="lineno"> 4632</span>&#160;        <span class="keywordflow">return</span> (*pAllocationCallbacks-&gt;pfnAllocation)(</div>
-<div class="line"><a name="l04633"></a><span class="lineno"> 4633</span>&#160;            pAllocationCallbacks-&gt;pUserData,</div>
-<div class="line"><a name="l04634"></a><span class="lineno"> 4634</span>&#160;            size,</div>
-<div class="line"><a name="l04635"></a><span class="lineno"> 4635</span>&#160;            alignment,</div>
-<div class="line"><a name="l04636"></a><span class="lineno"> 4636</span>&#160;            VK_SYSTEM_ALLOCATION_SCOPE_OBJECT);</div>
-<div class="line"><a name="l04637"></a><span class="lineno"> 4637</span>&#160;    }</div>
-<div class="line"><a name="l04638"></a><span class="lineno"> 4638</span>&#160;    <span class="keywordflow">else</span></div>
-<div class="line"><a name="l04639"></a><span class="lineno"> 4639</span>&#160;    {</div>
-<div class="line"><a name="l04640"></a><span class="lineno"> 4640</span>&#160;        <span class="keywordflow">return</span> VMA_SYSTEM_ALIGNED_MALLOC(size, alignment);</div>
-<div class="line"><a name="l04641"></a><span class="lineno"> 4641</span>&#160;    }</div>
-<div class="line"><a name="l04642"></a><span class="lineno"> 4642</span>&#160;}</div>
-<div class="line"><a name="l04643"></a><span class="lineno"> 4643</span>&#160; </div>
-<div class="line"><a name="l04644"></a><span class="lineno"> 4644</span>&#160;<span class="keyword">static</span> <span class="keywordtype">void</span> VmaFree(<span class="keyword">const</span> VkAllocationCallbacks* pAllocationCallbacks, <span class="keywordtype">void</span>* ptr)</div>
-<div class="line"><a name="l04645"></a><span class="lineno"> 4645</span>&#160;{</div>
-<div class="line"><a name="l04646"></a><span class="lineno"> 4646</span>&#160;    <span class="keywordflow">if</span>((pAllocationCallbacks != VMA_NULL) &amp;&amp;</div>
-<div class="line"><a name="l04647"></a><span class="lineno"> 4647</span>&#160;        (pAllocationCallbacks-&gt;pfnFree != VMA_NULL))</div>
+<div class="line"><a name="l04547"></a><span class="lineno"> 4547</span>&#160;<span class="keyword">static</span> <span class="keyword">const</span> <span class="keywordtype">char</span>* VmaAlgorithmToStr(uint32_t algorithm)</div>
+<div class="line"><a name="l04548"></a><span class="lineno"> 4548</span>&#160;{</div>
+<div class="line"><a name="l04549"></a><span class="lineno"> 4549</span>&#160;    <span class="keywordflow">switch</span>(algorithm)</div>
+<div class="line"><a name="l04550"></a><span class="lineno"> 4550</span>&#160;    {</div>
+<div class="line"><a name="l04551"></a><span class="lineno"> 4551</span>&#160;    <span class="keywordflow">case</span> <a class="code" href="vk__mem__alloc_8h.html#a9a7c45f9c863695d98c83fa5ac940fe7a13c8a444197c67866be9cb05599fc726">VMA_POOL_CREATE_LINEAR_ALGORITHM_BIT</a>:</div>
+<div class="line"><a name="l04552"></a><span class="lineno"> 4552</span>&#160;        <span class="keywordflow">return</span> <span class="stringliteral">&quot;Linear&quot;</span>;</div>
+<div class="line"><a name="l04553"></a><span class="lineno"> 4553</span>&#160;    <span class="keywordflow">case</span> <a class="code" href="vk__mem__alloc_8h.html#a9a7c45f9c863695d98c83fa5ac940fe7a97a0dc38e5161b780594d998d313d35e">VMA_POOL_CREATE_BUDDY_ALGORITHM_BIT</a>:</div>
+<div class="line"><a name="l04554"></a><span class="lineno"> 4554</span>&#160;        <span class="keywordflow">return</span> <span class="stringliteral">&quot;Buddy&quot;</span>;</div>
+<div class="line"><a name="l04555"></a><span class="lineno"> 4555</span>&#160;    <span class="keywordflow">case</span> 0:</div>
+<div class="line"><a name="l04556"></a><span class="lineno"> 4556</span>&#160;        <span class="keywordflow">return</span> <span class="stringliteral">&quot;Default&quot;</span>;</div>
+<div class="line"><a name="l04557"></a><span class="lineno"> 4557</span>&#160;    <span class="keywordflow">default</span>:</div>
+<div class="line"><a name="l04558"></a><span class="lineno"> 4558</span>&#160;        VMA_ASSERT(0);</div>
+<div class="line"><a name="l04559"></a><span class="lineno"> 4559</span>&#160;        <span class="keywordflow">return</span> <span class="stringliteral">&quot;&quot;</span>;</div>
+<div class="line"><a name="l04560"></a><span class="lineno"> 4560</span>&#160;    }</div>
+<div class="line"><a name="l04561"></a><span class="lineno"> 4561</span>&#160;}</div>
+<div class="line"><a name="l04562"></a><span class="lineno"> 4562</span>&#160; </div>
+<div class="line"><a name="l04563"></a><span class="lineno"> 4563</span>&#160;<span class="preprocessor">#endif </span><span class="comment">// #if VMA_STATS_STRING_ENABLED</span></div>
+<div class="line"><a name="l04564"></a><span class="lineno"> 4564</span>&#160; </div>
+<div class="line"><a name="l04565"></a><span class="lineno"> 4565</span>&#160;<span class="preprocessor">#ifndef VMA_SORT</span></div>
+<div class="line"><a name="l04566"></a><span class="lineno"> 4566</span>&#160; </div>
+<div class="line"><a name="l04567"></a><span class="lineno"> 4567</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> Iterator, <span class="keyword">typename</span> Compare&gt;</div>
+<div class="line"><a name="l04568"></a><span class="lineno"> 4568</span>&#160;Iterator VmaQuickSortPartition(Iterator beg, Iterator end, Compare cmp)</div>
+<div class="line"><a name="l04569"></a><span class="lineno"> 4569</span>&#160;{</div>
+<div class="line"><a name="l04570"></a><span class="lineno"> 4570</span>&#160;    Iterator centerValue = end; --centerValue;</div>
+<div class="line"><a name="l04571"></a><span class="lineno"> 4571</span>&#160;    Iterator insertIndex = beg;</div>
+<div class="line"><a name="l04572"></a><span class="lineno"> 4572</span>&#160;    <span class="keywordflow">for</span>(Iterator memTypeIndex = beg; memTypeIndex &lt; centerValue; ++memTypeIndex)</div>
+<div class="line"><a name="l04573"></a><span class="lineno"> 4573</span>&#160;    {</div>
+<div class="line"><a name="l04574"></a><span class="lineno"> 4574</span>&#160;        <span class="keywordflow">if</span>(cmp(*memTypeIndex, *centerValue))</div>
+<div class="line"><a name="l04575"></a><span class="lineno"> 4575</span>&#160;        {</div>
+<div class="line"><a name="l04576"></a><span class="lineno"> 4576</span>&#160;            <span class="keywordflow">if</span>(insertIndex != memTypeIndex)</div>
+<div class="line"><a name="l04577"></a><span class="lineno"> 4577</span>&#160;            {</div>
+<div class="line"><a name="l04578"></a><span class="lineno"> 4578</span>&#160;                VMA_SWAP(*memTypeIndex, *insertIndex);</div>
+<div class="line"><a name="l04579"></a><span class="lineno"> 4579</span>&#160;            }</div>
+<div class="line"><a name="l04580"></a><span class="lineno"> 4580</span>&#160;            ++insertIndex;</div>
+<div class="line"><a name="l04581"></a><span class="lineno"> 4581</span>&#160;        }</div>
+<div class="line"><a name="l04582"></a><span class="lineno"> 4582</span>&#160;    }</div>
+<div class="line"><a name="l04583"></a><span class="lineno"> 4583</span>&#160;    <span class="keywordflow">if</span>(insertIndex != centerValue)</div>
+<div class="line"><a name="l04584"></a><span class="lineno"> 4584</span>&#160;    {</div>
+<div class="line"><a name="l04585"></a><span class="lineno"> 4585</span>&#160;        VMA_SWAP(*insertIndex, *centerValue);</div>
+<div class="line"><a name="l04586"></a><span class="lineno"> 4586</span>&#160;    }</div>
+<div class="line"><a name="l04587"></a><span class="lineno"> 4587</span>&#160;    <span class="keywordflow">return</span> insertIndex;</div>
+<div class="line"><a name="l04588"></a><span class="lineno"> 4588</span>&#160;}</div>
+<div class="line"><a name="l04589"></a><span class="lineno"> 4589</span>&#160; </div>
+<div class="line"><a name="l04590"></a><span class="lineno"> 4590</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> Iterator, <span class="keyword">typename</span> Compare&gt;</div>
+<div class="line"><a name="l04591"></a><span class="lineno"> 4591</span>&#160;<span class="keywordtype">void</span> VmaQuickSort(Iterator beg, Iterator end, Compare cmp)</div>
+<div class="line"><a name="l04592"></a><span class="lineno"> 4592</span>&#160;{</div>
+<div class="line"><a name="l04593"></a><span class="lineno"> 4593</span>&#160;    <span class="keywordflow">if</span>(beg &lt; end)</div>
+<div class="line"><a name="l04594"></a><span class="lineno"> 4594</span>&#160;    {</div>
+<div class="line"><a name="l04595"></a><span class="lineno"> 4595</span>&#160;        Iterator it = VmaQuickSortPartition&lt;Iterator, Compare&gt;(beg, end, cmp);</div>
+<div class="line"><a name="l04596"></a><span class="lineno"> 4596</span>&#160;        VmaQuickSort&lt;Iterator, Compare&gt;(beg, it, cmp);</div>
+<div class="line"><a name="l04597"></a><span class="lineno"> 4597</span>&#160;        VmaQuickSort&lt;Iterator, Compare&gt;(it + 1, end, cmp);</div>
+<div class="line"><a name="l04598"></a><span class="lineno"> 4598</span>&#160;    }</div>
+<div class="line"><a name="l04599"></a><span class="lineno"> 4599</span>&#160;}</div>
+<div class="line"><a name="l04600"></a><span class="lineno"> 4600</span>&#160; </div>
+<div class="line"><a name="l04601"></a><span class="lineno"> 4601</span>&#160;<span class="preprocessor">#define VMA_SORT(beg, end, cmp) VmaQuickSort(beg, end, cmp)</span></div>
+<div class="line"><a name="l04602"></a><span class="lineno"> 4602</span>&#160; </div>
+<div class="line"><a name="l04603"></a><span class="lineno"> 4603</span>&#160;<span class="preprocessor">#endif </span><span class="comment">// #ifndef VMA_SORT</span></div>
+<div class="line"><a name="l04604"></a><span class="lineno"> 4604</span>&#160; </div>
+<div class="line"><a name="l04605"></a><span class="lineno"> 4605</span>&#160;<span class="comment">/*</span></div>
+<div class="line"><a name="l04606"></a><span class="lineno"> 4606</span>&#160;<span class="comment">Returns true if two memory blocks occupy overlapping pages.</span></div>
+<div class="line"><a name="l04607"></a><span class="lineno"> 4607</span>&#160;<span class="comment">ResourceA must be in less memory offset than ResourceB.</span></div>
+<div class="line"><a name="l04608"></a><span class="lineno"> 4608</span>&#160;<span class="comment"></span> </div>
+<div class="line"><a name="l04609"></a><span class="lineno"> 4609</span>&#160;<span class="comment">Algorithm is based on &quot;Vulkan 1.0.39 - A Specification (with all registered Vulkan extensions)&quot;</span></div>
+<div class="line"><a name="l04610"></a><span class="lineno"> 4610</span>&#160;<span class="comment">chapter 11.6 &quot;Resource Memory Association&quot;, paragraph &quot;Buffer-Image Granularity&quot;.</span></div>
+<div class="line"><a name="l04611"></a><span class="lineno"> 4611</span>&#160;<span class="comment">*/</span></div>
+<div class="line"><a name="l04612"></a><span class="lineno"> 4612</span>&#160;<span class="keyword">static</span> <span class="keyword">inline</span> <span class="keywordtype">bool</span> VmaBlocksOnSamePage(</div>
+<div class="line"><a name="l04613"></a><span class="lineno"> 4613</span>&#160;    VkDeviceSize resourceAOffset,</div>
+<div class="line"><a name="l04614"></a><span class="lineno"> 4614</span>&#160;    VkDeviceSize resourceASize,</div>
+<div class="line"><a name="l04615"></a><span class="lineno"> 4615</span>&#160;    VkDeviceSize resourceBOffset,</div>
+<div class="line"><a name="l04616"></a><span class="lineno"> 4616</span>&#160;    VkDeviceSize pageSize)</div>
+<div class="line"><a name="l04617"></a><span class="lineno"> 4617</span>&#160;{</div>
+<div class="line"><a name="l04618"></a><span class="lineno"> 4618</span>&#160;    VMA_ASSERT(resourceAOffset + resourceASize &lt;= resourceBOffset &amp;&amp; resourceASize &gt; 0 &amp;&amp; pageSize &gt; 0);</div>
+<div class="line"><a name="l04619"></a><span class="lineno"> 4619</span>&#160;    VkDeviceSize resourceAEnd = resourceAOffset + resourceASize - 1;</div>
+<div class="line"><a name="l04620"></a><span class="lineno"> 4620</span>&#160;    VkDeviceSize resourceAEndPage = resourceAEnd &amp; ~(pageSize - 1);</div>
+<div class="line"><a name="l04621"></a><span class="lineno"> 4621</span>&#160;    VkDeviceSize resourceBStart = resourceBOffset;</div>
+<div class="line"><a name="l04622"></a><span class="lineno"> 4622</span>&#160;    VkDeviceSize resourceBStartPage = resourceBStart &amp; ~(pageSize - 1);</div>
+<div class="line"><a name="l04623"></a><span class="lineno"> 4623</span>&#160;    <span class="keywordflow">return</span> resourceAEndPage == resourceBStartPage;</div>
+<div class="line"><a name="l04624"></a><span class="lineno"> 4624</span>&#160;}</div>
+<div class="line"><a name="l04625"></a><span class="lineno"> 4625</span>&#160; </div>
+<div class="line"><a name="l04626"></a><span class="lineno"> 4626</span>&#160;<span class="keyword">enum</span> VmaSuballocationType</div>
+<div class="line"><a name="l04627"></a><span class="lineno"> 4627</span>&#160;{</div>
+<div class="line"><a name="l04628"></a><span class="lineno"> 4628</span>&#160;    VMA_SUBALLOCATION_TYPE_FREE = 0,</div>
+<div class="line"><a name="l04629"></a><span class="lineno"> 4629</span>&#160;    VMA_SUBALLOCATION_TYPE_UNKNOWN = 1,</div>
+<div class="line"><a name="l04630"></a><span class="lineno"> 4630</span>&#160;    VMA_SUBALLOCATION_TYPE_BUFFER = 2,</div>
+<div class="line"><a name="l04631"></a><span class="lineno"> 4631</span>&#160;    VMA_SUBALLOCATION_TYPE_IMAGE_UNKNOWN = 3,</div>
+<div class="line"><a name="l04632"></a><span class="lineno"> 4632</span>&#160;    VMA_SUBALLOCATION_TYPE_IMAGE_LINEAR = 4,</div>
+<div class="line"><a name="l04633"></a><span class="lineno"> 4633</span>&#160;    VMA_SUBALLOCATION_TYPE_IMAGE_OPTIMAL = 5,</div>
+<div class="line"><a name="l04634"></a><span class="lineno"> 4634</span>&#160;    VMA_SUBALLOCATION_TYPE_MAX_ENUM = 0x7FFFFFFF</div>
+<div class="line"><a name="l04635"></a><span class="lineno"> 4635</span>&#160;};</div>
+<div class="line"><a name="l04636"></a><span class="lineno"> 4636</span>&#160; </div>
+<div class="line"><a name="l04637"></a><span class="lineno"> 4637</span>&#160;<span class="comment">/*</span></div>
+<div class="line"><a name="l04638"></a><span class="lineno"> 4638</span>&#160;<span class="comment">Returns true if given suballocation types could conflict and must respect</span></div>
+<div class="line"><a name="l04639"></a><span class="lineno"> 4639</span>&#160;<span class="comment">VkPhysicalDeviceLimits::bufferImageGranularity. They conflict if one is buffer</span></div>
+<div class="line"><a name="l04640"></a><span class="lineno"> 4640</span>&#160;<span class="comment">or linear image and another one is optimal image. If type is unknown, behave</span></div>
+<div class="line"><a name="l04641"></a><span class="lineno"> 4641</span>&#160;<span class="comment">conservatively.</span></div>
+<div class="line"><a name="l04642"></a><span class="lineno"> 4642</span>&#160;<span class="comment">*/</span></div>
+<div class="line"><a name="l04643"></a><span class="lineno"> 4643</span>&#160;<span class="keyword">static</span> <span class="keyword">inline</span> <span class="keywordtype">bool</span> VmaIsBufferImageGranularityConflict(</div>
+<div class="line"><a name="l04644"></a><span class="lineno"> 4644</span>&#160;    VmaSuballocationType suballocType1,</div>
+<div class="line"><a name="l04645"></a><span class="lineno"> 4645</span>&#160;    VmaSuballocationType suballocType2)</div>
+<div class="line"><a name="l04646"></a><span class="lineno"> 4646</span>&#160;{</div>
+<div class="line"><a name="l04647"></a><span class="lineno"> 4647</span>&#160;    <span class="keywordflow">if</span>(suballocType1 &gt; suballocType2)</div>
 <div class="line"><a name="l04648"></a><span class="lineno"> 4648</span>&#160;    {</div>
-<div class="line"><a name="l04649"></a><span class="lineno"> 4649</span>&#160;        (*pAllocationCallbacks-&gt;pfnFree)(pAllocationCallbacks-&gt;pUserData, ptr);</div>
+<div class="line"><a name="l04649"></a><span class="lineno"> 4649</span>&#160;        VMA_SWAP(suballocType1, suballocType2);</div>
 <div class="line"><a name="l04650"></a><span class="lineno"> 4650</span>&#160;    }</div>
-<div class="line"><a name="l04651"></a><span class="lineno"> 4651</span>&#160;    <span class="keywordflow">else</span></div>
-<div class="line"><a name="l04652"></a><span class="lineno"> 4652</span>&#160;    {</div>
-<div class="line"><a name="l04653"></a><span class="lineno"> 4653</span>&#160;        VMA_SYSTEM_FREE(ptr);</div>
-<div class="line"><a name="l04654"></a><span class="lineno"> 4654</span>&#160;    }</div>
-<div class="line"><a name="l04655"></a><span class="lineno"> 4655</span>&#160;}</div>
-<div class="line"><a name="l04656"></a><span class="lineno"> 4656</span>&#160; </div>
-<div class="line"><a name="l04657"></a><span class="lineno"> 4657</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt;</div>
-<div class="line"><a name="l04658"></a><span class="lineno"> 4658</span>&#160;<span class="keyword">static</span> T* VmaAllocate(<span class="keyword">const</span> VkAllocationCallbacks* pAllocationCallbacks)</div>
-<div class="line"><a name="l04659"></a><span class="lineno"> 4659</span>&#160;{</div>
-<div class="line"><a name="l04660"></a><span class="lineno"> 4660</span>&#160;    <span class="keywordflow">return</span> (T*)VmaMalloc(pAllocationCallbacks, <span class="keyword">sizeof</span>(T), VMA_ALIGN_OF(T));</div>
-<div class="line"><a name="l04661"></a><span class="lineno"> 4661</span>&#160;}</div>
-<div class="line"><a name="l04662"></a><span class="lineno"> 4662</span>&#160; </div>
-<div class="line"><a name="l04663"></a><span class="lineno"> 4663</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt;</div>
-<div class="line"><a name="l04664"></a><span class="lineno"> 4664</span>&#160;<span class="keyword">static</span> T* VmaAllocateArray(<span class="keyword">const</span> VkAllocationCallbacks* pAllocationCallbacks, <span class="keywordtype">size_t</span> count)</div>
-<div class="line"><a name="l04665"></a><span class="lineno"> 4665</span>&#160;{</div>
-<div class="line"><a name="l04666"></a><span class="lineno"> 4666</span>&#160;    <span class="keywordflow">return</span> (T*)VmaMalloc(pAllocationCallbacks, <span class="keyword">sizeof</span>(T) * count, VMA_ALIGN_OF(T));</div>
-<div class="line"><a name="l04667"></a><span class="lineno"> 4667</span>&#160;}</div>
-<div class="line"><a name="l04668"></a><span class="lineno"> 4668</span>&#160; </div>
-<div class="line"><a name="l04669"></a><span class="lineno"> 4669</span>&#160;<span class="preprocessor">#define vma_new(allocator, type)   new(VmaAllocate&lt;type&gt;(allocator))(type)</span></div>
-<div class="line"><a name="l04670"></a><span class="lineno"> 4670</span>&#160; </div>
-<div class="line"><a name="l04671"></a><span class="lineno"> 4671</span>&#160;<span class="preprocessor">#define vma_new_array(allocator, type, count)   new(VmaAllocateArray&lt;type&gt;((allocator), (count)))(type)</span></div>
-<div class="line"><a name="l04672"></a><span class="lineno"> 4672</span>&#160; </div>
-<div class="line"><a name="l04673"></a><span class="lineno"> 4673</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt;</div>
-<div class="line"><a name="l04674"></a><span class="lineno"> 4674</span>&#160;<span class="keyword">static</span> <span class="keywordtype">void</span> vma_delete(<span class="keyword">const</span> VkAllocationCallbacks* pAllocationCallbacks, T* ptr)</div>
-<div class="line"><a name="l04675"></a><span class="lineno"> 4675</span>&#160;{</div>
-<div class="line"><a name="l04676"></a><span class="lineno"> 4676</span>&#160;    ptr-&gt;~T();</div>
-<div class="line"><a name="l04677"></a><span class="lineno"> 4677</span>&#160;    VmaFree(pAllocationCallbacks, ptr);</div>
-<div class="line"><a name="l04678"></a><span class="lineno"> 4678</span>&#160;}</div>
-<div class="line"><a name="l04679"></a><span class="lineno"> 4679</span>&#160; </div>
-<div class="line"><a name="l04680"></a><span class="lineno"> 4680</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt;</div>
-<div class="line"><a name="l04681"></a><span class="lineno"> 4681</span>&#160;<span class="keyword">static</span> <span class="keywordtype">void</span> vma_delete_array(<span class="keyword">const</span> VkAllocationCallbacks* pAllocationCallbacks, T* ptr, <span class="keywordtype">size_t</span> count)</div>
-<div class="line"><a name="l04682"></a><span class="lineno"> 4682</span>&#160;{</div>
-<div class="line"><a name="l04683"></a><span class="lineno"> 4683</span>&#160;    <span class="keywordflow">if</span>(ptr != VMA_NULL)</div>
+<div class="line"><a name="l04651"></a><span class="lineno"> 4651</span>&#160; </div>
+<div class="line"><a name="l04652"></a><span class="lineno"> 4652</span>&#160;    <span class="keywordflow">switch</span>(suballocType1)</div>
+<div class="line"><a name="l04653"></a><span class="lineno"> 4653</span>&#160;    {</div>
+<div class="line"><a name="l04654"></a><span class="lineno"> 4654</span>&#160;    <span class="keywordflow">case</span> VMA_SUBALLOCATION_TYPE_FREE:</div>
+<div class="line"><a name="l04655"></a><span class="lineno"> 4655</span>&#160;        <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
+<div class="line"><a name="l04656"></a><span class="lineno"> 4656</span>&#160;    <span class="keywordflow">case</span> VMA_SUBALLOCATION_TYPE_UNKNOWN:</div>
+<div class="line"><a name="l04657"></a><span class="lineno"> 4657</span>&#160;        <span class="keywordflow">return</span> <span class="keyword">true</span>;</div>
+<div class="line"><a name="l04658"></a><span class="lineno"> 4658</span>&#160;    <span class="keywordflow">case</span> VMA_SUBALLOCATION_TYPE_BUFFER:</div>
+<div class="line"><a name="l04659"></a><span class="lineno"> 4659</span>&#160;        <span class="keywordflow">return</span></div>
+<div class="line"><a name="l04660"></a><span class="lineno"> 4660</span>&#160;            suballocType2 == VMA_SUBALLOCATION_TYPE_IMAGE_UNKNOWN ||</div>
+<div class="line"><a name="l04661"></a><span class="lineno"> 4661</span>&#160;            suballocType2 == VMA_SUBALLOCATION_TYPE_IMAGE_OPTIMAL;</div>
+<div class="line"><a name="l04662"></a><span class="lineno"> 4662</span>&#160;    <span class="keywordflow">case</span> VMA_SUBALLOCATION_TYPE_IMAGE_UNKNOWN:</div>
+<div class="line"><a name="l04663"></a><span class="lineno"> 4663</span>&#160;        <span class="keywordflow">return</span></div>
+<div class="line"><a name="l04664"></a><span class="lineno"> 4664</span>&#160;            suballocType2 == VMA_SUBALLOCATION_TYPE_IMAGE_UNKNOWN ||</div>
+<div class="line"><a name="l04665"></a><span class="lineno"> 4665</span>&#160;            suballocType2 == VMA_SUBALLOCATION_TYPE_IMAGE_LINEAR ||</div>
+<div class="line"><a name="l04666"></a><span class="lineno"> 4666</span>&#160;            suballocType2 == VMA_SUBALLOCATION_TYPE_IMAGE_OPTIMAL;</div>
+<div class="line"><a name="l04667"></a><span class="lineno"> 4667</span>&#160;    <span class="keywordflow">case</span> VMA_SUBALLOCATION_TYPE_IMAGE_LINEAR:</div>
+<div class="line"><a name="l04668"></a><span class="lineno"> 4668</span>&#160;        <span class="keywordflow">return</span></div>
+<div class="line"><a name="l04669"></a><span class="lineno"> 4669</span>&#160;            suballocType2 == VMA_SUBALLOCATION_TYPE_IMAGE_OPTIMAL;</div>
+<div class="line"><a name="l04670"></a><span class="lineno"> 4670</span>&#160;    <span class="keywordflow">case</span> VMA_SUBALLOCATION_TYPE_IMAGE_OPTIMAL:</div>
+<div class="line"><a name="l04671"></a><span class="lineno"> 4671</span>&#160;        <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
+<div class="line"><a name="l04672"></a><span class="lineno"> 4672</span>&#160;    <span class="keywordflow">default</span>:</div>
+<div class="line"><a name="l04673"></a><span class="lineno"> 4673</span>&#160;        VMA_ASSERT(0);</div>
+<div class="line"><a name="l04674"></a><span class="lineno"> 4674</span>&#160;        <span class="keywordflow">return</span> <span class="keyword">true</span>;</div>
+<div class="line"><a name="l04675"></a><span class="lineno"> 4675</span>&#160;    }</div>
+<div class="line"><a name="l04676"></a><span class="lineno"> 4676</span>&#160;}</div>
+<div class="line"><a name="l04677"></a><span class="lineno"> 4677</span>&#160; </div>
+<div class="line"><a name="l04678"></a><span class="lineno"> 4678</span>&#160;<span class="keyword">static</span> <span class="keywordtype">void</span> VmaWriteMagicValue(<span class="keywordtype">void</span>* pData, VkDeviceSize offset)</div>
+<div class="line"><a name="l04679"></a><span class="lineno"> 4679</span>&#160;{</div>
+<div class="line"><a name="l04680"></a><span class="lineno"> 4680</span>&#160;<span class="preprocessor">#if VMA_DEBUG_MARGIN &gt; 0 &amp;&amp; VMA_DEBUG_DETECT_CORRUPTION</span></div>
+<div class="line"><a name="l04681"></a><span class="lineno"> 4681</span>&#160;    uint32_t* pDst = (uint32_t*)((<span class="keywordtype">char</span>*)pData + offset);</div>
+<div class="line"><a name="l04682"></a><span class="lineno"> 4682</span>&#160;    <span class="keyword">const</span> <span class="keywordtype">size_t</span> numberCount = VMA_DEBUG_MARGIN / <span class="keyword">sizeof</span>(uint32_t);</div>
+<div class="line"><a name="l04683"></a><span class="lineno"> 4683</span>&#160;    <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> i = 0; i &lt; numberCount; ++i, ++pDst)</div>
 <div class="line"><a name="l04684"></a><span class="lineno"> 4684</span>&#160;    {</div>
-<div class="line"><a name="l04685"></a><span class="lineno"> 4685</span>&#160;        <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> i = count; i--; )</div>
-<div class="line"><a name="l04686"></a><span class="lineno"> 4686</span>&#160;        {</div>
-<div class="line"><a name="l04687"></a><span class="lineno"> 4687</span>&#160;            ptr[i].~T();</div>
-<div class="line"><a name="l04688"></a><span class="lineno"> 4688</span>&#160;        }</div>
-<div class="line"><a name="l04689"></a><span class="lineno"> 4689</span>&#160;        VmaFree(pAllocationCallbacks, ptr);</div>
-<div class="line"><a name="l04690"></a><span class="lineno"> 4690</span>&#160;    }</div>
-<div class="line"><a name="l04691"></a><span class="lineno"> 4691</span>&#160;}</div>
-<div class="line"><a name="l04692"></a><span class="lineno"> 4692</span>&#160; </div>
-<div class="line"><a name="l04693"></a><span class="lineno"> 4693</span>&#160;<span class="keyword">static</span> <span class="keywordtype">char</span>* VmaCreateStringCopy(<span class="keyword">const</span> VkAllocationCallbacks* allocs, <span class="keyword">const</span> <span class="keywordtype">char</span>* srcStr)</div>
-<div class="line"><a name="l04694"></a><span class="lineno"> 4694</span>&#160;{</div>
-<div class="line"><a name="l04695"></a><span class="lineno"> 4695</span>&#160;    <span class="keywordflow">if</span>(srcStr != VMA_NULL)</div>
-<div class="line"><a name="l04696"></a><span class="lineno"> 4696</span>&#160;    {</div>
-<div class="line"><a name="l04697"></a><span class="lineno"> 4697</span>&#160;        <span class="keyword">const</span> <span class="keywordtype">size_t</span> len = strlen(srcStr);</div>
-<div class="line"><a name="l04698"></a><span class="lineno"> 4698</span>&#160;        <span class="keywordtype">char</span>* <span class="keyword">const</span> result = vma_new_array(allocs, <span class="keywordtype">char</span>, len + 1);</div>
-<div class="line"><a name="l04699"></a><span class="lineno"> 4699</span>&#160;        memcpy(result, srcStr, len + 1);</div>
-<div class="line"><a name="l04700"></a><span class="lineno"> 4700</span>&#160;        <span class="keywordflow">return</span> result;</div>
-<div class="line"><a name="l04701"></a><span class="lineno"> 4701</span>&#160;    }</div>
-<div class="line"><a name="l04702"></a><span class="lineno"> 4702</span>&#160;    <span class="keywordflow">else</span></div>
-<div class="line"><a name="l04703"></a><span class="lineno"> 4703</span>&#160;    {</div>
-<div class="line"><a name="l04704"></a><span class="lineno"> 4704</span>&#160;        <span class="keywordflow">return</span> VMA_NULL;</div>
-<div class="line"><a name="l04705"></a><span class="lineno"> 4705</span>&#160;    }</div>
+<div class="line"><a name="l04685"></a><span class="lineno"> 4685</span>&#160;        *pDst = VMA_CORRUPTION_DETECTION_MAGIC_VALUE;</div>
+<div class="line"><a name="l04686"></a><span class="lineno"> 4686</span>&#160;    }</div>
+<div class="line"><a name="l04687"></a><span class="lineno"> 4687</span>&#160;<span class="preprocessor">#else</span></div>
+<div class="line"><a name="l04688"></a><span class="lineno"> 4688</span>&#160;    <span class="comment">// no-op</span></div>
+<div class="line"><a name="l04689"></a><span class="lineno"> 4689</span>&#160;<span class="preprocessor">#endif</span></div>
+<div class="line"><a name="l04690"></a><span class="lineno"> 4690</span>&#160;}</div>
+<div class="line"><a name="l04691"></a><span class="lineno"> 4691</span>&#160; </div>
+<div class="line"><a name="l04692"></a><span class="lineno"> 4692</span>&#160;<span class="keyword">static</span> <span class="keywordtype">bool</span> VmaValidateMagicValue(<span class="keyword">const</span> <span class="keywordtype">void</span>* pData, VkDeviceSize offset)</div>
+<div class="line"><a name="l04693"></a><span class="lineno"> 4693</span>&#160;{</div>
+<div class="line"><a name="l04694"></a><span class="lineno"> 4694</span>&#160;<span class="preprocessor">#if VMA_DEBUG_MARGIN &gt; 0 &amp;&amp; VMA_DEBUG_DETECT_CORRUPTION</span></div>
+<div class="line"><a name="l04695"></a><span class="lineno"> 4695</span>&#160;    <span class="keyword">const</span> uint32_t* pSrc = (<span class="keyword">const</span> uint32_t*)((<span class="keyword">const</span> <span class="keywordtype">char</span>*)pData + offset);</div>
+<div class="line"><a name="l04696"></a><span class="lineno"> 4696</span>&#160;    <span class="keyword">const</span> <span class="keywordtype">size_t</span> numberCount = VMA_DEBUG_MARGIN / <span class="keyword">sizeof</span>(uint32_t);</div>
+<div class="line"><a name="l04697"></a><span class="lineno"> 4697</span>&#160;    <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> i = 0; i &lt; numberCount; ++i, ++pSrc)</div>
+<div class="line"><a name="l04698"></a><span class="lineno"> 4698</span>&#160;    {</div>
+<div class="line"><a name="l04699"></a><span class="lineno"> 4699</span>&#160;        <span class="keywordflow">if</span>(*pSrc != VMA_CORRUPTION_DETECTION_MAGIC_VALUE)</div>
+<div class="line"><a name="l04700"></a><span class="lineno"> 4700</span>&#160;        {</div>
+<div class="line"><a name="l04701"></a><span class="lineno"> 4701</span>&#160;            <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
+<div class="line"><a name="l04702"></a><span class="lineno"> 4702</span>&#160;        }</div>
+<div class="line"><a name="l04703"></a><span class="lineno"> 4703</span>&#160;    }</div>
+<div class="line"><a name="l04704"></a><span class="lineno"> 4704</span>&#160;<span class="preprocessor">#endif</span></div>
+<div class="line"><a name="l04705"></a><span class="lineno"> 4705</span>&#160;    <span class="keywordflow">return</span> <span class="keyword">true</span>;</div>
 <div class="line"><a name="l04706"></a><span class="lineno"> 4706</span>&#160;}</div>
 <div class="line"><a name="l04707"></a><span class="lineno"> 4707</span>&#160; </div>
-<div class="line"><a name="l04708"></a><span class="lineno"> 4708</span>&#160;<span class="keyword">static</span> <span class="keywordtype">void</span> VmaFreeString(<span class="keyword">const</span> VkAllocationCallbacks* allocs, <span class="keywordtype">char</span>* str)</div>
-<div class="line"><a name="l04709"></a><span class="lineno"> 4709</span>&#160;{</div>
-<div class="line"><a name="l04710"></a><span class="lineno"> 4710</span>&#160;    <span class="keywordflow">if</span>(str != VMA_NULL)</div>
-<div class="line"><a name="l04711"></a><span class="lineno"> 4711</span>&#160;    {</div>
-<div class="line"><a name="l04712"></a><span class="lineno"> 4712</span>&#160;        <span class="keyword">const</span> <span class="keywordtype">size_t</span> len = strlen(str);</div>
-<div class="line"><a name="l04713"></a><span class="lineno"> 4713</span>&#160;        vma_delete_array(allocs, str, len + 1);</div>
-<div class="line"><a name="l04714"></a><span class="lineno"> 4714</span>&#160;    }</div>
-<div class="line"><a name="l04715"></a><span class="lineno"> 4715</span>&#160;}</div>
-<div class="line"><a name="l04716"></a><span class="lineno"> 4716</span>&#160; </div>
-<div class="line"><a name="l04717"></a><span class="lineno"> 4717</span>&#160;<span class="comment">// STL-compatible allocator.</span></div>
-<div class="line"><a name="l04718"></a><span class="lineno"> 4718</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt;</div>
-<div class="line"><a name="l04719"></a><span class="lineno"> 4719</span>&#160;<span class="keyword">class </span>VmaStlAllocator</div>
-<div class="line"><a name="l04720"></a><span class="lineno"> 4720</span>&#160;{</div>
-<div class="line"><a name="l04721"></a><span class="lineno"> 4721</span>&#160;<span class="keyword">public</span>:</div>
-<div class="line"><a name="l04722"></a><span class="lineno"> 4722</span>&#160;    <span class="keyword">const</span> VkAllocationCallbacks* <span class="keyword">const</span> m_pCallbacks;</div>
-<div class="line"><a name="l04723"></a><span class="lineno"> 4723</span>&#160;    <span class="keyword">typedef</span> T value_type;</div>
-<div class="line"><a name="l04724"></a><span class="lineno"> 4724</span>&#160;    </div>
-<div class="line"><a name="l04725"></a><span class="lineno"> 4725</span>&#160;    VmaStlAllocator(<span class="keyword">const</span> VkAllocationCallbacks* pCallbacks) : m_pCallbacks(pCallbacks) { }</div>
-<div class="line"><a name="l04726"></a><span class="lineno"> 4726</span>&#160;    <span class="keyword">template</span>&lt;<span class="keyword">typename</span> U&gt; VmaStlAllocator(<span class="keyword">const</span> VmaStlAllocator&lt;U&gt;&amp; src) : m_pCallbacks(src.m_pCallbacks) { }</div>
-<div class="line"><a name="l04727"></a><span class="lineno"> 4727</span>&#160; </div>
-<div class="line"><a name="l04728"></a><span class="lineno"> 4728</span>&#160;    T* allocate(<span class="keywordtype">size_t</span> n) { <span class="keywordflow">return</span> VmaAllocateArray&lt;T&gt;(m_pCallbacks, n); }</div>
-<div class="line"><a name="l04729"></a><span class="lineno"> 4729</span>&#160;    <span class="keywordtype">void</span> deallocate(T* p, <span class="keywordtype">size_t</span> n) { VmaFree(m_pCallbacks, p); }</div>
-<div class="line"><a name="l04730"></a><span class="lineno"> 4730</span>&#160; </div>
-<div class="line"><a name="l04731"></a><span class="lineno"> 4731</span>&#160;    <span class="keyword">template</span>&lt;<span class="keyword">typename</span> U&gt;</div>
-<div class="line"><a name="l04732"></a><span class="lineno"> 4732</span>&#160;    <span class="keywordtype">bool</span> operator==(<span class="keyword">const</span> VmaStlAllocator&lt;U&gt;&amp; rhs)<span class="keyword"> const</span></div>
-<div class="line"><a name="l04733"></a><span class="lineno"> 4733</span>&#160;<span class="keyword">    </span>{</div>
-<div class="line"><a name="l04734"></a><span class="lineno"> 4734</span>&#160;        <span class="keywordflow">return</span> m_pCallbacks == rhs.m_pCallbacks;</div>
-<div class="line"><a name="l04735"></a><span class="lineno"> 4735</span>&#160;    }</div>
-<div class="line"><a name="l04736"></a><span class="lineno"> 4736</span>&#160;    <span class="keyword">template</span>&lt;<span class="keyword">typename</span> U&gt;</div>
-<div class="line"><a name="l04737"></a><span class="lineno"> 4737</span>&#160;    <span class="keywordtype">bool</span> operator!=(<span class="keyword">const</span> VmaStlAllocator&lt;U&gt;&amp; rhs)<span class="keyword"> const</span></div>
-<div class="line"><a name="l04738"></a><span class="lineno"> 4738</span>&#160;<span class="keyword">    </span>{</div>
-<div class="line"><a name="l04739"></a><span class="lineno"> 4739</span>&#160;        <span class="keywordflow">return</span> m_pCallbacks != rhs.m_pCallbacks;</div>
-<div class="line"><a name="l04740"></a><span class="lineno"> 4740</span>&#160;    }</div>
-<div class="line"><a name="l04741"></a><span class="lineno"> 4741</span>&#160; </div>
-<div class="line"><a name="l04742"></a><span class="lineno"> 4742</span>&#160;    VmaStlAllocator&amp; operator=(<span class="keyword">const</span> VmaStlAllocator&amp; x) = <span class="keyword">delete</span>;</div>
-<div class="line"><a name="l04743"></a><span class="lineno"> 4743</span>&#160;};</div>
-<div class="line"><a name="l04744"></a><span class="lineno"> 4744</span>&#160; </div>
-<div class="line"><a name="l04745"></a><span class="lineno"> 4745</span>&#160;<span class="preprocessor">#if VMA_USE_STL_VECTOR</span></div>
+<div class="line"><a name="l04708"></a><span class="lineno"> 4708</span>&#160;<span class="comment">/*</span></div>
+<div class="line"><a name="l04709"></a><span class="lineno"> 4709</span>&#160;<span class="comment">Fills structure with parameters of an example buffer to be used for transfers</span></div>
+<div class="line"><a name="l04710"></a><span class="lineno"> 4710</span>&#160;<span class="comment">during GPU memory defragmentation.</span></div>
+<div class="line"><a name="l04711"></a><span class="lineno"> 4711</span>&#160;<span class="comment">*/</span></div>
+<div class="line"><a name="l04712"></a><span class="lineno"> 4712</span>&#160;<span class="keyword">static</span> <span class="keywordtype">void</span> VmaFillGpuDefragmentationBufferCreateInfo(VkBufferCreateInfo&amp; outBufCreateInfo)</div>
+<div class="line"><a name="l04713"></a><span class="lineno"> 4713</span>&#160;{</div>
+<div class="line"><a name="l04714"></a><span class="lineno"> 4714</span>&#160;    memset(&amp;outBufCreateInfo, 0, <span class="keyword">sizeof</span>(outBufCreateInfo));</div>
+<div class="line"><a name="l04715"></a><span class="lineno"> 4715</span>&#160;    outBufCreateInfo.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;</div>
+<div class="line"><a name="l04716"></a><span class="lineno"> 4716</span>&#160;    outBufCreateInfo.usage = VK_BUFFER_USAGE_TRANSFER_SRC_BIT | VK_BUFFER_USAGE_TRANSFER_DST_BIT;</div>
+<div class="line"><a name="l04717"></a><span class="lineno"> 4717</span>&#160;    outBufCreateInfo.size = (VkDeviceSize)VMA_DEFAULT_LARGE_HEAP_BLOCK_SIZE; <span class="comment">// Example size.</span></div>
+<div class="line"><a name="l04718"></a><span class="lineno"> 4718</span>&#160;}</div>
+<div class="line"><a name="l04719"></a><span class="lineno"> 4719</span>&#160; </div>
+<div class="line"><a name="l04720"></a><span class="lineno"> 4720</span>&#160;<span class="comment">// Helper RAII class to lock a mutex in constructor and unlock it in destructor (at the end of scope).</span></div>
+<div class="line"><a name="l04721"></a><span class="lineno"> 4721</span>&#160;<span class="keyword">struct </span>VmaMutexLock</div>
+<div class="line"><a name="l04722"></a><span class="lineno"> 4722</span>&#160;{</div>
+<div class="line"><a name="l04723"></a><span class="lineno"> 4723</span>&#160;    VMA_CLASS_NO_COPY(VmaMutexLock)</div>
+<div class="line"><a name="l04724"></a><span class="lineno"> 4724</span>&#160;<span class="keyword">public</span>:</div>
+<div class="line"><a name="l04725"></a><span class="lineno"> 4725</span>&#160;    VmaMutexLock(VMA_MUTEX&amp; mutex, <span class="keywordtype">bool</span> useMutex = <span class="keyword">true</span>) :</div>
+<div class="line"><a name="l04726"></a><span class="lineno"> 4726</span>&#160;        m_pMutex(useMutex ? &amp;mutex : VMA_NULL)</div>
+<div class="line"><a name="l04727"></a><span class="lineno"> 4727</span>&#160;    { <span class="keywordflow">if</span>(m_pMutex) { m_pMutex-&gt;Lock(); } }</div>
+<div class="line"><a name="l04728"></a><span class="lineno"> 4728</span>&#160;    ~VmaMutexLock()</div>
+<div class="line"><a name="l04729"></a><span class="lineno"> 4729</span>&#160;    { <span class="keywordflow">if</span>(m_pMutex) { m_pMutex-&gt;Unlock(); } }</div>
+<div class="line"><a name="l04730"></a><span class="lineno"> 4730</span>&#160;<span class="keyword">private</span>:</div>
+<div class="line"><a name="l04731"></a><span class="lineno"> 4731</span>&#160;    VMA_MUTEX* m_pMutex;</div>
+<div class="line"><a name="l04732"></a><span class="lineno"> 4732</span>&#160;};</div>
+<div class="line"><a name="l04733"></a><span class="lineno"> 4733</span>&#160; </div>
+<div class="line"><a name="l04734"></a><span class="lineno"> 4734</span>&#160;<span class="comment">// Helper RAII class to lock a RW mutex in constructor and unlock it in destructor (at the end of scope), for reading.</span></div>
+<div class="line"><a name="l04735"></a><span class="lineno"> 4735</span>&#160;<span class="keyword">struct </span>VmaMutexLockRead</div>
+<div class="line"><a name="l04736"></a><span class="lineno"> 4736</span>&#160;{</div>
+<div class="line"><a name="l04737"></a><span class="lineno"> 4737</span>&#160;    VMA_CLASS_NO_COPY(VmaMutexLockRead)</div>
+<div class="line"><a name="l04738"></a><span class="lineno"> 4738</span>&#160;<span class="keyword">public</span>:</div>
+<div class="line"><a name="l04739"></a><span class="lineno"> 4739</span>&#160;    VmaMutexLockRead(VMA_RW_MUTEX&amp; mutex, <span class="keywordtype">bool</span> useMutex) :</div>
+<div class="line"><a name="l04740"></a><span class="lineno"> 4740</span>&#160;        m_pMutex(useMutex ? &amp;mutex : VMA_NULL)</div>
+<div class="line"><a name="l04741"></a><span class="lineno"> 4741</span>&#160;    { <span class="keywordflow">if</span>(m_pMutex) { m_pMutex-&gt;LockRead(); } }</div>
+<div class="line"><a name="l04742"></a><span class="lineno"> 4742</span>&#160;    ~VmaMutexLockRead() { <span class="keywordflow">if</span>(m_pMutex) { m_pMutex-&gt;UnlockRead(); } }</div>
+<div class="line"><a name="l04743"></a><span class="lineno"> 4743</span>&#160;<span class="keyword">private</span>:</div>
+<div class="line"><a name="l04744"></a><span class="lineno"> 4744</span>&#160;    VMA_RW_MUTEX* m_pMutex;</div>
+<div class="line"><a name="l04745"></a><span class="lineno"> 4745</span>&#160;};</div>
 <div class="line"><a name="l04746"></a><span class="lineno"> 4746</span>&#160; </div>
-<div class="line"><a name="l04747"></a><span class="lineno"> 4747</span>&#160;<span class="preprocessor">#define VmaVector std::vector</span></div>
-<div class="line"><a name="l04748"></a><span class="lineno"> 4748</span>&#160; </div>
-<div class="line"><a name="l04749"></a><span class="lineno"> 4749</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> T, <span class="keyword">typename</span> allocatorT&gt;</div>
-<div class="line"><a name="l04750"></a><span class="lineno"> 4750</span>&#160;<span class="keyword">static</span> <span class="keywordtype">void</span> VmaVectorInsert(std::vector&lt;T, allocatorT&gt;&amp; vec, <span class="keywordtype">size_t</span> index, <span class="keyword">const</span> T&amp; item)</div>
-<div class="line"><a name="l04751"></a><span class="lineno"> 4751</span>&#160;{</div>
-<div class="line"><a name="l04752"></a><span class="lineno"> 4752</span>&#160;    vec.insert(vec.begin() + index, item);</div>
-<div class="line"><a name="l04753"></a><span class="lineno"> 4753</span>&#160;}</div>
-<div class="line"><a name="l04754"></a><span class="lineno"> 4754</span>&#160; </div>
-<div class="line"><a name="l04755"></a><span class="lineno"> 4755</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> T, <span class="keyword">typename</span> allocatorT&gt;</div>
-<div class="line"><a name="l04756"></a><span class="lineno"> 4756</span>&#160;<span class="keyword">static</span> <span class="keywordtype">void</span> VmaVectorRemove(std::vector&lt;T, allocatorT&gt;&amp; vec, <span class="keywordtype">size_t</span> index)</div>
-<div class="line"><a name="l04757"></a><span class="lineno"> 4757</span>&#160;{</div>
-<div class="line"><a name="l04758"></a><span class="lineno"> 4758</span>&#160;    vec.erase(vec.begin() + index);</div>
-<div class="line"><a name="l04759"></a><span class="lineno"> 4759</span>&#160;}</div>
-<div class="line"><a name="l04760"></a><span class="lineno"> 4760</span>&#160; </div>
-<div class="line"><a name="l04761"></a><span class="lineno"> 4761</span>&#160;<span class="preprocessor">#else // #if VMA_USE_STL_VECTOR</span></div>
-<div class="line"><a name="l04762"></a><span class="lineno"> 4762</span>&#160; </div>
-<div class="line"><a name="l04763"></a><span class="lineno"> 4763</span>&#160;<span class="comment">/* Class with interface compatible with subset of std::vector.</span></div>
-<div class="line"><a name="l04764"></a><span class="lineno"> 4764</span>&#160;<span class="comment">T must be POD because constructors and destructors are not called and memcpy is</span></div>
-<div class="line"><a name="l04765"></a><span class="lineno"> 4765</span>&#160;<span class="comment">used for these objects. */</span></div>
-<div class="line"><a name="l04766"></a><span class="lineno"> 4766</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> T, <span class="keyword">typename</span> AllocatorT&gt;</div>
-<div class="line"><a name="l04767"></a><span class="lineno"> 4767</span>&#160;<span class="keyword">class </span>VmaVector</div>
-<div class="line"><a name="l04768"></a><span class="lineno"> 4768</span>&#160;{</div>
-<div class="line"><a name="l04769"></a><span class="lineno"> 4769</span>&#160;<span class="keyword">public</span>:</div>
-<div class="line"><a name="l04770"></a><span class="lineno"> 4770</span>&#160;    <span class="keyword">typedef</span> T value_type;</div>
-<div class="line"><a name="l04771"></a><span class="lineno"> 4771</span>&#160; </div>
-<div class="line"><a name="l04772"></a><span class="lineno"> 4772</span>&#160;    VmaVector(<span class="keyword">const</span> AllocatorT&amp; allocator) :</div>
-<div class="line"><a name="l04773"></a><span class="lineno"> 4773</span>&#160;        m_Allocator(allocator),</div>
-<div class="line"><a name="l04774"></a><span class="lineno"> 4774</span>&#160;        m_pArray(VMA_NULL),</div>
-<div class="line"><a name="l04775"></a><span class="lineno"> 4775</span>&#160;        m_Count(0),</div>
-<div class="line"><a name="l04776"></a><span class="lineno"> 4776</span>&#160;        m_Capacity(0)</div>
-<div class="line"><a name="l04777"></a><span class="lineno"> 4777</span>&#160;    {</div>
-<div class="line"><a name="l04778"></a><span class="lineno"> 4778</span>&#160;    }</div>
-<div class="line"><a name="l04779"></a><span class="lineno"> 4779</span>&#160; </div>
-<div class="line"><a name="l04780"></a><span class="lineno"> 4780</span>&#160;    VmaVector(<span class="keywordtype">size_t</span> count, <span class="keyword">const</span> AllocatorT&amp; allocator) :</div>
-<div class="line"><a name="l04781"></a><span class="lineno"> 4781</span>&#160;        m_Allocator(allocator),</div>
-<div class="line"><a name="l04782"></a><span class="lineno"> 4782</span>&#160;        m_pArray(count ? (T*)VmaAllocateArray&lt;T&gt;(allocator.m_pCallbacks, count) : VMA_NULL),</div>
-<div class="line"><a name="l04783"></a><span class="lineno"> 4783</span>&#160;        m_Count(count),</div>
-<div class="line"><a name="l04784"></a><span class="lineno"> 4784</span>&#160;        m_Capacity(count)</div>
-<div class="line"><a name="l04785"></a><span class="lineno"> 4785</span>&#160;    {</div>
-<div class="line"><a name="l04786"></a><span class="lineno"> 4786</span>&#160;    }</div>
-<div class="line"><a name="l04787"></a><span class="lineno"> 4787</span>&#160;    </div>
-<div class="line"><a name="l04788"></a><span class="lineno"> 4788</span>&#160;    <span class="comment">// This version of the constructor is here for compatibility with pre-C++14 std::vector.</span></div>
-<div class="line"><a name="l04789"></a><span class="lineno"> 4789</span>&#160;    <span class="comment">// value is unused.</span></div>
-<div class="line"><a name="l04790"></a><span class="lineno"> 4790</span>&#160;    VmaVector(<span class="keywordtype">size_t</span> count, <span class="keyword">const</span> T&amp; value, <span class="keyword">const</span> AllocatorT&amp; allocator)</div>
-<div class="line"><a name="l04791"></a><span class="lineno"> 4791</span>&#160;        : VmaVector(count, allocator) {}</div>
-<div class="line"><a name="l04792"></a><span class="lineno"> 4792</span>&#160;    </div>
-<div class="line"><a name="l04793"></a><span class="lineno"> 4793</span>&#160;    VmaVector(<span class="keyword">const</span> VmaVector&lt;T, AllocatorT&gt;&amp; src) :</div>
-<div class="line"><a name="l04794"></a><span class="lineno"> 4794</span>&#160;        m_Allocator(src.m_Allocator),</div>
-<div class="line"><a name="l04795"></a><span class="lineno"> 4795</span>&#160;        m_pArray(src.m_Count ? (T*)VmaAllocateArray&lt;T&gt;(src.m_Allocator.m_pCallbacks, src.m_Count) : VMA_NULL),</div>
-<div class="line"><a name="l04796"></a><span class="lineno"> 4796</span>&#160;        m_Count(src.m_Count),</div>
-<div class="line"><a name="l04797"></a><span class="lineno"> 4797</span>&#160;        m_Capacity(src.m_Count)</div>
-<div class="line"><a name="l04798"></a><span class="lineno"> 4798</span>&#160;    {</div>
-<div class="line"><a name="l04799"></a><span class="lineno"> 4799</span>&#160;        <span class="keywordflow">if</span>(m_Count != 0)</div>
-<div class="line"><a name="l04800"></a><span class="lineno"> 4800</span>&#160;        {</div>
-<div class="line"><a name="l04801"></a><span class="lineno"> 4801</span>&#160;            memcpy(m_pArray, src.m_pArray, m_Count * <span class="keyword">sizeof</span>(T));</div>
-<div class="line"><a name="l04802"></a><span class="lineno"> 4802</span>&#160;        }</div>
-<div class="line"><a name="l04803"></a><span class="lineno"> 4803</span>&#160;    }</div>
-<div class="line"><a name="l04804"></a><span class="lineno"> 4804</span>&#160;    </div>
-<div class="line"><a name="l04805"></a><span class="lineno"> 4805</span>&#160;    ~VmaVector()</div>
-<div class="line"><a name="l04806"></a><span class="lineno"> 4806</span>&#160;    {</div>
-<div class="line"><a name="l04807"></a><span class="lineno"> 4807</span>&#160;        VmaFree(m_Allocator.m_pCallbacks, m_pArray);</div>
-<div class="line"><a name="l04808"></a><span class="lineno"> 4808</span>&#160;    }</div>
-<div class="line"><a name="l04809"></a><span class="lineno"> 4809</span>&#160; </div>
-<div class="line"><a name="l04810"></a><span class="lineno"> 4810</span>&#160;    VmaVector&amp; operator=(<span class="keyword">const</span> VmaVector&lt;T, AllocatorT&gt;&amp; rhs)</div>
-<div class="line"><a name="l04811"></a><span class="lineno"> 4811</span>&#160;    {</div>
-<div class="line"><a name="l04812"></a><span class="lineno"> 4812</span>&#160;        <span class="keywordflow">if</span>(&amp;rhs != <span class="keyword">this</span>)</div>
-<div class="line"><a name="l04813"></a><span class="lineno"> 4813</span>&#160;        {</div>
-<div class="line"><a name="l04814"></a><span class="lineno"> 4814</span>&#160;            resize(rhs.m_Count);</div>
-<div class="line"><a name="l04815"></a><span class="lineno"> 4815</span>&#160;            <span class="keywordflow">if</span>(m_Count != 0)</div>
-<div class="line"><a name="l04816"></a><span class="lineno"> 4816</span>&#160;            {</div>
-<div class="line"><a name="l04817"></a><span class="lineno"> 4817</span>&#160;                memcpy(m_pArray, rhs.m_pArray, m_Count * <span class="keyword">sizeof</span>(T));</div>
-<div class="line"><a name="l04818"></a><span class="lineno"> 4818</span>&#160;            }</div>
-<div class="line"><a name="l04819"></a><span class="lineno"> 4819</span>&#160;        }</div>
-<div class="line"><a name="l04820"></a><span class="lineno"> 4820</span>&#160;        <span class="keywordflow">return</span> *<span class="keyword">this</span>;</div>
-<div class="line"><a name="l04821"></a><span class="lineno"> 4821</span>&#160;    }</div>
-<div class="line"><a name="l04822"></a><span class="lineno"> 4822</span>&#160;    </div>
-<div class="line"><a name="l04823"></a><span class="lineno"> 4823</span>&#160;    <span class="keywordtype">bool</span> empty()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_Count == 0; }</div>
-<div class="line"><a name="l04824"></a><span class="lineno"> 4824</span>&#160;    <span class="keywordtype">size_t</span> size()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_Count; }</div>
-<div class="line"><a name="l04825"></a><span class="lineno"> 4825</span>&#160;    T* data() { <span class="keywordflow">return</span> m_pArray; }</div>
-<div class="line"><a name="l04826"></a><span class="lineno"> 4826</span>&#160;    <span class="keyword">const</span> T* data()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_pArray; }</div>
-<div class="line"><a name="l04827"></a><span class="lineno"> 4827</span>&#160;    </div>
-<div class="line"><a name="l04828"></a><span class="lineno"> 4828</span>&#160;    T&amp; operator[](<span class="keywordtype">size_t</span> index)</div>
-<div class="line"><a name="l04829"></a><span class="lineno"> 4829</span>&#160;    {</div>
-<div class="line"><a name="l04830"></a><span class="lineno"> 4830</span>&#160;        VMA_HEAVY_ASSERT(index &lt; m_Count);</div>
-<div class="line"><a name="l04831"></a><span class="lineno"> 4831</span>&#160;        <span class="keywordflow">return</span> m_pArray[index];</div>
-<div class="line"><a name="l04832"></a><span class="lineno"> 4832</span>&#160;    }</div>
-<div class="line"><a name="l04833"></a><span class="lineno"> 4833</span>&#160;    <span class="keyword">const</span> T&amp; operator[](<span class="keywordtype">size_t</span> index)<span class="keyword"> const</span></div>
-<div class="line"><a name="l04834"></a><span class="lineno"> 4834</span>&#160;<span class="keyword">    </span>{</div>
-<div class="line"><a name="l04835"></a><span class="lineno"> 4835</span>&#160;        VMA_HEAVY_ASSERT(index &lt; m_Count);</div>
-<div class="line"><a name="l04836"></a><span class="lineno"> 4836</span>&#160;        <span class="keywordflow">return</span> m_pArray[index];</div>
-<div class="line"><a name="l04837"></a><span class="lineno"> 4837</span>&#160;    }</div>
-<div class="line"><a name="l04838"></a><span class="lineno"> 4838</span>&#160; </div>
-<div class="line"><a name="l04839"></a><span class="lineno"> 4839</span>&#160;    T&amp; front()</div>
-<div class="line"><a name="l04840"></a><span class="lineno"> 4840</span>&#160;    {</div>
-<div class="line"><a name="l04841"></a><span class="lineno"> 4841</span>&#160;        VMA_HEAVY_ASSERT(m_Count &gt; 0);</div>
-<div class="line"><a name="l04842"></a><span class="lineno"> 4842</span>&#160;        <span class="keywordflow">return</span> m_pArray[0];</div>
-<div class="line"><a name="l04843"></a><span class="lineno"> 4843</span>&#160;    }</div>
-<div class="line"><a name="l04844"></a><span class="lineno"> 4844</span>&#160;    <span class="keyword">const</span> T&amp; front()<span class="keyword"> const</span></div>
-<div class="line"><a name="l04845"></a><span class="lineno"> 4845</span>&#160;<span class="keyword">    </span>{</div>
-<div class="line"><a name="l04846"></a><span class="lineno"> 4846</span>&#160;        VMA_HEAVY_ASSERT(m_Count &gt; 0);</div>
-<div class="line"><a name="l04847"></a><span class="lineno"> 4847</span>&#160;        <span class="keywordflow">return</span> m_pArray[0];</div>
-<div class="line"><a name="l04848"></a><span class="lineno"> 4848</span>&#160;    }</div>
-<div class="line"><a name="l04849"></a><span class="lineno"> 4849</span>&#160;    T&amp; back()</div>
-<div class="line"><a name="l04850"></a><span class="lineno"> 4850</span>&#160;    {</div>
-<div class="line"><a name="l04851"></a><span class="lineno"> 4851</span>&#160;        VMA_HEAVY_ASSERT(m_Count &gt; 0);</div>
-<div class="line"><a name="l04852"></a><span class="lineno"> 4852</span>&#160;        <span class="keywordflow">return</span> m_pArray[m_Count - 1];</div>
-<div class="line"><a name="l04853"></a><span class="lineno"> 4853</span>&#160;    }</div>
-<div class="line"><a name="l04854"></a><span class="lineno"> 4854</span>&#160;    <span class="keyword">const</span> T&amp; back()<span class="keyword"> const</span></div>
-<div class="line"><a name="l04855"></a><span class="lineno"> 4855</span>&#160;<span class="keyword">    </span>{</div>
-<div class="line"><a name="l04856"></a><span class="lineno"> 4856</span>&#160;        VMA_HEAVY_ASSERT(m_Count &gt; 0);</div>
-<div class="line"><a name="l04857"></a><span class="lineno"> 4857</span>&#160;        <span class="keywordflow">return</span> m_pArray[m_Count - 1];</div>
+<div class="line"><a name="l04747"></a><span class="lineno"> 4747</span>&#160;<span class="comment">// Helper RAII class to lock a RW mutex in constructor and unlock it in destructor (at the end of scope), for writing.</span></div>
+<div class="line"><a name="l04748"></a><span class="lineno"> 4748</span>&#160;<span class="keyword">struct </span>VmaMutexLockWrite</div>
+<div class="line"><a name="l04749"></a><span class="lineno"> 4749</span>&#160;{</div>
+<div class="line"><a name="l04750"></a><span class="lineno"> 4750</span>&#160;    VMA_CLASS_NO_COPY(VmaMutexLockWrite)</div>
+<div class="line"><a name="l04751"></a><span class="lineno"> 4751</span>&#160;<span class="keyword">public</span>:</div>
+<div class="line"><a name="l04752"></a><span class="lineno"> 4752</span>&#160;    VmaMutexLockWrite(VMA_RW_MUTEX&amp; mutex, <span class="keywordtype">bool</span> useMutex) :</div>
+<div class="line"><a name="l04753"></a><span class="lineno"> 4753</span>&#160;        m_pMutex(useMutex ? &amp;mutex : VMA_NULL)</div>
+<div class="line"><a name="l04754"></a><span class="lineno"> 4754</span>&#160;    { <span class="keywordflow">if</span>(m_pMutex) { m_pMutex-&gt;LockWrite(); } }</div>
+<div class="line"><a name="l04755"></a><span class="lineno"> 4755</span>&#160;    ~VmaMutexLockWrite() { <span class="keywordflow">if</span>(m_pMutex) { m_pMutex-&gt;UnlockWrite(); } }</div>
+<div class="line"><a name="l04756"></a><span class="lineno"> 4756</span>&#160;<span class="keyword">private</span>:</div>
+<div class="line"><a name="l04757"></a><span class="lineno"> 4757</span>&#160;    VMA_RW_MUTEX* m_pMutex;</div>
+<div class="line"><a name="l04758"></a><span class="lineno"> 4758</span>&#160;};</div>
+<div class="line"><a name="l04759"></a><span class="lineno"> 4759</span>&#160; </div>
+<div class="line"><a name="l04760"></a><span class="lineno"> 4760</span>&#160;<span class="preprocessor">#if VMA_DEBUG_GLOBAL_MUTEX</span></div>
+<div class="line"><a name="l04761"></a><span class="lineno"> 4761</span>&#160;    <span class="keyword">static</span> VMA_MUTEX gDebugGlobalMutex;</div>
+<div class="line"><a name="l04762"></a><span class="lineno"> 4762</span>&#160;<span class="preprocessor">    #define VMA_DEBUG_GLOBAL_MUTEX_LOCK VmaMutexLock debugGlobalMutexLock(gDebugGlobalMutex, true);</span></div>
+<div class="line"><a name="l04763"></a><span class="lineno"> 4763</span>&#160;<span class="preprocessor">#else</span></div>
+<div class="line"><a name="l04764"></a><span class="lineno"> 4764</span>&#160;<span class="preprocessor">    #define VMA_DEBUG_GLOBAL_MUTEX_LOCK</span></div>
+<div class="line"><a name="l04765"></a><span class="lineno"> 4765</span>&#160;<span class="preprocessor">#endif</span></div>
+<div class="line"><a name="l04766"></a><span class="lineno"> 4766</span>&#160; </div>
+<div class="line"><a name="l04767"></a><span class="lineno"> 4767</span>&#160;<span class="comment">// Minimum size of a free suballocation to register it in the free suballocation collection.</span></div>
+<div class="line"><a name="l04768"></a><span class="lineno"> 4768</span>&#160;<span class="keyword">static</span> <span class="keyword">const</span> VkDeviceSize VMA_MIN_FREE_SUBALLOCATION_SIZE_TO_REGISTER = 16;</div>
+<div class="line"><a name="l04769"></a><span class="lineno"> 4769</span>&#160; </div>
+<div class="line"><a name="l04770"></a><span class="lineno"> 4770</span>&#160;<span class="comment">/*</span></div>
+<div class="line"><a name="l04771"></a><span class="lineno"> 4771</span>&#160;<span class="comment">Performs binary search and returns iterator to first element that is greater or</span></div>
+<div class="line"><a name="l04772"></a><span class="lineno"> 4772</span>&#160;<span class="comment">equal to (key), according to comparison (cmp).</span></div>
+<div class="line"><a name="l04773"></a><span class="lineno"> 4773</span>&#160;<span class="comment"></span> </div>
+<div class="line"><a name="l04774"></a><span class="lineno"> 4774</span>&#160;<span class="comment">Cmp should return true if first argument is less than second argument.</span></div>
+<div class="line"><a name="l04775"></a><span class="lineno"> 4775</span>&#160;<span class="comment"></span> </div>
+<div class="line"><a name="l04776"></a><span class="lineno"> 4776</span>&#160;<span class="comment">Returned value is the found element, if present in the collection or place where</span></div>
+<div class="line"><a name="l04777"></a><span class="lineno"> 4777</span>&#160;<span class="comment">new element with value (key) should be inserted.</span></div>
+<div class="line"><a name="l04778"></a><span class="lineno"> 4778</span>&#160;<span class="comment">*/</span></div>
+<div class="line"><a name="l04779"></a><span class="lineno"> 4779</span>&#160;<span class="keyword">template</span> &lt;<span class="keyword">typename</span> CmpLess, <span class="keyword">typename</span> IterT, <span class="keyword">typename</span> KeyT&gt;</div>
+<div class="line"><a name="l04780"></a><span class="lineno"> 4780</span>&#160;<span class="keyword">static</span> IterT VmaBinaryFindFirstNotLess(IterT beg, IterT end, <span class="keyword">const</span> KeyT &amp;key, <span class="keyword">const</span> CmpLess&amp; cmp)</div>
+<div class="line"><a name="l04781"></a><span class="lineno"> 4781</span>&#160;{</div>
+<div class="line"><a name="l04782"></a><span class="lineno"> 4782</span>&#160;    <span class="keywordtype">size_t</span> down = 0, up = (end - beg);</div>
+<div class="line"><a name="l04783"></a><span class="lineno"> 4783</span>&#160;    <span class="keywordflow">while</span>(down &lt; up)</div>
+<div class="line"><a name="l04784"></a><span class="lineno"> 4784</span>&#160;    {</div>
+<div class="line"><a name="l04785"></a><span class="lineno"> 4785</span>&#160;        <span class="keyword">const</span> <span class="keywordtype">size_t</span> mid = down + (up - down) / 2;  <span class="comment">// Overflow-safe midpoint calculation</span></div>
+<div class="line"><a name="l04786"></a><span class="lineno"> 4786</span>&#160;        <span class="keywordflow">if</span>(cmp(*(beg+mid), key))</div>
+<div class="line"><a name="l04787"></a><span class="lineno"> 4787</span>&#160;        {</div>
+<div class="line"><a name="l04788"></a><span class="lineno"> 4788</span>&#160;            down = mid + 1;</div>
+<div class="line"><a name="l04789"></a><span class="lineno"> 4789</span>&#160;        }</div>
+<div class="line"><a name="l04790"></a><span class="lineno"> 4790</span>&#160;        <span class="keywordflow">else</span></div>
+<div class="line"><a name="l04791"></a><span class="lineno"> 4791</span>&#160;        {</div>
+<div class="line"><a name="l04792"></a><span class="lineno"> 4792</span>&#160;            up = mid;</div>
+<div class="line"><a name="l04793"></a><span class="lineno"> 4793</span>&#160;        }</div>
+<div class="line"><a name="l04794"></a><span class="lineno"> 4794</span>&#160;    }</div>
+<div class="line"><a name="l04795"></a><span class="lineno"> 4795</span>&#160;    <span class="keywordflow">return</span> beg + down;</div>
+<div class="line"><a name="l04796"></a><span class="lineno"> 4796</span>&#160;}</div>
+<div class="line"><a name="l04797"></a><span class="lineno"> 4797</span>&#160; </div>
+<div class="line"><a name="l04798"></a><span class="lineno"> 4798</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> CmpLess, <span class="keyword">typename</span> IterT, <span class="keyword">typename</span> KeyT&gt;</div>
+<div class="line"><a name="l04799"></a><span class="lineno"> 4799</span>&#160;IterT VmaBinaryFindSorted(<span class="keyword">const</span> IterT&amp; beg, <span class="keyword">const</span> IterT&amp; end, <span class="keyword">const</span> KeyT&amp; value, <span class="keyword">const</span> CmpLess&amp; cmp)</div>
+<div class="line"><a name="l04800"></a><span class="lineno"> 4800</span>&#160;{</div>
+<div class="line"><a name="l04801"></a><span class="lineno"> 4801</span>&#160;    IterT it = VmaBinaryFindFirstNotLess&lt;CmpLess, IterT, KeyT&gt;(</div>
+<div class="line"><a name="l04802"></a><span class="lineno"> 4802</span>&#160;        beg, end, value, cmp);</div>
+<div class="line"><a name="l04803"></a><span class="lineno"> 4803</span>&#160;    <span class="keywordflow">if</span>(it == end ||</div>
+<div class="line"><a name="l04804"></a><span class="lineno"> 4804</span>&#160;        (!cmp(*it, value) &amp;&amp; !cmp(value, *it)))</div>
+<div class="line"><a name="l04805"></a><span class="lineno"> 4805</span>&#160;    {</div>
+<div class="line"><a name="l04806"></a><span class="lineno"> 4806</span>&#160;        <span class="keywordflow">return</span> it;</div>
+<div class="line"><a name="l04807"></a><span class="lineno"> 4807</span>&#160;    }</div>
+<div class="line"><a name="l04808"></a><span class="lineno"> 4808</span>&#160;    <span class="keywordflow">return</span> end;</div>
+<div class="line"><a name="l04809"></a><span class="lineno"> 4809</span>&#160;}</div>
+<div class="line"><a name="l04810"></a><span class="lineno"> 4810</span>&#160; </div>
+<div class="line"><a name="l04811"></a><span class="lineno"> 4811</span>&#160;<span class="comment">/*</span></div>
+<div class="line"><a name="l04812"></a><span class="lineno"> 4812</span>&#160;<span class="comment">Returns true if all pointers in the array are not-null and unique.</span></div>
+<div class="line"><a name="l04813"></a><span class="lineno"> 4813</span>&#160;<span class="comment">Warning! O(n^2) complexity. Use only inside VMA_HEAVY_ASSERT.</span></div>
+<div class="line"><a name="l04814"></a><span class="lineno"> 4814</span>&#160;<span class="comment">T must be pointer type, e.g. VmaAllocation, VmaPool.</span></div>
+<div class="line"><a name="l04815"></a><span class="lineno"> 4815</span>&#160;<span class="comment">*/</span></div>
+<div class="line"><a name="l04816"></a><span class="lineno"> 4816</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt;</div>
+<div class="line"><a name="l04817"></a><span class="lineno"> 4817</span>&#160;<span class="keyword">static</span> <span class="keywordtype">bool</span> VmaValidatePointerArray(uint32_t count, <span class="keyword">const</span> T* arr)</div>
+<div class="line"><a name="l04818"></a><span class="lineno"> 4818</span>&#160;{</div>
+<div class="line"><a name="l04819"></a><span class="lineno"> 4819</span>&#160;    <span class="keywordflow">for</span>(uint32_t i = 0; i &lt; count; ++i)</div>
+<div class="line"><a name="l04820"></a><span class="lineno"> 4820</span>&#160;    {</div>
+<div class="line"><a name="l04821"></a><span class="lineno"> 4821</span>&#160;        <span class="keyword">const</span> T iPtr = arr[i];</div>
+<div class="line"><a name="l04822"></a><span class="lineno"> 4822</span>&#160;        <span class="keywordflow">if</span>(iPtr == VMA_NULL)</div>
+<div class="line"><a name="l04823"></a><span class="lineno"> 4823</span>&#160;        {</div>
+<div class="line"><a name="l04824"></a><span class="lineno"> 4824</span>&#160;            <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
+<div class="line"><a name="l04825"></a><span class="lineno"> 4825</span>&#160;        }</div>
+<div class="line"><a name="l04826"></a><span class="lineno"> 4826</span>&#160;        <span class="keywordflow">for</span>(uint32_t j = i + 1; j &lt; count; ++j)</div>
+<div class="line"><a name="l04827"></a><span class="lineno"> 4827</span>&#160;        {</div>
+<div class="line"><a name="l04828"></a><span class="lineno"> 4828</span>&#160;            <span class="keywordflow">if</span>(iPtr == arr[j])</div>
+<div class="line"><a name="l04829"></a><span class="lineno"> 4829</span>&#160;            {</div>
+<div class="line"><a name="l04830"></a><span class="lineno"> 4830</span>&#160;                <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
+<div class="line"><a name="l04831"></a><span class="lineno"> 4831</span>&#160;            }</div>
+<div class="line"><a name="l04832"></a><span class="lineno"> 4832</span>&#160;        }</div>
+<div class="line"><a name="l04833"></a><span class="lineno"> 4833</span>&#160;    }</div>
+<div class="line"><a name="l04834"></a><span class="lineno"> 4834</span>&#160;    <span class="keywordflow">return</span> <span class="keyword">true</span>;</div>
+<div class="line"><a name="l04835"></a><span class="lineno"> 4835</span>&#160;}</div>
+<div class="line"><a name="l04836"></a><span class="lineno"> 4836</span>&#160; </div>
+<div class="line"><a name="l04837"></a><span class="lineno"> 4837</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> MainT, <span class="keyword">typename</span> NewT&gt;</div>
+<div class="line"><a name="l04838"></a><span class="lineno"> 4838</span>&#160;<span class="keyword">static</span> <span class="keyword">inline</span> <span class="keywordtype">void</span> VmaPnextChainPushFront(MainT* mainStruct, NewT* newStruct)</div>
+<div class="line"><a name="l04839"></a><span class="lineno"> 4839</span>&#160;{</div>
+<div class="line"><a name="l04840"></a><span class="lineno"> 4840</span>&#160;    newStruct-&gt;pNext = mainStruct-&gt;pNext;</div>
+<div class="line"><a name="l04841"></a><span class="lineno"> 4841</span>&#160;    mainStruct-&gt;pNext = newStruct;</div>
+<div class="line"><a name="l04842"></a><span class="lineno"> 4842</span>&#160;}</div>
+<div class="line"><a name="l04843"></a><span class="lineno"> 4843</span>&#160; </div>
+<div class="line"><a name="l04845"></a><span class="lineno"> 4845</span>&#160;<span class="comment">// Memory allocation</span></div>
+<div class="line"><a name="l04846"></a><span class="lineno"> 4846</span>&#160; </div>
+<div class="line"><a name="l04847"></a><span class="lineno"> 4847</span>&#160;<span class="keyword">static</span> <span class="keywordtype">void</span>* VmaMalloc(<span class="keyword">const</span> VkAllocationCallbacks* pAllocationCallbacks, <span class="keywordtype">size_t</span> size, <span class="keywordtype">size_t</span> alignment)</div>
+<div class="line"><a name="l04848"></a><span class="lineno"> 4848</span>&#160;{</div>
+<div class="line"><a name="l04849"></a><span class="lineno"> 4849</span>&#160;    <span class="keywordtype">void</span>* result = VMA_NULL;</div>
+<div class="line"><a name="l04850"></a><span class="lineno"> 4850</span>&#160;    <span class="keywordflow">if</span>((pAllocationCallbacks != VMA_NULL) &amp;&amp;</div>
+<div class="line"><a name="l04851"></a><span class="lineno"> 4851</span>&#160;        (pAllocationCallbacks-&gt;pfnAllocation != VMA_NULL))</div>
+<div class="line"><a name="l04852"></a><span class="lineno"> 4852</span>&#160;    {</div>
+<div class="line"><a name="l04853"></a><span class="lineno"> 4853</span>&#160;        result = (*pAllocationCallbacks-&gt;pfnAllocation)(</div>
+<div class="line"><a name="l04854"></a><span class="lineno"> 4854</span>&#160;            pAllocationCallbacks-&gt;pUserData,</div>
+<div class="line"><a name="l04855"></a><span class="lineno"> 4855</span>&#160;            size,</div>
+<div class="line"><a name="l04856"></a><span class="lineno"> 4856</span>&#160;            alignment,</div>
+<div class="line"><a name="l04857"></a><span class="lineno"> 4857</span>&#160;            VK_SYSTEM_ALLOCATION_SCOPE_OBJECT);</div>
 <div class="line"><a name="l04858"></a><span class="lineno"> 4858</span>&#160;    }</div>
-<div class="line"><a name="l04859"></a><span class="lineno"> 4859</span>&#160; </div>
-<div class="line"><a name="l04860"></a><span class="lineno"> 4860</span>&#160;    <span class="keywordtype">void</span> reserve(<span class="keywordtype">size_t</span> newCapacity, <span class="keywordtype">bool</span> freeMemory = <span class="keyword">false</span>)</div>
-<div class="line"><a name="l04861"></a><span class="lineno"> 4861</span>&#160;    {</div>
-<div class="line"><a name="l04862"></a><span class="lineno"> 4862</span>&#160;        newCapacity = VMA_MAX(newCapacity, m_Count);</div>
-<div class="line"><a name="l04863"></a><span class="lineno"> 4863</span>&#160;        </div>
-<div class="line"><a name="l04864"></a><span class="lineno"> 4864</span>&#160;        <span class="keywordflow">if</span>((newCapacity &lt; m_Capacity) &amp;&amp; !freeMemory)</div>
-<div class="line"><a name="l04865"></a><span class="lineno"> 4865</span>&#160;        {</div>
-<div class="line"><a name="l04866"></a><span class="lineno"> 4866</span>&#160;            newCapacity = m_Capacity;</div>
-<div class="line"><a name="l04867"></a><span class="lineno"> 4867</span>&#160;        }</div>
-<div class="line"><a name="l04868"></a><span class="lineno"> 4868</span>&#160;        </div>
-<div class="line"><a name="l04869"></a><span class="lineno"> 4869</span>&#160;        <span class="keywordflow">if</span>(newCapacity != m_Capacity)</div>
-<div class="line"><a name="l04870"></a><span class="lineno"> 4870</span>&#160;        {</div>
-<div class="line"><a name="l04871"></a><span class="lineno"> 4871</span>&#160;            T* <span class="keyword">const</span> newArray = newCapacity ? VmaAllocateArray&lt;T&gt;(m_Allocator, newCapacity) : VMA_NULL;</div>
-<div class="line"><a name="l04872"></a><span class="lineno"> 4872</span>&#160;            <span class="keywordflow">if</span>(m_Count != 0)</div>
-<div class="line"><a name="l04873"></a><span class="lineno"> 4873</span>&#160;            {</div>
-<div class="line"><a name="l04874"></a><span class="lineno"> 4874</span>&#160;                memcpy(newArray, m_pArray, m_Count * <span class="keyword">sizeof</span>(T));</div>
-<div class="line"><a name="l04875"></a><span class="lineno"> 4875</span>&#160;            }</div>
-<div class="line"><a name="l04876"></a><span class="lineno"> 4876</span>&#160;            VmaFree(m_Allocator.m_pCallbacks, m_pArray);</div>
-<div class="line"><a name="l04877"></a><span class="lineno"> 4877</span>&#160;            m_Capacity = newCapacity;</div>
-<div class="line"><a name="l04878"></a><span class="lineno"> 4878</span>&#160;            m_pArray = newArray;</div>
-<div class="line"><a name="l04879"></a><span class="lineno"> 4879</span>&#160;        }</div>
-<div class="line"><a name="l04880"></a><span class="lineno"> 4880</span>&#160;    }</div>
-<div class="line"><a name="l04881"></a><span class="lineno"> 4881</span>&#160; </div>
-<div class="line"><a name="l04882"></a><span class="lineno"> 4882</span>&#160;    <span class="keywordtype">void</span> resize(<span class="keywordtype">size_t</span> newCount, <span class="keywordtype">bool</span> freeMemory = <span class="keyword">false</span>)</div>
-<div class="line"><a name="l04883"></a><span class="lineno"> 4883</span>&#160;    {</div>
-<div class="line"><a name="l04884"></a><span class="lineno"> 4884</span>&#160;        <span class="keywordtype">size_t</span> newCapacity = m_Capacity;</div>
-<div class="line"><a name="l04885"></a><span class="lineno"> 4885</span>&#160;        <span class="keywordflow">if</span>(newCount &gt; m_Capacity)</div>
-<div class="line"><a name="l04886"></a><span class="lineno"> 4886</span>&#160;        {</div>
-<div class="line"><a name="l04887"></a><span class="lineno"> 4887</span>&#160;            newCapacity = VMA_MAX(newCount, VMA_MAX(m_Capacity * 3 / 2, (<span class="keywordtype">size_t</span>)8));</div>
-<div class="line"><a name="l04888"></a><span class="lineno"> 4888</span>&#160;        }</div>
-<div class="line"><a name="l04889"></a><span class="lineno"> 4889</span>&#160;        <span class="keywordflow">else</span> <span class="keywordflow">if</span>(freeMemory)</div>
-<div class="line"><a name="l04890"></a><span class="lineno"> 4890</span>&#160;        {</div>
-<div class="line"><a name="l04891"></a><span class="lineno"> 4891</span>&#160;            newCapacity = newCount;</div>
-<div class="line"><a name="l04892"></a><span class="lineno"> 4892</span>&#160;        }</div>
+<div class="line"><a name="l04859"></a><span class="lineno"> 4859</span>&#160;    <span class="keywordflow">else</span></div>
+<div class="line"><a name="l04860"></a><span class="lineno"> 4860</span>&#160;    {</div>
+<div class="line"><a name="l04861"></a><span class="lineno"> 4861</span>&#160;        result = VMA_SYSTEM_ALIGNED_MALLOC(size, alignment);</div>
+<div class="line"><a name="l04862"></a><span class="lineno"> 4862</span>&#160;    }</div>
+<div class="line"><a name="l04863"></a><span class="lineno"> 4863</span>&#160;    VMA_ASSERT(result != VMA_NULL &amp;&amp; <span class="stringliteral">&quot;CPU memory allocation failed.&quot;</span>);</div>
+<div class="line"><a name="l04864"></a><span class="lineno"> 4864</span>&#160;    <span class="keywordflow">return</span> result;</div>
+<div class="line"><a name="l04865"></a><span class="lineno"> 4865</span>&#160;}</div>
+<div class="line"><a name="l04866"></a><span class="lineno"> 4866</span>&#160; </div>
+<div class="line"><a name="l04867"></a><span class="lineno"> 4867</span>&#160;<span class="keyword">static</span> <span class="keywordtype">void</span> VmaFree(<span class="keyword">const</span> VkAllocationCallbacks* pAllocationCallbacks, <span class="keywordtype">void</span>* ptr)</div>
+<div class="line"><a name="l04868"></a><span class="lineno"> 4868</span>&#160;{</div>
+<div class="line"><a name="l04869"></a><span class="lineno"> 4869</span>&#160;    <span class="keywordflow">if</span>((pAllocationCallbacks != VMA_NULL) &amp;&amp;</div>
+<div class="line"><a name="l04870"></a><span class="lineno"> 4870</span>&#160;        (pAllocationCallbacks-&gt;pfnFree != VMA_NULL))</div>
+<div class="line"><a name="l04871"></a><span class="lineno"> 4871</span>&#160;    {</div>
+<div class="line"><a name="l04872"></a><span class="lineno"> 4872</span>&#160;        (*pAllocationCallbacks-&gt;pfnFree)(pAllocationCallbacks-&gt;pUserData, ptr);</div>
+<div class="line"><a name="l04873"></a><span class="lineno"> 4873</span>&#160;    }</div>
+<div class="line"><a name="l04874"></a><span class="lineno"> 4874</span>&#160;    <span class="keywordflow">else</span></div>
+<div class="line"><a name="l04875"></a><span class="lineno"> 4875</span>&#160;    {</div>
+<div class="line"><a name="l04876"></a><span class="lineno"> 4876</span>&#160;        VMA_SYSTEM_ALIGNED_FREE(ptr);</div>
+<div class="line"><a name="l04877"></a><span class="lineno"> 4877</span>&#160;    }</div>
+<div class="line"><a name="l04878"></a><span class="lineno"> 4878</span>&#160;}</div>
+<div class="line"><a name="l04879"></a><span class="lineno"> 4879</span>&#160; </div>
+<div class="line"><a name="l04880"></a><span class="lineno"> 4880</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt;</div>
+<div class="line"><a name="l04881"></a><span class="lineno"> 4881</span>&#160;<span class="keyword">static</span> T* VmaAllocate(<span class="keyword">const</span> VkAllocationCallbacks* pAllocationCallbacks)</div>
+<div class="line"><a name="l04882"></a><span class="lineno"> 4882</span>&#160;{</div>
+<div class="line"><a name="l04883"></a><span class="lineno"> 4883</span>&#160;    <span class="keywordflow">return</span> (T*)VmaMalloc(pAllocationCallbacks, <span class="keyword">sizeof</span>(T), VMA_ALIGN_OF(T));</div>
+<div class="line"><a name="l04884"></a><span class="lineno"> 4884</span>&#160;}</div>
+<div class="line"><a name="l04885"></a><span class="lineno"> 4885</span>&#160; </div>
+<div class="line"><a name="l04886"></a><span class="lineno"> 4886</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt;</div>
+<div class="line"><a name="l04887"></a><span class="lineno"> 4887</span>&#160;<span class="keyword">static</span> T* VmaAllocateArray(<span class="keyword">const</span> VkAllocationCallbacks* pAllocationCallbacks, <span class="keywordtype">size_t</span> count)</div>
+<div class="line"><a name="l04888"></a><span class="lineno"> 4888</span>&#160;{</div>
+<div class="line"><a name="l04889"></a><span class="lineno"> 4889</span>&#160;    <span class="keywordflow">return</span> (T*)VmaMalloc(pAllocationCallbacks, <span class="keyword">sizeof</span>(T) * count, VMA_ALIGN_OF(T));</div>
+<div class="line"><a name="l04890"></a><span class="lineno"> 4890</span>&#160;}</div>
+<div class="line"><a name="l04891"></a><span class="lineno"> 4891</span>&#160; </div>
+<div class="line"><a name="l04892"></a><span class="lineno"> 4892</span>&#160;<span class="preprocessor">#define vma_new(allocator, type)   new(VmaAllocate&lt;type&gt;(allocator))(type)</span></div>
 <div class="line"><a name="l04893"></a><span class="lineno"> 4893</span>&#160; </div>
-<div class="line"><a name="l04894"></a><span class="lineno"> 4894</span>&#160;        <span class="keywordflow">if</span>(newCapacity != m_Capacity)</div>
-<div class="line"><a name="l04895"></a><span class="lineno"> 4895</span>&#160;        {</div>
-<div class="line"><a name="l04896"></a><span class="lineno"> 4896</span>&#160;            T* <span class="keyword">const</span> newArray = newCapacity ? VmaAllocateArray&lt;T&gt;(m_Allocator.m_pCallbacks, newCapacity) : VMA_NULL;</div>
-<div class="line"><a name="l04897"></a><span class="lineno"> 4897</span>&#160;            <span class="keyword">const</span> <span class="keywordtype">size_t</span> elementsToCopy = VMA_MIN(m_Count, newCount);</div>
-<div class="line"><a name="l04898"></a><span class="lineno"> 4898</span>&#160;            <span class="keywordflow">if</span>(elementsToCopy != 0)</div>
-<div class="line"><a name="l04899"></a><span class="lineno"> 4899</span>&#160;            {</div>
-<div class="line"><a name="l04900"></a><span class="lineno"> 4900</span>&#160;                memcpy(newArray, m_pArray, elementsToCopy * <span class="keyword">sizeof</span>(T));</div>
-<div class="line"><a name="l04901"></a><span class="lineno"> 4901</span>&#160;            }</div>
-<div class="line"><a name="l04902"></a><span class="lineno"> 4902</span>&#160;            VmaFree(m_Allocator.m_pCallbacks, m_pArray);</div>
-<div class="line"><a name="l04903"></a><span class="lineno"> 4903</span>&#160;            m_Capacity = newCapacity;</div>
-<div class="line"><a name="l04904"></a><span class="lineno"> 4904</span>&#160;            m_pArray = newArray;</div>
-<div class="line"><a name="l04905"></a><span class="lineno"> 4905</span>&#160;        }</div>
-<div class="line"><a name="l04906"></a><span class="lineno"> 4906</span>&#160; </div>
-<div class="line"><a name="l04907"></a><span class="lineno"> 4907</span>&#160;        m_Count = newCount;</div>
-<div class="line"><a name="l04908"></a><span class="lineno"> 4908</span>&#160;    }</div>
-<div class="line"><a name="l04909"></a><span class="lineno"> 4909</span>&#160; </div>
-<div class="line"><a name="l04910"></a><span class="lineno"> 4910</span>&#160;    <span class="keywordtype">void</span> clear(<span class="keywordtype">bool</span> freeMemory = <span class="keyword">false</span>)</div>
-<div class="line"><a name="l04911"></a><span class="lineno"> 4911</span>&#160;    {</div>
-<div class="line"><a name="l04912"></a><span class="lineno"> 4912</span>&#160;        resize(0, freeMemory);</div>
+<div class="line"><a name="l04894"></a><span class="lineno"> 4894</span>&#160;<span class="preprocessor">#define vma_new_array(allocator, type, count)   new(VmaAllocateArray&lt;type&gt;((allocator), (count)))(type)</span></div>
+<div class="line"><a name="l04895"></a><span class="lineno"> 4895</span>&#160; </div>
+<div class="line"><a name="l04896"></a><span class="lineno"> 4896</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt;</div>
+<div class="line"><a name="l04897"></a><span class="lineno"> 4897</span>&#160;<span class="keyword">static</span> <span class="keywordtype">void</span> vma_delete(<span class="keyword">const</span> VkAllocationCallbacks* pAllocationCallbacks, T* ptr)</div>
+<div class="line"><a name="l04898"></a><span class="lineno"> 4898</span>&#160;{</div>
+<div class="line"><a name="l04899"></a><span class="lineno"> 4899</span>&#160;    ptr-&gt;~T();</div>
+<div class="line"><a name="l04900"></a><span class="lineno"> 4900</span>&#160;    VmaFree(pAllocationCallbacks, ptr);</div>
+<div class="line"><a name="l04901"></a><span class="lineno"> 4901</span>&#160;}</div>
+<div class="line"><a name="l04902"></a><span class="lineno"> 4902</span>&#160; </div>
+<div class="line"><a name="l04903"></a><span class="lineno"> 4903</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt;</div>
+<div class="line"><a name="l04904"></a><span class="lineno"> 4904</span>&#160;<span class="keyword">static</span> <span class="keywordtype">void</span> vma_delete_array(<span class="keyword">const</span> VkAllocationCallbacks* pAllocationCallbacks, T* ptr, <span class="keywordtype">size_t</span> count)</div>
+<div class="line"><a name="l04905"></a><span class="lineno"> 4905</span>&#160;{</div>
+<div class="line"><a name="l04906"></a><span class="lineno"> 4906</span>&#160;    <span class="keywordflow">if</span>(ptr != VMA_NULL)</div>
+<div class="line"><a name="l04907"></a><span class="lineno"> 4907</span>&#160;    {</div>
+<div class="line"><a name="l04908"></a><span class="lineno"> 4908</span>&#160;        <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> i = count; i--; )</div>
+<div class="line"><a name="l04909"></a><span class="lineno"> 4909</span>&#160;        {</div>
+<div class="line"><a name="l04910"></a><span class="lineno"> 4910</span>&#160;            ptr[i].~T();</div>
+<div class="line"><a name="l04911"></a><span class="lineno"> 4911</span>&#160;        }</div>
+<div class="line"><a name="l04912"></a><span class="lineno"> 4912</span>&#160;        VmaFree(pAllocationCallbacks, ptr);</div>
 <div class="line"><a name="l04913"></a><span class="lineno"> 4913</span>&#160;    }</div>
-<div class="line"><a name="l04914"></a><span class="lineno"> 4914</span>&#160; </div>
-<div class="line"><a name="l04915"></a><span class="lineno"> 4915</span>&#160;    <span class="keywordtype">void</span> insert(<span class="keywordtype">size_t</span> index, <span class="keyword">const</span> T&amp; src)</div>
-<div class="line"><a name="l04916"></a><span class="lineno"> 4916</span>&#160;    {</div>
-<div class="line"><a name="l04917"></a><span class="lineno"> 4917</span>&#160;        VMA_HEAVY_ASSERT(index &lt;= m_Count);</div>
-<div class="line"><a name="l04918"></a><span class="lineno"> 4918</span>&#160;        <span class="keyword">const</span> <span class="keywordtype">size_t</span> oldCount = size();</div>
-<div class="line"><a name="l04919"></a><span class="lineno"> 4919</span>&#160;        resize(oldCount + 1);</div>
-<div class="line"><a name="l04920"></a><span class="lineno"> 4920</span>&#160;        <span class="keywordflow">if</span>(index &lt; oldCount)</div>
-<div class="line"><a name="l04921"></a><span class="lineno"> 4921</span>&#160;        {</div>
-<div class="line"><a name="l04922"></a><span class="lineno"> 4922</span>&#160;            memmove(m_pArray + (index + 1), m_pArray + index, (oldCount - index) * <span class="keyword">sizeof</span>(T));</div>
-<div class="line"><a name="l04923"></a><span class="lineno"> 4923</span>&#160;        }</div>
-<div class="line"><a name="l04924"></a><span class="lineno"> 4924</span>&#160;        m_pArray[index] = src;</div>
-<div class="line"><a name="l04925"></a><span class="lineno"> 4925</span>&#160;    }</div>
-<div class="line"><a name="l04926"></a><span class="lineno"> 4926</span>&#160; </div>
-<div class="line"><a name="l04927"></a><span class="lineno"> 4927</span>&#160;    <span class="keywordtype">void</span> remove(<span class="keywordtype">size_t</span> index)</div>
-<div class="line"><a name="l04928"></a><span class="lineno"> 4928</span>&#160;    {</div>
-<div class="line"><a name="l04929"></a><span class="lineno"> 4929</span>&#160;        VMA_HEAVY_ASSERT(index &lt; m_Count);</div>
-<div class="line"><a name="l04930"></a><span class="lineno"> 4930</span>&#160;        <span class="keyword">const</span> <span class="keywordtype">size_t</span> oldCount = size();</div>
-<div class="line"><a name="l04931"></a><span class="lineno"> 4931</span>&#160;        <span class="keywordflow">if</span>(index &lt; oldCount - 1)</div>
-<div class="line"><a name="l04932"></a><span class="lineno"> 4932</span>&#160;        {</div>
-<div class="line"><a name="l04933"></a><span class="lineno"> 4933</span>&#160;            memmove(m_pArray + index, m_pArray + (index + 1), (oldCount - index - 1) * <span class="keyword">sizeof</span>(T));</div>
-<div class="line"><a name="l04934"></a><span class="lineno"> 4934</span>&#160;        }</div>
-<div class="line"><a name="l04935"></a><span class="lineno"> 4935</span>&#160;        resize(oldCount - 1);</div>
-<div class="line"><a name="l04936"></a><span class="lineno"> 4936</span>&#160;    }</div>
-<div class="line"><a name="l04937"></a><span class="lineno"> 4937</span>&#160; </div>
-<div class="line"><a name="l04938"></a><span class="lineno"> 4938</span>&#160;    <span class="keywordtype">void</span> push_back(<span class="keyword">const</span> T&amp; src)</div>
-<div class="line"><a name="l04939"></a><span class="lineno"> 4939</span>&#160;    {</div>
-<div class="line"><a name="l04940"></a><span class="lineno"> 4940</span>&#160;        <span class="keyword">const</span> <span class="keywordtype">size_t</span> newIndex = size();</div>
-<div class="line"><a name="l04941"></a><span class="lineno"> 4941</span>&#160;        resize(newIndex + 1);</div>
-<div class="line"><a name="l04942"></a><span class="lineno"> 4942</span>&#160;        m_pArray[newIndex] = src;</div>
-<div class="line"><a name="l04943"></a><span class="lineno"> 4943</span>&#160;    }</div>
-<div class="line"><a name="l04944"></a><span class="lineno"> 4944</span>&#160; </div>
-<div class="line"><a name="l04945"></a><span class="lineno"> 4945</span>&#160;    <span class="keywordtype">void</span> pop_back()</div>
-<div class="line"><a name="l04946"></a><span class="lineno"> 4946</span>&#160;    {</div>
-<div class="line"><a name="l04947"></a><span class="lineno"> 4947</span>&#160;        VMA_HEAVY_ASSERT(m_Count &gt; 0);</div>
-<div class="line"><a name="l04948"></a><span class="lineno"> 4948</span>&#160;        resize(size() - 1);</div>
-<div class="line"><a name="l04949"></a><span class="lineno"> 4949</span>&#160;    }</div>
+<div class="line"><a name="l04914"></a><span class="lineno"> 4914</span>&#160;}</div>
+<div class="line"><a name="l04915"></a><span class="lineno"> 4915</span>&#160; </div>
+<div class="line"><a name="l04916"></a><span class="lineno"> 4916</span>&#160;<span class="keyword">static</span> <span class="keywordtype">char</span>* VmaCreateStringCopy(<span class="keyword">const</span> VkAllocationCallbacks* allocs, <span class="keyword">const</span> <span class="keywordtype">char</span>* srcStr)</div>
+<div class="line"><a name="l04917"></a><span class="lineno"> 4917</span>&#160;{</div>
+<div class="line"><a name="l04918"></a><span class="lineno"> 4918</span>&#160;    <span class="keywordflow">if</span>(srcStr != VMA_NULL)</div>
+<div class="line"><a name="l04919"></a><span class="lineno"> 4919</span>&#160;    {</div>
+<div class="line"><a name="l04920"></a><span class="lineno"> 4920</span>&#160;        <span class="keyword">const</span> <span class="keywordtype">size_t</span> len = strlen(srcStr);</div>
+<div class="line"><a name="l04921"></a><span class="lineno"> 4921</span>&#160;        <span class="keywordtype">char</span>* <span class="keyword">const</span> result = vma_new_array(allocs, <span class="keywordtype">char</span>, len + 1);</div>
+<div class="line"><a name="l04922"></a><span class="lineno"> 4922</span>&#160;        memcpy(result, srcStr, len + 1);</div>
+<div class="line"><a name="l04923"></a><span class="lineno"> 4923</span>&#160;        <span class="keywordflow">return</span> result;</div>
+<div class="line"><a name="l04924"></a><span class="lineno"> 4924</span>&#160;    }</div>
+<div class="line"><a name="l04925"></a><span class="lineno"> 4925</span>&#160;    <span class="keywordflow">else</span></div>
+<div class="line"><a name="l04926"></a><span class="lineno"> 4926</span>&#160;    {</div>
+<div class="line"><a name="l04927"></a><span class="lineno"> 4927</span>&#160;        <span class="keywordflow">return</span> VMA_NULL;</div>
+<div class="line"><a name="l04928"></a><span class="lineno"> 4928</span>&#160;    }</div>
+<div class="line"><a name="l04929"></a><span class="lineno"> 4929</span>&#160;}</div>
+<div class="line"><a name="l04930"></a><span class="lineno"> 4930</span>&#160; </div>
+<div class="line"><a name="l04931"></a><span class="lineno"> 4931</span>&#160;<span class="keyword">static</span> <span class="keywordtype">void</span> VmaFreeString(<span class="keyword">const</span> VkAllocationCallbacks* allocs, <span class="keywordtype">char</span>* str)</div>
+<div class="line"><a name="l04932"></a><span class="lineno"> 4932</span>&#160;{</div>
+<div class="line"><a name="l04933"></a><span class="lineno"> 4933</span>&#160;    <span class="keywordflow">if</span>(str != VMA_NULL)</div>
+<div class="line"><a name="l04934"></a><span class="lineno"> 4934</span>&#160;    {</div>
+<div class="line"><a name="l04935"></a><span class="lineno"> 4935</span>&#160;        <span class="keyword">const</span> <span class="keywordtype">size_t</span> len = strlen(str);</div>
+<div class="line"><a name="l04936"></a><span class="lineno"> 4936</span>&#160;        vma_delete_array(allocs, str, len + 1);</div>
+<div class="line"><a name="l04937"></a><span class="lineno"> 4937</span>&#160;    }</div>
+<div class="line"><a name="l04938"></a><span class="lineno"> 4938</span>&#160;}</div>
+<div class="line"><a name="l04939"></a><span class="lineno"> 4939</span>&#160; </div>
+<div class="line"><a name="l04940"></a><span class="lineno"> 4940</span>&#160;<span class="comment">// STL-compatible allocator.</span></div>
+<div class="line"><a name="l04941"></a><span class="lineno"> 4941</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt;</div>
+<div class="line"><a name="l04942"></a><span class="lineno"> 4942</span>&#160;<span class="keyword">class </span>VmaStlAllocator</div>
+<div class="line"><a name="l04943"></a><span class="lineno"> 4943</span>&#160;{</div>
+<div class="line"><a name="l04944"></a><span class="lineno"> 4944</span>&#160;<span class="keyword">public</span>:</div>
+<div class="line"><a name="l04945"></a><span class="lineno"> 4945</span>&#160;    <span class="keyword">const</span> VkAllocationCallbacks* <span class="keyword">const</span> m_pCallbacks;</div>
+<div class="line"><a name="l04946"></a><span class="lineno"> 4946</span>&#160;    <span class="keyword">typedef</span> T value_type;</div>
+<div class="line"><a name="l04947"></a><span class="lineno"> 4947</span>&#160; </div>
+<div class="line"><a name="l04948"></a><span class="lineno"> 4948</span>&#160;    VmaStlAllocator(<span class="keyword">const</span> VkAllocationCallbacks* pCallbacks) : m_pCallbacks(pCallbacks) { }</div>
+<div class="line"><a name="l04949"></a><span class="lineno"> 4949</span>&#160;    <span class="keyword">template</span>&lt;<span class="keyword">typename</span> U&gt; VmaStlAllocator(<span class="keyword">const</span> VmaStlAllocator&lt;U&gt;&amp; src) : m_pCallbacks(src.m_pCallbacks) { }</div>
 <div class="line"><a name="l04950"></a><span class="lineno"> 4950</span>&#160; </div>
-<div class="line"><a name="l04951"></a><span class="lineno"> 4951</span>&#160;    <span class="keywordtype">void</span> push_front(<span class="keyword">const</span> T&amp; src)</div>
-<div class="line"><a name="l04952"></a><span class="lineno"> 4952</span>&#160;    {</div>
-<div class="line"><a name="l04953"></a><span class="lineno"> 4953</span>&#160;        insert(0, src);</div>
-<div class="line"><a name="l04954"></a><span class="lineno"> 4954</span>&#160;    }</div>
-<div class="line"><a name="l04955"></a><span class="lineno"> 4955</span>&#160; </div>
-<div class="line"><a name="l04956"></a><span class="lineno"> 4956</span>&#160;    <span class="keywordtype">void</span> pop_front()</div>
-<div class="line"><a name="l04957"></a><span class="lineno"> 4957</span>&#160;    {</div>
-<div class="line"><a name="l04958"></a><span class="lineno"> 4958</span>&#160;        VMA_HEAVY_ASSERT(m_Count &gt; 0);</div>
-<div class="line"><a name="l04959"></a><span class="lineno"> 4959</span>&#160;        remove(0);</div>
-<div class="line"><a name="l04960"></a><span class="lineno"> 4960</span>&#160;    }</div>
-<div class="line"><a name="l04961"></a><span class="lineno"> 4961</span>&#160; </div>
-<div class="line"><a name="l04962"></a><span class="lineno"> 4962</span>&#160;    <span class="keyword">typedef</span> T* iterator;</div>
-<div class="line"><a name="l04963"></a><span class="lineno"> 4963</span>&#160; </div>
-<div class="line"><a name="l04964"></a><span class="lineno"> 4964</span>&#160;    iterator begin() { <span class="keywordflow">return</span> m_pArray; }</div>
-<div class="line"><a name="l04965"></a><span class="lineno"> 4965</span>&#160;    iterator end() { <span class="keywordflow">return</span> m_pArray + m_Count; }</div>
-<div class="line"><a name="l04966"></a><span class="lineno"> 4966</span>&#160; </div>
-<div class="line"><a name="l04967"></a><span class="lineno"> 4967</span>&#160;<span class="keyword">private</span>:</div>
-<div class="line"><a name="l04968"></a><span class="lineno"> 4968</span>&#160;    AllocatorT m_Allocator;</div>
-<div class="line"><a name="l04969"></a><span class="lineno"> 4969</span>&#160;    T* m_pArray;</div>
-<div class="line"><a name="l04970"></a><span class="lineno"> 4970</span>&#160;    <span class="keywordtype">size_t</span> m_Count;</div>
-<div class="line"><a name="l04971"></a><span class="lineno"> 4971</span>&#160;    <span class="keywordtype">size_t</span> m_Capacity;</div>
-<div class="line"><a name="l04972"></a><span class="lineno"> 4972</span>&#160;};</div>
-<div class="line"><a name="l04973"></a><span class="lineno"> 4973</span>&#160; </div>
-<div class="line"><a name="l04974"></a><span class="lineno"> 4974</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> T, <span class="keyword">typename</span> allocatorT&gt;</div>
-<div class="line"><a name="l04975"></a><span class="lineno"> 4975</span>&#160;<span class="keyword">static</span> <span class="keywordtype">void</span> VmaVectorInsert(VmaVector&lt;T, allocatorT&gt;&amp; vec, <span class="keywordtype">size_t</span> index, <span class="keyword">const</span> T&amp; item)</div>
-<div class="line"><a name="l04976"></a><span class="lineno"> 4976</span>&#160;{</div>
-<div class="line"><a name="l04977"></a><span class="lineno"> 4977</span>&#160;    vec.insert(index, item);</div>
-<div class="line"><a name="l04978"></a><span class="lineno"> 4978</span>&#160;}</div>
-<div class="line"><a name="l04979"></a><span class="lineno"> 4979</span>&#160; </div>
-<div class="line"><a name="l04980"></a><span class="lineno"> 4980</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> T, <span class="keyword">typename</span> allocatorT&gt;</div>
-<div class="line"><a name="l04981"></a><span class="lineno"> 4981</span>&#160;<span class="keyword">static</span> <span class="keywordtype">void</span> VmaVectorRemove(VmaVector&lt;T, allocatorT&gt;&amp; vec, <span class="keywordtype">size_t</span> index)</div>
-<div class="line"><a name="l04982"></a><span class="lineno"> 4982</span>&#160;{</div>
-<div class="line"><a name="l04983"></a><span class="lineno"> 4983</span>&#160;    vec.remove(index);</div>
-<div class="line"><a name="l04984"></a><span class="lineno"> 4984</span>&#160;}</div>
-<div class="line"><a name="l04985"></a><span class="lineno"> 4985</span>&#160; </div>
-<div class="line"><a name="l04986"></a><span class="lineno"> 4986</span>&#160;<span class="preprocessor">#endif // #if VMA_USE_STL_VECTOR</span></div>
-<div class="line"><a name="l04987"></a><span class="lineno"> 4987</span>&#160; </div>
-<div class="line"><a name="l04988"></a><span class="lineno"> 4988</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> CmpLess, <span class="keyword">typename</span> VectorT&gt;</div>
-<div class="line"><a name="l04989"></a><span class="lineno"> 4989</span>&#160;<span class="keywordtype">size_t</span> VmaVectorInsertSorted(VectorT&amp; vector, <span class="keyword">const</span> <span class="keyword">typename</span> VectorT::value_type&amp; value)</div>
-<div class="line"><a name="l04990"></a><span class="lineno"> 4990</span>&#160;{</div>
-<div class="line"><a name="l04991"></a><span class="lineno"> 4991</span>&#160;    <span class="keyword">const</span> <span class="keywordtype">size_t</span> indexToInsert = VmaBinaryFindFirstNotLess(</div>
-<div class="line"><a name="l04992"></a><span class="lineno"> 4992</span>&#160;        vector.data(),</div>
-<div class="line"><a name="l04993"></a><span class="lineno"> 4993</span>&#160;        vector.data() + vector.size(),</div>
-<div class="line"><a name="l04994"></a><span class="lineno"> 4994</span>&#160;        value,</div>
-<div class="line"><a name="l04995"></a><span class="lineno"> 4995</span>&#160;        CmpLess()) - vector.data();</div>
-<div class="line"><a name="l04996"></a><span class="lineno"> 4996</span>&#160;    VmaVectorInsert(vector, indexToInsert, value);</div>
-<div class="line"><a name="l04997"></a><span class="lineno"> 4997</span>&#160;    <span class="keywordflow">return</span> indexToInsert;</div>
-<div class="line"><a name="l04998"></a><span class="lineno"> 4998</span>&#160;}</div>
-<div class="line"><a name="l04999"></a><span class="lineno"> 4999</span>&#160; </div>
-<div class="line"><a name="l05000"></a><span class="lineno"> 5000</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> CmpLess, <span class="keyword">typename</span> VectorT&gt;</div>
-<div class="line"><a name="l05001"></a><span class="lineno"> 5001</span>&#160;<span class="keywordtype">bool</span> VmaVectorRemoveSorted(VectorT&amp; vector, <span class="keyword">const</span> <span class="keyword">typename</span> VectorT::value_type&amp; value)</div>
-<div class="line"><a name="l05002"></a><span class="lineno"> 5002</span>&#160;{</div>
-<div class="line"><a name="l05003"></a><span class="lineno"> 5003</span>&#160;    CmpLess comparator;</div>
-<div class="line"><a name="l05004"></a><span class="lineno"> 5004</span>&#160;    <span class="keyword">typename</span> VectorT::iterator it = VmaBinaryFindFirstNotLess(</div>
-<div class="line"><a name="l05005"></a><span class="lineno"> 5005</span>&#160;        vector.begin(),</div>
-<div class="line"><a name="l05006"></a><span class="lineno"> 5006</span>&#160;        vector.end(),</div>
-<div class="line"><a name="l05007"></a><span class="lineno"> 5007</span>&#160;        value,</div>
-<div class="line"><a name="l05008"></a><span class="lineno"> 5008</span>&#160;        comparator);</div>
-<div class="line"><a name="l05009"></a><span class="lineno"> 5009</span>&#160;    <span class="keywordflow">if</span>((it != vector.end()) &amp;&amp; !comparator(*it, value) &amp;&amp; !comparator(value, *it))</div>
-<div class="line"><a name="l05010"></a><span class="lineno"> 5010</span>&#160;    {</div>
-<div class="line"><a name="l05011"></a><span class="lineno"> 5011</span>&#160;        <span class="keywordtype">size_t</span> indexToRemove = it - vector.begin();</div>
-<div class="line"><a name="l05012"></a><span class="lineno"> 5012</span>&#160;        VmaVectorRemove(vector, indexToRemove);</div>
-<div class="line"><a name="l05013"></a><span class="lineno"> 5013</span>&#160;        <span class="keywordflow">return</span> <span class="keyword">true</span>;</div>
-<div class="line"><a name="l05014"></a><span class="lineno"> 5014</span>&#160;    }</div>
-<div class="line"><a name="l05015"></a><span class="lineno"> 5015</span>&#160;    <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
-<div class="line"><a name="l05016"></a><span class="lineno"> 5016</span>&#160;}</div>
-<div class="line"><a name="l05017"></a><span class="lineno"> 5017</span>&#160; </div>
-<div class="line"><a name="l05019"></a><span class="lineno"> 5019</span>&#160;<span class="comment">// class VmaSmallVector</span></div>
-<div class="line"><a name="l05020"></a><span class="lineno"> 5020</span>&#160; </div>
-<div class="line"><a name="l05021"></a><span class="lineno"> 5021</span>&#160;<span class="comment">/*</span></div>
-<div class="line"><a name="l05022"></a><span class="lineno"> 5022</span>&#160;<span class="comment">This is a vector (a variable-sized array), optimized for the case when the array is small.</span></div>
-<div class="line"><a name="l05023"></a><span class="lineno"> 5023</span>&#160;<span class="comment"></span> </div>
-<div class="line"><a name="l05024"></a><span class="lineno"> 5024</span>&#160;<span class="comment">It contains some number of elements in-place, which allows it to avoid heap allocation</span></div>
-<div class="line"><a name="l05025"></a><span class="lineno"> 5025</span>&#160;<span class="comment">when the actual number of elements is below that threshold. This allows normal &quot;small&quot;</span></div>
-<div class="line"><a name="l05026"></a><span class="lineno"> 5026</span>&#160;<span class="comment">cases to be fast without losing generality for large inputs.</span></div>
-<div class="line"><a name="l05027"></a><span class="lineno"> 5027</span>&#160;<span class="comment">*/</span></div>
+<div class="line"><a name="l04951"></a><span class="lineno"> 4951</span>&#160;    T* allocate(<span class="keywordtype">size_t</span> n) { <span class="keywordflow">return</span> VmaAllocateArray&lt;T&gt;(m_pCallbacks, n); }</div>
+<div class="line"><a name="l04952"></a><span class="lineno"> 4952</span>&#160;    <span class="keywordtype">void</span> deallocate(T* p, <span class="keywordtype">size_t</span> n) { VmaFree(m_pCallbacks, p); }</div>
+<div class="line"><a name="l04953"></a><span class="lineno"> 4953</span>&#160; </div>
+<div class="line"><a name="l04954"></a><span class="lineno"> 4954</span>&#160;    <span class="keyword">template</span>&lt;<span class="keyword">typename</span> U&gt;</div>
+<div class="line"><a name="l04955"></a><span class="lineno"> 4955</span>&#160;    <span class="keywordtype">bool</span> operator==(<span class="keyword">const</span> VmaStlAllocator&lt;U&gt;&amp; rhs)<span class="keyword"> const</span></div>
+<div class="line"><a name="l04956"></a><span class="lineno"> 4956</span>&#160;<span class="keyword">    </span>{</div>
+<div class="line"><a name="l04957"></a><span class="lineno"> 4957</span>&#160;        <span class="keywordflow">return</span> m_pCallbacks == rhs.m_pCallbacks;</div>
+<div class="line"><a name="l04958"></a><span class="lineno"> 4958</span>&#160;    }</div>
+<div class="line"><a name="l04959"></a><span class="lineno"> 4959</span>&#160;    <span class="keyword">template</span>&lt;<span class="keyword">typename</span> U&gt;</div>
+<div class="line"><a name="l04960"></a><span class="lineno"> 4960</span>&#160;    <span class="keywordtype">bool</span> operator!=(<span class="keyword">const</span> VmaStlAllocator&lt;U&gt;&amp; rhs)<span class="keyword"> const</span></div>
+<div class="line"><a name="l04961"></a><span class="lineno"> 4961</span>&#160;<span class="keyword">    </span>{</div>
+<div class="line"><a name="l04962"></a><span class="lineno"> 4962</span>&#160;        <span class="keywordflow">return</span> m_pCallbacks != rhs.m_pCallbacks;</div>
+<div class="line"><a name="l04963"></a><span class="lineno"> 4963</span>&#160;    }</div>
+<div class="line"><a name="l04964"></a><span class="lineno"> 4964</span>&#160; </div>
+<div class="line"><a name="l04965"></a><span class="lineno"> 4965</span>&#160;    VmaStlAllocator&amp; operator=(<span class="keyword">const</span> VmaStlAllocator&amp; x) = <span class="keyword">delete</span>;</div>
+<div class="line"><a name="l04966"></a><span class="lineno"> 4966</span>&#160;    VmaStlAllocator(<span class="keyword">const</span> VmaStlAllocator&amp;) = <span class="keywordflow">default</span>;</div>
+<div class="line"><a name="l04967"></a><span class="lineno"> 4967</span>&#160;};</div>
+<div class="line"><a name="l04968"></a><span class="lineno"> 4968</span>&#160; </div>
+<div class="line"><a name="l04969"></a><span class="lineno"> 4969</span>&#160;<span class="preprocessor">#if VMA_USE_STL_VECTOR</span></div>
+<div class="line"><a name="l04970"></a><span class="lineno"> 4970</span>&#160; </div>
+<div class="line"><a name="l04971"></a><span class="lineno"> 4971</span>&#160;<span class="preprocessor">#define VmaVector std::vector</span></div>
+<div class="line"><a name="l04972"></a><span class="lineno"> 4972</span>&#160; </div>
+<div class="line"><a name="l04973"></a><span class="lineno"> 4973</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> T, <span class="keyword">typename</span> allocatorT&gt;</div>
+<div class="line"><a name="l04974"></a><span class="lineno"> 4974</span>&#160;<span class="keyword">static</span> <span class="keywordtype">void</span> VmaVectorInsert(std::vector&lt;T, allocatorT&gt;&amp; vec, <span class="keywordtype">size_t</span> index, <span class="keyword">const</span> T&amp; item)</div>
+<div class="line"><a name="l04975"></a><span class="lineno"> 4975</span>&#160;{</div>
+<div class="line"><a name="l04976"></a><span class="lineno"> 4976</span>&#160;    vec.insert(vec.begin() + index, item);</div>
+<div class="line"><a name="l04977"></a><span class="lineno"> 4977</span>&#160;}</div>
+<div class="line"><a name="l04978"></a><span class="lineno"> 4978</span>&#160; </div>
+<div class="line"><a name="l04979"></a><span class="lineno"> 4979</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> T, <span class="keyword">typename</span> allocatorT&gt;</div>
+<div class="line"><a name="l04980"></a><span class="lineno"> 4980</span>&#160;<span class="keyword">static</span> <span class="keywordtype">void</span> VmaVectorRemove(std::vector&lt;T, allocatorT&gt;&amp; vec, <span class="keywordtype">size_t</span> index)</div>
+<div class="line"><a name="l04981"></a><span class="lineno"> 4981</span>&#160;{</div>
+<div class="line"><a name="l04982"></a><span class="lineno"> 4982</span>&#160;    vec.erase(vec.begin() + index);</div>
+<div class="line"><a name="l04983"></a><span class="lineno"> 4983</span>&#160;}</div>
+<div class="line"><a name="l04984"></a><span class="lineno"> 4984</span>&#160; </div>
+<div class="line"><a name="l04985"></a><span class="lineno"> 4985</span>&#160;<span class="preprocessor">#else </span><span class="comment">// #if VMA_USE_STL_VECTOR</span></div>
+<div class="line"><a name="l04986"></a><span class="lineno"> 4986</span>&#160; </div>
+<div class="line"><a name="l04987"></a><span class="lineno"> 4987</span>&#160;<span class="comment">/* Class with interface compatible with subset of std::vector.</span></div>
+<div class="line"><a name="l04988"></a><span class="lineno"> 4988</span>&#160;<span class="comment">T must be POD because constructors and destructors are not called and memcpy is</span></div>
+<div class="line"><a name="l04989"></a><span class="lineno"> 4989</span>&#160;<span class="comment">used for these objects. */</span></div>
+<div class="line"><a name="l04990"></a><span class="lineno"> 4990</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> T, <span class="keyword">typename</span> AllocatorT&gt;</div>
+<div class="line"><a name="l04991"></a><span class="lineno"> 4991</span>&#160;<span class="keyword">class </span>VmaVector</div>
+<div class="line"><a name="l04992"></a><span class="lineno"> 4992</span>&#160;{</div>
+<div class="line"><a name="l04993"></a><span class="lineno"> 4993</span>&#160;<span class="keyword">public</span>:</div>
+<div class="line"><a name="l04994"></a><span class="lineno"> 4994</span>&#160;    <span class="keyword">typedef</span> T value_type;</div>
+<div class="line"><a name="l04995"></a><span class="lineno"> 4995</span>&#160; </div>
+<div class="line"><a name="l04996"></a><span class="lineno"> 4996</span>&#160;    VmaVector(<span class="keyword">const</span> AllocatorT&amp; allocator) :</div>
+<div class="line"><a name="l04997"></a><span class="lineno"> 4997</span>&#160;        m_Allocator(allocator),</div>
+<div class="line"><a name="l04998"></a><span class="lineno"> 4998</span>&#160;        m_pArray(VMA_NULL),</div>
+<div class="line"><a name="l04999"></a><span class="lineno"> 4999</span>&#160;        m_Count(0),</div>
+<div class="line"><a name="l05000"></a><span class="lineno"> 5000</span>&#160;        m_Capacity(0)</div>
+<div class="line"><a name="l05001"></a><span class="lineno"> 5001</span>&#160;    {</div>
+<div class="line"><a name="l05002"></a><span class="lineno"> 5002</span>&#160;    }</div>
+<div class="line"><a name="l05003"></a><span class="lineno"> 5003</span>&#160; </div>
+<div class="line"><a name="l05004"></a><span class="lineno"> 5004</span>&#160;    VmaVector(<span class="keywordtype">size_t</span> count, <span class="keyword">const</span> AllocatorT&amp; allocator) :</div>
+<div class="line"><a name="l05005"></a><span class="lineno"> 5005</span>&#160;        m_Allocator(allocator),</div>
+<div class="line"><a name="l05006"></a><span class="lineno"> 5006</span>&#160;        m_pArray(count ? (T*)VmaAllocateArray&lt;T&gt;(allocator.m_pCallbacks, count) : VMA_NULL),</div>
+<div class="line"><a name="l05007"></a><span class="lineno"> 5007</span>&#160;        m_Count(count),</div>
+<div class="line"><a name="l05008"></a><span class="lineno"> 5008</span>&#160;        m_Capacity(count)</div>
+<div class="line"><a name="l05009"></a><span class="lineno"> 5009</span>&#160;    {</div>
+<div class="line"><a name="l05010"></a><span class="lineno"> 5010</span>&#160;    }</div>
+<div class="line"><a name="l05011"></a><span class="lineno"> 5011</span>&#160; </div>
+<div class="line"><a name="l05012"></a><span class="lineno"> 5012</span>&#160;    <span class="comment">// This version of the constructor is here for compatibility with pre-C++14 std::vector.</span></div>
+<div class="line"><a name="l05013"></a><span class="lineno"> 5013</span>&#160;    <span class="comment">// value is unused.</span></div>
+<div class="line"><a name="l05014"></a><span class="lineno"> 5014</span>&#160;    VmaVector(<span class="keywordtype">size_t</span> count, <span class="keyword">const</span> T&amp; value, <span class="keyword">const</span> AllocatorT&amp; allocator)</div>
+<div class="line"><a name="l05015"></a><span class="lineno"> 5015</span>&#160;        : VmaVector(count, allocator) {}</div>
+<div class="line"><a name="l05016"></a><span class="lineno"> 5016</span>&#160; </div>
+<div class="line"><a name="l05017"></a><span class="lineno"> 5017</span>&#160;    VmaVector(<span class="keyword">const</span> VmaVector&lt;T, AllocatorT&gt;&amp; src) :</div>
+<div class="line"><a name="l05018"></a><span class="lineno"> 5018</span>&#160;        m_Allocator(src.m_Allocator),</div>
+<div class="line"><a name="l05019"></a><span class="lineno"> 5019</span>&#160;        m_pArray(src.m_Count ? (T*)VmaAllocateArray&lt;T&gt;(src.m_Allocator.m_pCallbacks, src.m_Count) : VMA_NULL),</div>
+<div class="line"><a name="l05020"></a><span class="lineno"> 5020</span>&#160;        m_Count(src.m_Count),</div>
+<div class="line"><a name="l05021"></a><span class="lineno"> 5021</span>&#160;        m_Capacity(src.m_Count)</div>
+<div class="line"><a name="l05022"></a><span class="lineno"> 5022</span>&#160;    {</div>
+<div class="line"><a name="l05023"></a><span class="lineno"> 5023</span>&#160;        <span class="keywordflow">if</span>(m_Count != 0)</div>
+<div class="line"><a name="l05024"></a><span class="lineno"> 5024</span>&#160;        {</div>
+<div class="line"><a name="l05025"></a><span class="lineno"> 5025</span>&#160;            memcpy(m_pArray, src.m_pArray, m_Count * <span class="keyword">sizeof</span>(T));</div>
+<div class="line"><a name="l05026"></a><span class="lineno"> 5026</span>&#160;        }</div>
+<div class="line"><a name="l05027"></a><span class="lineno"> 5027</span>&#160;    }</div>
 <div class="line"><a name="l05028"></a><span class="lineno"> 5028</span>&#160; </div>
-<div class="line"><a name="l05029"></a><span class="lineno"> 5029</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> T, <span class="keyword">typename</span> AllocatorT, <span class="keywordtype">size_t</span> N&gt;</div>
-<div class="line"><a name="l05030"></a><span class="lineno"> 5030</span>&#160;<span class="keyword">class </span>VmaSmallVector</div>
-<div class="line"><a name="l05031"></a><span class="lineno"> 5031</span>&#160;{</div>
-<div class="line"><a name="l05032"></a><span class="lineno"> 5032</span>&#160;<span class="keyword">public</span>:</div>
-<div class="line"><a name="l05033"></a><span class="lineno"> 5033</span>&#160;    <span class="keyword">typedef</span> T value_type;</div>
-<div class="line"><a name="l05034"></a><span class="lineno"> 5034</span>&#160; </div>
-<div class="line"><a name="l05035"></a><span class="lineno"> 5035</span>&#160;    VmaSmallVector(<span class="keyword">const</span> AllocatorT&amp; allocator) :</div>
-<div class="line"><a name="l05036"></a><span class="lineno"> 5036</span>&#160;        m_Count(0),</div>
-<div class="line"><a name="l05037"></a><span class="lineno"> 5037</span>&#160;        m_DynamicArray(allocator)</div>
-<div class="line"><a name="l05038"></a><span class="lineno"> 5038</span>&#160;    {</div>
-<div class="line"><a name="l05039"></a><span class="lineno"> 5039</span>&#160;    }</div>
-<div class="line"><a name="l05040"></a><span class="lineno"> 5040</span>&#160;    VmaSmallVector(<span class="keywordtype">size_t</span> count, <span class="keyword">const</span> AllocatorT&amp; allocator) :</div>
-<div class="line"><a name="l05041"></a><span class="lineno"> 5041</span>&#160;        m_Count(count),</div>
-<div class="line"><a name="l05042"></a><span class="lineno"> 5042</span>&#160;        m_DynamicArray(count &gt; N ? count : 0, allocator)</div>
-<div class="line"><a name="l05043"></a><span class="lineno"> 5043</span>&#160;    {</div>
-<div class="line"><a name="l05044"></a><span class="lineno"> 5044</span>&#160;    }</div>
-<div class="line"><a name="l05045"></a><span class="lineno"> 5045</span>&#160;    <span class="keyword">template</span>&lt;<span class="keyword">typename</span> SrcT, <span class="keyword">typename</span> SrcAllocatorT, <span class="keywordtype">size_t</span> SrcN&gt;</div>
-<div class="line"><a name="l05046"></a><span class="lineno"> 5046</span>&#160;    VmaSmallVector(<span class="keyword">const</span> VmaSmallVector&lt;SrcT, SrcAllocatorT, SrcN&gt;&amp; src) = <span class="keyword">delete</span>;</div>
-<div class="line"><a name="l05047"></a><span class="lineno"> 5047</span>&#160;    <span class="keyword">template</span>&lt;<span class="keyword">typename</span> SrcT, <span class="keyword">typename</span> SrcAllocatorT, <span class="keywordtype">size_t</span> SrcN&gt;</div>
-<div class="line"><a name="l05048"></a><span class="lineno"> 5048</span>&#160;    VmaSmallVector&lt;T, AllocatorT, N&gt;&amp; operator=(<span class="keyword">const</span> VmaSmallVector&lt;SrcT, SrcAllocatorT, SrcN&gt;&amp; rhs) = <span class="keyword">delete</span>;</div>
-<div class="line"><a name="l05049"></a><span class="lineno"> 5049</span>&#160; </div>
-<div class="line"><a name="l05050"></a><span class="lineno"> 5050</span>&#160;    <span class="keywordtype">bool</span> empty()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_Count == 0; }</div>
-<div class="line"><a name="l05051"></a><span class="lineno"> 5051</span>&#160;    <span class="keywordtype">size_t</span> size()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_Count; }</div>
-<div class="line"><a name="l05052"></a><span class="lineno"> 5052</span>&#160;    T* data() { <span class="keywordflow">return</span> m_Count &gt; N ? m_DynamicArray.data() : m_StaticArray; }</div>
-<div class="line"><a name="l05053"></a><span class="lineno"> 5053</span>&#160;    <span class="keyword">const</span> T* data()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_Count &gt; N ? m_DynamicArray.data() : m_StaticArray; }</div>
-<div class="line"><a name="l05054"></a><span class="lineno"> 5054</span>&#160; </div>
-<div class="line"><a name="l05055"></a><span class="lineno"> 5055</span>&#160;    T&amp; operator[](<span class="keywordtype">size_t</span> index)</div>
-<div class="line"><a name="l05056"></a><span class="lineno"> 5056</span>&#160;    {</div>
-<div class="line"><a name="l05057"></a><span class="lineno"> 5057</span>&#160;        VMA_HEAVY_ASSERT(index &lt; m_Count);</div>
-<div class="line"><a name="l05058"></a><span class="lineno"> 5058</span>&#160;        <span class="keywordflow">return</span> data()[index];</div>
-<div class="line"><a name="l05059"></a><span class="lineno"> 5059</span>&#160;    }</div>
-<div class="line"><a name="l05060"></a><span class="lineno"> 5060</span>&#160;    <span class="keyword">const</span> T&amp; operator[](<span class="keywordtype">size_t</span> index)<span class="keyword"> const</span></div>
-<div class="line"><a name="l05061"></a><span class="lineno"> 5061</span>&#160;<span class="keyword">    </span>{</div>
-<div class="line"><a name="l05062"></a><span class="lineno"> 5062</span>&#160;        VMA_HEAVY_ASSERT(index &lt; m_Count);</div>
-<div class="line"><a name="l05063"></a><span class="lineno"> 5063</span>&#160;        <span class="keywordflow">return</span> data()[index];</div>
-<div class="line"><a name="l05064"></a><span class="lineno"> 5064</span>&#160;    }</div>
-<div class="line"><a name="l05065"></a><span class="lineno"> 5065</span>&#160; </div>
-<div class="line"><a name="l05066"></a><span class="lineno"> 5066</span>&#160;    T&amp; front()</div>
-<div class="line"><a name="l05067"></a><span class="lineno"> 5067</span>&#160;    {</div>
-<div class="line"><a name="l05068"></a><span class="lineno"> 5068</span>&#160;        VMA_HEAVY_ASSERT(m_Count &gt; 0);</div>
-<div class="line"><a name="l05069"></a><span class="lineno"> 5069</span>&#160;        <span class="keywordflow">return</span> data()[0];</div>
-<div class="line"><a name="l05070"></a><span class="lineno"> 5070</span>&#160;    }</div>
-<div class="line"><a name="l05071"></a><span class="lineno"> 5071</span>&#160;    <span class="keyword">const</span> T&amp; front()<span class="keyword"> const</span></div>
-<div class="line"><a name="l05072"></a><span class="lineno"> 5072</span>&#160;<span class="keyword">    </span>{</div>
-<div class="line"><a name="l05073"></a><span class="lineno"> 5073</span>&#160;        VMA_HEAVY_ASSERT(m_Count &gt; 0);</div>
-<div class="line"><a name="l05074"></a><span class="lineno"> 5074</span>&#160;        <span class="keywordflow">return</span> data()[0];</div>
-<div class="line"><a name="l05075"></a><span class="lineno"> 5075</span>&#160;    }</div>
-<div class="line"><a name="l05076"></a><span class="lineno"> 5076</span>&#160;    T&amp; back()</div>
-<div class="line"><a name="l05077"></a><span class="lineno"> 5077</span>&#160;    {</div>
-<div class="line"><a name="l05078"></a><span class="lineno"> 5078</span>&#160;        VMA_HEAVY_ASSERT(m_Count &gt; 0);</div>
-<div class="line"><a name="l05079"></a><span class="lineno"> 5079</span>&#160;        <span class="keywordflow">return</span> data()[m_Count - 1];</div>
-<div class="line"><a name="l05080"></a><span class="lineno"> 5080</span>&#160;    }</div>
-<div class="line"><a name="l05081"></a><span class="lineno"> 5081</span>&#160;    <span class="keyword">const</span> T&amp; back()<span class="keyword"> const</span></div>
-<div class="line"><a name="l05082"></a><span class="lineno"> 5082</span>&#160;<span class="keyword">    </span>{</div>
-<div class="line"><a name="l05083"></a><span class="lineno"> 5083</span>&#160;        VMA_HEAVY_ASSERT(m_Count &gt; 0);</div>
-<div class="line"><a name="l05084"></a><span class="lineno"> 5084</span>&#160;        <span class="keywordflow">return</span> data()[m_Count - 1];</div>
-<div class="line"><a name="l05085"></a><span class="lineno"> 5085</span>&#160;    }</div>
-<div class="line"><a name="l05086"></a><span class="lineno"> 5086</span>&#160; </div>
-<div class="line"><a name="l05087"></a><span class="lineno"> 5087</span>&#160;    <span class="keywordtype">void</span> resize(<span class="keywordtype">size_t</span> newCount, <span class="keywordtype">bool</span> freeMemory = <span class="keyword">false</span>)</div>
-<div class="line"><a name="l05088"></a><span class="lineno"> 5088</span>&#160;    {</div>
-<div class="line"><a name="l05089"></a><span class="lineno"> 5089</span>&#160;        <span class="keywordflow">if</span>(newCount &gt; N &amp;&amp; m_Count &gt; N)</div>
-<div class="line"><a name="l05090"></a><span class="lineno"> 5090</span>&#160;        {</div>
-<div class="line"><a name="l05091"></a><span class="lineno"> 5091</span>&#160;            <span class="comment">// Any direction, staying in m_DynamicArray</span></div>
-<div class="line"><a name="l05092"></a><span class="lineno"> 5092</span>&#160;            m_DynamicArray.resize(newCount, freeMemory);</div>
-<div class="line"><a name="l05093"></a><span class="lineno"> 5093</span>&#160;        }</div>
-<div class="line"><a name="l05094"></a><span class="lineno"> 5094</span>&#160;        <span class="keywordflow">else</span> <span class="keywordflow">if</span>(newCount &gt; N &amp;&amp; m_Count &lt;= N)</div>
-<div class="line"><a name="l05095"></a><span class="lineno"> 5095</span>&#160;        {</div>
-<div class="line"><a name="l05096"></a><span class="lineno"> 5096</span>&#160;            <span class="comment">// Growing, moving from m_StaticArray to m_DynamicArray</span></div>
-<div class="line"><a name="l05097"></a><span class="lineno"> 5097</span>&#160;            m_DynamicArray.resize(newCount, freeMemory);</div>
-<div class="line"><a name="l05098"></a><span class="lineno"> 5098</span>&#160;            <span class="keywordflow">if</span>(m_Count &gt; 0)</div>
-<div class="line"><a name="l05099"></a><span class="lineno"> 5099</span>&#160;            {</div>
-<div class="line"><a name="l05100"></a><span class="lineno"> 5100</span>&#160;                memcpy(m_DynamicArray.data(), m_StaticArray, m_Count * <span class="keyword">sizeof</span>(T));</div>
-<div class="line"><a name="l05101"></a><span class="lineno"> 5101</span>&#160;            }</div>
-<div class="line"><a name="l05102"></a><span class="lineno"> 5102</span>&#160;        }</div>
-<div class="line"><a name="l05103"></a><span class="lineno"> 5103</span>&#160;        <span class="keywordflow">else</span> <span class="keywordflow">if</span>(newCount &lt;= N &amp;&amp; m_Count &gt; N)</div>
-<div class="line"><a name="l05104"></a><span class="lineno"> 5104</span>&#160;        {</div>
-<div class="line"><a name="l05105"></a><span class="lineno"> 5105</span>&#160;            <span class="comment">// Shrinking, moving from m_DynamicArray to m_StaticArray</span></div>
-<div class="line"><a name="l05106"></a><span class="lineno"> 5106</span>&#160;            <span class="keywordflow">if</span>(newCount &gt; 0)</div>
-<div class="line"><a name="l05107"></a><span class="lineno"> 5107</span>&#160;            {</div>
-<div class="line"><a name="l05108"></a><span class="lineno"> 5108</span>&#160;                memcpy(m_StaticArray, m_DynamicArray.data(), newCount * <span class="keyword">sizeof</span>(T));</div>
-<div class="line"><a name="l05109"></a><span class="lineno"> 5109</span>&#160;            }</div>
-<div class="line"><a name="l05110"></a><span class="lineno"> 5110</span>&#160;            m_DynamicArray.resize(0, freeMemory);</div>
-<div class="line"><a name="l05111"></a><span class="lineno"> 5111</span>&#160;        }</div>
-<div class="line"><a name="l05112"></a><span class="lineno"> 5112</span>&#160;        <span class="keywordflow">else</span></div>
-<div class="line"><a name="l05113"></a><span class="lineno"> 5113</span>&#160;        {</div>
-<div class="line"><a name="l05114"></a><span class="lineno"> 5114</span>&#160;            <span class="comment">// Any direction, staying in m_StaticArray - nothing to do here</span></div>
-<div class="line"><a name="l05115"></a><span class="lineno"> 5115</span>&#160;        }</div>
-<div class="line"><a name="l05116"></a><span class="lineno"> 5116</span>&#160;        m_Count = newCount;</div>
-<div class="line"><a name="l05117"></a><span class="lineno"> 5117</span>&#160;    }</div>
-<div class="line"><a name="l05118"></a><span class="lineno"> 5118</span>&#160; </div>
-<div class="line"><a name="l05119"></a><span class="lineno"> 5119</span>&#160;    <span class="keywordtype">void</span> clear(<span class="keywordtype">bool</span> freeMemory = <span class="keyword">false</span>)</div>
-<div class="line"><a name="l05120"></a><span class="lineno"> 5120</span>&#160;    {</div>
-<div class="line"><a name="l05121"></a><span class="lineno"> 5121</span>&#160;        m_DynamicArray.clear(freeMemory);</div>
-<div class="line"><a name="l05122"></a><span class="lineno"> 5122</span>&#160;        m_Count = 0;</div>
-<div class="line"><a name="l05123"></a><span class="lineno"> 5123</span>&#160;    }</div>
-<div class="line"><a name="l05124"></a><span class="lineno"> 5124</span>&#160; </div>
-<div class="line"><a name="l05125"></a><span class="lineno"> 5125</span>&#160;    <span class="keywordtype">void</span> insert(<span class="keywordtype">size_t</span> index, <span class="keyword">const</span> T&amp; src)</div>
-<div class="line"><a name="l05126"></a><span class="lineno"> 5126</span>&#160;    {</div>
-<div class="line"><a name="l05127"></a><span class="lineno"> 5127</span>&#160;        VMA_HEAVY_ASSERT(index &lt;= m_Count);</div>
-<div class="line"><a name="l05128"></a><span class="lineno"> 5128</span>&#160;        <span class="keyword">const</span> <span class="keywordtype">size_t</span> oldCount = size();</div>
-<div class="line"><a name="l05129"></a><span class="lineno"> 5129</span>&#160;        resize(oldCount + 1);</div>
-<div class="line"><a name="l05130"></a><span class="lineno"> 5130</span>&#160;        T* <span class="keyword">const</span> dataPtr = data();</div>
-<div class="line"><a name="l05131"></a><span class="lineno"> 5131</span>&#160;        <span class="keywordflow">if</span>(index &lt; oldCount)</div>
-<div class="line"><a name="l05132"></a><span class="lineno"> 5132</span>&#160;        {</div>
-<div class="line"><a name="l05133"></a><span class="lineno"> 5133</span>&#160;            <span class="comment">//  I know, this could be more optimal for case where memmove can be memcpy directly from m_StaticArray to m_DynamicArray.</span></div>
-<div class="line"><a name="l05134"></a><span class="lineno"> 5134</span>&#160;            memmove(dataPtr + (index + 1), dataPtr + index, (oldCount - index) * <span class="keyword">sizeof</span>(T));</div>
-<div class="line"><a name="l05135"></a><span class="lineno"> 5135</span>&#160;        }</div>
-<div class="line"><a name="l05136"></a><span class="lineno"> 5136</span>&#160;        dataPtr[index] = src;</div>
-<div class="line"><a name="l05137"></a><span class="lineno"> 5137</span>&#160;    }</div>
-<div class="line"><a name="l05138"></a><span class="lineno"> 5138</span>&#160; </div>
-<div class="line"><a name="l05139"></a><span class="lineno"> 5139</span>&#160;    <span class="keywordtype">void</span> remove(<span class="keywordtype">size_t</span> index)</div>
-<div class="line"><a name="l05140"></a><span class="lineno"> 5140</span>&#160;    {</div>
-<div class="line"><a name="l05141"></a><span class="lineno"> 5141</span>&#160;        VMA_HEAVY_ASSERT(index &lt; m_Count);</div>
-<div class="line"><a name="l05142"></a><span class="lineno"> 5142</span>&#160;        <span class="keyword">const</span> <span class="keywordtype">size_t</span> oldCount = size();</div>
-<div class="line"><a name="l05143"></a><span class="lineno"> 5143</span>&#160;        <span class="keywordflow">if</span>(index &lt; oldCount - 1)</div>
-<div class="line"><a name="l05144"></a><span class="lineno"> 5144</span>&#160;        {</div>
-<div class="line"><a name="l05145"></a><span class="lineno"> 5145</span>&#160;            <span class="comment">//  I know, this could be more optimal for case where memmove can be memcpy directly from m_DynamicArray to m_StaticArray.</span></div>
-<div class="line"><a name="l05146"></a><span class="lineno"> 5146</span>&#160;            T* <span class="keyword">const</span> dataPtr = data();</div>
-<div class="line"><a name="l05147"></a><span class="lineno"> 5147</span>&#160;            memmove(dataPtr + index, dataPtr + (index + 1), (oldCount - index - 1) * <span class="keyword">sizeof</span>(T));</div>
+<div class="line"><a name="l05029"></a><span class="lineno"> 5029</span>&#160;    ~VmaVector()</div>
+<div class="line"><a name="l05030"></a><span class="lineno"> 5030</span>&#160;    {</div>
+<div class="line"><a name="l05031"></a><span class="lineno"> 5031</span>&#160;        VmaFree(m_Allocator.m_pCallbacks, m_pArray);</div>
+<div class="line"><a name="l05032"></a><span class="lineno"> 5032</span>&#160;    }</div>
+<div class="line"><a name="l05033"></a><span class="lineno"> 5033</span>&#160; </div>
+<div class="line"><a name="l05034"></a><span class="lineno"> 5034</span>&#160;    VmaVector&amp; operator=(<span class="keyword">const</span> VmaVector&lt;T, AllocatorT&gt;&amp; rhs)</div>
+<div class="line"><a name="l05035"></a><span class="lineno"> 5035</span>&#160;    {</div>
+<div class="line"><a name="l05036"></a><span class="lineno"> 5036</span>&#160;        <span class="keywordflow">if</span>(&amp;rhs != <span class="keyword">this</span>)</div>
+<div class="line"><a name="l05037"></a><span class="lineno"> 5037</span>&#160;        {</div>
+<div class="line"><a name="l05038"></a><span class="lineno"> 5038</span>&#160;            resize(rhs.m_Count);</div>
+<div class="line"><a name="l05039"></a><span class="lineno"> 5039</span>&#160;            <span class="keywordflow">if</span>(m_Count != 0)</div>
+<div class="line"><a name="l05040"></a><span class="lineno"> 5040</span>&#160;            {</div>
+<div class="line"><a name="l05041"></a><span class="lineno"> 5041</span>&#160;                memcpy(m_pArray, rhs.m_pArray, m_Count * <span class="keyword">sizeof</span>(T));</div>
+<div class="line"><a name="l05042"></a><span class="lineno"> 5042</span>&#160;            }</div>
+<div class="line"><a name="l05043"></a><span class="lineno"> 5043</span>&#160;        }</div>
+<div class="line"><a name="l05044"></a><span class="lineno"> 5044</span>&#160;        <span class="keywordflow">return</span> *<span class="keyword">this</span>;</div>
+<div class="line"><a name="l05045"></a><span class="lineno"> 5045</span>&#160;    }</div>
+<div class="line"><a name="l05046"></a><span class="lineno"> 5046</span>&#160; </div>
+<div class="line"><a name="l05047"></a><span class="lineno"> 5047</span>&#160;    <span class="keywordtype">bool</span> empty()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_Count == 0; }</div>
+<div class="line"><a name="l05048"></a><span class="lineno"> 5048</span>&#160;    <span class="keywordtype">size_t</span> size()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_Count; }</div>
+<div class="line"><a name="l05049"></a><span class="lineno"> 5049</span>&#160;    T* data() { <span class="keywordflow">return</span> m_pArray; }</div>
+<div class="line"><a name="l05050"></a><span class="lineno"> 5050</span>&#160;    <span class="keyword">const</span> T* data()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_pArray; }</div>
+<div class="line"><a name="l05051"></a><span class="lineno"> 5051</span>&#160; </div>
+<div class="line"><a name="l05052"></a><span class="lineno"> 5052</span>&#160;    T&amp; operator[](<span class="keywordtype">size_t</span> index)</div>
+<div class="line"><a name="l05053"></a><span class="lineno"> 5053</span>&#160;    {</div>
+<div class="line"><a name="l05054"></a><span class="lineno"> 5054</span>&#160;        VMA_HEAVY_ASSERT(index &lt; m_Count);</div>
+<div class="line"><a name="l05055"></a><span class="lineno"> 5055</span>&#160;        <span class="keywordflow">return</span> m_pArray[index];</div>
+<div class="line"><a name="l05056"></a><span class="lineno"> 5056</span>&#160;    }</div>
+<div class="line"><a name="l05057"></a><span class="lineno"> 5057</span>&#160;    <span class="keyword">const</span> T&amp; operator[](<span class="keywordtype">size_t</span> index)<span class="keyword"> const</span></div>
+<div class="line"><a name="l05058"></a><span class="lineno"> 5058</span>&#160;<span class="keyword">    </span>{</div>
+<div class="line"><a name="l05059"></a><span class="lineno"> 5059</span>&#160;        VMA_HEAVY_ASSERT(index &lt; m_Count);</div>
+<div class="line"><a name="l05060"></a><span class="lineno"> 5060</span>&#160;        <span class="keywordflow">return</span> m_pArray[index];</div>
+<div class="line"><a name="l05061"></a><span class="lineno"> 5061</span>&#160;    }</div>
+<div class="line"><a name="l05062"></a><span class="lineno"> 5062</span>&#160; </div>
+<div class="line"><a name="l05063"></a><span class="lineno"> 5063</span>&#160;    T&amp; front()</div>
+<div class="line"><a name="l05064"></a><span class="lineno"> 5064</span>&#160;    {</div>
+<div class="line"><a name="l05065"></a><span class="lineno"> 5065</span>&#160;        VMA_HEAVY_ASSERT(m_Count &gt; 0);</div>
+<div class="line"><a name="l05066"></a><span class="lineno"> 5066</span>&#160;        <span class="keywordflow">return</span> m_pArray[0];</div>
+<div class="line"><a name="l05067"></a><span class="lineno"> 5067</span>&#160;    }</div>
+<div class="line"><a name="l05068"></a><span class="lineno"> 5068</span>&#160;    <span class="keyword">const</span> T&amp; front()<span class="keyword"> const</span></div>
+<div class="line"><a name="l05069"></a><span class="lineno"> 5069</span>&#160;<span class="keyword">    </span>{</div>
+<div class="line"><a name="l05070"></a><span class="lineno"> 5070</span>&#160;        VMA_HEAVY_ASSERT(m_Count &gt; 0);</div>
+<div class="line"><a name="l05071"></a><span class="lineno"> 5071</span>&#160;        <span class="keywordflow">return</span> m_pArray[0];</div>
+<div class="line"><a name="l05072"></a><span class="lineno"> 5072</span>&#160;    }</div>
+<div class="line"><a name="l05073"></a><span class="lineno"> 5073</span>&#160;    T&amp; back()</div>
+<div class="line"><a name="l05074"></a><span class="lineno"> 5074</span>&#160;    {</div>
+<div class="line"><a name="l05075"></a><span class="lineno"> 5075</span>&#160;        VMA_HEAVY_ASSERT(m_Count &gt; 0);</div>
+<div class="line"><a name="l05076"></a><span class="lineno"> 5076</span>&#160;        <span class="keywordflow">return</span> m_pArray[m_Count - 1];</div>
+<div class="line"><a name="l05077"></a><span class="lineno"> 5077</span>&#160;    }</div>
+<div class="line"><a name="l05078"></a><span class="lineno"> 5078</span>&#160;    <span class="keyword">const</span> T&amp; back()<span class="keyword"> const</span></div>
+<div class="line"><a name="l05079"></a><span class="lineno"> 5079</span>&#160;<span class="keyword">    </span>{</div>
+<div class="line"><a name="l05080"></a><span class="lineno"> 5080</span>&#160;        VMA_HEAVY_ASSERT(m_Count &gt; 0);</div>
+<div class="line"><a name="l05081"></a><span class="lineno"> 5081</span>&#160;        <span class="keywordflow">return</span> m_pArray[m_Count - 1];</div>
+<div class="line"><a name="l05082"></a><span class="lineno"> 5082</span>&#160;    }</div>
+<div class="line"><a name="l05083"></a><span class="lineno"> 5083</span>&#160; </div>
+<div class="line"><a name="l05084"></a><span class="lineno"> 5084</span>&#160;    <span class="keywordtype">void</span> reserve(<span class="keywordtype">size_t</span> newCapacity, <span class="keywordtype">bool</span> freeMemory = <span class="keyword">false</span>)</div>
+<div class="line"><a name="l05085"></a><span class="lineno"> 5085</span>&#160;    {</div>
+<div class="line"><a name="l05086"></a><span class="lineno"> 5086</span>&#160;        newCapacity = VMA_MAX(newCapacity, m_Count);</div>
+<div class="line"><a name="l05087"></a><span class="lineno"> 5087</span>&#160; </div>
+<div class="line"><a name="l05088"></a><span class="lineno"> 5088</span>&#160;        <span class="keywordflow">if</span>((newCapacity &lt; m_Capacity) &amp;&amp; !freeMemory)</div>
+<div class="line"><a name="l05089"></a><span class="lineno"> 5089</span>&#160;        {</div>
+<div class="line"><a name="l05090"></a><span class="lineno"> 5090</span>&#160;            newCapacity = m_Capacity;</div>
+<div class="line"><a name="l05091"></a><span class="lineno"> 5091</span>&#160;        }</div>
+<div class="line"><a name="l05092"></a><span class="lineno"> 5092</span>&#160; </div>
+<div class="line"><a name="l05093"></a><span class="lineno"> 5093</span>&#160;        <span class="keywordflow">if</span>(newCapacity != m_Capacity)</div>
+<div class="line"><a name="l05094"></a><span class="lineno"> 5094</span>&#160;        {</div>
+<div class="line"><a name="l05095"></a><span class="lineno"> 5095</span>&#160;            T* <span class="keyword">const</span> newArray = newCapacity ? VmaAllocateArray&lt;T&gt;(m_Allocator, newCapacity) : VMA_NULL;</div>
+<div class="line"><a name="l05096"></a><span class="lineno"> 5096</span>&#160;            <span class="keywordflow">if</span>(m_Count != 0)</div>
+<div class="line"><a name="l05097"></a><span class="lineno"> 5097</span>&#160;            {</div>
+<div class="line"><a name="l05098"></a><span class="lineno"> 5098</span>&#160;                memcpy(newArray, m_pArray, m_Count * <span class="keyword">sizeof</span>(T));</div>
+<div class="line"><a name="l05099"></a><span class="lineno"> 5099</span>&#160;            }</div>
+<div class="line"><a name="l05100"></a><span class="lineno"> 5100</span>&#160;            VmaFree(m_Allocator.m_pCallbacks, m_pArray);</div>
+<div class="line"><a name="l05101"></a><span class="lineno"> 5101</span>&#160;            m_Capacity = newCapacity;</div>
+<div class="line"><a name="l05102"></a><span class="lineno"> 5102</span>&#160;            m_pArray = newArray;</div>
+<div class="line"><a name="l05103"></a><span class="lineno"> 5103</span>&#160;        }</div>
+<div class="line"><a name="l05104"></a><span class="lineno"> 5104</span>&#160;    }</div>
+<div class="line"><a name="l05105"></a><span class="lineno"> 5105</span>&#160; </div>
+<div class="line"><a name="l05106"></a><span class="lineno"> 5106</span>&#160;    <span class="keywordtype">void</span> resize(<span class="keywordtype">size_t</span> newCount)</div>
+<div class="line"><a name="l05107"></a><span class="lineno"> 5107</span>&#160;    {</div>
+<div class="line"><a name="l05108"></a><span class="lineno"> 5108</span>&#160;        <span class="keywordtype">size_t</span> newCapacity = m_Capacity;</div>
+<div class="line"><a name="l05109"></a><span class="lineno"> 5109</span>&#160;        <span class="keywordflow">if</span>(newCount &gt; m_Capacity)</div>
+<div class="line"><a name="l05110"></a><span class="lineno"> 5110</span>&#160;        {</div>
+<div class="line"><a name="l05111"></a><span class="lineno"> 5111</span>&#160;            newCapacity = VMA_MAX(newCount, VMA_MAX(m_Capacity * 3 / 2, (<span class="keywordtype">size_t</span>)8));</div>
+<div class="line"><a name="l05112"></a><span class="lineno"> 5112</span>&#160;        }</div>
+<div class="line"><a name="l05113"></a><span class="lineno"> 5113</span>&#160; </div>
+<div class="line"><a name="l05114"></a><span class="lineno"> 5114</span>&#160;        <span class="keywordflow">if</span>(newCapacity != m_Capacity)</div>
+<div class="line"><a name="l05115"></a><span class="lineno"> 5115</span>&#160;        {</div>
+<div class="line"><a name="l05116"></a><span class="lineno"> 5116</span>&#160;            T* <span class="keyword">const</span> newArray = newCapacity ? VmaAllocateArray&lt;T&gt;(m_Allocator.m_pCallbacks, newCapacity) : VMA_NULL;</div>
+<div class="line"><a name="l05117"></a><span class="lineno"> 5117</span>&#160;            <span class="keyword">const</span> <span class="keywordtype">size_t</span> elementsToCopy = VMA_MIN(m_Count, newCount);</div>
+<div class="line"><a name="l05118"></a><span class="lineno"> 5118</span>&#160;            <span class="keywordflow">if</span>(elementsToCopy != 0)</div>
+<div class="line"><a name="l05119"></a><span class="lineno"> 5119</span>&#160;            {</div>
+<div class="line"><a name="l05120"></a><span class="lineno"> 5120</span>&#160;                memcpy(newArray, m_pArray, elementsToCopy * <span class="keyword">sizeof</span>(T));</div>
+<div class="line"><a name="l05121"></a><span class="lineno"> 5121</span>&#160;            }</div>
+<div class="line"><a name="l05122"></a><span class="lineno"> 5122</span>&#160;            VmaFree(m_Allocator.m_pCallbacks, m_pArray);</div>
+<div class="line"><a name="l05123"></a><span class="lineno"> 5123</span>&#160;            m_Capacity = newCapacity;</div>
+<div class="line"><a name="l05124"></a><span class="lineno"> 5124</span>&#160;            m_pArray = newArray;</div>
+<div class="line"><a name="l05125"></a><span class="lineno"> 5125</span>&#160;        }</div>
+<div class="line"><a name="l05126"></a><span class="lineno"> 5126</span>&#160; </div>
+<div class="line"><a name="l05127"></a><span class="lineno"> 5127</span>&#160;        m_Count = newCount;</div>
+<div class="line"><a name="l05128"></a><span class="lineno"> 5128</span>&#160;    }</div>
+<div class="line"><a name="l05129"></a><span class="lineno"> 5129</span>&#160; </div>
+<div class="line"><a name="l05130"></a><span class="lineno"> 5130</span>&#160;    <span class="keywordtype">void</span> clear()</div>
+<div class="line"><a name="l05131"></a><span class="lineno"> 5131</span>&#160;    {</div>
+<div class="line"><a name="l05132"></a><span class="lineno"> 5132</span>&#160;        resize(0);</div>
+<div class="line"><a name="l05133"></a><span class="lineno"> 5133</span>&#160;    }</div>
+<div class="line"><a name="l05134"></a><span class="lineno"> 5134</span>&#160; </div>
+<div class="line"><a name="l05135"></a><span class="lineno"> 5135</span>&#160;    <span class="keywordtype">void</span> shrink_to_fit()</div>
+<div class="line"><a name="l05136"></a><span class="lineno"> 5136</span>&#160;    {</div>
+<div class="line"><a name="l05137"></a><span class="lineno"> 5137</span>&#160;        <span class="keywordflow">if</span>(m_Capacity &gt; m_Count)</div>
+<div class="line"><a name="l05138"></a><span class="lineno"> 5138</span>&#160;        {</div>
+<div class="line"><a name="l05139"></a><span class="lineno"> 5139</span>&#160;            T* newArray = VMA_NULL;</div>
+<div class="line"><a name="l05140"></a><span class="lineno"> 5140</span>&#160;            <span class="keywordflow">if</span>(m_Count &gt; 0)</div>
+<div class="line"><a name="l05141"></a><span class="lineno"> 5141</span>&#160;            {</div>
+<div class="line"><a name="l05142"></a><span class="lineno"> 5142</span>&#160;                newArray = VmaAllocateArray&lt;T&gt;(m_Allocator.m_pCallbacks, m_Count);</div>
+<div class="line"><a name="l05143"></a><span class="lineno"> 5143</span>&#160;                memcpy(newArray, m_pArray, m_Count * <span class="keyword">sizeof</span>(T));</div>
+<div class="line"><a name="l05144"></a><span class="lineno"> 5144</span>&#160;            }</div>
+<div class="line"><a name="l05145"></a><span class="lineno"> 5145</span>&#160;            VmaFree(m_Allocator.m_pCallbacks, m_pArray);</div>
+<div class="line"><a name="l05146"></a><span class="lineno"> 5146</span>&#160;            m_Capacity = m_Count;</div>
+<div class="line"><a name="l05147"></a><span class="lineno"> 5147</span>&#160;            m_pArray = newArray;</div>
 <div class="line"><a name="l05148"></a><span class="lineno"> 5148</span>&#160;        }</div>
-<div class="line"><a name="l05149"></a><span class="lineno"> 5149</span>&#160;        resize(oldCount - 1);</div>
-<div class="line"><a name="l05150"></a><span class="lineno"> 5150</span>&#160;    }</div>
-<div class="line"><a name="l05151"></a><span class="lineno"> 5151</span>&#160; </div>
-<div class="line"><a name="l05152"></a><span class="lineno"> 5152</span>&#160;    <span class="keywordtype">void</span> push_back(<span class="keyword">const</span> T&amp; src)</div>
-<div class="line"><a name="l05153"></a><span class="lineno"> 5153</span>&#160;    {</div>
-<div class="line"><a name="l05154"></a><span class="lineno"> 5154</span>&#160;        <span class="keyword">const</span> <span class="keywordtype">size_t</span> newIndex = size();</div>
-<div class="line"><a name="l05155"></a><span class="lineno"> 5155</span>&#160;        resize(newIndex + 1);</div>
-<div class="line"><a name="l05156"></a><span class="lineno"> 5156</span>&#160;        data()[newIndex] = src;</div>
-<div class="line"><a name="l05157"></a><span class="lineno"> 5157</span>&#160;    }</div>
-<div class="line"><a name="l05158"></a><span class="lineno"> 5158</span>&#160; </div>
-<div class="line"><a name="l05159"></a><span class="lineno"> 5159</span>&#160;    <span class="keywordtype">void</span> pop_back()</div>
-<div class="line"><a name="l05160"></a><span class="lineno"> 5160</span>&#160;    {</div>
-<div class="line"><a name="l05161"></a><span class="lineno"> 5161</span>&#160;        VMA_HEAVY_ASSERT(m_Count &gt; 0);</div>
-<div class="line"><a name="l05162"></a><span class="lineno"> 5162</span>&#160;        resize(size() - 1);</div>
-<div class="line"><a name="l05163"></a><span class="lineno"> 5163</span>&#160;    }</div>
-<div class="line"><a name="l05164"></a><span class="lineno"> 5164</span>&#160; </div>
-<div class="line"><a name="l05165"></a><span class="lineno"> 5165</span>&#160;    <span class="keywordtype">void</span> push_front(<span class="keyword">const</span> T&amp; src)</div>
-<div class="line"><a name="l05166"></a><span class="lineno"> 5166</span>&#160;    {</div>
-<div class="line"><a name="l05167"></a><span class="lineno"> 5167</span>&#160;        insert(0, src);</div>
-<div class="line"><a name="l05168"></a><span class="lineno"> 5168</span>&#160;    }</div>
-<div class="line"><a name="l05169"></a><span class="lineno"> 5169</span>&#160; </div>
-<div class="line"><a name="l05170"></a><span class="lineno"> 5170</span>&#160;    <span class="keywordtype">void</span> pop_front()</div>
-<div class="line"><a name="l05171"></a><span class="lineno"> 5171</span>&#160;    {</div>
-<div class="line"><a name="l05172"></a><span class="lineno"> 5172</span>&#160;        VMA_HEAVY_ASSERT(m_Count &gt; 0);</div>
-<div class="line"><a name="l05173"></a><span class="lineno"> 5173</span>&#160;        remove(0);</div>
-<div class="line"><a name="l05174"></a><span class="lineno"> 5174</span>&#160;    }</div>
-<div class="line"><a name="l05175"></a><span class="lineno"> 5175</span>&#160; </div>
-<div class="line"><a name="l05176"></a><span class="lineno"> 5176</span>&#160;    <span class="keyword">typedef</span> T* iterator;</div>
-<div class="line"><a name="l05177"></a><span class="lineno"> 5177</span>&#160; </div>
-<div class="line"><a name="l05178"></a><span class="lineno"> 5178</span>&#160;    iterator begin() { <span class="keywordflow">return</span> data(); }</div>
-<div class="line"><a name="l05179"></a><span class="lineno"> 5179</span>&#160;    iterator end() { <span class="keywordflow">return</span> data() + m_Count; }</div>
+<div class="line"><a name="l05149"></a><span class="lineno"> 5149</span>&#160;    }</div>
+<div class="line"><a name="l05150"></a><span class="lineno"> 5150</span>&#160; </div>
+<div class="line"><a name="l05151"></a><span class="lineno"> 5151</span>&#160;    <span class="keywordtype">void</span> insert(<span class="keywordtype">size_t</span> index, <span class="keyword">const</span> T&amp; src)</div>
+<div class="line"><a name="l05152"></a><span class="lineno"> 5152</span>&#160;    {</div>
+<div class="line"><a name="l05153"></a><span class="lineno"> 5153</span>&#160;        VMA_HEAVY_ASSERT(index &lt;= m_Count);</div>
+<div class="line"><a name="l05154"></a><span class="lineno"> 5154</span>&#160;        <span class="keyword">const</span> <span class="keywordtype">size_t</span> oldCount = size();</div>
+<div class="line"><a name="l05155"></a><span class="lineno"> 5155</span>&#160;        resize(oldCount + 1);</div>
+<div class="line"><a name="l05156"></a><span class="lineno"> 5156</span>&#160;        <span class="keywordflow">if</span>(index &lt; oldCount)</div>
+<div class="line"><a name="l05157"></a><span class="lineno"> 5157</span>&#160;        {</div>
+<div class="line"><a name="l05158"></a><span class="lineno"> 5158</span>&#160;            memmove(m_pArray + (index + 1), m_pArray + index, (oldCount - index) * <span class="keyword">sizeof</span>(T));</div>
+<div class="line"><a name="l05159"></a><span class="lineno"> 5159</span>&#160;        }</div>
+<div class="line"><a name="l05160"></a><span class="lineno"> 5160</span>&#160;        m_pArray[index] = src;</div>
+<div class="line"><a name="l05161"></a><span class="lineno"> 5161</span>&#160;    }</div>
+<div class="line"><a name="l05162"></a><span class="lineno"> 5162</span>&#160; </div>
+<div class="line"><a name="l05163"></a><span class="lineno"> 5163</span>&#160;    <span class="keywordtype">void</span> remove(<span class="keywordtype">size_t</span> index)</div>
+<div class="line"><a name="l05164"></a><span class="lineno"> 5164</span>&#160;    {</div>
+<div class="line"><a name="l05165"></a><span class="lineno"> 5165</span>&#160;        VMA_HEAVY_ASSERT(index &lt; m_Count);</div>
+<div class="line"><a name="l05166"></a><span class="lineno"> 5166</span>&#160;        <span class="keyword">const</span> <span class="keywordtype">size_t</span> oldCount = size();</div>
+<div class="line"><a name="l05167"></a><span class="lineno"> 5167</span>&#160;        <span class="keywordflow">if</span>(index &lt; oldCount - 1)</div>
+<div class="line"><a name="l05168"></a><span class="lineno"> 5168</span>&#160;        {</div>
+<div class="line"><a name="l05169"></a><span class="lineno"> 5169</span>&#160;            memmove(m_pArray + index, m_pArray + (index + 1), (oldCount - index - 1) * <span class="keyword">sizeof</span>(T));</div>
+<div class="line"><a name="l05170"></a><span class="lineno"> 5170</span>&#160;        }</div>
+<div class="line"><a name="l05171"></a><span class="lineno"> 5171</span>&#160;        resize(oldCount - 1);</div>
+<div class="line"><a name="l05172"></a><span class="lineno"> 5172</span>&#160;    }</div>
+<div class="line"><a name="l05173"></a><span class="lineno"> 5173</span>&#160; </div>
+<div class="line"><a name="l05174"></a><span class="lineno"> 5174</span>&#160;    <span class="keywordtype">void</span> push_back(<span class="keyword">const</span> T&amp; src)</div>
+<div class="line"><a name="l05175"></a><span class="lineno"> 5175</span>&#160;    {</div>
+<div class="line"><a name="l05176"></a><span class="lineno"> 5176</span>&#160;        <span class="keyword">const</span> <span class="keywordtype">size_t</span> newIndex = size();</div>
+<div class="line"><a name="l05177"></a><span class="lineno"> 5177</span>&#160;        resize(newIndex + 1);</div>
+<div class="line"><a name="l05178"></a><span class="lineno"> 5178</span>&#160;        m_pArray[newIndex] = src;</div>
+<div class="line"><a name="l05179"></a><span class="lineno"> 5179</span>&#160;    }</div>
 <div class="line"><a name="l05180"></a><span class="lineno"> 5180</span>&#160; </div>
-<div class="line"><a name="l05181"></a><span class="lineno"> 5181</span>&#160;<span class="keyword">private</span>:</div>
-<div class="line"><a name="l05182"></a><span class="lineno"> 5182</span>&#160;    <span class="keywordtype">size_t</span> m_Count;</div>
-<div class="line"><a name="l05183"></a><span class="lineno"> 5183</span>&#160;    T m_StaticArray[N]; <span class="comment">// Used when m_Size &lt;= N</span></div>
-<div class="line"><a name="l05184"></a><span class="lineno"> 5184</span>&#160;    VmaVector&lt;T, AllocatorT&gt; m_DynamicArray; <span class="comment">// Used when m_Size &gt; N</span></div>
-<div class="line"><a name="l05185"></a><span class="lineno"> 5185</span>&#160;};</div>
+<div class="line"><a name="l05181"></a><span class="lineno"> 5181</span>&#160;    <span class="keywordtype">void</span> pop_back()</div>
+<div class="line"><a name="l05182"></a><span class="lineno"> 5182</span>&#160;    {</div>
+<div class="line"><a name="l05183"></a><span class="lineno"> 5183</span>&#160;        VMA_HEAVY_ASSERT(m_Count &gt; 0);</div>
+<div class="line"><a name="l05184"></a><span class="lineno"> 5184</span>&#160;        resize(size() - 1);</div>
+<div class="line"><a name="l05185"></a><span class="lineno"> 5185</span>&#160;    }</div>
 <div class="line"><a name="l05186"></a><span class="lineno"> 5186</span>&#160; </div>
-<div class="line"><a name="l05188"></a><span class="lineno"> 5188</span>&#160;<span class="comment">// class VmaPoolAllocator</span></div>
-<div class="line"><a name="l05189"></a><span class="lineno"> 5189</span>&#160; </div>
-<div class="line"><a name="l05190"></a><span class="lineno"> 5190</span>&#160;<span class="comment">/*</span></div>
-<div class="line"><a name="l05191"></a><span class="lineno"> 5191</span>&#160;<span class="comment">Allocator for objects of type T using a list of arrays (pools) to speed up</span></div>
-<div class="line"><a name="l05192"></a><span class="lineno"> 5192</span>&#160;<span class="comment">allocation. Number of elements that can be allocated is not bounded because</span></div>
-<div class="line"><a name="l05193"></a><span class="lineno"> 5193</span>&#160;<span class="comment">allocator can create multiple blocks.</span></div>
-<div class="line"><a name="l05194"></a><span class="lineno"> 5194</span>&#160;<span class="comment">*/</span></div>
-<div class="line"><a name="l05195"></a><span class="lineno"> 5195</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt;</div>
-<div class="line"><a name="l05196"></a><span class="lineno"> 5196</span>&#160;<span class="keyword">class </span>VmaPoolAllocator</div>
-<div class="line"><a name="l05197"></a><span class="lineno"> 5197</span>&#160;{</div>
-<div class="line"><a name="l05198"></a><span class="lineno"> 5198</span>&#160;    VMA_CLASS_NO_COPY(VmaPoolAllocator)</div>
-<div class="line"><a name="l05199"></a><span class="lineno"> 5199</span>&#160;<span class="keyword">public</span>:</div>
-<div class="line"><a name="l05200"></a><span class="lineno"> 5200</span>&#160;    VmaPoolAllocator(<span class="keyword">const</span> VkAllocationCallbacks* pAllocationCallbacks, uint32_t firstBlockCapacity);</div>
-<div class="line"><a name="l05201"></a><span class="lineno"> 5201</span>&#160;    ~VmaPoolAllocator();</div>
-<div class="line"><a name="l05202"></a><span class="lineno"> 5202</span>&#160;    <span class="keyword">template</span>&lt;<span class="keyword">typename</span>... Types&gt; T* Alloc(Types... args);</div>
-<div class="line"><a name="l05203"></a><span class="lineno"> 5203</span>&#160;    <span class="keywordtype">void</span> Free(T* ptr);</div>
-<div class="line"><a name="l05204"></a><span class="lineno"> 5204</span>&#160; </div>
-<div class="line"><a name="l05205"></a><span class="lineno"> 5205</span>&#160;<span class="keyword">private</span>:</div>
-<div class="line"><a name="l05206"></a><span class="lineno"> 5206</span>&#160;    <span class="keyword">union </span>Item</div>
-<div class="line"><a name="l05207"></a><span class="lineno"> 5207</span>&#160;    {</div>
-<div class="line"><a name="l05208"></a><span class="lineno"> 5208</span>&#160;        uint32_t NextFreeIndex;</div>
-<div class="line"><a name="l05209"></a><span class="lineno"> 5209</span>&#160;        <span class="keyword">alignas</span>(T) <span class="keywordtype">char</span> Value[<span class="keyword">sizeof</span>(T)];</div>
-<div class="line"><a name="l05210"></a><span class="lineno"> 5210</span>&#160;    };</div>
-<div class="line"><a name="l05211"></a><span class="lineno"> 5211</span>&#160; </div>
-<div class="line"><a name="l05212"></a><span class="lineno"> 5212</span>&#160;    <span class="keyword">struct </span>ItemBlock</div>
-<div class="line"><a name="l05213"></a><span class="lineno"> 5213</span>&#160;    {</div>
-<div class="line"><a name="l05214"></a><span class="lineno"> 5214</span>&#160;        Item* pItems;</div>
-<div class="line"><a name="l05215"></a><span class="lineno"> 5215</span>&#160;        uint32_t Capacity;</div>
-<div class="line"><a name="l05216"></a><span class="lineno"> 5216</span>&#160;        uint32_t FirstFreeIndex;</div>
-<div class="line"><a name="l05217"></a><span class="lineno"> 5217</span>&#160;    };</div>
-<div class="line"><a name="l05218"></a><span class="lineno"> 5218</span>&#160;    </div>
-<div class="line"><a name="l05219"></a><span class="lineno"> 5219</span>&#160;    <span class="keyword">const</span> VkAllocationCallbacks* m_pAllocationCallbacks;</div>
-<div class="line"><a name="l05220"></a><span class="lineno"> 5220</span>&#160;    <span class="keyword">const</span> uint32_t m_FirstBlockCapacity;</div>
-<div class="line"><a name="l05221"></a><span class="lineno"> 5221</span>&#160;    VmaVector&lt; ItemBlock, VmaStlAllocator&lt;ItemBlock&gt; &gt; m_ItemBlocks;</div>
-<div class="line"><a name="l05222"></a><span class="lineno"> 5222</span>&#160; </div>
-<div class="line"><a name="l05223"></a><span class="lineno"> 5223</span>&#160;    ItemBlock&amp; CreateNewBlock();</div>
-<div class="line"><a name="l05224"></a><span class="lineno"> 5224</span>&#160;};</div>
-<div class="line"><a name="l05225"></a><span class="lineno"> 5225</span>&#160; </div>
-<div class="line"><a name="l05226"></a><span class="lineno"> 5226</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt;</div>
-<div class="line"><a name="l05227"></a><span class="lineno"> 5227</span>&#160;VmaPoolAllocator&lt;T&gt;::VmaPoolAllocator(<span class="keyword">const</span> VkAllocationCallbacks* pAllocationCallbacks, uint32_t firstBlockCapacity) :</div>
-<div class="line"><a name="l05228"></a><span class="lineno"> 5228</span>&#160;    m_pAllocationCallbacks(pAllocationCallbacks),</div>
-<div class="line"><a name="l05229"></a><span class="lineno"> 5229</span>&#160;    m_FirstBlockCapacity(firstBlockCapacity),</div>
-<div class="line"><a name="l05230"></a><span class="lineno"> 5230</span>&#160;    m_ItemBlocks(VmaStlAllocator&lt;ItemBlock&gt;(pAllocationCallbacks))</div>
-<div class="line"><a name="l05231"></a><span class="lineno"> 5231</span>&#160;{</div>
-<div class="line"><a name="l05232"></a><span class="lineno"> 5232</span>&#160;    VMA_ASSERT(m_FirstBlockCapacity &gt; 1);</div>
-<div class="line"><a name="l05233"></a><span class="lineno"> 5233</span>&#160;}</div>
-<div class="line"><a name="l05234"></a><span class="lineno"> 5234</span>&#160; </div>
-<div class="line"><a name="l05235"></a><span class="lineno"> 5235</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt;</div>
-<div class="line"><a name="l05236"></a><span class="lineno"> 5236</span>&#160;VmaPoolAllocator&lt;T&gt;::~VmaPoolAllocator()</div>
-<div class="line"><a name="l05237"></a><span class="lineno"> 5237</span>&#160;{</div>
-<div class="line"><a name="l05238"></a><span class="lineno"> 5238</span>&#160;    <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> i = m_ItemBlocks.size(); i--; )</div>
-<div class="line"><a name="l05239"></a><span class="lineno"> 5239</span>&#160;        vma_delete_array(m_pAllocationCallbacks, m_ItemBlocks[i].pItems, m_ItemBlocks[i].Capacity);</div>
-<div class="line"><a name="l05240"></a><span class="lineno"> 5240</span>&#160;    m_ItemBlocks.clear();</div>
-<div class="line"><a name="l05241"></a><span class="lineno"> 5241</span>&#160;}</div>
-<div class="line"><a name="l05242"></a><span class="lineno"> 5242</span>&#160; </div>
-<div class="line"><a name="l05243"></a><span class="lineno"> 5243</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt;</div>
-<div class="line"><a name="l05244"></a><span class="lineno"> 5244</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span>... Types&gt; T* VmaPoolAllocator&lt;T&gt;::Alloc(Types... args)</div>
-<div class="line"><a name="l05245"></a><span class="lineno"> 5245</span>&#160;{</div>
-<div class="line"><a name="l05246"></a><span class="lineno"> 5246</span>&#160;    <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> i = m_ItemBlocks.size(); i--; )</div>
-<div class="line"><a name="l05247"></a><span class="lineno"> 5247</span>&#160;    {</div>
-<div class="line"><a name="l05248"></a><span class="lineno"> 5248</span>&#160;        ItemBlock&amp; block = m_ItemBlocks[i];</div>
-<div class="line"><a name="l05249"></a><span class="lineno"> 5249</span>&#160;        <span class="comment">// This block has some free items: Use first one.</span></div>
-<div class="line"><a name="l05250"></a><span class="lineno"> 5250</span>&#160;        <span class="keywordflow">if</span>(block.FirstFreeIndex != UINT32_MAX)</div>
-<div class="line"><a name="l05251"></a><span class="lineno"> 5251</span>&#160;        {</div>
-<div class="line"><a name="l05252"></a><span class="lineno"> 5252</span>&#160;            Item* <span class="keyword">const</span> pItem = &amp;block.pItems[block.FirstFreeIndex];</div>
-<div class="line"><a name="l05253"></a><span class="lineno"> 5253</span>&#160;            block.FirstFreeIndex = pItem-&gt;NextFreeIndex;</div>
-<div class="line"><a name="l05254"></a><span class="lineno"> 5254</span>&#160;            T* result = (T*)&amp;pItem-&gt;Value;</div>
-<div class="line"><a name="l05255"></a><span class="lineno"> 5255</span>&#160;            <span class="keyword">new</span>(result)T(std::forward&lt;Types&gt;(args)...); <span class="comment">// Explicit constructor call.</span></div>
-<div class="line"><a name="l05256"></a><span class="lineno"> 5256</span>&#160;            <span class="keywordflow">return</span> result;</div>
-<div class="line"><a name="l05257"></a><span class="lineno"> 5257</span>&#160;        }</div>
-<div class="line"><a name="l05258"></a><span class="lineno"> 5258</span>&#160;    }</div>
-<div class="line"><a name="l05259"></a><span class="lineno"> 5259</span>&#160; </div>
-<div class="line"><a name="l05260"></a><span class="lineno"> 5260</span>&#160;    <span class="comment">// No block has free item: Create new one and use it.</span></div>
-<div class="line"><a name="l05261"></a><span class="lineno"> 5261</span>&#160;    ItemBlock&amp; newBlock = CreateNewBlock();</div>
-<div class="line"><a name="l05262"></a><span class="lineno"> 5262</span>&#160;    Item* <span class="keyword">const</span> pItem = &amp;newBlock.pItems[0];</div>
-<div class="line"><a name="l05263"></a><span class="lineno"> 5263</span>&#160;    newBlock.FirstFreeIndex = pItem-&gt;NextFreeIndex;</div>
-<div class="line"><a name="l05264"></a><span class="lineno"> 5264</span>&#160;    T* result = (T*)&amp;pItem-&gt;Value;</div>
-<div class="line"><a name="l05265"></a><span class="lineno"> 5265</span>&#160;    <span class="keyword">new</span>(result)T(std::forward&lt;Types&gt;(args)...); <span class="comment">// Explicit constructor call.</span></div>
-<div class="line"><a name="l05266"></a><span class="lineno"> 5266</span>&#160;    <span class="keywordflow">return</span> result;</div>
-<div class="line"><a name="l05267"></a><span class="lineno"> 5267</span>&#160;}</div>
-<div class="line"><a name="l05268"></a><span class="lineno"> 5268</span>&#160; </div>
-<div class="line"><a name="l05269"></a><span class="lineno"> 5269</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt;</div>
-<div class="line"><a name="l05270"></a><span class="lineno"> 5270</span>&#160;<span class="keywordtype">void</span> VmaPoolAllocator&lt;T&gt;::Free(T* ptr)</div>
-<div class="line"><a name="l05271"></a><span class="lineno"> 5271</span>&#160;{</div>
-<div class="line"><a name="l05272"></a><span class="lineno"> 5272</span>&#160;    <span class="comment">// Search all memory blocks to find ptr.</span></div>
-<div class="line"><a name="l05273"></a><span class="lineno"> 5273</span>&#160;    <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> i = m_ItemBlocks.size(); i--; )</div>
+<div class="line"><a name="l05187"></a><span class="lineno"> 5187</span>&#160;    <span class="keywordtype">void</span> push_front(<span class="keyword">const</span> T&amp; src)</div>
+<div class="line"><a name="l05188"></a><span class="lineno"> 5188</span>&#160;    {</div>
+<div class="line"><a name="l05189"></a><span class="lineno"> 5189</span>&#160;        insert(0, src);</div>
+<div class="line"><a name="l05190"></a><span class="lineno"> 5190</span>&#160;    }</div>
+<div class="line"><a name="l05191"></a><span class="lineno"> 5191</span>&#160; </div>
+<div class="line"><a name="l05192"></a><span class="lineno"> 5192</span>&#160;    <span class="keywordtype">void</span> pop_front()</div>
+<div class="line"><a name="l05193"></a><span class="lineno"> 5193</span>&#160;    {</div>
+<div class="line"><a name="l05194"></a><span class="lineno"> 5194</span>&#160;        VMA_HEAVY_ASSERT(m_Count &gt; 0);</div>
+<div class="line"><a name="l05195"></a><span class="lineno"> 5195</span>&#160;        remove(0);</div>
+<div class="line"><a name="l05196"></a><span class="lineno"> 5196</span>&#160;    }</div>
+<div class="line"><a name="l05197"></a><span class="lineno"> 5197</span>&#160; </div>
+<div class="line"><a name="l05198"></a><span class="lineno"> 5198</span>&#160;    <span class="keyword">typedef</span> T* iterator;</div>
+<div class="line"><a name="l05199"></a><span class="lineno"> 5199</span>&#160; </div>
+<div class="line"><a name="l05200"></a><span class="lineno"> 5200</span>&#160;    iterator begin() { <span class="keywordflow">return</span> m_pArray; }</div>
+<div class="line"><a name="l05201"></a><span class="lineno"> 5201</span>&#160;    iterator end() { <span class="keywordflow">return</span> m_pArray + m_Count; }</div>
+<div class="line"><a name="l05202"></a><span class="lineno"> 5202</span>&#160; </div>
+<div class="line"><a name="l05203"></a><span class="lineno"> 5203</span>&#160;<span class="keyword">private</span>:</div>
+<div class="line"><a name="l05204"></a><span class="lineno"> 5204</span>&#160;    AllocatorT m_Allocator;</div>
+<div class="line"><a name="l05205"></a><span class="lineno"> 5205</span>&#160;    T* m_pArray;</div>
+<div class="line"><a name="l05206"></a><span class="lineno"> 5206</span>&#160;    <span class="keywordtype">size_t</span> m_Count;</div>
+<div class="line"><a name="l05207"></a><span class="lineno"> 5207</span>&#160;    <span class="keywordtype">size_t</span> m_Capacity;</div>
+<div class="line"><a name="l05208"></a><span class="lineno"> 5208</span>&#160;};</div>
+<div class="line"><a name="l05209"></a><span class="lineno"> 5209</span>&#160; </div>
+<div class="line"><a name="l05210"></a><span class="lineno"> 5210</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> T, <span class="keyword">typename</span> allocatorT&gt;</div>
+<div class="line"><a name="l05211"></a><span class="lineno"> 5211</span>&#160;<span class="keyword">static</span> <span class="keywordtype">void</span> VmaVectorInsert(VmaVector&lt;T, allocatorT&gt;&amp; vec, <span class="keywordtype">size_t</span> index, <span class="keyword">const</span> T&amp; item)</div>
+<div class="line"><a name="l05212"></a><span class="lineno"> 5212</span>&#160;{</div>
+<div class="line"><a name="l05213"></a><span class="lineno"> 5213</span>&#160;    vec.insert(index, item);</div>
+<div class="line"><a name="l05214"></a><span class="lineno"> 5214</span>&#160;}</div>
+<div class="line"><a name="l05215"></a><span class="lineno"> 5215</span>&#160; </div>
+<div class="line"><a name="l05216"></a><span class="lineno"> 5216</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> T, <span class="keyword">typename</span> allocatorT&gt;</div>
+<div class="line"><a name="l05217"></a><span class="lineno"> 5217</span>&#160;<span class="keyword">static</span> <span class="keywordtype">void</span> VmaVectorRemove(VmaVector&lt;T, allocatorT&gt;&amp; vec, <span class="keywordtype">size_t</span> index)</div>
+<div class="line"><a name="l05218"></a><span class="lineno"> 5218</span>&#160;{</div>
+<div class="line"><a name="l05219"></a><span class="lineno"> 5219</span>&#160;    vec.remove(index);</div>
+<div class="line"><a name="l05220"></a><span class="lineno"> 5220</span>&#160;}</div>
+<div class="line"><a name="l05221"></a><span class="lineno"> 5221</span>&#160; </div>
+<div class="line"><a name="l05222"></a><span class="lineno"> 5222</span>&#160;<span class="preprocessor">#endif </span><span class="comment">// #if VMA_USE_STL_VECTOR</span></div>
+<div class="line"><a name="l05223"></a><span class="lineno"> 5223</span>&#160; </div>
+<div class="line"><a name="l05224"></a><span class="lineno"> 5224</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> CmpLess, <span class="keyword">typename</span> VectorT&gt;</div>
+<div class="line"><a name="l05225"></a><span class="lineno"> 5225</span>&#160;<span class="keywordtype">size_t</span> VmaVectorInsertSorted(VectorT&amp; vector, <span class="keyword">const</span> <span class="keyword">typename</span> VectorT::value_type&amp; value)</div>
+<div class="line"><a name="l05226"></a><span class="lineno"> 5226</span>&#160;{</div>
+<div class="line"><a name="l05227"></a><span class="lineno"> 5227</span>&#160;    <span class="keyword">const</span> <span class="keywordtype">size_t</span> indexToInsert = VmaBinaryFindFirstNotLess(</div>
+<div class="line"><a name="l05228"></a><span class="lineno"> 5228</span>&#160;        vector.data(),</div>
+<div class="line"><a name="l05229"></a><span class="lineno"> 5229</span>&#160;        vector.data() + vector.size(),</div>
+<div class="line"><a name="l05230"></a><span class="lineno"> 5230</span>&#160;        value,</div>
+<div class="line"><a name="l05231"></a><span class="lineno"> 5231</span>&#160;        CmpLess()) - vector.data();</div>
+<div class="line"><a name="l05232"></a><span class="lineno"> 5232</span>&#160;    VmaVectorInsert(vector, indexToInsert, value);</div>
+<div class="line"><a name="l05233"></a><span class="lineno"> 5233</span>&#160;    <span class="keywordflow">return</span> indexToInsert;</div>
+<div class="line"><a name="l05234"></a><span class="lineno"> 5234</span>&#160;}</div>
+<div class="line"><a name="l05235"></a><span class="lineno"> 5235</span>&#160; </div>
+<div class="line"><a name="l05236"></a><span class="lineno"> 5236</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> CmpLess, <span class="keyword">typename</span> VectorT&gt;</div>
+<div class="line"><a name="l05237"></a><span class="lineno"> 5237</span>&#160;<span class="keywordtype">bool</span> VmaVectorRemoveSorted(VectorT&amp; vector, <span class="keyword">const</span> <span class="keyword">typename</span> VectorT::value_type&amp; value)</div>
+<div class="line"><a name="l05238"></a><span class="lineno"> 5238</span>&#160;{</div>
+<div class="line"><a name="l05239"></a><span class="lineno"> 5239</span>&#160;    CmpLess comparator;</div>
+<div class="line"><a name="l05240"></a><span class="lineno"> 5240</span>&#160;    <span class="keyword">typename</span> VectorT::iterator it = VmaBinaryFindFirstNotLess(</div>
+<div class="line"><a name="l05241"></a><span class="lineno"> 5241</span>&#160;        vector.begin(),</div>
+<div class="line"><a name="l05242"></a><span class="lineno"> 5242</span>&#160;        vector.end(),</div>
+<div class="line"><a name="l05243"></a><span class="lineno"> 5243</span>&#160;        value,</div>
+<div class="line"><a name="l05244"></a><span class="lineno"> 5244</span>&#160;        comparator);</div>
+<div class="line"><a name="l05245"></a><span class="lineno"> 5245</span>&#160;    <span class="keywordflow">if</span>((it != vector.end()) &amp;&amp; !comparator(*it, value) &amp;&amp; !comparator(value, *it))</div>
+<div class="line"><a name="l05246"></a><span class="lineno"> 5246</span>&#160;    {</div>
+<div class="line"><a name="l05247"></a><span class="lineno"> 5247</span>&#160;        <span class="keywordtype">size_t</span> indexToRemove = it - vector.begin();</div>
+<div class="line"><a name="l05248"></a><span class="lineno"> 5248</span>&#160;        VmaVectorRemove(vector, indexToRemove);</div>
+<div class="line"><a name="l05249"></a><span class="lineno"> 5249</span>&#160;        <span class="keywordflow">return</span> <span class="keyword">true</span>;</div>
+<div class="line"><a name="l05250"></a><span class="lineno"> 5250</span>&#160;    }</div>
+<div class="line"><a name="l05251"></a><span class="lineno"> 5251</span>&#160;    <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
+<div class="line"><a name="l05252"></a><span class="lineno"> 5252</span>&#160;}</div>
+<div class="line"><a name="l05253"></a><span class="lineno"> 5253</span>&#160; </div>
+<div class="line"><a name="l05255"></a><span class="lineno"> 5255</span>&#160;<span class="comment">// class VmaSmallVector</span></div>
+<div class="line"><a name="l05256"></a><span class="lineno"> 5256</span>&#160; </div>
+<div class="line"><a name="l05257"></a><span class="lineno"> 5257</span>&#160;<span class="comment">/*</span></div>
+<div class="line"><a name="l05258"></a><span class="lineno"> 5258</span>&#160;<span class="comment">This is a vector (a variable-sized array), optimized for the case when the array is small.</span></div>
+<div class="line"><a name="l05259"></a><span class="lineno"> 5259</span>&#160;<span class="comment"></span> </div>
+<div class="line"><a name="l05260"></a><span class="lineno"> 5260</span>&#160;<span class="comment">It contains some number of elements in-place, which allows it to avoid heap allocation</span></div>
+<div class="line"><a name="l05261"></a><span class="lineno"> 5261</span>&#160;<span class="comment">when the actual number of elements is below that threshold. This allows normal &quot;small&quot;</span></div>
+<div class="line"><a name="l05262"></a><span class="lineno"> 5262</span>&#160;<span class="comment">cases to be fast without losing generality for large inputs.</span></div>
+<div class="line"><a name="l05263"></a><span class="lineno"> 5263</span>&#160;<span class="comment">*/</span></div>
+<div class="line"><a name="l05264"></a><span class="lineno"> 5264</span>&#160; </div>
+<div class="line"><a name="l05265"></a><span class="lineno"> 5265</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> T, <span class="keyword">typename</span> AllocatorT, <span class="keywordtype">size_t</span> N&gt;</div>
+<div class="line"><a name="l05266"></a><span class="lineno"> 5266</span>&#160;<span class="keyword">class </span>VmaSmallVector</div>
+<div class="line"><a name="l05267"></a><span class="lineno"> 5267</span>&#160;{</div>
+<div class="line"><a name="l05268"></a><span class="lineno"> 5268</span>&#160;<span class="keyword">public</span>:</div>
+<div class="line"><a name="l05269"></a><span class="lineno"> 5269</span>&#160;    <span class="keyword">typedef</span> T value_type;</div>
+<div class="line"><a name="l05270"></a><span class="lineno"> 5270</span>&#160; </div>
+<div class="line"><a name="l05271"></a><span class="lineno"> 5271</span>&#160;    VmaSmallVector(<span class="keyword">const</span> AllocatorT&amp; allocator) :</div>
+<div class="line"><a name="l05272"></a><span class="lineno"> 5272</span>&#160;        m_Count(0),</div>
+<div class="line"><a name="l05273"></a><span class="lineno"> 5273</span>&#160;        m_DynamicArray(allocator)</div>
 <div class="line"><a name="l05274"></a><span class="lineno"> 5274</span>&#160;    {</div>
-<div class="line"><a name="l05275"></a><span class="lineno"> 5275</span>&#160;        ItemBlock&amp; block = m_ItemBlocks[i];</div>
-<div class="line"><a name="l05276"></a><span class="lineno"> 5276</span>&#160;        </div>
-<div class="line"><a name="l05277"></a><span class="lineno"> 5277</span>&#160;        <span class="comment">// Casting to union.</span></div>
-<div class="line"><a name="l05278"></a><span class="lineno"> 5278</span>&#160;        Item* pItemPtr;</div>
-<div class="line"><a name="l05279"></a><span class="lineno"> 5279</span>&#160;        memcpy(&amp;pItemPtr, &amp;ptr, <span class="keyword">sizeof</span>(pItemPtr));</div>
-<div class="line"><a name="l05280"></a><span class="lineno"> 5280</span>&#160;        </div>
-<div class="line"><a name="l05281"></a><span class="lineno"> 5281</span>&#160;        <span class="comment">// Check if pItemPtr is in address range of this block.</span></div>
-<div class="line"><a name="l05282"></a><span class="lineno"> 5282</span>&#160;        <span class="keywordflow">if</span>((pItemPtr &gt;= block.pItems) &amp;&amp; (pItemPtr &lt; block.pItems + block.Capacity))</div>
-<div class="line"><a name="l05283"></a><span class="lineno"> 5283</span>&#160;        {</div>
-<div class="line"><a name="l05284"></a><span class="lineno"> 5284</span>&#160;            ptr-&gt;~T(); <span class="comment">// Explicit destructor call.</span></div>
-<div class="line"><a name="l05285"></a><span class="lineno"> 5285</span>&#160;            <span class="keyword">const</span> uint32_t index = <span class="keyword">static_cast&lt;</span>uint32_t<span class="keyword">&gt;</span>(pItemPtr - block.pItems);</div>
-<div class="line"><a name="l05286"></a><span class="lineno"> 5286</span>&#160;            pItemPtr-&gt;NextFreeIndex = block.FirstFreeIndex;</div>
-<div class="line"><a name="l05287"></a><span class="lineno"> 5287</span>&#160;            block.FirstFreeIndex = index;</div>
-<div class="line"><a name="l05288"></a><span class="lineno"> 5288</span>&#160;            <span class="keywordflow">return</span>;</div>
-<div class="line"><a name="l05289"></a><span class="lineno"> 5289</span>&#160;        }</div>
-<div class="line"><a name="l05290"></a><span class="lineno"> 5290</span>&#160;    }</div>
-<div class="line"><a name="l05291"></a><span class="lineno"> 5291</span>&#160;    VMA_ASSERT(0 &amp;&amp; <span class="stringliteral">&quot;Pointer doesn&#39;t belong to this memory pool.&quot;</span>);</div>
-<div class="line"><a name="l05292"></a><span class="lineno"> 5292</span>&#160;}</div>
-<div class="line"><a name="l05293"></a><span class="lineno"> 5293</span>&#160; </div>
-<div class="line"><a name="l05294"></a><span class="lineno"> 5294</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt;</div>
-<div class="line"><a name="l05295"></a><span class="lineno"> 5295</span>&#160;<span class="keyword">typename</span> VmaPoolAllocator&lt;T&gt;::ItemBlock&amp; VmaPoolAllocator&lt;T&gt;::CreateNewBlock()</div>
-<div class="line"><a name="l05296"></a><span class="lineno"> 5296</span>&#160;{</div>
-<div class="line"><a name="l05297"></a><span class="lineno"> 5297</span>&#160;    <span class="keyword">const</span> uint32_t newBlockCapacity = m_ItemBlocks.empty() ?</div>
-<div class="line"><a name="l05298"></a><span class="lineno"> 5298</span>&#160;        m_FirstBlockCapacity : m_ItemBlocks.back().Capacity * 3 / 2;</div>
-<div class="line"><a name="l05299"></a><span class="lineno"> 5299</span>&#160; </div>
-<div class="line"><a name="l05300"></a><span class="lineno"> 5300</span>&#160;    <span class="keyword">const</span> ItemBlock newBlock = {</div>
-<div class="line"><a name="l05301"></a><span class="lineno"> 5301</span>&#160;        vma_new_array(m_pAllocationCallbacks, Item, newBlockCapacity),</div>
-<div class="line"><a name="l05302"></a><span class="lineno"> 5302</span>&#160;        newBlockCapacity,</div>
-<div class="line"><a name="l05303"></a><span class="lineno"> 5303</span>&#160;        0 };</div>
-<div class="line"><a name="l05304"></a><span class="lineno"> 5304</span>&#160; </div>
-<div class="line"><a name="l05305"></a><span class="lineno"> 5305</span>&#160;    m_ItemBlocks.push_back(newBlock);</div>
-<div class="line"><a name="l05306"></a><span class="lineno"> 5306</span>&#160; </div>
-<div class="line"><a name="l05307"></a><span class="lineno"> 5307</span>&#160;    <span class="comment">// Setup singly-linked list of all free items in this block.</span></div>
-<div class="line"><a name="l05308"></a><span class="lineno"> 5308</span>&#160;    <span class="keywordflow">for</span>(uint32_t i = 0; i &lt; newBlockCapacity - 1; ++i)</div>
-<div class="line"><a name="l05309"></a><span class="lineno"> 5309</span>&#160;        newBlock.pItems[i].NextFreeIndex = i + 1;</div>
-<div class="line"><a name="l05310"></a><span class="lineno"> 5310</span>&#160;    newBlock.pItems[newBlockCapacity - 1].NextFreeIndex = UINT32_MAX;</div>
-<div class="line"><a name="l05311"></a><span class="lineno"> 5311</span>&#160;    <span class="keywordflow">return</span> m_ItemBlocks.back();</div>
-<div class="line"><a name="l05312"></a><span class="lineno"> 5312</span>&#160;}</div>
-<div class="line"><a name="l05313"></a><span class="lineno"> 5313</span>&#160; </div>
-<div class="line"><a name="l05315"></a><span class="lineno"> 5315</span>&#160;<span class="comment">// class VmaRawList, VmaList</span></div>
-<div class="line"><a name="l05316"></a><span class="lineno"> 5316</span>&#160; </div>
-<div class="line"><a name="l05317"></a><span class="lineno"> 5317</span>&#160;<span class="preprocessor">#if VMA_USE_STL_LIST</span></div>
-<div class="line"><a name="l05318"></a><span class="lineno"> 5318</span>&#160; </div>
-<div class="line"><a name="l05319"></a><span class="lineno"> 5319</span>&#160;<span class="preprocessor">#define VmaList std::list</span></div>
-<div class="line"><a name="l05320"></a><span class="lineno"> 5320</span>&#160; </div>
-<div class="line"><a name="l05321"></a><span class="lineno"> 5321</span>&#160;<span class="preprocessor">#else // #if VMA_USE_STL_LIST</span></div>
+<div class="line"><a name="l05275"></a><span class="lineno"> 5275</span>&#160;    }</div>
+<div class="line"><a name="l05276"></a><span class="lineno"> 5276</span>&#160;    VmaSmallVector(<span class="keywordtype">size_t</span> count, <span class="keyword">const</span> AllocatorT&amp; allocator) :</div>
+<div class="line"><a name="l05277"></a><span class="lineno"> 5277</span>&#160;        m_Count(count),</div>
+<div class="line"><a name="l05278"></a><span class="lineno"> 5278</span>&#160;        m_DynamicArray(count &gt; N ? count : 0, allocator)</div>
+<div class="line"><a name="l05279"></a><span class="lineno"> 5279</span>&#160;    {</div>
+<div class="line"><a name="l05280"></a><span class="lineno"> 5280</span>&#160;    }</div>
+<div class="line"><a name="l05281"></a><span class="lineno"> 5281</span>&#160;    <span class="keyword">template</span>&lt;<span class="keyword">typename</span> SrcT, <span class="keyword">typename</span> SrcAllocatorT, <span class="keywordtype">size_t</span> SrcN&gt;</div>
+<div class="line"><a name="l05282"></a><span class="lineno"> 5282</span>&#160;    VmaSmallVector(<span class="keyword">const</span> VmaSmallVector&lt;SrcT, SrcAllocatorT, SrcN&gt;&amp; src) = <span class="keyword">delete</span>;</div>
+<div class="line"><a name="l05283"></a><span class="lineno"> 5283</span>&#160;    <span class="keyword">template</span>&lt;<span class="keyword">typename</span> SrcT, <span class="keyword">typename</span> SrcAllocatorT, <span class="keywordtype">size_t</span> SrcN&gt;</div>
+<div class="line"><a name="l05284"></a><span class="lineno"> 5284</span>&#160;    VmaSmallVector&lt;T, AllocatorT, N&gt;&amp; operator=(<span class="keyword">const</span> VmaSmallVector&lt;SrcT, SrcAllocatorT, SrcN&gt;&amp; rhs) = <span class="keyword">delete</span>;</div>
+<div class="line"><a name="l05285"></a><span class="lineno"> 5285</span>&#160; </div>
+<div class="line"><a name="l05286"></a><span class="lineno"> 5286</span>&#160;    <span class="keywordtype">bool</span> empty()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_Count == 0; }</div>
+<div class="line"><a name="l05287"></a><span class="lineno"> 5287</span>&#160;    <span class="keywordtype">size_t</span> size()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_Count; }</div>
+<div class="line"><a name="l05288"></a><span class="lineno"> 5288</span>&#160;    T* data() { <span class="keywordflow">return</span> m_Count &gt; N ? m_DynamicArray.data() : m_StaticArray; }</div>
+<div class="line"><a name="l05289"></a><span class="lineno"> 5289</span>&#160;    <span class="keyword">const</span> T* data()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_Count &gt; N ? m_DynamicArray.data() : m_StaticArray; }</div>
+<div class="line"><a name="l05290"></a><span class="lineno"> 5290</span>&#160; </div>
+<div class="line"><a name="l05291"></a><span class="lineno"> 5291</span>&#160;    T&amp; operator[](<span class="keywordtype">size_t</span> index)</div>
+<div class="line"><a name="l05292"></a><span class="lineno"> 5292</span>&#160;    {</div>
+<div class="line"><a name="l05293"></a><span class="lineno"> 5293</span>&#160;        VMA_HEAVY_ASSERT(index &lt; m_Count);</div>
+<div class="line"><a name="l05294"></a><span class="lineno"> 5294</span>&#160;        <span class="keywordflow">return</span> data()[index];</div>
+<div class="line"><a name="l05295"></a><span class="lineno"> 5295</span>&#160;    }</div>
+<div class="line"><a name="l05296"></a><span class="lineno"> 5296</span>&#160;    <span class="keyword">const</span> T&amp; operator[](<span class="keywordtype">size_t</span> index)<span class="keyword"> const</span></div>
+<div class="line"><a name="l05297"></a><span class="lineno"> 5297</span>&#160;<span class="keyword">    </span>{</div>
+<div class="line"><a name="l05298"></a><span class="lineno"> 5298</span>&#160;        VMA_HEAVY_ASSERT(index &lt; m_Count);</div>
+<div class="line"><a name="l05299"></a><span class="lineno"> 5299</span>&#160;        <span class="keywordflow">return</span> data()[index];</div>
+<div class="line"><a name="l05300"></a><span class="lineno"> 5300</span>&#160;    }</div>
+<div class="line"><a name="l05301"></a><span class="lineno"> 5301</span>&#160; </div>
+<div class="line"><a name="l05302"></a><span class="lineno"> 5302</span>&#160;    T&amp; front()</div>
+<div class="line"><a name="l05303"></a><span class="lineno"> 5303</span>&#160;    {</div>
+<div class="line"><a name="l05304"></a><span class="lineno"> 5304</span>&#160;        VMA_HEAVY_ASSERT(m_Count &gt; 0);</div>
+<div class="line"><a name="l05305"></a><span class="lineno"> 5305</span>&#160;        <span class="keywordflow">return</span> data()[0];</div>
+<div class="line"><a name="l05306"></a><span class="lineno"> 5306</span>&#160;    }</div>
+<div class="line"><a name="l05307"></a><span class="lineno"> 5307</span>&#160;    <span class="keyword">const</span> T&amp; front()<span class="keyword"> const</span></div>
+<div class="line"><a name="l05308"></a><span class="lineno"> 5308</span>&#160;<span class="keyword">    </span>{</div>
+<div class="line"><a name="l05309"></a><span class="lineno"> 5309</span>&#160;        VMA_HEAVY_ASSERT(m_Count &gt; 0);</div>
+<div class="line"><a name="l05310"></a><span class="lineno"> 5310</span>&#160;        <span class="keywordflow">return</span> data()[0];</div>
+<div class="line"><a name="l05311"></a><span class="lineno"> 5311</span>&#160;    }</div>
+<div class="line"><a name="l05312"></a><span class="lineno"> 5312</span>&#160;    T&amp; back()</div>
+<div class="line"><a name="l05313"></a><span class="lineno"> 5313</span>&#160;    {</div>
+<div class="line"><a name="l05314"></a><span class="lineno"> 5314</span>&#160;        VMA_HEAVY_ASSERT(m_Count &gt; 0);</div>
+<div class="line"><a name="l05315"></a><span class="lineno"> 5315</span>&#160;        <span class="keywordflow">return</span> data()[m_Count - 1];</div>
+<div class="line"><a name="l05316"></a><span class="lineno"> 5316</span>&#160;    }</div>
+<div class="line"><a name="l05317"></a><span class="lineno"> 5317</span>&#160;    <span class="keyword">const</span> T&amp; back()<span class="keyword"> const</span></div>
+<div class="line"><a name="l05318"></a><span class="lineno"> 5318</span>&#160;<span class="keyword">    </span>{</div>
+<div class="line"><a name="l05319"></a><span class="lineno"> 5319</span>&#160;        VMA_HEAVY_ASSERT(m_Count &gt; 0);</div>
+<div class="line"><a name="l05320"></a><span class="lineno"> 5320</span>&#160;        <span class="keywordflow">return</span> data()[m_Count - 1];</div>
+<div class="line"><a name="l05321"></a><span class="lineno"> 5321</span>&#160;    }</div>
 <div class="line"><a name="l05322"></a><span class="lineno"> 5322</span>&#160; </div>
-<div class="line"><a name="l05323"></a><span class="lineno"> 5323</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt;</div>
-<div class="line"><a name="l05324"></a><span class="lineno"> 5324</span>&#160;<span class="keyword">struct </span>VmaListItem</div>
-<div class="line"><a name="l05325"></a><span class="lineno"> 5325</span>&#160;{</div>
-<div class="line"><a name="l05326"></a><span class="lineno"> 5326</span>&#160;    VmaListItem* pPrev;</div>
-<div class="line"><a name="l05327"></a><span class="lineno"> 5327</span>&#160;    VmaListItem* pNext;</div>
-<div class="line"><a name="l05328"></a><span class="lineno"> 5328</span>&#160;    T Value;</div>
-<div class="line"><a name="l05329"></a><span class="lineno"> 5329</span>&#160;};</div>
-<div class="line"><a name="l05330"></a><span class="lineno"> 5330</span>&#160; </div>
-<div class="line"><a name="l05331"></a><span class="lineno"> 5331</span>&#160;<span class="comment">// Doubly linked list.</span></div>
-<div class="line"><a name="l05332"></a><span class="lineno"> 5332</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt;</div>
-<div class="line"><a name="l05333"></a><span class="lineno"> 5333</span>&#160;<span class="keyword">class </span>VmaRawList</div>
-<div class="line"><a name="l05334"></a><span class="lineno"> 5334</span>&#160;{</div>
-<div class="line"><a name="l05335"></a><span class="lineno"> 5335</span>&#160;    VMA_CLASS_NO_COPY(VmaRawList)</div>
-<div class="line"><a name="l05336"></a><span class="lineno"> 5336</span>&#160;<span class="keyword">public</span>:</div>
-<div class="line"><a name="l05337"></a><span class="lineno"> 5337</span>&#160;    <span class="keyword">typedef</span> VmaListItem&lt;T&gt; ItemType;</div>
-<div class="line"><a name="l05338"></a><span class="lineno"> 5338</span>&#160; </div>
-<div class="line"><a name="l05339"></a><span class="lineno"> 5339</span>&#160;    VmaRawList(<span class="keyword">const</span> VkAllocationCallbacks* pAllocationCallbacks);</div>
-<div class="line"><a name="l05340"></a><span class="lineno"> 5340</span>&#160;    ~VmaRawList();</div>
-<div class="line"><a name="l05341"></a><span class="lineno"> 5341</span>&#160;    <span class="keywordtype">void</span> Clear();</div>
-<div class="line"><a name="l05342"></a><span class="lineno"> 5342</span>&#160; </div>
-<div class="line"><a name="l05343"></a><span class="lineno"> 5343</span>&#160;    <span class="keywordtype">size_t</span> GetCount()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_Count; }</div>
-<div class="line"><a name="l05344"></a><span class="lineno"> 5344</span>&#160;    <span class="keywordtype">bool</span> IsEmpty()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_Count == 0; }</div>
-<div class="line"><a name="l05345"></a><span class="lineno"> 5345</span>&#160; </div>
-<div class="line"><a name="l05346"></a><span class="lineno"> 5346</span>&#160;    ItemType* Front() { <span class="keywordflow">return</span> m_pFront; }</div>
-<div class="line"><a name="l05347"></a><span class="lineno"> 5347</span>&#160;    <span class="keyword">const</span> ItemType* Front()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_pFront; }</div>
-<div class="line"><a name="l05348"></a><span class="lineno"> 5348</span>&#160;    ItemType* Back() { <span class="keywordflow">return</span> m_pBack; }</div>
-<div class="line"><a name="l05349"></a><span class="lineno"> 5349</span>&#160;    <span class="keyword">const</span> ItemType* Back()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_pBack; }</div>
-<div class="line"><a name="l05350"></a><span class="lineno"> 5350</span>&#160; </div>
-<div class="line"><a name="l05351"></a><span class="lineno"> 5351</span>&#160;    ItemType* PushBack();</div>
-<div class="line"><a name="l05352"></a><span class="lineno"> 5352</span>&#160;    ItemType* PushFront();</div>
-<div class="line"><a name="l05353"></a><span class="lineno"> 5353</span>&#160;    ItemType* PushBack(<span class="keyword">const</span> T&amp; value);</div>
-<div class="line"><a name="l05354"></a><span class="lineno"> 5354</span>&#160;    ItemType* PushFront(<span class="keyword">const</span> T&amp; value);</div>
-<div class="line"><a name="l05355"></a><span class="lineno"> 5355</span>&#160;    <span class="keywordtype">void</span> PopBack();</div>
-<div class="line"><a name="l05356"></a><span class="lineno"> 5356</span>&#160;    <span class="keywordtype">void</span> PopFront();</div>
-<div class="line"><a name="l05357"></a><span class="lineno"> 5357</span>&#160;    </div>
-<div class="line"><a name="l05358"></a><span class="lineno"> 5358</span>&#160;    <span class="comment">// Item can be null - it means PushBack.</span></div>
-<div class="line"><a name="l05359"></a><span class="lineno"> 5359</span>&#160;    ItemType* InsertBefore(ItemType* pItem);</div>
-<div class="line"><a name="l05360"></a><span class="lineno"> 5360</span>&#160;    <span class="comment">// Item can be null - it means PushFront.</span></div>
-<div class="line"><a name="l05361"></a><span class="lineno"> 5361</span>&#160;    ItemType* InsertAfter(ItemType* pItem);</div>
+<div class="line"><a name="l05323"></a><span class="lineno"> 5323</span>&#160;    <span class="keywordtype">void</span> resize(<span class="keywordtype">size_t</span> newCount, <span class="keywordtype">bool</span> freeMemory = <span class="keyword">false</span>)</div>
+<div class="line"><a name="l05324"></a><span class="lineno"> 5324</span>&#160;    {</div>
+<div class="line"><a name="l05325"></a><span class="lineno"> 5325</span>&#160;        <span class="keywordflow">if</span>(newCount &gt; N &amp;&amp; m_Count &gt; N)</div>
+<div class="line"><a name="l05326"></a><span class="lineno"> 5326</span>&#160;        {</div>
+<div class="line"><a name="l05327"></a><span class="lineno"> 5327</span>&#160;            <span class="comment">// Any direction, staying in m_DynamicArray</span></div>
+<div class="line"><a name="l05328"></a><span class="lineno"> 5328</span>&#160;            m_DynamicArray.resize(newCount);</div>
+<div class="line"><a name="l05329"></a><span class="lineno"> 5329</span>&#160;            <span class="keywordflow">if</span>(freeMemory)</div>
+<div class="line"><a name="l05330"></a><span class="lineno"> 5330</span>&#160;            {</div>
+<div class="line"><a name="l05331"></a><span class="lineno"> 5331</span>&#160;                m_DynamicArray.shrink_to_fit();</div>
+<div class="line"><a name="l05332"></a><span class="lineno"> 5332</span>&#160;            }</div>
+<div class="line"><a name="l05333"></a><span class="lineno"> 5333</span>&#160;        }</div>
+<div class="line"><a name="l05334"></a><span class="lineno"> 5334</span>&#160;        <span class="keywordflow">else</span> <span class="keywordflow">if</span>(newCount &gt; N &amp;&amp; m_Count &lt;= N)</div>
+<div class="line"><a name="l05335"></a><span class="lineno"> 5335</span>&#160;        {</div>
+<div class="line"><a name="l05336"></a><span class="lineno"> 5336</span>&#160;            <span class="comment">// Growing, moving from m_StaticArray to m_DynamicArray</span></div>
+<div class="line"><a name="l05337"></a><span class="lineno"> 5337</span>&#160;            m_DynamicArray.resize(newCount);</div>
+<div class="line"><a name="l05338"></a><span class="lineno"> 5338</span>&#160;            <span class="keywordflow">if</span>(m_Count &gt; 0)</div>
+<div class="line"><a name="l05339"></a><span class="lineno"> 5339</span>&#160;            {</div>
+<div class="line"><a name="l05340"></a><span class="lineno"> 5340</span>&#160;                memcpy(m_DynamicArray.data(), m_StaticArray, m_Count * <span class="keyword">sizeof</span>(T));</div>
+<div class="line"><a name="l05341"></a><span class="lineno"> 5341</span>&#160;            }</div>
+<div class="line"><a name="l05342"></a><span class="lineno"> 5342</span>&#160;        }</div>
+<div class="line"><a name="l05343"></a><span class="lineno"> 5343</span>&#160;        <span class="keywordflow">else</span> <span class="keywordflow">if</span>(newCount &lt;= N &amp;&amp; m_Count &gt; N)</div>
+<div class="line"><a name="l05344"></a><span class="lineno"> 5344</span>&#160;        {</div>
+<div class="line"><a name="l05345"></a><span class="lineno"> 5345</span>&#160;            <span class="comment">// Shrinking, moving from m_DynamicArray to m_StaticArray</span></div>
+<div class="line"><a name="l05346"></a><span class="lineno"> 5346</span>&#160;            <span class="keywordflow">if</span>(newCount &gt; 0)</div>
+<div class="line"><a name="l05347"></a><span class="lineno"> 5347</span>&#160;            {</div>
+<div class="line"><a name="l05348"></a><span class="lineno"> 5348</span>&#160;                memcpy(m_StaticArray, m_DynamicArray.data(), newCount * <span class="keyword">sizeof</span>(T));</div>
+<div class="line"><a name="l05349"></a><span class="lineno"> 5349</span>&#160;            }</div>
+<div class="line"><a name="l05350"></a><span class="lineno"> 5350</span>&#160;            m_DynamicArray.resize(0);</div>
+<div class="line"><a name="l05351"></a><span class="lineno"> 5351</span>&#160;            <span class="keywordflow">if</span>(freeMemory)</div>
+<div class="line"><a name="l05352"></a><span class="lineno"> 5352</span>&#160;            {</div>
+<div class="line"><a name="l05353"></a><span class="lineno"> 5353</span>&#160;                m_DynamicArray.shrink_to_fit();</div>
+<div class="line"><a name="l05354"></a><span class="lineno"> 5354</span>&#160;            }</div>
+<div class="line"><a name="l05355"></a><span class="lineno"> 5355</span>&#160;        }</div>
+<div class="line"><a name="l05356"></a><span class="lineno"> 5356</span>&#160;        <span class="keywordflow">else</span></div>
+<div class="line"><a name="l05357"></a><span class="lineno"> 5357</span>&#160;        {</div>
+<div class="line"><a name="l05358"></a><span class="lineno"> 5358</span>&#160;            <span class="comment">// Any direction, staying in m_StaticArray - nothing to do here</span></div>
+<div class="line"><a name="l05359"></a><span class="lineno"> 5359</span>&#160;        }</div>
+<div class="line"><a name="l05360"></a><span class="lineno"> 5360</span>&#160;        m_Count = newCount;</div>
+<div class="line"><a name="l05361"></a><span class="lineno"> 5361</span>&#160;    }</div>
 <div class="line"><a name="l05362"></a><span class="lineno"> 5362</span>&#160; </div>
-<div class="line"><a name="l05363"></a><span class="lineno"> 5363</span>&#160;    ItemType* InsertBefore(ItemType* pItem, <span class="keyword">const</span> T&amp; value);</div>
-<div class="line"><a name="l05364"></a><span class="lineno"> 5364</span>&#160;    ItemType* InsertAfter(ItemType* pItem, <span class="keyword">const</span> T&amp; value);</div>
-<div class="line"><a name="l05365"></a><span class="lineno"> 5365</span>&#160; </div>
-<div class="line"><a name="l05366"></a><span class="lineno"> 5366</span>&#160;    <span class="keywordtype">void</span> Remove(ItemType* pItem);</div>
-<div class="line"><a name="l05367"></a><span class="lineno"> 5367</span>&#160; </div>
-<div class="line"><a name="l05368"></a><span class="lineno"> 5368</span>&#160;<span class="keyword">private</span>:</div>
-<div class="line"><a name="l05369"></a><span class="lineno"> 5369</span>&#160;    <span class="keyword">const</span> VkAllocationCallbacks* <span class="keyword">const</span> m_pAllocationCallbacks;</div>
-<div class="line"><a name="l05370"></a><span class="lineno"> 5370</span>&#160;    VmaPoolAllocator&lt;ItemType&gt; m_ItemAllocator;</div>
-<div class="line"><a name="l05371"></a><span class="lineno"> 5371</span>&#160;    ItemType* m_pFront;</div>
-<div class="line"><a name="l05372"></a><span class="lineno"> 5372</span>&#160;    ItemType* m_pBack;</div>
-<div class="line"><a name="l05373"></a><span class="lineno"> 5373</span>&#160;    <span class="keywordtype">size_t</span> m_Count;</div>
-<div class="line"><a name="l05374"></a><span class="lineno"> 5374</span>&#160;};</div>
-<div class="line"><a name="l05375"></a><span class="lineno"> 5375</span>&#160; </div>
-<div class="line"><a name="l05376"></a><span class="lineno"> 5376</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt;</div>
-<div class="line"><a name="l05377"></a><span class="lineno"> 5377</span>&#160;VmaRawList&lt;T&gt;::VmaRawList(<span class="keyword">const</span> VkAllocationCallbacks* pAllocationCallbacks) :</div>
-<div class="line"><a name="l05378"></a><span class="lineno"> 5378</span>&#160;    m_pAllocationCallbacks(pAllocationCallbacks),</div>
-<div class="line"><a name="l05379"></a><span class="lineno"> 5379</span>&#160;    m_ItemAllocator(pAllocationCallbacks, 128),</div>
-<div class="line"><a name="l05380"></a><span class="lineno"> 5380</span>&#160;    m_pFront(VMA_NULL),</div>
-<div class="line"><a name="l05381"></a><span class="lineno"> 5381</span>&#160;    m_pBack(VMA_NULL),</div>
-<div class="line"><a name="l05382"></a><span class="lineno"> 5382</span>&#160;    m_Count(0)</div>
-<div class="line"><a name="l05383"></a><span class="lineno"> 5383</span>&#160;{</div>
-<div class="line"><a name="l05384"></a><span class="lineno"> 5384</span>&#160;}</div>
-<div class="line"><a name="l05385"></a><span class="lineno"> 5385</span>&#160; </div>
-<div class="line"><a name="l05386"></a><span class="lineno"> 5386</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt;</div>
-<div class="line"><a name="l05387"></a><span class="lineno"> 5387</span>&#160;VmaRawList&lt;T&gt;::~VmaRawList()</div>
-<div class="line"><a name="l05388"></a><span class="lineno"> 5388</span>&#160;{</div>
-<div class="line"><a name="l05389"></a><span class="lineno"> 5389</span>&#160;    <span class="comment">// Intentionally not calling Clear, because that would be unnecessary</span></div>
-<div class="line"><a name="l05390"></a><span class="lineno"> 5390</span>&#160;    <span class="comment">// computations to return all items to m_ItemAllocator as free.</span></div>
-<div class="line"><a name="l05391"></a><span class="lineno"> 5391</span>&#160;}</div>
-<div class="line"><a name="l05392"></a><span class="lineno"> 5392</span>&#160; </div>
-<div class="line"><a name="l05393"></a><span class="lineno"> 5393</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt;</div>
-<div class="line"><a name="l05394"></a><span class="lineno"> 5394</span>&#160;<span class="keywordtype">void</span> VmaRawList&lt;T&gt;::Clear()</div>
-<div class="line"><a name="l05395"></a><span class="lineno"> 5395</span>&#160;{</div>
-<div class="line"><a name="l05396"></a><span class="lineno"> 5396</span>&#160;    <span class="keywordflow">if</span>(IsEmpty() == <span class="keyword">false</span>)</div>
-<div class="line"><a name="l05397"></a><span class="lineno"> 5397</span>&#160;    {</div>
-<div class="line"><a name="l05398"></a><span class="lineno"> 5398</span>&#160;        ItemType* pItem = m_pBack;</div>
-<div class="line"><a name="l05399"></a><span class="lineno"> 5399</span>&#160;        <span class="keywordflow">while</span>(pItem != VMA_NULL)</div>
-<div class="line"><a name="l05400"></a><span class="lineno"> 5400</span>&#160;        {</div>
-<div class="line"><a name="l05401"></a><span class="lineno"> 5401</span>&#160;            ItemType* <span class="keyword">const</span> pPrevItem = pItem-&gt;pPrev;</div>
-<div class="line"><a name="l05402"></a><span class="lineno"> 5402</span>&#160;            m_ItemAllocator.Free(pItem);</div>
-<div class="line"><a name="l05403"></a><span class="lineno"> 5403</span>&#160;            pItem = pPrevItem;</div>
-<div class="line"><a name="l05404"></a><span class="lineno"> 5404</span>&#160;        }</div>
-<div class="line"><a name="l05405"></a><span class="lineno"> 5405</span>&#160;        m_pFront = VMA_NULL;</div>
-<div class="line"><a name="l05406"></a><span class="lineno"> 5406</span>&#160;        m_pBack = VMA_NULL;</div>
-<div class="line"><a name="l05407"></a><span class="lineno"> 5407</span>&#160;        m_Count = 0;</div>
-<div class="line"><a name="l05408"></a><span class="lineno"> 5408</span>&#160;    }</div>
-<div class="line"><a name="l05409"></a><span class="lineno"> 5409</span>&#160;}</div>
-<div class="line"><a name="l05410"></a><span class="lineno"> 5410</span>&#160; </div>
-<div class="line"><a name="l05411"></a><span class="lineno"> 5411</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt;</div>
-<div class="line"><a name="l05412"></a><span class="lineno"> 5412</span>&#160;VmaListItem&lt;T&gt;* VmaRawList&lt;T&gt;::PushBack()</div>
-<div class="line"><a name="l05413"></a><span class="lineno"> 5413</span>&#160;{</div>
-<div class="line"><a name="l05414"></a><span class="lineno"> 5414</span>&#160;    ItemType* <span class="keyword">const</span> pNewItem = m_ItemAllocator.Alloc();</div>
-<div class="line"><a name="l05415"></a><span class="lineno"> 5415</span>&#160;    pNewItem-&gt;pNext = VMA_NULL;</div>
-<div class="line"><a name="l05416"></a><span class="lineno"> 5416</span>&#160;    <span class="keywordflow">if</span>(IsEmpty())</div>
-<div class="line"><a name="l05417"></a><span class="lineno"> 5417</span>&#160;    {</div>
-<div class="line"><a name="l05418"></a><span class="lineno"> 5418</span>&#160;        pNewItem-&gt;pPrev = VMA_NULL;</div>
-<div class="line"><a name="l05419"></a><span class="lineno"> 5419</span>&#160;        m_pFront = pNewItem;</div>
-<div class="line"><a name="l05420"></a><span class="lineno"> 5420</span>&#160;        m_pBack = pNewItem;</div>
-<div class="line"><a name="l05421"></a><span class="lineno"> 5421</span>&#160;        m_Count = 1;</div>
+<div class="line"><a name="l05363"></a><span class="lineno"> 5363</span>&#160;    <span class="keywordtype">void</span> clear(<span class="keywordtype">bool</span> freeMemory = <span class="keyword">false</span>)</div>
+<div class="line"><a name="l05364"></a><span class="lineno"> 5364</span>&#160;    {</div>
+<div class="line"><a name="l05365"></a><span class="lineno"> 5365</span>&#160;        m_DynamicArray.clear();</div>
+<div class="line"><a name="l05366"></a><span class="lineno"> 5366</span>&#160;        <span class="keywordflow">if</span>(freeMemory)</div>
+<div class="line"><a name="l05367"></a><span class="lineno"> 5367</span>&#160;        {</div>
+<div class="line"><a name="l05368"></a><span class="lineno"> 5368</span>&#160;            m_DynamicArray.shrink_to_fit();</div>
+<div class="line"><a name="l05369"></a><span class="lineno"> 5369</span>&#160;        }</div>
+<div class="line"><a name="l05370"></a><span class="lineno"> 5370</span>&#160;        m_Count = 0;</div>
+<div class="line"><a name="l05371"></a><span class="lineno"> 5371</span>&#160;    }</div>
+<div class="line"><a name="l05372"></a><span class="lineno"> 5372</span>&#160; </div>
+<div class="line"><a name="l05373"></a><span class="lineno"> 5373</span>&#160;    <span class="keywordtype">void</span> insert(<span class="keywordtype">size_t</span> index, <span class="keyword">const</span> T&amp; src)</div>
+<div class="line"><a name="l05374"></a><span class="lineno"> 5374</span>&#160;    {</div>
+<div class="line"><a name="l05375"></a><span class="lineno"> 5375</span>&#160;        VMA_HEAVY_ASSERT(index &lt;= m_Count);</div>
+<div class="line"><a name="l05376"></a><span class="lineno"> 5376</span>&#160;        <span class="keyword">const</span> <span class="keywordtype">size_t</span> oldCount = size();</div>
+<div class="line"><a name="l05377"></a><span class="lineno"> 5377</span>&#160;        resize(oldCount + 1);</div>
+<div class="line"><a name="l05378"></a><span class="lineno"> 5378</span>&#160;        T* <span class="keyword">const</span> dataPtr = data();</div>
+<div class="line"><a name="l05379"></a><span class="lineno"> 5379</span>&#160;        <span class="keywordflow">if</span>(index &lt; oldCount)</div>
+<div class="line"><a name="l05380"></a><span class="lineno"> 5380</span>&#160;        {</div>
+<div class="line"><a name="l05381"></a><span class="lineno"> 5381</span>&#160;            <span class="comment">//  I know, this could be more optimal for case where memmove can be memcpy directly from m_StaticArray to m_DynamicArray.</span></div>
+<div class="line"><a name="l05382"></a><span class="lineno"> 5382</span>&#160;            memmove(dataPtr + (index + 1), dataPtr + index, (oldCount - index) * <span class="keyword">sizeof</span>(T));</div>
+<div class="line"><a name="l05383"></a><span class="lineno"> 5383</span>&#160;        }</div>
+<div class="line"><a name="l05384"></a><span class="lineno"> 5384</span>&#160;        dataPtr[index] = src;</div>
+<div class="line"><a name="l05385"></a><span class="lineno"> 5385</span>&#160;    }</div>
+<div class="line"><a name="l05386"></a><span class="lineno"> 5386</span>&#160; </div>
+<div class="line"><a name="l05387"></a><span class="lineno"> 5387</span>&#160;    <span class="keywordtype">void</span> remove(<span class="keywordtype">size_t</span> index)</div>
+<div class="line"><a name="l05388"></a><span class="lineno"> 5388</span>&#160;    {</div>
+<div class="line"><a name="l05389"></a><span class="lineno"> 5389</span>&#160;        VMA_HEAVY_ASSERT(index &lt; m_Count);</div>
+<div class="line"><a name="l05390"></a><span class="lineno"> 5390</span>&#160;        <span class="keyword">const</span> <span class="keywordtype">size_t</span> oldCount = size();</div>
+<div class="line"><a name="l05391"></a><span class="lineno"> 5391</span>&#160;        <span class="keywordflow">if</span>(index &lt; oldCount - 1)</div>
+<div class="line"><a name="l05392"></a><span class="lineno"> 5392</span>&#160;        {</div>
+<div class="line"><a name="l05393"></a><span class="lineno"> 5393</span>&#160;            <span class="comment">//  I know, this could be more optimal for case where memmove can be memcpy directly from m_DynamicArray to m_StaticArray.</span></div>
+<div class="line"><a name="l05394"></a><span class="lineno"> 5394</span>&#160;            T* <span class="keyword">const</span> dataPtr = data();</div>
+<div class="line"><a name="l05395"></a><span class="lineno"> 5395</span>&#160;            memmove(dataPtr + index, dataPtr + (index + 1), (oldCount - index - 1) * <span class="keyword">sizeof</span>(T));</div>
+<div class="line"><a name="l05396"></a><span class="lineno"> 5396</span>&#160;        }</div>
+<div class="line"><a name="l05397"></a><span class="lineno"> 5397</span>&#160;        resize(oldCount - 1);</div>
+<div class="line"><a name="l05398"></a><span class="lineno"> 5398</span>&#160;    }</div>
+<div class="line"><a name="l05399"></a><span class="lineno"> 5399</span>&#160; </div>
+<div class="line"><a name="l05400"></a><span class="lineno"> 5400</span>&#160;    <span class="keywordtype">void</span> push_back(<span class="keyword">const</span> T&amp; src)</div>
+<div class="line"><a name="l05401"></a><span class="lineno"> 5401</span>&#160;    {</div>
+<div class="line"><a name="l05402"></a><span class="lineno"> 5402</span>&#160;        <span class="keyword">const</span> <span class="keywordtype">size_t</span> newIndex = size();</div>
+<div class="line"><a name="l05403"></a><span class="lineno"> 5403</span>&#160;        resize(newIndex + 1);</div>
+<div class="line"><a name="l05404"></a><span class="lineno"> 5404</span>&#160;        data()[newIndex] = src;</div>
+<div class="line"><a name="l05405"></a><span class="lineno"> 5405</span>&#160;    }</div>
+<div class="line"><a name="l05406"></a><span class="lineno"> 5406</span>&#160; </div>
+<div class="line"><a name="l05407"></a><span class="lineno"> 5407</span>&#160;    <span class="keywordtype">void</span> pop_back()</div>
+<div class="line"><a name="l05408"></a><span class="lineno"> 5408</span>&#160;    {</div>
+<div class="line"><a name="l05409"></a><span class="lineno"> 5409</span>&#160;        VMA_HEAVY_ASSERT(m_Count &gt; 0);</div>
+<div class="line"><a name="l05410"></a><span class="lineno"> 5410</span>&#160;        resize(size() - 1);</div>
+<div class="line"><a name="l05411"></a><span class="lineno"> 5411</span>&#160;    }</div>
+<div class="line"><a name="l05412"></a><span class="lineno"> 5412</span>&#160; </div>
+<div class="line"><a name="l05413"></a><span class="lineno"> 5413</span>&#160;    <span class="keywordtype">void</span> push_front(<span class="keyword">const</span> T&amp; src)</div>
+<div class="line"><a name="l05414"></a><span class="lineno"> 5414</span>&#160;    {</div>
+<div class="line"><a name="l05415"></a><span class="lineno"> 5415</span>&#160;        insert(0, src);</div>
+<div class="line"><a name="l05416"></a><span class="lineno"> 5416</span>&#160;    }</div>
+<div class="line"><a name="l05417"></a><span class="lineno"> 5417</span>&#160; </div>
+<div class="line"><a name="l05418"></a><span class="lineno"> 5418</span>&#160;    <span class="keywordtype">void</span> pop_front()</div>
+<div class="line"><a name="l05419"></a><span class="lineno"> 5419</span>&#160;    {</div>
+<div class="line"><a name="l05420"></a><span class="lineno"> 5420</span>&#160;        VMA_HEAVY_ASSERT(m_Count &gt; 0);</div>
+<div class="line"><a name="l05421"></a><span class="lineno"> 5421</span>&#160;        remove(0);</div>
 <div class="line"><a name="l05422"></a><span class="lineno"> 5422</span>&#160;    }</div>
-<div class="line"><a name="l05423"></a><span class="lineno"> 5423</span>&#160;    <span class="keywordflow">else</span></div>
-<div class="line"><a name="l05424"></a><span class="lineno"> 5424</span>&#160;    {</div>
-<div class="line"><a name="l05425"></a><span class="lineno"> 5425</span>&#160;        pNewItem-&gt;pPrev = m_pBack;</div>
-<div class="line"><a name="l05426"></a><span class="lineno"> 5426</span>&#160;        m_pBack-&gt;pNext = pNewItem;</div>
-<div class="line"><a name="l05427"></a><span class="lineno"> 5427</span>&#160;        m_pBack = pNewItem;</div>
-<div class="line"><a name="l05428"></a><span class="lineno"> 5428</span>&#160;        ++m_Count;</div>
-<div class="line"><a name="l05429"></a><span class="lineno"> 5429</span>&#160;    }</div>
-<div class="line"><a name="l05430"></a><span class="lineno"> 5430</span>&#160;    <span class="keywordflow">return</span> pNewItem;</div>
-<div class="line"><a name="l05431"></a><span class="lineno"> 5431</span>&#160;}</div>
-<div class="line"><a name="l05432"></a><span class="lineno"> 5432</span>&#160; </div>
-<div class="line"><a name="l05433"></a><span class="lineno"> 5433</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt;</div>
-<div class="line"><a name="l05434"></a><span class="lineno"> 5434</span>&#160;VmaListItem&lt;T&gt;* VmaRawList&lt;T&gt;::PushFront()</div>
-<div class="line"><a name="l05435"></a><span class="lineno"> 5435</span>&#160;{</div>
-<div class="line"><a name="l05436"></a><span class="lineno"> 5436</span>&#160;    ItemType* <span class="keyword">const</span> pNewItem = m_ItemAllocator.Alloc();</div>
-<div class="line"><a name="l05437"></a><span class="lineno"> 5437</span>&#160;    pNewItem-&gt;pPrev = VMA_NULL;</div>
-<div class="line"><a name="l05438"></a><span class="lineno"> 5438</span>&#160;    <span class="keywordflow">if</span>(IsEmpty())</div>
-<div class="line"><a name="l05439"></a><span class="lineno"> 5439</span>&#160;    {</div>
-<div class="line"><a name="l05440"></a><span class="lineno"> 5440</span>&#160;        pNewItem-&gt;pNext = VMA_NULL;</div>
-<div class="line"><a name="l05441"></a><span class="lineno"> 5441</span>&#160;        m_pFront = pNewItem;</div>
-<div class="line"><a name="l05442"></a><span class="lineno"> 5442</span>&#160;        m_pBack = pNewItem;</div>
-<div class="line"><a name="l05443"></a><span class="lineno"> 5443</span>&#160;        m_Count = 1;</div>
-<div class="line"><a name="l05444"></a><span class="lineno"> 5444</span>&#160;    }</div>
-<div class="line"><a name="l05445"></a><span class="lineno"> 5445</span>&#160;    <span class="keywordflow">else</span></div>
-<div class="line"><a name="l05446"></a><span class="lineno"> 5446</span>&#160;    {</div>
-<div class="line"><a name="l05447"></a><span class="lineno"> 5447</span>&#160;        pNewItem-&gt;pNext = m_pFront;</div>
-<div class="line"><a name="l05448"></a><span class="lineno"> 5448</span>&#160;        m_pFront-&gt;pPrev = pNewItem;</div>
-<div class="line"><a name="l05449"></a><span class="lineno"> 5449</span>&#160;        m_pFront = pNewItem;</div>
-<div class="line"><a name="l05450"></a><span class="lineno"> 5450</span>&#160;        ++m_Count;</div>
-<div class="line"><a name="l05451"></a><span class="lineno"> 5451</span>&#160;    }</div>
-<div class="line"><a name="l05452"></a><span class="lineno"> 5452</span>&#160;    <span class="keywordflow">return</span> pNewItem;</div>
-<div class="line"><a name="l05453"></a><span class="lineno"> 5453</span>&#160;}</div>
-<div class="line"><a name="l05454"></a><span class="lineno"> 5454</span>&#160; </div>
-<div class="line"><a name="l05455"></a><span class="lineno"> 5455</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt;</div>
-<div class="line"><a name="l05456"></a><span class="lineno"> 5456</span>&#160;VmaListItem&lt;T&gt;* VmaRawList&lt;T&gt;::PushBack(<span class="keyword">const</span> T&amp; value)</div>
-<div class="line"><a name="l05457"></a><span class="lineno"> 5457</span>&#160;{</div>
-<div class="line"><a name="l05458"></a><span class="lineno"> 5458</span>&#160;    ItemType* <span class="keyword">const</span> pNewItem = PushBack();</div>
-<div class="line"><a name="l05459"></a><span class="lineno"> 5459</span>&#160;    pNewItem-&gt;Value = value;</div>
-<div class="line"><a name="l05460"></a><span class="lineno"> 5460</span>&#160;    <span class="keywordflow">return</span> pNewItem;</div>
-<div class="line"><a name="l05461"></a><span class="lineno"> 5461</span>&#160;}</div>
-<div class="line"><a name="l05462"></a><span class="lineno"> 5462</span>&#160; </div>
-<div class="line"><a name="l05463"></a><span class="lineno"> 5463</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt;</div>
-<div class="line"><a name="l05464"></a><span class="lineno"> 5464</span>&#160;VmaListItem&lt;T&gt;* VmaRawList&lt;T&gt;::PushFront(<span class="keyword">const</span> T&amp; value)</div>
-<div class="line"><a name="l05465"></a><span class="lineno"> 5465</span>&#160;{</div>
-<div class="line"><a name="l05466"></a><span class="lineno"> 5466</span>&#160;    ItemType* <span class="keyword">const</span> pNewItem = PushFront();</div>
-<div class="line"><a name="l05467"></a><span class="lineno"> 5467</span>&#160;    pNewItem-&gt;Value = value;</div>
-<div class="line"><a name="l05468"></a><span class="lineno"> 5468</span>&#160;    <span class="keywordflow">return</span> pNewItem;</div>
-<div class="line"><a name="l05469"></a><span class="lineno"> 5469</span>&#160;}</div>
+<div class="line"><a name="l05423"></a><span class="lineno"> 5423</span>&#160; </div>
+<div class="line"><a name="l05424"></a><span class="lineno"> 5424</span>&#160;    <span class="keyword">typedef</span> T* iterator;</div>
+<div class="line"><a name="l05425"></a><span class="lineno"> 5425</span>&#160; </div>
+<div class="line"><a name="l05426"></a><span class="lineno"> 5426</span>&#160;    iterator begin() { <span class="keywordflow">return</span> data(); }</div>
+<div class="line"><a name="l05427"></a><span class="lineno"> 5427</span>&#160;    iterator end() { <span class="keywordflow">return</span> data() + m_Count; }</div>
+<div class="line"><a name="l05428"></a><span class="lineno"> 5428</span>&#160; </div>
+<div class="line"><a name="l05429"></a><span class="lineno"> 5429</span>&#160;<span class="keyword">private</span>:</div>
+<div class="line"><a name="l05430"></a><span class="lineno"> 5430</span>&#160;    <span class="keywordtype">size_t</span> m_Count;</div>
+<div class="line"><a name="l05431"></a><span class="lineno"> 5431</span>&#160;    T m_StaticArray[N]; <span class="comment">// Used when m_Size &lt;= N</span></div>
+<div class="line"><a name="l05432"></a><span class="lineno"> 5432</span>&#160;    VmaVector&lt;T, AllocatorT&gt; m_DynamicArray; <span class="comment">// Used when m_Size &gt; N</span></div>
+<div class="line"><a name="l05433"></a><span class="lineno"> 5433</span>&#160;};</div>
+<div class="line"><a name="l05434"></a><span class="lineno"> 5434</span>&#160; </div>
+<div class="line"><a name="l05436"></a><span class="lineno"> 5436</span>&#160;<span class="comment">// class VmaPoolAllocator</span></div>
+<div class="line"><a name="l05437"></a><span class="lineno"> 5437</span>&#160; </div>
+<div class="line"><a name="l05438"></a><span class="lineno"> 5438</span>&#160;<span class="comment">/*</span></div>
+<div class="line"><a name="l05439"></a><span class="lineno"> 5439</span>&#160;<span class="comment">Allocator for objects of type T using a list of arrays (pools) to speed up</span></div>
+<div class="line"><a name="l05440"></a><span class="lineno"> 5440</span>&#160;<span class="comment">allocation. Number of elements that can be allocated is not bounded because</span></div>
+<div class="line"><a name="l05441"></a><span class="lineno"> 5441</span>&#160;<span class="comment">allocator can create multiple blocks.</span></div>
+<div class="line"><a name="l05442"></a><span class="lineno"> 5442</span>&#160;<span class="comment">*/</span></div>
+<div class="line"><a name="l05443"></a><span class="lineno"> 5443</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt;</div>
+<div class="line"><a name="l05444"></a><span class="lineno"> 5444</span>&#160;<span class="keyword">class </span>VmaPoolAllocator</div>
+<div class="line"><a name="l05445"></a><span class="lineno"> 5445</span>&#160;{</div>
+<div class="line"><a name="l05446"></a><span class="lineno"> 5446</span>&#160;    VMA_CLASS_NO_COPY(VmaPoolAllocator)</div>
+<div class="line"><a name="l05447"></a><span class="lineno"> 5447</span>&#160;<span class="keyword">public</span>:</div>
+<div class="line"><a name="l05448"></a><span class="lineno"> 5448</span>&#160;    VmaPoolAllocator(<span class="keyword">const</span> VkAllocationCallbacks* pAllocationCallbacks, uint32_t firstBlockCapacity);</div>
+<div class="line"><a name="l05449"></a><span class="lineno"> 5449</span>&#160;    ~VmaPoolAllocator();</div>
+<div class="line"><a name="l05450"></a><span class="lineno"> 5450</span>&#160;    <span class="keyword">template</span>&lt;<span class="keyword">typename</span>... Types&gt; T* Alloc(Types... args);</div>
+<div class="line"><a name="l05451"></a><span class="lineno"> 5451</span>&#160;    <span class="keywordtype">void</span> Free(T* ptr);</div>
+<div class="line"><a name="l05452"></a><span class="lineno"> 5452</span>&#160; </div>
+<div class="line"><a name="l05453"></a><span class="lineno"> 5453</span>&#160;<span class="keyword">private</span>:</div>
+<div class="line"><a name="l05454"></a><span class="lineno"> 5454</span>&#160;    <span class="keyword">union </span>Item</div>
+<div class="line"><a name="l05455"></a><span class="lineno"> 5455</span>&#160;    {</div>
+<div class="line"><a name="l05456"></a><span class="lineno"> 5456</span>&#160;        uint32_t NextFreeIndex;</div>
+<div class="line"><a name="l05457"></a><span class="lineno"> 5457</span>&#160;        <span class="keyword">alignas</span>(T) <span class="keywordtype">char</span> Value[<span class="keyword">sizeof</span>(T)];</div>
+<div class="line"><a name="l05458"></a><span class="lineno"> 5458</span>&#160;    };</div>
+<div class="line"><a name="l05459"></a><span class="lineno"> 5459</span>&#160; </div>
+<div class="line"><a name="l05460"></a><span class="lineno"> 5460</span>&#160;    <span class="keyword">struct </span>ItemBlock</div>
+<div class="line"><a name="l05461"></a><span class="lineno"> 5461</span>&#160;    {</div>
+<div class="line"><a name="l05462"></a><span class="lineno"> 5462</span>&#160;        Item* pItems;</div>
+<div class="line"><a name="l05463"></a><span class="lineno"> 5463</span>&#160;        uint32_t Capacity;</div>
+<div class="line"><a name="l05464"></a><span class="lineno"> 5464</span>&#160;        uint32_t FirstFreeIndex;</div>
+<div class="line"><a name="l05465"></a><span class="lineno"> 5465</span>&#160;    };</div>
+<div class="line"><a name="l05466"></a><span class="lineno"> 5466</span>&#160; </div>
+<div class="line"><a name="l05467"></a><span class="lineno"> 5467</span>&#160;    <span class="keyword">const</span> VkAllocationCallbacks* m_pAllocationCallbacks;</div>
+<div class="line"><a name="l05468"></a><span class="lineno"> 5468</span>&#160;    <span class="keyword">const</span> uint32_t m_FirstBlockCapacity;</div>
+<div class="line"><a name="l05469"></a><span class="lineno"> 5469</span>&#160;    VmaVector&lt; ItemBlock, VmaStlAllocator&lt;ItemBlock&gt; &gt; m_ItemBlocks;</div>
 <div class="line"><a name="l05470"></a><span class="lineno"> 5470</span>&#160; </div>
-<div class="line"><a name="l05471"></a><span class="lineno"> 5471</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt;</div>
-<div class="line"><a name="l05472"></a><span class="lineno"> 5472</span>&#160;<span class="keywordtype">void</span> VmaRawList&lt;T&gt;::PopBack()</div>
-<div class="line"><a name="l05473"></a><span class="lineno"> 5473</span>&#160;{</div>
-<div class="line"><a name="l05474"></a><span class="lineno"> 5474</span>&#160;    VMA_HEAVY_ASSERT(m_Count &gt; 0);</div>
-<div class="line"><a name="l05475"></a><span class="lineno"> 5475</span>&#160;    ItemType* <span class="keyword">const</span> pBackItem = m_pBack;</div>
-<div class="line"><a name="l05476"></a><span class="lineno"> 5476</span>&#160;    ItemType* <span class="keyword">const</span> pPrevItem = pBackItem-&gt;pPrev;</div>
-<div class="line"><a name="l05477"></a><span class="lineno"> 5477</span>&#160;    <span class="keywordflow">if</span>(pPrevItem != VMA_NULL)</div>
-<div class="line"><a name="l05478"></a><span class="lineno"> 5478</span>&#160;    {</div>
-<div class="line"><a name="l05479"></a><span class="lineno"> 5479</span>&#160;        pPrevItem-&gt;pNext = VMA_NULL;</div>
-<div class="line"><a name="l05480"></a><span class="lineno"> 5480</span>&#160;    }</div>
-<div class="line"><a name="l05481"></a><span class="lineno"> 5481</span>&#160;    m_pBack = pPrevItem;</div>
-<div class="line"><a name="l05482"></a><span class="lineno"> 5482</span>&#160;    m_ItemAllocator.Free(pBackItem);</div>
-<div class="line"><a name="l05483"></a><span class="lineno"> 5483</span>&#160;    --m_Count;</div>
-<div class="line"><a name="l05484"></a><span class="lineno"> 5484</span>&#160;}</div>
-<div class="line"><a name="l05485"></a><span class="lineno"> 5485</span>&#160; </div>
-<div class="line"><a name="l05486"></a><span class="lineno"> 5486</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt;</div>
-<div class="line"><a name="l05487"></a><span class="lineno"> 5487</span>&#160;<span class="keywordtype">void</span> VmaRawList&lt;T&gt;::PopFront()</div>
-<div class="line"><a name="l05488"></a><span class="lineno"> 5488</span>&#160;{</div>
-<div class="line"><a name="l05489"></a><span class="lineno"> 5489</span>&#160;    VMA_HEAVY_ASSERT(m_Count &gt; 0);</div>
-<div class="line"><a name="l05490"></a><span class="lineno"> 5490</span>&#160;    ItemType* <span class="keyword">const</span> pFrontItem = m_pFront;</div>
-<div class="line"><a name="l05491"></a><span class="lineno"> 5491</span>&#160;    ItemType* <span class="keyword">const</span> pNextItem = pFrontItem-&gt;pNext;</div>
-<div class="line"><a name="l05492"></a><span class="lineno"> 5492</span>&#160;    <span class="keywordflow">if</span>(pNextItem != VMA_NULL)</div>
-<div class="line"><a name="l05493"></a><span class="lineno"> 5493</span>&#160;    {</div>
-<div class="line"><a name="l05494"></a><span class="lineno"> 5494</span>&#160;        pNextItem-&gt;pPrev = VMA_NULL;</div>
-<div class="line"><a name="l05495"></a><span class="lineno"> 5495</span>&#160;    }</div>
-<div class="line"><a name="l05496"></a><span class="lineno"> 5496</span>&#160;    m_pFront = pNextItem;</div>
-<div class="line"><a name="l05497"></a><span class="lineno"> 5497</span>&#160;    m_ItemAllocator.Free(pFrontItem);</div>
-<div class="line"><a name="l05498"></a><span class="lineno"> 5498</span>&#160;    --m_Count;</div>
-<div class="line"><a name="l05499"></a><span class="lineno"> 5499</span>&#160;}</div>
-<div class="line"><a name="l05500"></a><span class="lineno"> 5500</span>&#160; </div>
-<div class="line"><a name="l05501"></a><span class="lineno"> 5501</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt;</div>
-<div class="line"><a name="l05502"></a><span class="lineno"> 5502</span>&#160;<span class="keywordtype">void</span> VmaRawList&lt;T&gt;::Remove(ItemType* pItem)</div>
-<div class="line"><a name="l05503"></a><span class="lineno"> 5503</span>&#160;{</div>
-<div class="line"><a name="l05504"></a><span class="lineno"> 5504</span>&#160;    VMA_HEAVY_ASSERT(pItem != VMA_NULL);</div>
-<div class="line"><a name="l05505"></a><span class="lineno"> 5505</span>&#160;    VMA_HEAVY_ASSERT(m_Count &gt; 0);</div>
-<div class="line"><a name="l05506"></a><span class="lineno"> 5506</span>&#160; </div>
-<div class="line"><a name="l05507"></a><span class="lineno"> 5507</span>&#160;    <span class="keywordflow">if</span>(pItem-&gt;pPrev != VMA_NULL)</div>
-<div class="line"><a name="l05508"></a><span class="lineno"> 5508</span>&#160;    {</div>
-<div class="line"><a name="l05509"></a><span class="lineno"> 5509</span>&#160;        pItem-&gt;pPrev-&gt;pNext = pItem-&gt;pNext;</div>
-<div class="line"><a name="l05510"></a><span class="lineno"> 5510</span>&#160;    }</div>
-<div class="line"><a name="l05511"></a><span class="lineno"> 5511</span>&#160;    <span class="keywordflow">else</span></div>
-<div class="line"><a name="l05512"></a><span class="lineno"> 5512</span>&#160;    {</div>
-<div class="line"><a name="l05513"></a><span class="lineno"> 5513</span>&#160;        VMA_HEAVY_ASSERT(m_pFront == pItem);</div>
-<div class="line"><a name="l05514"></a><span class="lineno"> 5514</span>&#160;        m_pFront = pItem-&gt;pNext;</div>
-<div class="line"><a name="l05515"></a><span class="lineno"> 5515</span>&#160;    }</div>
+<div class="line"><a name="l05471"></a><span class="lineno"> 5471</span>&#160;    ItemBlock&amp; CreateNewBlock();</div>
+<div class="line"><a name="l05472"></a><span class="lineno"> 5472</span>&#160;};</div>
+<div class="line"><a name="l05473"></a><span class="lineno"> 5473</span>&#160; </div>
+<div class="line"><a name="l05474"></a><span class="lineno"> 5474</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt;</div>
+<div class="line"><a name="l05475"></a><span class="lineno"> 5475</span>&#160;VmaPoolAllocator&lt;T&gt;::VmaPoolAllocator(<span class="keyword">const</span> VkAllocationCallbacks* pAllocationCallbacks, uint32_t firstBlockCapacity) :</div>
+<div class="line"><a name="l05476"></a><span class="lineno"> 5476</span>&#160;    m_pAllocationCallbacks(pAllocationCallbacks),</div>
+<div class="line"><a name="l05477"></a><span class="lineno"> 5477</span>&#160;    m_FirstBlockCapacity(firstBlockCapacity),</div>
+<div class="line"><a name="l05478"></a><span class="lineno"> 5478</span>&#160;    m_ItemBlocks(VmaStlAllocator&lt;ItemBlock&gt;(pAllocationCallbacks))</div>
+<div class="line"><a name="l05479"></a><span class="lineno"> 5479</span>&#160;{</div>
+<div class="line"><a name="l05480"></a><span class="lineno"> 5480</span>&#160;    VMA_ASSERT(m_FirstBlockCapacity &gt; 1);</div>
+<div class="line"><a name="l05481"></a><span class="lineno"> 5481</span>&#160;}</div>
+<div class="line"><a name="l05482"></a><span class="lineno"> 5482</span>&#160; </div>
+<div class="line"><a name="l05483"></a><span class="lineno"> 5483</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt;</div>
+<div class="line"><a name="l05484"></a><span class="lineno"> 5484</span>&#160;VmaPoolAllocator&lt;T&gt;::~VmaPoolAllocator()</div>
+<div class="line"><a name="l05485"></a><span class="lineno"> 5485</span>&#160;{</div>
+<div class="line"><a name="l05486"></a><span class="lineno"> 5486</span>&#160;    <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> i = m_ItemBlocks.size(); i--; )</div>
+<div class="line"><a name="l05487"></a><span class="lineno"> 5487</span>&#160;        vma_delete_array(m_pAllocationCallbacks, m_ItemBlocks[i].pItems, m_ItemBlocks[i].Capacity);</div>
+<div class="line"><a name="l05488"></a><span class="lineno"> 5488</span>&#160;    m_ItemBlocks.clear();</div>
+<div class="line"><a name="l05489"></a><span class="lineno"> 5489</span>&#160;}</div>
+<div class="line"><a name="l05490"></a><span class="lineno"> 5490</span>&#160; </div>
+<div class="line"><a name="l05491"></a><span class="lineno"> 5491</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt;</div>
+<div class="line"><a name="l05492"></a><span class="lineno"> 5492</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span>... Types&gt; T* VmaPoolAllocator&lt;T&gt;::Alloc(Types... args)</div>
+<div class="line"><a name="l05493"></a><span class="lineno"> 5493</span>&#160;{</div>
+<div class="line"><a name="l05494"></a><span class="lineno"> 5494</span>&#160;    <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> i = m_ItemBlocks.size(); i--; )</div>
+<div class="line"><a name="l05495"></a><span class="lineno"> 5495</span>&#160;    {</div>
+<div class="line"><a name="l05496"></a><span class="lineno"> 5496</span>&#160;        ItemBlock&amp; block = m_ItemBlocks[i];</div>
+<div class="line"><a name="l05497"></a><span class="lineno"> 5497</span>&#160;        <span class="comment">// This block has some free items: Use first one.</span></div>
+<div class="line"><a name="l05498"></a><span class="lineno"> 5498</span>&#160;        <span class="keywordflow">if</span>(block.FirstFreeIndex != UINT32_MAX)</div>
+<div class="line"><a name="l05499"></a><span class="lineno"> 5499</span>&#160;        {</div>
+<div class="line"><a name="l05500"></a><span class="lineno"> 5500</span>&#160;            Item* <span class="keyword">const</span> pItem = &amp;block.pItems[block.FirstFreeIndex];</div>
+<div class="line"><a name="l05501"></a><span class="lineno"> 5501</span>&#160;            block.FirstFreeIndex = pItem-&gt;NextFreeIndex;</div>
+<div class="line"><a name="l05502"></a><span class="lineno"> 5502</span>&#160;            T* result = (T*)&amp;pItem-&gt;Value;</div>
+<div class="line"><a name="l05503"></a><span class="lineno"> 5503</span>&#160;            <span class="keyword">new</span>(result)T(std::forward&lt;Types&gt;(args)...); <span class="comment">// Explicit constructor call.</span></div>
+<div class="line"><a name="l05504"></a><span class="lineno"> 5504</span>&#160;            <span class="keywordflow">return</span> result;</div>
+<div class="line"><a name="l05505"></a><span class="lineno"> 5505</span>&#160;        }</div>
+<div class="line"><a name="l05506"></a><span class="lineno"> 5506</span>&#160;    }</div>
+<div class="line"><a name="l05507"></a><span class="lineno"> 5507</span>&#160; </div>
+<div class="line"><a name="l05508"></a><span class="lineno"> 5508</span>&#160;    <span class="comment">// No block has free item: Create new one and use it.</span></div>
+<div class="line"><a name="l05509"></a><span class="lineno"> 5509</span>&#160;    ItemBlock&amp; newBlock = CreateNewBlock();</div>
+<div class="line"><a name="l05510"></a><span class="lineno"> 5510</span>&#160;    Item* <span class="keyword">const</span> pItem = &amp;newBlock.pItems[0];</div>
+<div class="line"><a name="l05511"></a><span class="lineno"> 5511</span>&#160;    newBlock.FirstFreeIndex = pItem-&gt;NextFreeIndex;</div>
+<div class="line"><a name="l05512"></a><span class="lineno"> 5512</span>&#160;    T* result = (T*)&amp;pItem-&gt;Value;</div>
+<div class="line"><a name="l05513"></a><span class="lineno"> 5513</span>&#160;    <span class="keyword">new</span>(result)T(std::forward&lt;Types&gt;(args)...); <span class="comment">// Explicit constructor call.</span></div>
+<div class="line"><a name="l05514"></a><span class="lineno"> 5514</span>&#160;    <span class="keywordflow">return</span> result;</div>
+<div class="line"><a name="l05515"></a><span class="lineno"> 5515</span>&#160;}</div>
 <div class="line"><a name="l05516"></a><span class="lineno"> 5516</span>&#160; </div>
-<div class="line"><a name="l05517"></a><span class="lineno"> 5517</span>&#160;    <span class="keywordflow">if</span>(pItem-&gt;pNext != VMA_NULL)</div>
-<div class="line"><a name="l05518"></a><span class="lineno"> 5518</span>&#160;    {</div>
-<div class="line"><a name="l05519"></a><span class="lineno"> 5519</span>&#160;        pItem-&gt;pNext-&gt;pPrev = pItem-&gt;pPrev;</div>
-<div class="line"><a name="l05520"></a><span class="lineno"> 5520</span>&#160;    }</div>
-<div class="line"><a name="l05521"></a><span class="lineno"> 5521</span>&#160;    <span class="keywordflow">else</span></div>
+<div class="line"><a name="l05517"></a><span class="lineno"> 5517</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt;</div>
+<div class="line"><a name="l05518"></a><span class="lineno"> 5518</span>&#160;<span class="keywordtype">void</span> VmaPoolAllocator&lt;T&gt;::Free(T* ptr)</div>
+<div class="line"><a name="l05519"></a><span class="lineno"> 5519</span>&#160;{</div>
+<div class="line"><a name="l05520"></a><span class="lineno"> 5520</span>&#160;    <span class="comment">// Search all memory blocks to find ptr.</span></div>
+<div class="line"><a name="l05521"></a><span class="lineno"> 5521</span>&#160;    <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> i = m_ItemBlocks.size(); i--; )</div>
 <div class="line"><a name="l05522"></a><span class="lineno"> 5522</span>&#160;    {</div>
-<div class="line"><a name="l05523"></a><span class="lineno"> 5523</span>&#160;        VMA_HEAVY_ASSERT(m_pBack == pItem);</div>
-<div class="line"><a name="l05524"></a><span class="lineno"> 5524</span>&#160;        m_pBack = pItem-&gt;pPrev;</div>
-<div class="line"><a name="l05525"></a><span class="lineno"> 5525</span>&#160;    }</div>
-<div class="line"><a name="l05526"></a><span class="lineno"> 5526</span>&#160; </div>
-<div class="line"><a name="l05527"></a><span class="lineno"> 5527</span>&#160;    m_ItemAllocator.Free(pItem);</div>
-<div class="line"><a name="l05528"></a><span class="lineno"> 5528</span>&#160;    --m_Count;</div>
-<div class="line"><a name="l05529"></a><span class="lineno"> 5529</span>&#160;}</div>
-<div class="line"><a name="l05530"></a><span class="lineno"> 5530</span>&#160; </div>
-<div class="line"><a name="l05531"></a><span class="lineno"> 5531</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt;</div>
-<div class="line"><a name="l05532"></a><span class="lineno"> 5532</span>&#160;VmaListItem&lt;T&gt;* VmaRawList&lt;T&gt;::InsertBefore(ItemType* pItem)</div>
-<div class="line"><a name="l05533"></a><span class="lineno"> 5533</span>&#160;{</div>
-<div class="line"><a name="l05534"></a><span class="lineno"> 5534</span>&#160;    <span class="keywordflow">if</span>(pItem != VMA_NULL)</div>
-<div class="line"><a name="l05535"></a><span class="lineno"> 5535</span>&#160;    {</div>
-<div class="line"><a name="l05536"></a><span class="lineno"> 5536</span>&#160;        ItemType* <span class="keyword">const</span> prevItem = pItem-&gt;pPrev;</div>
-<div class="line"><a name="l05537"></a><span class="lineno"> 5537</span>&#160;        ItemType* <span class="keyword">const</span> newItem = m_ItemAllocator.Alloc();</div>
-<div class="line"><a name="l05538"></a><span class="lineno"> 5538</span>&#160;        newItem-&gt;pPrev = prevItem;</div>
-<div class="line"><a name="l05539"></a><span class="lineno"> 5539</span>&#160;        newItem-&gt;pNext = pItem;</div>
-<div class="line"><a name="l05540"></a><span class="lineno"> 5540</span>&#160;        pItem-&gt;pPrev = newItem;</div>
-<div class="line"><a name="l05541"></a><span class="lineno"> 5541</span>&#160;        <span class="keywordflow">if</span>(prevItem != VMA_NULL)</div>
-<div class="line"><a name="l05542"></a><span class="lineno"> 5542</span>&#160;        {</div>
-<div class="line"><a name="l05543"></a><span class="lineno"> 5543</span>&#160;            prevItem-&gt;pNext = newItem;</div>
-<div class="line"><a name="l05544"></a><span class="lineno"> 5544</span>&#160;        }</div>
-<div class="line"><a name="l05545"></a><span class="lineno"> 5545</span>&#160;        <span class="keywordflow">else</span></div>
-<div class="line"><a name="l05546"></a><span class="lineno"> 5546</span>&#160;        {</div>
-<div class="line"><a name="l05547"></a><span class="lineno"> 5547</span>&#160;            VMA_HEAVY_ASSERT(m_pFront == pItem);</div>
-<div class="line"><a name="l05548"></a><span class="lineno"> 5548</span>&#160;            m_pFront = newItem;</div>
-<div class="line"><a name="l05549"></a><span class="lineno"> 5549</span>&#160;        }</div>
-<div class="line"><a name="l05550"></a><span class="lineno"> 5550</span>&#160;        ++m_Count;</div>
-<div class="line"><a name="l05551"></a><span class="lineno"> 5551</span>&#160;        <span class="keywordflow">return</span> newItem;</div>
-<div class="line"><a name="l05552"></a><span class="lineno"> 5552</span>&#160;    }</div>
-<div class="line"><a name="l05553"></a><span class="lineno"> 5553</span>&#160;    <span class="keywordflow">else</span></div>
-<div class="line"><a name="l05554"></a><span class="lineno"> 5554</span>&#160;        <span class="keywordflow">return</span> PushBack();</div>
-<div class="line"><a name="l05555"></a><span class="lineno"> 5555</span>&#160;}</div>
-<div class="line"><a name="l05556"></a><span class="lineno"> 5556</span>&#160; </div>
-<div class="line"><a name="l05557"></a><span class="lineno"> 5557</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt;</div>
-<div class="line"><a name="l05558"></a><span class="lineno"> 5558</span>&#160;VmaListItem&lt;T&gt;* VmaRawList&lt;T&gt;::InsertAfter(ItemType* pItem)</div>
-<div class="line"><a name="l05559"></a><span class="lineno"> 5559</span>&#160;{</div>
-<div class="line"><a name="l05560"></a><span class="lineno"> 5560</span>&#160;    <span class="keywordflow">if</span>(pItem != VMA_NULL)</div>
-<div class="line"><a name="l05561"></a><span class="lineno"> 5561</span>&#160;    {</div>
-<div class="line"><a name="l05562"></a><span class="lineno"> 5562</span>&#160;        ItemType* <span class="keyword">const</span> nextItem = pItem-&gt;pNext;</div>
-<div class="line"><a name="l05563"></a><span class="lineno"> 5563</span>&#160;        ItemType* <span class="keyword">const</span> newItem = m_ItemAllocator.Alloc();</div>
-<div class="line"><a name="l05564"></a><span class="lineno"> 5564</span>&#160;        newItem-&gt;pNext = nextItem;</div>
-<div class="line"><a name="l05565"></a><span class="lineno"> 5565</span>&#160;        newItem-&gt;pPrev = pItem;</div>
-<div class="line"><a name="l05566"></a><span class="lineno"> 5566</span>&#160;        pItem-&gt;pNext = newItem;</div>
-<div class="line"><a name="l05567"></a><span class="lineno"> 5567</span>&#160;        <span class="keywordflow">if</span>(nextItem != VMA_NULL)</div>
-<div class="line"><a name="l05568"></a><span class="lineno"> 5568</span>&#160;        {</div>
-<div class="line"><a name="l05569"></a><span class="lineno"> 5569</span>&#160;            nextItem-&gt;pPrev = newItem;</div>
-<div class="line"><a name="l05570"></a><span class="lineno"> 5570</span>&#160;        }</div>
-<div class="line"><a name="l05571"></a><span class="lineno"> 5571</span>&#160;        <span class="keywordflow">else</span></div>
-<div class="line"><a name="l05572"></a><span class="lineno"> 5572</span>&#160;        {</div>
-<div class="line"><a name="l05573"></a><span class="lineno"> 5573</span>&#160;            VMA_HEAVY_ASSERT(m_pBack == pItem);</div>
-<div class="line"><a name="l05574"></a><span class="lineno"> 5574</span>&#160;            m_pBack = newItem;</div>
-<div class="line"><a name="l05575"></a><span class="lineno"> 5575</span>&#160;        }</div>
-<div class="line"><a name="l05576"></a><span class="lineno"> 5576</span>&#160;        ++m_Count;</div>
-<div class="line"><a name="l05577"></a><span class="lineno"> 5577</span>&#160;        <span class="keywordflow">return</span> newItem;</div>
-<div class="line"><a name="l05578"></a><span class="lineno"> 5578</span>&#160;    }</div>
-<div class="line"><a name="l05579"></a><span class="lineno"> 5579</span>&#160;    <span class="keywordflow">else</span></div>
-<div class="line"><a name="l05580"></a><span class="lineno"> 5580</span>&#160;        <span class="keywordflow">return</span> PushFront();</div>
-<div class="line"><a name="l05581"></a><span class="lineno"> 5581</span>&#160;}</div>
-<div class="line"><a name="l05582"></a><span class="lineno"> 5582</span>&#160; </div>
-<div class="line"><a name="l05583"></a><span class="lineno"> 5583</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt;</div>
-<div class="line"><a name="l05584"></a><span class="lineno"> 5584</span>&#160;VmaListItem&lt;T&gt;* VmaRawList&lt;T&gt;::InsertBefore(ItemType* pItem, <span class="keyword">const</span> T&amp; value)</div>
-<div class="line"><a name="l05585"></a><span class="lineno"> 5585</span>&#160;{</div>
-<div class="line"><a name="l05586"></a><span class="lineno"> 5586</span>&#160;    ItemType* <span class="keyword">const</span> newItem = InsertBefore(pItem);</div>
-<div class="line"><a name="l05587"></a><span class="lineno"> 5587</span>&#160;    newItem-&gt;Value = value;</div>
-<div class="line"><a name="l05588"></a><span class="lineno"> 5588</span>&#160;    <span class="keywordflow">return</span> newItem;</div>
-<div class="line"><a name="l05589"></a><span class="lineno"> 5589</span>&#160;}</div>
+<div class="line"><a name="l05523"></a><span class="lineno"> 5523</span>&#160;        ItemBlock&amp; block = m_ItemBlocks[i];</div>
+<div class="line"><a name="l05524"></a><span class="lineno"> 5524</span>&#160; </div>
+<div class="line"><a name="l05525"></a><span class="lineno"> 5525</span>&#160;        <span class="comment">// Casting to union.</span></div>
+<div class="line"><a name="l05526"></a><span class="lineno"> 5526</span>&#160;        Item* pItemPtr;</div>
+<div class="line"><a name="l05527"></a><span class="lineno"> 5527</span>&#160;        memcpy(&amp;pItemPtr, &amp;ptr, <span class="keyword">sizeof</span>(pItemPtr));</div>
+<div class="line"><a name="l05528"></a><span class="lineno"> 5528</span>&#160; </div>
+<div class="line"><a name="l05529"></a><span class="lineno"> 5529</span>&#160;        <span class="comment">// Check if pItemPtr is in address range of this block.</span></div>
+<div class="line"><a name="l05530"></a><span class="lineno"> 5530</span>&#160;        <span class="keywordflow">if</span>((pItemPtr &gt;= block.pItems) &amp;&amp; (pItemPtr &lt; block.pItems + block.Capacity))</div>
+<div class="line"><a name="l05531"></a><span class="lineno"> 5531</span>&#160;        {</div>
+<div class="line"><a name="l05532"></a><span class="lineno"> 5532</span>&#160;            ptr-&gt;~T(); <span class="comment">// Explicit destructor call.</span></div>
+<div class="line"><a name="l05533"></a><span class="lineno"> 5533</span>&#160;            <span class="keyword">const</span> uint32_t index = <span class="keyword">static_cast&lt;</span>uint32_t<span class="keyword">&gt;</span>(pItemPtr - block.pItems);</div>
+<div class="line"><a name="l05534"></a><span class="lineno"> 5534</span>&#160;            pItemPtr-&gt;NextFreeIndex = block.FirstFreeIndex;</div>
+<div class="line"><a name="l05535"></a><span class="lineno"> 5535</span>&#160;            block.FirstFreeIndex = index;</div>
+<div class="line"><a name="l05536"></a><span class="lineno"> 5536</span>&#160;            <span class="keywordflow">return</span>;</div>
+<div class="line"><a name="l05537"></a><span class="lineno"> 5537</span>&#160;        }</div>
+<div class="line"><a name="l05538"></a><span class="lineno"> 5538</span>&#160;    }</div>
+<div class="line"><a name="l05539"></a><span class="lineno"> 5539</span>&#160;    VMA_ASSERT(0 &amp;&amp; <span class="stringliteral">&quot;Pointer doesn&#39;t belong to this memory pool.&quot;</span>);</div>
+<div class="line"><a name="l05540"></a><span class="lineno"> 5540</span>&#160;}</div>
+<div class="line"><a name="l05541"></a><span class="lineno"> 5541</span>&#160; </div>
+<div class="line"><a name="l05542"></a><span class="lineno"> 5542</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt;</div>
+<div class="line"><a name="l05543"></a><span class="lineno"> 5543</span>&#160;<span class="keyword">typename</span> VmaPoolAllocator&lt;T&gt;::ItemBlock&amp; VmaPoolAllocator&lt;T&gt;::CreateNewBlock()</div>
+<div class="line"><a name="l05544"></a><span class="lineno"> 5544</span>&#160;{</div>
+<div class="line"><a name="l05545"></a><span class="lineno"> 5545</span>&#160;    <span class="keyword">const</span> uint32_t newBlockCapacity = m_ItemBlocks.empty() ?</div>
+<div class="line"><a name="l05546"></a><span class="lineno"> 5546</span>&#160;        m_FirstBlockCapacity : m_ItemBlocks.back().Capacity * 3 / 2;</div>
+<div class="line"><a name="l05547"></a><span class="lineno"> 5547</span>&#160; </div>
+<div class="line"><a name="l05548"></a><span class="lineno"> 5548</span>&#160;    <span class="keyword">const</span> ItemBlock newBlock = {</div>
+<div class="line"><a name="l05549"></a><span class="lineno"> 5549</span>&#160;        vma_new_array(m_pAllocationCallbacks, Item, newBlockCapacity),</div>
+<div class="line"><a name="l05550"></a><span class="lineno"> 5550</span>&#160;        newBlockCapacity,</div>
+<div class="line"><a name="l05551"></a><span class="lineno"> 5551</span>&#160;        0 };</div>
+<div class="line"><a name="l05552"></a><span class="lineno"> 5552</span>&#160; </div>
+<div class="line"><a name="l05553"></a><span class="lineno"> 5553</span>&#160;    m_ItemBlocks.push_back(newBlock);</div>
+<div class="line"><a name="l05554"></a><span class="lineno"> 5554</span>&#160; </div>
+<div class="line"><a name="l05555"></a><span class="lineno"> 5555</span>&#160;    <span class="comment">// Setup singly-linked list of all free items in this block.</span></div>
+<div class="line"><a name="l05556"></a><span class="lineno"> 5556</span>&#160;    <span class="keywordflow">for</span>(uint32_t i = 0; i &lt; newBlockCapacity - 1; ++i)</div>
+<div class="line"><a name="l05557"></a><span class="lineno"> 5557</span>&#160;        newBlock.pItems[i].NextFreeIndex = i + 1;</div>
+<div class="line"><a name="l05558"></a><span class="lineno"> 5558</span>&#160;    newBlock.pItems[newBlockCapacity - 1].NextFreeIndex = UINT32_MAX;</div>
+<div class="line"><a name="l05559"></a><span class="lineno"> 5559</span>&#160;    <span class="keywordflow">return</span> m_ItemBlocks.back();</div>
+<div class="line"><a name="l05560"></a><span class="lineno"> 5560</span>&#160;}</div>
+<div class="line"><a name="l05561"></a><span class="lineno"> 5561</span>&#160; </div>
+<div class="line"><a name="l05563"></a><span class="lineno"> 5563</span>&#160;<span class="comment">// class VmaRawList, VmaList</span></div>
+<div class="line"><a name="l05564"></a><span class="lineno"> 5564</span>&#160; </div>
+<div class="line"><a name="l05565"></a><span class="lineno"> 5565</span>&#160;<span class="preprocessor">#if VMA_USE_STL_LIST</span></div>
+<div class="line"><a name="l05566"></a><span class="lineno"> 5566</span>&#160; </div>
+<div class="line"><a name="l05567"></a><span class="lineno"> 5567</span>&#160;<span class="preprocessor">#define VmaList std::list</span></div>
+<div class="line"><a name="l05568"></a><span class="lineno"> 5568</span>&#160; </div>
+<div class="line"><a name="l05569"></a><span class="lineno"> 5569</span>&#160;<span class="preprocessor">#else </span><span class="comment">// #if VMA_USE_STL_LIST</span></div>
+<div class="line"><a name="l05570"></a><span class="lineno"> 5570</span>&#160; </div>
+<div class="line"><a name="l05571"></a><span class="lineno"> 5571</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt;</div>
+<div class="line"><a name="l05572"></a><span class="lineno"> 5572</span>&#160;<span class="keyword">struct </span>VmaListItem</div>
+<div class="line"><a name="l05573"></a><span class="lineno"> 5573</span>&#160;{</div>
+<div class="line"><a name="l05574"></a><span class="lineno"> 5574</span>&#160;    VmaListItem* pPrev;</div>
+<div class="line"><a name="l05575"></a><span class="lineno"> 5575</span>&#160;    VmaListItem* pNext;</div>
+<div class="line"><a name="l05576"></a><span class="lineno"> 5576</span>&#160;    T Value;</div>
+<div class="line"><a name="l05577"></a><span class="lineno"> 5577</span>&#160;};</div>
+<div class="line"><a name="l05578"></a><span class="lineno"> 5578</span>&#160; </div>
+<div class="line"><a name="l05579"></a><span class="lineno"> 5579</span>&#160;<span class="comment">// Doubly linked list.</span></div>
+<div class="line"><a name="l05580"></a><span class="lineno"> 5580</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt;</div>
+<div class="line"><a name="l05581"></a><span class="lineno"> 5581</span>&#160;<span class="keyword">class </span>VmaRawList</div>
+<div class="line"><a name="l05582"></a><span class="lineno"> 5582</span>&#160;{</div>
+<div class="line"><a name="l05583"></a><span class="lineno"> 5583</span>&#160;    VMA_CLASS_NO_COPY(VmaRawList)</div>
+<div class="line"><a name="l05584"></a><span class="lineno"> 5584</span>&#160;<span class="keyword">public</span>:</div>
+<div class="line"><a name="l05585"></a><span class="lineno"> 5585</span>&#160;    <span class="keyword">typedef</span> VmaListItem&lt;T&gt; ItemType;</div>
+<div class="line"><a name="l05586"></a><span class="lineno"> 5586</span>&#160; </div>
+<div class="line"><a name="l05587"></a><span class="lineno"> 5587</span>&#160;    VmaRawList(<span class="keyword">const</span> VkAllocationCallbacks* pAllocationCallbacks);</div>
+<div class="line"><a name="l05588"></a><span class="lineno"> 5588</span>&#160;    ~VmaRawList();</div>
+<div class="line"><a name="l05589"></a><span class="lineno"> 5589</span>&#160;    <span class="keywordtype">void</span> Clear();</div>
 <div class="line"><a name="l05590"></a><span class="lineno"> 5590</span>&#160; </div>
-<div class="line"><a name="l05591"></a><span class="lineno"> 5591</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt;</div>
-<div class="line"><a name="l05592"></a><span class="lineno"> 5592</span>&#160;VmaListItem&lt;T&gt;* VmaRawList&lt;T&gt;::InsertAfter(ItemType* pItem, <span class="keyword">const</span> T&amp; value)</div>
-<div class="line"><a name="l05593"></a><span class="lineno"> 5593</span>&#160;{</div>
-<div class="line"><a name="l05594"></a><span class="lineno"> 5594</span>&#160;    ItemType* <span class="keyword">const</span> newItem = InsertAfter(pItem);</div>
-<div class="line"><a name="l05595"></a><span class="lineno"> 5595</span>&#160;    newItem-&gt;Value = value;</div>
-<div class="line"><a name="l05596"></a><span class="lineno"> 5596</span>&#160;    <span class="keywordflow">return</span> newItem;</div>
-<div class="line"><a name="l05597"></a><span class="lineno"> 5597</span>&#160;}</div>
+<div class="line"><a name="l05591"></a><span class="lineno"> 5591</span>&#160;    <span class="keywordtype">size_t</span> GetCount()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_Count; }</div>
+<div class="line"><a name="l05592"></a><span class="lineno"> 5592</span>&#160;    <span class="keywordtype">bool</span> IsEmpty()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_Count == 0; }</div>
+<div class="line"><a name="l05593"></a><span class="lineno"> 5593</span>&#160; </div>
+<div class="line"><a name="l05594"></a><span class="lineno"> 5594</span>&#160;    ItemType* Front() { <span class="keywordflow">return</span> m_pFront; }</div>
+<div class="line"><a name="l05595"></a><span class="lineno"> 5595</span>&#160;    <span class="keyword">const</span> ItemType* Front()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_pFront; }</div>
+<div class="line"><a name="l05596"></a><span class="lineno"> 5596</span>&#160;    ItemType* Back() { <span class="keywordflow">return</span> m_pBack; }</div>
+<div class="line"><a name="l05597"></a><span class="lineno"> 5597</span>&#160;    <span class="keyword">const</span> ItemType* Back()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_pBack; }</div>
 <div class="line"><a name="l05598"></a><span class="lineno"> 5598</span>&#160; </div>
-<div class="line"><a name="l05599"></a><span class="lineno"> 5599</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> T, <span class="keyword">typename</span> AllocatorT&gt;</div>
-<div class="line"><a name="l05600"></a><span class="lineno"> 5600</span>&#160;<span class="keyword">class </span>VmaList</div>
-<div class="line"><a name="l05601"></a><span class="lineno"> 5601</span>&#160;{</div>
-<div class="line"><a name="l05602"></a><span class="lineno"> 5602</span>&#160;    VMA_CLASS_NO_COPY(VmaList)</div>
-<div class="line"><a name="l05603"></a><span class="lineno"> 5603</span>&#160;<span class="keyword">public</span>:</div>
-<div class="line"><a name="l05604"></a><span class="lineno"> 5604</span>&#160;    <span class="keyword">class </span>iterator</div>
-<div class="line"><a name="l05605"></a><span class="lineno"> 5605</span>&#160;    {</div>
-<div class="line"><a name="l05606"></a><span class="lineno"> 5606</span>&#160;    <span class="keyword">public</span>:</div>
-<div class="line"><a name="l05607"></a><span class="lineno"> 5607</span>&#160;        iterator() :</div>
-<div class="line"><a name="l05608"></a><span class="lineno"> 5608</span>&#160;            m_pList(VMA_NULL),</div>
-<div class="line"><a name="l05609"></a><span class="lineno"> 5609</span>&#160;            m_pItem(VMA_NULL)</div>
-<div class="line"><a name="l05610"></a><span class="lineno"> 5610</span>&#160;        {</div>
-<div class="line"><a name="l05611"></a><span class="lineno"> 5611</span>&#160;        }</div>
-<div class="line"><a name="l05612"></a><span class="lineno"> 5612</span>&#160; </div>
-<div class="line"><a name="l05613"></a><span class="lineno"> 5613</span>&#160;        T&amp; operator*()<span class="keyword"> const</span></div>
-<div class="line"><a name="l05614"></a><span class="lineno"> 5614</span>&#160;<span class="keyword">        </span>{</div>
-<div class="line"><a name="l05615"></a><span class="lineno"> 5615</span>&#160;            VMA_HEAVY_ASSERT(m_pItem != VMA_NULL);</div>
-<div class="line"><a name="l05616"></a><span class="lineno"> 5616</span>&#160;            <span class="keywordflow">return</span> m_pItem-&gt;Value;</div>
-<div class="line"><a name="l05617"></a><span class="lineno"> 5617</span>&#160;        }</div>
-<div class="line"><a name="l05618"></a><span class="lineno"> 5618</span>&#160;        T* operator-&gt;()<span class="keyword"> const</span></div>
-<div class="line"><a name="l05619"></a><span class="lineno"> 5619</span>&#160;<span class="keyword">        </span>{</div>
-<div class="line"><a name="l05620"></a><span class="lineno"> 5620</span>&#160;            VMA_HEAVY_ASSERT(m_pItem != VMA_NULL);</div>
-<div class="line"><a name="l05621"></a><span class="lineno"> 5621</span>&#160;            <span class="keywordflow">return</span> &amp;m_pItem-&gt;Value;</div>
-<div class="line"><a name="l05622"></a><span class="lineno"> 5622</span>&#160;        }</div>
+<div class="line"><a name="l05599"></a><span class="lineno"> 5599</span>&#160;    ItemType* PushBack();</div>
+<div class="line"><a name="l05600"></a><span class="lineno"> 5600</span>&#160;    ItemType* PushFront();</div>
+<div class="line"><a name="l05601"></a><span class="lineno"> 5601</span>&#160;    ItemType* PushBack(<span class="keyword">const</span> T&amp; value);</div>
+<div class="line"><a name="l05602"></a><span class="lineno"> 5602</span>&#160;    ItemType* PushFront(<span class="keyword">const</span> T&amp; value);</div>
+<div class="line"><a name="l05603"></a><span class="lineno"> 5603</span>&#160;    <span class="keywordtype">void</span> PopBack();</div>
+<div class="line"><a name="l05604"></a><span class="lineno"> 5604</span>&#160;    <span class="keywordtype">void</span> PopFront();</div>
+<div class="line"><a name="l05605"></a><span class="lineno"> 5605</span>&#160; </div>
+<div class="line"><a name="l05606"></a><span class="lineno"> 5606</span>&#160;    <span class="comment">// Item can be null - it means PushBack.</span></div>
+<div class="line"><a name="l05607"></a><span class="lineno"> 5607</span>&#160;    ItemType* InsertBefore(ItemType* pItem);</div>
+<div class="line"><a name="l05608"></a><span class="lineno"> 5608</span>&#160;    <span class="comment">// Item can be null - it means PushFront.</span></div>
+<div class="line"><a name="l05609"></a><span class="lineno"> 5609</span>&#160;    ItemType* InsertAfter(ItemType* pItem);</div>
+<div class="line"><a name="l05610"></a><span class="lineno"> 5610</span>&#160; </div>
+<div class="line"><a name="l05611"></a><span class="lineno"> 5611</span>&#160;    ItemType* InsertBefore(ItemType* pItem, <span class="keyword">const</span> T&amp; value);</div>
+<div class="line"><a name="l05612"></a><span class="lineno"> 5612</span>&#160;    ItemType* InsertAfter(ItemType* pItem, <span class="keyword">const</span> T&amp; value);</div>
+<div class="line"><a name="l05613"></a><span class="lineno"> 5613</span>&#160; </div>
+<div class="line"><a name="l05614"></a><span class="lineno"> 5614</span>&#160;    <span class="keywordtype">void</span> Remove(ItemType* pItem);</div>
+<div class="line"><a name="l05615"></a><span class="lineno"> 5615</span>&#160; </div>
+<div class="line"><a name="l05616"></a><span class="lineno"> 5616</span>&#160;<span class="keyword">private</span>:</div>
+<div class="line"><a name="l05617"></a><span class="lineno"> 5617</span>&#160;    <span class="keyword">const</span> VkAllocationCallbacks* <span class="keyword">const</span> m_pAllocationCallbacks;</div>
+<div class="line"><a name="l05618"></a><span class="lineno"> 5618</span>&#160;    VmaPoolAllocator&lt;ItemType&gt; m_ItemAllocator;</div>
+<div class="line"><a name="l05619"></a><span class="lineno"> 5619</span>&#160;    ItemType* m_pFront;</div>
+<div class="line"><a name="l05620"></a><span class="lineno"> 5620</span>&#160;    ItemType* m_pBack;</div>
+<div class="line"><a name="l05621"></a><span class="lineno"> 5621</span>&#160;    <span class="keywordtype">size_t</span> m_Count;</div>
+<div class="line"><a name="l05622"></a><span class="lineno"> 5622</span>&#160;};</div>
 <div class="line"><a name="l05623"></a><span class="lineno"> 5623</span>&#160; </div>
-<div class="line"><a name="l05624"></a><span class="lineno"> 5624</span>&#160;        iterator&amp; operator++()</div>
-<div class="line"><a name="l05625"></a><span class="lineno"> 5625</span>&#160;        {</div>
-<div class="line"><a name="l05626"></a><span class="lineno"> 5626</span>&#160;            VMA_HEAVY_ASSERT(m_pItem != VMA_NULL);</div>
-<div class="line"><a name="l05627"></a><span class="lineno"> 5627</span>&#160;            m_pItem = m_pItem-&gt;pNext;</div>
-<div class="line"><a name="l05628"></a><span class="lineno"> 5628</span>&#160;            <span class="keywordflow">return</span> *<span class="keyword">this</span>;</div>
-<div class="line"><a name="l05629"></a><span class="lineno"> 5629</span>&#160;        }</div>
-<div class="line"><a name="l05630"></a><span class="lineno"> 5630</span>&#160;        iterator&amp; operator--()</div>
-<div class="line"><a name="l05631"></a><span class="lineno"> 5631</span>&#160;        {</div>
-<div class="line"><a name="l05632"></a><span class="lineno"> 5632</span>&#160;            <span class="keywordflow">if</span>(m_pItem != VMA_NULL)</div>
-<div class="line"><a name="l05633"></a><span class="lineno"> 5633</span>&#160;            {</div>
-<div class="line"><a name="l05634"></a><span class="lineno"> 5634</span>&#160;                m_pItem = m_pItem-&gt;pPrev;</div>
-<div class="line"><a name="l05635"></a><span class="lineno"> 5635</span>&#160;            }</div>
-<div class="line"><a name="l05636"></a><span class="lineno"> 5636</span>&#160;            <span class="keywordflow">else</span></div>
-<div class="line"><a name="l05637"></a><span class="lineno"> 5637</span>&#160;            {</div>
-<div class="line"><a name="l05638"></a><span class="lineno"> 5638</span>&#160;                VMA_HEAVY_ASSERT(!m_pList-&gt;IsEmpty());</div>
-<div class="line"><a name="l05639"></a><span class="lineno"> 5639</span>&#160;                m_pItem = m_pList-&gt;Back();</div>
-<div class="line"><a name="l05640"></a><span class="lineno"> 5640</span>&#160;            }</div>
-<div class="line"><a name="l05641"></a><span class="lineno"> 5641</span>&#160;            <span class="keywordflow">return</span> *<span class="keyword">this</span>;</div>
-<div class="line"><a name="l05642"></a><span class="lineno"> 5642</span>&#160;        }</div>
-<div class="line"><a name="l05643"></a><span class="lineno"> 5643</span>&#160; </div>
-<div class="line"><a name="l05644"></a><span class="lineno"> 5644</span>&#160;        iterator operator++(<span class="keywordtype">int</span>)</div>
-<div class="line"><a name="l05645"></a><span class="lineno"> 5645</span>&#160;        {</div>
-<div class="line"><a name="l05646"></a><span class="lineno"> 5646</span>&#160;            iterator result = *<span class="keyword">this</span>;</div>
-<div class="line"><a name="l05647"></a><span class="lineno"> 5647</span>&#160;            ++*<span class="keyword">this</span>;</div>
-<div class="line"><a name="l05648"></a><span class="lineno"> 5648</span>&#160;            <span class="keywordflow">return</span> result;</div>
-<div class="line"><a name="l05649"></a><span class="lineno"> 5649</span>&#160;        }</div>
-<div class="line"><a name="l05650"></a><span class="lineno"> 5650</span>&#160;        iterator operator--(<span class="keywordtype">int</span>)</div>
-<div class="line"><a name="l05651"></a><span class="lineno"> 5651</span>&#160;        {</div>
-<div class="line"><a name="l05652"></a><span class="lineno"> 5652</span>&#160;            iterator result = *<span class="keyword">this</span>;</div>
-<div class="line"><a name="l05653"></a><span class="lineno"> 5653</span>&#160;            --*<span class="keyword">this</span>;</div>
-<div class="line"><a name="l05654"></a><span class="lineno"> 5654</span>&#160;            <span class="keywordflow">return</span> result;</div>
-<div class="line"><a name="l05655"></a><span class="lineno"> 5655</span>&#160;        }</div>
-<div class="line"><a name="l05656"></a><span class="lineno"> 5656</span>&#160; </div>
-<div class="line"><a name="l05657"></a><span class="lineno"> 5657</span>&#160;        <span class="keywordtype">bool</span> operator==(<span class="keyword">const</span> iterator&amp; rhs)<span class="keyword"> const</span></div>
-<div class="line"><a name="l05658"></a><span class="lineno"> 5658</span>&#160;<span class="keyword">        </span>{</div>
-<div class="line"><a name="l05659"></a><span class="lineno"> 5659</span>&#160;            VMA_HEAVY_ASSERT(m_pList == rhs.m_pList);</div>
-<div class="line"><a name="l05660"></a><span class="lineno"> 5660</span>&#160;            <span class="keywordflow">return</span> m_pItem == rhs.m_pItem;</div>
-<div class="line"><a name="l05661"></a><span class="lineno"> 5661</span>&#160;        }</div>
-<div class="line"><a name="l05662"></a><span class="lineno"> 5662</span>&#160;        <span class="keywordtype">bool</span> operator!=(<span class="keyword">const</span> iterator&amp; rhs)<span class="keyword"> const</span></div>
-<div class="line"><a name="l05663"></a><span class="lineno"> 5663</span>&#160;<span class="keyword">        </span>{</div>
-<div class="line"><a name="l05664"></a><span class="lineno"> 5664</span>&#160;            VMA_HEAVY_ASSERT(m_pList == rhs.m_pList);</div>
-<div class="line"><a name="l05665"></a><span class="lineno"> 5665</span>&#160;            <span class="keywordflow">return</span> m_pItem != rhs.m_pItem;</div>
-<div class="line"><a name="l05666"></a><span class="lineno"> 5666</span>&#160;        }</div>
-<div class="line"><a name="l05667"></a><span class="lineno"> 5667</span>&#160;        </div>
-<div class="line"><a name="l05668"></a><span class="lineno"> 5668</span>&#160;    <span class="keyword">private</span>:</div>
-<div class="line"><a name="l05669"></a><span class="lineno"> 5669</span>&#160;        VmaRawList&lt;T&gt;* m_pList;</div>
-<div class="line"><a name="l05670"></a><span class="lineno"> 5670</span>&#160;        VmaListItem&lt;T&gt;* m_pItem;</div>
-<div class="line"><a name="l05671"></a><span class="lineno"> 5671</span>&#160; </div>
-<div class="line"><a name="l05672"></a><span class="lineno"> 5672</span>&#160;        iterator(VmaRawList&lt;T&gt;* pList, VmaListItem&lt;T&gt;* pItem) :</div>
-<div class="line"><a name="l05673"></a><span class="lineno"> 5673</span>&#160;            m_pList(pList),</div>
-<div class="line"><a name="l05674"></a><span class="lineno"> 5674</span>&#160;            m_pItem(pItem)</div>
-<div class="line"><a name="l05675"></a><span class="lineno"> 5675</span>&#160;        {</div>
-<div class="line"><a name="l05676"></a><span class="lineno"> 5676</span>&#160;        }</div>
-<div class="line"><a name="l05677"></a><span class="lineno"> 5677</span>&#160; </div>
-<div class="line"><a name="l05678"></a><span class="lineno"> 5678</span>&#160;        <span class="keyword">friend</span> <span class="keyword">class </span>VmaList&lt;T, AllocatorT&gt;;</div>
-<div class="line"><a name="l05679"></a><span class="lineno"> 5679</span>&#160;    };</div>
+<div class="line"><a name="l05624"></a><span class="lineno"> 5624</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt;</div>
+<div class="line"><a name="l05625"></a><span class="lineno"> 5625</span>&#160;VmaRawList&lt;T&gt;::VmaRawList(<span class="keyword">const</span> VkAllocationCallbacks* pAllocationCallbacks) :</div>
+<div class="line"><a name="l05626"></a><span class="lineno"> 5626</span>&#160;    m_pAllocationCallbacks(pAllocationCallbacks),</div>
+<div class="line"><a name="l05627"></a><span class="lineno"> 5627</span>&#160;    m_ItemAllocator(pAllocationCallbacks, 128),</div>
+<div class="line"><a name="l05628"></a><span class="lineno"> 5628</span>&#160;    m_pFront(VMA_NULL),</div>
+<div class="line"><a name="l05629"></a><span class="lineno"> 5629</span>&#160;    m_pBack(VMA_NULL),</div>
+<div class="line"><a name="l05630"></a><span class="lineno"> 5630</span>&#160;    m_Count(0)</div>
+<div class="line"><a name="l05631"></a><span class="lineno"> 5631</span>&#160;{</div>
+<div class="line"><a name="l05632"></a><span class="lineno"> 5632</span>&#160;}</div>
+<div class="line"><a name="l05633"></a><span class="lineno"> 5633</span>&#160; </div>
+<div class="line"><a name="l05634"></a><span class="lineno"> 5634</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt;</div>
+<div class="line"><a name="l05635"></a><span class="lineno"> 5635</span>&#160;VmaRawList&lt;T&gt;::~VmaRawList()</div>
+<div class="line"><a name="l05636"></a><span class="lineno"> 5636</span>&#160;{</div>
+<div class="line"><a name="l05637"></a><span class="lineno"> 5637</span>&#160;    <span class="comment">// Intentionally not calling Clear, because that would be unnecessary</span></div>
+<div class="line"><a name="l05638"></a><span class="lineno"> 5638</span>&#160;    <span class="comment">// computations to return all items to m_ItemAllocator as free.</span></div>
+<div class="line"><a name="l05639"></a><span class="lineno"> 5639</span>&#160;}</div>
+<div class="line"><a name="l05640"></a><span class="lineno"> 5640</span>&#160; </div>
+<div class="line"><a name="l05641"></a><span class="lineno"> 5641</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt;</div>
+<div class="line"><a name="l05642"></a><span class="lineno"> 5642</span>&#160;<span class="keywordtype">void</span> VmaRawList&lt;T&gt;::Clear()</div>
+<div class="line"><a name="l05643"></a><span class="lineno"> 5643</span>&#160;{</div>
+<div class="line"><a name="l05644"></a><span class="lineno"> 5644</span>&#160;    <span class="keywordflow">if</span>(IsEmpty() == <span class="keyword">false</span>)</div>
+<div class="line"><a name="l05645"></a><span class="lineno"> 5645</span>&#160;    {</div>
+<div class="line"><a name="l05646"></a><span class="lineno"> 5646</span>&#160;        ItemType* pItem = m_pBack;</div>
+<div class="line"><a name="l05647"></a><span class="lineno"> 5647</span>&#160;        <span class="keywordflow">while</span>(pItem != VMA_NULL)</div>
+<div class="line"><a name="l05648"></a><span class="lineno"> 5648</span>&#160;        {</div>
+<div class="line"><a name="l05649"></a><span class="lineno"> 5649</span>&#160;            ItemType* <span class="keyword">const</span> pPrevItem = pItem-&gt;pPrev;</div>
+<div class="line"><a name="l05650"></a><span class="lineno"> 5650</span>&#160;            m_ItemAllocator.Free(pItem);</div>
+<div class="line"><a name="l05651"></a><span class="lineno"> 5651</span>&#160;            pItem = pPrevItem;</div>
+<div class="line"><a name="l05652"></a><span class="lineno"> 5652</span>&#160;        }</div>
+<div class="line"><a name="l05653"></a><span class="lineno"> 5653</span>&#160;        m_pFront = VMA_NULL;</div>
+<div class="line"><a name="l05654"></a><span class="lineno"> 5654</span>&#160;        m_pBack = VMA_NULL;</div>
+<div class="line"><a name="l05655"></a><span class="lineno"> 5655</span>&#160;        m_Count = 0;</div>
+<div class="line"><a name="l05656"></a><span class="lineno"> 5656</span>&#160;    }</div>
+<div class="line"><a name="l05657"></a><span class="lineno"> 5657</span>&#160;}</div>
+<div class="line"><a name="l05658"></a><span class="lineno"> 5658</span>&#160; </div>
+<div class="line"><a name="l05659"></a><span class="lineno"> 5659</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt;</div>
+<div class="line"><a name="l05660"></a><span class="lineno"> 5660</span>&#160;VmaListItem&lt;T&gt;* VmaRawList&lt;T&gt;::PushBack()</div>
+<div class="line"><a name="l05661"></a><span class="lineno"> 5661</span>&#160;{</div>
+<div class="line"><a name="l05662"></a><span class="lineno"> 5662</span>&#160;    ItemType* <span class="keyword">const</span> pNewItem = m_ItemAllocator.Alloc();</div>
+<div class="line"><a name="l05663"></a><span class="lineno"> 5663</span>&#160;    pNewItem-&gt;pNext = VMA_NULL;</div>
+<div class="line"><a name="l05664"></a><span class="lineno"> 5664</span>&#160;    <span class="keywordflow">if</span>(IsEmpty())</div>
+<div class="line"><a name="l05665"></a><span class="lineno"> 5665</span>&#160;    {</div>
+<div class="line"><a name="l05666"></a><span class="lineno"> 5666</span>&#160;        pNewItem-&gt;pPrev = VMA_NULL;</div>
+<div class="line"><a name="l05667"></a><span class="lineno"> 5667</span>&#160;        m_pFront = pNewItem;</div>
+<div class="line"><a name="l05668"></a><span class="lineno"> 5668</span>&#160;        m_pBack = pNewItem;</div>
+<div class="line"><a name="l05669"></a><span class="lineno"> 5669</span>&#160;        m_Count = 1;</div>
+<div class="line"><a name="l05670"></a><span class="lineno"> 5670</span>&#160;    }</div>
+<div class="line"><a name="l05671"></a><span class="lineno"> 5671</span>&#160;    <span class="keywordflow">else</span></div>
+<div class="line"><a name="l05672"></a><span class="lineno"> 5672</span>&#160;    {</div>
+<div class="line"><a name="l05673"></a><span class="lineno"> 5673</span>&#160;        pNewItem-&gt;pPrev = m_pBack;</div>
+<div class="line"><a name="l05674"></a><span class="lineno"> 5674</span>&#160;        m_pBack-&gt;pNext = pNewItem;</div>
+<div class="line"><a name="l05675"></a><span class="lineno"> 5675</span>&#160;        m_pBack = pNewItem;</div>
+<div class="line"><a name="l05676"></a><span class="lineno"> 5676</span>&#160;        ++m_Count;</div>
+<div class="line"><a name="l05677"></a><span class="lineno"> 5677</span>&#160;    }</div>
+<div class="line"><a name="l05678"></a><span class="lineno"> 5678</span>&#160;    <span class="keywordflow">return</span> pNewItem;</div>
+<div class="line"><a name="l05679"></a><span class="lineno"> 5679</span>&#160;}</div>
 <div class="line"><a name="l05680"></a><span class="lineno"> 5680</span>&#160; </div>
-<div class="line"><a name="l05681"></a><span class="lineno"> 5681</span>&#160;    <span class="keyword">class </span>const_iterator</div>
-<div class="line"><a name="l05682"></a><span class="lineno"> 5682</span>&#160;    {</div>
-<div class="line"><a name="l05683"></a><span class="lineno"> 5683</span>&#160;    <span class="keyword">public</span>:</div>
-<div class="line"><a name="l05684"></a><span class="lineno"> 5684</span>&#160;        const_iterator() :</div>
-<div class="line"><a name="l05685"></a><span class="lineno"> 5685</span>&#160;            m_pList(VMA_NULL),</div>
-<div class="line"><a name="l05686"></a><span class="lineno"> 5686</span>&#160;            m_pItem(VMA_NULL)</div>
-<div class="line"><a name="l05687"></a><span class="lineno"> 5687</span>&#160;        {</div>
-<div class="line"><a name="l05688"></a><span class="lineno"> 5688</span>&#160;        }</div>
-<div class="line"><a name="l05689"></a><span class="lineno"> 5689</span>&#160; </div>
-<div class="line"><a name="l05690"></a><span class="lineno"> 5690</span>&#160;        const_iterator(<span class="keyword">const</span> iterator&amp; src) :</div>
-<div class="line"><a name="l05691"></a><span class="lineno"> 5691</span>&#160;            m_pList(src.m_pList),</div>
-<div class="line"><a name="l05692"></a><span class="lineno"> 5692</span>&#160;            m_pItem(src.m_pItem)</div>
-<div class="line"><a name="l05693"></a><span class="lineno"> 5693</span>&#160;        {</div>
-<div class="line"><a name="l05694"></a><span class="lineno"> 5694</span>&#160;        }</div>
-<div class="line"><a name="l05695"></a><span class="lineno"> 5695</span>&#160;        </div>
-<div class="line"><a name="l05696"></a><span class="lineno"> 5696</span>&#160;        <span class="keyword">const</span> T&amp; operator*()<span class="keyword"> const</span></div>
-<div class="line"><a name="l05697"></a><span class="lineno"> 5697</span>&#160;<span class="keyword">        </span>{</div>
-<div class="line"><a name="l05698"></a><span class="lineno"> 5698</span>&#160;            VMA_HEAVY_ASSERT(m_pItem != VMA_NULL);</div>
-<div class="line"><a name="l05699"></a><span class="lineno"> 5699</span>&#160;            <span class="keywordflow">return</span> m_pItem-&gt;Value;</div>
-<div class="line"><a name="l05700"></a><span class="lineno"> 5700</span>&#160;        }</div>
-<div class="line"><a name="l05701"></a><span class="lineno"> 5701</span>&#160;        <span class="keyword">const</span> T* operator-&gt;()<span class="keyword"> const</span></div>
-<div class="line"><a name="l05702"></a><span class="lineno"> 5702</span>&#160;<span class="keyword">        </span>{</div>
-<div class="line"><a name="l05703"></a><span class="lineno"> 5703</span>&#160;            VMA_HEAVY_ASSERT(m_pItem != VMA_NULL);</div>
-<div class="line"><a name="l05704"></a><span class="lineno"> 5704</span>&#160;            <span class="keywordflow">return</span> &amp;m_pItem-&gt;Value;</div>
-<div class="line"><a name="l05705"></a><span class="lineno"> 5705</span>&#160;        }</div>
-<div class="line"><a name="l05706"></a><span class="lineno"> 5706</span>&#160; </div>
-<div class="line"><a name="l05707"></a><span class="lineno"> 5707</span>&#160;        const_iterator&amp; operator++()</div>
-<div class="line"><a name="l05708"></a><span class="lineno"> 5708</span>&#160;        {</div>
-<div class="line"><a name="l05709"></a><span class="lineno"> 5709</span>&#160;            VMA_HEAVY_ASSERT(m_pItem != VMA_NULL);</div>
-<div class="line"><a name="l05710"></a><span class="lineno"> 5710</span>&#160;            m_pItem = m_pItem-&gt;pNext;</div>
-<div class="line"><a name="l05711"></a><span class="lineno"> 5711</span>&#160;            <span class="keywordflow">return</span> *<span class="keyword">this</span>;</div>
-<div class="line"><a name="l05712"></a><span class="lineno"> 5712</span>&#160;        }</div>
-<div class="line"><a name="l05713"></a><span class="lineno"> 5713</span>&#160;        const_iterator&amp; operator--()</div>
-<div class="line"><a name="l05714"></a><span class="lineno"> 5714</span>&#160;        {</div>
-<div class="line"><a name="l05715"></a><span class="lineno"> 5715</span>&#160;            <span class="keywordflow">if</span>(m_pItem != VMA_NULL)</div>
-<div class="line"><a name="l05716"></a><span class="lineno"> 5716</span>&#160;            {</div>
-<div class="line"><a name="l05717"></a><span class="lineno"> 5717</span>&#160;                m_pItem = m_pItem-&gt;pPrev;</div>
-<div class="line"><a name="l05718"></a><span class="lineno"> 5718</span>&#160;            }</div>
-<div class="line"><a name="l05719"></a><span class="lineno"> 5719</span>&#160;            <span class="keywordflow">else</span></div>
-<div class="line"><a name="l05720"></a><span class="lineno"> 5720</span>&#160;            {</div>
-<div class="line"><a name="l05721"></a><span class="lineno"> 5721</span>&#160;                VMA_HEAVY_ASSERT(!m_pList-&gt;IsEmpty());</div>
-<div class="line"><a name="l05722"></a><span class="lineno"> 5722</span>&#160;                m_pItem = m_pList-&gt;Back();</div>
-<div class="line"><a name="l05723"></a><span class="lineno"> 5723</span>&#160;            }</div>
-<div class="line"><a name="l05724"></a><span class="lineno"> 5724</span>&#160;            <span class="keywordflow">return</span> *<span class="keyword">this</span>;</div>
-<div class="line"><a name="l05725"></a><span class="lineno"> 5725</span>&#160;        }</div>
-<div class="line"><a name="l05726"></a><span class="lineno"> 5726</span>&#160; </div>
-<div class="line"><a name="l05727"></a><span class="lineno"> 5727</span>&#160;        const_iterator operator++(<span class="keywordtype">int</span>)</div>
-<div class="line"><a name="l05728"></a><span class="lineno"> 5728</span>&#160;        {</div>
-<div class="line"><a name="l05729"></a><span class="lineno"> 5729</span>&#160;            const_iterator result = *<span class="keyword">this</span>;</div>
-<div class="line"><a name="l05730"></a><span class="lineno"> 5730</span>&#160;            ++*<span class="keyword">this</span>;</div>
-<div class="line"><a name="l05731"></a><span class="lineno"> 5731</span>&#160;            <span class="keywordflow">return</span> result;</div>
-<div class="line"><a name="l05732"></a><span class="lineno"> 5732</span>&#160;        }</div>
-<div class="line"><a name="l05733"></a><span class="lineno"> 5733</span>&#160;        const_iterator operator--(<span class="keywordtype">int</span>)</div>
-<div class="line"><a name="l05734"></a><span class="lineno"> 5734</span>&#160;        {</div>
-<div class="line"><a name="l05735"></a><span class="lineno"> 5735</span>&#160;            const_iterator result = *<span class="keyword">this</span>;</div>
-<div class="line"><a name="l05736"></a><span class="lineno"> 5736</span>&#160;            --*<span class="keyword">this</span>;</div>
-<div class="line"><a name="l05737"></a><span class="lineno"> 5737</span>&#160;            <span class="keywordflow">return</span> result;</div>
-<div class="line"><a name="l05738"></a><span class="lineno"> 5738</span>&#160;        }</div>
-<div class="line"><a name="l05739"></a><span class="lineno"> 5739</span>&#160; </div>
-<div class="line"><a name="l05740"></a><span class="lineno"> 5740</span>&#160;        <span class="keywordtype">bool</span> operator==(<span class="keyword">const</span> const_iterator&amp; rhs)<span class="keyword"> const</span></div>
-<div class="line"><a name="l05741"></a><span class="lineno"> 5741</span>&#160;<span class="keyword">        </span>{</div>
-<div class="line"><a name="l05742"></a><span class="lineno"> 5742</span>&#160;            VMA_HEAVY_ASSERT(m_pList == rhs.m_pList);</div>
-<div class="line"><a name="l05743"></a><span class="lineno"> 5743</span>&#160;            <span class="keywordflow">return</span> m_pItem == rhs.m_pItem;</div>
-<div class="line"><a name="l05744"></a><span class="lineno"> 5744</span>&#160;        }</div>
-<div class="line"><a name="l05745"></a><span class="lineno"> 5745</span>&#160;        <span class="keywordtype">bool</span> operator!=(<span class="keyword">const</span> const_iterator&amp; rhs)<span class="keyword"> const</span></div>
-<div class="line"><a name="l05746"></a><span class="lineno"> 5746</span>&#160;<span class="keyword">        </span>{</div>
-<div class="line"><a name="l05747"></a><span class="lineno"> 5747</span>&#160;            VMA_HEAVY_ASSERT(m_pList == rhs.m_pList);</div>
-<div class="line"><a name="l05748"></a><span class="lineno"> 5748</span>&#160;            <span class="keywordflow">return</span> m_pItem != rhs.m_pItem;</div>
-<div class="line"><a name="l05749"></a><span class="lineno"> 5749</span>&#160;        }</div>
-<div class="line"><a name="l05750"></a><span class="lineno"> 5750</span>&#160;        </div>
-<div class="line"><a name="l05751"></a><span class="lineno"> 5751</span>&#160;    <span class="keyword">private</span>:</div>
-<div class="line"><a name="l05752"></a><span class="lineno"> 5752</span>&#160;        const_iterator(<span class="keyword">const</span> VmaRawList&lt;T&gt;* pList, <span class="keyword">const</span> VmaListItem&lt;T&gt;* pItem) :</div>
-<div class="line"><a name="l05753"></a><span class="lineno"> 5753</span>&#160;            m_pList(pList),</div>
-<div class="line"><a name="l05754"></a><span class="lineno"> 5754</span>&#160;            m_pItem(pItem)</div>
-<div class="line"><a name="l05755"></a><span class="lineno"> 5755</span>&#160;        {</div>
-<div class="line"><a name="l05756"></a><span class="lineno"> 5756</span>&#160;        }</div>
-<div class="line"><a name="l05757"></a><span class="lineno"> 5757</span>&#160; </div>
-<div class="line"><a name="l05758"></a><span class="lineno"> 5758</span>&#160;        <span class="keyword">const</span> VmaRawList&lt;T&gt;* m_pList;</div>
-<div class="line"><a name="l05759"></a><span class="lineno"> 5759</span>&#160;        <span class="keyword">const</span> VmaListItem&lt;T&gt;* m_pItem;</div>
-<div class="line"><a name="l05760"></a><span class="lineno"> 5760</span>&#160; </div>
-<div class="line"><a name="l05761"></a><span class="lineno"> 5761</span>&#160;        <span class="keyword">friend</span> <span class="keyword">class </span>VmaList&lt;T, AllocatorT&gt;;</div>
-<div class="line"><a name="l05762"></a><span class="lineno"> 5762</span>&#160;    };</div>
-<div class="line"><a name="l05763"></a><span class="lineno"> 5763</span>&#160; </div>
-<div class="line"><a name="l05764"></a><span class="lineno"> 5764</span>&#160;    VmaList(<span class="keyword">const</span> AllocatorT&amp; allocator) : m_RawList(allocator.m_pCallbacks) { }</div>
-<div class="line"><a name="l05765"></a><span class="lineno"> 5765</span>&#160; </div>
-<div class="line"><a name="l05766"></a><span class="lineno"> 5766</span>&#160;    <span class="keywordtype">bool</span> empty()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_RawList.IsEmpty(); }</div>
-<div class="line"><a name="l05767"></a><span class="lineno"> 5767</span>&#160;    <span class="keywordtype">size_t</span> size()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_RawList.GetCount(); }</div>
-<div class="line"><a name="l05768"></a><span class="lineno"> 5768</span>&#160; </div>
-<div class="line"><a name="l05769"></a><span class="lineno"> 5769</span>&#160;    iterator begin() { <span class="keywordflow">return</span> iterator(&amp;m_RawList, m_RawList.Front()); }</div>
-<div class="line"><a name="l05770"></a><span class="lineno"> 5770</span>&#160;    iterator end() { <span class="keywordflow">return</span> iterator(&amp;m_RawList, VMA_NULL); }</div>
-<div class="line"><a name="l05771"></a><span class="lineno"> 5771</span>&#160; </div>
-<div class="line"><a name="l05772"></a><span class="lineno"> 5772</span>&#160;    const_iterator cbegin()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> const_iterator(&amp;m_RawList, m_RawList.Front()); }</div>
-<div class="line"><a name="l05773"></a><span class="lineno"> 5773</span>&#160;    const_iterator cend()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> const_iterator(&amp;m_RawList, VMA_NULL); }</div>
+<div class="line"><a name="l05681"></a><span class="lineno"> 5681</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt;</div>
+<div class="line"><a name="l05682"></a><span class="lineno"> 5682</span>&#160;VmaListItem&lt;T&gt;* VmaRawList&lt;T&gt;::PushFront()</div>
+<div class="line"><a name="l05683"></a><span class="lineno"> 5683</span>&#160;{</div>
+<div class="line"><a name="l05684"></a><span class="lineno"> 5684</span>&#160;    ItemType* <span class="keyword">const</span> pNewItem = m_ItemAllocator.Alloc();</div>
+<div class="line"><a name="l05685"></a><span class="lineno"> 5685</span>&#160;    pNewItem-&gt;pPrev = VMA_NULL;</div>
+<div class="line"><a name="l05686"></a><span class="lineno"> 5686</span>&#160;    <span class="keywordflow">if</span>(IsEmpty())</div>
+<div class="line"><a name="l05687"></a><span class="lineno"> 5687</span>&#160;    {</div>
+<div class="line"><a name="l05688"></a><span class="lineno"> 5688</span>&#160;        pNewItem-&gt;pNext = VMA_NULL;</div>
+<div class="line"><a name="l05689"></a><span class="lineno"> 5689</span>&#160;        m_pFront = pNewItem;</div>
+<div class="line"><a name="l05690"></a><span class="lineno"> 5690</span>&#160;        m_pBack = pNewItem;</div>
+<div class="line"><a name="l05691"></a><span class="lineno"> 5691</span>&#160;        m_Count = 1;</div>
+<div class="line"><a name="l05692"></a><span class="lineno"> 5692</span>&#160;    }</div>
+<div class="line"><a name="l05693"></a><span class="lineno"> 5693</span>&#160;    <span class="keywordflow">else</span></div>
+<div class="line"><a name="l05694"></a><span class="lineno"> 5694</span>&#160;    {</div>
+<div class="line"><a name="l05695"></a><span class="lineno"> 5695</span>&#160;        pNewItem-&gt;pNext = m_pFront;</div>
+<div class="line"><a name="l05696"></a><span class="lineno"> 5696</span>&#160;        m_pFront-&gt;pPrev = pNewItem;</div>
+<div class="line"><a name="l05697"></a><span class="lineno"> 5697</span>&#160;        m_pFront = pNewItem;</div>
+<div class="line"><a name="l05698"></a><span class="lineno"> 5698</span>&#160;        ++m_Count;</div>
+<div class="line"><a name="l05699"></a><span class="lineno"> 5699</span>&#160;    }</div>
+<div class="line"><a name="l05700"></a><span class="lineno"> 5700</span>&#160;    <span class="keywordflow">return</span> pNewItem;</div>
+<div class="line"><a name="l05701"></a><span class="lineno"> 5701</span>&#160;}</div>
+<div class="line"><a name="l05702"></a><span class="lineno"> 5702</span>&#160; </div>
+<div class="line"><a name="l05703"></a><span class="lineno"> 5703</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt;</div>
+<div class="line"><a name="l05704"></a><span class="lineno"> 5704</span>&#160;VmaListItem&lt;T&gt;* VmaRawList&lt;T&gt;::PushBack(<span class="keyword">const</span> T&amp; value)</div>
+<div class="line"><a name="l05705"></a><span class="lineno"> 5705</span>&#160;{</div>
+<div class="line"><a name="l05706"></a><span class="lineno"> 5706</span>&#160;    ItemType* <span class="keyword">const</span> pNewItem = PushBack();</div>
+<div class="line"><a name="l05707"></a><span class="lineno"> 5707</span>&#160;    pNewItem-&gt;Value = value;</div>
+<div class="line"><a name="l05708"></a><span class="lineno"> 5708</span>&#160;    <span class="keywordflow">return</span> pNewItem;</div>
+<div class="line"><a name="l05709"></a><span class="lineno"> 5709</span>&#160;}</div>
+<div class="line"><a name="l05710"></a><span class="lineno"> 5710</span>&#160; </div>
+<div class="line"><a name="l05711"></a><span class="lineno"> 5711</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt;</div>
+<div class="line"><a name="l05712"></a><span class="lineno"> 5712</span>&#160;VmaListItem&lt;T&gt;* VmaRawList&lt;T&gt;::PushFront(<span class="keyword">const</span> T&amp; value)</div>
+<div class="line"><a name="l05713"></a><span class="lineno"> 5713</span>&#160;{</div>
+<div class="line"><a name="l05714"></a><span class="lineno"> 5714</span>&#160;    ItemType* <span class="keyword">const</span> pNewItem = PushFront();</div>
+<div class="line"><a name="l05715"></a><span class="lineno"> 5715</span>&#160;    pNewItem-&gt;Value = value;</div>
+<div class="line"><a name="l05716"></a><span class="lineno"> 5716</span>&#160;    <span class="keywordflow">return</span> pNewItem;</div>
+<div class="line"><a name="l05717"></a><span class="lineno"> 5717</span>&#160;}</div>
+<div class="line"><a name="l05718"></a><span class="lineno"> 5718</span>&#160; </div>
+<div class="line"><a name="l05719"></a><span class="lineno"> 5719</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt;</div>
+<div class="line"><a name="l05720"></a><span class="lineno"> 5720</span>&#160;<span class="keywordtype">void</span> VmaRawList&lt;T&gt;::PopBack()</div>
+<div class="line"><a name="l05721"></a><span class="lineno"> 5721</span>&#160;{</div>
+<div class="line"><a name="l05722"></a><span class="lineno"> 5722</span>&#160;    VMA_HEAVY_ASSERT(m_Count &gt; 0);</div>
+<div class="line"><a name="l05723"></a><span class="lineno"> 5723</span>&#160;    ItemType* <span class="keyword">const</span> pBackItem = m_pBack;</div>
+<div class="line"><a name="l05724"></a><span class="lineno"> 5724</span>&#160;    ItemType* <span class="keyword">const</span> pPrevItem = pBackItem-&gt;pPrev;</div>
+<div class="line"><a name="l05725"></a><span class="lineno"> 5725</span>&#160;    <span class="keywordflow">if</span>(pPrevItem != VMA_NULL)</div>
+<div class="line"><a name="l05726"></a><span class="lineno"> 5726</span>&#160;    {</div>
+<div class="line"><a name="l05727"></a><span class="lineno"> 5727</span>&#160;        pPrevItem-&gt;pNext = VMA_NULL;</div>
+<div class="line"><a name="l05728"></a><span class="lineno"> 5728</span>&#160;    }</div>
+<div class="line"><a name="l05729"></a><span class="lineno"> 5729</span>&#160;    m_pBack = pPrevItem;</div>
+<div class="line"><a name="l05730"></a><span class="lineno"> 5730</span>&#160;    m_ItemAllocator.Free(pBackItem);</div>
+<div class="line"><a name="l05731"></a><span class="lineno"> 5731</span>&#160;    --m_Count;</div>
+<div class="line"><a name="l05732"></a><span class="lineno"> 5732</span>&#160;}</div>
+<div class="line"><a name="l05733"></a><span class="lineno"> 5733</span>&#160; </div>
+<div class="line"><a name="l05734"></a><span class="lineno"> 5734</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt;</div>
+<div class="line"><a name="l05735"></a><span class="lineno"> 5735</span>&#160;<span class="keywordtype">void</span> VmaRawList&lt;T&gt;::PopFront()</div>
+<div class="line"><a name="l05736"></a><span class="lineno"> 5736</span>&#160;{</div>
+<div class="line"><a name="l05737"></a><span class="lineno"> 5737</span>&#160;    VMA_HEAVY_ASSERT(m_Count &gt; 0);</div>
+<div class="line"><a name="l05738"></a><span class="lineno"> 5738</span>&#160;    ItemType* <span class="keyword">const</span> pFrontItem = m_pFront;</div>
+<div class="line"><a name="l05739"></a><span class="lineno"> 5739</span>&#160;    ItemType* <span class="keyword">const</span> pNextItem = pFrontItem-&gt;pNext;</div>
+<div class="line"><a name="l05740"></a><span class="lineno"> 5740</span>&#160;    <span class="keywordflow">if</span>(pNextItem != VMA_NULL)</div>
+<div class="line"><a name="l05741"></a><span class="lineno"> 5741</span>&#160;    {</div>
+<div class="line"><a name="l05742"></a><span class="lineno"> 5742</span>&#160;        pNextItem-&gt;pPrev = VMA_NULL;</div>
+<div class="line"><a name="l05743"></a><span class="lineno"> 5743</span>&#160;    }</div>
+<div class="line"><a name="l05744"></a><span class="lineno"> 5744</span>&#160;    m_pFront = pNextItem;</div>
+<div class="line"><a name="l05745"></a><span class="lineno"> 5745</span>&#160;    m_ItemAllocator.Free(pFrontItem);</div>
+<div class="line"><a name="l05746"></a><span class="lineno"> 5746</span>&#160;    --m_Count;</div>
+<div class="line"><a name="l05747"></a><span class="lineno"> 5747</span>&#160;}</div>
+<div class="line"><a name="l05748"></a><span class="lineno"> 5748</span>&#160; </div>
+<div class="line"><a name="l05749"></a><span class="lineno"> 5749</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt;</div>
+<div class="line"><a name="l05750"></a><span class="lineno"> 5750</span>&#160;<span class="keywordtype">void</span> VmaRawList&lt;T&gt;::Remove(ItemType* pItem)</div>
+<div class="line"><a name="l05751"></a><span class="lineno"> 5751</span>&#160;{</div>
+<div class="line"><a name="l05752"></a><span class="lineno"> 5752</span>&#160;    VMA_HEAVY_ASSERT(pItem != VMA_NULL);</div>
+<div class="line"><a name="l05753"></a><span class="lineno"> 5753</span>&#160;    VMA_HEAVY_ASSERT(m_Count &gt; 0);</div>
+<div class="line"><a name="l05754"></a><span class="lineno"> 5754</span>&#160; </div>
+<div class="line"><a name="l05755"></a><span class="lineno"> 5755</span>&#160;    <span class="keywordflow">if</span>(pItem-&gt;pPrev != VMA_NULL)</div>
+<div class="line"><a name="l05756"></a><span class="lineno"> 5756</span>&#160;    {</div>
+<div class="line"><a name="l05757"></a><span class="lineno"> 5757</span>&#160;        pItem-&gt;pPrev-&gt;pNext = pItem-&gt;pNext;</div>
+<div class="line"><a name="l05758"></a><span class="lineno"> 5758</span>&#160;    }</div>
+<div class="line"><a name="l05759"></a><span class="lineno"> 5759</span>&#160;    <span class="keywordflow">else</span></div>
+<div class="line"><a name="l05760"></a><span class="lineno"> 5760</span>&#160;    {</div>
+<div class="line"><a name="l05761"></a><span class="lineno"> 5761</span>&#160;        VMA_HEAVY_ASSERT(m_pFront == pItem);</div>
+<div class="line"><a name="l05762"></a><span class="lineno"> 5762</span>&#160;        m_pFront = pItem-&gt;pNext;</div>
+<div class="line"><a name="l05763"></a><span class="lineno"> 5763</span>&#160;    }</div>
+<div class="line"><a name="l05764"></a><span class="lineno"> 5764</span>&#160; </div>
+<div class="line"><a name="l05765"></a><span class="lineno"> 5765</span>&#160;    <span class="keywordflow">if</span>(pItem-&gt;pNext != VMA_NULL)</div>
+<div class="line"><a name="l05766"></a><span class="lineno"> 5766</span>&#160;    {</div>
+<div class="line"><a name="l05767"></a><span class="lineno"> 5767</span>&#160;        pItem-&gt;pNext-&gt;pPrev = pItem-&gt;pPrev;</div>
+<div class="line"><a name="l05768"></a><span class="lineno"> 5768</span>&#160;    }</div>
+<div class="line"><a name="l05769"></a><span class="lineno"> 5769</span>&#160;    <span class="keywordflow">else</span></div>
+<div class="line"><a name="l05770"></a><span class="lineno"> 5770</span>&#160;    {</div>
+<div class="line"><a name="l05771"></a><span class="lineno"> 5771</span>&#160;        VMA_HEAVY_ASSERT(m_pBack == pItem);</div>
+<div class="line"><a name="l05772"></a><span class="lineno"> 5772</span>&#160;        m_pBack = pItem-&gt;pPrev;</div>
+<div class="line"><a name="l05773"></a><span class="lineno"> 5773</span>&#160;    }</div>
 <div class="line"><a name="l05774"></a><span class="lineno"> 5774</span>&#160; </div>
-<div class="line"><a name="l05775"></a><span class="lineno"> 5775</span>&#160;    <span class="keywordtype">void</span> clear() { m_RawList.Clear(); }</div>
-<div class="line"><a name="l05776"></a><span class="lineno"> 5776</span>&#160;    <span class="keywordtype">void</span> push_back(<span class="keyword">const</span> T&amp; value) { m_RawList.PushBack(value); }</div>
-<div class="line"><a name="l05777"></a><span class="lineno"> 5777</span>&#160;    <span class="keywordtype">void</span> erase(iterator it) { m_RawList.Remove(it.m_pItem); }</div>
-<div class="line"><a name="l05778"></a><span class="lineno"> 5778</span>&#160;    iterator insert(iterator it, <span class="keyword">const</span> T&amp; value) { <span class="keywordflow">return</span> iterator(&amp;m_RawList, m_RawList.InsertBefore(it.m_pItem, value)); }</div>
-<div class="line"><a name="l05779"></a><span class="lineno"> 5779</span>&#160; </div>
-<div class="line"><a name="l05780"></a><span class="lineno"> 5780</span>&#160;<span class="keyword">private</span>:</div>
-<div class="line"><a name="l05781"></a><span class="lineno"> 5781</span>&#160;    VmaRawList&lt;T&gt; m_RawList;</div>
-<div class="line"><a name="l05782"></a><span class="lineno"> 5782</span>&#160;};</div>
-<div class="line"><a name="l05783"></a><span class="lineno"> 5783</span>&#160; </div>
-<div class="line"><a name="l05784"></a><span class="lineno"> 5784</span>&#160;<span class="preprocessor">#endif // #if VMA_USE_STL_LIST</span></div>
-<div class="line"><a name="l05785"></a><span class="lineno"> 5785</span>&#160; </div>
-<div class="line"><a name="l05787"></a><span class="lineno"> 5787</span>&#160;<span class="comment">// class VmaMap</span></div>
-<div class="line"><a name="l05788"></a><span class="lineno"> 5788</span>&#160; </div>
-<div class="line"><a name="l05789"></a><span class="lineno"> 5789</span>&#160;<span class="comment">// Unused in this version.</span></div>
-<div class="line"><a name="l05790"></a><span class="lineno"> 5790</span>&#160;<span class="preprocessor">#if 0</span></div>
-<div class="line"><a name="l05791"></a><span class="lineno"> 5791</span>&#160; </div>
-<div class="line"><a name="l05792"></a><span class="lineno"> 5792</span>&#160;<span class="preprocessor">#if VMA_USE_STL_UNORDERED_MAP</span></div>
-<div class="line"><a name="l05793"></a><span class="lineno"> 5793</span>&#160; </div>
-<div class="line"><a name="l05794"></a><span class="lineno"> 5794</span>&#160;<span class="preprocessor">#define VmaPair std::pair</span></div>
-<div class="line"><a name="l05795"></a><span class="lineno"> 5795</span>&#160; </div>
-<div class="line"><a name="l05796"></a><span class="lineno"> 5796</span>&#160;<span class="preprocessor">#define VMA_MAP_TYPE(KeyT, ValueT) \</span></div>
-<div class="line"><a name="l05797"></a><span class="lineno"> 5797</span>&#160;<span class="preprocessor">    std::unordered_map&lt; KeyT, ValueT, std::hash&lt;KeyT&gt;, std::equal_to&lt;KeyT&gt;, VmaStlAllocator&lt; std::pair&lt;KeyT, ValueT&gt; &gt; &gt;</span></div>
-<div class="line"><a name="l05798"></a><span class="lineno"> 5798</span>&#160; </div>
-<div class="line"><a name="l05799"></a><span class="lineno"> 5799</span>&#160;<span class="preprocessor">#else // #if VMA_USE_STL_UNORDERED_MAP</span></div>
-<div class="line"><a name="l05800"></a><span class="lineno"> 5800</span>&#160; </div>
-<div class="line"><a name="l05801"></a><span class="lineno"> 5801</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> T1, <span class="keyword">typename</span> T2&gt;</div>
-<div class="line"><a name="l05802"></a><span class="lineno"> 5802</span>&#160;<span class="keyword">struct </span>VmaPair</div>
-<div class="line"><a name="l05803"></a><span class="lineno"> 5803</span>&#160;{</div>
-<div class="line"><a name="l05804"></a><span class="lineno"> 5804</span>&#160;    T1 first;</div>
-<div class="line"><a name="l05805"></a><span class="lineno"> 5805</span>&#160;    T2 second;</div>
-<div class="line"><a name="l05806"></a><span class="lineno"> 5806</span>&#160; </div>
-<div class="line"><a name="l05807"></a><span class="lineno"> 5807</span>&#160;    VmaPair() : first(), second() { }</div>
-<div class="line"><a name="l05808"></a><span class="lineno"> 5808</span>&#160;    VmaPair(<span class="keyword">const</span> T1&amp; firstSrc, <span class="keyword">const</span> T2&amp; secondSrc) : first(firstSrc), second(secondSrc) { }</div>
-<div class="line"><a name="l05809"></a><span class="lineno"> 5809</span>&#160;};</div>
-<div class="line"><a name="l05810"></a><span class="lineno"> 5810</span>&#160; </div>
-<div class="line"><a name="l05811"></a><span class="lineno"> 5811</span>&#160;<span class="comment">/* Class compatible with subset of interface of std::unordered_map.</span></div>
-<div class="line"><a name="l05812"></a><span class="lineno"> 5812</span>&#160;<span class="comment">KeyT, ValueT must be POD because they will be stored in VmaVector.</span></div>
-<div class="line"><a name="l05813"></a><span class="lineno"> 5813</span>&#160;<span class="comment">*/</span></div>
-<div class="line"><a name="l05814"></a><span class="lineno"> 5814</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> KeyT, <span class="keyword">typename</span> ValueT&gt;</div>
-<div class="line"><a name="l05815"></a><span class="lineno"> 5815</span>&#160;<span class="keyword">class </span>VmaMap</div>
-<div class="line"><a name="l05816"></a><span class="lineno"> 5816</span>&#160;{</div>
-<div class="line"><a name="l05817"></a><span class="lineno"> 5817</span>&#160;<span class="keyword">public</span>:</div>
-<div class="line"><a name="l05818"></a><span class="lineno"> 5818</span>&#160;    <span class="keyword">typedef</span> VmaPair&lt;KeyT, ValueT&gt; PairType;</div>
-<div class="line"><a name="l05819"></a><span class="lineno"> 5819</span>&#160;    <span class="keyword">typedef</span> PairType* iterator;</div>
-<div class="line"><a name="l05820"></a><span class="lineno"> 5820</span>&#160; </div>
-<div class="line"><a name="l05821"></a><span class="lineno"> 5821</span>&#160;    VmaMap(<span class="keyword">const</span> VmaStlAllocator&lt;PairType&gt;&amp; allocator) : m_Vector(allocator) { }</div>
-<div class="line"><a name="l05822"></a><span class="lineno"> 5822</span>&#160; </div>
-<div class="line"><a name="l05823"></a><span class="lineno"> 5823</span>&#160;    iterator begin() { <span class="keywordflow">return</span> m_Vector.begin(); }</div>
-<div class="line"><a name="l05824"></a><span class="lineno"> 5824</span>&#160;    iterator end() { <span class="keywordflow">return</span> m_Vector.end(); }</div>
-<div class="line"><a name="l05825"></a><span class="lineno"> 5825</span>&#160; </div>
-<div class="line"><a name="l05826"></a><span class="lineno"> 5826</span>&#160;    <span class="keywordtype">void</span> insert(<span class="keyword">const</span> PairType&amp; pair);</div>
-<div class="line"><a name="l05827"></a><span class="lineno"> 5827</span>&#160;    iterator find(<span class="keyword">const</span> KeyT&amp; key);</div>
-<div class="line"><a name="l05828"></a><span class="lineno"> 5828</span>&#160;    <span class="keywordtype">void</span> erase(iterator it);</div>
-<div class="line"><a name="l05829"></a><span class="lineno"> 5829</span>&#160;    </div>
-<div class="line"><a name="l05830"></a><span class="lineno"> 5830</span>&#160;<span class="keyword">private</span>:</div>
-<div class="line"><a name="l05831"></a><span class="lineno"> 5831</span>&#160;    VmaVector&lt; PairType, VmaStlAllocator&lt;PairType&gt; &gt; m_Vector;</div>
-<div class="line"><a name="l05832"></a><span class="lineno"> 5832</span>&#160;};</div>
-<div class="line"><a name="l05833"></a><span class="lineno"> 5833</span>&#160; </div>
-<div class="line"><a name="l05834"></a><span class="lineno"> 5834</span>&#160;<span class="preprocessor">#define VMA_MAP_TYPE(KeyT, ValueT) VmaMap&lt;KeyT, ValueT&gt;</span></div>
-<div class="line"><a name="l05835"></a><span class="lineno"> 5835</span>&#160; </div>
-<div class="line"><a name="l05836"></a><span class="lineno"> 5836</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> FirstT, <span class="keyword">typename</span> SecondT&gt;</div>
-<div class="line"><a name="l05837"></a><span class="lineno"> 5837</span>&#160;<span class="keyword">struct </span>VmaPairFirstLess</div>
-<div class="line"><a name="l05838"></a><span class="lineno"> 5838</span>&#160;{</div>
-<div class="line"><a name="l05839"></a><span class="lineno"> 5839</span>&#160;    <span class="keywordtype">bool</span> operator()(<span class="keyword">const</span> VmaPair&lt;FirstT, SecondT&gt;&amp; lhs, <span class="keyword">const</span> VmaPair&lt;FirstT, SecondT&gt;&amp; rhs)<span class="keyword"> const</span></div>
-<div class="line"><a name="l05840"></a><span class="lineno"> 5840</span>&#160;<span class="keyword">    </span>{</div>
-<div class="line"><a name="l05841"></a><span class="lineno"> 5841</span>&#160;        <span class="keywordflow">return</span> lhs.first &lt; rhs.first;</div>
-<div class="line"><a name="l05842"></a><span class="lineno"> 5842</span>&#160;    }</div>
-<div class="line"><a name="l05843"></a><span class="lineno"> 5843</span>&#160;    <span class="keywordtype">bool</span> operator()(<span class="keyword">const</span> VmaPair&lt;FirstT, SecondT&gt;&amp; lhs, <span class="keyword">const</span> FirstT&amp; rhsFirst)<span class="keyword"> const</span></div>
-<div class="line"><a name="l05844"></a><span class="lineno"> 5844</span>&#160;<span class="keyword">    </span>{</div>
-<div class="line"><a name="l05845"></a><span class="lineno"> 5845</span>&#160;        <span class="keywordflow">return</span> lhs.first &lt; rhsFirst;</div>
-<div class="line"><a name="l05846"></a><span class="lineno"> 5846</span>&#160;    }</div>
-<div class="line"><a name="l05847"></a><span class="lineno"> 5847</span>&#160;};</div>
-<div class="line"><a name="l05848"></a><span class="lineno"> 5848</span>&#160; </div>
-<div class="line"><a name="l05849"></a><span class="lineno"> 5849</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> KeyT, <span class="keyword">typename</span> ValueT&gt;</div>
-<div class="line"><a name="l05850"></a><span class="lineno"> 5850</span>&#160;<span class="keywordtype">void</span> VmaMap&lt;KeyT, ValueT&gt;::insert(<span class="keyword">const</span> PairType&amp; pair)</div>
-<div class="line"><a name="l05851"></a><span class="lineno"> 5851</span>&#160;{</div>
-<div class="line"><a name="l05852"></a><span class="lineno"> 5852</span>&#160;    <span class="keyword">const</span> <span class="keywordtype">size_t</span> indexToInsert = VmaBinaryFindFirstNotLess(</div>
-<div class="line"><a name="l05853"></a><span class="lineno"> 5853</span>&#160;        m_Vector.data(),</div>
-<div class="line"><a name="l05854"></a><span class="lineno"> 5854</span>&#160;        m_Vector.data() + m_Vector.size(),</div>
-<div class="line"><a name="l05855"></a><span class="lineno"> 5855</span>&#160;        pair,</div>
-<div class="line"><a name="l05856"></a><span class="lineno"> 5856</span>&#160;        VmaPairFirstLess&lt;KeyT, ValueT&gt;()) - m_Vector.data();</div>
-<div class="line"><a name="l05857"></a><span class="lineno"> 5857</span>&#160;    VmaVectorInsert(m_Vector, indexToInsert, pair);</div>
-<div class="line"><a name="l05858"></a><span class="lineno"> 5858</span>&#160;}</div>
-<div class="line"><a name="l05859"></a><span class="lineno"> 5859</span>&#160; </div>
-<div class="line"><a name="l05860"></a><span class="lineno"> 5860</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> KeyT, <span class="keyword">typename</span> ValueT&gt;</div>
-<div class="line"><a name="l05861"></a><span class="lineno"> 5861</span>&#160;VmaPair&lt;KeyT, ValueT&gt;* VmaMap&lt;KeyT, ValueT&gt;::find(<span class="keyword">const</span> KeyT&amp; key)</div>
-<div class="line"><a name="l05862"></a><span class="lineno"> 5862</span>&#160;{</div>
-<div class="line"><a name="l05863"></a><span class="lineno"> 5863</span>&#160;    PairType* it = VmaBinaryFindFirstNotLess(</div>
-<div class="line"><a name="l05864"></a><span class="lineno"> 5864</span>&#160;        m_Vector.data(),</div>
-<div class="line"><a name="l05865"></a><span class="lineno"> 5865</span>&#160;        m_Vector.data() + m_Vector.size(),</div>
-<div class="line"><a name="l05866"></a><span class="lineno"> 5866</span>&#160;        key,</div>
-<div class="line"><a name="l05867"></a><span class="lineno"> 5867</span>&#160;        VmaPairFirstLess&lt;KeyT, ValueT&gt;());</div>
-<div class="line"><a name="l05868"></a><span class="lineno"> 5868</span>&#160;    <span class="keywordflow">if</span>((it != m_Vector.end()) &amp;&amp; (it-&gt;first == key))</div>
-<div class="line"><a name="l05869"></a><span class="lineno"> 5869</span>&#160;    {</div>
-<div class="line"><a name="l05870"></a><span class="lineno"> 5870</span>&#160;        <span class="keywordflow">return</span> it;</div>
-<div class="line"><a name="l05871"></a><span class="lineno"> 5871</span>&#160;    }</div>
-<div class="line"><a name="l05872"></a><span class="lineno"> 5872</span>&#160;    <span class="keywordflow">else</span></div>
-<div class="line"><a name="l05873"></a><span class="lineno"> 5873</span>&#160;    {</div>
-<div class="line"><a name="l05874"></a><span class="lineno"> 5874</span>&#160;        <span class="keywordflow">return</span> m_Vector.end();</div>
-<div class="line"><a name="l05875"></a><span class="lineno"> 5875</span>&#160;    }</div>
-<div class="line"><a name="l05876"></a><span class="lineno"> 5876</span>&#160;}</div>
-<div class="line"><a name="l05877"></a><span class="lineno"> 5877</span>&#160; </div>
-<div class="line"><a name="l05878"></a><span class="lineno"> 5878</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> KeyT, <span class="keyword">typename</span> ValueT&gt;</div>
-<div class="line"><a name="l05879"></a><span class="lineno"> 5879</span>&#160;<span class="keywordtype">void</span> VmaMap&lt;KeyT, ValueT&gt;::erase(iterator it)</div>
-<div class="line"><a name="l05880"></a><span class="lineno"> 5880</span>&#160;{</div>
-<div class="line"><a name="l05881"></a><span class="lineno"> 5881</span>&#160;    VmaVectorRemove(m_Vector, it - m_Vector.begin());</div>
-<div class="line"><a name="l05882"></a><span class="lineno"> 5882</span>&#160;}</div>
-<div class="line"><a name="l05883"></a><span class="lineno"> 5883</span>&#160; </div>
-<div class="line"><a name="l05884"></a><span class="lineno"> 5884</span>&#160;<span class="preprocessor">#endif // #if VMA_USE_STL_UNORDERED_MAP</span></div>
-<div class="line"><a name="l05885"></a><span class="lineno"> 5885</span>&#160; </div>
-<div class="line"><a name="l05886"></a><span class="lineno"> 5886</span>&#160;<span class="preprocessor">#endif // #if 0</span></div>
-<div class="line"><a name="l05887"></a><span class="lineno"> 5887</span>&#160; </div>
-<div class="line"><a name="l05889"></a><span class="lineno"> 5889</span>&#160; </div>
-<div class="line"><a name="l05890"></a><span class="lineno"> 5890</span>&#160;<span class="keyword">class </span>VmaDeviceMemoryBlock;</div>
+<div class="line"><a name="l05775"></a><span class="lineno"> 5775</span>&#160;    m_ItemAllocator.Free(pItem);</div>
+<div class="line"><a name="l05776"></a><span class="lineno"> 5776</span>&#160;    --m_Count;</div>
+<div class="line"><a name="l05777"></a><span class="lineno"> 5777</span>&#160;}</div>
+<div class="line"><a name="l05778"></a><span class="lineno"> 5778</span>&#160; </div>
+<div class="line"><a name="l05779"></a><span class="lineno"> 5779</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt;</div>
+<div class="line"><a name="l05780"></a><span class="lineno"> 5780</span>&#160;VmaListItem&lt;T&gt;* VmaRawList&lt;T&gt;::InsertBefore(ItemType* pItem)</div>
+<div class="line"><a name="l05781"></a><span class="lineno"> 5781</span>&#160;{</div>
+<div class="line"><a name="l05782"></a><span class="lineno"> 5782</span>&#160;    <span class="keywordflow">if</span>(pItem != VMA_NULL)</div>
+<div class="line"><a name="l05783"></a><span class="lineno"> 5783</span>&#160;    {</div>
+<div class="line"><a name="l05784"></a><span class="lineno"> 5784</span>&#160;        ItemType* <span class="keyword">const</span> prevItem = pItem-&gt;pPrev;</div>
+<div class="line"><a name="l05785"></a><span class="lineno"> 5785</span>&#160;        ItemType* <span class="keyword">const</span> newItem = m_ItemAllocator.Alloc();</div>
+<div class="line"><a name="l05786"></a><span class="lineno"> 5786</span>&#160;        newItem-&gt;pPrev = prevItem;</div>
+<div class="line"><a name="l05787"></a><span class="lineno"> 5787</span>&#160;        newItem-&gt;pNext = pItem;</div>
+<div class="line"><a name="l05788"></a><span class="lineno"> 5788</span>&#160;        pItem-&gt;pPrev = newItem;</div>
+<div class="line"><a name="l05789"></a><span class="lineno"> 5789</span>&#160;        <span class="keywordflow">if</span>(prevItem != VMA_NULL)</div>
+<div class="line"><a name="l05790"></a><span class="lineno"> 5790</span>&#160;        {</div>
+<div class="line"><a name="l05791"></a><span class="lineno"> 5791</span>&#160;            prevItem-&gt;pNext = newItem;</div>
+<div class="line"><a name="l05792"></a><span class="lineno"> 5792</span>&#160;        }</div>
+<div class="line"><a name="l05793"></a><span class="lineno"> 5793</span>&#160;        <span class="keywordflow">else</span></div>
+<div class="line"><a name="l05794"></a><span class="lineno"> 5794</span>&#160;        {</div>
+<div class="line"><a name="l05795"></a><span class="lineno"> 5795</span>&#160;            VMA_HEAVY_ASSERT(m_pFront == pItem);</div>
+<div class="line"><a name="l05796"></a><span class="lineno"> 5796</span>&#160;            m_pFront = newItem;</div>
+<div class="line"><a name="l05797"></a><span class="lineno"> 5797</span>&#160;        }</div>
+<div class="line"><a name="l05798"></a><span class="lineno"> 5798</span>&#160;        ++m_Count;</div>
+<div class="line"><a name="l05799"></a><span class="lineno"> 5799</span>&#160;        <span class="keywordflow">return</span> newItem;</div>
+<div class="line"><a name="l05800"></a><span class="lineno"> 5800</span>&#160;    }</div>
+<div class="line"><a name="l05801"></a><span class="lineno"> 5801</span>&#160;    <span class="keywordflow">else</span></div>
+<div class="line"><a name="l05802"></a><span class="lineno"> 5802</span>&#160;        <span class="keywordflow">return</span> PushBack();</div>
+<div class="line"><a name="l05803"></a><span class="lineno"> 5803</span>&#160;}</div>
+<div class="line"><a name="l05804"></a><span class="lineno"> 5804</span>&#160; </div>
+<div class="line"><a name="l05805"></a><span class="lineno"> 5805</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt;</div>
+<div class="line"><a name="l05806"></a><span class="lineno"> 5806</span>&#160;VmaListItem&lt;T&gt;* VmaRawList&lt;T&gt;::InsertAfter(ItemType* pItem)</div>
+<div class="line"><a name="l05807"></a><span class="lineno"> 5807</span>&#160;{</div>
+<div class="line"><a name="l05808"></a><span class="lineno"> 5808</span>&#160;    <span class="keywordflow">if</span>(pItem != VMA_NULL)</div>
+<div class="line"><a name="l05809"></a><span class="lineno"> 5809</span>&#160;    {</div>
+<div class="line"><a name="l05810"></a><span class="lineno"> 5810</span>&#160;        ItemType* <span class="keyword">const</span> nextItem = pItem-&gt;pNext;</div>
+<div class="line"><a name="l05811"></a><span class="lineno"> 5811</span>&#160;        ItemType* <span class="keyword">const</span> newItem = m_ItemAllocator.Alloc();</div>
+<div class="line"><a name="l05812"></a><span class="lineno"> 5812</span>&#160;        newItem-&gt;pNext = nextItem;</div>
+<div class="line"><a name="l05813"></a><span class="lineno"> 5813</span>&#160;        newItem-&gt;pPrev = pItem;</div>
+<div class="line"><a name="l05814"></a><span class="lineno"> 5814</span>&#160;        pItem-&gt;pNext = newItem;</div>
+<div class="line"><a name="l05815"></a><span class="lineno"> 5815</span>&#160;        <span class="keywordflow">if</span>(nextItem != VMA_NULL)</div>
+<div class="line"><a name="l05816"></a><span class="lineno"> 5816</span>&#160;        {</div>
+<div class="line"><a name="l05817"></a><span class="lineno"> 5817</span>&#160;            nextItem-&gt;pPrev = newItem;</div>
+<div class="line"><a name="l05818"></a><span class="lineno"> 5818</span>&#160;        }</div>
+<div class="line"><a name="l05819"></a><span class="lineno"> 5819</span>&#160;        <span class="keywordflow">else</span></div>
+<div class="line"><a name="l05820"></a><span class="lineno"> 5820</span>&#160;        {</div>
+<div class="line"><a name="l05821"></a><span class="lineno"> 5821</span>&#160;            VMA_HEAVY_ASSERT(m_pBack == pItem);</div>
+<div class="line"><a name="l05822"></a><span class="lineno"> 5822</span>&#160;            m_pBack = newItem;</div>
+<div class="line"><a name="l05823"></a><span class="lineno"> 5823</span>&#160;        }</div>
+<div class="line"><a name="l05824"></a><span class="lineno"> 5824</span>&#160;        ++m_Count;</div>
+<div class="line"><a name="l05825"></a><span class="lineno"> 5825</span>&#160;        <span class="keywordflow">return</span> newItem;</div>
+<div class="line"><a name="l05826"></a><span class="lineno"> 5826</span>&#160;    }</div>
+<div class="line"><a name="l05827"></a><span class="lineno"> 5827</span>&#160;    <span class="keywordflow">else</span></div>
+<div class="line"><a name="l05828"></a><span class="lineno"> 5828</span>&#160;        <span class="keywordflow">return</span> PushFront();</div>
+<div class="line"><a name="l05829"></a><span class="lineno"> 5829</span>&#160;}</div>
+<div class="line"><a name="l05830"></a><span class="lineno"> 5830</span>&#160; </div>
+<div class="line"><a name="l05831"></a><span class="lineno"> 5831</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt;</div>
+<div class="line"><a name="l05832"></a><span class="lineno"> 5832</span>&#160;VmaListItem&lt;T&gt;* VmaRawList&lt;T&gt;::InsertBefore(ItemType* pItem, <span class="keyword">const</span> T&amp; value)</div>
+<div class="line"><a name="l05833"></a><span class="lineno"> 5833</span>&#160;{</div>
+<div class="line"><a name="l05834"></a><span class="lineno"> 5834</span>&#160;    ItemType* <span class="keyword">const</span> newItem = InsertBefore(pItem);</div>
+<div class="line"><a name="l05835"></a><span class="lineno"> 5835</span>&#160;    newItem-&gt;Value = value;</div>
+<div class="line"><a name="l05836"></a><span class="lineno"> 5836</span>&#160;    <span class="keywordflow">return</span> newItem;</div>
+<div class="line"><a name="l05837"></a><span class="lineno"> 5837</span>&#160;}</div>
+<div class="line"><a name="l05838"></a><span class="lineno"> 5838</span>&#160; </div>
+<div class="line"><a name="l05839"></a><span class="lineno"> 5839</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt;</div>
+<div class="line"><a name="l05840"></a><span class="lineno"> 5840</span>&#160;VmaListItem&lt;T&gt;* VmaRawList&lt;T&gt;::InsertAfter(ItemType* pItem, <span class="keyword">const</span> T&amp; value)</div>
+<div class="line"><a name="l05841"></a><span class="lineno"> 5841</span>&#160;{</div>
+<div class="line"><a name="l05842"></a><span class="lineno"> 5842</span>&#160;    ItemType* <span class="keyword">const</span> newItem = InsertAfter(pItem);</div>
+<div class="line"><a name="l05843"></a><span class="lineno"> 5843</span>&#160;    newItem-&gt;Value = value;</div>
+<div class="line"><a name="l05844"></a><span class="lineno"> 5844</span>&#160;    <span class="keywordflow">return</span> newItem;</div>
+<div class="line"><a name="l05845"></a><span class="lineno"> 5845</span>&#160;}</div>
+<div class="line"><a name="l05846"></a><span class="lineno"> 5846</span>&#160; </div>
+<div class="line"><a name="l05847"></a><span class="lineno"> 5847</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> T, <span class="keyword">typename</span> AllocatorT&gt;</div>
+<div class="line"><a name="l05848"></a><span class="lineno"> 5848</span>&#160;<span class="keyword">class </span>VmaList</div>
+<div class="line"><a name="l05849"></a><span class="lineno"> 5849</span>&#160;{</div>
+<div class="line"><a name="l05850"></a><span class="lineno"> 5850</span>&#160;    VMA_CLASS_NO_COPY(VmaList)</div>
+<div class="line"><a name="l05851"></a><span class="lineno"> 5851</span>&#160;<span class="keyword">public</span>:</div>
+<div class="line"><a name="l05852"></a><span class="lineno"> 5852</span>&#160;    <span class="keyword">class </span>iterator</div>
+<div class="line"><a name="l05853"></a><span class="lineno"> 5853</span>&#160;    {</div>
+<div class="line"><a name="l05854"></a><span class="lineno"> 5854</span>&#160;    <span class="keyword">public</span>:</div>
+<div class="line"><a name="l05855"></a><span class="lineno"> 5855</span>&#160;        iterator() :</div>
+<div class="line"><a name="l05856"></a><span class="lineno"> 5856</span>&#160;            m_pList(VMA_NULL),</div>
+<div class="line"><a name="l05857"></a><span class="lineno"> 5857</span>&#160;            m_pItem(VMA_NULL)</div>
+<div class="line"><a name="l05858"></a><span class="lineno"> 5858</span>&#160;        {</div>
+<div class="line"><a name="l05859"></a><span class="lineno"> 5859</span>&#160;        }</div>
+<div class="line"><a name="l05860"></a><span class="lineno"> 5860</span>&#160; </div>
+<div class="line"><a name="l05861"></a><span class="lineno"> 5861</span>&#160;        T&amp; operator*()<span class="keyword"> const</span></div>
+<div class="line"><a name="l05862"></a><span class="lineno"> 5862</span>&#160;<span class="keyword">        </span>{</div>
+<div class="line"><a name="l05863"></a><span class="lineno"> 5863</span>&#160;            VMA_HEAVY_ASSERT(m_pItem != VMA_NULL);</div>
+<div class="line"><a name="l05864"></a><span class="lineno"> 5864</span>&#160;            <span class="keywordflow">return</span> m_pItem-&gt;Value;</div>
+<div class="line"><a name="l05865"></a><span class="lineno"> 5865</span>&#160;        }</div>
+<div class="line"><a name="l05866"></a><span class="lineno"> 5866</span>&#160;        T* operator-&gt;()<span class="keyword"> const</span></div>
+<div class="line"><a name="l05867"></a><span class="lineno"> 5867</span>&#160;<span class="keyword">        </span>{</div>
+<div class="line"><a name="l05868"></a><span class="lineno"> 5868</span>&#160;            VMA_HEAVY_ASSERT(m_pItem != VMA_NULL);</div>
+<div class="line"><a name="l05869"></a><span class="lineno"> 5869</span>&#160;            <span class="keywordflow">return</span> &amp;m_pItem-&gt;Value;</div>
+<div class="line"><a name="l05870"></a><span class="lineno"> 5870</span>&#160;        }</div>
+<div class="line"><a name="l05871"></a><span class="lineno"> 5871</span>&#160; </div>
+<div class="line"><a name="l05872"></a><span class="lineno"> 5872</span>&#160;        iterator&amp; operator++()</div>
+<div class="line"><a name="l05873"></a><span class="lineno"> 5873</span>&#160;        {</div>
+<div class="line"><a name="l05874"></a><span class="lineno"> 5874</span>&#160;            VMA_HEAVY_ASSERT(m_pItem != VMA_NULL);</div>
+<div class="line"><a name="l05875"></a><span class="lineno"> 5875</span>&#160;            m_pItem = m_pItem-&gt;pNext;</div>
+<div class="line"><a name="l05876"></a><span class="lineno"> 5876</span>&#160;            <span class="keywordflow">return</span> *<span class="keyword">this</span>;</div>
+<div class="line"><a name="l05877"></a><span class="lineno"> 5877</span>&#160;        }</div>
+<div class="line"><a name="l05878"></a><span class="lineno"> 5878</span>&#160;        iterator&amp; operator--()</div>
+<div class="line"><a name="l05879"></a><span class="lineno"> 5879</span>&#160;        {</div>
+<div class="line"><a name="l05880"></a><span class="lineno"> 5880</span>&#160;            <span class="keywordflow">if</span>(m_pItem != VMA_NULL)</div>
+<div class="line"><a name="l05881"></a><span class="lineno"> 5881</span>&#160;            {</div>
+<div class="line"><a name="l05882"></a><span class="lineno"> 5882</span>&#160;                m_pItem = m_pItem-&gt;pPrev;</div>
+<div class="line"><a name="l05883"></a><span class="lineno"> 5883</span>&#160;            }</div>
+<div class="line"><a name="l05884"></a><span class="lineno"> 5884</span>&#160;            <span class="keywordflow">else</span></div>
+<div class="line"><a name="l05885"></a><span class="lineno"> 5885</span>&#160;            {</div>
+<div class="line"><a name="l05886"></a><span class="lineno"> 5886</span>&#160;                VMA_HEAVY_ASSERT(!m_pList-&gt;IsEmpty());</div>
+<div class="line"><a name="l05887"></a><span class="lineno"> 5887</span>&#160;                m_pItem = m_pList-&gt;Back();</div>
+<div class="line"><a name="l05888"></a><span class="lineno"> 5888</span>&#160;            }</div>
+<div class="line"><a name="l05889"></a><span class="lineno"> 5889</span>&#160;            <span class="keywordflow">return</span> *<span class="keyword">this</span>;</div>
+<div class="line"><a name="l05890"></a><span class="lineno"> 5890</span>&#160;        }</div>
 <div class="line"><a name="l05891"></a><span class="lineno"> 5891</span>&#160; </div>
-<div class="line"><a name="l05892"></a><span class="lineno"> 5892</span>&#160;<span class="keyword">enum</span> VMA_CACHE_OPERATION { VMA_CACHE_FLUSH, VMA_CACHE_INVALIDATE };</div>
-<div class="line"><a name="l05893"></a><span class="lineno"> 5893</span>&#160; </div>
-<div class="line"><a name="l05894"></a><span class="lineno"> 5894</span>&#160;<span class="keyword">struct </span>VmaAllocation_T</div>
-<div class="line"><a name="l05895"></a><span class="lineno"> 5895</span>&#160;{</div>
-<div class="line"><a name="l05896"></a><span class="lineno"> 5896</span>&#160;<span class="keyword">private</span>:</div>
-<div class="line"><a name="l05897"></a><span class="lineno"> 5897</span>&#160;    <span class="keyword">static</span> <span class="keyword">const</span> uint8_t MAP_COUNT_FLAG_PERSISTENT_MAP = 0x80;</div>
-<div class="line"><a name="l05898"></a><span class="lineno"> 5898</span>&#160; </div>
-<div class="line"><a name="l05899"></a><span class="lineno"> 5899</span>&#160;    <span class="keyword">enum</span> FLAGS</div>
-<div class="line"><a name="l05900"></a><span class="lineno"> 5900</span>&#160;    {</div>
-<div class="line"><a name="l05901"></a><span class="lineno"> 5901</span>&#160;        FLAG_USER_DATA_STRING = 0x01,</div>
-<div class="line"><a name="l05902"></a><span class="lineno"> 5902</span>&#160;    };</div>
-<div class="line"><a name="l05903"></a><span class="lineno"> 5903</span>&#160; </div>
-<div class="line"><a name="l05904"></a><span class="lineno"> 5904</span>&#160;<span class="keyword">public</span>:</div>
-<div class="line"><a name="l05905"></a><span class="lineno"> 5905</span>&#160;    <span class="keyword">enum</span> ALLOCATION_TYPE</div>
-<div class="line"><a name="l05906"></a><span class="lineno"> 5906</span>&#160;    {</div>
-<div class="line"><a name="l05907"></a><span class="lineno"> 5907</span>&#160;        ALLOCATION_TYPE_NONE,</div>
-<div class="line"><a name="l05908"></a><span class="lineno"> 5908</span>&#160;        ALLOCATION_TYPE_BLOCK,</div>
-<div class="line"><a name="l05909"></a><span class="lineno"> 5909</span>&#160;        ALLOCATION_TYPE_DEDICATED,</div>
-<div class="line"><a name="l05910"></a><span class="lineno"> 5910</span>&#160;    };</div>
-<div class="line"><a name="l05911"></a><span class="lineno"> 5911</span>&#160; </div>
-<div class="line"><a name="l05912"></a><span class="lineno"> 5912</span>&#160;    <span class="comment">/*</span></div>
-<div class="line"><a name="l05913"></a><span class="lineno"> 5913</span>&#160;<span class="comment">    This struct is allocated using VmaPoolAllocator.</span></div>
-<div class="line"><a name="l05914"></a><span class="lineno"> 5914</span>&#160;<span class="comment">    */</span></div>
+<div class="line"><a name="l05892"></a><span class="lineno"> 5892</span>&#160;        iterator operator++(<span class="keywordtype">int</span>)</div>
+<div class="line"><a name="l05893"></a><span class="lineno"> 5893</span>&#160;        {</div>
+<div class="line"><a name="l05894"></a><span class="lineno"> 5894</span>&#160;            iterator result = *<span class="keyword">this</span>;</div>
+<div class="line"><a name="l05895"></a><span class="lineno"> 5895</span>&#160;            ++*<span class="keyword">this</span>;</div>
+<div class="line"><a name="l05896"></a><span class="lineno"> 5896</span>&#160;            <span class="keywordflow">return</span> result;</div>
+<div class="line"><a name="l05897"></a><span class="lineno"> 5897</span>&#160;        }</div>
+<div class="line"><a name="l05898"></a><span class="lineno"> 5898</span>&#160;        iterator operator--(<span class="keywordtype">int</span>)</div>
+<div class="line"><a name="l05899"></a><span class="lineno"> 5899</span>&#160;        {</div>
+<div class="line"><a name="l05900"></a><span class="lineno"> 5900</span>&#160;            iterator result = *<span class="keyword">this</span>;</div>
+<div class="line"><a name="l05901"></a><span class="lineno"> 5901</span>&#160;            --*<span class="keyword">this</span>;</div>
+<div class="line"><a name="l05902"></a><span class="lineno"> 5902</span>&#160;            <span class="keywordflow">return</span> result;</div>
+<div class="line"><a name="l05903"></a><span class="lineno"> 5903</span>&#160;        }</div>
+<div class="line"><a name="l05904"></a><span class="lineno"> 5904</span>&#160; </div>
+<div class="line"><a name="l05905"></a><span class="lineno"> 5905</span>&#160;        <span class="keywordtype">bool</span> operator==(<span class="keyword">const</span> iterator&amp; rhs)<span class="keyword"> const</span></div>
+<div class="line"><a name="l05906"></a><span class="lineno"> 5906</span>&#160;<span class="keyword">        </span>{</div>
+<div class="line"><a name="l05907"></a><span class="lineno"> 5907</span>&#160;            VMA_HEAVY_ASSERT(m_pList == rhs.m_pList);</div>
+<div class="line"><a name="l05908"></a><span class="lineno"> 5908</span>&#160;            <span class="keywordflow">return</span> m_pItem == rhs.m_pItem;</div>
+<div class="line"><a name="l05909"></a><span class="lineno"> 5909</span>&#160;        }</div>
+<div class="line"><a name="l05910"></a><span class="lineno"> 5910</span>&#160;        <span class="keywordtype">bool</span> operator!=(<span class="keyword">const</span> iterator&amp; rhs)<span class="keyword"> const</span></div>
+<div class="line"><a name="l05911"></a><span class="lineno"> 5911</span>&#160;<span class="keyword">        </span>{</div>
+<div class="line"><a name="l05912"></a><span class="lineno"> 5912</span>&#160;            VMA_HEAVY_ASSERT(m_pList == rhs.m_pList);</div>
+<div class="line"><a name="l05913"></a><span class="lineno"> 5913</span>&#160;            <span class="keywordflow">return</span> m_pItem != rhs.m_pItem;</div>
+<div class="line"><a name="l05914"></a><span class="lineno"> 5914</span>&#160;        }</div>
 <div class="line"><a name="l05915"></a><span class="lineno"> 5915</span>&#160; </div>
-<div class="line"><a name="l05916"></a><span class="lineno"> 5916</span>&#160;    VmaAllocation_T(uint32_t currentFrameIndex, <span class="keywordtype">bool</span> userDataString) :</div>
-<div class="line"><a name="l05917"></a><span class="lineno"> 5917</span>&#160;        m_Alignment{1},</div>
-<div class="line"><a name="l05918"></a><span class="lineno"> 5918</span>&#160;        m_Size{0},</div>
-<div class="line"><a name="l05919"></a><span class="lineno"> 5919</span>&#160;        m_pUserData{VMA_NULL},</div>
-<div class="line"><a name="l05920"></a><span class="lineno"> 5920</span>&#160;        m_LastUseFrameIndex{currentFrameIndex},</div>
-<div class="line"><a name="l05921"></a><span class="lineno"> 5921</span>&#160;        m_MemoryTypeIndex{0},</div>
-<div class="line"><a name="l05922"></a><span class="lineno"> 5922</span>&#160;        m_Type{(uint8_t)ALLOCATION_TYPE_NONE},</div>
-<div class="line"><a name="l05923"></a><span class="lineno"> 5923</span>&#160;        m_SuballocationType{(uint8_t)VMA_SUBALLOCATION_TYPE_UNKNOWN},</div>
-<div class="line"><a name="l05924"></a><span class="lineno"> 5924</span>&#160;        m_MapCount{0},</div>
-<div class="line"><a name="l05925"></a><span class="lineno"> 5925</span>&#160;        m_Flags{userDataString ? (uint8_t)FLAG_USER_DATA_STRING : (uint8_t)0}</div>
-<div class="line"><a name="l05926"></a><span class="lineno"> 5926</span>&#160;    {</div>
-<div class="line"><a name="l05927"></a><span class="lineno"> 5927</span>&#160;<span class="preprocessor">#if VMA_STATS_STRING_ENABLED</span></div>
-<div class="line"><a name="l05928"></a><span class="lineno"> 5928</span>&#160;        m_CreationFrameIndex = currentFrameIndex;</div>
-<div class="line"><a name="l05929"></a><span class="lineno"> 5929</span>&#160;        m_BufferImageUsage = 0;</div>
-<div class="line"><a name="l05930"></a><span class="lineno"> 5930</span>&#160;<span class="preprocessor">#endif</span></div>
-<div class="line"><a name="l05931"></a><span class="lineno"> 5931</span>&#160;    }</div>
-<div class="line"><a name="l05932"></a><span class="lineno"> 5932</span>&#160; </div>
-<div class="line"><a name="l05933"></a><span class="lineno"> 5933</span>&#160;    ~VmaAllocation_T()</div>
-<div class="line"><a name="l05934"></a><span class="lineno"> 5934</span>&#160;    {</div>
-<div class="line"><a name="l05935"></a><span class="lineno"> 5935</span>&#160;        VMA_ASSERT((m_MapCount &amp; ~MAP_COUNT_FLAG_PERSISTENT_MAP) == 0 &amp;&amp; <span class="stringliteral">&quot;Allocation was not unmapped before destruction.&quot;</span>);</div>
-<div class="line"><a name="l05936"></a><span class="lineno"> 5936</span>&#160; </div>
-<div class="line"><a name="l05937"></a><span class="lineno"> 5937</span>&#160;        <span class="comment">// Check if owned string was freed.</span></div>
-<div class="line"><a name="l05938"></a><span class="lineno"> 5938</span>&#160;        VMA_ASSERT(m_pUserData == VMA_NULL);</div>
-<div class="line"><a name="l05939"></a><span class="lineno"> 5939</span>&#160;    }</div>
-<div class="line"><a name="l05940"></a><span class="lineno"> 5940</span>&#160; </div>
-<div class="line"><a name="l05941"></a><span class="lineno"> 5941</span>&#160;    <span class="keywordtype">void</span> InitBlockAllocation(</div>
-<div class="line"><a name="l05942"></a><span class="lineno"> 5942</span>&#160;        VmaDeviceMemoryBlock* block,</div>
-<div class="line"><a name="l05943"></a><span class="lineno"> 5943</span>&#160;        VkDeviceSize offset,</div>
-<div class="line"><a name="l05944"></a><span class="lineno"> 5944</span>&#160;        VkDeviceSize alignment,</div>
-<div class="line"><a name="l05945"></a><span class="lineno"> 5945</span>&#160;        VkDeviceSize size,</div>
-<div class="line"><a name="l05946"></a><span class="lineno"> 5946</span>&#160;        uint32_t memoryTypeIndex,</div>
-<div class="line"><a name="l05947"></a><span class="lineno"> 5947</span>&#160;        VmaSuballocationType suballocationType,</div>
-<div class="line"><a name="l05948"></a><span class="lineno"> 5948</span>&#160;        <span class="keywordtype">bool</span> mapped,</div>
-<div class="line"><a name="l05949"></a><span class="lineno"> 5949</span>&#160;        <span class="keywordtype">bool</span> canBecomeLost)</div>
-<div class="line"><a name="l05950"></a><span class="lineno"> 5950</span>&#160;    {</div>
-<div class="line"><a name="l05951"></a><span class="lineno"> 5951</span>&#160;        VMA_ASSERT(m_Type == ALLOCATION_TYPE_NONE);</div>
-<div class="line"><a name="l05952"></a><span class="lineno"> 5952</span>&#160;        VMA_ASSERT(block != VMA_NULL);</div>
-<div class="line"><a name="l05953"></a><span class="lineno"> 5953</span>&#160;        m_Type = (uint8_t)ALLOCATION_TYPE_BLOCK;</div>
-<div class="line"><a name="l05954"></a><span class="lineno"> 5954</span>&#160;        m_Alignment = alignment;</div>
-<div class="line"><a name="l05955"></a><span class="lineno"> 5955</span>&#160;        m_Size = size;</div>
-<div class="line"><a name="l05956"></a><span class="lineno"> 5956</span>&#160;        m_MemoryTypeIndex = memoryTypeIndex;</div>
-<div class="line"><a name="l05957"></a><span class="lineno"> 5957</span>&#160;        m_MapCount = mapped ? MAP_COUNT_FLAG_PERSISTENT_MAP : 0;</div>
-<div class="line"><a name="l05958"></a><span class="lineno"> 5958</span>&#160;        m_SuballocationType = (uint8_t)suballocationType;</div>
-<div class="line"><a name="l05959"></a><span class="lineno"> 5959</span>&#160;        m_BlockAllocation.m_Block = block;</div>
-<div class="line"><a name="l05960"></a><span class="lineno"> 5960</span>&#160;        m_BlockAllocation.m_Offset = offset;</div>
-<div class="line"><a name="l05961"></a><span class="lineno"> 5961</span>&#160;        m_BlockAllocation.m_CanBecomeLost = canBecomeLost;</div>
-<div class="line"><a name="l05962"></a><span class="lineno"> 5962</span>&#160;    }</div>
-<div class="line"><a name="l05963"></a><span class="lineno"> 5963</span>&#160; </div>
-<div class="line"><a name="l05964"></a><span class="lineno"> 5964</span>&#160;    <span class="keywordtype">void</span> InitLost()</div>
-<div class="line"><a name="l05965"></a><span class="lineno"> 5965</span>&#160;    {</div>
-<div class="line"><a name="l05966"></a><span class="lineno"> 5966</span>&#160;        VMA_ASSERT(m_Type == ALLOCATION_TYPE_NONE);</div>
-<div class="line"><a name="l05967"></a><span class="lineno"> 5967</span>&#160;        VMA_ASSERT(m_LastUseFrameIndex.load() == VMA_FRAME_INDEX_LOST);</div>
-<div class="line"><a name="l05968"></a><span class="lineno"> 5968</span>&#160;        m_Type = (uint8_t)ALLOCATION_TYPE_BLOCK;</div>
-<div class="line"><a name="l05969"></a><span class="lineno"> 5969</span>&#160;        m_MemoryTypeIndex = 0;</div>
-<div class="line"><a name="l05970"></a><span class="lineno"> 5970</span>&#160;        m_BlockAllocation.m_Block = VMA_NULL;</div>
-<div class="line"><a name="l05971"></a><span class="lineno"> 5971</span>&#160;        m_BlockAllocation.m_Offset = 0;</div>
-<div class="line"><a name="l05972"></a><span class="lineno"> 5972</span>&#160;        m_BlockAllocation.m_CanBecomeLost = <span class="keyword">true</span>;</div>
-<div class="line"><a name="l05973"></a><span class="lineno"> 5973</span>&#160;    }</div>
+<div class="line"><a name="l05916"></a><span class="lineno"> 5916</span>&#160;    <span class="keyword">private</span>:</div>
+<div class="line"><a name="l05917"></a><span class="lineno"> 5917</span>&#160;        VmaRawList&lt;T&gt;* m_pList;</div>
+<div class="line"><a name="l05918"></a><span class="lineno"> 5918</span>&#160;        VmaListItem&lt;T&gt;* m_pItem;</div>
+<div class="line"><a name="l05919"></a><span class="lineno"> 5919</span>&#160; </div>
+<div class="line"><a name="l05920"></a><span class="lineno"> 5920</span>&#160;        iterator(VmaRawList&lt;T&gt;* pList, VmaListItem&lt;T&gt;* pItem) :</div>
+<div class="line"><a name="l05921"></a><span class="lineno"> 5921</span>&#160;            m_pList(pList),</div>
+<div class="line"><a name="l05922"></a><span class="lineno"> 5922</span>&#160;            m_pItem(pItem)</div>
+<div class="line"><a name="l05923"></a><span class="lineno"> 5923</span>&#160;        {</div>
+<div class="line"><a name="l05924"></a><span class="lineno"> 5924</span>&#160;        }</div>
+<div class="line"><a name="l05925"></a><span class="lineno"> 5925</span>&#160; </div>
+<div class="line"><a name="l05926"></a><span class="lineno"> 5926</span>&#160;        <span class="keyword">friend</span> <span class="keyword">class </span>VmaList&lt;T, AllocatorT&gt;;</div>
+<div class="line"><a name="l05927"></a><span class="lineno"> 5927</span>&#160;    };</div>
+<div class="line"><a name="l05928"></a><span class="lineno"> 5928</span>&#160; </div>
+<div class="line"><a name="l05929"></a><span class="lineno"> 5929</span>&#160;    <span class="keyword">class </span>const_iterator</div>
+<div class="line"><a name="l05930"></a><span class="lineno"> 5930</span>&#160;    {</div>
+<div class="line"><a name="l05931"></a><span class="lineno"> 5931</span>&#160;    <span class="keyword">public</span>:</div>
+<div class="line"><a name="l05932"></a><span class="lineno"> 5932</span>&#160;        const_iterator() :</div>
+<div class="line"><a name="l05933"></a><span class="lineno"> 5933</span>&#160;            m_pList(VMA_NULL),</div>
+<div class="line"><a name="l05934"></a><span class="lineno"> 5934</span>&#160;            m_pItem(VMA_NULL)</div>
+<div class="line"><a name="l05935"></a><span class="lineno"> 5935</span>&#160;        {</div>
+<div class="line"><a name="l05936"></a><span class="lineno"> 5936</span>&#160;        }</div>
+<div class="line"><a name="l05937"></a><span class="lineno"> 5937</span>&#160; </div>
+<div class="line"><a name="l05938"></a><span class="lineno"> 5938</span>&#160;        const_iterator(<span class="keyword">const</span> iterator&amp; src) :</div>
+<div class="line"><a name="l05939"></a><span class="lineno"> 5939</span>&#160;            m_pList(src.m_pList),</div>
+<div class="line"><a name="l05940"></a><span class="lineno"> 5940</span>&#160;            m_pItem(src.m_pItem)</div>
+<div class="line"><a name="l05941"></a><span class="lineno"> 5941</span>&#160;        {</div>
+<div class="line"><a name="l05942"></a><span class="lineno"> 5942</span>&#160;        }</div>
+<div class="line"><a name="l05943"></a><span class="lineno"> 5943</span>&#160; </div>
+<div class="line"><a name="l05944"></a><span class="lineno"> 5944</span>&#160;        <span class="keyword">const</span> T&amp; operator*()<span class="keyword"> const</span></div>
+<div class="line"><a name="l05945"></a><span class="lineno"> 5945</span>&#160;<span class="keyword">        </span>{</div>
+<div class="line"><a name="l05946"></a><span class="lineno"> 5946</span>&#160;            VMA_HEAVY_ASSERT(m_pItem != VMA_NULL);</div>
+<div class="line"><a name="l05947"></a><span class="lineno"> 5947</span>&#160;            <span class="keywordflow">return</span> m_pItem-&gt;Value;</div>
+<div class="line"><a name="l05948"></a><span class="lineno"> 5948</span>&#160;        }</div>
+<div class="line"><a name="l05949"></a><span class="lineno"> 5949</span>&#160;        <span class="keyword">const</span> T* operator-&gt;()<span class="keyword"> const</span></div>
+<div class="line"><a name="l05950"></a><span class="lineno"> 5950</span>&#160;<span class="keyword">        </span>{</div>
+<div class="line"><a name="l05951"></a><span class="lineno"> 5951</span>&#160;            VMA_HEAVY_ASSERT(m_pItem != VMA_NULL);</div>
+<div class="line"><a name="l05952"></a><span class="lineno"> 5952</span>&#160;            <span class="keywordflow">return</span> &amp;m_pItem-&gt;Value;</div>
+<div class="line"><a name="l05953"></a><span class="lineno"> 5953</span>&#160;        }</div>
+<div class="line"><a name="l05954"></a><span class="lineno"> 5954</span>&#160; </div>
+<div class="line"><a name="l05955"></a><span class="lineno"> 5955</span>&#160;        const_iterator&amp; operator++()</div>
+<div class="line"><a name="l05956"></a><span class="lineno"> 5956</span>&#160;        {</div>
+<div class="line"><a name="l05957"></a><span class="lineno"> 5957</span>&#160;            VMA_HEAVY_ASSERT(m_pItem != VMA_NULL);</div>
+<div class="line"><a name="l05958"></a><span class="lineno"> 5958</span>&#160;            m_pItem = m_pItem-&gt;pNext;</div>
+<div class="line"><a name="l05959"></a><span class="lineno"> 5959</span>&#160;            <span class="keywordflow">return</span> *<span class="keyword">this</span>;</div>
+<div class="line"><a name="l05960"></a><span class="lineno"> 5960</span>&#160;        }</div>
+<div class="line"><a name="l05961"></a><span class="lineno"> 5961</span>&#160;        const_iterator&amp; operator--()</div>
+<div class="line"><a name="l05962"></a><span class="lineno"> 5962</span>&#160;        {</div>
+<div class="line"><a name="l05963"></a><span class="lineno"> 5963</span>&#160;            <span class="keywordflow">if</span>(m_pItem != VMA_NULL)</div>
+<div class="line"><a name="l05964"></a><span class="lineno"> 5964</span>&#160;            {</div>
+<div class="line"><a name="l05965"></a><span class="lineno"> 5965</span>&#160;                m_pItem = m_pItem-&gt;pPrev;</div>
+<div class="line"><a name="l05966"></a><span class="lineno"> 5966</span>&#160;            }</div>
+<div class="line"><a name="l05967"></a><span class="lineno"> 5967</span>&#160;            <span class="keywordflow">else</span></div>
+<div class="line"><a name="l05968"></a><span class="lineno"> 5968</span>&#160;            {</div>
+<div class="line"><a name="l05969"></a><span class="lineno"> 5969</span>&#160;                VMA_HEAVY_ASSERT(!m_pList-&gt;IsEmpty());</div>
+<div class="line"><a name="l05970"></a><span class="lineno"> 5970</span>&#160;                m_pItem = m_pList-&gt;Back();</div>
+<div class="line"><a name="l05971"></a><span class="lineno"> 5971</span>&#160;            }</div>
+<div class="line"><a name="l05972"></a><span class="lineno"> 5972</span>&#160;            <span class="keywordflow">return</span> *<span class="keyword">this</span>;</div>
+<div class="line"><a name="l05973"></a><span class="lineno"> 5973</span>&#160;        }</div>
 <div class="line"><a name="l05974"></a><span class="lineno"> 5974</span>&#160; </div>
-<div class="line"><a name="l05975"></a><span class="lineno"> 5975</span>&#160;    <span class="keywordtype">void</span> ChangeBlockAllocation(</div>
-<div class="line"><a name="l05976"></a><span class="lineno"> 5976</span>&#160;        <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator,</div>
-<div class="line"><a name="l05977"></a><span class="lineno"> 5977</span>&#160;        VmaDeviceMemoryBlock* block,</div>
-<div class="line"><a name="l05978"></a><span class="lineno"> 5978</span>&#160;        VkDeviceSize offset); </div>
-<div class="line"><a name="l05979"></a><span class="lineno"> 5979</span>&#160; </div>
-<div class="line"><a name="l05980"></a><span class="lineno"> 5980</span>&#160;    <span class="keywordtype">void</span> ChangeOffset(VkDeviceSize newOffset);</div>
-<div class="line"><a name="l05981"></a><span class="lineno"> 5981</span>&#160; </div>
-<div class="line"><a name="l05982"></a><span class="lineno"> 5982</span>&#160;    <span class="comment">// pMappedData not null means allocation is created with MAPPED flag.</span></div>
-<div class="line"><a name="l05983"></a><span class="lineno"> 5983</span>&#160;    <span class="keywordtype">void</span> InitDedicatedAllocation(</div>
-<div class="line"><a name="l05984"></a><span class="lineno"> 5984</span>&#160;        uint32_t memoryTypeIndex,</div>
-<div class="line"><a name="l05985"></a><span class="lineno"> 5985</span>&#160;        VkDeviceMemory hMemory,</div>
-<div class="line"><a name="l05986"></a><span class="lineno"> 5986</span>&#160;        VmaSuballocationType suballocationType,</div>
-<div class="line"><a name="l05987"></a><span class="lineno"> 5987</span>&#160;        <span class="keywordtype">void</span>* pMappedData,</div>
-<div class="line"><a name="l05988"></a><span class="lineno"> 5988</span>&#160;        VkDeviceSize size)</div>
-<div class="line"><a name="l05989"></a><span class="lineno"> 5989</span>&#160;    {</div>
-<div class="line"><a name="l05990"></a><span class="lineno"> 5990</span>&#160;        VMA_ASSERT(m_Type == ALLOCATION_TYPE_NONE);</div>
-<div class="line"><a name="l05991"></a><span class="lineno"> 5991</span>&#160;        VMA_ASSERT(hMemory != VK_NULL_HANDLE);</div>
-<div class="line"><a name="l05992"></a><span class="lineno"> 5992</span>&#160;        m_Type = (uint8_t)ALLOCATION_TYPE_DEDICATED;</div>
-<div class="line"><a name="l05993"></a><span class="lineno"> 5993</span>&#160;        m_Alignment = 0;</div>
-<div class="line"><a name="l05994"></a><span class="lineno"> 5994</span>&#160;        m_Size = size;</div>
-<div class="line"><a name="l05995"></a><span class="lineno"> 5995</span>&#160;        m_MemoryTypeIndex = memoryTypeIndex;</div>
-<div class="line"><a name="l05996"></a><span class="lineno"> 5996</span>&#160;        m_SuballocationType = (uint8_t)suballocationType;</div>
-<div class="line"><a name="l05997"></a><span class="lineno"> 5997</span>&#160;        m_MapCount = (pMappedData != VMA_NULL) ? MAP_COUNT_FLAG_PERSISTENT_MAP : 0;</div>
-<div class="line"><a name="l05998"></a><span class="lineno"> 5998</span>&#160;        m_DedicatedAllocation.m_hMemory = hMemory;</div>
-<div class="line"><a name="l05999"></a><span class="lineno"> 5999</span>&#160;        m_DedicatedAllocation.m_pMappedData = pMappedData;</div>
-<div class="line"><a name="l06000"></a><span class="lineno"> 6000</span>&#160;    }</div>
-<div class="line"><a name="l06001"></a><span class="lineno"> 6001</span>&#160; </div>
-<div class="line"><a name="l06002"></a><span class="lineno"> 6002</span>&#160;    ALLOCATION_TYPE GetType()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> (ALLOCATION_TYPE)m_Type; }</div>
-<div class="line"><a name="l06003"></a><span class="lineno"> 6003</span>&#160;    VkDeviceSize GetAlignment()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_Alignment; }</div>
-<div class="line"><a name="l06004"></a><span class="lineno"> 6004</span>&#160;    VkDeviceSize GetSize()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_Size; }</div>
-<div class="line"><a name="l06005"></a><span class="lineno"> 6005</span>&#160;    <span class="keywordtype">bool</span> IsUserDataString()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> (m_Flags &amp; FLAG_USER_DATA_STRING) != 0; }</div>
-<div class="line"><a name="l06006"></a><span class="lineno"> 6006</span>&#160;    <span class="keywordtype">void</span>* GetUserData()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_pUserData; }</div>
-<div class="line"><a name="l06007"></a><span class="lineno"> 6007</span>&#160;    <span class="keywordtype">void</span> SetUserData(<a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator, <span class="keywordtype">void</span>* pUserData);</div>
-<div class="line"><a name="l06008"></a><span class="lineno"> 6008</span>&#160;    VmaSuballocationType GetSuballocationType()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> (VmaSuballocationType)m_SuballocationType; }</div>
-<div class="line"><a name="l06009"></a><span class="lineno"> 6009</span>&#160; </div>
-<div class="line"><a name="l06010"></a><span class="lineno"> 6010</span>&#160;    VmaDeviceMemoryBlock* GetBlock()<span class="keyword"> const</span></div>
-<div class="line"><a name="l06011"></a><span class="lineno"> 6011</span>&#160;<span class="keyword">    </span>{</div>
-<div class="line"><a name="l06012"></a><span class="lineno"> 6012</span>&#160;        VMA_ASSERT(m_Type == ALLOCATION_TYPE_BLOCK);</div>
-<div class="line"><a name="l06013"></a><span class="lineno"> 6013</span>&#160;        <span class="keywordflow">return</span> m_BlockAllocation.m_Block;</div>
-<div class="line"><a name="l06014"></a><span class="lineno"> 6014</span>&#160;    }</div>
-<div class="line"><a name="l06015"></a><span class="lineno"> 6015</span>&#160;    VkDeviceSize GetOffset() <span class="keyword">const</span>;</div>
-<div class="line"><a name="l06016"></a><span class="lineno"> 6016</span>&#160;    VkDeviceMemory GetMemory() <span class="keyword">const</span>;</div>
-<div class="line"><a name="l06017"></a><span class="lineno"> 6017</span>&#160;    uint32_t GetMemoryTypeIndex()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_MemoryTypeIndex; }</div>
-<div class="line"><a name="l06018"></a><span class="lineno"> 6018</span>&#160;    <span class="keywordtype">bool</span> IsPersistentMap()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> (m_MapCount &amp; MAP_COUNT_FLAG_PERSISTENT_MAP) != 0; }</div>
-<div class="line"><a name="l06019"></a><span class="lineno"> 6019</span>&#160;    <span class="keywordtype">void</span>* GetMappedData() <span class="keyword">const</span>;</div>
-<div class="line"><a name="l06020"></a><span class="lineno"> 6020</span>&#160;    <span class="keywordtype">bool</span> CanBecomeLost() <span class="keyword">const</span>;</div>
-<div class="line"><a name="l06021"></a><span class="lineno"> 6021</span>&#160;    </div>
-<div class="line"><a name="l06022"></a><span class="lineno"> 6022</span>&#160;    uint32_t GetLastUseFrameIndex()<span class="keyword"> const</span></div>
-<div class="line"><a name="l06023"></a><span class="lineno"> 6023</span>&#160;<span class="keyword">    </span>{</div>
-<div class="line"><a name="l06024"></a><span class="lineno"> 6024</span>&#160;        <span class="keywordflow">return</span> m_LastUseFrameIndex.load();</div>
-<div class="line"><a name="l06025"></a><span class="lineno"> 6025</span>&#160;    }</div>
-<div class="line"><a name="l06026"></a><span class="lineno"> 6026</span>&#160;    <span class="keywordtype">bool</span> CompareExchangeLastUseFrameIndex(uint32_t&amp; expected, uint32_t desired)</div>
-<div class="line"><a name="l06027"></a><span class="lineno"> 6027</span>&#160;    {</div>
-<div class="line"><a name="l06028"></a><span class="lineno"> 6028</span>&#160;        <span class="keywordflow">return</span> m_LastUseFrameIndex.compare_exchange_weak(expected, desired);</div>
-<div class="line"><a name="l06029"></a><span class="lineno"> 6029</span>&#160;    }</div>
-<div class="line"><a name="l06030"></a><span class="lineno"> 6030</span>&#160;    <span class="comment">/*</span></div>
-<div class="line"><a name="l06031"></a><span class="lineno"> 6031</span>&#160;<span class="comment">    - If hAllocation.LastUseFrameIndex + frameInUseCount &lt; allocator.CurrentFrameIndex,</span></div>
-<div class="line"><a name="l06032"></a><span class="lineno"> 6032</span>&#160;<span class="comment">      makes it lost by setting LastUseFrameIndex = VMA_FRAME_INDEX_LOST and returns true.</span></div>
-<div class="line"><a name="l06033"></a><span class="lineno"> 6033</span>&#160;<span class="comment">    - Else, returns false.</span></div>
-<div class="line"><a name="l06034"></a><span class="lineno"> 6034</span>&#160;<span class="comment">    </span></div>
-<div class="line"><a name="l06035"></a><span class="lineno"> 6035</span>&#160;<span class="comment">    If hAllocation is already lost, assert - you should not call it then.</span></div>
-<div class="line"><a name="l06036"></a><span class="lineno"> 6036</span>&#160;<span class="comment">    If hAllocation was not created with CAN_BECOME_LOST_BIT, assert.</span></div>
-<div class="line"><a name="l06037"></a><span class="lineno"> 6037</span>&#160;<span class="comment">    */</span></div>
-<div class="line"><a name="l06038"></a><span class="lineno"> 6038</span>&#160;    <span class="keywordtype">bool</span> MakeLost(uint32_t currentFrameIndex, uint32_t frameInUseCount);</div>
-<div class="line"><a name="l06039"></a><span class="lineno"> 6039</span>&#160; </div>
-<div class="line"><a name="l06040"></a><span class="lineno"> 6040</span>&#160;    <span class="keywordtype">void</span> DedicatedAllocCalcStatsInfo(<a class="code" href="struct_vma_stat_info.html">VmaStatInfo</a>&amp; outInfo)</div>
-<div class="line"><a name="l06041"></a><span class="lineno"> 6041</span>&#160;    {</div>
-<div class="line"><a name="l06042"></a><span class="lineno"> 6042</span>&#160;        VMA_ASSERT(m_Type == ALLOCATION_TYPE_DEDICATED);</div>
-<div class="line"><a name="l06043"></a><span class="lineno"> 6043</span>&#160;        outInfo.<a class="code" href="struct_vma_stat_info.html#abc4bb7cd611900778464c56e50c970a4">blockCount</a> = 1;</div>
-<div class="line"><a name="l06044"></a><span class="lineno"> 6044</span>&#160;        outInfo.<a class="code" href="struct_vma_stat_info.html#a537741e4d5cdddc1c0ab95ec650afaff">allocationCount</a> = 1;</div>
-<div class="line"><a name="l06045"></a><span class="lineno"> 6045</span>&#160;        outInfo.<a class="code" href="struct_vma_stat_info.html#ae06129c771bfebfd6468a7f4276502a9">unusedRangeCount</a> = 0;</div>
-<div class="line"><a name="l06046"></a><span class="lineno"> 6046</span>&#160;        outInfo.<a class="code" href="struct_vma_stat_info.html#ab0c6c73837e5a70c749fbd4f6064895a">usedBytes</a> = m_Size;</div>
-<div class="line"><a name="l06047"></a><span class="lineno"> 6047</span>&#160;        outInfo.<a class="code" href="struct_vma_stat_info.html#a1859d290aca2cd582d8dc25922092669">unusedBytes</a> = 0;</div>
-<div class="line"><a name="l06048"></a><span class="lineno"> 6048</span>&#160;        outInfo.<a class="code" href="struct_vma_stat_info.html#ade8b40bd3139c04aabd2fc538a356fea">allocationSizeMin</a> = outInfo.<a class="code" href="struct_vma_stat_info.html#a17e9733a5ecd76287d4db6e66f71f50c">allocationSizeMax</a> = m_Size;</div>
-<div class="line"><a name="l06049"></a><span class="lineno"> 6049</span>&#160;        outInfo.<a class="code" href="struct_vma_stat_info.html#aedeba931324f16589cd2416c0d2dd0d4">unusedRangeSizeMin</a> = UINT64_MAX;</div>
-<div class="line"><a name="l06050"></a><span class="lineno"> 6050</span>&#160;        outInfo.<a class="code" href="struct_vma_stat_info.html#a5ba1a2476c4d39b10f7e2f7ebbb72ac4">unusedRangeSizeMax</a> = 0;</div>
-<div class="line"><a name="l06051"></a><span class="lineno"> 6051</span>&#160;    }</div>
-<div class="line"><a name="l06052"></a><span class="lineno"> 6052</span>&#160; </div>
-<div class="line"><a name="l06053"></a><span class="lineno"> 6053</span>&#160;    <span class="keywordtype">void</span> BlockAllocMap();</div>
-<div class="line"><a name="l06054"></a><span class="lineno"> 6054</span>&#160;    <span class="keywordtype">void</span> BlockAllocUnmap();</div>
-<div class="line"><a name="l06055"></a><span class="lineno"> 6055</span>&#160;    VkResult DedicatedAllocMap(<a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator, <span class="keywordtype">void</span>** ppData);</div>
-<div class="line"><a name="l06056"></a><span class="lineno"> 6056</span>&#160;    <span class="keywordtype">void</span> DedicatedAllocUnmap(<a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator);</div>
-<div class="line"><a name="l06057"></a><span class="lineno"> 6057</span>&#160; </div>
-<div class="line"><a name="l06058"></a><span class="lineno"> 6058</span>&#160;<span class="preprocessor">#if VMA_STATS_STRING_ENABLED</span></div>
-<div class="line"><a name="l06059"></a><span class="lineno"> 6059</span>&#160;    uint32_t GetCreationFrameIndex()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_CreationFrameIndex; }</div>
-<div class="line"><a name="l06060"></a><span class="lineno"> 6060</span>&#160;    uint32_t GetBufferImageUsage()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_BufferImageUsage; }</div>
-<div class="line"><a name="l06061"></a><span class="lineno"> 6061</span>&#160; </div>
-<div class="line"><a name="l06062"></a><span class="lineno"> 6062</span>&#160;    <span class="keywordtype">void</span> InitBufferImageUsage(uint32_t bufferImageUsage)</div>
-<div class="line"><a name="l06063"></a><span class="lineno"> 6063</span>&#160;    {</div>
-<div class="line"><a name="l06064"></a><span class="lineno"> 6064</span>&#160;        VMA_ASSERT(m_BufferImageUsage == 0);</div>
-<div class="line"><a name="l06065"></a><span class="lineno"> 6065</span>&#160;        m_BufferImageUsage = bufferImageUsage;</div>
-<div class="line"><a name="l06066"></a><span class="lineno"> 6066</span>&#160;    }</div>
-<div class="line"><a name="l06067"></a><span class="lineno"> 6067</span>&#160; </div>
-<div class="line"><a name="l06068"></a><span class="lineno"> 6068</span>&#160;    <span class="keywordtype">void</span> PrintParameters(<span class="keyword">class</span> VmaJsonWriter&amp; json) <span class="keyword">const</span>;</div>
-<div class="line"><a name="l06069"></a><span class="lineno"> 6069</span>&#160;<span class="preprocessor">#endif</span></div>
-<div class="line"><a name="l06070"></a><span class="lineno"> 6070</span>&#160; </div>
-<div class="line"><a name="l06071"></a><span class="lineno"> 6071</span>&#160;<span class="keyword">private</span>:</div>
-<div class="line"><a name="l06072"></a><span class="lineno"> 6072</span>&#160;    VkDeviceSize m_Alignment;</div>
-<div class="line"><a name="l06073"></a><span class="lineno"> 6073</span>&#160;    VkDeviceSize m_Size;</div>
-<div class="line"><a name="l06074"></a><span class="lineno"> 6074</span>&#160;    <span class="keywordtype">void</span>* m_pUserData;</div>
-<div class="line"><a name="l06075"></a><span class="lineno"> 6075</span>&#160;    VMA_ATOMIC_UINT32 m_LastUseFrameIndex;</div>
-<div class="line"><a name="l06076"></a><span class="lineno"> 6076</span>&#160;    uint32_t m_MemoryTypeIndex;</div>
-<div class="line"><a name="l06077"></a><span class="lineno"> 6077</span>&#160;    uint8_t m_Type; <span class="comment">// ALLOCATION_TYPE</span></div>
-<div class="line"><a name="l06078"></a><span class="lineno"> 6078</span>&#160;    uint8_t m_SuballocationType; <span class="comment">// VmaSuballocationType</span></div>
-<div class="line"><a name="l06079"></a><span class="lineno"> 6079</span>&#160;    <span class="comment">// Bit 0x80 is set when allocation was created with VMA_ALLOCATION_CREATE_MAPPED_BIT.</span></div>
-<div class="line"><a name="l06080"></a><span class="lineno"> 6080</span>&#160;    <span class="comment">// Bits with mask 0x7F are reference counter for vmaMapMemory()/vmaUnmapMemory().</span></div>
-<div class="line"><a name="l06081"></a><span class="lineno"> 6081</span>&#160;    uint8_t m_MapCount;</div>
-<div class="line"><a name="l06082"></a><span class="lineno"> 6082</span>&#160;    uint8_t m_Flags; <span class="comment">// enum FLAGS</span></div>
-<div class="line"><a name="l06083"></a><span class="lineno"> 6083</span>&#160; </div>
-<div class="line"><a name="l06084"></a><span class="lineno"> 6084</span>&#160;    <span class="comment">// Allocation out of VmaDeviceMemoryBlock.</span></div>
-<div class="line"><a name="l06085"></a><span class="lineno"> 6085</span>&#160;    <span class="keyword">struct </span>BlockAllocation</div>
-<div class="line"><a name="l06086"></a><span class="lineno"> 6086</span>&#160;    {</div>
-<div class="line"><a name="l06087"></a><span class="lineno"> 6087</span>&#160;        VmaDeviceMemoryBlock* m_Block;</div>
-<div class="line"><a name="l06088"></a><span class="lineno"> 6088</span>&#160;        VkDeviceSize m_Offset;</div>
-<div class="line"><a name="l06089"></a><span class="lineno"> 6089</span>&#160;        <span class="keywordtype">bool</span> m_CanBecomeLost;</div>
-<div class="line"><a name="l06090"></a><span class="lineno"> 6090</span>&#160;    };</div>
-<div class="line"><a name="l06091"></a><span class="lineno"> 6091</span>&#160; </div>
-<div class="line"><a name="l06092"></a><span class="lineno"> 6092</span>&#160;    <span class="comment">// Allocation for an object that has its own private VkDeviceMemory.</span></div>
-<div class="line"><a name="l06093"></a><span class="lineno"> 6093</span>&#160;    <span class="keyword">struct </span>DedicatedAllocation</div>
-<div class="line"><a name="l06094"></a><span class="lineno"> 6094</span>&#160;    {</div>
-<div class="line"><a name="l06095"></a><span class="lineno"> 6095</span>&#160;        VkDeviceMemory m_hMemory;</div>
-<div class="line"><a name="l06096"></a><span class="lineno"> 6096</span>&#160;        <span class="keywordtype">void</span>* m_pMappedData; <span class="comment">// Not null means memory is mapped.</span></div>
-<div class="line"><a name="l06097"></a><span class="lineno"> 6097</span>&#160;    };</div>
-<div class="line"><a name="l06098"></a><span class="lineno"> 6098</span>&#160; </div>
-<div class="line"><a name="l06099"></a><span class="lineno"> 6099</span>&#160;    <span class="keyword">union</span></div>
-<div class="line"><a name="l06100"></a><span class="lineno"> 6100</span>&#160;    {</div>
-<div class="line"><a name="l06101"></a><span class="lineno"> 6101</span>&#160;        <span class="comment">// Allocation out of VmaDeviceMemoryBlock.</span></div>
-<div class="line"><a name="l06102"></a><span class="lineno"> 6102</span>&#160;        BlockAllocation m_BlockAllocation;</div>
-<div class="line"><a name="l06103"></a><span class="lineno"> 6103</span>&#160;        <span class="comment">// Allocation for an object that has its own private VkDeviceMemory.</span></div>
-<div class="line"><a name="l06104"></a><span class="lineno"> 6104</span>&#160;        DedicatedAllocation m_DedicatedAllocation;</div>
-<div class="line"><a name="l06105"></a><span class="lineno"> 6105</span>&#160;    };</div>
-<div class="line"><a name="l06106"></a><span class="lineno"> 6106</span>&#160; </div>
-<div class="line"><a name="l06107"></a><span class="lineno"> 6107</span>&#160;<span class="preprocessor">#if VMA_STATS_STRING_ENABLED</span></div>
-<div class="line"><a name="l06108"></a><span class="lineno"> 6108</span>&#160;    uint32_t m_CreationFrameIndex;</div>
-<div class="line"><a name="l06109"></a><span class="lineno"> 6109</span>&#160;    uint32_t m_BufferImageUsage; <span class="comment">// 0 if unknown.</span></div>
-<div class="line"><a name="l06110"></a><span class="lineno"> 6110</span>&#160;<span class="preprocessor">#endif</span></div>
-<div class="line"><a name="l06111"></a><span class="lineno"> 6111</span>&#160; </div>
-<div class="line"><a name="l06112"></a><span class="lineno"> 6112</span>&#160;    <span class="keywordtype">void</span> FreeUserDataString(<a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator);</div>
-<div class="line"><a name="l06113"></a><span class="lineno"> 6113</span>&#160;};</div>
-<div class="line"><a name="l06114"></a><span class="lineno"> 6114</span>&#160; </div>
-<div class="line"><a name="l06115"></a><span class="lineno"> 6115</span>&#160;<span class="comment">/*</span></div>
-<div class="line"><a name="l06116"></a><span class="lineno"> 6116</span>&#160;<span class="comment">Represents a region of VmaDeviceMemoryBlock that is either assigned and returned as</span></div>
-<div class="line"><a name="l06117"></a><span class="lineno"> 6117</span>&#160;<span class="comment">allocated memory block or free.</span></div>
-<div class="line"><a name="l06118"></a><span class="lineno"> 6118</span>&#160;<span class="comment">*/</span></div>
-<div class="line"><a name="l06119"></a><span class="lineno"> 6119</span>&#160;<span class="keyword">struct </span>VmaSuballocation</div>
-<div class="line"><a name="l06120"></a><span class="lineno"> 6120</span>&#160;{</div>
-<div class="line"><a name="l06121"></a><span class="lineno"> 6121</span>&#160;    VkDeviceSize offset;</div>
-<div class="line"><a name="l06122"></a><span class="lineno"> 6122</span>&#160;    VkDeviceSize size;</div>
-<div class="line"><a name="l06123"></a><span class="lineno"> 6123</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> hAllocation;</div>
-<div class="line"><a name="l06124"></a><span class="lineno"> 6124</span>&#160;    VmaSuballocationType type;</div>
-<div class="line"><a name="l06125"></a><span class="lineno"> 6125</span>&#160;};</div>
-<div class="line"><a name="l06126"></a><span class="lineno"> 6126</span>&#160; </div>
-<div class="line"><a name="l06127"></a><span class="lineno"> 6127</span>&#160;<span class="comment">// Comparator for offsets.</span></div>
-<div class="line"><a name="l06128"></a><span class="lineno"> 6128</span>&#160;<span class="keyword">struct </span>VmaSuballocationOffsetLess</div>
-<div class="line"><a name="l06129"></a><span class="lineno"> 6129</span>&#160;{</div>
-<div class="line"><a name="l06130"></a><span class="lineno"> 6130</span>&#160;    <span class="keywordtype">bool</span> operator()(<span class="keyword">const</span> VmaSuballocation&amp; lhs, <span class="keyword">const</span> VmaSuballocation&amp; rhs)<span class="keyword"> const</span></div>
-<div class="line"><a name="l06131"></a><span class="lineno"> 6131</span>&#160;<span class="keyword">    </span>{</div>
-<div class="line"><a name="l06132"></a><span class="lineno"> 6132</span>&#160;        <span class="keywordflow">return</span> lhs.offset &lt; rhs.offset;</div>
-<div class="line"><a name="l06133"></a><span class="lineno"> 6133</span>&#160;    }</div>
-<div class="line"><a name="l06134"></a><span class="lineno"> 6134</span>&#160;};</div>
-<div class="line"><a name="l06135"></a><span class="lineno"> 6135</span>&#160;<span class="keyword">struct </span>VmaSuballocationOffsetGreater</div>
-<div class="line"><a name="l06136"></a><span class="lineno"> 6136</span>&#160;{</div>
-<div class="line"><a name="l06137"></a><span class="lineno"> 6137</span>&#160;    <span class="keywordtype">bool</span> operator()(<span class="keyword">const</span> VmaSuballocation&amp; lhs, <span class="keyword">const</span> VmaSuballocation&amp; rhs)<span class="keyword"> const</span></div>
-<div class="line"><a name="l06138"></a><span class="lineno"> 6138</span>&#160;<span class="keyword">    </span>{</div>
-<div class="line"><a name="l06139"></a><span class="lineno"> 6139</span>&#160;        <span class="keywordflow">return</span> lhs.offset &gt; rhs.offset;</div>
-<div class="line"><a name="l06140"></a><span class="lineno"> 6140</span>&#160;    }</div>
-<div class="line"><a name="l06141"></a><span class="lineno"> 6141</span>&#160;};</div>
-<div class="line"><a name="l06142"></a><span class="lineno"> 6142</span>&#160; </div>
-<div class="line"><a name="l06143"></a><span class="lineno"> 6143</span>&#160;<span class="keyword">typedef</span> VmaList&lt; VmaSuballocation, VmaStlAllocator&lt;VmaSuballocation&gt; &gt; VmaSuballocationList;</div>
-<div class="line"><a name="l06144"></a><span class="lineno"> 6144</span>&#160; </div>
-<div class="line"><a name="l06145"></a><span class="lineno"> 6145</span>&#160;<span class="comment">// Cost of one additional allocation lost, as equivalent in bytes.</span></div>
-<div class="line"><a name="l06146"></a><span class="lineno"> 6146</span>&#160;<span class="keyword">static</span> <span class="keyword">const</span> VkDeviceSize VMA_LOST_ALLOCATION_COST = 1048576;</div>
-<div class="line"><a name="l06147"></a><span class="lineno"> 6147</span>&#160; </div>
-<div class="line"><a name="l06148"></a><span class="lineno"> 6148</span>&#160;<span class="keyword">enum class</span> VmaAllocationRequestType</div>
-<div class="line"><a name="l06149"></a><span class="lineno"> 6149</span>&#160;{</div>
-<div class="line"><a name="l06150"></a><span class="lineno"> 6150</span>&#160;    Normal,</div>
-<div class="line"><a name="l06151"></a><span class="lineno"> 6151</span>&#160;    <span class="comment">// Used by &quot;Linear&quot; algorithm.</span></div>
-<div class="line"><a name="l06152"></a><span class="lineno"> 6152</span>&#160;    UpperAddress,</div>
-<div class="line"><a name="l06153"></a><span class="lineno"> 6153</span>&#160;    EndOf1st,</div>
-<div class="line"><a name="l06154"></a><span class="lineno"> 6154</span>&#160;    EndOf2nd,</div>
-<div class="line"><a name="l06155"></a><span class="lineno"> 6155</span>&#160;};</div>
-<div class="line"><a name="l06156"></a><span class="lineno"> 6156</span>&#160; </div>
-<div class="line"><a name="l06157"></a><span class="lineno"> 6157</span>&#160;<span class="comment">/*</span></div>
-<div class="line"><a name="l06158"></a><span class="lineno"> 6158</span>&#160;<span class="comment">Parameters of planned allocation inside a VmaDeviceMemoryBlock.</span></div>
-<div class="line"><a name="l06159"></a><span class="lineno"> 6159</span>&#160;<span class="comment"></span> </div>
-<div class="line"><a name="l06160"></a><span class="lineno"> 6160</span>&#160;<span class="comment">If canMakeOtherLost was false:</span></div>
-<div class="line"><a name="l06161"></a><span class="lineno"> 6161</span>&#160;<span class="comment">- item points to a FREE suballocation.</span></div>
-<div class="line"><a name="l06162"></a><span class="lineno"> 6162</span>&#160;<span class="comment">- itemsToMakeLostCount is 0.</span></div>
-<div class="line"><a name="l06163"></a><span class="lineno"> 6163</span>&#160;<span class="comment"></span> </div>
-<div class="line"><a name="l06164"></a><span class="lineno"> 6164</span>&#160;<span class="comment">If canMakeOtherLost was true:</span></div>
-<div class="line"><a name="l06165"></a><span class="lineno"> 6165</span>&#160;<span class="comment">- item points to first of sequence of suballocations, which are either FREE,</span></div>
-<div class="line"><a name="l06166"></a><span class="lineno"> 6166</span>&#160;<span class="comment">  or point to VmaAllocations that can become lost.</span></div>
-<div class="line"><a name="l06167"></a><span class="lineno"> 6167</span>&#160;<span class="comment">- itemsToMakeLostCount is the number of VmaAllocations that need to be made lost for</span></div>
-<div class="line"><a name="l06168"></a><span class="lineno"> 6168</span>&#160;<span class="comment">  the requested allocation to succeed.</span></div>
-<div class="line"><a name="l06169"></a><span class="lineno"> 6169</span>&#160;<span class="comment">*/</span></div>
-<div class="line"><a name="l06170"></a><span class="lineno"> 6170</span>&#160;<span class="keyword">struct </span>VmaAllocationRequest</div>
-<div class="line"><a name="l06171"></a><span class="lineno"> 6171</span>&#160;{</div>
-<div class="line"><a name="l06172"></a><span class="lineno"> 6172</span>&#160;    VkDeviceSize offset;</div>
-<div class="line"><a name="l06173"></a><span class="lineno"> 6173</span>&#160;    VkDeviceSize sumFreeSize; <span class="comment">// Sum size of free items that overlap with proposed allocation.</span></div>
-<div class="line"><a name="l06174"></a><span class="lineno"> 6174</span>&#160;    VkDeviceSize sumItemSize; <span class="comment">// Sum size of items to make lost that overlap with proposed allocation.</span></div>
-<div class="line"><a name="l06175"></a><span class="lineno"> 6175</span>&#160;    VmaSuballocationList::iterator item;</div>
-<div class="line"><a name="l06176"></a><span class="lineno"> 6176</span>&#160;    <span class="keywordtype">size_t</span> itemsToMakeLostCount;</div>
-<div class="line"><a name="l06177"></a><span class="lineno"> 6177</span>&#160;    <span class="keywordtype">void</span>* customData;</div>
-<div class="line"><a name="l06178"></a><span class="lineno"> 6178</span>&#160;    VmaAllocationRequestType type;</div>
-<div class="line"><a name="l06179"></a><span class="lineno"> 6179</span>&#160; </div>
-<div class="line"><a name="l06180"></a><span class="lineno"> 6180</span>&#160;    VkDeviceSize CalcCost()<span class="keyword"> const</span></div>
-<div class="line"><a name="l06181"></a><span class="lineno"> 6181</span>&#160;<span class="keyword">    </span>{</div>
-<div class="line"><a name="l06182"></a><span class="lineno"> 6182</span>&#160;        <span class="keywordflow">return</span> sumItemSize + itemsToMakeLostCount * VMA_LOST_ALLOCATION_COST;</div>
-<div class="line"><a name="l06183"></a><span class="lineno"> 6183</span>&#160;    }</div>
-<div class="line"><a name="l06184"></a><span class="lineno"> 6184</span>&#160;};</div>
-<div class="line"><a name="l06185"></a><span class="lineno"> 6185</span>&#160; </div>
-<div class="line"><a name="l06186"></a><span class="lineno"> 6186</span>&#160;<span class="comment">/*</span></div>
-<div class="line"><a name="l06187"></a><span class="lineno"> 6187</span>&#160;<span class="comment">Data structure used for bookkeeping of allocations and unused ranges of memory</span></div>
-<div class="line"><a name="l06188"></a><span class="lineno"> 6188</span>&#160;<span class="comment">in a single VkDeviceMemory block.</span></div>
-<div class="line"><a name="l06189"></a><span class="lineno"> 6189</span>&#160;<span class="comment">*/</span></div>
-<div class="line"><a name="l06190"></a><span class="lineno"> 6190</span>&#160;<span class="keyword">class </span>VmaBlockMetadata</div>
-<div class="line"><a name="l06191"></a><span class="lineno"> 6191</span>&#160;{</div>
-<div class="line"><a name="l06192"></a><span class="lineno"> 6192</span>&#160;<span class="keyword">public</span>:</div>
-<div class="line"><a name="l06193"></a><span class="lineno"> 6193</span>&#160;    VmaBlockMetadata(<a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator);</div>
-<div class="line"><a name="l06194"></a><span class="lineno"> 6194</span>&#160;    <span class="keyword">virtual</span> ~VmaBlockMetadata() { }</div>
-<div class="line"><a name="l06195"></a><span class="lineno"> 6195</span>&#160;    <span class="keyword">virtual</span> <span class="keywordtype">void</span> Init(VkDeviceSize size) { m_Size = size; }</div>
-<div class="line"><a name="l06196"></a><span class="lineno"> 6196</span>&#160; </div>
-<div class="line"><a name="l06197"></a><span class="lineno"> 6197</span>&#160;    <span class="comment">// Validates all data structures inside this object. If not valid, returns false.</span></div>
-<div class="line"><a name="l06198"></a><span class="lineno"> 6198</span>&#160;    <span class="keyword">virtual</span> <span class="keywordtype">bool</span> Validate() <span class="keyword">const</span> = 0;</div>
-<div class="line"><a name="l06199"></a><span class="lineno"> 6199</span>&#160;    VkDeviceSize GetSize()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_Size; }</div>
-<div class="line"><a name="l06200"></a><span class="lineno"> 6200</span>&#160;    <span class="keyword">virtual</span> <span class="keywordtype">size_t</span> GetAllocationCount() <span class="keyword">const</span> = 0;</div>
-<div class="line"><a name="l06201"></a><span class="lineno"> 6201</span>&#160;    <span class="keyword">virtual</span> VkDeviceSize GetSumFreeSize() <span class="keyword">const</span> = 0;</div>
-<div class="line"><a name="l06202"></a><span class="lineno"> 6202</span>&#160;    <span class="keyword">virtual</span> VkDeviceSize GetUnusedRangeSizeMax() <span class="keyword">const</span> = 0;</div>
-<div class="line"><a name="l06203"></a><span class="lineno"> 6203</span>&#160;    <span class="comment">// Returns true if this block is empty - contains only single free suballocation.</span></div>
-<div class="line"><a name="l06204"></a><span class="lineno"> 6204</span>&#160;    <span class="keyword">virtual</span> <span class="keywordtype">bool</span> IsEmpty() <span class="keyword">const</span> = 0;</div>
-<div class="line"><a name="l06205"></a><span class="lineno"> 6205</span>&#160; </div>
-<div class="line"><a name="l06206"></a><span class="lineno"> 6206</span>&#160;    <span class="keyword">virtual</span> <span class="keywordtype">void</span> CalcAllocationStatInfo(<a class="code" href="struct_vma_stat_info.html">VmaStatInfo</a>&amp; outInfo) <span class="keyword">const</span> = 0;</div>
-<div class="line"><a name="l06207"></a><span class="lineno"> 6207</span>&#160;    <span class="comment">// Shouldn&#39;t modify blockCount.</span></div>
-<div class="line"><a name="l06208"></a><span class="lineno"> 6208</span>&#160;    <span class="keyword">virtual</span> <span class="keywordtype">void</span> AddPoolStats(<a class="code" href="struct_vma_pool_stats.html">VmaPoolStats</a>&amp; inoutStats) <span class="keyword">const</span> = 0;</div>
-<div class="line"><a name="l06209"></a><span class="lineno"> 6209</span>&#160; </div>
-<div class="line"><a name="l06210"></a><span class="lineno"> 6210</span>&#160;<span class="preprocessor">#if VMA_STATS_STRING_ENABLED</span></div>
-<div class="line"><a name="l06211"></a><span class="lineno"> 6211</span>&#160;    <span class="keyword">virtual</span> <span class="keywordtype">void</span> PrintDetailedMap(<span class="keyword">class</span> VmaJsonWriter&amp; json) <span class="keyword">const</span> = 0;</div>
-<div class="line"><a name="l06212"></a><span class="lineno"> 6212</span>&#160;<span class="preprocessor">#endif</span></div>
-<div class="line"><a name="l06213"></a><span class="lineno"> 6213</span>&#160; </div>
-<div class="line"><a name="l06214"></a><span class="lineno"> 6214</span>&#160;    <span class="comment">// Tries to find a place for suballocation with given parameters inside this block.</span></div>
-<div class="line"><a name="l06215"></a><span class="lineno"> 6215</span>&#160;    <span class="comment">// If succeeded, fills pAllocationRequest and returns true.</span></div>
-<div class="line"><a name="l06216"></a><span class="lineno"> 6216</span>&#160;    <span class="comment">// If failed, returns false.</span></div>
-<div class="line"><a name="l06217"></a><span class="lineno"> 6217</span>&#160;    <span class="keyword">virtual</span> <span class="keywordtype">bool</span> CreateAllocationRequest(</div>
-<div class="line"><a name="l06218"></a><span class="lineno"> 6218</span>&#160;        uint32_t currentFrameIndex,</div>
-<div class="line"><a name="l06219"></a><span class="lineno"> 6219</span>&#160;        uint32_t frameInUseCount,</div>
-<div class="line"><a name="l06220"></a><span class="lineno"> 6220</span>&#160;        VkDeviceSize bufferImageGranularity,</div>
-<div class="line"><a name="l06221"></a><span class="lineno"> 6221</span>&#160;        VkDeviceSize allocSize,</div>
-<div class="line"><a name="l06222"></a><span class="lineno"> 6222</span>&#160;        VkDeviceSize allocAlignment,</div>
-<div class="line"><a name="l06223"></a><span class="lineno"> 6223</span>&#160;        <span class="keywordtype">bool</span> upperAddress,</div>
-<div class="line"><a name="l06224"></a><span class="lineno"> 6224</span>&#160;        VmaSuballocationType allocType,</div>
-<div class="line"><a name="l06225"></a><span class="lineno"> 6225</span>&#160;        <span class="keywordtype">bool</span> canMakeOtherLost,</div>
-<div class="line"><a name="l06226"></a><span class="lineno"> 6226</span>&#160;        <span class="comment">// Always one of VMA_ALLOCATION_CREATE_STRATEGY_* or VMA_ALLOCATION_INTERNAL_STRATEGY_* flags.</span></div>
-<div class="line"><a name="l06227"></a><span class="lineno"> 6227</span>&#160;        uint32_t strategy,</div>
-<div class="line"><a name="l06228"></a><span class="lineno"> 6228</span>&#160;        VmaAllocationRequest* pAllocationRequest) = 0;</div>
-<div class="line"><a name="l06229"></a><span class="lineno"> 6229</span>&#160; </div>
-<div class="line"><a name="l06230"></a><span class="lineno"> 6230</span>&#160;    <span class="keyword">virtual</span> <span class="keywordtype">bool</span> MakeRequestedAllocationsLost(</div>
-<div class="line"><a name="l06231"></a><span class="lineno"> 6231</span>&#160;        uint32_t currentFrameIndex,</div>
-<div class="line"><a name="l06232"></a><span class="lineno"> 6232</span>&#160;        uint32_t frameInUseCount,</div>
-<div class="line"><a name="l06233"></a><span class="lineno"> 6233</span>&#160;        VmaAllocationRequest* pAllocationRequest) = 0;</div>
-<div class="line"><a name="l06234"></a><span class="lineno"> 6234</span>&#160; </div>
-<div class="line"><a name="l06235"></a><span class="lineno"> 6235</span>&#160;    <span class="keyword">virtual</span> uint32_t MakeAllocationsLost(uint32_t currentFrameIndex, uint32_t frameInUseCount) = 0;</div>
-<div class="line"><a name="l06236"></a><span class="lineno"> 6236</span>&#160; </div>
-<div class="line"><a name="l06237"></a><span class="lineno"> 6237</span>&#160;    <span class="keyword">virtual</span> VkResult CheckCorruption(<span class="keyword">const</span> <span class="keywordtype">void</span>* pBlockData) = 0;</div>
-<div class="line"><a name="l06238"></a><span class="lineno"> 6238</span>&#160; </div>
-<div class="line"><a name="l06239"></a><span class="lineno"> 6239</span>&#160;    <span class="comment">// Makes actual allocation based on request. Request must already be checked and valid.</span></div>
-<div class="line"><a name="l06240"></a><span class="lineno"> 6240</span>&#160;    <span class="keyword">virtual</span> <span class="keywordtype">void</span> Alloc(</div>
-<div class="line"><a name="l06241"></a><span class="lineno"> 6241</span>&#160;        <span class="keyword">const</span> VmaAllocationRequest&amp; request,</div>
-<div class="line"><a name="l06242"></a><span class="lineno"> 6242</span>&#160;        VmaSuballocationType type,</div>
-<div class="line"><a name="l06243"></a><span class="lineno"> 6243</span>&#160;        VkDeviceSize allocSize,</div>
-<div class="line"><a name="l06244"></a><span class="lineno"> 6244</span>&#160;        <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> hAllocation) = 0;</div>
-<div class="line"><a name="l06245"></a><span class="lineno"> 6245</span>&#160; </div>
-<div class="line"><a name="l06246"></a><span class="lineno"> 6246</span>&#160;    <span class="comment">// Frees suballocation assigned to given memory region.</span></div>
-<div class="line"><a name="l06247"></a><span class="lineno"> 6247</span>&#160;    <span class="keyword">virtual</span> <span class="keywordtype">void</span> Free(<span class="keyword">const</span> <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation) = 0;</div>
-<div class="line"><a name="l06248"></a><span class="lineno"> 6248</span>&#160;    <span class="keyword">virtual</span> <span class="keywordtype">void</span> FreeAtOffset(VkDeviceSize offset) = 0;</div>
+<div class="line"><a name="l05975"></a><span class="lineno"> 5975</span>&#160;        const_iterator operator++(<span class="keywordtype">int</span>)</div>
+<div class="line"><a name="l05976"></a><span class="lineno"> 5976</span>&#160;        {</div>
+<div class="line"><a name="l05977"></a><span class="lineno"> 5977</span>&#160;            const_iterator result = *<span class="keyword">this</span>;</div>
+<div class="line"><a name="l05978"></a><span class="lineno"> 5978</span>&#160;            ++*<span class="keyword">this</span>;</div>
+<div class="line"><a name="l05979"></a><span class="lineno"> 5979</span>&#160;            <span class="keywordflow">return</span> result;</div>
+<div class="line"><a name="l05980"></a><span class="lineno"> 5980</span>&#160;        }</div>
+<div class="line"><a name="l05981"></a><span class="lineno"> 5981</span>&#160;        const_iterator operator--(<span class="keywordtype">int</span>)</div>
+<div class="line"><a name="l05982"></a><span class="lineno"> 5982</span>&#160;        {</div>
+<div class="line"><a name="l05983"></a><span class="lineno"> 5983</span>&#160;            const_iterator result = *<span class="keyword">this</span>;</div>
+<div class="line"><a name="l05984"></a><span class="lineno"> 5984</span>&#160;            --*<span class="keyword">this</span>;</div>
+<div class="line"><a name="l05985"></a><span class="lineno"> 5985</span>&#160;            <span class="keywordflow">return</span> result;</div>
+<div class="line"><a name="l05986"></a><span class="lineno"> 5986</span>&#160;        }</div>
+<div class="line"><a name="l05987"></a><span class="lineno"> 5987</span>&#160; </div>
+<div class="line"><a name="l05988"></a><span class="lineno"> 5988</span>&#160;        <span class="keywordtype">bool</span> operator==(<span class="keyword">const</span> const_iterator&amp; rhs)<span class="keyword"> const</span></div>
+<div class="line"><a name="l05989"></a><span class="lineno"> 5989</span>&#160;<span class="keyword">        </span>{</div>
+<div class="line"><a name="l05990"></a><span class="lineno"> 5990</span>&#160;            VMA_HEAVY_ASSERT(m_pList == rhs.m_pList);</div>
+<div class="line"><a name="l05991"></a><span class="lineno"> 5991</span>&#160;            <span class="keywordflow">return</span> m_pItem == rhs.m_pItem;</div>
+<div class="line"><a name="l05992"></a><span class="lineno"> 5992</span>&#160;        }</div>
+<div class="line"><a name="l05993"></a><span class="lineno"> 5993</span>&#160;        <span class="keywordtype">bool</span> operator!=(<span class="keyword">const</span> const_iterator&amp; rhs)<span class="keyword"> const</span></div>
+<div class="line"><a name="l05994"></a><span class="lineno"> 5994</span>&#160;<span class="keyword">        </span>{</div>
+<div class="line"><a name="l05995"></a><span class="lineno"> 5995</span>&#160;            VMA_HEAVY_ASSERT(m_pList == rhs.m_pList);</div>
+<div class="line"><a name="l05996"></a><span class="lineno"> 5996</span>&#160;            <span class="keywordflow">return</span> m_pItem != rhs.m_pItem;</div>
+<div class="line"><a name="l05997"></a><span class="lineno"> 5997</span>&#160;        }</div>
+<div class="line"><a name="l05998"></a><span class="lineno"> 5998</span>&#160; </div>
+<div class="line"><a name="l05999"></a><span class="lineno"> 5999</span>&#160;    <span class="keyword">private</span>:</div>
+<div class="line"><a name="l06000"></a><span class="lineno"> 6000</span>&#160;        const_iterator(<span class="keyword">const</span> VmaRawList&lt;T&gt;* pList, <span class="keyword">const</span> VmaListItem&lt;T&gt;* pItem) :</div>
+<div class="line"><a name="l06001"></a><span class="lineno"> 6001</span>&#160;            m_pList(pList),</div>
+<div class="line"><a name="l06002"></a><span class="lineno"> 6002</span>&#160;            m_pItem(pItem)</div>
+<div class="line"><a name="l06003"></a><span class="lineno"> 6003</span>&#160;        {</div>
+<div class="line"><a name="l06004"></a><span class="lineno"> 6004</span>&#160;        }</div>
+<div class="line"><a name="l06005"></a><span class="lineno"> 6005</span>&#160; </div>
+<div class="line"><a name="l06006"></a><span class="lineno"> 6006</span>&#160;        <span class="keyword">const</span> VmaRawList&lt;T&gt;* m_pList;</div>
+<div class="line"><a name="l06007"></a><span class="lineno"> 6007</span>&#160;        <span class="keyword">const</span> VmaListItem&lt;T&gt;* m_pItem;</div>
+<div class="line"><a name="l06008"></a><span class="lineno"> 6008</span>&#160; </div>
+<div class="line"><a name="l06009"></a><span class="lineno"> 6009</span>&#160;        <span class="keyword">friend</span> <span class="keyword">class </span>VmaList&lt;T, AllocatorT&gt;;</div>
+<div class="line"><a name="l06010"></a><span class="lineno"> 6010</span>&#160;    };</div>
+<div class="line"><a name="l06011"></a><span class="lineno"> 6011</span>&#160; </div>
+<div class="line"><a name="l06012"></a><span class="lineno"> 6012</span>&#160;    VmaList(<span class="keyword">const</span> AllocatorT&amp; allocator) : m_RawList(allocator.m_pCallbacks) { }</div>
+<div class="line"><a name="l06013"></a><span class="lineno"> 6013</span>&#160; </div>
+<div class="line"><a name="l06014"></a><span class="lineno"> 6014</span>&#160;    <span class="keywordtype">bool</span> empty()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_RawList.IsEmpty(); }</div>
+<div class="line"><a name="l06015"></a><span class="lineno"> 6015</span>&#160;    <span class="keywordtype">size_t</span> size()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_RawList.GetCount(); }</div>
+<div class="line"><a name="l06016"></a><span class="lineno"> 6016</span>&#160; </div>
+<div class="line"><a name="l06017"></a><span class="lineno"> 6017</span>&#160;    iterator begin() { <span class="keywordflow">return</span> iterator(&amp;m_RawList, m_RawList.Front()); }</div>
+<div class="line"><a name="l06018"></a><span class="lineno"> 6018</span>&#160;    iterator end() { <span class="keywordflow">return</span> iterator(&amp;m_RawList, VMA_NULL); }</div>
+<div class="line"><a name="l06019"></a><span class="lineno"> 6019</span>&#160; </div>
+<div class="line"><a name="l06020"></a><span class="lineno"> 6020</span>&#160;    const_iterator cbegin()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> const_iterator(&amp;m_RawList, m_RawList.Front()); }</div>
+<div class="line"><a name="l06021"></a><span class="lineno"> 6021</span>&#160;    const_iterator cend()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> const_iterator(&amp;m_RawList, VMA_NULL); }</div>
+<div class="line"><a name="l06022"></a><span class="lineno"> 6022</span>&#160; </div>
+<div class="line"><a name="l06023"></a><span class="lineno"> 6023</span>&#160;    <span class="keywordtype">void</span> clear() { m_RawList.Clear(); }</div>
+<div class="line"><a name="l06024"></a><span class="lineno"> 6024</span>&#160;    <span class="keywordtype">void</span> push_back(<span class="keyword">const</span> T&amp; value) { m_RawList.PushBack(value); }</div>
+<div class="line"><a name="l06025"></a><span class="lineno"> 6025</span>&#160;    <span class="keywordtype">void</span> erase(iterator it) { m_RawList.Remove(it.m_pItem); }</div>
+<div class="line"><a name="l06026"></a><span class="lineno"> 6026</span>&#160;    iterator insert(iterator it, <span class="keyword">const</span> T&amp; value) { <span class="keywordflow">return</span> iterator(&amp;m_RawList, m_RawList.InsertBefore(it.m_pItem, value)); }</div>
+<div class="line"><a name="l06027"></a><span class="lineno"> 6027</span>&#160; </div>
+<div class="line"><a name="l06028"></a><span class="lineno"> 6028</span>&#160;<span class="keyword">private</span>:</div>
+<div class="line"><a name="l06029"></a><span class="lineno"> 6029</span>&#160;    VmaRawList&lt;T&gt; m_RawList;</div>
+<div class="line"><a name="l06030"></a><span class="lineno"> 6030</span>&#160;};</div>
+<div class="line"><a name="l06031"></a><span class="lineno"> 6031</span>&#160; </div>
+<div class="line"><a name="l06032"></a><span class="lineno"> 6032</span>&#160;<span class="preprocessor">#endif </span><span class="comment">// #if VMA_USE_STL_LIST</span></div>
+<div class="line"><a name="l06033"></a><span class="lineno"> 6033</span>&#160; </div>
+<div class="line"><a name="l06035"></a><span class="lineno"> 6035</span>&#160;<span class="comment">// class VmaIntrusiveLinkedList</span></div>
+<div class="line"><a name="l06036"></a><span class="lineno"> 6036</span>&#160; </div>
+<div class="line"><a name="l06037"></a><span class="lineno"> 6037</span>&#160;<span class="comment">/*</span></div>
+<div class="line"><a name="l06038"></a><span class="lineno"> 6038</span>&#160;<span class="comment">Expected interface of ItemTypeTraits:</span></div>
+<div class="line"><a name="l06039"></a><span class="lineno"> 6039</span>&#160;<span class="comment">struct MyItemTypeTraits</span></div>
+<div class="line"><a name="l06040"></a><span class="lineno"> 6040</span>&#160;<span class="comment">{</span></div>
+<div class="line"><a name="l06041"></a><span class="lineno"> 6041</span>&#160;<span class="comment">    typedef MyItem ItemType;</span></div>
+<div class="line"><a name="l06042"></a><span class="lineno"> 6042</span>&#160;<span class="comment">    static ItemType* GetPrev(const ItemType* item) { return item-&gt;myPrevPtr; }</span></div>
+<div class="line"><a name="l06043"></a><span class="lineno"> 6043</span>&#160;<span class="comment">    static ItemType* GetNext(const ItemType* item) { return item-&gt;myNextPtr; }</span></div>
+<div class="line"><a name="l06044"></a><span class="lineno"> 6044</span>&#160;<span class="comment">    static ItemType*&amp; AccessPrev(ItemType* item) { return item-&gt;myPrevPtr; }</span></div>
+<div class="line"><a name="l06045"></a><span class="lineno"> 6045</span>&#160;<span class="comment">    static ItemType*&amp; AccessNext(ItemType* item) { return item-&gt;myNextPtr; }</span></div>
+<div class="line"><a name="l06046"></a><span class="lineno"> 6046</span>&#160;<span class="comment">};</span></div>
+<div class="line"><a name="l06047"></a><span class="lineno"> 6047</span>&#160;<span class="comment">*/</span></div>
+<div class="line"><a name="l06048"></a><span class="lineno"> 6048</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> ItemTypeTraits&gt;</div>
+<div class="line"><a name="l06049"></a><span class="lineno"> 6049</span>&#160;<span class="keyword">class </span>VmaIntrusiveLinkedList</div>
+<div class="line"><a name="l06050"></a><span class="lineno"> 6050</span>&#160;{</div>
+<div class="line"><a name="l06051"></a><span class="lineno"> 6051</span>&#160;<span class="keyword">public</span>:</div>
+<div class="line"><a name="l06052"></a><span class="lineno"> 6052</span>&#160;    <span class="keyword">typedef</span> <span class="keyword">typename</span> ItemTypeTraits::ItemType ItemType;</div>
+<div class="line"><a name="l06053"></a><span class="lineno"> 6053</span>&#160;    <span class="keyword">static</span> ItemType* GetPrev(<span class="keyword">const</span> ItemType* item) { <span class="keywordflow">return</span> ItemTypeTraits::GetPrev(item); }</div>
+<div class="line"><a name="l06054"></a><span class="lineno"> 6054</span>&#160;    <span class="keyword">static</span> ItemType* GetNext(<span class="keyword">const</span> ItemType* item) { <span class="keywordflow">return</span> ItemTypeTraits::GetNext(item); }</div>
+<div class="line"><a name="l06055"></a><span class="lineno"> 6055</span>&#160;    <span class="comment">// Movable, not copyable.</span></div>
+<div class="line"><a name="l06056"></a><span class="lineno"> 6056</span>&#160;    VmaIntrusiveLinkedList() { }</div>
+<div class="line"><a name="l06057"></a><span class="lineno"> 6057</span>&#160;    VmaIntrusiveLinkedList(<span class="keyword">const</span> VmaIntrusiveLinkedList&lt;ItemTypeTraits&gt;&amp; src) = <span class="keyword">delete</span>;</div>
+<div class="line"><a name="l06058"></a><span class="lineno"> 6058</span>&#160;    VmaIntrusiveLinkedList(VmaIntrusiveLinkedList&lt;ItemTypeTraits&gt;&amp;&amp; src) :</div>
+<div class="line"><a name="l06059"></a><span class="lineno"> 6059</span>&#160;        m_Front(src.m_Front), m_Back(src.m_Back), m_Count(src.m_Count)</div>
+<div class="line"><a name="l06060"></a><span class="lineno"> 6060</span>&#160;    {</div>
+<div class="line"><a name="l06061"></a><span class="lineno"> 6061</span>&#160;        src.m_Front = src.m_Back = VMA_NULL;</div>
+<div class="line"><a name="l06062"></a><span class="lineno"> 6062</span>&#160;        src.m_Count = 0;</div>
+<div class="line"><a name="l06063"></a><span class="lineno"> 6063</span>&#160;    }</div>
+<div class="line"><a name="l06064"></a><span class="lineno"> 6064</span>&#160;    ~VmaIntrusiveLinkedList()</div>
+<div class="line"><a name="l06065"></a><span class="lineno"> 6065</span>&#160;    {</div>
+<div class="line"><a name="l06066"></a><span class="lineno"> 6066</span>&#160;        VMA_HEAVY_ASSERT(IsEmpty());</div>
+<div class="line"><a name="l06067"></a><span class="lineno"> 6067</span>&#160;    }</div>
+<div class="line"><a name="l06068"></a><span class="lineno"> 6068</span>&#160;    VmaIntrusiveLinkedList&lt;ItemTypeTraits&gt;&amp; operator=(<span class="keyword">const</span> VmaIntrusiveLinkedList&lt;ItemTypeTraits&gt;&amp; src) = <span class="keyword">delete</span>;</div>
+<div class="line"><a name="l06069"></a><span class="lineno"> 6069</span>&#160;    VmaIntrusiveLinkedList&lt;ItemTypeTraits&gt;&amp; operator=(VmaIntrusiveLinkedList&lt;ItemTypeTraits&gt;&amp;&amp; src)</div>
+<div class="line"><a name="l06070"></a><span class="lineno"> 6070</span>&#160;    {</div>
+<div class="line"><a name="l06071"></a><span class="lineno"> 6071</span>&#160;        <span class="keywordflow">if</span>(&amp;src != <span class="keyword">this</span>)</div>
+<div class="line"><a name="l06072"></a><span class="lineno"> 6072</span>&#160;        {</div>
+<div class="line"><a name="l06073"></a><span class="lineno"> 6073</span>&#160;            VMA_HEAVY_ASSERT(IsEmpty());</div>
+<div class="line"><a name="l06074"></a><span class="lineno"> 6074</span>&#160;            m_Front = src.m_Front;</div>
+<div class="line"><a name="l06075"></a><span class="lineno"> 6075</span>&#160;            m_Back = src.m_Back;</div>
+<div class="line"><a name="l06076"></a><span class="lineno"> 6076</span>&#160;            m_Count = src.m_Count;</div>
+<div class="line"><a name="l06077"></a><span class="lineno"> 6077</span>&#160;            src.m_Front = src.m_Back = VMA_NULL;</div>
+<div class="line"><a name="l06078"></a><span class="lineno"> 6078</span>&#160;            src.m_Count = 0;</div>
+<div class="line"><a name="l06079"></a><span class="lineno"> 6079</span>&#160;        }</div>
+<div class="line"><a name="l06080"></a><span class="lineno"> 6080</span>&#160;        <span class="keywordflow">return</span> *<span class="keyword">this</span>;</div>
+<div class="line"><a name="l06081"></a><span class="lineno"> 6081</span>&#160;    }</div>
+<div class="line"><a name="l06082"></a><span class="lineno"> 6082</span>&#160;    <span class="keywordtype">void</span> RemoveAll()</div>
+<div class="line"><a name="l06083"></a><span class="lineno"> 6083</span>&#160;    {</div>
+<div class="line"><a name="l06084"></a><span class="lineno"> 6084</span>&#160;        <span class="keywordflow">if</span>(!IsEmpty())</div>
+<div class="line"><a name="l06085"></a><span class="lineno"> 6085</span>&#160;        {</div>
+<div class="line"><a name="l06086"></a><span class="lineno"> 6086</span>&#160;            ItemType* item = m_Back;</div>
+<div class="line"><a name="l06087"></a><span class="lineno"> 6087</span>&#160;            <span class="keywordflow">while</span>(item != VMA_NULL)</div>
+<div class="line"><a name="l06088"></a><span class="lineno"> 6088</span>&#160;            {</div>
+<div class="line"><a name="l06089"></a><span class="lineno"> 6089</span>&#160;                ItemType* <span class="keyword">const</span> prevItem = ItemTypeTraits::AccessPrev(item);</div>
+<div class="line"><a name="l06090"></a><span class="lineno"> 6090</span>&#160;                ItemTypeTraits::AccessPrev(item) = VMA_NULL;</div>
+<div class="line"><a name="l06091"></a><span class="lineno"> 6091</span>&#160;                ItemTypeTraits::AccessNext(item) = VMA_NULL;</div>
+<div class="line"><a name="l06092"></a><span class="lineno"> 6092</span>&#160;                item = prevItem;</div>
+<div class="line"><a name="l06093"></a><span class="lineno"> 6093</span>&#160;            }</div>
+<div class="line"><a name="l06094"></a><span class="lineno"> 6094</span>&#160;            m_Front = VMA_NULL;</div>
+<div class="line"><a name="l06095"></a><span class="lineno"> 6095</span>&#160;            m_Back = VMA_NULL;</div>
+<div class="line"><a name="l06096"></a><span class="lineno"> 6096</span>&#160;            m_Count = 0;</div>
+<div class="line"><a name="l06097"></a><span class="lineno"> 6097</span>&#160;        }</div>
+<div class="line"><a name="l06098"></a><span class="lineno"> 6098</span>&#160;    }</div>
+<div class="line"><a name="l06099"></a><span class="lineno"> 6099</span>&#160;    <span class="keywordtype">size_t</span> GetCount()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_Count; }</div>
+<div class="line"><a name="l06100"></a><span class="lineno"> 6100</span>&#160;    <span class="keywordtype">bool</span> IsEmpty()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_Count == 0; }</div>
+<div class="line"><a name="l06101"></a><span class="lineno"> 6101</span>&#160;    ItemType* Front() { <span class="keywordflow">return</span> m_Front; }</div>
+<div class="line"><a name="l06102"></a><span class="lineno"> 6102</span>&#160;    <span class="keyword">const</span> ItemType* Front()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_Front; }</div>
+<div class="line"><a name="l06103"></a><span class="lineno"> 6103</span>&#160;    ItemType* Back() { <span class="keywordflow">return</span> m_Back; }</div>
+<div class="line"><a name="l06104"></a><span class="lineno"> 6104</span>&#160;    <span class="keyword">const</span> ItemType* Back()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_Back; }</div>
+<div class="line"><a name="l06105"></a><span class="lineno"> 6105</span>&#160;    <span class="keywordtype">void</span> PushBack(ItemType* item)</div>
+<div class="line"><a name="l06106"></a><span class="lineno"> 6106</span>&#160;    {</div>
+<div class="line"><a name="l06107"></a><span class="lineno"> 6107</span>&#160;        VMA_HEAVY_ASSERT(ItemTypeTraits::GetPrev(item) == VMA_NULL &amp;&amp; ItemTypeTraits::GetNext(item) == VMA_NULL);</div>
+<div class="line"><a name="l06108"></a><span class="lineno"> 6108</span>&#160;        <span class="keywordflow">if</span>(IsEmpty())</div>
+<div class="line"><a name="l06109"></a><span class="lineno"> 6109</span>&#160;        {</div>
+<div class="line"><a name="l06110"></a><span class="lineno"> 6110</span>&#160;            m_Front = item;</div>
+<div class="line"><a name="l06111"></a><span class="lineno"> 6111</span>&#160;            m_Back = item;</div>
+<div class="line"><a name="l06112"></a><span class="lineno"> 6112</span>&#160;            m_Count = 1;</div>
+<div class="line"><a name="l06113"></a><span class="lineno"> 6113</span>&#160;        }</div>
+<div class="line"><a name="l06114"></a><span class="lineno"> 6114</span>&#160;        <span class="keywordflow">else</span></div>
+<div class="line"><a name="l06115"></a><span class="lineno"> 6115</span>&#160;        {</div>
+<div class="line"><a name="l06116"></a><span class="lineno"> 6116</span>&#160;            ItemTypeTraits::AccessPrev(item) = m_Back;</div>
+<div class="line"><a name="l06117"></a><span class="lineno"> 6117</span>&#160;            ItemTypeTraits::AccessNext(m_Back) = item;</div>
+<div class="line"><a name="l06118"></a><span class="lineno"> 6118</span>&#160;            m_Back = item;</div>
+<div class="line"><a name="l06119"></a><span class="lineno"> 6119</span>&#160;            ++m_Count;</div>
+<div class="line"><a name="l06120"></a><span class="lineno"> 6120</span>&#160;        }</div>
+<div class="line"><a name="l06121"></a><span class="lineno"> 6121</span>&#160;    }</div>
+<div class="line"><a name="l06122"></a><span class="lineno"> 6122</span>&#160;    <span class="keywordtype">void</span> PushFront(ItemType* item)</div>
+<div class="line"><a name="l06123"></a><span class="lineno"> 6123</span>&#160;    {</div>
+<div class="line"><a name="l06124"></a><span class="lineno"> 6124</span>&#160;        VMA_HEAVY_ASSERT(ItemTypeTraits::GetPrev(item) == VMA_NULL &amp;&amp; ItemTypeTraits::GetNext(item) == VMA_NULL);</div>
+<div class="line"><a name="l06125"></a><span class="lineno"> 6125</span>&#160;        <span class="keywordflow">if</span>(IsEmpty())</div>
+<div class="line"><a name="l06126"></a><span class="lineno"> 6126</span>&#160;        {</div>
+<div class="line"><a name="l06127"></a><span class="lineno"> 6127</span>&#160;            m_Front = item;</div>
+<div class="line"><a name="l06128"></a><span class="lineno"> 6128</span>&#160;            m_Back = item;</div>
+<div class="line"><a name="l06129"></a><span class="lineno"> 6129</span>&#160;            m_Count = 1;</div>
+<div class="line"><a name="l06130"></a><span class="lineno"> 6130</span>&#160;        }</div>
+<div class="line"><a name="l06131"></a><span class="lineno"> 6131</span>&#160;        <span class="keywordflow">else</span></div>
+<div class="line"><a name="l06132"></a><span class="lineno"> 6132</span>&#160;        {</div>
+<div class="line"><a name="l06133"></a><span class="lineno"> 6133</span>&#160;            ItemTypeTraits::AccessNext(item) = m_Front;</div>
+<div class="line"><a name="l06134"></a><span class="lineno"> 6134</span>&#160;            ItemTypeTraits::AccessPrev(m_Front) = item;</div>
+<div class="line"><a name="l06135"></a><span class="lineno"> 6135</span>&#160;            m_Front = item;</div>
+<div class="line"><a name="l06136"></a><span class="lineno"> 6136</span>&#160;            ++m_Count;</div>
+<div class="line"><a name="l06137"></a><span class="lineno"> 6137</span>&#160;        }</div>
+<div class="line"><a name="l06138"></a><span class="lineno"> 6138</span>&#160;    }</div>
+<div class="line"><a name="l06139"></a><span class="lineno"> 6139</span>&#160;    ItemType* PopBack()</div>
+<div class="line"><a name="l06140"></a><span class="lineno"> 6140</span>&#160;    {</div>
+<div class="line"><a name="l06141"></a><span class="lineno"> 6141</span>&#160;        VMA_HEAVY_ASSERT(m_Count &gt; 0);</div>
+<div class="line"><a name="l06142"></a><span class="lineno"> 6142</span>&#160;        ItemType* <span class="keyword">const</span> backItem = m_Back;</div>
+<div class="line"><a name="l06143"></a><span class="lineno"> 6143</span>&#160;        ItemType* <span class="keyword">const</span> prevItem = ItemTypeTraits::GetPrev(backItem);</div>
+<div class="line"><a name="l06144"></a><span class="lineno"> 6144</span>&#160;        <span class="keywordflow">if</span>(prevItem != VMA_NULL)</div>
+<div class="line"><a name="l06145"></a><span class="lineno"> 6145</span>&#160;        {</div>
+<div class="line"><a name="l06146"></a><span class="lineno"> 6146</span>&#160;            ItemTypeTraits::AccessNext(prevItem) = VMA_NULL;</div>
+<div class="line"><a name="l06147"></a><span class="lineno"> 6147</span>&#160;        }</div>
+<div class="line"><a name="l06148"></a><span class="lineno"> 6148</span>&#160;        m_Back = prevItem;</div>
+<div class="line"><a name="l06149"></a><span class="lineno"> 6149</span>&#160;        --m_Count;</div>
+<div class="line"><a name="l06150"></a><span class="lineno"> 6150</span>&#160;        ItemTypeTraits::AccessPrev(backItem) = VMA_NULL;</div>
+<div class="line"><a name="l06151"></a><span class="lineno"> 6151</span>&#160;        ItemTypeTraits::AccessNext(backItem) = VMA_NULL;</div>
+<div class="line"><a name="l06152"></a><span class="lineno"> 6152</span>&#160;        <span class="keywordflow">return</span> backItem;</div>
+<div class="line"><a name="l06153"></a><span class="lineno"> 6153</span>&#160;    }</div>
+<div class="line"><a name="l06154"></a><span class="lineno"> 6154</span>&#160;    ItemType* PopFront()</div>
+<div class="line"><a name="l06155"></a><span class="lineno"> 6155</span>&#160;    {</div>
+<div class="line"><a name="l06156"></a><span class="lineno"> 6156</span>&#160;        VMA_HEAVY_ASSERT(m_Count &gt; 0);</div>
+<div class="line"><a name="l06157"></a><span class="lineno"> 6157</span>&#160;        ItemType* <span class="keyword">const</span> frontItem = m_Front;</div>
+<div class="line"><a name="l06158"></a><span class="lineno"> 6158</span>&#160;        ItemType* <span class="keyword">const</span> nextItem = ItemTypeTraits::GetNext(frontItem);</div>
+<div class="line"><a name="l06159"></a><span class="lineno"> 6159</span>&#160;        <span class="keywordflow">if</span>(nextItem != VMA_NULL)</div>
+<div class="line"><a name="l06160"></a><span class="lineno"> 6160</span>&#160;        {</div>
+<div class="line"><a name="l06161"></a><span class="lineno"> 6161</span>&#160;            ItemTypeTraits::AccessPrev(nextItem) = VMA_NULL;</div>
+<div class="line"><a name="l06162"></a><span class="lineno"> 6162</span>&#160;        }</div>
+<div class="line"><a name="l06163"></a><span class="lineno"> 6163</span>&#160;        m_Front = nextItem;</div>
+<div class="line"><a name="l06164"></a><span class="lineno"> 6164</span>&#160;        --m_Count;</div>
+<div class="line"><a name="l06165"></a><span class="lineno"> 6165</span>&#160;        ItemTypeTraits::AccessPrev(frontItem) = VMA_NULL;</div>
+<div class="line"><a name="l06166"></a><span class="lineno"> 6166</span>&#160;        ItemTypeTraits::AccessNext(frontItem) = VMA_NULL;</div>
+<div class="line"><a name="l06167"></a><span class="lineno"> 6167</span>&#160;        <span class="keywordflow">return</span> frontItem;</div>
+<div class="line"><a name="l06168"></a><span class="lineno"> 6168</span>&#160;    }</div>
+<div class="line"><a name="l06169"></a><span class="lineno"> 6169</span>&#160; </div>
+<div class="line"><a name="l06170"></a><span class="lineno"> 6170</span>&#160;    <span class="comment">// MyItem can be null - it means PushBack.</span></div>
+<div class="line"><a name="l06171"></a><span class="lineno"> 6171</span>&#160;    <span class="keywordtype">void</span> InsertBefore(ItemType* existingItem, ItemType* newItem)</div>
+<div class="line"><a name="l06172"></a><span class="lineno"> 6172</span>&#160;    {</div>
+<div class="line"><a name="l06173"></a><span class="lineno"> 6173</span>&#160;        VMA_HEAVY_ASSERT(newItem != VMA_NULL &amp;&amp; ItemTypeTraits::GetPrev(newItem) == VMA_NULL &amp;&amp; ItemTypeTraits::GetNext(newItem) == VMA_NULL);</div>
+<div class="line"><a name="l06174"></a><span class="lineno"> 6174</span>&#160;        <span class="keywordflow">if</span>(existingItem != VMA_NULL)</div>
+<div class="line"><a name="l06175"></a><span class="lineno"> 6175</span>&#160;        {</div>
+<div class="line"><a name="l06176"></a><span class="lineno"> 6176</span>&#160;            ItemType* <span class="keyword">const</span> prevItem = ItemTypeTraits::GetPrev(existingItem);</div>
+<div class="line"><a name="l06177"></a><span class="lineno"> 6177</span>&#160;            ItemTypeTraits::AccessPrev(newItem) = prevItem;</div>
+<div class="line"><a name="l06178"></a><span class="lineno"> 6178</span>&#160;            ItemTypeTraits::AccessNext(newItem) = existingItem;</div>
+<div class="line"><a name="l06179"></a><span class="lineno"> 6179</span>&#160;            ItemTypeTraits::AccessPrev(existingItem) = newItem;</div>
+<div class="line"><a name="l06180"></a><span class="lineno"> 6180</span>&#160;            <span class="keywordflow">if</span>(prevItem != VMA_NULL)</div>
+<div class="line"><a name="l06181"></a><span class="lineno"> 6181</span>&#160;            {</div>
+<div class="line"><a name="l06182"></a><span class="lineno"> 6182</span>&#160;                ItemTypeTraits::AccessNext(prevItem) = newItem;</div>
+<div class="line"><a name="l06183"></a><span class="lineno"> 6183</span>&#160;            }</div>
+<div class="line"><a name="l06184"></a><span class="lineno"> 6184</span>&#160;            <span class="keywordflow">else</span></div>
+<div class="line"><a name="l06185"></a><span class="lineno"> 6185</span>&#160;            {</div>
+<div class="line"><a name="l06186"></a><span class="lineno"> 6186</span>&#160;                VMA_HEAVY_ASSERT(m_Front == existingItem);</div>
+<div class="line"><a name="l06187"></a><span class="lineno"> 6187</span>&#160;                m_Front = newItem;</div>
+<div class="line"><a name="l06188"></a><span class="lineno"> 6188</span>&#160;            }</div>
+<div class="line"><a name="l06189"></a><span class="lineno"> 6189</span>&#160;            ++m_Count;</div>
+<div class="line"><a name="l06190"></a><span class="lineno"> 6190</span>&#160;        }</div>
+<div class="line"><a name="l06191"></a><span class="lineno"> 6191</span>&#160;        <span class="keywordflow">else</span></div>
+<div class="line"><a name="l06192"></a><span class="lineno"> 6192</span>&#160;            PushBack(newItem);</div>
+<div class="line"><a name="l06193"></a><span class="lineno"> 6193</span>&#160;    }</div>
+<div class="line"><a name="l06194"></a><span class="lineno"> 6194</span>&#160;    <span class="comment">// MyItem can be null - it means PushFront.</span></div>
+<div class="line"><a name="l06195"></a><span class="lineno"> 6195</span>&#160;    <span class="keywordtype">void</span> InsertAfter(ItemType* existingItem, ItemType* newItem)</div>
+<div class="line"><a name="l06196"></a><span class="lineno"> 6196</span>&#160;    {</div>
+<div class="line"><a name="l06197"></a><span class="lineno"> 6197</span>&#160;        VMA_HEAVY_ASSERT(newItem != VMA_NULL &amp;&amp; ItemTypeTraits::GetPrev(newItem) == VMA_NULL &amp;&amp; ItemTypeTraits::GetNext(newItem) == VMA_NULL);</div>
+<div class="line"><a name="l06198"></a><span class="lineno"> 6198</span>&#160;        <span class="keywordflow">if</span>(existingItem != VMA_NULL)</div>
+<div class="line"><a name="l06199"></a><span class="lineno"> 6199</span>&#160;        {</div>
+<div class="line"><a name="l06200"></a><span class="lineno"> 6200</span>&#160;            ItemType* <span class="keyword">const</span> nextItem = ItemTypeTraits::GetNext(existingItem);</div>
+<div class="line"><a name="l06201"></a><span class="lineno"> 6201</span>&#160;            ItemTypeTraits::AccessNext(newItem) = nextItem;</div>
+<div class="line"><a name="l06202"></a><span class="lineno"> 6202</span>&#160;            ItemTypeTraits::AccessPrev(newItem) = existingItem;</div>
+<div class="line"><a name="l06203"></a><span class="lineno"> 6203</span>&#160;            ItemTypeTraits::AccessNext(existingItem) = newItem;</div>
+<div class="line"><a name="l06204"></a><span class="lineno"> 6204</span>&#160;            <span class="keywordflow">if</span>(nextItem != VMA_NULL)</div>
+<div class="line"><a name="l06205"></a><span class="lineno"> 6205</span>&#160;            {</div>
+<div class="line"><a name="l06206"></a><span class="lineno"> 6206</span>&#160;                ItemTypeTraits::AccessPrev(nextItem) = newItem;</div>
+<div class="line"><a name="l06207"></a><span class="lineno"> 6207</span>&#160;            }</div>
+<div class="line"><a name="l06208"></a><span class="lineno"> 6208</span>&#160;            <span class="keywordflow">else</span></div>
+<div class="line"><a name="l06209"></a><span class="lineno"> 6209</span>&#160;            {</div>
+<div class="line"><a name="l06210"></a><span class="lineno"> 6210</span>&#160;                VMA_HEAVY_ASSERT(m_Back == existingItem);</div>
+<div class="line"><a name="l06211"></a><span class="lineno"> 6211</span>&#160;                m_Back = newItem;</div>
+<div class="line"><a name="l06212"></a><span class="lineno"> 6212</span>&#160;            }</div>
+<div class="line"><a name="l06213"></a><span class="lineno"> 6213</span>&#160;            ++m_Count;</div>
+<div class="line"><a name="l06214"></a><span class="lineno"> 6214</span>&#160;        }</div>
+<div class="line"><a name="l06215"></a><span class="lineno"> 6215</span>&#160;        <span class="keywordflow">else</span></div>
+<div class="line"><a name="l06216"></a><span class="lineno"> 6216</span>&#160;            <span class="keywordflow">return</span> PushFront(newItem);</div>
+<div class="line"><a name="l06217"></a><span class="lineno"> 6217</span>&#160;    }</div>
+<div class="line"><a name="l06218"></a><span class="lineno"> 6218</span>&#160;    <span class="keywordtype">void</span> Remove(ItemType* item)</div>
+<div class="line"><a name="l06219"></a><span class="lineno"> 6219</span>&#160;    {</div>
+<div class="line"><a name="l06220"></a><span class="lineno"> 6220</span>&#160;        VMA_HEAVY_ASSERT(item != VMA_NULL &amp;&amp; m_Count &gt; 0);</div>
+<div class="line"><a name="l06221"></a><span class="lineno"> 6221</span>&#160;        <span class="keywordflow">if</span>(ItemTypeTraits::GetPrev(item) != VMA_NULL)</div>
+<div class="line"><a name="l06222"></a><span class="lineno"> 6222</span>&#160;        {</div>
+<div class="line"><a name="l06223"></a><span class="lineno"> 6223</span>&#160;            ItemTypeTraits::AccessNext(ItemTypeTraits::AccessPrev(item)) = ItemTypeTraits::GetNext(item);</div>
+<div class="line"><a name="l06224"></a><span class="lineno"> 6224</span>&#160;        }</div>
+<div class="line"><a name="l06225"></a><span class="lineno"> 6225</span>&#160;        <span class="keywordflow">else</span></div>
+<div class="line"><a name="l06226"></a><span class="lineno"> 6226</span>&#160;        {</div>
+<div class="line"><a name="l06227"></a><span class="lineno"> 6227</span>&#160;            VMA_HEAVY_ASSERT(m_Front == item);</div>
+<div class="line"><a name="l06228"></a><span class="lineno"> 6228</span>&#160;            m_Front = ItemTypeTraits::GetNext(item);</div>
+<div class="line"><a name="l06229"></a><span class="lineno"> 6229</span>&#160;        }</div>
+<div class="line"><a name="l06230"></a><span class="lineno"> 6230</span>&#160; </div>
+<div class="line"><a name="l06231"></a><span class="lineno"> 6231</span>&#160;        <span class="keywordflow">if</span>(ItemTypeTraits::GetNext(item) != VMA_NULL)</div>
+<div class="line"><a name="l06232"></a><span class="lineno"> 6232</span>&#160;        {</div>
+<div class="line"><a name="l06233"></a><span class="lineno"> 6233</span>&#160;            ItemTypeTraits::AccessPrev(ItemTypeTraits::AccessNext(item)) = ItemTypeTraits::GetPrev(item);</div>
+<div class="line"><a name="l06234"></a><span class="lineno"> 6234</span>&#160;        }</div>
+<div class="line"><a name="l06235"></a><span class="lineno"> 6235</span>&#160;        <span class="keywordflow">else</span></div>
+<div class="line"><a name="l06236"></a><span class="lineno"> 6236</span>&#160;        {</div>
+<div class="line"><a name="l06237"></a><span class="lineno"> 6237</span>&#160;            VMA_HEAVY_ASSERT(m_Back == item);</div>
+<div class="line"><a name="l06238"></a><span class="lineno"> 6238</span>&#160;            m_Back = ItemTypeTraits::GetPrev(item);</div>
+<div class="line"><a name="l06239"></a><span class="lineno"> 6239</span>&#160;        }</div>
+<div class="line"><a name="l06240"></a><span class="lineno"> 6240</span>&#160;        ItemTypeTraits::AccessPrev(item) = VMA_NULL;</div>
+<div class="line"><a name="l06241"></a><span class="lineno"> 6241</span>&#160;        ItemTypeTraits::AccessNext(item) = VMA_NULL;</div>
+<div class="line"><a name="l06242"></a><span class="lineno"> 6242</span>&#160;        --m_Count;</div>
+<div class="line"><a name="l06243"></a><span class="lineno"> 6243</span>&#160;    }</div>
+<div class="line"><a name="l06244"></a><span class="lineno"> 6244</span>&#160;<span class="keyword">private</span>:</div>
+<div class="line"><a name="l06245"></a><span class="lineno"> 6245</span>&#160;    ItemType* m_Front = VMA_NULL;</div>
+<div class="line"><a name="l06246"></a><span class="lineno"> 6246</span>&#160;    ItemType* m_Back = VMA_NULL;</div>
+<div class="line"><a name="l06247"></a><span class="lineno"> 6247</span>&#160;    <span class="keywordtype">size_t</span> m_Count = 0;</div>
+<div class="line"><a name="l06248"></a><span class="lineno"> 6248</span>&#160;};</div>
 <div class="line"><a name="l06249"></a><span class="lineno"> 6249</span>&#160; </div>
-<div class="line"><a name="l06250"></a><span class="lineno"> 6250</span>&#160;<span class="keyword">protected</span>:</div>
-<div class="line"><a name="l06251"></a><span class="lineno"> 6251</span>&#160;    <span class="keyword">const</span> VkAllocationCallbacks* GetAllocationCallbacks()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_pAllocationCallbacks; }</div>
+<div class="line"><a name="l06251"></a><span class="lineno"> 6251</span>&#160;<span class="comment">// class VmaMap</span></div>
 <div class="line"><a name="l06252"></a><span class="lineno"> 6252</span>&#160; </div>
-<div class="line"><a name="l06253"></a><span class="lineno"> 6253</span>&#160;<span class="preprocessor">#if VMA_STATS_STRING_ENABLED</span></div>
-<div class="line"><a name="l06254"></a><span class="lineno"> 6254</span>&#160;    <span class="keywordtype">void</span> PrintDetailedMap_Begin(<span class="keyword">class</span> VmaJsonWriter&amp; json,</div>
-<div class="line"><a name="l06255"></a><span class="lineno"> 6255</span>&#160;        VkDeviceSize unusedBytes,</div>
-<div class="line"><a name="l06256"></a><span class="lineno"> 6256</span>&#160;        <span class="keywordtype">size_t</span> allocationCount,</div>
-<div class="line"><a name="l06257"></a><span class="lineno"> 6257</span>&#160;        <span class="keywordtype">size_t</span> unusedRangeCount) <span class="keyword">const</span>;</div>
-<div class="line"><a name="l06258"></a><span class="lineno"> 6258</span>&#160;    <span class="keywordtype">void</span> PrintDetailedMap_Allocation(<span class="keyword">class</span> VmaJsonWriter&amp; json,</div>
-<div class="line"><a name="l06259"></a><span class="lineno"> 6259</span>&#160;        VkDeviceSize offset,</div>
-<div class="line"><a name="l06260"></a><span class="lineno"> 6260</span>&#160;        <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> hAllocation) <span class="keyword">const</span>;</div>
-<div class="line"><a name="l06261"></a><span class="lineno"> 6261</span>&#160;    <span class="keywordtype">void</span> PrintDetailedMap_UnusedRange(<span class="keyword">class</span> VmaJsonWriter&amp; json,</div>
-<div class="line"><a name="l06262"></a><span class="lineno"> 6262</span>&#160;        VkDeviceSize offset,</div>
-<div class="line"><a name="l06263"></a><span class="lineno"> 6263</span>&#160;        VkDeviceSize size) <span class="keyword">const</span>;</div>
-<div class="line"><a name="l06264"></a><span class="lineno"> 6264</span>&#160;    <span class="keywordtype">void</span> PrintDetailedMap_End(<span class="keyword">class</span> VmaJsonWriter&amp; json) <span class="keyword">const</span>;</div>
-<div class="line"><a name="l06265"></a><span class="lineno"> 6265</span>&#160;<span class="preprocessor">#endif</span></div>
-<div class="line"><a name="l06266"></a><span class="lineno"> 6266</span>&#160; </div>
-<div class="line"><a name="l06267"></a><span class="lineno"> 6267</span>&#160;<span class="keyword">private</span>:</div>
-<div class="line"><a name="l06268"></a><span class="lineno"> 6268</span>&#160;    VkDeviceSize m_Size;</div>
-<div class="line"><a name="l06269"></a><span class="lineno"> 6269</span>&#160;    <span class="keyword">const</span> VkAllocationCallbacks* m_pAllocationCallbacks;</div>
-<div class="line"><a name="l06270"></a><span class="lineno"> 6270</span>&#160;};</div>
-<div class="line"><a name="l06271"></a><span class="lineno"> 6271</span>&#160; </div>
-<div class="line"><a name="l06272"></a><span class="lineno"> 6272</span>&#160;<span class="preprocessor">#define VMA_VALIDATE(cond) do { if(!(cond)) { \</span></div>
-<div class="line"><a name="l06273"></a><span class="lineno"> 6273</span>&#160;<span class="preprocessor">        VMA_ASSERT(0 &amp;&amp; &quot;Validation failed: &quot; #cond); \</span></div>
-<div class="line"><a name="l06274"></a><span class="lineno"> 6274</span>&#160;<span class="preprocessor">        return false; \</span></div>
-<div class="line"><a name="l06275"></a><span class="lineno"> 6275</span>&#160;<span class="preprocessor">    } } while(false)</span></div>
-<div class="line"><a name="l06276"></a><span class="lineno"> 6276</span>&#160; </div>
-<div class="line"><a name="l06277"></a><span class="lineno"> 6277</span>&#160;<span class="keyword">class </span>VmaBlockMetadata_Generic : <span class="keyword">public</span> VmaBlockMetadata</div>
-<div class="line"><a name="l06278"></a><span class="lineno"> 6278</span>&#160;{</div>
-<div class="line"><a name="l06279"></a><span class="lineno"> 6279</span>&#160;    VMA_CLASS_NO_COPY(VmaBlockMetadata_Generic)</div>
-<div class="line"><a name="l06280"></a><span class="lineno"> 6280</span>&#160;<span class="keyword">public</span>:</div>
-<div class="line"><a name="l06281"></a><span class="lineno"> 6281</span>&#160;    VmaBlockMetadata_Generic(<a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator);</div>
-<div class="line"><a name="l06282"></a><span class="lineno"> 6282</span>&#160;    <span class="keyword">virtual</span> ~VmaBlockMetadata_Generic();</div>
-<div class="line"><a name="l06283"></a><span class="lineno"> 6283</span>&#160;    <span class="keyword">virtual</span> <span class="keywordtype">void</span> Init(VkDeviceSize size);</div>
+<div class="line"><a name="l06253"></a><span class="lineno"> 6253</span>&#160;<span class="comment">// Unused in this version.</span></div>
+<div class="line"><a name="l06254"></a><span class="lineno"> 6254</span>&#160;<span class="preprocessor">#if 0</span></div>
+<div class="line"><a name="l06255"></a><span class="lineno"> 6255</span>&#160; </div>
+<div class="line"><a name="l06256"></a><span class="lineno"> 6256</span>&#160;<span class="preprocessor">#if VMA_USE_STL_UNORDERED_MAP</span></div>
+<div class="line"><a name="l06257"></a><span class="lineno"> 6257</span>&#160; </div>
+<div class="line"><a name="l06258"></a><span class="lineno"> 6258</span>&#160;<span class="preprocessor">#define VmaPair std::pair</span></div>
+<div class="line"><a name="l06259"></a><span class="lineno"> 6259</span>&#160; </div>
+<div class="line"><a name="l06260"></a><span class="lineno"> 6260</span>&#160;<span class="preprocessor">#define VMA_MAP_TYPE(KeyT, ValueT) \</span></div>
+<div class="line"><a name="l06261"></a><span class="lineno"> 6261</span>&#160;<span class="preprocessor">    std::unordered_map&lt; KeyT, ValueT, std::hash&lt;KeyT&gt;, std::equal_to&lt;KeyT&gt;, VmaStlAllocator&lt; std::pair&lt;KeyT, ValueT&gt; &gt; &gt;</span></div>
+<div class="line"><a name="l06262"></a><span class="lineno"> 6262</span>&#160; </div>
+<div class="line"><a name="l06263"></a><span class="lineno"> 6263</span>&#160;<span class="preprocessor">#else </span><span class="comment">// #if VMA_USE_STL_UNORDERED_MAP</span></div>
+<div class="line"><a name="l06264"></a><span class="lineno"> 6264</span>&#160; </div>
+<div class="line"><a name="l06265"></a><span class="lineno"> 6265</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> T1, <span class="keyword">typename</span> T2&gt;</div>
+<div class="line"><a name="l06266"></a><span class="lineno"> 6266</span>&#160;<span class="keyword">struct </span>VmaPair</div>
+<div class="line"><a name="l06267"></a><span class="lineno"> 6267</span>&#160;{</div>
+<div class="line"><a name="l06268"></a><span class="lineno"> 6268</span>&#160;    T1 first;</div>
+<div class="line"><a name="l06269"></a><span class="lineno"> 6269</span>&#160;    T2 second;</div>
+<div class="line"><a name="l06270"></a><span class="lineno"> 6270</span>&#160; </div>
+<div class="line"><a name="l06271"></a><span class="lineno"> 6271</span>&#160;    VmaPair() : first(), second() { }</div>
+<div class="line"><a name="l06272"></a><span class="lineno"> 6272</span>&#160;    VmaPair(<span class="keyword">const</span> T1&amp; firstSrc, <span class="keyword">const</span> T2&amp; secondSrc) : first(firstSrc), second(secondSrc) { }</div>
+<div class="line"><a name="l06273"></a><span class="lineno"> 6273</span>&#160;};</div>
+<div class="line"><a name="l06274"></a><span class="lineno"> 6274</span>&#160; </div>
+<div class="line"><a name="l06275"></a><span class="lineno"> 6275</span>&#160;<span class="comment">/* Class compatible with subset of interface of std::unordered_map.</span></div>
+<div class="line"><a name="l06276"></a><span class="lineno"> 6276</span>&#160;<span class="comment">KeyT, ValueT must be POD because they will be stored in VmaVector.</span></div>
+<div class="line"><a name="l06277"></a><span class="lineno"> 6277</span>&#160;<span class="comment">*/</span></div>
+<div class="line"><a name="l06278"></a><span class="lineno"> 6278</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> KeyT, <span class="keyword">typename</span> ValueT&gt;</div>
+<div class="line"><a name="l06279"></a><span class="lineno"> 6279</span>&#160;<span class="keyword">class </span>VmaMap</div>
+<div class="line"><a name="l06280"></a><span class="lineno"> 6280</span>&#160;{</div>
+<div class="line"><a name="l06281"></a><span class="lineno"> 6281</span>&#160;<span class="keyword">public</span>:</div>
+<div class="line"><a name="l06282"></a><span class="lineno"> 6282</span>&#160;    <span class="keyword">typedef</span> VmaPair&lt;KeyT, ValueT&gt; PairType;</div>
+<div class="line"><a name="l06283"></a><span class="lineno"> 6283</span>&#160;    <span class="keyword">typedef</span> PairType* iterator;</div>
 <div class="line"><a name="l06284"></a><span class="lineno"> 6284</span>&#160; </div>
-<div class="line"><a name="l06285"></a><span class="lineno"> 6285</span>&#160;    <span class="keyword">virtual</span> <span class="keywordtype">bool</span> Validate() <span class="keyword">const</span>;</div>
-<div class="line"><a name="l06286"></a><span class="lineno"> 6286</span>&#160;    <span class="keyword">virtual</span> <span class="keywordtype">size_t</span> GetAllocationCount()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_Suballocations.size() - m_FreeCount; }</div>
-<div class="line"><a name="l06287"></a><span class="lineno"> 6287</span>&#160;    <span class="keyword">virtual</span> VkDeviceSize GetSumFreeSize()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_SumFreeSize; }</div>
-<div class="line"><a name="l06288"></a><span class="lineno"> 6288</span>&#160;    <span class="keyword">virtual</span> VkDeviceSize GetUnusedRangeSizeMax() <span class="keyword">const</span>;</div>
-<div class="line"><a name="l06289"></a><span class="lineno"> 6289</span>&#160;    <span class="keyword">virtual</span> <span class="keywordtype">bool</span> IsEmpty() <span class="keyword">const</span>;</div>
-<div class="line"><a name="l06290"></a><span class="lineno"> 6290</span>&#160; </div>
-<div class="line"><a name="l06291"></a><span class="lineno"> 6291</span>&#160;    <span class="keyword">virtual</span> <span class="keywordtype">void</span> CalcAllocationStatInfo(<a class="code" href="struct_vma_stat_info.html">VmaStatInfo</a>&amp; outInfo) <span class="keyword">const</span>;</div>
-<div class="line"><a name="l06292"></a><span class="lineno"> 6292</span>&#160;    <span class="keyword">virtual</span> <span class="keywordtype">void</span> AddPoolStats(<a class="code" href="struct_vma_pool_stats.html">VmaPoolStats</a>&amp; inoutStats) <span class="keyword">const</span>;</div>
+<div class="line"><a name="l06285"></a><span class="lineno"> 6285</span>&#160;    VmaMap(<span class="keyword">const</span> VmaStlAllocator&lt;PairType&gt;&amp; allocator) : m_Vector(allocator) { }</div>
+<div class="line"><a name="l06286"></a><span class="lineno"> 6286</span>&#160; </div>
+<div class="line"><a name="l06287"></a><span class="lineno"> 6287</span>&#160;    iterator begin() { <span class="keywordflow">return</span> m_Vector.begin(); }</div>
+<div class="line"><a name="l06288"></a><span class="lineno"> 6288</span>&#160;    iterator end() { <span class="keywordflow">return</span> m_Vector.end(); }</div>
+<div class="line"><a name="l06289"></a><span class="lineno"> 6289</span>&#160; </div>
+<div class="line"><a name="l06290"></a><span class="lineno"> 6290</span>&#160;    <span class="keywordtype">void</span> insert(<span class="keyword">const</span> PairType&amp; pair);</div>
+<div class="line"><a name="l06291"></a><span class="lineno"> 6291</span>&#160;    iterator find(<span class="keyword">const</span> KeyT&amp; key);</div>
+<div class="line"><a name="l06292"></a><span class="lineno"> 6292</span>&#160;    <span class="keywordtype">void</span> erase(iterator it);</div>
 <div class="line"><a name="l06293"></a><span class="lineno"> 6293</span>&#160; </div>
-<div class="line"><a name="l06294"></a><span class="lineno"> 6294</span>&#160;<span class="preprocessor">#if VMA_STATS_STRING_ENABLED</span></div>
-<div class="line"><a name="l06295"></a><span class="lineno"> 6295</span>&#160;    <span class="keyword">virtual</span> <span class="keywordtype">void</span> PrintDetailedMap(<span class="keyword">class</span> VmaJsonWriter&amp; json) <span class="keyword">const</span>;</div>
-<div class="line"><a name="l06296"></a><span class="lineno"> 6296</span>&#160;<span class="preprocessor">#endif</span></div>
+<div class="line"><a name="l06294"></a><span class="lineno"> 6294</span>&#160;<span class="keyword">private</span>:</div>
+<div class="line"><a name="l06295"></a><span class="lineno"> 6295</span>&#160;    VmaVector&lt; PairType, VmaStlAllocator&lt;PairType&gt; &gt; m_Vector;</div>
+<div class="line"><a name="l06296"></a><span class="lineno"> 6296</span>&#160;};</div>
 <div class="line"><a name="l06297"></a><span class="lineno"> 6297</span>&#160; </div>
-<div class="line"><a name="l06298"></a><span class="lineno"> 6298</span>&#160;    <span class="keyword">virtual</span> <span class="keywordtype">bool</span> CreateAllocationRequest(</div>
-<div class="line"><a name="l06299"></a><span class="lineno"> 6299</span>&#160;        uint32_t currentFrameIndex,</div>
-<div class="line"><a name="l06300"></a><span class="lineno"> 6300</span>&#160;        uint32_t frameInUseCount,</div>
-<div class="line"><a name="l06301"></a><span class="lineno"> 6301</span>&#160;        VkDeviceSize bufferImageGranularity,</div>
-<div class="line"><a name="l06302"></a><span class="lineno"> 6302</span>&#160;        VkDeviceSize allocSize,</div>
-<div class="line"><a name="l06303"></a><span class="lineno"> 6303</span>&#160;        VkDeviceSize allocAlignment,</div>
-<div class="line"><a name="l06304"></a><span class="lineno"> 6304</span>&#160;        <span class="keywordtype">bool</span> upperAddress,</div>
-<div class="line"><a name="l06305"></a><span class="lineno"> 6305</span>&#160;        VmaSuballocationType allocType,</div>
-<div class="line"><a name="l06306"></a><span class="lineno"> 6306</span>&#160;        <span class="keywordtype">bool</span> canMakeOtherLost,</div>
-<div class="line"><a name="l06307"></a><span class="lineno"> 6307</span>&#160;        uint32_t strategy,</div>
-<div class="line"><a name="l06308"></a><span class="lineno"> 6308</span>&#160;        VmaAllocationRequest* pAllocationRequest);</div>
-<div class="line"><a name="l06309"></a><span class="lineno"> 6309</span>&#160; </div>
-<div class="line"><a name="l06310"></a><span class="lineno"> 6310</span>&#160;    <span class="keyword">virtual</span> <span class="keywordtype">bool</span> MakeRequestedAllocationsLost(</div>
-<div class="line"><a name="l06311"></a><span class="lineno"> 6311</span>&#160;        uint32_t currentFrameIndex,</div>
-<div class="line"><a name="l06312"></a><span class="lineno"> 6312</span>&#160;        uint32_t frameInUseCount,</div>
-<div class="line"><a name="l06313"></a><span class="lineno"> 6313</span>&#160;        VmaAllocationRequest* pAllocationRequest);</div>
-<div class="line"><a name="l06314"></a><span class="lineno"> 6314</span>&#160; </div>
-<div class="line"><a name="l06315"></a><span class="lineno"> 6315</span>&#160;    <span class="keyword">virtual</span> uint32_t MakeAllocationsLost(uint32_t currentFrameIndex, uint32_t frameInUseCount);</div>
-<div class="line"><a name="l06316"></a><span class="lineno"> 6316</span>&#160; </div>
-<div class="line"><a name="l06317"></a><span class="lineno"> 6317</span>&#160;    <span class="keyword">virtual</span> VkResult CheckCorruption(<span class="keyword">const</span> <span class="keywordtype">void</span>* pBlockData);</div>
-<div class="line"><a name="l06318"></a><span class="lineno"> 6318</span>&#160; </div>
-<div class="line"><a name="l06319"></a><span class="lineno"> 6319</span>&#160;    <span class="keyword">virtual</span> <span class="keywordtype">void</span> Alloc(</div>
-<div class="line"><a name="l06320"></a><span class="lineno"> 6320</span>&#160;        <span class="keyword">const</span> VmaAllocationRequest&amp; request,</div>
-<div class="line"><a name="l06321"></a><span class="lineno"> 6321</span>&#160;        VmaSuballocationType type,</div>
-<div class="line"><a name="l06322"></a><span class="lineno"> 6322</span>&#160;        VkDeviceSize allocSize,</div>
-<div class="line"><a name="l06323"></a><span class="lineno"> 6323</span>&#160;        <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> hAllocation);</div>
-<div class="line"><a name="l06324"></a><span class="lineno"> 6324</span>&#160; </div>
-<div class="line"><a name="l06325"></a><span class="lineno"> 6325</span>&#160;    <span class="keyword">virtual</span> <span class="keywordtype">void</span> Free(<span class="keyword">const</span> <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation);</div>
-<div class="line"><a name="l06326"></a><span class="lineno"> 6326</span>&#160;    <span class="keyword">virtual</span> <span class="keywordtype">void</span> FreeAtOffset(VkDeviceSize offset);</div>
-<div class="line"><a name="l06327"></a><span class="lineno"> 6327</span>&#160; </div>
-<div class="line"><a name="l06329"></a><span class="lineno"> 6329</span>&#160;    <span class="comment">// For defragmentation</span></div>
-<div class="line"><a name="l06330"></a><span class="lineno"> 6330</span>&#160;    </div>
-<div class="line"><a name="l06331"></a><span class="lineno"> 6331</span>&#160;    <span class="keywordtype">bool</span> IsBufferImageGranularityConflictPossible(</div>
-<div class="line"><a name="l06332"></a><span class="lineno"> 6332</span>&#160;        VkDeviceSize bufferImageGranularity,</div>
-<div class="line"><a name="l06333"></a><span class="lineno"> 6333</span>&#160;        VmaSuballocationType&amp; inOutPrevSuballocType) <span class="keyword">const</span>;</div>
-<div class="line"><a name="l06334"></a><span class="lineno"> 6334</span>&#160; </div>
-<div class="line"><a name="l06335"></a><span class="lineno"> 6335</span>&#160;<span class="keyword">private</span>:</div>
-<div class="line"><a name="l06336"></a><span class="lineno"> 6336</span>&#160;    <span class="keyword">friend</span> <span class="keyword">class </span>VmaDefragmentationAlgorithm_Generic;</div>
-<div class="line"><a name="l06337"></a><span class="lineno"> 6337</span>&#160;    <span class="keyword">friend</span> <span class="keyword">class </span>VmaDefragmentationAlgorithm_Fast;</div>
-<div class="line"><a name="l06338"></a><span class="lineno"> 6338</span>&#160; </div>
-<div class="line"><a name="l06339"></a><span class="lineno"> 6339</span>&#160;    uint32_t m_FreeCount;</div>
-<div class="line"><a name="l06340"></a><span class="lineno"> 6340</span>&#160;    VkDeviceSize m_SumFreeSize;</div>
-<div class="line"><a name="l06341"></a><span class="lineno"> 6341</span>&#160;    VmaSuballocationList m_Suballocations;</div>
-<div class="line"><a name="l06342"></a><span class="lineno"> 6342</span>&#160;    <span class="comment">// Suballocations that are free and have size greater than certain threshold.</span></div>
-<div class="line"><a name="l06343"></a><span class="lineno"> 6343</span>&#160;    <span class="comment">// Sorted by size, ascending.</span></div>
-<div class="line"><a name="l06344"></a><span class="lineno"> 6344</span>&#160;    VmaVector&lt; VmaSuballocationList::iterator, VmaStlAllocator&lt; VmaSuballocationList::iterator &gt; &gt; m_FreeSuballocationsBySize;</div>
-<div class="line"><a name="l06345"></a><span class="lineno"> 6345</span>&#160; </div>
-<div class="line"><a name="l06346"></a><span class="lineno"> 6346</span>&#160;    <span class="keywordtype">bool</span> ValidateFreeSuballocationList() <span class="keyword">const</span>;</div>
+<div class="line"><a name="l06298"></a><span class="lineno"> 6298</span>&#160;<span class="preprocessor">#define VMA_MAP_TYPE(KeyT, ValueT) VmaMap&lt;KeyT, ValueT&gt;</span></div>
+<div class="line"><a name="l06299"></a><span class="lineno"> 6299</span>&#160; </div>
+<div class="line"><a name="l06300"></a><span class="lineno"> 6300</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> FirstT, <span class="keyword">typename</span> SecondT&gt;</div>
+<div class="line"><a name="l06301"></a><span class="lineno"> 6301</span>&#160;<span class="keyword">struct </span>VmaPairFirstLess</div>
+<div class="line"><a name="l06302"></a><span class="lineno"> 6302</span>&#160;{</div>
+<div class="line"><a name="l06303"></a><span class="lineno"> 6303</span>&#160;    <span class="keywordtype">bool</span> operator()(<span class="keyword">const</span> VmaPair&lt;FirstT, SecondT&gt;&amp; lhs, <span class="keyword">const</span> VmaPair&lt;FirstT, SecondT&gt;&amp; rhs)<span class="keyword"> const</span></div>
+<div class="line"><a name="l06304"></a><span class="lineno"> 6304</span>&#160;<span class="keyword">    </span>{</div>
+<div class="line"><a name="l06305"></a><span class="lineno"> 6305</span>&#160;        <span class="keywordflow">return</span> lhs.first &lt; rhs.first;</div>
+<div class="line"><a name="l06306"></a><span class="lineno"> 6306</span>&#160;    }</div>
+<div class="line"><a name="l06307"></a><span class="lineno"> 6307</span>&#160;    <span class="keywordtype">bool</span> operator()(<span class="keyword">const</span> VmaPair&lt;FirstT, SecondT&gt;&amp; lhs, <span class="keyword">const</span> FirstT&amp; rhsFirst)<span class="keyword"> const</span></div>
+<div class="line"><a name="l06308"></a><span class="lineno"> 6308</span>&#160;<span class="keyword">    </span>{</div>
+<div class="line"><a name="l06309"></a><span class="lineno"> 6309</span>&#160;        <span class="keywordflow">return</span> lhs.first &lt; rhsFirst;</div>
+<div class="line"><a name="l06310"></a><span class="lineno"> 6310</span>&#160;    }</div>
+<div class="line"><a name="l06311"></a><span class="lineno"> 6311</span>&#160;};</div>
+<div class="line"><a name="l06312"></a><span class="lineno"> 6312</span>&#160; </div>
+<div class="line"><a name="l06313"></a><span class="lineno"> 6313</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> KeyT, <span class="keyword">typename</span> ValueT&gt;</div>
+<div class="line"><a name="l06314"></a><span class="lineno"> 6314</span>&#160;<span class="keywordtype">void</span> VmaMap&lt;KeyT, ValueT&gt;::insert(<span class="keyword">const</span> PairType&amp; pair)</div>
+<div class="line"><a name="l06315"></a><span class="lineno"> 6315</span>&#160;{</div>
+<div class="line"><a name="l06316"></a><span class="lineno"> 6316</span>&#160;    <span class="keyword">const</span> <span class="keywordtype">size_t</span> indexToInsert = VmaBinaryFindFirstNotLess(</div>
+<div class="line"><a name="l06317"></a><span class="lineno"> 6317</span>&#160;        m_Vector.data(),</div>
+<div class="line"><a name="l06318"></a><span class="lineno"> 6318</span>&#160;        m_Vector.data() + m_Vector.size(),</div>
+<div class="line"><a name="l06319"></a><span class="lineno"> 6319</span>&#160;        pair,</div>
+<div class="line"><a name="l06320"></a><span class="lineno"> 6320</span>&#160;        VmaPairFirstLess&lt;KeyT, ValueT&gt;()) - m_Vector.data();</div>
+<div class="line"><a name="l06321"></a><span class="lineno"> 6321</span>&#160;    VmaVectorInsert(m_Vector, indexToInsert, pair);</div>
+<div class="line"><a name="l06322"></a><span class="lineno"> 6322</span>&#160;}</div>
+<div class="line"><a name="l06323"></a><span class="lineno"> 6323</span>&#160; </div>
+<div class="line"><a name="l06324"></a><span class="lineno"> 6324</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> KeyT, <span class="keyword">typename</span> ValueT&gt;</div>
+<div class="line"><a name="l06325"></a><span class="lineno"> 6325</span>&#160;VmaPair&lt;KeyT, ValueT&gt;* VmaMap&lt;KeyT, ValueT&gt;::find(<span class="keyword">const</span> KeyT&amp; key)</div>
+<div class="line"><a name="l06326"></a><span class="lineno"> 6326</span>&#160;{</div>
+<div class="line"><a name="l06327"></a><span class="lineno"> 6327</span>&#160;    PairType* it = VmaBinaryFindFirstNotLess(</div>
+<div class="line"><a name="l06328"></a><span class="lineno"> 6328</span>&#160;        m_Vector.data(),</div>
+<div class="line"><a name="l06329"></a><span class="lineno"> 6329</span>&#160;        m_Vector.data() + m_Vector.size(),</div>
+<div class="line"><a name="l06330"></a><span class="lineno"> 6330</span>&#160;        key,</div>
+<div class="line"><a name="l06331"></a><span class="lineno"> 6331</span>&#160;        VmaPairFirstLess&lt;KeyT, ValueT&gt;());</div>
+<div class="line"><a name="l06332"></a><span class="lineno"> 6332</span>&#160;    <span class="keywordflow">if</span>((it != m_Vector.end()) &amp;&amp; (it-&gt;first == key))</div>
+<div class="line"><a name="l06333"></a><span class="lineno"> 6333</span>&#160;    {</div>
+<div class="line"><a name="l06334"></a><span class="lineno"> 6334</span>&#160;        <span class="keywordflow">return</span> it;</div>
+<div class="line"><a name="l06335"></a><span class="lineno"> 6335</span>&#160;    }</div>
+<div class="line"><a name="l06336"></a><span class="lineno"> 6336</span>&#160;    <span class="keywordflow">else</span></div>
+<div class="line"><a name="l06337"></a><span class="lineno"> 6337</span>&#160;    {</div>
+<div class="line"><a name="l06338"></a><span class="lineno"> 6338</span>&#160;        <span class="keywordflow">return</span> m_Vector.end();</div>
+<div class="line"><a name="l06339"></a><span class="lineno"> 6339</span>&#160;    }</div>
+<div class="line"><a name="l06340"></a><span class="lineno"> 6340</span>&#160;}</div>
+<div class="line"><a name="l06341"></a><span class="lineno"> 6341</span>&#160; </div>
+<div class="line"><a name="l06342"></a><span class="lineno"> 6342</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> KeyT, <span class="keyword">typename</span> ValueT&gt;</div>
+<div class="line"><a name="l06343"></a><span class="lineno"> 6343</span>&#160;<span class="keywordtype">void</span> VmaMap&lt;KeyT, ValueT&gt;::erase(iterator it)</div>
+<div class="line"><a name="l06344"></a><span class="lineno"> 6344</span>&#160;{</div>
+<div class="line"><a name="l06345"></a><span class="lineno"> 6345</span>&#160;    VmaVectorRemove(m_Vector, it - m_Vector.begin());</div>
+<div class="line"><a name="l06346"></a><span class="lineno"> 6346</span>&#160;}</div>
 <div class="line"><a name="l06347"></a><span class="lineno"> 6347</span>&#160; </div>
-<div class="line"><a name="l06348"></a><span class="lineno"> 6348</span>&#160;    <span class="comment">// Checks if requested suballocation with given parameters can be placed in given pFreeSuballocItem.</span></div>
-<div class="line"><a name="l06349"></a><span class="lineno"> 6349</span>&#160;    <span class="comment">// If yes, fills pOffset and returns true. If no, returns false.</span></div>
-<div class="line"><a name="l06350"></a><span class="lineno"> 6350</span>&#160;    <span class="keywordtype">bool</span> CheckAllocation(</div>
-<div class="line"><a name="l06351"></a><span class="lineno"> 6351</span>&#160;        uint32_t currentFrameIndex,</div>
-<div class="line"><a name="l06352"></a><span class="lineno"> 6352</span>&#160;        uint32_t frameInUseCount,</div>
-<div class="line"><a name="l06353"></a><span class="lineno"> 6353</span>&#160;        VkDeviceSize bufferImageGranularity,</div>
-<div class="line"><a name="l06354"></a><span class="lineno"> 6354</span>&#160;        VkDeviceSize allocSize,</div>
-<div class="line"><a name="l06355"></a><span class="lineno"> 6355</span>&#160;        VkDeviceSize allocAlignment,</div>
-<div class="line"><a name="l06356"></a><span class="lineno"> 6356</span>&#160;        VmaSuballocationType allocType,</div>
-<div class="line"><a name="l06357"></a><span class="lineno"> 6357</span>&#160;        VmaSuballocationList::const_iterator suballocItem,</div>
-<div class="line"><a name="l06358"></a><span class="lineno"> 6358</span>&#160;        <span class="keywordtype">bool</span> canMakeOtherLost,</div>
-<div class="line"><a name="l06359"></a><span class="lineno"> 6359</span>&#160;        VkDeviceSize* pOffset,</div>
-<div class="line"><a name="l06360"></a><span class="lineno"> 6360</span>&#160;        <span class="keywordtype">size_t</span>* itemsToMakeLostCount,</div>
-<div class="line"><a name="l06361"></a><span class="lineno"> 6361</span>&#160;        VkDeviceSize* pSumFreeSize,</div>
-<div class="line"><a name="l06362"></a><span class="lineno"> 6362</span>&#160;        VkDeviceSize* pSumItemSize) <span class="keyword">const</span>;</div>
-<div class="line"><a name="l06363"></a><span class="lineno"> 6363</span>&#160;    <span class="comment">// Given free suballocation, it merges it with following one, which must also be free.</span></div>
-<div class="line"><a name="l06364"></a><span class="lineno"> 6364</span>&#160;    <span class="keywordtype">void</span> MergeFreeWithNext(VmaSuballocationList::iterator item);</div>
-<div class="line"><a name="l06365"></a><span class="lineno"> 6365</span>&#160;    <span class="comment">// Releases given suballocation, making it free.</span></div>
-<div class="line"><a name="l06366"></a><span class="lineno"> 6366</span>&#160;    <span class="comment">// Merges it with adjacent free suballocations if applicable.</span></div>
-<div class="line"><a name="l06367"></a><span class="lineno"> 6367</span>&#160;    <span class="comment">// Returns iterator to new free suballocation at this place.</span></div>
-<div class="line"><a name="l06368"></a><span class="lineno"> 6368</span>&#160;    VmaSuballocationList::iterator FreeSuballocation(VmaSuballocationList::iterator suballocItem);</div>
-<div class="line"><a name="l06369"></a><span class="lineno"> 6369</span>&#160;    <span class="comment">// Given free suballocation, it inserts it into sorted list of</span></div>
-<div class="line"><a name="l06370"></a><span class="lineno"> 6370</span>&#160;    <span class="comment">// m_FreeSuballocationsBySize if it&#39;s suitable.</span></div>
-<div class="line"><a name="l06371"></a><span class="lineno"> 6371</span>&#160;    <span class="keywordtype">void</span> RegisterFreeSuballocation(VmaSuballocationList::iterator item);</div>
-<div class="line"><a name="l06372"></a><span class="lineno"> 6372</span>&#160;    <span class="comment">// Given free suballocation, it removes it from sorted list of</span></div>
-<div class="line"><a name="l06373"></a><span class="lineno"> 6373</span>&#160;    <span class="comment">// m_FreeSuballocationsBySize if it&#39;s suitable.</span></div>
-<div class="line"><a name="l06374"></a><span class="lineno"> 6374</span>&#160;    <span class="keywordtype">void</span> UnregisterFreeSuballocation(VmaSuballocationList::iterator item);</div>
-<div class="line"><a name="l06375"></a><span class="lineno"> 6375</span>&#160;};</div>
-<div class="line"><a name="l06376"></a><span class="lineno"> 6376</span>&#160; </div>
-<div class="line"><a name="l06377"></a><span class="lineno"> 6377</span>&#160;<span class="comment">/*</span></div>
-<div class="line"><a name="l06378"></a><span class="lineno"> 6378</span>&#160;<span class="comment">Allocations and their references in internal data structure look like this:</span></div>
-<div class="line"><a name="l06379"></a><span class="lineno"> 6379</span>&#160;<span class="comment"></span> </div>
-<div class="line"><a name="l06380"></a><span class="lineno"> 6380</span>&#160;<span class="comment">if(m_2ndVectorMode == SECOND_VECTOR_EMPTY):</span></div>
-<div class="line"><a name="l06381"></a><span class="lineno"> 6381</span>&#160;<span class="comment"></span> </div>
-<div class="line"><a name="l06382"></a><span class="lineno"> 6382</span>&#160;<span class="comment">        0 +-------+</span></div>
-<div class="line"><a name="l06383"></a><span class="lineno"> 6383</span>&#160;<span class="comment">          |       |</span></div>
-<div class="line"><a name="l06384"></a><span class="lineno"> 6384</span>&#160;<span class="comment">          |       |</span></div>
-<div class="line"><a name="l06385"></a><span class="lineno"> 6385</span>&#160;<span class="comment">          |       |</span></div>
-<div class="line"><a name="l06386"></a><span class="lineno"> 6386</span>&#160;<span class="comment">          +-------+</span></div>
-<div class="line"><a name="l06387"></a><span class="lineno"> 6387</span>&#160;<span class="comment">          | Alloc |  1st[m_1stNullItemsBeginCount]</span></div>
-<div class="line"><a name="l06388"></a><span class="lineno"> 6388</span>&#160;<span class="comment">          +-------+</span></div>
-<div class="line"><a name="l06389"></a><span class="lineno"> 6389</span>&#160;<span class="comment">          | Alloc |  1st[m_1stNullItemsBeginCount + 1]</span></div>
-<div class="line"><a name="l06390"></a><span class="lineno"> 6390</span>&#160;<span class="comment">          +-------+</span></div>
-<div class="line"><a name="l06391"></a><span class="lineno"> 6391</span>&#160;<span class="comment">          |  ...  |</span></div>
-<div class="line"><a name="l06392"></a><span class="lineno"> 6392</span>&#160;<span class="comment">          +-------+</span></div>
-<div class="line"><a name="l06393"></a><span class="lineno"> 6393</span>&#160;<span class="comment">          | Alloc |  1st[1st.size() - 1]</span></div>
-<div class="line"><a name="l06394"></a><span class="lineno"> 6394</span>&#160;<span class="comment">          +-------+</span></div>
-<div class="line"><a name="l06395"></a><span class="lineno"> 6395</span>&#160;<span class="comment">          |       |</span></div>
-<div class="line"><a name="l06396"></a><span class="lineno"> 6396</span>&#160;<span class="comment">          |       |</span></div>
-<div class="line"><a name="l06397"></a><span class="lineno"> 6397</span>&#160;<span class="comment">          |       |</span></div>
-<div class="line"><a name="l06398"></a><span class="lineno"> 6398</span>&#160;<span class="comment">GetSize() +-------+</span></div>
-<div class="line"><a name="l06399"></a><span class="lineno"> 6399</span>&#160;<span class="comment"></span> </div>
-<div class="line"><a name="l06400"></a><span class="lineno"> 6400</span>&#160;<span class="comment">if(m_2ndVectorMode == SECOND_VECTOR_RING_BUFFER):</span></div>
-<div class="line"><a name="l06401"></a><span class="lineno"> 6401</span>&#160;<span class="comment"></span> </div>
-<div class="line"><a name="l06402"></a><span class="lineno"> 6402</span>&#160;<span class="comment">        0 +-------+</span></div>
-<div class="line"><a name="l06403"></a><span class="lineno"> 6403</span>&#160;<span class="comment">          | Alloc |  2nd[0]</span></div>
-<div class="line"><a name="l06404"></a><span class="lineno"> 6404</span>&#160;<span class="comment">          +-------+</span></div>
-<div class="line"><a name="l06405"></a><span class="lineno"> 6405</span>&#160;<span class="comment">          | Alloc |  2nd[1]</span></div>
-<div class="line"><a name="l06406"></a><span class="lineno"> 6406</span>&#160;<span class="comment">          +-------+</span></div>
-<div class="line"><a name="l06407"></a><span class="lineno"> 6407</span>&#160;<span class="comment">          |  ...  |</span></div>
-<div class="line"><a name="l06408"></a><span class="lineno"> 6408</span>&#160;<span class="comment">          +-------+</span></div>
-<div class="line"><a name="l06409"></a><span class="lineno"> 6409</span>&#160;<span class="comment">          | Alloc |  2nd[2nd.size() - 1]</span></div>
-<div class="line"><a name="l06410"></a><span class="lineno"> 6410</span>&#160;<span class="comment">          +-------+</span></div>
-<div class="line"><a name="l06411"></a><span class="lineno"> 6411</span>&#160;<span class="comment">          |       |</span></div>
-<div class="line"><a name="l06412"></a><span class="lineno"> 6412</span>&#160;<span class="comment">          |       |</span></div>
-<div class="line"><a name="l06413"></a><span class="lineno"> 6413</span>&#160;<span class="comment">          |       |</span></div>
-<div class="line"><a name="l06414"></a><span class="lineno"> 6414</span>&#160;<span class="comment">          +-------+</span></div>
-<div class="line"><a name="l06415"></a><span class="lineno"> 6415</span>&#160;<span class="comment">          | Alloc |  1st[m_1stNullItemsBeginCount]</span></div>
-<div class="line"><a name="l06416"></a><span class="lineno"> 6416</span>&#160;<span class="comment">          +-------+</span></div>
-<div class="line"><a name="l06417"></a><span class="lineno"> 6417</span>&#160;<span class="comment">          | Alloc |  1st[m_1stNullItemsBeginCount + 1]</span></div>
-<div class="line"><a name="l06418"></a><span class="lineno"> 6418</span>&#160;<span class="comment">          +-------+</span></div>
-<div class="line"><a name="l06419"></a><span class="lineno"> 6419</span>&#160;<span class="comment">          |  ...  |</span></div>
-<div class="line"><a name="l06420"></a><span class="lineno"> 6420</span>&#160;<span class="comment">          +-------+</span></div>
-<div class="line"><a name="l06421"></a><span class="lineno"> 6421</span>&#160;<span class="comment">          | Alloc |  1st[1st.size() - 1]</span></div>
-<div class="line"><a name="l06422"></a><span class="lineno"> 6422</span>&#160;<span class="comment">          +-------+</span></div>
-<div class="line"><a name="l06423"></a><span class="lineno"> 6423</span>&#160;<span class="comment">          |       |</span></div>
-<div class="line"><a name="l06424"></a><span class="lineno"> 6424</span>&#160;<span class="comment">GetSize() +-------+</span></div>
-<div class="line"><a name="l06425"></a><span class="lineno"> 6425</span>&#160;<span class="comment"></span> </div>
-<div class="line"><a name="l06426"></a><span class="lineno"> 6426</span>&#160;<span class="comment">if(m_2ndVectorMode == SECOND_VECTOR_DOUBLE_STACK):</span></div>
-<div class="line"><a name="l06427"></a><span class="lineno"> 6427</span>&#160;<span class="comment"></span> </div>
-<div class="line"><a name="l06428"></a><span class="lineno"> 6428</span>&#160;<span class="comment">        0 +-------+</span></div>
-<div class="line"><a name="l06429"></a><span class="lineno"> 6429</span>&#160;<span class="comment">          |       |</span></div>
-<div class="line"><a name="l06430"></a><span class="lineno"> 6430</span>&#160;<span class="comment">          |       |</span></div>
-<div class="line"><a name="l06431"></a><span class="lineno"> 6431</span>&#160;<span class="comment">          |       |</span></div>
-<div class="line"><a name="l06432"></a><span class="lineno"> 6432</span>&#160;<span class="comment">          +-------+</span></div>
-<div class="line"><a name="l06433"></a><span class="lineno"> 6433</span>&#160;<span class="comment">          | Alloc |  1st[m_1stNullItemsBeginCount]</span></div>
-<div class="line"><a name="l06434"></a><span class="lineno"> 6434</span>&#160;<span class="comment">          +-------+</span></div>
-<div class="line"><a name="l06435"></a><span class="lineno"> 6435</span>&#160;<span class="comment">          | Alloc |  1st[m_1stNullItemsBeginCount + 1]</span></div>
-<div class="line"><a name="l06436"></a><span class="lineno"> 6436</span>&#160;<span class="comment">          +-------+</span></div>
-<div class="line"><a name="l06437"></a><span class="lineno"> 6437</span>&#160;<span class="comment">          |  ...  |</span></div>
-<div class="line"><a name="l06438"></a><span class="lineno"> 6438</span>&#160;<span class="comment">          +-------+</span></div>
-<div class="line"><a name="l06439"></a><span class="lineno"> 6439</span>&#160;<span class="comment">          | Alloc |  1st[1st.size() - 1]</span></div>
-<div class="line"><a name="l06440"></a><span class="lineno"> 6440</span>&#160;<span class="comment">          +-------+</span></div>
-<div class="line"><a name="l06441"></a><span class="lineno"> 6441</span>&#160;<span class="comment">          |       |</span></div>
-<div class="line"><a name="l06442"></a><span class="lineno"> 6442</span>&#160;<span class="comment">          |       |</span></div>
-<div class="line"><a name="l06443"></a><span class="lineno"> 6443</span>&#160;<span class="comment">          |       |</span></div>
-<div class="line"><a name="l06444"></a><span class="lineno"> 6444</span>&#160;<span class="comment">          +-------+</span></div>
-<div class="line"><a name="l06445"></a><span class="lineno"> 6445</span>&#160;<span class="comment">          | Alloc |  2nd[2nd.size() - 1]</span></div>
-<div class="line"><a name="l06446"></a><span class="lineno"> 6446</span>&#160;<span class="comment">          +-------+</span></div>
-<div class="line"><a name="l06447"></a><span class="lineno"> 6447</span>&#160;<span class="comment">          |  ...  |</span></div>
-<div class="line"><a name="l06448"></a><span class="lineno"> 6448</span>&#160;<span class="comment">          +-------+</span></div>
-<div class="line"><a name="l06449"></a><span class="lineno"> 6449</span>&#160;<span class="comment">          | Alloc |  2nd[1]</span></div>
-<div class="line"><a name="l06450"></a><span class="lineno"> 6450</span>&#160;<span class="comment">          +-------+</span></div>
-<div class="line"><a name="l06451"></a><span class="lineno"> 6451</span>&#160;<span class="comment">          | Alloc |  2nd[0]</span></div>
-<div class="line"><a name="l06452"></a><span class="lineno"> 6452</span>&#160;<span class="comment">GetSize() +-------+</span></div>
-<div class="line"><a name="l06453"></a><span class="lineno"> 6453</span>&#160;<span class="comment"></span> </div>
-<div class="line"><a name="l06454"></a><span class="lineno"> 6454</span>&#160;<span class="comment">*/</span></div>
-<div class="line"><a name="l06455"></a><span class="lineno"> 6455</span>&#160;<span class="keyword">class </span>VmaBlockMetadata_Linear : <span class="keyword">public</span> VmaBlockMetadata</div>
-<div class="line"><a name="l06456"></a><span class="lineno"> 6456</span>&#160;{</div>
-<div class="line"><a name="l06457"></a><span class="lineno"> 6457</span>&#160;    VMA_CLASS_NO_COPY(VmaBlockMetadata_Linear)</div>
-<div class="line"><a name="l06458"></a><span class="lineno"> 6458</span>&#160;<span class="keyword">public</span>:</div>
-<div class="line"><a name="l06459"></a><span class="lineno"> 6459</span>&#160;    VmaBlockMetadata_Linear(<a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator);</div>
-<div class="line"><a name="l06460"></a><span class="lineno"> 6460</span>&#160;    <span class="keyword">virtual</span> ~VmaBlockMetadata_Linear();</div>
-<div class="line"><a name="l06461"></a><span class="lineno"> 6461</span>&#160;    <span class="keyword">virtual</span> <span class="keywordtype">void</span> Init(VkDeviceSize size);</div>
-<div class="line"><a name="l06462"></a><span class="lineno"> 6462</span>&#160; </div>
-<div class="line"><a name="l06463"></a><span class="lineno"> 6463</span>&#160;    <span class="keyword">virtual</span> <span class="keywordtype">bool</span> Validate() <span class="keyword">const</span>;</div>
-<div class="line"><a name="l06464"></a><span class="lineno"> 6464</span>&#160;    <span class="keyword">virtual</span> <span class="keywordtype">size_t</span> GetAllocationCount() <span class="keyword">const</span>;</div>
-<div class="line"><a name="l06465"></a><span class="lineno"> 6465</span>&#160;    <span class="keyword">virtual</span> VkDeviceSize GetSumFreeSize()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_SumFreeSize; }</div>
-<div class="line"><a name="l06466"></a><span class="lineno"> 6466</span>&#160;    <span class="keyword">virtual</span> VkDeviceSize GetUnusedRangeSizeMax() <span class="keyword">const</span>;</div>
-<div class="line"><a name="l06467"></a><span class="lineno"> 6467</span>&#160;    <span class="keyword">virtual</span> <span class="keywordtype">bool</span> IsEmpty()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> GetAllocationCount() == 0; }</div>
-<div class="line"><a name="l06468"></a><span class="lineno"> 6468</span>&#160; </div>
-<div class="line"><a name="l06469"></a><span class="lineno"> 6469</span>&#160;    <span class="keyword">virtual</span> <span class="keywordtype">void</span> CalcAllocationStatInfo(<a class="code" href="struct_vma_stat_info.html">VmaStatInfo</a>&amp; outInfo) <span class="keyword">const</span>;</div>
-<div class="line"><a name="l06470"></a><span class="lineno"> 6470</span>&#160;    <span class="keyword">virtual</span> <span class="keywordtype">void</span> AddPoolStats(<a class="code" href="struct_vma_pool_stats.html">VmaPoolStats</a>&amp; inoutStats) <span class="keyword">const</span>;</div>
-<div class="line"><a name="l06471"></a><span class="lineno"> 6471</span>&#160; </div>
-<div class="line"><a name="l06472"></a><span class="lineno"> 6472</span>&#160;<span class="preprocessor">#if VMA_STATS_STRING_ENABLED</span></div>
-<div class="line"><a name="l06473"></a><span class="lineno"> 6473</span>&#160;    <span class="keyword">virtual</span> <span class="keywordtype">void</span> PrintDetailedMap(<span class="keyword">class</span> VmaJsonWriter&amp; json) <span class="keyword">const</span>;</div>
-<div class="line"><a name="l06474"></a><span class="lineno"> 6474</span>&#160;<span class="preprocessor">#endif</span></div>
+<div class="line"><a name="l06348"></a><span class="lineno"> 6348</span>&#160;<span class="preprocessor">#endif </span><span class="comment">// #if VMA_USE_STL_UNORDERED_MAP</span></div>
+<div class="line"><a name="l06349"></a><span class="lineno"> 6349</span>&#160; </div>
+<div class="line"><a name="l06350"></a><span class="lineno"> 6350</span>&#160;<span class="preprocessor">#endif </span><span class="comment">// #if 0</span></div>
+<div class="line"><a name="l06351"></a><span class="lineno"> 6351</span>&#160; </div>
+<div class="line"><a name="l06353"></a><span class="lineno"> 6353</span>&#160; </div>
+<div class="line"><a name="l06354"></a><span class="lineno"> 6354</span>&#160;<span class="keyword">class </span>VmaDeviceMemoryBlock;</div>
+<div class="line"><a name="l06355"></a><span class="lineno"> 6355</span>&#160; </div>
+<div class="line"><a name="l06356"></a><span class="lineno"> 6356</span>&#160;<span class="keyword">enum</span> VMA_CACHE_OPERATION { VMA_CACHE_FLUSH, VMA_CACHE_INVALIDATE };</div>
+<div class="line"><a name="l06357"></a><span class="lineno"> 6357</span>&#160; </div>
+<div class="line"><a name="l06358"></a><span class="lineno"> 6358</span>&#160;<span class="keyword">struct </span>VmaAllocation_T</div>
+<div class="line"><a name="l06359"></a><span class="lineno"> 6359</span>&#160;{</div>
+<div class="line"><a name="l06360"></a><span class="lineno"> 6360</span>&#160;<span class="keyword">private</span>:</div>
+<div class="line"><a name="l06361"></a><span class="lineno"> 6361</span>&#160;    <span class="keyword">static</span> <span class="keyword">const</span> uint8_t MAP_COUNT_FLAG_PERSISTENT_MAP = 0x80;</div>
+<div class="line"><a name="l06362"></a><span class="lineno"> 6362</span>&#160; </div>
+<div class="line"><a name="l06363"></a><span class="lineno"> 6363</span>&#160;    <span class="keyword">enum</span> FLAGS</div>
+<div class="line"><a name="l06364"></a><span class="lineno"> 6364</span>&#160;    {</div>
+<div class="line"><a name="l06365"></a><span class="lineno"> 6365</span>&#160;        FLAG_USER_DATA_STRING = 0x01,</div>
+<div class="line"><a name="l06366"></a><span class="lineno"> 6366</span>&#160;    };</div>
+<div class="line"><a name="l06367"></a><span class="lineno"> 6367</span>&#160; </div>
+<div class="line"><a name="l06368"></a><span class="lineno"> 6368</span>&#160;<span class="keyword">public</span>:</div>
+<div class="line"><a name="l06369"></a><span class="lineno"> 6369</span>&#160;    <span class="keyword">enum</span> ALLOCATION_TYPE</div>
+<div class="line"><a name="l06370"></a><span class="lineno"> 6370</span>&#160;    {</div>
+<div class="line"><a name="l06371"></a><span class="lineno"> 6371</span>&#160;        ALLOCATION_TYPE_NONE,</div>
+<div class="line"><a name="l06372"></a><span class="lineno"> 6372</span>&#160;        ALLOCATION_TYPE_BLOCK,</div>
+<div class="line"><a name="l06373"></a><span class="lineno"> 6373</span>&#160;        ALLOCATION_TYPE_DEDICATED,</div>
+<div class="line"><a name="l06374"></a><span class="lineno"> 6374</span>&#160;    };</div>
+<div class="line"><a name="l06375"></a><span class="lineno"> 6375</span>&#160; </div>
+<div class="line"><a name="l06376"></a><span class="lineno"> 6376</span>&#160;    <span class="comment">/*</span></div>
+<div class="line"><a name="l06377"></a><span class="lineno"> 6377</span>&#160;<span class="comment">    This struct is allocated using VmaPoolAllocator.</span></div>
+<div class="line"><a name="l06378"></a><span class="lineno"> 6378</span>&#160;<span class="comment">    */</span></div>
+<div class="line"><a name="l06379"></a><span class="lineno"> 6379</span>&#160; </div>
+<div class="line"><a name="l06380"></a><span class="lineno"> 6380</span>&#160;    VmaAllocation_T(uint32_t currentFrameIndex, <span class="keywordtype">bool</span> userDataString) :</div>
+<div class="line"><a name="l06381"></a><span class="lineno"> 6381</span>&#160;        m_Alignment{1},</div>
+<div class="line"><a name="l06382"></a><span class="lineno"> 6382</span>&#160;        m_Size{0},</div>
+<div class="line"><a name="l06383"></a><span class="lineno"> 6383</span>&#160;        m_pUserData{VMA_NULL},</div>
+<div class="line"><a name="l06384"></a><span class="lineno"> 6384</span>&#160;        m_LastUseFrameIndex{currentFrameIndex},</div>
+<div class="line"><a name="l06385"></a><span class="lineno"> 6385</span>&#160;        m_MemoryTypeIndex{0},</div>
+<div class="line"><a name="l06386"></a><span class="lineno"> 6386</span>&#160;        m_Type{(uint8_t)ALLOCATION_TYPE_NONE},</div>
+<div class="line"><a name="l06387"></a><span class="lineno"> 6387</span>&#160;        m_SuballocationType{(uint8_t)VMA_SUBALLOCATION_TYPE_UNKNOWN},</div>
+<div class="line"><a name="l06388"></a><span class="lineno"> 6388</span>&#160;        m_MapCount{0},</div>
+<div class="line"><a name="l06389"></a><span class="lineno"> 6389</span>&#160;        m_Flags{userDataString ? (uint8_t)FLAG_USER_DATA_STRING : (uint8_t)0}</div>
+<div class="line"><a name="l06390"></a><span class="lineno"> 6390</span>&#160;    {</div>
+<div class="line"><a name="l06391"></a><span class="lineno"> 6391</span>&#160;<span class="preprocessor">#if VMA_STATS_STRING_ENABLED</span></div>
+<div class="line"><a name="l06392"></a><span class="lineno"> 6392</span>&#160;        m_CreationFrameIndex = currentFrameIndex;</div>
+<div class="line"><a name="l06393"></a><span class="lineno"> 6393</span>&#160;        m_BufferImageUsage = 0;</div>
+<div class="line"><a name="l06394"></a><span class="lineno"> 6394</span>&#160;<span class="preprocessor">#endif</span></div>
+<div class="line"><a name="l06395"></a><span class="lineno"> 6395</span>&#160;    }</div>
+<div class="line"><a name="l06396"></a><span class="lineno"> 6396</span>&#160; </div>
+<div class="line"><a name="l06397"></a><span class="lineno"> 6397</span>&#160;    ~VmaAllocation_T()</div>
+<div class="line"><a name="l06398"></a><span class="lineno"> 6398</span>&#160;    {</div>
+<div class="line"><a name="l06399"></a><span class="lineno"> 6399</span>&#160;        VMA_ASSERT((m_MapCount &amp; ~MAP_COUNT_FLAG_PERSISTENT_MAP) == 0 &amp;&amp; <span class="stringliteral">&quot;Allocation was not unmapped before destruction.&quot;</span>);</div>
+<div class="line"><a name="l06400"></a><span class="lineno"> 6400</span>&#160; </div>
+<div class="line"><a name="l06401"></a><span class="lineno"> 6401</span>&#160;        <span class="comment">// Check if owned string was freed.</span></div>
+<div class="line"><a name="l06402"></a><span class="lineno"> 6402</span>&#160;        VMA_ASSERT(m_pUserData == VMA_NULL);</div>
+<div class="line"><a name="l06403"></a><span class="lineno"> 6403</span>&#160;    }</div>
+<div class="line"><a name="l06404"></a><span class="lineno"> 6404</span>&#160; </div>
+<div class="line"><a name="l06405"></a><span class="lineno"> 6405</span>&#160;    <span class="keywordtype">void</span> InitBlockAllocation(</div>
+<div class="line"><a name="l06406"></a><span class="lineno"> 6406</span>&#160;        VmaDeviceMemoryBlock* block,</div>
+<div class="line"><a name="l06407"></a><span class="lineno"> 6407</span>&#160;        VkDeviceSize offset,</div>
+<div class="line"><a name="l06408"></a><span class="lineno"> 6408</span>&#160;        VkDeviceSize alignment,</div>
+<div class="line"><a name="l06409"></a><span class="lineno"> 6409</span>&#160;        VkDeviceSize size,</div>
+<div class="line"><a name="l06410"></a><span class="lineno"> 6410</span>&#160;        uint32_t memoryTypeIndex,</div>
+<div class="line"><a name="l06411"></a><span class="lineno"> 6411</span>&#160;        VmaSuballocationType suballocationType,</div>
+<div class="line"><a name="l06412"></a><span class="lineno"> 6412</span>&#160;        <span class="keywordtype">bool</span> mapped,</div>
+<div class="line"><a name="l06413"></a><span class="lineno"> 6413</span>&#160;        <span class="keywordtype">bool</span> canBecomeLost)</div>
+<div class="line"><a name="l06414"></a><span class="lineno"> 6414</span>&#160;    {</div>
+<div class="line"><a name="l06415"></a><span class="lineno"> 6415</span>&#160;        VMA_ASSERT(m_Type == ALLOCATION_TYPE_NONE);</div>
+<div class="line"><a name="l06416"></a><span class="lineno"> 6416</span>&#160;        VMA_ASSERT(block != VMA_NULL);</div>
+<div class="line"><a name="l06417"></a><span class="lineno"> 6417</span>&#160;        m_Type = (uint8_t)ALLOCATION_TYPE_BLOCK;</div>
+<div class="line"><a name="l06418"></a><span class="lineno"> 6418</span>&#160;        m_Alignment = alignment;</div>
+<div class="line"><a name="l06419"></a><span class="lineno"> 6419</span>&#160;        m_Size = size;</div>
+<div class="line"><a name="l06420"></a><span class="lineno"> 6420</span>&#160;        m_MemoryTypeIndex = memoryTypeIndex;</div>
+<div class="line"><a name="l06421"></a><span class="lineno"> 6421</span>&#160;        m_MapCount = mapped ? MAP_COUNT_FLAG_PERSISTENT_MAP : 0;</div>
+<div class="line"><a name="l06422"></a><span class="lineno"> 6422</span>&#160;        m_SuballocationType = (uint8_t)suballocationType;</div>
+<div class="line"><a name="l06423"></a><span class="lineno"> 6423</span>&#160;        m_BlockAllocation.m_Block = block;</div>
+<div class="line"><a name="l06424"></a><span class="lineno"> 6424</span>&#160;        m_BlockAllocation.m_Offset = offset;</div>
+<div class="line"><a name="l06425"></a><span class="lineno"> 6425</span>&#160;        m_BlockAllocation.m_CanBecomeLost = canBecomeLost;</div>
+<div class="line"><a name="l06426"></a><span class="lineno"> 6426</span>&#160;    }</div>
+<div class="line"><a name="l06427"></a><span class="lineno"> 6427</span>&#160; </div>
+<div class="line"><a name="l06428"></a><span class="lineno"> 6428</span>&#160;    <span class="keywordtype">void</span> InitLost()</div>
+<div class="line"><a name="l06429"></a><span class="lineno"> 6429</span>&#160;    {</div>
+<div class="line"><a name="l06430"></a><span class="lineno"> 6430</span>&#160;        VMA_ASSERT(m_Type == ALLOCATION_TYPE_NONE);</div>
+<div class="line"><a name="l06431"></a><span class="lineno"> 6431</span>&#160;        VMA_ASSERT(m_LastUseFrameIndex.load() == VMA_FRAME_INDEX_LOST);</div>
+<div class="line"><a name="l06432"></a><span class="lineno"> 6432</span>&#160;        m_Type = (uint8_t)ALLOCATION_TYPE_BLOCK;</div>
+<div class="line"><a name="l06433"></a><span class="lineno"> 6433</span>&#160;        m_MemoryTypeIndex = 0;</div>
+<div class="line"><a name="l06434"></a><span class="lineno"> 6434</span>&#160;        m_BlockAllocation.m_Block = VMA_NULL;</div>
+<div class="line"><a name="l06435"></a><span class="lineno"> 6435</span>&#160;        m_BlockAllocation.m_Offset = 0;</div>
+<div class="line"><a name="l06436"></a><span class="lineno"> 6436</span>&#160;        m_BlockAllocation.m_CanBecomeLost = <span class="keyword">true</span>;</div>
+<div class="line"><a name="l06437"></a><span class="lineno"> 6437</span>&#160;    }</div>
+<div class="line"><a name="l06438"></a><span class="lineno"> 6438</span>&#160; </div>
+<div class="line"><a name="l06439"></a><span class="lineno"> 6439</span>&#160;    <span class="keywordtype">void</span> ChangeBlockAllocation(</div>
+<div class="line"><a name="l06440"></a><span class="lineno"> 6440</span>&#160;        <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator,</div>
+<div class="line"><a name="l06441"></a><span class="lineno"> 6441</span>&#160;        VmaDeviceMemoryBlock* block,</div>
+<div class="line"><a name="l06442"></a><span class="lineno"> 6442</span>&#160;        VkDeviceSize offset);</div>
+<div class="line"><a name="l06443"></a><span class="lineno"> 6443</span>&#160; </div>
+<div class="line"><a name="l06444"></a><span class="lineno"> 6444</span>&#160;    <span class="keywordtype">void</span> ChangeOffset(VkDeviceSize newOffset);</div>
+<div class="line"><a name="l06445"></a><span class="lineno"> 6445</span>&#160; </div>
+<div class="line"><a name="l06446"></a><span class="lineno"> 6446</span>&#160;    <span class="comment">// pMappedData not null means allocation is created with MAPPED flag.</span></div>
+<div class="line"><a name="l06447"></a><span class="lineno"> 6447</span>&#160;    <span class="keywordtype">void</span> InitDedicatedAllocation(</div>
+<div class="line"><a name="l06448"></a><span class="lineno"> 6448</span>&#160;        uint32_t memoryTypeIndex,</div>
+<div class="line"><a name="l06449"></a><span class="lineno"> 6449</span>&#160;        VkDeviceMemory hMemory,</div>
+<div class="line"><a name="l06450"></a><span class="lineno"> 6450</span>&#160;        VmaSuballocationType suballocationType,</div>
+<div class="line"><a name="l06451"></a><span class="lineno"> 6451</span>&#160;        <span class="keywordtype">void</span>* pMappedData,</div>
+<div class="line"><a name="l06452"></a><span class="lineno"> 6452</span>&#160;        VkDeviceSize size)</div>
+<div class="line"><a name="l06453"></a><span class="lineno"> 6453</span>&#160;    {</div>
+<div class="line"><a name="l06454"></a><span class="lineno"> 6454</span>&#160;        VMA_ASSERT(m_Type == ALLOCATION_TYPE_NONE);</div>
+<div class="line"><a name="l06455"></a><span class="lineno"> 6455</span>&#160;        VMA_ASSERT(hMemory != VK_NULL_HANDLE);</div>
+<div class="line"><a name="l06456"></a><span class="lineno"> 6456</span>&#160;        m_Type = (uint8_t)ALLOCATION_TYPE_DEDICATED;</div>
+<div class="line"><a name="l06457"></a><span class="lineno"> 6457</span>&#160;        m_Alignment = 0;</div>
+<div class="line"><a name="l06458"></a><span class="lineno"> 6458</span>&#160;        m_Size = size;</div>
+<div class="line"><a name="l06459"></a><span class="lineno"> 6459</span>&#160;        m_MemoryTypeIndex = memoryTypeIndex;</div>
+<div class="line"><a name="l06460"></a><span class="lineno"> 6460</span>&#160;        m_SuballocationType = (uint8_t)suballocationType;</div>
+<div class="line"><a name="l06461"></a><span class="lineno"> 6461</span>&#160;        m_MapCount = (pMappedData != VMA_NULL) ? MAP_COUNT_FLAG_PERSISTENT_MAP : 0;</div>
+<div class="line"><a name="l06462"></a><span class="lineno"> 6462</span>&#160;        m_DedicatedAllocation.m_hMemory = hMemory;</div>
+<div class="line"><a name="l06463"></a><span class="lineno"> 6463</span>&#160;        m_DedicatedAllocation.m_pMappedData = pMappedData;</div>
+<div class="line"><a name="l06464"></a><span class="lineno"> 6464</span>&#160;        m_DedicatedAllocation.m_Prev = VMA_NULL;</div>
+<div class="line"><a name="l06465"></a><span class="lineno"> 6465</span>&#160;        m_DedicatedAllocation.m_Next = VMA_NULL;</div>
+<div class="line"><a name="l06466"></a><span class="lineno"> 6466</span>&#160;    }</div>
+<div class="line"><a name="l06467"></a><span class="lineno"> 6467</span>&#160; </div>
+<div class="line"><a name="l06468"></a><span class="lineno"> 6468</span>&#160;    ALLOCATION_TYPE GetType()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> (ALLOCATION_TYPE)m_Type; }</div>
+<div class="line"><a name="l06469"></a><span class="lineno"> 6469</span>&#160;    VkDeviceSize GetAlignment()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_Alignment; }</div>
+<div class="line"><a name="l06470"></a><span class="lineno"> 6470</span>&#160;    VkDeviceSize GetSize()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_Size; }</div>
+<div class="line"><a name="l06471"></a><span class="lineno"> 6471</span>&#160;    <span class="keywordtype">bool</span> IsUserDataString()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> (m_Flags &amp; FLAG_USER_DATA_STRING) != 0; }</div>
+<div class="line"><a name="l06472"></a><span class="lineno"> 6472</span>&#160;    <span class="keywordtype">void</span>* GetUserData()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_pUserData; }</div>
+<div class="line"><a name="l06473"></a><span class="lineno"> 6473</span>&#160;    <span class="keywordtype">void</span> SetUserData(<a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator, <span class="keywordtype">void</span>* pUserData);</div>
+<div class="line"><a name="l06474"></a><span class="lineno"> 6474</span>&#160;    VmaSuballocationType GetSuballocationType()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> (VmaSuballocationType)m_SuballocationType; }</div>
 <div class="line"><a name="l06475"></a><span class="lineno"> 6475</span>&#160; </div>
-<div class="line"><a name="l06476"></a><span class="lineno"> 6476</span>&#160;    <span class="keyword">virtual</span> <span class="keywordtype">bool</span> CreateAllocationRequest(</div>
-<div class="line"><a name="l06477"></a><span class="lineno"> 6477</span>&#160;        uint32_t currentFrameIndex,</div>
-<div class="line"><a name="l06478"></a><span class="lineno"> 6478</span>&#160;        uint32_t frameInUseCount,</div>
-<div class="line"><a name="l06479"></a><span class="lineno"> 6479</span>&#160;        VkDeviceSize bufferImageGranularity,</div>
-<div class="line"><a name="l06480"></a><span class="lineno"> 6480</span>&#160;        VkDeviceSize allocSize,</div>
-<div class="line"><a name="l06481"></a><span class="lineno"> 6481</span>&#160;        VkDeviceSize allocAlignment,</div>
-<div class="line"><a name="l06482"></a><span class="lineno"> 6482</span>&#160;        <span class="keywordtype">bool</span> upperAddress,</div>
-<div class="line"><a name="l06483"></a><span class="lineno"> 6483</span>&#160;        VmaSuballocationType allocType,</div>
-<div class="line"><a name="l06484"></a><span class="lineno"> 6484</span>&#160;        <span class="keywordtype">bool</span> canMakeOtherLost,</div>
-<div class="line"><a name="l06485"></a><span class="lineno"> 6485</span>&#160;        uint32_t strategy,</div>
-<div class="line"><a name="l06486"></a><span class="lineno"> 6486</span>&#160;        VmaAllocationRequest* pAllocationRequest);</div>
+<div class="line"><a name="l06476"></a><span class="lineno"> 6476</span>&#160;    VmaDeviceMemoryBlock* GetBlock()<span class="keyword"> const</span></div>
+<div class="line"><a name="l06477"></a><span class="lineno"> 6477</span>&#160;<span class="keyword">    </span>{</div>
+<div class="line"><a name="l06478"></a><span class="lineno"> 6478</span>&#160;        VMA_ASSERT(m_Type == ALLOCATION_TYPE_BLOCK);</div>
+<div class="line"><a name="l06479"></a><span class="lineno"> 6479</span>&#160;        <span class="keywordflow">return</span> m_BlockAllocation.m_Block;</div>
+<div class="line"><a name="l06480"></a><span class="lineno"> 6480</span>&#160;    }</div>
+<div class="line"><a name="l06481"></a><span class="lineno"> 6481</span>&#160;    VkDeviceSize GetOffset() <span class="keyword">const</span>;</div>
+<div class="line"><a name="l06482"></a><span class="lineno"> 6482</span>&#160;    VkDeviceMemory GetMemory() <span class="keyword">const</span>;</div>
+<div class="line"><a name="l06483"></a><span class="lineno"> 6483</span>&#160;    uint32_t GetMemoryTypeIndex()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_MemoryTypeIndex; }</div>
+<div class="line"><a name="l06484"></a><span class="lineno"> 6484</span>&#160;    <span class="keywordtype">bool</span> IsPersistentMap()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> (m_MapCount &amp; MAP_COUNT_FLAG_PERSISTENT_MAP) != 0; }</div>
+<div class="line"><a name="l06485"></a><span class="lineno"> 6485</span>&#160;    <span class="keywordtype">void</span>* GetMappedData() <span class="keyword">const</span>;</div>
+<div class="line"><a name="l06486"></a><span class="lineno"> 6486</span>&#160;    <span class="keywordtype">bool</span> CanBecomeLost() <span class="keyword">const</span>;</div>
 <div class="line"><a name="l06487"></a><span class="lineno"> 6487</span>&#160; </div>
-<div class="line"><a name="l06488"></a><span class="lineno"> 6488</span>&#160;    <span class="keyword">virtual</span> <span class="keywordtype">bool</span> MakeRequestedAllocationsLost(</div>
-<div class="line"><a name="l06489"></a><span class="lineno"> 6489</span>&#160;        uint32_t currentFrameIndex,</div>
-<div class="line"><a name="l06490"></a><span class="lineno"> 6490</span>&#160;        uint32_t frameInUseCount,</div>
-<div class="line"><a name="l06491"></a><span class="lineno"> 6491</span>&#160;        VmaAllocationRequest* pAllocationRequest);</div>
-<div class="line"><a name="l06492"></a><span class="lineno"> 6492</span>&#160; </div>
-<div class="line"><a name="l06493"></a><span class="lineno"> 6493</span>&#160;    <span class="keyword">virtual</span> uint32_t MakeAllocationsLost(uint32_t currentFrameIndex, uint32_t frameInUseCount);</div>
-<div class="line"><a name="l06494"></a><span class="lineno"> 6494</span>&#160; </div>
-<div class="line"><a name="l06495"></a><span class="lineno"> 6495</span>&#160;    <span class="keyword">virtual</span> VkResult CheckCorruption(<span class="keyword">const</span> <span class="keywordtype">void</span>* pBlockData);</div>
-<div class="line"><a name="l06496"></a><span class="lineno"> 6496</span>&#160; </div>
-<div class="line"><a name="l06497"></a><span class="lineno"> 6497</span>&#160;    <span class="keyword">virtual</span> <span class="keywordtype">void</span> Alloc(</div>
-<div class="line"><a name="l06498"></a><span class="lineno"> 6498</span>&#160;        <span class="keyword">const</span> VmaAllocationRequest&amp; request,</div>
-<div class="line"><a name="l06499"></a><span class="lineno"> 6499</span>&#160;        VmaSuballocationType type,</div>
-<div class="line"><a name="l06500"></a><span class="lineno"> 6500</span>&#160;        VkDeviceSize allocSize,</div>
-<div class="line"><a name="l06501"></a><span class="lineno"> 6501</span>&#160;        <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> hAllocation);</div>
-<div class="line"><a name="l06502"></a><span class="lineno"> 6502</span>&#160; </div>
-<div class="line"><a name="l06503"></a><span class="lineno"> 6503</span>&#160;    <span class="keyword">virtual</span> <span class="keywordtype">void</span> Free(<span class="keyword">const</span> <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation);</div>
-<div class="line"><a name="l06504"></a><span class="lineno"> 6504</span>&#160;    <span class="keyword">virtual</span> <span class="keywordtype">void</span> FreeAtOffset(VkDeviceSize offset);</div>
+<div class="line"><a name="l06488"></a><span class="lineno"> 6488</span>&#160;    uint32_t GetLastUseFrameIndex()<span class="keyword"> const</span></div>
+<div class="line"><a name="l06489"></a><span class="lineno"> 6489</span>&#160;<span class="keyword">    </span>{</div>
+<div class="line"><a name="l06490"></a><span class="lineno"> 6490</span>&#160;        <span class="keywordflow">return</span> m_LastUseFrameIndex.load();</div>
+<div class="line"><a name="l06491"></a><span class="lineno"> 6491</span>&#160;    }</div>
+<div class="line"><a name="l06492"></a><span class="lineno"> 6492</span>&#160;    <span class="keywordtype">bool</span> CompareExchangeLastUseFrameIndex(uint32_t&amp; expected, uint32_t desired)</div>
+<div class="line"><a name="l06493"></a><span class="lineno"> 6493</span>&#160;    {</div>
+<div class="line"><a name="l06494"></a><span class="lineno"> 6494</span>&#160;        <span class="keywordflow">return</span> m_LastUseFrameIndex.compare_exchange_weak(expected, desired);</div>
+<div class="line"><a name="l06495"></a><span class="lineno"> 6495</span>&#160;    }</div>
+<div class="line"><a name="l06496"></a><span class="lineno"> 6496</span>&#160;    <span class="comment">/*</span></div>
+<div class="line"><a name="l06497"></a><span class="lineno"> 6497</span>&#160;<span class="comment">    - If hAllocation.LastUseFrameIndex + frameInUseCount &lt; allocator.CurrentFrameIndex,</span></div>
+<div class="line"><a name="l06498"></a><span class="lineno"> 6498</span>&#160;<span class="comment">      makes it lost by setting LastUseFrameIndex = VMA_FRAME_INDEX_LOST and returns true.</span></div>
+<div class="line"><a name="l06499"></a><span class="lineno"> 6499</span>&#160;<span class="comment">    - Else, returns false.</span></div>
+<div class="line"><a name="l06500"></a><span class="lineno"> 6500</span>&#160;<span class="comment"></span> </div>
+<div class="line"><a name="l06501"></a><span class="lineno"> 6501</span>&#160;<span class="comment">    If hAllocation is already lost, assert - you should not call it then.</span></div>
+<div class="line"><a name="l06502"></a><span class="lineno"> 6502</span>&#160;<span class="comment">    If hAllocation was not created with CAN_BECOME_LOST_BIT, assert.</span></div>
+<div class="line"><a name="l06503"></a><span class="lineno"> 6503</span>&#160;<span class="comment">    */</span></div>
+<div class="line"><a name="l06504"></a><span class="lineno"> 6504</span>&#160;    <span class="keywordtype">bool</span> MakeLost(uint32_t currentFrameIndex, uint32_t frameInUseCount);</div>
 <div class="line"><a name="l06505"></a><span class="lineno"> 6505</span>&#160; </div>
-<div class="line"><a name="l06506"></a><span class="lineno"> 6506</span>&#160;<span class="keyword">private</span>:</div>
-<div class="line"><a name="l06507"></a><span class="lineno"> 6507</span>&#160;    <span class="comment">/*</span></div>
-<div class="line"><a name="l06508"></a><span class="lineno"> 6508</span>&#160;<span class="comment">    There are two suballocation vectors, used in ping-pong way.</span></div>
-<div class="line"><a name="l06509"></a><span class="lineno"> 6509</span>&#160;<span class="comment">    The one with index m_1stVectorIndex is called 1st.</span></div>
-<div class="line"><a name="l06510"></a><span class="lineno"> 6510</span>&#160;<span class="comment">    The one with index (m_1stVectorIndex ^ 1) is called 2nd.</span></div>
-<div class="line"><a name="l06511"></a><span class="lineno"> 6511</span>&#160;<span class="comment">    2nd can be non-empty only when 1st is not empty.</span></div>
-<div class="line"><a name="l06512"></a><span class="lineno"> 6512</span>&#160;<span class="comment">    When 2nd is not empty, m_2ndVectorMode indicates its mode of operation.</span></div>
-<div class="line"><a name="l06513"></a><span class="lineno"> 6513</span>&#160;<span class="comment">    */</span></div>
-<div class="line"><a name="l06514"></a><span class="lineno"> 6514</span>&#160;    <span class="keyword">typedef</span> VmaVector&lt; VmaSuballocation, VmaStlAllocator&lt;VmaSuballocation&gt; &gt; SuballocationVectorType;</div>
-<div class="line"><a name="l06515"></a><span class="lineno"> 6515</span>&#160; </div>
-<div class="line"><a name="l06516"></a><span class="lineno"> 6516</span>&#160;    <span class="keyword">enum</span> SECOND_VECTOR_MODE</div>
-<div class="line"><a name="l06517"></a><span class="lineno"> 6517</span>&#160;    {</div>
-<div class="line"><a name="l06518"></a><span class="lineno"> 6518</span>&#160;        SECOND_VECTOR_EMPTY,</div>
-<div class="line"><a name="l06519"></a><span class="lineno"> 6519</span>&#160;        <span class="comment">/*</span></div>
-<div class="line"><a name="l06520"></a><span class="lineno"> 6520</span>&#160;<span class="comment">        Suballocations in 2nd vector are created later than the ones in 1st, but they</span></div>
-<div class="line"><a name="l06521"></a><span class="lineno"> 6521</span>&#160;<span class="comment">        all have smaller offset.</span></div>
-<div class="line"><a name="l06522"></a><span class="lineno"> 6522</span>&#160;<span class="comment">        */</span></div>
-<div class="line"><a name="l06523"></a><span class="lineno"> 6523</span>&#160;        SECOND_VECTOR_RING_BUFFER,</div>
-<div class="line"><a name="l06524"></a><span class="lineno"> 6524</span>&#160;        <span class="comment">/*</span></div>
-<div class="line"><a name="l06525"></a><span class="lineno"> 6525</span>&#160;<span class="comment">        Suballocations in 2nd vector are upper side of double stack.</span></div>
-<div class="line"><a name="l06526"></a><span class="lineno"> 6526</span>&#160;<span class="comment">        They all have offsets higher than those in 1st vector.</span></div>
-<div class="line"><a name="l06527"></a><span class="lineno"> 6527</span>&#160;<span class="comment">        Top of this stack means smaller offsets, but higher indices in this vector.</span></div>
-<div class="line"><a name="l06528"></a><span class="lineno"> 6528</span>&#160;<span class="comment">        */</span></div>
-<div class="line"><a name="l06529"></a><span class="lineno"> 6529</span>&#160;        SECOND_VECTOR_DOUBLE_STACK,</div>
-<div class="line"><a name="l06530"></a><span class="lineno"> 6530</span>&#160;    };</div>
-<div class="line"><a name="l06531"></a><span class="lineno"> 6531</span>&#160; </div>
-<div class="line"><a name="l06532"></a><span class="lineno"> 6532</span>&#160;    VkDeviceSize m_SumFreeSize;</div>
-<div class="line"><a name="l06533"></a><span class="lineno"> 6533</span>&#160;    SuballocationVectorType m_Suballocations0, m_Suballocations1;</div>
-<div class="line"><a name="l06534"></a><span class="lineno"> 6534</span>&#160;    uint32_t m_1stVectorIndex;</div>
-<div class="line"><a name="l06535"></a><span class="lineno"> 6535</span>&#160;    SECOND_VECTOR_MODE m_2ndVectorMode;</div>
+<div class="line"><a name="l06506"></a><span class="lineno"> 6506</span>&#160;    <span class="keywordtype">void</span> DedicatedAllocCalcStatsInfo(<a class="code" href="struct_vma_stat_info.html">VmaStatInfo</a>&amp; outInfo)</div>
+<div class="line"><a name="l06507"></a><span class="lineno"> 6507</span>&#160;    {</div>
+<div class="line"><a name="l06508"></a><span class="lineno"> 6508</span>&#160;        VMA_ASSERT(m_Type == ALLOCATION_TYPE_DEDICATED);</div>
+<div class="line"><a name="l06509"></a><span class="lineno"> 6509</span>&#160;        outInfo.<a class="code" href="struct_vma_stat_info.html#abc4bb7cd611900778464c56e50c970a4">blockCount</a> = 1;</div>
+<div class="line"><a name="l06510"></a><span class="lineno"> 6510</span>&#160;        outInfo.<a class="code" href="struct_vma_stat_info.html#a537741e4d5cdddc1c0ab95ec650afaff">allocationCount</a> = 1;</div>
+<div class="line"><a name="l06511"></a><span class="lineno"> 6511</span>&#160;        outInfo.<a class="code" href="struct_vma_stat_info.html#ae06129c771bfebfd6468a7f4276502a9">unusedRangeCount</a> = 0;</div>
+<div class="line"><a name="l06512"></a><span class="lineno"> 6512</span>&#160;        outInfo.<a class="code" href="struct_vma_stat_info.html#ab0c6c73837e5a70c749fbd4f6064895a">usedBytes</a> = m_Size;</div>
+<div class="line"><a name="l06513"></a><span class="lineno"> 6513</span>&#160;        outInfo.<a class="code" href="struct_vma_stat_info.html#a1859d290aca2cd582d8dc25922092669">unusedBytes</a> = 0;</div>
+<div class="line"><a name="l06514"></a><span class="lineno"> 6514</span>&#160;        outInfo.<a class="code" href="struct_vma_stat_info.html#ade8b40bd3139c04aabd2fc538a356fea">allocationSizeMin</a> = outInfo.<a class="code" href="struct_vma_stat_info.html#a17e9733a5ecd76287d4db6e66f71f50c">allocationSizeMax</a> = m_Size;</div>
+<div class="line"><a name="l06515"></a><span class="lineno"> 6515</span>&#160;        outInfo.<a class="code" href="struct_vma_stat_info.html#aedeba931324f16589cd2416c0d2dd0d4">unusedRangeSizeMin</a> = UINT64_MAX;</div>
+<div class="line"><a name="l06516"></a><span class="lineno"> 6516</span>&#160;        outInfo.<a class="code" href="struct_vma_stat_info.html#a5ba1a2476c4d39b10f7e2f7ebbb72ac4">unusedRangeSizeMax</a> = 0;</div>
+<div class="line"><a name="l06517"></a><span class="lineno"> 6517</span>&#160;    }</div>
+<div class="line"><a name="l06518"></a><span class="lineno"> 6518</span>&#160; </div>
+<div class="line"><a name="l06519"></a><span class="lineno"> 6519</span>&#160;    <span class="keywordtype">void</span> BlockAllocMap();</div>
+<div class="line"><a name="l06520"></a><span class="lineno"> 6520</span>&#160;    <span class="keywordtype">void</span> BlockAllocUnmap();</div>
+<div class="line"><a name="l06521"></a><span class="lineno"> 6521</span>&#160;    VkResult DedicatedAllocMap(<a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator, <span class="keywordtype">void</span>** ppData);</div>
+<div class="line"><a name="l06522"></a><span class="lineno"> 6522</span>&#160;    <span class="keywordtype">void</span> DedicatedAllocUnmap(<a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator);</div>
+<div class="line"><a name="l06523"></a><span class="lineno"> 6523</span>&#160; </div>
+<div class="line"><a name="l06524"></a><span class="lineno"> 6524</span>&#160;<span class="preprocessor">#if VMA_STATS_STRING_ENABLED</span></div>
+<div class="line"><a name="l06525"></a><span class="lineno"> 6525</span>&#160;    uint32_t GetCreationFrameIndex()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_CreationFrameIndex; }</div>
+<div class="line"><a name="l06526"></a><span class="lineno"> 6526</span>&#160;    uint32_t GetBufferImageUsage()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_BufferImageUsage; }</div>
+<div class="line"><a name="l06527"></a><span class="lineno"> 6527</span>&#160; </div>
+<div class="line"><a name="l06528"></a><span class="lineno"> 6528</span>&#160;    <span class="keywordtype">void</span> InitBufferImageUsage(uint32_t bufferImageUsage)</div>
+<div class="line"><a name="l06529"></a><span class="lineno"> 6529</span>&#160;    {</div>
+<div class="line"><a name="l06530"></a><span class="lineno"> 6530</span>&#160;        VMA_ASSERT(m_BufferImageUsage == 0);</div>
+<div class="line"><a name="l06531"></a><span class="lineno"> 6531</span>&#160;        m_BufferImageUsage = bufferImageUsage;</div>
+<div class="line"><a name="l06532"></a><span class="lineno"> 6532</span>&#160;    }</div>
+<div class="line"><a name="l06533"></a><span class="lineno"> 6533</span>&#160; </div>
+<div class="line"><a name="l06534"></a><span class="lineno"> 6534</span>&#160;    <span class="keywordtype">void</span> PrintParameters(<span class="keyword">class</span> VmaJsonWriter&amp; json) <span class="keyword">const</span>;</div>
+<div class="line"><a name="l06535"></a><span class="lineno"> 6535</span>&#160;<span class="preprocessor">#endif</span></div>
 <div class="line"><a name="l06536"></a><span class="lineno"> 6536</span>&#160; </div>
-<div class="line"><a name="l06537"></a><span class="lineno"> 6537</span>&#160;    SuballocationVectorType&amp; AccessSuballocations1st() { <span class="keywordflow">return</span> m_1stVectorIndex ? m_Suballocations1 : m_Suballocations0; }</div>
-<div class="line"><a name="l06538"></a><span class="lineno"> 6538</span>&#160;    SuballocationVectorType&amp; AccessSuballocations2nd() { <span class="keywordflow">return</span> m_1stVectorIndex ? m_Suballocations0 : m_Suballocations1; }</div>
-<div class="line"><a name="l06539"></a><span class="lineno"> 6539</span>&#160;    <span class="keyword">const</span> SuballocationVectorType&amp; AccessSuballocations1st()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_1stVectorIndex ? m_Suballocations1 : m_Suballocations0; }</div>
-<div class="line"><a name="l06540"></a><span class="lineno"> 6540</span>&#160;    <span class="keyword">const</span> SuballocationVectorType&amp; AccessSuballocations2nd()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_1stVectorIndex ? m_Suballocations0 : m_Suballocations1; }</div>
-<div class="line"><a name="l06541"></a><span class="lineno"> 6541</span>&#160;    </div>
-<div class="line"><a name="l06542"></a><span class="lineno"> 6542</span>&#160;    <span class="comment">// Number of items in 1st vector with hAllocation = null at the beginning.</span></div>
-<div class="line"><a name="l06543"></a><span class="lineno"> 6543</span>&#160;    <span class="keywordtype">size_t</span> m_1stNullItemsBeginCount;</div>
-<div class="line"><a name="l06544"></a><span class="lineno"> 6544</span>&#160;    <span class="comment">// Number of other items in 1st vector with hAllocation = null somewhere in the middle.</span></div>
-<div class="line"><a name="l06545"></a><span class="lineno"> 6545</span>&#160;    <span class="keywordtype">size_t</span> m_1stNullItemsMiddleCount;</div>
-<div class="line"><a name="l06546"></a><span class="lineno"> 6546</span>&#160;    <span class="comment">// Number of items in 2nd vector with hAllocation = null.</span></div>
-<div class="line"><a name="l06547"></a><span class="lineno"> 6547</span>&#160;    <span class="keywordtype">size_t</span> m_2ndNullItemsCount;</div>
-<div class="line"><a name="l06548"></a><span class="lineno"> 6548</span>&#160; </div>
-<div class="line"><a name="l06549"></a><span class="lineno"> 6549</span>&#160;    <span class="keywordtype">bool</span> ShouldCompact1st() <span class="keyword">const</span>;</div>
-<div class="line"><a name="l06550"></a><span class="lineno"> 6550</span>&#160;    <span class="keywordtype">void</span> CleanupAfterFree();</div>
-<div class="line"><a name="l06551"></a><span class="lineno"> 6551</span>&#160; </div>
-<div class="line"><a name="l06552"></a><span class="lineno"> 6552</span>&#160;    <span class="keywordtype">bool</span> CreateAllocationRequest_LowerAddress(</div>
-<div class="line"><a name="l06553"></a><span class="lineno"> 6553</span>&#160;        uint32_t currentFrameIndex,</div>
-<div class="line"><a name="l06554"></a><span class="lineno"> 6554</span>&#160;        uint32_t frameInUseCount,</div>
-<div class="line"><a name="l06555"></a><span class="lineno"> 6555</span>&#160;        VkDeviceSize bufferImageGranularity,</div>
-<div class="line"><a name="l06556"></a><span class="lineno"> 6556</span>&#160;        VkDeviceSize allocSize,</div>
-<div class="line"><a name="l06557"></a><span class="lineno"> 6557</span>&#160;        VkDeviceSize allocAlignment,</div>
-<div class="line"><a name="l06558"></a><span class="lineno"> 6558</span>&#160;        VmaSuballocationType allocType,</div>
-<div class="line"><a name="l06559"></a><span class="lineno"> 6559</span>&#160;        <span class="keywordtype">bool</span> canMakeOtherLost,</div>
-<div class="line"><a name="l06560"></a><span class="lineno"> 6560</span>&#160;        uint32_t strategy,</div>
-<div class="line"><a name="l06561"></a><span class="lineno"> 6561</span>&#160;        VmaAllocationRequest* pAllocationRequest);</div>
-<div class="line"><a name="l06562"></a><span class="lineno"> 6562</span>&#160;    <span class="keywordtype">bool</span> CreateAllocationRequest_UpperAddress(</div>
-<div class="line"><a name="l06563"></a><span class="lineno"> 6563</span>&#160;        uint32_t currentFrameIndex,</div>
-<div class="line"><a name="l06564"></a><span class="lineno"> 6564</span>&#160;        uint32_t frameInUseCount,</div>
-<div class="line"><a name="l06565"></a><span class="lineno"> 6565</span>&#160;        VkDeviceSize bufferImageGranularity,</div>
-<div class="line"><a name="l06566"></a><span class="lineno"> 6566</span>&#160;        VkDeviceSize allocSize,</div>
-<div class="line"><a name="l06567"></a><span class="lineno"> 6567</span>&#160;        VkDeviceSize allocAlignment,</div>
-<div class="line"><a name="l06568"></a><span class="lineno"> 6568</span>&#160;        VmaSuballocationType allocType,</div>
-<div class="line"><a name="l06569"></a><span class="lineno"> 6569</span>&#160;        <span class="keywordtype">bool</span> canMakeOtherLost,</div>
-<div class="line"><a name="l06570"></a><span class="lineno"> 6570</span>&#160;        uint32_t strategy,</div>
-<div class="line"><a name="l06571"></a><span class="lineno"> 6571</span>&#160;        VmaAllocationRequest* pAllocationRequest);</div>
-<div class="line"><a name="l06572"></a><span class="lineno"> 6572</span>&#160;};</div>
-<div class="line"><a name="l06573"></a><span class="lineno"> 6573</span>&#160; </div>
-<div class="line"><a name="l06574"></a><span class="lineno"> 6574</span>&#160;<span class="comment">/*</span></div>
-<div class="line"><a name="l06575"></a><span class="lineno"> 6575</span>&#160;<span class="comment">- GetSize() is the original size of allocated memory block.</span></div>
-<div class="line"><a name="l06576"></a><span class="lineno"> 6576</span>&#160;<span class="comment">- m_UsableSize is this size aligned down to a power of two.</span></div>
-<div class="line"><a name="l06577"></a><span class="lineno"> 6577</span>&#160;<span class="comment">  All allocations and calculations happen relative to m_UsableSize.</span></div>
-<div class="line"><a name="l06578"></a><span class="lineno"> 6578</span>&#160;<span class="comment">- GetUnusableSize() is the difference between them.</span></div>
-<div class="line"><a name="l06579"></a><span class="lineno"> 6579</span>&#160;<span class="comment">  It is repoted as separate, unused range, not available for allocations.</span></div>
-<div class="line"><a name="l06580"></a><span class="lineno"> 6580</span>&#160;<span class="comment"></span> </div>
-<div class="line"><a name="l06581"></a><span class="lineno"> 6581</span>&#160;<span class="comment">Node at level 0 has size = m_UsableSize.</span></div>
-<div class="line"><a name="l06582"></a><span class="lineno"> 6582</span>&#160;<span class="comment">Each next level contains nodes with size 2 times smaller than current level.</span></div>
-<div class="line"><a name="l06583"></a><span class="lineno"> 6583</span>&#160;<span class="comment">m_LevelCount is the maximum number of levels to use in the current object.</span></div>
-<div class="line"><a name="l06584"></a><span class="lineno"> 6584</span>&#160;<span class="comment">*/</span></div>
-<div class="line"><a name="l06585"></a><span class="lineno"> 6585</span>&#160;<span class="keyword">class </span>VmaBlockMetadata_Buddy : <span class="keyword">public</span> VmaBlockMetadata</div>
+<div class="line"><a name="l06537"></a><span class="lineno"> 6537</span>&#160;<span class="keyword">private</span>:</div>
+<div class="line"><a name="l06538"></a><span class="lineno"> 6538</span>&#160;    VkDeviceSize m_Alignment;</div>
+<div class="line"><a name="l06539"></a><span class="lineno"> 6539</span>&#160;    VkDeviceSize m_Size;</div>
+<div class="line"><a name="l06540"></a><span class="lineno"> 6540</span>&#160;    <span class="keywordtype">void</span>* m_pUserData;</div>
+<div class="line"><a name="l06541"></a><span class="lineno"> 6541</span>&#160;    VMA_ATOMIC_UINT32 m_LastUseFrameIndex;</div>
+<div class="line"><a name="l06542"></a><span class="lineno"> 6542</span>&#160;    uint32_t m_MemoryTypeIndex;</div>
+<div class="line"><a name="l06543"></a><span class="lineno"> 6543</span>&#160;    uint8_t m_Type; <span class="comment">// ALLOCATION_TYPE</span></div>
+<div class="line"><a name="l06544"></a><span class="lineno"> 6544</span>&#160;    uint8_t m_SuballocationType; <span class="comment">// VmaSuballocationType</span></div>
+<div class="line"><a name="l06545"></a><span class="lineno"> 6545</span>&#160;    <span class="comment">// Bit 0x80 is set when allocation was created with VMA_ALLOCATION_CREATE_MAPPED_BIT.</span></div>
+<div class="line"><a name="l06546"></a><span class="lineno"> 6546</span>&#160;    <span class="comment">// Bits with mask 0x7F are reference counter for vmaMapMemory()/vmaUnmapMemory().</span></div>
+<div class="line"><a name="l06547"></a><span class="lineno"> 6547</span>&#160;    uint8_t m_MapCount;</div>
+<div class="line"><a name="l06548"></a><span class="lineno"> 6548</span>&#160;    uint8_t m_Flags; <span class="comment">// enum FLAGS</span></div>
+<div class="line"><a name="l06549"></a><span class="lineno"> 6549</span>&#160; </div>
+<div class="line"><a name="l06550"></a><span class="lineno"> 6550</span>&#160;    <span class="comment">// Allocation out of VmaDeviceMemoryBlock.</span></div>
+<div class="line"><a name="l06551"></a><span class="lineno"> 6551</span>&#160;    <span class="keyword">struct </span>BlockAllocation</div>
+<div class="line"><a name="l06552"></a><span class="lineno"> 6552</span>&#160;    {</div>
+<div class="line"><a name="l06553"></a><span class="lineno"> 6553</span>&#160;        VmaDeviceMemoryBlock* m_Block;</div>
+<div class="line"><a name="l06554"></a><span class="lineno"> 6554</span>&#160;        VkDeviceSize m_Offset;</div>
+<div class="line"><a name="l06555"></a><span class="lineno"> 6555</span>&#160;        <span class="keywordtype">bool</span> m_CanBecomeLost;</div>
+<div class="line"><a name="l06556"></a><span class="lineno"> 6556</span>&#160;    };</div>
+<div class="line"><a name="l06557"></a><span class="lineno"> 6557</span>&#160; </div>
+<div class="line"><a name="l06558"></a><span class="lineno"> 6558</span>&#160;    <span class="comment">// Allocation for an object that has its own private VkDeviceMemory.</span></div>
+<div class="line"><a name="l06559"></a><span class="lineno"> 6559</span>&#160;    <span class="keyword">struct </span>DedicatedAllocation</div>
+<div class="line"><a name="l06560"></a><span class="lineno"> 6560</span>&#160;    {</div>
+<div class="line"><a name="l06561"></a><span class="lineno"> 6561</span>&#160;        VkDeviceMemory m_hMemory;</div>
+<div class="line"><a name="l06562"></a><span class="lineno"> 6562</span>&#160;        <span class="keywordtype">void</span>* m_pMappedData; <span class="comment">// Not null means memory is mapped.</span></div>
+<div class="line"><a name="l06563"></a><span class="lineno"> 6563</span>&#160;        VmaAllocation_T* m_Prev;</div>
+<div class="line"><a name="l06564"></a><span class="lineno"> 6564</span>&#160;        VmaAllocation_T* m_Next;</div>
+<div class="line"><a name="l06565"></a><span class="lineno"> 6565</span>&#160;    };</div>
+<div class="line"><a name="l06566"></a><span class="lineno"> 6566</span>&#160; </div>
+<div class="line"><a name="l06567"></a><span class="lineno"> 6567</span>&#160;    <span class="keyword">union</span></div>
+<div class="line"><a name="l06568"></a><span class="lineno"> 6568</span>&#160;    {</div>
+<div class="line"><a name="l06569"></a><span class="lineno"> 6569</span>&#160;        <span class="comment">// Allocation out of VmaDeviceMemoryBlock.</span></div>
+<div class="line"><a name="l06570"></a><span class="lineno"> 6570</span>&#160;        BlockAllocation m_BlockAllocation;</div>
+<div class="line"><a name="l06571"></a><span class="lineno"> 6571</span>&#160;        <span class="comment">// Allocation for an object that has its own private VkDeviceMemory.</span></div>
+<div class="line"><a name="l06572"></a><span class="lineno"> 6572</span>&#160;        DedicatedAllocation m_DedicatedAllocation;</div>
+<div class="line"><a name="l06573"></a><span class="lineno"> 6573</span>&#160;    };</div>
+<div class="line"><a name="l06574"></a><span class="lineno"> 6574</span>&#160; </div>
+<div class="line"><a name="l06575"></a><span class="lineno"> 6575</span>&#160;<span class="preprocessor">#if VMA_STATS_STRING_ENABLED</span></div>
+<div class="line"><a name="l06576"></a><span class="lineno"> 6576</span>&#160;    uint32_t m_CreationFrameIndex;</div>
+<div class="line"><a name="l06577"></a><span class="lineno"> 6577</span>&#160;    uint32_t m_BufferImageUsage; <span class="comment">// 0 if unknown.</span></div>
+<div class="line"><a name="l06578"></a><span class="lineno"> 6578</span>&#160;<span class="preprocessor">#endif</span></div>
+<div class="line"><a name="l06579"></a><span class="lineno"> 6579</span>&#160; </div>
+<div class="line"><a name="l06580"></a><span class="lineno"> 6580</span>&#160;    <span class="keywordtype">void</span> FreeUserDataString(<a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator);</div>
+<div class="line"><a name="l06581"></a><span class="lineno"> 6581</span>&#160; </div>
+<div class="line"><a name="l06582"></a><span class="lineno"> 6582</span>&#160;    <span class="keyword">friend</span> <span class="keyword">struct </span>VmaDedicatedAllocationListItemTraits;</div>
+<div class="line"><a name="l06583"></a><span class="lineno"> 6583</span>&#160;};</div>
+<div class="line"><a name="l06584"></a><span class="lineno"> 6584</span>&#160; </div>
+<div class="line"><a name="l06585"></a><span class="lineno"> 6585</span>&#160;<span class="keyword">struct </span>VmaDedicatedAllocationListItemTraits</div>
 <div class="line"><a name="l06586"></a><span class="lineno"> 6586</span>&#160;{</div>
-<div class="line"><a name="l06587"></a><span class="lineno"> 6587</span>&#160;    VMA_CLASS_NO_COPY(VmaBlockMetadata_Buddy)</div>
-<div class="line"><a name="l06588"></a><span class="lineno"> 6588</span>&#160;<span class="keyword">public</span>:</div>
-<div class="line"><a name="l06589"></a><span class="lineno"> 6589</span>&#160;    VmaBlockMetadata_Buddy(<a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator);</div>
-<div class="line"><a name="l06590"></a><span class="lineno"> 6590</span>&#160;    <span class="keyword">virtual</span> ~VmaBlockMetadata_Buddy();</div>
-<div class="line"><a name="l06591"></a><span class="lineno"> 6591</span>&#160;    <span class="keyword">virtual</span> <span class="keywordtype">void</span> Init(VkDeviceSize size);</div>
-<div class="line"><a name="l06592"></a><span class="lineno"> 6592</span>&#160; </div>
-<div class="line"><a name="l06593"></a><span class="lineno"> 6593</span>&#160;    <span class="keyword">virtual</span> <span class="keywordtype">bool</span> Validate() <span class="keyword">const</span>;</div>
-<div class="line"><a name="l06594"></a><span class="lineno"> 6594</span>&#160;    <span class="keyword">virtual</span> <span class="keywordtype">size_t</span> GetAllocationCount()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_AllocationCount; }</div>
-<div class="line"><a name="l06595"></a><span class="lineno"> 6595</span>&#160;    <span class="keyword">virtual</span> VkDeviceSize GetSumFreeSize()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_SumFreeSize + GetUnusableSize(); }</div>
-<div class="line"><a name="l06596"></a><span class="lineno"> 6596</span>&#160;    <span class="keyword">virtual</span> VkDeviceSize GetUnusedRangeSizeMax() <span class="keyword">const</span>;</div>
-<div class="line"><a name="l06597"></a><span class="lineno"> 6597</span>&#160;    <span class="keyword">virtual</span> <span class="keywordtype">bool</span> IsEmpty()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_Root-&gt;type == Node::TYPE_FREE; }</div>
-<div class="line"><a name="l06598"></a><span class="lineno"> 6598</span>&#160; </div>
-<div class="line"><a name="l06599"></a><span class="lineno"> 6599</span>&#160;    <span class="keyword">virtual</span> <span class="keywordtype">void</span> CalcAllocationStatInfo(<a class="code" href="struct_vma_stat_info.html">VmaStatInfo</a>&amp; outInfo) <span class="keyword">const</span>;</div>
-<div class="line"><a name="l06600"></a><span class="lineno"> 6600</span>&#160;    <span class="keyword">virtual</span> <span class="keywordtype">void</span> AddPoolStats(<a class="code" href="struct_vma_pool_stats.html">VmaPoolStats</a>&amp; inoutStats) <span class="keyword">const</span>;</div>
-<div class="line"><a name="l06601"></a><span class="lineno"> 6601</span>&#160; </div>
-<div class="line"><a name="l06602"></a><span class="lineno"> 6602</span>&#160;<span class="preprocessor">#if VMA_STATS_STRING_ENABLED</span></div>
-<div class="line"><a name="l06603"></a><span class="lineno"> 6603</span>&#160;    <span class="keyword">virtual</span> <span class="keywordtype">void</span> PrintDetailedMap(<span class="keyword">class</span> VmaJsonWriter&amp; json) <span class="keyword">const</span>;</div>
-<div class="line"><a name="l06604"></a><span class="lineno"> 6604</span>&#160;<span class="preprocessor">#endif</span></div>
-<div class="line"><a name="l06605"></a><span class="lineno"> 6605</span>&#160; </div>
-<div class="line"><a name="l06606"></a><span class="lineno"> 6606</span>&#160;    <span class="keyword">virtual</span> <span class="keywordtype">bool</span> CreateAllocationRequest(</div>
-<div class="line"><a name="l06607"></a><span class="lineno"> 6607</span>&#160;        uint32_t currentFrameIndex,</div>
-<div class="line"><a name="l06608"></a><span class="lineno"> 6608</span>&#160;        uint32_t frameInUseCount,</div>
-<div class="line"><a name="l06609"></a><span class="lineno"> 6609</span>&#160;        VkDeviceSize bufferImageGranularity,</div>
-<div class="line"><a name="l06610"></a><span class="lineno"> 6610</span>&#160;        VkDeviceSize allocSize,</div>
-<div class="line"><a name="l06611"></a><span class="lineno"> 6611</span>&#160;        VkDeviceSize allocAlignment,</div>
-<div class="line"><a name="l06612"></a><span class="lineno"> 6612</span>&#160;        <span class="keywordtype">bool</span> upperAddress,</div>
-<div class="line"><a name="l06613"></a><span class="lineno"> 6613</span>&#160;        VmaSuballocationType allocType,</div>
-<div class="line"><a name="l06614"></a><span class="lineno"> 6614</span>&#160;        <span class="keywordtype">bool</span> canMakeOtherLost,</div>
-<div class="line"><a name="l06615"></a><span class="lineno"> 6615</span>&#160;        uint32_t strategy,</div>
-<div class="line"><a name="l06616"></a><span class="lineno"> 6616</span>&#160;        VmaAllocationRequest* pAllocationRequest);</div>
-<div class="line"><a name="l06617"></a><span class="lineno"> 6617</span>&#160; </div>
-<div class="line"><a name="l06618"></a><span class="lineno"> 6618</span>&#160;    <span class="keyword">virtual</span> <span class="keywordtype">bool</span> MakeRequestedAllocationsLost(</div>
-<div class="line"><a name="l06619"></a><span class="lineno"> 6619</span>&#160;        uint32_t currentFrameIndex,</div>
-<div class="line"><a name="l06620"></a><span class="lineno"> 6620</span>&#160;        uint32_t frameInUseCount,</div>
-<div class="line"><a name="l06621"></a><span class="lineno"> 6621</span>&#160;        VmaAllocationRequest* pAllocationRequest);</div>
-<div class="line"><a name="l06622"></a><span class="lineno"> 6622</span>&#160; </div>
-<div class="line"><a name="l06623"></a><span class="lineno"> 6623</span>&#160;    <span class="keyword">virtual</span> uint32_t MakeAllocationsLost(uint32_t currentFrameIndex, uint32_t frameInUseCount);</div>
-<div class="line"><a name="l06624"></a><span class="lineno"> 6624</span>&#160; </div>
-<div class="line"><a name="l06625"></a><span class="lineno"> 6625</span>&#160;    <span class="keyword">virtual</span> VkResult CheckCorruption(<span class="keyword">const</span> <span class="keywordtype">void</span>* pBlockData) { <span class="keywordflow">return</span> VK_ERROR_FEATURE_NOT_PRESENT; }</div>
-<div class="line"><a name="l06626"></a><span class="lineno"> 6626</span>&#160; </div>
-<div class="line"><a name="l06627"></a><span class="lineno"> 6627</span>&#160;    <span class="keyword">virtual</span> <span class="keywordtype">void</span> Alloc(</div>
-<div class="line"><a name="l06628"></a><span class="lineno"> 6628</span>&#160;        <span class="keyword">const</span> VmaAllocationRequest&amp; request,</div>
-<div class="line"><a name="l06629"></a><span class="lineno"> 6629</span>&#160;        VmaSuballocationType type,</div>
-<div class="line"><a name="l06630"></a><span class="lineno"> 6630</span>&#160;        VkDeviceSize allocSize,</div>
-<div class="line"><a name="l06631"></a><span class="lineno"> 6631</span>&#160;        <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> hAllocation);</div>
-<div class="line"><a name="l06632"></a><span class="lineno"> 6632</span>&#160; </div>
-<div class="line"><a name="l06633"></a><span class="lineno"> 6633</span>&#160;    <span class="keyword">virtual</span> <span class="keywordtype">void</span> Free(<span class="keyword">const</span> <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation) { FreeAtOffset(allocation, allocation-&gt;GetOffset()); }</div>
-<div class="line"><a name="l06634"></a><span class="lineno"> 6634</span>&#160;    <span class="keyword">virtual</span> <span class="keywordtype">void</span> FreeAtOffset(VkDeviceSize offset) { FreeAtOffset(VMA_NULL, offset); }</div>
-<div class="line"><a name="l06635"></a><span class="lineno"> 6635</span>&#160; </div>
-<div class="line"><a name="l06636"></a><span class="lineno"> 6636</span>&#160;<span class="keyword">private</span>:</div>
-<div class="line"><a name="l06637"></a><span class="lineno"> 6637</span>&#160;    <span class="keyword">static</span> <span class="keyword">const</span> VkDeviceSize MIN_NODE_SIZE = 32;</div>
-<div class="line"><a name="l06638"></a><span class="lineno"> 6638</span>&#160;    <span class="keyword">static</span> <span class="keyword">const</span> <span class="keywordtype">size_t</span> MAX_LEVELS = 30;</div>
-<div class="line"><a name="l06639"></a><span class="lineno"> 6639</span>&#160; </div>
-<div class="line"><a name="l06640"></a><span class="lineno"> 6640</span>&#160;    <span class="keyword">struct </span>ValidationContext</div>
-<div class="line"><a name="l06641"></a><span class="lineno"> 6641</span>&#160;    {</div>
-<div class="line"><a name="l06642"></a><span class="lineno"> 6642</span>&#160;        <span class="keywordtype">size_t</span> calculatedAllocationCount;</div>
-<div class="line"><a name="l06643"></a><span class="lineno"> 6643</span>&#160;        <span class="keywordtype">size_t</span> calculatedFreeCount;</div>
-<div class="line"><a name="l06644"></a><span class="lineno"> 6644</span>&#160;        VkDeviceSize calculatedSumFreeSize;</div>
-<div class="line"><a name="l06645"></a><span class="lineno"> 6645</span>&#160; </div>
-<div class="line"><a name="l06646"></a><span class="lineno"> 6646</span>&#160;        ValidationContext() :</div>
-<div class="line"><a name="l06647"></a><span class="lineno"> 6647</span>&#160;            calculatedAllocationCount(0),</div>
-<div class="line"><a name="l06648"></a><span class="lineno"> 6648</span>&#160;            calculatedFreeCount(0),</div>
-<div class="line"><a name="l06649"></a><span class="lineno"> 6649</span>&#160;            calculatedSumFreeSize(0) { }</div>
-<div class="line"><a name="l06650"></a><span class="lineno"> 6650</span>&#160;    };</div>
-<div class="line"><a name="l06651"></a><span class="lineno"> 6651</span>&#160; </div>
-<div class="line"><a name="l06652"></a><span class="lineno"> 6652</span>&#160;    <span class="keyword">struct </span>Node</div>
-<div class="line"><a name="l06653"></a><span class="lineno"> 6653</span>&#160;    {</div>
-<div class="line"><a name="l06654"></a><span class="lineno"> 6654</span>&#160;        VkDeviceSize offset;</div>
-<div class="line"><a name="l06655"></a><span class="lineno"> 6655</span>&#160;        <span class="keyword">enum</span> TYPE</div>
-<div class="line"><a name="l06656"></a><span class="lineno"> 6656</span>&#160;        {</div>
-<div class="line"><a name="l06657"></a><span class="lineno"> 6657</span>&#160;            TYPE_FREE,</div>
-<div class="line"><a name="l06658"></a><span class="lineno"> 6658</span>&#160;            TYPE_ALLOCATION,</div>
-<div class="line"><a name="l06659"></a><span class="lineno"> 6659</span>&#160;            TYPE_SPLIT,</div>
-<div class="line"><a name="l06660"></a><span class="lineno"> 6660</span>&#160;            TYPE_COUNT</div>
-<div class="line"><a name="l06661"></a><span class="lineno"> 6661</span>&#160;        } type;</div>
-<div class="line"><a name="l06662"></a><span class="lineno"> 6662</span>&#160;        Node* parent;</div>
-<div class="line"><a name="l06663"></a><span class="lineno"> 6663</span>&#160;        Node* buddy;</div>
-<div class="line"><a name="l06664"></a><span class="lineno"> 6664</span>&#160; </div>
-<div class="line"><a name="l06665"></a><span class="lineno"> 6665</span>&#160;        <span class="keyword">union</span></div>
-<div class="line"><a name="l06666"></a><span class="lineno"> 6666</span>&#160;        {</div>
-<div class="line"><a name="l06667"></a><span class="lineno"> 6667</span>&#160;            <span class="keyword">struct</span></div>
-<div class="line"><a name="l06668"></a><span class="lineno"> 6668</span>&#160;            {</div>
-<div class="line"><a name="l06669"></a><span class="lineno"> 6669</span>&#160;                Node* prev;</div>
-<div class="line"><a name="l06670"></a><span class="lineno"> 6670</span>&#160;                Node* next;</div>
-<div class="line"><a name="l06671"></a><span class="lineno"> 6671</span>&#160;            } free;</div>
-<div class="line"><a name="l06672"></a><span class="lineno"> 6672</span>&#160;            <span class="keyword">struct</span></div>
-<div class="line"><a name="l06673"></a><span class="lineno"> 6673</span>&#160;            {</div>
-<div class="line"><a name="l06674"></a><span class="lineno"> 6674</span>&#160;                <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> alloc;</div>
-<div class="line"><a name="l06675"></a><span class="lineno"> 6675</span>&#160;            } allocation;</div>
-<div class="line"><a name="l06676"></a><span class="lineno"> 6676</span>&#160;            <span class="keyword">struct</span></div>
-<div class="line"><a name="l06677"></a><span class="lineno"> 6677</span>&#160;            {</div>
-<div class="line"><a name="l06678"></a><span class="lineno"> 6678</span>&#160;                Node* leftChild;</div>
-<div class="line"><a name="l06679"></a><span class="lineno"> 6679</span>&#160;            } split;</div>
-<div class="line"><a name="l06680"></a><span class="lineno"> 6680</span>&#160;        };</div>
-<div class="line"><a name="l06681"></a><span class="lineno"> 6681</span>&#160;    };</div>
-<div class="line"><a name="l06682"></a><span class="lineno"> 6682</span>&#160; </div>
-<div class="line"><a name="l06683"></a><span class="lineno"> 6683</span>&#160;    <span class="comment">// Size of the memory block aligned down to a power of two.</span></div>
-<div class="line"><a name="l06684"></a><span class="lineno"> 6684</span>&#160;    VkDeviceSize m_UsableSize;</div>
-<div class="line"><a name="l06685"></a><span class="lineno"> 6685</span>&#160;    uint32_t m_LevelCount;</div>
-<div class="line"><a name="l06686"></a><span class="lineno"> 6686</span>&#160; </div>
-<div class="line"><a name="l06687"></a><span class="lineno"> 6687</span>&#160;    Node* m_Root;</div>
-<div class="line"><a name="l06688"></a><span class="lineno"> 6688</span>&#160;    <span class="keyword">struct </span>{</div>
-<div class="line"><a name="l06689"></a><span class="lineno"> 6689</span>&#160;        Node* front;</div>
-<div class="line"><a name="l06690"></a><span class="lineno"> 6690</span>&#160;        Node* back;</div>
-<div class="line"><a name="l06691"></a><span class="lineno"> 6691</span>&#160;    } m_FreeList[MAX_LEVELS];</div>
-<div class="line"><a name="l06692"></a><span class="lineno"> 6692</span>&#160;    <span class="comment">// Number of nodes in the tree with type == TYPE_ALLOCATION.</span></div>
-<div class="line"><a name="l06693"></a><span class="lineno"> 6693</span>&#160;    <span class="keywordtype">size_t</span> m_AllocationCount;</div>
-<div class="line"><a name="l06694"></a><span class="lineno"> 6694</span>&#160;    <span class="comment">// Number of nodes in the tree with type == TYPE_FREE.</span></div>
-<div class="line"><a name="l06695"></a><span class="lineno"> 6695</span>&#160;    <span class="keywordtype">size_t</span> m_FreeCount;</div>
-<div class="line"><a name="l06696"></a><span class="lineno"> 6696</span>&#160;    <span class="comment">// This includes space wasted due to internal fragmentation. Doesn&#39;t include unusable size.</span></div>
-<div class="line"><a name="l06697"></a><span class="lineno"> 6697</span>&#160;    VkDeviceSize m_SumFreeSize;</div>
-<div class="line"><a name="l06698"></a><span class="lineno"> 6698</span>&#160; </div>
-<div class="line"><a name="l06699"></a><span class="lineno"> 6699</span>&#160;    VkDeviceSize GetUnusableSize()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> GetSize() - m_UsableSize; }</div>
-<div class="line"><a name="l06700"></a><span class="lineno"> 6700</span>&#160;    <span class="keywordtype">void</span> DeleteNode(Node* node);</div>
-<div class="line"><a name="l06701"></a><span class="lineno"> 6701</span>&#160;    <span class="keywordtype">bool</span> ValidateNode(ValidationContext&amp; ctx, <span class="keyword">const</span> Node* parent, <span class="keyword">const</span> Node* curr, uint32_t level, VkDeviceSize levelNodeSize) <span class="keyword">const</span>;</div>
-<div class="line"><a name="l06702"></a><span class="lineno"> 6702</span>&#160;    uint32_t AllocSizeToLevel(VkDeviceSize allocSize) <span class="keyword">const</span>;</div>
-<div class="line"><a name="l06703"></a><span class="lineno"> 6703</span>&#160;    <span class="keyword">inline</span> VkDeviceSize LevelToNodeSize(uint32_t level)<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_UsableSize &gt;&gt; level; }</div>
-<div class="line"><a name="l06704"></a><span class="lineno"> 6704</span>&#160;    <span class="comment">// Alloc passed just for validation. Can be null.</span></div>
-<div class="line"><a name="l06705"></a><span class="lineno"> 6705</span>&#160;    <span class="keywordtype">void</span> FreeAtOffset(<a class="code" href="struct_vma_allocation.html">VmaAllocation</a> alloc, VkDeviceSize offset);</div>
-<div class="line"><a name="l06706"></a><span class="lineno"> 6706</span>&#160;    <span class="keywordtype">void</span> CalcAllocationStatInfoNode(<a class="code" href="struct_vma_stat_info.html">VmaStatInfo</a>&amp; outInfo, <span class="keyword">const</span> Node* node, VkDeviceSize levelNodeSize) <span class="keyword">const</span>;</div>
-<div class="line"><a name="l06707"></a><span class="lineno"> 6707</span>&#160;    <span class="comment">// Adds node to the front of FreeList at given level.</span></div>
-<div class="line"><a name="l06708"></a><span class="lineno"> 6708</span>&#160;    <span class="comment">// node-&gt;type must be FREE.</span></div>
-<div class="line"><a name="l06709"></a><span class="lineno"> 6709</span>&#160;    <span class="comment">// node-&gt;free.prev, next can be undefined.</span></div>
-<div class="line"><a name="l06710"></a><span class="lineno"> 6710</span>&#160;    <span class="keywordtype">void</span> AddToFreeListFront(uint32_t level, Node* node);</div>
-<div class="line"><a name="l06711"></a><span class="lineno"> 6711</span>&#160;    <span class="comment">// Removes node from FreeList at given level.</span></div>
-<div class="line"><a name="l06712"></a><span class="lineno"> 6712</span>&#160;    <span class="comment">// node-&gt;type must be FREE.</span></div>
-<div class="line"><a name="l06713"></a><span class="lineno"> 6713</span>&#160;    <span class="comment">// node-&gt;free.prev, next stay untouched.</span></div>
-<div class="line"><a name="l06714"></a><span class="lineno"> 6714</span>&#160;    <span class="keywordtype">void</span> RemoveFromFreeList(uint32_t level, Node* node);</div>
-<div class="line"><a name="l06715"></a><span class="lineno"> 6715</span>&#160; </div>
-<div class="line"><a name="l06716"></a><span class="lineno"> 6716</span>&#160;<span class="preprocessor">#if VMA_STATS_STRING_ENABLED</span></div>
-<div class="line"><a name="l06717"></a><span class="lineno"> 6717</span>&#160;    <span class="keywordtype">void</span> PrintDetailedMapNode(<span class="keyword">class</span> VmaJsonWriter&amp; json, <span class="keyword">const</span> Node* node, VkDeviceSize levelNodeSize) <span class="keyword">const</span>;</div>
-<div class="line"><a name="l06718"></a><span class="lineno"> 6718</span>&#160;<span class="preprocessor">#endif</span></div>
-<div class="line"><a name="l06719"></a><span class="lineno"> 6719</span>&#160;};</div>
-<div class="line"><a name="l06720"></a><span class="lineno"> 6720</span>&#160; </div>
-<div class="line"><a name="l06721"></a><span class="lineno"> 6721</span>&#160;<span class="comment">/*</span></div>
-<div class="line"><a name="l06722"></a><span class="lineno"> 6722</span>&#160;<span class="comment">Represents a single block of device memory (`VkDeviceMemory`) with all the</span></div>
-<div class="line"><a name="l06723"></a><span class="lineno"> 6723</span>&#160;<span class="comment">data about its regions (aka suballocations, #VmaAllocation), assigned and free.</span></div>
-<div class="line"><a name="l06724"></a><span class="lineno"> 6724</span>&#160;<span class="comment"></span> </div>
-<div class="line"><a name="l06725"></a><span class="lineno"> 6725</span>&#160;<span class="comment">Thread-safety: This class must be externally synchronized.</span></div>
-<div class="line"><a name="l06726"></a><span class="lineno"> 6726</span>&#160;<span class="comment">*/</span></div>
-<div class="line"><a name="l06727"></a><span class="lineno"> 6727</span>&#160;<span class="keyword">class </span>VmaDeviceMemoryBlock</div>
-<div class="line"><a name="l06728"></a><span class="lineno"> 6728</span>&#160;{</div>
-<div class="line"><a name="l06729"></a><span class="lineno"> 6729</span>&#160;    VMA_CLASS_NO_COPY(VmaDeviceMemoryBlock)</div>
-<div class="line"><a name="l06730"></a><span class="lineno"> 6730</span>&#160;<span class="keyword">public</span>:</div>
-<div class="line"><a name="l06731"></a><span class="lineno"> 6731</span>&#160;    VmaBlockMetadata* m_pMetadata;</div>
+<div class="line"><a name="l06587"></a><span class="lineno"> 6587</span>&#160;    <span class="keyword">typedef</span> VmaAllocation_T ItemType;</div>
+<div class="line"><a name="l06588"></a><span class="lineno"> 6588</span>&#160;    <span class="keyword">static</span> ItemType* GetPrev(<span class="keyword">const</span> ItemType* item)</div>
+<div class="line"><a name="l06589"></a><span class="lineno"> 6589</span>&#160;    {</div>
+<div class="line"><a name="l06590"></a><span class="lineno"> 6590</span>&#160;        VMA_HEAVY_ASSERT(item-&gt;GetType() == VmaAllocation_T::ALLOCATION_TYPE_DEDICATED);</div>
+<div class="line"><a name="l06591"></a><span class="lineno"> 6591</span>&#160;        <span class="keywordflow">return</span> item-&gt;m_DedicatedAllocation.m_Prev;</div>
+<div class="line"><a name="l06592"></a><span class="lineno"> 6592</span>&#160;    }</div>
+<div class="line"><a name="l06593"></a><span class="lineno"> 6593</span>&#160;    <span class="keyword">static</span> ItemType* GetNext(<span class="keyword">const</span> ItemType* item)</div>
+<div class="line"><a name="l06594"></a><span class="lineno"> 6594</span>&#160;    {</div>
+<div class="line"><a name="l06595"></a><span class="lineno"> 6595</span>&#160;        VMA_HEAVY_ASSERT(item-&gt;GetType() == VmaAllocation_T::ALLOCATION_TYPE_DEDICATED);</div>
+<div class="line"><a name="l06596"></a><span class="lineno"> 6596</span>&#160;        <span class="keywordflow">return</span> item-&gt;m_DedicatedAllocation.m_Next;</div>
+<div class="line"><a name="l06597"></a><span class="lineno"> 6597</span>&#160;    }</div>
+<div class="line"><a name="l06598"></a><span class="lineno"> 6598</span>&#160;    <span class="keyword">static</span> ItemType*&amp; AccessPrev(ItemType* item)</div>
+<div class="line"><a name="l06599"></a><span class="lineno"> 6599</span>&#160;    {</div>
+<div class="line"><a name="l06600"></a><span class="lineno"> 6600</span>&#160;        VMA_HEAVY_ASSERT(item-&gt;GetType() == VmaAllocation_T::ALLOCATION_TYPE_DEDICATED);</div>
+<div class="line"><a name="l06601"></a><span class="lineno"> 6601</span>&#160;        <span class="keywordflow">return</span> item-&gt;m_DedicatedAllocation.m_Prev;</div>
+<div class="line"><a name="l06602"></a><span class="lineno"> 6602</span>&#160;    }</div>
+<div class="line"><a name="l06603"></a><span class="lineno"> 6603</span>&#160;    <span class="keyword">static</span> ItemType*&amp; AccessNext(ItemType* item){</div>
+<div class="line"><a name="l06604"></a><span class="lineno"> 6604</span>&#160;        VMA_HEAVY_ASSERT(item-&gt;GetType() == VmaAllocation_T::ALLOCATION_TYPE_DEDICATED);</div>
+<div class="line"><a name="l06605"></a><span class="lineno"> 6605</span>&#160;        <span class="keywordflow">return</span> item-&gt;m_DedicatedAllocation.m_Next;</div>
+<div class="line"><a name="l06606"></a><span class="lineno"> 6606</span>&#160;    }</div>
+<div class="line"><a name="l06607"></a><span class="lineno"> 6607</span>&#160;};</div>
+<div class="line"><a name="l06608"></a><span class="lineno"> 6608</span>&#160; </div>
+<div class="line"><a name="l06609"></a><span class="lineno"> 6609</span>&#160;<span class="comment">/*</span></div>
+<div class="line"><a name="l06610"></a><span class="lineno"> 6610</span>&#160;<span class="comment">Represents a region of VmaDeviceMemoryBlock that is either assigned and returned as</span></div>
+<div class="line"><a name="l06611"></a><span class="lineno"> 6611</span>&#160;<span class="comment">allocated memory block or free.</span></div>
+<div class="line"><a name="l06612"></a><span class="lineno"> 6612</span>&#160;<span class="comment">*/</span></div>
+<div class="line"><a name="l06613"></a><span class="lineno"> 6613</span>&#160;<span class="keyword">struct </span>VmaSuballocation</div>
+<div class="line"><a name="l06614"></a><span class="lineno"> 6614</span>&#160;{</div>
+<div class="line"><a name="l06615"></a><span class="lineno"> 6615</span>&#160;    VkDeviceSize offset;</div>
+<div class="line"><a name="l06616"></a><span class="lineno"> 6616</span>&#160;    VkDeviceSize size;</div>
+<div class="line"><a name="l06617"></a><span class="lineno"> 6617</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> hAllocation;</div>
+<div class="line"><a name="l06618"></a><span class="lineno"> 6618</span>&#160;    VmaSuballocationType type;</div>
+<div class="line"><a name="l06619"></a><span class="lineno"> 6619</span>&#160;};</div>
+<div class="line"><a name="l06620"></a><span class="lineno"> 6620</span>&#160; </div>
+<div class="line"><a name="l06621"></a><span class="lineno"> 6621</span>&#160;<span class="comment">// Comparator for offsets.</span></div>
+<div class="line"><a name="l06622"></a><span class="lineno"> 6622</span>&#160;<span class="keyword">struct </span>VmaSuballocationOffsetLess</div>
+<div class="line"><a name="l06623"></a><span class="lineno"> 6623</span>&#160;{</div>
+<div class="line"><a name="l06624"></a><span class="lineno"> 6624</span>&#160;    <span class="keywordtype">bool</span> operator()(<span class="keyword">const</span> VmaSuballocation&amp; lhs, <span class="keyword">const</span> VmaSuballocation&amp; rhs)<span class="keyword"> const</span></div>
+<div class="line"><a name="l06625"></a><span class="lineno"> 6625</span>&#160;<span class="keyword">    </span>{</div>
+<div class="line"><a name="l06626"></a><span class="lineno"> 6626</span>&#160;        <span class="keywordflow">return</span> lhs.offset &lt; rhs.offset;</div>
+<div class="line"><a name="l06627"></a><span class="lineno"> 6627</span>&#160;    }</div>
+<div class="line"><a name="l06628"></a><span class="lineno"> 6628</span>&#160;};</div>
+<div class="line"><a name="l06629"></a><span class="lineno"> 6629</span>&#160;<span class="keyword">struct </span>VmaSuballocationOffsetGreater</div>
+<div class="line"><a name="l06630"></a><span class="lineno"> 6630</span>&#160;{</div>
+<div class="line"><a name="l06631"></a><span class="lineno"> 6631</span>&#160;    <span class="keywordtype">bool</span> operator()(<span class="keyword">const</span> VmaSuballocation&amp; lhs, <span class="keyword">const</span> VmaSuballocation&amp; rhs)<span class="keyword"> const</span></div>
+<div class="line"><a name="l06632"></a><span class="lineno"> 6632</span>&#160;<span class="keyword">    </span>{</div>
+<div class="line"><a name="l06633"></a><span class="lineno"> 6633</span>&#160;        <span class="keywordflow">return</span> lhs.offset &gt; rhs.offset;</div>
+<div class="line"><a name="l06634"></a><span class="lineno"> 6634</span>&#160;    }</div>
+<div class="line"><a name="l06635"></a><span class="lineno"> 6635</span>&#160;};</div>
+<div class="line"><a name="l06636"></a><span class="lineno"> 6636</span>&#160; </div>
+<div class="line"><a name="l06637"></a><span class="lineno"> 6637</span>&#160;<span class="keyword">typedef</span> VmaList&lt; VmaSuballocation, VmaStlAllocator&lt;VmaSuballocation&gt; &gt; VmaSuballocationList;</div>
+<div class="line"><a name="l06638"></a><span class="lineno"> 6638</span>&#160; </div>
+<div class="line"><a name="l06639"></a><span class="lineno"> 6639</span>&#160;<span class="comment">// Cost of one additional allocation lost, as equivalent in bytes.</span></div>
+<div class="line"><a name="l06640"></a><span class="lineno"> 6640</span>&#160;<span class="keyword">static</span> <span class="keyword">const</span> VkDeviceSize VMA_LOST_ALLOCATION_COST = 1048576;</div>
+<div class="line"><a name="l06641"></a><span class="lineno"> 6641</span>&#160; </div>
+<div class="line"><a name="l06642"></a><span class="lineno"> 6642</span>&#160;<span class="keyword">enum class</span> VmaAllocationRequestType</div>
+<div class="line"><a name="l06643"></a><span class="lineno"> 6643</span>&#160;{</div>
+<div class="line"><a name="l06644"></a><span class="lineno"> 6644</span>&#160;    Normal,</div>
+<div class="line"><a name="l06645"></a><span class="lineno"> 6645</span>&#160;    <span class="comment">// Used by &quot;Linear&quot; algorithm.</span></div>
+<div class="line"><a name="l06646"></a><span class="lineno"> 6646</span>&#160;    UpperAddress,</div>
+<div class="line"><a name="l06647"></a><span class="lineno"> 6647</span>&#160;    EndOf1st,</div>
+<div class="line"><a name="l06648"></a><span class="lineno"> 6648</span>&#160;    EndOf2nd,</div>
+<div class="line"><a name="l06649"></a><span class="lineno"> 6649</span>&#160;};</div>
+<div class="line"><a name="l06650"></a><span class="lineno"> 6650</span>&#160; </div>
+<div class="line"><a name="l06651"></a><span class="lineno"> 6651</span>&#160;<span class="comment">/*</span></div>
+<div class="line"><a name="l06652"></a><span class="lineno"> 6652</span>&#160;<span class="comment">Parameters of planned allocation inside a VmaDeviceMemoryBlock.</span></div>
+<div class="line"><a name="l06653"></a><span class="lineno"> 6653</span>&#160;<span class="comment"></span> </div>
+<div class="line"><a name="l06654"></a><span class="lineno"> 6654</span>&#160;<span class="comment">If canMakeOtherLost was false:</span></div>
+<div class="line"><a name="l06655"></a><span class="lineno"> 6655</span>&#160;<span class="comment">- item points to a FREE suballocation.</span></div>
+<div class="line"><a name="l06656"></a><span class="lineno"> 6656</span>&#160;<span class="comment">- itemsToMakeLostCount is 0.</span></div>
+<div class="line"><a name="l06657"></a><span class="lineno"> 6657</span>&#160;<span class="comment"></span> </div>
+<div class="line"><a name="l06658"></a><span class="lineno"> 6658</span>&#160;<span class="comment">If canMakeOtherLost was true:</span></div>
+<div class="line"><a name="l06659"></a><span class="lineno"> 6659</span>&#160;<span class="comment">- item points to first of sequence of suballocations, which are either FREE,</span></div>
+<div class="line"><a name="l06660"></a><span class="lineno"> 6660</span>&#160;<span class="comment">  or point to VmaAllocations that can become lost.</span></div>
+<div class="line"><a name="l06661"></a><span class="lineno"> 6661</span>&#160;<span class="comment">- itemsToMakeLostCount is the number of VmaAllocations that need to be made lost for</span></div>
+<div class="line"><a name="l06662"></a><span class="lineno"> 6662</span>&#160;<span class="comment">  the requested allocation to succeed.</span></div>
+<div class="line"><a name="l06663"></a><span class="lineno"> 6663</span>&#160;<span class="comment">*/</span></div>
+<div class="line"><a name="l06664"></a><span class="lineno"> 6664</span>&#160;<span class="keyword">struct </span>VmaAllocationRequest</div>
+<div class="line"><a name="l06665"></a><span class="lineno"> 6665</span>&#160;{</div>
+<div class="line"><a name="l06666"></a><span class="lineno"> 6666</span>&#160;    VkDeviceSize offset;</div>
+<div class="line"><a name="l06667"></a><span class="lineno"> 6667</span>&#160;    VkDeviceSize sumFreeSize; <span class="comment">// Sum size of free items that overlap with proposed allocation.</span></div>
+<div class="line"><a name="l06668"></a><span class="lineno"> 6668</span>&#160;    VkDeviceSize sumItemSize; <span class="comment">// Sum size of items to make lost that overlap with proposed allocation.</span></div>
+<div class="line"><a name="l06669"></a><span class="lineno"> 6669</span>&#160;    VmaSuballocationList::iterator item;</div>
+<div class="line"><a name="l06670"></a><span class="lineno"> 6670</span>&#160;    <span class="keywordtype">size_t</span> itemsToMakeLostCount;</div>
+<div class="line"><a name="l06671"></a><span class="lineno"> 6671</span>&#160;    <span class="keywordtype">void</span>* customData;</div>
+<div class="line"><a name="l06672"></a><span class="lineno"> 6672</span>&#160;    VmaAllocationRequestType type;</div>
+<div class="line"><a name="l06673"></a><span class="lineno"> 6673</span>&#160; </div>
+<div class="line"><a name="l06674"></a><span class="lineno"> 6674</span>&#160;    VkDeviceSize CalcCost()<span class="keyword"> const</span></div>
+<div class="line"><a name="l06675"></a><span class="lineno"> 6675</span>&#160;<span class="keyword">    </span>{</div>
+<div class="line"><a name="l06676"></a><span class="lineno"> 6676</span>&#160;        <span class="keywordflow">return</span> sumItemSize + itemsToMakeLostCount * VMA_LOST_ALLOCATION_COST;</div>
+<div class="line"><a name="l06677"></a><span class="lineno"> 6677</span>&#160;    }</div>
+<div class="line"><a name="l06678"></a><span class="lineno"> 6678</span>&#160;};</div>
+<div class="line"><a name="l06679"></a><span class="lineno"> 6679</span>&#160; </div>
+<div class="line"><a name="l06680"></a><span class="lineno"> 6680</span>&#160;<span class="comment">/*</span></div>
+<div class="line"><a name="l06681"></a><span class="lineno"> 6681</span>&#160;<span class="comment">Data structure used for bookkeeping of allocations and unused ranges of memory</span></div>
+<div class="line"><a name="l06682"></a><span class="lineno"> 6682</span>&#160;<span class="comment">in a single VkDeviceMemory block.</span></div>
+<div class="line"><a name="l06683"></a><span class="lineno"> 6683</span>&#160;<span class="comment">*/</span></div>
+<div class="line"><a name="l06684"></a><span class="lineno"> 6684</span>&#160;<span class="keyword">class </span>VmaBlockMetadata</div>
+<div class="line"><a name="l06685"></a><span class="lineno"> 6685</span>&#160;{</div>
+<div class="line"><a name="l06686"></a><span class="lineno"> 6686</span>&#160;<span class="keyword">public</span>:</div>
+<div class="line"><a name="l06687"></a><span class="lineno"> 6687</span>&#160;    VmaBlockMetadata(<a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator);</div>
+<div class="line"><a name="l06688"></a><span class="lineno"> 6688</span>&#160;    <span class="keyword">virtual</span> ~VmaBlockMetadata() { }</div>
+<div class="line"><a name="l06689"></a><span class="lineno"> 6689</span>&#160;    <span class="keyword">virtual</span> <span class="keywordtype">void</span> Init(VkDeviceSize size) { m_Size = size; }</div>
+<div class="line"><a name="l06690"></a><span class="lineno"> 6690</span>&#160; </div>
+<div class="line"><a name="l06691"></a><span class="lineno"> 6691</span>&#160;    <span class="comment">// Validates all data structures inside this object. If not valid, returns false.</span></div>
+<div class="line"><a name="l06692"></a><span class="lineno"> 6692</span>&#160;    <span class="keyword">virtual</span> <span class="keywordtype">bool</span> Validate() <span class="keyword">const</span> = 0;</div>
+<div class="line"><a name="l06693"></a><span class="lineno"> 6693</span>&#160;    VkDeviceSize GetSize()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_Size; }</div>
+<div class="line"><a name="l06694"></a><span class="lineno"> 6694</span>&#160;    <span class="keyword">virtual</span> <span class="keywordtype">size_t</span> GetAllocationCount() <span class="keyword">const</span> = 0;</div>
+<div class="line"><a name="l06695"></a><span class="lineno"> 6695</span>&#160;    <span class="keyword">virtual</span> VkDeviceSize GetSumFreeSize() <span class="keyword">const</span> = 0;</div>
+<div class="line"><a name="l06696"></a><span class="lineno"> 6696</span>&#160;    <span class="keyword">virtual</span> VkDeviceSize GetUnusedRangeSizeMax() <span class="keyword">const</span> = 0;</div>
+<div class="line"><a name="l06697"></a><span class="lineno"> 6697</span>&#160;    <span class="comment">// Returns true if this block is empty - contains only single free suballocation.</span></div>
+<div class="line"><a name="l06698"></a><span class="lineno"> 6698</span>&#160;    <span class="keyword">virtual</span> <span class="keywordtype">bool</span> IsEmpty() <span class="keyword">const</span> = 0;</div>
+<div class="line"><a name="l06699"></a><span class="lineno"> 6699</span>&#160; </div>
+<div class="line"><a name="l06700"></a><span class="lineno"> 6700</span>&#160;    <span class="keyword">virtual</span> <span class="keywordtype">void</span> CalcAllocationStatInfo(<a class="code" href="struct_vma_stat_info.html">VmaStatInfo</a>&amp; outInfo) <span class="keyword">const</span> = 0;</div>
+<div class="line"><a name="l06701"></a><span class="lineno"> 6701</span>&#160;    <span class="comment">// Shouldn&#39;t modify blockCount.</span></div>
+<div class="line"><a name="l06702"></a><span class="lineno"> 6702</span>&#160;    <span class="keyword">virtual</span> <span class="keywordtype">void</span> AddPoolStats(<a class="code" href="struct_vma_pool_stats.html">VmaPoolStats</a>&amp; inoutStats) <span class="keyword">const</span> = 0;</div>
+<div class="line"><a name="l06703"></a><span class="lineno"> 6703</span>&#160; </div>
+<div class="line"><a name="l06704"></a><span class="lineno"> 6704</span>&#160;<span class="preprocessor">#if VMA_STATS_STRING_ENABLED</span></div>
+<div class="line"><a name="l06705"></a><span class="lineno"> 6705</span>&#160;    <span class="keyword">virtual</span> <span class="keywordtype">void</span> PrintDetailedMap(<span class="keyword">class</span> VmaJsonWriter&amp; json) <span class="keyword">const</span> = 0;</div>
+<div class="line"><a name="l06706"></a><span class="lineno"> 6706</span>&#160;<span class="preprocessor">#endif</span></div>
+<div class="line"><a name="l06707"></a><span class="lineno"> 6707</span>&#160; </div>
+<div class="line"><a name="l06708"></a><span class="lineno"> 6708</span>&#160;    <span class="comment">// Tries to find a place for suballocation with given parameters inside this block.</span></div>
+<div class="line"><a name="l06709"></a><span class="lineno"> 6709</span>&#160;    <span class="comment">// If succeeded, fills pAllocationRequest and returns true.</span></div>
+<div class="line"><a name="l06710"></a><span class="lineno"> 6710</span>&#160;    <span class="comment">// If failed, returns false.</span></div>
+<div class="line"><a name="l06711"></a><span class="lineno"> 6711</span>&#160;    <span class="keyword">virtual</span> <span class="keywordtype">bool</span> CreateAllocationRequest(</div>
+<div class="line"><a name="l06712"></a><span class="lineno"> 6712</span>&#160;        uint32_t currentFrameIndex,</div>
+<div class="line"><a name="l06713"></a><span class="lineno"> 6713</span>&#160;        uint32_t frameInUseCount,</div>
+<div class="line"><a name="l06714"></a><span class="lineno"> 6714</span>&#160;        VkDeviceSize bufferImageGranularity,</div>
+<div class="line"><a name="l06715"></a><span class="lineno"> 6715</span>&#160;        VkDeviceSize allocSize,</div>
+<div class="line"><a name="l06716"></a><span class="lineno"> 6716</span>&#160;        VkDeviceSize allocAlignment,</div>
+<div class="line"><a name="l06717"></a><span class="lineno"> 6717</span>&#160;        <span class="keywordtype">bool</span> upperAddress,</div>
+<div class="line"><a name="l06718"></a><span class="lineno"> 6718</span>&#160;        VmaSuballocationType allocType,</div>
+<div class="line"><a name="l06719"></a><span class="lineno"> 6719</span>&#160;        <span class="keywordtype">bool</span> canMakeOtherLost,</div>
+<div class="line"><a name="l06720"></a><span class="lineno"> 6720</span>&#160;        <span class="comment">// Always one of VMA_ALLOCATION_CREATE_STRATEGY_* or VMA_ALLOCATION_INTERNAL_STRATEGY_* flags.</span></div>
+<div class="line"><a name="l06721"></a><span class="lineno"> 6721</span>&#160;        uint32_t strategy,</div>
+<div class="line"><a name="l06722"></a><span class="lineno"> 6722</span>&#160;        VmaAllocationRequest* pAllocationRequest) = 0;</div>
+<div class="line"><a name="l06723"></a><span class="lineno"> 6723</span>&#160; </div>
+<div class="line"><a name="l06724"></a><span class="lineno"> 6724</span>&#160;    <span class="keyword">virtual</span> <span class="keywordtype">bool</span> MakeRequestedAllocationsLost(</div>
+<div class="line"><a name="l06725"></a><span class="lineno"> 6725</span>&#160;        uint32_t currentFrameIndex,</div>
+<div class="line"><a name="l06726"></a><span class="lineno"> 6726</span>&#160;        uint32_t frameInUseCount,</div>
+<div class="line"><a name="l06727"></a><span class="lineno"> 6727</span>&#160;        VmaAllocationRequest* pAllocationRequest) = 0;</div>
+<div class="line"><a name="l06728"></a><span class="lineno"> 6728</span>&#160; </div>
+<div class="line"><a name="l06729"></a><span class="lineno"> 6729</span>&#160;    <span class="keyword">virtual</span> uint32_t MakeAllocationsLost(uint32_t currentFrameIndex, uint32_t frameInUseCount) = 0;</div>
+<div class="line"><a name="l06730"></a><span class="lineno"> 6730</span>&#160; </div>
+<div class="line"><a name="l06731"></a><span class="lineno"> 6731</span>&#160;    <span class="keyword">virtual</span> VkResult CheckCorruption(<span class="keyword">const</span> <span class="keywordtype">void</span>* pBlockData) = 0;</div>
 <div class="line"><a name="l06732"></a><span class="lineno"> 6732</span>&#160; </div>
-<div class="line"><a name="l06733"></a><span class="lineno"> 6733</span>&#160;    VmaDeviceMemoryBlock(<a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator);</div>
-<div class="line"><a name="l06734"></a><span class="lineno"> 6734</span>&#160; </div>
-<div class="line"><a name="l06735"></a><span class="lineno"> 6735</span>&#160;    ~VmaDeviceMemoryBlock()</div>
-<div class="line"><a name="l06736"></a><span class="lineno"> 6736</span>&#160;    {</div>
-<div class="line"><a name="l06737"></a><span class="lineno"> 6737</span>&#160;        VMA_ASSERT(m_MapCount == 0 &amp;&amp; <span class="stringliteral">&quot;VkDeviceMemory block is being destroyed while it is still mapped.&quot;</span>);</div>
-<div class="line"><a name="l06738"></a><span class="lineno"> 6738</span>&#160;        VMA_ASSERT(m_hMemory == VK_NULL_HANDLE);</div>
-<div class="line"><a name="l06739"></a><span class="lineno"> 6739</span>&#160;    }</div>
-<div class="line"><a name="l06740"></a><span class="lineno"> 6740</span>&#160; </div>
-<div class="line"><a name="l06741"></a><span class="lineno"> 6741</span>&#160;    <span class="comment">// Always call after construction.</span></div>
-<div class="line"><a name="l06742"></a><span class="lineno"> 6742</span>&#160;    <span class="keywordtype">void</span> Init(</div>
-<div class="line"><a name="l06743"></a><span class="lineno"> 6743</span>&#160;        <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator,</div>
-<div class="line"><a name="l06744"></a><span class="lineno"> 6744</span>&#160;        <a class="code" href="struct_vma_pool.html">VmaPool</a> hParentPool,</div>
-<div class="line"><a name="l06745"></a><span class="lineno"> 6745</span>&#160;        uint32_t newMemoryTypeIndex,</div>
-<div class="line"><a name="l06746"></a><span class="lineno"> 6746</span>&#160;        VkDeviceMemory newMemory,</div>
-<div class="line"><a name="l06747"></a><span class="lineno"> 6747</span>&#160;        VkDeviceSize newSize,</div>
-<div class="line"><a name="l06748"></a><span class="lineno"> 6748</span>&#160;        uint32_t <span class="keywordtype">id</span>,</div>
-<div class="line"><a name="l06749"></a><span class="lineno"> 6749</span>&#160;        uint32_t algorithm);</div>
-<div class="line"><a name="l06750"></a><span class="lineno"> 6750</span>&#160;    <span class="comment">// Always call before destruction.</span></div>
-<div class="line"><a name="l06751"></a><span class="lineno"> 6751</span>&#160;    <span class="keywordtype">void</span> Destroy(<a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator);</div>
-<div class="line"><a name="l06752"></a><span class="lineno"> 6752</span>&#160;    </div>
-<div class="line"><a name="l06753"></a><span class="lineno"> 6753</span>&#160;    <a class="code" href="struct_vma_pool.html">VmaPool</a> GetParentPool()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_hParentPool; }</div>
-<div class="line"><a name="l06754"></a><span class="lineno"> 6754</span>&#160;    VkDeviceMemory GetDeviceMemory()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_hMemory; }</div>
-<div class="line"><a name="l06755"></a><span class="lineno"> 6755</span>&#160;    uint32_t GetMemoryTypeIndex()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_MemoryTypeIndex; }</div>
-<div class="line"><a name="l06756"></a><span class="lineno"> 6756</span>&#160;    uint32_t GetId()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_Id; }</div>
-<div class="line"><a name="l06757"></a><span class="lineno"> 6757</span>&#160;    <span class="keywordtype">void</span>* GetMappedData()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_pMappedData; }</div>
-<div class="line"><a name="l06758"></a><span class="lineno"> 6758</span>&#160; </div>
-<div class="line"><a name="l06759"></a><span class="lineno"> 6759</span>&#160;    <span class="comment">// Validates all data structures inside this object. If not valid, returns false.</span></div>
-<div class="line"><a name="l06760"></a><span class="lineno"> 6760</span>&#160;    <span class="keywordtype">bool</span> Validate() <span class="keyword">const</span>;</div>
-<div class="line"><a name="l06761"></a><span class="lineno"> 6761</span>&#160; </div>
-<div class="line"><a name="l06762"></a><span class="lineno"> 6762</span>&#160;    VkResult CheckCorruption(<a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator);</div>
-<div class="line"><a name="l06763"></a><span class="lineno"> 6763</span>&#160; </div>
-<div class="line"><a name="l06764"></a><span class="lineno"> 6764</span>&#160;    <span class="comment">// ppData can be null.</span></div>
-<div class="line"><a name="l06765"></a><span class="lineno"> 6765</span>&#160;    VkResult Map(<a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator, uint32_t count, <span class="keywordtype">void</span>** ppData);</div>
-<div class="line"><a name="l06766"></a><span class="lineno"> 6766</span>&#160;    <span class="keywordtype">void</span> Unmap(<a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator, uint32_t count);</div>
-<div class="line"><a name="l06767"></a><span class="lineno"> 6767</span>&#160; </div>
-<div class="line"><a name="l06768"></a><span class="lineno"> 6768</span>&#160;    VkResult WriteMagicValueAroundAllocation(<a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator, VkDeviceSize allocOffset, VkDeviceSize allocSize);</div>
-<div class="line"><a name="l06769"></a><span class="lineno"> 6769</span>&#160;    VkResult ValidateMagicValueAroundAllocation(<a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator, VkDeviceSize allocOffset, VkDeviceSize allocSize);</div>
+<div class="line"><a name="l06733"></a><span class="lineno"> 6733</span>&#160;    <span class="comment">// Makes actual allocation based on request. Request must already be checked and valid.</span></div>
+<div class="line"><a name="l06734"></a><span class="lineno"> 6734</span>&#160;    <span class="keyword">virtual</span> <span class="keywordtype">void</span> Alloc(</div>
+<div class="line"><a name="l06735"></a><span class="lineno"> 6735</span>&#160;        <span class="keyword">const</span> VmaAllocationRequest&amp; request,</div>
+<div class="line"><a name="l06736"></a><span class="lineno"> 6736</span>&#160;        VmaSuballocationType type,</div>
+<div class="line"><a name="l06737"></a><span class="lineno"> 6737</span>&#160;        VkDeviceSize allocSize,</div>
+<div class="line"><a name="l06738"></a><span class="lineno"> 6738</span>&#160;        <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> hAllocation) = 0;</div>
+<div class="line"><a name="l06739"></a><span class="lineno"> 6739</span>&#160; </div>
+<div class="line"><a name="l06740"></a><span class="lineno"> 6740</span>&#160;    <span class="comment">// Frees suballocation assigned to given memory region.</span></div>
+<div class="line"><a name="l06741"></a><span class="lineno"> 6741</span>&#160;    <span class="keyword">virtual</span> <span class="keywordtype">void</span> Free(<span class="keyword">const</span> <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation) = 0;</div>
+<div class="line"><a name="l06742"></a><span class="lineno"> 6742</span>&#160;    <span class="keyword">virtual</span> <span class="keywordtype">void</span> FreeAtOffset(VkDeviceSize offset) = 0;</div>
+<div class="line"><a name="l06743"></a><span class="lineno"> 6743</span>&#160; </div>
+<div class="line"><a name="l06744"></a><span class="lineno"> 6744</span>&#160;<span class="keyword">protected</span>:</div>
+<div class="line"><a name="l06745"></a><span class="lineno"> 6745</span>&#160;    <span class="keyword">const</span> VkAllocationCallbacks* GetAllocationCallbacks()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_pAllocationCallbacks; }</div>
+<div class="line"><a name="l06746"></a><span class="lineno"> 6746</span>&#160; </div>
+<div class="line"><a name="l06747"></a><span class="lineno"> 6747</span>&#160;<span class="preprocessor">#if VMA_STATS_STRING_ENABLED</span></div>
+<div class="line"><a name="l06748"></a><span class="lineno"> 6748</span>&#160;    <span class="keywordtype">void</span> PrintDetailedMap_Begin(<span class="keyword">class</span> VmaJsonWriter&amp; json,</div>
+<div class="line"><a name="l06749"></a><span class="lineno"> 6749</span>&#160;        VkDeviceSize unusedBytes,</div>
+<div class="line"><a name="l06750"></a><span class="lineno"> 6750</span>&#160;        <span class="keywordtype">size_t</span> allocationCount,</div>
+<div class="line"><a name="l06751"></a><span class="lineno"> 6751</span>&#160;        <span class="keywordtype">size_t</span> unusedRangeCount) <span class="keyword">const</span>;</div>
+<div class="line"><a name="l06752"></a><span class="lineno"> 6752</span>&#160;    <span class="keywordtype">void</span> PrintDetailedMap_Allocation(<span class="keyword">class</span> VmaJsonWriter&amp; json,</div>
+<div class="line"><a name="l06753"></a><span class="lineno"> 6753</span>&#160;        VkDeviceSize offset,</div>
+<div class="line"><a name="l06754"></a><span class="lineno"> 6754</span>&#160;        <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> hAllocation) <span class="keyword">const</span>;</div>
+<div class="line"><a name="l06755"></a><span class="lineno"> 6755</span>&#160;    <span class="keywordtype">void</span> PrintDetailedMap_UnusedRange(<span class="keyword">class</span> VmaJsonWriter&amp; json,</div>
+<div class="line"><a name="l06756"></a><span class="lineno"> 6756</span>&#160;        VkDeviceSize offset,</div>
+<div class="line"><a name="l06757"></a><span class="lineno"> 6757</span>&#160;        VkDeviceSize size) <span class="keyword">const</span>;</div>
+<div class="line"><a name="l06758"></a><span class="lineno"> 6758</span>&#160;    <span class="keywordtype">void</span> PrintDetailedMap_End(<span class="keyword">class</span> VmaJsonWriter&amp; json) <span class="keyword">const</span>;</div>
+<div class="line"><a name="l06759"></a><span class="lineno"> 6759</span>&#160;<span class="preprocessor">#endif</span></div>
+<div class="line"><a name="l06760"></a><span class="lineno"> 6760</span>&#160; </div>
+<div class="line"><a name="l06761"></a><span class="lineno"> 6761</span>&#160;<span class="keyword">private</span>:</div>
+<div class="line"><a name="l06762"></a><span class="lineno"> 6762</span>&#160;    VkDeviceSize m_Size;</div>
+<div class="line"><a name="l06763"></a><span class="lineno"> 6763</span>&#160;    <span class="keyword">const</span> VkAllocationCallbacks* m_pAllocationCallbacks;</div>
+<div class="line"><a name="l06764"></a><span class="lineno"> 6764</span>&#160;};</div>
+<div class="line"><a name="l06765"></a><span class="lineno"> 6765</span>&#160; </div>
+<div class="line"><a name="l06766"></a><span class="lineno"> 6766</span>&#160;<span class="preprocessor">#define VMA_VALIDATE(cond) do { if(!(cond)) { \</span></div>
+<div class="line"><a name="l06767"></a><span class="lineno"> 6767</span>&#160;<span class="preprocessor">        VMA_ASSERT(0 &amp;&amp; &quot;Validation failed: &quot;</span> #cond); \</div>
+<div class="line"><a name="l06768"></a><span class="lineno"> 6768</span>&#160;        return false; \</div>
+<div class="line"><a name="l06769"></a><span class="lineno"> 6769</span>&#160;    } } while(false)</div>
 <div class="line"><a name="l06770"></a><span class="lineno"> 6770</span>&#160; </div>
-<div class="line"><a name="l06771"></a><span class="lineno"> 6771</span>&#160;    VkResult BindBufferMemory(</div>
-<div class="line"><a name="l06772"></a><span class="lineno"> 6772</span>&#160;        <span class="keyword">const</span> <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator,</div>
-<div class="line"><a name="l06773"></a><span class="lineno"> 6773</span>&#160;        <span class="keyword">const</span> <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> hAllocation,</div>
-<div class="line"><a name="l06774"></a><span class="lineno"> 6774</span>&#160;        VkDeviceSize allocationLocalOffset,</div>
-<div class="line"><a name="l06775"></a><span class="lineno"> 6775</span>&#160;        VkBuffer hBuffer,</div>
-<div class="line"><a name="l06776"></a><span class="lineno"> 6776</span>&#160;        <span class="keyword">const</span> <span class="keywordtype">void</span>* pNext);</div>
-<div class="line"><a name="l06777"></a><span class="lineno"> 6777</span>&#160;    VkResult BindImageMemory(</div>
-<div class="line"><a name="l06778"></a><span class="lineno"> 6778</span>&#160;        <span class="keyword">const</span> <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator,</div>
-<div class="line"><a name="l06779"></a><span class="lineno"> 6779</span>&#160;        <span class="keyword">const</span> <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> hAllocation,</div>
-<div class="line"><a name="l06780"></a><span class="lineno"> 6780</span>&#160;        VkDeviceSize allocationLocalOffset,</div>
-<div class="line"><a name="l06781"></a><span class="lineno"> 6781</span>&#160;        VkImage hImage,</div>
-<div class="line"><a name="l06782"></a><span class="lineno"> 6782</span>&#160;        <span class="keyword">const</span> <span class="keywordtype">void</span>* pNext);</div>
-<div class="line"><a name="l06783"></a><span class="lineno"> 6783</span>&#160; </div>
-<div class="line"><a name="l06784"></a><span class="lineno"> 6784</span>&#160;<span class="keyword">private</span>:</div>
-<div class="line"><a name="l06785"></a><span class="lineno"> 6785</span>&#160;    <a class="code" href="struct_vma_pool.html">VmaPool</a> m_hParentPool; <span class="comment">// VK_NULL_HANDLE if not belongs to custom pool.</span></div>
-<div class="line"><a name="l06786"></a><span class="lineno"> 6786</span>&#160;    uint32_t m_MemoryTypeIndex;</div>
-<div class="line"><a name="l06787"></a><span class="lineno"> 6787</span>&#160;    uint32_t m_Id;</div>
-<div class="line"><a name="l06788"></a><span class="lineno"> 6788</span>&#160;    VkDeviceMemory m_hMemory;</div>
-<div class="line"><a name="l06789"></a><span class="lineno"> 6789</span>&#160; </div>
-<div class="line"><a name="l06790"></a><span class="lineno"> 6790</span>&#160;    <span class="comment">/*</span></div>
-<div class="line"><a name="l06791"></a><span class="lineno"> 6791</span>&#160;<span class="comment">    Protects access to m_hMemory so it&#39;s not used by multiple threads simultaneously, e.g. vkMapMemory, vkBindBufferMemory.</span></div>
-<div class="line"><a name="l06792"></a><span class="lineno"> 6792</span>&#160;<span class="comment">    Also protects m_MapCount, m_pMappedData.</span></div>
-<div class="line"><a name="l06793"></a><span class="lineno"> 6793</span>&#160;<span class="comment">    Allocations, deallocations, any change in m_pMetadata is protected by parent&#39;s VmaBlockVector::m_Mutex.</span></div>
-<div class="line"><a name="l06794"></a><span class="lineno"> 6794</span>&#160;<span class="comment">    */</span></div>
-<div class="line"><a name="l06795"></a><span class="lineno"> 6795</span>&#160;    VMA_MUTEX m_Mutex;</div>
-<div class="line"><a name="l06796"></a><span class="lineno"> 6796</span>&#160;    uint32_t m_MapCount;</div>
-<div class="line"><a name="l06797"></a><span class="lineno"> 6797</span>&#160;    <span class="keywordtype">void</span>* m_pMappedData;</div>
-<div class="line"><a name="l06798"></a><span class="lineno"> 6798</span>&#160;};</div>
-<div class="line"><a name="l06799"></a><span class="lineno"> 6799</span>&#160; </div>
-<div class="line"><a name="l06800"></a><span class="lineno"> 6800</span>&#160;<span class="keyword">struct </span>VmaPointerLess</div>
-<div class="line"><a name="l06801"></a><span class="lineno"> 6801</span>&#160;{</div>
-<div class="line"><a name="l06802"></a><span class="lineno"> 6802</span>&#160;    <span class="keywordtype">bool</span> operator()(<span class="keyword">const</span> <span class="keywordtype">void</span>* lhs, <span class="keyword">const</span> <span class="keywordtype">void</span>* rhs)<span class="keyword"> const</span></div>
-<div class="line"><a name="l06803"></a><span class="lineno"> 6803</span>&#160;<span class="keyword">    </span>{</div>
-<div class="line"><a name="l06804"></a><span class="lineno"> 6804</span>&#160;        <span class="keywordflow">return</span> lhs &lt; rhs;</div>
-<div class="line"><a name="l06805"></a><span class="lineno"> 6805</span>&#160;    }</div>
-<div class="line"><a name="l06806"></a><span class="lineno"> 6806</span>&#160;};</div>
-<div class="line"><a name="l06807"></a><span class="lineno"> 6807</span>&#160; </div>
-<div class="line"><a name="l06808"></a><span class="lineno"> 6808</span>&#160;<span class="keyword">struct </span>VmaDefragmentationMove</div>
-<div class="line"><a name="l06809"></a><span class="lineno"> 6809</span>&#160;{</div>
-<div class="line"><a name="l06810"></a><span class="lineno"> 6810</span>&#160;    <span class="keywordtype">size_t</span> srcBlockIndex;</div>
-<div class="line"><a name="l06811"></a><span class="lineno"> 6811</span>&#160;    <span class="keywordtype">size_t</span> dstBlockIndex;</div>
-<div class="line"><a name="l06812"></a><span class="lineno"> 6812</span>&#160;    VkDeviceSize srcOffset;</div>
-<div class="line"><a name="l06813"></a><span class="lineno"> 6813</span>&#160;    VkDeviceSize dstOffset;</div>
-<div class="line"><a name="l06814"></a><span class="lineno"> 6814</span>&#160;    VkDeviceSize size;</div>
-<div class="line"><a name="l06815"></a><span class="lineno"> 6815</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> hAllocation;</div>
-<div class="line"><a name="l06816"></a><span class="lineno"> 6816</span>&#160;    VmaDeviceMemoryBlock* pSrcBlock;</div>
-<div class="line"><a name="l06817"></a><span class="lineno"> 6817</span>&#160;    VmaDeviceMemoryBlock* pDstBlock;</div>
-<div class="line"><a name="l06818"></a><span class="lineno"> 6818</span>&#160;};</div>
-<div class="line"><a name="l06819"></a><span class="lineno"> 6819</span>&#160; </div>
-<div class="line"><a name="l06820"></a><span class="lineno"> 6820</span>&#160;<span class="keyword">class </span>VmaDefragmentationAlgorithm;</div>
+<div class="line"><a name="l06771"></a><span class="lineno"> 6771</span>&#160;<span class="keyword">class </span>VmaBlockMetadata_Generic : <span class="keyword">public</span> VmaBlockMetadata</div>
+<div class="line"><a name="l06772"></a><span class="lineno"> 6772</span>&#160;{</div>
+<div class="line"><a name="l06773"></a><span class="lineno"> 6773</span>&#160;    VMA_CLASS_NO_COPY(VmaBlockMetadata_Generic)</div>
+<div class="line"><a name="l06774"></a><span class="lineno"> 6774</span>&#160;<span class="keyword">public</span>:</div>
+<div class="line"><a name="l06775"></a><span class="lineno"> 6775</span>&#160;    VmaBlockMetadata_Generic(<a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator);</div>
+<div class="line"><a name="l06776"></a><span class="lineno"> 6776</span>&#160;    <span class="keyword">virtual</span> ~VmaBlockMetadata_Generic();</div>
+<div class="line"><a name="l06777"></a><span class="lineno"> 6777</span>&#160;    <span class="keyword">virtual</span> <span class="keywordtype">void</span> Init(VkDeviceSize size);</div>
+<div class="line"><a name="l06778"></a><span class="lineno"> 6778</span>&#160; </div>
+<div class="line"><a name="l06779"></a><span class="lineno"> 6779</span>&#160;    <span class="keyword">virtual</span> <span class="keywordtype">bool</span> Validate() <span class="keyword">const</span>;</div>
+<div class="line"><a name="l06780"></a><span class="lineno"> 6780</span>&#160;    <span class="keyword">virtual</span> <span class="keywordtype">size_t</span> GetAllocationCount()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_Suballocations.size() - m_FreeCount; }</div>
+<div class="line"><a name="l06781"></a><span class="lineno"> 6781</span>&#160;    <span class="keyword">virtual</span> VkDeviceSize GetSumFreeSize()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_SumFreeSize; }</div>
+<div class="line"><a name="l06782"></a><span class="lineno"> 6782</span>&#160;    <span class="keyword">virtual</span> VkDeviceSize GetUnusedRangeSizeMax() <span class="keyword">const</span>;</div>
+<div class="line"><a name="l06783"></a><span class="lineno"> 6783</span>&#160;    <span class="keyword">virtual</span> <span class="keywordtype">bool</span> IsEmpty() <span class="keyword">const</span>;</div>
+<div class="line"><a name="l06784"></a><span class="lineno"> 6784</span>&#160; </div>
+<div class="line"><a name="l06785"></a><span class="lineno"> 6785</span>&#160;    <span class="keyword">virtual</span> <span class="keywordtype">void</span> CalcAllocationStatInfo(<a class="code" href="struct_vma_stat_info.html">VmaStatInfo</a>&amp; outInfo) <span class="keyword">const</span>;</div>
+<div class="line"><a name="l06786"></a><span class="lineno"> 6786</span>&#160;    <span class="keyword">virtual</span> <span class="keywordtype">void</span> AddPoolStats(<a class="code" href="struct_vma_pool_stats.html">VmaPoolStats</a>&amp; inoutStats) <span class="keyword">const</span>;</div>
+<div class="line"><a name="l06787"></a><span class="lineno"> 6787</span>&#160; </div>
+<div class="line"><a name="l06788"></a><span class="lineno"> 6788</span>&#160;<span class="preprocessor">#if VMA_STATS_STRING_ENABLED</span></div>
+<div class="line"><a name="l06789"></a><span class="lineno"> 6789</span>&#160;    <span class="keyword">virtual</span> <span class="keywordtype">void</span> PrintDetailedMap(<span class="keyword">class</span> VmaJsonWriter&amp; json) <span class="keyword">const</span>;</div>
+<div class="line"><a name="l06790"></a><span class="lineno"> 6790</span>&#160;<span class="preprocessor">#endif</span></div>
+<div class="line"><a name="l06791"></a><span class="lineno"> 6791</span>&#160; </div>
+<div class="line"><a name="l06792"></a><span class="lineno"> 6792</span>&#160;    <span class="keyword">virtual</span> <span class="keywordtype">bool</span> CreateAllocationRequest(</div>
+<div class="line"><a name="l06793"></a><span class="lineno"> 6793</span>&#160;        uint32_t currentFrameIndex,</div>
+<div class="line"><a name="l06794"></a><span class="lineno"> 6794</span>&#160;        uint32_t frameInUseCount,</div>
+<div class="line"><a name="l06795"></a><span class="lineno"> 6795</span>&#160;        VkDeviceSize bufferImageGranularity,</div>
+<div class="line"><a name="l06796"></a><span class="lineno"> 6796</span>&#160;        VkDeviceSize allocSize,</div>
+<div class="line"><a name="l06797"></a><span class="lineno"> 6797</span>&#160;        VkDeviceSize allocAlignment,</div>
+<div class="line"><a name="l06798"></a><span class="lineno"> 6798</span>&#160;        <span class="keywordtype">bool</span> upperAddress,</div>
+<div class="line"><a name="l06799"></a><span class="lineno"> 6799</span>&#160;        VmaSuballocationType allocType,</div>
+<div class="line"><a name="l06800"></a><span class="lineno"> 6800</span>&#160;        <span class="keywordtype">bool</span> canMakeOtherLost,</div>
+<div class="line"><a name="l06801"></a><span class="lineno"> 6801</span>&#160;        uint32_t strategy,</div>
+<div class="line"><a name="l06802"></a><span class="lineno"> 6802</span>&#160;        VmaAllocationRequest* pAllocationRequest);</div>
+<div class="line"><a name="l06803"></a><span class="lineno"> 6803</span>&#160; </div>
+<div class="line"><a name="l06804"></a><span class="lineno"> 6804</span>&#160;    <span class="keyword">virtual</span> <span class="keywordtype">bool</span> MakeRequestedAllocationsLost(</div>
+<div class="line"><a name="l06805"></a><span class="lineno"> 6805</span>&#160;        uint32_t currentFrameIndex,</div>
+<div class="line"><a name="l06806"></a><span class="lineno"> 6806</span>&#160;        uint32_t frameInUseCount,</div>
+<div class="line"><a name="l06807"></a><span class="lineno"> 6807</span>&#160;        VmaAllocationRequest* pAllocationRequest);</div>
+<div class="line"><a name="l06808"></a><span class="lineno"> 6808</span>&#160; </div>
+<div class="line"><a name="l06809"></a><span class="lineno"> 6809</span>&#160;    <span class="keyword">virtual</span> uint32_t MakeAllocationsLost(uint32_t currentFrameIndex, uint32_t frameInUseCount);</div>
+<div class="line"><a name="l06810"></a><span class="lineno"> 6810</span>&#160; </div>
+<div class="line"><a name="l06811"></a><span class="lineno"> 6811</span>&#160;    <span class="keyword">virtual</span> VkResult CheckCorruption(<span class="keyword">const</span> <span class="keywordtype">void</span>* pBlockData);</div>
+<div class="line"><a name="l06812"></a><span class="lineno"> 6812</span>&#160; </div>
+<div class="line"><a name="l06813"></a><span class="lineno"> 6813</span>&#160;    <span class="keyword">virtual</span> <span class="keywordtype">void</span> Alloc(</div>
+<div class="line"><a name="l06814"></a><span class="lineno"> 6814</span>&#160;        <span class="keyword">const</span> VmaAllocationRequest&amp; request,</div>
+<div class="line"><a name="l06815"></a><span class="lineno"> 6815</span>&#160;        VmaSuballocationType type,</div>
+<div class="line"><a name="l06816"></a><span class="lineno"> 6816</span>&#160;        VkDeviceSize allocSize,</div>
+<div class="line"><a name="l06817"></a><span class="lineno"> 6817</span>&#160;        <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> hAllocation);</div>
+<div class="line"><a name="l06818"></a><span class="lineno"> 6818</span>&#160; </div>
+<div class="line"><a name="l06819"></a><span class="lineno"> 6819</span>&#160;    <span class="keyword">virtual</span> <span class="keywordtype">void</span> Free(<span class="keyword">const</span> <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation);</div>
+<div class="line"><a name="l06820"></a><span class="lineno"> 6820</span>&#160;    <span class="keyword">virtual</span> <span class="keywordtype">void</span> FreeAtOffset(VkDeviceSize offset);</div>
 <div class="line"><a name="l06821"></a><span class="lineno"> 6821</span>&#160; </div>
-<div class="line"><a name="l06822"></a><span class="lineno"> 6822</span>&#160;<span class="comment">/*</span></div>
-<div class="line"><a name="l06823"></a><span class="lineno"> 6823</span>&#160;<span class="comment">Sequence of VmaDeviceMemoryBlock. Represents memory blocks allocated for a specific</span></div>
-<div class="line"><a name="l06824"></a><span class="lineno"> 6824</span>&#160;<span class="comment">Vulkan memory type.</span></div>
-<div class="line"><a name="l06825"></a><span class="lineno"> 6825</span>&#160;<span class="comment"></span> </div>
-<div class="line"><a name="l06826"></a><span class="lineno"> 6826</span>&#160;<span class="comment">Synchronized internally with a mutex.</span></div>
-<div class="line"><a name="l06827"></a><span class="lineno"> 6827</span>&#160;<span class="comment">*/</span></div>
-<div class="line"><a name="l06828"></a><span class="lineno"> 6828</span>&#160;<span class="keyword">struct </span>VmaBlockVector</div>
-<div class="line"><a name="l06829"></a><span class="lineno"> 6829</span>&#160;{</div>
-<div class="line"><a name="l06830"></a><span class="lineno"> 6830</span>&#160;    VMA_CLASS_NO_COPY(VmaBlockVector)</div>
-<div class="line"><a name="l06831"></a><span class="lineno"> 6831</span>&#160;<span class="keyword">public</span>:</div>
-<div class="line"><a name="l06832"></a><span class="lineno"> 6832</span>&#160;    VmaBlockVector(</div>
-<div class="line"><a name="l06833"></a><span class="lineno"> 6833</span>&#160;        <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator,</div>
-<div class="line"><a name="l06834"></a><span class="lineno"> 6834</span>&#160;        <a class="code" href="struct_vma_pool.html">VmaPool</a> hParentPool,</div>
-<div class="line"><a name="l06835"></a><span class="lineno"> 6835</span>&#160;        uint32_t memoryTypeIndex,</div>
-<div class="line"><a name="l06836"></a><span class="lineno"> 6836</span>&#160;        VkDeviceSize preferredBlockSize,</div>
-<div class="line"><a name="l06837"></a><span class="lineno"> 6837</span>&#160;        <span class="keywordtype">size_t</span> minBlockCount,</div>
-<div class="line"><a name="l06838"></a><span class="lineno"> 6838</span>&#160;        <span class="keywordtype">size_t</span> maxBlockCount,</div>
-<div class="line"><a name="l06839"></a><span class="lineno"> 6839</span>&#160;        VkDeviceSize bufferImageGranularity,</div>
-<div class="line"><a name="l06840"></a><span class="lineno"> 6840</span>&#160;        uint32_t frameInUseCount,</div>
-<div class="line"><a name="l06841"></a><span class="lineno"> 6841</span>&#160;        <span class="keywordtype">bool</span> explicitBlockSize,</div>
-<div class="line"><a name="l06842"></a><span class="lineno"> 6842</span>&#160;        uint32_t algorithm);</div>
-<div class="line"><a name="l06843"></a><span class="lineno"> 6843</span>&#160;    ~VmaBlockVector();</div>
-<div class="line"><a name="l06844"></a><span class="lineno"> 6844</span>&#160; </div>
-<div class="line"><a name="l06845"></a><span class="lineno"> 6845</span>&#160;    VkResult CreateMinBlocks();</div>
-<div class="line"><a name="l06846"></a><span class="lineno"> 6846</span>&#160; </div>
-<div class="line"><a name="l06847"></a><span class="lineno"> 6847</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> GetAllocator()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_hAllocator; }</div>
-<div class="line"><a name="l06848"></a><span class="lineno"> 6848</span>&#160;    <a class="code" href="struct_vma_pool.html">VmaPool</a> GetParentPool()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_hParentPool; }</div>
-<div class="line"><a name="l06849"></a><span class="lineno"> 6849</span>&#160;    <span class="keywordtype">bool</span> IsCustomPool()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_hParentPool != VMA_NULL; }</div>
-<div class="line"><a name="l06850"></a><span class="lineno"> 6850</span>&#160;    uint32_t GetMemoryTypeIndex()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_MemoryTypeIndex; }</div>
-<div class="line"><a name="l06851"></a><span class="lineno"> 6851</span>&#160;    VkDeviceSize GetPreferredBlockSize()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_PreferredBlockSize; }</div>
-<div class="line"><a name="l06852"></a><span class="lineno"> 6852</span>&#160;    VkDeviceSize GetBufferImageGranularity()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_BufferImageGranularity; }</div>
-<div class="line"><a name="l06853"></a><span class="lineno"> 6853</span>&#160;    uint32_t GetFrameInUseCount()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_FrameInUseCount; }</div>
-<div class="line"><a name="l06854"></a><span class="lineno"> 6854</span>&#160;    uint32_t GetAlgorithm()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_Algorithm; }</div>
-<div class="line"><a name="l06855"></a><span class="lineno"> 6855</span>&#160; </div>
-<div class="line"><a name="l06856"></a><span class="lineno"> 6856</span>&#160;    <span class="keywordtype">void</span> GetPoolStats(<a class="code" href="struct_vma_pool_stats.html">VmaPoolStats</a>* pStats);</div>
-<div class="line"><a name="l06857"></a><span class="lineno"> 6857</span>&#160; </div>
-<div class="line"><a name="l06858"></a><span class="lineno"> 6858</span>&#160;    <span class="keywordtype">bool</span> IsEmpty();</div>
-<div class="line"><a name="l06859"></a><span class="lineno"> 6859</span>&#160;    <span class="keywordtype">bool</span> IsCorruptionDetectionEnabled() <span class="keyword">const</span>;</div>
-<div class="line"><a name="l06860"></a><span class="lineno"> 6860</span>&#160; </div>
-<div class="line"><a name="l06861"></a><span class="lineno"> 6861</span>&#160;    VkResult Allocate(</div>
-<div class="line"><a name="l06862"></a><span class="lineno"> 6862</span>&#160;        uint32_t currentFrameIndex,</div>
-<div class="line"><a name="l06863"></a><span class="lineno"> 6863</span>&#160;        VkDeviceSize size,</div>
-<div class="line"><a name="l06864"></a><span class="lineno"> 6864</span>&#160;        VkDeviceSize alignment,</div>
-<div class="line"><a name="l06865"></a><span class="lineno"> 6865</span>&#160;        <span class="keyword">const</span> <a class="code" href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a>&amp; createInfo,</div>
-<div class="line"><a name="l06866"></a><span class="lineno"> 6866</span>&#160;        VmaSuballocationType suballocType,</div>
-<div class="line"><a name="l06867"></a><span class="lineno"> 6867</span>&#160;        <span class="keywordtype">size_t</span> allocationCount,</div>
-<div class="line"><a name="l06868"></a><span class="lineno"> 6868</span>&#160;        <a class="code" href="struct_vma_allocation.html">VmaAllocation</a>* pAllocations);</div>
-<div class="line"><a name="l06869"></a><span class="lineno"> 6869</span>&#160; </div>
-<div class="line"><a name="l06870"></a><span class="lineno"> 6870</span>&#160;    <span class="keywordtype">void</span> Free(<span class="keyword">const</span> <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> hAllocation);</div>
-<div class="line"><a name="l06871"></a><span class="lineno"> 6871</span>&#160; </div>
-<div class="line"><a name="l06872"></a><span class="lineno"> 6872</span>&#160;    <span class="comment">// Adds statistics of this BlockVector to pStats.</span></div>
-<div class="line"><a name="l06873"></a><span class="lineno"> 6873</span>&#160;    <span class="keywordtype">void</span> AddStats(<a class="code" href="struct_vma_stats.html">VmaStats</a>* pStats);</div>
-<div class="line"><a name="l06874"></a><span class="lineno"> 6874</span>&#160; </div>
-<div class="line"><a name="l06875"></a><span class="lineno"> 6875</span>&#160;<span class="preprocessor">#if VMA_STATS_STRING_ENABLED</span></div>
-<div class="line"><a name="l06876"></a><span class="lineno"> 6876</span>&#160;    <span class="keywordtype">void</span> PrintDetailedMap(<span class="keyword">class</span> VmaJsonWriter&amp; json);</div>
-<div class="line"><a name="l06877"></a><span class="lineno"> 6877</span>&#160;<span class="preprocessor">#endif</span></div>
-<div class="line"><a name="l06878"></a><span class="lineno"> 6878</span>&#160; </div>
-<div class="line"><a name="l06879"></a><span class="lineno"> 6879</span>&#160;    <span class="keywordtype">void</span> MakePoolAllocationsLost(</div>
-<div class="line"><a name="l06880"></a><span class="lineno"> 6880</span>&#160;        uint32_t currentFrameIndex,</div>
-<div class="line"><a name="l06881"></a><span class="lineno"> 6881</span>&#160;        <span class="keywordtype">size_t</span>* pLostAllocationCount);</div>
-<div class="line"><a name="l06882"></a><span class="lineno"> 6882</span>&#160;    VkResult CheckCorruption();</div>
-<div class="line"><a name="l06883"></a><span class="lineno"> 6883</span>&#160; </div>
-<div class="line"><a name="l06884"></a><span class="lineno"> 6884</span>&#160;    <span class="comment">// Saves results in pCtx-&gt;res.</span></div>
-<div class="line"><a name="l06885"></a><span class="lineno"> 6885</span>&#160;    <span class="keywordtype">void</span> Defragment(</div>
-<div class="line"><a name="l06886"></a><span class="lineno"> 6886</span>&#160;        <span class="keyword">class</span> VmaBlockVectorDefragmentationContext* pCtx,</div>
-<div class="line"><a name="l06887"></a><span class="lineno"> 6887</span>&#160;        <a class="code" href="struct_vma_defragmentation_stats.html">VmaDefragmentationStats</a>* pStats, <a class="code" href="vk__mem__alloc_8h.html#a88a77cef37e5d3c4fc9eb328885d048d">VmaDefragmentationFlags</a> flags,</div>
-<div class="line"><a name="l06888"></a><span class="lineno"> 6888</span>&#160;        VkDeviceSize&amp; maxCpuBytesToMove, uint32_t&amp; maxCpuAllocationsToMove,</div>
-<div class="line"><a name="l06889"></a><span class="lineno"> 6889</span>&#160;        VkDeviceSize&amp; maxGpuBytesToMove, uint32_t&amp; maxGpuAllocationsToMove,</div>
-<div class="line"><a name="l06890"></a><span class="lineno"> 6890</span>&#160;        VkCommandBuffer commandBuffer);</div>
-<div class="line"><a name="l06891"></a><span class="lineno"> 6891</span>&#160;    <span class="keywordtype">void</span> DefragmentationEnd(</div>
-<div class="line"><a name="l06892"></a><span class="lineno"> 6892</span>&#160;        <span class="keyword">class</span> VmaBlockVectorDefragmentationContext* pCtx,</div>
-<div class="line"><a name="l06893"></a><span class="lineno"> 6893</span>&#160;        uint32_t flags,</div>
-<div class="line"><a name="l06894"></a><span class="lineno"> 6894</span>&#160;        <a class="code" href="struct_vma_defragmentation_stats.html">VmaDefragmentationStats</a>* pStats);</div>
-<div class="line"><a name="l06895"></a><span class="lineno"> 6895</span>&#160; </div>
-<div class="line"><a name="l06896"></a><span class="lineno"> 6896</span>&#160;    uint32_t ProcessDefragmentations(</div>
-<div class="line"><a name="l06897"></a><span class="lineno"> 6897</span>&#160;        <span class="keyword">class</span> VmaBlockVectorDefragmentationContext *pCtx,</div>
-<div class="line"><a name="l06898"></a><span class="lineno"> 6898</span>&#160;        <a class="code" href="struct_vma_defragmentation_pass_move_info.html">VmaDefragmentationPassMoveInfo</a>* pMove, uint32_t maxMoves);</div>
-<div class="line"><a name="l06899"></a><span class="lineno"> 6899</span>&#160; </div>
-<div class="line"><a name="l06900"></a><span class="lineno"> 6900</span>&#160;    <span class="keywordtype">void</span> CommitDefragmentations(</div>
-<div class="line"><a name="l06901"></a><span class="lineno"> 6901</span>&#160;        <span class="keyword">class</span> VmaBlockVectorDefragmentationContext *pCtx,</div>
-<div class="line"><a name="l06902"></a><span class="lineno"> 6902</span>&#160;        <a class="code" href="struct_vma_defragmentation_stats.html">VmaDefragmentationStats</a>* pStats);</div>
-<div class="line"><a name="l06903"></a><span class="lineno"> 6903</span>&#160; </div>
-<div class="line"><a name="l06905"></a><span class="lineno"> 6905</span>&#160;    <span class="comment">// To be used only while the m_Mutex is locked. Used during defragmentation.</span></div>
-<div class="line"><a name="l06906"></a><span class="lineno"> 6906</span>&#160; </div>
-<div class="line"><a name="l06907"></a><span class="lineno"> 6907</span>&#160;    <span class="keywordtype">size_t</span> GetBlockCount()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_Blocks.size(); }</div>
-<div class="line"><a name="l06908"></a><span class="lineno"> 6908</span>&#160;    VmaDeviceMemoryBlock* GetBlock(<span class="keywordtype">size_t</span> index)<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_Blocks[index]; }</div>
-<div class="line"><a name="l06909"></a><span class="lineno"> 6909</span>&#160;    <span class="keywordtype">size_t</span> CalcAllocationCount() <span class="keyword">const</span>;</div>
-<div class="line"><a name="l06910"></a><span class="lineno"> 6910</span>&#160;    <span class="keywordtype">bool</span> IsBufferImageGranularityConflictPossible() <span class="keyword">const</span>;</div>
-<div class="line"><a name="l06911"></a><span class="lineno"> 6911</span>&#160; </div>
-<div class="line"><a name="l06912"></a><span class="lineno"> 6912</span>&#160;<span class="keyword">private</span>:</div>
-<div class="line"><a name="l06913"></a><span class="lineno"> 6913</span>&#160;    <span class="keyword">friend</span> <span class="keyword">class </span>VmaDefragmentationAlgorithm_Generic;</div>
-<div class="line"><a name="l06914"></a><span class="lineno"> 6914</span>&#160; </div>
-<div class="line"><a name="l06915"></a><span class="lineno"> 6915</span>&#160;    <span class="keyword">const</span> <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> m_hAllocator;</div>
-<div class="line"><a name="l06916"></a><span class="lineno"> 6916</span>&#160;    <span class="keyword">const</span> <a class="code" href="struct_vma_pool.html">VmaPool</a> m_hParentPool;</div>
-<div class="line"><a name="l06917"></a><span class="lineno"> 6917</span>&#160;    <span class="keyword">const</span> uint32_t m_MemoryTypeIndex;</div>
-<div class="line"><a name="l06918"></a><span class="lineno"> 6918</span>&#160;    <span class="keyword">const</span> VkDeviceSize m_PreferredBlockSize;</div>
-<div class="line"><a name="l06919"></a><span class="lineno"> 6919</span>&#160;    <span class="keyword">const</span> <span class="keywordtype">size_t</span> m_MinBlockCount;</div>
-<div class="line"><a name="l06920"></a><span class="lineno"> 6920</span>&#160;    <span class="keyword">const</span> <span class="keywordtype">size_t</span> m_MaxBlockCount;</div>
-<div class="line"><a name="l06921"></a><span class="lineno"> 6921</span>&#160;    <span class="keyword">const</span> VkDeviceSize m_BufferImageGranularity;</div>
-<div class="line"><a name="l06922"></a><span class="lineno"> 6922</span>&#160;    <span class="keyword">const</span> uint32_t m_FrameInUseCount;</div>
-<div class="line"><a name="l06923"></a><span class="lineno"> 6923</span>&#160;    <span class="keyword">const</span> <span class="keywordtype">bool</span> m_ExplicitBlockSize;</div>
-<div class="line"><a name="l06924"></a><span class="lineno"> 6924</span>&#160;    <span class="keyword">const</span> uint32_t m_Algorithm;</div>
-<div class="line"><a name="l06925"></a><span class="lineno"> 6925</span>&#160;    VMA_RW_MUTEX m_Mutex;</div>
-<div class="line"><a name="l06926"></a><span class="lineno"> 6926</span>&#160; </div>
-<div class="line"><a name="l06927"></a><span class="lineno"> 6927</span>&#160;    <span class="comment">/* There can be at most one allocation that is completely empty (except when minBlockCount &gt; 0) -</span></div>
-<div class="line"><a name="l06928"></a><span class="lineno"> 6928</span>&#160;<span class="comment">    a hysteresis to avoid pessimistic case of alternating creation and destruction of a VkDeviceMemory. */</span></div>
-<div class="line"><a name="l06929"></a><span class="lineno"> 6929</span>&#160;    <span class="keywordtype">bool</span> m_HasEmptyBlock;</div>
-<div class="line"><a name="l06930"></a><span class="lineno"> 6930</span>&#160;    <span class="comment">// Incrementally sorted by sumFreeSize, ascending.</span></div>
-<div class="line"><a name="l06931"></a><span class="lineno"> 6931</span>&#160;    VmaVector&lt; VmaDeviceMemoryBlock*, VmaStlAllocator&lt;VmaDeviceMemoryBlock*&gt; &gt; m_Blocks;</div>
-<div class="line"><a name="l06932"></a><span class="lineno"> 6932</span>&#160;    uint32_t m_NextBlockId;</div>
-<div class="line"><a name="l06933"></a><span class="lineno"> 6933</span>&#160; </div>
-<div class="line"><a name="l06934"></a><span class="lineno"> 6934</span>&#160;    VkDeviceSize CalcMaxBlockSize() <span class="keyword">const</span>;</div>
-<div class="line"><a name="l06935"></a><span class="lineno"> 6935</span>&#160; </div>
-<div class="line"><a name="l06936"></a><span class="lineno"> 6936</span>&#160;    <span class="comment">// Finds and removes given block from vector.</span></div>
-<div class="line"><a name="l06937"></a><span class="lineno"> 6937</span>&#160;    <span class="keywordtype">void</span> Remove(VmaDeviceMemoryBlock* pBlock);</div>
-<div class="line"><a name="l06938"></a><span class="lineno"> 6938</span>&#160; </div>
-<div class="line"><a name="l06939"></a><span class="lineno"> 6939</span>&#160;    <span class="comment">// Performs single step in sorting m_Blocks. They may not be fully sorted</span></div>
-<div class="line"><a name="l06940"></a><span class="lineno"> 6940</span>&#160;    <span class="comment">// after this call.</span></div>
-<div class="line"><a name="l06941"></a><span class="lineno"> 6941</span>&#160;    <span class="keywordtype">void</span> IncrementallySortBlocks();</div>
-<div class="line"><a name="l06942"></a><span class="lineno"> 6942</span>&#160; </div>
-<div class="line"><a name="l06943"></a><span class="lineno"> 6943</span>&#160;    VkResult AllocatePage(</div>
-<div class="line"><a name="l06944"></a><span class="lineno"> 6944</span>&#160;        uint32_t currentFrameIndex,</div>
-<div class="line"><a name="l06945"></a><span class="lineno"> 6945</span>&#160;        VkDeviceSize size,</div>
-<div class="line"><a name="l06946"></a><span class="lineno"> 6946</span>&#160;        VkDeviceSize alignment,</div>
-<div class="line"><a name="l06947"></a><span class="lineno"> 6947</span>&#160;        <span class="keyword">const</span> <a class="code" href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a>&amp; createInfo,</div>
-<div class="line"><a name="l06948"></a><span class="lineno"> 6948</span>&#160;        VmaSuballocationType suballocType,</div>
-<div class="line"><a name="l06949"></a><span class="lineno"> 6949</span>&#160;        <a class="code" href="struct_vma_allocation.html">VmaAllocation</a>* pAllocation);</div>
-<div class="line"><a name="l06950"></a><span class="lineno"> 6950</span>&#160; </div>
-<div class="line"><a name="l06951"></a><span class="lineno"> 6951</span>&#160;    <span class="comment">// To be used only without CAN_MAKE_OTHER_LOST flag.</span></div>
-<div class="line"><a name="l06952"></a><span class="lineno"> 6952</span>&#160;    VkResult AllocateFromBlock(</div>
-<div class="line"><a name="l06953"></a><span class="lineno"> 6953</span>&#160;        VmaDeviceMemoryBlock* pBlock,</div>
-<div class="line"><a name="l06954"></a><span class="lineno"> 6954</span>&#160;        uint32_t currentFrameIndex,</div>
-<div class="line"><a name="l06955"></a><span class="lineno"> 6955</span>&#160;        VkDeviceSize size,</div>
-<div class="line"><a name="l06956"></a><span class="lineno"> 6956</span>&#160;        VkDeviceSize alignment,</div>
-<div class="line"><a name="l06957"></a><span class="lineno"> 6957</span>&#160;        <a class="code" href="vk__mem__alloc_8h.html#a5225e5e11f8376f6a31a1791f3d6e817">VmaAllocationCreateFlags</a> allocFlags,</div>
-<div class="line"><a name="l06958"></a><span class="lineno"> 6958</span>&#160;        <span class="keywordtype">void</span>* pUserData,</div>
-<div class="line"><a name="l06959"></a><span class="lineno"> 6959</span>&#160;        VmaSuballocationType suballocType,</div>
-<div class="line"><a name="l06960"></a><span class="lineno"> 6960</span>&#160;        uint32_t strategy,</div>
-<div class="line"><a name="l06961"></a><span class="lineno"> 6961</span>&#160;        <a class="code" href="struct_vma_allocation.html">VmaAllocation</a>* pAllocation);</div>
+<div class="line"><a name="l06823"></a><span class="lineno"> 6823</span>&#160;    <span class="comment">// For defragmentation</span></div>
+<div class="line"><a name="l06824"></a><span class="lineno"> 6824</span>&#160; </div>
+<div class="line"><a name="l06825"></a><span class="lineno"> 6825</span>&#160;    <span class="keywordtype">bool</span> IsBufferImageGranularityConflictPossible(</div>
+<div class="line"><a name="l06826"></a><span class="lineno"> 6826</span>&#160;        VkDeviceSize bufferImageGranularity,</div>
+<div class="line"><a name="l06827"></a><span class="lineno"> 6827</span>&#160;        VmaSuballocationType&amp; inOutPrevSuballocType) <span class="keyword">const</span>;</div>
+<div class="line"><a name="l06828"></a><span class="lineno"> 6828</span>&#160; </div>
+<div class="line"><a name="l06829"></a><span class="lineno"> 6829</span>&#160;<span class="keyword">private</span>:</div>
+<div class="line"><a name="l06830"></a><span class="lineno"> 6830</span>&#160;    <span class="keyword">friend</span> <span class="keyword">class </span>VmaDefragmentationAlgorithm_Generic;</div>
+<div class="line"><a name="l06831"></a><span class="lineno"> 6831</span>&#160;    <span class="keyword">friend</span> <span class="keyword">class </span>VmaDefragmentationAlgorithm_Fast;</div>
+<div class="line"><a name="l06832"></a><span class="lineno"> 6832</span>&#160; </div>
+<div class="line"><a name="l06833"></a><span class="lineno"> 6833</span>&#160;    uint32_t m_FreeCount;</div>
+<div class="line"><a name="l06834"></a><span class="lineno"> 6834</span>&#160;    VkDeviceSize m_SumFreeSize;</div>
+<div class="line"><a name="l06835"></a><span class="lineno"> 6835</span>&#160;    VmaSuballocationList m_Suballocations;</div>
+<div class="line"><a name="l06836"></a><span class="lineno"> 6836</span>&#160;    <span class="comment">// Suballocations that are free and have size greater than certain threshold.</span></div>
+<div class="line"><a name="l06837"></a><span class="lineno"> 6837</span>&#160;    <span class="comment">// Sorted by size, ascending.</span></div>
+<div class="line"><a name="l06838"></a><span class="lineno"> 6838</span>&#160;    VmaVector&lt; VmaSuballocationList::iterator, VmaStlAllocator&lt; VmaSuballocationList::iterator &gt; &gt; m_FreeSuballocationsBySize;</div>
+<div class="line"><a name="l06839"></a><span class="lineno"> 6839</span>&#160; </div>
+<div class="line"><a name="l06840"></a><span class="lineno"> 6840</span>&#160;    <span class="keywordtype">bool</span> ValidateFreeSuballocationList() <span class="keyword">const</span>;</div>
+<div class="line"><a name="l06841"></a><span class="lineno"> 6841</span>&#160; </div>
+<div class="line"><a name="l06842"></a><span class="lineno"> 6842</span>&#160;    <span class="comment">// Checks if requested suballocation with given parameters can be placed in given pFreeSuballocItem.</span></div>
+<div class="line"><a name="l06843"></a><span class="lineno"> 6843</span>&#160;    <span class="comment">// If yes, fills pOffset and returns true. If no, returns false.</span></div>
+<div class="line"><a name="l06844"></a><span class="lineno"> 6844</span>&#160;    <span class="keywordtype">bool</span> CheckAllocation(</div>
+<div class="line"><a name="l06845"></a><span class="lineno"> 6845</span>&#160;        uint32_t currentFrameIndex,</div>
+<div class="line"><a name="l06846"></a><span class="lineno"> 6846</span>&#160;        uint32_t frameInUseCount,</div>
+<div class="line"><a name="l06847"></a><span class="lineno"> 6847</span>&#160;        VkDeviceSize bufferImageGranularity,</div>
+<div class="line"><a name="l06848"></a><span class="lineno"> 6848</span>&#160;        VkDeviceSize allocSize,</div>
+<div class="line"><a name="l06849"></a><span class="lineno"> 6849</span>&#160;        VkDeviceSize allocAlignment,</div>
+<div class="line"><a name="l06850"></a><span class="lineno"> 6850</span>&#160;        VmaSuballocationType allocType,</div>
+<div class="line"><a name="l06851"></a><span class="lineno"> 6851</span>&#160;        VmaSuballocationList::const_iterator suballocItem,</div>
+<div class="line"><a name="l06852"></a><span class="lineno"> 6852</span>&#160;        <span class="keywordtype">bool</span> canMakeOtherLost,</div>
+<div class="line"><a name="l06853"></a><span class="lineno"> 6853</span>&#160;        VkDeviceSize* pOffset,</div>
+<div class="line"><a name="l06854"></a><span class="lineno"> 6854</span>&#160;        <span class="keywordtype">size_t</span>* itemsToMakeLostCount,</div>
+<div class="line"><a name="l06855"></a><span class="lineno"> 6855</span>&#160;        VkDeviceSize* pSumFreeSize,</div>
+<div class="line"><a name="l06856"></a><span class="lineno"> 6856</span>&#160;        VkDeviceSize* pSumItemSize) <span class="keyword">const</span>;</div>
+<div class="line"><a name="l06857"></a><span class="lineno"> 6857</span>&#160;    <span class="comment">// Given free suballocation, it merges it with following one, which must also be free.</span></div>
+<div class="line"><a name="l06858"></a><span class="lineno"> 6858</span>&#160;    <span class="keywordtype">void</span> MergeFreeWithNext(VmaSuballocationList::iterator item);</div>
+<div class="line"><a name="l06859"></a><span class="lineno"> 6859</span>&#160;    <span class="comment">// Releases given suballocation, making it free.</span></div>
+<div class="line"><a name="l06860"></a><span class="lineno"> 6860</span>&#160;    <span class="comment">// Merges it with adjacent free suballocations if applicable.</span></div>
+<div class="line"><a name="l06861"></a><span class="lineno"> 6861</span>&#160;    <span class="comment">// Returns iterator to new free suballocation at this place.</span></div>
+<div class="line"><a name="l06862"></a><span class="lineno"> 6862</span>&#160;    VmaSuballocationList::iterator FreeSuballocation(VmaSuballocationList::iterator suballocItem);</div>
+<div class="line"><a name="l06863"></a><span class="lineno"> 6863</span>&#160;    <span class="comment">// Given free suballocation, it inserts it into sorted list of</span></div>
+<div class="line"><a name="l06864"></a><span class="lineno"> 6864</span>&#160;    <span class="comment">// m_FreeSuballocationsBySize if it&#39;s suitable.</span></div>
+<div class="line"><a name="l06865"></a><span class="lineno"> 6865</span>&#160;    <span class="keywordtype">void</span> RegisterFreeSuballocation(VmaSuballocationList::iterator item);</div>
+<div class="line"><a name="l06866"></a><span class="lineno"> 6866</span>&#160;    <span class="comment">// Given free suballocation, it removes it from sorted list of</span></div>
+<div class="line"><a name="l06867"></a><span class="lineno"> 6867</span>&#160;    <span class="comment">// m_FreeSuballocationsBySize if it&#39;s suitable.</span></div>
+<div class="line"><a name="l06868"></a><span class="lineno"> 6868</span>&#160;    <span class="keywordtype">void</span> UnregisterFreeSuballocation(VmaSuballocationList::iterator item);</div>
+<div class="line"><a name="l06869"></a><span class="lineno"> 6869</span>&#160;};</div>
+<div class="line"><a name="l06870"></a><span class="lineno"> 6870</span>&#160; </div>
+<div class="line"><a name="l06871"></a><span class="lineno"> 6871</span>&#160;<span class="comment">/*</span></div>
+<div class="line"><a name="l06872"></a><span class="lineno"> 6872</span>&#160;<span class="comment">Allocations and their references in internal data structure look like this:</span></div>
+<div class="line"><a name="l06873"></a><span class="lineno"> 6873</span>&#160;<span class="comment"></span> </div>
+<div class="line"><a name="l06874"></a><span class="lineno"> 6874</span>&#160;<span class="comment">if(m_2ndVectorMode == SECOND_VECTOR_EMPTY):</span></div>
+<div class="line"><a name="l06875"></a><span class="lineno"> 6875</span>&#160;<span class="comment"></span> </div>
+<div class="line"><a name="l06876"></a><span class="lineno"> 6876</span>&#160;<span class="comment">        0 +-------+</span></div>
+<div class="line"><a name="l06877"></a><span class="lineno"> 6877</span>&#160;<span class="comment">          |       |</span></div>
+<div class="line"><a name="l06878"></a><span class="lineno"> 6878</span>&#160;<span class="comment">          |       |</span></div>
+<div class="line"><a name="l06879"></a><span class="lineno"> 6879</span>&#160;<span class="comment">          |       |</span></div>
+<div class="line"><a name="l06880"></a><span class="lineno"> 6880</span>&#160;<span class="comment">          +-------+</span></div>
+<div class="line"><a name="l06881"></a><span class="lineno"> 6881</span>&#160;<span class="comment">          | Alloc |  1st[m_1stNullItemsBeginCount]</span></div>
+<div class="line"><a name="l06882"></a><span class="lineno"> 6882</span>&#160;<span class="comment">          +-------+</span></div>
+<div class="line"><a name="l06883"></a><span class="lineno"> 6883</span>&#160;<span class="comment">          | Alloc |  1st[m_1stNullItemsBeginCount + 1]</span></div>
+<div class="line"><a name="l06884"></a><span class="lineno"> 6884</span>&#160;<span class="comment">          +-------+</span></div>
+<div class="line"><a name="l06885"></a><span class="lineno"> 6885</span>&#160;<span class="comment">          |  ...  |</span></div>
+<div class="line"><a name="l06886"></a><span class="lineno"> 6886</span>&#160;<span class="comment">          +-------+</span></div>
+<div class="line"><a name="l06887"></a><span class="lineno"> 6887</span>&#160;<span class="comment">          | Alloc |  1st[1st.size() - 1]</span></div>
+<div class="line"><a name="l06888"></a><span class="lineno"> 6888</span>&#160;<span class="comment">          +-------+</span></div>
+<div class="line"><a name="l06889"></a><span class="lineno"> 6889</span>&#160;<span class="comment">          |       |</span></div>
+<div class="line"><a name="l06890"></a><span class="lineno"> 6890</span>&#160;<span class="comment">          |       |</span></div>
+<div class="line"><a name="l06891"></a><span class="lineno"> 6891</span>&#160;<span class="comment">          |       |</span></div>
+<div class="line"><a name="l06892"></a><span class="lineno"> 6892</span>&#160;<span class="comment">GetSize() +-------+</span></div>
+<div class="line"><a name="l06893"></a><span class="lineno"> 6893</span>&#160;<span class="comment"></span> </div>
+<div class="line"><a name="l06894"></a><span class="lineno"> 6894</span>&#160;<span class="comment">if(m_2ndVectorMode == SECOND_VECTOR_RING_BUFFER):</span></div>
+<div class="line"><a name="l06895"></a><span class="lineno"> 6895</span>&#160;<span class="comment"></span> </div>
+<div class="line"><a name="l06896"></a><span class="lineno"> 6896</span>&#160;<span class="comment">        0 +-------+</span></div>
+<div class="line"><a name="l06897"></a><span class="lineno"> 6897</span>&#160;<span class="comment">          | Alloc |  2nd[0]</span></div>
+<div class="line"><a name="l06898"></a><span class="lineno"> 6898</span>&#160;<span class="comment">          +-------+</span></div>
+<div class="line"><a name="l06899"></a><span class="lineno"> 6899</span>&#160;<span class="comment">          | Alloc |  2nd[1]</span></div>
+<div class="line"><a name="l06900"></a><span class="lineno"> 6900</span>&#160;<span class="comment">          +-------+</span></div>
+<div class="line"><a name="l06901"></a><span class="lineno"> 6901</span>&#160;<span class="comment">          |  ...  |</span></div>
+<div class="line"><a name="l06902"></a><span class="lineno"> 6902</span>&#160;<span class="comment">          +-------+</span></div>
+<div class="line"><a name="l06903"></a><span class="lineno"> 6903</span>&#160;<span class="comment">          | Alloc |  2nd[2nd.size() - 1]</span></div>
+<div class="line"><a name="l06904"></a><span class="lineno"> 6904</span>&#160;<span class="comment">          +-------+</span></div>
+<div class="line"><a name="l06905"></a><span class="lineno"> 6905</span>&#160;<span class="comment">          |       |</span></div>
+<div class="line"><a name="l06906"></a><span class="lineno"> 6906</span>&#160;<span class="comment">          |       |</span></div>
+<div class="line"><a name="l06907"></a><span class="lineno"> 6907</span>&#160;<span class="comment">          |       |</span></div>
+<div class="line"><a name="l06908"></a><span class="lineno"> 6908</span>&#160;<span class="comment">          +-------+</span></div>
+<div class="line"><a name="l06909"></a><span class="lineno"> 6909</span>&#160;<span class="comment">          | Alloc |  1st[m_1stNullItemsBeginCount]</span></div>
+<div class="line"><a name="l06910"></a><span class="lineno"> 6910</span>&#160;<span class="comment">          +-------+</span></div>
+<div class="line"><a name="l06911"></a><span class="lineno"> 6911</span>&#160;<span class="comment">          | Alloc |  1st[m_1stNullItemsBeginCount + 1]</span></div>
+<div class="line"><a name="l06912"></a><span class="lineno"> 6912</span>&#160;<span class="comment">          +-------+</span></div>
+<div class="line"><a name="l06913"></a><span class="lineno"> 6913</span>&#160;<span class="comment">          |  ...  |</span></div>
+<div class="line"><a name="l06914"></a><span class="lineno"> 6914</span>&#160;<span class="comment">          +-------+</span></div>
+<div class="line"><a name="l06915"></a><span class="lineno"> 6915</span>&#160;<span class="comment">          | Alloc |  1st[1st.size() - 1]</span></div>
+<div class="line"><a name="l06916"></a><span class="lineno"> 6916</span>&#160;<span class="comment">          +-------+</span></div>
+<div class="line"><a name="l06917"></a><span class="lineno"> 6917</span>&#160;<span class="comment">          |       |</span></div>
+<div class="line"><a name="l06918"></a><span class="lineno"> 6918</span>&#160;<span class="comment">GetSize() +-------+</span></div>
+<div class="line"><a name="l06919"></a><span class="lineno"> 6919</span>&#160;<span class="comment"></span> </div>
+<div class="line"><a name="l06920"></a><span class="lineno"> 6920</span>&#160;<span class="comment">if(m_2ndVectorMode == SECOND_VECTOR_DOUBLE_STACK):</span></div>
+<div class="line"><a name="l06921"></a><span class="lineno"> 6921</span>&#160;<span class="comment"></span> </div>
+<div class="line"><a name="l06922"></a><span class="lineno"> 6922</span>&#160;<span class="comment">        0 +-------+</span></div>
+<div class="line"><a name="l06923"></a><span class="lineno"> 6923</span>&#160;<span class="comment">          |       |</span></div>
+<div class="line"><a name="l06924"></a><span class="lineno"> 6924</span>&#160;<span class="comment">          |       |</span></div>
+<div class="line"><a name="l06925"></a><span class="lineno"> 6925</span>&#160;<span class="comment">          |       |</span></div>
+<div class="line"><a name="l06926"></a><span class="lineno"> 6926</span>&#160;<span class="comment">          +-------+</span></div>
+<div class="line"><a name="l06927"></a><span class="lineno"> 6927</span>&#160;<span class="comment">          | Alloc |  1st[m_1stNullItemsBeginCount]</span></div>
+<div class="line"><a name="l06928"></a><span class="lineno"> 6928</span>&#160;<span class="comment">          +-------+</span></div>
+<div class="line"><a name="l06929"></a><span class="lineno"> 6929</span>&#160;<span class="comment">          | Alloc |  1st[m_1stNullItemsBeginCount + 1]</span></div>
+<div class="line"><a name="l06930"></a><span class="lineno"> 6930</span>&#160;<span class="comment">          +-------+</span></div>
+<div class="line"><a name="l06931"></a><span class="lineno"> 6931</span>&#160;<span class="comment">          |  ...  |</span></div>
+<div class="line"><a name="l06932"></a><span class="lineno"> 6932</span>&#160;<span class="comment">          +-------+</span></div>
+<div class="line"><a name="l06933"></a><span class="lineno"> 6933</span>&#160;<span class="comment">          | Alloc |  1st[1st.size() - 1]</span></div>
+<div class="line"><a name="l06934"></a><span class="lineno"> 6934</span>&#160;<span class="comment">          +-------+</span></div>
+<div class="line"><a name="l06935"></a><span class="lineno"> 6935</span>&#160;<span class="comment">          |       |</span></div>
+<div class="line"><a name="l06936"></a><span class="lineno"> 6936</span>&#160;<span class="comment">          |       |</span></div>
+<div class="line"><a name="l06937"></a><span class="lineno"> 6937</span>&#160;<span class="comment">          |       |</span></div>
+<div class="line"><a name="l06938"></a><span class="lineno"> 6938</span>&#160;<span class="comment">          +-------+</span></div>
+<div class="line"><a name="l06939"></a><span class="lineno"> 6939</span>&#160;<span class="comment">          | Alloc |  2nd[2nd.size() - 1]</span></div>
+<div class="line"><a name="l06940"></a><span class="lineno"> 6940</span>&#160;<span class="comment">          +-------+</span></div>
+<div class="line"><a name="l06941"></a><span class="lineno"> 6941</span>&#160;<span class="comment">          |  ...  |</span></div>
+<div class="line"><a name="l06942"></a><span class="lineno"> 6942</span>&#160;<span class="comment">          +-------+</span></div>
+<div class="line"><a name="l06943"></a><span class="lineno"> 6943</span>&#160;<span class="comment">          | Alloc |  2nd[1]</span></div>
+<div class="line"><a name="l06944"></a><span class="lineno"> 6944</span>&#160;<span class="comment">          +-------+</span></div>
+<div class="line"><a name="l06945"></a><span class="lineno"> 6945</span>&#160;<span class="comment">          | Alloc |  2nd[0]</span></div>
+<div class="line"><a name="l06946"></a><span class="lineno"> 6946</span>&#160;<span class="comment">GetSize() +-------+</span></div>
+<div class="line"><a name="l06947"></a><span class="lineno"> 6947</span>&#160;<span class="comment"></span> </div>
+<div class="line"><a name="l06948"></a><span class="lineno"> 6948</span>&#160;<span class="comment">*/</span></div>
+<div class="line"><a name="l06949"></a><span class="lineno"> 6949</span>&#160;<span class="keyword">class </span>VmaBlockMetadata_Linear : <span class="keyword">public</span> VmaBlockMetadata</div>
+<div class="line"><a name="l06950"></a><span class="lineno"> 6950</span>&#160;{</div>
+<div class="line"><a name="l06951"></a><span class="lineno"> 6951</span>&#160;    VMA_CLASS_NO_COPY(VmaBlockMetadata_Linear)</div>
+<div class="line"><a name="l06952"></a><span class="lineno"> 6952</span>&#160;<span class="keyword">public</span>:</div>
+<div class="line"><a name="l06953"></a><span class="lineno"> 6953</span>&#160;    VmaBlockMetadata_Linear(<a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator);</div>
+<div class="line"><a name="l06954"></a><span class="lineno"> 6954</span>&#160;    <span class="keyword">virtual</span> ~VmaBlockMetadata_Linear();</div>
+<div class="line"><a name="l06955"></a><span class="lineno"> 6955</span>&#160;    <span class="keyword">virtual</span> <span class="keywordtype">void</span> Init(VkDeviceSize size);</div>
+<div class="line"><a name="l06956"></a><span class="lineno"> 6956</span>&#160; </div>
+<div class="line"><a name="l06957"></a><span class="lineno"> 6957</span>&#160;    <span class="keyword">virtual</span> <span class="keywordtype">bool</span> Validate() <span class="keyword">const</span>;</div>
+<div class="line"><a name="l06958"></a><span class="lineno"> 6958</span>&#160;    <span class="keyword">virtual</span> <span class="keywordtype">size_t</span> GetAllocationCount() <span class="keyword">const</span>;</div>
+<div class="line"><a name="l06959"></a><span class="lineno"> 6959</span>&#160;    <span class="keyword">virtual</span> VkDeviceSize GetSumFreeSize()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_SumFreeSize; }</div>
+<div class="line"><a name="l06960"></a><span class="lineno"> 6960</span>&#160;    <span class="keyword">virtual</span> VkDeviceSize GetUnusedRangeSizeMax() <span class="keyword">const</span>;</div>
+<div class="line"><a name="l06961"></a><span class="lineno"> 6961</span>&#160;    <span class="keyword">virtual</span> <span class="keywordtype">bool</span> IsEmpty()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> GetAllocationCount() == 0; }</div>
 <div class="line"><a name="l06962"></a><span class="lineno"> 6962</span>&#160; </div>
-<div class="line"><a name="l06963"></a><span class="lineno"> 6963</span>&#160;    VkResult CreateBlock(VkDeviceSize blockSize, <span class="keywordtype">size_t</span>* pNewBlockIndex);</div>
-<div class="line"><a name="l06964"></a><span class="lineno"> 6964</span>&#160; </div>
-<div class="line"><a name="l06965"></a><span class="lineno"> 6965</span>&#160;    <span class="comment">// Saves result to pCtx-&gt;res.</span></div>
-<div class="line"><a name="l06966"></a><span class="lineno"> 6966</span>&#160;    <span class="keywordtype">void</span> ApplyDefragmentationMovesCpu(</div>
-<div class="line"><a name="l06967"></a><span class="lineno"> 6967</span>&#160;        <span class="keyword">class</span> VmaBlockVectorDefragmentationContext* pDefragCtx,</div>
-<div class="line"><a name="l06968"></a><span class="lineno"> 6968</span>&#160;        <span class="keyword">const</span> VmaVector&lt; VmaDefragmentationMove, VmaStlAllocator&lt;VmaDefragmentationMove&gt; &gt;&amp; moves);</div>
-<div class="line"><a name="l06969"></a><span class="lineno"> 6969</span>&#160;    <span class="comment">// Saves result to pCtx-&gt;res.</span></div>
-<div class="line"><a name="l06970"></a><span class="lineno"> 6970</span>&#160;    <span class="keywordtype">void</span> ApplyDefragmentationMovesGpu(</div>
-<div class="line"><a name="l06971"></a><span class="lineno"> 6971</span>&#160;        <span class="keyword">class</span> VmaBlockVectorDefragmentationContext* pDefragCtx,</div>
-<div class="line"><a name="l06972"></a><span class="lineno"> 6972</span>&#160;        VmaVector&lt; VmaDefragmentationMove, VmaStlAllocator&lt;VmaDefragmentationMove&gt; &gt;&amp; moves,</div>
-<div class="line"><a name="l06973"></a><span class="lineno"> 6973</span>&#160;        VkCommandBuffer commandBuffer);</div>
-<div class="line"><a name="l06974"></a><span class="lineno"> 6974</span>&#160; </div>
-<div class="line"><a name="l06975"></a><span class="lineno"> 6975</span>&#160;    <span class="comment">/*</span></div>
-<div class="line"><a name="l06976"></a><span class="lineno"> 6976</span>&#160;<span class="comment">    Used during defragmentation. pDefragmentationStats is optional. It&#39;s in/out</span></div>
-<div class="line"><a name="l06977"></a><span class="lineno"> 6977</span>&#160;<span class="comment">    - updated with new data.</span></div>
-<div class="line"><a name="l06978"></a><span class="lineno"> 6978</span>&#160;<span class="comment">    */</span></div>
-<div class="line"><a name="l06979"></a><span class="lineno"> 6979</span>&#160;    <span class="keywordtype">void</span> FreeEmptyBlocks(<a class="code" href="struct_vma_defragmentation_stats.html">VmaDefragmentationStats</a>* pDefragmentationStats);</div>
-<div class="line"><a name="l06980"></a><span class="lineno"> 6980</span>&#160; </div>
-<div class="line"><a name="l06981"></a><span class="lineno"> 6981</span>&#160;    <span class="keywordtype">void</span> UpdateHasEmptyBlock();</div>
-<div class="line"><a name="l06982"></a><span class="lineno"> 6982</span>&#160;};</div>
-<div class="line"><a name="l06983"></a><span class="lineno"> 6983</span>&#160; </div>
-<div class="line"><a name="l06984"></a><span class="lineno"> 6984</span>&#160;<span class="keyword">struct </span>VmaPool_T</div>
-<div class="line"><a name="l06985"></a><span class="lineno"> 6985</span>&#160;{</div>
-<div class="line"><a name="l06986"></a><span class="lineno"> 6986</span>&#160;    VMA_CLASS_NO_COPY(VmaPool_T)</div>
-<div class="line"><a name="l06987"></a><span class="lineno"> 6987</span>&#160;<span class="keyword">public</span>:</div>
-<div class="line"><a name="l06988"></a><span class="lineno"> 6988</span>&#160;    VmaBlockVector m_BlockVector;</div>
-<div class="line"><a name="l06989"></a><span class="lineno"> 6989</span>&#160; </div>
-<div class="line"><a name="l06990"></a><span class="lineno"> 6990</span>&#160;    VmaPool_T(</div>
-<div class="line"><a name="l06991"></a><span class="lineno"> 6991</span>&#160;        <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator,</div>
-<div class="line"><a name="l06992"></a><span class="lineno"> 6992</span>&#160;        <span class="keyword">const</span> <a class="code" href="struct_vma_pool_create_info.html">VmaPoolCreateInfo</a>&amp; createInfo,</div>
-<div class="line"><a name="l06993"></a><span class="lineno"> 6993</span>&#160;        VkDeviceSize preferredBlockSize);</div>
-<div class="line"><a name="l06994"></a><span class="lineno"> 6994</span>&#160;    ~VmaPool_T();</div>
-<div class="line"><a name="l06995"></a><span class="lineno"> 6995</span>&#160; </div>
-<div class="line"><a name="l06996"></a><span class="lineno"> 6996</span>&#160;    uint32_t GetId()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_Id; }</div>
-<div class="line"><a name="l06997"></a><span class="lineno"> 6997</span>&#160;    <span class="keywordtype">void</span> SetId(uint32_t <span class="keywordtype">id</span>) { VMA_ASSERT(m_Id == 0); m_Id = id; }</div>
-<div class="line"><a name="l06998"></a><span class="lineno"> 6998</span>&#160; </div>
-<div class="line"><a name="l06999"></a><span class="lineno"> 6999</span>&#160;    <span class="keyword">const</span> <span class="keywordtype">char</span>* GetName()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_Name; }</div>
-<div class="line"><a name="l07000"></a><span class="lineno"> 7000</span>&#160;    <span class="keywordtype">void</span> SetName(<span class="keyword">const</span> <span class="keywordtype">char</span>* pName);</div>
-<div class="line"><a name="l07001"></a><span class="lineno"> 7001</span>&#160; </div>
-<div class="line"><a name="l07002"></a><span class="lineno"> 7002</span>&#160;<span class="preprocessor">#if VMA_STATS_STRING_ENABLED</span></div>
-<div class="line"><a name="l07003"></a><span class="lineno"> 7003</span>&#160;    <span class="comment">//void PrintDetailedMap(class VmaStringBuilder&amp; sb);</span></div>
-<div class="line"><a name="l07004"></a><span class="lineno"> 7004</span>&#160;<span class="preprocessor">#endif</span></div>
-<div class="line"><a name="l07005"></a><span class="lineno"> 7005</span>&#160; </div>
-<div class="line"><a name="l07006"></a><span class="lineno"> 7006</span>&#160;<span class="keyword">private</span>:</div>
-<div class="line"><a name="l07007"></a><span class="lineno"> 7007</span>&#160;    uint32_t m_Id;</div>
-<div class="line"><a name="l07008"></a><span class="lineno"> 7008</span>&#160;    <span class="keywordtype">char</span>* m_Name;</div>
-<div class="line"><a name="l07009"></a><span class="lineno"> 7009</span>&#160;};</div>
-<div class="line"><a name="l07010"></a><span class="lineno"> 7010</span>&#160; </div>
-<div class="line"><a name="l07011"></a><span class="lineno"> 7011</span>&#160;<span class="comment">/*</span></div>
-<div class="line"><a name="l07012"></a><span class="lineno"> 7012</span>&#160;<span class="comment">Performs defragmentation:</span></div>
-<div class="line"><a name="l07013"></a><span class="lineno"> 7013</span>&#160;<span class="comment"></span> </div>
-<div class="line"><a name="l07014"></a><span class="lineno"> 7014</span>&#160;<span class="comment">- Updates `pBlockVector-&gt;m_pMetadata`.</span></div>
-<div class="line"><a name="l07015"></a><span class="lineno"> 7015</span>&#160;<span class="comment">- Updates allocations by calling ChangeBlockAllocation() or ChangeOffset().</span></div>
-<div class="line"><a name="l07016"></a><span class="lineno"> 7016</span>&#160;<span class="comment">- Does not move actual data, only returns requested moves as `moves`.</span></div>
-<div class="line"><a name="l07017"></a><span class="lineno"> 7017</span>&#160;<span class="comment">*/</span></div>
-<div class="line"><a name="l07018"></a><span class="lineno"> 7018</span>&#160;<span class="keyword">class </span>VmaDefragmentationAlgorithm</div>
-<div class="line"><a name="l07019"></a><span class="lineno"> 7019</span>&#160;{</div>
-<div class="line"><a name="l07020"></a><span class="lineno"> 7020</span>&#160;    VMA_CLASS_NO_COPY(VmaDefragmentationAlgorithm)</div>
-<div class="line"><a name="l07021"></a><span class="lineno"> 7021</span>&#160;<span class="keyword">public</span>:</div>
-<div class="line"><a name="l07022"></a><span class="lineno"> 7022</span>&#160;    VmaDefragmentationAlgorithm(</div>
-<div class="line"><a name="l07023"></a><span class="lineno"> 7023</span>&#160;        <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator,</div>
-<div class="line"><a name="l07024"></a><span class="lineno"> 7024</span>&#160;        VmaBlockVector* pBlockVector,</div>
-<div class="line"><a name="l07025"></a><span class="lineno"> 7025</span>&#160;        uint32_t currentFrameIndex) :</div>
-<div class="line"><a name="l07026"></a><span class="lineno"> 7026</span>&#160;        m_hAllocator(hAllocator),</div>
-<div class="line"><a name="l07027"></a><span class="lineno"> 7027</span>&#160;        m_pBlockVector(pBlockVector),</div>
-<div class="line"><a name="l07028"></a><span class="lineno"> 7028</span>&#160;        m_CurrentFrameIndex(currentFrameIndex)</div>
-<div class="line"><a name="l07029"></a><span class="lineno"> 7029</span>&#160;    {</div>
-<div class="line"><a name="l07030"></a><span class="lineno"> 7030</span>&#160;    }</div>
-<div class="line"><a name="l07031"></a><span class="lineno"> 7031</span>&#160;    <span class="keyword">virtual</span> ~VmaDefragmentationAlgorithm()</div>
-<div class="line"><a name="l07032"></a><span class="lineno"> 7032</span>&#160;    {</div>
-<div class="line"><a name="l07033"></a><span class="lineno"> 7033</span>&#160;    }</div>
-<div class="line"><a name="l07034"></a><span class="lineno"> 7034</span>&#160; </div>
-<div class="line"><a name="l07035"></a><span class="lineno"> 7035</span>&#160;    <span class="keyword">virtual</span> <span class="keywordtype">void</span> AddAllocation(<a class="code" href="struct_vma_allocation.html">VmaAllocation</a> hAlloc, VkBool32* pChanged) = 0;</div>
-<div class="line"><a name="l07036"></a><span class="lineno"> 7036</span>&#160;    <span class="keyword">virtual</span> <span class="keywordtype">void</span> AddAll() = 0;</div>
-<div class="line"><a name="l07037"></a><span class="lineno"> 7037</span>&#160; </div>
-<div class="line"><a name="l07038"></a><span class="lineno"> 7038</span>&#160;    <span class="keyword">virtual</span> VkResult Defragment(</div>
-<div class="line"><a name="l07039"></a><span class="lineno"> 7039</span>&#160;        VmaVector&lt; VmaDefragmentationMove, VmaStlAllocator&lt;VmaDefragmentationMove&gt; &gt;&amp; moves,</div>
-<div class="line"><a name="l07040"></a><span class="lineno"> 7040</span>&#160;        VkDeviceSize maxBytesToMove,</div>
-<div class="line"><a name="l07041"></a><span class="lineno"> 7041</span>&#160;        uint32_t maxAllocationsToMove,</div>
-<div class="line"><a name="l07042"></a><span class="lineno"> 7042</span>&#160;        <a class="code" href="vk__mem__alloc_8h.html#a88a77cef37e5d3c4fc9eb328885d048d">VmaDefragmentationFlags</a> flags) = 0;</div>
-<div class="line"><a name="l07043"></a><span class="lineno"> 7043</span>&#160; </div>
-<div class="line"><a name="l07044"></a><span class="lineno"> 7044</span>&#160;    <span class="keyword">virtual</span> VkDeviceSize GetBytesMoved() <span class="keyword">const</span> = 0;</div>
-<div class="line"><a name="l07045"></a><span class="lineno"> 7045</span>&#160;    <span class="keyword">virtual</span> uint32_t GetAllocationsMoved() <span class="keyword">const</span> = 0;</div>
-<div class="line"><a name="l07046"></a><span class="lineno"> 7046</span>&#160; </div>
-<div class="line"><a name="l07047"></a><span class="lineno"> 7047</span>&#160;<span class="keyword">protected</span>:</div>
-<div class="line"><a name="l07048"></a><span class="lineno"> 7048</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> <span class="keyword">const</span> m_hAllocator;</div>
-<div class="line"><a name="l07049"></a><span class="lineno"> 7049</span>&#160;    VmaBlockVector* <span class="keyword">const</span> m_pBlockVector;</div>
-<div class="line"><a name="l07050"></a><span class="lineno"> 7050</span>&#160;    <span class="keyword">const</span> uint32_t m_CurrentFrameIndex;</div>
-<div class="line"><a name="l07051"></a><span class="lineno"> 7051</span>&#160; </div>
-<div class="line"><a name="l07052"></a><span class="lineno"> 7052</span>&#160;    <span class="keyword">struct </span>AllocationInfo</div>
-<div class="line"><a name="l07053"></a><span class="lineno"> 7053</span>&#160;    {</div>
-<div class="line"><a name="l07054"></a><span class="lineno"> 7054</span>&#160;        <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> m_hAllocation;</div>
-<div class="line"><a name="l07055"></a><span class="lineno"> 7055</span>&#160;        VkBool32* m_pChanged;</div>
-<div class="line"><a name="l07056"></a><span class="lineno"> 7056</span>&#160; </div>
-<div class="line"><a name="l07057"></a><span class="lineno"> 7057</span>&#160;        AllocationInfo() :</div>
-<div class="line"><a name="l07058"></a><span class="lineno"> 7058</span>&#160;            m_hAllocation(VK_NULL_HANDLE),</div>
-<div class="line"><a name="l07059"></a><span class="lineno"> 7059</span>&#160;            m_pChanged(VMA_NULL)</div>
-<div class="line"><a name="l07060"></a><span class="lineno"> 7060</span>&#160;        {</div>
-<div class="line"><a name="l07061"></a><span class="lineno"> 7061</span>&#160;        }</div>
-<div class="line"><a name="l07062"></a><span class="lineno"> 7062</span>&#160;        AllocationInfo(<a class="code" href="struct_vma_allocation.html">VmaAllocation</a> hAlloc, VkBool32* pChanged) :</div>
-<div class="line"><a name="l07063"></a><span class="lineno"> 7063</span>&#160;            m_hAllocation(hAlloc),</div>
-<div class="line"><a name="l07064"></a><span class="lineno"> 7064</span>&#160;            m_pChanged(pChanged)</div>
-<div class="line"><a name="l07065"></a><span class="lineno"> 7065</span>&#160;        {</div>
-<div class="line"><a name="l07066"></a><span class="lineno"> 7066</span>&#160;        }</div>
-<div class="line"><a name="l07067"></a><span class="lineno"> 7067</span>&#160;    };</div>
-<div class="line"><a name="l07068"></a><span class="lineno"> 7068</span>&#160;};</div>
-<div class="line"><a name="l07069"></a><span class="lineno"> 7069</span>&#160; </div>
-<div class="line"><a name="l07070"></a><span class="lineno"> 7070</span>&#160;<span class="keyword">class </span>VmaDefragmentationAlgorithm_Generic : <span class="keyword">public</span> VmaDefragmentationAlgorithm</div>
-<div class="line"><a name="l07071"></a><span class="lineno"> 7071</span>&#160;{</div>
-<div class="line"><a name="l07072"></a><span class="lineno"> 7072</span>&#160;    VMA_CLASS_NO_COPY(VmaDefragmentationAlgorithm_Generic)</div>
-<div class="line"><a name="l07073"></a><span class="lineno"> 7073</span>&#160;<span class="keyword">public</span>:</div>
-<div class="line"><a name="l07074"></a><span class="lineno"> 7074</span>&#160;    VmaDefragmentationAlgorithm_Generic(</div>
-<div class="line"><a name="l07075"></a><span class="lineno"> 7075</span>&#160;        <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator,</div>
-<div class="line"><a name="l07076"></a><span class="lineno"> 7076</span>&#160;        VmaBlockVector* pBlockVector,</div>
-<div class="line"><a name="l07077"></a><span class="lineno"> 7077</span>&#160;        uint32_t currentFrameIndex,</div>
-<div class="line"><a name="l07078"></a><span class="lineno"> 7078</span>&#160;        <span class="keywordtype">bool</span> overlappingMoveSupported);</div>
-<div class="line"><a name="l07079"></a><span class="lineno"> 7079</span>&#160;    <span class="keyword">virtual</span> ~VmaDefragmentationAlgorithm_Generic();</div>
-<div class="line"><a name="l07080"></a><span class="lineno"> 7080</span>&#160; </div>
-<div class="line"><a name="l07081"></a><span class="lineno"> 7081</span>&#160;    <span class="keyword">virtual</span> <span class="keywordtype">void</span> AddAllocation(<a class="code" href="struct_vma_allocation.html">VmaAllocation</a> hAlloc, VkBool32* pChanged);</div>
-<div class="line"><a name="l07082"></a><span class="lineno"> 7082</span>&#160;    <span class="keyword">virtual</span> <span class="keywordtype">void</span> AddAll() { m_AllAllocations = <span class="keyword">true</span>; }</div>
-<div class="line"><a name="l07083"></a><span class="lineno"> 7083</span>&#160; </div>
-<div class="line"><a name="l07084"></a><span class="lineno"> 7084</span>&#160;    <span class="keyword">virtual</span> VkResult Defragment(</div>
-<div class="line"><a name="l07085"></a><span class="lineno"> 7085</span>&#160;        VmaVector&lt; VmaDefragmentationMove, VmaStlAllocator&lt;VmaDefragmentationMove&gt; &gt;&amp; moves,</div>
-<div class="line"><a name="l07086"></a><span class="lineno"> 7086</span>&#160;        VkDeviceSize maxBytesToMove,</div>
-<div class="line"><a name="l07087"></a><span class="lineno"> 7087</span>&#160;        uint32_t maxAllocationsToMove,</div>
-<div class="line"><a name="l07088"></a><span class="lineno"> 7088</span>&#160;        <a class="code" href="vk__mem__alloc_8h.html#a88a77cef37e5d3c4fc9eb328885d048d">VmaDefragmentationFlags</a> flags);</div>
-<div class="line"><a name="l07089"></a><span class="lineno"> 7089</span>&#160; </div>
-<div class="line"><a name="l07090"></a><span class="lineno"> 7090</span>&#160;    <span class="keyword">virtual</span> VkDeviceSize GetBytesMoved()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_BytesMoved; }</div>
-<div class="line"><a name="l07091"></a><span class="lineno"> 7091</span>&#160;    <span class="keyword">virtual</span> uint32_t GetAllocationsMoved()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_AllocationsMoved; }</div>
+<div class="line"><a name="l06963"></a><span class="lineno"> 6963</span>&#160;    <span class="keyword">virtual</span> <span class="keywordtype">void</span> CalcAllocationStatInfo(<a class="code" href="struct_vma_stat_info.html">VmaStatInfo</a>&amp; outInfo) <span class="keyword">const</span>;</div>
+<div class="line"><a name="l06964"></a><span class="lineno"> 6964</span>&#160;    <span class="keyword">virtual</span> <span class="keywordtype">void</span> AddPoolStats(<a class="code" href="struct_vma_pool_stats.html">VmaPoolStats</a>&amp; inoutStats) <span class="keyword">const</span>;</div>
+<div class="line"><a name="l06965"></a><span class="lineno"> 6965</span>&#160; </div>
+<div class="line"><a name="l06966"></a><span class="lineno"> 6966</span>&#160;<span class="preprocessor">#if VMA_STATS_STRING_ENABLED</span></div>
+<div class="line"><a name="l06967"></a><span class="lineno"> 6967</span>&#160;    <span class="keyword">virtual</span> <span class="keywordtype">void</span> PrintDetailedMap(<span class="keyword">class</span> VmaJsonWriter&amp; json) <span class="keyword">const</span>;</div>
+<div class="line"><a name="l06968"></a><span class="lineno"> 6968</span>&#160;<span class="preprocessor">#endif</span></div>
+<div class="line"><a name="l06969"></a><span class="lineno"> 6969</span>&#160; </div>
+<div class="line"><a name="l06970"></a><span class="lineno"> 6970</span>&#160;    <span class="keyword">virtual</span> <span class="keywordtype">bool</span> CreateAllocationRequest(</div>
+<div class="line"><a name="l06971"></a><span class="lineno"> 6971</span>&#160;        uint32_t currentFrameIndex,</div>
+<div class="line"><a name="l06972"></a><span class="lineno"> 6972</span>&#160;        uint32_t frameInUseCount,</div>
+<div class="line"><a name="l06973"></a><span class="lineno"> 6973</span>&#160;        VkDeviceSize bufferImageGranularity,</div>
+<div class="line"><a name="l06974"></a><span class="lineno"> 6974</span>&#160;        VkDeviceSize allocSize,</div>
+<div class="line"><a name="l06975"></a><span class="lineno"> 6975</span>&#160;        VkDeviceSize allocAlignment,</div>
+<div class="line"><a name="l06976"></a><span class="lineno"> 6976</span>&#160;        <span class="keywordtype">bool</span> upperAddress,</div>
+<div class="line"><a name="l06977"></a><span class="lineno"> 6977</span>&#160;        VmaSuballocationType allocType,</div>
+<div class="line"><a name="l06978"></a><span class="lineno"> 6978</span>&#160;        <span class="keywordtype">bool</span> canMakeOtherLost,</div>
+<div class="line"><a name="l06979"></a><span class="lineno"> 6979</span>&#160;        uint32_t strategy,</div>
+<div class="line"><a name="l06980"></a><span class="lineno"> 6980</span>&#160;        VmaAllocationRequest* pAllocationRequest);</div>
+<div class="line"><a name="l06981"></a><span class="lineno"> 6981</span>&#160; </div>
+<div class="line"><a name="l06982"></a><span class="lineno"> 6982</span>&#160;    <span class="keyword">virtual</span> <span class="keywordtype">bool</span> MakeRequestedAllocationsLost(</div>
+<div class="line"><a name="l06983"></a><span class="lineno"> 6983</span>&#160;        uint32_t currentFrameIndex,</div>
+<div class="line"><a name="l06984"></a><span class="lineno"> 6984</span>&#160;        uint32_t frameInUseCount,</div>
+<div class="line"><a name="l06985"></a><span class="lineno"> 6985</span>&#160;        VmaAllocationRequest* pAllocationRequest);</div>
+<div class="line"><a name="l06986"></a><span class="lineno"> 6986</span>&#160; </div>
+<div class="line"><a name="l06987"></a><span class="lineno"> 6987</span>&#160;    <span class="keyword">virtual</span> uint32_t MakeAllocationsLost(uint32_t currentFrameIndex, uint32_t frameInUseCount);</div>
+<div class="line"><a name="l06988"></a><span class="lineno"> 6988</span>&#160; </div>
+<div class="line"><a name="l06989"></a><span class="lineno"> 6989</span>&#160;    <span class="keyword">virtual</span> VkResult CheckCorruption(<span class="keyword">const</span> <span class="keywordtype">void</span>* pBlockData);</div>
+<div class="line"><a name="l06990"></a><span class="lineno"> 6990</span>&#160; </div>
+<div class="line"><a name="l06991"></a><span class="lineno"> 6991</span>&#160;    <span class="keyword">virtual</span> <span class="keywordtype">void</span> Alloc(</div>
+<div class="line"><a name="l06992"></a><span class="lineno"> 6992</span>&#160;        <span class="keyword">const</span> VmaAllocationRequest&amp; request,</div>
+<div class="line"><a name="l06993"></a><span class="lineno"> 6993</span>&#160;        VmaSuballocationType type,</div>
+<div class="line"><a name="l06994"></a><span class="lineno"> 6994</span>&#160;        VkDeviceSize allocSize,</div>
+<div class="line"><a name="l06995"></a><span class="lineno"> 6995</span>&#160;        <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> hAllocation);</div>
+<div class="line"><a name="l06996"></a><span class="lineno"> 6996</span>&#160; </div>
+<div class="line"><a name="l06997"></a><span class="lineno"> 6997</span>&#160;    <span class="keyword">virtual</span> <span class="keywordtype">void</span> Free(<span class="keyword">const</span> <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation);</div>
+<div class="line"><a name="l06998"></a><span class="lineno"> 6998</span>&#160;    <span class="keyword">virtual</span> <span class="keywordtype">void</span> FreeAtOffset(VkDeviceSize offset);</div>
+<div class="line"><a name="l06999"></a><span class="lineno"> 6999</span>&#160; </div>
+<div class="line"><a name="l07000"></a><span class="lineno"> 7000</span>&#160;<span class="keyword">private</span>:</div>
+<div class="line"><a name="l07001"></a><span class="lineno"> 7001</span>&#160;    <span class="comment">/*</span></div>
+<div class="line"><a name="l07002"></a><span class="lineno"> 7002</span>&#160;<span class="comment">    There are two suballocation vectors, used in ping-pong way.</span></div>
+<div class="line"><a name="l07003"></a><span class="lineno"> 7003</span>&#160;<span class="comment">    The one with index m_1stVectorIndex is called 1st.</span></div>
+<div class="line"><a name="l07004"></a><span class="lineno"> 7004</span>&#160;<span class="comment">    The one with index (m_1stVectorIndex ^ 1) is called 2nd.</span></div>
+<div class="line"><a name="l07005"></a><span class="lineno"> 7005</span>&#160;<span class="comment">    2nd can be non-empty only when 1st is not empty.</span></div>
+<div class="line"><a name="l07006"></a><span class="lineno"> 7006</span>&#160;<span class="comment">    When 2nd is not empty, m_2ndVectorMode indicates its mode of operation.</span></div>
+<div class="line"><a name="l07007"></a><span class="lineno"> 7007</span>&#160;<span class="comment">    */</span></div>
+<div class="line"><a name="l07008"></a><span class="lineno"> 7008</span>&#160;    <span class="keyword">typedef</span> VmaVector&lt; VmaSuballocation, VmaStlAllocator&lt;VmaSuballocation&gt; &gt; SuballocationVectorType;</div>
+<div class="line"><a name="l07009"></a><span class="lineno"> 7009</span>&#160; </div>
+<div class="line"><a name="l07010"></a><span class="lineno"> 7010</span>&#160;    <span class="keyword">enum</span> SECOND_VECTOR_MODE</div>
+<div class="line"><a name="l07011"></a><span class="lineno"> 7011</span>&#160;    {</div>
+<div class="line"><a name="l07012"></a><span class="lineno"> 7012</span>&#160;        SECOND_VECTOR_EMPTY,</div>
+<div class="line"><a name="l07013"></a><span class="lineno"> 7013</span>&#160;        <span class="comment">/*</span></div>
+<div class="line"><a name="l07014"></a><span class="lineno"> 7014</span>&#160;<span class="comment">        Suballocations in 2nd vector are created later than the ones in 1st, but they</span></div>
+<div class="line"><a name="l07015"></a><span class="lineno"> 7015</span>&#160;<span class="comment">        all have smaller offset.</span></div>
+<div class="line"><a name="l07016"></a><span class="lineno"> 7016</span>&#160;<span class="comment">        */</span></div>
+<div class="line"><a name="l07017"></a><span class="lineno"> 7017</span>&#160;        SECOND_VECTOR_RING_BUFFER,</div>
+<div class="line"><a name="l07018"></a><span class="lineno"> 7018</span>&#160;        <span class="comment">/*</span></div>
+<div class="line"><a name="l07019"></a><span class="lineno"> 7019</span>&#160;<span class="comment">        Suballocations in 2nd vector are upper side of double stack.</span></div>
+<div class="line"><a name="l07020"></a><span class="lineno"> 7020</span>&#160;<span class="comment">        They all have offsets higher than those in 1st vector.</span></div>
+<div class="line"><a name="l07021"></a><span class="lineno"> 7021</span>&#160;<span class="comment">        Top of this stack means smaller offsets, but higher indices in this vector.</span></div>
+<div class="line"><a name="l07022"></a><span class="lineno"> 7022</span>&#160;<span class="comment">        */</span></div>
+<div class="line"><a name="l07023"></a><span class="lineno"> 7023</span>&#160;        SECOND_VECTOR_DOUBLE_STACK,</div>
+<div class="line"><a name="l07024"></a><span class="lineno"> 7024</span>&#160;    };</div>
+<div class="line"><a name="l07025"></a><span class="lineno"> 7025</span>&#160; </div>
+<div class="line"><a name="l07026"></a><span class="lineno"> 7026</span>&#160;    VkDeviceSize m_SumFreeSize;</div>
+<div class="line"><a name="l07027"></a><span class="lineno"> 7027</span>&#160;    SuballocationVectorType m_Suballocations0, m_Suballocations1;</div>
+<div class="line"><a name="l07028"></a><span class="lineno"> 7028</span>&#160;    uint32_t m_1stVectorIndex;</div>
+<div class="line"><a name="l07029"></a><span class="lineno"> 7029</span>&#160;    SECOND_VECTOR_MODE m_2ndVectorMode;</div>
+<div class="line"><a name="l07030"></a><span class="lineno"> 7030</span>&#160; </div>
+<div class="line"><a name="l07031"></a><span class="lineno"> 7031</span>&#160;    SuballocationVectorType&amp; AccessSuballocations1st() { <span class="keywordflow">return</span> m_1stVectorIndex ? m_Suballocations1 : m_Suballocations0; }</div>
+<div class="line"><a name="l07032"></a><span class="lineno"> 7032</span>&#160;    SuballocationVectorType&amp; AccessSuballocations2nd() { <span class="keywordflow">return</span> m_1stVectorIndex ? m_Suballocations0 : m_Suballocations1; }</div>
+<div class="line"><a name="l07033"></a><span class="lineno"> 7033</span>&#160;    <span class="keyword">const</span> SuballocationVectorType&amp; AccessSuballocations1st()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_1stVectorIndex ? m_Suballocations1 : m_Suballocations0; }</div>
+<div class="line"><a name="l07034"></a><span class="lineno"> 7034</span>&#160;    <span class="keyword">const</span> SuballocationVectorType&amp; AccessSuballocations2nd()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_1stVectorIndex ? m_Suballocations0 : m_Suballocations1; }</div>
+<div class="line"><a name="l07035"></a><span class="lineno"> 7035</span>&#160; </div>
+<div class="line"><a name="l07036"></a><span class="lineno"> 7036</span>&#160;    <span class="comment">// Number of items in 1st vector with hAllocation = null at the beginning.</span></div>
+<div class="line"><a name="l07037"></a><span class="lineno"> 7037</span>&#160;    <span class="keywordtype">size_t</span> m_1stNullItemsBeginCount;</div>
+<div class="line"><a name="l07038"></a><span class="lineno"> 7038</span>&#160;    <span class="comment">// Number of other items in 1st vector with hAllocation = null somewhere in the middle.</span></div>
+<div class="line"><a name="l07039"></a><span class="lineno"> 7039</span>&#160;    <span class="keywordtype">size_t</span> m_1stNullItemsMiddleCount;</div>
+<div class="line"><a name="l07040"></a><span class="lineno"> 7040</span>&#160;    <span class="comment">// Number of items in 2nd vector with hAllocation = null.</span></div>
+<div class="line"><a name="l07041"></a><span class="lineno"> 7041</span>&#160;    <span class="keywordtype">size_t</span> m_2ndNullItemsCount;</div>
+<div class="line"><a name="l07042"></a><span class="lineno"> 7042</span>&#160; </div>
+<div class="line"><a name="l07043"></a><span class="lineno"> 7043</span>&#160;    <span class="keywordtype">bool</span> ShouldCompact1st() <span class="keyword">const</span>;</div>
+<div class="line"><a name="l07044"></a><span class="lineno"> 7044</span>&#160;    <span class="keywordtype">void</span> CleanupAfterFree();</div>
+<div class="line"><a name="l07045"></a><span class="lineno"> 7045</span>&#160; </div>
+<div class="line"><a name="l07046"></a><span class="lineno"> 7046</span>&#160;    <span class="keywordtype">bool</span> CreateAllocationRequest_LowerAddress(</div>
+<div class="line"><a name="l07047"></a><span class="lineno"> 7047</span>&#160;        uint32_t currentFrameIndex,</div>
+<div class="line"><a name="l07048"></a><span class="lineno"> 7048</span>&#160;        uint32_t frameInUseCount,</div>
+<div class="line"><a name="l07049"></a><span class="lineno"> 7049</span>&#160;        VkDeviceSize bufferImageGranularity,</div>
+<div class="line"><a name="l07050"></a><span class="lineno"> 7050</span>&#160;        VkDeviceSize allocSize,</div>
+<div class="line"><a name="l07051"></a><span class="lineno"> 7051</span>&#160;        VkDeviceSize allocAlignment,</div>
+<div class="line"><a name="l07052"></a><span class="lineno"> 7052</span>&#160;        VmaSuballocationType allocType,</div>
+<div class="line"><a name="l07053"></a><span class="lineno"> 7053</span>&#160;        <span class="keywordtype">bool</span> canMakeOtherLost,</div>
+<div class="line"><a name="l07054"></a><span class="lineno"> 7054</span>&#160;        uint32_t strategy,</div>
+<div class="line"><a name="l07055"></a><span class="lineno"> 7055</span>&#160;        VmaAllocationRequest* pAllocationRequest);</div>
+<div class="line"><a name="l07056"></a><span class="lineno"> 7056</span>&#160;    <span class="keywordtype">bool</span> CreateAllocationRequest_UpperAddress(</div>
+<div class="line"><a name="l07057"></a><span class="lineno"> 7057</span>&#160;        uint32_t currentFrameIndex,</div>
+<div class="line"><a name="l07058"></a><span class="lineno"> 7058</span>&#160;        uint32_t frameInUseCount,</div>
+<div class="line"><a name="l07059"></a><span class="lineno"> 7059</span>&#160;        VkDeviceSize bufferImageGranularity,</div>
+<div class="line"><a name="l07060"></a><span class="lineno"> 7060</span>&#160;        VkDeviceSize allocSize,</div>
+<div class="line"><a name="l07061"></a><span class="lineno"> 7061</span>&#160;        VkDeviceSize allocAlignment,</div>
+<div class="line"><a name="l07062"></a><span class="lineno"> 7062</span>&#160;        VmaSuballocationType allocType,</div>
+<div class="line"><a name="l07063"></a><span class="lineno"> 7063</span>&#160;        <span class="keywordtype">bool</span> canMakeOtherLost,</div>
+<div class="line"><a name="l07064"></a><span class="lineno"> 7064</span>&#160;        uint32_t strategy,</div>
+<div class="line"><a name="l07065"></a><span class="lineno"> 7065</span>&#160;        VmaAllocationRequest* pAllocationRequest);</div>
+<div class="line"><a name="l07066"></a><span class="lineno"> 7066</span>&#160;};</div>
+<div class="line"><a name="l07067"></a><span class="lineno"> 7067</span>&#160; </div>
+<div class="line"><a name="l07068"></a><span class="lineno"> 7068</span>&#160;<span class="comment">/*</span></div>
+<div class="line"><a name="l07069"></a><span class="lineno"> 7069</span>&#160;<span class="comment">- GetSize() is the original size of allocated memory block.</span></div>
+<div class="line"><a name="l07070"></a><span class="lineno"> 7070</span>&#160;<span class="comment">- m_UsableSize is this size aligned down to a power of two.</span></div>
+<div class="line"><a name="l07071"></a><span class="lineno"> 7071</span>&#160;<span class="comment">  All allocations and calculations happen relative to m_UsableSize.</span></div>
+<div class="line"><a name="l07072"></a><span class="lineno"> 7072</span>&#160;<span class="comment">- GetUnusableSize() is the difference between them.</span></div>
+<div class="line"><a name="l07073"></a><span class="lineno"> 7073</span>&#160;<span class="comment">  It is reported as separate, unused range, not available for allocations.</span></div>
+<div class="line"><a name="l07074"></a><span class="lineno"> 7074</span>&#160;<span class="comment"></span> </div>
+<div class="line"><a name="l07075"></a><span class="lineno"> 7075</span>&#160;<span class="comment">Node at level 0 has size = m_UsableSize.</span></div>
+<div class="line"><a name="l07076"></a><span class="lineno"> 7076</span>&#160;<span class="comment">Each next level contains nodes with size 2 times smaller than current level.</span></div>
+<div class="line"><a name="l07077"></a><span class="lineno"> 7077</span>&#160;<span class="comment">m_LevelCount is the maximum number of levels to use in the current object.</span></div>
+<div class="line"><a name="l07078"></a><span class="lineno"> 7078</span>&#160;<span class="comment">*/</span></div>
+<div class="line"><a name="l07079"></a><span class="lineno"> 7079</span>&#160;<span class="keyword">class </span>VmaBlockMetadata_Buddy : <span class="keyword">public</span> VmaBlockMetadata</div>
+<div class="line"><a name="l07080"></a><span class="lineno"> 7080</span>&#160;{</div>
+<div class="line"><a name="l07081"></a><span class="lineno"> 7081</span>&#160;    VMA_CLASS_NO_COPY(VmaBlockMetadata_Buddy)</div>
+<div class="line"><a name="l07082"></a><span class="lineno"> 7082</span>&#160;<span class="keyword">public</span>:</div>
+<div class="line"><a name="l07083"></a><span class="lineno"> 7083</span>&#160;    VmaBlockMetadata_Buddy(<a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator);</div>
+<div class="line"><a name="l07084"></a><span class="lineno"> 7084</span>&#160;    <span class="keyword">virtual</span> ~VmaBlockMetadata_Buddy();</div>
+<div class="line"><a name="l07085"></a><span class="lineno"> 7085</span>&#160;    <span class="keyword">virtual</span> <span class="keywordtype">void</span> Init(VkDeviceSize size);</div>
+<div class="line"><a name="l07086"></a><span class="lineno"> 7086</span>&#160; </div>
+<div class="line"><a name="l07087"></a><span class="lineno"> 7087</span>&#160;    <span class="keyword">virtual</span> <span class="keywordtype">bool</span> Validate() <span class="keyword">const</span>;</div>
+<div class="line"><a name="l07088"></a><span class="lineno"> 7088</span>&#160;    <span class="keyword">virtual</span> <span class="keywordtype">size_t</span> GetAllocationCount()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_AllocationCount; }</div>
+<div class="line"><a name="l07089"></a><span class="lineno"> 7089</span>&#160;    <span class="keyword">virtual</span> VkDeviceSize GetSumFreeSize()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_SumFreeSize + GetUnusableSize(); }</div>
+<div class="line"><a name="l07090"></a><span class="lineno"> 7090</span>&#160;    <span class="keyword">virtual</span> VkDeviceSize GetUnusedRangeSizeMax() <span class="keyword">const</span>;</div>
+<div class="line"><a name="l07091"></a><span class="lineno"> 7091</span>&#160;    <span class="keyword">virtual</span> <span class="keywordtype">bool</span> IsEmpty()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_Root-&gt;type == Node::TYPE_FREE; }</div>
 <div class="line"><a name="l07092"></a><span class="lineno"> 7092</span>&#160; </div>
-<div class="line"><a name="l07093"></a><span class="lineno"> 7093</span>&#160;<span class="keyword">private</span>:</div>
-<div class="line"><a name="l07094"></a><span class="lineno"> 7094</span>&#160;    uint32_t m_AllocationCount;</div>
-<div class="line"><a name="l07095"></a><span class="lineno"> 7095</span>&#160;    <span class="keywordtype">bool</span> m_AllAllocations;</div>
-<div class="line"><a name="l07096"></a><span class="lineno"> 7096</span>&#160; </div>
-<div class="line"><a name="l07097"></a><span class="lineno"> 7097</span>&#160;    VkDeviceSize m_BytesMoved;</div>
-<div class="line"><a name="l07098"></a><span class="lineno"> 7098</span>&#160;    uint32_t m_AllocationsMoved;</div>
+<div class="line"><a name="l07093"></a><span class="lineno"> 7093</span>&#160;    <span class="keyword">virtual</span> <span class="keywordtype">void</span> CalcAllocationStatInfo(<a class="code" href="struct_vma_stat_info.html">VmaStatInfo</a>&amp; outInfo) <span class="keyword">const</span>;</div>
+<div class="line"><a name="l07094"></a><span class="lineno"> 7094</span>&#160;    <span class="keyword">virtual</span> <span class="keywordtype">void</span> AddPoolStats(<a class="code" href="struct_vma_pool_stats.html">VmaPoolStats</a>&amp; inoutStats) <span class="keyword">const</span>;</div>
+<div class="line"><a name="l07095"></a><span class="lineno"> 7095</span>&#160; </div>
+<div class="line"><a name="l07096"></a><span class="lineno"> 7096</span>&#160;<span class="preprocessor">#if VMA_STATS_STRING_ENABLED</span></div>
+<div class="line"><a name="l07097"></a><span class="lineno"> 7097</span>&#160;    <span class="keyword">virtual</span> <span class="keywordtype">void</span> PrintDetailedMap(<span class="keyword">class</span> VmaJsonWriter&amp; json) <span class="keyword">const</span>;</div>
+<div class="line"><a name="l07098"></a><span class="lineno"> 7098</span>&#160;<span class="preprocessor">#endif</span></div>
 <div class="line"><a name="l07099"></a><span class="lineno"> 7099</span>&#160; </div>
-<div class="line"><a name="l07100"></a><span class="lineno"> 7100</span>&#160;    <span class="keyword">struct </span>AllocationInfoSizeGreater</div>
-<div class="line"><a name="l07101"></a><span class="lineno"> 7101</span>&#160;    {</div>
-<div class="line"><a name="l07102"></a><span class="lineno"> 7102</span>&#160;        <span class="keywordtype">bool</span> operator()(<span class="keyword">const</span> AllocationInfo&amp; lhs, <span class="keyword">const</span> AllocationInfo&amp; rhs)<span class="keyword"> const</span></div>
-<div class="line"><a name="l07103"></a><span class="lineno"> 7103</span>&#160;<span class="keyword">        </span>{</div>
-<div class="line"><a name="l07104"></a><span class="lineno"> 7104</span>&#160;            <span class="keywordflow">return</span> lhs.m_hAllocation-&gt;GetSize() &gt; rhs.m_hAllocation-&gt;GetSize();</div>
-<div class="line"><a name="l07105"></a><span class="lineno"> 7105</span>&#160;        }</div>
-<div class="line"><a name="l07106"></a><span class="lineno"> 7106</span>&#160;    };</div>
-<div class="line"><a name="l07107"></a><span class="lineno"> 7107</span>&#160; </div>
-<div class="line"><a name="l07108"></a><span class="lineno"> 7108</span>&#160;    <span class="keyword">struct </span>AllocationInfoOffsetGreater</div>
-<div class="line"><a name="l07109"></a><span class="lineno"> 7109</span>&#160;    {</div>
-<div class="line"><a name="l07110"></a><span class="lineno"> 7110</span>&#160;        <span class="keywordtype">bool</span> operator()(<span class="keyword">const</span> AllocationInfo&amp; lhs, <span class="keyword">const</span> AllocationInfo&amp; rhs)<span class="keyword"> const</span></div>
-<div class="line"><a name="l07111"></a><span class="lineno"> 7111</span>&#160;<span class="keyword">        </span>{</div>
-<div class="line"><a name="l07112"></a><span class="lineno"> 7112</span>&#160;            <span class="keywordflow">return</span> lhs.m_hAllocation-&gt;GetOffset() &gt; rhs.m_hAllocation-&gt;GetOffset();</div>
-<div class="line"><a name="l07113"></a><span class="lineno"> 7113</span>&#160;        }</div>
-<div class="line"><a name="l07114"></a><span class="lineno"> 7114</span>&#160;    };</div>
-<div class="line"><a name="l07115"></a><span class="lineno"> 7115</span>&#160; </div>
-<div class="line"><a name="l07116"></a><span class="lineno"> 7116</span>&#160;    <span class="keyword">struct </span>BlockInfo</div>
-<div class="line"><a name="l07117"></a><span class="lineno"> 7117</span>&#160;    {</div>
-<div class="line"><a name="l07118"></a><span class="lineno"> 7118</span>&#160;        <span class="keywordtype">size_t</span> m_OriginalBlockIndex;</div>
-<div class="line"><a name="l07119"></a><span class="lineno"> 7119</span>&#160;        VmaDeviceMemoryBlock* m_pBlock;</div>
-<div class="line"><a name="l07120"></a><span class="lineno"> 7120</span>&#160;        <span class="keywordtype">bool</span> m_HasNonMovableAllocations;</div>
-<div class="line"><a name="l07121"></a><span class="lineno"> 7121</span>&#160;        VmaVector&lt; AllocationInfo, VmaStlAllocator&lt;AllocationInfo&gt; &gt; m_Allocations;</div>
-<div class="line"><a name="l07122"></a><span class="lineno"> 7122</span>&#160; </div>
-<div class="line"><a name="l07123"></a><span class="lineno"> 7123</span>&#160;        BlockInfo(<span class="keyword">const</span> VkAllocationCallbacks* pAllocationCallbacks) :</div>
-<div class="line"><a name="l07124"></a><span class="lineno"> 7124</span>&#160;            m_OriginalBlockIndex(SIZE_MAX),</div>
-<div class="line"><a name="l07125"></a><span class="lineno"> 7125</span>&#160;            m_pBlock(VMA_NULL),</div>
-<div class="line"><a name="l07126"></a><span class="lineno"> 7126</span>&#160;            m_HasNonMovableAllocations(true),</div>
-<div class="line"><a name="l07127"></a><span class="lineno"> 7127</span>&#160;            m_Allocations(pAllocationCallbacks)</div>
-<div class="line"><a name="l07128"></a><span class="lineno"> 7128</span>&#160;        {</div>
-<div class="line"><a name="l07129"></a><span class="lineno"> 7129</span>&#160;        }</div>
-<div class="line"><a name="l07130"></a><span class="lineno"> 7130</span>&#160; </div>
-<div class="line"><a name="l07131"></a><span class="lineno"> 7131</span>&#160;        <span class="keywordtype">void</span> CalcHasNonMovableAllocations()</div>
-<div class="line"><a name="l07132"></a><span class="lineno"> 7132</span>&#160;        {</div>
-<div class="line"><a name="l07133"></a><span class="lineno"> 7133</span>&#160;            <span class="keyword">const</span> <span class="keywordtype">size_t</span> blockAllocCount = m_pBlock-&gt;m_pMetadata-&gt;GetAllocationCount();</div>
-<div class="line"><a name="l07134"></a><span class="lineno"> 7134</span>&#160;            <span class="keyword">const</span> <span class="keywordtype">size_t</span> defragmentAllocCount = m_Allocations.size();</div>
-<div class="line"><a name="l07135"></a><span class="lineno"> 7135</span>&#160;            m_HasNonMovableAllocations = blockAllocCount != defragmentAllocCount;</div>
-<div class="line"><a name="l07136"></a><span class="lineno"> 7136</span>&#160;        }</div>
-<div class="line"><a name="l07137"></a><span class="lineno"> 7137</span>&#160; </div>
-<div class="line"><a name="l07138"></a><span class="lineno"> 7138</span>&#160;        <span class="keywordtype">void</span> SortAllocationsBySizeDescending()</div>
-<div class="line"><a name="l07139"></a><span class="lineno"> 7139</span>&#160;        {</div>
-<div class="line"><a name="l07140"></a><span class="lineno"> 7140</span>&#160;            VMA_SORT(m_Allocations.begin(), m_Allocations.end(), AllocationInfoSizeGreater());</div>
-<div class="line"><a name="l07141"></a><span class="lineno"> 7141</span>&#160;        }</div>
-<div class="line"><a name="l07142"></a><span class="lineno"> 7142</span>&#160; </div>
-<div class="line"><a name="l07143"></a><span class="lineno"> 7143</span>&#160;        <span class="keywordtype">void</span> SortAllocationsByOffsetDescending()</div>
-<div class="line"><a name="l07144"></a><span class="lineno"> 7144</span>&#160;        {</div>
-<div class="line"><a name="l07145"></a><span class="lineno"> 7145</span>&#160;            VMA_SORT(m_Allocations.begin(), m_Allocations.end(), AllocationInfoOffsetGreater());</div>
-<div class="line"><a name="l07146"></a><span class="lineno"> 7146</span>&#160;        }</div>
-<div class="line"><a name="l07147"></a><span class="lineno"> 7147</span>&#160;    };</div>
-<div class="line"><a name="l07148"></a><span class="lineno"> 7148</span>&#160; </div>
-<div class="line"><a name="l07149"></a><span class="lineno"> 7149</span>&#160;    <span class="keyword">struct </span>BlockPointerLess</div>
-<div class="line"><a name="l07150"></a><span class="lineno"> 7150</span>&#160;    {</div>
-<div class="line"><a name="l07151"></a><span class="lineno"> 7151</span>&#160;        <span class="keywordtype">bool</span> operator()(<span class="keyword">const</span> BlockInfo* pLhsBlockInfo, <span class="keyword">const</span> VmaDeviceMemoryBlock* pRhsBlock)<span class="keyword"> const</span></div>
-<div class="line"><a name="l07152"></a><span class="lineno"> 7152</span>&#160;<span class="keyword">        </span>{</div>
-<div class="line"><a name="l07153"></a><span class="lineno"> 7153</span>&#160;            <span class="keywordflow">return</span> pLhsBlockInfo-&gt;m_pBlock &lt; pRhsBlock;</div>
-<div class="line"><a name="l07154"></a><span class="lineno"> 7154</span>&#160;        }</div>
-<div class="line"><a name="l07155"></a><span class="lineno"> 7155</span>&#160;        <span class="keywordtype">bool</span> operator()(<span class="keyword">const</span> BlockInfo* pLhsBlockInfo, <span class="keyword">const</span> BlockInfo* pRhsBlockInfo)<span class="keyword"> const</span></div>
-<div class="line"><a name="l07156"></a><span class="lineno"> 7156</span>&#160;<span class="keyword">        </span>{</div>
-<div class="line"><a name="l07157"></a><span class="lineno"> 7157</span>&#160;            <span class="keywordflow">return</span> pLhsBlockInfo-&gt;m_pBlock &lt; pRhsBlockInfo-&gt;m_pBlock;</div>
-<div class="line"><a name="l07158"></a><span class="lineno"> 7158</span>&#160;        }</div>
-<div class="line"><a name="l07159"></a><span class="lineno"> 7159</span>&#160;    };</div>
-<div class="line"><a name="l07160"></a><span class="lineno"> 7160</span>&#160; </div>
-<div class="line"><a name="l07161"></a><span class="lineno"> 7161</span>&#160;    <span class="comment">// 1. Blocks with some non-movable allocations go first.</span></div>
-<div class="line"><a name="l07162"></a><span class="lineno"> 7162</span>&#160;    <span class="comment">// 2. Blocks with smaller sumFreeSize go first.</span></div>
-<div class="line"><a name="l07163"></a><span class="lineno"> 7163</span>&#160;    <span class="keyword">struct </span>BlockInfoCompareMoveDestination</div>
-<div class="line"><a name="l07164"></a><span class="lineno"> 7164</span>&#160;    {</div>
-<div class="line"><a name="l07165"></a><span class="lineno"> 7165</span>&#160;        <span class="keywordtype">bool</span> operator()(<span class="keyword">const</span> BlockInfo* pLhsBlockInfo, <span class="keyword">const</span> BlockInfo* pRhsBlockInfo)<span class="keyword"> const</span></div>
-<div class="line"><a name="l07166"></a><span class="lineno"> 7166</span>&#160;<span class="keyword">        </span>{</div>
-<div class="line"><a name="l07167"></a><span class="lineno"> 7167</span>&#160;            <span class="keywordflow">if</span>(pLhsBlockInfo-&gt;m_HasNonMovableAllocations &amp;&amp; !pRhsBlockInfo-&gt;m_HasNonMovableAllocations)</div>
-<div class="line"><a name="l07168"></a><span class="lineno"> 7168</span>&#160;            {</div>
-<div class="line"><a name="l07169"></a><span class="lineno"> 7169</span>&#160;                <span class="keywordflow">return</span> <span class="keyword">true</span>;</div>
-<div class="line"><a name="l07170"></a><span class="lineno"> 7170</span>&#160;            }</div>
-<div class="line"><a name="l07171"></a><span class="lineno"> 7171</span>&#160;            <span class="keywordflow">if</span>(!pLhsBlockInfo-&gt;m_HasNonMovableAllocations &amp;&amp; pRhsBlockInfo-&gt;m_HasNonMovableAllocations)</div>
-<div class="line"><a name="l07172"></a><span class="lineno"> 7172</span>&#160;            {</div>
-<div class="line"><a name="l07173"></a><span class="lineno"> 7173</span>&#160;                <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
-<div class="line"><a name="l07174"></a><span class="lineno"> 7174</span>&#160;            }</div>
-<div class="line"><a name="l07175"></a><span class="lineno"> 7175</span>&#160;            <span class="keywordflow">if</span>(pLhsBlockInfo-&gt;m_pBlock-&gt;m_pMetadata-&gt;GetSumFreeSize() &lt; pRhsBlockInfo-&gt;m_pBlock-&gt;m_pMetadata-&gt;GetSumFreeSize())</div>
-<div class="line"><a name="l07176"></a><span class="lineno"> 7176</span>&#160;            {</div>
-<div class="line"><a name="l07177"></a><span class="lineno"> 7177</span>&#160;                <span class="keywordflow">return</span> <span class="keyword">true</span>;</div>
-<div class="line"><a name="l07178"></a><span class="lineno"> 7178</span>&#160;            }</div>
-<div class="line"><a name="l07179"></a><span class="lineno"> 7179</span>&#160;            <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
-<div class="line"><a name="l07180"></a><span class="lineno"> 7180</span>&#160;        }</div>
-<div class="line"><a name="l07181"></a><span class="lineno"> 7181</span>&#160;    };</div>
-<div class="line"><a name="l07182"></a><span class="lineno"> 7182</span>&#160; </div>
-<div class="line"><a name="l07183"></a><span class="lineno"> 7183</span>&#160;    <span class="keyword">typedef</span> VmaVector&lt; BlockInfo*, VmaStlAllocator&lt;BlockInfo*&gt; &gt; BlockInfoVector;</div>
-<div class="line"><a name="l07184"></a><span class="lineno"> 7184</span>&#160;    BlockInfoVector m_Blocks;</div>
-<div class="line"><a name="l07185"></a><span class="lineno"> 7185</span>&#160; </div>
-<div class="line"><a name="l07186"></a><span class="lineno"> 7186</span>&#160;    VkResult DefragmentRound(</div>
-<div class="line"><a name="l07187"></a><span class="lineno"> 7187</span>&#160;        VmaVector&lt; VmaDefragmentationMove, VmaStlAllocator&lt;VmaDefragmentationMove&gt; &gt;&amp; moves,</div>
-<div class="line"><a name="l07188"></a><span class="lineno"> 7188</span>&#160;        VkDeviceSize maxBytesToMove,</div>
-<div class="line"><a name="l07189"></a><span class="lineno"> 7189</span>&#160;        uint32_t maxAllocationsToMove,</div>
-<div class="line"><a name="l07190"></a><span class="lineno"> 7190</span>&#160;        <span class="keywordtype">bool</span> freeOldAllocations);</div>
-<div class="line"><a name="l07191"></a><span class="lineno"> 7191</span>&#160; </div>
-<div class="line"><a name="l07192"></a><span class="lineno"> 7192</span>&#160;    <span class="keywordtype">size_t</span> CalcBlocksWithNonMovableCount() <span class="keyword">const</span>;</div>
-<div class="line"><a name="l07193"></a><span class="lineno"> 7193</span>&#160; </div>
-<div class="line"><a name="l07194"></a><span class="lineno"> 7194</span>&#160;    <span class="keyword">static</span> <span class="keywordtype">bool</span> MoveMakesSense(</div>
-<div class="line"><a name="l07195"></a><span class="lineno"> 7195</span>&#160;        <span class="keywordtype">size_t</span> dstBlockIndex, VkDeviceSize dstOffset,</div>
-<div class="line"><a name="l07196"></a><span class="lineno"> 7196</span>&#160;        <span class="keywordtype">size_t</span> srcBlockIndex, VkDeviceSize srcOffset);</div>
-<div class="line"><a name="l07197"></a><span class="lineno"> 7197</span>&#160;};</div>
-<div class="line"><a name="l07198"></a><span class="lineno"> 7198</span>&#160; </div>
-<div class="line"><a name="l07199"></a><span class="lineno"> 7199</span>&#160;<span class="keyword">class </span>VmaDefragmentationAlgorithm_Fast : <span class="keyword">public</span> VmaDefragmentationAlgorithm</div>
-<div class="line"><a name="l07200"></a><span class="lineno"> 7200</span>&#160;{</div>
-<div class="line"><a name="l07201"></a><span class="lineno"> 7201</span>&#160;    VMA_CLASS_NO_COPY(VmaDefragmentationAlgorithm_Fast)</div>
-<div class="line"><a name="l07202"></a><span class="lineno"> 7202</span>&#160;<span class="keyword">public</span>:</div>
-<div class="line"><a name="l07203"></a><span class="lineno"> 7203</span>&#160;    VmaDefragmentationAlgorithm_Fast(</div>
-<div class="line"><a name="l07204"></a><span class="lineno"> 7204</span>&#160;        <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator,</div>
-<div class="line"><a name="l07205"></a><span class="lineno"> 7205</span>&#160;        VmaBlockVector* pBlockVector,</div>
-<div class="line"><a name="l07206"></a><span class="lineno"> 7206</span>&#160;        uint32_t currentFrameIndex,</div>
-<div class="line"><a name="l07207"></a><span class="lineno"> 7207</span>&#160;        <span class="keywordtype">bool</span> overlappingMoveSupported);</div>
-<div class="line"><a name="l07208"></a><span class="lineno"> 7208</span>&#160;    <span class="keyword">virtual</span> ~VmaDefragmentationAlgorithm_Fast();</div>
+<div class="line"><a name="l07100"></a><span class="lineno"> 7100</span>&#160;    <span class="keyword">virtual</span> <span class="keywordtype">bool</span> CreateAllocationRequest(</div>
+<div class="line"><a name="l07101"></a><span class="lineno"> 7101</span>&#160;        uint32_t currentFrameIndex,</div>
+<div class="line"><a name="l07102"></a><span class="lineno"> 7102</span>&#160;        uint32_t frameInUseCount,</div>
+<div class="line"><a name="l07103"></a><span class="lineno"> 7103</span>&#160;        VkDeviceSize bufferImageGranularity,</div>
+<div class="line"><a name="l07104"></a><span class="lineno"> 7104</span>&#160;        VkDeviceSize allocSize,</div>
+<div class="line"><a name="l07105"></a><span class="lineno"> 7105</span>&#160;        VkDeviceSize allocAlignment,</div>
+<div class="line"><a name="l07106"></a><span class="lineno"> 7106</span>&#160;        <span class="keywordtype">bool</span> upperAddress,</div>
+<div class="line"><a name="l07107"></a><span class="lineno"> 7107</span>&#160;        VmaSuballocationType allocType,</div>
+<div class="line"><a name="l07108"></a><span class="lineno"> 7108</span>&#160;        <span class="keywordtype">bool</span> canMakeOtherLost,</div>
+<div class="line"><a name="l07109"></a><span class="lineno"> 7109</span>&#160;        uint32_t strategy,</div>
+<div class="line"><a name="l07110"></a><span class="lineno"> 7110</span>&#160;        VmaAllocationRequest* pAllocationRequest);</div>
+<div class="line"><a name="l07111"></a><span class="lineno"> 7111</span>&#160; </div>
+<div class="line"><a name="l07112"></a><span class="lineno"> 7112</span>&#160;    <span class="keyword">virtual</span> <span class="keywordtype">bool</span> MakeRequestedAllocationsLost(</div>
+<div class="line"><a name="l07113"></a><span class="lineno"> 7113</span>&#160;        uint32_t currentFrameIndex,</div>
+<div class="line"><a name="l07114"></a><span class="lineno"> 7114</span>&#160;        uint32_t frameInUseCount,</div>
+<div class="line"><a name="l07115"></a><span class="lineno"> 7115</span>&#160;        VmaAllocationRequest* pAllocationRequest);</div>
+<div class="line"><a name="l07116"></a><span class="lineno"> 7116</span>&#160; </div>
+<div class="line"><a name="l07117"></a><span class="lineno"> 7117</span>&#160;    <span class="keyword">virtual</span> uint32_t MakeAllocationsLost(uint32_t currentFrameIndex, uint32_t frameInUseCount);</div>
+<div class="line"><a name="l07118"></a><span class="lineno"> 7118</span>&#160; </div>
+<div class="line"><a name="l07119"></a><span class="lineno"> 7119</span>&#160;    <span class="keyword">virtual</span> VkResult CheckCorruption(<span class="keyword">const</span> <span class="keywordtype">void</span>* pBlockData) { <span class="keywordflow">return</span> VK_ERROR_FEATURE_NOT_PRESENT; }</div>
+<div class="line"><a name="l07120"></a><span class="lineno"> 7120</span>&#160; </div>
+<div class="line"><a name="l07121"></a><span class="lineno"> 7121</span>&#160;    <span class="keyword">virtual</span> <span class="keywordtype">void</span> Alloc(</div>
+<div class="line"><a name="l07122"></a><span class="lineno"> 7122</span>&#160;        <span class="keyword">const</span> VmaAllocationRequest&amp; request,</div>
+<div class="line"><a name="l07123"></a><span class="lineno"> 7123</span>&#160;        VmaSuballocationType type,</div>
+<div class="line"><a name="l07124"></a><span class="lineno"> 7124</span>&#160;        VkDeviceSize allocSize,</div>
+<div class="line"><a name="l07125"></a><span class="lineno"> 7125</span>&#160;        <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> hAllocation);</div>
+<div class="line"><a name="l07126"></a><span class="lineno"> 7126</span>&#160; </div>
+<div class="line"><a name="l07127"></a><span class="lineno"> 7127</span>&#160;    <span class="keyword">virtual</span> <span class="keywordtype">void</span> Free(<span class="keyword">const</span> <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation) { FreeAtOffset(allocation, allocation-&gt;GetOffset()); }</div>
+<div class="line"><a name="l07128"></a><span class="lineno"> 7128</span>&#160;    <span class="keyword">virtual</span> <span class="keywordtype">void</span> FreeAtOffset(VkDeviceSize offset) { FreeAtOffset(VMA_NULL, offset); }</div>
+<div class="line"><a name="l07129"></a><span class="lineno"> 7129</span>&#160; </div>
+<div class="line"><a name="l07130"></a><span class="lineno"> 7130</span>&#160;<span class="keyword">private</span>:</div>
+<div class="line"><a name="l07131"></a><span class="lineno"> 7131</span>&#160;    <span class="keyword">static</span> <span class="keyword">const</span> VkDeviceSize MIN_NODE_SIZE = 32;</div>
+<div class="line"><a name="l07132"></a><span class="lineno"> 7132</span>&#160;    <span class="keyword">static</span> <span class="keyword">const</span> <span class="keywordtype">size_t</span> MAX_LEVELS = 30;</div>
+<div class="line"><a name="l07133"></a><span class="lineno"> 7133</span>&#160; </div>
+<div class="line"><a name="l07134"></a><span class="lineno"> 7134</span>&#160;    <span class="keyword">struct </span>ValidationContext</div>
+<div class="line"><a name="l07135"></a><span class="lineno"> 7135</span>&#160;    {</div>
+<div class="line"><a name="l07136"></a><span class="lineno"> 7136</span>&#160;        <span class="keywordtype">size_t</span> calculatedAllocationCount;</div>
+<div class="line"><a name="l07137"></a><span class="lineno"> 7137</span>&#160;        <span class="keywordtype">size_t</span> calculatedFreeCount;</div>
+<div class="line"><a name="l07138"></a><span class="lineno"> 7138</span>&#160;        VkDeviceSize calculatedSumFreeSize;</div>
+<div class="line"><a name="l07139"></a><span class="lineno"> 7139</span>&#160; </div>
+<div class="line"><a name="l07140"></a><span class="lineno"> 7140</span>&#160;        ValidationContext() :</div>
+<div class="line"><a name="l07141"></a><span class="lineno"> 7141</span>&#160;            calculatedAllocationCount(0),</div>
+<div class="line"><a name="l07142"></a><span class="lineno"> 7142</span>&#160;            calculatedFreeCount(0),</div>
+<div class="line"><a name="l07143"></a><span class="lineno"> 7143</span>&#160;            calculatedSumFreeSize(0) { }</div>
+<div class="line"><a name="l07144"></a><span class="lineno"> 7144</span>&#160;    };</div>
+<div class="line"><a name="l07145"></a><span class="lineno"> 7145</span>&#160; </div>
+<div class="line"><a name="l07146"></a><span class="lineno"> 7146</span>&#160;    <span class="keyword">struct </span>Node</div>
+<div class="line"><a name="l07147"></a><span class="lineno"> 7147</span>&#160;    {</div>
+<div class="line"><a name="l07148"></a><span class="lineno"> 7148</span>&#160;        VkDeviceSize offset;</div>
+<div class="line"><a name="l07149"></a><span class="lineno"> 7149</span>&#160;        <span class="keyword">enum</span> TYPE</div>
+<div class="line"><a name="l07150"></a><span class="lineno"> 7150</span>&#160;        {</div>
+<div class="line"><a name="l07151"></a><span class="lineno"> 7151</span>&#160;            TYPE_FREE,</div>
+<div class="line"><a name="l07152"></a><span class="lineno"> 7152</span>&#160;            TYPE_ALLOCATION,</div>
+<div class="line"><a name="l07153"></a><span class="lineno"> 7153</span>&#160;            TYPE_SPLIT,</div>
+<div class="line"><a name="l07154"></a><span class="lineno"> 7154</span>&#160;            TYPE_COUNT</div>
+<div class="line"><a name="l07155"></a><span class="lineno"> 7155</span>&#160;        } type;</div>
+<div class="line"><a name="l07156"></a><span class="lineno"> 7156</span>&#160;        Node* parent;</div>
+<div class="line"><a name="l07157"></a><span class="lineno"> 7157</span>&#160;        Node* buddy;</div>
+<div class="line"><a name="l07158"></a><span class="lineno"> 7158</span>&#160; </div>
+<div class="line"><a name="l07159"></a><span class="lineno"> 7159</span>&#160;        <span class="keyword">union</span></div>
+<div class="line"><a name="l07160"></a><span class="lineno"> 7160</span>&#160;        {</div>
+<div class="line"><a name="l07161"></a><span class="lineno"> 7161</span>&#160;            <span class="keyword">struct</span></div>
+<div class="line"><a name="l07162"></a><span class="lineno"> 7162</span>&#160;            {</div>
+<div class="line"><a name="l07163"></a><span class="lineno"> 7163</span>&#160;                Node* prev;</div>
+<div class="line"><a name="l07164"></a><span class="lineno"> 7164</span>&#160;                Node* next;</div>
+<div class="line"><a name="l07165"></a><span class="lineno"> 7165</span>&#160;            } free;</div>
+<div class="line"><a name="l07166"></a><span class="lineno"> 7166</span>&#160;            <span class="keyword">struct</span></div>
+<div class="line"><a name="l07167"></a><span class="lineno"> 7167</span>&#160;            {</div>
+<div class="line"><a name="l07168"></a><span class="lineno"> 7168</span>&#160;                <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> alloc;</div>
+<div class="line"><a name="l07169"></a><span class="lineno"> 7169</span>&#160;            } allocation;</div>
+<div class="line"><a name="l07170"></a><span class="lineno"> 7170</span>&#160;            <span class="keyword">struct</span></div>
+<div class="line"><a name="l07171"></a><span class="lineno"> 7171</span>&#160;            {</div>
+<div class="line"><a name="l07172"></a><span class="lineno"> 7172</span>&#160;                Node* leftChild;</div>
+<div class="line"><a name="l07173"></a><span class="lineno"> 7173</span>&#160;            } split;</div>
+<div class="line"><a name="l07174"></a><span class="lineno"> 7174</span>&#160;        };</div>
+<div class="line"><a name="l07175"></a><span class="lineno"> 7175</span>&#160;    };</div>
+<div class="line"><a name="l07176"></a><span class="lineno"> 7176</span>&#160; </div>
+<div class="line"><a name="l07177"></a><span class="lineno"> 7177</span>&#160;    <span class="comment">// Size of the memory block aligned down to a power of two.</span></div>
+<div class="line"><a name="l07178"></a><span class="lineno"> 7178</span>&#160;    VkDeviceSize m_UsableSize;</div>
+<div class="line"><a name="l07179"></a><span class="lineno"> 7179</span>&#160;    uint32_t m_LevelCount;</div>
+<div class="line"><a name="l07180"></a><span class="lineno"> 7180</span>&#160; </div>
+<div class="line"><a name="l07181"></a><span class="lineno"> 7181</span>&#160;    Node* m_Root;</div>
+<div class="line"><a name="l07182"></a><span class="lineno"> 7182</span>&#160;    <span class="keyword">struct </span>{</div>
+<div class="line"><a name="l07183"></a><span class="lineno"> 7183</span>&#160;        Node* front;</div>
+<div class="line"><a name="l07184"></a><span class="lineno"> 7184</span>&#160;        Node* back;</div>
+<div class="line"><a name="l07185"></a><span class="lineno"> 7185</span>&#160;    } m_FreeList[MAX_LEVELS];</div>
+<div class="line"><a name="l07186"></a><span class="lineno"> 7186</span>&#160;    <span class="comment">// Number of nodes in the tree with type == TYPE_ALLOCATION.</span></div>
+<div class="line"><a name="l07187"></a><span class="lineno"> 7187</span>&#160;    <span class="keywordtype">size_t</span> m_AllocationCount;</div>
+<div class="line"><a name="l07188"></a><span class="lineno"> 7188</span>&#160;    <span class="comment">// Number of nodes in the tree with type == TYPE_FREE.</span></div>
+<div class="line"><a name="l07189"></a><span class="lineno"> 7189</span>&#160;    <span class="keywordtype">size_t</span> m_FreeCount;</div>
+<div class="line"><a name="l07190"></a><span class="lineno"> 7190</span>&#160;    <span class="comment">// This includes space wasted due to internal fragmentation. Doesn&#39;t include unusable size.</span></div>
+<div class="line"><a name="l07191"></a><span class="lineno"> 7191</span>&#160;    VkDeviceSize m_SumFreeSize;</div>
+<div class="line"><a name="l07192"></a><span class="lineno"> 7192</span>&#160; </div>
+<div class="line"><a name="l07193"></a><span class="lineno"> 7193</span>&#160;    VkDeviceSize GetUnusableSize()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> GetSize() - m_UsableSize; }</div>
+<div class="line"><a name="l07194"></a><span class="lineno"> 7194</span>&#160;    <span class="keywordtype">void</span> DeleteNode(Node* node);</div>
+<div class="line"><a name="l07195"></a><span class="lineno"> 7195</span>&#160;    <span class="keywordtype">bool</span> ValidateNode(ValidationContext&amp; ctx, <span class="keyword">const</span> Node* parent, <span class="keyword">const</span> Node* curr, uint32_t level, VkDeviceSize levelNodeSize) <span class="keyword">const</span>;</div>
+<div class="line"><a name="l07196"></a><span class="lineno"> 7196</span>&#160;    uint32_t AllocSizeToLevel(VkDeviceSize allocSize) <span class="keyword">const</span>;</div>
+<div class="line"><a name="l07197"></a><span class="lineno"> 7197</span>&#160;    <span class="keyword">inline</span> VkDeviceSize LevelToNodeSize(uint32_t level)<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_UsableSize &gt;&gt; level; }</div>
+<div class="line"><a name="l07198"></a><span class="lineno"> 7198</span>&#160;    <span class="comment">// Alloc passed just for validation. Can be null.</span></div>
+<div class="line"><a name="l07199"></a><span class="lineno"> 7199</span>&#160;    <span class="keywordtype">void</span> FreeAtOffset(<a class="code" href="struct_vma_allocation.html">VmaAllocation</a> alloc, VkDeviceSize offset);</div>
+<div class="line"><a name="l07200"></a><span class="lineno"> 7200</span>&#160;    <span class="keywordtype">void</span> CalcAllocationStatInfoNode(<a class="code" href="struct_vma_stat_info.html">VmaStatInfo</a>&amp; outInfo, <span class="keyword">const</span> Node* node, VkDeviceSize levelNodeSize) <span class="keyword">const</span>;</div>
+<div class="line"><a name="l07201"></a><span class="lineno"> 7201</span>&#160;    <span class="comment">// Adds node to the front of FreeList at given level.</span></div>
+<div class="line"><a name="l07202"></a><span class="lineno"> 7202</span>&#160;    <span class="comment">// node-&gt;type must be FREE.</span></div>
+<div class="line"><a name="l07203"></a><span class="lineno"> 7203</span>&#160;    <span class="comment">// node-&gt;free.prev, next can be undefined.</span></div>
+<div class="line"><a name="l07204"></a><span class="lineno"> 7204</span>&#160;    <span class="keywordtype">void</span> AddToFreeListFront(uint32_t level, Node* node);</div>
+<div class="line"><a name="l07205"></a><span class="lineno"> 7205</span>&#160;    <span class="comment">// Removes node from FreeList at given level.</span></div>
+<div class="line"><a name="l07206"></a><span class="lineno"> 7206</span>&#160;    <span class="comment">// node-&gt;type must be FREE.</span></div>
+<div class="line"><a name="l07207"></a><span class="lineno"> 7207</span>&#160;    <span class="comment">// node-&gt;free.prev, next stay untouched.</span></div>
+<div class="line"><a name="l07208"></a><span class="lineno"> 7208</span>&#160;    <span class="keywordtype">void</span> RemoveFromFreeList(uint32_t level, Node* node);</div>
 <div class="line"><a name="l07209"></a><span class="lineno"> 7209</span>&#160; </div>
-<div class="line"><a name="l07210"></a><span class="lineno"> 7210</span>&#160;    <span class="keyword">virtual</span> <span class="keywordtype">void</span> AddAllocation(<a class="code" href="struct_vma_allocation.html">VmaAllocation</a> hAlloc, VkBool32* pChanged) { ++m_AllocationCount; }</div>
-<div class="line"><a name="l07211"></a><span class="lineno"> 7211</span>&#160;    <span class="keyword">virtual</span> <span class="keywordtype">void</span> AddAll() { m_AllAllocations = <span class="keyword">true</span>; }</div>
-<div class="line"><a name="l07212"></a><span class="lineno"> 7212</span>&#160; </div>
-<div class="line"><a name="l07213"></a><span class="lineno"> 7213</span>&#160;    <span class="keyword">virtual</span> VkResult Defragment(</div>
-<div class="line"><a name="l07214"></a><span class="lineno"> 7214</span>&#160;        VmaVector&lt; VmaDefragmentationMove, VmaStlAllocator&lt;VmaDefragmentationMove&gt; &gt;&amp; moves,</div>
-<div class="line"><a name="l07215"></a><span class="lineno"> 7215</span>&#160;        VkDeviceSize maxBytesToMove,</div>
-<div class="line"><a name="l07216"></a><span class="lineno"> 7216</span>&#160;        uint32_t maxAllocationsToMove,</div>
-<div class="line"><a name="l07217"></a><span class="lineno"> 7217</span>&#160;        <a class="code" href="vk__mem__alloc_8h.html#a88a77cef37e5d3c4fc9eb328885d048d">VmaDefragmentationFlags</a> flags);</div>
-<div class="line"><a name="l07218"></a><span class="lineno"> 7218</span>&#160; </div>
-<div class="line"><a name="l07219"></a><span class="lineno"> 7219</span>&#160;    <span class="keyword">virtual</span> VkDeviceSize GetBytesMoved()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_BytesMoved; }</div>
-<div class="line"><a name="l07220"></a><span class="lineno"> 7220</span>&#160;    <span class="keyword">virtual</span> uint32_t GetAllocationsMoved()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_AllocationsMoved; }</div>
-<div class="line"><a name="l07221"></a><span class="lineno"> 7221</span>&#160; </div>
-<div class="line"><a name="l07222"></a><span class="lineno"> 7222</span>&#160;<span class="keyword">private</span>:</div>
-<div class="line"><a name="l07223"></a><span class="lineno"> 7223</span>&#160;    <span class="keyword">struct </span>BlockInfo</div>
-<div class="line"><a name="l07224"></a><span class="lineno"> 7224</span>&#160;    {</div>
-<div class="line"><a name="l07225"></a><span class="lineno"> 7225</span>&#160;        <span class="keywordtype">size_t</span> origBlockIndex;</div>
-<div class="line"><a name="l07226"></a><span class="lineno"> 7226</span>&#160;    };</div>
-<div class="line"><a name="l07227"></a><span class="lineno"> 7227</span>&#160; </div>
-<div class="line"><a name="l07228"></a><span class="lineno"> 7228</span>&#160;    <span class="keyword">class </span>FreeSpaceDatabase</div>
-<div class="line"><a name="l07229"></a><span class="lineno"> 7229</span>&#160;    {</div>
-<div class="line"><a name="l07230"></a><span class="lineno"> 7230</span>&#160;    <span class="keyword">public</span>:</div>
-<div class="line"><a name="l07231"></a><span class="lineno"> 7231</span>&#160;        FreeSpaceDatabase()</div>
-<div class="line"><a name="l07232"></a><span class="lineno"> 7232</span>&#160;        {</div>
-<div class="line"><a name="l07233"></a><span class="lineno"> 7233</span>&#160;            FreeSpace s = {};</div>
-<div class="line"><a name="l07234"></a><span class="lineno"> 7234</span>&#160;            s.blockInfoIndex = SIZE_MAX;</div>
-<div class="line"><a name="l07235"></a><span class="lineno"> 7235</span>&#160;            <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> i = 0; i &lt; MAX_COUNT; ++i)</div>
-<div class="line"><a name="l07236"></a><span class="lineno"> 7236</span>&#160;            {</div>
-<div class="line"><a name="l07237"></a><span class="lineno"> 7237</span>&#160;                m_FreeSpaces[i] = s;</div>
-<div class="line"><a name="l07238"></a><span class="lineno"> 7238</span>&#160;            }</div>
-<div class="line"><a name="l07239"></a><span class="lineno"> 7239</span>&#160;        }</div>
-<div class="line"><a name="l07240"></a><span class="lineno"> 7240</span>&#160; </div>
-<div class="line"><a name="l07241"></a><span class="lineno"> 7241</span>&#160;        <span class="keywordtype">void</span> Register(<span class="keywordtype">size_t</span> blockInfoIndex, VkDeviceSize offset, VkDeviceSize size)</div>
-<div class="line"><a name="l07242"></a><span class="lineno"> 7242</span>&#160;        {</div>
-<div class="line"><a name="l07243"></a><span class="lineno"> 7243</span>&#160;            <span class="keywordflow">if</span>(size &lt; VMA_MIN_FREE_SUBALLOCATION_SIZE_TO_REGISTER)</div>
-<div class="line"><a name="l07244"></a><span class="lineno"> 7244</span>&#160;            {</div>
-<div class="line"><a name="l07245"></a><span class="lineno"> 7245</span>&#160;                <span class="keywordflow">return</span>;</div>
-<div class="line"><a name="l07246"></a><span class="lineno"> 7246</span>&#160;            }</div>
-<div class="line"><a name="l07247"></a><span class="lineno"> 7247</span>&#160; </div>
-<div class="line"><a name="l07248"></a><span class="lineno"> 7248</span>&#160;            <span class="comment">// Find first invalid or the smallest structure.</span></div>
-<div class="line"><a name="l07249"></a><span class="lineno"> 7249</span>&#160;            <span class="keywordtype">size_t</span> bestIndex = SIZE_MAX;</div>
-<div class="line"><a name="l07250"></a><span class="lineno"> 7250</span>&#160;            <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> i = 0; i &lt; MAX_COUNT; ++i)</div>
-<div class="line"><a name="l07251"></a><span class="lineno"> 7251</span>&#160;            {</div>
-<div class="line"><a name="l07252"></a><span class="lineno"> 7252</span>&#160;                <span class="comment">// Empty structure.</span></div>
-<div class="line"><a name="l07253"></a><span class="lineno"> 7253</span>&#160;                <span class="keywordflow">if</span>(m_FreeSpaces[i].blockInfoIndex == SIZE_MAX)</div>
-<div class="line"><a name="l07254"></a><span class="lineno"> 7254</span>&#160;                {</div>
-<div class="line"><a name="l07255"></a><span class="lineno"> 7255</span>&#160;                    bestIndex = i;</div>
-<div class="line"><a name="l07256"></a><span class="lineno"> 7256</span>&#160;                    <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l07257"></a><span class="lineno"> 7257</span>&#160;                }</div>
-<div class="line"><a name="l07258"></a><span class="lineno"> 7258</span>&#160;                <span class="keywordflow">if</span>(m_FreeSpaces[i].size &lt; size &amp;&amp;</div>
-<div class="line"><a name="l07259"></a><span class="lineno"> 7259</span>&#160;                    (bestIndex == SIZE_MAX || m_FreeSpaces[bestIndex].size &gt; m_FreeSpaces[i].size))</div>
-<div class="line"><a name="l07260"></a><span class="lineno"> 7260</span>&#160;                {</div>
-<div class="line"><a name="l07261"></a><span class="lineno"> 7261</span>&#160;                    bestIndex = i;</div>
-<div class="line"><a name="l07262"></a><span class="lineno"> 7262</span>&#160;                }</div>
-<div class="line"><a name="l07263"></a><span class="lineno"> 7263</span>&#160;            }</div>
+<div class="line"><a name="l07210"></a><span class="lineno"> 7210</span>&#160;<span class="preprocessor">#if VMA_STATS_STRING_ENABLED</span></div>
+<div class="line"><a name="l07211"></a><span class="lineno"> 7211</span>&#160;    <span class="keywordtype">void</span> PrintDetailedMapNode(<span class="keyword">class</span> VmaJsonWriter&amp; json, <span class="keyword">const</span> Node* node, VkDeviceSize levelNodeSize) <span class="keyword">const</span>;</div>
+<div class="line"><a name="l07212"></a><span class="lineno"> 7212</span>&#160;<span class="preprocessor">#endif</span></div>
+<div class="line"><a name="l07213"></a><span class="lineno"> 7213</span>&#160;};</div>
+<div class="line"><a name="l07214"></a><span class="lineno"> 7214</span>&#160; </div>
+<div class="line"><a name="l07215"></a><span class="lineno"> 7215</span>&#160;<span class="comment">/*</span></div>
+<div class="line"><a name="l07216"></a><span class="lineno"> 7216</span>&#160;<span class="comment">Represents a single block of device memory (`VkDeviceMemory`) with all the</span></div>
+<div class="line"><a name="l07217"></a><span class="lineno"> 7217</span>&#160;<span class="comment">data about its regions (aka suballocations, #VmaAllocation), assigned and free.</span></div>
+<div class="line"><a name="l07218"></a><span class="lineno"> 7218</span>&#160;<span class="comment"></span> </div>
+<div class="line"><a name="l07219"></a><span class="lineno"> 7219</span>&#160;<span class="comment">Thread-safety: This class must be externally synchronized.</span></div>
+<div class="line"><a name="l07220"></a><span class="lineno"> 7220</span>&#160;<span class="comment">*/</span></div>
+<div class="line"><a name="l07221"></a><span class="lineno"> 7221</span>&#160;<span class="keyword">class </span>VmaDeviceMemoryBlock</div>
+<div class="line"><a name="l07222"></a><span class="lineno"> 7222</span>&#160;{</div>
+<div class="line"><a name="l07223"></a><span class="lineno"> 7223</span>&#160;    VMA_CLASS_NO_COPY(VmaDeviceMemoryBlock)</div>
+<div class="line"><a name="l07224"></a><span class="lineno"> 7224</span>&#160;<span class="keyword">public</span>:</div>
+<div class="line"><a name="l07225"></a><span class="lineno"> 7225</span>&#160;    VmaBlockMetadata* m_pMetadata;</div>
+<div class="line"><a name="l07226"></a><span class="lineno"> 7226</span>&#160; </div>
+<div class="line"><a name="l07227"></a><span class="lineno"> 7227</span>&#160;    VmaDeviceMemoryBlock(<a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator);</div>
+<div class="line"><a name="l07228"></a><span class="lineno"> 7228</span>&#160; </div>
+<div class="line"><a name="l07229"></a><span class="lineno"> 7229</span>&#160;    ~VmaDeviceMemoryBlock()</div>
+<div class="line"><a name="l07230"></a><span class="lineno"> 7230</span>&#160;    {</div>
+<div class="line"><a name="l07231"></a><span class="lineno"> 7231</span>&#160;        VMA_ASSERT(m_MapCount == 0 &amp;&amp; <span class="stringliteral">&quot;VkDeviceMemory block is being destroyed while it is still mapped.&quot;</span>);</div>
+<div class="line"><a name="l07232"></a><span class="lineno"> 7232</span>&#160;        VMA_ASSERT(m_hMemory == VK_NULL_HANDLE);</div>
+<div class="line"><a name="l07233"></a><span class="lineno"> 7233</span>&#160;    }</div>
+<div class="line"><a name="l07234"></a><span class="lineno"> 7234</span>&#160; </div>
+<div class="line"><a name="l07235"></a><span class="lineno"> 7235</span>&#160;    <span class="comment">// Always call after construction.</span></div>
+<div class="line"><a name="l07236"></a><span class="lineno"> 7236</span>&#160;    <span class="keywordtype">void</span> Init(</div>
+<div class="line"><a name="l07237"></a><span class="lineno"> 7237</span>&#160;        <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator,</div>
+<div class="line"><a name="l07238"></a><span class="lineno"> 7238</span>&#160;        <a class="code" href="struct_vma_pool.html">VmaPool</a> hParentPool,</div>
+<div class="line"><a name="l07239"></a><span class="lineno"> 7239</span>&#160;        uint32_t newMemoryTypeIndex,</div>
+<div class="line"><a name="l07240"></a><span class="lineno"> 7240</span>&#160;        VkDeviceMemory newMemory,</div>
+<div class="line"><a name="l07241"></a><span class="lineno"> 7241</span>&#160;        VkDeviceSize newSize,</div>
+<div class="line"><a name="l07242"></a><span class="lineno"> 7242</span>&#160;        uint32_t <span class="keywordtype">id</span>,</div>
+<div class="line"><a name="l07243"></a><span class="lineno"> 7243</span>&#160;        uint32_t algorithm);</div>
+<div class="line"><a name="l07244"></a><span class="lineno"> 7244</span>&#160;    <span class="comment">// Always call before destruction.</span></div>
+<div class="line"><a name="l07245"></a><span class="lineno"> 7245</span>&#160;    <span class="keywordtype">void</span> Destroy(<a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator);</div>
+<div class="line"><a name="l07246"></a><span class="lineno"> 7246</span>&#160; </div>
+<div class="line"><a name="l07247"></a><span class="lineno"> 7247</span>&#160;    <a class="code" href="struct_vma_pool.html">VmaPool</a> GetParentPool()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_hParentPool; }</div>
+<div class="line"><a name="l07248"></a><span class="lineno"> 7248</span>&#160;    VkDeviceMemory GetDeviceMemory()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_hMemory; }</div>
+<div class="line"><a name="l07249"></a><span class="lineno"> 7249</span>&#160;    uint32_t GetMemoryTypeIndex()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_MemoryTypeIndex; }</div>
+<div class="line"><a name="l07250"></a><span class="lineno"> 7250</span>&#160;    uint32_t GetId()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_Id; }</div>
+<div class="line"><a name="l07251"></a><span class="lineno"> 7251</span>&#160;    <span class="keywordtype">void</span>* GetMappedData()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_pMappedData; }</div>
+<div class="line"><a name="l07252"></a><span class="lineno"> 7252</span>&#160; </div>
+<div class="line"><a name="l07253"></a><span class="lineno"> 7253</span>&#160;    <span class="comment">// Validates all data structures inside this object. If not valid, returns false.</span></div>
+<div class="line"><a name="l07254"></a><span class="lineno"> 7254</span>&#160;    <span class="keywordtype">bool</span> Validate() <span class="keyword">const</span>;</div>
+<div class="line"><a name="l07255"></a><span class="lineno"> 7255</span>&#160; </div>
+<div class="line"><a name="l07256"></a><span class="lineno"> 7256</span>&#160;    VkResult CheckCorruption(<a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator);</div>
+<div class="line"><a name="l07257"></a><span class="lineno"> 7257</span>&#160; </div>
+<div class="line"><a name="l07258"></a><span class="lineno"> 7258</span>&#160;    <span class="comment">// ppData can be null.</span></div>
+<div class="line"><a name="l07259"></a><span class="lineno"> 7259</span>&#160;    VkResult Map(<a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator, uint32_t count, <span class="keywordtype">void</span>** ppData);</div>
+<div class="line"><a name="l07260"></a><span class="lineno"> 7260</span>&#160;    <span class="keywordtype">void</span> Unmap(<a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator, uint32_t count);</div>
+<div class="line"><a name="l07261"></a><span class="lineno"> 7261</span>&#160; </div>
+<div class="line"><a name="l07262"></a><span class="lineno"> 7262</span>&#160;    VkResult WriteMagicValueAroundAllocation(<a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator, VkDeviceSize allocOffset, VkDeviceSize allocSize);</div>
+<div class="line"><a name="l07263"></a><span class="lineno"> 7263</span>&#160;    VkResult ValidateMagicValueAroundAllocation(<a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator, VkDeviceSize allocOffset, VkDeviceSize allocSize);</div>
 <div class="line"><a name="l07264"></a><span class="lineno"> 7264</span>&#160; </div>
-<div class="line"><a name="l07265"></a><span class="lineno"> 7265</span>&#160;            <span class="keywordflow">if</span>(bestIndex != SIZE_MAX)</div>
-<div class="line"><a name="l07266"></a><span class="lineno"> 7266</span>&#160;            {</div>
-<div class="line"><a name="l07267"></a><span class="lineno"> 7267</span>&#160;                m_FreeSpaces[bestIndex].blockInfoIndex = blockInfoIndex;</div>
-<div class="line"><a name="l07268"></a><span class="lineno"> 7268</span>&#160;                m_FreeSpaces[bestIndex].offset = offset;</div>
-<div class="line"><a name="l07269"></a><span class="lineno"> 7269</span>&#160;                m_FreeSpaces[bestIndex].size = size;</div>
-<div class="line"><a name="l07270"></a><span class="lineno"> 7270</span>&#160;            }</div>
-<div class="line"><a name="l07271"></a><span class="lineno"> 7271</span>&#160;        }</div>
-<div class="line"><a name="l07272"></a><span class="lineno"> 7272</span>&#160; </div>
-<div class="line"><a name="l07273"></a><span class="lineno"> 7273</span>&#160;        <span class="keywordtype">bool</span> Fetch(VkDeviceSize alignment, VkDeviceSize size,</div>
-<div class="line"><a name="l07274"></a><span class="lineno"> 7274</span>&#160;            <span class="keywordtype">size_t</span>&amp; outBlockInfoIndex, VkDeviceSize&amp; outDstOffset)</div>
-<div class="line"><a name="l07275"></a><span class="lineno"> 7275</span>&#160;        {</div>
-<div class="line"><a name="l07276"></a><span class="lineno"> 7276</span>&#160;            <span class="keywordtype">size_t</span> bestIndex = SIZE_MAX;</div>
-<div class="line"><a name="l07277"></a><span class="lineno"> 7277</span>&#160;            VkDeviceSize bestFreeSpaceAfter = 0;</div>
-<div class="line"><a name="l07278"></a><span class="lineno"> 7278</span>&#160;            <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> i = 0; i &lt; MAX_COUNT; ++i)</div>
-<div class="line"><a name="l07279"></a><span class="lineno"> 7279</span>&#160;            {</div>
-<div class="line"><a name="l07280"></a><span class="lineno"> 7280</span>&#160;                <span class="comment">// Structure is valid.</span></div>
-<div class="line"><a name="l07281"></a><span class="lineno"> 7281</span>&#160;                <span class="keywordflow">if</span>(m_FreeSpaces[i].blockInfoIndex != SIZE_MAX)</div>
-<div class="line"><a name="l07282"></a><span class="lineno"> 7282</span>&#160;                {</div>
-<div class="line"><a name="l07283"></a><span class="lineno"> 7283</span>&#160;                    <span class="keyword">const</span> VkDeviceSize dstOffset = VmaAlignUp(m_FreeSpaces[i].offset, alignment);</div>
-<div class="line"><a name="l07284"></a><span class="lineno"> 7284</span>&#160;                    <span class="comment">// Allocation fits into this structure.</span></div>
-<div class="line"><a name="l07285"></a><span class="lineno"> 7285</span>&#160;                    <span class="keywordflow">if</span>(dstOffset + size &lt;= m_FreeSpaces[i].offset + m_FreeSpaces[i].size)</div>
-<div class="line"><a name="l07286"></a><span class="lineno"> 7286</span>&#160;                    {</div>
-<div class="line"><a name="l07287"></a><span class="lineno"> 7287</span>&#160;                        <span class="keyword">const</span> VkDeviceSize freeSpaceAfter = (m_FreeSpaces[i].offset + m_FreeSpaces[i].size) -</div>
-<div class="line"><a name="l07288"></a><span class="lineno"> 7288</span>&#160;                            (dstOffset + size);</div>
-<div class="line"><a name="l07289"></a><span class="lineno"> 7289</span>&#160;                        <span class="keywordflow">if</span>(bestIndex == SIZE_MAX || freeSpaceAfter &gt; bestFreeSpaceAfter)</div>
-<div class="line"><a name="l07290"></a><span class="lineno"> 7290</span>&#160;                        {</div>
-<div class="line"><a name="l07291"></a><span class="lineno"> 7291</span>&#160;                            bestIndex = i;</div>
-<div class="line"><a name="l07292"></a><span class="lineno"> 7292</span>&#160;                            bestFreeSpaceAfter = freeSpaceAfter;</div>
-<div class="line"><a name="l07293"></a><span class="lineno"> 7293</span>&#160;                        }</div>
-<div class="line"><a name="l07294"></a><span class="lineno"> 7294</span>&#160;                    }</div>
-<div class="line"><a name="l07295"></a><span class="lineno"> 7295</span>&#160;                }</div>
-<div class="line"><a name="l07296"></a><span class="lineno"> 7296</span>&#160;            }</div>
-<div class="line"><a name="l07297"></a><span class="lineno"> 7297</span>&#160;            </div>
-<div class="line"><a name="l07298"></a><span class="lineno"> 7298</span>&#160;            <span class="keywordflow">if</span>(bestIndex != SIZE_MAX)</div>
-<div class="line"><a name="l07299"></a><span class="lineno"> 7299</span>&#160;            {</div>
-<div class="line"><a name="l07300"></a><span class="lineno"> 7300</span>&#160;                outBlockInfoIndex = m_FreeSpaces[bestIndex].blockInfoIndex;</div>
-<div class="line"><a name="l07301"></a><span class="lineno"> 7301</span>&#160;                outDstOffset = VmaAlignUp(m_FreeSpaces[bestIndex].offset, alignment);</div>
-<div class="line"><a name="l07302"></a><span class="lineno"> 7302</span>&#160; </div>
-<div class="line"><a name="l07303"></a><span class="lineno"> 7303</span>&#160;                <span class="keywordflow">if</span>(bestFreeSpaceAfter &gt;= VMA_MIN_FREE_SUBALLOCATION_SIZE_TO_REGISTER)</div>
-<div class="line"><a name="l07304"></a><span class="lineno"> 7304</span>&#160;                {</div>
-<div class="line"><a name="l07305"></a><span class="lineno"> 7305</span>&#160;                    <span class="comment">// Leave this structure for remaining empty space.</span></div>
-<div class="line"><a name="l07306"></a><span class="lineno"> 7306</span>&#160;                    <span class="keyword">const</span> VkDeviceSize alignmentPlusSize = (outDstOffset - m_FreeSpaces[bestIndex].offset) + size;</div>
-<div class="line"><a name="l07307"></a><span class="lineno"> 7307</span>&#160;                    m_FreeSpaces[bestIndex].offset += alignmentPlusSize;</div>
-<div class="line"><a name="l07308"></a><span class="lineno"> 7308</span>&#160;                    m_FreeSpaces[bestIndex].size -= alignmentPlusSize;</div>
-<div class="line"><a name="l07309"></a><span class="lineno"> 7309</span>&#160;                }</div>
-<div class="line"><a name="l07310"></a><span class="lineno"> 7310</span>&#160;                <span class="keywordflow">else</span></div>
-<div class="line"><a name="l07311"></a><span class="lineno"> 7311</span>&#160;                {</div>
-<div class="line"><a name="l07312"></a><span class="lineno"> 7312</span>&#160;                    <span class="comment">// This structure becomes invalid.</span></div>
-<div class="line"><a name="l07313"></a><span class="lineno"> 7313</span>&#160;                    m_FreeSpaces[bestIndex].blockInfoIndex = SIZE_MAX;</div>
-<div class="line"><a name="l07314"></a><span class="lineno"> 7314</span>&#160;                }</div>
-<div class="line"><a name="l07315"></a><span class="lineno"> 7315</span>&#160; </div>
-<div class="line"><a name="l07316"></a><span class="lineno"> 7316</span>&#160;                <span class="keywordflow">return</span> <span class="keyword">true</span>;</div>
-<div class="line"><a name="l07317"></a><span class="lineno"> 7317</span>&#160;            }</div>
-<div class="line"><a name="l07318"></a><span class="lineno"> 7318</span>&#160; </div>
-<div class="line"><a name="l07319"></a><span class="lineno"> 7319</span>&#160;            <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
-<div class="line"><a name="l07320"></a><span class="lineno"> 7320</span>&#160;        }</div>
-<div class="line"><a name="l07321"></a><span class="lineno"> 7321</span>&#160; </div>
-<div class="line"><a name="l07322"></a><span class="lineno"> 7322</span>&#160;    <span class="keyword">private</span>:</div>
-<div class="line"><a name="l07323"></a><span class="lineno"> 7323</span>&#160;        <span class="keyword">static</span> <span class="keyword">const</span> <span class="keywordtype">size_t</span> MAX_COUNT = 4;</div>
-<div class="line"><a name="l07324"></a><span class="lineno"> 7324</span>&#160; </div>
-<div class="line"><a name="l07325"></a><span class="lineno"> 7325</span>&#160;        <span class="keyword">struct </span>FreeSpace</div>
-<div class="line"><a name="l07326"></a><span class="lineno"> 7326</span>&#160;        {</div>
-<div class="line"><a name="l07327"></a><span class="lineno"> 7327</span>&#160;            <span class="keywordtype">size_t</span> blockInfoIndex; <span class="comment">// SIZE_MAX means this structure is invalid.</span></div>
-<div class="line"><a name="l07328"></a><span class="lineno"> 7328</span>&#160;            VkDeviceSize offset;</div>
-<div class="line"><a name="l07329"></a><span class="lineno"> 7329</span>&#160;            VkDeviceSize size;</div>
-<div class="line"><a name="l07330"></a><span class="lineno"> 7330</span>&#160;        } m_FreeSpaces[MAX_COUNT];</div>
-<div class="line"><a name="l07331"></a><span class="lineno"> 7331</span>&#160;    };</div>
-<div class="line"><a name="l07332"></a><span class="lineno"> 7332</span>&#160; </div>
-<div class="line"><a name="l07333"></a><span class="lineno"> 7333</span>&#160;    <span class="keyword">const</span> <span class="keywordtype">bool</span> m_OverlappingMoveSupported;</div>
-<div class="line"><a name="l07334"></a><span class="lineno"> 7334</span>&#160; </div>
-<div class="line"><a name="l07335"></a><span class="lineno"> 7335</span>&#160;    uint32_t m_AllocationCount;</div>
-<div class="line"><a name="l07336"></a><span class="lineno"> 7336</span>&#160;    <span class="keywordtype">bool</span> m_AllAllocations;</div>
-<div class="line"><a name="l07337"></a><span class="lineno"> 7337</span>&#160; </div>
-<div class="line"><a name="l07338"></a><span class="lineno"> 7338</span>&#160;    VkDeviceSize m_BytesMoved;</div>
-<div class="line"><a name="l07339"></a><span class="lineno"> 7339</span>&#160;    uint32_t m_AllocationsMoved;</div>
-<div class="line"><a name="l07340"></a><span class="lineno"> 7340</span>&#160; </div>
-<div class="line"><a name="l07341"></a><span class="lineno"> 7341</span>&#160;    VmaVector&lt; BlockInfo, VmaStlAllocator&lt;BlockInfo&gt; &gt; m_BlockInfos;</div>
+<div class="line"><a name="l07265"></a><span class="lineno"> 7265</span>&#160;    VkResult BindBufferMemory(</div>
+<div class="line"><a name="l07266"></a><span class="lineno"> 7266</span>&#160;        <span class="keyword">const</span> <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator,</div>
+<div class="line"><a name="l07267"></a><span class="lineno"> 7267</span>&#160;        <span class="keyword">const</span> <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> hAllocation,</div>
+<div class="line"><a name="l07268"></a><span class="lineno"> 7268</span>&#160;        VkDeviceSize allocationLocalOffset,</div>
+<div class="line"><a name="l07269"></a><span class="lineno"> 7269</span>&#160;        VkBuffer hBuffer,</div>
+<div class="line"><a name="l07270"></a><span class="lineno"> 7270</span>&#160;        <span class="keyword">const</span> <span class="keywordtype">void</span>* pNext);</div>
+<div class="line"><a name="l07271"></a><span class="lineno"> 7271</span>&#160;    VkResult BindImageMemory(</div>
+<div class="line"><a name="l07272"></a><span class="lineno"> 7272</span>&#160;        <span class="keyword">const</span> <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator,</div>
+<div class="line"><a name="l07273"></a><span class="lineno"> 7273</span>&#160;        <span class="keyword">const</span> <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> hAllocation,</div>
+<div class="line"><a name="l07274"></a><span class="lineno"> 7274</span>&#160;        VkDeviceSize allocationLocalOffset,</div>
+<div class="line"><a name="l07275"></a><span class="lineno"> 7275</span>&#160;        VkImage hImage,</div>
+<div class="line"><a name="l07276"></a><span class="lineno"> 7276</span>&#160;        <span class="keyword">const</span> <span class="keywordtype">void</span>* pNext);</div>
+<div class="line"><a name="l07277"></a><span class="lineno"> 7277</span>&#160; </div>
+<div class="line"><a name="l07278"></a><span class="lineno"> 7278</span>&#160;<span class="keyword">private</span>:</div>
+<div class="line"><a name="l07279"></a><span class="lineno"> 7279</span>&#160;    <a class="code" href="struct_vma_pool.html">VmaPool</a> m_hParentPool; <span class="comment">// VK_NULL_HANDLE if not belongs to custom pool.</span></div>
+<div class="line"><a name="l07280"></a><span class="lineno"> 7280</span>&#160;    uint32_t m_MemoryTypeIndex;</div>
+<div class="line"><a name="l07281"></a><span class="lineno"> 7281</span>&#160;    uint32_t m_Id;</div>
+<div class="line"><a name="l07282"></a><span class="lineno"> 7282</span>&#160;    VkDeviceMemory m_hMemory;</div>
+<div class="line"><a name="l07283"></a><span class="lineno"> 7283</span>&#160; </div>
+<div class="line"><a name="l07284"></a><span class="lineno"> 7284</span>&#160;    <span class="comment">/*</span></div>
+<div class="line"><a name="l07285"></a><span class="lineno"> 7285</span>&#160;<span class="comment">    Protects access to m_hMemory so it&#39;s not used by multiple threads simultaneously, e.g. vkMapMemory, vkBindBufferMemory.</span></div>
+<div class="line"><a name="l07286"></a><span class="lineno"> 7286</span>&#160;<span class="comment">    Also protects m_MapCount, m_pMappedData.</span></div>
+<div class="line"><a name="l07287"></a><span class="lineno"> 7287</span>&#160;<span class="comment">    Allocations, deallocations, any change in m_pMetadata is protected by parent&#39;s VmaBlockVector::m_Mutex.</span></div>
+<div class="line"><a name="l07288"></a><span class="lineno"> 7288</span>&#160;<span class="comment">    */</span></div>
+<div class="line"><a name="l07289"></a><span class="lineno"> 7289</span>&#160;    VMA_MUTEX m_Mutex;</div>
+<div class="line"><a name="l07290"></a><span class="lineno"> 7290</span>&#160;    uint32_t m_MapCount;</div>
+<div class="line"><a name="l07291"></a><span class="lineno"> 7291</span>&#160;    <span class="keywordtype">void</span>* m_pMappedData;</div>
+<div class="line"><a name="l07292"></a><span class="lineno"> 7292</span>&#160;};</div>
+<div class="line"><a name="l07293"></a><span class="lineno"> 7293</span>&#160; </div>
+<div class="line"><a name="l07294"></a><span class="lineno"> 7294</span>&#160;<span class="keyword">struct </span>VmaDefragmentationMove</div>
+<div class="line"><a name="l07295"></a><span class="lineno"> 7295</span>&#160;{</div>
+<div class="line"><a name="l07296"></a><span class="lineno"> 7296</span>&#160;    <span class="keywordtype">size_t</span> srcBlockIndex;</div>
+<div class="line"><a name="l07297"></a><span class="lineno"> 7297</span>&#160;    <span class="keywordtype">size_t</span> dstBlockIndex;</div>
+<div class="line"><a name="l07298"></a><span class="lineno"> 7298</span>&#160;    VkDeviceSize srcOffset;</div>
+<div class="line"><a name="l07299"></a><span class="lineno"> 7299</span>&#160;    VkDeviceSize dstOffset;</div>
+<div class="line"><a name="l07300"></a><span class="lineno"> 7300</span>&#160;    VkDeviceSize size;</div>
+<div class="line"><a name="l07301"></a><span class="lineno"> 7301</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> hAllocation;</div>
+<div class="line"><a name="l07302"></a><span class="lineno"> 7302</span>&#160;    VmaDeviceMemoryBlock* pSrcBlock;</div>
+<div class="line"><a name="l07303"></a><span class="lineno"> 7303</span>&#160;    VmaDeviceMemoryBlock* pDstBlock;</div>
+<div class="line"><a name="l07304"></a><span class="lineno"> 7304</span>&#160;};</div>
+<div class="line"><a name="l07305"></a><span class="lineno"> 7305</span>&#160; </div>
+<div class="line"><a name="l07306"></a><span class="lineno"> 7306</span>&#160;<span class="keyword">class </span>VmaDefragmentationAlgorithm;</div>
+<div class="line"><a name="l07307"></a><span class="lineno"> 7307</span>&#160; </div>
+<div class="line"><a name="l07308"></a><span class="lineno"> 7308</span>&#160;<span class="comment">/*</span></div>
+<div class="line"><a name="l07309"></a><span class="lineno"> 7309</span>&#160;<span class="comment">Sequence of VmaDeviceMemoryBlock. Represents memory blocks allocated for a specific</span></div>
+<div class="line"><a name="l07310"></a><span class="lineno"> 7310</span>&#160;<span class="comment">Vulkan memory type.</span></div>
+<div class="line"><a name="l07311"></a><span class="lineno"> 7311</span>&#160;<span class="comment"></span> </div>
+<div class="line"><a name="l07312"></a><span class="lineno"> 7312</span>&#160;<span class="comment">Synchronized internally with a mutex.</span></div>
+<div class="line"><a name="l07313"></a><span class="lineno"> 7313</span>&#160;<span class="comment">*/</span></div>
+<div class="line"><a name="l07314"></a><span class="lineno"> 7314</span>&#160;<span class="keyword">struct </span>VmaBlockVector</div>
+<div class="line"><a name="l07315"></a><span class="lineno"> 7315</span>&#160;{</div>
+<div class="line"><a name="l07316"></a><span class="lineno"> 7316</span>&#160;    VMA_CLASS_NO_COPY(VmaBlockVector)</div>
+<div class="line"><a name="l07317"></a><span class="lineno"> 7317</span>&#160;<span class="keyword">public</span>:</div>
+<div class="line"><a name="l07318"></a><span class="lineno"> 7318</span>&#160;    VmaBlockVector(</div>
+<div class="line"><a name="l07319"></a><span class="lineno"> 7319</span>&#160;        <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator,</div>
+<div class="line"><a name="l07320"></a><span class="lineno"> 7320</span>&#160;        <a class="code" href="struct_vma_pool.html">VmaPool</a> hParentPool,</div>
+<div class="line"><a name="l07321"></a><span class="lineno"> 7321</span>&#160;        uint32_t memoryTypeIndex,</div>
+<div class="line"><a name="l07322"></a><span class="lineno"> 7322</span>&#160;        VkDeviceSize preferredBlockSize,</div>
+<div class="line"><a name="l07323"></a><span class="lineno"> 7323</span>&#160;        <span class="keywordtype">size_t</span> minBlockCount,</div>
+<div class="line"><a name="l07324"></a><span class="lineno"> 7324</span>&#160;        <span class="keywordtype">size_t</span> maxBlockCount,</div>
+<div class="line"><a name="l07325"></a><span class="lineno"> 7325</span>&#160;        VkDeviceSize bufferImageGranularity,</div>
+<div class="line"><a name="l07326"></a><span class="lineno"> 7326</span>&#160;        uint32_t frameInUseCount,</div>
+<div class="line"><a name="l07327"></a><span class="lineno"> 7327</span>&#160;        <span class="keywordtype">bool</span> explicitBlockSize,</div>
+<div class="line"><a name="l07328"></a><span class="lineno"> 7328</span>&#160;        uint32_t algorithm,</div>
+<div class="line"><a name="l07329"></a><span class="lineno"> 7329</span>&#160;        <span class="keywordtype">float</span> priority);</div>
+<div class="line"><a name="l07330"></a><span class="lineno"> 7330</span>&#160;    ~VmaBlockVector();</div>
+<div class="line"><a name="l07331"></a><span class="lineno"> 7331</span>&#160; </div>
+<div class="line"><a name="l07332"></a><span class="lineno"> 7332</span>&#160;    VkResult CreateMinBlocks();</div>
+<div class="line"><a name="l07333"></a><span class="lineno"> 7333</span>&#160; </div>
+<div class="line"><a name="l07334"></a><span class="lineno"> 7334</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> GetAllocator()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_hAllocator; }</div>
+<div class="line"><a name="l07335"></a><span class="lineno"> 7335</span>&#160;    <a class="code" href="struct_vma_pool.html">VmaPool</a> GetParentPool()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_hParentPool; }</div>
+<div class="line"><a name="l07336"></a><span class="lineno"> 7336</span>&#160;    <span class="keywordtype">bool</span> IsCustomPool()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_hParentPool != VMA_NULL; }</div>
+<div class="line"><a name="l07337"></a><span class="lineno"> 7337</span>&#160;    uint32_t GetMemoryTypeIndex()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_MemoryTypeIndex; }</div>
+<div class="line"><a name="l07338"></a><span class="lineno"> 7338</span>&#160;    VkDeviceSize GetPreferredBlockSize()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_PreferredBlockSize; }</div>
+<div class="line"><a name="l07339"></a><span class="lineno"> 7339</span>&#160;    VkDeviceSize GetBufferImageGranularity()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_BufferImageGranularity; }</div>
+<div class="line"><a name="l07340"></a><span class="lineno"> 7340</span>&#160;    uint32_t GetFrameInUseCount()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_FrameInUseCount; }</div>
+<div class="line"><a name="l07341"></a><span class="lineno"> 7341</span>&#160;    uint32_t GetAlgorithm()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_Algorithm; }</div>
 <div class="line"><a name="l07342"></a><span class="lineno"> 7342</span>&#160; </div>
-<div class="line"><a name="l07343"></a><span class="lineno"> 7343</span>&#160;    <span class="keywordtype">void</span> PreprocessMetadata();</div>
-<div class="line"><a name="l07344"></a><span class="lineno"> 7344</span>&#160;    <span class="keywordtype">void</span> PostprocessMetadata();</div>
-<div class="line"><a name="l07345"></a><span class="lineno"> 7345</span>&#160;    <span class="keywordtype">void</span> InsertSuballoc(VmaBlockMetadata_Generic* pMetadata, <span class="keyword">const</span> VmaSuballocation&amp; suballoc);</div>
-<div class="line"><a name="l07346"></a><span class="lineno"> 7346</span>&#160;};</div>
+<div class="line"><a name="l07343"></a><span class="lineno"> 7343</span>&#160;    <span class="keywordtype">void</span> GetPoolStats(<a class="code" href="struct_vma_pool_stats.html">VmaPoolStats</a>* pStats);</div>
+<div class="line"><a name="l07344"></a><span class="lineno"> 7344</span>&#160; </div>
+<div class="line"><a name="l07345"></a><span class="lineno"> 7345</span>&#160;    <span class="keywordtype">bool</span> IsEmpty();</div>
+<div class="line"><a name="l07346"></a><span class="lineno"> 7346</span>&#160;    <span class="keywordtype">bool</span> IsCorruptionDetectionEnabled() <span class="keyword">const</span>;</div>
 <div class="line"><a name="l07347"></a><span class="lineno"> 7347</span>&#160; </div>
-<div class="line"><a name="l07348"></a><span class="lineno"> 7348</span>&#160;<span class="keyword">struct </span>VmaBlockDefragmentationContext</div>
-<div class="line"><a name="l07349"></a><span class="lineno"> 7349</span>&#160;{</div>
-<div class="line"><a name="l07350"></a><span class="lineno"> 7350</span>&#160;    <span class="keyword">enum</span> BLOCK_FLAG</div>
-<div class="line"><a name="l07351"></a><span class="lineno"> 7351</span>&#160;    {</div>
-<div class="line"><a name="l07352"></a><span class="lineno"> 7352</span>&#160;        BLOCK_FLAG_USED = 0x00000001,</div>
-<div class="line"><a name="l07353"></a><span class="lineno"> 7353</span>&#160;    };</div>
-<div class="line"><a name="l07354"></a><span class="lineno"> 7354</span>&#160;    uint32_t flags;</div>
-<div class="line"><a name="l07355"></a><span class="lineno"> 7355</span>&#160;    VkBuffer hBuffer;</div>
-<div class="line"><a name="l07356"></a><span class="lineno"> 7356</span>&#160;};</div>
-<div class="line"><a name="l07357"></a><span class="lineno"> 7357</span>&#160; </div>
-<div class="line"><a name="l07358"></a><span class="lineno"> 7358</span>&#160;<span class="keyword">class </span>VmaBlockVectorDefragmentationContext</div>
-<div class="line"><a name="l07359"></a><span class="lineno"> 7359</span>&#160;{</div>
-<div class="line"><a name="l07360"></a><span class="lineno"> 7360</span>&#160;    VMA_CLASS_NO_COPY(VmaBlockVectorDefragmentationContext)</div>
-<div class="line"><a name="l07361"></a><span class="lineno"> 7361</span>&#160;<span class="keyword">public</span>:</div>
-<div class="line"><a name="l07362"></a><span class="lineno"> 7362</span>&#160;    VkResult res;</div>
-<div class="line"><a name="l07363"></a><span class="lineno"> 7363</span>&#160;    <span class="keywordtype">bool</span> mutexLocked;</div>
-<div class="line"><a name="l07364"></a><span class="lineno"> 7364</span>&#160;    VmaVector&lt; VmaBlockDefragmentationContext, VmaStlAllocator&lt;VmaBlockDefragmentationContext&gt; &gt; blockContexts;</div>
-<div class="line"><a name="l07365"></a><span class="lineno"> 7365</span>&#160;    VmaVector&lt; VmaDefragmentationMove, VmaStlAllocator&lt;VmaDefragmentationMove&gt; &gt; defragmentationMoves;</div>
-<div class="line"><a name="l07366"></a><span class="lineno"> 7366</span>&#160;    uint32_t defragmentationMovesProcessed;</div>
-<div class="line"><a name="l07367"></a><span class="lineno"> 7367</span>&#160;    uint32_t defragmentationMovesCommitted;</div>
-<div class="line"><a name="l07368"></a><span class="lineno"> 7368</span>&#160;    <span class="keywordtype">bool</span> hasDefragmentationPlan;</div>
-<div class="line"><a name="l07369"></a><span class="lineno"> 7369</span>&#160; </div>
-<div class="line"><a name="l07370"></a><span class="lineno"> 7370</span>&#160;    VmaBlockVectorDefragmentationContext(</div>
-<div class="line"><a name="l07371"></a><span class="lineno"> 7371</span>&#160;        <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator,</div>
-<div class="line"><a name="l07372"></a><span class="lineno"> 7372</span>&#160;        <a class="code" href="struct_vma_pool.html">VmaPool</a> hCustomPool, <span class="comment">// Optional.</span></div>
-<div class="line"><a name="l07373"></a><span class="lineno"> 7373</span>&#160;        VmaBlockVector* pBlockVector,</div>
-<div class="line"><a name="l07374"></a><span class="lineno"> 7374</span>&#160;        uint32_t currFrameIndex);</div>
-<div class="line"><a name="l07375"></a><span class="lineno"> 7375</span>&#160;    ~VmaBlockVectorDefragmentationContext();</div>
-<div class="line"><a name="l07376"></a><span class="lineno"> 7376</span>&#160; </div>
-<div class="line"><a name="l07377"></a><span class="lineno"> 7377</span>&#160;    <a class="code" href="struct_vma_pool.html">VmaPool</a> GetCustomPool()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_hCustomPool; }</div>
-<div class="line"><a name="l07378"></a><span class="lineno"> 7378</span>&#160;    VmaBlockVector* GetBlockVector()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_pBlockVector; }</div>
-<div class="line"><a name="l07379"></a><span class="lineno"> 7379</span>&#160;    VmaDefragmentationAlgorithm* GetAlgorithm()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_pAlgorithm; }</div>
-<div class="line"><a name="l07380"></a><span class="lineno"> 7380</span>&#160; </div>
-<div class="line"><a name="l07381"></a><span class="lineno"> 7381</span>&#160;    <span class="keywordtype">void</span> AddAllocation(<a class="code" href="struct_vma_allocation.html">VmaAllocation</a> hAlloc, VkBool32* pChanged);</div>
-<div class="line"><a name="l07382"></a><span class="lineno"> 7382</span>&#160;    <span class="keywordtype">void</span> AddAll() { m_AllAllocations = <span class="keyword">true</span>; }</div>
-<div class="line"><a name="l07383"></a><span class="lineno"> 7383</span>&#160; </div>
-<div class="line"><a name="l07384"></a><span class="lineno"> 7384</span>&#160;    <span class="keywordtype">void</span> Begin(<span class="keywordtype">bool</span> overlappingMoveSupported, <a class="code" href="vk__mem__alloc_8h.html#a88a77cef37e5d3c4fc9eb328885d048d">VmaDefragmentationFlags</a> flags);</div>
-<div class="line"><a name="l07385"></a><span class="lineno"> 7385</span>&#160; </div>
-<div class="line"><a name="l07386"></a><span class="lineno"> 7386</span>&#160;<span class="keyword">private</span>:</div>
-<div class="line"><a name="l07387"></a><span class="lineno"> 7387</span>&#160;    <span class="keyword">const</span> <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> m_hAllocator;</div>
-<div class="line"><a name="l07388"></a><span class="lineno"> 7388</span>&#160;    <span class="comment">// Null if not from custom pool.</span></div>
-<div class="line"><a name="l07389"></a><span class="lineno"> 7389</span>&#160;    <span class="keyword">const</span> <a class="code" href="struct_vma_pool.html">VmaPool</a> m_hCustomPool;</div>
-<div class="line"><a name="l07390"></a><span class="lineno"> 7390</span>&#160;    <span class="comment">// Redundant, for convenience not to fetch from m_hCustomPool-&gt;m_BlockVector or m_hAllocator-&gt;m_pBlockVectors.</span></div>
-<div class="line"><a name="l07391"></a><span class="lineno"> 7391</span>&#160;    VmaBlockVector* <span class="keyword">const</span> m_pBlockVector;</div>
-<div class="line"><a name="l07392"></a><span class="lineno"> 7392</span>&#160;    <span class="keyword">const</span> uint32_t m_CurrFrameIndex;</div>
-<div class="line"><a name="l07393"></a><span class="lineno"> 7393</span>&#160;    <span class="comment">// Owner of this object.</span></div>
-<div class="line"><a name="l07394"></a><span class="lineno"> 7394</span>&#160;    VmaDefragmentationAlgorithm* m_pAlgorithm;</div>
-<div class="line"><a name="l07395"></a><span class="lineno"> 7395</span>&#160; </div>
-<div class="line"><a name="l07396"></a><span class="lineno"> 7396</span>&#160;    <span class="keyword">struct </span>AllocInfo</div>
-<div class="line"><a name="l07397"></a><span class="lineno"> 7397</span>&#160;    {</div>
-<div class="line"><a name="l07398"></a><span class="lineno"> 7398</span>&#160;        <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> hAlloc;</div>
-<div class="line"><a name="l07399"></a><span class="lineno"> 7399</span>&#160;        VkBool32* pChanged;</div>
-<div class="line"><a name="l07400"></a><span class="lineno"> 7400</span>&#160;    };</div>
-<div class="line"><a name="l07401"></a><span class="lineno"> 7401</span>&#160;    <span class="comment">// Used between constructor and Begin.</span></div>
-<div class="line"><a name="l07402"></a><span class="lineno"> 7402</span>&#160;    VmaVector&lt; AllocInfo, VmaStlAllocator&lt;AllocInfo&gt; &gt; m_Allocations;</div>
-<div class="line"><a name="l07403"></a><span class="lineno"> 7403</span>&#160;    <span class="keywordtype">bool</span> m_AllAllocations;</div>
-<div class="line"><a name="l07404"></a><span class="lineno"> 7404</span>&#160;};</div>
-<div class="line"><a name="l07405"></a><span class="lineno"> 7405</span>&#160; </div>
-<div class="line"><a name="l07406"></a><span class="lineno"> 7406</span>&#160;<span class="keyword">struct </span>VmaDefragmentationContext_T</div>
-<div class="line"><a name="l07407"></a><span class="lineno"> 7407</span>&#160;{</div>
-<div class="line"><a name="l07408"></a><span class="lineno"> 7408</span>&#160;<span class="keyword">private</span>:</div>
-<div class="line"><a name="l07409"></a><span class="lineno"> 7409</span>&#160;    VMA_CLASS_NO_COPY(VmaDefragmentationContext_T)</div>
-<div class="line"><a name="l07410"></a><span class="lineno"> 7410</span>&#160;<span class="keyword">public</span>:</div>
-<div class="line"><a name="l07411"></a><span class="lineno"> 7411</span>&#160;    VmaDefragmentationContext_T(</div>
-<div class="line"><a name="l07412"></a><span class="lineno"> 7412</span>&#160;        <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator,</div>
-<div class="line"><a name="l07413"></a><span class="lineno"> 7413</span>&#160;        uint32_t currFrameIndex,</div>
-<div class="line"><a name="l07414"></a><span class="lineno"> 7414</span>&#160;        uint32_t flags,</div>
-<div class="line"><a name="l07415"></a><span class="lineno"> 7415</span>&#160;        <a class="code" href="struct_vma_defragmentation_stats.html">VmaDefragmentationStats</a>* pStats);</div>
-<div class="line"><a name="l07416"></a><span class="lineno"> 7416</span>&#160;    ~VmaDefragmentationContext_T();</div>
-<div class="line"><a name="l07417"></a><span class="lineno"> 7417</span>&#160; </div>
-<div class="line"><a name="l07418"></a><span class="lineno"> 7418</span>&#160;    <span class="keywordtype">void</span> AddPools(uint32_t poolCount, <span class="keyword">const</span> <a class="code" href="struct_vma_pool.html">VmaPool</a>* pPools);</div>
-<div class="line"><a name="l07419"></a><span class="lineno"> 7419</span>&#160;    <span class="keywordtype">void</span> AddAllocations(</div>
-<div class="line"><a name="l07420"></a><span class="lineno"> 7420</span>&#160;        uint32_t allocationCount,</div>
-<div class="line"><a name="l07421"></a><span class="lineno"> 7421</span>&#160;        <span class="keyword">const</span> <a class="code" href="struct_vma_allocation.html">VmaAllocation</a>* pAllocations,</div>
-<div class="line"><a name="l07422"></a><span class="lineno"> 7422</span>&#160;        VkBool32* pAllocationsChanged);</div>
+<div class="line"><a name="l07348"></a><span class="lineno"> 7348</span>&#160;    VkResult Allocate(</div>
+<div class="line"><a name="l07349"></a><span class="lineno"> 7349</span>&#160;        uint32_t currentFrameIndex,</div>
+<div class="line"><a name="l07350"></a><span class="lineno"> 7350</span>&#160;        VkDeviceSize size,</div>
+<div class="line"><a name="l07351"></a><span class="lineno"> 7351</span>&#160;        VkDeviceSize alignment,</div>
+<div class="line"><a name="l07352"></a><span class="lineno"> 7352</span>&#160;        <span class="keyword">const</span> <a class="code" href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a>&amp; createInfo,</div>
+<div class="line"><a name="l07353"></a><span class="lineno"> 7353</span>&#160;        VmaSuballocationType suballocType,</div>
+<div class="line"><a name="l07354"></a><span class="lineno"> 7354</span>&#160;        <span class="keywordtype">size_t</span> allocationCount,</div>
+<div class="line"><a name="l07355"></a><span class="lineno"> 7355</span>&#160;        <a class="code" href="struct_vma_allocation.html">VmaAllocation</a>* pAllocations);</div>
+<div class="line"><a name="l07356"></a><span class="lineno"> 7356</span>&#160; </div>
+<div class="line"><a name="l07357"></a><span class="lineno"> 7357</span>&#160;    <span class="keywordtype">void</span> Free(<span class="keyword">const</span> <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> hAllocation);</div>
+<div class="line"><a name="l07358"></a><span class="lineno"> 7358</span>&#160; </div>
+<div class="line"><a name="l07359"></a><span class="lineno"> 7359</span>&#160;    <span class="comment">// Adds statistics of this BlockVector to pStats.</span></div>
+<div class="line"><a name="l07360"></a><span class="lineno"> 7360</span>&#160;    <span class="keywordtype">void</span> AddStats(<a class="code" href="struct_vma_stats.html">VmaStats</a>* pStats);</div>
+<div class="line"><a name="l07361"></a><span class="lineno"> 7361</span>&#160; </div>
+<div class="line"><a name="l07362"></a><span class="lineno"> 7362</span>&#160;<span class="preprocessor">#if VMA_STATS_STRING_ENABLED</span></div>
+<div class="line"><a name="l07363"></a><span class="lineno"> 7363</span>&#160;    <span class="keywordtype">void</span> PrintDetailedMap(<span class="keyword">class</span> VmaJsonWriter&amp; json);</div>
+<div class="line"><a name="l07364"></a><span class="lineno"> 7364</span>&#160;<span class="preprocessor">#endif</span></div>
+<div class="line"><a name="l07365"></a><span class="lineno"> 7365</span>&#160; </div>
+<div class="line"><a name="l07366"></a><span class="lineno"> 7366</span>&#160;    <span class="keywordtype">void</span> MakePoolAllocationsLost(</div>
+<div class="line"><a name="l07367"></a><span class="lineno"> 7367</span>&#160;        uint32_t currentFrameIndex,</div>
+<div class="line"><a name="l07368"></a><span class="lineno"> 7368</span>&#160;        <span class="keywordtype">size_t</span>* pLostAllocationCount);</div>
+<div class="line"><a name="l07369"></a><span class="lineno"> 7369</span>&#160;    VkResult CheckCorruption();</div>
+<div class="line"><a name="l07370"></a><span class="lineno"> 7370</span>&#160; </div>
+<div class="line"><a name="l07371"></a><span class="lineno"> 7371</span>&#160;    <span class="comment">// Saves results in pCtx-&gt;res.</span></div>
+<div class="line"><a name="l07372"></a><span class="lineno"> 7372</span>&#160;    <span class="keywordtype">void</span> Defragment(</div>
+<div class="line"><a name="l07373"></a><span class="lineno"> 7373</span>&#160;        <span class="keyword">class</span> VmaBlockVectorDefragmentationContext* pCtx,</div>
+<div class="line"><a name="l07374"></a><span class="lineno"> 7374</span>&#160;        <a class="code" href="struct_vma_defragmentation_stats.html">VmaDefragmentationStats</a>* pStats, <a class="code" href="vk__mem__alloc_8h.html#a88a77cef37e5d3c4fc9eb328885d048d">VmaDefragmentationFlags</a> flags,</div>
+<div class="line"><a name="l07375"></a><span class="lineno"> 7375</span>&#160;        VkDeviceSize&amp; maxCpuBytesToMove, uint32_t&amp; maxCpuAllocationsToMove,</div>
+<div class="line"><a name="l07376"></a><span class="lineno"> 7376</span>&#160;        VkDeviceSize&amp; maxGpuBytesToMove, uint32_t&amp; maxGpuAllocationsToMove,</div>
+<div class="line"><a name="l07377"></a><span class="lineno"> 7377</span>&#160;        VkCommandBuffer commandBuffer);</div>
+<div class="line"><a name="l07378"></a><span class="lineno"> 7378</span>&#160;    <span class="keywordtype">void</span> DefragmentationEnd(</div>
+<div class="line"><a name="l07379"></a><span class="lineno"> 7379</span>&#160;        <span class="keyword">class</span> VmaBlockVectorDefragmentationContext* pCtx,</div>
+<div class="line"><a name="l07380"></a><span class="lineno"> 7380</span>&#160;        uint32_t flags,</div>
+<div class="line"><a name="l07381"></a><span class="lineno"> 7381</span>&#160;        <a class="code" href="struct_vma_defragmentation_stats.html">VmaDefragmentationStats</a>* pStats);</div>
+<div class="line"><a name="l07382"></a><span class="lineno"> 7382</span>&#160; </div>
+<div class="line"><a name="l07383"></a><span class="lineno"> 7383</span>&#160;    uint32_t ProcessDefragmentations(</div>
+<div class="line"><a name="l07384"></a><span class="lineno"> 7384</span>&#160;        <span class="keyword">class</span> VmaBlockVectorDefragmentationContext *pCtx,</div>
+<div class="line"><a name="l07385"></a><span class="lineno"> 7385</span>&#160;        <a class="code" href="struct_vma_defragmentation_pass_move_info.html">VmaDefragmentationPassMoveInfo</a>* pMove, uint32_t maxMoves);</div>
+<div class="line"><a name="l07386"></a><span class="lineno"> 7386</span>&#160; </div>
+<div class="line"><a name="l07387"></a><span class="lineno"> 7387</span>&#160;    <span class="keywordtype">void</span> CommitDefragmentations(</div>
+<div class="line"><a name="l07388"></a><span class="lineno"> 7388</span>&#160;        <span class="keyword">class</span> VmaBlockVectorDefragmentationContext *pCtx,</div>
+<div class="line"><a name="l07389"></a><span class="lineno"> 7389</span>&#160;        <a class="code" href="struct_vma_defragmentation_stats.html">VmaDefragmentationStats</a>* pStats);</div>
+<div class="line"><a name="l07390"></a><span class="lineno"> 7390</span>&#160; </div>
+<div class="line"><a name="l07392"></a><span class="lineno"> 7392</span>&#160;    <span class="comment">// To be used only while the m_Mutex is locked. Used during defragmentation.</span></div>
+<div class="line"><a name="l07393"></a><span class="lineno"> 7393</span>&#160; </div>
+<div class="line"><a name="l07394"></a><span class="lineno"> 7394</span>&#160;    <span class="keywordtype">size_t</span> GetBlockCount()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_Blocks.size(); }</div>
+<div class="line"><a name="l07395"></a><span class="lineno"> 7395</span>&#160;    VmaDeviceMemoryBlock* GetBlock(<span class="keywordtype">size_t</span> index)<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_Blocks[index]; }</div>
+<div class="line"><a name="l07396"></a><span class="lineno"> 7396</span>&#160;    <span class="keywordtype">size_t</span> CalcAllocationCount() <span class="keyword">const</span>;</div>
+<div class="line"><a name="l07397"></a><span class="lineno"> 7397</span>&#160;    <span class="keywordtype">bool</span> IsBufferImageGranularityConflictPossible() <span class="keyword">const</span>;</div>
+<div class="line"><a name="l07398"></a><span class="lineno"> 7398</span>&#160; </div>
+<div class="line"><a name="l07399"></a><span class="lineno"> 7399</span>&#160;<span class="keyword">private</span>:</div>
+<div class="line"><a name="l07400"></a><span class="lineno"> 7400</span>&#160;    <span class="keyword">friend</span> <span class="keyword">class </span>VmaDefragmentationAlgorithm_Generic;</div>
+<div class="line"><a name="l07401"></a><span class="lineno"> 7401</span>&#160; </div>
+<div class="line"><a name="l07402"></a><span class="lineno"> 7402</span>&#160;    <span class="keyword">const</span> <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> m_hAllocator;</div>
+<div class="line"><a name="l07403"></a><span class="lineno"> 7403</span>&#160;    <span class="keyword">const</span> <a class="code" href="struct_vma_pool.html">VmaPool</a> m_hParentPool;</div>
+<div class="line"><a name="l07404"></a><span class="lineno"> 7404</span>&#160;    <span class="keyword">const</span> uint32_t m_MemoryTypeIndex;</div>
+<div class="line"><a name="l07405"></a><span class="lineno"> 7405</span>&#160;    <span class="keyword">const</span> VkDeviceSize m_PreferredBlockSize;</div>
+<div class="line"><a name="l07406"></a><span class="lineno"> 7406</span>&#160;    <span class="keyword">const</span> <span class="keywordtype">size_t</span> m_MinBlockCount;</div>
+<div class="line"><a name="l07407"></a><span class="lineno"> 7407</span>&#160;    <span class="keyword">const</span> <span class="keywordtype">size_t</span> m_MaxBlockCount;</div>
+<div class="line"><a name="l07408"></a><span class="lineno"> 7408</span>&#160;    <span class="keyword">const</span> VkDeviceSize m_BufferImageGranularity;</div>
+<div class="line"><a name="l07409"></a><span class="lineno"> 7409</span>&#160;    <span class="keyword">const</span> uint32_t m_FrameInUseCount;</div>
+<div class="line"><a name="l07410"></a><span class="lineno"> 7410</span>&#160;    <span class="keyword">const</span> <span class="keywordtype">bool</span> m_ExplicitBlockSize;</div>
+<div class="line"><a name="l07411"></a><span class="lineno"> 7411</span>&#160;    <span class="keyword">const</span> uint32_t m_Algorithm;</div>
+<div class="line"><a name="l07412"></a><span class="lineno"> 7412</span>&#160;    <span class="keyword">const</span> <span class="keywordtype">float</span> m_Priority;</div>
+<div class="line"><a name="l07413"></a><span class="lineno"> 7413</span>&#160;    VMA_RW_MUTEX m_Mutex;</div>
+<div class="line"><a name="l07414"></a><span class="lineno"> 7414</span>&#160; </div>
+<div class="line"><a name="l07415"></a><span class="lineno"> 7415</span>&#160;    <span class="comment">/* There can be at most one allocation that is completely empty (except when minBlockCount &gt; 0) -</span></div>
+<div class="line"><a name="l07416"></a><span class="lineno"> 7416</span>&#160;<span class="comment">    a hysteresis to avoid pessimistic case of alternating creation and destruction of a VkDeviceMemory. */</span></div>
+<div class="line"><a name="l07417"></a><span class="lineno"> 7417</span>&#160;    <span class="keywordtype">bool</span> m_HasEmptyBlock;</div>
+<div class="line"><a name="l07418"></a><span class="lineno"> 7418</span>&#160;    <span class="comment">// Incrementally sorted by sumFreeSize, ascending.</span></div>
+<div class="line"><a name="l07419"></a><span class="lineno"> 7419</span>&#160;    VmaVector&lt; VmaDeviceMemoryBlock*, VmaStlAllocator&lt;VmaDeviceMemoryBlock*&gt; &gt; m_Blocks;</div>
+<div class="line"><a name="l07420"></a><span class="lineno"> 7420</span>&#160;    uint32_t m_NextBlockId;</div>
+<div class="line"><a name="l07421"></a><span class="lineno"> 7421</span>&#160; </div>
+<div class="line"><a name="l07422"></a><span class="lineno"> 7422</span>&#160;    VkDeviceSize CalcMaxBlockSize() <span class="keyword">const</span>;</div>
 <div class="line"><a name="l07423"></a><span class="lineno"> 7423</span>&#160; </div>
-<div class="line"><a name="l07424"></a><span class="lineno"> 7424</span>&#160;    <span class="comment">/*</span></div>
-<div class="line"><a name="l07425"></a><span class="lineno"> 7425</span>&#160;<span class="comment">    Returns:</span></div>
-<div class="line"><a name="l07426"></a><span class="lineno"> 7426</span>&#160;<span class="comment">    - `VK_SUCCESS` if succeeded and object can be destroyed immediately.</span></div>
-<div class="line"><a name="l07427"></a><span class="lineno"> 7427</span>&#160;<span class="comment">    - `VK_NOT_READY` if succeeded but the object must remain alive until vmaDefragmentationEnd().</span></div>
-<div class="line"><a name="l07428"></a><span class="lineno"> 7428</span>&#160;<span class="comment">    - Negative value if error occured and object can be destroyed immediately.</span></div>
-<div class="line"><a name="l07429"></a><span class="lineno"> 7429</span>&#160;<span class="comment">    */</span></div>
-<div class="line"><a name="l07430"></a><span class="lineno"> 7430</span>&#160;    VkResult Defragment(</div>
-<div class="line"><a name="l07431"></a><span class="lineno"> 7431</span>&#160;        VkDeviceSize maxCpuBytesToMove, uint32_t maxCpuAllocationsToMove,</div>
-<div class="line"><a name="l07432"></a><span class="lineno"> 7432</span>&#160;        VkDeviceSize maxGpuBytesToMove, uint32_t maxGpuAllocationsToMove,</div>
-<div class="line"><a name="l07433"></a><span class="lineno"> 7433</span>&#160;        VkCommandBuffer commandBuffer, <a class="code" href="struct_vma_defragmentation_stats.html">VmaDefragmentationStats</a>* pStats, <a class="code" href="vk__mem__alloc_8h.html#a88a77cef37e5d3c4fc9eb328885d048d">VmaDefragmentationFlags</a> flags);</div>
-<div class="line"><a name="l07434"></a><span class="lineno"> 7434</span>&#160; </div>
-<div class="line"><a name="l07435"></a><span class="lineno"> 7435</span>&#160;    VkResult DefragmentPassBegin(<a class="code" href="struct_vma_defragmentation_pass_info.html">VmaDefragmentationPassInfo</a>* pInfo);</div>
-<div class="line"><a name="l07436"></a><span class="lineno"> 7436</span>&#160;    VkResult DefragmentPassEnd();</div>
-<div class="line"><a name="l07437"></a><span class="lineno"> 7437</span>&#160; </div>
-<div class="line"><a name="l07438"></a><span class="lineno"> 7438</span>&#160;<span class="keyword">private</span>:</div>
-<div class="line"><a name="l07439"></a><span class="lineno"> 7439</span>&#160;    <span class="keyword">const</span> <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> m_hAllocator;</div>
-<div class="line"><a name="l07440"></a><span class="lineno"> 7440</span>&#160;    <span class="keyword">const</span> uint32_t m_CurrFrameIndex;</div>
-<div class="line"><a name="l07441"></a><span class="lineno"> 7441</span>&#160;    <span class="keyword">const</span> uint32_t m_Flags;</div>
-<div class="line"><a name="l07442"></a><span class="lineno"> 7442</span>&#160;    <a class="code" href="struct_vma_defragmentation_stats.html">VmaDefragmentationStats</a>* <span class="keyword">const</span> m_pStats;</div>
-<div class="line"><a name="l07443"></a><span class="lineno"> 7443</span>&#160; </div>
-<div class="line"><a name="l07444"></a><span class="lineno"> 7444</span>&#160;    VkDeviceSize m_MaxCpuBytesToMove;</div>
-<div class="line"><a name="l07445"></a><span class="lineno"> 7445</span>&#160;    uint32_t m_MaxCpuAllocationsToMove;</div>
-<div class="line"><a name="l07446"></a><span class="lineno"> 7446</span>&#160;    VkDeviceSize m_MaxGpuBytesToMove;</div>
-<div class="line"><a name="l07447"></a><span class="lineno"> 7447</span>&#160;    uint32_t m_MaxGpuAllocationsToMove;</div>
-<div class="line"><a name="l07448"></a><span class="lineno"> 7448</span>&#160; </div>
-<div class="line"><a name="l07449"></a><span class="lineno"> 7449</span>&#160;    <span class="comment">// Owner of these objects.</span></div>
-<div class="line"><a name="l07450"></a><span class="lineno"> 7450</span>&#160;    VmaBlockVectorDefragmentationContext* m_DefaultPoolContexts[VK_MAX_MEMORY_TYPES];</div>
-<div class="line"><a name="l07451"></a><span class="lineno"> 7451</span>&#160;    <span class="comment">// Owner of these objects.</span></div>
-<div class="line"><a name="l07452"></a><span class="lineno"> 7452</span>&#160;    VmaVector&lt; VmaBlockVectorDefragmentationContext*, VmaStlAllocator&lt;VmaBlockVectorDefragmentationContext*&gt; &gt; m_CustomPoolContexts;</div>
-<div class="line"><a name="l07453"></a><span class="lineno"> 7453</span>&#160;};</div>
-<div class="line"><a name="l07454"></a><span class="lineno"> 7454</span>&#160; </div>
-<div class="line"><a name="l07455"></a><span class="lineno"> 7455</span>&#160;<span class="preprocessor">#if VMA_RECORDING_ENABLED</span></div>
-<div class="line"><a name="l07456"></a><span class="lineno"> 7456</span>&#160; </div>
-<div class="line"><a name="l07457"></a><span class="lineno"> 7457</span>&#160;<span class="keyword">class </span>VmaRecorder</div>
-<div class="line"><a name="l07458"></a><span class="lineno"> 7458</span>&#160;{</div>
-<div class="line"><a name="l07459"></a><span class="lineno"> 7459</span>&#160;<span class="keyword">public</span>:</div>
-<div class="line"><a name="l07460"></a><span class="lineno"> 7460</span>&#160;    VmaRecorder();</div>
-<div class="line"><a name="l07461"></a><span class="lineno"> 7461</span>&#160;    VkResult Init(<span class="keyword">const</span> <a class="code" href="struct_vma_record_settings.html">VmaRecordSettings</a>&amp; settings, <span class="keywordtype">bool</span> useMutex);</div>
-<div class="line"><a name="l07462"></a><span class="lineno"> 7462</span>&#160;    <span class="keywordtype">void</span> WriteConfiguration(</div>
-<div class="line"><a name="l07463"></a><span class="lineno"> 7463</span>&#160;        <span class="keyword">const</span> VkPhysicalDeviceProperties&amp; devProps,</div>
-<div class="line"><a name="l07464"></a><span class="lineno"> 7464</span>&#160;        <span class="keyword">const</span> VkPhysicalDeviceMemoryProperties&amp; memProps,</div>
-<div class="line"><a name="l07465"></a><span class="lineno"> 7465</span>&#160;        uint32_t vulkanApiVersion,</div>
-<div class="line"><a name="l07466"></a><span class="lineno"> 7466</span>&#160;        <span class="keywordtype">bool</span> dedicatedAllocationExtensionEnabled,</div>
-<div class="line"><a name="l07467"></a><span class="lineno"> 7467</span>&#160;        <span class="keywordtype">bool</span> bindMemory2ExtensionEnabled,</div>
-<div class="line"><a name="l07468"></a><span class="lineno"> 7468</span>&#160;        <span class="keywordtype">bool</span> memoryBudgetExtensionEnabled,</div>
-<div class="line"><a name="l07469"></a><span class="lineno"> 7469</span>&#160;        <span class="keywordtype">bool</span> deviceCoherentMemoryExtensionEnabled);</div>
-<div class="line"><a name="l07470"></a><span class="lineno"> 7470</span>&#160;    ~VmaRecorder();</div>
+<div class="line"><a name="l07424"></a><span class="lineno"> 7424</span>&#160;    <span class="comment">// Finds and removes given block from vector.</span></div>
+<div class="line"><a name="l07425"></a><span class="lineno"> 7425</span>&#160;    <span class="keywordtype">void</span> Remove(VmaDeviceMemoryBlock* pBlock);</div>
+<div class="line"><a name="l07426"></a><span class="lineno"> 7426</span>&#160; </div>
+<div class="line"><a name="l07427"></a><span class="lineno"> 7427</span>&#160;    <span class="comment">// Performs single step in sorting m_Blocks. They may not be fully sorted</span></div>
+<div class="line"><a name="l07428"></a><span class="lineno"> 7428</span>&#160;    <span class="comment">// after this call.</span></div>
+<div class="line"><a name="l07429"></a><span class="lineno"> 7429</span>&#160;    <span class="keywordtype">void</span> IncrementallySortBlocks();</div>
+<div class="line"><a name="l07430"></a><span class="lineno"> 7430</span>&#160; </div>
+<div class="line"><a name="l07431"></a><span class="lineno"> 7431</span>&#160;    VkResult AllocatePage(</div>
+<div class="line"><a name="l07432"></a><span class="lineno"> 7432</span>&#160;        uint32_t currentFrameIndex,</div>
+<div class="line"><a name="l07433"></a><span class="lineno"> 7433</span>&#160;        VkDeviceSize size,</div>
+<div class="line"><a name="l07434"></a><span class="lineno"> 7434</span>&#160;        VkDeviceSize alignment,</div>
+<div class="line"><a name="l07435"></a><span class="lineno"> 7435</span>&#160;        <span class="keyword">const</span> <a class="code" href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a>&amp; createInfo,</div>
+<div class="line"><a name="l07436"></a><span class="lineno"> 7436</span>&#160;        VmaSuballocationType suballocType,</div>
+<div class="line"><a name="l07437"></a><span class="lineno"> 7437</span>&#160;        <a class="code" href="struct_vma_allocation.html">VmaAllocation</a>* pAllocation);</div>
+<div class="line"><a name="l07438"></a><span class="lineno"> 7438</span>&#160; </div>
+<div class="line"><a name="l07439"></a><span class="lineno"> 7439</span>&#160;    <span class="comment">// To be used only without CAN_MAKE_OTHER_LOST flag.</span></div>
+<div class="line"><a name="l07440"></a><span class="lineno"> 7440</span>&#160;    VkResult AllocateFromBlock(</div>
+<div class="line"><a name="l07441"></a><span class="lineno"> 7441</span>&#160;        VmaDeviceMemoryBlock* pBlock,</div>
+<div class="line"><a name="l07442"></a><span class="lineno"> 7442</span>&#160;        uint32_t currentFrameIndex,</div>
+<div class="line"><a name="l07443"></a><span class="lineno"> 7443</span>&#160;        VkDeviceSize size,</div>
+<div class="line"><a name="l07444"></a><span class="lineno"> 7444</span>&#160;        VkDeviceSize alignment,</div>
+<div class="line"><a name="l07445"></a><span class="lineno"> 7445</span>&#160;        <a class="code" href="vk__mem__alloc_8h.html#a5225e5e11f8376f6a31a1791f3d6e817">VmaAllocationCreateFlags</a> allocFlags,</div>
+<div class="line"><a name="l07446"></a><span class="lineno"> 7446</span>&#160;        <span class="keywordtype">void</span>* pUserData,</div>
+<div class="line"><a name="l07447"></a><span class="lineno"> 7447</span>&#160;        VmaSuballocationType suballocType,</div>
+<div class="line"><a name="l07448"></a><span class="lineno"> 7448</span>&#160;        uint32_t strategy,</div>
+<div class="line"><a name="l07449"></a><span class="lineno"> 7449</span>&#160;        <a class="code" href="struct_vma_allocation.html">VmaAllocation</a>* pAllocation);</div>
+<div class="line"><a name="l07450"></a><span class="lineno"> 7450</span>&#160; </div>
+<div class="line"><a name="l07451"></a><span class="lineno"> 7451</span>&#160;    VkResult CreateBlock(VkDeviceSize blockSize, <span class="keywordtype">size_t</span>* pNewBlockIndex);</div>
+<div class="line"><a name="l07452"></a><span class="lineno"> 7452</span>&#160; </div>
+<div class="line"><a name="l07453"></a><span class="lineno"> 7453</span>&#160;    <span class="comment">// Saves result to pCtx-&gt;res.</span></div>
+<div class="line"><a name="l07454"></a><span class="lineno"> 7454</span>&#160;    <span class="keywordtype">void</span> ApplyDefragmentationMovesCpu(</div>
+<div class="line"><a name="l07455"></a><span class="lineno"> 7455</span>&#160;        <span class="keyword">class</span> VmaBlockVectorDefragmentationContext* pDefragCtx,</div>
+<div class="line"><a name="l07456"></a><span class="lineno"> 7456</span>&#160;        <span class="keyword">const</span> VmaVector&lt; VmaDefragmentationMove, VmaStlAllocator&lt;VmaDefragmentationMove&gt; &gt;&amp; moves);</div>
+<div class="line"><a name="l07457"></a><span class="lineno"> 7457</span>&#160;    <span class="comment">// Saves result to pCtx-&gt;res.</span></div>
+<div class="line"><a name="l07458"></a><span class="lineno"> 7458</span>&#160;    <span class="keywordtype">void</span> ApplyDefragmentationMovesGpu(</div>
+<div class="line"><a name="l07459"></a><span class="lineno"> 7459</span>&#160;        <span class="keyword">class</span> VmaBlockVectorDefragmentationContext* pDefragCtx,</div>
+<div class="line"><a name="l07460"></a><span class="lineno"> 7460</span>&#160;        VmaVector&lt; VmaDefragmentationMove, VmaStlAllocator&lt;VmaDefragmentationMove&gt; &gt;&amp; moves,</div>
+<div class="line"><a name="l07461"></a><span class="lineno"> 7461</span>&#160;        VkCommandBuffer commandBuffer);</div>
+<div class="line"><a name="l07462"></a><span class="lineno"> 7462</span>&#160; </div>
+<div class="line"><a name="l07463"></a><span class="lineno"> 7463</span>&#160;    <span class="comment">/*</span></div>
+<div class="line"><a name="l07464"></a><span class="lineno"> 7464</span>&#160;<span class="comment">    Used during defragmentation. pDefragmentationStats is optional. It&#39;s in/out</span></div>
+<div class="line"><a name="l07465"></a><span class="lineno"> 7465</span>&#160;<span class="comment">    - updated with new data.</span></div>
+<div class="line"><a name="l07466"></a><span class="lineno"> 7466</span>&#160;<span class="comment">    */</span></div>
+<div class="line"><a name="l07467"></a><span class="lineno"> 7467</span>&#160;    <span class="keywordtype">void</span> FreeEmptyBlocks(<a class="code" href="struct_vma_defragmentation_stats.html">VmaDefragmentationStats</a>* pDefragmentationStats);</div>
+<div class="line"><a name="l07468"></a><span class="lineno"> 7468</span>&#160; </div>
+<div class="line"><a name="l07469"></a><span class="lineno"> 7469</span>&#160;    <span class="keywordtype">void</span> UpdateHasEmptyBlock();</div>
+<div class="line"><a name="l07470"></a><span class="lineno"> 7470</span>&#160;};</div>
 <div class="line"><a name="l07471"></a><span class="lineno"> 7471</span>&#160; </div>
-<div class="line"><a name="l07472"></a><span class="lineno"> 7472</span>&#160;    <span class="keywordtype">void</span> RecordCreateAllocator(uint32_t frameIndex);</div>
-<div class="line"><a name="l07473"></a><span class="lineno"> 7473</span>&#160;    <span class="keywordtype">void</span> RecordDestroyAllocator(uint32_t frameIndex);</div>
-<div class="line"><a name="l07474"></a><span class="lineno"> 7474</span>&#160;    <span class="keywordtype">void</span> RecordCreatePool(uint32_t frameIndex,</div>
-<div class="line"><a name="l07475"></a><span class="lineno"> 7475</span>&#160;        <span class="keyword">const</span> <a class="code" href="struct_vma_pool_create_info.html">VmaPoolCreateInfo</a>&amp; createInfo,</div>
-<div class="line"><a name="l07476"></a><span class="lineno"> 7476</span>&#160;        <a class="code" href="struct_vma_pool.html">VmaPool</a> pool);</div>
-<div class="line"><a name="l07477"></a><span class="lineno"> 7477</span>&#160;    <span class="keywordtype">void</span> RecordDestroyPool(uint32_t frameIndex, <a class="code" href="struct_vma_pool.html">VmaPool</a> pool);</div>
-<div class="line"><a name="l07478"></a><span class="lineno"> 7478</span>&#160;    <span class="keywordtype">void</span> RecordAllocateMemory(uint32_t frameIndex,</div>
-<div class="line"><a name="l07479"></a><span class="lineno"> 7479</span>&#160;        <span class="keyword">const</span> VkMemoryRequirements&amp; vkMemReq,</div>
-<div class="line"><a name="l07480"></a><span class="lineno"> 7480</span>&#160;        <span class="keyword">const</span> <a class="code" href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a>&amp; createInfo,</div>
-<div class="line"><a name="l07481"></a><span class="lineno"> 7481</span>&#160;        <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation);</div>
-<div class="line"><a name="l07482"></a><span class="lineno"> 7482</span>&#160;    <span class="keywordtype">void</span> RecordAllocateMemoryPages(uint32_t frameIndex,</div>
-<div class="line"><a name="l07483"></a><span class="lineno"> 7483</span>&#160;        <span class="keyword">const</span> VkMemoryRequirements&amp; vkMemReq,</div>
-<div class="line"><a name="l07484"></a><span class="lineno"> 7484</span>&#160;        <span class="keyword">const</span> <a class="code" href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a>&amp; createInfo,</div>
-<div class="line"><a name="l07485"></a><span class="lineno"> 7485</span>&#160;        uint64_t allocationCount,</div>
-<div class="line"><a name="l07486"></a><span class="lineno"> 7486</span>&#160;        <span class="keyword">const</span> <a class="code" href="struct_vma_allocation.html">VmaAllocation</a>* pAllocations);</div>
-<div class="line"><a name="l07487"></a><span class="lineno"> 7487</span>&#160;    <span class="keywordtype">void</span> RecordAllocateMemoryForBuffer(uint32_t frameIndex,</div>
-<div class="line"><a name="l07488"></a><span class="lineno"> 7488</span>&#160;        <span class="keyword">const</span> VkMemoryRequirements&amp; vkMemReq,</div>
-<div class="line"><a name="l07489"></a><span class="lineno"> 7489</span>&#160;        <span class="keywordtype">bool</span> requiresDedicatedAllocation,</div>
-<div class="line"><a name="l07490"></a><span class="lineno"> 7490</span>&#160;        <span class="keywordtype">bool</span> prefersDedicatedAllocation,</div>
-<div class="line"><a name="l07491"></a><span class="lineno"> 7491</span>&#160;        <span class="keyword">const</span> <a class="code" href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a>&amp; createInfo,</div>
-<div class="line"><a name="l07492"></a><span class="lineno"> 7492</span>&#160;        <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation);</div>
-<div class="line"><a name="l07493"></a><span class="lineno"> 7493</span>&#160;    <span class="keywordtype">void</span> RecordAllocateMemoryForImage(uint32_t frameIndex,</div>
-<div class="line"><a name="l07494"></a><span class="lineno"> 7494</span>&#160;        <span class="keyword">const</span> VkMemoryRequirements&amp; vkMemReq,</div>
-<div class="line"><a name="l07495"></a><span class="lineno"> 7495</span>&#160;        <span class="keywordtype">bool</span> requiresDedicatedAllocation,</div>
-<div class="line"><a name="l07496"></a><span class="lineno"> 7496</span>&#160;        <span class="keywordtype">bool</span> prefersDedicatedAllocation,</div>
-<div class="line"><a name="l07497"></a><span class="lineno"> 7497</span>&#160;        <span class="keyword">const</span> <a class="code" href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a>&amp; createInfo,</div>
-<div class="line"><a name="l07498"></a><span class="lineno"> 7498</span>&#160;        <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation);</div>
-<div class="line"><a name="l07499"></a><span class="lineno"> 7499</span>&#160;    <span class="keywordtype">void</span> RecordFreeMemory(uint32_t frameIndex,</div>
-<div class="line"><a name="l07500"></a><span class="lineno"> 7500</span>&#160;        <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation);</div>
-<div class="line"><a name="l07501"></a><span class="lineno"> 7501</span>&#160;    <span class="keywordtype">void</span> RecordFreeMemoryPages(uint32_t frameIndex,</div>
-<div class="line"><a name="l07502"></a><span class="lineno"> 7502</span>&#160;        uint64_t allocationCount,</div>
-<div class="line"><a name="l07503"></a><span class="lineno"> 7503</span>&#160;        <span class="keyword">const</span> <a class="code" href="struct_vma_allocation.html">VmaAllocation</a>* pAllocations);</div>
-<div class="line"><a name="l07504"></a><span class="lineno"> 7504</span>&#160;    <span class="keywordtype">void</span> RecordSetAllocationUserData(uint32_t frameIndex,</div>
-<div class="line"><a name="l07505"></a><span class="lineno"> 7505</span>&#160;        <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation,</div>
-<div class="line"><a name="l07506"></a><span class="lineno"> 7506</span>&#160;        <span class="keyword">const</span> <span class="keywordtype">void</span>* pUserData);</div>
-<div class="line"><a name="l07507"></a><span class="lineno"> 7507</span>&#160;    <span class="keywordtype">void</span> RecordCreateLostAllocation(uint32_t frameIndex,</div>
-<div class="line"><a name="l07508"></a><span class="lineno"> 7508</span>&#160;        <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation);</div>
-<div class="line"><a name="l07509"></a><span class="lineno"> 7509</span>&#160;    <span class="keywordtype">void</span> RecordMapMemory(uint32_t frameIndex,</div>
-<div class="line"><a name="l07510"></a><span class="lineno"> 7510</span>&#160;        <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation);</div>
-<div class="line"><a name="l07511"></a><span class="lineno"> 7511</span>&#160;    <span class="keywordtype">void</span> RecordUnmapMemory(uint32_t frameIndex,</div>
-<div class="line"><a name="l07512"></a><span class="lineno"> 7512</span>&#160;        <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation);</div>
-<div class="line"><a name="l07513"></a><span class="lineno"> 7513</span>&#160;    <span class="keywordtype">void</span> RecordFlushAllocation(uint32_t frameIndex,</div>
-<div class="line"><a name="l07514"></a><span class="lineno"> 7514</span>&#160;        <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation, VkDeviceSize offset, VkDeviceSize size);</div>
-<div class="line"><a name="l07515"></a><span class="lineno"> 7515</span>&#160;    <span class="keywordtype">void</span> RecordInvalidateAllocation(uint32_t frameIndex,</div>
-<div class="line"><a name="l07516"></a><span class="lineno"> 7516</span>&#160;        <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation, VkDeviceSize offset, VkDeviceSize size);</div>
-<div class="line"><a name="l07517"></a><span class="lineno"> 7517</span>&#160;    <span class="keywordtype">void</span> RecordCreateBuffer(uint32_t frameIndex,</div>
-<div class="line"><a name="l07518"></a><span class="lineno"> 7518</span>&#160;        <span class="keyword">const</span> VkBufferCreateInfo&amp; bufCreateInfo,</div>
-<div class="line"><a name="l07519"></a><span class="lineno"> 7519</span>&#160;        <span class="keyword">const</span> <a class="code" href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a>&amp; allocCreateInfo,</div>
-<div class="line"><a name="l07520"></a><span class="lineno"> 7520</span>&#160;        <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation);</div>
-<div class="line"><a name="l07521"></a><span class="lineno"> 7521</span>&#160;    <span class="keywordtype">void</span> RecordCreateImage(uint32_t frameIndex,</div>
-<div class="line"><a name="l07522"></a><span class="lineno"> 7522</span>&#160;        <span class="keyword">const</span> VkImageCreateInfo&amp; imageCreateInfo,</div>
-<div class="line"><a name="l07523"></a><span class="lineno"> 7523</span>&#160;        <span class="keyword">const</span> <a class="code" href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a>&amp; allocCreateInfo,</div>
-<div class="line"><a name="l07524"></a><span class="lineno"> 7524</span>&#160;        <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation);</div>
-<div class="line"><a name="l07525"></a><span class="lineno"> 7525</span>&#160;    <span class="keywordtype">void</span> RecordDestroyBuffer(uint32_t frameIndex,</div>
-<div class="line"><a name="l07526"></a><span class="lineno"> 7526</span>&#160;        <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation);</div>
-<div class="line"><a name="l07527"></a><span class="lineno"> 7527</span>&#160;    <span class="keywordtype">void</span> RecordDestroyImage(uint32_t frameIndex,</div>
-<div class="line"><a name="l07528"></a><span class="lineno"> 7528</span>&#160;        <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation);</div>
-<div class="line"><a name="l07529"></a><span class="lineno"> 7529</span>&#160;    <span class="keywordtype">void</span> RecordTouchAllocation(uint32_t frameIndex,</div>
-<div class="line"><a name="l07530"></a><span class="lineno"> 7530</span>&#160;        <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation);</div>
-<div class="line"><a name="l07531"></a><span class="lineno"> 7531</span>&#160;    <span class="keywordtype">void</span> RecordGetAllocationInfo(uint32_t frameIndex,</div>
-<div class="line"><a name="l07532"></a><span class="lineno"> 7532</span>&#160;        <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation);</div>
-<div class="line"><a name="l07533"></a><span class="lineno"> 7533</span>&#160;    <span class="keywordtype">void</span> RecordMakePoolAllocationsLost(uint32_t frameIndex,</div>
-<div class="line"><a name="l07534"></a><span class="lineno"> 7534</span>&#160;        <a class="code" href="struct_vma_pool.html">VmaPool</a> pool);</div>
-<div class="line"><a name="l07535"></a><span class="lineno"> 7535</span>&#160;    <span class="keywordtype">void</span> RecordDefragmentationBegin(uint32_t frameIndex,</div>
-<div class="line"><a name="l07536"></a><span class="lineno"> 7536</span>&#160;        <span class="keyword">const</span> <a class="code" href="struct_vma_defragmentation_info2.html">VmaDefragmentationInfo2</a>&amp; info,</div>
-<div class="line"><a name="l07537"></a><span class="lineno"> 7537</span>&#160;        <a class="code" href="struct_vma_defragmentation_context.html">VmaDefragmentationContext</a> ctx);</div>
-<div class="line"><a name="l07538"></a><span class="lineno"> 7538</span>&#160;    <span class="keywordtype">void</span> RecordDefragmentationEnd(uint32_t frameIndex,</div>
-<div class="line"><a name="l07539"></a><span class="lineno"> 7539</span>&#160;        <a class="code" href="struct_vma_defragmentation_context.html">VmaDefragmentationContext</a> ctx);</div>
-<div class="line"><a name="l07540"></a><span class="lineno"> 7540</span>&#160;    <span class="keywordtype">void</span> RecordSetPoolName(uint32_t frameIndex,</div>
-<div class="line"><a name="l07541"></a><span class="lineno"> 7541</span>&#160;        <a class="code" href="struct_vma_pool.html">VmaPool</a> pool,</div>
-<div class="line"><a name="l07542"></a><span class="lineno"> 7542</span>&#160;        <span class="keyword">const</span> <span class="keywordtype">char</span>* name);</div>
+<div class="line"><a name="l07472"></a><span class="lineno"> 7472</span>&#160;<span class="keyword">struct </span>VmaPool_T</div>
+<div class="line"><a name="l07473"></a><span class="lineno"> 7473</span>&#160;{</div>
+<div class="line"><a name="l07474"></a><span class="lineno"> 7474</span>&#160;    VMA_CLASS_NO_COPY(VmaPool_T)</div>
+<div class="line"><a name="l07475"></a><span class="lineno"> 7475</span>&#160;<span class="keyword">public</span>:</div>
+<div class="line"><a name="l07476"></a><span class="lineno"> 7476</span>&#160;    VmaBlockVector m_BlockVector;</div>
+<div class="line"><a name="l07477"></a><span class="lineno"> 7477</span>&#160; </div>
+<div class="line"><a name="l07478"></a><span class="lineno"> 7478</span>&#160;    VmaPool_T(</div>
+<div class="line"><a name="l07479"></a><span class="lineno"> 7479</span>&#160;        <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator,</div>
+<div class="line"><a name="l07480"></a><span class="lineno"> 7480</span>&#160;        <span class="keyword">const</span> <a class="code" href="struct_vma_pool_create_info.html">VmaPoolCreateInfo</a>&amp; createInfo,</div>
+<div class="line"><a name="l07481"></a><span class="lineno"> 7481</span>&#160;        VkDeviceSize preferredBlockSize);</div>
+<div class="line"><a name="l07482"></a><span class="lineno"> 7482</span>&#160;    ~VmaPool_T();</div>
+<div class="line"><a name="l07483"></a><span class="lineno"> 7483</span>&#160; </div>
+<div class="line"><a name="l07484"></a><span class="lineno"> 7484</span>&#160;    uint32_t GetId()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_Id; }</div>
+<div class="line"><a name="l07485"></a><span class="lineno"> 7485</span>&#160;    <span class="keywordtype">void</span> SetId(uint32_t <span class="keywordtype">id</span>) { VMA_ASSERT(m_Id == 0); m_Id = id; }</div>
+<div class="line"><a name="l07486"></a><span class="lineno"> 7486</span>&#160; </div>
+<div class="line"><a name="l07487"></a><span class="lineno"> 7487</span>&#160;    <span class="keyword">const</span> <span class="keywordtype">char</span>* GetName()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_Name; }</div>
+<div class="line"><a name="l07488"></a><span class="lineno"> 7488</span>&#160;    <span class="keywordtype">void</span> SetName(<span class="keyword">const</span> <span class="keywordtype">char</span>* pName);</div>
+<div class="line"><a name="l07489"></a><span class="lineno"> 7489</span>&#160; </div>
+<div class="line"><a name="l07490"></a><span class="lineno"> 7490</span>&#160;<span class="preprocessor">#if VMA_STATS_STRING_ENABLED</span></div>
+<div class="line"><a name="l07491"></a><span class="lineno"> 7491</span>&#160;    <span class="comment">//void PrintDetailedMap(class VmaStringBuilder&amp; sb);</span></div>
+<div class="line"><a name="l07492"></a><span class="lineno"> 7492</span>&#160;<span class="preprocessor">#endif</span></div>
+<div class="line"><a name="l07493"></a><span class="lineno"> 7493</span>&#160; </div>
+<div class="line"><a name="l07494"></a><span class="lineno"> 7494</span>&#160;<span class="keyword">private</span>:</div>
+<div class="line"><a name="l07495"></a><span class="lineno"> 7495</span>&#160;    uint32_t m_Id;</div>
+<div class="line"><a name="l07496"></a><span class="lineno"> 7496</span>&#160;    <span class="keywordtype">char</span>* m_Name;</div>
+<div class="line"><a name="l07497"></a><span class="lineno"> 7497</span>&#160;    VmaPool_T* m_PrevPool = VMA_NULL;</div>
+<div class="line"><a name="l07498"></a><span class="lineno"> 7498</span>&#160;    VmaPool_T* m_NextPool = VMA_NULL;</div>
+<div class="line"><a name="l07499"></a><span class="lineno"> 7499</span>&#160;    <span class="keyword">friend</span> <span class="keyword">struct </span>VmaPoolListItemTraits;</div>
+<div class="line"><a name="l07500"></a><span class="lineno"> 7500</span>&#160;};</div>
+<div class="line"><a name="l07501"></a><span class="lineno"> 7501</span>&#160; </div>
+<div class="line"><a name="l07502"></a><span class="lineno"> 7502</span>&#160;<span class="keyword">struct </span>VmaPoolListItemTraits</div>
+<div class="line"><a name="l07503"></a><span class="lineno"> 7503</span>&#160;{</div>
+<div class="line"><a name="l07504"></a><span class="lineno"> 7504</span>&#160;    <span class="keyword">typedef</span> VmaPool_T ItemType;</div>
+<div class="line"><a name="l07505"></a><span class="lineno"> 7505</span>&#160;    <span class="keyword">static</span> ItemType* GetPrev(<span class="keyword">const</span> ItemType* item) { <span class="keywordflow">return</span> item-&gt;m_PrevPool; }</div>
+<div class="line"><a name="l07506"></a><span class="lineno"> 7506</span>&#160;    <span class="keyword">static</span> ItemType* GetNext(<span class="keyword">const</span> ItemType* item) { <span class="keywordflow">return</span> item-&gt;m_NextPool; }</div>
+<div class="line"><a name="l07507"></a><span class="lineno"> 7507</span>&#160;    <span class="keyword">static</span> ItemType*&amp; AccessPrev(ItemType* item) { <span class="keywordflow">return</span> item-&gt;m_PrevPool; }</div>
+<div class="line"><a name="l07508"></a><span class="lineno"> 7508</span>&#160;    <span class="keyword">static</span> ItemType*&amp; AccessNext(ItemType* item) { <span class="keywordflow">return</span> item-&gt;m_NextPool; }</div>
+<div class="line"><a name="l07509"></a><span class="lineno"> 7509</span>&#160;};</div>
+<div class="line"><a name="l07510"></a><span class="lineno"> 7510</span>&#160; </div>
+<div class="line"><a name="l07511"></a><span class="lineno"> 7511</span>&#160;<span class="comment">/*</span></div>
+<div class="line"><a name="l07512"></a><span class="lineno"> 7512</span>&#160;<span class="comment">Performs defragmentation:</span></div>
+<div class="line"><a name="l07513"></a><span class="lineno"> 7513</span>&#160;<span class="comment"></span> </div>
+<div class="line"><a name="l07514"></a><span class="lineno"> 7514</span>&#160;<span class="comment">- Updates `pBlockVector-&gt;m_pMetadata`.</span></div>
+<div class="line"><a name="l07515"></a><span class="lineno"> 7515</span>&#160;<span class="comment">- Updates allocations by calling ChangeBlockAllocation() or ChangeOffset().</span></div>
+<div class="line"><a name="l07516"></a><span class="lineno"> 7516</span>&#160;<span class="comment">- Does not move actual data, only returns requested moves as `moves`.</span></div>
+<div class="line"><a name="l07517"></a><span class="lineno"> 7517</span>&#160;<span class="comment">*/</span></div>
+<div class="line"><a name="l07518"></a><span class="lineno"> 7518</span>&#160;<span class="keyword">class </span>VmaDefragmentationAlgorithm</div>
+<div class="line"><a name="l07519"></a><span class="lineno"> 7519</span>&#160;{</div>
+<div class="line"><a name="l07520"></a><span class="lineno"> 7520</span>&#160;    VMA_CLASS_NO_COPY(VmaDefragmentationAlgorithm)</div>
+<div class="line"><a name="l07521"></a><span class="lineno"> 7521</span>&#160;<span class="keyword">public</span>:</div>
+<div class="line"><a name="l07522"></a><span class="lineno"> 7522</span>&#160;    VmaDefragmentationAlgorithm(</div>
+<div class="line"><a name="l07523"></a><span class="lineno"> 7523</span>&#160;        <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator,</div>
+<div class="line"><a name="l07524"></a><span class="lineno"> 7524</span>&#160;        VmaBlockVector* pBlockVector,</div>
+<div class="line"><a name="l07525"></a><span class="lineno"> 7525</span>&#160;        uint32_t currentFrameIndex) :</div>
+<div class="line"><a name="l07526"></a><span class="lineno"> 7526</span>&#160;        m_hAllocator(hAllocator),</div>
+<div class="line"><a name="l07527"></a><span class="lineno"> 7527</span>&#160;        m_pBlockVector(pBlockVector),</div>
+<div class="line"><a name="l07528"></a><span class="lineno"> 7528</span>&#160;        m_CurrentFrameIndex(currentFrameIndex)</div>
+<div class="line"><a name="l07529"></a><span class="lineno"> 7529</span>&#160;    {</div>
+<div class="line"><a name="l07530"></a><span class="lineno"> 7530</span>&#160;    }</div>
+<div class="line"><a name="l07531"></a><span class="lineno"> 7531</span>&#160;    <span class="keyword">virtual</span> ~VmaDefragmentationAlgorithm()</div>
+<div class="line"><a name="l07532"></a><span class="lineno"> 7532</span>&#160;    {</div>
+<div class="line"><a name="l07533"></a><span class="lineno"> 7533</span>&#160;    }</div>
+<div class="line"><a name="l07534"></a><span class="lineno"> 7534</span>&#160; </div>
+<div class="line"><a name="l07535"></a><span class="lineno"> 7535</span>&#160;    <span class="keyword">virtual</span> <span class="keywordtype">void</span> AddAllocation(<a class="code" href="struct_vma_allocation.html">VmaAllocation</a> hAlloc, VkBool32* pChanged) = 0;</div>
+<div class="line"><a name="l07536"></a><span class="lineno"> 7536</span>&#160;    <span class="keyword">virtual</span> <span class="keywordtype">void</span> AddAll() = 0;</div>
+<div class="line"><a name="l07537"></a><span class="lineno"> 7537</span>&#160; </div>
+<div class="line"><a name="l07538"></a><span class="lineno"> 7538</span>&#160;    <span class="keyword">virtual</span> VkResult Defragment(</div>
+<div class="line"><a name="l07539"></a><span class="lineno"> 7539</span>&#160;        VmaVector&lt; VmaDefragmentationMove, VmaStlAllocator&lt;VmaDefragmentationMove&gt; &gt;&amp; moves,</div>
+<div class="line"><a name="l07540"></a><span class="lineno"> 7540</span>&#160;        VkDeviceSize maxBytesToMove,</div>
+<div class="line"><a name="l07541"></a><span class="lineno"> 7541</span>&#160;        uint32_t maxAllocationsToMove,</div>
+<div class="line"><a name="l07542"></a><span class="lineno"> 7542</span>&#160;        <a class="code" href="vk__mem__alloc_8h.html#a88a77cef37e5d3c4fc9eb328885d048d">VmaDefragmentationFlags</a> flags) = 0;</div>
 <div class="line"><a name="l07543"></a><span class="lineno"> 7543</span>&#160; </div>
-<div class="line"><a name="l07544"></a><span class="lineno"> 7544</span>&#160;<span class="keyword">private</span>:</div>
-<div class="line"><a name="l07545"></a><span class="lineno"> 7545</span>&#160;    <span class="keyword">struct </span>CallParams</div>
-<div class="line"><a name="l07546"></a><span class="lineno"> 7546</span>&#160;    {</div>
-<div class="line"><a name="l07547"></a><span class="lineno"> 7547</span>&#160;        uint32_t threadId;</div>
-<div class="line"><a name="l07548"></a><span class="lineno"> 7548</span>&#160;        <span class="keywordtype">double</span> time;</div>
-<div class="line"><a name="l07549"></a><span class="lineno"> 7549</span>&#160;    };</div>
-<div class="line"><a name="l07550"></a><span class="lineno"> 7550</span>&#160; </div>
-<div class="line"><a name="l07551"></a><span class="lineno"> 7551</span>&#160;    <span class="keyword">class </span>UserDataString</div>
-<div class="line"><a name="l07552"></a><span class="lineno"> 7552</span>&#160;    {</div>
-<div class="line"><a name="l07553"></a><span class="lineno"> 7553</span>&#160;    <span class="keyword">public</span>:</div>
-<div class="line"><a name="l07554"></a><span class="lineno"> 7554</span>&#160;        UserDataString(<a class="code" href="vk__mem__alloc_8h.html#a5225e5e11f8376f6a31a1791f3d6e817">VmaAllocationCreateFlags</a> allocFlags, <span class="keyword">const</span> <span class="keywordtype">void</span>* pUserData);</div>
-<div class="line"><a name="l07555"></a><span class="lineno"> 7555</span>&#160;        <span class="keyword">const</span> <span class="keywordtype">char</span>* GetString()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_Str; }</div>
+<div class="line"><a name="l07544"></a><span class="lineno"> 7544</span>&#160;    <span class="keyword">virtual</span> VkDeviceSize GetBytesMoved() <span class="keyword">const</span> = 0;</div>
+<div class="line"><a name="l07545"></a><span class="lineno"> 7545</span>&#160;    <span class="keyword">virtual</span> uint32_t GetAllocationsMoved() <span class="keyword">const</span> = 0;</div>
+<div class="line"><a name="l07546"></a><span class="lineno"> 7546</span>&#160; </div>
+<div class="line"><a name="l07547"></a><span class="lineno"> 7547</span>&#160;<span class="keyword">protected</span>:</div>
+<div class="line"><a name="l07548"></a><span class="lineno"> 7548</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> <span class="keyword">const</span> m_hAllocator;</div>
+<div class="line"><a name="l07549"></a><span class="lineno"> 7549</span>&#160;    VmaBlockVector* <span class="keyword">const</span> m_pBlockVector;</div>
+<div class="line"><a name="l07550"></a><span class="lineno"> 7550</span>&#160;    <span class="keyword">const</span> uint32_t m_CurrentFrameIndex;</div>
+<div class="line"><a name="l07551"></a><span class="lineno"> 7551</span>&#160; </div>
+<div class="line"><a name="l07552"></a><span class="lineno"> 7552</span>&#160;    <span class="keyword">struct </span>AllocationInfo</div>
+<div class="line"><a name="l07553"></a><span class="lineno"> 7553</span>&#160;    {</div>
+<div class="line"><a name="l07554"></a><span class="lineno"> 7554</span>&#160;        <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> m_hAllocation;</div>
+<div class="line"><a name="l07555"></a><span class="lineno"> 7555</span>&#160;        VkBool32* m_pChanged;</div>
 <div class="line"><a name="l07556"></a><span class="lineno"> 7556</span>&#160; </div>
-<div class="line"><a name="l07557"></a><span class="lineno"> 7557</span>&#160;    <span class="keyword">private</span>:</div>
-<div class="line"><a name="l07558"></a><span class="lineno"> 7558</span>&#160;        <span class="keywordtype">char</span> m_PtrStr[17];</div>
-<div class="line"><a name="l07559"></a><span class="lineno"> 7559</span>&#160;        <span class="keyword">const</span> <span class="keywordtype">char</span>* m_Str;</div>
-<div class="line"><a name="l07560"></a><span class="lineno"> 7560</span>&#160;    };</div>
-<div class="line"><a name="l07561"></a><span class="lineno"> 7561</span>&#160; </div>
-<div class="line"><a name="l07562"></a><span class="lineno"> 7562</span>&#160;    <span class="keywordtype">bool</span> m_UseMutex;</div>
-<div class="line"><a name="l07563"></a><span class="lineno"> 7563</span>&#160;    <a class="code" href="vk__mem__alloc_8h.html#af3929a1a4547c592fc0b0e55ef452828">VmaRecordFlags</a> m_Flags;</div>
-<div class="line"><a name="l07564"></a><span class="lineno"> 7564</span>&#160;    FILE* m_File;</div>
-<div class="line"><a name="l07565"></a><span class="lineno"> 7565</span>&#160;    VMA_MUTEX m_FileMutex;</div>
-<div class="line"><a name="l07566"></a><span class="lineno"> 7566</span>&#160;    std::chrono::time_point&lt;std::chrono::high_resolution_clock&gt; m_RecordingStartTime;</div>
-<div class="line"><a name="l07567"></a><span class="lineno"> 7567</span>&#160; </div>
-<div class="line"><a name="l07568"></a><span class="lineno"> 7568</span>&#160;    <span class="keywordtype">void</span> GetBasicParams(CallParams&amp; outParams);</div>
+<div class="line"><a name="l07557"></a><span class="lineno"> 7557</span>&#160;        AllocationInfo() :</div>
+<div class="line"><a name="l07558"></a><span class="lineno"> 7558</span>&#160;            m_hAllocation(VK_NULL_HANDLE),</div>
+<div class="line"><a name="l07559"></a><span class="lineno"> 7559</span>&#160;            m_pChanged(VMA_NULL)</div>
+<div class="line"><a name="l07560"></a><span class="lineno"> 7560</span>&#160;        {</div>
+<div class="line"><a name="l07561"></a><span class="lineno"> 7561</span>&#160;        }</div>
+<div class="line"><a name="l07562"></a><span class="lineno"> 7562</span>&#160;        AllocationInfo(<a class="code" href="struct_vma_allocation.html">VmaAllocation</a> hAlloc, VkBool32* pChanged) :</div>
+<div class="line"><a name="l07563"></a><span class="lineno"> 7563</span>&#160;            m_hAllocation(hAlloc),</div>
+<div class="line"><a name="l07564"></a><span class="lineno"> 7564</span>&#160;            m_pChanged(pChanged)</div>
+<div class="line"><a name="l07565"></a><span class="lineno"> 7565</span>&#160;        {</div>
+<div class="line"><a name="l07566"></a><span class="lineno"> 7566</span>&#160;        }</div>
+<div class="line"><a name="l07567"></a><span class="lineno"> 7567</span>&#160;    };</div>
+<div class="line"><a name="l07568"></a><span class="lineno"> 7568</span>&#160;};</div>
 <div class="line"><a name="l07569"></a><span class="lineno"> 7569</span>&#160; </div>
-<div class="line"><a name="l07570"></a><span class="lineno"> 7570</span>&#160;    <span class="comment">// T must be a pointer type, e.g. VmaAllocation, VmaPool.</span></div>
-<div class="line"><a name="l07571"></a><span class="lineno"> 7571</span>&#160;    <span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt;</div>
-<div class="line"><a name="l07572"></a><span class="lineno"> 7572</span>&#160;    <span class="keywordtype">void</span> PrintPointerList(uint64_t count, <span class="keyword">const</span> T* pItems)</div>
-<div class="line"><a name="l07573"></a><span class="lineno"> 7573</span>&#160;    {</div>
-<div class="line"><a name="l07574"></a><span class="lineno"> 7574</span>&#160;        <span class="keywordflow">if</span>(count)</div>
-<div class="line"><a name="l07575"></a><span class="lineno"> 7575</span>&#160;        {</div>
-<div class="line"><a name="l07576"></a><span class="lineno"> 7576</span>&#160;            fprintf(m_File, <span class="stringliteral">&quot;%p&quot;</span>, pItems[0]);</div>
-<div class="line"><a name="l07577"></a><span class="lineno"> 7577</span>&#160;            <span class="keywordflow">for</span>(uint64_t i = 1; i &lt; count; ++i)</div>
-<div class="line"><a name="l07578"></a><span class="lineno"> 7578</span>&#160;            {</div>
-<div class="line"><a name="l07579"></a><span class="lineno"> 7579</span>&#160;                fprintf(m_File, <span class="stringliteral">&quot; %p&quot;</span>, pItems[i]);</div>
-<div class="line"><a name="l07580"></a><span class="lineno"> 7580</span>&#160;            }</div>
-<div class="line"><a name="l07581"></a><span class="lineno"> 7581</span>&#160;        }</div>
-<div class="line"><a name="l07582"></a><span class="lineno"> 7582</span>&#160;    }</div>
+<div class="line"><a name="l07570"></a><span class="lineno"> 7570</span>&#160;<span class="keyword">class </span>VmaDefragmentationAlgorithm_Generic : <span class="keyword">public</span> VmaDefragmentationAlgorithm</div>
+<div class="line"><a name="l07571"></a><span class="lineno"> 7571</span>&#160;{</div>
+<div class="line"><a name="l07572"></a><span class="lineno"> 7572</span>&#160;    VMA_CLASS_NO_COPY(VmaDefragmentationAlgorithm_Generic)</div>
+<div class="line"><a name="l07573"></a><span class="lineno"> 7573</span>&#160;<span class="keyword">public</span>:</div>
+<div class="line"><a name="l07574"></a><span class="lineno"> 7574</span>&#160;    VmaDefragmentationAlgorithm_Generic(</div>
+<div class="line"><a name="l07575"></a><span class="lineno"> 7575</span>&#160;        <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator,</div>
+<div class="line"><a name="l07576"></a><span class="lineno"> 7576</span>&#160;        VmaBlockVector* pBlockVector,</div>
+<div class="line"><a name="l07577"></a><span class="lineno"> 7577</span>&#160;        uint32_t currentFrameIndex,</div>
+<div class="line"><a name="l07578"></a><span class="lineno"> 7578</span>&#160;        <span class="keywordtype">bool</span> overlappingMoveSupported);</div>
+<div class="line"><a name="l07579"></a><span class="lineno"> 7579</span>&#160;    <span class="keyword">virtual</span> ~VmaDefragmentationAlgorithm_Generic();</div>
+<div class="line"><a name="l07580"></a><span class="lineno"> 7580</span>&#160; </div>
+<div class="line"><a name="l07581"></a><span class="lineno"> 7581</span>&#160;    <span class="keyword">virtual</span> <span class="keywordtype">void</span> AddAllocation(<a class="code" href="struct_vma_allocation.html">VmaAllocation</a> hAlloc, VkBool32* pChanged);</div>
+<div class="line"><a name="l07582"></a><span class="lineno"> 7582</span>&#160;    <span class="keyword">virtual</span> <span class="keywordtype">void</span> AddAll() { m_AllAllocations = <span class="keyword">true</span>; }</div>
 <div class="line"><a name="l07583"></a><span class="lineno"> 7583</span>&#160; </div>
-<div class="line"><a name="l07584"></a><span class="lineno"> 7584</span>&#160;    <span class="keywordtype">void</span> PrintPointerList(uint64_t count, <span class="keyword">const</span> <a class="code" href="struct_vma_allocation.html">VmaAllocation</a>* pItems);</div>
-<div class="line"><a name="l07585"></a><span class="lineno"> 7585</span>&#160;    <span class="keywordtype">void</span> Flush();</div>
-<div class="line"><a name="l07586"></a><span class="lineno"> 7586</span>&#160;};</div>
-<div class="line"><a name="l07587"></a><span class="lineno"> 7587</span>&#160; </div>
-<div class="line"><a name="l07588"></a><span class="lineno"> 7588</span>&#160;<span class="preprocessor">#endif // #if VMA_RECORDING_ENABLED</span></div>
+<div class="line"><a name="l07584"></a><span class="lineno"> 7584</span>&#160;    <span class="keyword">virtual</span> VkResult Defragment(</div>
+<div class="line"><a name="l07585"></a><span class="lineno"> 7585</span>&#160;        VmaVector&lt; VmaDefragmentationMove, VmaStlAllocator&lt;VmaDefragmentationMove&gt; &gt;&amp; moves,</div>
+<div class="line"><a name="l07586"></a><span class="lineno"> 7586</span>&#160;        VkDeviceSize maxBytesToMove,</div>
+<div class="line"><a name="l07587"></a><span class="lineno"> 7587</span>&#160;        uint32_t maxAllocationsToMove,</div>
+<div class="line"><a name="l07588"></a><span class="lineno"> 7588</span>&#160;        <a class="code" href="vk__mem__alloc_8h.html#a88a77cef37e5d3c4fc9eb328885d048d">VmaDefragmentationFlags</a> flags);</div>
 <div class="line"><a name="l07589"></a><span class="lineno"> 7589</span>&#160; </div>
-<div class="line"><a name="l07590"></a><span class="lineno"> 7590</span>&#160;<span class="comment">/*</span></div>
-<div class="line"><a name="l07591"></a><span class="lineno"> 7591</span>&#160;<span class="comment">Thread-safe wrapper over VmaPoolAllocator free list, for allocation of VmaAllocation_T objects.</span></div>
-<div class="line"><a name="l07592"></a><span class="lineno"> 7592</span>&#160;<span class="comment">*/</span></div>
-<div class="line"><a name="l07593"></a><span class="lineno"> 7593</span>&#160;<span class="keyword">class </span>VmaAllocationObjectAllocator</div>
-<div class="line"><a name="l07594"></a><span class="lineno"> 7594</span>&#160;{</div>
-<div class="line"><a name="l07595"></a><span class="lineno"> 7595</span>&#160;    VMA_CLASS_NO_COPY(VmaAllocationObjectAllocator)</div>
-<div class="line"><a name="l07596"></a><span class="lineno"> 7596</span>&#160;<span class="keyword">public</span>:</div>
-<div class="line"><a name="l07597"></a><span class="lineno"> 7597</span>&#160;    VmaAllocationObjectAllocator(<span class="keyword">const</span> VkAllocationCallbacks* pAllocationCallbacks);</div>
-<div class="line"><a name="l07598"></a><span class="lineno"> 7598</span>&#160; </div>
-<div class="line"><a name="l07599"></a><span class="lineno"> 7599</span>&#160;    <span class="keyword">template</span>&lt;<span class="keyword">typename</span>... Types&gt; <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> Allocate(Types... args);</div>
-<div class="line"><a name="l07600"></a><span class="lineno"> 7600</span>&#160;    <span class="keywordtype">void</span> Free(<a class="code" href="struct_vma_allocation.html">VmaAllocation</a> hAlloc);</div>
-<div class="line"><a name="l07601"></a><span class="lineno"> 7601</span>&#160; </div>
-<div class="line"><a name="l07602"></a><span class="lineno"> 7602</span>&#160;<span class="keyword">private</span>:</div>
-<div class="line"><a name="l07603"></a><span class="lineno"> 7603</span>&#160;    VMA_MUTEX m_Mutex;</div>
-<div class="line"><a name="l07604"></a><span class="lineno"> 7604</span>&#160;    VmaPoolAllocator&lt;VmaAllocation_T&gt; m_Allocator;</div>
-<div class="line"><a name="l07605"></a><span class="lineno"> 7605</span>&#160;};</div>
-<div class="line"><a name="l07606"></a><span class="lineno"> 7606</span>&#160; </div>
-<div class="line"><a name="l07607"></a><span class="lineno"> 7607</span>&#160;<span class="keyword">struct </span>VmaCurrentBudgetData</div>
-<div class="line"><a name="l07608"></a><span class="lineno"> 7608</span>&#160;{</div>
-<div class="line"><a name="l07609"></a><span class="lineno"> 7609</span>&#160;    VMA_ATOMIC_UINT64 m_BlockBytes[VK_MAX_MEMORY_HEAPS];</div>
-<div class="line"><a name="l07610"></a><span class="lineno"> 7610</span>&#160;    VMA_ATOMIC_UINT64 m_AllocationBytes[VK_MAX_MEMORY_HEAPS];</div>
-<div class="line"><a name="l07611"></a><span class="lineno"> 7611</span>&#160; </div>
-<div class="line"><a name="l07612"></a><span class="lineno"> 7612</span>&#160;<span class="preprocessor">#if VMA_MEMORY_BUDGET</span></div>
-<div class="line"><a name="l07613"></a><span class="lineno"> 7613</span>&#160;    VMA_ATOMIC_UINT32 m_OperationsSinceBudgetFetch;</div>
-<div class="line"><a name="l07614"></a><span class="lineno"> 7614</span>&#160;    VMA_RW_MUTEX m_BudgetMutex;</div>
-<div class="line"><a name="l07615"></a><span class="lineno"> 7615</span>&#160;    uint64_t m_VulkanUsage[VK_MAX_MEMORY_HEAPS];</div>
-<div class="line"><a name="l07616"></a><span class="lineno"> 7616</span>&#160;    uint64_t m_VulkanBudget[VK_MAX_MEMORY_HEAPS];</div>
-<div class="line"><a name="l07617"></a><span class="lineno"> 7617</span>&#160;    uint64_t m_BlockBytesAtBudgetFetch[VK_MAX_MEMORY_HEAPS];</div>
-<div class="line"><a name="l07618"></a><span class="lineno"> 7618</span>&#160;<span class="preprocessor">#endif // #if VMA_MEMORY_BUDGET</span></div>
-<div class="line"><a name="l07619"></a><span class="lineno"> 7619</span>&#160; </div>
-<div class="line"><a name="l07620"></a><span class="lineno"> 7620</span>&#160;    VmaCurrentBudgetData()</div>
-<div class="line"><a name="l07621"></a><span class="lineno"> 7621</span>&#160;    {</div>
-<div class="line"><a name="l07622"></a><span class="lineno"> 7622</span>&#160;        <span class="keywordflow">for</span>(uint32_t heapIndex = 0; heapIndex &lt; VK_MAX_MEMORY_HEAPS; ++heapIndex)</div>
-<div class="line"><a name="l07623"></a><span class="lineno"> 7623</span>&#160;        {</div>
-<div class="line"><a name="l07624"></a><span class="lineno"> 7624</span>&#160;            m_BlockBytes[heapIndex] = 0;</div>
-<div class="line"><a name="l07625"></a><span class="lineno"> 7625</span>&#160;            m_AllocationBytes[heapIndex] = 0;</div>
-<div class="line"><a name="l07626"></a><span class="lineno"> 7626</span>&#160;<span class="preprocessor">#if VMA_MEMORY_BUDGET</span></div>
-<div class="line"><a name="l07627"></a><span class="lineno"> 7627</span>&#160;            m_VulkanUsage[heapIndex] = 0;</div>
-<div class="line"><a name="l07628"></a><span class="lineno"> 7628</span>&#160;            m_VulkanBudget[heapIndex] = 0;</div>
-<div class="line"><a name="l07629"></a><span class="lineno"> 7629</span>&#160;            m_BlockBytesAtBudgetFetch[heapIndex] = 0;</div>
-<div class="line"><a name="l07630"></a><span class="lineno"> 7630</span>&#160;<span class="preprocessor">#endif</span></div>
-<div class="line"><a name="l07631"></a><span class="lineno"> 7631</span>&#160;        }</div>
-<div class="line"><a name="l07632"></a><span class="lineno"> 7632</span>&#160; </div>
-<div class="line"><a name="l07633"></a><span class="lineno"> 7633</span>&#160;<span class="preprocessor">#if VMA_MEMORY_BUDGET</span></div>
-<div class="line"><a name="l07634"></a><span class="lineno"> 7634</span>&#160;        m_OperationsSinceBudgetFetch = 0;</div>
-<div class="line"><a name="l07635"></a><span class="lineno"> 7635</span>&#160;<span class="preprocessor">#endif</span></div>
-<div class="line"><a name="l07636"></a><span class="lineno"> 7636</span>&#160;    }</div>
+<div class="line"><a name="l07590"></a><span class="lineno"> 7590</span>&#160;    <span class="keyword">virtual</span> VkDeviceSize GetBytesMoved()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_BytesMoved; }</div>
+<div class="line"><a name="l07591"></a><span class="lineno"> 7591</span>&#160;    <span class="keyword">virtual</span> uint32_t GetAllocationsMoved()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_AllocationsMoved; }</div>
+<div class="line"><a name="l07592"></a><span class="lineno"> 7592</span>&#160; </div>
+<div class="line"><a name="l07593"></a><span class="lineno"> 7593</span>&#160;<span class="keyword">private</span>:</div>
+<div class="line"><a name="l07594"></a><span class="lineno"> 7594</span>&#160;    uint32_t m_AllocationCount;</div>
+<div class="line"><a name="l07595"></a><span class="lineno"> 7595</span>&#160;    <span class="keywordtype">bool</span> m_AllAllocations;</div>
+<div class="line"><a name="l07596"></a><span class="lineno"> 7596</span>&#160; </div>
+<div class="line"><a name="l07597"></a><span class="lineno"> 7597</span>&#160;    VkDeviceSize m_BytesMoved;</div>
+<div class="line"><a name="l07598"></a><span class="lineno"> 7598</span>&#160;    uint32_t m_AllocationsMoved;</div>
+<div class="line"><a name="l07599"></a><span class="lineno"> 7599</span>&#160; </div>
+<div class="line"><a name="l07600"></a><span class="lineno"> 7600</span>&#160;    <span class="keyword">struct </span>AllocationInfoSizeGreater</div>
+<div class="line"><a name="l07601"></a><span class="lineno"> 7601</span>&#160;    {</div>
+<div class="line"><a name="l07602"></a><span class="lineno"> 7602</span>&#160;        <span class="keywordtype">bool</span> operator()(<span class="keyword">const</span> AllocationInfo&amp; lhs, <span class="keyword">const</span> AllocationInfo&amp; rhs)<span class="keyword"> const</span></div>
+<div class="line"><a name="l07603"></a><span class="lineno"> 7603</span>&#160;<span class="keyword">        </span>{</div>
+<div class="line"><a name="l07604"></a><span class="lineno"> 7604</span>&#160;            <span class="keywordflow">return</span> lhs.m_hAllocation-&gt;GetSize() &gt; rhs.m_hAllocation-&gt;GetSize();</div>
+<div class="line"><a name="l07605"></a><span class="lineno"> 7605</span>&#160;        }</div>
+<div class="line"><a name="l07606"></a><span class="lineno"> 7606</span>&#160;    };</div>
+<div class="line"><a name="l07607"></a><span class="lineno"> 7607</span>&#160; </div>
+<div class="line"><a name="l07608"></a><span class="lineno"> 7608</span>&#160;    <span class="keyword">struct </span>AllocationInfoOffsetGreater</div>
+<div class="line"><a name="l07609"></a><span class="lineno"> 7609</span>&#160;    {</div>
+<div class="line"><a name="l07610"></a><span class="lineno"> 7610</span>&#160;        <span class="keywordtype">bool</span> operator()(<span class="keyword">const</span> AllocationInfo&amp; lhs, <span class="keyword">const</span> AllocationInfo&amp; rhs)<span class="keyword"> const</span></div>
+<div class="line"><a name="l07611"></a><span class="lineno"> 7611</span>&#160;<span class="keyword">        </span>{</div>
+<div class="line"><a name="l07612"></a><span class="lineno"> 7612</span>&#160;            <span class="keywordflow">return</span> lhs.m_hAllocation-&gt;GetOffset() &gt; rhs.m_hAllocation-&gt;GetOffset();</div>
+<div class="line"><a name="l07613"></a><span class="lineno"> 7613</span>&#160;        }</div>
+<div class="line"><a name="l07614"></a><span class="lineno"> 7614</span>&#160;    };</div>
+<div class="line"><a name="l07615"></a><span class="lineno"> 7615</span>&#160; </div>
+<div class="line"><a name="l07616"></a><span class="lineno"> 7616</span>&#160;    <span class="keyword">struct </span>BlockInfo</div>
+<div class="line"><a name="l07617"></a><span class="lineno"> 7617</span>&#160;    {</div>
+<div class="line"><a name="l07618"></a><span class="lineno"> 7618</span>&#160;        <span class="keywordtype">size_t</span> m_OriginalBlockIndex;</div>
+<div class="line"><a name="l07619"></a><span class="lineno"> 7619</span>&#160;        VmaDeviceMemoryBlock* m_pBlock;</div>
+<div class="line"><a name="l07620"></a><span class="lineno"> 7620</span>&#160;        <span class="keywordtype">bool</span> m_HasNonMovableAllocations;</div>
+<div class="line"><a name="l07621"></a><span class="lineno"> 7621</span>&#160;        VmaVector&lt; AllocationInfo, VmaStlAllocator&lt;AllocationInfo&gt; &gt; m_Allocations;</div>
+<div class="line"><a name="l07622"></a><span class="lineno"> 7622</span>&#160; </div>
+<div class="line"><a name="l07623"></a><span class="lineno"> 7623</span>&#160;        BlockInfo(<span class="keyword">const</span> VkAllocationCallbacks* pAllocationCallbacks) :</div>
+<div class="line"><a name="l07624"></a><span class="lineno"> 7624</span>&#160;            m_OriginalBlockIndex(SIZE_MAX),</div>
+<div class="line"><a name="l07625"></a><span class="lineno"> 7625</span>&#160;            m_pBlock(VMA_NULL),</div>
+<div class="line"><a name="l07626"></a><span class="lineno"> 7626</span>&#160;            m_HasNonMovableAllocations(true),</div>
+<div class="line"><a name="l07627"></a><span class="lineno"> 7627</span>&#160;            m_Allocations(pAllocationCallbacks)</div>
+<div class="line"><a name="l07628"></a><span class="lineno"> 7628</span>&#160;        {</div>
+<div class="line"><a name="l07629"></a><span class="lineno"> 7629</span>&#160;        }</div>
+<div class="line"><a name="l07630"></a><span class="lineno"> 7630</span>&#160; </div>
+<div class="line"><a name="l07631"></a><span class="lineno"> 7631</span>&#160;        <span class="keywordtype">void</span> CalcHasNonMovableAllocations()</div>
+<div class="line"><a name="l07632"></a><span class="lineno"> 7632</span>&#160;        {</div>
+<div class="line"><a name="l07633"></a><span class="lineno"> 7633</span>&#160;            <span class="keyword">const</span> <span class="keywordtype">size_t</span> blockAllocCount = m_pBlock-&gt;m_pMetadata-&gt;GetAllocationCount();</div>
+<div class="line"><a name="l07634"></a><span class="lineno"> 7634</span>&#160;            <span class="keyword">const</span> <span class="keywordtype">size_t</span> defragmentAllocCount = m_Allocations.size();</div>
+<div class="line"><a name="l07635"></a><span class="lineno"> 7635</span>&#160;            m_HasNonMovableAllocations = blockAllocCount != defragmentAllocCount;</div>
+<div class="line"><a name="l07636"></a><span class="lineno"> 7636</span>&#160;        }</div>
 <div class="line"><a name="l07637"></a><span class="lineno"> 7637</span>&#160; </div>
-<div class="line"><a name="l07638"></a><span class="lineno"> 7638</span>&#160;    <span class="keywordtype">void</span> AddAllocation(uint32_t heapIndex, VkDeviceSize allocationSize)</div>
-<div class="line"><a name="l07639"></a><span class="lineno"> 7639</span>&#160;    {</div>
-<div class="line"><a name="l07640"></a><span class="lineno"> 7640</span>&#160;        m_AllocationBytes[heapIndex] += allocationSize;</div>
-<div class="line"><a name="l07641"></a><span class="lineno"> 7641</span>&#160;<span class="preprocessor">#if VMA_MEMORY_BUDGET</span></div>
-<div class="line"><a name="l07642"></a><span class="lineno"> 7642</span>&#160;        ++m_OperationsSinceBudgetFetch;</div>
-<div class="line"><a name="l07643"></a><span class="lineno"> 7643</span>&#160;<span class="preprocessor">#endif</span></div>
-<div class="line"><a name="l07644"></a><span class="lineno"> 7644</span>&#160;    }</div>
-<div class="line"><a name="l07645"></a><span class="lineno"> 7645</span>&#160; </div>
-<div class="line"><a name="l07646"></a><span class="lineno"> 7646</span>&#160;    <span class="keywordtype">void</span> RemoveAllocation(uint32_t heapIndex, VkDeviceSize allocationSize)</div>
-<div class="line"><a name="l07647"></a><span class="lineno"> 7647</span>&#160;    {</div>
-<div class="line"><a name="l07648"></a><span class="lineno"> 7648</span>&#160;        VMA_ASSERT(m_AllocationBytes[heapIndex] &gt;= allocationSize); <span class="comment">// DELME</span></div>
-<div class="line"><a name="l07649"></a><span class="lineno"> 7649</span>&#160;        m_AllocationBytes[heapIndex] -= allocationSize;</div>
-<div class="line"><a name="l07650"></a><span class="lineno"> 7650</span>&#160;<span class="preprocessor">#if VMA_MEMORY_BUDGET</span></div>
-<div class="line"><a name="l07651"></a><span class="lineno"> 7651</span>&#160;        ++m_OperationsSinceBudgetFetch;</div>
-<div class="line"><a name="l07652"></a><span class="lineno"> 7652</span>&#160;<span class="preprocessor">#endif</span></div>
-<div class="line"><a name="l07653"></a><span class="lineno"> 7653</span>&#160;    }</div>
-<div class="line"><a name="l07654"></a><span class="lineno"> 7654</span>&#160;};</div>
-<div class="line"><a name="l07655"></a><span class="lineno"> 7655</span>&#160; </div>
-<div class="line"><a name="l07656"></a><span class="lineno"> 7656</span>&#160;<span class="comment">// Main allocator object.</span></div>
-<div class="line"><a name="l07657"></a><span class="lineno"> 7657</span>&#160;<span class="keyword">struct </span>VmaAllocator_T</div>
-<div class="line"><a name="l07658"></a><span class="lineno"> 7658</span>&#160;{</div>
-<div class="line"><a name="l07659"></a><span class="lineno"> 7659</span>&#160;    VMA_CLASS_NO_COPY(VmaAllocator_T)</div>
-<div class="line"><a name="l07660"></a><span class="lineno"> 7660</span>&#160;<span class="keyword">public</span>:</div>
-<div class="line"><a name="l07661"></a><span class="lineno"> 7661</span>&#160;    <span class="keywordtype">bool</span> m_UseMutex;</div>
-<div class="line"><a name="l07662"></a><span class="lineno"> 7662</span>&#160;    uint32_t m_VulkanApiVersion;</div>
-<div class="line"><a name="l07663"></a><span class="lineno"> 7663</span>&#160;    <span class="keywordtype">bool</span> m_UseKhrDedicatedAllocation; <span class="comment">// Can be set only if m_VulkanApiVersion &lt; VK_MAKE_VERSION(1, 1, 0).</span></div>
-<div class="line"><a name="l07664"></a><span class="lineno"> 7664</span>&#160;    <span class="keywordtype">bool</span> m_UseKhrBindMemory2; <span class="comment">// Can be set only if m_VulkanApiVersion &lt; VK_MAKE_VERSION(1, 1, 0).</span></div>
-<div class="line"><a name="l07665"></a><span class="lineno"> 7665</span>&#160;    <span class="keywordtype">bool</span> m_UseExtMemoryBudget;</div>
-<div class="line"><a name="l07666"></a><span class="lineno"> 7666</span>&#160;    <span class="keywordtype">bool</span> m_UseAmdDeviceCoherentMemory;</div>
-<div class="line"><a name="l07667"></a><span class="lineno"> 7667</span>&#160;    <span class="keywordtype">bool</span> m_UseKhrBufferDeviceAddress;</div>
-<div class="line"><a name="l07668"></a><span class="lineno"> 7668</span>&#160;    VkDevice m_hDevice;</div>
-<div class="line"><a name="l07669"></a><span class="lineno"> 7669</span>&#160;    VkInstance m_hInstance;</div>
-<div class="line"><a name="l07670"></a><span class="lineno"> 7670</span>&#160;    <span class="keywordtype">bool</span> m_AllocationCallbacksSpecified;</div>
-<div class="line"><a name="l07671"></a><span class="lineno"> 7671</span>&#160;    VkAllocationCallbacks m_AllocationCallbacks;</div>
-<div class="line"><a name="l07672"></a><span class="lineno"> 7672</span>&#160;    <a class="code" href="struct_vma_device_memory_callbacks.html">VmaDeviceMemoryCallbacks</a> m_DeviceMemoryCallbacks;</div>
-<div class="line"><a name="l07673"></a><span class="lineno"> 7673</span>&#160;    VmaAllocationObjectAllocator m_AllocationObjectAllocator;</div>
-<div class="line"><a name="l07674"></a><span class="lineno"> 7674</span>&#160;    </div>
-<div class="line"><a name="l07675"></a><span class="lineno"> 7675</span>&#160;    <span class="comment">// Each bit (1 &lt;&lt; i) is set if HeapSizeLimit is enabled for that heap, so cannot allocate more than the heap size.</span></div>
-<div class="line"><a name="l07676"></a><span class="lineno"> 7676</span>&#160;    uint32_t m_HeapSizeLimitMask;</div>
-<div class="line"><a name="l07677"></a><span class="lineno"> 7677</span>&#160; </div>
-<div class="line"><a name="l07678"></a><span class="lineno"> 7678</span>&#160;    VkPhysicalDeviceProperties m_PhysicalDeviceProperties;</div>
-<div class="line"><a name="l07679"></a><span class="lineno"> 7679</span>&#160;    VkPhysicalDeviceMemoryProperties m_MemProps;</div>
-<div class="line"><a name="l07680"></a><span class="lineno"> 7680</span>&#160; </div>
-<div class="line"><a name="l07681"></a><span class="lineno"> 7681</span>&#160;    <span class="comment">// Default pools.</span></div>
-<div class="line"><a name="l07682"></a><span class="lineno"> 7682</span>&#160;    VmaBlockVector* m_pBlockVectors[VK_MAX_MEMORY_TYPES];</div>
-<div class="line"><a name="l07683"></a><span class="lineno"> 7683</span>&#160; </div>
-<div class="line"><a name="l07684"></a><span class="lineno"> 7684</span>&#160;    <span class="comment">// Each vector is sorted by memory (handle value).</span></div>
-<div class="line"><a name="l07685"></a><span class="lineno"> 7685</span>&#160;    <span class="keyword">typedef</span> VmaVector&lt; VmaAllocation, VmaStlAllocator&lt;VmaAllocation&gt; &gt; AllocationVectorType;</div>
-<div class="line"><a name="l07686"></a><span class="lineno"> 7686</span>&#160;    AllocationVectorType* m_pDedicatedAllocations[VK_MAX_MEMORY_TYPES];</div>
-<div class="line"><a name="l07687"></a><span class="lineno"> 7687</span>&#160;    VMA_RW_MUTEX m_DedicatedAllocationsMutex[VK_MAX_MEMORY_TYPES];</div>
-<div class="line"><a name="l07688"></a><span class="lineno"> 7688</span>&#160; </div>
-<div class="line"><a name="l07689"></a><span class="lineno"> 7689</span>&#160;    VmaCurrentBudgetData m_Budget;</div>
-<div class="line"><a name="l07690"></a><span class="lineno"> 7690</span>&#160; </div>
-<div class="line"><a name="l07691"></a><span class="lineno"> 7691</span>&#160;    VmaAllocator_T(<span class="keyword">const</span> <a class="code" href="struct_vma_allocator_create_info.html">VmaAllocatorCreateInfo</a>* pCreateInfo);</div>
-<div class="line"><a name="l07692"></a><span class="lineno"> 7692</span>&#160;    VkResult Init(<span class="keyword">const</span> <a class="code" href="struct_vma_allocator_create_info.html">VmaAllocatorCreateInfo</a>* pCreateInfo);</div>
-<div class="line"><a name="l07693"></a><span class="lineno"> 7693</span>&#160;    ~VmaAllocator_T();</div>
-<div class="line"><a name="l07694"></a><span class="lineno"> 7694</span>&#160; </div>
-<div class="line"><a name="l07695"></a><span class="lineno"> 7695</span>&#160;    <span class="keyword">const</span> VkAllocationCallbacks* GetAllocationCallbacks()<span class="keyword"> const</span></div>
-<div class="line"><a name="l07696"></a><span class="lineno"> 7696</span>&#160;<span class="keyword">    </span>{</div>
-<div class="line"><a name="l07697"></a><span class="lineno"> 7697</span>&#160;        <span class="keywordflow">return</span> m_AllocationCallbacksSpecified ? &amp;m_AllocationCallbacks : 0;</div>
-<div class="line"><a name="l07698"></a><span class="lineno"> 7698</span>&#160;    }</div>
-<div class="line"><a name="l07699"></a><span class="lineno"> 7699</span>&#160;    <span class="keyword">const</span> <a class="code" href="struct_vma_vulkan_functions.html">VmaVulkanFunctions</a>&amp; GetVulkanFunctions()<span class="keyword"> const</span></div>
-<div class="line"><a name="l07700"></a><span class="lineno"> 7700</span>&#160;<span class="keyword">    </span>{</div>
-<div class="line"><a name="l07701"></a><span class="lineno"> 7701</span>&#160;        <span class="keywordflow">return</span> m_VulkanFunctions;</div>
-<div class="line"><a name="l07702"></a><span class="lineno"> 7702</span>&#160;    }</div>
-<div class="line"><a name="l07703"></a><span class="lineno"> 7703</span>&#160; </div>
-<div class="line"><a name="l07704"></a><span class="lineno"> 7704</span>&#160;    VkPhysicalDevice GetPhysicalDevice()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_PhysicalDevice; }</div>
-<div class="line"><a name="l07705"></a><span class="lineno"> 7705</span>&#160; </div>
-<div class="line"><a name="l07706"></a><span class="lineno"> 7706</span>&#160;    VkDeviceSize GetBufferImageGranularity()<span class="keyword"> const</span></div>
-<div class="line"><a name="l07707"></a><span class="lineno"> 7707</span>&#160;<span class="keyword">    </span>{</div>
-<div class="line"><a name="l07708"></a><span class="lineno"> 7708</span>&#160;        <span class="keywordflow">return</span> VMA_MAX(</div>
-<div class="line"><a name="l07709"></a><span class="lineno"> 7709</span>&#160;            <span class="keyword">static_cast&lt;</span>VkDeviceSize<span class="keyword">&gt;</span>(VMA_DEBUG_MIN_BUFFER_IMAGE_GRANULARITY),</div>
-<div class="line"><a name="l07710"></a><span class="lineno"> 7710</span>&#160;            m_PhysicalDeviceProperties.limits.bufferImageGranularity);</div>
-<div class="line"><a name="l07711"></a><span class="lineno"> 7711</span>&#160;    }</div>
+<div class="line"><a name="l07638"></a><span class="lineno"> 7638</span>&#160;        <span class="keywordtype">void</span> SortAllocationsBySizeDescending()</div>
+<div class="line"><a name="l07639"></a><span class="lineno"> 7639</span>&#160;        {</div>
+<div class="line"><a name="l07640"></a><span class="lineno"> 7640</span>&#160;            VMA_SORT(m_Allocations.begin(), m_Allocations.end(), AllocationInfoSizeGreater());</div>
+<div class="line"><a name="l07641"></a><span class="lineno"> 7641</span>&#160;        }</div>
+<div class="line"><a name="l07642"></a><span class="lineno"> 7642</span>&#160; </div>
+<div class="line"><a name="l07643"></a><span class="lineno"> 7643</span>&#160;        <span class="keywordtype">void</span> SortAllocationsByOffsetDescending()</div>
+<div class="line"><a name="l07644"></a><span class="lineno"> 7644</span>&#160;        {</div>
+<div class="line"><a name="l07645"></a><span class="lineno"> 7645</span>&#160;            VMA_SORT(m_Allocations.begin(), m_Allocations.end(), AllocationInfoOffsetGreater());</div>
+<div class="line"><a name="l07646"></a><span class="lineno"> 7646</span>&#160;        }</div>
+<div class="line"><a name="l07647"></a><span class="lineno"> 7647</span>&#160;    };</div>
+<div class="line"><a name="l07648"></a><span class="lineno"> 7648</span>&#160; </div>
+<div class="line"><a name="l07649"></a><span class="lineno"> 7649</span>&#160;    <span class="keyword">struct </span>BlockPointerLess</div>
+<div class="line"><a name="l07650"></a><span class="lineno"> 7650</span>&#160;    {</div>
+<div class="line"><a name="l07651"></a><span class="lineno"> 7651</span>&#160;        <span class="keywordtype">bool</span> operator()(<span class="keyword">const</span> BlockInfo* pLhsBlockInfo, <span class="keyword">const</span> VmaDeviceMemoryBlock* pRhsBlock)<span class="keyword"> const</span></div>
+<div class="line"><a name="l07652"></a><span class="lineno"> 7652</span>&#160;<span class="keyword">        </span>{</div>
+<div class="line"><a name="l07653"></a><span class="lineno"> 7653</span>&#160;            <span class="keywordflow">return</span> pLhsBlockInfo-&gt;m_pBlock &lt; pRhsBlock;</div>
+<div class="line"><a name="l07654"></a><span class="lineno"> 7654</span>&#160;        }</div>
+<div class="line"><a name="l07655"></a><span class="lineno"> 7655</span>&#160;        <span class="keywordtype">bool</span> operator()(<span class="keyword">const</span> BlockInfo* pLhsBlockInfo, <span class="keyword">const</span> BlockInfo* pRhsBlockInfo)<span class="keyword"> const</span></div>
+<div class="line"><a name="l07656"></a><span class="lineno"> 7656</span>&#160;<span class="keyword">        </span>{</div>
+<div class="line"><a name="l07657"></a><span class="lineno"> 7657</span>&#160;            <span class="keywordflow">return</span> pLhsBlockInfo-&gt;m_pBlock &lt; pRhsBlockInfo-&gt;m_pBlock;</div>
+<div class="line"><a name="l07658"></a><span class="lineno"> 7658</span>&#160;        }</div>
+<div class="line"><a name="l07659"></a><span class="lineno"> 7659</span>&#160;    };</div>
+<div class="line"><a name="l07660"></a><span class="lineno"> 7660</span>&#160; </div>
+<div class="line"><a name="l07661"></a><span class="lineno"> 7661</span>&#160;    <span class="comment">// 1. Blocks with some non-movable allocations go first.</span></div>
+<div class="line"><a name="l07662"></a><span class="lineno"> 7662</span>&#160;    <span class="comment">// 2. Blocks with smaller sumFreeSize go first.</span></div>
+<div class="line"><a name="l07663"></a><span class="lineno"> 7663</span>&#160;    <span class="keyword">struct </span>BlockInfoCompareMoveDestination</div>
+<div class="line"><a name="l07664"></a><span class="lineno"> 7664</span>&#160;    {</div>
+<div class="line"><a name="l07665"></a><span class="lineno"> 7665</span>&#160;        <span class="keywordtype">bool</span> operator()(<span class="keyword">const</span> BlockInfo* pLhsBlockInfo, <span class="keyword">const</span> BlockInfo* pRhsBlockInfo)<span class="keyword"> const</span></div>
+<div class="line"><a name="l07666"></a><span class="lineno"> 7666</span>&#160;<span class="keyword">        </span>{</div>
+<div class="line"><a name="l07667"></a><span class="lineno"> 7667</span>&#160;            <span class="keywordflow">if</span>(pLhsBlockInfo-&gt;m_HasNonMovableAllocations &amp;&amp; !pRhsBlockInfo-&gt;m_HasNonMovableAllocations)</div>
+<div class="line"><a name="l07668"></a><span class="lineno"> 7668</span>&#160;            {</div>
+<div class="line"><a name="l07669"></a><span class="lineno"> 7669</span>&#160;                <span class="keywordflow">return</span> <span class="keyword">true</span>;</div>
+<div class="line"><a name="l07670"></a><span class="lineno"> 7670</span>&#160;            }</div>
+<div class="line"><a name="l07671"></a><span class="lineno"> 7671</span>&#160;            <span class="keywordflow">if</span>(!pLhsBlockInfo-&gt;m_HasNonMovableAllocations &amp;&amp; pRhsBlockInfo-&gt;m_HasNonMovableAllocations)</div>
+<div class="line"><a name="l07672"></a><span class="lineno"> 7672</span>&#160;            {</div>
+<div class="line"><a name="l07673"></a><span class="lineno"> 7673</span>&#160;                <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
+<div class="line"><a name="l07674"></a><span class="lineno"> 7674</span>&#160;            }</div>
+<div class="line"><a name="l07675"></a><span class="lineno"> 7675</span>&#160;            <span class="keywordflow">if</span>(pLhsBlockInfo-&gt;m_pBlock-&gt;m_pMetadata-&gt;GetSumFreeSize() &lt; pRhsBlockInfo-&gt;m_pBlock-&gt;m_pMetadata-&gt;GetSumFreeSize())</div>
+<div class="line"><a name="l07676"></a><span class="lineno"> 7676</span>&#160;            {</div>
+<div class="line"><a name="l07677"></a><span class="lineno"> 7677</span>&#160;                <span class="keywordflow">return</span> <span class="keyword">true</span>;</div>
+<div class="line"><a name="l07678"></a><span class="lineno"> 7678</span>&#160;            }</div>
+<div class="line"><a name="l07679"></a><span class="lineno"> 7679</span>&#160;            <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
+<div class="line"><a name="l07680"></a><span class="lineno"> 7680</span>&#160;        }</div>
+<div class="line"><a name="l07681"></a><span class="lineno"> 7681</span>&#160;    };</div>
+<div class="line"><a name="l07682"></a><span class="lineno"> 7682</span>&#160; </div>
+<div class="line"><a name="l07683"></a><span class="lineno"> 7683</span>&#160;    <span class="keyword">typedef</span> VmaVector&lt; BlockInfo*, VmaStlAllocator&lt;BlockInfo*&gt; &gt; BlockInfoVector;</div>
+<div class="line"><a name="l07684"></a><span class="lineno"> 7684</span>&#160;    BlockInfoVector m_Blocks;</div>
+<div class="line"><a name="l07685"></a><span class="lineno"> 7685</span>&#160; </div>
+<div class="line"><a name="l07686"></a><span class="lineno"> 7686</span>&#160;    VkResult DefragmentRound(</div>
+<div class="line"><a name="l07687"></a><span class="lineno"> 7687</span>&#160;        VmaVector&lt; VmaDefragmentationMove, VmaStlAllocator&lt;VmaDefragmentationMove&gt; &gt;&amp; moves,</div>
+<div class="line"><a name="l07688"></a><span class="lineno"> 7688</span>&#160;        VkDeviceSize maxBytesToMove,</div>
+<div class="line"><a name="l07689"></a><span class="lineno"> 7689</span>&#160;        uint32_t maxAllocationsToMove,</div>
+<div class="line"><a name="l07690"></a><span class="lineno"> 7690</span>&#160;        <span class="keywordtype">bool</span> freeOldAllocations);</div>
+<div class="line"><a name="l07691"></a><span class="lineno"> 7691</span>&#160; </div>
+<div class="line"><a name="l07692"></a><span class="lineno"> 7692</span>&#160;    <span class="keywordtype">size_t</span> CalcBlocksWithNonMovableCount() <span class="keyword">const</span>;</div>
+<div class="line"><a name="l07693"></a><span class="lineno"> 7693</span>&#160; </div>
+<div class="line"><a name="l07694"></a><span class="lineno"> 7694</span>&#160;    <span class="keyword">static</span> <span class="keywordtype">bool</span> MoveMakesSense(</div>
+<div class="line"><a name="l07695"></a><span class="lineno"> 7695</span>&#160;        <span class="keywordtype">size_t</span> dstBlockIndex, VkDeviceSize dstOffset,</div>
+<div class="line"><a name="l07696"></a><span class="lineno"> 7696</span>&#160;        <span class="keywordtype">size_t</span> srcBlockIndex, VkDeviceSize srcOffset);</div>
+<div class="line"><a name="l07697"></a><span class="lineno"> 7697</span>&#160;};</div>
+<div class="line"><a name="l07698"></a><span class="lineno"> 7698</span>&#160; </div>
+<div class="line"><a name="l07699"></a><span class="lineno"> 7699</span>&#160;<span class="keyword">class </span>VmaDefragmentationAlgorithm_Fast : <span class="keyword">public</span> VmaDefragmentationAlgorithm</div>
+<div class="line"><a name="l07700"></a><span class="lineno"> 7700</span>&#160;{</div>
+<div class="line"><a name="l07701"></a><span class="lineno"> 7701</span>&#160;    VMA_CLASS_NO_COPY(VmaDefragmentationAlgorithm_Fast)</div>
+<div class="line"><a name="l07702"></a><span class="lineno"> 7702</span>&#160;<span class="keyword">public</span>:</div>
+<div class="line"><a name="l07703"></a><span class="lineno"> 7703</span>&#160;    VmaDefragmentationAlgorithm_Fast(</div>
+<div class="line"><a name="l07704"></a><span class="lineno"> 7704</span>&#160;        <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator,</div>
+<div class="line"><a name="l07705"></a><span class="lineno"> 7705</span>&#160;        VmaBlockVector* pBlockVector,</div>
+<div class="line"><a name="l07706"></a><span class="lineno"> 7706</span>&#160;        uint32_t currentFrameIndex,</div>
+<div class="line"><a name="l07707"></a><span class="lineno"> 7707</span>&#160;        <span class="keywordtype">bool</span> overlappingMoveSupported);</div>
+<div class="line"><a name="l07708"></a><span class="lineno"> 7708</span>&#160;    <span class="keyword">virtual</span> ~VmaDefragmentationAlgorithm_Fast();</div>
+<div class="line"><a name="l07709"></a><span class="lineno"> 7709</span>&#160; </div>
+<div class="line"><a name="l07710"></a><span class="lineno"> 7710</span>&#160;    <span class="keyword">virtual</span> <span class="keywordtype">void</span> AddAllocation(<a class="code" href="struct_vma_allocation.html">VmaAllocation</a> hAlloc, VkBool32* pChanged) { ++m_AllocationCount; }</div>
+<div class="line"><a name="l07711"></a><span class="lineno"> 7711</span>&#160;    <span class="keyword">virtual</span> <span class="keywordtype">void</span> AddAll() { m_AllAllocations = <span class="keyword">true</span>; }</div>
 <div class="line"><a name="l07712"></a><span class="lineno"> 7712</span>&#160; </div>
-<div class="line"><a name="l07713"></a><span class="lineno"> 7713</span>&#160;    uint32_t GetMemoryHeapCount()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_MemProps.memoryHeapCount; }</div>
-<div class="line"><a name="l07714"></a><span class="lineno"> 7714</span>&#160;    uint32_t GetMemoryTypeCount()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_MemProps.memoryTypeCount; }</div>
-<div class="line"><a name="l07715"></a><span class="lineno"> 7715</span>&#160; </div>
-<div class="line"><a name="l07716"></a><span class="lineno"> 7716</span>&#160;    uint32_t MemoryTypeIndexToHeapIndex(uint32_t memTypeIndex)<span class="keyword"> const</span></div>
-<div class="line"><a name="l07717"></a><span class="lineno"> 7717</span>&#160;<span class="keyword">    </span>{</div>
-<div class="line"><a name="l07718"></a><span class="lineno"> 7718</span>&#160;        VMA_ASSERT(memTypeIndex &lt; m_MemProps.memoryTypeCount);</div>
-<div class="line"><a name="l07719"></a><span class="lineno"> 7719</span>&#160;        <span class="keywordflow">return</span> m_MemProps.memoryTypes[memTypeIndex].heapIndex;</div>
-<div class="line"><a name="l07720"></a><span class="lineno"> 7720</span>&#160;    }</div>
-<div class="line"><a name="l07721"></a><span class="lineno"> 7721</span>&#160;    <span class="comment">// True when specific memory type is HOST_VISIBLE but not HOST_COHERENT.</span></div>
-<div class="line"><a name="l07722"></a><span class="lineno"> 7722</span>&#160;    <span class="keywordtype">bool</span> IsMemoryTypeNonCoherent(uint32_t memTypeIndex)<span class="keyword"> const</span></div>
-<div class="line"><a name="l07723"></a><span class="lineno"> 7723</span>&#160;<span class="keyword">    </span>{</div>
-<div class="line"><a name="l07724"></a><span class="lineno"> 7724</span>&#160;        <span class="keywordflow">return</span> (m_MemProps.memoryTypes[memTypeIndex].propertyFlags &amp; (VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT)) ==</div>
-<div class="line"><a name="l07725"></a><span class="lineno"> 7725</span>&#160;            VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;</div>
-<div class="line"><a name="l07726"></a><span class="lineno"> 7726</span>&#160;    }</div>
-<div class="line"><a name="l07727"></a><span class="lineno"> 7727</span>&#160;    <span class="comment">// Minimum alignment for all allocations in specific memory type.</span></div>
-<div class="line"><a name="l07728"></a><span class="lineno"> 7728</span>&#160;    VkDeviceSize GetMemoryTypeMinAlignment(uint32_t memTypeIndex)<span class="keyword"> const</span></div>
-<div class="line"><a name="l07729"></a><span class="lineno"> 7729</span>&#160;<span class="keyword">    </span>{</div>
-<div class="line"><a name="l07730"></a><span class="lineno"> 7730</span>&#160;        <span class="keywordflow">return</span> IsMemoryTypeNonCoherent(memTypeIndex) ?</div>
-<div class="line"><a name="l07731"></a><span class="lineno"> 7731</span>&#160;            VMA_MAX((VkDeviceSize)VMA_DEBUG_ALIGNMENT, m_PhysicalDeviceProperties.limits.nonCoherentAtomSize) :</div>
-<div class="line"><a name="l07732"></a><span class="lineno"> 7732</span>&#160;            (VkDeviceSize)VMA_DEBUG_ALIGNMENT;</div>
-<div class="line"><a name="l07733"></a><span class="lineno"> 7733</span>&#160;    }</div>
-<div class="line"><a name="l07734"></a><span class="lineno"> 7734</span>&#160; </div>
-<div class="line"><a name="l07735"></a><span class="lineno"> 7735</span>&#160;    <span class="keywordtype">bool</span> IsIntegratedGpu()<span class="keyword"> const</span></div>
-<div class="line"><a name="l07736"></a><span class="lineno"> 7736</span>&#160;<span class="keyword">    </span>{</div>
-<div class="line"><a name="l07737"></a><span class="lineno"> 7737</span>&#160;        <span class="keywordflow">return</span> m_PhysicalDeviceProperties.deviceType == VK_PHYSICAL_DEVICE_TYPE_INTEGRATED_GPU;</div>
-<div class="line"><a name="l07738"></a><span class="lineno"> 7738</span>&#160;    }</div>
-<div class="line"><a name="l07739"></a><span class="lineno"> 7739</span>&#160; </div>
-<div class="line"><a name="l07740"></a><span class="lineno"> 7740</span>&#160;    uint32_t GetGlobalMemoryTypeBits()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_GlobalMemoryTypeBits; }</div>
-<div class="line"><a name="l07741"></a><span class="lineno"> 7741</span>&#160; </div>
-<div class="line"><a name="l07742"></a><span class="lineno"> 7742</span>&#160;<span class="preprocessor">#if VMA_RECORDING_ENABLED</span></div>
-<div class="line"><a name="l07743"></a><span class="lineno"> 7743</span>&#160;    VmaRecorder* GetRecorder()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_pRecorder; }</div>
-<div class="line"><a name="l07744"></a><span class="lineno"> 7744</span>&#160;<span class="preprocessor">#endif</span></div>
-<div class="line"><a name="l07745"></a><span class="lineno"> 7745</span>&#160; </div>
-<div class="line"><a name="l07746"></a><span class="lineno"> 7746</span>&#160;    <span class="keywordtype">void</span> GetBufferMemoryRequirements(</div>
-<div class="line"><a name="l07747"></a><span class="lineno"> 7747</span>&#160;        VkBuffer hBuffer,</div>
-<div class="line"><a name="l07748"></a><span class="lineno"> 7748</span>&#160;        VkMemoryRequirements&amp; memReq,</div>
-<div class="line"><a name="l07749"></a><span class="lineno"> 7749</span>&#160;        <span class="keywordtype">bool</span>&amp; requiresDedicatedAllocation,</div>
-<div class="line"><a name="l07750"></a><span class="lineno"> 7750</span>&#160;        <span class="keywordtype">bool</span>&amp; prefersDedicatedAllocation) <span class="keyword">const</span>;</div>
-<div class="line"><a name="l07751"></a><span class="lineno"> 7751</span>&#160;    <span class="keywordtype">void</span> GetImageMemoryRequirements(</div>
-<div class="line"><a name="l07752"></a><span class="lineno"> 7752</span>&#160;        VkImage hImage,</div>
-<div class="line"><a name="l07753"></a><span class="lineno"> 7753</span>&#160;        VkMemoryRequirements&amp; memReq,</div>
-<div class="line"><a name="l07754"></a><span class="lineno"> 7754</span>&#160;        <span class="keywordtype">bool</span>&amp; requiresDedicatedAllocation,</div>
-<div class="line"><a name="l07755"></a><span class="lineno"> 7755</span>&#160;        <span class="keywordtype">bool</span>&amp; prefersDedicatedAllocation) <span class="keyword">const</span>;</div>
-<div class="line"><a name="l07756"></a><span class="lineno"> 7756</span>&#160; </div>
-<div class="line"><a name="l07757"></a><span class="lineno"> 7757</span>&#160;    <span class="comment">// Main allocation function.</span></div>
-<div class="line"><a name="l07758"></a><span class="lineno"> 7758</span>&#160;    VkResult AllocateMemory(</div>
-<div class="line"><a name="l07759"></a><span class="lineno"> 7759</span>&#160;        <span class="keyword">const</span> VkMemoryRequirements&amp; vkMemReq,</div>
-<div class="line"><a name="l07760"></a><span class="lineno"> 7760</span>&#160;        <span class="keywordtype">bool</span> requiresDedicatedAllocation,</div>
-<div class="line"><a name="l07761"></a><span class="lineno"> 7761</span>&#160;        <span class="keywordtype">bool</span> prefersDedicatedAllocation,</div>
-<div class="line"><a name="l07762"></a><span class="lineno"> 7762</span>&#160;        VkBuffer dedicatedBuffer,</div>
-<div class="line"><a name="l07763"></a><span class="lineno"> 7763</span>&#160;        VkBufferUsageFlags dedicatedBufferUsage, <span class="comment">// UINT32_MAX when unknown.</span></div>
-<div class="line"><a name="l07764"></a><span class="lineno"> 7764</span>&#160;        VkImage dedicatedImage,</div>
-<div class="line"><a name="l07765"></a><span class="lineno"> 7765</span>&#160;        <span class="keyword">const</span> <a class="code" href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a>&amp; createInfo,</div>
-<div class="line"><a name="l07766"></a><span class="lineno"> 7766</span>&#160;        VmaSuballocationType suballocType,</div>
-<div class="line"><a name="l07767"></a><span class="lineno"> 7767</span>&#160;        <span class="keywordtype">size_t</span> allocationCount,</div>
-<div class="line"><a name="l07768"></a><span class="lineno"> 7768</span>&#160;        <a class="code" href="struct_vma_allocation.html">VmaAllocation</a>* pAllocations);</div>
-<div class="line"><a name="l07769"></a><span class="lineno"> 7769</span>&#160; </div>
-<div class="line"><a name="l07770"></a><span class="lineno"> 7770</span>&#160;    <span class="comment">// Main deallocation function.</span></div>
-<div class="line"><a name="l07771"></a><span class="lineno"> 7771</span>&#160;    <span class="keywordtype">void</span> FreeMemory(</div>
-<div class="line"><a name="l07772"></a><span class="lineno"> 7772</span>&#160;        <span class="keywordtype">size_t</span> allocationCount,</div>
-<div class="line"><a name="l07773"></a><span class="lineno"> 7773</span>&#160;        <span class="keyword">const</span> <a class="code" href="struct_vma_allocation.html">VmaAllocation</a>* pAllocations);</div>
-<div class="line"><a name="l07774"></a><span class="lineno"> 7774</span>&#160; </div>
-<div class="line"><a name="l07775"></a><span class="lineno"> 7775</span>&#160;    VkResult ResizeAllocation(</div>
-<div class="line"><a name="l07776"></a><span class="lineno"> 7776</span>&#160;        <span class="keyword">const</span> <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> alloc,</div>
-<div class="line"><a name="l07777"></a><span class="lineno"> 7777</span>&#160;        VkDeviceSize newSize);</div>
-<div class="line"><a name="l07778"></a><span class="lineno"> 7778</span>&#160; </div>
-<div class="line"><a name="l07779"></a><span class="lineno"> 7779</span>&#160;    <span class="keywordtype">void</span> CalculateStats(<a class="code" href="struct_vma_stats.html">VmaStats</a>* pStats);</div>
-<div class="line"><a name="l07780"></a><span class="lineno"> 7780</span>&#160; </div>
-<div class="line"><a name="l07781"></a><span class="lineno"> 7781</span>&#160;    <span class="keywordtype">void</span> GetBudget(</div>
-<div class="line"><a name="l07782"></a><span class="lineno"> 7782</span>&#160;        <a class="code" href="struct_vma_budget.html">VmaBudget</a>* outBudget, uint32_t firstHeap, uint32_t heapCount);</div>
-<div class="line"><a name="l07783"></a><span class="lineno"> 7783</span>&#160; </div>
-<div class="line"><a name="l07784"></a><span class="lineno"> 7784</span>&#160;<span class="preprocessor">#if VMA_STATS_STRING_ENABLED</span></div>
-<div class="line"><a name="l07785"></a><span class="lineno"> 7785</span>&#160;    <span class="keywordtype">void</span> PrintDetailedMap(<span class="keyword">class</span> VmaJsonWriter&amp; json);</div>
-<div class="line"><a name="l07786"></a><span class="lineno"> 7786</span>&#160;<span class="preprocessor">#endif</span></div>
-<div class="line"><a name="l07787"></a><span class="lineno"> 7787</span>&#160; </div>
-<div class="line"><a name="l07788"></a><span class="lineno"> 7788</span>&#160;    VkResult DefragmentationBegin(</div>
-<div class="line"><a name="l07789"></a><span class="lineno"> 7789</span>&#160;        <span class="keyword">const</span> <a class="code" href="struct_vma_defragmentation_info2.html">VmaDefragmentationInfo2</a>&amp; info,</div>
-<div class="line"><a name="l07790"></a><span class="lineno"> 7790</span>&#160;        <a class="code" href="struct_vma_defragmentation_stats.html">VmaDefragmentationStats</a>* pStats,</div>
-<div class="line"><a name="l07791"></a><span class="lineno"> 7791</span>&#160;        <a class="code" href="struct_vma_defragmentation_context.html">VmaDefragmentationContext</a>* pContext);</div>
-<div class="line"><a name="l07792"></a><span class="lineno"> 7792</span>&#160;    VkResult DefragmentationEnd(</div>
-<div class="line"><a name="l07793"></a><span class="lineno"> 7793</span>&#160;        <a class="code" href="struct_vma_defragmentation_context.html">VmaDefragmentationContext</a> context);</div>
-<div class="line"><a name="l07794"></a><span class="lineno"> 7794</span>&#160; </div>
-<div class="line"><a name="l07795"></a><span class="lineno"> 7795</span>&#160;    VkResult DefragmentationPassBegin(</div>
-<div class="line"><a name="l07796"></a><span class="lineno"> 7796</span>&#160;        <a class="code" href="struct_vma_defragmentation_pass_info.html">VmaDefragmentationPassInfo</a>* pInfo,</div>
-<div class="line"><a name="l07797"></a><span class="lineno"> 7797</span>&#160;        <a class="code" href="struct_vma_defragmentation_context.html">VmaDefragmentationContext</a> context);</div>
-<div class="line"><a name="l07798"></a><span class="lineno"> 7798</span>&#160;    VkResult DefragmentationPassEnd(</div>
-<div class="line"><a name="l07799"></a><span class="lineno"> 7799</span>&#160;        <a class="code" href="struct_vma_defragmentation_context.html">VmaDefragmentationContext</a> context);</div>
-<div class="line"><a name="l07800"></a><span class="lineno"> 7800</span>&#160; </div>
-<div class="line"><a name="l07801"></a><span class="lineno"> 7801</span>&#160;    <span class="keywordtype">void</span> GetAllocationInfo(<a class="code" href="struct_vma_allocation.html">VmaAllocation</a> hAllocation, <a class="code" href="struct_vma_allocation_info.html">VmaAllocationInfo</a>* pAllocationInfo);</div>
-<div class="line"><a name="l07802"></a><span class="lineno"> 7802</span>&#160;    <span class="keywordtype">bool</span> TouchAllocation(<a class="code" href="struct_vma_allocation.html">VmaAllocation</a> hAllocation);</div>
-<div class="line"><a name="l07803"></a><span class="lineno"> 7803</span>&#160; </div>
-<div class="line"><a name="l07804"></a><span class="lineno"> 7804</span>&#160;    VkResult CreatePool(<span class="keyword">const</span> <a class="code" href="struct_vma_pool_create_info.html">VmaPoolCreateInfo</a>* pCreateInfo, <a class="code" href="struct_vma_pool.html">VmaPool</a>* pPool);</div>
-<div class="line"><a name="l07805"></a><span class="lineno"> 7805</span>&#160;    <span class="keywordtype">void</span> DestroyPool(<a class="code" href="struct_vma_pool.html">VmaPool</a> pool);</div>
-<div class="line"><a name="l07806"></a><span class="lineno"> 7806</span>&#160;    <span class="keywordtype">void</span> GetPoolStats(<a class="code" href="struct_vma_pool.html">VmaPool</a> pool, <a class="code" href="struct_vma_pool_stats.html">VmaPoolStats</a>* pPoolStats);</div>
-<div class="line"><a name="l07807"></a><span class="lineno"> 7807</span>&#160; </div>
-<div class="line"><a name="l07808"></a><span class="lineno"> 7808</span>&#160;    <span class="keywordtype">void</span> SetCurrentFrameIndex(uint32_t frameIndex);</div>
-<div class="line"><a name="l07809"></a><span class="lineno"> 7809</span>&#160;    uint32_t GetCurrentFrameIndex()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_CurrentFrameIndex.load(); }</div>
-<div class="line"><a name="l07810"></a><span class="lineno"> 7810</span>&#160; </div>
-<div class="line"><a name="l07811"></a><span class="lineno"> 7811</span>&#160;    <span class="keywordtype">void</span> MakePoolAllocationsLost(</div>
-<div class="line"><a name="l07812"></a><span class="lineno"> 7812</span>&#160;        <a class="code" href="struct_vma_pool.html">VmaPool</a> hPool,</div>
-<div class="line"><a name="l07813"></a><span class="lineno"> 7813</span>&#160;        <span class="keywordtype">size_t</span>* pLostAllocationCount);</div>
-<div class="line"><a name="l07814"></a><span class="lineno"> 7814</span>&#160;    VkResult CheckPoolCorruption(<a class="code" href="struct_vma_pool.html">VmaPool</a> hPool);</div>
-<div class="line"><a name="l07815"></a><span class="lineno"> 7815</span>&#160;    VkResult CheckCorruption(uint32_t memoryTypeBits);</div>
-<div class="line"><a name="l07816"></a><span class="lineno"> 7816</span>&#160; </div>
-<div class="line"><a name="l07817"></a><span class="lineno"> 7817</span>&#160;    <span class="keywordtype">void</span> CreateLostAllocation(<a class="code" href="struct_vma_allocation.html">VmaAllocation</a>* pAllocation);</div>
+<div class="line"><a name="l07713"></a><span class="lineno"> 7713</span>&#160;    <span class="keyword">virtual</span> VkResult Defragment(</div>
+<div class="line"><a name="l07714"></a><span class="lineno"> 7714</span>&#160;        VmaVector&lt; VmaDefragmentationMove, VmaStlAllocator&lt;VmaDefragmentationMove&gt; &gt;&amp; moves,</div>
+<div class="line"><a name="l07715"></a><span class="lineno"> 7715</span>&#160;        VkDeviceSize maxBytesToMove,</div>
+<div class="line"><a name="l07716"></a><span class="lineno"> 7716</span>&#160;        uint32_t maxAllocationsToMove,</div>
+<div class="line"><a name="l07717"></a><span class="lineno"> 7717</span>&#160;        <a class="code" href="vk__mem__alloc_8h.html#a88a77cef37e5d3c4fc9eb328885d048d">VmaDefragmentationFlags</a> flags);</div>
+<div class="line"><a name="l07718"></a><span class="lineno"> 7718</span>&#160; </div>
+<div class="line"><a name="l07719"></a><span class="lineno"> 7719</span>&#160;    <span class="keyword">virtual</span> VkDeviceSize GetBytesMoved()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_BytesMoved; }</div>
+<div class="line"><a name="l07720"></a><span class="lineno"> 7720</span>&#160;    <span class="keyword">virtual</span> uint32_t GetAllocationsMoved()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_AllocationsMoved; }</div>
+<div class="line"><a name="l07721"></a><span class="lineno"> 7721</span>&#160; </div>
+<div class="line"><a name="l07722"></a><span class="lineno"> 7722</span>&#160;<span class="keyword">private</span>:</div>
+<div class="line"><a name="l07723"></a><span class="lineno"> 7723</span>&#160;    <span class="keyword">struct </span>BlockInfo</div>
+<div class="line"><a name="l07724"></a><span class="lineno"> 7724</span>&#160;    {</div>
+<div class="line"><a name="l07725"></a><span class="lineno"> 7725</span>&#160;        <span class="keywordtype">size_t</span> origBlockIndex;</div>
+<div class="line"><a name="l07726"></a><span class="lineno"> 7726</span>&#160;    };</div>
+<div class="line"><a name="l07727"></a><span class="lineno"> 7727</span>&#160; </div>
+<div class="line"><a name="l07728"></a><span class="lineno"> 7728</span>&#160;    <span class="keyword">class </span>FreeSpaceDatabase</div>
+<div class="line"><a name="l07729"></a><span class="lineno"> 7729</span>&#160;    {</div>
+<div class="line"><a name="l07730"></a><span class="lineno"> 7730</span>&#160;    <span class="keyword">public</span>:</div>
+<div class="line"><a name="l07731"></a><span class="lineno"> 7731</span>&#160;        FreeSpaceDatabase()</div>
+<div class="line"><a name="l07732"></a><span class="lineno"> 7732</span>&#160;        {</div>
+<div class="line"><a name="l07733"></a><span class="lineno"> 7733</span>&#160;            FreeSpace s = {};</div>
+<div class="line"><a name="l07734"></a><span class="lineno"> 7734</span>&#160;            s.blockInfoIndex = SIZE_MAX;</div>
+<div class="line"><a name="l07735"></a><span class="lineno"> 7735</span>&#160;            <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> i = 0; i &lt; MAX_COUNT; ++i)</div>
+<div class="line"><a name="l07736"></a><span class="lineno"> 7736</span>&#160;            {</div>
+<div class="line"><a name="l07737"></a><span class="lineno"> 7737</span>&#160;                m_FreeSpaces[i] = s;</div>
+<div class="line"><a name="l07738"></a><span class="lineno"> 7738</span>&#160;            }</div>
+<div class="line"><a name="l07739"></a><span class="lineno"> 7739</span>&#160;        }</div>
+<div class="line"><a name="l07740"></a><span class="lineno"> 7740</span>&#160; </div>
+<div class="line"><a name="l07741"></a><span class="lineno"> 7741</span>&#160;        <span class="keywordtype">void</span> Register(<span class="keywordtype">size_t</span> blockInfoIndex, VkDeviceSize offset, VkDeviceSize size)</div>
+<div class="line"><a name="l07742"></a><span class="lineno"> 7742</span>&#160;        {</div>
+<div class="line"><a name="l07743"></a><span class="lineno"> 7743</span>&#160;            <span class="keywordflow">if</span>(size &lt; VMA_MIN_FREE_SUBALLOCATION_SIZE_TO_REGISTER)</div>
+<div class="line"><a name="l07744"></a><span class="lineno"> 7744</span>&#160;            {</div>
+<div class="line"><a name="l07745"></a><span class="lineno"> 7745</span>&#160;                <span class="keywordflow">return</span>;</div>
+<div class="line"><a name="l07746"></a><span class="lineno"> 7746</span>&#160;            }</div>
+<div class="line"><a name="l07747"></a><span class="lineno"> 7747</span>&#160; </div>
+<div class="line"><a name="l07748"></a><span class="lineno"> 7748</span>&#160;            <span class="comment">// Find first invalid or the smallest structure.</span></div>
+<div class="line"><a name="l07749"></a><span class="lineno"> 7749</span>&#160;            <span class="keywordtype">size_t</span> bestIndex = SIZE_MAX;</div>
+<div class="line"><a name="l07750"></a><span class="lineno"> 7750</span>&#160;            <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> i = 0; i &lt; MAX_COUNT; ++i)</div>
+<div class="line"><a name="l07751"></a><span class="lineno"> 7751</span>&#160;            {</div>
+<div class="line"><a name="l07752"></a><span class="lineno"> 7752</span>&#160;                <span class="comment">// Empty structure.</span></div>
+<div class="line"><a name="l07753"></a><span class="lineno"> 7753</span>&#160;                <span class="keywordflow">if</span>(m_FreeSpaces[i].blockInfoIndex == SIZE_MAX)</div>
+<div class="line"><a name="l07754"></a><span class="lineno"> 7754</span>&#160;                {</div>
+<div class="line"><a name="l07755"></a><span class="lineno"> 7755</span>&#160;                    bestIndex = i;</div>
+<div class="line"><a name="l07756"></a><span class="lineno"> 7756</span>&#160;                    <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l07757"></a><span class="lineno"> 7757</span>&#160;                }</div>
+<div class="line"><a name="l07758"></a><span class="lineno"> 7758</span>&#160;                <span class="keywordflow">if</span>(m_FreeSpaces[i].size &lt; size &amp;&amp;</div>
+<div class="line"><a name="l07759"></a><span class="lineno"> 7759</span>&#160;                    (bestIndex == SIZE_MAX || m_FreeSpaces[bestIndex].size &gt; m_FreeSpaces[i].size))</div>
+<div class="line"><a name="l07760"></a><span class="lineno"> 7760</span>&#160;                {</div>
+<div class="line"><a name="l07761"></a><span class="lineno"> 7761</span>&#160;                    bestIndex = i;</div>
+<div class="line"><a name="l07762"></a><span class="lineno"> 7762</span>&#160;                }</div>
+<div class="line"><a name="l07763"></a><span class="lineno"> 7763</span>&#160;            }</div>
+<div class="line"><a name="l07764"></a><span class="lineno"> 7764</span>&#160; </div>
+<div class="line"><a name="l07765"></a><span class="lineno"> 7765</span>&#160;            <span class="keywordflow">if</span>(bestIndex != SIZE_MAX)</div>
+<div class="line"><a name="l07766"></a><span class="lineno"> 7766</span>&#160;            {</div>
+<div class="line"><a name="l07767"></a><span class="lineno"> 7767</span>&#160;                m_FreeSpaces[bestIndex].blockInfoIndex = blockInfoIndex;</div>
+<div class="line"><a name="l07768"></a><span class="lineno"> 7768</span>&#160;                m_FreeSpaces[bestIndex].offset = offset;</div>
+<div class="line"><a name="l07769"></a><span class="lineno"> 7769</span>&#160;                m_FreeSpaces[bestIndex].size = size;</div>
+<div class="line"><a name="l07770"></a><span class="lineno"> 7770</span>&#160;            }</div>
+<div class="line"><a name="l07771"></a><span class="lineno"> 7771</span>&#160;        }</div>
+<div class="line"><a name="l07772"></a><span class="lineno"> 7772</span>&#160; </div>
+<div class="line"><a name="l07773"></a><span class="lineno"> 7773</span>&#160;        <span class="keywordtype">bool</span> Fetch(VkDeviceSize alignment, VkDeviceSize size,</div>
+<div class="line"><a name="l07774"></a><span class="lineno"> 7774</span>&#160;            <span class="keywordtype">size_t</span>&amp; outBlockInfoIndex, VkDeviceSize&amp; outDstOffset)</div>
+<div class="line"><a name="l07775"></a><span class="lineno"> 7775</span>&#160;        {</div>
+<div class="line"><a name="l07776"></a><span class="lineno"> 7776</span>&#160;            <span class="keywordtype">size_t</span> bestIndex = SIZE_MAX;</div>
+<div class="line"><a name="l07777"></a><span class="lineno"> 7777</span>&#160;            VkDeviceSize bestFreeSpaceAfter = 0;</div>
+<div class="line"><a name="l07778"></a><span class="lineno"> 7778</span>&#160;            <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> i = 0; i &lt; MAX_COUNT; ++i)</div>
+<div class="line"><a name="l07779"></a><span class="lineno"> 7779</span>&#160;            {</div>
+<div class="line"><a name="l07780"></a><span class="lineno"> 7780</span>&#160;                <span class="comment">// Structure is valid.</span></div>
+<div class="line"><a name="l07781"></a><span class="lineno"> 7781</span>&#160;                <span class="keywordflow">if</span>(m_FreeSpaces[i].blockInfoIndex != SIZE_MAX)</div>
+<div class="line"><a name="l07782"></a><span class="lineno"> 7782</span>&#160;                {</div>
+<div class="line"><a name="l07783"></a><span class="lineno"> 7783</span>&#160;                    <span class="keyword">const</span> VkDeviceSize dstOffset = VmaAlignUp(m_FreeSpaces[i].offset, alignment);</div>
+<div class="line"><a name="l07784"></a><span class="lineno"> 7784</span>&#160;                    <span class="comment">// Allocation fits into this structure.</span></div>
+<div class="line"><a name="l07785"></a><span class="lineno"> 7785</span>&#160;                    <span class="keywordflow">if</span>(dstOffset + size &lt;= m_FreeSpaces[i].offset + m_FreeSpaces[i].size)</div>
+<div class="line"><a name="l07786"></a><span class="lineno"> 7786</span>&#160;                    {</div>
+<div class="line"><a name="l07787"></a><span class="lineno"> 7787</span>&#160;                        <span class="keyword">const</span> VkDeviceSize freeSpaceAfter = (m_FreeSpaces[i].offset + m_FreeSpaces[i].size) -</div>
+<div class="line"><a name="l07788"></a><span class="lineno"> 7788</span>&#160;                            (dstOffset + size);</div>
+<div class="line"><a name="l07789"></a><span class="lineno"> 7789</span>&#160;                        <span class="keywordflow">if</span>(bestIndex == SIZE_MAX || freeSpaceAfter &gt; bestFreeSpaceAfter)</div>
+<div class="line"><a name="l07790"></a><span class="lineno"> 7790</span>&#160;                        {</div>
+<div class="line"><a name="l07791"></a><span class="lineno"> 7791</span>&#160;                            bestIndex = i;</div>
+<div class="line"><a name="l07792"></a><span class="lineno"> 7792</span>&#160;                            bestFreeSpaceAfter = freeSpaceAfter;</div>
+<div class="line"><a name="l07793"></a><span class="lineno"> 7793</span>&#160;                        }</div>
+<div class="line"><a name="l07794"></a><span class="lineno"> 7794</span>&#160;                    }</div>
+<div class="line"><a name="l07795"></a><span class="lineno"> 7795</span>&#160;                }</div>
+<div class="line"><a name="l07796"></a><span class="lineno"> 7796</span>&#160;            }</div>
+<div class="line"><a name="l07797"></a><span class="lineno"> 7797</span>&#160; </div>
+<div class="line"><a name="l07798"></a><span class="lineno"> 7798</span>&#160;            <span class="keywordflow">if</span>(bestIndex != SIZE_MAX)</div>
+<div class="line"><a name="l07799"></a><span class="lineno"> 7799</span>&#160;            {</div>
+<div class="line"><a name="l07800"></a><span class="lineno"> 7800</span>&#160;                outBlockInfoIndex = m_FreeSpaces[bestIndex].blockInfoIndex;</div>
+<div class="line"><a name="l07801"></a><span class="lineno"> 7801</span>&#160;                outDstOffset = VmaAlignUp(m_FreeSpaces[bestIndex].offset, alignment);</div>
+<div class="line"><a name="l07802"></a><span class="lineno"> 7802</span>&#160; </div>
+<div class="line"><a name="l07803"></a><span class="lineno"> 7803</span>&#160;                <span class="keywordflow">if</span>(bestFreeSpaceAfter &gt;= VMA_MIN_FREE_SUBALLOCATION_SIZE_TO_REGISTER)</div>
+<div class="line"><a name="l07804"></a><span class="lineno"> 7804</span>&#160;                {</div>
+<div class="line"><a name="l07805"></a><span class="lineno"> 7805</span>&#160;                    <span class="comment">// Leave this structure for remaining empty space.</span></div>
+<div class="line"><a name="l07806"></a><span class="lineno"> 7806</span>&#160;                    <span class="keyword">const</span> VkDeviceSize alignmentPlusSize = (outDstOffset - m_FreeSpaces[bestIndex].offset) + size;</div>
+<div class="line"><a name="l07807"></a><span class="lineno"> 7807</span>&#160;                    m_FreeSpaces[bestIndex].offset += alignmentPlusSize;</div>
+<div class="line"><a name="l07808"></a><span class="lineno"> 7808</span>&#160;                    m_FreeSpaces[bestIndex].size -= alignmentPlusSize;</div>
+<div class="line"><a name="l07809"></a><span class="lineno"> 7809</span>&#160;                }</div>
+<div class="line"><a name="l07810"></a><span class="lineno"> 7810</span>&#160;                <span class="keywordflow">else</span></div>
+<div class="line"><a name="l07811"></a><span class="lineno"> 7811</span>&#160;                {</div>
+<div class="line"><a name="l07812"></a><span class="lineno"> 7812</span>&#160;                    <span class="comment">// This structure becomes invalid.</span></div>
+<div class="line"><a name="l07813"></a><span class="lineno"> 7813</span>&#160;                    m_FreeSpaces[bestIndex].blockInfoIndex = SIZE_MAX;</div>
+<div class="line"><a name="l07814"></a><span class="lineno"> 7814</span>&#160;                }</div>
+<div class="line"><a name="l07815"></a><span class="lineno"> 7815</span>&#160; </div>
+<div class="line"><a name="l07816"></a><span class="lineno"> 7816</span>&#160;                <span class="keywordflow">return</span> <span class="keyword">true</span>;</div>
+<div class="line"><a name="l07817"></a><span class="lineno"> 7817</span>&#160;            }</div>
 <div class="line"><a name="l07818"></a><span class="lineno"> 7818</span>&#160; </div>
-<div class="line"><a name="l07819"></a><span class="lineno"> 7819</span>&#160;    <span class="comment">// Call to Vulkan function vkAllocateMemory with accompanying bookkeeping.</span></div>
-<div class="line"><a name="l07820"></a><span class="lineno"> 7820</span>&#160;    VkResult AllocateVulkanMemory(<span class="keyword">const</span> VkMemoryAllocateInfo* pAllocateInfo, VkDeviceMemory* pMemory);</div>
-<div class="line"><a name="l07821"></a><span class="lineno"> 7821</span>&#160;    <span class="comment">// Call to Vulkan function vkFreeMemory with accompanying bookkeeping.</span></div>
-<div class="line"><a name="l07822"></a><span class="lineno"> 7822</span>&#160;    <span class="keywordtype">void</span> FreeVulkanMemory(uint32_t memoryType, VkDeviceSize size, VkDeviceMemory hMemory);</div>
-<div class="line"><a name="l07823"></a><span class="lineno"> 7823</span>&#160;    <span class="comment">// Call to Vulkan function vkBindBufferMemory or vkBindBufferMemory2KHR.</span></div>
-<div class="line"><a name="l07824"></a><span class="lineno"> 7824</span>&#160;    VkResult BindVulkanBuffer(</div>
-<div class="line"><a name="l07825"></a><span class="lineno"> 7825</span>&#160;        VkDeviceMemory memory,</div>
-<div class="line"><a name="l07826"></a><span class="lineno"> 7826</span>&#160;        VkDeviceSize memoryOffset,</div>
-<div class="line"><a name="l07827"></a><span class="lineno"> 7827</span>&#160;        VkBuffer buffer,</div>
-<div class="line"><a name="l07828"></a><span class="lineno"> 7828</span>&#160;        <span class="keyword">const</span> <span class="keywordtype">void</span>* pNext);</div>
-<div class="line"><a name="l07829"></a><span class="lineno"> 7829</span>&#160;    <span class="comment">// Call to Vulkan function vkBindImageMemory or vkBindImageMemory2KHR.</span></div>
-<div class="line"><a name="l07830"></a><span class="lineno"> 7830</span>&#160;    VkResult BindVulkanImage(</div>
-<div class="line"><a name="l07831"></a><span class="lineno"> 7831</span>&#160;        VkDeviceMemory memory,</div>
-<div class="line"><a name="l07832"></a><span class="lineno"> 7832</span>&#160;        VkDeviceSize memoryOffset,</div>
-<div class="line"><a name="l07833"></a><span class="lineno"> 7833</span>&#160;        VkImage image,</div>
-<div class="line"><a name="l07834"></a><span class="lineno"> 7834</span>&#160;        <span class="keyword">const</span> <span class="keywordtype">void</span>* pNext);</div>
-<div class="line"><a name="l07835"></a><span class="lineno"> 7835</span>&#160; </div>
-<div class="line"><a name="l07836"></a><span class="lineno"> 7836</span>&#160;    VkResult Map(<a class="code" href="struct_vma_allocation.html">VmaAllocation</a> hAllocation, <span class="keywordtype">void</span>** ppData);</div>
-<div class="line"><a name="l07837"></a><span class="lineno"> 7837</span>&#160;    <span class="keywordtype">void</span> Unmap(<a class="code" href="struct_vma_allocation.html">VmaAllocation</a> hAllocation);</div>
-<div class="line"><a name="l07838"></a><span class="lineno"> 7838</span>&#160; </div>
-<div class="line"><a name="l07839"></a><span class="lineno"> 7839</span>&#160;    VkResult BindBufferMemory(</div>
-<div class="line"><a name="l07840"></a><span class="lineno"> 7840</span>&#160;        <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> hAllocation,</div>
-<div class="line"><a name="l07841"></a><span class="lineno"> 7841</span>&#160;        VkDeviceSize allocationLocalOffset,</div>
-<div class="line"><a name="l07842"></a><span class="lineno"> 7842</span>&#160;        VkBuffer hBuffer,</div>
-<div class="line"><a name="l07843"></a><span class="lineno"> 7843</span>&#160;        <span class="keyword">const</span> <span class="keywordtype">void</span>* pNext);</div>
-<div class="line"><a name="l07844"></a><span class="lineno"> 7844</span>&#160;    VkResult BindImageMemory(</div>
-<div class="line"><a name="l07845"></a><span class="lineno"> 7845</span>&#160;        <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> hAllocation,</div>
-<div class="line"><a name="l07846"></a><span class="lineno"> 7846</span>&#160;        VkDeviceSize allocationLocalOffset,</div>
-<div class="line"><a name="l07847"></a><span class="lineno"> 7847</span>&#160;        VkImage hImage,</div>
-<div class="line"><a name="l07848"></a><span class="lineno"> 7848</span>&#160;        <span class="keyword">const</span> <span class="keywordtype">void</span>* pNext);</div>
-<div class="line"><a name="l07849"></a><span class="lineno"> 7849</span>&#160; </div>
-<div class="line"><a name="l07850"></a><span class="lineno"> 7850</span>&#160;    VkResult FlushOrInvalidateAllocation(</div>
-<div class="line"><a name="l07851"></a><span class="lineno"> 7851</span>&#160;        <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> hAllocation,</div>
-<div class="line"><a name="l07852"></a><span class="lineno"> 7852</span>&#160;        VkDeviceSize offset, VkDeviceSize size,</div>
-<div class="line"><a name="l07853"></a><span class="lineno"> 7853</span>&#160;        VMA_CACHE_OPERATION op);</div>
-<div class="line"><a name="l07854"></a><span class="lineno"> 7854</span>&#160;    VkResult FlushOrInvalidateAllocations(</div>
-<div class="line"><a name="l07855"></a><span class="lineno"> 7855</span>&#160;        uint32_t allocationCount,</div>
-<div class="line"><a name="l07856"></a><span class="lineno"> 7856</span>&#160;        <span class="keyword">const</span> <a class="code" href="struct_vma_allocation.html">VmaAllocation</a>* allocations,</div>
-<div class="line"><a name="l07857"></a><span class="lineno"> 7857</span>&#160;        <span class="keyword">const</span> VkDeviceSize* offsets, <span class="keyword">const</span> VkDeviceSize* sizes,</div>
-<div class="line"><a name="l07858"></a><span class="lineno"> 7858</span>&#160;        VMA_CACHE_OPERATION op);</div>
-<div class="line"><a name="l07859"></a><span class="lineno"> 7859</span>&#160; </div>
-<div class="line"><a name="l07860"></a><span class="lineno"> 7860</span>&#160;    <span class="keywordtype">void</span> FillAllocation(<span class="keyword">const</span> <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> hAllocation, uint8_t pattern);</div>
-<div class="line"><a name="l07861"></a><span class="lineno"> 7861</span>&#160; </div>
-<div class="line"><a name="l07862"></a><span class="lineno"> 7862</span>&#160;    <span class="comment">/*</span></div>
-<div class="line"><a name="l07863"></a><span class="lineno"> 7863</span>&#160;<span class="comment">    Returns bit mask of memory types that can support defragmentation on GPU as</span></div>
-<div class="line"><a name="l07864"></a><span class="lineno"> 7864</span>&#160;<span class="comment">    they support creation of required buffer for copy operations.</span></div>
-<div class="line"><a name="l07865"></a><span class="lineno"> 7865</span>&#160;<span class="comment">    */</span></div>
-<div class="line"><a name="l07866"></a><span class="lineno"> 7866</span>&#160;    uint32_t GetGpuDefragmentationMemoryTypeBits();</div>
-<div class="line"><a name="l07867"></a><span class="lineno"> 7867</span>&#160; </div>
-<div class="line"><a name="l07868"></a><span class="lineno"> 7868</span>&#160;<span class="keyword">private</span>:</div>
-<div class="line"><a name="l07869"></a><span class="lineno"> 7869</span>&#160;    VkDeviceSize m_PreferredLargeHeapBlockSize;</div>
-<div class="line"><a name="l07870"></a><span class="lineno"> 7870</span>&#160; </div>
-<div class="line"><a name="l07871"></a><span class="lineno"> 7871</span>&#160;    VkPhysicalDevice m_PhysicalDevice;</div>
-<div class="line"><a name="l07872"></a><span class="lineno"> 7872</span>&#160;    VMA_ATOMIC_UINT32 m_CurrentFrameIndex;</div>
-<div class="line"><a name="l07873"></a><span class="lineno"> 7873</span>&#160;    VMA_ATOMIC_UINT32 m_GpuDefragmentationMemoryTypeBits; <span class="comment">// UINT32_MAX means uninitialized.</span></div>
-<div class="line"><a name="l07874"></a><span class="lineno"> 7874</span>&#160;    </div>
-<div class="line"><a name="l07875"></a><span class="lineno"> 7875</span>&#160;    VMA_RW_MUTEX m_PoolsMutex;</div>
-<div class="line"><a name="l07876"></a><span class="lineno"> 7876</span>&#160;    <span class="comment">// Protected by m_PoolsMutex. Sorted by pointer value.</span></div>
-<div class="line"><a name="l07877"></a><span class="lineno"> 7877</span>&#160;    VmaVector&lt;VmaPool, VmaStlAllocator&lt;VmaPool&gt; &gt; m_Pools;</div>
-<div class="line"><a name="l07878"></a><span class="lineno"> 7878</span>&#160;    uint32_t m_NextPoolId;</div>
-<div class="line"><a name="l07879"></a><span class="lineno"> 7879</span>&#160; </div>
-<div class="line"><a name="l07880"></a><span class="lineno"> 7880</span>&#160;    <a class="code" href="struct_vma_vulkan_functions.html">VmaVulkanFunctions</a> m_VulkanFunctions;</div>
-<div class="line"><a name="l07881"></a><span class="lineno"> 7881</span>&#160; </div>
-<div class="line"><a name="l07882"></a><span class="lineno"> 7882</span>&#160;    <span class="comment">// Global bit mask AND-ed with any memoryTypeBits to disallow certain memory types.</span></div>
-<div class="line"><a name="l07883"></a><span class="lineno"> 7883</span>&#160;    uint32_t m_GlobalMemoryTypeBits;</div>
-<div class="line"><a name="l07884"></a><span class="lineno"> 7884</span>&#160; </div>
-<div class="line"><a name="l07885"></a><span class="lineno"> 7885</span>&#160;<span class="preprocessor">#if VMA_RECORDING_ENABLED</span></div>
-<div class="line"><a name="l07886"></a><span class="lineno"> 7886</span>&#160;    VmaRecorder* m_pRecorder;</div>
-<div class="line"><a name="l07887"></a><span class="lineno"> 7887</span>&#160;<span class="preprocessor">#endif</span></div>
-<div class="line"><a name="l07888"></a><span class="lineno"> 7888</span>&#160; </div>
-<div class="line"><a name="l07889"></a><span class="lineno"> 7889</span>&#160;    <span class="keywordtype">void</span> ImportVulkanFunctions(<span class="keyword">const</span> <a class="code" href="struct_vma_vulkan_functions.html">VmaVulkanFunctions</a>* pVulkanFunctions);</div>
-<div class="line"><a name="l07890"></a><span class="lineno"> 7890</span>&#160; </div>
-<div class="line"><a name="l07891"></a><span class="lineno"> 7891</span>&#160;<span class="preprocessor">#if VMA_STATIC_VULKAN_FUNCTIONS == 1</span></div>
-<div class="line"><a name="l07892"></a><span class="lineno"> 7892</span>&#160;    <span class="keywordtype">void</span> ImportVulkanFunctions_Static();</div>
-<div class="line"><a name="l07893"></a><span class="lineno"> 7893</span>&#160;<span class="preprocessor">#endif</span></div>
-<div class="line"><a name="l07894"></a><span class="lineno"> 7894</span>&#160; </div>
-<div class="line"><a name="l07895"></a><span class="lineno"> 7895</span>&#160;    <span class="keywordtype">void</span> ImportVulkanFunctions_Custom(<span class="keyword">const</span> <a class="code" href="struct_vma_vulkan_functions.html">VmaVulkanFunctions</a>* pVulkanFunctions);</div>
-<div class="line"><a name="l07896"></a><span class="lineno"> 7896</span>&#160; </div>
-<div class="line"><a name="l07897"></a><span class="lineno"> 7897</span>&#160;<span class="preprocessor">#if VMA_DYNAMIC_VULKAN_FUNCTIONS == 1</span></div>
-<div class="line"><a name="l07898"></a><span class="lineno"> 7898</span>&#160;    <span class="keywordtype">void</span> ImportVulkanFunctions_Dynamic();</div>
-<div class="line"><a name="l07899"></a><span class="lineno"> 7899</span>&#160;<span class="preprocessor">#endif</span></div>
-<div class="line"><a name="l07900"></a><span class="lineno"> 7900</span>&#160; </div>
-<div class="line"><a name="l07901"></a><span class="lineno"> 7901</span>&#160;    <span class="keywordtype">void</span> ValidateVulkanFunctions();</div>
-<div class="line"><a name="l07902"></a><span class="lineno"> 7902</span>&#160; </div>
-<div class="line"><a name="l07903"></a><span class="lineno"> 7903</span>&#160;    VkDeviceSize CalcPreferredBlockSize(uint32_t memTypeIndex);</div>
-<div class="line"><a name="l07904"></a><span class="lineno"> 7904</span>&#160; </div>
-<div class="line"><a name="l07905"></a><span class="lineno"> 7905</span>&#160;    VkResult AllocateMemoryOfType(</div>
-<div class="line"><a name="l07906"></a><span class="lineno"> 7906</span>&#160;        VkDeviceSize size,</div>
-<div class="line"><a name="l07907"></a><span class="lineno"> 7907</span>&#160;        VkDeviceSize alignment,</div>
-<div class="line"><a name="l07908"></a><span class="lineno"> 7908</span>&#160;        <span class="keywordtype">bool</span> dedicatedAllocation,</div>
-<div class="line"><a name="l07909"></a><span class="lineno"> 7909</span>&#160;        VkBuffer dedicatedBuffer,</div>
-<div class="line"><a name="l07910"></a><span class="lineno"> 7910</span>&#160;        VkBufferUsageFlags dedicatedBufferUsage,</div>
-<div class="line"><a name="l07911"></a><span class="lineno"> 7911</span>&#160;        VkImage dedicatedImage,</div>
-<div class="line"><a name="l07912"></a><span class="lineno"> 7912</span>&#160;        <span class="keyword">const</span> <a class="code" href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a>&amp; createInfo,</div>
-<div class="line"><a name="l07913"></a><span class="lineno"> 7913</span>&#160;        uint32_t memTypeIndex,</div>
-<div class="line"><a name="l07914"></a><span class="lineno"> 7914</span>&#160;        VmaSuballocationType suballocType,</div>
-<div class="line"><a name="l07915"></a><span class="lineno"> 7915</span>&#160;        <span class="keywordtype">size_t</span> allocationCount,</div>
-<div class="line"><a name="l07916"></a><span class="lineno"> 7916</span>&#160;        <a class="code" href="struct_vma_allocation.html">VmaAllocation</a>* pAllocations);</div>
+<div class="line"><a name="l07819"></a><span class="lineno"> 7819</span>&#160;            <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
+<div class="line"><a name="l07820"></a><span class="lineno"> 7820</span>&#160;        }</div>
+<div class="line"><a name="l07821"></a><span class="lineno"> 7821</span>&#160; </div>
+<div class="line"><a name="l07822"></a><span class="lineno"> 7822</span>&#160;    <span class="keyword">private</span>:</div>
+<div class="line"><a name="l07823"></a><span class="lineno"> 7823</span>&#160;        <span class="keyword">static</span> <span class="keyword">const</span> <span class="keywordtype">size_t</span> MAX_COUNT = 4;</div>
+<div class="line"><a name="l07824"></a><span class="lineno"> 7824</span>&#160; </div>
+<div class="line"><a name="l07825"></a><span class="lineno"> 7825</span>&#160;        <span class="keyword">struct </span>FreeSpace</div>
+<div class="line"><a name="l07826"></a><span class="lineno"> 7826</span>&#160;        {</div>
+<div class="line"><a name="l07827"></a><span class="lineno"> 7827</span>&#160;            <span class="keywordtype">size_t</span> blockInfoIndex; <span class="comment">// SIZE_MAX means this structure is invalid.</span></div>
+<div class="line"><a name="l07828"></a><span class="lineno"> 7828</span>&#160;            VkDeviceSize offset;</div>
+<div class="line"><a name="l07829"></a><span class="lineno"> 7829</span>&#160;            VkDeviceSize size;</div>
+<div class="line"><a name="l07830"></a><span class="lineno"> 7830</span>&#160;        } m_FreeSpaces[MAX_COUNT];</div>
+<div class="line"><a name="l07831"></a><span class="lineno"> 7831</span>&#160;    };</div>
+<div class="line"><a name="l07832"></a><span class="lineno"> 7832</span>&#160; </div>
+<div class="line"><a name="l07833"></a><span class="lineno"> 7833</span>&#160;    <span class="keyword">const</span> <span class="keywordtype">bool</span> m_OverlappingMoveSupported;</div>
+<div class="line"><a name="l07834"></a><span class="lineno"> 7834</span>&#160; </div>
+<div class="line"><a name="l07835"></a><span class="lineno"> 7835</span>&#160;    uint32_t m_AllocationCount;</div>
+<div class="line"><a name="l07836"></a><span class="lineno"> 7836</span>&#160;    <span class="keywordtype">bool</span> m_AllAllocations;</div>
+<div class="line"><a name="l07837"></a><span class="lineno"> 7837</span>&#160; </div>
+<div class="line"><a name="l07838"></a><span class="lineno"> 7838</span>&#160;    VkDeviceSize m_BytesMoved;</div>
+<div class="line"><a name="l07839"></a><span class="lineno"> 7839</span>&#160;    uint32_t m_AllocationsMoved;</div>
+<div class="line"><a name="l07840"></a><span class="lineno"> 7840</span>&#160; </div>
+<div class="line"><a name="l07841"></a><span class="lineno"> 7841</span>&#160;    VmaVector&lt; BlockInfo, VmaStlAllocator&lt;BlockInfo&gt; &gt; m_BlockInfos;</div>
+<div class="line"><a name="l07842"></a><span class="lineno"> 7842</span>&#160; </div>
+<div class="line"><a name="l07843"></a><span class="lineno"> 7843</span>&#160;    <span class="keywordtype">void</span> PreprocessMetadata();</div>
+<div class="line"><a name="l07844"></a><span class="lineno"> 7844</span>&#160;    <span class="keywordtype">void</span> PostprocessMetadata();</div>
+<div class="line"><a name="l07845"></a><span class="lineno"> 7845</span>&#160;    <span class="keywordtype">void</span> InsertSuballoc(VmaBlockMetadata_Generic* pMetadata, <span class="keyword">const</span> VmaSuballocation&amp; suballoc);</div>
+<div class="line"><a name="l07846"></a><span class="lineno"> 7846</span>&#160;};</div>
+<div class="line"><a name="l07847"></a><span class="lineno"> 7847</span>&#160; </div>
+<div class="line"><a name="l07848"></a><span class="lineno"> 7848</span>&#160;<span class="keyword">struct </span>VmaBlockDefragmentationContext</div>
+<div class="line"><a name="l07849"></a><span class="lineno"> 7849</span>&#160;{</div>
+<div class="line"><a name="l07850"></a><span class="lineno"> 7850</span>&#160;    <span class="keyword">enum</span> BLOCK_FLAG</div>
+<div class="line"><a name="l07851"></a><span class="lineno"> 7851</span>&#160;    {</div>
+<div class="line"><a name="l07852"></a><span class="lineno"> 7852</span>&#160;        BLOCK_FLAG_USED = 0x00000001,</div>
+<div class="line"><a name="l07853"></a><span class="lineno"> 7853</span>&#160;    };</div>
+<div class="line"><a name="l07854"></a><span class="lineno"> 7854</span>&#160;    uint32_t flags;</div>
+<div class="line"><a name="l07855"></a><span class="lineno"> 7855</span>&#160;    VkBuffer hBuffer;</div>
+<div class="line"><a name="l07856"></a><span class="lineno"> 7856</span>&#160;};</div>
+<div class="line"><a name="l07857"></a><span class="lineno"> 7857</span>&#160; </div>
+<div class="line"><a name="l07858"></a><span class="lineno"> 7858</span>&#160;<span class="keyword">class </span>VmaBlockVectorDefragmentationContext</div>
+<div class="line"><a name="l07859"></a><span class="lineno"> 7859</span>&#160;{</div>
+<div class="line"><a name="l07860"></a><span class="lineno"> 7860</span>&#160;    VMA_CLASS_NO_COPY(VmaBlockVectorDefragmentationContext)</div>
+<div class="line"><a name="l07861"></a><span class="lineno"> 7861</span>&#160;<span class="keyword">public</span>:</div>
+<div class="line"><a name="l07862"></a><span class="lineno"> 7862</span>&#160;    VkResult res;</div>
+<div class="line"><a name="l07863"></a><span class="lineno"> 7863</span>&#160;    <span class="keywordtype">bool</span> mutexLocked;</div>
+<div class="line"><a name="l07864"></a><span class="lineno"> 7864</span>&#160;    VmaVector&lt; VmaBlockDefragmentationContext, VmaStlAllocator&lt;VmaBlockDefragmentationContext&gt; &gt; blockContexts;</div>
+<div class="line"><a name="l07865"></a><span class="lineno"> 7865</span>&#160;    VmaVector&lt; VmaDefragmentationMove, VmaStlAllocator&lt;VmaDefragmentationMove&gt; &gt; defragmentationMoves;</div>
+<div class="line"><a name="l07866"></a><span class="lineno"> 7866</span>&#160;    uint32_t defragmentationMovesProcessed;</div>
+<div class="line"><a name="l07867"></a><span class="lineno"> 7867</span>&#160;    uint32_t defragmentationMovesCommitted;</div>
+<div class="line"><a name="l07868"></a><span class="lineno"> 7868</span>&#160;    <span class="keywordtype">bool</span> hasDefragmentationPlan;</div>
+<div class="line"><a name="l07869"></a><span class="lineno"> 7869</span>&#160; </div>
+<div class="line"><a name="l07870"></a><span class="lineno"> 7870</span>&#160;    VmaBlockVectorDefragmentationContext(</div>
+<div class="line"><a name="l07871"></a><span class="lineno"> 7871</span>&#160;        <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator,</div>
+<div class="line"><a name="l07872"></a><span class="lineno"> 7872</span>&#160;        <a class="code" href="struct_vma_pool.html">VmaPool</a> hCustomPool, <span class="comment">// Optional.</span></div>
+<div class="line"><a name="l07873"></a><span class="lineno"> 7873</span>&#160;        VmaBlockVector* pBlockVector,</div>
+<div class="line"><a name="l07874"></a><span class="lineno"> 7874</span>&#160;        uint32_t currFrameIndex);</div>
+<div class="line"><a name="l07875"></a><span class="lineno"> 7875</span>&#160;    ~VmaBlockVectorDefragmentationContext();</div>
+<div class="line"><a name="l07876"></a><span class="lineno"> 7876</span>&#160; </div>
+<div class="line"><a name="l07877"></a><span class="lineno"> 7877</span>&#160;    <a class="code" href="struct_vma_pool.html">VmaPool</a> GetCustomPool()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_hCustomPool; }</div>
+<div class="line"><a name="l07878"></a><span class="lineno"> 7878</span>&#160;    VmaBlockVector* GetBlockVector()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_pBlockVector; }</div>
+<div class="line"><a name="l07879"></a><span class="lineno"> 7879</span>&#160;    VmaDefragmentationAlgorithm* GetAlgorithm()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_pAlgorithm; }</div>
+<div class="line"><a name="l07880"></a><span class="lineno"> 7880</span>&#160; </div>
+<div class="line"><a name="l07881"></a><span class="lineno"> 7881</span>&#160;    <span class="keywordtype">void</span> AddAllocation(<a class="code" href="struct_vma_allocation.html">VmaAllocation</a> hAlloc, VkBool32* pChanged);</div>
+<div class="line"><a name="l07882"></a><span class="lineno"> 7882</span>&#160;    <span class="keywordtype">void</span> AddAll() { m_AllAllocations = <span class="keyword">true</span>; }</div>
+<div class="line"><a name="l07883"></a><span class="lineno"> 7883</span>&#160; </div>
+<div class="line"><a name="l07884"></a><span class="lineno"> 7884</span>&#160;    <span class="keywordtype">void</span> Begin(<span class="keywordtype">bool</span> overlappingMoveSupported, <a class="code" href="vk__mem__alloc_8h.html#a88a77cef37e5d3c4fc9eb328885d048d">VmaDefragmentationFlags</a> flags);</div>
+<div class="line"><a name="l07885"></a><span class="lineno"> 7885</span>&#160; </div>
+<div class="line"><a name="l07886"></a><span class="lineno"> 7886</span>&#160;<span class="keyword">private</span>:</div>
+<div class="line"><a name="l07887"></a><span class="lineno"> 7887</span>&#160;    <span class="keyword">const</span> <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> m_hAllocator;</div>
+<div class="line"><a name="l07888"></a><span class="lineno"> 7888</span>&#160;    <span class="comment">// Null if not from custom pool.</span></div>
+<div class="line"><a name="l07889"></a><span class="lineno"> 7889</span>&#160;    <span class="keyword">const</span> <a class="code" href="struct_vma_pool.html">VmaPool</a> m_hCustomPool;</div>
+<div class="line"><a name="l07890"></a><span class="lineno"> 7890</span>&#160;    <span class="comment">// Redundant, for convenience not to fetch from m_hCustomPool-&gt;m_BlockVector or m_hAllocator-&gt;m_pBlockVectors.</span></div>
+<div class="line"><a name="l07891"></a><span class="lineno"> 7891</span>&#160;    VmaBlockVector* <span class="keyword">const</span> m_pBlockVector;</div>
+<div class="line"><a name="l07892"></a><span class="lineno"> 7892</span>&#160;    <span class="keyword">const</span> uint32_t m_CurrFrameIndex;</div>
+<div class="line"><a name="l07893"></a><span class="lineno"> 7893</span>&#160;    <span class="comment">// Owner of this object.</span></div>
+<div class="line"><a name="l07894"></a><span class="lineno"> 7894</span>&#160;    VmaDefragmentationAlgorithm* m_pAlgorithm;</div>
+<div class="line"><a name="l07895"></a><span class="lineno"> 7895</span>&#160; </div>
+<div class="line"><a name="l07896"></a><span class="lineno"> 7896</span>&#160;    <span class="keyword">struct </span>AllocInfo</div>
+<div class="line"><a name="l07897"></a><span class="lineno"> 7897</span>&#160;    {</div>
+<div class="line"><a name="l07898"></a><span class="lineno"> 7898</span>&#160;        <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> hAlloc;</div>
+<div class="line"><a name="l07899"></a><span class="lineno"> 7899</span>&#160;        VkBool32* pChanged;</div>
+<div class="line"><a name="l07900"></a><span class="lineno"> 7900</span>&#160;    };</div>
+<div class="line"><a name="l07901"></a><span class="lineno"> 7901</span>&#160;    <span class="comment">// Used between constructor and Begin.</span></div>
+<div class="line"><a name="l07902"></a><span class="lineno"> 7902</span>&#160;    VmaVector&lt; AllocInfo, VmaStlAllocator&lt;AllocInfo&gt; &gt; m_Allocations;</div>
+<div class="line"><a name="l07903"></a><span class="lineno"> 7903</span>&#160;    <span class="keywordtype">bool</span> m_AllAllocations;</div>
+<div class="line"><a name="l07904"></a><span class="lineno"> 7904</span>&#160;};</div>
+<div class="line"><a name="l07905"></a><span class="lineno"> 7905</span>&#160; </div>
+<div class="line"><a name="l07906"></a><span class="lineno"> 7906</span>&#160;<span class="keyword">struct </span>VmaDefragmentationContext_T</div>
+<div class="line"><a name="l07907"></a><span class="lineno"> 7907</span>&#160;{</div>
+<div class="line"><a name="l07908"></a><span class="lineno"> 7908</span>&#160;<span class="keyword">private</span>:</div>
+<div class="line"><a name="l07909"></a><span class="lineno"> 7909</span>&#160;    VMA_CLASS_NO_COPY(VmaDefragmentationContext_T)</div>
+<div class="line"><a name="l07910"></a><span class="lineno"> 7910</span>&#160;<span class="keyword">public</span>:</div>
+<div class="line"><a name="l07911"></a><span class="lineno"> 7911</span>&#160;    VmaDefragmentationContext_T(</div>
+<div class="line"><a name="l07912"></a><span class="lineno"> 7912</span>&#160;        <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator,</div>
+<div class="line"><a name="l07913"></a><span class="lineno"> 7913</span>&#160;        uint32_t currFrameIndex,</div>
+<div class="line"><a name="l07914"></a><span class="lineno"> 7914</span>&#160;        uint32_t flags,</div>
+<div class="line"><a name="l07915"></a><span class="lineno"> 7915</span>&#160;        <a class="code" href="struct_vma_defragmentation_stats.html">VmaDefragmentationStats</a>* pStats);</div>
+<div class="line"><a name="l07916"></a><span class="lineno"> 7916</span>&#160;    ~VmaDefragmentationContext_T();</div>
 <div class="line"><a name="l07917"></a><span class="lineno"> 7917</span>&#160; </div>
-<div class="line"><a name="l07918"></a><span class="lineno"> 7918</span>&#160;    <span class="comment">// Helper function only to be used inside AllocateDedicatedMemory.</span></div>
-<div class="line"><a name="l07919"></a><span class="lineno"> 7919</span>&#160;    VkResult AllocateDedicatedMemoryPage(</div>
-<div class="line"><a name="l07920"></a><span class="lineno"> 7920</span>&#160;        VkDeviceSize size,</div>
-<div class="line"><a name="l07921"></a><span class="lineno"> 7921</span>&#160;        VmaSuballocationType suballocType,</div>
-<div class="line"><a name="l07922"></a><span class="lineno"> 7922</span>&#160;        uint32_t memTypeIndex,</div>
-<div class="line"><a name="l07923"></a><span class="lineno"> 7923</span>&#160;        <span class="keyword">const</span> VkMemoryAllocateInfo&amp; allocInfo,</div>
-<div class="line"><a name="l07924"></a><span class="lineno"> 7924</span>&#160;        <span class="keywordtype">bool</span> map,</div>
-<div class="line"><a name="l07925"></a><span class="lineno"> 7925</span>&#160;        <span class="keywordtype">bool</span> isUserDataString,</div>
-<div class="line"><a name="l07926"></a><span class="lineno"> 7926</span>&#160;        <span class="keywordtype">void</span>* pUserData,</div>
-<div class="line"><a name="l07927"></a><span class="lineno"> 7927</span>&#160;        <a class="code" href="struct_vma_allocation.html">VmaAllocation</a>* pAllocation);</div>
-<div class="line"><a name="l07928"></a><span class="lineno"> 7928</span>&#160; </div>
-<div class="line"><a name="l07929"></a><span class="lineno"> 7929</span>&#160;    <span class="comment">// Allocates and registers new VkDeviceMemory specifically for dedicated allocations.</span></div>
-<div class="line"><a name="l07930"></a><span class="lineno"> 7930</span>&#160;    VkResult AllocateDedicatedMemory(</div>
-<div class="line"><a name="l07931"></a><span class="lineno"> 7931</span>&#160;        VkDeviceSize size,</div>
-<div class="line"><a name="l07932"></a><span class="lineno"> 7932</span>&#160;        VmaSuballocationType suballocType,</div>
-<div class="line"><a name="l07933"></a><span class="lineno"> 7933</span>&#160;        uint32_t memTypeIndex,</div>
-<div class="line"><a name="l07934"></a><span class="lineno"> 7934</span>&#160;        <span class="keywordtype">bool</span> withinBudget,</div>
-<div class="line"><a name="l07935"></a><span class="lineno"> 7935</span>&#160;        <span class="keywordtype">bool</span> map,</div>
-<div class="line"><a name="l07936"></a><span class="lineno"> 7936</span>&#160;        <span class="keywordtype">bool</span> isUserDataString,</div>
-<div class="line"><a name="l07937"></a><span class="lineno"> 7937</span>&#160;        <span class="keywordtype">void</span>* pUserData,</div>
-<div class="line"><a name="l07938"></a><span class="lineno"> 7938</span>&#160;        VkBuffer dedicatedBuffer,</div>
-<div class="line"><a name="l07939"></a><span class="lineno"> 7939</span>&#160;        VkBufferUsageFlags dedicatedBufferUsage,</div>
-<div class="line"><a name="l07940"></a><span class="lineno"> 7940</span>&#160;        VkImage dedicatedImage,</div>
-<div class="line"><a name="l07941"></a><span class="lineno"> 7941</span>&#160;        <span class="keywordtype">size_t</span> allocationCount,</div>
-<div class="line"><a name="l07942"></a><span class="lineno"> 7942</span>&#160;        <a class="code" href="struct_vma_allocation.html">VmaAllocation</a>* pAllocations);</div>
+<div class="line"><a name="l07918"></a><span class="lineno"> 7918</span>&#160;    <span class="keywordtype">void</span> AddPools(uint32_t poolCount, <span class="keyword">const</span> <a class="code" href="struct_vma_pool.html">VmaPool</a>* pPools);</div>
+<div class="line"><a name="l07919"></a><span class="lineno"> 7919</span>&#160;    <span class="keywordtype">void</span> AddAllocations(</div>
+<div class="line"><a name="l07920"></a><span class="lineno"> 7920</span>&#160;        uint32_t allocationCount,</div>
+<div class="line"><a name="l07921"></a><span class="lineno"> 7921</span>&#160;        <span class="keyword">const</span> <a class="code" href="struct_vma_allocation.html">VmaAllocation</a>* pAllocations,</div>
+<div class="line"><a name="l07922"></a><span class="lineno"> 7922</span>&#160;        VkBool32* pAllocationsChanged);</div>
+<div class="line"><a name="l07923"></a><span class="lineno"> 7923</span>&#160; </div>
+<div class="line"><a name="l07924"></a><span class="lineno"> 7924</span>&#160;    <span class="comment">/*</span></div>
+<div class="line"><a name="l07925"></a><span class="lineno"> 7925</span>&#160;<span class="comment">    Returns:</span></div>
+<div class="line"><a name="l07926"></a><span class="lineno"> 7926</span>&#160;<span class="comment">    - `VK_SUCCESS` if succeeded and object can be destroyed immediately.</span></div>
+<div class="line"><a name="l07927"></a><span class="lineno"> 7927</span>&#160;<span class="comment">    - `VK_NOT_READY` if succeeded but the object must remain alive until vmaDefragmentationEnd().</span></div>
+<div class="line"><a name="l07928"></a><span class="lineno"> 7928</span>&#160;<span class="comment">    - Negative value if error occurred and object can be destroyed immediately.</span></div>
+<div class="line"><a name="l07929"></a><span class="lineno"> 7929</span>&#160;<span class="comment">    */</span></div>
+<div class="line"><a name="l07930"></a><span class="lineno"> 7930</span>&#160;    VkResult Defragment(</div>
+<div class="line"><a name="l07931"></a><span class="lineno"> 7931</span>&#160;        VkDeviceSize maxCpuBytesToMove, uint32_t maxCpuAllocationsToMove,</div>
+<div class="line"><a name="l07932"></a><span class="lineno"> 7932</span>&#160;        VkDeviceSize maxGpuBytesToMove, uint32_t maxGpuAllocationsToMove,</div>
+<div class="line"><a name="l07933"></a><span class="lineno"> 7933</span>&#160;        VkCommandBuffer commandBuffer, <a class="code" href="struct_vma_defragmentation_stats.html">VmaDefragmentationStats</a>* pStats, <a class="code" href="vk__mem__alloc_8h.html#a88a77cef37e5d3c4fc9eb328885d048d">VmaDefragmentationFlags</a> flags);</div>
+<div class="line"><a name="l07934"></a><span class="lineno"> 7934</span>&#160; </div>
+<div class="line"><a name="l07935"></a><span class="lineno"> 7935</span>&#160;    VkResult DefragmentPassBegin(<a class="code" href="struct_vma_defragmentation_pass_info.html">VmaDefragmentationPassInfo</a>* pInfo);</div>
+<div class="line"><a name="l07936"></a><span class="lineno"> 7936</span>&#160;    VkResult DefragmentPassEnd();</div>
+<div class="line"><a name="l07937"></a><span class="lineno"> 7937</span>&#160; </div>
+<div class="line"><a name="l07938"></a><span class="lineno"> 7938</span>&#160;<span class="keyword">private</span>:</div>
+<div class="line"><a name="l07939"></a><span class="lineno"> 7939</span>&#160;    <span class="keyword">const</span> <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> m_hAllocator;</div>
+<div class="line"><a name="l07940"></a><span class="lineno"> 7940</span>&#160;    <span class="keyword">const</span> uint32_t m_CurrFrameIndex;</div>
+<div class="line"><a name="l07941"></a><span class="lineno"> 7941</span>&#160;    <span class="keyword">const</span> uint32_t m_Flags;</div>
+<div class="line"><a name="l07942"></a><span class="lineno"> 7942</span>&#160;    <a class="code" href="struct_vma_defragmentation_stats.html">VmaDefragmentationStats</a>* <span class="keyword">const</span> m_pStats;</div>
 <div class="line"><a name="l07943"></a><span class="lineno"> 7943</span>&#160; </div>
-<div class="line"><a name="l07944"></a><span class="lineno"> 7944</span>&#160;    <span class="keywordtype">void</span> FreeDedicatedMemory(<span class="keyword">const</span> <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation);</div>
-<div class="line"><a name="l07945"></a><span class="lineno"> 7945</span>&#160; </div>
-<div class="line"><a name="l07946"></a><span class="lineno"> 7946</span>&#160;    <span class="comment">/*</span></div>
-<div class="line"><a name="l07947"></a><span class="lineno"> 7947</span>&#160;<span class="comment">    Calculates and returns bit mask of memory types that can support defragmentation</span></div>
-<div class="line"><a name="l07948"></a><span class="lineno"> 7948</span>&#160;<span class="comment">    on GPU as they support creation of required buffer for copy operations.</span></div>
-<div class="line"><a name="l07949"></a><span class="lineno"> 7949</span>&#160;<span class="comment">    */</span></div>
-<div class="line"><a name="l07950"></a><span class="lineno"> 7950</span>&#160;    uint32_t CalculateGpuDefragmentationMemoryTypeBits() <span class="keyword">const</span>;</div>
-<div class="line"><a name="l07951"></a><span class="lineno"> 7951</span>&#160; </div>
-<div class="line"><a name="l07952"></a><span class="lineno"> 7952</span>&#160;    uint32_t CalculateGlobalMemoryTypeBits() <span class="keyword">const</span>;</div>
-<div class="line"><a name="l07953"></a><span class="lineno"> 7953</span>&#160; </div>
-<div class="line"><a name="l07954"></a><span class="lineno"> 7954</span>&#160;    <span class="keywordtype">bool</span> GetFlushOrInvalidateRange(</div>
-<div class="line"><a name="l07955"></a><span class="lineno"> 7955</span>&#160;        <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation,</div>
-<div class="line"><a name="l07956"></a><span class="lineno"> 7956</span>&#160;        VkDeviceSize offset, VkDeviceSize size,</div>
-<div class="line"><a name="l07957"></a><span class="lineno"> 7957</span>&#160;        VkMappedMemoryRange&amp; outRange) <span class="keyword">const</span>;</div>
-<div class="line"><a name="l07958"></a><span class="lineno"> 7958</span>&#160; </div>
-<div class="line"><a name="l07959"></a><span class="lineno"> 7959</span>&#160;<span class="preprocessor">#if VMA_MEMORY_BUDGET</span></div>
-<div class="line"><a name="l07960"></a><span class="lineno"> 7960</span>&#160;    <span class="keywordtype">void</span> UpdateVulkanBudget();</div>
-<div class="line"><a name="l07961"></a><span class="lineno"> 7961</span>&#160;<span class="preprocessor">#endif // #if VMA_MEMORY_BUDGET</span></div>
-<div class="line"><a name="l07962"></a><span class="lineno"> 7962</span>&#160;};</div>
-<div class="line"><a name="l07963"></a><span class="lineno"> 7963</span>&#160; </div>
-<div class="line"><a name="l07965"></a><span class="lineno"> 7965</span>&#160;<span class="comment">// Memory allocation #2 after VmaAllocator_T definition</span></div>
-<div class="line"><a name="l07966"></a><span class="lineno"> 7966</span>&#160; </div>
-<div class="line"><a name="l07967"></a><span class="lineno"> 7967</span>&#160;<span class="keyword">static</span> <span class="keywordtype">void</span>* VmaMalloc(<a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator, <span class="keywordtype">size_t</span> size, <span class="keywordtype">size_t</span> alignment)</div>
-<div class="line"><a name="l07968"></a><span class="lineno"> 7968</span>&#160;{</div>
-<div class="line"><a name="l07969"></a><span class="lineno"> 7969</span>&#160;    <span class="keywordflow">return</span> VmaMalloc(&amp;hAllocator-&gt;m_AllocationCallbacks, size, alignment);</div>
-<div class="line"><a name="l07970"></a><span class="lineno"> 7970</span>&#160;}</div>
+<div class="line"><a name="l07944"></a><span class="lineno"> 7944</span>&#160;    VkDeviceSize m_MaxCpuBytesToMove;</div>
+<div class="line"><a name="l07945"></a><span class="lineno"> 7945</span>&#160;    uint32_t m_MaxCpuAllocationsToMove;</div>
+<div class="line"><a name="l07946"></a><span class="lineno"> 7946</span>&#160;    VkDeviceSize m_MaxGpuBytesToMove;</div>
+<div class="line"><a name="l07947"></a><span class="lineno"> 7947</span>&#160;    uint32_t m_MaxGpuAllocationsToMove;</div>
+<div class="line"><a name="l07948"></a><span class="lineno"> 7948</span>&#160; </div>
+<div class="line"><a name="l07949"></a><span class="lineno"> 7949</span>&#160;    <span class="comment">// Owner of these objects.</span></div>
+<div class="line"><a name="l07950"></a><span class="lineno"> 7950</span>&#160;    VmaBlockVectorDefragmentationContext* m_DefaultPoolContexts[VK_MAX_MEMORY_TYPES];</div>
+<div class="line"><a name="l07951"></a><span class="lineno"> 7951</span>&#160;    <span class="comment">// Owner of these objects.</span></div>
+<div class="line"><a name="l07952"></a><span class="lineno"> 7952</span>&#160;    VmaVector&lt; VmaBlockVectorDefragmentationContext*, VmaStlAllocator&lt;VmaBlockVectorDefragmentationContext*&gt; &gt; m_CustomPoolContexts;</div>
+<div class="line"><a name="l07953"></a><span class="lineno"> 7953</span>&#160;};</div>
+<div class="line"><a name="l07954"></a><span class="lineno"> 7954</span>&#160; </div>
+<div class="line"><a name="l07955"></a><span class="lineno"> 7955</span>&#160;<span class="preprocessor">#if VMA_RECORDING_ENABLED</span></div>
+<div class="line"><a name="l07956"></a><span class="lineno"> 7956</span>&#160; </div>
+<div class="line"><a name="l07957"></a><span class="lineno"> 7957</span>&#160;<span class="keyword">class </span>VmaRecorder</div>
+<div class="line"><a name="l07958"></a><span class="lineno"> 7958</span>&#160;{</div>
+<div class="line"><a name="l07959"></a><span class="lineno"> 7959</span>&#160;<span class="keyword">public</span>:</div>
+<div class="line"><a name="l07960"></a><span class="lineno"> 7960</span>&#160;    VmaRecorder();</div>
+<div class="line"><a name="l07961"></a><span class="lineno"> 7961</span>&#160;    VkResult Init(<span class="keyword">const</span> <a class="code" href="struct_vma_record_settings.html">VmaRecordSettings</a>&amp; settings, <span class="keywordtype">bool</span> useMutex);</div>
+<div class="line"><a name="l07962"></a><span class="lineno"> 7962</span>&#160;    <span class="keywordtype">void</span> WriteConfiguration(</div>
+<div class="line"><a name="l07963"></a><span class="lineno"> 7963</span>&#160;        <span class="keyword">const</span> VkPhysicalDeviceProperties&amp; devProps,</div>
+<div class="line"><a name="l07964"></a><span class="lineno"> 7964</span>&#160;        <span class="keyword">const</span> VkPhysicalDeviceMemoryProperties&amp; memProps,</div>
+<div class="line"><a name="l07965"></a><span class="lineno"> 7965</span>&#160;        uint32_t vulkanApiVersion,</div>
+<div class="line"><a name="l07966"></a><span class="lineno"> 7966</span>&#160;        <span class="keywordtype">bool</span> dedicatedAllocationExtensionEnabled,</div>
+<div class="line"><a name="l07967"></a><span class="lineno"> 7967</span>&#160;        <span class="keywordtype">bool</span> bindMemory2ExtensionEnabled,</div>
+<div class="line"><a name="l07968"></a><span class="lineno"> 7968</span>&#160;        <span class="keywordtype">bool</span> memoryBudgetExtensionEnabled,</div>
+<div class="line"><a name="l07969"></a><span class="lineno"> 7969</span>&#160;        <span class="keywordtype">bool</span> deviceCoherentMemoryExtensionEnabled);</div>
+<div class="line"><a name="l07970"></a><span class="lineno"> 7970</span>&#160;    ~VmaRecorder();</div>
 <div class="line"><a name="l07971"></a><span class="lineno"> 7971</span>&#160; </div>
-<div class="line"><a name="l07972"></a><span class="lineno"> 7972</span>&#160;<span class="keyword">static</span> <span class="keywordtype">void</span> VmaFree(<a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator, <span class="keywordtype">void</span>* ptr)</div>
-<div class="line"><a name="l07973"></a><span class="lineno"> 7973</span>&#160;{</div>
-<div class="line"><a name="l07974"></a><span class="lineno"> 7974</span>&#160;    VmaFree(&amp;hAllocator-&gt;m_AllocationCallbacks, ptr);</div>
-<div class="line"><a name="l07975"></a><span class="lineno"> 7975</span>&#160;}</div>
-<div class="line"><a name="l07976"></a><span class="lineno"> 7976</span>&#160; </div>
-<div class="line"><a name="l07977"></a><span class="lineno"> 7977</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt;</div>
-<div class="line"><a name="l07978"></a><span class="lineno"> 7978</span>&#160;<span class="keyword">static</span> T* VmaAllocate(<a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator)</div>
-<div class="line"><a name="l07979"></a><span class="lineno"> 7979</span>&#160;{</div>
-<div class="line"><a name="l07980"></a><span class="lineno"> 7980</span>&#160;    <span class="keywordflow">return</span> (T*)VmaMalloc(hAllocator, <span class="keyword">sizeof</span>(T), VMA_ALIGN_OF(T));</div>
-<div class="line"><a name="l07981"></a><span class="lineno"> 7981</span>&#160;}</div>
-<div class="line"><a name="l07982"></a><span class="lineno"> 7982</span>&#160; </div>
-<div class="line"><a name="l07983"></a><span class="lineno"> 7983</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt;</div>
-<div class="line"><a name="l07984"></a><span class="lineno"> 7984</span>&#160;<span class="keyword">static</span> T* VmaAllocateArray(<a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator, <span class="keywordtype">size_t</span> count)</div>
-<div class="line"><a name="l07985"></a><span class="lineno"> 7985</span>&#160;{</div>
-<div class="line"><a name="l07986"></a><span class="lineno"> 7986</span>&#160;    <span class="keywordflow">return</span> (T*)VmaMalloc(hAllocator, <span class="keyword">sizeof</span>(T) * count, VMA_ALIGN_OF(T));</div>
-<div class="line"><a name="l07987"></a><span class="lineno"> 7987</span>&#160;}</div>
-<div class="line"><a name="l07988"></a><span class="lineno"> 7988</span>&#160; </div>
-<div class="line"><a name="l07989"></a><span class="lineno"> 7989</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt;</div>
-<div class="line"><a name="l07990"></a><span class="lineno"> 7990</span>&#160;<span class="keyword">static</span> <span class="keywordtype">void</span> vma_delete(<a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator, T* ptr)</div>
-<div class="line"><a name="l07991"></a><span class="lineno"> 7991</span>&#160;{</div>
-<div class="line"><a name="l07992"></a><span class="lineno"> 7992</span>&#160;    <span class="keywordflow">if</span>(ptr != VMA_NULL)</div>
-<div class="line"><a name="l07993"></a><span class="lineno"> 7993</span>&#160;    {</div>
-<div class="line"><a name="l07994"></a><span class="lineno"> 7994</span>&#160;        ptr-&gt;~T();</div>
-<div class="line"><a name="l07995"></a><span class="lineno"> 7995</span>&#160;        VmaFree(hAllocator, ptr);</div>
-<div class="line"><a name="l07996"></a><span class="lineno"> 7996</span>&#160;    }</div>
-<div class="line"><a name="l07997"></a><span class="lineno"> 7997</span>&#160;}</div>
-<div class="line"><a name="l07998"></a><span class="lineno"> 7998</span>&#160; </div>
-<div class="line"><a name="l07999"></a><span class="lineno"> 7999</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt;</div>
-<div class="line"><a name="l08000"></a><span class="lineno"> 8000</span>&#160;<span class="keyword">static</span> <span class="keywordtype">void</span> vma_delete_array(<a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator, T* ptr, <span class="keywordtype">size_t</span> count)</div>
-<div class="line"><a name="l08001"></a><span class="lineno"> 8001</span>&#160;{</div>
-<div class="line"><a name="l08002"></a><span class="lineno"> 8002</span>&#160;    <span class="keywordflow">if</span>(ptr != VMA_NULL)</div>
-<div class="line"><a name="l08003"></a><span class="lineno"> 8003</span>&#160;    {</div>
-<div class="line"><a name="l08004"></a><span class="lineno"> 8004</span>&#160;        <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> i = count; i--; )</div>
-<div class="line"><a name="l08005"></a><span class="lineno"> 8005</span>&#160;            ptr[i].~T();</div>
-<div class="line"><a name="l08006"></a><span class="lineno"> 8006</span>&#160;        VmaFree(hAllocator, ptr);</div>
-<div class="line"><a name="l08007"></a><span class="lineno"> 8007</span>&#160;    }</div>
-<div class="line"><a name="l08008"></a><span class="lineno"> 8008</span>&#160;}</div>
-<div class="line"><a name="l08009"></a><span class="lineno"> 8009</span>&#160; </div>
-<div class="line"><a name="l08011"></a><span class="lineno"> 8011</span>&#160;<span class="comment">// VmaStringBuilder</span></div>
-<div class="line"><a name="l08012"></a><span class="lineno"> 8012</span>&#160; </div>
-<div class="line"><a name="l08013"></a><span class="lineno"> 8013</span>&#160;<span class="preprocessor">#if VMA_STATS_STRING_ENABLED</span></div>
-<div class="line"><a name="l08014"></a><span class="lineno"> 8014</span>&#160; </div>
-<div class="line"><a name="l08015"></a><span class="lineno"> 8015</span>&#160;<span class="keyword">class </span>VmaStringBuilder</div>
-<div class="line"><a name="l08016"></a><span class="lineno"> 8016</span>&#160;{</div>
-<div class="line"><a name="l08017"></a><span class="lineno"> 8017</span>&#160;<span class="keyword">public</span>:</div>
-<div class="line"><a name="l08018"></a><span class="lineno"> 8018</span>&#160;    VmaStringBuilder(<a class="code" href="struct_vma_allocator.html">VmaAllocator</a> alloc) : m_Data(VmaStlAllocator&lt;char&gt;(alloc-&gt;GetAllocationCallbacks())) { }</div>
-<div class="line"><a name="l08019"></a><span class="lineno"> 8019</span>&#160;    <span class="keywordtype">size_t</span> GetLength()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_Data.size(); }</div>
-<div class="line"><a name="l08020"></a><span class="lineno"> 8020</span>&#160;    <span class="keyword">const</span> <span class="keywordtype">char</span>* GetData()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_Data.data(); }</div>
-<div class="line"><a name="l08021"></a><span class="lineno"> 8021</span>&#160; </div>
-<div class="line"><a name="l08022"></a><span class="lineno"> 8022</span>&#160;    <span class="keywordtype">void</span> Add(<span class="keywordtype">char</span> ch) { m_Data.push_back(ch); }</div>
-<div class="line"><a name="l08023"></a><span class="lineno"> 8023</span>&#160;    <span class="keywordtype">void</span> Add(<span class="keyword">const</span> <span class="keywordtype">char</span>* pStr);</div>
-<div class="line"><a name="l08024"></a><span class="lineno"> 8024</span>&#160;    <span class="keywordtype">void</span> AddNewLine() { Add(<span class="charliteral">&#39;\n&#39;</span>); }</div>
-<div class="line"><a name="l08025"></a><span class="lineno"> 8025</span>&#160;    <span class="keywordtype">void</span> AddNumber(uint32_t num);</div>
-<div class="line"><a name="l08026"></a><span class="lineno"> 8026</span>&#160;    <span class="keywordtype">void</span> AddNumber(uint64_t num);</div>
-<div class="line"><a name="l08027"></a><span class="lineno"> 8027</span>&#160;    <span class="keywordtype">void</span> AddPointer(<span class="keyword">const</span> <span class="keywordtype">void</span>* ptr);</div>
-<div class="line"><a name="l08028"></a><span class="lineno"> 8028</span>&#160; </div>
-<div class="line"><a name="l08029"></a><span class="lineno"> 8029</span>&#160;<span class="keyword">private</span>:</div>
-<div class="line"><a name="l08030"></a><span class="lineno"> 8030</span>&#160;    VmaVector&lt; char, VmaStlAllocator&lt;char&gt; &gt; m_Data;</div>
-<div class="line"><a name="l08031"></a><span class="lineno"> 8031</span>&#160;};</div>
-<div class="line"><a name="l08032"></a><span class="lineno"> 8032</span>&#160; </div>
-<div class="line"><a name="l08033"></a><span class="lineno"> 8033</span>&#160;<span class="keywordtype">void</span> VmaStringBuilder::Add(<span class="keyword">const</span> <span class="keywordtype">char</span>* pStr)</div>
-<div class="line"><a name="l08034"></a><span class="lineno"> 8034</span>&#160;{</div>
-<div class="line"><a name="l08035"></a><span class="lineno"> 8035</span>&#160;    <span class="keyword">const</span> <span class="keywordtype">size_t</span> strLen = strlen(pStr);</div>
-<div class="line"><a name="l08036"></a><span class="lineno"> 8036</span>&#160;    <span class="keywordflow">if</span>(strLen &gt; 0)</div>
-<div class="line"><a name="l08037"></a><span class="lineno"> 8037</span>&#160;    {</div>
-<div class="line"><a name="l08038"></a><span class="lineno"> 8038</span>&#160;        <span class="keyword">const</span> <span class="keywordtype">size_t</span> oldCount = m_Data.size();</div>
-<div class="line"><a name="l08039"></a><span class="lineno"> 8039</span>&#160;        m_Data.resize(oldCount + strLen);</div>
-<div class="line"><a name="l08040"></a><span class="lineno"> 8040</span>&#160;        memcpy(m_Data.data() + oldCount, pStr, strLen);</div>
-<div class="line"><a name="l08041"></a><span class="lineno"> 8041</span>&#160;    }</div>
-<div class="line"><a name="l08042"></a><span class="lineno"> 8042</span>&#160;}</div>
+<div class="line"><a name="l07972"></a><span class="lineno"> 7972</span>&#160;    <span class="keywordtype">void</span> RecordCreateAllocator(uint32_t frameIndex);</div>
+<div class="line"><a name="l07973"></a><span class="lineno"> 7973</span>&#160;    <span class="keywordtype">void</span> RecordDestroyAllocator(uint32_t frameIndex);</div>
+<div class="line"><a name="l07974"></a><span class="lineno"> 7974</span>&#160;    <span class="keywordtype">void</span> RecordCreatePool(uint32_t frameIndex,</div>
+<div class="line"><a name="l07975"></a><span class="lineno"> 7975</span>&#160;        <span class="keyword">const</span> <a class="code" href="struct_vma_pool_create_info.html">VmaPoolCreateInfo</a>&amp; createInfo,</div>
+<div class="line"><a name="l07976"></a><span class="lineno"> 7976</span>&#160;        <a class="code" href="struct_vma_pool.html">VmaPool</a> pool);</div>
+<div class="line"><a name="l07977"></a><span class="lineno"> 7977</span>&#160;    <span class="keywordtype">void</span> RecordDestroyPool(uint32_t frameIndex, <a class="code" href="struct_vma_pool.html">VmaPool</a> pool);</div>
+<div class="line"><a name="l07978"></a><span class="lineno"> 7978</span>&#160;    <span class="keywordtype">void</span> RecordAllocateMemory(uint32_t frameIndex,</div>
+<div class="line"><a name="l07979"></a><span class="lineno"> 7979</span>&#160;        <span class="keyword">const</span> VkMemoryRequirements&amp; vkMemReq,</div>
+<div class="line"><a name="l07980"></a><span class="lineno"> 7980</span>&#160;        <span class="keyword">const</span> <a class="code" href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a>&amp; createInfo,</div>
+<div class="line"><a name="l07981"></a><span class="lineno"> 7981</span>&#160;        <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation);</div>
+<div class="line"><a name="l07982"></a><span class="lineno"> 7982</span>&#160;    <span class="keywordtype">void</span> RecordAllocateMemoryPages(uint32_t frameIndex,</div>
+<div class="line"><a name="l07983"></a><span class="lineno"> 7983</span>&#160;        <span class="keyword">const</span> VkMemoryRequirements&amp; vkMemReq,</div>
+<div class="line"><a name="l07984"></a><span class="lineno"> 7984</span>&#160;        <span class="keyword">const</span> <a class="code" href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a>&amp; createInfo,</div>
+<div class="line"><a name="l07985"></a><span class="lineno"> 7985</span>&#160;        uint64_t allocationCount,</div>
+<div class="line"><a name="l07986"></a><span class="lineno"> 7986</span>&#160;        <span class="keyword">const</span> <a class="code" href="struct_vma_allocation.html">VmaAllocation</a>* pAllocations);</div>
+<div class="line"><a name="l07987"></a><span class="lineno"> 7987</span>&#160;    <span class="keywordtype">void</span> RecordAllocateMemoryForBuffer(uint32_t frameIndex,</div>
+<div class="line"><a name="l07988"></a><span class="lineno"> 7988</span>&#160;        <span class="keyword">const</span> VkMemoryRequirements&amp; vkMemReq,</div>
+<div class="line"><a name="l07989"></a><span class="lineno"> 7989</span>&#160;        <span class="keywordtype">bool</span> requiresDedicatedAllocation,</div>
+<div class="line"><a name="l07990"></a><span class="lineno"> 7990</span>&#160;        <span class="keywordtype">bool</span> prefersDedicatedAllocation,</div>
+<div class="line"><a name="l07991"></a><span class="lineno"> 7991</span>&#160;        <span class="keyword">const</span> <a class="code" href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a>&amp; createInfo,</div>
+<div class="line"><a name="l07992"></a><span class="lineno"> 7992</span>&#160;        <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation);</div>
+<div class="line"><a name="l07993"></a><span class="lineno"> 7993</span>&#160;    <span class="keywordtype">void</span> RecordAllocateMemoryForImage(uint32_t frameIndex,</div>
+<div class="line"><a name="l07994"></a><span class="lineno"> 7994</span>&#160;        <span class="keyword">const</span> VkMemoryRequirements&amp; vkMemReq,</div>
+<div class="line"><a name="l07995"></a><span class="lineno"> 7995</span>&#160;        <span class="keywordtype">bool</span> requiresDedicatedAllocation,</div>
+<div class="line"><a name="l07996"></a><span class="lineno"> 7996</span>&#160;        <span class="keywordtype">bool</span> prefersDedicatedAllocation,</div>
+<div class="line"><a name="l07997"></a><span class="lineno"> 7997</span>&#160;        <span class="keyword">const</span> <a class="code" href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a>&amp; createInfo,</div>
+<div class="line"><a name="l07998"></a><span class="lineno"> 7998</span>&#160;        <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation);</div>
+<div class="line"><a name="l07999"></a><span class="lineno"> 7999</span>&#160;    <span class="keywordtype">void</span> RecordFreeMemory(uint32_t frameIndex,</div>
+<div class="line"><a name="l08000"></a><span class="lineno"> 8000</span>&#160;        <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation);</div>
+<div class="line"><a name="l08001"></a><span class="lineno"> 8001</span>&#160;    <span class="keywordtype">void</span> RecordFreeMemoryPages(uint32_t frameIndex,</div>
+<div class="line"><a name="l08002"></a><span class="lineno"> 8002</span>&#160;        uint64_t allocationCount,</div>
+<div class="line"><a name="l08003"></a><span class="lineno"> 8003</span>&#160;        <span class="keyword">const</span> <a class="code" href="struct_vma_allocation.html">VmaAllocation</a>* pAllocations);</div>
+<div class="line"><a name="l08004"></a><span class="lineno"> 8004</span>&#160;    <span class="keywordtype">void</span> RecordSetAllocationUserData(uint32_t frameIndex,</div>
+<div class="line"><a name="l08005"></a><span class="lineno"> 8005</span>&#160;        <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation,</div>
+<div class="line"><a name="l08006"></a><span class="lineno"> 8006</span>&#160;        <span class="keyword">const</span> <span class="keywordtype">void</span>* pUserData);</div>
+<div class="line"><a name="l08007"></a><span class="lineno"> 8007</span>&#160;    <span class="keywordtype">void</span> RecordCreateLostAllocation(uint32_t frameIndex,</div>
+<div class="line"><a name="l08008"></a><span class="lineno"> 8008</span>&#160;        <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation);</div>
+<div class="line"><a name="l08009"></a><span class="lineno"> 8009</span>&#160;    <span class="keywordtype">void</span> RecordMapMemory(uint32_t frameIndex,</div>
+<div class="line"><a name="l08010"></a><span class="lineno"> 8010</span>&#160;        <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation);</div>
+<div class="line"><a name="l08011"></a><span class="lineno"> 8011</span>&#160;    <span class="keywordtype">void</span> RecordUnmapMemory(uint32_t frameIndex,</div>
+<div class="line"><a name="l08012"></a><span class="lineno"> 8012</span>&#160;        <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation);</div>
+<div class="line"><a name="l08013"></a><span class="lineno"> 8013</span>&#160;    <span class="keywordtype">void</span> RecordFlushAllocation(uint32_t frameIndex,</div>
+<div class="line"><a name="l08014"></a><span class="lineno"> 8014</span>&#160;        <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation, VkDeviceSize offset, VkDeviceSize size);</div>
+<div class="line"><a name="l08015"></a><span class="lineno"> 8015</span>&#160;    <span class="keywordtype">void</span> RecordInvalidateAllocation(uint32_t frameIndex,</div>
+<div class="line"><a name="l08016"></a><span class="lineno"> 8016</span>&#160;        <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation, VkDeviceSize offset, VkDeviceSize size);</div>
+<div class="line"><a name="l08017"></a><span class="lineno"> 8017</span>&#160;    <span class="keywordtype">void</span> RecordCreateBuffer(uint32_t frameIndex,</div>
+<div class="line"><a name="l08018"></a><span class="lineno"> 8018</span>&#160;        <span class="keyword">const</span> VkBufferCreateInfo&amp; bufCreateInfo,</div>
+<div class="line"><a name="l08019"></a><span class="lineno"> 8019</span>&#160;        <span class="keyword">const</span> <a class="code" href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a>&amp; allocCreateInfo,</div>
+<div class="line"><a name="l08020"></a><span class="lineno"> 8020</span>&#160;        <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation);</div>
+<div class="line"><a name="l08021"></a><span class="lineno"> 8021</span>&#160;    <span class="keywordtype">void</span> RecordCreateImage(uint32_t frameIndex,</div>
+<div class="line"><a name="l08022"></a><span class="lineno"> 8022</span>&#160;        <span class="keyword">const</span> VkImageCreateInfo&amp; imageCreateInfo,</div>
+<div class="line"><a name="l08023"></a><span class="lineno"> 8023</span>&#160;        <span class="keyword">const</span> <a class="code" href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a>&amp; allocCreateInfo,</div>
+<div class="line"><a name="l08024"></a><span class="lineno"> 8024</span>&#160;        <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation);</div>
+<div class="line"><a name="l08025"></a><span class="lineno"> 8025</span>&#160;    <span class="keywordtype">void</span> RecordDestroyBuffer(uint32_t frameIndex,</div>
+<div class="line"><a name="l08026"></a><span class="lineno"> 8026</span>&#160;        <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation);</div>
+<div class="line"><a name="l08027"></a><span class="lineno"> 8027</span>&#160;    <span class="keywordtype">void</span> RecordDestroyImage(uint32_t frameIndex,</div>
+<div class="line"><a name="l08028"></a><span class="lineno"> 8028</span>&#160;        <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation);</div>
+<div class="line"><a name="l08029"></a><span class="lineno"> 8029</span>&#160;    <span class="keywordtype">void</span> RecordTouchAllocation(uint32_t frameIndex,</div>
+<div class="line"><a name="l08030"></a><span class="lineno"> 8030</span>&#160;        <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation);</div>
+<div class="line"><a name="l08031"></a><span class="lineno"> 8031</span>&#160;    <span class="keywordtype">void</span> RecordGetAllocationInfo(uint32_t frameIndex,</div>
+<div class="line"><a name="l08032"></a><span class="lineno"> 8032</span>&#160;        <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation);</div>
+<div class="line"><a name="l08033"></a><span class="lineno"> 8033</span>&#160;    <span class="keywordtype">void</span> RecordMakePoolAllocationsLost(uint32_t frameIndex,</div>
+<div class="line"><a name="l08034"></a><span class="lineno"> 8034</span>&#160;        <a class="code" href="struct_vma_pool.html">VmaPool</a> pool);</div>
+<div class="line"><a name="l08035"></a><span class="lineno"> 8035</span>&#160;    <span class="keywordtype">void</span> RecordDefragmentationBegin(uint32_t frameIndex,</div>
+<div class="line"><a name="l08036"></a><span class="lineno"> 8036</span>&#160;        <span class="keyword">const</span> <a class="code" href="struct_vma_defragmentation_info2.html">VmaDefragmentationInfo2</a>&amp; info,</div>
+<div class="line"><a name="l08037"></a><span class="lineno"> 8037</span>&#160;        <a class="code" href="struct_vma_defragmentation_context.html">VmaDefragmentationContext</a> ctx);</div>
+<div class="line"><a name="l08038"></a><span class="lineno"> 8038</span>&#160;    <span class="keywordtype">void</span> RecordDefragmentationEnd(uint32_t frameIndex,</div>
+<div class="line"><a name="l08039"></a><span class="lineno"> 8039</span>&#160;        <a class="code" href="struct_vma_defragmentation_context.html">VmaDefragmentationContext</a> ctx);</div>
+<div class="line"><a name="l08040"></a><span class="lineno"> 8040</span>&#160;    <span class="keywordtype">void</span> RecordSetPoolName(uint32_t frameIndex,</div>
+<div class="line"><a name="l08041"></a><span class="lineno"> 8041</span>&#160;        <a class="code" href="struct_vma_pool.html">VmaPool</a> pool,</div>
+<div class="line"><a name="l08042"></a><span class="lineno"> 8042</span>&#160;        <span class="keyword">const</span> <span class="keywordtype">char</span>* name);</div>
 <div class="line"><a name="l08043"></a><span class="lineno"> 8043</span>&#160; </div>
-<div class="line"><a name="l08044"></a><span class="lineno"> 8044</span>&#160;<span class="keywordtype">void</span> VmaStringBuilder::AddNumber(uint32_t num)</div>
-<div class="line"><a name="l08045"></a><span class="lineno"> 8045</span>&#160;{</div>
-<div class="line"><a name="l08046"></a><span class="lineno"> 8046</span>&#160;    <span class="keywordtype">char</span> buf[11];</div>
-<div class="line"><a name="l08047"></a><span class="lineno"> 8047</span>&#160;    buf[10] = <span class="charliteral">&#39;\0&#39;</span>;</div>
-<div class="line"><a name="l08048"></a><span class="lineno"> 8048</span>&#160;    <span class="keywordtype">char</span> *p = &amp;buf[10];</div>
-<div class="line"><a name="l08049"></a><span class="lineno"> 8049</span>&#160;    <span class="keywordflow">do</span></div>
-<div class="line"><a name="l08050"></a><span class="lineno"> 8050</span>&#160;    {</div>
-<div class="line"><a name="l08051"></a><span class="lineno"> 8051</span>&#160;        *--p = <span class="charliteral">&#39;0&#39;</span> + (num % 10);</div>
-<div class="line"><a name="l08052"></a><span class="lineno"> 8052</span>&#160;        num /= 10;</div>
-<div class="line"><a name="l08053"></a><span class="lineno"> 8053</span>&#160;    }</div>
-<div class="line"><a name="l08054"></a><span class="lineno"> 8054</span>&#160;    <span class="keywordflow">while</span>(num);</div>
-<div class="line"><a name="l08055"></a><span class="lineno"> 8055</span>&#160;    Add(p);</div>
-<div class="line"><a name="l08056"></a><span class="lineno"> 8056</span>&#160;}</div>
-<div class="line"><a name="l08057"></a><span class="lineno"> 8057</span>&#160; </div>
-<div class="line"><a name="l08058"></a><span class="lineno"> 8058</span>&#160;<span class="keywordtype">void</span> VmaStringBuilder::AddNumber(uint64_t num)</div>
-<div class="line"><a name="l08059"></a><span class="lineno"> 8059</span>&#160;{</div>
-<div class="line"><a name="l08060"></a><span class="lineno"> 8060</span>&#160;    <span class="keywordtype">char</span> buf[21];</div>
-<div class="line"><a name="l08061"></a><span class="lineno"> 8061</span>&#160;    buf[20] = <span class="charliteral">&#39;\0&#39;</span>;</div>
-<div class="line"><a name="l08062"></a><span class="lineno"> 8062</span>&#160;    <span class="keywordtype">char</span> *p = &amp;buf[20];</div>
-<div class="line"><a name="l08063"></a><span class="lineno"> 8063</span>&#160;    <span class="keywordflow">do</span></div>
-<div class="line"><a name="l08064"></a><span class="lineno"> 8064</span>&#160;    {</div>
-<div class="line"><a name="l08065"></a><span class="lineno"> 8065</span>&#160;        *--p = <span class="charliteral">&#39;0&#39;</span> + (num % 10);</div>
-<div class="line"><a name="l08066"></a><span class="lineno"> 8066</span>&#160;        num /= 10;</div>
-<div class="line"><a name="l08067"></a><span class="lineno"> 8067</span>&#160;    }</div>
-<div class="line"><a name="l08068"></a><span class="lineno"> 8068</span>&#160;    <span class="keywordflow">while</span>(num);</div>
-<div class="line"><a name="l08069"></a><span class="lineno"> 8069</span>&#160;    Add(p);</div>
-<div class="line"><a name="l08070"></a><span class="lineno"> 8070</span>&#160;}</div>
-<div class="line"><a name="l08071"></a><span class="lineno"> 8071</span>&#160; </div>
-<div class="line"><a name="l08072"></a><span class="lineno"> 8072</span>&#160;<span class="keywordtype">void</span> VmaStringBuilder::AddPointer(<span class="keyword">const</span> <span class="keywordtype">void</span>* ptr)</div>
-<div class="line"><a name="l08073"></a><span class="lineno"> 8073</span>&#160;{</div>
-<div class="line"><a name="l08074"></a><span class="lineno"> 8074</span>&#160;    <span class="keywordtype">char</span> buf[21];</div>
-<div class="line"><a name="l08075"></a><span class="lineno"> 8075</span>&#160;    VmaPtrToStr(buf, <span class="keyword">sizeof</span>(buf), ptr);</div>
-<div class="line"><a name="l08076"></a><span class="lineno"> 8076</span>&#160;    Add(buf);</div>
-<div class="line"><a name="l08077"></a><span class="lineno"> 8077</span>&#160;}</div>
-<div class="line"><a name="l08078"></a><span class="lineno"> 8078</span>&#160; </div>
-<div class="line"><a name="l08079"></a><span class="lineno"> 8079</span>&#160;<span class="preprocessor">#endif // #if VMA_STATS_STRING_ENABLED</span></div>
-<div class="line"><a name="l08080"></a><span class="lineno"> 8080</span>&#160; </div>
-<div class="line"><a name="l08082"></a><span class="lineno"> 8082</span>&#160;<span class="comment">// VmaJsonWriter</span></div>
+<div class="line"><a name="l08044"></a><span class="lineno"> 8044</span>&#160;<span class="keyword">private</span>:</div>
+<div class="line"><a name="l08045"></a><span class="lineno"> 8045</span>&#160;    <span class="keyword">struct </span>CallParams</div>
+<div class="line"><a name="l08046"></a><span class="lineno"> 8046</span>&#160;    {</div>
+<div class="line"><a name="l08047"></a><span class="lineno"> 8047</span>&#160;        uint32_t threadId;</div>
+<div class="line"><a name="l08048"></a><span class="lineno"> 8048</span>&#160;        <span class="keywordtype">double</span> time;</div>
+<div class="line"><a name="l08049"></a><span class="lineno"> 8049</span>&#160;    };</div>
+<div class="line"><a name="l08050"></a><span class="lineno"> 8050</span>&#160; </div>
+<div class="line"><a name="l08051"></a><span class="lineno"> 8051</span>&#160;    <span class="keyword">class </span>UserDataString</div>
+<div class="line"><a name="l08052"></a><span class="lineno"> 8052</span>&#160;    {</div>
+<div class="line"><a name="l08053"></a><span class="lineno"> 8053</span>&#160;    <span class="keyword">public</span>:</div>
+<div class="line"><a name="l08054"></a><span class="lineno"> 8054</span>&#160;        UserDataString(<a class="code" href="vk__mem__alloc_8h.html#a5225e5e11f8376f6a31a1791f3d6e817">VmaAllocationCreateFlags</a> allocFlags, <span class="keyword">const</span> <span class="keywordtype">void</span>* pUserData);</div>
+<div class="line"><a name="l08055"></a><span class="lineno"> 8055</span>&#160;        <span class="keyword">const</span> <span class="keywordtype">char</span>* GetString()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_Str; }</div>
+<div class="line"><a name="l08056"></a><span class="lineno"> 8056</span>&#160; </div>
+<div class="line"><a name="l08057"></a><span class="lineno"> 8057</span>&#160;    <span class="keyword">private</span>:</div>
+<div class="line"><a name="l08058"></a><span class="lineno"> 8058</span>&#160;        <span class="keywordtype">char</span> m_PtrStr[17];</div>
+<div class="line"><a name="l08059"></a><span class="lineno"> 8059</span>&#160;        <span class="keyword">const</span> <span class="keywordtype">char</span>* m_Str;</div>
+<div class="line"><a name="l08060"></a><span class="lineno"> 8060</span>&#160;    };</div>
+<div class="line"><a name="l08061"></a><span class="lineno"> 8061</span>&#160; </div>
+<div class="line"><a name="l08062"></a><span class="lineno"> 8062</span>&#160;    <span class="keywordtype">bool</span> m_UseMutex;</div>
+<div class="line"><a name="l08063"></a><span class="lineno"> 8063</span>&#160;    <a class="code" href="vk__mem__alloc_8h.html#af3929a1a4547c592fc0b0e55ef452828">VmaRecordFlags</a> m_Flags;</div>
+<div class="line"><a name="l08064"></a><span class="lineno"> 8064</span>&#160;    FILE* m_File;</div>
+<div class="line"><a name="l08065"></a><span class="lineno"> 8065</span>&#160;    VMA_MUTEX m_FileMutex;</div>
+<div class="line"><a name="l08066"></a><span class="lineno"> 8066</span>&#160;    std::chrono::time_point&lt;std::chrono::high_resolution_clock&gt; m_RecordingStartTime;</div>
+<div class="line"><a name="l08067"></a><span class="lineno"> 8067</span>&#160; </div>
+<div class="line"><a name="l08068"></a><span class="lineno"> 8068</span>&#160;    <span class="keywordtype">void</span> GetBasicParams(CallParams&amp; outParams);</div>
+<div class="line"><a name="l08069"></a><span class="lineno"> 8069</span>&#160; </div>
+<div class="line"><a name="l08070"></a><span class="lineno"> 8070</span>&#160;    <span class="comment">// T must be a pointer type, e.g. VmaAllocation, VmaPool.</span></div>
+<div class="line"><a name="l08071"></a><span class="lineno"> 8071</span>&#160;    <span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt;</div>
+<div class="line"><a name="l08072"></a><span class="lineno"> 8072</span>&#160;    <span class="keywordtype">void</span> PrintPointerList(uint64_t count, <span class="keyword">const</span> T* pItems)</div>
+<div class="line"><a name="l08073"></a><span class="lineno"> 8073</span>&#160;    {</div>
+<div class="line"><a name="l08074"></a><span class="lineno"> 8074</span>&#160;        <span class="keywordflow">if</span>(count)</div>
+<div class="line"><a name="l08075"></a><span class="lineno"> 8075</span>&#160;        {</div>
+<div class="line"><a name="l08076"></a><span class="lineno"> 8076</span>&#160;            fprintf(m_File, <span class="stringliteral">&quot;%p&quot;</span>, pItems[0]);</div>
+<div class="line"><a name="l08077"></a><span class="lineno"> 8077</span>&#160;            <span class="keywordflow">for</span>(uint64_t i = 1; i &lt; count; ++i)</div>
+<div class="line"><a name="l08078"></a><span class="lineno"> 8078</span>&#160;            {</div>
+<div class="line"><a name="l08079"></a><span class="lineno"> 8079</span>&#160;                fprintf(m_File, <span class="stringliteral">&quot; %p&quot;</span>, pItems[i]);</div>
+<div class="line"><a name="l08080"></a><span class="lineno"> 8080</span>&#160;            }</div>
+<div class="line"><a name="l08081"></a><span class="lineno"> 8081</span>&#160;        }</div>
+<div class="line"><a name="l08082"></a><span class="lineno"> 8082</span>&#160;    }</div>
 <div class="line"><a name="l08083"></a><span class="lineno"> 8083</span>&#160; </div>
-<div class="line"><a name="l08084"></a><span class="lineno"> 8084</span>&#160;<span class="preprocessor">#if VMA_STATS_STRING_ENABLED</span></div>
-<div class="line"><a name="l08085"></a><span class="lineno"> 8085</span>&#160; </div>
-<div class="line"><a name="l08086"></a><span class="lineno"> 8086</span>&#160;<span class="keyword">class </span>VmaJsonWriter</div>
-<div class="line"><a name="l08087"></a><span class="lineno"> 8087</span>&#160;{</div>
-<div class="line"><a name="l08088"></a><span class="lineno"> 8088</span>&#160;    VMA_CLASS_NO_COPY(VmaJsonWriter)</div>
-<div class="line"><a name="l08089"></a><span class="lineno"> 8089</span>&#160;<span class="keyword">public</span>:</div>
-<div class="line"><a name="l08090"></a><span class="lineno"> 8090</span>&#160;    VmaJsonWriter(<span class="keyword">const</span> VkAllocationCallbacks* pAllocationCallbacks, VmaStringBuilder&amp; sb);</div>
-<div class="line"><a name="l08091"></a><span class="lineno"> 8091</span>&#160;    ~VmaJsonWriter();</div>
-<div class="line"><a name="l08092"></a><span class="lineno"> 8092</span>&#160; </div>
-<div class="line"><a name="l08093"></a><span class="lineno"> 8093</span>&#160;    <span class="keywordtype">void</span> BeginObject(<span class="keywordtype">bool</span> singleLine = <span class="keyword">false</span>);</div>
-<div class="line"><a name="l08094"></a><span class="lineno"> 8094</span>&#160;    <span class="keywordtype">void</span> EndObject();</div>
-<div class="line"><a name="l08095"></a><span class="lineno"> 8095</span>&#160;    </div>
-<div class="line"><a name="l08096"></a><span class="lineno"> 8096</span>&#160;    <span class="keywordtype">void</span> BeginArray(<span class="keywordtype">bool</span> singleLine = <span class="keyword">false</span>);</div>
-<div class="line"><a name="l08097"></a><span class="lineno"> 8097</span>&#160;    <span class="keywordtype">void</span> EndArray();</div>
-<div class="line"><a name="l08098"></a><span class="lineno"> 8098</span>&#160;    </div>
-<div class="line"><a name="l08099"></a><span class="lineno"> 8099</span>&#160;    <span class="keywordtype">void</span> WriteString(<span class="keyword">const</span> <span class="keywordtype">char</span>* pStr);</div>
-<div class="line"><a name="l08100"></a><span class="lineno"> 8100</span>&#160;    <span class="keywordtype">void</span> BeginString(<span class="keyword">const</span> <span class="keywordtype">char</span>* pStr = VMA_NULL);</div>
-<div class="line"><a name="l08101"></a><span class="lineno"> 8101</span>&#160;    <span class="keywordtype">void</span> ContinueString(<span class="keyword">const</span> <span class="keywordtype">char</span>* pStr);</div>
-<div class="line"><a name="l08102"></a><span class="lineno"> 8102</span>&#160;    <span class="keywordtype">void</span> ContinueString(uint32_t n);</div>
-<div class="line"><a name="l08103"></a><span class="lineno"> 8103</span>&#160;    <span class="keywordtype">void</span> ContinueString(uint64_t n);</div>
-<div class="line"><a name="l08104"></a><span class="lineno"> 8104</span>&#160;    <span class="keywordtype">void</span> ContinueString_Pointer(<span class="keyword">const</span> <span class="keywordtype">void</span>* ptr);</div>
-<div class="line"><a name="l08105"></a><span class="lineno"> 8105</span>&#160;    <span class="keywordtype">void</span> EndString(<span class="keyword">const</span> <span class="keywordtype">char</span>* pStr = VMA_NULL);</div>
-<div class="line"><a name="l08106"></a><span class="lineno"> 8106</span>&#160;    </div>
-<div class="line"><a name="l08107"></a><span class="lineno"> 8107</span>&#160;    <span class="keywordtype">void</span> WriteNumber(uint32_t n);</div>
-<div class="line"><a name="l08108"></a><span class="lineno"> 8108</span>&#160;    <span class="keywordtype">void</span> WriteNumber(uint64_t n);</div>
-<div class="line"><a name="l08109"></a><span class="lineno"> 8109</span>&#160;    <span class="keywordtype">void</span> WriteBool(<span class="keywordtype">bool</span> b);</div>
-<div class="line"><a name="l08110"></a><span class="lineno"> 8110</span>&#160;    <span class="keywordtype">void</span> WriteNull();</div>
+<div class="line"><a name="l08084"></a><span class="lineno"> 8084</span>&#160;    <span class="keywordtype">void</span> PrintPointerList(uint64_t count, <span class="keyword">const</span> <a class="code" href="struct_vma_allocation.html">VmaAllocation</a>* pItems);</div>
+<div class="line"><a name="l08085"></a><span class="lineno"> 8085</span>&#160;    <span class="keywordtype">void</span> Flush();</div>
+<div class="line"><a name="l08086"></a><span class="lineno"> 8086</span>&#160;};</div>
+<div class="line"><a name="l08087"></a><span class="lineno"> 8087</span>&#160; </div>
+<div class="line"><a name="l08088"></a><span class="lineno"> 8088</span>&#160;<span class="preprocessor">#endif </span><span class="comment">// #if VMA_RECORDING_ENABLED</span></div>
+<div class="line"><a name="l08089"></a><span class="lineno"> 8089</span>&#160; </div>
+<div class="line"><a name="l08090"></a><span class="lineno"> 8090</span>&#160;<span class="comment">/*</span></div>
+<div class="line"><a name="l08091"></a><span class="lineno"> 8091</span>&#160;<span class="comment">Thread-safe wrapper over VmaPoolAllocator free list, for allocation of VmaAllocation_T objects.</span></div>
+<div class="line"><a name="l08092"></a><span class="lineno"> 8092</span>&#160;<span class="comment">*/</span></div>
+<div class="line"><a name="l08093"></a><span class="lineno"> 8093</span>&#160;<span class="keyword">class </span>VmaAllocationObjectAllocator</div>
+<div class="line"><a name="l08094"></a><span class="lineno"> 8094</span>&#160;{</div>
+<div class="line"><a name="l08095"></a><span class="lineno"> 8095</span>&#160;    VMA_CLASS_NO_COPY(VmaAllocationObjectAllocator)</div>
+<div class="line"><a name="l08096"></a><span class="lineno"> 8096</span>&#160;<span class="keyword">public</span>:</div>
+<div class="line"><a name="l08097"></a><span class="lineno"> 8097</span>&#160;    VmaAllocationObjectAllocator(<span class="keyword">const</span> VkAllocationCallbacks* pAllocationCallbacks);</div>
+<div class="line"><a name="l08098"></a><span class="lineno"> 8098</span>&#160; </div>
+<div class="line"><a name="l08099"></a><span class="lineno"> 8099</span>&#160;    <span class="keyword">template</span>&lt;<span class="keyword">typename</span>... Types&gt; <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> Allocate(Types... args);</div>
+<div class="line"><a name="l08100"></a><span class="lineno"> 8100</span>&#160;    <span class="keywordtype">void</span> Free(<a class="code" href="struct_vma_allocation.html">VmaAllocation</a> hAlloc);</div>
+<div class="line"><a name="l08101"></a><span class="lineno"> 8101</span>&#160; </div>
+<div class="line"><a name="l08102"></a><span class="lineno"> 8102</span>&#160;<span class="keyword">private</span>:</div>
+<div class="line"><a name="l08103"></a><span class="lineno"> 8103</span>&#160;    VMA_MUTEX m_Mutex;</div>
+<div class="line"><a name="l08104"></a><span class="lineno"> 8104</span>&#160;    VmaPoolAllocator&lt;VmaAllocation_T&gt; m_Allocator;</div>
+<div class="line"><a name="l08105"></a><span class="lineno"> 8105</span>&#160;};</div>
+<div class="line"><a name="l08106"></a><span class="lineno"> 8106</span>&#160; </div>
+<div class="line"><a name="l08107"></a><span class="lineno"> 8107</span>&#160;<span class="keyword">struct </span>VmaCurrentBudgetData</div>
+<div class="line"><a name="l08108"></a><span class="lineno"> 8108</span>&#160;{</div>
+<div class="line"><a name="l08109"></a><span class="lineno"> 8109</span>&#160;    VMA_ATOMIC_UINT64 m_BlockBytes[VK_MAX_MEMORY_HEAPS];</div>
+<div class="line"><a name="l08110"></a><span class="lineno"> 8110</span>&#160;    VMA_ATOMIC_UINT64 m_AllocationBytes[VK_MAX_MEMORY_HEAPS];</div>
 <div class="line"><a name="l08111"></a><span class="lineno"> 8111</span>&#160; </div>
-<div class="line"><a name="l08112"></a><span class="lineno"> 8112</span>&#160;<span class="keyword">private</span>:</div>
-<div class="line"><a name="l08113"></a><span class="lineno"> 8113</span>&#160;    <span class="keyword">static</span> <span class="keyword">const</span> <span class="keywordtype">char</span>* <span class="keyword">const</span> INDENT;</div>
-<div class="line"><a name="l08114"></a><span class="lineno"> 8114</span>&#160; </div>
-<div class="line"><a name="l08115"></a><span class="lineno"> 8115</span>&#160;    <span class="keyword">enum</span> COLLECTION_TYPE</div>
-<div class="line"><a name="l08116"></a><span class="lineno"> 8116</span>&#160;    {</div>
-<div class="line"><a name="l08117"></a><span class="lineno"> 8117</span>&#160;        COLLECTION_TYPE_OBJECT,</div>
-<div class="line"><a name="l08118"></a><span class="lineno"> 8118</span>&#160;        COLLECTION_TYPE_ARRAY,</div>
-<div class="line"><a name="l08119"></a><span class="lineno"> 8119</span>&#160;    };</div>
-<div class="line"><a name="l08120"></a><span class="lineno"> 8120</span>&#160;    <span class="keyword">struct </span>StackItem</div>
+<div class="line"><a name="l08112"></a><span class="lineno"> 8112</span>&#160;<span class="preprocessor">#if VMA_MEMORY_BUDGET</span></div>
+<div class="line"><a name="l08113"></a><span class="lineno"> 8113</span>&#160;    VMA_ATOMIC_UINT32 m_OperationsSinceBudgetFetch;</div>
+<div class="line"><a name="l08114"></a><span class="lineno"> 8114</span>&#160;    VMA_RW_MUTEX m_BudgetMutex;</div>
+<div class="line"><a name="l08115"></a><span class="lineno"> 8115</span>&#160;    uint64_t m_VulkanUsage[VK_MAX_MEMORY_HEAPS];</div>
+<div class="line"><a name="l08116"></a><span class="lineno"> 8116</span>&#160;    uint64_t m_VulkanBudget[VK_MAX_MEMORY_HEAPS];</div>
+<div class="line"><a name="l08117"></a><span class="lineno"> 8117</span>&#160;    uint64_t m_BlockBytesAtBudgetFetch[VK_MAX_MEMORY_HEAPS];</div>
+<div class="line"><a name="l08118"></a><span class="lineno"> 8118</span>&#160;<span class="preprocessor">#endif </span><span class="comment">// #if VMA_MEMORY_BUDGET</span></div>
+<div class="line"><a name="l08119"></a><span class="lineno"> 8119</span>&#160; </div>
+<div class="line"><a name="l08120"></a><span class="lineno"> 8120</span>&#160;    VmaCurrentBudgetData()</div>
 <div class="line"><a name="l08121"></a><span class="lineno"> 8121</span>&#160;    {</div>
-<div class="line"><a name="l08122"></a><span class="lineno"> 8122</span>&#160;        COLLECTION_TYPE type;</div>
-<div class="line"><a name="l08123"></a><span class="lineno"> 8123</span>&#160;        uint32_t valueCount;</div>
-<div class="line"><a name="l08124"></a><span class="lineno"> 8124</span>&#160;        <span class="keywordtype">bool</span> singleLineMode;</div>
-<div class="line"><a name="l08125"></a><span class="lineno"> 8125</span>&#160;    };</div>
-<div class="line"><a name="l08126"></a><span class="lineno"> 8126</span>&#160; </div>
-<div class="line"><a name="l08127"></a><span class="lineno"> 8127</span>&#160;    VmaStringBuilder&amp; m_SB;</div>
-<div class="line"><a name="l08128"></a><span class="lineno"> 8128</span>&#160;    VmaVector&lt; StackItem, VmaStlAllocator&lt;StackItem&gt; &gt; m_Stack;</div>
-<div class="line"><a name="l08129"></a><span class="lineno"> 8129</span>&#160;    <span class="keywordtype">bool</span> m_InsideString;</div>
-<div class="line"><a name="l08130"></a><span class="lineno"> 8130</span>&#160; </div>
-<div class="line"><a name="l08131"></a><span class="lineno"> 8131</span>&#160;    <span class="keywordtype">void</span> BeginValue(<span class="keywordtype">bool</span> isString);</div>
-<div class="line"><a name="l08132"></a><span class="lineno"> 8132</span>&#160;    <span class="keywordtype">void</span> WriteIndent(<span class="keywordtype">bool</span> oneLess = <span class="keyword">false</span>);</div>
-<div class="line"><a name="l08133"></a><span class="lineno"> 8133</span>&#160;};</div>
-<div class="line"><a name="l08134"></a><span class="lineno"> 8134</span>&#160; </div>
-<div class="line"><a name="l08135"></a><span class="lineno"> 8135</span>&#160;<span class="keyword">const</span> <span class="keywordtype">char</span>* <span class="keyword">const</span> VmaJsonWriter::INDENT = <span class="stringliteral">&quot;  &quot;</span>;</div>
-<div class="line"><a name="l08136"></a><span class="lineno"> 8136</span>&#160; </div>
-<div class="line"><a name="l08137"></a><span class="lineno"> 8137</span>&#160;VmaJsonWriter::VmaJsonWriter(<span class="keyword">const</span> VkAllocationCallbacks* pAllocationCallbacks, VmaStringBuilder&amp; sb) :</div>
-<div class="line"><a name="l08138"></a><span class="lineno"> 8138</span>&#160;    m_SB(sb),</div>
-<div class="line"><a name="l08139"></a><span class="lineno"> 8139</span>&#160;    m_Stack(VmaStlAllocator&lt;StackItem&gt;(pAllocationCallbacks)),</div>
-<div class="line"><a name="l08140"></a><span class="lineno"> 8140</span>&#160;    m_InsideString(false)</div>
-<div class="line"><a name="l08141"></a><span class="lineno"> 8141</span>&#160;{</div>
-<div class="line"><a name="l08142"></a><span class="lineno"> 8142</span>&#160;}</div>
-<div class="line"><a name="l08143"></a><span class="lineno"> 8143</span>&#160; </div>
-<div class="line"><a name="l08144"></a><span class="lineno"> 8144</span>&#160;VmaJsonWriter::~VmaJsonWriter()</div>
-<div class="line"><a name="l08145"></a><span class="lineno"> 8145</span>&#160;{</div>
-<div class="line"><a name="l08146"></a><span class="lineno"> 8146</span>&#160;    VMA_ASSERT(!m_InsideString);</div>
-<div class="line"><a name="l08147"></a><span class="lineno"> 8147</span>&#160;    VMA_ASSERT(m_Stack.empty());</div>
-<div class="line"><a name="l08148"></a><span class="lineno"> 8148</span>&#160;}</div>
-<div class="line"><a name="l08149"></a><span class="lineno"> 8149</span>&#160; </div>
-<div class="line"><a name="l08150"></a><span class="lineno"> 8150</span>&#160;<span class="keywordtype">void</span> VmaJsonWriter::BeginObject(<span class="keywordtype">bool</span> singleLine)</div>
-<div class="line"><a name="l08151"></a><span class="lineno"> 8151</span>&#160;{</div>
-<div class="line"><a name="l08152"></a><span class="lineno"> 8152</span>&#160;    VMA_ASSERT(!m_InsideString);</div>
-<div class="line"><a name="l08153"></a><span class="lineno"> 8153</span>&#160; </div>
-<div class="line"><a name="l08154"></a><span class="lineno"> 8154</span>&#160;    BeginValue(<span class="keyword">false</span>);</div>
-<div class="line"><a name="l08155"></a><span class="lineno"> 8155</span>&#160;    m_SB.Add(<span class="charliteral">&#39;{&#39;</span>);</div>
-<div class="line"><a name="l08156"></a><span class="lineno"> 8156</span>&#160; </div>
-<div class="line"><a name="l08157"></a><span class="lineno"> 8157</span>&#160;    StackItem item;</div>
-<div class="line"><a name="l08158"></a><span class="lineno"> 8158</span>&#160;    item.type = COLLECTION_TYPE_OBJECT;</div>
-<div class="line"><a name="l08159"></a><span class="lineno"> 8159</span>&#160;    item.valueCount = 0;</div>
-<div class="line"><a name="l08160"></a><span class="lineno"> 8160</span>&#160;    item.singleLineMode = singleLine;</div>
-<div class="line"><a name="l08161"></a><span class="lineno"> 8161</span>&#160;    m_Stack.push_back(item);</div>
-<div class="line"><a name="l08162"></a><span class="lineno"> 8162</span>&#160;}</div>
-<div class="line"><a name="l08163"></a><span class="lineno"> 8163</span>&#160; </div>
-<div class="line"><a name="l08164"></a><span class="lineno"> 8164</span>&#160;<span class="keywordtype">void</span> VmaJsonWriter::EndObject()</div>
-<div class="line"><a name="l08165"></a><span class="lineno"> 8165</span>&#160;{</div>
-<div class="line"><a name="l08166"></a><span class="lineno"> 8166</span>&#160;    VMA_ASSERT(!m_InsideString);</div>
-<div class="line"><a name="l08167"></a><span class="lineno"> 8167</span>&#160; </div>
-<div class="line"><a name="l08168"></a><span class="lineno"> 8168</span>&#160;    WriteIndent(<span class="keyword">true</span>);</div>
-<div class="line"><a name="l08169"></a><span class="lineno"> 8169</span>&#160;    m_SB.Add(<span class="charliteral">&#39;}&#39;</span>);</div>
-<div class="line"><a name="l08170"></a><span class="lineno"> 8170</span>&#160; </div>
-<div class="line"><a name="l08171"></a><span class="lineno"> 8171</span>&#160;    VMA_ASSERT(!m_Stack.empty() &amp;&amp; m_Stack.back().type == COLLECTION_TYPE_OBJECT);</div>
-<div class="line"><a name="l08172"></a><span class="lineno"> 8172</span>&#160;    m_Stack.pop_back();</div>
-<div class="line"><a name="l08173"></a><span class="lineno"> 8173</span>&#160;}</div>
-<div class="line"><a name="l08174"></a><span class="lineno"> 8174</span>&#160; </div>
-<div class="line"><a name="l08175"></a><span class="lineno"> 8175</span>&#160;<span class="keywordtype">void</span> VmaJsonWriter::BeginArray(<span class="keywordtype">bool</span> singleLine)</div>
-<div class="line"><a name="l08176"></a><span class="lineno"> 8176</span>&#160;{</div>
-<div class="line"><a name="l08177"></a><span class="lineno"> 8177</span>&#160;    VMA_ASSERT(!m_InsideString);</div>
+<div class="line"><a name="l08122"></a><span class="lineno"> 8122</span>&#160;        <span class="keywordflow">for</span>(uint32_t heapIndex = 0; heapIndex &lt; VK_MAX_MEMORY_HEAPS; ++heapIndex)</div>
+<div class="line"><a name="l08123"></a><span class="lineno"> 8123</span>&#160;        {</div>
+<div class="line"><a name="l08124"></a><span class="lineno"> 8124</span>&#160;            m_BlockBytes[heapIndex] = 0;</div>
+<div class="line"><a name="l08125"></a><span class="lineno"> 8125</span>&#160;            m_AllocationBytes[heapIndex] = 0;</div>
+<div class="line"><a name="l08126"></a><span class="lineno"> 8126</span>&#160;<span class="preprocessor">#if VMA_MEMORY_BUDGET</span></div>
+<div class="line"><a name="l08127"></a><span class="lineno"> 8127</span>&#160;            m_VulkanUsage[heapIndex] = 0;</div>
+<div class="line"><a name="l08128"></a><span class="lineno"> 8128</span>&#160;            m_VulkanBudget[heapIndex] = 0;</div>
+<div class="line"><a name="l08129"></a><span class="lineno"> 8129</span>&#160;            m_BlockBytesAtBudgetFetch[heapIndex] = 0;</div>
+<div class="line"><a name="l08130"></a><span class="lineno"> 8130</span>&#160;<span class="preprocessor">#endif</span></div>
+<div class="line"><a name="l08131"></a><span class="lineno"> 8131</span>&#160;        }</div>
+<div class="line"><a name="l08132"></a><span class="lineno"> 8132</span>&#160; </div>
+<div class="line"><a name="l08133"></a><span class="lineno"> 8133</span>&#160;<span class="preprocessor">#if VMA_MEMORY_BUDGET</span></div>
+<div class="line"><a name="l08134"></a><span class="lineno"> 8134</span>&#160;        m_OperationsSinceBudgetFetch = 0;</div>
+<div class="line"><a name="l08135"></a><span class="lineno"> 8135</span>&#160;<span class="preprocessor">#endif</span></div>
+<div class="line"><a name="l08136"></a><span class="lineno"> 8136</span>&#160;    }</div>
+<div class="line"><a name="l08137"></a><span class="lineno"> 8137</span>&#160; </div>
+<div class="line"><a name="l08138"></a><span class="lineno"> 8138</span>&#160;    <span class="keywordtype">void</span> AddAllocation(uint32_t heapIndex, VkDeviceSize allocationSize)</div>
+<div class="line"><a name="l08139"></a><span class="lineno"> 8139</span>&#160;    {</div>
+<div class="line"><a name="l08140"></a><span class="lineno"> 8140</span>&#160;        m_AllocationBytes[heapIndex] += allocationSize;</div>
+<div class="line"><a name="l08141"></a><span class="lineno"> 8141</span>&#160;<span class="preprocessor">#if VMA_MEMORY_BUDGET</span></div>
+<div class="line"><a name="l08142"></a><span class="lineno"> 8142</span>&#160;        ++m_OperationsSinceBudgetFetch;</div>
+<div class="line"><a name="l08143"></a><span class="lineno"> 8143</span>&#160;<span class="preprocessor">#endif</span></div>
+<div class="line"><a name="l08144"></a><span class="lineno"> 8144</span>&#160;    }</div>
+<div class="line"><a name="l08145"></a><span class="lineno"> 8145</span>&#160; </div>
+<div class="line"><a name="l08146"></a><span class="lineno"> 8146</span>&#160;    <span class="keywordtype">void</span> RemoveAllocation(uint32_t heapIndex, VkDeviceSize allocationSize)</div>
+<div class="line"><a name="l08147"></a><span class="lineno"> 8147</span>&#160;    {</div>
+<div class="line"><a name="l08148"></a><span class="lineno"> 8148</span>&#160;        VMA_ASSERT(m_AllocationBytes[heapIndex] &gt;= allocationSize); <span class="comment">// DELME</span></div>
+<div class="line"><a name="l08149"></a><span class="lineno"> 8149</span>&#160;        m_AllocationBytes[heapIndex] -= allocationSize;</div>
+<div class="line"><a name="l08150"></a><span class="lineno"> 8150</span>&#160;<span class="preprocessor">#if VMA_MEMORY_BUDGET</span></div>
+<div class="line"><a name="l08151"></a><span class="lineno"> 8151</span>&#160;        ++m_OperationsSinceBudgetFetch;</div>
+<div class="line"><a name="l08152"></a><span class="lineno"> 8152</span>&#160;<span class="preprocessor">#endif</span></div>
+<div class="line"><a name="l08153"></a><span class="lineno"> 8153</span>&#160;    }</div>
+<div class="line"><a name="l08154"></a><span class="lineno"> 8154</span>&#160;};</div>
+<div class="line"><a name="l08155"></a><span class="lineno"> 8155</span>&#160; </div>
+<div class="line"><a name="l08156"></a><span class="lineno"> 8156</span>&#160;<span class="comment">// Main allocator object.</span></div>
+<div class="line"><a name="l08157"></a><span class="lineno"> 8157</span>&#160;<span class="keyword">struct </span>VmaAllocator_T</div>
+<div class="line"><a name="l08158"></a><span class="lineno"> 8158</span>&#160;{</div>
+<div class="line"><a name="l08159"></a><span class="lineno"> 8159</span>&#160;    VMA_CLASS_NO_COPY(VmaAllocator_T)</div>
+<div class="line"><a name="l08160"></a><span class="lineno"> 8160</span>&#160;<span class="keyword">public</span>:</div>
+<div class="line"><a name="l08161"></a><span class="lineno"> 8161</span>&#160;    <span class="keywordtype">bool</span> m_UseMutex;</div>
+<div class="line"><a name="l08162"></a><span class="lineno"> 8162</span>&#160;    uint32_t m_VulkanApiVersion;</div>
+<div class="line"><a name="l08163"></a><span class="lineno"> 8163</span>&#160;    <span class="keywordtype">bool</span> m_UseKhrDedicatedAllocation; <span class="comment">// Can be set only if m_VulkanApiVersion &lt; VK_MAKE_VERSION(1, 1, 0).</span></div>
+<div class="line"><a name="l08164"></a><span class="lineno"> 8164</span>&#160;    <span class="keywordtype">bool</span> m_UseKhrBindMemory2; <span class="comment">// Can be set only if m_VulkanApiVersion &lt; VK_MAKE_VERSION(1, 1, 0).</span></div>
+<div class="line"><a name="l08165"></a><span class="lineno"> 8165</span>&#160;    <span class="keywordtype">bool</span> m_UseExtMemoryBudget;</div>
+<div class="line"><a name="l08166"></a><span class="lineno"> 8166</span>&#160;    <span class="keywordtype">bool</span> m_UseAmdDeviceCoherentMemory;</div>
+<div class="line"><a name="l08167"></a><span class="lineno"> 8167</span>&#160;    <span class="keywordtype">bool</span> m_UseKhrBufferDeviceAddress;</div>
+<div class="line"><a name="l08168"></a><span class="lineno"> 8168</span>&#160;    <span class="keywordtype">bool</span> m_UseExtMemoryPriority;</div>
+<div class="line"><a name="l08169"></a><span class="lineno"> 8169</span>&#160;    VkDevice m_hDevice;</div>
+<div class="line"><a name="l08170"></a><span class="lineno"> 8170</span>&#160;    VkInstance m_hInstance;</div>
+<div class="line"><a name="l08171"></a><span class="lineno"> 8171</span>&#160;    <span class="keywordtype">bool</span> m_AllocationCallbacksSpecified;</div>
+<div class="line"><a name="l08172"></a><span class="lineno"> 8172</span>&#160;    VkAllocationCallbacks m_AllocationCallbacks;</div>
+<div class="line"><a name="l08173"></a><span class="lineno"> 8173</span>&#160;    <a class="code" href="struct_vma_device_memory_callbacks.html">VmaDeviceMemoryCallbacks</a> m_DeviceMemoryCallbacks;</div>
+<div class="line"><a name="l08174"></a><span class="lineno"> 8174</span>&#160;    VmaAllocationObjectAllocator m_AllocationObjectAllocator;</div>
+<div class="line"><a name="l08175"></a><span class="lineno"> 8175</span>&#160; </div>
+<div class="line"><a name="l08176"></a><span class="lineno"> 8176</span>&#160;    <span class="comment">// Each bit (1 &lt;&lt; i) is set if HeapSizeLimit is enabled for that heap, so cannot allocate more than the heap size.</span></div>
+<div class="line"><a name="l08177"></a><span class="lineno"> 8177</span>&#160;    uint32_t m_HeapSizeLimitMask;</div>
 <div class="line"><a name="l08178"></a><span class="lineno"> 8178</span>&#160; </div>
-<div class="line"><a name="l08179"></a><span class="lineno"> 8179</span>&#160;    BeginValue(<span class="keyword">false</span>);</div>
-<div class="line"><a name="l08180"></a><span class="lineno"> 8180</span>&#160;    m_SB.Add(<span class="charliteral">&#39;[&#39;</span>);</div>
+<div class="line"><a name="l08179"></a><span class="lineno"> 8179</span>&#160;    VkPhysicalDeviceProperties m_PhysicalDeviceProperties;</div>
+<div class="line"><a name="l08180"></a><span class="lineno"> 8180</span>&#160;    VkPhysicalDeviceMemoryProperties m_MemProps;</div>
 <div class="line"><a name="l08181"></a><span class="lineno"> 8181</span>&#160; </div>
-<div class="line"><a name="l08182"></a><span class="lineno"> 8182</span>&#160;    StackItem item;</div>
-<div class="line"><a name="l08183"></a><span class="lineno"> 8183</span>&#160;    item.type = COLLECTION_TYPE_ARRAY;</div>
-<div class="line"><a name="l08184"></a><span class="lineno"> 8184</span>&#160;    item.valueCount = 0;</div>
-<div class="line"><a name="l08185"></a><span class="lineno"> 8185</span>&#160;    item.singleLineMode = singleLine;</div>
-<div class="line"><a name="l08186"></a><span class="lineno"> 8186</span>&#160;    m_Stack.push_back(item);</div>
-<div class="line"><a name="l08187"></a><span class="lineno"> 8187</span>&#160;}</div>
+<div class="line"><a name="l08182"></a><span class="lineno"> 8182</span>&#160;    <span class="comment">// Default pools.</span></div>
+<div class="line"><a name="l08183"></a><span class="lineno"> 8183</span>&#160;    VmaBlockVector* m_pBlockVectors[VK_MAX_MEMORY_TYPES];</div>
+<div class="line"><a name="l08184"></a><span class="lineno"> 8184</span>&#160; </div>
+<div class="line"><a name="l08185"></a><span class="lineno"> 8185</span>&#160;    <span class="keyword">typedef</span> VmaIntrusiveLinkedList&lt;VmaDedicatedAllocationListItemTraits&gt; DedicatedAllocationLinkedList;</div>
+<div class="line"><a name="l08186"></a><span class="lineno"> 8186</span>&#160;    DedicatedAllocationLinkedList m_DedicatedAllocations[VK_MAX_MEMORY_TYPES];</div>
+<div class="line"><a name="l08187"></a><span class="lineno"> 8187</span>&#160;    VMA_RW_MUTEX m_DedicatedAllocationsMutex[VK_MAX_MEMORY_TYPES];</div>
 <div class="line"><a name="l08188"></a><span class="lineno"> 8188</span>&#160; </div>
-<div class="line"><a name="l08189"></a><span class="lineno"> 8189</span>&#160;<span class="keywordtype">void</span> VmaJsonWriter::EndArray()</div>
-<div class="line"><a name="l08190"></a><span class="lineno"> 8190</span>&#160;{</div>
-<div class="line"><a name="l08191"></a><span class="lineno"> 8191</span>&#160;    VMA_ASSERT(!m_InsideString);</div>
-<div class="line"><a name="l08192"></a><span class="lineno"> 8192</span>&#160; </div>
-<div class="line"><a name="l08193"></a><span class="lineno"> 8193</span>&#160;    WriteIndent(<span class="keyword">true</span>);</div>
-<div class="line"><a name="l08194"></a><span class="lineno"> 8194</span>&#160;    m_SB.Add(<span class="charliteral">&#39;]&#39;</span>);</div>
+<div class="line"><a name="l08189"></a><span class="lineno"> 8189</span>&#160;    VmaCurrentBudgetData m_Budget;</div>
+<div class="line"><a name="l08190"></a><span class="lineno"> 8190</span>&#160;    VMA_ATOMIC_UINT32 m_DeviceMemoryCount; <span class="comment">// Total number of VkDeviceMemory objects.</span></div>
+<div class="line"><a name="l08191"></a><span class="lineno"> 8191</span>&#160; </div>
+<div class="line"><a name="l08192"></a><span class="lineno"> 8192</span>&#160;    VmaAllocator_T(<span class="keyword">const</span> <a class="code" href="struct_vma_allocator_create_info.html">VmaAllocatorCreateInfo</a>* pCreateInfo);</div>
+<div class="line"><a name="l08193"></a><span class="lineno"> 8193</span>&#160;    VkResult Init(<span class="keyword">const</span> <a class="code" href="struct_vma_allocator_create_info.html">VmaAllocatorCreateInfo</a>* pCreateInfo);</div>
+<div class="line"><a name="l08194"></a><span class="lineno"> 8194</span>&#160;    ~VmaAllocator_T();</div>
 <div class="line"><a name="l08195"></a><span class="lineno"> 8195</span>&#160; </div>
-<div class="line"><a name="l08196"></a><span class="lineno"> 8196</span>&#160;    VMA_ASSERT(!m_Stack.empty() &amp;&amp; m_Stack.back().type == COLLECTION_TYPE_ARRAY);</div>
-<div class="line"><a name="l08197"></a><span class="lineno"> 8197</span>&#160;    m_Stack.pop_back();</div>
-<div class="line"><a name="l08198"></a><span class="lineno"> 8198</span>&#160;}</div>
-<div class="line"><a name="l08199"></a><span class="lineno"> 8199</span>&#160; </div>
-<div class="line"><a name="l08200"></a><span class="lineno"> 8200</span>&#160;<span class="keywordtype">void</span> VmaJsonWriter::WriteString(<span class="keyword">const</span> <span class="keywordtype">char</span>* pStr)</div>
-<div class="line"><a name="l08201"></a><span class="lineno"> 8201</span>&#160;{</div>
-<div class="line"><a name="l08202"></a><span class="lineno"> 8202</span>&#160;    BeginString(pStr);</div>
-<div class="line"><a name="l08203"></a><span class="lineno"> 8203</span>&#160;    EndString();</div>
-<div class="line"><a name="l08204"></a><span class="lineno"> 8204</span>&#160;}</div>
-<div class="line"><a name="l08205"></a><span class="lineno"> 8205</span>&#160; </div>
-<div class="line"><a name="l08206"></a><span class="lineno"> 8206</span>&#160;<span class="keywordtype">void</span> VmaJsonWriter::BeginString(<span class="keyword">const</span> <span class="keywordtype">char</span>* pStr)</div>
-<div class="line"><a name="l08207"></a><span class="lineno"> 8207</span>&#160;{</div>
-<div class="line"><a name="l08208"></a><span class="lineno"> 8208</span>&#160;    VMA_ASSERT(!m_InsideString);</div>
-<div class="line"><a name="l08209"></a><span class="lineno"> 8209</span>&#160; </div>
-<div class="line"><a name="l08210"></a><span class="lineno"> 8210</span>&#160;    BeginValue(<span class="keyword">true</span>);</div>
-<div class="line"><a name="l08211"></a><span class="lineno"> 8211</span>&#160;    m_SB.Add(<span class="charliteral">&#39;&quot;&#39;</span>);</div>
-<div class="line"><a name="l08212"></a><span class="lineno"> 8212</span>&#160;    m_InsideString = <span class="keyword">true</span>;</div>
-<div class="line"><a name="l08213"></a><span class="lineno"> 8213</span>&#160;    <span class="keywordflow">if</span>(pStr != VMA_NULL &amp;&amp; pStr[0] != <span class="charliteral">&#39;\0&#39;</span>)</div>
-<div class="line"><a name="l08214"></a><span class="lineno"> 8214</span>&#160;    {</div>
-<div class="line"><a name="l08215"></a><span class="lineno"> 8215</span>&#160;        ContinueString(pStr);</div>
-<div class="line"><a name="l08216"></a><span class="lineno"> 8216</span>&#160;    }</div>
-<div class="line"><a name="l08217"></a><span class="lineno"> 8217</span>&#160;}</div>
-<div class="line"><a name="l08218"></a><span class="lineno"> 8218</span>&#160; </div>
-<div class="line"><a name="l08219"></a><span class="lineno"> 8219</span>&#160;<span class="keywordtype">void</span> VmaJsonWriter::ContinueString(<span class="keyword">const</span> <span class="keywordtype">char</span>* pStr)</div>
-<div class="line"><a name="l08220"></a><span class="lineno"> 8220</span>&#160;{</div>
-<div class="line"><a name="l08221"></a><span class="lineno"> 8221</span>&#160;    VMA_ASSERT(m_InsideString);</div>
-<div class="line"><a name="l08222"></a><span class="lineno"> 8222</span>&#160; </div>
-<div class="line"><a name="l08223"></a><span class="lineno"> 8223</span>&#160;    <span class="keyword">const</span> <span class="keywordtype">size_t</span> strLen = strlen(pStr);</div>
-<div class="line"><a name="l08224"></a><span class="lineno"> 8224</span>&#160;    <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> i = 0; i &lt; strLen; ++i)</div>
-<div class="line"><a name="l08225"></a><span class="lineno"> 8225</span>&#160;    {</div>
-<div class="line"><a name="l08226"></a><span class="lineno"> 8226</span>&#160;        <span class="keywordtype">char</span> ch = pStr[i];</div>
-<div class="line"><a name="l08227"></a><span class="lineno"> 8227</span>&#160;        <span class="keywordflow">if</span>(ch == <span class="charliteral">&#39;\\&#39;</span>)</div>
-<div class="line"><a name="l08228"></a><span class="lineno"> 8228</span>&#160;        {</div>
-<div class="line"><a name="l08229"></a><span class="lineno"> 8229</span>&#160;            m_SB.Add(<span class="stringliteral">&quot;\\\\&quot;</span>);</div>
-<div class="line"><a name="l08230"></a><span class="lineno"> 8230</span>&#160;        }</div>
-<div class="line"><a name="l08231"></a><span class="lineno"> 8231</span>&#160;        <span class="keywordflow">else</span> <span class="keywordflow">if</span>(ch == <span class="charliteral">&#39;&quot;&#39;</span>)</div>
-<div class="line"><a name="l08232"></a><span class="lineno"> 8232</span>&#160;        {</div>
-<div class="line"><a name="l08233"></a><span class="lineno"> 8233</span>&#160;            m_SB.Add(<span class="stringliteral">&quot;\\\&quot;&quot;</span>);</div>
-<div class="line"><a name="l08234"></a><span class="lineno"> 8234</span>&#160;        }</div>
-<div class="line"><a name="l08235"></a><span class="lineno"> 8235</span>&#160;        <span class="keywordflow">else</span> <span class="keywordflow">if</span>(ch &gt;= 32)</div>
-<div class="line"><a name="l08236"></a><span class="lineno"> 8236</span>&#160;        {</div>
-<div class="line"><a name="l08237"></a><span class="lineno"> 8237</span>&#160;            m_SB.Add(ch);</div>
-<div class="line"><a name="l08238"></a><span class="lineno"> 8238</span>&#160;        }</div>
-<div class="line"><a name="l08239"></a><span class="lineno"> 8239</span>&#160;        <span class="keywordflow">else</span> <span class="keywordflow">switch</span>(ch)</div>
-<div class="line"><a name="l08240"></a><span class="lineno"> 8240</span>&#160;        {</div>
-<div class="line"><a name="l08241"></a><span class="lineno"> 8241</span>&#160;        <span class="keywordflow">case</span> <span class="charliteral">&#39;\b&#39;</span>:</div>
-<div class="line"><a name="l08242"></a><span class="lineno"> 8242</span>&#160;            m_SB.Add(<span class="stringliteral">&quot;\\b&quot;</span>);</div>
-<div class="line"><a name="l08243"></a><span class="lineno"> 8243</span>&#160;            <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l08244"></a><span class="lineno"> 8244</span>&#160;        <span class="keywordflow">case</span> <span class="charliteral">&#39;\f&#39;</span>:</div>
-<div class="line"><a name="l08245"></a><span class="lineno"> 8245</span>&#160;            m_SB.Add(<span class="stringliteral">&quot;\\f&quot;</span>);</div>
-<div class="line"><a name="l08246"></a><span class="lineno"> 8246</span>&#160;            <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l08247"></a><span class="lineno"> 8247</span>&#160;        <span class="keywordflow">case</span> <span class="charliteral">&#39;\n&#39;</span>:</div>
-<div class="line"><a name="l08248"></a><span class="lineno"> 8248</span>&#160;            m_SB.Add(<span class="stringliteral">&quot;\\n&quot;</span>);</div>
-<div class="line"><a name="l08249"></a><span class="lineno"> 8249</span>&#160;            <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l08250"></a><span class="lineno"> 8250</span>&#160;        <span class="keywordflow">case</span> <span class="charliteral">&#39;\r&#39;</span>:</div>
-<div class="line"><a name="l08251"></a><span class="lineno"> 8251</span>&#160;            m_SB.Add(<span class="stringliteral">&quot;\\r&quot;</span>);</div>
-<div class="line"><a name="l08252"></a><span class="lineno"> 8252</span>&#160;            <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l08253"></a><span class="lineno"> 8253</span>&#160;        <span class="keywordflow">case</span> <span class="charliteral">&#39;\t&#39;</span>:</div>
-<div class="line"><a name="l08254"></a><span class="lineno"> 8254</span>&#160;            m_SB.Add(<span class="stringliteral">&quot;\\t&quot;</span>);</div>
-<div class="line"><a name="l08255"></a><span class="lineno"> 8255</span>&#160;            <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l08256"></a><span class="lineno"> 8256</span>&#160;        <span class="keywordflow">default</span>:</div>
-<div class="line"><a name="l08257"></a><span class="lineno"> 8257</span>&#160;            VMA_ASSERT(0 &amp;&amp; <span class="stringliteral">&quot;Character not currently supported.&quot;</span>);</div>
-<div class="line"><a name="l08258"></a><span class="lineno"> 8258</span>&#160;            <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l08259"></a><span class="lineno"> 8259</span>&#160;        }</div>
-<div class="line"><a name="l08260"></a><span class="lineno"> 8260</span>&#160;    }</div>
-<div class="line"><a name="l08261"></a><span class="lineno"> 8261</span>&#160;}</div>
-<div class="line"><a name="l08262"></a><span class="lineno"> 8262</span>&#160; </div>
-<div class="line"><a name="l08263"></a><span class="lineno"> 8263</span>&#160;<span class="keywordtype">void</span> VmaJsonWriter::ContinueString(uint32_t n)</div>
-<div class="line"><a name="l08264"></a><span class="lineno"> 8264</span>&#160;{</div>
-<div class="line"><a name="l08265"></a><span class="lineno"> 8265</span>&#160;    VMA_ASSERT(m_InsideString);</div>
-<div class="line"><a name="l08266"></a><span class="lineno"> 8266</span>&#160;    m_SB.AddNumber(n);</div>
-<div class="line"><a name="l08267"></a><span class="lineno"> 8267</span>&#160;}</div>
-<div class="line"><a name="l08268"></a><span class="lineno"> 8268</span>&#160; </div>
-<div class="line"><a name="l08269"></a><span class="lineno"> 8269</span>&#160;<span class="keywordtype">void</span> VmaJsonWriter::ContinueString(uint64_t n)</div>
-<div class="line"><a name="l08270"></a><span class="lineno"> 8270</span>&#160;{</div>
-<div class="line"><a name="l08271"></a><span class="lineno"> 8271</span>&#160;    VMA_ASSERT(m_InsideString);</div>
-<div class="line"><a name="l08272"></a><span class="lineno"> 8272</span>&#160;    m_SB.AddNumber(n);</div>
-<div class="line"><a name="l08273"></a><span class="lineno"> 8273</span>&#160;}</div>
-<div class="line"><a name="l08274"></a><span class="lineno"> 8274</span>&#160; </div>
-<div class="line"><a name="l08275"></a><span class="lineno"> 8275</span>&#160;<span class="keywordtype">void</span> VmaJsonWriter::ContinueString_Pointer(<span class="keyword">const</span> <span class="keywordtype">void</span>* ptr)</div>
-<div class="line"><a name="l08276"></a><span class="lineno"> 8276</span>&#160;{</div>
-<div class="line"><a name="l08277"></a><span class="lineno"> 8277</span>&#160;    VMA_ASSERT(m_InsideString);</div>
-<div class="line"><a name="l08278"></a><span class="lineno"> 8278</span>&#160;    m_SB.AddPointer(ptr);</div>
-<div class="line"><a name="l08279"></a><span class="lineno"> 8279</span>&#160;}</div>
+<div class="line"><a name="l08196"></a><span class="lineno"> 8196</span>&#160;    <span class="keyword">const</span> VkAllocationCallbacks* GetAllocationCallbacks()<span class="keyword"> const</span></div>
+<div class="line"><a name="l08197"></a><span class="lineno"> 8197</span>&#160;<span class="keyword">    </span>{</div>
+<div class="line"><a name="l08198"></a><span class="lineno"> 8198</span>&#160;        <span class="keywordflow">return</span> m_AllocationCallbacksSpecified ? &amp;m_AllocationCallbacks : 0;</div>
+<div class="line"><a name="l08199"></a><span class="lineno"> 8199</span>&#160;    }</div>
+<div class="line"><a name="l08200"></a><span class="lineno"> 8200</span>&#160;    <span class="keyword">const</span> <a class="code" href="struct_vma_vulkan_functions.html">VmaVulkanFunctions</a>&amp; GetVulkanFunctions()<span class="keyword"> const</span></div>
+<div class="line"><a name="l08201"></a><span class="lineno"> 8201</span>&#160;<span class="keyword">    </span>{</div>
+<div class="line"><a name="l08202"></a><span class="lineno"> 8202</span>&#160;        <span class="keywordflow">return</span> m_VulkanFunctions;</div>
+<div class="line"><a name="l08203"></a><span class="lineno"> 8203</span>&#160;    }</div>
+<div class="line"><a name="l08204"></a><span class="lineno"> 8204</span>&#160; </div>
+<div class="line"><a name="l08205"></a><span class="lineno"> 8205</span>&#160;    VkPhysicalDevice GetPhysicalDevice()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_PhysicalDevice; }</div>
+<div class="line"><a name="l08206"></a><span class="lineno"> 8206</span>&#160; </div>
+<div class="line"><a name="l08207"></a><span class="lineno"> 8207</span>&#160;    VkDeviceSize GetBufferImageGranularity()<span class="keyword"> const</span></div>
+<div class="line"><a name="l08208"></a><span class="lineno"> 8208</span>&#160;<span class="keyword">    </span>{</div>
+<div class="line"><a name="l08209"></a><span class="lineno"> 8209</span>&#160;        <span class="keywordflow">return</span> VMA_MAX(</div>
+<div class="line"><a name="l08210"></a><span class="lineno"> 8210</span>&#160;            <span class="keyword">static_cast&lt;</span>VkDeviceSize<span class="keyword">&gt;</span>(VMA_DEBUG_MIN_BUFFER_IMAGE_GRANULARITY),</div>
+<div class="line"><a name="l08211"></a><span class="lineno"> 8211</span>&#160;            m_PhysicalDeviceProperties.limits.bufferImageGranularity);</div>
+<div class="line"><a name="l08212"></a><span class="lineno"> 8212</span>&#160;    }</div>
+<div class="line"><a name="l08213"></a><span class="lineno"> 8213</span>&#160; </div>
+<div class="line"><a name="l08214"></a><span class="lineno"> 8214</span>&#160;    uint32_t GetMemoryHeapCount()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_MemProps.memoryHeapCount; }</div>
+<div class="line"><a name="l08215"></a><span class="lineno"> 8215</span>&#160;    uint32_t GetMemoryTypeCount()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_MemProps.memoryTypeCount; }</div>
+<div class="line"><a name="l08216"></a><span class="lineno"> 8216</span>&#160; </div>
+<div class="line"><a name="l08217"></a><span class="lineno"> 8217</span>&#160;    uint32_t MemoryTypeIndexToHeapIndex(uint32_t memTypeIndex)<span class="keyword"> const</span></div>
+<div class="line"><a name="l08218"></a><span class="lineno"> 8218</span>&#160;<span class="keyword">    </span>{</div>
+<div class="line"><a name="l08219"></a><span class="lineno"> 8219</span>&#160;        VMA_ASSERT(memTypeIndex &lt; m_MemProps.memoryTypeCount);</div>
+<div class="line"><a name="l08220"></a><span class="lineno"> 8220</span>&#160;        <span class="keywordflow">return</span> m_MemProps.memoryTypes[memTypeIndex].heapIndex;</div>
+<div class="line"><a name="l08221"></a><span class="lineno"> 8221</span>&#160;    }</div>
+<div class="line"><a name="l08222"></a><span class="lineno"> 8222</span>&#160;    <span class="comment">// True when specific memory type is HOST_VISIBLE but not HOST_COHERENT.</span></div>
+<div class="line"><a name="l08223"></a><span class="lineno"> 8223</span>&#160;    <span class="keywordtype">bool</span> IsMemoryTypeNonCoherent(uint32_t memTypeIndex)<span class="keyword"> const</span></div>
+<div class="line"><a name="l08224"></a><span class="lineno"> 8224</span>&#160;<span class="keyword">    </span>{</div>
+<div class="line"><a name="l08225"></a><span class="lineno"> 8225</span>&#160;        <span class="keywordflow">return</span> (m_MemProps.memoryTypes[memTypeIndex].propertyFlags &amp; (VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT)) ==</div>
+<div class="line"><a name="l08226"></a><span class="lineno"> 8226</span>&#160;            VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;</div>
+<div class="line"><a name="l08227"></a><span class="lineno"> 8227</span>&#160;    }</div>
+<div class="line"><a name="l08228"></a><span class="lineno"> 8228</span>&#160;    <span class="comment">// Minimum alignment for all allocations in specific memory type.</span></div>
+<div class="line"><a name="l08229"></a><span class="lineno"> 8229</span>&#160;    VkDeviceSize GetMemoryTypeMinAlignment(uint32_t memTypeIndex)<span class="keyword"> const</span></div>
+<div class="line"><a name="l08230"></a><span class="lineno"> 8230</span>&#160;<span class="keyword">    </span>{</div>
+<div class="line"><a name="l08231"></a><span class="lineno"> 8231</span>&#160;        <span class="keywordflow">return</span> IsMemoryTypeNonCoherent(memTypeIndex) ?</div>
+<div class="line"><a name="l08232"></a><span class="lineno"> 8232</span>&#160;            VMA_MAX((VkDeviceSize)VMA_DEBUG_ALIGNMENT, m_PhysicalDeviceProperties.limits.nonCoherentAtomSize) :</div>
+<div class="line"><a name="l08233"></a><span class="lineno"> 8233</span>&#160;            (VkDeviceSize)VMA_DEBUG_ALIGNMENT;</div>
+<div class="line"><a name="l08234"></a><span class="lineno"> 8234</span>&#160;    }</div>
+<div class="line"><a name="l08235"></a><span class="lineno"> 8235</span>&#160; </div>
+<div class="line"><a name="l08236"></a><span class="lineno"> 8236</span>&#160;    <span class="keywordtype">bool</span> IsIntegratedGpu()<span class="keyword"> const</span></div>
+<div class="line"><a name="l08237"></a><span class="lineno"> 8237</span>&#160;<span class="keyword">    </span>{</div>
+<div class="line"><a name="l08238"></a><span class="lineno"> 8238</span>&#160;        <span class="keywordflow">return</span> m_PhysicalDeviceProperties.deviceType == VK_PHYSICAL_DEVICE_TYPE_INTEGRATED_GPU;</div>
+<div class="line"><a name="l08239"></a><span class="lineno"> 8239</span>&#160;    }</div>
+<div class="line"><a name="l08240"></a><span class="lineno"> 8240</span>&#160; </div>
+<div class="line"><a name="l08241"></a><span class="lineno"> 8241</span>&#160;    uint32_t GetGlobalMemoryTypeBits()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_GlobalMemoryTypeBits; }</div>
+<div class="line"><a name="l08242"></a><span class="lineno"> 8242</span>&#160; </div>
+<div class="line"><a name="l08243"></a><span class="lineno"> 8243</span>&#160;<span class="preprocessor">#if VMA_RECORDING_ENABLED</span></div>
+<div class="line"><a name="l08244"></a><span class="lineno"> 8244</span>&#160;    VmaRecorder* GetRecorder()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_pRecorder; }</div>
+<div class="line"><a name="l08245"></a><span class="lineno"> 8245</span>&#160;<span class="preprocessor">#endif</span></div>
+<div class="line"><a name="l08246"></a><span class="lineno"> 8246</span>&#160; </div>
+<div class="line"><a name="l08247"></a><span class="lineno"> 8247</span>&#160;    <span class="keywordtype">void</span> GetBufferMemoryRequirements(</div>
+<div class="line"><a name="l08248"></a><span class="lineno"> 8248</span>&#160;        VkBuffer hBuffer,</div>
+<div class="line"><a name="l08249"></a><span class="lineno"> 8249</span>&#160;        VkMemoryRequirements&amp; memReq,</div>
+<div class="line"><a name="l08250"></a><span class="lineno"> 8250</span>&#160;        <span class="keywordtype">bool</span>&amp; requiresDedicatedAllocation,</div>
+<div class="line"><a name="l08251"></a><span class="lineno"> 8251</span>&#160;        <span class="keywordtype">bool</span>&amp; prefersDedicatedAllocation) <span class="keyword">const</span>;</div>
+<div class="line"><a name="l08252"></a><span class="lineno"> 8252</span>&#160;    <span class="keywordtype">void</span> GetImageMemoryRequirements(</div>
+<div class="line"><a name="l08253"></a><span class="lineno"> 8253</span>&#160;        VkImage hImage,</div>
+<div class="line"><a name="l08254"></a><span class="lineno"> 8254</span>&#160;        VkMemoryRequirements&amp; memReq,</div>
+<div class="line"><a name="l08255"></a><span class="lineno"> 8255</span>&#160;        <span class="keywordtype">bool</span>&amp; requiresDedicatedAllocation,</div>
+<div class="line"><a name="l08256"></a><span class="lineno"> 8256</span>&#160;        <span class="keywordtype">bool</span>&amp; prefersDedicatedAllocation) <span class="keyword">const</span>;</div>
+<div class="line"><a name="l08257"></a><span class="lineno"> 8257</span>&#160; </div>
+<div class="line"><a name="l08258"></a><span class="lineno"> 8258</span>&#160;    <span class="comment">// Main allocation function.</span></div>
+<div class="line"><a name="l08259"></a><span class="lineno"> 8259</span>&#160;    VkResult AllocateMemory(</div>
+<div class="line"><a name="l08260"></a><span class="lineno"> 8260</span>&#160;        <span class="keyword">const</span> VkMemoryRequirements&amp; vkMemReq,</div>
+<div class="line"><a name="l08261"></a><span class="lineno"> 8261</span>&#160;        <span class="keywordtype">bool</span> requiresDedicatedAllocation,</div>
+<div class="line"><a name="l08262"></a><span class="lineno"> 8262</span>&#160;        <span class="keywordtype">bool</span> prefersDedicatedAllocation,</div>
+<div class="line"><a name="l08263"></a><span class="lineno"> 8263</span>&#160;        VkBuffer dedicatedBuffer,</div>
+<div class="line"><a name="l08264"></a><span class="lineno"> 8264</span>&#160;        VkBufferUsageFlags dedicatedBufferUsage, <span class="comment">// UINT32_MAX when unknown.</span></div>
+<div class="line"><a name="l08265"></a><span class="lineno"> 8265</span>&#160;        VkImage dedicatedImage,</div>
+<div class="line"><a name="l08266"></a><span class="lineno"> 8266</span>&#160;        <span class="keyword">const</span> <a class="code" href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a>&amp; createInfo,</div>
+<div class="line"><a name="l08267"></a><span class="lineno"> 8267</span>&#160;        VmaSuballocationType suballocType,</div>
+<div class="line"><a name="l08268"></a><span class="lineno"> 8268</span>&#160;        <span class="keywordtype">size_t</span> allocationCount,</div>
+<div class="line"><a name="l08269"></a><span class="lineno"> 8269</span>&#160;        <a class="code" href="struct_vma_allocation.html">VmaAllocation</a>* pAllocations);</div>
+<div class="line"><a name="l08270"></a><span class="lineno"> 8270</span>&#160; </div>
+<div class="line"><a name="l08271"></a><span class="lineno"> 8271</span>&#160;    <span class="comment">// Main deallocation function.</span></div>
+<div class="line"><a name="l08272"></a><span class="lineno"> 8272</span>&#160;    <span class="keywordtype">void</span> FreeMemory(</div>
+<div class="line"><a name="l08273"></a><span class="lineno"> 8273</span>&#160;        <span class="keywordtype">size_t</span> allocationCount,</div>
+<div class="line"><a name="l08274"></a><span class="lineno"> 8274</span>&#160;        <span class="keyword">const</span> <a class="code" href="struct_vma_allocation.html">VmaAllocation</a>* pAllocations);</div>
+<div class="line"><a name="l08275"></a><span class="lineno"> 8275</span>&#160; </div>
+<div class="line"><a name="l08276"></a><span class="lineno"> 8276</span>&#160;    <span class="keywordtype">void</span> CalculateStats(<a class="code" href="struct_vma_stats.html">VmaStats</a>* pStats);</div>
+<div class="line"><a name="l08277"></a><span class="lineno"> 8277</span>&#160; </div>
+<div class="line"><a name="l08278"></a><span class="lineno"> 8278</span>&#160;    <span class="keywordtype">void</span> GetBudget(</div>
+<div class="line"><a name="l08279"></a><span class="lineno"> 8279</span>&#160;        <a class="code" href="struct_vma_budget.html">VmaBudget</a>* outBudget, uint32_t firstHeap, uint32_t heapCount);</div>
 <div class="line"><a name="l08280"></a><span class="lineno"> 8280</span>&#160; </div>
-<div class="line"><a name="l08281"></a><span class="lineno"> 8281</span>&#160;<span class="keywordtype">void</span> VmaJsonWriter::EndString(<span class="keyword">const</span> <span class="keywordtype">char</span>* pStr)</div>
-<div class="line"><a name="l08282"></a><span class="lineno"> 8282</span>&#160;{</div>
-<div class="line"><a name="l08283"></a><span class="lineno"> 8283</span>&#160;    VMA_ASSERT(m_InsideString);</div>
-<div class="line"><a name="l08284"></a><span class="lineno"> 8284</span>&#160;    <span class="keywordflow">if</span>(pStr != VMA_NULL &amp;&amp; pStr[0] != <span class="charliteral">&#39;\0&#39;</span>)</div>
-<div class="line"><a name="l08285"></a><span class="lineno"> 8285</span>&#160;    {</div>
-<div class="line"><a name="l08286"></a><span class="lineno"> 8286</span>&#160;        ContinueString(pStr);</div>
-<div class="line"><a name="l08287"></a><span class="lineno"> 8287</span>&#160;    }</div>
-<div class="line"><a name="l08288"></a><span class="lineno"> 8288</span>&#160;    m_SB.Add(<span class="charliteral">&#39;&quot;&#39;</span>);</div>
-<div class="line"><a name="l08289"></a><span class="lineno"> 8289</span>&#160;    m_InsideString = <span class="keyword">false</span>;</div>
-<div class="line"><a name="l08290"></a><span class="lineno"> 8290</span>&#160;}</div>
+<div class="line"><a name="l08281"></a><span class="lineno"> 8281</span>&#160;<span class="preprocessor">#if VMA_STATS_STRING_ENABLED</span></div>
+<div class="line"><a name="l08282"></a><span class="lineno"> 8282</span>&#160;    <span class="keywordtype">void</span> PrintDetailedMap(<span class="keyword">class</span> VmaJsonWriter&amp; json);</div>
+<div class="line"><a name="l08283"></a><span class="lineno"> 8283</span>&#160;<span class="preprocessor">#endif</span></div>
+<div class="line"><a name="l08284"></a><span class="lineno"> 8284</span>&#160; </div>
+<div class="line"><a name="l08285"></a><span class="lineno"> 8285</span>&#160;    VkResult DefragmentationBegin(</div>
+<div class="line"><a name="l08286"></a><span class="lineno"> 8286</span>&#160;        <span class="keyword">const</span> <a class="code" href="struct_vma_defragmentation_info2.html">VmaDefragmentationInfo2</a>&amp; info,</div>
+<div class="line"><a name="l08287"></a><span class="lineno"> 8287</span>&#160;        <a class="code" href="struct_vma_defragmentation_stats.html">VmaDefragmentationStats</a>* pStats,</div>
+<div class="line"><a name="l08288"></a><span class="lineno"> 8288</span>&#160;        <a class="code" href="struct_vma_defragmentation_context.html">VmaDefragmentationContext</a>* pContext);</div>
+<div class="line"><a name="l08289"></a><span class="lineno"> 8289</span>&#160;    VkResult DefragmentationEnd(</div>
+<div class="line"><a name="l08290"></a><span class="lineno"> 8290</span>&#160;        <a class="code" href="struct_vma_defragmentation_context.html">VmaDefragmentationContext</a> context);</div>
 <div class="line"><a name="l08291"></a><span class="lineno"> 8291</span>&#160; </div>
-<div class="line"><a name="l08292"></a><span class="lineno"> 8292</span>&#160;<span class="keywordtype">void</span> VmaJsonWriter::WriteNumber(uint32_t n)</div>
-<div class="line"><a name="l08293"></a><span class="lineno"> 8293</span>&#160;{</div>
-<div class="line"><a name="l08294"></a><span class="lineno"> 8294</span>&#160;    VMA_ASSERT(!m_InsideString);</div>
-<div class="line"><a name="l08295"></a><span class="lineno"> 8295</span>&#160;    BeginValue(<span class="keyword">false</span>);</div>
-<div class="line"><a name="l08296"></a><span class="lineno"> 8296</span>&#160;    m_SB.AddNumber(n);</div>
-<div class="line"><a name="l08297"></a><span class="lineno"> 8297</span>&#160;}</div>
-<div class="line"><a name="l08298"></a><span class="lineno"> 8298</span>&#160; </div>
-<div class="line"><a name="l08299"></a><span class="lineno"> 8299</span>&#160;<span class="keywordtype">void</span> VmaJsonWriter::WriteNumber(uint64_t n)</div>
-<div class="line"><a name="l08300"></a><span class="lineno"> 8300</span>&#160;{</div>
-<div class="line"><a name="l08301"></a><span class="lineno"> 8301</span>&#160;    VMA_ASSERT(!m_InsideString);</div>
-<div class="line"><a name="l08302"></a><span class="lineno"> 8302</span>&#160;    BeginValue(<span class="keyword">false</span>);</div>
-<div class="line"><a name="l08303"></a><span class="lineno"> 8303</span>&#160;    m_SB.AddNumber(n);</div>
-<div class="line"><a name="l08304"></a><span class="lineno"> 8304</span>&#160;}</div>
-<div class="line"><a name="l08305"></a><span class="lineno"> 8305</span>&#160; </div>
-<div class="line"><a name="l08306"></a><span class="lineno"> 8306</span>&#160;<span class="keywordtype">void</span> VmaJsonWriter::WriteBool(<span class="keywordtype">bool</span> b)</div>
-<div class="line"><a name="l08307"></a><span class="lineno"> 8307</span>&#160;{</div>
-<div class="line"><a name="l08308"></a><span class="lineno"> 8308</span>&#160;    VMA_ASSERT(!m_InsideString);</div>
-<div class="line"><a name="l08309"></a><span class="lineno"> 8309</span>&#160;    BeginValue(<span class="keyword">false</span>);</div>
-<div class="line"><a name="l08310"></a><span class="lineno"> 8310</span>&#160;    m_SB.Add(b ? <span class="stringliteral">&quot;true&quot;</span> : <span class="stringliteral">&quot;false&quot;</span>);</div>
-<div class="line"><a name="l08311"></a><span class="lineno"> 8311</span>&#160;}</div>
-<div class="line"><a name="l08312"></a><span class="lineno"> 8312</span>&#160; </div>
-<div class="line"><a name="l08313"></a><span class="lineno"> 8313</span>&#160;<span class="keywordtype">void</span> VmaJsonWriter::WriteNull()</div>
-<div class="line"><a name="l08314"></a><span class="lineno"> 8314</span>&#160;{</div>
-<div class="line"><a name="l08315"></a><span class="lineno"> 8315</span>&#160;    VMA_ASSERT(!m_InsideString);</div>
-<div class="line"><a name="l08316"></a><span class="lineno"> 8316</span>&#160;    BeginValue(<span class="keyword">false</span>);</div>
-<div class="line"><a name="l08317"></a><span class="lineno"> 8317</span>&#160;    m_SB.Add(<span class="stringliteral">&quot;null&quot;</span>);</div>
-<div class="line"><a name="l08318"></a><span class="lineno"> 8318</span>&#160;}</div>
-<div class="line"><a name="l08319"></a><span class="lineno"> 8319</span>&#160; </div>
-<div class="line"><a name="l08320"></a><span class="lineno"> 8320</span>&#160;<span class="keywordtype">void</span> VmaJsonWriter::BeginValue(<span class="keywordtype">bool</span> isString)</div>
-<div class="line"><a name="l08321"></a><span class="lineno"> 8321</span>&#160;{</div>
-<div class="line"><a name="l08322"></a><span class="lineno"> 8322</span>&#160;    <span class="keywordflow">if</span>(!m_Stack.empty())</div>
-<div class="line"><a name="l08323"></a><span class="lineno"> 8323</span>&#160;    {</div>
-<div class="line"><a name="l08324"></a><span class="lineno"> 8324</span>&#160;        StackItem&amp; currItem = m_Stack.back();</div>
-<div class="line"><a name="l08325"></a><span class="lineno"> 8325</span>&#160;        <span class="keywordflow">if</span>(currItem.type == COLLECTION_TYPE_OBJECT &amp;&amp;</div>
-<div class="line"><a name="l08326"></a><span class="lineno"> 8326</span>&#160;            currItem.valueCount % 2 == 0)</div>
-<div class="line"><a name="l08327"></a><span class="lineno"> 8327</span>&#160;        {</div>
-<div class="line"><a name="l08328"></a><span class="lineno"> 8328</span>&#160;            VMA_ASSERT(isString);</div>
-<div class="line"><a name="l08329"></a><span class="lineno"> 8329</span>&#160;        }</div>
-<div class="line"><a name="l08330"></a><span class="lineno"> 8330</span>&#160; </div>
-<div class="line"><a name="l08331"></a><span class="lineno"> 8331</span>&#160;        <span class="keywordflow">if</span>(currItem.type == COLLECTION_TYPE_OBJECT &amp;&amp;</div>
-<div class="line"><a name="l08332"></a><span class="lineno"> 8332</span>&#160;            currItem.valueCount % 2 != 0)</div>
-<div class="line"><a name="l08333"></a><span class="lineno"> 8333</span>&#160;        {</div>
-<div class="line"><a name="l08334"></a><span class="lineno"> 8334</span>&#160;            m_SB.Add(<span class="stringliteral">&quot;: &quot;</span>);</div>
-<div class="line"><a name="l08335"></a><span class="lineno"> 8335</span>&#160;        }</div>
-<div class="line"><a name="l08336"></a><span class="lineno"> 8336</span>&#160;        <span class="keywordflow">else</span> <span class="keywordflow">if</span>(currItem.valueCount &gt; 0)</div>
-<div class="line"><a name="l08337"></a><span class="lineno"> 8337</span>&#160;        {</div>
-<div class="line"><a name="l08338"></a><span class="lineno"> 8338</span>&#160;            m_SB.Add(<span class="stringliteral">&quot;, &quot;</span>);</div>
-<div class="line"><a name="l08339"></a><span class="lineno"> 8339</span>&#160;            WriteIndent();</div>
-<div class="line"><a name="l08340"></a><span class="lineno"> 8340</span>&#160;        }</div>
-<div class="line"><a name="l08341"></a><span class="lineno"> 8341</span>&#160;        <span class="keywordflow">else</span></div>
-<div class="line"><a name="l08342"></a><span class="lineno"> 8342</span>&#160;        {</div>
-<div class="line"><a name="l08343"></a><span class="lineno"> 8343</span>&#160;            WriteIndent();</div>
-<div class="line"><a name="l08344"></a><span class="lineno"> 8344</span>&#160;        }</div>
-<div class="line"><a name="l08345"></a><span class="lineno"> 8345</span>&#160;        ++currItem.valueCount;</div>
-<div class="line"><a name="l08346"></a><span class="lineno"> 8346</span>&#160;    }</div>
-<div class="line"><a name="l08347"></a><span class="lineno"> 8347</span>&#160;}</div>
-<div class="line"><a name="l08348"></a><span class="lineno"> 8348</span>&#160; </div>
-<div class="line"><a name="l08349"></a><span class="lineno"> 8349</span>&#160;<span class="keywordtype">void</span> VmaJsonWriter::WriteIndent(<span class="keywordtype">bool</span> oneLess)</div>
-<div class="line"><a name="l08350"></a><span class="lineno"> 8350</span>&#160;{</div>
-<div class="line"><a name="l08351"></a><span class="lineno"> 8351</span>&#160;    <span class="keywordflow">if</span>(!m_Stack.empty() &amp;&amp; !m_Stack.back().singleLineMode)</div>
-<div class="line"><a name="l08352"></a><span class="lineno"> 8352</span>&#160;    {</div>
-<div class="line"><a name="l08353"></a><span class="lineno"> 8353</span>&#160;        m_SB.AddNewLine();</div>
-<div class="line"><a name="l08354"></a><span class="lineno"> 8354</span>&#160;        </div>
-<div class="line"><a name="l08355"></a><span class="lineno"> 8355</span>&#160;        <span class="keywordtype">size_t</span> count = m_Stack.size();</div>
-<div class="line"><a name="l08356"></a><span class="lineno"> 8356</span>&#160;        <span class="keywordflow">if</span>(count &gt; 0 &amp;&amp; oneLess)</div>
-<div class="line"><a name="l08357"></a><span class="lineno"> 8357</span>&#160;        {</div>
-<div class="line"><a name="l08358"></a><span class="lineno"> 8358</span>&#160;            --count;</div>
-<div class="line"><a name="l08359"></a><span class="lineno"> 8359</span>&#160;        }</div>
-<div class="line"><a name="l08360"></a><span class="lineno"> 8360</span>&#160;        <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> i = 0; i &lt; count; ++i)</div>
-<div class="line"><a name="l08361"></a><span class="lineno"> 8361</span>&#160;        {</div>
-<div class="line"><a name="l08362"></a><span class="lineno"> 8362</span>&#160;            m_SB.Add(INDENT);</div>
-<div class="line"><a name="l08363"></a><span class="lineno"> 8363</span>&#160;        }</div>
-<div class="line"><a name="l08364"></a><span class="lineno"> 8364</span>&#160;    }</div>
-<div class="line"><a name="l08365"></a><span class="lineno"> 8365</span>&#160;}</div>
-<div class="line"><a name="l08366"></a><span class="lineno"> 8366</span>&#160; </div>
-<div class="line"><a name="l08367"></a><span class="lineno"> 8367</span>&#160;<span class="preprocessor">#endif // #if VMA_STATS_STRING_ENABLED</span></div>
-<div class="line"><a name="l08368"></a><span class="lineno"> 8368</span>&#160; </div>
-<div class="line"><a name="l08370"></a><span class="lineno"> 8370</span>&#160; </div>
-<div class="line"><a name="l08371"></a><span class="lineno"> 8371</span>&#160;<span class="keywordtype">void</span> VmaAllocation_T::SetUserData(<a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator, <span class="keywordtype">void</span>* pUserData)</div>
-<div class="line"><a name="l08372"></a><span class="lineno"> 8372</span>&#160;{</div>
-<div class="line"><a name="l08373"></a><span class="lineno"> 8373</span>&#160;    <span class="keywordflow">if</span>(IsUserDataString())</div>
-<div class="line"><a name="l08374"></a><span class="lineno"> 8374</span>&#160;    {</div>
-<div class="line"><a name="l08375"></a><span class="lineno"> 8375</span>&#160;        VMA_ASSERT(pUserData == VMA_NULL || pUserData != m_pUserData);</div>
-<div class="line"><a name="l08376"></a><span class="lineno"> 8376</span>&#160; </div>
-<div class="line"><a name="l08377"></a><span class="lineno"> 8377</span>&#160;        FreeUserDataString(hAllocator);</div>
-<div class="line"><a name="l08378"></a><span class="lineno"> 8378</span>&#160; </div>
-<div class="line"><a name="l08379"></a><span class="lineno"> 8379</span>&#160;        <span class="keywordflow">if</span>(pUserData != VMA_NULL)</div>
-<div class="line"><a name="l08380"></a><span class="lineno"> 8380</span>&#160;        {</div>
-<div class="line"><a name="l08381"></a><span class="lineno"> 8381</span>&#160;            m_pUserData = VmaCreateStringCopy(hAllocator-&gt;GetAllocationCallbacks(), (<span class="keyword">const</span> <span class="keywordtype">char</span>*)pUserData);</div>
-<div class="line"><a name="l08382"></a><span class="lineno"> 8382</span>&#160;        }</div>
-<div class="line"><a name="l08383"></a><span class="lineno"> 8383</span>&#160;    }</div>
-<div class="line"><a name="l08384"></a><span class="lineno"> 8384</span>&#160;    <span class="keywordflow">else</span></div>
-<div class="line"><a name="l08385"></a><span class="lineno"> 8385</span>&#160;    {</div>
-<div class="line"><a name="l08386"></a><span class="lineno"> 8386</span>&#160;        m_pUserData = pUserData;</div>
-<div class="line"><a name="l08387"></a><span class="lineno"> 8387</span>&#160;    }</div>
-<div class="line"><a name="l08388"></a><span class="lineno"> 8388</span>&#160;}</div>
-<div class="line"><a name="l08389"></a><span class="lineno"> 8389</span>&#160; </div>
-<div class="line"><a name="l08390"></a><span class="lineno"> 8390</span>&#160;<span class="keywordtype">void</span> VmaAllocation_T::ChangeBlockAllocation(</div>
-<div class="line"><a name="l08391"></a><span class="lineno"> 8391</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator,</div>
-<div class="line"><a name="l08392"></a><span class="lineno"> 8392</span>&#160;    VmaDeviceMemoryBlock* block,</div>
-<div class="line"><a name="l08393"></a><span class="lineno"> 8393</span>&#160;    VkDeviceSize offset)</div>
-<div class="line"><a name="l08394"></a><span class="lineno"> 8394</span>&#160;{</div>
-<div class="line"><a name="l08395"></a><span class="lineno"> 8395</span>&#160;    VMA_ASSERT(block != VMA_NULL);</div>
-<div class="line"><a name="l08396"></a><span class="lineno"> 8396</span>&#160;    VMA_ASSERT(m_Type == ALLOCATION_TYPE_BLOCK);</div>
-<div class="line"><a name="l08397"></a><span class="lineno"> 8397</span>&#160; </div>
-<div class="line"><a name="l08398"></a><span class="lineno"> 8398</span>&#160;    <span class="comment">// Move mapping reference counter from old block to new block.</span></div>
-<div class="line"><a name="l08399"></a><span class="lineno"> 8399</span>&#160;    <span class="keywordflow">if</span>(block != m_BlockAllocation.m_Block)</div>
-<div class="line"><a name="l08400"></a><span class="lineno"> 8400</span>&#160;    {</div>
-<div class="line"><a name="l08401"></a><span class="lineno"> 8401</span>&#160;        uint32_t mapRefCount = m_MapCount &amp; ~MAP_COUNT_FLAG_PERSISTENT_MAP;</div>
-<div class="line"><a name="l08402"></a><span class="lineno"> 8402</span>&#160;        <span class="keywordflow">if</span>(IsPersistentMap())</div>
-<div class="line"><a name="l08403"></a><span class="lineno"> 8403</span>&#160;            ++mapRefCount;</div>
-<div class="line"><a name="l08404"></a><span class="lineno"> 8404</span>&#160;        m_BlockAllocation.m_Block-&gt;Unmap(hAllocator, mapRefCount);</div>
-<div class="line"><a name="l08405"></a><span class="lineno"> 8405</span>&#160;        block-&gt;Map(hAllocator, mapRefCount, VMA_NULL);</div>
-<div class="line"><a name="l08406"></a><span class="lineno"> 8406</span>&#160;    }</div>
-<div class="line"><a name="l08407"></a><span class="lineno"> 8407</span>&#160; </div>
-<div class="line"><a name="l08408"></a><span class="lineno"> 8408</span>&#160;    m_BlockAllocation.m_Block = block;</div>
-<div class="line"><a name="l08409"></a><span class="lineno"> 8409</span>&#160;    m_BlockAllocation.m_Offset = offset;</div>
-<div class="line"><a name="l08410"></a><span class="lineno"> 8410</span>&#160;}</div>
-<div class="line"><a name="l08411"></a><span class="lineno"> 8411</span>&#160; </div>
-<div class="line"><a name="l08412"></a><span class="lineno"> 8412</span>&#160;<span class="keywordtype">void</span> VmaAllocation_T::ChangeOffset(VkDeviceSize newOffset)</div>
-<div class="line"><a name="l08413"></a><span class="lineno"> 8413</span>&#160;{</div>
-<div class="line"><a name="l08414"></a><span class="lineno"> 8414</span>&#160;    VMA_ASSERT(m_Type == ALLOCATION_TYPE_BLOCK);</div>
-<div class="line"><a name="l08415"></a><span class="lineno"> 8415</span>&#160;    m_BlockAllocation.m_Offset = newOffset;</div>
-<div class="line"><a name="l08416"></a><span class="lineno"> 8416</span>&#160;}</div>
-<div class="line"><a name="l08417"></a><span class="lineno"> 8417</span>&#160; </div>
-<div class="line"><a name="l08418"></a><span class="lineno"> 8418</span>&#160;VkDeviceSize VmaAllocation_T::GetOffset()<span class="keyword"> const</span></div>
-<div class="line"><a name="l08419"></a><span class="lineno"> 8419</span>&#160;<span class="keyword"></span>{</div>
-<div class="line"><a name="l08420"></a><span class="lineno"> 8420</span>&#160;    <span class="keywordflow">switch</span>(m_Type)</div>
-<div class="line"><a name="l08421"></a><span class="lineno"> 8421</span>&#160;    {</div>
-<div class="line"><a name="l08422"></a><span class="lineno"> 8422</span>&#160;    <span class="keywordflow">case</span> ALLOCATION_TYPE_BLOCK:</div>
-<div class="line"><a name="l08423"></a><span class="lineno"> 8423</span>&#160;        <span class="keywordflow">return</span> m_BlockAllocation.m_Offset;</div>
-<div class="line"><a name="l08424"></a><span class="lineno"> 8424</span>&#160;    <span class="keywordflow">case</span> ALLOCATION_TYPE_DEDICATED:</div>
-<div class="line"><a name="l08425"></a><span class="lineno"> 8425</span>&#160;        <span class="keywordflow">return</span> 0;</div>
-<div class="line"><a name="l08426"></a><span class="lineno"> 8426</span>&#160;    <span class="keywordflow">default</span>:</div>
-<div class="line"><a name="l08427"></a><span class="lineno"> 8427</span>&#160;        VMA_ASSERT(0);</div>
-<div class="line"><a name="l08428"></a><span class="lineno"> 8428</span>&#160;        <span class="keywordflow">return</span> 0;</div>
-<div class="line"><a name="l08429"></a><span class="lineno"> 8429</span>&#160;    }</div>
-<div class="line"><a name="l08430"></a><span class="lineno"> 8430</span>&#160;}</div>
-<div class="line"><a name="l08431"></a><span class="lineno"> 8431</span>&#160; </div>
-<div class="line"><a name="l08432"></a><span class="lineno"> 8432</span>&#160;VkDeviceMemory VmaAllocation_T::GetMemory()<span class="keyword"> const</span></div>
-<div class="line"><a name="l08433"></a><span class="lineno"> 8433</span>&#160;<span class="keyword"></span>{</div>
-<div class="line"><a name="l08434"></a><span class="lineno"> 8434</span>&#160;    <span class="keywordflow">switch</span>(m_Type)</div>
-<div class="line"><a name="l08435"></a><span class="lineno"> 8435</span>&#160;    {</div>
-<div class="line"><a name="l08436"></a><span class="lineno"> 8436</span>&#160;    <span class="keywordflow">case</span> ALLOCATION_TYPE_BLOCK:</div>
-<div class="line"><a name="l08437"></a><span class="lineno"> 8437</span>&#160;        <span class="keywordflow">return</span> m_BlockAllocation.m_Block-&gt;GetDeviceMemory();</div>
-<div class="line"><a name="l08438"></a><span class="lineno"> 8438</span>&#160;    <span class="keywordflow">case</span> ALLOCATION_TYPE_DEDICATED:</div>
-<div class="line"><a name="l08439"></a><span class="lineno"> 8439</span>&#160;        <span class="keywordflow">return</span> m_DedicatedAllocation.m_hMemory;</div>
-<div class="line"><a name="l08440"></a><span class="lineno"> 8440</span>&#160;    <span class="keywordflow">default</span>:</div>
-<div class="line"><a name="l08441"></a><span class="lineno"> 8441</span>&#160;        VMA_ASSERT(0);</div>
-<div class="line"><a name="l08442"></a><span class="lineno"> 8442</span>&#160;        <span class="keywordflow">return</span> VK_NULL_HANDLE;</div>
-<div class="line"><a name="l08443"></a><span class="lineno"> 8443</span>&#160;    }</div>
-<div class="line"><a name="l08444"></a><span class="lineno"> 8444</span>&#160;}</div>
-<div class="line"><a name="l08445"></a><span class="lineno"> 8445</span>&#160; </div>
-<div class="line"><a name="l08446"></a><span class="lineno"> 8446</span>&#160;<span class="keywordtype">void</span>* VmaAllocation_T::GetMappedData()<span class="keyword"> const</span></div>
-<div class="line"><a name="l08447"></a><span class="lineno"> 8447</span>&#160;<span class="keyword"></span>{</div>
-<div class="line"><a name="l08448"></a><span class="lineno"> 8448</span>&#160;    <span class="keywordflow">switch</span>(m_Type)</div>
-<div class="line"><a name="l08449"></a><span class="lineno"> 8449</span>&#160;    {</div>
-<div class="line"><a name="l08450"></a><span class="lineno"> 8450</span>&#160;    <span class="keywordflow">case</span> ALLOCATION_TYPE_BLOCK:</div>
-<div class="line"><a name="l08451"></a><span class="lineno"> 8451</span>&#160;        <span class="keywordflow">if</span>(m_MapCount != 0)</div>
-<div class="line"><a name="l08452"></a><span class="lineno"> 8452</span>&#160;        {</div>
-<div class="line"><a name="l08453"></a><span class="lineno"> 8453</span>&#160;            <span class="keywordtype">void</span>* pBlockData = m_BlockAllocation.m_Block-&gt;GetMappedData();</div>
-<div class="line"><a name="l08454"></a><span class="lineno"> 8454</span>&#160;            VMA_ASSERT(pBlockData != VMA_NULL);</div>
-<div class="line"><a name="l08455"></a><span class="lineno"> 8455</span>&#160;            <span class="keywordflow">return</span> (<span class="keywordtype">char</span>*)pBlockData + m_BlockAllocation.m_Offset;</div>
-<div class="line"><a name="l08456"></a><span class="lineno"> 8456</span>&#160;        }</div>
-<div class="line"><a name="l08457"></a><span class="lineno"> 8457</span>&#160;        <span class="keywordflow">else</span></div>
-<div class="line"><a name="l08458"></a><span class="lineno"> 8458</span>&#160;        {</div>
-<div class="line"><a name="l08459"></a><span class="lineno"> 8459</span>&#160;            <span class="keywordflow">return</span> VMA_NULL;</div>
-<div class="line"><a name="l08460"></a><span class="lineno"> 8460</span>&#160;        }</div>
-<div class="line"><a name="l08461"></a><span class="lineno"> 8461</span>&#160;        <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l08462"></a><span class="lineno"> 8462</span>&#160;    <span class="keywordflow">case</span> ALLOCATION_TYPE_DEDICATED:</div>
-<div class="line"><a name="l08463"></a><span class="lineno"> 8463</span>&#160;        VMA_ASSERT((m_DedicatedAllocation.m_pMappedData != VMA_NULL) == (m_MapCount != 0));</div>
-<div class="line"><a name="l08464"></a><span class="lineno"> 8464</span>&#160;        <span class="keywordflow">return</span> m_DedicatedAllocation.m_pMappedData;</div>
-<div class="line"><a name="l08465"></a><span class="lineno"> 8465</span>&#160;    <span class="keywordflow">default</span>:</div>
-<div class="line"><a name="l08466"></a><span class="lineno"> 8466</span>&#160;        VMA_ASSERT(0);</div>
-<div class="line"><a name="l08467"></a><span class="lineno"> 8467</span>&#160;        <span class="keywordflow">return</span> VMA_NULL;</div>
-<div class="line"><a name="l08468"></a><span class="lineno"> 8468</span>&#160;    }</div>
+<div class="line"><a name="l08292"></a><span class="lineno"> 8292</span>&#160;    VkResult DefragmentationPassBegin(</div>
+<div class="line"><a name="l08293"></a><span class="lineno"> 8293</span>&#160;        <a class="code" href="struct_vma_defragmentation_pass_info.html">VmaDefragmentationPassInfo</a>* pInfo,</div>
+<div class="line"><a name="l08294"></a><span class="lineno"> 8294</span>&#160;        <a class="code" href="struct_vma_defragmentation_context.html">VmaDefragmentationContext</a> context);</div>
+<div class="line"><a name="l08295"></a><span class="lineno"> 8295</span>&#160;    VkResult DefragmentationPassEnd(</div>
+<div class="line"><a name="l08296"></a><span class="lineno"> 8296</span>&#160;        <a class="code" href="struct_vma_defragmentation_context.html">VmaDefragmentationContext</a> context);</div>
+<div class="line"><a name="l08297"></a><span class="lineno"> 8297</span>&#160; </div>
+<div class="line"><a name="l08298"></a><span class="lineno"> 8298</span>&#160;    <span class="keywordtype">void</span> GetAllocationInfo(<a class="code" href="struct_vma_allocation.html">VmaAllocation</a> hAllocation, <a class="code" href="struct_vma_allocation_info.html">VmaAllocationInfo</a>* pAllocationInfo);</div>
+<div class="line"><a name="l08299"></a><span class="lineno"> 8299</span>&#160;    <span class="keywordtype">bool</span> TouchAllocation(<a class="code" href="struct_vma_allocation.html">VmaAllocation</a> hAllocation);</div>
+<div class="line"><a name="l08300"></a><span class="lineno"> 8300</span>&#160; </div>
+<div class="line"><a name="l08301"></a><span class="lineno"> 8301</span>&#160;    VkResult CreatePool(<span class="keyword">const</span> <a class="code" href="struct_vma_pool_create_info.html">VmaPoolCreateInfo</a>* pCreateInfo, <a class="code" href="struct_vma_pool.html">VmaPool</a>* pPool);</div>
+<div class="line"><a name="l08302"></a><span class="lineno"> 8302</span>&#160;    <span class="keywordtype">void</span> DestroyPool(<a class="code" href="struct_vma_pool.html">VmaPool</a> pool);</div>
+<div class="line"><a name="l08303"></a><span class="lineno"> 8303</span>&#160;    <span class="keywordtype">void</span> GetPoolStats(<a class="code" href="struct_vma_pool.html">VmaPool</a> pool, <a class="code" href="struct_vma_pool_stats.html">VmaPoolStats</a>* pPoolStats);</div>
+<div class="line"><a name="l08304"></a><span class="lineno"> 8304</span>&#160; </div>
+<div class="line"><a name="l08305"></a><span class="lineno"> 8305</span>&#160;    <span class="keywordtype">void</span> SetCurrentFrameIndex(uint32_t frameIndex);</div>
+<div class="line"><a name="l08306"></a><span class="lineno"> 8306</span>&#160;    uint32_t GetCurrentFrameIndex()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_CurrentFrameIndex.load(); }</div>
+<div class="line"><a name="l08307"></a><span class="lineno"> 8307</span>&#160; </div>
+<div class="line"><a name="l08308"></a><span class="lineno"> 8308</span>&#160;    <span class="keywordtype">void</span> MakePoolAllocationsLost(</div>
+<div class="line"><a name="l08309"></a><span class="lineno"> 8309</span>&#160;        <a class="code" href="struct_vma_pool.html">VmaPool</a> hPool,</div>
+<div class="line"><a name="l08310"></a><span class="lineno"> 8310</span>&#160;        <span class="keywordtype">size_t</span>* pLostAllocationCount);</div>
+<div class="line"><a name="l08311"></a><span class="lineno"> 8311</span>&#160;    VkResult CheckPoolCorruption(<a class="code" href="struct_vma_pool.html">VmaPool</a> hPool);</div>
+<div class="line"><a name="l08312"></a><span class="lineno"> 8312</span>&#160;    VkResult CheckCorruption(uint32_t memoryTypeBits);</div>
+<div class="line"><a name="l08313"></a><span class="lineno"> 8313</span>&#160; </div>
+<div class="line"><a name="l08314"></a><span class="lineno"> 8314</span>&#160;    <span class="keywordtype">void</span> CreateLostAllocation(<a class="code" href="struct_vma_allocation.html">VmaAllocation</a>* pAllocation);</div>
+<div class="line"><a name="l08315"></a><span class="lineno"> 8315</span>&#160; </div>
+<div class="line"><a name="l08316"></a><span class="lineno"> 8316</span>&#160;    <span class="comment">// Call to Vulkan function vkAllocateMemory with accompanying bookkeeping.</span></div>
+<div class="line"><a name="l08317"></a><span class="lineno"> 8317</span>&#160;    VkResult AllocateVulkanMemory(<span class="keyword">const</span> VkMemoryAllocateInfo* pAllocateInfo, VkDeviceMemory* pMemory);</div>
+<div class="line"><a name="l08318"></a><span class="lineno"> 8318</span>&#160;    <span class="comment">// Call to Vulkan function vkFreeMemory with accompanying bookkeeping.</span></div>
+<div class="line"><a name="l08319"></a><span class="lineno"> 8319</span>&#160;    <span class="keywordtype">void</span> FreeVulkanMemory(uint32_t memoryType, VkDeviceSize size, VkDeviceMemory hMemory);</div>
+<div class="line"><a name="l08320"></a><span class="lineno"> 8320</span>&#160;    <span class="comment">// Call to Vulkan function vkBindBufferMemory or vkBindBufferMemory2KHR.</span></div>
+<div class="line"><a name="l08321"></a><span class="lineno"> 8321</span>&#160;    VkResult BindVulkanBuffer(</div>
+<div class="line"><a name="l08322"></a><span class="lineno"> 8322</span>&#160;        VkDeviceMemory memory,</div>
+<div class="line"><a name="l08323"></a><span class="lineno"> 8323</span>&#160;        VkDeviceSize memoryOffset,</div>
+<div class="line"><a name="l08324"></a><span class="lineno"> 8324</span>&#160;        VkBuffer buffer,</div>
+<div class="line"><a name="l08325"></a><span class="lineno"> 8325</span>&#160;        <span class="keyword">const</span> <span class="keywordtype">void</span>* pNext);</div>
+<div class="line"><a name="l08326"></a><span class="lineno"> 8326</span>&#160;    <span class="comment">// Call to Vulkan function vkBindImageMemory or vkBindImageMemory2KHR.</span></div>
+<div class="line"><a name="l08327"></a><span class="lineno"> 8327</span>&#160;    VkResult BindVulkanImage(</div>
+<div class="line"><a name="l08328"></a><span class="lineno"> 8328</span>&#160;        VkDeviceMemory memory,</div>
+<div class="line"><a name="l08329"></a><span class="lineno"> 8329</span>&#160;        VkDeviceSize memoryOffset,</div>
+<div class="line"><a name="l08330"></a><span class="lineno"> 8330</span>&#160;        VkImage image,</div>
+<div class="line"><a name="l08331"></a><span class="lineno"> 8331</span>&#160;        <span class="keyword">const</span> <span class="keywordtype">void</span>* pNext);</div>
+<div class="line"><a name="l08332"></a><span class="lineno"> 8332</span>&#160; </div>
+<div class="line"><a name="l08333"></a><span class="lineno"> 8333</span>&#160;    VkResult Map(<a class="code" href="struct_vma_allocation.html">VmaAllocation</a> hAllocation, <span class="keywordtype">void</span>** ppData);</div>
+<div class="line"><a name="l08334"></a><span class="lineno"> 8334</span>&#160;    <span class="keywordtype">void</span> Unmap(<a class="code" href="struct_vma_allocation.html">VmaAllocation</a> hAllocation);</div>
+<div class="line"><a name="l08335"></a><span class="lineno"> 8335</span>&#160; </div>
+<div class="line"><a name="l08336"></a><span class="lineno"> 8336</span>&#160;    VkResult BindBufferMemory(</div>
+<div class="line"><a name="l08337"></a><span class="lineno"> 8337</span>&#160;        <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> hAllocation,</div>
+<div class="line"><a name="l08338"></a><span class="lineno"> 8338</span>&#160;        VkDeviceSize allocationLocalOffset,</div>
+<div class="line"><a name="l08339"></a><span class="lineno"> 8339</span>&#160;        VkBuffer hBuffer,</div>
+<div class="line"><a name="l08340"></a><span class="lineno"> 8340</span>&#160;        <span class="keyword">const</span> <span class="keywordtype">void</span>* pNext);</div>
+<div class="line"><a name="l08341"></a><span class="lineno"> 8341</span>&#160;    VkResult BindImageMemory(</div>
+<div class="line"><a name="l08342"></a><span class="lineno"> 8342</span>&#160;        <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> hAllocation,</div>
+<div class="line"><a name="l08343"></a><span class="lineno"> 8343</span>&#160;        VkDeviceSize allocationLocalOffset,</div>
+<div class="line"><a name="l08344"></a><span class="lineno"> 8344</span>&#160;        VkImage hImage,</div>
+<div class="line"><a name="l08345"></a><span class="lineno"> 8345</span>&#160;        <span class="keyword">const</span> <span class="keywordtype">void</span>* pNext);</div>
+<div class="line"><a name="l08346"></a><span class="lineno"> 8346</span>&#160; </div>
+<div class="line"><a name="l08347"></a><span class="lineno"> 8347</span>&#160;    VkResult FlushOrInvalidateAllocation(</div>
+<div class="line"><a name="l08348"></a><span class="lineno"> 8348</span>&#160;        <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> hAllocation,</div>
+<div class="line"><a name="l08349"></a><span class="lineno"> 8349</span>&#160;        VkDeviceSize offset, VkDeviceSize size,</div>
+<div class="line"><a name="l08350"></a><span class="lineno"> 8350</span>&#160;        VMA_CACHE_OPERATION op);</div>
+<div class="line"><a name="l08351"></a><span class="lineno"> 8351</span>&#160;    VkResult FlushOrInvalidateAllocations(</div>
+<div class="line"><a name="l08352"></a><span class="lineno"> 8352</span>&#160;        uint32_t allocationCount,</div>
+<div class="line"><a name="l08353"></a><span class="lineno"> 8353</span>&#160;        <span class="keyword">const</span> <a class="code" href="struct_vma_allocation.html">VmaAllocation</a>* allocations,</div>
+<div class="line"><a name="l08354"></a><span class="lineno"> 8354</span>&#160;        <span class="keyword">const</span> VkDeviceSize* offsets, <span class="keyword">const</span> VkDeviceSize* sizes,</div>
+<div class="line"><a name="l08355"></a><span class="lineno"> 8355</span>&#160;        VMA_CACHE_OPERATION op);</div>
+<div class="line"><a name="l08356"></a><span class="lineno"> 8356</span>&#160; </div>
+<div class="line"><a name="l08357"></a><span class="lineno"> 8357</span>&#160;    <span class="keywordtype">void</span> FillAllocation(<span class="keyword">const</span> <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> hAllocation, uint8_t pattern);</div>
+<div class="line"><a name="l08358"></a><span class="lineno"> 8358</span>&#160; </div>
+<div class="line"><a name="l08359"></a><span class="lineno"> 8359</span>&#160;    <span class="comment">/*</span></div>
+<div class="line"><a name="l08360"></a><span class="lineno"> 8360</span>&#160;<span class="comment">    Returns bit mask of memory types that can support defragmentation on GPU as</span></div>
+<div class="line"><a name="l08361"></a><span class="lineno"> 8361</span>&#160;<span class="comment">    they support creation of required buffer for copy operations.</span></div>
+<div class="line"><a name="l08362"></a><span class="lineno"> 8362</span>&#160;<span class="comment">    */</span></div>
+<div class="line"><a name="l08363"></a><span class="lineno"> 8363</span>&#160;    uint32_t GetGpuDefragmentationMemoryTypeBits();</div>
+<div class="line"><a name="l08364"></a><span class="lineno"> 8364</span>&#160; </div>
+<div class="line"><a name="l08365"></a><span class="lineno"> 8365</span>&#160;<span class="keyword">private</span>:</div>
+<div class="line"><a name="l08366"></a><span class="lineno"> 8366</span>&#160;    VkDeviceSize m_PreferredLargeHeapBlockSize;</div>
+<div class="line"><a name="l08367"></a><span class="lineno"> 8367</span>&#160; </div>
+<div class="line"><a name="l08368"></a><span class="lineno"> 8368</span>&#160;    VkPhysicalDevice m_PhysicalDevice;</div>
+<div class="line"><a name="l08369"></a><span class="lineno"> 8369</span>&#160;    VMA_ATOMIC_UINT32 m_CurrentFrameIndex;</div>
+<div class="line"><a name="l08370"></a><span class="lineno"> 8370</span>&#160;    VMA_ATOMIC_UINT32 m_GpuDefragmentationMemoryTypeBits; <span class="comment">// UINT32_MAX means uninitialized.</span></div>
+<div class="line"><a name="l08371"></a><span class="lineno"> 8371</span>&#160; </div>
+<div class="line"><a name="l08372"></a><span class="lineno"> 8372</span>&#160;    VMA_RW_MUTEX m_PoolsMutex;</div>
+<div class="line"><a name="l08373"></a><span class="lineno"> 8373</span>&#160;    <span class="keyword">typedef</span> VmaIntrusiveLinkedList&lt;VmaPoolListItemTraits&gt; PoolList;</div>
+<div class="line"><a name="l08374"></a><span class="lineno"> 8374</span>&#160;    <span class="comment">// Protected by m_PoolsMutex.</span></div>
+<div class="line"><a name="l08375"></a><span class="lineno"> 8375</span>&#160;    PoolList m_Pools;</div>
+<div class="line"><a name="l08376"></a><span class="lineno"> 8376</span>&#160;    uint32_t m_NextPoolId;</div>
+<div class="line"><a name="l08377"></a><span class="lineno"> 8377</span>&#160; </div>
+<div class="line"><a name="l08378"></a><span class="lineno"> 8378</span>&#160;    <a class="code" href="struct_vma_vulkan_functions.html">VmaVulkanFunctions</a> m_VulkanFunctions;</div>
+<div class="line"><a name="l08379"></a><span class="lineno"> 8379</span>&#160; </div>
+<div class="line"><a name="l08380"></a><span class="lineno"> 8380</span>&#160;    <span class="comment">// Global bit mask AND-ed with any memoryTypeBits to disallow certain memory types.</span></div>
+<div class="line"><a name="l08381"></a><span class="lineno"> 8381</span>&#160;    uint32_t m_GlobalMemoryTypeBits;</div>
+<div class="line"><a name="l08382"></a><span class="lineno"> 8382</span>&#160; </div>
+<div class="line"><a name="l08383"></a><span class="lineno"> 8383</span>&#160;<span class="preprocessor">#if VMA_RECORDING_ENABLED</span></div>
+<div class="line"><a name="l08384"></a><span class="lineno"> 8384</span>&#160;    VmaRecorder* m_pRecorder;</div>
+<div class="line"><a name="l08385"></a><span class="lineno"> 8385</span>&#160;<span class="preprocessor">#endif</span></div>
+<div class="line"><a name="l08386"></a><span class="lineno"> 8386</span>&#160; </div>
+<div class="line"><a name="l08387"></a><span class="lineno"> 8387</span>&#160;    <span class="keywordtype">void</span> ImportVulkanFunctions(<span class="keyword">const</span> <a class="code" href="struct_vma_vulkan_functions.html">VmaVulkanFunctions</a>* pVulkanFunctions);</div>
+<div class="line"><a name="l08388"></a><span class="lineno"> 8388</span>&#160; </div>
+<div class="line"><a name="l08389"></a><span class="lineno"> 8389</span>&#160;<span class="preprocessor">#if VMA_STATIC_VULKAN_FUNCTIONS == 1</span></div>
+<div class="line"><a name="l08390"></a><span class="lineno"> 8390</span>&#160;    <span class="keywordtype">void</span> ImportVulkanFunctions_Static();</div>
+<div class="line"><a name="l08391"></a><span class="lineno"> 8391</span>&#160;<span class="preprocessor">#endif</span></div>
+<div class="line"><a name="l08392"></a><span class="lineno"> 8392</span>&#160; </div>
+<div class="line"><a name="l08393"></a><span class="lineno"> 8393</span>&#160;    <span class="keywordtype">void</span> ImportVulkanFunctions_Custom(<span class="keyword">const</span> <a class="code" href="struct_vma_vulkan_functions.html">VmaVulkanFunctions</a>* pVulkanFunctions);</div>
+<div class="line"><a name="l08394"></a><span class="lineno"> 8394</span>&#160; </div>
+<div class="line"><a name="l08395"></a><span class="lineno"> 8395</span>&#160;<span class="preprocessor">#if VMA_DYNAMIC_VULKAN_FUNCTIONS == 1</span></div>
+<div class="line"><a name="l08396"></a><span class="lineno"> 8396</span>&#160;    <span class="keywordtype">void</span> ImportVulkanFunctions_Dynamic();</div>
+<div class="line"><a name="l08397"></a><span class="lineno"> 8397</span>&#160;<span class="preprocessor">#endif</span></div>
+<div class="line"><a name="l08398"></a><span class="lineno"> 8398</span>&#160; </div>
+<div class="line"><a name="l08399"></a><span class="lineno"> 8399</span>&#160;    <span class="keywordtype">void</span> ValidateVulkanFunctions();</div>
+<div class="line"><a name="l08400"></a><span class="lineno"> 8400</span>&#160; </div>
+<div class="line"><a name="l08401"></a><span class="lineno"> 8401</span>&#160;    VkDeviceSize CalcPreferredBlockSize(uint32_t memTypeIndex);</div>
+<div class="line"><a name="l08402"></a><span class="lineno"> 8402</span>&#160; </div>
+<div class="line"><a name="l08403"></a><span class="lineno"> 8403</span>&#160;    VkResult AllocateMemoryOfType(</div>
+<div class="line"><a name="l08404"></a><span class="lineno"> 8404</span>&#160;        VkDeviceSize size,</div>
+<div class="line"><a name="l08405"></a><span class="lineno"> 8405</span>&#160;        VkDeviceSize alignment,</div>
+<div class="line"><a name="l08406"></a><span class="lineno"> 8406</span>&#160;        <span class="keywordtype">bool</span> dedicatedAllocation,</div>
+<div class="line"><a name="l08407"></a><span class="lineno"> 8407</span>&#160;        VkBuffer dedicatedBuffer,</div>
+<div class="line"><a name="l08408"></a><span class="lineno"> 8408</span>&#160;        VkBufferUsageFlags dedicatedBufferUsage,</div>
+<div class="line"><a name="l08409"></a><span class="lineno"> 8409</span>&#160;        VkImage dedicatedImage,</div>
+<div class="line"><a name="l08410"></a><span class="lineno"> 8410</span>&#160;        <span class="keyword">const</span> <a class="code" href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a>&amp; createInfo,</div>
+<div class="line"><a name="l08411"></a><span class="lineno"> 8411</span>&#160;        uint32_t memTypeIndex,</div>
+<div class="line"><a name="l08412"></a><span class="lineno"> 8412</span>&#160;        VmaSuballocationType suballocType,</div>
+<div class="line"><a name="l08413"></a><span class="lineno"> 8413</span>&#160;        <span class="keywordtype">size_t</span> allocationCount,</div>
+<div class="line"><a name="l08414"></a><span class="lineno"> 8414</span>&#160;        <a class="code" href="struct_vma_allocation.html">VmaAllocation</a>* pAllocations);</div>
+<div class="line"><a name="l08415"></a><span class="lineno"> 8415</span>&#160; </div>
+<div class="line"><a name="l08416"></a><span class="lineno"> 8416</span>&#160;    <span class="comment">// Helper function only to be used inside AllocateDedicatedMemory.</span></div>
+<div class="line"><a name="l08417"></a><span class="lineno"> 8417</span>&#160;    VkResult AllocateDedicatedMemoryPage(</div>
+<div class="line"><a name="l08418"></a><span class="lineno"> 8418</span>&#160;        VkDeviceSize size,</div>
+<div class="line"><a name="l08419"></a><span class="lineno"> 8419</span>&#160;        VmaSuballocationType suballocType,</div>
+<div class="line"><a name="l08420"></a><span class="lineno"> 8420</span>&#160;        uint32_t memTypeIndex,</div>
+<div class="line"><a name="l08421"></a><span class="lineno"> 8421</span>&#160;        <span class="keyword">const</span> VkMemoryAllocateInfo&amp; allocInfo,</div>
+<div class="line"><a name="l08422"></a><span class="lineno"> 8422</span>&#160;        <span class="keywordtype">bool</span> map,</div>
+<div class="line"><a name="l08423"></a><span class="lineno"> 8423</span>&#160;        <span class="keywordtype">bool</span> isUserDataString,</div>
+<div class="line"><a name="l08424"></a><span class="lineno"> 8424</span>&#160;        <span class="keywordtype">void</span>* pUserData,</div>
+<div class="line"><a name="l08425"></a><span class="lineno"> 8425</span>&#160;        <a class="code" href="struct_vma_allocation.html">VmaAllocation</a>* pAllocation);</div>
+<div class="line"><a name="l08426"></a><span class="lineno"> 8426</span>&#160; </div>
+<div class="line"><a name="l08427"></a><span class="lineno"> 8427</span>&#160;    <span class="comment">// Allocates and registers new VkDeviceMemory specifically for dedicated allocations.</span></div>
+<div class="line"><a name="l08428"></a><span class="lineno"> 8428</span>&#160;    VkResult AllocateDedicatedMemory(</div>
+<div class="line"><a name="l08429"></a><span class="lineno"> 8429</span>&#160;        VkDeviceSize size,</div>
+<div class="line"><a name="l08430"></a><span class="lineno"> 8430</span>&#160;        VmaSuballocationType suballocType,</div>
+<div class="line"><a name="l08431"></a><span class="lineno"> 8431</span>&#160;        uint32_t memTypeIndex,</div>
+<div class="line"><a name="l08432"></a><span class="lineno"> 8432</span>&#160;        <span class="keywordtype">bool</span> withinBudget,</div>
+<div class="line"><a name="l08433"></a><span class="lineno"> 8433</span>&#160;        <span class="keywordtype">bool</span> map,</div>
+<div class="line"><a name="l08434"></a><span class="lineno"> 8434</span>&#160;        <span class="keywordtype">bool</span> isUserDataString,</div>
+<div class="line"><a name="l08435"></a><span class="lineno"> 8435</span>&#160;        <span class="keywordtype">void</span>* pUserData,</div>
+<div class="line"><a name="l08436"></a><span class="lineno"> 8436</span>&#160;        <span class="keywordtype">float</span> priority,</div>
+<div class="line"><a name="l08437"></a><span class="lineno"> 8437</span>&#160;        VkBuffer dedicatedBuffer,</div>
+<div class="line"><a name="l08438"></a><span class="lineno"> 8438</span>&#160;        VkBufferUsageFlags dedicatedBufferUsage,</div>
+<div class="line"><a name="l08439"></a><span class="lineno"> 8439</span>&#160;        VkImage dedicatedImage,</div>
+<div class="line"><a name="l08440"></a><span class="lineno"> 8440</span>&#160;        <span class="keywordtype">size_t</span> allocationCount,</div>
+<div class="line"><a name="l08441"></a><span class="lineno"> 8441</span>&#160;        <a class="code" href="struct_vma_allocation.html">VmaAllocation</a>* pAllocations);</div>
+<div class="line"><a name="l08442"></a><span class="lineno"> 8442</span>&#160; </div>
+<div class="line"><a name="l08443"></a><span class="lineno"> 8443</span>&#160;    <span class="keywordtype">void</span> FreeDedicatedMemory(<span class="keyword">const</span> <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation);</div>
+<div class="line"><a name="l08444"></a><span class="lineno"> 8444</span>&#160; </div>
+<div class="line"><a name="l08445"></a><span class="lineno"> 8445</span>&#160;    <span class="comment">/*</span></div>
+<div class="line"><a name="l08446"></a><span class="lineno"> 8446</span>&#160;<span class="comment">    Calculates and returns bit mask of memory types that can support defragmentation</span></div>
+<div class="line"><a name="l08447"></a><span class="lineno"> 8447</span>&#160;<span class="comment">    on GPU as they support creation of required buffer for copy operations.</span></div>
+<div class="line"><a name="l08448"></a><span class="lineno"> 8448</span>&#160;<span class="comment">    */</span></div>
+<div class="line"><a name="l08449"></a><span class="lineno"> 8449</span>&#160;    uint32_t CalculateGpuDefragmentationMemoryTypeBits() <span class="keyword">const</span>;</div>
+<div class="line"><a name="l08450"></a><span class="lineno"> 8450</span>&#160; </div>
+<div class="line"><a name="l08451"></a><span class="lineno"> 8451</span>&#160;    uint32_t CalculateGlobalMemoryTypeBits() <span class="keyword">const</span>;</div>
+<div class="line"><a name="l08452"></a><span class="lineno"> 8452</span>&#160; </div>
+<div class="line"><a name="l08453"></a><span class="lineno"> 8453</span>&#160;    <span class="keywordtype">bool</span> GetFlushOrInvalidateRange(</div>
+<div class="line"><a name="l08454"></a><span class="lineno"> 8454</span>&#160;        <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation,</div>
+<div class="line"><a name="l08455"></a><span class="lineno"> 8455</span>&#160;        VkDeviceSize offset, VkDeviceSize size,</div>
+<div class="line"><a name="l08456"></a><span class="lineno"> 8456</span>&#160;        VkMappedMemoryRange&amp; outRange) <span class="keyword">const</span>;</div>
+<div class="line"><a name="l08457"></a><span class="lineno"> 8457</span>&#160; </div>
+<div class="line"><a name="l08458"></a><span class="lineno"> 8458</span>&#160;<span class="preprocessor">#if VMA_MEMORY_BUDGET</span></div>
+<div class="line"><a name="l08459"></a><span class="lineno"> 8459</span>&#160;    <span class="keywordtype">void</span> UpdateVulkanBudget();</div>
+<div class="line"><a name="l08460"></a><span class="lineno"> 8460</span>&#160;<span class="preprocessor">#endif </span><span class="comment">// #if VMA_MEMORY_BUDGET</span></div>
+<div class="line"><a name="l08461"></a><span class="lineno"> 8461</span>&#160;};</div>
+<div class="line"><a name="l08462"></a><span class="lineno"> 8462</span>&#160; </div>
+<div class="line"><a name="l08464"></a><span class="lineno"> 8464</span>&#160;<span class="comment">// Memory allocation #2 after VmaAllocator_T definition</span></div>
+<div class="line"><a name="l08465"></a><span class="lineno"> 8465</span>&#160; </div>
+<div class="line"><a name="l08466"></a><span class="lineno"> 8466</span>&#160;<span class="keyword">static</span> <span class="keywordtype">void</span>* VmaMalloc(<a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator, <span class="keywordtype">size_t</span> size, <span class="keywordtype">size_t</span> alignment)</div>
+<div class="line"><a name="l08467"></a><span class="lineno"> 8467</span>&#160;{</div>
+<div class="line"><a name="l08468"></a><span class="lineno"> 8468</span>&#160;    <span class="keywordflow">return</span> VmaMalloc(&amp;hAllocator-&gt;m_AllocationCallbacks, size, alignment);</div>
 <div class="line"><a name="l08469"></a><span class="lineno"> 8469</span>&#160;}</div>
 <div class="line"><a name="l08470"></a><span class="lineno"> 8470</span>&#160; </div>
-<div class="line"><a name="l08471"></a><span class="lineno"> 8471</span>&#160;<span class="keywordtype">bool</span> VmaAllocation_T::CanBecomeLost()<span class="keyword"> const</span></div>
-<div class="line"><a name="l08472"></a><span class="lineno"> 8472</span>&#160;<span class="keyword"></span>{</div>
-<div class="line"><a name="l08473"></a><span class="lineno"> 8473</span>&#160;    <span class="keywordflow">switch</span>(m_Type)</div>
-<div class="line"><a name="l08474"></a><span class="lineno"> 8474</span>&#160;    {</div>
-<div class="line"><a name="l08475"></a><span class="lineno"> 8475</span>&#160;    <span class="keywordflow">case</span> ALLOCATION_TYPE_BLOCK:</div>
-<div class="line"><a name="l08476"></a><span class="lineno"> 8476</span>&#160;        <span class="keywordflow">return</span> m_BlockAllocation.m_CanBecomeLost;</div>
-<div class="line"><a name="l08477"></a><span class="lineno"> 8477</span>&#160;    <span class="keywordflow">case</span> ALLOCATION_TYPE_DEDICATED:</div>
-<div class="line"><a name="l08478"></a><span class="lineno"> 8478</span>&#160;        <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
-<div class="line"><a name="l08479"></a><span class="lineno"> 8479</span>&#160;    <span class="keywordflow">default</span>:</div>
-<div class="line"><a name="l08480"></a><span class="lineno"> 8480</span>&#160;        VMA_ASSERT(0);</div>
-<div class="line"><a name="l08481"></a><span class="lineno"> 8481</span>&#160;        <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
-<div class="line"><a name="l08482"></a><span class="lineno"> 8482</span>&#160;    }</div>
-<div class="line"><a name="l08483"></a><span class="lineno"> 8483</span>&#160;}</div>
-<div class="line"><a name="l08484"></a><span class="lineno"> 8484</span>&#160; </div>
-<div class="line"><a name="l08485"></a><span class="lineno"> 8485</span>&#160;<span class="keywordtype">bool</span> VmaAllocation_T::MakeLost(uint32_t currentFrameIndex, uint32_t frameInUseCount)</div>
-<div class="line"><a name="l08486"></a><span class="lineno"> 8486</span>&#160;{</div>
-<div class="line"><a name="l08487"></a><span class="lineno"> 8487</span>&#160;    VMA_ASSERT(CanBecomeLost());</div>
-<div class="line"><a name="l08488"></a><span class="lineno"> 8488</span>&#160; </div>
-<div class="line"><a name="l08489"></a><span class="lineno"> 8489</span>&#160;    <span class="comment">/*</span></div>
-<div class="line"><a name="l08490"></a><span class="lineno"> 8490</span>&#160;<span class="comment">    Warning: This is a carefully designed algorithm.</span></div>
-<div class="line"><a name="l08491"></a><span class="lineno"> 8491</span>&#160;<span class="comment">    Do not modify unless you really know what you&#39;re doing :)</span></div>
-<div class="line"><a name="l08492"></a><span class="lineno"> 8492</span>&#160;<span class="comment">    */</span></div>
-<div class="line"><a name="l08493"></a><span class="lineno"> 8493</span>&#160;    uint32_t localLastUseFrameIndex = GetLastUseFrameIndex();</div>
-<div class="line"><a name="l08494"></a><span class="lineno"> 8494</span>&#160;    <span class="keywordflow">for</span>(;;)</div>
-<div class="line"><a name="l08495"></a><span class="lineno"> 8495</span>&#160;    {</div>
-<div class="line"><a name="l08496"></a><span class="lineno"> 8496</span>&#160;        <span class="keywordflow">if</span>(localLastUseFrameIndex == VMA_FRAME_INDEX_LOST)</div>
-<div class="line"><a name="l08497"></a><span class="lineno"> 8497</span>&#160;        {</div>
-<div class="line"><a name="l08498"></a><span class="lineno"> 8498</span>&#160;            VMA_ASSERT(0);</div>
-<div class="line"><a name="l08499"></a><span class="lineno"> 8499</span>&#160;            <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
-<div class="line"><a name="l08500"></a><span class="lineno"> 8500</span>&#160;        }</div>
-<div class="line"><a name="l08501"></a><span class="lineno"> 8501</span>&#160;        <span class="keywordflow">else</span> <span class="keywordflow">if</span>(localLastUseFrameIndex + frameInUseCount &gt;= currentFrameIndex)</div>
-<div class="line"><a name="l08502"></a><span class="lineno"> 8502</span>&#160;        {</div>
-<div class="line"><a name="l08503"></a><span class="lineno"> 8503</span>&#160;            <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
-<div class="line"><a name="l08504"></a><span class="lineno"> 8504</span>&#160;        }</div>
-<div class="line"><a name="l08505"></a><span class="lineno"> 8505</span>&#160;        <span class="keywordflow">else</span> <span class="comment">// Last use time earlier than current time.</span></div>
-<div class="line"><a name="l08506"></a><span class="lineno"> 8506</span>&#160;        {</div>
-<div class="line"><a name="l08507"></a><span class="lineno"> 8507</span>&#160;            <span class="keywordflow">if</span>(CompareExchangeLastUseFrameIndex(localLastUseFrameIndex, VMA_FRAME_INDEX_LOST))</div>
-<div class="line"><a name="l08508"></a><span class="lineno"> 8508</span>&#160;            {</div>
-<div class="line"><a name="l08509"></a><span class="lineno"> 8509</span>&#160;                <span class="comment">// Setting hAllocation.LastUseFrameIndex atomic to VMA_FRAME_INDEX_LOST is enough to mark it as LOST.</span></div>
-<div class="line"><a name="l08510"></a><span class="lineno"> 8510</span>&#160;                <span class="comment">// Calling code just needs to unregister this allocation in owning VmaDeviceMemoryBlock.</span></div>
-<div class="line"><a name="l08511"></a><span class="lineno"> 8511</span>&#160;                <span class="keywordflow">return</span> <span class="keyword">true</span>;</div>
-<div class="line"><a name="l08512"></a><span class="lineno"> 8512</span>&#160;            }</div>
-<div class="line"><a name="l08513"></a><span class="lineno"> 8513</span>&#160;        }</div>
-<div class="line"><a name="l08514"></a><span class="lineno"> 8514</span>&#160;    }</div>
-<div class="line"><a name="l08515"></a><span class="lineno"> 8515</span>&#160;}</div>
-<div class="line"><a name="l08516"></a><span class="lineno"> 8516</span>&#160; </div>
-<div class="line"><a name="l08517"></a><span class="lineno"> 8517</span>&#160;<span class="preprocessor">#if VMA_STATS_STRING_ENABLED</span></div>
-<div class="line"><a name="l08518"></a><span class="lineno"> 8518</span>&#160; </div>
-<div class="line"><a name="l08519"></a><span class="lineno"> 8519</span>&#160;<span class="comment">// Correspond to values of enum VmaSuballocationType.</span></div>
-<div class="line"><a name="l08520"></a><span class="lineno"> 8520</span>&#160;<span class="keyword">static</span> <span class="keyword">const</span> <span class="keywordtype">char</span>* VMA_SUBALLOCATION_TYPE_NAMES[] = {</div>
-<div class="line"><a name="l08521"></a><span class="lineno"> 8521</span>&#160;    <span class="stringliteral">&quot;FREE&quot;</span>,</div>
-<div class="line"><a name="l08522"></a><span class="lineno"> 8522</span>&#160;    <span class="stringliteral">&quot;UNKNOWN&quot;</span>,</div>
-<div class="line"><a name="l08523"></a><span class="lineno"> 8523</span>&#160;    <span class="stringliteral">&quot;BUFFER&quot;</span>,</div>
-<div class="line"><a name="l08524"></a><span class="lineno"> 8524</span>&#160;    <span class="stringliteral">&quot;IMAGE_UNKNOWN&quot;</span>,</div>
-<div class="line"><a name="l08525"></a><span class="lineno"> 8525</span>&#160;    <span class="stringliteral">&quot;IMAGE_LINEAR&quot;</span>,</div>
-<div class="line"><a name="l08526"></a><span class="lineno"> 8526</span>&#160;    <span class="stringliteral">&quot;IMAGE_OPTIMAL&quot;</span>,</div>
-<div class="line"><a name="l08527"></a><span class="lineno"> 8527</span>&#160;};</div>
-<div class="line"><a name="l08528"></a><span class="lineno"> 8528</span>&#160; </div>
-<div class="line"><a name="l08529"></a><span class="lineno"> 8529</span>&#160;<span class="keywordtype">void</span> VmaAllocation_T::PrintParameters(<span class="keyword">class</span> VmaJsonWriter&amp; json)<span class="keyword"> const</span></div>
-<div class="line"><a name="l08530"></a><span class="lineno"> 8530</span>&#160;<span class="keyword"></span>{</div>
-<div class="line"><a name="l08531"></a><span class="lineno"> 8531</span>&#160;    json.WriteString(<span class="stringliteral">&quot;Type&quot;</span>);</div>
-<div class="line"><a name="l08532"></a><span class="lineno"> 8532</span>&#160;    json.WriteString(VMA_SUBALLOCATION_TYPE_NAMES[m_SuballocationType]);</div>
-<div class="line"><a name="l08533"></a><span class="lineno"> 8533</span>&#160; </div>
-<div class="line"><a name="l08534"></a><span class="lineno"> 8534</span>&#160;    json.WriteString(<span class="stringliteral">&quot;Size&quot;</span>);</div>
-<div class="line"><a name="l08535"></a><span class="lineno"> 8535</span>&#160;    json.WriteNumber(m_Size);</div>
-<div class="line"><a name="l08536"></a><span class="lineno"> 8536</span>&#160; </div>
-<div class="line"><a name="l08537"></a><span class="lineno"> 8537</span>&#160;    <span class="keywordflow">if</span>(m_pUserData != VMA_NULL)</div>
-<div class="line"><a name="l08538"></a><span class="lineno"> 8538</span>&#160;    {</div>
-<div class="line"><a name="l08539"></a><span class="lineno"> 8539</span>&#160;        json.WriteString(<span class="stringliteral">&quot;UserData&quot;</span>);</div>
-<div class="line"><a name="l08540"></a><span class="lineno"> 8540</span>&#160;        <span class="keywordflow">if</span>(IsUserDataString())</div>
-<div class="line"><a name="l08541"></a><span class="lineno"> 8541</span>&#160;        {</div>
-<div class="line"><a name="l08542"></a><span class="lineno"> 8542</span>&#160;            json.WriteString((<span class="keyword">const</span> <span class="keywordtype">char</span>*)m_pUserData);</div>
-<div class="line"><a name="l08543"></a><span class="lineno"> 8543</span>&#160;        }</div>
-<div class="line"><a name="l08544"></a><span class="lineno"> 8544</span>&#160;        <span class="keywordflow">else</span></div>
-<div class="line"><a name="l08545"></a><span class="lineno"> 8545</span>&#160;        {</div>
-<div class="line"><a name="l08546"></a><span class="lineno"> 8546</span>&#160;            json.BeginString();</div>
-<div class="line"><a name="l08547"></a><span class="lineno"> 8547</span>&#160;            json.ContinueString_Pointer(m_pUserData);</div>
-<div class="line"><a name="l08548"></a><span class="lineno"> 8548</span>&#160;            json.EndString();</div>
-<div class="line"><a name="l08549"></a><span class="lineno"> 8549</span>&#160;        }</div>
-<div class="line"><a name="l08550"></a><span class="lineno"> 8550</span>&#160;    }</div>
-<div class="line"><a name="l08551"></a><span class="lineno"> 8551</span>&#160; </div>
-<div class="line"><a name="l08552"></a><span class="lineno"> 8552</span>&#160;    json.WriteString(<span class="stringliteral">&quot;CreationFrameIndex&quot;</span>);</div>
-<div class="line"><a name="l08553"></a><span class="lineno"> 8553</span>&#160;    json.WriteNumber(m_CreationFrameIndex);</div>
-<div class="line"><a name="l08554"></a><span class="lineno"> 8554</span>&#160; </div>
-<div class="line"><a name="l08555"></a><span class="lineno"> 8555</span>&#160;    json.WriteString(<span class="stringliteral">&quot;LastUseFrameIndex&quot;</span>);</div>
-<div class="line"><a name="l08556"></a><span class="lineno"> 8556</span>&#160;    json.WriteNumber(GetLastUseFrameIndex());</div>
-<div class="line"><a name="l08557"></a><span class="lineno"> 8557</span>&#160; </div>
-<div class="line"><a name="l08558"></a><span class="lineno"> 8558</span>&#160;    <span class="keywordflow">if</span>(m_BufferImageUsage != 0)</div>
-<div class="line"><a name="l08559"></a><span class="lineno"> 8559</span>&#160;    {</div>
-<div class="line"><a name="l08560"></a><span class="lineno"> 8560</span>&#160;        json.WriteString(<span class="stringliteral">&quot;Usage&quot;</span>);</div>
-<div class="line"><a name="l08561"></a><span class="lineno"> 8561</span>&#160;        json.WriteNumber(m_BufferImageUsage);</div>
-<div class="line"><a name="l08562"></a><span class="lineno"> 8562</span>&#160;    }</div>
-<div class="line"><a name="l08563"></a><span class="lineno"> 8563</span>&#160;}</div>
-<div class="line"><a name="l08564"></a><span class="lineno"> 8564</span>&#160; </div>
-<div class="line"><a name="l08565"></a><span class="lineno"> 8565</span>&#160;<span class="preprocessor">#endif</span></div>
-<div class="line"><a name="l08566"></a><span class="lineno"> 8566</span>&#160; </div>
-<div class="line"><a name="l08567"></a><span class="lineno"> 8567</span>&#160;<span class="keywordtype">void</span> VmaAllocation_T::FreeUserDataString(<a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator)</div>
-<div class="line"><a name="l08568"></a><span class="lineno"> 8568</span>&#160;{</div>
-<div class="line"><a name="l08569"></a><span class="lineno"> 8569</span>&#160;    VMA_ASSERT(IsUserDataString());</div>
-<div class="line"><a name="l08570"></a><span class="lineno"> 8570</span>&#160;    VmaFreeString(hAllocator-&gt;GetAllocationCallbacks(), (<span class="keywordtype">char</span>*)m_pUserData);</div>
-<div class="line"><a name="l08571"></a><span class="lineno"> 8571</span>&#160;    m_pUserData = VMA_NULL;</div>
-<div class="line"><a name="l08572"></a><span class="lineno"> 8572</span>&#160;}</div>
-<div class="line"><a name="l08573"></a><span class="lineno"> 8573</span>&#160; </div>
-<div class="line"><a name="l08574"></a><span class="lineno"> 8574</span>&#160;<span class="keywordtype">void</span> VmaAllocation_T::BlockAllocMap()</div>
-<div class="line"><a name="l08575"></a><span class="lineno"> 8575</span>&#160;{</div>
-<div class="line"><a name="l08576"></a><span class="lineno"> 8576</span>&#160;    VMA_ASSERT(GetType() == ALLOCATION_TYPE_BLOCK);</div>
+<div class="line"><a name="l08471"></a><span class="lineno"> 8471</span>&#160;<span class="keyword">static</span> <span class="keywordtype">void</span> VmaFree(<a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator, <span class="keywordtype">void</span>* ptr)</div>
+<div class="line"><a name="l08472"></a><span class="lineno"> 8472</span>&#160;{</div>
+<div class="line"><a name="l08473"></a><span class="lineno"> 8473</span>&#160;    VmaFree(&amp;hAllocator-&gt;m_AllocationCallbacks, ptr);</div>
+<div class="line"><a name="l08474"></a><span class="lineno"> 8474</span>&#160;}</div>
+<div class="line"><a name="l08475"></a><span class="lineno"> 8475</span>&#160; </div>
+<div class="line"><a name="l08476"></a><span class="lineno"> 8476</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt;</div>
+<div class="line"><a name="l08477"></a><span class="lineno"> 8477</span>&#160;<span class="keyword">static</span> T* VmaAllocate(<a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator)</div>
+<div class="line"><a name="l08478"></a><span class="lineno"> 8478</span>&#160;{</div>
+<div class="line"><a name="l08479"></a><span class="lineno"> 8479</span>&#160;    <span class="keywordflow">return</span> (T*)VmaMalloc(hAllocator, <span class="keyword">sizeof</span>(T), VMA_ALIGN_OF(T));</div>
+<div class="line"><a name="l08480"></a><span class="lineno"> 8480</span>&#160;}</div>
+<div class="line"><a name="l08481"></a><span class="lineno"> 8481</span>&#160; </div>
+<div class="line"><a name="l08482"></a><span class="lineno"> 8482</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt;</div>
+<div class="line"><a name="l08483"></a><span class="lineno"> 8483</span>&#160;<span class="keyword">static</span> T* VmaAllocateArray(<a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator, <span class="keywordtype">size_t</span> count)</div>
+<div class="line"><a name="l08484"></a><span class="lineno"> 8484</span>&#160;{</div>
+<div class="line"><a name="l08485"></a><span class="lineno"> 8485</span>&#160;    <span class="keywordflow">return</span> (T*)VmaMalloc(hAllocator, <span class="keyword">sizeof</span>(T) * count, VMA_ALIGN_OF(T));</div>
+<div class="line"><a name="l08486"></a><span class="lineno"> 8486</span>&#160;}</div>
+<div class="line"><a name="l08487"></a><span class="lineno"> 8487</span>&#160; </div>
+<div class="line"><a name="l08488"></a><span class="lineno"> 8488</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt;</div>
+<div class="line"><a name="l08489"></a><span class="lineno"> 8489</span>&#160;<span class="keyword">static</span> <span class="keywordtype">void</span> vma_delete(<a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator, T* ptr)</div>
+<div class="line"><a name="l08490"></a><span class="lineno"> 8490</span>&#160;{</div>
+<div class="line"><a name="l08491"></a><span class="lineno"> 8491</span>&#160;    <span class="keywordflow">if</span>(ptr != VMA_NULL)</div>
+<div class="line"><a name="l08492"></a><span class="lineno"> 8492</span>&#160;    {</div>
+<div class="line"><a name="l08493"></a><span class="lineno"> 8493</span>&#160;        ptr-&gt;~T();</div>
+<div class="line"><a name="l08494"></a><span class="lineno"> 8494</span>&#160;        VmaFree(hAllocator, ptr);</div>
+<div class="line"><a name="l08495"></a><span class="lineno"> 8495</span>&#160;    }</div>
+<div class="line"><a name="l08496"></a><span class="lineno"> 8496</span>&#160;}</div>
+<div class="line"><a name="l08497"></a><span class="lineno"> 8497</span>&#160; </div>
+<div class="line"><a name="l08498"></a><span class="lineno"> 8498</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt;</div>
+<div class="line"><a name="l08499"></a><span class="lineno"> 8499</span>&#160;<span class="keyword">static</span> <span class="keywordtype">void</span> vma_delete_array(<a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator, T* ptr, <span class="keywordtype">size_t</span> count)</div>
+<div class="line"><a name="l08500"></a><span class="lineno"> 8500</span>&#160;{</div>
+<div class="line"><a name="l08501"></a><span class="lineno"> 8501</span>&#160;    <span class="keywordflow">if</span>(ptr != VMA_NULL)</div>
+<div class="line"><a name="l08502"></a><span class="lineno"> 8502</span>&#160;    {</div>
+<div class="line"><a name="l08503"></a><span class="lineno"> 8503</span>&#160;        <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> i = count; i--; )</div>
+<div class="line"><a name="l08504"></a><span class="lineno"> 8504</span>&#160;            ptr[i].~T();</div>
+<div class="line"><a name="l08505"></a><span class="lineno"> 8505</span>&#160;        VmaFree(hAllocator, ptr);</div>
+<div class="line"><a name="l08506"></a><span class="lineno"> 8506</span>&#160;    }</div>
+<div class="line"><a name="l08507"></a><span class="lineno"> 8507</span>&#160;}</div>
+<div class="line"><a name="l08508"></a><span class="lineno"> 8508</span>&#160; </div>
+<div class="line"><a name="l08510"></a><span class="lineno"> 8510</span>&#160;<span class="comment">// VmaStringBuilder</span></div>
+<div class="line"><a name="l08511"></a><span class="lineno"> 8511</span>&#160; </div>
+<div class="line"><a name="l08512"></a><span class="lineno"> 8512</span>&#160;<span class="preprocessor">#if VMA_STATS_STRING_ENABLED</span></div>
+<div class="line"><a name="l08513"></a><span class="lineno"> 8513</span>&#160; </div>
+<div class="line"><a name="l08514"></a><span class="lineno"> 8514</span>&#160;<span class="keyword">class </span>VmaStringBuilder</div>
+<div class="line"><a name="l08515"></a><span class="lineno"> 8515</span>&#160;{</div>
+<div class="line"><a name="l08516"></a><span class="lineno"> 8516</span>&#160;<span class="keyword">public</span>:</div>
+<div class="line"><a name="l08517"></a><span class="lineno"> 8517</span>&#160;    VmaStringBuilder(<a class="code" href="struct_vma_allocator.html">VmaAllocator</a> alloc) : m_Data(VmaStlAllocator&lt;char&gt;(alloc-&gt;GetAllocationCallbacks())) { }</div>
+<div class="line"><a name="l08518"></a><span class="lineno"> 8518</span>&#160;    <span class="keywordtype">size_t</span> GetLength()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_Data.size(); }</div>
+<div class="line"><a name="l08519"></a><span class="lineno"> 8519</span>&#160;    <span class="keyword">const</span> <span class="keywordtype">char</span>* GetData()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_Data.data(); }</div>
+<div class="line"><a name="l08520"></a><span class="lineno"> 8520</span>&#160; </div>
+<div class="line"><a name="l08521"></a><span class="lineno"> 8521</span>&#160;    <span class="keywordtype">void</span> Add(<span class="keywordtype">char</span> ch) { m_Data.push_back(ch); }</div>
+<div class="line"><a name="l08522"></a><span class="lineno"> 8522</span>&#160;    <span class="keywordtype">void</span> Add(<span class="keyword">const</span> <span class="keywordtype">char</span>* pStr);</div>
+<div class="line"><a name="l08523"></a><span class="lineno"> 8523</span>&#160;    <span class="keywordtype">void</span> AddNewLine() { Add(<span class="charliteral">&#39;\n&#39;</span>); }</div>
+<div class="line"><a name="l08524"></a><span class="lineno"> 8524</span>&#160;    <span class="keywordtype">void</span> AddNumber(uint32_t num);</div>
+<div class="line"><a name="l08525"></a><span class="lineno"> 8525</span>&#160;    <span class="keywordtype">void</span> AddNumber(uint64_t num);</div>
+<div class="line"><a name="l08526"></a><span class="lineno"> 8526</span>&#160;    <span class="keywordtype">void</span> AddPointer(<span class="keyword">const</span> <span class="keywordtype">void</span>* ptr);</div>
+<div class="line"><a name="l08527"></a><span class="lineno"> 8527</span>&#160; </div>
+<div class="line"><a name="l08528"></a><span class="lineno"> 8528</span>&#160;<span class="keyword">private</span>:</div>
+<div class="line"><a name="l08529"></a><span class="lineno"> 8529</span>&#160;    VmaVector&lt; char, VmaStlAllocator&lt;char&gt; &gt; m_Data;</div>
+<div class="line"><a name="l08530"></a><span class="lineno"> 8530</span>&#160;};</div>
+<div class="line"><a name="l08531"></a><span class="lineno"> 8531</span>&#160; </div>
+<div class="line"><a name="l08532"></a><span class="lineno"> 8532</span>&#160;<span class="keywordtype">void</span> VmaStringBuilder::Add(<span class="keyword">const</span> <span class="keywordtype">char</span>* pStr)</div>
+<div class="line"><a name="l08533"></a><span class="lineno"> 8533</span>&#160;{</div>
+<div class="line"><a name="l08534"></a><span class="lineno"> 8534</span>&#160;    <span class="keyword">const</span> <span class="keywordtype">size_t</span> strLen = strlen(pStr);</div>
+<div class="line"><a name="l08535"></a><span class="lineno"> 8535</span>&#160;    <span class="keywordflow">if</span>(strLen &gt; 0)</div>
+<div class="line"><a name="l08536"></a><span class="lineno"> 8536</span>&#160;    {</div>
+<div class="line"><a name="l08537"></a><span class="lineno"> 8537</span>&#160;        <span class="keyword">const</span> <span class="keywordtype">size_t</span> oldCount = m_Data.size();</div>
+<div class="line"><a name="l08538"></a><span class="lineno"> 8538</span>&#160;        m_Data.resize(oldCount + strLen);</div>
+<div class="line"><a name="l08539"></a><span class="lineno"> 8539</span>&#160;        memcpy(m_Data.data() + oldCount, pStr, strLen);</div>
+<div class="line"><a name="l08540"></a><span class="lineno"> 8540</span>&#160;    }</div>
+<div class="line"><a name="l08541"></a><span class="lineno"> 8541</span>&#160;}</div>
+<div class="line"><a name="l08542"></a><span class="lineno"> 8542</span>&#160; </div>
+<div class="line"><a name="l08543"></a><span class="lineno"> 8543</span>&#160;<span class="keywordtype">void</span> VmaStringBuilder::AddNumber(uint32_t num)</div>
+<div class="line"><a name="l08544"></a><span class="lineno"> 8544</span>&#160;{</div>
+<div class="line"><a name="l08545"></a><span class="lineno"> 8545</span>&#160;    <span class="keywordtype">char</span> buf[11];</div>
+<div class="line"><a name="l08546"></a><span class="lineno"> 8546</span>&#160;    buf[10] = <span class="charliteral">&#39;\0&#39;</span>;</div>
+<div class="line"><a name="l08547"></a><span class="lineno"> 8547</span>&#160;    <span class="keywordtype">char</span> *p = &amp;buf[10];</div>
+<div class="line"><a name="l08548"></a><span class="lineno"> 8548</span>&#160;    <span class="keywordflow">do</span></div>
+<div class="line"><a name="l08549"></a><span class="lineno"> 8549</span>&#160;    {</div>
+<div class="line"><a name="l08550"></a><span class="lineno"> 8550</span>&#160;        *--p = <span class="charliteral">&#39;0&#39;</span> + (num % 10);</div>
+<div class="line"><a name="l08551"></a><span class="lineno"> 8551</span>&#160;        num /= 10;</div>
+<div class="line"><a name="l08552"></a><span class="lineno"> 8552</span>&#160;    }</div>
+<div class="line"><a name="l08553"></a><span class="lineno"> 8553</span>&#160;    <span class="keywordflow">while</span>(num);</div>
+<div class="line"><a name="l08554"></a><span class="lineno"> 8554</span>&#160;    Add(p);</div>
+<div class="line"><a name="l08555"></a><span class="lineno"> 8555</span>&#160;}</div>
+<div class="line"><a name="l08556"></a><span class="lineno"> 8556</span>&#160; </div>
+<div class="line"><a name="l08557"></a><span class="lineno"> 8557</span>&#160;<span class="keywordtype">void</span> VmaStringBuilder::AddNumber(uint64_t num)</div>
+<div class="line"><a name="l08558"></a><span class="lineno"> 8558</span>&#160;{</div>
+<div class="line"><a name="l08559"></a><span class="lineno"> 8559</span>&#160;    <span class="keywordtype">char</span> buf[21];</div>
+<div class="line"><a name="l08560"></a><span class="lineno"> 8560</span>&#160;    buf[20] = <span class="charliteral">&#39;\0&#39;</span>;</div>
+<div class="line"><a name="l08561"></a><span class="lineno"> 8561</span>&#160;    <span class="keywordtype">char</span> *p = &amp;buf[20];</div>
+<div class="line"><a name="l08562"></a><span class="lineno"> 8562</span>&#160;    <span class="keywordflow">do</span></div>
+<div class="line"><a name="l08563"></a><span class="lineno"> 8563</span>&#160;    {</div>
+<div class="line"><a name="l08564"></a><span class="lineno"> 8564</span>&#160;        *--p = <span class="charliteral">&#39;0&#39;</span> + (num % 10);</div>
+<div class="line"><a name="l08565"></a><span class="lineno"> 8565</span>&#160;        num /= 10;</div>
+<div class="line"><a name="l08566"></a><span class="lineno"> 8566</span>&#160;    }</div>
+<div class="line"><a name="l08567"></a><span class="lineno"> 8567</span>&#160;    <span class="keywordflow">while</span>(num);</div>
+<div class="line"><a name="l08568"></a><span class="lineno"> 8568</span>&#160;    Add(p);</div>
+<div class="line"><a name="l08569"></a><span class="lineno"> 8569</span>&#160;}</div>
+<div class="line"><a name="l08570"></a><span class="lineno"> 8570</span>&#160; </div>
+<div class="line"><a name="l08571"></a><span class="lineno"> 8571</span>&#160;<span class="keywordtype">void</span> VmaStringBuilder::AddPointer(<span class="keyword">const</span> <span class="keywordtype">void</span>* ptr)</div>
+<div class="line"><a name="l08572"></a><span class="lineno"> 8572</span>&#160;{</div>
+<div class="line"><a name="l08573"></a><span class="lineno"> 8573</span>&#160;    <span class="keywordtype">char</span> buf[21];</div>
+<div class="line"><a name="l08574"></a><span class="lineno"> 8574</span>&#160;    VmaPtrToStr(buf, <span class="keyword">sizeof</span>(buf), ptr);</div>
+<div class="line"><a name="l08575"></a><span class="lineno"> 8575</span>&#160;    Add(buf);</div>
+<div class="line"><a name="l08576"></a><span class="lineno"> 8576</span>&#160;}</div>
 <div class="line"><a name="l08577"></a><span class="lineno"> 8577</span>&#160; </div>
-<div class="line"><a name="l08578"></a><span class="lineno"> 8578</span>&#160;    <span class="keywordflow">if</span>((m_MapCount &amp; ~MAP_COUNT_FLAG_PERSISTENT_MAP) &lt; 0x7F)</div>
-<div class="line"><a name="l08579"></a><span class="lineno"> 8579</span>&#160;    {</div>
-<div class="line"><a name="l08580"></a><span class="lineno"> 8580</span>&#160;        ++m_MapCount;</div>
-<div class="line"><a name="l08581"></a><span class="lineno"> 8581</span>&#160;    }</div>
-<div class="line"><a name="l08582"></a><span class="lineno"> 8582</span>&#160;    <span class="keywordflow">else</span></div>
-<div class="line"><a name="l08583"></a><span class="lineno"> 8583</span>&#160;    {</div>
-<div class="line"><a name="l08584"></a><span class="lineno"> 8584</span>&#160;        VMA_ASSERT(0 &amp;&amp; <span class="stringliteral">&quot;Allocation mapped too many times simultaneously.&quot;</span>);</div>
-<div class="line"><a name="l08585"></a><span class="lineno"> 8585</span>&#160;    }</div>
-<div class="line"><a name="l08586"></a><span class="lineno"> 8586</span>&#160;}</div>
-<div class="line"><a name="l08587"></a><span class="lineno"> 8587</span>&#160; </div>
-<div class="line"><a name="l08588"></a><span class="lineno"> 8588</span>&#160;<span class="keywordtype">void</span> VmaAllocation_T::BlockAllocUnmap()</div>
-<div class="line"><a name="l08589"></a><span class="lineno"> 8589</span>&#160;{</div>
-<div class="line"><a name="l08590"></a><span class="lineno"> 8590</span>&#160;    VMA_ASSERT(GetType() == ALLOCATION_TYPE_BLOCK);</div>
+<div class="line"><a name="l08578"></a><span class="lineno"> 8578</span>&#160;<span class="preprocessor">#endif </span><span class="comment">// #if VMA_STATS_STRING_ENABLED</span></div>
+<div class="line"><a name="l08579"></a><span class="lineno"> 8579</span>&#160; </div>
+<div class="line"><a name="l08581"></a><span class="lineno"> 8581</span>&#160;<span class="comment">// VmaJsonWriter</span></div>
+<div class="line"><a name="l08582"></a><span class="lineno"> 8582</span>&#160; </div>
+<div class="line"><a name="l08583"></a><span class="lineno"> 8583</span>&#160;<span class="preprocessor">#if VMA_STATS_STRING_ENABLED</span></div>
+<div class="line"><a name="l08584"></a><span class="lineno"> 8584</span>&#160; </div>
+<div class="line"><a name="l08585"></a><span class="lineno"> 8585</span>&#160;<span class="keyword">class </span>VmaJsonWriter</div>
+<div class="line"><a name="l08586"></a><span class="lineno"> 8586</span>&#160;{</div>
+<div class="line"><a name="l08587"></a><span class="lineno"> 8587</span>&#160;    VMA_CLASS_NO_COPY(VmaJsonWriter)</div>
+<div class="line"><a name="l08588"></a><span class="lineno"> 8588</span>&#160;<span class="keyword">public</span>:</div>
+<div class="line"><a name="l08589"></a><span class="lineno"> 8589</span>&#160;    VmaJsonWriter(<span class="keyword">const</span> VkAllocationCallbacks* pAllocationCallbacks, VmaStringBuilder&amp; sb);</div>
+<div class="line"><a name="l08590"></a><span class="lineno"> 8590</span>&#160;    ~VmaJsonWriter();</div>
 <div class="line"><a name="l08591"></a><span class="lineno"> 8591</span>&#160; </div>
-<div class="line"><a name="l08592"></a><span class="lineno"> 8592</span>&#160;    <span class="keywordflow">if</span>((m_MapCount &amp; ~MAP_COUNT_FLAG_PERSISTENT_MAP) != 0)</div>
-<div class="line"><a name="l08593"></a><span class="lineno"> 8593</span>&#160;    {</div>
-<div class="line"><a name="l08594"></a><span class="lineno"> 8594</span>&#160;        --m_MapCount;</div>
-<div class="line"><a name="l08595"></a><span class="lineno"> 8595</span>&#160;    }</div>
-<div class="line"><a name="l08596"></a><span class="lineno"> 8596</span>&#160;    <span class="keywordflow">else</span></div>
-<div class="line"><a name="l08597"></a><span class="lineno"> 8597</span>&#160;    {</div>
-<div class="line"><a name="l08598"></a><span class="lineno"> 8598</span>&#160;        VMA_ASSERT(0 &amp;&amp; <span class="stringliteral">&quot;Unmapping allocation not previously mapped.&quot;</span>);</div>
-<div class="line"><a name="l08599"></a><span class="lineno"> 8599</span>&#160;    }</div>
-<div class="line"><a name="l08600"></a><span class="lineno"> 8600</span>&#160;}</div>
-<div class="line"><a name="l08601"></a><span class="lineno"> 8601</span>&#160; </div>
-<div class="line"><a name="l08602"></a><span class="lineno"> 8602</span>&#160;VkResult VmaAllocation_T::DedicatedAllocMap(<a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator, <span class="keywordtype">void</span>** ppData)</div>
-<div class="line"><a name="l08603"></a><span class="lineno"> 8603</span>&#160;{</div>
-<div class="line"><a name="l08604"></a><span class="lineno"> 8604</span>&#160;    VMA_ASSERT(GetType() == ALLOCATION_TYPE_DEDICATED);</div>
+<div class="line"><a name="l08592"></a><span class="lineno"> 8592</span>&#160;    <span class="keywordtype">void</span> BeginObject(<span class="keywordtype">bool</span> singleLine = <span class="keyword">false</span>);</div>
+<div class="line"><a name="l08593"></a><span class="lineno"> 8593</span>&#160;    <span class="keywordtype">void</span> EndObject();</div>
+<div class="line"><a name="l08594"></a><span class="lineno"> 8594</span>&#160; </div>
+<div class="line"><a name="l08595"></a><span class="lineno"> 8595</span>&#160;    <span class="keywordtype">void</span> BeginArray(<span class="keywordtype">bool</span> singleLine = <span class="keyword">false</span>);</div>
+<div class="line"><a name="l08596"></a><span class="lineno"> 8596</span>&#160;    <span class="keywordtype">void</span> EndArray();</div>
+<div class="line"><a name="l08597"></a><span class="lineno"> 8597</span>&#160; </div>
+<div class="line"><a name="l08598"></a><span class="lineno"> 8598</span>&#160;    <span class="keywordtype">void</span> WriteString(<span class="keyword">const</span> <span class="keywordtype">char</span>* pStr);</div>
+<div class="line"><a name="l08599"></a><span class="lineno"> 8599</span>&#160;    <span class="keywordtype">void</span> BeginString(<span class="keyword">const</span> <span class="keywordtype">char</span>* pStr = VMA_NULL);</div>
+<div class="line"><a name="l08600"></a><span class="lineno"> 8600</span>&#160;    <span class="keywordtype">void</span> ContinueString(<span class="keyword">const</span> <span class="keywordtype">char</span>* pStr);</div>
+<div class="line"><a name="l08601"></a><span class="lineno"> 8601</span>&#160;    <span class="keywordtype">void</span> ContinueString(uint32_t n);</div>
+<div class="line"><a name="l08602"></a><span class="lineno"> 8602</span>&#160;    <span class="keywordtype">void</span> ContinueString(uint64_t n);</div>
+<div class="line"><a name="l08603"></a><span class="lineno"> 8603</span>&#160;    <span class="keywordtype">void</span> ContinueString_Pointer(<span class="keyword">const</span> <span class="keywordtype">void</span>* ptr);</div>
+<div class="line"><a name="l08604"></a><span class="lineno"> 8604</span>&#160;    <span class="keywordtype">void</span> EndString(<span class="keyword">const</span> <span class="keywordtype">char</span>* pStr = VMA_NULL);</div>
 <div class="line"><a name="l08605"></a><span class="lineno"> 8605</span>&#160; </div>
-<div class="line"><a name="l08606"></a><span class="lineno"> 8606</span>&#160;    <span class="keywordflow">if</span>(m_MapCount != 0)</div>
-<div class="line"><a name="l08607"></a><span class="lineno"> 8607</span>&#160;    {</div>
-<div class="line"><a name="l08608"></a><span class="lineno"> 8608</span>&#160;        <span class="keywordflow">if</span>((m_MapCount &amp; ~MAP_COUNT_FLAG_PERSISTENT_MAP) &lt; 0x7F)</div>
-<div class="line"><a name="l08609"></a><span class="lineno"> 8609</span>&#160;        {</div>
-<div class="line"><a name="l08610"></a><span class="lineno"> 8610</span>&#160;            VMA_ASSERT(m_DedicatedAllocation.m_pMappedData != VMA_NULL);</div>
-<div class="line"><a name="l08611"></a><span class="lineno"> 8611</span>&#160;            *ppData = m_DedicatedAllocation.m_pMappedData;</div>
-<div class="line"><a name="l08612"></a><span class="lineno"> 8612</span>&#160;            ++m_MapCount;</div>
-<div class="line"><a name="l08613"></a><span class="lineno"> 8613</span>&#160;            <span class="keywordflow">return</span> VK_SUCCESS;</div>
-<div class="line"><a name="l08614"></a><span class="lineno"> 8614</span>&#160;        }</div>
-<div class="line"><a name="l08615"></a><span class="lineno"> 8615</span>&#160;        <span class="keywordflow">else</span></div>
-<div class="line"><a name="l08616"></a><span class="lineno"> 8616</span>&#160;        {</div>
-<div class="line"><a name="l08617"></a><span class="lineno"> 8617</span>&#160;            VMA_ASSERT(0 &amp;&amp; <span class="stringliteral">&quot;Dedicated allocation mapped too many times simultaneously.&quot;</span>);</div>
-<div class="line"><a name="l08618"></a><span class="lineno"> 8618</span>&#160;            <span class="keywordflow">return</span> VK_ERROR_MEMORY_MAP_FAILED;</div>
-<div class="line"><a name="l08619"></a><span class="lineno"> 8619</span>&#160;        }</div>
-<div class="line"><a name="l08620"></a><span class="lineno"> 8620</span>&#160;    }</div>
-<div class="line"><a name="l08621"></a><span class="lineno"> 8621</span>&#160;    <span class="keywordflow">else</span></div>
-<div class="line"><a name="l08622"></a><span class="lineno"> 8622</span>&#160;    {</div>
-<div class="line"><a name="l08623"></a><span class="lineno"> 8623</span>&#160;        VkResult result = (*hAllocator-&gt;GetVulkanFunctions().vkMapMemory)(</div>
-<div class="line"><a name="l08624"></a><span class="lineno"> 8624</span>&#160;            hAllocator-&gt;m_hDevice,</div>
-<div class="line"><a name="l08625"></a><span class="lineno"> 8625</span>&#160;            m_DedicatedAllocation.m_hMemory,</div>
-<div class="line"><a name="l08626"></a><span class="lineno"> 8626</span>&#160;            0, <span class="comment">// offset</span></div>
-<div class="line"><a name="l08627"></a><span class="lineno"> 8627</span>&#160;            VK_WHOLE_SIZE,</div>
-<div class="line"><a name="l08628"></a><span class="lineno"> 8628</span>&#160;            0, <span class="comment">// flags</span></div>
-<div class="line"><a name="l08629"></a><span class="lineno"> 8629</span>&#160;            ppData);</div>
-<div class="line"><a name="l08630"></a><span class="lineno"> 8630</span>&#160;        <span class="keywordflow">if</span>(result == VK_SUCCESS)</div>
-<div class="line"><a name="l08631"></a><span class="lineno"> 8631</span>&#160;        {</div>
-<div class="line"><a name="l08632"></a><span class="lineno"> 8632</span>&#160;            m_DedicatedAllocation.m_pMappedData = *ppData;</div>
-<div class="line"><a name="l08633"></a><span class="lineno"> 8633</span>&#160;            m_MapCount = 1;</div>
-<div class="line"><a name="l08634"></a><span class="lineno"> 8634</span>&#160;        }</div>
-<div class="line"><a name="l08635"></a><span class="lineno"> 8635</span>&#160;        <span class="keywordflow">return</span> result;</div>
-<div class="line"><a name="l08636"></a><span class="lineno"> 8636</span>&#160;    }</div>
-<div class="line"><a name="l08637"></a><span class="lineno"> 8637</span>&#160;}</div>
-<div class="line"><a name="l08638"></a><span class="lineno"> 8638</span>&#160; </div>
-<div class="line"><a name="l08639"></a><span class="lineno"> 8639</span>&#160;<span class="keywordtype">void</span> VmaAllocation_T::DedicatedAllocUnmap(<a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator)</div>
+<div class="line"><a name="l08606"></a><span class="lineno"> 8606</span>&#160;    <span class="keywordtype">void</span> WriteNumber(uint32_t n);</div>
+<div class="line"><a name="l08607"></a><span class="lineno"> 8607</span>&#160;    <span class="keywordtype">void</span> WriteNumber(uint64_t n);</div>
+<div class="line"><a name="l08608"></a><span class="lineno"> 8608</span>&#160;    <span class="keywordtype">void</span> WriteBool(<span class="keywordtype">bool</span> b);</div>
+<div class="line"><a name="l08609"></a><span class="lineno"> 8609</span>&#160;    <span class="keywordtype">void</span> WriteNull();</div>
+<div class="line"><a name="l08610"></a><span class="lineno"> 8610</span>&#160; </div>
+<div class="line"><a name="l08611"></a><span class="lineno"> 8611</span>&#160;<span class="keyword">private</span>:</div>
+<div class="line"><a name="l08612"></a><span class="lineno"> 8612</span>&#160;    <span class="keyword">static</span> <span class="keyword">const</span> <span class="keywordtype">char</span>* <span class="keyword">const</span> INDENT;</div>
+<div class="line"><a name="l08613"></a><span class="lineno"> 8613</span>&#160; </div>
+<div class="line"><a name="l08614"></a><span class="lineno"> 8614</span>&#160;    <span class="keyword">enum</span> COLLECTION_TYPE</div>
+<div class="line"><a name="l08615"></a><span class="lineno"> 8615</span>&#160;    {</div>
+<div class="line"><a name="l08616"></a><span class="lineno"> 8616</span>&#160;        COLLECTION_TYPE_OBJECT,</div>
+<div class="line"><a name="l08617"></a><span class="lineno"> 8617</span>&#160;        COLLECTION_TYPE_ARRAY,</div>
+<div class="line"><a name="l08618"></a><span class="lineno"> 8618</span>&#160;    };</div>
+<div class="line"><a name="l08619"></a><span class="lineno"> 8619</span>&#160;    <span class="keyword">struct </span>StackItem</div>
+<div class="line"><a name="l08620"></a><span class="lineno"> 8620</span>&#160;    {</div>
+<div class="line"><a name="l08621"></a><span class="lineno"> 8621</span>&#160;        COLLECTION_TYPE type;</div>
+<div class="line"><a name="l08622"></a><span class="lineno"> 8622</span>&#160;        uint32_t valueCount;</div>
+<div class="line"><a name="l08623"></a><span class="lineno"> 8623</span>&#160;        <span class="keywordtype">bool</span> singleLineMode;</div>
+<div class="line"><a name="l08624"></a><span class="lineno"> 8624</span>&#160;    };</div>
+<div class="line"><a name="l08625"></a><span class="lineno"> 8625</span>&#160; </div>
+<div class="line"><a name="l08626"></a><span class="lineno"> 8626</span>&#160;    VmaStringBuilder&amp; m_SB;</div>
+<div class="line"><a name="l08627"></a><span class="lineno"> 8627</span>&#160;    VmaVector&lt; StackItem, VmaStlAllocator&lt;StackItem&gt; &gt; m_Stack;</div>
+<div class="line"><a name="l08628"></a><span class="lineno"> 8628</span>&#160;    <span class="keywordtype">bool</span> m_InsideString;</div>
+<div class="line"><a name="l08629"></a><span class="lineno"> 8629</span>&#160; </div>
+<div class="line"><a name="l08630"></a><span class="lineno"> 8630</span>&#160;    <span class="keywordtype">void</span> BeginValue(<span class="keywordtype">bool</span> isString);</div>
+<div class="line"><a name="l08631"></a><span class="lineno"> 8631</span>&#160;    <span class="keywordtype">void</span> WriteIndent(<span class="keywordtype">bool</span> oneLess = <span class="keyword">false</span>);</div>
+<div class="line"><a name="l08632"></a><span class="lineno"> 8632</span>&#160;};</div>
+<div class="line"><a name="l08633"></a><span class="lineno"> 8633</span>&#160; </div>
+<div class="line"><a name="l08634"></a><span class="lineno"> 8634</span>&#160;<span class="keyword">const</span> <span class="keywordtype">char</span>* <span class="keyword">const</span> VmaJsonWriter::INDENT = <span class="stringliteral">&quot;  &quot;</span>;</div>
+<div class="line"><a name="l08635"></a><span class="lineno"> 8635</span>&#160; </div>
+<div class="line"><a name="l08636"></a><span class="lineno"> 8636</span>&#160;VmaJsonWriter::VmaJsonWriter(<span class="keyword">const</span> VkAllocationCallbacks* pAllocationCallbacks, VmaStringBuilder&amp; sb) :</div>
+<div class="line"><a name="l08637"></a><span class="lineno"> 8637</span>&#160;    m_SB(sb),</div>
+<div class="line"><a name="l08638"></a><span class="lineno"> 8638</span>&#160;    m_Stack(VmaStlAllocator&lt;StackItem&gt;(pAllocationCallbacks)),</div>
+<div class="line"><a name="l08639"></a><span class="lineno"> 8639</span>&#160;    m_InsideString(false)</div>
 <div class="line"><a name="l08640"></a><span class="lineno"> 8640</span>&#160;{</div>
-<div class="line"><a name="l08641"></a><span class="lineno"> 8641</span>&#160;    VMA_ASSERT(GetType() == ALLOCATION_TYPE_DEDICATED);</div>
+<div class="line"><a name="l08641"></a><span class="lineno"> 8641</span>&#160;}</div>
 <div class="line"><a name="l08642"></a><span class="lineno"> 8642</span>&#160; </div>
-<div class="line"><a name="l08643"></a><span class="lineno"> 8643</span>&#160;    <span class="keywordflow">if</span>((m_MapCount &amp; ~MAP_COUNT_FLAG_PERSISTENT_MAP) != 0)</div>
-<div class="line"><a name="l08644"></a><span class="lineno"> 8644</span>&#160;    {</div>
-<div class="line"><a name="l08645"></a><span class="lineno"> 8645</span>&#160;        --m_MapCount;</div>
-<div class="line"><a name="l08646"></a><span class="lineno"> 8646</span>&#160;        <span class="keywordflow">if</span>(m_MapCount == 0)</div>
-<div class="line"><a name="l08647"></a><span class="lineno"> 8647</span>&#160;        {</div>
-<div class="line"><a name="l08648"></a><span class="lineno"> 8648</span>&#160;            m_DedicatedAllocation.m_pMappedData = VMA_NULL;</div>
-<div class="line"><a name="l08649"></a><span class="lineno"> 8649</span>&#160;            (*hAllocator-&gt;GetVulkanFunctions().vkUnmapMemory)(</div>
-<div class="line"><a name="l08650"></a><span class="lineno"> 8650</span>&#160;                hAllocator-&gt;m_hDevice,</div>
-<div class="line"><a name="l08651"></a><span class="lineno"> 8651</span>&#160;                m_DedicatedAllocation.m_hMemory);</div>
-<div class="line"><a name="l08652"></a><span class="lineno"> 8652</span>&#160;        }</div>
-<div class="line"><a name="l08653"></a><span class="lineno"> 8653</span>&#160;    }</div>
-<div class="line"><a name="l08654"></a><span class="lineno"> 8654</span>&#160;    <span class="keywordflow">else</span></div>
-<div class="line"><a name="l08655"></a><span class="lineno"> 8655</span>&#160;    {</div>
-<div class="line"><a name="l08656"></a><span class="lineno"> 8656</span>&#160;        VMA_ASSERT(0 &amp;&amp; <span class="stringliteral">&quot;Unmapping dedicated allocation not previously mapped.&quot;</span>);</div>
-<div class="line"><a name="l08657"></a><span class="lineno"> 8657</span>&#160;    }</div>
-<div class="line"><a name="l08658"></a><span class="lineno"> 8658</span>&#160;}</div>
-<div class="line"><a name="l08659"></a><span class="lineno"> 8659</span>&#160; </div>
-<div class="line"><a name="l08660"></a><span class="lineno"> 8660</span>&#160;<span class="preprocessor">#if VMA_STATS_STRING_ENABLED</span></div>
-<div class="line"><a name="l08661"></a><span class="lineno"> 8661</span>&#160; </div>
-<div class="line"><a name="l08662"></a><span class="lineno"> 8662</span>&#160;<span class="keyword">static</span> <span class="keywordtype">void</span> VmaPrintStatInfo(VmaJsonWriter&amp; json, <span class="keyword">const</span> <a class="code" href="struct_vma_stat_info.html">VmaStatInfo</a>&amp; stat)</div>
-<div class="line"><a name="l08663"></a><span class="lineno"> 8663</span>&#160;{</div>
-<div class="line"><a name="l08664"></a><span class="lineno"> 8664</span>&#160;    json.BeginObject();</div>
-<div class="line"><a name="l08665"></a><span class="lineno"> 8665</span>&#160; </div>
-<div class="line"><a name="l08666"></a><span class="lineno"> 8666</span>&#160;    json.WriteString(<span class="stringliteral">&quot;Blocks&quot;</span>);</div>
-<div class="line"><a name="l08667"></a><span class="lineno"> 8667</span>&#160;    json.WriteNumber(stat.<a class="code" href="struct_vma_stat_info.html#abc4bb7cd611900778464c56e50c970a4">blockCount</a>);</div>
-<div class="line"><a name="l08668"></a><span class="lineno"> 8668</span>&#160; </div>
-<div class="line"><a name="l08669"></a><span class="lineno"> 8669</span>&#160;    json.WriteString(<span class="stringliteral">&quot;Allocations&quot;</span>);</div>
-<div class="line"><a name="l08670"></a><span class="lineno"> 8670</span>&#160;    json.WriteNumber(stat.<a class="code" href="struct_vma_stat_info.html#a537741e4d5cdddc1c0ab95ec650afaff">allocationCount</a>);</div>
-<div class="line"><a name="l08671"></a><span class="lineno"> 8671</span>&#160; </div>
-<div class="line"><a name="l08672"></a><span class="lineno"> 8672</span>&#160;    json.WriteString(<span class="stringliteral">&quot;UnusedRanges&quot;</span>);</div>
-<div class="line"><a name="l08673"></a><span class="lineno"> 8673</span>&#160;    json.WriteNumber(stat.<a class="code" href="struct_vma_stat_info.html#ae06129c771bfebfd6468a7f4276502a9">unusedRangeCount</a>);</div>
-<div class="line"><a name="l08674"></a><span class="lineno"> 8674</span>&#160; </div>
-<div class="line"><a name="l08675"></a><span class="lineno"> 8675</span>&#160;    json.WriteString(<span class="stringliteral">&quot;UsedBytes&quot;</span>);</div>
-<div class="line"><a name="l08676"></a><span class="lineno"> 8676</span>&#160;    json.WriteNumber(stat.<a class="code" href="struct_vma_stat_info.html#ab0c6c73837e5a70c749fbd4f6064895a">usedBytes</a>);</div>
+<div class="line"><a name="l08643"></a><span class="lineno"> 8643</span>&#160;VmaJsonWriter::~VmaJsonWriter()</div>
+<div class="line"><a name="l08644"></a><span class="lineno"> 8644</span>&#160;{</div>
+<div class="line"><a name="l08645"></a><span class="lineno"> 8645</span>&#160;    VMA_ASSERT(!m_InsideString);</div>
+<div class="line"><a name="l08646"></a><span class="lineno"> 8646</span>&#160;    VMA_ASSERT(m_Stack.empty());</div>
+<div class="line"><a name="l08647"></a><span class="lineno"> 8647</span>&#160;}</div>
+<div class="line"><a name="l08648"></a><span class="lineno"> 8648</span>&#160; </div>
+<div class="line"><a name="l08649"></a><span class="lineno"> 8649</span>&#160;<span class="keywordtype">void</span> VmaJsonWriter::BeginObject(<span class="keywordtype">bool</span> singleLine)</div>
+<div class="line"><a name="l08650"></a><span class="lineno"> 8650</span>&#160;{</div>
+<div class="line"><a name="l08651"></a><span class="lineno"> 8651</span>&#160;    VMA_ASSERT(!m_InsideString);</div>
+<div class="line"><a name="l08652"></a><span class="lineno"> 8652</span>&#160; </div>
+<div class="line"><a name="l08653"></a><span class="lineno"> 8653</span>&#160;    BeginValue(<span class="keyword">false</span>);</div>
+<div class="line"><a name="l08654"></a><span class="lineno"> 8654</span>&#160;    m_SB.Add(<span class="charliteral">&#39;{&#39;</span>);</div>
+<div class="line"><a name="l08655"></a><span class="lineno"> 8655</span>&#160; </div>
+<div class="line"><a name="l08656"></a><span class="lineno"> 8656</span>&#160;    StackItem item;</div>
+<div class="line"><a name="l08657"></a><span class="lineno"> 8657</span>&#160;    item.type = COLLECTION_TYPE_OBJECT;</div>
+<div class="line"><a name="l08658"></a><span class="lineno"> 8658</span>&#160;    item.valueCount = 0;</div>
+<div class="line"><a name="l08659"></a><span class="lineno"> 8659</span>&#160;    item.singleLineMode = singleLine;</div>
+<div class="line"><a name="l08660"></a><span class="lineno"> 8660</span>&#160;    m_Stack.push_back(item);</div>
+<div class="line"><a name="l08661"></a><span class="lineno"> 8661</span>&#160;}</div>
+<div class="line"><a name="l08662"></a><span class="lineno"> 8662</span>&#160; </div>
+<div class="line"><a name="l08663"></a><span class="lineno"> 8663</span>&#160;<span class="keywordtype">void</span> VmaJsonWriter::EndObject()</div>
+<div class="line"><a name="l08664"></a><span class="lineno"> 8664</span>&#160;{</div>
+<div class="line"><a name="l08665"></a><span class="lineno"> 8665</span>&#160;    VMA_ASSERT(!m_InsideString);</div>
+<div class="line"><a name="l08666"></a><span class="lineno"> 8666</span>&#160; </div>
+<div class="line"><a name="l08667"></a><span class="lineno"> 8667</span>&#160;    WriteIndent(<span class="keyword">true</span>);</div>
+<div class="line"><a name="l08668"></a><span class="lineno"> 8668</span>&#160;    m_SB.Add(<span class="charliteral">&#39;}&#39;</span>);</div>
+<div class="line"><a name="l08669"></a><span class="lineno"> 8669</span>&#160; </div>
+<div class="line"><a name="l08670"></a><span class="lineno"> 8670</span>&#160;    VMA_ASSERT(!m_Stack.empty() &amp;&amp; m_Stack.back().type == COLLECTION_TYPE_OBJECT);</div>
+<div class="line"><a name="l08671"></a><span class="lineno"> 8671</span>&#160;    m_Stack.pop_back();</div>
+<div class="line"><a name="l08672"></a><span class="lineno"> 8672</span>&#160;}</div>
+<div class="line"><a name="l08673"></a><span class="lineno"> 8673</span>&#160; </div>
+<div class="line"><a name="l08674"></a><span class="lineno"> 8674</span>&#160;<span class="keywordtype">void</span> VmaJsonWriter::BeginArray(<span class="keywordtype">bool</span> singleLine)</div>
+<div class="line"><a name="l08675"></a><span class="lineno"> 8675</span>&#160;{</div>
+<div class="line"><a name="l08676"></a><span class="lineno"> 8676</span>&#160;    VMA_ASSERT(!m_InsideString);</div>
 <div class="line"><a name="l08677"></a><span class="lineno"> 8677</span>&#160; </div>
-<div class="line"><a name="l08678"></a><span class="lineno"> 8678</span>&#160;    json.WriteString(<span class="stringliteral">&quot;UnusedBytes&quot;</span>);</div>
-<div class="line"><a name="l08679"></a><span class="lineno"> 8679</span>&#160;    json.WriteNumber(stat.<a class="code" href="struct_vma_stat_info.html#a1859d290aca2cd582d8dc25922092669">unusedBytes</a>);</div>
+<div class="line"><a name="l08678"></a><span class="lineno"> 8678</span>&#160;    BeginValue(<span class="keyword">false</span>);</div>
+<div class="line"><a name="l08679"></a><span class="lineno"> 8679</span>&#160;    m_SB.Add(<span class="charliteral">&#39;[&#39;</span>);</div>
 <div class="line"><a name="l08680"></a><span class="lineno"> 8680</span>&#160; </div>
-<div class="line"><a name="l08681"></a><span class="lineno"> 8681</span>&#160;    <span class="keywordflow">if</span>(stat.<a class="code" href="struct_vma_stat_info.html#a537741e4d5cdddc1c0ab95ec650afaff">allocationCount</a> &gt; 1)</div>
-<div class="line"><a name="l08682"></a><span class="lineno"> 8682</span>&#160;    {</div>
-<div class="line"><a name="l08683"></a><span class="lineno"> 8683</span>&#160;        json.WriteString(<span class="stringliteral">&quot;AllocationSize&quot;</span>);</div>
-<div class="line"><a name="l08684"></a><span class="lineno"> 8684</span>&#160;        json.BeginObject(<span class="keyword">true</span>);</div>
-<div class="line"><a name="l08685"></a><span class="lineno"> 8685</span>&#160;        json.WriteString(<span class="stringliteral">&quot;Min&quot;</span>);</div>
-<div class="line"><a name="l08686"></a><span class="lineno"> 8686</span>&#160;        json.WriteNumber(stat.<a class="code" href="struct_vma_stat_info.html#ade8b40bd3139c04aabd2fc538a356fea">allocationSizeMin</a>);</div>
-<div class="line"><a name="l08687"></a><span class="lineno"> 8687</span>&#160;        json.WriteString(<span class="stringliteral">&quot;Avg&quot;</span>);</div>
-<div class="line"><a name="l08688"></a><span class="lineno"> 8688</span>&#160;        json.WriteNumber(stat.<a class="code" href="struct_vma_stat_info.html#a1081a039964e566c672e7a2347f9e599">allocationSizeAvg</a>);</div>
-<div class="line"><a name="l08689"></a><span class="lineno"> 8689</span>&#160;        json.WriteString(<span class="stringliteral">&quot;Max&quot;</span>);</div>
-<div class="line"><a name="l08690"></a><span class="lineno"> 8690</span>&#160;        json.WriteNumber(stat.<a class="code" href="struct_vma_stat_info.html#a17e9733a5ecd76287d4db6e66f71f50c">allocationSizeMax</a>);</div>
-<div class="line"><a name="l08691"></a><span class="lineno"> 8691</span>&#160;        json.EndObject();</div>
-<div class="line"><a name="l08692"></a><span class="lineno"> 8692</span>&#160;    }</div>
-<div class="line"><a name="l08693"></a><span class="lineno"> 8693</span>&#160; </div>
-<div class="line"><a name="l08694"></a><span class="lineno"> 8694</span>&#160;    <span class="keywordflow">if</span>(stat.<a class="code" href="struct_vma_stat_info.html#ae06129c771bfebfd6468a7f4276502a9">unusedRangeCount</a> &gt; 1)</div>
-<div class="line"><a name="l08695"></a><span class="lineno"> 8695</span>&#160;    {</div>
-<div class="line"><a name="l08696"></a><span class="lineno"> 8696</span>&#160;        json.WriteString(<span class="stringliteral">&quot;UnusedRangeSize&quot;</span>);</div>
-<div class="line"><a name="l08697"></a><span class="lineno"> 8697</span>&#160;        json.BeginObject(<span class="keyword">true</span>);</div>
-<div class="line"><a name="l08698"></a><span class="lineno"> 8698</span>&#160;        json.WriteString(<span class="stringliteral">&quot;Min&quot;</span>);</div>
-<div class="line"><a name="l08699"></a><span class="lineno"> 8699</span>&#160;        json.WriteNumber(stat.<a class="code" href="struct_vma_stat_info.html#aedeba931324f16589cd2416c0d2dd0d4">unusedRangeSizeMin</a>);</div>
-<div class="line"><a name="l08700"></a><span class="lineno"> 8700</span>&#160;        json.WriteString(<span class="stringliteral">&quot;Avg&quot;</span>);</div>
-<div class="line"><a name="l08701"></a><span class="lineno"> 8701</span>&#160;        json.WriteNumber(stat.<a class="code" href="struct_vma_stat_info.html#a2f9b3452af90c9768a30b7fb6ae194fc">unusedRangeSizeAvg</a>);</div>
-<div class="line"><a name="l08702"></a><span class="lineno"> 8702</span>&#160;        json.WriteString(<span class="stringliteral">&quot;Max&quot;</span>);</div>
-<div class="line"><a name="l08703"></a><span class="lineno"> 8703</span>&#160;        json.WriteNumber(stat.<a class="code" href="struct_vma_stat_info.html#a5ba1a2476c4d39b10f7e2f7ebbb72ac4">unusedRangeSizeMax</a>);</div>
-<div class="line"><a name="l08704"></a><span class="lineno"> 8704</span>&#160;        json.EndObject();</div>
-<div class="line"><a name="l08705"></a><span class="lineno"> 8705</span>&#160;    }</div>
-<div class="line"><a name="l08706"></a><span class="lineno"> 8706</span>&#160; </div>
-<div class="line"><a name="l08707"></a><span class="lineno"> 8707</span>&#160;    json.EndObject();</div>
-<div class="line"><a name="l08708"></a><span class="lineno"> 8708</span>&#160;}</div>
-<div class="line"><a name="l08709"></a><span class="lineno"> 8709</span>&#160; </div>
-<div class="line"><a name="l08710"></a><span class="lineno"> 8710</span>&#160;<span class="preprocessor">#endif // #if VMA_STATS_STRING_ENABLED</span></div>
-<div class="line"><a name="l08711"></a><span class="lineno"> 8711</span>&#160; </div>
-<div class="line"><a name="l08712"></a><span class="lineno"> 8712</span>&#160;<span class="keyword">struct </span>VmaSuballocationItemSizeLess</div>
-<div class="line"><a name="l08713"></a><span class="lineno"> 8713</span>&#160;{</div>
-<div class="line"><a name="l08714"></a><span class="lineno"> 8714</span>&#160;    <span class="keywordtype">bool</span> operator()(</div>
-<div class="line"><a name="l08715"></a><span class="lineno"> 8715</span>&#160;        <span class="keyword">const</span> VmaSuballocationList::iterator lhs,</div>
-<div class="line"><a name="l08716"></a><span class="lineno"> 8716</span>&#160;        <span class="keyword">const</span> VmaSuballocationList::iterator rhs)<span class="keyword"> const</span></div>
-<div class="line"><a name="l08717"></a><span class="lineno"> 8717</span>&#160;<span class="keyword">    </span>{</div>
-<div class="line"><a name="l08718"></a><span class="lineno"> 8718</span>&#160;        <span class="keywordflow">return</span> lhs-&gt;size &lt; rhs-&gt;size;</div>
-<div class="line"><a name="l08719"></a><span class="lineno"> 8719</span>&#160;    }</div>
-<div class="line"><a name="l08720"></a><span class="lineno"> 8720</span>&#160;    <span class="keywordtype">bool</span> operator()(</div>
-<div class="line"><a name="l08721"></a><span class="lineno"> 8721</span>&#160;        <span class="keyword">const</span> VmaSuballocationList::iterator lhs,</div>
-<div class="line"><a name="l08722"></a><span class="lineno"> 8722</span>&#160;        VkDeviceSize rhsSize)<span class="keyword"> const</span></div>
-<div class="line"><a name="l08723"></a><span class="lineno"> 8723</span>&#160;<span class="keyword">    </span>{</div>
-<div class="line"><a name="l08724"></a><span class="lineno"> 8724</span>&#160;        <span class="keywordflow">return</span> lhs-&gt;size &lt; rhsSize;</div>
-<div class="line"><a name="l08725"></a><span class="lineno"> 8725</span>&#160;    }</div>
-<div class="line"><a name="l08726"></a><span class="lineno"> 8726</span>&#160;};</div>
-<div class="line"><a name="l08727"></a><span class="lineno"> 8727</span>&#160; </div>
-<div class="line"><a name="l08728"></a><span class="lineno"> 8728</span>&#160; </div>
-<div class="line"><a name="l08730"></a><span class="lineno"> 8730</span>&#160;<span class="comment">// class VmaBlockMetadata</span></div>
-<div class="line"><a name="l08731"></a><span class="lineno"> 8731</span>&#160; </div>
-<div class="line"><a name="l08732"></a><span class="lineno"> 8732</span>&#160;VmaBlockMetadata::VmaBlockMetadata(<a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator) :</div>
-<div class="line"><a name="l08733"></a><span class="lineno"> 8733</span>&#160;    m_Size(0),</div>
-<div class="line"><a name="l08734"></a><span class="lineno"> 8734</span>&#160;    m_pAllocationCallbacks(hAllocator-&gt;GetAllocationCallbacks())</div>
-<div class="line"><a name="l08735"></a><span class="lineno"> 8735</span>&#160;{</div>
-<div class="line"><a name="l08736"></a><span class="lineno"> 8736</span>&#160;}</div>
-<div class="line"><a name="l08737"></a><span class="lineno"> 8737</span>&#160; </div>
-<div class="line"><a name="l08738"></a><span class="lineno"> 8738</span>&#160;<span class="preprocessor">#if VMA_STATS_STRING_ENABLED</span></div>
-<div class="line"><a name="l08739"></a><span class="lineno"> 8739</span>&#160; </div>
-<div class="line"><a name="l08740"></a><span class="lineno"> 8740</span>&#160;<span class="keywordtype">void</span> VmaBlockMetadata::PrintDetailedMap_Begin(<span class="keyword">class</span> VmaJsonWriter&amp; json,</div>
-<div class="line"><a name="l08741"></a><span class="lineno"> 8741</span>&#160;    VkDeviceSize unusedBytes,</div>
-<div class="line"><a name="l08742"></a><span class="lineno"> 8742</span>&#160;    <span class="keywordtype">size_t</span> allocationCount,</div>
-<div class="line"><a name="l08743"></a><span class="lineno"> 8743</span>&#160;    <span class="keywordtype">size_t</span> unusedRangeCount)<span class="keyword"> const</span></div>
-<div class="line"><a name="l08744"></a><span class="lineno"> 8744</span>&#160;<span class="keyword"></span>{</div>
-<div class="line"><a name="l08745"></a><span class="lineno"> 8745</span>&#160;    json.BeginObject();</div>
-<div class="line"><a name="l08746"></a><span class="lineno"> 8746</span>&#160; </div>
-<div class="line"><a name="l08747"></a><span class="lineno"> 8747</span>&#160;    json.WriteString(<span class="stringliteral">&quot;TotalBytes&quot;</span>);</div>
-<div class="line"><a name="l08748"></a><span class="lineno"> 8748</span>&#160;    json.WriteNumber(GetSize());</div>
-<div class="line"><a name="l08749"></a><span class="lineno"> 8749</span>&#160; </div>
-<div class="line"><a name="l08750"></a><span class="lineno"> 8750</span>&#160;    json.WriteString(<span class="stringliteral">&quot;UnusedBytes&quot;</span>);</div>
-<div class="line"><a name="l08751"></a><span class="lineno"> 8751</span>&#160;    json.WriteNumber(unusedBytes);</div>
-<div class="line"><a name="l08752"></a><span class="lineno"> 8752</span>&#160; </div>
-<div class="line"><a name="l08753"></a><span class="lineno"> 8753</span>&#160;    json.WriteString(<span class="stringliteral">&quot;Allocations&quot;</span>);</div>
-<div class="line"><a name="l08754"></a><span class="lineno"> 8754</span>&#160;    json.WriteNumber((uint64_t)allocationCount);</div>
-<div class="line"><a name="l08755"></a><span class="lineno"> 8755</span>&#160; </div>
-<div class="line"><a name="l08756"></a><span class="lineno"> 8756</span>&#160;    json.WriteString(<span class="stringliteral">&quot;UnusedRanges&quot;</span>);</div>
-<div class="line"><a name="l08757"></a><span class="lineno"> 8757</span>&#160;    json.WriteNumber((uint64_t)unusedRangeCount);</div>
-<div class="line"><a name="l08758"></a><span class="lineno"> 8758</span>&#160; </div>
-<div class="line"><a name="l08759"></a><span class="lineno"> 8759</span>&#160;    json.WriteString(<span class="stringliteral">&quot;Suballocations&quot;</span>);</div>
-<div class="line"><a name="l08760"></a><span class="lineno"> 8760</span>&#160;    json.BeginArray();</div>
-<div class="line"><a name="l08761"></a><span class="lineno"> 8761</span>&#160;}</div>
-<div class="line"><a name="l08762"></a><span class="lineno"> 8762</span>&#160; </div>
-<div class="line"><a name="l08763"></a><span class="lineno"> 8763</span>&#160;<span class="keywordtype">void</span> VmaBlockMetadata::PrintDetailedMap_Allocation(<span class="keyword">class</span> VmaJsonWriter&amp; json,</div>
-<div class="line"><a name="l08764"></a><span class="lineno"> 8764</span>&#160;    VkDeviceSize offset,</div>
-<div class="line"><a name="l08765"></a><span class="lineno"> 8765</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> hAllocation)<span class="keyword"> const</span></div>
-<div class="line"><a name="l08766"></a><span class="lineno"> 8766</span>&#160;<span class="keyword"></span>{</div>
-<div class="line"><a name="l08767"></a><span class="lineno"> 8767</span>&#160;    json.BeginObject(<span class="keyword">true</span>);</div>
-<div class="line"><a name="l08768"></a><span class="lineno"> 8768</span>&#160;        </div>
-<div class="line"><a name="l08769"></a><span class="lineno"> 8769</span>&#160;    json.WriteString(<span class="stringliteral">&quot;Offset&quot;</span>);</div>
-<div class="line"><a name="l08770"></a><span class="lineno"> 8770</span>&#160;    json.WriteNumber(offset);</div>
-<div class="line"><a name="l08771"></a><span class="lineno"> 8771</span>&#160; </div>
-<div class="line"><a name="l08772"></a><span class="lineno"> 8772</span>&#160;    hAllocation-&gt;PrintParameters(json);</div>
+<div class="line"><a name="l08681"></a><span class="lineno"> 8681</span>&#160;    StackItem item;</div>
+<div class="line"><a name="l08682"></a><span class="lineno"> 8682</span>&#160;    item.type = COLLECTION_TYPE_ARRAY;</div>
+<div class="line"><a name="l08683"></a><span class="lineno"> 8683</span>&#160;    item.valueCount = 0;</div>
+<div class="line"><a name="l08684"></a><span class="lineno"> 8684</span>&#160;    item.singleLineMode = singleLine;</div>
+<div class="line"><a name="l08685"></a><span class="lineno"> 8685</span>&#160;    m_Stack.push_back(item);</div>
+<div class="line"><a name="l08686"></a><span class="lineno"> 8686</span>&#160;}</div>
+<div class="line"><a name="l08687"></a><span class="lineno"> 8687</span>&#160; </div>
+<div class="line"><a name="l08688"></a><span class="lineno"> 8688</span>&#160;<span class="keywordtype">void</span> VmaJsonWriter::EndArray()</div>
+<div class="line"><a name="l08689"></a><span class="lineno"> 8689</span>&#160;{</div>
+<div class="line"><a name="l08690"></a><span class="lineno"> 8690</span>&#160;    VMA_ASSERT(!m_InsideString);</div>
+<div class="line"><a name="l08691"></a><span class="lineno"> 8691</span>&#160; </div>
+<div class="line"><a name="l08692"></a><span class="lineno"> 8692</span>&#160;    WriteIndent(<span class="keyword">true</span>);</div>
+<div class="line"><a name="l08693"></a><span class="lineno"> 8693</span>&#160;    m_SB.Add(<span class="charliteral">&#39;]&#39;</span>);</div>
+<div class="line"><a name="l08694"></a><span class="lineno"> 8694</span>&#160; </div>
+<div class="line"><a name="l08695"></a><span class="lineno"> 8695</span>&#160;    VMA_ASSERT(!m_Stack.empty() &amp;&amp; m_Stack.back().type == COLLECTION_TYPE_ARRAY);</div>
+<div class="line"><a name="l08696"></a><span class="lineno"> 8696</span>&#160;    m_Stack.pop_back();</div>
+<div class="line"><a name="l08697"></a><span class="lineno"> 8697</span>&#160;}</div>
+<div class="line"><a name="l08698"></a><span class="lineno"> 8698</span>&#160; </div>
+<div class="line"><a name="l08699"></a><span class="lineno"> 8699</span>&#160;<span class="keywordtype">void</span> VmaJsonWriter::WriteString(<span class="keyword">const</span> <span class="keywordtype">char</span>* pStr)</div>
+<div class="line"><a name="l08700"></a><span class="lineno"> 8700</span>&#160;{</div>
+<div class="line"><a name="l08701"></a><span class="lineno"> 8701</span>&#160;    BeginString(pStr);</div>
+<div class="line"><a name="l08702"></a><span class="lineno"> 8702</span>&#160;    EndString();</div>
+<div class="line"><a name="l08703"></a><span class="lineno"> 8703</span>&#160;}</div>
+<div class="line"><a name="l08704"></a><span class="lineno"> 8704</span>&#160; </div>
+<div class="line"><a name="l08705"></a><span class="lineno"> 8705</span>&#160;<span class="keywordtype">void</span> VmaJsonWriter::BeginString(<span class="keyword">const</span> <span class="keywordtype">char</span>* pStr)</div>
+<div class="line"><a name="l08706"></a><span class="lineno"> 8706</span>&#160;{</div>
+<div class="line"><a name="l08707"></a><span class="lineno"> 8707</span>&#160;    VMA_ASSERT(!m_InsideString);</div>
+<div class="line"><a name="l08708"></a><span class="lineno"> 8708</span>&#160; </div>
+<div class="line"><a name="l08709"></a><span class="lineno"> 8709</span>&#160;    BeginValue(<span class="keyword">true</span>);</div>
+<div class="line"><a name="l08710"></a><span class="lineno"> 8710</span>&#160;    m_SB.Add(<span class="charliteral">&#39;&quot;&#39;</span>);</div>
+<div class="line"><a name="l08711"></a><span class="lineno"> 8711</span>&#160;    m_InsideString = <span class="keyword">true</span>;</div>
+<div class="line"><a name="l08712"></a><span class="lineno"> 8712</span>&#160;    <span class="keywordflow">if</span>(pStr != VMA_NULL &amp;&amp; pStr[0] != <span class="charliteral">&#39;\0&#39;</span>)</div>
+<div class="line"><a name="l08713"></a><span class="lineno"> 8713</span>&#160;    {</div>
+<div class="line"><a name="l08714"></a><span class="lineno"> 8714</span>&#160;        ContinueString(pStr);</div>
+<div class="line"><a name="l08715"></a><span class="lineno"> 8715</span>&#160;    }</div>
+<div class="line"><a name="l08716"></a><span class="lineno"> 8716</span>&#160;}</div>
+<div class="line"><a name="l08717"></a><span class="lineno"> 8717</span>&#160; </div>
+<div class="line"><a name="l08718"></a><span class="lineno"> 8718</span>&#160;<span class="keywordtype">void</span> VmaJsonWriter::ContinueString(<span class="keyword">const</span> <span class="keywordtype">char</span>* pStr)</div>
+<div class="line"><a name="l08719"></a><span class="lineno"> 8719</span>&#160;{</div>
+<div class="line"><a name="l08720"></a><span class="lineno"> 8720</span>&#160;    VMA_ASSERT(m_InsideString);</div>
+<div class="line"><a name="l08721"></a><span class="lineno"> 8721</span>&#160; </div>
+<div class="line"><a name="l08722"></a><span class="lineno"> 8722</span>&#160;    <span class="keyword">const</span> <span class="keywordtype">size_t</span> strLen = strlen(pStr);</div>
+<div class="line"><a name="l08723"></a><span class="lineno"> 8723</span>&#160;    <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> i = 0; i &lt; strLen; ++i)</div>
+<div class="line"><a name="l08724"></a><span class="lineno"> 8724</span>&#160;    {</div>
+<div class="line"><a name="l08725"></a><span class="lineno"> 8725</span>&#160;        <span class="keywordtype">char</span> ch = pStr[i];</div>
+<div class="line"><a name="l08726"></a><span class="lineno"> 8726</span>&#160;        <span class="keywordflow">if</span>(ch == <span class="charliteral">&#39;\\&#39;</span>)</div>
+<div class="line"><a name="l08727"></a><span class="lineno"> 8727</span>&#160;        {</div>
+<div class="line"><a name="l08728"></a><span class="lineno"> 8728</span>&#160;            m_SB.Add(<span class="stringliteral">&quot;\\\\&quot;</span>);</div>
+<div class="line"><a name="l08729"></a><span class="lineno"> 8729</span>&#160;        }</div>
+<div class="line"><a name="l08730"></a><span class="lineno"> 8730</span>&#160;        <span class="keywordflow">else</span> <span class="keywordflow">if</span>(ch == <span class="charliteral">&#39;&quot;&#39;</span>)</div>
+<div class="line"><a name="l08731"></a><span class="lineno"> 8731</span>&#160;        {</div>
+<div class="line"><a name="l08732"></a><span class="lineno"> 8732</span>&#160;            m_SB.Add(<span class="stringliteral">&quot;\\\&quot;&quot;</span>);</div>
+<div class="line"><a name="l08733"></a><span class="lineno"> 8733</span>&#160;        }</div>
+<div class="line"><a name="l08734"></a><span class="lineno"> 8734</span>&#160;        <span class="keywordflow">else</span> <span class="keywordflow">if</span>(ch &gt;= 32)</div>
+<div class="line"><a name="l08735"></a><span class="lineno"> 8735</span>&#160;        {</div>
+<div class="line"><a name="l08736"></a><span class="lineno"> 8736</span>&#160;            m_SB.Add(ch);</div>
+<div class="line"><a name="l08737"></a><span class="lineno"> 8737</span>&#160;        }</div>
+<div class="line"><a name="l08738"></a><span class="lineno"> 8738</span>&#160;        <span class="keywordflow">else</span> <span class="keywordflow">switch</span>(ch)</div>
+<div class="line"><a name="l08739"></a><span class="lineno"> 8739</span>&#160;        {</div>
+<div class="line"><a name="l08740"></a><span class="lineno"> 8740</span>&#160;        <span class="keywordflow">case</span> <span class="charliteral">&#39;\b&#39;</span>:</div>
+<div class="line"><a name="l08741"></a><span class="lineno"> 8741</span>&#160;            m_SB.Add(<span class="stringliteral">&quot;\\b&quot;</span>);</div>
+<div class="line"><a name="l08742"></a><span class="lineno"> 8742</span>&#160;            <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l08743"></a><span class="lineno"> 8743</span>&#160;        <span class="keywordflow">case</span> <span class="charliteral">&#39;\f&#39;</span>:</div>
+<div class="line"><a name="l08744"></a><span class="lineno"> 8744</span>&#160;            m_SB.Add(<span class="stringliteral">&quot;\\f&quot;</span>);</div>
+<div class="line"><a name="l08745"></a><span class="lineno"> 8745</span>&#160;            <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l08746"></a><span class="lineno"> 8746</span>&#160;        <span class="keywordflow">case</span> <span class="charliteral">&#39;\n&#39;</span>:</div>
+<div class="line"><a name="l08747"></a><span class="lineno"> 8747</span>&#160;            m_SB.Add(<span class="stringliteral">&quot;\\n&quot;</span>);</div>
+<div class="line"><a name="l08748"></a><span class="lineno"> 8748</span>&#160;            <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l08749"></a><span class="lineno"> 8749</span>&#160;        <span class="keywordflow">case</span> <span class="charliteral">&#39;\r&#39;</span>:</div>
+<div class="line"><a name="l08750"></a><span class="lineno"> 8750</span>&#160;            m_SB.Add(<span class="stringliteral">&quot;\\r&quot;</span>);</div>
+<div class="line"><a name="l08751"></a><span class="lineno"> 8751</span>&#160;            <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l08752"></a><span class="lineno"> 8752</span>&#160;        <span class="keywordflow">case</span> <span class="charliteral">&#39;\t&#39;</span>:</div>
+<div class="line"><a name="l08753"></a><span class="lineno"> 8753</span>&#160;            m_SB.Add(<span class="stringliteral">&quot;\\t&quot;</span>);</div>
+<div class="line"><a name="l08754"></a><span class="lineno"> 8754</span>&#160;            <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l08755"></a><span class="lineno"> 8755</span>&#160;        <span class="keywordflow">default</span>:</div>
+<div class="line"><a name="l08756"></a><span class="lineno"> 8756</span>&#160;            VMA_ASSERT(0 &amp;&amp; <span class="stringliteral">&quot;Character not currently supported.&quot;</span>);</div>
+<div class="line"><a name="l08757"></a><span class="lineno"> 8757</span>&#160;            <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l08758"></a><span class="lineno"> 8758</span>&#160;        }</div>
+<div class="line"><a name="l08759"></a><span class="lineno"> 8759</span>&#160;    }</div>
+<div class="line"><a name="l08760"></a><span class="lineno"> 8760</span>&#160;}</div>
+<div class="line"><a name="l08761"></a><span class="lineno"> 8761</span>&#160; </div>
+<div class="line"><a name="l08762"></a><span class="lineno"> 8762</span>&#160;<span class="keywordtype">void</span> VmaJsonWriter::ContinueString(uint32_t n)</div>
+<div class="line"><a name="l08763"></a><span class="lineno"> 8763</span>&#160;{</div>
+<div class="line"><a name="l08764"></a><span class="lineno"> 8764</span>&#160;    VMA_ASSERT(m_InsideString);</div>
+<div class="line"><a name="l08765"></a><span class="lineno"> 8765</span>&#160;    m_SB.AddNumber(n);</div>
+<div class="line"><a name="l08766"></a><span class="lineno"> 8766</span>&#160;}</div>
+<div class="line"><a name="l08767"></a><span class="lineno"> 8767</span>&#160; </div>
+<div class="line"><a name="l08768"></a><span class="lineno"> 8768</span>&#160;<span class="keywordtype">void</span> VmaJsonWriter::ContinueString(uint64_t n)</div>
+<div class="line"><a name="l08769"></a><span class="lineno"> 8769</span>&#160;{</div>
+<div class="line"><a name="l08770"></a><span class="lineno"> 8770</span>&#160;    VMA_ASSERT(m_InsideString);</div>
+<div class="line"><a name="l08771"></a><span class="lineno"> 8771</span>&#160;    m_SB.AddNumber(n);</div>
+<div class="line"><a name="l08772"></a><span class="lineno"> 8772</span>&#160;}</div>
 <div class="line"><a name="l08773"></a><span class="lineno"> 8773</span>&#160; </div>
-<div class="line"><a name="l08774"></a><span class="lineno"> 8774</span>&#160;    json.EndObject();</div>
-<div class="line"><a name="l08775"></a><span class="lineno"> 8775</span>&#160;}</div>
-<div class="line"><a name="l08776"></a><span class="lineno"> 8776</span>&#160; </div>
-<div class="line"><a name="l08777"></a><span class="lineno"> 8777</span>&#160;<span class="keywordtype">void</span> VmaBlockMetadata::PrintDetailedMap_UnusedRange(<span class="keyword">class</span> VmaJsonWriter&amp; json,</div>
-<div class="line"><a name="l08778"></a><span class="lineno"> 8778</span>&#160;    VkDeviceSize offset,</div>
-<div class="line"><a name="l08779"></a><span class="lineno"> 8779</span>&#160;    VkDeviceSize size)<span class="keyword"> const</span></div>
-<div class="line"><a name="l08780"></a><span class="lineno"> 8780</span>&#160;<span class="keyword"></span>{</div>
-<div class="line"><a name="l08781"></a><span class="lineno"> 8781</span>&#160;    json.BeginObject(<span class="keyword">true</span>);</div>
-<div class="line"><a name="l08782"></a><span class="lineno"> 8782</span>&#160;        </div>
-<div class="line"><a name="l08783"></a><span class="lineno"> 8783</span>&#160;    json.WriteString(<span class="stringliteral">&quot;Offset&quot;</span>);</div>
-<div class="line"><a name="l08784"></a><span class="lineno"> 8784</span>&#160;    json.WriteNumber(offset);</div>
-<div class="line"><a name="l08785"></a><span class="lineno"> 8785</span>&#160; </div>
-<div class="line"><a name="l08786"></a><span class="lineno"> 8786</span>&#160;    json.WriteString(<span class="stringliteral">&quot;Type&quot;</span>);</div>
-<div class="line"><a name="l08787"></a><span class="lineno"> 8787</span>&#160;    json.WriteString(VMA_SUBALLOCATION_TYPE_NAMES[VMA_SUBALLOCATION_TYPE_FREE]);</div>
-<div class="line"><a name="l08788"></a><span class="lineno"> 8788</span>&#160; </div>
-<div class="line"><a name="l08789"></a><span class="lineno"> 8789</span>&#160;    json.WriteString(<span class="stringliteral">&quot;Size&quot;</span>);</div>
-<div class="line"><a name="l08790"></a><span class="lineno"> 8790</span>&#160;    json.WriteNumber(size);</div>
-<div class="line"><a name="l08791"></a><span class="lineno"> 8791</span>&#160; </div>
-<div class="line"><a name="l08792"></a><span class="lineno"> 8792</span>&#160;    json.EndObject();</div>
-<div class="line"><a name="l08793"></a><span class="lineno"> 8793</span>&#160;}</div>
-<div class="line"><a name="l08794"></a><span class="lineno"> 8794</span>&#160; </div>
-<div class="line"><a name="l08795"></a><span class="lineno"> 8795</span>&#160;<span class="keywordtype">void</span> VmaBlockMetadata::PrintDetailedMap_End(<span class="keyword">class</span> VmaJsonWriter&amp; json)<span class="keyword"> const</span></div>
-<div class="line"><a name="l08796"></a><span class="lineno"> 8796</span>&#160;<span class="keyword"></span>{</div>
-<div class="line"><a name="l08797"></a><span class="lineno"> 8797</span>&#160;    json.EndArray();</div>
-<div class="line"><a name="l08798"></a><span class="lineno"> 8798</span>&#160;    json.EndObject();</div>
-<div class="line"><a name="l08799"></a><span class="lineno"> 8799</span>&#160;}</div>
-<div class="line"><a name="l08800"></a><span class="lineno"> 8800</span>&#160; </div>
-<div class="line"><a name="l08801"></a><span class="lineno"> 8801</span>&#160;<span class="preprocessor">#endif // #if VMA_STATS_STRING_ENABLED</span></div>
-<div class="line"><a name="l08802"></a><span class="lineno"> 8802</span>&#160; </div>
-<div class="line"><a name="l08804"></a><span class="lineno"> 8804</span>&#160;<span class="comment">// class VmaBlockMetadata_Generic</span></div>
-<div class="line"><a name="l08805"></a><span class="lineno"> 8805</span>&#160; </div>
-<div class="line"><a name="l08806"></a><span class="lineno"> 8806</span>&#160;VmaBlockMetadata_Generic::VmaBlockMetadata_Generic(<a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator) :</div>
-<div class="line"><a name="l08807"></a><span class="lineno"> 8807</span>&#160;    VmaBlockMetadata(hAllocator),</div>
-<div class="line"><a name="l08808"></a><span class="lineno"> 8808</span>&#160;    m_FreeCount(0),</div>
-<div class="line"><a name="l08809"></a><span class="lineno"> 8809</span>&#160;    m_SumFreeSize(0),</div>
-<div class="line"><a name="l08810"></a><span class="lineno"> 8810</span>&#160;    m_Suballocations(VmaStlAllocator&lt;VmaSuballocation&gt;(hAllocator-&gt;GetAllocationCallbacks())),</div>
-<div class="line"><a name="l08811"></a><span class="lineno"> 8811</span>&#160;    m_FreeSuballocationsBySize(VmaStlAllocator&lt;VmaSuballocationList::iterator&gt;(hAllocator-&gt;GetAllocationCallbacks()))</div>
-<div class="line"><a name="l08812"></a><span class="lineno"> 8812</span>&#160;{</div>
-<div class="line"><a name="l08813"></a><span class="lineno"> 8813</span>&#160;}</div>
-<div class="line"><a name="l08814"></a><span class="lineno"> 8814</span>&#160; </div>
-<div class="line"><a name="l08815"></a><span class="lineno"> 8815</span>&#160;VmaBlockMetadata_Generic::~VmaBlockMetadata_Generic()</div>
-<div class="line"><a name="l08816"></a><span class="lineno"> 8816</span>&#160;{</div>
+<div class="line"><a name="l08774"></a><span class="lineno"> 8774</span>&#160;<span class="keywordtype">void</span> VmaJsonWriter::ContinueString_Pointer(<span class="keyword">const</span> <span class="keywordtype">void</span>* ptr)</div>
+<div class="line"><a name="l08775"></a><span class="lineno"> 8775</span>&#160;{</div>
+<div class="line"><a name="l08776"></a><span class="lineno"> 8776</span>&#160;    VMA_ASSERT(m_InsideString);</div>
+<div class="line"><a name="l08777"></a><span class="lineno"> 8777</span>&#160;    m_SB.AddPointer(ptr);</div>
+<div class="line"><a name="l08778"></a><span class="lineno"> 8778</span>&#160;}</div>
+<div class="line"><a name="l08779"></a><span class="lineno"> 8779</span>&#160; </div>
+<div class="line"><a name="l08780"></a><span class="lineno"> 8780</span>&#160;<span class="keywordtype">void</span> VmaJsonWriter::EndString(<span class="keyword">const</span> <span class="keywordtype">char</span>* pStr)</div>
+<div class="line"><a name="l08781"></a><span class="lineno"> 8781</span>&#160;{</div>
+<div class="line"><a name="l08782"></a><span class="lineno"> 8782</span>&#160;    VMA_ASSERT(m_InsideString);</div>
+<div class="line"><a name="l08783"></a><span class="lineno"> 8783</span>&#160;    <span class="keywordflow">if</span>(pStr != VMA_NULL &amp;&amp; pStr[0] != <span class="charliteral">&#39;\0&#39;</span>)</div>
+<div class="line"><a name="l08784"></a><span class="lineno"> 8784</span>&#160;    {</div>
+<div class="line"><a name="l08785"></a><span class="lineno"> 8785</span>&#160;        ContinueString(pStr);</div>
+<div class="line"><a name="l08786"></a><span class="lineno"> 8786</span>&#160;    }</div>
+<div class="line"><a name="l08787"></a><span class="lineno"> 8787</span>&#160;    m_SB.Add(<span class="charliteral">&#39;&quot;&#39;</span>);</div>
+<div class="line"><a name="l08788"></a><span class="lineno"> 8788</span>&#160;    m_InsideString = <span class="keyword">false</span>;</div>
+<div class="line"><a name="l08789"></a><span class="lineno"> 8789</span>&#160;}</div>
+<div class="line"><a name="l08790"></a><span class="lineno"> 8790</span>&#160; </div>
+<div class="line"><a name="l08791"></a><span class="lineno"> 8791</span>&#160;<span class="keywordtype">void</span> VmaJsonWriter::WriteNumber(uint32_t n)</div>
+<div class="line"><a name="l08792"></a><span class="lineno"> 8792</span>&#160;{</div>
+<div class="line"><a name="l08793"></a><span class="lineno"> 8793</span>&#160;    VMA_ASSERT(!m_InsideString);</div>
+<div class="line"><a name="l08794"></a><span class="lineno"> 8794</span>&#160;    BeginValue(<span class="keyword">false</span>);</div>
+<div class="line"><a name="l08795"></a><span class="lineno"> 8795</span>&#160;    m_SB.AddNumber(n);</div>
+<div class="line"><a name="l08796"></a><span class="lineno"> 8796</span>&#160;}</div>
+<div class="line"><a name="l08797"></a><span class="lineno"> 8797</span>&#160; </div>
+<div class="line"><a name="l08798"></a><span class="lineno"> 8798</span>&#160;<span class="keywordtype">void</span> VmaJsonWriter::WriteNumber(uint64_t n)</div>
+<div class="line"><a name="l08799"></a><span class="lineno"> 8799</span>&#160;{</div>
+<div class="line"><a name="l08800"></a><span class="lineno"> 8800</span>&#160;    VMA_ASSERT(!m_InsideString);</div>
+<div class="line"><a name="l08801"></a><span class="lineno"> 8801</span>&#160;    BeginValue(<span class="keyword">false</span>);</div>
+<div class="line"><a name="l08802"></a><span class="lineno"> 8802</span>&#160;    m_SB.AddNumber(n);</div>
+<div class="line"><a name="l08803"></a><span class="lineno"> 8803</span>&#160;}</div>
+<div class="line"><a name="l08804"></a><span class="lineno"> 8804</span>&#160; </div>
+<div class="line"><a name="l08805"></a><span class="lineno"> 8805</span>&#160;<span class="keywordtype">void</span> VmaJsonWriter::WriteBool(<span class="keywordtype">bool</span> b)</div>
+<div class="line"><a name="l08806"></a><span class="lineno"> 8806</span>&#160;{</div>
+<div class="line"><a name="l08807"></a><span class="lineno"> 8807</span>&#160;    VMA_ASSERT(!m_InsideString);</div>
+<div class="line"><a name="l08808"></a><span class="lineno"> 8808</span>&#160;    BeginValue(<span class="keyword">false</span>);</div>
+<div class="line"><a name="l08809"></a><span class="lineno"> 8809</span>&#160;    m_SB.Add(b ? <span class="stringliteral">&quot;true&quot;</span> : <span class="stringliteral">&quot;false&quot;</span>);</div>
+<div class="line"><a name="l08810"></a><span class="lineno"> 8810</span>&#160;}</div>
+<div class="line"><a name="l08811"></a><span class="lineno"> 8811</span>&#160; </div>
+<div class="line"><a name="l08812"></a><span class="lineno"> 8812</span>&#160;<span class="keywordtype">void</span> VmaJsonWriter::WriteNull()</div>
+<div class="line"><a name="l08813"></a><span class="lineno"> 8813</span>&#160;{</div>
+<div class="line"><a name="l08814"></a><span class="lineno"> 8814</span>&#160;    VMA_ASSERT(!m_InsideString);</div>
+<div class="line"><a name="l08815"></a><span class="lineno"> 8815</span>&#160;    BeginValue(<span class="keyword">false</span>);</div>
+<div class="line"><a name="l08816"></a><span class="lineno"> 8816</span>&#160;    m_SB.Add(<span class="stringliteral">&quot;null&quot;</span>);</div>
 <div class="line"><a name="l08817"></a><span class="lineno"> 8817</span>&#160;}</div>
 <div class="line"><a name="l08818"></a><span class="lineno"> 8818</span>&#160; </div>
-<div class="line"><a name="l08819"></a><span class="lineno"> 8819</span>&#160;<span class="keywordtype">void</span> VmaBlockMetadata_Generic::Init(VkDeviceSize size)</div>
+<div class="line"><a name="l08819"></a><span class="lineno"> 8819</span>&#160;<span class="keywordtype">void</span> VmaJsonWriter::BeginValue(<span class="keywordtype">bool</span> isString)</div>
 <div class="line"><a name="l08820"></a><span class="lineno"> 8820</span>&#160;{</div>
-<div class="line"><a name="l08821"></a><span class="lineno"> 8821</span>&#160;    VmaBlockMetadata::Init(size);</div>
-<div class="line"><a name="l08822"></a><span class="lineno"> 8822</span>&#160; </div>
-<div class="line"><a name="l08823"></a><span class="lineno"> 8823</span>&#160;    m_FreeCount = 1;</div>
-<div class="line"><a name="l08824"></a><span class="lineno"> 8824</span>&#160;    m_SumFreeSize = size;</div>
-<div class="line"><a name="l08825"></a><span class="lineno"> 8825</span>&#160; </div>
-<div class="line"><a name="l08826"></a><span class="lineno"> 8826</span>&#160;    VmaSuballocation suballoc = {};</div>
-<div class="line"><a name="l08827"></a><span class="lineno"> 8827</span>&#160;    suballoc.offset = 0;</div>
-<div class="line"><a name="l08828"></a><span class="lineno"> 8828</span>&#160;    suballoc.size = size;</div>
-<div class="line"><a name="l08829"></a><span class="lineno"> 8829</span>&#160;    suballoc.type = VMA_SUBALLOCATION_TYPE_FREE;</div>
-<div class="line"><a name="l08830"></a><span class="lineno"> 8830</span>&#160;    suballoc.hAllocation = VK_NULL_HANDLE;</div>
-<div class="line"><a name="l08831"></a><span class="lineno"> 8831</span>&#160; </div>
-<div class="line"><a name="l08832"></a><span class="lineno"> 8832</span>&#160;    VMA_ASSERT(size &gt; VMA_MIN_FREE_SUBALLOCATION_SIZE_TO_REGISTER);</div>
-<div class="line"><a name="l08833"></a><span class="lineno"> 8833</span>&#160;    m_Suballocations.push_back(suballoc);</div>
-<div class="line"><a name="l08834"></a><span class="lineno"> 8834</span>&#160;    VmaSuballocationList::iterator suballocItem = m_Suballocations.end();</div>
-<div class="line"><a name="l08835"></a><span class="lineno"> 8835</span>&#160;    --suballocItem;</div>
-<div class="line"><a name="l08836"></a><span class="lineno"> 8836</span>&#160;    m_FreeSuballocationsBySize.push_back(suballocItem);</div>
-<div class="line"><a name="l08837"></a><span class="lineno"> 8837</span>&#160;}</div>
-<div class="line"><a name="l08838"></a><span class="lineno"> 8838</span>&#160; </div>
-<div class="line"><a name="l08839"></a><span class="lineno"> 8839</span>&#160;<span class="keywordtype">bool</span> VmaBlockMetadata_Generic::Validate()<span class="keyword"> const</span></div>
-<div class="line"><a name="l08840"></a><span class="lineno"> 8840</span>&#160;<span class="keyword"></span>{</div>
-<div class="line"><a name="l08841"></a><span class="lineno"> 8841</span>&#160;    VMA_VALIDATE(!m_Suballocations.empty());</div>
-<div class="line"><a name="l08842"></a><span class="lineno"> 8842</span>&#160;    </div>
-<div class="line"><a name="l08843"></a><span class="lineno"> 8843</span>&#160;    <span class="comment">// Expected offset of new suballocation as calculated from previous ones.</span></div>
-<div class="line"><a name="l08844"></a><span class="lineno"> 8844</span>&#160;    VkDeviceSize calculatedOffset = 0;</div>
-<div class="line"><a name="l08845"></a><span class="lineno"> 8845</span>&#160;    <span class="comment">// Expected number of free suballocations as calculated from traversing their list.</span></div>
-<div class="line"><a name="l08846"></a><span class="lineno"> 8846</span>&#160;    uint32_t calculatedFreeCount = 0;</div>
-<div class="line"><a name="l08847"></a><span class="lineno"> 8847</span>&#160;    <span class="comment">// Expected sum size of free suballocations as calculated from traversing their list.</span></div>
-<div class="line"><a name="l08848"></a><span class="lineno"> 8848</span>&#160;    VkDeviceSize calculatedSumFreeSize = 0;</div>
-<div class="line"><a name="l08849"></a><span class="lineno"> 8849</span>&#160;    <span class="comment">// Expected number of free suballocations that should be registered in</span></div>
-<div class="line"><a name="l08850"></a><span class="lineno"> 8850</span>&#160;    <span class="comment">// m_FreeSuballocationsBySize calculated from traversing their list.</span></div>
-<div class="line"><a name="l08851"></a><span class="lineno"> 8851</span>&#160;    <span class="keywordtype">size_t</span> freeSuballocationsToRegister = 0;</div>
-<div class="line"><a name="l08852"></a><span class="lineno"> 8852</span>&#160;    <span class="comment">// True if previous visited suballocation was free.</span></div>
-<div class="line"><a name="l08853"></a><span class="lineno"> 8853</span>&#160;    <span class="keywordtype">bool</span> prevFree = <span class="keyword">false</span>;</div>
-<div class="line"><a name="l08854"></a><span class="lineno"> 8854</span>&#160; </div>
-<div class="line"><a name="l08855"></a><span class="lineno"> 8855</span>&#160;    <span class="keywordflow">for</span>(VmaSuballocationList::const_iterator suballocItem = m_Suballocations.cbegin();</div>
-<div class="line"><a name="l08856"></a><span class="lineno"> 8856</span>&#160;        suballocItem != m_Suballocations.cend();</div>
-<div class="line"><a name="l08857"></a><span class="lineno"> 8857</span>&#160;        ++suballocItem)</div>
-<div class="line"><a name="l08858"></a><span class="lineno"> 8858</span>&#160;    {</div>
-<div class="line"><a name="l08859"></a><span class="lineno"> 8859</span>&#160;        <span class="keyword">const</span> VmaSuballocation&amp; subAlloc = *suballocItem;</div>
-<div class="line"><a name="l08860"></a><span class="lineno"> 8860</span>&#160;        </div>
-<div class="line"><a name="l08861"></a><span class="lineno"> 8861</span>&#160;        <span class="comment">// Actual offset of this suballocation doesn&#39;t match expected one.</span></div>
-<div class="line"><a name="l08862"></a><span class="lineno"> 8862</span>&#160;        VMA_VALIDATE(subAlloc.offset == calculatedOffset);</div>
-<div class="line"><a name="l08863"></a><span class="lineno"> 8863</span>&#160; </div>
-<div class="line"><a name="l08864"></a><span class="lineno"> 8864</span>&#160;        <span class="keyword">const</span> <span class="keywordtype">bool</span> currFree = (subAlloc.type == VMA_SUBALLOCATION_TYPE_FREE);</div>
-<div class="line"><a name="l08865"></a><span class="lineno"> 8865</span>&#160;        <span class="comment">// Two adjacent free suballocations are invalid. They should be merged.</span></div>
-<div class="line"><a name="l08866"></a><span class="lineno"> 8866</span>&#160;        VMA_VALIDATE(!prevFree || !currFree);</div>
+<div class="line"><a name="l08821"></a><span class="lineno"> 8821</span>&#160;    <span class="keywordflow">if</span>(!m_Stack.empty())</div>
+<div class="line"><a name="l08822"></a><span class="lineno"> 8822</span>&#160;    {</div>
+<div class="line"><a name="l08823"></a><span class="lineno"> 8823</span>&#160;        StackItem&amp; currItem = m_Stack.back();</div>
+<div class="line"><a name="l08824"></a><span class="lineno"> 8824</span>&#160;        <span class="keywordflow">if</span>(currItem.type == COLLECTION_TYPE_OBJECT &amp;&amp;</div>
+<div class="line"><a name="l08825"></a><span class="lineno"> 8825</span>&#160;            currItem.valueCount % 2 == 0)</div>
+<div class="line"><a name="l08826"></a><span class="lineno"> 8826</span>&#160;        {</div>
+<div class="line"><a name="l08827"></a><span class="lineno"> 8827</span>&#160;            VMA_ASSERT(isString);</div>
+<div class="line"><a name="l08828"></a><span class="lineno"> 8828</span>&#160;        }</div>
+<div class="line"><a name="l08829"></a><span class="lineno"> 8829</span>&#160; </div>
+<div class="line"><a name="l08830"></a><span class="lineno"> 8830</span>&#160;        <span class="keywordflow">if</span>(currItem.type == COLLECTION_TYPE_OBJECT &amp;&amp;</div>
+<div class="line"><a name="l08831"></a><span class="lineno"> 8831</span>&#160;            currItem.valueCount % 2 != 0)</div>
+<div class="line"><a name="l08832"></a><span class="lineno"> 8832</span>&#160;        {</div>
+<div class="line"><a name="l08833"></a><span class="lineno"> 8833</span>&#160;            m_SB.Add(<span class="stringliteral">&quot;: &quot;</span>);</div>
+<div class="line"><a name="l08834"></a><span class="lineno"> 8834</span>&#160;        }</div>
+<div class="line"><a name="l08835"></a><span class="lineno"> 8835</span>&#160;        <span class="keywordflow">else</span> <span class="keywordflow">if</span>(currItem.valueCount &gt; 0)</div>
+<div class="line"><a name="l08836"></a><span class="lineno"> 8836</span>&#160;        {</div>
+<div class="line"><a name="l08837"></a><span class="lineno"> 8837</span>&#160;            m_SB.Add(<span class="stringliteral">&quot;, &quot;</span>);</div>
+<div class="line"><a name="l08838"></a><span class="lineno"> 8838</span>&#160;            WriteIndent();</div>
+<div class="line"><a name="l08839"></a><span class="lineno"> 8839</span>&#160;        }</div>
+<div class="line"><a name="l08840"></a><span class="lineno"> 8840</span>&#160;        <span class="keywordflow">else</span></div>
+<div class="line"><a name="l08841"></a><span class="lineno"> 8841</span>&#160;        {</div>
+<div class="line"><a name="l08842"></a><span class="lineno"> 8842</span>&#160;            WriteIndent();</div>
+<div class="line"><a name="l08843"></a><span class="lineno"> 8843</span>&#160;        }</div>
+<div class="line"><a name="l08844"></a><span class="lineno"> 8844</span>&#160;        ++currItem.valueCount;</div>
+<div class="line"><a name="l08845"></a><span class="lineno"> 8845</span>&#160;    }</div>
+<div class="line"><a name="l08846"></a><span class="lineno"> 8846</span>&#160;}</div>
+<div class="line"><a name="l08847"></a><span class="lineno"> 8847</span>&#160; </div>
+<div class="line"><a name="l08848"></a><span class="lineno"> 8848</span>&#160;<span class="keywordtype">void</span> VmaJsonWriter::WriteIndent(<span class="keywordtype">bool</span> oneLess)</div>
+<div class="line"><a name="l08849"></a><span class="lineno"> 8849</span>&#160;{</div>
+<div class="line"><a name="l08850"></a><span class="lineno"> 8850</span>&#160;    <span class="keywordflow">if</span>(!m_Stack.empty() &amp;&amp; !m_Stack.back().singleLineMode)</div>
+<div class="line"><a name="l08851"></a><span class="lineno"> 8851</span>&#160;    {</div>
+<div class="line"><a name="l08852"></a><span class="lineno"> 8852</span>&#160;        m_SB.AddNewLine();</div>
+<div class="line"><a name="l08853"></a><span class="lineno"> 8853</span>&#160; </div>
+<div class="line"><a name="l08854"></a><span class="lineno"> 8854</span>&#160;        <span class="keywordtype">size_t</span> count = m_Stack.size();</div>
+<div class="line"><a name="l08855"></a><span class="lineno"> 8855</span>&#160;        <span class="keywordflow">if</span>(count &gt; 0 &amp;&amp; oneLess)</div>
+<div class="line"><a name="l08856"></a><span class="lineno"> 8856</span>&#160;        {</div>
+<div class="line"><a name="l08857"></a><span class="lineno"> 8857</span>&#160;            --count;</div>
+<div class="line"><a name="l08858"></a><span class="lineno"> 8858</span>&#160;        }</div>
+<div class="line"><a name="l08859"></a><span class="lineno"> 8859</span>&#160;        <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> i = 0; i &lt; count; ++i)</div>
+<div class="line"><a name="l08860"></a><span class="lineno"> 8860</span>&#160;        {</div>
+<div class="line"><a name="l08861"></a><span class="lineno"> 8861</span>&#160;            m_SB.Add(INDENT);</div>
+<div class="line"><a name="l08862"></a><span class="lineno"> 8862</span>&#160;        }</div>
+<div class="line"><a name="l08863"></a><span class="lineno"> 8863</span>&#160;    }</div>
+<div class="line"><a name="l08864"></a><span class="lineno"> 8864</span>&#160;}</div>
+<div class="line"><a name="l08865"></a><span class="lineno"> 8865</span>&#160; </div>
+<div class="line"><a name="l08866"></a><span class="lineno"> 8866</span>&#160;<span class="preprocessor">#endif </span><span class="comment">// #if VMA_STATS_STRING_ENABLED</span></div>
 <div class="line"><a name="l08867"></a><span class="lineno"> 8867</span>&#160; </div>
-<div class="line"><a name="l08868"></a><span class="lineno"> 8868</span>&#160;        VMA_VALIDATE(currFree == (subAlloc.hAllocation == VK_NULL_HANDLE));</div>
 <div class="line"><a name="l08869"></a><span class="lineno"> 8869</span>&#160; </div>
-<div class="line"><a name="l08870"></a><span class="lineno"> 8870</span>&#160;        <span class="keywordflow">if</span>(currFree)</div>
-<div class="line"><a name="l08871"></a><span class="lineno"> 8871</span>&#160;        {</div>
-<div class="line"><a name="l08872"></a><span class="lineno"> 8872</span>&#160;            calculatedSumFreeSize += subAlloc.size;</div>
-<div class="line"><a name="l08873"></a><span class="lineno"> 8873</span>&#160;            ++calculatedFreeCount;</div>
-<div class="line"><a name="l08874"></a><span class="lineno"> 8874</span>&#160;            <span class="keywordflow">if</span>(subAlloc.size &gt;= VMA_MIN_FREE_SUBALLOCATION_SIZE_TO_REGISTER)</div>
-<div class="line"><a name="l08875"></a><span class="lineno"> 8875</span>&#160;            {</div>
-<div class="line"><a name="l08876"></a><span class="lineno"> 8876</span>&#160;                ++freeSuballocationsToRegister;</div>
-<div class="line"><a name="l08877"></a><span class="lineno"> 8877</span>&#160;            }</div>
-<div class="line"><a name="l08878"></a><span class="lineno"> 8878</span>&#160; </div>
-<div class="line"><a name="l08879"></a><span class="lineno"> 8879</span>&#160;            <span class="comment">// Margin required between allocations - every free space must be at least that large.</span></div>
-<div class="line"><a name="l08880"></a><span class="lineno"> 8880</span>&#160;            VMA_VALIDATE(subAlloc.size &gt;= VMA_DEBUG_MARGIN);</div>
+<div class="line"><a name="l08870"></a><span class="lineno"> 8870</span>&#160;<span class="keywordtype">void</span> VmaAllocation_T::SetUserData(<a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator, <span class="keywordtype">void</span>* pUserData)</div>
+<div class="line"><a name="l08871"></a><span class="lineno"> 8871</span>&#160;{</div>
+<div class="line"><a name="l08872"></a><span class="lineno"> 8872</span>&#160;    <span class="keywordflow">if</span>(IsUserDataString())</div>
+<div class="line"><a name="l08873"></a><span class="lineno"> 8873</span>&#160;    {</div>
+<div class="line"><a name="l08874"></a><span class="lineno"> 8874</span>&#160;        VMA_ASSERT(pUserData == VMA_NULL || pUserData != m_pUserData);</div>
+<div class="line"><a name="l08875"></a><span class="lineno"> 8875</span>&#160; </div>
+<div class="line"><a name="l08876"></a><span class="lineno"> 8876</span>&#160;        FreeUserDataString(hAllocator);</div>
+<div class="line"><a name="l08877"></a><span class="lineno"> 8877</span>&#160; </div>
+<div class="line"><a name="l08878"></a><span class="lineno"> 8878</span>&#160;        <span class="keywordflow">if</span>(pUserData != VMA_NULL)</div>
+<div class="line"><a name="l08879"></a><span class="lineno"> 8879</span>&#160;        {</div>
+<div class="line"><a name="l08880"></a><span class="lineno"> 8880</span>&#160;            m_pUserData = VmaCreateStringCopy(hAllocator-&gt;GetAllocationCallbacks(), (<span class="keyword">const</span> <span class="keywordtype">char</span>*)pUserData);</div>
 <div class="line"><a name="l08881"></a><span class="lineno"> 8881</span>&#160;        }</div>
-<div class="line"><a name="l08882"></a><span class="lineno"> 8882</span>&#160;        <span class="keywordflow">else</span></div>
-<div class="line"><a name="l08883"></a><span class="lineno"> 8883</span>&#160;        {</div>
-<div class="line"><a name="l08884"></a><span class="lineno"> 8884</span>&#160;            VMA_VALIDATE(subAlloc.hAllocation-&gt;GetOffset() == subAlloc.offset);</div>
-<div class="line"><a name="l08885"></a><span class="lineno"> 8885</span>&#160;            VMA_VALIDATE(subAlloc.hAllocation-&gt;GetSize() == subAlloc.size);</div>
-<div class="line"><a name="l08886"></a><span class="lineno"> 8886</span>&#160; </div>
-<div class="line"><a name="l08887"></a><span class="lineno"> 8887</span>&#160;            <span class="comment">// Margin required between allocations - previous allocation must be free.</span></div>
-<div class="line"><a name="l08888"></a><span class="lineno"> 8888</span>&#160;            VMA_VALIDATE(VMA_DEBUG_MARGIN == 0 || prevFree);</div>
-<div class="line"><a name="l08889"></a><span class="lineno"> 8889</span>&#160;        }</div>
-<div class="line"><a name="l08890"></a><span class="lineno"> 8890</span>&#160; </div>
-<div class="line"><a name="l08891"></a><span class="lineno"> 8891</span>&#160;        calculatedOffset += subAlloc.size;</div>
-<div class="line"><a name="l08892"></a><span class="lineno"> 8892</span>&#160;        prevFree = currFree;</div>
-<div class="line"><a name="l08893"></a><span class="lineno"> 8893</span>&#160;    }</div>
-<div class="line"><a name="l08894"></a><span class="lineno"> 8894</span>&#160; </div>
-<div class="line"><a name="l08895"></a><span class="lineno"> 8895</span>&#160;    <span class="comment">// Number of free suballocations registered in m_FreeSuballocationsBySize doesn&#39;t</span></div>
-<div class="line"><a name="l08896"></a><span class="lineno"> 8896</span>&#160;    <span class="comment">// match expected one.</span></div>
-<div class="line"><a name="l08897"></a><span class="lineno"> 8897</span>&#160;    VMA_VALIDATE(m_FreeSuballocationsBySize.size() == freeSuballocationsToRegister);</div>
-<div class="line"><a name="l08898"></a><span class="lineno"> 8898</span>&#160; </div>
-<div class="line"><a name="l08899"></a><span class="lineno"> 8899</span>&#160;    VkDeviceSize lastSize = 0;</div>
-<div class="line"><a name="l08900"></a><span class="lineno"> 8900</span>&#160;    <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> i = 0; i &lt; m_FreeSuballocationsBySize.size(); ++i)</div>
-<div class="line"><a name="l08901"></a><span class="lineno"> 8901</span>&#160;    {</div>
-<div class="line"><a name="l08902"></a><span class="lineno"> 8902</span>&#160;        VmaSuballocationList::iterator suballocItem = m_FreeSuballocationsBySize[i];</div>
-<div class="line"><a name="l08903"></a><span class="lineno"> 8903</span>&#160;        </div>
-<div class="line"><a name="l08904"></a><span class="lineno"> 8904</span>&#160;        <span class="comment">// Only free suballocations can be registered in m_FreeSuballocationsBySize.</span></div>
-<div class="line"><a name="l08905"></a><span class="lineno"> 8905</span>&#160;        VMA_VALIDATE(suballocItem-&gt;type == VMA_SUBALLOCATION_TYPE_FREE);</div>
-<div class="line"><a name="l08906"></a><span class="lineno"> 8906</span>&#160;        <span class="comment">// They must be sorted by size ascending.</span></div>
-<div class="line"><a name="l08907"></a><span class="lineno"> 8907</span>&#160;        VMA_VALIDATE(suballocItem-&gt;size &gt;= lastSize);</div>
-<div class="line"><a name="l08908"></a><span class="lineno"> 8908</span>&#160; </div>
-<div class="line"><a name="l08909"></a><span class="lineno"> 8909</span>&#160;        lastSize = suballocItem-&gt;size;</div>
-<div class="line"><a name="l08910"></a><span class="lineno"> 8910</span>&#160;    }</div>
-<div class="line"><a name="l08911"></a><span class="lineno"> 8911</span>&#160; </div>
-<div class="line"><a name="l08912"></a><span class="lineno"> 8912</span>&#160;    <span class="comment">// Check if totals match calculacted values.</span></div>
-<div class="line"><a name="l08913"></a><span class="lineno"> 8913</span>&#160;    VMA_VALIDATE(ValidateFreeSuballocationList());</div>
-<div class="line"><a name="l08914"></a><span class="lineno"> 8914</span>&#160;    VMA_VALIDATE(calculatedOffset == GetSize());</div>
-<div class="line"><a name="l08915"></a><span class="lineno"> 8915</span>&#160;    VMA_VALIDATE(calculatedSumFreeSize == m_SumFreeSize);</div>
-<div class="line"><a name="l08916"></a><span class="lineno"> 8916</span>&#160;    VMA_VALIDATE(calculatedFreeCount == m_FreeCount);</div>
-<div class="line"><a name="l08917"></a><span class="lineno"> 8917</span>&#160; </div>
-<div class="line"><a name="l08918"></a><span class="lineno"> 8918</span>&#160;    <span class="keywordflow">return</span> <span class="keyword">true</span>;</div>
-<div class="line"><a name="l08919"></a><span class="lineno"> 8919</span>&#160;}</div>
-<div class="line"><a name="l08920"></a><span class="lineno"> 8920</span>&#160; </div>
-<div class="line"><a name="l08921"></a><span class="lineno"> 8921</span>&#160;VkDeviceSize VmaBlockMetadata_Generic::GetUnusedRangeSizeMax()<span class="keyword"> const</span></div>
-<div class="line"><a name="l08922"></a><span class="lineno"> 8922</span>&#160;<span class="keyword"></span>{</div>
-<div class="line"><a name="l08923"></a><span class="lineno"> 8923</span>&#160;    <span class="keywordflow">if</span>(!m_FreeSuballocationsBySize.empty())</div>
-<div class="line"><a name="l08924"></a><span class="lineno"> 8924</span>&#160;    {</div>
-<div class="line"><a name="l08925"></a><span class="lineno"> 8925</span>&#160;        <span class="keywordflow">return</span> m_FreeSuballocationsBySize.back()-&gt;size;</div>
-<div class="line"><a name="l08926"></a><span class="lineno"> 8926</span>&#160;    }</div>
-<div class="line"><a name="l08927"></a><span class="lineno"> 8927</span>&#160;    <span class="keywordflow">else</span></div>
-<div class="line"><a name="l08928"></a><span class="lineno"> 8928</span>&#160;    {</div>
-<div class="line"><a name="l08929"></a><span class="lineno"> 8929</span>&#160;        <span class="keywordflow">return</span> 0;</div>
-<div class="line"><a name="l08930"></a><span class="lineno"> 8930</span>&#160;    }</div>
-<div class="line"><a name="l08931"></a><span class="lineno"> 8931</span>&#160;}</div>
-<div class="line"><a name="l08932"></a><span class="lineno"> 8932</span>&#160; </div>
-<div class="line"><a name="l08933"></a><span class="lineno"> 8933</span>&#160;<span class="keywordtype">bool</span> VmaBlockMetadata_Generic::IsEmpty()<span class="keyword"> const</span></div>
-<div class="line"><a name="l08934"></a><span class="lineno"> 8934</span>&#160;<span class="keyword"></span>{</div>
-<div class="line"><a name="l08935"></a><span class="lineno"> 8935</span>&#160;    <span class="keywordflow">return</span> (m_Suballocations.size() == 1) &amp;&amp; (m_FreeCount == 1);</div>
-<div class="line"><a name="l08936"></a><span class="lineno"> 8936</span>&#160;}</div>
-<div class="line"><a name="l08937"></a><span class="lineno"> 8937</span>&#160; </div>
-<div class="line"><a name="l08938"></a><span class="lineno"> 8938</span>&#160;<span class="keywordtype">void</span> VmaBlockMetadata_Generic::CalcAllocationStatInfo(<a class="code" href="struct_vma_stat_info.html">VmaStatInfo</a>&amp; outInfo)<span class="keyword"> const</span></div>
-<div class="line"><a name="l08939"></a><span class="lineno"> 8939</span>&#160;<span class="keyword"></span>{</div>
-<div class="line"><a name="l08940"></a><span class="lineno"> 8940</span>&#160;    outInfo.<a class="code" href="struct_vma_stat_info.html#abc4bb7cd611900778464c56e50c970a4">blockCount</a> = 1;</div>
-<div class="line"><a name="l08941"></a><span class="lineno"> 8941</span>&#160; </div>
-<div class="line"><a name="l08942"></a><span class="lineno"> 8942</span>&#160;    <span class="keyword">const</span> uint32_t rangeCount = (uint32_t)m_Suballocations.size();</div>
-<div class="line"><a name="l08943"></a><span class="lineno"> 8943</span>&#160;    outInfo.<a class="code" href="struct_vma_stat_info.html#a537741e4d5cdddc1c0ab95ec650afaff">allocationCount</a> = rangeCount - m_FreeCount;</div>
-<div class="line"><a name="l08944"></a><span class="lineno"> 8944</span>&#160;    outInfo.<a class="code" href="struct_vma_stat_info.html#ae06129c771bfebfd6468a7f4276502a9">unusedRangeCount</a> = m_FreeCount;</div>
-<div class="line"><a name="l08945"></a><span class="lineno"> 8945</span>&#160;    </div>
-<div class="line"><a name="l08946"></a><span class="lineno"> 8946</span>&#160;    outInfo.<a class="code" href="struct_vma_stat_info.html#a1859d290aca2cd582d8dc25922092669">unusedBytes</a> = m_SumFreeSize;</div>
-<div class="line"><a name="l08947"></a><span class="lineno"> 8947</span>&#160;    outInfo.<a class="code" href="struct_vma_stat_info.html#ab0c6c73837e5a70c749fbd4f6064895a">usedBytes</a> = GetSize() - outInfo.<a class="code" href="struct_vma_stat_info.html#a1859d290aca2cd582d8dc25922092669">unusedBytes</a>;</div>
-<div class="line"><a name="l08948"></a><span class="lineno"> 8948</span>&#160; </div>
-<div class="line"><a name="l08949"></a><span class="lineno"> 8949</span>&#160;    outInfo.<a class="code" href="struct_vma_stat_info.html#ade8b40bd3139c04aabd2fc538a356fea">allocationSizeMin</a> = UINT64_MAX;</div>
-<div class="line"><a name="l08950"></a><span class="lineno"> 8950</span>&#160;    outInfo.<a class="code" href="struct_vma_stat_info.html#a17e9733a5ecd76287d4db6e66f71f50c">allocationSizeMax</a> = 0;</div>
-<div class="line"><a name="l08951"></a><span class="lineno"> 8951</span>&#160;    outInfo.<a class="code" href="struct_vma_stat_info.html#aedeba931324f16589cd2416c0d2dd0d4">unusedRangeSizeMin</a> = UINT64_MAX;</div>
-<div class="line"><a name="l08952"></a><span class="lineno"> 8952</span>&#160;    outInfo.<a class="code" href="struct_vma_stat_info.html#a5ba1a2476c4d39b10f7e2f7ebbb72ac4">unusedRangeSizeMax</a> = 0;</div>
-<div class="line"><a name="l08953"></a><span class="lineno"> 8953</span>&#160; </div>
-<div class="line"><a name="l08954"></a><span class="lineno"> 8954</span>&#160;    <span class="keywordflow">for</span>(VmaSuballocationList::const_iterator suballocItem = m_Suballocations.cbegin();</div>
-<div class="line"><a name="l08955"></a><span class="lineno"> 8955</span>&#160;        suballocItem != m_Suballocations.cend();</div>
-<div class="line"><a name="l08956"></a><span class="lineno"> 8956</span>&#160;        ++suballocItem)</div>
-<div class="line"><a name="l08957"></a><span class="lineno"> 8957</span>&#160;    {</div>
-<div class="line"><a name="l08958"></a><span class="lineno"> 8958</span>&#160;        <span class="keyword">const</span> VmaSuballocation&amp; suballoc = *suballocItem;</div>
-<div class="line"><a name="l08959"></a><span class="lineno"> 8959</span>&#160;        <span class="keywordflow">if</span>(suballoc.type != VMA_SUBALLOCATION_TYPE_FREE)</div>
-<div class="line"><a name="l08960"></a><span class="lineno"> 8960</span>&#160;        {</div>
-<div class="line"><a name="l08961"></a><span class="lineno"> 8961</span>&#160;            outInfo.<a class="code" href="struct_vma_stat_info.html#ade8b40bd3139c04aabd2fc538a356fea">allocationSizeMin</a> = VMA_MIN(outInfo.<a class="code" href="struct_vma_stat_info.html#ade8b40bd3139c04aabd2fc538a356fea">allocationSizeMin</a>, suballoc.size);</div>
-<div class="line"><a name="l08962"></a><span class="lineno"> 8962</span>&#160;            outInfo.<a class="code" href="struct_vma_stat_info.html#a17e9733a5ecd76287d4db6e66f71f50c">allocationSizeMax</a> = VMA_MAX(outInfo.<a class="code" href="struct_vma_stat_info.html#a17e9733a5ecd76287d4db6e66f71f50c">allocationSizeMax</a>, suballoc.size);</div>
-<div class="line"><a name="l08963"></a><span class="lineno"> 8963</span>&#160;        }</div>
-<div class="line"><a name="l08964"></a><span class="lineno"> 8964</span>&#160;        <span class="keywordflow">else</span></div>
-<div class="line"><a name="l08965"></a><span class="lineno"> 8965</span>&#160;        {</div>
-<div class="line"><a name="l08966"></a><span class="lineno"> 8966</span>&#160;            outInfo.<a class="code" href="struct_vma_stat_info.html#aedeba931324f16589cd2416c0d2dd0d4">unusedRangeSizeMin</a> = VMA_MIN(outInfo.<a class="code" href="struct_vma_stat_info.html#aedeba931324f16589cd2416c0d2dd0d4">unusedRangeSizeMin</a>, suballoc.size);</div>
-<div class="line"><a name="l08967"></a><span class="lineno"> 8967</span>&#160;            outInfo.<a class="code" href="struct_vma_stat_info.html#a5ba1a2476c4d39b10f7e2f7ebbb72ac4">unusedRangeSizeMax</a> = VMA_MAX(outInfo.<a class="code" href="struct_vma_stat_info.html#a5ba1a2476c4d39b10f7e2f7ebbb72ac4">unusedRangeSizeMax</a>, suballoc.size);</div>
-<div class="line"><a name="l08968"></a><span class="lineno"> 8968</span>&#160;        }</div>
-<div class="line"><a name="l08969"></a><span class="lineno"> 8969</span>&#160;    }</div>
-<div class="line"><a name="l08970"></a><span class="lineno"> 8970</span>&#160;}</div>
-<div class="line"><a name="l08971"></a><span class="lineno"> 8971</span>&#160; </div>
-<div class="line"><a name="l08972"></a><span class="lineno"> 8972</span>&#160;<span class="keywordtype">void</span> VmaBlockMetadata_Generic::AddPoolStats(<a class="code" href="struct_vma_pool_stats.html">VmaPoolStats</a>&amp; inoutStats)<span class="keyword"> const</span></div>
-<div class="line"><a name="l08973"></a><span class="lineno"> 8973</span>&#160;<span class="keyword"></span>{</div>
-<div class="line"><a name="l08974"></a><span class="lineno"> 8974</span>&#160;    <span class="keyword">const</span> uint32_t rangeCount = (uint32_t)m_Suballocations.size();</div>
-<div class="line"><a name="l08975"></a><span class="lineno"> 8975</span>&#160; </div>
-<div class="line"><a name="l08976"></a><span class="lineno"> 8976</span>&#160;    inoutStats.<a class="code" href="struct_vma_pool_stats.html#a326807b2de2b0931cee4ed9a5f2e420c">size</a> += GetSize();</div>
-<div class="line"><a name="l08977"></a><span class="lineno"> 8977</span>&#160;    inoutStats.<a class="code" href="struct_vma_pool_stats.html#ad7c54874724fce7b06aba526202d82a8">unusedSize</a> += m_SumFreeSize;</div>
-<div class="line"><a name="l08978"></a><span class="lineno"> 8978</span>&#160;    inoutStats.<a class="code" href="struct_vma_pool_stats.html#ad1924eb54fffa45e9e0e65670c8fe5eb">allocationCount</a> += rangeCount - m_FreeCount;</div>
-<div class="line"><a name="l08979"></a><span class="lineno"> 8979</span>&#160;    inoutStats.<a class="code" href="struct_vma_pool_stats.html#ae4f3546ffa4d1e598b64d8e6134854f4">unusedRangeCount</a> += m_FreeCount;</div>
-<div class="line"><a name="l08980"></a><span class="lineno"> 8980</span>&#160;    inoutStats.<a class="code" href="struct_vma_pool_stats.html#ab4c8f52dd42ab01998f60f0b6acc722b">unusedRangeSizeMax</a> = VMA_MAX(inoutStats.<a class="code" href="struct_vma_pool_stats.html#ab4c8f52dd42ab01998f60f0b6acc722b">unusedRangeSizeMax</a>, GetUnusedRangeSizeMax());</div>
-<div class="line"><a name="l08981"></a><span class="lineno"> 8981</span>&#160;}</div>
-<div class="line"><a name="l08982"></a><span class="lineno"> 8982</span>&#160; </div>
-<div class="line"><a name="l08983"></a><span class="lineno"> 8983</span>&#160;<span class="preprocessor">#if VMA_STATS_STRING_ENABLED</span></div>
-<div class="line"><a name="l08984"></a><span class="lineno"> 8984</span>&#160; </div>
-<div class="line"><a name="l08985"></a><span class="lineno"> 8985</span>&#160;<span class="keywordtype">void</span> VmaBlockMetadata_Generic::PrintDetailedMap(<span class="keyword">class</span> VmaJsonWriter&amp; json)<span class="keyword"> const</span></div>
-<div class="line"><a name="l08986"></a><span class="lineno"> 8986</span>&#160;<span class="keyword"></span>{</div>
-<div class="line"><a name="l08987"></a><span class="lineno"> 8987</span>&#160;    PrintDetailedMap_Begin(json,</div>
-<div class="line"><a name="l08988"></a><span class="lineno"> 8988</span>&#160;        m_SumFreeSize, <span class="comment">// unusedBytes</span></div>
-<div class="line"><a name="l08989"></a><span class="lineno"> 8989</span>&#160;        m_Suballocations.size() - (<span class="keywordtype">size_t</span>)m_FreeCount, <span class="comment">// allocationCount</span></div>
-<div class="line"><a name="l08990"></a><span class="lineno"> 8990</span>&#160;        m_FreeCount); <span class="comment">// unusedRangeCount</span></div>
-<div class="line"><a name="l08991"></a><span class="lineno"> 8991</span>&#160; </div>
-<div class="line"><a name="l08992"></a><span class="lineno"> 8992</span>&#160;    <span class="keywordtype">size_t</span> i = 0;</div>
-<div class="line"><a name="l08993"></a><span class="lineno"> 8993</span>&#160;    <span class="keywordflow">for</span>(VmaSuballocationList::const_iterator suballocItem = m_Suballocations.cbegin();</div>
-<div class="line"><a name="l08994"></a><span class="lineno"> 8994</span>&#160;        suballocItem != m_Suballocations.cend();</div>
-<div class="line"><a name="l08995"></a><span class="lineno"> 8995</span>&#160;        ++suballocItem, ++i)</div>
-<div class="line"><a name="l08996"></a><span class="lineno"> 8996</span>&#160;    {</div>
-<div class="line"><a name="l08997"></a><span class="lineno"> 8997</span>&#160;        <span class="keywordflow">if</span>(suballocItem-&gt;type == VMA_SUBALLOCATION_TYPE_FREE)</div>
-<div class="line"><a name="l08998"></a><span class="lineno"> 8998</span>&#160;        {</div>
-<div class="line"><a name="l08999"></a><span class="lineno"> 8999</span>&#160;            PrintDetailedMap_UnusedRange(json, suballocItem-&gt;offset, suballocItem-&gt;size);</div>
-<div class="line"><a name="l09000"></a><span class="lineno"> 9000</span>&#160;        }</div>
-<div class="line"><a name="l09001"></a><span class="lineno"> 9001</span>&#160;        <span class="keywordflow">else</span></div>
-<div class="line"><a name="l09002"></a><span class="lineno"> 9002</span>&#160;        {</div>
-<div class="line"><a name="l09003"></a><span class="lineno"> 9003</span>&#160;            PrintDetailedMap_Allocation(json, suballocItem-&gt;offset, suballocItem-&gt;hAllocation);</div>
-<div class="line"><a name="l09004"></a><span class="lineno"> 9004</span>&#160;        }</div>
-<div class="line"><a name="l09005"></a><span class="lineno"> 9005</span>&#160;    }</div>
-<div class="line"><a name="l09006"></a><span class="lineno"> 9006</span>&#160; </div>
-<div class="line"><a name="l09007"></a><span class="lineno"> 9007</span>&#160;    PrintDetailedMap_End(json);</div>
-<div class="line"><a name="l09008"></a><span class="lineno"> 9008</span>&#160;}</div>
-<div class="line"><a name="l09009"></a><span class="lineno"> 9009</span>&#160; </div>
-<div class="line"><a name="l09010"></a><span class="lineno"> 9010</span>&#160;<span class="preprocessor">#endif // #if VMA_STATS_STRING_ENABLED</span></div>
-<div class="line"><a name="l09011"></a><span class="lineno"> 9011</span>&#160; </div>
-<div class="line"><a name="l09012"></a><span class="lineno"> 9012</span>&#160;<span class="keywordtype">bool</span> VmaBlockMetadata_Generic::CreateAllocationRequest(</div>
-<div class="line"><a name="l09013"></a><span class="lineno"> 9013</span>&#160;    uint32_t currentFrameIndex,</div>
-<div class="line"><a name="l09014"></a><span class="lineno"> 9014</span>&#160;    uint32_t frameInUseCount,</div>
-<div class="line"><a name="l09015"></a><span class="lineno"> 9015</span>&#160;    VkDeviceSize bufferImageGranularity,</div>
-<div class="line"><a name="l09016"></a><span class="lineno"> 9016</span>&#160;    VkDeviceSize allocSize,</div>
-<div class="line"><a name="l09017"></a><span class="lineno"> 9017</span>&#160;    VkDeviceSize allocAlignment,</div>
-<div class="line"><a name="l09018"></a><span class="lineno"> 9018</span>&#160;    <span class="keywordtype">bool</span> upperAddress,</div>
-<div class="line"><a name="l09019"></a><span class="lineno"> 9019</span>&#160;    VmaSuballocationType allocType,</div>
-<div class="line"><a name="l09020"></a><span class="lineno"> 9020</span>&#160;    <span class="keywordtype">bool</span> canMakeOtherLost,</div>
-<div class="line"><a name="l09021"></a><span class="lineno"> 9021</span>&#160;    uint32_t strategy,</div>
-<div class="line"><a name="l09022"></a><span class="lineno"> 9022</span>&#160;    VmaAllocationRequest* pAllocationRequest)</div>
-<div class="line"><a name="l09023"></a><span class="lineno"> 9023</span>&#160;{</div>
-<div class="line"><a name="l09024"></a><span class="lineno"> 9024</span>&#160;    VMA_ASSERT(allocSize &gt; 0);</div>
-<div class="line"><a name="l09025"></a><span class="lineno"> 9025</span>&#160;    VMA_ASSERT(!upperAddress);</div>
-<div class="line"><a name="l09026"></a><span class="lineno"> 9026</span>&#160;    VMA_ASSERT(allocType != VMA_SUBALLOCATION_TYPE_FREE);</div>
-<div class="line"><a name="l09027"></a><span class="lineno"> 9027</span>&#160;    VMA_ASSERT(pAllocationRequest != VMA_NULL);</div>
-<div class="line"><a name="l09028"></a><span class="lineno"> 9028</span>&#160;    VMA_HEAVY_ASSERT(Validate());</div>
-<div class="line"><a name="l09029"></a><span class="lineno"> 9029</span>&#160; </div>
-<div class="line"><a name="l09030"></a><span class="lineno"> 9030</span>&#160;    pAllocationRequest-&gt;type = VmaAllocationRequestType::Normal;</div>
-<div class="line"><a name="l09031"></a><span class="lineno"> 9031</span>&#160; </div>
-<div class="line"><a name="l09032"></a><span class="lineno"> 9032</span>&#160;    <span class="comment">// There is not enough total free space in this block to fullfill the request: Early return.</span></div>
-<div class="line"><a name="l09033"></a><span class="lineno"> 9033</span>&#160;    <span class="keywordflow">if</span>(canMakeOtherLost == <span class="keyword">false</span> &amp;&amp;</div>
-<div class="line"><a name="l09034"></a><span class="lineno"> 9034</span>&#160;        m_SumFreeSize &lt; allocSize + 2 * VMA_DEBUG_MARGIN)</div>
-<div class="line"><a name="l09035"></a><span class="lineno"> 9035</span>&#160;    {</div>
-<div class="line"><a name="l09036"></a><span class="lineno"> 9036</span>&#160;        <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
-<div class="line"><a name="l09037"></a><span class="lineno"> 9037</span>&#160;    }</div>
-<div class="line"><a name="l09038"></a><span class="lineno"> 9038</span>&#160; </div>
-<div class="line"><a name="l09039"></a><span class="lineno"> 9039</span>&#160;    <span class="comment">// New algorithm, efficiently searching freeSuballocationsBySize.</span></div>
-<div class="line"><a name="l09040"></a><span class="lineno"> 9040</span>&#160;    <span class="keyword">const</span> <span class="keywordtype">size_t</span> freeSuballocCount = m_FreeSuballocationsBySize.size();</div>
-<div class="line"><a name="l09041"></a><span class="lineno"> 9041</span>&#160;    <span class="keywordflow">if</span>(freeSuballocCount &gt; 0)</div>
-<div class="line"><a name="l09042"></a><span class="lineno"> 9042</span>&#160;    {</div>
-<div class="line"><a name="l09043"></a><span class="lineno"> 9043</span>&#160;        <span class="keywordflow">if</span>(strategy == <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a839826775c62319466441f86496f036d">VMA_ALLOCATION_CREATE_STRATEGY_BEST_FIT_BIT</a>)</div>
+<div class="line"><a name="l08882"></a><span class="lineno"> 8882</span>&#160;    }</div>
+<div class="line"><a name="l08883"></a><span class="lineno"> 8883</span>&#160;    <span class="keywordflow">else</span></div>
+<div class="line"><a name="l08884"></a><span class="lineno"> 8884</span>&#160;    {</div>
+<div class="line"><a name="l08885"></a><span class="lineno"> 8885</span>&#160;        m_pUserData = pUserData;</div>
+<div class="line"><a name="l08886"></a><span class="lineno"> 8886</span>&#160;    }</div>
+<div class="line"><a name="l08887"></a><span class="lineno"> 8887</span>&#160;}</div>
+<div class="line"><a name="l08888"></a><span class="lineno"> 8888</span>&#160; </div>
+<div class="line"><a name="l08889"></a><span class="lineno"> 8889</span>&#160;<span class="keywordtype">void</span> VmaAllocation_T::ChangeBlockAllocation(</div>
+<div class="line"><a name="l08890"></a><span class="lineno"> 8890</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator,</div>
+<div class="line"><a name="l08891"></a><span class="lineno"> 8891</span>&#160;    VmaDeviceMemoryBlock* block,</div>
+<div class="line"><a name="l08892"></a><span class="lineno"> 8892</span>&#160;    VkDeviceSize offset)</div>
+<div class="line"><a name="l08893"></a><span class="lineno"> 8893</span>&#160;{</div>
+<div class="line"><a name="l08894"></a><span class="lineno"> 8894</span>&#160;    VMA_ASSERT(block != VMA_NULL);</div>
+<div class="line"><a name="l08895"></a><span class="lineno"> 8895</span>&#160;    VMA_ASSERT(m_Type == ALLOCATION_TYPE_BLOCK);</div>
+<div class="line"><a name="l08896"></a><span class="lineno"> 8896</span>&#160; </div>
+<div class="line"><a name="l08897"></a><span class="lineno"> 8897</span>&#160;    <span class="comment">// Move mapping reference counter from old block to new block.</span></div>
+<div class="line"><a name="l08898"></a><span class="lineno"> 8898</span>&#160;    <span class="keywordflow">if</span>(block != m_BlockAllocation.m_Block)</div>
+<div class="line"><a name="l08899"></a><span class="lineno"> 8899</span>&#160;    {</div>
+<div class="line"><a name="l08900"></a><span class="lineno"> 8900</span>&#160;        uint32_t mapRefCount = m_MapCount &amp; ~MAP_COUNT_FLAG_PERSISTENT_MAP;</div>
+<div class="line"><a name="l08901"></a><span class="lineno"> 8901</span>&#160;        <span class="keywordflow">if</span>(IsPersistentMap())</div>
+<div class="line"><a name="l08902"></a><span class="lineno"> 8902</span>&#160;            ++mapRefCount;</div>
+<div class="line"><a name="l08903"></a><span class="lineno"> 8903</span>&#160;        m_BlockAllocation.m_Block-&gt;Unmap(hAllocator, mapRefCount);</div>
+<div class="line"><a name="l08904"></a><span class="lineno"> 8904</span>&#160;        block-&gt;Map(hAllocator, mapRefCount, VMA_NULL);</div>
+<div class="line"><a name="l08905"></a><span class="lineno"> 8905</span>&#160;    }</div>
+<div class="line"><a name="l08906"></a><span class="lineno"> 8906</span>&#160; </div>
+<div class="line"><a name="l08907"></a><span class="lineno"> 8907</span>&#160;    m_BlockAllocation.m_Block = block;</div>
+<div class="line"><a name="l08908"></a><span class="lineno"> 8908</span>&#160;    m_BlockAllocation.m_Offset = offset;</div>
+<div class="line"><a name="l08909"></a><span class="lineno"> 8909</span>&#160;}</div>
+<div class="line"><a name="l08910"></a><span class="lineno"> 8910</span>&#160; </div>
+<div class="line"><a name="l08911"></a><span class="lineno"> 8911</span>&#160;<span class="keywordtype">void</span> VmaAllocation_T::ChangeOffset(VkDeviceSize newOffset)</div>
+<div class="line"><a name="l08912"></a><span class="lineno"> 8912</span>&#160;{</div>
+<div class="line"><a name="l08913"></a><span class="lineno"> 8913</span>&#160;    VMA_ASSERT(m_Type == ALLOCATION_TYPE_BLOCK);</div>
+<div class="line"><a name="l08914"></a><span class="lineno"> 8914</span>&#160;    m_BlockAllocation.m_Offset = newOffset;</div>
+<div class="line"><a name="l08915"></a><span class="lineno"> 8915</span>&#160;}</div>
+<div class="line"><a name="l08916"></a><span class="lineno"> 8916</span>&#160; </div>
+<div class="line"><a name="l08917"></a><span class="lineno"> 8917</span>&#160;VkDeviceSize VmaAllocation_T::GetOffset()<span class="keyword"> const</span></div>
+<div class="line"><a name="l08918"></a><span class="lineno"> 8918</span>&#160;<span class="keyword"></span>{</div>
+<div class="line"><a name="l08919"></a><span class="lineno"> 8919</span>&#160;    <span class="keywordflow">switch</span>(m_Type)</div>
+<div class="line"><a name="l08920"></a><span class="lineno"> 8920</span>&#160;    {</div>
+<div class="line"><a name="l08921"></a><span class="lineno"> 8921</span>&#160;    <span class="keywordflow">case</span> ALLOCATION_TYPE_BLOCK:</div>
+<div class="line"><a name="l08922"></a><span class="lineno"> 8922</span>&#160;        <span class="keywordflow">return</span> m_BlockAllocation.m_Offset;</div>
+<div class="line"><a name="l08923"></a><span class="lineno"> 8923</span>&#160;    <span class="keywordflow">case</span> ALLOCATION_TYPE_DEDICATED:</div>
+<div class="line"><a name="l08924"></a><span class="lineno"> 8924</span>&#160;        <span class="keywordflow">return</span> 0;</div>
+<div class="line"><a name="l08925"></a><span class="lineno"> 8925</span>&#160;    <span class="keywordflow">default</span>:</div>
+<div class="line"><a name="l08926"></a><span class="lineno"> 8926</span>&#160;        VMA_ASSERT(0);</div>
+<div class="line"><a name="l08927"></a><span class="lineno"> 8927</span>&#160;        <span class="keywordflow">return</span> 0;</div>
+<div class="line"><a name="l08928"></a><span class="lineno"> 8928</span>&#160;    }</div>
+<div class="line"><a name="l08929"></a><span class="lineno"> 8929</span>&#160;}</div>
+<div class="line"><a name="l08930"></a><span class="lineno"> 8930</span>&#160; </div>
+<div class="line"><a name="l08931"></a><span class="lineno"> 8931</span>&#160;VkDeviceMemory VmaAllocation_T::GetMemory()<span class="keyword"> const</span></div>
+<div class="line"><a name="l08932"></a><span class="lineno"> 8932</span>&#160;<span class="keyword"></span>{</div>
+<div class="line"><a name="l08933"></a><span class="lineno"> 8933</span>&#160;    <span class="keywordflow">switch</span>(m_Type)</div>
+<div class="line"><a name="l08934"></a><span class="lineno"> 8934</span>&#160;    {</div>
+<div class="line"><a name="l08935"></a><span class="lineno"> 8935</span>&#160;    <span class="keywordflow">case</span> ALLOCATION_TYPE_BLOCK:</div>
+<div class="line"><a name="l08936"></a><span class="lineno"> 8936</span>&#160;        <span class="keywordflow">return</span> m_BlockAllocation.m_Block-&gt;GetDeviceMemory();</div>
+<div class="line"><a name="l08937"></a><span class="lineno"> 8937</span>&#160;    <span class="keywordflow">case</span> ALLOCATION_TYPE_DEDICATED:</div>
+<div class="line"><a name="l08938"></a><span class="lineno"> 8938</span>&#160;        <span class="keywordflow">return</span> m_DedicatedAllocation.m_hMemory;</div>
+<div class="line"><a name="l08939"></a><span class="lineno"> 8939</span>&#160;    <span class="keywordflow">default</span>:</div>
+<div class="line"><a name="l08940"></a><span class="lineno"> 8940</span>&#160;        VMA_ASSERT(0);</div>
+<div class="line"><a name="l08941"></a><span class="lineno"> 8941</span>&#160;        <span class="keywordflow">return</span> VK_NULL_HANDLE;</div>
+<div class="line"><a name="l08942"></a><span class="lineno"> 8942</span>&#160;    }</div>
+<div class="line"><a name="l08943"></a><span class="lineno"> 8943</span>&#160;}</div>
+<div class="line"><a name="l08944"></a><span class="lineno"> 8944</span>&#160; </div>
+<div class="line"><a name="l08945"></a><span class="lineno"> 8945</span>&#160;<span class="keywordtype">void</span>* VmaAllocation_T::GetMappedData()<span class="keyword"> const</span></div>
+<div class="line"><a name="l08946"></a><span class="lineno"> 8946</span>&#160;<span class="keyword"></span>{</div>
+<div class="line"><a name="l08947"></a><span class="lineno"> 8947</span>&#160;    <span class="keywordflow">switch</span>(m_Type)</div>
+<div class="line"><a name="l08948"></a><span class="lineno"> 8948</span>&#160;    {</div>
+<div class="line"><a name="l08949"></a><span class="lineno"> 8949</span>&#160;    <span class="keywordflow">case</span> ALLOCATION_TYPE_BLOCK:</div>
+<div class="line"><a name="l08950"></a><span class="lineno"> 8950</span>&#160;        <span class="keywordflow">if</span>(m_MapCount != 0)</div>
+<div class="line"><a name="l08951"></a><span class="lineno"> 8951</span>&#160;        {</div>
+<div class="line"><a name="l08952"></a><span class="lineno"> 8952</span>&#160;            <span class="keywordtype">void</span>* pBlockData = m_BlockAllocation.m_Block-&gt;GetMappedData();</div>
+<div class="line"><a name="l08953"></a><span class="lineno"> 8953</span>&#160;            VMA_ASSERT(pBlockData != VMA_NULL);</div>
+<div class="line"><a name="l08954"></a><span class="lineno"> 8954</span>&#160;            <span class="keywordflow">return</span> (<span class="keywordtype">char</span>*)pBlockData + m_BlockAllocation.m_Offset;</div>
+<div class="line"><a name="l08955"></a><span class="lineno"> 8955</span>&#160;        }</div>
+<div class="line"><a name="l08956"></a><span class="lineno"> 8956</span>&#160;        <span class="keywordflow">else</span></div>
+<div class="line"><a name="l08957"></a><span class="lineno"> 8957</span>&#160;        {</div>
+<div class="line"><a name="l08958"></a><span class="lineno"> 8958</span>&#160;            <span class="keywordflow">return</span> VMA_NULL;</div>
+<div class="line"><a name="l08959"></a><span class="lineno"> 8959</span>&#160;        }</div>
+<div class="line"><a name="l08960"></a><span class="lineno"> 8960</span>&#160;        <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l08961"></a><span class="lineno"> 8961</span>&#160;    <span class="keywordflow">case</span> ALLOCATION_TYPE_DEDICATED:</div>
+<div class="line"><a name="l08962"></a><span class="lineno"> 8962</span>&#160;        VMA_ASSERT((m_DedicatedAllocation.m_pMappedData != VMA_NULL) == (m_MapCount != 0));</div>
+<div class="line"><a name="l08963"></a><span class="lineno"> 8963</span>&#160;        <span class="keywordflow">return</span> m_DedicatedAllocation.m_pMappedData;</div>
+<div class="line"><a name="l08964"></a><span class="lineno"> 8964</span>&#160;    <span class="keywordflow">default</span>:</div>
+<div class="line"><a name="l08965"></a><span class="lineno"> 8965</span>&#160;        VMA_ASSERT(0);</div>
+<div class="line"><a name="l08966"></a><span class="lineno"> 8966</span>&#160;        <span class="keywordflow">return</span> VMA_NULL;</div>
+<div class="line"><a name="l08967"></a><span class="lineno"> 8967</span>&#160;    }</div>
+<div class="line"><a name="l08968"></a><span class="lineno"> 8968</span>&#160;}</div>
+<div class="line"><a name="l08969"></a><span class="lineno"> 8969</span>&#160; </div>
+<div class="line"><a name="l08970"></a><span class="lineno"> 8970</span>&#160;<span class="keywordtype">bool</span> VmaAllocation_T::CanBecomeLost()<span class="keyword"> const</span></div>
+<div class="line"><a name="l08971"></a><span class="lineno"> 8971</span>&#160;<span class="keyword"></span>{</div>
+<div class="line"><a name="l08972"></a><span class="lineno"> 8972</span>&#160;    <span class="keywordflow">switch</span>(m_Type)</div>
+<div class="line"><a name="l08973"></a><span class="lineno"> 8973</span>&#160;    {</div>
+<div class="line"><a name="l08974"></a><span class="lineno"> 8974</span>&#160;    <span class="keywordflow">case</span> ALLOCATION_TYPE_BLOCK:</div>
+<div class="line"><a name="l08975"></a><span class="lineno"> 8975</span>&#160;        <span class="keywordflow">return</span> m_BlockAllocation.m_CanBecomeLost;</div>
+<div class="line"><a name="l08976"></a><span class="lineno"> 8976</span>&#160;    <span class="keywordflow">case</span> ALLOCATION_TYPE_DEDICATED:</div>
+<div class="line"><a name="l08977"></a><span class="lineno"> 8977</span>&#160;        <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
+<div class="line"><a name="l08978"></a><span class="lineno"> 8978</span>&#160;    <span class="keywordflow">default</span>:</div>
+<div class="line"><a name="l08979"></a><span class="lineno"> 8979</span>&#160;        VMA_ASSERT(0);</div>
+<div class="line"><a name="l08980"></a><span class="lineno"> 8980</span>&#160;        <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
+<div class="line"><a name="l08981"></a><span class="lineno"> 8981</span>&#160;    }</div>
+<div class="line"><a name="l08982"></a><span class="lineno"> 8982</span>&#160;}</div>
+<div class="line"><a name="l08983"></a><span class="lineno"> 8983</span>&#160; </div>
+<div class="line"><a name="l08984"></a><span class="lineno"> 8984</span>&#160;<span class="keywordtype">bool</span> VmaAllocation_T::MakeLost(uint32_t currentFrameIndex, uint32_t frameInUseCount)</div>
+<div class="line"><a name="l08985"></a><span class="lineno"> 8985</span>&#160;{</div>
+<div class="line"><a name="l08986"></a><span class="lineno"> 8986</span>&#160;    VMA_ASSERT(CanBecomeLost());</div>
+<div class="line"><a name="l08987"></a><span class="lineno"> 8987</span>&#160; </div>
+<div class="line"><a name="l08988"></a><span class="lineno"> 8988</span>&#160;    <span class="comment">/*</span></div>
+<div class="line"><a name="l08989"></a><span class="lineno"> 8989</span>&#160;<span class="comment">    Warning: This is a carefully designed algorithm.</span></div>
+<div class="line"><a name="l08990"></a><span class="lineno"> 8990</span>&#160;<span class="comment">    Do not modify unless you really know what you&#39;re doing :)</span></div>
+<div class="line"><a name="l08991"></a><span class="lineno"> 8991</span>&#160;<span class="comment">    */</span></div>
+<div class="line"><a name="l08992"></a><span class="lineno"> 8992</span>&#160;    uint32_t localLastUseFrameIndex = GetLastUseFrameIndex();</div>
+<div class="line"><a name="l08993"></a><span class="lineno"> 8993</span>&#160;    <span class="keywordflow">for</span>(;;)</div>
+<div class="line"><a name="l08994"></a><span class="lineno"> 8994</span>&#160;    {</div>
+<div class="line"><a name="l08995"></a><span class="lineno"> 8995</span>&#160;        <span class="keywordflow">if</span>(localLastUseFrameIndex == VMA_FRAME_INDEX_LOST)</div>
+<div class="line"><a name="l08996"></a><span class="lineno"> 8996</span>&#160;        {</div>
+<div class="line"><a name="l08997"></a><span class="lineno"> 8997</span>&#160;            VMA_ASSERT(0);</div>
+<div class="line"><a name="l08998"></a><span class="lineno"> 8998</span>&#160;            <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
+<div class="line"><a name="l08999"></a><span class="lineno"> 8999</span>&#160;        }</div>
+<div class="line"><a name="l09000"></a><span class="lineno"> 9000</span>&#160;        <span class="keywordflow">else</span> <span class="keywordflow">if</span>(localLastUseFrameIndex + frameInUseCount &gt;= currentFrameIndex)</div>
+<div class="line"><a name="l09001"></a><span class="lineno"> 9001</span>&#160;        {</div>
+<div class="line"><a name="l09002"></a><span class="lineno"> 9002</span>&#160;            <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
+<div class="line"><a name="l09003"></a><span class="lineno"> 9003</span>&#160;        }</div>
+<div class="line"><a name="l09004"></a><span class="lineno"> 9004</span>&#160;        <span class="keywordflow">else</span> <span class="comment">// Last use time earlier than current time.</span></div>
+<div class="line"><a name="l09005"></a><span class="lineno"> 9005</span>&#160;        {</div>
+<div class="line"><a name="l09006"></a><span class="lineno"> 9006</span>&#160;            <span class="keywordflow">if</span>(CompareExchangeLastUseFrameIndex(localLastUseFrameIndex, VMA_FRAME_INDEX_LOST))</div>
+<div class="line"><a name="l09007"></a><span class="lineno"> 9007</span>&#160;            {</div>
+<div class="line"><a name="l09008"></a><span class="lineno"> 9008</span>&#160;                <span class="comment">// Setting hAllocation.LastUseFrameIndex atomic to VMA_FRAME_INDEX_LOST is enough to mark it as LOST.</span></div>
+<div class="line"><a name="l09009"></a><span class="lineno"> 9009</span>&#160;                <span class="comment">// Calling code just needs to unregister this allocation in owning VmaDeviceMemoryBlock.</span></div>
+<div class="line"><a name="l09010"></a><span class="lineno"> 9010</span>&#160;                <span class="keywordflow">return</span> <span class="keyword">true</span>;</div>
+<div class="line"><a name="l09011"></a><span class="lineno"> 9011</span>&#160;            }</div>
+<div class="line"><a name="l09012"></a><span class="lineno"> 9012</span>&#160;        }</div>
+<div class="line"><a name="l09013"></a><span class="lineno"> 9013</span>&#160;    }</div>
+<div class="line"><a name="l09014"></a><span class="lineno"> 9014</span>&#160;}</div>
+<div class="line"><a name="l09015"></a><span class="lineno"> 9015</span>&#160; </div>
+<div class="line"><a name="l09016"></a><span class="lineno"> 9016</span>&#160;<span class="preprocessor">#if VMA_STATS_STRING_ENABLED</span></div>
+<div class="line"><a name="l09017"></a><span class="lineno"> 9017</span>&#160; </div>
+<div class="line"><a name="l09018"></a><span class="lineno"> 9018</span>&#160;<span class="comment">// Correspond to values of enum VmaSuballocationType.</span></div>
+<div class="line"><a name="l09019"></a><span class="lineno"> 9019</span>&#160;<span class="keyword">static</span> <span class="keyword">const</span> <span class="keywordtype">char</span>* VMA_SUBALLOCATION_TYPE_NAMES[] = {</div>
+<div class="line"><a name="l09020"></a><span class="lineno"> 9020</span>&#160;    <span class="stringliteral">&quot;FREE&quot;</span>,</div>
+<div class="line"><a name="l09021"></a><span class="lineno"> 9021</span>&#160;    <span class="stringliteral">&quot;UNKNOWN&quot;</span>,</div>
+<div class="line"><a name="l09022"></a><span class="lineno"> 9022</span>&#160;    <span class="stringliteral">&quot;BUFFER&quot;</span>,</div>
+<div class="line"><a name="l09023"></a><span class="lineno"> 9023</span>&#160;    <span class="stringliteral">&quot;IMAGE_UNKNOWN&quot;</span>,</div>
+<div class="line"><a name="l09024"></a><span class="lineno"> 9024</span>&#160;    <span class="stringliteral">&quot;IMAGE_LINEAR&quot;</span>,</div>
+<div class="line"><a name="l09025"></a><span class="lineno"> 9025</span>&#160;    <span class="stringliteral">&quot;IMAGE_OPTIMAL&quot;</span>,</div>
+<div class="line"><a name="l09026"></a><span class="lineno"> 9026</span>&#160;};</div>
+<div class="line"><a name="l09027"></a><span class="lineno"> 9027</span>&#160; </div>
+<div class="line"><a name="l09028"></a><span class="lineno"> 9028</span>&#160;<span class="keywordtype">void</span> VmaAllocation_T::PrintParameters(<span class="keyword">class</span> VmaJsonWriter&amp; json)<span class="keyword"> const</span></div>
+<div class="line"><a name="l09029"></a><span class="lineno"> 9029</span>&#160;<span class="keyword"></span>{</div>
+<div class="line"><a name="l09030"></a><span class="lineno"> 9030</span>&#160;    json.WriteString(<span class="stringliteral">&quot;Type&quot;</span>);</div>
+<div class="line"><a name="l09031"></a><span class="lineno"> 9031</span>&#160;    json.WriteString(VMA_SUBALLOCATION_TYPE_NAMES[m_SuballocationType]);</div>
+<div class="line"><a name="l09032"></a><span class="lineno"> 9032</span>&#160; </div>
+<div class="line"><a name="l09033"></a><span class="lineno"> 9033</span>&#160;    json.WriteString(<span class="stringliteral">&quot;Size&quot;</span>);</div>
+<div class="line"><a name="l09034"></a><span class="lineno"> 9034</span>&#160;    json.WriteNumber(m_Size);</div>
+<div class="line"><a name="l09035"></a><span class="lineno"> 9035</span>&#160; </div>
+<div class="line"><a name="l09036"></a><span class="lineno"> 9036</span>&#160;    <span class="keywordflow">if</span>(m_pUserData != VMA_NULL)</div>
+<div class="line"><a name="l09037"></a><span class="lineno"> 9037</span>&#160;    {</div>
+<div class="line"><a name="l09038"></a><span class="lineno"> 9038</span>&#160;        json.WriteString(<span class="stringliteral">&quot;UserData&quot;</span>);</div>
+<div class="line"><a name="l09039"></a><span class="lineno"> 9039</span>&#160;        <span class="keywordflow">if</span>(IsUserDataString())</div>
+<div class="line"><a name="l09040"></a><span class="lineno"> 9040</span>&#160;        {</div>
+<div class="line"><a name="l09041"></a><span class="lineno"> 9041</span>&#160;            json.WriteString((<span class="keyword">const</span> <span class="keywordtype">char</span>*)m_pUserData);</div>
+<div class="line"><a name="l09042"></a><span class="lineno"> 9042</span>&#160;        }</div>
+<div class="line"><a name="l09043"></a><span class="lineno"> 9043</span>&#160;        <span class="keywordflow">else</span></div>
 <div class="line"><a name="l09044"></a><span class="lineno"> 9044</span>&#160;        {</div>
-<div class="line"><a name="l09045"></a><span class="lineno"> 9045</span>&#160;            <span class="comment">// Find first free suballocation with size not less than allocSize + 2 * VMA_DEBUG_MARGIN.</span></div>
-<div class="line"><a name="l09046"></a><span class="lineno"> 9046</span>&#160;            VmaSuballocationList::iterator* <span class="keyword">const</span> it = VmaBinaryFindFirstNotLess(</div>
-<div class="line"><a name="l09047"></a><span class="lineno"> 9047</span>&#160;                m_FreeSuballocationsBySize.data(),</div>
-<div class="line"><a name="l09048"></a><span class="lineno"> 9048</span>&#160;                m_FreeSuballocationsBySize.data() + freeSuballocCount,</div>
-<div class="line"><a name="l09049"></a><span class="lineno"> 9049</span>&#160;                allocSize + 2 * VMA_DEBUG_MARGIN,</div>
-<div class="line"><a name="l09050"></a><span class="lineno"> 9050</span>&#160;                VmaSuballocationItemSizeLess());</div>
-<div class="line"><a name="l09051"></a><span class="lineno"> 9051</span>&#160;            <span class="keywordtype">size_t</span> index = it - m_FreeSuballocationsBySize.data();</div>
-<div class="line"><a name="l09052"></a><span class="lineno"> 9052</span>&#160;            <span class="keywordflow">for</span>(; index &lt; freeSuballocCount; ++index)</div>
-<div class="line"><a name="l09053"></a><span class="lineno"> 9053</span>&#160;            {</div>
-<div class="line"><a name="l09054"></a><span class="lineno"> 9054</span>&#160;                <span class="keywordflow">if</span>(CheckAllocation(</div>
-<div class="line"><a name="l09055"></a><span class="lineno"> 9055</span>&#160;                    currentFrameIndex,</div>
-<div class="line"><a name="l09056"></a><span class="lineno"> 9056</span>&#160;                    frameInUseCount,</div>
-<div class="line"><a name="l09057"></a><span class="lineno"> 9057</span>&#160;                    bufferImageGranularity,</div>
-<div class="line"><a name="l09058"></a><span class="lineno"> 9058</span>&#160;                    allocSize,</div>
-<div class="line"><a name="l09059"></a><span class="lineno"> 9059</span>&#160;                    allocAlignment,</div>
-<div class="line"><a name="l09060"></a><span class="lineno"> 9060</span>&#160;                    allocType,</div>
-<div class="line"><a name="l09061"></a><span class="lineno"> 9061</span>&#160;                    m_FreeSuballocationsBySize[index],</div>
-<div class="line"><a name="l09062"></a><span class="lineno"> 9062</span>&#160;                    <span class="keyword">false</span>, <span class="comment">// canMakeOtherLost</span></div>
-<div class="line"><a name="l09063"></a><span class="lineno"> 9063</span>&#160;                    &amp;pAllocationRequest-&gt;offset,</div>
-<div class="line"><a name="l09064"></a><span class="lineno"> 9064</span>&#160;                    &amp;pAllocationRequest-&gt;itemsToMakeLostCount,</div>
-<div class="line"><a name="l09065"></a><span class="lineno"> 9065</span>&#160;                    &amp;pAllocationRequest-&gt;sumFreeSize,</div>
-<div class="line"><a name="l09066"></a><span class="lineno"> 9066</span>&#160;                    &amp;pAllocationRequest-&gt;sumItemSize))</div>
-<div class="line"><a name="l09067"></a><span class="lineno"> 9067</span>&#160;                {</div>
-<div class="line"><a name="l09068"></a><span class="lineno"> 9068</span>&#160;                    pAllocationRequest-&gt;item = m_FreeSuballocationsBySize[index];</div>
-<div class="line"><a name="l09069"></a><span class="lineno"> 9069</span>&#160;                    <span class="keywordflow">return</span> <span class="keyword">true</span>;</div>
-<div class="line"><a name="l09070"></a><span class="lineno"> 9070</span>&#160;                }</div>
-<div class="line"><a name="l09071"></a><span class="lineno"> 9071</span>&#160;            }</div>
-<div class="line"><a name="l09072"></a><span class="lineno"> 9072</span>&#160;        }</div>
-<div class="line"><a name="l09073"></a><span class="lineno"> 9073</span>&#160;        <span class="keywordflow">else</span> <span class="keywordflow">if</span>(strategy == VMA_ALLOCATION_INTERNAL_STRATEGY_MIN_OFFSET)</div>
-<div class="line"><a name="l09074"></a><span class="lineno"> 9074</span>&#160;        {</div>
-<div class="line"><a name="l09075"></a><span class="lineno"> 9075</span>&#160;            <span class="keywordflow">for</span>(VmaSuballocationList::iterator it = m_Suballocations.begin();</div>
-<div class="line"><a name="l09076"></a><span class="lineno"> 9076</span>&#160;                it != m_Suballocations.end();</div>
-<div class="line"><a name="l09077"></a><span class="lineno"> 9077</span>&#160;                ++it)</div>
-<div class="line"><a name="l09078"></a><span class="lineno"> 9078</span>&#160;            {</div>
-<div class="line"><a name="l09079"></a><span class="lineno"> 9079</span>&#160;                <span class="keywordflow">if</span>(it-&gt;type == VMA_SUBALLOCATION_TYPE_FREE &amp;&amp; CheckAllocation(</div>
-<div class="line"><a name="l09080"></a><span class="lineno"> 9080</span>&#160;                    currentFrameIndex,</div>
-<div class="line"><a name="l09081"></a><span class="lineno"> 9081</span>&#160;                    frameInUseCount,</div>
-<div class="line"><a name="l09082"></a><span class="lineno"> 9082</span>&#160;                    bufferImageGranularity,</div>
-<div class="line"><a name="l09083"></a><span class="lineno"> 9083</span>&#160;                    allocSize,</div>
-<div class="line"><a name="l09084"></a><span class="lineno"> 9084</span>&#160;                    allocAlignment,</div>
-<div class="line"><a name="l09085"></a><span class="lineno"> 9085</span>&#160;                    allocType,</div>
-<div class="line"><a name="l09086"></a><span class="lineno"> 9086</span>&#160;                    it,</div>
-<div class="line"><a name="l09087"></a><span class="lineno"> 9087</span>&#160;                    <span class="keyword">false</span>, <span class="comment">// canMakeOtherLost</span></div>
-<div class="line"><a name="l09088"></a><span class="lineno"> 9088</span>&#160;                    &amp;pAllocationRequest-&gt;offset,</div>
-<div class="line"><a name="l09089"></a><span class="lineno"> 9089</span>&#160;                    &amp;pAllocationRequest-&gt;itemsToMakeLostCount,</div>
-<div class="line"><a name="l09090"></a><span class="lineno"> 9090</span>&#160;                    &amp;pAllocationRequest-&gt;sumFreeSize,</div>
-<div class="line"><a name="l09091"></a><span class="lineno"> 9091</span>&#160;                    &amp;pAllocationRequest-&gt;sumItemSize))</div>
-<div class="line"><a name="l09092"></a><span class="lineno"> 9092</span>&#160;                {</div>
-<div class="line"><a name="l09093"></a><span class="lineno"> 9093</span>&#160;                    pAllocationRequest-&gt;item = it;</div>
-<div class="line"><a name="l09094"></a><span class="lineno"> 9094</span>&#160;                    <span class="keywordflow">return</span> <span class="keyword">true</span>;</div>
-<div class="line"><a name="l09095"></a><span class="lineno"> 9095</span>&#160;                }</div>
-<div class="line"><a name="l09096"></a><span class="lineno"> 9096</span>&#160;            }</div>
-<div class="line"><a name="l09097"></a><span class="lineno"> 9097</span>&#160;        }</div>
-<div class="line"><a name="l09098"></a><span class="lineno"> 9098</span>&#160;        <span class="keywordflow">else</span> <span class="comment">// WORST_FIT, FIRST_FIT</span></div>
-<div class="line"><a name="l09099"></a><span class="lineno"> 9099</span>&#160;        {</div>
-<div class="line"><a name="l09100"></a><span class="lineno"> 9100</span>&#160;            <span class="comment">// Search staring from biggest suballocations.</span></div>
-<div class="line"><a name="l09101"></a><span class="lineno"> 9101</span>&#160;            <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> index = freeSuballocCount; index--; )</div>
-<div class="line"><a name="l09102"></a><span class="lineno"> 9102</span>&#160;            {</div>
-<div class="line"><a name="l09103"></a><span class="lineno"> 9103</span>&#160;                <span class="keywordflow">if</span>(CheckAllocation(</div>
-<div class="line"><a name="l09104"></a><span class="lineno"> 9104</span>&#160;                    currentFrameIndex,</div>
-<div class="line"><a name="l09105"></a><span class="lineno"> 9105</span>&#160;                    frameInUseCount,</div>
-<div class="line"><a name="l09106"></a><span class="lineno"> 9106</span>&#160;                    bufferImageGranularity,</div>
-<div class="line"><a name="l09107"></a><span class="lineno"> 9107</span>&#160;                    allocSize,</div>
-<div class="line"><a name="l09108"></a><span class="lineno"> 9108</span>&#160;                    allocAlignment,</div>
-<div class="line"><a name="l09109"></a><span class="lineno"> 9109</span>&#160;                    allocType,</div>
-<div class="line"><a name="l09110"></a><span class="lineno"> 9110</span>&#160;                    m_FreeSuballocationsBySize[index],</div>
-<div class="line"><a name="l09111"></a><span class="lineno"> 9111</span>&#160;                    <span class="keyword">false</span>, <span class="comment">// canMakeOtherLost</span></div>
-<div class="line"><a name="l09112"></a><span class="lineno"> 9112</span>&#160;                    &amp;pAllocationRequest-&gt;offset,</div>
-<div class="line"><a name="l09113"></a><span class="lineno"> 9113</span>&#160;                    &amp;pAllocationRequest-&gt;itemsToMakeLostCount,</div>
-<div class="line"><a name="l09114"></a><span class="lineno"> 9114</span>&#160;                    &amp;pAllocationRequest-&gt;sumFreeSize,</div>
-<div class="line"><a name="l09115"></a><span class="lineno"> 9115</span>&#160;                    &amp;pAllocationRequest-&gt;sumItemSize))</div>
-<div class="line"><a name="l09116"></a><span class="lineno"> 9116</span>&#160;                {</div>
-<div class="line"><a name="l09117"></a><span class="lineno"> 9117</span>&#160;                    pAllocationRequest-&gt;item = m_FreeSuballocationsBySize[index];</div>
-<div class="line"><a name="l09118"></a><span class="lineno"> 9118</span>&#160;                    <span class="keywordflow">return</span> <span class="keyword">true</span>;</div>
-<div class="line"><a name="l09119"></a><span class="lineno"> 9119</span>&#160;                }</div>
-<div class="line"><a name="l09120"></a><span class="lineno"> 9120</span>&#160;            }</div>
-<div class="line"><a name="l09121"></a><span class="lineno"> 9121</span>&#160;        }</div>
-<div class="line"><a name="l09122"></a><span class="lineno"> 9122</span>&#160;    }</div>
-<div class="line"><a name="l09123"></a><span class="lineno"> 9123</span>&#160; </div>
-<div class="line"><a name="l09124"></a><span class="lineno"> 9124</span>&#160;    <span class="keywordflow">if</span>(canMakeOtherLost)</div>
-<div class="line"><a name="l09125"></a><span class="lineno"> 9125</span>&#160;    {</div>
-<div class="line"><a name="l09126"></a><span class="lineno"> 9126</span>&#160;        <span class="comment">// Brute-force algorithm. TODO: Come up with something better.</span></div>
-<div class="line"><a name="l09127"></a><span class="lineno"> 9127</span>&#160; </div>
-<div class="line"><a name="l09128"></a><span class="lineno"> 9128</span>&#160;        <span class="keywordtype">bool</span> found = <span class="keyword">false</span>;</div>
-<div class="line"><a name="l09129"></a><span class="lineno"> 9129</span>&#160;        VmaAllocationRequest tmpAllocRequest = {};</div>
-<div class="line"><a name="l09130"></a><span class="lineno"> 9130</span>&#160;        tmpAllocRequest.type = VmaAllocationRequestType::Normal;</div>
-<div class="line"><a name="l09131"></a><span class="lineno"> 9131</span>&#160;        <span class="keywordflow">for</span>(VmaSuballocationList::iterator suballocIt = m_Suballocations.begin();</div>
-<div class="line"><a name="l09132"></a><span class="lineno"> 9132</span>&#160;            suballocIt != m_Suballocations.end();</div>
-<div class="line"><a name="l09133"></a><span class="lineno"> 9133</span>&#160;            ++suballocIt)</div>
-<div class="line"><a name="l09134"></a><span class="lineno"> 9134</span>&#160;        {</div>
-<div class="line"><a name="l09135"></a><span class="lineno"> 9135</span>&#160;            <span class="keywordflow">if</span>(suballocIt-&gt;type == VMA_SUBALLOCATION_TYPE_FREE ||</div>
-<div class="line"><a name="l09136"></a><span class="lineno"> 9136</span>&#160;                suballocIt-&gt;hAllocation-&gt;CanBecomeLost())</div>
-<div class="line"><a name="l09137"></a><span class="lineno"> 9137</span>&#160;            {</div>
-<div class="line"><a name="l09138"></a><span class="lineno"> 9138</span>&#160;                <span class="keywordflow">if</span>(CheckAllocation(</div>
-<div class="line"><a name="l09139"></a><span class="lineno"> 9139</span>&#160;                    currentFrameIndex,</div>
-<div class="line"><a name="l09140"></a><span class="lineno"> 9140</span>&#160;                    frameInUseCount,</div>
-<div class="line"><a name="l09141"></a><span class="lineno"> 9141</span>&#160;                    bufferImageGranularity,</div>
-<div class="line"><a name="l09142"></a><span class="lineno"> 9142</span>&#160;                    allocSize,</div>
-<div class="line"><a name="l09143"></a><span class="lineno"> 9143</span>&#160;                    allocAlignment,</div>
-<div class="line"><a name="l09144"></a><span class="lineno"> 9144</span>&#160;                    allocType,</div>
-<div class="line"><a name="l09145"></a><span class="lineno"> 9145</span>&#160;                    suballocIt,</div>
-<div class="line"><a name="l09146"></a><span class="lineno"> 9146</span>&#160;                    canMakeOtherLost,</div>
-<div class="line"><a name="l09147"></a><span class="lineno"> 9147</span>&#160;                    &amp;tmpAllocRequest.offset,</div>
-<div class="line"><a name="l09148"></a><span class="lineno"> 9148</span>&#160;                    &amp;tmpAllocRequest.itemsToMakeLostCount,</div>
-<div class="line"><a name="l09149"></a><span class="lineno"> 9149</span>&#160;                    &amp;tmpAllocRequest.sumFreeSize,</div>
-<div class="line"><a name="l09150"></a><span class="lineno"> 9150</span>&#160;                    &amp;tmpAllocRequest.sumItemSize))</div>
-<div class="line"><a name="l09151"></a><span class="lineno"> 9151</span>&#160;                {</div>
-<div class="line"><a name="l09152"></a><span class="lineno"> 9152</span>&#160;                    <span class="keywordflow">if</span>(strategy == <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a33eb2052674f3ad92386c714a65fb777">VMA_ALLOCATION_CREATE_STRATEGY_FIRST_FIT_BIT</a>)</div>
-<div class="line"><a name="l09153"></a><span class="lineno"> 9153</span>&#160;                    {</div>
-<div class="line"><a name="l09154"></a><span class="lineno"> 9154</span>&#160;                        *pAllocationRequest = tmpAllocRequest;</div>
-<div class="line"><a name="l09155"></a><span class="lineno"> 9155</span>&#160;                        pAllocationRequest-&gt;item = suballocIt;</div>
-<div class="line"><a name="l09156"></a><span class="lineno"> 9156</span>&#160;                        <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l09157"></a><span class="lineno"> 9157</span>&#160;                    }</div>
-<div class="line"><a name="l09158"></a><span class="lineno"> 9158</span>&#160;                    <span class="keywordflow">if</span>(!found || tmpAllocRequest.CalcCost() &lt; pAllocationRequest-&gt;CalcCost())</div>
-<div class="line"><a name="l09159"></a><span class="lineno"> 9159</span>&#160;                    {</div>
-<div class="line"><a name="l09160"></a><span class="lineno"> 9160</span>&#160;                        *pAllocationRequest = tmpAllocRequest;</div>
-<div class="line"><a name="l09161"></a><span class="lineno"> 9161</span>&#160;                        pAllocationRequest-&gt;item = suballocIt;</div>
-<div class="line"><a name="l09162"></a><span class="lineno"> 9162</span>&#160;                        found = <span class="keyword">true</span>;</div>
-<div class="line"><a name="l09163"></a><span class="lineno"> 9163</span>&#160;                    }</div>
-<div class="line"><a name="l09164"></a><span class="lineno"> 9164</span>&#160;                }</div>
-<div class="line"><a name="l09165"></a><span class="lineno"> 9165</span>&#160;            }</div>
-<div class="line"><a name="l09166"></a><span class="lineno"> 9166</span>&#160;        }</div>
+<div class="line"><a name="l09045"></a><span class="lineno"> 9045</span>&#160;            json.BeginString();</div>
+<div class="line"><a name="l09046"></a><span class="lineno"> 9046</span>&#160;            json.ContinueString_Pointer(m_pUserData);</div>
+<div class="line"><a name="l09047"></a><span class="lineno"> 9047</span>&#160;            json.EndString();</div>
+<div class="line"><a name="l09048"></a><span class="lineno"> 9048</span>&#160;        }</div>
+<div class="line"><a name="l09049"></a><span class="lineno"> 9049</span>&#160;    }</div>
+<div class="line"><a name="l09050"></a><span class="lineno"> 9050</span>&#160; </div>
+<div class="line"><a name="l09051"></a><span class="lineno"> 9051</span>&#160;    json.WriteString(<span class="stringliteral">&quot;CreationFrameIndex&quot;</span>);</div>
+<div class="line"><a name="l09052"></a><span class="lineno"> 9052</span>&#160;    json.WriteNumber(m_CreationFrameIndex);</div>
+<div class="line"><a name="l09053"></a><span class="lineno"> 9053</span>&#160; </div>
+<div class="line"><a name="l09054"></a><span class="lineno"> 9054</span>&#160;    json.WriteString(<span class="stringliteral">&quot;LastUseFrameIndex&quot;</span>);</div>
+<div class="line"><a name="l09055"></a><span class="lineno"> 9055</span>&#160;    json.WriteNumber(GetLastUseFrameIndex());</div>
+<div class="line"><a name="l09056"></a><span class="lineno"> 9056</span>&#160; </div>
+<div class="line"><a name="l09057"></a><span class="lineno"> 9057</span>&#160;    <span class="keywordflow">if</span>(m_BufferImageUsage != 0)</div>
+<div class="line"><a name="l09058"></a><span class="lineno"> 9058</span>&#160;    {</div>
+<div class="line"><a name="l09059"></a><span class="lineno"> 9059</span>&#160;        json.WriteString(<span class="stringliteral">&quot;Usage&quot;</span>);</div>
+<div class="line"><a name="l09060"></a><span class="lineno"> 9060</span>&#160;        json.WriteNumber(m_BufferImageUsage);</div>
+<div class="line"><a name="l09061"></a><span class="lineno"> 9061</span>&#160;    }</div>
+<div class="line"><a name="l09062"></a><span class="lineno"> 9062</span>&#160;}</div>
+<div class="line"><a name="l09063"></a><span class="lineno"> 9063</span>&#160; </div>
+<div class="line"><a name="l09064"></a><span class="lineno"> 9064</span>&#160;<span class="preprocessor">#endif</span></div>
+<div class="line"><a name="l09065"></a><span class="lineno"> 9065</span>&#160; </div>
+<div class="line"><a name="l09066"></a><span class="lineno"> 9066</span>&#160;<span class="keywordtype">void</span> VmaAllocation_T::FreeUserDataString(<a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator)</div>
+<div class="line"><a name="l09067"></a><span class="lineno"> 9067</span>&#160;{</div>
+<div class="line"><a name="l09068"></a><span class="lineno"> 9068</span>&#160;    VMA_ASSERT(IsUserDataString());</div>
+<div class="line"><a name="l09069"></a><span class="lineno"> 9069</span>&#160;    VmaFreeString(hAllocator-&gt;GetAllocationCallbacks(), (<span class="keywordtype">char</span>*)m_pUserData);</div>
+<div class="line"><a name="l09070"></a><span class="lineno"> 9070</span>&#160;    m_pUserData = VMA_NULL;</div>
+<div class="line"><a name="l09071"></a><span class="lineno"> 9071</span>&#160;}</div>
+<div class="line"><a name="l09072"></a><span class="lineno"> 9072</span>&#160; </div>
+<div class="line"><a name="l09073"></a><span class="lineno"> 9073</span>&#160;<span class="keywordtype">void</span> VmaAllocation_T::BlockAllocMap()</div>
+<div class="line"><a name="l09074"></a><span class="lineno"> 9074</span>&#160;{</div>
+<div class="line"><a name="l09075"></a><span class="lineno"> 9075</span>&#160;    VMA_ASSERT(GetType() == ALLOCATION_TYPE_BLOCK);</div>
+<div class="line"><a name="l09076"></a><span class="lineno"> 9076</span>&#160; </div>
+<div class="line"><a name="l09077"></a><span class="lineno"> 9077</span>&#160;    <span class="keywordflow">if</span>((m_MapCount &amp; ~MAP_COUNT_FLAG_PERSISTENT_MAP) &lt; 0x7F)</div>
+<div class="line"><a name="l09078"></a><span class="lineno"> 9078</span>&#160;    {</div>
+<div class="line"><a name="l09079"></a><span class="lineno"> 9079</span>&#160;        ++m_MapCount;</div>
+<div class="line"><a name="l09080"></a><span class="lineno"> 9080</span>&#160;    }</div>
+<div class="line"><a name="l09081"></a><span class="lineno"> 9081</span>&#160;    <span class="keywordflow">else</span></div>
+<div class="line"><a name="l09082"></a><span class="lineno"> 9082</span>&#160;    {</div>
+<div class="line"><a name="l09083"></a><span class="lineno"> 9083</span>&#160;        VMA_ASSERT(0 &amp;&amp; <span class="stringliteral">&quot;Allocation mapped too many times simultaneously.&quot;</span>);</div>
+<div class="line"><a name="l09084"></a><span class="lineno"> 9084</span>&#160;    }</div>
+<div class="line"><a name="l09085"></a><span class="lineno"> 9085</span>&#160;}</div>
+<div class="line"><a name="l09086"></a><span class="lineno"> 9086</span>&#160; </div>
+<div class="line"><a name="l09087"></a><span class="lineno"> 9087</span>&#160;<span class="keywordtype">void</span> VmaAllocation_T::BlockAllocUnmap()</div>
+<div class="line"><a name="l09088"></a><span class="lineno"> 9088</span>&#160;{</div>
+<div class="line"><a name="l09089"></a><span class="lineno"> 9089</span>&#160;    VMA_ASSERT(GetType() == ALLOCATION_TYPE_BLOCK);</div>
+<div class="line"><a name="l09090"></a><span class="lineno"> 9090</span>&#160; </div>
+<div class="line"><a name="l09091"></a><span class="lineno"> 9091</span>&#160;    <span class="keywordflow">if</span>((m_MapCount &amp; ~MAP_COUNT_FLAG_PERSISTENT_MAP) != 0)</div>
+<div class="line"><a name="l09092"></a><span class="lineno"> 9092</span>&#160;    {</div>
+<div class="line"><a name="l09093"></a><span class="lineno"> 9093</span>&#160;        --m_MapCount;</div>
+<div class="line"><a name="l09094"></a><span class="lineno"> 9094</span>&#160;    }</div>
+<div class="line"><a name="l09095"></a><span class="lineno"> 9095</span>&#160;    <span class="keywordflow">else</span></div>
+<div class="line"><a name="l09096"></a><span class="lineno"> 9096</span>&#160;    {</div>
+<div class="line"><a name="l09097"></a><span class="lineno"> 9097</span>&#160;        VMA_ASSERT(0 &amp;&amp; <span class="stringliteral">&quot;Unmapping allocation not previously mapped.&quot;</span>);</div>
+<div class="line"><a name="l09098"></a><span class="lineno"> 9098</span>&#160;    }</div>
+<div class="line"><a name="l09099"></a><span class="lineno"> 9099</span>&#160;}</div>
+<div class="line"><a name="l09100"></a><span class="lineno"> 9100</span>&#160; </div>
+<div class="line"><a name="l09101"></a><span class="lineno"> 9101</span>&#160;VkResult VmaAllocation_T::DedicatedAllocMap(<a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator, <span class="keywordtype">void</span>** ppData)</div>
+<div class="line"><a name="l09102"></a><span class="lineno"> 9102</span>&#160;{</div>
+<div class="line"><a name="l09103"></a><span class="lineno"> 9103</span>&#160;    VMA_ASSERT(GetType() == ALLOCATION_TYPE_DEDICATED);</div>
+<div class="line"><a name="l09104"></a><span class="lineno"> 9104</span>&#160; </div>
+<div class="line"><a name="l09105"></a><span class="lineno"> 9105</span>&#160;    <span class="keywordflow">if</span>(m_MapCount != 0)</div>
+<div class="line"><a name="l09106"></a><span class="lineno"> 9106</span>&#160;    {</div>
+<div class="line"><a name="l09107"></a><span class="lineno"> 9107</span>&#160;        <span class="keywordflow">if</span>((m_MapCount &amp; ~MAP_COUNT_FLAG_PERSISTENT_MAP) &lt; 0x7F)</div>
+<div class="line"><a name="l09108"></a><span class="lineno"> 9108</span>&#160;        {</div>
+<div class="line"><a name="l09109"></a><span class="lineno"> 9109</span>&#160;            VMA_ASSERT(m_DedicatedAllocation.m_pMappedData != VMA_NULL);</div>
+<div class="line"><a name="l09110"></a><span class="lineno"> 9110</span>&#160;            *ppData = m_DedicatedAllocation.m_pMappedData;</div>
+<div class="line"><a name="l09111"></a><span class="lineno"> 9111</span>&#160;            ++m_MapCount;</div>
+<div class="line"><a name="l09112"></a><span class="lineno"> 9112</span>&#160;            <span class="keywordflow">return</span> VK_SUCCESS;</div>
+<div class="line"><a name="l09113"></a><span class="lineno"> 9113</span>&#160;        }</div>
+<div class="line"><a name="l09114"></a><span class="lineno"> 9114</span>&#160;        <span class="keywordflow">else</span></div>
+<div class="line"><a name="l09115"></a><span class="lineno"> 9115</span>&#160;        {</div>
+<div class="line"><a name="l09116"></a><span class="lineno"> 9116</span>&#160;            VMA_ASSERT(0 &amp;&amp; <span class="stringliteral">&quot;Dedicated allocation mapped too many times simultaneously.&quot;</span>);</div>
+<div class="line"><a name="l09117"></a><span class="lineno"> 9117</span>&#160;            <span class="keywordflow">return</span> VK_ERROR_MEMORY_MAP_FAILED;</div>
+<div class="line"><a name="l09118"></a><span class="lineno"> 9118</span>&#160;        }</div>
+<div class="line"><a name="l09119"></a><span class="lineno"> 9119</span>&#160;    }</div>
+<div class="line"><a name="l09120"></a><span class="lineno"> 9120</span>&#160;    <span class="keywordflow">else</span></div>
+<div class="line"><a name="l09121"></a><span class="lineno"> 9121</span>&#160;    {</div>
+<div class="line"><a name="l09122"></a><span class="lineno"> 9122</span>&#160;        VkResult result = (*hAllocator-&gt;GetVulkanFunctions().vkMapMemory)(</div>
+<div class="line"><a name="l09123"></a><span class="lineno"> 9123</span>&#160;            hAllocator-&gt;m_hDevice,</div>
+<div class="line"><a name="l09124"></a><span class="lineno"> 9124</span>&#160;            m_DedicatedAllocation.m_hMemory,</div>
+<div class="line"><a name="l09125"></a><span class="lineno"> 9125</span>&#160;            0, <span class="comment">// offset</span></div>
+<div class="line"><a name="l09126"></a><span class="lineno"> 9126</span>&#160;            VK_WHOLE_SIZE,</div>
+<div class="line"><a name="l09127"></a><span class="lineno"> 9127</span>&#160;            0, <span class="comment">// flags</span></div>
+<div class="line"><a name="l09128"></a><span class="lineno"> 9128</span>&#160;            ppData);</div>
+<div class="line"><a name="l09129"></a><span class="lineno"> 9129</span>&#160;        <span class="keywordflow">if</span>(result == VK_SUCCESS)</div>
+<div class="line"><a name="l09130"></a><span class="lineno"> 9130</span>&#160;        {</div>
+<div class="line"><a name="l09131"></a><span class="lineno"> 9131</span>&#160;            m_DedicatedAllocation.m_pMappedData = *ppData;</div>
+<div class="line"><a name="l09132"></a><span class="lineno"> 9132</span>&#160;            m_MapCount = 1;</div>
+<div class="line"><a name="l09133"></a><span class="lineno"> 9133</span>&#160;        }</div>
+<div class="line"><a name="l09134"></a><span class="lineno"> 9134</span>&#160;        <span class="keywordflow">return</span> result;</div>
+<div class="line"><a name="l09135"></a><span class="lineno"> 9135</span>&#160;    }</div>
+<div class="line"><a name="l09136"></a><span class="lineno"> 9136</span>&#160;}</div>
+<div class="line"><a name="l09137"></a><span class="lineno"> 9137</span>&#160; </div>
+<div class="line"><a name="l09138"></a><span class="lineno"> 9138</span>&#160;<span class="keywordtype">void</span> VmaAllocation_T::DedicatedAllocUnmap(<a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator)</div>
+<div class="line"><a name="l09139"></a><span class="lineno"> 9139</span>&#160;{</div>
+<div class="line"><a name="l09140"></a><span class="lineno"> 9140</span>&#160;    VMA_ASSERT(GetType() == ALLOCATION_TYPE_DEDICATED);</div>
+<div class="line"><a name="l09141"></a><span class="lineno"> 9141</span>&#160; </div>
+<div class="line"><a name="l09142"></a><span class="lineno"> 9142</span>&#160;    <span class="keywordflow">if</span>((m_MapCount &amp; ~MAP_COUNT_FLAG_PERSISTENT_MAP) != 0)</div>
+<div class="line"><a name="l09143"></a><span class="lineno"> 9143</span>&#160;    {</div>
+<div class="line"><a name="l09144"></a><span class="lineno"> 9144</span>&#160;        --m_MapCount;</div>
+<div class="line"><a name="l09145"></a><span class="lineno"> 9145</span>&#160;        <span class="keywordflow">if</span>(m_MapCount == 0)</div>
+<div class="line"><a name="l09146"></a><span class="lineno"> 9146</span>&#160;        {</div>
+<div class="line"><a name="l09147"></a><span class="lineno"> 9147</span>&#160;            m_DedicatedAllocation.m_pMappedData = VMA_NULL;</div>
+<div class="line"><a name="l09148"></a><span class="lineno"> 9148</span>&#160;            (*hAllocator-&gt;GetVulkanFunctions().vkUnmapMemory)(</div>
+<div class="line"><a name="l09149"></a><span class="lineno"> 9149</span>&#160;                hAllocator-&gt;m_hDevice,</div>
+<div class="line"><a name="l09150"></a><span class="lineno"> 9150</span>&#160;                m_DedicatedAllocation.m_hMemory);</div>
+<div class="line"><a name="l09151"></a><span class="lineno"> 9151</span>&#160;        }</div>
+<div class="line"><a name="l09152"></a><span class="lineno"> 9152</span>&#160;    }</div>
+<div class="line"><a name="l09153"></a><span class="lineno"> 9153</span>&#160;    <span class="keywordflow">else</span></div>
+<div class="line"><a name="l09154"></a><span class="lineno"> 9154</span>&#160;    {</div>
+<div class="line"><a name="l09155"></a><span class="lineno"> 9155</span>&#160;        VMA_ASSERT(0 &amp;&amp; <span class="stringliteral">&quot;Unmapping dedicated allocation not previously mapped.&quot;</span>);</div>
+<div class="line"><a name="l09156"></a><span class="lineno"> 9156</span>&#160;    }</div>
+<div class="line"><a name="l09157"></a><span class="lineno"> 9157</span>&#160;}</div>
+<div class="line"><a name="l09158"></a><span class="lineno"> 9158</span>&#160; </div>
+<div class="line"><a name="l09159"></a><span class="lineno"> 9159</span>&#160;<span class="preprocessor">#if VMA_STATS_STRING_ENABLED</span></div>
+<div class="line"><a name="l09160"></a><span class="lineno"> 9160</span>&#160; </div>
+<div class="line"><a name="l09161"></a><span class="lineno"> 9161</span>&#160;<span class="keyword">static</span> <span class="keywordtype">void</span> VmaPrintStatInfo(VmaJsonWriter&amp; json, <span class="keyword">const</span> <a class="code" href="struct_vma_stat_info.html">VmaStatInfo</a>&amp; stat)</div>
+<div class="line"><a name="l09162"></a><span class="lineno"> 9162</span>&#160;{</div>
+<div class="line"><a name="l09163"></a><span class="lineno"> 9163</span>&#160;    json.BeginObject();</div>
+<div class="line"><a name="l09164"></a><span class="lineno"> 9164</span>&#160; </div>
+<div class="line"><a name="l09165"></a><span class="lineno"> 9165</span>&#160;    json.WriteString(<span class="stringliteral">&quot;Blocks&quot;</span>);</div>
+<div class="line"><a name="l09166"></a><span class="lineno"> 9166</span>&#160;    json.WriteNumber(stat.<a class="code" href="struct_vma_stat_info.html#abc4bb7cd611900778464c56e50c970a4">blockCount</a>);</div>
 <div class="line"><a name="l09167"></a><span class="lineno"> 9167</span>&#160; </div>
-<div class="line"><a name="l09168"></a><span class="lineno"> 9168</span>&#160;        <span class="keywordflow">return</span> found;</div>
-<div class="line"><a name="l09169"></a><span class="lineno"> 9169</span>&#160;    }</div>
+<div class="line"><a name="l09168"></a><span class="lineno"> 9168</span>&#160;    json.WriteString(<span class="stringliteral">&quot;Allocations&quot;</span>);</div>
+<div class="line"><a name="l09169"></a><span class="lineno"> 9169</span>&#160;    json.WriteNumber(stat.<a class="code" href="struct_vma_stat_info.html#a537741e4d5cdddc1c0ab95ec650afaff">allocationCount</a>);</div>
 <div class="line"><a name="l09170"></a><span class="lineno"> 9170</span>&#160; </div>
-<div class="line"><a name="l09171"></a><span class="lineno"> 9171</span>&#160;    <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
-<div class="line"><a name="l09172"></a><span class="lineno"> 9172</span>&#160;}</div>
+<div class="line"><a name="l09171"></a><span class="lineno"> 9171</span>&#160;    json.WriteString(<span class="stringliteral">&quot;UnusedRanges&quot;</span>);</div>
+<div class="line"><a name="l09172"></a><span class="lineno"> 9172</span>&#160;    json.WriteNumber(stat.<a class="code" href="struct_vma_stat_info.html#ae06129c771bfebfd6468a7f4276502a9">unusedRangeCount</a>);</div>
 <div class="line"><a name="l09173"></a><span class="lineno"> 9173</span>&#160; </div>
-<div class="line"><a name="l09174"></a><span class="lineno"> 9174</span>&#160;<span class="keywordtype">bool</span> VmaBlockMetadata_Generic::MakeRequestedAllocationsLost(</div>
-<div class="line"><a name="l09175"></a><span class="lineno"> 9175</span>&#160;    uint32_t currentFrameIndex,</div>
-<div class="line"><a name="l09176"></a><span class="lineno"> 9176</span>&#160;    uint32_t frameInUseCount,</div>
-<div class="line"><a name="l09177"></a><span class="lineno"> 9177</span>&#160;    VmaAllocationRequest* pAllocationRequest)</div>
-<div class="line"><a name="l09178"></a><span class="lineno"> 9178</span>&#160;{</div>
-<div class="line"><a name="l09179"></a><span class="lineno"> 9179</span>&#160;    VMA_ASSERT(pAllocationRequest &amp;&amp; pAllocationRequest-&gt;type == VmaAllocationRequestType::Normal);</div>
-<div class="line"><a name="l09180"></a><span class="lineno"> 9180</span>&#160; </div>
-<div class="line"><a name="l09181"></a><span class="lineno"> 9181</span>&#160;    <span class="keywordflow">while</span>(pAllocationRequest-&gt;itemsToMakeLostCount &gt; 0)</div>
-<div class="line"><a name="l09182"></a><span class="lineno"> 9182</span>&#160;    {</div>
-<div class="line"><a name="l09183"></a><span class="lineno"> 9183</span>&#160;        <span class="keywordflow">if</span>(pAllocationRequest-&gt;item-&gt;type == VMA_SUBALLOCATION_TYPE_FREE)</div>
-<div class="line"><a name="l09184"></a><span class="lineno"> 9184</span>&#160;        {</div>
-<div class="line"><a name="l09185"></a><span class="lineno"> 9185</span>&#160;            ++pAllocationRequest-&gt;item;</div>
-<div class="line"><a name="l09186"></a><span class="lineno"> 9186</span>&#160;        }</div>
-<div class="line"><a name="l09187"></a><span class="lineno"> 9187</span>&#160;        VMA_ASSERT(pAllocationRequest-&gt;item != m_Suballocations.end());</div>
-<div class="line"><a name="l09188"></a><span class="lineno"> 9188</span>&#160;        VMA_ASSERT(pAllocationRequest-&gt;item-&gt;hAllocation != VK_NULL_HANDLE);</div>
-<div class="line"><a name="l09189"></a><span class="lineno"> 9189</span>&#160;        VMA_ASSERT(pAllocationRequest-&gt;item-&gt;hAllocation-&gt;CanBecomeLost());</div>
-<div class="line"><a name="l09190"></a><span class="lineno"> 9190</span>&#160;        <span class="keywordflow">if</span>(pAllocationRequest-&gt;item-&gt;hAllocation-&gt;MakeLost(currentFrameIndex, frameInUseCount))</div>
-<div class="line"><a name="l09191"></a><span class="lineno"> 9191</span>&#160;        {</div>
-<div class="line"><a name="l09192"></a><span class="lineno"> 9192</span>&#160;            pAllocationRequest-&gt;item = FreeSuballocation(pAllocationRequest-&gt;item);</div>
-<div class="line"><a name="l09193"></a><span class="lineno"> 9193</span>&#160;            --pAllocationRequest-&gt;itemsToMakeLostCount;</div>
-<div class="line"><a name="l09194"></a><span class="lineno"> 9194</span>&#160;        }</div>
-<div class="line"><a name="l09195"></a><span class="lineno"> 9195</span>&#160;        <span class="keywordflow">else</span></div>
-<div class="line"><a name="l09196"></a><span class="lineno"> 9196</span>&#160;        {</div>
-<div class="line"><a name="l09197"></a><span class="lineno"> 9197</span>&#160;            <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
-<div class="line"><a name="l09198"></a><span class="lineno"> 9198</span>&#160;        }</div>
-<div class="line"><a name="l09199"></a><span class="lineno"> 9199</span>&#160;    }</div>
-<div class="line"><a name="l09200"></a><span class="lineno"> 9200</span>&#160; </div>
-<div class="line"><a name="l09201"></a><span class="lineno"> 9201</span>&#160;    VMA_HEAVY_ASSERT(Validate());</div>
-<div class="line"><a name="l09202"></a><span class="lineno"> 9202</span>&#160;    VMA_ASSERT(pAllocationRequest-&gt;item != m_Suballocations.end());</div>
-<div class="line"><a name="l09203"></a><span class="lineno"> 9203</span>&#160;    VMA_ASSERT(pAllocationRequest-&gt;item-&gt;type == VMA_SUBALLOCATION_TYPE_FREE);</div>
-<div class="line"><a name="l09204"></a><span class="lineno"> 9204</span>&#160;    </div>
-<div class="line"><a name="l09205"></a><span class="lineno"> 9205</span>&#160;    <span class="keywordflow">return</span> <span class="keyword">true</span>;</div>
-<div class="line"><a name="l09206"></a><span class="lineno"> 9206</span>&#160;}</div>
-<div class="line"><a name="l09207"></a><span class="lineno"> 9207</span>&#160; </div>
-<div class="line"><a name="l09208"></a><span class="lineno"> 9208</span>&#160;uint32_t VmaBlockMetadata_Generic::MakeAllocationsLost(uint32_t currentFrameIndex, uint32_t frameInUseCount)</div>
-<div class="line"><a name="l09209"></a><span class="lineno"> 9209</span>&#160;{</div>
-<div class="line"><a name="l09210"></a><span class="lineno"> 9210</span>&#160;    uint32_t lostAllocationCount = 0;</div>
-<div class="line"><a name="l09211"></a><span class="lineno"> 9211</span>&#160;    <span class="keywordflow">for</span>(VmaSuballocationList::iterator it = m_Suballocations.begin();</div>
-<div class="line"><a name="l09212"></a><span class="lineno"> 9212</span>&#160;        it != m_Suballocations.end();</div>
-<div class="line"><a name="l09213"></a><span class="lineno"> 9213</span>&#160;        ++it)</div>
-<div class="line"><a name="l09214"></a><span class="lineno"> 9214</span>&#160;    {</div>
-<div class="line"><a name="l09215"></a><span class="lineno"> 9215</span>&#160;        <span class="keywordflow">if</span>(it-&gt;type != VMA_SUBALLOCATION_TYPE_FREE &amp;&amp;</div>
-<div class="line"><a name="l09216"></a><span class="lineno"> 9216</span>&#160;            it-&gt;hAllocation-&gt;CanBecomeLost() &amp;&amp;</div>
-<div class="line"><a name="l09217"></a><span class="lineno"> 9217</span>&#160;            it-&gt;hAllocation-&gt;MakeLost(currentFrameIndex, frameInUseCount))</div>
-<div class="line"><a name="l09218"></a><span class="lineno"> 9218</span>&#160;        {</div>
-<div class="line"><a name="l09219"></a><span class="lineno"> 9219</span>&#160;            it = FreeSuballocation(it);</div>
-<div class="line"><a name="l09220"></a><span class="lineno"> 9220</span>&#160;            ++lostAllocationCount;</div>
-<div class="line"><a name="l09221"></a><span class="lineno"> 9221</span>&#160;        }</div>
-<div class="line"><a name="l09222"></a><span class="lineno"> 9222</span>&#160;    }</div>
-<div class="line"><a name="l09223"></a><span class="lineno"> 9223</span>&#160;    <span class="keywordflow">return</span> lostAllocationCount;</div>
-<div class="line"><a name="l09224"></a><span class="lineno"> 9224</span>&#160;}</div>
-<div class="line"><a name="l09225"></a><span class="lineno"> 9225</span>&#160; </div>
-<div class="line"><a name="l09226"></a><span class="lineno"> 9226</span>&#160;VkResult VmaBlockMetadata_Generic::CheckCorruption(<span class="keyword">const</span> <span class="keywordtype">void</span>* pBlockData)</div>
-<div class="line"><a name="l09227"></a><span class="lineno"> 9227</span>&#160;{</div>
-<div class="line"><a name="l09228"></a><span class="lineno"> 9228</span>&#160;    <span class="keywordflow">for</span>(VmaSuballocationList::iterator it = m_Suballocations.begin();</div>
-<div class="line"><a name="l09229"></a><span class="lineno"> 9229</span>&#160;        it != m_Suballocations.end();</div>
-<div class="line"><a name="l09230"></a><span class="lineno"> 9230</span>&#160;        ++it)</div>
-<div class="line"><a name="l09231"></a><span class="lineno"> 9231</span>&#160;    {</div>
-<div class="line"><a name="l09232"></a><span class="lineno"> 9232</span>&#160;        <span class="keywordflow">if</span>(it-&gt;type != VMA_SUBALLOCATION_TYPE_FREE)</div>
-<div class="line"><a name="l09233"></a><span class="lineno"> 9233</span>&#160;        {</div>
-<div class="line"><a name="l09234"></a><span class="lineno"> 9234</span>&#160;            <span class="keywordflow">if</span>(!VmaValidateMagicValue(pBlockData, it-&gt;offset - VMA_DEBUG_MARGIN))</div>
-<div class="line"><a name="l09235"></a><span class="lineno"> 9235</span>&#160;            {</div>
-<div class="line"><a name="l09236"></a><span class="lineno"> 9236</span>&#160;                VMA_ASSERT(0 &amp;&amp; <span class="stringliteral">&quot;MEMORY CORRUPTION DETECTED BEFORE VALIDATED ALLOCATION!&quot;</span>);</div>
-<div class="line"><a name="l09237"></a><span class="lineno"> 9237</span>&#160;                <span class="keywordflow">return</span> VK_ERROR_VALIDATION_FAILED_EXT;</div>
-<div class="line"><a name="l09238"></a><span class="lineno"> 9238</span>&#160;            }</div>
-<div class="line"><a name="l09239"></a><span class="lineno"> 9239</span>&#160;            <span class="keywordflow">if</span>(!VmaValidateMagicValue(pBlockData, it-&gt;offset + it-&gt;size))</div>
-<div class="line"><a name="l09240"></a><span class="lineno"> 9240</span>&#160;            {</div>
-<div class="line"><a name="l09241"></a><span class="lineno"> 9241</span>&#160;                VMA_ASSERT(0 &amp;&amp; <span class="stringliteral">&quot;MEMORY CORRUPTION DETECTED AFTER VALIDATED ALLOCATION!&quot;</span>);</div>
-<div class="line"><a name="l09242"></a><span class="lineno"> 9242</span>&#160;                <span class="keywordflow">return</span> VK_ERROR_VALIDATION_FAILED_EXT;</div>
-<div class="line"><a name="l09243"></a><span class="lineno"> 9243</span>&#160;            }</div>
-<div class="line"><a name="l09244"></a><span class="lineno"> 9244</span>&#160;        }</div>
-<div class="line"><a name="l09245"></a><span class="lineno"> 9245</span>&#160;    }</div>
-<div class="line"><a name="l09246"></a><span class="lineno"> 9246</span>&#160; </div>
-<div class="line"><a name="l09247"></a><span class="lineno"> 9247</span>&#160;    <span class="keywordflow">return</span> VK_SUCCESS;</div>
-<div class="line"><a name="l09248"></a><span class="lineno"> 9248</span>&#160;}</div>
-<div class="line"><a name="l09249"></a><span class="lineno"> 9249</span>&#160; </div>
-<div class="line"><a name="l09250"></a><span class="lineno"> 9250</span>&#160;<span class="keywordtype">void</span> VmaBlockMetadata_Generic::Alloc(</div>
-<div class="line"><a name="l09251"></a><span class="lineno"> 9251</span>&#160;    <span class="keyword">const</span> VmaAllocationRequest&amp; request,</div>
-<div class="line"><a name="l09252"></a><span class="lineno"> 9252</span>&#160;    VmaSuballocationType type,</div>
-<div class="line"><a name="l09253"></a><span class="lineno"> 9253</span>&#160;    VkDeviceSize allocSize,</div>
-<div class="line"><a name="l09254"></a><span class="lineno"> 9254</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> hAllocation)</div>
-<div class="line"><a name="l09255"></a><span class="lineno"> 9255</span>&#160;{</div>
-<div class="line"><a name="l09256"></a><span class="lineno"> 9256</span>&#160;    VMA_ASSERT(request.type == VmaAllocationRequestType::Normal);</div>
-<div class="line"><a name="l09257"></a><span class="lineno"> 9257</span>&#160;    VMA_ASSERT(request.item != m_Suballocations.end());</div>
-<div class="line"><a name="l09258"></a><span class="lineno"> 9258</span>&#160;    VmaSuballocation&amp; suballoc = *request.item;</div>
-<div class="line"><a name="l09259"></a><span class="lineno"> 9259</span>&#160;    <span class="comment">// Given suballocation is a free block.</span></div>
-<div class="line"><a name="l09260"></a><span class="lineno"> 9260</span>&#160;    VMA_ASSERT(suballoc.type == VMA_SUBALLOCATION_TYPE_FREE);</div>
-<div class="line"><a name="l09261"></a><span class="lineno"> 9261</span>&#160;    <span class="comment">// Given offset is inside this suballocation.</span></div>
-<div class="line"><a name="l09262"></a><span class="lineno"> 9262</span>&#160;    VMA_ASSERT(request.offset &gt;= suballoc.offset);</div>
-<div class="line"><a name="l09263"></a><span class="lineno"> 9263</span>&#160;    <span class="keyword">const</span> VkDeviceSize paddingBegin = request.offset - suballoc.offset;</div>
-<div class="line"><a name="l09264"></a><span class="lineno"> 9264</span>&#160;    VMA_ASSERT(suballoc.size &gt;= paddingBegin + allocSize);</div>
-<div class="line"><a name="l09265"></a><span class="lineno"> 9265</span>&#160;    <span class="keyword">const</span> VkDeviceSize paddingEnd = suballoc.size - paddingBegin - allocSize;</div>
-<div class="line"><a name="l09266"></a><span class="lineno"> 9266</span>&#160; </div>
-<div class="line"><a name="l09267"></a><span class="lineno"> 9267</span>&#160;    <span class="comment">// Unregister this free suballocation from m_FreeSuballocationsBySize and update</span></div>
-<div class="line"><a name="l09268"></a><span class="lineno"> 9268</span>&#160;    <span class="comment">// it to become used.</span></div>
-<div class="line"><a name="l09269"></a><span class="lineno"> 9269</span>&#160;    UnregisterFreeSuballocation(request.item);</div>
+<div class="line"><a name="l09174"></a><span class="lineno"> 9174</span>&#160;    json.WriteString(<span class="stringliteral">&quot;UsedBytes&quot;</span>);</div>
+<div class="line"><a name="l09175"></a><span class="lineno"> 9175</span>&#160;    json.WriteNumber(stat.<a class="code" href="struct_vma_stat_info.html#ab0c6c73837e5a70c749fbd4f6064895a">usedBytes</a>);</div>
+<div class="line"><a name="l09176"></a><span class="lineno"> 9176</span>&#160; </div>
+<div class="line"><a name="l09177"></a><span class="lineno"> 9177</span>&#160;    json.WriteString(<span class="stringliteral">&quot;UnusedBytes&quot;</span>);</div>
+<div class="line"><a name="l09178"></a><span class="lineno"> 9178</span>&#160;    json.WriteNumber(stat.<a class="code" href="struct_vma_stat_info.html#a1859d290aca2cd582d8dc25922092669">unusedBytes</a>);</div>
+<div class="line"><a name="l09179"></a><span class="lineno"> 9179</span>&#160; </div>
+<div class="line"><a name="l09180"></a><span class="lineno"> 9180</span>&#160;    <span class="keywordflow">if</span>(stat.<a class="code" href="struct_vma_stat_info.html#a537741e4d5cdddc1c0ab95ec650afaff">allocationCount</a> &gt; 1)</div>
+<div class="line"><a name="l09181"></a><span class="lineno"> 9181</span>&#160;    {</div>
+<div class="line"><a name="l09182"></a><span class="lineno"> 9182</span>&#160;        json.WriteString(<span class="stringliteral">&quot;AllocationSize&quot;</span>);</div>
+<div class="line"><a name="l09183"></a><span class="lineno"> 9183</span>&#160;        json.BeginObject(<span class="keyword">true</span>);</div>
+<div class="line"><a name="l09184"></a><span class="lineno"> 9184</span>&#160;        json.WriteString(<span class="stringliteral">&quot;Min&quot;</span>);</div>
+<div class="line"><a name="l09185"></a><span class="lineno"> 9185</span>&#160;        json.WriteNumber(stat.<a class="code" href="struct_vma_stat_info.html#ade8b40bd3139c04aabd2fc538a356fea">allocationSizeMin</a>);</div>
+<div class="line"><a name="l09186"></a><span class="lineno"> 9186</span>&#160;        json.WriteString(<span class="stringliteral">&quot;Avg&quot;</span>);</div>
+<div class="line"><a name="l09187"></a><span class="lineno"> 9187</span>&#160;        json.WriteNumber(stat.<a class="code" href="struct_vma_stat_info.html#a1081a039964e566c672e7a2347f9e599">allocationSizeAvg</a>);</div>
+<div class="line"><a name="l09188"></a><span class="lineno"> 9188</span>&#160;        json.WriteString(<span class="stringliteral">&quot;Max&quot;</span>);</div>
+<div class="line"><a name="l09189"></a><span class="lineno"> 9189</span>&#160;        json.WriteNumber(stat.<a class="code" href="struct_vma_stat_info.html#a17e9733a5ecd76287d4db6e66f71f50c">allocationSizeMax</a>);</div>
+<div class="line"><a name="l09190"></a><span class="lineno"> 9190</span>&#160;        json.EndObject();</div>
+<div class="line"><a name="l09191"></a><span class="lineno"> 9191</span>&#160;    }</div>
+<div class="line"><a name="l09192"></a><span class="lineno"> 9192</span>&#160; </div>
+<div class="line"><a name="l09193"></a><span class="lineno"> 9193</span>&#160;    <span class="keywordflow">if</span>(stat.<a class="code" href="struct_vma_stat_info.html#ae06129c771bfebfd6468a7f4276502a9">unusedRangeCount</a> &gt; 1)</div>
+<div class="line"><a name="l09194"></a><span class="lineno"> 9194</span>&#160;    {</div>
+<div class="line"><a name="l09195"></a><span class="lineno"> 9195</span>&#160;        json.WriteString(<span class="stringliteral">&quot;UnusedRangeSize&quot;</span>);</div>
+<div class="line"><a name="l09196"></a><span class="lineno"> 9196</span>&#160;        json.BeginObject(<span class="keyword">true</span>);</div>
+<div class="line"><a name="l09197"></a><span class="lineno"> 9197</span>&#160;        json.WriteString(<span class="stringliteral">&quot;Min&quot;</span>);</div>
+<div class="line"><a name="l09198"></a><span class="lineno"> 9198</span>&#160;        json.WriteNumber(stat.<a class="code" href="struct_vma_stat_info.html#aedeba931324f16589cd2416c0d2dd0d4">unusedRangeSizeMin</a>);</div>
+<div class="line"><a name="l09199"></a><span class="lineno"> 9199</span>&#160;        json.WriteString(<span class="stringliteral">&quot;Avg&quot;</span>);</div>
+<div class="line"><a name="l09200"></a><span class="lineno"> 9200</span>&#160;        json.WriteNumber(stat.<a class="code" href="struct_vma_stat_info.html#a2f9b3452af90c9768a30b7fb6ae194fc">unusedRangeSizeAvg</a>);</div>
+<div class="line"><a name="l09201"></a><span class="lineno"> 9201</span>&#160;        json.WriteString(<span class="stringliteral">&quot;Max&quot;</span>);</div>
+<div class="line"><a name="l09202"></a><span class="lineno"> 9202</span>&#160;        json.WriteNumber(stat.<a class="code" href="struct_vma_stat_info.html#a5ba1a2476c4d39b10f7e2f7ebbb72ac4">unusedRangeSizeMax</a>);</div>
+<div class="line"><a name="l09203"></a><span class="lineno"> 9203</span>&#160;        json.EndObject();</div>
+<div class="line"><a name="l09204"></a><span class="lineno"> 9204</span>&#160;    }</div>
+<div class="line"><a name="l09205"></a><span class="lineno"> 9205</span>&#160; </div>
+<div class="line"><a name="l09206"></a><span class="lineno"> 9206</span>&#160;    json.EndObject();</div>
+<div class="line"><a name="l09207"></a><span class="lineno"> 9207</span>&#160;}</div>
+<div class="line"><a name="l09208"></a><span class="lineno"> 9208</span>&#160; </div>
+<div class="line"><a name="l09209"></a><span class="lineno"> 9209</span>&#160;<span class="preprocessor">#endif </span><span class="comment">// #if VMA_STATS_STRING_ENABLED</span></div>
+<div class="line"><a name="l09210"></a><span class="lineno"> 9210</span>&#160; </div>
+<div class="line"><a name="l09211"></a><span class="lineno"> 9211</span>&#160;<span class="keyword">struct </span>VmaSuballocationItemSizeLess</div>
+<div class="line"><a name="l09212"></a><span class="lineno"> 9212</span>&#160;{</div>
+<div class="line"><a name="l09213"></a><span class="lineno"> 9213</span>&#160;    <span class="keywordtype">bool</span> operator()(</div>
+<div class="line"><a name="l09214"></a><span class="lineno"> 9214</span>&#160;        <span class="keyword">const</span> VmaSuballocationList::iterator lhs,</div>
+<div class="line"><a name="l09215"></a><span class="lineno"> 9215</span>&#160;        <span class="keyword">const</span> VmaSuballocationList::iterator rhs)<span class="keyword"> const</span></div>
+<div class="line"><a name="l09216"></a><span class="lineno"> 9216</span>&#160;<span class="keyword">    </span>{</div>
+<div class="line"><a name="l09217"></a><span class="lineno"> 9217</span>&#160;        <span class="keywordflow">return</span> lhs-&gt;size &lt; rhs-&gt;size;</div>
+<div class="line"><a name="l09218"></a><span class="lineno"> 9218</span>&#160;    }</div>
+<div class="line"><a name="l09219"></a><span class="lineno"> 9219</span>&#160;    <span class="keywordtype">bool</span> operator()(</div>
+<div class="line"><a name="l09220"></a><span class="lineno"> 9220</span>&#160;        <span class="keyword">const</span> VmaSuballocationList::iterator lhs,</div>
+<div class="line"><a name="l09221"></a><span class="lineno"> 9221</span>&#160;        VkDeviceSize rhsSize)<span class="keyword"> const</span></div>
+<div class="line"><a name="l09222"></a><span class="lineno"> 9222</span>&#160;<span class="keyword">    </span>{</div>
+<div class="line"><a name="l09223"></a><span class="lineno"> 9223</span>&#160;        <span class="keywordflow">return</span> lhs-&gt;size &lt; rhsSize;</div>
+<div class="line"><a name="l09224"></a><span class="lineno"> 9224</span>&#160;    }</div>
+<div class="line"><a name="l09225"></a><span class="lineno"> 9225</span>&#160;};</div>
+<div class="line"><a name="l09226"></a><span class="lineno"> 9226</span>&#160; </div>
+<div class="line"><a name="l09227"></a><span class="lineno"> 9227</span>&#160; </div>
+<div class="line"><a name="l09229"></a><span class="lineno"> 9229</span>&#160;<span class="comment">// class VmaBlockMetadata</span></div>
+<div class="line"><a name="l09230"></a><span class="lineno"> 9230</span>&#160; </div>
+<div class="line"><a name="l09231"></a><span class="lineno"> 9231</span>&#160;VmaBlockMetadata::VmaBlockMetadata(<a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator) :</div>
+<div class="line"><a name="l09232"></a><span class="lineno"> 9232</span>&#160;    m_Size(0),</div>
+<div class="line"><a name="l09233"></a><span class="lineno"> 9233</span>&#160;    m_pAllocationCallbacks(hAllocator-&gt;GetAllocationCallbacks())</div>
+<div class="line"><a name="l09234"></a><span class="lineno"> 9234</span>&#160;{</div>
+<div class="line"><a name="l09235"></a><span class="lineno"> 9235</span>&#160;}</div>
+<div class="line"><a name="l09236"></a><span class="lineno"> 9236</span>&#160; </div>
+<div class="line"><a name="l09237"></a><span class="lineno"> 9237</span>&#160;<span class="preprocessor">#if VMA_STATS_STRING_ENABLED</span></div>
+<div class="line"><a name="l09238"></a><span class="lineno"> 9238</span>&#160; </div>
+<div class="line"><a name="l09239"></a><span class="lineno"> 9239</span>&#160;<span class="keywordtype">void</span> VmaBlockMetadata::PrintDetailedMap_Begin(<span class="keyword">class</span> VmaJsonWriter&amp; json,</div>
+<div class="line"><a name="l09240"></a><span class="lineno"> 9240</span>&#160;    VkDeviceSize unusedBytes,</div>
+<div class="line"><a name="l09241"></a><span class="lineno"> 9241</span>&#160;    <span class="keywordtype">size_t</span> allocationCount,</div>
+<div class="line"><a name="l09242"></a><span class="lineno"> 9242</span>&#160;    <span class="keywordtype">size_t</span> unusedRangeCount)<span class="keyword"> const</span></div>
+<div class="line"><a name="l09243"></a><span class="lineno"> 9243</span>&#160;<span class="keyword"></span>{</div>
+<div class="line"><a name="l09244"></a><span class="lineno"> 9244</span>&#160;    json.BeginObject();</div>
+<div class="line"><a name="l09245"></a><span class="lineno"> 9245</span>&#160; </div>
+<div class="line"><a name="l09246"></a><span class="lineno"> 9246</span>&#160;    json.WriteString(<span class="stringliteral">&quot;TotalBytes&quot;</span>);</div>
+<div class="line"><a name="l09247"></a><span class="lineno"> 9247</span>&#160;    json.WriteNumber(GetSize());</div>
+<div class="line"><a name="l09248"></a><span class="lineno"> 9248</span>&#160; </div>
+<div class="line"><a name="l09249"></a><span class="lineno"> 9249</span>&#160;    json.WriteString(<span class="stringliteral">&quot;UnusedBytes&quot;</span>);</div>
+<div class="line"><a name="l09250"></a><span class="lineno"> 9250</span>&#160;    json.WriteNumber(unusedBytes);</div>
+<div class="line"><a name="l09251"></a><span class="lineno"> 9251</span>&#160; </div>
+<div class="line"><a name="l09252"></a><span class="lineno"> 9252</span>&#160;    json.WriteString(<span class="stringliteral">&quot;Allocations&quot;</span>);</div>
+<div class="line"><a name="l09253"></a><span class="lineno"> 9253</span>&#160;    json.WriteNumber((uint64_t)allocationCount);</div>
+<div class="line"><a name="l09254"></a><span class="lineno"> 9254</span>&#160; </div>
+<div class="line"><a name="l09255"></a><span class="lineno"> 9255</span>&#160;    json.WriteString(<span class="stringliteral">&quot;UnusedRanges&quot;</span>);</div>
+<div class="line"><a name="l09256"></a><span class="lineno"> 9256</span>&#160;    json.WriteNumber((uint64_t)unusedRangeCount);</div>
+<div class="line"><a name="l09257"></a><span class="lineno"> 9257</span>&#160; </div>
+<div class="line"><a name="l09258"></a><span class="lineno"> 9258</span>&#160;    json.WriteString(<span class="stringliteral">&quot;Suballocations&quot;</span>);</div>
+<div class="line"><a name="l09259"></a><span class="lineno"> 9259</span>&#160;    json.BeginArray();</div>
+<div class="line"><a name="l09260"></a><span class="lineno"> 9260</span>&#160;}</div>
+<div class="line"><a name="l09261"></a><span class="lineno"> 9261</span>&#160; </div>
+<div class="line"><a name="l09262"></a><span class="lineno"> 9262</span>&#160;<span class="keywordtype">void</span> VmaBlockMetadata::PrintDetailedMap_Allocation(<span class="keyword">class</span> VmaJsonWriter&amp; json,</div>
+<div class="line"><a name="l09263"></a><span class="lineno"> 9263</span>&#160;    VkDeviceSize offset,</div>
+<div class="line"><a name="l09264"></a><span class="lineno"> 9264</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> hAllocation)<span class="keyword"> const</span></div>
+<div class="line"><a name="l09265"></a><span class="lineno"> 9265</span>&#160;<span class="keyword"></span>{</div>
+<div class="line"><a name="l09266"></a><span class="lineno"> 9266</span>&#160;    json.BeginObject(<span class="keyword">true</span>);</div>
+<div class="line"><a name="l09267"></a><span class="lineno"> 9267</span>&#160; </div>
+<div class="line"><a name="l09268"></a><span class="lineno"> 9268</span>&#160;    json.WriteString(<span class="stringliteral">&quot;Offset&quot;</span>);</div>
+<div class="line"><a name="l09269"></a><span class="lineno"> 9269</span>&#160;    json.WriteNumber(offset);</div>
 <div class="line"><a name="l09270"></a><span class="lineno"> 9270</span>&#160; </div>
-<div class="line"><a name="l09271"></a><span class="lineno"> 9271</span>&#160;    suballoc.offset = request.offset;</div>
-<div class="line"><a name="l09272"></a><span class="lineno"> 9272</span>&#160;    suballoc.size = allocSize;</div>
-<div class="line"><a name="l09273"></a><span class="lineno"> 9273</span>&#160;    suballoc.type = type;</div>
-<div class="line"><a name="l09274"></a><span class="lineno"> 9274</span>&#160;    suballoc.hAllocation = hAllocation;</div>
+<div class="line"><a name="l09271"></a><span class="lineno"> 9271</span>&#160;    hAllocation-&gt;PrintParameters(json);</div>
+<div class="line"><a name="l09272"></a><span class="lineno"> 9272</span>&#160; </div>
+<div class="line"><a name="l09273"></a><span class="lineno"> 9273</span>&#160;    json.EndObject();</div>
+<div class="line"><a name="l09274"></a><span class="lineno"> 9274</span>&#160;}</div>
 <div class="line"><a name="l09275"></a><span class="lineno"> 9275</span>&#160; </div>
-<div class="line"><a name="l09276"></a><span class="lineno"> 9276</span>&#160;    <span class="comment">// If there are any free bytes remaining at the end, insert new free suballocation after current one.</span></div>
-<div class="line"><a name="l09277"></a><span class="lineno"> 9277</span>&#160;    <span class="keywordflow">if</span>(paddingEnd)</div>
-<div class="line"><a name="l09278"></a><span class="lineno"> 9278</span>&#160;    {</div>
-<div class="line"><a name="l09279"></a><span class="lineno"> 9279</span>&#160;        VmaSuballocation paddingSuballoc = {};</div>
-<div class="line"><a name="l09280"></a><span class="lineno"> 9280</span>&#160;        paddingSuballoc.offset = request.offset + allocSize;</div>
-<div class="line"><a name="l09281"></a><span class="lineno"> 9281</span>&#160;        paddingSuballoc.size = paddingEnd;</div>
-<div class="line"><a name="l09282"></a><span class="lineno"> 9282</span>&#160;        paddingSuballoc.type = VMA_SUBALLOCATION_TYPE_FREE;</div>
-<div class="line"><a name="l09283"></a><span class="lineno"> 9283</span>&#160;        VmaSuballocationList::iterator next = request.item;</div>
-<div class="line"><a name="l09284"></a><span class="lineno"> 9284</span>&#160;        ++next;</div>
-<div class="line"><a name="l09285"></a><span class="lineno"> 9285</span>&#160;        <span class="keyword">const</span> VmaSuballocationList::iterator paddingEndItem =</div>
-<div class="line"><a name="l09286"></a><span class="lineno"> 9286</span>&#160;            m_Suballocations.insert(next, paddingSuballoc);</div>
-<div class="line"><a name="l09287"></a><span class="lineno"> 9287</span>&#160;        RegisterFreeSuballocation(paddingEndItem);</div>
-<div class="line"><a name="l09288"></a><span class="lineno"> 9288</span>&#160;    }</div>
-<div class="line"><a name="l09289"></a><span class="lineno"> 9289</span>&#160; </div>
-<div class="line"><a name="l09290"></a><span class="lineno"> 9290</span>&#160;    <span class="comment">// If there are any free bytes remaining at the beginning, insert new free suballocation before current one.</span></div>
-<div class="line"><a name="l09291"></a><span class="lineno"> 9291</span>&#160;    <span class="keywordflow">if</span>(paddingBegin)</div>
-<div class="line"><a name="l09292"></a><span class="lineno"> 9292</span>&#160;    {</div>
-<div class="line"><a name="l09293"></a><span class="lineno"> 9293</span>&#160;        VmaSuballocation paddingSuballoc = {};</div>
-<div class="line"><a name="l09294"></a><span class="lineno"> 9294</span>&#160;        paddingSuballoc.offset = request.offset - paddingBegin;</div>
-<div class="line"><a name="l09295"></a><span class="lineno"> 9295</span>&#160;        paddingSuballoc.size = paddingBegin;</div>
-<div class="line"><a name="l09296"></a><span class="lineno"> 9296</span>&#160;        paddingSuballoc.type = VMA_SUBALLOCATION_TYPE_FREE;</div>
-<div class="line"><a name="l09297"></a><span class="lineno"> 9297</span>&#160;        <span class="keyword">const</span> VmaSuballocationList::iterator paddingBeginItem =</div>
-<div class="line"><a name="l09298"></a><span class="lineno"> 9298</span>&#160;            m_Suballocations.insert(request.item, paddingSuballoc);</div>
-<div class="line"><a name="l09299"></a><span class="lineno"> 9299</span>&#160;        RegisterFreeSuballocation(paddingBeginItem);</div>
-<div class="line"><a name="l09300"></a><span class="lineno"> 9300</span>&#160;    }</div>
+<div class="line"><a name="l09276"></a><span class="lineno"> 9276</span>&#160;<span class="keywordtype">void</span> VmaBlockMetadata::PrintDetailedMap_UnusedRange(<span class="keyword">class</span> VmaJsonWriter&amp; json,</div>
+<div class="line"><a name="l09277"></a><span class="lineno"> 9277</span>&#160;    VkDeviceSize offset,</div>
+<div class="line"><a name="l09278"></a><span class="lineno"> 9278</span>&#160;    VkDeviceSize size)<span class="keyword"> const</span></div>
+<div class="line"><a name="l09279"></a><span class="lineno"> 9279</span>&#160;<span class="keyword"></span>{</div>
+<div class="line"><a name="l09280"></a><span class="lineno"> 9280</span>&#160;    json.BeginObject(<span class="keyword">true</span>);</div>
+<div class="line"><a name="l09281"></a><span class="lineno"> 9281</span>&#160; </div>
+<div class="line"><a name="l09282"></a><span class="lineno"> 9282</span>&#160;    json.WriteString(<span class="stringliteral">&quot;Offset&quot;</span>);</div>
+<div class="line"><a name="l09283"></a><span class="lineno"> 9283</span>&#160;    json.WriteNumber(offset);</div>
+<div class="line"><a name="l09284"></a><span class="lineno"> 9284</span>&#160; </div>
+<div class="line"><a name="l09285"></a><span class="lineno"> 9285</span>&#160;    json.WriteString(<span class="stringliteral">&quot;Type&quot;</span>);</div>
+<div class="line"><a name="l09286"></a><span class="lineno"> 9286</span>&#160;    json.WriteString(VMA_SUBALLOCATION_TYPE_NAMES[VMA_SUBALLOCATION_TYPE_FREE]);</div>
+<div class="line"><a name="l09287"></a><span class="lineno"> 9287</span>&#160; </div>
+<div class="line"><a name="l09288"></a><span class="lineno"> 9288</span>&#160;    json.WriteString(<span class="stringliteral">&quot;Size&quot;</span>);</div>
+<div class="line"><a name="l09289"></a><span class="lineno"> 9289</span>&#160;    json.WriteNumber(size);</div>
+<div class="line"><a name="l09290"></a><span class="lineno"> 9290</span>&#160; </div>
+<div class="line"><a name="l09291"></a><span class="lineno"> 9291</span>&#160;    json.EndObject();</div>
+<div class="line"><a name="l09292"></a><span class="lineno"> 9292</span>&#160;}</div>
+<div class="line"><a name="l09293"></a><span class="lineno"> 9293</span>&#160; </div>
+<div class="line"><a name="l09294"></a><span class="lineno"> 9294</span>&#160;<span class="keywordtype">void</span> VmaBlockMetadata::PrintDetailedMap_End(<span class="keyword">class</span> VmaJsonWriter&amp; json)<span class="keyword"> const</span></div>
+<div class="line"><a name="l09295"></a><span class="lineno"> 9295</span>&#160;<span class="keyword"></span>{</div>
+<div class="line"><a name="l09296"></a><span class="lineno"> 9296</span>&#160;    json.EndArray();</div>
+<div class="line"><a name="l09297"></a><span class="lineno"> 9297</span>&#160;    json.EndObject();</div>
+<div class="line"><a name="l09298"></a><span class="lineno"> 9298</span>&#160;}</div>
+<div class="line"><a name="l09299"></a><span class="lineno"> 9299</span>&#160; </div>
+<div class="line"><a name="l09300"></a><span class="lineno"> 9300</span>&#160;<span class="preprocessor">#endif </span><span class="comment">// #if VMA_STATS_STRING_ENABLED</span></div>
 <div class="line"><a name="l09301"></a><span class="lineno"> 9301</span>&#160; </div>
-<div class="line"><a name="l09302"></a><span class="lineno"> 9302</span>&#160;    <span class="comment">// Update totals.</span></div>
-<div class="line"><a name="l09303"></a><span class="lineno"> 9303</span>&#160;    m_FreeCount = m_FreeCount - 1;</div>
-<div class="line"><a name="l09304"></a><span class="lineno"> 9304</span>&#160;    <span class="keywordflow">if</span>(paddingBegin &gt; 0)</div>
-<div class="line"><a name="l09305"></a><span class="lineno"> 9305</span>&#160;    {</div>
-<div class="line"><a name="l09306"></a><span class="lineno"> 9306</span>&#160;        ++m_FreeCount;</div>
-<div class="line"><a name="l09307"></a><span class="lineno"> 9307</span>&#160;    }</div>
-<div class="line"><a name="l09308"></a><span class="lineno"> 9308</span>&#160;    <span class="keywordflow">if</span>(paddingEnd &gt; 0)</div>
-<div class="line"><a name="l09309"></a><span class="lineno"> 9309</span>&#160;    {</div>
-<div class="line"><a name="l09310"></a><span class="lineno"> 9310</span>&#160;        ++m_FreeCount;</div>
-<div class="line"><a name="l09311"></a><span class="lineno"> 9311</span>&#160;    }</div>
-<div class="line"><a name="l09312"></a><span class="lineno"> 9312</span>&#160;    m_SumFreeSize -= allocSize;</div>
-<div class="line"><a name="l09313"></a><span class="lineno"> 9313</span>&#160;}</div>
-<div class="line"><a name="l09314"></a><span class="lineno"> 9314</span>&#160; </div>
-<div class="line"><a name="l09315"></a><span class="lineno"> 9315</span>&#160;<span class="keywordtype">void</span> VmaBlockMetadata_Generic::Free(<span class="keyword">const</span> <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation)</div>
-<div class="line"><a name="l09316"></a><span class="lineno"> 9316</span>&#160;{</div>
-<div class="line"><a name="l09317"></a><span class="lineno"> 9317</span>&#160;    <span class="keywordflow">for</span>(VmaSuballocationList::iterator suballocItem = m_Suballocations.begin();</div>
-<div class="line"><a name="l09318"></a><span class="lineno"> 9318</span>&#160;        suballocItem != m_Suballocations.end();</div>
-<div class="line"><a name="l09319"></a><span class="lineno"> 9319</span>&#160;        ++suballocItem)</div>
-<div class="line"><a name="l09320"></a><span class="lineno"> 9320</span>&#160;    {</div>
-<div class="line"><a name="l09321"></a><span class="lineno"> 9321</span>&#160;        VmaSuballocation&amp; suballoc = *suballocItem;</div>
-<div class="line"><a name="l09322"></a><span class="lineno"> 9322</span>&#160;        <span class="keywordflow">if</span>(suballoc.hAllocation == allocation)</div>
-<div class="line"><a name="l09323"></a><span class="lineno"> 9323</span>&#160;        {</div>
-<div class="line"><a name="l09324"></a><span class="lineno"> 9324</span>&#160;            FreeSuballocation(suballocItem);</div>
-<div class="line"><a name="l09325"></a><span class="lineno"> 9325</span>&#160;            VMA_HEAVY_ASSERT(Validate());</div>
-<div class="line"><a name="l09326"></a><span class="lineno"> 9326</span>&#160;            <span class="keywordflow">return</span>;</div>
-<div class="line"><a name="l09327"></a><span class="lineno"> 9327</span>&#160;        }</div>
-<div class="line"><a name="l09328"></a><span class="lineno"> 9328</span>&#160;    }</div>
-<div class="line"><a name="l09329"></a><span class="lineno"> 9329</span>&#160;    VMA_ASSERT(0 &amp;&amp; <span class="stringliteral">&quot;Not found!&quot;</span>);</div>
-<div class="line"><a name="l09330"></a><span class="lineno"> 9330</span>&#160;}</div>
-<div class="line"><a name="l09331"></a><span class="lineno"> 9331</span>&#160; </div>
-<div class="line"><a name="l09332"></a><span class="lineno"> 9332</span>&#160;<span class="keywordtype">void</span> VmaBlockMetadata_Generic::FreeAtOffset(VkDeviceSize offset)</div>
-<div class="line"><a name="l09333"></a><span class="lineno"> 9333</span>&#160;{</div>
-<div class="line"><a name="l09334"></a><span class="lineno"> 9334</span>&#160;    <span class="keywordflow">for</span>(VmaSuballocationList::iterator suballocItem = m_Suballocations.begin();</div>
-<div class="line"><a name="l09335"></a><span class="lineno"> 9335</span>&#160;        suballocItem != m_Suballocations.end();</div>
-<div class="line"><a name="l09336"></a><span class="lineno"> 9336</span>&#160;        ++suballocItem)</div>
-<div class="line"><a name="l09337"></a><span class="lineno"> 9337</span>&#160;    {</div>
-<div class="line"><a name="l09338"></a><span class="lineno"> 9338</span>&#160;        VmaSuballocation&amp; suballoc = *suballocItem;</div>
-<div class="line"><a name="l09339"></a><span class="lineno"> 9339</span>&#160;        <span class="keywordflow">if</span>(suballoc.offset == offset)</div>
-<div class="line"><a name="l09340"></a><span class="lineno"> 9340</span>&#160;        {</div>
-<div class="line"><a name="l09341"></a><span class="lineno"> 9341</span>&#160;            FreeSuballocation(suballocItem);</div>
-<div class="line"><a name="l09342"></a><span class="lineno"> 9342</span>&#160;            <span class="keywordflow">return</span>;</div>
-<div class="line"><a name="l09343"></a><span class="lineno"> 9343</span>&#160;        }</div>
-<div class="line"><a name="l09344"></a><span class="lineno"> 9344</span>&#160;    }</div>
-<div class="line"><a name="l09345"></a><span class="lineno"> 9345</span>&#160;    VMA_ASSERT(0 &amp;&amp; <span class="stringliteral">&quot;Not found!&quot;</span>);</div>
-<div class="line"><a name="l09346"></a><span class="lineno"> 9346</span>&#160;}</div>
-<div class="line"><a name="l09347"></a><span class="lineno"> 9347</span>&#160; </div>
-<div class="line"><a name="l09348"></a><span class="lineno"> 9348</span>&#160;<span class="keywordtype">bool</span> VmaBlockMetadata_Generic::ValidateFreeSuballocationList()<span class="keyword"> const</span></div>
-<div class="line"><a name="l09349"></a><span class="lineno"> 9349</span>&#160;<span class="keyword"></span>{</div>
-<div class="line"><a name="l09350"></a><span class="lineno"> 9350</span>&#160;    VkDeviceSize lastSize = 0;</div>
-<div class="line"><a name="l09351"></a><span class="lineno"> 9351</span>&#160;    <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> i = 0, count = m_FreeSuballocationsBySize.size(); i &lt; count; ++i)</div>
-<div class="line"><a name="l09352"></a><span class="lineno"> 9352</span>&#160;    {</div>
-<div class="line"><a name="l09353"></a><span class="lineno"> 9353</span>&#160;        <span class="keyword">const</span> VmaSuballocationList::iterator it = m_FreeSuballocationsBySize[i];</div>
-<div class="line"><a name="l09354"></a><span class="lineno"> 9354</span>&#160; </div>
-<div class="line"><a name="l09355"></a><span class="lineno"> 9355</span>&#160;        VMA_VALIDATE(it-&gt;type == VMA_SUBALLOCATION_TYPE_FREE);</div>
-<div class="line"><a name="l09356"></a><span class="lineno"> 9356</span>&#160;        VMA_VALIDATE(it-&gt;size &gt;= VMA_MIN_FREE_SUBALLOCATION_SIZE_TO_REGISTER);</div>
-<div class="line"><a name="l09357"></a><span class="lineno"> 9357</span>&#160;        VMA_VALIDATE(it-&gt;size &gt;= lastSize);</div>
-<div class="line"><a name="l09358"></a><span class="lineno"> 9358</span>&#160;        lastSize = it-&gt;size;</div>
-<div class="line"><a name="l09359"></a><span class="lineno"> 9359</span>&#160;    }</div>
-<div class="line"><a name="l09360"></a><span class="lineno"> 9360</span>&#160;    <span class="keywordflow">return</span> <span class="keyword">true</span>;</div>
-<div class="line"><a name="l09361"></a><span class="lineno"> 9361</span>&#160;}</div>
+<div class="line"><a name="l09303"></a><span class="lineno"> 9303</span>&#160;<span class="comment">// class VmaBlockMetadata_Generic</span></div>
+<div class="line"><a name="l09304"></a><span class="lineno"> 9304</span>&#160; </div>
+<div class="line"><a name="l09305"></a><span class="lineno"> 9305</span>&#160;VmaBlockMetadata_Generic::VmaBlockMetadata_Generic(<a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator) :</div>
+<div class="line"><a name="l09306"></a><span class="lineno"> 9306</span>&#160;    VmaBlockMetadata(hAllocator),</div>
+<div class="line"><a name="l09307"></a><span class="lineno"> 9307</span>&#160;    m_FreeCount(0),</div>
+<div class="line"><a name="l09308"></a><span class="lineno"> 9308</span>&#160;    m_SumFreeSize(0),</div>
+<div class="line"><a name="l09309"></a><span class="lineno"> 9309</span>&#160;    m_Suballocations(VmaStlAllocator&lt;VmaSuballocation&gt;(hAllocator-&gt;GetAllocationCallbacks())),</div>
+<div class="line"><a name="l09310"></a><span class="lineno"> 9310</span>&#160;    m_FreeSuballocationsBySize(VmaStlAllocator&lt;VmaSuballocationList::iterator&gt;(hAllocator-&gt;GetAllocationCallbacks()))</div>
+<div class="line"><a name="l09311"></a><span class="lineno"> 9311</span>&#160;{</div>
+<div class="line"><a name="l09312"></a><span class="lineno"> 9312</span>&#160;}</div>
+<div class="line"><a name="l09313"></a><span class="lineno"> 9313</span>&#160; </div>
+<div class="line"><a name="l09314"></a><span class="lineno"> 9314</span>&#160;VmaBlockMetadata_Generic::~VmaBlockMetadata_Generic()</div>
+<div class="line"><a name="l09315"></a><span class="lineno"> 9315</span>&#160;{</div>
+<div class="line"><a name="l09316"></a><span class="lineno"> 9316</span>&#160;}</div>
+<div class="line"><a name="l09317"></a><span class="lineno"> 9317</span>&#160; </div>
+<div class="line"><a name="l09318"></a><span class="lineno"> 9318</span>&#160;<span class="keywordtype">void</span> VmaBlockMetadata_Generic::Init(VkDeviceSize size)</div>
+<div class="line"><a name="l09319"></a><span class="lineno"> 9319</span>&#160;{</div>
+<div class="line"><a name="l09320"></a><span class="lineno"> 9320</span>&#160;    VmaBlockMetadata::Init(size);</div>
+<div class="line"><a name="l09321"></a><span class="lineno"> 9321</span>&#160; </div>
+<div class="line"><a name="l09322"></a><span class="lineno"> 9322</span>&#160;    m_FreeCount = 1;</div>
+<div class="line"><a name="l09323"></a><span class="lineno"> 9323</span>&#160;    m_SumFreeSize = size;</div>
+<div class="line"><a name="l09324"></a><span class="lineno"> 9324</span>&#160; </div>
+<div class="line"><a name="l09325"></a><span class="lineno"> 9325</span>&#160;    VmaSuballocation suballoc = {};</div>
+<div class="line"><a name="l09326"></a><span class="lineno"> 9326</span>&#160;    suballoc.offset = 0;</div>
+<div class="line"><a name="l09327"></a><span class="lineno"> 9327</span>&#160;    suballoc.size = size;</div>
+<div class="line"><a name="l09328"></a><span class="lineno"> 9328</span>&#160;    suballoc.type = VMA_SUBALLOCATION_TYPE_FREE;</div>
+<div class="line"><a name="l09329"></a><span class="lineno"> 9329</span>&#160;    suballoc.hAllocation = VK_NULL_HANDLE;</div>
+<div class="line"><a name="l09330"></a><span class="lineno"> 9330</span>&#160; </div>
+<div class="line"><a name="l09331"></a><span class="lineno"> 9331</span>&#160;    VMA_ASSERT(size &gt; VMA_MIN_FREE_SUBALLOCATION_SIZE_TO_REGISTER);</div>
+<div class="line"><a name="l09332"></a><span class="lineno"> 9332</span>&#160;    m_Suballocations.push_back(suballoc);</div>
+<div class="line"><a name="l09333"></a><span class="lineno"> 9333</span>&#160;    VmaSuballocationList::iterator suballocItem = m_Suballocations.end();</div>
+<div class="line"><a name="l09334"></a><span class="lineno"> 9334</span>&#160;    --suballocItem;</div>
+<div class="line"><a name="l09335"></a><span class="lineno"> 9335</span>&#160;    m_FreeSuballocationsBySize.push_back(suballocItem);</div>
+<div class="line"><a name="l09336"></a><span class="lineno"> 9336</span>&#160;}</div>
+<div class="line"><a name="l09337"></a><span class="lineno"> 9337</span>&#160; </div>
+<div class="line"><a name="l09338"></a><span class="lineno"> 9338</span>&#160;<span class="keywordtype">bool</span> VmaBlockMetadata_Generic::Validate()<span class="keyword"> const</span></div>
+<div class="line"><a name="l09339"></a><span class="lineno"> 9339</span>&#160;<span class="keyword"></span>{</div>
+<div class="line"><a name="l09340"></a><span class="lineno"> 9340</span>&#160;    VMA_VALIDATE(!m_Suballocations.empty());</div>
+<div class="line"><a name="l09341"></a><span class="lineno"> 9341</span>&#160; </div>
+<div class="line"><a name="l09342"></a><span class="lineno"> 9342</span>&#160;    <span class="comment">// Expected offset of new suballocation as calculated from previous ones.</span></div>
+<div class="line"><a name="l09343"></a><span class="lineno"> 9343</span>&#160;    VkDeviceSize calculatedOffset = 0;</div>
+<div class="line"><a name="l09344"></a><span class="lineno"> 9344</span>&#160;    <span class="comment">// Expected number of free suballocations as calculated from traversing their list.</span></div>
+<div class="line"><a name="l09345"></a><span class="lineno"> 9345</span>&#160;    uint32_t calculatedFreeCount = 0;</div>
+<div class="line"><a name="l09346"></a><span class="lineno"> 9346</span>&#160;    <span class="comment">// Expected sum size of free suballocations as calculated from traversing their list.</span></div>
+<div class="line"><a name="l09347"></a><span class="lineno"> 9347</span>&#160;    VkDeviceSize calculatedSumFreeSize = 0;</div>
+<div class="line"><a name="l09348"></a><span class="lineno"> 9348</span>&#160;    <span class="comment">// Expected number of free suballocations that should be registered in</span></div>
+<div class="line"><a name="l09349"></a><span class="lineno"> 9349</span>&#160;    <span class="comment">// m_FreeSuballocationsBySize calculated from traversing their list.</span></div>
+<div class="line"><a name="l09350"></a><span class="lineno"> 9350</span>&#160;    <span class="keywordtype">size_t</span> freeSuballocationsToRegister = 0;</div>
+<div class="line"><a name="l09351"></a><span class="lineno"> 9351</span>&#160;    <span class="comment">// True if previous visited suballocation was free.</span></div>
+<div class="line"><a name="l09352"></a><span class="lineno"> 9352</span>&#160;    <span class="keywordtype">bool</span> prevFree = <span class="keyword">false</span>;</div>
+<div class="line"><a name="l09353"></a><span class="lineno"> 9353</span>&#160; </div>
+<div class="line"><a name="l09354"></a><span class="lineno"> 9354</span>&#160;    <span class="keywordflow">for</span>(VmaSuballocationList::const_iterator suballocItem = m_Suballocations.cbegin();</div>
+<div class="line"><a name="l09355"></a><span class="lineno"> 9355</span>&#160;        suballocItem != m_Suballocations.cend();</div>
+<div class="line"><a name="l09356"></a><span class="lineno"> 9356</span>&#160;        ++suballocItem)</div>
+<div class="line"><a name="l09357"></a><span class="lineno"> 9357</span>&#160;    {</div>
+<div class="line"><a name="l09358"></a><span class="lineno"> 9358</span>&#160;        <span class="keyword">const</span> VmaSuballocation&amp; subAlloc = *suballocItem;</div>
+<div class="line"><a name="l09359"></a><span class="lineno"> 9359</span>&#160; </div>
+<div class="line"><a name="l09360"></a><span class="lineno"> 9360</span>&#160;        <span class="comment">// Actual offset of this suballocation doesn&#39;t match expected one.</span></div>
+<div class="line"><a name="l09361"></a><span class="lineno"> 9361</span>&#160;        VMA_VALIDATE(subAlloc.offset == calculatedOffset);</div>
 <div class="line"><a name="l09362"></a><span class="lineno"> 9362</span>&#160; </div>
-<div class="line"><a name="l09363"></a><span class="lineno"> 9363</span>&#160;<span class="keywordtype">bool</span> VmaBlockMetadata_Generic::CheckAllocation(</div>
-<div class="line"><a name="l09364"></a><span class="lineno"> 9364</span>&#160;    uint32_t currentFrameIndex,</div>
-<div class="line"><a name="l09365"></a><span class="lineno"> 9365</span>&#160;    uint32_t frameInUseCount,</div>
-<div class="line"><a name="l09366"></a><span class="lineno"> 9366</span>&#160;    VkDeviceSize bufferImageGranularity,</div>
-<div class="line"><a name="l09367"></a><span class="lineno"> 9367</span>&#160;    VkDeviceSize allocSize,</div>
-<div class="line"><a name="l09368"></a><span class="lineno"> 9368</span>&#160;    VkDeviceSize allocAlignment,</div>
-<div class="line"><a name="l09369"></a><span class="lineno"> 9369</span>&#160;    VmaSuballocationType allocType,</div>
-<div class="line"><a name="l09370"></a><span class="lineno"> 9370</span>&#160;    VmaSuballocationList::const_iterator suballocItem,</div>
-<div class="line"><a name="l09371"></a><span class="lineno"> 9371</span>&#160;    <span class="keywordtype">bool</span> canMakeOtherLost,</div>
-<div class="line"><a name="l09372"></a><span class="lineno"> 9372</span>&#160;    VkDeviceSize* pOffset,</div>
-<div class="line"><a name="l09373"></a><span class="lineno"> 9373</span>&#160;    <span class="keywordtype">size_t</span>* itemsToMakeLostCount,</div>
-<div class="line"><a name="l09374"></a><span class="lineno"> 9374</span>&#160;    VkDeviceSize* pSumFreeSize,</div>
-<div class="line"><a name="l09375"></a><span class="lineno"> 9375</span>&#160;    VkDeviceSize* pSumItemSize)<span class="keyword"> const</span></div>
-<div class="line"><a name="l09376"></a><span class="lineno"> 9376</span>&#160;<span class="keyword"></span>{</div>
-<div class="line"><a name="l09377"></a><span class="lineno"> 9377</span>&#160;    VMA_ASSERT(allocSize &gt; 0);</div>
-<div class="line"><a name="l09378"></a><span class="lineno"> 9378</span>&#160;    VMA_ASSERT(allocType != VMA_SUBALLOCATION_TYPE_FREE);</div>
-<div class="line"><a name="l09379"></a><span class="lineno"> 9379</span>&#160;    VMA_ASSERT(suballocItem != m_Suballocations.cend());</div>
-<div class="line"><a name="l09380"></a><span class="lineno"> 9380</span>&#160;    VMA_ASSERT(pOffset != VMA_NULL);</div>
-<div class="line"><a name="l09381"></a><span class="lineno"> 9381</span>&#160;    </div>
-<div class="line"><a name="l09382"></a><span class="lineno"> 9382</span>&#160;    *itemsToMakeLostCount = 0;</div>
-<div class="line"><a name="l09383"></a><span class="lineno"> 9383</span>&#160;    *pSumFreeSize = 0;</div>
-<div class="line"><a name="l09384"></a><span class="lineno"> 9384</span>&#160;    *pSumItemSize = 0;</div>
+<div class="line"><a name="l09363"></a><span class="lineno"> 9363</span>&#160;        <span class="keyword">const</span> <span class="keywordtype">bool</span> currFree = (subAlloc.type == VMA_SUBALLOCATION_TYPE_FREE);</div>
+<div class="line"><a name="l09364"></a><span class="lineno"> 9364</span>&#160;        <span class="comment">// Two adjacent free suballocations are invalid. They should be merged.</span></div>
+<div class="line"><a name="l09365"></a><span class="lineno"> 9365</span>&#160;        VMA_VALIDATE(!prevFree || !currFree);</div>
+<div class="line"><a name="l09366"></a><span class="lineno"> 9366</span>&#160; </div>
+<div class="line"><a name="l09367"></a><span class="lineno"> 9367</span>&#160;        VMA_VALIDATE(currFree == (subAlloc.hAllocation == VK_NULL_HANDLE));</div>
+<div class="line"><a name="l09368"></a><span class="lineno"> 9368</span>&#160; </div>
+<div class="line"><a name="l09369"></a><span class="lineno"> 9369</span>&#160;        <span class="keywordflow">if</span>(currFree)</div>
+<div class="line"><a name="l09370"></a><span class="lineno"> 9370</span>&#160;        {</div>
+<div class="line"><a name="l09371"></a><span class="lineno"> 9371</span>&#160;            calculatedSumFreeSize += subAlloc.size;</div>
+<div class="line"><a name="l09372"></a><span class="lineno"> 9372</span>&#160;            ++calculatedFreeCount;</div>
+<div class="line"><a name="l09373"></a><span class="lineno"> 9373</span>&#160;            <span class="keywordflow">if</span>(subAlloc.size &gt;= VMA_MIN_FREE_SUBALLOCATION_SIZE_TO_REGISTER)</div>
+<div class="line"><a name="l09374"></a><span class="lineno"> 9374</span>&#160;            {</div>
+<div class="line"><a name="l09375"></a><span class="lineno"> 9375</span>&#160;                ++freeSuballocationsToRegister;</div>
+<div class="line"><a name="l09376"></a><span class="lineno"> 9376</span>&#160;            }</div>
+<div class="line"><a name="l09377"></a><span class="lineno"> 9377</span>&#160; </div>
+<div class="line"><a name="l09378"></a><span class="lineno"> 9378</span>&#160;            <span class="comment">// Margin required between allocations - every free space must be at least that large.</span></div>
+<div class="line"><a name="l09379"></a><span class="lineno"> 9379</span>&#160;            VMA_VALIDATE(subAlloc.size &gt;= VMA_DEBUG_MARGIN);</div>
+<div class="line"><a name="l09380"></a><span class="lineno"> 9380</span>&#160;        }</div>
+<div class="line"><a name="l09381"></a><span class="lineno"> 9381</span>&#160;        <span class="keywordflow">else</span></div>
+<div class="line"><a name="l09382"></a><span class="lineno"> 9382</span>&#160;        {</div>
+<div class="line"><a name="l09383"></a><span class="lineno"> 9383</span>&#160;            VMA_VALIDATE(subAlloc.hAllocation-&gt;GetOffset() == subAlloc.offset);</div>
+<div class="line"><a name="l09384"></a><span class="lineno"> 9384</span>&#160;            VMA_VALIDATE(subAlloc.hAllocation-&gt;GetSize() == subAlloc.size);</div>
 <div class="line"><a name="l09385"></a><span class="lineno"> 9385</span>&#160; </div>
-<div class="line"><a name="l09386"></a><span class="lineno"> 9386</span>&#160;    <span class="keywordflow">if</span>(canMakeOtherLost)</div>
-<div class="line"><a name="l09387"></a><span class="lineno"> 9387</span>&#160;    {</div>
-<div class="line"><a name="l09388"></a><span class="lineno"> 9388</span>&#160;        <span class="keywordflow">if</span>(suballocItem-&gt;type == VMA_SUBALLOCATION_TYPE_FREE)</div>
-<div class="line"><a name="l09389"></a><span class="lineno"> 9389</span>&#160;        {</div>
-<div class="line"><a name="l09390"></a><span class="lineno"> 9390</span>&#160;            *pSumFreeSize = suballocItem-&gt;size;</div>
-<div class="line"><a name="l09391"></a><span class="lineno"> 9391</span>&#160;        }</div>
-<div class="line"><a name="l09392"></a><span class="lineno"> 9392</span>&#160;        <span class="keywordflow">else</span></div>
-<div class="line"><a name="l09393"></a><span class="lineno"> 9393</span>&#160;        {</div>
-<div class="line"><a name="l09394"></a><span class="lineno"> 9394</span>&#160;            <span class="keywordflow">if</span>(suballocItem-&gt;hAllocation-&gt;CanBecomeLost() &amp;&amp;</div>
-<div class="line"><a name="l09395"></a><span class="lineno"> 9395</span>&#160;                suballocItem-&gt;hAllocation-&gt;GetLastUseFrameIndex() + frameInUseCount &lt; currentFrameIndex)</div>
-<div class="line"><a name="l09396"></a><span class="lineno"> 9396</span>&#160;            {</div>
-<div class="line"><a name="l09397"></a><span class="lineno"> 9397</span>&#160;                ++*itemsToMakeLostCount;</div>
-<div class="line"><a name="l09398"></a><span class="lineno"> 9398</span>&#160;                *pSumItemSize = suballocItem-&gt;size;</div>
-<div class="line"><a name="l09399"></a><span class="lineno"> 9399</span>&#160;            }</div>
-<div class="line"><a name="l09400"></a><span class="lineno"> 9400</span>&#160;            <span class="keywordflow">else</span></div>
-<div class="line"><a name="l09401"></a><span class="lineno"> 9401</span>&#160;            {</div>
-<div class="line"><a name="l09402"></a><span class="lineno"> 9402</span>&#160;                <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
-<div class="line"><a name="l09403"></a><span class="lineno"> 9403</span>&#160;            }</div>
-<div class="line"><a name="l09404"></a><span class="lineno"> 9404</span>&#160;        }</div>
-<div class="line"><a name="l09405"></a><span class="lineno"> 9405</span>&#160; </div>
-<div class="line"><a name="l09406"></a><span class="lineno"> 9406</span>&#160;        <span class="comment">// Remaining size is too small for this request: Early return.</span></div>
-<div class="line"><a name="l09407"></a><span class="lineno"> 9407</span>&#160;        <span class="keywordflow">if</span>(GetSize() - suballocItem-&gt;offset &lt; allocSize)</div>
-<div class="line"><a name="l09408"></a><span class="lineno"> 9408</span>&#160;        {</div>
-<div class="line"><a name="l09409"></a><span class="lineno"> 9409</span>&#160;            <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
-<div class="line"><a name="l09410"></a><span class="lineno"> 9410</span>&#160;        }</div>
-<div class="line"><a name="l09411"></a><span class="lineno"> 9411</span>&#160; </div>
-<div class="line"><a name="l09412"></a><span class="lineno"> 9412</span>&#160;        <span class="comment">// Start from offset equal to beginning of this suballocation.</span></div>
-<div class="line"><a name="l09413"></a><span class="lineno"> 9413</span>&#160;        *pOffset = suballocItem-&gt;offset;</div>
-<div class="line"><a name="l09414"></a><span class="lineno"> 9414</span>&#160;    </div>
-<div class="line"><a name="l09415"></a><span class="lineno"> 9415</span>&#160;        <span class="comment">// Apply VMA_DEBUG_MARGIN at the beginning.</span></div>
-<div class="line"><a name="l09416"></a><span class="lineno"> 9416</span>&#160;        <span class="keywordflow">if</span>(VMA_DEBUG_MARGIN &gt; 0)</div>
-<div class="line"><a name="l09417"></a><span class="lineno"> 9417</span>&#160;        {</div>
-<div class="line"><a name="l09418"></a><span class="lineno"> 9418</span>&#160;            *pOffset += VMA_DEBUG_MARGIN;</div>
-<div class="line"><a name="l09419"></a><span class="lineno"> 9419</span>&#160;        }</div>
-<div class="line"><a name="l09420"></a><span class="lineno"> 9420</span>&#160;    </div>
-<div class="line"><a name="l09421"></a><span class="lineno"> 9421</span>&#160;        <span class="comment">// Apply alignment.</span></div>
-<div class="line"><a name="l09422"></a><span class="lineno"> 9422</span>&#160;        *pOffset = VmaAlignUp(*pOffset, allocAlignment);</div>
-<div class="line"><a name="l09423"></a><span class="lineno"> 9423</span>&#160; </div>
-<div class="line"><a name="l09424"></a><span class="lineno"> 9424</span>&#160;        <span class="comment">// Check previous suballocations for BufferImageGranularity conflicts.</span></div>
-<div class="line"><a name="l09425"></a><span class="lineno"> 9425</span>&#160;        <span class="comment">// Make bigger alignment if necessary.</span></div>
-<div class="line"><a name="l09426"></a><span class="lineno"> 9426</span>&#160;        <span class="keywordflow">if</span>(bufferImageGranularity &gt; 1)</div>
-<div class="line"><a name="l09427"></a><span class="lineno"> 9427</span>&#160;        {</div>
-<div class="line"><a name="l09428"></a><span class="lineno"> 9428</span>&#160;            <span class="keywordtype">bool</span> bufferImageGranularityConflict = <span class="keyword">false</span>;</div>
-<div class="line"><a name="l09429"></a><span class="lineno"> 9429</span>&#160;            VmaSuballocationList::const_iterator prevSuballocItem = suballocItem;</div>
-<div class="line"><a name="l09430"></a><span class="lineno"> 9430</span>&#160;            <span class="keywordflow">while</span>(prevSuballocItem != m_Suballocations.cbegin())</div>
-<div class="line"><a name="l09431"></a><span class="lineno"> 9431</span>&#160;            {</div>
-<div class="line"><a name="l09432"></a><span class="lineno"> 9432</span>&#160;                --prevSuballocItem;</div>
-<div class="line"><a name="l09433"></a><span class="lineno"> 9433</span>&#160;                <span class="keyword">const</span> VmaSuballocation&amp; prevSuballoc = *prevSuballocItem;</div>
-<div class="line"><a name="l09434"></a><span class="lineno"> 9434</span>&#160;                <span class="keywordflow">if</span>(VmaBlocksOnSamePage(prevSuballoc.offset, prevSuballoc.size, *pOffset, bufferImageGranularity))</div>
-<div class="line"><a name="l09435"></a><span class="lineno"> 9435</span>&#160;                {</div>
-<div class="line"><a name="l09436"></a><span class="lineno"> 9436</span>&#160;                    <span class="keywordflow">if</span>(VmaIsBufferImageGranularityConflict(prevSuballoc.type, allocType))</div>
-<div class="line"><a name="l09437"></a><span class="lineno"> 9437</span>&#160;                    {</div>
-<div class="line"><a name="l09438"></a><span class="lineno"> 9438</span>&#160;                        bufferImageGranularityConflict = <span class="keyword">true</span>;</div>
-<div class="line"><a name="l09439"></a><span class="lineno"> 9439</span>&#160;                        <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l09440"></a><span class="lineno"> 9440</span>&#160;                    }</div>
-<div class="line"><a name="l09441"></a><span class="lineno"> 9441</span>&#160;                }</div>
-<div class="line"><a name="l09442"></a><span class="lineno"> 9442</span>&#160;                <span class="keywordflow">else</span></div>
-<div class="line"><a name="l09443"></a><span class="lineno"> 9443</span>&#160;                    <span class="comment">// Already on previous page.</span></div>
-<div class="line"><a name="l09444"></a><span class="lineno"> 9444</span>&#160;                    <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l09445"></a><span class="lineno"> 9445</span>&#160;            }</div>
-<div class="line"><a name="l09446"></a><span class="lineno"> 9446</span>&#160;            <span class="keywordflow">if</span>(bufferImageGranularityConflict)</div>
-<div class="line"><a name="l09447"></a><span class="lineno"> 9447</span>&#160;            {</div>
-<div class="line"><a name="l09448"></a><span class="lineno"> 9448</span>&#160;                *pOffset = VmaAlignUp(*pOffset, bufferImageGranularity);</div>
-<div class="line"><a name="l09449"></a><span class="lineno"> 9449</span>&#160;            }</div>
-<div class="line"><a name="l09450"></a><span class="lineno"> 9450</span>&#160;        }</div>
-<div class="line"><a name="l09451"></a><span class="lineno"> 9451</span>&#160;    </div>
-<div class="line"><a name="l09452"></a><span class="lineno"> 9452</span>&#160;        <span class="comment">// Now that we have final *pOffset, check if we are past suballocItem.</span></div>
-<div class="line"><a name="l09453"></a><span class="lineno"> 9453</span>&#160;        <span class="comment">// If yes, return false - this function should be called for another suballocItem as starting point.</span></div>
-<div class="line"><a name="l09454"></a><span class="lineno"> 9454</span>&#160;        <span class="keywordflow">if</span>(*pOffset &gt;= suballocItem-&gt;offset + suballocItem-&gt;size)</div>
-<div class="line"><a name="l09455"></a><span class="lineno"> 9455</span>&#160;        {</div>
-<div class="line"><a name="l09456"></a><span class="lineno"> 9456</span>&#160;            <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
-<div class="line"><a name="l09457"></a><span class="lineno"> 9457</span>&#160;        }</div>
-<div class="line"><a name="l09458"></a><span class="lineno"> 9458</span>&#160;    </div>
-<div class="line"><a name="l09459"></a><span class="lineno"> 9459</span>&#160;        <span class="comment">// Calculate padding at the beginning based on current offset.</span></div>
-<div class="line"><a name="l09460"></a><span class="lineno"> 9460</span>&#160;        <span class="keyword">const</span> VkDeviceSize paddingBegin = *pOffset - suballocItem-&gt;offset;</div>
-<div class="line"><a name="l09461"></a><span class="lineno"> 9461</span>&#160; </div>
-<div class="line"><a name="l09462"></a><span class="lineno"> 9462</span>&#160;        <span class="comment">// Calculate required margin at the end.</span></div>
-<div class="line"><a name="l09463"></a><span class="lineno"> 9463</span>&#160;        <span class="keyword">const</span> VkDeviceSize requiredEndMargin = VMA_DEBUG_MARGIN;</div>
-<div class="line"><a name="l09464"></a><span class="lineno"> 9464</span>&#160; </div>
-<div class="line"><a name="l09465"></a><span class="lineno"> 9465</span>&#160;        <span class="keyword">const</span> VkDeviceSize totalSize = paddingBegin + allocSize + requiredEndMargin;</div>
-<div class="line"><a name="l09466"></a><span class="lineno"> 9466</span>&#160;        <span class="comment">// Another early return check.</span></div>
-<div class="line"><a name="l09467"></a><span class="lineno"> 9467</span>&#160;        <span class="keywordflow">if</span>(suballocItem-&gt;offset + totalSize &gt; GetSize())</div>
-<div class="line"><a name="l09468"></a><span class="lineno"> 9468</span>&#160;        {</div>
-<div class="line"><a name="l09469"></a><span class="lineno"> 9469</span>&#160;            <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
-<div class="line"><a name="l09470"></a><span class="lineno"> 9470</span>&#160;        }</div>
-<div class="line"><a name="l09471"></a><span class="lineno"> 9471</span>&#160; </div>
-<div class="line"><a name="l09472"></a><span class="lineno"> 9472</span>&#160;        <span class="comment">// Advance lastSuballocItem until desired size is reached.</span></div>
-<div class="line"><a name="l09473"></a><span class="lineno"> 9473</span>&#160;        <span class="comment">// Update itemsToMakeLostCount.</span></div>
-<div class="line"><a name="l09474"></a><span class="lineno"> 9474</span>&#160;        VmaSuballocationList::const_iterator lastSuballocItem = suballocItem;</div>
-<div class="line"><a name="l09475"></a><span class="lineno"> 9475</span>&#160;        <span class="keywordflow">if</span>(totalSize &gt; suballocItem-&gt;size)</div>
-<div class="line"><a name="l09476"></a><span class="lineno"> 9476</span>&#160;        {</div>
-<div class="line"><a name="l09477"></a><span class="lineno"> 9477</span>&#160;            VkDeviceSize remainingSize = totalSize - suballocItem-&gt;size;</div>
-<div class="line"><a name="l09478"></a><span class="lineno"> 9478</span>&#160;            <span class="keywordflow">while</span>(remainingSize &gt; 0)</div>
-<div class="line"><a name="l09479"></a><span class="lineno"> 9479</span>&#160;            {</div>
-<div class="line"><a name="l09480"></a><span class="lineno"> 9480</span>&#160;                ++lastSuballocItem;</div>
-<div class="line"><a name="l09481"></a><span class="lineno"> 9481</span>&#160;                <span class="keywordflow">if</span>(lastSuballocItem == m_Suballocations.cend())</div>
-<div class="line"><a name="l09482"></a><span class="lineno"> 9482</span>&#160;                {</div>
-<div class="line"><a name="l09483"></a><span class="lineno"> 9483</span>&#160;                    <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
-<div class="line"><a name="l09484"></a><span class="lineno"> 9484</span>&#160;                }</div>
-<div class="line"><a name="l09485"></a><span class="lineno"> 9485</span>&#160;                <span class="keywordflow">if</span>(lastSuballocItem-&gt;type == VMA_SUBALLOCATION_TYPE_FREE)</div>
-<div class="line"><a name="l09486"></a><span class="lineno"> 9486</span>&#160;                {</div>
-<div class="line"><a name="l09487"></a><span class="lineno"> 9487</span>&#160;                    *pSumFreeSize += lastSuballocItem-&gt;size;</div>
-<div class="line"><a name="l09488"></a><span class="lineno"> 9488</span>&#160;                }</div>
-<div class="line"><a name="l09489"></a><span class="lineno"> 9489</span>&#160;                <span class="keywordflow">else</span></div>
-<div class="line"><a name="l09490"></a><span class="lineno"> 9490</span>&#160;                {</div>
-<div class="line"><a name="l09491"></a><span class="lineno"> 9491</span>&#160;                    VMA_ASSERT(lastSuballocItem-&gt;hAllocation != VK_NULL_HANDLE);</div>
-<div class="line"><a name="l09492"></a><span class="lineno"> 9492</span>&#160;                    <span class="keywordflow">if</span>(lastSuballocItem-&gt;hAllocation-&gt;CanBecomeLost() &amp;&amp;</div>
-<div class="line"><a name="l09493"></a><span class="lineno"> 9493</span>&#160;                        lastSuballocItem-&gt;hAllocation-&gt;GetLastUseFrameIndex() + frameInUseCount &lt; currentFrameIndex)</div>
-<div class="line"><a name="l09494"></a><span class="lineno"> 9494</span>&#160;                    {</div>
-<div class="line"><a name="l09495"></a><span class="lineno"> 9495</span>&#160;                        ++*itemsToMakeLostCount;</div>
-<div class="line"><a name="l09496"></a><span class="lineno"> 9496</span>&#160;                        *pSumItemSize += lastSuballocItem-&gt;size;</div>
-<div class="line"><a name="l09497"></a><span class="lineno"> 9497</span>&#160;                    }</div>
-<div class="line"><a name="l09498"></a><span class="lineno"> 9498</span>&#160;                    <span class="keywordflow">else</span></div>
-<div class="line"><a name="l09499"></a><span class="lineno"> 9499</span>&#160;                    {</div>
-<div class="line"><a name="l09500"></a><span class="lineno"> 9500</span>&#160;                        <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
-<div class="line"><a name="l09501"></a><span class="lineno"> 9501</span>&#160;                    }</div>
-<div class="line"><a name="l09502"></a><span class="lineno"> 9502</span>&#160;                }</div>
-<div class="line"><a name="l09503"></a><span class="lineno"> 9503</span>&#160;                remainingSize = (lastSuballocItem-&gt;size &lt; remainingSize) ?</div>
-<div class="line"><a name="l09504"></a><span class="lineno"> 9504</span>&#160;                    remainingSize - lastSuballocItem-&gt;size : 0;</div>
-<div class="line"><a name="l09505"></a><span class="lineno"> 9505</span>&#160;            }</div>
-<div class="line"><a name="l09506"></a><span class="lineno"> 9506</span>&#160;        }</div>
-<div class="line"><a name="l09507"></a><span class="lineno"> 9507</span>&#160; </div>
-<div class="line"><a name="l09508"></a><span class="lineno"> 9508</span>&#160;        <span class="comment">// Check next suballocations for BufferImageGranularity conflicts.</span></div>
-<div class="line"><a name="l09509"></a><span class="lineno"> 9509</span>&#160;        <span class="comment">// If conflict exists, we must mark more allocations lost or fail.</span></div>
-<div class="line"><a name="l09510"></a><span class="lineno"> 9510</span>&#160;        <span class="keywordflow">if</span>(bufferImageGranularity &gt; 1)</div>
-<div class="line"><a name="l09511"></a><span class="lineno"> 9511</span>&#160;        {</div>
-<div class="line"><a name="l09512"></a><span class="lineno"> 9512</span>&#160;            VmaSuballocationList::const_iterator nextSuballocItem = lastSuballocItem;</div>
-<div class="line"><a name="l09513"></a><span class="lineno"> 9513</span>&#160;            ++nextSuballocItem;</div>
-<div class="line"><a name="l09514"></a><span class="lineno"> 9514</span>&#160;            <span class="keywordflow">while</span>(nextSuballocItem != m_Suballocations.cend())</div>
-<div class="line"><a name="l09515"></a><span class="lineno"> 9515</span>&#160;            {</div>
-<div class="line"><a name="l09516"></a><span class="lineno"> 9516</span>&#160;                <span class="keyword">const</span> VmaSuballocation&amp; nextSuballoc = *nextSuballocItem;</div>
-<div class="line"><a name="l09517"></a><span class="lineno"> 9517</span>&#160;                <span class="keywordflow">if</span>(VmaBlocksOnSamePage(*pOffset, allocSize, nextSuballoc.offset, bufferImageGranularity))</div>
-<div class="line"><a name="l09518"></a><span class="lineno"> 9518</span>&#160;                {</div>
-<div class="line"><a name="l09519"></a><span class="lineno"> 9519</span>&#160;                    <span class="keywordflow">if</span>(VmaIsBufferImageGranularityConflict(allocType, nextSuballoc.type))</div>
-<div class="line"><a name="l09520"></a><span class="lineno"> 9520</span>&#160;                    {</div>
-<div class="line"><a name="l09521"></a><span class="lineno"> 9521</span>&#160;                        VMA_ASSERT(nextSuballoc.hAllocation != VK_NULL_HANDLE);</div>
-<div class="line"><a name="l09522"></a><span class="lineno"> 9522</span>&#160;                        <span class="keywordflow">if</span>(nextSuballoc.hAllocation-&gt;CanBecomeLost() &amp;&amp;</div>
-<div class="line"><a name="l09523"></a><span class="lineno"> 9523</span>&#160;                            nextSuballoc.hAllocation-&gt;GetLastUseFrameIndex() + frameInUseCount &lt; currentFrameIndex)</div>
-<div class="line"><a name="l09524"></a><span class="lineno"> 9524</span>&#160;                        {</div>
-<div class="line"><a name="l09525"></a><span class="lineno"> 9525</span>&#160;                            ++*itemsToMakeLostCount;</div>
-<div class="line"><a name="l09526"></a><span class="lineno"> 9526</span>&#160;                        }</div>
-<div class="line"><a name="l09527"></a><span class="lineno"> 9527</span>&#160;                        <span class="keywordflow">else</span></div>
-<div class="line"><a name="l09528"></a><span class="lineno"> 9528</span>&#160;                        {</div>
-<div class="line"><a name="l09529"></a><span class="lineno"> 9529</span>&#160;                            <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
-<div class="line"><a name="l09530"></a><span class="lineno"> 9530</span>&#160;                        }</div>
-<div class="line"><a name="l09531"></a><span class="lineno"> 9531</span>&#160;                    }</div>
-<div class="line"><a name="l09532"></a><span class="lineno"> 9532</span>&#160;                }</div>
-<div class="line"><a name="l09533"></a><span class="lineno"> 9533</span>&#160;                <span class="keywordflow">else</span></div>
-<div class="line"><a name="l09534"></a><span class="lineno"> 9534</span>&#160;                {</div>
-<div class="line"><a name="l09535"></a><span class="lineno"> 9535</span>&#160;                    <span class="comment">// Already on next page.</span></div>
-<div class="line"><a name="l09536"></a><span class="lineno"> 9536</span>&#160;                    <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l09537"></a><span class="lineno"> 9537</span>&#160;                }</div>
-<div class="line"><a name="l09538"></a><span class="lineno"> 9538</span>&#160;                ++nextSuballocItem;</div>
-<div class="line"><a name="l09539"></a><span class="lineno"> 9539</span>&#160;            }</div>
-<div class="line"><a name="l09540"></a><span class="lineno"> 9540</span>&#160;        }</div>
-<div class="line"><a name="l09541"></a><span class="lineno"> 9541</span>&#160;    }</div>
-<div class="line"><a name="l09542"></a><span class="lineno"> 9542</span>&#160;    <span class="keywordflow">else</span></div>
-<div class="line"><a name="l09543"></a><span class="lineno"> 9543</span>&#160;    {</div>
-<div class="line"><a name="l09544"></a><span class="lineno"> 9544</span>&#160;        <span class="keyword">const</span> VmaSuballocation&amp; suballoc = *suballocItem;</div>
-<div class="line"><a name="l09545"></a><span class="lineno"> 9545</span>&#160;        VMA_ASSERT(suballoc.type == VMA_SUBALLOCATION_TYPE_FREE);</div>
-<div class="line"><a name="l09546"></a><span class="lineno"> 9546</span>&#160; </div>
-<div class="line"><a name="l09547"></a><span class="lineno"> 9547</span>&#160;        *pSumFreeSize = suballoc.size;</div>
-<div class="line"><a name="l09548"></a><span class="lineno"> 9548</span>&#160; </div>
-<div class="line"><a name="l09549"></a><span class="lineno"> 9549</span>&#160;        <span class="comment">// Size of this suballocation is too small for this request: Early return.</span></div>
-<div class="line"><a name="l09550"></a><span class="lineno"> 9550</span>&#160;        <span class="keywordflow">if</span>(suballoc.size &lt; allocSize)</div>
-<div class="line"><a name="l09551"></a><span class="lineno"> 9551</span>&#160;        {</div>
-<div class="line"><a name="l09552"></a><span class="lineno"> 9552</span>&#160;            <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
-<div class="line"><a name="l09553"></a><span class="lineno"> 9553</span>&#160;        }</div>
-<div class="line"><a name="l09554"></a><span class="lineno"> 9554</span>&#160; </div>
-<div class="line"><a name="l09555"></a><span class="lineno"> 9555</span>&#160;        <span class="comment">// Start from offset equal to beginning of this suballocation.</span></div>
-<div class="line"><a name="l09556"></a><span class="lineno"> 9556</span>&#160;        *pOffset = suballoc.offset;</div>
-<div class="line"><a name="l09557"></a><span class="lineno"> 9557</span>&#160;    </div>
-<div class="line"><a name="l09558"></a><span class="lineno"> 9558</span>&#160;        <span class="comment">// Apply VMA_DEBUG_MARGIN at the beginning.</span></div>
-<div class="line"><a name="l09559"></a><span class="lineno"> 9559</span>&#160;        <span class="keywordflow">if</span>(VMA_DEBUG_MARGIN &gt; 0)</div>
-<div class="line"><a name="l09560"></a><span class="lineno"> 9560</span>&#160;        {</div>
-<div class="line"><a name="l09561"></a><span class="lineno"> 9561</span>&#160;            *pOffset += VMA_DEBUG_MARGIN;</div>
-<div class="line"><a name="l09562"></a><span class="lineno"> 9562</span>&#160;        }</div>
-<div class="line"><a name="l09563"></a><span class="lineno"> 9563</span>&#160;    </div>
-<div class="line"><a name="l09564"></a><span class="lineno"> 9564</span>&#160;        <span class="comment">// Apply alignment.</span></div>
-<div class="line"><a name="l09565"></a><span class="lineno"> 9565</span>&#160;        *pOffset = VmaAlignUp(*pOffset, allocAlignment);</div>
-<div class="line"><a name="l09566"></a><span class="lineno"> 9566</span>&#160;    </div>
-<div class="line"><a name="l09567"></a><span class="lineno"> 9567</span>&#160;        <span class="comment">// Check previous suballocations for BufferImageGranularity conflicts.</span></div>
-<div class="line"><a name="l09568"></a><span class="lineno"> 9568</span>&#160;        <span class="comment">// Make bigger alignment if necessary.</span></div>
-<div class="line"><a name="l09569"></a><span class="lineno"> 9569</span>&#160;        <span class="keywordflow">if</span>(bufferImageGranularity &gt; 1)</div>
-<div class="line"><a name="l09570"></a><span class="lineno"> 9570</span>&#160;        {</div>
-<div class="line"><a name="l09571"></a><span class="lineno"> 9571</span>&#160;            <span class="keywordtype">bool</span> bufferImageGranularityConflict = <span class="keyword">false</span>;</div>
-<div class="line"><a name="l09572"></a><span class="lineno"> 9572</span>&#160;            VmaSuballocationList::const_iterator prevSuballocItem = suballocItem;</div>
-<div class="line"><a name="l09573"></a><span class="lineno"> 9573</span>&#160;            <span class="keywordflow">while</span>(prevSuballocItem != m_Suballocations.cbegin())</div>
-<div class="line"><a name="l09574"></a><span class="lineno"> 9574</span>&#160;            {</div>
-<div class="line"><a name="l09575"></a><span class="lineno"> 9575</span>&#160;                --prevSuballocItem;</div>
-<div class="line"><a name="l09576"></a><span class="lineno"> 9576</span>&#160;                <span class="keyword">const</span> VmaSuballocation&amp; prevSuballoc = *prevSuballocItem;</div>
-<div class="line"><a name="l09577"></a><span class="lineno"> 9577</span>&#160;                <span class="keywordflow">if</span>(VmaBlocksOnSamePage(prevSuballoc.offset, prevSuballoc.size, *pOffset, bufferImageGranularity))</div>
-<div class="line"><a name="l09578"></a><span class="lineno"> 9578</span>&#160;                {</div>
-<div class="line"><a name="l09579"></a><span class="lineno"> 9579</span>&#160;                    <span class="keywordflow">if</span>(VmaIsBufferImageGranularityConflict(prevSuballoc.type, allocType))</div>
-<div class="line"><a name="l09580"></a><span class="lineno"> 9580</span>&#160;                    {</div>
-<div class="line"><a name="l09581"></a><span class="lineno"> 9581</span>&#160;                        bufferImageGranularityConflict = <span class="keyword">true</span>;</div>
-<div class="line"><a name="l09582"></a><span class="lineno"> 9582</span>&#160;                        <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l09583"></a><span class="lineno"> 9583</span>&#160;                    }</div>
-<div class="line"><a name="l09584"></a><span class="lineno"> 9584</span>&#160;                }</div>
-<div class="line"><a name="l09585"></a><span class="lineno"> 9585</span>&#160;                <span class="keywordflow">else</span></div>
-<div class="line"><a name="l09586"></a><span class="lineno"> 9586</span>&#160;                    <span class="comment">// Already on previous page.</span></div>
-<div class="line"><a name="l09587"></a><span class="lineno"> 9587</span>&#160;                    <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l09588"></a><span class="lineno"> 9588</span>&#160;            }</div>
-<div class="line"><a name="l09589"></a><span class="lineno"> 9589</span>&#160;            <span class="keywordflow">if</span>(bufferImageGranularityConflict)</div>
-<div class="line"><a name="l09590"></a><span class="lineno"> 9590</span>&#160;            {</div>
-<div class="line"><a name="l09591"></a><span class="lineno"> 9591</span>&#160;                *pOffset = VmaAlignUp(*pOffset, bufferImageGranularity);</div>
-<div class="line"><a name="l09592"></a><span class="lineno"> 9592</span>&#160;            }</div>
-<div class="line"><a name="l09593"></a><span class="lineno"> 9593</span>&#160;        }</div>
-<div class="line"><a name="l09594"></a><span class="lineno"> 9594</span>&#160;    </div>
-<div class="line"><a name="l09595"></a><span class="lineno"> 9595</span>&#160;        <span class="comment">// Calculate padding at the beginning based on current offset.</span></div>
-<div class="line"><a name="l09596"></a><span class="lineno"> 9596</span>&#160;        <span class="keyword">const</span> VkDeviceSize paddingBegin = *pOffset - suballoc.offset;</div>
-<div class="line"><a name="l09597"></a><span class="lineno"> 9597</span>&#160; </div>
-<div class="line"><a name="l09598"></a><span class="lineno"> 9598</span>&#160;        <span class="comment">// Calculate required margin at the end.</span></div>
-<div class="line"><a name="l09599"></a><span class="lineno"> 9599</span>&#160;        <span class="keyword">const</span> VkDeviceSize requiredEndMargin = VMA_DEBUG_MARGIN;</div>
-<div class="line"><a name="l09600"></a><span class="lineno"> 9600</span>&#160; </div>
-<div class="line"><a name="l09601"></a><span class="lineno"> 9601</span>&#160;        <span class="comment">// Fail if requested size plus margin before and after is bigger than size of this suballocation.</span></div>
-<div class="line"><a name="l09602"></a><span class="lineno"> 9602</span>&#160;        <span class="keywordflow">if</span>(paddingBegin + allocSize + requiredEndMargin &gt; suballoc.size)</div>
-<div class="line"><a name="l09603"></a><span class="lineno"> 9603</span>&#160;        {</div>
-<div class="line"><a name="l09604"></a><span class="lineno"> 9604</span>&#160;            <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
-<div class="line"><a name="l09605"></a><span class="lineno"> 9605</span>&#160;        }</div>
-<div class="line"><a name="l09606"></a><span class="lineno"> 9606</span>&#160; </div>
-<div class="line"><a name="l09607"></a><span class="lineno"> 9607</span>&#160;        <span class="comment">// Check next suballocations for BufferImageGranularity conflicts.</span></div>
-<div class="line"><a name="l09608"></a><span class="lineno"> 9608</span>&#160;        <span class="comment">// If conflict exists, allocation cannot be made here.</span></div>
-<div class="line"><a name="l09609"></a><span class="lineno"> 9609</span>&#160;        <span class="keywordflow">if</span>(bufferImageGranularity &gt; 1)</div>
-<div class="line"><a name="l09610"></a><span class="lineno"> 9610</span>&#160;        {</div>
-<div class="line"><a name="l09611"></a><span class="lineno"> 9611</span>&#160;            VmaSuballocationList::const_iterator nextSuballocItem = suballocItem;</div>
-<div class="line"><a name="l09612"></a><span class="lineno"> 9612</span>&#160;            ++nextSuballocItem;</div>
-<div class="line"><a name="l09613"></a><span class="lineno"> 9613</span>&#160;            <span class="keywordflow">while</span>(nextSuballocItem != m_Suballocations.cend())</div>
-<div class="line"><a name="l09614"></a><span class="lineno"> 9614</span>&#160;            {</div>
-<div class="line"><a name="l09615"></a><span class="lineno"> 9615</span>&#160;                <span class="keyword">const</span> VmaSuballocation&amp; nextSuballoc = *nextSuballocItem;</div>
-<div class="line"><a name="l09616"></a><span class="lineno"> 9616</span>&#160;                <span class="keywordflow">if</span>(VmaBlocksOnSamePage(*pOffset, allocSize, nextSuballoc.offset, bufferImageGranularity))</div>
-<div class="line"><a name="l09617"></a><span class="lineno"> 9617</span>&#160;                {</div>
-<div class="line"><a name="l09618"></a><span class="lineno"> 9618</span>&#160;                    <span class="keywordflow">if</span>(VmaIsBufferImageGranularityConflict(allocType, nextSuballoc.type))</div>
-<div class="line"><a name="l09619"></a><span class="lineno"> 9619</span>&#160;                    {</div>
-<div class="line"><a name="l09620"></a><span class="lineno"> 9620</span>&#160;                        <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
-<div class="line"><a name="l09621"></a><span class="lineno"> 9621</span>&#160;                    }</div>
-<div class="line"><a name="l09622"></a><span class="lineno"> 9622</span>&#160;                }</div>
-<div class="line"><a name="l09623"></a><span class="lineno"> 9623</span>&#160;                <span class="keywordflow">else</span></div>
-<div class="line"><a name="l09624"></a><span class="lineno"> 9624</span>&#160;                {</div>
-<div class="line"><a name="l09625"></a><span class="lineno"> 9625</span>&#160;                    <span class="comment">// Already on next page.</span></div>
-<div class="line"><a name="l09626"></a><span class="lineno"> 9626</span>&#160;                    <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l09627"></a><span class="lineno"> 9627</span>&#160;                }</div>
-<div class="line"><a name="l09628"></a><span class="lineno"> 9628</span>&#160;                ++nextSuballocItem;</div>
-<div class="line"><a name="l09629"></a><span class="lineno"> 9629</span>&#160;            }</div>
-<div class="line"><a name="l09630"></a><span class="lineno"> 9630</span>&#160;        }</div>
-<div class="line"><a name="l09631"></a><span class="lineno"> 9631</span>&#160;    }</div>
-<div class="line"><a name="l09632"></a><span class="lineno"> 9632</span>&#160; </div>
-<div class="line"><a name="l09633"></a><span class="lineno"> 9633</span>&#160;    <span class="comment">// All tests passed: Success. pOffset is already filled.</span></div>
-<div class="line"><a name="l09634"></a><span class="lineno"> 9634</span>&#160;    <span class="keywordflow">return</span> <span class="keyword">true</span>;</div>
-<div class="line"><a name="l09635"></a><span class="lineno"> 9635</span>&#160;}</div>
-<div class="line"><a name="l09636"></a><span class="lineno"> 9636</span>&#160; </div>
-<div class="line"><a name="l09637"></a><span class="lineno"> 9637</span>&#160;<span class="keywordtype">void</span> VmaBlockMetadata_Generic::MergeFreeWithNext(VmaSuballocationList::iterator item)</div>
-<div class="line"><a name="l09638"></a><span class="lineno"> 9638</span>&#160;{</div>
-<div class="line"><a name="l09639"></a><span class="lineno"> 9639</span>&#160;    VMA_ASSERT(item != m_Suballocations.end());</div>
-<div class="line"><a name="l09640"></a><span class="lineno"> 9640</span>&#160;    VMA_ASSERT(item-&gt;type == VMA_SUBALLOCATION_TYPE_FREE);</div>
-<div class="line"><a name="l09641"></a><span class="lineno"> 9641</span>&#160;    </div>
-<div class="line"><a name="l09642"></a><span class="lineno"> 9642</span>&#160;    VmaSuballocationList::iterator nextItem = item;</div>
-<div class="line"><a name="l09643"></a><span class="lineno"> 9643</span>&#160;    ++nextItem;</div>
-<div class="line"><a name="l09644"></a><span class="lineno"> 9644</span>&#160;    VMA_ASSERT(nextItem != m_Suballocations.end());</div>
-<div class="line"><a name="l09645"></a><span class="lineno"> 9645</span>&#160;    VMA_ASSERT(nextItem-&gt;type == VMA_SUBALLOCATION_TYPE_FREE);</div>
-<div class="line"><a name="l09646"></a><span class="lineno"> 9646</span>&#160; </div>
-<div class="line"><a name="l09647"></a><span class="lineno"> 9647</span>&#160;    item-&gt;size += nextItem-&gt;size;</div>
-<div class="line"><a name="l09648"></a><span class="lineno"> 9648</span>&#160;    --m_FreeCount;</div>
-<div class="line"><a name="l09649"></a><span class="lineno"> 9649</span>&#160;    m_Suballocations.erase(nextItem);</div>
-<div class="line"><a name="l09650"></a><span class="lineno"> 9650</span>&#160;}</div>
-<div class="line"><a name="l09651"></a><span class="lineno"> 9651</span>&#160; </div>
-<div class="line"><a name="l09652"></a><span class="lineno"> 9652</span>&#160;VmaSuballocationList::iterator VmaBlockMetadata_Generic::FreeSuballocation(VmaSuballocationList::iterator suballocItem)</div>
-<div class="line"><a name="l09653"></a><span class="lineno"> 9653</span>&#160;{</div>
-<div class="line"><a name="l09654"></a><span class="lineno"> 9654</span>&#160;    <span class="comment">// Change this suballocation to be marked as free.</span></div>
-<div class="line"><a name="l09655"></a><span class="lineno"> 9655</span>&#160;    VmaSuballocation&amp; suballoc = *suballocItem;</div>
-<div class="line"><a name="l09656"></a><span class="lineno"> 9656</span>&#160;    suballoc.type = VMA_SUBALLOCATION_TYPE_FREE;</div>
-<div class="line"><a name="l09657"></a><span class="lineno"> 9657</span>&#160;    suballoc.hAllocation = VK_NULL_HANDLE;</div>
-<div class="line"><a name="l09658"></a><span class="lineno"> 9658</span>&#160;    </div>
-<div class="line"><a name="l09659"></a><span class="lineno"> 9659</span>&#160;    <span class="comment">// Update totals.</span></div>
-<div class="line"><a name="l09660"></a><span class="lineno"> 9660</span>&#160;    ++m_FreeCount;</div>
-<div class="line"><a name="l09661"></a><span class="lineno"> 9661</span>&#160;    m_SumFreeSize += suballoc.size;</div>
-<div class="line"><a name="l09662"></a><span class="lineno"> 9662</span>&#160; </div>
-<div class="line"><a name="l09663"></a><span class="lineno"> 9663</span>&#160;    <span class="comment">// Merge with previous and/or next suballocation if it&#39;s also free.</span></div>
-<div class="line"><a name="l09664"></a><span class="lineno"> 9664</span>&#160;    <span class="keywordtype">bool</span> mergeWithNext = <span class="keyword">false</span>;</div>
-<div class="line"><a name="l09665"></a><span class="lineno"> 9665</span>&#160;    <span class="keywordtype">bool</span> mergeWithPrev = <span class="keyword">false</span>;</div>
-<div class="line"><a name="l09666"></a><span class="lineno"> 9666</span>&#160;    </div>
-<div class="line"><a name="l09667"></a><span class="lineno"> 9667</span>&#160;    VmaSuballocationList::iterator nextItem = suballocItem;</div>
-<div class="line"><a name="l09668"></a><span class="lineno"> 9668</span>&#160;    ++nextItem;</div>
-<div class="line"><a name="l09669"></a><span class="lineno"> 9669</span>&#160;    <span class="keywordflow">if</span>((nextItem != m_Suballocations.end()) &amp;&amp; (nextItem-&gt;type == VMA_SUBALLOCATION_TYPE_FREE))</div>
-<div class="line"><a name="l09670"></a><span class="lineno"> 9670</span>&#160;    {</div>
-<div class="line"><a name="l09671"></a><span class="lineno"> 9671</span>&#160;        mergeWithNext = <span class="keyword">true</span>;</div>
-<div class="line"><a name="l09672"></a><span class="lineno"> 9672</span>&#160;    }</div>
-<div class="line"><a name="l09673"></a><span class="lineno"> 9673</span>&#160; </div>
-<div class="line"><a name="l09674"></a><span class="lineno"> 9674</span>&#160;    VmaSuballocationList::iterator prevItem = suballocItem;</div>
-<div class="line"><a name="l09675"></a><span class="lineno"> 9675</span>&#160;    <span class="keywordflow">if</span>(suballocItem != m_Suballocations.begin())</div>
-<div class="line"><a name="l09676"></a><span class="lineno"> 9676</span>&#160;    {</div>
-<div class="line"><a name="l09677"></a><span class="lineno"> 9677</span>&#160;        --prevItem;</div>
-<div class="line"><a name="l09678"></a><span class="lineno"> 9678</span>&#160;        <span class="keywordflow">if</span>(prevItem-&gt;type == VMA_SUBALLOCATION_TYPE_FREE)</div>
-<div class="line"><a name="l09679"></a><span class="lineno"> 9679</span>&#160;        {</div>
-<div class="line"><a name="l09680"></a><span class="lineno"> 9680</span>&#160;            mergeWithPrev = <span class="keyword">true</span>;</div>
-<div class="line"><a name="l09681"></a><span class="lineno"> 9681</span>&#160;        }</div>
-<div class="line"><a name="l09682"></a><span class="lineno"> 9682</span>&#160;    }</div>
-<div class="line"><a name="l09683"></a><span class="lineno"> 9683</span>&#160; </div>
-<div class="line"><a name="l09684"></a><span class="lineno"> 9684</span>&#160;    <span class="keywordflow">if</span>(mergeWithNext)</div>
-<div class="line"><a name="l09685"></a><span class="lineno"> 9685</span>&#160;    {</div>
-<div class="line"><a name="l09686"></a><span class="lineno"> 9686</span>&#160;        UnregisterFreeSuballocation(nextItem);</div>
-<div class="line"><a name="l09687"></a><span class="lineno"> 9687</span>&#160;        MergeFreeWithNext(suballocItem);</div>
-<div class="line"><a name="l09688"></a><span class="lineno"> 9688</span>&#160;    }</div>
-<div class="line"><a name="l09689"></a><span class="lineno"> 9689</span>&#160; </div>
-<div class="line"><a name="l09690"></a><span class="lineno"> 9690</span>&#160;    <span class="keywordflow">if</span>(mergeWithPrev)</div>
-<div class="line"><a name="l09691"></a><span class="lineno"> 9691</span>&#160;    {</div>
-<div class="line"><a name="l09692"></a><span class="lineno"> 9692</span>&#160;        UnregisterFreeSuballocation(prevItem);</div>
-<div class="line"><a name="l09693"></a><span class="lineno"> 9693</span>&#160;        MergeFreeWithNext(prevItem);</div>
-<div class="line"><a name="l09694"></a><span class="lineno"> 9694</span>&#160;        RegisterFreeSuballocation(prevItem);</div>
-<div class="line"><a name="l09695"></a><span class="lineno"> 9695</span>&#160;        <span class="keywordflow">return</span> prevItem;</div>
-<div class="line"><a name="l09696"></a><span class="lineno"> 9696</span>&#160;    }</div>
-<div class="line"><a name="l09697"></a><span class="lineno"> 9697</span>&#160;    <span class="keywordflow">else</span></div>
-<div class="line"><a name="l09698"></a><span class="lineno"> 9698</span>&#160;    {</div>
-<div class="line"><a name="l09699"></a><span class="lineno"> 9699</span>&#160;        RegisterFreeSuballocation(suballocItem);</div>
-<div class="line"><a name="l09700"></a><span class="lineno"> 9700</span>&#160;        <span class="keywordflow">return</span> suballocItem;</div>
-<div class="line"><a name="l09701"></a><span class="lineno"> 9701</span>&#160;    }</div>
-<div class="line"><a name="l09702"></a><span class="lineno"> 9702</span>&#160;}</div>
+<div class="line"><a name="l09386"></a><span class="lineno"> 9386</span>&#160;            <span class="comment">// Margin required between allocations - previous allocation must be free.</span></div>
+<div class="line"><a name="l09387"></a><span class="lineno"> 9387</span>&#160;            VMA_VALIDATE(VMA_DEBUG_MARGIN == 0 || prevFree);</div>
+<div class="line"><a name="l09388"></a><span class="lineno"> 9388</span>&#160;        }</div>
+<div class="line"><a name="l09389"></a><span class="lineno"> 9389</span>&#160; </div>
+<div class="line"><a name="l09390"></a><span class="lineno"> 9390</span>&#160;        calculatedOffset += subAlloc.size;</div>
+<div class="line"><a name="l09391"></a><span class="lineno"> 9391</span>&#160;        prevFree = currFree;</div>
+<div class="line"><a name="l09392"></a><span class="lineno"> 9392</span>&#160;    }</div>
+<div class="line"><a name="l09393"></a><span class="lineno"> 9393</span>&#160; </div>
+<div class="line"><a name="l09394"></a><span class="lineno"> 9394</span>&#160;    <span class="comment">// Number of free suballocations registered in m_FreeSuballocationsBySize doesn&#39;t</span></div>
+<div class="line"><a name="l09395"></a><span class="lineno"> 9395</span>&#160;    <span class="comment">// match expected one.</span></div>
+<div class="line"><a name="l09396"></a><span class="lineno"> 9396</span>&#160;    VMA_VALIDATE(m_FreeSuballocationsBySize.size() == freeSuballocationsToRegister);</div>
+<div class="line"><a name="l09397"></a><span class="lineno"> 9397</span>&#160; </div>
+<div class="line"><a name="l09398"></a><span class="lineno"> 9398</span>&#160;    VkDeviceSize lastSize = 0;</div>
+<div class="line"><a name="l09399"></a><span class="lineno"> 9399</span>&#160;    <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> i = 0; i &lt; m_FreeSuballocationsBySize.size(); ++i)</div>
+<div class="line"><a name="l09400"></a><span class="lineno"> 9400</span>&#160;    {</div>
+<div class="line"><a name="l09401"></a><span class="lineno"> 9401</span>&#160;        VmaSuballocationList::iterator suballocItem = m_FreeSuballocationsBySize[i];</div>
+<div class="line"><a name="l09402"></a><span class="lineno"> 9402</span>&#160; </div>
+<div class="line"><a name="l09403"></a><span class="lineno"> 9403</span>&#160;        <span class="comment">// Only free suballocations can be registered in m_FreeSuballocationsBySize.</span></div>
+<div class="line"><a name="l09404"></a><span class="lineno"> 9404</span>&#160;        VMA_VALIDATE(suballocItem-&gt;type == VMA_SUBALLOCATION_TYPE_FREE);</div>
+<div class="line"><a name="l09405"></a><span class="lineno"> 9405</span>&#160;        <span class="comment">// They must be sorted by size ascending.</span></div>
+<div class="line"><a name="l09406"></a><span class="lineno"> 9406</span>&#160;        VMA_VALIDATE(suballocItem-&gt;size &gt;= lastSize);</div>
+<div class="line"><a name="l09407"></a><span class="lineno"> 9407</span>&#160; </div>
+<div class="line"><a name="l09408"></a><span class="lineno"> 9408</span>&#160;        lastSize = suballocItem-&gt;size;</div>
+<div class="line"><a name="l09409"></a><span class="lineno"> 9409</span>&#160;    }</div>
+<div class="line"><a name="l09410"></a><span class="lineno"> 9410</span>&#160; </div>
+<div class="line"><a name="l09411"></a><span class="lineno"> 9411</span>&#160;    <span class="comment">// Check if totals match calculated values.</span></div>
+<div class="line"><a name="l09412"></a><span class="lineno"> 9412</span>&#160;    VMA_VALIDATE(ValidateFreeSuballocationList());</div>
+<div class="line"><a name="l09413"></a><span class="lineno"> 9413</span>&#160;    VMA_VALIDATE(calculatedOffset == GetSize());</div>
+<div class="line"><a name="l09414"></a><span class="lineno"> 9414</span>&#160;    VMA_VALIDATE(calculatedSumFreeSize == m_SumFreeSize);</div>
+<div class="line"><a name="l09415"></a><span class="lineno"> 9415</span>&#160;    VMA_VALIDATE(calculatedFreeCount == m_FreeCount);</div>
+<div class="line"><a name="l09416"></a><span class="lineno"> 9416</span>&#160; </div>
+<div class="line"><a name="l09417"></a><span class="lineno"> 9417</span>&#160;    <span class="keywordflow">return</span> <span class="keyword">true</span>;</div>
+<div class="line"><a name="l09418"></a><span class="lineno"> 9418</span>&#160;}</div>
+<div class="line"><a name="l09419"></a><span class="lineno"> 9419</span>&#160; </div>
+<div class="line"><a name="l09420"></a><span class="lineno"> 9420</span>&#160;VkDeviceSize VmaBlockMetadata_Generic::GetUnusedRangeSizeMax()<span class="keyword"> const</span></div>
+<div class="line"><a name="l09421"></a><span class="lineno"> 9421</span>&#160;<span class="keyword"></span>{</div>
+<div class="line"><a name="l09422"></a><span class="lineno"> 9422</span>&#160;    <span class="keywordflow">if</span>(!m_FreeSuballocationsBySize.empty())</div>
+<div class="line"><a name="l09423"></a><span class="lineno"> 9423</span>&#160;    {</div>
+<div class="line"><a name="l09424"></a><span class="lineno"> 9424</span>&#160;        <span class="keywordflow">return</span> m_FreeSuballocationsBySize.back()-&gt;size;</div>
+<div class="line"><a name="l09425"></a><span class="lineno"> 9425</span>&#160;    }</div>
+<div class="line"><a name="l09426"></a><span class="lineno"> 9426</span>&#160;    <span class="keywordflow">else</span></div>
+<div class="line"><a name="l09427"></a><span class="lineno"> 9427</span>&#160;    {</div>
+<div class="line"><a name="l09428"></a><span class="lineno"> 9428</span>&#160;        <span class="keywordflow">return</span> 0;</div>
+<div class="line"><a name="l09429"></a><span class="lineno"> 9429</span>&#160;    }</div>
+<div class="line"><a name="l09430"></a><span class="lineno"> 9430</span>&#160;}</div>
+<div class="line"><a name="l09431"></a><span class="lineno"> 9431</span>&#160; </div>
+<div class="line"><a name="l09432"></a><span class="lineno"> 9432</span>&#160;<span class="keywordtype">bool</span> VmaBlockMetadata_Generic::IsEmpty()<span class="keyword"> const</span></div>
+<div class="line"><a name="l09433"></a><span class="lineno"> 9433</span>&#160;<span class="keyword"></span>{</div>
+<div class="line"><a name="l09434"></a><span class="lineno"> 9434</span>&#160;    <span class="keywordflow">return</span> (m_Suballocations.size() == 1) &amp;&amp; (m_FreeCount == 1);</div>
+<div class="line"><a name="l09435"></a><span class="lineno"> 9435</span>&#160;}</div>
+<div class="line"><a name="l09436"></a><span class="lineno"> 9436</span>&#160; </div>
+<div class="line"><a name="l09437"></a><span class="lineno"> 9437</span>&#160;<span class="keywordtype">void</span> VmaBlockMetadata_Generic::CalcAllocationStatInfo(<a class="code" href="struct_vma_stat_info.html">VmaStatInfo</a>&amp; outInfo)<span class="keyword"> const</span></div>
+<div class="line"><a name="l09438"></a><span class="lineno"> 9438</span>&#160;<span class="keyword"></span>{</div>
+<div class="line"><a name="l09439"></a><span class="lineno"> 9439</span>&#160;    outInfo.<a class="code" href="struct_vma_stat_info.html#abc4bb7cd611900778464c56e50c970a4">blockCount</a> = 1;</div>
+<div class="line"><a name="l09440"></a><span class="lineno"> 9440</span>&#160; </div>
+<div class="line"><a name="l09441"></a><span class="lineno"> 9441</span>&#160;    <span class="keyword">const</span> uint32_t rangeCount = (uint32_t)m_Suballocations.size();</div>
+<div class="line"><a name="l09442"></a><span class="lineno"> 9442</span>&#160;    outInfo.<a class="code" href="struct_vma_stat_info.html#a537741e4d5cdddc1c0ab95ec650afaff">allocationCount</a> = rangeCount - m_FreeCount;</div>
+<div class="line"><a name="l09443"></a><span class="lineno"> 9443</span>&#160;    outInfo.<a class="code" href="struct_vma_stat_info.html#ae06129c771bfebfd6468a7f4276502a9">unusedRangeCount</a> = m_FreeCount;</div>
+<div class="line"><a name="l09444"></a><span class="lineno"> 9444</span>&#160; </div>
+<div class="line"><a name="l09445"></a><span class="lineno"> 9445</span>&#160;    outInfo.<a class="code" href="struct_vma_stat_info.html#a1859d290aca2cd582d8dc25922092669">unusedBytes</a> = m_SumFreeSize;</div>
+<div class="line"><a name="l09446"></a><span class="lineno"> 9446</span>&#160;    outInfo.<a class="code" href="struct_vma_stat_info.html#ab0c6c73837e5a70c749fbd4f6064895a">usedBytes</a> = GetSize() - outInfo.<a class="code" href="struct_vma_stat_info.html#a1859d290aca2cd582d8dc25922092669">unusedBytes</a>;</div>
+<div class="line"><a name="l09447"></a><span class="lineno"> 9447</span>&#160; </div>
+<div class="line"><a name="l09448"></a><span class="lineno"> 9448</span>&#160;    outInfo.<a class="code" href="struct_vma_stat_info.html#ade8b40bd3139c04aabd2fc538a356fea">allocationSizeMin</a> = UINT64_MAX;</div>
+<div class="line"><a name="l09449"></a><span class="lineno"> 9449</span>&#160;    outInfo.<a class="code" href="struct_vma_stat_info.html#a17e9733a5ecd76287d4db6e66f71f50c">allocationSizeMax</a> = 0;</div>
+<div class="line"><a name="l09450"></a><span class="lineno"> 9450</span>&#160;    outInfo.<a class="code" href="struct_vma_stat_info.html#aedeba931324f16589cd2416c0d2dd0d4">unusedRangeSizeMin</a> = UINT64_MAX;</div>
+<div class="line"><a name="l09451"></a><span class="lineno"> 9451</span>&#160;    outInfo.<a class="code" href="struct_vma_stat_info.html#a5ba1a2476c4d39b10f7e2f7ebbb72ac4">unusedRangeSizeMax</a> = 0;</div>
+<div class="line"><a name="l09452"></a><span class="lineno"> 9452</span>&#160; </div>
+<div class="line"><a name="l09453"></a><span class="lineno"> 9453</span>&#160;    <span class="keywordflow">for</span>(VmaSuballocationList::const_iterator suballocItem = m_Suballocations.cbegin();</div>
+<div class="line"><a name="l09454"></a><span class="lineno"> 9454</span>&#160;        suballocItem != m_Suballocations.cend();</div>
+<div class="line"><a name="l09455"></a><span class="lineno"> 9455</span>&#160;        ++suballocItem)</div>
+<div class="line"><a name="l09456"></a><span class="lineno"> 9456</span>&#160;    {</div>
+<div class="line"><a name="l09457"></a><span class="lineno"> 9457</span>&#160;        <span class="keyword">const</span> VmaSuballocation&amp; suballoc = *suballocItem;</div>
+<div class="line"><a name="l09458"></a><span class="lineno"> 9458</span>&#160;        <span class="keywordflow">if</span>(suballoc.type != VMA_SUBALLOCATION_TYPE_FREE)</div>
+<div class="line"><a name="l09459"></a><span class="lineno"> 9459</span>&#160;        {</div>
+<div class="line"><a name="l09460"></a><span class="lineno"> 9460</span>&#160;            outInfo.<a class="code" href="struct_vma_stat_info.html#ade8b40bd3139c04aabd2fc538a356fea">allocationSizeMin</a> = VMA_MIN(outInfo.<a class="code" href="struct_vma_stat_info.html#ade8b40bd3139c04aabd2fc538a356fea">allocationSizeMin</a>, suballoc.size);</div>
+<div class="line"><a name="l09461"></a><span class="lineno"> 9461</span>&#160;            outInfo.<a class="code" href="struct_vma_stat_info.html#a17e9733a5ecd76287d4db6e66f71f50c">allocationSizeMax</a> = VMA_MAX(outInfo.<a class="code" href="struct_vma_stat_info.html#a17e9733a5ecd76287d4db6e66f71f50c">allocationSizeMax</a>, suballoc.size);</div>
+<div class="line"><a name="l09462"></a><span class="lineno"> 9462</span>&#160;        }</div>
+<div class="line"><a name="l09463"></a><span class="lineno"> 9463</span>&#160;        <span class="keywordflow">else</span></div>
+<div class="line"><a name="l09464"></a><span class="lineno"> 9464</span>&#160;        {</div>
+<div class="line"><a name="l09465"></a><span class="lineno"> 9465</span>&#160;            outInfo.<a class="code" href="struct_vma_stat_info.html#aedeba931324f16589cd2416c0d2dd0d4">unusedRangeSizeMin</a> = VMA_MIN(outInfo.<a class="code" href="struct_vma_stat_info.html#aedeba931324f16589cd2416c0d2dd0d4">unusedRangeSizeMin</a>, suballoc.size);</div>
+<div class="line"><a name="l09466"></a><span class="lineno"> 9466</span>&#160;            outInfo.<a class="code" href="struct_vma_stat_info.html#a5ba1a2476c4d39b10f7e2f7ebbb72ac4">unusedRangeSizeMax</a> = VMA_MAX(outInfo.<a class="code" href="struct_vma_stat_info.html#a5ba1a2476c4d39b10f7e2f7ebbb72ac4">unusedRangeSizeMax</a>, suballoc.size);</div>
+<div class="line"><a name="l09467"></a><span class="lineno"> 9467</span>&#160;        }</div>
+<div class="line"><a name="l09468"></a><span class="lineno"> 9468</span>&#160;    }</div>
+<div class="line"><a name="l09469"></a><span class="lineno"> 9469</span>&#160;}</div>
+<div class="line"><a name="l09470"></a><span class="lineno"> 9470</span>&#160; </div>
+<div class="line"><a name="l09471"></a><span class="lineno"> 9471</span>&#160;<span class="keywordtype">void</span> VmaBlockMetadata_Generic::AddPoolStats(<a class="code" href="struct_vma_pool_stats.html">VmaPoolStats</a>&amp; inoutStats)<span class="keyword"> const</span></div>
+<div class="line"><a name="l09472"></a><span class="lineno"> 9472</span>&#160;<span class="keyword"></span>{</div>
+<div class="line"><a name="l09473"></a><span class="lineno"> 9473</span>&#160;    <span class="keyword">const</span> uint32_t rangeCount = (uint32_t)m_Suballocations.size();</div>
+<div class="line"><a name="l09474"></a><span class="lineno"> 9474</span>&#160; </div>
+<div class="line"><a name="l09475"></a><span class="lineno"> 9475</span>&#160;    inoutStats.<a class="code" href="struct_vma_pool_stats.html#a326807b2de2b0931cee4ed9a5f2e420c">size</a> += GetSize();</div>
+<div class="line"><a name="l09476"></a><span class="lineno"> 9476</span>&#160;    inoutStats.<a class="code" href="struct_vma_pool_stats.html#ad7c54874724fce7b06aba526202d82a8">unusedSize</a> += m_SumFreeSize;</div>
+<div class="line"><a name="l09477"></a><span class="lineno"> 9477</span>&#160;    inoutStats.<a class="code" href="struct_vma_pool_stats.html#ad1924eb54fffa45e9e0e65670c8fe5eb">allocationCount</a> += rangeCount - m_FreeCount;</div>
+<div class="line"><a name="l09478"></a><span class="lineno"> 9478</span>&#160;    inoutStats.<a class="code" href="struct_vma_pool_stats.html#ae4f3546ffa4d1e598b64d8e6134854f4">unusedRangeCount</a> += m_FreeCount;</div>
+<div class="line"><a name="l09479"></a><span class="lineno"> 9479</span>&#160;    inoutStats.<a class="code" href="struct_vma_pool_stats.html#ab4c8f52dd42ab01998f60f0b6acc722b">unusedRangeSizeMax</a> = VMA_MAX(inoutStats.<a class="code" href="struct_vma_pool_stats.html#ab4c8f52dd42ab01998f60f0b6acc722b">unusedRangeSizeMax</a>, GetUnusedRangeSizeMax());</div>
+<div class="line"><a name="l09480"></a><span class="lineno"> 9480</span>&#160;}</div>
+<div class="line"><a name="l09481"></a><span class="lineno"> 9481</span>&#160; </div>
+<div class="line"><a name="l09482"></a><span class="lineno"> 9482</span>&#160;<span class="preprocessor">#if VMA_STATS_STRING_ENABLED</span></div>
+<div class="line"><a name="l09483"></a><span class="lineno"> 9483</span>&#160; </div>
+<div class="line"><a name="l09484"></a><span class="lineno"> 9484</span>&#160;<span class="keywordtype">void</span> VmaBlockMetadata_Generic::PrintDetailedMap(<span class="keyword">class</span> VmaJsonWriter&amp; json)<span class="keyword"> const</span></div>
+<div class="line"><a name="l09485"></a><span class="lineno"> 9485</span>&#160;<span class="keyword"></span>{</div>
+<div class="line"><a name="l09486"></a><span class="lineno"> 9486</span>&#160;    PrintDetailedMap_Begin(json,</div>
+<div class="line"><a name="l09487"></a><span class="lineno"> 9487</span>&#160;        m_SumFreeSize, <span class="comment">// unusedBytes</span></div>
+<div class="line"><a name="l09488"></a><span class="lineno"> 9488</span>&#160;        m_Suballocations.size() - (<span class="keywordtype">size_t</span>)m_FreeCount, <span class="comment">// allocationCount</span></div>
+<div class="line"><a name="l09489"></a><span class="lineno"> 9489</span>&#160;        m_FreeCount); <span class="comment">// unusedRangeCount</span></div>
+<div class="line"><a name="l09490"></a><span class="lineno"> 9490</span>&#160; </div>
+<div class="line"><a name="l09491"></a><span class="lineno"> 9491</span>&#160;    <span class="keywordtype">size_t</span> i = 0;</div>
+<div class="line"><a name="l09492"></a><span class="lineno"> 9492</span>&#160;    <span class="keywordflow">for</span>(VmaSuballocationList::const_iterator suballocItem = m_Suballocations.cbegin();</div>
+<div class="line"><a name="l09493"></a><span class="lineno"> 9493</span>&#160;        suballocItem != m_Suballocations.cend();</div>
+<div class="line"><a name="l09494"></a><span class="lineno"> 9494</span>&#160;        ++suballocItem, ++i)</div>
+<div class="line"><a name="l09495"></a><span class="lineno"> 9495</span>&#160;    {</div>
+<div class="line"><a name="l09496"></a><span class="lineno"> 9496</span>&#160;        <span class="keywordflow">if</span>(suballocItem-&gt;type == VMA_SUBALLOCATION_TYPE_FREE)</div>
+<div class="line"><a name="l09497"></a><span class="lineno"> 9497</span>&#160;        {</div>
+<div class="line"><a name="l09498"></a><span class="lineno"> 9498</span>&#160;            PrintDetailedMap_UnusedRange(json, suballocItem-&gt;offset, suballocItem-&gt;size);</div>
+<div class="line"><a name="l09499"></a><span class="lineno"> 9499</span>&#160;        }</div>
+<div class="line"><a name="l09500"></a><span class="lineno"> 9500</span>&#160;        <span class="keywordflow">else</span></div>
+<div class="line"><a name="l09501"></a><span class="lineno"> 9501</span>&#160;        {</div>
+<div class="line"><a name="l09502"></a><span class="lineno"> 9502</span>&#160;            PrintDetailedMap_Allocation(json, suballocItem-&gt;offset, suballocItem-&gt;hAllocation);</div>
+<div class="line"><a name="l09503"></a><span class="lineno"> 9503</span>&#160;        }</div>
+<div class="line"><a name="l09504"></a><span class="lineno"> 9504</span>&#160;    }</div>
+<div class="line"><a name="l09505"></a><span class="lineno"> 9505</span>&#160; </div>
+<div class="line"><a name="l09506"></a><span class="lineno"> 9506</span>&#160;    PrintDetailedMap_End(json);</div>
+<div class="line"><a name="l09507"></a><span class="lineno"> 9507</span>&#160;}</div>
+<div class="line"><a name="l09508"></a><span class="lineno"> 9508</span>&#160; </div>
+<div class="line"><a name="l09509"></a><span class="lineno"> 9509</span>&#160;<span class="preprocessor">#endif </span><span class="comment">// #if VMA_STATS_STRING_ENABLED</span></div>
+<div class="line"><a name="l09510"></a><span class="lineno"> 9510</span>&#160; </div>
+<div class="line"><a name="l09511"></a><span class="lineno"> 9511</span>&#160;<span class="keywordtype">bool</span> VmaBlockMetadata_Generic::CreateAllocationRequest(</div>
+<div class="line"><a name="l09512"></a><span class="lineno"> 9512</span>&#160;    uint32_t currentFrameIndex,</div>
+<div class="line"><a name="l09513"></a><span class="lineno"> 9513</span>&#160;    uint32_t frameInUseCount,</div>
+<div class="line"><a name="l09514"></a><span class="lineno"> 9514</span>&#160;    VkDeviceSize bufferImageGranularity,</div>
+<div class="line"><a name="l09515"></a><span class="lineno"> 9515</span>&#160;    VkDeviceSize allocSize,</div>
+<div class="line"><a name="l09516"></a><span class="lineno"> 9516</span>&#160;    VkDeviceSize allocAlignment,</div>
+<div class="line"><a name="l09517"></a><span class="lineno"> 9517</span>&#160;    <span class="keywordtype">bool</span> upperAddress,</div>
+<div class="line"><a name="l09518"></a><span class="lineno"> 9518</span>&#160;    VmaSuballocationType allocType,</div>
+<div class="line"><a name="l09519"></a><span class="lineno"> 9519</span>&#160;    <span class="keywordtype">bool</span> canMakeOtherLost,</div>
+<div class="line"><a name="l09520"></a><span class="lineno"> 9520</span>&#160;    uint32_t strategy,</div>
+<div class="line"><a name="l09521"></a><span class="lineno"> 9521</span>&#160;    VmaAllocationRequest* pAllocationRequest)</div>
+<div class="line"><a name="l09522"></a><span class="lineno"> 9522</span>&#160;{</div>
+<div class="line"><a name="l09523"></a><span class="lineno"> 9523</span>&#160;    VMA_ASSERT(allocSize &gt; 0);</div>
+<div class="line"><a name="l09524"></a><span class="lineno"> 9524</span>&#160;    VMA_ASSERT(!upperAddress);</div>
+<div class="line"><a name="l09525"></a><span class="lineno"> 9525</span>&#160;    VMA_ASSERT(allocType != VMA_SUBALLOCATION_TYPE_FREE);</div>
+<div class="line"><a name="l09526"></a><span class="lineno"> 9526</span>&#160;    VMA_ASSERT(pAllocationRequest != VMA_NULL);</div>
+<div class="line"><a name="l09527"></a><span class="lineno"> 9527</span>&#160;    VMA_HEAVY_ASSERT(Validate());</div>
+<div class="line"><a name="l09528"></a><span class="lineno"> 9528</span>&#160; </div>
+<div class="line"><a name="l09529"></a><span class="lineno"> 9529</span>&#160;    pAllocationRequest-&gt;type = VmaAllocationRequestType::Normal;</div>
+<div class="line"><a name="l09530"></a><span class="lineno"> 9530</span>&#160; </div>
+<div class="line"><a name="l09531"></a><span class="lineno"> 9531</span>&#160;    <span class="comment">// There is not enough total free space in this block to fullfill the request: Early return.</span></div>
+<div class="line"><a name="l09532"></a><span class="lineno"> 9532</span>&#160;    <span class="keywordflow">if</span>(canMakeOtherLost == <span class="keyword">false</span> &amp;&amp;</div>
+<div class="line"><a name="l09533"></a><span class="lineno"> 9533</span>&#160;        m_SumFreeSize &lt; allocSize + 2 * VMA_DEBUG_MARGIN)</div>
+<div class="line"><a name="l09534"></a><span class="lineno"> 9534</span>&#160;    {</div>
+<div class="line"><a name="l09535"></a><span class="lineno"> 9535</span>&#160;        <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
+<div class="line"><a name="l09536"></a><span class="lineno"> 9536</span>&#160;    }</div>
+<div class="line"><a name="l09537"></a><span class="lineno"> 9537</span>&#160; </div>
+<div class="line"><a name="l09538"></a><span class="lineno"> 9538</span>&#160;    <span class="comment">// New algorithm, efficiently searching freeSuballocationsBySize.</span></div>
+<div class="line"><a name="l09539"></a><span class="lineno"> 9539</span>&#160;    <span class="keyword">const</span> <span class="keywordtype">size_t</span> freeSuballocCount = m_FreeSuballocationsBySize.size();</div>
+<div class="line"><a name="l09540"></a><span class="lineno"> 9540</span>&#160;    <span class="keywordflow">if</span>(freeSuballocCount &gt; 0)</div>
+<div class="line"><a name="l09541"></a><span class="lineno"> 9541</span>&#160;    {</div>
+<div class="line"><a name="l09542"></a><span class="lineno"> 9542</span>&#160;        <span class="keywordflow">if</span>(strategy == <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a839826775c62319466441f86496f036d">VMA_ALLOCATION_CREATE_STRATEGY_BEST_FIT_BIT</a>)</div>
+<div class="line"><a name="l09543"></a><span class="lineno"> 9543</span>&#160;        {</div>
+<div class="line"><a name="l09544"></a><span class="lineno"> 9544</span>&#160;            <span class="comment">// Find first free suballocation with size not less than allocSize + 2 * VMA_DEBUG_MARGIN.</span></div>
+<div class="line"><a name="l09545"></a><span class="lineno"> 9545</span>&#160;            VmaSuballocationList::iterator* <span class="keyword">const</span> it = VmaBinaryFindFirstNotLess(</div>
+<div class="line"><a name="l09546"></a><span class="lineno"> 9546</span>&#160;                m_FreeSuballocationsBySize.data(),</div>
+<div class="line"><a name="l09547"></a><span class="lineno"> 9547</span>&#160;                m_FreeSuballocationsBySize.data() + freeSuballocCount,</div>
+<div class="line"><a name="l09548"></a><span class="lineno"> 9548</span>&#160;                allocSize + 2 * VMA_DEBUG_MARGIN,</div>
+<div class="line"><a name="l09549"></a><span class="lineno"> 9549</span>&#160;                VmaSuballocationItemSizeLess());</div>
+<div class="line"><a name="l09550"></a><span class="lineno"> 9550</span>&#160;            <span class="keywordtype">size_t</span> index = it - m_FreeSuballocationsBySize.data();</div>
+<div class="line"><a name="l09551"></a><span class="lineno"> 9551</span>&#160;            <span class="keywordflow">for</span>(; index &lt; freeSuballocCount; ++index)</div>
+<div class="line"><a name="l09552"></a><span class="lineno"> 9552</span>&#160;            {</div>
+<div class="line"><a name="l09553"></a><span class="lineno"> 9553</span>&#160;                <span class="keywordflow">if</span>(CheckAllocation(</div>
+<div class="line"><a name="l09554"></a><span class="lineno"> 9554</span>&#160;                    currentFrameIndex,</div>
+<div class="line"><a name="l09555"></a><span class="lineno"> 9555</span>&#160;                    frameInUseCount,</div>
+<div class="line"><a name="l09556"></a><span class="lineno"> 9556</span>&#160;                    bufferImageGranularity,</div>
+<div class="line"><a name="l09557"></a><span class="lineno"> 9557</span>&#160;                    allocSize,</div>
+<div class="line"><a name="l09558"></a><span class="lineno"> 9558</span>&#160;                    allocAlignment,</div>
+<div class="line"><a name="l09559"></a><span class="lineno"> 9559</span>&#160;                    allocType,</div>
+<div class="line"><a name="l09560"></a><span class="lineno"> 9560</span>&#160;                    m_FreeSuballocationsBySize[index],</div>
+<div class="line"><a name="l09561"></a><span class="lineno"> 9561</span>&#160;                    <span class="keyword">false</span>, <span class="comment">// canMakeOtherLost</span></div>
+<div class="line"><a name="l09562"></a><span class="lineno"> 9562</span>&#160;                    &amp;pAllocationRequest-&gt;offset,</div>
+<div class="line"><a name="l09563"></a><span class="lineno"> 9563</span>&#160;                    &amp;pAllocationRequest-&gt;itemsToMakeLostCount,</div>
+<div class="line"><a name="l09564"></a><span class="lineno"> 9564</span>&#160;                    &amp;pAllocationRequest-&gt;sumFreeSize,</div>
+<div class="line"><a name="l09565"></a><span class="lineno"> 9565</span>&#160;                    &amp;pAllocationRequest-&gt;sumItemSize))</div>
+<div class="line"><a name="l09566"></a><span class="lineno"> 9566</span>&#160;                {</div>
+<div class="line"><a name="l09567"></a><span class="lineno"> 9567</span>&#160;                    pAllocationRequest-&gt;item = m_FreeSuballocationsBySize[index];</div>
+<div class="line"><a name="l09568"></a><span class="lineno"> 9568</span>&#160;                    <span class="keywordflow">return</span> <span class="keyword">true</span>;</div>
+<div class="line"><a name="l09569"></a><span class="lineno"> 9569</span>&#160;                }</div>
+<div class="line"><a name="l09570"></a><span class="lineno"> 9570</span>&#160;            }</div>
+<div class="line"><a name="l09571"></a><span class="lineno"> 9571</span>&#160;        }</div>
+<div class="line"><a name="l09572"></a><span class="lineno"> 9572</span>&#160;        <span class="keywordflow">else</span> <span class="keywordflow">if</span>(strategy == VMA_ALLOCATION_INTERNAL_STRATEGY_MIN_OFFSET)</div>
+<div class="line"><a name="l09573"></a><span class="lineno"> 9573</span>&#160;        {</div>
+<div class="line"><a name="l09574"></a><span class="lineno"> 9574</span>&#160;            <span class="keywordflow">for</span>(VmaSuballocationList::iterator it = m_Suballocations.begin();</div>
+<div class="line"><a name="l09575"></a><span class="lineno"> 9575</span>&#160;                it != m_Suballocations.end();</div>
+<div class="line"><a name="l09576"></a><span class="lineno"> 9576</span>&#160;                ++it)</div>
+<div class="line"><a name="l09577"></a><span class="lineno"> 9577</span>&#160;            {</div>
+<div class="line"><a name="l09578"></a><span class="lineno"> 9578</span>&#160;                <span class="keywordflow">if</span>(it-&gt;type == VMA_SUBALLOCATION_TYPE_FREE &amp;&amp; CheckAllocation(</div>
+<div class="line"><a name="l09579"></a><span class="lineno"> 9579</span>&#160;                    currentFrameIndex,</div>
+<div class="line"><a name="l09580"></a><span class="lineno"> 9580</span>&#160;                    frameInUseCount,</div>
+<div class="line"><a name="l09581"></a><span class="lineno"> 9581</span>&#160;                    bufferImageGranularity,</div>
+<div class="line"><a name="l09582"></a><span class="lineno"> 9582</span>&#160;                    allocSize,</div>
+<div class="line"><a name="l09583"></a><span class="lineno"> 9583</span>&#160;                    allocAlignment,</div>
+<div class="line"><a name="l09584"></a><span class="lineno"> 9584</span>&#160;                    allocType,</div>
+<div class="line"><a name="l09585"></a><span class="lineno"> 9585</span>&#160;                    it,</div>
+<div class="line"><a name="l09586"></a><span class="lineno"> 9586</span>&#160;                    <span class="keyword">false</span>, <span class="comment">// canMakeOtherLost</span></div>
+<div class="line"><a name="l09587"></a><span class="lineno"> 9587</span>&#160;                    &amp;pAllocationRequest-&gt;offset,</div>
+<div class="line"><a name="l09588"></a><span class="lineno"> 9588</span>&#160;                    &amp;pAllocationRequest-&gt;itemsToMakeLostCount,</div>
+<div class="line"><a name="l09589"></a><span class="lineno"> 9589</span>&#160;                    &amp;pAllocationRequest-&gt;sumFreeSize,</div>
+<div class="line"><a name="l09590"></a><span class="lineno"> 9590</span>&#160;                    &amp;pAllocationRequest-&gt;sumItemSize))</div>
+<div class="line"><a name="l09591"></a><span class="lineno"> 9591</span>&#160;                {</div>
+<div class="line"><a name="l09592"></a><span class="lineno"> 9592</span>&#160;                    pAllocationRequest-&gt;item = it;</div>
+<div class="line"><a name="l09593"></a><span class="lineno"> 9593</span>&#160;                    <span class="keywordflow">return</span> <span class="keyword">true</span>;</div>
+<div class="line"><a name="l09594"></a><span class="lineno"> 9594</span>&#160;                }</div>
+<div class="line"><a name="l09595"></a><span class="lineno"> 9595</span>&#160;            }</div>
+<div class="line"><a name="l09596"></a><span class="lineno"> 9596</span>&#160;        }</div>
+<div class="line"><a name="l09597"></a><span class="lineno"> 9597</span>&#160;        <span class="keywordflow">else</span> <span class="comment">// WORST_FIT, FIRST_FIT</span></div>
+<div class="line"><a name="l09598"></a><span class="lineno"> 9598</span>&#160;        {</div>
+<div class="line"><a name="l09599"></a><span class="lineno"> 9599</span>&#160;            <span class="comment">// Search staring from biggest suballocations.</span></div>
+<div class="line"><a name="l09600"></a><span class="lineno"> 9600</span>&#160;            <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> index = freeSuballocCount; index--; )</div>
+<div class="line"><a name="l09601"></a><span class="lineno"> 9601</span>&#160;            {</div>
+<div class="line"><a name="l09602"></a><span class="lineno"> 9602</span>&#160;                <span class="keywordflow">if</span>(CheckAllocation(</div>
+<div class="line"><a name="l09603"></a><span class="lineno"> 9603</span>&#160;                    currentFrameIndex,</div>
+<div class="line"><a name="l09604"></a><span class="lineno"> 9604</span>&#160;                    frameInUseCount,</div>
+<div class="line"><a name="l09605"></a><span class="lineno"> 9605</span>&#160;                    bufferImageGranularity,</div>
+<div class="line"><a name="l09606"></a><span class="lineno"> 9606</span>&#160;                    allocSize,</div>
+<div class="line"><a name="l09607"></a><span class="lineno"> 9607</span>&#160;                    allocAlignment,</div>
+<div class="line"><a name="l09608"></a><span class="lineno"> 9608</span>&#160;                    allocType,</div>
+<div class="line"><a name="l09609"></a><span class="lineno"> 9609</span>&#160;                    m_FreeSuballocationsBySize[index],</div>
+<div class="line"><a name="l09610"></a><span class="lineno"> 9610</span>&#160;                    <span class="keyword">false</span>, <span class="comment">// canMakeOtherLost</span></div>
+<div class="line"><a name="l09611"></a><span class="lineno"> 9611</span>&#160;                    &amp;pAllocationRequest-&gt;offset,</div>
+<div class="line"><a name="l09612"></a><span class="lineno"> 9612</span>&#160;                    &amp;pAllocationRequest-&gt;itemsToMakeLostCount,</div>
+<div class="line"><a name="l09613"></a><span class="lineno"> 9613</span>&#160;                    &amp;pAllocationRequest-&gt;sumFreeSize,</div>
+<div class="line"><a name="l09614"></a><span class="lineno"> 9614</span>&#160;                    &amp;pAllocationRequest-&gt;sumItemSize))</div>
+<div class="line"><a name="l09615"></a><span class="lineno"> 9615</span>&#160;                {</div>
+<div class="line"><a name="l09616"></a><span class="lineno"> 9616</span>&#160;                    pAllocationRequest-&gt;item = m_FreeSuballocationsBySize[index];</div>
+<div class="line"><a name="l09617"></a><span class="lineno"> 9617</span>&#160;                    <span class="keywordflow">return</span> <span class="keyword">true</span>;</div>
+<div class="line"><a name="l09618"></a><span class="lineno"> 9618</span>&#160;                }</div>
+<div class="line"><a name="l09619"></a><span class="lineno"> 9619</span>&#160;            }</div>
+<div class="line"><a name="l09620"></a><span class="lineno"> 9620</span>&#160;        }</div>
+<div class="line"><a name="l09621"></a><span class="lineno"> 9621</span>&#160;    }</div>
+<div class="line"><a name="l09622"></a><span class="lineno"> 9622</span>&#160; </div>
+<div class="line"><a name="l09623"></a><span class="lineno"> 9623</span>&#160;    <span class="keywordflow">if</span>(canMakeOtherLost)</div>
+<div class="line"><a name="l09624"></a><span class="lineno"> 9624</span>&#160;    {</div>
+<div class="line"><a name="l09625"></a><span class="lineno"> 9625</span>&#160;        <span class="comment">// Brute-force algorithm. TODO: Come up with something better.</span></div>
+<div class="line"><a name="l09626"></a><span class="lineno"> 9626</span>&#160; </div>
+<div class="line"><a name="l09627"></a><span class="lineno"> 9627</span>&#160;        <span class="keywordtype">bool</span> found = <span class="keyword">false</span>;</div>
+<div class="line"><a name="l09628"></a><span class="lineno"> 9628</span>&#160;        VmaAllocationRequest tmpAllocRequest = {};</div>
+<div class="line"><a name="l09629"></a><span class="lineno"> 9629</span>&#160;        tmpAllocRequest.type = VmaAllocationRequestType::Normal;</div>
+<div class="line"><a name="l09630"></a><span class="lineno"> 9630</span>&#160;        <span class="keywordflow">for</span>(VmaSuballocationList::iterator suballocIt = m_Suballocations.begin();</div>
+<div class="line"><a name="l09631"></a><span class="lineno"> 9631</span>&#160;            suballocIt != m_Suballocations.end();</div>
+<div class="line"><a name="l09632"></a><span class="lineno"> 9632</span>&#160;            ++suballocIt)</div>
+<div class="line"><a name="l09633"></a><span class="lineno"> 9633</span>&#160;        {</div>
+<div class="line"><a name="l09634"></a><span class="lineno"> 9634</span>&#160;            <span class="keywordflow">if</span>(suballocIt-&gt;type == VMA_SUBALLOCATION_TYPE_FREE ||</div>
+<div class="line"><a name="l09635"></a><span class="lineno"> 9635</span>&#160;                suballocIt-&gt;hAllocation-&gt;CanBecomeLost())</div>
+<div class="line"><a name="l09636"></a><span class="lineno"> 9636</span>&#160;            {</div>
+<div class="line"><a name="l09637"></a><span class="lineno"> 9637</span>&#160;                <span class="keywordflow">if</span>(CheckAllocation(</div>
+<div class="line"><a name="l09638"></a><span class="lineno"> 9638</span>&#160;                    currentFrameIndex,</div>
+<div class="line"><a name="l09639"></a><span class="lineno"> 9639</span>&#160;                    frameInUseCount,</div>
+<div class="line"><a name="l09640"></a><span class="lineno"> 9640</span>&#160;                    bufferImageGranularity,</div>
+<div class="line"><a name="l09641"></a><span class="lineno"> 9641</span>&#160;                    allocSize,</div>
+<div class="line"><a name="l09642"></a><span class="lineno"> 9642</span>&#160;                    allocAlignment,</div>
+<div class="line"><a name="l09643"></a><span class="lineno"> 9643</span>&#160;                    allocType,</div>
+<div class="line"><a name="l09644"></a><span class="lineno"> 9644</span>&#160;                    suballocIt,</div>
+<div class="line"><a name="l09645"></a><span class="lineno"> 9645</span>&#160;                    canMakeOtherLost,</div>
+<div class="line"><a name="l09646"></a><span class="lineno"> 9646</span>&#160;                    &amp;tmpAllocRequest.offset,</div>
+<div class="line"><a name="l09647"></a><span class="lineno"> 9647</span>&#160;                    &amp;tmpAllocRequest.itemsToMakeLostCount,</div>
+<div class="line"><a name="l09648"></a><span class="lineno"> 9648</span>&#160;                    &amp;tmpAllocRequest.sumFreeSize,</div>
+<div class="line"><a name="l09649"></a><span class="lineno"> 9649</span>&#160;                    &amp;tmpAllocRequest.sumItemSize))</div>
+<div class="line"><a name="l09650"></a><span class="lineno"> 9650</span>&#160;                {</div>
+<div class="line"><a name="l09651"></a><span class="lineno"> 9651</span>&#160;                    <span class="keywordflow">if</span>(strategy == <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a33eb2052674f3ad92386c714a65fb777">VMA_ALLOCATION_CREATE_STRATEGY_FIRST_FIT_BIT</a>)</div>
+<div class="line"><a name="l09652"></a><span class="lineno"> 9652</span>&#160;                    {</div>
+<div class="line"><a name="l09653"></a><span class="lineno"> 9653</span>&#160;                        *pAllocationRequest = tmpAllocRequest;</div>
+<div class="line"><a name="l09654"></a><span class="lineno"> 9654</span>&#160;                        pAllocationRequest-&gt;item = suballocIt;</div>
+<div class="line"><a name="l09655"></a><span class="lineno"> 9655</span>&#160;                        <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l09656"></a><span class="lineno"> 9656</span>&#160;                    }</div>
+<div class="line"><a name="l09657"></a><span class="lineno"> 9657</span>&#160;                    <span class="keywordflow">if</span>(!found || tmpAllocRequest.CalcCost() &lt; pAllocationRequest-&gt;CalcCost())</div>
+<div class="line"><a name="l09658"></a><span class="lineno"> 9658</span>&#160;                    {</div>
+<div class="line"><a name="l09659"></a><span class="lineno"> 9659</span>&#160;                        *pAllocationRequest = tmpAllocRequest;</div>
+<div class="line"><a name="l09660"></a><span class="lineno"> 9660</span>&#160;                        pAllocationRequest-&gt;item = suballocIt;</div>
+<div class="line"><a name="l09661"></a><span class="lineno"> 9661</span>&#160;                        found = <span class="keyword">true</span>;</div>
+<div class="line"><a name="l09662"></a><span class="lineno"> 9662</span>&#160;                    }</div>
+<div class="line"><a name="l09663"></a><span class="lineno"> 9663</span>&#160;                }</div>
+<div class="line"><a name="l09664"></a><span class="lineno"> 9664</span>&#160;            }</div>
+<div class="line"><a name="l09665"></a><span class="lineno"> 9665</span>&#160;        }</div>
+<div class="line"><a name="l09666"></a><span class="lineno"> 9666</span>&#160; </div>
+<div class="line"><a name="l09667"></a><span class="lineno"> 9667</span>&#160;        <span class="keywordflow">return</span> found;</div>
+<div class="line"><a name="l09668"></a><span class="lineno"> 9668</span>&#160;    }</div>
+<div class="line"><a name="l09669"></a><span class="lineno"> 9669</span>&#160; </div>
+<div class="line"><a name="l09670"></a><span class="lineno"> 9670</span>&#160;    <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
+<div class="line"><a name="l09671"></a><span class="lineno"> 9671</span>&#160;}</div>
+<div class="line"><a name="l09672"></a><span class="lineno"> 9672</span>&#160; </div>
+<div class="line"><a name="l09673"></a><span class="lineno"> 9673</span>&#160;<span class="keywordtype">bool</span> VmaBlockMetadata_Generic::MakeRequestedAllocationsLost(</div>
+<div class="line"><a name="l09674"></a><span class="lineno"> 9674</span>&#160;    uint32_t currentFrameIndex,</div>
+<div class="line"><a name="l09675"></a><span class="lineno"> 9675</span>&#160;    uint32_t frameInUseCount,</div>
+<div class="line"><a name="l09676"></a><span class="lineno"> 9676</span>&#160;    VmaAllocationRequest* pAllocationRequest)</div>
+<div class="line"><a name="l09677"></a><span class="lineno"> 9677</span>&#160;{</div>
+<div class="line"><a name="l09678"></a><span class="lineno"> 9678</span>&#160;    VMA_ASSERT(pAllocationRequest &amp;&amp; pAllocationRequest-&gt;type == VmaAllocationRequestType::Normal);</div>
+<div class="line"><a name="l09679"></a><span class="lineno"> 9679</span>&#160; </div>
+<div class="line"><a name="l09680"></a><span class="lineno"> 9680</span>&#160;    <span class="keywordflow">while</span>(pAllocationRequest-&gt;itemsToMakeLostCount &gt; 0)</div>
+<div class="line"><a name="l09681"></a><span class="lineno"> 9681</span>&#160;    {</div>
+<div class="line"><a name="l09682"></a><span class="lineno"> 9682</span>&#160;        <span class="keywordflow">if</span>(pAllocationRequest-&gt;item-&gt;type == VMA_SUBALLOCATION_TYPE_FREE)</div>
+<div class="line"><a name="l09683"></a><span class="lineno"> 9683</span>&#160;        {</div>
+<div class="line"><a name="l09684"></a><span class="lineno"> 9684</span>&#160;            ++pAllocationRequest-&gt;item;</div>
+<div class="line"><a name="l09685"></a><span class="lineno"> 9685</span>&#160;        }</div>
+<div class="line"><a name="l09686"></a><span class="lineno"> 9686</span>&#160;        VMA_ASSERT(pAllocationRequest-&gt;item != m_Suballocations.end());</div>
+<div class="line"><a name="l09687"></a><span class="lineno"> 9687</span>&#160;        VMA_ASSERT(pAllocationRequest-&gt;item-&gt;hAllocation != VK_NULL_HANDLE);</div>
+<div class="line"><a name="l09688"></a><span class="lineno"> 9688</span>&#160;        VMA_ASSERT(pAllocationRequest-&gt;item-&gt;hAllocation-&gt;CanBecomeLost());</div>
+<div class="line"><a name="l09689"></a><span class="lineno"> 9689</span>&#160;        <span class="keywordflow">if</span>(pAllocationRequest-&gt;item-&gt;hAllocation-&gt;MakeLost(currentFrameIndex, frameInUseCount))</div>
+<div class="line"><a name="l09690"></a><span class="lineno"> 9690</span>&#160;        {</div>
+<div class="line"><a name="l09691"></a><span class="lineno"> 9691</span>&#160;            pAllocationRequest-&gt;item = FreeSuballocation(pAllocationRequest-&gt;item);</div>
+<div class="line"><a name="l09692"></a><span class="lineno"> 9692</span>&#160;            --pAllocationRequest-&gt;itemsToMakeLostCount;</div>
+<div class="line"><a name="l09693"></a><span class="lineno"> 9693</span>&#160;        }</div>
+<div class="line"><a name="l09694"></a><span class="lineno"> 9694</span>&#160;        <span class="keywordflow">else</span></div>
+<div class="line"><a name="l09695"></a><span class="lineno"> 9695</span>&#160;        {</div>
+<div class="line"><a name="l09696"></a><span class="lineno"> 9696</span>&#160;            <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
+<div class="line"><a name="l09697"></a><span class="lineno"> 9697</span>&#160;        }</div>
+<div class="line"><a name="l09698"></a><span class="lineno"> 9698</span>&#160;    }</div>
+<div class="line"><a name="l09699"></a><span class="lineno"> 9699</span>&#160; </div>
+<div class="line"><a name="l09700"></a><span class="lineno"> 9700</span>&#160;    VMA_HEAVY_ASSERT(Validate());</div>
+<div class="line"><a name="l09701"></a><span class="lineno"> 9701</span>&#160;    VMA_ASSERT(pAllocationRequest-&gt;item != m_Suballocations.end());</div>
+<div class="line"><a name="l09702"></a><span class="lineno"> 9702</span>&#160;    VMA_ASSERT(pAllocationRequest-&gt;item-&gt;type == VMA_SUBALLOCATION_TYPE_FREE);</div>
 <div class="line"><a name="l09703"></a><span class="lineno"> 9703</span>&#160; </div>
-<div class="line"><a name="l09704"></a><span class="lineno"> 9704</span>&#160;<span class="keywordtype">void</span> VmaBlockMetadata_Generic::RegisterFreeSuballocation(VmaSuballocationList::iterator item)</div>
-<div class="line"><a name="l09705"></a><span class="lineno"> 9705</span>&#160;{</div>
-<div class="line"><a name="l09706"></a><span class="lineno"> 9706</span>&#160;    VMA_ASSERT(item-&gt;type == VMA_SUBALLOCATION_TYPE_FREE);</div>
-<div class="line"><a name="l09707"></a><span class="lineno"> 9707</span>&#160;    VMA_ASSERT(item-&gt;size &gt; 0);</div>
-<div class="line"><a name="l09708"></a><span class="lineno"> 9708</span>&#160; </div>
-<div class="line"><a name="l09709"></a><span class="lineno"> 9709</span>&#160;    <span class="comment">// You may want to enable this validation at the beginning or at the end of</span></div>
-<div class="line"><a name="l09710"></a><span class="lineno"> 9710</span>&#160;    <span class="comment">// this function, depending on what do you want to check.</span></div>
-<div class="line"><a name="l09711"></a><span class="lineno"> 9711</span>&#160;    VMA_HEAVY_ASSERT(ValidateFreeSuballocationList());</div>
-<div class="line"><a name="l09712"></a><span class="lineno"> 9712</span>&#160; </div>
-<div class="line"><a name="l09713"></a><span class="lineno"> 9713</span>&#160;    <span class="keywordflow">if</span>(item-&gt;size &gt;= VMA_MIN_FREE_SUBALLOCATION_SIZE_TO_REGISTER)</div>
-<div class="line"><a name="l09714"></a><span class="lineno"> 9714</span>&#160;    {</div>
-<div class="line"><a name="l09715"></a><span class="lineno"> 9715</span>&#160;        <span class="keywordflow">if</span>(m_FreeSuballocationsBySize.empty())</div>
-<div class="line"><a name="l09716"></a><span class="lineno"> 9716</span>&#160;        {</div>
-<div class="line"><a name="l09717"></a><span class="lineno"> 9717</span>&#160;            m_FreeSuballocationsBySize.push_back(item);</div>
-<div class="line"><a name="l09718"></a><span class="lineno"> 9718</span>&#160;        }</div>
-<div class="line"><a name="l09719"></a><span class="lineno"> 9719</span>&#160;        <span class="keywordflow">else</span></div>
-<div class="line"><a name="l09720"></a><span class="lineno"> 9720</span>&#160;        {</div>
-<div class="line"><a name="l09721"></a><span class="lineno"> 9721</span>&#160;            VmaVectorInsertSorted&lt;VmaSuballocationItemSizeLess&gt;(m_FreeSuballocationsBySize, item);</div>
-<div class="line"><a name="l09722"></a><span class="lineno"> 9722</span>&#160;        }</div>
-<div class="line"><a name="l09723"></a><span class="lineno"> 9723</span>&#160;    }</div>
+<div class="line"><a name="l09704"></a><span class="lineno"> 9704</span>&#160;    <span class="keywordflow">return</span> <span class="keyword">true</span>;</div>
+<div class="line"><a name="l09705"></a><span class="lineno"> 9705</span>&#160;}</div>
+<div class="line"><a name="l09706"></a><span class="lineno"> 9706</span>&#160; </div>
+<div class="line"><a name="l09707"></a><span class="lineno"> 9707</span>&#160;uint32_t VmaBlockMetadata_Generic::MakeAllocationsLost(uint32_t currentFrameIndex, uint32_t frameInUseCount)</div>
+<div class="line"><a name="l09708"></a><span class="lineno"> 9708</span>&#160;{</div>
+<div class="line"><a name="l09709"></a><span class="lineno"> 9709</span>&#160;    uint32_t lostAllocationCount = 0;</div>
+<div class="line"><a name="l09710"></a><span class="lineno"> 9710</span>&#160;    <span class="keywordflow">for</span>(VmaSuballocationList::iterator it = m_Suballocations.begin();</div>
+<div class="line"><a name="l09711"></a><span class="lineno"> 9711</span>&#160;        it != m_Suballocations.end();</div>
+<div class="line"><a name="l09712"></a><span class="lineno"> 9712</span>&#160;        ++it)</div>
+<div class="line"><a name="l09713"></a><span class="lineno"> 9713</span>&#160;    {</div>
+<div class="line"><a name="l09714"></a><span class="lineno"> 9714</span>&#160;        <span class="keywordflow">if</span>(it-&gt;type != VMA_SUBALLOCATION_TYPE_FREE &amp;&amp;</div>
+<div class="line"><a name="l09715"></a><span class="lineno"> 9715</span>&#160;            it-&gt;hAllocation-&gt;CanBecomeLost() &amp;&amp;</div>
+<div class="line"><a name="l09716"></a><span class="lineno"> 9716</span>&#160;            it-&gt;hAllocation-&gt;MakeLost(currentFrameIndex, frameInUseCount))</div>
+<div class="line"><a name="l09717"></a><span class="lineno"> 9717</span>&#160;        {</div>
+<div class="line"><a name="l09718"></a><span class="lineno"> 9718</span>&#160;            it = FreeSuballocation(it);</div>
+<div class="line"><a name="l09719"></a><span class="lineno"> 9719</span>&#160;            ++lostAllocationCount;</div>
+<div class="line"><a name="l09720"></a><span class="lineno"> 9720</span>&#160;        }</div>
+<div class="line"><a name="l09721"></a><span class="lineno"> 9721</span>&#160;    }</div>
+<div class="line"><a name="l09722"></a><span class="lineno"> 9722</span>&#160;    <span class="keywordflow">return</span> lostAllocationCount;</div>
+<div class="line"><a name="l09723"></a><span class="lineno"> 9723</span>&#160;}</div>
 <div class="line"><a name="l09724"></a><span class="lineno"> 9724</span>&#160; </div>
-<div class="line"><a name="l09725"></a><span class="lineno"> 9725</span>&#160;    <span class="comment">//VMA_HEAVY_ASSERT(ValidateFreeSuballocationList());</span></div>
-<div class="line"><a name="l09726"></a><span class="lineno"> 9726</span>&#160;}</div>
-<div class="line"><a name="l09727"></a><span class="lineno"> 9727</span>&#160; </div>
-<div class="line"><a name="l09728"></a><span class="lineno"> 9728</span>&#160; </div>
-<div class="line"><a name="l09729"></a><span class="lineno"> 9729</span>&#160;<span class="keywordtype">void</span> VmaBlockMetadata_Generic::UnregisterFreeSuballocation(VmaSuballocationList::iterator item)</div>
-<div class="line"><a name="l09730"></a><span class="lineno"> 9730</span>&#160;{</div>
-<div class="line"><a name="l09731"></a><span class="lineno"> 9731</span>&#160;    VMA_ASSERT(item-&gt;type == VMA_SUBALLOCATION_TYPE_FREE);</div>
-<div class="line"><a name="l09732"></a><span class="lineno"> 9732</span>&#160;    VMA_ASSERT(item-&gt;size &gt; 0);</div>
-<div class="line"><a name="l09733"></a><span class="lineno"> 9733</span>&#160; </div>
-<div class="line"><a name="l09734"></a><span class="lineno"> 9734</span>&#160;    <span class="comment">// You may want to enable this validation at the beginning or at the end of</span></div>
-<div class="line"><a name="l09735"></a><span class="lineno"> 9735</span>&#160;    <span class="comment">// this function, depending on what do you want to check.</span></div>
-<div class="line"><a name="l09736"></a><span class="lineno"> 9736</span>&#160;    VMA_HEAVY_ASSERT(ValidateFreeSuballocationList());</div>
-<div class="line"><a name="l09737"></a><span class="lineno"> 9737</span>&#160; </div>
-<div class="line"><a name="l09738"></a><span class="lineno"> 9738</span>&#160;    <span class="keywordflow">if</span>(item-&gt;size &gt;= VMA_MIN_FREE_SUBALLOCATION_SIZE_TO_REGISTER)</div>
-<div class="line"><a name="l09739"></a><span class="lineno"> 9739</span>&#160;    {</div>
-<div class="line"><a name="l09740"></a><span class="lineno"> 9740</span>&#160;        VmaSuballocationList::iterator* <span class="keyword">const</span> it = VmaBinaryFindFirstNotLess(</div>
-<div class="line"><a name="l09741"></a><span class="lineno"> 9741</span>&#160;            m_FreeSuballocationsBySize.data(),</div>
-<div class="line"><a name="l09742"></a><span class="lineno"> 9742</span>&#160;            m_FreeSuballocationsBySize.data() + m_FreeSuballocationsBySize.size(),</div>
-<div class="line"><a name="l09743"></a><span class="lineno"> 9743</span>&#160;            item,</div>
-<div class="line"><a name="l09744"></a><span class="lineno"> 9744</span>&#160;            VmaSuballocationItemSizeLess());</div>
-<div class="line"><a name="l09745"></a><span class="lineno"> 9745</span>&#160;        <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> index = it - m_FreeSuballocationsBySize.data();</div>
-<div class="line"><a name="l09746"></a><span class="lineno"> 9746</span>&#160;            index &lt; m_FreeSuballocationsBySize.size();</div>
-<div class="line"><a name="l09747"></a><span class="lineno"> 9747</span>&#160;            ++index)</div>
-<div class="line"><a name="l09748"></a><span class="lineno"> 9748</span>&#160;        {</div>
-<div class="line"><a name="l09749"></a><span class="lineno"> 9749</span>&#160;            <span class="keywordflow">if</span>(m_FreeSuballocationsBySize[index] == item)</div>
-<div class="line"><a name="l09750"></a><span class="lineno"> 9750</span>&#160;            {</div>
-<div class="line"><a name="l09751"></a><span class="lineno"> 9751</span>&#160;                VmaVectorRemove(m_FreeSuballocationsBySize, index);</div>
-<div class="line"><a name="l09752"></a><span class="lineno"> 9752</span>&#160;                <span class="keywordflow">return</span>;</div>
-<div class="line"><a name="l09753"></a><span class="lineno"> 9753</span>&#160;            }</div>
-<div class="line"><a name="l09754"></a><span class="lineno"> 9754</span>&#160;            VMA_ASSERT((m_FreeSuballocationsBySize[index]-&gt;size == item-&gt;size) &amp;&amp; <span class="stringliteral">&quot;Not found.&quot;</span>);</div>
-<div class="line"><a name="l09755"></a><span class="lineno"> 9755</span>&#160;        }</div>
-<div class="line"><a name="l09756"></a><span class="lineno"> 9756</span>&#160;        VMA_ASSERT(0 &amp;&amp; <span class="stringliteral">&quot;Not found.&quot;</span>);</div>
-<div class="line"><a name="l09757"></a><span class="lineno"> 9757</span>&#160;    }</div>
-<div class="line"><a name="l09758"></a><span class="lineno"> 9758</span>&#160; </div>
-<div class="line"><a name="l09759"></a><span class="lineno"> 9759</span>&#160;    <span class="comment">//VMA_HEAVY_ASSERT(ValidateFreeSuballocationList());</span></div>
-<div class="line"><a name="l09760"></a><span class="lineno"> 9760</span>&#160;}</div>
-<div class="line"><a name="l09761"></a><span class="lineno"> 9761</span>&#160; </div>
-<div class="line"><a name="l09762"></a><span class="lineno"> 9762</span>&#160;<span class="keywordtype">bool</span> VmaBlockMetadata_Generic::IsBufferImageGranularityConflictPossible(</div>
-<div class="line"><a name="l09763"></a><span class="lineno"> 9763</span>&#160;    VkDeviceSize bufferImageGranularity,</div>
-<div class="line"><a name="l09764"></a><span class="lineno"> 9764</span>&#160;    VmaSuballocationType&amp; inOutPrevSuballocType)<span class="keyword"> const</span></div>
-<div class="line"><a name="l09765"></a><span class="lineno"> 9765</span>&#160;<span class="keyword"></span>{</div>
-<div class="line"><a name="l09766"></a><span class="lineno"> 9766</span>&#160;    <span class="keywordflow">if</span>(bufferImageGranularity == 1 || IsEmpty())</div>
-<div class="line"><a name="l09767"></a><span class="lineno"> 9767</span>&#160;    {</div>
-<div class="line"><a name="l09768"></a><span class="lineno"> 9768</span>&#160;        <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
-<div class="line"><a name="l09769"></a><span class="lineno"> 9769</span>&#160;    }</div>
-<div class="line"><a name="l09770"></a><span class="lineno"> 9770</span>&#160; </div>
-<div class="line"><a name="l09771"></a><span class="lineno"> 9771</span>&#160;    VkDeviceSize minAlignment = VK_WHOLE_SIZE;</div>
-<div class="line"><a name="l09772"></a><span class="lineno"> 9772</span>&#160;    <span class="keywordtype">bool</span> typeConflictFound = <span class="keyword">false</span>;</div>
-<div class="line"><a name="l09773"></a><span class="lineno"> 9773</span>&#160;    <span class="keywordflow">for</span>(VmaSuballocationList::const_iterator it = m_Suballocations.cbegin();</div>
-<div class="line"><a name="l09774"></a><span class="lineno"> 9774</span>&#160;        it != m_Suballocations.cend();</div>
-<div class="line"><a name="l09775"></a><span class="lineno"> 9775</span>&#160;        ++it)</div>
-<div class="line"><a name="l09776"></a><span class="lineno"> 9776</span>&#160;    {</div>
-<div class="line"><a name="l09777"></a><span class="lineno"> 9777</span>&#160;        <span class="keyword">const</span> VmaSuballocationType suballocType = it-&gt;type;</div>
-<div class="line"><a name="l09778"></a><span class="lineno"> 9778</span>&#160;        <span class="keywordflow">if</span>(suballocType != VMA_SUBALLOCATION_TYPE_FREE)</div>
-<div class="line"><a name="l09779"></a><span class="lineno"> 9779</span>&#160;        {</div>
-<div class="line"><a name="l09780"></a><span class="lineno"> 9780</span>&#160;            minAlignment = VMA_MIN(minAlignment, it-&gt;hAllocation-&gt;GetAlignment());</div>
-<div class="line"><a name="l09781"></a><span class="lineno"> 9781</span>&#160;            <span class="keywordflow">if</span>(VmaIsBufferImageGranularityConflict(inOutPrevSuballocType, suballocType))</div>
-<div class="line"><a name="l09782"></a><span class="lineno"> 9782</span>&#160;            {</div>
-<div class="line"><a name="l09783"></a><span class="lineno"> 9783</span>&#160;                typeConflictFound = <span class="keyword">true</span>;</div>
-<div class="line"><a name="l09784"></a><span class="lineno"> 9784</span>&#160;            }</div>
-<div class="line"><a name="l09785"></a><span class="lineno"> 9785</span>&#160;            inOutPrevSuballocType = suballocType;</div>
-<div class="line"><a name="l09786"></a><span class="lineno"> 9786</span>&#160;        }</div>
+<div class="line"><a name="l09725"></a><span class="lineno"> 9725</span>&#160;VkResult VmaBlockMetadata_Generic::CheckCorruption(<span class="keyword">const</span> <span class="keywordtype">void</span>* pBlockData)</div>
+<div class="line"><a name="l09726"></a><span class="lineno"> 9726</span>&#160;{</div>
+<div class="line"><a name="l09727"></a><span class="lineno"> 9727</span>&#160;    <span class="keywordflow">for</span>(VmaSuballocationList::iterator it = m_Suballocations.begin();</div>
+<div class="line"><a name="l09728"></a><span class="lineno"> 9728</span>&#160;        it != m_Suballocations.end();</div>
+<div class="line"><a name="l09729"></a><span class="lineno"> 9729</span>&#160;        ++it)</div>
+<div class="line"><a name="l09730"></a><span class="lineno"> 9730</span>&#160;    {</div>
+<div class="line"><a name="l09731"></a><span class="lineno"> 9731</span>&#160;        <span class="keywordflow">if</span>(it-&gt;type != VMA_SUBALLOCATION_TYPE_FREE)</div>
+<div class="line"><a name="l09732"></a><span class="lineno"> 9732</span>&#160;        {</div>
+<div class="line"><a name="l09733"></a><span class="lineno"> 9733</span>&#160;            <span class="keywordflow">if</span>(!VmaValidateMagicValue(pBlockData, it-&gt;offset - VMA_DEBUG_MARGIN))</div>
+<div class="line"><a name="l09734"></a><span class="lineno"> 9734</span>&#160;            {</div>
+<div class="line"><a name="l09735"></a><span class="lineno"> 9735</span>&#160;                VMA_ASSERT(0 &amp;&amp; <span class="stringliteral">&quot;MEMORY CORRUPTION DETECTED BEFORE VALIDATED ALLOCATION!&quot;</span>);</div>
+<div class="line"><a name="l09736"></a><span class="lineno"> 9736</span>&#160;                <span class="keywordflow">return</span> VK_ERROR_VALIDATION_FAILED_EXT;</div>
+<div class="line"><a name="l09737"></a><span class="lineno"> 9737</span>&#160;            }</div>
+<div class="line"><a name="l09738"></a><span class="lineno"> 9738</span>&#160;            <span class="keywordflow">if</span>(!VmaValidateMagicValue(pBlockData, it-&gt;offset + it-&gt;size))</div>
+<div class="line"><a name="l09739"></a><span class="lineno"> 9739</span>&#160;            {</div>
+<div class="line"><a name="l09740"></a><span class="lineno"> 9740</span>&#160;                VMA_ASSERT(0 &amp;&amp; <span class="stringliteral">&quot;MEMORY CORRUPTION DETECTED AFTER VALIDATED ALLOCATION!&quot;</span>);</div>
+<div class="line"><a name="l09741"></a><span class="lineno"> 9741</span>&#160;                <span class="keywordflow">return</span> VK_ERROR_VALIDATION_FAILED_EXT;</div>
+<div class="line"><a name="l09742"></a><span class="lineno"> 9742</span>&#160;            }</div>
+<div class="line"><a name="l09743"></a><span class="lineno"> 9743</span>&#160;        }</div>
+<div class="line"><a name="l09744"></a><span class="lineno"> 9744</span>&#160;    }</div>
+<div class="line"><a name="l09745"></a><span class="lineno"> 9745</span>&#160; </div>
+<div class="line"><a name="l09746"></a><span class="lineno"> 9746</span>&#160;    <span class="keywordflow">return</span> VK_SUCCESS;</div>
+<div class="line"><a name="l09747"></a><span class="lineno"> 9747</span>&#160;}</div>
+<div class="line"><a name="l09748"></a><span class="lineno"> 9748</span>&#160; </div>
+<div class="line"><a name="l09749"></a><span class="lineno"> 9749</span>&#160;<span class="keywordtype">void</span> VmaBlockMetadata_Generic::Alloc(</div>
+<div class="line"><a name="l09750"></a><span class="lineno"> 9750</span>&#160;    <span class="keyword">const</span> VmaAllocationRequest&amp; request,</div>
+<div class="line"><a name="l09751"></a><span class="lineno"> 9751</span>&#160;    VmaSuballocationType type,</div>
+<div class="line"><a name="l09752"></a><span class="lineno"> 9752</span>&#160;    VkDeviceSize allocSize,</div>
+<div class="line"><a name="l09753"></a><span class="lineno"> 9753</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> hAllocation)</div>
+<div class="line"><a name="l09754"></a><span class="lineno"> 9754</span>&#160;{</div>
+<div class="line"><a name="l09755"></a><span class="lineno"> 9755</span>&#160;    VMA_ASSERT(request.type == VmaAllocationRequestType::Normal);</div>
+<div class="line"><a name="l09756"></a><span class="lineno"> 9756</span>&#160;    VMA_ASSERT(request.item != m_Suballocations.end());</div>
+<div class="line"><a name="l09757"></a><span class="lineno"> 9757</span>&#160;    VmaSuballocation&amp; suballoc = *request.item;</div>
+<div class="line"><a name="l09758"></a><span class="lineno"> 9758</span>&#160;    <span class="comment">// Given suballocation is a free block.</span></div>
+<div class="line"><a name="l09759"></a><span class="lineno"> 9759</span>&#160;    VMA_ASSERT(suballoc.type == VMA_SUBALLOCATION_TYPE_FREE);</div>
+<div class="line"><a name="l09760"></a><span class="lineno"> 9760</span>&#160;    <span class="comment">// Given offset is inside this suballocation.</span></div>
+<div class="line"><a name="l09761"></a><span class="lineno"> 9761</span>&#160;    VMA_ASSERT(request.offset &gt;= suballoc.offset);</div>
+<div class="line"><a name="l09762"></a><span class="lineno"> 9762</span>&#160;    <span class="keyword">const</span> VkDeviceSize paddingBegin = request.offset - suballoc.offset;</div>
+<div class="line"><a name="l09763"></a><span class="lineno"> 9763</span>&#160;    VMA_ASSERT(suballoc.size &gt;= paddingBegin + allocSize);</div>
+<div class="line"><a name="l09764"></a><span class="lineno"> 9764</span>&#160;    <span class="keyword">const</span> VkDeviceSize paddingEnd = suballoc.size - paddingBegin - allocSize;</div>
+<div class="line"><a name="l09765"></a><span class="lineno"> 9765</span>&#160; </div>
+<div class="line"><a name="l09766"></a><span class="lineno"> 9766</span>&#160;    <span class="comment">// Unregister this free suballocation from m_FreeSuballocationsBySize and update</span></div>
+<div class="line"><a name="l09767"></a><span class="lineno"> 9767</span>&#160;    <span class="comment">// it to become used.</span></div>
+<div class="line"><a name="l09768"></a><span class="lineno"> 9768</span>&#160;    UnregisterFreeSuballocation(request.item);</div>
+<div class="line"><a name="l09769"></a><span class="lineno"> 9769</span>&#160; </div>
+<div class="line"><a name="l09770"></a><span class="lineno"> 9770</span>&#160;    suballoc.offset = request.offset;</div>
+<div class="line"><a name="l09771"></a><span class="lineno"> 9771</span>&#160;    suballoc.size = allocSize;</div>
+<div class="line"><a name="l09772"></a><span class="lineno"> 9772</span>&#160;    suballoc.type = type;</div>
+<div class="line"><a name="l09773"></a><span class="lineno"> 9773</span>&#160;    suballoc.hAllocation = hAllocation;</div>
+<div class="line"><a name="l09774"></a><span class="lineno"> 9774</span>&#160; </div>
+<div class="line"><a name="l09775"></a><span class="lineno"> 9775</span>&#160;    <span class="comment">// If there are any free bytes remaining at the end, insert new free suballocation after current one.</span></div>
+<div class="line"><a name="l09776"></a><span class="lineno"> 9776</span>&#160;    <span class="keywordflow">if</span>(paddingEnd)</div>
+<div class="line"><a name="l09777"></a><span class="lineno"> 9777</span>&#160;    {</div>
+<div class="line"><a name="l09778"></a><span class="lineno"> 9778</span>&#160;        VmaSuballocation paddingSuballoc = {};</div>
+<div class="line"><a name="l09779"></a><span class="lineno"> 9779</span>&#160;        paddingSuballoc.offset = request.offset + allocSize;</div>
+<div class="line"><a name="l09780"></a><span class="lineno"> 9780</span>&#160;        paddingSuballoc.size = paddingEnd;</div>
+<div class="line"><a name="l09781"></a><span class="lineno"> 9781</span>&#160;        paddingSuballoc.type = VMA_SUBALLOCATION_TYPE_FREE;</div>
+<div class="line"><a name="l09782"></a><span class="lineno"> 9782</span>&#160;        VmaSuballocationList::iterator next = request.item;</div>
+<div class="line"><a name="l09783"></a><span class="lineno"> 9783</span>&#160;        ++next;</div>
+<div class="line"><a name="l09784"></a><span class="lineno"> 9784</span>&#160;        <span class="keyword">const</span> VmaSuballocationList::iterator paddingEndItem =</div>
+<div class="line"><a name="l09785"></a><span class="lineno"> 9785</span>&#160;            m_Suballocations.insert(next, paddingSuballoc);</div>
+<div class="line"><a name="l09786"></a><span class="lineno"> 9786</span>&#160;        RegisterFreeSuballocation(paddingEndItem);</div>
 <div class="line"><a name="l09787"></a><span class="lineno"> 9787</span>&#160;    }</div>
 <div class="line"><a name="l09788"></a><span class="lineno"> 9788</span>&#160; </div>
-<div class="line"><a name="l09789"></a><span class="lineno"> 9789</span>&#160;    <span class="keywordflow">return</span> typeConflictFound || minAlignment &gt;= bufferImageGranularity;</div>
-<div class="line"><a name="l09790"></a><span class="lineno"> 9790</span>&#160;}</div>
-<div class="line"><a name="l09791"></a><span class="lineno"> 9791</span>&#160; </div>
-<div class="line"><a name="l09793"></a><span class="lineno"> 9793</span>&#160;<span class="comment">// class VmaBlockMetadata_Linear</span></div>
-<div class="line"><a name="l09794"></a><span class="lineno"> 9794</span>&#160; </div>
-<div class="line"><a name="l09795"></a><span class="lineno"> 9795</span>&#160;VmaBlockMetadata_Linear::VmaBlockMetadata_Linear(<a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator) :</div>
-<div class="line"><a name="l09796"></a><span class="lineno"> 9796</span>&#160;    VmaBlockMetadata(hAllocator),</div>
-<div class="line"><a name="l09797"></a><span class="lineno"> 9797</span>&#160;    m_SumFreeSize(0),</div>
-<div class="line"><a name="l09798"></a><span class="lineno"> 9798</span>&#160;    m_Suballocations0(VmaStlAllocator&lt;VmaSuballocation&gt;(hAllocator-&gt;GetAllocationCallbacks())),</div>
-<div class="line"><a name="l09799"></a><span class="lineno"> 9799</span>&#160;    m_Suballocations1(VmaStlAllocator&lt;VmaSuballocation&gt;(hAllocator-&gt;GetAllocationCallbacks())),</div>
-<div class="line"><a name="l09800"></a><span class="lineno"> 9800</span>&#160;    m_1stVectorIndex(0),</div>
-<div class="line"><a name="l09801"></a><span class="lineno"> 9801</span>&#160;    m_2ndVectorMode(SECOND_VECTOR_EMPTY),</div>
-<div class="line"><a name="l09802"></a><span class="lineno"> 9802</span>&#160;    m_1stNullItemsBeginCount(0),</div>
-<div class="line"><a name="l09803"></a><span class="lineno"> 9803</span>&#160;    m_1stNullItemsMiddleCount(0),</div>
-<div class="line"><a name="l09804"></a><span class="lineno"> 9804</span>&#160;    m_2ndNullItemsCount(0)</div>
-<div class="line"><a name="l09805"></a><span class="lineno"> 9805</span>&#160;{</div>
-<div class="line"><a name="l09806"></a><span class="lineno"> 9806</span>&#160;}</div>
-<div class="line"><a name="l09807"></a><span class="lineno"> 9807</span>&#160; </div>
-<div class="line"><a name="l09808"></a><span class="lineno"> 9808</span>&#160;VmaBlockMetadata_Linear::~VmaBlockMetadata_Linear()</div>
-<div class="line"><a name="l09809"></a><span class="lineno"> 9809</span>&#160;{</div>
-<div class="line"><a name="l09810"></a><span class="lineno"> 9810</span>&#160;}</div>
-<div class="line"><a name="l09811"></a><span class="lineno"> 9811</span>&#160; </div>
-<div class="line"><a name="l09812"></a><span class="lineno"> 9812</span>&#160;<span class="keywordtype">void</span> VmaBlockMetadata_Linear::Init(VkDeviceSize size)</div>
-<div class="line"><a name="l09813"></a><span class="lineno"> 9813</span>&#160;{</div>
-<div class="line"><a name="l09814"></a><span class="lineno"> 9814</span>&#160;    VmaBlockMetadata::Init(size);</div>
-<div class="line"><a name="l09815"></a><span class="lineno"> 9815</span>&#160;    m_SumFreeSize = size;</div>
-<div class="line"><a name="l09816"></a><span class="lineno"> 9816</span>&#160;}</div>
-<div class="line"><a name="l09817"></a><span class="lineno"> 9817</span>&#160; </div>
-<div class="line"><a name="l09818"></a><span class="lineno"> 9818</span>&#160;<span class="keywordtype">bool</span> VmaBlockMetadata_Linear::Validate()<span class="keyword"> const</span></div>
-<div class="line"><a name="l09819"></a><span class="lineno"> 9819</span>&#160;<span class="keyword"></span>{</div>
-<div class="line"><a name="l09820"></a><span class="lineno"> 9820</span>&#160;    <span class="keyword">const</span> SuballocationVectorType&amp; suballocations1st = AccessSuballocations1st();</div>
-<div class="line"><a name="l09821"></a><span class="lineno"> 9821</span>&#160;    <span class="keyword">const</span> SuballocationVectorType&amp; suballocations2nd = AccessSuballocations2nd();</div>
-<div class="line"><a name="l09822"></a><span class="lineno"> 9822</span>&#160; </div>
-<div class="line"><a name="l09823"></a><span class="lineno"> 9823</span>&#160;    VMA_VALIDATE(suballocations2nd.empty() == (m_2ndVectorMode == SECOND_VECTOR_EMPTY));</div>
-<div class="line"><a name="l09824"></a><span class="lineno"> 9824</span>&#160;    VMA_VALIDATE(!suballocations1st.empty() ||</div>
-<div class="line"><a name="l09825"></a><span class="lineno"> 9825</span>&#160;        suballocations2nd.empty() ||</div>
-<div class="line"><a name="l09826"></a><span class="lineno"> 9826</span>&#160;        m_2ndVectorMode != SECOND_VECTOR_RING_BUFFER);</div>
-<div class="line"><a name="l09827"></a><span class="lineno"> 9827</span>&#160; </div>
-<div class="line"><a name="l09828"></a><span class="lineno"> 9828</span>&#160;    <span class="keywordflow">if</span>(!suballocations1st.empty())</div>
-<div class="line"><a name="l09829"></a><span class="lineno"> 9829</span>&#160;    {</div>
-<div class="line"><a name="l09830"></a><span class="lineno"> 9830</span>&#160;        <span class="comment">// Null item at the beginning should be accounted into m_1stNullItemsBeginCount.</span></div>
-<div class="line"><a name="l09831"></a><span class="lineno"> 9831</span>&#160;        VMA_VALIDATE(suballocations1st[m_1stNullItemsBeginCount].hAllocation != VK_NULL_HANDLE);</div>
-<div class="line"><a name="l09832"></a><span class="lineno"> 9832</span>&#160;        <span class="comment">// Null item at the end should be just pop_back().</span></div>
-<div class="line"><a name="l09833"></a><span class="lineno"> 9833</span>&#160;        VMA_VALIDATE(suballocations1st.back().hAllocation != VK_NULL_HANDLE);</div>
-<div class="line"><a name="l09834"></a><span class="lineno"> 9834</span>&#160;    }</div>
-<div class="line"><a name="l09835"></a><span class="lineno"> 9835</span>&#160;    <span class="keywordflow">if</span>(!suballocations2nd.empty())</div>
+<div class="line"><a name="l09789"></a><span class="lineno"> 9789</span>&#160;    <span class="comment">// If there are any free bytes remaining at the beginning, insert new free suballocation before current one.</span></div>
+<div class="line"><a name="l09790"></a><span class="lineno"> 9790</span>&#160;    <span class="keywordflow">if</span>(paddingBegin)</div>
+<div class="line"><a name="l09791"></a><span class="lineno"> 9791</span>&#160;    {</div>
+<div class="line"><a name="l09792"></a><span class="lineno"> 9792</span>&#160;        VmaSuballocation paddingSuballoc = {};</div>
+<div class="line"><a name="l09793"></a><span class="lineno"> 9793</span>&#160;        paddingSuballoc.offset = request.offset - paddingBegin;</div>
+<div class="line"><a name="l09794"></a><span class="lineno"> 9794</span>&#160;        paddingSuballoc.size = paddingBegin;</div>
+<div class="line"><a name="l09795"></a><span class="lineno"> 9795</span>&#160;        paddingSuballoc.type = VMA_SUBALLOCATION_TYPE_FREE;</div>
+<div class="line"><a name="l09796"></a><span class="lineno"> 9796</span>&#160;        <span class="keyword">const</span> VmaSuballocationList::iterator paddingBeginItem =</div>
+<div class="line"><a name="l09797"></a><span class="lineno"> 9797</span>&#160;            m_Suballocations.insert(request.item, paddingSuballoc);</div>
+<div class="line"><a name="l09798"></a><span class="lineno"> 9798</span>&#160;        RegisterFreeSuballocation(paddingBeginItem);</div>
+<div class="line"><a name="l09799"></a><span class="lineno"> 9799</span>&#160;    }</div>
+<div class="line"><a name="l09800"></a><span class="lineno"> 9800</span>&#160; </div>
+<div class="line"><a name="l09801"></a><span class="lineno"> 9801</span>&#160;    <span class="comment">// Update totals.</span></div>
+<div class="line"><a name="l09802"></a><span class="lineno"> 9802</span>&#160;    m_FreeCount = m_FreeCount - 1;</div>
+<div class="line"><a name="l09803"></a><span class="lineno"> 9803</span>&#160;    <span class="keywordflow">if</span>(paddingBegin &gt; 0)</div>
+<div class="line"><a name="l09804"></a><span class="lineno"> 9804</span>&#160;    {</div>
+<div class="line"><a name="l09805"></a><span class="lineno"> 9805</span>&#160;        ++m_FreeCount;</div>
+<div class="line"><a name="l09806"></a><span class="lineno"> 9806</span>&#160;    }</div>
+<div class="line"><a name="l09807"></a><span class="lineno"> 9807</span>&#160;    <span class="keywordflow">if</span>(paddingEnd &gt; 0)</div>
+<div class="line"><a name="l09808"></a><span class="lineno"> 9808</span>&#160;    {</div>
+<div class="line"><a name="l09809"></a><span class="lineno"> 9809</span>&#160;        ++m_FreeCount;</div>
+<div class="line"><a name="l09810"></a><span class="lineno"> 9810</span>&#160;    }</div>
+<div class="line"><a name="l09811"></a><span class="lineno"> 9811</span>&#160;    m_SumFreeSize -= allocSize;</div>
+<div class="line"><a name="l09812"></a><span class="lineno"> 9812</span>&#160;}</div>
+<div class="line"><a name="l09813"></a><span class="lineno"> 9813</span>&#160; </div>
+<div class="line"><a name="l09814"></a><span class="lineno"> 9814</span>&#160;<span class="keywordtype">void</span> VmaBlockMetadata_Generic::Free(<span class="keyword">const</span> <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation)</div>
+<div class="line"><a name="l09815"></a><span class="lineno"> 9815</span>&#160;{</div>
+<div class="line"><a name="l09816"></a><span class="lineno"> 9816</span>&#160;    <span class="keywordflow">for</span>(VmaSuballocationList::iterator suballocItem = m_Suballocations.begin();</div>
+<div class="line"><a name="l09817"></a><span class="lineno"> 9817</span>&#160;        suballocItem != m_Suballocations.end();</div>
+<div class="line"><a name="l09818"></a><span class="lineno"> 9818</span>&#160;        ++suballocItem)</div>
+<div class="line"><a name="l09819"></a><span class="lineno"> 9819</span>&#160;    {</div>
+<div class="line"><a name="l09820"></a><span class="lineno"> 9820</span>&#160;        VmaSuballocation&amp; suballoc = *suballocItem;</div>
+<div class="line"><a name="l09821"></a><span class="lineno"> 9821</span>&#160;        <span class="keywordflow">if</span>(suballoc.hAllocation == allocation)</div>
+<div class="line"><a name="l09822"></a><span class="lineno"> 9822</span>&#160;        {</div>
+<div class="line"><a name="l09823"></a><span class="lineno"> 9823</span>&#160;            FreeSuballocation(suballocItem);</div>
+<div class="line"><a name="l09824"></a><span class="lineno"> 9824</span>&#160;            VMA_HEAVY_ASSERT(Validate());</div>
+<div class="line"><a name="l09825"></a><span class="lineno"> 9825</span>&#160;            <span class="keywordflow">return</span>;</div>
+<div class="line"><a name="l09826"></a><span class="lineno"> 9826</span>&#160;        }</div>
+<div class="line"><a name="l09827"></a><span class="lineno"> 9827</span>&#160;    }</div>
+<div class="line"><a name="l09828"></a><span class="lineno"> 9828</span>&#160;    VMA_ASSERT(0 &amp;&amp; <span class="stringliteral">&quot;Not found!&quot;</span>);</div>
+<div class="line"><a name="l09829"></a><span class="lineno"> 9829</span>&#160;}</div>
+<div class="line"><a name="l09830"></a><span class="lineno"> 9830</span>&#160; </div>
+<div class="line"><a name="l09831"></a><span class="lineno"> 9831</span>&#160;<span class="keywordtype">void</span> VmaBlockMetadata_Generic::FreeAtOffset(VkDeviceSize offset)</div>
+<div class="line"><a name="l09832"></a><span class="lineno"> 9832</span>&#160;{</div>
+<div class="line"><a name="l09833"></a><span class="lineno"> 9833</span>&#160;    <span class="keywordflow">for</span>(VmaSuballocationList::iterator suballocItem = m_Suballocations.begin();</div>
+<div class="line"><a name="l09834"></a><span class="lineno"> 9834</span>&#160;        suballocItem != m_Suballocations.end();</div>
+<div class="line"><a name="l09835"></a><span class="lineno"> 9835</span>&#160;        ++suballocItem)</div>
 <div class="line"><a name="l09836"></a><span class="lineno"> 9836</span>&#160;    {</div>
-<div class="line"><a name="l09837"></a><span class="lineno"> 9837</span>&#160;        <span class="comment">// Null item at the end should be just pop_back().</span></div>
-<div class="line"><a name="l09838"></a><span class="lineno"> 9838</span>&#160;        VMA_VALIDATE(suballocations2nd.back().hAllocation != VK_NULL_HANDLE);</div>
-<div class="line"><a name="l09839"></a><span class="lineno"> 9839</span>&#160;    }</div>
-<div class="line"><a name="l09840"></a><span class="lineno"> 9840</span>&#160; </div>
-<div class="line"><a name="l09841"></a><span class="lineno"> 9841</span>&#160;    VMA_VALIDATE(m_1stNullItemsBeginCount + m_1stNullItemsMiddleCount &lt;= suballocations1st.size());</div>
-<div class="line"><a name="l09842"></a><span class="lineno"> 9842</span>&#160;    VMA_VALIDATE(m_2ndNullItemsCount &lt;= suballocations2nd.size());</div>
-<div class="line"><a name="l09843"></a><span class="lineno"> 9843</span>&#160; </div>
-<div class="line"><a name="l09844"></a><span class="lineno"> 9844</span>&#160;    VkDeviceSize sumUsedSize = 0;</div>
-<div class="line"><a name="l09845"></a><span class="lineno"> 9845</span>&#160;    <span class="keyword">const</span> <span class="keywordtype">size_t</span> suballoc1stCount = suballocations1st.size();</div>
-<div class="line"><a name="l09846"></a><span class="lineno"> 9846</span>&#160;    VkDeviceSize offset = VMA_DEBUG_MARGIN;</div>
-<div class="line"><a name="l09847"></a><span class="lineno"> 9847</span>&#160; </div>
-<div class="line"><a name="l09848"></a><span class="lineno"> 9848</span>&#160;    <span class="keywordflow">if</span>(m_2ndVectorMode == SECOND_VECTOR_RING_BUFFER)</div>
-<div class="line"><a name="l09849"></a><span class="lineno"> 9849</span>&#160;    {</div>
-<div class="line"><a name="l09850"></a><span class="lineno"> 9850</span>&#160;        <span class="keyword">const</span> <span class="keywordtype">size_t</span> suballoc2ndCount = suballocations2nd.size();</div>
-<div class="line"><a name="l09851"></a><span class="lineno"> 9851</span>&#160;        <span class="keywordtype">size_t</span> nullItem2ndCount = 0;</div>
-<div class="line"><a name="l09852"></a><span class="lineno"> 9852</span>&#160;        <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> i = 0; i &lt; suballoc2ndCount; ++i)</div>
-<div class="line"><a name="l09853"></a><span class="lineno"> 9853</span>&#160;        {</div>
-<div class="line"><a name="l09854"></a><span class="lineno"> 9854</span>&#160;            <span class="keyword">const</span> VmaSuballocation&amp; suballoc = suballocations2nd[i];</div>
-<div class="line"><a name="l09855"></a><span class="lineno"> 9855</span>&#160;            <span class="keyword">const</span> <span class="keywordtype">bool</span> currFree = (suballoc.type == VMA_SUBALLOCATION_TYPE_FREE);</div>
-<div class="line"><a name="l09856"></a><span class="lineno"> 9856</span>&#160; </div>
-<div class="line"><a name="l09857"></a><span class="lineno"> 9857</span>&#160;            VMA_VALIDATE(currFree == (suballoc.hAllocation == VK_NULL_HANDLE));</div>
-<div class="line"><a name="l09858"></a><span class="lineno"> 9858</span>&#160;            VMA_VALIDATE(suballoc.offset &gt;= offset);</div>
-<div class="line"><a name="l09859"></a><span class="lineno"> 9859</span>&#160; </div>
-<div class="line"><a name="l09860"></a><span class="lineno"> 9860</span>&#160;            <span class="keywordflow">if</span>(!currFree)</div>
-<div class="line"><a name="l09861"></a><span class="lineno"> 9861</span>&#160;            {</div>
-<div class="line"><a name="l09862"></a><span class="lineno"> 9862</span>&#160;                VMA_VALIDATE(suballoc.hAllocation-&gt;GetOffset() == suballoc.offset);</div>
-<div class="line"><a name="l09863"></a><span class="lineno"> 9863</span>&#160;                VMA_VALIDATE(suballoc.hAllocation-&gt;GetSize() == suballoc.size);</div>
-<div class="line"><a name="l09864"></a><span class="lineno"> 9864</span>&#160;                sumUsedSize += suballoc.size;</div>
-<div class="line"><a name="l09865"></a><span class="lineno"> 9865</span>&#160;            }</div>
-<div class="line"><a name="l09866"></a><span class="lineno"> 9866</span>&#160;            <span class="keywordflow">else</span></div>
-<div class="line"><a name="l09867"></a><span class="lineno"> 9867</span>&#160;            {</div>
-<div class="line"><a name="l09868"></a><span class="lineno"> 9868</span>&#160;                ++nullItem2ndCount;</div>
-<div class="line"><a name="l09869"></a><span class="lineno"> 9869</span>&#160;            }</div>
-<div class="line"><a name="l09870"></a><span class="lineno"> 9870</span>&#160; </div>
-<div class="line"><a name="l09871"></a><span class="lineno"> 9871</span>&#160;            offset = suballoc.offset + suballoc.size + VMA_DEBUG_MARGIN;</div>
-<div class="line"><a name="l09872"></a><span class="lineno"> 9872</span>&#160;        }</div>
-<div class="line"><a name="l09873"></a><span class="lineno"> 9873</span>&#160; </div>
-<div class="line"><a name="l09874"></a><span class="lineno"> 9874</span>&#160;        VMA_VALIDATE(nullItem2ndCount == m_2ndNullItemsCount);</div>
-<div class="line"><a name="l09875"></a><span class="lineno"> 9875</span>&#160;    }</div>
-<div class="line"><a name="l09876"></a><span class="lineno"> 9876</span>&#160; </div>
-<div class="line"><a name="l09877"></a><span class="lineno"> 9877</span>&#160;    <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> i = 0; i &lt; m_1stNullItemsBeginCount; ++i)</div>
-<div class="line"><a name="l09878"></a><span class="lineno"> 9878</span>&#160;    {</div>
-<div class="line"><a name="l09879"></a><span class="lineno"> 9879</span>&#160;        <span class="keyword">const</span> VmaSuballocation&amp; suballoc = suballocations1st[i];</div>
-<div class="line"><a name="l09880"></a><span class="lineno"> 9880</span>&#160;        VMA_VALIDATE(suballoc.type == VMA_SUBALLOCATION_TYPE_FREE &amp;&amp;</div>
-<div class="line"><a name="l09881"></a><span class="lineno"> 9881</span>&#160;            suballoc.hAllocation == VK_NULL_HANDLE);</div>
-<div class="line"><a name="l09882"></a><span class="lineno"> 9882</span>&#160;    }</div>
-<div class="line"><a name="l09883"></a><span class="lineno"> 9883</span>&#160; </div>
-<div class="line"><a name="l09884"></a><span class="lineno"> 9884</span>&#160;    <span class="keywordtype">size_t</span> nullItem1stCount = m_1stNullItemsBeginCount;</div>
-<div class="line"><a name="l09885"></a><span class="lineno"> 9885</span>&#160; </div>
-<div class="line"><a name="l09886"></a><span class="lineno"> 9886</span>&#160;    <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> i = m_1stNullItemsBeginCount; i &lt; suballoc1stCount; ++i)</div>
-<div class="line"><a name="l09887"></a><span class="lineno"> 9887</span>&#160;    {</div>
-<div class="line"><a name="l09888"></a><span class="lineno"> 9888</span>&#160;        <span class="keyword">const</span> VmaSuballocation&amp; suballoc = suballocations1st[i];</div>
-<div class="line"><a name="l09889"></a><span class="lineno"> 9889</span>&#160;        <span class="keyword">const</span> <span class="keywordtype">bool</span> currFree = (suballoc.type == VMA_SUBALLOCATION_TYPE_FREE);</div>
-<div class="line"><a name="l09890"></a><span class="lineno"> 9890</span>&#160; </div>
-<div class="line"><a name="l09891"></a><span class="lineno"> 9891</span>&#160;        VMA_VALIDATE(currFree == (suballoc.hAllocation == VK_NULL_HANDLE));</div>
-<div class="line"><a name="l09892"></a><span class="lineno"> 9892</span>&#160;        VMA_VALIDATE(suballoc.offset &gt;= offset);</div>
-<div class="line"><a name="l09893"></a><span class="lineno"> 9893</span>&#160;        VMA_VALIDATE(i &gt;= m_1stNullItemsBeginCount || currFree);</div>
-<div class="line"><a name="l09894"></a><span class="lineno"> 9894</span>&#160; </div>
-<div class="line"><a name="l09895"></a><span class="lineno"> 9895</span>&#160;        <span class="keywordflow">if</span>(!currFree)</div>
-<div class="line"><a name="l09896"></a><span class="lineno"> 9896</span>&#160;        {</div>
-<div class="line"><a name="l09897"></a><span class="lineno"> 9897</span>&#160;            VMA_VALIDATE(suballoc.hAllocation-&gt;GetOffset() == suballoc.offset);</div>
-<div class="line"><a name="l09898"></a><span class="lineno"> 9898</span>&#160;            VMA_VALIDATE(suballoc.hAllocation-&gt;GetSize() == suballoc.size);</div>
-<div class="line"><a name="l09899"></a><span class="lineno"> 9899</span>&#160;            sumUsedSize += suballoc.size;</div>
-<div class="line"><a name="l09900"></a><span class="lineno"> 9900</span>&#160;        }</div>
-<div class="line"><a name="l09901"></a><span class="lineno"> 9901</span>&#160;        <span class="keywordflow">else</span></div>
-<div class="line"><a name="l09902"></a><span class="lineno"> 9902</span>&#160;        {</div>
-<div class="line"><a name="l09903"></a><span class="lineno"> 9903</span>&#160;            ++nullItem1stCount;</div>
-<div class="line"><a name="l09904"></a><span class="lineno"> 9904</span>&#160;        }</div>
-<div class="line"><a name="l09905"></a><span class="lineno"> 9905</span>&#160; </div>
-<div class="line"><a name="l09906"></a><span class="lineno"> 9906</span>&#160;        offset = suballoc.offset + suballoc.size + VMA_DEBUG_MARGIN;</div>
-<div class="line"><a name="l09907"></a><span class="lineno"> 9907</span>&#160;    }</div>
-<div class="line"><a name="l09908"></a><span class="lineno"> 9908</span>&#160;    VMA_VALIDATE(nullItem1stCount == m_1stNullItemsBeginCount + m_1stNullItemsMiddleCount);</div>
-<div class="line"><a name="l09909"></a><span class="lineno"> 9909</span>&#160; </div>
-<div class="line"><a name="l09910"></a><span class="lineno"> 9910</span>&#160;    <span class="keywordflow">if</span>(m_2ndVectorMode == SECOND_VECTOR_DOUBLE_STACK)</div>
-<div class="line"><a name="l09911"></a><span class="lineno"> 9911</span>&#160;    {</div>
-<div class="line"><a name="l09912"></a><span class="lineno"> 9912</span>&#160;        <span class="keyword">const</span> <span class="keywordtype">size_t</span> suballoc2ndCount = suballocations2nd.size();</div>
-<div class="line"><a name="l09913"></a><span class="lineno"> 9913</span>&#160;        <span class="keywordtype">size_t</span> nullItem2ndCount = 0;</div>
-<div class="line"><a name="l09914"></a><span class="lineno"> 9914</span>&#160;        <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> i = suballoc2ndCount; i--; )</div>
-<div class="line"><a name="l09915"></a><span class="lineno"> 9915</span>&#160;        {</div>
-<div class="line"><a name="l09916"></a><span class="lineno"> 9916</span>&#160;            <span class="keyword">const</span> VmaSuballocation&amp; suballoc = suballocations2nd[i];</div>
-<div class="line"><a name="l09917"></a><span class="lineno"> 9917</span>&#160;            <span class="keyword">const</span> <span class="keywordtype">bool</span> currFree = (suballoc.type == VMA_SUBALLOCATION_TYPE_FREE);</div>
-<div class="line"><a name="l09918"></a><span class="lineno"> 9918</span>&#160; </div>
-<div class="line"><a name="l09919"></a><span class="lineno"> 9919</span>&#160;            VMA_VALIDATE(currFree == (suballoc.hAllocation == VK_NULL_HANDLE));</div>
-<div class="line"><a name="l09920"></a><span class="lineno"> 9920</span>&#160;            VMA_VALIDATE(suballoc.offset &gt;= offset);</div>
-<div class="line"><a name="l09921"></a><span class="lineno"> 9921</span>&#160; </div>
-<div class="line"><a name="l09922"></a><span class="lineno"> 9922</span>&#160;            <span class="keywordflow">if</span>(!currFree)</div>
-<div class="line"><a name="l09923"></a><span class="lineno"> 9923</span>&#160;            {</div>
-<div class="line"><a name="l09924"></a><span class="lineno"> 9924</span>&#160;                VMA_VALIDATE(suballoc.hAllocation-&gt;GetOffset() == suballoc.offset);</div>
-<div class="line"><a name="l09925"></a><span class="lineno"> 9925</span>&#160;                VMA_VALIDATE(suballoc.hAllocation-&gt;GetSize() == suballoc.size);</div>
-<div class="line"><a name="l09926"></a><span class="lineno"> 9926</span>&#160;                sumUsedSize += suballoc.size;</div>
-<div class="line"><a name="l09927"></a><span class="lineno"> 9927</span>&#160;            }</div>
-<div class="line"><a name="l09928"></a><span class="lineno"> 9928</span>&#160;            <span class="keywordflow">else</span></div>
-<div class="line"><a name="l09929"></a><span class="lineno"> 9929</span>&#160;            {</div>
-<div class="line"><a name="l09930"></a><span class="lineno"> 9930</span>&#160;                ++nullItem2ndCount;</div>
-<div class="line"><a name="l09931"></a><span class="lineno"> 9931</span>&#160;            }</div>
-<div class="line"><a name="l09932"></a><span class="lineno"> 9932</span>&#160; </div>
-<div class="line"><a name="l09933"></a><span class="lineno"> 9933</span>&#160;            offset = suballoc.offset + suballoc.size + VMA_DEBUG_MARGIN;</div>
-<div class="line"><a name="l09934"></a><span class="lineno"> 9934</span>&#160;        }</div>
-<div class="line"><a name="l09935"></a><span class="lineno"> 9935</span>&#160; </div>
-<div class="line"><a name="l09936"></a><span class="lineno"> 9936</span>&#160;        VMA_VALIDATE(nullItem2ndCount == m_2ndNullItemsCount);</div>
-<div class="line"><a name="l09937"></a><span class="lineno"> 9937</span>&#160;    }</div>
-<div class="line"><a name="l09938"></a><span class="lineno"> 9938</span>&#160; </div>
-<div class="line"><a name="l09939"></a><span class="lineno"> 9939</span>&#160;    VMA_VALIDATE(offset &lt;= GetSize());</div>
-<div class="line"><a name="l09940"></a><span class="lineno"> 9940</span>&#160;    VMA_VALIDATE(m_SumFreeSize == GetSize() - sumUsedSize);</div>
-<div class="line"><a name="l09941"></a><span class="lineno"> 9941</span>&#160; </div>
-<div class="line"><a name="l09942"></a><span class="lineno"> 9942</span>&#160;    <span class="keywordflow">return</span> <span class="keyword">true</span>;</div>
-<div class="line"><a name="l09943"></a><span class="lineno"> 9943</span>&#160;}</div>
-<div class="line"><a name="l09944"></a><span class="lineno"> 9944</span>&#160; </div>
-<div class="line"><a name="l09945"></a><span class="lineno"> 9945</span>&#160;<span class="keywordtype">size_t</span> VmaBlockMetadata_Linear::GetAllocationCount()<span class="keyword"> const</span></div>
-<div class="line"><a name="l09946"></a><span class="lineno"> 9946</span>&#160;<span class="keyword"></span>{</div>
-<div class="line"><a name="l09947"></a><span class="lineno"> 9947</span>&#160;    <span class="keywordflow">return</span> AccessSuballocations1st().size() - (m_1stNullItemsBeginCount + m_1stNullItemsMiddleCount) +</div>
-<div class="line"><a name="l09948"></a><span class="lineno"> 9948</span>&#160;        AccessSuballocations2nd().size() - m_2ndNullItemsCount;</div>
-<div class="line"><a name="l09949"></a><span class="lineno"> 9949</span>&#160;}</div>
+<div class="line"><a name="l09837"></a><span class="lineno"> 9837</span>&#160;        VmaSuballocation&amp; suballoc = *suballocItem;</div>
+<div class="line"><a name="l09838"></a><span class="lineno"> 9838</span>&#160;        <span class="keywordflow">if</span>(suballoc.offset == offset)</div>
+<div class="line"><a name="l09839"></a><span class="lineno"> 9839</span>&#160;        {</div>
+<div class="line"><a name="l09840"></a><span class="lineno"> 9840</span>&#160;            FreeSuballocation(suballocItem);</div>
+<div class="line"><a name="l09841"></a><span class="lineno"> 9841</span>&#160;            <span class="keywordflow">return</span>;</div>
+<div class="line"><a name="l09842"></a><span class="lineno"> 9842</span>&#160;        }</div>
+<div class="line"><a name="l09843"></a><span class="lineno"> 9843</span>&#160;    }</div>
+<div class="line"><a name="l09844"></a><span class="lineno"> 9844</span>&#160;    VMA_ASSERT(0 &amp;&amp; <span class="stringliteral">&quot;Not found!&quot;</span>);</div>
+<div class="line"><a name="l09845"></a><span class="lineno"> 9845</span>&#160;}</div>
+<div class="line"><a name="l09846"></a><span class="lineno"> 9846</span>&#160; </div>
+<div class="line"><a name="l09847"></a><span class="lineno"> 9847</span>&#160;<span class="keywordtype">bool</span> VmaBlockMetadata_Generic::ValidateFreeSuballocationList()<span class="keyword"> const</span></div>
+<div class="line"><a name="l09848"></a><span class="lineno"> 9848</span>&#160;<span class="keyword"></span>{</div>
+<div class="line"><a name="l09849"></a><span class="lineno"> 9849</span>&#160;    VkDeviceSize lastSize = 0;</div>
+<div class="line"><a name="l09850"></a><span class="lineno"> 9850</span>&#160;    <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> i = 0, count = m_FreeSuballocationsBySize.size(); i &lt; count; ++i)</div>
+<div class="line"><a name="l09851"></a><span class="lineno"> 9851</span>&#160;    {</div>
+<div class="line"><a name="l09852"></a><span class="lineno"> 9852</span>&#160;        <span class="keyword">const</span> VmaSuballocationList::iterator it = m_FreeSuballocationsBySize[i];</div>
+<div class="line"><a name="l09853"></a><span class="lineno"> 9853</span>&#160; </div>
+<div class="line"><a name="l09854"></a><span class="lineno"> 9854</span>&#160;        VMA_VALIDATE(it-&gt;type == VMA_SUBALLOCATION_TYPE_FREE);</div>
+<div class="line"><a name="l09855"></a><span class="lineno"> 9855</span>&#160;        VMA_VALIDATE(it-&gt;size &gt;= VMA_MIN_FREE_SUBALLOCATION_SIZE_TO_REGISTER);</div>
+<div class="line"><a name="l09856"></a><span class="lineno"> 9856</span>&#160;        VMA_VALIDATE(it-&gt;size &gt;= lastSize);</div>
+<div class="line"><a name="l09857"></a><span class="lineno"> 9857</span>&#160;        lastSize = it-&gt;size;</div>
+<div class="line"><a name="l09858"></a><span class="lineno"> 9858</span>&#160;    }</div>
+<div class="line"><a name="l09859"></a><span class="lineno"> 9859</span>&#160;    <span class="keywordflow">return</span> <span class="keyword">true</span>;</div>
+<div class="line"><a name="l09860"></a><span class="lineno"> 9860</span>&#160;}</div>
+<div class="line"><a name="l09861"></a><span class="lineno"> 9861</span>&#160; </div>
+<div class="line"><a name="l09862"></a><span class="lineno"> 9862</span>&#160;<span class="keywordtype">bool</span> VmaBlockMetadata_Generic::CheckAllocation(</div>
+<div class="line"><a name="l09863"></a><span class="lineno"> 9863</span>&#160;    uint32_t currentFrameIndex,</div>
+<div class="line"><a name="l09864"></a><span class="lineno"> 9864</span>&#160;    uint32_t frameInUseCount,</div>
+<div class="line"><a name="l09865"></a><span class="lineno"> 9865</span>&#160;    VkDeviceSize bufferImageGranularity,</div>
+<div class="line"><a name="l09866"></a><span class="lineno"> 9866</span>&#160;    VkDeviceSize allocSize,</div>
+<div class="line"><a name="l09867"></a><span class="lineno"> 9867</span>&#160;    VkDeviceSize allocAlignment,</div>
+<div class="line"><a name="l09868"></a><span class="lineno"> 9868</span>&#160;    VmaSuballocationType allocType,</div>
+<div class="line"><a name="l09869"></a><span class="lineno"> 9869</span>&#160;    VmaSuballocationList::const_iterator suballocItem,</div>
+<div class="line"><a name="l09870"></a><span class="lineno"> 9870</span>&#160;    <span class="keywordtype">bool</span> canMakeOtherLost,</div>
+<div class="line"><a name="l09871"></a><span class="lineno"> 9871</span>&#160;    VkDeviceSize* pOffset,</div>
+<div class="line"><a name="l09872"></a><span class="lineno"> 9872</span>&#160;    <span class="keywordtype">size_t</span>* itemsToMakeLostCount,</div>
+<div class="line"><a name="l09873"></a><span class="lineno"> 9873</span>&#160;    VkDeviceSize* pSumFreeSize,</div>
+<div class="line"><a name="l09874"></a><span class="lineno"> 9874</span>&#160;    VkDeviceSize* pSumItemSize)<span class="keyword"> const</span></div>
+<div class="line"><a name="l09875"></a><span class="lineno"> 9875</span>&#160;<span class="keyword"></span>{</div>
+<div class="line"><a name="l09876"></a><span class="lineno"> 9876</span>&#160;    VMA_ASSERT(allocSize &gt; 0);</div>
+<div class="line"><a name="l09877"></a><span class="lineno"> 9877</span>&#160;    VMA_ASSERT(allocType != VMA_SUBALLOCATION_TYPE_FREE);</div>
+<div class="line"><a name="l09878"></a><span class="lineno"> 9878</span>&#160;    VMA_ASSERT(suballocItem != m_Suballocations.cend());</div>
+<div class="line"><a name="l09879"></a><span class="lineno"> 9879</span>&#160;    VMA_ASSERT(pOffset != VMA_NULL);</div>
+<div class="line"><a name="l09880"></a><span class="lineno"> 9880</span>&#160; </div>
+<div class="line"><a name="l09881"></a><span class="lineno"> 9881</span>&#160;    *itemsToMakeLostCount = 0;</div>
+<div class="line"><a name="l09882"></a><span class="lineno"> 9882</span>&#160;    *pSumFreeSize = 0;</div>
+<div class="line"><a name="l09883"></a><span class="lineno"> 9883</span>&#160;    *pSumItemSize = 0;</div>
+<div class="line"><a name="l09884"></a><span class="lineno"> 9884</span>&#160; </div>
+<div class="line"><a name="l09885"></a><span class="lineno"> 9885</span>&#160;    <span class="keywordflow">if</span>(canMakeOtherLost)</div>
+<div class="line"><a name="l09886"></a><span class="lineno"> 9886</span>&#160;    {</div>
+<div class="line"><a name="l09887"></a><span class="lineno"> 9887</span>&#160;        <span class="keywordflow">if</span>(suballocItem-&gt;type == VMA_SUBALLOCATION_TYPE_FREE)</div>
+<div class="line"><a name="l09888"></a><span class="lineno"> 9888</span>&#160;        {</div>
+<div class="line"><a name="l09889"></a><span class="lineno"> 9889</span>&#160;            *pSumFreeSize = suballocItem-&gt;size;</div>
+<div class="line"><a name="l09890"></a><span class="lineno"> 9890</span>&#160;        }</div>
+<div class="line"><a name="l09891"></a><span class="lineno"> 9891</span>&#160;        <span class="keywordflow">else</span></div>
+<div class="line"><a name="l09892"></a><span class="lineno"> 9892</span>&#160;        {</div>
+<div class="line"><a name="l09893"></a><span class="lineno"> 9893</span>&#160;            <span class="keywordflow">if</span>(suballocItem-&gt;hAllocation-&gt;CanBecomeLost() &amp;&amp;</div>
+<div class="line"><a name="l09894"></a><span class="lineno"> 9894</span>&#160;                suballocItem-&gt;hAllocation-&gt;GetLastUseFrameIndex() + frameInUseCount &lt; currentFrameIndex)</div>
+<div class="line"><a name="l09895"></a><span class="lineno"> 9895</span>&#160;            {</div>
+<div class="line"><a name="l09896"></a><span class="lineno"> 9896</span>&#160;                ++*itemsToMakeLostCount;</div>
+<div class="line"><a name="l09897"></a><span class="lineno"> 9897</span>&#160;                *pSumItemSize = suballocItem-&gt;size;</div>
+<div class="line"><a name="l09898"></a><span class="lineno"> 9898</span>&#160;            }</div>
+<div class="line"><a name="l09899"></a><span class="lineno"> 9899</span>&#160;            <span class="keywordflow">else</span></div>
+<div class="line"><a name="l09900"></a><span class="lineno"> 9900</span>&#160;            {</div>
+<div class="line"><a name="l09901"></a><span class="lineno"> 9901</span>&#160;                <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
+<div class="line"><a name="l09902"></a><span class="lineno"> 9902</span>&#160;            }</div>
+<div class="line"><a name="l09903"></a><span class="lineno"> 9903</span>&#160;        }</div>
+<div class="line"><a name="l09904"></a><span class="lineno"> 9904</span>&#160; </div>
+<div class="line"><a name="l09905"></a><span class="lineno"> 9905</span>&#160;        <span class="comment">// Remaining size is too small for this request: Early return.</span></div>
+<div class="line"><a name="l09906"></a><span class="lineno"> 9906</span>&#160;        <span class="keywordflow">if</span>(GetSize() - suballocItem-&gt;offset &lt; allocSize)</div>
+<div class="line"><a name="l09907"></a><span class="lineno"> 9907</span>&#160;        {</div>
+<div class="line"><a name="l09908"></a><span class="lineno"> 9908</span>&#160;            <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
+<div class="line"><a name="l09909"></a><span class="lineno"> 9909</span>&#160;        }</div>
+<div class="line"><a name="l09910"></a><span class="lineno"> 9910</span>&#160; </div>
+<div class="line"><a name="l09911"></a><span class="lineno"> 9911</span>&#160;        <span class="comment">// Start from offset equal to beginning of this suballocation.</span></div>
+<div class="line"><a name="l09912"></a><span class="lineno"> 9912</span>&#160;        *pOffset = suballocItem-&gt;offset;</div>
+<div class="line"><a name="l09913"></a><span class="lineno"> 9913</span>&#160; </div>
+<div class="line"><a name="l09914"></a><span class="lineno"> 9914</span>&#160;        <span class="comment">// Apply VMA_DEBUG_MARGIN at the beginning.</span></div>
+<div class="line"><a name="l09915"></a><span class="lineno"> 9915</span>&#160;        <span class="keywordflow">if</span>(VMA_DEBUG_MARGIN &gt; 0)</div>
+<div class="line"><a name="l09916"></a><span class="lineno"> 9916</span>&#160;        {</div>
+<div class="line"><a name="l09917"></a><span class="lineno"> 9917</span>&#160;            *pOffset += VMA_DEBUG_MARGIN;</div>
+<div class="line"><a name="l09918"></a><span class="lineno"> 9918</span>&#160;        }</div>
+<div class="line"><a name="l09919"></a><span class="lineno"> 9919</span>&#160; </div>
+<div class="line"><a name="l09920"></a><span class="lineno"> 9920</span>&#160;        <span class="comment">// Apply alignment.</span></div>
+<div class="line"><a name="l09921"></a><span class="lineno"> 9921</span>&#160;        *pOffset = VmaAlignUp(*pOffset, allocAlignment);</div>
+<div class="line"><a name="l09922"></a><span class="lineno"> 9922</span>&#160; </div>
+<div class="line"><a name="l09923"></a><span class="lineno"> 9923</span>&#160;        <span class="comment">// Check previous suballocations for BufferImageGranularity conflicts.</span></div>
+<div class="line"><a name="l09924"></a><span class="lineno"> 9924</span>&#160;        <span class="comment">// Make bigger alignment if necessary.</span></div>
+<div class="line"><a name="l09925"></a><span class="lineno"> 9925</span>&#160;        <span class="keywordflow">if</span>(bufferImageGranularity &gt; 1 &amp;&amp; bufferImageGranularity != allocAlignment)</div>
+<div class="line"><a name="l09926"></a><span class="lineno"> 9926</span>&#160;        {</div>
+<div class="line"><a name="l09927"></a><span class="lineno"> 9927</span>&#160;            <span class="keywordtype">bool</span> bufferImageGranularityConflict = <span class="keyword">false</span>;</div>
+<div class="line"><a name="l09928"></a><span class="lineno"> 9928</span>&#160;            VmaSuballocationList::const_iterator prevSuballocItem = suballocItem;</div>
+<div class="line"><a name="l09929"></a><span class="lineno"> 9929</span>&#160;            <span class="keywordflow">while</span>(prevSuballocItem != m_Suballocations.cbegin())</div>
+<div class="line"><a name="l09930"></a><span class="lineno"> 9930</span>&#160;            {</div>
+<div class="line"><a name="l09931"></a><span class="lineno"> 9931</span>&#160;                --prevSuballocItem;</div>
+<div class="line"><a name="l09932"></a><span class="lineno"> 9932</span>&#160;                <span class="keyword">const</span> VmaSuballocation&amp; prevSuballoc = *prevSuballocItem;</div>
+<div class="line"><a name="l09933"></a><span class="lineno"> 9933</span>&#160;                <span class="keywordflow">if</span>(VmaBlocksOnSamePage(prevSuballoc.offset, prevSuballoc.size, *pOffset, bufferImageGranularity))</div>
+<div class="line"><a name="l09934"></a><span class="lineno"> 9934</span>&#160;                {</div>
+<div class="line"><a name="l09935"></a><span class="lineno"> 9935</span>&#160;                    <span class="keywordflow">if</span>(VmaIsBufferImageGranularityConflict(prevSuballoc.type, allocType))</div>
+<div class="line"><a name="l09936"></a><span class="lineno"> 9936</span>&#160;                    {</div>
+<div class="line"><a name="l09937"></a><span class="lineno"> 9937</span>&#160;                        bufferImageGranularityConflict = <span class="keyword">true</span>;</div>
+<div class="line"><a name="l09938"></a><span class="lineno"> 9938</span>&#160;                        <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l09939"></a><span class="lineno"> 9939</span>&#160;                    }</div>
+<div class="line"><a name="l09940"></a><span class="lineno"> 9940</span>&#160;                }</div>
+<div class="line"><a name="l09941"></a><span class="lineno"> 9941</span>&#160;                <span class="keywordflow">else</span></div>
+<div class="line"><a name="l09942"></a><span class="lineno"> 9942</span>&#160;                    <span class="comment">// Already on previous page.</span></div>
+<div class="line"><a name="l09943"></a><span class="lineno"> 9943</span>&#160;                    <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l09944"></a><span class="lineno"> 9944</span>&#160;            }</div>
+<div class="line"><a name="l09945"></a><span class="lineno"> 9945</span>&#160;            <span class="keywordflow">if</span>(bufferImageGranularityConflict)</div>
+<div class="line"><a name="l09946"></a><span class="lineno"> 9946</span>&#160;            {</div>
+<div class="line"><a name="l09947"></a><span class="lineno"> 9947</span>&#160;                *pOffset = VmaAlignUp(*pOffset, bufferImageGranularity);</div>
+<div class="line"><a name="l09948"></a><span class="lineno"> 9948</span>&#160;            }</div>
+<div class="line"><a name="l09949"></a><span class="lineno"> 9949</span>&#160;        }</div>
 <div class="line"><a name="l09950"></a><span class="lineno"> 9950</span>&#160; </div>
-<div class="line"><a name="l09951"></a><span class="lineno"> 9951</span>&#160;VkDeviceSize VmaBlockMetadata_Linear::GetUnusedRangeSizeMax()<span class="keyword"> const</span></div>
-<div class="line"><a name="l09952"></a><span class="lineno"> 9952</span>&#160;<span class="keyword"></span>{</div>
-<div class="line"><a name="l09953"></a><span class="lineno"> 9953</span>&#160;    <span class="keyword">const</span> VkDeviceSize size = GetSize();</div>
-<div class="line"><a name="l09954"></a><span class="lineno"> 9954</span>&#160; </div>
-<div class="line"><a name="l09955"></a><span class="lineno"> 9955</span>&#160;    <span class="comment">/*</span></div>
-<div class="line"><a name="l09956"></a><span class="lineno"> 9956</span>&#160;<span class="comment">    We don&#39;t consider gaps inside allocation vectors with freed allocations because</span></div>
-<div class="line"><a name="l09957"></a><span class="lineno"> 9957</span>&#160;<span class="comment">    they are not suitable for reuse in linear allocator. We consider only space that</span></div>
-<div class="line"><a name="l09958"></a><span class="lineno"> 9958</span>&#160;<span class="comment">    is available for new allocations.</span></div>
-<div class="line"><a name="l09959"></a><span class="lineno"> 9959</span>&#160;<span class="comment">    */</span></div>
-<div class="line"><a name="l09960"></a><span class="lineno"> 9960</span>&#160;    <span class="keywordflow">if</span>(IsEmpty())</div>
-<div class="line"><a name="l09961"></a><span class="lineno"> 9961</span>&#160;    {</div>
-<div class="line"><a name="l09962"></a><span class="lineno"> 9962</span>&#160;        <span class="keywordflow">return</span> size;</div>
-<div class="line"><a name="l09963"></a><span class="lineno"> 9963</span>&#160;    }</div>
-<div class="line"><a name="l09964"></a><span class="lineno"> 9964</span>&#160;    </div>
-<div class="line"><a name="l09965"></a><span class="lineno"> 9965</span>&#160;    <span class="keyword">const</span> SuballocationVectorType&amp; suballocations1st = AccessSuballocations1st();</div>
-<div class="line"><a name="l09966"></a><span class="lineno"> 9966</span>&#160; </div>
-<div class="line"><a name="l09967"></a><span class="lineno"> 9967</span>&#160;    <span class="keywordflow">switch</span>(m_2ndVectorMode)</div>
-<div class="line"><a name="l09968"></a><span class="lineno"> 9968</span>&#160;    {</div>
-<div class="line"><a name="l09969"></a><span class="lineno"> 9969</span>&#160;    <span class="keywordflow">case</span> SECOND_VECTOR_EMPTY:</div>
-<div class="line"><a name="l09970"></a><span class="lineno"> 9970</span>&#160;        <span class="comment">/*</span></div>
-<div class="line"><a name="l09971"></a><span class="lineno"> 9971</span>&#160;<span class="comment">        Available space is after end of 1st, as well as before beginning of 1st (which</span></div>
-<div class="line"><a name="l09972"></a><span class="lineno"> 9972</span>&#160;<span class="comment">        whould make it a ring buffer).</span></div>
-<div class="line"><a name="l09973"></a><span class="lineno"> 9973</span>&#160;<span class="comment">        */</span></div>
-<div class="line"><a name="l09974"></a><span class="lineno"> 9974</span>&#160;        {</div>
-<div class="line"><a name="l09975"></a><span class="lineno"> 9975</span>&#160;            <span class="keyword">const</span> <span class="keywordtype">size_t</span> suballocations1stCount = suballocations1st.size();</div>
-<div class="line"><a name="l09976"></a><span class="lineno"> 9976</span>&#160;            VMA_ASSERT(suballocations1stCount &gt; m_1stNullItemsBeginCount);</div>
-<div class="line"><a name="l09977"></a><span class="lineno"> 9977</span>&#160;            <span class="keyword">const</span> VmaSuballocation&amp; firstSuballoc = suballocations1st[m_1stNullItemsBeginCount];</div>
-<div class="line"><a name="l09978"></a><span class="lineno"> 9978</span>&#160;            <span class="keyword">const</span> VmaSuballocation&amp; lastSuballoc  = suballocations1st[suballocations1stCount - 1];</div>
-<div class="line"><a name="l09979"></a><span class="lineno"> 9979</span>&#160;            <span class="keywordflow">return</span> VMA_MAX(</div>
-<div class="line"><a name="l09980"></a><span class="lineno"> 9980</span>&#160;                firstSuballoc.offset,</div>
-<div class="line"><a name="l09981"></a><span class="lineno"> 9981</span>&#160;                size - (lastSuballoc.offset + lastSuballoc.size));</div>
-<div class="line"><a name="l09982"></a><span class="lineno"> 9982</span>&#160;        }</div>
-<div class="line"><a name="l09983"></a><span class="lineno"> 9983</span>&#160;        <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l09984"></a><span class="lineno"> 9984</span>&#160; </div>
-<div class="line"><a name="l09985"></a><span class="lineno"> 9985</span>&#160;    <span class="keywordflow">case</span> SECOND_VECTOR_RING_BUFFER:</div>
-<div class="line"><a name="l09986"></a><span class="lineno"> 9986</span>&#160;        <span class="comment">/*</span></div>
-<div class="line"><a name="l09987"></a><span class="lineno"> 9987</span>&#160;<span class="comment">        Available space is only between end of 2nd and beginning of 1st.</span></div>
-<div class="line"><a name="l09988"></a><span class="lineno"> 9988</span>&#160;<span class="comment">        */</span></div>
-<div class="line"><a name="l09989"></a><span class="lineno"> 9989</span>&#160;        {</div>
-<div class="line"><a name="l09990"></a><span class="lineno"> 9990</span>&#160;            <span class="keyword">const</span> SuballocationVectorType&amp; suballocations2nd = AccessSuballocations2nd();</div>
-<div class="line"><a name="l09991"></a><span class="lineno"> 9991</span>&#160;            <span class="keyword">const</span> VmaSuballocation&amp; lastSuballoc2nd = suballocations2nd.back();</div>
-<div class="line"><a name="l09992"></a><span class="lineno"> 9992</span>&#160;            <span class="keyword">const</span> VmaSuballocation&amp; firstSuballoc1st = suballocations1st[m_1stNullItemsBeginCount];</div>
-<div class="line"><a name="l09993"></a><span class="lineno"> 9993</span>&#160;            <span class="keywordflow">return</span> firstSuballoc1st.offset - (lastSuballoc2nd.offset + lastSuballoc2nd.size);</div>
-<div class="line"><a name="l09994"></a><span class="lineno"> 9994</span>&#160;        }</div>
-<div class="line"><a name="l09995"></a><span class="lineno"> 9995</span>&#160;        <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l09996"></a><span class="lineno"> 9996</span>&#160; </div>
-<div class="line"><a name="l09997"></a><span class="lineno"> 9997</span>&#160;    <span class="keywordflow">case</span> SECOND_VECTOR_DOUBLE_STACK:</div>
-<div class="line"><a name="l09998"></a><span class="lineno"> 9998</span>&#160;        <span class="comment">/*</span></div>
-<div class="line"><a name="l09999"></a><span class="lineno"> 9999</span>&#160;<span class="comment">        Available space is only between end of 1st and top of 2nd.</span></div>
-<div class="line"><a name="l10000"></a><span class="lineno">10000</span>&#160;<span class="comment">        */</span></div>
-<div class="line"><a name="l10001"></a><span class="lineno">10001</span>&#160;        {</div>
-<div class="line"><a name="l10002"></a><span class="lineno">10002</span>&#160;            <span class="keyword">const</span> SuballocationVectorType&amp; suballocations2nd = AccessSuballocations2nd();</div>
-<div class="line"><a name="l10003"></a><span class="lineno">10003</span>&#160;            <span class="keyword">const</span> VmaSuballocation&amp; topSuballoc2nd = suballocations2nd.back();</div>
-<div class="line"><a name="l10004"></a><span class="lineno">10004</span>&#160;            <span class="keyword">const</span> VmaSuballocation&amp; lastSuballoc1st = suballocations1st.back();</div>
-<div class="line"><a name="l10005"></a><span class="lineno">10005</span>&#160;            <span class="keywordflow">return</span> topSuballoc2nd.offset - (lastSuballoc1st.offset + lastSuballoc1st.size);</div>
-<div class="line"><a name="l10006"></a><span class="lineno">10006</span>&#160;        }</div>
-<div class="line"><a name="l10007"></a><span class="lineno">10007</span>&#160;        <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l10008"></a><span class="lineno">10008</span>&#160; </div>
-<div class="line"><a name="l10009"></a><span class="lineno">10009</span>&#160;    <span class="keywordflow">default</span>:</div>
-<div class="line"><a name="l10010"></a><span class="lineno">10010</span>&#160;        VMA_ASSERT(0);</div>
-<div class="line"><a name="l10011"></a><span class="lineno">10011</span>&#160;        <span class="keywordflow">return</span> 0;</div>
-<div class="line"><a name="l10012"></a><span class="lineno">10012</span>&#160;    }</div>
-<div class="line"><a name="l10013"></a><span class="lineno">10013</span>&#160;}</div>
-<div class="line"><a name="l10014"></a><span class="lineno">10014</span>&#160; </div>
-<div class="line"><a name="l10015"></a><span class="lineno">10015</span>&#160;<span class="keywordtype">void</span> VmaBlockMetadata_Linear::CalcAllocationStatInfo(<a class="code" href="struct_vma_stat_info.html">VmaStatInfo</a>&amp; outInfo)<span class="keyword"> const</span></div>
-<div class="line"><a name="l10016"></a><span class="lineno">10016</span>&#160;<span class="keyword"></span>{</div>
-<div class="line"><a name="l10017"></a><span class="lineno">10017</span>&#160;    <span class="keyword">const</span> VkDeviceSize size = GetSize();</div>
-<div class="line"><a name="l10018"></a><span class="lineno">10018</span>&#160;    <span class="keyword">const</span> SuballocationVectorType&amp; suballocations1st = AccessSuballocations1st();</div>
-<div class="line"><a name="l10019"></a><span class="lineno">10019</span>&#160;    <span class="keyword">const</span> SuballocationVectorType&amp; suballocations2nd = AccessSuballocations2nd();</div>
-<div class="line"><a name="l10020"></a><span class="lineno">10020</span>&#160;    <span class="keyword">const</span> <span class="keywordtype">size_t</span> suballoc1stCount = suballocations1st.size();</div>
-<div class="line"><a name="l10021"></a><span class="lineno">10021</span>&#160;    <span class="keyword">const</span> <span class="keywordtype">size_t</span> suballoc2ndCount = suballocations2nd.size();</div>
-<div class="line"><a name="l10022"></a><span class="lineno">10022</span>&#160; </div>
-<div class="line"><a name="l10023"></a><span class="lineno">10023</span>&#160;    outInfo.<a class="code" href="struct_vma_stat_info.html#abc4bb7cd611900778464c56e50c970a4">blockCount</a> = 1;</div>
-<div class="line"><a name="l10024"></a><span class="lineno">10024</span>&#160;    outInfo.<a class="code" href="struct_vma_stat_info.html#a537741e4d5cdddc1c0ab95ec650afaff">allocationCount</a> = (uint32_t)GetAllocationCount();</div>
-<div class="line"><a name="l10025"></a><span class="lineno">10025</span>&#160;    outInfo.<a class="code" href="struct_vma_stat_info.html#ae06129c771bfebfd6468a7f4276502a9">unusedRangeCount</a> = 0;</div>
-<div class="line"><a name="l10026"></a><span class="lineno">10026</span>&#160;    outInfo.<a class="code" href="struct_vma_stat_info.html#ab0c6c73837e5a70c749fbd4f6064895a">usedBytes</a> = 0;</div>
-<div class="line"><a name="l10027"></a><span class="lineno">10027</span>&#160;    outInfo.<a class="code" href="struct_vma_stat_info.html#ade8b40bd3139c04aabd2fc538a356fea">allocationSizeMin</a> = UINT64_MAX;</div>
-<div class="line"><a name="l10028"></a><span class="lineno">10028</span>&#160;    outInfo.<a class="code" href="struct_vma_stat_info.html#a17e9733a5ecd76287d4db6e66f71f50c">allocationSizeMax</a> = 0;</div>
-<div class="line"><a name="l10029"></a><span class="lineno">10029</span>&#160;    outInfo.<a class="code" href="struct_vma_stat_info.html#aedeba931324f16589cd2416c0d2dd0d4">unusedRangeSizeMin</a> = UINT64_MAX;</div>
-<div class="line"><a name="l10030"></a><span class="lineno">10030</span>&#160;    outInfo.<a class="code" href="struct_vma_stat_info.html#a5ba1a2476c4d39b10f7e2f7ebbb72ac4">unusedRangeSizeMax</a> = 0;</div>
-<div class="line"><a name="l10031"></a><span class="lineno">10031</span>&#160; </div>
-<div class="line"><a name="l10032"></a><span class="lineno">10032</span>&#160;    VkDeviceSize lastOffset = 0;</div>
-<div class="line"><a name="l10033"></a><span class="lineno">10033</span>&#160; </div>
-<div class="line"><a name="l10034"></a><span class="lineno">10034</span>&#160;    <span class="keywordflow">if</span>(m_2ndVectorMode == SECOND_VECTOR_RING_BUFFER)</div>
-<div class="line"><a name="l10035"></a><span class="lineno">10035</span>&#160;    {</div>
-<div class="line"><a name="l10036"></a><span class="lineno">10036</span>&#160;        <span class="keyword">const</span> VkDeviceSize freeSpace2ndTo1stEnd = suballocations1st[m_1stNullItemsBeginCount].offset;</div>
-<div class="line"><a name="l10037"></a><span class="lineno">10037</span>&#160;        <span class="keywordtype">size_t</span> nextAlloc2ndIndex = 0;</div>
-<div class="line"><a name="l10038"></a><span class="lineno">10038</span>&#160;        <span class="keywordflow">while</span>(lastOffset &lt; freeSpace2ndTo1stEnd)</div>
-<div class="line"><a name="l10039"></a><span class="lineno">10039</span>&#160;        {</div>
-<div class="line"><a name="l10040"></a><span class="lineno">10040</span>&#160;            <span class="comment">// Find next non-null allocation or move nextAllocIndex to the end.</span></div>
-<div class="line"><a name="l10041"></a><span class="lineno">10041</span>&#160;            <span class="keywordflow">while</span>(nextAlloc2ndIndex &lt; suballoc2ndCount &amp;&amp;</div>
-<div class="line"><a name="l10042"></a><span class="lineno">10042</span>&#160;                suballocations2nd[nextAlloc2ndIndex].hAllocation == VK_NULL_HANDLE)</div>
-<div class="line"><a name="l10043"></a><span class="lineno">10043</span>&#160;            {</div>
-<div class="line"><a name="l10044"></a><span class="lineno">10044</span>&#160;                ++nextAlloc2ndIndex;</div>
-<div class="line"><a name="l10045"></a><span class="lineno">10045</span>&#160;            }</div>
-<div class="line"><a name="l10046"></a><span class="lineno">10046</span>&#160; </div>
-<div class="line"><a name="l10047"></a><span class="lineno">10047</span>&#160;            <span class="comment">// Found non-null allocation.</span></div>
-<div class="line"><a name="l10048"></a><span class="lineno">10048</span>&#160;            <span class="keywordflow">if</span>(nextAlloc2ndIndex &lt; suballoc2ndCount)</div>
-<div class="line"><a name="l10049"></a><span class="lineno">10049</span>&#160;            {</div>
-<div class="line"><a name="l10050"></a><span class="lineno">10050</span>&#160;                <span class="keyword">const</span> VmaSuballocation&amp; suballoc = suballocations2nd[nextAlloc2ndIndex];</div>
-<div class="line"><a name="l10051"></a><span class="lineno">10051</span>&#160;            </div>
-<div class="line"><a name="l10052"></a><span class="lineno">10052</span>&#160;                <span class="comment">// 1. Process free space before this allocation.</span></div>
-<div class="line"><a name="l10053"></a><span class="lineno">10053</span>&#160;                <span class="keywordflow">if</span>(lastOffset &lt; suballoc.offset)</div>
-<div class="line"><a name="l10054"></a><span class="lineno">10054</span>&#160;                {</div>
-<div class="line"><a name="l10055"></a><span class="lineno">10055</span>&#160;                    <span class="comment">// There is free space from lastOffset to suballoc.offset.</span></div>
-<div class="line"><a name="l10056"></a><span class="lineno">10056</span>&#160;                    <span class="keyword">const</span> VkDeviceSize unusedRangeSize = suballoc.offset - lastOffset;</div>
-<div class="line"><a name="l10057"></a><span class="lineno">10057</span>&#160;                    ++outInfo.<a class="code" href="struct_vma_stat_info.html#ae06129c771bfebfd6468a7f4276502a9">unusedRangeCount</a>;</div>
-<div class="line"><a name="l10058"></a><span class="lineno">10058</span>&#160;                    outInfo.<a class="code" href="struct_vma_stat_info.html#a1859d290aca2cd582d8dc25922092669">unusedBytes</a> += unusedRangeSize;</div>
-<div class="line"><a name="l10059"></a><span class="lineno">10059</span>&#160;                    outInfo.<a class="code" href="struct_vma_stat_info.html#aedeba931324f16589cd2416c0d2dd0d4">unusedRangeSizeMin</a> = VMA_MIN(outInfo.<a class="code" href="struct_vma_stat_info.html#aedeba931324f16589cd2416c0d2dd0d4">unusedRangeSizeMin</a>, unusedRangeSize);</div>
-<div class="line"><a name="l10060"></a><span class="lineno">10060</span>&#160;                    outInfo.<a class="code" href="struct_vma_stat_info.html#a5ba1a2476c4d39b10f7e2f7ebbb72ac4">unusedRangeSizeMax</a> = VMA_MIN(outInfo.<a class="code" href="struct_vma_stat_info.html#a5ba1a2476c4d39b10f7e2f7ebbb72ac4">unusedRangeSizeMax</a>, unusedRangeSize);</div>
-<div class="line"><a name="l10061"></a><span class="lineno">10061</span>&#160;                }</div>
-<div class="line"><a name="l10062"></a><span class="lineno">10062</span>&#160;            </div>
-<div class="line"><a name="l10063"></a><span class="lineno">10063</span>&#160;                <span class="comment">// 2. Process this allocation.</span></div>
-<div class="line"><a name="l10064"></a><span class="lineno">10064</span>&#160;                <span class="comment">// There is allocation with suballoc.offset, suballoc.size.</span></div>
-<div class="line"><a name="l10065"></a><span class="lineno">10065</span>&#160;                outInfo.<a class="code" href="struct_vma_stat_info.html#ab0c6c73837e5a70c749fbd4f6064895a">usedBytes</a> += suballoc.size;</div>
-<div class="line"><a name="l10066"></a><span class="lineno">10066</span>&#160;                outInfo.<a class="code" href="struct_vma_stat_info.html#ade8b40bd3139c04aabd2fc538a356fea">allocationSizeMin</a> = VMA_MIN(outInfo.<a class="code" href="struct_vma_stat_info.html#ade8b40bd3139c04aabd2fc538a356fea">allocationSizeMin</a>, suballoc.size);</div>
-<div class="line"><a name="l10067"></a><span class="lineno">10067</span>&#160;                outInfo.<a class="code" href="struct_vma_stat_info.html#a17e9733a5ecd76287d4db6e66f71f50c">allocationSizeMax</a> = VMA_MIN(outInfo.<a class="code" href="struct_vma_stat_info.html#a17e9733a5ecd76287d4db6e66f71f50c">allocationSizeMax</a>, suballoc.size);</div>
-<div class="line"><a name="l10068"></a><span class="lineno">10068</span>&#160;            </div>
-<div class="line"><a name="l10069"></a><span class="lineno">10069</span>&#160;                <span class="comment">// 3. Prepare for next iteration.</span></div>
-<div class="line"><a name="l10070"></a><span class="lineno">10070</span>&#160;                lastOffset = suballoc.offset + suballoc.size;</div>
-<div class="line"><a name="l10071"></a><span class="lineno">10071</span>&#160;                ++nextAlloc2ndIndex;</div>
-<div class="line"><a name="l10072"></a><span class="lineno">10072</span>&#160;            }</div>
-<div class="line"><a name="l10073"></a><span class="lineno">10073</span>&#160;            <span class="comment">// We are at the end.</span></div>
-<div class="line"><a name="l10074"></a><span class="lineno">10074</span>&#160;            <span class="keywordflow">else</span></div>
-<div class="line"><a name="l10075"></a><span class="lineno">10075</span>&#160;            {</div>
-<div class="line"><a name="l10076"></a><span class="lineno">10076</span>&#160;                <span class="comment">// There is free space from lastOffset to freeSpace2ndTo1stEnd.</span></div>
-<div class="line"><a name="l10077"></a><span class="lineno">10077</span>&#160;                <span class="keywordflow">if</span>(lastOffset &lt; freeSpace2ndTo1stEnd)</div>
-<div class="line"><a name="l10078"></a><span class="lineno">10078</span>&#160;                {</div>
-<div class="line"><a name="l10079"></a><span class="lineno">10079</span>&#160;                    <span class="keyword">const</span> VkDeviceSize unusedRangeSize = freeSpace2ndTo1stEnd - lastOffset;</div>
-<div class="line"><a name="l10080"></a><span class="lineno">10080</span>&#160;                    ++outInfo.<a class="code" href="struct_vma_stat_info.html#ae06129c771bfebfd6468a7f4276502a9">unusedRangeCount</a>;</div>
-<div class="line"><a name="l10081"></a><span class="lineno">10081</span>&#160;                    outInfo.<a class="code" href="struct_vma_stat_info.html#a1859d290aca2cd582d8dc25922092669">unusedBytes</a> += unusedRangeSize;</div>
-<div class="line"><a name="l10082"></a><span class="lineno">10082</span>&#160;                    outInfo.<a class="code" href="struct_vma_stat_info.html#aedeba931324f16589cd2416c0d2dd0d4">unusedRangeSizeMin</a> = VMA_MIN(outInfo.<a class="code" href="struct_vma_stat_info.html#aedeba931324f16589cd2416c0d2dd0d4">unusedRangeSizeMin</a>, unusedRangeSize);</div>
-<div class="line"><a name="l10083"></a><span class="lineno">10083</span>&#160;                    outInfo.<a class="code" href="struct_vma_stat_info.html#a5ba1a2476c4d39b10f7e2f7ebbb72ac4">unusedRangeSizeMax</a> = VMA_MIN(outInfo.<a class="code" href="struct_vma_stat_info.html#a5ba1a2476c4d39b10f7e2f7ebbb72ac4">unusedRangeSizeMax</a>, unusedRangeSize);</div>
-<div class="line"><a name="l10084"></a><span class="lineno">10084</span>&#160;               }</div>
-<div class="line"><a name="l10085"></a><span class="lineno">10085</span>&#160; </div>
-<div class="line"><a name="l10086"></a><span class="lineno">10086</span>&#160;                <span class="comment">// End of loop.</span></div>
-<div class="line"><a name="l10087"></a><span class="lineno">10087</span>&#160;                lastOffset = freeSpace2ndTo1stEnd;</div>
-<div class="line"><a name="l10088"></a><span class="lineno">10088</span>&#160;            }</div>
-<div class="line"><a name="l10089"></a><span class="lineno">10089</span>&#160;        }</div>
-<div class="line"><a name="l10090"></a><span class="lineno">10090</span>&#160;    }</div>
-<div class="line"><a name="l10091"></a><span class="lineno">10091</span>&#160; </div>
-<div class="line"><a name="l10092"></a><span class="lineno">10092</span>&#160;    <span class="keywordtype">size_t</span> nextAlloc1stIndex = m_1stNullItemsBeginCount;</div>
-<div class="line"><a name="l10093"></a><span class="lineno">10093</span>&#160;    <span class="keyword">const</span> VkDeviceSize freeSpace1stTo2ndEnd =</div>
-<div class="line"><a name="l10094"></a><span class="lineno">10094</span>&#160;        m_2ndVectorMode == SECOND_VECTOR_DOUBLE_STACK ? suballocations2nd.back().offset : size;</div>
-<div class="line"><a name="l10095"></a><span class="lineno">10095</span>&#160;    <span class="keywordflow">while</span>(lastOffset &lt; freeSpace1stTo2ndEnd)</div>
-<div class="line"><a name="l10096"></a><span class="lineno">10096</span>&#160;    {</div>
-<div class="line"><a name="l10097"></a><span class="lineno">10097</span>&#160;        <span class="comment">// Find next non-null allocation or move nextAllocIndex to the end.</span></div>
-<div class="line"><a name="l10098"></a><span class="lineno">10098</span>&#160;        <span class="keywordflow">while</span>(nextAlloc1stIndex &lt; suballoc1stCount &amp;&amp;</div>
-<div class="line"><a name="l10099"></a><span class="lineno">10099</span>&#160;            suballocations1st[nextAlloc1stIndex].hAllocation == VK_NULL_HANDLE)</div>
-<div class="line"><a name="l10100"></a><span class="lineno">10100</span>&#160;        {</div>
-<div class="line"><a name="l10101"></a><span class="lineno">10101</span>&#160;            ++nextAlloc1stIndex;</div>
-<div class="line"><a name="l10102"></a><span class="lineno">10102</span>&#160;        }</div>
-<div class="line"><a name="l10103"></a><span class="lineno">10103</span>&#160; </div>
-<div class="line"><a name="l10104"></a><span class="lineno">10104</span>&#160;        <span class="comment">// Found non-null allocation.</span></div>
-<div class="line"><a name="l10105"></a><span class="lineno">10105</span>&#160;        <span class="keywordflow">if</span>(nextAlloc1stIndex &lt; suballoc1stCount)</div>
-<div class="line"><a name="l10106"></a><span class="lineno">10106</span>&#160;        {</div>
-<div class="line"><a name="l10107"></a><span class="lineno">10107</span>&#160;            <span class="keyword">const</span> VmaSuballocation&amp; suballoc = suballocations1st[nextAlloc1stIndex];</div>
-<div class="line"><a name="l10108"></a><span class="lineno">10108</span>&#160;            </div>
-<div class="line"><a name="l10109"></a><span class="lineno">10109</span>&#160;            <span class="comment">// 1. Process free space before this allocation.</span></div>
-<div class="line"><a name="l10110"></a><span class="lineno">10110</span>&#160;            <span class="keywordflow">if</span>(lastOffset &lt; suballoc.offset)</div>
-<div class="line"><a name="l10111"></a><span class="lineno">10111</span>&#160;            {</div>
-<div class="line"><a name="l10112"></a><span class="lineno">10112</span>&#160;                <span class="comment">// There is free space from lastOffset to suballoc.offset.</span></div>
-<div class="line"><a name="l10113"></a><span class="lineno">10113</span>&#160;                <span class="keyword">const</span> VkDeviceSize unusedRangeSize = suballoc.offset - lastOffset;</div>
-<div class="line"><a name="l10114"></a><span class="lineno">10114</span>&#160;                ++outInfo.<a class="code" href="struct_vma_stat_info.html#ae06129c771bfebfd6468a7f4276502a9">unusedRangeCount</a>;</div>
-<div class="line"><a name="l10115"></a><span class="lineno">10115</span>&#160;                outInfo.<a class="code" href="struct_vma_stat_info.html#a1859d290aca2cd582d8dc25922092669">unusedBytes</a> += unusedRangeSize;</div>
-<div class="line"><a name="l10116"></a><span class="lineno">10116</span>&#160;                outInfo.<a class="code" href="struct_vma_stat_info.html#aedeba931324f16589cd2416c0d2dd0d4">unusedRangeSizeMin</a> = VMA_MIN(outInfo.<a class="code" href="struct_vma_stat_info.html#aedeba931324f16589cd2416c0d2dd0d4">unusedRangeSizeMin</a>, unusedRangeSize);</div>
-<div class="line"><a name="l10117"></a><span class="lineno">10117</span>&#160;                outInfo.<a class="code" href="struct_vma_stat_info.html#a5ba1a2476c4d39b10f7e2f7ebbb72ac4">unusedRangeSizeMax</a> = VMA_MIN(outInfo.<a class="code" href="struct_vma_stat_info.html#a5ba1a2476c4d39b10f7e2f7ebbb72ac4">unusedRangeSizeMax</a>, unusedRangeSize);</div>
-<div class="line"><a name="l10118"></a><span class="lineno">10118</span>&#160;            }</div>
-<div class="line"><a name="l10119"></a><span class="lineno">10119</span>&#160;            </div>
-<div class="line"><a name="l10120"></a><span class="lineno">10120</span>&#160;            <span class="comment">// 2. Process this allocation.</span></div>
-<div class="line"><a name="l10121"></a><span class="lineno">10121</span>&#160;            <span class="comment">// There is allocation with suballoc.offset, suballoc.size.</span></div>
-<div class="line"><a name="l10122"></a><span class="lineno">10122</span>&#160;            outInfo.<a class="code" href="struct_vma_stat_info.html#ab0c6c73837e5a70c749fbd4f6064895a">usedBytes</a> += suballoc.size;</div>
-<div class="line"><a name="l10123"></a><span class="lineno">10123</span>&#160;            outInfo.<a class="code" href="struct_vma_stat_info.html#ade8b40bd3139c04aabd2fc538a356fea">allocationSizeMin</a> = VMA_MIN(outInfo.<a class="code" href="struct_vma_stat_info.html#ade8b40bd3139c04aabd2fc538a356fea">allocationSizeMin</a>, suballoc.size);</div>
-<div class="line"><a name="l10124"></a><span class="lineno">10124</span>&#160;            outInfo.<a class="code" href="struct_vma_stat_info.html#a17e9733a5ecd76287d4db6e66f71f50c">allocationSizeMax</a> = VMA_MIN(outInfo.<a class="code" href="struct_vma_stat_info.html#a17e9733a5ecd76287d4db6e66f71f50c">allocationSizeMax</a>, suballoc.size);</div>
-<div class="line"><a name="l10125"></a><span class="lineno">10125</span>&#160;            </div>
-<div class="line"><a name="l10126"></a><span class="lineno">10126</span>&#160;            <span class="comment">// 3. Prepare for next iteration.</span></div>
-<div class="line"><a name="l10127"></a><span class="lineno">10127</span>&#160;            lastOffset = suballoc.offset + suballoc.size;</div>
-<div class="line"><a name="l10128"></a><span class="lineno">10128</span>&#160;            ++nextAlloc1stIndex;</div>
+<div class="line"><a name="l09951"></a><span class="lineno"> 9951</span>&#160;        <span class="comment">// Now that we have final *pOffset, check if we are past suballocItem.</span></div>
+<div class="line"><a name="l09952"></a><span class="lineno"> 9952</span>&#160;        <span class="comment">// If yes, return false - this function should be called for another suballocItem as starting point.</span></div>
+<div class="line"><a name="l09953"></a><span class="lineno"> 9953</span>&#160;        <span class="keywordflow">if</span>(*pOffset &gt;= suballocItem-&gt;offset + suballocItem-&gt;size)</div>
+<div class="line"><a name="l09954"></a><span class="lineno"> 9954</span>&#160;        {</div>
+<div class="line"><a name="l09955"></a><span class="lineno"> 9955</span>&#160;            <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
+<div class="line"><a name="l09956"></a><span class="lineno"> 9956</span>&#160;        }</div>
+<div class="line"><a name="l09957"></a><span class="lineno"> 9957</span>&#160; </div>
+<div class="line"><a name="l09958"></a><span class="lineno"> 9958</span>&#160;        <span class="comment">// Calculate padding at the beginning based on current offset.</span></div>
+<div class="line"><a name="l09959"></a><span class="lineno"> 9959</span>&#160;        <span class="keyword">const</span> VkDeviceSize paddingBegin = *pOffset - suballocItem-&gt;offset;</div>
+<div class="line"><a name="l09960"></a><span class="lineno"> 9960</span>&#160; </div>
+<div class="line"><a name="l09961"></a><span class="lineno"> 9961</span>&#160;        <span class="comment">// Calculate required margin at the end.</span></div>
+<div class="line"><a name="l09962"></a><span class="lineno"> 9962</span>&#160;        <span class="keyword">const</span> VkDeviceSize requiredEndMargin = VMA_DEBUG_MARGIN;</div>
+<div class="line"><a name="l09963"></a><span class="lineno"> 9963</span>&#160; </div>
+<div class="line"><a name="l09964"></a><span class="lineno"> 9964</span>&#160;        <span class="keyword">const</span> VkDeviceSize totalSize = paddingBegin + allocSize + requiredEndMargin;</div>
+<div class="line"><a name="l09965"></a><span class="lineno"> 9965</span>&#160;        <span class="comment">// Another early return check.</span></div>
+<div class="line"><a name="l09966"></a><span class="lineno"> 9966</span>&#160;        <span class="keywordflow">if</span>(suballocItem-&gt;offset + totalSize &gt; GetSize())</div>
+<div class="line"><a name="l09967"></a><span class="lineno"> 9967</span>&#160;        {</div>
+<div class="line"><a name="l09968"></a><span class="lineno"> 9968</span>&#160;            <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
+<div class="line"><a name="l09969"></a><span class="lineno"> 9969</span>&#160;        }</div>
+<div class="line"><a name="l09970"></a><span class="lineno"> 9970</span>&#160; </div>
+<div class="line"><a name="l09971"></a><span class="lineno"> 9971</span>&#160;        <span class="comment">// Advance lastSuballocItem until desired size is reached.</span></div>
+<div class="line"><a name="l09972"></a><span class="lineno"> 9972</span>&#160;        <span class="comment">// Update itemsToMakeLostCount.</span></div>
+<div class="line"><a name="l09973"></a><span class="lineno"> 9973</span>&#160;        VmaSuballocationList::const_iterator lastSuballocItem = suballocItem;</div>
+<div class="line"><a name="l09974"></a><span class="lineno"> 9974</span>&#160;        <span class="keywordflow">if</span>(totalSize &gt; suballocItem-&gt;size)</div>
+<div class="line"><a name="l09975"></a><span class="lineno"> 9975</span>&#160;        {</div>
+<div class="line"><a name="l09976"></a><span class="lineno"> 9976</span>&#160;            VkDeviceSize remainingSize = totalSize - suballocItem-&gt;size;</div>
+<div class="line"><a name="l09977"></a><span class="lineno"> 9977</span>&#160;            <span class="keywordflow">while</span>(remainingSize &gt; 0)</div>
+<div class="line"><a name="l09978"></a><span class="lineno"> 9978</span>&#160;            {</div>
+<div class="line"><a name="l09979"></a><span class="lineno"> 9979</span>&#160;                ++lastSuballocItem;</div>
+<div class="line"><a name="l09980"></a><span class="lineno"> 9980</span>&#160;                <span class="keywordflow">if</span>(lastSuballocItem == m_Suballocations.cend())</div>
+<div class="line"><a name="l09981"></a><span class="lineno"> 9981</span>&#160;                {</div>
+<div class="line"><a name="l09982"></a><span class="lineno"> 9982</span>&#160;                    <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
+<div class="line"><a name="l09983"></a><span class="lineno"> 9983</span>&#160;                }</div>
+<div class="line"><a name="l09984"></a><span class="lineno"> 9984</span>&#160;                <span class="keywordflow">if</span>(lastSuballocItem-&gt;type == VMA_SUBALLOCATION_TYPE_FREE)</div>
+<div class="line"><a name="l09985"></a><span class="lineno"> 9985</span>&#160;                {</div>
+<div class="line"><a name="l09986"></a><span class="lineno"> 9986</span>&#160;                    *pSumFreeSize += lastSuballocItem-&gt;size;</div>
+<div class="line"><a name="l09987"></a><span class="lineno"> 9987</span>&#160;                }</div>
+<div class="line"><a name="l09988"></a><span class="lineno"> 9988</span>&#160;                <span class="keywordflow">else</span></div>
+<div class="line"><a name="l09989"></a><span class="lineno"> 9989</span>&#160;                {</div>
+<div class="line"><a name="l09990"></a><span class="lineno"> 9990</span>&#160;                    VMA_ASSERT(lastSuballocItem-&gt;hAllocation != VK_NULL_HANDLE);</div>
+<div class="line"><a name="l09991"></a><span class="lineno"> 9991</span>&#160;                    <span class="keywordflow">if</span>(lastSuballocItem-&gt;hAllocation-&gt;CanBecomeLost() &amp;&amp;</div>
+<div class="line"><a name="l09992"></a><span class="lineno"> 9992</span>&#160;                        lastSuballocItem-&gt;hAllocation-&gt;GetLastUseFrameIndex() + frameInUseCount &lt; currentFrameIndex)</div>
+<div class="line"><a name="l09993"></a><span class="lineno"> 9993</span>&#160;                    {</div>
+<div class="line"><a name="l09994"></a><span class="lineno"> 9994</span>&#160;                        ++*itemsToMakeLostCount;</div>
+<div class="line"><a name="l09995"></a><span class="lineno"> 9995</span>&#160;                        *pSumItemSize += lastSuballocItem-&gt;size;</div>
+<div class="line"><a name="l09996"></a><span class="lineno"> 9996</span>&#160;                    }</div>
+<div class="line"><a name="l09997"></a><span class="lineno"> 9997</span>&#160;                    <span class="keywordflow">else</span></div>
+<div class="line"><a name="l09998"></a><span class="lineno"> 9998</span>&#160;                    {</div>
+<div class="line"><a name="l09999"></a><span class="lineno"> 9999</span>&#160;                        <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
+<div class="line"><a name="l10000"></a><span class="lineno">10000</span>&#160;                    }</div>
+<div class="line"><a name="l10001"></a><span class="lineno">10001</span>&#160;                }</div>
+<div class="line"><a name="l10002"></a><span class="lineno">10002</span>&#160;                remainingSize = (lastSuballocItem-&gt;size &lt; remainingSize) ?</div>
+<div class="line"><a name="l10003"></a><span class="lineno">10003</span>&#160;                    remainingSize - lastSuballocItem-&gt;size : 0;</div>
+<div class="line"><a name="l10004"></a><span class="lineno">10004</span>&#160;            }</div>
+<div class="line"><a name="l10005"></a><span class="lineno">10005</span>&#160;        }</div>
+<div class="line"><a name="l10006"></a><span class="lineno">10006</span>&#160; </div>
+<div class="line"><a name="l10007"></a><span class="lineno">10007</span>&#160;        <span class="comment">// Check next suballocations for BufferImageGranularity conflicts.</span></div>
+<div class="line"><a name="l10008"></a><span class="lineno">10008</span>&#160;        <span class="comment">// If conflict exists, we must mark more allocations lost or fail.</span></div>
+<div class="line"><a name="l10009"></a><span class="lineno">10009</span>&#160;        <span class="keywordflow">if</span>(allocSize % bufferImageGranularity || *pOffset % bufferImageGranularity)</div>
+<div class="line"><a name="l10010"></a><span class="lineno">10010</span>&#160;        {</div>
+<div class="line"><a name="l10011"></a><span class="lineno">10011</span>&#160;            VmaSuballocationList::const_iterator nextSuballocItem = lastSuballocItem;</div>
+<div class="line"><a name="l10012"></a><span class="lineno">10012</span>&#160;            ++nextSuballocItem;</div>
+<div class="line"><a name="l10013"></a><span class="lineno">10013</span>&#160;            <span class="keywordflow">while</span>(nextSuballocItem != m_Suballocations.cend())</div>
+<div class="line"><a name="l10014"></a><span class="lineno">10014</span>&#160;            {</div>
+<div class="line"><a name="l10015"></a><span class="lineno">10015</span>&#160;                <span class="keyword">const</span> VmaSuballocation&amp; nextSuballoc = *nextSuballocItem;</div>
+<div class="line"><a name="l10016"></a><span class="lineno">10016</span>&#160;                <span class="keywordflow">if</span>(VmaBlocksOnSamePage(*pOffset, allocSize, nextSuballoc.offset, bufferImageGranularity))</div>
+<div class="line"><a name="l10017"></a><span class="lineno">10017</span>&#160;                {</div>
+<div class="line"><a name="l10018"></a><span class="lineno">10018</span>&#160;                    <span class="keywordflow">if</span>(VmaIsBufferImageGranularityConflict(allocType, nextSuballoc.type))</div>
+<div class="line"><a name="l10019"></a><span class="lineno">10019</span>&#160;                    {</div>
+<div class="line"><a name="l10020"></a><span class="lineno">10020</span>&#160;                        VMA_ASSERT(nextSuballoc.hAllocation != VK_NULL_HANDLE);</div>
+<div class="line"><a name="l10021"></a><span class="lineno">10021</span>&#160;                        <span class="keywordflow">if</span>(nextSuballoc.hAllocation-&gt;CanBecomeLost() &amp;&amp;</div>
+<div class="line"><a name="l10022"></a><span class="lineno">10022</span>&#160;                            nextSuballoc.hAllocation-&gt;GetLastUseFrameIndex() + frameInUseCount &lt; currentFrameIndex)</div>
+<div class="line"><a name="l10023"></a><span class="lineno">10023</span>&#160;                        {</div>
+<div class="line"><a name="l10024"></a><span class="lineno">10024</span>&#160;                            ++*itemsToMakeLostCount;</div>
+<div class="line"><a name="l10025"></a><span class="lineno">10025</span>&#160;                        }</div>
+<div class="line"><a name="l10026"></a><span class="lineno">10026</span>&#160;                        <span class="keywordflow">else</span></div>
+<div class="line"><a name="l10027"></a><span class="lineno">10027</span>&#160;                        {</div>
+<div class="line"><a name="l10028"></a><span class="lineno">10028</span>&#160;                            <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
+<div class="line"><a name="l10029"></a><span class="lineno">10029</span>&#160;                        }</div>
+<div class="line"><a name="l10030"></a><span class="lineno">10030</span>&#160;                    }</div>
+<div class="line"><a name="l10031"></a><span class="lineno">10031</span>&#160;                }</div>
+<div class="line"><a name="l10032"></a><span class="lineno">10032</span>&#160;                <span class="keywordflow">else</span></div>
+<div class="line"><a name="l10033"></a><span class="lineno">10033</span>&#160;                {</div>
+<div class="line"><a name="l10034"></a><span class="lineno">10034</span>&#160;                    <span class="comment">// Already on next page.</span></div>
+<div class="line"><a name="l10035"></a><span class="lineno">10035</span>&#160;                    <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l10036"></a><span class="lineno">10036</span>&#160;                }</div>
+<div class="line"><a name="l10037"></a><span class="lineno">10037</span>&#160;                ++nextSuballocItem;</div>
+<div class="line"><a name="l10038"></a><span class="lineno">10038</span>&#160;            }</div>
+<div class="line"><a name="l10039"></a><span class="lineno">10039</span>&#160;        }</div>
+<div class="line"><a name="l10040"></a><span class="lineno">10040</span>&#160;    }</div>
+<div class="line"><a name="l10041"></a><span class="lineno">10041</span>&#160;    <span class="keywordflow">else</span></div>
+<div class="line"><a name="l10042"></a><span class="lineno">10042</span>&#160;    {</div>
+<div class="line"><a name="l10043"></a><span class="lineno">10043</span>&#160;        <span class="keyword">const</span> VmaSuballocation&amp; suballoc = *suballocItem;</div>
+<div class="line"><a name="l10044"></a><span class="lineno">10044</span>&#160;        VMA_ASSERT(suballoc.type == VMA_SUBALLOCATION_TYPE_FREE);</div>
+<div class="line"><a name="l10045"></a><span class="lineno">10045</span>&#160; </div>
+<div class="line"><a name="l10046"></a><span class="lineno">10046</span>&#160;        *pSumFreeSize = suballoc.size;</div>
+<div class="line"><a name="l10047"></a><span class="lineno">10047</span>&#160; </div>
+<div class="line"><a name="l10048"></a><span class="lineno">10048</span>&#160;        <span class="comment">// Size of this suballocation is too small for this request: Early return.</span></div>
+<div class="line"><a name="l10049"></a><span class="lineno">10049</span>&#160;        <span class="keywordflow">if</span>(suballoc.size &lt; allocSize)</div>
+<div class="line"><a name="l10050"></a><span class="lineno">10050</span>&#160;        {</div>
+<div class="line"><a name="l10051"></a><span class="lineno">10051</span>&#160;            <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
+<div class="line"><a name="l10052"></a><span class="lineno">10052</span>&#160;        }</div>
+<div class="line"><a name="l10053"></a><span class="lineno">10053</span>&#160; </div>
+<div class="line"><a name="l10054"></a><span class="lineno">10054</span>&#160;        <span class="comment">// Start from offset equal to beginning of this suballocation.</span></div>
+<div class="line"><a name="l10055"></a><span class="lineno">10055</span>&#160;        *pOffset = suballoc.offset;</div>
+<div class="line"><a name="l10056"></a><span class="lineno">10056</span>&#160; </div>
+<div class="line"><a name="l10057"></a><span class="lineno">10057</span>&#160;        <span class="comment">// Apply VMA_DEBUG_MARGIN at the beginning.</span></div>
+<div class="line"><a name="l10058"></a><span class="lineno">10058</span>&#160;        <span class="keywordflow">if</span>(VMA_DEBUG_MARGIN &gt; 0)</div>
+<div class="line"><a name="l10059"></a><span class="lineno">10059</span>&#160;        {</div>
+<div class="line"><a name="l10060"></a><span class="lineno">10060</span>&#160;            *pOffset += VMA_DEBUG_MARGIN;</div>
+<div class="line"><a name="l10061"></a><span class="lineno">10061</span>&#160;        }</div>
+<div class="line"><a name="l10062"></a><span class="lineno">10062</span>&#160; </div>
+<div class="line"><a name="l10063"></a><span class="lineno">10063</span>&#160;        <span class="comment">// Apply alignment.</span></div>
+<div class="line"><a name="l10064"></a><span class="lineno">10064</span>&#160;        *pOffset = VmaAlignUp(*pOffset, allocAlignment);</div>
+<div class="line"><a name="l10065"></a><span class="lineno">10065</span>&#160; </div>
+<div class="line"><a name="l10066"></a><span class="lineno">10066</span>&#160;        <span class="comment">// Check previous suballocations for BufferImageGranularity conflicts.</span></div>
+<div class="line"><a name="l10067"></a><span class="lineno">10067</span>&#160;        <span class="comment">// Make bigger alignment if necessary.</span></div>
+<div class="line"><a name="l10068"></a><span class="lineno">10068</span>&#160;        <span class="keywordflow">if</span>(bufferImageGranularity &gt; 1 &amp;&amp; bufferImageGranularity != allocAlignment)</div>
+<div class="line"><a name="l10069"></a><span class="lineno">10069</span>&#160;        {</div>
+<div class="line"><a name="l10070"></a><span class="lineno">10070</span>&#160;            <span class="keywordtype">bool</span> bufferImageGranularityConflict = <span class="keyword">false</span>;</div>
+<div class="line"><a name="l10071"></a><span class="lineno">10071</span>&#160;            VmaSuballocationList::const_iterator prevSuballocItem = suballocItem;</div>
+<div class="line"><a name="l10072"></a><span class="lineno">10072</span>&#160;            <span class="keywordflow">while</span>(prevSuballocItem != m_Suballocations.cbegin())</div>
+<div class="line"><a name="l10073"></a><span class="lineno">10073</span>&#160;            {</div>
+<div class="line"><a name="l10074"></a><span class="lineno">10074</span>&#160;                --prevSuballocItem;</div>
+<div class="line"><a name="l10075"></a><span class="lineno">10075</span>&#160;                <span class="keyword">const</span> VmaSuballocation&amp; prevSuballoc = *prevSuballocItem;</div>
+<div class="line"><a name="l10076"></a><span class="lineno">10076</span>&#160;                <span class="keywordflow">if</span>(VmaBlocksOnSamePage(prevSuballoc.offset, prevSuballoc.size, *pOffset, bufferImageGranularity))</div>
+<div class="line"><a name="l10077"></a><span class="lineno">10077</span>&#160;                {</div>
+<div class="line"><a name="l10078"></a><span class="lineno">10078</span>&#160;                    <span class="keywordflow">if</span>(VmaIsBufferImageGranularityConflict(prevSuballoc.type, allocType))</div>
+<div class="line"><a name="l10079"></a><span class="lineno">10079</span>&#160;                    {</div>
+<div class="line"><a name="l10080"></a><span class="lineno">10080</span>&#160;                        bufferImageGranularityConflict = <span class="keyword">true</span>;</div>
+<div class="line"><a name="l10081"></a><span class="lineno">10081</span>&#160;                        <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l10082"></a><span class="lineno">10082</span>&#160;                    }</div>
+<div class="line"><a name="l10083"></a><span class="lineno">10083</span>&#160;                }</div>
+<div class="line"><a name="l10084"></a><span class="lineno">10084</span>&#160;                <span class="keywordflow">else</span></div>
+<div class="line"><a name="l10085"></a><span class="lineno">10085</span>&#160;                    <span class="comment">// Already on previous page.</span></div>
+<div class="line"><a name="l10086"></a><span class="lineno">10086</span>&#160;                    <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l10087"></a><span class="lineno">10087</span>&#160;            }</div>
+<div class="line"><a name="l10088"></a><span class="lineno">10088</span>&#160;            <span class="keywordflow">if</span>(bufferImageGranularityConflict)</div>
+<div class="line"><a name="l10089"></a><span class="lineno">10089</span>&#160;            {</div>
+<div class="line"><a name="l10090"></a><span class="lineno">10090</span>&#160;                *pOffset = VmaAlignUp(*pOffset, bufferImageGranularity);</div>
+<div class="line"><a name="l10091"></a><span class="lineno">10091</span>&#160;            }</div>
+<div class="line"><a name="l10092"></a><span class="lineno">10092</span>&#160;        }</div>
+<div class="line"><a name="l10093"></a><span class="lineno">10093</span>&#160; </div>
+<div class="line"><a name="l10094"></a><span class="lineno">10094</span>&#160;        <span class="comment">// Calculate padding at the beginning based on current offset.</span></div>
+<div class="line"><a name="l10095"></a><span class="lineno">10095</span>&#160;        <span class="keyword">const</span> VkDeviceSize paddingBegin = *pOffset - suballoc.offset;</div>
+<div class="line"><a name="l10096"></a><span class="lineno">10096</span>&#160; </div>
+<div class="line"><a name="l10097"></a><span class="lineno">10097</span>&#160;        <span class="comment">// Calculate required margin at the end.</span></div>
+<div class="line"><a name="l10098"></a><span class="lineno">10098</span>&#160;        <span class="keyword">const</span> VkDeviceSize requiredEndMargin = VMA_DEBUG_MARGIN;</div>
+<div class="line"><a name="l10099"></a><span class="lineno">10099</span>&#160; </div>
+<div class="line"><a name="l10100"></a><span class="lineno">10100</span>&#160;        <span class="comment">// Fail if requested size plus margin before and after is bigger than size of this suballocation.</span></div>
+<div class="line"><a name="l10101"></a><span class="lineno">10101</span>&#160;        <span class="keywordflow">if</span>(paddingBegin + allocSize + requiredEndMargin &gt; suballoc.size)</div>
+<div class="line"><a name="l10102"></a><span class="lineno">10102</span>&#160;        {</div>
+<div class="line"><a name="l10103"></a><span class="lineno">10103</span>&#160;            <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
+<div class="line"><a name="l10104"></a><span class="lineno">10104</span>&#160;        }</div>
+<div class="line"><a name="l10105"></a><span class="lineno">10105</span>&#160; </div>
+<div class="line"><a name="l10106"></a><span class="lineno">10106</span>&#160;        <span class="comment">// Check next suballocations for BufferImageGranularity conflicts.</span></div>
+<div class="line"><a name="l10107"></a><span class="lineno">10107</span>&#160;        <span class="comment">// If conflict exists, allocation cannot be made here.</span></div>
+<div class="line"><a name="l10108"></a><span class="lineno">10108</span>&#160;        <span class="keywordflow">if</span>(allocSize % bufferImageGranularity || *pOffset % bufferImageGranularity)</div>
+<div class="line"><a name="l10109"></a><span class="lineno">10109</span>&#160;        {</div>
+<div class="line"><a name="l10110"></a><span class="lineno">10110</span>&#160;            VmaSuballocationList::const_iterator nextSuballocItem = suballocItem;</div>
+<div class="line"><a name="l10111"></a><span class="lineno">10111</span>&#160;            ++nextSuballocItem;</div>
+<div class="line"><a name="l10112"></a><span class="lineno">10112</span>&#160;            <span class="keywordflow">while</span>(nextSuballocItem != m_Suballocations.cend())</div>
+<div class="line"><a name="l10113"></a><span class="lineno">10113</span>&#160;            {</div>
+<div class="line"><a name="l10114"></a><span class="lineno">10114</span>&#160;                <span class="keyword">const</span> VmaSuballocation&amp; nextSuballoc = *nextSuballocItem;</div>
+<div class="line"><a name="l10115"></a><span class="lineno">10115</span>&#160;                <span class="keywordflow">if</span>(VmaBlocksOnSamePage(*pOffset, allocSize, nextSuballoc.offset, bufferImageGranularity))</div>
+<div class="line"><a name="l10116"></a><span class="lineno">10116</span>&#160;                {</div>
+<div class="line"><a name="l10117"></a><span class="lineno">10117</span>&#160;                    <span class="keywordflow">if</span>(VmaIsBufferImageGranularityConflict(allocType, nextSuballoc.type))</div>
+<div class="line"><a name="l10118"></a><span class="lineno">10118</span>&#160;                    {</div>
+<div class="line"><a name="l10119"></a><span class="lineno">10119</span>&#160;                        <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
+<div class="line"><a name="l10120"></a><span class="lineno">10120</span>&#160;                    }</div>
+<div class="line"><a name="l10121"></a><span class="lineno">10121</span>&#160;                }</div>
+<div class="line"><a name="l10122"></a><span class="lineno">10122</span>&#160;                <span class="keywordflow">else</span></div>
+<div class="line"><a name="l10123"></a><span class="lineno">10123</span>&#160;                {</div>
+<div class="line"><a name="l10124"></a><span class="lineno">10124</span>&#160;                    <span class="comment">// Already on next page.</span></div>
+<div class="line"><a name="l10125"></a><span class="lineno">10125</span>&#160;                    <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l10126"></a><span class="lineno">10126</span>&#160;                }</div>
+<div class="line"><a name="l10127"></a><span class="lineno">10127</span>&#160;                ++nextSuballocItem;</div>
+<div class="line"><a name="l10128"></a><span class="lineno">10128</span>&#160;            }</div>
 <div class="line"><a name="l10129"></a><span class="lineno">10129</span>&#160;        }</div>
-<div class="line"><a name="l10130"></a><span class="lineno">10130</span>&#160;        <span class="comment">// We are at the end.</span></div>
-<div class="line"><a name="l10131"></a><span class="lineno">10131</span>&#160;        <span class="keywordflow">else</span></div>
-<div class="line"><a name="l10132"></a><span class="lineno">10132</span>&#160;        {</div>
-<div class="line"><a name="l10133"></a><span class="lineno">10133</span>&#160;            <span class="comment">// There is free space from lastOffset to freeSpace1stTo2ndEnd.</span></div>
-<div class="line"><a name="l10134"></a><span class="lineno">10134</span>&#160;            <span class="keywordflow">if</span>(lastOffset &lt; freeSpace1stTo2ndEnd)</div>
-<div class="line"><a name="l10135"></a><span class="lineno">10135</span>&#160;            {</div>
-<div class="line"><a name="l10136"></a><span class="lineno">10136</span>&#160;                <span class="keyword">const</span> VkDeviceSize unusedRangeSize = freeSpace1stTo2ndEnd - lastOffset;</div>
-<div class="line"><a name="l10137"></a><span class="lineno">10137</span>&#160;                ++outInfo.<a class="code" href="struct_vma_stat_info.html#ae06129c771bfebfd6468a7f4276502a9">unusedRangeCount</a>;</div>
-<div class="line"><a name="l10138"></a><span class="lineno">10138</span>&#160;                outInfo.<a class="code" href="struct_vma_stat_info.html#a1859d290aca2cd582d8dc25922092669">unusedBytes</a> += unusedRangeSize;</div>
-<div class="line"><a name="l10139"></a><span class="lineno">10139</span>&#160;                outInfo.<a class="code" href="struct_vma_stat_info.html#aedeba931324f16589cd2416c0d2dd0d4">unusedRangeSizeMin</a> = VMA_MIN(outInfo.<a class="code" href="struct_vma_stat_info.html#aedeba931324f16589cd2416c0d2dd0d4">unusedRangeSizeMin</a>, unusedRangeSize);</div>
-<div class="line"><a name="l10140"></a><span class="lineno">10140</span>&#160;                outInfo.<a class="code" href="struct_vma_stat_info.html#a5ba1a2476c4d39b10f7e2f7ebbb72ac4">unusedRangeSizeMax</a> = VMA_MIN(outInfo.<a class="code" href="struct_vma_stat_info.html#a5ba1a2476c4d39b10f7e2f7ebbb72ac4">unusedRangeSizeMax</a>, unusedRangeSize);</div>
-<div class="line"><a name="l10141"></a><span class="lineno">10141</span>&#160;           }</div>
-<div class="line"><a name="l10142"></a><span class="lineno">10142</span>&#160; </div>
-<div class="line"><a name="l10143"></a><span class="lineno">10143</span>&#160;            <span class="comment">// End of loop.</span></div>
-<div class="line"><a name="l10144"></a><span class="lineno">10144</span>&#160;            lastOffset = freeSpace1stTo2ndEnd;</div>
-<div class="line"><a name="l10145"></a><span class="lineno">10145</span>&#160;        }</div>
-<div class="line"><a name="l10146"></a><span class="lineno">10146</span>&#160;    }</div>
-<div class="line"><a name="l10147"></a><span class="lineno">10147</span>&#160; </div>
-<div class="line"><a name="l10148"></a><span class="lineno">10148</span>&#160;    <span class="keywordflow">if</span>(m_2ndVectorMode == SECOND_VECTOR_DOUBLE_STACK)</div>
-<div class="line"><a name="l10149"></a><span class="lineno">10149</span>&#160;    {</div>
-<div class="line"><a name="l10150"></a><span class="lineno">10150</span>&#160;        <span class="keywordtype">size_t</span> nextAlloc2ndIndex = suballocations2nd.size() - 1;</div>
-<div class="line"><a name="l10151"></a><span class="lineno">10151</span>&#160;        <span class="keywordflow">while</span>(lastOffset &lt; size)</div>
-<div class="line"><a name="l10152"></a><span class="lineno">10152</span>&#160;        {</div>
-<div class="line"><a name="l10153"></a><span class="lineno">10153</span>&#160;            <span class="comment">// Find next non-null allocation or move nextAllocIndex to the end.</span></div>
-<div class="line"><a name="l10154"></a><span class="lineno">10154</span>&#160;            <span class="keywordflow">while</span>(nextAlloc2ndIndex != SIZE_MAX &amp;&amp;</div>
-<div class="line"><a name="l10155"></a><span class="lineno">10155</span>&#160;                suballocations2nd[nextAlloc2ndIndex].hAllocation == VK_NULL_HANDLE)</div>
-<div class="line"><a name="l10156"></a><span class="lineno">10156</span>&#160;            {</div>
-<div class="line"><a name="l10157"></a><span class="lineno">10157</span>&#160;                --nextAlloc2ndIndex;</div>
-<div class="line"><a name="l10158"></a><span class="lineno">10158</span>&#160;            }</div>
-<div class="line"><a name="l10159"></a><span class="lineno">10159</span>&#160; </div>
-<div class="line"><a name="l10160"></a><span class="lineno">10160</span>&#160;            <span class="comment">// Found non-null allocation.</span></div>
-<div class="line"><a name="l10161"></a><span class="lineno">10161</span>&#160;            <span class="keywordflow">if</span>(nextAlloc2ndIndex != SIZE_MAX)</div>
-<div class="line"><a name="l10162"></a><span class="lineno">10162</span>&#160;            {</div>
-<div class="line"><a name="l10163"></a><span class="lineno">10163</span>&#160;                <span class="keyword">const</span> VmaSuballocation&amp; suballoc = suballocations2nd[nextAlloc2ndIndex];</div>
-<div class="line"><a name="l10164"></a><span class="lineno">10164</span>&#160;            </div>
-<div class="line"><a name="l10165"></a><span class="lineno">10165</span>&#160;                <span class="comment">// 1. Process free space before this allocation.</span></div>
-<div class="line"><a name="l10166"></a><span class="lineno">10166</span>&#160;                <span class="keywordflow">if</span>(lastOffset &lt; suballoc.offset)</div>
-<div class="line"><a name="l10167"></a><span class="lineno">10167</span>&#160;                {</div>
-<div class="line"><a name="l10168"></a><span class="lineno">10168</span>&#160;                    <span class="comment">// There is free space from lastOffset to suballoc.offset.</span></div>
-<div class="line"><a name="l10169"></a><span class="lineno">10169</span>&#160;                    <span class="keyword">const</span> VkDeviceSize unusedRangeSize = suballoc.offset - lastOffset;</div>
-<div class="line"><a name="l10170"></a><span class="lineno">10170</span>&#160;                    ++outInfo.<a class="code" href="struct_vma_stat_info.html#ae06129c771bfebfd6468a7f4276502a9">unusedRangeCount</a>;</div>
-<div class="line"><a name="l10171"></a><span class="lineno">10171</span>&#160;                    outInfo.<a class="code" href="struct_vma_stat_info.html#a1859d290aca2cd582d8dc25922092669">unusedBytes</a> += unusedRangeSize;</div>
-<div class="line"><a name="l10172"></a><span class="lineno">10172</span>&#160;                    outInfo.<a class="code" href="struct_vma_stat_info.html#aedeba931324f16589cd2416c0d2dd0d4">unusedRangeSizeMin</a> = VMA_MIN(outInfo.<a class="code" href="struct_vma_stat_info.html#aedeba931324f16589cd2416c0d2dd0d4">unusedRangeSizeMin</a>, unusedRangeSize);</div>
-<div class="line"><a name="l10173"></a><span class="lineno">10173</span>&#160;                    outInfo.<a class="code" href="struct_vma_stat_info.html#a5ba1a2476c4d39b10f7e2f7ebbb72ac4">unusedRangeSizeMax</a> = VMA_MIN(outInfo.<a class="code" href="struct_vma_stat_info.html#a5ba1a2476c4d39b10f7e2f7ebbb72ac4">unusedRangeSizeMax</a>, unusedRangeSize);</div>
-<div class="line"><a name="l10174"></a><span class="lineno">10174</span>&#160;                }</div>
-<div class="line"><a name="l10175"></a><span class="lineno">10175</span>&#160;            </div>
-<div class="line"><a name="l10176"></a><span class="lineno">10176</span>&#160;                <span class="comment">// 2. Process this allocation.</span></div>
-<div class="line"><a name="l10177"></a><span class="lineno">10177</span>&#160;                <span class="comment">// There is allocation with suballoc.offset, suballoc.size.</span></div>
-<div class="line"><a name="l10178"></a><span class="lineno">10178</span>&#160;                outInfo.<a class="code" href="struct_vma_stat_info.html#ab0c6c73837e5a70c749fbd4f6064895a">usedBytes</a> += suballoc.size;</div>
-<div class="line"><a name="l10179"></a><span class="lineno">10179</span>&#160;                outInfo.<a class="code" href="struct_vma_stat_info.html#ade8b40bd3139c04aabd2fc538a356fea">allocationSizeMin</a> = VMA_MIN(outInfo.<a class="code" href="struct_vma_stat_info.html#ade8b40bd3139c04aabd2fc538a356fea">allocationSizeMin</a>, suballoc.size);</div>
-<div class="line"><a name="l10180"></a><span class="lineno">10180</span>&#160;                outInfo.<a class="code" href="struct_vma_stat_info.html#a17e9733a5ecd76287d4db6e66f71f50c">allocationSizeMax</a> = VMA_MIN(outInfo.<a class="code" href="struct_vma_stat_info.html#a17e9733a5ecd76287d4db6e66f71f50c">allocationSizeMax</a>, suballoc.size);</div>
-<div class="line"><a name="l10181"></a><span class="lineno">10181</span>&#160;            </div>
-<div class="line"><a name="l10182"></a><span class="lineno">10182</span>&#160;                <span class="comment">// 3. Prepare for next iteration.</span></div>
-<div class="line"><a name="l10183"></a><span class="lineno">10183</span>&#160;                lastOffset = suballoc.offset + suballoc.size;</div>
-<div class="line"><a name="l10184"></a><span class="lineno">10184</span>&#160;                --nextAlloc2ndIndex;</div>
-<div class="line"><a name="l10185"></a><span class="lineno">10185</span>&#160;            }</div>
-<div class="line"><a name="l10186"></a><span class="lineno">10186</span>&#160;            <span class="comment">// We are at the end.</span></div>
-<div class="line"><a name="l10187"></a><span class="lineno">10187</span>&#160;            <span class="keywordflow">else</span></div>
-<div class="line"><a name="l10188"></a><span class="lineno">10188</span>&#160;            {</div>
-<div class="line"><a name="l10189"></a><span class="lineno">10189</span>&#160;                <span class="comment">// There is free space from lastOffset to size.</span></div>
-<div class="line"><a name="l10190"></a><span class="lineno">10190</span>&#160;                <span class="keywordflow">if</span>(lastOffset &lt; size)</div>
-<div class="line"><a name="l10191"></a><span class="lineno">10191</span>&#160;                {</div>
-<div class="line"><a name="l10192"></a><span class="lineno">10192</span>&#160;                    <span class="keyword">const</span> VkDeviceSize unusedRangeSize = size - lastOffset;</div>
-<div class="line"><a name="l10193"></a><span class="lineno">10193</span>&#160;                    ++outInfo.<a class="code" href="struct_vma_stat_info.html#ae06129c771bfebfd6468a7f4276502a9">unusedRangeCount</a>;</div>
-<div class="line"><a name="l10194"></a><span class="lineno">10194</span>&#160;                    outInfo.<a class="code" href="struct_vma_stat_info.html#a1859d290aca2cd582d8dc25922092669">unusedBytes</a> += unusedRangeSize;</div>
-<div class="line"><a name="l10195"></a><span class="lineno">10195</span>&#160;                    outInfo.<a class="code" href="struct_vma_stat_info.html#aedeba931324f16589cd2416c0d2dd0d4">unusedRangeSizeMin</a> = VMA_MIN(outInfo.<a class="code" href="struct_vma_stat_info.html#aedeba931324f16589cd2416c0d2dd0d4">unusedRangeSizeMin</a>, unusedRangeSize);</div>
-<div class="line"><a name="l10196"></a><span class="lineno">10196</span>&#160;                    outInfo.<a class="code" href="struct_vma_stat_info.html#a5ba1a2476c4d39b10f7e2f7ebbb72ac4">unusedRangeSizeMax</a> = VMA_MIN(outInfo.<a class="code" href="struct_vma_stat_info.html#a5ba1a2476c4d39b10f7e2f7ebbb72ac4">unusedRangeSizeMax</a>, unusedRangeSize);</div>
-<div class="line"><a name="l10197"></a><span class="lineno">10197</span>&#160;               }</div>
-<div class="line"><a name="l10198"></a><span class="lineno">10198</span>&#160; </div>
-<div class="line"><a name="l10199"></a><span class="lineno">10199</span>&#160;                <span class="comment">// End of loop.</span></div>
-<div class="line"><a name="l10200"></a><span class="lineno">10200</span>&#160;                lastOffset = size;</div>
-<div class="line"><a name="l10201"></a><span class="lineno">10201</span>&#160;            }</div>
-<div class="line"><a name="l10202"></a><span class="lineno">10202</span>&#160;        }</div>
-<div class="line"><a name="l10203"></a><span class="lineno">10203</span>&#160;    }</div>
-<div class="line"><a name="l10204"></a><span class="lineno">10204</span>&#160; </div>
-<div class="line"><a name="l10205"></a><span class="lineno">10205</span>&#160;    outInfo.<a class="code" href="struct_vma_stat_info.html#a1859d290aca2cd582d8dc25922092669">unusedBytes</a> = size - outInfo.<a class="code" href="struct_vma_stat_info.html#ab0c6c73837e5a70c749fbd4f6064895a">usedBytes</a>;</div>
-<div class="line"><a name="l10206"></a><span class="lineno">10206</span>&#160;}</div>
+<div class="line"><a name="l10130"></a><span class="lineno">10130</span>&#160;    }</div>
+<div class="line"><a name="l10131"></a><span class="lineno">10131</span>&#160; </div>
+<div class="line"><a name="l10132"></a><span class="lineno">10132</span>&#160;    <span class="comment">// All tests passed: Success. pOffset is already filled.</span></div>
+<div class="line"><a name="l10133"></a><span class="lineno">10133</span>&#160;    <span class="keywordflow">return</span> <span class="keyword">true</span>;</div>
+<div class="line"><a name="l10134"></a><span class="lineno">10134</span>&#160;}</div>
+<div class="line"><a name="l10135"></a><span class="lineno">10135</span>&#160; </div>
+<div class="line"><a name="l10136"></a><span class="lineno">10136</span>&#160;<span class="keywordtype">void</span> VmaBlockMetadata_Generic::MergeFreeWithNext(VmaSuballocationList::iterator item)</div>
+<div class="line"><a name="l10137"></a><span class="lineno">10137</span>&#160;{</div>
+<div class="line"><a name="l10138"></a><span class="lineno">10138</span>&#160;    VMA_ASSERT(item != m_Suballocations.end());</div>
+<div class="line"><a name="l10139"></a><span class="lineno">10139</span>&#160;    VMA_ASSERT(item-&gt;type == VMA_SUBALLOCATION_TYPE_FREE);</div>
+<div class="line"><a name="l10140"></a><span class="lineno">10140</span>&#160; </div>
+<div class="line"><a name="l10141"></a><span class="lineno">10141</span>&#160;    VmaSuballocationList::iterator nextItem = item;</div>
+<div class="line"><a name="l10142"></a><span class="lineno">10142</span>&#160;    ++nextItem;</div>
+<div class="line"><a name="l10143"></a><span class="lineno">10143</span>&#160;    VMA_ASSERT(nextItem != m_Suballocations.end());</div>
+<div class="line"><a name="l10144"></a><span class="lineno">10144</span>&#160;    VMA_ASSERT(nextItem-&gt;type == VMA_SUBALLOCATION_TYPE_FREE);</div>
+<div class="line"><a name="l10145"></a><span class="lineno">10145</span>&#160; </div>
+<div class="line"><a name="l10146"></a><span class="lineno">10146</span>&#160;    item-&gt;size += nextItem-&gt;size;</div>
+<div class="line"><a name="l10147"></a><span class="lineno">10147</span>&#160;    --m_FreeCount;</div>
+<div class="line"><a name="l10148"></a><span class="lineno">10148</span>&#160;    m_Suballocations.erase(nextItem);</div>
+<div class="line"><a name="l10149"></a><span class="lineno">10149</span>&#160;}</div>
+<div class="line"><a name="l10150"></a><span class="lineno">10150</span>&#160; </div>
+<div class="line"><a name="l10151"></a><span class="lineno">10151</span>&#160;VmaSuballocationList::iterator VmaBlockMetadata_Generic::FreeSuballocation(VmaSuballocationList::iterator suballocItem)</div>
+<div class="line"><a name="l10152"></a><span class="lineno">10152</span>&#160;{</div>
+<div class="line"><a name="l10153"></a><span class="lineno">10153</span>&#160;    <span class="comment">// Change this suballocation to be marked as free.</span></div>
+<div class="line"><a name="l10154"></a><span class="lineno">10154</span>&#160;    VmaSuballocation&amp; suballoc = *suballocItem;</div>
+<div class="line"><a name="l10155"></a><span class="lineno">10155</span>&#160;    suballoc.type = VMA_SUBALLOCATION_TYPE_FREE;</div>
+<div class="line"><a name="l10156"></a><span class="lineno">10156</span>&#160;    suballoc.hAllocation = VK_NULL_HANDLE;</div>
+<div class="line"><a name="l10157"></a><span class="lineno">10157</span>&#160; </div>
+<div class="line"><a name="l10158"></a><span class="lineno">10158</span>&#160;    <span class="comment">// Update totals.</span></div>
+<div class="line"><a name="l10159"></a><span class="lineno">10159</span>&#160;    ++m_FreeCount;</div>
+<div class="line"><a name="l10160"></a><span class="lineno">10160</span>&#160;    m_SumFreeSize += suballoc.size;</div>
+<div class="line"><a name="l10161"></a><span class="lineno">10161</span>&#160; </div>
+<div class="line"><a name="l10162"></a><span class="lineno">10162</span>&#160;    <span class="comment">// Merge with previous and/or next suballocation if it&#39;s also free.</span></div>
+<div class="line"><a name="l10163"></a><span class="lineno">10163</span>&#160;    <span class="keywordtype">bool</span> mergeWithNext = <span class="keyword">false</span>;</div>
+<div class="line"><a name="l10164"></a><span class="lineno">10164</span>&#160;    <span class="keywordtype">bool</span> mergeWithPrev = <span class="keyword">false</span>;</div>
+<div class="line"><a name="l10165"></a><span class="lineno">10165</span>&#160; </div>
+<div class="line"><a name="l10166"></a><span class="lineno">10166</span>&#160;    VmaSuballocationList::iterator nextItem = suballocItem;</div>
+<div class="line"><a name="l10167"></a><span class="lineno">10167</span>&#160;    ++nextItem;</div>
+<div class="line"><a name="l10168"></a><span class="lineno">10168</span>&#160;    <span class="keywordflow">if</span>((nextItem != m_Suballocations.end()) &amp;&amp; (nextItem-&gt;type == VMA_SUBALLOCATION_TYPE_FREE))</div>
+<div class="line"><a name="l10169"></a><span class="lineno">10169</span>&#160;    {</div>
+<div class="line"><a name="l10170"></a><span class="lineno">10170</span>&#160;        mergeWithNext = <span class="keyword">true</span>;</div>
+<div class="line"><a name="l10171"></a><span class="lineno">10171</span>&#160;    }</div>
+<div class="line"><a name="l10172"></a><span class="lineno">10172</span>&#160; </div>
+<div class="line"><a name="l10173"></a><span class="lineno">10173</span>&#160;    VmaSuballocationList::iterator prevItem = suballocItem;</div>
+<div class="line"><a name="l10174"></a><span class="lineno">10174</span>&#160;    <span class="keywordflow">if</span>(suballocItem != m_Suballocations.begin())</div>
+<div class="line"><a name="l10175"></a><span class="lineno">10175</span>&#160;    {</div>
+<div class="line"><a name="l10176"></a><span class="lineno">10176</span>&#160;        --prevItem;</div>
+<div class="line"><a name="l10177"></a><span class="lineno">10177</span>&#160;        <span class="keywordflow">if</span>(prevItem-&gt;type == VMA_SUBALLOCATION_TYPE_FREE)</div>
+<div class="line"><a name="l10178"></a><span class="lineno">10178</span>&#160;        {</div>
+<div class="line"><a name="l10179"></a><span class="lineno">10179</span>&#160;            mergeWithPrev = <span class="keyword">true</span>;</div>
+<div class="line"><a name="l10180"></a><span class="lineno">10180</span>&#160;        }</div>
+<div class="line"><a name="l10181"></a><span class="lineno">10181</span>&#160;    }</div>
+<div class="line"><a name="l10182"></a><span class="lineno">10182</span>&#160; </div>
+<div class="line"><a name="l10183"></a><span class="lineno">10183</span>&#160;    <span class="keywordflow">if</span>(mergeWithNext)</div>
+<div class="line"><a name="l10184"></a><span class="lineno">10184</span>&#160;    {</div>
+<div class="line"><a name="l10185"></a><span class="lineno">10185</span>&#160;        UnregisterFreeSuballocation(nextItem);</div>
+<div class="line"><a name="l10186"></a><span class="lineno">10186</span>&#160;        MergeFreeWithNext(suballocItem);</div>
+<div class="line"><a name="l10187"></a><span class="lineno">10187</span>&#160;    }</div>
+<div class="line"><a name="l10188"></a><span class="lineno">10188</span>&#160; </div>
+<div class="line"><a name="l10189"></a><span class="lineno">10189</span>&#160;    <span class="keywordflow">if</span>(mergeWithPrev)</div>
+<div class="line"><a name="l10190"></a><span class="lineno">10190</span>&#160;    {</div>
+<div class="line"><a name="l10191"></a><span class="lineno">10191</span>&#160;        UnregisterFreeSuballocation(prevItem);</div>
+<div class="line"><a name="l10192"></a><span class="lineno">10192</span>&#160;        MergeFreeWithNext(prevItem);</div>
+<div class="line"><a name="l10193"></a><span class="lineno">10193</span>&#160;        RegisterFreeSuballocation(prevItem);</div>
+<div class="line"><a name="l10194"></a><span class="lineno">10194</span>&#160;        <span class="keywordflow">return</span> prevItem;</div>
+<div class="line"><a name="l10195"></a><span class="lineno">10195</span>&#160;    }</div>
+<div class="line"><a name="l10196"></a><span class="lineno">10196</span>&#160;    <span class="keywordflow">else</span></div>
+<div class="line"><a name="l10197"></a><span class="lineno">10197</span>&#160;    {</div>
+<div class="line"><a name="l10198"></a><span class="lineno">10198</span>&#160;        RegisterFreeSuballocation(suballocItem);</div>
+<div class="line"><a name="l10199"></a><span class="lineno">10199</span>&#160;        <span class="keywordflow">return</span> suballocItem;</div>
+<div class="line"><a name="l10200"></a><span class="lineno">10200</span>&#160;    }</div>
+<div class="line"><a name="l10201"></a><span class="lineno">10201</span>&#160;}</div>
+<div class="line"><a name="l10202"></a><span class="lineno">10202</span>&#160; </div>
+<div class="line"><a name="l10203"></a><span class="lineno">10203</span>&#160;<span class="keywordtype">void</span> VmaBlockMetadata_Generic::RegisterFreeSuballocation(VmaSuballocationList::iterator item)</div>
+<div class="line"><a name="l10204"></a><span class="lineno">10204</span>&#160;{</div>
+<div class="line"><a name="l10205"></a><span class="lineno">10205</span>&#160;    VMA_ASSERT(item-&gt;type == VMA_SUBALLOCATION_TYPE_FREE);</div>
+<div class="line"><a name="l10206"></a><span class="lineno">10206</span>&#160;    VMA_ASSERT(item-&gt;size &gt; 0);</div>
 <div class="line"><a name="l10207"></a><span class="lineno">10207</span>&#160; </div>
-<div class="line"><a name="l10208"></a><span class="lineno">10208</span>&#160;<span class="keywordtype">void</span> VmaBlockMetadata_Linear::AddPoolStats(<a class="code" href="struct_vma_pool_stats.html">VmaPoolStats</a>&amp; inoutStats)<span class="keyword"> const</span></div>
-<div class="line"><a name="l10209"></a><span class="lineno">10209</span>&#160;<span class="keyword"></span>{</div>
-<div class="line"><a name="l10210"></a><span class="lineno">10210</span>&#160;    <span class="keyword">const</span> SuballocationVectorType&amp; suballocations1st = AccessSuballocations1st();</div>
-<div class="line"><a name="l10211"></a><span class="lineno">10211</span>&#160;    <span class="keyword">const</span> SuballocationVectorType&amp; suballocations2nd = AccessSuballocations2nd();</div>
-<div class="line"><a name="l10212"></a><span class="lineno">10212</span>&#160;    <span class="keyword">const</span> VkDeviceSize size = GetSize();</div>
-<div class="line"><a name="l10213"></a><span class="lineno">10213</span>&#160;    <span class="keyword">const</span> <span class="keywordtype">size_t</span> suballoc1stCount = suballocations1st.size();</div>
-<div class="line"><a name="l10214"></a><span class="lineno">10214</span>&#160;    <span class="keyword">const</span> <span class="keywordtype">size_t</span> suballoc2ndCount = suballocations2nd.size();</div>
-<div class="line"><a name="l10215"></a><span class="lineno">10215</span>&#160; </div>
-<div class="line"><a name="l10216"></a><span class="lineno">10216</span>&#160;    inoutStats.<a class="code" href="struct_vma_pool_stats.html#a326807b2de2b0931cee4ed9a5f2e420c">size</a> += size;</div>
-<div class="line"><a name="l10217"></a><span class="lineno">10217</span>&#160; </div>
-<div class="line"><a name="l10218"></a><span class="lineno">10218</span>&#160;    VkDeviceSize lastOffset = 0;</div>
-<div class="line"><a name="l10219"></a><span class="lineno">10219</span>&#160; </div>
-<div class="line"><a name="l10220"></a><span class="lineno">10220</span>&#160;    <span class="keywordflow">if</span>(m_2ndVectorMode == SECOND_VECTOR_RING_BUFFER)</div>
-<div class="line"><a name="l10221"></a><span class="lineno">10221</span>&#160;    {</div>
-<div class="line"><a name="l10222"></a><span class="lineno">10222</span>&#160;        <span class="keyword">const</span> VkDeviceSize freeSpace2ndTo1stEnd = suballocations1st[m_1stNullItemsBeginCount].offset;</div>
-<div class="line"><a name="l10223"></a><span class="lineno">10223</span>&#160;        <span class="keywordtype">size_t</span> nextAlloc2ndIndex = m_1stNullItemsBeginCount;</div>
-<div class="line"><a name="l10224"></a><span class="lineno">10224</span>&#160;        <span class="keywordflow">while</span>(lastOffset &lt; freeSpace2ndTo1stEnd)</div>
-<div class="line"><a name="l10225"></a><span class="lineno">10225</span>&#160;        {</div>
-<div class="line"><a name="l10226"></a><span class="lineno">10226</span>&#160;            <span class="comment">// Find next non-null allocation or move nextAlloc2ndIndex to the end.</span></div>
-<div class="line"><a name="l10227"></a><span class="lineno">10227</span>&#160;            <span class="keywordflow">while</span>(nextAlloc2ndIndex &lt; suballoc2ndCount &amp;&amp;</div>
-<div class="line"><a name="l10228"></a><span class="lineno">10228</span>&#160;                suballocations2nd[nextAlloc2ndIndex].hAllocation == VK_NULL_HANDLE)</div>
-<div class="line"><a name="l10229"></a><span class="lineno">10229</span>&#160;            {</div>
-<div class="line"><a name="l10230"></a><span class="lineno">10230</span>&#160;                ++nextAlloc2ndIndex;</div>
-<div class="line"><a name="l10231"></a><span class="lineno">10231</span>&#160;            }</div>
+<div class="line"><a name="l10208"></a><span class="lineno">10208</span>&#160;    <span class="comment">// You may want to enable this validation at the beginning or at the end of</span></div>
+<div class="line"><a name="l10209"></a><span class="lineno">10209</span>&#160;    <span class="comment">// this function, depending on what do you want to check.</span></div>
+<div class="line"><a name="l10210"></a><span class="lineno">10210</span>&#160;    VMA_HEAVY_ASSERT(ValidateFreeSuballocationList());</div>
+<div class="line"><a name="l10211"></a><span class="lineno">10211</span>&#160; </div>
+<div class="line"><a name="l10212"></a><span class="lineno">10212</span>&#160;    <span class="keywordflow">if</span>(item-&gt;size &gt;= VMA_MIN_FREE_SUBALLOCATION_SIZE_TO_REGISTER)</div>
+<div class="line"><a name="l10213"></a><span class="lineno">10213</span>&#160;    {</div>
+<div class="line"><a name="l10214"></a><span class="lineno">10214</span>&#160;        <span class="keywordflow">if</span>(m_FreeSuballocationsBySize.empty())</div>
+<div class="line"><a name="l10215"></a><span class="lineno">10215</span>&#160;        {</div>
+<div class="line"><a name="l10216"></a><span class="lineno">10216</span>&#160;            m_FreeSuballocationsBySize.push_back(item);</div>
+<div class="line"><a name="l10217"></a><span class="lineno">10217</span>&#160;        }</div>
+<div class="line"><a name="l10218"></a><span class="lineno">10218</span>&#160;        <span class="keywordflow">else</span></div>
+<div class="line"><a name="l10219"></a><span class="lineno">10219</span>&#160;        {</div>
+<div class="line"><a name="l10220"></a><span class="lineno">10220</span>&#160;            VmaVectorInsertSorted&lt;VmaSuballocationItemSizeLess&gt;(m_FreeSuballocationsBySize, item);</div>
+<div class="line"><a name="l10221"></a><span class="lineno">10221</span>&#160;        }</div>
+<div class="line"><a name="l10222"></a><span class="lineno">10222</span>&#160;    }</div>
+<div class="line"><a name="l10223"></a><span class="lineno">10223</span>&#160; </div>
+<div class="line"><a name="l10224"></a><span class="lineno">10224</span>&#160;    <span class="comment">//VMA_HEAVY_ASSERT(ValidateFreeSuballocationList());</span></div>
+<div class="line"><a name="l10225"></a><span class="lineno">10225</span>&#160;}</div>
+<div class="line"><a name="l10226"></a><span class="lineno">10226</span>&#160; </div>
+<div class="line"><a name="l10227"></a><span class="lineno">10227</span>&#160; </div>
+<div class="line"><a name="l10228"></a><span class="lineno">10228</span>&#160;<span class="keywordtype">void</span> VmaBlockMetadata_Generic::UnregisterFreeSuballocation(VmaSuballocationList::iterator item)</div>
+<div class="line"><a name="l10229"></a><span class="lineno">10229</span>&#160;{</div>
+<div class="line"><a name="l10230"></a><span class="lineno">10230</span>&#160;    VMA_ASSERT(item-&gt;type == VMA_SUBALLOCATION_TYPE_FREE);</div>
+<div class="line"><a name="l10231"></a><span class="lineno">10231</span>&#160;    VMA_ASSERT(item-&gt;size &gt; 0);</div>
 <div class="line"><a name="l10232"></a><span class="lineno">10232</span>&#160; </div>
-<div class="line"><a name="l10233"></a><span class="lineno">10233</span>&#160;            <span class="comment">// Found non-null allocation.</span></div>
-<div class="line"><a name="l10234"></a><span class="lineno">10234</span>&#160;            <span class="keywordflow">if</span>(nextAlloc2ndIndex &lt; suballoc2ndCount)</div>
-<div class="line"><a name="l10235"></a><span class="lineno">10235</span>&#160;            {</div>
-<div class="line"><a name="l10236"></a><span class="lineno">10236</span>&#160;                <span class="keyword">const</span> VmaSuballocation&amp; suballoc = suballocations2nd[nextAlloc2ndIndex];</div>
-<div class="line"><a name="l10237"></a><span class="lineno">10237</span>&#160;            </div>
-<div class="line"><a name="l10238"></a><span class="lineno">10238</span>&#160;                <span class="comment">// 1. Process free space before this allocation.</span></div>
-<div class="line"><a name="l10239"></a><span class="lineno">10239</span>&#160;                <span class="keywordflow">if</span>(lastOffset &lt; suballoc.offset)</div>
-<div class="line"><a name="l10240"></a><span class="lineno">10240</span>&#160;                {</div>
-<div class="line"><a name="l10241"></a><span class="lineno">10241</span>&#160;                    <span class="comment">// There is free space from lastOffset to suballoc.offset.</span></div>
-<div class="line"><a name="l10242"></a><span class="lineno">10242</span>&#160;                    <span class="keyword">const</span> VkDeviceSize unusedRangeSize = suballoc.offset - lastOffset;</div>
-<div class="line"><a name="l10243"></a><span class="lineno">10243</span>&#160;                    inoutStats.<a class="code" href="struct_vma_pool_stats.html#ad7c54874724fce7b06aba526202d82a8">unusedSize</a> += unusedRangeSize;</div>
-<div class="line"><a name="l10244"></a><span class="lineno">10244</span>&#160;                    ++inoutStats.<a class="code" href="struct_vma_pool_stats.html#ae4f3546ffa4d1e598b64d8e6134854f4">unusedRangeCount</a>;</div>
-<div class="line"><a name="l10245"></a><span class="lineno">10245</span>&#160;                    inoutStats.<a class="code" href="struct_vma_pool_stats.html#ab4c8f52dd42ab01998f60f0b6acc722b">unusedRangeSizeMax</a> = VMA_MAX(inoutStats.<a class="code" href="struct_vma_pool_stats.html#ab4c8f52dd42ab01998f60f0b6acc722b">unusedRangeSizeMax</a>, unusedRangeSize);</div>
-<div class="line"><a name="l10246"></a><span class="lineno">10246</span>&#160;                }</div>
-<div class="line"><a name="l10247"></a><span class="lineno">10247</span>&#160;            </div>
-<div class="line"><a name="l10248"></a><span class="lineno">10248</span>&#160;                <span class="comment">// 2. Process this allocation.</span></div>
-<div class="line"><a name="l10249"></a><span class="lineno">10249</span>&#160;                <span class="comment">// There is allocation with suballoc.offset, suballoc.size.</span></div>
-<div class="line"><a name="l10250"></a><span class="lineno">10250</span>&#160;                ++inoutStats.<a class="code" href="struct_vma_pool_stats.html#ad1924eb54fffa45e9e0e65670c8fe5eb">allocationCount</a>;</div>
-<div class="line"><a name="l10251"></a><span class="lineno">10251</span>&#160;            </div>
-<div class="line"><a name="l10252"></a><span class="lineno">10252</span>&#160;                <span class="comment">// 3. Prepare for next iteration.</span></div>
-<div class="line"><a name="l10253"></a><span class="lineno">10253</span>&#160;                lastOffset = suballoc.offset + suballoc.size;</div>
-<div class="line"><a name="l10254"></a><span class="lineno">10254</span>&#160;                ++nextAlloc2ndIndex;</div>
-<div class="line"><a name="l10255"></a><span class="lineno">10255</span>&#160;            }</div>
-<div class="line"><a name="l10256"></a><span class="lineno">10256</span>&#160;            <span class="comment">// We are at the end.</span></div>
-<div class="line"><a name="l10257"></a><span class="lineno">10257</span>&#160;            <span class="keywordflow">else</span></div>
-<div class="line"><a name="l10258"></a><span class="lineno">10258</span>&#160;            {</div>
-<div class="line"><a name="l10259"></a><span class="lineno">10259</span>&#160;                <span class="keywordflow">if</span>(lastOffset &lt; freeSpace2ndTo1stEnd)</div>
-<div class="line"><a name="l10260"></a><span class="lineno">10260</span>&#160;                {</div>
-<div class="line"><a name="l10261"></a><span class="lineno">10261</span>&#160;                    <span class="comment">// There is free space from lastOffset to freeSpace2ndTo1stEnd.</span></div>
-<div class="line"><a name="l10262"></a><span class="lineno">10262</span>&#160;                    <span class="keyword">const</span> VkDeviceSize unusedRangeSize = freeSpace2ndTo1stEnd - lastOffset;</div>
-<div class="line"><a name="l10263"></a><span class="lineno">10263</span>&#160;                    inoutStats.<a class="code" href="struct_vma_pool_stats.html#ad7c54874724fce7b06aba526202d82a8">unusedSize</a> += unusedRangeSize;</div>
-<div class="line"><a name="l10264"></a><span class="lineno">10264</span>&#160;                    ++inoutStats.<a class="code" href="struct_vma_pool_stats.html#ae4f3546ffa4d1e598b64d8e6134854f4">unusedRangeCount</a>;</div>
-<div class="line"><a name="l10265"></a><span class="lineno">10265</span>&#160;                    inoutStats.<a class="code" href="struct_vma_pool_stats.html#ab4c8f52dd42ab01998f60f0b6acc722b">unusedRangeSizeMax</a> = VMA_MAX(inoutStats.<a class="code" href="struct_vma_pool_stats.html#ab4c8f52dd42ab01998f60f0b6acc722b">unusedRangeSizeMax</a>, unusedRangeSize);</div>
-<div class="line"><a name="l10266"></a><span class="lineno">10266</span>&#160;                }</div>
-<div class="line"><a name="l10267"></a><span class="lineno">10267</span>&#160; </div>
-<div class="line"><a name="l10268"></a><span class="lineno">10268</span>&#160;                <span class="comment">// End of loop.</span></div>
-<div class="line"><a name="l10269"></a><span class="lineno">10269</span>&#160;                lastOffset = freeSpace2ndTo1stEnd;</div>
-<div class="line"><a name="l10270"></a><span class="lineno">10270</span>&#160;            }</div>
-<div class="line"><a name="l10271"></a><span class="lineno">10271</span>&#160;        }</div>
-<div class="line"><a name="l10272"></a><span class="lineno">10272</span>&#160;    }</div>
-<div class="line"><a name="l10273"></a><span class="lineno">10273</span>&#160; </div>
-<div class="line"><a name="l10274"></a><span class="lineno">10274</span>&#160;    <span class="keywordtype">size_t</span> nextAlloc1stIndex = m_1stNullItemsBeginCount;</div>
-<div class="line"><a name="l10275"></a><span class="lineno">10275</span>&#160;    <span class="keyword">const</span> VkDeviceSize freeSpace1stTo2ndEnd =</div>
-<div class="line"><a name="l10276"></a><span class="lineno">10276</span>&#160;        m_2ndVectorMode == SECOND_VECTOR_DOUBLE_STACK ? suballocations2nd.back().offset : size;</div>
-<div class="line"><a name="l10277"></a><span class="lineno">10277</span>&#160;    <span class="keywordflow">while</span>(lastOffset &lt; freeSpace1stTo2ndEnd)</div>
-<div class="line"><a name="l10278"></a><span class="lineno">10278</span>&#160;    {</div>
-<div class="line"><a name="l10279"></a><span class="lineno">10279</span>&#160;        <span class="comment">// Find next non-null allocation or move nextAllocIndex to the end.</span></div>
-<div class="line"><a name="l10280"></a><span class="lineno">10280</span>&#160;        <span class="keywordflow">while</span>(nextAlloc1stIndex &lt; suballoc1stCount &amp;&amp;</div>
-<div class="line"><a name="l10281"></a><span class="lineno">10281</span>&#160;            suballocations1st[nextAlloc1stIndex].hAllocation == VK_NULL_HANDLE)</div>
-<div class="line"><a name="l10282"></a><span class="lineno">10282</span>&#160;        {</div>
-<div class="line"><a name="l10283"></a><span class="lineno">10283</span>&#160;            ++nextAlloc1stIndex;</div>
-<div class="line"><a name="l10284"></a><span class="lineno">10284</span>&#160;        }</div>
-<div class="line"><a name="l10285"></a><span class="lineno">10285</span>&#160; </div>
-<div class="line"><a name="l10286"></a><span class="lineno">10286</span>&#160;        <span class="comment">// Found non-null allocation.</span></div>
-<div class="line"><a name="l10287"></a><span class="lineno">10287</span>&#160;        <span class="keywordflow">if</span>(nextAlloc1stIndex &lt; suballoc1stCount)</div>
-<div class="line"><a name="l10288"></a><span class="lineno">10288</span>&#160;        {</div>
-<div class="line"><a name="l10289"></a><span class="lineno">10289</span>&#160;            <span class="keyword">const</span> VmaSuballocation&amp; suballoc = suballocations1st[nextAlloc1stIndex];</div>
-<div class="line"><a name="l10290"></a><span class="lineno">10290</span>&#160;            </div>
-<div class="line"><a name="l10291"></a><span class="lineno">10291</span>&#160;            <span class="comment">// 1. Process free space before this allocation.</span></div>
-<div class="line"><a name="l10292"></a><span class="lineno">10292</span>&#160;            <span class="keywordflow">if</span>(lastOffset &lt; suballoc.offset)</div>
-<div class="line"><a name="l10293"></a><span class="lineno">10293</span>&#160;            {</div>
-<div class="line"><a name="l10294"></a><span class="lineno">10294</span>&#160;                <span class="comment">// There is free space from lastOffset to suballoc.offset.</span></div>
-<div class="line"><a name="l10295"></a><span class="lineno">10295</span>&#160;                <span class="keyword">const</span> VkDeviceSize unusedRangeSize = suballoc.offset - lastOffset;</div>
-<div class="line"><a name="l10296"></a><span class="lineno">10296</span>&#160;                inoutStats.<a class="code" href="struct_vma_pool_stats.html#ad7c54874724fce7b06aba526202d82a8">unusedSize</a> += unusedRangeSize;</div>
-<div class="line"><a name="l10297"></a><span class="lineno">10297</span>&#160;                ++inoutStats.<a class="code" href="struct_vma_pool_stats.html#ae4f3546ffa4d1e598b64d8e6134854f4">unusedRangeCount</a>;</div>
-<div class="line"><a name="l10298"></a><span class="lineno">10298</span>&#160;                inoutStats.<a class="code" href="struct_vma_pool_stats.html#ab4c8f52dd42ab01998f60f0b6acc722b">unusedRangeSizeMax</a> = VMA_MAX(inoutStats.<a class="code" href="struct_vma_pool_stats.html#ab4c8f52dd42ab01998f60f0b6acc722b">unusedRangeSizeMax</a>, unusedRangeSize);</div>
-<div class="line"><a name="l10299"></a><span class="lineno">10299</span>&#160;            }</div>
-<div class="line"><a name="l10300"></a><span class="lineno">10300</span>&#160;            </div>
-<div class="line"><a name="l10301"></a><span class="lineno">10301</span>&#160;            <span class="comment">// 2. Process this allocation.</span></div>
-<div class="line"><a name="l10302"></a><span class="lineno">10302</span>&#160;            <span class="comment">// There is allocation with suballoc.offset, suballoc.size.</span></div>
-<div class="line"><a name="l10303"></a><span class="lineno">10303</span>&#160;            ++inoutStats.<a class="code" href="struct_vma_pool_stats.html#ad1924eb54fffa45e9e0e65670c8fe5eb">allocationCount</a>;</div>
-<div class="line"><a name="l10304"></a><span class="lineno">10304</span>&#160;            </div>
-<div class="line"><a name="l10305"></a><span class="lineno">10305</span>&#160;            <span class="comment">// 3. Prepare for next iteration.</span></div>
-<div class="line"><a name="l10306"></a><span class="lineno">10306</span>&#160;            lastOffset = suballoc.offset + suballoc.size;</div>
-<div class="line"><a name="l10307"></a><span class="lineno">10307</span>&#160;            ++nextAlloc1stIndex;</div>
-<div class="line"><a name="l10308"></a><span class="lineno">10308</span>&#160;        }</div>
-<div class="line"><a name="l10309"></a><span class="lineno">10309</span>&#160;        <span class="comment">// We are at the end.</span></div>
-<div class="line"><a name="l10310"></a><span class="lineno">10310</span>&#160;        <span class="keywordflow">else</span></div>
-<div class="line"><a name="l10311"></a><span class="lineno">10311</span>&#160;        {</div>
-<div class="line"><a name="l10312"></a><span class="lineno">10312</span>&#160;            <span class="keywordflow">if</span>(lastOffset &lt; freeSpace1stTo2ndEnd)</div>
-<div class="line"><a name="l10313"></a><span class="lineno">10313</span>&#160;            {</div>
-<div class="line"><a name="l10314"></a><span class="lineno">10314</span>&#160;                <span class="comment">// There is free space from lastOffset to freeSpace1stTo2ndEnd.</span></div>
-<div class="line"><a name="l10315"></a><span class="lineno">10315</span>&#160;                <span class="keyword">const</span> VkDeviceSize unusedRangeSize = freeSpace1stTo2ndEnd - lastOffset;</div>
-<div class="line"><a name="l10316"></a><span class="lineno">10316</span>&#160;                inoutStats.<a class="code" href="struct_vma_pool_stats.html#ad7c54874724fce7b06aba526202d82a8">unusedSize</a> += unusedRangeSize;</div>
-<div class="line"><a name="l10317"></a><span class="lineno">10317</span>&#160;                ++inoutStats.<a class="code" href="struct_vma_pool_stats.html#ae4f3546ffa4d1e598b64d8e6134854f4">unusedRangeCount</a>;</div>
-<div class="line"><a name="l10318"></a><span class="lineno">10318</span>&#160;                inoutStats.<a class="code" href="struct_vma_pool_stats.html#ab4c8f52dd42ab01998f60f0b6acc722b">unusedRangeSizeMax</a> = VMA_MAX(inoutStats.<a class="code" href="struct_vma_pool_stats.html#ab4c8f52dd42ab01998f60f0b6acc722b">unusedRangeSizeMax</a>, unusedRangeSize);</div>
-<div class="line"><a name="l10319"></a><span class="lineno">10319</span>&#160;            }</div>
-<div class="line"><a name="l10320"></a><span class="lineno">10320</span>&#160; </div>
-<div class="line"><a name="l10321"></a><span class="lineno">10321</span>&#160;            <span class="comment">// End of loop.</span></div>
-<div class="line"><a name="l10322"></a><span class="lineno">10322</span>&#160;            lastOffset = freeSpace1stTo2ndEnd;</div>
-<div class="line"><a name="l10323"></a><span class="lineno">10323</span>&#160;        }</div>
-<div class="line"><a name="l10324"></a><span class="lineno">10324</span>&#160;    }</div>
-<div class="line"><a name="l10325"></a><span class="lineno">10325</span>&#160; </div>
-<div class="line"><a name="l10326"></a><span class="lineno">10326</span>&#160;    <span class="keywordflow">if</span>(m_2ndVectorMode == SECOND_VECTOR_DOUBLE_STACK)</div>
-<div class="line"><a name="l10327"></a><span class="lineno">10327</span>&#160;    {</div>
-<div class="line"><a name="l10328"></a><span class="lineno">10328</span>&#160;        <span class="keywordtype">size_t</span> nextAlloc2ndIndex = suballocations2nd.size() - 1;</div>
-<div class="line"><a name="l10329"></a><span class="lineno">10329</span>&#160;        <span class="keywordflow">while</span>(lastOffset &lt; size)</div>
-<div class="line"><a name="l10330"></a><span class="lineno">10330</span>&#160;        {</div>
-<div class="line"><a name="l10331"></a><span class="lineno">10331</span>&#160;            <span class="comment">// Find next non-null allocation or move nextAlloc2ndIndex to the end.</span></div>
-<div class="line"><a name="l10332"></a><span class="lineno">10332</span>&#160;            <span class="keywordflow">while</span>(nextAlloc2ndIndex != SIZE_MAX &amp;&amp;</div>
-<div class="line"><a name="l10333"></a><span class="lineno">10333</span>&#160;                suballocations2nd[nextAlloc2ndIndex].hAllocation == VK_NULL_HANDLE)</div>
-<div class="line"><a name="l10334"></a><span class="lineno">10334</span>&#160;            {</div>
-<div class="line"><a name="l10335"></a><span class="lineno">10335</span>&#160;                --nextAlloc2ndIndex;</div>
-<div class="line"><a name="l10336"></a><span class="lineno">10336</span>&#160;            }</div>
-<div class="line"><a name="l10337"></a><span class="lineno">10337</span>&#160; </div>
-<div class="line"><a name="l10338"></a><span class="lineno">10338</span>&#160;            <span class="comment">// Found non-null allocation.</span></div>
-<div class="line"><a name="l10339"></a><span class="lineno">10339</span>&#160;            <span class="keywordflow">if</span>(nextAlloc2ndIndex != SIZE_MAX)</div>
-<div class="line"><a name="l10340"></a><span class="lineno">10340</span>&#160;            {</div>
-<div class="line"><a name="l10341"></a><span class="lineno">10341</span>&#160;                <span class="keyword">const</span> VmaSuballocation&amp; suballoc = suballocations2nd[nextAlloc2ndIndex];</div>
-<div class="line"><a name="l10342"></a><span class="lineno">10342</span>&#160;            </div>
-<div class="line"><a name="l10343"></a><span class="lineno">10343</span>&#160;                <span class="comment">// 1. Process free space before this allocation.</span></div>
-<div class="line"><a name="l10344"></a><span class="lineno">10344</span>&#160;                <span class="keywordflow">if</span>(lastOffset &lt; suballoc.offset)</div>
-<div class="line"><a name="l10345"></a><span class="lineno">10345</span>&#160;                {</div>
-<div class="line"><a name="l10346"></a><span class="lineno">10346</span>&#160;                    <span class="comment">// There is free space from lastOffset to suballoc.offset.</span></div>
-<div class="line"><a name="l10347"></a><span class="lineno">10347</span>&#160;                    <span class="keyword">const</span> VkDeviceSize unusedRangeSize = suballoc.offset - lastOffset;</div>
-<div class="line"><a name="l10348"></a><span class="lineno">10348</span>&#160;                    inoutStats.<a class="code" href="struct_vma_pool_stats.html#ad7c54874724fce7b06aba526202d82a8">unusedSize</a> += unusedRangeSize;</div>
-<div class="line"><a name="l10349"></a><span class="lineno">10349</span>&#160;                    ++inoutStats.<a class="code" href="struct_vma_pool_stats.html#ae4f3546ffa4d1e598b64d8e6134854f4">unusedRangeCount</a>;</div>
-<div class="line"><a name="l10350"></a><span class="lineno">10350</span>&#160;                    inoutStats.<a class="code" href="struct_vma_pool_stats.html#ab4c8f52dd42ab01998f60f0b6acc722b">unusedRangeSizeMax</a> = VMA_MAX(inoutStats.<a class="code" href="struct_vma_pool_stats.html#ab4c8f52dd42ab01998f60f0b6acc722b">unusedRangeSizeMax</a>, unusedRangeSize);</div>
-<div class="line"><a name="l10351"></a><span class="lineno">10351</span>&#160;                }</div>
-<div class="line"><a name="l10352"></a><span class="lineno">10352</span>&#160;            </div>
-<div class="line"><a name="l10353"></a><span class="lineno">10353</span>&#160;                <span class="comment">// 2. Process this allocation.</span></div>
-<div class="line"><a name="l10354"></a><span class="lineno">10354</span>&#160;                <span class="comment">// There is allocation with suballoc.offset, suballoc.size.</span></div>
-<div class="line"><a name="l10355"></a><span class="lineno">10355</span>&#160;                ++inoutStats.<a class="code" href="struct_vma_pool_stats.html#ad1924eb54fffa45e9e0e65670c8fe5eb">allocationCount</a>;</div>
-<div class="line"><a name="l10356"></a><span class="lineno">10356</span>&#160;            </div>
-<div class="line"><a name="l10357"></a><span class="lineno">10357</span>&#160;                <span class="comment">// 3. Prepare for next iteration.</span></div>
-<div class="line"><a name="l10358"></a><span class="lineno">10358</span>&#160;                lastOffset = suballoc.offset + suballoc.size;</div>
-<div class="line"><a name="l10359"></a><span class="lineno">10359</span>&#160;                --nextAlloc2ndIndex;</div>
-<div class="line"><a name="l10360"></a><span class="lineno">10360</span>&#160;            }</div>
-<div class="line"><a name="l10361"></a><span class="lineno">10361</span>&#160;            <span class="comment">// We are at the end.</span></div>
-<div class="line"><a name="l10362"></a><span class="lineno">10362</span>&#160;            <span class="keywordflow">else</span></div>
-<div class="line"><a name="l10363"></a><span class="lineno">10363</span>&#160;            {</div>
-<div class="line"><a name="l10364"></a><span class="lineno">10364</span>&#160;                <span class="keywordflow">if</span>(lastOffset &lt; size)</div>
-<div class="line"><a name="l10365"></a><span class="lineno">10365</span>&#160;                {</div>
-<div class="line"><a name="l10366"></a><span class="lineno">10366</span>&#160;                    <span class="comment">// There is free space from lastOffset to size.</span></div>
-<div class="line"><a name="l10367"></a><span class="lineno">10367</span>&#160;                    <span class="keyword">const</span> VkDeviceSize unusedRangeSize = size - lastOffset;</div>
-<div class="line"><a name="l10368"></a><span class="lineno">10368</span>&#160;                    inoutStats.<a class="code" href="struct_vma_pool_stats.html#ad7c54874724fce7b06aba526202d82a8">unusedSize</a> += unusedRangeSize;</div>
-<div class="line"><a name="l10369"></a><span class="lineno">10369</span>&#160;                    ++inoutStats.<a class="code" href="struct_vma_pool_stats.html#ae4f3546ffa4d1e598b64d8e6134854f4">unusedRangeCount</a>;</div>
-<div class="line"><a name="l10370"></a><span class="lineno">10370</span>&#160;                    inoutStats.<a class="code" href="struct_vma_pool_stats.html#ab4c8f52dd42ab01998f60f0b6acc722b">unusedRangeSizeMax</a> = VMA_MAX(inoutStats.<a class="code" href="struct_vma_pool_stats.html#ab4c8f52dd42ab01998f60f0b6acc722b">unusedRangeSizeMax</a>, unusedRangeSize);</div>
-<div class="line"><a name="l10371"></a><span class="lineno">10371</span>&#160;                }</div>
+<div class="line"><a name="l10233"></a><span class="lineno">10233</span>&#160;    <span class="comment">// You may want to enable this validation at the beginning or at the end of</span></div>
+<div class="line"><a name="l10234"></a><span class="lineno">10234</span>&#160;    <span class="comment">// this function, depending on what do you want to check.</span></div>
+<div class="line"><a name="l10235"></a><span class="lineno">10235</span>&#160;    VMA_HEAVY_ASSERT(ValidateFreeSuballocationList());</div>
+<div class="line"><a name="l10236"></a><span class="lineno">10236</span>&#160; </div>
+<div class="line"><a name="l10237"></a><span class="lineno">10237</span>&#160;    <span class="keywordflow">if</span>(item-&gt;size &gt;= VMA_MIN_FREE_SUBALLOCATION_SIZE_TO_REGISTER)</div>
+<div class="line"><a name="l10238"></a><span class="lineno">10238</span>&#160;    {</div>
+<div class="line"><a name="l10239"></a><span class="lineno">10239</span>&#160;        VmaSuballocationList::iterator* <span class="keyword">const</span> it = VmaBinaryFindFirstNotLess(</div>
+<div class="line"><a name="l10240"></a><span class="lineno">10240</span>&#160;            m_FreeSuballocationsBySize.data(),</div>
+<div class="line"><a name="l10241"></a><span class="lineno">10241</span>&#160;            m_FreeSuballocationsBySize.data() + m_FreeSuballocationsBySize.size(),</div>
+<div class="line"><a name="l10242"></a><span class="lineno">10242</span>&#160;            item,</div>
+<div class="line"><a name="l10243"></a><span class="lineno">10243</span>&#160;            VmaSuballocationItemSizeLess());</div>
+<div class="line"><a name="l10244"></a><span class="lineno">10244</span>&#160;        <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> index = it - m_FreeSuballocationsBySize.data();</div>
+<div class="line"><a name="l10245"></a><span class="lineno">10245</span>&#160;            index &lt; m_FreeSuballocationsBySize.size();</div>
+<div class="line"><a name="l10246"></a><span class="lineno">10246</span>&#160;            ++index)</div>
+<div class="line"><a name="l10247"></a><span class="lineno">10247</span>&#160;        {</div>
+<div class="line"><a name="l10248"></a><span class="lineno">10248</span>&#160;            <span class="keywordflow">if</span>(m_FreeSuballocationsBySize[index] == item)</div>
+<div class="line"><a name="l10249"></a><span class="lineno">10249</span>&#160;            {</div>
+<div class="line"><a name="l10250"></a><span class="lineno">10250</span>&#160;                VmaVectorRemove(m_FreeSuballocationsBySize, index);</div>
+<div class="line"><a name="l10251"></a><span class="lineno">10251</span>&#160;                <span class="keywordflow">return</span>;</div>
+<div class="line"><a name="l10252"></a><span class="lineno">10252</span>&#160;            }</div>
+<div class="line"><a name="l10253"></a><span class="lineno">10253</span>&#160;            VMA_ASSERT((m_FreeSuballocationsBySize[index]-&gt;size == item-&gt;size) &amp;&amp; <span class="stringliteral">&quot;Not found.&quot;</span>);</div>
+<div class="line"><a name="l10254"></a><span class="lineno">10254</span>&#160;        }</div>
+<div class="line"><a name="l10255"></a><span class="lineno">10255</span>&#160;        VMA_ASSERT(0 &amp;&amp; <span class="stringliteral">&quot;Not found.&quot;</span>);</div>
+<div class="line"><a name="l10256"></a><span class="lineno">10256</span>&#160;    }</div>
+<div class="line"><a name="l10257"></a><span class="lineno">10257</span>&#160; </div>
+<div class="line"><a name="l10258"></a><span class="lineno">10258</span>&#160;    <span class="comment">//VMA_HEAVY_ASSERT(ValidateFreeSuballocationList());</span></div>
+<div class="line"><a name="l10259"></a><span class="lineno">10259</span>&#160;}</div>
+<div class="line"><a name="l10260"></a><span class="lineno">10260</span>&#160; </div>
+<div class="line"><a name="l10261"></a><span class="lineno">10261</span>&#160;<span class="keywordtype">bool</span> VmaBlockMetadata_Generic::IsBufferImageGranularityConflictPossible(</div>
+<div class="line"><a name="l10262"></a><span class="lineno">10262</span>&#160;    VkDeviceSize bufferImageGranularity,</div>
+<div class="line"><a name="l10263"></a><span class="lineno">10263</span>&#160;    VmaSuballocationType&amp; inOutPrevSuballocType)<span class="keyword"> const</span></div>
+<div class="line"><a name="l10264"></a><span class="lineno">10264</span>&#160;<span class="keyword"></span>{</div>
+<div class="line"><a name="l10265"></a><span class="lineno">10265</span>&#160;    <span class="keywordflow">if</span>(bufferImageGranularity == 1 || IsEmpty())</div>
+<div class="line"><a name="l10266"></a><span class="lineno">10266</span>&#160;    {</div>
+<div class="line"><a name="l10267"></a><span class="lineno">10267</span>&#160;        <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
+<div class="line"><a name="l10268"></a><span class="lineno">10268</span>&#160;    }</div>
+<div class="line"><a name="l10269"></a><span class="lineno">10269</span>&#160; </div>
+<div class="line"><a name="l10270"></a><span class="lineno">10270</span>&#160;    VkDeviceSize minAlignment = VK_WHOLE_SIZE;</div>
+<div class="line"><a name="l10271"></a><span class="lineno">10271</span>&#160;    <span class="keywordtype">bool</span> typeConflictFound = <span class="keyword">false</span>;</div>
+<div class="line"><a name="l10272"></a><span class="lineno">10272</span>&#160;    <span class="keywordflow">for</span>(VmaSuballocationList::const_iterator it = m_Suballocations.cbegin();</div>
+<div class="line"><a name="l10273"></a><span class="lineno">10273</span>&#160;        it != m_Suballocations.cend();</div>
+<div class="line"><a name="l10274"></a><span class="lineno">10274</span>&#160;        ++it)</div>
+<div class="line"><a name="l10275"></a><span class="lineno">10275</span>&#160;    {</div>
+<div class="line"><a name="l10276"></a><span class="lineno">10276</span>&#160;        <span class="keyword">const</span> VmaSuballocationType suballocType = it-&gt;type;</div>
+<div class="line"><a name="l10277"></a><span class="lineno">10277</span>&#160;        <span class="keywordflow">if</span>(suballocType != VMA_SUBALLOCATION_TYPE_FREE)</div>
+<div class="line"><a name="l10278"></a><span class="lineno">10278</span>&#160;        {</div>
+<div class="line"><a name="l10279"></a><span class="lineno">10279</span>&#160;            minAlignment = VMA_MIN(minAlignment, it-&gt;hAllocation-&gt;GetAlignment());</div>
+<div class="line"><a name="l10280"></a><span class="lineno">10280</span>&#160;            <span class="keywordflow">if</span>(VmaIsBufferImageGranularityConflict(inOutPrevSuballocType, suballocType))</div>
+<div class="line"><a name="l10281"></a><span class="lineno">10281</span>&#160;            {</div>
+<div class="line"><a name="l10282"></a><span class="lineno">10282</span>&#160;                typeConflictFound = <span class="keyword">true</span>;</div>
+<div class="line"><a name="l10283"></a><span class="lineno">10283</span>&#160;            }</div>
+<div class="line"><a name="l10284"></a><span class="lineno">10284</span>&#160;            inOutPrevSuballocType = suballocType;</div>
+<div class="line"><a name="l10285"></a><span class="lineno">10285</span>&#160;        }</div>
+<div class="line"><a name="l10286"></a><span class="lineno">10286</span>&#160;    }</div>
+<div class="line"><a name="l10287"></a><span class="lineno">10287</span>&#160; </div>
+<div class="line"><a name="l10288"></a><span class="lineno">10288</span>&#160;    <span class="keywordflow">return</span> typeConflictFound || minAlignment &gt;= bufferImageGranularity;</div>
+<div class="line"><a name="l10289"></a><span class="lineno">10289</span>&#160;}</div>
+<div class="line"><a name="l10290"></a><span class="lineno">10290</span>&#160; </div>
+<div class="line"><a name="l10292"></a><span class="lineno">10292</span>&#160;<span class="comment">// class VmaBlockMetadata_Linear</span></div>
+<div class="line"><a name="l10293"></a><span class="lineno">10293</span>&#160; </div>
+<div class="line"><a name="l10294"></a><span class="lineno">10294</span>&#160;VmaBlockMetadata_Linear::VmaBlockMetadata_Linear(<a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator) :</div>
+<div class="line"><a name="l10295"></a><span class="lineno">10295</span>&#160;    VmaBlockMetadata(hAllocator),</div>
+<div class="line"><a name="l10296"></a><span class="lineno">10296</span>&#160;    m_SumFreeSize(0),</div>
+<div class="line"><a name="l10297"></a><span class="lineno">10297</span>&#160;    m_Suballocations0(VmaStlAllocator&lt;VmaSuballocation&gt;(hAllocator-&gt;GetAllocationCallbacks())),</div>
+<div class="line"><a name="l10298"></a><span class="lineno">10298</span>&#160;    m_Suballocations1(VmaStlAllocator&lt;VmaSuballocation&gt;(hAllocator-&gt;GetAllocationCallbacks())),</div>
+<div class="line"><a name="l10299"></a><span class="lineno">10299</span>&#160;    m_1stVectorIndex(0),</div>
+<div class="line"><a name="l10300"></a><span class="lineno">10300</span>&#160;    m_2ndVectorMode(SECOND_VECTOR_EMPTY),</div>
+<div class="line"><a name="l10301"></a><span class="lineno">10301</span>&#160;    m_1stNullItemsBeginCount(0),</div>
+<div class="line"><a name="l10302"></a><span class="lineno">10302</span>&#160;    m_1stNullItemsMiddleCount(0),</div>
+<div class="line"><a name="l10303"></a><span class="lineno">10303</span>&#160;    m_2ndNullItemsCount(0)</div>
+<div class="line"><a name="l10304"></a><span class="lineno">10304</span>&#160;{</div>
+<div class="line"><a name="l10305"></a><span class="lineno">10305</span>&#160;}</div>
+<div class="line"><a name="l10306"></a><span class="lineno">10306</span>&#160; </div>
+<div class="line"><a name="l10307"></a><span class="lineno">10307</span>&#160;VmaBlockMetadata_Linear::~VmaBlockMetadata_Linear()</div>
+<div class="line"><a name="l10308"></a><span class="lineno">10308</span>&#160;{</div>
+<div class="line"><a name="l10309"></a><span class="lineno">10309</span>&#160;}</div>
+<div class="line"><a name="l10310"></a><span class="lineno">10310</span>&#160; </div>
+<div class="line"><a name="l10311"></a><span class="lineno">10311</span>&#160;<span class="keywordtype">void</span> VmaBlockMetadata_Linear::Init(VkDeviceSize size)</div>
+<div class="line"><a name="l10312"></a><span class="lineno">10312</span>&#160;{</div>
+<div class="line"><a name="l10313"></a><span class="lineno">10313</span>&#160;    VmaBlockMetadata::Init(size);</div>
+<div class="line"><a name="l10314"></a><span class="lineno">10314</span>&#160;    m_SumFreeSize = size;</div>
+<div class="line"><a name="l10315"></a><span class="lineno">10315</span>&#160;}</div>
+<div class="line"><a name="l10316"></a><span class="lineno">10316</span>&#160; </div>
+<div class="line"><a name="l10317"></a><span class="lineno">10317</span>&#160;<span class="keywordtype">bool</span> VmaBlockMetadata_Linear::Validate()<span class="keyword"> const</span></div>
+<div class="line"><a name="l10318"></a><span class="lineno">10318</span>&#160;<span class="keyword"></span>{</div>
+<div class="line"><a name="l10319"></a><span class="lineno">10319</span>&#160;    <span class="keyword">const</span> SuballocationVectorType&amp; suballocations1st = AccessSuballocations1st();</div>
+<div class="line"><a name="l10320"></a><span class="lineno">10320</span>&#160;    <span class="keyword">const</span> SuballocationVectorType&amp; suballocations2nd = AccessSuballocations2nd();</div>
+<div class="line"><a name="l10321"></a><span class="lineno">10321</span>&#160; </div>
+<div class="line"><a name="l10322"></a><span class="lineno">10322</span>&#160;    VMA_VALIDATE(suballocations2nd.empty() == (m_2ndVectorMode == SECOND_VECTOR_EMPTY));</div>
+<div class="line"><a name="l10323"></a><span class="lineno">10323</span>&#160;    VMA_VALIDATE(!suballocations1st.empty() ||</div>
+<div class="line"><a name="l10324"></a><span class="lineno">10324</span>&#160;        suballocations2nd.empty() ||</div>
+<div class="line"><a name="l10325"></a><span class="lineno">10325</span>&#160;        m_2ndVectorMode != SECOND_VECTOR_RING_BUFFER);</div>
+<div class="line"><a name="l10326"></a><span class="lineno">10326</span>&#160; </div>
+<div class="line"><a name="l10327"></a><span class="lineno">10327</span>&#160;    <span class="keywordflow">if</span>(!suballocations1st.empty())</div>
+<div class="line"><a name="l10328"></a><span class="lineno">10328</span>&#160;    {</div>
+<div class="line"><a name="l10329"></a><span class="lineno">10329</span>&#160;        <span class="comment">// Null item at the beginning should be accounted into m_1stNullItemsBeginCount.</span></div>
+<div class="line"><a name="l10330"></a><span class="lineno">10330</span>&#160;        VMA_VALIDATE(suballocations1st[m_1stNullItemsBeginCount].hAllocation != VK_NULL_HANDLE);</div>
+<div class="line"><a name="l10331"></a><span class="lineno">10331</span>&#160;        <span class="comment">// Null item at the end should be just pop_back().</span></div>
+<div class="line"><a name="l10332"></a><span class="lineno">10332</span>&#160;        VMA_VALIDATE(suballocations1st.back().hAllocation != VK_NULL_HANDLE);</div>
+<div class="line"><a name="l10333"></a><span class="lineno">10333</span>&#160;    }</div>
+<div class="line"><a name="l10334"></a><span class="lineno">10334</span>&#160;    <span class="keywordflow">if</span>(!suballocations2nd.empty())</div>
+<div class="line"><a name="l10335"></a><span class="lineno">10335</span>&#160;    {</div>
+<div class="line"><a name="l10336"></a><span class="lineno">10336</span>&#160;        <span class="comment">// Null item at the end should be just pop_back().</span></div>
+<div class="line"><a name="l10337"></a><span class="lineno">10337</span>&#160;        VMA_VALIDATE(suballocations2nd.back().hAllocation != VK_NULL_HANDLE);</div>
+<div class="line"><a name="l10338"></a><span class="lineno">10338</span>&#160;    }</div>
+<div class="line"><a name="l10339"></a><span class="lineno">10339</span>&#160; </div>
+<div class="line"><a name="l10340"></a><span class="lineno">10340</span>&#160;    VMA_VALIDATE(m_1stNullItemsBeginCount + m_1stNullItemsMiddleCount &lt;= suballocations1st.size());</div>
+<div class="line"><a name="l10341"></a><span class="lineno">10341</span>&#160;    VMA_VALIDATE(m_2ndNullItemsCount &lt;= suballocations2nd.size());</div>
+<div class="line"><a name="l10342"></a><span class="lineno">10342</span>&#160; </div>
+<div class="line"><a name="l10343"></a><span class="lineno">10343</span>&#160;    VkDeviceSize sumUsedSize = 0;</div>
+<div class="line"><a name="l10344"></a><span class="lineno">10344</span>&#160;    <span class="keyword">const</span> <span class="keywordtype">size_t</span> suballoc1stCount = suballocations1st.size();</div>
+<div class="line"><a name="l10345"></a><span class="lineno">10345</span>&#160;    VkDeviceSize offset = VMA_DEBUG_MARGIN;</div>
+<div class="line"><a name="l10346"></a><span class="lineno">10346</span>&#160; </div>
+<div class="line"><a name="l10347"></a><span class="lineno">10347</span>&#160;    <span class="keywordflow">if</span>(m_2ndVectorMode == SECOND_VECTOR_RING_BUFFER)</div>
+<div class="line"><a name="l10348"></a><span class="lineno">10348</span>&#160;    {</div>
+<div class="line"><a name="l10349"></a><span class="lineno">10349</span>&#160;        <span class="keyword">const</span> <span class="keywordtype">size_t</span> suballoc2ndCount = suballocations2nd.size();</div>
+<div class="line"><a name="l10350"></a><span class="lineno">10350</span>&#160;        <span class="keywordtype">size_t</span> nullItem2ndCount = 0;</div>
+<div class="line"><a name="l10351"></a><span class="lineno">10351</span>&#160;        <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> i = 0; i &lt; suballoc2ndCount; ++i)</div>
+<div class="line"><a name="l10352"></a><span class="lineno">10352</span>&#160;        {</div>
+<div class="line"><a name="l10353"></a><span class="lineno">10353</span>&#160;            <span class="keyword">const</span> VmaSuballocation&amp; suballoc = suballocations2nd[i];</div>
+<div class="line"><a name="l10354"></a><span class="lineno">10354</span>&#160;            <span class="keyword">const</span> <span class="keywordtype">bool</span> currFree = (suballoc.type == VMA_SUBALLOCATION_TYPE_FREE);</div>
+<div class="line"><a name="l10355"></a><span class="lineno">10355</span>&#160; </div>
+<div class="line"><a name="l10356"></a><span class="lineno">10356</span>&#160;            VMA_VALIDATE(currFree == (suballoc.hAllocation == VK_NULL_HANDLE));</div>
+<div class="line"><a name="l10357"></a><span class="lineno">10357</span>&#160;            VMA_VALIDATE(suballoc.offset &gt;= offset);</div>
+<div class="line"><a name="l10358"></a><span class="lineno">10358</span>&#160; </div>
+<div class="line"><a name="l10359"></a><span class="lineno">10359</span>&#160;            <span class="keywordflow">if</span>(!currFree)</div>
+<div class="line"><a name="l10360"></a><span class="lineno">10360</span>&#160;            {</div>
+<div class="line"><a name="l10361"></a><span class="lineno">10361</span>&#160;                VMA_VALIDATE(suballoc.hAllocation-&gt;GetOffset() == suballoc.offset);</div>
+<div class="line"><a name="l10362"></a><span class="lineno">10362</span>&#160;                VMA_VALIDATE(suballoc.hAllocation-&gt;GetSize() == suballoc.size);</div>
+<div class="line"><a name="l10363"></a><span class="lineno">10363</span>&#160;                sumUsedSize += suballoc.size;</div>
+<div class="line"><a name="l10364"></a><span class="lineno">10364</span>&#160;            }</div>
+<div class="line"><a name="l10365"></a><span class="lineno">10365</span>&#160;            <span class="keywordflow">else</span></div>
+<div class="line"><a name="l10366"></a><span class="lineno">10366</span>&#160;            {</div>
+<div class="line"><a name="l10367"></a><span class="lineno">10367</span>&#160;                ++nullItem2ndCount;</div>
+<div class="line"><a name="l10368"></a><span class="lineno">10368</span>&#160;            }</div>
+<div class="line"><a name="l10369"></a><span class="lineno">10369</span>&#160; </div>
+<div class="line"><a name="l10370"></a><span class="lineno">10370</span>&#160;            offset = suballoc.offset + suballoc.size + VMA_DEBUG_MARGIN;</div>
+<div class="line"><a name="l10371"></a><span class="lineno">10371</span>&#160;        }</div>
 <div class="line"><a name="l10372"></a><span class="lineno">10372</span>&#160; </div>
-<div class="line"><a name="l10373"></a><span class="lineno">10373</span>&#160;                <span class="comment">// End of loop.</span></div>
-<div class="line"><a name="l10374"></a><span class="lineno">10374</span>&#160;                lastOffset = size;</div>
-<div class="line"><a name="l10375"></a><span class="lineno">10375</span>&#160;            }</div>
-<div class="line"><a name="l10376"></a><span class="lineno">10376</span>&#160;        }</div>
-<div class="line"><a name="l10377"></a><span class="lineno">10377</span>&#160;    }</div>
-<div class="line"><a name="l10378"></a><span class="lineno">10378</span>&#160;}</div>
-<div class="line"><a name="l10379"></a><span class="lineno">10379</span>&#160; </div>
-<div class="line"><a name="l10380"></a><span class="lineno">10380</span>&#160;<span class="preprocessor">#if VMA_STATS_STRING_ENABLED</span></div>
-<div class="line"><a name="l10381"></a><span class="lineno">10381</span>&#160;<span class="keywordtype">void</span> VmaBlockMetadata_Linear::PrintDetailedMap(<span class="keyword">class</span> VmaJsonWriter&amp; json)<span class="keyword"> const</span></div>
-<div class="line"><a name="l10382"></a><span class="lineno">10382</span>&#160;<span class="keyword"></span>{</div>
-<div class="line"><a name="l10383"></a><span class="lineno">10383</span>&#160;    <span class="keyword">const</span> VkDeviceSize size = GetSize();</div>
-<div class="line"><a name="l10384"></a><span class="lineno">10384</span>&#160;    <span class="keyword">const</span> SuballocationVectorType&amp; suballocations1st = AccessSuballocations1st();</div>
-<div class="line"><a name="l10385"></a><span class="lineno">10385</span>&#160;    <span class="keyword">const</span> SuballocationVectorType&amp; suballocations2nd = AccessSuballocations2nd();</div>
-<div class="line"><a name="l10386"></a><span class="lineno">10386</span>&#160;    <span class="keyword">const</span> <span class="keywordtype">size_t</span> suballoc1stCount = suballocations1st.size();</div>
-<div class="line"><a name="l10387"></a><span class="lineno">10387</span>&#160;    <span class="keyword">const</span> <span class="keywordtype">size_t</span> suballoc2ndCount = suballocations2nd.size();</div>
-<div class="line"><a name="l10388"></a><span class="lineno">10388</span>&#160; </div>
-<div class="line"><a name="l10389"></a><span class="lineno">10389</span>&#160;    <span class="comment">// FIRST PASS</span></div>
-<div class="line"><a name="l10390"></a><span class="lineno">10390</span>&#160; </div>
-<div class="line"><a name="l10391"></a><span class="lineno">10391</span>&#160;    <span class="keywordtype">size_t</span> unusedRangeCount = 0;</div>
-<div class="line"><a name="l10392"></a><span class="lineno">10392</span>&#160;    VkDeviceSize usedBytes = 0;</div>
+<div class="line"><a name="l10373"></a><span class="lineno">10373</span>&#160;        VMA_VALIDATE(nullItem2ndCount == m_2ndNullItemsCount);</div>
+<div class="line"><a name="l10374"></a><span class="lineno">10374</span>&#160;    }</div>
+<div class="line"><a name="l10375"></a><span class="lineno">10375</span>&#160; </div>
+<div class="line"><a name="l10376"></a><span class="lineno">10376</span>&#160;    <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> i = 0; i &lt; m_1stNullItemsBeginCount; ++i)</div>
+<div class="line"><a name="l10377"></a><span class="lineno">10377</span>&#160;    {</div>
+<div class="line"><a name="l10378"></a><span class="lineno">10378</span>&#160;        <span class="keyword">const</span> VmaSuballocation&amp; suballoc = suballocations1st[i];</div>
+<div class="line"><a name="l10379"></a><span class="lineno">10379</span>&#160;        VMA_VALIDATE(suballoc.type == VMA_SUBALLOCATION_TYPE_FREE &amp;&amp;</div>
+<div class="line"><a name="l10380"></a><span class="lineno">10380</span>&#160;            suballoc.hAllocation == VK_NULL_HANDLE);</div>
+<div class="line"><a name="l10381"></a><span class="lineno">10381</span>&#160;    }</div>
+<div class="line"><a name="l10382"></a><span class="lineno">10382</span>&#160; </div>
+<div class="line"><a name="l10383"></a><span class="lineno">10383</span>&#160;    <span class="keywordtype">size_t</span> nullItem1stCount = m_1stNullItemsBeginCount;</div>
+<div class="line"><a name="l10384"></a><span class="lineno">10384</span>&#160; </div>
+<div class="line"><a name="l10385"></a><span class="lineno">10385</span>&#160;    <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> i = m_1stNullItemsBeginCount; i &lt; suballoc1stCount; ++i)</div>
+<div class="line"><a name="l10386"></a><span class="lineno">10386</span>&#160;    {</div>
+<div class="line"><a name="l10387"></a><span class="lineno">10387</span>&#160;        <span class="keyword">const</span> VmaSuballocation&amp; suballoc = suballocations1st[i];</div>
+<div class="line"><a name="l10388"></a><span class="lineno">10388</span>&#160;        <span class="keyword">const</span> <span class="keywordtype">bool</span> currFree = (suballoc.type == VMA_SUBALLOCATION_TYPE_FREE);</div>
+<div class="line"><a name="l10389"></a><span class="lineno">10389</span>&#160; </div>
+<div class="line"><a name="l10390"></a><span class="lineno">10390</span>&#160;        VMA_VALIDATE(currFree == (suballoc.hAllocation == VK_NULL_HANDLE));</div>
+<div class="line"><a name="l10391"></a><span class="lineno">10391</span>&#160;        VMA_VALIDATE(suballoc.offset &gt;= offset);</div>
+<div class="line"><a name="l10392"></a><span class="lineno">10392</span>&#160;        VMA_VALIDATE(i &gt;= m_1stNullItemsBeginCount || currFree);</div>
 <div class="line"><a name="l10393"></a><span class="lineno">10393</span>&#160; </div>
-<div class="line"><a name="l10394"></a><span class="lineno">10394</span>&#160;    VkDeviceSize lastOffset = 0;</div>
-<div class="line"><a name="l10395"></a><span class="lineno">10395</span>&#160; </div>
-<div class="line"><a name="l10396"></a><span class="lineno">10396</span>&#160;    <span class="keywordtype">size_t</span> alloc2ndCount = 0;</div>
-<div class="line"><a name="l10397"></a><span class="lineno">10397</span>&#160;    <span class="keywordflow">if</span>(m_2ndVectorMode == SECOND_VECTOR_RING_BUFFER)</div>
-<div class="line"><a name="l10398"></a><span class="lineno">10398</span>&#160;    {</div>
-<div class="line"><a name="l10399"></a><span class="lineno">10399</span>&#160;        <span class="keyword">const</span> VkDeviceSize freeSpace2ndTo1stEnd = suballocations1st[m_1stNullItemsBeginCount].offset;</div>
-<div class="line"><a name="l10400"></a><span class="lineno">10400</span>&#160;        <span class="keywordtype">size_t</span> nextAlloc2ndIndex = 0;</div>
-<div class="line"><a name="l10401"></a><span class="lineno">10401</span>&#160;        <span class="keywordflow">while</span>(lastOffset &lt; freeSpace2ndTo1stEnd)</div>
-<div class="line"><a name="l10402"></a><span class="lineno">10402</span>&#160;        {</div>
-<div class="line"><a name="l10403"></a><span class="lineno">10403</span>&#160;            <span class="comment">// Find next non-null allocation or move nextAlloc2ndIndex to the end.</span></div>
-<div class="line"><a name="l10404"></a><span class="lineno">10404</span>&#160;            <span class="keywordflow">while</span>(nextAlloc2ndIndex &lt; suballoc2ndCount &amp;&amp;</div>
-<div class="line"><a name="l10405"></a><span class="lineno">10405</span>&#160;                suballocations2nd[nextAlloc2ndIndex].hAllocation == VK_NULL_HANDLE)</div>
-<div class="line"><a name="l10406"></a><span class="lineno">10406</span>&#160;            {</div>
-<div class="line"><a name="l10407"></a><span class="lineno">10407</span>&#160;                ++nextAlloc2ndIndex;</div>
-<div class="line"><a name="l10408"></a><span class="lineno">10408</span>&#160;            }</div>
-<div class="line"><a name="l10409"></a><span class="lineno">10409</span>&#160; </div>
-<div class="line"><a name="l10410"></a><span class="lineno">10410</span>&#160;            <span class="comment">// Found non-null allocation.</span></div>
-<div class="line"><a name="l10411"></a><span class="lineno">10411</span>&#160;            <span class="keywordflow">if</span>(nextAlloc2ndIndex &lt; suballoc2ndCount)</div>
-<div class="line"><a name="l10412"></a><span class="lineno">10412</span>&#160;            {</div>
-<div class="line"><a name="l10413"></a><span class="lineno">10413</span>&#160;                <span class="keyword">const</span> VmaSuballocation&amp; suballoc = suballocations2nd[nextAlloc2ndIndex];</div>
-<div class="line"><a name="l10414"></a><span class="lineno">10414</span>&#160;            </div>
-<div class="line"><a name="l10415"></a><span class="lineno">10415</span>&#160;                <span class="comment">// 1. Process free space before this allocation.</span></div>
-<div class="line"><a name="l10416"></a><span class="lineno">10416</span>&#160;                <span class="keywordflow">if</span>(lastOffset &lt; suballoc.offset)</div>
-<div class="line"><a name="l10417"></a><span class="lineno">10417</span>&#160;                {</div>
-<div class="line"><a name="l10418"></a><span class="lineno">10418</span>&#160;                    <span class="comment">// There is free space from lastOffset to suballoc.offset.</span></div>
-<div class="line"><a name="l10419"></a><span class="lineno">10419</span>&#160;                    ++unusedRangeCount;</div>
-<div class="line"><a name="l10420"></a><span class="lineno">10420</span>&#160;                }</div>
-<div class="line"><a name="l10421"></a><span class="lineno">10421</span>&#160;            </div>
-<div class="line"><a name="l10422"></a><span class="lineno">10422</span>&#160;                <span class="comment">// 2. Process this allocation.</span></div>
-<div class="line"><a name="l10423"></a><span class="lineno">10423</span>&#160;                <span class="comment">// There is allocation with suballoc.offset, suballoc.size.</span></div>
-<div class="line"><a name="l10424"></a><span class="lineno">10424</span>&#160;                ++alloc2ndCount;</div>
-<div class="line"><a name="l10425"></a><span class="lineno">10425</span>&#160;                usedBytes += suballoc.size;</div>
-<div class="line"><a name="l10426"></a><span class="lineno">10426</span>&#160;            </div>
-<div class="line"><a name="l10427"></a><span class="lineno">10427</span>&#160;                <span class="comment">// 3. Prepare for next iteration.</span></div>
-<div class="line"><a name="l10428"></a><span class="lineno">10428</span>&#160;                lastOffset = suballoc.offset + suballoc.size;</div>
-<div class="line"><a name="l10429"></a><span class="lineno">10429</span>&#160;                ++nextAlloc2ndIndex;</div>
+<div class="line"><a name="l10394"></a><span class="lineno">10394</span>&#160;        <span class="keywordflow">if</span>(!currFree)</div>
+<div class="line"><a name="l10395"></a><span class="lineno">10395</span>&#160;        {</div>
+<div class="line"><a name="l10396"></a><span class="lineno">10396</span>&#160;            VMA_VALIDATE(suballoc.hAllocation-&gt;GetOffset() == suballoc.offset);</div>
+<div class="line"><a name="l10397"></a><span class="lineno">10397</span>&#160;            VMA_VALIDATE(suballoc.hAllocation-&gt;GetSize() == suballoc.size);</div>
+<div class="line"><a name="l10398"></a><span class="lineno">10398</span>&#160;            sumUsedSize += suballoc.size;</div>
+<div class="line"><a name="l10399"></a><span class="lineno">10399</span>&#160;        }</div>
+<div class="line"><a name="l10400"></a><span class="lineno">10400</span>&#160;        <span class="keywordflow">else</span></div>
+<div class="line"><a name="l10401"></a><span class="lineno">10401</span>&#160;        {</div>
+<div class="line"><a name="l10402"></a><span class="lineno">10402</span>&#160;            ++nullItem1stCount;</div>
+<div class="line"><a name="l10403"></a><span class="lineno">10403</span>&#160;        }</div>
+<div class="line"><a name="l10404"></a><span class="lineno">10404</span>&#160; </div>
+<div class="line"><a name="l10405"></a><span class="lineno">10405</span>&#160;        offset = suballoc.offset + suballoc.size + VMA_DEBUG_MARGIN;</div>
+<div class="line"><a name="l10406"></a><span class="lineno">10406</span>&#160;    }</div>
+<div class="line"><a name="l10407"></a><span class="lineno">10407</span>&#160;    VMA_VALIDATE(nullItem1stCount == m_1stNullItemsBeginCount + m_1stNullItemsMiddleCount);</div>
+<div class="line"><a name="l10408"></a><span class="lineno">10408</span>&#160; </div>
+<div class="line"><a name="l10409"></a><span class="lineno">10409</span>&#160;    <span class="keywordflow">if</span>(m_2ndVectorMode == SECOND_VECTOR_DOUBLE_STACK)</div>
+<div class="line"><a name="l10410"></a><span class="lineno">10410</span>&#160;    {</div>
+<div class="line"><a name="l10411"></a><span class="lineno">10411</span>&#160;        <span class="keyword">const</span> <span class="keywordtype">size_t</span> suballoc2ndCount = suballocations2nd.size();</div>
+<div class="line"><a name="l10412"></a><span class="lineno">10412</span>&#160;        <span class="keywordtype">size_t</span> nullItem2ndCount = 0;</div>
+<div class="line"><a name="l10413"></a><span class="lineno">10413</span>&#160;        <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> i = suballoc2ndCount; i--; )</div>
+<div class="line"><a name="l10414"></a><span class="lineno">10414</span>&#160;        {</div>
+<div class="line"><a name="l10415"></a><span class="lineno">10415</span>&#160;            <span class="keyword">const</span> VmaSuballocation&amp; suballoc = suballocations2nd[i];</div>
+<div class="line"><a name="l10416"></a><span class="lineno">10416</span>&#160;            <span class="keyword">const</span> <span class="keywordtype">bool</span> currFree = (suballoc.type == VMA_SUBALLOCATION_TYPE_FREE);</div>
+<div class="line"><a name="l10417"></a><span class="lineno">10417</span>&#160; </div>
+<div class="line"><a name="l10418"></a><span class="lineno">10418</span>&#160;            VMA_VALIDATE(currFree == (suballoc.hAllocation == VK_NULL_HANDLE));</div>
+<div class="line"><a name="l10419"></a><span class="lineno">10419</span>&#160;            VMA_VALIDATE(suballoc.offset &gt;= offset);</div>
+<div class="line"><a name="l10420"></a><span class="lineno">10420</span>&#160; </div>
+<div class="line"><a name="l10421"></a><span class="lineno">10421</span>&#160;            <span class="keywordflow">if</span>(!currFree)</div>
+<div class="line"><a name="l10422"></a><span class="lineno">10422</span>&#160;            {</div>
+<div class="line"><a name="l10423"></a><span class="lineno">10423</span>&#160;                VMA_VALIDATE(suballoc.hAllocation-&gt;GetOffset() == suballoc.offset);</div>
+<div class="line"><a name="l10424"></a><span class="lineno">10424</span>&#160;                VMA_VALIDATE(suballoc.hAllocation-&gt;GetSize() == suballoc.size);</div>
+<div class="line"><a name="l10425"></a><span class="lineno">10425</span>&#160;                sumUsedSize += suballoc.size;</div>
+<div class="line"><a name="l10426"></a><span class="lineno">10426</span>&#160;            }</div>
+<div class="line"><a name="l10427"></a><span class="lineno">10427</span>&#160;            <span class="keywordflow">else</span></div>
+<div class="line"><a name="l10428"></a><span class="lineno">10428</span>&#160;            {</div>
+<div class="line"><a name="l10429"></a><span class="lineno">10429</span>&#160;                ++nullItem2ndCount;</div>
 <div class="line"><a name="l10430"></a><span class="lineno">10430</span>&#160;            }</div>
-<div class="line"><a name="l10431"></a><span class="lineno">10431</span>&#160;            <span class="comment">// We are at the end.</span></div>
-<div class="line"><a name="l10432"></a><span class="lineno">10432</span>&#160;            <span class="keywordflow">else</span></div>
-<div class="line"><a name="l10433"></a><span class="lineno">10433</span>&#160;            {</div>
-<div class="line"><a name="l10434"></a><span class="lineno">10434</span>&#160;                <span class="keywordflow">if</span>(lastOffset &lt; freeSpace2ndTo1stEnd)</div>
-<div class="line"><a name="l10435"></a><span class="lineno">10435</span>&#160;                {</div>
-<div class="line"><a name="l10436"></a><span class="lineno">10436</span>&#160;                    <span class="comment">// There is free space from lastOffset to freeSpace2ndTo1stEnd.</span></div>
-<div class="line"><a name="l10437"></a><span class="lineno">10437</span>&#160;                    ++unusedRangeCount;</div>
-<div class="line"><a name="l10438"></a><span class="lineno">10438</span>&#160;                }</div>
-<div class="line"><a name="l10439"></a><span class="lineno">10439</span>&#160; </div>
-<div class="line"><a name="l10440"></a><span class="lineno">10440</span>&#160;                <span class="comment">// End of loop.</span></div>
-<div class="line"><a name="l10441"></a><span class="lineno">10441</span>&#160;                lastOffset = freeSpace2ndTo1stEnd;</div>
-<div class="line"><a name="l10442"></a><span class="lineno">10442</span>&#160;            }</div>
-<div class="line"><a name="l10443"></a><span class="lineno">10443</span>&#160;        }</div>
-<div class="line"><a name="l10444"></a><span class="lineno">10444</span>&#160;    }</div>
-<div class="line"><a name="l10445"></a><span class="lineno">10445</span>&#160; </div>
-<div class="line"><a name="l10446"></a><span class="lineno">10446</span>&#160;    <span class="keywordtype">size_t</span> nextAlloc1stIndex = m_1stNullItemsBeginCount;</div>
-<div class="line"><a name="l10447"></a><span class="lineno">10447</span>&#160;    <span class="keywordtype">size_t</span> alloc1stCount = 0;</div>
-<div class="line"><a name="l10448"></a><span class="lineno">10448</span>&#160;    <span class="keyword">const</span> VkDeviceSize freeSpace1stTo2ndEnd =</div>
-<div class="line"><a name="l10449"></a><span class="lineno">10449</span>&#160;        m_2ndVectorMode == SECOND_VECTOR_DOUBLE_STACK ? suballocations2nd.back().offset : size;</div>
-<div class="line"><a name="l10450"></a><span class="lineno">10450</span>&#160;    <span class="keywordflow">while</span>(lastOffset &lt; freeSpace1stTo2ndEnd)</div>
-<div class="line"><a name="l10451"></a><span class="lineno">10451</span>&#160;    {</div>
-<div class="line"><a name="l10452"></a><span class="lineno">10452</span>&#160;        <span class="comment">// Find next non-null allocation or move nextAllocIndex to the end.</span></div>
-<div class="line"><a name="l10453"></a><span class="lineno">10453</span>&#160;        <span class="keywordflow">while</span>(nextAlloc1stIndex &lt; suballoc1stCount &amp;&amp;</div>
-<div class="line"><a name="l10454"></a><span class="lineno">10454</span>&#160;            suballocations1st[nextAlloc1stIndex].hAllocation == VK_NULL_HANDLE)</div>
-<div class="line"><a name="l10455"></a><span class="lineno">10455</span>&#160;        {</div>
-<div class="line"><a name="l10456"></a><span class="lineno">10456</span>&#160;            ++nextAlloc1stIndex;</div>
-<div class="line"><a name="l10457"></a><span class="lineno">10457</span>&#160;        }</div>
-<div class="line"><a name="l10458"></a><span class="lineno">10458</span>&#160; </div>
-<div class="line"><a name="l10459"></a><span class="lineno">10459</span>&#160;        <span class="comment">// Found non-null allocation.</span></div>
-<div class="line"><a name="l10460"></a><span class="lineno">10460</span>&#160;        <span class="keywordflow">if</span>(nextAlloc1stIndex &lt; suballoc1stCount)</div>
-<div class="line"><a name="l10461"></a><span class="lineno">10461</span>&#160;        {</div>
-<div class="line"><a name="l10462"></a><span class="lineno">10462</span>&#160;            <span class="keyword">const</span> VmaSuballocation&amp; suballoc = suballocations1st[nextAlloc1stIndex];</div>
-<div class="line"><a name="l10463"></a><span class="lineno">10463</span>&#160;            </div>
-<div class="line"><a name="l10464"></a><span class="lineno">10464</span>&#160;            <span class="comment">// 1. Process free space before this allocation.</span></div>
-<div class="line"><a name="l10465"></a><span class="lineno">10465</span>&#160;            <span class="keywordflow">if</span>(lastOffset &lt; suballoc.offset)</div>
-<div class="line"><a name="l10466"></a><span class="lineno">10466</span>&#160;            {</div>
-<div class="line"><a name="l10467"></a><span class="lineno">10467</span>&#160;                <span class="comment">// There is free space from lastOffset to suballoc.offset.</span></div>
-<div class="line"><a name="l10468"></a><span class="lineno">10468</span>&#160;                ++unusedRangeCount;</div>
-<div class="line"><a name="l10469"></a><span class="lineno">10469</span>&#160;            }</div>
-<div class="line"><a name="l10470"></a><span class="lineno">10470</span>&#160;            </div>
-<div class="line"><a name="l10471"></a><span class="lineno">10471</span>&#160;            <span class="comment">// 2. Process this allocation.</span></div>
-<div class="line"><a name="l10472"></a><span class="lineno">10472</span>&#160;            <span class="comment">// There is allocation with suballoc.offset, suballoc.size.</span></div>
-<div class="line"><a name="l10473"></a><span class="lineno">10473</span>&#160;            ++alloc1stCount;</div>
-<div class="line"><a name="l10474"></a><span class="lineno">10474</span>&#160;            usedBytes += suballoc.size;</div>
-<div class="line"><a name="l10475"></a><span class="lineno">10475</span>&#160;            </div>
-<div class="line"><a name="l10476"></a><span class="lineno">10476</span>&#160;            <span class="comment">// 3. Prepare for next iteration.</span></div>
-<div class="line"><a name="l10477"></a><span class="lineno">10477</span>&#160;            lastOffset = suballoc.offset + suballoc.size;</div>
-<div class="line"><a name="l10478"></a><span class="lineno">10478</span>&#160;            ++nextAlloc1stIndex;</div>
-<div class="line"><a name="l10479"></a><span class="lineno">10479</span>&#160;        }</div>
-<div class="line"><a name="l10480"></a><span class="lineno">10480</span>&#160;        <span class="comment">// We are at the end.</span></div>
-<div class="line"><a name="l10481"></a><span class="lineno">10481</span>&#160;        <span class="keywordflow">else</span></div>
-<div class="line"><a name="l10482"></a><span class="lineno">10482</span>&#160;        {</div>
-<div class="line"><a name="l10483"></a><span class="lineno">10483</span>&#160;            <span class="keywordflow">if</span>(lastOffset &lt; size)</div>
-<div class="line"><a name="l10484"></a><span class="lineno">10484</span>&#160;            {</div>
-<div class="line"><a name="l10485"></a><span class="lineno">10485</span>&#160;                <span class="comment">// There is free space from lastOffset to freeSpace1stTo2ndEnd.</span></div>
-<div class="line"><a name="l10486"></a><span class="lineno">10486</span>&#160;                ++unusedRangeCount;</div>
-<div class="line"><a name="l10487"></a><span class="lineno">10487</span>&#160;            }</div>
-<div class="line"><a name="l10488"></a><span class="lineno">10488</span>&#160; </div>
-<div class="line"><a name="l10489"></a><span class="lineno">10489</span>&#160;            <span class="comment">// End of loop.</span></div>
-<div class="line"><a name="l10490"></a><span class="lineno">10490</span>&#160;            lastOffset = freeSpace1stTo2ndEnd;</div>
-<div class="line"><a name="l10491"></a><span class="lineno">10491</span>&#160;        }</div>
-<div class="line"><a name="l10492"></a><span class="lineno">10492</span>&#160;    }</div>
-<div class="line"><a name="l10493"></a><span class="lineno">10493</span>&#160; </div>
-<div class="line"><a name="l10494"></a><span class="lineno">10494</span>&#160;    <span class="keywordflow">if</span>(m_2ndVectorMode == SECOND_VECTOR_DOUBLE_STACK)</div>
-<div class="line"><a name="l10495"></a><span class="lineno">10495</span>&#160;    {</div>
-<div class="line"><a name="l10496"></a><span class="lineno">10496</span>&#160;        <span class="keywordtype">size_t</span> nextAlloc2ndIndex = suballocations2nd.size() - 1;</div>
-<div class="line"><a name="l10497"></a><span class="lineno">10497</span>&#160;        <span class="keywordflow">while</span>(lastOffset &lt; size)</div>
-<div class="line"><a name="l10498"></a><span class="lineno">10498</span>&#160;        {</div>
-<div class="line"><a name="l10499"></a><span class="lineno">10499</span>&#160;            <span class="comment">// Find next non-null allocation or move nextAlloc2ndIndex to the end.</span></div>
-<div class="line"><a name="l10500"></a><span class="lineno">10500</span>&#160;            <span class="keywordflow">while</span>(nextAlloc2ndIndex != SIZE_MAX &amp;&amp;</div>
-<div class="line"><a name="l10501"></a><span class="lineno">10501</span>&#160;                suballocations2nd[nextAlloc2ndIndex].hAllocation == VK_NULL_HANDLE)</div>
-<div class="line"><a name="l10502"></a><span class="lineno">10502</span>&#160;            {</div>
-<div class="line"><a name="l10503"></a><span class="lineno">10503</span>&#160;                --nextAlloc2ndIndex;</div>
-<div class="line"><a name="l10504"></a><span class="lineno">10504</span>&#160;            }</div>
-<div class="line"><a name="l10505"></a><span class="lineno">10505</span>&#160; </div>
-<div class="line"><a name="l10506"></a><span class="lineno">10506</span>&#160;            <span class="comment">// Found non-null allocation.</span></div>
-<div class="line"><a name="l10507"></a><span class="lineno">10507</span>&#160;            <span class="keywordflow">if</span>(nextAlloc2ndIndex != SIZE_MAX)</div>
-<div class="line"><a name="l10508"></a><span class="lineno">10508</span>&#160;            {</div>
-<div class="line"><a name="l10509"></a><span class="lineno">10509</span>&#160;                <span class="keyword">const</span> VmaSuballocation&amp; suballoc = suballocations2nd[nextAlloc2ndIndex];</div>
-<div class="line"><a name="l10510"></a><span class="lineno">10510</span>&#160;            </div>
-<div class="line"><a name="l10511"></a><span class="lineno">10511</span>&#160;                <span class="comment">// 1. Process free space before this allocation.</span></div>
-<div class="line"><a name="l10512"></a><span class="lineno">10512</span>&#160;                <span class="keywordflow">if</span>(lastOffset &lt; suballoc.offset)</div>
-<div class="line"><a name="l10513"></a><span class="lineno">10513</span>&#160;                {</div>
-<div class="line"><a name="l10514"></a><span class="lineno">10514</span>&#160;                    <span class="comment">// There is free space from lastOffset to suballoc.offset.</span></div>
-<div class="line"><a name="l10515"></a><span class="lineno">10515</span>&#160;                    ++unusedRangeCount;</div>
-<div class="line"><a name="l10516"></a><span class="lineno">10516</span>&#160;                }</div>
-<div class="line"><a name="l10517"></a><span class="lineno">10517</span>&#160;            </div>
-<div class="line"><a name="l10518"></a><span class="lineno">10518</span>&#160;                <span class="comment">// 2. Process this allocation.</span></div>
-<div class="line"><a name="l10519"></a><span class="lineno">10519</span>&#160;                <span class="comment">// There is allocation with suballoc.offset, suballoc.size.</span></div>
-<div class="line"><a name="l10520"></a><span class="lineno">10520</span>&#160;                ++alloc2ndCount;</div>
-<div class="line"><a name="l10521"></a><span class="lineno">10521</span>&#160;                usedBytes += suballoc.size;</div>
-<div class="line"><a name="l10522"></a><span class="lineno">10522</span>&#160;            </div>
-<div class="line"><a name="l10523"></a><span class="lineno">10523</span>&#160;                <span class="comment">// 3. Prepare for next iteration.</span></div>
-<div class="line"><a name="l10524"></a><span class="lineno">10524</span>&#160;                lastOffset = suballoc.offset + suballoc.size;</div>
-<div class="line"><a name="l10525"></a><span class="lineno">10525</span>&#160;                --nextAlloc2ndIndex;</div>
-<div class="line"><a name="l10526"></a><span class="lineno">10526</span>&#160;            }</div>
-<div class="line"><a name="l10527"></a><span class="lineno">10527</span>&#160;            <span class="comment">// We are at the end.</span></div>
-<div class="line"><a name="l10528"></a><span class="lineno">10528</span>&#160;            <span class="keywordflow">else</span></div>
-<div class="line"><a name="l10529"></a><span class="lineno">10529</span>&#160;            {</div>
-<div class="line"><a name="l10530"></a><span class="lineno">10530</span>&#160;                <span class="keywordflow">if</span>(lastOffset &lt; size)</div>
-<div class="line"><a name="l10531"></a><span class="lineno">10531</span>&#160;                {</div>
-<div class="line"><a name="l10532"></a><span class="lineno">10532</span>&#160;                    <span class="comment">// There is free space from lastOffset to size.</span></div>
-<div class="line"><a name="l10533"></a><span class="lineno">10533</span>&#160;                    ++unusedRangeCount;</div>
-<div class="line"><a name="l10534"></a><span class="lineno">10534</span>&#160;                }</div>
-<div class="line"><a name="l10535"></a><span class="lineno">10535</span>&#160; </div>
-<div class="line"><a name="l10536"></a><span class="lineno">10536</span>&#160;                <span class="comment">// End of loop.</span></div>
-<div class="line"><a name="l10537"></a><span class="lineno">10537</span>&#160;                lastOffset = size;</div>
-<div class="line"><a name="l10538"></a><span class="lineno">10538</span>&#160;            }</div>
-<div class="line"><a name="l10539"></a><span class="lineno">10539</span>&#160;        }</div>
-<div class="line"><a name="l10540"></a><span class="lineno">10540</span>&#160;    }</div>
-<div class="line"><a name="l10541"></a><span class="lineno">10541</span>&#160; </div>
-<div class="line"><a name="l10542"></a><span class="lineno">10542</span>&#160;    <span class="keyword">const</span> VkDeviceSize unusedBytes = size - usedBytes;</div>
-<div class="line"><a name="l10543"></a><span class="lineno">10543</span>&#160;    PrintDetailedMap_Begin(json, unusedBytes, alloc1stCount + alloc2ndCount, unusedRangeCount);</div>
-<div class="line"><a name="l10544"></a><span class="lineno">10544</span>&#160; </div>
-<div class="line"><a name="l10545"></a><span class="lineno">10545</span>&#160;    <span class="comment">// SECOND PASS</span></div>
-<div class="line"><a name="l10546"></a><span class="lineno">10546</span>&#160;    lastOffset = 0;</div>
-<div class="line"><a name="l10547"></a><span class="lineno">10547</span>&#160; </div>
-<div class="line"><a name="l10548"></a><span class="lineno">10548</span>&#160;    <span class="keywordflow">if</span>(m_2ndVectorMode == SECOND_VECTOR_RING_BUFFER)</div>
-<div class="line"><a name="l10549"></a><span class="lineno">10549</span>&#160;    {</div>
-<div class="line"><a name="l10550"></a><span class="lineno">10550</span>&#160;        <span class="keyword">const</span> VkDeviceSize freeSpace2ndTo1stEnd = suballocations1st[m_1stNullItemsBeginCount].offset;</div>
-<div class="line"><a name="l10551"></a><span class="lineno">10551</span>&#160;        <span class="keywordtype">size_t</span> nextAlloc2ndIndex = 0;</div>
-<div class="line"><a name="l10552"></a><span class="lineno">10552</span>&#160;        <span class="keywordflow">while</span>(lastOffset &lt; freeSpace2ndTo1stEnd)</div>
-<div class="line"><a name="l10553"></a><span class="lineno">10553</span>&#160;        {</div>
-<div class="line"><a name="l10554"></a><span class="lineno">10554</span>&#160;            <span class="comment">// Find next non-null allocation or move nextAlloc2ndIndex to the end.</span></div>
-<div class="line"><a name="l10555"></a><span class="lineno">10555</span>&#160;            <span class="keywordflow">while</span>(nextAlloc2ndIndex &lt; suballoc2ndCount &amp;&amp;</div>
-<div class="line"><a name="l10556"></a><span class="lineno">10556</span>&#160;                suballocations2nd[nextAlloc2ndIndex].hAllocation == VK_NULL_HANDLE)</div>
-<div class="line"><a name="l10557"></a><span class="lineno">10557</span>&#160;            {</div>
-<div class="line"><a name="l10558"></a><span class="lineno">10558</span>&#160;                ++nextAlloc2ndIndex;</div>
-<div class="line"><a name="l10559"></a><span class="lineno">10559</span>&#160;            }</div>
-<div class="line"><a name="l10560"></a><span class="lineno">10560</span>&#160; </div>
-<div class="line"><a name="l10561"></a><span class="lineno">10561</span>&#160;            <span class="comment">// Found non-null allocation.</span></div>
-<div class="line"><a name="l10562"></a><span class="lineno">10562</span>&#160;            <span class="keywordflow">if</span>(nextAlloc2ndIndex &lt; suballoc2ndCount)</div>
-<div class="line"><a name="l10563"></a><span class="lineno">10563</span>&#160;            {</div>
-<div class="line"><a name="l10564"></a><span class="lineno">10564</span>&#160;                <span class="keyword">const</span> VmaSuballocation&amp; suballoc = suballocations2nd[nextAlloc2ndIndex];</div>
-<div class="line"><a name="l10565"></a><span class="lineno">10565</span>&#160;            </div>
-<div class="line"><a name="l10566"></a><span class="lineno">10566</span>&#160;                <span class="comment">// 1. Process free space before this allocation.</span></div>
-<div class="line"><a name="l10567"></a><span class="lineno">10567</span>&#160;                <span class="keywordflow">if</span>(lastOffset &lt; suballoc.offset)</div>
-<div class="line"><a name="l10568"></a><span class="lineno">10568</span>&#160;                {</div>
-<div class="line"><a name="l10569"></a><span class="lineno">10569</span>&#160;                    <span class="comment">// There is free space from lastOffset to suballoc.offset.</span></div>
-<div class="line"><a name="l10570"></a><span class="lineno">10570</span>&#160;                    <span class="keyword">const</span> VkDeviceSize unusedRangeSize = suballoc.offset - lastOffset;</div>
-<div class="line"><a name="l10571"></a><span class="lineno">10571</span>&#160;                    PrintDetailedMap_UnusedRange(json, lastOffset, unusedRangeSize);</div>
-<div class="line"><a name="l10572"></a><span class="lineno">10572</span>&#160;                }</div>
-<div class="line"><a name="l10573"></a><span class="lineno">10573</span>&#160;            </div>
-<div class="line"><a name="l10574"></a><span class="lineno">10574</span>&#160;                <span class="comment">// 2. Process this allocation.</span></div>
-<div class="line"><a name="l10575"></a><span class="lineno">10575</span>&#160;                <span class="comment">// There is allocation with suballoc.offset, suballoc.size.</span></div>
-<div class="line"><a name="l10576"></a><span class="lineno">10576</span>&#160;                PrintDetailedMap_Allocation(json, suballoc.offset, suballoc.hAllocation);</div>
-<div class="line"><a name="l10577"></a><span class="lineno">10577</span>&#160;            </div>
-<div class="line"><a name="l10578"></a><span class="lineno">10578</span>&#160;                <span class="comment">// 3. Prepare for next iteration.</span></div>
-<div class="line"><a name="l10579"></a><span class="lineno">10579</span>&#160;                lastOffset = suballoc.offset + suballoc.size;</div>
-<div class="line"><a name="l10580"></a><span class="lineno">10580</span>&#160;                ++nextAlloc2ndIndex;</div>
-<div class="line"><a name="l10581"></a><span class="lineno">10581</span>&#160;            }</div>
-<div class="line"><a name="l10582"></a><span class="lineno">10582</span>&#160;            <span class="comment">// We are at the end.</span></div>
-<div class="line"><a name="l10583"></a><span class="lineno">10583</span>&#160;            <span class="keywordflow">else</span></div>
-<div class="line"><a name="l10584"></a><span class="lineno">10584</span>&#160;            {</div>
-<div class="line"><a name="l10585"></a><span class="lineno">10585</span>&#160;                <span class="keywordflow">if</span>(lastOffset &lt; freeSpace2ndTo1stEnd)</div>
-<div class="line"><a name="l10586"></a><span class="lineno">10586</span>&#160;                {</div>
-<div class="line"><a name="l10587"></a><span class="lineno">10587</span>&#160;                    <span class="comment">// There is free space from lastOffset to freeSpace2ndTo1stEnd.</span></div>
-<div class="line"><a name="l10588"></a><span class="lineno">10588</span>&#160;                    <span class="keyword">const</span> VkDeviceSize unusedRangeSize = freeSpace2ndTo1stEnd - lastOffset;</div>
-<div class="line"><a name="l10589"></a><span class="lineno">10589</span>&#160;                    PrintDetailedMap_UnusedRange(json, lastOffset, unusedRangeSize);</div>
-<div class="line"><a name="l10590"></a><span class="lineno">10590</span>&#160;                }</div>
-<div class="line"><a name="l10591"></a><span class="lineno">10591</span>&#160; </div>
-<div class="line"><a name="l10592"></a><span class="lineno">10592</span>&#160;                <span class="comment">// End of loop.</span></div>
-<div class="line"><a name="l10593"></a><span class="lineno">10593</span>&#160;                lastOffset = freeSpace2ndTo1stEnd;</div>
-<div class="line"><a name="l10594"></a><span class="lineno">10594</span>&#160;            }</div>
-<div class="line"><a name="l10595"></a><span class="lineno">10595</span>&#160;        }</div>
-<div class="line"><a name="l10596"></a><span class="lineno">10596</span>&#160;    }</div>
-<div class="line"><a name="l10597"></a><span class="lineno">10597</span>&#160; </div>
-<div class="line"><a name="l10598"></a><span class="lineno">10598</span>&#160;    nextAlloc1stIndex = m_1stNullItemsBeginCount;</div>
-<div class="line"><a name="l10599"></a><span class="lineno">10599</span>&#160;    <span class="keywordflow">while</span>(lastOffset &lt; freeSpace1stTo2ndEnd)</div>
-<div class="line"><a name="l10600"></a><span class="lineno">10600</span>&#160;    {</div>
-<div class="line"><a name="l10601"></a><span class="lineno">10601</span>&#160;        <span class="comment">// Find next non-null allocation or move nextAllocIndex to the end.</span></div>
-<div class="line"><a name="l10602"></a><span class="lineno">10602</span>&#160;        <span class="keywordflow">while</span>(nextAlloc1stIndex &lt; suballoc1stCount &amp;&amp;</div>
-<div class="line"><a name="l10603"></a><span class="lineno">10603</span>&#160;            suballocations1st[nextAlloc1stIndex].hAllocation == VK_NULL_HANDLE)</div>
-<div class="line"><a name="l10604"></a><span class="lineno">10604</span>&#160;        {</div>
-<div class="line"><a name="l10605"></a><span class="lineno">10605</span>&#160;            ++nextAlloc1stIndex;</div>
-<div class="line"><a name="l10606"></a><span class="lineno">10606</span>&#160;        }</div>
+<div class="line"><a name="l10431"></a><span class="lineno">10431</span>&#160; </div>
+<div class="line"><a name="l10432"></a><span class="lineno">10432</span>&#160;            offset = suballoc.offset + suballoc.size + VMA_DEBUG_MARGIN;</div>
+<div class="line"><a name="l10433"></a><span class="lineno">10433</span>&#160;        }</div>
+<div class="line"><a name="l10434"></a><span class="lineno">10434</span>&#160; </div>
+<div class="line"><a name="l10435"></a><span class="lineno">10435</span>&#160;        VMA_VALIDATE(nullItem2ndCount == m_2ndNullItemsCount);</div>
+<div class="line"><a name="l10436"></a><span class="lineno">10436</span>&#160;    }</div>
+<div class="line"><a name="l10437"></a><span class="lineno">10437</span>&#160; </div>
+<div class="line"><a name="l10438"></a><span class="lineno">10438</span>&#160;    VMA_VALIDATE(offset &lt;= GetSize());</div>
+<div class="line"><a name="l10439"></a><span class="lineno">10439</span>&#160;    VMA_VALIDATE(m_SumFreeSize == GetSize() - sumUsedSize);</div>
+<div class="line"><a name="l10440"></a><span class="lineno">10440</span>&#160; </div>
+<div class="line"><a name="l10441"></a><span class="lineno">10441</span>&#160;    <span class="keywordflow">return</span> <span class="keyword">true</span>;</div>
+<div class="line"><a name="l10442"></a><span class="lineno">10442</span>&#160;}</div>
+<div class="line"><a name="l10443"></a><span class="lineno">10443</span>&#160; </div>
+<div class="line"><a name="l10444"></a><span class="lineno">10444</span>&#160;<span class="keywordtype">size_t</span> VmaBlockMetadata_Linear::GetAllocationCount()<span class="keyword"> const</span></div>
+<div class="line"><a name="l10445"></a><span class="lineno">10445</span>&#160;<span class="keyword"></span>{</div>
+<div class="line"><a name="l10446"></a><span class="lineno">10446</span>&#160;    <span class="keywordflow">return</span> AccessSuballocations1st().size() - (m_1stNullItemsBeginCount + m_1stNullItemsMiddleCount) +</div>
+<div class="line"><a name="l10447"></a><span class="lineno">10447</span>&#160;        AccessSuballocations2nd().size() - m_2ndNullItemsCount;</div>
+<div class="line"><a name="l10448"></a><span class="lineno">10448</span>&#160;}</div>
+<div class="line"><a name="l10449"></a><span class="lineno">10449</span>&#160; </div>
+<div class="line"><a name="l10450"></a><span class="lineno">10450</span>&#160;VkDeviceSize VmaBlockMetadata_Linear::GetUnusedRangeSizeMax()<span class="keyword"> const</span></div>
+<div class="line"><a name="l10451"></a><span class="lineno">10451</span>&#160;<span class="keyword"></span>{</div>
+<div class="line"><a name="l10452"></a><span class="lineno">10452</span>&#160;    <span class="keyword">const</span> VkDeviceSize size = GetSize();</div>
+<div class="line"><a name="l10453"></a><span class="lineno">10453</span>&#160; </div>
+<div class="line"><a name="l10454"></a><span class="lineno">10454</span>&#160;    <span class="comment">/*</span></div>
+<div class="line"><a name="l10455"></a><span class="lineno">10455</span>&#160;<span class="comment">    We don&#39;t consider gaps inside allocation vectors with freed allocations because</span></div>
+<div class="line"><a name="l10456"></a><span class="lineno">10456</span>&#160;<span class="comment">    they are not suitable for reuse in linear allocator. We consider only space that</span></div>
+<div class="line"><a name="l10457"></a><span class="lineno">10457</span>&#160;<span class="comment">    is available for new allocations.</span></div>
+<div class="line"><a name="l10458"></a><span class="lineno">10458</span>&#160;<span class="comment">    */</span></div>
+<div class="line"><a name="l10459"></a><span class="lineno">10459</span>&#160;    <span class="keywordflow">if</span>(IsEmpty())</div>
+<div class="line"><a name="l10460"></a><span class="lineno">10460</span>&#160;    {</div>
+<div class="line"><a name="l10461"></a><span class="lineno">10461</span>&#160;        <span class="keywordflow">return</span> size;</div>
+<div class="line"><a name="l10462"></a><span class="lineno">10462</span>&#160;    }</div>
+<div class="line"><a name="l10463"></a><span class="lineno">10463</span>&#160; </div>
+<div class="line"><a name="l10464"></a><span class="lineno">10464</span>&#160;    <span class="keyword">const</span> SuballocationVectorType&amp; suballocations1st = AccessSuballocations1st();</div>
+<div class="line"><a name="l10465"></a><span class="lineno">10465</span>&#160; </div>
+<div class="line"><a name="l10466"></a><span class="lineno">10466</span>&#160;    <span class="keywordflow">switch</span>(m_2ndVectorMode)</div>
+<div class="line"><a name="l10467"></a><span class="lineno">10467</span>&#160;    {</div>
+<div class="line"><a name="l10468"></a><span class="lineno">10468</span>&#160;    <span class="keywordflow">case</span> SECOND_VECTOR_EMPTY:</div>
+<div class="line"><a name="l10469"></a><span class="lineno">10469</span>&#160;        <span class="comment">/*</span></div>
+<div class="line"><a name="l10470"></a><span class="lineno">10470</span>&#160;<span class="comment">        Available space is after end of 1st, as well as before beginning of 1st (which</span></div>
+<div class="line"><a name="l10471"></a><span class="lineno">10471</span>&#160;<span class="comment">        would make it a ring buffer).</span></div>
+<div class="line"><a name="l10472"></a><span class="lineno">10472</span>&#160;<span class="comment">        */</span></div>
+<div class="line"><a name="l10473"></a><span class="lineno">10473</span>&#160;        {</div>
+<div class="line"><a name="l10474"></a><span class="lineno">10474</span>&#160;            <span class="keyword">const</span> <span class="keywordtype">size_t</span> suballocations1stCount = suballocations1st.size();</div>
+<div class="line"><a name="l10475"></a><span class="lineno">10475</span>&#160;            VMA_ASSERT(suballocations1stCount &gt; m_1stNullItemsBeginCount);</div>
+<div class="line"><a name="l10476"></a><span class="lineno">10476</span>&#160;            <span class="keyword">const</span> VmaSuballocation&amp; firstSuballoc = suballocations1st[m_1stNullItemsBeginCount];</div>
+<div class="line"><a name="l10477"></a><span class="lineno">10477</span>&#160;            <span class="keyword">const</span> VmaSuballocation&amp; lastSuballoc  = suballocations1st[suballocations1stCount - 1];</div>
+<div class="line"><a name="l10478"></a><span class="lineno">10478</span>&#160;            <span class="keywordflow">return</span> VMA_MAX(</div>
+<div class="line"><a name="l10479"></a><span class="lineno">10479</span>&#160;                firstSuballoc.offset,</div>
+<div class="line"><a name="l10480"></a><span class="lineno">10480</span>&#160;                size - (lastSuballoc.offset + lastSuballoc.size));</div>
+<div class="line"><a name="l10481"></a><span class="lineno">10481</span>&#160;        }</div>
+<div class="line"><a name="l10482"></a><span class="lineno">10482</span>&#160;        <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l10483"></a><span class="lineno">10483</span>&#160; </div>
+<div class="line"><a name="l10484"></a><span class="lineno">10484</span>&#160;    <span class="keywordflow">case</span> SECOND_VECTOR_RING_BUFFER:</div>
+<div class="line"><a name="l10485"></a><span class="lineno">10485</span>&#160;        <span class="comment">/*</span></div>
+<div class="line"><a name="l10486"></a><span class="lineno">10486</span>&#160;<span class="comment">        Available space is only between end of 2nd and beginning of 1st.</span></div>
+<div class="line"><a name="l10487"></a><span class="lineno">10487</span>&#160;<span class="comment">        */</span></div>
+<div class="line"><a name="l10488"></a><span class="lineno">10488</span>&#160;        {</div>
+<div class="line"><a name="l10489"></a><span class="lineno">10489</span>&#160;            <span class="keyword">const</span> SuballocationVectorType&amp; suballocations2nd = AccessSuballocations2nd();</div>
+<div class="line"><a name="l10490"></a><span class="lineno">10490</span>&#160;            <span class="keyword">const</span> VmaSuballocation&amp; lastSuballoc2nd = suballocations2nd.back();</div>
+<div class="line"><a name="l10491"></a><span class="lineno">10491</span>&#160;            <span class="keyword">const</span> VmaSuballocation&amp; firstSuballoc1st = suballocations1st[m_1stNullItemsBeginCount];</div>
+<div class="line"><a name="l10492"></a><span class="lineno">10492</span>&#160;            <span class="keywordflow">return</span> firstSuballoc1st.offset - (lastSuballoc2nd.offset + lastSuballoc2nd.size);</div>
+<div class="line"><a name="l10493"></a><span class="lineno">10493</span>&#160;        }</div>
+<div class="line"><a name="l10494"></a><span class="lineno">10494</span>&#160;        <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l10495"></a><span class="lineno">10495</span>&#160; </div>
+<div class="line"><a name="l10496"></a><span class="lineno">10496</span>&#160;    <span class="keywordflow">case</span> SECOND_VECTOR_DOUBLE_STACK:</div>
+<div class="line"><a name="l10497"></a><span class="lineno">10497</span>&#160;        <span class="comment">/*</span></div>
+<div class="line"><a name="l10498"></a><span class="lineno">10498</span>&#160;<span class="comment">        Available space is only between end of 1st and top of 2nd.</span></div>
+<div class="line"><a name="l10499"></a><span class="lineno">10499</span>&#160;<span class="comment">        */</span></div>
+<div class="line"><a name="l10500"></a><span class="lineno">10500</span>&#160;        {</div>
+<div class="line"><a name="l10501"></a><span class="lineno">10501</span>&#160;            <span class="keyword">const</span> SuballocationVectorType&amp; suballocations2nd = AccessSuballocations2nd();</div>
+<div class="line"><a name="l10502"></a><span class="lineno">10502</span>&#160;            <span class="keyword">const</span> VmaSuballocation&amp; topSuballoc2nd = suballocations2nd.back();</div>
+<div class="line"><a name="l10503"></a><span class="lineno">10503</span>&#160;            <span class="keyword">const</span> VmaSuballocation&amp; lastSuballoc1st = suballocations1st.back();</div>
+<div class="line"><a name="l10504"></a><span class="lineno">10504</span>&#160;            <span class="keywordflow">return</span> topSuballoc2nd.offset - (lastSuballoc1st.offset + lastSuballoc1st.size);</div>
+<div class="line"><a name="l10505"></a><span class="lineno">10505</span>&#160;        }</div>
+<div class="line"><a name="l10506"></a><span class="lineno">10506</span>&#160;        <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l10507"></a><span class="lineno">10507</span>&#160; </div>
+<div class="line"><a name="l10508"></a><span class="lineno">10508</span>&#160;    <span class="keywordflow">default</span>:</div>
+<div class="line"><a name="l10509"></a><span class="lineno">10509</span>&#160;        VMA_ASSERT(0);</div>
+<div class="line"><a name="l10510"></a><span class="lineno">10510</span>&#160;        <span class="keywordflow">return</span> 0;</div>
+<div class="line"><a name="l10511"></a><span class="lineno">10511</span>&#160;    }</div>
+<div class="line"><a name="l10512"></a><span class="lineno">10512</span>&#160;}</div>
+<div class="line"><a name="l10513"></a><span class="lineno">10513</span>&#160; </div>
+<div class="line"><a name="l10514"></a><span class="lineno">10514</span>&#160;<span class="keywordtype">void</span> VmaBlockMetadata_Linear::CalcAllocationStatInfo(<a class="code" href="struct_vma_stat_info.html">VmaStatInfo</a>&amp; outInfo)<span class="keyword"> const</span></div>
+<div class="line"><a name="l10515"></a><span class="lineno">10515</span>&#160;<span class="keyword"></span>{</div>
+<div class="line"><a name="l10516"></a><span class="lineno">10516</span>&#160;    <span class="keyword">const</span> VkDeviceSize size = GetSize();</div>
+<div class="line"><a name="l10517"></a><span class="lineno">10517</span>&#160;    <span class="keyword">const</span> SuballocationVectorType&amp; suballocations1st = AccessSuballocations1st();</div>
+<div class="line"><a name="l10518"></a><span class="lineno">10518</span>&#160;    <span class="keyword">const</span> SuballocationVectorType&amp; suballocations2nd = AccessSuballocations2nd();</div>
+<div class="line"><a name="l10519"></a><span class="lineno">10519</span>&#160;    <span class="keyword">const</span> <span class="keywordtype">size_t</span> suballoc1stCount = suballocations1st.size();</div>
+<div class="line"><a name="l10520"></a><span class="lineno">10520</span>&#160;    <span class="keyword">const</span> <span class="keywordtype">size_t</span> suballoc2ndCount = suballocations2nd.size();</div>
+<div class="line"><a name="l10521"></a><span class="lineno">10521</span>&#160; </div>
+<div class="line"><a name="l10522"></a><span class="lineno">10522</span>&#160;    outInfo.<a class="code" href="struct_vma_stat_info.html#abc4bb7cd611900778464c56e50c970a4">blockCount</a> = 1;</div>
+<div class="line"><a name="l10523"></a><span class="lineno">10523</span>&#160;    outInfo.<a class="code" href="struct_vma_stat_info.html#a537741e4d5cdddc1c0ab95ec650afaff">allocationCount</a> = (uint32_t)GetAllocationCount();</div>
+<div class="line"><a name="l10524"></a><span class="lineno">10524</span>&#160;    outInfo.<a class="code" href="struct_vma_stat_info.html#ae06129c771bfebfd6468a7f4276502a9">unusedRangeCount</a> = 0;</div>
+<div class="line"><a name="l10525"></a><span class="lineno">10525</span>&#160;    outInfo.<a class="code" href="struct_vma_stat_info.html#ab0c6c73837e5a70c749fbd4f6064895a">usedBytes</a> = 0;</div>
+<div class="line"><a name="l10526"></a><span class="lineno">10526</span>&#160;    outInfo.<a class="code" href="struct_vma_stat_info.html#ade8b40bd3139c04aabd2fc538a356fea">allocationSizeMin</a> = UINT64_MAX;</div>
+<div class="line"><a name="l10527"></a><span class="lineno">10527</span>&#160;    outInfo.<a class="code" href="struct_vma_stat_info.html#a17e9733a5ecd76287d4db6e66f71f50c">allocationSizeMax</a> = 0;</div>
+<div class="line"><a name="l10528"></a><span class="lineno">10528</span>&#160;    outInfo.<a class="code" href="struct_vma_stat_info.html#aedeba931324f16589cd2416c0d2dd0d4">unusedRangeSizeMin</a> = UINT64_MAX;</div>
+<div class="line"><a name="l10529"></a><span class="lineno">10529</span>&#160;    outInfo.<a class="code" href="struct_vma_stat_info.html#a5ba1a2476c4d39b10f7e2f7ebbb72ac4">unusedRangeSizeMax</a> = 0;</div>
+<div class="line"><a name="l10530"></a><span class="lineno">10530</span>&#160; </div>
+<div class="line"><a name="l10531"></a><span class="lineno">10531</span>&#160;    VkDeviceSize lastOffset = 0;</div>
+<div class="line"><a name="l10532"></a><span class="lineno">10532</span>&#160; </div>
+<div class="line"><a name="l10533"></a><span class="lineno">10533</span>&#160;    <span class="keywordflow">if</span>(m_2ndVectorMode == SECOND_VECTOR_RING_BUFFER)</div>
+<div class="line"><a name="l10534"></a><span class="lineno">10534</span>&#160;    {</div>
+<div class="line"><a name="l10535"></a><span class="lineno">10535</span>&#160;        <span class="keyword">const</span> VkDeviceSize freeSpace2ndTo1stEnd = suballocations1st[m_1stNullItemsBeginCount].offset;</div>
+<div class="line"><a name="l10536"></a><span class="lineno">10536</span>&#160;        <span class="keywordtype">size_t</span> nextAlloc2ndIndex = 0;</div>
+<div class="line"><a name="l10537"></a><span class="lineno">10537</span>&#160;        <span class="keywordflow">while</span>(lastOffset &lt; freeSpace2ndTo1stEnd)</div>
+<div class="line"><a name="l10538"></a><span class="lineno">10538</span>&#160;        {</div>
+<div class="line"><a name="l10539"></a><span class="lineno">10539</span>&#160;            <span class="comment">// Find next non-null allocation or move nextAllocIndex to the end.</span></div>
+<div class="line"><a name="l10540"></a><span class="lineno">10540</span>&#160;            <span class="keywordflow">while</span>(nextAlloc2ndIndex &lt; suballoc2ndCount &amp;&amp;</div>
+<div class="line"><a name="l10541"></a><span class="lineno">10541</span>&#160;                suballocations2nd[nextAlloc2ndIndex].hAllocation == VK_NULL_HANDLE)</div>
+<div class="line"><a name="l10542"></a><span class="lineno">10542</span>&#160;            {</div>
+<div class="line"><a name="l10543"></a><span class="lineno">10543</span>&#160;                ++nextAlloc2ndIndex;</div>
+<div class="line"><a name="l10544"></a><span class="lineno">10544</span>&#160;            }</div>
+<div class="line"><a name="l10545"></a><span class="lineno">10545</span>&#160; </div>
+<div class="line"><a name="l10546"></a><span class="lineno">10546</span>&#160;            <span class="comment">// Found non-null allocation.</span></div>
+<div class="line"><a name="l10547"></a><span class="lineno">10547</span>&#160;            <span class="keywordflow">if</span>(nextAlloc2ndIndex &lt; suballoc2ndCount)</div>
+<div class="line"><a name="l10548"></a><span class="lineno">10548</span>&#160;            {</div>
+<div class="line"><a name="l10549"></a><span class="lineno">10549</span>&#160;                <span class="keyword">const</span> VmaSuballocation&amp; suballoc = suballocations2nd[nextAlloc2ndIndex];</div>
+<div class="line"><a name="l10550"></a><span class="lineno">10550</span>&#160; </div>
+<div class="line"><a name="l10551"></a><span class="lineno">10551</span>&#160;                <span class="comment">// 1. Process free space before this allocation.</span></div>
+<div class="line"><a name="l10552"></a><span class="lineno">10552</span>&#160;                <span class="keywordflow">if</span>(lastOffset &lt; suballoc.offset)</div>
+<div class="line"><a name="l10553"></a><span class="lineno">10553</span>&#160;                {</div>
+<div class="line"><a name="l10554"></a><span class="lineno">10554</span>&#160;                    <span class="comment">// There is free space from lastOffset to suballoc.offset.</span></div>
+<div class="line"><a name="l10555"></a><span class="lineno">10555</span>&#160;                    <span class="keyword">const</span> VkDeviceSize unusedRangeSize = suballoc.offset - lastOffset;</div>
+<div class="line"><a name="l10556"></a><span class="lineno">10556</span>&#160;                    ++outInfo.<a class="code" href="struct_vma_stat_info.html#ae06129c771bfebfd6468a7f4276502a9">unusedRangeCount</a>;</div>
+<div class="line"><a name="l10557"></a><span class="lineno">10557</span>&#160;                    outInfo.<a class="code" href="struct_vma_stat_info.html#a1859d290aca2cd582d8dc25922092669">unusedBytes</a> += unusedRangeSize;</div>
+<div class="line"><a name="l10558"></a><span class="lineno">10558</span>&#160;                    outInfo.<a class="code" href="struct_vma_stat_info.html#aedeba931324f16589cd2416c0d2dd0d4">unusedRangeSizeMin</a> = VMA_MIN(outInfo.<a class="code" href="struct_vma_stat_info.html#aedeba931324f16589cd2416c0d2dd0d4">unusedRangeSizeMin</a>, unusedRangeSize);</div>
+<div class="line"><a name="l10559"></a><span class="lineno">10559</span>&#160;                    outInfo.<a class="code" href="struct_vma_stat_info.html#a5ba1a2476c4d39b10f7e2f7ebbb72ac4">unusedRangeSizeMax</a> = VMA_MIN(outInfo.<a class="code" href="struct_vma_stat_info.html#a5ba1a2476c4d39b10f7e2f7ebbb72ac4">unusedRangeSizeMax</a>, unusedRangeSize);</div>
+<div class="line"><a name="l10560"></a><span class="lineno">10560</span>&#160;                }</div>
+<div class="line"><a name="l10561"></a><span class="lineno">10561</span>&#160; </div>
+<div class="line"><a name="l10562"></a><span class="lineno">10562</span>&#160;                <span class="comment">// 2. Process this allocation.</span></div>
+<div class="line"><a name="l10563"></a><span class="lineno">10563</span>&#160;                <span class="comment">// There is allocation with suballoc.offset, suballoc.size.</span></div>
+<div class="line"><a name="l10564"></a><span class="lineno">10564</span>&#160;                outInfo.<a class="code" href="struct_vma_stat_info.html#ab0c6c73837e5a70c749fbd4f6064895a">usedBytes</a> += suballoc.size;</div>
+<div class="line"><a name="l10565"></a><span class="lineno">10565</span>&#160;                outInfo.<a class="code" href="struct_vma_stat_info.html#ade8b40bd3139c04aabd2fc538a356fea">allocationSizeMin</a> = VMA_MIN(outInfo.<a class="code" href="struct_vma_stat_info.html#ade8b40bd3139c04aabd2fc538a356fea">allocationSizeMin</a>, suballoc.size);</div>
+<div class="line"><a name="l10566"></a><span class="lineno">10566</span>&#160;                outInfo.<a class="code" href="struct_vma_stat_info.html#a17e9733a5ecd76287d4db6e66f71f50c">allocationSizeMax</a> = VMA_MIN(outInfo.<a class="code" href="struct_vma_stat_info.html#a17e9733a5ecd76287d4db6e66f71f50c">allocationSizeMax</a>, suballoc.size);</div>
+<div class="line"><a name="l10567"></a><span class="lineno">10567</span>&#160; </div>
+<div class="line"><a name="l10568"></a><span class="lineno">10568</span>&#160;                <span class="comment">// 3. Prepare for next iteration.</span></div>
+<div class="line"><a name="l10569"></a><span class="lineno">10569</span>&#160;                lastOffset = suballoc.offset + suballoc.size;</div>
+<div class="line"><a name="l10570"></a><span class="lineno">10570</span>&#160;                ++nextAlloc2ndIndex;</div>
+<div class="line"><a name="l10571"></a><span class="lineno">10571</span>&#160;            }</div>
+<div class="line"><a name="l10572"></a><span class="lineno">10572</span>&#160;            <span class="comment">// We are at the end.</span></div>
+<div class="line"><a name="l10573"></a><span class="lineno">10573</span>&#160;            <span class="keywordflow">else</span></div>
+<div class="line"><a name="l10574"></a><span class="lineno">10574</span>&#160;            {</div>
+<div class="line"><a name="l10575"></a><span class="lineno">10575</span>&#160;                <span class="comment">// There is free space from lastOffset to freeSpace2ndTo1stEnd.</span></div>
+<div class="line"><a name="l10576"></a><span class="lineno">10576</span>&#160;                <span class="keywordflow">if</span>(lastOffset &lt; freeSpace2ndTo1stEnd)</div>
+<div class="line"><a name="l10577"></a><span class="lineno">10577</span>&#160;                {</div>
+<div class="line"><a name="l10578"></a><span class="lineno">10578</span>&#160;                    <span class="keyword">const</span> VkDeviceSize unusedRangeSize = freeSpace2ndTo1stEnd - lastOffset;</div>
+<div class="line"><a name="l10579"></a><span class="lineno">10579</span>&#160;                    ++outInfo.<a class="code" href="struct_vma_stat_info.html#ae06129c771bfebfd6468a7f4276502a9">unusedRangeCount</a>;</div>
+<div class="line"><a name="l10580"></a><span class="lineno">10580</span>&#160;                    outInfo.<a class="code" href="struct_vma_stat_info.html#a1859d290aca2cd582d8dc25922092669">unusedBytes</a> += unusedRangeSize;</div>
+<div class="line"><a name="l10581"></a><span class="lineno">10581</span>&#160;                    outInfo.<a class="code" href="struct_vma_stat_info.html#aedeba931324f16589cd2416c0d2dd0d4">unusedRangeSizeMin</a> = VMA_MIN(outInfo.<a class="code" href="struct_vma_stat_info.html#aedeba931324f16589cd2416c0d2dd0d4">unusedRangeSizeMin</a>, unusedRangeSize);</div>
+<div class="line"><a name="l10582"></a><span class="lineno">10582</span>&#160;                    outInfo.<a class="code" href="struct_vma_stat_info.html#a5ba1a2476c4d39b10f7e2f7ebbb72ac4">unusedRangeSizeMax</a> = VMA_MIN(outInfo.<a class="code" href="struct_vma_stat_info.html#a5ba1a2476c4d39b10f7e2f7ebbb72ac4">unusedRangeSizeMax</a>, unusedRangeSize);</div>
+<div class="line"><a name="l10583"></a><span class="lineno">10583</span>&#160;               }</div>
+<div class="line"><a name="l10584"></a><span class="lineno">10584</span>&#160; </div>
+<div class="line"><a name="l10585"></a><span class="lineno">10585</span>&#160;                <span class="comment">// End of loop.</span></div>
+<div class="line"><a name="l10586"></a><span class="lineno">10586</span>&#160;                lastOffset = freeSpace2ndTo1stEnd;</div>
+<div class="line"><a name="l10587"></a><span class="lineno">10587</span>&#160;            }</div>
+<div class="line"><a name="l10588"></a><span class="lineno">10588</span>&#160;        }</div>
+<div class="line"><a name="l10589"></a><span class="lineno">10589</span>&#160;    }</div>
+<div class="line"><a name="l10590"></a><span class="lineno">10590</span>&#160; </div>
+<div class="line"><a name="l10591"></a><span class="lineno">10591</span>&#160;    <span class="keywordtype">size_t</span> nextAlloc1stIndex = m_1stNullItemsBeginCount;</div>
+<div class="line"><a name="l10592"></a><span class="lineno">10592</span>&#160;    <span class="keyword">const</span> VkDeviceSize freeSpace1stTo2ndEnd =</div>
+<div class="line"><a name="l10593"></a><span class="lineno">10593</span>&#160;        m_2ndVectorMode == SECOND_VECTOR_DOUBLE_STACK ? suballocations2nd.back().offset : size;</div>
+<div class="line"><a name="l10594"></a><span class="lineno">10594</span>&#160;    <span class="keywordflow">while</span>(lastOffset &lt; freeSpace1stTo2ndEnd)</div>
+<div class="line"><a name="l10595"></a><span class="lineno">10595</span>&#160;    {</div>
+<div class="line"><a name="l10596"></a><span class="lineno">10596</span>&#160;        <span class="comment">// Find next non-null allocation or move nextAllocIndex to the end.</span></div>
+<div class="line"><a name="l10597"></a><span class="lineno">10597</span>&#160;        <span class="keywordflow">while</span>(nextAlloc1stIndex &lt; suballoc1stCount &amp;&amp;</div>
+<div class="line"><a name="l10598"></a><span class="lineno">10598</span>&#160;            suballocations1st[nextAlloc1stIndex].hAllocation == VK_NULL_HANDLE)</div>
+<div class="line"><a name="l10599"></a><span class="lineno">10599</span>&#160;        {</div>
+<div class="line"><a name="l10600"></a><span class="lineno">10600</span>&#160;            ++nextAlloc1stIndex;</div>
+<div class="line"><a name="l10601"></a><span class="lineno">10601</span>&#160;        }</div>
+<div class="line"><a name="l10602"></a><span class="lineno">10602</span>&#160; </div>
+<div class="line"><a name="l10603"></a><span class="lineno">10603</span>&#160;        <span class="comment">// Found non-null allocation.</span></div>
+<div class="line"><a name="l10604"></a><span class="lineno">10604</span>&#160;        <span class="keywordflow">if</span>(nextAlloc1stIndex &lt; suballoc1stCount)</div>
+<div class="line"><a name="l10605"></a><span class="lineno">10605</span>&#160;        {</div>
+<div class="line"><a name="l10606"></a><span class="lineno">10606</span>&#160;            <span class="keyword">const</span> VmaSuballocation&amp; suballoc = suballocations1st[nextAlloc1stIndex];</div>
 <div class="line"><a name="l10607"></a><span class="lineno">10607</span>&#160; </div>
-<div class="line"><a name="l10608"></a><span class="lineno">10608</span>&#160;        <span class="comment">// Found non-null allocation.</span></div>
-<div class="line"><a name="l10609"></a><span class="lineno">10609</span>&#160;        <span class="keywordflow">if</span>(nextAlloc1stIndex &lt; suballoc1stCount)</div>
-<div class="line"><a name="l10610"></a><span class="lineno">10610</span>&#160;        {</div>
-<div class="line"><a name="l10611"></a><span class="lineno">10611</span>&#160;            <span class="keyword">const</span> VmaSuballocation&amp; suballoc = suballocations1st[nextAlloc1stIndex];</div>
-<div class="line"><a name="l10612"></a><span class="lineno">10612</span>&#160;            </div>
-<div class="line"><a name="l10613"></a><span class="lineno">10613</span>&#160;            <span class="comment">// 1. Process free space before this allocation.</span></div>
-<div class="line"><a name="l10614"></a><span class="lineno">10614</span>&#160;            <span class="keywordflow">if</span>(lastOffset &lt; suballoc.offset)</div>
-<div class="line"><a name="l10615"></a><span class="lineno">10615</span>&#160;            {</div>
-<div class="line"><a name="l10616"></a><span class="lineno">10616</span>&#160;                <span class="comment">// There is free space from lastOffset to suballoc.offset.</span></div>
-<div class="line"><a name="l10617"></a><span class="lineno">10617</span>&#160;                <span class="keyword">const</span> VkDeviceSize unusedRangeSize = suballoc.offset - lastOffset;</div>
-<div class="line"><a name="l10618"></a><span class="lineno">10618</span>&#160;                PrintDetailedMap_UnusedRange(json, lastOffset, unusedRangeSize);</div>
-<div class="line"><a name="l10619"></a><span class="lineno">10619</span>&#160;            }</div>
-<div class="line"><a name="l10620"></a><span class="lineno">10620</span>&#160;            </div>
-<div class="line"><a name="l10621"></a><span class="lineno">10621</span>&#160;            <span class="comment">// 2. Process this allocation.</span></div>
-<div class="line"><a name="l10622"></a><span class="lineno">10622</span>&#160;            <span class="comment">// There is allocation with suballoc.offset, suballoc.size.</span></div>
-<div class="line"><a name="l10623"></a><span class="lineno">10623</span>&#160;            PrintDetailedMap_Allocation(json, suballoc.offset, suballoc.hAllocation);</div>
-<div class="line"><a name="l10624"></a><span class="lineno">10624</span>&#160;            </div>
+<div class="line"><a name="l10608"></a><span class="lineno">10608</span>&#160;            <span class="comment">// 1. Process free space before this allocation.</span></div>
+<div class="line"><a name="l10609"></a><span class="lineno">10609</span>&#160;            <span class="keywordflow">if</span>(lastOffset &lt; suballoc.offset)</div>
+<div class="line"><a name="l10610"></a><span class="lineno">10610</span>&#160;            {</div>
+<div class="line"><a name="l10611"></a><span class="lineno">10611</span>&#160;                <span class="comment">// There is free space from lastOffset to suballoc.offset.</span></div>
+<div class="line"><a name="l10612"></a><span class="lineno">10612</span>&#160;                <span class="keyword">const</span> VkDeviceSize unusedRangeSize = suballoc.offset - lastOffset;</div>
+<div class="line"><a name="l10613"></a><span class="lineno">10613</span>&#160;                ++outInfo.<a class="code" href="struct_vma_stat_info.html#ae06129c771bfebfd6468a7f4276502a9">unusedRangeCount</a>;</div>
+<div class="line"><a name="l10614"></a><span class="lineno">10614</span>&#160;                outInfo.<a class="code" href="struct_vma_stat_info.html#a1859d290aca2cd582d8dc25922092669">unusedBytes</a> += unusedRangeSize;</div>
+<div class="line"><a name="l10615"></a><span class="lineno">10615</span>&#160;                outInfo.<a class="code" href="struct_vma_stat_info.html#aedeba931324f16589cd2416c0d2dd0d4">unusedRangeSizeMin</a> = VMA_MIN(outInfo.<a class="code" href="struct_vma_stat_info.html#aedeba931324f16589cd2416c0d2dd0d4">unusedRangeSizeMin</a>, unusedRangeSize);</div>
+<div class="line"><a name="l10616"></a><span class="lineno">10616</span>&#160;                outInfo.<a class="code" href="struct_vma_stat_info.html#a5ba1a2476c4d39b10f7e2f7ebbb72ac4">unusedRangeSizeMax</a> = VMA_MIN(outInfo.<a class="code" href="struct_vma_stat_info.html#a5ba1a2476c4d39b10f7e2f7ebbb72ac4">unusedRangeSizeMax</a>, unusedRangeSize);</div>
+<div class="line"><a name="l10617"></a><span class="lineno">10617</span>&#160;            }</div>
+<div class="line"><a name="l10618"></a><span class="lineno">10618</span>&#160; </div>
+<div class="line"><a name="l10619"></a><span class="lineno">10619</span>&#160;            <span class="comment">// 2. Process this allocation.</span></div>
+<div class="line"><a name="l10620"></a><span class="lineno">10620</span>&#160;            <span class="comment">// There is allocation with suballoc.offset, suballoc.size.</span></div>
+<div class="line"><a name="l10621"></a><span class="lineno">10621</span>&#160;            outInfo.<a class="code" href="struct_vma_stat_info.html#ab0c6c73837e5a70c749fbd4f6064895a">usedBytes</a> += suballoc.size;</div>
+<div class="line"><a name="l10622"></a><span class="lineno">10622</span>&#160;            outInfo.<a class="code" href="struct_vma_stat_info.html#ade8b40bd3139c04aabd2fc538a356fea">allocationSizeMin</a> = VMA_MIN(outInfo.<a class="code" href="struct_vma_stat_info.html#ade8b40bd3139c04aabd2fc538a356fea">allocationSizeMin</a>, suballoc.size);</div>
+<div class="line"><a name="l10623"></a><span class="lineno">10623</span>&#160;            outInfo.<a class="code" href="struct_vma_stat_info.html#a17e9733a5ecd76287d4db6e66f71f50c">allocationSizeMax</a> = VMA_MIN(outInfo.<a class="code" href="struct_vma_stat_info.html#a17e9733a5ecd76287d4db6e66f71f50c">allocationSizeMax</a>, suballoc.size);</div>
+<div class="line"><a name="l10624"></a><span class="lineno">10624</span>&#160; </div>
 <div class="line"><a name="l10625"></a><span class="lineno">10625</span>&#160;            <span class="comment">// 3. Prepare for next iteration.</span></div>
 <div class="line"><a name="l10626"></a><span class="lineno">10626</span>&#160;            lastOffset = suballoc.offset + suballoc.size;</div>
 <div class="line"><a name="l10627"></a><span class="lineno">10627</span>&#160;            ++nextAlloc1stIndex;</div>
@@ -7577,8646 +7410,9200 @@
 <div class="line"><a name="l10629"></a><span class="lineno">10629</span>&#160;        <span class="comment">// We are at the end.</span></div>
 <div class="line"><a name="l10630"></a><span class="lineno">10630</span>&#160;        <span class="keywordflow">else</span></div>
 <div class="line"><a name="l10631"></a><span class="lineno">10631</span>&#160;        {</div>
-<div class="line"><a name="l10632"></a><span class="lineno">10632</span>&#160;            <span class="keywordflow">if</span>(lastOffset &lt; freeSpace1stTo2ndEnd)</div>
-<div class="line"><a name="l10633"></a><span class="lineno">10633</span>&#160;            {</div>
-<div class="line"><a name="l10634"></a><span class="lineno">10634</span>&#160;                <span class="comment">// There is free space from lastOffset to freeSpace1stTo2ndEnd.</span></div>
+<div class="line"><a name="l10632"></a><span class="lineno">10632</span>&#160;            <span class="comment">// There is free space from lastOffset to freeSpace1stTo2ndEnd.</span></div>
+<div class="line"><a name="l10633"></a><span class="lineno">10633</span>&#160;            <span class="keywordflow">if</span>(lastOffset &lt; freeSpace1stTo2ndEnd)</div>
+<div class="line"><a name="l10634"></a><span class="lineno">10634</span>&#160;            {</div>
 <div class="line"><a name="l10635"></a><span class="lineno">10635</span>&#160;                <span class="keyword">const</span> VkDeviceSize unusedRangeSize = freeSpace1stTo2ndEnd - lastOffset;</div>
-<div class="line"><a name="l10636"></a><span class="lineno">10636</span>&#160;                PrintDetailedMap_UnusedRange(json, lastOffset, unusedRangeSize);</div>
-<div class="line"><a name="l10637"></a><span class="lineno">10637</span>&#160;            }</div>
-<div class="line"><a name="l10638"></a><span class="lineno">10638</span>&#160; </div>
-<div class="line"><a name="l10639"></a><span class="lineno">10639</span>&#160;            <span class="comment">// End of loop.</span></div>
-<div class="line"><a name="l10640"></a><span class="lineno">10640</span>&#160;            lastOffset = freeSpace1stTo2ndEnd;</div>
-<div class="line"><a name="l10641"></a><span class="lineno">10641</span>&#160;        }</div>
-<div class="line"><a name="l10642"></a><span class="lineno">10642</span>&#160;    }</div>
-<div class="line"><a name="l10643"></a><span class="lineno">10643</span>&#160; </div>
-<div class="line"><a name="l10644"></a><span class="lineno">10644</span>&#160;    <span class="keywordflow">if</span>(m_2ndVectorMode == SECOND_VECTOR_DOUBLE_STACK)</div>
-<div class="line"><a name="l10645"></a><span class="lineno">10645</span>&#160;    {</div>
-<div class="line"><a name="l10646"></a><span class="lineno">10646</span>&#160;        <span class="keywordtype">size_t</span> nextAlloc2ndIndex = suballocations2nd.size() - 1;</div>
-<div class="line"><a name="l10647"></a><span class="lineno">10647</span>&#160;        <span class="keywordflow">while</span>(lastOffset &lt; size)</div>
-<div class="line"><a name="l10648"></a><span class="lineno">10648</span>&#160;        {</div>
-<div class="line"><a name="l10649"></a><span class="lineno">10649</span>&#160;            <span class="comment">// Find next non-null allocation or move nextAlloc2ndIndex to the end.</span></div>
-<div class="line"><a name="l10650"></a><span class="lineno">10650</span>&#160;            <span class="keywordflow">while</span>(nextAlloc2ndIndex != SIZE_MAX &amp;&amp;</div>
-<div class="line"><a name="l10651"></a><span class="lineno">10651</span>&#160;                suballocations2nd[nextAlloc2ndIndex].hAllocation == VK_NULL_HANDLE)</div>
-<div class="line"><a name="l10652"></a><span class="lineno">10652</span>&#160;            {</div>
-<div class="line"><a name="l10653"></a><span class="lineno">10653</span>&#160;                --nextAlloc2ndIndex;</div>
-<div class="line"><a name="l10654"></a><span class="lineno">10654</span>&#160;            }</div>
-<div class="line"><a name="l10655"></a><span class="lineno">10655</span>&#160; </div>
-<div class="line"><a name="l10656"></a><span class="lineno">10656</span>&#160;            <span class="comment">// Found non-null allocation.</span></div>
-<div class="line"><a name="l10657"></a><span class="lineno">10657</span>&#160;            <span class="keywordflow">if</span>(nextAlloc2ndIndex != SIZE_MAX)</div>
-<div class="line"><a name="l10658"></a><span class="lineno">10658</span>&#160;            {</div>
-<div class="line"><a name="l10659"></a><span class="lineno">10659</span>&#160;                <span class="keyword">const</span> VmaSuballocation&amp; suballoc = suballocations2nd[nextAlloc2ndIndex];</div>
-<div class="line"><a name="l10660"></a><span class="lineno">10660</span>&#160;            </div>
-<div class="line"><a name="l10661"></a><span class="lineno">10661</span>&#160;                <span class="comment">// 1. Process free space before this allocation.</span></div>
-<div class="line"><a name="l10662"></a><span class="lineno">10662</span>&#160;                <span class="keywordflow">if</span>(lastOffset &lt; suballoc.offset)</div>
-<div class="line"><a name="l10663"></a><span class="lineno">10663</span>&#160;                {</div>
-<div class="line"><a name="l10664"></a><span class="lineno">10664</span>&#160;                    <span class="comment">// There is free space from lastOffset to suballoc.offset.</span></div>
-<div class="line"><a name="l10665"></a><span class="lineno">10665</span>&#160;                    <span class="keyword">const</span> VkDeviceSize unusedRangeSize = suballoc.offset - lastOffset;</div>
-<div class="line"><a name="l10666"></a><span class="lineno">10666</span>&#160;                    PrintDetailedMap_UnusedRange(json, lastOffset, unusedRangeSize);</div>
-<div class="line"><a name="l10667"></a><span class="lineno">10667</span>&#160;                }</div>
-<div class="line"><a name="l10668"></a><span class="lineno">10668</span>&#160;            </div>
-<div class="line"><a name="l10669"></a><span class="lineno">10669</span>&#160;                <span class="comment">// 2. Process this allocation.</span></div>
-<div class="line"><a name="l10670"></a><span class="lineno">10670</span>&#160;                <span class="comment">// There is allocation with suballoc.offset, suballoc.size.</span></div>
-<div class="line"><a name="l10671"></a><span class="lineno">10671</span>&#160;                PrintDetailedMap_Allocation(json, suballoc.offset, suballoc.hAllocation);</div>
-<div class="line"><a name="l10672"></a><span class="lineno">10672</span>&#160;            </div>
-<div class="line"><a name="l10673"></a><span class="lineno">10673</span>&#160;                <span class="comment">// 3. Prepare for next iteration.</span></div>
-<div class="line"><a name="l10674"></a><span class="lineno">10674</span>&#160;                lastOffset = suballoc.offset + suballoc.size;</div>
-<div class="line"><a name="l10675"></a><span class="lineno">10675</span>&#160;                --nextAlloc2ndIndex;</div>
-<div class="line"><a name="l10676"></a><span class="lineno">10676</span>&#160;            }</div>
-<div class="line"><a name="l10677"></a><span class="lineno">10677</span>&#160;            <span class="comment">// We are at the end.</span></div>
-<div class="line"><a name="l10678"></a><span class="lineno">10678</span>&#160;            <span class="keywordflow">else</span></div>
-<div class="line"><a name="l10679"></a><span class="lineno">10679</span>&#160;            {</div>
-<div class="line"><a name="l10680"></a><span class="lineno">10680</span>&#160;                <span class="keywordflow">if</span>(lastOffset &lt; size)</div>
-<div class="line"><a name="l10681"></a><span class="lineno">10681</span>&#160;                {</div>
-<div class="line"><a name="l10682"></a><span class="lineno">10682</span>&#160;                    <span class="comment">// There is free space from lastOffset to size.</span></div>
-<div class="line"><a name="l10683"></a><span class="lineno">10683</span>&#160;                    <span class="keyword">const</span> VkDeviceSize unusedRangeSize = size - lastOffset;</div>
-<div class="line"><a name="l10684"></a><span class="lineno">10684</span>&#160;                    PrintDetailedMap_UnusedRange(json, lastOffset, unusedRangeSize);</div>
-<div class="line"><a name="l10685"></a><span class="lineno">10685</span>&#160;                }</div>
-<div class="line"><a name="l10686"></a><span class="lineno">10686</span>&#160; </div>
-<div class="line"><a name="l10687"></a><span class="lineno">10687</span>&#160;                <span class="comment">// End of loop.</span></div>
-<div class="line"><a name="l10688"></a><span class="lineno">10688</span>&#160;                lastOffset = size;</div>
-<div class="line"><a name="l10689"></a><span class="lineno">10689</span>&#160;            }</div>
-<div class="line"><a name="l10690"></a><span class="lineno">10690</span>&#160;        }</div>
-<div class="line"><a name="l10691"></a><span class="lineno">10691</span>&#160;    }</div>
-<div class="line"><a name="l10692"></a><span class="lineno">10692</span>&#160; </div>
-<div class="line"><a name="l10693"></a><span class="lineno">10693</span>&#160;    PrintDetailedMap_End(json);</div>
-<div class="line"><a name="l10694"></a><span class="lineno">10694</span>&#160;}</div>
-<div class="line"><a name="l10695"></a><span class="lineno">10695</span>&#160;<span class="preprocessor">#endif // #if VMA_STATS_STRING_ENABLED</span></div>
-<div class="line"><a name="l10696"></a><span class="lineno">10696</span>&#160; </div>
-<div class="line"><a name="l10697"></a><span class="lineno">10697</span>&#160;<span class="keywordtype">bool</span> VmaBlockMetadata_Linear::CreateAllocationRequest(</div>
-<div class="line"><a name="l10698"></a><span class="lineno">10698</span>&#160;    uint32_t currentFrameIndex,</div>
-<div class="line"><a name="l10699"></a><span class="lineno">10699</span>&#160;    uint32_t frameInUseCount,</div>
-<div class="line"><a name="l10700"></a><span class="lineno">10700</span>&#160;    VkDeviceSize bufferImageGranularity,</div>
-<div class="line"><a name="l10701"></a><span class="lineno">10701</span>&#160;    VkDeviceSize allocSize,</div>
-<div class="line"><a name="l10702"></a><span class="lineno">10702</span>&#160;    VkDeviceSize allocAlignment,</div>
-<div class="line"><a name="l10703"></a><span class="lineno">10703</span>&#160;    <span class="keywordtype">bool</span> upperAddress,</div>
-<div class="line"><a name="l10704"></a><span class="lineno">10704</span>&#160;    VmaSuballocationType allocType,</div>
-<div class="line"><a name="l10705"></a><span class="lineno">10705</span>&#160;    <span class="keywordtype">bool</span> canMakeOtherLost,</div>
-<div class="line"><a name="l10706"></a><span class="lineno">10706</span>&#160;    uint32_t strategy,</div>
-<div class="line"><a name="l10707"></a><span class="lineno">10707</span>&#160;    VmaAllocationRequest* pAllocationRequest)</div>
-<div class="line"><a name="l10708"></a><span class="lineno">10708</span>&#160;{</div>
-<div class="line"><a name="l10709"></a><span class="lineno">10709</span>&#160;    VMA_ASSERT(allocSize &gt; 0);</div>
-<div class="line"><a name="l10710"></a><span class="lineno">10710</span>&#160;    VMA_ASSERT(allocType != VMA_SUBALLOCATION_TYPE_FREE);</div>
-<div class="line"><a name="l10711"></a><span class="lineno">10711</span>&#160;    VMA_ASSERT(pAllocationRequest != VMA_NULL);</div>
-<div class="line"><a name="l10712"></a><span class="lineno">10712</span>&#160;    VMA_HEAVY_ASSERT(Validate());</div>
-<div class="line"><a name="l10713"></a><span class="lineno">10713</span>&#160;    <span class="keywordflow">return</span> upperAddress ?</div>
-<div class="line"><a name="l10714"></a><span class="lineno">10714</span>&#160;        CreateAllocationRequest_UpperAddress(</div>
-<div class="line"><a name="l10715"></a><span class="lineno">10715</span>&#160;            currentFrameIndex, frameInUseCount, bufferImageGranularity,</div>
-<div class="line"><a name="l10716"></a><span class="lineno">10716</span>&#160;            allocSize, allocAlignment, allocType, canMakeOtherLost, strategy, pAllocationRequest) :</div>
-<div class="line"><a name="l10717"></a><span class="lineno">10717</span>&#160;        CreateAllocationRequest_LowerAddress(</div>
-<div class="line"><a name="l10718"></a><span class="lineno">10718</span>&#160;            currentFrameIndex, frameInUseCount, bufferImageGranularity,</div>
-<div class="line"><a name="l10719"></a><span class="lineno">10719</span>&#160;            allocSize, allocAlignment, allocType, canMakeOtherLost, strategy, pAllocationRequest);</div>
-<div class="line"><a name="l10720"></a><span class="lineno">10720</span>&#160;}</div>
-<div class="line"><a name="l10721"></a><span class="lineno">10721</span>&#160; </div>
-<div class="line"><a name="l10722"></a><span class="lineno">10722</span>&#160;<span class="keywordtype">bool</span> VmaBlockMetadata_Linear::CreateAllocationRequest_UpperAddress(</div>
-<div class="line"><a name="l10723"></a><span class="lineno">10723</span>&#160;    uint32_t currentFrameIndex,</div>
-<div class="line"><a name="l10724"></a><span class="lineno">10724</span>&#160;    uint32_t frameInUseCount,</div>
-<div class="line"><a name="l10725"></a><span class="lineno">10725</span>&#160;    VkDeviceSize bufferImageGranularity,</div>
-<div class="line"><a name="l10726"></a><span class="lineno">10726</span>&#160;    VkDeviceSize allocSize,</div>
-<div class="line"><a name="l10727"></a><span class="lineno">10727</span>&#160;    VkDeviceSize allocAlignment,</div>
-<div class="line"><a name="l10728"></a><span class="lineno">10728</span>&#160;    VmaSuballocationType allocType,</div>
-<div class="line"><a name="l10729"></a><span class="lineno">10729</span>&#160;    <span class="keywordtype">bool</span> canMakeOtherLost,</div>
-<div class="line"><a name="l10730"></a><span class="lineno">10730</span>&#160;    uint32_t strategy,</div>
-<div class="line"><a name="l10731"></a><span class="lineno">10731</span>&#160;    VmaAllocationRequest* pAllocationRequest)</div>
-<div class="line"><a name="l10732"></a><span class="lineno">10732</span>&#160;{</div>
-<div class="line"><a name="l10733"></a><span class="lineno">10733</span>&#160;    <span class="keyword">const</span> VkDeviceSize size = GetSize();</div>
-<div class="line"><a name="l10734"></a><span class="lineno">10734</span>&#160;    SuballocationVectorType&amp; suballocations1st = AccessSuballocations1st();</div>
-<div class="line"><a name="l10735"></a><span class="lineno">10735</span>&#160;    SuballocationVectorType&amp; suballocations2nd = AccessSuballocations2nd();</div>
+<div class="line"><a name="l10636"></a><span class="lineno">10636</span>&#160;                ++outInfo.<a class="code" href="struct_vma_stat_info.html#ae06129c771bfebfd6468a7f4276502a9">unusedRangeCount</a>;</div>
+<div class="line"><a name="l10637"></a><span class="lineno">10637</span>&#160;                outInfo.<a class="code" href="struct_vma_stat_info.html#a1859d290aca2cd582d8dc25922092669">unusedBytes</a> += unusedRangeSize;</div>
+<div class="line"><a name="l10638"></a><span class="lineno">10638</span>&#160;                outInfo.<a class="code" href="struct_vma_stat_info.html#aedeba931324f16589cd2416c0d2dd0d4">unusedRangeSizeMin</a> = VMA_MIN(outInfo.<a class="code" href="struct_vma_stat_info.html#aedeba931324f16589cd2416c0d2dd0d4">unusedRangeSizeMin</a>, unusedRangeSize);</div>
+<div class="line"><a name="l10639"></a><span class="lineno">10639</span>&#160;                outInfo.<a class="code" href="struct_vma_stat_info.html#a5ba1a2476c4d39b10f7e2f7ebbb72ac4">unusedRangeSizeMax</a> = VMA_MIN(outInfo.<a class="code" href="struct_vma_stat_info.html#a5ba1a2476c4d39b10f7e2f7ebbb72ac4">unusedRangeSizeMax</a>, unusedRangeSize);</div>
+<div class="line"><a name="l10640"></a><span class="lineno">10640</span>&#160;           }</div>
+<div class="line"><a name="l10641"></a><span class="lineno">10641</span>&#160; </div>
+<div class="line"><a name="l10642"></a><span class="lineno">10642</span>&#160;            <span class="comment">// End of loop.</span></div>
+<div class="line"><a name="l10643"></a><span class="lineno">10643</span>&#160;            lastOffset = freeSpace1stTo2ndEnd;</div>
+<div class="line"><a name="l10644"></a><span class="lineno">10644</span>&#160;        }</div>
+<div class="line"><a name="l10645"></a><span class="lineno">10645</span>&#160;    }</div>
+<div class="line"><a name="l10646"></a><span class="lineno">10646</span>&#160; </div>
+<div class="line"><a name="l10647"></a><span class="lineno">10647</span>&#160;    <span class="keywordflow">if</span>(m_2ndVectorMode == SECOND_VECTOR_DOUBLE_STACK)</div>
+<div class="line"><a name="l10648"></a><span class="lineno">10648</span>&#160;    {</div>
+<div class="line"><a name="l10649"></a><span class="lineno">10649</span>&#160;        <span class="keywordtype">size_t</span> nextAlloc2ndIndex = suballocations2nd.size() - 1;</div>
+<div class="line"><a name="l10650"></a><span class="lineno">10650</span>&#160;        <span class="keywordflow">while</span>(lastOffset &lt; size)</div>
+<div class="line"><a name="l10651"></a><span class="lineno">10651</span>&#160;        {</div>
+<div class="line"><a name="l10652"></a><span class="lineno">10652</span>&#160;            <span class="comment">// Find next non-null allocation or move nextAllocIndex to the end.</span></div>
+<div class="line"><a name="l10653"></a><span class="lineno">10653</span>&#160;            <span class="keywordflow">while</span>(nextAlloc2ndIndex != SIZE_MAX &amp;&amp;</div>
+<div class="line"><a name="l10654"></a><span class="lineno">10654</span>&#160;                suballocations2nd[nextAlloc2ndIndex].hAllocation == VK_NULL_HANDLE)</div>
+<div class="line"><a name="l10655"></a><span class="lineno">10655</span>&#160;            {</div>
+<div class="line"><a name="l10656"></a><span class="lineno">10656</span>&#160;                --nextAlloc2ndIndex;</div>
+<div class="line"><a name="l10657"></a><span class="lineno">10657</span>&#160;            }</div>
+<div class="line"><a name="l10658"></a><span class="lineno">10658</span>&#160; </div>
+<div class="line"><a name="l10659"></a><span class="lineno">10659</span>&#160;            <span class="comment">// Found non-null allocation.</span></div>
+<div class="line"><a name="l10660"></a><span class="lineno">10660</span>&#160;            <span class="keywordflow">if</span>(nextAlloc2ndIndex != SIZE_MAX)</div>
+<div class="line"><a name="l10661"></a><span class="lineno">10661</span>&#160;            {</div>
+<div class="line"><a name="l10662"></a><span class="lineno">10662</span>&#160;                <span class="keyword">const</span> VmaSuballocation&amp; suballoc = suballocations2nd[nextAlloc2ndIndex];</div>
+<div class="line"><a name="l10663"></a><span class="lineno">10663</span>&#160; </div>
+<div class="line"><a name="l10664"></a><span class="lineno">10664</span>&#160;                <span class="comment">// 1. Process free space before this allocation.</span></div>
+<div class="line"><a name="l10665"></a><span class="lineno">10665</span>&#160;                <span class="keywordflow">if</span>(lastOffset &lt; suballoc.offset)</div>
+<div class="line"><a name="l10666"></a><span class="lineno">10666</span>&#160;                {</div>
+<div class="line"><a name="l10667"></a><span class="lineno">10667</span>&#160;                    <span class="comment">// There is free space from lastOffset to suballoc.offset.</span></div>
+<div class="line"><a name="l10668"></a><span class="lineno">10668</span>&#160;                    <span class="keyword">const</span> VkDeviceSize unusedRangeSize = suballoc.offset - lastOffset;</div>
+<div class="line"><a name="l10669"></a><span class="lineno">10669</span>&#160;                    ++outInfo.<a class="code" href="struct_vma_stat_info.html#ae06129c771bfebfd6468a7f4276502a9">unusedRangeCount</a>;</div>
+<div class="line"><a name="l10670"></a><span class="lineno">10670</span>&#160;                    outInfo.<a class="code" href="struct_vma_stat_info.html#a1859d290aca2cd582d8dc25922092669">unusedBytes</a> += unusedRangeSize;</div>
+<div class="line"><a name="l10671"></a><span class="lineno">10671</span>&#160;                    outInfo.<a class="code" href="struct_vma_stat_info.html#aedeba931324f16589cd2416c0d2dd0d4">unusedRangeSizeMin</a> = VMA_MIN(outInfo.<a class="code" href="struct_vma_stat_info.html#aedeba931324f16589cd2416c0d2dd0d4">unusedRangeSizeMin</a>, unusedRangeSize);</div>
+<div class="line"><a name="l10672"></a><span class="lineno">10672</span>&#160;                    outInfo.<a class="code" href="struct_vma_stat_info.html#a5ba1a2476c4d39b10f7e2f7ebbb72ac4">unusedRangeSizeMax</a> = VMA_MIN(outInfo.<a class="code" href="struct_vma_stat_info.html#a5ba1a2476c4d39b10f7e2f7ebbb72ac4">unusedRangeSizeMax</a>, unusedRangeSize);</div>
+<div class="line"><a name="l10673"></a><span class="lineno">10673</span>&#160;                }</div>
+<div class="line"><a name="l10674"></a><span class="lineno">10674</span>&#160; </div>
+<div class="line"><a name="l10675"></a><span class="lineno">10675</span>&#160;                <span class="comment">// 2. Process this allocation.</span></div>
+<div class="line"><a name="l10676"></a><span class="lineno">10676</span>&#160;                <span class="comment">// There is allocation with suballoc.offset, suballoc.size.</span></div>
+<div class="line"><a name="l10677"></a><span class="lineno">10677</span>&#160;                outInfo.<a class="code" href="struct_vma_stat_info.html#ab0c6c73837e5a70c749fbd4f6064895a">usedBytes</a> += suballoc.size;</div>
+<div class="line"><a name="l10678"></a><span class="lineno">10678</span>&#160;                outInfo.<a class="code" href="struct_vma_stat_info.html#ade8b40bd3139c04aabd2fc538a356fea">allocationSizeMin</a> = VMA_MIN(outInfo.<a class="code" href="struct_vma_stat_info.html#ade8b40bd3139c04aabd2fc538a356fea">allocationSizeMin</a>, suballoc.size);</div>
+<div class="line"><a name="l10679"></a><span class="lineno">10679</span>&#160;                outInfo.<a class="code" href="struct_vma_stat_info.html#a17e9733a5ecd76287d4db6e66f71f50c">allocationSizeMax</a> = VMA_MIN(outInfo.<a class="code" href="struct_vma_stat_info.html#a17e9733a5ecd76287d4db6e66f71f50c">allocationSizeMax</a>, suballoc.size);</div>
+<div class="line"><a name="l10680"></a><span class="lineno">10680</span>&#160; </div>
+<div class="line"><a name="l10681"></a><span class="lineno">10681</span>&#160;                <span class="comment">// 3. Prepare for next iteration.</span></div>
+<div class="line"><a name="l10682"></a><span class="lineno">10682</span>&#160;                lastOffset = suballoc.offset + suballoc.size;</div>
+<div class="line"><a name="l10683"></a><span class="lineno">10683</span>&#160;                --nextAlloc2ndIndex;</div>
+<div class="line"><a name="l10684"></a><span class="lineno">10684</span>&#160;            }</div>
+<div class="line"><a name="l10685"></a><span class="lineno">10685</span>&#160;            <span class="comment">// We are at the end.</span></div>
+<div class="line"><a name="l10686"></a><span class="lineno">10686</span>&#160;            <span class="keywordflow">else</span></div>
+<div class="line"><a name="l10687"></a><span class="lineno">10687</span>&#160;            {</div>
+<div class="line"><a name="l10688"></a><span class="lineno">10688</span>&#160;                <span class="comment">// There is free space from lastOffset to size.</span></div>
+<div class="line"><a name="l10689"></a><span class="lineno">10689</span>&#160;                <span class="keywordflow">if</span>(lastOffset &lt; size)</div>
+<div class="line"><a name="l10690"></a><span class="lineno">10690</span>&#160;                {</div>
+<div class="line"><a name="l10691"></a><span class="lineno">10691</span>&#160;                    <span class="keyword">const</span> VkDeviceSize unusedRangeSize = size - lastOffset;</div>
+<div class="line"><a name="l10692"></a><span class="lineno">10692</span>&#160;                    ++outInfo.<a class="code" href="struct_vma_stat_info.html#ae06129c771bfebfd6468a7f4276502a9">unusedRangeCount</a>;</div>
+<div class="line"><a name="l10693"></a><span class="lineno">10693</span>&#160;                    outInfo.<a class="code" href="struct_vma_stat_info.html#a1859d290aca2cd582d8dc25922092669">unusedBytes</a> += unusedRangeSize;</div>
+<div class="line"><a name="l10694"></a><span class="lineno">10694</span>&#160;                    outInfo.<a class="code" href="struct_vma_stat_info.html#aedeba931324f16589cd2416c0d2dd0d4">unusedRangeSizeMin</a> = VMA_MIN(outInfo.<a class="code" href="struct_vma_stat_info.html#aedeba931324f16589cd2416c0d2dd0d4">unusedRangeSizeMin</a>, unusedRangeSize);</div>
+<div class="line"><a name="l10695"></a><span class="lineno">10695</span>&#160;                    outInfo.<a class="code" href="struct_vma_stat_info.html#a5ba1a2476c4d39b10f7e2f7ebbb72ac4">unusedRangeSizeMax</a> = VMA_MIN(outInfo.<a class="code" href="struct_vma_stat_info.html#a5ba1a2476c4d39b10f7e2f7ebbb72ac4">unusedRangeSizeMax</a>, unusedRangeSize);</div>
+<div class="line"><a name="l10696"></a><span class="lineno">10696</span>&#160;               }</div>
+<div class="line"><a name="l10697"></a><span class="lineno">10697</span>&#160; </div>
+<div class="line"><a name="l10698"></a><span class="lineno">10698</span>&#160;                <span class="comment">// End of loop.</span></div>
+<div class="line"><a name="l10699"></a><span class="lineno">10699</span>&#160;                lastOffset = size;</div>
+<div class="line"><a name="l10700"></a><span class="lineno">10700</span>&#160;            }</div>
+<div class="line"><a name="l10701"></a><span class="lineno">10701</span>&#160;        }</div>
+<div class="line"><a name="l10702"></a><span class="lineno">10702</span>&#160;    }</div>
+<div class="line"><a name="l10703"></a><span class="lineno">10703</span>&#160; </div>
+<div class="line"><a name="l10704"></a><span class="lineno">10704</span>&#160;    outInfo.<a class="code" href="struct_vma_stat_info.html#a1859d290aca2cd582d8dc25922092669">unusedBytes</a> = size - outInfo.<a class="code" href="struct_vma_stat_info.html#ab0c6c73837e5a70c749fbd4f6064895a">usedBytes</a>;</div>
+<div class="line"><a name="l10705"></a><span class="lineno">10705</span>&#160;}</div>
+<div class="line"><a name="l10706"></a><span class="lineno">10706</span>&#160; </div>
+<div class="line"><a name="l10707"></a><span class="lineno">10707</span>&#160;<span class="keywordtype">void</span> VmaBlockMetadata_Linear::AddPoolStats(<a class="code" href="struct_vma_pool_stats.html">VmaPoolStats</a>&amp; inoutStats)<span class="keyword"> const</span></div>
+<div class="line"><a name="l10708"></a><span class="lineno">10708</span>&#160;<span class="keyword"></span>{</div>
+<div class="line"><a name="l10709"></a><span class="lineno">10709</span>&#160;    <span class="keyword">const</span> SuballocationVectorType&amp; suballocations1st = AccessSuballocations1st();</div>
+<div class="line"><a name="l10710"></a><span class="lineno">10710</span>&#160;    <span class="keyword">const</span> SuballocationVectorType&amp; suballocations2nd = AccessSuballocations2nd();</div>
+<div class="line"><a name="l10711"></a><span class="lineno">10711</span>&#160;    <span class="keyword">const</span> VkDeviceSize size = GetSize();</div>
+<div class="line"><a name="l10712"></a><span class="lineno">10712</span>&#160;    <span class="keyword">const</span> <span class="keywordtype">size_t</span> suballoc1stCount = suballocations1st.size();</div>
+<div class="line"><a name="l10713"></a><span class="lineno">10713</span>&#160;    <span class="keyword">const</span> <span class="keywordtype">size_t</span> suballoc2ndCount = suballocations2nd.size();</div>
+<div class="line"><a name="l10714"></a><span class="lineno">10714</span>&#160; </div>
+<div class="line"><a name="l10715"></a><span class="lineno">10715</span>&#160;    inoutStats.<a class="code" href="struct_vma_pool_stats.html#a326807b2de2b0931cee4ed9a5f2e420c">size</a> += size;</div>
+<div class="line"><a name="l10716"></a><span class="lineno">10716</span>&#160; </div>
+<div class="line"><a name="l10717"></a><span class="lineno">10717</span>&#160;    VkDeviceSize lastOffset = 0;</div>
+<div class="line"><a name="l10718"></a><span class="lineno">10718</span>&#160; </div>
+<div class="line"><a name="l10719"></a><span class="lineno">10719</span>&#160;    <span class="keywordflow">if</span>(m_2ndVectorMode == SECOND_VECTOR_RING_BUFFER)</div>
+<div class="line"><a name="l10720"></a><span class="lineno">10720</span>&#160;    {</div>
+<div class="line"><a name="l10721"></a><span class="lineno">10721</span>&#160;        <span class="keyword">const</span> VkDeviceSize freeSpace2ndTo1stEnd = suballocations1st[m_1stNullItemsBeginCount].offset;</div>
+<div class="line"><a name="l10722"></a><span class="lineno">10722</span>&#160;        <span class="keywordtype">size_t</span> nextAlloc2ndIndex = m_1stNullItemsBeginCount;</div>
+<div class="line"><a name="l10723"></a><span class="lineno">10723</span>&#160;        <span class="keywordflow">while</span>(lastOffset &lt; freeSpace2ndTo1stEnd)</div>
+<div class="line"><a name="l10724"></a><span class="lineno">10724</span>&#160;        {</div>
+<div class="line"><a name="l10725"></a><span class="lineno">10725</span>&#160;            <span class="comment">// Find next non-null allocation or move nextAlloc2ndIndex to the end.</span></div>
+<div class="line"><a name="l10726"></a><span class="lineno">10726</span>&#160;            <span class="keywordflow">while</span>(nextAlloc2ndIndex &lt; suballoc2ndCount &amp;&amp;</div>
+<div class="line"><a name="l10727"></a><span class="lineno">10727</span>&#160;                suballocations2nd[nextAlloc2ndIndex].hAllocation == VK_NULL_HANDLE)</div>
+<div class="line"><a name="l10728"></a><span class="lineno">10728</span>&#160;            {</div>
+<div class="line"><a name="l10729"></a><span class="lineno">10729</span>&#160;                ++nextAlloc2ndIndex;</div>
+<div class="line"><a name="l10730"></a><span class="lineno">10730</span>&#160;            }</div>
+<div class="line"><a name="l10731"></a><span class="lineno">10731</span>&#160; </div>
+<div class="line"><a name="l10732"></a><span class="lineno">10732</span>&#160;            <span class="comment">// Found non-null allocation.</span></div>
+<div class="line"><a name="l10733"></a><span class="lineno">10733</span>&#160;            <span class="keywordflow">if</span>(nextAlloc2ndIndex &lt; suballoc2ndCount)</div>
+<div class="line"><a name="l10734"></a><span class="lineno">10734</span>&#160;            {</div>
+<div class="line"><a name="l10735"></a><span class="lineno">10735</span>&#160;                <span class="keyword">const</span> VmaSuballocation&amp; suballoc = suballocations2nd[nextAlloc2ndIndex];</div>
 <div class="line"><a name="l10736"></a><span class="lineno">10736</span>&#160; </div>
-<div class="line"><a name="l10737"></a><span class="lineno">10737</span>&#160;    <span class="keywordflow">if</span>(m_2ndVectorMode == SECOND_VECTOR_RING_BUFFER)</div>
-<div class="line"><a name="l10738"></a><span class="lineno">10738</span>&#160;    {</div>
-<div class="line"><a name="l10739"></a><span class="lineno">10739</span>&#160;        VMA_ASSERT(0 &amp;&amp; <span class="stringliteral">&quot;Trying to use pool with linear algorithm as double stack, while it is already being used as ring buffer.&quot;</span>);</div>
-<div class="line"><a name="l10740"></a><span class="lineno">10740</span>&#160;        <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
-<div class="line"><a name="l10741"></a><span class="lineno">10741</span>&#160;    }</div>
-<div class="line"><a name="l10742"></a><span class="lineno">10742</span>&#160; </div>
-<div class="line"><a name="l10743"></a><span class="lineno">10743</span>&#160;    <span class="comment">// Try to allocate before 2nd.back(), or end of block if 2nd.empty().</span></div>
-<div class="line"><a name="l10744"></a><span class="lineno">10744</span>&#160;    <span class="keywordflow">if</span>(allocSize &gt; size)</div>
-<div class="line"><a name="l10745"></a><span class="lineno">10745</span>&#160;    {</div>
-<div class="line"><a name="l10746"></a><span class="lineno">10746</span>&#160;        <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
-<div class="line"><a name="l10747"></a><span class="lineno">10747</span>&#160;    }</div>
-<div class="line"><a name="l10748"></a><span class="lineno">10748</span>&#160;    VkDeviceSize resultBaseOffset = size - allocSize;</div>
-<div class="line"><a name="l10749"></a><span class="lineno">10749</span>&#160;    <span class="keywordflow">if</span>(!suballocations2nd.empty())</div>
-<div class="line"><a name="l10750"></a><span class="lineno">10750</span>&#160;    {</div>
-<div class="line"><a name="l10751"></a><span class="lineno">10751</span>&#160;        <span class="keyword">const</span> VmaSuballocation&amp; lastSuballoc = suballocations2nd.back();</div>
-<div class="line"><a name="l10752"></a><span class="lineno">10752</span>&#160;        resultBaseOffset = lastSuballoc.offset - allocSize;</div>
-<div class="line"><a name="l10753"></a><span class="lineno">10753</span>&#160;        <span class="keywordflow">if</span>(allocSize &gt; lastSuballoc.offset)</div>
-<div class="line"><a name="l10754"></a><span class="lineno">10754</span>&#160;        {</div>
-<div class="line"><a name="l10755"></a><span class="lineno">10755</span>&#160;            <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
-<div class="line"><a name="l10756"></a><span class="lineno">10756</span>&#160;        }</div>
-<div class="line"><a name="l10757"></a><span class="lineno">10757</span>&#160;    }</div>
-<div class="line"><a name="l10758"></a><span class="lineno">10758</span>&#160; </div>
-<div class="line"><a name="l10759"></a><span class="lineno">10759</span>&#160;    <span class="comment">// Start from offset equal to end of free space.</span></div>
-<div class="line"><a name="l10760"></a><span class="lineno">10760</span>&#160;    VkDeviceSize resultOffset = resultBaseOffset;</div>
-<div class="line"><a name="l10761"></a><span class="lineno">10761</span>&#160; </div>
-<div class="line"><a name="l10762"></a><span class="lineno">10762</span>&#160;    <span class="comment">// Apply VMA_DEBUG_MARGIN at the end.</span></div>
-<div class="line"><a name="l10763"></a><span class="lineno">10763</span>&#160;    <span class="keywordflow">if</span>(VMA_DEBUG_MARGIN &gt; 0)</div>
-<div class="line"><a name="l10764"></a><span class="lineno">10764</span>&#160;    {</div>
-<div class="line"><a name="l10765"></a><span class="lineno">10765</span>&#160;        <span class="keywordflow">if</span>(resultOffset &lt; VMA_DEBUG_MARGIN)</div>
-<div class="line"><a name="l10766"></a><span class="lineno">10766</span>&#160;        {</div>
-<div class="line"><a name="l10767"></a><span class="lineno">10767</span>&#160;            <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
-<div class="line"><a name="l10768"></a><span class="lineno">10768</span>&#160;        }</div>
-<div class="line"><a name="l10769"></a><span class="lineno">10769</span>&#160;        resultOffset -= VMA_DEBUG_MARGIN;</div>
-<div class="line"><a name="l10770"></a><span class="lineno">10770</span>&#160;    }</div>
-<div class="line"><a name="l10771"></a><span class="lineno">10771</span>&#160; </div>
-<div class="line"><a name="l10772"></a><span class="lineno">10772</span>&#160;    <span class="comment">// Apply alignment.</span></div>
-<div class="line"><a name="l10773"></a><span class="lineno">10773</span>&#160;    resultOffset = VmaAlignDown(resultOffset, allocAlignment);</div>
-<div class="line"><a name="l10774"></a><span class="lineno">10774</span>&#160; </div>
-<div class="line"><a name="l10775"></a><span class="lineno">10775</span>&#160;    <span class="comment">// Check next suballocations from 2nd for BufferImageGranularity conflicts.</span></div>
-<div class="line"><a name="l10776"></a><span class="lineno">10776</span>&#160;    <span class="comment">// Make bigger alignment if necessary.</span></div>
-<div class="line"><a name="l10777"></a><span class="lineno">10777</span>&#160;    <span class="keywordflow">if</span>(bufferImageGranularity &gt; 1 &amp;&amp; !suballocations2nd.empty())</div>
-<div class="line"><a name="l10778"></a><span class="lineno">10778</span>&#160;    {</div>
-<div class="line"><a name="l10779"></a><span class="lineno">10779</span>&#160;        <span class="keywordtype">bool</span> bufferImageGranularityConflict = <span class="keyword">false</span>;</div>
-<div class="line"><a name="l10780"></a><span class="lineno">10780</span>&#160;        <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> nextSuballocIndex = suballocations2nd.size(); nextSuballocIndex--; )</div>
+<div class="line"><a name="l10737"></a><span class="lineno">10737</span>&#160;                <span class="comment">// 1. Process free space before this allocation.</span></div>
+<div class="line"><a name="l10738"></a><span class="lineno">10738</span>&#160;                <span class="keywordflow">if</span>(lastOffset &lt; suballoc.offset)</div>
+<div class="line"><a name="l10739"></a><span class="lineno">10739</span>&#160;                {</div>
+<div class="line"><a name="l10740"></a><span class="lineno">10740</span>&#160;                    <span class="comment">// There is free space from lastOffset to suballoc.offset.</span></div>
+<div class="line"><a name="l10741"></a><span class="lineno">10741</span>&#160;                    <span class="keyword">const</span> VkDeviceSize unusedRangeSize = suballoc.offset - lastOffset;</div>
+<div class="line"><a name="l10742"></a><span class="lineno">10742</span>&#160;                    inoutStats.<a class="code" href="struct_vma_pool_stats.html#ad7c54874724fce7b06aba526202d82a8">unusedSize</a> += unusedRangeSize;</div>
+<div class="line"><a name="l10743"></a><span class="lineno">10743</span>&#160;                    ++inoutStats.<a class="code" href="struct_vma_pool_stats.html#ae4f3546ffa4d1e598b64d8e6134854f4">unusedRangeCount</a>;</div>
+<div class="line"><a name="l10744"></a><span class="lineno">10744</span>&#160;                    inoutStats.<a class="code" href="struct_vma_pool_stats.html#ab4c8f52dd42ab01998f60f0b6acc722b">unusedRangeSizeMax</a> = VMA_MAX(inoutStats.<a class="code" href="struct_vma_pool_stats.html#ab4c8f52dd42ab01998f60f0b6acc722b">unusedRangeSizeMax</a>, unusedRangeSize);</div>
+<div class="line"><a name="l10745"></a><span class="lineno">10745</span>&#160;                }</div>
+<div class="line"><a name="l10746"></a><span class="lineno">10746</span>&#160; </div>
+<div class="line"><a name="l10747"></a><span class="lineno">10747</span>&#160;                <span class="comment">// 2. Process this allocation.</span></div>
+<div class="line"><a name="l10748"></a><span class="lineno">10748</span>&#160;                <span class="comment">// There is allocation with suballoc.offset, suballoc.size.</span></div>
+<div class="line"><a name="l10749"></a><span class="lineno">10749</span>&#160;                ++inoutStats.<a class="code" href="struct_vma_pool_stats.html#ad1924eb54fffa45e9e0e65670c8fe5eb">allocationCount</a>;</div>
+<div class="line"><a name="l10750"></a><span class="lineno">10750</span>&#160; </div>
+<div class="line"><a name="l10751"></a><span class="lineno">10751</span>&#160;                <span class="comment">// 3. Prepare for next iteration.</span></div>
+<div class="line"><a name="l10752"></a><span class="lineno">10752</span>&#160;                lastOffset = suballoc.offset + suballoc.size;</div>
+<div class="line"><a name="l10753"></a><span class="lineno">10753</span>&#160;                ++nextAlloc2ndIndex;</div>
+<div class="line"><a name="l10754"></a><span class="lineno">10754</span>&#160;            }</div>
+<div class="line"><a name="l10755"></a><span class="lineno">10755</span>&#160;            <span class="comment">// We are at the end.</span></div>
+<div class="line"><a name="l10756"></a><span class="lineno">10756</span>&#160;            <span class="keywordflow">else</span></div>
+<div class="line"><a name="l10757"></a><span class="lineno">10757</span>&#160;            {</div>
+<div class="line"><a name="l10758"></a><span class="lineno">10758</span>&#160;                <span class="keywordflow">if</span>(lastOffset &lt; freeSpace2ndTo1stEnd)</div>
+<div class="line"><a name="l10759"></a><span class="lineno">10759</span>&#160;                {</div>
+<div class="line"><a name="l10760"></a><span class="lineno">10760</span>&#160;                    <span class="comment">// There is free space from lastOffset to freeSpace2ndTo1stEnd.</span></div>
+<div class="line"><a name="l10761"></a><span class="lineno">10761</span>&#160;                    <span class="keyword">const</span> VkDeviceSize unusedRangeSize = freeSpace2ndTo1stEnd - lastOffset;</div>
+<div class="line"><a name="l10762"></a><span class="lineno">10762</span>&#160;                    inoutStats.<a class="code" href="struct_vma_pool_stats.html#ad7c54874724fce7b06aba526202d82a8">unusedSize</a> += unusedRangeSize;</div>
+<div class="line"><a name="l10763"></a><span class="lineno">10763</span>&#160;                    ++inoutStats.<a class="code" href="struct_vma_pool_stats.html#ae4f3546ffa4d1e598b64d8e6134854f4">unusedRangeCount</a>;</div>
+<div class="line"><a name="l10764"></a><span class="lineno">10764</span>&#160;                    inoutStats.<a class="code" href="struct_vma_pool_stats.html#ab4c8f52dd42ab01998f60f0b6acc722b">unusedRangeSizeMax</a> = VMA_MAX(inoutStats.<a class="code" href="struct_vma_pool_stats.html#ab4c8f52dd42ab01998f60f0b6acc722b">unusedRangeSizeMax</a>, unusedRangeSize);</div>
+<div class="line"><a name="l10765"></a><span class="lineno">10765</span>&#160;                }</div>
+<div class="line"><a name="l10766"></a><span class="lineno">10766</span>&#160; </div>
+<div class="line"><a name="l10767"></a><span class="lineno">10767</span>&#160;                <span class="comment">// End of loop.</span></div>
+<div class="line"><a name="l10768"></a><span class="lineno">10768</span>&#160;                lastOffset = freeSpace2ndTo1stEnd;</div>
+<div class="line"><a name="l10769"></a><span class="lineno">10769</span>&#160;            }</div>
+<div class="line"><a name="l10770"></a><span class="lineno">10770</span>&#160;        }</div>
+<div class="line"><a name="l10771"></a><span class="lineno">10771</span>&#160;    }</div>
+<div class="line"><a name="l10772"></a><span class="lineno">10772</span>&#160; </div>
+<div class="line"><a name="l10773"></a><span class="lineno">10773</span>&#160;    <span class="keywordtype">size_t</span> nextAlloc1stIndex = m_1stNullItemsBeginCount;</div>
+<div class="line"><a name="l10774"></a><span class="lineno">10774</span>&#160;    <span class="keyword">const</span> VkDeviceSize freeSpace1stTo2ndEnd =</div>
+<div class="line"><a name="l10775"></a><span class="lineno">10775</span>&#160;        m_2ndVectorMode == SECOND_VECTOR_DOUBLE_STACK ? suballocations2nd.back().offset : size;</div>
+<div class="line"><a name="l10776"></a><span class="lineno">10776</span>&#160;    <span class="keywordflow">while</span>(lastOffset &lt; freeSpace1stTo2ndEnd)</div>
+<div class="line"><a name="l10777"></a><span class="lineno">10777</span>&#160;    {</div>
+<div class="line"><a name="l10778"></a><span class="lineno">10778</span>&#160;        <span class="comment">// Find next non-null allocation or move nextAllocIndex to the end.</span></div>
+<div class="line"><a name="l10779"></a><span class="lineno">10779</span>&#160;        <span class="keywordflow">while</span>(nextAlloc1stIndex &lt; suballoc1stCount &amp;&amp;</div>
+<div class="line"><a name="l10780"></a><span class="lineno">10780</span>&#160;            suballocations1st[nextAlloc1stIndex].hAllocation == VK_NULL_HANDLE)</div>
 <div class="line"><a name="l10781"></a><span class="lineno">10781</span>&#160;        {</div>
-<div class="line"><a name="l10782"></a><span class="lineno">10782</span>&#160;            <span class="keyword">const</span> VmaSuballocation&amp; nextSuballoc = suballocations2nd[nextSuballocIndex];</div>
-<div class="line"><a name="l10783"></a><span class="lineno">10783</span>&#160;            <span class="keywordflow">if</span>(VmaBlocksOnSamePage(resultOffset, allocSize, nextSuballoc.offset, bufferImageGranularity))</div>
-<div class="line"><a name="l10784"></a><span class="lineno">10784</span>&#160;            {</div>
-<div class="line"><a name="l10785"></a><span class="lineno">10785</span>&#160;                <span class="keywordflow">if</span>(VmaIsBufferImageGranularityConflict(nextSuballoc.type, allocType))</div>
-<div class="line"><a name="l10786"></a><span class="lineno">10786</span>&#160;                {</div>
-<div class="line"><a name="l10787"></a><span class="lineno">10787</span>&#160;                    bufferImageGranularityConflict = <span class="keyword">true</span>;</div>
-<div class="line"><a name="l10788"></a><span class="lineno">10788</span>&#160;                    <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l10789"></a><span class="lineno">10789</span>&#160;                }</div>
-<div class="line"><a name="l10790"></a><span class="lineno">10790</span>&#160;            }</div>
-<div class="line"><a name="l10791"></a><span class="lineno">10791</span>&#160;            <span class="keywordflow">else</span></div>
-<div class="line"><a name="l10792"></a><span class="lineno">10792</span>&#160;                <span class="comment">// Already on previous page.</span></div>
-<div class="line"><a name="l10793"></a><span class="lineno">10793</span>&#160;                <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l10794"></a><span class="lineno">10794</span>&#160;        }</div>
-<div class="line"><a name="l10795"></a><span class="lineno">10795</span>&#160;        <span class="keywordflow">if</span>(bufferImageGranularityConflict)</div>
-<div class="line"><a name="l10796"></a><span class="lineno">10796</span>&#160;        {</div>
-<div class="line"><a name="l10797"></a><span class="lineno">10797</span>&#160;            resultOffset = VmaAlignDown(resultOffset, bufferImageGranularity);</div>
-<div class="line"><a name="l10798"></a><span class="lineno">10798</span>&#160;        }</div>
-<div class="line"><a name="l10799"></a><span class="lineno">10799</span>&#160;    }</div>
-<div class="line"><a name="l10800"></a><span class="lineno">10800</span>&#160; </div>
-<div class="line"><a name="l10801"></a><span class="lineno">10801</span>&#160;    <span class="comment">// There is enough free space.</span></div>
-<div class="line"><a name="l10802"></a><span class="lineno">10802</span>&#160;    <span class="keyword">const</span> VkDeviceSize endOf1st = !suballocations1st.empty() ?</div>
-<div class="line"><a name="l10803"></a><span class="lineno">10803</span>&#160;        suballocations1st.back().offset + suballocations1st.back().size :</div>
-<div class="line"><a name="l10804"></a><span class="lineno">10804</span>&#160;        0;</div>
-<div class="line"><a name="l10805"></a><span class="lineno">10805</span>&#160;    <span class="keywordflow">if</span>(endOf1st + VMA_DEBUG_MARGIN &lt;= resultOffset)</div>
-<div class="line"><a name="l10806"></a><span class="lineno">10806</span>&#160;    {</div>
-<div class="line"><a name="l10807"></a><span class="lineno">10807</span>&#160;        <span class="comment">// Check previous suballocations for BufferImageGranularity conflicts.</span></div>
-<div class="line"><a name="l10808"></a><span class="lineno">10808</span>&#160;        <span class="comment">// If conflict exists, allocation cannot be made here.</span></div>
-<div class="line"><a name="l10809"></a><span class="lineno">10809</span>&#160;        <span class="keywordflow">if</span>(bufferImageGranularity &gt; 1)</div>
+<div class="line"><a name="l10782"></a><span class="lineno">10782</span>&#160;            ++nextAlloc1stIndex;</div>
+<div class="line"><a name="l10783"></a><span class="lineno">10783</span>&#160;        }</div>
+<div class="line"><a name="l10784"></a><span class="lineno">10784</span>&#160; </div>
+<div class="line"><a name="l10785"></a><span class="lineno">10785</span>&#160;        <span class="comment">// Found non-null allocation.</span></div>
+<div class="line"><a name="l10786"></a><span class="lineno">10786</span>&#160;        <span class="keywordflow">if</span>(nextAlloc1stIndex &lt; suballoc1stCount)</div>
+<div class="line"><a name="l10787"></a><span class="lineno">10787</span>&#160;        {</div>
+<div class="line"><a name="l10788"></a><span class="lineno">10788</span>&#160;            <span class="keyword">const</span> VmaSuballocation&amp; suballoc = suballocations1st[nextAlloc1stIndex];</div>
+<div class="line"><a name="l10789"></a><span class="lineno">10789</span>&#160; </div>
+<div class="line"><a name="l10790"></a><span class="lineno">10790</span>&#160;            <span class="comment">// 1. Process free space before this allocation.</span></div>
+<div class="line"><a name="l10791"></a><span class="lineno">10791</span>&#160;            <span class="keywordflow">if</span>(lastOffset &lt; suballoc.offset)</div>
+<div class="line"><a name="l10792"></a><span class="lineno">10792</span>&#160;            {</div>
+<div class="line"><a name="l10793"></a><span class="lineno">10793</span>&#160;                <span class="comment">// There is free space from lastOffset to suballoc.offset.</span></div>
+<div class="line"><a name="l10794"></a><span class="lineno">10794</span>&#160;                <span class="keyword">const</span> VkDeviceSize unusedRangeSize = suballoc.offset - lastOffset;</div>
+<div class="line"><a name="l10795"></a><span class="lineno">10795</span>&#160;                inoutStats.<a class="code" href="struct_vma_pool_stats.html#ad7c54874724fce7b06aba526202d82a8">unusedSize</a> += unusedRangeSize;</div>
+<div class="line"><a name="l10796"></a><span class="lineno">10796</span>&#160;                ++inoutStats.<a class="code" href="struct_vma_pool_stats.html#ae4f3546ffa4d1e598b64d8e6134854f4">unusedRangeCount</a>;</div>
+<div class="line"><a name="l10797"></a><span class="lineno">10797</span>&#160;                inoutStats.<a class="code" href="struct_vma_pool_stats.html#ab4c8f52dd42ab01998f60f0b6acc722b">unusedRangeSizeMax</a> = VMA_MAX(inoutStats.<a class="code" href="struct_vma_pool_stats.html#ab4c8f52dd42ab01998f60f0b6acc722b">unusedRangeSizeMax</a>, unusedRangeSize);</div>
+<div class="line"><a name="l10798"></a><span class="lineno">10798</span>&#160;            }</div>
+<div class="line"><a name="l10799"></a><span class="lineno">10799</span>&#160; </div>
+<div class="line"><a name="l10800"></a><span class="lineno">10800</span>&#160;            <span class="comment">// 2. Process this allocation.</span></div>
+<div class="line"><a name="l10801"></a><span class="lineno">10801</span>&#160;            <span class="comment">// There is allocation with suballoc.offset, suballoc.size.</span></div>
+<div class="line"><a name="l10802"></a><span class="lineno">10802</span>&#160;            ++inoutStats.<a class="code" href="struct_vma_pool_stats.html#ad1924eb54fffa45e9e0e65670c8fe5eb">allocationCount</a>;</div>
+<div class="line"><a name="l10803"></a><span class="lineno">10803</span>&#160; </div>
+<div class="line"><a name="l10804"></a><span class="lineno">10804</span>&#160;            <span class="comment">// 3. Prepare for next iteration.</span></div>
+<div class="line"><a name="l10805"></a><span class="lineno">10805</span>&#160;            lastOffset = suballoc.offset + suballoc.size;</div>
+<div class="line"><a name="l10806"></a><span class="lineno">10806</span>&#160;            ++nextAlloc1stIndex;</div>
+<div class="line"><a name="l10807"></a><span class="lineno">10807</span>&#160;        }</div>
+<div class="line"><a name="l10808"></a><span class="lineno">10808</span>&#160;        <span class="comment">// We are at the end.</span></div>
+<div class="line"><a name="l10809"></a><span class="lineno">10809</span>&#160;        <span class="keywordflow">else</span></div>
 <div class="line"><a name="l10810"></a><span class="lineno">10810</span>&#160;        {</div>
-<div class="line"><a name="l10811"></a><span class="lineno">10811</span>&#160;            <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> prevSuballocIndex = suballocations1st.size(); prevSuballocIndex--; )</div>
+<div class="line"><a name="l10811"></a><span class="lineno">10811</span>&#160;            <span class="keywordflow">if</span>(lastOffset &lt; freeSpace1stTo2ndEnd)</div>
 <div class="line"><a name="l10812"></a><span class="lineno">10812</span>&#160;            {</div>
-<div class="line"><a name="l10813"></a><span class="lineno">10813</span>&#160;                <span class="keyword">const</span> VmaSuballocation&amp; prevSuballoc = suballocations1st[prevSuballocIndex];</div>
-<div class="line"><a name="l10814"></a><span class="lineno">10814</span>&#160;                <span class="keywordflow">if</span>(VmaBlocksOnSamePage(prevSuballoc.offset, prevSuballoc.size, resultOffset, bufferImageGranularity))</div>
-<div class="line"><a name="l10815"></a><span class="lineno">10815</span>&#160;                {</div>
-<div class="line"><a name="l10816"></a><span class="lineno">10816</span>&#160;                    <span class="keywordflow">if</span>(VmaIsBufferImageGranularityConflict(allocType, prevSuballoc.type))</div>
-<div class="line"><a name="l10817"></a><span class="lineno">10817</span>&#160;                    {</div>
-<div class="line"><a name="l10818"></a><span class="lineno">10818</span>&#160;                        <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
-<div class="line"><a name="l10819"></a><span class="lineno">10819</span>&#160;                    }</div>
-<div class="line"><a name="l10820"></a><span class="lineno">10820</span>&#160;                }</div>
-<div class="line"><a name="l10821"></a><span class="lineno">10821</span>&#160;                <span class="keywordflow">else</span></div>
-<div class="line"><a name="l10822"></a><span class="lineno">10822</span>&#160;                {</div>
-<div class="line"><a name="l10823"></a><span class="lineno">10823</span>&#160;                    <span class="comment">// Already on next page.</span></div>
-<div class="line"><a name="l10824"></a><span class="lineno">10824</span>&#160;                    <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l10825"></a><span class="lineno">10825</span>&#160;                }</div>
-<div class="line"><a name="l10826"></a><span class="lineno">10826</span>&#160;            }</div>
-<div class="line"><a name="l10827"></a><span class="lineno">10827</span>&#160;        }</div>
-<div class="line"><a name="l10828"></a><span class="lineno">10828</span>&#160; </div>
-<div class="line"><a name="l10829"></a><span class="lineno">10829</span>&#160;        <span class="comment">// All tests passed: Success.</span></div>
-<div class="line"><a name="l10830"></a><span class="lineno">10830</span>&#160;        pAllocationRequest-&gt;offset = resultOffset;</div>
-<div class="line"><a name="l10831"></a><span class="lineno">10831</span>&#160;        pAllocationRequest-&gt;sumFreeSize = resultBaseOffset + allocSize - endOf1st;</div>
-<div class="line"><a name="l10832"></a><span class="lineno">10832</span>&#160;        pAllocationRequest-&gt;sumItemSize = 0;</div>
-<div class="line"><a name="l10833"></a><span class="lineno">10833</span>&#160;        <span class="comment">// pAllocationRequest-&gt;item unused.</span></div>
-<div class="line"><a name="l10834"></a><span class="lineno">10834</span>&#160;        pAllocationRequest-&gt;itemsToMakeLostCount = 0;</div>
-<div class="line"><a name="l10835"></a><span class="lineno">10835</span>&#160;        pAllocationRequest-&gt;type = VmaAllocationRequestType::UpperAddress;</div>
-<div class="line"><a name="l10836"></a><span class="lineno">10836</span>&#160;        <span class="keywordflow">return</span> <span class="keyword">true</span>;</div>
-<div class="line"><a name="l10837"></a><span class="lineno">10837</span>&#160;    }</div>
-<div class="line"><a name="l10838"></a><span class="lineno">10838</span>&#160; </div>
-<div class="line"><a name="l10839"></a><span class="lineno">10839</span>&#160;    <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
-<div class="line"><a name="l10840"></a><span class="lineno">10840</span>&#160;}</div>
+<div class="line"><a name="l10813"></a><span class="lineno">10813</span>&#160;                <span class="comment">// There is free space from lastOffset to freeSpace1stTo2ndEnd.</span></div>
+<div class="line"><a name="l10814"></a><span class="lineno">10814</span>&#160;                <span class="keyword">const</span> VkDeviceSize unusedRangeSize = freeSpace1stTo2ndEnd - lastOffset;</div>
+<div class="line"><a name="l10815"></a><span class="lineno">10815</span>&#160;                inoutStats.<a class="code" href="struct_vma_pool_stats.html#ad7c54874724fce7b06aba526202d82a8">unusedSize</a> += unusedRangeSize;</div>
+<div class="line"><a name="l10816"></a><span class="lineno">10816</span>&#160;                ++inoutStats.<a class="code" href="struct_vma_pool_stats.html#ae4f3546ffa4d1e598b64d8e6134854f4">unusedRangeCount</a>;</div>
+<div class="line"><a name="l10817"></a><span class="lineno">10817</span>&#160;                inoutStats.<a class="code" href="struct_vma_pool_stats.html#ab4c8f52dd42ab01998f60f0b6acc722b">unusedRangeSizeMax</a> = VMA_MAX(inoutStats.<a class="code" href="struct_vma_pool_stats.html#ab4c8f52dd42ab01998f60f0b6acc722b">unusedRangeSizeMax</a>, unusedRangeSize);</div>
+<div class="line"><a name="l10818"></a><span class="lineno">10818</span>&#160;            }</div>
+<div class="line"><a name="l10819"></a><span class="lineno">10819</span>&#160; </div>
+<div class="line"><a name="l10820"></a><span class="lineno">10820</span>&#160;            <span class="comment">// End of loop.</span></div>
+<div class="line"><a name="l10821"></a><span class="lineno">10821</span>&#160;            lastOffset = freeSpace1stTo2ndEnd;</div>
+<div class="line"><a name="l10822"></a><span class="lineno">10822</span>&#160;        }</div>
+<div class="line"><a name="l10823"></a><span class="lineno">10823</span>&#160;    }</div>
+<div class="line"><a name="l10824"></a><span class="lineno">10824</span>&#160; </div>
+<div class="line"><a name="l10825"></a><span class="lineno">10825</span>&#160;    <span class="keywordflow">if</span>(m_2ndVectorMode == SECOND_VECTOR_DOUBLE_STACK)</div>
+<div class="line"><a name="l10826"></a><span class="lineno">10826</span>&#160;    {</div>
+<div class="line"><a name="l10827"></a><span class="lineno">10827</span>&#160;        <span class="keywordtype">size_t</span> nextAlloc2ndIndex = suballocations2nd.size() - 1;</div>
+<div class="line"><a name="l10828"></a><span class="lineno">10828</span>&#160;        <span class="keywordflow">while</span>(lastOffset &lt; size)</div>
+<div class="line"><a name="l10829"></a><span class="lineno">10829</span>&#160;        {</div>
+<div class="line"><a name="l10830"></a><span class="lineno">10830</span>&#160;            <span class="comment">// Find next non-null allocation or move nextAlloc2ndIndex to the end.</span></div>
+<div class="line"><a name="l10831"></a><span class="lineno">10831</span>&#160;            <span class="keywordflow">while</span>(nextAlloc2ndIndex != SIZE_MAX &amp;&amp;</div>
+<div class="line"><a name="l10832"></a><span class="lineno">10832</span>&#160;                suballocations2nd[nextAlloc2ndIndex].hAllocation == VK_NULL_HANDLE)</div>
+<div class="line"><a name="l10833"></a><span class="lineno">10833</span>&#160;            {</div>
+<div class="line"><a name="l10834"></a><span class="lineno">10834</span>&#160;                --nextAlloc2ndIndex;</div>
+<div class="line"><a name="l10835"></a><span class="lineno">10835</span>&#160;            }</div>
+<div class="line"><a name="l10836"></a><span class="lineno">10836</span>&#160; </div>
+<div class="line"><a name="l10837"></a><span class="lineno">10837</span>&#160;            <span class="comment">// Found non-null allocation.</span></div>
+<div class="line"><a name="l10838"></a><span class="lineno">10838</span>&#160;            <span class="keywordflow">if</span>(nextAlloc2ndIndex != SIZE_MAX)</div>
+<div class="line"><a name="l10839"></a><span class="lineno">10839</span>&#160;            {</div>
+<div class="line"><a name="l10840"></a><span class="lineno">10840</span>&#160;                <span class="keyword">const</span> VmaSuballocation&amp; suballoc = suballocations2nd[nextAlloc2ndIndex];</div>
 <div class="line"><a name="l10841"></a><span class="lineno">10841</span>&#160; </div>
-<div class="line"><a name="l10842"></a><span class="lineno">10842</span>&#160;<span class="keywordtype">bool</span> VmaBlockMetadata_Linear::CreateAllocationRequest_LowerAddress(</div>
-<div class="line"><a name="l10843"></a><span class="lineno">10843</span>&#160;    uint32_t currentFrameIndex,</div>
-<div class="line"><a name="l10844"></a><span class="lineno">10844</span>&#160;    uint32_t frameInUseCount,</div>
-<div class="line"><a name="l10845"></a><span class="lineno">10845</span>&#160;    VkDeviceSize bufferImageGranularity,</div>
-<div class="line"><a name="l10846"></a><span class="lineno">10846</span>&#160;    VkDeviceSize allocSize,</div>
-<div class="line"><a name="l10847"></a><span class="lineno">10847</span>&#160;    VkDeviceSize allocAlignment,</div>
-<div class="line"><a name="l10848"></a><span class="lineno">10848</span>&#160;    VmaSuballocationType allocType,</div>
-<div class="line"><a name="l10849"></a><span class="lineno">10849</span>&#160;    <span class="keywordtype">bool</span> canMakeOtherLost,</div>
-<div class="line"><a name="l10850"></a><span class="lineno">10850</span>&#160;    uint32_t strategy,</div>
-<div class="line"><a name="l10851"></a><span class="lineno">10851</span>&#160;    VmaAllocationRequest* pAllocationRequest)</div>
-<div class="line"><a name="l10852"></a><span class="lineno">10852</span>&#160;{</div>
-<div class="line"><a name="l10853"></a><span class="lineno">10853</span>&#160;    <span class="keyword">const</span> VkDeviceSize size = GetSize();</div>
-<div class="line"><a name="l10854"></a><span class="lineno">10854</span>&#160;    SuballocationVectorType&amp; suballocations1st = AccessSuballocations1st();</div>
-<div class="line"><a name="l10855"></a><span class="lineno">10855</span>&#160;    SuballocationVectorType&amp; suballocations2nd = AccessSuballocations2nd();</div>
-<div class="line"><a name="l10856"></a><span class="lineno">10856</span>&#160; </div>
-<div class="line"><a name="l10857"></a><span class="lineno">10857</span>&#160;    <span class="keywordflow">if</span>(m_2ndVectorMode == SECOND_VECTOR_EMPTY || m_2ndVectorMode == SECOND_VECTOR_DOUBLE_STACK)</div>
-<div class="line"><a name="l10858"></a><span class="lineno">10858</span>&#160;    {</div>
-<div class="line"><a name="l10859"></a><span class="lineno">10859</span>&#160;        <span class="comment">// Try to allocate at the end of 1st vector.</span></div>
-<div class="line"><a name="l10860"></a><span class="lineno">10860</span>&#160; </div>
-<div class="line"><a name="l10861"></a><span class="lineno">10861</span>&#160;        VkDeviceSize resultBaseOffset = 0;</div>
-<div class="line"><a name="l10862"></a><span class="lineno">10862</span>&#160;        <span class="keywordflow">if</span>(!suballocations1st.empty())</div>
-<div class="line"><a name="l10863"></a><span class="lineno">10863</span>&#160;        {</div>
-<div class="line"><a name="l10864"></a><span class="lineno">10864</span>&#160;            <span class="keyword">const</span> VmaSuballocation&amp; lastSuballoc = suballocations1st.back();</div>
-<div class="line"><a name="l10865"></a><span class="lineno">10865</span>&#160;            resultBaseOffset = lastSuballoc.offset + lastSuballoc.size;</div>
-<div class="line"><a name="l10866"></a><span class="lineno">10866</span>&#160;        }</div>
-<div class="line"><a name="l10867"></a><span class="lineno">10867</span>&#160; </div>
-<div class="line"><a name="l10868"></a><span class="lineno">10868</span>&#160;        <span class="comment">// Start from offset equal to beginning of free space.</span></div>
-<div class="line"><a name="l10869"></a><span class="lineno">10869</span>&#160;        VkDeviceSize resultOffset = resultBaseOffset;</div>
-<div class="line"><a name="l10870"></a><span class="lineno">10870</span>&#160; </div>
-<div class="line"><a name="l10871"></a><span class="lineno">10871</span>&#160;        <span class="comment">// Apply VMA_DEBUG_MARGIN at the beginning.</span></div>
-<div class="line"><a name="l10872"></a><span class="lineno">10872</span>&#160;        <span class="keywordflow">if</span>(VMA_DEBUG_MARGIN &gt; 0)</div>
-<div class="line"><a name="l10873"></a><span class="lineno">10873</span>&#160;        {</div>
-<div class="line"><a name="l10874"></a><span class="lineno">10874</span>&#160;            resultOffset += VMA_DEBUG_MARGIN;</div>
+<div class="line"><a name="l10842"></a><span class="lineno">10842</span>&#160;                <span class="comment">// 1. Process free space before this allocation.</span></div>
+<div class="line"><a name="l10843"></a><span class="lineno">10843</span>&#160;                <span class="keywordflow">if</span>(lastOffset &lt; suballoc.offset)</div>
+<div class="line"><a name="l10844"></a><span class="lineno">10844</span>&#160;                {</div>
+<div class="line"><a name="l10845"></a><span class="lineno">10845</span>&#160;                    <span class="comment">// There is free space from lastOffset to suballoc.offset.</span></div>
+<div class="line"><a name="l10846"></a><span class="lineno">10846</span>&#160;                    <span class="keyword">const</span> VkDeviceSize unusedRangeSize = suballoc.offset - lastOffset;</div>
+<div class="line"><a name="l10847"></a><span class="lineno">10847</span>&#160;                    inoutStats.<a class="code" href="struct_vma_pool_stats.html#ad7c54874724fce7b06aba526202d82a8">unusedSize</a> += unusedRangeSize;</div>
+<div class="line"><a name="l10848"></a><span class="lineno">10848</span>&#160;                    ++inoutStats.<a class="code" href="struct_vma_pool_stats.html#ae4f3546ffa4d1e598b64d8e6134854f4">unusedRangeCount</a>;</div>
+<div class="line"><a name="l10849"></a><span class="lineno">10849</span>&#160;                    inoutStats.<a class="code" href="struct_vma_pool_stats.html#ab4c8f52dd42ab01998f60f0b6acc722b">unusedRangeSizeMax</a> = VMA_MAX(inoutStats.<a class="code" href="struct_vma_pool_stats.html#ab4c8f52dd42ab01998f60f0b6acc722b">unusedRangeSizeMax</a>, unusedRangeSize);</div>
+<div class="line"><a name="l10850"></a><span class="lineno">10850</span>&#160;                }</div>
+<div class="line"><a name="l10851"></a><span class="lineno">10851</span>&#160; </div>
+<div class="line"><a name="l10852"></a><span class="lineno">10852</span>&#160;                <span class="comment">// 2. Process this allocation.</span></div>
+<div class="line"><a name="l10853"></a><span class="lineno">10853</span>&#160;                <span class="comment">// There is allocation with suballoc.offset, suballoc.size.</span></div>
+<div class="line"><a name="l10854"></a><span class="lineno">10854</span>&#160;                ++inoutStats.<a class="code" href="struct_vma_pool_stats.html#ad1924eb54fffa45e9e0e65670c8fe5eb">allocationCount</a>;</div>
+<div class="line"><a name="l10855"></a><span class="lineno">10855</span>&#160; </div>
+<div class="line"><a name="l10856"></a><span class="lineno">10856</span>&#160;                <span class="comment">// 3. Prepare for next iteration.</span></div>
+<div class="line"><a name="l10857"></a><span class="lineno">10857</span>&#160;                lastOffset = suballoc.offset + suballoc.size;</div>
+<div class="line"><a name="l10858"></a><span class="lineno">10858</span>&#160;                --nextAlloc2ndIndex;</div>
+<div class="line"><a name="l10859"></a><span class="lineno">10859</span>&#160;            }</div>
+<div class="line"><a name="l10860"></a><span class="lineno">10860</span>&#160;            <span class="comment">// We are at the end.</span></div>
+<div class="line"><a name="l10861"></a><span class="lineno">10861</span>&#160;            <span class="keywordflow">else</span></div>
+<div class="line"><a name="l10862"></a><span class="lineno">10862</span>&#160;            {</div>
+<div class="line"><a name="l10863"></a><span class="lineno">10863</span>&#160;                <span class="keywordflow">if</span>(lastOffset &lt; size)</div>
+<div class="line"><a name="l10864"></a><span class="lineno">10864</span>&#160;                {</div>
+<div class="line"><a name="l10865"></a><span class="lineno">10865</span>&#160;                    <span class="comment">// There is free space from lastOffset to size.</span></div>
+<div class="line"><a name="l10866"></a><span class="lineno">10866</span>&#160;                    <span class="keyword">const</span> VkDeviceSize unusedRangeSize = size - lastOffset;</div>
+<div class="line"><a name="l10867"></a><span class="lineno">10867</span>&#160;                    inoutStats.<a class="code" href="struct_vma_pool_stats.html#ad7c54874724fce7b06aba526202d82a8">unusedSize</a> += unusedRangeSize;</div>
+<div class="line"><a name="l10868"></a><span class="lineno">10868</span>&#160;                    ++inoutStats.<a class="code" href="struct_vma_pool_stats.html#ae4f3546ffa4d1e598b64d8e6134854f4">unusedRangeCount</a>;</div>
+<div class="line"><a name="l10869"></a><span class="lineno">10869</span>&#160;                    inoutStats.<a class="code" href="struct_vma_pool_stats.html#ab4c8f52dd42ab01998f60f0b6acc722b">unusedRangeSizeMax</a> = VMA_MAX(inoutStats.<a class="code" href="struct_vma_pool_stats.html#ab4c8f52dd42ab01998f60f0b6acc722b">unusedRangeSizeMax</a>, unusedRangeSize);</div>
+<div class="line"><a name="l10870"></a><span class="lineno">10870</span>&#160;                }</div>
+<div class="line"><a name="l10871"></a><span class="lineno">10871</span>&#160; </div>
+<div class="line"><a name="l10872"></a><span class="lineno">10872</span>&#160;                <span class="comment">// End of loop.</span></div>
+<div class="line"><a name="l10873"></a><span class="lineno">10873</span>&#160;                lastOffset = size;</div>
+<div class="line"><a name="l10874"></a><span class="lineno">10874</span>&#160;            }</div>
 <div class="line"><a name="l10875"></a><span class="lineno">10875</span>&#160;        }</div>
-<div class="line"><a name="l10876"></a><span class="lineno">10876</span>&#160; </div>
-<div class="line"><a name="l10877"></a><span class="lineno">10877</span>&#160;        <span class="comment">// Apply alignment.</span></div>
-<div class="line"><a name="l10878"></a><span class="lineno">10878</span>&#160;        resultOffset = VmaAlignUp(resultOffset, allocAlignment);</div>
-<div class="line"><a name="l10879"></a><span class="lineno">10879</span>&#160; </div>
-<div class="line"><a name="l10880"></a><span class="lineno">10880</span>&#160;        <span class="comment">// Check previous suballocations for BufferImageGranularity conflicts.</span></div>
-<div class="line"><a name="l10881"></a><span class="lineno">10881</span>&#160;        <span class="comment">// Make bigger alignment if necessary.</span></div>
-<div class="line"><a name="l10882"></a><span class="lineno">10882</span>&#160;        <span class="keywordflow">if</span>(bufferImageGranularity &gt; 1 &amp;&amp; !suballocations1st.empty())</div>
-<div class="line"><a name="l10883"></a><span class="lineno">10883</span>&#160;        {</div>
-<div class="line"><a name="l10884"></a><span class="lineno">10884</span>&#160;            <span class="keywordtype">bool</span> bufferImageGranularityConflict = <span class="keyword">false</span>;</div>
-<div class="line"><a name="l10885"></a><span class="lineno">10885</span>&#160;            <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> prevSuballocIndex = suballocations1st.size(); prevSuballocIndex--; )</div>
-<div class="line"><a name="l10886"></a><span class="lineno">10886</span>&#160;            {</div>
-<div class="line"><a name="l10887"></a><span class="lineno">10887</span>&#160;                <span class="keyword">const</span> VmaSuballocation&amp; prevSuballoc = suballocations1st[prevSuballocIndex];</div>
-<div class="line"><a name="l10888"></a><span class="lineno">10888</span>&#160;                <span class="keywordflow">if</span>(VmaBlocksOnSamePage(prevSuballoc.offset, prevSuballoc.size, resultOffset, bufferImageGranularity))</div>
-<div class="line"><a name="l10889"></a><span class="lineno">10889</span>&#160;                {</div>
-<div class="line"><a name="l10890"></a><span class="lineno">10890</span>&#160;                    <span class="keywordflow">if</span>(VmaIsBufferImageGranularityConflict(prevSuballoc.type, allocType))</div>
-<div class="line"><a name="l10891"></a><span class="lineno">10891</span>&#160;                    {</div>
-<div class="line"><a name="l10892"></a><span class="lineno">10892</span>&#160;                        bufferImageGranularityConflict = <span class="keyword">true</span>;</div>
-<div class="line"><a name="l10893"></a><span class="lineno">10893</span>&#160;                        <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l10894"></a><span class="lineno">10894</span>&#160;                    }</div>
-<div class="line"><a name="l10895"></a><span class="lineno">10895</span>&#160;                }</div>
-<div class="line"><a name="l10896"></a><span class="lineno">10896</span>&#160;                <span class="keywordflow">else</span></div>
-<div class="line"><a name="l10897"></a><span class="lineno">10897</span>&#160;                    <span class="comment">// Already on previous page.</span></div>
-<div class="line"><a name="l10898"></a><span class="lineno">10898</span>&#160;                    <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l10899"></a><span class="lineno">10899</span>&#160;            }</div>
-<div class="line"><a name="l10900"></a><span class="lineno">10900</span>&#160;            <span class="keywordflow">if</span>(bufferImageGranularityConflict)</div>
-<div class="line"><a name="l10901"></a><span class="lineno">10901</span>&#160;            {</div>
-<div class="line"><a name="l10902"></a><span class="lineno">10902</span>&#160;                resultOffset = VmaAlignUp(resultOffset, bufferImageGranularity);</div>
-<div class="line"><a name="l10903"></a><span class="lineno">10903</span>&#160;            }</div>
-<div class="line"><a name="l10904"></a><span class="lineno">10904</span>&#160;        }</div>
-<div class="line"><a name="l10905"></a><span class="lineno">10905</span>&#160; </div>
-<div class="line"><a name="l10906"></a><span class="lineno">10906</span>&#160;        <span class="keyword">const</span> VkDeviceSize freeSpaceEnd = m_2ndVectorMode == SECOND_VECTOR_DOUBLE_STACK ?</div>
-<div class="line"><a name="l10907"></a><span class="lineno">10907</span>&#160;            suballocations2nd.back().offset : size;</div>
+<div class="line"><a name="l10876"></a><span class="lineno">10876</span>&#160;    }</div>
+<div class="line"><a name="l10877"></a><span class="lineno">10877</span>&#160;}</div>
+<div class="line"><a name="l10878"></a><span class="lineno">10878</span>&#160; </div>
+<div class="line"><a name="l10879"></a><span class="lineno">10879</span>&#160;<span class="preprocessor">#if VMA_STATS_STRING_ENABLED</span></div>
+<div class="line"><a name="l10880"></a><span class="lineno">10880</span>&#160;<span class="keywordtype">void</span> VmaBlockMetadata_Linear::PrintDetailedMap(<span class="keyword">class</span> VmaJsonWriter&amp; json)<span class="keyword"> const</span></div>
+<div class="line"><a name="l10881"></a><span class="lineno">10881</span>&#160;<span class="keyword"></span>{</div>
+<div class="line"><a name="l10882"></a><span class="lineno">10882</span>&#160;    <span class="keyword">const</span> VkDeviceSize size = GetSize();</div>
+<div class="line"><a name="l10883"></a><span class="lineno">10883</span>&#160;    <span class="keyword">const</span> SuballocationVectorType&amp; suballocations1st = AccessSuballocations1st();</div>
+<div class="line"><a name="l10884"></a><span class="lineno">10884</span>&#160;    <span class="keyword">const</span> SuballocationVectorType&amp; suballocations2nd = AccessSuballocations2nd();</div>
+<div class="line"><a name="l10885"></a><span class="lineno">10885</span>&#160;    <span class="keyword">const</span> <span class="keywordtype">size_t</span> suballoc1stCount = suballocations1st.size();</div>
+<div class="line"><a name="l10886"></a><span class="lineno">10886</span>&#160;    <span class="keyword">const</span> <span class="keywordtype">size_t</span> suballoc2ndCount = suballocations2nd.size();</div>
+<div class="line"><a name="l10887"></a><span class="lineno">10887</span>&#160; </div>
+<div class="line"><a name="l10888"></a><span class="lineno">10888</span>&#160;    <span class="comment">// FIRST PASS</span></div>
+<div class="line"><a name="l10889"></a><span class="lineno">10889</span>&#160; </div>
+<div class="line"><a name="l10890"></a><span class="lineno">10890</span>&#160;    <span class="keywordtype">size_t</span> unusedRangeCount = 0;</div>
+<div class="line"><a name="l10891"></a><span class="lineno">10891</span>&#160;    VkDeviceSize usedBytes = 0;</div>
+<div class="line"><a name="l10892"></a><span class="lineno">10892</span>&#160; </div>
+<div class="line"><a name="l10893"></a><span class="lineno">10893</span>&#160;    VkDeviceSize lastOffset = 0;</div>
+<div class="line"><a name="l10894"></a><span class="lineno">10894</span>&#160; </div>
+<div class="line"><a name="l10895"></a><span class="lineno">10895</span>&#160;    <span class="keywordtype">size_t</span> alloc2ndCount = 0;</div>
+<div class="line"><a name="l10896"></a><span class="lineno">10896</span>&#160;    <span class="keywordflow">if</span>(m_2ndVectorMode == SECOND_VECTOR_RING_BUFFER)</div>
+<div class="line"><a name="l10897"></a><span class="lineno">10897</span>&#160;    {</div>
+<div class="line"><a name="l10898"></a><span class="lineno">10898</span>&#160;        <span class="keyword">const</span> VkDeviceSize freeSpace2ndTo1stEnd = suballocations1st[m_1stNullItemsBeginCount].offset;</div>
+<div class="line"><a name="l10899"></a><span class="lineno">10899</span>&#160;        <span class="keywordtype">size_t</span> nextAlloc2ndIndex = 0;</div>
+<div class="line"><a name="l10900"></a><span class="lineno">10900</span>&#160;        <span class="keywordflow">while</span>(lastOffset &lt; freeSpace2ndTo1stEnd)</div>
+<div class="line"><a name="l10901"></a><span class="lineno">10901</span>&#160;        {</div>
+<div class="line"><a name="l10902"></a><span class="lineno">10902</span>&#160;            <span class="comment">// Find next non-null allocation or move nextAlloc2ndIndex to the end.</span></div>
+<div class="line"><a name="l10903"></a><span class="lineno">10903</span>&#160;            <span class="keywordflow">while</span>(nextAlloc2ndIndex &lt; suballoc2ndCount &amp;&amp;</div>
+<div class="line"><a name="l10904"></a><span class="lineno">10904</span>&#160;                suballocations2nd[nextAlloc2ndIndex].hAllocation == VK_NULL_HANDLE)</div>
+<div class="line"><a name="l10905"></a><span class="lineno">10905</span>&#160;            {</div>
+<div class="line"><a name="l10906"></a><span class="lineno">10906</span>&#160;                ++nextAlloc2ndIndex;</div>
+<div class="line"><a name="l10907"></a><span class="lineno">10907</span>&#160;            }</div>
 <div class="line"><a name="l10908"></a><span class="lineno">10908</span>&#160; </div>
-<div class="line"><a name="l10909"></a><span class="lineno">10909</span>&#160;        <span class="comment">// There is enough free space at the end after alignment.</span></div>
-<div class="line"><a name="l10910"></a><span class="lineno">10910</span>&#160;        <span class="keywordflow">if</span>(resultOffset + allocSize + VMA_DEBUG_MARGIN &lt;= freeSpaceEnd)</div>
-<div class="line"><a name="l10911"></a><span class="lineno">10911</span>&#160;        {</div>
-<div class="line"><a name="l10912"></a><span class="lineno">10912</span>&#160;            <span class="comment">// Check next suballocations for BufferImageGranularity conflicts.</span></div>
-<div class="line"><a name="l10913"></a><span class="lineno">10913</span>&#160;            <span class="comment">// If conflict exists, allocation cannot be made here.</span></div>
-<div class="line"><a name="l10914"></a><span class="lineno">10914</span>&#160;            <span class="keywordflow">if</span>(bufferImageGranularity &gt; 1 &amp;&amp; m_2ndVectorMode == SECOND_VECTOR_DOUBLE_STACK)</div>
-<div class="line"><a name="l10915"></a><span class="lineno">10915</span>&#160;            {</div>
-<div class="line"><a name="l10916"></a><span class="lineno">10916</span>&#160;                <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> nextSuballocIndex = suballocations2nd.size(); nextSuballocIndex--; )</div>
-<div class="line"><a name="l10917"></a><span class="lineno">10917</span>&#160;                {</div>
-<div class="line"><a name="l10918"></a><span class="lineno">10918</span>&#160;                    <span class="keyword">const</span> VmaSuballocation&amp; nextSuballoc = suballocations2nd[nextSuballocIndex];</div>
-<div class="line"><a name="l10919"></a><span class="lineno">10919</span>&#160;                    <span class="keywordflow">if</span>(VmaBlocksOnSamePage(resultOffset, allocSize, nextSuballoc.offset, bufferImageGranularity))</div>
-<div class="line"><a name="l10920"></a><span class="lineno">10920</span>&#160;                    {</div>
-<div class="line"><a name="l10921"></a><span class="lineno">10921</span>&#160;                        <span class="keywordflow">if</span>(VmaIsBufferImageGranularityConflict(allocType, nextSuballoc.type))</div>
-<div class="line"><a name="l10922"></a><span class="lineno">10922</span>&#160;                        {</div>
-<div class="line"><a name="l10923"></a><span class="lineno">10923</span>&#160;                            <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
-<div class="line"><a name="l10924"></a><span class="lineno">10924</span>&#160;                        }</div>
-<div class="line"><a name="l10925"></a><span class="lineno">10925</span>&#160;                    }</div>
-<div class="line"><a name="l10926"></a><span class="lineno">10926</span>&#160;                    <span class="keywordflow">else</span></div>
-<div class="line"><a name="l10927"></a><span class="lineno">10927</span>&#160;                    {</div>
-<div class="line"><a name="l10928"></a><span class="lineno">10928</span>&#160;                        <span class="comment">// Already on previous page.</span></div>
-<div class="line"><a name="l10929"></a><span class="lineno">10929</span>&#160;                        <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l10930"></a><span class="lineno">10930</span>&#160;                    }</div>
-<div class="line"><a name="l10931"></a><span class="lineno">10931</span>&#160;                }</div>
-<div class="line"><a name="l10932"></a><span class="lineno">10932</span>&#160;            }</div>
-<div class="line"><a name="l10933"></a><span class="lineno">10933</span>&#160; </div>
-<div class="line"><a name="l10934"></a><span class="lineno">10934</span>&#160;            <span class="comment">// All tests passed: Success.</span></div>
-<div class="line"><a name="l10935"></a><span class="lineno">10935</span>&#160;            pAllocationRequest-&gt;offset = resultOffset;</div>
-<div class="line"><a name="l10936"></a><span class="lineno">10936</span>&#160;            pAllocationRequest-&gt;sumFreeSize = freeSpaceEnd - resultBaseOffset;</div>
-<div class="line"><a name="l10937"></a><span class="lineno">10937</span>&#160;            pAllocationRequest-&gt;sumItemSize = 0;</div>
-<div class="line"><a name="l10938"></a><span class="lineno">10938</span>&#160;            <span class="comment">// pAllocationRequest-&gt;item, customData unused.</span></div>
-<div class="line"><a name="l10939"></a><span class="lineno">10939</span>&#160;            pAllocationRequest-&gt;type = VmaAllocationRequestType::EndOf1st;</div>
-<div class="line"><a name="l10940"></a><span class="lineno">10940</span>&#160;            pAllocationRequest-&gt;itemsToMakeLostCount = 0;</div>
-<div class="line"><a name="l10941"></a><span class="lineno">10941</span>&#160;            <span class="keywordflow">return</span> <span class="keyword">true</span>;</div>
+<div class="line"><a name="l10909"></a><span class="lineno">10909</span>&#160;            <span class="comment">// Found non-null allocation.</span></div>
+<div class="line"><a name="l10910"></a><span class="lineno">10910</span>&#160;            <span class="keywordflow">if</span>(nextAlloc2ndIndex &lt; suballoc2ndCount)</div>
+<div class="line"><a name="l10911"></a><span class="lineno">10911</span>&#160;            {</div>
+<div class="line"><a name="l10912"></a><span class="lineno">10912</span>&#160;                <span class="keyword">const</span> VmaSuballocation&amp; suballoc = suballocations2nd[nextAlloc2ndIndex];</div>
+<div class="line"><a name="l10913"></a><span class="lineno">10913</span>&#160; </div>
+<div class="line"><a name="l10914"></a><span class="lineno">10914</span>&#160;                <span class="comment">// 1. Process free space before this allocation.</span></div>
+<div class="line"><a name="l10915"></a><span class="lineno">10915</span>&#160;                <span class="keywordflow">if</span>(lastOffset &lt; suballoc.offset)</div>
+<div class="line"><a name="l10916"></a><span class="lineno">10916</span>&#160;                {</div>
+<div class="line"><a name="l10917"></a><span class="lineno">10917</span>&#160;                    <span class="comment">// There is free space from lastOffset to suballoc.offset.</span></div>
+<div class="line"><a name="l10918"></a><span class="lineno">10918</span>&#160;                    ++unusedRangeCount;</div>
+<div class="line"><a name="l10919"></a><span class="lineno">10919</span>&#160;                }</div>
+<div class="line"><a name="l10920"></a><span class="lineno">10920</span>&#160; </div>
+<div class="line"><a name="l10921"></a><span class="lineno">10921</span>&#160;                <span class="comment">// 2. Process this allocation.</span></div>
+<div class="line"><a name="l10922"></a><span class="lineno">10922</span>&#160;                <span class="comment">// There is allocation with suballoc.offset, suballoc.size.</span></div>
+<div class="line"><a name="l10923"></a><span class="lineno">10923</span>&#160;                ++alloc2ndCount;</div>
+<div class="line"><a name="l10924"></a><span class="lineno">10924</span>&#160;                usedBytes += suballoc.size;</div>
+<div class="line"><a name="l10925"></a><span class="lineno">10925</span>&#160; </div>
+<div class="line"><a name="l10926"></a><span class="lineno">10926</span>&#160;                <span class="comment">// 3. Prepare for next iteration.</span></div>
+<div class="line"><a name="l10927"></a><span class="lineno">10927</span>&#160;                lastOffset = suballoc.offset + suballoc.size;</div>
+<div class="line"><a name="l10928"></a><span class="lineno">10928</span>&#160;                ++nextAlloc2ndIndex;</div>
+<div class="line"><a name="l10929"></a><span class="lineno">10929</span>&#160;            }</div>
+<div class="line"><a name="l10930"></a><span class="lineno">10930</span>&#160;            <span class="comment">// We are at the end.</span></div>
+<div class="line"><a name="l10931"></a><span class="lineno">10931</span>&#160;            <span class="keywordflow">else</span></div>
+<div class="line"><a name="l10932"></a><span class="lineno">10932</span>&#160;            {</div>
+<div class="line"><a name="l10933"></a><span class="lineno">10933</span>&#160;                <span class="keywordflow">if</span>(lastOffset &lt; freeSpace2ndTo1stEnd)</div>
+<div class="line"><a name="l10934"></a><span class="lineno">10934</span>&#160;                {</div>
+<div class="line"><a name="l10935"></a><span class="lineno">10935</span>&#160;                    <span class="comment">// There is free space from lastOffset to freeSpace2ndTo1stEnd.</span></div>
+<div class="line"><a name="l10936"></a><span class="lineno">10936</span>&#160;                    ++unusedRangeCount;</div>
+<div class="line"><a name="l10937"></a><span class="lineno">10937</span>&#160;                }</div>
+<div class="line"><a name="l10938"></a><span class="lineno">10938</span>&#160; </div>
+<div class="line"><a name="l10939"></a><span class="lineno">10939</span>&#160;                <span class="comment">// End of loop.</span></div>
+<div class="line"><a name="l10940"></a><span class="lineno">10940</span>&#160;                lastOffset = freeSpace2ndTo1stEnd;</div>
+<div class="line"><a name="l10941"></a><span class="lineno">10941</span>&#160;            }</div>
 <div class="line"><a name="l10942"></a><span class="lineno">10942</span>&#160;        }</div>
 <div class="line"><a name="l10943"></a><span class="lineno">10943</span>&#160;    }</div>
 <div class="line"><a name="l10944"></a><span class="lineno">10944</span>&#160; </div>
-<div class="line"><a name="l10945"></a><span class="lineno">10945</span>&#160;    <span class="comment">// Wrap-around to end of 2nd vector. Try to allocate there, watching for the</span></div>
-<div class="line"><a name="l10946"></a><span class="lineno">10946</span>&#160;    <span class="comment">// beginning of 1st vector as the end of free space.</span></div>
-<div class="line"><a name="l10947"></a><span class="lineno">10947</span>&#160;    <span class="keywordflow">if</span>(m_2ndVectorMode == SECOND_VECTOR_EMPTY || m_2ndVectorMode == SECOND_VECTOR_RING_BUFFER)</div>
-<div class="line"><a name="l10948"></a><span class="lineno">10948</span>&#160;    {</div>
-<div class="line"><a name="l10949"></a><span class="lineno">10949</span>&#160;        VMA_ASSERT(!suballocations1st.empty());</div>
-<div class="line"><a name="l10950"></a><span class="lineno">10950</span>&#160; </div>
-<div class="line"><a name="l10951"></a><span class="lineno">10951</span>&#160;        VkDeviceSize resultBaseOffset = 0;</div>
-<div class="line"><a name="l10952"></a><span class="lineno">10952</span>&#160;        <span class="keywordflow">if</span>(!suballocations2nd.empty())</div>
-<div class="line"><a name="l10953"></a><span class="lineno">10953</span>&#160;        {</div>
-<div class="line"><a name="l10954"></a><span class="lineno">10954</span>&#160;            <span class="keyword">const</span> VmaSuballocation&amp; lastSuballoc = suballocations2nd.back();</div>
-<div class="line"><a name="l10955"></a><span class="lineno">10955</span>&#160;            resultBaseOffset = lastSuballoc.offset + lastSuballoc.size;</div>
+<div class="line"><a name="l10945"></a><span class="lineno">10945</span>&#160;    <span class="keywordtype">size_t</span> nextAlloc1stIndex = m_1stNullItemsBeginCount;</div>
+<div class="line"><a name="l10946"></a><span class="lineno">10946</span>&#160;    <span class="keywordtype">size_t</span> alloc1stCount = 0;</div>
+<div class="line"><a name="l10947"></a><span class="lineno">10947</span>&#160;    <span class="keyword">const</span> VkDeviceSize freeSpace1stTo2ndEnd =</div>
+<div class="line"><a name="l10948"></a><span class="lineno">10948</span>&#160;        m_2ndVectorMode == SECOND_VECTOR_DOUBLE_STACK ? suballocations2nd.back().offset : size;</div>
+<div class="line"><a name="l10949"></a><span class="lineno">10949</span>&#160;    <span class="keywordflow">while</span>(lastOffset &lt; freeSpace1stTo2ndEnd)</div>
+<div class="line"><a name="l10950"></a><span class="lineno">10950</span>&#160;    {</div>
+<div class="line"><a name="l10951"></a><span class="lineno">10951</span>&#160;        <span class="comment">// Find next non-null allocation or move nextAllocIndex to the end.</span></div>
+<div class="line"><a name="l10952"></a><span class="lineno">10952</span>&#160;        <span class="keywordflow">while</span>(nextAlloc1stIndex &lt; suballoc1stCount &amp;&amp;</div>
+<div class="line"><a name="l10953"></a><span class="lineno">10953</span>&#160;            suballocations1st[nextAlloc1stIndex].hAllocation == VK_NULL_HANDLE)</div>
+<div class="line"><a name="l10954"></a><span class="lineno">10954</span>&#160;        {</div>
+<div class="line"><a name="l10955"></a><span class="lineno">10955</span>&#160;            ++nextAlloc1stIndex;</div>
 <div class="line"><a name="l10956"></a><span class="lineno">10956</span>&#160;        }</div>
 <div class="line"><a name="l10957"></a><span class="lineno">10957</span>&#160; </div>
-<div class="line"><a name="l10958"></a><span class="lineno">10958</span>&#160;        <span class="comment">// Start from offset equal to beginning of free space.</span></div>
-<div class="line"><a name="l10959"></a><span class="lineno">10959</span>&#160;        VkDeviceSize resultOffset = resultBaseOffset;</div>
-<div class="line"><a name="l10960"></a><span class="lineno">10960</span>&#160; </div>
-<div class="line"><a name="l10961"></a><span class="lineno">10961</span>&#160;        <span class="comment">// Apply VMA_DEBUG_MARGIN at the beginning.</span></div>
-<div class="line"><a name="l10962"></a><span class="lineno">10962</span>&#160;        <span class="keywordflow">if</span>(VMA_DEBUG_MARGIN &gt; 0)</div>
-<div class="line"><a name="l10963"></a><span class="lineno">10963</span>&#160;        {</div>
-<div class="line"><a name="l10964"></a><span class="lineno">10964</span>&#160;            resultOffset += VMA_DEBUG_MARGIN;</div>
-<div class="line"><a name="l10965"></a><span class="lineno">10965</span>&#160;        }</div>
-<div class="line"><a name="l10966"></a><span class="lineno">10966</span>&#160; </div>
-<div class="line"><a name="l10967"></a><span class="lineno">10967</span>&#160;        <span class="comment">// Apply alignment.</span></div>
-<div class="line"><a name="l10968"></a><span class="lineno">10968</span>&#160;        resultOffset = VmaAlignUp(resultOffset, allocAlignment);</div>
+<div class="line"><a name="l10958"></a><span class="lineno">10958</span>&#160;        <span class="comment">// Found non-null allocation.</span></div>
+<div class="line"><a name="l10959"></a><span class="lineno">10959</span>&#160;        <span class="keywordflow">if</span>(nextAlloc1stIndex &lt; suballoc1stCount)</div>
+<div class="line"><a name="l10960"></a><span class="lineno">10960</span>&#160;        {</div>
+<div class="line"><a name="l10961"></a><span class="lineno">10961</span>&#160;            <span class="keyword">const</span> VmaSuballocation&amp; suballoc = suballocations1st[nextAlloc1stIndex];</div>
+<div class="line"><a name="l10962"></a><span class="lineno">10962</span>&#160; </div>
+<div class="line"><a name="l10963"></a><span class="lineno">10963</span>&#160;            <span class="comment">// 1. Process free space before this allocation.</span></div>
+<div class="line"><a name="l10964"></a><span class="lineno">10964</span>&#160;            <span class="keywordflow">if</span>(lastOffset &lt; suballoc.offset)</div>
+<div class="line"><a name="l10965"></a><span class="lineno">10965</span>&#160;            {</div>
+<div class="line"><a name="l10966"></a><span class="lineno">10966</span>&#160;                <span class="comment">// There is free space from lastOffset to suballoc.offset.</span></div>
+<div class="line"><a name="l10967"></a><span class="lineno">10967</span>&#160;                ++unusedRangeCount;</div>
+<div class="line"><a name="l10968"></a><span class="lineno">10968</span>&#160;            }</div>
 <div class="line"><a name="l10969"></a><span class="lineno">10969</span>&#160; </div>
-<div class="line"><a name="l10970"></a><span class="lineno">10970</span>&#160;        <span class="comment">// Check previous suballocations for BufferImageGranularity conflicts.</span></div>
-<div class="line"><a name="l10971"></a><span class="lineno">10971</span>&#160;        <span class="comment">// Make bigger alignment if necessary.</span></div>
-<div class="line"><a name="l10972"></a><span class="lineno">10972</span>&#160;        <span class="keywordflow">if</span>(bufferImageGranularity &gt; 1 &amp;&amp; !suballocations2nd.empty())</div>
-<div class="line"><a name="l10973"></a><span class="lineno">10973</span>&#160;        {</div>
-<div class="line"><a name="l10974"></a><span class="lineno">10974</span>&#160;            <span class="keywordtype">bool</span> bufferImageGranularityConflict = <span class="keyword">false</span>;</div>
-<div class="line"><a name="l10975"></a><span class="lineno">10975</span>&#160;            <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> prevSuballocIndex = suballocations2nd.size(); prevSuballocIndex--; )</div>
-<div class="line"><a name="l10976"></a><span class="lineno">10976</span>&#160;            {</div>
-<div class="line"><a name="l10977"></a><span class="lineno">10977</span>&#160;                <span class="keyword">const</span> VmaSuballocation&amp; prevSuballoc = suballocations2nd[prevSuballocIndex];</div>
-<div class="line"><a name="l10978"></a><span class="lineno">10978</span>&#160;                <span class="keywordflow">if</span>(VmaBlocksOnSamePage(prevSuballoc.offset, prevSuballoc.size, resultOffset, bufferImageGranularity))</div>
-<div class="line"><a name="l10979"></a><span class="lineno">10979</span>&#160;                {</div>
-<div class="line"><a name="l10980"></a><span class="lineno">10980</span>&#160;                    <span class="keywordflow">if</span>(VmaIsBufferImageGranularityConflict(prevSuballoc.type, allocType))</div>
-<div class="line"><a name="l10981"></a><span class="lineno">10981</span>&#160;                    {</div>
-<div class="line"><a name="l10982"></a><span class="lineno">10982</span>&#160;                        bufferImageGranularityConflict = <span class="keyword">true</span>;</div>
-<div class="line"><a name="l10983"></a><span class="lineno">10983</span>&#160;                        <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l10984"></a><span class="lineno">10984</span>&#160;                    }</div>
-<div class="line"><a name="l10985"></a><span class="lineno">10985</span>&#160;                }</div>
-<div class="line"><a name="l10986"></a><span class="lineno">10986</span>&#160;                <span class="keywordflow">else</span></div>
-<div class="line"><a name="l10987"></a><span class="lineno">10987</span>&#160;                    <span class="comment">// Already on previous page.</span></div>
-<div class="line"><a name="l10988"></a><span class="lineno">10988</span>&#160;                    <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l10989"></a><span class="lineno">10989</span>&#160;            }</div>
-<div class="line"><a name="l10990"></a><span class="lineno">10990</span>&#160;            <span class="keywordflow">if</span>(bufferImageGranularityConflict)</div>
-<div class="line"><a name="l10991"></a><span class="lineno">10991</span>&#160;            {</div>
-<div class="line"><a name="l10992"></a><span class="lineno">10992</span>&#160;                resultOffset = VmaAlignUp(resultOffset, bufferImageGranularity);</div>
-<div class="line"><a name="l10993"></a><span class="lineno">10993</span>&#160;            }</div>
-<div class="line"><a name="l10994"></a><span class="lineno">10994</span>&#160;        }</div>
-<div class="line"><a name="l10995"></a><span class="lineno">10995</span>&#160; </div>
-<div class="line"><a name="l10996"></a><span class="lineno">10996</span>&#160;        pAllocationRequest-&gt;itemsToMakeLostCount = 0;</div>
-<div class="line"><a name="l10997"></a><span class="lineno">10997</span>&#160;        pAllocationRequest-&gt;sumItemSize = 0;</div>
-<div class="line"><a name="l10998"></a><span class="lineno">10998</span>&#160;        <span class="keywordtype">size_t</span> index1st = m_1stNullItemsBeginCount;</div>
-<div class="line"><a name="l10999"></a><span class="lineno">10999</span>&#160; </div>
-<div class="line"><a name="l11000"></a><span class="lineno">11000</span>&#160;        <span class="keywordflow">if</span>(canMakeOtherLost)</div>
-<div class="line"><a name="l11001"></a><span class="lineno">11001</span>&#160;        {</div>
-<div class="line"><a name="l11002"></a><span class="lineno">11002</span>&#160;            <span class="keywordflow">while</span>(index1st &lt; suballocations1st.size() &amp;&amp;</div>
-<div class="line"><a name="l11003"></a><span class="lineno">11003</span>&#160;                resultOffset + allocSize + VMA_DEBUG_MARGIN &gt; suballocations1st[index1st].offset)</div>
-<div class="line"><a name="l11004"></a><span class="lineno">11004</span>&#160;            {</div>
-<div class="line"><a name="l11005"></a><span class="lineno">11005</span>&#160;                <span class="comment">// Next colliding allocation at the beginning of 1st vector found. Try to make it lost.</span></div>
-<div class="line"><a name="l11006"></a><span class="lineno">11006</span>&#160;                <span class="keyword">const</span> VmaSuballocation&amp; suballoc = suballocations1st[index1st];</div>
-<div class="line"><a name="l11007"></a><span class="lineno">11007</span>&#160;                <span class="keywordflow">if</span>(suballoc.type == VMA_SUBALLOCATION_TYPE_FREE)</div>
-<div class="line"><a name="l11008"></a><span class="lineno">11008</span>&#160;                {</div>
-<div class="line"><a name="l11009"></a><span class="lineno">11009</span>&#160;                    <span class="comment">// No problem.</span></div>
-<div class="line"><a name="l11010"></a><span class="lineno">11010</span>&#160;                }</div>
-<div class="line"><a name="l11011"></a><span class="lineno">11011</span>&#160;                <span class="keywordflow">else</span></div>
+<div class="line"><a name="l10970"></a><span class="lineno">10970</span>&#160;            <span class="comment">// 2. Process this allocation.</span></div>
+<div class="line"><a name="l10971"></a><span class="lineno">10971</span>&#160;            <span class="comment">// There is allocation with suballoc.offset, suballoc.size.</span></div>
+<div class="line"><a name="l10972"></a><span class="lineno">10972</span>&#160;            ++alloc1stCount;</div>
+<div class="line"><a name="l10973"></a><span class="lineno">10973</span>&#160;            usedBytes += suballoc.size;</div>
+<div class="line"><a name="l10974"></a><span class="lineno">10974</span>&#160; </div>
+<div class="line"><a name="l10975"></a><span class="lineno">10975</span>&#160;            <span class="comment">// 3. Prepare for next iteration.</span></div>
+<div class="line"><a name="l10976"></a><span class="lineno">10976</span>&#160;            lastOffset = suballoc.offset + suballoc.size;</div>
+<div class="line"><a name="l10977"></a><span class="lineno">10977</span>&#160;            ++nextAlloc1stIndex;</div>
+<div class="line"><a name="l10978"></a><span class="lineno">10978</span>&#160;        }</div>
+<div class="line"><a name="l10979"></a><span class="lineno">10979</span>&#160;        <span class="comment">// We are at the end.</span></div>
+<div class="line"><a name="l10980"></a><span class="lineno">10980</span>&#160;        <span class="keywordflow">else</span></div>
+<div class="line"><a name="l10981"></a><span class="lineno">10981</span>&#160;        {</div>
+<div class="line"><a name="l10982"></a><span class="lineno">10982</span>&#160;            <span class="keywordflow">if</span>(lastOffset &lt; size)</div>
+<div class="line"><a name="l10983"></a><span class="lineno">10983</span>&#160;            {</div>
+<div class="line"><a name="l10984"></a><span class="lineno">10984</span>&#160;                <span class="comment">// There is free space from lastOffset to freeSpace1stTo2ndEnd.</span></div>
+<div class="line"><a name="l10985"></a><span class="lineno">10985</span>&#160;                ++unusedRangeCount;</div>
+<div class="line"><a name="l10986"></a><span class="lineno">10986</span>&#160;            }</div>
+<div class="line"><a name="l10987"></a><span class="lineno">10987</span>&#160; </div>
+<div class="line"><a name="l10988"></a><span class="lineno">10988</span>&#160;            <span class="comment">// End of loop.</span></div>
+<div class="line"><a name="l10989"></a><span class="lineno">10989</span>&#160;            lastOffset = freeSpace1stTo2ndEnd;</div>
+<div class="line"><a name="l10990"></a><span class="lineno">10990</span>&#160;        }</div>
+<div class="line"><a name="l10991"></a><span class="lineno">10991</span>&#160;    }</div>
+<div class="line"><a name="l10992"></a><span class="lineno">10992</span>&#160; </div>
+<div class="line"><a name="l10993"></a><span class="lineno">10993</span>&#160;    <span class="keywordflow">if</span>(m_2ndVectorMode == SECOND_VECTOR_DOUBLE_STACK)</div>
+<div class="line"><a name="l10994"></a><span class="lineno">10994</span>&#160;    {</div>
+<div class="line"><a name="l10995"></a><span class="lineno">10995</span>&#160;        <span class="keywordtype">size_t</span> nextAlloc2ndIndex = suballocations2nd.size() - 1;</div>
+<div class="line"><a name="l10996"></a><span class="lineno">10996</span>&#160;        <span class="keywordflow">while</span>(lastOffset &lt; size)</div>
+<div class="line"><a name="l10997"></a><span class="lineno">10997</span>&#160;        {</div>
+<div class="line"><a name="l10998"></a><span class="lineno">10998</span>&#160;            <span class="comment">// Find next non-null allocation or move nextAlloc2ndIndex to the end.</span></div>
+<div class="line"><a name="l10999"></a><span class="lineno">10999</span>&#160;            <span class="keywordflow">while</span>(nextAlloc2ndIndex != SIZE_MAX &amp;&amp;</div>
+<div class="line"><a name="l11000"></a><span class="lineno">11000</span>&#160;                suballocations2nd[nextAlloc2ndIndex].hAllocation == VK_NULL_HANDLE)</div>
+<div class="line"><a name="l11001"></a><span class="lineno">11001</span>&#160;            {</div>
+<div class="line"><a name="l11002"></a><span class="lineno">11002</span>&#160;                --nextAlloc2ndIndex;</div>
+<div class="line"><a name="l11003"></a><span class="lineno">11003</span>&#160;            }</div>
+<div class="line"><a name="l11004"></a><span class="lineno">11004</span>&#160; </div>
+<div class="line"><a name="l11005"></a><span class="lineno">11005</span>&#160;            <span class="comment">// Found non-null allocation.</span></div>
+<div class="line"><a name="l11006"></a><span class="lineno">11006</span>&#160;            <span class="keywordflow">if</span>(nextAlloc2ndIndex != SIZE_MAX)</div>
+<div class="line"><a name="l11007"></a><span class="lineno">11007</span>&#160;            {</div>
+<div class="line"><a name="l11008"></a><span class="lineno">11008</span>&#160;                <span class="keyword">const</span> VmaSuballocation&amp; suballoc = suballocations2nd[nextAlloc2ndIndex];</div>
+<div class="line"><a name="l11009"></a><span class="lineno">11009</span>&#160; </div>
+<div class="line"><a name="l11010"></a><span class="lineno">11010</span>&#160;                <span class="comment">// 1. Process free space before this allocation.</span></div>
+<div class="line"><a name="l11011"></a><span class="lineno">11011</span>&#160;                <span class="keywordflow">if</span>(lastOffset &lt; suballoc.offset)</div>
 <div class="line"><a name="l11012"></a><span class="lineno">11012</span>&#160;                {</div>
-<div class="line"><a name="l11013"></a><span class="lineno">11013</span>&#160;                    VMA_ASSERT(suballoc.hAllocation != VK_NULL_HANDLE);</div>
-<div class="line"><a name="l11014"></a><span class="lineno">11014</span>&#160;                    <span class="keywordflow">if</span>(suballoc.hAllocation-&gt;CanBecomeLost() &amp;&amp;</div>
-<div class="line"><a name="l11015"></a><span class="lineno">11015</span>&#160;                        suballoc.hAllocation-&gt;GetLastUseFrameIndex() + frameInUseCount &lt; currentFrameIndex)</div>
-<div class="line"><a name="l11016"></a><span class="lineno">11016</span>&#160;                    {</div>
-<div class="line"><a name="l11017"></a><span class="lineno">11017</span>&#160;                        ++pAllocationRequest-&gt;itemsToMakeLostCount;</div>
-<div class="line"><a name="l11018"></a><span class="lineno">11018</span>&#160;                        pAllocationRequest-&gt;sumItemSize += suballoc.size;</div>
-<div class="line"><a name="l11019"></a><span class="lineno">11019</span>&#160;                    }</div>
-<div class="line"><a name="l11020"></a><span class="lineno">11020</span>&#160;                    <span class="keywordflow">else</span></div>
-<div class="line"><a name="l11021"></a><span class="lineno">11021</span>&#160;                    {</div>
-<div class="line"><a name="l11022"></a><span class="lineno">11022</span>&#160;                        <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
-<div class="line"><a name="l11023"></a><span class="lineno">11023</span>&#160;                    }</div>
-<div class="line"><a name="l11024"></a><span class="lineno">11024</span>&#160;                }</div>
-<div class="line"><a name="l11025"></a><span class="lineno">11025</span>&#160;                ++index1st;</div>
-<div class="line"><a name="l11026"></a><span class="lineno">11026</span>&#160;            }</div>
-<div class="line"><a name="l11027"></a><span class="lineno">11027</span>&#160; </div>
-<div class="line"><a name="l11028"></a><span class="lineno">11028</span>&#160;            <span class="comment">// Check next suballocations for BufferImageGranularity conflicts.</span></div>
-<div class="line"><a name="l11029"></a><span class="lineno">11029</span>&#160;            <span class="comment">// If conflict exists, we must mark more allocations lost or fail.</span></div>
-<div class="line"><a name="l11030"></a><span class="lineno">11030</span>&#160;            <span class="keywordflow">if</span>(bufferImageGranularity &gt; 1)</div>
-<div class="line"><a name="l11031"></a><span class="lineno">11031</span>&#160;            {</div>
-<div class="line"><a name="l11032"></a><span class="lineno">11032</span>&#160;                <span class="keywordflow">while</span>(index1st &lt; suballocations1st.size())</div>
-<div class="line"><a name="l11033"></a><span class="lineno">11033</span>&#160;                {</div>
-<div class="line"><a name="l11034"></a><span class="lineno">11034</span>&#160;                    <span class="keyword">const</span> VmaSuballocation&amp; suballoc = suballocations1st[index1st];</div>
-<div class="line"><a name="l11035"></a><span class="lineno">11035</span>&#160;                    <span class="keywordflow">if</span>(VmaBlocksOnSamePage(resultOffset, allocSize, suballoc.offset, bufferImageGranularity))</div>
-<div class="line"><a name="l11036"></a><span class="lineno">11036</span>&#160;                    {</div>
-<div class="line"><a name="l11037"></a><span class="lineno">11037</span>&#160;                        <span class="keywordflow">if</span>(suballoc.hAllocation != VK_NULL_HANDLE)</div>
-<div class="line"><a name="l11038"></a><span class="lineno">11038</span>&#160;                        {</div>
-<div class="line"><a name="l11039"></a><span class="lineno">11039</span>&#160;                            <span class="comment">// Not checking actual VmaIsBufferImageGranularityConflict(allocType, suballoc.type).</span></div>
-<div class="line"><a name="l11040"></a><span class="lineno">11040</span>&#160;                            <span class="keywordflow">if</span>(suballoc.hAllocation-&gt;CanBecomeLost() &amp;&amp;</div>
-<div class="line"><a name="l11041"></a><span class="lineno">11041</span>&#160;                                suballoc.hAllocation-&gt;GetLastUseFrameIndex() + frameInUseCount &lt; currentFrameIndex)</div>
-<div class="line"><a name="l11042"></a><span class="lineno">11042</span>&#160;                            {</div>
-<div class="line"><a name="l11043"></a><span class="lineno">11043</span>&#160;                                ++pAllocationRequest-&gt;itemsToMakeLostCount;</div>
-<div class="line"><a name="l11044"></a><span class="lineno">11044</span>&#160;                                pAllocationRequest-&gt;sumItemSize += suballoc.size;</div>
-<div class="line"><a name="l11045"></a><span class="lineno">11045</span>&#160;                            }</div>
-<div class="line"><a name="l11046"></a><span class="lineno">11046</span>&#160;                            <span class="keywordflow">else</span></div>
-<div class="line"><a name="l11047"></a><span class="lineno">11047</span>&#160;                            {</div>
-<div class="line"><a name="l11048"></a><span class="lineno">11048</span>&#160;                                <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
-<div class="line"><a name="l11049"></a><span class="lineno">11049</span>&#160;                            }</div>
-<div class="line"><a name="l11050"></a><span class="lineno">11050</span>&#160;                        }</div>
-<div class="line"><a name="l11051"></a><span class="lineno">11051</span>&#160;                    }</div>
-<div class="line"><a name="l11052"></a><span class="lineno">11052</span>&#160;                    <span class="keywordflow">else</span></div>
-<div class="line"><a name="l11053"></a><span class="lineno">11053</span>&#160;                    {</div>
-<div class="line"><a name="l11054"></a><span class="lineno">11054</span>&#160;                        <span class="comment">// Already on next page.</span></div>
-<div class="line"><a name="l11055"></a><span class="lineno">11055</span>&#160;                        <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l11056"></a><span class="lineno">11056</span>&#160;                    }</div>
-<div class="line"><a name="l11057"></a><span class="lineno">11057</span>&#160;                    ++index1st;</div>
-<div class="line"><a name="l11058"></a><span class="lineno">11058</span>&#160;                }</div>
-<div class="line"><a name="l11059"></a><span class="lineno">11059</span>&#160;            }</div>
-<div class="line"><a name="l11060"></a><span class="lineno">11060</span>&#160; </div>
-<div class="line"><a name="l11061"></a><span class="lineno">11061</span>&#160;            <span class="comment">// Special case: There is not enough room at the end for this allocation, even after making all from the 1st lost.</span></div>
-<div class="line"><a name="l11062"></a><span class="lineno">11062</span>&#160;            <span class="keywordflow">if</span>(index1st == suballocations1st.size() &amp;&amp;</div>
-<div class="line"><a name="l11063"></a><span class="lineno">11063</span>&#160;                resultOffset + allocSize + VMA_DEBUG_MARGIN &gt; size)</div>
-<div class="line"><a name="l11064"></a><span class="lineno">11064</span>&#160;            {</div>
-<div class="line"><a name="l11065"></a><span class="lineno">11065</span>&#160;                <span class="comment">// TODO: This is a known bug that it&#39;s not yet implemented and the allocation is failing.</span></div>
-<div class="line"><a name="l11066"></a><span class="lineno">11066</span>&#160;                VMA_DEBUG_LOG(<span class="stringliteral">&quot;Unsupported special case in custom pool with linear allocation algorithm used as ring buffer with allocations that can be lost.&quot;</span>);</div>
-<div class="line"><a name="l11067"></a><span class="lineno">11067</span>&#160;            }</div>
-<div class="line"><a name="l11068"></a><span class="lineno">11068</span>&#160;        }</div>
-<div class="line"><a name="l11069"></a><span class="lineno">11069</span>&#160; </div>
-<div class="line"><a name="l11070"></a><span class="lineno">11070</span>&#160;        <span class="comment">// There is enough free space at the end after alignment.</span></div>
-<div class="line"><a name="l11071"></a><span class="lineno">11071</span>&#160;        <span class="keywordflow">if</span>((index1st == suballocations1st.size() &amp;&amp; resultOffset + allocSize + VMA_DEBUG_MARGIN &lt;= size) ||</div>
-<div class="line"><a name="l11072"></a><span class="lineno">11072</span>&#160;            (index1st &lt; suballocations1st.size() &amp;&amp; resultOffset + allocSize + VMA_DEBUG_MARGIN &lt;= suballocations1st[index1st].offset))</div>
-<div class="line"><a name="l11073"></a><span class="lineno">11073</span>&#160;        {</div>
-<div class="line"><a name="l11074"></a><span class="lineno">11074</span>&#160;            <span class="comment">// Check next suballocations for BufferImageGranularity conflicts.</span></div>
-<div class="line"><a name="l11075"></a><span class="lineno">11075</span>&#160;            <span class="comment">// If conflict exists, allocation cannot be made here.</span></div>
-<div class="line"><a name="l11076"></a><span class="lineno">11076</span>&#160;            <span class="keywordflow">if</span>(bufferImageGranularity &gt; 1)</div>
-<div class="line"><a name="l11077"></a><span class="lineno">11077</span>&#160;            {</div>
-<div class="line"><a name="l11078"></a><span class="lineno">11078</span>&#160;                <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> nextSuballocIndex = index1st;</div>
-<div class="line"><a name="l11079"></a><span class="lineno">11079</span>&#160;                    nextSuballocIndex &lt; suballocations1st.size();</div>
-<div class="line"><a name="l11080"></a><span class="lineno">11080</span>&#160;                    nextSuballocIndex++)</div>
-<div class="line"><a name="l11081"></a><span class="lineno">11081</span>&#160;                {</div>
-<div class="line"><a name="l11082"></a><span class="lineno">11082</span>&#160;                    <span class="keyword">const</span> VmaSuballocation&amp; nextSuballoc = suballocations1st[nextSuballocIndex];</div>
-<div class="line"><a name="l11083"></a><span class="lineno">11083</span>&#160;                    <span class="keywordflow">if</span>(VmaBlocksOnSamePage(resultOffset, allocSize, nextSuballoc.offset, bufferImageGranularity))</div>
-<div class="line"><a name="l11084"></a><span class="lineno">11084</span>&#160;                    {</div>
-<div class="line"><a name="l11085"></a><span class="lineno">11085</span>&#160;                        <span class="keywordflow">if</span>(VmaIsBufferImageGranularityConflict(allocType, nextSuballoc.type))</div>
-<div class="line"><a name="l11086"></a><span class="lineno">11086</span>&#160;                        {</div>
-<div class="line"><a name="l11087"></a><span class="lineno">11087</span>&#160;                            <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
-<div class="line"><a name="l11088"></a><span class="lineno">11088</span>&#160;                        }</div>
-<div class="line"><a name="l11089"></a><span class="lineno">11089</span>&#160;                    }</div>
-<div class="line"><a name="l11090"></a><span class="lineno">11090</span>&#160;                    <span class="keywordflow">else</span></div>
-<div class="line"><a name="l11091"></a><span class="lineno">11091</span>&#160;                    {</div>
-<div class="line"><a name="l11092"></a><span class="lineno">11092</span>&#160;                        <span class="comment">// Already on next page.</span></div>
-<div class="line"><a name="l11093"></a><span class="lineno">11093</span>&#160;                        <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l11094"></a><span class="lineno">11094</span>&#160;                    }</div>
-<div class="line"><a name="l11095"></a><span class="lineno">11095</span>&#160;                }</div>
-<div class="line"><a name="l11096"></a><span class="lineno">11096</span>&#160;            }</div>
-<div class="line"><a name="l11097"></a><span class="lineno">11097</span>&#160; </div>
-<div class="line"><a name="l11098"></a><span class="lineno">11098</span>&#160;            <span class="comment">// All tests passed: Success.</span></div>
-<div class="line"><a name="l11099"></a><span class="lineno">11099</span>&#160;            pAllocationRequest-&gt;offset = resultOffset;</div>
-<div class="line"><a name="l11100"></a><span class="lineno">11100</span>&#160;            pAllocationRequest-&gt;sumFreeSize =</div>
-<div class="line"><a name="l11101"></a><span class="lineno">11101</span>&#160;                (index1st &lt; suballocations1st.size() ? suballocations1st[index1st].offset : size)</div>
-<div class="line"><a name="l11102"></a><span class="lineno">11102</span>&#160;                - resultBaseOffset</div>
-<div class="line"><a name="l11103"></a><span class="lineno">11103</span>&#160;                - pAllocationRequest-&gt;sumItemSize;</div>
-<div class="line"><a name="l11104"></a><span class="lineno">11104</span>&#160;            pAllocationRequest-&gt;type = VmaAllocationRequestType::EndOf2nd;</div>
-<div class="line"><a name="l11105"></a><span class="lineno">11105</span>&#160;            <span class="comment">// pAllocationRequest-&gt;item, customData unused.</span></div>
-<div class="line"><a name="l11106"></a><span class="lineno">11106</span>&#160;            <span class="keywordflow">return</span> <span class="keyword">true</span>;</div>
-<div class="line"><a name="l11107"></a><span class="lineno">11107</span>&#160;        }</div>
-<div class="line"><a name="l11108"></a><span class="lineno">11108</span>&#160;    }</div>
-<div class="line"><a name="l11109"></a><span class="lineno">11109</span>&#160; </div>
-<div class="line"><a name="l11110"></a><span class="lineno">11110</span>&#160;    <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
-<div class="line"><a name="l11111"></a><span class="lineno">11111</span>&#160;}</div>
-<div class="line"><a name="l11112"></a><span class="lineno">11112</span>&#160; </div>
-<div class="line"><a name="l11113"></a><span class="lineno">11113</span>&#160;<span class="keywordtype">bool</span> VmaBlockMetadata_Linear::MakeRequestedAllocationsLost(</div>
-<div class="line"><a name="l11114"></a><span class="lineno">11114</span>&#160;    uint32_t currentFrameIndex,</div>
-<div class="line"><a name="l11115"></a><span class="lineno">11115</span>&#160;    uint32_t frameInUseCount,</div>
-<div class="line"><a name="l11116"></a><span class="lineno">11116</span>&#160;    VmaAllocationRequest* pAllocationRequest)</div>
-<div class="line"><a name="l11117"></a><span class="lineno">11117</span>&#160;{</div>
-<div class="line"><a name="l11118"></a><span class="lineno">11118</span>&#160;    <span class="keywordflow">if</span>(pAllocationRequest-&gt;itemsToMakeLostCount == 0)</div>
-<div class="line"><a name="l11119"></a><span class="lineno">11119</span>&#160;    {</div>
-<div class="line"><a name="l11120"></a><span class="lineno">11120</span>&#160;        <span class="keywordflow">return</span> <span class="keyword">true</span>;</div>
-<div class="line"><a name="l11121"></a><span class="lineno">11121</span>&#160;    }</div>
-<div class="line"><a name="l11122"></a><span class="lineno">11122</span>&#160; </div>
-<div class="line"><a name="l11123"></a><span class="lineno">11123</span>&#160;    VMA_ASSERT(m_2ndVectorMode == SECOND_VECTOR_EMPTY || m_2ndVectorMode == SECOND_VECTOR_RING_BUFFER);</div>
-<div class="line"><a name="l11124"></a><span class="lineno">11124</span>&#160;    </div>
-<div class="line"><a name="l11125"></a><span class="lineno">11125</span>&#160;    <span class="comment">// We always start from 1st.</span></div>
-<div class="line"><a name="l11126"></a><span class="lineno">11126</span>&#160;    SuballocationVectorType* suballocations = &amp;AccessSuballocations1st();</div>
-<div class="line"><a name="l11127"></a><span class="lineno">11127</span>&#160;    <span class="keywordtype">size_t</span> index = m_1stNullItemsBeginCount;</div>
-<div class="line"><a name="l11128"></a><span class="lineno">11128</span>&#160;    <span class="keywordtype">size_t</span> madeLostCount = 0;</div>
-<div class="line"><a name="l11129"></a><span class="lineno">11129</span>&#160;    <span class="keywordflow">while</span>(madeLostCount &lt; pAllocationRequest-&gt;itemsToMakeLostCount)</div>
-<div class="line"><a name="l11130"></a><span class="lineno">11130</span>&#160;    {</div>
-<div class="line"><a name="l11131"></a><span class="lineno">11131</span>&#160;        <span class="keywordflow">if</span>(index == suballocations-&gt;size())</div>
-<div class="line"><a name="l11132"></a><span class="lineno">11132</span>&#160;        {</div>
-<div class="line"><a name="l11133"></a><span class="lineno">11133</span>&#160;            index = 0;</div>
-<div class="line"><a name="l11134"></a><span class="lineno">11134</span>&#160;            <span class="comment">// If we get to the end of 1st, we wrap around to beginning of 2nd of 1st.</span></div>
-<div class="line"><a name="l11135"></a><span class="lineno">11135</span>&#160;            <span class="keywordflow">if</span>(m_2ndVectorMode == SECOND_VECTOR_RING_BUFFER)</div>
-<div class="line"><a name="l11136"></a><span class="lineno">11136</span>&#160;            {</div>
-<div class="line"><a name="l11137"></a><span class="lineno">11137</span>&#160;                suballocations = &amp;AccessSuballocations2nd();</div>
-<div class="line"><a name="l11138"></a><span class="lineno">11138</span>&#160;            }</div>
-<div class="line"><a name="l11139"></a><span class="lineno">11139</span>&#160;            <span class="comment">// else: m_2ndVectorMode == SECOND_VECTOR_EMPTY:</span></div>
-<div class="line"><a name="l11140"></a><span class="lineno">11140</span>&#160;            <span class="comment">// suballocations continues pointing at AccessSuballocations1st().</span></div>
-<div class="line"><a name="l11141"></a><span class="lineno">11141</span>&#160;            VMA_ASSERT(!suballocations-&gt;empty());</div>
-<div class="line"><a name="l11142"></a><span class="lineno">11142</span>&#160;        }</div>
-<div class="line"><a name="l11143"></a><span class="lineno">11143</span>&#160;        VmaSuballocation&amp; suballoc = (*suballocations)[index];</div>
-<div class="line"><a name="l11144"></a><span class="lineno">11144</span>&#160;        <span class="keywordflow">if</span>(suballoc.type != VMA_SUBALLOCATION_TYPE_FREE)</div>
-<div class="line"><a name="l11145"></a><span class="lineno">11145</span>&#160;        {</div>
-<div class="line"><a name="l11146"></a><span class="lineno">11146</span>&#160;            VMA_ASSERT(suballoc.hAllocation != VK_NULL_HANDLE);</div>
-<div class="line"><a name="l11147"></a><span class="lineno">11147</span>&#160;            VMA_ASSERT(suballoc.hAllocation-&gt;CanBecomeLost());</div>
-<div class="line"><a name="l11148"></a><span class="lineno">11148</span>&#160;            <span class="keywordflow">if</span>(suballoc.hAllocation-&gt;MakeLost(currentFrameIndex, frameInUseCount))</div>
-<div class="line"><a name="l11149"></a><span class="lineno">11149</span>&#160;            {</div>
-<div class="line"><a name="l11150"></a><span class="lineno">11150</span>&#160;                suballoc.type = VMA_SUBALLOCATION_TYPE_FREE;</div>
-<div class="line"><a name="l11151"></a><span class="lineno">11151</span>&#160;                suballoc.hAllocation = VK_NULL_HANDLE;</div>
-<div class="line"><a name="l11152"></a><span class="lineno">11152</span>&#160;                m_SumFreeSize += suballoc.size;</div>
-<div class="line"><a name="l11153"></a><span class="lineno">11153</span>&#160;                <span class="keywordflow">if</span>(suballocations == &amp;AccessSuballocations1st())</div>
-<div class="line"><a name="l11154"></a><span class="lineno">11154</span>&#160;                {</div>
-<div class="line"><a name="l11155"></a><span class="lineno">11155</span>&#160;                    ++m_1stNullItemsMiddleCount;</div>
-<div class="line"><a name="l11156"></a><span class="lineno">11156</span>&#160;                }</div>
-<div class="line"><a name="l11157"></a><span class="lineno">11157</span>&#160;                <span class="keywordflow">else</span></div>
-<div class="line"><a name="l11158"></a><span class="lineno">11158</span>&#160;                {</div>
-<div class="line"><a name="l11159"></a><span class="lineno">11159</span>&#160;                    ++m_2ndNullItemsCount;</div>
-<div class="line"><a name="l11160"></a><span class="lineno">11160</span>&#160;                }</div>
-<div class="line"><a name="l11161"></a><span class="lineno">11161</span>&#160;                ++madeLostCount;</div>
-<div class="line"><a name="l11162"></a><span class="lineno">11162</span>&#160;            }</div>
-<div class="line"><a name="l11163"></a><span class="lineno">11163</span>&#160;            <span class="keywordflow">else</span></div>
-<div class="line"><a name="l11164"></a><span class="lineno">11164</span>&#160;            {</div>
-<div class="line"><a name="l11165"></a><span class="lineno">11165</span>&#160;                <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
-<div class="line"><a name="l11166"></a><span class="lineno">11166</span>&#160;            }</div>
-<div class="line"><a name="l11167"></a><span class="lineno">11167</span>&#160;        }</div>
-<div class="line"><a name="l11168"></a><span class="lineno">11168</span>&#160;        ++index;</div>
-<div class="line"><a name="l11169"></a><span class="lineno">11169</span>&#160;    }</div>
-<div class="line"><a name="l11170"></a><span class="lineno">11170</span>&#160; </div>
-<div class="line"><a name="l11171"></a><span class="lineno">11171</span>&#160;    CleanupAfterFree();</div>
-<div class="line"><a name="l11172"></a><span class="lineno">11172</span>&#160;    <span class="comment">//VMA_HEAVY_ASSERT(Validate()); // Already called by ClanupAfterFree().</span></div>
-<div class="line"><a name="l11173"></a><span class="lineno">11173</span>&#160;    </div>
-<div class="line"><a name="l11174"></a><span class="lineno">11174</span>&#160;    <span class="keywordflow">return</span> <span class="keyword">true</span>;</div>
-<div class="line"><a name="l11175"></a><span class="lineno">11175</span>&#160;}</div>
-<div class="line"><a name="l11176"></a><span class="lineno">11176</span>&#160; </div>
-<div class="line"><a name="l11177"></a><span class="lineno">11177</span>&#160;uint32_t VmaBlockMetadata_Linear::MakeAllocationsLost(uint32_t currentFrameIndex, uint32_t frameInUseCount)</div>
-<div class="line"><a name="l11178"></a><span class="lineno">11178</span>&#160;{</div>
-<div class="line"><a name="l11179"></a><span class="lineno">11179</span>&#160;    uint32_t lostAllocationCount = 0;</div>
-<div class="line"><a name="l11180"></a><span class="lineno">11180</span>&#160;    </div>
-<div class="line"><a name="l11181"></a><span class="lineno">11181</span>&#160;    SuballocationVectorType&amp; suballocations1st = AccessSuballocations1st();</div>
-<div class="line"><a name="l11182"></a><span class="lineno">11182</span>&#160;    <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> i = m_1stNullItemsBeginCount, count = suballocations1st.size(); i &lt; count; ++i)</div>
-<div class="line"><a name="l11183"></a><span class="lineno">11183</span>&#160;    {</div>
-<div class="line"><a name="l11184"></a><span class="lineno">11184</span>&#160;        VmaSuballocation&amp; suballoc = suballocations1st[i];</div>
-<div class="line"><a name="l11185"></a><span class="lineno">11185</span>&#160;        <span class="keywordflow">if</span>(suballoc.type != VMA_SUBALLOCATION_TYPE_FREE &amp;&amp;</div>
-<div class="line"><a name="l11186"></a><span class="lineno">11186</span>&#160;            suballoc.hAllocation-&gt;CanBecomeLost() &amp;&amp;</div>
-<div class="line"><a name="l11187"></a><span class="lineno">11187</span>&#160;            suballoc.hAllocation-&gt;MakeLost(currentFrameIndex, frameInUseCount))</div>
-<div class="line"><a name="l11188"></a><span class="lineno">11188</span>&#160;        {</div>
-<div class="line"><a name="l11189"></a><span class="lineno">11189</span>&#160;            suballoc.type = VMA_SUBALLOCATION_TYPE_FREE;</div>
-<div class="line"><a name="l11190"></a><span class="lineno">11190</span>&#160;            suballoc.hAllocation = VK_NULL_HANDLE;</div>
-<div class="line"><a name="l11191"></a><span class="lineno">11191</span>&#160;            ++m_1stNullItemsMiddleCount;</div>
-<div class="line"><a name="l11192"></a><span class="lineno">11192</span>&#160;            m_SumFreeSize += suballoc.size;</div>
-<div class="line"><a name="l11193"></a><span class="lineno">11193</span>&#160;            ++lostAllocationCount;</div>
-<div class="line"><a name="l11194"></a><span class="lineno">11194</span>&#160;        }</div>
-<div class="line"><a name="l11195"></a><span class="lineno">11195</span>&#160;    }</div>
-<div class="line"><a name="l11196"></a><span class="lineno">11196</span>&#160; </div>
-<div class="line"><a name="l11197"></a><span class="lineno">11197</span>&#160;    SuballocationVectorType&amp; suballocations2nd = AccessSuballocations2nd();</div>
-<div class="line"><a name="l11198"></a><span class="lineno">11198</span>&#160;    <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> i = 0, count = suballocations2nd.size(); i &lt; count; ++i)</div>
-<div class="line"><a name="l11199"></a><span class="lineno">11199</span>&#160;    {</div>
-<div class="line"><a name="l11200"></a><span class="lineno">11200</span>&#160;        VmaSuballocation&amp; suballoc = suballocations2nd[i];</div>
-<div class="line"><a name="l11201"></a><span class="lineno">11201</span>&#160;        <span class="keywordflow">if</span>(suballoc.type != VMA_SUBALLOCATION_TYPE_FREE &amp;&amp;</div>
-<div class="line"><a name="l11202"></a><span class="lineno">11202</span>&#160;            suballoc.hAllocation-&gt;CanBecomeLost() &amp;&amp;</div>
-<div class="line"><a name="l11203"></a><span class="lineno">11203</span>&#160;            suballoc.hAllocation-&gt;MakeLost(currentFrameIndex, frameInUseCount))</div>
-<div class="line"><a name="l11204"></a><span class="lineno">11204</span>&#160;        {</div>
-<div class="line"><a name="l11205"></a><span class="lineno">11205</span>&#160;            suballoc.type = VMA_SUBALLOCATION_TYPE_FREE;</div>
-<div class="line"><a name="l11206"></a><span class="lineno">11206</span>&#160;            suballoc.hAllocation = VK_NULL_HANDLE;</div>
-<div class="line"><a name="l11207"></a><span class="lineno">11207</span>&#160;            ++m_2ndNullItemsCount;</div>
-<div class="line"><a name="l11208"></a><span class="lineno">11208</span>&#160;            m_SumFreeSize += suballoc.size;</div>
-<div class="line"><a name="l11209"></a><span class="lineno">11209</span>&#160;            ++lostAllocationCount;</div>
-<div class="line"><a name="l11210"></a><span class="lineno">11210</span>&#160;        }</div>
-<div class="line"><a name="l11211"></a><span class="lineno">11211</span>&#160;    }</div>
-<div class="line"><a name="l11212"></a><span class="lineno">11212</span>&#160; </div>
-<div class="line"><a name="l11213"></a><span class="lineno">11213</span>&#160;    <span class="keywordflow">if</span>(lostAllocationCount)</div>
-<div class="line"><a name="l11214"></a><span class="lineno">11214</span>&#160;    {</div>
-<div class="line"><a name="l11215"></a><span class="lineno">11215</span>&#160;        CleanupAfterFree();</div>
-<div class="line"><a name="l11216"></a><span class="lineno">11216</span>&#160;    }</div>
-<div class="line"><a name="l11217"></a><span class="lineno">11217</span>&#160; </div>
-<div class="line"><a name="l11218"></a><span class="lineno">11218</span>&#160;    <span class="keywordflow">return</span> lostAllocationCount;</div>
+<div class="line"><a name="l11013"></a><span class="lineno">11013</span>&#160;                    <span class="comment">// There is free space from lastOffset to suballoc.offset.</span></div>
+<div class="line"><a name="l11014"></a><span class="lineno">11014</span>&#160;                    ++unusedRangeCount;</div>
+<div class="line"><a name="l11015"></a><span class="lineno">11015</span>&#160;                }</div>
+<div class="line"><a name="l11016"></a><span class="lineno">11016</span>&#160; </div>
+<div class="line"><a name="l11017"></a><span class="lineno">11017</span>&#160;                <span class="comment">// 2. Process this allocation.</span></div>
+<div class="line"><a name="l11018"></a><span class="lineno">11018</span>&#160;                <span class="comment">// There is allocation with suballoc.offset, suballoc.size.</span></div>
+<div class="line"><a name="l11019"></a><span class="lineno">11019</span>&#160;                ++alloc2ndCount;</div>
+<div class="line"><a name="l11020"></a><span class="lineno">11020</span>&#160;                usedBytes += suballoc.size;</div>
+<div class="line"><a name="l11021"></a><span class="lineno">11021</span>&#160; </div>
+<div class="line"><a name="l11022"></a><span class="lineno">11022</span>&#160;                <span class="comment">// 3. Prepare for next iteration.</span></div>
+<div class="line"><a name="l11023"></a><span class="lineno">11023</span>&#160;                lastOffset = suballoc.offset + suballoc.size;</div>
+<div class="line"><a name="l11024"></a><span class="lineno">11024</span>&#160;                --nextAlloc2ndIndex;</div>
+<div class="line"><a name="l11025"></a><span class="lineno">11025</span>&#160;            }</div>
+<div class="line"><a name="l11026"></a><span class="lineno">11026</span>&#160;            <span class="comment">// We are at the end.</span></div>
+<div class="line"><a name="l11027"></a><span class="lineno">11027</span>&#160;            <span class="keywordflow">else</span></div>
+<div class="line"><a name="l11028"></a><span class="lineno">11028</span>&#160;            {</div>
+<div class="line"><a name="l11029"></a><span class="lineno">11029</span>&#160;                <span class="keywordflow">if</span>(lastOffset &lt; size)</div>
+<div class="line"><a name="l11030"></a><span class="lineno">11030</span>&#160;                {</div>
+<div class="line"><a name="l11031"></a><span class="lineno">11031</span>&#160;                    <span class="comment">// There is free space from lastOffset to size.</span></div>
+<div class="line"><a name="l11032"></a><span class="lineno">11032</span>&#160;                    ++unusedRangeCount;</div>
+<div class="line"><a name="l11033"></a><span class="lineno">11033</span>&#160;                }</div>
+<div class="line"><a name="l11034"></a><span class="lineno">11034</span>&#160; </div>
+<div class="line"><a name="l11035"></a><span class="lineno">11035</span>&#160;                <span class="comment">// End of loop.</span></div>
+<div class="line"><a name="l11036"></a><span class="lineno">11036</span>&#160;                lastOffset = size;</div>
+<div class="line"><a name="l11037"></a><span class="lineno">11037</span>&#160;            }</div>
+<div class="line"><a name="l11038"></a><span class="lineno">11038</span>&#160;        }</div>
+<div class="line"><a name="l11039"></a><span class="lineno">11039</span>&#160;    }</div>
+<div class="line"><a name="l11040"></a><span class="lineno">11040</span>&#160; </div>
+<div class="line"><a name="l11041"></a><span class="lineno">11041</span>&#160;    <span class="keyword">const</span> VkDeviceSize unusedBytes = size - usedBytes;</div>
+<div class="line"><a name="l11042"></a><span class="lineno">11042</span>&#160;    PrintDetailedMap_Begin(json, unusedBytes, alloc1stCount + alloc2ndCount, unusedRangeCount);</div>
+<div class="line"><a name="l11043"></a><span class="lineno">11043</span>&#160; </div>
+<div class="line"><a name="l11044"></a><span class="lineno">11044</span>&#160;    <span class="comment">// SECOND PASS</span></div>
+<div class="line"><a name="l11045"></a><span class="lineno">11045</span>&#160;    lastOffset = 0;</div>
+<div class="line"><a name="l11046"></a><span class="lineno">11046</span>&#160; </div>
+<div class="line"><a name="l11047"></a><span class="lineno">11047</span>&#160;    <span class="keywordflow">if</span>(m_2ndVectorMode == SECOND_VECTOR_RING_BUFFER)</div>
+<div class="line"><a name="l11048"></a><span class="lineno">11048</span>&#160;    {</div>
+<div class="line"><a name="l11049"></a><span class="lineno">11049</span>&#160;        <span class="keyword">const</span> VkDeviceSize freeSpace2ndTo1stEnd = suballocations1st[m_1stNullItemsBeginCount].offset;</div>
+<div class="line"><a name="l11050"></a><span class="lineno">11050</span>&#160;        <span class="keywordtype">size_t</span> nextAlloc2ndIndex = 0;</div>
+<div class="line"><a name="l11051"></a><span class="lineno">11051</span>&#160;        <span class="keywordflow">while</span>(lastOffset &lt; freeSpace2ndTo1stEnd)</div>
+<div class="line"><a name="l11052"></a><span class="lineno">11052</span>&#160;        {</div>
+<div class="line"><a name="l11053"></a><span class="lineno">11053</span>&#160;            <span class="comment">// Find next non-null allocation or move nextAlloc2ndIndex to the end.</span></div>
+<div class="line"><a name="l11054"></a><span class="lineno">11054</span>&#160;            <span class="keywordflow">while</span>(nextAlloc2ndIndex &lt; suballoc2ndCount &amp;&amp;</div>
+<div class="line"><a name="l11055"></a><span class="lineno">11055</span>&#160;                suballocations2nd[nextAlloc2ndIndex].hAllocation == VK_NULL_HANDLE)</div>
+<div class="line"><a name="l11056"></a><span class="lineno">11056</span>&#160;            {</div>
+<div class="line"><a name="l11057"></a><span class="lineno">11057</span>&#160;                ++nextAlloc2ndIndex;</div>
+<div class="line"><a name="l11058"></a><span class="lineno">11058</span>&#160;            }</div>
+<div class="line"><a name="l11059"></a><span class="lineno">11059</span>&#160; </div>
+<div class="line"><a name="l11060"></a><span class="lineno">11060</span>&#160;            <span class="comment">// Found non-null allocation.</span></div>
+<div class="line"><a name="l11061"></a><span class="lineno">11061</span>&#160;            <span class="keywordflow">if</span>(nextAlloc2ndIndex &lt; suballoc2ndCount)</div>
+<div class="line"><a name="l11062"></a><span class="lineno">11062</span>&#160;            {</div>
+<div class="line"><a name="l11063"></a><span class="lineno">11063</span>&#160;                <span class="keyword">const</span> VmaSuballocation&amp; suballoc = suballocations2nd[nextAlloc2ndIndex];</div>
+<div class="line"><a name="l11064"></a><span class="lineno">11064</span>&#160; </div>
+<div class="line"><a name="l11065"></a><span class="lineno">11065</span>&#160;                <span class="comment">// 1. Process free space before this allocation.</span></div>
+<div class="line"><a name="l11066"></a><span class="lineno">11066</span>&#160;                <span class="keywordflow">if</span>(lastOffset &lt; suballoc.offset)</div>
+<div class="line"><a name="l11067"></a><span class="lineno">11067</span>&#160;                {</div>
+<div class="line"><a name="l11068"></a><span class="lineno">11068</span>&#160;                    <span class="comment">// There is free space from lastOffset to suballoc.offset.</span></div>
+<div class="line"><a name="l11069"></a><span class="lineno">11069</span>&#160;                    <span class="keyword">const</span> VkDeviceSize unusedRangeSize = suballoc.offset - lastOffset;</div>
+<div class="line"><a name="l11070"></a><span class="lineno">11070</span>&#160;                    PrintDetailedMap_UnusedRange(json, lastOffset, unusedRangeSize);</div>
+<div class="line"><a name="l11071"></a><span class="lineno">11071</span>&#160;                }</div>
+<div class="line"><a name="l11072"></a><span class="lineno">11072</span>&#160; </div>
+<div class="line"><a name="l11073"></a><span class="lineno">11073</span>&#160;                <span class="comment">// 2. Process this allocation.</span></div>
+<div class="line"><a name="l11074"></a><span class="lineno">11074</span>&#160;                <span class="comment">// There is allocation with suballoc.offset, suballoc.size.</span></div>
+<div class="line"><a name="l11075"></a><span class="lineno">11075</span>&#160;                PrintDetailedMap_Allocation(json, suballoc.offset, suballoc.hAllocation);</div>
+<div class="line"><a name="l11076"></a><span class="lineno">11076</span>&#160; </div>
+<div class="line"><a name="l11077"></a><span class="lineno">11077</span>&#160;                <span class="comment">// 3. Prepare for next iteration.</span></div>
+<div class="line"><a name="l11078"></a><span class="lineno">11078</span>&#160;                lastOffset = suballoc.offset + suballoc.size;</div>
+<div class="line"><a name="l11079"></a><span class="lineno">11079</span>&#160;                ++nextAlloc2ndIndex;</div>
+<div class="line"><a name="l11080"></a><span class="lineno">11080</span>&#160;            }</div>
+<div class="line"><a name="l11081"></a><span class="lineno">11081</span>&#160;            <span class="comment">// We are at the end.</span></div>
+<div class="line"><a name="l11082"></a><span class="lineno">11082</span>&#160;            <span class="keywordflow">else</span></div>
+<div class="line"><a name="l11083"></a><span class="lineno">11083</span>&#160;            {</div>
+<div class="line"><a name="l11084"></a><span class="lineno">11084</span>&#160;                <span class="keywordflow">if</span>(lastOffset &lt; freeSpace2ndTo1stEnd)</div>
+<div class="line"><a name="l11085"></a><span class="lineno">11085</span>&#160;                {</div>
+<div class="line"><a name="l11086"></a><span class="lineno">11086</span>&#160;                    <span class="comment">// There is free space from lastOffset to freeSpace2ndTo1stEnd.</span></div>
+<div class="line"><a name="l11087"></a><span class="lineno">11087</span>&#160;                    <span class="keyword">const</span> VkDeviceSize unusedRangeSize = freeSpace2ndTo1stEnd - lastOffset;</div>
+<div class="line"><a name="l11088"></a><span class="lineno">11088</span>&#160;                    PrintDetailedMap_UnusedRange(json, lastOffset, unusedRangeSize);</div>
+<div class="line"><a name="l11089"></a><span class="lineno">11089</span>&#160;                }</div>
+<div class="line"><a name="l11090"></a><span class="lineno">11090</span>&#160; </div>
+<div class="line"><a name="l11091"></a><span class="lineno">11091</span>&#160;                <span class="comment">// End of loop.</span></div>
+<div class="line"><a name="l11092"></a><span class="lineno">11092</span>&#160;                lastOffset = freeSpace2ndTo1stEnd;</div>
+<div class="line"><a name="l11093"></a><span class="lineno">11093</span>&#160;            }</div>
+<div class="line"><a name="l11094"></a><span class="lineno">11094</span>&#160;        }</div>
+<div class="line"><a name="l11095"></a><span class="lineno">11095</span>&#160;    }</div>
+<div class="line"><a name="l11096"></a><span class="lineno">11096</span>&#160; </div>
+<div class="line"><a name="l11097"></a><span class="lineno">11097</span>&#160;    nextAlloc1stIndex = m_1stNullItemsBeginCount;</div>
+<div class="line"><a name="l11098"></a><span class="lineno">11098</span>&#160;    <span class="keywordflow">while</span>(lastOffset &lt; freeSpace1stTo2ndEnd)</div>
+<div class="line"><a name="l11099"></a><span class="lineno">11099</span>&#160;    {</div>
+<div class="line"><a name="l11100"></a><span class="lineno">11100</span>&#160;        <span class="comment">// Find next non-null allocation or move nextAllocIndex to the end.</span></div>
+<div class="line"><a name="l11101"></a><span class="lineno">11101</span>&#160;        <span class="keywordflow">while</span>(nextAlloc1stIndex &lt; suballoc1stCount &amp;&amp;</div>
+<div class="line"><a name="l11102"></a><span class="lineno">11102</span>&#160;            suballocations1st[nextAlloc1stIndex].hAllocation == VK_NULL_HANDLE)</div>
+<div class="line"><a name="l11103"></a><span class="lineno">11103</span>&#160;        {</div>
+<div class="line"><a name="l11104"></a><span class="lineno">11104</span>&#160;            ++nextAlloc1stIndex;</div>
+<div class="line"><a name="l11105"></a><span class="lineno">11105</span>&#160;        }</div>
+<div class="line"><a name="l11106"></a><span class="lineno">11106</span>&#160; </div>
+<div class="line"><a name="l11107"></a><span class="lineno">11107</span>&#160;        <span class="comment">// Found non-null allocation.</span></div>
+<div class="line"><a name="l11108"></a><span class="lineno">11108</span>&#160;        <span class="keywordflow">if</span>(nextAlloc1stIndex &lt; suballoc1stCount)</div>
+<div class="line"><a name="l11109"></a><span class="lineno">11109</span>&#160;        {</div>
+<div class="line"><a name="l11110"></a><span class="lineno">11110</span>&#160;            <span class="keyword">const</span> VmaSuballocation&amp; suballoc = suballocations1st[nextAlloc1stIndex];</div>
+<div class="line"><a name="l11111"></a><span class="lineno">11111</span>&#160; </div>
+<div class="line"><a name="l11112"></a><span class="lineno">11112</span>&#160;            <span class="comment">// 1. Process free space before this allocation.</span></div>
+<div class="line"><a name="l11113"></a><span class="lineno">11113</span>&#160;            <span class="keywordflow">if</span>(lastOffset &lt; suballoc.offset)</div>
+<div class="line"><a name="l11114"></a><span class="lineno">11114</span>&#160;            {</div>
+<div class="line"><a name="l11115"></a><span class="lineno">11115</span>&#160;                <span class="comment">// There is free space from lastOffset to suballoc.offset.</span></div>
+<div class="line"><a name="l11116"></a><span class="lineno">11116</span>&#160;                <span class="keyword">const</span> VkDeviceSize unusedRangeSize = suballoc.offset - lastOffset;</div>
+<div class="line"><a name="l11117"></a><span class="lineno">11117</span>&#160;                PrintDetailedMap_UnusedRange(json, lastOffset, unusedRangeSize);</div>
+<div class="line"><a name="l11118"></a><span class="lineno">11118</span>&#160;            }</div>
+<div class="line"><a name="l11119"></a><span class="lineno">11119</span>&#160; </div>
+<div class="line"><a name="l11120"></a><span class="lineno">11120</span>&#160;            <span class="comment">// 2. Process this allocation.</span></div>
+<div class="line"><a name="l11121"></a><span class="lineno">11121</span>&#160;            <span class="comment">// There is allocation with suballoc.offset, suballoc.size.</span></div>
+<div class="line"><a name="l11122"></a><span class="lineno">11122</span>&#160;            PrintDetailedMap_Allocation(json, suballoc.offset, suballoc.hAllocation);</div>
+<div class="line"><a name="l11123"></a><span class="lineno">11123</span>&#160; </div>
+<div class="line"><a name="l11124"></a><span class="lineno">11124</span>&#160;            <span class="comment">// 3. Prepare for next iteration.</span></div>
+<div class="line"><a name="l11125"></a><span class="lineno">11125</span>&#160;            lastOffset = suballoc.offset + suballoc.size;</div>
+<div class="line"><a name="l11126"></a><span class="lineno">11126</span>&#160;            ++nextAlloc1stIndex;</div>
+<div class="line"><a name="l11127"></a><span class="lineno">11127</span>&#160;        }</div>
+<div class="line"><a name="l11128"></a><span class="lineno">11128</span>&#160;        <span class="comment">// We are at the end.</span></div>
+<div class="line"><a name="l11129"></a><span class="lineno">11129</span>&#160;        <span class="keywordflow">else</span></div>
+<div class="line"><a name="l11130"></a><span class="lineno">11130</span>&#160;        {</div>
+<div class="line"><a name="l11131"></a><span class="lineno">11131</span>&#160;            <span class="keywordflow">if</span>(lastOffset &lt; freeSpace1stTo2ndEnd)</div>
+<div class="line"><a name="l11132"></a><span class="lineno">11132</span>&#160;            {</div>
+<div class="line"><a name="l11133"></a><span class="lineno">11133</span>&#160;                <span class="comment">// There is free space from lastOffset to freeSpace1stTo2ndEnd.</span></div>
+<div class="line"><a name="l11134"></a><span class="lineno">11134</span>&#160;                <span class="keyword">const</span> VkDeviceSize unusedRangeSize = freeSpace1stTo2ndEnd - lastOffset;</div>
+<div class="line"><a name="l11135"></a><span class="lineno">11135</span>&#160;                PrintDetailedMap_UnusedRange(json, lastOffset, unusedRangeSize);</div>
+<div class="line"><a name="l11136"></a><span class="lineno">11136</span>&#160;            }</div>
+<div class="line"><a name="l11137"></a><span class="lineno">11137</span>&#160; </div>
+<div class="line"><a name="l11138"></a><span class="lineno">11138</span>&#160;            <span class="comment">// End of loop.</span></div>
+<div class="line"><a name="l11139"></a><span class="lineno">11139</span>&#160;            lastOffset = freeSpace1stTo2ndEnd;</div>
+<div class="line"><a name="l11140"></a><span class="lineno">11140</span>&#160;        }</div>
+<div class="line"><a name="l11141"></a><span class="lineno">11141</span>&#160;    }</div>
+<div class="line"><a name="l11142"></a><span class="lineno">11142</span>&#160; </div>
+<div class="line"><a name="l11143"></a><span class="lineno">11143</span>&#160;    <span class="keywordflow">if</span>(m_2ndVectorMode == SECOND_VECTOR_DOUBLE_STACK)</div>
+<div class="line"><a name="l11144"></a><span class="lineno">11144</span>&#160;    {</div>
+<div class="line"><a name="l11145"></a><span class="lineno">11145</span>&#160;        <span class="keywordtype">size_t</span> nextAlloc2ndIndex = suballocations2nd.size() - 1;</div>
+<div class="line"><a name="l11146"></a><span class="lineno">11146</span>&#160;        <span class="keywordflow">while</span>(lastOffset &lt; size)</div>
+<div class="line"><a name="l11147"></a><span class="lineno">11147</span>&#160;        {</div>
+<div class="line"><a name="l11148"></a><span class="lineno">11148</span>&#160;            <span class="comment">// Find next non-null allocation or move nextAlloc2ndIndex to the end.</span></div>
+<div class="line"><a name="l11149"></a><span class="lineno">11149</span>&#160;            <span class="keywordflow">while</span>(nextAlloc2ndIndex != SIZE_MAX &amp;&amp;</div>
+<div class="line"><a name="l11150"></a><span class="lineno">11150</span>&#160;                suballocations2nd[nextAlloc2ndIndex].hAllocation == VK_NULL_HANDLE)</div>
+<div class="line"><a name="l11151"></a><span class="lineno">11151</span>&#160;            {</div>
+<div class="line"><a name="l11152"></a><span class="lineno">11152</span>&#160;                --nextAlloc2ndIndex;</div>
+<div class="line"><a name="l11153"></a><span class="lineno">11153</span>&#160;            }</div>
+<div class="line"><a name="l11154"></a><span class="lineno">11154</span>&#160; </div>
+<div class="line"><a name="l11155"></a><span class="lineno">11155</span>&#160;            <span class="comment">// Found non-null allocation.</span></div>
+<div class="line"><a name="l11156"></a><span class="lineno">11156</span>&#160;            <span class="keywordflow">if</span>(nextAlloc2ndIndex != SIZE_MAX)</div>
+<div class="line"><a name="l11157"></a><span class="lineno">11157</span>&#160;            {</div>
+<div class="line"><a name="l11158"></a><span class="lineno">11158</span>&#160;                <span class="keyword">const</span> VmaSuballocation&amp; suballoc = suballocations2nd[nextAlloc2ndIndex];</div>
+<div class="line"><a name="l11159"></a><span class="lineno">11159</span>&#160; </div>
+<div class="line"><a name="l11160"></a><span class="lineno">11160</span>&#160;                <span class="comment">// 1. Process free space before this allocation.</span></div>
+<div class="line"><a name="l11161"></a><span class="lineno">11161</span>&#160;                <span class="keywordflow">if</span>(lastOffset &lt; suballoc.offset)</div>
+<div class="line"><a name="l11162"></a><span class="lineno">11162</span>&#160;                {</div>
+<div class="line"><a name="l11163"></a><span class="lineno">11163</span>&#160;                    <span class="comment">// There is free space from lastOffset to suballoc.offset.</span></div>
+<div class="line"><a name="l11164"></a><span class="lineno">11164</span>&#160;                    <span class="keyword">const</span> VkDeviceSize unusedRangeSize = suballoc.offset - lastOffset;</div>
+<div class="line"><a name="l11165"></a><span class="lineno">11165</span>&#160;                    PrintDetailedMap_UnusedRange(json, lastOffset, unusedRangeSize);</div>
+<div class="line"><a name="l11166"></a><span class="lineno">11166</span>&#160;                }</div>
+<div class="line"><a name="l11167"></a><span class="lineno">11167</span>&#160; </div>
+<div class="line"><a name="l11168"></a><span class="lineno">11168</span>&#160;                <span class="comment">// 2. Process this allocation.</span></div>
+<div class="line"><a name="l11169"></a><span class="lineno">11169</span>&#160;                <span class="comment">// There is allocation with suballoc.offset, suballoc.size.</span></div>
+<div class="line"><a name="l11170"></a><span class="lineno">11170</span>&#160;                PrintDetailedMap_Allocation(json, suballoc.offset, suballoc.hAllocation);</div>
+<div class="line"><a name="l11171"></a><span class="lineno">11171</span>&#160; </div>
+<div class="line"><a name="l11172"></a><span class="lineno">11172</span>&#160;                <span class="comment">// 3. Prepare for next iteration.</span></div>
+<div class="line"><a name="l11173"></a><span class="lineno">11173</span>&#160;                lastOffset = suballoc.offset + suballoc.size;</div>
+<div class="line"><a name="l11174"></a><span class="lineno">11174</span>&#160;                --nextAlloc2ndIndex;</div>
+<div class="line"><a name="l11175"></a><span class="lineno">11175</span>&#160;            }</div>
+<div class="line"><a name="l11176"></a><span class="lineno">11176</span>&#160;            <span class="comment">// We are at the end.</span></div>
+<div class="line"><a name="l11177"></a><span class="lineno">11177</span>&#160;            <span class="keywordflow">else</span></div>
+<div class="line"><a name="l11178"></a><span class="lineno">11178</span>&#160;            {</div>
+<div class="line"><a name="l11179"></a><span class="lineno">11179</span>&#160;                <span class="keywordflow">if</span>(lastOffset &lt; size)</div>
+<div class="line"><a name="l11180"></a><span class="lineno">11180</span>&#160;                {</div>
+<div class="line"><a name="l11181"></a><span class="lineno">11181</span>&#160;                    <span class="comment">// There is free space from lastOffset to size.</span></div>
+<div class="line"><a name="l11182"></a><span class="lineno">11182</span>&#160;                    <span class="keyword">const</span> VkDeviceSize unusedRangeSize = size - lastOffset;</div>
+<div class="line"><a name="l11183"></a><span class="lineno">11183</span>&#160;                    PrintDetailedMap_UnusedRange(json, lastOffset, unusedRangeSize);</div>
+<div class="line"><a name="l11184"></a><span class="lineno">11184</span>&#160;                }</div>
+<div class="line"><a name="l11185"></a><span class="lineno">11185</span>&#160; </div>
+<div class="line"><a name="l11186"></a><span class="lineno">11186</span>&#160;                <span class="comment">// End of loop.</span></div>
+<div class="line"><a name="l11187"></a><span class="lineno">11187</span>&#160;                lastOffset = size;</div>
+<div class="line"><a name="l11188"></a><span class="lineno">11188</span>&#160;            }</div>
+<div class="line"><a name="l11189"></a><span class="lineno">11189</span>&#160;        }</div>
+<div class="line"><a name="l11190"></a><span class="lineno">11190</span>&#160;    }</div>
+<div class="line"><a name="l11191"></a><span class="lineno">11191</span>&#160; </div>
+<div class="line"><a name="l11192"></a><span class="lineno">11192</span>&#160;    PrintDetailedMap_End(json);</div>
+<div class="line"><a name="l11193"></a><span class="lineno">11193</span>&#160;}</div>
+<div class="line"><a name="l11194"></a><span class="lineno">11194</span>&#160;<span class="preprocessor">#endif </span><span class="comment">// #if VMA_STATS_STRING_ENABLED</span></div>
+<div class="line"><a name="l11195"></a><span class="lineno">11195</span>&#160; </div>
+<div class="line"><a name="l11196"></a><span class="lineno">11196</span>&#160;<span class="keywordtype">bool</span> VmaBlockMetadata_Linear::CreateAllocationRequest(</div>
+<div class="line"><a name="l11197"></a><span class="lineno">11197</span>&#160;    uint32_t currentFrameIndex,</div>
+<div class="line"><a name="l11198"></a><span class="lineno">11198</span>&#160;    uint32_t frameInUseCount,</div>
+<div class="line"><a name="l11199"></a><span class="lineno">11199</span>&#160;    VkDeviceSize bufferImageGranularity,</div>
+<div class="line"><a name="l11200"></a><span class="lineno">11200</span>&#160;    VkDeviceSize allocSize,</div>
+<div class="line"><a name="l11201"></a><span class="lineno">11201</span>&#160;    VkDeviceSize allocAlignment,</div>
+<div class="line"><a name="l11202"></a><span class="lineno">11202</span>&#160;    <span class="keywordtype">bool</span> upperAddress,</div>
+<div class="line"><a name="l11203"></a><span class="lineno">11203</span>&#160;    VmaSuballocationType allocType,</div>
+<div class="line"><a name="l11204"></a><span class="lineno">11204</span>&#160;    <span class="keywordtype">bool</span> canMakeOtherLost,</div>
+<div class="line"><a name="l11205"></a><span class="lineno">11205</span>&#160;    uint32_t strategy,</div>
+<div class="line"><a name="l11206"></a><span class="lineno">11206</span>&#160;    VmaAllocationRequest* pAllocationRequest)</div>
+<div class="line"><a name="l11207"></a><span class="lineno">11207</span>&#160;{</div>
+<div class="line"><a name="l11208"></a><span class="lineno">11208</span>&#160;    VMA_ASSERT(allocSize &gt; 0);</div>
+<div class="line"><a name="l11209"></a><span class="lineno">11209</span>&#160;    VMA_ASSERT(allocType != VMA_SUBALLOCATION_TYPE_FREE);</div>
+<div class="line"><a name="l11210"></a><span class="lineno">11210</span>&#160;    VMA_ASSERT(pAllocationRequest != VMA_NULL);</div>
+<div class="line"><a name="l11211"></a><span class="lineno">11211</span>&#160;    VMA_HEAVY_ASSERT(Validate());</div>
+<div class="line"><a name="l11212"></a><span class="lineno">11212</span>&#160;    <span class="keywordflow">return</span> upperAddress ?</div>
+<div class="line"><a name="l11213"></a><span class="lineno">11213</span>&#160;        CreateAllocationRequest_UpperAddress(</div>
+<div class="line"><a name="l11214"></a><span class="lineno">11214</span>&#160;            currentFrameIndex, frameInUseCount, bufferImageGranularity,</div>
+<div class="line"><a name="l11215"></a><span class="lineno">11215</span>&#160;            allocSize, allocAlignment, allocType, canMakeOtherLost, strategy, pAllocationRequest) :</div>
+<div class="line"><a name="l11216"></a><span class="lineno">11216</span>&#160;        CreateAllocationRequest_LowerAddress(</div>
+<div class="line"><a name="l11217"></a><span class="lineno">11217</span>&#160;            currentFrameIndex, frameInUseCount, bufferImageGranularity,</div>
+<div class="line"><a name="l11218"></a><span class="lineno">11218</span>&#160;            allocSize, allocAlignment, allocType, canMakeOtherLost, strategy, pAllocationRequest);</div>
 <div class="line"><a name="l11219"></a><span class="lineno">11219</span>&#160;}</div>
 <div class="line"><a name="l11220"></a><span class="lineno">11220</span>&#160; </div>
-<div class="line"><a name="l11221"></a><span class="lineno">11221</span>&#160;VkResult VmaBlockMetadata_Linear::CheckCorruption(<span class="keyword">const</span> <span class="keywordtype">void</span>* pBlockData)</div>
-<div class="line"><a name="l11222"></a><span class="lineno">11222</span>&#160;{</div>
-<div class="line"><a name="l11223"></a><span class="lineno">11223</span>&#160;    SuballocationVectorType&amp; suballocations1st = AccessSuballocations1st();</div>
-<div class="line"><a name="l11224"></a><span class="lineno">11224</span>&#160;    <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> i = m_1stNullItemsBeginCount, count = suballocations1st.size(); i &lt; count; ++i)</div>
-<div class="line"><a name="l11225"></a><span class="lineno">11225</span>&#160;    {</div>
-<div class="line"><a name="l11226"></a><span class="lineno">11226</span>&#160;        <span class="keyword">const</span> VmaSuballocation&amp; suballoc = suballocations1st[i];</div>
-<div class="line"><a name="l11227"></a><span class="lineno">11227</span>&#160;        <span class="keywordflow">if</span>(suballoc.type != VMA_SUBALLOCATION_TYPE_FREE)</div>
-<div class="line"><a name="l11228"></a><span class="lineno">11228</span>&#160;        {</div>
-<div class="line"><a name="l11229"></a><span class="lineno">11229</span>&#160;            <span class="keywordflow">if</span>(!VmaValidateMagicValue(pBlockData, suballoc.offset - VMA_DEBUG_MARGIN))</div>
-<div class="line"><a name="l11230"></a><span class="lineno">11230</span>&#160;            {</div>
-<div class="line"><a name="l11231"></a><span class="lineno">11231</span>&#160;                VMA_ASSERT(0 &amp;&amp; <span class="stringliteral">&quot;MEMORY CORRUPTION DETECTED BEFORE VALIDATED ALLOCATION!&quot;</span>);</div>
-<div class="line"><a name="l11232"></a><span class="lineno">11232</span>&#160;                <span class="keywordflow">return</span> VK_ERROR_VALIDATION_FAILED_EXT;</div>
-<div class="line"><a name="l11233"></a><span class="lineno">11233</span>&#160;            }</div>
-<div class="line"><a name="l11234"></a><span class="lineno">11234</span>&#160;            <span class="keywordflow">if</span>(!VmaValidateMagicValue(pBlockData, suballoc.offset + suballoc.size))</div>
-<div class="line"><a name="l11235"></a><span class="lineno">11235</span>&#160;            {</div>
-<div class="line"><a name="l11236"></a><span class="lineno">11236</span>&#160;                VMA_ASSERT(0 &amp;&amp; <span class="stringliteral">&quot;MEMORY CORRUPTION DETECTED AFTER VALIDATED ALLOCATION!&quot;</span>);</div>
-<div class="line"><a name="l11237"></a><span class="lineno">11237</span>&#160;                <span class="keywordflow">return</span> VK_ERROR_VALIDATION_FAILED_EXT;</div>
-<div class="line"><a name="l11238"></a><span class="lineno">11238</span>&#160;            }</div>
-<div class="line"><a name="l11239"></a><span class="lineno">11239</span>&#160;        }</div>
+<div class="line"><a name="l11221"></a><span class="lineno">11221</span>&#160;<span class="keywordtype">bool</span> VmaBlockMetadata_Linear::CreateAllocationRequest_UpperAddress(</div>
+<div class="line"><a name="l11222"></a><span class="lineno">11222</span>&#160;    uint32_t currentFrameIndex,</div>
+<div class="line"><a name="l11223"></a><span class="lineno">11223</span>&#160;    uint32_t frameInUseCount,</div>
+<div class="line"><a name="l11224"></a><span class="lineno">11224</span>&#160;    VkDeviceSize bufferImageGranularity,</div>
+<div class="line"><a name="l11225"></a><span class="lineno">11225</span>&#160;    VkDeviceSize allocSize,</div>
+<div class="line"><a name="l11226"></a><span class="lineno">11226</span>&#160;    VkDeviceSize allocAlignment,</div>
+<div class="line"><a name="l11227"></a><span class="lineno">11227</span>&#160;    VmaSuballocationType allocType,</div>
+<div class="line"><a name="l11228"></a><span class="lineno">11228</span>&#160;    <span class="keywordtype">bool</span> canMakeOtherLost,</div>
+<div class="line"><a name="l11229"></a><span class="lineno">11229</span>&#160;    uint32_t strategy,</div>
+<div class="line"><a name="l11230"></a><span class="lineno">11230</span>&#160;    VmaAllocationRequest* pAllocationRequest)</div>
+<div class="line"><a name="l11231"></a><span class="lineno">11231</span>&#160;{</div>
+<div class="line"><a name="l11232"></a><span class="lineno">11232</span>&#160;    <span class="keyword">const</span> VkDeviceSize size = GetSize();</div>
+<div class="line"><a name="l11233"></a><span class="lineno">11233</span>&#160;    SuballocationVectorType&amp; suballocations1st = AccessSuballocations1st();</div>
+<div class="line"><a name="l11234"></a><span class="lineno">11234</span>&#160;    SuballocationVectorType&amp; suballocations2nd = AccessSuballocations2nd();</div>
+<div class="line"><a name="l11235"></a><span class="lineno">11235</span>&#160; </div>
+<div class="line"><a name="l11236"></a><span class="lineno">11236</span>&#160;    <span class="keywordflow">if</span>(m_2ndVectorMode == SECOND_VECTOR_RING_BUFFER)</div>
+<div class="line"><a name="l11237"></a><span class="lineno">11237</span>&#160;    {</div>
+<div class="line"><a name="l11238"></a><span class="lineno">11238</span>&#160;        VMA_ASSERT(0 &amp;&amp; <span class="stringliteral">&quot;Trying to use pool with linear algorithm as double stack, while it is already being used as ring buffer.&quot;</span>);</div>
+<div class="line"><a name="l11239"></a><span class="lineno">11239</span>&#160;        <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
 <div class="line"><a name="l11240"></a><span class="lineno">11240</span>&#160;    }</div>
 <div class="line"><a name="l11241"></a><span class="lineno">11241</span>&#160; </div>
-<div class="line"><a name="l11242"></a><span class="lineno">11242</span>&#160;    SuballocationVectorType&amp; suballocations2nd = AccessSuballocations2nd();</div>
-<div class="line"><a name="l11243"></a><span class="lineno">11243</span>&#160;    <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> i = 0, count = suballocations2nd.size(); i &lt; count; ++i)</div>
+<div class="line"><a name="l11242"></a><span class="lineno">11242</span>&#160;    <span class="comment">// Try to allocate before 2nd.back(), or end of block if 2nd.empty().</span></div>
+<div class="line"><a name="l11243"></a><span class="lineno">11243</span>&#160;    <span class="keywordflow">if</span>(allocSize &gt; size)</div>
 <div class="line"><a name="l11244"></a><span class="lineno">11244</span>&#160;    {</div>
-<div class="line"><a name="l11245"></a><span class="lineno">11245</span>&#160;        <span class="keyword">const</span> VmaSuballocation&amp; suballoc = suballocations2nd[i];</div>
-<div class="line"><a name="l11246"></a><span class="lineno">11246</span>&#160;        <span class="keywordflow">if</span>(suballoc.type != VMA_SUBALLOCATION_TYPE_FREE)</div>
-<div class="line"><a name="l11247"></a><span class="lineno">11247</span>&#160;        {</div>
-<div class="line"><a name="l11248"></a><span class="lineno">11248</span>&#160;            <span class="keywordflow">if</span>(!VmaValidateMagicValue(pBlockData, suballoc.offset - VMA_DEBUG_MARGIN))</div>
-<div class="line"><a name="l11249"></a><span class="lineno">11249</span>&#160;            {</div>
-<div class="line"><a name="l11250"></a><span class="lineno">11250</span>&#160;                VMA_ASSERT(0 &amp;&amp; <span class="stringliteral">&quot;MEMORY CORRUPTION DETECTED BEFORE VALIDATED ALLOCATION!&quot;</span>);</div>
-<div class="line"><a name="l11251"></a><span class="lineno">11251</span>&#160;                <span class="keywordflow">return</span> VK_ERROR_VALIDATION_FAILED_EXT;</div>
-<div class="line"><a name="l11252"></a><span class="lineno">11252</span>&#160;            }</div>
-<div class="line"><a name="l11253"></a><span class="lineno">11253</span>&#160;            <span class="keywordflow">if</span>(!VmaValidateMagicValue(pBlockData, suballoc.offset + suballoc.size))</div>
-<div class="line"><a name="l11254"></a><span class="lineno">11254</span>&#160;            {</div>
-<div class="line"><a name="l11255"></a><span class="lineno">11255</span>&#160;                VMA_ASSERT(0 &amp;&amp; <span class="stringliteral">&quot;MEMORY CORRUPTION DETECTED AFTER VALIDATED ALLOCATION!&quot;</span>);</div>
-<div class="line"><a name="l11256"></a><span class="lineno">11256</span>&#160;                <span class="keywordflow">return</span> VK_ERROR_VALIDATION_FAILED_EXT;</div>
-<div class="line"><a name="l11257"></a><span class="lineno">11257</span>&#160;            }</div>
-<div class="line"><a name="l11258"></a><span class="lineno">11258</span>&#160;        }</div>
-<div class="line"><a name="l11259"></a><span class="lineno">11259</span>&#160;    }</div>
+<div class="line"><a name="l11245"></a><span class="lineno">11245</span>&#160;        <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
+<div class="line"><a name="l11246"></a><span class="lineno">11246</span>&#160;    }</div>
+<div class="line"><a name="l11247"></a><span class="lineno">11247</span>&#160;    VkDeviceSize resultBaseOffset = size - allocSize;</div>
+<div class="line"><a name="l11248"></a><span class="lineno">11248</span>&#160;    <span class="keywordflow">if</span>(!suballocations2nd.empty())</div>
+<div class="line"><a name="l11249"></a><span class="lineno">11249</span>&#160;    {</div>
+<div class="line"><a name="l11250"></a><span class="lineno">11250</span>&#160;        <span class="keyword">const</span> VmaSuballocation&amp; lastSuballoc = suballocations2nd.back();</div>
+<div class="line"><a name="l11251"></a><span class="lineno">11251</span>&#160;        resultBaseOffset = lastSuballoc.offset - allocSize;</div>
+<div class="line"><a name="l11252"></a><span class="lineno">11252</span>&#160;        <span class="keywordflow">if</span>(allocSize &gt; lastSuballoc.offset)</div>
+<div class="line"><a name="l11253"></a><span class="lineno">11253</span>&#160;        {</div>
+<div class="line"><a name="l11254"></a><span class="lineno">11254</span>&#160;            <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
+<div class="line"><a name="l11255"></a><span class="lineno">11255</span>&#160;        }</div>
+<div class="line"><a name="l11256"></a><span class="lineno">11256</span>&#160;    }</div>
+<div class="line"><a name="l11257"></a><span class="lineno">11257</span>&#160; </div>
+<div class="line"><a name="l11258"></a><span class="lineno">11258</span>&#160;    <span class="comment">// Start from offset equal to end of free space.</span></div>
+<div class="line"><a name="l11259"></a><span class="lineno">11259</span>&#160;    VkDeviceSize resultOffset = resultBaseOffset;</div>
 <div class="line"><a name="l11260"></a><span class="lineno">11260</span>&#160; </div>
-<div class="line"><a name="l11261"></a><span class="lineno">11261</span>&#160;    <span class="keywordflow">return</span> VK_SUCCESS;</div>
-<div class="line"><a name="l11262"></a><span class="lineno">11262</span>&#160;}</div>
-<div class="line"><a name="l11263"></a><span class="lineno">11263</span>&#160; </div>
-<div class="line"><a name="l11264"></a><span class="lineno">11264</span>&#160;<span class="keywordtype">void</span> VmaBlockMetadata_Linear::Alloc(</div>
-<div class="line"><a name="l11265"></a><span class="lineno">11265</span>&#160;    <span class="keyword">const</span> VmaAllocationRequest&amp; request,</div>
-<div class="line"><a name="l11266"></a><span class="lineno">11266</span>&#160;    VmaSuballocationType type,</div>
-<div class="line"><a name="l11267"></a><span class="lineno">11267</span>&#160;    VkDeviceSize allocSize,</div>
-<div class="line"><a name="l11268"></a><span class="lineno">11268</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> hAllocation)</div>
-<div class="line"><a name="l11269"></a><span class="lineno">11269</span>&#160;{</div>
-<div class="line"><a name="l11270"></a><span class="lineno">11270</span>&#160;    <span class="keyword">const</span> VmaSuballocation newSuballoc = { request.offset, allocSize, hAllocation, type };</div>
-<div class="line"><a name="l11271"></a><span class="lineno">11271</span>&#160; </div>
-<div class="line"><a name="l11272"></a><span class="lineno">11272</span>&#160;    <span class="keywordflow">switch</span>(request.type)</div>
-<div class="line"><a name="l11273"></a><span class="lineno">11273</span>&#160;    {</div>
-<div class="line"><a name="l11274"></a><span class="lineno">11274</span>&#160;    <span class="keywordflow">case</span> VmaAllocationRequestType::UpperAddress:</div>
-<div class="line"><a name="l11275"></a><span class="lineno">11275</span>&#160;        {</div>
-<div class="line"><a name="l11276"></a><span class="lineno">11276</span>&#160;            VMA_ASSERT(m_2ndVectorMode != SECOND_VECTOR_RING_BUFFER &amp;&amp;</div>
-<div class="line"><a name="l11277"></a><span class="lineno">11277</span>&#160;                <span class="stringliteral">&quot;CRITICAL ERROR: Trying to use linear allocator as double stack while it was already used as ring buffer.&quot;</span>);</div>
-<div class="line"><a name="l11278"></a><span class="lineno">11278</span>&#160;            SuballocationVectorType&amp; suballocations2nd = AccessSuballocations2nd();</div>
-<div class="line"><a name="l11279"></a><span class="lineno">11279</span>&#160;            suballocations2nd.push_back(newSuballoc);</div>
-<div class="line"><a name="l11280"></a><span class="lineno">11280</span>&#160;            m_2ndVectorMode = SECOND_VECTOR_DOUBLE_STACK;</div>
-<div class="line"><a name="l11281"></a><span class="lineno">11281</span>&#160;        }</div>
-<div class="line"><a name="l11282"></a><span class="lineno">11282</span>&#160;        <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l11283"></a><span class="lineno">11283</span>&#160;    <span class="keywordflow">case</span> VmaAllocationRequestType::EndOf1st:</div>
-<div class="line"><a name="l11284"></a><span class="lineno">11284</span>&#160;        {</div>
-<div class="line"><a name="l11285"></a><span class="lineno">11285</span>&#160;            SuballocationVectorType&amp; suballocations1st = AccessSuballocations1st();</div>
-<div class="line"><a name="l11286"></a><span class="lineno">11286</span>&#160; </div>
-<div class="line"><a name="l11287"></a><span class="lineno">11287</span>&#160;            VMA_ASSERT(suballocations1st.empty() ||</div>
-<div class="line"><a name="l11288"></a><span class="lineno">11288</span>&#160;                request.offset &gt;= suballocations1st.back().offset + suballocations1st.back().size);</div>
-<div class="line"><a name="l11289"></a><span class="lineno">11289</span>&#160;            <span class="comment">// Check if it fits before the end of the block.</span></div>
-<div class="line"><a name="l11290"></a><span class="lineno">11290</span>&#160;            VMA_ASSERT(request.offset + allocSize &lt;= GetSize());</div>
-<div class="line"><a name="l11291"></a><span class="lineno">11291</span>&#160; </div>
-<div class="line"><a name="l11292"></a><span class="lineno">11292</span>&#160;            suballocations1st.push_back(newSuballoc);</div>
+<div class="line"><a name="l11261"></a><span class="lineno">11261</span>&#160;    <span class="comment">// Apply VMA_DEBUG_MARGIN at the end.</span></div>
+<div class="line"><a name="l11262"></a><span class="lineno">11262</span>&#160;    <span class="keywordflow">if</span>(VMA_DEBUG_MARGIN &gt; 0)</div>
+<div class="line"><a name="l11263"></a><span class="lineno">11263</span>&#160;    {</div>
+<div class="line"><a name="l11264"></a><span class="lineno">11264</span>&#160;        <span class="keywordflow">if</span>(resultOffset &lt; VMA_DEBUG_MARGIN)</div>
+<div class="line"><a name="l11265"></a><span class="lineno">11265</span>&#160;        {</div>
+<div class="line"><a name="l11266"></a><span class="lineno">11266</span>&#160;            <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
+<div class="line"><a name="l11267"></a><span class="lineno">11267</span>&#160;        }</div>
+<div class="line"><a name="l11268"></a><span class="lineno">11268</span>&#160;        resultOffset -= VMA_DEBUG_MARGIN;</div>
+<div class="line"><a name="l11269"></a><span class="lineno">11269</span>&#160;    }</div>
+<div class="line"><a name="l11270"></a><span class="lineno">11270</span>&#160; </div>
+<div class="line"><a name="l11271"></a><span class="lineno">11271</span>&#160;    <span class="comment">// Apply alignment.</span></div>
+<div class="line"><a name="l11272"></a><span class="lineno">11272</span>&#160;    resultOffset = VmaAlignDown(resultOffset, allocAlignment);</div>
+<div class="line"><a name="l11273"></a><span class="lineno">11273</span>&#160; </div>
+<div class="line"><a name="l11274"></a><span class="lineno">11274</span>&#160;    <span class="comment">// Check next suballocations from 2nd for BufferImageGranularity conflicts.</span></div>
+<div class="line"><a name="l11275"></a><span class="lineno">11275</span>&#160;    <span class="comment">// Make bigger alignment if necessary.</span></div>
+<div class="line"><a name="l11276"></a><span class="lineno">11276</span>&#160;    <span class="keywordflow">if</span>(bufferImageGranularity &gt; 1 &amp;&amp; bufferImageGranularity != allocAlignment &amp;&amp; !suballocations2nd.empty())</div>
+<div class="line"><a name="l11277"></a><span class="lineno">11277</span>&#160;    {</div>
+<div class="line"><a name="l11278"></a><span class="lineno">11278</span>&#160;        <span class="keywordtype">bool</span> bufferImageGranularityConflict = <span class="keyword">false</span>;</div>
+<div class="line"><a name="l11279"></a><span class="lineno">11279</span>&#160;        <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> nextSuballocIndex = suballocations2nd.size(); nextSuballocIndex--; )</div>
+<div class="line"><a name="l11280"></a><span class="lineno">11280</span>&#160;        {</div>
+<div class="line"><a name="l11281"></a><span class="lineno">11281</span>&#160;            <span class="keyword">const</span> VmaSuballocation&amp; nextSuballoc = suballocations2nd[nextSuballocIndex];</div>
+<div class="line"><a name="l11282"></a><span class="lineno">11282</span>&#160;            <span class="keywordflow">if</span>(VmaBlocksOnSamePage(resultOffset, allocSize, nextSuballoc.offset, bufferImageGranularity))</div>
+<div class="line"><a name="l11283"></a><span class="lineno">11283</span>&#160;            {</div>
+<div class="line"><a name="l11284"></a><span class="lineno">11284</span>&#160;                <span class="keywordflow">if</span>(VmaIsBufferImageGranularityConflict(nextSuballoc.type, allocType))</div>
+<div class="line"><a name="l11285"></a><span class="lineno">11285</span>&#160;                {</div>
+<div class="line"><a name="l11286"></a><span class="lineno">11286</span>&#160;                    bufferImageGranularityConflict = <span class="keyword">true</span>;</div>
+<div class="line"><a name="l11287"></a><span class="lineno">11287</span>&#160;                    <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l11288"></a><span class="lineno">11288</span>&#160;                }</div>
+<div class="line"><a name="l11289"></a><span class="lineno">11289</span>&#160;            }</div>
+<div class="line"><a name="l11290"></a><span class="lineno">11290</span>&#160;            <span class="keywordflow">else</span></div>
+<div class="line"><a name="l11291"></a><span class="lineno">11291</span>&#160;                <span class="comment">// Already on previous page.</span></div>
+<div class="line"><a name="l11292"></a><span class="lineno">11292</span>&#160;                <span class="keywordflow">break</span>;</div>
 <div class="line"><a name="l11293"></a><span class="lineno">11293</span>&#160;        }</div>
-<div class="line"><a name="l11294"></a><span class="lineno">11294</span>&#160;        <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l11295"></a><span class="lineno">11295</span>&#160;    <span class="keywordflow">case</span> VmaAllocationRequestType::EndOf2nd:</div>
-<div class="line"><a name="l11296"></a><span class="lineno">11296</span>&#160;        {</div>
-<div class="line"><a name="l11297"></a><span class="lineno">11297</span>&#160;            SuballocationVectorType&amp; suballocations1st = AccessSuballocations1st();</div>
-<div class="line"><a name="l11298"></a><span class="lineno">11298</span>&#160;            <span class="comment">// New allocation at the end of 2-part ring buffer, so before first allocation from 1st vector.</span></div>
-<div class="line"><a name="l11299"></a><span class="lineno">11299</span>&#160;            VMA_ASSERT(!suballocations1st.empty() &amp;&amp;</div>
-<div class="line"><a name="l11300"></a><span class="lineno">11300</span>&#160;                request.offset + allocSize &lt;= suballocations1st[m_1stNullItemsBeginCount].offset);</div>
-<div class="line"><a name="l11301"></a><span class="lineno">11301</span>&#160;            SuballocationVectorType&amp; suballocations2nd = AccessSuballocations2nd();</div>
-<div class="line"><a name="l11302"></a><span class="lineno">11302</span>&#160; </div>
-<div class="line"><a name="l11303"></a><span class="lineno">11303</span>&#160;            <span class="keywordflow">switch</span>(m_2ndVectorMode)</div>
-<div class="line"><a name="l11304"></a><span class="lineno">11304</span>&#160;            {</div>
-<div class="line"><a name="l11305"></a><span class="lineno">11305</span>&#160;            <span class="keywordflow">case</span> SECOND_VECTOR_EMPTY:</div>
-<div class="line"><a name="l11306"></a><span class="lineno">11306</span>&#160;                <span class="comment">// First allocation from second part ring buffer.</span></div>
-<div class="line"><a name="l11307"></a><span class="lineno">11307</span>&#160;                VMA_ASSERT(suballocations2nd.empty());</div>
-<div class="line"><a name="l11308"></a><span class="lineno">11308</span>&#160;                m_2ndVectorMode = SECOND_VECTOR_RING_BUFFER;</div>
-<div class="line"><a name="l11309"></a><span class="lineno">11309</span>&#160;                <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l11310"></a><span class="lineno">11310</span>&#160;            <span class="keywordflow">case</span> SECOND_VECTOR_RING_BUFFER:</div>
-<div class="line"><a name="l11311"></a><span class="lineno">11311</span>&#160;                <span class="comment">// 2-part ring buffer is already started.</span></div>
-<div class="line"><a name="l11312"></a><span class="lineno">11312</span>&#160;                VMA_ASSERT(!suballocations2nd.empty());</div>
-<div class="line"><a name="l11313"></a><span class="lineno">11313</span>&#160;                <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l11314"></a><span class="lineno">11314</span>&#160;            <span class="keywordflow">case</span> SECOND_VECTOR_DOUBLE_STACK:</div>
-<div class="line"><a name="l11315"></a><span class="lineno">11315</span>&#160;                VMA_ASSERT(0 &amp;&amp; <span class="stringliteral">&quot;CRITICAL ERROR: Trying to use linear allocator as ring buffer while it was already used as double stack.&quot;</span>);</div>
-<div class="line"><a name="l11316"></a><span class="lineno">11316</span>&#160;                <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l11317"></a><span class="lineno">11317</span>&#160;            <span class="keywordflow">default</span>:</div>
-<div class="line"><a name="l11318"></a><span class="lineno">11318</span>&#160;                VMA_ASSERT(0);</div>
-<div class="line"><a name="l11319"></a><span class="lineno">11319</span>&#160;            }</div>
-<div class="line"><a name="l11320"></a><span class="lineno">11320</span>&#160; </div>
-<div class="line"><a name="l11321"></a><span class="lineno">11321</span>&#160;            suballocations2nd.push_back(newSuballoc);</div>
-<div class="line"><a name="l11322"></a><span class="lineno">11322</span>&#160;        }</div>
-<div class="line"><a name="l11323"></a><span class="lineno">11323</span>&#160;        <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l11324"></a><span class="lineno">11324</span>&#160;    <span class="keywordflow">default</span>:</div>
-<div class="line"><a name="l11325"></a><span class="lineno">11325</span>&#160;        VMA_ASSERT(0 &amp;&amp; <span class="stringliteral">&quot;CRITICAL INTERNAL ERROR.&quot;</span>);</div>
-<div class="line"><a name="l11326"></a><span class="lineno">11326</span>&#160;    }</div>
+<div class="line"><a name="l11294"></a><span class="lineno">11294</span>&#160;        <span class="keywordflow">if</span>(bufferImageGranularityConflict)</div>
+<div class="line"><a name="l11295"></a><span class="lineno">11295</span>&#160;        {</div>
+<div class="line"><a name="l11296"></a><span class="lineno">11296</span>&#160;            resultOffset = VmaAlignDown(resultOffset, bufferImageGranularity);</div>
+<div class="line"><a name="l11297"></a><span class="lineno">11297</span>&#160;        }</div>
+<div class="line"><a name="l11298"></a><span class="lineno">11298</span>&#160;    }</div>
+<div class="line"><a name="l11299"></a><span class="lineno">11299</span>&#160; </div>
+<div class="line"><a name="l11300"></a><span class="lineno">11300</span>&#160;    <span class="comment">// There is enough free space.</span></div>
+<div class="line"><a name="l11301"></a><span class="lineno">11301</span>&#160;    <span class="keyword">const</span> VkDeviceSize endOf1st = !suballocations1st.empty() ?</div>
+<div class="line"><a name="l11302"></a><span class="lineno">11302</span>&#160;        suballocations1st.back().offset + suballocations1st.back().size :</div>
+<div class="line"><a name="l11303"></a><span class="lineno">11303</span>&#160;        0;</div>
+<div class="line"><a name="l11304"></a><span class="lineno">11304</span>&#160;    <span class="keywordflow">if</span>(endOf1st + VMA_DEBUG_MARGIN &lt;= resultOffset)</div>
+<div class="line"><a name="l11305"></a><span class="lineno">11305</span>&#160;    {</div>
+<div class="line"><a name="l11306"></a><span class="lineno">11306</span>&#160;        <span class="comment">// Check previous suballocations for BufferImageGranularity conflicts.</span></div>
+<div class="line"><a name="l11307"></a><span class="lineno">11307</span>&#160;        <span class="comment">// If conflict exists, allocation cannot be made here.</span></div>
+<div class="line"><a name="l11308"></a><span class="lineno">11308</span>&#160;        <span class="keywordflow">if</span>(bufferImageGranularity &gt; 1)</div>
+<div class="line"><a name="l11309"></a><span class="lineno">11309</span>&#160;        {</div>
+<div class="line"><a name="l11310"></a><span class="lineno">11310</span>&#160;            <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> prevSuballocIndex = suballocations1st.size(); prevSuballocIndex--; )</div>
+<div class="line"><a name="l11311"></a><span class="lineno">11311</span>&#160;            {</div>
+<div class="line"><a name="l11312"></a><span class="lineno">11312</span>&#160;                <span class="keyword">const</span> VmaSuballocation&amp; prevSuballoc = suballocations1st[prevSuballocIndex];</div>
+<div class="line"><a name="l11313"></a><span class="lineno">11313</span>&#160;                <span class="keywordflow">if</span>(VmaBlocksOnSamePage(prevSuballoc.offset, prevSuballoc.size, resultOffset, bufferImageGranularity))</div>
+<div class="line"><a name="l11314"></a><span class="lineno">11314</span>&#160;                {</div>
+<div class="line"><a name="l11315"></a><span class="lineno">11315</span>&#160;                    <span class="keywordflow">if</span>(VmaIsBufferImageGranularityConflict(allocType, prevSuballoc.type))</div>
+<div class="line"><a name="l11316"></a><span class="lineno">11316</span>&#160;                    {</div>
+<div class="line"><a name="l11317"></a><span class="lineno">11317</span>&#160;                        <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
+<div class="line"><a name="l11318"></a><span class="lineno">11318</span>&#160;                    }</div>
+<div class="line"><a name="l11319"></a><span class="lineno">11319</span>&#160;                }</div>
+<div class="line"><a name="l11320"></a><span class="lineno">11320</span>&#160;                <span class="keywordflow">else</span></div>
+<div class="line"><a name="l11321"></a><span class="lineno">11321</span>&#160;                {</div>
+<div class="line"><a name="l11322"></a><span class="lineno">11322</span>&#160;                    <span class="comment">// Already on next page.</span></div>
+<div class="line"><a name="l11323"></a><span class="lineno">11323</span>&#160;                    <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l11324"></a><span class="lineno">11324</span>&#160;                }</div>
+<div class="line"><a name="l11325"></a><span class="lineno">11325</span>&#160;            }</div>
+<div class="line"><a name="l11326"></a><span class="lineno">11326</span>&#160;        }</div>
 <div class="line"><a name="l11327"></a><span class="lineno">11327</span>&#160; </div>
-<div class="line"><a name="l11328"></a><span class="lineno">11328</span>&#160;    m_SumFreeSize -= newSuballoc.size;</div>
-<div class="line"><a name="l11329"></a><span class="lineno">11329</span>&#160;}</div>
-<div class="line"><a name="l11330"></a><span class="lineno">11330</span>&#160; </div>
-<div class="line"><a name="l11331"></a><span class="lineno">11331</span>&#160;<span class="keywordtype">void</span> VmaBlockMetadata_Linear::Free(<span class="keyword">const</span> <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation)</div>
-<div class="line"><a name="l11332"></a><span class="lineno">11332</span>&#160;{</div>
-<div class="line"><a name="l11333"></a><span class="lineno">11333</span>&#160;    FreeAtOffset(allocation-&gt;GetOffset());</div>
-<div class="line"><a name="l11334"></a><span class="lineno">11334</span>&#160;}</div>
-<div class="line"><a name="l11335"></a><span class="lineno">11335</span>&#160; </div>
-<div class="line"><a name="l11336"></a><span class="lineno">11336</span>&#160;<span class="keywordtype">void</span> VmaBlockMetadata_Linear::FreeAtOffset(VkDeviceSize offset)</div>
-<div class="line"><a name="l11337"></a><span class="lineno">11337</span>&#160;{</div>
-<div class="line"><a name="l11338"></a><span class="lineno">11338</span>&#160;    SuballocationVectorType&amp; suballocations1st = AccessSuballocations1st();</div>
-<div class="line"><a name="l11339"></a><span class="lineno">11339</span>&#160;    SuballocationVectorType&amp; suballocations2nd = AccessSuballocations2nd();</div>
+<div class="line"><a name="l11328"></a><span class="lineno">11328</span>&#160;        <span class="comment">// All tests passed: Success.</span></div>
+<div class="line"><a name="l11329"></a><span class="lineno">11329</span>&#160;        pAllocationRequest-&gt;offset = resultOffset;</div>
+<div class="line"><a name="l11330"></a><span class="lineno">11330</span>&#160;        pAllocationRequest-&gt;sumFreeSize = resultBaseOffset + allocSize - endOf1st;</div>
+<div class="line"><a name="l11331"></a><span class="lineno">11331</span>&#160;        pAllocationRequest-&gt;sumItemSize = 0;</div>
+<div class="line"><a name="l11332"></a><span class="lineno">11332</span>&#160;        <span class="comment">// pAllocationRequest-&gt;item unused.</span></div>
+<div class="line"><a name="l11333"></a><span class="lineno">11333</span>&#160;        pAllocationRequest-&gt;itemsToMakeLostCount = 0;</div>
+<div class="line"><a name="l11334"></a><span class="lineno">11334</span>&#160;        pAllocationRequest-&gt;type = VmaAllocationRequestType::UpperAddress;</div>
+<div class="line"><a name="l11335"></a><span class="lineno">11335</span>&#160;        <span class="keywordflow">return</span> <span class="keyword">true</span>;</div>
+<div class="line"><a name="l11336"></a><span class="lineno">11336</span>&#160;    }</div>
+<div class="line"><a name="l11337"></a><span class="lineno">11337</span>&#160; </div>
+<div class="line"><a name="l11338"></a><span class="lineno">11338</span>&#160;    <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
+<div class="line"><a name="l11339"></a><span class="lineno">11339</span>&#160;}</div>
 <div class="line"><a name="l11340"></a><span class="lineno">11340</span>&#160; </div>
-<div class="line"><a name="l11341"></a><span class="lineno">11341</span>&#160;    <span class="keywordflow">if</span>(!suballocations1st.empty())</div>
-<div class="line"><a name="l11342"></a><span class="lineno">11342</span>&#160;    {</div>
-<div class="line"><a name="l11343"></a><span class="lineno">11343</span>&#160;        <span class="comment">// First allocation: Mark it as next empty at the beginning.</span></div>
-<div class="line"><a name="l11344"></a><span class="lineno">11344</span>&#160;        VmaSuballocation&amp; firstSuballoc = suballocations1st[m_1stNullItemsBeginCount];</div>
-<div class="line"><a name="l11345"></a><span class="lineno">11345</span>&#160;        <span class="keywordflow">if</span>(firstSuballoc.offset == offset)</div>
-<div class="line"><a name="l11346"></a><span class="lineno">11346</span>&#160;        {</div>
-<div class="line"><a name="l11347"></a><span class="lineno">11347</span>&#160;            firstSuballoc.type = VMA_SUBALLOCATION_TYPE_FREE;</div>
-<div class="line"><a name="l11348"></a><span class="lineno">11348</span>&#160;            firstSuballoc.hAllocation = VK_NULL_HANDLE;</div>
-<div class="line"><a name="l11349"></a><span class="lineno">11349</span>&#160;            m_SumFreeSize += firstSuballoc.size;</div>
-<div class="line"><a name="l11350"></a><span class="lineno">11350</span>&#160;            ++m_1stNullItemsBeginCount;</div>
-<div class="line"><a name="l11351"></a><span class="lineno">11351</span>&#160;            CleanupAfterFree();</div>
-<div class="line"><a name="l11352"></a><span class="lineno">11352</span>&#160;            <span class="keywordflow">return</span>;</div>
-<div class="line"><a name="l11353"></a><span class="lineno">11353</span>&#160;        }</div>
-<div class="line"><a name="l11354"></a><span class="lineno">11354</span>&#160;    }</div>
+<div class="line"><a name="l11341"></a><span class="lineno">11341</span>&#160;<span class="keywordtype">bool</span> VmaBlockMetadata_Linear::CreateAllocationRequest_LowerAddress(</div>
+<div class="line"><a name="l11342"></a><span class="lineno">11342</span>&#160;    uint32_t currentFrameIndex,</div>
+<div class="line"><a name="l11343"></a><span class="lineno">11343</span>&#160;    uint32_t frameInUseCount,</div>
+<div class="line"><a name="l11344"></a><span class="lineno">11344</span>&#160;    VkDeviceSize bufferImageGranularity,</div>
+<div class="line"><a name="l11345"></a><span class="lineno">11345</span>&#160;    VkDeviceSize allocSize,</div>
+<div class="line"><a name="l11346"></a><span class="lineno">11346</span>&#160;    VkDeviceSize allocAlignment,</div>
+<div class="line"><a name="l11347"></a><span class="lineno">11347</span>&#160;    VmaSuballocationType allocType,</div>
+<div class="line"><a name="l11348"></a><span class="lineno">11348</span>&#160;    <span class="keywordtype">bool</span> canMakeOtherLost,</div>
+<div class="line"><a name="l11349"></a><span class="lineno">11349</span>&#160;    uint32_t strategy,</div>
+<div class="line"><a name="l11350"></a><span class="lineno">11350</span>&#160;    VmaAllocationRequest* pAllocationRequest)</div>
+<div class="line"><a name="l11351"></a><span class="lineno">11351</span>&#160;{</div>
+<div class="line"><a name="l11352"></a><span class="lineno">11352</span>&#160;    <span class="keyword">const</span> VkDeviceSize size = GetSize();</div>
+<div class="line"><a name="l11353"></a><span class="lineno">11353</span>&#160;    SuballocationVectorType&amp; suballocations1st = AccessSuballocations1st();</div>
+<div class="line"><a name="l11354"></a><span class="lineno">11354</span>&#160;    SuballocationVectorType&amp; suballocations2nd = AccessSuballocations2nd();</div>
 <div class="line"><a name="l11355"></a><span class="lineno">11355</span>&#160; </div>
-<div class="line"><a name="l11356"></a><span class="lineno">11356</span>&#160;    <span class="comment">// Last allocation in 2-part ring buffer or top of upper stack (same logic).</span></div>
-<div class="line"><a name="l11357"></a><span class="lineno">11357</span>&#160;    <span class="keywordflow">if</span>(m_2ndVectorMode == SECOND_VECTOR_RING_BUFFER ||</div>
-<div class="line"><a name="l11358"></a><span class="lineno">11358</span>&#160;        m_2ndVectorMode == SECOND_VECTOR_DOUBLE_STACK)</div>
-<div class="line"><a name="l11359"></a><span class="lineno">11359</span>&#160;    {</div>
-<div class="line"><a name="l11360"></a><span class="lineno">11360</span>&#160;        VmaSuballocation&amp; lastSuballoc = suballocations2nd.back();</div>
-<div class="line"><a name="l11361"></a><span class="lineno">11361</span>&#160;        <span class="keywordflow">if</span>(lastSuballoc.offset == offset)</div>
+<div class="line"><a name="l11356"></a><span class="lineno">11356</span>&#160;    <span class="keywordflow">if</span>(m_2ndVectorMode == SECOND_VECTOR_EMPTY || m_2ndVectorMode == SECOND_VECTOR_DOUBLE_STACK)</div>
+<div class="line"><a name="l11357"></a><span class="lineno">11357</span>&#160;    {</div>
+<div class="line"><a name="l11358"></a><span class="lineno">11358</span>&#160;        <span class="comment">// Try to allocate at the end of 1st vector.</span></div>
+<div class="line"><a name="l11359"></a><span class="lineno">11359</span>&#160; </div>
+<div class="line"><a name="l11360"></a><span class="lineno">11360</span>&#160;        VkDeviceSize resultBaseOffset = 0;</div>
+<div class="line"><a name="l11361"></a><span class="lineno">11361</span>&#160;        <span class="keywordflow">if</span>(!suballocations1st.empty())</div>
 <div class="line"><a name="l11362"></a><span class="lineno">11362</span>&#160;        {</div>
-<div class="line"><a name="l11363"></a><span class="lineno">11363</span>&#160;            m_SumFreeSize += lastSuballoc.size;</div>
-<div class="line"><a name="l11364"></a><span class="lineno">11364</span>&#160;            suballocations2nd.pop_back();</div>
-<div class="line"><a name="l11365"></a><span class="lineno">11365</span>&#160;            CleanupAfterFree();</div>
-<div class="line"><a name="l11366"></a><span class="lineno">11366</span>&#160;            <span class="keywordflow">return</span>;</div>
-<div class="line"><a name="l11367"></a><span class="lineno">11367</span>&#160;        }</div>
-<div class="line"><a name="l11368"></a><span class="lineno">11368</span>&#160;    }</div>
-<div class="line"><a name="l11369"></a><span class="lineno">11369</span>&#160;    <span class="comment">// Last allocation in 1st vector.</span></div>
-<div class="line"><a name="l11370"></a><span class="lineno">11370</span>&#160;    <span class="keywordflow">else</span> <span class="keywordflow">if</span>(m_2ndVectorMode == SECOND_VECTOR_EMPTY)</div>
-<div class="line"><a name="l11371"></a><span class="lineno">11371</span>&#160;    {</div>
-<div class="line"><a name="l11372"></a><span class="lineno">11372</span>&#160;        VmaSuballocation&amp; lastSuballoc = suballocations1st.back();</div>
-<div class="line"><a name="l11373"></a><span class="lineno">11373</span>&#160;        <span class="keywordflow">if</span>(lastSuballoc.offset == offset)</div>
-<div class="line"><a name="l11374"></a><span class="lineno">11374</span>&#160;        {</div>
-<div class="line"><a name="l11375"></a><span class="lineno">11375</span>&#160;            m_SumFreeSize += lastSuballoc.size;</div>
-<div class="line"><a name="l11376"></a><span class="lineno">11376</span>&#160;            suballocations1st.pop_back();</div>
-<div class="line"><a name="l11377"></a><span class="lineno">11377</span>&#160;            CleanupAfterFree();</div>
-<div class="line"><a name="l11378"></a><span class="lineno">11378</span>&#160;            <span class="keywordflow">return</span>;</div>
-<div class="line"><a name="l11379"></a><span class="lineno">11379</span>&#160;        }</div>
-<div class="line"><a name="l11380"></a><span class="lineno">11380</span>&#160;    }</div>
-<div class="line"><a name="l11381"></a><span class="lineno">11381</span>&#160; </div>
-<div class="line"><a name="l11382"></a><span class="lineno">11382</span>&#160;    <span class="comment">// Item from the middle of 1st vector.</span></div>
-<div class="line"><a name="l11383"></a><span class="lineno">11383</span>&#160;    {</div>
-<div class="line"><a name="l11384"></a><span class="lineno">11384</span>&#160;        VmaSuballocation refSuballoc;</div>
-<div class="line"><a name="l11385"></a><span class="lineno">11385</span>&#160;        refSuballoc.offset = offset;</div>
-<div class="line"><a name="l11386"></a><span class="lineno">11386</span>&#160;        <span class="comment">// Rest of members stays uninitialized intentionally for better performance.</span></div>
-<div class="line"><a name="l11387"></a><span class="lineno">11387</span>&#160;        SuballocationVectorType::iterator it = VmaBinaryFindSorted(</div>
-<div class="line"><a name="l11388"></a><span class="lineno">11388</span>&#160;            suballocations1st.begin() + m_1stNullItemsBeginCount,</div>
-<div class="line"><a name="l11389"></a><span class="lineno">11389</span>&#160;            suballocations1st.end(),</div>
-<div class="line"><a name="l11390"></a><span class="lineno">11390</span>&#160;            refSuballoc,</div>
-<div class="line"><a name="l11391"></a><span class="lineno">11391</span>&#160;            VmaSuballocationOffsetLess());</div>
-<div class="line"><a name="l11392"></a><span class="lineno">11392</span>&#160;        <span class="keywordflow">if</span>(it != suballocations1st.end())</div>
-<div class="line"><a name="l11393"></a><span class="lineno">11393</span>&#160;        {</div>
-<div class="line"><a name="l11394"></a><span class="lineno">11394</span>&#160;            it-&gt;type = VMA_SUBALLOCATION_TYPE_FREE;</div>
-<div class="line"><a name="l11395"></a><span class="lineno">11395</span>&#160;            it-&gt;hAllocation = VK_NULL_HANDLE;</div>
-<div class="line"><a name="l11396"></a><span class="lineno">11396</span>&#160;            ++m_1stNullItemsMiddleCount;</div>
-<div class="line"><a name="l11397"></a><span class="lineno">11397</span>&#160;            m_SumFreeSize += it-&gt;size;</div>
-<div class="line"><a name="l11398"></a><span class="lineno">11398</span>&#160;            CleanupAfterFree();</div>
-<div class="line"><a name="l11399"></a><span class="lineno">11399</span>&#160;            <span class="keywordflow">return</span>;</div>
-<div class="line"><a name="l11400"></a><span class="lineno">11400</span>&#160;        }</div>
-<div class="line"><a name="l11401"></a><span class="lineno">11401</span>&#160;    }</div>
-<div class="line"><a name="l11402"></a><span class="lineno">11402</span>&#160; </div>
-<div class="line"><a name="l11403"></a><span class="lineno">11403</span>&#160;    <span class="keywordflow">if</span>(m_2ndVectorMode != SECOND_VECTOR_EMPTY)</div>
-<div class="line"><a name="l11404"></a><span class="lineno">11404</span>&#160;    {</div>
-<div class="line"><a name="l11405"></a><span class="lineno">11405</span>&#160;        <span class="comment">// Item from the middle of 2nd vector.</span></div>
-<div class="line"><a name="l11406"></a><span class="lineno">11406</span>&#160;        VmaSuballocation refSuballoc;</div>
-<div class="line"><a name="l11407"></a><span class="lineno">11407</span>&#160;        refSuballoc.offset = offset;</div>
-<div class="line"><a name="l11408"></a><span class="lineno">11408</span>&#160;        <span class="comment">// Rest of members stays uninitialized intentionally for better performance.</span></div>
-<div class="line"><a name="l11409"></a><span class="lineno">11409</span>&#160;        SuballocationVectorType::iterator it = m_2ndVectorMode == SECOND_VECTOR_RING_BUFFER ?</div>
-<div class="line"><a name="l11410"></a><span class="lineno">11410</span>&#160;            VmaBinaryFindSorted(suballocations2nd.begin(), suballocations2nd.end(), refSuballoc, VmaSuballocationOffsetLess()) :</div>
-<div class="line"><a name="l11411"></a><span class="lineno">11411</span>&#160;            VmaBinaryFindSorted(suballocations2nd.begin(), suballocations2nd.end(), refSuballoc, VmaSuballocationOffsetGreater());</div>
-<div class="line"><a name="l11412"></a><span class="lineno">11412</span>&#160;        <span class="keywordflow">if</span>(it != suballocations2nd.end())</div>
-<div class="line"><a name="l11413"></a><span class="lineno">11413</span>&#160;        {</div>
-<div class="line"><a name="l11414"></a><span class="lineno">11414</span>&#160;            it-&gt;type = VMA_SUBALLOCATION_TYPE_FREE;</div>
-<div class="line"><a name="l11415"></a><span class="lineno">11415</span>&#160;            it-&gt;hAllocation = VK_NULL_HANDLE;</div>
-<div class="line"><a name="l11416"></a><span class="lineno">11416</span>&#160;            ++m_2ndNullItemsCount;</div>
-<div class="line"><a name="l11417"></a><span class="lineno">11417</span>&#160;            m_SumFreeSize += it-&gt;size;</div>
-<div class="line"><a name="l11418"></a><span class="lineno">11418</span>&#160;            CleanupAfterFree();</div>
-<div class="line"><a name="l11419"></a><span class="lineno">11419</span>&#160;            <span class="keywordflow">return</span>;</div>
-<div class="line"><a name="l11420"></a><span class="lineno">11420</span>&#160;        }</div>
-<div class="line"><a name="l11421"></a><span class="lineno">11421</span>&#160;    }</div>
-<div class="line"><a name="l11422"></a><span class="lineno">11422</span>&#160; </div>
-<div class="line"><a name="l11423"></a><span class="lineno">11423</span>&#160;    VMA_ASSERT(0 &amp;&amp; <span class="stringliteral">&quot;Allocation to free not found in linear allocator!&quot;</span>);</div>
-<div class="line"><a name="l11424"></a><span class="lineno">11424</span>&#160;}</div>
-<div class="line"><a name="l11425"></a><span class="lineno">11425</span>&#160; </div>
-<div class="line"><a name="l11426"></a><span class="lineno">11426</span>&#160;<span class="keywordtype">bool</span> VmaBlockMetadata_Linear::ShouldCompact1st()<span class="keyword"> const</span></div>
-<div class="line"><a name="l11427"></a><span class="lineno">11427</span>&#160;<span class="keyword"></span>{</div>
-<div class="line"><a name="l11428"></a><span class="lineno">11428</span>&#160;    <span class="keyword">const</span> <span class="keywordtype">size_t</span> nullItemCount = m_1stNullItemsBeginCount + m_1stNullItemsMiddleCount;</div>
-<div class="line"><a name="l11429"></a><span class="lineno">11429</span>&#160;    <span class="keyword">const</span> <span class="keywordtype">size_t</span> suballocCount = AccessSuballocations1st().size();</div>
-<div class="line"><a name="l11430"></a><span class="lineno">11430</span>&#160;    <span class="keywordflow">return</span> suballocCount &gt; 32 &amp;&amp; nullItemCount * 2 &gt;= (suballocCount - nullItemCount) * 3;</div>
-<div class="line"><a name="l11431"></a><span class="lineno">11431</span>&#160;}</div>
+<div class="line"><a name="l11363"></a><span class="lineno">11363</span>&#160;            <span class="keyword">const</span> VmaSuballocation&amp; lastSuballoc = suballocations1st.back();</div>
+<div class="line"><a name="l11364"></a><span class="lineno">11364</span>&#160;            resultBaseOffset = lastSuballoc.offset + lastSuballoc.size;</div>
+<div class="line"><a name="l11365"></a><span class="lineno">11365</span>&#160;        }</div>
+<div class="line"><a name="l11366"></a><span class="lineno">11366</span>&#160; </div>
+<div class="line"><a name="l11367"></a><span class="lineno">11367</span>&#160;        <span class="comment">// Start from offset equal to beginning of free space.</span></div>
+<div class="line"><a name="l11368"></a><span class="lineno">11368</span>&#160;        VkDeviceSize resultOffset = resultBaseOffset;</div>
+<div class="line"><a name="l11369"></a><span class="lineno">11369</span>&#160; </div>
+<div class="line"><a name="l11370"></a><span class="lineno">11370</span>&#160;        <span class="comment">// Apply VMA_DEBUG_MARGIN at the beginning.</span></div>
+<div class="line"><a name="l11371"></a><span class="lineno">11371</span>&#160;        <span class="keywordflow">if</span>(VMA_DEBUG_MARGIN &gt; 0)</div>
+<div class="line"><a name="l11372"></a><span class="lineno">11372</span>&#160;        {</div>
+<div class="line"><a name="l11373"></a><span class="lineno">11373</span>&#160;            resultOffset += VMA_DEBUG_MARGIN;</div>
+<div class="line"><a name="l11374"></a><span class="lineno">11374</span>&#160;        }</div>
+<div class="line"><a name="l11375"></a><span class="lineno">11375</span>&#160; </div>
+<div class="line"><a name="l11376"></a><span class="lineno">11376</span>&#160;        <span class="comment">// Apply alignment.</span></div>
+<div class="line"><a name="l11377"></a><span class="lineno">11377</span>&#160;        resultOffset = VmaAlignUp(resultOffset, allocAlignment);</div>
+<div class="line"><a name="l11378"></a><span class="lineno">11378</span>&#160; </div>
+<div class="line"><a name="l11379"></a><span class="lineno">11379</span>&#160;        <span class="comment">// Check previous suballocations for BufferImageGranularity conflicts.</span></div>
+<div class="line"><a name="l11380"></a><span class="lineno">11380</span>&#160;        <span class="comment">// Make bigger alignment if necessary.</span></div>
+<div class="line"><a name="l11381"></a><span class="lineno">11381</span>&#160;        <span class="keywordflow">if</span>(bufferImageGranularity &gt; 1 &amp;&amp; bufferImageGranularity != allocAlignment &amp;&amp; !suballocations1st.empty())</div>
+<div class="line"><a name="l11382"></a><span class="lineno">11382</span>&#160;        {</div>
+<div class="line"><a name="l11383"></a><span class="lineno">11383</span>&#160;            <span class="keywordtype">bool</span> bufferImageGranularityConflict = <span class="keyword">false</span>;</div>
+<div class="line"><a name="l11384"></a><span class="lineno">11384</span>&#160;            <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> prevSuballocIndex = suballocations1st.size(); prevSuballocIndex--; )</div>
+<div class="line"><a name="l11385"></a><span class="lineno">11385</span>&#160;            {</div>
+<div class="line"><a name="l11386"></a><span class="lineno">11386</span>&#160;                <span class="keyword">const</span> VmaSuballocation&amp; prevSuballoc = suballocations1st[prevSuballocIndex];</div>
+<div class="line"><a name="l11387"></a><span class="lineno">11387</span>&#160;                <span class="keywordflow">if</span>(VmaBlocksOnSamePage(prevSuballoc.offset, prevSuballoc.size, resultOffset, bufferImageGranularity))</div>
+<div class="line"><a name="l11388"></a><span class="lineno">11388</span>&#160;                {</div>
+<div class="line"><a name="l11389"></a><span class="lineno">11389</span>&#160;                    <span class="keywordflow">if</span>(VmaIsBufferImageGranularityConflict(prevSuballoc.type, allocType))</div>
+<div class="line"><a name="l11390"></a><span class="lineno">11390</span>&#160;                    {</div>
+<div class="line"><a name="l11391"></a><span class="lineno">11391</span>&#160;                        bufferImageGranularityConflict = <span class="keyword">true</span>;</div>
+<div class="line"><a name="l11392"></a><span class="lineno">11392</span>&#160;                        <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l11393"></a><span class="lineno">11393</span>&#160;                    }</div>
+<div class="line"><a name="l11394"></a><span class="lineno">11394</span>&#160;                }</div>
+<div class="line"><a name="l11395"></a><span class="lineno">11395</span>&#160;                <span class="keywordflow">else</span></div>
+<div class="line"><a name="l11396"></a><span class="lineno">11396</span>&#160;                    <span class="comment">// Already on previous page.</span></div>
+<div class="line"><a name="l11397"></a><span class="lineno">11397</span>&#160;                    <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l11398"></a><span class="lineno">11398</span>&#160;            }</div>
+<div class="line"><a name="l11399"></a><span class="lineno">11399</span>&#160;            <span class="keywordflow">if</span>(bufferImageGranularityConflict)</div>
+<div class="line"><a name="l11400"></a><span class="lineno">11400</span>&#160;            {</div>
+<div class="line"><a name="l11401"></a><span class="lineno">11401</span>&#160;                resultOffset = VmaAlignUp(resultOffset, bufferImageGranularity);</div>
+<div class="line"><a name="l11402"></a><span class="lineno">11402</span>&#160;            }</div>
+<div class="line"><a name="l11403"></a><span class="lineno">11403</span>&#160;        }</div>
+<div class="line"><a name="l11404"></a><span class="lineno">11404</span>&#160; </div>
+<div class="line"><a name="l11405"></a><span class="lineno">11405</span>&#160;        <span class="keyword">const</span> VkDeviceSize freeSpaceEnd = m_2ndVectorMode == SECOND_VECTOR_DOUBLE_STACK ?</div>
+<div class="line"><a name="l11406"></a><span class="lineno">11406</span>&#160;            suballocations2nd.back().offset : size;</div>
+<div class="line"><a name="l11407"></a><span class="lineno">11407</span>&#160; </div>
+<div class="line"><a name="l11408"></a><span class="lineno">11408</span>&#160;        <span class="comment">// There is enough free space at the end after alignment.</span></div>
+<div class="line"><a name="l11409"></a><span class="lineno">11409</span>&#160;        <span class="keywordflow">if</span>(resultOffset + allocSize + VMA_DEBUG_MARGIN &lt;= freeSpaceEnd)</div>
+<div class="line"><a name="l11410"></a><span class="lineno">11410</span>&#160;        {</div>
+<div class="line"><a name="l11411"></a><span class="lineno">11411</span>&#160;            <span class="comment">// Check next suballocations for BufferImageGranularity conflicts.</span></div>
+<div class="line"><a name="l11412"></a><span class="lineno">11412</span>&#160;            <span class="comment">// If conflict exists, allocation cannot be made here.</span></div>
+<div class="line"><a name="l11413"></a><span class="lineno">11413</span>&#160;            <span class="keywordflow">if</span>((allocSize % bufferImageGranularity || resultOffset % bufferImageGranularity) &amp;&amp; m_2ndVectorMode == SECOND_VECTOR_DOUBLE_STACK)</div>
+<div class="line"><a name="l11414"></a><span class="lineno">11414</span>&#160;            {</div>
+<div class="line"><a name="l11415"></a><span class="lineno">11415</span>&#160;                <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> nextSuballocIndex = suballocations2nd.size(); nextSuballocIndex--; )</div>
+<div class="line"><a name="l11416"></a><span class="lineno">11416</span>&#160;                {</div>
+<div class="line"><a name="l11417"></a><span class="lineno">11417</span>&#160;                    <span class="keyword">const</span> VmaSuballocation&amp; nextSuballoc = suballocations2nd[nextSuballocIndex];</div>
+<div class="line"><a name="l11418"></a><span class="lineno">11418</span>&#160;                    <span class="keywordflow">if</span>(VmaBlocksOnSamePage(resultOffset, allocSize, nextSuballoc.offset, bufferImageGranularity))</div>
+<div class="line"><a name="l11419"></a><span class="lineno">11419</span>&#160;                    {</div>
+<div class="line"><a name="l11420"></a><span class="lineno">11420</span>&#160;                        <span class="keywordflow">if</span>(VmaIsBufferImageGranularityConflict(allocType, nextSuballoc.type))</div>
+<div class="line"><a name="l11421"></a><span class="lineno">11421</span>&#160;                        {</div>
+<div class="line"><a name="l11422"></a><span class="lineno">11422</span>&#160;                            <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
+<div class="line"><a name="l11423"></a><span class="lineno">11423</span>&#160;                        }</div>
+<div class="line"><a name="l11424"></a><span class="lineno">11424</span>&#160;                    }</div>
+<div class="line"><a name="l11425"></a><span class="lineno">11425</span>&#160;                    <span class="keywordflow">else</span></div>
+<div class="line"><a name="l11426"></a><span class="lineno">11426</span>&#160;                    {</div>
+<div class="line"><a name="l11427"></a><span class="lineno">11427</span>&#160;                        <span class="comment">// Already on previous page.</span></div>
+<div class="line"><a name="l11428"></a><span class="lineno">11428</span>&#160;                        <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l11429"></a><span class="lineno">11429</span>&#160;                    }</div>
+<div class="line"><a name="l11430"></a><span class="lineno">11430</span>&#160;                }</div>
+<div class="line"><a name="l11431"></a><span class="lineno">11431</span>&#160;            }</div>
 <div class="line"><a name="l11432"></a><span class="lineno">11432</span>&#160; </div>
-<div class="line"><a name="l11433"></a><span class="lineno">11433</span>&#160;<span class="keywordtype">void</span> VmaBlockMetadata_Linear::CleanupAfterFree()</div>
-<div class="line"><a name="l11434"></a><span class="lineno">11434</span>&#160;{</div>
-<div class="line"><a name="l11435"></a><span class="lineno">11435</span>&#160;    SuballocationVectorType&amp; suballocations1st = AccessSuballocations1st();</div>
-<div class="line"><a name="l11436"></a><span class="lineno">11436</span>&#160;    SuballocationVectorType&amp; suballocations2nd = AccessSuballocations2nd();</div>
-<div class="line"><a name="l11437"></a><span class="lineno">11437</span>&#160; </div>
-<div class="line"><a name="l11438"></a><span class="lineno">11438</span>&#160;    <span class="keywordflow">if</span>(IsEmpty())</div>
-<div class="line"><a name="l11439"></a><span class="lineno">11439</span>&#160;    {</div>
-<div class="line"><a name="l11440"></a><span class="lineno">11440</span>&#160;        suballocations1st.clear();</div>
-<div class="line"><a name="l11441"></a><span class="lineno">11441</span>&#160;        suballocations2nd.clear();</div>
-<div class="line"><a name="l11442"></a><span class="lineno">11442</span>&#160;        m_1stNullItemsBeginCount = 0;</div>
-<div class="line"><a name="l11443"></a><span class="lineno">11443</span>&#160;        m_1stNullItemsMiddleCount = 0;</div>
-<div class="line"><a name="l11444"></a><span class="lineno">11444</span>&#160;        m_2ndNullItemsCount = 0;</div>
-<div class="line"><a name="l11445"></a><span class="lineno">11445</span>&#160;        m_2ndVectorMode = SECOND_VECTOR_EMPTY;</div>
-<div class="line"><a name="l11446"></a><span class="lineno">11446</span>&#160;    }</div>
-<div class="line"><a name="l11447"></a><span class="lineno">11447</span>&#160;    <span class="keywordflow">else</span></div>
-<div class="line"><a name="l11448"></a><span class="lineno">11448</span>&#160;    {</div>
-<div class="line"><a name="l11449"></a><span class="lineno">11449</span>&#160;        <span class="keyword">const</span> <span class="keywordtype">size_t</span> suballoc1stCount = suballocations1st.size();</div>
-<div class="line"><a name="l11450"></a><span class="lineno">11450</span>&#160;        <span class="keyword">const</span> <span class="keywordtype">size_t</span> nullItem1stCount = m_1stNullItemsBeginCount + m_1stNullItemsMiddleCount;</div>
-<div class="line"><a name="l11451"></a><span class="lineno">11451</span>&#160;        VMA_ASSERT(nullItem1stCount &lt;= suballoc1stCount);</div>
-<div class="line"><a name="l11452"></a><span class="lineno">11452</span>&#160; </div>
-<div class="line"><a name="l11453"></a><span class="lineno">11453</span>&#160;        <span class="comment">// Find more null items at the beginning of 1st vector.</span></div>
-<div class="line"><a name="l11454"></a><span class="lineno">11454</span>&#160;        <span class="keywordflow">while</span>(m_1stNullItemsBeginCount &lt; suballoc1stCount &amp;&amp;</div>
-<div class="line"><a name="l11455"></a><span class="lineno">11455</span>&#160;            suballocations1st[m_1stNullItemsBeginCount].hAllocation == VK_NULL_HANDLE)</div>
-<div class="line"><a name="l11456"></a><span class="lineno">11456</span>&#160;        {</div>
-<div class="line"><a name="l11457"></a><span class="lineno">11457</span>&#160;            ++m_1stNullItemsBeginCount;</div>
-<div class="line"><a name="l11458"></a><span class="lineno">11458</span>&#160;            --m_1stNullItemsMiddleCount;</div>
-<div class="line"><a name="l11459"></a><span class="lineno">11459</span>&#160;        }</div>
-<div class="line"><a name="l11460"></a><span class="lineno">11460</span>&#160; </div>
-<div class="line"><a name="l11461"></a><span class="lineno">11461</span>&#160;        <span class="comment">// Find more null items at the end of 1st vector.</span></div>
-<div class="line"><a name="l11462"></a><span class="lineno">11462</span>&#160;        <span class="keywordflow">while</span>(m_1stNullItemsMiddleCount &gt; 0 &amp;&amp;</div>
-<div class="line"><a name="l11463"></a><span class="lineno">11463</span>&#160;            suballocations1st.back().hAllocation == VK_NULL_HANDLE)</div>
-<div class="line"><a name="l11464"></a><span class="lineno">11464</span>&#160;        {</div>
-<div class="line"><a name="l11465"></a><span class="lineno">11465</span>&#160;            --m_1stNullItemsMiddleCount;</div>
-<div class="line"><a name="l11466"></a><span class="lineno">11466</span>&#160;            suballocations1st.pop_back();</div>
-<div class="line"><a name="l11467"></a><span class="lineno">11467</span>&#160;        }</div>
+<div class="line"><a name="l11433"></a><span class="lineno">11433</span>&#160;            <span class="comment">// All tests passed: Success.</span></div>
+<div class="line"><a name="l11434"></a><span class="lineno">11434</span>&#160;            pAllocationRequest-&gt;offset = resultOffset;</div>
+<div class="line"><a name="l11435"></a><span class="lineno">11435</span>&#160;            pAllocationRequest-&gt;sumFreeSize = freeSpaceEnd - resultBaseOffset;</div>
+<div class="line"><a name="l11436"></a><span class="lineno">11436</span>&#160;            pAllocationRequest-&gt;sumItemSize = 0;</div>
+<div class="line"><a name="l11437"></a><span class="lineno">11437</span>&#160;            <span class="comment">// pAllocationRequest-&gt;item, customData unused.</span></div>
+<div class="line"><a name="l11438"></a><span class="lineno">11438</span>&#160;            pAllocationRequest-&gt;type = VmaAllocationRequestType::EndOf1st;</div>
+<div class="line"><a name="l11439"></a><span class="lineno">11439</span>&#160;            pAllocationRequest-&gt;itemsToMakeLostCount = 0;</div>
+<div class="line"><a name="l11440"></a><span class="lineno">11440</span>&#160;            <span class="keywordflow">return</span> <span class="keyword">true</span>;</div>
+<div class="line"><a name="l11441"></a><span class="lineno">11441</span>&#160;        }</div>
+<div class="line"><a name="l11442"></a><span class="lineno">11442</span>&#160;    }</div>
+<div class="line"><a name="l11443"></a><span class="lineno">11443</span>&#160; </div>
+<div class="line"><a name="l11444"></a><span class="lineno">11444</span>&#160;    <span class="comment">// Wrap-around to end of 2nd vector. Try to allocate there, watching for the</span></div>
+<div class="line"><a name="l11445"></a><span class="lineno">11445</span>&#160;    <span class="comment">// beginning of 1st vector as the end of free space.</span></div>
+<div class="line"><a name="l11446"></a><span class="lineno">11446</span>&#160;    <span class="keywordflow">if</span>(m_2ndVectorMode == SECOND_VECTOR_EMPTY || m_2ndVectorMode == SECOND_VECTOR_RING_BUFFER)</div>
+<div class="line"><a name="l11447"></a><span class="lineno">11447</span>&#160;    {</div>
+<div class="line"><a name="l11448"></a><span class="lineno">11448</span>&#160;        VMA_ASSERT(!suballocations1st.empty());</div>
+<div class="line"><a name="l11449"></a><span class="lineno">11449</span>&#160; </div>
+<div class="line"><a name="l11450"></a><span class="lineno">11450</span>&#160;        VkDeviceSize resultBaseOffset = 0;</div>
+<div class="line"><a name="l11451"></a><span class="lineno">11451</span>&#160;        <span class="keywordflow">if</span>(!suballocations2nd.empty())</div>
+<div class="line"><a name="l11452"></a><span class="lineno">11452</span>&#160;        {</div>
+<div class="line"><a name="l11453"></a><span class="lineno">11453</span>&#160;            <span class="keyword">const</span> VmaSuballocation&amp; lastSuballoc = suballocations2nd.back();</div>
+<div class="line"><a name="l11454"></a><span class="lineno">11454</span>&#160;            resultBaseOffset = lastSuballoc.offset + lastSuballoc.size;</div>
+<div class="line"><a name="l11455"></a><span class="lineno">11455</span>&#160;        }</div>
+<div class="line"><a name="l11456"></a><span class="lineno">11456</span>&#160; </div>
+<div class="line"><a name="l11457"></a><span class="lineno">11457</span>&#160;        <span class="comment">// Start from offset equal to beginning of free space.</span></div>
+<div class="line"><a name="l11458"></a><span class="lineno">11458</span>&#160;        VkDeviceSize resultOffset = resultBaseOffset;</div>
+<div class="line"><a name="l11459"></a><span class="lineno">11459</span>&#160; </div>
+<div class="line"><a name="l11460"></a><span class="lineno">11460</span>&#160;        <span class="comment">// Apply VMA_DEBUG_MARGIN at the beginning.</span></div>
+<div class="line"><a name="l11461"></a><span class="lineno">11461</span>&#160;        <span class="keywordflow">if</span>(VMA_DEBUG_MARGIN &gt; 0)</div>
+<div class="line"><a name="l11462"></a><span class="lineno">11462</span>&#160;        {</div>
+<div class="line"><a name="l11463"></a><span class="lineno">11463</span>&#160;            resultOffset += VMA_DEBUG_MARGIN;</div>
+<div class="line"><a name="l11464"></a><span class="lineno">11464</span>&#160;        }</div>
+<div class="line"><a name="l11465"></a><span class="lineno">11465</span>&#160; </div>
+<div class="line"><a name="l11466"></a><span class="lineno">11466</span>&#160;        <span class="comment">// Apply alignment.</span></div>
+<div class="line"><a name="l11467"></a><span class="lineno">11467</span>&#160;        resultOffset = VmaAlignUp(resultOffset, allocAlignment);</div>
 <div class="line"><a name="l11468"></a><span class="lineno">11468</span>&#160; </div>
-<div class="line"><a name="l11469"></a><span class="lineno">11469</span>&#160;        <span class="comment">// Find more null items at the end of 2nd vector.</span></div>
-<div class="line"><a name="l11470"></a><span class="lineno">11470</span>&#160;        <span class="keywordflow">while</span>(m_2ndNullItemsCount &gt; 0 &amp;&amp;</div>
-<div class="line"><a name="l11471"></a><span class="lineno">11471</span>&#160;            suballocations2nd.back().hAllocation == VK_NULL_HANDLE)</div>
+<div class="line"><a name="l11469"></a><span class="lineno">11469</span>&#160;        <span class="comment">// Check previous suballocations for BufferImageGranularity conflicts.</span></div>
+<div class="line"><a name="l11470"></a><span class="lineno">11470</span>&#160;        <span class="comment">// Make bigger alignment if necessary.</span></div>
+<div class="line"><a name="l11471"></a><span class="lineno">11471</span>&#160;        <span class="keywordflow">if</span>(bufferImageGranularity &gt; 1 &amp;&amp; bufferImageGranularity != allocAlignment &amp;&amp; !suballocations2nd.empty())</div>
 <div class="line"><a name="l11472"></a><span class="lineno">11472</span>&#160;        {</div>
-<div class="line"><a name="l11473"></a><span class="lineno">11473</span>&#160;            --m_2ndNullItemsCount;</div>
-<div class="line"><a name="l11474"></a><span class="lineno">11474</span>&#160;            suballocations2nd.pop_back();</div>
-<div class="line"><a name="l11475"></a><span class="lineno">11475</span>&#160;        }</div>
-<div class="line"><a name="l11476"></a><span class="lineno">11476</span>&#160; </div>
-<div class="line"><a name="l11477"></a><span class="lineno">11477</span>&#160;        <span class="comment">// Find more null items at the beginning of 2nd vector.</span></div>
-<div class="line"><a name="l11478"></a><span class="lineno">11478</span>&#160;        <span class="keywordflow">while</span>(m_2ndNullItemsCount &gt; 0 &amp;&amp;</div>
-<div class="line"><a name="l11479"></a><span class="lineno">11479</span>&#160;            suballocations2nd[0].hAllocation == VK_NULL_HANDLE)</div>
-<div class="line"><a name="l11480"></a><span class="lineno">11480</span>&#160;        {</div>
-<div class="line"><a name="l11481"></a><span class="lineno">11481</span>&#160;            --m_2ndNullItemsCount;</div>
-<div class="line"><a name="l11482"></a><span class="lineno">11482</span>&#160;            VmaVectorRemove(suballocations2nd, 0);</div>
-<div class="line"><a name="l11483"></a><span class="lineno">11483</span>&#160;        }</div>
-<div class="line"><a name="l11484"></a><span class="lineno">11484</span>&#160; </div>
-<div class="line"><a name="l11485"></a><span class="lineno">11485</span>&#160;        <span class="keywordflow">if</span>(ShouldCompact1st())</div>
-<div class="line"><a name="l11486"></a><span class="lineno">11486</span>&#160;        {</div>
-<div class="line"><a name="l11487"></a><span class="lineno">11487</span>&#160;            <span class="keyword">const</span> <span class="keywordtype">size_t</span> nonNullItemCount = suballoc1stCount - nullItem1stCount;</div>
-<div class="line"><a name="l11488"></a><span class="lineno">11488</span>&#160;            <span class="keywordtype">size_t</span> srcIndex = m_1stNullItemsBeginCount;</div>
-<div class="line"><a name="l11489"></a><span class="lineno">11489</span>&#160;            <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> dstIndex = 0; dstIndex &lt; nonNullItemCount; ++dstIndex)</div>
+<div class="line"><a name="l11473"></a><span class="lineno">11473</span>&#160;            <span class="keywordtype">bool</span> bufferImageGranularityConflict = <span class="keyword">false</span>;</div>
+<div class="line"><a name="l11474"></a><span class="lineno">11474</span>&#160;            <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> prevSuballocIndex = suballocations2nd.size(); prevSuballocIndex--; )</div>
+<div class="line"><a name="l11475"></a><span class="lineno">11475</span>&#160;            {</div>
+<div class="line"><a name="l11476"></a><span class="lineno">11476</span>&#160;                <span class="keyword">const</span> VmaSuballocation&amp; prevSuballoc = suballocations2nd[prevSuballocIndex];</div>
+<div class="line"><a name="l11477"></a><span class="lineno">11477</span>&#160;                <span class="keywordflow">if</span>(VmaBlocksOnSamePage(prevSuballoc.offset, prevSuballoc.size, resultOffset, bufferImageGranularity))</div>
+<div class="line"><a name="l11478"></a><span class="lineno">11478</span>&#160;                {</div>
+<div class="line"><a name="l11479"></a><span class="lineno">11479</span>&#160;                    <span class="keywordflow">if</span>(VmaIsBufferImageGranularityConflict(prevSuballoc.type, allocType))</div>
+<div class="line"><a name="l11480"></a><span class="lineno">11480</span>&#160;                    {</div>
+<div class="line"><a name="l11481"></a><span class="lineno">11481</span>&#160;                        bufferImageGranularityConflict = <span class="keyword">true</span>;</div>
+<div class="line"><a name="l11482"></a><span class="lineno">11482</span>&#160;                        <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l11483"></a><span class="lineno">11483</span>&#160;                    }</div>
+<div class="line"><a name="l11484"></a><span class="lineno">11484</span>&#160;                }</div>
+<div class="line"><a name="l11485"></a><span class="lineno">11485</span>&#160;                <span class="keywordflow">else</span></div>
+<div class="line"><a name="l11486"></a><span class="lineno">11486</span>&#160;                    <span class="comment">// Already on previous page.</span></div>
+<div class="line"><a name="l11487"></a><span class="lineno">11487</span>&#160;                    <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l11488"></a><span class="lineno">11488</span>&#160;            }</div>
+<div class="line"><a name="l11489"></a><span class="lineno">11489</span>&#160;            <span class="keywordflow">if</span>(bufferImageGranularityConflict)</div>
 <div class="line"><a name="l11490"></a><span class="lineno">11490</span>&#160;            {</div>
-<div class="line"><a name="l11491"></a><span class="lineno">11491</span>&#160;                <span class="keywordflow">while</span>(suballocations1st[srcIndex].hAllocation == VK_NULL_HANDLE)</div>
-<div class="line"><a name="l11492"></a><span class="lineno">11492</span>&#160;                {</div>
-<div class="line"><a name="l11493"></a><span class="lineno">11493</span>&#160;                    ++srcIndex;</div>
-<div class="line"><a name="l11494"></a><span class="lineno">11494</span>&#160;                }</div>
-<div class="line"><a name="l11495"></a><span class="lineno">11495</span>&#160;                <span class="keywordflow">if</span>(dstIndex != srcIndex)</div>
-<div class="line"><a name="l11496"></a><span class="lineno">11496</span>&#160;                {</div>
-<div class="line"><a name="l11497"></a><span class="lineno">11497</span>&#160;                    suballocations1st[dstIndex] = suballocations1st[srcIndex];</div>
-<div class="line"><a name="l11498"></a><span class="lineno">11498</span>&#160;                }</div>
-<div class="line"><a name="l11499"></a><span class="lineno">11499</span>&#160;                ++srcIndex;</div>
-<div class="line"><a name="l11500"></a><span class="lineno">11500</span>&#160;            }</div>
-<div class="line"><a name="l11501"></a><span class="lineno">11501</span>&#160;            suballocations1st.resize(nonNullItemCount);</div>
-<div class="line"><a name="l11502"></a><span class="lineno">11502</span>&#160;            m_1stNullItemsBeginCount = 0;</div>
-<div class="line"><a name="l11503"></a><span class="lineno">11503</span>&#160;            m_1stNullItemsMiddleCount = 0;</div>
-<div class="line"><a name="l11504"></a><span class="lineno">11504</span>&#160;        }</div>
-<div class="line"><a name="l11505"></a><span class="lineno">11505</span>&#160; </div>
-<div class="line"><a name="l11506"></a><span class="lineno">11506</span>&#160;        <span class="comment">// 2nd vector became empty.</span></div>
-<div class="line"><a name="l11507"></a><span class="lineno">11507</span>&#160;        <span class="keywordflow">if</span>(suballocations2nd.empty())</div>
-<div class="line"><a name="l11508"></a><span class="lineno">11508</span>&#160;        {</div>
-<div class="line"><a name="l11509"></a><span class="lineno">11509</span>&#160;            m_2ndVectorMode = SECOND_VECTOR_EMPTY;</div>
-<div class="line"><a name="l11510"></a><span class="lineno">11510</span>&#160;        }</div>
-<div class="line"><a name="l11511"></a><span class="lineno">11511</span>&#160; </div>
-<div class="line"><a name="l11512"></a><span class="lineno">11512</span>&#160;        <span class="comment">// 1st vector became empty.</span></div>
-<div class="line"><a name="l11513"></a><span class="lineno">11513</span>&#160;        <span class="keywordflow">if</span>(suballocations1st.size() - m_1stNullItemsBeginCount == 0)</div>
-<div class="line"><a name="l11514"></a><span class="lineno">11514</span>&#160;        {</div>
-<div class="line"><a name="l11515"></a><span class="lineno">11515</span>&#160;            suballocations1st.clear();</div>
-<div class="line"><a name="l11516"></a><span class="lineno">11516</span>&#160;            m_1stNullItemsBeginCount = 0;</div>
-<div class="line"><a name="l11517"></a><span class="lineno">11517</span>&#160; </div>
-<div class="line"><a name="l11518"></a><span class="lineno">11518</span>&#160;            <span class="keywordflow">if</span>(!suballocations2nd.empty() &amp;&amp; m_2ndVectorMode == SECOND_VECTOR_RING_BUFFER)</div>
-<div class="line"><a name="l11519"></a><span class="lineno">11519</span>&#160;            {</div>
-<div class="line"><a name="l11520"></a><span class="lineno">11520</span>&#160;                <span class="comment">// Swap 1st with 2nd. Now 2nd is empty.</span></div>
-<div class="line"><a name="l11521"></a><span class="lineno">11521</span>&#160;                m_2ndVectorMode = SECOND_VECTOR_EMPTY;</div>
-<div class="line"><a name="l11522"></a><span class="lineno">11522</span>&#160;                m_1stNullItemsMiddleCount = m_2ndNullItemsCount;</div>
-<div class="line"><a name="l11523"></a><span class="lineno">11523</span>&#160;                <span class="keywordflow">while</span>(m_1stNullItemsBeginCount &lt; suballocations2nd.size() &amp;&amp;</div>
-<div class="line"><a name="l11524"></a><span class="lineno">11524</span>&#160;                    suballocations2nd[m_1stNullItemsBeginCount].hAllocation == VK_NULL_HANDLE)</div>
-<div class="line"><a name="l11525"></a><span class="lineno">11525</span>&#160;                {</div>
-<div class="line"><a name="l11526"></a><span class="lineno">11526</span>&#160;                    ++m_1stNullItemsBeginCount;</div>
-<div class="line"><a name="l11527"></a><span class="lineno">11527</span>&#160;                    --m_1stNullItemsMiddleCount;</div>
-<div class="line"><a name="l11528"></a><span class="lineno">11528</span>&#160;                }</div>
-<div class="line"><a name="l11529"></a><span class="lineno">11529</span>&#160;                m_2ndNullItemsCount = 0;</div>
-<div class="line"><a name="l11530"></a><span class="lineno">11530</span>&#160;                m_1stVectorIndex ^= 1;</div>
-<div class="line"><a name="l11531"></a><span class="lineno">11531</span>&#160;            }</div>
-<div class="line"><a name="l11532"></a><span class="lineno">11532</span>&#160;        }</div>
-<div class="line"><a name="l11533"></a><span class="lineno">11533</span>&#160;    }</div>
-<div class="line"><a name="l11534"></a><span class="lineno">11534</span>&#160; </div>
-<div class="line"><a name="l11535"></a><span class="lineno">11535</span>&#160;    VMA_HEAVY_ASSERT(Validate());</div>
-<div class="line"><a name="l11536"></a><span class="lineno">11536</span>&#160;}</div>
-<div class="line"><a name="l11537"></a><span class="lineno">11537</span>&#160; </div>
-<div class="line"><a name="l11538"></a><span class="lineno">11538</span>&#160; </div>
-<div class="line"><a name="l11540"></a><span class="lineno">11540</span>&#160;<span class="comment">// class VmaBlockMetadata_Buddy</span></div>
-<div class="line"><a name="l11541"></a><span class="lineno">11541</span>&#160; </div>
-<div class="line"><a name="l11542"></a><span class="lineno">11542</span>&#160;VmaBlockMetadata_Buddy::VmaBlockMetadata_Buddy(<a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator) :</div>
-<div class="line"><a name="l11543"></a><span class="lineno">11543</span>&#160;    VmaBlockMetadata(hAllocator),</div>
-<div class="line"><a name="l11544"></a><span class="lineno">11544</span>&#160;    m_Root(VMA_NULL),</div>
-<div class="line"><a name="l11545"></a><span class="lineno">11545</span>&#160;    m_AllocationCount(0),</div>
-<div class="line"><a name="l11546"></a><span class="lineno">11546</span>&#160;    m_FreeCount(1),</div>
-<div class="line"><a name="l11547"></a><span class="lineno">11547</span>&#160;    m_SumFreeSize(0)</div>
-<div class="line"><a name="l11548"></a><span class="lineno">11548</span>&#160;{</div>
-<div class="line"><a name="l11549"></a><span class="lineno">11549</span>&#160;    memset(m_FreeList, 0, <span class="keyword">sizeof</span>(m_FreeList));</div>
-<div class="line"><a name="l11550"></a><span class="lineno">11550</span>&#160;}</div>
-<div class="line"><a name="l11551"></a><span class="lineno">11551</span>&#160; </div>
-<div class="line"><a name="l11552"></a><span class="lineno">11552</span>&#160;VmaBlockMetadata_Buddy::~VmaBlockMetadata_Buddy()</div>
-<div class="line"><a name="l11553"></a><span class="lineno">11553</span>&#160;{</div>
-<div class="line"><a name="l11554"></a><span class="lineno">11554</span>&#160;    DeleteNode(m_Root);</div>
-<div class="line"><a name="l11555"></a><span class="lineno">11555</span>&#160;}</div>
-<div class="line"><a name="l11556"></a><span class="lineno">11556</span>&#160; </div>
-<div class="line"><a name="l11557"></a><span class="lineno">11557</span>&#160;<span class="keywordtype">void</span> VmaBlockMetadata_Buddy::Init(VkDeviceSize size)</div>
-<div class="line"><a name="l11558"></a><span class="lineno">11558</span>&#160;{</div>
-<div class="line"><a name="l11559"></a><span class="lineno">11559</span>&#160;    VmaBlockMetadata::Init(size);</div>
-<div class="line"><a name="l11560"></a><span class="lineno">11560</span>&#160; </div>
-<div class="line"><a name="l11561"></a><span class="lineno">11561</span>&#160;    m_UsableSize = VmaPrevPow2(size);</div>
-<div class="line"><a name="l11562"></a><span class="lineno">11562</span>&#160;    m_SumFreeSize = m_UsableSize;</div>
-<div class="line"><a name="l11563"></a><span class="lineno">11563</span>&#160; </div>
-<div class="line"><a name="l11564"></a><span class="lineno">11564</span>&#160;    <span class="comment">// Calculate m_LevelCount.</span></div>
-<div class="line"><a name="l11565"></a><span class="lineno">11565</span>&#160;    m_LevelCount = 1;</div>
-<div class="line"><a name="l11566"></a><span class="lineno">11566</span>&#160;    <span class="keywordflow">while</span>(m_LevelCount &lt; MAX_LEVELS &amp;&amp;</div>
-<div class="line"><a name="l11567"></a><span class="lineno">11567</span>&#160;        LevelToNodeSize(m_LevelCount) &gt;= MIN_NODE_SIZE)</div>
-<div class="line"><a name="l11568"></a><span class="lineno">11568</span>&#160;    {</div>
-<div class="line"><a name="l11569"></a><span class="lineno">11569</span>&#160;        ++m_LevelCount;</div>
-<div class="line"><a name="l11570"></a><span class="lineno">11570</span>&#160;    }</div>
-<div class="line"><a name="l11571"></a><span class="lineno">11571</span>&#160; </div>
-<div class="line"><a name="l11572"></a><span class="lineno">11572</span>&#160;    Node* rootNode = vma_new(GetAllocationCallbacks(), Node)();</div>
-<div class="line"><a name="l11573"></a><span class="lineno">11573</span>&#160;    rootNode-&gt;offset = 0;</div>
-<div class="line"><a name="l11574"></a><span class="lineno">11574</span>&#160;    rootNode-&gt;type = Node::TYPE_FREE;</div>
-<div class="line"><a name="l11575"></a><span class="lineno">11575</span>&#160;    rootNode-&gt;parent = VMA_NULL;</div>
-<div class="line"><a name="l11576"></a><span class="lineno">11576</span>&#160;    rootNode-&gt;buddy = VMA_NULL;</div>
-<div class="line"><a name="l11577"></a><span class="lineno">11577</span>&#160; </div>
-<div class="line"><a name="l11578"></a><span class="lineno">11578</span>&#160;    m_Root = rootNode;</div>
-<div class="line"><a name="l11579"></a><span class="lineno">11579</span>&#160;    AddToFreeListFront(0, rootNode);</div>
-<div class="line"><a name="l11580"></a><span class="lineno">11580</span>&#160;}</div>
-<div class="line"><a name="l11581"></a><span class="lineno">11581</span>&#160; </div>
-<div class="line"><a name="l11582"></a><span class="lineno">11582</span>&#160;<span class="keywordtype">bool</span> VmaBlockMetadata_Buddy::Validate()<span class="keyword"> const</span></div>
-<div class="line"><a name="l11583"></a><span class="lineno">11583</span>&#160;<span class="keyword"></span>{</div>
-<div class="line"><a name="l11584"></a><span class="lineno">11584</span>&#160;    <span class="comment">// Validate tree.</span></div>
-<div class="line"><a name="l11585"></a><span class="lineno">11585</span>&#160;    ValidationContext ctx;</div>
-<div class="line"><a name="l11586"></a><span class="lineno">11586</span>&#160;    <span class="keywordflow">if</span>(!ValidateNode(ctx, VMA_NULL, m_Root, 0, LevelToNodeSize(0)))</div>
-<div class="line"><a name="l11587"></a><span class="lineno">11587</span>&#160;    {</div>
-<div class="line"><a name="l11588"></a><span class="lineno">11588</span>&#160;        VMA_VALIDATE(<span class="keyword">false</span> &amp;&amp; <span class="stringliteral">&quot;ValidateNode failed.&quot;</span>);</div>
-<div class="line"><a name="l11589"></a><span class="lineno">11589</span>&#160;    }</div>
-<div class="line"><a name="l11590"></a><span class="lineno">11590</span>&#160;    VMA_VALIDATE(m_AllocationCount == ctx.calculatedAllocationCount);</div>
-<div class="line"><a name="l11591"></a><span class="lineno">11591</span>&#160;    VMA_VALIDATE(m_SumFreeSize == ctx.calculatedSumFreeSize);</div>
-<div class="line"><a name="l11592"></a><span class="lineno">11592</span>&#160; </div>
-<div class="line"><a name="l11593"></a><span class="lineno">11593</span>&#160;    <span class="comment">// Validate free node lists.</span></div>
-<div class="line"><a name="l11594"></a><span class="lineno">11594</span>&#160;    <span class="keywordflow">for</span>(uint32_t level = 0; level &lt; m_LevelCount; ++level)</div>
-<div class="line"><a name="l11595"></a><span class="lineno">11595</span>&#160;    {</div>
-<div class="line"><a name="l11596"></a><span class="lineno">11596</span>&#160;        VMA_VALIDATE(m_FreeList[level].front == VMA_NULL ||</div>
-<div class="line"><a name="l11597"></a><span class="lineno">11597</span>&#160;            m_FreeList[level].front-&gt;free.prev == VMA_NULL);</div>
-<div class="line"><a name="l11598"></a><span class="lineno">11598</span>&#160; </div>
-<div class="line"><a name="l11599"></a><span class="lineno">11599</span>&#160;        <span class="keywordflow">for</span>(Node* node = m_FreeList[level].front;</div>
-<div class="line"><a name="l11600"></a><span class="lineno">11600</span>&#160;            node != VMA_NULL;</div>
-<div class="line"><a name="l11601"></a><span class="lineno">11601</span>&#160;            node = node-&gt;free.next)</div>
-<div class="line"><a name="l11602"></a><span class="lineno">11602</span>&#160;        {</div>
-<div class="line"><a name="l11603"></a><span class="lineno">11603</span>&#160;            VMA_VALIDATE(node-&gt;type == Node::TYPE_FREE);</div>
-<div class="line"><a name="l11604"></a><span class="lineno">11604</span>&#160;            </div>
-<div class="line"><a name="l11605"></a><span class="lineno">11605</span>&#160;            <span class="keywordflow">if</span>(node-&gt;free.next == VMA_NULL)</div>
-<div class="line"><a name="l11606"></a><span class="lineno">11606</span>&#160;            {</div>
-<div class="line"><a name="l11607"></a><span class="lineno">11607</span>&#160;                VMA_VALIDATE(m_FreeList[level].back == node);</div>
-<div class="line"><a name="l11608"></a><span class="lineno">11608</span>&#160;            }</div>
-<div class="line"><a name="l11609"></a><span class="lineno">11609</span>&#160;            <span class="keywordflow">else</span></div>
-<div class="line"><a name="l11610"></a><span class="lineno">11610</span>&#160;            {</div>
-<div class="line"><a name="l11611"></a><span class="lineno">11611</span>&#160;                VMA_VALIDATE(node-&gt;free.next-&gt;free.prev == node);</div>
-<div class="line"><a name="l11612"></a><span class="lineno">11612</span>&#160;            }</div>
-<div class="line"><a name="l11613"></a><span class="lineno">11613</span>&#160;        }</div>
-<div class="line"><a name="l11614"></a><span class="lineno">11614</span>&#160;    }</div>
-<div class="line"><a name="l11615"></a><span class="lineno">11615</span>&#160; </div>
-<div class="line"><a name="l11616"></a><span class="lineno">11616</span>&#160;    <span class="comment">// Validate that free lists ar higher levels are empty.</span></div>
-<div class="line"><a name="l11617"></a><span class="lineno">11617</span>&#160;    <span class="keywordflow">for</span>(uint32_t level = m_LevelCount; level &lt; MAX_LEVELS; ++level)</div>
+<div class="line"><a name="l11491"></a><span class="lineno">11491</span>&#160;                resultOffset = VmaAlignUp(resultOffset, bufferImageGranularity);</div>
+<div class="line"><a name="l11492"></a><span class="lineno">11492</span>&#160;            }</div>
+<div class="line"><a name="l11493"></a><span class="lineno">11493</span>&#160;        }</div>
+<div class="line"><a name="l11494"></a><span class="lineno">11494</span>&#160; </div>
+<div class="line"><a name="l11495"></a><span class="lineno">11495</span>&#160;        pAllocationRequest-&gt;itemsToMakeLostCount = 0;</div>
+<div class="line"><a name="l11496"></a><span class="lineno">11496</span>&#160;        pAllocationRequest-&gt;sumItemSize = 0;</div>
+<div class="line"><a name="l11497"></a><span class="lineno">11497</span>&#160;        <span class="keywordtype">size_t</span> index1st = m_1stNullItemsBeginCount;</div>
+<div class="line"><a name="l11498"></a><span class="lineno">11498</span>&#160; </div>
+<div class="line"><a name="l11499"></a><span class="lineno">11499</span>&#160;        <span class="keywordflow">if</span>(canMakeOtherLost)</div>
+<div class="line"><a name="l11500"></a><span class="lineno">11500</span>&#160;        {</div>
+<div class="line"><a name="l11501"></a><span class="lineno">11501</span>&#160;            <span class="keywordflow">while</span>(index1st &lt; suballocations1st.size() &amp;&amp;</div>
+<div class="line"><a name="l11502"></a><span class="lineno">11502</span>&#160;                resultOffset + allocSize + VMA_DEBUG_MARGIN &gt; suballocations1st[index1st].offset)</div>
+<div class="line"><a name="l11503"></a><span class="lineno">11503</span>&#160;            {</div>
+<div class="line"><a name="l11504"></a><span class="lineno">11504</span>&#160;                <span class="comment">// Next colliding allocation at the beginning of 1st vector found. Try to make it lost.</span></div>
+<div class="line"><a name="l11505"></a><span class="lineno">11505</span>&#160;                <span class="keyword">const</span> VmaSuballocation&amp; suballoc = suballocations1st[index1st];</div>
+<div class="line"><a name="l11506"></a><span class="lineno">11506</span>&#160;                <span class="keywordflow">if</span>(suballoc.type == VMA_SUBALLOCATION_TYPE_FREE)</div>
+<div class="line"><a name="l11507"></a><span class="lineno">11507</span>&#160;                {</div>
+<div class="line"><a name="l11508"></a><span class="lineno">11508</span>&#160;                    <span class="comment">// No problem.</span></div>
+<div class="line"><a name="l11509"></a><span class="lineno">11509</span>&#160;                }</div>
+<div class="line"><a name="l11510"></a><span class="lineno">11510</span>&#160;                <span class="keywordflow">else</span></div>
+<div class="line"><a name="l11511"></a><span class="lineno">11511</span>&#160;                {</div>
+<div class="line"><a name="l11512"></a><span class="lineno">11512</span>&#160;                    VMA_ASSERT(suballoc.hAllocation != VK_NULL_HANDLE);</div>
+<div class="line"><a name="l11513"></a><span class="lineno">11513</span>&#160;                    <span class="keywordflow">if</span>(suballoc.hAllocation-&gt;CanBecomeLost() &amp;&amp;</div>
+<div class="line"><a name="l11514"></a><span class="lineno">11514</span>&#160;                        suballoc.hAllocation-&gt;GetLastUseFrameIndex() + frameInUseCount &lt; currentFrameIndex)</div>
+<div class="line"><a name="l11515"></a><span class="lineno">11515</span>&#160;                    {</div>
+<div class="line"><a name="l11516"></a><span class="lineno">11516</span>&#160;                        ++pAllocationRequest-&gt;itemsToMakeLostCount;</div>
+<div class="line"><a name="l11517"></a><span class="lineno">11517</span>&#160;                        pAllocationRequest-&gt;sumItemSize += suballoc.size;</div>
+<div class="line"><a name="l11518"></a><span class="lineno">11518</span>&#160;                    }</div>
+<div class="line"><a name="l11519"></a><span class="lineno">11519</span>&#160;                    <span class="keywordflow">else</span></div>
+<div class="line"><a name="l11520"></a><span class="lineno">11520</span>&#160;                    {</div>
+<div class="line"><a name="l11521"></a><span class="lineno">11521</span>&#160;                        <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
+<div class="line"><a name="l11522"></a><span class="lineno">11522</span>&#160;                    }</div>
+<div class="line"><a name="l11523"></a><span class="lineno">11523</span>&#160;                }</div>
+<div class="line"><a name="l11524"></a><span class="lineno">11524</span>&#160;                ++index1st;</div>
+<div class="line"><a name="l11525"></a><span class="lineno">11525</span>&#160;            }</div>
+<div class="line"><a name="l11526"></a><span class="lineno">11526</span>&#160; </div>
+<div class="line"><a name="l11527"></a><span class="lineno">11527</span>&#160;            <span class="comment">// Check next suballocations for BufferImageGranularity conflicts.</span></div>
+<div class="line"><a name="l11528"></a><span class="lineno">11528</span>&#160;            <span class="comment">// If conflict exists, we must mark more allocations lost or fail.</span></div>
+<div class="line"><a name="l11529"></a><span class="lineno">11529</span>&#160;            <span class="keywordflow">if</span>(allocSize % bufferImageGranularity || resultOffset % bufferImageGranularity)</div>
+<div class="line"><a name="l11530"></a><span class="lineno">11530</span>&#160;            {</div>
+<div class="line"><a name="l11531"></a><span class="lineno">11531</span>&#160;                <span class="keywordflow">while</span>(index1st &lt; suballocations1st.size())</div>
+<div class="line"><a name="l11532"></a><span class="lineno">11532</span>&#160;                {</div>
+<div class="line"><a name="l11533"></a><span class="lineno">11533</span>&#160;                    <span class="keyword">const</span> VmaSuballocation&amp; suballoc = suballocations1st[index1st];</div>
+<div class="line"><a name="l11534"></a><span class="lineno">11534</span>&#160;                    <span class="keywordflow">if</span>(VmaBlocksOnSamePage(resultOffset, allocSize, suballoc.offset, bufferImageGranularity))</div>
+<div class="line"><a name="l11535"></a><span class="lineno">11535</span>&#160;                    {</div>
+<div class="line"><a name="l11536"></a><span class="lineno">11536</span>&#160;                        <span class="keywordflow">if</span>(suballoc.hAllocation != VK_NULL_HANDLE)</div>
+<div class="line"><a name="l11537"></a><span class="lineno">11537</span>&#160;                        {</div>
+<div class="line"><a name="l11538"></a><span class="lineno">11538</span>&#160;                            <span class="comment">// Not checking actual VmaIsBufferImageGranularityConflict(allocType, suballoc.type).</span></div>
+<div class="line"><a name="l11539"></a><span class="lineno">11539</span>&#160;                            <span class="keywordflow">if</span>(suballoc.hAllocation-&gt;CanBecomeLost() &amp;&amp;</div>
+<div class="line"><a name="l11540"></a><span class="lineno">11540</span>&#160;                                suballoc.hAllocation-&gt;GetLastUseFrameIndex() + frameInUseCount &lt; currentFrameIndex)</div>
+<div class="line"><a name="l11541"></a><span class="lineno">11541</span>&#160;                            {</div>
+<div class="line"><a name="l11542"></a><span class="lineno">11542</span>&#160;                                ++pAllocationRequest-&gt;itemsToMakeLostCount;</div>
+<div class="line"><a name="l11543"></a><span class="lineno">11543</span>&#160;                                pAllocationRequest-&gt;sumItemSize += suballoc.size;</div>
+<div class="line"><a name="l11544"></a><span class="lineno">11544</span>&#160;                            }</div>
+<div class="line"><a name="l11545"></a><span class="lineno">11545</span>&#160;                            <span class="keywordflow">else</span></div>
+<div class="line"><a name="l11546"></a><span class="lineno">11546</span>&#160;                            {</div>
+<div class="line"><a name="l11547"></a><span class="lineno">11547</span>&#160;                                <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
+<div class="line"><a name="l11548"></a><span class="lineno">11548</span>&#160;                            }</div>
+<div class="line"><a name="l11549"></a><span class="lineno">11549</span>&#160;                        }</div>
+<div class="line"><a name="l11550"></a><span class="lineno">11550</span>&#160;                    }</div>
+<div class="line"><a name="l11551"></a><span class="lineno">11551</span>&#160;                    <span class="keywordflow">else</span></div>
+<div class="line"><a name="l11552"></a><span class="lineno">11552</span>&#160;                    {</div>
+<div class="line"><a name="l11553"></a><span class="lineno">11553</span>&#160;                        <span class="comment">// Already on next page.</span></div>
+<div class="line"><a name="l11554"></a><span class="lineno">11554</span>&#160;                        <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l11555"></a><span class="lineno">11555</span>&#160;                    }</div>
+<div class="line"><a name="l11556"></a><span class="lineno">11556</span>&#160;                    ++index1st;</div>
+<div class="line"><a name="l11557"></a><span class="lineno">11557</span>&#160;                }</div>
+<div class="line"><a name="l11558"></a><span class="lineno">11558</span>&#160;            }</div>
+<div class="line"><a name="l11559"></a><span class="lineno">11559</span>&#160; </div>
+<div class="line"><a name="l11560"></a><span class="lineno">11560</span>&#160;            <span class="comment">// Special case: There is not enough room at the end for this allocation, even after making all from the 1st lost.</span></div>
+<div class="line"><a name="l11561"></a><span class="lineno">11561</span>&#160;            <span class="keywordflow">if</span>(index1st == suballocations1st.size() &amp;&amp;</div>
+<div class="line"><a name="l11562"></a><span class="lineno">11562</span>&#160;                resultOffset + allocSize + VMA_DEBUG_MARGIN &gt; size)</div>
+<div class="line"><a name="l11563"></a><span class="lineno">11563</span>&#160;            {</div>
+<div class="line"><a name="l11564"></a><span class="lineno">11564</span>&#160;                <span class="comment">// TODO: This is a known bug that it&#39;s not yet implemented and the allocation is failing.</span></div>
+<div class="line"><a name="l11565"></a><span class="lineno">11565</span>&#160;                VMA_DEBUG_LOG(<span class="stringliteral">&quot;Unsupported special case in custom pool with linear allocation algorithm used as ring buffer with allocations that can be lost.&quot;</span>);</div>
+<div class="line"><a name="l11566"></a><span class="lineno">11566</span>&#160;            }</div>
+<div class="line"><a name="l11567"></a><span class="lineno">11567</span>&#160;        }</div>
+<div class="line"><a name="l11568"></a><span class="lineno">11568</span>&#160; </div>
+<div class="line"><a name="l11569"></a><span class="lineno">11569</span>&#160;        <span class="comment">// There is enough free space at the end after alignment.</span></div>
+<div class="line"><a name="l11570"></a><span class="lineno">11570</span>&#160;        <span class="keywordflow">if</span>((index1st == suballocations1st.size() &amp;&amp; resultOffset + allocSize + VMA_DEBUG_MARGIN &lt;= size) ||</div>
+<div class="line"><a name="l11571"></a><span class="lineno">11571</span>&#160;            (index1st &lt; suballocations1st.size() &amp;&amp; resultOffset + allocSize + VMA_DEBUG_MARGIN &lt;= suballocations1st[index1st].offset))</div>
+<div class="line"><a name="l11572"></a><span class="lineno">11572</span>&#160;        {</div>
+<div class="line"><a name="l11573"></a><span class="lineno">11573</span>&#160;            <span class="comment">// Check next suballocations for BufferImageGranularity conflicts.</span></div>
+<div class="line"><a name="l11574"></a><span class="lineno">11574</span>&#160;            <span class="comment">// If conflict exists, allocation cannot be made here.</span></div>
+<div class="line"><a name="l11575"></a><span class="lineno">11575</span>&#160;            <span class="keywordflow">if</span>(allocSize % bufferImageGranularity || resultOffset % bufferImageGranularity)</div>
+<div class="line"><a name="l11576"></a><span class="lineno">11576</span>&#160;            {</div>
+<div class="line"><a name="l11577"></a><span class="lineno">11577</span>&#160;                <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> nextSuballocIndex = index1st;</div>
+<div class="line"><a name="l11578"></a><span class="lineno">11578</span>&#160;                    nextSuballocIndex &lt; suballocations1st.size();</div>
+<div class="line"><a name="l11579"></a><span class="lineno">11579</span>&#160;                    nextSuballocIndex++)</div>
+<div class="line"><a name="l11580"></a><span class="lineno">11580</span>&#160;                {</div>
+<div class="line"><a name="l11581"></a><span class="lineno">11581</span>&#160;                    <span class="keyword">const</span> VmaSuballocation&amp; nextSuballoc = suballocations1st[nextSuballocIndex];</div>
+<div class="line"><a name="l11582"></a><span class="lineno">11582</span>&#160;                    <span class="keywordflow">if</span>(VmaBlocksOnSamePage(resultOffset, allocSize, nextSuballoc.offset, bufferImageGranularity))</div>
+<div class="line"><a name="l11583"></a><span class="lineno">11583</span>&#160;                    {</div>
+<div class="line"><a name="l11584"></a><span class="lineno">11584</span>&#160;                        <span class="keywordflow">if</span>(VmaIsBufferImageGranularityConflict(allocType, nextSuballoc.type))</div>
+<div class="line"><a name="l11585"></a><span class="lineno">11585</span>&#160;                        {</div>
+<div class="line"><a name="l11586"></a><span class="lineno">11586</span>&#160;                            <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
+<div class="line"><a name="l11587"></a><span class="lineno">11587</span>&#160;                        }</div>
+<div class="line"><a name="l11588"></a><span class="lineno">11588</span>&#160;                    }</div>
+<div class="line"><a name="l11589"></a><span class="lineno">11589</span>&#160;                    <span class="keywordflow">else</span></div>
+<div class="line"><a name="l11590"></a><span class="lineno">11590</span>&#160;                    {</div>
+<div class="line"><a name="l11591"></a><span class="lineno">11591</span>&#160;                        <span class="comment">// Already on next page.</span></div>
+<div class="line"><a name="l11592"></a><span class="lineno">11592</span>&#160;                        <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l11593"></a><span class="lineno">11593</span>&#160;                    }</div>
+<div class="line"><a name="l11594"></a><span class="lineno">11594</span>&#160;                }</div>
+<div class="line"><a name="l11595"></a><span class="lineno">11595</span>&#160;            }</div>
+<div class="line"><a name="l11596"></a><span class="lineno">11596</span>&#160; </div>
+<div class="line"><a name="l11597"></a><span class="lineno">11597</span>&#160;            <span class="comment">// All tests passed: Success.</span></div>
+<div class="line"><a name="l11598"></a><span class="lineno">11598</span>&#160;            pAllocationRequest-&gt;offset = resultOffset;</div>
+<div class="line"><a name="l11599"></a><span class="lineno">11599</span>&#160;            pAllocationRequest-&gt;sumFreeSize =</div>
+<div class="line"><a name="l11600"></a><span class="lineno">11600</span>&#160;                (index1st &lt; suballocations1st.size() ? suballocations1st[index1st].offset : size)</div>
+<div class="line"><a name="l11601"></a><span class="lineno">11601</span>&#160;                - resultBaseOffset</div>
+<div class="line"><a name="l11602"></a><span class="lineno">11602</span>&#160;                - pAllocationRequest-&gt;sumItemSize;</div>
+<div class="line"><a name="l11603"></a><span class="lineno">11603</span>&#160;            pAllocationRequest-&gt;type = VmaAllocationRequestType::EndOf2nd;</div>
+<div class="line"><a name="l11604"></a><span class="lineno">11604</span>&#160;            <span class="comment">// pAllocationRequest-&gt;item, customData unused.</span></div>
+<div class="line"><a name="l11605"></a><span class="lineno">11605</span>&#160;            <span class="keywordflow">return</span> <span class="keyword">true</span>;</div>
+<div class="line"><a name="l11606"></a><span class="lineno">11606</span>&#160;        }</div>
+<div class="line"><a name="l11607"></a><span class="lineno">11607</span>&#160;    }</div>
+<div class="line"><a name="l11608"></a><span class="lineno">11608</span>&#160; </div>
+<div class="line"><a name="l11609"></a><span class="lineno">11609</span>&#160;    <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
+<div class="line"><a name="l11610"></a><span class="lineno">11610</span>&#160;}</div>
+<div class="line"><a name="l11611"></a><span class="lineno">11611</span>&#160; </div>
+<div class="line"><a name="l11612"></a><span class="lineno">11612</span>&#160;<span class="keywordtype">bool</span> VmaBlockMetadata_Linear::MakeRequestedAllocationsLost(</div>
+<div class="line"><a name="l11613"></a><span class="lineno">11613</span>&#160;    uint32_t currentFrameIndex,</div>
+<div class="line"><a name="l11614"></a><span class="lineno">11614</span>&#160;    uint32_t frameInUseCount,</div>
+<div class="line"><a name="l11615"></a><span class="lineno">11615</span>&#160;    VmaAllocationRequest* pAllocationRequest)</div>
+<div class="line"><a name="l11616"></a><span class="lineno">11616</span>&#160;{</div>
+<div class="line"><a name="l11617"></a><span class="lineno">11617</span>&#160;    <span class="keywordflow">if</span>(pAllocationRequest-&gt;itemsToMakeLostCount == 0)</div>
 <div class="line"><a name="l11618"></a><span class="lineno">11618</span>&#160;    {</div>
-<div class="line"><a name="l11619"></a><span class="lineno">11619</span>&#160;        VMA_VALIDATE(m_FreeList[level].front == VMA_NULL &amp;&amp; m_FreeList[level].back == VMA_NULL);</div>
+<div class="line"><a name="l11619"></a><span class="lineno">11619</span>&#160;        <span class="keywordflow">return</span> <span class="keyword">true</span>;</div>
 <div class="line"><a name="l11620"></a><span class="lineno">11620</span>&#160;    }</div>
 <div class="line"><a name="l11621"></a><span class="lineno">11621</span>&#160; </div>
-<div class="line"><a name="l11622"></a><span class="lineno">11622</span>&#160;    <span class="keywordflow">return</span> <span class="keyword">true</span>;</div>
-<div class="line"><a name="l11623"></a><span class="lineno">11623</span>&#160;}</div>
-<div class="line"><a name="l11624"></a><span class="lineno">11624</span>&#160; </div>
-<div class="line"><a name="l11625"></a><span class="lineno">11625</span>&#160;VkDeviceSize VmaBlockMetadata_Buddy::GetUnusedRangeSizeMax()<span class="keyword"> const</span></div>
-<div class="line"><a name="l11626"></a><span class="lineno">11626</span>&#160;<span class="keyword"></span>{</div>
-<div class="line"><a name="l11627"></a><span class="lineno">11627</span>&#160;    <span class="keywordflow">for</span>(uint32_t level = 0; level &lt; m_LevelCount; ++level)</div>
-<div class="line"><a name="l11628"></a><span class="lineno">11628</span>&#160;    {</div>
-<div class="line"><a name="l11629"></a><span class="lineno">11629</span>&#160;        <span class="keywordflow">if</span>(m_FreeList[level].front != VMA_NULL)</div>
-<div class="line"><a name="l11630"></a><span class="lineno">11630</span>&#160;        {</div>
-<div class="line"><a name="l11631"></a><span class="lineno">11631</span>&#160;            <span class="keywordflow">return</span> LevelToNodeSize(level);</div>
-<div class="line"><a name="l11632"></a><span class="lineno">11632</span>&#160;        }</div>
-<div class="line"><a name="l11633"></a><span class="lineno">11633</span>&#160;    }</div>
-<div class="line"><a name="l11634"></a><span class="lineno">11634</span>&#160;    <span class="keywordflow">return</span> 0;</div>
-<div class="line"><a name="l11635"></a><span class="lineno">11635</span>&#160;}</div>
-<div class="line"><a name="l11636"></a><span class="lineno">11636</span>&#160; </div>
-<div class="line"><a name="l11637"></a><span class="lineno">11637</span>&#160;<span class="keywordtype">void</span> VmaBlockMetadata_Buddy::CalcAllocationStatInfo(<a class="code" href="struct_vma_stat_info.html">VmaStatInfo</a>&amp; outInfo)<span class="keyword"> const</span></div>
-<div class="line"><a name="l11638"></a><span class="lineno">11638</span>&#160;<span class="keyword"></span>{</div>
-<div class="line"><a name="l11639"></a><span class="lineno">11639</span>&#160;    <span class="keyword">const</span> VkDeviceSize unusableSize = GetUnusableSize();</div>
-<div class="line"><a name="l11640"></a><span class="lineno">11640</span>&#160; </div>
-<div class="line"><a name="l11641"></a><span class="lineno">11641</span>&#160;    outInfo.<a class="code" href="struct_vma_stat_info.html#abc4bb7cd611900778464c56e50c970a4">blockCount</a> = 1;</div>
-<div class="line"><a name="l11642"></a><span class="lineno">11642</span>&#160; </div>
-<div class="line"><a name="l11643"></a><span class="lineno">11643</span>&#160;    outInfo.<a class="code" href="struct_vma_stat_info.html#a537741e4d5cdddc1c0ab95ec650afaff">allocationCount</a> = outInfo.<a class="code" href="struct_vma_stat_info.html#ae06129c771bfebfd6468a7f4276502a9">unusedRangeCount</a> = 0;</div>
-<div class="line"><a name="l11644"></a><span class="lineno">11644</span>&#160;    outInfo.<a class="code" href="struct_vma_stat_info.html#ab0c6c73837e5a70c749fbd4f6064895a">usedBytes</a> = outInfo.<a class="code" href="struct_vma_stat_info.html#a1859d290aca2cd582d8dc25922092669">unusedBytes</a> = 0;</div>
-<div class="line"><a name="l11645"></a><span class="lineno">11645</span>&#160; </div>
-<div class="line"><a name="l11646"></a><span class="lineno">11646</span>&#160;    outInfo.<a class="code" href="struct_vma_stat_info.html#a17e9733a5ecd76287d4db6e66f71f50c">allocationSizeMax</a> = outInfo.<a class="code" href="struct_vma_stat_info.html#a5ba1a2476c4d39b10f7e2f7ebbb72ac4">unusedRangeSizeMax</a> = 0;</div>
-<div class="line"><a name="l11647"></a><span class="lineno">11647</span>&#160;    outInfo.<a class="code" href="struct_vma_stat_info.html#ade8b40bd3139c04aabd2fc538a356fea">allocationSizeMin</a> = outInfo.<a class="code" href="struct_vma_stat_info.html#aedeba931324f16589cd2416c0d2dd0d4">unusedRangeSizeMin</a> = UINT64_MAX;</div>
-<div class="line"><a name="l11648"></a><span class="lineno">11648</span>&#160;    outInfo.<a class="code" href="struct_vma_stat_info.html#a1081a039964e566c672e7a2347f9e599">allocationSizeAvg</a> = outInfo.<a class="code" href="struct_vma_stat_info.html#a2f9b3452af90c9768a30b7fb6ae194fc">unusedRangeSizeAvg</a> = 0; <span class="comment">// Unused.</span></div>
-<div class="line"><a name="l11649"></a><span class="lineno">11649</span>&#160; </div>
-<div class="line"><a name="l11650"></a><span class="lineno">11650</span>&#160;    CalcAllocationStatInfoNode(outInfo, m_Root, LevelToNodeSize(0));</div>
-<div class="line"><a name="l11651"></a><span class="lineno">11651</span>&#160; </div>
-<div class="line"><a name="l11652"></a><span class="lineno">11652</span>&#160;    <span class="keywordflow">if</span>(unusableSize &gt; 0)</div>
-<div class="line"><a name="l11653"></a><span class="lineno">11653</span>&#160;    {</div>
-<div class="line"><a name="l11654"></a><span class="lineno">11654</span>&#160;        ++outInfo.<a class="code" href="struct_vma_stat_info.html#ae06129c771bfebfd6468a7f4276502a9">unusedRangeCount</a>;</div>
-<div class="line"><a name="l11655"></a><span class="lineno">11655</span>&#160;        outInfo.<a class="code" href="struct_vma_stat_info.html#a1859d290aca2cd582d8dc25922092669">unusedBytes</a> += unusableSize;</div>
-<div class="line"><a name="l11656"></a><span class="lineno">11656</span>&#160;        outInfo.<a class="code" href="struct_vma_stat_info.html#a5ba1a2476c4d39b10f7e2f7ebbb72ac4">unusedRangeSizeMax</a> = VMA_MAX(outInfo.<a class="code" href="struct_vma_stat_info.html#a5ba1a2476c4d39b10f7e2f7ebbb72ac4">unusedRangeSizeMax</a>, unusableSize);</div>
-<div class="line"><a name="l11657"></a><span class="lineno">11657</span>&#160;        outInfo.<a class="code" href="struct_vma_stat_info.html#aedeba931324f16589cd2416c0d2dd0d4">unusedRangeSizeMin</a> = VMA_MIN(outInfo.<a class="code" href="struct_vma_stat_info.html#aedeba931324f16589cd2416c0d2dd0d4">unusedRangeSizeMin</a>, unusableSize);</div>
-<div class="line"><a name="l11658"></a><span class="lineno">11658</span>&#160;    }</div>
-<div class="line"><a name="l11659"></a><span class="lineno">11659</span>&#160;}</div>
-<div class="line"><a name="l11660"></a><span class="lineno">11660</span>&#160; </div>
-<div class="line"><a name="l11661"></a><span class="lineno">11661</span>&#160;<span class="keywordtype">void</span> VmaBlockMetadata_Buddy::AddPoolStats(<a class="code" href="struct_vma_pool_stats.html">VmaPoolStats</a>&amp; inoutStats)<span class="keyword"> const</span></div>
-<div class="line"><a name="l11662"></a><span class="lineno">11662</span>&#160;<span class="keyword"></span>{</div>
-<div class="line"><a name="l11663"></a><span class="lineno">11663</span>&#160;    <span class="keyword">const</span> VkDeviceSize unusableSize = GetUnusableSize();</div>
-<div class="line"><a name="l11664"></a><span class="lineno">11664</span>&#160; </div>
-<div class="line"><a name="l11665"></a><span class="lineno">11665</span>&#160;    inoutStats.<a class="code" href="struct_vma_pool_stats.html#a326807b2de2b0931cee4ed9a5f2e420c">size</a> += GetSize();</div>
-<div class="line"><a name="l11666"></a><span class="lineno">11666</span>&#160;    inoutStats.<a class="code" href="struct_vma_pool_stats.html#ad7c54874724fce7b06aba526202d82a8">unusedSize</a> += m_SumFreeSize + unusableSize;</div>
-<div class="line"><a name="l11667"></a><span class="lineno">11667</span>&#160;    inoutStats.<a class="code" href="struct_vma_pool_stats.html#ad1924eb54fffa45e9e0e65670c8fe5eb">allocationCount</a> += m_AllocationCount;</div>
-<div class="line"><a name="l11668"></a><span class="lineno">11668</span>&#160;    inoutStats.<a class="code" href="struct_vma_pool_stats.html#ae4f3546ffa4d1e598b64d8e6134854f4">unusedRangeCount</a> += m_FreeCount;</div>
-<div class="line"><a name="l11669"></a><span class="lineno">11669</span>&#160;    inoutStats.<a class="code" href="struct_vma_pool_stats.html#ab4c8f52dd42ab01998f60f0b6acc722b">unusedRangeSizeMax</a> = VMA_MAX(inoutStats.<a class="code" href="struct_vma_pool_stats.html#ab4c8f52dd42ab01998f60f0b6acc722b">unusedRangeSizeMax</a>, GetUnusedRangeSizeMax());</div>
-<div class="line"><a name="l11670"></a><span class="lineno">11670</span>&#160; </div>
-<div class="line"><a name="l11671"></a><span class="lineno">11671</span>&#160;    <span class="keywordflow">if</span>(unusableSize &gt; 0)</div>
-<div class="line"><a name="l11672"></a><span class="lineno">11672</span>&#160;    {</div>
-<div class="line"><a name="l11673"></a><span class="lineno">11673</span>&#160;        ++inoutStats.<a class="code" href="struct_vma_pool_stats.html#ae4f3546ffa4d1e598b64d8e6134854f4">unusedRangeCount</a>;</div>
-<div class="line"><a name="l11674"></a><span class="lineno">11674</span>&#160;        <span class="comment">// Not updating inoutStats.unusedRangeSizeMax with unusableSize because this space is not available for allocations.</span></div>
-<div class="line"><a name="l11675"></a><span class="lineno">11675</span>&#160;    }</div>
-<div class="line"><a name="l11676"></a><span class="lineno">11676</span>&#160;}</div>
-<div class="line"><a name="l11677"></a><span class="lineno">11677</span>&#160; </div>
-<div class="line"><a name="l11678"></a><span class="lineno">11678</span>&#160;<span class="preprocessor">#if VMA_STATS_STRING_ENABLED</span></div>
+<div class="line"><a name="l11622"></a><span class="lineno">11622</span>&#160;    VMA_ASSERT(m_2ndVectorMode == SECOND_VECTOR_EMPTY || m_2ndVectorMode == SECOND_VECTOR_RING_BUFFER);</div>
+<div class="line"><a name="l11623"></a><span class="lineno">11623</span>&#160; </div>
+<div class="line"><a name="l11624"></a><span class="lineno">11624</span>&#160;    <span class="comment">// We always start from 1st.</span></div>
+<div class="line"><a name="l11625"></a><span class="lineno">11625</span>&#160;    SuballocationVectorType* suballocations = &amp;AccessSuballocations1st();</div>
+<div class="line"><a name="l11626"></a><span class="lineno">11626</span>&#160;    <span class="keywordtype">size_t</span> index = m_1stNullItemsBeginCount;</div>
+<div class="line"><a name="l11627"></a><span class="lineno">11627</span>&#160;    <span class="keywordtype">size_t</span> madeLostCount = 0;</div>
+<div class="line"><a name="l11628"></a><span class="lineno">11628</span>&#160;    <span class="keywordflow">while</span>(madeLostCount &lt; pAllocationRequest-&gt;itemsToMakeLostCount)</div>
+<div class="line"><a name="l11629"></a><span class="lineno">11629</span>&#160;    {</div>
+<div class="line"><a name="l11630"></a><span class="lineno">11630</span>&#160;        <span class="keywordflow">if</span>(index == suballocations-&gt;size())</div>
+<div class="line"><a name="l11631"></a><span class="lineno">11631</span>&#160;        {</div>
+<div class="line"><a name="l11632"></a><span class="lineno">11632</span>&#160;            index = 0;</div>
+<div class="line"><a name="l11633"></a><span class="lineno">11633</span>&#160;            <span class="comment">// If we get to the end of 1st, we wrap around to beginning of 2nd of 1st.</span></div>
+<div class="line"><a name="l11634"></a><span class="lineno">11634</span>&#160;            <span class="keywordflow">if</span>(m_2ndVectorMode == SECOND_VECTOR_RING_BUFFER)</div>
+<div class="line"><a name="l11635"></a><span class="lineno">11635</span>&#160;            {</div>
+<div class="line"><a name="l11636"></a><span class="lineno">11636</span>&#160;                suballocations = &amp;AccessSuballocations2nd();</div>
+<div class="line"><a name="l11637"></a><span class="lineno">11637</span>&#160;            }</div>
+<div class="line"><a name="l11638"></a><span class="lineno">11638</span>&#160;            <span class="comment">// else: m_2ndVectorMode == SECOND_VECTOR_EMPTY:</span></div>
+<div class="line"><a name="l11639"></a><span class="lineno">11639</span>&#160;            <span class="comment">// suballocations continues pointing at AccessSuballocations1st().</span></div>
+<div class="line"><a name="l11640"></a><span class="lineno">11640</span>&#160;            VMA_ASSERT(!suballocations-&gt;empty());</div>
+<div class="line"><a name="l11641"></a><span class="lineno">11641</span>&#160;        }</div>
+<div class="line"><a name="l11642"></a><span class="lineno">11642</span>&#160;        VmaSuballocation&amp; suballoc = (*suballocations)[index];</div>
+<div class="line"><a name="l11643"></a><span class="lineno">11643</span>&#160;        <span class="keywordflow">if</span>(suballoc.type != VMA_SUBALLOCATION_TYPE_FREE)</div>
+<div class="line"><a name="l11644"></a><span class="lineno">11644</span>&#160;        {</div>
+<div class="line"><a name="l11645"></a><span class="lineno">11645</span>&#160;            VMA_ASSERT(suballoc.hAllocation != VK_NULL_HANDLE);</div>
+<div class="line"><a name="l11646"></a><span class="lineno">11646</span>&#160;            VMA_ASSERT(suballoc.hAllocation-&gt;CanBecomeLost());</div>
+<div class="line"><a name="l11647"></a><span class="lineno">11647</span>&#160;            <span class="keywordflow">if</span>(suballoc.hAllocation-&gt;MakeLost(currentFrameIndex, frameInUseCount))</div>
+<div class="line"><a name="l11648"></a><span class="lineno">11648</span>&#160;            {</div>
+<div class="line"><a name="l11649"></a><span class="lineno">11649</span>&#160;                suballoc.type = VMA_SUBALLOCATION_TYPE_FREE;</div>
+<div class="line"><a name="l11650"></a><span class="lineno">11650</span>&#160;                suballoc.hAllocation = VK_NULL_HANDLE;</div>
+<div class="line"><a name="l11651"></a><span class="lineno">11651</span>&#160;                m_SumFreeSize += suballoc.size;</div>
+<div class="line"><a name="l11652"></a><span class="lineno">11652</span>&#160;                <span class="keywordflow">if</span>(suballocations == &amp;AccessSuballocations1st())</div>
+<div class="line"><a name="l11653"></a><span class="lineno">11653</span>&#160;                {</div>
+<div class="line"><a name="l11654"></a><span class="lineno">11654</span>&#160;                    ++m_1stNullItemsMiddleCount;</div>
+<div class="line"><a name="l11655"></a><span class="lineno">11655</span>&#160;                }</div>
+<div class="line"><a name="l11656"></a><span class="lineno">11656</span>&#160;                <span class="keywordflow">else</span></div>
+<div class="line"><a name="l11657"></a><span class="lineno">11657</span>&#160;                {</div>
+<div class="line"><a name="l11658"></a><span class="lineno">11658</span>&#160;                    ++m_2ndNullItemsCount;</div>
+<div class="line"><a name="l11659"></a><span class="lineno">11659</span>&#160;                }</div>
+<div class="line"><a name="l11660"></a><span class="lineno">11660</span>&#160;                ++madeLostCount;</div>
+<div class="line"><a name="l11661"></a><span class="lineno">11661</span>&#160;            }</div>
+<div class="line"><a name="l11662"></a><span class="lineno">11662</span>&#160;            <span class="keywordflow">else</span></div>
+<div class="line"><a name="l11663"></a><span class="lineno">11663</span>&#160;            {</div>
+<div class="line"><a name="l11664"></a><span class="lineno">11664</span>&#160;                <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
+<div class="line"><a name="l11665"></a><span class="lineno">11665</span>&#160;            }</div>
+<div class="line"><a name="l11666"></a><span class="lineno">11666</span>&#160;        }</div>
+<div class="line"><a name="l11667"></a><span class="lineno">11667</span>&#160;        ++index;</div>
+<div class="line"><a name="l11668"></a><span class="lineno">11668</span>&#160;    }</div>
+<div class="line"><a name="l11669"></a><span class="lineno">11669</span>&#160; </div>
+<div class="line"><a name="l11670"></a><span class="lineno">11670</span>&#160;    CleanupAfterFree();</div>
+<div class="line"><a name="l11671"></a><span class="lineno">11671</span>&#160;    <span class="comment">//VMA_HEAVY_ASSERT(Validate()); // Already called by CleanupAfterFree().</span></div>
+<div class="line"><a name="l11672"></a><span class="lineno">11672</span>&#160; </div>
+<div class="line"><a name="l11673"></a><span class="lineno">11673</span>&#160;    <span class="keywordflow">return</span> <span class="keyword">true</span>;</div>
+<div class="line"><a name="l11674"></a><span class="lineno">11674</span>&#160;}</div>
+<div class="line"><a name="l11675"></a><span class="lineno">11675</span>&#160; </div>
+<div class="line"><a name="l11676"></a><span class="lineno">11676</span>&#160;uint32_t VmaBlockMetadata_Linear::MakeAllocationsLost(uint32_t currentFrameIndex, uint32_t frameInUseCount)</div>
+<div class="line"><a name="l11677"></a><span class="lineno">11677</span>&#160;{</div>
+<div class="line"><a name="l11678"></a><span class="lineno">11678</span>&#160;    uint32_t lostAllocationCount = 0;</div>
 <div class="line"><a name="l11679"></a><span class="lineno">11679</span>&#160; </div>
-<div class="line"><a name="l11680"></a><span class="lineno">11680</span>&#160;<span class="keywordtype">void</span> VmaBlockMetadata_Buddy::PrintDetailedMap(<span class="keyword">class</span> VmaJsonWriter&amp; json)<span class="keyword"> const</span></div>
-<div class="line"><a name="l11681"></a><span class="lineno">11681</span>&#160;<span class="keyword"></span>{</div>
-<div class="line"><a name="l11682"></a><span class="lineno">11682</span>&#160;    <span class="comment">// TODO optimize</span></div>
-<div class="line"><a name="l11683"></a><span class="lineno">11683</span>&#160;    <a class="code" href="struct_vma_stat_info.html">VmaStatInfo</a> stat;</div>
-<div class="line"><a name="l11684"></a><span class="lineno">11684</span>&#160;    CalcAllocationStatInfo(stat);</div>
-<div class="line"><a name="l11685"></a><span class="lineno">11685</span>&#160; </div>
-<div class="line"><a name="l11686"></a><span class="lineno">11686</span>&#160;    PrintDetailedMap_Begin(</div>
-<div class="line"><a name="l11687"></a><span class="lineno">11687</span>&#160;        json,</div>
-<div class="line"><a name="l11688"></a><span class="lineno">11688</span>&#160;        stat.<a class="code" href="struct_vma_stat_info.html#a1859d290aca2cd582d8dc25922092669">unusedBytes</a>,</div>
-<div class="line"><a name="l11689"></a><span class="lineno">11689</span>&#160;        stat.<a class="code" href="struct_vma_stat_info.html#a537741e4d5cdddc1c0ab95ec650afaff">allocationCount</a>,</div>
-<div class="line"><a name="l11690"></a><span class="lineno">11690</span>&#160;        stat.<a class="code" href="struct_vma_stat_info.html#ae06129c771bfebfd6468a7f4276502a9">unusedRangeCount</a>);</div>
-<div class="line"><a name="l11691"></a><span class="lineno">11691</span>&#160; </div>
-<div class="line"><a name="l11692"></a><span class="lineno">11692</span>&#160;    PrintDetailedMapNode(json, m_Root, LevelToNodeSize(0));</div>
-<div class="line"><a name="l11693"></a><span class="lineno">11693</span>&#160; </div>
-<div class="line"><a name="l11694"></a><span class="lineno">11694</span>&#160;    <span class="keyword">const</span> VkDeviceSize unusableSize = GetUnusableSize();</div>
-<div class="line"><a name="l11695"></a><span class="lineno">11695</span>&#160;    <span class="keywordflow">if</span>(unusableSize &gt; 0)</div>
-<div class="line"><a name="l11696"></a><span class="lineno">11696</span>&#160;    {</div>
-<div class="line"><a name="l11697"></a><span class="lineno">11697</span>&#160;        PrintDetailedMap_UnusedRange(json,</div>
-<div class="line"><a name="l11698"></a><span class="lineno">11698</span>&#160;            m_UsableSize, <span class="comment">// offset</span></div>
-<div class="line"><a name="l11699"></a><span class="lineno">11699</span>&#160;            unusableSize); <span class="comment">// size</span></div>
-<div class="line"><a name="l11700"></a><span class="lineno">11700</span>&#160;    }</div>
-<div class="line"><a name="l11701"></a><span class="lineno">11701</span>&#160; </div>
-<div class="line"><a name="l11702"></a><span class="lineno">11702</span>&#160;    PrintDetailedMap_End(json);</div>
-<div class="line"><a name="l11703"></a><span class="lineno">11703</span>&#160;}</div>
-<div class="line"><a name="l11704"></a><span class="lineno">11704</span>&#160; </div>
-<div class="line"><a name="l11705"></a><span class="lineno">11705</span>&#160;<span class="preprocessor">#endif // #if VMA_STATS_STRING_ENABLED</span></div>
-<div class="line"><a name="l11706"></a><span class="lineno">11706</span>&#160; </div>
-<div class="line"><a name="l11707"></a><span class="lineno">11707</span>&#160;<span class="keywordtype">bool</span> VmaBlockMetadata_Buddy::CreateAllocationRequest(</div>
-<div class="line"><a name="l11708"></a><span class="lineno">11708</span>&#160;    uint32_t currentFrameIndex,</div>
-<div class="line"><a name="l11709"></a><span class="lineno">11709</span>&#160;    uint32_t frameInUseCount,</div>
-<div class="line"><a name="l11710"></a><span class="lineno">11710</span>&#160;    VkDeviceSize bufferImageGranularity,</div>
-<div class="line"><a name="l11711"></a><span class="lineno">11711</span>&#160;    VkDeviceSize allocSize,</div>
-<div class="line"><a name="l11712"></a><span class="lineno">11712</span>&#160;    VkDeviceSize allocAlignment,</div>
-<div class="line"><a name="l11713"></a><span class="lineno">11713</span>&#160;    <span class="keywordtype">bool</span> upperAddress,</div>
-<div class="line"><a name="l11714"></a><span class="lineno">11714</span>&#160;    VmaSuballocationType allocType,</div>
-<div class="line"><a name="l11715"></a><span class="lineno">11715</span>&#160;    <span class="keywordtype">bool</span> canMakeOtherLost,</div>
-<div class="line"><a name="l11716"></a><span class="lineno">11716</span>&#160;    uint32_t strategy,</div>
-<div class="line"><a name="l11717"></a><span class="lineno">11717</span>&#160;    VmaAllocationRequest* pAllocationRequest)</div>
-<div class="line"><a name="l11718"></a><span class="lineno">11718</span>&#160;{</div>
-<div class="line"><a name="l11719"></a><span class="lineno">11719</span>&#160;    VMA_ASSERT(!upperAddress &amp;&amp; <span class="stringliteral">&quot;VMA_ALLOCATION_CREATE_UPPER_ADDRESS_BIT can be used only with linear algorithm.&quot;</span>);</div>
-<div class="line"><a name="l11720"></a><span class="lineno">11720</span>&#160; </div>
-<div class="line"><a name="l11721"></a><span class="lineno">11721</span>&#160;    <span class="comment">// Simple way to respect bufferImageGranularity. May be optimized some day.</span></div>
-<div class="line"><a name="l11722"></a><span class="lineno">11722</span>&#160;    <span class="comment">// Whenever it might be an OPTIMAL image...</span></div>
-<div class="line"><a name="l11723"></a><span class="lineno">11723</span>&#160;    <span class="keywordflow">if</span>(allocType == VMA_SUBALLOCATION_TYPE_UNKNOWN ||</div>
-<div class="line"><a name="l11724"></a><span class="lineno">11724</span>&#160;        allocType == VMA_SUBALLOCATION_TYPE_IMAGE_UNKNOWN ||</div>
-<div class="line"><a name="l11725"></a><span class="lineno">11725</span>&#160;        allocType == VMA_SUBALLOCATION_TYPE_IMAGE_OPTIMAL)</div>
-<div class="line"><a name="l11726"></a><span class="lineno">11726</span>&#160;    {</div>
-<div class="line"><a name="l11727"></a><span class="lineno">11727</span>&#160;        allocAlignment = VMA_MAX(allocAlignment, bufferImageGranularity);</div>
-<div class="line"><a name="l11728"></a><span class="lineno">11728</span>&#160;        allocSize = VMA_MAX(allocSize, bufferImageGranularity);</div>
-<div class="line"><a name="l11729"></a><span class="lineno">11729</span>&#160;    }</div>
-<div class="line"><a name="l11730"></a><span class="lineno">11730</span>&#160; </div>
-<div class="line"><a name="l11731"></a><span class="lineno">11731</span>&#160;    <span class="keywordflow">if</span>(allocSize &gt; m_UsableSize)</div>
-<div class="line"><a name="l11732"></a><span class="lineno">11732</span>&#160;    {</div>
-<div class="line"><a name="l11733"></a><span class="lineno">11733</span>&#160;        <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
-<div class="line"><a name="l11734"></a><span class="lineno">11734</span>&#160;    }</div>
-<div class="line"><a name="l11735"></a><span class="lineno">11735</span>&#160; </div>
-<div class="line"><a name="l11736"></a><span class="lineno">11736</span>&#160;    <span class="keyword">const</span> uint32_t targetLevel = AllocSizeToLevel(allocSize);</div>
-<div class="line"><a name="l11737"></a><span class="lineno">11737</span>&#160;    <span class="keywordflow">for</span>(uint32_t level = targetLevel + 1; level--; )</div>
-<div class="line"><a name="l11738"></a><span class="lineno">11738</span>&#160;    {</div>
-<div class="line"><a name="l11739"></a><span class="lineno">11739</span>&#160;        <span class="keywordflow">for</span>(Node* freeNode = m_FreeList[level].front;</div>
-<div class="line"><a name="l11740"></a><span class="lineno">11740</span>&#160;            freeNode != VMA_NULL;</div>
-<div class="line"><a name="l11741"></a><span class="lineno">11741</span>&#160;            freeNode = freeNode-&gt;free.next)</div>
-<div class="line"><a name="l11742"></a><span class="lineno">11742</span>&#160;        {</div>
-<div class="line"><a name="l11743"></a><span class="lineno">11743</span>&#160;            <span class="keywordflow">if</span>(freeNode-&gt;offset % allocAlignment == 0)</div>
-<div class="line"><a name="l11744"></a><span class="lineno">11744</span>&#160;            {</div>
-<div class="line"><a name="l11745"></a><span class="lineno">11745</span>&#160;                pAllocationRequest-&gt;type = VmaAllocationRequestType::Normal;</div>
-<div class="line"><a name="l11746"></a><span class="lineno">11746</span>&#160;                pAllocationRequest-&gt;offset = freeNode-&gt;offset;</div>
-<div class="line"><a name="l11747"></a><span class="lineno">11747</span>&#160;                pAllocationRequest-&gt;sumFreeSize = LevelToNodeSize(level);</div>
-<div class="line"><a name="l11748"></a><span class="lineno">11748</span>&#160;                pAllocationRequest-&gt;sumItemSize = 0;</div>
-<div class="line"><a name="l11749"></a><span class="lineno">11749</span>&#160;                pAllocationRequest-&gt;itemsToMakeLostCount = 0;</div>
-<div class="line"><a name="l11750"></a><span class="lineno">11750</span>&#160;                pAllocationRequest-&gt;customData = (<span class="keywordtype">void</span>*)(uintptr_t)level;</div>
-<div class="line"><a name="l11751"></a><span class="lineno">11751</span>&#160;                <span class="keywordflow">return</span> <span class="keyword">true</span>;</div>
-<div class="line"><a name="l11752"></a><span class="lineno">11752</span>&#160;            }</div>
-<div class="line"><a name="l11753"></a><span class="lineno">11753</span>&#160;        }</div>
-<div class="line"><a name="l11754"></a><span class="lineno">11754</span>&#160;    }</div>
-<div class="line"><a name="l11755"></a><span class="lineno">11755</span>&#160; </div>
-<div class="line"><a name="l11756"></a><span class="lineno">11756</span>&#160;    <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
-<div class="line"><a name="l11757"></a><span class="lineno">11757</span>&#160;}</div>
-<div class="line"><a name="l11758"></a><span class="lineno">11758</span>&#160; </div>
-<div class="line"><a name="l11759"></a><span class="lineno">11759</span>&#160;<span class="keywordtype">bool</span> VmaBlockMetadata_Buddy::MakeRequestedAllocationsLost(</div>
-<div class="line"><a name="l11760"></a><span class="lineno">11760</span>&#160;    uint32_t currentFrameIndex,</div>
-<div class="line"><a name="l11761"></a><span class="lineno">11761</span>&#160;    uint32_t frameInUseCount,</div>
-<div class="line"><a name="l11762"></a><span class="lineno">11762</span>&#160;    VmaAllocationRequest* pAllocationRequest)</div>
-<div class="line"><a name="l11763"></a><span class="lineno">11763</span>&#160;{</div>
-<div class="line"><a name="l11764"></a><span class="lineno">11764</span>&#160;    <span class="comment">/*</span></div>
-<div class="line"><a name="l11765"></a><span class="lineno">11765</span>&#160;<span class="comment">    Lost allocations are not supported in buddy allocator at the moment.</span></div>
-<div class="line"><a name="l11766"></a><span class="lineno">11766</span>&#160;<span class="comment">    Support might be added in the future.</span></div>
-<div class="line"><a name="l11767"></a><span class="lineno">11767</span>&#160;<span class="comment">    */</span></div>
-<div class="line"><a name="l11768"></a><span class="lineno">11768</span>&#160;    <span class="keywordflow">return</span> pAllocationRequest-&gt;itemsToMakeLostCount == 0;</div>
-<div class="line"><a name="l11769"></a><span class="lineno">11769</span>&#160;}</div>
+<div class="line"><a name="l11680"></a><span class="lineno">11680</span>&#160;    SuballocationVectorType&amp; suballocations1st = AccessSuballocations1st();</div>
+<div class="line"><a name="l11681"></a><span class="lineno">11681</span>&#160;    <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> i = m_1stNullItemsBeginCount, count = suballocations1st.size(); i &lt; count; ++i)</div>
+<div class="line"><a name="l11682"></a><span class="lineno">11682</span>&#160;    {</div>
+<div class="line"><a name="l11683"></a><span class="lineno">11683</span>&#160;        VmaSuballocation&amp; suballoc = suballocations1st[i];</div>
+<div class="line"><a name="l11684"></a><span class="lineno">11684</span>&#160;        <span class="keywordflow">if</span>(suballoc.type != VMA_SUBALLOCATION_TYPE_FREE &amp;&amp;</div>
+<div class="line"><a name="l11685"></a><span class="lineno">11685</span>&#160;            suballoc.hAllocation-&gt;CanBecomeLost() &amp;&amp;</div>
+<div class="line"><a name="l11686"></a><span class="lineno">11686</span>&#160;            suballoc.hAllocation-&gt;MakeLost(currentFrameIndex, frameInUseCount))</div>
+<div class="line"><a name="l11687"></a><span class="lineno">11687</span>&#160;        {</div>
+<div class="line"><a name="l11688"></a><span class="lineno">11688</span>&#160;            suballoc.type = VMA_SUBALLOCATION_TYPE_FREE;</div>
+<div class="line"><a name="l11689"></a><span class="lineno">11689</span>&#160;            suballoc.hAllocation = VK_NULL_HANDLE;</div>
+<div class="line"><a name="l11690"></a><span class="lineno">11690</span>&#160;            ++m_1stNullItemsMiddleCount;</div>
+<div class="line"><a name="l11691"></a><span class="lineno">11691</span>&#160;            m_SumFreeSize += suballoc.size;</div>
+<div class="line"><a name="l11692"></a><span class="lineno">11692</span>&#160;            ++lostAllocationCount;</div>
+<div class="line"><a name="l11693"></a><span class="lineno">11693</span>&#160;        }</div>
+<div class="line"><a name="l11694"></a><span class="lineno">11694</span>&#160;    }</div>
+<div class="line"><a name="l11695"></a><span class="lineno">11695</span>&#160; </div>
+<div class="line"><a name="l11696"></a><span class="lineno">11696</span>&#160;    SuballocationVectorType&amp; suballocations2nd = AccessSuballocations2nd();</div>
+<div class="line"><a name="l11697"></a><span class="lineno">11697</span>&#160;    <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> i = 0, count = suballocations2nd.size(); i &lt; count; ++i)</div>
+<div class="line"><a name="l11698"></a><span class="lineno">11698</span>&#160;    {</div>
+<div class="line"><a name="l11699"></a><span class="lineno">11699</span>&#160;        VmaSuballocation&amp; suballoc = suballocations2nd[i];</div>
+<div class="line"><a name="l11700"></a><span class="lineno">11700</span>&#160;        <span class="keywordflow">if</span>(suballoc.type != VMA_SUBALLOCATION_TYPE_FREE &amp;&amp;</div>
+<div class="line"><a name="l11701"></a><span class="lineno">11701</span>&#160;            suballoc.hAllocation-&gt;CanBecomeLost() &amp;&amp;</div>
+<div class="line"><a name="l11702"></a><span class="lineno">11702</span>&#160;            suballoc.hAllocation-&gt;MakeLost(currentFrameIndex, frameInUseCount))</div>
+<div class="line"><a name="l11703"></a><span class="lineno">11703</span>&#160;        {</div>
+<div class="line"><a name="l11704"></a><span class="lineno">11704</span>&#160;            suballoc.type = VMA_SUBALLOCATION_TYPE_FREE;</div>
+<div class="line"><a name="l11705"></a><span class="lineno">11705</span>&#160;            suballoc.hAllocation = VK_NULL_HANDLE;</div>
+<div class="line"><a name="l11706"></a><span class="lineno">11706</span>&#160;            ++m_2ndNullItemsCount;</div>
+<div class="line"><a name="l11707"></a><span class="lineno">11707</span>&#160;            m_SumFreeSize += suballoc.size;</div>
+<div class="line"><a name="l11708"></a><span class="lineno">11708</span>&#160;            ++lostAllocationCount;</div>
+<div class="line"><a name="l11709"></a><span class="lineno">11709</span>&#160;        }</div>
+<div class="line"><a name="l11710"></a><span class="lineno">11710</span>&#160;    }</div>
+<div class="line"><a name="l11711"></a><span class="lineno">11711</span>&#160; </div>
+<div class="line"><a name="l11712"></a><span class="lineno">11712</span>&#160;    <span class="keywordflow">if</span>(lostAllocationCount)</div>
+<div class="line"><a name="l11713"></a><span class="lineno">11713</span>&#160;    {</div>
+<div class="line"><a name="l11714"></a><span class="lineno">11714</span>&#160;        CleanupAfterFree();</div>
+<div class="line"><a name="l11715"></a><span class="lineno">11715</span>&#160;    }</div>
+<div class="line"><a name="l11716"></a><span class="lineno">11716</span>&#160; </div>
+<div class="line"><a name="l11717"></a><span class="lineno">11717</span>&#160;    <span class="keywordflow">return</span> lostAllocationCount;</div>
+<div class="line"><a name="l11718"></a><span class="lineno">11718</span>&#160;}</div>
+<div class="line"><a name="l11719"></a><span class="lineno">11719</span>&#160; </div>
+<div class="line"><a name="l11720"></a><span class="lineno">11720</span>&#160;VkResult VmaBlockMetadata_Linear::CheckCorruption(<span class="keyword">const</span> <span class="keywordtype">void</span>* pBlockData)</div>
+<div class="line"><a name="l11721"></a><span class="lineno">11721</span>&#160;{</div>
+<div class="line"><a name="l11722"></a><span class="lineno">11722</span>&#160;    SuballocationVectorType&amp; suballocations1st = AccessSuballocations1st();</div>
+<div class="line"><a name="l11723"></a><span class="lineno">11723</span>&#160;    <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> i = m_1stNullItemsBeginCount, count = suballocations1st.size(); i &lt; count; ++i)</div>
+<div class="line"><a name="l11724"></a><span class="lineno">11724</span>&#160;    {</div>
+<div class="line"><a name="l11725"></a><span class="lineno">11725</span>&#160;        <span class="keyword">const</span> VmaSuballocation&amp; suballoc = suballocations1st[i];</div>
+<div class="line"><a name="l11726"></a><span class="lineno">11726</span>&#160;        <span class="keywordflow">if</span>(suballoc.type != VMA_SUBALLOCATION_TYPE_FREE)</div>
+<div class="line"><a name="l11727"></a><span class="lineno">11727</span>&#160;        {</div>
+<div class="line"><a name="l11728"></a><span class="lineno">11728</span>&#160;            <span class="keywordflow">if</span>(!VmaValidateMagicValue(pBlockData, suballoc.offset - VMA_DEBUG_MARGIN))</div>
+<div class="line"><a name="l11729"></a><span class="lineno">11729</span>&#160;            {</div>
+<div class="line"><a name="l11730"></a><span class="lineno">11730</span>&#160;                VMA_ASSERT(0 &amp;&amp; <span class="stringliteral">&quot;MEMORY CORRUPTION DETECTED BEFORE VALIDATED ALLOCATION!&quot;</span>);</div>
+<div class="line"><a name="l11731"></a><span class="lineno">11731</span>&#160;                <span class="keywordflow">return</span> VK_ERROR_VALIDATION_FAILED_EXT;</div>
+<div class="line"><a name="l11732"></a><span class="lineno">11732</span>&#160;            }</div>
+<div class="line"><a name="l11733"></a><span class="lineno">11733</span>&#160;            <span class="keywordflow">if</span>(!VmaValidateMagicValue(pBlockData, suballoc.offset + suballoc.size))</div>
+<div class="line"><a name="l11734"></a><span class="lineno">11734</span>&#160;            {</div>
+<div class="line"><a name="l11735"></a><span class="lineno">11735</span>&#160;                VMA_ASSERT(0 &amp;&amp; <span class="stringliteral">&quot;MEMORY CORRUPTION DETECTED AFTER VALIDATED ALLOCATION!&quot;</span>);</div>
+<div class="line"><a name="l11736"></a><span class="lineno">11736</span>&#160;                <span class="keywordflow">return</span> VK_ERROR_VALIDATION_FAILED_EXT;</div>
+<div class="line"><a name="l11737"></a><span class="lineno">11737</span>&#160;            }</div>
+<div class="line"><a name="l11738"></a><span class="lineno">11738</span>&#160;        }</div>
+<div class="line"><a name="l11739"></a><span class="lineno">11739</span>&#160;    }</div>
+<div class="line"><a name="l11740"></a><span class="lineno">11740</span>&#160; </div>
+<div class="line"><a name="l11741"></a><span class="lineno">11741</span>&#160;    SuballocationVectorType&amp; suballocations2nd = AccessSuballocations2nd();</div>
+<div class="line"><a name="l11742"></a><span class="lineno">11742</span>&#160;    <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> i = 0, count = suballocations2nd.size(); i &lt; count; ++i)</div>
+<div class="line"><a name="l11743"></a><span class="lineno">11743</span>&#160;    {</div>
+<div class="line"><a name="l11744"></a><span class="lineno">11744</span>&#160;        <span class="keyword">const</span> VmaSuballocation&amp; suballoc = suballocations2nd[i];</div>
+<div class="line"><a name="l11745"></a><span class="lineno">11745</span>&#160;        <span class="keywordflow">if</span>(suballoc.type != VMA_SUBALLOCATION_TYPE_FREE)</div>
+<div class="line"><a name="l11746"></a><span class="lineno">11746</span>&#160;        {</div>
+<div class="line"><a name="l11747"></a><span class="lineno">11747</span>&#160;            <span class="keywordflow">if</span>(!VmaValidateMagicValue(pBlockData, suballoc.offset - VMA_DEBUG_MARGIN))</div>
+<div class="line"><a name="l11748"></a><span class="lineno">11748</span>&#160;            {</div>
+<div class="line"><a name="l11749"></a><span class="lineno">11749</span>&#160;                VMA_ASSERT(0 &amp;&amp; <span class="stringliteral">&quot;MEMORY CORRUPTION DETECTED BEFORE VALIDATED ALLOCATION!&quot;</span>);</div>
+<div class="line"><a name="l11750"></a><span class="lineno">11750</span>&#160;                <span class="keywordflow">return</span> VK_ERROR_VALIDATION_FAILED_EXT;</div>
+<div class="line"><a name="l11751"></a><span class="lineno">11751</span>&#160;            }</div>
+<div class="line"><a name="l11752"></a><span class="lineno">11752</span>&#160;            <span class="keywordflow">if</span>(!VmaValidateMagicValue(pBlockData, suballoc.offset + suballoc.size))</div>
+<div class="line"><a name="l11753"></a><span class="lineno">11753</span>&#160;            {</div>
+<div class="line"><a name="l11754"></a><span class="lineno">11754</span>&#160;                VMA_ASSERT(0 &amp;&amp; <span class="stringliteral">&quot;MEMORY CORRUPTION DETECTED AFTER VALIDATED ALLOCATION!&quot;</span>);</div>
+<div class="line"><a name="l11755"></a><span class="lineno">11755</span>&#160;                <span class="keywordflow">return</span> VK_ERROR_VALIDATION_FAILED_EXT;</div>
+<div class="line"><a name="l11756"></a><span class="lineno">11756</span>&#160;            }</div>
+<div class="line"><a name="l11757"></a><span class="lineno">11757</span>&#160;        }</div>
+<div class="line"><a name="l11758"></a><span class="lineno">11758</span>&#160;    }</div>
+<div class="line"><a name="l11759"></a><span class="lineno">11759</span>&#160; </div>
+<div class="line"><a name="l11760"></a><span class="lineno">11760</span>&#160;    <span class="keywordflow">return</span> VK_SUCCESS;</div>
+<div class="line"><a name="l11761"></a><span class="lineno">11761</span>&#160;}</div>
+<div class="line"><a name="l11762"></a><span class="lineno">11762</span>&#160; </div>
+<div class="line"><a name="l11763"></a><span class="lineno">11763</span>&#160;<span class="keywordtype">void</span> VmaBlockMetadata_Linear::Alloc(</div>
+<div class="line"><a name="l11764"></a><span class="lineno">11764</span>&#160;    <span class="keyword">const</span> VmaAllocationRequest&amp; request,</div>
+<div class="line"><a name="l11765"></a><span class="lineno">11765</span>&#160;    VmaSuballocationType type,</div>
+<div class="line"><a name="l11766"></a><span class="lineno">11766</span>&#160;    VkDeviceSize allocSize,</div>
+<div class="line"><a name="l11767"></a><span class="lineno">11767</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> hAllocation)</div>
+<div class="line"><a name="l11768"></a><span class="lineno">11768</span>&#160;{</div>
+<div class="line"><a name="l11769"></a><span class="lineno">11769</span>&#160;    <span class="keyword">const</span> VmaSuballocation newSuballoc = { request.offset, allocSize, hAllocation, type };</div>
 <div class="line"><a name="l11770"></a><span class="lineno">11770</span>&#160; </div>
-<div class="line"><a name="l11771"></a><span class="lineno">11771</span>&#160;uint32_t VmaBlockMetadata_Buddy::MakeAllocationsLost(uint32_t currentFrameIndex, uint32_t frameInUseCount)</div>
-<div class="line"><a name="l11772"></a><span class="lineno">11772</span>&#160;{</div>
-<div class="line"><a name="l11773"></a><span class="lineno">11773</span>&#160;    <span class="comment">/*</span></div>
-<div class="line"><a name="l11774"></a><span class="lineno">11774</span>&#160;<span class="comment">    Lost allocations are not supported in buddy allocator at the moment.</span></div>
-<div class="line"><a name="l11775"></a><span class="lineno">11775</span>&#160;<span class="comment">    Support might be added in the future.</span></div>
-<div class="line"><a name="l11776"></a><span class="lineno">11776</span>&#160;<span class="comment">    */</span></div>
-<div class="line"><a name="l11777"></a><span class="lineno">11777</span>&#160;    <span class="keywordflow">return</span> 0;</div>
-<div class="line"><a name="l11778"></a><span class="lineno">11778</span>&#160;}</div>
-<div class="line"><a name="l11779"></a><span class="lineno">11779</span>&#160; </div>
-<div class="line"><a name="l11780"></a><span class="lineno">11780</span>&#160;<span class="keywordtype">void</span> VmaBlockMetadata_Buddy::Alloc(</div>
-<div class="line"><a name="l11781"></a><span class="lineno">11781</span>&#160;    <span class="keyword">const</span> VmaAllocationRequest&amp; request,</div>
-<div class="line"><a name="l11782"></a><span class="lineno">11782</span>&#160;    VmaSuballocationType type,</div>
-<div class="line"><a name="l11783"></a><span class="lineno">11783</span>&#160;    VkDeviceSize allocSize,</div>
-<div class="line"><a name="l11784"></a><span class="lineno">11784</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> hAllocation)</div>
-<div class="line"><a name="l11785"></a><span class="lineno">11785</span>&#160;{</div>
-<div class="line"><a name="l11786"></a><span class="lineno">11786</span>&#160;    VMA_ASSERT(request.type == VmaAllocationRequestType::Normal);</div>
-<div class="line"><a name="l11787"></a><span class="lineno">11787</span>&#160; </div>
-<div class="line"><a name="l11788"></a><span class="lineno">11788</span>&#160;    <span class="keyword">const</span> uint32_t targetLevel = AllocSizeToLevel(allocSize);</div>
-<div class="line"><a name="l11789"></a><span class="lineno">11789</span>&#160;    uint32_t currLevel = (uint32_t)(uintptr_t)request.customData;</div>
-<div class="line"><a name="l11790"></a><span class="lineno">11790</span>&#160;    </div>
-<div class="line"><a name="l11791"></a><span class="lineno">11791</span>&#160;    Node* currNode = m_FreeList[currLevel].front;</div>
-<div class="line"><a name="l11792"></a><span class="lineno">11792</span>&#160;    VMA_ASSERT(currNode != VMA_NULL &amp;&amp; currNode-&gt;type == Node::TYPE_FREE);</div>
-<div class="line"><a name="l11793"></a><span class="lineno">11793</span>&#160;    <span class="keywordflow">while</span>(currNode-&gt;offset != request.offset)</div>
-<div class="line"><a name="l11794"></a><span class="lineno">11794</span>&#160;    {</div>
-<div class="line"><a name="l11795"></a><span class="lineno">11795</span>&#160;        currNode = currNode-&gt;free.next;</div>
-<div class="line"><a name="l11796"></a><span class="lineno">11796</span>&#160;        VMA_ASSERT(currNode != VMA_NULL &amp;&amp; currNode-&gt;type == Node::TYPE_FREE);</div>
-<div class="line"><a name="l11797"></a><span class="lineno">11797</span>&#160;    }</div>
-<div class="line"><a name="l11798"></a><span class="lineno">11798</span>&#160;    </div>
-<div class="line"><a name="l11799"></a><span class="lineno">11799</span>&#160;    <span class="comment">// Go down, splitting free nodes.</span></div>
-<div class="line"><a name="l11800"></a><span class="lineno">11800</span>&#160;    <span class="keywordflow">while</span>(currLevel &lt; targetLevel)</div>
-<div class="line"><a name="l11801"></a><span class="lineno">11801</span>&#160;    {</div>
-<div class="line"><a name="l11802"></a><span class="lineno">11802</span>&#160;        <span class="comment">// currNode is already first free node at currLevel.</span></div>
-<div class="line"><a name="l11803"></a><span class="lineno">11803</span>&#160;        <span class="comment">// Remove it from list of free nodes at this currLevel.</span></div>
-<div class="line"><a name="l11804"></a><span class="lineno">11804</span>&#160;        RemoveFromFreeList(currLevel, currNode);</div>
-<div class="line"><a name="l11805"></a><span class="lineno">11805</span>&#160;         </div>
-<div class="line"><a name="l11806"></a><span class="lineno">11806</span>&#160;        <span class="keyword">const</span> uint32_t childrenLevel = currLevel + 1;</div>
-<div class="line"><a name="l11807"></a><span class="lineno">11807</span>&#160; </div>
-<div class="line"><a name="l11808"></a><span class="lineno">11808</span>&#160;        <span class="comment">// Create two free sub-nodes.</span></div>
-<div class="line"><a name="l11809"></a><span class="lineno">11809</span>&#160;        Node* leftChild = vma_new(GetAllocationCallbacks(), Node)();</div>
-<div class="line"><a name="l11810"></a><span class="lineno">11810</span>&#160;        Node* rightChild = vma_new(GetAllocationCallbacks(), Node)();</div>
-<div class="line"><a name="l11811"></a><span class="lineno">11811</span>&#160; </div>
-<div class="line"><a name="l11812"></a><span class="lineno">11812</span>&#160;        leftChild-&gt;offset = currNode-&gt;offset;</div>
-<div class="line"><a name="l11813"></a><span class="lineno">11813</span>&#160;        leftChild-&gt;type = Node::TYPE_FREE;</div>
-<div class="line"><a name="l11814"></a><span class="lineno">11814</span>&#160;        leftChild-&gt;parent = currNode;</div>
-<div class="line"><a name="l11815"></a><span class="lineno">11815</span>&#160;        leftChild-&gt;buddy = rightChild;</div>
-<div class="line"><a name="l11816"></a><span class="lineno">11816</span>&#160; </div>
-<div class="line"><a name="l11817"></a><span class="lineno">11817</span>&#160;        rightChild-&gt;offset = currNode-&gt;offset + LevelToNodeSize(childrenLevel);</div>
-<div class="line"><a name="l11818"></a><span class="lineno">11818</span>&#160;        rightChild-&gt;type = Node::TYPE_FREE;</div>
-<div class="line"><a name="l11819"></a><span class="lineno">11819</span>&#160;        rightChild-&gt;parent = currNode;</div>
-<div class="line"><a name="l11820"></a><span class="lineno">11820</span>&#160;        rightChild-&gt;buddy = leftChild;</div>
-<div class="line"><a name="l11821"></a><span class="lineno">11821</span>&#160; </div>
-<div class="line"><a name="l11822"></a><span class="lineno">11822</span>&#160;        <span class="comment">// Convert current currNode to split type.</span></div>
-<div class="line"><a name="l11823"></a><span class="lineno">11823</span>&#160;        currNode-&gt;type = Node::TYPE_SPLIT;</div>
-<div class="line"><a name="l11824"></a><span class="lineno">11824</span>&#160;        currNode-&gt;split.leftChild = leftChild;</div>
-<div class="line"><a name="l11825"></a><span class="lineno">11825</span>&#160; </div>
-<div class="line"><a name="l11826"></a><span class="lineno">11826</span>&#160;        <span class="comment">// Add child nodes to free list. Order is important!</span></div>
-<div class="line"><a name="l11827"></a><span class="lineno">11827</span>&#160;        AddToFreeListFront(childrenLevel, rightChild);</div>
-<div class="line"><a name="l11828"></a><span class="lineno">11828</span>&#160;        AddToFreeListFront(childrenLevel, leftChild);</div>
+<div class="line"><a name="l11771"></a><span class="lineno">11771</span>&#160;    <span class="keywordflow">switch</span>(request.type)</div>
+<div class="line"><a name="l11772"></a><span class="lineno">11772</span>&#160;    {</div>
+<div class="line"><a name="l11773"></a><span class="lineno">11773</span>&#160;    <span class="keywordflow">case</span> VmaAllocationRequestType::UpperAddress:</div>
+<div class="line"><a name="l11774"></a><span class="lineno">11774</span>&#160;        {</div>
+<div class="line"><a name="l11775"></a><span class="lineno">11775</span>&#160;            VMA_ASSERT(m_2ndVectorMode != SECOND_VECTOR_RING_BUFFER &amp;&amp;</div>
+<div class="line"><a name="l11776"></a><span class="lineno">11776</span>&#160;                <span class="stringliteral">&quot;CRITICAL ERROR: Trying to use linear allocator as double stack while it was already used as ring buffer.&quot;</span>);</div>
+<div class="line"><a name="l11777"></a><span class="lineno">11777</span>&#160;            SuballocationVectorType&amp; suballocations2nd = AccessSuballocations2nd();</div>
+<div class="line"><a name="l11778"></a><span class="lineno">11778</span>&#160;            suballocations2nd.push_back(newSuballoc);</div>
+<div class="line"><a name="l11779"></a><span class="lineno">11779</span>&#160;            m_2ndVectorMode = SECOND_VECTOR_DOUBLE_STACK;</div>
+<div class="line"><a name="l11780"></a><span class="lineno">11780</span>&#160;        }</div>
+<div class="line"><a name="l11781"></a><span class="lineno">11781</span>&#160;        <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l11782"></a><span class="lineno">11782</span>&#160;    <span class="keywordflow">case</span> VmaAllocationRequestType::EndOf1st:</div>
+<div class="line"><a name="l11783"></a><span class="lineno">11783</span>&#160;        {</div>
+<div class="line"><a name="l11784"></a><span class="lineno">11784</span>&#160;            SuballocationVectorType&amp; suballocations1st = AccessSuballocations1st();</div>
+<div class="line"><a name="l11785"></a><span class="lineno">11785</span>&#160; </div>
+<div class="line"><a name="l11786"></a><span class="lineno">11786</span>&#160;            VMA_ASSERT(suballocations1st.empty() ||</div>
+<div class="line"><a name="l11787"></a><span class="lineno">11787</span>&#160;                request.offset &gt;= suballocations1st.back().offset + suballocations1st.back().size);</div>
+<div class="line"><a name="l11788"></a><span class="lineno">11788</span>&#160;            <span class="comment">// Check if it fits before the end of the block.</span></div>
+<div class="line"><a name="l11789"></a><span class="lineno">11789</span>&#160;            VMA_ASSERT(request.offset + allocSize &lt;= GetSize());</div>
+<div class="line"><a name="l11790"></a><span class="lineno">11790</span>&#160; </div>
+<div class="line"><a name="l11791"></a><span class="lineno">11791</span>&#160;            suballocations1st.push_back(newSuballoc);</div>
+<div class="line"><a name="l11792"></a><span class="lineno">11792</span>&#160;        }</div>
+<div class="line"><a name="l11793"></a><span class="lineno">11793</span>&#160;        <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l11794"></a><span class="lineno">11794</span>&#160;    <span class="keywordflow">case</span> VmaAllocationRequestType::EndOf2nd:</div>
+<div class="line"><a name="l11795"></a><span class="lineno">11795</span>&#160;        {</div>
+<div class="line"><a name="l11796"></a><span class="lineno">11796</span>&#160;            SuballocationVectorType&amp; suballocations1st = AccessSuballocations1st();</div>
+<div class="line"><a name="l11797"></a><span class="lineno">11797</span>&#160;            <span class="comment">// New allocation at the end of 2-part ring buffer, so before first allocation from 1st vector.</span></div>
+<div class="line"><a name="l11798"></a><span class="lineno">11798</span>&#160;            VMA_ASSERT(!suballocations1st.empty() &amp;&amp;</div>
+<div class="line"><a name="l11799"></a><span class="lineno">11799</span>&#160;                request.offset + allocSize &lt;= suballocations1st[m_1stNullItemsBeginCount].offset);</div>
+<div class="line"><a name="l11800"></a><span class="lineno">11800</span>&#160;            SuballocationVectorType&amp; suballocations2nd = AccessSuballocations2nd();</div>
+<div class="line"><a name="l11801"></a><span class="lineno">11801</span>&#160; </div>
+<div class="line"><a name="l11802"></a><span class="lineno">11802</span>&#160;            <span class="keywordflow">switch</span>(m_2ndVectorMode)</div>
+<div class="line"><a name="l11803"></a><span class="lineno">11803</span>&#160;            {</div>
+<div class="line"><a name="l11804"></a><span class="lineno">11804</span>&#160;            <span class="keywordflow">case</span> SECOND_VECTOR_EMPTY:</div>
+<div class="line"><a name="l11805"></a><span class="lineno">11805</span>&#160;                <span class="comment">// First allocation from second part ring buffer.</span></div>
+<div class="line"><a name="l11806"></a><span class="lineno">11806</span>&#160;                VMA_ASSERT(suballocations2nd.empty());</div>
+<div class="line"><a name="l11807"></a><span class="lineno">11807</span>&#160;                m_2ndVectorMode = SECOND_VECTOR_RING_BUFFER;</div>
+<div class="line"><a name="l11808"></a><span class="lineno">11808</span>&#160;                <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l11809"></a><span class="lineno">11809</span>&#160;            <span class="keywordflow">case</span> SECOND_VECTOR_RING_BUFFER:</div>
+<div class="line"><a name="l11810"></a><span class="lineno">11810</span>&#160;                <span class="comment">// 2-part ring buffer is already started.</span></div>
+<div class="line"><a name="l11811"></a><span class="lineno">11811</span>&#160;                VMA_ASSERT(!suballocations2nd.empty());</div>
+<div class="line"><a name="l11812"></a><span class="lineno">11812</span>&#160;                <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l11813"></a><span class="lineno">11813</span>&#160;            <span class="keywordflow">case</span> SECOND_VECTOR_DOUBLE_STACK:</div>
+<div class="line"><a name="l11814"></a><span class="lineno">11814</span>&#160;                VMA_ASSERT(0 &amp;&amp; <span class="stringliteral">&quot;CRITICAL ERROR: Trying to use linear allocator as ring buffer while it was already used as double stack.&quot;</span>);</div>
+<div class="line"><a name="l11815"></a><span class="lineno">11815</span>&#160;                <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l11816"></a><span class="lineno">11816</span>&#160;            <span class="keywordflow">default</span>:</div>
+<div class="line"><a name="l11817"></a><span class="lineno">11817</span>&#160;                VMA_ASSERT(0);</div>
+<div class="line"><a name="l11818"></a><span class="lineno">11818</span>&#160;            }</div>
+<div class="line"><a name="l11819"></a><span class="lineno">11819</span>&#160; </div>
+<div class="line"><a name="l11820"></a><span class="lineno">11820</span>&#160;            suballocations2nd.push_back(newSuballoc);</div>
+<div class="line"><a name="l11821"></a><span class="lineno">11821</span>&#160;        }</div>
+<div class="line"><a name="l11822"></a><span class="lineno">11822</span>&#160;        <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l11823"></a><span class="lineno">11823</span>&#160;    <span class="keywordflow">default</span>:</div>
+<div class="line"><a name="l11824"></a><span class="lineno">11824</span>&#160;        VMA_ASSERT(0 &amp;&amp; <span class="stringliteral">&quot;CRITICAL INTERNAL ERROR.&quot;</span>);</div>
+<div class="line"><a name="l11825"></a><span class="lineno">11825</span>&#160;    }</div>
+<div class="line"><a name="l11826"></a><span class="lineno">11826</span>&#160; </div>
+<div class="line"><a name="l11827"></a><span class="lineno">11827</span>&#160;    m_SumFreeSize -= newSuballoc.size;</div>
+<div class="line"><a name="l11828"></a><span class="lineno">11828</span>&#160;}</div>
 <div class="line"><a name="l11829"></a><span class="lineno">11829</span>&#160; </div>
-<div class="line"><a name="l11830"></a><span class="lineno">11830</span>&#160;        ++m_FreeCount;</div>
-<div class="line"><a name="l11831"></a><span class="lineno">11831</span>&#160;        <span class="comment">//m_SumFreeSize -= LevelToNodeSize(currLevel) % 2; // Useful only when level node sizes can be non power of 2.</span></div>
-<div class="line"><a name="l11832"></a><span class="lineno">11832</span>&#160;        ++currLevel;</div>
-<div class="line"><a name="l11833"></a><span class="lineno">11833</span>&#160;        currNode = m_FreeList[currLevel].front;</div>
+<div class="line"><a name="l11830"></a><span class="lineno">11830</span>&#160;<span class="keywordtype">void</span> VmaBlockMetadata_Linear::Free(<span class="keyword">const</span> <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation)</div>
+<div class="line"><a name="l11831"></a><span class="lineno">11831</span>&#160;{</div>
+<div class="line"><a name="l11832"></a><span class="lineno">11832</span>&#160;    FreeAtOffset(allocation-&gt;GetOffset());</div>
+<div class="line"><a name="l11833"></a><span class="lineno">11833</span>&#160;}</div>
 <div class="line"><a name="l11834"></a><span class="lineno">11834</span>&#160; </div>
-<div class="line"><a name="l11835"></a><span class="lineno">11835</span>&#160;        <span class="comment">/*</span></div>
-<div class="line"><a name="l11836"></a><span class="lineno">11836</span>&#160;<span class="comment">        We can be sure that currNode, as left child of node previously split,</span></div>
-<div class="line"><a name="l11837"></a><span class="lineno">11837</span>&#160;<span class="comment">        also fullfills the alignment requirement.</span></div>
-<div class="line"><a name="l11838"></a><span class="lineno">11838</span>&#160;<span class="comment">        */</span></div>
-<div class="line"><a name="l11839"></a><span class="lineno">11839</span>&#160;    }</div>
-<div class="line"><a name="l11840"></a><span class="lineno">11840</span>&#160; </div>
-<div class="line"><a name="l11841"></a><span class="lineno">11841</span>&#160;    <span class="comment">// Remove from free list.</span></div>
-<div class="line"><a name="l11842"></a><span class="lineno">11842</span>&#160;    VMA_ASSERT(currLevel == targetLevel &amp;&amp;</div>
-<div class="line"><a name="l11843"></a><span class="lineno">11843</span>&#160;        currNode != VMA_NULL &amp;&amp;</div>
-<div class="line"><a name="l11844"></a><span class="lineno">11844</span>&#160;        currNode-&gt;type == Node::TYPE_FREE);</div>
-<div class="line"><a name="l11845"></a><span class="lineno">11845</span>&#160;    RemoveFromFreeList(currLevel, currNode);</div>
-<div class="line"><a name="l11846"></a><span class="lineno">11846</span>&#160; </div>
-<div class="line"><a name="l11847"></a><span class="lineno">11847</span>&#160;    <span class="comment">// Convert to allocation node.</span></div>
-<div class="line"><a name="l11848"></a><span class="lineno">11848</span>&#160;    currNode-&gt;type = Node::TYPE_ALLOCATION;</div>
-<div class="line"><a name="l11849"></a><span class="lineno">11849</span>&#160;    currNode-&gt;allocation.alloc = hAllocation;</div>
-<div class="line"><a name="l11850"></a><span class="lineno">11850</span>&#160; </div>
-<div class="line"><a name="l11851"></a><span class="lineno">11851</span>&#160;    ++m_AllocationCount;</div>
-<div class="line"><a name="l11852"></a><span class="lineno">11852</span>&#160;    --m_FreeCount;</div>
-<div class="line"><a name="l11853"></a><span class="lineno">11853</span>&#160;    m_SumFreeSize -= allocSize;</div>
-<div class="line"><a name="l11854"></a><span class="lineno">11854</span>&#160;}</div>
-<div class="line"><a name="l11855"></a><span class="lineno">11855</span>&#160; </div>
-<div class="line"><a name="l11856"></a><span class="lineno">11856</span>&#160;<span class="keywordtype">void</span> VmaBlockMetadata_Buddy::DeleteNode(Node* node)</div>
-<div class="line"><a name="l11857"></a><span class="lineno">11857</span>&#160;{</div>
-<div class="line"><a name="l11858"></a><span class="lineno">11858</span>&#160;    <span class="keywordflow">if</span>(node-&gt;type == Node::TYPE_SPLIT)</div>
-<div class="line"><a name="l11859"></a><span class="lineno">11859</span>&#160;    {</div>
-<div class="line"><a name="l11860"></a><span class="lineno">11860</span>&#160;        DeleteNode(node-&gt;split.leftChild-&gt;buddy);</div>
-<div class="line"><a name="l11861"></a><span class="lineno">11861</span>&#160;        DeleteNode(node-&gt;split.leftChild);</div>
-<div class="line"><a name="l11862"></a><span class="lineno">11862</span>&#160;    }</div>
-<div class="line"><a name="l11863"></a><span class="lineno">11863</span>&#160; </div>
-<div class="line"><a name="l11864"></a><span class="lineno">11864</span>&#160;    vma_delete(GetAllocationCallbacks(), node);</div>
-<div class="line"><a name="l11865"></a><span class="lineno">11865</span>&#160;}</div>
-<div class="line"><a name="l11866"></a><span class="lineno">11866</span>&#160; </div>
-<div class="line"><a name="l11867"></a><span class="lineno">11867</span>&#160;<span class="keywordtype">bool</span> VmaBlockMetadata_Buddy::ValidateNode(ValidationContext&amp; ctx, <span class="keyword">const</span> Node* parent, <span class="keyword">const</span> Node* curr, uint32_t level, VkDeviceSize levelNodeSize)<span class="keyword"> const</span></div>
-<div class="line"><a name="l11868"></a><span class="lineno">11868</span>&#160;<span class="keyword"></span>{</div>
-<div class="line"><a name="l11869"></a><span class="lineno">11869</span>&#160;    VMA_VALIDATE(level &lt; m_LevelCount);</div>
-<div class="line"><a name="l11870"></a><span class="lineno">11870</span>&#160;    VMA_VALIDATE(curr-&gt;parent == parent);</div>
-<div class="line"><a name="l11871"></a><span class="lineno">11871</span>&#160;    VMA_VALIDATE((curr-&gt;buddy == VMA_NULL) == (parent == VMA_NULL));</div>
-<div class="line"><a name="l11872"></a><span class="lineno">11872</span>&#160;    VMA_VALIDATE(curr-&gt;buddy == VMA_NULL || curr-&gt;buddy-&gt;buddy == curr);</div>
-<div class="line"><a name="l11873"></a><span class="lineno">11873</span>&#160;    <span class="keywordflow">switch</span>(curr-&gt;type)</div>
-<div class="line"><a name="l11874"></a><span class="lineno">11874</span>&#160;    {</div>
-<div class="line"><a name="l11875"></a><span class="lineno">11875</span>&#160;    <span class="keywordflow">case</span> Node::TYPE_FREE:</div>
-<div class="line"><a name="l11876"></a><span class="lineno">11876</span>&#160;        <span class="comment">// curr-&gt;free.prev, next are validated separately.</span></div>
-<div class="line"><a name="l11877"></a><span class="lineno">11877</span>&#160;        ctx.calculatedSumFreeSize += levelNodeSize;</div>
-<div class="line"><a name="l11878"></a><span class="lineno">11878</span>&#160;        ++ctx.calculatedFreeCount;</div>
-<div class="line"><a name="l11879"></a><span class="lineno">11879</span>&#160;        <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l11880"></a><span class="lineno">11880</span>&#160;    <span class="keywordflow">case</span> Node::TYPE_ALLOCATION:</div>
-<div class="line"><a name="l11881"></a><span class="lineno">11881</span>&#160;        ++ctx.calculatedAllocationCount;</div>
-<div class="line"><a name="l11882"></a><span class="lineno">11882</span>&#160;        ctx.calculatedSumFreeSize += levelNodeSize - curr-&gt;allocation.alloc-&gt;GetSize();</div>
-<div class="line"><a name="l11883"></a><span class="lineno">11883</span>&#160;        VMA_VALIDATE(curr-&gt;allocation.alloc != VK_NULL_HANDLE);</div>
-<div class="line"><a name="l11884"></a><span class="lineno">11884</span>&#160;        <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l11885"></a><span class="lineno">11885</span>&#160;    <span class="keywordflow">case</span> Node::TYPE_SPLIT:</div>
-<div class="line"><a name="l11886"></a><span class="lineno">11886</span>&#160;        {</div>
-<div class="line"><a name="l11887"></a><span class="lineno">11887</span>&#160;            <span class="keyword">const</span> uint32_t childrenLevel = level + 1;</div>
-<div class="line"><a name="l11888"></a><span class="lineno">11888</span>&#160;            <span class="keyword">const</span> VkDeviceSize childrenLevelNodeSize = levelNodeSize / 2;</div>
-<div class="line"><a name="l11889"></a><span class="lineno">11889</span>&#160;            <span class="keyword">const</span> Node* <span class="keyword">const</span> leftChild = curr-&gt;split.leftChild;</div>
-<div class="line"><a name="l11890"></a><span class="lineno">11890</span>&#160;            VMA_VALIDATE(leftChild != VMA_NULL);</div>
-<div class="line"><a name="l11891"></a><span class="lineno">11891</span>&#160;            VMA_VALIDATE(leftChild-&gt;offset == curr-&gt;offset);</div>
-<div class="line"><a name="l11892"></a><span class="lineno">11892</span>&#160;            <span class="keywordflow">if</span>(!ValidateNode(ctx, curr, leftChild, childrenLevel, childrenLevelNodeSize))</div>
-<div class="line"><a name="l11893"></a><span class="lineno">11893</span>&#160;            {</div>
-<div class="line"><a name="l11894"></a><span class="lineno">11894</span>&#160;                VMA_VALIDATE(<span class="keyword">false</span> &amp;&amp; <span class="stringliteral">&quot;ValidateNode for left child failed.&quot;</span>);</div>
-<div class="line"><a name="l11895"></a><span class="lineno">11895</span>&#160;            }</div>
-<div class="line"><a name="l11896"></a><span class="lineno">11896</span>&#160;            <span class="keyword">const</span> Node* <span class="keyword">const</span> rightChild = leftChild-&gt;buddy;</div>
-<div class="line"><a name="l11897"></a><span class="lineno">11897</span>&#160;            VMA_VALIDATE(rightChild-&gt;offset == curr-&gt;offset + childrenLevelNodeSize);</div>
-<div class="line"><a name="l11898"></a><span class="lineno">11898</span>&#160;            <span class="keywordflow">if</span>(!ValidateNode(ctx, curr, rightChild, childrenLevel, childrenLevelNodeSize))</div>
-<div class="line"><a name="l11899"></a><span class="lineno">11899</span>&#160;            {</div>
-<div class="line"><a name="l11900"></a><span class="lineno">11900</span>&#160;                VMA_VALIDATE(<span class="keyword">false</span> &amp;&amp; <span class="stringliteral">&quot;ValidateNode for right child failed.&quot;</span>);</div>
-<div class="line"><a name="l11901"></a><span class="lineno">11901</span>&#160;            }</div>
-<div class="line"><a name="l11902"></a><span class="lineno">11902</span>&#160;        }</div>
-<div class="line"><a name="l11903"></a><span class="lineno">11903</span>&#160;        <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l11904"></a><span class="lineno">11904</span>&#160;    <span class="keywordflow">default</span>:</div>
-<div class="line"><a name="l11905"></a><span class="lineno">11905</span>&#160;        <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
-<div class="line"><a name="l11906"></a><span class="lineno">11906</span>&#160;    }</div>
-<div class="line"><a name="l11907"></a><span class="lineno">11907</span>&#160; </div>
-<div class="line"><a name="l11908"></a><span class="lineno">11908</span>&#160;    <span class="keywordflow">return</span> <span class="keyword">true</span>;</div>
-<div class="line"><a name="l11909"></a><span class="lineno">11909</span>&#160;}</div>
-<div class="line"><a name="l11910"></a><span class="lineno">11910</span>&#160; </div>
-<div class="line"><a name="l11911"></a><span class="lineno">11911</span>&#160;uint32_t VmaBlockMetadata_Buddy::AllocSizeToLevel(VkDeviceSize allocSize)<span class="keyword"> const</span></div>
-<div class="line"><a name="l11912"></a><span class="lineno">11912</span>&#160;<span class="keyword"></span>{</div>
-<div class="line"><a name="l11913"></a><span class="lineno">11913</span>&#160;    <span class="comment">// I know this could be optimized somehow e.g. by using std::log2p1 from C++20.</span></div>
-<div class="line"><a name="l11914"></a><span class="lineno">11914</span>&#160;    uint32_t level = 0;</div>
-<div class="line"><a name="l11915"></a><span class="lineno">11915</span>&#160;    VkDeviceSize currLevelNodeSize = m_UsableSize;</div>
-<div class="line"><a name="l11916"></a><span class="lineno">11916</span>&#160;    VkDeviceSize nextLevelNodeSize = currLevelNodeSize &gt;&gt; 1;</div>
-<div class="line"><a name="l11917"></a><span class="lineno">11917</span>&#160;    <span class="keywordflow">while</span>(allocSize &lt;= nextLevelNodeSize &amp;&amp; level + 1 &lt; m_LevelCount)</div>
-<div class="line"><a name="l11918"></a><span class="lineno">11918</span>&#160;    {</div>
-<div class="line"><a name="l11919"></a><span class="lineno">11919</span>&#160;        ++level;</div>
-<div class="line"><a name="l11920"></a><span class="lineno">11920</span>&#160;        currLevelNodeSize = nextLevelNodeSize;</div>
-<div class="line"><a name="l11921"></a><span class="lineno">11921</span>&#160;        nextLevelNodeSize = currLevelNodeSize &gt;&gt; 1;</div>
-<div class="line"><a name="l11922"></a><span class="lineno">11922</span>&#160;    }</div>
-<div class="line"><a name="l11923"></a><span class="lineno">11923</span>&#160;    <span class="keywordflow">return</span> level;</div>
-<div class="line"><a name="l11924"></a><span class="lineno">11924</span>&#160;}</div>
-<div class="line"><a name="l11925"></a><span class="lineno">11925</span>&#160; </div>
-<div class="line"><a name="l11926"></a><span class="lineno">11926</span>&#160;<span class="keywordtype">void</span> VmaBlockMetadata_Buddy::FreeAtOffset(<a class="code" href="struct_vma_allocation.html">VmaAllocation</a> alloc, VkDeviceSize offset)</div>
-<div class="line"><a name="l11927"></a><span class="lineno">11927</span>&#160;{</div>
-<div class="line"><a name="l11928"></a><span class="lineno">11928</span>&#160;    <span class="comment">// Find node and level.</span></div>
-<div class="line"><a name="l11929"></a><span class="lineno">11929</span>&#160;    Node* node = m_Root;</div>
-<div class="line"><a name="l11930"></a><span class="lineno">11930</span>&#160;    VkDeviceSize nodeOffset = 0;</div>
-<div class="line"><a name="l11931"></a><span class="lineno">11931</span>&#160;    uint32_t level = 0;</div>
-<div class="line"><a name="l11932"></a><span class="lineno">11932</span>&#160;    VkDeviceSize levelNodeSize = LevelToNodeSize(0);</div>
-<div class="line"><a name="l11933"></a><span class="lineno">11933</span>&#160;    <span class="keywordflow">while</span>(node-&gt;type == Node::TYPE_SPLIT)</div>
-<div class="line"><a name="l11934"></a><span class="lineno">11934</span>&#160;    {</div>
-<div class="line"><a name="l11935"></a><span class="lineno">11935</span>&#160;        <span class="keyword">const</span> VkDeviceSize nextLevelSize = levelNodeSize &gt;&gt; 1;</div>
-<div class="line"><a name="l11936"></a><span class="lineno">11936</span>&#160;        <span class="keywordflow">if</span>(offset &lt; nodeOffset + nextLevelSize)</div>
-<div class="line"><a name="l11937"></a><span class="lineno">11937</span>&#160;        {</div>
-<div class="line"><a name="l11938"></a><span class="lineno">11938</span>&#160;            node = node-&gt;split.leftChild;</div>
-<div class="line"><a name="l11939"></a><span class="lineno">11939</span>&#160;        }</div>
-<div class="line"><a name="l11940"></a><span class="lineno">11940</span>&#160;        <span class="keywordflow">else</span></div>
-<div class="line"><a name="l11941"></a><span class="lineno">11941</span>&#160;        {</div>
-<div class="line"><a name="l11942"></a><span class="lineno">11942</span>&#160;            node = node-&gt;split.leftChild-&gt;buddy;</div>
-<div class="line"><a name="l11943"></a><span class="lineno">11943</span>&#160;            nodeOffset += nextLevelSize;</div>
-<div class="line"><a name="l11944"></a><span class="lineno">11944</span>&#160;        }</div>
-<div class="line"><a name="l11945"></a><span class="lineno">11945</span>&#160;        ++level;</div>
-<div class="line"><a name="l11946"></a><span class="lineno">11946</span>&#160;        levelNodeSize = nextLevelSize;</div>
-<div class="line"><a name="l11947"></a><span class="lineno">11947</span>&#160;    }</div>
-<div class="line"><a name="l11948"></a><span class="lineno">11948</span>&#160; </div>
-<div class="line"><a name="l11949"></a><span class="lineno">11949</span>&#160;    VMA_ASSERT(node != VMA_NULL &amp;&amp; node-&gt;type == Node::TYPE_ALLOCATION);</div>
-<div class="line"><a name="l11950"></a><span class="lineno">11950</span>&#160;    VMA_ASSERT(alloc == VK_NULL_HANDLE || node-&gt;allocation.alloc == alloc);</div>
+<div class="line"><a name="l11835"></a><span class="lineno">11835</span>&#160;<span class="keywordtype">void</span> VmaBlockMetadata_Linear::FreeAtOffset(VkDeviceSize offset)</div>
+<div class="line"><a name="l11836"></a><span class="lineno">11836</span>&#160;{</div>
+<div class="line"><a name="l11837"></a><span class="lineno">11837</span>&#160;    SuballocationVectorType&amp; suballocations1st = AccessSuballocations1st();</div>
+<div class="line"><a name="l11838"></a><span class="lineno">11838</span>&#160;    SuballocationVectorType&amp; suballocations2nd = AccessSuballocations2nd();</div>
+<div class="line"><a name="l11839"></a><span class="lineno">11839</span>&#160; </div>
+<div class="line"><a name="l11840"></a><span class="lineno">11840</span>&#160;    <span class="keywordflow">if</span>(!suballocations1st.empty())</div>
+<div class="line"><a name="l11841"></a><span class="lineno">11841</span>&#160;    {</div>
+<div class="line"><a name="l11842"></a><span class="lineno">11842</span>&#160;        <span class="comment">// First allocation: Mark it as next empty at the beginning.</span></div>
+<div class="line"><a name="l11843"></a><span class="lineno">11843</span>&#160;        VmaSuballocation&amp; firstSuballoc = suballocations1st[m_1stNullItemsBeginCount];</div>
+<div class="line"><a name="l11844"></a><span class="lineno">11844</span>&#160;        <span class="keywordflow">if</span>(firstSuballoc.offset == offset)</div>
+<div class="line"><a name="l11845"></a><span class="lineno">11845</span>&#160;        {</div>
+<div class="line"><a name="l11846"></a><span class="lineno">11846</span>&#160;            firstSuballoc.type = VMA_SUBALLOCATION_TYPE_FREE;</div>
+<div class="line"><a name="l11847"></a><span class="lineno">11847</span>&#160;            firstSuballoc.hAllocation = VK_NULL_HANDLE;</div>
+<div class="line"><a name="l11848"></a><span class="lineno">11848</span>&#160;            m_SumFreeSize += firstSuballoc.size;</div>
+<div class="line"><a name="l11849"></a><span class="lineno">11849</span>&#160;            ++m_1stNullItemsBeginCount;</div>
+<div class="line"><a name="l11850"></a><span class="lineno">11850</span>&#160;            CleanupAfterFree();</div>
+<div class="line"><a name="l11851"></a><span class="lineno">11851</span>&#160;            <span class="keywordflow">return</span>;</div>
+<div class="line"><a name="l11852"></a><span class="lineno">11852</span>&#160;        }</div>
+<div class="line"><a name="l11853"></a><span class="lineno">11853</span>&#160;    }</div>
+<div class="line"><a name="l11854"></a><span class="lineno">11854</span>&#160; </div>
+<div class="line"><a name="l11855"></a><span class="lineno">11855</span>&#160;    <span class="comment">// Last allocation in 2-part ring buffer or top of upper stack (same logic).</span></div>
+<div class="line"><a name="l11856"></a><span class="lineno">11856</span>&#160;    <span class="keywordflow">if</span>(m_2ndVectorMode == SECOND_VECTOR_RING_BUFFER ||</div>
+<div class="line"><a name="l11857"></a><span class="lineno">11857</span>&#160;        m_2ndVectorMode == SECOND_VECTOR_DOUBLE_STACK)</div>
+<div class="line"><a name="l11858"></a><span class="lineno">11858</span>&#160;    {</div>
+<div class="line"><a name="l11859"></a><span class="lineno">11859</span>&#160;        VmaSuballocation&amp; lastSuballoc = suballocations2nd.back();</div>
+<div class="line"><a name="l11860"></a><span class="lineno">11860</span>&#160;        <span class="keywordflow">if</span>(lastSuballoc.offset == offset)</div>
+<div class="line"><a name="l11861"></a><span class="lineno">11861</span>&#160;        {</div>
+<div class="line"><a name="l11862"></a><span class="lineno">11862</span>&#160;            m_SumFreeSize += lastSuballoc.size;</div>
+<div class="line"><a name="l11863"></a><span class="lineno">11863</span>&#160;            suballocations2nd.pop_back();</div>
+<div class="line"><a name="l11864"></a><span class="lineno">11864</span>&#160;            CleanupAfterFree();</div>
+<div class="line"><a name="l11865"></a><span class="lineno">11865</span>&#160;            <span class="keywordflow">return</span>;</div>
+<div class="line"><a name="l11866"></a><span class="lineno">11866</span>&#160;        }</div>
+<div class="line"><a name="l11867"></a><span class="lineno">11867</span>&#160;    }</div>
+<div class="line"><a name="l11868"></a><span class="lineno">11868</span>&#160;    <span class="comment">// Last allocation in 1st vector.</span></div>
+<div class="line"><a name="l11869"></a><span class="lineno">11869</span>&#160;    <span class="keywordflow">else</span> <span class="keywordflow">if</span>(m_2ndVectorMode == SECOND_VECTOR_EMPTY)</div>
+<div class="line"><a name="l11870"></a><span class="lineno">11870</span>&#160;    {</div>
+<div class="line"><a name="l11871"></a><span class="lineno">11871</span>&#160;        VmaSuballocation&amp; lastSuballoc = suballocations1st.back();</div>
+<div class="line"><a name="l11872"></a><span class="lineno">11872</span>&#160;        <span class="keywordflow">if</span>(lastSuballoc.offset == offset)</div>
+<div class="line"><a name="l11873"></a><span class="lineno">11873</span>&#160;        {</div>
+<div class="line"><a name="l11874"></a><span class="lineno">11874</span>&#160;            m_SumFreeSize += lastSuballoc.size;</div>
+<div class="line"><a name="l11875"></a><span class="lineno">11875</span>&#160;            suballocations1st.pop_back();</div>
+<div class="line"><a name="l11876"></a><span class="lineno">11876</span>&#160;            CleanupAfterFree();</div>
+<div class="line"><a name="l11877"></a><span class="lineno">11877</span>&#160;            <span class="keywordflow">return</span>;</div>
+<div class="line"><a name="l11878"></a><span class="lineno">11878</span>&#160;        }</div>
+<div class="line"><a name="l11879"></a><span class="lineno">11879</span>&#160;    }</div>
+<div class="line"><a name="l11880"></a><span class="lineno">11880</span>&#160; </div>
+<div class="line"><a name="l11881"></a><span class="lineno">11881</span>&#160;    <span class="comment">// Item from the middle of 1st vector.</span></div>
+<div class="line"><a name="l11882"></a><span class="lineno">11882</span>&#160;    {</div>
+<div class="line"><a name="l11883"></a><span class="lineno">11883</span>&#160;        VmaSuballocation refSuballoc;</div>
+<div class="line"><a name="l11884"></a><span class="lineno">11884</span>&#160;        refSuballoc.offset = offset;</div>
+<div class="line"><a name="l11885"></a><span class="lineno">11885</span>&#160;        <span class="comment">// Rest of members stays uninitialized intentionally for better performance.</span></div>
+<div class="line"><a name="l11886"></a><span class="lineno">11886</span>&#160;        SuballocationVectorType::iterator it = VmaBinaryFindSorted(</div>
+<div class="line"><a name="l11887"></a><span class="lineno">11887</span>&#160;            suballocations1st.begin() + m_1stNullItemsBeginCount,</div>
+<div class="line"><a name="l11888"></a><span class="lineno">11888</span>&#160;            suballocations1st.end(),</div>
+<div class="line"><a name="l11889"></a><span class="lineno">11889</span>&#160;            refSuballoc,</div>
+<div class="line"><a name="l11890"></a><span class="lineno">11890</span>&#160;            VmaSuballocationOffsetLess());</div>
+<div class="line"><a name="l11891"></a><span class="lineno">11891</span>&#160;        <span class="keywordflow">if</span>(it != suballocations1st.end())</div>
+<div class="line"><a name="l11892"></a><span class="lineno">11892</span>&#160;        {</div>
+<div class="line"><a name="l11893"></a><span class="lineno">11893</span>&#160;            it-&gt;type = VMA_SUBALLOCATION_TYPE_FREE;</div>
+<div class="line"><a name="l11894"></a><span class="lineno">11894</span>&#160;            it-&gt;hAllocation = VK_NULL_HANDLE;</div>
+<div class="line"><a name="l11895"></a><span class="lineno">11895</span>&#160;            ++m_1stNullItemsMiddleCount;</div>
+<div class="line"><a name="l11896"></a><span class="lineno">11896</span>&#160;            m_SumFreeSize += it-&gt;size;</div>
+<div class="line"><a name="l11897"></a><span class="lineno">11897</span>&#160;            CleanupAfterFree();</div>
+<div class="line"><a name="l11898"></a><span class="lineno">11898</span>&#160;            <span class="keywordflow">return</span>;</div>
+<div class="line"><a name="l11899"></a><span class="lineno">11899</span>&#160;        }</div>
+<div class="line"><a name="l11900"></a><span class="lineno">11900</span>&#160;    }</div>
+<div class="line"><a name="l11901"></a><span class="lineno">11901</span>&#160; </div>
+<div class="line"><a name="l11902"></a><span class="lineno">11902</span>&#160;    <span class="keywordflow">if</span>(m_2ndVectorMode != SECOND_VECTOR_EMPTY)</div>
+<div class="line"><a name="l11903"></a><span class="lineno">11903</span>&#160;    {</div>
+<div class="line"><a name="l11904"></a><span class="lineno">11904</span>&#160;        <span class="comment">// Item from the middle of 2nd vector.</span></div>
+<div class="line"><a name="l11905"></a><span class="lineno">11905</span>&#160;        VmaSuballocation refSuballoc;</div>
+<div class="line"><a name="l11906"></a><span class="lineno">11906</span>&#160;        refSuballoc.offset = offset;</div>
+<div class="line"><a name="l11907"></a><span class="lineno">11907</span>&#160;        <span class="comment">// Rest of members stays uninitialized intentionally for better performance.</span></div>
+<div class="line"><a name="l11908"></a><span class="lineno">11908</span>&#160;        SuballocationVectorType::iterator it = m_2ndVectorMode == SECOND_VECTOR_RING_BUFFER ?</div>
+<div class="line"><a name="l11909"></a><span class="lineno">11909</span>&#160;            VmaBinaryFindSorted(suballocations2nd.begin(), suballocations2nd.end(), refSuballoc, VmaSuballocationOffsetLess()) :</div>
+<div class="line"><a name="l11910"></a><span class="lineno">11910</span>&#160;            VmaBinaryFindSorted(suballocations2nd.begin(), suballocations2nd.end(), refSuballoc, VmaSuballocationOffsetGreater());</div>
+<div class="line"><a name="l11911"></a><span class="lineno">11911</span>&#160;        <span class="keywordflow">if</span>(it != suballocations2nd.end())</div>
+<div class="line"><a name="l11912"></a><span class="lineno">11912</span>&#160;        {</div>
+<div class="line"><a name="l11913"></a><span class="lineno">11913</span>&#160;            it-&gt;type = VMA_SUBALLOCATION_TYPE_FREE;</div>
+<div class="line"><a name="l11914"></a><span class="lineno">11914</span>&#160;            it-&gt;hAllocation = VK_NULL_HANDLE;</div>
+<div class="line"><a name="l11915"></a><span class="lineno">11915</span>&#160;            ++m_2ndNullItemsCount;</div>
+<div class="line"><a name="l11916"></a><span class="lineno">11916</span>&#160;            m_SumFreeSize += it-&gt;size;</div>
+<div class="line"><a name="l11917"></a><span class="lineno">11917</span>&#160;            CleanupAfterFree();</div>
+<div class="line"><a name="l11918"></a><span class="lineno">11918</span>&#160;            <span class="keywordflow">return</span>;</div>
+<div class="line"><a name="l11919"></a><span class="lineno">11919</span>&#160;        }</div>
+<div class="line"><a name="l11920"></a><span class="lineno">11920</span>&#160;    }</div>
+<div class="line"><a name="l11921"></a><span class="lineno">11921</span>&#160; </div>
+<div class="line"><a name="l11922"></a><span class="lineno">11922</span>&#160;    VMA_ASSERT(0 &amp;&amp; <span class="stringliteral">&quot;Allocation to free not found in linear allocator!&quot;</span>);</div>
+<div class="line"><a name="l11923"></a><span class="lineno">11923</span>&#160;}</div>
+<div class="line"><a name="l11924"></a><span class="lineno">11924</span>&#160; </div>
+<div class="line"><a name="l11925"></a><span class="lineno">11925</span>&#160;<span class="keywordtype">bool</span> VmaBlockMetadata_Linear::ShouldCompact1st()<span class="keyword"> const</span></div>
+<div class="line"><a name="l11926"></a><span class="lineno">11926</span>&#160;<span class="keyword"></span>{</div>
+<div class="line"><a name="l11927"></a><span class="lineno">11927</span>&#160;    <span class="keyword">const</span> <span class="keywordtype">size_t</span> nullItemCount = m_1stNullItemsBeginCount + m_1stNullItemsMiddleCount;</div>
+<div class="line"><a name="l11928"></a><span class="lineno">11928</span>&#160;    <span class="keyword">const</span> <span class="keywordtype">size_t</span> suballocCount = AccessSuballocations1st().size();</div>
+<div class="line"><a name="l11929"></a><span class="lineno">11929</span>&#160;    <span class="keywordflow">return</span> suballocCount &gt; 32 &amp;&amp; nullItemCount * 2 &gt;= (suballocCount - nullItemCount) * 3;</div>
+<div class="line"><a name="l11930"></a><span class="lineno">11930</span>&#160;}</div>
+<div class="line"><a name="l11931"></a><span class="lineno">11931</span>&#160; </div>
+<div class="line"><a name="l11932"></a><span class="lineno">11932</span>&#160;<span class="keywordtype">void</span> VmaBlockMetadata_Linear::CleanupAfterFree()</div>
+<div class="line"><a name="l11933"></a><span class="lineno">11933</span>&#160;{</div>
+<div class="line"><a name="l11934"></a><span class="lineno">11934</span>&#160;    SuballocationVectorType&amp; suballocations1st = AccessSuballocations1st();</div>
+<div class="line"><a name="l11935"></a><span class="lineno">11935</span>&#160;    SuballocationVectorType&amp; suballocations2nd = AccessSuballocations2nd();</div>
+<div class="line"><a name="l11936"></a><span class="lineno">11936</span>&#160; </div>
+<div class="line"><a name="l11937"></a><span class="lineno">11937</span>&#160;    <span class="keywordflow">if</span>(IsEmpty())</div>
+<div class="line"><a name="l11938"></a><span class="lineno">11938</span>&#160;    {</div>
+<div class="line"><a name="l11939"></a><span class="lineno">11939</span>&#160;        suballocations1st.clear();</div>
+<div class="line"><a name="l11940"></a><span class="lineno">11940</span>&#160;        suballocations2nd.clear();</div>
+<div class="line"><a name="l11941"></a><span class="lineno">11941</span>&#160;        m_1stNullItemsBeginCount = 0;</div>
+<div class="line"><a name="l11942"></a><span class="lineno">11942</span>&#160;        m_1stNullItemsMiddleCount = 0;</div>
+<div class="line"><a name="l11943"></a><span class="lineno">11943</span>&#160;        m_2ndNullItemsCount = 0;</div>
+<div class="line"><a name="l11944"></a><span class="lineno">11944</span>&#160;        m_2ndVectorMode = SECOND_VECTOR_EMPTY;</div>
+<div class="line"><a name="l11945"></a><span class="lineno">11945</span>&#160;    }</div>
+<div class="line"><a name="l11946"></a><span class="lineno">11946</span>&#160;    <span class="keywordflow">else</span></div>
+<div class="line"><a name="l11947"></a><span class="lineno">11947</span>&#160;    {</div>
+<div class="line"><a name="l11948"></a><span class="lineno">11948</span>&#160;        <span class="keyword">const</span> <span class="keywordtype">size_t</span> suballoc1stCount = suballocations1st.size();</div>
+<div class="line"><a name="l11949"></a><span class="lineno">11949</span>&#160;        <span class="keyword">const</span> <span class="keywordtype">size_t</span> nullItem1stCount = m_1stNullItemsBeginCount + m_1stNullItemsMiddleCount;</div>
+<div class="line"><a name="l11950"></a><span class="lineno">11950</span>&#160;        VMA_ASSERT(nullItem1stCount &lt;= suballoc1stCount);</div>
 <div class="line"><a name="l11951"></a><span class="lineno">11951</span>&#160; </div>
-<div class="line"><a name="l11952"></a><span class="lineno">11952</span>&#160;    ++m_FreeCount;</div>
-<div class="line"><a name="l11953"></a><span class="lineno">11953</span>&#160;    --m_AllocationCount;</div>
-<div class="line"><a name="l11954"></a><span class="lineno">11954</span>&#160;    m_SumFreeSize += alloc-&gt;GetSize();</div>
-<div class="line"><a name="l11955"></a><span class="lineno">11955</span>&#160; </div>
-<div class="line"><a name="l11956"></a><span class="lineno">11956</span>&#160;    node-&gt;type = Node::TYPE_FREE;</div>
-<div class="line"><a name="l11957"></a><span class="lineno">11957</span>&#160; </div>
-<div class="line"><a name="l11958"></a><span class="lineno">11958</span>&#160;    <span class="comment">// Join free nodes if possible.</span></div>
-<div class="line"><a name="l11959"></a><span class="lineno">11959</span>&#160;    <span class="keywordflow">while</span>(level &gt; 0 &amp;&amp; node-&gt;buddy-&gt;type == Node::TYPE_FREE)</div>
-<div class="line"><a name="l11960"></a><span class="lineno">11960</span>&#160;    {</div>
-<div class="line"><a name="l11961"></a><span class="lineno">11961</span>&#160;        RemoveFromFreeList(level, node-&gt;buddy);</div>
-<div class="line"><a name="l11962"></a><span class="lineno">11962</span>&#160;        Node* <span class="keyword">const</span> parent = node-&gt;parent;</div>
-<div class="line"><a name="l11963"></a><span class="lineno">11963</span>&#160; </div>
-<div class="line"><a name="l11964"></a><span class="lineno">11964</span>&#160;        vma_delete(GetAllocationCallbacks(), node-&gt;buddy);</div>
-<div class="line"><a name="l11965"></a><span class="lineno">11965</span>&#160;        vma_delete(GetAllocationCallbacks(), node);</div>
-<div class="line"><a name="l11966"></a><span class="lineno">11966</span>&#160;        parent-&gt;type = Node::TYPE_FREE;</div>
-<div class="line"><a name="l11967"></a><span class="lineno">11967</span>&#160;        </div>
-<div class="line"><a name="l11968"></a><span class="lineno">11968</span>&#160;        node = parent;</div>
-<div class="line"><a name="l11969"></a><span class="lineno">11969</span>&#160;        --level;</div>
-<div class="line"><a name="l11970"></a><span class="lineno">11970</span>&#160;        <span class="comment">//m_SumFreeSize += LevelToNodeSize(level) % 2; // Useful only when level node sizes can be non power of 2.</span></div>
-<div class="line"><a name="l11971"></a><span class="lineno">11971</span>&#160;        --m_FreeCount;</div>
-<div class="line"><a name="l11972"></a><span class="lineno">11972</span>&#160;    }</div>
-<div class="line"><a name="l11973"></a><span class="lineno">11973</span>&#160; </div>
-<div class="line"><a name="l11974"></a><span class="lineno">11974</span>&#160;    AddToFreeListFront(level, node);</div>
-<div class="line"><a name="l11975"></a><span class="lineno">11975</span>&#160;}</div>
-<div class="line"><a name="l11976"></a><span class="lineno">11976</span>&#160; </div>
-<div class="line"><a name="l11977"></a><span class="lineno">11977</span>&#160;<span class="keywordtype">void</span> VmaBlockMetadata_Buddy::CalcAllocationStatInfoNode(<a class="code" href="struct_vma_stat_info.html">VmaStatInfo</a>&amp; outInfo, <span class="keyword">const</span> Node* node, VkDeviceSize levelNodeSize)<span class="keyword"> const</span></div>
-<div class="line"><a name="l11978"></a><span class="lineno">11978</span>&#160;<span class="keyword"></span>{</div>
-<div class="line"><a name="l11979"></a><span class="lineno">11979</span>&#160;    <span class="keywordflow">switch</span>(node-&gt;type)</div>
-<div class="line"><a name="l11980"></a><span class="lineno">11980</span>&#160;    {</div>
-<div class="line"><a name="l11981"></a><span class="lineno">11981</span>&#160;    <span class="keywordflow">case</span> Node::TYPE_FREE:</div>
-<div class="line"><a name="l11982"></a><span class="lineno">11982</span>&#160;        ++outInfo.<a class="code" href="struct_vma_stat_info.html#ae06129c771bfebfd6468a7f4276502a9">unusedRangeCount</a>;</div>
-<div class="line"><a name="l11983"></a><span class="lineno">11983</span>&#160;        outInfo.<a class="code" href="struct_vma_stat_info.html#a1859d290aca2cd582d8dc25922092669">unusedBytes</a> += levelNodeSize;</div>
-<div class="line"><a name="l11984"></a><span class="lineno">11984</span>&#160;        outInfo.<a class="code" href="struct_vma_stat_info.html#a5ba1a2476c4d39b10f7e2f7ebbb72ac4">unusedRangeSizeMax</a> = VMA_MAX(outInfo.<a class="code" href="struct_vma_stat_info.html#a5ba1a2476c4d39b10f7e2f7ebbb72ac4">unusedRangeSizeMax</a>, levelNodeSize);</div>
-<div class="line"><a name="l11985"></a><span class="lineno">11985</span>&#160;        outInfo.<a class="code" href="struct_vma_stat_info.html#aedeba931324f16589cd2416c0d2dd0d4">unusedRangeSizeMin</a> = VMA_MAX(outInfo.<a class="code" href="struct_vma_stat_info.html#aedeba931324f16589cd2416c0d2dd0d4">unusedRangeSizeMin</a>, levelNodeSize);</div>
-<div class="line"><a name="l11986"></a><span class="lineno">11986</span>&#160;        <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l11987"></a><span class="lineno">11987</span>&#160;    <span class="keywordflow">case</span> Node::TYPE_ALLOCATION:</div>
-<div class="line"><a name="l11988"></a><span class="lineno">11988</span>&#160;        {</div>
-<div class="line"><a name="l11989"></a><span class="lineno">11989</span>&#160;            <span class="keyword">const</span> VkDeviceSize allocSize = node-&gt;allocation.alloc-&gt;GetSize();</div>
-<div class="line"><a name="l11990"></a><span class="lineno">11990</span>&#160;            ++outInfo.<a class="code" href="struct_vma_stat_info.html#a537741e4d5cdddc1c0ab95ec650afaff">allocationCount</a>;</div>
-<div class="line"><a name="l11991"></a><span class="lineno">11991</span>&#160;            outInfo.<a class="code" href="struct_vma_stat_info.html#ab0c6c73837e5a70c749fbd4f6064895a">usedBytes</a> += allocSize;</div>
-<div class="line"><a name="l11992"></a><span class="lineno">11992</span>&#160;            outInfo.<a class="code" href="struct_vma_stat_info.html#a17e9733a5ecd76287d4db6e66f71f50c">allocationSizeMax</a> = VMA_MAX(outInfo.<a class="code" href="struct_vma_stat_info.html#a17e9733a5ecd76287d4db6e66f71f50c">allocationSizeMax</a>, allocSize);</div>
-<div class="line"><a name="l11993"></a><span class="lineno">11993</span>&#160;            outInfo.<a class="code" href="struct_vma_stat_info.html#ade8b40bd3139c04aabd2fc538a356fea">allocationSizeMin</a> = VMA_MAX(outInfo.<a class="code" href="struct_vma_stat_info.html#ade8b40bd3139c04aabd2fc538a356fea">allocationSizeMin</a>, allocSize);</div>
-<div class="line"><a name="l11994"></a><span class="lineno">11994</span>&#160; </div>
-<div class="line"><a name="l11995"></a><span class="lineno">11995</span>&#160;            <span class="keyword">const</span> VkDeviceSize unusedRangeSize = levelNodeSize - allocSize;</div>
-<div class="line"><a name="l11996"></a><span class="lineno">11996</span>&#160;            <span class="keywordflow">if</span>(unusedRangeSize &gt; 0)</div>
-<div class="line"><a name="l11997"></a><span class="lineno">11997</span>&#160;            {</div>
-<div class="line"><a name="l11998"></a><span class="lineno">11998</span>&#160;                ++outInfo.<a class="code" href="struct_vma_stat_info.html#ae06129c771bfebfd6468a7f4276502a9">unusedRangeCount</a>;</div>
-<div class="line"><a name="l11999"></a><span class="lineno">11999</span>&#160;                outInfo.<a class="code" href="struct_vma_stat_info.html#a1859d290aca2cd582d8dc25922092669">unusedBytes</a> += unusedRangeSize;</div>
-<div class="line"><a name="l12000"></a><span class="lineno">12000</span>&#160;                outInfo.<a class="code" href="struct_vma_stat_info.html#a5ba1a2476c4d39b10f7e2f7ebbb72ac4">unusedRangeSizeMax</a> = VMA_MAX(outInfo.<a class="code" href="struct_vma_stat_info.html#a5ba1a2476c4d39b10f7e2f7ebbb72ac4">unusedRangeSizeMax</a>, unusedRangeSize);</div>
-<div class="line"><a name="l12001"></a><span class="lineno">12001</span>&#160;                outInfo.<a class="code" href="struct_vma_stat_info.html#aedeba931324f16589cd2416c0d2dd0d4">unusedRangeSizeMin</a> = VMA_MAX(outInfo.<a class="code" href="struct_vma_stat_info.html#aedeba931324f16589cd2416c0d2dd0d4">unusedRangeSizeMin</a>, unusedRangeSize);</div>
-<div class="line"><a name="l12002"></a><span class="lineno">12002</span>&#160;            }</div>
+<div class="line"><a name="l11952"></a><span class="lineno">11952</span>&#160;        <span class="comment">// Find more null items at the beginning of 1st vector.</span></div>
+<div class="line"><a name="l11953"></a><span class="lineno">11953</span>&#160;        <span class="keywordflow">while</span>(m_1stNullItemsBeginCount &lt; suballoc1stCount &amp;&amp;</div>
+<div class="line"><a name="l11954"></a><span class="lineno">11954</span>&#160;            suballocations1st[m_1stNullItemsBeginCount].hAllocation == VK_NULL_HANDLE)</div>
+<div class="line"><a name="l11955"></a><span class="lineno">11955</span>&#160;        {</div>
+<div class="line"><a name="l11956"></a><span class="lineno">11956</span>&#160;            ++m_1stNullItemsBeginCount;</div>
+<div class="line"><a name="l11957"></a><span class="lineno">11957</span>&#160;            --m_1stNullItemsMiddleCount;</div>
+<div class="line"><a name="l11958"></a><span class="lineno">11958</span>&#160;        }</div>
+<div class="line"><a name="l11959"></a><span class="lineno">11959</span>&#160; </div>
+<div class="line"><a name="l11960"></a><span class="lineno">11960</span>&#160;        <span class="comment">// Find more null items at the end of 1st vector.</span></div>
+<div class="line"><a name="l11961"></a><span class="lineno">11961</span>&#160;        <span class="keywordflow">while</span>(m_1stNullItemsMiddleCount &gt; 0 &amp;&amp;</div>
+<div class="line"><a name="l11962"></a><span class="lineno">11962</span>&#160;            suballocations1st.back().hAllocation == VK_NULL_HANDLE)</div>
+<div class="line"><a name="l11963"></a><span class="lineno">11963</span>&#160;        {</div>
+<div class="line"><a name="l11964"></a><span class="lineno">11964</span>&#160;            --m_1stNullItemsMiddleCount;</div>
+<div class="line"><a name="l11965"></a><span class="lineno">11965</span>&#160;            suballocations1st.pop_back();</div>
+<div class="line"><a name="l11966"></a><span class="lineno">11966</span>&#160;        }</div>
+<div class="line"><a name="l11967"></a><span class="lineno">11967</span>&#160; </div>
+<div class="line"><a name="l11968"></a><span class="lineno">11968</span>&#160;        <span class="comment">// Find more null items at the end of 2nd vector.</span></div>
+<div class="line"><a name="l11969"></a><span class="lineno">11969</span>&#160;        <span class="keywordflow">while</span>(m_2ndNullItemsCount &gt; 0 &amp;&amp;</div>
+<div class="line"><a name="l11970"></a><span class="lineno">11970</span>&#160;            suballocations2nd.back().hAllocation == VK_NULL_HANDLE)</div>
+<div class="line"><a name="l11971"></a><span class="lineno">11971</span>&#160;        {</div>
+<div class="line"><a name="l11972"></a><span class="lineno">11972</span>&#160;            --m_2ndNullItemsCount;</div>
+<div class="line"><a name="l11973"></a><span class="lineno">11973</span>&#160;            suballocations2nd.pop_back();</div>
+<div class="line"><a name="l11974"></a><span class="lineno">11974</span>&#160;        }</div>
+<div class="line"><a name="l11975"></a><span class="lineno">11975</span>&#160; </div>
+<div class="line"><a name="l11976"></a><span class="lineno">11976</span>&#160;        <span class="comment">// Find more null items at the beginning of 2nd vector.</span></div>
+<div class="line"><a name="l11977"></a><span class="lineno">11977</span>&#160;        <span class="keywordflow">while</span>(m_2ndNullItemsCount &gt; 0 &amp;&amp;</div>
+<div class="line"><a name="l11978"></a><span class="lineno">11978</span>&#160;            suballocations2nd[0].hAllocation == VK_NULL_HANDLE)</div>
+<div class="line"><a name="l11979"></a><span class="lineno">11979</span>&#160;        {</div>
+<div class="line"><a name="l11980"></a><span class="lineno">11980</span>&#160;            --m_2ndNullItemsCount;</div>
+<div class="line"><a name="l11981"></a><span class="lineno">11981</span>&#160;            VmaVectorRemove(suballocations2nd, 0);</div>
+<div class="line"><a name="l11982"></a><span class="lineno">11982</span>&#160;        }</div>
+<div class="line"><a name="l11983"></a><span class="lineno">11983</span>&#160; </div>
+<div class="line"><a name="l11984"></a><span class="lineno">11984</span>&#160;        <span class="keywordflow">if</span>(ShouldCompact1st())</div>
+<div class="line"><a name="l11985"></a><span class="lineno">11985</span>&#160;        {</div>
+<div class="line"><a name="l11986"></a><span class="lineno">11986</span>&#160;            <span class="keyword">const</span> <span class="keywordtype">size_t</span> nonNullItemCount = suballoc1stCount - nullItem1stCount;</div>
+<div class="line"><a name="l11987"></a><span class="lineno">11987</span>&#160;            <span class="keywordtype">size_t</span> srcIndex = m_1stNullItemsBeginCount;</div>
+<div class="line"><a name="l11988"></a><span class="lineno">11988</span>&#160;            <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> dstIndex = 0; dstIndex &lt; nonNullItemCount; ++dstIndex)</div>
+<div class="line"><a name="l11989"></a><span class="lineno">11989</span>&#160;            {</div>
+<div class="line"><a name="l11990"></a><span class="lineno">11990</span>&#160;                <span class="keywordflow">while</span>(suballocations1st[srcIndex].hAllocation == VK_NULL_HANDLE)</div>
+<div class="line"><a name="l11991"></a><span class="lineno">11991</span>&#160;                {</div>
+<div class="line"><a name="l11992"></a><span class="lineno">11992</span>&#160;                    ++srcIndex;</div>
+<div class="line"><a name="l11993"></a><span class="lineno">11993</span>&#160;                }</div>
+<div class="line"><a name="l11994"></a><span class="lineno">11994</span>&#160;                <span class="keywordflow">if</span>(dstIndex != srcIndex)</div>
+<div class="line"><a name="l11995"></a><span class="lineno">11995</span>&#160;                {</div>
+<div class="line"><a name="l11996"></a><span class="lineno">11996</span>&#160;                    suballocations1st[dstIndex] = suballocations1st[srcIndex];</div>
+<div class="line"><a name="l11997"></a><span class="lineno">11997</span>&#160;                }</div>
+<div class="line"><a name="l11998"></a><span class="lineno">11998</span>&#160;                ++srcIndex;</div>
+<div class="line"><a name="l11999"></a><span class="lineno">11999</span>&#160;            }</div>
+<div class="line"><a name="l12000"></a><span class="lineno">12000</span>&#160;            suballocations1st.resize(nonNullItemCount);</div>
+<div class="line"><a name="l12001"></a><span class="lineno">12001</span>&#160;            m_1stNullItemsBeginCount = 0;</div>
+<div class="line"><a name="l12002"></a><span class="lineno">12002</span>&#160;            m_1stNullItemsMiddleCount = 0;</div>
 <div class="line"><a name="l12003"></a><span class="lineno">12003</span>&#160;        }</div>
-<div class="line"><a name="l12004"></a><span class="lineno">12004</span>&#160;        <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l12005"></a><span class="lineno">12005</span>&#160;    <span class="keywordflow">case</span> Node::TYPE_SPLIT:</div>
-<div class="line"><a name="l12006"></a><span class="lineno">12006</span>&#160;        {</div>
-<div class="line"><a name="l12007"></a><span class="lineno">12007</span>&#160;            <span class="keyword">const</span> VkDeviceSize childrenNodeSize = levelNodeSize / 2;</div>
-<div class="line"><a name="l12008"></a><span class="lineno">12008</span>&#160;            <span class="keyword">const</span> Node* <span class="keyword">const</span> leftChild = node-&gt;split.leftChild;</div>
-<div class="line"><a name="l12009"></a><span class="lineno">12009</span>&#160;            CalcAllocationStatInfoNode(outInfo, leftChild, childrenNodeSize);</div>
-<div class="line"><a name="l12010"></a><span class="lineno">12010</span>&#160;            <span class="keyword">const</span> Node* <span class="keyword">const</span> rightChild = leftChild-&gt;buddy;</div>
-<div class="line"><a name="l12011"></a><span class="lineno">12011</span>&#160;            CalcAllocationStatInfoNode(outInfo, rightChild, childrenNodeSize);</div>
-<div class="line"><a name="l12012"></a><span class="lineno">12012</span>&#160;        }</div>
-<div class="line"><a name="l12013"></a><span class="lineno">12013</span>&#160;        <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l12014"></a><span class="lineno">12014</span>&#160;    <span class="keywordflow">default</span>:</div>
-<div class="line"><a name="l12015"></a><span class="lineno">12015</span>&#160;        VMA_ASSERT(0);</div>
-<div class="line"><a name="l12016"></a><span class="lineno">12016</span>&#160;    }</div>
-<div class="line"><a name="l12017"></a><span class="lineno">12017</span>&#160;}</div>
-<div class="line"><a name="l12018"></a><span class="lineno">12018</span>&#160; </div>
-<div class="line"><a name="l12019"></a><span class="lineno">12019</span>&#160;<span class="keywordtype">void</span> VmaBlockMetadata_Buddy::AddToFreeListFront(uint32_t level, Node* node)</div>
-<div class="line"><a name="l12020"></a><span class="lineno">12020</span>&#160;{</div>
-<div class="line"><a name="l12021"></a><span class="lineno">12021</span>&#160;    VMA_ASSERT(node-&gt;type == Node::TYPE_FREE);</div>
-<div class="line"><a name="l12022"></a><span class="lineno">12022</span>&#160; </div>
-<div class="line"><a name="l12023"></a><span class="lineno">12023</span>&#160;    <span class="comment">// List is empty.</span></div>
-<div class="line"><a name="l12024"></a><span class="lineno">12024</span>&#160;    Node* <span class="keyword">const</span> frontNode = m_FreeList[level].front;</div>
-<div class="line"><a name="l12025"></a><span class="lineno">12025</span>&#160;    <span class="keywordflow">if</span>(frontNode == VMA_NULL)</div>
-<div class="line"><a name="l12026"></a><span class="lineno">12026</span>&#160;    {</div>
-<div class="line"><a name="l12027"></a><span class="lineno">12027</span>&#160;        VMA_ASSERT(m_FreeList[level].back == VMA_NULL);</div>
-<div class="line"><a name="l12028"></a><span class="lineno">12028</span>&#160;        node-&gt;free.prev = node-&gt;free.next = VMA_NULL;</div>
-<div class="line"><a name="l12029"></a><span class="lineno">12029</span>&#160;        m_FreeList[level].front = m_FreeList[level].back = node;</div>
-<div class="line"><a name="l12030"></a><span class="lineno">12030</span>&#160;    }</div>
-<div class="line"><a name="l12031"></a><span class="lineno">12031</span>&#160;    <span class="keywordflow">else</span></div>
-<div class="line"><a name="l12032"></a><span class="lineno">12032</span>&#160;    {</div>
-<div class="line"><a name="l12033"></a><span class="lineno">12033</span>&#160;        VMA_ASSERT(frontNode-&gt;free.prev == VMA_NULL);</div>
-<div class="line"><a name="l12034"></a><span class="lineno">12034</span>&#160;        node-&gt;free.prev = VMA_NULL;</div>
-<div class="line"><a name="l12035"></a><span class="lineno">12035</span>&#160;        node-&gt;free.next = frontNode;</div>
-<div class="line"><a name="l12036"></a><span class="lineno">12036</span>&#160;        frontNode-&gt;free.prev = node;</div>
-<div class="line"><a name="l12037"></a><span class="lineno">12037</span>&#160;        m_FreeList[level].front = node;</div>
-<div class="line"><a name="l12038"></a><span class="lineno">12038</span>&#160;    }</div>
-<div class="line"><a name="l12039"></a><span class="lineno">12039</span>&#160;}</div>
+<div class="line"><a name="l12004"></a><span class="lineno">12004</span>&#160; </div>
+<div class="line"><a name="l12005"></a><span class="lineno">12005</span>&#160;        <span class="comment">// 2nd vector became empty.</span></div>
+<div class="line"><a name="l12006"></a><span class="lineno">12006</span>&#160;        <span class="keywordflow">if</span>(suballocations2nd.empty())</div>
+<div class="line"><a name="l12007"></a><span class="lineno">12007</span>&#160;        {</div>
+<div class="line"><a name="l12008"></a><span class="lineno">12008</span>&#160;            m_2ndVectorMode = SECOND_VECTOR_EMPTY;</div>
+<div class="line"><a name="l12009"></a><span class="lineno">12009</span>&#160;        }</div>
+<div class="line"><a name="l12010"></a><span class="lineno">12010</span>&#160; </div>
+<div class="line"><a name="l12011"></a><span class="lineno">12011</span>&#160;        <span class="comment">// 1st vector became empty.</span></div>
+<div class="line"><a name="l12012"></a><span class="lineno">12012</span>&#160;        <span class="keywordflow">if</span>(suballocations1st.size() - m_1stNullItemsBeginCount == 0)</div>
+<div class="line"><a name="l12013"></a><span class="lineno">12013</span>&#160;        {</div>
+<div class="line"><a name="l12014"></a><span class="lineno">12014</span>&#160;            suballocations1st.clear();</div>
+<div class="line"><a name="l12015"></a><span class="lineno">12015</span>&#160;            m_1stNullItemsBeginCount = 0;</div>
+<div class="line"><a name="l12016"></a><span class="lineno">12016</span>&#160; </div>
+<div class="line"><a name="l12017"></a><span class="lineno">12017</span>&#160;            <span class="keywordflow">if</span>(!suballocations2nd.empty() &amp;&amp; m_2ndVectorMode == SECOND_VECTOR_RING_BUFFER)</div>
+<div class="line"><a name="l12018"></a><span class="lineno">12018</span>&#160;            {</div>
+<div class="line"><a name="l12019"></a><span class="lineno">12019</span>&#160;                <span class="comment">// Swap 1st with 2nd. Now 2nd is empty.</span></div>
+<div class="line"><a name="l12020"></a><span class="lineno">12020</span>&#160;                m_2ndVectorMode = SECOND_VECTOR_EMPTY;</div>
+<div class="line"><a name="l12021"></a><span class="lineno">12021</span>&#160;                m_1stNullItemsMiddleCount = m_2ndNullItemsCount;</div>
+<div class="line"><a name="l12022"></a><span class="lineno">12022</span>&#160;                <span class="keywordflow">while</span>(m_1stNullItemsBeginCount &lt; suballocations2nd.size() &amp;&amp;</div>
+<div class="line"><a name="l12023"></a><span class="lineno">12023</span>&#160;                    suballocations2nd[m_1stNullItemsBeginCount].hAllocation == VK_NULL_HANDLE)</div>
+<div class="line"><a name="l12024"></a><span class="lineno">12024</span>&#160;                {</div>
+<div class="line"><a name="l12025"></a><span class="lineno">12025</span>&#160;                    ++m_1stNullItemsBeginCount;</div>
+<div class="line"><a name="l12026"></a><span class="lineno">12026</span>&#160;                    --m_1stNullItemsMiddleCount;</div>
+<div class="line"><a name="l12027"></a><span class="lineno">12027</span>&#160;                }</div>
+<div class="line"><a name="l12028"></a><span class="lineno">12028</span>&#160;                m_2ndNullItemsCount = 0;</div>
+<div class="line"><a name="l12029"></a><span class="lineno">12029</span>&#160;                m_1stVectorIndex ^= 1;</div>
+<div class="line"><a name="l12030"></a><span class="lineno">12030</span>&#160;            }</div>
+<div class="line"><a name="l12031"></a><span class="lineno">12031</span>&#160;        }</div>
+<div class="line"><a name="l12032"></a><span class="lineno">12032</span>&#160;    }</div>
+<div class="line"><a name="l12033"></a><span class="lineno">12033</span>&#160; </div>
+<div class="line"><a name="l12034"></a><span class="lineno">12034</span>&#160;    VMA_HEAVY_ASSERT(Validate());</div>
+<div class="line"><a name="l12035"></a><span class="lineno">12035</span>&#160;}</div>
+<div class="line"><a name="l12036"></a><span class="lineno">12036</span>&#160; </div>
+<div class="line"><a name="l12037"></a><span class="lineno">12037</span>&#160; </div>
+<div class="line"><a name="l12039"></a><span class="lineno">12039</span>&#160;<span class="comment">// class VmaBlockMetadata_Buddy</span></div>
 <div class="line"><a name="l12040"></a><span class="lineno">12040</span>&#160; </div>
-<div class="line"><a name="l12041"></a><span class="lineno">12041</span>&#160;<span class="keywordtype">void</span> VmaBlockMetadata_Buddy::RemoveFromFreeList(uint32_t level, Node* node)</div>
-<div class="line"><a name="l12042"></a><span class="lineno">12042</span>&#160;{</div>
-<div class="line"><a name="l12043"></a><span class="lineno">12043</span>&#160;    VMA_ASSERT(m_FreeList[level].front != VMA_NULL);</div>
-<div class="line"><a name="l12044"></a><span class="lineno">12044</span>&#160; </div>
-<div class="line"><a name="l12045"></a><span class="lineno">12045</span>&#160;    <span class="comment">// It is at the front.</span></div>
-<div class="line"><a name="l12046"></a><span class="lineno">12046</span>&#160;    <span class="keywordflow">if</span>(node-&gt;free.prev == VMA_NULL)</div>
-<div class="line"><a name="l12047"></a><span class="lineno">12047</span>&#160;    {</div>
-<div class="line"><a name="l12048"></a><span class="lineno">12048</span>&#160;        VMA_ASSERT(m_FreeList[level].front == node);</div>
-<div class="line"><a name="l12049"></a><span class="lineno">12049</span>&#160;        m_FreeList[level].front = node-&gt;free.next;</div>
-<div class="line"><a name="l12050"></a><span class="lineno">12050</span>&#160;    }</div>
-<div class="line"><a name="l12051"></a><span class="lineno">12051</span>&#160;    <span class="keywordflow">else</span></div>
-<div class="line"><a name="l12052"></a><span class="lineno">12052</span>&#160;    {</div>
-<div class="line"><a name="l12053"></a><span class="lineno">12053</span>&#160;        Node* <span class="keyword">const</span> prevFreeNode = node-&gt;free.prev;</div>
-<div class="line"><a name="l12054"></a><span class="lineno">12054</span>&#160;        VMA_ASSERT(prevFreeNode-&gt;free.next == node);</div>
-<div class="line"><a name="l12055"></a><span class="lineno">12055</span>&#160;        prevFreeNode-&gt;free.next = node-&gt;free.next;</div>
-<div class="line"><a name="l12056"></a><span class="lineno">12056</span>&#160;    }</div>
-<div class="line"><a name="l12057"></a><span class="lineno">12057</span>&#160; </div>
-<div class="line"><a name="l12058"></a><span class="lineno">12058</span>&#160;    <span class="comment">// It is at the back.</span></div>
-<div class="line"><a name="l12059"></a><span class="lineno">12059</span>&#160;    <span class="keywordflow">if</span>(node-&gt;free.next == VMA_NULL)</div>
-<div class="line"><a name="l12060"></a><span class="lineno">12060</span>&#160;    {</div>
-<div class="line"><a name="l12061"></a><span class="lineno">12061</span>&#160;        VMA_ASSERT(m_FreeList[level].back == node);</div>
-<div class="line"><a name="l12062"></a><span class="lineno">12062</span>&#160;        m_FreeList[level].back = node-&gt;free.prev;</div>
-<div class="line"><a name="l12063"></a><span class="lineno">12063</span>&#160;    }</div>
-<div class="line"><a name="l12064"></a><span class="lineno">12064</span>&#160;    <span class="keywordflow">else</span></div>
-<div class="line"><a name="l12065"></a><span class="lineno">12065</span>&#160;    {</div>
-<div class="line"><a name="l12066"></a><span class="lineno">12066</span>&#160;        Node* <span class="keyword">const</span> nextFreeNode = node-&gt;free.next;</div>
-<div class="line"><a name="l12067"></a><span class="lineno">12067</span>&#160;        VMA_ASSERT(nextFreeNode-&gt;free.prev == node);</div>
-<div class="line"><a name="l12068"></a><span class="lineno">12068</span>&#160;        nextFreeNode-&gt;free.prev = node-&gt;free.prev;</div>
+<div class="line"><a name="l12041"></a><span class="lineno">12041</span>&#160;VmaBlockMetadata_Buddy::VmaBlockMetadata_Buddy(<a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator) :</div>
+<div class="line"><a name="l12042"></a><span class="lineno">12042</span>&#160;    VmaBlockMetadata(hAllocator),</div>
+<div class="line"><a name="l12043"></a><span class="lineno">12043</span>&#160;    m_Root(VMA_NULL),</div>
+<div class="line"><a name="l12044"></a><span class="lineno">12044</span>&#160;    m_AllocationCount(0),</div>
+<div class="line"><a name="l12045"></a><span class="lineno">12045</span>&#160;    m_FreeCount(1),</div>
+<div class="line"><a name="l12046"></a><span class="lineno">12046</span>&#160;    m_SumFreeSize(0)</div>
+<div class="line"><a name="l12047"></a><span class="lineno">12047</span>&#160;{</div>
+<div class="line"><a name="l12048"></a><span class="lineno">12048</span>&#160;    memset(m_FreeList, 0, <span class="keyword">sizeof</span>(m_FreeList));</div>
+<div class="line"><a name="l12049"></a><span class="lineno">12049</span>&#160;}</div>
+<div class="line"><a name="l12050"></a><span class="lineno">12050</span>&#160; </div>
+<div class="line"><a name="l12051"></a><span class="lineno">12051</span>&#160;VmaBlockMetadata_Buddy::~VmaBlockMetadata_Buddy()</div>
+<div class="line"><a name="l12052"></a><span class="lineno">12052</span>&#160;{</div>
+<div class="line"><a name="l12053"></a><span class="lineno">12053</span>&#160;    DeleteNode(m_Root);</div>
+<div class="line"><a name="l12054"></a><span class="lineno">12054</span>&#160;}</div>
+<div class="line"><a name="l12055"></a><span class="lineno">12055</span>&#160; </div>
+<div class="line"><a name="l12056"></a><span class="lineno">12056</span>&#160;<span class="keywordtype">void</span> VmaBlockMetadata_Buddy::Init(VkDeviceSize size)</div>
+<div class="line"><a name="l12057"></a><span class="lineno">12057</span>&#160;{</div>
+<div class="line"><a name="l12058"></a><span class="lineno">12058</span>&#160;    VmaBlockMetadata::Init(size);</div>
+<div class="line"><a name="l12059"></a><span class="lineno">12059</span>&#160; </div>
+<div class="line"><a name="l12060"></a><span class="lineno">12060</span>&#160;    m_UsableSize = VmaPrevPow2(size);</div>
+<div class="line"><a name="l12061"></a><span class="lineno">12061</span>&#160;    m_SumFreeSize = m_UsableSize;</div>
+<div class="line"><a name="l12062"></a><span class="lineno">12062</span>&#160; </div>
+<div class="line"><a name="l12063"></a><span class="lineno">12063</span>&#160;    <span class="comment">// Calculate m_LevelCount.</span></div>
+<div class="line"><a name="l12064"></a><span class="lineno">12064</span>&#160;    m_LevelCount = 1;</div>
+<div class="line"><a name="l12065"></a><span class="lineno">12065</span>&#160;    <span class="keywordflow">while</span>(m_LevelCount &lt; MAX_LEVELS &amp;&amp;</div>
+<div class="line"><a name="l12066"></a><span class="lineno">12066</span>&#160;        LevelToNodeSize(m_LevelCount) &gt;= MIN_NODE_SIZE)</div>
+<div class="line"><a name="l12067"></a><span class="lineno">12067</span>&#160;    {</div>
+<div class="line"><a name="l12068"></a><span class="lineno">12068</span>&#160;        ++m_LevelCount;</div>
 <div class="line"><a name="l12069"></a><span class="lineno">12069</span>&#160;    }</div>
-<div class="line"><a name="l12070"></a><span class="lineno">12070</span>&#160;}</div>
-<div class="line"><a name="l12071"></a><span class="lineno">12071</span>&#160; </div>
-<div class="line"><a name="l12072"></a><span class="lineno">12072</span>&#160;<span class="preprocessor">#if VMA_STATS_STRING_ENABLED</span></div>
-<div class="line"><a name="l12073"></a><span class="lineno">12073</span>&#160;<span class="keywordtype">void</span> VmaBlockMetadata_Buddy::PrintDetailedMapNode(<span class="keyword">class</span> VmaJsonWriter&amp; json, <span class="keyword">const</span> Node* node, VkDeviceSize levelNodeSize)<span class="keyword"> const</span></div>
-<div class="line"><a name="l12074"></a><span class="lineno">12074</span>&#160;<span class="keyword"></span>{</div>
-<div class="line"><a name="l12075"></a><span class="lineno">12075</span>&#160;    <span class="keywordflow">switch</span>(node-&gt;type)</div>
-<div class="line"><a name="l12076"></a><span class="lineno">12076</span>&#160;    {</div>
-<div class="line"><a name="l12077"></a><span class="lineno">12077</span>&#160;    <span class="keywordflow">case</span> Node::TYPE_FREE:</div>
-<div class="line"><a name="l12078"></a><span class="lineno">12078</span>&#160;        PrintDetailedMap_UnusedRange(json, node-&gt;offset, levelNodeSize);</div>
-<div class="line"><a name="l12079"></a><span class="lineno">12079</span>&#160;        <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l12080"></a><span class="lineno">12080</span>&#160;    <span class="keywordflow">case</span> Node::TYPE_ALLOCATION:</div>
-<div class="line"><a name="l12081"></a><span class="lineno">12081</span>&#160;        {   </div>
-<div class="line"><a name="l12082"></a><span class="lineno">12082</span>&#160;            PrintDetailedMap_Allocation(json, node-&gt;offset, node-&gt;allocation.alloc);</div>
-<div class="line"><a name="l12083"></a><span class="lineno">12083</span>&#160;            <span class="keyword">const</span> VkDeviceSize allocSize = node-&gt;allocation.alloc-&gt;GetSize();</div>
-<div class="line"><a name="l12084"></a><span class="lineno">12084</span>&#160;            <span class="keywordflow">if</span>(allocSize &lt; levelNodeSize)</div>
-<div class="line"><a name="l12085"></a><span class="lineno">12085</span>&#160;            {</div>
-<div class="line"><a name="l12086"></a><span class="lineno">12086</span>&#160;                PrintDetailedMap_UnusedRange(json, node-&gt;offset + allocSize, levelNodeSize - allocSize);</div>
-<div class="line"><a name="l12087"></a><span class="lineno">12087</span>&#160;            }</div>
-<div class="line"><a name="l12088"></a><span class="lineno">12088</span>&#160;        }</div>
-<div class="line"><a name="l12089"></a><span class="lineno">12089</span>&#160;        <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l12090"></a><span class="lineno">12090</span>&#160;    <span class="keywordflow">case</span> Node::TYPE_SPLIT:</div>
-<div class="line"><a name="l12091"></a><span class="lineno">12091</span>&#160;        {</div>
-<div class="line"><a name="l12092"></a><span class="lineno">12092</span>&#160;            <span class="keyword">const</span> VkDeviceSize childrenNodeSize = levelNodeSize / 2;</div>
-<div class="line"><a name="l12093"></a><span class="lineno">12093</span>&#160;            <span class="keyword">const</span> Node* <span class="keyword">const</span> leftChild = node-&gt;split.leftChild;</div>
-<div class="line"><a name="l12094"></a><span class="lineno">12094</span>&#160;            PrintDetailedMapNode(json, leftChild, childrenNodeSize);</div>
-<div class="line"><a name="l12095"></a><span class="lineno">12095</span>&#160;            <span class="keyword">const</span> Node* <span class="keyword">const</span> rightChild = leftChild-&gt;buddy;</div>
-<div class="line"><a name="l12096"></a><span class="lineno">12096</span>&#160;            PrintDetailedMapNode(json, rightChild, childrenNodeSize);</div>
-<div class="line"><a name="l12097"></a><span class="lineno">12097</span>&#160;        }</div>
-<div class="line"><a name="l12098"></a><span class="lineno">12098</span>&#160;        <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l12099"></a><span class="lineno">12099</span>&#160;    <span class="keywordflow">default</span>:</div>
-<div class="line"><a name="l12100"></a><span class="lineno">12100</span>&#160;        VMA_ASSERT(0);</div>
-<div class="line"><a name="l12101"></a><span class="lineno">12101</span>&#160;    }</div>
-<div class="line"><a name="l12102"></a><span class="lineno">12102</span>&#160;}</div>
-<div class="line"><a name="l12103"></a><span class="lineno">12103</span>&#160;<span class="preprocessor">#endif // #if VMA_STATS_STRING_ENABLED</span></div>
-<div class="line"><a name="l12104"></a><span class="lineno">12104</span>&#160; </div>
-<div class="line"><a name="l12105"></a><span class="lineno">12105</span>&#160; </div>
-<div class="line"><a name="l12107"></a><span class="lineno">12107</span>&#160;<span class="comment">// class VmaDeviceMemoryBlock</span></div>
-<div class="line"><a name="l12108"></a><span class="lineno">12108</span>&#160; </div>
-<div class="line"><a name="l12109"></a><span class="lineno">12109</span>&#160;VmaDeviceMemoryBlock::VmaDeviceMemoryBlock(<a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator) :</div>
-<div class="line"><a name="l12110"></a><span class="lineno">12110</span>&#160;    m_pMetadata(VMA_NULL),</div>
-<div class="line"><a name="l12111"></a><span class="lineno">12111</span>&#160;    m_MemoryTypeIndex(UINT32_MAX),</div>
-<div class="line"><a name="l12112"></a><span class="lineno">12112</span>&#160;    m_Id(0),</div>
-<div class="line"><a name="l12113"></a><span class="lineno">12113</span>&#160;    m_hMemory(VK_NULL_HANDLE),</div>
-<div class="line"><a name="l12114"></a><span class="lineno">12114</span>&#160;    m_MapCount(0),</div>
-<div class="line"><a name="l12115"></a><span class="lineno">12115</span>&#160;    m_pMappedData(VMA_NULL)</div>
-<div class="line"><a name="l12116"></a><span class="lineno">12116</span>&#160;{</div>
-<div class="line"><a name="l12117"></a><span class="lineno">12117</span>&#160;}</div>
-<div class="line"><a name="l12118"></a><span class="lineno">12118</span>&#160; </div>
-<div class="line"><a name="l12119"></a><span class="lineno">12119</span>&#160;<span class="keywordtype">void</span> VmaDeviceMemoryBlock::Init(</div>
-<div class="line"><a name="l12120"></a><span class="lineno">12120</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator,</div>
-<div class="line"><a name="l12121"></a><span class="lineno">12121</span>&#160;    <a class="code" href="struct_vma_pool.html">VmaPool</a> hParentPool,</div>
-<div class="line"><a name="l12122"></a><span class="lineno">12122</span>&#160;    uint32_t newMemoryTypeIndex,</div>
-<div class="line"><a name="l12123"></a><span class="lineno">12123</span>&#160;    VkDeviceMemory newMemory,</div>
-<div class="line"><a name="l12124"></a><span class="lineno">12124</span>&#160;    VkDeviceSize newSize,</div>
-<div class="line"><a name="l12125"></a><span class="lineno">12125</span>&#160;    uint32_t <span class="keywordtype">id</span>,</div>
-<div class="line"><a name="l12126"></a><span class="lineno">12126</span>&#160;    uint32_t algorithm)</div>
-<div class="line"><a name="l12127"></a><span class="lineno">12127</span>&#160;{</div>
-<div class="line"><a name="l12128"></a><span class="lineno">12128</span>&#160;    VMA_ASSERT(m_hMemory == VK_NULL_HANDLE);</div>
-<div class="line"><a name="l12129"></a><span class="lineno">12129</span>&#160; </div>
-<div class="line"><a name="l12130"></a><span class="lineno">12130</span>&#160;    m_hParentPool = hParentPool;</div>
-<div class="line"><a name="l12131"></a><span class="lineno">12131</span>&#160;    m_MemoryTypeIndex = newMemoryTypeIndex;</div>
-<div class="line"><a name="l12132"></a><span class="lineno">12132</span>&#160;    m_Id = id;</div>
-<div class="line"><a name="l12133"></a><span class="lineno">12133</span>&#160;    m_hMemory = newMemory;</div>
-<div class="line"><a name="l12134"></a><span class="lineno">12134</span>&#160; </div>
-<div class="line"><a name="l12135"></a><span class="lineno">12135</span>&#160;    <span class="keywordflow">switch</span>(algorithm)</div>
-<div class="line"><a name="l12136"></a><span class="lineno">12136</span>&#160;    {</div>
-<div class="line"><a name="l12137"></a><span class="lineno">12137</span>&#160;    <span class="keywordflow">case</span> <a class="code" href="vk__mem__alloc_8h.html#a9a7c45f9c863695d98c83fa5ac940fe7a13c8a444197c67866be9cb05599fc726">VMA_POOL_CREATE_LINEAR_ALGORITHM_BIT</a>:</div>
-<div class="line"><a name="l12138"></a><span class="lineno">12138</span>&#160;        m_pMetadata = vma_new(hAllocator, VmaBlockMetadata_Linear)(hAllocator);</div>
-<div class="line"><a name="l12139"></a><span class="lineno">12139</span>&#160;        <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l12140"></a><span class="lineno">12140</span>&#160;    <span class="keywordflow">case</span> <a class="code" href="vk__mem__alloc_8h.html#a9a7c45f9c863695d98c83fa5ac940fe7a97a0dc38e5161b780594d998d313d35e">VMA_POOL_CREATE_BUDDY_ALGORITHM_BIT</a>:</div>
-<div class="line"><a name="l12141"></a><span class="lineno">12141</span>&#160;        m_pMetadata = vma_new(hAllocator, VmaBlockMetadata_Buddy)(hAllocator);</div>
-<div class="line"><a name="l12142"></a><span class="lineno">12142</span>&#160;        <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l12143"></a><span class="lineno">12143</span>&#160;    <span class="keywordflow">default</span>:</div>
-<div class="line"><a name="l12144"></a><span class="lineno">12144</span>&#160;        VMA_ASSERT(0);</div>
-<div class="line"><a name="l12145"></a><span class="lineno">12145</span>&#160;        <span class="comment">// Fall-through.</span></div>
-<div class="line"><a name="l12146"></a><span class="lineno">12146</span>&#160;    <span class="keywordflow">case</span> 0:</div>
-<div class="line"><a name="l12147"></a><span class="lineno">12147</span>&#160;        m_pMetadata = vma_new(hAllocator, VmaBlockMetadata_Generic)(hAllocator);</div>
-<div class="line"><a name="l12148"></a><span class="lineno">12148</span>&#160;    }</div>
-<div class="line"><a name="l12149"></a><span class="lineno">12149</span>&#160;    m_pMetadata-&gt;Init(newSize);</div>
-<div class="line"><a name="l12150"></a><span class="lineno">12150</span>&#160;}</div>
-<div class="line"><a name="l12151"></a><span class="lineno">12151</span>&#160; </div>
-<div class="line"><a name="l12152"></a><span class="lineno">12152</span>&#160;<span class="keywordtype">void</span> VmaDeviceMemoryBlock::Destroy(<a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator)</div>
-<div class="line"><a name="l12153"></a><span class="lineno">12153</span>&#160;{</div>
-<div class="line"><a name="l12154"></a><span class="lineno">12154</span>&#160;    <span class="comment">// This is the most important assert in the entire library.</span></div>
-<div class="line"><a name="l12155"></a><span class="lineno">12155</span>&#160;    <span class="comment">// Hitting it means you have some memory leak - unreleased VmaAllocation objects.</span></div>
-<div class="line"><a name="l12156"></a><span class="lineno">12156</span>&#160;    VMA_ASSERT(m_pMetadata-&gt;IsEmpty() &amp;&amp; <span class="stringliteral">&quot;Some allocations were not freed before destruction of this memory block!&quot;</span>);</div>
-<div class="line"><a name="l12157"></a><span class="lineno">12157</span>&#160; </div>
-<div class="line"><a name="l12158"></a><span class="lineno">12158</span>&#160;    VMA_ASSERT(m_hMemory != VK_NULL_HANDLE);</div>
-<div class="line"><a name="l12159"></a><span class="lineno">12159</span>&#160;    allocator-&gt;FreeVulkanMemory(m_MemoryTypeIndex, m_pMetadata-&gt;GetSize(), m_hMemory);</div>
-<div class="line"><a name="l12160"></a><span class="lineno">12160</span>&#160;    m_hMemory = VK_NULL_HANDLE;</div>
-<div class="line"><a name="l12161"></a><span class="lineno">12161</span>&#160; </div>
-<div class="line"><a name="l12162"></a><span class="lineno">12162</span>&#160;    vma_delete(allocator, m_pMetadata);</div>
-<div class="line"><a name="l12163"></a><span class="lineno">12163</span>&#160;    m_pMetadata = VMA_NULL;</div>
-<div class="line"><a name="l12164"></a><span class="lineno">12164</span>&#160;}</div>
-<div class="line"><a name="l12165"></a><span class="lineno">12165</span>&#160; </div>
-<div class="line"><a name="l12166"></a><span class="lineno">12166</span>&#160;<span class="keywordtype">bool</span> VmaDeviceMemoryBlock::Validate()<span class="keyword"> const</span></div>
-<div class="line"><a name="l12167"></a><span class="lineno">12167</span>&#160;<span class="keyword"></span>{</div>
-<div class="line"><a name="l12168"></a><span class="lineno">12168</span>&#160;    VMA_VALIDATE((m_hMemory != VK_NULL_HANDLE) &amp;&amp;</div>
-<div class="line"><a name="l12169"></a><span class="lineno">12169</span>&#160;        (m_pMetadata-&gt;GetSize() != 0));</div>
-<div class="line"><a name="l12170"></a><span class="lineno">12170</span>&#160;    </div>
-<div class="line"><a name="l12171"></a><span class="lineno">12171</span>&#160;    <span class="keywordflow">return</span> m_pMetadata-&gt;Validate();</div>
-<div class="line"><a name="l12172"></a><span class="lineno">12172</span>&#160;}</div>
-<div class="line"><a name="l12173"></a><span class="lineno">12173</span>&#160; </div>
-<div class="line"><a name="l12174"></a><span class="lineno">12174</span>&#160;VkResult VmaDeviceMemoryBlock::CheckCorruption(<a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator)</div>
-<div class="line"><a name="l12175"></a><span class="lineno">12175</span>&#160;{</div>
-<div class="line"><a name="l12176"></a><span class="lineno">12176</span>&#160;    <span class="keywordtype">void</span>* pData = <span class="keyword">nullptr</span>;</div>
-<div class="line"><a name="l12177"></a><span class="lineno">12177</span>&#160;    VkResult res = Map(hAllocator, 1, &amp;pData);</div>
-<div class="line"><a name="l12178"></a><span class="lineno">12178</span>&#160;    <span class="keywordflow">if</span>(res != VK_SUCCESS)</div>
-<div class="line"><a name="l12179"></a><span class="lineno">12179</span>&#160;    {</div>
-<div class="line"><a name="l12180"></a><span class="lineno">12180</span>&#160;        <span class="keywordflow">return</span> res;</div>
-<div class="line"><a name="l12181"></a><span class="lineno">12181</span>&#160;    }</div>
-<div class="line"><a name="l12182"></a><span class="lineno">12182</span>&#160; </div>
-<div class="line"><a name="l12183"></a><span class="lineno">12183</span>&#160;    res = m_pMetadata-&gt;CheckCorruption(pData);</div>
+<div class="line"><a name="l12070"></a><span class="lineno">12070</span>&#160; </div>
+<div class="line"><a name="l12071"></a><span class="lineno">12071</span>&#160;    Node* rootNode = vma_new(GetAllocationCallbacks(), Node)();</div>
+<div class="line"><a name="l12072"></a><span class="lineno">12072</span>&#160;    rootNode-&gt;offset = 0;</div>
+<div class="line"><a name="l12073"></a><span class="lineno">12073</span>&#160;    rootNode-&gt;type = Node::TYPE_FREE;</div>
+<div class="line"><a name="l12074"></a><span class="lineno">12074</span>&#160;    rootNode-&gt;parent = VMA_NULL;</div>
+<div class="line"><a name="l12075"></a><span class="lineno">12075</span>&#160;    rootNode-&gt;buddy = VMA_NULL;</div>
+<div class="line"><a name="l12076"></a><span class="lineno">12076</span>&#160; </div>
+<div class="line"><a name="l12077"></a><span class="lineno">12077</span>&#160;    m_Root = rootNode;</div>
+<div class="line"><a name="l12078"></a><span class="lineno">12078</span>&#160;    AddToFreeListFront(0, rootNode);</div>
+<div class="line"><a name="l12079"></a><span class="lineno">12079</span>&#160;}</div>
+<div class="line"><a name="l12080"></a><span class="lineno">12080</span>&#160; </div>
+<div class="line"><a name="l12081"></a><span class="lineno">12081</span>&#160;<span class="keywordtype">bool</span> VmaBlockMetadata_Buddy::Validate()<span class="keyword"> const</span></div>
+<div class="line"><a name="l12082"></a><span class="lineno">12082</span>&#160;<span class="keyword"></span>{</div>
+<div class="line"><a name="l12083"></a><span class="lineno">12083</span>&#160;    <span class="comment">// Validate tree.</span></div>
+<div class="line"><a name="l12084"></a><span class="lineno">12084</span>&#160;    ValidationContext ctx;</div>
+<div class="line"><a name="l12085"></a><span class="lineno">12085</span>&#160;    <span class="keywordflow">if</span>(!ValidateNode(ctx, VMA_NULL, m_Root, 0, LevelToNodeSize(0)))</div>
+<div class="line"><a name="l12086"></a><span class="lineno">12086</span>&#160;    {</div>
+<div class="line"><a name="l12087"></a><span class="lineno">12087</span>&#160;        VMA_VALIDATE(<span class="keyword">false</span> &amp;&amp; <span class="stringliteral">&quot;ValidateNode failed.&quot;</span>);</div>
+<div class="line"><a name="l12088"></a><span class="lineno">12088</span>&#160;    }</div>
+<div class="line"><a name="l12089"></a><span class="lineno">12089</span>&#160;    VMA_VALIDATE(m_AllocationCount == ctx.calculatedAllocationCount);</div>
+<div class="line"><a name="l12090"></a><span class="lineno">12090</span>&#160;    VMA_VALIDATE(m_SumFreeSize == ctx.calculatedSumFreeSize);</div>
+<div class="line"><a name="l12091"></a><span class="lineno">12091</span>&#160; </div>
+<div class="line"><a name="l12092"></a><span class="lineno">12092</span>&#160;    <span class="comment">// Validate free node lists.</span></div>
+<div class="line"><a name="l12093"></a><span class="lineno">12093</span>&#160;    <span class="keywordflow">for</span>(uint32_t level = 0; level &lt; m_LevelCount; ++level)</div>
+<div class="line"><a name="l12094"></a><span class="lineno">12094</span>&#160;    {</div>
+<div class="line"><a name="l12095"></a><span class="lineno">12095</span>&#160;        VMA_VALIDATE(m_FreeList[level].front == VMA_NULL ||</div>
+<div class="line"><a name="l12096"></a><span class="lineno">12096</span>&#160;            m_FreeList[level].front-&gt;free.prev == VMA_NULL);</div>
+<div class="line"><a name="l12097"></a><span class="lineno">12097</span>&#160; </div>
+<div class="line"><a name="l12098"></a><span class="lineno">12098</span>&#160;        <span class="keywordflow">for</span>(Node* node = m_FreeList[level].front;</div>
+<div class="line"><a name="l12099"></a><span class="lineno">12099</span>&#160;            node != VMA_NULL;</div>
+<div class="line"><a name="l12100"></a><span class="lineno">12100</span>&#160;            node = node-&gt;free.next)</div>
+<div class="line"><a name="l12101"></a><span class="lineno">12101</span>&#160;        {</div>
+<div class="line"><a name="l12102"></a><span class="lineno">12102</span>&#160;            VMA_VALIDATE(node-&gt;type == Node::TYPE_FREE);</div>
+<div class="line"><a name="l12103"></a><span class="lineno">12103</span>&#160; </div>
+<div class="line"><a name="l12104"></a><span class="lineno">12104</span>&#160;            <span class="keywordflow">if</span>(node-&gt;free.next == VMA_NULL)</div>
+<div class="line"><a name="l12105"></a><span class="lineno">12105</span>&#160;            {</div>
+<div class="line"><a name="l12106"></a><span class="lineno">12106</span>&#160;                VMA_VALIDATE(m_FreeList[level].back == node);</div>
+<div class="line"><a name="l12107"></a><span class="lineno">12107</span>&#160;            }</div>
+<div class="line"><a name="l12108"></a><span class="lineno">12108</span>&#160;            <span class="keywordflow">else</span></div>
+<div class="line"><a name="l12109"></a><span class="lineno">12109</span>&#160;            {</div>
+<div class="line"><a name="l12110"></a><span class="lineno">12110</span>&#160;                VMA_VALIDATE(node-&gt;free.next-&gt;free.prev == node);</div>
+<div class="line"><a name="l12111"></a><span class="lineno">12111</span>&#160;            }</div>
+<div class="line"><a name="l12112"></a><span class="lineno">12112</span>&#160;        }</div>
+<div class="line"><a name="l12113"></a><span class="lineno">12113</span>&#160;    }</div>
+<div class="line"><a name="l12114"></a><span class="lineno">12114</span>&#160; </div>
+<div class="line"><a name="l12115"></a><span class="lineno">12115</span>&#160;    <span class="comment">// Validate that free lists ar higher levels are empty.</span></div>
+<div class="line"><a name="l12116"></a><span class="lineno">12116</span>&#160;    <span class="keywordflow">for</span>(uint32_t level = m_LevelCount; level &lt; MAX_LEVELS; ++level)</div>
+<div class="line"><a name="l12117"></a><span class="lineno">12117</span>&#160;    {</div>
+<div class="line"><a name="l12118"></a><span class="lineno">12118</span>&#160;        VMA_VALIDATE(m_FreeList[level].front == VMA_NULL &amp;&amp; m_FreeList[level].back == VMA_NULL);</div>
+<div class="line"><a name="l12119"></a><span class="lineno">12119</span>&#160;    }</div>
+<div class="line"><a name="l12120"></a><span class="lineno">12120</span>&#160; </div>
+<div class="line"><a name="l12121"></a><span class="lineno">12121</span>&#160;    <span class="keywordflow">return</span> <span class="keyword">true</span>;</div>
+<div class="line"><a name="l12122"></a><span class="lineno">12122</span>&#160;}</div>
+<div class="line"><a name="l12123"></a><span class="lineno">12123</span>&#160; </div>
+<div class="line"><a name="l12124"></a><span class="lineno">12124</span>&#160;VkDeviceSize VmaBlockMetadata_Buddy::GetUnusedRangeSizeMax()<span class="keyword"> const</span></div>
+<div class="line"><a name="l12125"></a><span class="lineno">12125</span>&#160;<span class="keyword"></span>{</div>
+<div class="line"><a name="l12126"></a><span class="lineno">12126</span>&#160;    <span class="keywordflow">for</span>(uint32_t level = 0; level &lt; m_LevelCount; ++level)</div>
+<div class="line"><a name="l12127"></a><span class="lineno">12127</span>&#160;    {</div>
+<div class="line"><a name="l12128"></a><span class="lineno">12128</span>&#160;        <span class="keywordflow">if</span>(m_FreeList[level].front != VMA_NULL)</div>
+<div class="line"><a name="l12129"></a><span class="lineno">12129</span>&#160;        {</div>
+<div class="line"><a name="l12130"></a><span class="lineno">12130</span>&#160;            <span class="keywordflow">return</span> LevelToNodeSize(level);</div>
+<div class="line"><a name="l12131"></a><span class="lineno">12131</span>&#160;        }</div>
+<div class="line"><a name="l12132"></a><span class="lineno">12132</span>&#160;    }</div>
+<div class="line"><a name="l12133"></a><span class="lineno">12133</span>&#160;    <span class="keywordflow">return</span> 0;</div>
+<div class="line"><a name="l12134"></a><span class="lineno">12134</span>&#160;}</div>
+<div class="line"><a name="l12135"></a><span class="lineno">12135</span>&#160; </div>
+<div class="line"><a name="l12136"></a><span class="lineno">12136</span>&#160;<span class="keywordtype">void</span> VmaBlockMetadata_Buddy::CalcAllocationStatInfo(<a class="code" href="struct_vma_stat_info.html">VmaStatInfo</a>&amp; outInfo)<span class="keyword"> const</span></div>
+<div class="line"><a name="l12137"></a><span class="lineno">12137</span>&#160;<span class="keyword"></span>{</div>
+<div class="line"><a name="l12138"></a><span class="lineno">12138</span>&#160;    <span class="keyword">const</span> VkDeviceSize unusableSize = GetUnusableSize();</div>
+<div class="line"><a name="l12139"></a><span class="lineno">12139</span>&#160; </div>
+<div class="line"><a name="l12140"></a><span class="lineno">12140</span>&#160;    outInfo.<a class="code" href="struct_vma_stat_info.html#abc4bb7cd611900778464c56e50c970a4">blockCount</a> = 1;</div>
+<div class="line"><a name="l12141"></a><span class="lineno">12141</span>&#160; </div>
+<div class="line"><a name="l12142"></a><span class="lineno">12142</span>&#160;    outInfo.<a class="code" href="struct_vma_stat_info.html#a537741e4d5cdddc1c0ab95ec650afaff">allocationCount</a> = outInfo.<a class="code" href="struct_vma_stat_info.html#ae06129c771bfebfd6468a7f4276502a9">unusedRangeCount</a> = 0;</div>
+<div class="line"><a name="l12143"></a><span class="lineno">12143</span>&#160;    outInfo.<a class="code" href="struct_vma_stat_info.html#ab0c6c73837e5a70c749fbd4f6064895a">usedBytes</a> = outInfo.<a class="code" href="struct_vma_stat_info.html#a1859d290aca2cd582d8dc25922092669">unusedBytes</a> = 0;</div>
+<div class="line"><a name="l12144"></a><span class="lineno">12144</span>&#160; </div>
+<div class="line"><a name="l12145"></a><span class="lineno">12145</span>&#160;    outInfo.<a class="code" href="struct_vma_stat_info.html#a17e9733a5ecd76287d4db6e66f71f50c">allocationSizeMax</a> = outInfo.<a class="code" href="struct_vma_stat_info.html#a5ba1a2476c4d39b10f7e2f7ebbb72ac4">unusedRangeSizeMax</a> = 0;</div>
+<div class="line"><a name="l12146"></a><span class="lineno">12146</span>&#160;    outInfo.<a class="code" href="struct_vma_stat_info.html#ade8b40bd3139c04aabd2fc538a356fea">allocationSizeMin</a> = outInfo.<a class="code" href="struct_vma_stat_info.html#aedeba931324f16589cd2416c0d2dd0d4">unusedRangeSizeMin</a> = UINT64_MAX;</div>
+<div class="line"><a name="l12147"></a><span class="lineno">12147</span>&#160;    outInfo.<a class="code" href="struct_vma_stat_info.html#a1081a039964e566c672e7a2347f9e599">allocationSizeAvg</a> = outInfo.<a class="code" href="struct_vma_stat_info.html#a2f9b3452af90c9768a30b7fb6ae194fc">unusedRangeSizeAvg</a> = 0; <span class="comment">// Unused.</span></div>
+<div class="line"><a name="l12148"></a><span class="lineno">12148</span>&#160; </div>
+<div class="line"><a name="l12149"></a><span class="lineno">12149</span>&#160;    CalcAllocationStatInfoNode(outInfo, m_Root, LevelToNodeSize(0));</div>
+<div class="line"><a name="l12150"></a><span class="lineno">12150</span>&#160; </div>
+<div class="line"><a name="l12151"></a><span class="lineno">12151</span>&#160;    <span class="keywordflow">if</span>(unusableSize &gt; 0)</div>
+<div class="line"><a name="l12152"></a><span class="lineno">12152</span>&#160;    {</div>
+<div class="line"><a name="l12153"></a><span class="lineno">12153</span>&#160;        ++outInfo.<a class="code" href="struct_vma_stat_info.html#ae06129c771bfebfd6468a7f4276502a9">unusedRangeCount</a>;</div>
+<div class="line"><a name="l12154"></a><span class="lineno">12154</span>&#160;        outInfo.<a class="code" href="struct_vma_stat_info.html#a1859d290aca2cd582d8dc25922092669">unusedBytes</a> += unusableSize;</div>
+<div class="line"><a name="l12155"></a><span class="lineno">12155</span>&#160;        outInfo.<a class="code" href="struct_vma_stat_info.html#a5ba1a2476c4d39b10f7e2f7ebbb72ac4">unusedRangeSizeMax</a> = VMA_MAX(outInfo.<a class="code" href="struct_vma_stat_info.html#a5ba1a2476c4d39b10f7e2f7ebbb72ac4">unusedRangeSizeMax</a>, unusableSize);</div>
+<div class="line"><a name="l12156"></a><span class="lineno">12156</span>&#160;        outInfo.<a class="code" href="struct_vma_stat_info.html#aedeba931324f16589cd2416c0d2dd0d4">unusedRangeSizeMin</a> = VMA_MIN(outInfo.<a class="code" href="struct_vma_stat_info.html#aedeba931324f16589cd2416c0d2dd0d4">unusedRangeSizeMin</a>, unusableSize);</div>
+<div class="line"><a name="l12157"></a><span class="lineno">12157</span>&#160;    }</div>
+<div class="line"><a name="l12158"></a><span class="lineno">12158</span>&#160;}</div>
+<div class="line"><a name="l12159"></a><span class="lineno">12159</span>&#160; </div>
+<div class="line"><a name="l12160"></a><span class="lineno">12160</span>&#160;<span class="keywordtype">void</span> VmaBlockMetadata_Buddy::AddPoolStats(<a class="code" href="struct_vma_pool_stats.html">VmaPoolStats</a>&amp; inoutStats)<span class="keyword"> const</span></div>
+<div class="line"><a name="l12161"></a><span class="lineno">12161</span>&#160;<span class="keyword"></span>{</div>
+<div class="line"><a name="l12162"></a><span class="lineno">12162</span>&#160;    <span class="keyword">const</span> VkDeviceSize unusableSize = GetUnusableSize();</div>
+<div class="line"><a name="l12163"></a><span class="lineno">12163</span>&#160; </div>
+<div class="line"><a name="l12164"></a><span class="lineno">12164</span>&#160;    inoutStats.<a class="code" href="struct_vma_pool_stats.html#a326807b2de2b0931cee4ed9a5f2e420c">size</a> += GetSize();</div>
+<div class="line"><a name="l12165"></a><span class="lineno">12165</span>&#160;    inoutStats.<a class="code" href="struct_vma_pool_stats.html#ad7c54874724fce7b06aba526202d82a8">unusedSize</a> += m_SumFreeSize + unusableSize;</div>
+<div class="line"><a name="l12166"></a><span class="lineno">12166</span>&#160;    inoutStats.<a class="code" href="struct_vma_pool_stats.html#ad1924eb54fffa45e9e0e65670c8fe5eb">allocationCount</a> += m_AllocationCount;</div>
+<div class="line"><a name="l12167"></a><span class="lineno">12167</span>&#160;    inoutStats.<a class="code" href="struct_vma_pool_stats.html#ae4f3546ffa4d1e598b64d8e6134854f4">unusedRangeCount</a> += m_FreeCount;</div>
+<div class="line"><a name="l12168"></a><span class="lineno">12168</span>&#160;    inoutStats.<a class="code" href="struct_vma_pool_stats.html#ab4c8f52dd42ab01998f60f0b6acc722b">unusedRangeSizeMax</a> = VMA_MAX(inoutStats.<a class="code" href="struct_vma_pool_stats.html#ab4c8f52dd42ab01998f60f0b6acc722b">unusedRangeSizeMax</a>, GetUnusedRangeSizeMax());</div>
+<div class="line"><a name="l12169"></a><span class="lineno">12169</span>&#160; </div>
+<div class="line"><a name="l12170"></a><span class="lineno">12170</span>&#160;    <span class="keywordflow">if</span>(unusableSize &gt; 0)</div>
+<div class="line"><a name="l12171"></a><span class="lineno">12171</span>&#160;    {</div>
+<div class="line"><a name="l12172"></a><span class="lineno">12172</span>&#160;        ++inoutStats.<a class="code" href="struct_vma_pool_stats.html#ae4f3546ffa4d1e598b64d8e6134854f4">unusedRangeCount</a>;</div>
+<div class="line"><a name="l12173"></a><span class="lineno">12173</span>&#160;        <span class="comment">// Not updating inoutStats.unusedRangeSizeMax with unusableSize because this space is not available for allocations.</span></div>
+<div class="line"><a name="l12174"></a><span class="lineno">12174</span>&#160;    }</div>
+<div class="line"><a name="l12175"></a><span class="lineno">12175</span>&#160;}</div>
+<div class="line"><a name="l12176"></a><span class="lineno">12176</span>&#160; </div>
+<div class="line"><a name="l12177"></a><span class="lineno">12177</span>&#160;<span class="preprocessor">#if VMA_STATS_STRING_ENABLED</span></div>
+<div class="line"><a name="l12178"></a><span class="lineno">12178</span>&#160; </div>
+<div class="line"><a name="l12179"></a><span class="lineno">12179</span>&#160;<span class="keywordtype">void</span> VmaBlockMetadata_Buddy::PrintDetailedMap(<span class="keyword">class</span> VmaJsonWriter&amp; json)<span class="keyword"> const</span></div>
+<div class="line"><a name="l12180"></a><span class="lineno">12180</span>&#160;<span class="keyword"></span>{</div>
+<div class="line"><a name="l12181"></a><span class="lineno">12181</span>&#160;    <span class="comment">// TODO optimize</span></div>
+<div class="line"><a name="l12182"></a><span class="lineno">12182</span>&#160;    <a class="code" href="struct_vma_stat_info.html">VmaStatInfo</a> stat;</div>
+<div class="line"><a name="l12183"></a><span class="lineno">12183</span>&#160;    CalcAllocationStatInfo(stat);</div>
 <div class="line"><a name="l12184"></a><span class="lineno">12184</span>&#160; </div>
-<div class="line"><a name="l12185"></a><span class="lineno">12185</span>&#160;    Unmap(hAllocator, 1);</div>
-<div class="line"><a name="l12186"></a><span class="lineno">12186</span>&#160; </div>
-<div class="line"><a name="l12187"></a><span class="lineno">12187</span>&#160;    <span class="keywordflow">return</span> res;</div>
-<div class="line"><a name="l12188"></a><span class="lineno">12188</span>&#160;}</div>
-<div class="line"><a name="l12189"></a><span class="lineno">12189</span>&#160; </div>
-<div class="line"><a name="l12190"></a><span class="lineno">12190</span>&#160;VkResult VmaDeviceMemoryBlock::Map(<a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator, uint32_t count, <span class="keywordtype">void</span>** ppData)</div>
-<div class="line"><a name="l12191"></a><span class="lineno">12191</span>&#160;{</div>
-<div class="line"><a name="l12192"></a><span class="lineno">12192</span>&#160;    <span class="keywordflow">if</span>(count == 0)</div>
-<div class="line"><a name="l12193"></a><span class="lineno">12193</span>&#160;    {</div>
-<div class="line"><a name="l12194"></a><span class="lineno">12194</span>&#160;        <span class="keywordflow">return</span> VK_SUCCESS;</div>
-<div class="line"><a name="l12195"></a><span class="lineno">12195</span>&#160;    }</div>
-<div class="line"><a name="l12196"></a><span class="lineno">12196</span>&#160; </div>
-<div class="line"><a name="l12197"></a><span class="lineno">12197</span>&#160;    VmaMutexLock lock(m_Mutex, hAllocator-&gt;m_UseMutex);</div>
-<div class="line"><a name="l12198"></a><span class="lineno">12198</span>&#160;    <span class="keywordflow">if</span>(m_MapCount != 0)</div>
-<div class="line"><a name="l12199"></a><span class="lineno">12199</span>&#160;    {</div>
-<div class="line"><a name="l12200"></a><span class="lineno">12200</span>&#160;        m_MapCount += count;</div>
-<div class="line"><a name="l12201"></a><span class="lineno">12201</span>&#160;        VMA_ASSERT(m_pMappedData != VMA_NULL);</div>
-<div class="line"><a name="l12202"></a><span class="lineno">12202</span>&#160;        <span class="keywordflow">if</span>(ppData != VMA_NULL)</div>
-<div class="line"><a name="l12203"></a><span class="lineno">12203</span>&#160;        {</div>
-<div class="line"><a name="l12204"></a><span class="lineno">12204</span>&#160;            *ppData = m_pMappedData;</div>
-<div class="line"><a name="l12205"></a><span class="lineno">12205</span>&#160;        }</div>
-<div class="line"><a name="l12206"></a><span class="lineno">12206</span>&#160;        <span class="keywordflow">return</span> VK_SUCCESS;</div>
-<div class="line"><a name="l12207"></a><span class="lineno">12207</span>&#160;    }</div>
-<div class="line"><a name="l12208"></a><span class="lineno">12208</span>&#160;    <span class="keywordflow">else</span></div>
-<div class="line"><a name="l12209"></a><span class="lineno">12209</span>&#160;    {</div>
-<div class="line"><a name="l12210"></a><span class="lineno">12210</span>&#160;        VkResult result = (*hAllocator-&gt;GetVulkanFunctions().vkMapMemory)(</div>
-<div class="line"><a name="l12211"></a><span class="lineno">12211</span>&#160;            hAllocator-&gt;m_hDevice,</div>
-<div class="line"><a name="l12212"></a><span class="lineno">12212</span>&#160;            m_hMemory,</div>
-<div class="line"><a name="l12213"></a><span class="lineno">12213</span>&#160;            0, <span class="comment">// offset</span></div>
-<div class="line"><a name="l12214"></a><span class="lineno">12214</span>&#160;            VK_WHOLE_SIZE,</div>
-<div class="line"><a name="l12215"></a><span class="lineno">12215</span>&#160;            0, <span class="comment">// flags</span></div>
-<div class="line"><a name="l12216"></a><span class="lineno">12216</span>&#160;            &amp;m_pMappedData);</div>
-<div class="line"><a name="l12217"></a><span class="lineno">12217</span>&#160;        <span class="keywordflow">if</span>(result == VK_SUCCESS)</div>
-<div class="line"><a name="l12218"></a><span class="lineno">12218</span>&#160;        {</div>
-<div class="line"><a name="l12219"></a><span class="lineno">12219</span>&#160;            <span class="keywordflow">if</span>(ppData != VMA_NULL)</div>
-<div class="line"><a name="l12220"></a><span class="lineno">12220</span>&#160;            {</div>
-<div class="line"><a name="l12221"></a><span class="lineno">12221</span>&#160;                *ppData = m_pMappedData;</div>
-<div class="line"><a name="l12222"></a><span class="lineno">12222</span>&#160;            }</div>
-<div class="line"><a name="l12223"></a><span class="lineno">12223</span>&#160;            m_MapCount = count;</div>
-<div class="line"><a name="l12224"></a><span class="lineno">12224</span>&#160;        }</div>
-<div class="line"><a name="l12225"></a><span class="lineno">12225</span>&#160;        <span class="keywordflow">return</span> result;</div>
-<div class="line"><a name="l12226"></a><span class="lineno">12226</span>&#160;    }</div>
-<div class="line"><a name="l12227"></a><span class="lineno">12227</span>&#160;}</div>
-<div class="line"><a name="l12228"></a><span class="lineno">12228</span>&#160; </div>
-<div class="line"><a name="l12229"></a><span class="lineno">12229</span>&#160;<span class="keywordtype">void</span> VmaDeviceMemoryBlock::Unmap(<a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator, uint32_t count)</div>
-<div class="line"><a name="l12230"></a><span class="lineno">12230</span>&#160;{</div>
-<div class="line"><a name="l12231"></a><span class="lineno">12231</span>&#160;    <span class="keywordflow">if</span>(count == 0)</div>
-<div class="line"><a name="l12232"></a><span class="lineno">12232</span>&#160;    {</div>
-<div class="line"><a name="l12233"></a><span class="lineno">12233</span>&#160;        <span class="keywordflow">return</span>;</div>
-<div class="line"><a name="l12234"></a><span class="lineno">12234</span>&#160;    }</div>
-<div class="line"><a name="l12235"></a><span class="lineno">12235</span>&#160; </div>
-<div class="line"><a name="l12236"></a><span class="lineno">12236</span>&#160;    VmaMutexLock lock(m_Mutex, hAllocator-&gt;m_UseMutex);</div>
-<div class="line"><a name="l12237"></a><span class="lineno">12237</span>&#160;    <span class="keywordflow">if</span>(m_MapCount &gt;= count)</div>
-<div class="line"><a name="l12238"></a><span class="lineno">12238</span>&#160;    {</div>
-<div class="line"><a name="l12239"></a><span class="lineno">12239</span>&#160;        m_MapCount -= count;</div>
-<div class="line"><a name="l12240"></a><span class="lineno">12240</span>&#160;        <span class="keywordflow">if</span>(m_MapCount == 0)</div>
+<div class="line"><a name="l12185"></a><span class="lineno">12185</span>&#160;    PrintDetailedMap_Begin(</div>
+<div class="line"><a name="l12186"></a><span class="lineno">12186</span>&#160;        json,</div>
+<div class="line"><a name="l12187"></a><span class="lineno">12187</span>&#160;        stat.<a class="code" href="struct_vma_stat_info.html#a1859d290aca2cd582d8dc25922092669">unusedBytes</a>,</div>
+<div class="line"><a name="l12188"></a><span class="lineno">12188</span>&#160;        stat.<a class="code" href="struct_vma_stat_info.html#a537741e4d5cdddc1c0ab95ec650afaff">allocationCount</a>,</div>
+<div class="line"><a name="l12189"></a><span class="lineno">12189</span>&#160;        stat.<a class="code" href="struct_vma_stat_info.html#ae06129c771bfebfd6468a7f4276502a9">unusedRangeCount</a>);</div>
+<div class="line"><a name="l12190"></a><span class="lineno">12190</span>&#160; </div>
+<div class="line"><a name="l12191"></a><span class="lineno">12191</span>&#160;    PrintDetailedMapNode(json, m_Root, LevelToNodeSize(0));</div>
+<div class="line"><a name="l12192"></a><span class="lineno">12192</span>&#160; </div>
+<div class="line"><a name="l12193"></a><span class="lineno">12193</span>&#160;    <span class="keyword">const</span> VkDeviceSize unusableSize = GetUnusableSize();</div>
+<div class="line"><a name="l12194"></a><span class="lineno">12194</span>&#160;    <span class="keywordflow">if</span>(unusableSize &gt; 0)</div>
+<div class="line"><a name="l12195"></a><span class="lineno">12195</span>&#160;    {</div>
+<div class="line"><a name="l12196"></a><span class="lineno">12196</span>&#160;        PrintDetailedMap_UnusedRange(json,</div>
+<div class="line"><a name="l12197"></a><span class="lineno">12197</span>&#160;            m_UsableSize, <span class="comment">// offset</span></div>
+<div class="line"><a name="l12198"></a><span class="lineno">12198</span>&#160;            unusableSize); <span class="comment">// size</span></div>
+<div class="line"><a name="l12199"></a><span class="lineno">12199</span>&#160;    }</div>
+<div class="line"><a name="l12200"></a><span class="lineno">12200</span>&#160; </div>
+<div class="line"><a name="l12201"></a><span class="lineno">12201</span>&#160;    PrintDetailedMap_End(json);</div>
+<div class="line"><a name="l12202"></a><span class="lineno">12202</span>&#160;}</div>
+<div class="line"><a name="l12203"></a><span class="lineno">12203</span>&#160; </div>
+<div class="line"><a name="l12204"></a><span class="lineno">12204</span>&#160;<span class="preprocessor">#endif </span><span class="comment">// #if VMA_STATS_STRING_ENABLED</span></div>
+<div class="line"><a name="l12205"></a><span class="lineno">12205</span>&#160; </div>
+<div class="line"><a name="l12206"></a><span class="lineno">12206</span>&#160;<span class="keywordtype">bool</span> VmaBlockMetadata_Buddy::CreateAllocationRequest(</div>
+<div class="line"><a name="l12207"></a><span class="lineno">12207</span>&#160;    uint32_t currentFrameIndex,</div>
+<div class="line"><a name="l12208"></a><span class="lineno">12208</span>&#160;    uint32_t frameInUseCount,</div>
+<div class="line"><a name="l12209"></a><span class="lineno">12209</span>&#160;    VkDeviceSize bufferImageGranularity,</div>
+<div class="line"><a name="l12210"></a><span class="lineno">12210</span>&#160;    VkDeviceSize allocSize,</div>
+<div class="line"><a name="l12211"></a><span class="lineno">12211</span>&#160;    VkDeviceSize allocAlignment,</div>
+<div class="line"><a name="l12212"></a><span class="lineno">12212</span>&#160;    <span class="keywordtype">bool</span> upperAddress,</div>
+<div class="line"><a name="l12213"></a><span class="lineno">12213</span>&#160;    VmaSuballocationType allocType,</div>
+<div class="line"><a name="l12214"></a><span class="lineno">12214</span>&#160;    <span class="keywordtype">bool</span> canMakeOtherLost,</div>
+<div class="line"><a name="l12215"></a><span class="lineno">12215</span>&#160;    uint32_t strategy,</div>
+<div class="line"><a name="l12216"></a><span class="lineno">12216</span>&#160;    VmaAllocationRequest* pAllocationRequest)</div>
+<div class="line"><a name="l12217"></a><span class="lineno">12217</span>&#160;{</div>
+<div class="line"><a name="l12218"></a><span class="lineno">12218</span>&#160;    VMA_ASSERT(!upperAddress &amp;&amp; <span class="stringliteral">&quot;VMA_ALLOCATION_CREATE_UPPER_ADDRESS_BIT can be used only with linear algorithm.&quot;</span>);</div>
+<div class="line"><a name="l12219"></a><span class="lineno">12219</span>&#160; </div>
+<div class="line"><a name="l12220"></a><span class="lineno">12220</span>&#160;    <span class="comment">// Simple way to respect bufferImageGranularity. May be optimized some day.</span></div>
+<div class="line"><a name="l12221"></a><span class="lineno">12221</span>&#160;    <span class="comment">// Whenever it might be an OPTIMAL image...</span></div>
+<div class="line"><a name="l12222"></a><span class="lineno">12222</span>&#160;    <span class="keywordflow">if</span>(allocType == VMA_SUBALLOCATION_TYPE_UNKNOWN ||</div>
+<div class="line"><a name="l12223"></a><span class="lineno">12223</span>&#160;        allocType == VMA_SUBALLOCATION_TYPE_IMAGE_UNKNOWN ||</div>
+<div class="line"><a name="l12224"></a><span class="lineno">12224</span>&#160;        allocType == VMA_SUBALLOCATION_TYPE_IMAGE_OPTIMAL)</div>
+<div class="line"><a name="l12225"></a><span class="lineno">12225</span>&#160;    {</div>
+<div class="line"><a name="l12226"></a><span class="lineno">12226</span>&#160;        allocAlignment = VMA_MAX(allocAlignment, bufferImageGranularity);</div>
+<div class="line"><a name="l12227"></a><span class="lineno">12227</span>&#160;        allocSize = VMA_MAX(allocSize, bufferImageGranularity);</div>
+<div class="line"><a name="l12228"></a><span class="lineno">12228</span>&#160;    }</div>
+<div class="line"><a name="l12229"></a><span class="lineno">12229</span>&#160; </div>
+<div class="line"><a name="l12230"></a><span class="lineno">12230</span>&#160;    <span class="keywordflow">if</span>(allocSize &gt; m_UsableSize)</div>
+<div class="line"><a name="l12231"></a><span class="lineno">12231</span>&#160;    {</div>
+<div class="line"><a name="l12232"></a><span class="lineno">12232</span>&#160;        <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
+<div class="line"><a name="l12233"></a><span class="lineno">12233</span>&#160;    }</div>
+<div class="line"><a name="l12234"></a><span class="lineno">12234</span>&#160; </div>
+<div class="line"><a name="l12235"></a><span class="lineno">12235</span>&#160;    <span class="keyword">const</span> uint32_t targetLevel = AllocSizeToLevel(allocSize);</div>
+<div class="line"><a name="l12236"></a><span class="lineno">12236</span>&#160;    <span class="keywordflow">for</span>(uint32_t level = targetLevel + 1; level--; )</div>
+<div class="line"><a name="l12237"></a><span class="lineno">12237</span>&#160;    {</div>
+<div class="line"><a name="l12238"></a><span class="lineno">12238</span>&#160;        <span class="keywordflow">for</span>(Node* freeNode = m_FreeList[level].front;</div>
+<div class="line"><a name="l12239"></a><span class="lineno">12239</span>&#160;            freeNode != VMA_NULL;</div>
+<div class="line"><a name="l12240"></a><span class="lineno">12240</span>&#160;            freeNode = freeNode-&gt;free.next)</div>
 <div class="line"><a name="l12241"></a><span class="lineno">12241</span>&#160;        {</div>
-<div class="line"><a name="l12242"></a><span class="lineno">12242</span>&#160;            m_pMappedData = VMA_NULL;</div>
-<div class="line"><a name="l12243"></a><span class="lineno">12243</span>&#160;            (*hAllocator-&gt;GetVulkanFunctions().vkUnmapMemory)(hAllocator-&gt;m_hDevice, m_hMemory);</div>
-<div class="line"><a name="l12244"></a><span class="lineno">12244</span>&#160;        }</div>
-<div class="line"><a name="l12245"></a><span class="lineno">12245</span>&#160;    }</div>
-<div class="line"><a name="l12246"></a><span class="lineno">12246</span>&#160;    <span class="keywordflow">else</span></div>
-<div class="line"><a name="l12247"></a><span class="lineno">12247</span>&#160;    {</div>
-<div class="line"><a name="l12248"></a><span class="lineno">12248</span>&#160;        VMA_ASSERT(0 &amp;&amp; <span class="stringliteral">&quot;VkDeviceMemory block is being unmapped while it was not previously mapped.&quot;</span>);</div>
-<div class="line"><a name="l12249"></a><span class="lineno">12249</span>&#160;    }</div>
-<div class="line"><a name="l12250"></a><span class="lineno">12250</span>&#160;}</div>
-<div class="line"><a name="l12251"></a><span class="lineno">12251</span>&#160; </div>
-<div class="line"><a name="l12252"></a><span class="lineno">12252</span>&#160;VkResult VmaDeviceMemoryBlock::WriteMagicValueAroundAllocation(<a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator, VkDeviceSize allocOffset, VkDeviceSize allocSize)</div>
-<div class="line"><a name="l12253"></a><span class="lineno">12253</span>&#160;{</div>
-<div class="line"><a name="l12254"></a><span class="lineno">12254</span>&#160;    VMA_ASSERT(VMA_DEBUG_MARGIN &gt; 0 &amp;&amp; VMA_DEBUG_MARGIN % 4 == 0 &amp;&amp; VMA_DEBUG_DETECT_CORRUPTION);</div>
-<div class="line"><a name="l12255"></a><span class="lineno">12255</span>&#160;    VMA_ASSERT(allocOffset &gt;= VMA_DEBUG_MARGIN);</div>
-<div class="line"><a name="l12256"></a><span class="lineno">12256</span>&#160; </div>
-<div class="line"><a name="l12257"></a><span class="lineno">12257</span>&#160;    <span class="keywordtype">void</span>* pData;</div>
-<div class="line"><a name="l12258"></a><span class="lineno">12258</span>&#160;    VkResult res = Map(hAllocator, 1, &amp;pData);</div>
-<div class="line"><a name="l12259"></a><span class="lineno">12259</span>&#160;    <span class="keywordflow">if</span>(res != VK_SUCCESS)</div>
-<div class="line"><a name="l12260"></a><span class="lineno">12260</span>&#160;    {</div>
-<div class="line"><a name="l12261"></a><span class="lineno">12261</span>&#160;        <span class="keywordflow">return</span> res;</div>
-<div class="line"><a name="l12262"></a><span class="lineno">12262</span>&#160;    }</div>
-<div class="line"><a name="l12263"></a><span class="lineno">12263</span>&#160; </div>
-<div class="line"><a name="l12264"></a><span class="lineno">12264</span>&#160;    VmaWriteMagicValue(pData, allocOffset - VMA_DEBUG_MARGIN);</div>
-<div class="line"><a name="l12265"></a><span class="lineno">12265</span>&#160;    VmaWriteMagicValue(pData, allocOffset + allocSize);</div>
-<div class="line"><a name="l12266"></a><span class="lineno">12266</span>&#160; </div>
-<div class="line"><a name="l12267"></a><span class="lineno">12267</span>&#160;    Unmap(hAllocator, 1);</div>
-<div class="line"><a name="l12268"></a><span class="lineno">12268</span>&#160; </div>
-<div class="line"><a name="l12269"></a><span class="lineno">12269</span>&#160;    <span class="keywordflow">return</span> VK_SUCCESS;</div>
-<div class="line"><a name="l12270"></a><span class="lineno">12270</span>&#160;}</div>
-<div class="line"><a name="l12271"></a><span class="lineno">12271</span>&#160; </div>
-<div class="line"><a name="l12272"></a><span class="lineno">12272</span>&#160;VkResult VmaDeviceMemoryBlock::ValidateMagicValueAroundAllocation(<a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator, VkDeviceSize allocOffset, VkDeviceSize allocSize)</div>
-<div class="line"><a name="l12273"></a><span class="lineno">12273</span>&#160;{</div>
-<div class="line"><a name="l12274"></a><span class="lineno">12274</span>&#160;    VMA_ASSERT(VMA_DEBUG_MARGIN &gt; 0 &amp;&amp; VMA_DEBUG_MARGIN % 4 == 0 &amp;&amp; VMA_DEBUG_DETECT_CORRUPTION);</div>
-<div class="line"><a name="l12275"></a><span class="lineno">12275</span>&#160;    VMA_ASSERT(allocOffset &gt;= VMA_DEBUG_MARGIN);</div>
-<div class="line"><a name="l12276"></a><span class="lineno">12276</span>&#160; </div>
-<div class="line"><a name="l12277"></a><span class="lineno">12277</span>&#160;    <span class="keywordtype">void</span>* pData;</div>
-<div class="line"><a name="l12278"></a><span class="lineno">12278</span>&#160;    VkResult res = Map(hAllocator, 1, &amp;pData);</div>
-<div class="line"><a name="l12279"></a><span class="lineno">12279</span>&#160;    <span class="keywordflow">if</span>(res != VK_SUCCESS)</div>
-<div class="line"><a name="l12280"></a><span class="lineno">12280</span>&#160;    {</div>
-<div class="line"><a name="l12281"></a><span class="lineno">12281</span>&#160;        <span class="keywordflow">return</span> res;</div>
-<div class="line"><a name="l12282"></a><span class="lineno">12282</span>&#160;    }</div>
-<div class="line"><a name="l12283"></a><span class="lineno">12283</span>&#160; </div>
-<div class="line"><a name="l12284"></a><span class="lineno">12284</span>&#160;    <span class="keywordflow">if</span>(!VmaValidateMagicValue(pData, allocOffset - VMA_DEBUG_MARGIN))</div>
-<div class="line"><a name="l12285"></a><span class="lineno">12285</span>&#160;    {</div>
-<div class="line"><a name="l12286"></a><span class="lineno">12286</span>&#160;        VMA_ASSERT(0 &amp;&amp; <span class="stringliteral">&quot;MEMORY CORRUPTION DETECTED BEFORE FREED ALLOCATION!&quot;</span>);</div>
-<div class="line"><a name="l12287"></a><span class="lineno">12287</span>&#160;    }</div>
-<div class="line"><a name="l12288"></a><span class="lineno">12288</span>&#160;    <span class="keywordflow">else</span> <span class="keywordflow">if</span>(!VmaValidateMagicValue(pData, allocOffset + allocSize))</div>
-<div class="line"><a name="l12289"></a><span class="lineno">12289</span>&#160;    {</div>
-<div class="line"><a name="l12290"></a><span class="lineno">12290</span>&#160;        VMA_ASSERT(0 &amp;&amp; <span class="stringliteral">&quot;MEMORY CORRUPTION DETECTED AFTER FREED ALLOCATION!&quot;</span>);</div>
-<div class="line"><a name="l12291"></a><span class="lineno">12291</span>&#160;    }</div>
-<div class="line"><a name="l12292"></a><span class="lineno">12292</span>&#160; </div>
-<div class="line"><a name="l12293"></a><span class="lineno">12293</span>&#160;    Unmap(hAllocator, 1);</div>
-<div class="line"><a name="l12294"></a><span class="lineno">12294</span>&#160; </div>
-<div class="line"><a name="l12295"></a><span class="lineno">12295</span>&#160;    <span class="keywordflow">return</span> VK_SUCCESS;</div>
-<div class="line"><a name="l12296"></a><span class="lineno">12296</span>&#160;}</div>
+<div class="line"><a name="l12242"></a><span class="lineno">12242</span>&#160;            <span class="keywordflow">if</span>(freeNode-&gt;offset % allocAlignment == 0)</div>
+<div class="line"><a name="l12243"></a><span class="lineno">12243</span>&#160;            {</div>
+<div class="line"><a name="l12244"></a><span class="lineno">12244</span>&#160;                pAllocationRequest-&gt;type = VmaAllocationRequestType::Normal;</div>
+<div class="line"><a name="l12245"></a><span class="lineno">12245</span>&#160;                pAllocationRequest-&gt;offset = freeNode-&gt;offset;</div>
+<div class="line"><a name="l12246"></a><span class="lineno">12246</span>&#160;                pAllocationRequest-&gt;sumFreeSize = LevelToNodeSize(level);</div>
+<div class="line"><a name="l12247"></a><span class="lineno">12247</span>&#160;                pAllocationRequest-&gt;sumItemSize = 0;</div>
+<div class="line"><a name="l12248"></a><span class="lineno">12248</span>&#160;                pAllocationRequest-&gt;itemsToMakeLostCount = 0;</div>
+<div class="line"><a name="l12249"></a><span class="lineno">12249</span>&#160;                pAllocationRequest-&gt;customData = (<span class="keywordtype">void</span>*)(uintptr_t)level;</div>
+<div class="line"><a name="l12250"></a><span class="lineno">12250</span>&#160;                <span class="keywordflow">return</span> <span class="keyword">true</span>;</div>
+<div class="line"><a name="l12251"></a><span class="lineno">12251</span>&#160;            }</div>
+<div class="line"><a name="l12252"></a><span class="lineno">12252</span>&#160;        }</div>
+<div class="line"><a name="l12253"></a><span class="lineno">12253</span>&#160;    }</div>
+<div class="line"><a name="l12254"></a><span class="lineno">12254</span>&#160; </div>
+<div class="line"><a name="l12255"></a><span class="lineno">12255</span>&#160;    <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
+<div class="line"><a name="l12256"></a><span class="lineno">12256</span>&#160;}</div>
+<div class="line"><a name="l12257"></a><span class="lineno">12257</span>&#160; </div>
+<div class="line"><a name="l12258"></a><span class="lineno">12258</span>&#160;<span class="keywordtype">bool</span> VmaBlockMetadata_Buddy::MakeRequestedAllocationsLost(</div>
+<div class="line"><a name="l12259"></a><span class="lineno">12259</span>&#160;    uint32_t currentFrameIndex,</div>
+<div class="line"><a name="l12260"></a><span class="lineno">12260</span>&#160;    uint32_t frameInUseCount,</div>
+<div class="line"><a name="l12261"></a><span class="lineno">12261</span>&#160;    VmaAllocationRequest* pAllocationRequest)</div>
+<div class="line"><a name="l12262"></a><span class="lineno">12262</span>&#160;{</div>
+<div class="line"><a name="l12263"></a><span class="lineno">12263</span>&#160;    <span class="comment">/*</span></div>
+<div class="line"><a name="l12264"></a><span class="lineno">12264</span>&#160;<span class="comment">    Lost allocations are not supported in buddy allocator at the moment.</span></div>
+<div class="line"><a name="l12265"></a><span class="lineno">12265</span>&#160;<span class="comment">    Support might be added in the future.</span></div>
+<div class="line"><a name="l12266"></a><span class="lineno">12266</span>&#160;<span class="comment">    */</span></div>
+<div class="line"><a name="l12267"></a><span class="lineno">12267</span>&#160;    <span class="keywordflow">return</span> pAllocationRequest-&gt;itemsToMakeLostCount == 0;</div>
+<div class="line"><a name="l12268"></a><span class="lineno">12268</span>&#160;}</div>
+<div class="line"><a name="l12269"></a><span class="lineno">12269</span>&#160; </div>
+<div class="line"><a name="l12270"></a><span class="lineno">12270</span>&#160;uint32_t VmaBlockMetadata_Buddy::MakeAllocationsLost(uint32_t currentFrameIndex, uint32_t frameInUseCount)</div>
+<div class="line"><a name="l12271"></a><span class="lineno">12271</span>&#160;{</div>
+<div class="line"><a name="l12272"></a><span class="lineno">12272</span>&#160;    <span class="comment">/*</span></div>
+<div class="line"><a name="l12273"></a><span class="lineno">12273</span>&#160;<span class="comment">    Lost allocations are not supported in buddy allocator at the moment.</span></div>
+<div class="line"><a name="l12274"></a><span class="lineno">12274</span>&#160;<span class="comment">    Support might be added in the future.</span></div>
+<div class="line"><a name="l12275"></a><span class="lineno">12275</span>&#160;<span class="comment">    */</span></div>
+<div class="line"><a name="l12276"></a><span class="lineno">12276</span>&#160;    <span class="keywordflow">return</span> 0;</div>
+<div class="line"><a name="l12277"></a><span class="lineno">12277</span>&#160;}</div>
+<div class="line"><a name="l12278"></a><span class="lineno">12278</span>&#160; </div>
+<div class="line"><a name="l12279"></a><span class="lineno">12279</span>&#160;<span class="keywordtype">void</span> VmaBlockMetadata_Buddy::Alloc(</div>
+<div class="line"><a name="l12280"></a><span class="lineno">12280</span>&#160;    <span class="keyword">const</span> VmaAllocationRequest&amp; request,</div>
+<div class="line"><a name="l12281"></a><span class="lineno">12281</span>&#160;    VmaSuballocationType type,</div>
+<div class="line"><a name="l12282"></a><span class="lineno">12282</span>&#160;    VkDeviceSize allocSize,</div>
+<div class="line"><a name="l12283"></a><span class="lineno">12283</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> hAllocation)</div>
+<div class="line"><a name="l12284"></a><span class="lineno">12284</span>&#160;{</div>
+<div class="line"><a name="l12285"></a><span class="lineno">12285</span>&#160;    VMA_ASSERT(request.type == VmaAllocationRequestType::Normal);</div>
+<div class="line"><a name="l12286"></a><span class="lineno">12286</span>&#160; </div>
+<div class="line"><a name="l12287"></a><span class="lineno">12287</span>&#160;    <span class="keyword">const</span> uint32_t targetLevel = AllocSizeToLevel(allocSize);</div>
+<div class="line"><a name="l12288"></a><span class="lineno">12288</span>&#160;    uint32_t currLevel = (uint32_t)(uintptr_t)request.customData;</div>
+<div class="line"><a name="l12289"></a><span class="lineno">12289</span>&#160; </div>
+<div class="line"><a name="l12290"></a><span class="lineno">12290</span>&#160;    Node* currNode = m_FreeList[currLevel].front;</div>
+<div class="line"><a name="l12291"></a><span class="lineno">12291</span>&#160;    VMA_ASSERT(currNode != VMA_NULL &amp;&amp; currNode-&gt;type == Node::TYPE_FREE);</div>
+<div class="line"><a name="l12292"></a><span class="lineno">12292</span>&#160;    <span class="keywordflow">while</span>(currNode-&gt;offset != request.offset)</div>
+<div class="line"><a name="l12293"></a><span class="lineno">12293</span>&#160;    {</div>
+<div class="line"><a name="l12294"></a><span class="lineno">12294</span>&#160;        currNode = currNode-&gt;free.next;</div>
+<div class="line"><a name="l12295"></a><span class="lineno">12295</span>&#160;        VMA_ASSERT(currNode != VMA_NULL &amp;&amp; currNode-&gt;type == Node::TYPE_FREE);</div>
+<div class="line"><a name="l12296"></a><span class="lineno">12296</span>&#160;    }</div>
 <div class="line"><a name="l12297"></a><span class="lineno">12297</span>&#160; </div>
-<div class="line"><a name="l12298"></a><span class="lineno">12298</span>&#160;VkResult VmaDeviceMemoryBlock::BindBufferMemory(</div>
-<div class="line"><a name="l12299"></a><span class="lineno">12299</span>&#160;    <span class="keyword">const</span> <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator,</div>
-<div class="line"><a name="l12300"></a><span class="lineno">12300</span>&#160;    <span class="keyword">const</span> <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> hAllocation,</div>
-<div class="line"><a name="l12301"></a><span class="lineno">12301</span>&#160;    VkDeviceSize allocationLocalOffset,</div>
-<div class="line"><a name="l12302"></a><span class="lineno">12302</span>&#160;    VkBuffer hBuffer,</div>
-<div class="line"><a name="l12303"></a><span class="lineno">12303</span>&#160;    <span class="keyword">const</span> <span class="keywordtype">void</span>* pNext)</div>
-<div class="line"><a name="l12304"></a><span class="lineno">12304</span>&#160;{</div>
-<div class="line"><a name="l12305"></a><span class="lineno">12305</span>&#160;    VMA_ASSERT(hAllocation-&gt;GetType() == VmaAllocation_T::ALLOCATION_TYPE_BLOCK &amp;&amp;</div>
-<div class="line"><a name="l12306"></a><span class="lineno">12306</span>&#160;        hAllocation-&gt;GetBlock() == <span class="keyword">this</span>);</div>
-<div class="line"><a name="l12307"></a><span class="lineno">12307</span>&#160;    VMA_ASSERT(allocationLocalOffset &lt; hAllocation-&gt;GetSize() &amp;&amp;</div>
-<div class="line"><a name="l12308"></a><span class="lineno">12308</span>&#160;        <span class="stringliteral">&quot;Invalid allocationLocalOffset. Did you forget that this offset is relative to the beginning of the allocation, not the whole memory block?&quot;</span>);</div>
-<div class="line"><a name="l12309"></a><span class="lineno">12309</span>&#160;    <span class="keyword">const</span> VkDeviceSize memoryOffset = hAllocation-&gt;GetOffset() + allocationLocalOffset;</div>
-<div class="line"><a name="l12310"></a><span class="lineno">12310</span>&#160;    <span class="comment">// This lock is important so that we don&#39;t call vkBind... and/or vkMap... simultaneously on the same VkDeviceMemory from multiple threads.</span></div>
-<div class="line"><a name="l12311"></a><span class="lineno">12311</span>&#160;    VmaMutexLock lock(m_Mutex, hAllocator-&gt;m_UseMutex);</div>
-<div class="line"><a name="l12312"></a><span class="lineno">12312</span>&#160;    <span class="keywordflow">return</span> hAllocator-&gt;BindVulkanBuffer(m_hMemory, memoryOffset, hBuffer, pNext);</div>
-<div class="line"><a name="l12313"></a><span class="lineno">12313</span>&#160;}</div>
-<div class="line"><a name="l12314"></a><span class="lineno">12314</span>&#160; </div>
-<div class="line"><a name="l12315"></a><span class="lineno">12315</span>&#160;VkResult VmaDeviceMemoryBlock::BindImageMemory(</div>
-<div class="line"><a name="l12316"></a><span class="lineno">12316</span>&#160;    <span class="keyword">const</span> <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator,</div>
-<div class="line"><a name="l12317"></a><span class="lineno">12317</span>&#160;    <span class="keyword">const</span> <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> hAllocation,</div>
-<div class="line"><a name="l12318"></a><span class="lineno">12318</span>&#160;    VkDeviceSize allocationLocalOffset,</div>
-<div class="line"><a name="l12319"></a><span class="lineno">12319</span>&#160;    VkImage hImage,</div>
-<div class="line"><a name="l12320"></a><span class="lineno">12320</span>&#160;    <span class="keyword">const</span> <span class="keywordtype">void</span>* pNext)</div>
-<div class="line"><a name="l12321"></a><span class="lineno">12321</span>&#160;{</div>
-<div class="line"><a name="l12322"></a><span class="lineno">12322</span>&#160;    VMA_ASSERT(hAllocation-&gt;GetType() == VmaAllocation_T::ALLOCATION_TYPE_BLOCK &amp;&amp;</div>
-<div class="line"><a name="l12323"></a><span class="lineno">12323</span>&#160;        hAllocation-&gt;GetBlock() == <span class="keyword">this</span>);</div>
-<div class="line"><a name="l12324"></a><span class="lineno">12324</span>&#160;    VMA_ASSERT(allocationLocalOffset &lt; hAllocation-&gt;GetSize() &amp;&amp;</div>
-<div class="line"><a name="l12325"></a><span class="lineno">12325</span>&#160;        <span class="stringliteral">&quot;Invalid allocationLocalOffset. Did you forget that this offset is relative to the beginning of the allocation, not the whole memory block?&quot;</span>);</div>
-<div class="line"><a name="l12326"></a><span class="lineno">12326</span>&#160;    <span class="keyword">const</span> VkDeviceSize memoryOffset = hAllocation-&gt;GetOffset() + allocationLocalOffset;</div>
-<div class="line"><a name="l12327"></a><span class="lineno">12327</span>&#160;    <span class="comment">// This lock is important so that we don&#39;t call vkBind... and/or vkMap... simultaneously on the same VkDeviceMemory from multiple threads.</span></div>
-<div class="line"><a name="l12328"></a><span class="lineno">12328</span>&#160;    VmaMutexLock lock(m_Mutex, hAllocator-&gt;m_UseMutex);</div>
-<div class="line"><a name="l12329"></a><span class="lineno">12329</span>&#160;    <span class="keywordflow">return</span> hAllocator-&gt;BindVulkanImage(m_hMemory, memoryOffset, hImage, pNext);</div>
-<div class="line"><a name="l12330"></a><span class="lineno">12330</span>&#160;}</div>
-<div class="line"><a name="l12331"></a><span class="lineno">12331</span>&#160; </div>
-<div class="line"><a name="l12332"></a><span class="lineno">12332</span>&#160;<span class="keyword">static</span> <span class="keywordtype">void</span> InitStatInfo(<a class="code" href="struct_vma_stat_info.html">VmaStatInfo</a>&amp; outInfo)</div>
-<div class="line"><a name="l12333"></a><span class="lineno">12333</span>&#160;{</div>
-<div class="line"><a name="l12334"></a><span class="lineno">12334</span>&#160;    memset(&amp;outInfo, 0, <span class="keyword">sizeof</span>(outInfo));</div>
-<div class="line"><a name="l12335"></a><span class="lineno">12335</span>&#160;    outInfo.<a class="code" href="struct_vma_stat_info.html#ade8b40bd3139c04aabd2fc538a356fea">allocationSizeMin</a> = UINT64_MAX;</div>
-<div class="line"><a name="l12336"></a><span class="lineno">12336</span>&#160;    outInfo.<a class="code" href="struct_vma_stat_info.html#aedeba931324f16589cd2416c0d2dd0d4">unusedRangeSizeMin</a> = UINT64_MAX;</div>
-<div class="line"><a name="l12337"></a><span class="lineno">12337</span>&#160;}</div>
-<div class="line"><a name="l12338"></a><span class="lineno">12338</span>&#160; </div>
-<div class="line"><a name="l12339"></a><span class="lineno">12339</span>&#160;<span class="comment">// Adds statistics srcInfo into inoutInfo, like: inoutInfo += srcInfo.</span></div>
-<div class="line"><a name="l12340"></a><span class="lineno">12340</span>&#160;<span class="keyword">static</span> <span class="keywordtype">void</span> VmaAddStatInfo(<a class="code" href="struct_vma_stat_info.html">VmaStatInfo</a>&amp; inoutInfo, <span class="keyword">const</span> <a class="code" href="struct_vma_stat_info.html">VmaStatInfo</a>&amp; srcInfo)</div>
-<div class="line"><a name="l12341"></a><span class="lineno">12341</span>&#160;{</div>
-<div class="line"><a name="l12342"></a><span class="lineno">12342</span>&#160;    inoutInfo.<a class="code" href="struct_vma_stat_info.html#abc4bb7cd611900778464c56e50c970a4">blockCount</a> += srcInfo.<a class="code" href="struct_vma_stat_info.html#abc4bb7cd611900778464c56e50c970a4">blockCount</a>;</div>
-<div class="line"><a name="l12343"></a><span class="lineno">12343</span>&#160;    inoutInfo.<a class="code" href="struct_vma_stat_info.html#a537741e4d5cdddc1c0ab95ec650afaff">allocationCount</a> += srcInfo.<a class="code" href="struct_vma_stat_info.html#a537741e4d5cdddc1c0ab95ec650afaff">allocationCount</a>;</div>
-<div class="line"><a name="l12344"></a><span class="lineno">12344</span>&#160;    inoutInfo.<a class="code" href="struct_vma_stat_info.html#ae06129c771bfebfd6468a7f4276502a9">unusedRangeCount</a> += srcInfo.<a class="code" href="struct_vma_stat_info.html#ae06129c771bfebfd6468a7f4276502a9">unusedRangeCount</a>;</div>
-<div class="line"><a name="l12345"></a><span class="lineno">12345</span>&#160;    inoutInfo.<a class="code" href="struct_vma_stat_info.html#ab0c6c73837e5a70c749fbd4f6064895a">usedBytes</a> += srcInfo.<a class="code" href="struct_vma_stat_info.html#ab0c6c73837e5a70c749fbd4f6064895a">usedBytes</a>;</div>
-<div class="line"><a name="l12346"></a><span class="lineno">12346</span>&#160;    inoutInfo.<a class="code" href="struct_vma_stat_info.html#a1859d290aca2cd582d8dc25922092669">unusedBytes</a> += srcInfo.<a class="code" href="struct_vma_stat_info.html#a1859d290aca2cd582d8dc25922092669">unusedBytes</a>;</div>
-<div class="line"><a name="l12347"></a><span class="lineno">12347</span>&#160;    inoutInfo.<a class="code" href="struct_vma_stat_info.html#ade8b40bd3139c04aabd2fc538a356fea">allocationSizeMin</a> = VMA_MIN(inoutInfo.<a class="code" href="struct_vma_stat_info.html#ade8b40bd3139c04aabd2fc538a356fea">allocationSizeMin</a>, srcInfo.<a class="code" href="struct_vma_stat_info.html#ade8b40bd3139c04aabd2fc538a356fea">allocationSizeMin</a>);</div>
-<div class="line"><a name="l12348"></a><span class="lineno">12348</span>&#160;    inoutInfo.<a class="code" href="struct_vma_stat_info.html#a17e9733a5ecd76287d4db6e66f71f50c">allocationSizeMax</a> = VMA_MAX(inoutInfo.<a class="code" href="struct_vma_stat_info.html#a17e9733a5ecd76287d4db6e66f71f50c">allocationSizeMax</a>, srcInfo.<a class="code" href="struct_vma_stat_info.html#a17e9733a5ecd76287d4db6e66f71f50c">allocationSizeMax</a>);</div>
-<div class="line"><a name="l12349"></a><span class="lineno">12349</span>&#160;    inoutInfo.<a class="code" href="struct_vma_stat_info.html#aedeba931324f16589cd2416c0d2dd0d4">unusedRangeSizeMin</a> = VMA_MIN(inoutInfo.<a class="code" href="struct_vma_stat_info.html#aedeba931324f16589cd2416c0d2dd0d4">unusedRangeSizeMin</a>, srcInfo.<a class="code" href="struct_vma_stat_info.html#aedeba931324f16589cd2416c0d2dd0d4">unusedRangeSizeMin</a>);</div>
-<div class="line"><a name="l12350"></a><span class="lineno">12350</span>&#160;    inoutInfo.<a class="code" href="struct_vma_stat_info.html#a5ba1a2476c4d39b10f7e2f7ebbb72ac4">unusedRangeSizeMax</a> = VMA_MAX(inoutInfo.<a class="code" href="struct_vma_stat_info.html#a5ba1a2476c4d39b10f7e2f7ebbb72ac4">unusedRangeSizeMax</a>, srcInfo.<a class="code" href="struct_vma_stat_info.html#a5ba1a2476c4d39b10f7e2f7ebbb72ac4">unusedRangeSizeMax</a>);</div>
-<div class="line"><a name="l12351"></a><span class="lineno">12351</span>&#160;}</div>
-<div class="line"><a name="l12352"></a><span class="lineno">12352</span>&#160; </div>
-<div class="line"><a name="l12353"></a><span class="lineno">12353</span>&#160;<span class="keyword">static</span> <span class="keywordtype">void</span> VmaPostprocessCalcStatInfo(<a class="code" href="struct_vma_stat_info.html">VmaStatInfo</a>&amp; inoutInfo)</div>
-<div class="line"><a name="l12354"></a><span class="lineno">12354</span>&#160;{</div>
-<div class="line"><a name="l12355"></a><span class="lineno">12355</span>&#160;    inoutInfo.<a class="code" href="struct_vma_stat_info.html#a1081a039964e566c672e7a2347f9e599">allocationSizeAvg</a> = (inoutInfo.<a class="code" href="struct_vma_stat_info.html#a537741e4d5cdddc1c0ab95ec650afaff">allocationCount</a> &gt; 0) ?</div>
-<div class="line"><a name="l12356"></a><span class="lineno">12356</span>&#160;        VmaRoundDiv&lt;VkDeviceSize&gt;(inoutInfo.<a class="code" href="struct_vma_stat_info.html#ab0c6c73837e5a70c749fbd4f6064895a">usedBytes</a>, inoutInfo.<a class="code" href="struct_vma_stat_info.html#a537741e4d5cdddc1c0ab95ec650afaff">allocationCount</a>) : 0;</div>
-<div class="line"><a name="l12357"></a><span class="lineno">12357</span>&#160;    inoutInfo.<a class="code" href="struct_vma_stat_info.html#a2f9b3452af90c9768a30b7fb6ae194fc">unusedRangeSizeAvg</a> = (inoutInfo.<a class="code" href="struct_vma_stat_info.html#ae06129c771bfebfd6468a7f4276502a9">unusedRangeCount</a> &gt; 0) ?</div>
-<div class="line"><a name="l12358"></a><span class="lineno">12358</span>&#160;        VmaRoundDiv&lt;VkDeviceSize&gt;(inoutInfo.<a class="code" href="struct_vma_stat_info.html#a1859d290aca2cd582d8dc25922092669">unusedBytes</a>, inoutInfo.<a class="code" href="struct_vma_stat_info.html#ae06129c771bfebfd6468a7f4276502a9">unusedRangeCount</a>) : 0;</div>
-<div class="line"><a name="l12359"></a><span class="lineno">12359</span>&#160;}</div>
-<div class="line"><a name="l12360"></a><span class="lineno">12360</span>&#160; </div>
-<div class="line"><a name="l12361"></a><span class="lineno">12361</span>&#160;VmaPool_T::VmaPool_T(</div>
-<div class="line"><a name="l12362"></a><span class="lineno">12362</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator,</div>
-<div class="line"><a name="l12363"></a><span class="lineno">12363</span>&#160;    <span class="keyword">const</span> <a class="code" href="struct_vma_pool_create_info.html">VmaPoolCreateInfo</a>&amp; createInfo,</div>
-<div class="line"><a name="l12364"></a><span class="lineno">12364</span>&#160;    VkDeviceSize preferredBlockSize) :</div>
-<div class="line"><a name="l12365"></a><span class="lineno">12365</span>&#160;    m_BlockVector(</div>
-<div class="line"><a name="l12366"></a><span class="lineno">12366</span>&#160;        hAllocator,</div>
-<div class="line"><a name="l12367"></a><span class="lineno">12367</span>&#160;        this, <span class="comment">// hParentPool</span></div>
-<div class="line"><a name="l12368"></a><span class="lineno">12368</span>&#160;        createInfo.memoryTypeIndex,</div>
-<div class="line"><a name="l12369"></a><span class="lineno">12369</span>&#160;        createInfo.blockSize != 0 ? createInfo.blockSize : preferredBlockSize,</div>
-<div class="line"><a name="l12370"></a><span class="lineno">12370</span>&#160;        createInfo.minBlockCount,</div>
-<div class="line"><a name="l12371"></a><span class="lineno">12371</span>&#160;        createInfo.maxBlockCount,</div>
-<div class="line"><a name="l12372"></a><span class="lineno">12372</span>&#160;        (createInfo.flags &amp; <a class="code" href="vk__mem__alloc_8h.html#a9a7c45f9c863695d98c83fa5ac940fe7a9f1a499508a8edb4e8ba40aa0290a3d2">VMA_POOL_CREATE_IGNORE_BUFFER_IMAGE_GRANULARITY_BIT</a>) != 0 ? 1 : hAllocator-&gt;GetBufferImageGranularity(),</div>
-<div class="line"><a name="l12373"></a><span class="lineno">12373</span>&#160;        createInfo.frameInUseCount,</div>
-<div class="line"><a name="l12374"></a><span class="lineno">12374</span>&#160;        createInfo.blockSize != 0, <span class="comment">// explicitBlockSize</span></div>
-<div class="line"><a name="l12375"></a><span class="lineno">12375</span>&#160;        createInfo.flags &amp; <a class="code" href="vk__mem__alloc_8h.html#a9a7c45f9c863695d98c83fa5ac940fe7af4d270f8f42517a0f70037ceb6ac1d9c">VMA_POOL_CREATE_ALGORITHM_MASK</a>), <span class="comment">// algorithm</span></div>
-<div class="line"><a name="l12376"></a><span class="lineno">12376</span>&#160;    m_Id(0),</div>
-<div class="line"><a name="l12377"></a><span class="lineno">12377</span>&#160;    m_Name(VMA_NULL)</div>
-<div class="line"><a name="l12378"></a><span class="lineno">12378</span>&#160;{</div>
-<div class="line"><a name="l12379"></a><span class="lineno">12379</span>&#160;}</div>
-<div class="line"><a name="l12380"></a><span class="lineno">12380</span>&#160; </div>
-<div class="line"><a name="l12381"></a><span class="lineno">12381</span>&#160;VmaPool_T::~VmaPool_T()</div>
-<div class="line"><a name="l12382"></a><span class="lineno">12382</span>&#160;{</div>
-<div class="line"><a name="l12383"></a><span class="lineno">12383</span>&#160;}</div>
-<div class="line"><a name="l12384"></a><span class="lineno">12384</span>&#160; </div>
-<div class="line"><a name="l12385"></a><span class="lineno">12385</span>&#160;<span class="keywordtype">void</span> VmaPool_T::SetName(<span class="keyword">const</span> <span class="keywordtype">char</span>* pName)</div>
-<div class="line"><a name="l12386"></a><span class="lineno">12386</span>&#160;{</div>
-<div class="line"><a name="l12387"></a><span class="lineno">12387</span>&#160;    <span class="keyword">const</span> VkAllocationCallbacks* allocs = m_BlockVector.GetAllocator()-&gt;GetAllocationCallbacks();</div>
-<div class="line"><a name="l12388"></a><span class="lineno">12388</span>&#160;    VmaFreeString(allocs, m_Name);</div>
-<div class="line"><a name="l12389"></a><span class="lineno">12389</span>&#160;    </div>
-<div class="line"><a name="l12390"></a><span class="lineno">12390</span>&#160;    <span class="keywordflow">if</span>(pName != VMA_NULL)</div>
-<div class="line"><a name="l12391"></a><span class="lineno">12391</span>&#160;    {</div>
-<div class="line"><a name="l12392"></a><span class="lineno">12392</span>&#160;        m_Name = VmaCreateStringCopy(allocs, pName);</div>
-<div class="line"><a name="l12393"></a><span class="lineno">12393</span>&#160;    }</div>
-<div class="line"><a name="l12394"></a><span class="lineno">12394</span>&#160;    <span class="keywordflow">else</span></div>
-<div class="line"><a name="l12395"></a><span class="lineno">12395</span>&#160;    {</div>
-<div class="line"><a name="l12396"></a><span class="lineno">12396</span>&#160;        m_Name = VMA_NULL;</div>
-<div class="line"><a name="l12397"></a><span class="lineno">12397</span>&#160;    }</div>
-<div class="line"><a name="l12398"></a><span class="lineno">12398</span>&#160;}</div>
-<div class="line"><a name="l12399"></a><span class="lineno">12399</span>&#160; </div>
-<div class="line"><a name="l12400"></a><span class="lineno">12400</span>&#160;<span class="preprocessor">#if VMA_STATS_STRING_ENABLED</span></div>
-<div class="line"><a name="l12401"></a><span class="lineno">12401</span>&#160; </div>
-<div class="line"><a name="l12402"></a><span class="lineno">12402</span>&#160;<span class="preprocessor">#endif // #if VMA_STATS_STRING_ENABLED</span></div>
-<div class="line"><a name="l12403"></a><span class="lineno">12403</span>&#160; </div>
-<div class="line"><a name="l12404"></a><span class="lineno">12404</span>&#160;VmaBlockVector::VmaBlockVector(</div>
-<div class="line"><a name="l12405"></a><span class="lineno">12405</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator,</div>
-<div class="line"><a name="l12406"></a><span class="lineno">12406</span>&#160;    <a class="code" href="struct_vma_pool.html">VmaPool</a> hParentPool,</div>
-<div class="line"><a name="l12407"></a><span class="lineno">12407</span>&#160;    uint32_t memoryTypeIndex,</div>
-<div class="line"><a name="l12408"></a><span class="lineno">12408</span>&#160;    VkDeviceSize preferredBlockSize,</div>
-<div class="line"><a name="l12409"></a><span class="lineno">12409</span>&#160;    <span class="keywordtype">size_t</span> minBlockCount,</div>
-<div class="line"><a name="l12410"></a><span class="lineno">12410</span>&#160;    <span class="keywordtype">size_t</span> maxBlockCount,</div>
-<div class="line"><a name="l12411"></a><span class="lineno">12411</span>&#160;    VkDeviceSize bufferImageGranularity,</div>
-<div class="line"><a name="l12412"></a><span class="lineno">12412</span>&#160;    uint32_t frameInUseCount,</div>
-<div class="line"><a name="l12413"></a><span class="lineno">12413</span>&#160;    <span class="keywordtype">bool</span> explicitBlockSize,</div>
-<div class="line"><a name="l12414"></a><span class="lineno">12414</span>&#160;    uint32_t algorithm) :</div>
-<div class="line"><a name="l12415"></a><span class="lineno">12415</span>&#160;    m_hAllocator(hAllocator),</div>
-<div class="line"><a name="l12416"></a><span class="lineno">12416</span>&#160;    m_hParentPool(hParentPool),</div>
-<div class="line"><a name="l12417"></a><span class="lineno">12417</span>&#160;    m_MemoryTypeIndex(memoryTypeIndex),</div>
-<div class="line"><a name="l12418"></a><span class="lineno">12418</span>&#160;    m_PreferredBlockSize(preferredBlockSize),</div>
-<div class="line"><a name="l12419"></a><span class="lineno">12419</span>&#160;    m_MinBlockCount(minBlockCount),</div>
-<div class="line"><a name="l12420"></a><span class="lineno">12420</span>&#160;    m_MaxBlockCount(maxBlockCount),</div>
-<div class="line"><a name="l12421"></a><span class="lineno">12421</span>&#160;    m_BufferImageGranularity(bufferImageGranularity),</div>
-<div class="line"><a name="l12422"></a><span class="lineno">12422</span>&#160;    m_FrameInUseCount(frameInUseCount),</div>
-<div class="line"><a name="l12423"></a><span class="lineno">12423</span>&#160;    m_ExplicitBlockSize(explicitBlockSize),</div>
-<div class="line"><a name="l12424"></a><span class="lineno">12424</span>&#160;    m_Algorithm(algorithm),</div>
-<div class="line"><a name="l12425"></a><span class="lineno">12425</span>&#160;    m_HasEmptyBlock(false),</div>
-<div class="line"><a name="l12426"></a><span class="lineno">12426</span>&#160;    m_Blocks(VmaStlAllocator&lt;VmaDeviceMemoryBlock*&gt;(hAllocator-&gt;GetAllocationCallbacks())),</div>
-<div class="line"><a name="l12427"></a><span class="lineno">12427</span>&#160;    m_NextBlockId(0)</div>
-<div class="line"><a name="l12428"></a><span class="lineno">12428</span>&#160;{</div>
-<div class="line"><a name="l12429"></a><span class="lineno">12429</span>&#160;}</div>
-<div class="line"><a name="l12430"></a><span class="lineno">12430</span>&#160; </div>
-<div class="line"><a name="l12431"></a><span class="lineno">12431</span>&#160;VmaBlockVector::~VmaBlockVector()</div>
-<div class="line"><a name="l12432"></a><span class="lineno">12432</span>&#160;{</div>
-<div class="line"><a name="l12433"></a><span class="lineno">12433</span>&#160;    <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> i = m_Blocks.size(); i--; )</div>
-<div class="line"><a name="l12434"></a><span class="lineno">12434</span>&#160;    {</div>
-<div class="line"><a name="l12435"></a><span class="lineno">12435</span>&#160;        m_Blocks[i]-&gt;Destroy(m_hAllocator);</div>
-<div class="line"><a name="l12436"></a><span class="lineno">12436</span>&#160;        vma_delete(m_hAllocator, m_Blocks[i]);</div>
-<div class="line"><a name="l12437"></a><span class="lineno">12437</span>&#160;    }</div>
-<div class="line"><a name="l12438"></a><span class="lineno">12438</span>&#160;}</div>
-<div class="line"><a name="l12439"></a><span class="lineno">12439</span>&#160; </div>
-<div class="line"><a name="l12440"></a><span class="lineno">12440</span>&#160;VkResult VmaBlockVector::CreateMinBlocks()</div>
-<div class="line"><a name="l12441"></a><span class="lineno">12441</span>&#160;{</div>
-<div class="line"><a name="l12442"></a><span class="lineno">12442</span>&#160;    <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> i = 0; i &lt; m_MinBlockCount; ++i)</div>
-<div class="line"><a name="l12443"></a><span class="lineno">12443</span>&#160;    {</div>
-<div class="line"><a name="l12444"></a><span class="lineno">12444</span>&#160;        VkResult res = CreateBlock(m_PreferredBlockSize, VMA_NULL);</div>
-<div class="line"><a name="l12445"></a><span class="lineno">12445</span>&#160;        <span class="keywordflow">if</span>(res != VK_SUCCESS)</div>
-<div class="line"><a name="l12446"></a><span class="lineno">12446</span>&#160;        {</div>
-<div class="line"><a name="l12447"></a><span class="lineno">12447</span>&#160;            <span class="keywordflow">return</span> res;</div>
-<div class="line"><a name="l12448"></a><span class="lineno">12448</span>&#160;        }</div>
-<div class="line"><a name="l12449"></a><span class="lineno">12449</span>&#160;    }</div>
-<div class="line"><a name="l12450"></a><span class="lineno">12450</span>&#160;    <span class="keywordflow">return</span> VK_SUCCESS;</div>
-<div class="line"><a name="l12451"></a><span class="lineno">12451</span>&#160;}</div>
-<div class="line"><a name="l12452"></a><span class="lineno">12452</span>&#160; </div>
-<div class="line"><a name="l12453"></a><span class="lineno">12453</span>&#160;<span class="keywordtype">void</span> VmaBlockVector::GetPoolStats(<a class="code" href="struct_vma_pool_stats.html">VmaPoolStats</a>* pStats)</div>
-<div class="line"><a name="l12454"></a><span class="lineno">12454</span>&#160;{</div>
-<div class="line"><a name="l12455"></a><span class="lineno">12455</span>&#160;    VmaMutexLockRead lock(m_Mutex, m_hAllocator-&gt;m_UseMutex);</div>
+<div class="line"><a name="l12298"></a><span class="lineno">12298</span>&#160;    <span class="comment">// Go down, splitting free nodes.</span></div>
+<div class="line"><a name="l12299"></a><span class="lineno">12299</span>&#160;    <span class="keywordflow">while</span>(currLevel &lt; targetLevel)</div>
+<div class="line"><a name="l12300"></a><span class="lineno">12300</span>&#160;    {</div>
+<div class="line"><a name="l12301"></a><span class="lineno">12301</span>&#160;        <span class="comment">// currNode is already first free node at currLevel.</span></div>
+<div class="line"><a name="l12302"></a><span class="lineno">12302</span>&#160;        <span class="comment">// Remove it from list of free nodes at this currLevel.</span></div>
+<div class="line"><a name="l12303"></a><span class="lineno">12303</span>&#160;        RemoveFromFreeList(currLevel, currNode);</div>
+<div class="line"><a name="l12304"></a><span class="lineno">12304</span>&#160; </div>
+<div class="line"><a name="l12305"></a><span class="lineno">12305</span>&#160;        <span class="keyword">const</span> uint32_t childrenLevel = currLevel + 1;</div>
+<div class="line"><a name="l12306"></a><span class="lineno">12306</span>&#160; </div>
+<div class="line"><a name="l12307"></a><span class="lineno">12307</span>&#160;        <span class="comment">// Create two free sub-nodes.</span></div>
+<div class="line"><a name="l12308"></a><span class="lineno">12308</span>&#160;        Node* leftChild = vma_new(GetAllocationCallbacks(), Node)();</div>
+<div class="line"><a name="l12309"></a><span class="lineno">12309</span>&#160;        Node* rightChild = vma_new(GetAllocationCallbacks(), Node)();</div>
+<div class="line"><a name="l12310"></a><span class="lineno">12310</span>&#160; </div>
+<div class="line"><a name="l12311"></a><span class="lineno">12311</span>&#160;        leftChild-&gt;offset = currNode-&gt;offset;</div>
+<div class="line"><a name="l12312"></a><span class="lineno">12312</span>&#160;        leftChild-&gt;type = Node::TYPE_FREE;</div>
+<div class="line"><a name="l12313"></a><span class="lineno">12313</span>&#160;        leftChild-&gt;parent = currNode;</div>
+<div class="line"><a name="l12314"></a><span class="lineno">12314</span>&#160;        leftChild-&gt;buddy = rightChild;</div>
+<div class="line"><a name="l12315"></a><span class="lineno">12315</span>&#160; </div>
+<div class="line"><a name="l12316"></a><span class="lineno">12316</span>&#160;        rightChild-&gt;offset = currNode-&gt;offset + LevelToNodeSize(childrenLevel);</div>
+<div class="line"><a name="l12317"></a><span class="lineno">12317</span>&#160;        rightChild-&gt;type = Node::TYPE_FREE;</div>
+<div class="line"><a name="l12318"></a><span class="lineno">12318</span>&#160;        rightChild-&gt;parent = currNode;</div>
+<div class="line"><a name="l12319"></a><span class="lineno">12319</span>&#160;        rightChild-&gt;buddy = leftChild;</div>
+<div class="line"><a name="l12320"></a><span class="lineno">12320</span>&#160; </div>
+<div class="line"><a name="l12321"></a><span class="lineno">12321</span>&#160;        <span class="comment">// Convert current currNode to split type.</span></div>
+<div class="line"><a name="l12322"></a><span class="lineno">12322</span>&#160;        currNode-&gt;type = Node::TYPE_SPLIT;</div>
+<div class="line"><a name="l12323"></a><span class="lineno">12323</span>&#160;        currNode-&gt;split.leftChild = leftChild;</div>
+<div class="line"><a name="l12324"></a><span class="lineno">12324</span>&#160; </div>
+<div class="line"><a name="l12325"></a><span class="lineno">12325</span>&#160;        <span class="comment">// Add child nodes to free list. Order is important!</span></div>
+<div class="line"><a name="l12326"></a><span class="lineno">12326</span>&#160;        AddToFreeListFront(childrenLevel, rightChild);</div>
+<div class="line"><a name="l12327"></a><span class="lineno">12327</span>&#160;        AddToFreeListFront(childrenLevel, leftChild);</div>
+<div class="line"><a name="l12328"></a><span class="lineno">12328</span>&#160; </div>
+<div class="line"><a name="l12329"></a><span class="lineno">12329</span>&#160;        ++m_FreeCount;</div>
+<div class="line"><a name="l12330"></a><span class="lineno">12330</span>&#160;        <span class="comment">//m_SumFreeSize -= LevelToNodeSize(currLevel) % 2; // Useful only when level node sizes can be non power of 2.</span></div>
+<div class="line"><a name="l12331"></a><span class="lineno">12331</span>&#160;        ++currLevel;</div>
+<div class="line"><a name="l12332"></a><span class="lineno">12332</span>&#160;        currNode = m_FreeList[currLevel].front;</div>
+<div class="line"><a name="l12333"></a><span class="lineno">12333</span>&#160; </div>
+<div class="line"><a name="l12334"></a><span class="lineno">12334</span>&#160;        <span class="comment">/*</span></div>
+<div class="line"><a name="l12335"></a><span class="lineno">12335</span>&#160;<span class="comment">        We can be sure that currNode, as left child of node previously split,</span></div>
+<div class="line"><a name="l12336"></a><span class="lineno">12336</span>&#160;<span class="comment">        also fullfills the alignment requirement.</span></div>
+<div class="line"><a name="l12337"></a><span class="lineno">12337</span>&#160;<span class="comment">        */</span></div>
+<div class="line"><a name="l12338"></a><span class="lineno">12338</span>&#160;    }</div>
+<div class="line"><a name="l12339"></a><span class="lineno">12339</span>&#160; </div>
+<div class="line"><a name="l12340"></a><span class="lineno">12340</span>&#160;    <span class="comment">// Remove from free list.</span></div>
+<div class="line"><a name="l12341"></a><span class="lineno">12341</span>&#160;    VMA_ASSERT(currLevel == targetLevel &amp;&amp;</div>
+<div class="line"><a name="l12342"></a><span class="lineno">12342</span>&#160;        currNode != VMA_NULL &amp;&amp;</div>
+<div class="line"><a name="l12343"></a><span class="lineno">12343</span>&#160;        currNode-&gt;type == Node::TYPE_FREE);</div>
+<div class="line"><a name="l12344"></a><span class="lineno">12344</span>&#160;    RemoveFromFreeList(currLevel, currNode);</div>
+<div class="line"><a name="l12345"></a><span class="lineno">12345</span>&#160; </div>
+<div class="line"><a name="l12346"></a><span class="lineno">12346</span>&#160;    <span class="comment">// Convert to allocation node.</span></div>
+<div class="line"><a name="l12347"></a><span class="lineno">12347</span>&#160;    currNode-&gt;type = Node::TYPE_ALLOCATION;</div>
+<div class="line"><a name="l12348"></a><span class="lineno">12348</span>&#160;    currNode-&gt;allocation.alloc = hAllocation;</div>
+<div class="line"><a name="l12349"></a><span class="lineno">12349</span>&#160; </div>
+<div class="line"><a name="l12350"></a><span class="lineno">12350</span>&#160;    ++m_AllocationCount;</div>
+<div class="line"><a name="l12351"></a><span class="lineno">12351</span>&#160;    --m_FreeCount;</div>
+<div class="line"><a name="l12352"></a><span class="lineno">12352</span>&#160;    m_SumFreeSize -= allocSize;</div>
+<div class="line"><a name="l12353"></a><span class="lineno">12353</span>&#160;}</div>
+<div class="line"><a name="l12354"></a><span class="lineno">12354</span>&#160; </div>
+<div class="line"><a name="l12355"></a><span class="lineno">12355</span>&#160;<span class="keywordtype">void</span> VmaBlockMetadata_Buddy::DeleteNode(Node* node)</div>
+<div class="line"><a name="l12356"></a><span class="lineno">12356</span>&#160;{</div>
+<div class="line"><a name="l12357"></a><span class="lineno">12357</span>&#160;    <span class="keywordflow">if</span>(node-&gt;type == Node::TYPE_SPLIT)</div>
+<div class="line"><a name="l12358"></a><span class="lineno">12358</span>&#160;    {</div>
+<div class="line"><a name="l12359"></a><span class="lineno">12359</span>&#160;        DeleteNode(node-&gt;split.leftChild-&gt;buddy);</div>
+<div class="line"><a name="l12360"></a><span class="lineno">12360</span>&#160;        DeleteNode(node-&gt;split.leftChild);</div>
+<div class="line"><a name="l12361"></a><span class="lineno">12361</span>&#160;    }</div>
+<div class="line"><a name="l12362"></a><span class="lineno">12362</span>&#160; </div>
+<div class="line"><a name="l12363"></a><span class="lineno">12363</span>&#160;    vma_delete(GetAllocationCallbacks(), node);</div>
+<div class="line"><a name="l12364"></a><span class="lineno">12364</span>&#160;}</div>
+<div class="line"><a name="l12365"></a><span class="lineno">12365</span>&#160; </div>
+<div class="line"><a name="l12366"></a><span class="lineno">12366</span>&#160;<span class="keywordtype">bool</span> VmaBlockMetadata_Buddy::ValidateNode(ValidationContext&amp; ctx, <span class="keyword">const</span> Node* parent, <span class="keyword">const</span> Node* curr, uint32_t level, VkDeviceSize levelNodeSize)<span class="keyword"> const</span></div>
+<div class="line"><a name="l12367"></a><span class="lineno">12367</span>&#160;<span class="keyword"></span>{</div>
+<div class="line"><a name="l12368"></a><span class="lineno">12368</span>&#160;    VMA_VALIDATE(level &lt; m_LevelCount);</div>
+<div class="line"><a name="l12369"></a><span class="lineno">12369</span>&#160;    VMA_VALIDATE(curr-&gt;parent == parent);</div>
+<div class="line"><a name="l12370"></a><span class="lineno">12370</span>&#160;    VMA_VALIDATE((curr-&gt;buddy == VMA_NULL) == (parent == VMA_NULL));</div>
+<div class="line"><a name="l12371"></a><span class="lineno">12371</span>&#160;    VMA_VALIDATE(curr-&gt;buddy == VMA_NULL || curr-&gt;buddy-&gt;buddy == curr);</div>
+<div class="line"><a name="l12372"></a><span class="lineno">12372</span>&#160;    <span class="keywordflow">switch</span>(curr-&gt;type)</div>
+<div class="line"><a name="l12373"></a><span class="lineno">12373</span>&#160;    {</div>
+<div class="line"><a name="l12374"></a><span class="lineno">12374</span>&#160;    <span class="keywordflow">case</span> Node::TYPE_FREE:</div>
+<div class="line"><a name="l12375"></a><span class="lineno">12375</span>&#160;        <span class="comment">// curr-&gt;free.prev, next are validated separately.</span></div>
+<div class="line"><a name="l12376"></a><span class="lineno">12376</span>&#160;        ctx.calculatedSumFreeSize += levelNodeSize;</div>
+<div class="line"><a name="l12377"></a><span class="lineno">12377</span>&#160;        ++ctx.calculatedFreeCount;</div>
+<div class="line"><a name="l12378"></a><span class="lineno">12378</span>&#160;        <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l12379"></a><span class="lineno">12379</span>&#160;    <span class="keywordflow">case</span> Node::TYPE_ALLOCATION:</div>
+<div class="line"><a name="l12380"></a><span class="lineno">12380</span>&#160;        ++ctx.calculatedAllocationCount;</div>
+<div class="line"><a name="l12381"></a><span class="lineno">12381</span>&#160;        ctx.calculatedSumFreeSize += levelNodeSize - curr-&gt;allocation.alloc-&gt;GetSize();</div>
+<div class="line"><a name="l12382"></a><span class="lineno">12382</span>&#160;        VMA_VALIDATE(curr-&gt;allocation.alloc != VK_NULL_HANDLE);</div>
+<div class="line"><a name="l12383"></a><span class="lineno">12383</span>&#160;        <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l12384"></a><span class="lineno">12384</span>&#160;    <span class="keywordflow">case</span> Node::TYPE_SPLIT:</div>
+<div class="line"><a name="l12385"></a><span class="lineno">12385</span>&#160;        {</div>
+<div class="line"><a name="l12386"></a><span class="lineno">12386</span>&#160;            <span class="keyword">const</span> uint32_t childrenLevel = level + 1;</div>
+<div class="line"><a name="l12387"></a><span class="lineno">12387</span>&#160;            <span class="keyword">const</span> VkDeviceSize childrenLevelNodeSize = levelNodeSize / 2;</div>
+<div class="line"><a name="l12388"></a><span class="lineno">12388</span>&#160;            <span class="keyword">const</span> Node* <span class="keyword">const</span> leftChild = curr-&gt;split.leftChild;</div>
+<div class="line"><a name="l12389"></a><span class="lineno">12389</span>&#160;            VMA_VALIDATE(leftChild != VMA_NULL);</div>
+<div class="line"><a name="l12390"></a><span class="lineno">12390</span>&#160;            VMA_VALIDATE(leftChild-&gt;offset == curr-&gt;offset);</div>
+<div class="line"><a name="l12391"></a><span class="lineno">12391</span>&#160;            <span class="keywordflow">if</span>(!ValidateNode(ctx, curr, leftChild, childrenLevel, childrenLevelNodeSize))</div>
+<div class="line"><a name="l12392"></a><span class="lineno">12392</span>&#160;            {</div>
+<div class="line"><a name="l12393"></a><span class="lineno">12393</span>&#160;                VMA_VALIDATE(<span class="keyword">false</span> &amp;&amp; <span class="stringliteral">&quot;ValidateNode for left child failed.&quot;</span>);</div>
+<div class="line"><a name="l12394"></a><span class="lineno">12394</span>&#160;            }</div>
+<div class="line"><a name="l12395"></a><span class="lineno">12395</span>&#160;            <span class="keyword">const</span> Node* <span class="keyword">const</span> rightChild = leftChild-&gt;buddy;</div>
+<div class="line"><a name="l12396"></a><span class="lineno">12396</span>&#160;            VMA_VALIDATE(rightChild-&gt;offset == curr-&gt;offset + childrenLevelNodeSize);</div>
+<div class="line"><a name="l12397"></a><span class="lineno">12397</span>&#160;            <span class="keywordflow">if</span>(!ValidateNode(ctx, curr, rightChild, childrenLevel, childrenLevelNodeSize))</div>
+<div class="line"><a name="l12398"></a><span class="lineno">12398</span>&#160;            {</div>
+<div class="line"><a name="l12399"></a><span class="lineno">12399</span>&#160;                VMA_VALIDATE(<span class="keyword">false</span> &amp;&amp; <span class="stringliteral">&quot;ValidateNode for right child failed.&quot;</span>);</div>
+<div class="line"><a name="l12400"></a><span class="lineno">12400</span>&#160;            }</div>
+<div class="line"><a name="l12401"></a><span class="lineno">12401</span>&#160;        }</div>
+<div class="line"><a name="l12402"></a><span class="lineno">12402</span>&#160;        <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l12403"></a><span class="lineno">12403</span>&#160;    <span class="keywordflow">default</span>:</div>
+<div class="line"><a name="l12404"></a><span class="lineno">12404</span>&#160;        <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
+<div class="line"><a name="l12405"></a><span class="lineno">12405</span>&#160;    }</div>
+<div class="line"><a name="l12406"></a><span class="lineno">12406</span>&#160; </div>
+<div class="line"><a name="l12407"></a><span class="lineno">12407</span>&#160;    <span class="keywordflow">return</span> <span class="keyword">true</span>;</div>
+<div class="line"><a name="l12408"></a><span class="lineno">12408</span>&#160;}</div>
+<div class="line"><a name="l12409"></a><span class="lineno">12409</span>&#160; </div>
+<div class="line"><a name="l12410"></a><span class="lineno">12410</span>&#160;uint32_t VmaBlockMetadata_Buddy::AllocSizeToLevel(VkDeviceSize allocSize)<span class="keyword"> const</span></div>
+<div class="line"><a name="l12411"></a><span class="lineno">12411</span>&#160;<span class="keyword"></span>{</div>
+<div class="line"><a name="l12412"></a><span class="lineno">12412</span>&#160;    <span class="comment">// I know this could be optimized somehow e.g. by using std::log2p1 from C++20.</span></div>
+<div class="line"><a name="l12413"></a><span class="lineno">12413</span>&#160;    uint32_t level = 0;</div>
+<div class="line"><a name="l12414"></a><span class="lineno">12414</span>&#160;    VkDeviceSize currLevelNodeSize = m_UsableSize;</div>
+<div class="line"><a name="l12415"></a><span class="lineno">12415</span>&#160;    VkDeviceSize nextLevelNodeSize = currLevelNodeSize &gt;&gt; 1;</div>
+<div class="line"><a name="l12416"></a><span class="lineno">12416</span>&#160;    <span class="keywordflow">while</span>(allocSize &lt;= nextLevelNodeSize &amp;&amp; level + 1 &lt; m_LevelCount)</div>
+<div class="line"><a name="l12417"></a><span class="lineno">12417</span>&#160;    {</div>
+<div class="line"><a name="l12418"></a><span class="lineno">12418</span>&#160;        ++level;</div>
+<div class="line"><a name="l12419"></a><span class="lineno">12419</span>&#160;        currLevelNodeSize = nextLevelNodeSize;</div>
+<div class="line"><a name="l12420"></a><span class="lineno">12420</span>&#160;        nextLevelNodeSize = currLevelNodeSize &gt;&gt; 1;</div>
+<div class="line"><a name="l12421"></a><span class="lineno">12421</span>&#160;    }</div>
+<div class="line"><a name="l12422"></a><span class="lineno">12422</span>&#160;    <span class="keywordflow">return</span> level;</div>
+<div class="line"><a name="l12423"></a><span class="lineno">12423</span>&#160;}</div>
+<div class="line"><a name="l12424"></a><span class="lineno">12424</span>&#160; </div>
+<div class="line"><a name="l12425"></a><span class="lineno">12425</span>&#160;<span class="keywordtype">void</span> VmaBlockMetadata_Buddy::FreeAtOffset(<a class="code" href="struct_vma_allocation.html">VmaAllocation</a> alloc, VkDeviceSize offset)</div>
+<div class="line"><a name="l12426"></a><span class="lineno">12426</span>&#160;{</div>
+<div class="line"><a name="l12427"></a><span class="lineno">12427</span>&#160;    <span class="comment">// Find node and level.</span></div>
+<div class="line"><a name="l12428"></a><span class="lineno">12428</span>&#160;    Node* node = m_Root;</div>
+<div class="line"><a name="l12429"></a><span class="lineno">12429</span>&#160;    VkDeviceSize nodeOffset = 0;</div>
+<div class="line"><a name="l12430"></a><span class="lineno">12430</span>&#160;    uint32_t level = 0;</div>
+<div class="line"><a name="l12431"></a><span class="lineno">12431</span>&#160;    VkDeviceSize levelNodeSize = LevelToNodeSize(0);</div>
+<div class="line"><a name="l12432"></a><span class="lineno">12432</span>&#160;    <span class="keywordflow">while</span>(node-&gt;type == Node::TYPE_SPLIT)</div>
+<div class="line"><a name="l12433"></a><span class="lineno">12433</span>&#160;    {</div>
+<div class="line"><a name="l12434"></a><span class="lineno">12434</span>&#160;        <span class="keyword">const</span> VkDeviceSize nextLevelSize = levelNodeSize &gt;&gt; 1;</div>
+<div class="line"><a name="l12435"></a><span class="lineno">12435</span>&#160;        <span class="keywordflow">if</span>(offset &lt; nodeOffset + nextLevelSize)</div>
+<div class="line"><a name="l12436"></a><span class="lineno">12436</span>&#160;        {</div>
+<div class="line"><a name="l12437"></a><span class="lineno">12437</span>&#160;            node = node-&gt;split.leftChild;</div>
+<div class="line"><a name="l12438"></a><span class="lineno">12438</span>&#160;        }</div>
+<div class="line"><a name="l12439"></a><span class="lineno">12439</span>&#160;        <span class="keywordflow">else</span></div>
+<div class="line"><a name="l12440"></a><span class="lineno">12440</span>&#160;        {</div>
+<div class="line"><a name="l12441"></a><span class="lineno">12441</span>&#160;            node = node-&gt;split.leftChild-&gt;buddy;</div>
+<div class="line"><a name="l12442"></a><span class="lineno">12442</span>&#160;            nodeOffset += nextLevelSize;</div>
+<div class="line"><a name="l12443"></a><span class="lineno">12443</span>&#160;        }</div>
+<div class="line"><a name="l12444"></a><span class="lineno">12444</span>&#160;        ++level;</div>
+<div class="line"><a name="l12445"></a><span class="lineno">12445</span>&#160;        levelNodeSize = nextLevelSize;</div>
+<div class="line"><a name="l12446"></a><span class="lineno">12446</span>&#160;    }</div>
+<div class="line"><a name="l12447"></a><span class="lineno">12447</span>&#160; </div>
+<div class="line"><a name="l12448"></a><span class="lineno">12448</span>&#160;    VMA_ASSERT(node != VMA_NULL &amp;&amp; node-&gt;type == Node::TYPE_ALLOCATION);</div>
+<div class="line"><a name="l12449"></a><span class="lineno">12449</span>&#160;    VMA_ASSERT(alloc == VK_NULL_HANDLE || node-&gt;allocation.alloc == alloc);</div>
+<div class="line"><a name="l12450"></a><span class="lineno">12450</span>&#160; </div>
+<div class="line"><a name="l12451"></a><span class="lineno">12451</span>&#160;    ++m_FreeCount;</div>
+<div class="line"><a name="l12452"></a><span class="lineno">12452</span>&#160;    --m_AllocationCount;</div>
+<div class="line"><a name="l12453"></a><span class="lineno">12453</span>&#160;    m_SumFreeSize += alloc-&gt;GetSize();</div>
+<div class="line"><a name="l12454"></a><span class="lineno">12454</span>&#160; </div>
+<div class="line"><a name="l12455"></a><span class="lineno">12455</span>&#160;    node-&gt;type = Node::TYPE_FREE;</div>
 <div class="line"><a name="l12456"></a><span class="lineno">12456</span>&#160; </div>
-<div class="line"><a name="l12457"></a><span class="lineno">12457</span>&#160;    <span class="keyword">const</span> <span class="keywordtype">size_t</span> blockCount = m_Blocks.size();</div>
-<div class="line"><a name="l12458"></a><span class="lineno">12458</span>&#160; </div>
-<div class="line"><a name="l12459"></a><span class="lineno">12459</span>&#160;    pStats-&gt;<a class="code" href="struct_vma_pool_stats.html#a326807b2de2b0931cee4ed9a5f2e420c">size</a> = 0;</div>
-<div class="line"><a name="l12460"></a><span class="lineno">12460</span>&#160;    pStats-&gt;<a class="code" href="struct_vma_pool_stats.html#ad7c54874724fce7b06aba526202d82a8">unusedSize</a> = 0;</div>
-<div class="line"><a name="l12461"></a><span class="lineno">12461</span>&#160;    pStats-&gt;<a class="code" href="struct_vma_pool_stats.html#ad1924eb54fffa45e9e0e65670c8fe5eb">allocationCount</a> = 0;</div>
-<div class="line"><a name="l12462"></a><span class="lineno">12462</span>&#160;    pStats-&gt;<a class="code" href="struct_vma_pool_stats.html#ae4f3546ffa4d1e598b64d8e6134854f4">unusedRangeCount</a> = 0;</div>
-<div class="line"><a name="l12463"></a><span class="lineno">12463</span>&#160;    pStats-&gt;<a class="code" href="struct_vma_pool_stats.html#ab4c8f52dd42ab01998f60f0b6acc722b">unusedRangeSizeMax</a> = 0;</div>
-<div class="line"><a name="l12464"></a><span class="lineno">12464</span>&#160;    pStats-&gt;<a class="code" href="struct_vma_pool_stats.html#aa0b5cb45cef6f18571cefb03b9a230e7">blockCount</a> = blockCount;</div>
-<div class="line"><a name="l12465"></a><span class="lineno">12465</span>&#160; </div>
-<div class="line"><a name="l12466"></a><span class="lineno">12466</span>&#160;    <span class="keywordflow">for</span>(uint32_t blockIndex = 0; blockIndex &lt; blockCount; ++blockIndex)</div>
-<div class="line"><a name="l12467"></a><span class="lineno">12467</span>&#160;    {</div>
-<div class="line"><a name="l12468"></a><span class="lineno">12468</span>&#160;        <span class="keyword">const</span> VmaDeviceMemoryBlock* <span class="keyword">const</span> pBlock = m_Blocks[blockIndex];</div>
-<div class="line"><a name="l12469"></a><span class="lineno">12469</span>&#160;        VMA_ASSERT(pBlock);</div>
-<div class="line"><a name="l12470"></a><span class="lineno">12470</span>&#160;        VMA_HEAVY_ASSERT(pBlock-&gt;Validate());</div>
-<div class="line"><a name="l12471"></a><span class="lineno">12471</span>&#160;        pBlock-&gt;m_pMetadata-&gt;AddPoolStats(*pStats);</div>
-<div class="line"><a name="l12472"></a><span class="lineno">12472</span>&#160;    }</div>
-<div class="line"><a name="l12473"></a><span class="lineno">12473</span>&#160;}</div>
-<div class="line"><a name="l12474"></a><span class="lineno">12474</span>&#160; </div>
-<div class="line"><a name="l12475"></a><span class="lineno">12475</span>&#160;<span class="keywordtype">bool</span> VmaBlockVector::IsEmpty()</div>
-<div class="line"><a name="l12476"></a><span class="lineno">12476</span>&#160;{</div>
-<div class="line"><a name="l12477"></a><span class="lineno">12477</span>&#160;    VmaMutexLockRead lock(m_Mutex, m_hAllocator-&gt;m_UseMutex);</div>
-<div class="line"><a name="l12478"></a><span class="lineno">12478</span>&#160;    <span class="keywordflow">return</span> m_Blocks.empty();</div>
-<div class="line"><a name="l12479"></a><span class="lineno">12479</span>&#160;}</div>
-<div class="line"><a name="l12480"></a><span class="lineno">12480</span>&#160; </div>
-<div class="line"><a name="l12481"></a><span class="lineno">12481</span>&#160;<span class="keywordtype">bool</span> VmaBlockVector::IsCorruptionDetectionEnabled()<span class="keyword"> const</span></div>
-<div class="line"><a name="l12482"></a><span class="lineno">12482</span>&#160;<span class="keyword"></span>{</div>
-<div class="line"><a name="l12483"></a><span class="lineno">12483</span>&#160;    <span class="keyword">const</span> uint32_t requiredMemFlags = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT;</div>
-<div class="line"><a name="l12484"></a><span class="lineno">12484</span>&#160;    <span class="keywordflow">return</span> (VMA_DEBUG_DETECT_CORRUPTION != 0) &amp;&amp;</div>
-<div class="line"><a name="l12485"></a><span class="lineno">12485</span>&#160;        (VMA_DEBUG_MARGIN &gt; 0) &amp;&amp;</div>
-<div class="line"><a name="l12486"></a><span class="lineno">12486</span>&#160;        (m_Algorithm == 0 || m_Algorithm == <a class="code" href="vk__mem__alloc_8h.html#a9a7c45f9c863695d98c83fa5ac940fe7a13c8a444197c67866be9cb05599fc726">VMA_POOL_CREATE_LINEAR_ALGORITHM_BIT</a>) &amp;&amp;</div>
-<div class="line"><a name="l12487"></a><span class="lineno">12487</span>&#160;        (m_hAllocator-&gt;m_MemProps.memoryTypes[m_MemoryTypeIndex].propertyFlags &amp; requiredMemFlags) == requiredMemFlags;</div>
-<div class="line"><a name="l12488"></a><span class="lineno">12488</span>&#160;}</div>
-<div class="line"><a name="l12489"></a><span class="lineno">12489</span>&#160; </div>
-<div class="line"><a name="l12490"></a><span class="lineno">12490</span>&#160;<span class="keyword">static</span> <span class="keyword">const</span> uint32_t VMA_ALLOCATION_TRY_COUNT = 32;</div>
-<div class="line"><a name="l12491"></a><span class="lineno">12491</span>&#160; </div>
-<div class="line"><a name="l12492"></a><span class="lineno">12492</span>&#160;VkResult VmaBlockVector::Allocate(</div>
-<div class="line"><a name="l12493"></a><span class="lineno">12493</span>&#160;    uint32_t currentFrameIndex,</div>
-<div class="line"><a name="l12494"></a><span class="lineno">12494</span>&#160;    VkDeviceSize size,</div>
-<div class="line"><a name="l12495"></a><span class="lineno">12495</span>&#160;    VkDeviceSize alignment,</div>
-<div class="line"><a name="l12496"></a><span class="lineno">12496</span>&#160;    <span class="keyword">const</span> <a class="code" href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a>&amp; createInfo,</div>
-<div class="line"><a name="l12497"></a><span class="lineno">12497</span>&#160;    VmaSuballocationType suballocType,</div>
-<div class="line"><a name="l12498"></a><span class="lineno">12498</span>&#160;    <span class="keywordtype">size_t</span> allocationCount,</div>
-<div class="line"><a name="l12499"></a><span class="lineno">12499</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a>* pAllocations)</div>
-<div class="line"><a name="l12500"></a><span class="lineno">12500</span>&#160;{</div>
-<div class="line"><a name="l12501"></a><span class="lineno">12501</span>&#160;    <span class="keywordtype">size_t</span> allocIndex;</div>
-<div class="line"><a name="l12502"></a><span class="lineno">12502</span>&#160;    VkResult res = VK_SUCCESS;</div>
-<div class="line"><a name="l12503"></a><span class="lineno">12503</span>&#160; </div>
-<div class="line"><a name="l12504"></a><span class="lineno">12504</span>&#160;    <span class="keywordflow">if</span>(IsCorruptionDetectionEnabled())</div>
-<div class="line"><a name="l12505"></a><span class="lineno">12505</span>&#160;    {</div>
-<div class="line"><a name="l12506"></a><span class="lineno">12506</span>&#160;        size = VmaAlignUp&lt;VkDeviceSize&gt;(size, <span class="keyword">sizeof</span>(VMA_CORRUPTION_DETECTION_MAGIC_VALUE));</div>
-<div class="line"><a name="l12507"></a><span class="lineno">12507</span>&#160;        alignment = VmaAlignUp&lt;VkDeviceSize&gt;(alignment, <span class="keyword">sizeof</span>(VMA_CORRUPTION_DETECTION_MAGIC_VALUE));</div>
-<div class="line"><a name="l12508"></a><span class="lineno">12508</span>&#160;    }</div>
-<div class="line"><a name="l12509"></a><span class="lineno">12509</span>&#160; </div>
-<div class="line"><a name="l12510"></a><span class="lineno">12510</span>&#160;    {</div>
-<div class="line"><a name="l12511"></a><span class="lineno">12511</span>&#160;        VmaMutexLockWrite lock(m_Mutex, m_hAllocator-&gt;m_UseMutex);</div>
-<div class="line"><a name="l12512"></a><span class="lineno">12512</span>&#160;        <span class="keywordflow">for</span>(allocIndex = 0; allocIndex &lt; allocationCount; ++allocIndex)</div>
-<div class="line"><a name="l12513"></a><span class="lineno">12513</span>&#160;        {</div>
-<div class="line"><a name="l12514"></a><span class="lineno">12514</span>&#160;            res = AllocatePage(</div>
-<div class="line"><a name="l12515"></a><span class="lineno">12515</span>&#160;                currentFrameIndex,</div>
-<div class="line"><a name="l12516"></a><span class="lineno">12516</span>&#160;                size,</div>
-<div class="line"><a name="l12517"></a><span class="lineno">12517</span>&#160;                alignment,</div>
-<div class="line"><a name="l12518"></a><span class="lineno">12518</span>&#160;                createInfo,</div>
-<div class="line"><a name="l12519"></a><span class="lineno">12519</span>&#160;                suballocType,</div>
-<div class="line"><a name="l12520"></a><span class="lineno">12520</span>&#160;                pAllocations + allocIndex);</div>
-<div class="line"><a name="l12521"></a><span class="lineno">12521</span>&#160;            <span class="keywordflow">if</span>(res != VK_SUCCESS)</div>
-<div class="line"><a name="l12522"></a><span class="lineno">12522</span>&#160;            {</div>
-<div class="line"><a name="l12523"></a><span class="lineno">12523</span>&#160;                <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l12524"></a><span class="lineno">12524</span>&#160;            }</div>
-<div class="line"><a name="l12525"></a><span class="lineno">12525</span>&#160;        }</div>
-<div class="line"><a name="l12526"></a><span class="lineno">12526</span>&#160;    }</div>
-<div class="line"><a name="l12527"></a><span class="lineno">12527</span>&#160; </div>
-<div class="line"><a name="l12528"></a><span class="lineno">12528</span>&#160;    <span class="keywordflow">if</span>(res != VK_SUCCESS)</div>
-<div class="line"><a name="l12529"></a><span class="lineno">12529</span>&#160;    {</div>
-<div class="line"><a name="l12530"></a><span class="lineno">12530</span>&#160;        <span class="comment">// Free all already created allocations.</span></div>
-<div class="line"><a name="l12531"></a><span class="lineno">12531</span>&#160;        <span class="keywordflow">while</span>(allocIndex--)</div>
-<div class="line"><a name="l12532"></a><span class="lineno">12532</span>&#160;        {</div>
-<div class="line"><a name="l12533"></a><span class="lineno">12533</span>&#160;            Free(pAllocations[allocIndex]);</div>
-<div class="line"><a name="l12534"></a><span class="lineno">12534</span>&#160;        }</div>
-<div class="line"><a name="l12535"></a><span class="lineno">12535</span>&#160;        memset(pAllocations, 0, <span class="keyword">sizeof</span>(<a class="code" href="struct_vma_allocation.html">VmaAllocation</a>) * allocationCount);</div>
-<div class="line"><a name="l12536"></a><span class="lineno">12536</span>&#160;    }</div>
-<div class="line"><a name="l12537"></a><span class="lineno">12537</span>&#160; </div>
-<div class="line"><a name="l12538"></a><span class="lineno">12538</span>&#160;    <span class="keywordflow">return</span> res;</div>
-<div class="line"><a name="l12539"></a><span class="lineno">12539</span>&#160;}</div>
-<div class="line"><a name="l12540"></a><span class="lineno">12540</span>&#160; </div>
-<div class="line"><a name="l12541"></a><span class="lineno">12541</span>&#160;VkResult VmaBlockVector::AllocatePage(</div>
-<div class="line"><a name="l12542"></a><span class="lineno">12542</span>&#160;    uint32_t currentFrameIndex,</div>
-<div class="line"><a name="l12543"></a><span class="lineno">12543</span>&#160;    VkDeviceSize size,</div>
-<div class="line"><a name="l12544"></a><span class="lineno">12544</span>&#160;    VkDeviceSize alignment,</div>
-<div class="line"><a name="l12545"></a><span class="lineno">12545</span>&#160;    <span class="keyword">const</span> <a class="code" href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a>&amp; createInfo,</div>
-<div class="line"><a name="l12546"></a><span class="lineno">12546</span>&#160;    VmaSuballocationType suballocType,</div>
-<div class="line"><a name="l12547"></a><span class="lineno">12547</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a>* pAllocation)</div>
-<div class="line"><a name="l12548"></a><span class="lineno">12548</span>&#160;{</div>
-<div class="line"><a name="l12549"></a><span class="lineno">12549</span>&#160;    <span class="keyword">const</span> <span class="keywordtype">bool</span> isUpperAddress = (createInfo.<a class="code" href="struct_vma_allocation_create_info.html#add09658ac14fe290ace25470ddd6d41b">flags</a> &amp; <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a42ba3a2d2c7117953210b7c3ef8da0df">VMA_ALLOCATION_CREATE_UPPER_ADDRESS_BIT</a>) != 0;</div>
-<div class="line"><a name="l12550"></a><span class="lineno">12550</span>&#160;    <span class="keywordtype">bool</span> canMakeOtherLost = (createInfo.<a class="code" href="struct_vma_allocation_create_info.html#add09658ac14fe290ace25470ddd6d41b">flags</a> &amp; <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a68686d0ce9beb0d4d1b9f2b8b1389a7e">VMA_ALLOCATION_CREATE_CAN_MAKE_OTHER_LOST_BIT</a>) != 0;</div>
-<div class="line"><a name="l12551"></a><span class="lineno">12551</span>&#160;    <span class="keyword">const</span> <span class="keywordtype">bool</span> mapped = (createInfo.<a class="code" href="struct_vma_allocation_create_info.html#add09658ac14fe290ace25470ddd6d41b">flags</a> &amp; <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a11da372cc3a82931c5e5d6146cd9dd1f">VMA_ALLOCATION_CREATE_MAPPED_BIT</a>) != 0;</div>
-<div class="line"><a name="l12552"></a><span class="lineno">12552</span>&#160;    <span class="keyword">const</span> <span class="keywordtype">bool</span> isUserDataString = (createInfo.<a class="code" href="struct_vma_allocation_create_info.html#add09658ac14fe290ace25470ddd6d41b">flags</a> &amp; <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597aa6f24f821cd6a7c5e4a443f7bf59c520">VMA_ALLOCATION_CREATE_USER_DATA_COPY_STRING_BIT</a>) != 0;</div>
-<div class="line"><a name="l12553"></a><span class="lineno">12553</span>&#160;    </div>
-<div class="line"><a name="l12554"></a><span class="lineno">12554</span>&#160;    VkDeviceSize freeMemory;</div>
-<div class="line"><a name="l12555"></a><span class="lineno">12555</span>&#160;    {</div>
-<div class="line"><a name="l12556"></a><span class="lineno">12556</span>&#160;        <span class="keyword">const</span> uint32_t heapIndex = m_hAllocator-&gt;MemoryTypeIndexToHeapIndex(m_MemoryTypeIndex);</div>
-<div class="line"><a name="l12557"></a><span class="lineno">12557</span>&#160;        <a class="code" href="struct_vma_budget.html">VmaBudget</a> heapBudget = {};</div>
-<div class="line"><a name="l12558"></a><span class="lineno">12558</span>&#160;        m_hAllocator-&gt;GetBudget(&amp;heapBudget, heapIndex, 1);</div>
-<div class="line"><a name="l12559"></a><span class="lineno">12559</span>&#160;        freeMemory = (heapBudget.<a class="code" href="struct_vma_budget.html#a84dd1ecca8b0110259eb206dbadb11f6">usage</a> &lt; heapBudget.<a class="code" href="struct_vma_budget.html#ab82e1d1754c2d210d0bdf90220bc6cdd">budget</a>) ? (heapBudget.<a class="code" href="struct_vma_budget.html#ab82e1d1754c2d210d0bdf90220bc6cdd">budget</a> - heapBudget.<a class="code" href="struct_vma_budget.html#a84dd1ecca8b0110259eb206dbadb11f6">usage</a>) : 0;</div>
-<div class="line"><a name="l12560"></a><span class="lineno">12560</span>&#160;    }</div>
-<div class="line"><a name="l12561"></a><span class="lineno">12561</span>&#160;    </div>
-<div class="line"><a name="l12562"></a><span class="lineno">12562</span>&#160;    <span class="keyword">const</span> <span class="keywordtype">bool</span> canFallbackToDedicated = !IsCustomPool();</div>
-<div class="line"><a name="l12563"></a><span class="lineno">12563</span>&#160;    <span class="keyword">const</span> <span class="keywordtype">bool</span> canCreateNewBlock =</div>
-<div class="line"><a name="l12564"></a><span class="lineno">12564</span>&#160;        ((createInfo.<a class="code" href="struct_vma_allocation_create_info.html#add09658ac14fe290ace25470ddd6d41b">flags</a> &amp; <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a89759603401014eb325eb22a3839f2ff">VMA_ALLOCATION_CREATE_NEVER_ALLOCATE_BIT</a>) == 0) &amp;&amp;</div>
-<div class="line"><a name="l12565"></a><span class="lineno">12565</span>&#160;        (m_Blocks.size() &lt; m_MaxBlockCount) &amp;&amp;</div>
-<div class="line"><a name="l12566"></a><span class="lineno">12566</span>&#160;        (freeMemory &gt;= size || !canFallbackToDedicated);</div>
-<div class="line"><a name="l12567"></a><span class="lineno">12567</span>&#160;    uint32_t strategy = createInfo.<a class="code" href="struct_vma_allocation_create_info.html#add09658ac14fe290ace25470ddd6d41b">flags</a> &amp; <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a8e16845d81ae3d27c47106d4770d5c7e">VMA_ALLOCATION_CREATE_STRATEGY_MASK</a>;</div>
-<div class="line"><a name="l12568"></a><span class="lineno">12568</span>&#160; </div>
-<div class="line"><a name="l12569"></a><span class="lineno">12569</span>&#160;    <span class="comment">// If linearAlgorithm is used, canMakeOtherLost is available only when used as ring buffer.</span></div>
-<div class="line"><a name="l12570"></a><span class="lineno">12570</span>&#160;    <span class="comment">// Which in turn is available only when maxBlockCount = 1.</span></div>
-<div class="line"><a name="l12571"></a><span class="lineno">12571</span>&#160;    <span class="keywordflow">if</span>(m_Algorithm == <a class="code" href="vk__mem__alloc_8h.html#a9a7c45f9c863695d98c83fa5ac940fe7a13c8a444197c67866be9cb05599fc726">VMA_POOL_CREATE_LINEAR_ALGORITHM_BIT</a> &amp;&amp; m_MaxBlockCount &gt; 1)</div>
-<div class="line"><a name="l12572"></a><span class="lineno">12572</span>&#160;    {</div>
-<div class="line"><a name="l12573"></a><span class="lineno">12573</span>&#160;        canMakeOtherLost = <span class="keyword">false</span>;</div>
-<div class="line"><a name="l12574"></a><span class="lineno">12574</span>&#160;    }</div>
-<div class="line"><a name="l12575"></a><span class="lineno">12575</span>&#160; </div>
-<div class="line"><a name="l12576"></a><span class="lineno">12576</span>&#160;    <span class="comment">// Upper address can only be used with linear allocator and within single memory block.</span></div>
-<div class="line"><a name="l12577"></a><span class="lineno">12577</span>&#160;    <span class="keywordflow">if</span>(isUpperAddress &amp;&amp;</div>
-<div class="line"><a name="l12578"></a><span class="lineno">12578</span>&#160;        (m_Algorithm != <a class="code" href="vk__mem__alloc_8h.html#a9a7c45f9c863695d98c83fa5ac940fe7a13c8a444197c67866be9cb05599fc726">VMA_POOL_CREATE_LINEAR_ALGORITHM_BIT</a> || m_MaxBlockCount &gt; 1))</div>
-<div class="line"><a name="l12579"></a><span class="lineno">12579</span>&#160;    {</div>
-<div class="line"><a name="l12580"></a><span class="lineno">12580</span>&#160;        <span class="keywordflow">return</span> VK_ERROR_FEATURE_NOT_PRESENT;</div>
-<div class="line"><a name="l12581"></a><span class="lineno">12581</span>&#160;    }</div>
-<div class="line"><a name="l12582"></a><span class="lineno">12582</span>&#160; </div>
-<div class="line"><a name="l12583"></a><span class="lineno">12583</span>&#160;    <span class="comment">// Validate strategy.</span></div>
-<div class="line"><a name="l12584"></a><span class="lineno">12584</span>&#160;    <span class="keywordflow">switch</span>(strategy)</div>
-<div class="line"><a name="l12585"></a><span class="lineno">12585</span>&#160;    {</div>
-<div class="line"><a name="l12586"></a><span class="lineno">12586</span>&#160;    <span class="keywordflow">case</span> 0:</div>
-<div class="line"><a name="l12587"></a><span class="lineno">12587</span>&#160;        strategy = <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a839826775c62319466441f86496f036d">VMA_ALLOCATION_CREATE_STRATEGY_BEST_FIT_BIT</a>;</div>
+<div class="line"><a name="l12457"></a><span class="lineno">12457</span>&#160;    <span class="comment">// Join free nodes if possible.</span></div>
+<div class="line"><a name="l12458"></a><span class="lineno">12458</span>&#160;    <span class="keywordflow">while</span>(level &gt; 0 &amp;&amp; node-&gt;buddy-&gt;type == Node::TYPE_FREE)</div>
+<div class="line"><a name="l12459"></a><span class="lineno">12459</span>&#160;    {</div>
+<div class="line"><a name="l12460"></a><span class="lineno">12460</span>&#160;        RemoveFromFreeList(level, node-&gt;buddy);</div>
+<div class="line"><a name="l12461"></a><span class="lineno">12461</span>&#160;        Node* <span class="keyword">const</span> parent = node-&gt;parent;</div>
+<div class="line"><a name="l12462"></a><span class="lineno">12462</span>&#160; </div>
+<div class="line"><a name="l12463"></a><span class="lineno">12463</span>&#160;        vma_delete(GetAllocationCallbacks(), node-&gt;buddy);</div>
+<div class="line"><a name="l12464"></a><span class="lineno">12464</span>&#160;        vma_delete(GetAllocationCallbacks(), node);</div>
+<div class="line"><a name="l12465"></a><span class="lineno">12465</span>&#160;        parent-&gt;type = Node::TYPE_FREE;</div>
+<div class="line"><a name="l12466"></a><span class="lineno">12466</span>&#160; </div>
+<div class="line"><a name="l12467"></a><span class="lineno">12467</span>&#160;        node = parent;</div>
+<div class="line"><a name="l12468"></a><span class="lineno">12468</span>&#160;        --level;</div>
+<div class="line"><a name="l12469"></a><span class="lineno">12469</span>&#160;        <span class="comment">//m_SumFreeSize += LevelToNodeSize(level) % 2; // Useful only when level node sizes can be non power of 2.</span></div>
+<div class="line"><a name="l12470"></a><span class="lineno">12470</span>&#160;        --m_FreeCount;</div>
+<div class="line"><a name="l12471"></a><span class="lineno">12471</span>&#160;    }</div>
+<div class="line"><a name="l12472"></a><span class="lineno">12472</span>&#160; </div>
+<div class="line"><a name="l12473"></a><span class="lineno">12473</span>&#160;    AddToFreeListFront(level, node);</div>
+<div class="line"><a name="l12474"></a><span class="lineno">12474</span>&#160;}</div>
+<div class="line"><a name="l12475"></a><span class="lineno">12475</span>&#160; </div>
+<div class="line"><a name="l12476"></a><span class="lineno">12476</span>&#160;<span class="keywordtype">void</span> VmaBlockMetadata_Buddy::CalcAllocationStatInfoNode(<a class="code" href="struct_vma_stat_info.html">VmaStatInfo</a>&amp; outInfo, <span class="keyword">const</span> Node* node, VkDeviceSize levelNodeSize)<span class="keyword"> const</span></div>
+<div class="line"><a name="l12477"></a><span class="lineno">12477</span>&#160;<span class="keyword"></span>{</div>
+<div class="line"><a name="l12478"></a><span class="lineno">12478</span>&#160;    <span class="keywordflow">switch</span>(node-&gt;type)</div>
+<div class="line"><a name="l12479"></a><span class="lineno">12479</span>&#160;    {</div>
+<div class="line"><a name="l12480"></a><span class="lineno">12480</span>&#160;    <span class="keywordflow">case</span> Node::TYPE_FREE:</div>
+<div class="line"><a name="l12481"></a><span class="lineno">12481</span>&#160;        ++outInfo.<a class="code" href="struct_vma_stat_info.html#ae06129c771bfebfd6468a7f4276502a9">unusedRangeCount</a>;</div>
+<div class="line"><a name="l12482"></a><span class="lineno">12482</span>&#160;        outInfo.<a class="code" href="struct_vma_stat_info.html#a1859d290aca2cd582d8dc25922092669">unusedBytes</a> += levelNodeSize;</div>
+<div class="line"><a name="l12483"></a><span class="lineno">12483</span>&#160;        outInfo.<a class="code" href="struct_vma_stat_info.html#a5ba1a2476c4d39b10f7e2f7ebbb72ac4">unusedRangeSizeMax</a> = VMA_MAX(outInfo.<a class="code" href="struct_vma_stat_info.html#a5ba1a2476c4d39b10f7e2f7ebbb72ac4">unusedRangeSizeMax</a>, levelNodeSize);</div>
+<div class="line"><a name="l12484"></a><span class="lineno">12484</span>&#160;        outInfo.<a class="code" href="struct_vma_stat_info.html#aedeba931324f16589cd2416c0d2dd0d4">unusedRangeSizeMin</a> = VMA_MAX(outInfo.<a class="code" href="struct_vma_stat_info.html#aedeba931324f16589cd2416c0d2dd0d4">unusedRangeSizeMin</a>, levelNodeSize);</div>
+<div class="line"><a name="l12485"></a><span class="lineno">12485</span>&#160;        <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l12486"></a><span class="lineno">12486</span>&#160;    <span class="keywordflow">case</span> Node::TYPE_ALLOCATION:</div>
+<div class="line"><a name="l12487"></a><span class="lineno">12487</span>&#160;        {</div>
+<div class="line"><a name="l12488"></a><span class="lineno">12488</span>&#160;            <span class="keyword">const</span> VkDeviceSize allocSize = node-&gt;allocation.alloc-&gt;GetSize();</div>
+<div class="line"><a name="l12489"></a><span class="lineno">12489</span>&#160;            ++outInfo.<a class="code" href="struct_vma_stat_info.html#a537741e4d5cdddc1c0ab95ec650afaff">allocationCount</a>;</div>
+<div class="line"><a name="l12490"></a><span class="lineno">12490</span>&#160;            outInfo.<a class="code" href="struct_vma_stat_info.html#ab0c6c73837e5a70c749fbd4f6064895a">usedBytes</a> += allocSize;</div>
+<div class="line"><a name="l12491"></a><span class="lineno">12491</span>&#160;            outInfo.<a class="code" href="struct_vma_stat_info.html#a17e9733a5ecd76287d4db6e66f71f50c">allocationSizeMax</a> = VMA_MAX(outInfo.<a class="code" href="struct_vma_stat_info.html#a17e9733a5ecd76287d4db6e66f71f50c">allocationSizeMax</a>, allocSize);</div>
+<div class="line"><a name="l12492"></a><span class="lineno">12492</span>&#160;            outInfo.<a class="code" href="struct_vma_stat_info.html#ade8b40bd3139c04aabd2fc538a356fea">allocationSizeMin</a> = VMA_MAX(outInfo.<a class="code" href="struct_vma_stat_info.html#ade8b40bd3139c04aabd2fc538a356fea">allocationSizeMin</a>, allocSize);</div>
+<div class="line"><a name="l12493"></a><span class="lineno">12493</span>&#160; </div>
+<div class="line"><a name="l12494"></a><span class="lineno">12494</span>&#160;            <span class="keyword">const</span> VkDeviceSize unusedRangeSize = levelNodeSize - allocSize;</div>
+<div class="line"><a name="l12495"></a><span class="lineno">12495</span>&#160;            <span class="keywordflow">if</span>(unusedRangeSize &gt; 0)</div>
+<div class="line"><a name="l12496"></a><span class="lineno">12496</span>&#160;            {</div>
+<div class="line"><a name="l12497"></a><span class="lineno">12497</span>&#160;                ++outInfo.<a class="code" href="struct_vma_stat_info.html#ae06129c771bfebfd6468a7f4276502a9">unusedRangeCount</a>;</div>
+<div class="line"><a name="l12498"></a><span class="lineno">12498</span>&#160;                outInfo.<a class="code" href="struct_vma_stat_info.html#a1859d290aca2cd582d8dc25922092669">unusedBytes</a> += unusedRangeSize;</div>
+<div class="line"><a name="l12499"></a><span class="lineno">12499</span>&#160;                outInfo.<a class="code" href="struct_vma_stat_info.html#a5ba1a2476c4d39b10f7e2f7ebbb72ac4">unusedRangeSizeMax</a> = VMA_MAX(outInfo.<a class="code" href="struct_vma_stat_info.html#a5ba1a2476c4d39b10f7e2f7ebbb72ac4">unusedRangeSizeMax</a>, unusedRangeSize);</div>
+<div class="line"><a name="l12500"></a><span class="lineno">12500</span>&#160;                outInfo.<a class="code" href="struct_vma_stat_info.html#aedeba931324f16589cd2416c0d2dd0d4">unusedRangeSizeMin</a> = VMA_MAX(outInfo.<a class="code" href="struct_vma_stat_info.html#aedeba931324f16589cd2416c0d2dd0d4">unusedRangeSizeMin</a>, unusedRangeSize);</div>
+<div class="line"><a name="l12501"></a><span class="lineno">12501</span>&#160;            }</div>
+<div class="line"><a name="l12502"></a><span class="lineno">12502</span>&#160;        }</div>
+<div class="line"><a name="l12503"></a><span class="lineno">12503</span>&#160;        <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l12504"></a><span class="lineno">12504</span>&#160;    <span class="keywordflow">case</span> Node::TYPE_SPLIT:</div>
+<div class="line"><a name="l12505"></a><span class="lineno">12505</span>&#160;        {</div>
+<div class="line"><a name="l12506"></a><span class="lineno">12506</span>&#160;            <span class="keyword">const</span> VkDeviceSize childrenNodeSize = levelNodeSize / 2;</div>
+<div class="line"><a name="l12507"></a><span class="lineno">12507</span>&#160;            <span class="keyword">const</span> Node* <span class="keyword">const</span> leftChild = node-&gt;split.leftChild;</div>
+<div class="line"><a name="l12508"></a><span class="lineno">12508</span>&#160;            CalcAllocationStatInfoNode(outInfo, leftChild, childrenNodeSize);</div>
+<div class="line"><a name="l12509"></a><span class="lineno">12509</span>&#160;            <span class="keyword">const</span> Node* <span class="keyword">const</span> rightChild = leftChild-&gt;buddy;</div>
+<div class="line"><a name="l12510"></a><span class="lineno">12510</span>&#160;            CalcAllocationStatInfoNode(outInfo, rightChild, childrenNodeSize);</div>
+<div class="line"><a name="l12511"></a><span class="lineno">12511</span>&#160;        }</div>
+<div class="line"><a name="l12512"></a><span class="lineno">12512</span>&#160;        <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l12513"></a><span class="lineno">12513</span>&#160;    <span class="keywordflow">default</span>:</div>
+<div class="line"><a name="l12514"></a><span class="lineno">12514</span>&#160;        VMA_ASSERT(0);</div>
+<div class="line"><a name="l12515"></a><span class="lineno">12515</span>&#160;    }</div>
+<div class="line"><a name="l12516"></a><span class="lineno">12516</span>&#160;}</div>
+<div class="line"><a name="l12517"></a><span class="lineno">12517</span>&#160; </div>
+<div class="line"><a name="l12518"></a><span class="lineno">12518</span>&#160;<span class="keywordtype">void</span> VmaBlockMetadata_Buddy::AddToFreeListFront(uint32_t level, Node* node)</div>
+<div class="line"><a name="l12519"></a><span class="lineno">12519</span>&#160;{</div>
+<div class="line"><a name="l12520"></a><span class="lineno">12520</span>&#160;    VMA_ASSERT(node-&gt;type == Node::TYPE_FREE);</div>
+<div class="line"><a name="l12521"></a><span class="lineno">12521</span>&#160; </div>
+<div class="line"><a name="l12522"></a><span class="lineno">12522</span>&#160;    <span class="comment">// List is empty.</span></div>
+<div class="line"><a name="l12523"></a><span class="lineno">12523</span>&#160;    Node* <span class="keyword">const</span> frontNode = m_FreeList[level].front;</div>
+<div class="line"><a name="l12524"></a><span class="lineno">12524</span>&#160;    <span class="keywordflow">if</span>(frontNode == VMA_NULL)</div>
+<div class="line"><a name="l12525"></a><span class="lineno">12525</span>&#160;    {</div>
+<div class="line"><a name="l12526"></a><span class="lineno">12526</span>&#160;        VMA_ASSERT(m_FreeList[level].back == VMA_NULL);</div>
+<div class="line"><a name="l12527"></a><span class="lineno">12527</span>&#160;        node-&gt;free.prev = node-&gt;free.next = VMA_NULL;</div>
+<div class="line"><a name="l12528"></a><span class="lineno">12528</span>&#160;        m_FreeList[level].front = m_FreeList[level].back = node;</div>
+<div class="line"><a name="l12529"></a><span class="lineno">12529</span>&#160;    }</div>
+<div class="line"><a name="l12530"></a><span class="lineno">12530</span>&#160;    <span class="keywordflow">else</span></div>
+<div class="line"><a name="l12531"></a><span class="lineno">12531</span>&#160;    {</div>
+<div class="line"><a name="l12532"></a><span class="lineno">12532</span>&#160;        VMA_ASSERT(frontNode-&gt;free.prev == VMA_NULL);</div>
+<div class="line"><a name="l12533"></a><span class="lineno">12533</span>&#160;        node-&gt;free.prev = VMA_NULL;</div>
+<div class="line"><a name="l12534"></a><span class="lineno">12534</span>&#160;        node-&gt;free.next = frontNode;</div>
+<div class="line"><a name="l12535"></a><span class="lineno">12535</span>&#160;        frontNode-&gt;free.prev = node;</div>
+<div class="line"><a name="l12536"></a><span class="lineno">12536</span>&#160;        m_FreeList[level].front = node;</div>
+<div class="line"><a name="l12537"></a><span class="lineno">12537</span>&#160;    }</div>
+<div class="line"><a name="l12538"></a><span class="lineno">12538</span>&#160;}</div>
+<div class="line"><a name="l12539"></a><span class="lineno">12539</span>&#160; </div>
+<div class="line"><a name="l12540"></a><span class="lineno">12540</span>&#160;<span class="keywordtype">void</span> VmaBlockMetadata_Buddy::RemoveFromFreeList(uint32_t level, Node* node)</div>
+<div class="line"><a name="l12541"></a><span class="lineno">12541</span>&#160;{</div>
+<div class="line"><a name="l12542"></a><span class="lineno">12542</span>&#160;    VMA_ASSERT(m_FreeList[level].front != VMA_NULL);</div>
+<div class="line"><a name="l12543"></a><span class="lineno">12543</span>&#160; </div>
+<div class="line"><a name="l12544"></a><span class="lineno">12544</span>&#160;    <span class="comment">// It is at the front.</span></div>
+<div class="line"><a name="l12545"></a><span class="lineno">12545</span>&#160;    <span class="keywordflow">if</span>(node-&gt;free.prev == VMA_NULL)</div>
+<div class="line"><a name="l12546"></a><span class="lineno">12546</span>&#160;    {</div>
+<div class="line"><a name="l12547"></a><span class="lineno">12547</span>&#160;        VMA_ASSERT(m_FreeList[level].front == node);</div>
+<div class="line"><a name="l12548"></a><span class="lineno">12548</span>&#160;        m_FreeList[level].front = node-&gt;free.next;</div>
+<div class="line"><a name="l12549"></a><span class="lineno">12549</span>&#160;    }</div>
+<div class="line"><a name="l12550"></a><span class="lineno">12550</span>&#160;    <span class="keywordflow">else</span></div>
+<div class="line"><a name="l12551"></a><span class="lineno">12551</span>&#160;    {</div>
+<div class="line"><a name="l12552"></a><span class="lineno">12552</span>&#160;        Node* <span class="keyword">const</span> prevFreeNode = node-&gt;free.prev;</div>
+<div class="line"><a name="l12553"></a><span class="lineno">12553</span>&#160;        VMA_ASSERT(prevFreeNode-&gt;free.next == node);</div>
+<div class="line"><a name="l12554"></a><span class="lineno">12554</span>&#160;        prevFreeNode-&gt;free.next = node-&gt;free.next;</div>
+<div class="line"><a name="l12555"></a><span class="lineno">12555</span>&#160;    }</div>
+<div class="line"><a name="l12556"></a><span class="lineno">12556</span>&#160; </div>
+<div class="line"><a name="l12557"></a><span class="lineno">12557</span>&#160;    <span class="comment">// It is at the back.</span></div>
+<div class="line"><a name="l12558"></a><span class="lineno">12558</span>&#160;    <span class="keywordflow">if</span>(node-&gt;free.next == VMA_NULL)</div>
+<div class="line"><a name="l12559"></a><span class="lineno">12559</span>&#160;    {</div>
+<div class="line"><a name="l12560"></a><span class="lineno">12560</span>&#160;        VMA_ASSERT(m_FreeList[level].back == node);</div>
+<div class="line"><a name="l12561"></a><span class="lineno">12561</span>&#160;        m_FreeList[level].back = node-&gt;free.prev;</div>
+<div class="line"><a name="l12562"></a><span class="lineno">12562</span>&#160;    }</div>
+<div class="line"><a name="l12563"></a><span class="lineno">12563</span>&#160;    <span class="keywordflow">else</span></div>
+<div class="line"><a name="l12564"></a><span class="lineno">12564</span>&#160;    {</div>
+<div class="line"><a name="l12565"></a><span class="lineno">12565</span>&#160;        Node* <span class="keyword">const</span> nextFreeNode = node-&gt;free.next;</div>
+<div class="line"><a name="l12566"></a><span class="lineno">12566</span>&#160;        VMA_ASSERT(nextFreeNode-&gt;free.prev == node);</div>
+<div class="line"><a name="l12567"></a><span class="lineno">12567</span>&#160;        nextFreeNode-&gt;free.prev = node-&gt;free.prev;</div>
+<div class="line"><a name="l12568"></a><span class="lineno">12568</span>&#160;    }</div>
+<div class="line"><a name="l12569"></a><span class="lineno">12569</span>&#160;}</div>
+<div class="line"><a name="l12570"></a><span class="lineno">12570</span>&#160; </div>
+<div class="line"><a name="l12571"></a><span class="lineno">12571</span>&#160;<span class="preprocessor">#if VMA_STATS_STRING_ENABLED</span></div>
+<div class="line"><a name="l12572"></a><span class="lineno">12572</span>&#160;<span class="keywordtype">void</span> VmaBlockMetadata_Buddy::PrintDetailedMapNode(<span class="keyword">class</span> VmaJsonWriter&amp; json, <span class="keyword">const</span> Node* node, VkDeviceSize levelNodeSize)<span class="keyword"> const</span></div>
+<div class="line"><a name="l12573"></a><span class="lineno">12573</span>&#160;<span class="keyword"></span>{</div>
+<div class="line"><a name="l12574"></a><span class="lineno">12574</span>&#160;    <span class="keywordflow">switch</span>(node-&gt;type)</div>
+<div class="line"><a name="l12575"></a><span class="lineno">12575</span>&#160;    {</div>
+<div class="line"><a name="l12576"></a><span class="lineno">12576</span>&#160;    <span class="keywordflow">case</span> Node::TYPE_FREE:</div>
+<div class="line"><a name="l12577"></a><span class="lineno">12577</span>&#160;        PrintDetailedMap_UnusedRange(json, node-&gt;offset, levelNodeSize);</div>
+<div class="line"><a name="l12578"></a><span class="lineno">12578</span>&#160;        <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l12579"></a><span class="lineno">12579</span>&#160;    <span class="keywordflow">case</span> Node::TYPE_ALLOCATION:</div>
+<div class="line"><a name="l12580"></a><span class="lineno">12580</span>&#160;        {</div>
+<div class="line"><a name="l12581"></a><span class="lineno">12581</span>&#160;            PrintDetailedMap_Allocation(json, node-&gt;offset, node-&gt;allocation.alloc);</div>
+<div class="line"><a name="l12582"></a><span class="lineno">12582</span>&#160;            <span class="keyword">const</span> VkDeviceSize allocSize = node-&gt;allocation.alloc-&gt;GetSize();</div>
+<div class="line"><a name="l12583"></a><span class="lineno">12583</span>&#160;            <span class="keywordflow">if</span>(allocSize &lt; levelNodeSize)</div>
+<div class="line"><a name="l12584"></a><span class="lineno">12584</span>&#160;            {</div>
+<div class="line"><a name="l12585"></a><span class="lineno">12585</span>&#160;                PrintDetailedMap_UnusedRange(json, node-&gt;offset + allocSize, levelNodeSize - allocSize);</div>
+<div class="line"><a name="l12586"></a><span class="lineno">12586</span>&#160;            }</div>
+<div class="line"><a name="l12587"></a><span class="lineno">12587</span>&#160;        }</div>
 <div class="line"><a name="l12588"></a><span class="lineno">12588</span>&#160;        <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l12589"></a><span class="lineno">12589</span>&#160;    <span class="keywordflow">case</span> <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a839826775c62319466441f86496f036d">VMA_ALLOCATION_CREATE_STRATEGY_BEST_FIT_BIT</a>:</div>
-<div class="line"><a name="l12590"></a><span class="lineno">12590</span>&#160;    <span class="keywordflow">case</span> <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597ad242a04f802e25fef0b880afe8bb0a62">VMA_ALLOCATION_CREATE_STRATEGY_WORST_FIT_BIT</a>:</div>
-<div class="line"><a name="l12591"></a><span class="lineno">12591</span>&#160;    <span class="keywordflow">case</span> <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a33eb2052674f3ad92386c714a65fb777">VMA_ALLOCATION_CREATE_STRATEGY_FIRST_FIT_BIT</a>:</div>
-<div class="line"><a name="l12592"></a><span class="lineno">12592</span>&#160;        <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l12593"></a><span class="lineno">12593</span>&#160;    <span class="keywordflow">default</span>:</div>
-<div class="line"><a name="l12594"></a><span class="lineno">12594</span>&#160;        <span class="keywordflow">return</span> VK_ERROR_FEATURE_NOT_PRESENT;</div>
-<div class="line"><a name="l12595"></a><span class="lineno">12595</span>&#160;    }</div>
-<div class="line"><a name="l12596"></a><span class="lineno">12596</span>&#160; </div>
-<div class="line"><a name="l12597"></a><span class="lineno">12597</span>&#160;    <span class="comment">// Early reject: requested allocation size is larger that maximum block size for this block vector.</span></div>
-<div class="line"><a name="l12598"></a><span class="lineno">12598</span>&#160;    <span class="keywordflow">if</span>(size + 2 * VMA_DEBUG_MARGIN &gt; m_PreferredBlockSize)</div>
-<div class="line"><a name="l12599"></a><span class="lineno">12599</span>&#160;    {</div>
-<div class="line"><a name="l12600"></a><span class="lineno">12600</span>&#160;        <span class="keywordflow">return</span> VK_ERROR_OUT_OF_DEVICE_MEMORY;</div>
-<div class="line"><a name="l12601"></a><span class="lineno">12601</span>&#160;    }</div>
-<div class="line"><a name="l12602"></a><span class="lineno">12602</span>&#160; </div>
-<div class="line"><a name="l12603"></a><span class="lineno">12603</span>&#160;    <span class="comment">/*</span></div>
-<div class="line"><a name="l12604"></a><span class="lineno">12604</span>&#160;<span class="comment">    Under certain condition, this whole section can be skipped for optimization, so</span></div>
-<div class="line"><a name="l12605"></a><span class="lineno">12605</span>&#160;<span class="comment">    we move on directly to trying to allocate with canMakeOtherLost. That&#39;s the case</span></div>
-<div class="line"><a name="l12606"></a><span class="lineno">12606</span>&#160;<span class="comment">    e.g. for custom pools with linear algorithm.</span></div>
-<div class="line"><a name="l12607"></a><span class="lineno">12607</span>&#160;<span class="comment">    */</span></div>
-<div class="line"><a name="l12608"></a><span class="lineno">12608</span>&#160;    <span class="keywordflow">if</span>(!canMakeOtherLost || canCreateNewBlock)</div>
-<div class="line"><a name="l12609"></a><span class="lineno">12609</span>&#160;    {</div>
-<div class="line"><a name="l12610"></a><span class="lineno">12610</span>&#160;        <span class="comment">// 1. Search existing allocations. Try to allocate without making other allocations lost.</span></div>
-<div class="line"><a name="l12611"></a><span class="lineno">12611</span>&#160;        <a class="code" href="vk__mem__alloc_8h.html#a5225e5e11f8376f6a31a1791f3d6e817">VmaAllocationCreateFlags</a> allocFlagsCopy = createInfo.<a class="code" href="struct_vma_allocation_create_info.html#add09658ac14fe290ace25470ddd6d41b">flags</a>;</div>
-<div class="line"><a name="l12612"></a><span class="lineno">12612</span>&#160;        allocFlagsCopy &amp;= ~<a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a68686d0ce9beb0d4d1b9f2b8b1389a7e">VMA_ALLOCATION_CREATE_CAN_MAKE_OTHER_LOST_BIT</a>;</div>
-<div class="line"><a name="l12613"></a><span class="lineno">12613</span>&#160; </div>
-<div class="line"><a name="l12614"></a><span class="lineno">12614</span>&#160;        <span class="keywordflow">if</span>(m_Algorithm == <a class="code" href="vk__mem__alloc_8h.html#a9a7c45f9c863695d98c83fa5ac940fe7a13c8a444197c67866be9cb05599fc726">VMA_POOL_CREATE_LINEAR_ALGORITHM_BIT</a>)</div>
-<div class="line"><a name="l12615"></a><span class="lineno">12615</span>&#160;        {</div>
-<div class="line"><a name="l12616"></a><span class="lineno">12616</span>&#160;            <span class="comment">// Use only last block.</span></div>
-<div class="line"><a name="l12617"></a><span class="lineno">12617</span>&#160;            <span class="keywordflow">if</span>(!m_Blocks.empty())</div>
-<div class="line"><a name="l12618"></a><span class="lineno">12618</span>&#160;            {</div>
-<div class="line"><a name="l12619"></a><span class="lineno">12619</span>&#160;                VmaDeviceMemoryBlock* <span class="keyword">const</span> pCurrBlock = m_Blocks.back();</div>
-<div class="line"><a name="l12620"></a><span class="lineno">12620</span>&#160;                VMA_ASSERT(pCurrBlock);</div>
-<div class="line"><a name="l12621"></a><span class="lineno">12621</span>&#160;                VkResult res = AllocateFromBlock(</div>
-<div class="line"><a name="l12622"></a><span class="lineno">12622</span>&#160;                    pCurrBlock,</div>
-<div class="line"><a name="l12623"></a><span class="lineno">12623</span>&#160;                    currentFrameIndex,</div>
-<div class="line"><a name="l12624"></a><span class="lineno">12624</span>&#160;                    size,</div>
-<div class="line"><a name="l12625"></a><span class="lineno">12625</span>&#160;                    alignment,</div>
-<div class="line"><a name="l12626"></a><span class="lineno">12626</span>&#160;                    allocFlagsCopy,</div>
-<div class="line"><a name="l12627"></a><span class="lineno">12627</span>&#160;                    createInfo.<a class="code" href="struct_vma_allocation_create_info.html#a8259e85c272683434f4abb4ddddffe19">pUserData</a>,</div>
-<div class="line"><a name="l12628"></a><span class="lineno">12628</span>&#160;                    suballocType,</div>
-<div class="line"><a name="l12629"></a><span class="lineno">12629</span>&#160;                    strategy,</div>
-<div class="line"><a name="l12630"></a><span class="lineno">12630</span>&#160;                    pAllocation);</div>
-<div class="line"><a name="l12631"></a><span class="lineno">12631</span>&#160;                <span class="keywordflow">if</span>(res == VK_SUCCESS)</div>
-<div class="line"><a name="l12632"></a><span class="lineno">12632</span>&#160;                {</div>
-<div class="line"><a name="l12633"></a><span class="lineno">12633</span>&#160;                    VMA_DEBUG_LOG(<span class="stringliteral">&quot;    Returned from last block #%u&quot;</span>, pCurrBlock-&gt;GetId());</div>
-<div class="line"><a name="l12634"></a><span class="lineno">12634</span>&#160;                    <span class="keywordflow">return</span> VK_SUCCESS;</div>
-<div class="line"><a name="l12635"></a><span class="lineno">12635</span>&#160;                }</div>
-<div class="line"><a name="l12636"></a><span class="lineno">12636</span>&#160;            }</div>
-<div class="line"><a name="l12637"></a><span class="lineno">12637</span>&#160;        }</div>
-<div class="line"><a name="l12638"></a><span class="lineno">12638</span>&#160;        <span class="keywordflow">else</span></div>
-<div class="line"><a name="l12639"></a><span class="lineno">12639</span>&#160;        {</div>
-<div class="line"><a name="l12640"></a><span class="lineno">12640</span>&#160;            <span class="keywordflow">if</span>(strategy == <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a839826775c62319466441f86496f036d">VMA_ALLOCATION_CREATE_STRATEGY_BEST_FIT_BIT</a>)</div>
-<div class="line"><a name="l12641"></a><span class="lineno">12641</span>&#160;            {</div>
-<div class="line"><a name="l12642"></a><span class="lineno">12642</span>&#160;                <span class="comment">// Forward order in m_Blocks - prefer blocks with smallest amount of free space.</span></div>
-<div class="line"><a name="l12643"></a><span class="lineno">12643</span>&#160;                <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> blockIndex = 0; blockIndex &lt; m_Blocks.size(); ++blockIndex )</div>
-<div class="line"><a name="l12644"></a><span class="lineno">12644</span>&#160;                {</div>
-<div class="line"><a name="l12645"></a><span class="lineno">12645</span>&#160;                    VmaDeviceMemoryBlock* <span class="keyword">const</span> pCurrBlock = m_Blocks[blockIndex];</div>
-<div class="line"><a name="l12646"></a><span class="lineno">12646</span>&#160;                    VMA_ASSERT(pCurrBlock);</div>
-<div class="line"><a name="l12647"></a><span class="lineno">12647</span>&#160;                    VkResult res = AllocateFromBlock(</div>
-<div class="line"><a name="l12648"></a><span class="lineno">12648</span>&#160;                        pCurrBlock,</div>
-<div class="line"><a name="l12649"></a><span class="lineno">12649</span>&#160;                        currentFrameIndex,</div>
-<div class="line"><a name="l12650"></a><span class="lineno">12650</span>&#160;                        size,</div>
-<div class="line"><a name="l12651"></a><span class="lineno">12651</span>&#160;                        alignment,</div>
-<div class="line"><a name="l12652"></a><span class="lineno">12652</span>&#160;                        allocFlagsCopy,</div>
-<div class="line"><a name="l12653"></a><span class="lineno">12653</span>&#160;                        createInfo.<a class="code" href="struct_vma_allocation_create_info.html#a8259e85c272683434f4abb4ddddffe19">pUserData</a>,</div>
-<div class="line"><a name="l12654"></a><span class="lineno">12654</span>&#160;                        suballocType,</div>
-<div class="line"><a name="l12655"></a><span class="lineno">12655</span>&#160;                        strategy,</div>
-<div class="line"><a name="l12656"></a><span class="lineno">12656</span>&#160;                        pAllocation);</div>
-<div class="line"><a name="l12657"></a><span class="lineno">12657</span>&#160;                    <span class="keywordflow">if</span>(res == VK_SUCCESS)</div>
-<div class="line"><a name="l12658"></a><span class="lineno">12658</span>&#160;                    {</div>
-<div class="line"><a name="l12659"></a><span class="lineno">12659</span>&#160;                        VMA_DEBUG_LOG(<span class="stringliteral">&quot;    Returned from existing block #%u&quot;</span>, pCurrBlock-&gt;GetId());</div>
-<div class="line"><a name="l12660"></a><span class="lineno">12660</span>&#160;                        <span class="keywordflow">return</span> VK_SUCCESS;</div>
-<div class="line"><a name="l12661"></a><span class="lineno">12661</span>&#160;                    }</div>
-<div class="line"><a name="l12662"></a><span class="lineno">12662</span>&#160;                }</div>
-<div class="line"><a name="l12663"></a><span class="lineno">12663</span>&#160;            }</div>
-<div class="line"><a name="l12664"></a><span class="lineno">12664</span>&#160;            <span class="keywordflow">else</span> <span class="comment">// WORST_FIT, FIRST_FIT</span></div>
-<div class="line"><a name="l12665"></a><span class="lineno">12665</span>&#160;            {</div>
-<div class="line"><a name="l12666"></a><span class="lineno">12666</span>&#160;                <span class="comment">// Backward order in m_Blocks - prefer blocks with largest amount of free space.</span></div>
-<div class="line"><a name="l12667"></a><span class="lineno">12667</span>&#160;                <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> blockIndex = m_Blocks.size(); blockIndex--; )</div>
-<div class="line"><a name="l12668"></a><span class="lineno">12668</span>&#160;                {</div>
-<div class="line"><a name="l12669"></a><span class="lineno">12669</span>&#160;                    VmaDeviceMemoryBlock* <span class="keyword">const</span> pCurrBlock = m_Blocks[blockIndex];</div>
-<div class="line"><a name="l12670"></a><span class="lineno">12670</span>&#160;                    VMA_ASSERT(pCurrBlock);</div>
-<div class="line"><a name="l12671"></a><span class="lineno">12671</span>&#160;                    VkResult res = AllocateFromBlock(</div>
-<div class="line"><a name="l12672"></a><span class="lineno">12672</span>&#160;                        pCurrBlock,</div>
-<div class="line"><a name="l12673"></a><span class="lineno">12673</span>&#160;                        currentFrameIndex,</div>
-<div class="line"><a name="l12674"></a><span class="lineno">12674</span>&#160;                        size,</div>
-<div class="line"><a name="l12675"></a><span class="lineno">12675</span>&#160;                        alignment,</div>
-<div class="line"><a name="l12676"></a><span class="lineno">12676</span>&#160;                        allocFlagsCopy,</div>
-<div class="line"><a name="l12677"></a><span class="lineno">12677</span>&#160;                        createInfo.<a class="code" href="struct_vma_allocation_create_info.html#a8259e85c272683434f4abb4ddddffe19">pUserData</a>,</div>
-<div class="line"><a name="l12678"></a><span class="lineno">12678</span>&#160;                        suballocType,</div>
-<div class="line"><a name="l12679"></a><span class="lineno">12679</span>&#160;                        strategy,</div>
-<div class="line"><a name="l12680"></a><span class="lineno">12680</span>&#160;                        pAllocation);</div>
-<div class="line"><a name="l12681"></a><span class="lineno">12681</span>&#160;                    <span class="keywordflow">if</span>(res == VK_SUCCESS)</div>
-<div class="line"><a name="l12682"></a><span class="lineno">12682</span>&#160;                    {</div>
-<div class="line"><a name="l12683"></a><span class="lineno">12683</span>&#160;                        VMA_DEBUG_LOG(<span class="stringliteral">&quot;    Returned from existing block #%u&quot;</span>, pCurrBlock-&gt;GetId());</div>
-<div class="line"><a name="l12684"></a><span class="lineno">12684</span>&#160;                        <span class="keywordflow">return</span> VK_SUCCESS;</div>
-<div class="line"><a name="l12685"></a><span class="lineno">12685</span>&#160;                    }</div>
-<div class="line"><a name="l12686"></a><span class="lineno">12686</span>&#160;                }</div>
-<div class="line"><a name="l12687"></a><span class="lineno">12687</span>&#160;            }</div>
-<div class="line"><a name="l12688"></a><span class="lineno">12688</span>&#160;        }</div>
-<div class="line"><a name="l12689"></a><span class="lineno">12689</span>&#160; </div>
-<div class="line"><a name="l12690"></a><span class="lineno">12690</span>&#160;        <span class="comment">// 2. Try to create new block.</span></div>
-<div class="line"><a name="l12691"></a><span class="lineno">12691</span>&#160;        <span class="keywordflow">if</span>(canCreateNewBlock)</div>
-<div class="line"><a name="l12692"></a><span class="lineno">12692</span>&#160;        {</div>
-<div class="line"><a name="l12693"></a><span class="lineno">12693</span>&#160;            <span class="comment">// Calculate optimal size for new block.</span></div>
-<div class="line"><a name="l12694"></a><span class="lineno">12694</span>&#160;            VkDeviceSize newBlockSize = m_PreferredBlockSize;</div>
-<div class="line"><a name="l12695"></a><span class="lineno">12695</span>&#160;            uint32_t newBlockSizeShift = 0;</div>
-<div class="line"><a name="l12696"></a><span class="lineno">12696</span>&#160;            <span class="keyword">const</span> uint32_t NEW_BLOCK_SIZE_SHIFT_MAX = 3;</div>
-<div class="line"><a name="l12697"></a><span class="lineno">12697</span>&#160; </div>
-<div class="line"><a name="l12698"></a><span class="lineno">12698</span>&#160;            <span class="keywordflow">if</span>(!m_ExplicitBlockSize)</div>
-<div class="line"><a name="l12699"></a><span class="lineno">12699</span>&#160;            {</div>
-<div class="line"><a name="l12700"></a><span class="lineno">12700</span>&#160;                <span class="comment">// Allocate 1/8, 1/4, 1/2 as first blocks.</span></div>
-<div class="line"><a name="l12701"></a><span class="lineno">12701</span>&#160;                <span class="keyword">const</span> VkDeviceSize maxExistingBlockSize = CalcMaxBlockSize();</div>
-<div class="line"><a name="l12702"></a><span class="lineno">12702</span>&#160;                <span class="keywordflow">for</span>(uint32_t i = 0; i &lt; NEW_BLOCK_SIZE_SHIFT_MAX; ++i)</div>
-<div class="line"><a name="l12703"></a><span class="lineno">12703</span>&#160;                {</div>
-<div class="line"><a name="l12704"></a><span class="lineno">12704</span>&#160;                    <span class="keyword">const</span> VkDeviceSize smallerNewBlockSize = newBlockSize / 2;</div>
-<div class="line"><a name="l12705"></a><span class="lineno">12705</span>&#160;                    <span class="keywordflow">if</span>(smallerNewBlockSize &gt; maxExistingBlockSize &amp;&amp; smallerNewBlockSize &gt;= size * 2)</div>
-<div class="line"><a name="l12706"></a><span class="lineno">12706</span>&#160;                    {</div>
-<div class="line"><a name="l12707"></a><span class="lineno">12707</span>&#160;                        newBlockSize = smallerNewBlockSize;</div>
-<div class="line"><a name="l12708"></a><span class="lineno">12708</span>&#160;                        ++newBlockSizeShift;</div>
-<div class="line"><a name="l12709"></a><span class="lineno">12709</span>&#160;                    }</div>
-<div class="line"><a name="l12710"></a><span class="lineno">12710</span>&#160;                    <span class="keywordflow">else</span></div>
-<div class="line"><a name="l12711"></a><span class="lineno">12711</span>&#160;                    {</div>
-<div class="line"><a name="l12712"></a><span class="lineno">12712</span>&#160;                        <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l12713"></a><span class="lineno">12713</span>&#160;                    }</div>
-<div class="line"><a name="l12714"></a><span class="lineno">12714</span>&#160;                }</div>
-<div class="line"><a name="l12715"></a><span class="lineno">12715</span>&#160;            }</div>
-<div class="line"><a name="l12716"></a><span class="lineno">12716</span>&#160; </div>
-<div class="line"><a name="l12717"></a><span class="lineno">12717</span>&#160;            <span class="keywordtype">size_t</span> newBlockIndex = 0;</div>
-<div class="line"><a name="l12718"></a><span class="lineno">12718</span>&#160;            VkResult res = (newBlockSize &lt;= freeMemory || !canFallbackToDedicated) ?</div>
-<div class="line"><a name="l12719"></a><span class="lineno">12719</span>&#160;                CreateBlock(newBlockSize, &amp;newBlockIndex) : VK_ERROR_OUT_OF_DEVICE_MEMORY;</div>
-<div class="line"><a name="l12720"></a><span class="lineno">12720</span>&#160;            <span class="comment">// Allocation of this size failed? Try 1/2, 1/4, 1/8 of m_PreferredBlockSize.</span></div>
-<div class="line"><a name="l12721"></a><span class="lineno">12721</span>&#160;            <span class="keywordflow">if</span>(!m_ExplicitBlockSize)</div>
-<div class="line"><a name="l12722"></a><span class="lineno">12722</span>&#160;            {</div>
-<div class="line"><a name="l12723"></a><span class="lineno">12723</span>&#160;                <span class="keywordflow">while</span>(res &lt; 0 &amp;&amp; newBlockSizeShift &lt; NEW_BLOCK_SIZE_SHIFT_MAX)</div>
-<div class="line"><a name="l12724"></a><span class="lineno">12724</span>&#160;                {</div>
-<div class="line"><a name="l12725"></a><span class="lineno">12725</span>&#160;                    <span class="keyword">const</span> VkDeviceSize smallerNewBlockSize = newBlockSize / 2;</div>
-<div class="line"><a name="l12726"></a><span class="lineno">12726</span>&#160;                    <span class="keywordflow">if</span>(smallerNewBlockSize &gt;= size)</div>
-<div class="line"><a name="l12727"></a><span class="lineno">12727</span>&#160;                    {</div>
-<div class="line"><a name="l12728"></a><span class="lineno">12728</span>&#160;                        newBlockSize = smallerNewBlockSize;</div>
-<div class="line"><a name="l12729"></a><span class="lineno">12729</span>&#160;                        ++newBlockSizeShift;</div>
-<div class="line"><a name="l12730"></a><span class="lineno">12730</span>&#160;                        res = (newBlockSize &lt;= freeMemory || !canFallbackToDedicated) ?</div>
-<div class="line"><a name="l12731"></a><span class="lineno">12731</span>&#160;                            CreateBlock(newBlockSize, &amp;newBlockIndex) : VK_ERROR_OUT_OF_DEVICE_MEMORY;</div>
-<div class="line"><a name="l12732"></a><span class="lineno">12732</span>&#160;                    }</div>
-<div class="line"><a name="l12733"></a><span class="lineno">12733</span>&#160;                    <span class="keywordflow">else</span></div>
-<div class="line"><a name="l12734"></a><span class="lineno">12734</span>&#160;                    {</div>
-<div class="line"><a name="l12735"></a><span class="lineno">12735</span>&#160;                        <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l12736"></a><span class="lineno">12736</span>&#160;                    }</div>
-<div class="line"><a name="l12737"></a><span class="lineno">12737</span>&#160;                }</div>
-<div class="line"><a name="l12738"></a><span class="lineno">12738</span>&#160;            }</div>
-<div class="line"><a name="l12739"></a><span class="lineno">12739</span>&#160; </div>
-<div class="line"><a name="l12740"></a><span class="lineno">12740</span>&#160;            <span class="keywordflow">if</span>(res == VK_SUCCESS)</div>
-<div class="line"><a name="l12741"></a><span class="lineno">12741</span>&#160;            {</div>
-<div class="line"><a name="l12742"></a><span class="lineno">12742</span>&#160;                VmaDeviceMemoryBlock* <span class="keyword">const</span> pBlock = m_Blocks[newBlockIndex];</div>
-<div class="line"><a name="l12743"></a><span class="lineno">12743</span>&#160;                VMA_ASSERT(pBlock-&gt;m_pMetadata-&gt;GetSize() &gt;= size);</div>
-<div class="line"><a name="l12744"></a><span class="lineno">12744</span>&#160; </div>
-<div class="line"><a name="l12745"></a><span class="lineno">12745</span>&#160;                res = AllocateFromBlock(</div>
-<div class="line"><a name="l12746"></a><span class="lineno">12746</span>&#160;                    pBlock,</div>
-<div class="line"><a name="l12747"></a><span class="lineno">12747</span>&#160;                    currentFrameIndex,</div>
-<div class="line"><a name="l12748"></a><span class="lineno">12748</span>&#160;                    size,</div>
-<div class="line"><a name="l12749"></a><span class="lineno">12749</span>&#160;                    alignment,</div>
-<div class="line"><a name="l12750"></a><span class="lineno">12750</span>&#160;                    allocFlagsCopy,</div>
-<div class="line"><a name="l12751"></a><span class="lineno">12751</span>&#160;                    createInfo.<a class="code" href="struct_vma_allocation_create_info.html#a8259e85c272683434f4abb4ddddffe19">pUserData</a>,</div>
-<div class="line"><a name="l12752"></a><span class="lineno">12752</span>&#160;                    suballocType,</div>
-<div class="line"><a name="l12753"></a><span class="lineno">12753</span>&#160;                    strategy,</div>
-<div class="line"><a name="l12754"></a><span class="lineno">12754</span>&#160;                    pAllocation);</div>
-<div class="line"><a name="l12755"></a><span class="lineno">12755</span>&#160;                <span class="keywordflow">if</span>(res == VK_SUCCESS)</div>
-<div class="line"><a name="l12756"></a><span class="lineno">12756</span>&#160;                {</div>
-<div class="line"><a name="l12757"></a><span class="lineno">12757</span>&#160;                    VMA_DEBUG_LOG(<span class="stringliteral">&quot;    Created new block #%u Size=%llu&quot;</span>, pBlock-&gt;GetId(), newBlockSize);</div>
-<div class="line"><a name="l12758"></a><span class="lineno">12758</span>&#160;                    <span class="keywordflow">return</span> VK_SUCCESS;</div>
-<div class="line"><a name="l12759"></a><span class="lineno">12759</span>&#160;                }</div>
-<div class="line"><a name="l12760"></a><span class="lineno">12760</span>&#160;                <span class="keywordflow">else</span></div>
-<div class="line"><a name="l12761"></a><span class="lineno">12761</span>&#160;                {</div>
-<div class="line"><a name="l12762"></a><span class="lineno">12762</span>&#160;                    <span class="comment">// Allocation from new block failed, possibly due to VMA_DEBUG_MARGIN or alignment.</span></div>
-<div class="line"><a name="l12763"></a><span class="lineno">12763</span>&#160;                    <span class="keywordflow">return</span> VK_ERROR_OUT_OF_DEVICE_MEMORY;</div>
-<div class="line"><a name="l12764"></a><span class="lineno">12764</span>&#160;                }</div>
-<div class="line"><a name="l12765"></a><span class="lineno">12765</span>&#160;            }</div>
-<div class="line"><a name="l12766"></a><span class="lineno">12766</span>&#160;        }</div>
-<div class="line"><a name="l12767"></a><span class="lineno">12767</span>&#160;    }</div>
-<div class="line"><a name="l12768"></a><span class="lineno">12768</span>&#160; </div>
-<div class="line"><a name="l12769"></a><span class="lineno">12769</span>&#160;    <span class="comment">// 3. Try to allocate from existing blocks with making other allocations lost.</span></div>
-<div class="line"><a name="l12770"></a><span class="lineno">12770</span>&#160;    <span class="keywordflow">if</span>(canMakeOtherLost)</div>
-<div class="line"><a name="l12771"></a><span class="lineno">12771</span>&#160;    {</div>
-<div class="line"><a name="l12772"></a><span class="lineno">12772</span>&#160;        uint32_t tryIndex = 0;</div>
-<div class="line"><a name="l12773"></a><span class="lineno">12773</span>&#160;        <span class="keywordflow">for</span>(; tryIndex &lt; VMA_ALLOCATION_TRY_COUNT; ++tryIndex)</div>
-<div class="line"><a name="l12774"></a><span class="lineno">12774</span>&#160;        {</div>
-<div class="line"><a name="l12775"></a><span class="lineno">12775</span>&#160;            VmaDeviceMemoryBlock* pBestRequestBlock = VMA_NULL;</div>
-<div class="line"><a name="l12776"></a><span class="lineno">12776</span>&#160;            VmaAllocationRequest bestRequest = {};</div>
-<div class="line"><a name="l12777"></a><span class="lineno">12777</span>&#160;            VkDeviceSize bestRequestCost = VK_WHOLE_SIZE;</div>
-<div class="line"><a name="l12778"></a><span class="lineno">12778</span>&#160; </div>
-<div class="line"><a name="l12779"></a><span class="lineno">12779</span>&#160;            <span class="comment">// 1. Search existing allocations.</span></div>
-<div class="line"><a name="l12780"></a><span class="lineno">12780</span>&#160;            <span class="keywordflow">if</span>(strategy == <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a839826775c62319466441f86496f036d">VMA_ALLOCATION_CREATE_STRATEGY_BEST_FIT_BIT</a>)</div>
-<div class="line"><a name="l12781"></a><span class="lineno">12781</span>&#160;            {</div>
-<div class="line"><a name="l12782"></a><span class="lineno">12782</span>&#160;                <span class="comment">// Forward order in m_Blocks - prefer blocks with smallest amount of free space.</span></div>
-<div class="line"><a name="l12783"></a><span class="lineno">12783</span>&#160;                <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> blockIndex = 0; blockIndex &lt; m_Blocks.size(); ++blockIndex )</div>
-<div class="line"><a name="l12784"></a><span class="lineno">12784</span>&#160;                {</div>
-<div class="line"><a name="l12785"></a><span class="lineno">12785</span>&#160;                    VmaDeviceMemoryBlock* <span class="keyword">const</span> pCurrBlock = m_Blocks[blockIndex];</div>
-<div class="line"><a name="l12786"></a><span class="lineno">12786</span>&#160;                    VMA_ASSERT(pCurrBlock);</div>
-<div class="line"><a name="l12787"></a><span class="lineno">12787</span>&#160;                    VmaAllocationRequest currRequest = {};</div>
-<div class="line"><a name="l12788"></a><span class="lineno">12788</span>&#160;                    <span class="keywordflow">if</span>(pCurrBlock-&gt;m_pMetadata-&gt;CreateAllocationRequest(</div>
-<div class="line"><a name="l12789"></a><span class="lineno">12789</span>&#160;                        currentFrameIndex,</div>
-<div class="line"><a name="l12790"></a><span class="lineno">12790</span>&#160;                        m_FrameInUseCount,</div>
-<div class="line"><a name="l12791"></a><span class="lineno">12791</span>&#160;                        m_BufferImageGranularity,</div>
-<div class="line"><a name="l12792"></a><span class="lineno">12792</span>&#160;                        size,</div>
-<div class="line"><a name="l12793"></a><span class="lineno">12793</span>&#160;                        alignment,</div>
-<div class="line"><a name="l12794"></a><span class="lineno">12794</span>&#160;                        (createInfo.<a class="code" href="struct_vma_allocation_create_info.html#add09658ac14fe290ace25470ddd6d41b">flags</a> &amp; <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a42ba3a2d2c7117953210b7c3ef8da0df">VMA_ALLOCATION_CREATE_UPPER_ADDRESS_BIT</a>) != 0,</div>
-<div class="line"><a name="l12795"></a><span class="lineno">12795</span>&#160;                        suballocType,</div>
-<div class="line"><a name="l12796"></a><span class="lineno">12796</span>&#160;                        canMakeOtherLost,</div>
-<div class="line"><a name="l12797"></a><span class="lineno">12797</span>&#160;                        strategy,</div>
-<div class="line"><a name="l12798"></a><span class="lineno">12798</span>&#160;                        &amp;currRequest))</div>
-<div class="line"><a name="l12799"></a><span class="lineno">12799</span>&#160;                    {</div>
-<div class="line"><a name="l12800"></a><span class="lineno">12800</span>&#160;                        <span class="keyword">const</span> VkDeviceSize currRequestCost = currRequest.CalcCost();</div>
-<div class="line"><a name="l12801"></a><span class="lineno">12801</span>&#160;                        <span class="keywordflow">if</span>(pBestRequestBlock == VMA_NULL ||</div>
-<div class="line"><a name="l12802"></a><span class="lineno">12802</span>&#160;                            currRequestCost &lt; bestRequestCost)</div>
-<div class="line"><a name="l12803"></a><span class="lineno">12803</span>&#160;                        {</div>
-<div class="line"><a name="l12804"></a><span class="lineno">12804</span>&#160;                            pBestRequestBlock = pCurrBlock;</div>
-<div class="line"><a name="l12805"></a><span class="lineno">12805</span>&#160;                            bestRequest = currRequest;</div>
-<div class="line"><a name="l12806"></a><span class="lineno">12806</span>&#160;                            bestRequestCost = currRequestCost;</div>
-<div class="line"><a name="l12807"></a><span class="lineno">12807</span>&#160; </div>
-<div class="line"><a name="l12808"></a><span class="lineno">12808</span>&#160;                            <span class="keywordflow">if</span>(bestRequestCost == 0)</div>
-<div class="line"><a name="l12809"></a><span class="lineno">12809</span>&#160;                            {</div>
-<div class="line"><a name="l12810"></a><span class="lineno">12810</span>&#160;                                <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l12811"></a><span class="lineno">12811</span>&#160;                            }</div>
-<div class="line"><a name="l12812"></a><span class="lineno">12812</span>&#160;                        }</div>
-<div class="line"><a name="l12813"></a><span class="lineno">12813</span>&#160;                    }</div>
-<div class="line"><a name="l12814"></a><span class="lineno">12814</span>&#160;                }</div>
-<div class="line"><a name="l12815"></a><span class="lineno">12815</span>&#160;            }</div>
-<div class="line"><a name="l12816"></a><span class="lineno">12816</span>&#160;            <span class="keywordflow">else</span> <span class="comment">// WORST_FIT, FIRST_FIT</span></div>
-<div class="line"><a name="l12817"></a><span class="lineno">12817</span>&#160;            {</div>
-<div class="line"><a name="l12818"></a><span class="lineno">12818</span>&#160;                <span class="comment">// Backward order in m_Blocks - prefer blocks with largest amount of free space.</span></div>
-<div class="line"><a name="l12819"></a><span class="lineno">12819</span>&#160;                <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> blockIndex = m_Blocks.size(); blockIndex--; )</div>
-<div class="line"><a name="l12820"></a><span class="lineno">12820</span>&#160;                {</div>
-<div class="line"><a name="l12821"></a><span class="lineno">12821</span>&#160;                    VmaDeviceMemoryBlock* <span class="keyword">const</span> pCurrBlock = m_Blocks[blockIndex];</div>
-<div class="line"><a name="l12822"></a><span class="lineno">12822</span>&#160;                    VMA_ASSERT(pCurrBlock);</div>
-<div class="line"><a name="l12823"></a><span class="lineno">12823</span>&#160;                    VmaAllocationRequest currRequest = {};</div>
-<div class="line"><a name="l12824"></a><span class="lineno">12824</span>&#160;                    <span class="keywordflow">if</span>(pCurrBlock-&gt;m_pMetadata-&gt;CreateAllocationRequest(</div>
-<div class="line"><a name="l12825"></a><span class="lineno">12825</span>&#160;                        currentFrameIndex,</div>
-<div class="line"><a name="l12826"></a><span class="lineno">12826</span>&#160;                        m_FrameInUseCount,</div>
-<div class="line"><a name="l12827"></a><span class="lineno">12827</span>&#160;                        m_BufferImageGranularity,</div>
-<div class="line"><a name="l12828"></a><span class="lineno">12828</span>&#160;                        size,</div>
-<div class="line"><a name="l12829"></a><span class="lineno">12829</span>&#160;                        alignment,</div>
-<div class="line"><a name="l12830"></a><span class="lineno">12830</span>&#160;                        (createInfo.<a class="code" href="struct_vma_allocation_create_info.html#add09658ac14fe290ace25470ddd6d41b">flags</a> &amp; <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a42ba3a2d2c7117953210b7c3ef8da0df">VMA_ALLOCATION_CREATE_UPPER_ADDRESS_BIT</a>) != 0,</div>
-<div class="line"><a name="l12831"></a><span class="lineno">12831</span>&#160;                        suballocType,</div>
-<div class="line"><a name="l12832"></a><span class="lineno">12832</span>&#160;                        canMakeOtherLost,</div>
-<div class="line"><a name="l12833"></a><span class="lineno">12833</span>&#160;                        strategy,</div>
-<div class="line"><a name="l12834"></a><span class="lineno">12834</span>&#160;                        &amp;currRequest))</div>
-<div class="line"><a name="l12835"></a><span class="lineno">12835</span>&#160;                    {</div>
-<div class="line"><a name="l12836"></a><span class="lineno">12836</span>&#160;                        <span class="keyword">const</span> VkDeviceSize currRequestCost = currRequest.CalcCost();</div>
-<div class="line"><a name="l12837"></a><span class="lineno">12837</span>&#160;                        <span class="keywordflow">if</span>(pBestRequestBlock == VMA_NULL ||</div>
-<div class="line"><a name="l12838"></a><span class="lineno">12838</span>&#160;                            currRequestCost &lt; bestRequestCost ||</div>
-<div class="line"><a name="l12839"></a><span class="lineno">12839</span>&#160;                            strategy == <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a33eb2052674f3ad92386c714a65fb777">VMA_ALLOCATION_CREATE_STRATEGY_FIRST_FIT_BIT</a>)</div>
-<div class="line"><a name="l12840"></a><span class="lineno">12840</span>&#160;                        {</div>
-<div class="line"><a name="l12841"></a><span class="lineno">12841</span>&#160;                            pBestRequestBlock = pCurrBlock;</div>
-<div class="line"><a name="l12842"></a><span class="lineno">12842</span>&#160;                            bestRequest = currRequest;</div>
-<div class="line"><a name="l12843"></a><span class="lineno">12843</span>&#160;                            bestRequestCost = currRequestCost;</div>
-<div class="line"><a name="l12844"></a><span class="lineno">12844</span>&#160; </div>
-<div class="line"><a name="l12845"></a><span class="lineno">12845</span>&#160;                            <span class="keywordflow">if</span>(bestRequestCost == 0 ||</div>
-<div class="line"><a name="l12846"></a><span class="lineno">12846</span>&#160;                                strategy == <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a33eb2052674f3ad92386c714a65fb777">VMA_ALLOCATION_CREATE_STRATEGY_FIRST_FIT_BIT</a>)</div>
-<div class="line"><a name="l12847"></a><span class="lineno">12847</span>&#160;                            {</div>
-<div class="line"><a name="l12848"></a><span class="lineno">12848</span>&#160;                                <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l12849"></a><span class="lineno">12849</span>&#160;                            }</div>
-<div class="line"><a name="l12850"></a><span class="lineno">12850</span>&#160;                        }</div>
-<div class="line"><a name="l12851"></a><span class="lineno">12851</span>&#160;                    }</div>
-<div class="line"><a name="l12852"></a><span class="lineno">12852</span>&#160;                }</div>
-<div class="line"><a name="l12853"></a><span class="lineno">12853</span>&#160;            }</div>
-<div class="line"><a name="l12854"></a><span class="lineno">12854</span>&#160; </div>
-<div class="line"><a name="l12855"></a><span class="lineno">12855</span>&#160;            <span class="keywordflow">if</span>(pBestRequestBlock != VMA_NULL)</div>
-<div class="line"><a name="l12856"></a><span class="lineno">12856</span>&#160;            {</div>
-<div class="line"><a name="l12857"></a><span class="lineno">12857</span>&#160;                <span class="keywordflow">if</span>(mapped)</div>
-<div class="line"><a name="l12858"></a><span class="lineno">12858</span>&#160;                {</div>
-<div class="line"><a name="l12859"></a><span class="lineno">12859</span>&#160;                    VkResult res = pBestRequestBlock-&gt;Map(m_hAllocator, 1, VMA_NULL);</div>
-<div class="line"><a name="l12860"></a><span class="lineno">12860</span>&#160;                    <span class="keywordflow">if</span>(res != VK_SUCCESS)</div>
-<div class="line"><a name="l12861"></a><span class="lineno">12861</span>&#160;                    {</div>
-<div class="line"><a name="l12862"></a><span class="lineno">12862</span>&#160;                        <span class="keywordflow">return</span> res;</div>
-<div class="line"><a name="l12863"></a><span class="lineno">12863</span>&#160;                    }</div>
-<div class="line"><a name="l12864"></a><span class="lineno">12864</span>&#160;                }</div>
-<div class="line"><a name="l12865"></a><span class="lineno">12865</span>&#160; </div>
-<div class="line"><a name="l12866"></a><span class="lineno">12866</span>&#160;                <span class="keywordflow">if</span>(pBestRequestBlock-&gt;m_pMetadata-&gt;MakeRequestedAllocationsLost(</div>
-<div class="line"><a name="l12867"></a><span class="lineno">12867</span>&#160;                    currentFrameIndex,</div>
-<div class="line"><a name="l12868"></a><span class="lineno">12868</span>&#160;                    m_FrameInUseCount,</div>
-<div class="line"><a name="l12869"></a><span class="lineno">12869</span>&#160;                    &amp;bestRequest))</div>
-<div class="line"><a name="l12870"></a><span class="lineno">12870</span>&#160;                {</div>
-<div class="line"><a name="l12871"></a><span class="lineno">12871</span>&#160;                    <span class="comment">// Allocate from this pBlock.</span></div>
-<div class="line"><a name="l12872"></a><span class="lineno">12872</span>&#160;                    *pAllocation = m_hAllocator-&gt;m_AllocationObjectAllocator.Allocate(currentFrameIndex, isUserDataString);</div>
-<div class="line"><a name="l12873"></a><span class="lineno">12873</span>&#160;                    pBestRequestBlock-&gt;m_pMetadata-&gt;Alloc(bestRequest, suballocType, size, *pAllocation);</div>
-<div class="line"><a name="l12874"></a><span class="lineno">12874</span>&#160;                    UpdateHasEmptyBlock();</div>
-<div class="line"><a name="l12875"></a><span class="lineno">12875</span>&#160;                    (*pAllocation)-&gt;InitBlockAllocation(</div>
-<div class="line"><a name="l12876"></a><span class="lineno">12876</span>&#160;                        pBestRequestBlock,</div>
-<div class="line"><a name="l12877"></a><span class="lineno">12877</span>&#160;                        bestRequest.offset,</div>
-<div class="line"><a name="l12878"></a><span class="lineno">12878</span>&#160;                        alignment,</div>
-<div class="line"><a name="l12879"></a><span class="lineno">12879</span>&#160;                        size,</div>
-<div class="line"><a name="l12880"></a><span class="lineno">12880</span>&#160;                        m_MemoryTypeIndex,</div>
-<div class="line"><a name="l12881"></a><span class="lineno">12881</span>&#160;                        suballocType,</div>
-<div class="line"><a name="l12882"></a><span class="lineno">12882</span>&#160;                        mapped,</div>
-<div class="line"><a name="l12883"></a><span class="lineno">12883</span>&#160;                        (createInfo.<a class="code" href="struct_vma_allocation_create_info.html#add09658ac14fe290ace25470ddd6d41b">flags</a> &amp; <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a5f436af6c8fe8540573a6d22627a6fd2">VMA_ALLOCATION_CREATE_CAN_BECOME_LOST_BIT</a>) != 0);</div>
-<div class="line"><a name="l12884"></a><span class="lineno">12884</span>&#160;                    VMA_HEAVY_ASSERT(pBestRequestBlock-&gt;Validate());</div>
-<div class="line"><a name="l12885"></a><span class="lineno">12885</span>&#160;                    VMA_DEBUG_LOG(<span class="stringliteral">&quot;    Returned from existing block&quot;</span>);</div>
-<div class="line"><a name="l12886"></a><span class="lineno">12886</span>&#160;                    (*pAllocation)-&gt;SetUserData(m_hAllocator, createInfo.<a class="code" href="struct_vma_allocation_create_info.html#a8259e85c272683434f4abb4ddddffe19">pUserData</a>);</div>
-<div class="line"><a name="l12887"></a><span class="lineno">12887</span>&#160;                    m_hAllocator-&gt;m_Budget.AddAllocation(m_hAllocator-&gt;MemoryTypeIndexToHeapIndex(m_MemoryTypeIndex), size);</div>
-<div class="line"><a name="l12888"></a><span class="lineno">12888</span>&#160;                    <span class="keywordflow">if</span>(VMA_DEBUG_INITIALIZE_ALLOCATIONS)</div>
-<div class="line"><a name="l12889"></a><span class="lineno">12889</span>&#160;                    {</div>
-<div class="line"><a name="l12890"></a><span class="lineno">12890</span>&#160;                        m_hAllocator-&gt;FillAllocation(*pAllocation, VMA_ALLOCATION_FILL_PATTERN_CREATED);</div>
-<div class="line"><a name="l12891"></a><span class="lineno">12891</span>&#160;                    }</div>
-<div class="line"><a name="l12892"></a><span class="lineno">12892</span>&#160;                    <span class="keywordflow">if</span>(IsCorruptionDetectionEnabled())</div>
-<div class="line"><a name="l12893"></a><span class="lineno">12893</span>&#160;                    {</div>
-<div class="line"><a name="l12894"></a><span class="lineno">12894</span>&#160;                        VkResult res = pBestRequestBlock-&gt;WriteMagicValueAroundAllocation(m_hAllocator, bestRequest.offset, size);</div>
-<div class="line"><a name="l12895"></a><span class="lineno">12895</span>&#160;                        VMA_ASSERT(res == VK_SUCCESS &amp;&amp; <span class="stringliteral">&quot;Couldn&#39;t map block memory to write magic value.&quot;</span>);</div>
-<div class="line"><a name="l12896"></a><span class="lineno">12896</span>&#160;                    }</div>
-<div class="line"><a name="l12897"></a><span class="lineno">12897</span>&#160;                    <span class="keywordflow">return</span> VK_SUCCESS;</div>
-<div class="line"><a name="l12898"></a><span class="lineno">12898</span>&#160;                }</div>
-<div class="line"><a name="l12899"></a><span class="lineno">12899</span>&#160;                <span class="comment">// else: Some allocations must have been touched while we are here. Next try.</span></div>
-<div class="line"><a name="l12900"></a><span class="lineno">12900</span>&#160;            }</div>
-<div class="line"><a name="l12901"></a><span class="lineno">12901</span>&#160;            <span class="keywordflow">else</span></div>
-<div class="line"><a name="l12902"></a><span class="lineno">12902</span>&#160;            {</div>
-<div class="line"><a name="l12903"></a><span class="lineno">12903</span>&#160;                <span class="comment">// Could not find place in any of the blocks - break outer loop.</span></div>
-<div class="line"><a name="l12904"></a><span class="lineno">12904</span>&#160;                <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l12905"></a><span class="lineno">12905</span>&#160;            }</div>
-<div class="line"><a name="l12906"></a><span class="lineno">12906</span>&#160;        }</div>
-<div class="line"><a name="l12907"></a><span class="lineno">12907</span>&#160;        <span class="comment">/* Maximum number of tries exceeded - a very unlike event when many other</span></div>
-<div class="line"><a name="l12908"></a><span class="lineno">12908</span>&#160;<span class="comment">        threads are simultaneously touching allocations making it impossible to make</span></div>
-<div class="line"><a name="l12909"></a><span class="lineno">12909</span>&#160;<span class="comment">        lost at the same time as we try to allocate. */</span></div>
-<div class="line"><a name="l12910"></a><span class="lineno">12910</span>&#160;        <span class="keywordflow">if</span>(tryIndex == VMA_ALLOCATION_TRY_COUNT)</div>
-<div class="line"><a name="l12911"></a><span class="lineno">12911</span>&#160;        {</div>
-<div class="line"><a name="l12912"></a><span class="lineno">12912</span>&#160;            <span class="keywordflow">return</span> VK_ERROR_TOO_MANY_OBJECTS;</div>
-<div class="line"><a name="l12913"></a><span class="lineno">12913</span>&#160;        }</div>
-<div class="line"><a name="l12914"></a><span class="lineno">12914</span>&#160;    }</div>
-<div class="line"><a name="l12915"></a><span class="lineno">12915</span>&#160; </div>
-<div class="line"><a name="l12916"></a><span class="lineno">12916</span>&#160;    <span class="keywordflow">return</span> VK_ERROR_OUT_OF_DEVICE_MEMORY;</div>
-<div class="line"><a name="l12917"></a><span class="lineno">12917</span>&#160;}</div>
-<div class="line"><a name="l12918"></a><span class="lineno">12918</span>&#160; </div>
-<div class="line"><a name="l12919"></a><span class="lineno">12919</span>&#160;<span class="keywordtype">void</span> VmaBlockVector::Free(</div>
-<div class="line"><a name="l12920"></a><span class="lineno">12920</span>&#160;    <span class="keyword">const</span> <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> hAllocation)</div>
-<div class="line"><a name="l12921"></a><span class="lineno">12921</span>&#160;{</div>
-<div class="line"><a name="l12922"></a><span class="lineno">12922</span>&#160;    VmaDeviceMemoryBlock* pBlockToDelete = VMA_NULL;</div>
-<div class="line"><a name="l12923"></a><span class="lineno">12923</span>&#160; </div>
-<div class="line"><a name="l12924"></a><span class="lineno">12924</span>&#160;    <span class="keywordtype">bool</span> budgetExceeded = <span class="keyword">false</span>;</div>
-<div class="line"><a name="l12925"></a><span class="lineno">12925</span>&#160;    {</div>
-<div class="line"><a name="l12926"></a><span class="lineno">12926</span>&#160;        <span class="keyword">const</span> uint32_t heapIndex = m_hAllocator-&gt;MemoryTypeIndexToHeapIndex(m_MemoryTypeIndex);</div>
-<div class="line"><a name="l12927"></a><span class="lineno">12927</span>&#160;        <a class="code" href="struct_vma_budget.html">VmaBudget</a> heapBudget = {};</div>
-<div class="line"><a name="l12928"></a><span class="lineno">12928</span>&#160;        m_hAllocator-&gt;GetBudget(&amp;heapBudget, heapIndex, 1);</div>
-<div class="line"><a name="l12929"></a><span class="lineno">12929</span>&#160;        budgetExceeded = heapBudget.<a class="code" href="struct_vma_budget.html#a84dd1ecca8b0110259eb206dbadb11f6">usage</a> &gt;= heapBudget.<a class="code" href="struct_vma_budget.html#ab82e1d1754c2d210d0bdf90220bc6cdd">budget</a>;</div>
-<div class="line"><a name="l12930"></a><span class="lineno">12930</span>&#160;    }</div>
-<div class="line"><a name="l12931"></a><span class="lineno">12931</span>&#160; </div>
-<div class="line"><a name="l12932"></a><span class="lineno">12932</span>&#160;    <span class="comment">// Scope for lock.</span></div>
-<div class="line"><a name="l12933"></a><span class="lineno">12933</span>&#160;    {</div>
-<div class="line"><a name="l12934"></a><span class="lineno">12934</span>&#160;        VmaMutexLockWrite lock(m_Mutex, m_hAllocator-&gt;m_UseMutex);</div>
-<div class="line"><a name="l12935"></a><span class="lineno">12935</span>&#160; </div>
-<div class="line"><a name="l12936"></a><span class="lineno">12936</span>&#160;        VmaDeviceMemoryBlock* pBlock = hAllocation-&gt;GetBlock();</div>
-<div class="line"><a name="l12937"></a><span class="lineno">12937</span>&#160; </div>
-<div class="line"><a name="l12938"></a><span class="lineno">12938</span>&#160;        <span class="keywordflow">if</span>(IsCorruptionDetectionEnabled())</div>
-<div class="line"><a name="l12939"></a><span class="lineno">12939</span>&#160;        {</div>
-<div class="line"><a name="l12940"></a><span class="lineno">12940</span>&#160;            VkResult res = pBlock-&gt;ValidateMagicValueAroundAllocation(m_hAllocator, hAllocation-&gt;GetOffset(), hAllocation-&gt;GetSize());</div>
-<div class="line"><a name="l12941"></a><span class="lineno">12941</span>&#160;            VMA_ASSERT(res == VK_SUCCESS &amp;&amp; <span class="stringliteral">&quot;Couldn&#39;t map block memory to validate magic value.&quot;</span>);</div>
-<div class="line"><a name="l12942"></a><span class="lineno">12942</span>&#160;        }</div>
-<div class="line"><a name="l12943"></a><span class="lineno">12943</span>&#160; </div>
-<div class="line"><a name="l12944"></a><span class="lineno">12944</span>&#160;        <span class="keywordflow">if</span>(hAllocation-&gt;IsPersistentMap())</div>
-<div class="line"><a name="l12945"></a><span class="lineno">12945</span>&#160;        {</div>
-<div class="line"><a name="l12946"></a><span class="lineno">12946</span>&#160;            pBlock-&gt;Unmap(m_hAllocator, 1);</div>
-<div class="line"><a name="l12947"></a><span class="lineno">12947</span>&#160;        }</div>
-<div class="line"><a name="l12948"></a><span class="lineno">12948</span>&#160; </div>
-<div class="line"><a name="l12949"></a><span class="lineno">12949</span>&#160;        pBlock-&gt;m_pMetadata-&gt;Free(hAllocation);</div>
-<div class="line"><a name="l12950"></a><span class="lineno">12950</span>&#160;        VMA_HEAVY_ASSERT(pBlock-&gt;Validate());</div>
-<div class="line"><a name="l12951"></a><span class="lineno">12951</span>&#160; </div>
-<div class="line"><a name="l12952"></a><span class="lineno">12952</span>&#160;        VMA_DEBUG_LOG(<span class="stringliteral">&quot;  Freed from MemoryTypeIndex=%u&quot;</span>, m_MemoryTypeIndex);</div>
-<div class="line"><a name="l12953"></a><span class="lineno">12953</span>&#160; </div>
-<div class="line"><a name="l12954"></a><span class="lineno">12954</span>&#160;        <span class="keyword">const</span> <span class="keywordtype">bool</span> canDeleteBlock = m_Blocks.size() &gt; m_MinBlockCount;</div>
-<div class="line"><a name="l12955"></a><span class="lineno">12955</span>&#160;        <span class="comment">// pBlock became empty after this deallocation.</span></div>
-<div class="line"><a name="l12956"></a><span class="lineno">12956</span>&#160;        <span class="keywordflow">if</span>(pBlock-&gt;m_pMetadata-&gt;IsEmpty())</div>
-<div class="line"><a name="l12957"></a><span class="lineno">12957</span>&#160;        {</div>
-<div class="line"><a name="l12958"></a><span class="lineno">12958</span>&#160;            <span class="comment">// Already has empty block. We don&#39;t want to have two, so delete this one.</span></div>
-<div class="line"><a name="l12959"></a><span class="lineno">12959</span>&#160;            <span class="keywordflow">if</span>((m_HasEmptyBlock || budgetExceeded) &amp;&amp; canDeleteBlock)</div>
-<div class="line"><a name="l12960"></a><span class="lineno">12960</span>&#160;            {</div>
-<div class="line"><a name="l12961"></a><span class="lineno">12961</span>&#160;                pBlockToDelete = pBlock;</div>
-<div class="line"><a name="l12962"></a><span class="lineno">12962</span>&#160;                Remove(pBlock);</div>
-<div class="line"><a name="l12963"></a><span class="lineno">12963</span>&#160;            }</div>
-<div class="line"><a name="l12964"></a><span class="lineno">12964</span>&#160;            <span class="comment">// else: We now have an empty block - leave it.</span></div>
-<div class="line"><a name="l12965"></a><span class="lineno">12965</span>&#160;        }</div>
-<div class="line"><a name="l12966"></a><span class="lineno">12966</span>&#160;        <span class="comment">// pBlock didn&#39;t become empty, but we have another empty block - find and free that one.</span></div>
-<div class="line"><a name="l12967"></a><span class="lineno">12967</span>&#160;        <span class="comment">// (This is optional, heuristics.)</span></div>
-<div class="line"><a name="l12968"></a><span class="lineno">12968</span>&#160;        <span class="keywordflow">else</span> <span class="keywordflow">if</span>(m_HasEmptyBlock &amp;&amp; canDeleteBlock)</div>
-<div class="line"><a name="l12969"></a><span class="lineno">12969</span>&#160;        {</div>
-<div class="line"><a name="l12970"></a><span class="lineno">12970</span>&#160;            VmaDeviceMemoryBlock* pLastBlock = m_Blocks.back();</div>
-<div class="line"><a name="l12971"></a><span class="lineno">12971</span>&#160;            <span class="keywordflow">if</span>(pLastBlock-&gt;m_pMetadata-&gt;IsEmpty())</div>
-<div class="line"><a name="l12972"></a><span class="lineno">12972</span>&#160;            {</div>
-<div class="line"><a name="l12973"></a><span class="lineno">12973</span>&#160;                pBlockToDelete = pLastBlock;</div>
-<div class="line"><a name="l12974"></a><span class="lineno">12974</span>&#160;                m_Blocks.pop_back();</div>
-<div class="line"><a name="l12975"></a><span class="lineno">12975</span>&#160;            }</div>
-<div class="line"><a name="l12976"></a><span class="lineno">12976</span>&#160;        }</div>
+<div class="line"><a name="l12589"></a><span class="lineno">12589</span>&#160;    <span class="keywordflow">case</span> Node::TYPE_SPLIT:</div>
+<div class="line"><a name="l12590"></a><span class="lineno">12590</span>&#160;        {</div>
+<div class="line"><a name="l12591"></a><span class="lineno">12591</span>&#160;            <span class="keyword">const</span> VkDeviceSize childrenNodeSize = levelNodeSize / 2;</div>
+<div class="line"><a name="l12592"></a><span class="lineno">12592</span>&#160;            <span class="keyword">const</span> Node* <span class="keyword">const</span> leftChild = node-&gt;split.leftChild;</div>
+<div class="line"><a name="l12593"></a><span class="lineno">12593</span>&#160;            PrintDetailedMapNode(json, leftChild, childrenNodeSize);</div>
+<div class="line"><a name="l12594"></a><span class="lineno">12594</span>&#160;            <span class="keyword">const</span> Node* <span class="keyword">const</span> rightChild = leftChild-&gt;buddy;</div>
+<div class="line"><a name="l12595"></a><span class="lineno">12595</span>&#160;            PrintDetailedMapNode(json, rightChild, childrenNodeSize);</div>
+<div class="line"><a name="l12596"></a><span class="lineno">12596</span>&#160;        }</div>
+<div class="line"><a name="l12597"></a><span class="lineno">12597</span>&#160;        <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l12598"></a><span class="lineno">12598</span>&#160;    <span class="keywordflow">default</span>:</div>
+<div class="line"><a name="l12599"></a><span class="lineno">12599</span>&#160;        VMA_ASSERT(0);</div>
+<div class="line"><a name="l12600"></a><span class="lineno">12600</span>&#160;    }</div>
+<div class="line"><a name="l12601"></a><span class="lineno">12601</span>&#160;}</div>
+<div class="line"><a name="l12602"></a><span class="lineno">12602</span>&#160;<span class="preprocessor">#endif </span><span class="comment">// #if VMA_STATS_STRING_ENABLED</span></div>
+<div class="line"><a name="l12603"></a><span class="lineno">12603</span>&#160; </div>
+<div class="line"><a name="l12604"></a><span class="lineno">12604</span>&#160; </div>
+<div class="line"><a name="l12606"></a><span class="lineno">12606</span>&#160;<span class="comment">// class VmaDeviceMemoryBlock</span></div>
+<div class="line"><a name="l12607"></a><span class="lineno">12607</span>&#160; </div>
+<div class="line"><a name="l12608"></a><span class="lineno">12608</span>&#160;VmaDeviceMemoryBlock::VmaDeviceMemoryBlock(<a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator) :</div>
+<div class="line"><a name="l12609"></a><span class="lineno">12609</span>&#160;    m_pMetadata(VMA_NULL),</div>
+<div class="line"><a name="l12610"></a><span class="lineno">12610</span>&#160;    m_MemoryTypeIndex(UINT32_MAX),</div>
+<div class="line"><a name="l12611"></a><span class="lineno">12611</span>&#160;    m_Id(0),</div>
+<div class="line"><a name="l12612"></a><span class="lineno">12612</span>&#160;    m_hMemory(VK_NULL_HANDLE),</div>
+<div class="line"><a name="l12613"></a><span class="lineno">12613</span>&#160;    m_MapCount(0),</div>
+<div class="line"><a name="l12614"></a><span class="lineno">12614</span>&#160;    m_pMappedData(VMA_NULL)</div>
+<div class="line"><a name="l12615"></a><span class="lineno">12615</span>&#160;{</div>
+<div class="line"><a name="l12616"></a><span class="lineno">12616</span>&#160;}</div>
+<div class="line"><a name="l12617"></a><span class="lineno">12617</span>&#160; </div>
+<div class="line"><a name="l12618"></a><span class="lineno">12618</span>&#160;<span class="keywordtype">void</span> VmaDeviceMemoryBlock::Init(</div>
+<div class="line"><a name="l12619"></a><span class="lineno">12619</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator,</div>
+<div class="line"><a name="l12620"></a><span class="lineno">12620</span>&#160;    <a class="code" href="struct_vma_pool.html">VmaPool</a> hParentPool,</div>
+<div class="line"><a name="l12621"></a><span class="lineno">12621</span>&#160;    uint32_t newMemoryTypeIndex,</div>
+<div class="line"><a name="l12622"></a><span class="lineno">12622</span>&#160;    VkDeviceMemory newMemory,</div>
+<div class="line"><a name="l12623"></a><span class="lineno">12623</span>&#160;    VkDeviceSize newSize,</div>
+<div class="line"><a name="l12624"></a><span class="lineno">12624</span>&#160;    uint32_t <span class="keywordtype">id</span>,</div>
+<div class="line"><a name="l12625"></a><span class="lineno">12625</span>&#160;    uint32_t algorithm)</div>
+<div class="line"><a name="l12626"></a><span class="lineno">12626</span>&#160;{</div>
+<div class="line"><a name="l12627"></a><span class="lineno">12627</span>&#160;    VMA_ASSERT(m_hMemory == VK_NULL_HANDLE);</div>
+<div class="line"><a name="l12628"></a><span class="lineno">12628</span>&#160; </div>
+<div class="line"><a name="l12629"></a><span class="lineno">12629</span>&#160;    m_hParentPool = hParentPool;</div>
+<div class="line"><a name="l12630"></a><span class="lineno">12630</span>&#160;    m_MemoryTypeIndex = newMemoryTypeIndex;</div>
+<div class="line"><a name="l12631"></a><span class="lineno">12631</span>&#160;    m_Id = id;</div>
+<div class="line"><a name="l12632"></a><span class="lineno">12632</span>&#160;    m_hMemory = newMemory;</div>
+<div class="line"><a name="l12633"></a><span class="lineno">12633</span>&#160; </div>
+<div class="line"><a name="l12634"></a><span class="lineno">12634</span>&#160;    <span class="keywordflow">switch</span>(algorithm)</div>
+<div class="line"><a name="l12635"></a><span class="lineno">12635</span>&#160;    {</div>
+<div class="line"><a name="l12636"></a><span class="lineno">12636</span>&#160;    <span class="keywordflow">case</span> <a class="code" href="vk__mem__alloc_8h.html#a9a7c45f9c863695d98c83fa5ac940fe7a13c8a444197c67866be9cb05599fc726">VMA_POOL_CREATE_LINEAR_ALGORITHM_BIT</a>:</div>
+<div class="line"><a name="l12637"></a><span class="lineno">12637</span>&#160;        m_pMetadata = vma_new(hAllocator, VmaBlockMetadata_Linear)(hAllocator);</div>
+<div class="line"><a name="l12638"></a><span class="lineno">12638</span>&#160;        <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l12639"></a><span class="lineno">12639</span>&#160;    <span class="keywordflow">case</span> <a class="code" href="vk__mem__alloc_8h.html#a9a7c45f9c863695d98c83fa5ac940fe7a97a0dc38e5161b780594d998d313d35e">VMA_POOL_CREATE_BUDDY_ALGORITHM_BIT</a>:</div>
+<div class="line"><a name="l12640"></a><span class="lineno">12640</span>&#160;        m_pMetadata = vma_new(hAllocator, VmaBlockMetadata_Buddy)(hAllocator);</div>
+<div class="line"><a name="l12641"></a><span class="lineno">12641</span>&#160;        <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l12642"></a><span class="lineno">12642</span>&#160;    <span class="keywordflow">default</span>:</div>
+<div class="line"><a name="l12643"></a><span class="lineno">12643</span>&#160;        VMA_ASSERT(0);</div>
+<div class="line"><a name="l12644"></a><span class="lineno">12644</span>&#160;        <span class="comment">// Fall-through.</span></div>
+<div class="line"><a name="l12645"></a><span class="lineno">12645</span>&#160;    <span class="keywordflow">case</span> 0:</div>
+<div class="line"><a name="l12646"></a><span class="lineno">12646</span>&#160;        m_pMetadata = vma_new(hAllocator, VmaBlockMetadata_Generic)(hAllocator);</div>
+<div class="line"><a name="l12647"></a><span class="lineno">12647</span>&#160;    }</div>
+<div class="line"><a name="l12648"></a><span class="lineno">12648</span>&#160;    m_pMetadata-&gt;Init(newSize);</div>
+<div class="line"><a name="l12649"></a><span class="lineno">12649</span>&#160;}</div>
+<div class="line"><a name="l12650"></a><span class="lineno">12650</span>&#160; </div>
+<div class="line"><a name="l12651"></a><span class="lineno">12651</span>&#160;<span class="keywordtype">void</span> VmaDeviceMemoryBlock::Destroy(<a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator)</div>
+<div class="line"><a name="l12652"></a><span class="lineno">12652</span>&#160;{</div>
+<div class="line"><a name="l12653"></a><span class="lineno">12653</span>&#160;    <span class="comment">// This is the most important assert in the entire library.</span></div>
+<div class="line"><a name="l12654"></a><span class="lineno">12654</span>&#160;    <span class="comment">// Hitting it means you have some memory leak - unreleased VmaAllocation objects.</span></div>
+<div class="line"><a name="l12655"></a><span class="lineno">12655</span>&#160;    VMA_ASSERT(m_pMetadata-&gt;IsEmpty() &amp;&amp; <span class="stringliteral">&quot;Some allocations were not freed before destruction of this memory block!&quot;</span>);</div>
+<div class="line"><a name="l12656"></a><span class="lineno">12656</span>&#160; </div>
+<div class="line"><a name="l12657"></a><span class="lineno">12657</span>&#160;    VMA_ASSERT(m_hMemory != VK_NULL_HANDLE);</div>
+<div class="line"><a name="l12658"></a><span class="lineno">12658</span>&#160;    allocator-&gt;FreeVulkanMemory(m_MemoryTypeIndex, m_pMetadata-&gt;GetSize(), m_hMemory);</div>
+<div class="line"><a name="l12659"></a><span class="lineno">12659</span>&#160;    m_hMemory = VK_NULL_HANDLE;</div>
+<div class="line"><a name="l12660"></a><span class="lineno">12660</span>&#160; </div>
+<div class="line"><a name="l12661"></a><span class="lineno">12661</span>&#160;    vma_delete(allocator, m_pMetadata);</div>
+<div class="line"><a name="l12662"></a><span class="lineno">12662</span>&#160;    m_pMetadata = VMA_NULL;</div>
+<div class="line"><a name="l12663"></a><span class="lineno">12663</span>&#160;}</div>
+<div class="line"><a name="l12664"></a><span class="lineno">12664</span>&#160; </div>
+<div class="line"><a name="l12665"></a><span class="lineno">12665</span>&#160;<span class="keywordtype">bool</span> VmaDeviceMemoryBlock::Validate()<span class="keyword"> const</span></div>
+<div class="line"><a name="l12666"></a><span class="lineno">12666</span>&#160;<span class="keyword"></span>{</div>
+<div class="line"><a name="l12667"></a><span class="lineno">12667</span>&#160;    VMA_VALIDATE((m_hMemory != VK_NULL_HANDLE) &amp;&amp;</div>
+<div class="line"><a name="l12668"></a><span class="lineno">12668</span>&#160;        (m_pMetadata-&gt;GetSize() != 0));</div>
+<div class="line"><a name="l12669"></a><span class="lineno">12669</span>&#160; </div>
+<div class="line"><a name="l12670"></a><span class="lineno">12670</span>&#160;    <span class="keywordflow">return</span> m_pMetadata-&gt;Validate();</div>
+<div class="line"><a name="l12671"></a><span class="lineno">12671</span>&#160;}</div>
+<div class="line"><a name="l12672"></a><span class="lineno">12672</span>&#160; </div>
+<div class="line"><a name="l12673"></a><span class="lineno">12673</span>&#160;VkResult VmaDeviceMemoryBlock::CheckCorruption(<a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator)</div>
+<div class="line"><a name="l12674"></a><span class="lineno">12674</span>&#160;{</div>
+<div class="line"><a name="l12675"></a><span class="lineno">12675</span>&#160;    <span class="keywordtype">void</span>* pData = <span class="keyword">nullptr</span>;</div>
+<div class="line"><a name="l12676"></a><span class="lineno">12676</span>&#160;    VkResult res = Map(hAllocator, 1, &amp;pData);</div>
+<div class="line"><a name="l12677"></a><span class="lineno">12677</span>&#160;    <span class="keywordflow">if</span>(res != VK_SUCCESS)</div>
+<div class="line"><a name="l12678"></a><span class="lineno">12678</span>&#160;    {</div>
+<div class="line"><a name="l12679"></a><span class="lineno">12679</span>&#160;        <span class="keywordflow">return</span> res;</div>
+<div class="line"><a name="l12680"></a><span class="lineno">12680</span>&#160;    }</div>
+<div class="line"><a name="l12681"></a><span class="lineno">12681</span>&#160; </div>
+<div class="line"><a name="l12682"></a><span class="lineno">12682</span>&#160;    res = m_pMetadata-&gt;CheckCorruption(pData);</div>
+<div class="line"><a name="l12683"></a><span class="lineno">12683</span>&#160; </div>
+<div class="line"><a name="l12684"></a><span class="lineno">12684</span>&#160;    Unmap(hAllocator, 1);</div>
+<div class="line"><a name="l12685"></a><span class="lineno">12685</span>&#160; </div>
+<div class="line"><a name="l12686"></a><span class="lineno">12686</span>&#160;    <span class="keywordflow">return</span> res;</div>
+<div class="line"><a name="l12687"></a><span class="lineno">12687</span>&#160;}</div>
+<div class="line"><a name="l12688"></a><span class="lineno">12688</span>&#160; </div>
+<div class="line"><a name="l12689"></a><span class="lineno">12689</span>&#160;VkResult VmaDeviceMemoryBlock::Map(<a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator, uint32_t count, <span class="keywordtype">void</span>** ppData)</div>
+<div class="line"><a name="l12690"></a><span class="lineno">12690</span>&#160;{</div>
+<div class="line"><a name="l12691"></a><span class="lineno">12691</span>&#160;    <span class="keywordflow">if</span>(count == 0)</div>
+<div class="line"><a name="l12692"></a><span class="lineno">12692</span>&#160;    {</div>
+<div class="line"><a name="l12693"></a><span class="lineno">12693</span>&#160;        <span class="keywordflow">return</span> VK_SUCCESS;</div>
+<div class="line"><a name="l12694"></a><span class="lineno">12694</span>&#160;    }</div>
+<div class="line"><a name="l12695"></a><span class="lineno">12695</span>&#160; </div>
+<div class="line"><a name="l12696"></a><span class="lineno">12696</span>&#160;    VmaMutexLock lock(m_Mutex, hAllocator-&gt;m_UseMutex);</div>
+<div class="line"><a name="l12697"></a><span class="lineno">12697</span>&#160;    <span class="keywordflow">if</span>(m_MapCount != 0)</div>
+<div class="line"><a name="l12698"></a><span class="lineno">12698</span>&#160;    {</div>
+<div class="line"><a name="l12699"></a><span class="lineno">12699</span>&#160;        m_MapCount += count;</div>
+<div class="line"><a name="l12700"></a><span class="lineno">12700</span>&#160;        VMA_ASSERT(m_pMappedData != VMA_NULL);</div>
+<div class="line"><a name="l12701"></a><span class="lineno">12701</span>&#160;        <span class="keywordflow">if</span>(ppData != VMA_NULL)</div>
+<div class="line"><a name="l12702"></a><span class="lineno">12702</span>&#160;        {</div>
+<div class="line"><a name="l12703"></a><span class="lineno">12703</span>&#160;            *ppData = m_pMappedData;</div>
+<div class="line"><a name="l12704"></a><span class="lineno">12704</span>&#160;        }</div>
+<div class="line"><a name="l12705"></a><span class="lineno">12705</span>&#160;        <span class="keywordflow">return</span> VK_SUCCESS;</div>
+<div class="line"><a name="l12706"></a><span class="lineno">12706</span>&#160;    }</div>
+<div class="line"><a name="l12707"></a><span class="lineno">12707</span>&#160;    <span class="keywordflow">else</span></div>
+<div class="line"><a name="l12708"></a><span class="lineno">12708</span>&#160;    {</div>
+<div class="line"><a name="l12709"></a><span class="lineno">12709</span>&#160;        VkResult result = (*hAllocator-&gt;GetVulkanFunctions().vkMapMemory)(</div>
+<div class="line"><a name="l12710"></a><span class="lineno">12710</span>&#160;            hAllocator-&gt;m_hDevice,</div>
+<div class="line"><a name="l12711"></a><span class="lineno">12711</span>&#160;            m_hMemory,</div>
+<div class="line"><a name="l12712"></a><span class="lineno">12712</span>&#160;            0, <span class="comment">// offset</span></div>
+<div class="line"><a name="l12713"></a><span class="lineno">12713</span>&#160;            VK_WHOLE_SIZE,</div>
+<div class="line"><a name="l12714"></a><span class="lineno">12714</span>&#160;            0, <span class="comment">// flags</span></div>
+<div class="line"><a name="l12715"></a><span class="lineno">12715</span>&#160;            &amp;m_pMappedData);</div>
+<div class="line"><a name="l12716"></a><span class="lineno">12716</span>&#160;        <span class="keywordflow">if</span>(result == VK_SUCCESS)</div>
+<div class="line"><a name="l12717"></a><span class="lineno">12717</span>&#160;        {</div>
+<div class="line"><a name="l12718"></a><span class="lineno">12718</span>&#160;            <span class="keywordflow">if</span>(ppData != VMA_NULL)</div>
+<div class="line"><a name="l12719"></a><span class="lineno">12719</span>&#160;            {</div>
+<div class="line"><a name="l12720"></a><span class="lineno">12720</span>&#160;                *ppData = m_pMappedData;</div>
+<div class="line"><a name="l12721"></a><span class="lineno">12721</span>&#160;            }</div>
+<div class="line"><a name="l12722"></a><span class="lineno">12722</span>&#160;            m_MapCount = count;</div>
+<div class="line"><a name="l12723"></a><span class="lineno">12723</span>&#160;        }</div>
+<div class="line"><a name="l12724"></a><span class="lineno">12724</span>&#160;        <span class="keywordflow">return</span> result;</div>
+<div class="line"><a name="l12725"></a><span class="lineno">12725</span>&#160;    }</div>
+<div class="line"><a name="l12726"></a><span class="lineno">12726</span>&#160;}</div>
+<div class="line"><a name="l12727"></a><span class="lineno">12727</span>&#160; </div>
+<div class="line"><a name="l12728"></a><span class="lineno">12728</span>&#160;<span class="keywordtype">void</span> VmaDeviceMemoryBlock::Unmap(<a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator, uint32_t count)</div>
+<div class="line"><a name="l12729"></a><span class="lineno">12729</span>&#160;{</div>
+<div class="line"><a name="l12730"></a><span class="lineno">12730</span>&#160;    <span class="keywordflow">if</span>(count == 0)</div>
+<div class="line"><a name="l12731"></a><span class="lineno">12731</span>&#160;    {</div>
+<div class="line"><a name="l12732"></a><span class="lineno">12732</span>&#160;        <span class="keywordflow">return</span>;</div>
+<div class="line"><a name="l12733"></a><span class="lineno">12733</span>&#160;    }</div>
+<div class="line"><a name="l12734"></a><span class="lineno">12734</span>&#160; </div>
+<div class="line"><a name="l12735"></a><span class="lineno">12735</span>&#160;    VmaMutexLock lock(m_Mutex, hAllocator-&gt;m_UseMutex);</div>
+<div class="line"><a name="l12736"></a><span class="lineno">12736</span>&#160;    <span class="keywordflow">if</span>(m_MapCount &gt;= count)</div>
+<div class="line"><a name="l12737"></a><span class="lineno">12737</span>&#160;    {</div>
+<div class="line"><a name="l12738"></a><span class="lineno">12738</span>&#160;        m_MapCount -= count;</div>
+<div class="line"><a name="l12739"></a><span class="lineno">12739</span>&#160;        <span class="keywordflow">if</span>(m_MapCount == 0)</div>
+<div class="line"><a name="l12740"></a><span class="lineno">12740</span>&#160;        {</div>
+<div class="line"><a name="l12741"></a><span class="lineno">12741</span>&#160;            m_pMappedData = VMA_NULL;</div>
+<div class="line"><a name="l12742"></a><span class="lineno">12742</span>&#160;            (*hAllocator-&gt;GetVulkanFunctions().vkUnmapMemory)(hAllocator-&gt;m_hDevice, m_hMemory);</div>
+<div class="line"><a name="l12743"></a><span class="lineno">12743</span>&#160;        }</div>
+<div class="line"><a name="l12744"></a><span class="lineno">12744</span>&#160;    }</div>
+<div class="line"><a name="l12745"></a><span class="lineno">12745</span>&#160;    <span class="keywordflow">else</span></div>
+<div class="line"><a name="l12746"></a><span class="lineno">12746</span>&#160;    {</div>
+<div class="line"><a name="l12747"></a><span class="lineno">12747</span>&#160;        VMA_ASSERT(0 &amp;&amp; <span class="stringliteral">&quot;VkDeviceMemory block is being unmapped while it was not previously mapped.&quot;</span>);</div>
+<div class="line"><a name="l12748"></a><span class="lineno">12748</span>&#160;    }</div>
+<div class="line"><a name="l12749"></a><span class="lineno">12749</span>&#160;}</div>
+<div class="line"><a name="l12750"></a><span class="lineno">12750</span>&#160; </div>
+<div class="line"><a name="l12751"></a><span class="lineno">12751</span>&#160;VkResult VmaDeviceMemoryBlock::WriteMagicValueAroundAllocation(<a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator, VkDeviceSize allocOffset, VkDeviceSize allocSize)</div>
+<div class="line"><a name="l12752"></a><span class="lineno">12752</span>&#160;{</div>
+<div class="line"><a name="l12753"></a><span class="lineno">12753</span>&#160;    VMA_ASSERT(VMA_DEBUG_MARGIN &gt; 0 &amp;&amp; VMA_DEBUG_MARGIN % 4 == 0 &amp;&amp; VMA_DEBUG_DETECT_CORRUPTION);</div>
+<div class="line"><a name="l12754"></a><span class="lineno">12754</span>&#160;    VMA_ASSERT(allocOffset &gt;= VMA_DEBUG_MARGIN);</div>
+<div class="line"><a name="l12755"></a><span class="lineno">12755</span>&#160; </div>
+<div class="line"><a name="l12756"></a><span class="lineno">12756</span>&#160;    <span class="keywordtype">void</span>* pData;</div>
+<div class="line"><a name="l12757"></a><span class="lineno">12757</span>&#160;    VkResult res = Map(hAllocator, 1, &amp;pData);</div>
+<div class="line"><a name="l12758"></a><span class="lineno">12758</span>&#160;    <span class="keywordflow">if</span>(res != VK_SUCCESS)</div>
+<div class="line"><a name="l12759"></a><span class="lineno">12759</span>&#160;    {</div>
+<div class="line"><a name="l12760"></a><span class="lineno">12760</span>&#160;        <span class="keywordflow">return</span> res;</div>
+<div class="line"><a name="l12761"></a><span class="lineno">12761</span>&#160;    }</div>
+<div class="line"><a name="l12762"></a><span class="lineno">12762</span>&#160; </div>
+<div class="line"><a name="l12763"></a><span class="lineno">12763</span>&#160;    VmaWriteMagicValue(pData, allocOffset - VMA_DEBUG_MARGIN);</div>
+<div class="line"><a name="l12764"></a><span class="lineno">12764</span>&#160;    VmaWriteMagicValue(pData, allocOffset + allocSize);</div>
+<div class="line"><a name="l12765"></a><span class="lineno">12765</span>&#160; </div>
+<div class="line"><a name="l12766"></a><span class="lineno">12766</span>&#160;    Unmap(hAllocator, 1);</div>
+<div class="line"><a name="l12767"></a><span class="lineno">12767</span>&#160; </div>
+<div class="line"><a name="l12768"></a><span class="lineno">12768</span>&#160;    <span class="keywordflow">return</span> VK_SUCCESS;</div>
+<div class="line"><a name="l12769"></a><span class="lineno">12769</span>&#160;}</div>
+<div class="line"><a name="l12770"></a><span class="lineno">12770</span>&#160; </div>
+<div class="line"><a name="l12771"></a><span class="lineno">12771</span>&#160;VkResult VmaDeviceMemoryBlock::ValidateMagicValueAroundAllocation(<a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator, VkDeviceSize allocOffset, VkDeviceSize allocSize)</div>
+<div class="line"><a name="l12772"></a><span class="lineno">12772</span>&#160;{</div>
+<div class="line"><a name="l12773"></a><span class="lineno">12773</span>&#160;    VMA_ASSERT(VMA_DEBUG_MARGIN &gt; 0 &amp;&amp; VMA_DEBUG_MARGIN % 4 == 0 &amp;&amp; VMA_DEBUG_DETECT_CORRUPTION);</div>
+<div class="line"><a name="l12774"></a><span class="lineno">12774</span>&#160;    VMA_ASSERT(allocOffset &gt;= VMA_DEBUG_MARGIN);</div>
+<div class="line"><a name="l12775"></a><span class="lineno">12775</span>&#160; </div>
+<div class="line"><a name="l12776"></a><span class="lineno">12776</span>&#160;    <span class="keywordtype">void</span>* pData;</div>
+<div class="line"><a name="l12777"></a><span class="lineno">12777</span>&#160;    VkResult res = Map(hAllocator, 1, &amp;pData);</div>
+<div class="line"><a name="l12778"></a><span class="lineno">12778</span>&#160;    <span class="keywordflow">if</span>(res != VK_SUCCESS)</div>
+<div class="line"><a name="l12779"></a><span class="lineno">12779</span>&#160;    {</div>
+<div class="line"><a name="l12780"></a><span class="lineno">12780</span>&#160;        <span class="keywordflow">return</span> res;</div>
+<div class="line"><a name="l12781"></a><span class="lineno">12781</span>&#160;    }</div>
+<div class="line"><a name="l12782"></a><span class="lineno">12782</span>&#160; </div>
+<div class="line"><a name="l12783"></a><span class="lineno">12783</span>&#160;    <span class="keywordflow">if</span>(!VmaValidateMagicValue(pData, allocOffset - VMA_DEBUG_MARGIN))</div>
+<div class="line"><a name="l12784"></a><span class="lineno">12784</span>&#160;    {</div>
+<div class="line"><a name="l12785"></a><span class="lineno">12785</span>&#160;        VMA_ASSERT(0 &amp;&amp; <span class="stringliteral">&quot;MEMORY CORRUPTION DETECTED BEFORE FREED ALLOCATION!&quot;</span>);</div>
+<div class="line"><a name="l12786"></a><span class="lineno">12786</span>&#160;    }</div>
+<div class="line"><a name="l12787"></a><span class="lineno">12787</span>&#160;    <span class="keywordflow">else</span> <span class="keywordflow">if</span>(!VmaValidateMagicValue(pData, allocOffset + allocSize))</div>
+<div class="line"><a name="l12788"></a><span class="lineno">12788</span>&#160;    {</div>
+<div class="line"><a name="l12789"></a><span class="lineno">12789</span>&#160;        VMA_ASSERT(0 &amp;&amp; <span class="stringliteral">&quot;MEMORY CORRUPTION DETECTED AFTER FREED ALLOCATION!&quot;</span>);</div>
+<div class="line"><a name="l12790"></a><span class="lineno">12790</span>&#160;    }</div>
+<div class="line"><a name="l12791"></a><span class="lineno">12791</span>&#160; </div>
+<div class="line"><a name="l12792"></a><span class="lineno">12792</span>&#160;    Unmap(hAllocator, 1);</div>
+<div class="line"><a name="l12793"></a><span class="lineno">12793</span>&#160; </div>
+<div class="line"><a name="l12794"></a><span class="lineno">12794</span>&#160;    <span class="keywordflow">return</span> VK_SUCCESS;</div>
+<div class="line"><a name="l12795"></a><span class="lineno">12795</span>&#160;}</div>
+<div class="line"><a name="l12796"></a><span class="lineno">12796</span>&#160; </div>
+<div class="line"><a name="l12797"></a><span class="lineno">12797</span>&#160;VkResult VmaDeviceMemoryBlock::BindBufferMemory(</div>
+<div class="line"><a name="l12798"></a><span class="lineno">12798</span>&#160;    <span class="keyword">const</span> <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator,</div>
+<div class="line"><a name="l12799"></a><span class="lineno">12799</span>&#160;    <span class="keyword">const</span> <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> hAllocation,</div>
+<div class="line"><a name="l12800"></a><span class="lineno">12800</span>&#160;    VkDeviceSize allocationLocalOffset,</div>
+<div class="line"><a name="l12801"></a><span class="lineno">12801</span>&#160;    VkBuffer hBuffer,</div>
+<div class="line"><a name="l12802"></a><span class="lineno">12802</span>&#160;    <span class="keyword">const</span> <span class="keywordtype">void</span>* pNext)</div>
+<div class="line"><a name="l12803"></a><span class="lineno">12803</span>&#160;{</div>
+<div class="line"><a name="l12804"></a><span class="lineno">12804</span>&#160;    VMA_ASSERT(hAllocation-&gt;GetType() == VmaAllocation_T::ALLOCATION_TYPE_BLOCK &amp;&amp;</div>
+<div class="line"><a name="l12805"></a><span class="lineno">12805</span>&#160;        hAllocation-&gt;GetBlock() == <span class="keyword">this</span>);</div>
+<div class="line"><a name="l12806"></a><span class="lineno">12806</span>&#160;    VMA_ASSERT(allocationLocalOffset &lt; hAllocation-&gt;GetSize() &amp;&amp;</div>
+<div class="line"><a name="l12807"></a><span class="lineno">12807</span>&#160;        <span class="stringliteral">&quot;Invalid allocationLocalOffset. Did you forget that this offset is relative to the beginning of the allocation, not the whole memory block?&quot;</span>);</div>
+<div class="line"><a name="l12808"></a><span class="lineno">12808</span>&#160;    <span class="keyword">const</span> VkDeviceSize memoryOffset = hAllocation-&gt;GetOffset() + allocationLocalOffset;</div>
+<div class="line"><a name="l12809"></a><span class="lineno">12809</span>&#160;    <span class="comment">// This lock is important so that we don&#39;t call vkBind... and/or vkMap... simultaneously on the same VkDeviceMemory from multiple threads.</span></div>
+<div class="line"><a name="l12810"></a><span class="lineno">12810</span>&#160;    VmaMutexLock lock(m_Mutex, hAllocator-&gt;m_UseMutex);</div>
+<div class="line"><a name="l12811"></a><span class="lineno">12811</span>&#160;    <span class="keywordflow">return</span> hAllocator-&gt;BindVulkanBuffer(m_hMemory, memoryOffset, hBuffer, pNext);</div>
+<div class="line"><a name="l12812"></a><span class="lineno">12812</span>&#160;}</div>
+<div class="line"><a name="l12813"></a><span class="lineno">12813</span>&#160; </div>
+<div class="line"><a name="l12814"></a><span class="lineno">12814</span>&#160;VkResult VmaDeviceMemoryBlock::BindImageMemory(</div>
+<div class="line"><a name="l12815"></a><span class="lineno">12815</span>&#160;    <span class="keyword">const</span> <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator,</div>
+<div class="line"><a name="l12816"></a><span class="lineno">12816</span>&#160;    <span class="keyword">const</span> <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> hAllocation,</div>
+<div class="line"><a name="l12817"></a><span class="lineno">12817</span>&#160;    VkDeviceSize allocationLocalOffset,</div>
+<div class="line"><a name="l12818"></a><span class="lineno">12818</span>&#160;    VkImage hImage,</div>
+<div class="line"><a name="l12819"></a><span class="lineno">12819</span>&#160;    <span class="keyword">const</span> <span class="keywordtype">void</span>* pNext)</div>
+<div class="line"><a name="l12820"></a><span class="lineno">12820</span>&#160;{</div>
+<div class="line"><a name="l12821"></a><span class="lineno">12821</span>&#160;    VMA_ASSERT(hAllocation-&gt;GetType() == VmaAllocation_T::ALLOCATION_TYPE_BLOCK &amp;&amp;</div>
+<div class="line"><a name="l12822"></a><span class="lineno">12822</span>&#160;        hAllocation-&gt;GetBlock() == <span class="keyword">this</span>);</div>
+<div class="line"><a name="l12823"></a><span class="lineno">12823</span>&#160;    VMA_ASSERT(allocationLocalOffset &lt; hAllocation-&gt;GetSize() &amp;&amp;</div>
+<div class="line"><a name="l12824"></a><span class="lineno">12824</span>&#160;        <span class="stringliteral">&quot;Invalid allocationLocalOffset. Did you forget that this offset is relative to the beginning of the allocation, not the whole memory block?&quot;</span>);</div>
+<div class="line"><a name="l12825"></a><span class="lineno">12825</span>&#160;    <span class="keyword">const</span> VkDeviceSize memoryOffset = hAllocation-&gt;GetOffset() + allocationLocalOffset;</div>
+<div class="line"><a name="l12826"></a><span class="lineno">12826</span>&#160;    <span class="comment">// This lock is important so that we don&#39;t call vkBind... and/or vkMap... simultaneously on the same VkDeviceMemory from multiple threads.</span></div>
+<div class="line"><a name="l12827"></a><span class="lineno">12827</span>&#160;    VmaMutexLock lock(m_Mutex, hAllocator-&gt;m_UseMutex);</div>
+<div class="line"><a name="l12828"></a><span class="lineno">12828</span>&#160;    <span class="keywordflow">return</span> hAllocator-&gt;BindVulkanImage(m_hMemory, memoryOffset, hImage, pNext);</div>
+<div class="line"><a name="l12829"></a><span class="lineno">12829</span>&#160;}</div>
+<div class="line"><a name="l12830"></a><span class="lineno">12830</span>&#160; </div>
+<div class="line"><a name="l12831"></a><span class="lineno">12831</span>&#160;<span class="keyword">static</span> <span class="keywordtype">void</span> InitStatInfo(<a class="code" href="struct_vma_stat_info.html">VmaStatInfo</a>&amp; outInfo)</div>
+<div class="line"><a name="l12832"></a><span class="lineno">12832</span>&#160;{</div>
+<div class="line"><a name="l12833"></a><span class="lineno">12833</span>&#160;    memset(&amp;outInfo, 0, <span class="keyword">sizeof</span>(outInfo));</div>
+<div class="line"><a name="l12834"></a><span class="lineno">12834</span>&#160;    outInfo.<a class="code" href="struct_vma_stat_info.html#ade8b40bd3139c04aabd2fc538a356fea">allocationSizeMin</a> = UINT64_MAX;</div>
+<div class="line"><a name="l12835"></a><span class="lineno">12835</span>&#160;    outInfo.<a class="code" href="struct_vma_stat_info.html#aedeba931324f16589cd2416c0d2dd0d4">unusedRangeSizeMin</a> = UINT64_MAX;</div>
+<div class="line"><a name="l12836"></a><span class="lineno">12836</span>&#160;}</div>
+<div class="line"><a name="l12837"></a><span class="lineno">12837</span>&#160; </div>
+<div class="line"><a name="l12838"></a><span class="lineno">12838</span>&#160;<span class="comment">// Adds statistics srcInfo into inoutInfo, like: inoutInfo += srcInfo.</span></div>
+<div class="line"><a name="l12839"></a><span class="lineno">12839</span>&#160;<span class="keyword">static</span> <span class="keywordtype">void</span> VmaAddStatInfo(<a class="code" href="struct_vma_stat_info.html">VmaStatInfo</a>&amp; inoutInfo, <span class="keyword">const</span> <a class="code" href="struct_vma_stat_info.html">VmaStatInfo</a>&amp; srcInfo)</div>
+<div class="line"><a name="l12840"></a><span class="lineno">12840</span>&#160;{</div>
+<div class="line"><a name="l12841"></a><span class="lineno">12841</span>&#160;    inoutInfo.<a class="code" href="struct_vma_stat_info.html#abc4bb7cd611900778464c56e50c970a4">blockCount</a> += srcInfo.<a class="code" href="struct_vma_stat_info.html#abc4bb7cd611900778464c56e50c970a4">blockCount</a>;</div>
+<div class="line"><a name="l12842"></a><span class="lineno">12842</span>&#160;    inoutInfo.<a class="code" href="struct_vma_stat_info.html#a537741e4d5cdddc1c0ab95ec650afaff">allocationCount</a> += srcInfo.<a class="code" href="struct_vma_stat_info.html#a537741e4d5cdddc1c0ab95ec650afaff">allocationCount</a>;</div>
+<div class="line"><a name="l12843"></a><span class="lineno">12843</span>&#160;    inoutInfo.<a class="code" href="struct_vma_stat_info.html#ae06129c771bfebfd6468a7f4276502a9">unusedRangeCount</a> += srcInfo.<a class="code" href="struct_vma_stat_info.html#ae06129c771bfebfd6468a7f4276502a9">unusedRangeCount</a>;</div>
+<div class="line"><a name="l12844"></a><span class="lineno">12844</span>&#160;    inoutInfo.<a class="code" href="struct_vma_stat_info.html#ab0c6c73837e5a70c749fbd4f6064895a">usedBytes</a> += srcInfo.<a class="code" href="struct_vma_stat_info.html#ab0c6c73837e5a70c749fbd4f6064895a">usedBytes</a>;</div>
+<div class="line"><a name="l12845"></a><span class="lineno">12845</span>&#160;    inoutInfo.<a class="code" href="struct_vma_stat_info.html#a1859d290aca2cd582d8dc25922092669">unusedBytes</a> += srcInfo.<a class="code" href="struct_vma_stat_info.html#a1859d290aca2cd582d8dc25922092669">unusedBytes</a>;</div>
+<div class="line"><a name="l12846"></a><span class="lineno">12846</span>&#160;    inoutInfo.<a class="code" href="struct_vma_stat_info.html#ade8b40bd3139c04aabd2fc538a356fea">allocationSizeMin</a> = VMA_MIN(inoutInfo.<a class="code" href="struct_vma_stat_info.html#ade8b40bd3139c04aabd2fc538a356fea">allocationSizeMin</a>, srcInfo.<a class="code" href="struct_vma_stat_info.html#ade8b40bd3139c04aabd2fc538a356fea">allocationSizeMin</a>);</div>
+<div class="line"><a name="l12847"></a><span class="lineno">12847</span>&#160;    inoutInfo.<a class="code" href="struct_vma_stat_info.html#a17e9733a5ecd76287d4db6e66f71f50c">allocationSizeMax</a> = VMA_MAX(inoutInfo.<a class="code" href="struct_vma_stat_info.html#a17e9733a5ecd76287d4db6e66f71f50c">allocationSizeMax</a>, srcInfo.<a class="code" href="struct_vma_stat_info.html#a17e9733a5ecd76287d4db6e66f71f50c">allocationSizeMax</a>);</div>
+<div class="line"><a name="l12848"></a><span class="lineno">12848</span>&#160;    inoutInfo.<a class="code" href="struct_vma_stat_info.html#aedeba931324f16589cd2416c0d2dd0d4">unusedRangeSizeMin</a> = VMA_MIN(inoutInfo.<a class="code" href="struct_vma_stat_info.html#aedeba931324f16589cd2416c0d2dd0d4">unusedRangeSizeMin</a>, srcInfo.<a class="code" href="struct_vma_stat_info.html#aedeba931324f16589cd2416c0d2dd0d4">unusedRangeSizeMin</a>);</div>
+<div class="line"><a name="l12849"></a><span class="lineno">12849</span>&#160;    inoutInfo.<a class="code" href="struct_vma_stat_info.html#a5ba1a2476c4d39b10f7e2f7ebbb72ac4">unusedRangeSizeMax</a> = VMA_MAX(inoutInfo.<a class="code" href="struct_vma_stat_info.html#a5ba1a2476c4d39b10f7e2f7ebbb72ac4">unusedRangeSizeMax</a>, srcInfo.<a class="code" href="struct_vma_stat_info.html#a5ba1a2476c4d39b10f7e2f7ebbb72ac4">unusedRangeSizeMax</a>);</div>
+<div class="line"><a name="l12850"></a><span class="lineno">12850</span>&#160;}</div>
+<div class="line"><a name="l12851"></a><span class="lineno">12851</span>&#160; </div>
+<div class="line"><a name="l12852"></a><span class="lineno">12852</span>&#160;<span class="keyword">static</span> <span class="keywordtype">void</span> VmaPostprocessCalcStatInfo(<a class="code" href="struct_vma_stat_info.html">VmaStatInfo</a>&amp; inoutInfo)</div>
+<div class="line"><a name="l12853"></a><span class="lineno">12853</span>&#160;{</div>
+<div class="line"><a name="l12854"></a><span class="lineno">12854</span>&#160;    inoutInfo.<a class="code" href="struct_vma_stat_info.html#a1081a039964e566c672e7a2347f9e599">allocationSizeAvg</a> = (inoutInfo.<a class="code" href="struct_vma_stat_info.html#a537741e4d5cdddc1c0ab95ec650afaff">allocationCount</a> &gt; 0) ?</div>
+<div class="line"><a name="l12855"></a><span class="lineno">12855</span>&#160;        VmaRoundDiv&lt;VkDeviceSize&gt;(inoutInfo.<a class="code" href="struct_vma_stat_info.html#ab0c6c73837e5a70c749fbd4f6064895a">usedBytes</a>, inoutInfo.<a class="code" href="struct_vma_stat_info.html#a537741e4d5cdddc1c0ab95ec650afaff">allocationCount</a>) : 0;</div>
+<div class="line"><a name="l12856"></a><span class="lineno">12856</span>&#160;    inoutInfo.<a class="code" href="struct_vma_stat_info.html#a2f9b3452af90c9768a30b7fb6ae194fc">unusedRangeSizeAvg</a> = (inoutInfo.<a class="code" href="struct_vma_stat_info.html#ae06129c771bfebfd6468a7f4276502a9">unusedRangeCount</a> &gt; 0) ?</div>
+<div class="line"><a name="l12857"></a><span class="lineno">12857</span>&#160;        VmaRoundDiv&lt;VkDeviceSize&gt;(inoutInfo.<a class="code" href="struct_vma_stat_info.html#a1859d290aca2cd582d8dc25922092669">unusedBytes</a>, inoutInfo.<a class="code" href="struct_vma_stat_info.html#ae06129c771bfebfd6468a7f4276502a9">unusedRangeCount</a>) : 0;</div>
+<div class="line"><a name="l12858"></a><span class="lineno">12858</span>&#160;}</div>
+<div class="line"><a name="l12859"></a><span class="lineno">12859</span>&#160; </div>
+<div class="line"><a name="l12860"></a><span class="lineno">12860</span>&#160;VmaPool_T::VmaPool_T(</div>
+<div class="line"><a name="l12861"></a><span class="lineno">12861</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator,</div>
+<div class="line"><a name="l12862"></a><span class="lineno">12862</span>&#160;    <span class="keyword">const</span> <a class="code" href="struct_vma_pool_create_info.html">VmaPoolCreateInfo</a>&amp; createInfo,</div>
+<div class="line"><a name="l12863"></a><span class="lineno">12863</span>&#160;    VkDeviceSize preferredBlockSize) :</div>
+<div class="line"><a name="l12864"></a><span class="lineno">12864</span>&#160;    m_BlockVector(</div>
+<div class="line"><a name="l12865"></a><span class="lineno">12865</span>&#160;        hAllocator,</div>
+<div class="line"><a name="l12866"></a><span class="lineno">12866</span>&#160;        this, <span class="comment">// hParentPool</span></div>
+<div class="line"><a name="l12867"></a><span class="lineno">12867</span>&#160;        createInfo.memoryTypeIndex,</div>
+<div class="line"><a name="l12868"></a><span class="lineno">12868</span>&#160;        createInfo.blockSize != 0 ? createInfo.blockSize : preferredBlockSize,</div>
+<div class="line"><a name="l12869"></a><span class="lineno">12869</span>&#160;        createInfo.minBlockCount,</div>
+<div class="line"><a name="l12870"></a><span class="lineno">12870</span>&#160;        createInfo.maxBlockCount,</div>
+<div class="line"><a name="l12871"></a><span class="lineno">12871</span>&#160;        (createInfo.flags &amp; <a class="code" href="vk__mem__alloc_8h.html#a9a7c45f9c863695d98c83fa5ac940fe7a9f1a499508a8edb4e8ba40aa0290a3d2">VMA_POOL_CREATE_IGNORE_BUFFER_IMAGE_GRANULARITY_BIT</a>) != 0 ? 1 : hAllocator-&gt;GetBufferImageGranularity(),</div>
+<div class="line"><a name="l12872"></a><span class="lineno">12872</span>&#160;        createInfo.frameInUseCount,</div>
+<div class="line"><a name="l12873"></a><span class="lineno">12873</span>&#160;        createInfo.blockSize != 0, <span class="comment">// explicitBlockSize</span></div>
+<div class="line"><a name="l12874"></a><span class="lineno">12874</span>&#160;        createInfo.flags &amp; <a class="code" href="vk__mem__alloc_8h.html#a9a7c45f9c863695d98c83fa5ac940fe7af4d270f8f42517a0f70037ceb6ac1d9c">VMA_POOL_CREATE_ALGORITHM_MASK</a>,</div>
+<div class="line"><a name="l12875"></a><span class="lineno">12875</span>&#160;        createInfo.priority), <span class="comment">// algorithm</span></div>
+<div class="line"><a name="l12876"></a><span class="lineno">12876</span>&#160;    m_Id(0),</div>
+<div class="line"><a name="l12877"></a><span class="lineno">12877</span>&#160;    m_Name(VMA_NULL)</div>
+<div class="line"><a name="l12878"></a><span class="lineno">12878</span>&#160;{</div>
+<div class="line"><a name="l12879"></a><span class="lineno">12879</span>&#160;}</div>
+<div class="line"><a name="l12880"></a><span class="lineno">12880</span>&#160; </div>
+<div class="line"><a name="l12881"></a><span class="lineno">12881</span>&#160;VmaPool_T::~VmaPool_T()</div>
+<div class="line"><a name="l12882"></a><span class="lineno">12882</span>&#160;{</div>
+<div class="line"><a name="l12883"></a><span class="lineno">12883</span>&#160;    VMA_ASSERT(m_PrevPool == VMA_NULL &amp;&amp; m_NextPool == VMA_NULL);</div>
+<div class="line"><a name="l12884"></a><span class="lineno">12884</span>&#160;}</div>
+<div class="line"><a name="l12885"></a><span class="lineno">12885</span>&#160; </div>
+<div class="line"><a name="l12886"></a><span class="lineno">12886</span>&#160;<span class="keywordtype">void</span> VmaPool_T::SetName(<span class="keyword">const</span> <span class="keywordtype">char</span>* pName)</div>
+<div class="line"><a name="l12887"></a><span class="lineno">12887</span>&#160;{</div>
+<div class="line"><a name="l12888"></a><span class="lineno">12888</span>&#160;    <span class="keyword">const</span> VkAllocationCallbacks* allocs = m_BlockVector.GetAllocator()-&gt;GetAllocationCallbacks();</div>
+<div class="line"><a name="l12889"></a><span class="lineno">12889</span>&#160;    VmaFreeString(allocs, m_Name);</div>
+<div class="line"><a name="l12890"></a><span class="lineno">12890</span>&#160; </div>
+<div class="line"><a name="l12891"></a><span class="lineno">12891</span>&#160;    <span class="keywordflow">if</span>(pName != VMA_NULL)</div>
+<div class="line"><a name="l12892"></a><span class="lineno">12892</span>&#160;    {</div>
+<div class="line"><a name="l12893"></a><span class="lineno">12893</span>&#160;        m_Name = VmaCreateStringCopy(allocs, pName);</div>
+<div class="line"><a name="l12894"></a><span class="lineno">12894</span>&#160;    }</div>
+<div class="line"><a name="l12895"></a><span class="lineno">12895</span>&#160;    <span class="keywordflow">else</span></div>
+<div class="line"><a name="l12896"></a><span class="lineno">12896</span>&#160;    {</div>
+<div class="line"><a name="l12897"></a><span class="lineno">12897</span>&#160;        m_Name = VMA_NULL;</div>
+<div class="line"><a name="l12898"></a><span class="lineno">12898</span>&#160;    }</div>
+<div class="line"><a name="l12899"></a><span class="lineno">12899</span>&#160;}</div>
+<div class="line"><a name="l12900"></a><span class="lineno">12900</span>&#160; </div>
+<div class="line"><a name="l12901"></a><span class="lineno">12901</span>&#160;<span class="preprocessor">#if VMA_STATS_STRING_ENABLED</span></div>
+<div class="line"><a name="l12902"></a><span class="lineno">12902</span>&#160; </div>
+<div class="line"><a name="l12903"></a><span class="lineno">12903</span>&#160;<span class="preprocessor">#endif </span><span class="comment">// #if VMA_STATS_STRING_ENABLED</span></div>
+<div class="line"><a name="l12904"></a><span class="lineno">12904</span>&#160; </div>
+<div class="line"><a name="l12905"></a><span class="lineno">12905</span>&#160;VmaBlockVector::VmaBlockVector(</div>
+<div class="line"><a name="l12906"></a><span class="lineno">12906</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator,</div>
+<div class="line"><a name="l12907"></a><span class="lineno">12907</span>&#160;    <a class="code" href="struct_vma_pool.html">VmaPool</a> hParentPool,</div>
+<div class="line"><a name="l12908"></a><span class="lineno">12908</span>&#160;    uint32_t memoryTypeIndex,</div>
+<div class="line"><a name="l12909"></a><span class="lineno">12909</span>&#160;    VkDeviceSize preferredBlockSize,</div>
+<div class="line"><a name="l12910"></a><span class="lineno">12910</span>&#160;    <span class="keywordtype">size_t</span> minBlockCount,</div>
+<div class="line"><a name="l12911"></a><span class="lineno">12911</span>&#160;    <span class="keywordtype">size_t</span> maxBlockCount,</div>
+<div class="line"><a name="l12912"></a><span class="lineno">12912</span>&#160;    VkDeviceSize bufferImageGranularity,</div>
+<div class="line"><a name="l12913"></a><span class="lineno">12913</span>&#160;    uint32_t frameInUseCount,</div>
+<div class="line"><a name="l12914"></a><span class="lineno">12914</span>&#160;    <span class="keywordtype">bool</span> explicitBlockSize,</div>
+<div class="line"><a name="l12915"></a><span class="lineno">12915</span>&#160;    uint32_t algorithm,</div>
+<div class="line"><a name="l12916"></a><span class="lineno">12916</span>&#160;    <span class="keywordtype">float</span> priority) :</div>
+<div class="line"><a name="l12917"></a><span class="lineno">12917</span>&#160;    m_hAllocator(hAllocator),</div>
+<div class="line"><a name="l12918"></a><span class="lineno">12918</span>&#160;    m_hParentPool(hParentPool),</div>
+<div class="line"><a name="l12919"></a><span class="lineno">12919</span>&#160;    m_MemoryTypeIndex(memoryTypeIndex),</div>
+<div class="line"><a name="l12920"></a><span class="lineno">12920</span>&#160;    m_PreferredBlockSize(preferredBlockSize),</div>
+<div class="line"><a name="l12921"></a><span class="lineno">12921</span>&#160;    m_MinBlockCount(minBlockCount),</div>
+<div class="line"><a name="l12922"></a><span class="lineno">12922</span>&#160;    m_MaxBlockCount(maxBlockCount),</div>
+<div class="line"><a name="l12923"></a><span class="lineno">12923</span>&#160;    m_BufferImageGranularity(bufferImageGranularity),</div>
+<div class="line"><a name="l12924"></a><span class="lineno">12924</span>&#160;    m_FrameInUseCount(frameInUseCount),</div>
+<div class="line"><a name="l12925"></a><span class="lineno">12925</span>&#160;    m_ExplicitBlockSize(explicitBlockSize),</div>
+<div class="line"><a name="l12926"></a><span class="lineno">12926</span>&#160;    m_Algorithm(algorithm),</div>
+<div class="line"><a name="l12927"></a><span class="lineno">12927</span>&#160;    m_Priority(priority),</div>
+<div class="line"><a name="l12928"></a><span class="lineno">12928</span>&#160;    m_HasEmptyBlock(false),</div>
+<div class="line"><a name="l12929"></a><span class="lineno">12929</span>&#160;    m_Blocks(VmaStlAllocator&lt;VmaDeviceMemoryBlock*&gt;(hAllocator-&gt;GetAllocationCallbacks())),</div>
+<div class="line"><a name="l12930"></a><span class="lineno">12930</span>&#160;    m_NextBlockId(0)</div>
+<div class="line"><a name="l12931"></a><span class="lineno">12931</span>&#160;{</div>
+<div class="line"><a name="l12932"></a><span class="lineno">12932</span>&#160;}</div>
+<div class="line"><a name="l12933"></a><span class="lineno">12933</span>&#160; </div>
+<div class="line"><a name="l12934"></a><span class="lineno">12934</span>&#160;VmaBlockVector::~VmaBlockVector()</div>
+<div class="line"><a name="l12935"></a><span class="lineno">12935</span>&#160;{</div>
+<div class="line"><a name="l12936"></a><span class="lineno">12936</span>&#160;    <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> i = m_Blocks.size(); i--; )</div>
+<div class="line"><a name="l12937"></a><span class="lineno">12937</span>&#160;    {</div>
+<div class="line"><a name="l12938"></a><span class="lineno">12938</span>&#160;        m_Blocks[i]-&gt;Destroy(m_hAllocator);</div>
+<div class="line"><a name="l12939"></a><span class="lineno">12939</span>&#160;        vma_delete(m_hAllocator, m_Blocks[i]);</div>
+<div class="line"><a name="l12940"></a><span class="lineno">12940</span>&#160;    }</div>
+<div class="line"><a name="l12941"></a><span class="lineno">12941</span>&#160;}</div>
+<div class="line"><a name="l12942"></a><span class="lineno">12942</span>&#160; </div>
+<div class="line"><a name="l12943"></a><span class="lineno">12943</span>&#160;VkResult VmaBlockVector::CreateMinBlocks()</div>
+<div class="line"><a name="l12944"></a><span class="lineno">12944</span>&#160;{</div>
+<div class="line"><a name="l12945"></a><span class="lineno">12945</span>&#160;    <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> i = 0; i &lt; m_MinBlockCount; ++i)</div>
+<div class="line"><a name="l12946"></a><span class="lineno">12946</span>&#160;    {</div>
+<div class="line"><a name="l12947"></a><span class="lineno">12947</span>&#160;        VkResult res = CreateBlock(m_PreferredBlockSize, VMA_NULL);</div>
+<div class="line"><a name="l12948"></a><span class="lineno">12948</span>&#160;        <span class="keywordflow">if</span>(res != VK_SUCCESS)</div>
+<div class="line"><a name="l12949"></a><span class="lineno">12949</span>&#160;        {</div>
+<div class="line"><a name="l12950"></a><span class="lineno">12950</span>&#160;            <span class="keywordflow">return</span> res;</div>
+<div class="line"><a name="l12951"></a><span class="lineno">12951</span>&#160;        }</div>
+<div class="line"><a name="l12952"></a><span class="lineno">12952</span>&#160;    }</div>
+<div class="line"><a name="l12953"></a><span class="lineno">12953</span>&#160;    <span class="keywordflow">return</span> VK_SUCCESS;</div>
+<div class="line"><a name="l12954"></a><span class="lineno">12954</span>&#160;}</div>
+<div class="line"><a name="l12955"></a><span class="lineno">12955</span>&#160; </div>
+<div class="line"><a name="l12956"></a><span class="lineno">12956</span>&#160;<span class="keywordtype">void</span> VmaBlockVector::GetPoolStats(<a class="code" href="struct_vma_pool_stats.html">VmaPoolStats</a>* pStats)</div>
+<div class="line"><a name="l12957"></a><span class="lineno">12957</span>&#160;{</div>
+<div class="line"><a name="l12958"></a><span class="lineno">12958</span>&#160;    VmaMutexLockRead lock(m_Mutex, m_hAllocator-&gt;m_UseMutex);</div>
+<div class="line"><a name="l12959"></a><span class="lineno">12959</span>&#160; </div>
+<div class="line"><a name="l12960"></a><span class="lineno">12960</span>&#160;    <span class="keyword">const</span> <span class="keywordtype">size_t</span> blockCount = m_Blocks.size();</div>
+<div class="line"><a name="l12961"></a><span class="lineno">12961</span>&#160; </div>
+<div class="line"><a name="l12962"></a><span class="lineno">12962</span>&#160;    pStats-&gt;<a class="code" href="struct_vma_pool_stats.html#a326807b2de2b0931cee4ed9a5f2e420c">size</a> = 0;</div>
+<div class="line"><a name="l12963"></a><span class="lineno">12963</span>&#160;    pStats-&gt;<a class="code" href="struct_vma_pool_stats.html#ad7c54874724fce7b06aba526202d82a8">unusedSize</a> = 0;</div>
+<div class="line"><a name="l12964"></a><span class="lineno">12964</span>&#160;    pStats-&gt;<a class="code" href="struct_vma_pool_stats.html#ad1924eb54fffa45e9e0e65670c8fe5eb">allocationCount</a> = 0;</div>
+<div class="line"><a name="l12965"></a><span class="lineno">12965</span>&#160;    pStats-&gt;<a class="code" href="struct_vma_pool_stats.html#ae4f3546ffa4d1e598b64d8e6134854f4">unusedRangeCount</a> = 0;</div>
+<div class="line"><a name="l12966"></a><span class="lineno">12966</span>&#160;    pStats-&gt;<a class="code" href="struct_vma_pool_stats.html#ab4c8f52dd42ab01998f60f0b6acc722b">unusedRangeSizeMax</a> = 0;</div>
+<div class="line"><a name="l12967"></a><span class="lineno">12967</span>&#160;    pStats-&gt;<a class="code" href="struct_vma_pool_stats.html#aa0b5cb45cef6f18571cefb03b9a230e7">blockCount</a> = blockCount;</div>
+<div class="line"><a name="l12968"></a><span class="lineno">12968</span>&#160; </div>
+<div class="line"><a name="l12969"></a><span class="lineno">12969</span>&#160;    <span class="keywordflow">for</span>(uint32_t blockIndex = 0; blockIndex &lt; blockCount; ++blockIndex)</div>
+<div class="line"><a name="l12970"></a><span class="lineno">12970</span>&#160;    {</div>
+<div class="line"><a name="l12971"></a><span class="lineno">12971</span>&#160;        <span class="keyword">const</span> VmaDeviceMemoryBlock* <span class="keyword">const</span> pBlock = m_Blocks[blockIndex];</div>
+<div class="line"><a name="l12972"></a><span class="lineno">12972</span>&#160;        VMA_ASSERT(pBlock);</div>
+<div class="line"><a name="l12973"></a><span class="lineno">12973</span>&#160;        VMA_HEAVY_ASSERT(pBlock-&gt;Validate());</div>
+<div class="line"><a name="l12974"></a><span class="lineno">12974</span>&#160;        pBlock-&gt;m_pMetadata-&gt;AddPoolStats(*pStats);</div>
+<div class="line"><a name="l12975"></a><span class="lineno">12975</span>&#160;    }</div>
+<div class="line"><a name="l12976"></a><span class="lineno">12976</span>&#160;}</div>
 <div class="line"><a name="l12977"></a><span class="lineno">12977</span>&#160; </div>
-<div class="line"><a name="l12978"></a><span class="lineno">12978</span>&#160;        UpdateHasEmptyBlock();</div>
-<div class="line"><a name="l12979"></a><span class="lineno">12979</span>&#160;        IncrementallySortBlocks();</div>
-<div class="line"><a name="l12980"></a><span class="lineno">12980</span>&#160;    }</div>
-<div class="line"><a name="l12981"></a><span class="lineno">12981</span>&#160; </div>
-<div class="line"><a name="l12982"></a><span class="lineno">12982</span>&#160;    <span class="comment">// Destruction of a free block. Deferred until this point, outside of mutex</span></div>
-<div class="line"><a name="l12983"></a><span class="lineno">12983</span>&#160;    <span class="comment">// lock, for performance reason.</span></div>
-<div class="line"><a name="l12984"></a><span class="lineno">12984</span>&#160;    <span class="keywordflow">if</span>(pBlockToDelete != VMA_NULL)</div>
-<div class="line"><a name="l12985"></a><span class="lineno">12985</span>&#160;    {</div>
-<div class="line"><a name="l12986"></a><span class="lineno">12986</span>&#160;        VMA_DEBUG_LOG(<span class="stringliteral">&quot;    Deleted empty block&quot;</span>);</div>
-<div class="line"><a name="l12987"></a><span class="lineno">12987</span>&#160;        pBlockToDelete-&gt;Destroy(m_hAllocator);</div>
-<div class="line"><a name="l12988"></a><span class="lineno">12988</span>&#160;        vma_delete(m_hAllocator, pBlockToDelete);</div>
-<div class="line"><a name="l12989"></a><span class="lineno">12989</span>&#160;    }</div>
-<div class="line"><a name="l12990"></a><span class="lineno">12990</span>&#160;}</div>
-<div class="line"><a name="l12991"></a><span class="lineno">12991</span>&#160; </div>
-<div class="line"><a name="l12992"></a><span class="lineno">12992</span>&#160;VkDeviceSize VmaBlockVector::CalcMaxBlockSize()<span class="keyword"> const</span></div>
-<div class="line"><a name="l12993"></a><span class="lineno">12993</span>&#160;<span class="keyword"></span>{</div>
-<div class="line"><a name="l12994"></a><span class="lineno">12994</span>&#160;    VkDeviceSize result = 0;</div>
-<div class="line"><a name="l12995"></a><span class="lineno">12995</span>&#160;    <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> i = m_Blocks.size(); i--; )</div>
-<div class="line"><a name="l12996"></a><span class="lineno">12996</span>&#160;    {</div>
-<div class="line"><a name="l12997"></a><span class="lineno">12997</span>&#160;        result = VMA_MAX(result, m_Blocks[i]-&gt;m_pMetadata-&gt;GetSize());</div>
-<div class="line"><a name="l12998"></a><span class="lineno">12998</span>&#160;        <span class="keywordflow">if</span>(result &gt;= m_PreferredBlockSize)</div>
-<div class="line"><a name="l12999"></a><span class="lineno">12999</span>&#160;        {</div>
-<div class="line"><a name="l13000"></a><span class="lineno">13000</span>&#160;            <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l13001"></a><span class="lineno">13001</span>&#160;        }</div>
-<div class="line"><a name="l13002"></a><span class="lineno">13002</span>&#160;    }</div>
-<div class="line"><a name="l13003"></a><span class="lineno">13003</span>&#160;    <span class="keywordflow">return</span> result;</div>
-<div class="line"><a name="l13004"></a><span class="lineno">13004</span>&#160;}</div>
-<div class="line"><a name="l13005"></a><span class="lineno">13005</span>&#160; </div>
-<div class="line"><a name="l13006"></a><span class="lineno">13006</span>&#160;<span class="keywordtype">void</span> VmaBlockVector::Remove(VmaDeviceMemoryBlock* pBlock)</div>
-<div class="line"><a name="l13007"></a><span class="lineno">13007</span>&#160;{</div>
-<div class="line"><a name="l13008"></a><span class="lineno">13008</span>&#160;    <span class="keywordflow">for</span>(uint32_t blockIndex = 0; blockIndex &lt; m_Blocks.size(); ++blockIndex)</div>
-<div class="line"><a name="l13009"></a><span class="lineno">13009</span>&#160;    {</div>
-<div class="line"><a name="l13010"></a><span class="lineno">13010</span>&#160;        <span class="keywordflow">if</span>(m_Blocks[blockIndex] == pBlock)</div>
-<div class="line"><a name="l13011"></a><span class="lineno">13011</span>&#160;        {</div>
-<div class="line"><a name="l13012"></a><span class="lineno">13012</span>&#160;            VmaVectorRemove(m_Blocks, blockIndex);</div>
-<div class="line"><a name="l13013"></a><span class="lineno">13013</span>&#160;            <span class="keywordflow">return</span>;</div>
-<div class="line"><a name="l13014"></a><span class="lineno">13014</span>&#160;        }</div>
-<div class="line"><a name="l13015"></a><span class="lineno">13015</span>&#160;    }</div>
-<div class="line"><a name="l13016"></a><span class="lineno">13016</span>&#160;    VMA_ASSERT(0);</div>
-<div class="line"><a name="l13017"></a><span class="lineno">13017</span>&#160;}</div>
-<div class="line"><a name="l13018"></a><span class="lineno">13018</span>&#160; </div>
-<div class="line"><a name="l13019"></a><span class="lineno">13019</span>&#160;<span class="keywordtype">void</span> VmaBlockVector::IncrementallySortBlocks()</div>
-<div class="line"><a name="l13020"></a><span class="lineno">13020</span>&#160;{</div>
-<div class="line"><a name="l13021"></a><span class="lineno">13021</span>&#160;    <span class="keywordflow">if</span>(m_Algorithm != <a class="code" href="vk__mem__alloc_8h.html#a9a7c45f9c863695d98c83fa5ac940fe7a13c8a444197c67866be9cb05599fc726">VMA_POOL_CREATE_LINEAR_ALGORITHM_BIT</a>)</div>
-<div class="line"><a name="l13022"></a><span class="lineno">13022</span>&#160;    {</div>
-<div class="line"><a name="l13023"></a><span class="lineno">13023</span>&#160;        <span class="comment">// Bubble sort only until first swap.</span></div>
-<div class="line"><a name="l13024"></a><span class="lineno">13024</span>&#160;        <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> i = 1; i &lt; m_Blocks.size(); ++i)</div>
-<div class="line"><a name="l13025"></a><span class="lineno">13025</span>&#160;        {</div>
-<div class="line"><a name="l13026"></a><span class="lineno">13026</span>&#160;            <span class="keywordflow">if</span>(m_Blocks[i - 1]-&gt;m_pMetadata-&gt;GetSumFreeSize() &gt; m_Blocks[i]-&gt;m_pMetadata-&gt;GetSumFreeSize())</div>
-<div class="line"><a name="l13027"></a><span class="lineno">13027</span>&#160;            {</div>
-<div class="line"><a name="l13028"></a><span class="lineno">13028</span>&#160;                VMA_SWAP(m_Blocks[i - 1], m_Blocks[i]);</div>
-<div class="line"><a name="l13029"></a><span class="lineno">13029</span>&#160;                <span class="keywordflow">return</span>;</div>
-<div class="line"><a name="l13030"></a><span class="lineno">13030</span>&#160;            }</div>
-<div class="line"><a name="l13031"></a><span class="lineno">13031</span>&#160;        }</div>
-<div class="line"><a name="l13032"></a><span class="lineno">13032</span>&#160;    }</div>
-<div class="line"><a name="l13033"></a><span class="lineno">13033</span>&#160;}</div>
-<div class="line"><a name="l13034"></a><span class="lineno">13034</span>&#160; </div>
-<div class="line"><a name="l13035"></a><span class="lineno">13035</span>&#160;VkResult VmaBlockVector::AllocateFromBlock(</div>
-<div class="line"><a name="l13036"></a><span class="lineno">13036</span>&#160;    VmaDeviceMemoryBlock* pBlock,</div>
-<div class="line"><a name="l13037"></a><span class="lineno">13037</span>&#160;    uint32_t currentFrameIndex,</div>
-<div class="line"><a name="l13038"></a><span class="lineno">13038</span>&#160;    VkDeviceSize size,</div>
-<div class="line"><a name="l13039"></a><span class="lineno">13039</span>&#160;    VkDeviceSize alignment,</div>
-<div class="line"><a name="l13040"></a><span class="lineno">13040</span>&#160;    <a class="code" href="vk__mem__alloc_8h.html#a5225e5e11f8376f6a31a1791f3d6e817">VmaAllocationCreateFlags</a> allocFlags,</div>
-<div class="line"><a name="l13041"></a><span class="lineno">13041</span>&#160;    <span class="keywordtype">void</span>* pUserData,</div>
-<div class="line"><a name="l13042"></a><span class="lineno">13042</span>&#160;    VmaSuballocationType suballocType,</div>
-<div class="line"><a name="l13043"></a><span class="lineno">13043</span>&#160;    uint32_t strategy,</div>
-<div class="line"><a name="l13044"></a><span class="lineno">13044</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a>* pAllocation)</div>
-<div class="line"><a name="l13045"></a><span class="lineno">13045</span>&#160;{</div>
-<div class="line"><a name="l13046"></a><span class="lineno">13046</span>&#160;    VMA_ASSERT((allocFlags &amp; <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a68686d0ce9beb0d4d1b9f2b8b1389a7e">VMA_ALLOCATION_CREATE_CAN_MAKE_OTHER_LOST_BIT</a>) == 0);</div>
-<div class="line"><a name="l13047"></a><span class="lineno">13047</span>&#160;    <span class="keyword">const</span> <span class="keywordtype">bool</span> isUpperAddress = (allocFlags &amp; <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a42ba3a2d2c7117953210b7c3ef8da0df">VMA_ALLOCATION_CREATE_UPPER_ADDRESS_BIT</a>) != 0;</div>
-<div class="line"><a name="l13048"></a><span class="lineno">13048</span>&#160;    <span class="keyword">const</span> <span class="keywordtype">bool</span> mapped = (allocFlags &amp; <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a11da372cc3a82931c5e5d6146cd9dd1f">VMA_ALLOCATION_CREATE_MAPPED_BIT</a>) != 0;</div>
-<div class="line"><a name="l13049"></a><span class="lineno">13049</span>&#160;    <span class="keyword">const</span> <span class="keywordtype">bool</span> isUserDataString = (allocFlags &amp; <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597aa6f24f821cd6a7c5e4a443f7bf59c520">VMA_ALLOCATION_CREATE_USER_DATA_COPY_STRING_BIT</a>) != 0;</div>
-<div class="line"><a name="l13050"></a><span class="lineno">13050</span>&#160; </div>
-<div class="line"><a name="l13051"></a><span class="lineno">13051</span>&#160;    VmaAllocationRequest currRequest = {};</div>
-<div class="line"><a name="l13052"></a><span class="lineno">13052</span>&#160;    <span class="keywordflow">if</span>(pBlock-&gt;m_pMetadata-&gt;CreateAllocationRequest(</div>
-<div class="line"><a name="l13053"></a><span class="lineno">13053</span>&#160;        currentFrameIndex,</div>
-<div class="line"><a name="l13054"></a><span class="lineno">13054</span>&#160;        m_FrameInUseCount,</div>
-<div class="line"><a name="l13055"></a><span class="lineno">13055</span>&#160;        m_BufferImageGranularity,</div>
-<div class="line"><a name="l13056"></a><span class="lineno">13056</span>&#160;        size,</div>
-<div class="line"><a name="l13057"></a><span class="lineno">13057</span>&#160;        alignment,</div>
-<div class="line"><a name="l13058"></a><span class="lineno">13058</span>&#160;        isUpperAddress,</div>
-<div class="line"><a name="l13059"></a><span class="lineno">13059</span>&#160;        suballocType,</div>
-<div class="line"><a name="l13060"></a><span class="lineno">13060</span>&#160;        <span class="keyword">false</span>, <span class="comment">// canMakeOtherLost</span></div>
-<div class="line"><a name="l13061"></a><span class="lineno">13061</span>&#160;        strategy,</div>
-<div class="line"><a name="l13062"></a><span class="lineno">13062</span>&#160;        &amp;currRequest))</div>
-<div class="line"><a name="l13063"></a><span class="lineno">13063</span>&#160;    {</div>
-<div class="line"><a name="l13064"></a><span class="lineno">13064</span>&#160;        <span class="comment">// Allocate from pCurrBlock.</span></div>
-<div class="line"><a name="l13065"></a><span class="lineno">13065</span>&#160;        VMA_ASSERT(currRequest.itemsToMakeLostCount == 0);</div>
-<div class="line"><a name="l13066"></a><span class="lineno">13066</span>&#160; </div>
-<div class="line"><a name="l13067"></a><span class="lineno">13067</span>&#160;        <span class="keywordflow">if</span>(mapped)</div>
-<div class="line"><a name="l13068"></a><span class="lineno">13068</span>&#160;        {</div>
-<div class="line"><a name="l13069"></a><span class="lineno">13069</span>&#160;            VkResult res = pBlock-&gt;Map(m_hAllocator, 1, VMA_NULL);</div>
-<div class="line"><a name="l13070"></a><span class="lineno">13070</span>&#160;            <span class="keywordflow">if</span>(res != VK_SUCCESS)</div>
-<div class="line"><a name="l13071"></a><span class="lineno">13071</span>&#160;            {</div>
-<div class="line"><a name="l13072"></a><span class="lineno">13072</span>&#160;                <span class="keywordflow">return</span> res;</div>
-<div class="line"><a name="l13073"></a><span class="lineno">13073</span>&#160;            }</div>
-<div class="line"><a name="l13074"></a><span class="lineno">13074</span>&#160;        }</div>
-<div class="line"><a name="l13075"></a><span class="lineno">13075</span>&#160;            </div>
-<div class="line"><a name="l13076"></a><span class="lineno">13076</span>&#160;        *pAllocation = m_hAllocator-&gt;m_AllocationObjectAllocator.Allocate(currentFrameIndex, isUserDataString);</div>
-<div class="line"><a name="l13077"></a><span class="lineno">13077</span>&#160;        pBlock-&gt;m_pMetadata-&gt;Alloc(currRequest, suballocType, size, *pAllocation);</div>
-<div class="line"><a name="l13078"></a><span class="lineno">13078</span>&#160;        UpdateHasEmptyBlock();</div>
-<div class="line"><a name="l13079"></a><span class="lineno">13079</span>&#160;        (*pAllocation)-&gt;InitBlockAllocation(</div>
-<div class="line"><a name="l13080"></a><span class="lineno">13080</span>&#160;            pBlock,</div>
-<div class="line"><a name="l13081"></a><span class="lineno">13081</span>&#160;            currRequest.offset,</div>
-<div class="line"><a name="l13082"></a><span class="lineno">13082</span>&#160;            alignment,</div>
-<div class="line"><a name="l13083"></a><span class="lineno">13083</span>&#160;            size,</div>
-<div class="line"><a name="l13084"></a><span class="lineno">13084</span>&#160;            m_MemoryTypeIndex,</div>
-<div class="line"><a name="l13085"></a><span class="lineno">13085</span>&#160;            suballocType,</div>
-<div class="line"><a name="l13086"></a><span class="lineno">13086</span>&#160;            mapped,</div>
-<div class="line"><a name="l13087"></a><span class="lineno">13087</span>&#160;            (allocFlags &amp; <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a5f436af6c8fe8540573a6d22627a6fd2">VMA_ALLOCATION_CREATE_CAN_BECOME_LOST_BIT</a>) != 0);</div>
-<div class="line"><a name="l13088"></a><span class="lineno">13088</span>&#160;        VMA_HEAVY_ASSERT(pBlock-&gt;Validate());</div>
-<div class="line"><a name="l13089"></a><span class="lineno">13089</span>&#160;        (*pAllocation)-&gt;SetUserData(m_hAllocator, pUserData);</div>
-<div class="line"><a name="l13090"></a><span class="lineno">13090</span>&#160;        m_hAllocator-&gt;m_Budget.AddAllocation(m_hAllocator-&gt;MemoryTypeIndexToHeapIndex(m_MemoryTypeIndex), size);</div>
-<div class="line"><a name="l13091"></a><span class="lineno">13091</span>&#160;        <span class="keywordflow">if</span>(VMA_DEBUG_INITIALIZE_ALLOCATIONS)</div>
-<div class="line"><a name="l13092"></a><span class="lineno">13092</span>&#160;        {</div>
-<div class="line"><a name="l13093"></a><span class="lineno">13093</span>&#160;            m_hAllocator-&gt;FillAllocation(*pAllocation, VMA_ALLOCATION_FILL_PATTERN_CREATED);</div>
-<div class="line"><a name="l13094"></a><span class="lineno">13094</span>&#160;        }</div>
-<div class="line"><a name="l13095"></a><span class="lineno">13095</span>&#160;        <span class="keywordflow">if</span>(IsCorruptionDetectionEnabled())</div>
-<div class="line"><a name="l13096"></a><span class="lineno">13096</span>&#160;        {</div>
-<div class="line"><a name="l13097"></a><span class="lineno">13097</span>&#160;            VkResult res = pBlock-&gt;WriteMagicValueAroundAllocation(m_hAllocator, currRequest.offset, size);</div>
-<div class="line"><a name="l13098"></a><span class="lineno">13098</span>&#160;            VMA_ASSERT(res == VK_SUCCESS &amp;&amp; <span class="stringliteral">&quot;Couldn&#39;t map block memory to write magic value.&quot;</span>);</div>
-<div class="line"><a name="l13099"></a><span class="lineno">13099</span>&#160;        }</div>
-<div class="line"><a name="l13100"></a><span class="lineno">13100</span>&#160;        <span class="keywordflow">return</span> VK_SUCCESS;</div>
-<div class="line"><a name="l13101"></a><span class="lineno">13101</span>&#160;    }</div>
-<div class="line"><a name="l13102"></a><span class="lineno">13102</span>&#160;    <span class="keywordflow">return</span> VK_ERROR_OUT_OF_DEVICE_MEMORY;</div>
-<div class="line"><a name="l13103"></a><span class="lineno">13103</span>&#160;}</div>
-<div class="line"><a name="l13104"></a><span class="lineno">13104</span>&#160; </div>
-<div class="line"><a name="l13105"></a><span class="lineno">13105</span>&#160;VkResult VmaBlockVector::CreateBlock(VkDeviceSize blockSize, <span class="keywordtype">size_t</span>* pNewBlockIndex)</div>
-<div class="line"><a name="l13106"></a><span class="lineno">13106</span>&#160;{</div>
-<div class="line"><a name="l13107"></a><span class="lineno">13107</span>&#160;    VkMemoryAllocateInfo allocInfo = { VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO };</div>
-<div class="line"><a name="l13108"></a><span class="lineno">13108</span>&#160;    allocInfo.memoryTypeIndex = m_MemoryTypeIndex;</div>
-<div class="line"><a name="l13109"></a><span class="lineno">13109</span>&#160;    allocInfo.allocationSize = blockSize;</div>
-<div class="line"><a name="l13110"></a><span class="lineno">13110</span>&#160; </div>
-<div class="line"><a name="l13111"></a><span class="lineno">13111</span>&#160;<span class="preprocessor">#if VMA_BUFFER_DEVICE_ADDRESS</span></div>
-<div class="line"><a name="l13112"></a><span class="lineno">13112</span>&#160;    <span class="comment">// Every standalone block can potentially contain a buffer with VK_BUFFER_USAGE_SHADER_DEVICE_ADDRESS_BIT - always enable the feature.</span></div>
-<div class="line"><a name="l13113"></a><span class="lineno">13113</span>&#160;    VkMemoryAllocateFlagsInfoKHR allocFlagsInfo = { VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_FLAGS_INFO_KHR };</div>
-<div class="line"><a name="l13114"></a><span class="lineno">13114</span>&#160;    <span class="keywordflow">if</span>(m_hAllocator-&gt;m_UseKhrBufferDeviceAddress)</div>
-<div class="line"><a name="l13115"></a><span class="lineno">13115</span>&#160;    {</div>
-<div class="line"><a name="l13116"></a><span class="lineno">13116</span>&#160;        allocFlagsInfo.flags = VK_MEMORY_ALLOCATE_DEVICE_ADDRESS_BIT_KHR;</div>
-<div class="line"><a name="l13117"></a><span class="lineno">13117</span>&#160;        VmaPnextChainPushFront(&amp;allocInfo, &amp;allocFlagsInfo);</div>
-<div class="line"><a name="l13118"></a><span class="lineno">13118</span>&#160;    }</div>
-<div class="line"><a name="l13119"></a><span class="lineno">13119</span>&#160;<span class="preprocessor">#endif // #if VMA_BUFFER_DEVICE_ADDRESS</span></div>
+<div class="line"><a name="l12978"></a><span class="lineno">12978</span>&#160;<span class="keywordtype">bool</span> VmaBlockVector::IsEmpty()</div>
+<div class="line"><a name="l12979"></a><span class="lineno">12979</span>&#160;{</div>
+<div class="line"><a name="l12980"></a><span class="lineno">12980</span>&#160;    VmaMutexLockRead lock(m_Mutex, m_hAllocator-&gt;m_UseMutex);</div>
+<div class="line"><a name="l12981"></a><span class="lineno">12981</span>&#160;    <span class="keywordflow">return</span> m_Blocks.empty();</div>
+<div class="line"><a name="l12982"></a><span class="lineno">12982</span>&#160;}</div>
+<div class="line"><a name="l12983"></a><span class="lineno">12983</span>&#160; </div>
+<div class="line"><a name="l12984"></a><span class="lineno">12984</span>&#160;<span class="keywordtype">bool</span> VmaBlockVector::IsCorruptionDetectionEnabled()<span class="keyword"> const</span></div>
+<div class="line"><a name="l12985"></a><span class="lineno">12985</span>&#160;<span class="keyword"></span>{</div>
+<div class="line"><a name="l12986"></a><span class="lineno">12986</span>&#160;    <span class="keyword">const</span> uint32_t requiredMemFlags = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT;</div>
+<div class="line"><a name="l12987"></a><span class="lineno">12987</span>&#160;    <span class="keywordflow">return</span> (VMA_DEBUG_DETECT_CORRUPTION != 0) &amp;&amp;</div>
+<div class="line"><a name="l12988"></a><span class="lineno">12988</span>&#160;        (VMA_DEBUG_MARGIN &gt; 0) &amp;&amp;</div>
+<div class="line"><a name="l12989"></a><span class="lineno">12989</span>&#160;        (m_Algorithm == 0 || m_Algorithm == <a class="code" href="vk__mem__alloc_8h.html#a9a7c45f9c863695d98c83fa5ac940fe7a13c8a444197c67866be9cb05599fc726">VMA_POOL_CREATE_LINEAR_ALGORITHM_BIT</a>) &amp;&amp;</div>
+<div class="line"><a name="l12990"></a><span class="lineno">12990</span>&#160;        (m_hAllocator-&gt;m_MemProps.memoryTypes[m_MemoryTypeIndex].propertyFlags &amp; requiredMemFlags) == requiredMemFlags;</div>
+<div class="line"><a name="l12991"></a><span class="lineno">12991</span>&#160;}</div>
+<div class="line"><a name="l12992"></a><span class="lineno">12992</span>&#160; </div>
+<div class="line"><a name="l12993"></a><span class="lineno">12993</span>&#160;<span class="keyword">static</span> <span class="keyword">const</span> uint32_t VMA_ALLOCATION_TRY_COUNT = 32;</div>
+<div class="line"><a name="l12994"></a><span class="lineno">12994</span>&#160; </div>
+<div class="line"><a name="l12995"></a><span class="lineno">12995</span>&#160;VkResult VmaBlockVector::Allocate(</div>
+<div class="line"><a name="l12996"></a><span class="lineno">12996</span>&#160;    uint32_t currentFrameIndex,</div>
+<div class="line"><a name="l12997"></a><span class="lineno">12997</span>&#160;    VkDeviceSize size,</div>
+<div class="line"><a name="l12998"></a><span class="lineno">12998</span>&#160;    VkDeviceSize alignment,</div>
+<div class="line"><a name="l12999"></a><span class="lineno">12999</span>&#160;    <span class="keyword">const</span> <a class="code" href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a>&amp; createInfo,</div>
+<div class="line"><a name="l13000"></a><span class="lineno">13000</span>&#160;    VmaSuballocationType suballocType,</div>
+<div class="line"><a name="l13001"></a><span class="lineno">13001</span>&#160;    <span class="keywordtype">size_t</span> allocationCount,</div>
+<div class="line"><a name="l13002"></a><span class="lineno">13002</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a>* pAllocations)</div>
+<div class="line"><a name="l13003"></a><span class="lineno">13003</span>&#160;{</div>
+<div class="line"><a name="l13004"></a><span class="lineno">13004</span>&#160;    <span class="keywordtype">size_t</span> allocIndex;</div>
+<div class="line"><a name="l13005"></a><span class="lineno">13005</span>&#160;    VkResult res = VK_SUCCESS;</div>
+<div class="line"><a name="l13006"></a><span class="lineno">13006</span>&#160; </div>
+<div class="line"><a name="l13007"></a><span class="lineno">13007</span>&#160;    <span class="keywordflow">if</span>(IsCorruptionDetectionEnabled())</div>
+<div class="line"><a name="l13008"></a><span class="lineno">13008</span>&#160;    {</div>
+<div class="line"><a name="l13009"></a><span class="lineno">13009</span>&#160;        size = VmaAlignUp&lt;VkDeviceSize&gt;(size, <span class="keyword">sizeof</span>(VMA_CORRUPTION_DETECTION_MAGIC_VALUE));</div>
+<div class="line"><a name="l13010"></a><span class="lineno">13010</span>&#160;        alignment = VmaAlignUp&lt;VkDeviceSize&gt;(alignment, <span class="keyword">sizeof</span>(VMA_CORRUPTION_DETECTION_MAGIC_VALUE));</div>
+<div class="line"><a name="l13011"></a><span class="lineno">13011</span>&#160;    }</div>
+<div class="line"><a name="l13012"></a><span class="lineno">13012</span>&#160; </div>
+<div class="line"><a name="l13013"></a><span class="lineno">13013</span>&#160;    {</div>
+<div class="line"><a name="l13014"></a><span class="lineno">13014</span>&#160;        VmaMutexLockWrite lock(m_Mutex, m_hAllocator-&gt;m_UseMutex);</div>
+<div class="line"><a name="l13015"></a><span class="lineno">13015</span>&#160;        <span class="keywordflow">for</span>(allocIndex = 0; allocIndex &lt; allocationCount; ++allocIndex)</div>
+<div class="line"><a name="l13016"></a><span class="lineno">13016</span>&#160;        {</div>
+<div class="line"><a name="l13017"></a><span class="lineno">13017</span>&#160;            res = AllocatePage(</div>
+<div class="line"><a name="l13018"></a><span class="lineno">13018</span>&#160;                currentFrameIndex,</div>
+<div class="line"><a name="l13019"></a><span class="lineno">13019</span>&#160;                size,</div>
+<div class="line"><a name="l13020"></a><span class="lineno">13020</span>&#160;                alignment,</div>
+<div class="line"><a name="l13021"></a><span class="lineno">13021</span>&#160;                createInfo,</div>
+<div class="line"><a name="l13022"></a><span class="lineno">13022</span>&#160;                suballocType,</div>
+<div class="line"><a name="l13023"></a><span class="lineno">13023</span>&#160;                pAllocations + allocIndex);</div>
+<div class="line"><a name="l13024"></a><span class="lineno">13024</span>&#160;            <span class="keywordflow">if</span>(res != VK_SUCCESS)</div>
+<div class="line"><a name="l13025"></a><span class="lineno">13025</span>&#160;            {</div>
+<div class="line"><a name="l13026"></a><span class="lineno">13026</span>&#160;                <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l13027"></a><span class="lineno">13027</span>&#160;            }</div>
+<div class="line"><a name="l13028"></a><span class="lineno">13028</span>&#160;        }</div>
+<div class="line"><a name="l13029"></a><span class="lineno">13029</span>&#160;    }</div>
+<div class="line"><a name="l13030"></a><span class="lineno">13030</span>&#160; </div>
+<div class="line"><a name="l13031"></a><span class="lineno">13031</span>&#160;    <span class="keywordflow">if</span>(res != VK_SUCCESS)</div>
+<div class="line"><a name="l13032"></a><span class="lineno">13032</span>&#160;    {</div>
+<div class="line"><a name="l13033"></a><span class="lineno">13033</span>&#160;        <span class="comment">// Free all already created allocations.</span></div>
+<div class="line"><a name="l13034"></a><span class="lineno">13034</span>&#160;        <span class="keyword">const</span> uint32_t heapIndex = m_hAllocator-&gt;MemoryTypeIndexToHeapIndex(m_MemoryTypeIndex);</div>
+<div class="line"><a name="l13035"></a><span class="lineno">13035</span>&#160;        <span class="keywordflow">while</span>(allocIndex--)</div>
+<div class="line"><a name="l13036"></a><span class="lineno">13036</span>&#160;        {</div>
+<div class="line"><a name="l13037"></a><span class="lineno">13037</span>&#160;            VmaAllocation_T* <span class="keyword">const</span> alloc = pAllocations[allocIndex];</div>
+<div class="line"><a name="l13038"></a><span class="lineno">13038</span>&#160;            <span class="keyword">const</span> VkDeviceSize allocSize = alloc-&gt;GetSize();</div>
+<div class="line"><a name="l13039"></a><span class="lineno">13039</span>&#160;            Free(alloc);</div>
+<div class="line"><a name="l13040"></a><span class="lineno">13040</span>&#160;            m_hAllocator-&gt;m_Budget.RemoveAllocation(heapIndex, allocSize);</div>
+<div class="line"><a name="l13041"></a><span class="lineno">13041</span>&#160;        }</div>
+<div class="line"><a name="l13042"></a><span class="lineno">13042</span>&#160;        memset(pAllocations, 0, <span class="keyword">sizeof</span>(<a class="code" href="struct_vma_allocation.html">VmaAllocation</a>) * allocationCount);</div>
+<div class="line"><a name="l13043"></a><span class="lineno">13043</span>&#160;    }</div>
+<div class="line"><a name="l13044"></a><span class="lineno">13044</span>&#160; </div>
+<div class="line"><a name="l13045"></a><span class="lineno">13045</span>&#160;    <span class="keywordflow">return</span> res;</div>
+<div class="line"><a name="l13046"></a><span class="lineno">13046</span>&#160;}</div>
+<div class="line"><a name="l13047"></a><span class="lineno">13047</span>&#160; </div>
+<div class="line"><a name="l13048"></a><span class="lineno">13048</span>&#160;VkResult VmaBlockVector::AllocatePage(</div>
+<div class="line"><a name="l13049"></a><span class="lineno">13049</span>&#160;    uint32_t currentFrameIndex,</div>
+<div class="line"><a name="l13050"></a><span class="lineno">13050</span>&#160;    VkDeviceSize size,</div>
+<div class="line"><a name="l13051"></a><span class="lineno">13051</span>&#160;    VkDeviceSize alignment,</div>
+<div class="line"><a name="l13052"></a><span class="lineno">13052</span>&#160;    <span class="keyword">const</span> <a class="code" href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a>&amp; createInfo,</div>
+<div class="line"><a name="l13053"></a><span class="lineno">13053</span>&#160;    VmaSuballocationType suballocType,</div>
+<div class="line"><a name="l13054"></a><span class="lineno">13054</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a>* pAllocation)</div>
+<div class="line"><a name="l13055"></a><span class="lineno">13055</span>&#160;{</div>
+<div class="line"><a name="l13056"></a><span class="lineno">13056</span>&#160;    <span class="keyword">const</span> <span class="keywordtype">bool</span> isUpperAddress = (createInfo.<a class="code" href="struct_vma_allocation_create_info.html#add09658ac14fe290ace25470ddd6d41b">flags</a> &amp; <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a42ba3a2d2c7117953210b7c3ef8da0df">VMA_ALLOCATION_CREATE_UPPER_ADDRESS_BIT</a>) != 0;</div>
+<div class="line"><a name="l13057"></a><span class="lineno">13057</span>&#160;    <span class="keywordtype">bool</span> canMakeOtherLost = (createInfo.<a class="code" href="struct_vma_allocation_create_info.html#add09658ac14fe290ace25470ddd6d41b">flags</a> &amp; <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a68686d0ce9beb0d4d1b9f2b8b1389a7e">VMA_ALLOCATION_CREATE_CAN_MAKE_OTHER_LOST_BIT</a>) != 0;</div>
+<div class="line"><a name="l13058"></a><span class="lineno">13058</span>&#160;    <span class="keyword">const</span> <span class="keywordtype">bool</span> mapped = (createInfo.<a class="code" href="struct_vma_allocation_create_info.html#add09658ac14fe290ace25470ddd6d41b">flags</a> &amp; <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a11da372cc3a82931c5e5d6146cd9dd1f">VMA_ALLOCATION_CREATE_MAPPED_BIT</a>) != 0;</div>
+<div class="line"><a name="l13059"></a><span class="lineno">13059</span>&#160;    <span class="keyword">const</span> <span class="keywordtype">bool</span> isUserDataString = (createInfo.<a class="code" href="struct_vma_allocation_create_info.html#add09658ac14fe290ace25470ddd6d41b">flags</a> &amp; <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597aa6f24f821cd6a7c5e4a443f7bf59c520">VMA_ALLOCATION_CREATE_USER_DATA_COPY_STRING_BIT</a>) != 0;</div>
+<div class="line"><a name="l13060"></a><span class="lineno">13060</span>&#160; </div>
+<div class="line"><a name="l13061"></a><span class="lineno">13061</span>&#160;    VkDeviceSize freeMemory;</div>
+<div class="line"><a name="l13062"></a><span class="lineno">13062</span>&#160;    {</div>
+<div class="line"><a name="l13063"></a><span class="lineno">13063</span>&#160;        <span class="keyword">const</span> uint32_t heapIndex = m_hAllocator-&gt;MemoryTypeIndexToHeapIndex(m_MemoryTypeIndex);</div>
+<div class="line"><a name="l13064"></a><span class="lineno">13064</span>&#160;        <a class="code" href="struct_vma_budget.html">VmaBudget</a> heapBudget = {};</div>
+<div class="line"><a name="l13065"></a><span class="lineno">13065</span>&#160;        m_hAllocator-&gt;GetBudget(&amp;heapBudget, heapIndex, 1);</div>
+<div class="line"><a name="l13066"></a><span class="lineno">13066</span>&#160;        freeMemory = (heapBudget.<a class="code" href="struct_vma_budget.html#a84dd1ecca8b0110259eb206dbadb11f6">usage</a> &lt; heapBudget.<a class="code" href="struct_vma_budget.html#ab82e1d1754c2d210d0bdf90220bc6cdd">budget</a>) ? (heapBudget.<a class="code" href="struct_vma_budget.html#ab82e1d1754c2d210d0bdf90220bc6cdd">budget</a> - heapBudget.<a class="code" href="struct_vma_budget.html#a84dd1ecca8b0110259eb206dbadb11f6">usage</a>) : 0;</div>
+<div class="line"><a name="l13067"></a><span class="lineno">13067</span>&#160;    }</div>
+<div class="line"><a name="l13068"></a><span class="lineno">13068</span>&#160; </div>
+<div class="line"><a name="l13069"></a><span class="lineno">13069</span>&#160;    <span class="keyword">const</span> <span class="keywordtype">bool</span> canFallbackToDedicated = !IsCustomPool();</div>
+<div class="line"><a name="l13070"></a><span class="lineno">13070</span>&#160;    <span class="keyword">const</span> <span class="keywordtype">bool</span> canCreateNewBlock =</div>
+<div class="line"><a name="l13071"></a><span class="lineno">13071</span>&#160;        ((createInfo.<a class="code" href="struct_vma_allocation_create_info.html#add09658ac14fe290ace25470ddd6d41b">flags</a> &amp; <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a89759603401014eb325eb22a3839f2ff">VMA_ALLOCATION_CREATE_NEVER_ALLOCATE_BIT</a>) == 0) &amp;&amp;</div>
+<div class="line"><a name="l13072"></a><span class="lineno">13072</span>&#160;        (m_Blocks.size() &lt; m_MaxBlockCount) &amp;&amp;</div>
+<div class="line"><a name="l13073"></a><span class="lineno">13073</span>&#160;        (freeMemory &gt;= size || !canFallbackToDedicated);</div>
+<div class="line"><a name="l13074"></a><span class="lineno">13074</span>&#160;    uint32_t strategy = createInfo.<a class="code" href="struct_vma_allocation_create_info.html#add09658ac14fe290ace25470ddd6d41b">flags</a> &amp; <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a8e16845d81ae3d27c47106d4770d5c7e">VMA_ALLOCATION_CREATE_STRATEGY_MASK</a>;</div>
+<div class="line"><a name="l13075"></a><span class="lineno">13075</span>&#160; </div>
+<div class="line"><a name="l13076"></a><span class="lineno">13076</span>&#160;    <span class="comment">// If linearAlgorithm is used, canMakeOtherLost is available only when used as ring buffer.</span></div>
+<div class="line"><a name="l13077"></a><span class="lineno">13077</span>&#160;    <span class="comment">// Which in turn is available only when maxBlockCount = 1.</span></div>
+<div class="line"><a name="l13078"></a><span class="lineno">13078</span>&#160;    <span class="keywordflow">if</span>(m_Algorithm == <a class="code" href="vk__mem__alloc_8h.html#a9a7c45f9c863695d98c83fa5ac940fe7a13c8a444197c67866be9cb05599fc726">VMA_POOL_CREATE_LINEAR_ALGORITHM_BIT</a> &amp;&amp; m_MaxBlockCount &gt; 1)</div>
+<div class="line"><a name="l13079"></a><span class="lineno">13079</span>&#160;    {</div>
+<div class="line"><a name="l13080"></a><span class="lineno">13080</span>&#160;        canMakeOtherLost = <span class="keyword">false</span>;</div>
+<div class="line"><a name="l13081"></a><span class="lineno">13081</span>&#160;    }</div>
+<div class="line"><a name="l13082"></a><span class="lineno">13082</span>&#160; </div>
+<div class="line"><a name="l13083"></a><span class="lineno">13083</span>&#160;    <span class="comment">// Upper address can only be used with linear allocator and within single memory block.</span></div>
+<div class="line"><a name="l13084"></a><span class="lineno">13084</span>&#160;    <span class="keywordflow">if</span>(isUpperAddress &amp;&amp;</div>
+<div class="line"><a name="l13085"></a><span class="lineno">13085</span>&#160;        (m_Algorithm != <a class="code" href="vk__mem__alloc_8h.html#a9a7c45f9c863695d98c83fa5ac940fe7a13c8a444197c67866be9cb05599fc726">VMA_POOL_CREATE_LINEAR_ALGORITHM_BIT</a> || m_MaxBlockCount &gt; 1))</div>
+<div class="line"><a name="l13086"></a><span class="lineno">13086</span>&#160;    {</div>
+<div class="line"><a name="l13087"></a><span class="lineno">13087</span>&#160;        <span class="keywordflow">return</span> VK_ERROR_FEATURE_NOT_PRESENT;</div>
+<div class="line"><a name="l13088"></a><span class="lineno">13088</span>&#160;    }</div>
+<div class="line"><a name="l13089"></a><span class="lineno">13089</span>&#160; </div>
+<div class="line"><a name="l13090"></a><span class="lineno">13090</span>&#160;    <span class="comment">// Validate strategy.</span></div>
+<div class="line"><a name="l13091"></a><span class="lineno">13091</span>&#160;    <span class="keywordflow">switch</span>(strategy)</div>
+<div class="line"><a name="l13092"></a><span class="lineno">13092</span>&#160;    {</div>
+<div class="line"><a name="l13093"></a><span class="lineno">13093</span>&#160;    <span class="keywordflow">case</span> 0:</div>
+<div class="line"><a name="l13094"></a><span class="lineno">13094</span>&#160;        strategy = <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a839826775c62319466441f86496f036d">VMA_ALLOCATION_CREATE_STRATEGY_BEST_FIT_BIT</a>;</div>
+<div class="line"><a name="l13095"></a><span class="lineno">13095</span>&#160;        <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l13096"></a><span class="lineno">13096</span>&#160;    <span class="keywordflow">case</span> <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a839826775c62319466441f86496f036d">VMA_ALLOCATION_CREATE_STRATEGY_BEST_FIT_BIT</a>:</div>
+<div class="line"><a name="l13097"></a><span class="lineno">13097</span>&#160;    <span class="keywordflow">case</span> <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597ad242a04f802e25fef0b880afe8bb0a62">VMA_ALLOCATION_CREATE_STRATEGY_WORST_FIT_BIT</a>:</div>
+<div class="line"><a name="l13098"></a><span class="lineno">13098</span>&#160;    <span class="keywordflow">case</span> <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a33eb2052674f3ad92386c714a65fb777">VMA_ALLOCATION_CREATE_STRATEGY_FIRST_FIT_BIT</a>:</div>
+<div class="line"><a name="l13099"></a><span class="lineno">13099</span>&#160;        <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l13100"></a><span class="lineno">13100</span>&#160;    <span class="keywordflow">default</span>:</div>
+<div class="line"><a name="l13101"></a><span class="lineno">13101</span>&#160;        <span class="keywordflow">return</span> VK_ERROR_FEATURE_NOT_PRESENT;</div>
+<div class="line"><a name="l13102"></a><span class="lineno">13102</span>&#160;    }</div>
+<div class="line"><a name="l13103"></a><span class="lineno">13103</span>&#160; </div>
+<div class="line"><a name="l13104"></a><span class="lineno">13104</span>&#160;    <span class="comment">// Early reject: requested allocation size is larger that maximum block size for this block vector.</span></div>
+<div class="line"><a name="l13105"></a><span class="lineno">13105</span>&#160;    <span class="keywordflow">if</span>(size + 2 * VMA_DEBUG_MARGIN &gt; m_PreferredBlockSize)</div>
+<div class="line"><a name="l13106"></a><span class="lineno">13106</span>&#160;    {</div>
+<div class="line"><a name="l13107"></a><span class="lineno">13107</span>&#160;        <span class="keywordflow">return</span> VK_ERROR_OUT_OF_DEVICE_MEMORY;</div>
+<div class="line"><a name="l13108"></a><span class="lineno">13108</span>&#160;    }</div>
+<div class="line"><a name="l13109"></a><span class="lineno">13109</span>&#160; </div>
+<div class="line"><a name="l13110"></a><span class="lineno">13110</span>&#160;    <span class="comment">/*</span></div>
+<div class="line"><a name="l13111"></a><span class="lineno">13111</span>&#160;<span class="comment">    Under certain condition, this whole section can be skipped for optimization, so</span></div>
+<div class="line"><a name="l13112"></a><span class="lineno">13112</span>&#160;<span class="comment">    we move on directly to trying to allocate with canMakeOtherLost. That&#39;s the case</span></div>
+<div class="line"><a name="l13113"></a><span class="lineno">13113</span>&#160;<span class="comment">    e.g. for custom pools with linear algorithm.</span></div>
+<div class="line"><a name="l13114"></a><span class="lineno">13114</span>&#160;<span class="comment">    */</span></div>
+<div class="line"><a name="l13115"></a><span class="lineno">13115</span>&#160;    <span class="keywordflow">if</span>(!canMakeOtherLost || canCreateNewBlock)</div>
+<div class="line"><a name="l13116"></a><span class="lineno">13116</span>&#160;    {</div>
+<div class="line"><a name="l13117"></a><span class="lineno">13117</span>&#160;        <span class="comment">// 1. Search existing allocations. Try to allocate without making other allocations lost.</span></div>
+<div class="line"><a name="l13118"></a><span class="lineno">13118</span>&#160;        <a class="code" href="vk__mem__alloc_8h.html#a5225e5e11f8376f6a31a1791f3d6e817">VmaAllocationCreateFlags</a> allocFlagsCopy = createInfo.<a class="code" href="struct_vma_allocation_create_info.html#add09658ac14fe290ace25470ddd6d41b">flags</a>;</div>
+<div class="line"><a name="l13119"></a><span class="lineno">13119</span>&#160;        allocFlagsCopy &amp;= ~<a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a68686d0ce9beb0d4d1b9f2b8b1389a7e">VMA_ALLOCATION_CREATE_CAN_MAKE_OTHER_LOST_BIT</a>;</div>
 <div class="line"><a name="l13120"></a><span class="lineno">13120</span>&#160; </div>
-<div class="line"><a name="l13121"></a><span class="lineno">13121</span>&#160;    VkDeviceMemory mem = VK_NULL_HANDLE;</div>
-<div class="line"><a name="l13122"></a><span class="lineno">13122</span>&#160;    VkResult res = m_hAllocator-&gt;AllocateVulkanMemory(&amp;allocInfo, &amp;mem);</div>
-<div class="line"><a name="l13123"></a><span class="lineno">13123</span>&#160;    <span class="keywordflow">if</span>(res &lt; 0)</div>
-<div class="line"><a name="l13124"></a><span class="lineno">13124</span>&#160;    {</div>
-<div class="line"><a name="l13125"></a><span class="lineno">13125</span>&#160;        <span class="keywordflow">return</span> res;</div>
-<div class="line"><a name="l13126"></a><span class="lineno">13126</span>&#160;    }</div>
-<div class="line"><a name="l13127"></a><span class="lineno">13127</span>&#160; </div>
-<div class="line"><a name="l13128"></a><span class="lineno">13128</span>&#160;    <span class="comment">// New VkDeviceMemory successfully created.</span></div>
-<div class="line"><a name="l13129"></a><span class="lineno">13129</span>&#160; </div>
-<div class="line"><a name="l13130"></a><span class="lineno">13130</span>&#160;    <span class="comment">// Create new Allocation for it.</span></div>
-<div class="line"><a name="l13131"></a><span class="lineno">13131</span>&#160;    VmaDeviceMemoryBlock* <span class="keyword">const</span> pBlock = vma_new(m_hAllocator, VmaDeviceMemoryBlock)(m_hAllocator);</div>
-<div class="line"><a name="l13132"></a><span class="lineno">13132</span>&#160;    pBlock-&gt;Init(</div>
-<div class="line"><a name="l13133"></a><span class="lineno">13133</span>&#160;        m_hAllocator,</div>
-<div class="line"><a name="l13134"></a><span class="lineno">13134</span>&#160;        m_hParentPool,</div>
-<div class="line"><a name="l13135"></a><span class="lineno">13135</span>&#160;        m_MemoryTypeIndex,</div>
-<div class="line"><a name="l13136"></a><span class="lineno">13136</span>&#160;        mem,</div>
-<div class="line"><a name="l13137"></a><span class="lineno">13137</span>&#160;        allocInfo.allocationSize,</div>
-<div class="line"><a name="l13138"></a><span class="lineno">13138</span>&#160;        m_NextBlockId++,</div>
-<div class="line"><a name="l13139"></a><span class="lineno">13139</span>&#160;        m_Algorithm);</div>
-<div class="line"><a name="l13140"></a><span class="lineno">13140</span>&#160; </div>
-<div class="line"><a name="l13141"></a><span class="lineno">13141</span>&#160;    m_Blocks.push_back(pBlock);</div>
-<div class="line"><a name="l13142"></a><span class="lineno">13142</span>&#160;    <span class="keywordflow">if</span>(pNewBlockIndex != VMA_NULL)</div>
-<div class="line"><a name="l13143"></a><span class="lineno">13143</span>&#160;    {</div>
-<div class="line"><a name="l13144"></a><span class="lineno">13144</span>&#160;        *pNewBlockIndex = m_Blocks.size() - 1;</div>
-<div class="line"><a name="l13145"></a><span class="lineno">13145</span>&#160;    }</div>
-<div class="line"><a name="l13146"></a><span class="lineno">13146</span>&#160; </div>
-<div class="line"><a name="l13147"></a><span class="lineno">13147</span>&#160;    <span class="keywordflow">return</span> VK_SUCCESS;</div>
-<div class="line"><a name="l13148"></a><span class="lineno">13148</span>&#160;}</div>
-<div class="line"><a name="l13149"></a><span class="lineno">13149</span>&#160; </div>
-<div class="line"><a name="l13150"></a><span class="lineno">13150</span>&#160;<span class="keywordtype">void</span> VmaBlockVector::ApplyDefragmentationMovesCpu(</div>
-<div class="line"><a name="l13151"></a><span class="lineno">13151</span>&#160;    <span class="keyword">class</span> VmaBlockVectorDefragmentationContext* pDefragCtx,</div>
-<div class="line"><a name="l13152"></a><span class="lineno">13152</span>&#160;    <span class="keyword">const</span> VmaVector&lt; VmaDefragmentationMove, VmaStlAllocator&lt;VmaDefragmentationMove&gt; &gt;&amp; moves)</div>
-<div class="line"><a name="l13153"></a><span class="lineno">13153</span>&#160;{</div>
-<div class="line"><a name="l13154"></a><span class="lineno">13154</span>&#160;    <span class="keyword">const</span> <span class="keywordtype">size_t</span> blockCount = m_Blocks.size();</div>
-<div class="line"><a name="l13155"></a><span class="lineno">13155</span>&#160;    <span class="keyword">const</span> <span class="keywordtype">bool</span> isNonCoherent = m_hAllocator-&gt;IsMemoryTypeNonCoherent(m_MemoryTypeIndex);</div>
-<div class="line"><a name="l13156"></a><span class="lineno">13156</span>&#160; </div>
-<div class="line"><a name="l13157"></a><span class="lineno">13157</span>&#160;    <span class="keyword">enum</span> BLOCK_FLAG</div>
-<div class="line"><a name="l13158"></a><span class="lineno">13158</span>&#160;    {</div>
-<div class="line"><a name="l13159"></a><span class="lineno">13159</span>&#160;        BLOCK_FLAG_USED = 0x00000001,</div>
-<div class="line"><a name="l13160"></a><span class="lineno">13160</span>&#160;        BLOCK_FLAG_MAPPED_FOR_DEFRAGMENTATION = 0x00000002,</div>
-<div class="line"><a name="l13161"></a><span class="lineno">13161</span>&#160;    };</div>
-<div class="line"><a name="l13162"></a><span class="lineno">13162</span>&#160; </div>
-<div class="line"><a name="l13163"></a><span class="lineno">13163</span>&#160;    <span class="keyword">struct </span>BlockInfo</div>
-<div class="line"><a name="l13164"></a><span class="lineno">13164</span>&#160;    {</div>
-<div class="line"><a name="l13165"></a><span class="lineno">13165</span>&#160;        uint32_t flags;</div>
-<div class="line"><a name="l13166"></a><span class="lineno">13166</span>&#160;        <span class="keywordtype">void</span>* pMappedData;</div>
-<div class="line"><a name="l13167"></a><span class="lineno">13167</span>&#160;    };</div>
-<div class="line"><a name="l13168"></a><span class="lineno">13168</span>&#160;    VmaVector&lt; BlockInfo, VmaStlAllocator&lt;BlockInfo&gt; &gt;</div>
-<div class="line"><a name="l13169"></a><span class="lineno">13169</span>&#160;        blockInfo(blockCount, BlockInfo(), VmaStlAllocator&lt;BlockInfo&gt;(m_hAllocator-&gt;GetAllocationCallbacks()));</div>
-<div class="line"><a name="l13170"></a><span class="lineno">13170</span>&#160;    memset(blockInfo.data(), 0, blockCount * <span class="keyword">sizeof</span>(BlockInfo));</div>
-<div class="line"><a name="l13171"></a><span class="lineno">13171</span>&#160; </div>
-<div class="line"><a name="l13172"></a><span class="lineno">13172</span>&#160;    <span class="comment">// Go over all moves. Mark blocks that are used with BLOCK_FLAG_USED.</span></div>
-<div class="line"><a name="l13173"></a><span class="lineno">13173</span>&#160;    <span class="keyword">const</span> <span class="keywordtype">size_t</span> moveCount = moves.size();</div>
-<div class="line"><a name="l13174"></a><span class="lineno">13174</span>&#160;    <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> moveIndex = 0; moveIndex &lt; moveCount; ++moveIndex)</div>
-<div class="line"><a name="l13175"></a><span class="lineno">13175</span>&#160;    {</div>
-<div class="line"><a name="l13176"></a><span class="lineno">13176</span>&#160;        <span class="keyword">const</span> VmaDefragmentationMove&amp; move = moves[moveIndex];</div>
-<div class="line"><a name="l13177"></a><span class="lineno">13177</span>&#160;        blockInfo[move.srcBlockIndex].flags |= BLOCK_FLAG_USED;</div>
-<div class="line"><a name="l13178"></a><span class="lineno">13178</span>&#160;        blockInfo[move.dstBlockIndex].flags |= BLOCK_FLAG_USED;</div>
-<div class="line"><a name="l13179"></a><span class="lineno">13179</span>&#160;    }</div>
-<div class="line"><a name="l13180"></a><span class="lineno">13180</span>&#160; </div>
-<div class="line"><a name="l13181"></a><span class="lineno">13181</span>&#160;    VMA_ASSERT(pDefragCtx-&gt;res == VK_SUCCESS);</div>
-<div class="line"><a name="l13182"></a><span class="lineno">13182</span>&#160; </div>
-<div class="line"><a name="l13183"></a><span class="lineno">13183</span>&#160;    <span class="comment">// Go over all blocks. Get mapped pointer or map if necessary.</span></div>
-<div class="line"><a name="l13184"></a><span class="lineno">13184</span>&#160;    <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> blockIndex = 0; pDefragCtx-&gt;res == VK_SUCCESS &amp;&amp; blockIndex &lt; blockCount; ++blockIndex)</div>
-<div class="line"><a name="l13185"></a><span class="lineno">13185</span>&#160;    {</div>
-<div class="line"><a name="l13186"></a><span class="lineno">13186</span>&#160;        BlockInfo&amp; currBlockInfo = blockInfo[blockIndex];</div>
-<div class="line"><a name="l13187"></a><span class="lineno">13187</span>&#160;        VmaDeviceMemoryBlock* pBlock = m_Blocks[blockIndex];</div>
-<div class="line"><a name="l13188"></a><span class="lineno">13188</span>&#160;        <span class="keywordflow">if</span>((currBlockInfo.flags &amp; BLOCK_FLAG_USED) != 0)</div>
-<div class="line"><a name="l13189"></a><span class="lineno">13189</span>&#160;        {</div>
-<div class="line"><a name="l13190"></a><span class="lineno">13190</span>&#160;            currBlockInfo.pMappedData = pBlock-&gt;GetMappedData();</div>
-<div class="line"><a name="l13191"></a><span class="lineno">13191</span>&#160;            <span class="comment">// It is not originally mapped - map it.</span></div>
-<div class="line"><a name="l13192"></a><span class="lineno">13192</span>&#160;            <span class="keywordflow">if</span>(currBlockInfo.pMappedData == VMA_NULL)</div>
-<div class="line"><a name="l13193"></a><span class="lineno">13193</span>&#160;            {</div>
-<div class="line"><a name="l13194"></a><span class="lineno">13194</span>&#160;                pDefragCtx-&gt;res = pBlock-&gt;Map(m_hAllocator, 1, &amp;currBlockInfo.pMappedData);</div>
-<div class="line"><a name="l13195"></a><span class="lineno">13195</span>&#160;                <span class="keywordflow">if</span>(pDefragCtx-&gt;res == VK_SUCCESS)</div>
-<div class="line"><a name="l13196"></a><span class="lineno">13196</span>&#160;                {</div>
-<div class="line"><a name="l13197"></a><span class="lineno">13197</span>&#160;                    currBlockInfo.flags |= BLOCK_FLAG_MAPPED_FOR_DEFRAGMENTATION;</div>
-<div class="line"><a name="l13198"></a><span class="lineno">13198</span>&#160;                }</div>
-<div class="line"><a name="l13199"></a><span class="lineno">13199</span>&#160;            }</div>
-<div class="line"><a name="l13200"></a><span class="lineno">13200</span>&#160;        }</div>
-<div class="line"><a name="l13201"></a><span class="lineno">13201</span>&#160;    }</div>
-<div class="line"><a name="l13202"></a><span class="lineno">13202</span>&#160; </div>
-<div class="line"><a name="l13203"></a><span class="lineno">13203</span>&#160;    <span class="comment">// Go over all moves. Do actual data transfer.</span></div>
-<div class="line"><a name="l13204"></a><span class="lineno">13204</span>&#160;    <span class="keywordflow">if</span>(pDefragCtx-&gt;res == VK_SUCCESS)</div>
-<div class="line"><a name="l13205"></a><span class="lineno">13205</span>&#160;    {</div>
-<div class="line"><a name="l13206"></a><span class="lineno">13206</span>&#160;        <span class="keyword">const</span> VkDeviceSize nonCoherentAtomSize = m_hAllocator-&gt;m_PhysicalDeviceProperties.limits.nonCoherentAtomSize;</div>
-<div class="line"><a name="l13207"></a><span class="lineno">13207</span>&#160;        VkMappedMemoryRange memRange = { VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE };</div>
-<div class="line"><a name="l13208"></a><span class="lineno">13208</span>&#160; </div>
-<div class="line"><a name="l13209"></a><span class="lineno">13209</span>&#160;        <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> moveIndex = 0; moveIndex &lt; moveCount; ++moveIndex)</div>
-<div class="line"><a name="l13210"></a><span class="lineno">13210</span>&#160;        {</div>
-<div class="line"><a name="l13211"></a><span class="lineno">13211</span>&#160;            <span class="keyword">const</span> VmaDefragmentationMove&amp; move = moves[moveIndex];</div>
-<div class="line"><a name="l13212"></a><span class="lineno">13212</span>&#160; </div>
-<div class="line"><a name="l13213"></a><span class="lineno">13213</span>&#160;            <span class="keyword">const</span> BlockInfo&amp; srcBlockInfo = blockInfo[move.srcBlockIndex];</div>
-<div class="line"><a name="l13214"></a><span class="lineno">13214</span>&#160;            <span class="keyword">const</span> BlockInfo&amp; dstBlockInfo = blockInfo[move.dstBlockIndex];</div>
-<div class="line"><a name="l13215"></a><span class="lineno">13215</span>&#160; </div>
-<div class="line"><a name="l13216"></a><span class="lineno">13216</span>&#160;            VMA_ASSERT(srcBlockInfo.pMappedData &amp;&amp; dstBlockInfo.pMappedData);</div>
-<div class="line"><a name="l13217"></a><span class="lineno">13217</span>&#160; </div>
-<div class="line"><a name="l13218"></a><span class="lineno">13218</span>&#160;            <span class="comment">// Invalidate source.</span></div>
-<div class="line"><a name="l13219"></a><span class="lineno">13219</span>&#160;            <span class="keywordflow">if</span>(isNonCoherent)</div>
-<div class="line"><a name="l13220"></a><span class="lineno">13220</span>&#160;            {</div>
-<div class="line"><a name="l13221"></a><span class="lineno">13221</span>&#160;                VmaDeviceMemoryBlock* <span class="keyword">const</span> pSrcBlock = m_Blocks[move.srcBlockIndex];</div>
-<div class="line"><a name="l13222"></a><span class="lineno">13222</span>&#160;                memRange.memory = pSrcBlock-&gt;GetDeviceMemory();</div>
-<div class="line"><a name="l13223"></a><span class="lineno">13223</span>&#160;                memRange.offset = VmaAlignDown(move.srcOffset, nonCoherentAtomSize);</div>
-<div class="line"><a name="l13224"></a><span class="lineno">13224</span>&#160;                memRange.size = VMA_MIN(</div>
-<div class="line"><a name="l13225"></a><span class="lineno">13225</span>&#160;                    VmaAlignUp(move.size + (move.srcOffset - memRange.offset), nonCoherentAtomSize),</div>
-<div class="line"><a name="l13226"></a><span class="lineno">13226</span>&#160;                    pSrcBlock-&gt;m_pMetadata-&gt;GetSize() - memRange.offset);</div>
-<div class="line"><a name="l13227"></a><span class="lineno">13227</span>&#160;                (*m_hAllocator-&gt;GetVulkanFunctions().vkInvalidateMappedMemoryRanges)(m_hAllocator-&gt;m_hDevice, 1, &amp;memRange);</div>
-<div class="line"><a name="l13228"></a><span class="lineno">13228</span>&#160;            }</div>
-<div class="line"><a name="l13229"></a><span class="lineno">13229</span>&#160; </div>
-<div class="line"><a name="l13230"></a><span class="lineno">13230</span>&#160;            <span class="comment">// THE PLACE WHERE ACTUAL DATA COPY HAPPENS.</span></div>
-<div class="line"><a name="l13231"></a><span class="lineno">13231</span>&#160;            memmove(</div>
-<div class="line"><a name="l13232"></a><span class="lineno">13232</span>&#160;                <span class="keyword">reinterpret_cast&lt;</span><span class="keywordtype">char</span>*<span class="keyword">&gt;</span>(dstBlockInfo.pMappedData) + move.dstOffset,</div>
-<div class="line"><a name="l13233"></a><span class="lineno">13233</span>&#160;                <span class="keyword">reinterpret_cast&lt;</span><span class="keywordtype">char</span>*<span class="keyword">&gt;</span>(srcBlockInfo.pMappedData) + move.srcOffset,</div>
-<div class="line"><a name="l13234"></a><span class="lineno">13234</span>&#160;                <span class="keyword">static_cast&lt;</span><span class="keywordtype">size_t</span><span class="keyword">&gt;</span>(move.size));</div>
-<div class="line"><a name="l13235"></a><span class="lineno">13235</span>&#160; </div>
-<div class="line"><a name="l13236"></a><span class="lineno">13236</span>&#160;            <span class="keywordflow">if</span>(IsCorruptionDetectionEnabled())</div>
-<div class="line"><a name="l13237"></a><span class="lineno">13237</span>&#160;            {</div>
-<div class="line"><a name="l13238"></a><span class="lineno">13238</span>&#160;                VmaWriteMagicValue(dstBlockInfo.pMappedData, move.dstOffset - VMA_DEBUG_MARGIN);</div>
-<div class="line"><a name="l13239"></a><span class="lineno">13239</span>&#160;                VmaWriteMagicValue(dstBlockInfo.pMappedData, move.dstOffset + move.size);</div>
-<div class="line"><a name="l13240"></a><span class="lineno">13240</span>&#160;            }</div>
-<div class="line"><a name="l13241"></a><span class="lineno">13241</span>&#160; </div>
-<div class="line"><a name="l13242"></a><span class="lineno">13242</span>&#160;            <span class="comment">// Flush destination.</span></div>
-<div class="line"><a name="l13243"></a><span class="lineno">13243</span>&#160;            <span class="keywordflow">if</span>(isNonCoherent)</div>
-<div class="line"><a name="l13244"></a><span class="lineno">13244</span>&#160;            {</div>
-<div class="line"><a name="l13245"></a><span class="lineno">13245</span>&#160;                VmaDeviceMemoryBlock* <span class="keyword">const</span> pDstBlock = m_Blocks[move.dstBlockIndex];</div>
-<div class="line"><a name="l13246"></a><span class="lineno">13246</span>&#160;                memRange.memory = pDstBlock-&gt;GetDeviceMemory();</div>
-<div class="line"><a name="l13247"></a><span class="lineno">13247</span>&#160;                memRange.offset = VmaAlignDown(move.dstOffset, nonCoherentAtomSize);</div>
-<div class="line"><a name="l13248"></a><span class="lineno">13248</span>&#160;                memRange.size = VMA_MIN(</div>
-<div class="line"><a name="l13249"></a><span class="lineno">13249</span>&#160;                    VmaAlignUp(move.size + (move.dstOffset - memRange.offset), nonCoherentAtomSize),</div>
-<div class="line"><a name="l13250"></a><span class="lineno">13250</span>&#160;                    pDstBlock-&gt;m_pMetadata-&gt;GetSize() - memRange.offset);</div>
-<div class="line"><a name="l13251"></a><span class="lineno">13251</span>&#160;                (*m_hAllocator-&gt;GetVulkanFunctions().vkFlushMappedMemoryRanges)(m_hAllocator-&gt;m_hDevice, 1, &amp;memRange);</div>
-<div class="line"><a name="l13252"></a><span class="lineno">13252</span>&#160;            }</div>
-<div class="line"><a name="l13253"></a><span class="lineno">13253</span>&#160;        }</div>
-<div class="line"><a name="l13254"></a><span class="lineno">13254</span>&#160;    }</div>
-<div class="line"><a name="l13255"></a><span class="lineno">13255</span>&#160; </div>
-<div class="line"><a name="l13256"></a><span class="lineno">13256</span>&#160;    <span class="comment">// Go over all blocks in reverse order. Unmap those that were mapped just for defragmentation.</span></div>
-<div class="line"><a name="l13257"></a><span class="lineno">13257</span>&#160;    <span class="comment">// Regardless of pCtx-&gt;res == VK_SUCCESS.</span></div>
-<div class="line"><a name="l13258"></a><span class="lineno">13258</span>&#160;    <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> blockIndex = blockCount; blockIndex--; )</div>
-<div class="line"><a name="l13259"></a><span class="lineno">13259</span>&#160;    {</div>
-<div class="line"><a name="l13260"></a><span class="lineno">13260</span>&#160;        <span class="keyword">const</span> BlockInfo&amp; currBlockInfo = blockInfo[blockIndex];</div>
-<div class="line"><a name="l13261"></a><span class="lineno">13261</span>&#160;        <span class="keywordflow">if</span>((currBlockInfo.flags &amp; BLOCK_FLAG_MAPPED_FOR_DEFRAGMENTATION) != 0)</div>
-<div class="line"><a name="l13262"></a><span class="lineno">13262</span>&#160;        {</div>
-<div class="line"><a name="l13263"></a><span class="lineno">13263</span>&#160;            VmaDeviceMemoryBlock* pBlock = m_Blocks[blockIndex];</div>
-<div class="line"><a name="l13264"></a><span class="lineno">13264</span>&#160;            pBlock-&gt;Unmap(m_hAllocator, 1);</div>
-<div class="line"><a name="l13265"></a><span class="lineno">13265</span>&#160;        }</div>
-<div class="line"><a name="l13266"></a><span class="lineno">13266</span>&#160;    }</div>
-<div class="line"><a name="l13267"></a><span class="lineno">13267</span>&#160;}</div>
-<div class="line"><a name="l13268"></a><span class="lineno">13268</span>&#160; </div>
-<div class="line"><a name="l13269"></a><span class="lineno">13269</span>&#160;<span class="keywordtype">void</span> VmaBlockVector::ApplyDefragmentationMovesGpu(</div>
-<div class="line"><a name="l13270"></a><span class="lineno">13270</span>&#160;    <span class="keyword">class</span> VmaBlockVectorDefragmentationContext* pDefragCtx,</div>
-<div class="line"><a name="l13271"></a><span class="lineno">13271</span>&#160;    VmaVector&lt; VmaDefragmentationMove, VmaStlAllocator&lt;VmaDefragmentationMove&gt; &gt;&amp; moves,</div>
-<div class="line"><a name="l13272"></a><span class="lineno">13272</span>&#160;    VkCommandBuffer commandBuffer)</div>
-<div class="line"><a name="l13273"></a><span class="lineno">13273</span>&#160;{</div>
-<div class="line"><a name="l13274"></a><span class="lineno">13274</span>&#160;    <span class="keyword">const</span> <span class="keywordtype">size_t</span> blockCount = m_Blocks.size();</div>
+<div class="line"><a name="l13121"></a><span class="lineno">13121</span>&#160;        <span class="keywordflow">if</span>(m_Algorithm == <a class="code" href="vk__mem__alloc_8h.html#a9a7c45f9c863695d98c83fa5ac940fe7a13c8a444197c67866be9cb05599fc726">VMA_POOL_CREATE_LINEAR_ALGORITHM_BIT</a>)</div>
+<div class="line"><a name="l13122"></a><span class="lineno">13122</span>&#160;        {</div>
+<div class="line"><a name="l13123"></a><span class="lineno">13123</span>&#160;            <span class="comment">// Use only last block.</span></div>
+<div class="line"><a name="l13124"></a><span class="lineno">13124</span>&#160;            <span class="keywordflow">if</span>(!m_Blocks.empty())</div>
+<div class="line"><a name="l13125"></a><span class="lineno">13125</span>&#160;            {</div>
+<div class="line"><a name="l13126"></a><span class="lineno">13126</span>&#160;                VmaDeviceMemoryBlock* <span class="keyword">const</span> pCurrBlock = m_Blocks.back();</div>
+<div class="line"><a name="l13127"></a><span class="lineno">13127</span>&#160;                VMA_ASSERT(pCurrBlock);</div>
+<div class="line"><a name="l13128"></a><span class="lineno">13128</span>&#160;                VkResult res = AllocateFromBlock(</div>
+<div class="line"><a name="l13129"></a><span class="lineno">13129</span>&#160;                    pCurrBlock,</div>
+<div class="line"><a name="l13130"></a><span class="lineno">13130</span>&#160;                    currentFrameIndex,</div>
+<div class="line"><a name="l13131"></a><span class="lineno">13131</span>&#160;                    size,</div>
+<div class="line"><a name="l13132"></a><span class="lineno">13132</span>&#160;                    alignment,</div>
+<div class="line"><a name="l13133"></a><span class="lineno">13133</span>&#160;                    allocFlagsCopy,</div>
+<div class="line"><a name="l13134"></a><span class="lineno">13134</span>&#160;                    createInfo.<a class="code" href="struct_vma_allocation_create_info.html#a8259e85c272683434f4abb4ddddffe19">pUserData</a>,</div>
+<div class="line"><a name="l13135"></a><span class="lineno">13135</span>&#160;                    suballocType,</div>
+<div class="line"><a name="l13136"></a><span class="lineno">13136</span>&#160;                    strategy,</div>
+<div class="line"><a name="l13137"></a><span class="lineno">13137</span>&#160;                    pAllocation);</div>
+<div class="line"><a name="l13138"></a><span class="lineno">13138</span>&#160;                <span class="keywordflow">if</span>(res == VK_SUCCESS)</div>
+<div class="line"><a name="l13139"></a><span class="lineno">13139</span>&#160;                {</div>
+<div class="line"><a name="l13140"></a><span class="lineno">13140</span>&#160;                    VMA_DEBUG_LOG(<span class="stringliteral">&quot;    Returned from last block #%u&quot;</span>, pCurrBlock-&gt;GetId());</div>
+<div class="line"><a name="l13141"></a><span class="lineno">13141</span>&#160;                    <span class="keywordflow">return</span> VK_SUCCESS;</div>
+<div class="line"><a name="l13142"></a><span class="lineno">13142</span>&#160;                }</div>
+<div class="line"><a name="l13143"></a><span class="lineno">13143</span>&#160;            }</div>
+<div class="line"><a name="l13144"></a><span class="lineno">13144</span>&#160;        }</div>
+<div class="line"><a name="l13145"></a><span class="lineno">13145</span>&#160;        <span class="keywordflow">else</span></div>
+<div class="line"><a name="l13146"></a><span class="lineno">13146</span>&#160;        {</div>
+<div class="line"><a name="l13147"></a><span class="lineno">13147</span>&#160;            <span class="keywordflow">if</span>(strategy == <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a839826775c62319466441f86496f036d">VMA_ALLOCATION_CREATE_STRATEGY_BEST_FIT_BIT</a>)</div>
+<div class="line"><a name="l13148"></a><span class="lineno">13148</span>&#160;            {</div>
+<div class="line"><a name="l13149"></a><span class="lineno">13149</span>&#160;                <span class="comment">// Forward order in m_Blocks - prefer blocks with smallest amount of free space.</span></div>
+<div class="line"><a name="l13150"></a><span class="lineno">13150</span>&#160;                <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> blockIndex = 0; blockIndex &lt; m_Blocks.size(); ++blockIndex )</div>
+<div class="line"><a name="l13151"></a><span class="lineno">13151</span>&#160;                {</div>
+<div class="line"><a name="l13152"></a><span class="lineno">13152</span>&#160;                    VmaDeviceMemoryBlock* <span class="keyword">const</span> pCurrBlock = m_Blocks[blockIndex];</div>
+<div class="line"><a name="l13153"></a><span class="lineno">13153</span>&#160;                    VMA_ASSERT(pCurrBlock);</div>
+<div class="line"><a name="l13154"></a><span class="lineno">13154</span>&#160;                    VkResult res = AllocateFromBlock(</div>
+<div class="line"><a name="l13155"></a><span class="lineno">13155</span>&#160;                        pCurrBlock,</div>
+<div class="line"><a name="l13156"></a><span class="lineno">13156</span>&#160;                        currentFrameIndex,</div>
+<div class="line"><a name="l13157"></a><span class="lineno">13157</span>&#160;                        size,</div>
+<div class="line"><a name="l13158"></a><span class="lineno">13158</span>&#160;                        alignment,</div>
+<div class="line"><a name="l13159"></a><span class="lineno">13159</span>&#160;                        allocFlagsCopy,</div>
+<div class="line"><a name="l13160"></a><span class="lineno">13160</span>&#160;                        createInfo.<a class="code" href="struct_vma_allocation_create_info.html#a8259e85c272683434f4abb4ddddffe19">pUserData</a>,</div>
+<div class="line"><a name="l13161"></a><span class="lineno">13161</span>&#160;                        suballocType,</div>
+<div class="line"><a name="l13162"></a><span class="lineno">13162</span>&#160;                        strategy,</div>
+<div class="line"><a name="l13163"></a><span class="lineno">13163</span>&#160;                        pAllocation);</div>
+<div class="line"><a name="l13164"></a><span class="lineno">13164</span>&#160;                    <span class="keywordflow">if</span>(res == VK_SUCCESS)</div>
+<div class="line"><a name="l13165"></a><span class="lineno">13165</span>&#160;                    {</div>
+<div class="line"><a name="l13166"></a><span class="lineno">13166</span>&#160;                        VMA_DEBUG_LOG(<span class="stringliteral">&quot;    Returned from existing block #%u&quot;</span>, pCurrBlock-&gt;GetId());</div>
+<div class="line"><a name="l13167"></a><span class="lineno">13167</span>&#160;                        <span class="keywordflow">return</span> VK_SUCCESS;</div>
+<div class="line"><a name="l13168"></a><span class="lineno">13168</span>&#160;                    }</div>
+<div class="line"><a name="l13169"></a><span class="lineno">13169</span>&#160;                }</div>
+<div class="line"><a name="l13170"></a><span class="lineno">13170</span>&#160;            }</div>
+<div class="line"><a name="l13171"></a><span class="lineno">13171</span>&#160;            <span class="keywordflow">else</span> <span class="comment">// WORST_FIT, FIRST_FIT</span></div>
+<div class="line"><a name="l13172"></a><span class="lineno">13172</span>&#160;            {</div>
+<div class="line"><a name="l13173"></a><span class="lineno">13173</span>&#160;                <span class="comment">// Backward order in m_Blocks - prefer blocks with largest amount of free space.</span></div>
+<div class="line"><a name="l13174"></a><span class="lineno">13174</span>&#160;                <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> blockIndex = m_Blocks.size(); blockIndex--; )</div>
+<div class="line"><a name="l13175"></a><span class="lineno">13175</span>&#160;                {</div>
+<div class="line"><a name="l13176"></a><span class="lineno">13176</span>&#160;                    VmaDeviceMemoryBlock* <span class="keyword">const</span> pCurrBlock = m_Blocks[blockIndex];</div>
+<div class="line"><a name="l13177"></a><span class="lineno">13177</span>&#160;                    VMA_ASSERT(pCurrBlock);</div>
+<div class="line"><a name="l13178"></a><span class="lineno">13178</span>&#160;                    VkResult res = AllocateFromBlock(</div>
+<div class="line"><a name="l13179"></a><span class="lineno">13179</span>&#160;                        pCurrBlock,</div>
+<div class="line"><a name="l13180"></a><span class="lineno">13180</span>&#160;                        currentFrameIndex,</div>
+<div class="line"><a name="l13181"></a><span class="lineno">13181</span>&#160;                        size,</div>
+<div class="line"><a name="l13182"></a><span class="lineno">13182</span>&#160;                        alignment,</div>
+<div class="line"><a name="l13183"></a><span class="lineno">13183</span>&#160;                        allocFlagsCopy,</div>
+<div class="line"><a name="l13184"></a><span class="lineno">13184</span>&#160;                        createInfo.<a class="code" href="struct_vma_allocation_create_info.html#a8259e85c272683434f4abb4ddddffe19">pUserData</a>,</div>
+<div class="line"><a name="l13185"></a><span class="lineno">13185</span>&#160;                        suballocType,</div>
+<div class="line"><a name="l13186"></a><span class="lineno">13186</span>&#160;                        strategy,</div>
+<div class="line"><a name="l13187"></a><span class="lineno">13187</span>&#160;                        pAllocation);</div>
+<div class="line"><a name="l13188"></a><span class="lineno">13188</span>&#160;                    <span class="keywordflow">if</span>(res == VK_SUCCESS)</div>
+<div class="line"><a name="l13189"></a><span class="lineno">13189</span>&#160;                    {</div>
+<div class="line"><a name="l13190"></a><span class="lineno">13190</span>&#160;                        VMA_DEBUG_LOG(<span class="stringliteral">&quot;    Returned from existing block #%u&quot;</span>, pCurrBlock-&gt;GetId());</div>
+<div class="line"><a name="l13191"></a><span class="lineno">13191</span>&#160;                        <span class="keywordflow">return</span> VK_SUCCESS;</div>
+<div class="line"><a name="l13192"></a><span class="lineno">13192</span>&#160;                    }</div>
+<div class="line"><a name="l13193"></a><span class="lineno">13193</span>&#160;                }</div>
+<div class="line"><a name="l13194"></a><span class="lineno">13194</span>&#160;            }</div>
+<div class="line"><a name="l13195"></a><span class="lineno">13195</span>&#160;        }</div>
+<div class="line"><a name="l13196"></a><span class="lineno">13196</span>&#160; </div>
+<div class="line"><a name="l13197"></a><span class="lineno">13197</span>&#160;        <span class="comment">// 2. Try to create new block.</span></div>
+<div class="line"><a name="l13198"></a><span class="lineno">13198</span>&#160;        <span class="keywordflow">if</span>(canCreateNewBlock)</div>
+<div class="line"><a name="l13199"></a><span class="lineno">13199</span>&#160;        {</div>
+<div class="line"><a name="l13200"></a><span class="lineno">13200</span>&#160;            <span class="comment">// Calculate optimal size for new block.</span></div>
+<div class="line"><a name="l13201"></a><span class="lineno">13201</span>&#160;            VkDeviceSize newBlockSize = m_PreferredBlockSize;</div>
+<div class="line"><a name="l13202"></a><span class="lineno">13202</span>&#160;            uint32_t newBlockSizeShift = 0;</div>
+<div class="line"><a name="l13203"></a><span class="lineno">13203</span>&#160;            <span class="keyword">const</span> uint32_t NEW_BLOCK_SIZE_SHIFT_MAX = 3;</div>
+<div class="line"><a name="l13204"></a><span class="lineno">13204</span>&#160; </div>
+<div class="line"><a name="l13205"></a><span class="lineno">13205</span>&#160;            <span class="keywordflow">if</span>(!m_ExplicitBlockSize)</div>
+<div class="line"><a name="l13206"></a><span class="lineno">13206</span>&#160;            {</div>
+<div class="line"><a name="l13207"></a><span class="lineno">13207</span>&#160;                <span class="comment">// Allocate 1/8, 1/4, 1/2 as first blocks.</span></div>
+<div class="line"><a name="l13208"></a><span class="lineno">13208</span>&#160;                <span class="keyword">const</span> VkDeviceSize maxExistingBlockSize = CalcMaxBlockSize();</div>
+<div class="line"><a name="l13209"></a><span class="lineno">13209</span>&#160;                <span class="keywordflow">for</span>(uint32_t i = 0; i &lt; NEW_BLOCK_SIZE_SHIFT_MAX; ++i)</div>
+<div class="line"><a name="l13210"></a><span class="lineno">13210</span>&#160;                {</div>
+<div class="line"><a name="l13211"></a><span class="lineno">13211</span>&#160;                    <span class="keyword">const</span> VkDeviceSize smallerNewBlockSize = newBlockSize / 2;</div>
+<div class="line"><a name="l13212"></a><span class="lineno">13212</span>&#160;                    <span class="keywordflow">if</span>(smallerNewBlockSize &gt; maxExistingBlockSize &amp;&amp; smallerNewBlockSize &gt;= size * 2)</div>
+<div class="line"><a name="l13213"></a><span class="lineno">13213</span>&#160;                    {</div>
+<div class="line"><a name="l13214"></a><span class="lineno">13214</span>&#160;                        newBlockSize = smallerNewBlockSize;</div>
+<div class="line"><a name="l13215"></a><span class="lineno">13215</span>&#160;                        ++newBlockSizeShift;</div>
+<div class="line"><a name="l13216"></a><span class="lineno">13216</span>&#160;                    }</div>
+<div class="line"><a name="l13217"></a><span class="lineno">13217</span>&#160;                    <span class="keywordflow">else</span></div>
+<div class="line"><a name="l13218"></a><span class="lineno">13218</span>&#160;                    {</div>
+<div class="line"><a name="l13219"></a><span class="lineno">13219</span>&#160;                        <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l13220"></a><span class="lineno">13220</span>&#160;                    }</div>
+<div class="line"><a name="l13221"></a><span class="lineno">13221</span>&#160;                }</div>
+<div class="line"><a name="l13222"></a><span class="lineno">13222</span>&#160;            }</div>
+<div class="line"><a name="l13223"></a><span class="lineno">13223</span>&#160; </div>
+<div class="line"><a name="l13224"></a><span class="lineno">13224</span>&#160;            <span class="keywordtype">size_t</span> newBlockIndex = 0;</div>
+<div class="line"><a name="l13225"></a><span class="lineno">13225</span>&#160;            VkResult res = (newBlockSize &lt;= freeMemory || !canFallbackToDedicated) ?</div>
+<div class="line"><a name="l13226"></a><span class="lineno">13226</span>&#160;                CreateBlock(newBlockSize, &amp;newBlockIndex) : VK_ERROR_OUT_OF_DEVICE_MEMORY;</div>
+<div class="line"><a name="l13227"></a><span class="lineno">13227</span>&#160;            <span class="comment">// Allocation of this size failed? Try 1/2, 1/4, 1/8 of m_PreferredBlockSize.</span></div>
+<div class="line"><a name="l13228"></a><span class="lineno">13228</span>&#160;            <span class="keywordflow">if</span>(!m_ExplicitBlockSize)</div>
+<div class="line"><a name="l13229"></a><span class="lineno">13229</span>&#160;            {</div>
+<div class="line"><a name="l13230"></a><span class="lineno">13230</span>&#160;                <span class="keywordflow">while</span>(res &lt; 0 &amp;&amp; newBlockSizeShift &lt; NEW_BLOCK_SIZE_SHIFT_MAX)</div>
+<div class="line"><a name="l13231"></a><span class="lineno">13231</span>&#160;                {</div>
+<div class="line"><a name="l13232"></a><span class="lineno">13232</span>&#160;                    <span class="keyword">const</span> VkDeviceSize smallerNewBlockSize = newBlockSize / 2;</div>
+<div class="line"><a name="l13233"></a><span class="lineno">13233</span>&#160;                    <span class="keywordflow">if</span>(smallerNewBlockSize &gt;= size)</div>
+<div class="line"><a name="l13234"></a><span class="lineno">13234</span>&#160;                    {</div>
+<div class="line"><a name="l13235"></a><span class="lineno">13235</span>&#160;                        newBlockSize = smallerNewBlockSize;</div>
+<div class="line"><a name="l13236"></a><span class="lineno">13236</span>&#160;                        ++newBlockSizeShift;</div>
+<div class="line"><a name="l13237"></a><span class="lineno">13237</span>&#160;                        res = (newBlockSize &lt;= freeMemory || !canFallbackToDedicated) ?</div>
+<div class="line"><a name="l13238"></a><span class="lineno">13238</span>&#160;                            CreateBlock(newBlockSize, &amp;newBlockIndex) : VK_ERROR_OUT_OF_DEVICE_MEMORY;</div>
+<div class="line"><a name="l13239"></a><span class="lineno">13239</span>&#160;                    }</div>
+<div class="line"><a name="l13240"></a><span class="lineno">13240</span>&#160;                    <span class="keywordflow">else</span></div>
+<div class="line"><a name="l13241"></a><span class="lineno">13241</span>&#160;                    {</div>
+<div class="line"><a name="l13242"></a><span class="lineno">13242</span>&#160;                        <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l13243"></a><span class="lineno">13243</span>&#160;                    }</div>
+<div class="line"><a name="l13244"></a><span class="lineno">13244</span>&#160;                }</div>
+<div class="line"><a name="l13245"></a><span class="lineno">13245</span>&#160;            }</div>
+<div class="line"><a name="l13246"></a><span class="lineno">13246</span>&#160; </div>
+<div class="line"><a name="l13247"></a><span class="lineno">13247</span>&#160;            <span class="keywordflow">if</span>(res == VK_SUCCESS)</div>
+<div class="line"><a name="l13248"></a><span class="lineno">13248</span>&#160;            {</div>
+<div class="line"><a name="l13249"></a><span class="lineno">13249</span>&#160;                VmaDeviceMemoryBlock* <span class="keyword">const</span> pBlock = m_Blocks[newBlockIndex];</div>
+<div class="line"><a name="l13250"></a><span class="lineno">13250</span>&#160;                VMA_ASSERT(pBlock-&gt;m_pMetadata-&gt;GetSize() &gt;= size);</div>
+<div class="line"><a name="l13251"></a><span class="lineno">13251</span>&#160; </div>
+<div class="line"><a name="l13252"></a><span class="lineno">13252</span>&#160;                res = AllocateFromBlock(</div>
+<div class="line"><a name="l13253"></a><span class="lineno">13253</span>&#160;                    pBlock,</div>
+<div class="line"><a name="l13254"></a><span class="lineno">13254</span>&#160;                    currentFrameIndex,</div>
+<div class="line"><a name="l13255"></a><span class="lineno">13255</span>&#160;                    size,</div>
+<div class="line"><a name="l13256"></a><span class="lineno">13256</span>&#160;                    alignment,</div>
+<div class="line"><a name="l13257"></a><span class="lineno">13257</span>&#160;                    allocFlagsCopy,</div>
+<div class="line"><a name="l13258"></a><span class="lineno">13258</span>&#160;                    createInfo.<a class="code" href="struct_vma_allocation_create_info.html#a8259e85c272683434f4abb4ddddffe19">pUserData</a>,</div>
+<div class="line"><a name="l13259"></a><span class="lineno">13259</span>&#160;                    suballocType,</div>
+<div class="line"><a name="l13260"></a><span class="lineno">13260</span>&#160;                    strategy,</div>
+<div class="line"><a name="l13261"></a><span class="lineno">13261</span>&#160;                    pAllocation);</div>
+<div class="line"><a name="l13262"></a><span class="lineno">13262</span>&#160;                <span class="keywordflow">if</span>(res == VK_SUCCESS)</div>
+<div class="line"><a name="l13263"></a><span class="lineno">13263</span>&#160;                {</div>
+<div class="line"><a name="l13264"></a><span class="lineno">13264</span>&#160;                    VMA_DEBUG_LOG(<span class="stringliteral">&quot;    Created new block #%u Size=%llu&quot;</span>, pBlock-&gt;GetId(), newBlockSize);</div>
+<div class="line"><a name="l13265"></a><span class="lineno">13265</span>&#160;                    <span class="keywordflow">return</span> VK_SUCCESS;</div>
+<div class="line"><a name="l13266"></a><span class="lineno">13266</span>&#160;                }</div>
+<div class="line"><a name="l13267"></a><span class="lineno">13267</span>&#160;                <span class="keywordflow">else</span></div>
+<div class="line"><a name="l13268"></a><span class="lineno">13268</span>&#160;                {</div>
+<div class="line"><a name="l13269"></a><span class="lineno">13269</span>&#160;                    <span class="comment">// Allocation from new block failed, possibly due to VMA_DEBUG_MARGIN or alignment.</span></div>
+<div class="line"><a name="l13270"></a><span class="lineno">13270</span>&#160;                    <span class="keywordflow">return</span> VK_ERROR_OUT_OF_DEVICE_MEMORY;</div>
+<div class="line"><a name="l13271"></a><span class="lineno">13271</span>&#160;                }</div>
+<div class="line"><a name="l13272"></a><span class="lineno">13272</span>&#160;            }</div>
+<div class="line"><a name="l13273"></a><span class="lineno">13273</span>&#160;        }</div>
+<div class="line"><a name="l13274"></a><span class="lineno">13274</span>&#160;    }</div>
 <div class="line"><a name="l13275"></a><span class="lineno">13275</span>&#160; </div>
-<div class="line"><a name="l13276"></a><span class="lineno">13276</span>&#160;    pDefragCtx-&gt;blockContexts.resize(blockCount);</div>
-<div class="line"><a name="l13277"></a><span class="lineno">13277</span>&#160;    memset(pDefragCtx-&gt;blockContexts.data(), 0, blockCount * <span class="keyword">sizeof</span>(VmaBlockDefragmentationContext));</div>
-<div class="line"><a name="l13278"></a><span class="lineno">13278</span>&#160; </div>
-<div class="line"><a name="l13279"></a><span class="lineno">13279</span>&#160;    <span class="comment">// Go over all moves. Mark blocks that are used with BLOCK_FLAG_USED.</span></div>
-<div class="line"><a name="l13280"></a><span class="lineno">13280</span>&#160;    <span class="keyword">const</span> <span class="keywordtype">size_t</span> moveCount = moves.size();</div>
-<div class="line"><a name="l13281"></a><span class="lineno">13281</span>&#160;    <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> moveIndex = 0; moveIndex &lt; moveCount; ++moveIndex)</div>
-<div class="line"><a name="l13282"></a><span class="lineno">13282</span>&#160;    {</div>
-<div class="line"><a name="l13283"></a><span class="lineno">13283</span>&#160;        <span class="keyword">const</span> VmaDefragmentationMove&amp; move = moves[moveIndex];</div>
-<div class="line"><a name="l13284"></a><span class="lineno">13284</span>&#160; </div>
-<div class="line"><a name="l13285"></a><span class="lineno">13285</span>&#160;        <span class="comment">//if(move.type == VMA_ALLOCATION_TYPE_UNKNOWN)</span></div>
-<div class="line"><a name="l13286"></a><span class="lineno">13286</span>&#160;        {</div>
-<div class="line"><a name="l13287"></a><span class="lineno">13287</span>&#160;            <span class="comment">// Old school move still require us to map the whole block</span></div>
-<div class="line"><a name="l13288"></a><span class="lineno">13288</span>&#160;            pDefragCtx-&gt;blockContexts[move.srcBlockIndex].flags |= VmaBlockDefragmentationContext::BLOCK_FLAG_USED;</div>
-<div class="line"><a name="l13289"></a><span class="lineno">13289</span>&#160;            pDefragCtx-&gt;blockContexts[move.dstBlockIndex].flags |= VmaBlockDefragmentationContext::BLOCK_FLAG_USED;</div>
-<div class="line"><a name="l13290"></a><span class="lineno">13290</span>&#160;        }</div>
-<div class="line"><a name="l13291"></a><span class="lineno">13291</span>&#160;    }</div>
-<div class="line"><a name="l13292"></a><span class="lineno">13292</span>&#160; </div>
-<div class="line"><a name="l13293"></a><span class="lineno">13293</span>&#160;    VMA_ASSERT(pDefragCtx-&gt;res == VK_SUCCESS);</div>
-<div class="line"><a name="l13294"></a><span class="lineno">13294</span>&#160; </div>
-<div class="line"><a name="l13295"></a><span class="lineno">13295</span>&#160;    <span class="comment">// Go over all blocks. Create and bind buffer for whole block if necessary.</span></div>
-<div class="line"><a name="l13296"></a><span class="lineno">13296</span>&#160;    {</div>
-<div class="line"><a name="l13297"></a><span class="lineno">13297</span>&#160;        VkBufferCreateInfo bufCreateInfo;</div>
-<div class="line"><a name="l13298"></a><span class="lineno">13298</span>&#160;        VmaFillGpuDefragmentationBufferCreateInfo(bufCreateInfo);</div>
-<div class="line"><a name="l13299"></a><span class="lineno">13299</span>&#160; </div>
-<div class="line"><a name="l13300"></a><span class="lineno">13300</span>&#160;        <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> blockIndex = 0; pDefragCtx-&gt;res == VK_SUCCESS &amp;&amp; blockIndex &lt; blockCount; ++blockIndex)</div>
-<div class="line"><a name="l13301"></a><span class="lineno">13301</span>&#160;        {</div>
-<div class="line"><a name="l13302"></a><span class="lineno">13302</span>&#160;            VmaBlockDefragmentationContext&amp; currBlockCtx = pDefragCtx-&gt;blockContexts[blockIndex];</div>
-<div class="line"><a name="l13303"></a><span class="lineno">13303</span>&#160;            VmaDeviceMemoryBlock* pBlock = m_Blocks[blockIndex];</div>
-<div class="line"><a name="l13304"></a><span class="lineno">13304</span>&#160;            <span class="keywordflow">if</span>((currBlockCtx.flags &amp; VmaBlockDefragmentationContext::BLOCK_FLAG_USED) != 0)</div>
-<div class="line"><a name="l13305"></a><span class="lineno">13305</span>&#160;            {</div>
-<div class="line"><a name="l13306"></a><span class="lineno">13306</span>&#160;                bufCreateInfo.size = pBlock-&gt;m_pMetadata-&gt;GetSize();</div>
-<div class="line"><a name="l13307"></a><span class="lineno">13307</span>&#160;                pDefragCtx-&gt;res = (*m_hAllocator-&gt;GetVulkanFunctions().vkCreateBuffer)(</div>
-<div class="line"><a name="l13308"></a><span class="lineno">13308</span>&#160;                    m_hAllocator-&gt;m_hDevice, &amp;bufCreateInfo, m_hAllocator-&gt;GetAllocationCallbacks(), &amp;currBlockCtx.hBuffer);</div>
-<div class="line"><a name="l13309"></a><span class="lineno">13309</span>&#160;                <span class="keywordflow">if</span>(pDefragCtx-&gt;res == VK_SUCCESS)</div>
-<div class="line"><a name="l13310"></a><span class="lineno">13310</span>&#160;                {</div>
-<div class="line"><a name="l13311"></a><span class="lineno">13311</span>&#160;                    pDefragCtx-&gt;res = (*m_hAllocator-&gt;GetVulkanFunctions().vkBindBufferMemory)(</div>
-<div class="line"><a name="l13312"></a><span class="lineno">13312</span>&#160;                        m_hAllocator-&gt;m_hDevice, currBlockCtx.hBuffer, pBlock-&gt;GetDeviceMemory(), 0);</div>
-<div class="line"><a name="l13313"></a><span class="lineno">13313</span>&#160;                }</div>
-<div class="line"><a name="l13314"></a><span class="lineno">13314</span>&#160;            }</div>
-<div class="line"><a name="l13315"></a><span class="lineno">13315</span>&#160;        }</div>
-<div class="line"><a name="l13316"></a><span class="lineno">13316</span>&#160;    }</div>
-<div class="line"><a name="l13317"></a><span class="lineno">13317</span>&#160; </div>
-<div class="line"><a name="l13318"></a><span class="lineno">13318</span>&#160;    <span class="comment">// Go over all moves. Post data transfer commands to command buffer.</span></div>
-<div class="line"><a name="l13319"></a><span class="lineno">13319</span>&#160;    <span class="keywordflow">if</span>(pDefragCtx-&gt;res == VK_SUCCESS)</div>
-<div class="line"><a name="l13320"></a><span class="lineno">13320</span>&#160;    {</div>
-<div class="line"><a name="l13321"></a><span class="lineno">13321</span>&#160;        <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> moveIndex = 0; moveIndex &lt; moveCount; ++moveIndex)</div>
-<div class="line"><a name="l13322"></a><span class="lineno">13322</span>&#160;        {</div>
-<div class="line"><a name="l13323"></a><span class="lineno">13323</span>&#160;            <span class="keyword">const</span> VmaDefragmentationMove&amp; move = moves[moveIndex];</div>
-<div class="line"><a name="l13324"></a><span class="lineno">13324</span>&#160; </div>
-<div class="line"><a name="l13325"></a><span class="lineno">13325</span>&#160;            <span class="keyword">const</span> VmaBlockDefragmentationContext&amp; srcBlockCtx = pDefragCtx-&gt;blockContexts[move.srcBlockIndex];</div>
-<div class="line"><a name="l13326"></a><span class="lineno">13326</span>&#160;            <span class="keyword">const</span> VmaBlockDefragmentationContext&amp; dstBlockCtx = pDefragCtx-&gt;blockContexts[move.dstBlockIndex];</div>
-<div class="line"><a name="l13327"></a><span class="lineno">13327</span>&#160; </div>
-<div class="line"><a name="l13328"></a><span class="lineno">13328</span>&#160;            VMA_ASSERT(srcBlockCtx.hBuffer &amp;&amp; dstBlockCtx.hBuffer);</div>
-<div class="line"><a name="l13329"></a><span class="lineno">13329</span>&#160; </div>
-<div class="line"><a name="l13330"></a><span class="lineno">13330</span>&#160;            VkBufferCopy region = {</div>
-<div class="line"><a name="l13331"></a><span class="lineno">13331</span>&#160;                move.srcOffset,</div>
-<div class="line"><a name="l13332"></a><span class="lineno">13332</span>&#160;                move.dstOffset,</div>
-<div class="line"><a name="l13333"></a><span class="lineno">13333</span>&#160;                move.size };</div>
-<div class="line"><a name="l13334"></a><span class="lineno">13334</span>&#160;            (*m_hAllocator-&gt;GetVulkanFunctions().vkCmdCopyBuffer)(</div>
-<div class="line"><a name="l13335"></a><span class="lineno">13335</span>&#160;                commandBuffer, srcBlockCtx.hBuffer, dstBlockCtx.hBuffer, 1, &amp;region);</div>
-<div class="line"><a name="l13336"></a><span class="lineno">13336</span>&#160;        }</div>
-<div class="line"><a name="l13337"></a><span class="lineno">13337</span>&#160;    }</div>
-<div class="line"><a name="l13338"></a><span class="lineno">13338</span>&#160; </div>
-<div class="line"><a name="l13339"></a><span class="lineno">13339</span>&#160;    <span class="comment">// Save buffers to defrag context for later destruction.</span></div>
-<div class="line"><a name="l13340"></a><span class="lineno">13340</span>&#160;    <span class="keywordflow">if</span>(pDefragCtx-&gt;res == VK_SUCCESS &amp;&amp; moveCount &gt; 0)</div>
-<div class="line"><a name="l13341"></a><span class="lineno">13341</span>&#160;    {</div>
-<div class="line"><a name="l13342"></a><span class="lineno">13342</span>&#160;        pDefragCtx-&gt;res = VK_NOT_READY;</div>
-<div class="line"><a name="l13343"></a><span class="lineno">13343</span>&#160;    }</div>
-<div class="line"><a name="l13344"></a><span class="lineno">13344</span>&#160;}</div>
-<div class="line"><a name="l13345"></a><span class="lineno">13345</span>&#160; </div>
-<div class="line"><a name="l13346"></a><span class="lineno">13346</span>&#160;<span class="keywordtype">void</span> VmaBlockVector::FreeEmptyBlocks(<a class="code" href="struct_vma_defragmentation_stats.html">VmaDefragmentationStats</a>* pDefragmentationStats)</div>
-<div class="line"><a name="l13347"></a><span class="lineno">13347</span>&#160;{</div>
-<div class="line"><a name="l13348"></a><span class="lineno">13348</span>&#160;    <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> blockIndex = m_Blocks.size(); blockIndex--; )</div>
-<div class="line"><a name="l13349"></a><span class="lineno">13349</span>&#160;    {</div>
-<div class="line"><a name="l13350"></a><span class="lineno">13350</span>&#160;        VmaDeviceMemoryBlock* pBlock = m_Blocks[blockIndex];</div>
-<div class="line"><a name="l13351"></a><span class="lineno">13351</span>&#160;        <span class="keywordflow">if</span>(pBlock-&gt;m_pMetadata-&gt;IsEmpty())</div>
-<div class="line"><a name="l13352"></a><span class="lineno">13352</span>&#160;        {</div>
-<div class="line"><a name="l13353"></a><span class="lineno">13353</span>&#160;            <span class="keywordflow">if</span>(m_Blocks.size() &gt; m_MinBlockCount)</div>
-<div class="line"><a name="l13354"></a><span class="lineno">13354</span>&#160;            {</div>
-<div class="line"><a name="l13355"></a><span class="lineno">13355</span>&#160;                <span class="keywordflow">if</span>(pDefragmentationStats != VMA_NULL)</div>
-<div class="line"><a name="l13356"></a><span class="lineno">13356</span>&#160;                {</div>
-<div class="line"><a name="l13357"></a><span class="lineno">13357</span>&#160;                    ++pDefragmentationStats-&gt;<a class="code" href="struct_vma_defragmentation_stats.html#a0113f1877904a5d1ee8f409216ff276b">deviceMemoryBlocksFreed</a>;</div>
-<div class="line"><a name="l13358"></a><span class="lineno">13358</span>&#160;                    pDefragmentationStats-&gt;<a class="code" href="struct_vma_defragmentation_stats.html#ab0cb9ac0dbc106c77e384ea676422f28">bytesFreed</a> += pBlock-&gt;m_pMetadata-&gt;GetSize();</div>
+<div class="line"><a name="l13276"></a><span class="lineno">13276</span>&#160;    <span class="comment">// 3. Try to allocate from existing blocks with making other allocations lost.</span></div>
+<div class="line"><a name="l13277"></a><span class="lineno">13277</span>&#160;    <span class="keywordflow">if</span>(canMakeOtherLost)</div>
+<div class="line"><a name="l13278"></a><span class="lineno">13278</span>&#160;    {</div>
+<div class="line"><a name="l13279"></a><span class="lineno">13279</span>&#160;        uint32_t tryIndex = 0;</div>
+<div class="line"><a name="l13280"></a><span class="lineno">13280</span>&#160;        <span class="keywordflow">for</span>(; tryIndex &lt; VMA_ALLOCATION_TRY_COUNT; ++tryIndex)</div>
+<div class="line"><a name="l13281"></a><span class="lineno">13281</span>&#160;        {</div>
+<div class="line"><a name="l13282"></a><span class="lineno">13282</span>&#160;            VmaDeviceMemoryBlock* pBestRequestBlock = VMA_NULL;</div>
+<div class="line"><a name="l13283"></a><span class="lineno">13283</span>&#160;            VmaAllocationRequest bestRequest = {};</div>
+<div class="line"><a name="l13284"></a><span class="lineno">13284</span>&#160;            VkDeviceSize bestRequestCost = VK_WHOLE_SIZE;</div>
+<div class="line"><a name="l13285"></a><span class="lineno">13285</span>&#160; </div>
+<div class="line"><a name="l13286"></a><span class="lineno">13286</span>&#160;            <span class="comment">// 1. Search existing allocations.</span></div>
+<div class="line"><a name="l13287"></a><span class="lineno">13287</span>&#160;            <span class="keywordflow">if</span>(strategy == <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a839826775c62319466441f86496f036d">VMA_ALLOCATION_CREATE_STRATEGY_BEST_FIT_BIT</a>)</div>
+<div class="line"><a name="l13288"></a><span class="lineno">13288</span>&#160;            {</div>
+<div class="line"><a name="l13289"></a><span class="lineno">13289</span>&#160;                <span class="comment">// Forward order in m_Blocks - prefer blocks with smallest amount of free space.</span></div>
+<div class="line"><a name="l13290"></a><span class="lineno">13290</span>&#160;                <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> blockIndex = 0; blockIndex &lt; m_Blocks.size(); ++blockIndex )</div>
+<div class="line"><a name="l13291"></a><span class="lineno">13291</span>&#160;                {</div>
+<div class="line"><a name="l13292"></a><span class="lineno">13292</span>&#160;                    VmaDeviceMemoryBlock* <span class="keyword">const</span> pCurrBlock = m_Blocks[blockIndex];</div>
+<div class="line"><a name="l13293"></a><span class="lineno">13293</span>&#160;                    VMA_ASSERT(pCurrBlock);</div>
+<div class="line"><a name="l13294"></a><span class="lineno">13294</span>&#160;                    VmaAllocationRequest currRequest = {};</div>
+<div class="line"><a name="l13295"></a><span class="lineno">13295</span>&#160;                    <span class="keywordflow">if</span>(pCurrBlock-&gt;m_pMetadata-&gt;CreateAllocationRequest(</div>
+<div class="line"><a name="l13296"></a><span class="lineno">13296</span>&#160;                        currentFrameIndex,</div>
+<div class="line"><a name="l13297"></a><span class="lineno">13297</span>&#160;                        m_FrameInUseCount,</div>
+<div class="line"><a name="l13298"></a><span class="lineno">13298</span>&#160;                        m_BufferImageGranularity,</div>
+<div class="line"><a name="l13299"></a><span class="lineno">13299</span>&#160;                        size,</div>
+<div class="line"><a name="l13300"></a><span class="lineno">13300</span>&#160;                        alignment,</div>
+<div class="line"><a name="l13301"></a><span class="lineno">13301</span>&#160;                        (createInfo.<a class="code" href="struct_vma_allocation_create_info.html#add09658ac14fe290ace25470ddd6d41b">flags</a> &amp; <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a42ba3a2d2c7117953210b7c3ef8da0df">VMA_ALLOCATION_CREATE_UPPER_ADDRESS_BIT</a>) != 0,</div>
+<div class="line"><a name="l13302"></a><span class="lineno">13302</span>&#160;                        suballocType,</div>
+<div class="line"><a name="l13303"></a><span class="lineno">13303</span>&#160;                        canMakeOtherLost,</div>
+<div class="line"><a name="l13304"></a><span class="lineno">13304</span>&#160;                        strategy,</div>
+<div class="line"><a name="l13305"></a><span class="lineno">13305</span>&#160;                        &amp;currRequest))</div>
+<div class="line"><a name="l13306"></a><span class="lineno">13306</span>&#160;                    {</div>
+<div class="line"><a name="l13307"></a><span class="lineno">13307</span>&#160;                        <span class="keyword">const</span> VkDeviceSize currRequestCost = currRequest.CalcCost();</div>
+<div class="line"><a name="l13308"></a><span class="lineno">13308</span>&#160;                        <span class="keywordflow">if</span>(pBestRequestBlock == VMA_NULL ||</div>
+<div class="line"><a name="l13309"></a><span class="lineno">13309</span>&#160;                            currRequestCost &lt; bestRequestCost)</div>
+<div class="line"><a name="l13310"></a><span class="lineno">13310</span>&#160;                        {</div>
+<div class="line"><a name="l13311"></a><span class="lineno">13311</span>&#160;                            pBestRequestBlock = pCurrBlock;</div>
+<div class="line"><a name="l13312"></a><span class="lineno">13312</span>&#160;                            bestRequest = currRequest;</div>
+<div class="line"><a name="l13313"></a><span class="lineno">13313</span>&#160;                            bestRequestCost = currRequestCost;</div>
+<div class="line"><a name="l13314"></a><span class="lineno">13314</span>&#160; </div>
+<div class="line"><a name="l13315"></a><span class="lineno">13315</span>&#160;                            <span class="keywordflow">if</span>(bestRequestCost == 0)</div>
+<div class="line"><a name="l13316"></a><span class="lineno">13316</span>&#160;                            {</div>
+<div class="line"><a name="l13317"></a><span class="lineno">13317</span>&#160;                                <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l13318"></a><span class="lineno">13318</span>&#160;                            }</div>
+<div class="line"><a name="l13319"></a><span class="lineno">13319</span>&#160;                        }</div>
+<div class="line"><a name="l13320"></a><span class="lineno">13320</span>&#160;                    }</div>
+<div class="line"><a name="l13321"></a><span class="lineno">13321</span>&#160;                }</div>
+<div class="line"><a name="l13322"></a><span class="lineno">13322</span>&#160;            }</div>
+<div class="line"><a name="l13323"></a><span class="lineno">13323</span>&#160;            <span class="keywordflow">else</span> <span class="comment">// WORST_FIT, FIRST_FIT</span></div>
+<div class="line"><a name="l13324"></a><span class="lineno">13324</span>&#160;            {</div>
+<div class="line"><a name="l13325"></a><span class="lineno">13325</span>&#160;                <span class="comment">// Backward order in m_Blocks - prefer blocks with largest amount of free space.</span></div>
+<div class="line"><a name="l13326"></a><span class="lineno">13326</span>&#160;                <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> blockIndex = m_Blocks.size(); blockIndex--; )</div>
+<div class="line"><a name="l13327"></a><span class="lineno">13327</span>&#160;                {</div>
+<div class="line"><a name="l13328"></a><span class="lineno">13328</span>&#160;                    VmaDeviceMemoryBlock* <span class="keyword">const</span> pCurrBlock = m_Blocks[blockIndex];</div>
+<div class="line"><a name="l13329"></a><span class="lineno">13329</span>&#160;                    VMA_ASSERT(pCurrBlock);</div>
+<div class="line"><a name="l13330"></a><span class="lineno">13330</span>&#160;                    VmaAllocationRequest currRequest = {};</div>
+<div class="line"><a name="l13331"></a><span class="lineno">13331</span>&#160;                    <span class="keywordflow">if</span>(pCurrBlock-&gt;m_pMetadata-&gt;CreateAllocationRequest(</div>
+<div class="line"><a name="l13332"></a><span class="lineno">13332</span>&#160;                        currentFrameIndex,</div>
+<div class="line"><a name="l13333"></a><span class="lineno">13333</span>&#160;                        m_FrameInUseCount,</div>
+<div class="line"><a name="l13334"></a><span class="lineno">13334</span>&#160;                        m_BufferImageGranularity,</div>
+<div class="line"><a name="l13335"></a><span class="lineno">13335</span>&#160;                        size,</div>
+<div class="line"><a name="l13336"></a><span class="lineno">13336</span>&#160;                        alignment,</div>
+<div class="line"><a name="l13337"></a><span class="lineno">13337</span>&#160;                        (createInfo.<a class="code" href="struct_vma_allocation_create_info.html#add09658ac14fe290ace25470ddd6d41b">flags</a> &amp; <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a42ba3a2d2c7117953210b7c3ef8da0df">VMA_ALLOCATION_CREATE_UPPER_ADDRESS_BIT</a>) != 0,</div>
+<div class="line"><a name="l13338"></a><span class="lineno">13338</span>&#160;                        suballocType,</div>
+<div class="line"><a name="l13339"></a><span class="lineno">13339</span>&#160;                        canMakeOtherLost,</div>
+<div class="line"><a name="l13340"></a><span class="lineno">13340</span>&#160;                        strategy,</div>
+<div class="line"><a name="l13341"></a><span class="lineno">13341</span>&#160;                        &amp;currRequest))</div>
+<div class="line"><a name="l13342"></a><span class="lineno">13342</span>&#160;                    {</div>
+<div class="line"><a name="l13343"></a><span class="lineno">13343</span>&#160;                        <span class="keyword">const</span> VkDeviceSize currRequestCost = currRequest.CalcCost();</div>
+<div class="line"><a name="l13344"></a><span class="lineno">13344</span>&#160;                        <span class="keywordflow">if</span>(pBestRequestBlock == VMA_NULL ||</div>
+<div class="line"><a name="l13345"></a><span class="lineno">13345</span>&#160;                            currRequestCost &lt; bestRequestCost ||</div>
+<div class="line"><a name="l13346"></a><span class="lineno">13346</span>&#160;                            strategy == <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a33eb2052674f3ad92386c714a65fb777">VMA_ALLOCATION_CREATE_STRATEGY_FIRST_FIT_BIT</a>)</div>
+<div class="line"><a name="l13347"></a><span class="lineno">13347</span>&#160;                        {</div>
+<div class="line"><a name="l13348"></a><span class="lineno">13348</span>&#160;                            pBestRequestBlock = pCurrBlock;</div>
+<div class="line"><a name="l13349"></a><span class="lineno">13349</span>&#160;                            bestRequest = currRequest;</div>
+<div class="line"><a name="l13350"></a><span class="lineno">13350</span>&#160;                            bestRequestCost = currRequestCost;</div>
+<div class="line"><a name="l13351"></a><span class="lineno">13351</span>&#160; </div>
+<div class="line"><a name="l13352"></a><span class="lineno">13352</span>&#160;                            <span class="keywordflow">if</span>(bestRequestCost == 0 ||</div>
+<div class="line"><a name="l13353"></a><span class="lineno">13353</span>&#160;                                strategy == <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a33eb2052674f3ad92386c714a65fb777">VMA_ALLOCATION_CREATE_STRATEGY_FIRST_FIT_BIT</a>)</div>
+<div class="line"><a name="l13354"></a><span class="lineno">13354</span>&#160;                            {</div>
+<div class="line"><a name="l13355"></a><span class="lineno">13355</span>&#160;                                <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l13356"></a><span class="lineno">13356</span>&#160;                            }</div>
+<div class="line"><a name="l13357"></a><span class="lineno">13357</span>&#160;                        }</div>
+<div class="line"><a name="l13358"></a><span class="lineno">13358</span>&#160;                    }</div>
 <div class="line"><a name="l13359"></a><span class="lineno">13359</span>&#160;                }</div>
-<div class="line"><a name="l13360"></a><span class="lineno">13360</span>&#160; </div>
-<div class="line"><a name="l13361"></a><span class="lineno">13361</span>&#160;                VmaVectorRemove(m_Blocks, blockIndex);</div>
-<div class="line"><a name="l13362"></a><span class="lineno">13362</span>&#160;                pBlock-&gt;Destroy(m_hAllocator);</div>
-<div class="line"><a name="l13363"></a><span class="lineno">13363</span>&#160;                vma_delete(m_hAllocator, pBlock);</div>
-<div class="line"><a name="l13364"></a><span class="lineno">13364</span>&#160;            }</div>
-<div class="line"><a name="l13365"></a><span class="lineno">13365</span>&#160;            <span class="keywordflow">else</span></div>
-<div class="line"><a name="l13366"></a><span class="lineno">13366</span>&#160;            {</div>
-<div class="line"><a name="l13367"></a><span class="lineno">13367</span>&#160;                <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l13368"></a><span class="lineno">13368</span>&#160;            }</div>
-<div class="line"><a name="l13369"></a><span class="lineno">13369</span>&#160;        }</div>
-<div class="line"><a name="l13370"></a><span class="lineno">13370</span>&#160;    }</div>
-<div class="line"><a name="l13371"></a><span class="lineno">13371</span>&#160;    UpdateHasEmptyBlock();</div>
-<div class="line"><a name="l13372"></a><span class="lineno">13372</span>&#160;}</div>
-<div class="line"><a name="l13373"></a><span class="lineno">13373</span>&#160; </div>
-<div class="line"><a name="l13374"></a><span class="lineno">13374</span>&#160;<span class="keywordtype">void</span> VmaBlockVector::UpdateHasEmptyBlock()</div>
-<div class="line"><a name="l13375"></a><span class="lineno">13375</span>&#160;{</div>
-<div class="line"><a name="l13376"></a><span class="lineno">13376</span>&#160;    m_HasEmptyBlock = <span class="keyword">false</span>;</div>
-<div class="line"><a name="l13377"></a><span class="lineno">13377</span>&#160;    <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> index = 0, count = m_Blocks.size(); index &lt; count; ++index)</div>
-<div class="line"><a name="l13378"></a><span class="lineno">13378</span>&#160;    {</div>
-<div class="line"><a name="l13379"></a><span class="lineno">13379</span>&#160;        VmaDeviceMemoryBlock* <span class="keyword">const</span> pBlock = m_Blocks[index];</div>
-<div class="line"><a name="l13380"></a><span class="lineno">13380</span>&#160;        <span class="keywordflow">if</span>(pBlock-&gt;m_pMetadata-&gt;IsEmpty())</div>
-<div class="line"><a name="l13381"></a><span class="lineno">13381</span>&#160;        {</div>
-<div class="line"><a name="l13382"></a><span class="lineno">13382</span>&#160;            m_HasEmptyBlock = <span class="keyword">true</span>;</div>
-<div class="line"><a name="l13383"></a><span class="lineno">13383</span>&#160;            <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l13384"></a><span class="lineno">13384</span>&#160;        }</div>
-<div class="line"><a name="l13385"></a><span class="lineno">13385</span>&#160;    }</div>
-<div class="line"><a name="l13386"></a><span class="lineno">13386</span>&#160;}</div>
-<div class="line"><a name="l13387"></a><span class="lineno">13387</span>&#160; </div>
-<div class="line"><a name="l13388"></a><span class="lineno">13388</span>&#160;<span class="preprocessor">#if VMA_STATS_STRING_ENABLED</span></div>
-<div class="line"><a name="l13389"></a><span class="lineno">13389</span>&#160; </div>
-<div class="line"><a name="l13390"></a><span class="lineno">13390</span>&#160;<span class="keywordtype">void</span> VmaBlockVector::PrintDetailedMap(<span class="keyword">class</span> VmaJsonWriter&amp; json)</div>
-<div class="line"><a name="l13391"></a><span class="lineno">13391</span>&#160;{</div>
-<div class="line"><a name="l13392"></a><span class="lineno">13392</span>&#160;    VmaMutexLockRead lock(m_Mutex, m_hAllocator-&gt;m_UseMutex);</div>
-<div class="line"><a name="l13393"></a><span class="lineno">13393</span>&#160; </div>
-<div class="line"><a name="l13394"></a><span class="lineno">13394</span>&#160;    json.BeginObject();</div>
-<div class="line"><a name="l13395"></a><span class="lineno">13395</span>&#160; </div>
-<div class="line"><a name="l13396"></a><span class="lineno">13396</span>&#160;    <span class="keywordflow">if</span>(IsCustomPool())</div>
-<div class="line"><a name="l13397"></a><span class="lineno">13397</span>&#160;    {</div>
-<div class="line"><a name="l13398"></a><span class="lineno">13398</span>&#160;        <span class="keyword">const</span> <span class="keywordtype">char</span>* poolName = m_hParentPool-&gt;GetName();</div>
-<div class="line"><a name="l13399"></a><span class="lineno">13399</span>&#160;        <span class="keywordflow">if</span>(poolName != VMA_NULL &amp;&amp; poolName[0] != <span class="charliteral">&#39;\0&#39;</span>)</div>
-<div class="line"><a name="l13400"></a><span class="lineno">13400</span>&#160;        {</div>
-<div class="line"><a name="l13401"></a><span class="lineno">13401</span>&#160;            json.WriteString(<span class="stringliteral">&quot;Name&quot;</span>);</div>
-<div class="line"><a name="l13402"></a><span class="lineno">13402</span>&#160;            json.WriteString(poolName);</div>
-<div class="line"><a name="l13403"></a><span class="lineno">13403</span>&#160;        }</div>
-<div class="line"><a name="l13404"></a><span class="lineno">13404</span>&#160; </div>
-<div class="line"><a name="l13405"></a><span class="lineno">13405</span>&#160;        json.WriteString(<span class="stringliteral">&quot;MemoryTypeIndex&quot;</span>);</div>
-<div class="line"><a name="l13406"></a><span class="lineno">13406</span>&#160;        json.WriteNumber(m_MemoryTypeIndex);</div>
-<div class="line"><a name="l13407"></a><span class="lineno">13407</span>&#160; </div>
-<div class="line"><a name="l13408"></a><span class="lineno">13408</span>&#160;        json.WriteString(<span class="stringliteral">&quot;BlockSize&quot;</span>);</div>
-<div class="line"><a name="l13409"></a><span class="lineno">13409</span>&#160;        json.WriteNumber(m_PreferredBlockSize);</div>
-<div class="line"><a name="l13410"></a><span class="lineno">13410</span>&#160; </div>
-<div class="line"><a name="l13411"></a><span class="lineno">13411</span>&#160;        json.WriteString(<span class="stringliteral">&quot;BlockCount&quot;</span>);</div>
-<div class="line"><a name="l13412"></a><span class="lineno">13412</span>&#160;        json.BeginObject(<span class="keyword">true</span>);</div>
-<div class="line"><a name="l13413"></a><span class="lineno">13413</span>&#160;        <span class="keywordflow">if</span>(m_MinBlockCount &gt; 0)</div>
-<div class="line"><a name="l13414"></a><span class="lineno">13414</span>&#160;        {</div>
-<div class="line"><a name="l13415"></a><span class="lineno">13415</span>&#160;            json.WriteString(<span class="stringliteral">&quot;Min&quot;</span>);</div>
-<div class="line"><a name="l13416"></a><span class="lineno">13416</span>&#160;            json.WriteNumber((uint64_t)m_MinBlockCount);</div>
-<div class="line"><a name="l13417"></a><span class="lineno">13417</span>&#160;        }</div>
-<div class="line"><a name="l13418"></a><span class="lineno">13418</span>&#160;        <span class="keywordflow">if</span>(m_MaxBlockCount &lt; SIZE_MAX)</div>
-<div class="line"><a name="l13419"></a><span class="lineno">13419</span>&#160;        {</div>
-<div class="line"><a name="l13420"></a><span class="lineno">13420</span>&#160;            json.WriteString(<span class="stringliteral">&quot;Max&quot;</span>);</div>
-<div class="line"><a name="l13421"></a><span class="lineno">13421</span>&#160;            json.WriteNumber((uint64_t)m_MaxBlockCount);</div>
-<div class="line"><a name="l13422"></a><span class="lineno">13422</span>&#160;        }</div>
-<div class="line"><a name="l13423"></a><span class="lineno">13423</span>&#160;        json.WriteString(<span class="stringliteral">&quot;Cur&quot;</span>);</div>
-<div class="line"><a name="l13424"></a><span class="lineno">13424</span>&#160;        json.WriteNumber((uint64_t)m_Blocks.size());</div>
-<div class="line"><a name="l13425"></a><span class="lineno">13425</span>&#160;        json.EndObject();</div>
-<div class="line"><a name="l13426"></a><span class="lineno">13426</span>&#160; </div>
-<div class="line"><a name="l13427"></a><span class="lineno">13427</span>&#160;        <span class="keywordflow">if</span>(m_FrameInUseCount &gt; 0)</div>
-<div class="line"><a name="l13428"></a><span class="lineno">13428</span>&#160;        {</div>
-<div class="line"><a name="l13429"></a><span class="lineno">13429</span>&#160;            json.WriteString(<span class="stringliteral">&quot;FrameInUseCount&quot;</span>);</div>
-<div class="line"><a name="l13430"></a><span class="lineno">13430</span>&#160;            json.WriteNumber(m_FrameInUseCount);</div>
-<div class="line"><a name="l13431"></a><span class="lineno">13431</span>&#160;        }</div>
-<div class="line"><a name="l13432"></a><span class="lineno">13432</span>&#160; </div>
-<div class="line"><a name="l13433"></a><span class="lineno">13433</span>&#160;        <span class="keywordflow">if</span>(m_Algorithm != 0)</div>
-<div class="line"><a name="l13434"></a><span class="lineno">13434</span>&#160;        {</div>
-<div class="line"><a name="l13435"></a><span class="lineno">13435</span>&#160;            json.WriteString(<span class="stringliteral">&quot;Algorithm&quot;</span>);</div>
-<div class="line"><a name="l13436"></a><span class="lineno">13436</span>&#160;            json.WriteString(VmaAlgorithmToStr(m_Algorithm));</div>
-<div class="line"><a name="l13437"></a><span class="lineno">13437</span>&#160;        }</div>
-<div class="line"><a name="l13438"></a><span class="lineno">13438</span>&#160;    }</div>
-<div class="line"><a name="l13439"></a><span class="lineno">13439</span>&#160;    <span class="keywordflow">else</span></div>
+<div class="line"><a name="l13360"></a><span class="lineno">13360</span>&#160;            }</div>
+<div class="line"><a name="l13361"></a><span class="lineno">13361</span>&#160; </div>
+<div class="line"><a name="l13362"></a><span class="lineno">13362</span>&#160;            <span class="keywordflow">if</span>(pBestRequestBlock != VMA_NULL)</div>
+<div class="line"><a name="l13363"></a><span class="lineno">13363</span>&#160;            {</div>
+<div class="line"><a name="l13364"></a><span class="lineno">13364</span>&#160;                <span class="keywordflow">if</span>(mapped)</div>
+<div class="line"><a name="l13365"></a><span class="lineno">13365</span>&#160;                {</div>
+<div class="line"><a name="l13366"></a><span class="lineno">13366</span>&#160;                    VkResult res = pBestRequestBlock-&gt;Map(m_hAllocator, 1, VMA_NULL);</div>
+<div class="line"><a name="l13367"></a><span class="lineno">13367</span>&#160;                    <span class="keywordflow">if</span>(res != VK_SUCCESS)</div>
+<div class="line"><a name="l13368"></a><span class="lineno">13368</span>&#160;                    {</div>
+<div class="line"><a name="l13369"></a><span class="lineno">13369</span>&#160;                        <span class="keywordflow">return</span> res;</div>
+<div class="line"><a name="l13370"></a><span class="lineno">13370</span>&#160;                    }</div>
+<div class="line"><a name="l13371"></a><span class="lineno">13371</span>&#160;                }</div>
+<div class="line"><a name="l13372"></a><span class="lineno">13372</span>&#160; </div>
+<div class="line"><a name="l13373"></a><span class="lineno">13373</span>&#160;                <span class="keywordflow">if</span>(pBestRequestBlock-&gt;m_pMetadata-&gt;MakeRequestedAllocationsLost(</div>
+<div class="line"><a name="l13374"></a><span class="lineno">13374</span>&#160;                    currentFrameIndex,</div>
+<div class="line"><a name="l13375"></a><span class="lineno">13375</span>&#160;                    m_FrameInUseCount,</div>
+<div class="line"><a name="l13376"></a><span class="lineno">13376</span>&#160;                    &amp;bestRequest))</div>
+<div class="line"><a name="l13377"></a><span class="lineno">13377</span>&#160;                {</div>
+<div class="line"><a name="l13378"></a><span class="lineno">13378</span>&#160;                    <span class="comment">// Allocate from this pBlock.</span></div>
+<div class="line"><a name="l13379"></a><span class="lineno">13379</span>&#160;                    *pAllocation = m_hAllocator-&gt;m_AllocationObjectAllocator.Allocate(currentFrameIndex, isUserDataString);</div>
+<div class="line"><a name="l13380"></a><span class="lineno">13380</span>&#160;                    pBestRequestBlock-&gt;m_pMetadata-&gt;Alloc(bestRequest, suballocType, size, *pAllocation);</div>
+<div class="line"><a name="l13381"></a><span class="lineno">13381</span>&#160;                    UpdateHasEmptyBlock();</div>
+<div class="line"><a name="l13382"></a><span class="lineno">13382</span>&#160;                    (*pAllocation)-&gt;InitBlockAllocation(</div>
+<div class="line"><a name="l13383"></a><span class="lineno">13383</span>&#160;                        pBestRequestBlock,</div>
+<div class="line"><a name="l13384"></a><span class="lineno">13384</span>&#160;                        bestRequest.offset,</div>
+<div class="line"><a name="l13385"></a><span class="lineno">13385</span>&#160;                        alignment,</div>
+<div class="line"><a name="l13386"></a><span class="lineno">13386</span>&#160;                        size,</div>
+<div class="line"><a name="l13387"></a><span class="lineno">13387</span>&#160;                        m_MemoryTypeIndex,</div>
+<div class="line"><a name="l13388"></a><span class="lineno">13388</span>&#160;                        suballocType,</div>
+<div class="line"><a name="l13389"></a><span class="lineno">13389</span>&#160;                        mapped,</div>
+<div class="line"><a name="l13390"></a><span class="lineno">13390</span>&#160;                        (createInfo.<a class="code" href="struct_vma_allocation_create_info.html#add09658ac14fe290ace25470ddd6d41b">flags</a> &amp; <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a5f436af6c8fe8540573a6d22627a6fd2">VMA_ALLOCATION_CREATE_CAN_BECOME_LOST_BIT</a>) != 0);</div>
+<div class="line"><a name="l13391"></a><span class="lineno">13391</span>&#160;                    VMA_HEAVY_ASSERT(pBestRequestBlock-&gt;Validate());</div>
+<div class="line"><a name="l13392"></a><span class="lineno">13392</span>&#160;                    VMA_DEBUG_LOG(<span class="stringliteral">&quot;    Returned from existing block&quot;</span>);</div>
+<div class="line"><a name="l13393"></a><span class="lineno">13393</span>&#160;                    (*pAllocation)-&gt;SetUserData(m_hAllocator, createInfo.<a class="code" href="struct_vma_allocation_create_info.html#a8259e85c272683434f4abb4ddddffe19">pUserData</a>);</div>
+<div class="line"><a name="l13394"></a><span class="lineno">13394</span>&#160;                    m_hAllocator-&gt;m_Budget.AddAllocation(m_hAllocator-&gt;MemoryTypeIndexToHeapIndex(m_MemoryTypeIndex), size);</div>
+<div class="line"><a name="l13395"></a><span class="lineno">13395</span>&#160;                    <span class="keywordflow">if</span>(VMA_DEBUG_INITIALIZE_ALLOCATIONS)</div>
+<div class="line"><a name="l13396"></a><span class="lineno">13396</span>&#160;                    {</div>
+<div class="line"><a name="l13397"></a><span class="lineno">13397</span>&#160;                        m_hAllocator-&gt;FillAllocation(*pAllocation, VMA_ALLOCATION_FILL_PATTERN_CREATED);</div>
+<div class="line"><a name="l13398"></a><span class="lineno">13398</span>&#160;                    }</div>
+<div class="line"><a name="l13399"></a><span class="lineno">13399</span>&#160;                    <span class="keywordflow">if</span>(IsCorruptionDetectionEnabled())</div>
+<div class="line"><a name="l13400"></a><span class="lineno">13400</span>&#160;                    {</div>
+<div class="line"><a name="l13401"></a><span class="lineno">13401</span>&#160;                        VkResult res = pBestRequestBlock-&gt;WriteMagicValueAroundAllocation(m_hAllocator, bestRequest.offset, size);</div>
+<div class="line"><a name="l13402"></a><span class="lineno">13402</span>&#160;                        VMA_ASSERT(res == VK_SUCCESS &amp;&amp; <span class="stringliteral">&quot;Couldn&#39;t map block memory to write magic value.&quot;</span>);</div>
+<div class="line"><a name="l13403"></a><span class="lineno">13403</span>&#160;                    }</div>
+<div class="line"><a name="l13404"></a><span class="lineno">13404</span>&#160;                    <span class="keywordflow">return</span> VK_SUCCESS;</div>
+<div class="line"><a name="l13405"></a><span class="lineno">13405</span>&#160;                }</div>
+<div class="line"><a name="l13406"></a><span class="lineno">13406</span>&#160;                <span class="comment">// else: Some allocations must have been touched while we are here. Next try.</span></div>
+<div class="line"><a name="l13407"></a><span class="lineno">13407</span>&#160;            }</div>
+<div class="line"><a name="l13408"></a><span class="lineno">13408</span>&#160;            <span class="keywordflow">else</span></div>
+<div class="line"><a name="l13409"></a><span class="lineno">13409</span>&#160;            {</div>
+<div class="line"><a name="l13410"></a><span class="lineno">13410</span>&#160;                <span class="comment">// Could not find place in any of the blocks - break outer loop.</span></div>
+<div class="line"><a name="l13411"></a><span class="lineno">13411</span>&#160;                <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l13412"></a><span class="lineno">13412</span>&#160;            }</div>
+<div class="line"><a name="l13413"></a><span class="lineno">13413</span>&#160;        }</div>
+<div class="line"><a name="l13414"></a><span class="lineno">13414</span>&#160;        <span class="comment">/* Maximum number of tries exceeded - a very unlike event when many other</span></div>
+<div class="line"><a name="l13415"></a><span class="lineno">13415</span>&#160;<span class="comment">        threads are simultaneously touching allocations making it impossible to make</span></div>
+<div class="line"><a name="l13416"></a><span class="lineno">13416</span>&#160;<span class="comment">        lost at the same time as we try to allocate. */</span></div>
+<div class="line"><a name="l13417"></a><span class="lineno">13417</span>&#160;        <span class="keywordflow">if</span>(tryIndex == VMA_ALLOCATION_TRY_COUNT)</div>
+<div class="line"><a name="l13418"></a><span class="lineno">13418</span>&#160;        {</div>
+<div class="line"><a name="l13419"></a><span class="lineno">13419</span>&#160;            <span class="keywordflow">return</span> VK_ERROR_TOO_MANY_OBJECTS;</div>
+<div class="line"><a name="l13420"></a><span class="lineno">13420</span>&#160;        }</div>
+<div class="line"><a name="l13421"></a><span class="lineno">13421</span>&#160;    }</div>
+<div class="line"><a name="l13422"></a><span class="lineno">13422</span>&#160; </div>
+<div class="line"><a name="l13423"></a><span class="lineno">13423</span>&#160;    <span class="keywordflow">return</span> VK_ERROR_OUT_OF_DEVICE_MEMORY;</div>
+<div class="line"><a name="l13424"></a><span class="lineno">13424</span>&#160;}</div>
+<div class="line"><a name="l13425"></a><span class="lineno">13425</span>&#160; </div>
+<div class="line"><a name="l13426"></a><span class="lineno">13426</span>&#160;<span class="keywordtype">void</span> VmaBlockVector::Free(</div>
+<div class="line"><a name="l13427"></a><span class="lineno">13427</span>&#160;    <span class="keyword">const</span> <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> hAllocation)</div>
+<div class="line"><a name="l13428"></a><span class="lineno">13428</span>&#160;{</div>
+<div class="line"><a name="l13429"></a><span class="lineno">13429</span>&#160;    VmaDeviceMemoryBlock* pBlockToDelete = VMA_NULL;</div>
+<div class="line"><a name="l13430"></a><span class="lineno">13430</span>&#160; </div>
+<div class="line"><a name="l13431"></a><span class="lineno">13431</span>&#160;    <span class="keywordtype">bool</span> budgetExceeded = <span class="keyword">false</span>;</div>
+<div class="line"><a name="l13432"></a><span class="lineno">13432</span>&#160;    {</div>
+<div class="line"><a name="l13433"></a><span class="lineno">13433</span>&#160;        <span class="keyword">const</span> uint32_t heapIndex = m_hAllocator-&gt;MemoryTypeIndexToHeapIndex(m_MemoryTypeIndex);</div>
+<div class="line"><a name="l13434"></a><span class="lineno">13434</span>&#160;        <a class="code" href="struct_vma_budget.html">VmaBudget</a> heapBudget = {};</div>
+<div class="line"><a name="l13435"></a><span class="lineno">13435</span>&#160;        m_hAllocator-&gt;GetBudget(&amp;heapBudget, heapIndex, 1);</div>
+<div class="line"><a name="l13436"></a><span class="lineno">13436</span>&#160;        budgetExceeded = heapBudget.<a class="code" href="struct_vma_budget.html#a84dd1ecca8b0110259eb206dbadb11f6">usage</a> &gt;= heapBudget.<a class="code" href="struct_vma_budget.html#ab82e1d1754c2d210d0bdf90220bc6cdd">budget</a>;</div>
+<div class="line"><a name="l13437"></a><span class="lineno">13437</span>&#160;    }</div>
+<div class="line"><a name="l13438"></a><span class="lineno">13438</span>&#160; </div>
+<div class="line"><a name="l13439"></a><span class="lineno">13439</span>&#160;    <span class="comment">// Scope for lock.</span></div>
 <div class="line"><a name="l13440"></a><span class="lineno">13440</span>&#160;    {</div>
-<div class="line"><a name="l13441"></a><span class="lineno">13441</span>&#160;        json.WriteString(<span class="stringliteral">&quot;PreferredBlockSize&quot;</span>);</div>
-<div class="line"><a name="l13442"></a><span class="lineno">13442</span>&#160;        json.WriteNumber(m_PreferredBlockSize);</div>
-<div class="line"><a name="l13443"></a><span class="lineno">13443</span>&#160;    }</div>
+<div class="line"><a name="l13441"></a><span class="lineno">13441</span>&#160;        VmaMutexLockWrite lock(m_Mutex, m_hAllocator-&gt;m_UseMutex);</div>
+<div class="line"><a name="l13442"></a><span class="lineno">13442</span>&#160; </div>
+<div class="line"><a name="l13443"></a><span class="lineno">13443</span>&#160;        VmaDeviceMemoryBlock* pBlock = hAllocation-&gt;GetBlock();</div>
 <div class="line"><a name="l13444"></a><span class="lineno">13444</span>&#160; </div>
-<div class="line"><a name="l13445"></a><span class="lineno">13445</span>&#160;    json.WriteString(<span class="stringliteral">&quot;Blocks&quot;</span>);</div>
-<div class="line"><a name="l13446"></a><span class="lineno">13446</span>&#160;    json.BeginObject();</div>
-<div class="line"><a name="l13447"></a><span class="lineno">13447</span>&#160;    <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> i = 0; i &lt; m_Blocks.size(); ++i)</div>
-<div class="line"><a name="l13448"></a><span class="lineno">13448</span>&#160;    {</div>
-<div class="line"><a name="l13449"></a><span class="lineno">13449</span>&#160;        json.BeginString();</div>
-<div class="line"><a name="l13450"></a><span class="lineno">13450</span>&#160;        json.ContinueString(m_Blocks[i]-&gt;GetId());</div>
-<div class="line"><a name="l13451"></a><span class="lineno">13451</span>&#160;        json.EndString();</div>
-<div class="line"><a name="l13452"></a><span class="lineno">13452</span>&#160; </div>
-<div class="line"><a name="l13453"></a><span class="lineno">13453</span>&#160;        m_Blocks[i]-&gt;m_pMetadata-&gt;PrintDetailedMap(json);</div>
-<div class="line"><a name="l13454"></a><span class="lineno">13454</span>&#160;    }</div>
-<div class="line"><a name="l13455"></a><span class="lineno">13455</span>&#160;    json.EndObject();</div>
-<div class="line"><a name="l13456"></a><span class="lineno">13456</span>&#160; </div>
-<div class="line"><a name="l13457"></a><span class="lineno">13457</span>&#160;    json.EndObject();</div>
-<div class="line"><a name="l13458"></a><span class="lineno">13458</span>&#160;}</div>
-<div class="line"><a name="l13459"></a><span class="lineno">13459</span>&#160; </div>
-<div class="line"><a name="l13460"></a><span class="lineno">13460</span>&#160;<span class="preprocessor">#endif // #if VMA_STATS_STRING_ENABLED</span></div>
-<div class="line"><a name="l13461"></a><span class="lineno">13461</span>&#160; </div>
-<div class="line"><a name="l13462"></a><span class="lineno">13462</span>&#160;<span class="keywordtype">void</span> VmaBlockVector::Defragment(</div>
-<div class="line"><a name="l13463"></a><span class="lineno">13463</span>&#160;    <span class="keyword">class</span> VmaBlockVectorDefragmentationContext* pCtx,</div>
-<div class="line"><a name="l13464"></a><span class="lineno">13464</span>&#160;    <a class="code" href="struct_vma_defragmentation_stats.html">VmaDefragmentationStats</a>* pStats, <a class="code" href="vk__mem__alloc_8h.html#a88a77cef37e5d3c4fc9eb328885d048d">VmaDefragmentationFlags</a> flags,</div>
-<div class="line"><a name="l13465"></a><span class="lineno">13465</span>&#160;    VkDeviceSize&amp; maxCpuBytesToMove, uint32_t&amp; maxCpuAllocationsToMove,</div>
-<div class="line"><a name="l13466"></a><span class="lineno">13466</span>&#160;    VkDeviceSize&amp; maxGpuBytesToMove, uint32_t&amp; maxGpuAllocationsToMove,</div>
-<div class="line"><a name="l13467"></a><span class="lineno">13467</span>&#160;    VkCommandBuffer commandBuffer)</div>
-<div class="line"><a name="l13468"></a><span class="lineno">13468</span>&#160;{</div>
-<div class="line"><a name="l13469"></a><span class="lineno">13469</span>&#160;    pCtx-&gt;res = VK_SUCCESS;</div>
-<div class="line"><a name="l13470"></a><span class="lineno">13470</span>&#160;    </div>
-<div class="line"><a name="l13471"></a><span class="lineno">13471</span>&#160;    <span class="keyword">const</span> VkMemoryPropertyFlags memPropFlags =</div>
-<div class="line"><a name="l13472"></a><span class="lineno">13472</span>&#160;        m_hAllocator-&gt;m_MemProps.memoryTypes[m_MemoryTypeIndex].propertyFlags;</div>
-<div class="line"><a name="l13473"></a><span class="lineno">13473</span>&#160;    <span class="keyword">const</span> <span class="keywordtype">bool</span> isHostVisible = (memPropFlags &amp; VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT) != 0;</div>
-<div class="line"><a name="l13474"></a><span class="lineno">13474</span>&#160; </div>
-<div class="line"><a name="l13475"></a><span class="lineno">13475</span>&#160;    <span class="keyword">const</span> <span class="keywordtype">bool</span> canDefragmentOnCpu = maxCpuBytesToMove &gt; 0 &amp;&amp; maxCpuAllocationsToMove &gt; 0 &amp;&amp;</div>
-<div class="line"><a name="l13476"></a><span class="lineno">13476</span>&#160;        isHostVisible;</div>
-<div class="line"><a name="l13477"></a><span class="lineno">13477</span>&#160;    <span class="keyword">const</span> <span class="keywordtype">bool</span> canDefragmentOnGpu = maxGpuBytesToMove &gt; 0 &amp;&amp; maxGpuAllocationsToMove &gt; 0 &amp;&amp;</div>
-<div class="line"><a name="l13478"></a><span class="lineno">13478</span>&#160;        !IsCorruptionDetectionEnabled() &amp;&amp;</div>
-<div class="line"><a name="l13479"></a><span class="lineno">13479</span>&#160;        ((1u &lt;&lt; m_MemoryTypeIndex) &amp; m_hAllocator-&gt;GetGpuDefragmentationMemoryTypeBits()) != 0;</div>
-<div class="line"><a name="l13480"></a><span class="lineno">13480</span>&#160; </div>
-<div class="line"><a name="l13481"></a><span class="lineno">13481</span>&#160;    <span class="comment">// There are options to defragment this memory type.</span></div>
-<div class="line"><a name="l13482"></a><span class="lineno">13482</span>&#160;    <span class="keywordflow">if</span>(canDefragmentOnCpu || canDefragmentOnGpu)</div>
-<div class="line"><a name="l13483"></a><span class="lineno">13483</span>&#160;    {</div>
-<div class="line"><a name="l13484"></a><span class="lineno">13484</span>&#160;        <span class="keywordtype">bool</span> defragmentOnGpu;</div>
-<div class="line"><a name="l13485"></a><span class="lineno">13485</span>&#160;        <span class="comment">// There is only one option to defragment this memory type.</span></div>
-<div class="line"><a name="l13486"></a><span class="lineno">13486</span>&#160;        <span class="keywordflow">if</span>(canDefragmentOnGpu != canDefragmentOnCpu)</div>
-<div class="line"><a name="l13487"></a><span class="lineno">13487</span>&#160;        {</div>
-<div class="line"><a name="l13488"></a><span class="lineno">13488</span>&#160;            defragmentOnGpu = canDefragmentOnGpu;</div>
-<div class="line"><a name="l13489"></a><span class="lineno">13489</span>&#160;        }</div>
-<div class="line"><a name="l13490"></a><span class="lineno">13490</span>&#160;        <span class="comment">// Both options are available: Heuristics to choose the best one.</span></div>
-<div class="line"><a name="l13491"></a><span class="lineno">13491</span>&#160;        <span class="keywordflow">else</span></div>
-<div class="line"><a name="l13492"></a><span class="lineno">13492</span>&#160;        {</div>
-<div class="line"><a name="l13493"></a><span class="lineno">13493</span>&#160;            defragmentOnGpu = (memPropFlags &amp; VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT) != 0 ||</div>
-<div class="line"><a name="l13494"></a><span class="lineno">13494</span>&#160;                m_hAllocator-&gt;IsIntegratedGpu();</div>
-<div class="line"><a name="l13495"></a><span class="lineno">13495</span>&#160;        }</div>
-<div class="line"><a name="l13496"></a><span class="lineno">13496</span>&#160; </div>
-<div class="line"><a name="l13497"></a><span class="lineno">13497</span>&#160;        <span class="keywordtype">bool</span> overlappingMoveSupported = !defragmentOnGpu;</div>
+<div class="line"><a name="l13445"></a><span class="lineno">13445</span>&#160;        <span class="keywordflow">if</span>(IsCorruptionDetectionEnabled())</div>
+<div class="line"><a name="l13446"></a><span class="lineno">13446</span>&#160;        {</div>
+<div class="line"><a name="l13447"></a><span class="lineno">13447</span>&#160;            VkResult res = pBlock-&gt;ValidateMagicValueAroundAllocation(m_hAllocator, hAllocation-&gt;GetOffset(), hAllocation-&gt;GetSize());</div>
+<div class="line"><a name="l13448"></a><span class="lineno">13448</span>&#160;            VMA_ASSERT(res == VK_SUCCESS &amp;&amp; <span class="stringliteral">&quot;Couldn&#39;t map block memory to validate magic value.&quot;</span>);</div>
+<div class="line"><a name="l13449"></a><span class="lineno">13449</span>&#160;        }</div>
+<div class="line"><a name="l13450"></a><span class="lineno">13450</span>&#160; </div>
+<div class="line"><a name="l13451"></a><span class="lineno">13451</span>&#160;        <span class="keywordflow">if</span>(hAllocation-&gt;IsPersistentMap())</div>
+<div class="line"><a name="l13452"></a><span class="lineno">13452</span>&#160;        {</div>
+<div class="line"><a name="l13453"></a><span class="lineno">13453</span>&#160;            pBlock-&gt;Unmap(m_hAllocator, 1);</div>
+<div class="line"><a name="l13454"></a><span class="lineno">13454</span>&#160;        }</div>
+<div class="line"><a name="l13455"></a><span class="lineno">13455</span>&#160; </div>
+<div class="line"><a name="l13456"></a><span class="lineno">13456</span>&#160;        pBlock-&gt;m_pMetadata-&gt;Free(hAllocation);</div>
+<div class="line"><a name="l13457"></a><span class="lineno">13457</span>&#160;        VMA_HEAVY_ASSERT(pBlock-&gt;Validate());</div>
+<div class="line"><a name="l13458"></a><span class="lineno">13458</span>&#160; </div>
+<div class="line"><a name="l13459"></a><span class="lineno">13459</span>&#160;        VMA_DEBUG_LOG(<span class="stringliteral">&quot;  Freed from MemoryTypeIndex=%u&quot;</span>, m_MemoryTypeIndex);</div>
+<div class="line"><a name="l13460"></a><span class="lineno">13460</span>&#160; </div>
+<div class="line"><a name="l13461"></a><span class="lineno">13461</span>&#160;        <span class="keyword">const</span> <span class="keywordtype">bool</span> canDeleteBlock = m_Blocks.size() &gt; m_MinBlockCount;</div>
+<div class="line"><a name="l13462"></a><span class="lineno">13462</span>&#160;        <span class="comment">// pBlock became empty after this deallocation.</span></div>
+<div class="line"><a name="l13463"></a><span class="lineno">13463</span>&#160;        <span class="keywordflow">if</span>(pBlock-&gt;m_pMetadata-&gt;IsEmpty())</div>
+<div class="line"><a name="l13464"></a><span class="lineno">13464</span>&#160;        {</div>
+<div class="line"><a name="l13465"></a><span class="lineno">13465</span>&#160;            <span class="comment">// Already has empty block. We don&#39;t want to have two, so delete this one.</span></div>
+<div class="line"><a name="l13466"></a><span class="lineno">13466</span>&#160;            <span class="keywordflow">if</span>((m_HasEmptyBlock || budgetExceeded) &amp;&amp; canDeleteBlock)</div>
+<div class="line"><a name="l13467"></a><span class="lineno">13467</span>&#160;            {</div>
+<div class="line"><a name="l13468"></a><span class="lineno">13468</span>&#160;                pBlockToDelete = pBlock;</div>
+<div class="line"><a name="l13469"></a><span class="lineno">13469</span>&#160;                Remove(pBlock);</div>
+<div class="line"><a name="l13470"></a><span class="lineno">13470</span>&#160;            }</div>
+<div class="line"><a name="l13471"></a><span class="lineno">13471</span>&#160;            <span class="comment">// else: We now have an empty block - leave it.</span></div>
+<div class="line"><a name="l13472"></a><span class="lineno">13472</span>&#160;        }</div>
+<div class="line"><a name="l13473"></a><span class="lineno">13473</span>&#160;        <span class="comment">// pBlock didn&#39;t become empty, but we have another empty block - find and free that one.</span></div>
+<div class="line"><a name="l13474"></a><span class="lineno">13474</span>&#160;        <span class="comment">// (This is optional, heuristics.)</span></div>
+<div class="line"><a name="l13475"></a><span class="lineno">13475</span>&#160;        <span class="keywordflow">else</span> <span class="keywordflow">if</span>(m_HasEmptyBlock &amp;&amp; canDeleteBlock)</div>
+<div class="line"><a name="l13476"></a><span class="lineno">13476</span>&#160;        {</div>
+<div class="line"><a name="l13477"></a><span class="lineno">13477</span>&#160;            VmaDeviceMemoryBlock* pLastBlock = m_Blocks.back();</div>
+<div class="line"><a name="l13478"></a><span class="lineno">13478</span>&#160;            <span class="keywordflow">if</span>(pLastBlock-&gt;m_pMetadata-&gt;IsEmpty())</div>
+<div class="line"><a name="l13479"></a><span class="lineno">13479</span>&#160;            {</div>
+<div class="line"><a name="l13480"></a><span class="lineno">13480</span>&#160;                pBlockToDelete = pLastBlock;</div>
+<div class="line"><a name="l13481"></a><span class="lineno">13481</span>&#160;                m_Blocks.pop_back();</div>
+<div class="line"><a name="l13482"></a><span class="lineno">13482</span>&#160;            }</div>
+<div class="line"><a name="l13483"></a><span class="lineno">13483</span>&#160;        }</div>
+<div class="line"><a name="l13484"></a><span class="lineno">13484</span>&#160; </div>
+<div class="line"><a name="l13485"></a><span class="lineno">13485</span>&#160;        UpdateHasEmptyBlock();</div>
+<div class="line"><a name="l13486"></a><span class="lineno">13486</span>&#160;        IncrementallySortBlocks();</div>
+<div class="line"><a name="l13487"></a><span class="lineno">13487</span>&#160;    }</div>
+<div class="line"><a name="l13488"></a><span class="lineno">13488</span>&#160; </div>
+<div class="line"><a name="l13489"></a><span class="lineno">13489</span>&#160;    <span class="comment">// Destruction of a free block. Deferred until this point, outside of mutex</span></div>
+<div class="line"><a name="l13490"></a><span class="lineno">13490</span>&#160;    <span class="comment">// lock, for performance reason.</span></div>
+<div class="line"><a name="l13491"></a><span class="lineno">13491</span>&#160;    <span class="keywordflow">if</span>(pBlockToDelete != VMA_NULL)</div>
+<div class="line"><a name="l13492"></a><span class="lineno">13492</span>&#160;    {</div>
+<div class="line"><a name="l13493"></a><span class="lineno">13493</span>&#160;        VMA_DEBUG_LOG(<span class="stringliteral">&quot;    Deleted empty block&quot;</span>);</div>
+<div class="line"><a name="l13494"></a><span class="lineno">13494</span>&#160;        pBlockToDelete-&gt;Destroy(m_hAllocator);</div>
+<div class="line"><a name="l13495"></a><span class="lineno">13495</span>&#160;        vma_delete(m_hAllocator, pBlockToDelete);</div>
+<div class="line"><a name="l13496"></a><span class="lineno">13496</span>&#160;    }</div>
+<div class="line"><a name="l13497"></a><span class="lineno">13497</span>&#160;}</div>
 <div class="line"><a name="l13498"></a><span class="lineno">13498</span>&#160; </div>
-<div class="line"><a name="l13499"></a><span class="lineno">13499</span>&#160;        <span class="keywordflow">if</span>(m_hAllocator-&gt;m_UseMutex)</div>
-<div class="line"><a name="l13500"></a><span class="lineno">13500</span>&#160;        {</div>
-<div class="line"><a name="l13501"></a><span class="lineno">13501</span>&#160;            <span class="keywordflow">if</span>(flags &amp; <a class="code" href="vk__mem__alloc_8h.html#a6552a65b71d16f378c6994b3ceaef50ca31af49446af2459284a568ce2f3fdd33">VMA_DEFRAGMENTATION_FLAG_INCREMENTAL</a>)</div>
-<div class="line"><a name="l13502"></a><span class="lineno">13502</span>&#160;            {</div>
-<div class="line"><a name="l13503"></a><span class="lineno">13503</span>&#160;                <span class="keywordflow">if</span>(!m_Mutex.TryLockWrite())</div>
-<div class="line"><a name="l13504"></a><span class="lineno">13504</span>&#160;                {</div>
-<div class="line"><a name="l13505"></a><span class="lineno">13505</span>&#160;                    pCtx-&gt;res = VK_ERROR_INITIALIZATION_FAILED;</div>
-<div class="line"><a name="l13506"></a><span class="lineno">13506</span>&#160;                    <span class="keywordflow">return</span>;</div>
-<div class="line"><a name="l13507"></a><span class="lineno">13507</span>&#160;                }</div>
-<div class="line"><a name="l13508"></a><span class="lineno">13508</span>&#160;            }</div>
-<div class="line"><a name="l13509"></a><span class="lineno">13509</span>&#160;            <span class="keywordflow">else</span></div>
-<div class="line"><a name="l13510"></a><span class="lineno">13510</span>&#160;            {</div>
-<div class="line"><a name="l13511"></a><span class="lineno">13511</span>&#160;                m_Mutex.LockWrite();</div>
-<div class="line"><a name="l13512"></a><span class="lineno">13512</span>&#160;                pCtx-&gt;mutexLocked = <span class="keyword">true</span>;</div>
-<div class="line"><a name="l13513"></a><span class="lineno">13513</span>&#160;            }</div>
-<div class="line"><a name="l13514"></a><span class="lineno">13514</span>&#160;        }</div>
-<div class="line"><a name="l13515"></a><span class="lineno">13515</span>&#160; </div>
-<div class="line"><a name="l13516"></a><span class="lineno">13516</span>&#160;        pCtx-&gt;Begin(overlappingMoveSupported, flags);</div>
-<div class="line"><a name="l13517"></a><span class="lineno">13517</span>&#160; </div>
-<div class="line"><a name="l13518"></a><span class="lineno">13518</span>&#160;        <span class="comment">// Defragment.</span></div>
-<div class="line"><a name="l13519"></a><span class="lineno">13519</span>&#160; </div>
-<div class="line"><a name="l13520"></a><span class="lineno">13520</span>&#160;        <span class="keyword">const</span> VkDeviceSize maxBytesToMove = defragmentOnGpu ? maxGpuBytesToMove : maxCpuBytesToMove;</div>
-<div class="line"><a name="l13521"></a><span class="lineno">13521</span>&#160;        <span class="keyword">const</span> uint32_t maxAllocationsToMove = defragmentOnGpu ? maxGpuAllocationsToMove : maxCpuAllocationsToMove;</div>
-<div class="line"><a name="l13522"></a><span class="lineno">13522</span>&#160;        pCtx-&gt;res = pCtx-&gt;GetAlgorithm()-&gt;Defragment(pCtx-&gt;defragmentationMoves, maxBytesToMove, maxAllocationsToMove, flags);</div>
-<div class="line"><a name="l13523"></a><span class="lineno">13523</span>&#160; </div>
-<div class="line"><a name="l13524"></a><span class="lineno">13524</span>&#160;        <span class="comment">// Accumulate statistics.</span></div>
-<div class="line"><a name="l13525"></a><span class="lineno">13525</span>&#160;        <span class="keywordflow">if</span>(pStats != VMA_NULL)</div>
-<div class="line"><a name="l13526"></a><span class="lineno">13526</span>&#160;        {</div>
-<div class="line"><a name="l13527"></a><span class="lineno">13527</span>&#160;            <span class="keyword">const</span> VkDeviceSize bytesMoved = pCtx-&gt;GetAlgorithm()-&gt;GetBytesMoved();</div>
-<div class="line"><a name="l13528"></a><span class="lineno">13528</span>&#160;            <span class="keyword">const</span> uint32_t allocationsMoved = pCtx-&gt;GetAlgorithm()-&gt;GetAllocationsMoved();</div>
-<div class="line"><a name="l13529"></a><span class="lineno">13529</span>&#160;            pStats-&gt;<a class="code" href="struct_vma_defragmentation_stats.html#a36f9d5df2a10ba2a36b16e126d60572d">bytesMoved</a> += bytesMoved;</div>
-<div class="line"><a name="l13530"></a><span class="lineno">13530</span>&#160;            pStats-&gt;<a class="code" href="struct_vma_defragmentation_stats.html#aefeabf130022008eadd75999478af3f9">allocationsMoved</a> += allocationsMoved;</div>
-<div class="line"><a name="l13531"></a><span class="lineno">13531</span>&#160;            VMA_ASSERT(bytesMoved &lt;= maxBytesToMove);</div>
-<div class="line"><a name="l13532"></a><span class="lineno">13532</span>&#160;            VMA_ASSERT(allocationsMoved &lt;= maxAllocationsToMove);</div>
-<div class="line"><a name="l13533"></a><span class="lineno">13533</span>&#160;            <span class="keywordflow">if</span>(defragmentOnGpu)</div>
+<div class="line"><a name="l13499"></a><span class="lineno">13499</span>&#160;VkDeviceSize VmaBlockVector::CalcMaxBlockSize()<span class="keyword"> const</span></div>
+<div class="line"><a name="l13500"></a><span class="lineno">13500</span>&#160;<span class="keyword"></span>{</div>
+<div class="line"><a name="l13501"></a><span class="lineno">13501</span>&#160;    VkDeviceSize result = 0;</div>
+<div class="line"><a name="l13502"></a><span class="lineno">13502</span>&#160;    <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> i = m_Blocks.size(); i--; )</div>
+<div class="line"><a name="l13503"></a><span class="lineno">13503</span>&#160;    {</div>
+<div class="line"><a name="l13504"></a><span class="lineno">13504</span>&#160;        result = VMA_MAX(result, m_Blocks[i]-&gt;m_pMetadata-&gt;GetSize());</div>
+<div class="line"><a name="l13505"></a><span class="lineno">13505</span>&#160;        <span class="keywordflow">if</span>(result &gt;= m_PreferredBlockSize)</div>
+<div class="line"><a name="l13506"></a><span class="lineno">13506</span>&#160;        {</div>
+<div class="line"><a name="l13507"></a><span class="lineno">13507</span>&#160;            <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l13508"></a><span class="lineno">13508</span>&#160;        }</div>
+<div class="line"><a name="l13509"></a><span class="lineno">13509</span>&#160;    }</div>
+<div class="line"><a name="l13510"></a><span class="lineno">13510</span>&#160;    <span class="keywordflow">return</span> result;</div>
+<div class="line"><a name="l13511"></a><span class="lineno">13511</span>&#160;}</div>
+<div class="line"><a name="l13512"></a><span class="lineno">13512</span>&#160; </div>
+<div class="line"><a name="l13513"></a><span class="lineno">13513</span>&#160;<span class="keywordtype">void</span> VmaBlockVector::Remove(VmaDeviceMemoryBlock* pBlock)</div>
+<div class="line"><a name="l13514"></a><span class="lineno">13514</span>&#160;{</div>
+<div class="line"><a name="l13515"></a><span class="lineno">13515</span>&#160;    <span class="keywordflow">for</span>(uint32_t blockIndex = 0; blockIndex &lt; m_Blocks.size(); ++blockIndex)</div>
+<div class="line"><a name="l13516"></a><span class="lineno">13516</span>&#160;    {</div>
+<div class="line"><a name="l13517"></a><span class="lineno">13517</span>&#160;        <span class="keywordflow">if</span>(m_Blocks[blockIndex] == pBlock)</div>
+<div class="line"><a name="l13518"></a><span class="lineno">13518</span>&#160;        {</div>
+<div class="line"><a name="l13519"></a><span class="lineno">13519</span>&#160;            VmaVectorRemove(m_Blocks, blockIndex);</div>
+<div class="line"><a name="l13520"></a><span class="lineno">13520</span>&#160;            <span class="keywordflow">return</span>;</div>
+<div class="line"><a name="l13521"></a><span class="lineno">13521</span>&#160;        }</div>
+<div class="line"><a name="l13522"></a><span class="lineno">13522</span>&#160;    }</div>
+<div class="line"><a name="l13523"></a><span class="lineno">13523</span>&#160;    VMA_ASSERT(0);</div>
+<div class="line"><a name="l13524"></a><span class="lineno">13524</span>&#160;}</div>
+<div class="line"><a name="l13525"></a><span class="lineno">13525</span>&#160; </div>
+<div class="line"><a name="l13526"></a><span class="lineno">13526</span>&#160;<span class="keywordtype">void</span> VmaBlockVector::IncrementallySortBlocks()</div>
+<div class="line"><a name="l13527"></a><span class="lineno">13527</span>&#160;{</div>
+<div class="line"><a name="l13528"></a><span class="lineno">13528</span>&#160;    <span class="keywordflow">if</span>(m_Algorithm != <a class="code" href="vk__mem__alloc_8h.html#a9a7c45f9c863695d98c83fa5ac940fe7a13c8a444197c67866be9cb05599fc726">VMA_POOL_CREATE_LINEAR_ALGORITHM_BIT</a>)</div>
+<div class="line"><a name="l13529"></a><span class="lineno">13529</span>&#160;    {</div>
+<div class="line"><a name="l13530"></a><span class="lineno">13530</span>&#160;        <span class="comment">// Bubble sort only until first swap.</span></div>
+<div class="line"><a name="l13531"></a><span class="lineno">13531</span>&#160;        <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> i = 1; i &lt; m_Blocks.size(); ++i)</div>
+<div class="line"><a name="l13532"></a><span class="lineno">13532</span>&#160;        {</div>
+<div class="line"><a name="l13533"></a><span class="lineno">13533</span>&#160;            <span class="keywordflow">if</span>(m_Blocks[i - 1]-&gt;m_pMetadata-&gt;GetSumFreeSize() &gt; m_Blocks[i]-&gt;m_pMetadata-&gt;GetSumFreeSize())</div>
 <div class="line"><a name="l13534"></a><span class="lineno">13534</span>&#160;            {</div>
-<div class="line"><a name="l13535"></a><span class="lineno">13535</span>&#160;                maxGpuBytesToMove -= bytesMoved;</div>
-<div class="line"><a name="l13536"></a><span class="lineno">13536</span>&#160;                maxGpuAllocationsToMove -= allocationsMoved;</div>
+<div class="line"><a name="l13535"></a><span class="lineno">13535</span>&#160;                VMA_SWAP(m_Blocks[i - 1], m_Blocks[i]);</div>
+<div class="line"><a name="l13536"></a><span class="lineno">13536</span>&#160;                <span class="keywordflow">return</span>;</div>
 <div class="line"><a name="l13537"></a><span class="lineno">13537</span>&#160;            }</div>
-<div class="line"><a name="l13538"></a><span class="lineno">13538</span>&#160;            <span class="keywordflow">else</span></div>
-<div class="line"><a name="l13539"></a><span class="lineno">13539</span>&#160;            {</div>
-<div class="line"><a name="l13540"></a><span class="lineno">13540</span>&#160;                maxCpuBytesToMove -= bytesMoved;</div>
-<div class="line"><a name="l13541"></a><span class="lineno">13541</span>&#160;                maxCpuAllocationsToMove -= allocationsMoved;</div>
-<div class="line"><a name="l13542"></a><span class="lineno">13542</span>&#160;            }</div>
-<div class="line"><a name="l13543"></a><span class="lineno">13543</span>&#160;        }</div>
-<div class="line"><a name="l13544"></a><span class="lineno">13544</span>&#160; </div>
-<div class="line"><a name="l13545"></a><span class="lineno">13545</span>&#160;        <span class="keywordflow">if</span>(flags &amp; <a class="code" href="vk__mem__alloc_8h.html#a6552a65b71d16f378c6994b3ceaef50ca31af49446af2459284a568ce2f3fdd33">VMA_DEFRAGMENTATION_FLAG_INCREMENTAL</a>)</div>
-<div class="line"><a name="l13546"></a><span class="lineno">13546</span>&#160;        {</div>
-<div class="line"><a name="l13547"></a><span class="lineno">13547</span>&#160;            <span class="keywordflow">if</span>(m_hAllocator-&gt;m_UseMutex)</div>
-<div class="line"><a name="l13548"></a><span class="lineno">13548</span>&#160;                m_Mutex.UnlockWrite();</div>
-<div class="line"><a name="l13549"></a><span class="lineno">13549</span>&#160;            </div>
-<div class="line"><a name="l13550"></a><span class="lineno">13550</span>&#160;            <span class="keywordflow">if</span>(pCtx-&gt;res &gt;= VK_SUCCESS &amp;&amp; !pCtx-&gt;defragmentationMoves.empty())</div>
-<div class="line"><a name="l13551"></a><span class="lineno">13551</span>&#160;                pCtx-&gt;res = VK_NOT_READY;</div>
-<div class="line"><a name="l13552"></a><span class="lineno">13552</span>&#160; </div>
-<div class="line"><a name="l13553"></a><span class="lineno">13553</span>&#160;            <span class="keywordflow">return</span>;</div>
-<div class="line"><a name="l13554"></a><span class="lineno">13554</span>&#160;        }</div>
-<div class="line"><a name="l13555"></a><span class="lineno">13555</span>&#160;    </div>
-<div class="line"><a name="l13556"></a><span class="lineno">13556</span>&#160;        <span class="keywordflow">if</span>(pCtx-&gt;res &gt;= VK_SUCCESS)</div>
-<div class="line"><a name="l13557"></a><span class="lineno">13557</span>&#160;        {</div>
-<div class="line"><a name="l13558"></a><span class="lineno">13558</span>&#160;            <span class="keywordflow">if</span>(defragmentOnGpu)</div>
-<div class="line"><a name="l13559"></a><span class="lineno">13559</span>&#160;            {</div>
-<div class="line"><a name="l13560"></a><span class="lineno">13560</span>&#160;                ApplyDefragmentationMovesGpu(pCtx, pCtx-&gt;defragmentationMoves, commandBuffer);</div>
-<div class="line"><a name="l13561"></a><span class="lineno">13561</span>&#160;            }</div>
-<div class="line"><a name="l13562"></a><span class="lineno">13562</span>&#160;            <span class="keywordflow">else</span></div>
-<div class="line"><a name="l13563"></a><span class="lineno">13563</span>&#160;            {</div>
-<div class="line"><a name="l13564"></a><span class="lineno">13564</span>&#160;                ApplyDefragmentationMovesCpu(pCtx, pCtx-&gt;defragmentationMoves);</div>
-<div class="line"><a name="l13565"></a><span class="lineno">13565</span>&#160;            }</div>
-<div class="line"><a name="l13566"></a><span class="lineno">13566</span>&#160;        }</div>
-<div class="line"><a name="l13567"></a><span class="lineno">13567</span>&#160;    }</div>
-<div class="line"><a name="l13568"></a><span class="lineno">13568</span>&#160;}</div>
-<div class="line"><a name="l13569"></a><span class="lineno">13569</span>&#160; </div>
-<div class="line"><a name="l13570"></a><span class="lineno">13570</span>&#160;<span class="keywordtype">void</span> VmaBlockVector::DefragmentationEnd(</div>
-<div class="line"><a name="l13571"></a><span class="lineno">13571</span>&#160;    <span class="keyword">class</span> VmaBlockVectorDefragmentationContext* pCtx,</div>
-<div class="line"><a name="l13572"></a><span class="lineno">13572</span>&#160;    uint32_t flags,</div>
-<div class="line"><a name="l13573"></a><span class="lineno">13573</span>&#160;    <a class="code" href="struct_vma_defragmentation_stats.html">VmaDefragmentationStats</a>* pStats)</div>
-<div class="line"><a name="l13574"></a><span class="lineno">13574</span>&#160;{</div>
-<div class="line"><a name="l13575"></a><span class="lineno">13575</span>&#160;    <span class="keywordflow">if</span>(flags &amp; <a class="code" href="vk__mem__alloc_8h.html#a6552a65b71d16f378c6994b3ceaef50ca31af49446af2459284a568ce2f3fdd33">VMA_DEFRAGMENTATION_FLAG_INCREMENTAL</a> &amp;&amp; m_hAllocator-&gt;m_UseMutex)</div>
-<div class="line"><a name="l13576"></a><span class="lineno">13576</span>&#160;    {</div>
-<div class="line"><a name="l13577"></a><span class="lineno">13577</span>&#160;        VMA_ASSERT(pCtx-&gt;mutexLocked == <span class="keyword">false</span>);</div>
-<div class="line"><a name="l13578"></a><span class="lineno">13578</span>&#160; </div>
-<div class="line"><a name="l13579"></a><span class="lineno">13579</span>&#160;        <span class="comment">// Incremental defragmentation doesn&#39;t hold the lock, so when we enter here we don&#39;t actually have any</span></div>
-<div class="line"><a name="l13580"></a><span class="lineno">13580</span>&#160;        <span class="comment">// lock protecting us. Since we mutate state here, we have to take the lock out now</span></div>
-<div class="line"><a name="l13581"></a><span class="lineno">13581</span>&#160;        m_Mutex.LockWrite();</div>
-<div class="line"><a name="l13582"></a><span class="lineno">13582</span>&#160;        pCtx-&gt;mutexLocked = <span class="keyword">true</span>;</div>
-<div class="line"><a name="l13583"></a><span class="lineno">13583</span>&#160;    }</div>
-<div class="line"><a name="l13584"></a><span class="lineno">13584</span>&#160; </div>
-<div class="line"><a name="l13585"></a><span class="lineno">13585</span>&#160;    <span class="comment">// If the mutex isn&#39;t locked we didn&#39;t do any work and there is nothing to delete.</span></div>
-<div class="line"><a name="l13586"></a><span class="lineno">13586</span>&#160;    <span class="keywordflow">if</span>(pCtx-&gt;mutexLocked || !m_hAllocator-&gt;m_UseMutex)</div>
-<div class="line"><a name="l13587"></a><span class="lineno">13587</span>&#160;    {</div>
-<div class="line"><a name="l13588"></a><span class="lineno">13588</span>&#160;        <span class="comment">// Destroy buffers.</span></div>
-<div class="line"><a name="l13589"></a><span class="lineno">13589</span>&#160;        <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> blockIndex = pCtx-&gt;blockContexts.size(); blockIndex--;)</div>
-<div class="line"><a name="l13590"></a><span class="lineno">13590</span>&#160;        {</div>
-<div class="line"><a name="l13591"></a><span class="lineno">13591</span>&#160;            VmaBlockDefragmentationContext &amp;blockCtx = pCtx-&gt;blockContexts[blockIndex];</div>
-<div class="line"><a name="l13592"></a><span class="lineno">13592</span>&#160;            <span class="keywordflow">if</span>(blockCtx.hBuffer)</div>
-<div class="line"><a name="l13593"></a><span class="lineno">13593</span>&#160;            {</div>
-<div class="line"><a name="l13594"></a><span class="lineno">13594</span>&#160;                (*m_hAllocator-&gt;GetVulkanFunctions().vkDestroyBuffer)(m_hAllocator-&gt;m_hDevice, blockCtx.hBuffer, m_hAllocator-&gt;GetAllocationCallbacks());</div>
-<div class="line"><a name="l13595"></a><span class="lineno">13595</span>&#160;            }</div>
-<div class="line"><a name="l13596"></a><span class="lineno">13596</span>&#160;        }</div>
-<div class="line"><a name="l13597"></a><span class="lineno">13597</span>&#160; </div>
-<div class="line"><a name="l13598"></a><span class="lineno">13598</span>&#160;        <span class="keywordflow">if</span>(pCtx-&gt;res &gt;= VK_SUCCESS)</div>
+<div class="line"><a name="l13538"></a><span class="lineno">13538</span>&#160;        }</div>
+<div class="line"><a name="l13539"></a><span class="lineno">13539</span>&#160;    }</div>
+<div class="line"><a name="l13540"></a><span class="lineno">13540</span>&#160;}</div>
+<div class="line"><a name="l13541"></a><span class="lineno">13541</span>&#160; </div>
+<div class="line"><a name="l13542"></a><span class="lineno">13542</span>&#160;VkResult VmaBlockVector::AllocateFromBlock(</div>
+<div class="line"><a name="l13543"></a><span class="lineno">13543</span>&#160;    VmaDeviceMemoryBlock* pBlock,</div>
+<div class="line"><a name="l13544"></a><span class="lineno">13544</span>&#160;    uint32_t currentFrameIndex,</div>
+<div class="line"><a name="l13545"></a><span class="lineno">13545</span>&#160;    VkDeviceSize size,</div>
+<div class="line"><a name="l13546"></a><span class="lineno">13546</span>&#160;    VkDeviceSize alignment,</div>
+<div class="line"><a name="l13547"></a><span class="lineno">13547</span>&#160;    <a class="code" href="vk__mem__alloc_8h.html#a5225e5e11f8376f6a31a1791f3d6e817">VmaAllocationCreateFlags</a> allocFlags,</div>
+<div class="line"><a name="l13548"></a><span class="lineno">13548</span>&#160;    <span class="keywordtype">void</span>* pUserData,</div>
+<div class="line"><a name="l13549"></a><span class="lineno">13549</span>&#160;    VmaSuballocationType suballocType,</div>
+<div class="line"><a name="l13550"></a><span class="lineno">13550</span>&#160;    uint32_t strategy,</div>
+<div class="line"><a name="l13551"></a><span class="lineno">13551</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a>* pAllocation)</div>
+<div class="line"><a name="l13552"></a><span class="lineno">13552</span>&#160;{</div>
+<div class="line"><a name="l13553"></a><span class="lineno">13553</span>&#160;    VMA_ASSERT((allocFlags &amp; <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a68686d0ce9beb0d4d1b9f2b8b1389a7e">VMA_ALLOCATION_CREATE_CAN_MAKE_OTHER_LOST_BIT</a>) == 0);</div>
+<div class="line"><a name="l13554"></a><span class="lineno">13554</span>&#160;    <span class="keyword">const</span> <span class="keywordtype">bool</span> isUpperAddress = (allocFlags &amp; <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a42ba3a2d2c7117953210b7c3ef8da0df">VMA_ALLOCATION_CREATE_UPPER_ADDRESS_BIT</a>) != 0;</div>
+<div class="line"><a name="l13555"></a><span class="lineno">13555</span>&#160;    <span class="keyword">const</span> <span class="keywordtype">bool</span> mapped = (allocFlags &amp; <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a11da372cc3a82931c5e5d6146cd9dd1f">VMA_ALLOCATION_CREATE_MAPPED_BIT</a>) != 0;</div>
+<div class="line"><a name="l13556"></a><span class="lineno">13556</span>&#160;    <span class="keyword">const</span> <span class="keywordtype">bool</span> isUserDataString = (allocFlags &amp; <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597aa6f24f821cd6a7c5e4a443f7bf59c520">VMA_ALLOCATION_CREATE_USER_DATA_COPY_STRING_BIT</a>) != 0;</div>
+<div class="line"><a name="l13557"></a><span class="lineno">13557</span>&#160; </div>
+<div class="line"><a name="l13558"></a><span class="lineno">13558</span>&#160;    VmaAllocationRequest currRequest = {};</div>
+<div class="line"><a name="l13559"></a><span class="lineno">13559</span>&#160;    <span class="keywordflow">if</span>(pBlock-&gt;m_pMetadata-&gt;CreateAllocationRequest(</div>
+<div class="line"><a name="l13560"></a><span class="lineno">13560</span>&#160;        currentFrameIndex,</div>
+<div class="line"><a name="l13561"></a><span class="lineno">13561</span>&#160;        m_FrameInUseCount,</div>
+<div class="line"><a name="l13562"></a><span class="lineno">13562</span>&#160;        m_BufferImageGranularity,</div>
+<div class="line"><a name="l13563"></a><span class="lineno">13563</span>&#160;        size,</div>
+<div class="line"><a name="l13564"></a><span class="lineno">13564</span>&#160;        alignment,</div>
+<div class="line"><a name="l13565"></a><span class="lineno">13565</span>&#160;        isUpperAddress,</div>
+<div class="line"><a name="l13566"></a><span class="lineno">13566</span>&#160;        suballocType,</div>
+<div class="line"><a name="l13567"></a><span class="lineno">13567</span>&#160;        <span class="keyword">false</span>, <span class="comment">// canMakeOtherLost</span></div>
+<div class="line"><a name="l13568"></a><span class="lineno">13568</span>&#160;        strategy,</div>
+<div class="line"><a name="l13569"></a><span class="lineno">13569</span>&#160;        &amp;currRequest))</div>
+<div class="line"><a name="l13570"></a><span class="lineno">13570</span>&#160;    {</div>
+<div class="line"><a name="l13571"></a><span class="lineno">13571</span>&#160;        <span class="comment">// Allocate from pCurrBlock.</span></div>
+<div class="line"><a name="l13572"></a><span class="lineno">13572</span>&#160;        VMA_ASSERT(currRequest.itemsToMakeLostCount == 0);</div>
+<div class="line"><a name="l13573"></a><span class="lineno">13573</span>&#160; </div>
+<div class="line"><a name="l13574"></a><span class="lineno">13574</span>&#160;        <span class="keywordflow">if</span>(mapped)</div>
+<div class="line"><a name="l13575"></a><span class="lineno">13575</span>&#160;        {</div>
+<div class="line"><a name="l13576"></a><span class="lineno">13576</span>&#160;            VkResult res = pBlock-&gt;Map(m_hAllocator, 1, VMA_NULL);</div>
+<div class="line"><a name="l13577"></a><span class="lineno">13577</span>&#160;            <span class="keywordflow">if</span>(res != VK_SUCCESS)</div>
+<div class="line"><a name="l13578"></a><span class="lineno">13578</span>&#160;            {</div>
+<div class="line"><a name="l13579"></a><span class="lineno">13579</span>&#160;                <span class="keywordflow">return</span> res;</div>
+<div class="line"><a name="l13580"></a><span class="lineno">13580</span>&#160;            }</div>
+<div class="line"><a name="l13581"></a><span class="lineno">13581</span>&#160;        }</div>
+<div class="line"><a name="l13582"></a><span class="lineno">13582</span>&#160; </div>
+<div class="line"><a name="l13583"></a><span class="lineno">13583</span>&#160;        *pAllocation = m_hAllocator-&gt;m_AllocationObjectAllocator.Allocate(currentFrameIndex, isUserDataString);</div>
+<div class="line"><a name="l13584"></a><span class="lineno">13584</span>&#160;        pBlock-&gt;m_pMetadata-&gt;Alloc(currRequest, suballocType, size, *pAllocation);</div>
+<div class="line"><a name="l13585"></a><span class="lineno">13585</span>&#160;        UpdateHasEmptyBlock();</div>
+<div class="line"><a name="l13586"></a><span class="lineno">13586</span>&#160;        (*pAllocation)-&gt;InitBlockAllocation(</div>
+<div class="line"><a name="l13587"></a><span class="lineno">13587</span>&#160;            pBlock,</div>
+<div class="line"><a name="l13588"></a><span class="lineno">13588</span>&#160;            currRequest.offset,</div>
+<div class="line"><a name="l13589"></a><span class="lineno">13589</span>&#160;            alignment,</div>
+<div class="line"><a name="l13590"></a><span class="lineno">13590</span>&#160;            size,</div>
+<div class="line"><a name="l13591"></a><span class="lineno">13591</span>&#160;            m_MemoryTypeIndex,</div>
+<div class="line"><a name="l13592"></a><span class="lineno">13592</span>&#160;            suballocType,</div>
+<div class="line"><a name="l13593"></a><span class="lineno">13593</span>&#160;            mapped,</div>
+<div class="line"><a name="l13594"></a><span class="lineno">13594</span>&#160;            (allocFlags &amp; <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a5f436af6c8fe8540573a6d22627a6fd2">VMA_ALLOCATION_CREATE_CAN_BECOME_LOST_BIT</a>) != 0);</div>
+<div class="line"><a name="l13595"></a><span class="lineno">13595</span>&#160;        VMA_HEAVY_ASSERT(pBlock-&gt;Validate());</div>
+<div class="line"><a name="l13596"></a><span class="lineno">13596</span>&#160;        (*pAllocation)-&gt;SetUserData(m_hAllocator, pUserData);</div>
+<div class="line"><a name="l13597"></a><span class="lineno">13597</span>&#160;        m_hAllocator-&gt;m_Budget.AddAllocation(m_hAllocator-&gt;MemoryTypeIndexToHeapIndex(m_MemoryTypeIndex), size);</div>
+<div class="line"><a name="l13598"></a><span class="lineno">13598</span>&#160;        <span class="keywordflow">if</span>(VMA_DEBUG_INITIALIZE_ALLOCATIONS)</div>
 <div class="line"><a name="l13599"></a><span class="lineno">13599</span>&#160;        {</div>
-<div class="line"><a name="l13600"></a><span class="lineno">13600</span>&#160;            FreeEmptyBlocks(pStats);</div>
+<div class="line"><a name="l13600"></a><span class="lineno">13600</span>&#160;            m_hAllocator-&gt;FillAllocation(*pAllocation, VMA_ALLOCATION_FILL_PATTERN_CREATED);</div>
 <div class="line"><a name="l13601"></a><span class="lineno">13601</span>&#160;        }</div>
-<div class="line"><a name="l13602"></a><span class="lineno">13602</span>&#160;    }</div>
-<div class="line"><a name="l13603"></a><span class="lineno">13603</span>&#160; </div>
-<div class="line"><a name="l13604"></a><span class="lineno">13604</span>&#160;    <span class="keywordflow">if</span>(pCtx-&gt;mutexLocked)</div>
-<div class="line"><a name="l13605"></a><span class="lineno">13605</span>&#160;    {</div>
-<div class="line"><a name="l13606"></a><span class="lineno">13606</span>&#160;        VMA_ASSERT(m_hAllocator-&gt;m_UseMutex);</div>
-<div class="line"><a name="l13607"></a><span class="lineno">13607</span>&#160;        m_Mutex.UnlockWrite();</div>
+<div class="line"><a name="l13602"></a><span class="lineno">13602</span>&#160;        <span class="keywordflow">if</span>(IsCorruptionDetectionEnabled())</div>
+<div class="line"><a name="l13603"></a><span class="lineno">13603</span>&#160;        {</div>
+<div class="line"><a name="l13604"></a><span class="lineno">13604</span>&#160;            VkResult res = pBlock-&gt;WriteMagicValueAroundAllocation(m_hAllocator, currRequest.offset, size);</div>
+<div class="line"><a name="l13605"></a><span class="lineno">13605</span>&#160;            VMA_ASSERT(res == VK_SUCCESS &amp;&amp; <span class="stringliteral">&quot;Couldn&#39;t map block memory to write magic value.&quot;</span>);</div>
+<div class="line"><a name="l13606"></a><span class="lineno">13606</span>&#160;        }</div>
+<div class="line"><a name="l13607"></a><span class="lineno">13607</span>&#160;        <span class="keywordflow">return</span> VK_SUCCESS;</div>
 <div class="line"><a name="l13608"></a><span class="lineno">13608</span>&#160;    }</div>
-<div class="line"><a name="l13609"></a><span class="lineno">13609</span>&#160;}</div>
-<div class="line"><a name="l13610"></a><span class="lineno">13610</span>&#160; </div>
-<div class="line"><a name="l13611"></a><span class="lineno">13611</span>&#160;uint32_t VmaBlockVector::ProcessDefragmentations(</div>
-<div class="line"><a name="l13612"></a><span class="lineno">13612</span>&#160;    <span class="keyword">class</span> VmaBlockVectorDefragmentationContext *pCtx,</div>
-<div class="line"><a name="l13613"></a><span class="lineno">13613</span>&#160;    <a class="code" href="struct_vma_defragmentation_pass_move_info.html">VmaDefragmentationPassMoveInfo</a>* pMove, uint32_t maxMoves)</div>
-<div class="line"><a name="l13614"></a><span class="lineno">13614</span>&#160;{</div>
-<div class="line"><a name="l13615"></a><span class="lineno">13615</span>&#160;    VmaMutexLockWrite lock(m_Mutex, m_hAllocator-&gt;m_UseMutex);</div>
-<div class="line"><a name="l13616"></a><span class="lineno">13616</span>&#160;    </div>
-<div class="line"><a name="l13617"></a><span class="lineno">13617</span>&#160;    <span class="keyword">const</span> uint32_t moveCount = std::min(uint32_t(pCtx-&gt;defragmentationMoves.size()) - pCtx-&gt;defragmentationMovesProcessed, maxMoves);</div>
-<div class="line"><a name="l13618"></a><span class="lineno">13618</span>&#160; </div>
-<div class="line"><a name="l13619"></a><span class="lineno">13619</span>&#160;    <span class="keywordflow">for</span>(uint32_t i = 0; i &lt; moveCount; ++ i)</div>
-<div class="line"><a name="l13620"></a><span class="lineno">13620</span>&#160;    {</div>
-<div class="line"><a name="l13621"></a><span class="lineno">13621</span>&#160;        VmaDefragmentationMove&amp; move = pCtx-&gt;defragmentationMoves[pCtx-&gt;defragmentationMovesProcessed + i];</div>
-<div class="line"><a name="l13622"></a><span class="lineno">13622</span>&#160; </div>
-<div class="line"><a name="l13623"></a><span class="lineno">13623</span>&#160;        pMove-&gt;<a class="code" href="struct_vma_defragmentation_pass_move_info.html#ae885c861c2dd8d622e6c19e281d035cc">allocation</a> = move.hAllocation;</div>
-<div class="line"><a name="l13624"></a><span class="lineno">13624</span>&#160;        pMove-&gt;<a class="code" href="struct_vma_defragmentation_pass_move_info.html#a06eb0c8690aa0d3478a036753492e769">memory</a> = move.pDstBlock-&gt;GetDeviceMemory();</div>
-<div class="line"><a name="l13625"></a><span class="lineno">13625</span>&#160;        pMove-&gt;<a class="code" href="struct_vma_defragmentation_pass_move_info.html#a8ab4508bc03625b0653c880576be96c6">offset</a> = move.dstOffset;</div>
-<div class="line"><a name="l13626"></a><span class="lineno">13626</span>&#160; </div>
-<div class="line"><a name="l13627"></a><span class="lineno">13627</span>&#160;        ++ pMove;</div>
-<div class="line"><a name="l13628"></a><span class="lineno">13628</span>&#160;    }</div>
-<div class="line"><a name="l13629"></a><span class="lineno">13629</span>&#160; </div>
-<div class="line"><a name="l13630"></a><span class="lineno">13630</span>&#160;    pCtx-&gt;defragmentationMovesProcessed += moveCount;</div>
-<div class="line"><a name="l13631"></a><span class="lineno">13631</span>&#160; </div>
-<div class="line"><a name="l13632"></a><span class="lineno">13632</span>&#160;    <span class="keywordflow">return</span> moveCount;</div>
-<div class="line"><a name="l13633"></a><span class="lineno">13633</span>&#160;}</div>
-<div class="line"><a name="l13634"></a><span class="lineno">13634</span>&#160; </div>
-<div class="line"><a name="l13635"></a><span class="lineno">13635</span>&#160;<span class="keywordtype">void</span> VmaBlockVector::CommitDefragmentations(</div>
-<div class="line"><a name="l13636"></a><span class="lineno">13636</span>&#160;    <span class="keyword">class</span> VmaBlockVectorDefragmentationContext *pCtx,</div>
-<div class="line"><a name="l13637"></a><span class="lineno">13637</span>&#160;    <a class="code" href="struct_vma_defragmentation_stats.html">VmaDefragmentationStats</a>* pStats)</div>
-<div class="line"><a name="l13638"></a><span class="lineno">13638</span>&#160;{</div>
-<div class="line"><a name="l13639"></a><span class="lineno">13639</span>&#160;    VmaMutexLockWrite lock(m_Mutex, m_hAllocator-&gt;m_UseMutex);</div>
-<div class="line"><a name="l13640"></a><span class="lineno">13640</span>&#160;    </div>
-<div class="line"><a name="l13641"></a><span class="lineno">13641</span>&#160;    <span class="keywordflow">for</span>(uint32_t i = pCtx-&gt;defragmentationMovesCommitted; i &lt; pCtx-&gt;defragmentationMovesProcessed; ++ i)</div>
-<div class="line"><a name="l13642"></a><span class="lineno">13642</span>&#160;    {</div>
-<div class="line"><a name="l13643"></a><span class="lineno">13643</span>&#160;        <span class="keyword">const</span> VmaDefragmentationMove &amp;move = pCtx-&gt;defragmentationMoves[i];</div>
-<div class="line"><a name="l13644"></a><span class="lineno">13644</span>&#160; </div>
-<div class="line"><a name="l13645"></a><span class="lineno">13645</span>&#160;        move.pSrcBlock-&gt;m_pMetadata-&gt;FreeAtOffset(move.srcOffset);</div>
-<div class="line"><a name="l13646"></a><span class="lineno">13646</span>&#160;        move.hAllocation-&gt;ChangeBlockAllocation(m_hAllocator, move.pDstBlock, move.dstOffset);</div>
-<div class="line"><a name="l13647"></a><span class="lineno">13647</span>&#160;    }</div>
-<div class="line"><a name="l13648"></a><span class="lineno">13648</span>&#160; </div>
-<div class="line"><a name="l13649"></a><span class="lineno">13649</span>&#160;    pCtx-&gt;defragmentationMovesCommitted = pCtx-&gt;defragmentationMovesProcessed;</div>
-<div class="line"><a name="l13650"></a><span class="lineno">13650</span>&#160;    FreeEmptyBlocks(pStats);</div>
-<div class="line"><a name="l13651"></a><span class="lineno">13651</span>&#160;}</div>
-<div class="line"><a name="l13652"></a><span class="lineno">13652</span>&#160; </div>
-<div class="line"><a name="l13653"></a><span class="lineno">13653</span>&#160;<span class="keywordtype">size_t</span> VmaBlockVector::CalcAllocationCount()<span class="keyword"> const</span></div>
-<div class="line"><a name="l13654"></a><span class="lineno">13654</span>&#160;<span class="keyword"></span>{</div>
-<div class="line"><a name="l13655"></a><span class="lineno">13655</span>&#160;    <span class="keywordtype">size_t</span> result = 0;</div>
-<div class="line"><a name="l13656"></a><span class="lineno">13656</span>&#160;    <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> i = 0; i &lt; m_Blocks.size(); ++i)</div>
-<div class="line"><a name="l13657"></a><span class="lineno">13657</span>&#160;    {</div>
-<div class="line"><a name="l13658"></a><span class="lineno">13658</span>&#160;        result += m_Blocks[i]-&gt;m_pMetadata-&gt;GetAllocationCount();</div>
-<div class="line"><a name="l13659"></a><span class="lineno">13659</span>&#160;    }</div>
-<div class="line"><a name="l13660"></a><span class="lineno">13660</span>&#160;    <span class="keywordflow">return</span> result;</div>
-<div class="line"><a name="l13661"></a><span class="lineno">13661</span>&#160;}</div>
+<div class="line"><a name="l13609"></a><span class="lineno">13609</span>&#160;    <span class="keywordflow">return</span> VK_ERROR_OUT_OF_DEVICE_MEMORY;</div>
+<div class="line"><a name="l13610"></a><span class="lineno">13610</span>&#160;}</div>
+<div class="line"><a name="l13611"></a><span class="lineno">13611</span>&#160; </div>
+<div class="line"><a name="l13612"></a><span class="lineno">13612</span>&#160;VkResult VmaBlockVector::CreateBlock(VkDeviceSize blockSize, <span class="keywordtype">size_t</span>* pNewBlockIndex)</div>
+<div class="line"><a name="l13613"></a><span class="lineno">13613</span>&#160;{</div>
+<div class="line"><a name="l13614"></a><span class="lineno">13614</span>&#160;    VkMemoryAllocateInfo allocInfo = { VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO };</div>
+<div class="line"><a name="l13615"></a><span class="lineno">13615</span>&#160;    allocInfo.memoryTypeIndex = m_MemoryTypeIndex;</div>
+<div class="line"><a name="l13616"></a><span class="lineno">13616</span>&#160;    allocInfo.allocationSize = blockSize;</div>
+<div class="line"><a name="l13617"></a><span class="lineno">13617</span>&#160; </div>
+<div class="line"><a name="l13618"></a><span class="lineno">13618</span>&#160;<span class="preprocessor">#if VMA_BUFFER_DEVICE_ADDRESS</span></div>
+<div class="line"><a name="l13619"></a><span class="lineno">13619</span>&#160;    <span class="comment">// Every standalone block can potentially contain a buffer with VK_BUFFER_USAGE_SHADER_DEVICE_ADDRESS_BIT - always enable the feature.</span></div>
+<div class="line"><a name="l13620"></a><span class="lineno">13620</span>&#160;    VkMemoryAllocateFlagsInfoKHR allocFlagsInfo = { VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_FLAGS_INFO_KHR };</div>
+<div class="line"><a name="l13621"></a><span class="lineno">13621</span>&#160;    <span class="keywordflow">if</span>(m_hAllocator-&gt;m_UseKhrBufferDeviceAddress)</div>
+<div class="line"><a name="l13622"></a><span class="lineno">13622</span>&#160;    {</div>
+<div class="line"><a name="l13623"></a><span class="lineno">13623</span>&#160;        allocFlagsInfo.flags = VK_MEMORY_ALLOCATE_DEVICE_ADDRESS_BIT_KHR;</div>
+<div class="line"><a name="l13624"></a><span class="lineno">13624</span>&#160;        VmaPnextChainPushFront(&amp;allocInfo, &amp;allocFlagsInfo);</div>
+<div class="line"><a name="l13625"></a><span class="lineno">13625</span>&#160;    }</div>
+<div class="line"><a name="l13626"></a><span class="lineno">13626</span>&#160;<span class="preprocessor">#endif </span><span class="comment">// #if VMA_BUFFER_DEVICE_ADDRESS</span></div>
+<div class="line"><a name="l13627"></a><span class="lineno">13627</span>&#160; </div>
+<div class="line"><a name="l13628"></a><span class="lineno">13628</span>&#160;<span class="preprocessor">#if VMA_MEMORY_PRIORITY</span></div>
+<div class="line"><a name="l13629"></a><span class="lineno">13629</span>&#160;    VkMemoryPriorityAllocateInfoEXT priorityInfo = { VK_STRUCTURE_TYPE_MEMORY_PRIORITY_ALLOCATE_INFO_EXT };</div>
+<div class="line"><a name="l13630"></a><span class="lineno">13630</span>&#160;    <span class="keywordflow">if</span>(m_hAllocator-&gt;m_UseExtMemoryPriority)</div>
+<div class="line"><a name="l13631"></a><span class="lineno">13631</span>&#160;    {</div>
+<div class="line"><a name="l13632"></a><span class="lineno">13632</span>&#160;        priorityInfo.priority = m_Priority;</div>
+<div class="line"><a name="l13633"></a><span class="lineno">13633</span>&#160;        VmaPnextChainPushFront(&amp;allocInfo, &amp;priorityInfo);</div>
+<div class="line"><a name="l13634"></a><span class="lineno">13634</span>&#160;    }</div>
+<div class="line"><a name="l13635"></a><span class="lineno">13635</span>&#160;<span class="preprocessor">#endif </span><span class="comment">// #if VMA_MEMORY_PRIORITY</span></div>
+<div class="line"><a name="l13636"></a><span class="lineno">13636</span>&#160; </div>
+<div class="line"><a name="l13637"></a><span class="lineno">13637</span>&#160;    VkDeviceMemory mem = VK_NULL_HANDLE;</div>
+<div class="line"><a name="l13638"></a><span class="lineno">13638</span>&#160;    VkResult res = m_hAllocator-&gt;AllocateVulkanMemory(&amp;allocInfo, &amp;mem);</div>
+<div class="line"><a name="l13639"></a><span class="lineno">13639</span>&#160;    <span class="keywordflow">if</span>(res &lt; 0)</div>
+<div class="line"><a name="l13640"></a><span class="lineno">13640</span>&#160;    {</div>
+<div class="line"><a name="l13641"></a><span class="lineno">13641</span>&#160;        <span class="keywordflow">return</span> res;</div>
+<div class="line"><a name="l13642"></a><span class="lineno">13642</span>&#160;    }</div>
+<div class="line"><a name="l13643"></a><span class="lineno">13643</span>&#160; </div>
+<div class="line"><a name="l13644"></a><span class="lineno">13644</span>&#160;    <span class="comment">// New VkDeviceMemory successfully created.</span></div>
+<div class="line"><a name="l13645"></a><span class="lineno">13645</span>&#160; </div>
+<div class="line"><a name="l13646"></a><span class="lineno">13646</span>&#160;    <span class="comment">// Create new Allocation for it.</span></div>
+<div class="line"><a name="l13647"></a><span class="lineno">13647</span>&#160;    VmaDeviceMemoryBlock* <span class="keyword">const</span> pBlock = vma_new(m_hAllocator, VmaDeviceMemoryBlock)(m_hAllocator);</div>
+<div class="line"><a name="l13648"></a><span class="lineno">13648</span>&#160;    pBlock-&gt;Init(</div>
+<div class="line"><a name="l13649"></a><span class="lineno">13649</span>&#160;        m_hAllocator,</div>
+<div class="line"><a name="l13650"></a><span class="lineno">13650</span>&#160;        m_hParentPool,</div>
+<div class="line"><a name="l13651"></a><span class="lineno">13651</span>&#160;        m_MemoryTypeIndex,</div>
+<div class="line"><a name="l13652"></a><span class="lineno">13652</span>&#160;        mem,</div>
+<div class="line"><a name="l13653"></a><span class="lineno">13653</span>&#160;        allocInfo.allocationSize,</div>
+<div class="line"><a name="l13654"></a><span class="lineno">13654</span>&#160;        m_NextBlockId++,</div>
+<div class="line"><a name="l13655"></a><span class="lineno">13655</span>&#160;        m_Algorithm);</div>
+<div class="line"><a name="l13656"></a><span class="lineno">13656</span>&#160; </div>
+<div class="line"><a name="l13657"></a><span class="lineno">13657</span>&#160;    m_Blocks.push_back(pBlock);</div>
+<div class="line"><a name="l13658"></a><span class="lineno">13658</span>&#160;    <span class="keywordflow">if</span>(pNewBlockIndex != VMA_NULL)</div>
+<div class="line"><a name="l13659"></a><span class="lineno">13659</span>&#160;    {</div>
+<div class="line"><a name="l13660"></a><span class="lineno">13660</span>&#160;        *pNewBlockIndex = m_Blocks.size() - 1;</div>
+<div class="line"><a name="l13661"></a><span class="lineno">13661</span>&#160;    }</div>
 <div class="line"><a name="l13662"></a><span class="lineno">13662</span>&#160; </div>
-<div class="line"><a name="l13663"></a><span class="lineno">13663</span>&#160;<span class="keywordtype">bool</span> VmaBlockVector::IsBufferImageGranularityConflictPossible()<span class="keyword"> const</span></div>
-<div class="line"><a name="l13664"></a><span class="lineno">13664</span>&#160;<span class="keyword"></span>{</div>
-<div class="line"><a name="l13665"></a><span class="lineno">13665</span>&#160;    <span class="keywordflow">if</span>(m_BufferImageGranularity == 1)</div>
-<div class="line"><a name="l13666"></a><span class="lineno">13666</span>&#160;    {</div>
-<div class="line"><a name="l13667"></a><span class="lineno">13667</span>&#160;        <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
-<div class="line"><a name="l13668"></a><span class="lineno">13668</span>&#160;    }</div>
-<div class="line"><a name="l13669"></a><span class="lineno">13669</span>&#160;    VmaSuballocationType lastSuballocType = VMA_SUBALLOCATION_TYPE_FREE;</div>
-<div class="line"><a name="l13670"></a><span class="lineno">13670</span>&#160;    <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> i = 0, count = m_Blocks.size(); i &lt; count; ++i)</div>
-<div class="line"><a name="l13671"></a><span class="lineno">13671</span>&#160;    {</div>
-<div class="line"><a name="l13672"></a><span class="lineno">13672</span>&#160;        VmaDeviceMemoryBlock* <span class="keyword">const</span> pBlock = m_Blocks[i];</div>
-<div class="line"><a name="l13673"></a><span class="lineno">13673</span>&#160;        VMA_ASSERT(m_Algorithm == 0);</div>
-<div class="line"><a name="l13674"></a><span class="lineno">13674</span>&#160;        VmaBlockMetadata_Generic* <span class="keyword">const</span> pMetadata = (VmaBlockMetadata_Generic*)pBlock-&gt;m_pMetadata;</div>
-<div class="line"><a name="l13675"></a><span class="lineno">13675</span>&#160;        <span class="keywordflow">if</span>(pMetadata-&gt;IsBufferImageGranularityConflictPossible(m_BufferImageGranularity, lastSuballocType))</div>
-<div class="line"><a name="l13676"></a><span class="lineno">13676</span>&#160;        {</div>
-<div class="line"><a name="l13677"></a><span class="lineno">13677</span>&#160;            <span class="keywordflow">return</span> <span class="keyword">true</span>;</div>
-<div class="line"><a name="l13678"></a><span class="lineno">13678</span>&#160;        }</div>
-<div class="line"><a name="l13679"></a><span class="lineno">13679</span>&#160;    }</div>
-<div class="line"><a name="l13680"></a><span class="lineno">13680</span>&#160;    <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
-<div class="line"><a name="l13681"></a><span class="lineno">13681</span>&#160;}</div>
-<div class="line"><a name="l13682"></a><span class="lineno">13682</span>&#160; </div>
-<div class="line"><a name="l13683"></a><span class="lineno">13683</span>&#160;<span class="keywordtype">void</span> VmaBlockVector::MakePoolAllocationsLost(</div>
-<div class="line"><a name="l13684"></a><span class="lineno">13684</span>&#160;    uint32_t currentFrameIndex,</div>
-<div class="line"><a name="l13685"></a><span class="lineno">13685</span>&#160;    <span class="keywordtype">size_t</span>* pLostAllocationCount)</div>
-<div class="line"><a name="l13686"></a><span class="lineno">13686</span>&#160;{</div>
-<div class="line"><a name="l13687"></a><span class="lineno">13687</span>&#160;    VmaMutexLockWrite lock(m_Mutex, m_hAllocator-&gt;m_UseMutex);</div>
-<div class="line"><a name="l13688"></a><span class="lineno">13688</span>&#160;    <span class="keywordtype">size_t</span> lostAllocationCount = 0;</div>
-<div class="line"><a name="l13689"></a><span class="lineno">13689</span>&#160;    <span class="keywordflow">for</span>(uint32_t blockIndex = 0; blockIndex &lt; m_Blocks.size(); ++blockIndex)</div>
-<div class="line"><a name="l13690"></a><span class="lineno">13690</span>&#160;    {</div>
-<div class="line"><a name="l13691"></a><span class="lineno">13691</span>&#160;        VmaDeviceMemoryBlock* <span class="keyword">const</span> pBlock = m_Blocks[blockIndex];</div>
-<div class="line"><a name="l13692"></a><span class="lineno">13692</span>&#160;        VMA_ASSERT(pBlock);</div>
-<div class="line"><a name="l13693"></a><span class="lineno">13693</span>&#160;        lostAllocationCount += pBlock-&gt;m_pMetadata-&gt;MakeAllocationsLost(currentFrameIndex, m_FrameInUseCount);</div>
-<div class="line"><a name="l13694"></a><span class="lineno">13694</span>&#160;    }</div>
-<div class="line"><a name="l13695"></a><span class="lineno">13695</span>&#160;    <span class="keywordflow">if</span>(pLostAllocationCount != VMA_NULL)</div>
-<div class="line"><a name="l13696"></a><span class="lineno">13696</span>&#160;    {</div>
-<div class="line"><a name="l13697"></a><span class="lineno">13697</span>&#160;        *pLostAllocationCount = lostAllocationCount;</div>
-<div class="line"><a name="l13698"></a><span class="lineno">13698</span>&#160;    }</div>
-<div class="line"><a name="l13699"></a><span class="lineno">13699</span>&#160;}</div>
-<div class="line"><a name="l13700"></a><span class="lineno">13700</span>&#160; </div>
-<div class="line"><a name="l13701"></a><span class="lineno">13701</span>&#160;VkResult VmaBlockVector::CheckCorruption()</div>
-<div class="line"><a name="l13702"></a><span class="lineno">13702</span>&#160;{</div>
-<div class="line"><a name="l13703"></a><span class="lineno">13703</span>&#160;    <span class="keywordflow">if</span>(!IsCorruptionDetectionEnabled())</div>
-<div class="line"><a name="l13704"></a><span class="lineno">13704</span>&#160;    {</div>
-<div class="line"><a name="l13705"></a><span class="lineno">13705</span>&#160;        <span class="keywordflow">return</span> VK_ERROR_FEATURE_NOT_PRESENT;</div>
-<div class="line"><a name="l13706"></a><span class="lineno">13706</span>&#160;    }</div>
-<div class="line"><a name="l13707"></a><span class="lineno">13707</span>&#160; </div>
-<div class="line"><a name="l13708"></a><span class="lineno">13708</span>&#160;    VmaMutexLockRead lock(m_Mutex, m_hAllocator-&gt;m_UseMutex);</div>
-<div class="line"><a name="l13709"></a><span class="lineno">13709</span>&#160;    <span class="keywordflow">for</span>(uint32_t blockIndex = 0; blockIndex &lt; m_Blocks.size(); ++blockIndex)</div>
-<div class="line"><a name="l13710"></a><span class="lineno">13710</span>&#160;    {</div>
-<div class="line"><a name="l13711"></a><span class="lineno">13711</span>&#160;        VmaDeviceMemoryBlock* <span class="keyword">const</span> pBlock = m_Blocks[blockIndex];</div>
-<div class="line"><a name="l13712"></a><span class="lineno">13712</span>&#160;        VMA_ASSERT(pBlock);</div>
-<div class="line"><a name="l13713"></a><span class="lineno">13713</span>&#160;        VkResult res = pBlock-&gt;CheckCorruption(m_hAllocator);</div>
-<div class="line"><a name="l13714"></a><span class="lineno">13714</span>&#160;        <span class="keywordflow">if</span>(res != VK_SUCCESS)</div>
-<div class="line"><a name="l13715"></a><span class="lineno">13715</span>&#160;        {</div>
-<div class="line"><a name="l13716"></a><span class="lineno">13716</span>&#160;            <span class="keywordflow">return</span> res;</div>
-<div class="line"><a name="l13717"></a><span class="lineno">13717</span>&#160;        }</div>
-<div class="line"><a name="l13718"></a><span class="lineno">13718</span>&#160;    }</div>
-<div class="line"><a name="l13719"></a><span class="lineno">13719</span>&#160;    <span class="keywordflow">return</span> VK_SUCCESS;</div>
-<div class="line"><a name="l13720"></a><span class="lineno">13720</span>&#160;}</div>
-<div class="line"><a name="l13721"></a><span class="lineno">13721</span>&#160; </div>
-<div class="line"><a name="l13722"></a><span class="lineno">13722</span>&#160;<span class="keywordtype">void</span> VmaBlockVector::AddStats(<a class="code" href="struct_vma_stats.html">VmaStats</a>* pStats)</div>
-<div class="line"><a name="l13723"></a><span class="lineno">13723</span>&#160;{</div>
-<div class="line"><a name="l13724"></a><span class="lineno">13724</span>&#160;    <span class="keyword">const</span> uint32_t memTypeIndex = m_MemoryTypeIndex;</div>
-<div class="line"><a name="l13725"></a><span class="lineno">13725</span>&#160;    <span class="keyword">const</span> uint32_t memHeapIndex = m_hAllocator-&gt;MemoryTypeIndexToHeapIndex(memTypeIndex);</div>
-<div class="line"><a name="l13726"></a><span class="lineno">13726</span>&#160; </div>
-<div class="line"><a name="l13727"></a><span class="lineno">13727</span>&#160;    VmaMutexLockRead lock(m_Mutex, m_hAllocator-&gt;m_UseMutex);</div>
+<div class="line"><a name="l13663"></a><span class="lineno">13663</span>&#160;    <span class="keywordflow">return</span> VK_SUCCESS;</div>
+<div class="line"><a name="l13664"></a><span class="lineno">13664</span>&#160;}</div>
+<div class="line"><a name="l13665"></a><span class="lineno">13665</span>&#160; </div>
+<div class="line"><a name="l13666"></a><span class="lineno">13666</span>&#160;<span class="keywordtype">void</span> VmaBlockVector::ApplyDefragmentationMovesCpu(</div>
+<div class="line"><a name="l13667"></a><span class="lineno">13667</span>&#160;    <span class="keyword">class</span> VmaBlockVectorDefragmentationContext* pDefragCtx,</div>
+<div class="line"><a name="l13668"></a><span class="lineno">13668</span>&#160;    <span class="keyword">const</span> VmaVector&lt; VmaDefragmentationMove, VmaStlAllocator&lt;VmaDefragmentationMove&gt; &gt;&amp; moves)</div>
+<div class="line"><a name="l13669"></a><span class="lineno">13669</span>&#160;{</div>
+<div class="line"><a name="l13670"></a><span class="lineno">13670</span>&#160;    <span class="keyword">const</span> <span class="keywordtype">size_t</span> blockCount = m_Blocks.size();</div>
+<div class="line"><a name="l13671"></a><span class="lineno">13671</span>&#160;    <span class="keyword">const</span> <span class="keywordtype">bool</span> isNonCoherent = m_hAllocator-&gt;IsMemoryTypeNonCoherent(m_MemoryTypeIndex);</div>
+<div class="line"><a name="l13672"></a><span class="lineno">13672</span>&#160; </div>
+<div class="line"><a name="l13673"></a><span class="lineno">13673</span>&#160;    <span class="keyword">enum</span> BLOCK_FLAG</div>
+<div class="line"><a name="l13674"></a><span class="lineno">13674</span>&#160;    {</div>
+<div class="line"><a name="l13675"></a><span class="lineno">13675</span>&#160;        BLOCK_FLAG_USED = 0x00000001,</div>
+<div class="line"><a name="l13676"></a><span class="lineno">13676</span>&#160;        BLOCK_FLAG_MAPPED_FOR_DEFRAGMENTATION = 0x00000002,</div>
+<div class="line"><a name="l13677"></a><span class="lineno">13677</span>&#160;    };</div>
+<div class="line"><a name="l13678"></a><span class="lineno">13678</span>&#160; </div>
+<div class="line"><a name="l13679"></a><span class="lineno">13679</span>&#160;    <span class="keyword">struct </span>BlockInfo</div>
+<div class="line"><a name="l13680"></a><span class="lineno">13680</span>&#160;    {</div>
+<div class="line"><a name="l13681"></a><span class="lineno">13681</span>&#160;        uint32_t flags;</div>
+<div class="line"><a name="l13682"></a><span class="lineno">13682</span>&#160;        <span class="keywordtype">void</span>* pMappedData;</div>
+<div class="line"><a name="l13683"></a><span class="lineno">13683</span>&#160;    };</div>
+<div class="line"><a name="l13684"></a><span class="lineno">13684</span>&#160;    VmaVector&lt; BlockInfo, VmaStlAllocator&lt;BlockInfo&gt; &gt;</div>
+<div class="line"><a name="l13685"></a><span class="lineno">13685</span>&#160;        blockInfo(blockCount, BlockInfo(), VmaStlAllocator&lt;BlockInfo&gt;(m_hAllocator-&gt;GetAllocationCallbacks()));</div>
+<div class="line"><a name="l13686"></a><span class="lineno">13686</span>&#160;    memset(blockInfo.data(), 0, blockCount * <span class="keyword">sizeof</span>(BlockInfo));</div>
+<div class="line"><a name="l13687"></a><span class="lineno">13687</span>&#160; </div>
+<div class="line"><a name="l13688"></a><span class="lineno">13688</span>&#160;    <span class="comment">// Go over all moves. Mark blocks that are used with BLOCK_FLAG_USED.</span></div>
+<div class="line"><a name="l13689"></a><span class="lineno">13689</span>&#160;    <span class="keyword">const</span> <span class="keywordtype">size_t</span> moveCount = moves.size();</div>
+<div class="line"><a name="l13690"></a><span class="lineno">13690</span>&#160;    <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> moveIndex = 0; moveIndex &lt; moveCount; ++moveIndex)</div>
+<div class="line"><a name="l13691"></a><span class="lineno">13691</span>&#160;    {</div>
+<div class="line"><a name="l13692"></a><span class="lineno">13692</span>&#160;        <span class="keyword">const</span> VmaDefragmentationMove&amp; move = moves[moveIndex];</div>
+<div class="line"><a name="l13693"></a><span class="lineno">13693</span>&#160;        blockInfo[move.srcBlockIndex].flags |= BLOCK_FLAG_USED;</div>
+<div class="line"><a name="l13694"></a><span class="lineno">13694</span>&#160;        blockInfo[move.dstBlockIndex].flags |= BLOCK_FLAG_USED;</div>
+<div class="line"><a name="l13695"></a><span class="lineno">13695</span>&#160;    }</div>
+<div class="line"><a name="l13696"></a><span class="lineno">13696</span>&#160; </div>
+<div class="line"><a name="l13697"></a><span class="lineno">13697</span>&#160;    VMA_ASSERT(pDefragCtx-&gt;res == VK_SUCCESS);</div>
+<div class="line"><a name="l13698"></a><span class="lineno">13698</span>&#160; </div>
+<div class="line"><a name="l13699"></a><span class="lineno">13699</span>&#160;    <span class="comment">// Go over all blocks. Get mapped pointer or map if necessary.</span></div>
+<div class="line"><a name="l13700"></a><span class="lineno">13700</span>&#160;    <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> blockIndex = 0; pDefragCtx-&gt;res == VK_SUCCESS &amp;&amp; blockIndex &lt; blockCount; ++blockIndex)</div>
+<div class="line"><a name="l13701"></a><span class="lineno">13701</span>&#160;    {</div>
+<div class="line"><a name="l13702"></a><span class="lineno">13702</span>&#160;        BlockInfo&amp; currBlockInfo = blockInfo[blockIndex];</div>
+<div class="line"><a name="l13703"></a><span class="lineno">13703</span>&#160;        VmaDeviceMemoryBlock* pBlock = m_Blocks[blockIndex];</div>
+<div class="line"><a name="l13704"></a><span class="lineno">13704</span>&#160;        <span class="keywordflow">if</span>((currBlockInfo.flags &amp; BLOCK_FLAG_USED) != 0)</div>
+<div class="line"><a name="l13705"></a><span class="lineno">13705</span>&#160;        {</div>
+<div class="line"><a name="l13706"></a><span class="lineno">13706</span>&#160;            currBlockInfo.pMappedData = pBlock-&gt;GetMappedData();</div>
+<div class="line"><a name="l13707"></a><span class="lineno">13707</span>&#160;            <span class="comment">// It is not originally mapped - map it.</span></div>
+<div class="line"><a name="l13708"></a><span class="lineno">13708</span>&#160;            <span class="keywordflow">if</span>(currBlockInfo.pMappedData == VMA_NULL)</div>
+<div class="line"><a name="l13709"></a><span class="lineno">13709</span>&#160;            {</div>
+<div class="line"><a name="l13710"></a><span class="lineno">13710</span>&#160;                pDefragCtx-&gt;res = pBlock-&gt;Map(m_hAllocator, 1, &amp;currBlockInfo.pMappedData);</div>
+<div class="line"><a name="l13711"></a><span class="lineno">13711</span>&#160;                <span class="keywordflow">if</span>(pDefragCtx-&gt;res == VK_SUCCESS)</div>
+<div class="line"><a name="l13712"></a><span class="lineno">13712</span>&#160;                {</div>
+<div class="line"><a name="l13713"></a><span class="lineno">13713</span>&#160;                    currBlockInfo.flags |= BLOCK_FLAG_MAPPED_FOR_DEFRAGMENTATION;</div>
+<div class="line"><a name="l13714"></a><span class="lineno">13714</span>&#160;                }</div>
+<div class="line"><a name="l13715"></a><span class="lineno">13715</span>&#160;            }</div>
+<div class="line"><a name="l13716"></a><span class="lineno">13716</span>&#160;        }</div>
+<div class="line"><a name="l13717"></a><span class="lineno">13717</span>&#160;    }</div>
+<div class="line"><a name="l13718"></a><span class="lineno">13718</span>&#160; </div>
+<div class="line"><a name="l13719"></a><span class="lineno">13719</span>&#160;    <span class="comment">// Go over all moves. Do actual data transfer.</span></div>
+<div class="line"><a name="l13720"></a><span class="lineno">13720</span>&#160;    <span class="keywordflow">if</span>(pDefragCtx-&gt;res == VK_SUCCESS)</div>
+<div class="line"><a name="l13721"></a><span class="lineno">13721</span>&#160;    {</div>
+<div class="line"><a name="l13722"></a><span class="lineno">13722</span>&#160;        <span class="keyword">const</span> VkDeviceSize nonCoherentAtomSize = m_hAllocator-&gt;m_PhysicalDeviceProperties.limits.nonCoherentAtomSize;</div>
+<div class="line"><a name="l13723"></a><span class="lineno">13723</span>&#160;        VkMappedMemoryRange memRange = { VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE };</div>
+<div class="line"><a name="l13724"></a><span class="lineno">13724</span>&#160; </div>
+<div class="line"><a name="l13725"></a><span class="lineno">13725</span>&#160;        <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> moveIndex = 0; moveIndex &lt; moveCount; ++moveIndex)</div>
+<div class="line"><a name="l13726"></a><span class="lineno">13726</span>&#160;        {</div>
+<div class="line"><a name="l13727"></a><span class="lineno">13727</span>&#160;            <span class="keyword">const</span> VmaDefragmentationMove&amp; move = moves[moveIndex];</div>
 <div class="line"><a name="l13728"></a><span class="lineno">13728</span>&#160; </div>
-<div class="line"><a name="l13729"></a><span class="lineno">13729</span>&#160;    <span class="keywordflow">for</span>(uint32_t blockIndex = 0; blockIndex &lt; m_Blocks.size(); ++blockIndex)</div>
-<div class="line"><a name="l13730"></a><span class="lineno">13730</span>&#160;    {</div>
-<div class="line"><a name="l13731"></a><span class="lineno">13731</span>&#160;        <span class="keyword">const</span> VmaDeviceMemoryBlock* <span class="keyword">const</span> pBlock = m_Blocks[blockIndex];</div>
-<div class="line"><a name="l13732"></a><span class="lineno">13732</span>&#160;        VMA_ASSERT(pBlock);</div>
-<div class="line"><a name="l13733"></a><span class="lineno">13733</span>&#160;        VMA_HEAVY_ASSERT(pBlock-&gt;Validate());</div>
-<div class="line"><a name="l13734"></a><span class="lineno">13734</span>&#160;        <a class="code" href="struct_vma_stat_info.html">VmaStatInfo</a> allocationStatInfo;</div>
-<div class="line"><a name="l13735"></a><span class="lineno">13735</span>&#160;        pBlock-&gt;m_pMetadata-&gt;CalcAllocationStatInfo(allocationStatInfo);</div>
-<div class="line"><a name="l13736"></a><span class="lineno">13736</span>&#160;        VmaAddStatInfo(pStats-&gt;<a class="code" href="struct_vma_stats.html#a2e8f5b3353f2fefef3c27f29e245a1f9">total</a>, allocationStatInfo);</div>
-<div class="line"><a name="l13737"></a><span class="lineno">13737</span>&#160;        VmaAddStatInfo(pStats-&gt;<a class="code" href="struct_vma_stats.html#a13e3caf754be79352c42408756309331">memoryType</a>[memTypeIndex], allocationStatInfo);</div>
-<div class="line"><a name="l13738"></a><span class="lineno">13738</span>&#160;        VmaAddStatInfo(pStats-&gt;<a class="code" href="struct_vma_stats.html#a0e6611508c29a187f0fd14ff1a0329c0">memoryHeap</a>[memHeapIndex], allocationStatInfo);</div>
-<div class="line"><a name="l13739"></a><span class="lineno">13739</span>&#160;    }</div>
-<div class="line"><a name="l13740"></a><span class="lineno">13740</span>&#160;}</div>
-<div class="line"><a name="l13741"></a><span class="lineno">13741</span>&#160; </div>
-<div class="line"><a name="l13743"></a><span class="lineno">13743</span>&#160;<span class="comment">// VmaDefragmentationAlgorithm_Generic members definition</span></div>
-<div class="line"><a name="l13744"></a><span class="lineno">13744</span>&#160; </div>
-<div class="line"><a name="l13745"></a><span class="lineno">13745</span>&#160;VmaDefragmentationAlgorithm_Generic::VmaDefragmentationAlgorithm_Generic(</div>
-<div class="line"><a name="l13746"></a><span class="lineno">13746</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator,</div>
-<div class="line"><a name="l13747"></a><span class="lineno">13747</span>&#160;    VmaBlockVector* pBlockVector,</div>
-<div class="line"><a name="l13748"></a><span class="lineno">13748</span>&#160;    uint32_t currentFrameIndex,</div>
-<div class="line"><a name="l13749"></a><span class="lineno">13749</span>&#160;    <span class="keywordtype">bool</span> overlappingMoveSupported) :</div>
-<div class="line"><a name="l13750"></a><span class="lineno">13750</span>&#160;    VmaDefragmentationAlgorithm(hAllocator, pBlockVector, currentFrameIndex),</div>
-<div class="line"><a name="l13751"></a><span class="lineno">13751</span>&#160;    m_AllocationCount(0),</div>
-<div class="line"><a name="l13752"></a><span class="lineno">13752</span>&#160;    m_AllAllocations(false),</div>
-<div class="line"><a name="l13753"></a><span class="lineno">13753</span>&#160;    m_BytesMoved(0),</div>
-<div class="line"><a name="l13754"></a><span class="lineno">13754</span>&#160;    m_AllocationsMoved(0),</div>
-<div class="line"><a name="l13755"></a><span class="lineno">13755</span>&#160;    m_Blocks(VmaStlAllocator&lt;BlockInfo*&gt;(hAllocator-&gt;GetAllocationCallbacks()))</div>
-<div class="line"><a name="l13756"></a><span class="lineno">13756</span>&#160;{</div>
-<div class="line"><a name="l13757"></a><span class="lineno">13757</span>&#160;    <span class="comment">// Create block info for each block.</span></div>
-<div class="line"><a name="l13758"></a><span class="lineno">13758</span>&#160;    <span class="keyword">const</span> <span class="keywordtype">size_t</span> blockCount = m_pBlockVector-&gt;m_Blocks.size();</div>
-<div class="line"><a name="l13759"></a><span class="lineno">13759</span>&#160;    <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> blockIndex = 0; blockIndex &lt; blockCount; ++blockIndex)</div>
-<div class="line"><a name="l13760"></a><span class="lineno">13760</span>&#160;    {</div>
-<div class="line"><a name="l13761"></a><span class="lineno">13761</span>&#160;        BlockInfo* pBlockInfo = vma_new(m_hAllocator, BlockInfo)(m_hAllocator-&gt;GetAllocationCallbacks());</div>
-<div class="line"><a name="l13762"></a><span class="lineno">13762</span>&#160;        pBlockInfo-&gt;m_OriginalBlockIndex = blockIndex;</div>
-<div class="line"><a name="l13763"></a><span class="lineno">13763</span>&#160;        pBlockInfo-&gt;m_pBlock = m_pBlockVector-&gt;m_Blocks[blockIndex];</div>
-<div class="line"><a name="l13764"></a><span class="lineno">13764</span>&#160;        m_Blocks.push_back(pBlockInfo);</div>
-<div class="line"><a name="l13765"></a><span class="lineno">13765</span>&#160;    }</div>
-<div class="line"><a name="l13766"></a><span class="lineno">13766</span>&#160; </div>
-<div class="line"><a name="l13767"></a><span class="lineno">13767</span>&#160;    <span class="comment">// Sort them by m_pBlock pointer value.</span></div>
-<div class="line"><a name="l13768"></a><span class="lineno">13768</span>&#160;    VMA_SORT(m_Blocks.begin(), m_Blocks.end(), BlockPointerLess());</div>
-<div class="line"><a name="l13769"></a><span class="lineno">13769</span>&#160;}</div>
-<div class="line"><a name="l13770"></a><span class="lineno">13770</span>&#160; </div>
-<div class="line"><a name="l13771"></a><span class="lineno">13771</span>&#160;VmaDefragmentationAlgorithm_Generic::~VmaDefragmentationAlgorithm_Generic()</div>
-<div class="line"><a name="l13772"></a><span class="lineno">13772</span>&#160;{</div>
-<div class="line"><a name="l13773"></a><span class="lineno">13773</span>&#160;    <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> i = m_Blocks.size(); i--; )</div>
-<div class="line"><a name="l13774"></a><span class="lineno">13774</span>&#160;    {</div>
-<div class="line"><a name="l13775"></a><span class="lineno">13775</span>&#160;        vma_delete(m_hAllocator, m_Blocks[i]);</div>
-<div class="line"><a name="l13776"></a><span class="lineno">13776</span>&#160;    }</div>
-<div class="line"><a name="l13777"></a><span class="lineno">13777</span>&#160;}</div>
-<div class="line"><a name="l13778"></a><span class="lineno">13778</span>&#160; </div>
-<div class="line"><a name="l13779"></a><span class="lineno">13779</span>&#160;<span class="keywordtype">void</span> VmaDefragmentationAlgorithm_Generic::AddAllocation(<a class="code" href="struct_vma_allocation.html">VmaAllocation</a> hAlloc, VkBool32* pChanged)</div>
-<div class="line"><a name="l13780"></a><span class="lineno">13780</span>&#160;{</div>
-<div class="line"><a name="l13781"></a><span class="lineno">13781</span>&#160;    <span class="comment">// Now as we are inside VmaBlockVector::m_Mutex, we can make final check if this allocation was not lost.</span></div>
-<div class="line"><a name="l13782"></a><span class="lineno">13782</span>&#160;    <span class="keywordflow">if</span>(hAlloc-&gt;GetLastUseFrameIndex() != VMA_FRAME_INDEX_LOST)</div>
-<div class="line"><a name="l13783"></a><span class="lineno">13783</span>&#160;    {</div>
-<div class="line"><a name="l13784"></a><span class="lineno">13784</span>&#160;        VmaDeviceMemoryBlock* pBlock = hAlloc-&gt;GetBlock();</div>
-<div class="line"><a name="l13785"></a><span class="lineno">13785</span>&#160;        BlockInfoVector::iterator it = VmaBinaryFindFirstNotLess(m_Blocks.begin(), m_Blocks.end(), pBlock, BlockPointerLess());</div>
-<div class="line"><a name="l13786"></a><span class="lineno">13786</span>&#160;        <span class="keywordflow">if</span>(it != m_Blocks.end() &amp;&amp; (*it)-&gt;m_pBlock == pBlock)</div>
-<div class="line"><a name="l13787"></a><span class="lineno">13787</span>&#160;        {</div>
-<div class="line"><a name="l13788"></a><span class="lineno">13788</span>&#160;            AllocationInfo allocInfo = AllocationInfo(hAlloc, pChanged);</div>
-<div class="line"><a name="l13789"></a><span class="lineno">13789</span>&#160;            (*it)-&gt;m_Allocations.push_back(allocInfo);</div>
-<div class="line"><a name="l13790"></a><span class="lineno">13790</span>&#160;        }</div>
-<div class="line"><a name="l13791"></a><span class="lineno">13791</span>&#160;        <span class="keywordflow">else</span></div>
-<div class="line"><a name="l13792"></a><span class="lineno">13792</span>&#160;        {</div>
-<div class="line"><a name="l13793"></a><span class="lineno">13793</span>&#160;            VMA_ASSERT(0);</div>
-<div class="line"><a name="l13794"></a><span class="lineno">13794</span>&#160;        }</div>
-<div class="line"><a name="l13795"></a><span class="lineno">13795</span>&#160; </div>
-<div class="line"><a name="l13796"></a><span class="lineno">13796</span>&#160;        ++m_AllocationCount;</div>
-<div class="line"><a name="l13797"></a><span class="lineno">13797</span>&#160;    }</div>
-<div class="line"><a name="l13798"></a><span class="lineno">13798</span>&#160;}</div>
-<div class="line"><a name="l13799"></a><span class="lineno">13799</span>&#160; </div>
-<div class="line"><a name="l13800"></a><span class="lineno">13800</span>&#160;VkResult VmaDefragmentationAlgorithm_Generic::DefragmentRound(</div>
-<div class="line"><a name="l13801"></a><span class="lineno">13801</span>&#160;    VmaVector&lt; VmaDefragmentationMove, VmaStlAllocator&lt;VmaDefragmentationMove&gt; &gt;&amp; moves,</div>
-<div class="line"><a name="l13802"></a><span class="lineno">13802</span>&#160;    VkDeviceSize maxBytesToMove,</div>
-<div class="line"><a name="l13803"></a><span class="lineno">13803</span>&#160;    uint32_t maxAllocationsToMove,</div>
-<div class="line"><a name="l13804"></a><span class="lineno">13804</span>&#160;    <span class="keywordtype">bool</span> freeOldAllocations)</div>
-<div class="line"><a name="l13805"></a><span class="lineno">13805</span>&#160;{</div>
-<div class="line"><a name="l13806"></a><span class="lineno">13806</span>&#160;    <span class="keywordflow">if</span>(m_Blocks.empty())</div>
-<div class="line"><a name="l13807"></a><span class="lineno">13807</span>&#160;    {</div>
-<div class="line"><a name="l13808"></a><span class="lineno">13808</span>&#160;        <span class="keywordflow">return</span> VK_SUCCESS;</div>
-<div class="line"><a name="l13809"></a><span class="lineno">13809</span>&#160;    }</div>
+<div class="line"><a name="l13729"></a><span class="lineno">13729</span>&#160;            <span class="keyword">const</span> BlockInfo&amp; srcBlockInfo = blockInfo[move.srcBlockIndex];</div>
+<div class="line"><a name="l13730"></a><span class="lineno">13730</span>&#160;            <span class="keyword">const</span> BlockInfo&amp; dstBlockInfo = blockInfo[move.dstBlockIndex];</div>
+<div class="line"><a name="l13731"></a><span class="lineno">13731</span>&#160; </div>
+<div class="line"><a name="l13732"></a><span class="lineno">13732</span>&#160;            VMA_ASSERT(srcBlockInfo.pMappedData &amp;&amp; dstBlockInfo.pMappedData);</div>
+<div class="line"><a name="l13733"></a><span class="lineno">13733</span>&#160; </div>
+<div class="line"><a name="l13734"></a><span class="lineno">13734</span>&#160;            <span class="comment">// Invalidate source.</span></div>
+<div class="line"><a name="l13735"></a><span class="lineno">13735</span>&#160;            <span class="keywordflow">if</span>(isNonCoherent)</div>
+<div class="line"><a name="l13736"></a><span class="lineno">13736</span>&#160;            {</div>
+<div class="line"><a name="l13737"></a><span class="lineno">13737</span>&#160;                VmaDeviceMemoryBlock* <span class="keyword">const</span> pSrcBlock = m_Blocks[move.srcBlockIndex];</div>
+<div class="line"><a name="l13738"></a><span class="lineno">13738</span>&#160;                memRange.memory = pSrcBlock-&gt;GetDeviceMemory();</div>
+<div class="line"><a name="l13739"></a><span class="lineno">13739</span>&#160;                memRange.offset = VmaAlignDown(move.srcOffset, nonCoherentAtomSize);</div>
+<div class="line"><a name="l13740"></a><span class="lineno">13740</span>&#160;                memRange.size = VMA_MIN(</div>
+<div class="line"><a name="l13741"></a><span class="lineno">13741</span>&#160;                    VmaAlignUp(move.size + (move.srcOffset - memRange.offset), nonCoherentAtomSize),</div>
+<div class="line"><a name="l13742"></a><span class="lineno">13742</span>&#160;                    pSrcBlock-&gt;m_pMetadata-&gt;GetSize() - memRange.offset);</div>
+<div class="line"><a name="l13743"></a><span class="lineno">13743</span>&#160;                (*m_hAllocator-&gt;GetVulkanFunctions().vkInvalidateMappedMemoryRanges)(m_hAllocator-&gt;m_hDevice, 1, &amp;memRange);</div>
+<div class="line"><a name="l13744"></a><span class="lineno">13744</span>&#160;            }</div>
+<div class="line"><a name="l13745"></a><span class="lineno">13745</span>&#160; </div>
+<div class="line"><a name="l13746"></a><span class="lineno">13746</span>&#160;            <span class="comment">// THE PLACE WHERE ACTUAL DATA COPY HAPPENS.</span></div>
+<div class="line"><a name="l13747"></a><span class="lineno">13747</span>&#160;            memmove(</div>
+<div class="line"><a name="l13748"></a><span class="lineno">13748</span>&#160;                <span class="keyword">reinterpret_cast&lt;</span><span class="keywordtype">char</span>*<span class="keyword">&gt;</span>(dstBlockInfo.pMappedData) + move.dstOffset,</div>
+<div class="line"><a name="l13749"></a><span class="lineno">13749</span>&#160;                <span class="keyword">reinterpret_cast&lt;</span><span class="keywordtype">char</span>*<span class="keyword">&gt;</span>(srcBlockInfo.pMappedData) + move.srcOffset,</div>
+<div class="line"><a name="l13750"></a><span class="lineno">13750</span>&#160;                <span class="keyword">static_cast&lt;</span><span class="keywordtype">size_t</span><span class="keyword">&gt;</span>(move.size));</div>
+<div class="line"><a name="l13751"></a><span class="lineno">13751</span>&#160; </div>
+<div class="line"><a name="l13752"></a><span class="lineno">13752</span>&#160;            <span class="keywordflow">if</span>(IsCorruptionDetectionEnabled())</div>
+<div class="line"><a name="l13753"></a><span class="lineno">13753</span>&#160;            {</div>
+<div class="line"><a name="l13754"></a><span class="lineno">13754</span>&#160;                VmaWriteMagicValue(dstBlockInfo.pMappedData, move.dstOffset - VMA_DEBUG_MARGIN);</div>
+<div class="line"><a name="l13755"></a><span class="lineno">13755</span>&#160;                VmaWriteMagicValue(dstBlockInfo.pMappedData, move.dstOffset + move.size);</div>
+<div class="line"><a name="l13756"></a><span class="lineno">13756</span>&#160;            }</div>
+<div class="line"><a name="l13757"></a><span class="lineno">13757</span>&#160; </div>
+<div class="line"><a name="l13758"></a><span class="lineno">13758</span>&#160;            <span class="comment">// Flush destination.</span></div>
+<div class="line"><a name="l13759"></a><span class="lineno">13759</span>&#160;            <span class="keywordflow">if</span>(isNonCoherent)</div>
+<div class="line"><a name="l13760"></a><span class="lineno">13760</span>&#160;            {</div>
+<div class="line"><a name="l13761"></a><span class="lineno">13761</span>&#160;                VmaDeviceMemoryBlock* <span class="keyword">const</span> pDstBlock = m_Blocks[move.dstBlockIndex];</div>
+<div class="line"><a name="l13762"></a><span class="lineno">13762</span>&#160;                memRange.memory = pDstBlock-&gt;GetDeviceMemory();</div>
+<div class="line"><a name="l13763"></a><span class="lineno">13763</span>&#160;                memRange.offset = VmaAlignDown(move.dstOffset, nonCoherentAtomSize);</div>
+<div class="line"><a name="l13764"></a><span class="lineno">13764</span>&#160;                memRange.size = VMA_MIN(</div>
+<div class="line"><a name="l13765"></a><span class="lineno">13765</span>&#160;                    VmaAlignUp(move.size + (move.dstOffset - memRange.offset), nonCoherentAtomSize),</div>
+<div class="line"><a name="l13766"></a><span class="lineno">13766</span>&#160;                    pDstBlock-&gt;m_pMetadata-&gt;GetSize() - memRange.offset);</div>
+<div class="line"><a name="l13767"></a><span class="lineno">13767</span>&#160;                (*m_hAllocator-&gt;GetVulkanFunctions().vkFlushMappedMemoryRanges)(m_hAllocator-&gt;m_hDevice, 1, &amp;memRange);</div>
+<div class="line"><a name="l13768"></a><span class="lineno">13768</span>&#160;            }</div>
+<div class="line"><a name="l13769"></a><span class="lineno">13769</span>&#160;        }</div>
+<div class="line"><a name="l13770"></a><span class="lineno">13770</span>&#160;    }</div>
+<div class="line"><a name="l13771"></a><span class="lineno">13771</span>&#160; </div>
+<div class="line"><a name="l13772"></a><span class="lineno">13772</span>&#160;    <span class="comment">// Go over all blocks in reverse order. Unmap those that were mapped just for defragmentation.</span></div>
+<div class="line"><a name="l13773"></a><span class="lineno">13773</span>&#160;    <span class="comment">// Regardless of pCtx-&gt;res == VK_SUCCESS.</span></div>
+<div class="line"><a name="l13774"></a><span class="lineno">13774</span>&#160;    <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> blockIndex = blockCount; blockIndex--; )</div>
+<div class="line"><a name="l13775"></a><span class="lineno">13775</span>&#160;    {</div>
+<div class="line"><a name="l13776"></a><span class="lineno">13776</span>&#160;        <span class="keyword">const</span> BlockInfo&amp; currBlockInfo = blockInfo[blockIndex];</div>
+<div class="line"><a name="l13777"></a><span class="lineno">13777</span>&#160;        <span class="keywordflow">if</span>((currBlockInfo.flags &amp; BLOCK_FLAG_MAPPED_FOR_DEFRAGMENTATION) != 0)</div>
+<div class="line"><a name="l13778"></a><span class="lineno">13778</span>&#160;        {</div>
+<div class="line"><a name="l13779"></a><span class="lineno">13779</span>&#160;            VmaDeviceMemoryBlock* pBlock = m_Blocks[blockIndex];</div>
+<div class="line"><a name="l13780"></a><span class="lineno">13780</span>&#160;            pBlock-&gt;Unmap(m_hAllocator, 1);</div>
+<div class="line"><a name="l13781"></a><span class="lineno">13781</span>&#160;        }</div>
+<div class="line"><a name="l13782"></a><span class="lineno">13782</span>&#160;    }</div>
+<div class="line"><a name="l13783"></a><span class="lineno">13783</span>&#160;}</div>
+<div class="line"><a name="l13784"></a><span class="lineno">13784</span>&#160; </div>
+<div class="line"><a name="l13785"></a><span class="lineno">13785</span>&#160;<span class="keywordtype">void</span> VmaBlockVector::ApplyDefragmentationMovesGpu(</div>
+<div class="line"><a name="l13786"></a><span class="lineno">13786</span>&#160;    <span class="keyword">class</span> VmaBlockVectorDefragmentationContext* pDefragCtx,</div>
+<div class="line"><a name="l13787"></a><span class="lineno">13787</span>&#160;    VmaVector&lt; VmaDefragmentationMove, VmaStlAllocator&lt;VmaDefragmentationMove&gt; &gt;&amp; moves,</div>
+<div class="line"><a name="l13788"></a><span class="lineno">13788</span>&#160;    VkCommandBuffer commandBuffer)</div>
+<div class="line"><a name="l13789"></a><span class="lineno">13789</span>&#160;{</div>
+<div class="line"><a name="l13790"></a><span class="lineno">13790</span>&#160;    <span class="keyword">const</span> <span class="keywordtype">size_t</span> blockCount = m_Blocks.size();</div>
+<div class="line"><a name="l13791"></a><span class="lineno">13791</span>&#160; </div>
+<div class="line"><a name="l13792"></a><span class="lineno">13792</span>&#160;    pDefragCtx-&gt;blockContexts.resize(blockCount);</div>
+<div class="line"><a name="l13793"></a><span class="lineno">13793</span>&#160;    memset(pDefragCtx-&gt;blockContexts.data(), 0, blockCount * <span class="keyword">sizeof</span>(VmaBlockDefragmentationContext));</div>
+<div class="line"><a name="l13794"></a><span class="lineno">13794</span>&#160; </div>
+<div class="line"><a name="l13795"></a><span class="lineno">13795</span>&#160;    <span class="comment">// Go over all moves. Mark blocks that are used with BLOCK_FLAG_USED.</span></div>
+<div class="line"><a name="l13796"></a><span class="lineno">13796</span>&#160;    <span class="keyword">const</span> <span class="keywordtype">size_t</span> moveCount = moves.size();</div>
+<div class="line"><a name="l13797"></a><span class="lineno">13797</span>&#160;    <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> moveIndex = 0; moveIndex &lt; moveCount; ++moveIndex)</div>
+<div class="line"><a name="l13798"></a><span class="lineno">13798</span>&#160;    {</div>
+<div class="line"><a name="l13799"></a><span class="lineno">13799</span>&#160;        <span class="keyword">const</span> VmaDefragmentationMove&amp; move = moves[moveIndex];</div>
+<div class="line"><a name="l13800"></a><span class="lineno">13800</span>&#160; </div>
+<div class="line"><a name="l13801"></a><span class="lineno">13801</span>&#160;        <span class="comment">//if(move.type == VMA_ALLOCATION_TYPE_UNKNOWN)</span></div>
+<div class="line"><a name="l13802"></a><span class="lineno">13802</span>&#160;        {</div>
+<div class="line"><a name="l13803"></a><span class="lineno">13803</span>&#160;            <span class="comment">// Old school move still require us to map the whole block</span></div>
+<div class="line"><a name="l13804"></a><span class="lineno">13804</span>&#160;            pDefragCtx-&gt;blockContexts[move.srcBlockIndex].flags |= VmaBlockDefragmentationContext::BLOCK_FLAG_USED;</div>
+<div class="line"><a name="l13805"></a><span class="lineno">13805</span>&#160;            pDefragCtx-&gt;blockContexts[move.dstBlockIndex].flags |= VmaBlockDefragmentationContext::BLOCK_FLAG_USED;</div>
+<div class="line"><a name="l13806"></a><span class="lineno">13806</span>&#160;        }</div>
+<div class="line"><a name="l13807"></a><span class="lineno">13807</span>&#160;    }</div>
+<div class="line"><a name="l13808"></a><span class="lineno">13808</span>&#160; </div>
+<div class="line"><a name="l13809"></a><span class="lineno">13809</span>&#160;    VMA_ASSERT(pDefragCtx-&gt;res == VK_SUCCESS);</div>
 <div class="line"><a name="l13810"></a><span class="lineno">13810</span>&#160; </div>
-<div class="line"><a name="l13811"></a><span class="lineno">13811</span>&#160;    <span class="comment">// This is a choice based on research.</span></div>
-<div class="line"><a name="l13812"></a><span class="lineno">13812</span>&#160;    <span class="comment">// Option 1:</span></div>
-<div class="line"><a name="l13813"></a><span class="lineno">13813</span>&#160;    uint32_t strategy = <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a0729e932b7ea170e3a128cad96c5cf6d">VMA_ALLOCATION_CREATE_STRATEGY_MIN_TIME_BIT</a>;</div>
-<div class="line"><a name="l13814"></a><span class="lineno">13814</span>&#160;    <span class="comment">// Option 2:</span></div>
-<div class="line"><a name="l13815"></a><span class="lineno">13815</span>&#160;    <span class="comment">//uint32_t strategy = VMA_ALLOCATION_CREATE_STRATEGY_MIN_MEMORY_BIT;</span></div>
-<div class="line"><a name="l13816"></a><span class="lineno">13816</span>&#160;    <span class="comment">// Option 3:</span></div>
-<div class="line"><a name="l13817"></a><span class="lineno">13817</span>&#160;    <span class="comment">//uint32_t strategy = VMA_ALLOCATION_CREATE_STRATEGY_MIN_FRAGMENTATION_BIT;</span></div>
-<div class="line"><a name="l13818"></a><span class="lineno">13818</span>&#160; </div>
-<div class="line"><a name="l13819"></a><span class="lineno">13819</span>&#160;    <span class="keywordtype">size_t</span> srcBlockMinIndex = 0;</div>
-<div class="line"><a name="l13820"></a><span class="lineno">13820</span>&#160;    <span class="comment">// When FAST_ALGORITHM, move allocations from only last out of blocks that contain non-movable allocations.</span></div>
-<div class="line"><a name="l13821"></a><span class="lineno">13821</span>&#160;    <span class="comment">/*</span></div>
-<div class="line"><a name="l13822"></a><span class="lineno">13822</span>&#160;<span class="comment">    if(m_AlgorithmFlags &amp; VMA_DEFRAGMENTATION_FAST_ALGORITHM_BIT)</span></div>
-<div class="line"><a name="l13823"></a><span class="lineno">13823</span>&#160;<span class="comment">    {</span></div>
-<div class="line"><a name="l13824"></a><span class="lineno">13824</span>&#160;<span class="comment">        const size_t blocksWithNonMovableCount = CalcBlocksWithNonMovableCount();</span></div>
-<div class="line"><a name="l13825"></a><span class="lineno">13825</span>&#160;<span class="comment">        if(blocksWithNonMovableCount &gt; 0)</span></div>
-<div class="line"><a name="l13826"></a><span class="lineno">13826</span>&#160;<span class="comment">        {</span></div>
-<div class="line"><a name="l13827"></a><span class="lineno">13827</span>&#160;<span class="comment">            srcBlockMinIndex = blocksWithNonMovableCount - 1;</span></div>
-<div class="line"><a name="l13828"></a><span class="lineno">13828</span>&#160;<span class="comment">        }</span></div>
-<div class="line"><a name="l13829"></a><span class="lineno">13829</span>&#160;<span class="comment">    }</span></div>
-<div class="line"><a name="l13830"></a><span class="lineno">13830</span>&#160;<span class="comment">    */</span></div>
-<div class="line"><a name="l13831"></a><span class="lineno">13831</span>&#160; </div>
-<div class="line"><a name="l13832"></a><span class="lineno">13832</span>&#160;    <span class="keywordtype">size_t</span> srcBlockIndex = m_Blocks.size() - 1;</div>
-<div class="line"><a name="l13833"></a><span class="lineno">13833</span>&#160;    <span class="keywordtype">size_t</span> srcAllocIndex = SIZE_MAX;</div>
-<div class="line"><a name="l13834"></a><span class="lineno">13834</span>&#160;    <span class="keywordflow">for</span>(;;)</div>
-<div class="line"><a name="l13835"></a><span class="lineno">13835</span>&#160;    {</div>
-<div class="line"><a name="l13836"></a><span class="lineno">13836</span>&#160;        <span class="comment">// 1. Find next allocation to move.</span></div>
-<div class="line"><a name="l13837"></a><span class="lineno">13837</span>&#160;        <span class="comment">// 1.1. Start from last to first m_Blocks - they are sorted from most &quot;destination&quot; to most &quot;source&quot;.</span></div>
-<div class="line"><a name="l13838"></a><span class="lineno">13838</span>&#160;        <span class="comment">// 1.2. Then start from last to first m_Allocations.</span></div>
-<div class="line"><a name="l13839"></a><span class="lineno">13839</span>&#160;        <span class="keywordflow">while</span>(srcAllocIndex &gt;= m_Blocks[srcBlockIndex]-&gt;m_Allocations.size())</div>
-<div class="line"><a name="l13840"></a><span class="lineno">13840</span>&#160;        {</div>
-<div class="line"><a name="l13841"></a><span class="lineno">13841</span>&#160;            <span class="keywordflow">if</span>(m_Blocks[srcBlockIndex]-&gt;m_Allocations.empty())</div>
-<div class="line"><a name="l13842"></a><span class="lineno">13842</span>&#160;            {</div>
-<div class="line"><a name="l13843"></a><span class="lineno">13843</span>&#160;                <span class="comment">// Finished: no more allocations to process.</span></div>
-<div class="line"><a name="l13844"></a><span class="lineno">13844</span>&#160;                <span class="keywordflow">if</span>(srcBlockIndex == srcBlockMinIndex)</div>
-<div class="line"><a name="l13845"></a><span class="lineno">13845</span>&#160;                {</div>
-<div class="line"><a name="l13846"></a><span class="lineno">13846</span>&#160;                    <span class="keywordflow">return</span> VK_SUCCESS;</div>
-<div class="line"><a name="l13847"></a><span class="lineno">13847</span>&#160;                }</div>
-<div class="line"><a name="l13848"></a><span class="lineno">13848</span>&#160;                <span class="keywordflow">else</span></div>
-<div class="line"><a name="l13849"></a><span class="lineno">13849</span>&#160;                {</div>
-<div class="line"><a name="l13850"></a><span class="lineno">13850</span>&#160;                    --srcBlockIndex;</div>
-<div class="line"><a name="l13851"></a><span class="lineno">13851</span>&#160;                    srcAllocIndex = SIZE_MAX;</div>
-<div class="line"><a name="l13852"></a><span class="lineno">13852</span>&#160;                }</div>
-<div class="line"><a name="l13853"></a><span class="lineno">13853</span>&#160;            }</div>
-<div class="line"><a name="l13854"></a><span class="lineno">13854</span>&#160;            <span class="keywordflow">else</span></div>
-<div class="line"><a name="l13855"></a><span class="lineno">13855</span>&#160;            {</div>
-<div class="line"><a name="l13856"></a><span class="lineno">13856</span>&#160;                srcAllocIndex = m_Blocks[srcBlockIndex]-&gt;m_Allocations.size() - 1;</div>
-<div class="line"><a name="l13857"></a><span class="lineno">13857</span>&#160;            }</div>
-<div class="line"><a name="l13858"></a><span class="lineno">13858</span>&#160;        }</div>
-<div class="line"><a name="l13859"></a><span class="lineno">13859</span>&#160;        </div>
-<div class="line"><a name="l13860"></a><span class="lineno">13860</span>&#160;        BlockInfo* pSrcBlockInfo = m_Blocks[srcBlockIndex];</div>
-<div class="line"><a name="l13861"></a><span class="lineno">13861</span>&#160;        AllocationInfo&amp; allocInfo = pSrcBlockInfo-&gt;m_Allocations[srcAllocIndex];</div>
-<div class="line"><a name="l13862"></a><span class="lineno">13862</span>&#160; </div>
-<div class="line"><a name="l13863"></a><span class="lineno">13863</span>&#160;        <span class="keyword">const</span> VkDeviceSize size = allocInfo.m_hAllocation-&gt;GetSize();</div>
-<div class="line"><a name="l13864"></a><span class="lineno">13864</span>&#160;        <span class="keyword">const</span> VkDeviceSize srcOffset = allocInfo.m_hAllocation-&gt;GetOffset();</div>
-<div class="line"><a name="l13865"></a><span class="lineno">13865</span>&#160;        <span class="keyword">const</span> VkDeviceSize alignment = allocInfo.m_hAllocation-&gt;GetAlignment();</div>
-<div class="line"><a name="l13866"></a><span class="lineno">13866</span>&#160;        <span class="keyword">const</span> VmaSuballocationType suballocType = allocInfo.m_hAllocation-&gt;GetSuballocationType();</div>
-<div class="line"><a name="l13867"></a><span class="lineno">13867</span>&#160; </div>
-<div class="line"><a name="l13868"></a><span class="lineno">13868</span>&#160;        <span class="comment">// 2. Try to find new place for this allocation in preceding or current block.</span></div>
-<div class="line"><a name="l13869"></a><span class="lineno">13869</span>&#160;        <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> dstBlockIndex = 0; dstBlockIndex &lt;= srcBlockIndex; ++dstBlockIndex)</div>
-<div class="line"><a name="l13870"></a><span class="lineno">13870</span>&#160;        {</div>
-<div class="line"><a name="l13871"></a><span class="lineno">13871</span>&#160;            BlockInfo* pDstBlockInfo = m_Blocks[dstBlockIndex];</div>
-<div class="line"><a name="l13872"></a><span class="lineno">13872</span>&#160;            VmaAllocationRequest dstAllocRequest;</div>
-<div class="line"><a name="l13873"></a><span class="lineno">13873</span>&#160;            <span class="keywordflow">if</span>(pDstBlockInfo-&gt;m_pBlock-&gt;m_pMetadata-&gt;CreateAllocationRequest(</div>
-<div class="line"><a name="l13874"></a><span class="lineno">13874</span>&#160;                m_CurrentFrameIndex,</div>
-<div class="line"><a name="l13875"></a><span class="lineno">13875</span>&#160;                m_pBlockVector-&gt;GetFrameInUseCount(),</div>
-<div class="line"><a name="l13876"></a><span class="lineno">13876</span>&#160;                m_pBlockVector-&gt;GetBufferImageGranularity(),</div>
-<div class="line"><a name="l13877"></a><span class="lineno">13877</span>&#160;                size,</div>
-<div class="line"><a name="l13878"></a><span class="lineno">13878</span>&#160;                alignment,</div>
-<div class="line"><a name="l13879"></a><span class="lineno">13879</span>&#160;                <span class="keyword">false</span>, <span class="comment">// upperAddress</span></div>
-<div class="line"><a name="l13880"></a><span class="lineno">13880</span>&#160;                suballocType,</div>
-<div class="line"><a name="l13881"></a><span class="lineno">13881</span>&#160;                <span class="keyword">false</span>, <span class="comment">// canMakeOtherLost</span></div>
-<div class="line"><a name="l13882"></a><span class="lineno">13882</span>&#160;                strategy,</div>
-<div class="line"><a name="l13883"></a><span class="lineno">13883</span>&#160;                &amp;dstAllocRequest) &amp;&amp;</div>
-<div class="line"><a name="l13884"></a><span class="lineno">13884</span>&#160;            MoveMakesSense(</div>
-<div class="line"><a name="l13885"></a><span class="lineno">13885</span>&#160;                dstBlockIndex, dstAllocRequest.offset, srcBlockIndex, srcOffset))</div>
-<div class="line"><a name="l13886"></a><span class="lineno">13886</span>&#160;            {</div>
-<div class="line"><a name="l13887"></a><span class="lineno">13887</span>&#160;                VMA_ASSERT(dstAllocRequest.itemsToMakeLostCount == 0);</div>
-<div class="line"><a name="l13888"></a><span class="lineno">13888</span>&#160; </div>
-<div class="line"><a name="l13889"></a><span class="lineno">13889</span>&#160;                <span class="comment">// Reached limit on number of allocations or bytes to move.</span></div>
-<div class="line"><a name="l13890"></a><span class="lineno">13890</span>&#160;                <span class="keywordflow">if</span>((m_AllocationsMoved + 1 &gt; maxAllocationsToMove) ||</div>
-<div class="line"><a name="l13891"></a><span class="lineno">13891</span>&#160;                    (m_BytesMoved + size &gt; maxBytesToMove))</div>
-<div class="line"><a name="l13892"></a><span class="lineno">13892</span>&#160;                {</div>
-<div class="line"><a name="l13893"></a><span class="lineno">13893</span>&#160;                    <span class="keywordflow">return</span> VK_SUCCESS;</div>
-<div class="line"><a name="l13894"></a><span class="lineno">13894</span>&#160;                }</div>
-<div class="line"><a name="l13895"></a><span class="lineno">13895</span>&#160; </div>
-<div class="line"><a name="l13896"></a><span class="lineno">13896</span>&#160;                VmaDefragmentationMove move = {};</div>
-<div class="line"><a name="l13897"></a><span class="lineno">13897</span>&#160;                move.srcBlockIndex = pSrcBlockInfo-&gt;m_OriginalBlockIndex;</div>
-<div class="line"><a name="l13898"></a><span class="lineno">13898</span>&#160;                move.dstBlockIndex = pDstBlockInfo-&gt;m_OriginalBlockIndex;</div>
-<div class="line"><a name="l13899"></a><span class="lineno">13899</span>&#160;                move.srcOffset = srcOffset;</div>
-<div class="line"><a name="l13900"></a><span class="lineno">13900</span>&#160;                move.dstOffset = dstAllocRequest.offset;</div>
-<div class="line"><a name="l13901"></a><span class="lineno">13901</span>&#160;                move.size = size;</div>
-<div class="line"><a name="l13902"></a><span class="lineno">13902</span>&#160;                move.hAllocation = allocInfo.m_hAllocation;</div>
-<div class="line"><a name="l13903"></a><span class="lineno">13903</span>&#160;                move.pSrcBlock = pSrcBlockInfo-&gt;m_pBlock;</div>
-<div class="line"><a name="l13904"></a><span class="lineno">13904</span>&#160;                move.pDstBlock = pDstBlockInfo-&gt;m_pBlock;</div>
+<div class="line"><a name="l13811"></a><span class="lineno">13811</span>&#160;    <span class="comment">// Go over all blocks. Create and bind buffer for whole block if necessary.</span></div>
+<div class="line"><a name="l13812"></a><span class="lineno">13812</span>&#160;    {</div>
+<div class="line"><a name="l13813"></a><span class="lineno">13813</span>&#160;        VkBufferCreateInfo bufCreateInfo;</div>
+<div class="line"><a name="l13814"></a><span class="lineno">13814</span>&#160;        VmaFillGpuDefragmentationBufferCreateInfo(bufCreateInfo);</div>
+<div class="line"><a name="l13815"></a><span class="lineno">13815</span>&#160; </div>
+<div class="line"><a name="l13816"></a><span class="lineno">13816</span>&#160;        <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> blockIndex = 0; pDefragCtx-&gt;res == VK_SUCCESS &amp;&amp; blockIndex &lt; blockCount; ++blockIndex)</div>
+<div class="line"><a name="l13817"></a><span class="lineno">13817</span>&#160;        {</div>
+<div class="line"><a name="l13818"></a><span class="lineno">13818</span>&#160;            VmaBlockDefragmentationContext&amp; currBlockCtx = pDefragCtx-&gt;blockContexts[blockIndex];</div>
+<div class="line"><a name="l13819"></a><span class="lineno">13819</span>&#160;            VmaDeviceMemoryBlock* pBlock = m_Blocks[blockIndex];</div>
+<div class="line"><a name="l13820"></a><span class="lineno">13820</span>&#160;            <span class="keywordflow">if</span>((currBlockCtx.flags &amp; VmaBlockDefragmentationContext::BLOCK_FLAG_USED) != 0)</div>
+<div class="line"><a name="l13821"></a><span class="lineno">13821</span>&#160;            {</div>
+<div class="line"><a name="l13822"></a><span class="lineno">13822</span>&#160;                bufCreateInfo.size = pBlock-&gt;m_pMetadata-&gt;GetSize();</div>
+<div class="line"><a name="l13823"></a><span class="lineno">13823</span>&#160;                pDefragCtx-&gt;res = (*m_hAllocator-&gt;GetVulkanFunctions().vkCreateBuffer)(</div>
+<div class="line"><a name="l13824"></a><span class="lineno">13824</span>&#160;                    m_hAllocator-&gt;m_hDevice, &amp;bufCreateInfo, m_hAllocator-&gt;GetAllocationCallbacks(), &amp;currBlockCtx.hBuffer);</div>
+<div class="line"><a name="l13825"></a><span class="lineno">13825</span>&#160;                <span class="keywordflow">if</span>(pDefragCtx-&gt;res == VK_SUCCESS)</div>
+<div class="line"><a name="l13826"></a><span class="lineno">13826</span>&#160;                {</div>
+<div class="line"><a name="l13827"></a><span class="lineno">13827</span>&#160;                    pDefragCtx-&gt;res = (*m_hAllocator-&gt;GetVulkanFunctions().vkBindBufferMemory)(</div>
+<div class="line"><a name="l13828"></a><span class="lineno">13828</span>&#160;                        m_hAllocator-&gt;m_hDevice, currBlockCtx.hBuffer, pBlock-&gt;GetDeviceMemory(), 0);</div>
+<div class="line"><a name="l13829"></a><span class="lineno">13829</span>&#160;                }</div>
+<div class="line"><a name="l13830"></a><span class="lineno">13830</span>&#160;            }</div>
+<div class="line"><a name="l13831"></a><span class="lineno">13831</span>&#160;        }</div>
+<div class="line"><a name="l13832"></a><span class="lineno">13832</span>&#160;    }</div>
+<div class="line"><a name="l13833"></a><span class="lineno">13833</span>&#160; </div>
+<div class="line"><a name="l13834"></a><span class="lineno">13834</span>&#160;    <span class="comment">// Go over all moves. Post data transfer commands to command buffer.</span></div>
+<div class="line"><a name="l13835"></a><span class="lineno">13835</span>&#160;    <span class="keywordflow">if</span>(pDefragCtx-&gt;res == VK_SUCCESS)</div>
+<div class="line"><a name="l13836"></a><span class="lineno">13836</span>&#160;    {</div>
+<div class="line"><a name="l13837"></a><span class="lineno">13837</span>&#160;        <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> moveIndex = 0; moveIndex &lt; moveCount; ++moveIndex)</div>
+<div class="line"><a name="l13838"></a><span class="lineno">13838</span>&#160;        {</div>
+<div class="line"><a name="l13839"></a><span class="lineno">13839</span>&#160;            <span class="keyword">const</span> VmaDefragmentationMove&amp; move = moves[moveIndex];</div>
+<div class="line"><a name="l13840"></a><span class="lineno">13840</span>&#160; </div>
+<div class="line"><a name="l13841"></a><span class="lineno">13841</span>&#160;            <span class="keyword">const</span> VmaBlockDefragmentationContext&amp; srcBlockCtx = pDefragCtx-&gt;blockContexts[move.srcBlockIndex];</div>
+<div class="line"><a name="l13842"></a><span class="lineno">13842</span>&#160;            <span class="keyword">const</span> VmaBlockDefragmentationContext&amp; dstBlockCtx = pDefragCtx-&gt;blockContexts[move.dstBlockIndex];</div>
+<div class="line"><a name="l13843"></a><span class="lineno">13843</span>&#160; </div>
+<div class="line"><a name="l13844"></a><span class="lineno">13844</span>&#160;            VMA_ASSERT(srcBlockCtx.hBuffer &amp;&amp; dstBlockCtx.hBuffer);</div>
+<div class="line"><a name="l13845"></a><span class="lineno">13845</span>&#160; </div>
+<div class="line"><a name="l13846"></a><span class="lineno">13846</span>&#160;            VkBufferCopy region = {</div>
+<div class="line"><a name="l13847"></a><span class="lineno">13847</span>&#160;                move.srcOffset,</div>
+<div class="line"><a name="l13848"></a><span class="lineno">13848</span>&#160;                move.dstOffset,</div>
+<div class="line"><a name="l13849"></a><span class="lineno">13849</span>&#160;                move.size };</div>
+<div class="line"><a name="l13850"></a><span class="lineno">13850</span>&#160;            (*m_hAllocator-&gt;GetVulkanFunctions().vkCmdCopyBuffer)(</div>
+<div class="line"><a name="l13851"></a><span class="lineno">13851</span>&#160;                commandBuffer, srcBlockCtx.hBuffer, dstBlockCtx.hBuffer, 1, &amp;region);</div>
+<div class="line"><a name="l13852"></a><span class="lineno">13852</span>&#160;        }</div>
+<div class="line"><a name="l13853"></a><span class="lineno">13853</span>&#160;    }</div>
+<div class="line"><a name="l13854"></a><span class="lineno">13854</span>&#160; </div>
+<div class="line"><a name="l13855"></a><span class="lineno">13855</span>&#160;    <span class="comment">// Save buffers to defrag context for later destruction.</span></div>
+<div class="line"><a name="l13856"></a><span class="lineno">13856</span>&#160;    <span class="keywordflow">if</span>(pDefragCtx-&gt;res == VK_SUCCESS &amp;&amp; moveCount &gt; 0)</div>
+<div class="line"><a name="l13857"></a><span class="lineno">13857</span>&#160;    {</div>
+<div class="line"><a name="l13858"></a><span class="lineno">13858</span>&#160;        pDefragCtx-&gt;res = VK_NOT_READY;</div>
+<div class="line"><a name="l13859"></a><span class="lineno">13859</span>&#160;    }</div>
+<div class="line"><a name="l13860"></a><span class="lineno">13860</span>&#160;}</div>
+<div class="line"><a name="l13861"></a><span class="lineno">13861</span>&#160; </div>
+<div class="line"><a name="l13862"></a><span class="lineno">13862</span>&#160;<span class="keywordtype">void</span> VmaBlockVector::FreeEmptyBlocks(<a class="code" href="struct_vma_defragmentation_stats.html">VmaDefragmentationStats</a>* pDefragmentationStats)</div>
+<div class="line"><a name="l13863"></a><span class="lineno">13863</span>&#160;{</div>
+<div class="line"><a name="l13864"></a><span class="lineno">13864</span>&#160;    <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> blockIndex = m_Blocks.size(); blockIndex--; )</div>
+<div class="line"><a name="l13865"></a><span class="lineno">13865</span>&#160;    {</div>
+<div class="line"><a name="l13866"></a><span class="lineno">13866</span>&#160;        VmaDeviceMemoryBlock* pBlock = m_Blocks[blockIndex];</div>
+<div class="line"><a name="l13867"></a><span class="lineno">13867</span>&#160;        <span class="keywordflow">if</span>(pBlock-&gt;m_pMetadata-&gt;IsEmpty())</div>
+<div class="line"><a name="l13868"></a><span class="lineno">13868</span>&#160;        {</div>
+<div class="line"><a name="l13869"></a><span class="lineno">13869</span>&#160;            <span class="keywordflow">if</span>(m_Blocks.size() &gt; m_MinBlockCount)</div>
+<div class="line"><a name="l13870"></a><span class="lineno">13870</span>&#160;            {</div>
+<div class="line"><a name="l13871"></a><span class="lineno">13871</span>&#160;                <span class="keywordflow">if</span>(pDefragmentationStats != VMA_NULL)</div>
+<div class="line"><a name="l13872"></a><span class="lineno">13872</span>&#160;                {</div>
+<div class="line"><a name="l13873"></a><span class="lineno">13873</span>&#160;                    ++pDefragmentationStats-&gt;<a class="code" href="struct_vma_defragmentation_stats.html#a0113f1877904a5d1ee8f409216ff276b">deviceMemoryBlocksFreed</a>;</div>
+<div class="line"><a name="l13874"></a><span class="lineno">13874</span>&#160;                    pDefragmentationStats-&gt;<a class="code" href="struct_vma_defragmentation_stats.html#ab0cb9ac0dbc106c77e384ea676422f28">bytesFreed</a> += pBlock-&gt;m_pMetadata-&gt;GetSize();</div>
+<div class="line"><a name="l13875"></a><span class="lineno">13875</span>&#160;                }</div>
+<div class="line"><a name="l13876"></a><span class="lineno">13876</span>&#160; </div>
+<div class="line"><a name="l13877"></a><span class="lineno">13877</span>&#160;                VmaVectorRemove(m_Blocks, blockIndex);</div>
+<div class="line"><a name="l13878"></a><span class="lineno">13878</span>&#160;                pBlock-&gt;Destroy(m_hAllocator);</div>
+<div class="line"><a name="l13879"></a><span class="lineno">13879</span>&#160;                vma_delete(m_hAllocator, pBlock);</div>
+<div class="line"><a name="l13880"></a><span class="lineno">13880</span>&#160;            }</div>
+<div class="line"><a name="l13881"></a><span class="lineno">13881</span>&#160;            <span class="keywordflow">else</span></div>
+<div class="line"><a name="l13882"></a><span class="lineno">13882</span>&#160;            {</div>
+<div class="line"><a name="l13883"></a><span class="lineno">13883</span>&#160;                <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l13884"></a><span class="lineno">13884</span>&#160;            }</div>
+<div class="line"><a name="l13885"></a><span class="lineno">13885</span>&#160;        }</div>
+<div class="line"><a name="l13886"></a><span class="lineno">13886</span>&#160;    }</div>
+<div class="line"><a name="l13887"></a><span class="lineno">13887</span>&#160;    UpdateHasEmptyBlock();</div>
+<div class="line"><a name="l13888"></a><span class="lineno">13888</span>&#160;}</div>
+<div class="line"><a name="l13889"></a><span class="lineno">13889</span>&#160; </div>
+<div class="line"><a name="l13890"></a><span class="lineno">13890</span>&#160;<span class="keywordtype">void</span> VmaBlockVector::UpdateHasEmptyBlock()</div>
+<div class="line"><a name="l13891"></a><span class="lineno">13891</span>&#160;{</div>
+<div class="line"><a name="l13892"></a><span class="lineno">13892</span>&#160;    m_HasEmptyBlock = <span class="keyword">false</span>;</div>
+<div class="line"><a name="l13893"></a><span class="lineno">13893</span>&#160;    <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> index = 0, count = m_Blocks.size(); index &lt; count; ++index)</div>
+<div class="line"><a name="l13894"></a><span class="lineno">13894</span>&#160;    {</div>
+<div class="line"><a name="l13895"></a><span class="lineno">13895</span>&#160;        VmaDeviceMemoryBlock* <span class="keyword">const</span> pBlock = m_Blocks[index];</div>
+<div class="line"><a name="l13896"></a><span class="lineno">13896</span>&#160;        <span class="keywordflow">if</span>(pBlock-&gt;m_pMetadata-&gt;IsEmpty())</div>
+<div class="line"><a name="l13897"></a><span class="lineno">13897</span>&#160;        {</div>
+<div class="line"><a name="l13898"></a><span class="lineno">13898</span>&#160;            m_HasEmptyBlock = <span class="keyword">true</span>;</div>
+<div class="line"><a name="l13899"></a><span class="lineno">13899</span>&#160;            <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l13900"></a><span class="lineno">13900</span>&#160;        }</div>
+<div class="line"><a name="l13901"></a><span class="lineno">13901</span>&#160;    }</div>
+<div class="line"><a name="l13902"></a><span class="lineno">13902</span>&#160;}</div>
+<div class="line"><a name="l13903"></a><span class="lineno">13903</span>&#160; </div>
+<div class="line"><a name="l13904"></a><span class="lineno">13904</span>&#160;<span class="preprocessor">#if VMA_STATS_STRING_ENABLED</span></div>
 <div class="line"><a name="l13905"></a><span class="lineno">13905</span>&#160; </div>
-<div class="line"><a name="l13906"></a><span class="lineno">13906</span>&#160;                moves.push_back(move);</div>
-<div class="line"><a name="l13907"></a><span class="lineno">13907</span>&#160; </div>
-<div class="line"><a name="l13908"></a><span class="lineno">13908</span>&#160;                pDstBlockInfo-&gt;m_pBlock-&gt;m_pMetadata-&gt;Alloc(</div>
-<div class="line"><a name="l13909"></a><span class="lineno">13909</span>&#160;                    dstAllocRequest,</div>
-<div class="line"><a name="l13910"></a><span class="lineno">13910</span>&#160;                    suballocType,</div>
-<div class="line"><a name="l13911"></a><span class="lineno">13911</span>&#160;                    size,</div>
-<div class="line"><a name="l13912"></a><span class="lineno">13912</span>&#160;                    allocInfo.m_hAllocation);</div>
-<div class="line"><a name="l13913"></a><span class="lineno">13913</span>&#160; </div>
-<div class="line"><a name="l13914"></a><span class="lineno">13914</span>&#160;                <span class="keywordflow">if</span>(freeOldAllocations)</div>
-<div class="line"><a name="l13915"></a><span class="lineno">13915</span>&#160;                {</div>
-<div class="line"><a name="l13916"></a><span class="lineno">13916</span>&#160;                    pSrcBlockInfo-&gt;m_pBlock-&gt;m_pMetadata-&gt;FreeAtOffset(srcOffset);</div>
-<div class="line"><a name="l13917"></a><span class="lineno">13917</span>&#160;                    allocInfo.m_hAllocation-&gt;ChangeBlockAllocation(m_hAllocator, pDstBlockInfo-&gt;m_pBlock, dstAllocRequest.offset);</div>
-<div class="line"><a name="l13918"></a><span class="lineno">13918</span>&#160;                }</div>
-<div class="line"><a name="l13919"></a><span class="lineno">13919</span>&#160;                </div>
-<div class="line"><a name="l13920"></a><span class="lineno">13920</span>&#160;                <span class="keywordflow">if</span>(allocInfo.m_pChanged != VMA_NULL)</div>
-<div class="line"><a name="l13921"></a><span class="lineno">13921</span>&#160;                {</div>
-<div class="line"><a name="l13922"></a><span class="lineno">13922</span>&#160;                    *allocInfo.m_pChanged = VK_TRUE;</div>
-<div class="line"><a name="l13923"></a><span class="lineno">13923</span>&#160;                }</div>
-<div class="line"><a name="l13924"></a><span class="lineno">13924</span>&#160; </div>
-<div class="line"><a name="l13925"></a><span class="lineno">13925</span>&#160;                ++m_AllocationsMoved;</div>
-<div class="line"><a name="l13926"></a><span class="lineno">13926</span>&#160;                m_BytesMoved += size;</div>
-<div class="line"><a name="l13927"></a><span class="lineno">13927</span>&#160; </div>
-<div class="line"><a name="l13928"></a><span class="lineno">13928</span>&#160;                VmaVectorRemove(pSrcBlockInfo-&gt;m_Allocations, srcAllocIndex);</div>
-<div class="line"><a name="l13929"></a><span class="lineno">13929</span>&#160; </div>
-<div class="line"><a name="l13930"></a><span class="lineno">13930</span>&#160;                <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l13931"></a><span class="lineno">13931</span>&#160;            }</div>
-<div class="line"><a name="l13932"></a><span class="lineno">13932</span>&#160;        }</div>
-<div class="line"><a name="l13933"></a><span class="lineno">13933</span>&#160; </div>
-<div class="line"><a name="l13934"></a><span class="lineno">13934</span>&#160;        <span class="comment">// If not processed, this allocInfo remains in pBlockInfo-&gt;m_Allocations for next round.</span></div>
-<div class="line"><a name="l13935"></a><span class="lineno">13935</span>&#160; </div>
-<div class="line"><a name="l13936"></a><span class="lineno">13936</span>&#160;        <span class="keywordflow">if</span>(srcAllocIndex &gt; 0)</div>
-<div class="line"><a name="l13937"></a><span class="lineno">13937</span>&#160;        {</div>
-<div class="line"><a name="l13938"></a><span class="lineno">13938</span>&#160;            --srcAllocIndex;</div>
-<div class="line"><a name="l13939"></a><span class="lineno">13939</span>&#160;        }</div>
-<div class="line"><a name="l13940"></a><span class="lineno">13940</span>&#160;        <span class="keywordflow">else</span></div>
-<div class="line"><a name="l13941"></a><span class="lineno">13941</span>&#160;        {</div>
-<div class="line"><a name="l13942"></a><span class="lineno">13942</span>&#160;            <span class="keywordflow">if</span>(srcBlockIndex &gt; 0)</div>
-<div class="line"><a name="l13943"></a><span class="lineno">13943</span>&#160;            {</div>
-<div class="line"><a name="l13944"></a><span class="lineno">13944</span>&#160;                --srcBlockIndex;</div>
-<div class="line"><a name="l13945"></a><span class="lineno">13945</span>&#160;                srcAllocIndex = SIZE_MAX;</div>
-<div class="line"><a name="l13946"></a><span class="lineno">13946</span>&#160;            }</div>
-<div class="line"><a name="l13947"></a><span class="lineno">13947</span>&#160;            <span class="keywordflow">else</span></div>
-<div class="line"><a name="l13948"></a><span class="lineno">13948</span>&#160;            {</div>
-<div class="line"><a name="l13949"></a><span class="lineno">13949</span>&#160;                <span class="keywordflow">return</span> VK_SUCCESS;</div>
-<div class="line"><a name="l13950"></a><span class="lineno">13950</span>&#160;            }</div>
-<div class="line"><a name="l13951"></a><span class="lineno">13951</span>&#160;        }</div>
-<div class="line"><a name="l13952"></a><span class="lineno">13952</span>&#160;    }</div>
-<div class="line"><a name="l13953"></a><span class="lineno">13953</span>&#160;}</div>
-<div class="line"><a name="l13954"></a><span class="lineno">13954</span>&#160; </div>
-<div class="line"><a name="l13955"></a><span class="lineno">13955</span>&#160;<span class="keywordtype">size_t</span> VmaDefragmentationAlgorithm_Generic::CalcBlocksWithNonMovableCount()<span class="keyword"> const</span></div>
-<div class="line"><a name="l13956"></a><span class="lineno">13956</span>&#160;<span class="keyword"></span>{</div>
-<div class="line"><a name="l13957"></a><span class="lineno">13957</span>&#160;    <span class="keywordtype">size_t</span> result = 0;</div>
-<div class="line"><a name="l13958"></a><span class="lineno">13958</span>&#160;    <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> i = 0; i &lt; m_Blocks.size(); ++i)</div>
-<div class="line"><a name="l13959"></a><span class="lineno">13959</span>&#160;    {</div>
-<div class="line"><a name="l13960"></a><span class="lineno">13960</span>&#160;        <span class="keywordflow">if</span>(m_Blocks[i]-&gt;m_HasNonMovableAllocations)</div>
-<div class="line"><a name="l13961"></a><span class="lineno">13961</span>&#160;        {</div>
-<div class="line"><a name="l13962"></a><span class="lineno">13962</span>&#160;            ++result;</div>
-<div class="line"><a name="l13963"></a><span class="lineno">13963</span>&#160;        }</div>
-<div class="line"><a name="l13964"></a><span class="lineno">13964</span>&#160;    }</div>
-<div class="line"><a name="l13965"></a><span class="lineno">13965</span>&#160;    <span class="keywordflow">return</span> result;</div>
-<div class="line"><a name="l13966"></a><span class="lineno">13966</span>&#160;}</div>
-<div class="line"><a name="l13967"></a><span class="lineno">13967</span>&#160; </div>
-<div class="line"><a name="l13968"></a><span class="lineno">13968</span>&#160;VkResult VmaDefragmentationAlgorithm_Generic::Defragment(</div>
-<div class="line"><a name="l13969"></a><span class="lineno">13969</span>&#160;    VmaVector&lt; VmaDefragmentationMove, VmaStlAllocator&lt;VmaDefragmentationMove&gt; &gt;&amp; moves,</div>
-<div class="line"><a name="l13970"></a><span class="lineno">13970</span>&#160;    VkDeviceSize maxBytesToMove,</div>
-<div class="line"><a name="l13971"></a><span class="lineno">13971</span>&#160;    uint32_t maxAllocationsToMove,</div>
-<div class="line"><a name="l13972"></a><span class="lineno">13972</span>&#160;    <a class="code" href="vk__mem__alloc_8h.html#a88a77cef37e5d3c4fc9eb328885d048d">VmaDefragmentationFlags</a> flags)</div>
-<div class="line"><a name="l13973"></a><span class="lineno">13973</span>&#160;{</div>
-<div class="line"><a name="l13974"></a><span class="lineno">13974</span>&#160;    <span class="keywordflow">if</span>(!m_AllAllocations &amp;&amp; m_AllocationCount == 0)</div>
-<div class="line"><a name="l13975"></a><span class="lineno">13975</span>&#160;    {</div>
-<div class="line"><a name="l13976"></a><span class="lineno">13976</span>&#160;        <span class="keywordflow">return</span> VK_SUCCESS;</div>
-<div class="line"><a name="l13977"></a><span class="lineno">13977</span>&#160;    }</div>
-<div class="line"><a name="l13978"></a><span class="lineno">13978</span>&#160; </div>
-<div class="line"><a name="l13979"></a><span class="lineno">13979</span>&#160;    <span class="keyword">const</span> <span class="keywordtype">size_t</span> blockCount = m_Blocks.size();</div>
-<div class="line"><a name="l13980"></a><span class="lineno">13980</span>&#160;    <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> blockIndex = 0; blockIndex &lt; blockCount; ++blockIndex)</div>
-<div class="line"><a name="l13981"></a><span class="lineno">13981</span>&#160;    {</div>
-<div class="line"><a name="l13982"></a><span class="lineno">13982</span>&#160;        BlockInfo* pBlockInfo = m_Blocks[blockIndex];</div>
-<div class="line"><a name="l13983"></a><span class="lineno">13983</span>&#160; </div>
-<div class="line"><a name="l13984"></a><span class="lineno">13984</span>&#160;        <span class="keywordflow">if</span>(m_AllAllocations)</div>
-<div class="line"><a name="l13985"></a><span class="lineno">13985</span>&#160;        {</div>
-<div class="line"><a name="l13986"></a><span class="lineno">13986</span>&#160;            VmaBlockMetadata_Generic* pMetadata = (VmaBlockMetadata_Generic*)pBlockInfo-&gt;m_pBlock-&gt;m_pMetadata;</div>
-<div class="line"><a name="l13987"></a><span class="lineno">13987</span>&#160;            <span class="keywordflow">for</span>(VmaSuballocationList::const_iterator it = pMetadata-&gt;m_Suballocations.begin();</div>
-<div class="line"><a name="l13988"></a><span class="lineno">13988</span>&#160;                it != pMetadata-&gt;m_Suballocations.end();</div>
-<div class="line"><a name="l13989"></a><span class="lineno">13989</span>&#160;                ++it)</div>
-<div class="line"><a name="l13990"></a><span class="lineno">13990</span>&#160;            {</div>
-<div class="line"><a name="l13991"></a><span class="lineno">13991</span>&#160;                <span class="keywordflow">if</span>(it-&gt;type != VMA_SUBALLOCATION_TYPE_FREE)</div>
-<div class="line"><a name="l13992"></a><span class="lineno">13992</span>&#160;                {</div>
-<div class="line"><a name="l13993"></a><span class="lineno">13993</span>&#160;                    AllocationInfo allocInfo = AllocationInfo(it-&gt;hAllocation, VMA_NULL);</div>
-<div class="line"><a name="l13994"></a><span class="lineno">13994</span>&#160;                    pBlockInfo-&gt;m_Allocations.push_back(allocInfo);</div>
-<div class="line"><a name="l13995"></a><span class="lineno">13995</span>&#160;                }</div>
-<div class="line"><a name="l13996"></a><span class="lineno">13996</span>&#160;            }</div>
-<div class="line"><a name="l13997"></a><span class="lineno">13997</span>&#160;        }</div>
-<div class="line"><a name="l13998"></a><span class="lineno">13998</span>&#160; </div>
-<div class="line"><a name="l13999"></a><span class="lineno">13999</span>&#160;        pBlockInfo-&gt;CalcHasNonMovableAllocations();</div>
-<div class="line"><a name="l14000"></a><span class="lineno">14000</span>&#160;        </div>
-<div class="line"><a name="l14001"></a><span class="lineno">14001</span>&#160;        <span class="comment">// This is a choice based on research.</span></div>
-<div class="line"><a name="l14002"></a><span class="lineno">14002</span>&#160;        <span class="comment">// Option 1:</span></div>
-<div class="line"><a name="l14003"></a><span class="lineno">14003</span>&#160;        pBlockInfo-&gt;SortAllocationsByOffsetDescending();</div>
-<div class="line"><a name="l14004"></a><span class="lineno">14004</span>&#160;        <span class="comment">// Option 2:</span></div>
-<div class="line"><a name="l14005"></a><span class="lineno">14005</span>&#160;        <span class="comment">//pBlockInfo-&gt;SortAllocationsBySizeDescending();</span></div>
-<div class="line"><a name="l14006"></a><span class="lineno">14006</span>&#160;    }</div>
-<div class="line"><a name="l14007"></a><span class="lineno">14007</span>&#160; </div>
-<div class="line"><a name="l14008"></a><span class="lineno">14008</span>&#160;    <span class="comment">// Sort m_Blocks this time by the main criterium, from most &quot;destination&quot; to most &quot;source&quot; blocks.</span></div>
-<div class="line"><a name="l14009"></a><span class="lineno">14009</span>&#160;    VMA_SORT(m_Blocks.begin(), m_Blocks.end(), BlockInfoCompareMoveDestination());</div>
-<div class="line"><a name="l14010"></a><span class="lineno">14010</span>&#160; </div>
-<div class="line"><a name="l14011"></a><span class="lineno">14011</span>&#160;    <span class="comment">// This is a choice based on research.</span></div>
-<div class="line"><a name="l14012"></a><span class="lineno">14012</span>&#160;    <span class="keyword">const</span> uint32_t roundCount = 2;</div>
-<div class="line"><a name="l14013"></a><span class="lineno">14013</span>&#160; </div>
-<div class="line"><a name="l14014"></a><span class="lineno">14014</span>&#160;    <span class="comment">// Execute defragmentation rounds (the main part).</span></div>
-<div class="line"><a name="l14015"></a><span class="lineno">14015</span>&#160;    VkResult result = VK_SUCCESS;</div>
-<div class="line"><a name="l14016"></a><span class="lineno">14016</span>&#160;    <span class="keywordflow">for</span>(uint32_t round = 0; (round &lt; roundCount) &amp;&amp; (result == VK_SUCCESS); ++round)</div>
-<div class="line"><a name="l14017"></a><span class="lineno">14017</span>&#160;    {</div>
-<div class="line"><a name="l14018"></a><span class="lineno">14018</span>&#160;        result = DefragmentRound(moves, maxBytesToMove, maxAllocationsToMove, !(flags &amp; <a class="code" href="vk__mem__alloc_8h.html#a6552a65b71d16f378c6994b3ceaef50ca31af49446af2459284a568ce2f3fdd33">VMA_DEFRAGMENTATION_FLAG_INCREMENTAL</a>));</div>
-<div class="line"><a name="l14019"></a><span class="lineno">14019</span>&#160;    }</div>
-<div class="line"><a name="l14020"></a><span class="lineno">14020</span>&#160; </div>
-<div class="line"><a name="l14021"></a><span class="lineno">14021</span>&#160;    <span class="keywordflow">return</span> result;</div>
-<div class="line"><a name="l14022"></a><span class="lineno">14022</span>&#160;}</div>
-<div class="line"><a name="l14023"></a><span class="lineno">14023</span>&#160; </div>
-<div class="line"><a name="l14024"></a><span class="lineno">14024</span>&#160;<span class="keywordtype">bool</span> VmaDefragmentationAlgorithm_Generic::MoveMakesSense(</div>
-<div class="line"><a name="l14025"></a><span class="lineno">14025</span>&#160;        <span class="keywordtype">size_t</span> dstBlockIndex, VkDeviceSize dstOffset,</div>
-<div class="line"><a name="l14026"></a><span class="lineno">14026</span>&#160;        <span class="keywordtype">size_t</span> srcBlockIndex, VkDeviceSize srcOffset)</div>
-<div class="line"><a name="l14027"></a><span class="lineno">14027</span>&#160;{</div>
-<div class="line"><a name="l14028"></a><span class="lineno">14028</span>&#160;    <span class="keywordflow">if</span>(dstBlockIndex &lt; srcBlockIndex)</div>
-<div class="line"><a name="l14029"></a><span class="lineno">14029</span>&#160;    {</div>
-<div class="line"><a name="l14030"></a><span class="lineno">14030</span>&#160;        <span class="keywordflow">return</span> <span class="keyword">true</span>;</div>
-<div class="line"><a name="l14031"></a><span class="lineno">14031</span>&#160;    }</div>
-<div class="line"><a name="l14032"></a><span class="lineno">14032</span>&#160;    <span class="keywordflow">if</span>(dstBlockIndex &gt; srcBlockIndex)</div>
-<div class="line"><a name="l14033"></a><span class="lineno">14033</span>&#160;    {</div>
-<div class="line"><a name="l14034"></a><span class="lineno">14034</span>&#160;        <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
-<div class="line"><a name="l14035"></a><span class="lineno">14035</span>&#160;    }</div>
-<div class="line"><a name="l14036"></a><span class="lineno">14036</span>&#160;    <span class="keywordflow">if</span>(dstOffset &lt; srcOffset)</div>
-<div class="line"><a name="l14037"></a><span class="lineno">14037</span>&#160;    {</div>
-<div class="line"><a name="l14038"></a><span class="lineno">14038</span>&#160;        <span class="keywordflow">return</span> <span class="keyword">true</span>;</div>
-<div class="line"><a name="l14039"></a><span class="lineno">14039</span>&#160;    }</div>
-<div class="line"><a name="l14040"></a><span class="lineno">14040</span>&#160;    <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
-<div class="line"><a name="l14041"></a><span class="lineno">14041</span>&#160;}</div>
-<div class="line"><a name="l14042"></a><span class="lineno">14042</span>&#160; </div>
-<div class="line"><a name="l14044"></a><span class="lineno">14044</span>&#160;<span class="comment">// VmaDefragmentationAlgorithm_Fast</span></div>
-<div class="line"><a name="l14045"></a><span class="lineno">14045</span>&#160; </div>
-<div class="line"><a name="l14046"></a><span class="lineno">14046</span>&#160;VmaDefragmentationAlgorithm_Fast::VmaDefragmentationAlgorithm_Fast(</div>
-<div class="line"><a name="l14047"></a><span class="lineno">14047</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator,</div>
-<div class="line"><a name="l14048"></a><span class="lineno">14048</span>&#160;    VmaBlockVector* pBlockVector,</div>
-<div class="line"><a name="l14049"></a><span class="lineno">14049</span>&#160;    uint32_t currentFrameIndex,</div>
-<div class="line"><a name="l14050"></a><span class="lineno">14050</span>&#160;    <span class="keywordtype">bool</span> overlappingMoveSupported) :</div>
-<div class="line"><a name="l14051"></a><span class="lineno">14051</span>&#160;    VmaDefragmentationAlgorithm(hAllocator, pBlockVector, currentFrameIndex),</div>
-<div class="line"><a name="l14052"></a><span class="lineno">14052</span>&#160;    m_OverlappingMoveSupported(overlappingMoveSupported),</div>
-<div class="line"><a name="l14053"></a><span class="lineno">14053</span>&#160;    m_AllocationCount(0),</div>
-<div class="line"><a name="l14054"></a><span class="lineno">14054</span>&#160;    m_AllAllocations(false),</div>
-<div class="line"><a name="l14055"></a><span class="lineno">14055</span>&#160;    m_BytesMoved(0),</div>
-<div class="line"><a name="l14056"></a><span class="lineno">14056</span>&#160;    m_AllocationsMoved(0),</div>
-<div class="line"><a name="l14057"></a><span class="lineno">14057</span>&#160;    m_BlockInfos(VmaStlAllocator&lt;BlockInfo&gt;(hAllocator-&gt;GetAllocationCallbacks()))</div>
-<div class="line"><a name="l14058"></a><span class="lineno">14058</span>&#160;{</div>
-<div class="line"><a name="l14059"></a><span class="lineno">14059</span>&#160;    VMA_ASSERT(VMA_DEBUG_MARGIN == 0);</div>
+<div class="line"><a name="l13906"></a><span class="lineno">13906</span>&#160;<span class="keywordtype">void</span> VmaBlockVector::PrintDetailedMap(<span class="keyword">class</span> VmaJsonWriter&amp; json)</div>
+<div class="line"><a name="l13907"></a><span class="lineno">13907</span>&#160;{</div>
+<div class="line"><a name="l13908"></a><span class="lineno">13908</span>&#160;    VmaMutexLockRead lock(m_Mutex, m_hAllocator-&gt;m_UseMutex);</div>
+<div class="line"><a name="l13909"></a><span class="lineno">13909</span>&#160; </div>
+<div class="line"><a name="l13910"></a><span class="lineno">13910</span>&#160;    json.BeginObject();</div>
+<div class="line"><a name="l13911"></a><span class="lineno">13911</span>&#160; </div>
+<div class="line"><a name="l13912"></a><span class="lineno">13912</span>&#160;    <span class="keywordflow">if</span>(IsCustomPool())</div>
+<div class="line"><a name="l13913"></a><span class="lineno">13913</span>&#160;    {</div>
+<div class="line"><a name="l13914"></a><span class="lineno">13914</span>&#160;        <span class="keyword">const</span> <span class="keywordtype">char</span>* poolName = m_hParentPool-&gt;GetName();</div>
+<div class="line"><a name="l13915"></a><span class="lineno">13915</span>&#160;        <span class="keywordflow">if</span>(poolName != VMA_NULL &amp;&amp; poolName[0] != <span class="charliteral">&#39;\0&#39;</span>)</div>
+<div class="line"><a name="l13916"></a><span class="lineno">13916</span>&#160;        {</div>
+<div class="line"><a name="l13917"></a><span class="lineno">13917</span>&#160;            json.WriteString(<span class="stringliteral">&quot;Name&quot;</span>);</div>
+<div class="line"><a name="l13918"></a><span class="lineno">13918</span>&#160;            json.WriteString(poolName);</div>
+<div class="line"><a name="l13919"></a><span class="lineno">13919</span>&#160;        }</div>
+<div class="line"><a name="l13920"></a><span class="lineno">13920</span>&#160; </div>
+<div class="line"><a name="l13921"></a><span class="lineno">13921</span>&#160;        json.WriteString(<span class="stringliteral">&quot;MemoryTypeIndex&quot;</span>);</div>
+<div class="line"><a name="l13922"></a><span class="lineno">13922</span>&#160;        json.WriteNumber(m_MemoryTypeIndex);</div>
+<div class="line"><a name="l13923"></a><span class="lineno">13923</span>&#160; </div>
+<div class="line"><a name="l13924"></a><span class="lineno">13924</span>&#160;        json.WriteString(<span class="stringliteral">&quot;BlockSize&quot;</span>);</div>
+<div class="line"><a name="l13925"></a><span class="lineno">13925</span>&#160;        json.WriteNumber(m_PreferredBlockSize);</div>
+<div class="line"><a name="l13926"></a><span class="lineno">13926</span>&#160; </div>
+<div class="line"><a name="l13927"></a><span class="lineno">13927</span>&#160;        json.WriteString(<span class="stringliteral">&quot;BlockCount&quot;</span>);</div>
+<div class="line"><a name="l13928"></a><span class="lineno">13928</span>&#160;        json.BeginObject(<span class="keyword">true</span>);</div>
+<div class="line"><a name="l13929"></a><span class="lineno">13929</span>&#160;        <span class="keywordflow">if</span>(m_MinBlockCount &gt; 0)</div>
+<div class="line"><a name="l13930"></a><span class="lineno">13930</span>&#160;        {</div>
+<div class="line"><a name="l13931"></a><span class="lineno">13931</span>&#160;            json.WriteString(<span class="stringliteral">&quot;Min&quot;</span>);</div>
+<div class="line"><a name="l13932"></a><span class="lineno">13932</span>&#160;            json.WriteNumber((uint64_t)m_MinBlockCount);</div>
+<div class="line"><a name="l13933"></a><span class="lineno">13933</span>&#160;        }</div>
+<div class="line"><a name="l13934"></a><span class="lineno">13934</span>&#160;        <span class="keywordflow">if</span>(m_MaxBlockCount &lt; SIZE_MAX)</div>
+<div class="line"><a name="l13935"></a><span class="lineno">13935</span>&#160;        {</div>
+<div class="line"><a name="l13936"></a><span class="lineno">13936</span>&#160;            json.WriteString(<span class="stringliteral">&quot;Max&quot;</span>);</div>
+<div class="line"><a name="l13937"></a><span class="lineno">13937</span>&#160;            json.WriteNumber((uint64_t)m_MaxBlockCount);</div>
+<div class="line"><a name="l13938"></a><span class="lineno">13938</span>&#160;        }</div>
+<div class="line"><a name="l13939"></a><span class="lineno">13939</span>&#160;        json.WriteString(<span class="stringliteral">&quot;Cur&quot;</span>);</div>
+<div class="line"><a name="l13940"></a><span class="lineno">13940</span>&#160;        json.WriteNumber((uint64_t)m_Blocks.size());</div>
+<div class="line"><a name="l13941"></a><span class="lineno">13941</span>&#160;        json.EndObject();</div>
+<div class="line"><a name="l13942"></a><span class="lineno">13942</span>&#160; </div>
+<div class="line"><a name="l13943"></a><span class="lineno">13943</span>&#160;        <span class="keywordflow">if</span>(m_FrameInUseCount &gt; 0)</div>
+<div class="line"><a name="l13944"></a><span class="lineno">13944</span>&#160;        {</div>
+<div class="line"><a name="l13945"></a><span class="lineno">13945</span>&#160;            json.WriteString(<span class="stringliteral">&quot;FrameInUseCount&quot;</span>);</div>
+<div class="line"><a name="l13946"></a><span class="lineno">13946</span>&#160;            json.WriteNumber(m_FrameInUseCount);</div>
+<div class="line"><a name="l13947"></a><span class="lineno">13947</span>&#160;        }</div>
+<div class="line"><a name="l13948"></a><span class="lineno">13948</span>&#160; </div>
+<div class="line"><a name="l13949"></a><span class="lineno">13949</span>&#160;        <span class="keywordflow">if</span>(m_Algorithm != 0)</div>
+<div class="line"><a name="l13950"></a><span class="lineno">13950</span>&#160;        {</div>
+<div class="line"><a name="l13951"></a><span class="lineno">13951</span>&#160;            json.WriteString(<span class="stringliteral">&quot;Algorithm&quot;</span>);</div>
+<div class="line"><a name="l13952"></a><span class="lineno">13952</span>&#160;            json.WriteString(VmaAlgorithmToStr(m_Algorithm));</div>
+<div class="line"><a name="l13953"></a><span class="lineno">13953</span>&#160;        }</div>
+<div class="line"><a name="l13954"></a><span class="lineno">13954</span>&#160;    }</div>
+<div class="line"><a name="l13955"></a><span class="lineno">13955</span>&#160;    <span class="keywordflow">else</span></div>
+<div class="line"><a name="l13956"></a><span class="lineno">13956</span>&#160;    {</div>
+<div class="line"><a name="l13957"></a><span class="lineno">13957</span>&#160;        json.WriteString(<span class="stringliteral">&quot;PreferredBlockSize&quot;</span>);</div>
+<div class="line"><a name="l13958"></a><span class="lineno">13958</span>&#160;        json.WriteNumber(m_PreferredBlockSize);</div>
+<div class="line"><a name="l13959"></a><span class="lineno">13959</span>&#160;    }</div>
+<div class="line"><a name="l13960"></a><span class="lineno">13960</span>&#160; </div>
+<div class="line"><a name="l13961"></a><span class="lineno">13961</span>&#160;    json.WriteString(<span class="stringliteral">&quot;Blocks&quot;</span>);</div>
+<div class="line"><a name="l13962"></a><span class="lineno">13962</span>&#160;    json.BeginObject();</div>
+<div class="line"><a name="l13963"></a><span class="lineno">13963</span>&#160;    <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> i = 0; i &lt; m_Blocks.size(); ++i)</div>
+<div class="line"><a name="l13964"></a><span class="lineno">13964</span>&#160;    {</div>
+<div class="line"><a name="l13965"></a><span class="lineno">13965</span>&#160;        json.BeginString();</div>
+<div class="line"><a name="l13966"></a><span class="lineno">13966</span>&#160;        json.ContinueString(m_Blocks[i]-&gt;GetId());</div>
+<div class="line"><a name="l13967"></a><span class="lineno">13967</span>&#160;        json.EndString();</div>
+<div class="line"><a name="l13968"></a><span class="lineno">13968</span>&#160; </div>
+<div class="line"><a name="l13969"></a><span class="lineno">13969</span>&#160;        m_Blocks[i]-&gt;m_pMetadata-&gt;PrintDetailedMap(json);</div>
+<div class="line"><a name="l13970"></a><span class="lineno">13970</span>&#160;    }</div>
+<div class="line"><a name="l13971"></a><span class="lineno">13971</span>&#160;    json.EndObject();</div>
+<div class="line"><a name="l13972"></a><span class="lineno">13972</span>&#160; </div>
+<div class="line"><a name="l13973"></a><span class="lineno">13973</span>&#160;    json.EndObject();</div>
+<div class="line"><a name="l13974"></a><span class="lineno">13974</span>&#160;}</div>
+<div class="line"><a name="l13975"></a><span class="lineno">13975</span>&#160; </div>
+<div class="line"><a name="l13976"></a><span class="lineno">13976</span>&#160;<span class="preprocessor">#endif </span><span class="comment">// #if VMA_STATS_STRING_ENABLED</span></div>
+<div class="line"><a name="l13977"></a><span class="lineno">13977</span>&#160; </div>
+<div class="line"><a name="l13978"></a><span class="lineno">13978</span>&#160;<span class="keywordtype">void</span> VmaBlockVector::Defragment(</div>
+<div class="line"><a name="l13979"></a><span class="lineno">13979</span>&#160;    <span class="keyword">class</span> VmaBlockVectorDefragmentationContext* pCtx,</div>
+<div class="line"><a name="l13980"></a><span class="lineno">13980</span>&#160;    <a class="code" href="struct_vma_defragmentation_stats.html">VmaDefragmentationStats</a>* pStats, <a class="code" href="vk__mem__alloc_8h.html#a88a77cef37e5d3c4fc9eb328885d048d">VmaDefragmentationFlags</a> flags,</div>
+<div class="line"><a name="l13981"></a><span class="lineno">13981</span>&#160;    VkDeviceSize&amp; maxCpuBytesToMove, uint32_t&amp; maxCpuAllocationsToMove,</div>
+<div class="line"><a name="l13982"></a><span class="lineno">13982</span>&#160;    VkDeviceSize&amp; maxGpuBytesToMove, uint32_t&amp; maxGpuAllocationsToMove,</div>
+<div class="line"><a name="l13983"></a><span class="lineno">13983</span>&#160;    VkCommandBuffer commandBuffer)</div>
+<div class="line"><a name="l13984"></a><span class="lineno">13984</span>&#160;{</div>
+<div class="line"><a name="l13985"></a><span class="lineno">13985</span>&#160;    pCtx-&gt;res = VK_SUCCESS;</div>
+<div class="line"><a name="l13986"></a><span class="lineno">13986</span>&#160; </div>
+<div class="line"><a name="l13987"></a><span class="lineno">13987</span>&#160;    <span class="keyword">const</span> VkMemoryPropertyFlags memPropFlags =</div>
+<div class="line"><a name="l13988"></a><span class="lineno">13988</span>&#160;        m_hAllocator-&gt;m_MemProps.memoryTypes[m_MemoryTypeIndex].propertyFlags;</div>
+<div class="line"><a name="l13989"></a><span class="lineno">13989</span>&#160;    <span class="keyword">const</span> <span class="keywordtype">bool</span> isHostVisible = (memPropFlags &amp; VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT) != 0;</div>
+<div class="line"><a name="l13990"></a><span class="lineno">13990</span>&#160; </div>
+<div class="line"><a name="l13991"></a><span class="lineno">13991</span>&#160;    <span class="keyword">const</span> <span class="keywordtype">bool</span> canDefragmentOnCpu = maxCpuBytesToMove &gt; 0 &amp;&amp; maxCpuAllocationsToMove &gt; 0 &amp;&amp;</div>
+<div class="line"><a name="l13992"></a><span class="lineno">13992</span>&#160;        isHostVisible;</div>
+<div class="line"><a name="l13993"></a><span class="lineno">13993</span>&#160;    <span class="keyword">const</span> <span class="keywordtype">bool</span> canDefragmentOnGpu = maxGpuBytesToMove &gt; 0 &amp;&amp; maxGpuAllocationsToMove &gt; 0 &amp;&amp;</div>
+<div class="line"><a name="l13994"></a><span class="lineno">13994</span>&#160;        !IsCorruptionDetectionEnabled() &amp;&amp;</div>
+<div class="line"><a name="l13995"></a><span class="lineno">13995</span>&#160;        ((1u &lt;&lt; m_MemoryTypeIndex) &amp; m_hAllocator-&gt;GetGpuDefragmentationMemoryTypeBits()) != 0;</div>
+<div class="line"><a name="l13996"></a><span class="lineno">13996</span>&#160; </div>
+<div class="line"><a name="l13997"></a><span class="lineno">13997</span>&#160;    <span class="comment">// There are options to defragment this memory type.</span></div>
+<div class="line"><a name="l13998"></a><span class="lineno">13998</span>&#160;    <span class="keywordflow">if</span>(canDefragmentOnCpu || canDefragmentOnGpu)</div>
+<div class="line"><a name="l13999"></a><span class="lineno">13999</span>&#160;    {</div>
+<div class="line"><a name="l14000"></a><span class="lineno">14000</span>&#160;        <span class="keywordtype">bool</span> defragmentOnGpu;</div>
+<div class="line"><a name="l14001"></a><span class="lineno">14001</span>&#160;        <span class="comment">// There is only one option to defragment this memory type.</span></div>
+<div class="line"><a name="l14002"></a><span class="lineno">14002</span>&#160;        <span class="keywordflow">if</span>(canDefragmentOnGpu != canDefragmentOnCpu)</div>
+<div class="line"><a name="l14003"></a><span class="lineno">14003</span>&#160;        {</div>
+<div class="line"><a name="l14004"></a><span class="lineno">14004</span>&#160;            defragmentOnGpu = canDefragmentOnGpu;</div>
+<div class="line"><a name="l14005"></a><span class="lineno">14005</span>&#160;        }</div>
+<div class="line"><a name="l14006"></a><span class="lineno">14006</span>&#160;        <span class="comment">// Both options are available: Heuristics to choose the best one.</span></div>
+<div class="line"><a name="l14007"></a><span class="lineno">14007</span>&#160;        <span class="keywordflow">else</span></div>
+<div class="line"><a name="l14008"></a><span class="lineno">14008</span>&#160;        {</div>
+<div class="line"><a name="l14009"></a><span class="lineno">14009</span>&#160;            defragmentOnGpu = (memPropFlags &amp; VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT) != 0 ||</div>
+<div class="line"><a name="l14010"></a><span class="lineno">14010</span>&#160;                m_hAllocator-&gt;IsIntegratedGpu();</div>
+<div class="line"><a name="l14011"></a><span class="lineno">14011</span>&#160;        }</div>
+<div class="line"><a name="l14012"></a><span class="lineno">14012</span>&#160; </div>
+<div class="line"><a name="l14013"></a><span class="lineno">14013</span>&#160;        <span class="keywordtype">bool</span> overlappingMoveSupported = !defragmentOnGpu;</div>
+<div class="line"><a name="l14014"></a><span class="lineno">14014</span>&#160; </div>
+<div class="line"><a name="l14015"></a><span class="lineno">14015</span>&#160;        <span class="keywordflow">if</span>(m_hAllocator-&gt;m_UseMutex)</div>
+<div class="line"><a name="l14016"></a><span class="lineno">14016</span>&#160;        {</div>
+<div class="line"><a name="l14017"></a><span class="lineno">14017</span>&#160;            <span class="keywordflow">if</span>(flags &amp; <a class="code" href="vk__mem__alloc_8h.html#a6552a65b71d16f378c6994b3ceaef50ca31af49446af2459284a568ce2f3fdd33">VMA_DEFRAGMENTATION_FLAG_INCREMENTAL</a>)</div>
+<div class="line"><a name="l14018"></a><span class="lineno">14018</span>&#160;            {</div>
+<div class="line"><a name="l14019"></a><span class="lineno">14019</span>&#160;                <span class="keywordflow">if</span>(!m_Mutex.TryLockWrite())</div>
+<div class="line"><a name="l14020"></a><span class="lineno">14020</span>&#160;                {</div>
+<div class="line"><a name="l14021"></a><span class="lineno">14021</span>&#160;                    pCtx-&gt;res = VK_ERROR_INITIALIZATION_FAILED;</div>
+<div class="line"><a name="l14022"></a><span class="lineno">14022</span>&#160;                    <span class="keywordflow">return</span>;</div>
+<div class="line"><a name="l14023"></a><span class="lineno">14023</span>&#160;                }</div>
+<div class="line"><a name="l14024"></a><span class="lineno">14024</span>&#160;            }</div>
+<div class="line"><a name="l14025"></a><span class="lineno">14025</span>&#160;            <span class="keywordflow">else</span></div>
+<div class="line"><a name="l14026"></a><span class="lineno">14026</span>&#160;            {</div>
+<div class="line"><a name="l14027"></a><span class="lineno">14027</span>&#160;                m_Mutex.LockWrite();</div>
+<div class="line"><a name="l14028"></a><span class="lineno">14028</span>&#160;                pCtx-&gt;mutexLocked = <span class="keyword">true</span>;</div>
+<div class="line"><a name="l14029"></a><span class="lineno">14029</span>&#160;            }</div>
+<div class="line"><a name="l14030"></a><span class="lineno">14030</span>&#160;        }</div>
+<div class="line"><a name="l14031"></a><span class="lineno">14031</span>&#160; </div>
+<div class="line"><a name="l14032"></a><span class="lineno">14032</span>&#160;        pCtx-&gt;Begin(overlappingMoveSupported, flags);</div>
+<div class="line"><a name="l14033"></a><span class="lineno">14033</span>&#160; </div>
+<div class="line"><a name="l14034"></a><span class="lineno">14034</span>&#160;        <span class="comment">// Defragment.</span></div>
+<div class="line"><a name="l14035"></a><span class="lineno">14035</span>&#160; </div>
+<div class="line"><a name="l14036"></a><span class="lineno">14036</span>&#160;        <span class="keyword">const</span> VkDeviceSize maxBytesToMove = defragmentOnGpu ? maxGpuBytesToMove : maxCpuBytesToMove;</div>
+<div class="line"><a name="l14037"></a><span class="lineno">14037</span>&#160;        <span class="keyword">const</span> uint32_t maxAllocationsToMove = defragmentOnGpu ? maxGpuAllocationsToMove : maxCpuAllocationsToMove;</div>
+<div class="line"><a name="l14038"></a><span class="lineno">14038</span>&#160;        pCtx-&gt;res = pCtx-&gt;GetAlgorithm()-&gt;Defragment(pCtx-&gt;defragmentationMoves, maxBytesToMove, maxAllocationsToMove, flags);</div>
+<div class="line"><a name="l14039"></a><span class="lineno">14039</span>&#160; </div>
+<div class="line"><a name="l14040"></a><span class="lineno">14040</span>&#160;        <span class="comment">// Accumulate statistics.</span></div>
+<div class="line"><a name="l14041"></a><span class="lineno">14041</span>&#160;        <span class="keywordflow">if</span>(pStats != VMA_NULL)</div>
+<div class="line"><a name="l14042"></a><span class="lineno">14042</span>&#160;        {</div>
+<div class="line"><a name="l14043"></a><span class="lineno">14043</span>&#160;            <span class="keyword">const</span> VkDeviceSize bytesMoved = pCtx-&gt;GetAlgorithm()-&gt;GetBytesMoved();</div>
+<div class="line"><a name="l14044"></a><span class="lineno">14044</span>&#160;            <span class="keyword">const</span> uint32_t allocationsMoved = pCtx-&gt;GetAlgorithm()-&gt;GetAllocationsMoved();</div>
+<div class="line"><a name="l14045"></a><span class="lineno">14045</span>&#160;            pStats-&gt;<a class="code" href="struct_vma_defragmentation_stats.html#a36f9d5df2a10ba2a36b16e126d60572d">bytesMoved</a> += bytesMoved;</div>
+<div class="line"><a name="l14046"></a><span class="lineno">14046</span>&#160;            pStats-&gt;<a class="code" href="struct_vma_defragmentation_stats.html#aefeabf130022008eadd75999478af3f9">allocationsMoved</a> += allocationsMoved;</div>
+<div class="line"><a name="l14047"></a><span class="lineno">14047</span>&#160;            VMA_ASSERT(bytesMoved &lt;= maxBytesToMove);</div>
+<div class="line"><a name="l14048"></a><span class="lineno">14048</span>&#160;            VMA_ASSERT(allocationsMoved &lt;= maxAllocationsToMove);</div>
+<div class="line"><a name="l14049"></a><span class="lineno">14049</span>&#160;            <span class="keywordflow">if</span>(defragmentOnGpu)</div>
+<div class="line"><a name="l14050"></a><span class="lineno">14050</span>&#160;            {</div>
+<div class="line"><a name="l14051"></a><span class="lineno">14051</span>&#160;                maxGpuBytesToMove -= bytesMoved;</div>
+<div class="line"><a name="l14052"></a><span class="lineno">14052</span>&#160;                maxGpuAllocationsToMove -= allocationsMoved;</div>
+<div class="line"><a name="l14053"></a><span class="lineno">14053</span>&#160;            }</div>
+<div class="line"><a name="l14054"></a><span class="lineno">14054</span>&#160;            <span class="keywordflow">else</span></div>
+<div class="line"><a name="l14055"></a><span class="lineno">14055</span>&#160;            {</div>
+<div class="line"><a name="l14056"></a><span class="lineno">14056</span>&#160;                maxCpuBytesToMove -= bytesMoved;</div>
+<div class="line"><a name="l14057"></a><span class="lineno">14057</span>&#160;                maxCpuAllocationsToMove -= allocationsMoved;</div>
+<div class="line"><a name="l14058"></a><span class="lineno">14058</span>&#160;            }</div>
+<div class="line"><a name="l14059"></a><span class="lineno">14059</span>&#160;        }</div>
 <div class="line"><a name="l14060"></a><span class="lineno">14060</span>&#160; </div>
-<div class="line"><a name="l14061"></a><span class="lineno">14061</span>&#160;}</div>
-<div class="line"><a name="l14062"></a><span class="lineno">14062</span>&#160; </div>
-<div class="line"><a name="l14063"></a><span class="lineno">14063</span>&#160;VmaDefragmentationAlgorithm_Fast::~VmaDefragmentationAlgorithm_Fast()</div>
-<div class="line"><a name="l14064"></a><span class="lineno">14064</span>&#160;{</div>
-<div class="line"><a name="l14065"></a><span class="lineno">14065</span>&#160;}</div>
-<div class="line"><a name="l14066"></a><span class="lineno">14066</span>&#160; </div>
-<div class="line"><a name="l14067"></a><span class="lineno">14067</span>&#160;VkResult VmaDefragmentationAlgorithm_Fast::Defragment(</div>
-<div class="line"><a name="l14068"></a><span class="lineno">14068</span>&#160;    VmaVector&lt; VmaDefragmentationMove, VmaStlAllocator&lt;VmaDefragmentationMove&gt; &gt;&amp; moves,</div>
-<div class="line"><a name="l14069"></a><span class="lineno">14069</span>&#160;    VkDeviceSize maxBytesToMove,</div>
-<div class="line"><a name="l14070"></a><span class="lineno">14070</span>&#160;    uint32_t maxAllocationsToMove,</div>
-<div class="line"><a name="l14071"></a><span class="lineno">14071</span>&#160;    <a class="code" href="vk__mem__alloc_8h.html#a88a77cef37e5d3c4fc9eb328885d048d">VmaDefragmentationFlags</a> flags)</div>
-<div class="line"><a name="l14072"></a><span class="lineno">14072</span>&#160;{</div>
-<div class="line"><a name="l14073"></a><span class="lineno">14073</span>&#160;    VMA_ASSERT(m_AllAllocations || m_pBlockVector-&gt;CalcAllocationCount() == m_AllocationCount);</div>
-<div class="line"><a name="l14074"></a><span class="lineno">14074</span>&#160; </div>
-<div class="line"><a name="l14075"></a><span class="lineno">14075</span>&#160;    <span class="keyword">const</span> <span class="keywordtype">size_t</span> blockCount = m_pBlockVector-&gt;GetBlockCount();</div>
-<div class="line"><a name="l14076"></a><span class="lineno">14076</span>&#160;    <span class="keywordflow">if</span>(blockCount == 0 || maxBytesToMove == 0 || maxAllocationsToMove == 0)</div>
-<div class="line"><a name="l14077"></a><span class="lineno">14077</span>&#160;    {</div>
-<div class="line"><a name="l14078"></a><span class="lineno">14078</span>&#160;        <span class="keywordflow">return</span> VK_SUCCESS;</div>
-<div class="line"><a name="l14079"></a><span class="lineno">14079</span>&#160;    }</div>
-<div class="line"><a name="l14080"></a><span class="lineno">14080</span>&#160; </div>
-<div class="line"><a name="l14081"></a><span class="lineno">14081</span>&#160;    PreprocessMetadata();</div>
-<div class="line"><a name="l14082"></a><span class="lineno">14082</span>&#160; </div>
-<div class="line"><a name="l14083"></a><span class="lineno">14083</span>&#160;    <span class="comment">// Sort blocks in order from most destination.</span></div>
-<div class="line"><a name="l14084"></a><span class="lineno">14084</span>&#160; </div>
-<div class="line"><a name="l14085"></a><span class="lineno">14085</span>&#160;    m_BlockInfos.resize(blockCount);</div>
-<div class="line"><a name="l14086"></a><span class="lineno">14086</span>&#160;    <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> i = 0; i &lt; blockCount; ++i)</div>
-<div class="line"><a name="l14087"></a><span class="lineno">14087</span>&#160;    {</div>
-<div class="line"><a name="l14088"></a><span class="lineno">14088</span>&#160;        m_BlockInfos[i].origBlockIndex = i;</div>
-<div class="line"><a name="l14089"></a><span class="lineno">14089</span>&#160;    }</div>
-<div class="line"><a name="l14090"></a><span class="lineno">14090</span>&#160; </div>
-<div class="line"><a name="l14091"></a><span class="lineno">14091</span>&#160;    VMA_SORT(m_BlockInfos.begin(), m_BlockInfos.end(), [<span class="keyword">this</span>](<span class="keyword">const</span> BlockInfo&amp; lhs, <span class="keyword">const</span> BlockInfo&amp; rhs) -&gt; <span class="keywordtype">bool</span> {</div>
-<div class="line"><a name="l14092"></a><span class="lineno">14092</span>&#160;        return m_pBlockVector-&gt;GetBlock(lhs.origBlockIndex)-&gt;m_pMetadata-&gt;GetSumFreeSize() &lt;</div>
-<div class="line"><a name="l14093"></a><span class="lineno">14093</span>&#160;            m_pBlockVector-&gt;GetBlock(rhs.origBlockIndex)-&gt;m_pMetadata-&gt;GetSumFreeSize();</div>
-<div class="line"><a name="l14094"></a><span class="lineno">14094</span>&#160;    });</div>
-<div class="line"><a name="l14095"></a><span class="lineno">14095</span>&#160; </div>
-<div class="line"><a name="l14096"></a><span class="lineno">14096</span>&#160;    <span class="comment">// THE MAIN ALGORITHM</span></div>
-<div class="line"><a name="l14097"></a><span class="lineno">14097</span>&#160; </div>
-<div class="line"><a name="l14098"></a><span class="lineno">14098</span>&#160;    FreeSpaceDatabase freeSpaceDb;</div>
-<div class="line"><a name="l14099"></a><span class="lineno">14099</span>&#160; </div>
-<div class="line"><a name="l14100"></a><span class="lineno">14100</span>&#160;    <span class="keywordtype">size_t</span> dstBlockInfoIndex = 0;</div>
-<div class="line"><a name="l14101"></a><span class="lineno">14101</span>&#160;    <span class="keywordtype">size_t</span> dstOrigBlockIndex = m_BlockInfos[dstBlockInfoIndex].origBlockIndex;</div>
-<div class="line"><a name="l14102"></a><span class="lineno">14102</span>&#160;    VmaDeviceMemoryBlock* pDstBlock = m_pBlockVector-&gt;GetBlock(dstOrigBlockIndex);</div>
-<div class="line"><a name="l14103"></a><span class="lineno">14103</span>&#160;    VmaBlockMetadata_Generic* pDstMetadata = (VmaBlockMetadata_Generic*)pDstBlock-&gt;m_pMetadata;</div>
-<div class="line"><a name="l14104"></a><span class="lineno">14104</span>&#160;    VkDeviceSize dstBlockSize = pDstMetadata-&gt;GetSize();</div>
-<div class="line"><a name="l14105"></a><span class="lineno">14105</span>&#160;    VkDeviceSize dstOffset = 0;</div>
-<div class="line"><a name="l14106"></a><span class="lineno">14106</span>&#160; </div>
-<div class="line"><a name="l14107"></a><span class="lineno">14107</span>&#160;    <span class="keywordtype">bool</span> end = <span class="keyword">false</span>;</div>
-<div class="line"><a name="l14108"></a><span class="lineno">14108</span>&#160;    <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> srcBlockInfoIndex = 0; !end &amp;&amp; srcBlockInfoIndex &lt; blockCount; ++srcBlockInfoIndex)</div>
-<div class="line"><a name="l14109"></a><span class="lineno">14109</span>&#160;    {</div>
-<div class="line"><a name="l14110"></a><span class="lineno">14110</span>&#160;        <span class="keyword">const</span> <span class="keywordtype">size_t</span> srcOrigBlockIndex = m_BlockInfos[srcBlockInfoIndex].origBlockIndex;</div>
-<div class="line"><a name="l14111"></a><span class="lineno">14111</span>&#160;        VmaDeviceMemoryBlock* <span class="keyword">const</span> pSrcBlock = m_pBlockVector-&gt;GetBlock(srcOrigBlockIndex);</div>
-<div class="line"><a name="l14112"></a><span class="lineno">14112</span>&#160;        VmaBlockMetadata_Generic* <span class="keyword">const</span> pSrcMetadata = (VmaBlockMetadata_Generic*)pSrcBlock-&gt;m_pMetadata;</div>
-<div class="line"><a name="l14113"></a><span class="lineno">14113</span>&#160;        <span class="keywordflow">for</span>(VmaSuballocationList::iterator srcSuballocIt = pSrcMetadata-&gt;m_Suballocations.begin();</div>
-<div class="line"><a name="l14114"></a><span class="lineno">14114</span>&#160;            !end &amp;&amp; srcSuballocIt != pSrcMetadata-&gt;m_Suballocations.end(); )</div>
+<div class="line"><a name="l14061"></a><span class="lineno">14061</span>&#160;        <span class="keywordflow">if</span>(flags &amp; <a class="code" href="vk__mem__alloc_8h.html#a6552a65b71d16f378c6994b3ceaef50ca31af49446af2459284a568ce2f3fdd33">VMA_DEFRAGMENTATION_FLAG_INCREMENTAL</a>)</div>
+<div class="line"><a name="l14062"></a><span class="lineno">14062</span>&#160;        {</div>
+<div class="line"><a name="l14063"></a><span class="lineno">14063</span>&#160;            <span class="keywordflow">if</span>(m_hAllocator-&gt;m_UseMutex)</div>
+<div class="line"><a name="l14064"></a><span class="lineno">14064</span>&#160;                m_Mutex.UnlockWrite();</div>
+<div class="line"><a name="l14065"></a><span class="lineno">14065</span>&#160; </div>
+<div class="line"><a name="l14066"></a><span class="lineno">14066</span>&#160;            <span class="keywordflow">if</span>(pCtx-&gt;res &gt;= VK_SUCCESS &amp;&amp; !pCtx-&gt;defragmentationMoves.empty())</div>
+<div class="line"><a name="l14067"></a><span class="lineno">14067</span>&#160;                pCtx-&gt;res = VK_NOT_READY;</div>
+<div class="line"><a name="l14068"></a><span class="lineno">14068</span>&#160; </div>
+<div class="line"><a name="l14069"></a><span class="lineno">14069</span>&#160;            <span class="keywordflow">return</span>;</div>
+<div class="line"><a name="l14070"></a><span class="lineno">14070</span>&#160;        }</div>
+<div class="line"><a name="l14071"></a><span class="lineno">14071</span>&#160; </div>
+<div class="line"><a name="l14072"></a><span class="lineno">14072</span>&#160;        <span class="keywordflow">if</span>(pCtx-&gt;res &gt;= VK_SUCCESS)</div>
+<div class="line"><a name="l14073"></a><span class="lineno">14073</span>&#160;        {</div>
+<div class="line"><a name="l14074"></a><span class="lineno">14074</span>&#160;            <span class="keywordflow">if</span>(defragmentOnGpu)</div>
+<div class="line"><a name="l14075"></a><span class="lineno">14075</span>&#160;            {</div>
+<div class="line"><a name="l14076"></a><span class="lineno">14076</span>&#160;                ApplyDefragmentationMovesGpu(pCtx, pCtx-&gt;defragmentationMoves, commandBuffer);</div>
+<div class="line"><a name="l14077"></a><span class="lineno">14077</span>&#160;            }</div>
+<div class="line"><a name="l14078"></a><span class="lineno">14078</span>&#160;            <span class="keywordflow">else</span></div>
+<div class="line"><a name="l14079"></a><span class="lineno">14079</span>&#160;            {</div>
+<div class="line"><a name="l14080"></a><span class="lineno">14080</span>&#160;                ApplyDefragmentationMovesCpu(pCtx, pCtx-&gt;defragmentationMoves);</div>
+<div class="line"><a name="l14081"></a><span class="lineno">14081</span>&#160;            }</div>
+<div class="line"><a name="l14082"></a><span class="lineno">14082</span>&#160;        }</div>
+<div class="line"><a name="l14083"></a><span class="lineno">14083</span>&#160;    }</div>
+<div class="line"><a name="l14084"></a><span class="lineno">14084</span>&#160;}</div>
+<div class="line"><a name="l14085"></a><span class="lineno">14085</span>&#160; </div>
+<div class="line"><a name="l14086"></a><span class="lineno">14086</span>&#160;<span class="keywordtype">void</span> VmaBlockVector::DefragmentationEnd(</div>
+<div class="line"><a name="l14087"></a><span class="lineno">14087</span>&#160;    <span class="keyword">class</span> VmaBlockVectorDefragmentationContext* pCtx,</div>
+<div class="line"><a name="l14088"></a><span class="lineno">14088</span>&#160;    uint32_t flags,</div>
+<div class="line"><a name="l14089"></a><span class="lineno">14089</span>&#160;    <a class="code" href="struct_vma_defragmentation_stats.html">VmaDefragmentationStats</a>* pStats)</div>
+<div class="line"><a name="l14090"></a><span class="lineno">14090</span>&#160;{</div>
+<div class="line"><a name="l14091"></a><span class="lineno">14091</span>&#160;    <span class="keywordflow">if</span>(flags &amp; <a class="code" href="vk__mem__alloc_8h.html#a6552a65b71d16f378c6994b3ceaef50ca31af49446af2459284a568ce2f3fdd33">VMA_DEFRAGMENTATION_FLAG_INCREMENTAL</a> &amp;&amp; m_hAllocator-&gt;m_UseMutex)</div>
+<div class="line"><a name="l14092"></a><span class="lineno">14092</span>&#160;    {</div>
+<div class="line"><a name="l14093"></a><span class="lineno">14093</span>&#160;        VMA_ASSERT(pCtx-&gt;mutexLocked == <span class="keyword">false</span>);</div>
+<div class="line"><a name="l14094"></a><span class="lineno">14094</span>&#160; </div>
+<div class="line"><a name="l14095"></a><span class="lineno">14095</span>&#160;        <span class="comment">// Incremental defragmentation doesn&#39;t hold the lock, so when we enter here we don&#39;t actually have any</span></div>
+<div class="line"><a name="l14096"></a><span class="lineno">14096</span>&#160;        <span class="comment">// lock protecting us. Since we mutate state here, we have to take the lock out now</span></div>
+<div class="line"><a name="l14097"></a><span class="lineno">14097</span>&#160;        m_Mutex.LockWrite();</div>
+<div class="line"><a name="l14098"></a><span class="lineno">14098</span>&#160;        pCtx-&gt;mutexLocked = <span class="keyword">true</span>;</div>
+<div class="line"><a name="l14099"></a><span class="lineno">14099</span>&#160;    }</div>
+<div class="line"><a name="l14100"></a><span class="lineno">14100</span>&#160; </div>
+<div class="line"><a name="l14101"></a><span class="lineno">14101</span>&#160;    <span class="comment">// If the mutex isn&#39;t locked we didn&#39;t do any work and there is nothing to delete.</span></div>
+<div class="line"><a name="l14102"></a><span class="lineno">14102</span>&#160;    <span class="keywordflow">if</span>(pCtx-&gt;mutexLocked || !m_hAllocator-&gt;m_UseMutex)</div>
+<div class="line"><a name="l14103"></a><span class="lineno">14103</span>&#160;    {</div>
+<div class="line"><a name="l14104"></a><span class="lineno">14104</span>&#160;        <span class="comment">// Destroy buffers.</span></div>
+<div class="line"><a name="l14105"></a><span class="lineno">14105</span>&#160;        <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> blockIndex = pCtx-&gt;blockContexts.size(); blockIndex--;)</div>
+<div class="line"><a name="l14106"></a><span class="lineno">14106</span>&#160;        {</div>
+<div class="line"><a name="l14107"></a><span class="lineno">14107</span>&#160;            VmaBlockDefragmentationContext &amp;blockCtx = pCtx-&gt;blockContexts[blockIndex];</div>
+<div class="line"><a name="l14108"></a><span class="lineno">14108</span>&#160;            <span class="keywordflow">if</span>(blockCtx.hBuffer)</div>
+<div class="line"><a name="l14109"></a><span class="lineno">14109</span>&#160;            {</div>
+<div class="line"><a name="l14110"></a><span class="lineno">14110</span>&#160;                (*m_hAllocator-&gt;GetVulkanFunctions().vkDestroyBuffer)(m_hAllocator-&gt;m_hDevice, blockCtx.hBuffer, m_hAllocator-&gt;GetAllocationCallbacks());</div>
+<div class="line"><a name="l14111"></a><span class="lineno">14111</span>&#160;            }</div>
+<div class="line"><a name="l14112"></a><span class="lineno">14112</span>&#160;        }</div>
+<div class="line"><a name="l14113"></a><span class="lineno">14113</span>&#160; </div>
+<div class="line"><a name="l14114"></a><span class="lineno">14114</span>&#160;        <span class="keywordflow">if</span>(pCtx-&gt;res &gt;= VK_SUCCESS)</div>
 <div class="line"><a name="l14115"></a><span class="lineno">14115</span>&#160;        {</div>
-<div class="line"><a name="l14116"></a><span class="lineno">14116</span>&#160;            VmaAllocation_T* <span class="keyword">const</span> pAlloc = srcSuballocIt-&gt;hAllocation;</div>
-<div class="line"><a name="l14117"></a><span class="lineno">14117</span>&#160;            <span class="keyword">const</span> VkDeviceSize srcAllocAlignment = pAlloc-&gt;GetAlignment();</div>
-<div class="line"><a name="l14118"></a><span class="lineno">14118</span>&#160;            <span class="keyword">const</span> VkDeviceSize srcAllocSize = srcSuballocIt-&gt;size;</div>
-<div class="line"><a name="l14119"></a><span class="lineno">14119</span>&#160;            <span class="keywordflow">if</span>(m_AllocationsMoved == maxAllocationsToMove ||</div>
-<div class="line"><a name="l14120"></a><span class="lineno">14120</span>&#160;                m_BytesMoved + srcAllocSize &gt; maxBytesToMove)</div>
-<div class="line"><a name="l14121"></a><span class="lineno">14121</span>&#160;            {</div>
-<div class="line"><a name="l14122"></a><span class="lineno">14122</span>&#160;                end = <span class="keyword">true</span>;</div>
-<div class="line"><a name="l14123"></a><span class="lineno">14123</span>&#160;                <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l14124"></a><span class="lineno">14124</span>&#160;            }</div>
-<div class="line"><a name="l14125"></a><span class="lineno">14125</span>&#160;            <span class="keyword">const</span> VkDeviceSize srcAllocOffset = srcSuballocIt-&gt;offset;</div>
+<div class="line"><a name="l14116"></a><span class="lineno">14116</span>&#160;            FreeEmptyBlocks(pStats);</div>
+<div class="line"><a name="l14117"></a><span class="lineno">14117</span>&#160;        }</div>
+<div class="line"><a name="l14118"></a><span class="lineno">14118</span>&#160;    }</div>
+<div class="line"><a name="l14119"></a><span class="lineno">14119</span>&#160; </div>
+<div class="line"><a name="l14120"></a><span class="lineno">14120</span>&#160;    <span class="keywordflow">if</span>(pCtx-&gt;mutexLocked)</div>
+<div class="line"><a name="l14121"></a><span class="lineno">14121</span>&#160;    {</div>
+<div class="line"><a name="l14122"></a><span class="lineno">14122</span>&#160;        VMA_ASSERT(m_hAllocator-&gt;m_UseMutex);</div>
+<div class="line"><a name="l14123"></a><span class="lineno">14123</span>&#160;        m_Mutex.UnlockWrite();</div>
+<div class="line"><a name="l14124"></a><span class="lineno">14124</span>&#160;    }</div>
+<div class="line"><a name="l14125"></a><span class="lineno">14125</span>&#160;}</div>
 <div class="line"><a name="l14126"></a><span class="lineno">14126</span>&#160; </div>
-<div class="line"><a name="l14127"></a><span class="lineno">14127</span>&#160;            VmaDefragmentationMove move = {};</div>
-<div class="line"><a name="l14128"></a><span class="lineno">14128</span>&#160;            <span class="comment">// Try to place it in one of free spaces from the database.</span></div>
-<div class="line"><a name="l14129"></a><span class="lineno">14129</span>&#160;            <span class="keywordtype">size_t</span> freeSpaceInfoIndex;</div>
-<div class="line"><a name="l14130"></a><span class="lineno">14130</span>&#160;            VkDeviceSize dstAllocOffset;</div>
-<div class="line"><a name="l14131"></a><span class="lineno">14131</span>&#160;            <span class="keywordflow">if</span>(freeSpaceDb.Fetch(srcAllocAlignment, srcAllocSize,</div>
-<div class="line"><a name="l14132"></a><span class="lineno">14132</span>&#160;                freeSpaceInfoIndex, dstAllocOffset))</div>
-<div class="line"><a name="l14133"></a><span class="lineno">14133</span>&#160;            {</div>
-<div class="line"><a name="l14134"></a><span class="lineno">14134</span>&#160;                <span class="keywordtype">size_t</span> freeSpaceOrigBlockIndex = m_BlockInfos[freeSpaceInfoIndex].origBlockIndex;</div>
-<div class="line"><a name="l14135"></a><span class="lineno">14135</span>&#160;                VmaDeviceMemoryBlock* pFreeSpaceBlock = m_pBlockVector-&gt;GetBlock(freeSpaceOrigBlockIndex);</div>
-<div class="line"><a name="l14136"></a><span class="lineno">14136</span>&#160;                VmaBlockMetadata_Generic* pFreeSpaceMetadata = (VmaBlockMetadata_Generic*)pFreeSpaceBlock-&gt;m_pMetadata;</div>
-<div class="line"><a name="l14137"></a><span class="lineno">14137</span>&#160; </div>
-<div class="line"><a name="l14138"></a><span class="lineno">14138</span>&#160;                <span class="comment">// Same block</span></div>
-<div class="line"><a name="l14139"></a><span class="lineno">14139</span>&#160;                <span class="keywordflow">if</span>(freeSpaceInfoIndex == srcBlockInfoIndex)</div>
-<div class="line"><a name="l14140"></a><span class="lineno">14140</span>&#160;                {</div>
-<div class="line"><a name="l14141"></a><span class="lineno">14141</span>&#160;                    VMA_ASSERT(dstAllocOffset &lt;= srcAllocOffset);</div>
+<div class="line"><a name="l14127"></a><span class="lineno">14127</span>&#160;uint32_t VmaBlockVector::ProcessDefragmentations(</div>
+<div class="line"><a name="l14128"></a><span class="lineno">14128</span>&#160;    <span class="keyword">class</span> VmaBlockVectorDefragmentationContext *pCtx,</div>
+<div class="line"><a name="l14129"></a><span class="lineno">14129</span>&#160;    <a class="code" href="struct_vma_defragmentation_pass_move_info.html">VmaDefragmentationPassMoveInfo</a>* pMove, uint32_t maxMoves)</div>
+<div class="line"><a name="l14130"></a><span class="lineno">14130</span>&#160;{</div>
+<div class="line"><a name="l14131"></a><span class="lineno">14131</span>&#160;    VmaMutexLockWrite lock(m_Mutex, m_hAllocator-&gt;m_UseMutex);</div>
+<div class="line"><a name="l14132"></a><span class="lineno">14132</span>&#160; </div>
+<div class="line"><a name="l14133"></a><span class="lineno">14133</span>&#160;    <span class="keyword">const</span> uint32_t moveCount = VMA_MIN(uint32_t(pCtx-&gt;defragmentationMoves.size()) - pCtx-&gt;defragmentationMovesProcessed, maxMoves);</div>
+<div class="line"><a name="l14134"></a><span class="lineno">14134</span>&#160; </div>
+<div class="line"><a name="l14135"></a><span class="lineno">14135</span>&#160;    <span class="keywordflow">for</span>(uint32_t i = 0; i &lt; moveCount; ++ i)</div>
+<div class="line"><a name="l14136"></a><span class="lineno">14136</span>&#160;    {</div>
+<div class="line"><a name="l14137"></a><span class="lineno">14137</span>&#160;        VmaDefragmentationMove&amp; move = pCtx-&gt;defragmentationMoves[pCtx-&gt;defragmentationMovesProcessed + i];</div>
+<div class="line"><a name="l14138"></a><span class="lineno">14138</span>&#160; </div>
+<div class="line"><a name="l14139"></a><span class="lineno">14139</span>&#160;        pMove-&gt;<a class="code" href="struct_vma_defragmentation_pass_move_info.html#ae885c861c2dd8d622e6c19e281d035cc">allocation</a> = move.hAllocation;</div>
+<div class="line"><a name="l14140"></a><span class="lineno">14140</span>&#160;        pMove-&gt;<a class="code" href="struct_vma_defragmentation_pass_move_info.html#a06eb0c8690aa0d3478a036753492e769">memory</a> = move.pDstBlock-&gt;GetDeviceMemory();</div>
+<div class="line"><a name="l14141"></a><span class="lineno">14141</span>&#160;        pMove-&gt;<a class="code" href="struct_vma_defragmentation_pass_move_info.html#a8ab4508bc03625b0653c880576be96c6">offset</a> = move.dstOffset;</div>
 <div class="line"><a name="l14142"></a><span class="lineno">14142</span>&#160; </div>
-<div class="line"><a name="l14143"></a><span class="lineno">14143</span>&#160;                    <span class="comment">// MOVE OPTION 1: Move the allocation inside the same block by decreasing offset.</span></div>
-<div class="line"><a name="l14144"></a><span class="lineno">14144</span>&#160; </div>
-<div class="line"><a name="l14145"></a><span class="lineno">14145</span>&#160;                    VmaSuballocation suballoc = *srcSuballocIt;</div>
-<div class="line"><a name="l14146"></a><span class="lineno">14146</span>&#160;                    suballoc.offset = dstAllocOffset;</div>
-<div class="line"><a name="l14147"></a><span class="lineno">14147</span>&#160;                    suballoc.hAllocation-&gt;ChangeOffset(dstAllocOffset);</div>
-<div class="line"><a name="l14148"></a><span class="lineno">14148</span>&#160;                    m_BytesMoved += srcAllocSize;</div>
-<div class="line"><a name="l14149"></a><span class="lineno">14149</span>&#160;                    ++m_AllocationsMoved;</div>
-<div class="line"><a name="l14150"></a><span class="lineno">14150</span>&#160;                    </div>
-<div class="line"><a name="l14151"></a><span class="lineno">14151</span>&#160;                    VmaSuballocationList::iterator nextSuballocIt = srcSuballocIt;</div>
-<div class="line"><a name="l14152"></a><span class="lineno">14152</span>&#160;                    ++nextSuballocIt;</div>
-<div class="line"><a name="l14153"></a><span class="lineno">14153</span>&#160;                    pSrcMetadata-&gt;m_Suballocations.erase(srcSuballocIt);</div>
-<div class="line"><a name="l14154"></a><span class="lineno">14154</span>&#160;                    srcSuballocIt = nextSuballocIt;</div>
-<div class="line"><a name="l14155"></a><span class="lineno">14155</span>&#160; </div>
-<div class="line"><a name="l14156"></a><span class="lineno">14156</span>&#160;                    InsertSuballoc(pFreeSpaceMetadata, suballoc);</div>
-<div class="line"><a name="l14157"></a><span class="lineno">14157</span>&#160; </div>
-<div class="line"><a name="l14158"></a><span class="lineno">14158</span>&#160;                    move.srcBlockIndex = srcOrigBlockIndex;</div>
-<div class="line"><a name="l14159"></a><span class="lineno">14159</span>&#160;                    move.dstBlockIndex = freeSpaceOrigBlockIndex;</div>
-<div class="line"><a name="l14160"></a><span class="lineno">14160</span>&#160;                    move.srcOffset = srcAllocOffset;</div>
-<div class="line"><a name="l14161"></a><span class="lineno">14161</span>&#160;                    move.dstOffset = dstAllocOffset;</div>
-<div class="line"><a name="l14162"></a><span class="lineno">14162</span>&#160;                    move.size = srcAllocSize;</div>
-<div class="line"><a name="l14163"></a><span class="lineno">14163</span>&#160;                    </div>
-<div class="line"><a name="l14164"></a><span class="lineno">14164</span>&#160;                    moves.push_back(move);</div>
-<div class="line"><a name="l14165"></a><span class="lineno">14165</span>&#160;                }</div>
-<div class="line"><a name="l14166"></a><span class="lineno">14166</span>&#160;                <span class="comment">// Different block</span></div>
-<div class="line"><a name="l14167"></a><span class="lineno">14167</span>&#160;                <span class="keywordflow">else</span></div>
-<div class="line"><a name="l14168"></a><span class="lineno">14168</span>&#160;                {</div>
-<div class="line"><a name="l14169"></a><span class="lineno">14169</span>&#160;                    <span class="comment">// MOVE OPTION 2: Move the allocation to a different block.</span></div>
-<div class="line"><a name="l14170"></a><span class="lineno">14170</span>&#160; </div>
-<div class="line"><a name="l14171"></a><span class="lineno">14171</span>&#160;                    VMA_ASSERT(freeSpaceInfoIndex &lt; srcBlockInfoIndex);</div>
-<div class="line"><a name="l14172"></a><span class="lineno">14172</span>&#160; </div>
-<div class="line"><a name="l14173"></a><span class="lineno">14173</span>&#160;                    VmaSuballocation suballoc = *srcSuballocIt;</div>
-<div class="line"><a name="l14174"></a><span class="lineno">14174</span>&#160;                    suballoc.offset = dstAllocOffset;</div>
-<div class="line"><a name="l14175"></a><span class="lineno">14175</span>&#160;                    suballoc.hAllocation-&gt;ChangeBlockAllocation(m_hAllocator, pFreeSpaceBlock, dstAllocOffset);</div>
-<div class="line"><a name="l14176"></a><span class="lineno">14176</span>&#160;                    m_BytesMoved += srcAllocSize;</div>
-<div class="line"><a name="l14177"></a><span class="lineno">14177</span>&#160;                    ++m_AllocationsMoved;</div>
+<div class="line"><a name="l14143"></a><span class="lineno">14143</span>&#160;        ++ pMove;</div>
+<div class="line"><a name="l14144"></a><span class="lineno">14144</span>&#160;    }</div>
+<div class="line"><a name="l14145"></a><span class="lineno">14145</span>&#160; </div>
+<div class="line"><a name="l14146"></a><span class="lineno">14146</span>&#160;    pCtx-&gt;defragmentationMovesProcessed += moveCount;</div>
+<div class="line"><a name="l14147"></a><span class="lineno">14147</span>&#160; </div>
+<div class="line"><a name="l14148"></a><span class="lineno">14148</span>&#160;    <span class="keywordflow">return</span> moveCount;</div>
+<div class="line"><a name="l14149"></a><span class="lineno">14149</span>&#160;}</div>
+<div class="line"><a name="l14150"></a><span class="lineno">14150</span>&#160; </div>
+<div class="line"><a name="l14151"></a><span class="lineno">14151</span>&#160;<span class="keywordtype">void</span> VmaBlockVector::CommitDefragmentations(</div>
+<div class="line"><a name="l14152"></a><span class="lineno">14152</span>&#160;    <span class="keyword">class</span> VmaBlockVectorDefragmentationContext *pCtx,</div>
+<div class="line"><a name="l14153"></a><span class="lineno">14153</span>&#160;    <a class="code" href="struct_vma_defragmentation_stats.html">VmaDefragmentationStats</a>* pStats)</div>
+<div class="line"><a name="l14154"></a><span class="lineno">14154</span>&#160;{</div>
+<div class="line"><a name="l14155"></a><span class="lineno">14155</span>&#160;    VmaMutexLockWrite lock(m_Mutex, m_hAllocator-&gt;m_UseMutex);</div>
+<div class="line"><a name="l14156"></a><span class="lineno">14156</span>&#160; </div>
+<div class="line"><a name="l14157"></a><span class="lineno">14157</span>&#160;    <span class="keywordflow">for</span>(uint32_t i = pCtx-&gt;defragmentationMovesCommitted; i &lt; pCtx-&gt;defragmentationMovesProcessed; ++ i)</div>
+<div class="line"><a name="l14158"></a><span class="lineno">14158</span>&#160;    {</div>
+<div class="line"><a name="l14159"></a><span class="lineno">14159</span>&#160;        <span class="keyword">const</span> VmaDefragmentationMove &amp;move = pCtx-&gt;defragmentationMoves[i];</div>
+<div class="line"><a name="l14160"></a><span class="lineno">14160</span>&#160; </div>
+<div class="line"><a name="l14161"></a><span class="lineno">14161</span>&#160;        move.pSrcBlock-&gt;m_pMetadata-&gt;FreeAtOffset(move.srcOffset);</div>
+<div class="line"><a name="l14162"></a><span class="lineno">14162</span>&#160;        move.hAllocation-&gt;ChangeBlockAllocation(m_hAllocator, move.pDstBlock, move.dstOffset);</div>
+<div class="line"><a name="l14163"></a><span class="lineno">14163</span>&#160;    }</div>
+<div class="line"><a name="l14164"></a><span class="lineno">14164</span>&#160; </div>
+<div class="line"><a name="l14165"></a><span class="lineno">14165</span>&#160;    pCtx-&gt;defragmentationMovesCommitted = pCtx-&gt;defragmentationMovesProcessed;</div>
+<div class="line"><a name="l14166"></a><span class="lineno">14166</span>&#160;    FreeEmptyBlocks(pStats);</div>
+<div class="line"><a name="l14167"></a><span class="lineno">14167</span>&#160;}</div>
+<div class="line"><a name="l14168"></a><span class="lineno">14168</span>&#160; </div>
+<div class="line"><a name="l14169"></a><span class="lineno">14169</span>&#160;<span class="keywordtype">size_t</span> VmaBlockVector::CalcAllocationCount()<span class="keyword"> const</span></div>
+<div class="line"><a name="l14170"></a><span class="lineno">14170</span>&#160;<span class="keyword"></span>{</div>
+<div class="line"><a name="l14171"></a><span class="lineno">14171</span>&#160;    <span class="keywordtype">size_t</span> result = 0;</div>
+<div class="line"><a name="l14172"></a><span class="lineno">14172</span>&#160;    <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> i = 0; i &lt; m_Blocks.size(); ++i)</div>
+<div class="line"><a name="l14173"></a><span class="lineno">14173</span>&#160;    {</div>
+<div class="line"><a name="l14174"></a><span class="lineno">14174</span>&#160;        result += m_Blocks[i]-&gt;m_pMetadata-&gt;GetAllocationCount();</div>
+<div class="line"><a name="l14175"></a><span class="lineno">14175</span>&#160;    }</div>
+<div class="line"><a name="l14176"></a><span class="lineno">14176</span>&#160;    <span class="keywordflow">return</span> result;</div>
+<div class="line"><a name="l14177"></a><span class="lineno">14177</span>&#160;}</div>
 <div class="line"><a name="l14178"></a><span class="lineno">14178</span>&#160; </div>
-<div class="line"><a name="l14179"></a><span class="lineno">14179</span>&#160;                    VmaSuballocationList::iterator nextSuballocIt = srcSuballocIt;</div>
-<div class="line"><a name="l14180"></a><span class="lineno">14180</span>&#160;                    ++nextSuballocIt;</div>
-<div class="line"><a name="l14181"></a><span class="lineno">14181</span>&#160;                    pSrcMetadata-&gt;m_Suballocations.erase(srcSuballocIt);</div>
-<div class="line"><a name="l14182"></a><span class="lineno">14182</span>&#160;                    srcSuballocIt = nextSuballocIt;</div>
-<div class="line"><a name="l14183"></a><span class="lineno">14183</span>&#160; </div>
-<div class="line"><a name="l14184"></a><span class="lineno">14184</span>&#160;                    InsertSuballoc(pFreeSpaceMetadata, suballoc);</div>
-<div class="line"><a name="l14185"></a><span class="lineno">14185</span>&#160; </div>
-<div class="line"><a name="l14186"></a><span class="lineno">14186</span>&#160;                    move.srcBlockIndex = srcOrigBlockIndex;</div>
-<div class="line"><a name="l14187"></a><span class="lineno">14187</span>&#160;                    move.dstBlockIndex = freeSpaceOrigBlockIndex;</div>
-<div class="line"><a name="l14188"></a><span class="lineno">14188</span>&#160;                    move.srcOffset = srcAllocOffset;</div>
-<div class="line"><a name="l14189"></a><span class="lineno">14189</span>&#160;                    move.dstOffset = dstAllocOffset;</div>
-<div class="line"><a name="l14190"></a><span class="lineno">14190</span>&#160;                    move.size = srcAllocSize;</div>
-<div class="line"><a name="l14191"></a><span class="lineno">14191</span>&#160;                    </div>
-<div class="line"><a name="l14192"></a><span class="lineno">14192</span>&#160;                    moves.push_back(move);</div>
-<div class="line"><a name="l14193"></a><span class="lineno">14193</span>&#160;                }</div>
-<div class="line"><a name="l14194"></a><span class="lineno">14194</span>&#160;            }</div>
-<div class="line"><a name="l14195"></a><span class="lineno">14195</span>&#160;            <span class="keywordflow">else</span></div>
-<div class="line"><a name="l14196"></a><span class="lineno">14196</span>&#160;            {</div>
-<div class="line"><a name="l14197"></a><span class="lineno">14197</span>&#160;                dstAllocOffset = VmaAlignUp(dstOffset, srcAllocAlignment);</div>
+<div class="line"><a name="l14179"></a><span class="lineno">14179</span>&#160;<span class="keywordtype">bool</span> VmaBlockVector::IsBufferImageGranularityConflictPossible()<span class="keyword"> const</span></div>
+<div class="line"><a name="l14180"></a><span class="lineno">14180</span>&#160;<span class="keyword"></span>{</div>
+<div class="line"><a name="l14181"></a><span class="lineno">14181</span>&#160;    <span class="keywordflow">if</span>(m_BufferImageGranularity == 1)</div>
+<div class="line"><a name="l14182"></a><span class="lineno">14182</span>&#160;    {</div>
+<div class="line"><a name="l14183"></a><span class="lineno">14183</span>&#160;        <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
+<div class="line"><a name="l14184"></a><span class="lineno">14184</span>&#160;    }</div>
+<div class="line"><a name="l14185"></a><span class="lineno">14185</span>&#160;    VmaSuballocationType lastSuballocType = VMA_SUBALLOCATION_TYPE_FREE;</div>
+<div class="line"><a name="l14186"></a><span class="lineno">14186</span>&#160;    <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> i = 0, count = m_Blocks.size(); i &lt; count; ++i)</div>
+<div class="line"><a name="l14187"></a><span class="lineno">14187</span>&#160;    {</div>
+<div class="line"><a name="l14188"></a><span class="lineno">14188</span>&#160;        VmaDeviceMemoryBlock* <span class="keyword">const</span> pBlock = m_Blocks[i];</div>
+<div class="line"><a name="l14189"></a><span class="lineno">14189</span>&#160;        VMA_ASSERT(m_Algorithm == 0);</div>
+<div class="line"><a name="l14190"></a><span class="lineno">14190</span>&#160;        VmaBlockMetadata_Generic* <span class="keyword">const</span> pMetadata = (VmaBlockMetadata_Generic*)pBlock-&gt;m_pMetadata;</div>
+<div class="line"><a name="l14191"></a><span class="lineno">14191</span>&#160;        <span class="keywordflow">if</span>(pMetadata-&gt;IsBufferImageGranularityConflictPossible(m_BufferImageGranularity, lastSuballocType))</div>
+<div class="line"><a name="l14192"></a><span class="lineno">14192</span>&#160;        {</div>
+<div class="line"><a name="l14193"></a><span class="lineno">14193</span>&#160;            <span class="keywordflow">return</span> <span class="keyword">true</span>;</div>
+<div class="line"><a name="l14194"></a><span class="lineno">14194</span>&#160;        }</div>
+<div class="line"><a name="l14195"></a><span class="lineno">14195</span>&#160;    }</div>
+<div class="line"><a name="l14196"></a><span class="lineno">14196</span>&#160;    <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
+<div class="line"><a name="l14197"></a><span class="lineno">14197</span>&#160;}</div>
 <div class="line"><a name="l14198"></a><span class="lineno">14198</span>&#160; </div>
-<div class="line"><a name="l14199"></a><span class="lineno">14199</span>&#160;                <span class="comment">// If the allocation doesn&#39;t fit before the end of dstBlock, forward to next block.</span></div>
-<div class="line"><a name="l14200"></a><span class="lineno">14200</span>&#160;                <span class="keywordflow">while</span>(dstBlockInfoIndex &lt; srcBlockInfoIndex &amp;&amp;</div>
-<div class="line"><a name="l14201"></a><span class="lineno">14201</span>&#160;                    dstAllocOffset + srcAllocSize &gt; dstBlockSize)</div>
-<div class="line"><a name="l14202"></a><span class="lineno">14202</span>&#160;                {</div>
-<div class="line"><a name="l14203"></a><span class="lineno">14203</span>&#160;                    <span class="comment">// But before that, register remaining free space at the end of dst block.</span></div>
-<div class="line"><a name="l14204"></a><span class="lineno">14204</span>&#160;                    freeSpaceDb.Register(dstBlockInfoIndex, dstOffset, dstBlockSize - dstOffset);</div>
-<div class="line"><a name="l14205"></a><span class="lineno">14205</span>&#160; </div>
-<div class="line"><a name="l14206"></a><span class="lineno">14206</span>&#160;                    ++dstBlockInfoIndex;</div>
-<div class="line"><a name="l14207"></a><span class="lineno">14207</span>&#160;                    dstOrigBlockIndex = m_BlockInfos[dstBlockInfoIndex].origBlockIndex;</div>
-<div class="line"><a name="l14208"></a><span class="lineno">14208</span>&#160;                    pDstBlock = m_pBlockVector-&gt;GetBlock(dstOrigBlockIndex);</div>
-<div class="line"><a name="l14209"></a><span class="lineno">14209</span>&#160;                    pDstMetadata = (VmaBlockMetadata_Generic*)pDstBlock-&gt;m_pMetadata;</div>
-<div class="line"><a name="l14210"></a><span class="lineno">14210</span>&#160;                    dstBlockSize = pDstMetadata-&gt;GetSize();</div>
-<div class="line"><a name="l14211"></a><span class="lineno">14211</span>&#160;                    dstOffset = 0;</div>
-<div class="line"><a name="l14212"></a><span class="lineno">14212</span>&#160;                    dstAllocOffset = 0;</div>
-<div class="line"><a name="l14213"></a><span class="lineno">14213</span>&#160;                }</div>
-<div class="line"><a name="l14214"></a><span class="lineno">14214</span>&#160; </div>
-<div class="line"><a name="l14215"></a><span class="lineno">14215</span>&#160;                <span class="comment">// Same block</span></div>
-<div class="line"><a name="l14216"></a><span class="lineno">14216</span>&#160;                <span class="keywordflow">if</span>(dstBlockInfoIndex == srcBlockInfoIndex)</div>
-<div class="line"><a name="l14217"></a><span class="lineno">14217</span>&#160;                {</div>
-<div class="line"><a name="l14218"></a><span class="lineno">14218</span>&#160;                    VMA_ASSERT(dstAllocOffset &lt;= srcAllocOffset);</div>
-<div class="line"><a name="l14219"></a><span class="lineno">14219</span>&#160; </div>
-<div class="line"><a name="l14220"></a><span class="lineno">14220</span>&#160;                    <span class="keyword">const</span> <span class="keywordtype">bool</span> overlap = dstAllocOffset + srcAllocSize &gt; srcAllocOffset;</div>
-<div class="line"><a name="l14221"></a><span class="lineno">14221</span>&#160; </div>
-<div class="line"><a name="l14222"></a><span class="lineno">14222</span>&#160;                    <span class="keywordtype">bool</span> skipOver = overlap;</div>
-<div class="line"><a name="l14223"></a><span class="lineno">14223</span>&#160;                    <span class="keywordflow">if</span>(overlap &amp;&amp; m_OverlappingMoveSupported &amp;&amp; dstAllocOffset &lt; srcAllocOffset)</div>
-<div class="line"><a name="l14224"></a><span class="lineno">14224</span>&#160;                    {</div>
-<div class="line"><a name="l14225"></a><span class="lineno">14225</span>&#160;                        <span class="comment">// If destination and source place overlap, skip if it would move it</span></div>
-<div class="line"><a name="l14226"></a><span class="lineno">14226</span>&#160;                        <span class="comment">// by only &lt; 1/64 of its size.</span></div>
-<div class="line"><a name="l14227"></a><span class="lineno">14227</span>&#160;                        skipOver = (srcAllocOffset - dstAllocOffset) * 64 &lt; srcAllocSize;</div>
-<div class="line"><a name="l14228"></a><span class="lineno">14228</span>&#160;                    }</div>
-<div class="line"><a name="l14229"></a><span class="lineno">14229</span>&#160; </div>
-<div class="line"><a name="l14230"></a><span class="lineno">14230</span>&#160;                    <span class="keywordflow">if</span>(skipOver)</div>
-<div class="line"><a name="l14231"></a><span class="lineno">14231</span>&#160;                    {</div>
-<div class="line"><a name="l14232"></a><span class="lineno">14232</span>&#160;                        freeSpaceDb.Register(dstBlockInfoIndex, dstOffset, srcAllocOffset - dstOffset);</div>
-<div class="line"><a name="l14233"></a><span class="lineno">14233</span>&#160; </div>
-<div class="line"><a name="l14234"></a><span class="lineno">14234</span>&#160;                        dstOffset = srcAllocOffset + srcAllocSize;</div>
-<div class="line"><a name="l14235"></a><span class="lineno">14235</span>&#160;                        ++srcSuballocIt;</div>
-<div class="line"><a name="l14236"></a><span class="lineno">14236</span>&#160;                    }</div>
-<div class="line"><a name="l14237"></a><span class="lineno">14237</span>&#160;                    <span class="comment">// MOVE OPTION 1: Move the allocation inside the same block by decreasing offset.</span></div>
-<div class="line"><a name="l14238"></a><span class="lineno">14238</span>&#160;                    <span class="keywordflow">else</span></div>
-<div class="line"><a name="l14239"></a><span class="lineno">14239</span>&#160;                    {</div>
-<div class="line"><a name="l14240"></a><span class="lineno">14240</span>&#160;                        srcSuballocIt-&gt;offset = dstAllocOffset;</div>
-<div class="line"><a name="l14241"></a><span class="lineno">14241</span>&#160;                        srcSuballocIt-&gt;hAllocation-&gt;ChangeOffset(dstAllocOffset);</div>
-<div class="line"><a name="l14242"></a><span class="lineno">14242</span>&#160;                        dstOffset = dstAllocOffset + srcAllocSize;</div>
-<div class="line"><a name="l14243"></a><span class="lineno">14243</span>&#160;                        m_BytesMoved += srcAllocSize;</div>
-<div class="line"><a name="l14244"></a><span class="lineno">14244</span>&#160;                        ++m_AllocationsMoved;</div>
-<div class="line"><a name="l14245"></a><span class="lineno">14245</span>&#160;                        ++srcSuballocIt;</div>
-<div class="line"><a name="l14246"></a><span class="lineno">14246</span>&#160;                        </div>
-<div class="line"><a name="l14247"></a><span class="lineno">14247</span>&#160;                        move.srcBlockIndex = srcOrigBlockIndex;</div>
-<div class="line"><a name="l14248"></a><span class="lineno">14248</span>&#160;                        move.dstBlockIndex = dstOrigBlockIndex;</div>
-<div class="line"><a name="l14249"></a><span class="lineno">14249</span>&#160;                        move.srcOffset = srcAllocOffset;</div>
-<div class="line"><a name="l14250"></a><span class="lineno">14250</span>&#160;                        move.dstOffset = dstAllocOffset;</div>
-<div class="line"><a name="l14251"></a><span class="lineno">14251</span>&#160;                        move.size = srcAllocSize;</div>
-<div class="line"><a name="l14252"></a><span class="lineno">14252</span>&#160;                        </div>
-<div class="line"><a name="l14253"></a><span class="lineno">14253</span>&#160;                        moves.push_back(move);</div>
-<div class="line"><a name="l14254"></a><span class="lineno">14254</span>&#160;                    }</div>
-<div class="line"><a name="l14255"></a><span class="lineno">14255</span>&#160;                }</div>
-<div class="line"><a name="l14256"></a><span class="lineno">14256</span>&#160;                <span class="comment">// Different block</span></div>
-<div class="line"><a name="l14257"></a><span class="lineno">14257</span>&#160;                <span class="keywordflow">else</span></div>
-<div class="line"><a name="l14258"></a><span class="lineno">14258</span>&#160;                {</div>
-<div class="line"><a name="l14259"></a><span class="lineno">14259</span>&#160;                    <span class="comment">// MOVE OPTION 2: Move the allocation to a different block.</span></div>
+<div class="line"><a name="l14199"></a><span class="lineno">14199</span>&#160;<span class="keywordtype">void</span> VmaBlockVector::MakePoolAllocationsLost(</div>
+<div class="line"><a name="l14200"></a><span class="lineno">14200</span>&#160;    uint32_t currentFrameIndex,</div>
+<div class="line"><a name="l14201"></a><span class="lineno">14201</span>&#160;    <span class="keywordtype">size_t</span>* pLostAllocationCount)</div>
+<div class="line"><a name="l14202"></a><span class="lineno">14202</span>&#160;{</div>
+<div class="line"><a name="l14203"></a><span class="lineno">14203</span>&#160;    VmaMutexLockWrite lock(m_Mutex, m_hAllocator-&gt;m_UseMutex);</div>
+<div class="line"><a name="l14204"></a><span class="lineno">14204</span>&#160;    <span class="keywordtype">size_t</span> lostAllocationCount = 0;</div>
+<div class="line"><a name="l14205"></a><span class="lineno">14205</span>&#160;    <span class="keywordflow">for</span>(uint32_t blockIndex = 0; blockIndex &lt; m_Blocks.size(); ++blockIndex)</div>
+<div class="line"><a name="l14206"></a><span class="lineno">14206</span>&#160;    {</div>
+<div class="line"><a name="l14207"></a><span class="lineno">14207</span>&#160;        VmaDeviceMemoryBlock* <span class="keyword">const</span> pBlock = m_Blocks[blockIndex];</div>
+<div class="line"><a name="l14208"></a><span class="lineno">14208</span>&#160;        VMA_ASSERT(pBlock);</div>
+<div class="line"><a name="l14209"></a><span class="lineno">14209</span>&#160;        lostAllocationCount += pBlock-&gt;m_pMetadata-&gt;MakeAllocationsLost(currentFrameIndex, m_FrameInUseCount);</div>
+<div class="line"><a name="l14210"></a><span class="lineno">14210</span>&#160;    }</div>
+<div class="line"><a name="l14211"></a><span class="lineno">14211</span>&#160;    <span class="keywordflow">if</span>(pLostAllocationCount != VMA_NULL)</div>
+<div class="line"><a name="l14212"></a><span class="lineno">14212</span>&#160;    {</div>
+<div class="line"><a name="l14213"></a><span class="lineno">14213</span>&#160;        *pLostAllocationCount = lostAllocationCount;</div>
+<div class="line"><a name="l14214"></a><span class="lineno">14214</span>&#160;    }</div>
+<div class="line"><a name="l14215"></a><span class="lineno">14215</span>&#160;}</div>
+<div class="line"><a name="l14216"></a><span class="lineno">14216</span>&#160; </div>
+<div class="line"><a name="l14217"></a><span class="lineno">14217</span>&#160;VkResult VmaBlockVector::CheckCorruption()</div>
+<div class="line"><a name="l14218"></a><span class="lineno">14218</span>&#160;{</div>
+<div class="line"><a name="l14219"></a><span class="lineno">14219</span>&#160;    <span class="keywordflow">if</span>(!IsCorruptionDetectionEnabled())</div>
+<div class="line"><a name="l14220"></a><span class="lineno">14220</span>&#160;    {</div>
+<div class="line"><a name="l14221"></a><span class="lineno">14221</span>&#160;        <span class="keywordflow">return</span> VK_ERROR_FEATURE_NOT_PRESENT;</div>
+<div class="line"><a name="l14222"></a><span class="lineno">14222</span>&#160;    }</div>
+<div class="line"><a name="l14223"></a><span class="lineno">14223</span>&#160; </div>
+<div class="line"><a name="l14224"></a><span class="lineno">14224</span>&#160;    VmaMutexLockRead lock(m_Mutex, m_hAllocator-&gt;m_UseMutex);</div>
+<div class="line"><a name="l14225"></a><span class="lineno">14225</span>&#160;    <span class="keywordflow">for</span>(uint32_t blockIndex = 0; blockIndex &lt; m_Blocks.size(); ++blockIndex)</div>
+<div class="line"><a name="l14226"></a><span class="lineno">14226</span>&#160;    {</div>
+<div class="line"><a name="l14227"></a><span class="lineno">14227</span>&#160;        VmaDeviceMemoryBlock* <span class="keyword">const</span> pBlock = m_Blocks[blockIndex];</div>
+<div class="line"><a name="l14228"></a><span class="lineno">14228</span>&#160;        VMA_ASSERT(pBlock);</div>
+<div class="line"><a name="l14229"></a><span class="lineno">14229</span>&#160;        VkResult res = pBlock-&gt;CheckCorruption(m_hAllocator);</div>
+<div class="line"><a name="l14230"></a><span class="lineno">14230</span>&#160;        <span class="keywordflow">if</span>(res != VK_SUCCESS)</div>
+<div class="line"><a name="l14231"></a><span class="lineno">14231</span>&#160;        {</div>
+<div class="line"><a name="l14232"></a><span class="lineno">14232</span>&#160;            <span class="keywordflow">return</span> res;</div>
+<div class="line"><a name="l14233"></a><span class="lineno">14233</span>&#160;        }</div>
+<div class="line"><a name="l14234"></a><span class="lineno">14234</span>&#160;    }</div>
+<div class="line"><a name="l14235"></a><span class="lineno">14235</span>&#160;    <span class="keywordflow">return</span> VK_SUCCESS;</div>
+<div class="line"><a name="l14236"></a><span class="lineno">14236</span>&#160;}</div>
+<div class="line"><a name="l14237"></a><span class="lineno">14237</span>&#160; </div>
+<div class="line"><a name="l14238"></a><span class="lineno">14238</span>&#160;<span class="keywordtype">void</span> VmaBlockVector::AddStats(<a class="code" href="struct_vma_stats.html">VmaStats</a>* pStats)</div>
+<div class="line"><a name="l14239"></a><span class="lineno">14239</span>&#160;{</div>
+<div class="line"><a name="l14240"></a><span class="lineno">14240</span>&#160;    <span class="keyword">const</span> uint32_t memTypeIndex = m_MemoryTypeIndex;</div>
+<div class="line"><a name="l14241"></a><span class="lineno">14241</span>&#160;    <span class="keyword">const</span> uint32_t memHeapIndex = m_hAllocator-&gt;MemoryTypeIndexToHeapIndex(memTypeIndex);</div>
+<div class="line"><a name="l14242"></a><span class="lineno">14242</span>&#160; </div>
+<div class="line"><a name="l14243"></a><span class="lineno">14243</span>&#160;    VmaMutexLockRead lock(m_Mutex, m_hAllocator-&gt;m_UseMutex);</div>
+<div class="line"><a name="l14244"></a><span class="lineno">14244</span>&#160; </div>
+<div class="line"><a name="l14245"></a><span class="lineno">14245</span>&#160;    <span class="keywordflow">for</span>(uint32_t blockIndex = 0; blockIndex &lt; m_Blocks.size(); ++blockIndex)</div>
+<div class="line"><a name="l14246"></a><span class="lineno">14246</span>&#160;    {</div>
+<div class="line"><a name="l14247"></a><span class="lineno">14247</span>&#160;        <span class="keyword">const</span> VmaDeviceMemoryBlock* <span class="keyword">const</span> pBlock = m_Blocks[blockIndex];</div>
+<div class="line"><a name="l14248"></a><span class="lineno">14248</span>&#160;        VMA_ASSERT(pBlock);</div>
+<div class="line"><a name="l14249"></a><span class="lineno">14249</span>&#160;        VMA_HEAVY_ASSERT(pBlock-&gt;Validate());</div>
+<div class="line"><a name="l14250"></a><span class="lineno">14250</span>&#160;        <a class="code" href="struct_vma_stat_info.html">VmaStatInfo</a> allocationStatInfo;</div>
+<div class="line"><a name="l14251"></a><span class="lineno">14251</span>&#160;        pBlock-&gt;m_pMetadata-&gt;CalcAllocationStatInfo(allocationStatInfo);</div>
+<div class="line"><a name="l14252"></a><span class="lineno">14252</span>&#160;        VmaAddStatInfo(pStats-&gt;<a class="code" href="struct_vma_stats.html#a2e8f5b3353f2fefef3c27f29e245a1f9">total</a>, allocationStatInfo);</div>
+<div class="line"><a name="l14253"></a><span class="lineno">14253</span>&#160;        VmaAddStatInfo(pStats-&gt;<a class="code" href="struct_vma_stats.html#a13e3caf754be79352c42408756309331">memoryType</a>[memTypeIndex], allocationStatInfo);</div>
+<div class="line"><a name="l14254"></a><span class="lineno">14254</span>&#160;        VmaAddStatInfo(pStats-&gt;<a class="code" href="struct_vma_stats.html#a0e6611508c29a187f0fd14ff1a0329c0">memoryHeap</a>[memHeapIndex], allocationStatInfo);</div>
+<div class="line"><a name="l14255"></a><span class="lineno">14255</span>&#160;    }</div>
+<div class="line"><a name="l14256"></a><span class="lineno">14256</span>&#160;}</div>
+<div class="line"><a name="l14257"></a><span class="lineno">14257</span>&#160; </div>
+<div class="line"><a name="l14259"></a><span class="lineno">14259</span>&#160;<span class="comment">// VmaDefragmentationAlgorithm_Generic members definition</span></div>
 <div class="line"><a name="l14260"></a><span class="lineno">14260</span>&#160; </div>
-<div class="line"><a name="l14261"></a><span class="lineno">14261</span>&#160;                    VMA_ASSERT(dstBlockInfoIndex &lt; srcBlockInfoIndex);</div>
-<div class="line"><a name="l14262"></a><span class="lineno">14262</span>&#160;                    VMA_ASSERT(dstAllocOffset + srcAllocSize &lt;= dstBlockSize);</div>
-<div class="line"><a name="l14263"></a><span class="lineno">14263</span>&#160; </div>
-<div class="line"><a name="l14264"></a><span class="lineno">14264</span>&#160;                    VmaSuballocation suballoc = *srcSuballocIt;</div>
-<div class="line"><a name="l14265"></a><span class="lineno">14265</span>&#160;                    suballoc.offset = dstAllocOffset;</div>
-<div class="line"><a name="l14266"></a><span class="lineno">14266</span>&#160;                    suballoc.hAllocation-&gt;ChangeBlockAllocation(m_hAllocator, pDstBlock, dstAllocOffset);</div>
-<div class="line"><a name="l14267"></a><span class="lineno">14267</span>&#160;                    dstOffset = dstAllocOffset + srcAllocSize;</div>
-<div class="line"><a name="l14268"></a><span class="lineno">14268</span>&#160;                    m_BytesMoved += srcAllocSize;</div>
-<div class="line"><a name="l14269"></a><span class="lineno">14269</span>&#160;                    ++m_AllocationsMoved;</div>
-<div class="line"><a name="l14270"></a><span class="lineno">14270</span>&#160; </div>
-<div class="line"><a name="l14271"></a><span class="lineno">14271</span>&#160;                    VmaSuballocationList::iterator nextSuballocIt = srcSuballocIt;</div>
-<div class="line"><a name="l14272"></a><span class="lineno">14272</span>&#160;                    ++nextSuballocIt;</div>
-<div class="line"><a name="l14273"></a><span class="lineno">14273</span>&#160;                    pSrcMetadata-&gt;m_Suballocations.erase(srcSuballocIt);</div>
-<div class="line"><a name="l14274"></a><span class="lineno">14274</span>&#160;                    srcSuballocIt = nextSuballocIt;</div>
-<div class="line"><a name="l14275"></a><span class="lineno">14275</span>&#160; </div>
-<div class="line"><a name="l14276"></a><span class="lineno">14276</span>&#160;                    pDstMetadata-&gt;m_Suballocations.push_back(suballoc);</div>
-<div class="line"><a name="l14277"></a><span class="lineno">14277</span>&#160; </div>
-<div class="line"><a name="l14278"></a><span class="lineno">14278</span>&#160;                    move.srcBlockIndex = srcOrigBlockIndex;</div>
-<div class="line"><a name="l14279"></a><span class="lineno">14279</span>&#160;                    move.dstBlockIndex = dstOrigBlockIndex;</div>
-<div class="line"><a name="l14280"></a><span class="lineno">14280</span>&#160;                    move.srcOffset = srcAllocOffset;</div>
-<div class="line"><a name="l14281"></a><span class="lineno">14281</span>&#160;                    move.dstOffset = dstAllocOffset;</div>
-<div class="line"><a name="l14282"></a><span class="lineno">14282</span>&#160;                    move.size = srcAllocSize;</div>
-<div class="line"><a name="l14283"></a><span class="lineno">14283</span>&#160;                    </div>
-<div class="line"><a name="l14284"></a><span class="lineno">14284</span>&#160;                    moves.push_back(move);</div>
-<div class="line"><a name="l14285"></a><span class="lineno">14285</span>&#160;                }</div>
-<div class="line"><a name="l14286"></a><span class="lineno">14286</span>&#160;            }</div>
-<div class="line"><a name="l14287"></a><span class="lineno">14287</span>&#160;        }</div>
-<div class="line"><a name="l14288"></a><span class="lineno">14288</span>&#160;    }</div>
-<div class="line"><a name="l14289"></a><span class="lineno">14289</span>&#160; </div>
-<div class="line"><a name="l14290"></a><span class="lineno">14290</span>&#160;    m_BlockInfos.clear();</div>
-<div class="line"><a name="l14291"></a><span class="lineno">14291</span>&#160;    </div>
-<div class="line"><a name="l14292"></a><span class="lineno">14292</span>&#160;    PostprocessMetadata();</div>
-<div class="line"><a name="l14293"></a><span class="lineno">14293</span>&#160; </div>
-<div class="line"><a name="l14294"></a><span class="lineno">14294</span>&#160;    <span class="keywordflow">return</span> VK_SUCCESS;</div>
-<div class="line"><a name="l14295"></a><span class="lineno">14295</span>&#160;}</div>
-<div class="line"><a name="l14296"></a><span class="lineno">14296</span>&#160; </div>
-<div class="line"><a name="l14297"></a><span class="lineno">14297</span>&#160;<span class="keywordtype">void</span> VmaDefragmentationAlgorithm_Fast::PreprocessMetadata()</div>
-<div class="line"><a name="l14298"></a><span class="lineno">14298</span>&#160;{</div>
-<div class="line"><a name="l14299"></a><span class="lineno">14299</span>&#160;    <span class="keyword">const</span> <span class="keywordtype">size_t</span> blockCount = m_pBlockVector-&gt;GetBlockCount();</div>
-<div class="line"><a name="l14300"></a><span class="lineno">14300</span>&#160;    <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> blockIndex = 0; blockIndex &lt; blockCount; ++blockIndex)</div>
-<div class="line"><a name="l14301"></a><span class="lineno">14301</span>&#160;    {</div>
-<div class="line"><a name="l14302"></a><span class="lineno">14302</span>&#160;        VmaBlockMetadata_Generic* <span class="keyword">const</span> pMetadata =</div>
-<div class="line"><a name="l14303"></a><span class="lineno">14303</span>&#160;            (VmaBlockMetadata_Generic*)m_pBlockVector-&gt;GetBlock(blockIndex)-&gt;m_pMetadata;</div>
-<div class="line"><a name="l14304"></a><span class="lineno">14304</span>&#160;        pMetadata-&gt;m_FreeCount = 0;</div>
-<div class="line"><a name="l14305"></a><span class="lineno">14305</span>&#160;        pMetadata-&gt;m_SumFreeSize = pMetadata-&gt;GetSize();</div>
-<div class="line"><a name="l14306"></a><span class="lineno">14306</span>&#160;        pMetadata-&gt;m_FreeSuballocationsBySize.clear();</div>
-<div class="line"><a name="l14307"></a><span class="lineno">14307</span>&#160;        <span class="keywordflow">for</span>(VmaSuballocationList::iterator it = pMetadata-&gt;m_Suballocations.begin();</div>
-<div class="line"><a name="l14308"></a><span class="lineno">14308</span>&#160;            it != pMetadata-&gt;m_Suballocations.end(); )</div>
-<div class="line"><a name="l14309"></a><span class="lineno">14309</span>&#160;        {</div>
-<div class="line"><a name="l14310"></a><span class="lineno">14310</span>&#160;            <span class="keywordflow">if</span>(it-&gt;type == VMA_SUBALLOCATION_TYPE_FREE)</div>
-<div class="line"><a name="l14311"></a><span class="lineno">14311</span>&#160;            {</div>
-<div class="line"><a name="l14312"></a><span class="lineno">14312</span>&#160;                VmaSuballocationList::iterator nextIt = it;</div>
-<div class="line"><a name="l14313"></a><span class="lineno">14313</span>&#160;                ++nextIt;</div>
-<div class="line"><a name="l14314"></a><span class="lineno">14314</span>&#160;                pMetadata-&gt;m_Suballocations.erase(it);</div>
-<div class="line"><a name="l14315"></a><span class="lineno">14315</span>&#160;                it = nextIt;</div>
-<div class="line"><a name="l14316"></a><span class="lineno">14316</span>&#160;            }</div>
-<div class="line"><a name="l14317"></a><span class="lineno">14317</span>&#160;            <span class="keywordflow">else</span></div>
-<div class="line"><a name="l14318"></a><span class="lineno">14318</span>&#160;            {</div>
-<div class="line"><a name="l14319"></a><span class="lineno">14319</span>&#160;                ++it;</div>
-<div class="line"><a name="l14320"></a><span class="lineno">14320</span>&#160;            }</div>
-<div class="line"><a name="l14321"></a><span class="lineno">14321</span>&#160;        }</div>
-<div class="line"><a name="l14322"></a><span class="lineno">14322</span>&#160;    }</div>
-<div class="line"><a name="l14323"></a><span class="lineno">14323</span>&#160;}</div>
-<div class="line"><a name="l14324"></a><span class="lineno">14324</span>&#160; </div>
-<div class="line"><a name="l14325"></a><span class="lineno">14325</span>&#160;<span class="keywordtype">void</span> VmaDefragmentationAlgorithm_Fast::PostprocessMetadata()</div>
-<div class="line"><a name="l14326"></a><span class="lineno">14326</span>&#160;{</div>
-<div class="line"><a name="l14327"></a><span class="lineno">14327</span>&#160;    <span class="keyword">const</span> <span class="keywordtype">size_t</span> blockCount = m_pBlockVector-&gt;GetBlockCount();</div>
-<div class="line"><a name="l14328"></a><span class="lineno">14328</span>&#160;    <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> blockIndex = 0; blockIndex &lt; blockCount; ++blockIndex)</div>
-<div class="line"><a name="l14329"></a><span class="lineno">14329</span>&#160;    {</div>
-<div class="line"><a name="l14330"></a><span class="lineno">14330</span>&#160;        VmaBlockMetadata_Generic* <span class="keyword">const</span> pMetadata =</div>
-<div class="line"><a name="l14331"></a><span class="lineno">14331</span>&#160;            (VmaBlockMetadata_Generic*)m_pBlockVector-&gt;GetBlock(blockIndex)-&gt;m_pMetadata;</div>
-<div class="line"><a name="l14332"></a><span class="lineno">14332</span>&#160;        <span class="keyword">const</span> VkDeviceSize blockSize = pMetadata-&gt;GetSize();</div>
-<div class="line"><a name="l14333"></a><span class="lineno">14333</span>&#160;        </div>
-<div class="line"><a name="l14334"></a><span class="lineno">14334</span>&#160;        <span class="comment">// No allocations in this block - entire area is free.</span></div>
-<div class="line"><a name="l14335"></a><span class="lineno">14335</span>&#160;        <span class="keywordflow">if</span>(pMetadata-&gt;m_Suballocations.empty())</div>
-<div class="line"><a name="l14336"></a><span class="lineno">14336</span>&#160;        {</div>
-<div class="line"><a name="l14337"></a><span class="lineno">14337</span>&#160;            pMetadata-&gt;m_FreeCount = 1;</div>
-<div class="line"><a name="l14338"></a><span class="lineno">14338</span>&#160;            <span class="comment">//pMetadata-&gt;m_SumFreeSize is already set to blockSize.</span></div>
-<div class="line"><a name="l14339"></a><span class="lineno">14339</span>&#160;            VmaSuballocation suballoc = {</div>
-<div class="line"><a name="l14340"></a><span class="lineno">14340</span>&#160;                0, <span class="comment">// offset</span></div>
-<div class="line"><a name="l14341"></a><span class="lineno">14341</span>&#160;                blockSize, <span class="comment">// size</span></div>
-<div class="line"><a name="l14342"></a><span class="lineno">14342</span>&#160;                VMA_NULL, <span class="comment">// hAllocation</span></div>
-<div class="line"><a name="l14343"></a><span class="lineno">14343</span>&#160;                VMA_SUBALLOCATION_TYPE_FREE };</div>
-<div class="line"><a name="l14344"></a><span class="lineno">14344</span>&#160;            pMetadata-&gt;m_Suballocations.push_back(suballoc);</div>
-<div class="line"><a name="l14345"></a><span class="lineno">14345</span>&#160;            pMetadata-&gt;RegisterFreeSuballocation(pMetadata-&gt;m_Suballocations.begin());</div>
-<div class="line"><a name="l14346"></a><span class="lineno">14346</span>&#160;        }</div>
-<div class="line"><a name="l14347"></a><span class="lineno">14347</span>&#160;        <span class="comment">// There are some allocations in this block.</span></div>
-<div class="line"><a name="l14348"></a><span class="lineno">14348</span>&#160;        <span class="keywordflow">else</span></div>
-<div class="line"><a name="l14349"></a><span class="lineno">14349</span>&#160;        {</div>
-<div class="line"><a name="l14350"></a><span class="lineno">14350</span>&#160;            VkDeviceSize offset = 0;</div>
-<div class="line"><a name="l14351"></a><span class="lineno">14351</span>&#160;            VmaSuballocationList::iterator it;</div>
-<div class="line"><a name="l14352"></a><span class="lineno">14352</span>&#160;            <span class="keywordflow">for</span>(it = pMetadata-&gt;m_Suballocations.begin();</div>
-<div class="line"><a name="l14353"></a><span class="lineno">14353</span>&#160;                it != pMetadata-&gt;m_Suballocations.end();</div>
-<div class="line"><a name="l14354"></a><span class="lineno">14354</span>&#160;                ++it)</div>
-<div class="line"><a name="l14355"></a><span class="lineno">14355</span>&#160;            {</div>
-<div class="line"><a name="l14356"></a><span class="lineno">14356</span>&#160;                VMA_ASSERT(it-&gt;type != VMA_SUBALLOCATION_TYPE_FREE);</div>
-<div class="line"><a name="l14357"></a><span class="lineno">14357</span>&#160;                VMA_ASSERT(it-&gt;offset &gt;= offset);</div>
-<div class="line"><a name="l14358"></a><span class="lineno">14358</span>&#160; </div>
-<div class="line"><a name="l14359"></a><span class="lineno">14359</span>&#160;                <span class="comment">// Need to insert preceding free space.</span></div>
-<div class="line"><a name="l14360"></a><span class="lineno">14360</span>&#160;                <span class="keywordflow">if</span>(it-&gt;offset &gt; offset)</div>
+<div class="line"><a name="l14261"></a><span class="lineno">14261</span>&#160;VmaDefragmentationAlgorithm_Generic::VmaDefragmentationAlgorithm_Generic(</div>
+<div class="line"><a name="l14262"></a><span class="lineno">14262</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator,</div>
+<div class="line"><a name="l14263"></a><span class="lineno">14263</span>&#160;    VmaBlockVector* pBlockVector,</div>
+<div class="line"><a name="l14264"></a><span class="lineno">14264</span>&#160;    uint32_t currentFrameIndex,</div>
+<div class="line"><a name="l14265"></a><span class="lineno">14265</span>&#160;    <span class="keywordtype">bool</span> overlappingMoveSupported) :</div>
+<div class="line"><a name="l14266"></a><span class="lineno">14266</span>&#160;    VmaDefragmentationAlgorithm(hAllocator, pBlockVector, currentFrameIndex),</div>
+<div class="line"><a name="l14267"></a><span class="lineno">14267</span>&#160;    m_AllocationCount(0),</div>
+<div class="line"><a name="l14268"></a><span class="lineno">14268</span>&#160;    m_AllAllocations(false),</div>
+<div class="line"><a name="l14269"></a><span class="lineno">14269</span>&#160;    m_BytesMoved(0),</div>
+<div class="line"><a name="l14270"></a><span class="lineno">14270</span>&#160;    m_AllocationsMoved(0),</div>
+<div class="line"><a name="l14271"></a><span class="lineno">14271</span>&#160;    m_Blocks(VmaStlAllocator&lt;BlockInfo*&gt;(hAllocator-&gt;GetAllocationCallbacks()))</div>
+<div class="line"><a name="l14272"></a><span class="lineno">14272</span>&#160;{</div>
+<div class="line"><a name="l14273"></a><span class="lineno">14273</span>&#160;    <span class="comment">// Create block info for each block.</span></div>
+<div class="line"><a name="l14274"></a><span class="lineno">14274</span>&#160;    <span class="keyword">const</span> <span class="keywordtype">size_t</span> blockCount = m_pBlockVector-&gt;m_Blocks.size();</div>
+<div class="line"><a name="l14275"></a><span class="lineno">14275</span>&#160;    <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> blockIndex = 0; blockIndex &lt; blockCount; ++blockIndex)</div>
+<div class="line"><a name="l14276"></a><span class="lineno">14276</span>&#160;    {</div>
+<div class="line"><a name="l14277"></a><span class="lineno">14277</span>&#160;        BlockInfo* pBlockInfo = vma_new(m_hAllocator, BlockInfo)(m_hAllocator-&gt;GetAllocationCallbacks());</div>
+<div class="line"><a name="l14278"></a><span class="lineno">14278</span>&#160;        pBlockInfo-&gt;m_OriginalBlockIndex = blockIndex;</div>
+<div class="line"><a name="l14279"></a><span class="lineno">14279</span>&#160;        pBlockInfo-&gt;m_pBlock = m_pBlockVector-&gt;m_Blocks[blockIndex];</div>
+<div class="line"><a name="l14280"></a><span class="lineno">14280</span>&#160;        m_Blocks.push_back(pBlockInfo);</div>
+<div class="line"><a name="l14281"></a><span class="lineno">14281</span>&#160;    }</div>
+<div class="line"><a name="l14282"></a><span class="lineno">14282</span>&#160; </div>
+<div class="line"><a name="l14283"></a><span class="lineno">14283</span>&#160;    <span class="comment">// Sort them by m_pBlock pointer value.</span></div>
+<div class="line"><a name="l14284"></a><span class="lineno">14284</span>&#160;    VMA_SORT(m_Blocks.begin(), m_Blocks.end(), BlockPointerLess());</div>
+<div class="line"><a name="l14285"></a><span class="lineno">14285</span>&#160;}</div>
+<div class="line"><a name="l14286"></a><span class="lineno">14286</span>&#160; </div>
+<div class="line"><a name="l14287"></a><span class="lineno">14287</span>&#160;VmaDefragmentationAlgorithm_Generic::~VmaDefragmentationAlgorithm_Generic()</div>
+<div class="line"><a name="l14288"></a><span class="lineno">14288</span>&#160;{</div>
+<div class="line"><a name="l14289"></a><span class="lineno">14289</span>&#160;    <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> i = m_Blocks.size(); i--; )</div>
+<div class="line"><a name="l14290"></a><span class="lineno">14290</span>&#160;    {</div>
+<div class="line"><a name="l14291"></a><span class="lineno">14291</span>&#160;        vma_delete(m_hAllocator, m_Blocks[i]);</div>
+<div class="line"><a name="l14292"></a><span class="lineno">14292</span>&#160;    }</div>
+<div class="line"><a name="l14293"></a><span class="lineno">14293</span>&#160;}</div>
+<div class="line"><a name="l14294"></a><span class="lineno">14294</span>&#160; </div>
+<div class="line"><a name="l14295"></a><span class="lineno">14295</span>&#160;<span class="keywordtype">void</span> VmaDefragmentationAlgorithm_Generic::AddAllocation(<a class="code" href="struct_vma_allocation.html">VmaAllocation</a> hAlloc, VkBool32* pChanged)</div>
+<div class="line"><a name="l14296"></a><span class="lineno">14296</span>&#160;{</div>
+<div class="line"><a name="l14297"></a><span class="lineno">14297</span>&#160;    <span class="comment">// Now as we are inside VmaBlockVector::m_Mutex, we can make final check if this allocation was not lost.</span></div>
+<div class="line"><a name="l14298"></a><span class="lineno">14298</span>&#160;    <span class="keywordflow">if</span>(hAlloc-&gt;GetLastUseFrameIndex() != VMA_FRAME_INDEX_LOST)</div>
+<div class="line"><a name="l14299"></a><span class="lineno">14299</span>&#160;    {</div>
+<div class="line"><a name="l14300"></a><span class="lineno">14300</span>&#160;        VmaDeviceMemoryBlock* pBlock = hAlloc-&gt;GetBlock();</div>
+<div class="line"><a name="l14301"></a><span class="lineno">14301</span>&#160;        BlockInfoVector::iterator it = VmaBinaryFindFirstNotLess(m_Blocks.begin(), m_Blocks.end(), pBlock, BlockPointerLess());</div>
+<div class="line"><a name="l14302"></a><span class="lineno">14302</span>&#160;        <span class="keywordflow">if</span>(it != m_Blocks.end() &amp;&amp; (*it)-&gt;m_pBlock == pBlock)</div>
+<div class="line"><a name="l14303"></a><span class="lineno">14303</span>&#160;        {</div>
+<div class="line"><a name="l14304"></a><span class="lineno">14304</span>&#160;            AllocationInfo allocInfo = AllocationInfo(hAlloc, pChanged);</div>
+<div class="line"><a name="l14305"></a><span class="lineno">14305</span>&#160;            (*it)-&gt;m_Allocations.push_back(allocInfo);</div>
+<div class="line"><a name="l14306"></a><span class="lineno">14306</span>&#160;        }</div>
+<div class="line"><a name="l14307"></a><span class="lineno">14307</span>&#160;        <span class="keywordflow">else</span></div>
+<div class="line"><a name="l14308"></a><span class="lineno">14308</span>&#160;        {</div>
+<div class="line"><a name="l14309"></a><span class="lineno">14309</span>&#160;            VMA_ASSERT(0);</div>
+<div class="line"><a name="l14310"></a><span class="lineno">14310</span>&#160;        }</div>
+<div class="line"><a name="l14311"></a><span class="lineno">14311</span>&#160; </div>
+<div class="line"><a name="l14312"></a><span class="lineno">14312</span>&#160;        ++m_AllocationCount;</div>
+<div class="line"><a name="l14313"></a><span class="lineno">14313</span>&#160;    }</div>
+<div class="line"><a name="l14314"></a><span class="lineno">14314</span>&#160;}</div>
+<div class="line"><a name="l14315"></a><span class="lineno">14315</span>&#160; </div>
+<div class="line"><a name="l14316"></a><span class="lineno">14316</span>&#160;VkResult VmaDefragmentationAlgorithm_Generic::DefragmentRound(</div>
+<div class="line"><a name="l14317"></a><span class="lineno">14317</span>&#160;    VmaVector&lt; VmaDefragmentationMove, VmaStlAllocator&lt;VmaDefragmentationMove&gt; &gt;&amp; moves,</div>
+<div class="line"><a name="l14318"></a><span class="lineno">14318</span>&#160;    VkDeviceSize maxBytesToMove,</div>
+<div class="line"><a name="l14319"></a><span class="lineno">14319</span>&#160;    uint32_t maxAllocationsToMove,</div>
+<div class="line"><a name="l14320"></a><span class="lineno">14320</span>&#160;    <span class="keywordtype">bool</span> freeOldAllocations)</div>
+<div class="line"><a name="l14321"></a><span class="lineno">14321</span>&#160;{</div>
+<div class="line"><a name="l14322"></a><span class="lineno">14322</span>&#160;    <span class="keywordflow">if</span>(m_Blocks.empty())</div>
+<div class="line"><a name="l14323"></a><span class="lineno">14323</span>&#160;    {</div>
+<div class="line"><a name="l14324"></a><span class="lineno">14324</span>&#160;        <span class="keywordflow">return</span> VK_SUCCESS;</div>
+<div class="line"><a name="l14325"></a><span class="lineno">14325</span>&#160;    }</div>
+<div class="line"><a name="l14326"></a><span class="lineno">14326</span>&#160; </div>
+<div class="line"><a name="l14327"></a><span class="lineno">14327</span>&#160;    <span class="comment">// This is a choice based on research.</span></div>
+<div class="line"><a name="l14328"></a><span class="lineno">14328</span>&#160;    <span class="comment">// Option 1:</span></div>
+<div class="line"><a name="l14329"></a><span class="lineno">14329</span>&#160;    uint32_t strategy = <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a0729e932b7ea170e3a128cad96c5cf6d">VMA_ALLOCATION_CREATE_STRATEGY_MIN_TIME_BIT</a>;</div>
+<div class="line"><a name="l14330"></a><span class="lineno">14330</span>&#160;    <span class="comment">// Option 2:</span></div>
+<div class="line"><a name="l14331"></a><span class="lineno">14331</span>&#160;    <span class="comment">//uint32_t strategy = VMA_ALLOCATION_CREATE_STRATEGY_MIN_MEMORY_BIT;</span></div>
+<div class="line"><a name="l14332"></a><span class="lineno">14332</span>&#160;    <span class="comment">// Option 3:</span></div>
+<div class="line"><a name="l14333"></a><span class="lineno">14333</span>&#160;    <span class="comment">//uint32_t strategy = VMA_ALLOCATION_CREATE_STRATEGY_MIN_FRAGMENTATION_BIT;</span></div>
+<div class="line"><a name="l14334"></a><span class="lineno">14334</span>&#160; </div>
+<div class="line"><a name="l14335"></a><span class="lineno">14335</span>&#160;    <span class="keywordtype">size_t</span> srcBlockMinIndex = 0;</div>
+<div class="line"><a name="l14336"></a><span class="lineno">14336</span>&#160;    <span class="comment">// When FAST_ALGORITHM, move allocations from only last out of blocks that contain non-movable allocations.</span></div>
+<div class="line"><a name="l14337"></a><span class="lineno">14337</span>&#160;    <span class="comment">/*</span></div>
+<div class="line"><a name="l14338"></a><span class="lineno">14338</span>&#160;<span class="comment">    if(m_AlgorithmFlags &amp; VMA_DEFRAGMENTATION_FAST_ALGORITHM_BIT)</span></div>
+<div class="line"><a name="l14339"></a><span class="lineno">14339</span>&#160;<span class="comment">    {</span></div>
+<div class="line"><a name="l14340"></a><span class="lineno">14340</span>&#160;<span class="comment">        const size_t blocksWithNonMovableCount = CalcBlocksWithNonMovableCount();</span></div>
+<div class="line"><a name="l14341"></a><span class="lineno">14341</span>&#160;<span class="comment">        if(blocksWithNonMovableCount &gt; 0)</span></div>
+<div class="line"><a name="l14342"></a><span class="lineno">14342</span>&#160;<span class="comment">        {</span></div>
+<div class="line"><a name="l14343"></a><span class="lineno">14343</span>&#160;<span class="comment">            srcBlockMinIndex = blocksWithNonMovableCount - 1;</span></div>
+<div class="line"><a name="l14344"></a><span class="lineno">14344</span>&#160;<span class="comment">        }</span></div>
+<div class="line"><a name="l14345"></a><span class="lineno">14345</span>&#160;<span class="comment">    }</span></div>
+<div class="line"><a name="l14346"></a><span class="lineno">14346</span>&#160;<span class="comment">    */</span></div>
+<div class="line"><a name="l14347"></a><span class="lineno">14347</span>&#160; </div>
+<div class="line"><a name="l14348"></a><span class="lineno">14348</span>&#160;    <span class="keywordtype">size_t</span> srcBlockIndex = m_Blocks.size() - 1;</div>
+<div class="line"><a name="l14349"></a><span class="lineno">14349</span>&#160;    <span class="keywordtype">size_t</span> srcAllocIndex = SIZE_MAX;</div>
+<div class="line"><a name="l14350"></a><span class="lineno">14350</span>&#160;    <span class="keywordflow">for</span>(;;)</div>
+<div class="line"><a name="l14351"></a><span class="lineno">14351</span>&#160;    {</div>
+<div class="line"><a name="l14352"></a><span class="lineno">14352</span>&#160;        <span class="comment">// 1. Find next allocation to move.</span></div>
+<div class="line"><a name="l14353"></a><span class="lineno">14353</span>&#160;        <span class="comment">// 1.1. Start from last to first m_Blocks - they are sorted from most &quot;destination&quot; to most &quot;source&quot;.</span></div>
+<div class="line"><a name="l14354"></a><span class="lineno">14354</span>&#160;        <span class="comment">// 1.2. Then start from last to first m_Allocations.</span></div>
+<div class="line"><a name="l14355"></a><span class="lineno">14355</span>&#160;        <span class="keywordflow">while</span>(srcAllocIndex &gt;= m_Blocks[srcBlockIndex]-&gt;m_Allocations.size())</div>
+<div class="line"><a name="l14356"></a><span class="lineno">14356</span>&#160;        {</div>
+<div class="line"><a name="l14357"></a><span class="lineno">14357</span>&#160;            <span class="keywordflow">if</span>(m_Blocks[srcBlockIndex]-&gt;m_Allocations.empty())</div>
+<div class="line"><a name="l14358"></a><span class="lineno">14358</span>&#160;            {</div>
+<div class="line"><a name="l14359"></a><span class="lineno">14359</span>&#160;                <span class="comment">// Finished: no more allocations to process.</span></div>
+<div class="line"><a name="l14360"></a><span class="lineno">14360</span>&#160;                <span class="keywordflow">if</span>(srcBlockIndex == srcBlockMinIndex)</div>
 <div class="line"><a name="l14361"></a><span class="lineno">14361</span>&#160;                {</div>
-<div class="line"><a name="l14362"></a><span class="lineno">14362</span>&#160;                    ++pMetadata-&gt;m_FreeCount;</div>
-<div class="line"><a name="l14363"></a><span class="lineno">14363</span>&#160;                    <span class="keyword">const</span> VkDeviceSize freeSize = it-&gt;offset - offset;</div>
-<div class="line"><a name="l14364"></a><span class="lineno">14364</span>&#160;                    VmaSuballocation suballoc = {</div>
-<div class="line"><a name="l14365"></a><span class="lineno">14365</span>&#160;                        offset, <span class="comment">// offset</span></div>
-<div class="line"><a name="l14366"></a><span class="lineno">14366</span>&#160;                        freeSize, <span class="comment">// size</span></div>
-<div class="line"><a name="l14367"></a><span class="lineno">14367</span>&#160;                        VMA_NULL, <span class="comment">// hAllocation</span></div>
-<div class="line"><a name="l14368"></a><span class="lineno">14368</span>&#160;                        VMA_SUBALLOCATION_TYPE_FREE };</div>
-<div class="line"><a name="l14369"></a><span class="lineno">14369</span>&#160;                    VmaSuballocationList::iterator precedingFreeIt = pMetadata-&gt;m_Suballocations.insert(it, suballoc);</div>
-<div class="line"><a name="l14370"></a><span class="lineno">14370</span>&#160;                    <span class="keywordflow">if</span>(freeSize &gt;= VMA_MIN_FREE_SUBALLOCATION_SIZE_TO_REGISTER)</div>
-<div class="line"><a name="l14371"></a><span class="lineno">14371</span>&#160;                    {</div>
-<div class="line"><a name="l14372"></a><span class="lineno">14372</span>&#160;                        pMetadata-&gt;m_FreeSuballocationsBySize.push_back(precedingFreeIt);</div>
-<div class="line"><a name="l14373"></a><span class="lineno">14373</span>&#160;                    }</div>
-<div class="line"><a name="l14374"></a><span class="lineno">14374</span>&#160;                }</div>
+<div class="line"><a name="l14362"></a><span class="lineno">14362</span>&#160;                    <span class="keywordflow">return</span> VK_SUCCESS;</div>
+<div class="line"><a name="l14363"></a><span class="lineno">14363</span>&#160;                }</div>
+<div class="line"><a name="l14364"></a><span class="lineno">14364</span>&#160;                <span class="keywordflow">else</span></div>
+<div class="line"><a name="l14365"></a><span class="lineno">14365</span>&#160;                {</div>
+<div class="line"><a name="l14366"></a><span class="lineno">14366</span>&#160;                    --srcBlockIndex;</div>
+<div class="line"><a name="l14367"></a><span class="lineno">14367</span>&#160;                    srcAllocIndex = SIZE_MAX;</div>
+<div class="line"><a name="l14368"></a><span class="lineno">14368</span>&#160;                }</div>
+<div class="line"><a name="l14369"></a><span class="lineno">14369</span>&#160;            }</div>
+<div class="line"><a name="l14370"></a><span class="lineno">14370</span>&#160;            <span class="keywordflow">else</span></div>
+<div class="line"><a name="l14371"></a><span class="lineno">14371</span>&#160;            {</div>
+<div class="line"><a name="l14372"></a><span class="lineno">14372</span>&#160;                srcAllocIndex = m_Blocks[srcBlockIndex]-&gt;m_Allocations.size() - 1;</div>
+<div class="line"><a name="l14373"></a><span class="lineno">14373</span>&#160;            }</div>
+<div class="line"><a name="l14374"></a><span class="lineno">14374</span>&#160;        }</div>
 <div class="line"><a name="l14375"></a><span class="lineno">14375</span>&#160; </div>
-<div class="line"><a name="l14376"></a><span class="lineno">14376</span>&#160;                pMetadata-&gt;m_SumFreeSize -= it-&gt;size;</div>
-<div class="line"><a name="l14377"></a><span class="lineno">14377</span>&#160;                offset = it-&gt;offset + it-&gt;size;</div>
-<div class="line"><a name="l14378"></a><span class="lineno">14378</span>&#160;            }</div>
-<div class="line"><a name="l14379"></a><span class="lineno">14379</span>&#160; </div>
-<div class="line"><a name="l14380"></a><span class="lineno">14380</span>&#160;            <span class="comment">// Need to insert trailing free space.</span></div>
-<div class="line"><a name="l14381"></a><span class="lineno">14381</span>&#160;            <span class="keywordflow">if</span>(offset &lt; blockSize)</div>
-<div class="line"><a name="l14382"></a><span class="lineno">14382</span>&#160;            {</div>
-<div class="line"><a name="l14383"></a><span class="lineno">14383</span>&#160;                ++pMetadata-&gt;m_FreeCount;</div>
-<div class="line"><a name="l14384"></a><span class="lineno">14384</span>&#160;                <span class="keyword">const</span> VkDeviceSize freeSize = blockSize - offset;</div>
-<div class="line"><a name="l14385"></a><span class="lineno">14385</span>&#160;                VmaSuballocation suballoc = {</div>
-<div class="line"><a name="l14386"></a><span class="lineno">14386</span>&#160;                    offset, <span class="comment">// offset</span></div>
-<div class="line"><a name="l14387"></a><span class="lineno">14387</span>&#160;                    freeSize, <span class="comment">// size</span></div>
-<div class="line"><a name="l14388"></a><span class="lineno">14388</span>&#160;                    VMA_NULL, <span class="comment">// hAllocation</span></div>
-<div class="line"><a name="l14389"></a><span class="lineno">14389</span>&#160;                    VMA_SUBALLOCATION_TYPE_FREE };</div>
-<div class="line"><a name="l14390"></a><span class="lineno">14390</span>&#160;                VMA_ASSERT(it == pMetadata-&gt;m_Suballocations.end());</div>
-<div class="line"><a name="l14391"></a><span class="lineno">14391</span>&#160;                VmaSuballocationList::iterator trailingFreeIt = pMetadata-&gt;m_Suballocations.insert(it, suballoc);</div>
-<div class="line"><a name="l14392"></a><span class="lineno">14392</span>&#160;                <span class="keywordflow">if</span>(freeSize &gt; VMA_MIN_FREE_SUBALLOCATION_SIZE_TO_REGISTER)</div>
-<div class="line"><a name="l14393"></a><span class="lineno">14393</span>&#160;                {</div>
-<div class="line"><a name="l14394"></a><span class="lineno">14394</span>&#160;                    pMetadata-&gt;m_FreeSuballocationsBySize.push_back(trailingFreeIt);</div>
-<div class="line"><a name="l14395"></a><span class="lineno">14395</span>&#160;                }</div>
-<div class="line"><a name="l14396"></a><span class="lineno">14396</span>&#160;            }</div>
-<div class="line"><a name="l14397"></a><span class="lineno">14397</span>&#160; </div>
-<div class="line"><a name="l14398"></a><span class="lineno">14398</span>&#160;            VMA_SORT(</div>
-<div class="line"><a name="l14399"></a><span class="lineno">14399</span>&#160;                pMetadata-&gt;m_FreeSuballocationsBySize.begin(),</div>
-<div class="line"><a name="l14400"></a><span class="lineno">14400</span>&#160;                pMetadata-&gt;m_FreeSuballocationsBySize.end(),</div>
-<div class="line"><a name="l14401"></a><span class="lineno">14401</span>&#160;                VmaSuballocationItemSizeLess());</div>
-<div class="line"><a name="l14402"></a><span class="lineno">14402</span>&#160;        }</div>
-<div class="line"><a name="l14403"></a><span class="lineno">14403</span>&#160; </div>
-<div class="line"><a name="l14404"></a><span class="lineno">14404</span>&#160;        VMA_HEAVY_ASSERT(pMetadata-&gt;Validate());</div>
-<div class="line"><a name="l14405"></a><span class="lineno">14405</span>&#160;    }</div>
-<div class="line"><a name="l14406"></a><span class="lineno">14406</span>&#160;}</div>
-<div class="line"><a name="l14407"></a><span class="lineno">14407</span>&#160; </div>
-<div class="line"><a name="l14408"></a><span class="lineno">14408</span>&#160;<span class="keywordtype">void</span> VmaDefragmentationAlgorithm_Fast::InsertSuballoc(VmaBlockMetadata_Generic* pMetadata, <span class="keyword">const</span> VmaSuballocation&amp; suballoc)</div>
-<div class="line"><a name="l14409"></a><span class="lineno">14409</span>&#160;{</div>
-<div class="line"><a name="l14410"></a><span class="lineno">14410</span>&#160;    <span class="comment">// TODO: Optimize somehow. Remember iterator instead of searching for it linearly.</span></div>
-<div class="line"><a name="l14411"></a><span class="lineno">14411</span>&#160;    VmaSuballocationList::iterator it = pMetadata-&gt;m_Suballocations.begin();</div>
-<div class="line"><a name="l14412"></a><span class="lineno">14412</span>&#160;    <span class="keywordflow">while</span>(it != pMetadata-&gt;m_Suballocations.end())</div>
-<div class="line"><a name="l14413"></a><span class="lineno">14413</span>&#160;    {</div>
-<div class="line"><a name="l14414"></a><span class="lineno">14414</span>&#160;        <span class="keywordflow">if</span>(it-&gt;offset &lt; suballoc.offset)</div>
-<div class="line"><a name="l14415"></a><span class="lineno">14415</span>&#160;        {</div>
-<div class="line"><a name="l14416"></a><span class="lineno">14416</span>&#160;            ++it;</div>
-<div class="line"><a name="l14417"></a><span class="lineno">14417</span>&#160;        }</div>
-<div class="line"><a name="l14418"></a><span class="lineno">14418</span>&#160;    }</div>
-<div class="line"><a name="l14419"></a><span class="lineno">14419</span>&#160;    pMetadata-&gt;m_Suballocations.insert(it, suballoc);</div>
-<div class="line"><a name="l14420"></a><span class="lineno">14420</span>&#160;}</div>
+<div class="line"><a name="l14376"></a><span class="lineno">14376</span>&#160;        BlockInfo* pSrcBlockInfo = m_Blocks[srcBlockIndex];</div>
+<div class="line"><a name="l14377"></a><span class="lineno">14377</span>&#160;        AllocationInfo&amp; allocInfo = pSrcBlockInfo-&gt;m_Allocations[srcAllocIndex];</div>
+<div class="line"><a name="l14378"></a><span class="lineno">14378</span>&#160; </div>
+<div class="line"><a name="l14379"></a><span class="lineno">14379</span>&#160;        <span class="keyword">const</span> VkDeviceSize size = allocInfo.m_hAllocation-&gt;GetSize();</div>
+<div class="line"><a name="l14380"></a><span class="lineno">14380</span>&#160;        <span class="keyword">const</span> VkDeviceSize srcOffset = allocInfo.m_hAllocation-&gt;GetOffset();</div>
+<div class="line"><a name="l14381"></a><span class="lineno">14381</span>&#160;        <span class="keyword">const</span> VkDeviceSize alignment = allocInfo.m_hAllocation-&gt;GetAlignment();</div>
+<div class="line"><a name="l14382"></a><span class="lineno">14382</span>&#160;        <span class="keyword">const</span> VmaSuballocationType suballocType = allocInfo.m_hAllocation-&gt;GetSuballocationType();</div>
+<div class="line"><a name="l14383"></a><span class="lineno">14383</span>&#160; </div>
+<div class="line"><a name="l14384"></a><span class="lineno">14384</span>&#160;        <span class="comment">// 2. Try to find new place for this allocation in preceding or current block.</span></div>
+<div class="line"><a name="l14385"></a><span class="lineno">14385</span>&#160;        <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> dstBlockIndex = 0; dstBlockIndex &lt;= srcBlockIndex; ++dstBlockIndex)</div>
+<div class="line"><a name="l14386"></a><span class="lineno">14386</span>&#160;        {</div>
+<div class="line"><a name="l14387"></a><span class="lineno">14387</span>&#160;            BlockInfo* pDstBlockInfo = m_Blocks[dstBlockIndex];</div>
+<div class="line"><a name="l14388"></a><span class="lineno">14388</span>&#160;            VmaAllocationRequest dstAllocRequest;</div>
+<div class="line"><a name="l14389"></a><span class="lineno">14389</span>&#160;            <span class="keywordflow">if</span>(pDstBlockInfo-&gt;m_pBlock-&gt;m_pMetadata-&gt;CreateAllocationRequest(</div>
+<div class="line"><a name="l14390"></a><span class="lineno">14390</span>&#160;                m_CurrentFrameIndex,</div>
+<div class="line"><a name="l14391"></a><span class="lineno">14391</span>&#160;                m_pBlockVector-&gt;GetFrameInUseCount(),</div>
+<div class="line"><a name="l14392"></a><span class="lineno">14392</span>&#160;                m_pBlockVector-&gt;GetBufferImageGranularity(),</div>
+<div class="line"><a name="l14393"></a><span class="lineno">14393</span>&#160;                size,</div>
+<div class="line"><a name="l14394"></a><span class="lineno">14394</span>&#160;                alignment,</div>
+<div class="line"><a name="l14395"></a><span class="lineno">14395</span>&#160;                <span class="keyword">false</span>, <span class="comment">// upperAddress</span></div>
+<div class="line"><a name="l14396"></a><span class="lineno">14396</span>&#160;                suballocType,</div>
+<div class="line"><a name="l14397"></a><span class="lineno">14397</span>&#160;                <span class="keyword">false</span>, <span class="comment">// canMakeOtherLost</span></div>
+<div class="line"><a name="l14398"></a><span class="lineno">14398</span>&#160;                strategy,</div>
+<div class="line"><a name="l14399"></a><span class="lineno">14399</span>&#160;                &amp;dstAllocRequest) &amp;&amp;</div>
+<div class="line"><a name="l14400"></a><span class="lineno">14400</span>&#160;            MoveMakesSense(</div>
+<div class="line"><a name="l14401"></a><span class="lineno">14401</span>&#160;                dstBlockIndex, dstAllocRequest.offset, srcBlockIndex, srcOffset))</div>
+<div class="line"><a name="l14402"></a><span class="lineno">14402</span>&#160;            {</div>
+<div class="line"><a name="l14403"></a><span class="lineno">14403</span>&#160;                VMA_ASSERT(dstAllocRequest.itemsToMakeLostCount == 0);</div>
+<div class="line"><a name="l14404"></a><span class="lineno">14404</span>&#160; </div>
+<div class="line"><a name="l14405"></a><span class="lineno">14405</span>&#160;                <span class="comment">// Reached limit on number of allocations or bytes to move.</span></div>
+<div class="line"><a name="l14406"></a><span class="lineno">14406</span>&#160;                <span class="keywordflow">if</span>((m_AllocationsMoved + 1 &gt; maxAllocationsToMove) ||</div>
+<div class="line"><a name="l14407"></a><span class="lineno">14407</span>&#160;                    (m_BytesMoved + size &gt; maxBytesToMove))</div>
+<div class="line"><a name="l14408"></a><span class="lineno">14408</span>&#160;                {</div>
+<div class="line"><a name="l14409"></a><span class="lineno">14409</span>&#160;                    <span class="keywordflow">return</span> VK_SUCCESS;</div>
+<div class="line"><a name="l14410"></a><span class="lineno">14410</span>&#160;                }</div>
+<div class="line"><a name="l14411"></a><span class="lineno">14411</span>&#160; </div>
+<div class="line"><a name="l14412"></a><span class="lineno">14412</span>&#160;                VmaDefragmentationMove move = {};</div>
+<div class="line"><a name="l14413"></a><span class="lineno">14413</span>&#160;                move.srcBlockIndex = pSrcBlockInfo-&gt;m_OriginalBlockIndex;</div>
+<div class="line"><a name="l14414"></a><span class="lineno">14414</span>&#160;                move.dstBlockIndex = pDstBlockInfo-&gt;m_OriginalBlockIndex;</div>
+<div class="line"><a name="l14415"></a><span class="lineno">14415</span>&#160;                move.srcOffset = srcOffset;</div>
+<div class="line"><a name="l14416"></a><span class="lineno">14416</span>&#160;                move.dstOffset = dstAllocRequest.offset;</div>
+<div class="line"><a name="l14417"></a><span class="lineno">14417</span>&#160;                move.size = size;</div>
+<div class="line"><a name="l14418"></a><span class="lineno">14418</span>&#160;                move.hAllocation = allocInfo.m_hAllocation;</div>
+<div class="line"><a name="l14419"></a><span class="lineno">14419</span>&#160;                move.pSrcBlock = pSrcBlockInfo-&gt;m_pBlock;</div>
+<div class="line"><a name="l14420"></a><span class="lineno">14420</span>&#160;                move.pDstBlock = pDstBlockInfo-&gt;m_pBlock;</div>
 <div class="line"><a name="l14421"></a><span class="lineno">14421</span>&#160; </div>
-<div class="line"><a name="l14423"></a><span class="lineno">14423</span>&#160;<span class="comment">// VmaBlockVectorDefragmentationContext</span></div>
-<div class="line"><a name="l14424"></a><span class="lineno">14424</span>&#160; </div>
-<div class="line"><a name="l14425"></a><span class="lineno">14425</span>&#160;VmaBlockVectorDefragmentationContext::VmaBlockVectorDefragmentationContext(</div>
-<div class="line"><a name="l14426"></a><span class="lineno">14426</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator,</div>
-<div class="line"><a name="l14427"></a><span class="lineno">14427</span>&#160;    <a class="code" href="struct_vma_pool.html">VmaPool</a> hCustomPool,</div>
-<div class="line"><a name="l14428"></a><span class="lineno">14428</span>&#160;    VmaBlockVector* pBlockVector,</div>
-<div class="line"><a name="l14429"></a><span class="lineno">14429</span>&#160;    uint32_t currFrameIndex) :</div>
-<div class="line"><a name="l14430"></a><span class="lineno">14430</span>&#160;    res(VK_SUCCESS),</div>
-<div class="line"><a name="l14431"></a><span class="lineno">14431</span>&#160;    mutexLocked(false),</div>
-<div class="line"><a name="l14432"></a><span class="lineno">14432</span>&#160;    blockContexts(VmaStlAllocator&lt;VmaBlockDefragmentationContext&gt;(hAllocator-&gt;GetAllocationCallbacks())),</div>
-<div class="line"><a name="l14433"></a><span class="lineno">14433</span>&#160;    defragmentationMoves(VmaStlAllocator&lt;VmaDefragmentationMove&gt;(hAllocator-&gt;GetAllocationCallbacks())),</div>
-<div class="line"><a name="l14434"></a><span class="lineno">14434</span>&#160;    defragmentationMovesProcessed(0),</div>
-<div class="line"><a name="l14435"></a><span class="lineno">14435</span>&#160;    defragmentationMovesCommitted(0),</div>
-<div class="line"><a name="l14436"></a><span class="lineno">14436</span>&#160;    hasDefragmentationPlan(0),</div>
-<div class="line"><a name="l14437"></a><span class="lineno">14437</span>&#160;    m_hAllocator(hAllocator),</div>
-<div class="line"><a name="l14438"></a><span class="lineno">14438</span>&#160;    m_hCustomPool(hCustomPool),</div>
-<div class="line"><a name="l14439"></a><span class="lineno">14439</span>&#160;    m_pBlockVector(pBlockVector),</div>
-<div class="line"><a name="l14440"></a><span class="lineno">14440</span>&#160;    m_CurrFrameIndex(currFrameIndex),</div>
-<div class="line"><a name="l14441"></a><span class="lineno">14441</span>&#160;    m_pAlgorithm(VMA_NULL),</div>
-<div class="line"><a name="l14442"></a><span class="lineno">14442</span>&#160;    m_Allocations(VmaStlAllocator&lt;AllocInfo&gt;(hAllocator-&gt;GetAllocationCallbacks())),</div>
-<div class="line"><a name="l14443"></a><span class="lineno">14443</span>&#160;    m_AllAllocations(false)</div>
-<div class="line"><a name="l14444"></a><span class="lineno">14444</span>&#160;{</div>
-<div class="line"><a name="l14445"></a><span class="lineno">14445</span>&#160;}</div>
-<div class="line"><a name="l14446"></a><span class="lineno">14446</span>&#160; </div>
-<div class="line"><a name="l14447"></a><span class="lineno">14447</span>&#160;VmaBlockVectorDefragmentationContext::~VmaBlockVectorDefragmentationContext()</div>
-<div class="line"><a name="l14448"></a><span class="lineno">14448</span>&#160;{</div>
-<div class="line"><a name="l14449"></a><span class="lineno">14449</span>&#160;    vma_delete(m_hAllocator, m_pAlgorithm);</div>
-<div class="line"><a name="l14450"></a><span class="lineno">14450</span>&#160;}</div>
+<div class="line"><a name="l14422"></a><span class="lineno">14422</span>&#160;                moves.push_back(move);</div>
+<div class="line"><a name="l14423"></a><span class="lineno">14423</span>&#160; </div>
+<div class="line"><a name="l14424"></a><span class="lineno">14424</span>&#160;                pDstBlockInfo-&gt;m_pBlock-&gt;m_pMetadata-&gt;Alloc(</div>
+<div class="line"><a name="l14425"></a><span class="lineno">14425</span>&#160;                    dstAllocRequest,</div>
+<div class="line"><a name="l14426"></a><span class="lineno">14426</span>&#160;                    suballocType,</div>
+<div class="line"><a name="l14427"></a><span class="lineno">14427</span>&#160;                    size,</div>
+<div class="line"><a name="l14428"></a><span class="lineno">14428</span>&#160;                    allocInfo.m_hAllocation);</div>
+<div class="line"><a name="l14429"></a><span class="lineno">14429</span>&#160; </div>
+<div class="line"><a name="l14430"></a><span class="lineno">14430</span>&#160;                <span class="keywordflow">if</span>(freeOldAllocations)</div>
+<div class="line"><a name="l14431"></a><span class="lineno">14431</span>&#160;                {</div>
+<div class="line"><a name="l14432"></a><span class="lineno">14432</span>&#160;                    pSrcBlockInfo-&gt;m_pBlock-&gt;m_pMetadata-&gt;FreeAtOffset(srcOffset);</div>
+<div class="line"><a name="l14433"></a><span class="lineno">14433</span>&#160;                    allocInfo.m_hAllocation-&gt;ChangeBlockAllocation(m_hAllocator, pDstBlockInfo-&gt;m_pBlock, dstAllocRequest.offset);</div>
+<div class="line"><a name="l14434"></a><span class="lineno">14434</span>&#160;                }</div>
+<div class="line"><a name="l14435"></a><span class="lineno">14435</span>&#160; </div>
+<div class="line"><a name="l14436"></a><span class="lineno">14436</span>&#160;                <span class="keywordflow">if</span>(allocInfo.m_pChanged != VMA_NULL)</div>
+<div class="line"><a name="l14437"></a><span class="lineno">14437</span>&#160;                {</div>
+<div class="line"><a name="l14438"></a><span class="lineno">14438</span>&#160;                    *allocInfo.m_pChanged = VK_TRUE;</div>
+<div class="line"><a name="l14439"></a><span class="lineno">14439</span>&#160;                }</div>
+<div class="line"><a name="l14440"></a><span class="lineno">14440</span>&#160; </div>
+<div class="line"><a name="l14441"></a><span class="lineno">14441</span>&#160;                ++m_AllocationsMoved;</div>
+<div class="line"><a name="l14442"></a><span class="lineno">14442</span>&#160;                m_BytesMoved += size;</div>
+<div class="line"><a name="l14443"></a><span class="lineno">14443</span>&#160; </div>
+<div class="line"><a name="l14444"></a><span class="lineno">14444</span>&#160;                VmaVectorRemove(pSrcBlockInfo-&gt;m_Allocations, srcAllocIndex);</div>
+<div class="line"><a name="l14445"></a><span class="lineno">14445</span>&#160; </div>
+<div class="line"><a name="l14446"></a><span class="lineno">14446</span>&#160;                <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l14447"></a><span class="lineno">14447</span>&#160;            }</div>
+<div class="line"><a name="l14448"></a><span class="lineno">14448</span>&#160;        }</div>
+<div class="line"><a name="l14449"></a><span class="lineno">14449</span>&#160; </div>
+<div class="line"><a name="l14450"></a><span class="lineno">14450</span>&#160;        <span class="comment">// If not processed, this allocInfo remains in pBlockInfo-&gt;m_Allocations for next round.</span></div>
 <div class="line"><a name="l14451"></a><span class="lineno">14451</span>&#160; </div>
-<div class="line"><a name="l14452"></a><span class="lineno">14452</span>&#160;<span class="keywordtype">void</span> VmaBlockVectorDefragmentationContext::AddAllocation(<a class="code" href="struct_vma_allocation.html">VmaAllocation</a> hAlloc, VkBool32* pChanged)</div>
-<div class="line"><a name="l14453"></a><span class="lineno">14453</span>&#160;{</div>
-<div class="line"><a name="l14454"></a><span class="lineno">14454</span>&#160;    AllocInfo info = { hAlloc, pChanged };</div>
-<div class="line"><a name="l14455"></a><span class="lineno">14455</span>&#160;    m_Allocations.push_back(info);</div>
-<div class="line"><a name="l14456"></a><span class="lineno">14456</span>&#160;}</div>
-<div class="line"><a name="l14457"></a><span class="lineno">14457</span>&#160; </div>
-<div class="line"><a name="l14458"></a><span class="lineno">14458</span>&#160;<span class="keywordtype">void</span> VmaBlockVectorDefragmentationContext::Begin(<span class="keywordtype">bool</span> overlappingMoveSupported, <a class="code" href="vk__mem__alloc_8h.html#a88a77cef37e5d3c4fc9eb328885d048d">VmaDefragmentationFlags</a> flags)</div>
-<div class="line"><a name="l14459"></a><span class="lineno">14459</span>&#160;{</div>
-<div class="line"><a name="l14460"></a><span class="lineno">14460</span>&#160;    <span class="keyword">const</span> <span class="keywordtype">bool</span> allAllocations = m_AllAllocations ||</div>
-<div class="line"><a name="l14461"></a><span class="lineno">14461</span>&#160;        m_Allocations.size() == m_pBlockVector-&gt;CalcAllocationCount();</div>
-<div class="line"><a name="l14462"></a><span class="lineno">14462</span>&#160; </div>
-<div class="line"><a name="l14463"></a><span class="lineno">14463</span>&#160;<span class="comment">    /********************************</span></div>
-<div class="line"><a name="l14464"></a><span class="lineno">14464</span>&#160;<span class="comment">    HERE IS THE CHOICE OF DEFRAGMENTATION ALGORITHM.</span></div>
-<div class="line"><a name="l14465"></a><span class="lineno">14465</span>&#160;<span class="comment">    ********************************/</span></div>
-<div class="line"><a name="l14466"></a><span class="lineno">14466</span>&#160; </div>
-<div class="line"><a name="l14467"></a><span class="lineno">14467</span>&#160;    <span class="comment">/*</span></div>
-<div class="line"><a name="l14468"></a><span class="lineno">14468</span>&#160;<span class="comment">    Fast algorithm is supported only when certain criteria are met:</span></div>
-<div class="line"><a name="l14469"></a><span class="lineno">14469</span>&#160;<span class="comment">    - VMA_DEBUG_MARGIN is 0.</span></div>
-<div class="line"><a name="l14470"></a><span class="lineno">14470</span>&#160;<span class="comment">    - All allocations in this block vector are moveable.</span></div>
-<div class="line"><a name="l14471"></a><span class="lineno">14471</span>&#160;<span class="comment">    - There is no possibility of image/buffer granularity conflict.</span></div>
-<div class="line"><a name="l14472"></a><span class="lineno">14472</span>&#160;<span class="comment">    - The defragmentation is not incremental</span></div>
-<div class="line"><a name="l14473"></a><span class="lineno">14473</span>&#160;<span class="comment">    */</span></div>
-<div class="line"><a name="l14474"></a><span class="lineno">14474</span>&#160;    <span class="keywordflow">if</span>(VMA_DEBUG_MARGIN == 0 &amp;&amp;</div>
-<div class="line"><a name="l14475"></a><span class="lineno">14475</span>&#160;        allAllocations &amp;&amp;</div>
-<div class="line"><a name="l14476"></a><span class="lineno">14476</span>&#160;        !m_pBlockVector-&gt;IsBufferImageGranularityConflictPossible() &amp;&amp;</div>
-<div class="line"><a name="l14477"></a><span class="lineno">14477</span>&#160;        !(flags &amp; <a class="code" href="vk__mem__alloc_8h.html#a6552a65b71d16f378c6994b3ceaef50ca31af49446af2459284a568ce2f3fdd33">VMA_DEFRAGMENTATION_FLAG_INCREMENTAL</a>))</div>
-<div class="line"><a name="l14478"></a><span class="lineno">14478</span>&#160;    {</div>
-<div class="line"><a name="l14479"></a><span class="lineno">14479</span>&#160;        m_pAlgorithm = vma_new(m_hAllocator, VmaDefragmentationAlgorithm_Fast)(</div>
-<div class="line"><a name="l14480"></a><span class="lineno">14480</span>&#160;            m_hAllocator, m_pBlockVector, m_CurrFrameIndex, overlappingMoveSupported);</div>
-<div class="line"><a name="l14481"></a><span class="lineno">14481</span>&#160;    }</div>
-<div class="line"><a name="l14482"></a><span class="lineno">14482</span>&#160;    <span class="keywordflow">else</span></div>
-<div class="line"><a name="l14483"></a><span class="lineno">14483</span>&#160;    {</div>
-<div class="line"><a name="l14484"></a><span class="lineno">14484</span>&#160;        m_pAlgorithm = vma_new(m_hAllocator, VmaDefragmentationAlgorithm_Generic)(</div>
-<div class="line"><a name="l14485"></a><span class="lineno">14485</span>&#160;            m_hAllocator, m_pBlockVector, m_CurrFrameIndex, overlappingMoveSupported);</div>
-<div class="line"><a name="l14486"></a><span class="lineno">14486</span>&#160;    }</div>
-<div class="line"><a name="l14487"></a><span class="lineno">14487</span>&#160; </div>
-<div class="line"><a name="l14488"></a><span class="lineno">14488</span>&#160;    <span class="keywordflow">if</span>(allAllocations)</div>
-<div class="line"><a name="l14489"></a><span class="lineno">14489</span>&#160;    {</div>
-<div class="line"><a name="l14490"></a><span class="lineno">14490</span>&#160;        m_pAlgorithm-&gt;AddAll();</div>
-<div class="line"><a name="l14491"></a><span class="lineno">14491</span>&#160;    }</div>
-<div class="line"><a name="l14492"></a><span class="lineno">14492</span>&#160;    <span class="keywordflow">else</span></div>
-<div class="line"><a name="l14493"></a><span class="lineno">14493</span>&#160;    {</div>
-<div class="line"><a name="l14494"></a><span class="lineno">14494</span>&#160;        <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> i = 0, count = m_Allocations.size(); i &lt; count; ++i)</div>
-<div class="line"><a name="l14495"></a><span class="lineno">14495</span>&#160;        {</div>
-<div class="line"><a name="l14496"></a><span class="lineno">14496</span>&#160;            m_pAlgorithm-&gt;AddAllocation(m_Allocations[i].hAlloc, m_Allocations[i].pChanged);</div>
-<div class="line"><a name="l14497"></a><span class="lineno">14497</span>&#160;        }</div>
-<div class="line"><a name="l14498"></a><span class="lineno">14498</span>&#160;    }</div>
-<div class="line"><a name="l14499"></a><span class="lineno">14499</span>&#160;}</div>
-<div class="line"><a name="l14500"></a><span class="lineno">14500</span>&#160; </div>
-<div class="line"><a name="l14502"></a><span class="lineno">14502</span>&#160;<span class="comment">// VmaDefragmentationContext</span></div>
-<div class="line"><a name="l14503"></a><span class="lineno">14503</span>&#160; </div>
-<div class="line"><a name="l14504"></a><span class="lineno">14504</span>&#160;VmaDefragmentationContext_T::VmaDefragmentationContext_T(</div>
-<div class="line"><a name="l14505"></a><span class="lineno">14505</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator,</div>
-<div class="line"><a name="l14506"></a><span class="lineno">14506</span>&#160;    uint32_t currFrameIndex,</div>
-<div class="line"><a name="l14507"></a><span class="lineno">14507</span>&#160;    uint32_t flags,</div>
-<div class="line"><a name="l14508"></a><span class="lineno">14508</span>&#160;    <a class="code" href="struct_vma_defragmentation_stats.html">VmaDefragmentationStats</a>* pStats) :</div>
-<div class="line"><a name="l14509"></a><span class="lineno">14509</span>&#160;    m_hAllocator(hAllocator),</div>
-<div class="line"><a name="l14510"></a><span class="lineno">14510</span>&#160;    m_CurrFrameIndex(currFrameIndex),</div>
-<div class="line"><a name="l14511"></a><span class="lineno">14511</span>&#160;    m_Flags(flags),</div>
-<div class="line"><a name="l14512"></a><span class="lineno">14512</span>&#160;    m_pStats(pStats),</div>
-<div class="line"><a name="l14513"></a><span class="lineno">14513</span>&#160;    m_CustomPoolContexts(VmaStlAllocator&lt;VmaBlockVectorDefragmentationContext*&gt;(hAllocator-&gt;GetAllocationCallbacks()))</div>
-<div class="line"><a name="l14514"></a><span class="lineno">14514</span>&#160;{</div>
-<div class="line"><a name="l14515"></a><span class="lineno">14515</span>&#160;    memset(m_DefaultPoolContexts, 0, <span class="keyword">sizeof</span>(m_DefaultPoolContexts));</div>
-<div class="line"><a name="l14516"></a><span class="lineno">14516</span>&#160;}</div>
-<div class="line"><a name="l14517"></a><span class="lineno">14517</span>&#160; </div>
-<div class="line"><a name="l14518"></a><span class="lineno">14518</span>&#160;VmaDefragmentationContext_T::~VmaDefragmentationContext_T()</div>
-<div class="line"><a name="l14519"></a><span class="lineno">14519</span>&#160;{</div>
-<div class="line"><a name="l14520"></a><span class="lineno">14520</span>&#160;    <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> i = m_CustomPoolContexts.size(); i--; )</div>
-<div class="line"><a name="l14521"></a><span class="lineno">14521</span>&#160;    {</div>
-<div class="line"><a name="l14522"></a><span class="lineno">14522</span>&#160;        VmaBlockVectorDefragmentationContext* pBlockVectorCtx = m_CustomPoolContexts[i];</div>
-<div class="line"><a name="l14523"></a><span class="lineno">14523</span>&#160;        pBlockVectorCtx-&gt;GetBlockVector()-&gt;DefragmentationEnd(pBlockVectorCtx, m_Flags, m_pStats);</div>
-<div class="line"><a name="l14524"></a><span class="lineno">14524</span>&#160;        vma_delete(m_hAllocator, pBlockVectorCtx);</div>
-<div class="line"><a name="l14525"></a><span class="lineno">14525</span>&#160;    }</div>
-<div class="line"><a name="l14526"></a><span class="lineno">14526</span>&#160;    <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> i = m_hAllocator-&gt;m_MemProps.memoryTypeCount; i--; )</div>
-<div class="line"><a name="l14527"></a><span class="lineno">14527</span>&#160;    {</div>
-<div class="line"><a name="l14528"></a><span class="lineno">14528</span>&#160;        VmaBlockVectorDefragmentationContext* pBlockVectorCtx = m_DefaultPoolContexts[i];</div>
-<div class="line"><a name="l14529"></a><span class="lineno">14529</span>&#160;        <span class="keywordflow">if</span>(pBlockVectorCtx)</div>
-<div class="line"><a name="l14530"></a><span class="lineno">14530</span>&#160;        {</div>
-<div class="line"><a name="l14531"></a><span class="lineno">14531</span>&#160;            pBlockVectorCtx-&gt;GetBlockVector()-&gt;DefragmentationEnd(pBlockVectorCtx, m_Flags, m_pStats);</div>
-<div class="line"><a name="l14532"></a><span class="lineno">14532</span>&#160;            vma_delete(m_hAllocator, pBlockVectorCtx);</div>
-<div class="line"><a name="l14533"></a><span class="lineno">14533</span>&#160;        }</div>
-<div class="line"><a name="l14534"></a><span class="lineno">14534</span>&#160;    }</div>
-<div class="line"><a name="l14535"></a><span class="lineno">14535</span>&#160;}</div>
+<div class="line"><a name="l14452"></a><span class="lineno">14452</span>&#160;        <span class="keywordflow">if</span>(srcAllocIndex &gt; 0)</div>
+<div class="line"><a name="l14453"></a><span class="lineno">14453</span>&#160;        {</div>
+<div class="line"><a name="l14454"></a><span class="lineno">14454</span>&#160;            --srcAllocIndex;</div>
+<div class="line"><a name="l14455"></a><span class="lineno">14455</span>&#160;        }</div>
+<div class="line"><a name="l14456"></a><span class="lineno">14456</span>&#160;        <span class="keywordflow">else</span></div>
+<div class="line"><a name="l14457"></a><span class="lineno">14457</span>&#160;        {</div>
+<div class="line"><a name="l14458"></a><span class="lineno">14458</span>&#160;            <span class="keywordflow">if</span>(srcBlockIndex &gt; 0)</div>
+<div class="line"><a name="l14459"></a><span class="lineno">14459</span>&#160;            {</div>
+<div class="line"><a name="l14460"></a><span class="lineno">14460</span>&#160;                --srcBlockIndex;</div>
+<div class="line"><a name="l14461"></a><span class="lineno">14461</span>&#160;                srcAllocIndex = SIZE_MAX;</div>
+<div class="line"><a name="l14462"></a><span class="lineno">14462</span>&#160;            }</div>
+<div class="line"><a name="l14463"></a><span class="lineno">14463</span>&#160;            <span class="keywordflow">else</span></div>
+<div class="line"><a name="l14464"></a><span class="lineno">14464</span>&#160;            {</div>
+<div class="line"><a name="l14465"></a><span class="lineno">14465</span>&#160;                <span class="keywordflow">return</span> VK_SUCCESS;</div>
+<div class="line"><a name="l14466"></a><span class="lineno">14466</span>&#160;            }</div>
+<div class="line"><a name="l14467"></a><span class="lineno">14467</span>&#160;        }</div>
+<div class="line"><a name="l14468"></a><span class="lineno">14468</span>&#160;    }</div>
+<div class="line"><a name="l14469"></a><span class="lineno">14469</span>&#160;}</div>
+<div class="line"><a name="l14470"></a><span class="lineno">14470</span>&#160; </div>
+<div class="line"><a name="l14471"></a><span class="lineno">14471</span>&#160;<span class="keywordtype">size_t</span> VmaDefragmentationAlgorithm_Generic::CalcBlocksWithNonMovableCount()<span class="keyword"> const</span></div>
+<div class="line"><a name="l14472"></a><span class="lineno">14472</span>&#160;<span class="keyword"></span>{</div>
+<div class="line"><a name="l14473"></a><span class="lineno">14473</span>&#160;    <span class="keywordtype">size_t</span> result = 0;</div>
+<div class="line"><a name="l14474"></a><span class="lineno">14474</span>&#160;    <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> i = 0; i &lt; m_Blocks.size(); ++i)</div>
+<div class="line"><a name="l14475"></a><span class="lineno">14475</span>&#160;    {</div>
+<div class="line"><a name="l14476"></a><span class="lineno">14476</span>&#160;        <span class="keywordflow">if</span>(m_Blocks[i]-&gt;m_HasNonMovableAllocations)</div>
+<div class="line"><a name="l14477"></a><span class="lineno">14477</span>&#160;        {</div>
+<div class="line"><a name="l14478"></a><span class="lineno">14478</span>&#160;            ++result;</div>
+<div class="line"><a name="l14479"></a><span class="lineno">14479</span>&#160;        }</div>
+<div class="line"><a name="l14480"></a><span class="lineno">14480</span>&#160;    }</div>
+<div class="line"><a name="l14481"></a><span class="lineno">14481</span>&#160;    <span class="keywordflow">return</span> result;</div>
+<div class="line"><a name="l14482"></a><span class="lineno">14482</span>&#160;}</div>
+<div class="line"><a name="l14483"></a><span class="lineno">14483</span>&#160; </div>
+<div class="line"><a name="l14484"></a><span class="lineno">14484</span>&#160;VkResult VmaDefragmentationAlgorithm_Generic::Defragment(</div>
+<div class="line"><a name="l14485"></a><span class="lineno">14485</span>&#160;    VmaVector&lt; VmaDefragmentationMove, VmaStlAllocator&lt;VmaDefragmentationMove&gt; &gt;&amp; moves,</div>
+<div class="line"><a name="l14486"></a><span class="lineno">14486</span>&#160;    VkDeviceSize maxBytesToMove,</div>
+<div class="line"><a name="l14487"></a><span class="lineno">14487</span>&#160;    uint32_t maxAllocationsToMove,</div>
+<div class="line"><a name="l14488"></a><span class="lineno">14488</span>&#160;    <a class="code" href="vk__mem__alloc_8h.html#a88a77cef37e5d3c4fc9eb328885d048d">VmaDefragmentationFlags</a> flags)</div>
+<div class="line"><a name="l14489"></a><span class="lineno">14489</span>&#160;{</div>
+<div class="line"><a name="l14490"></a><span class="lineno">14490</span>&#160;    <span class="keywordflow">if</span>(!m_AllAllocations &amp;&amp; m_AllocationCount == 0)</div>
+<div class="line"><a name="l14491"></a><span class="lineno">14491</span>&#160;    {</div>
+<div class="line"><a name="l14492"></a><span class="lineno">14492</span>&#160;        <span class="keywordflow">return</span> VK_SUCCESS;</div>
+<div class="line"><a name="l14493"></a><span class="lineno">14493</span>&#160;    }</div>
+<div class="line"><a name="l14494"></a><span class="lineno">14494</span>&#160; </div>
+<div class="line"><a name="l14495"></a><span class="lineno">14495</span>&#160;    <span class="keyword">const</span> <span class="keywordtype">size_t</span> blockCount = m_Blocks.size();</div>
+<div class="line"><a name="l14496"></a><span class="lineno">14496</span>&#160;    <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> blockIndex = 0; blockIndex &lt; blockCount; ++blockIndex)</div>
+<div class="line"><a name="l14497"></a><span class="lineno">14497</span>&#160;    {</div>
+<div class="line"><a name="l14498"></a><span class="lineno">14498</span>&#160;        BlockInfo* pBlockInfo = m_Blocks[blockIndex];</div>
+<div class="line"><a name="l14499"></a><span class="lineno">14499</span>&#160; </div>
+<div class="line"><a name="l14500"></a><span class="lineno">14500</span>&#160;        <span class="keywordflow">if</span>(m_AllAllocations)</div>
+<div class="line"><a name="l14501"></a><span class="lineno">14501</span>&#160;        {</div>
+<div class="line"><a name="l14502"></a><span class="lineno">14502</span>&#160;            VmaBlockMetadata_Generic* pMetadata = (VmaBlockMetadata_Generic*)pBlockInfo-&gt;m_pBlock-&gt;m_pMetadata;</div>
+<div class="line"><a name="l14503"></a><span class="lineno">14503</span>&#160;            <span class="keywordflow">for</span>(VmaSuballocationList::const_iterator it = pMetadata-&gt;m_Suballocations.begin();</div>
+<div class="line"><a name="l14504"></a><span class="lineno">14504</span>&#160;                it != pMetadata-&gt;m_Suballocations.end();</div>
+<div class="line"><a name="l14505"></a><span class="lineno">14505</span>&#160;                ++it)</div>
+<div class="line"><a name="l14506"></a><span class="lineno">14506</span>&#160;            {</div>
+<div class="line"><a name="l14507"></a><span class="lineno">14507</span>&#160;                <span class="keywordflow">if</span>(it-&gt;type != VMA_SUBALLOCATION_TYPE_FREE)</div>
+<div class="line"><a name="l14508"></a><span class="lineno">14508</span>&#160;                {</div>
+<div class="line"><a name="l14509"></a><span class="lineno">14509</span>&#160;                    AllocationInfo allocInfo = AllocationInfo(it-&gt;hAllocation, VMA_NULL);</div>
+<div class="line"><a name="l14510"></a><span class="lineno">14510</span>&#160;                    pBlockInfo-&gt;m_Allocations.push_back(allocInfo);</div>
+<div class="line"><a name="l14511"></a><span class="lineno">14511</span>&#160;                }</div>
+<div class="line"><a name="l14512"></a><span class="lineno">14512</span>&#160;            }</div>
+<div class="line"><a name="l14513"></a><span class="lineno">14513</span>&#160;        }</div>
+<div class="line"><a name="l14514"></a><span class="lineno">14514</span>&#160; </div>
+<div class="line"><a name="l14515"></a><span class="lineno">14515</span>&#160;        pBlockInfo-&gt;CalcHasNonMovableAllocations();</div>
+<div class="line"><a name="l14516"></a><span class="lineno">14516</span>&#160; </div>
+<div class="line"><a name="l14517"></a><span class="lineno">14517</span>&#160;        <span class="comment">// This is a choice based on research.</span></div>
+<div class="line"><a name="l14518"></a><span class="lineno">14518</span>&#160;        <span class="comment">// Option 1:</span></div>
+<div class="line"><a name="l14519"></a><span class="lineno">14519</span>&#160;        pBlockInfo-&gt;SortAllocationsByOffsetDescending();</div>
+<div class="line"><a name="l14520"></a><span class="lineno">14520</span>&#160;        <span class="comment">// Option 2:</span></div>
+<div class="line"><a name="l14521"></a><span class="lineno">14521</span>&#160;        <span class="comment">//pBlockInfo-&gt;SortAllocationsBySizeDescending();</span></div>
+<div class="line"><a name="l14522"></a><span class="lineno">14522</span>&#160;    }</div>
+<div class="line"><a name="l14523"></a><span class="lineno">14523</span>&#160; </div>
+<div class="line"><a name="l14524"></a><span class="lineno">14524</span>&#160;    <span class="comment">// Sort m_Blocks this time by the main criterium, from most &quot;destination&quot; to most &quot;source&quot; blocks.</span></div>
+<div class="line"><a name="l14525"></a><span class="lineno">14525</span>&#160;    VMA_SORT(m_Blocks.begin(), m_Blocks.end(), BlockInfoCompareMoveDestination());</div>
+<div class="line"><a name="l14526"></a><span class="lineno">14526</span>&#160; </div>
+<div class="line"><a name="l14527"></a><span class="lineno">14527</span>&#160;    <span class="comment">// This is a choice based on research.</span></div>
+<div class="line"><a name="l14528"></a><span class="lineno">14528</span>&#160;    <span class="keyword">const</span> uint32_t roundCount = 2;</div>
+<div class="line"><a name="l14529"></a><span class="lineno">14529</span>&#160; </div>
+<div class="line"><a name="l14530"></a><span class="lineno">14530</span>&#160;    <span class="comment">// Execute defragmentation rounds (the main part).</span></div>
+<div class="line"><a name="l14531"></a><span class="lineno">14531</span>&#160;    VkResult result = VK_SUCCESS;</div>
+<div class="line"><a name="l14532"></a><span class="lineno">14532</span>&#160;    <span class="keywordflow">for</span>(uint32_t round = 0; (round &lt; roundCount) &amp;&amp; (result == VK_SUCCESS); ++round)</div>
+<div class="line"><a name="l14533"></a><span class="lineno">14533</span>&#160;    {</div>
+<div class="line"><a name="l14534"></a><span class="lineno">14534</span>&#160;        result = DefragmentRound(moves, maxBytesToMove, maxAllocationsToMove, !(flags &amp; <a class="code" href="vk__mem__alloc_8h.html#a6552a65b71d16f378c6994b3ceaef50ca31af49446af2459284a568ce2f3fdd33">VMA_DEFRAGMENTATION_FLAG_INCREMENTAL</a>));</div>
+<div class="line"><a name="l14535"></a><span class="lineno">14535</span>&#160;    }</div>
 <div class="line"><a name="l14536"></a><span class="lineno">14536</span>&#160; </div>
-<div class="line"><a name="l14537"></a><span class="lineno">14537</span>&#160;<span class="keywordtype">void</span> VmaDefragmentationContext_T::AddPools(uint32_t poolCount, <span class="keyword">const</span> <a class="code" href="struct_vma_pool.html">VmaPool</a>* pPools)</div>
-<div class="line"><a name="l14538"></a><span class="lineno">14538</span>&#160;{</div>
-<div class="line"><a name="l14539"></a><span class="lineno">14539</span>&#160;    <span class="keywordflow">for</span>(uint32_t poolIndex = 0; poolIndex &lt; poolCount; ++poolIndex)</div>
-<div class="line"><a name="l14540"></a><span class="lineno">14540</span>&#160;    {</div>
-<div class="line"><a name="l14541"></a><span class="lineno">14541</span>&#160;        <a class="code" href="struct_vma_pool.html">VmaPool</a> pool = pPools[poolIndex];</div>
-<div class="line"><a name="l14542"></a><span class="lineno">14542</span>&#160;        VMA_ASSERT(pool);</div>
-<div class="line"><a name="l14543"></a><span class="lineno">14543</span>&#160;        <span class="comment">// Pools with algorithm other than default are not defragmented.</span></div>
-<div class="line"><a name="l14544"></a><span class="lineno">14544</span>&#160;        <span class="keywordflow">if</span>(pool-&gt;m_BlockVector.GetAlgorithm() == 0)</div>
-<div class="line"><a name="l14545"></a><span class="lineno">14545</span>&#160;        {</div>
-<div class="line"><a name="l14546"></a><span class="lineno">14546</span>&#160;            VmaBlockVectorDefragmentationContext* pBlockVectorDefragCtx = VMA_NULL;</div>
-<div class="line"><a name="l14547"></a><span class="lineno">14547</span>&#160;            </div>
-<div class="line"><a name="l14548"></a><span class="lineno">14548</span>&#160;            <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> i = m_CustomPoolContexts.size(); i--; )</div>
-<div class="line"><a name="l14549"></a><span class="lineno">14549</span>&#160;            {</div>
-<div class="line"><a name="l14550"></a><span class="lineno">14550</span>&#160;                <span class="keywordflow">if</span>(m_CustomPoolContexts[i]-&gt;GetCustomPool() == pool)</div>
-<div class="line"><a name="l14551"></a><span class="lineno">14551</span>&#160;                {</div>
-<div class="line"><a name="l14552"></a><span class="lineno">14552</span>&#160;                    pBlockVectorDefragCtx = m_CustomPoolContexts[i];</div>
-<div class="line"><a name="l14553"></a><span class="lineno">14553</span>&#160;                    <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l14554"></a><span class="lineno">14554</span>&#160;                }</div>
-<div class="line"><a name="l14555"></a><span class="lineno">14555</span>&#160;            }</div>
-<div class="line"><a name="l14556"></a><span class="lineno">14556</span>&#160;            </div>
-<div class="line"><a name="l14557"></a><span class="lineno">14557</span>&#160;            <span class="keywordflow">if</span>(!pBlockVectorDefragCtx)</div>
-<div class="line"><a name="l14558"></a><span class="lineno">14558</span>&#160;            {</div>
-<div class="line"><a name="l14559"></a><span class="lineno">14559</span>&#160;                pBlockVectorDefragCtx = vma_new(m_hAllocator, VmaBlockVectorDefragmentationContext)(</div>
-<div class="line"><a name="l14560"></a><span class="lineno">14560</span>&#160;                    m_hAllocator,</div>
-<div class="line"><a name="l14561"></a><span class="lineno">14561</span>&#160;                    pool,</div>
-<div class="line"><a name="l14562"></a><span class="lineno">14562</span>&#160;                    &amp;pool-&gt;m_BlockVector,</div>
-<div class="line"><a name="l14563"></a><span class="lineno">14563</span>&#160;                    m_CurrFrameIndex);</div>
-<div class="line"><a name="l14564"></a><span class="lineno">14564</span>&#160;                m_CustomPoolContexts.push_back(pBlockVectorDefragCtx);</div>
-<div class="line"><a name="l14565"></a><span class="lineno">14565</span>&#160;            }</div>
-<div class="line"><a name="l14566"></a><span class="lineno">14566</span>&#160; </div>
-<div class="line"><a name="l14567"></a><span class="lineno">14567</span>&#160;            pBlockVectorDefragCtx-&gt;AddAll();</div>
-<div class="line"><a name="l14568"></a><span class="lineno">14568</span>&#160;        }</div>
-<div class="line"><a name="l14569"></a><span class="lineno">14569</span>&#160;    }</div>
-<div class="line"><a name="l14570"></a><span class="lineno">14570</span>&#160;}</div>
-<div class="line"><a name="l14571"></a><span class="lineno">14571</span>&#160; </div>
-<div class="line"><a name="l14572"></a><span class="lineno">14572</span>&#160;<span class="keywordtype">void</span> VmaDefragmentationContext_T::AddAllocations(</div>
-<div class="line"><a name="l14573"></a><span class="lineno">14573</span>&#160;    uint32_t allocationCount,</div>
-<div class="line"><a name="l14574"></a><span class="lineno">14574</span>&#160;    <span class="keyword">const</span> <a class="code" href="struct_vma_allocation.html">VmaAllocation</a>* pAllocations,</div>
-<div class="line"><a name="l14575"></a><span class="lineno">14575</span>&#160;    VkBool32* pAllocationsChanged)</div>
-<div class="line"><a name="l14576"></a><span class="lineno">14576</span>&#160;{</div>
-<div class="line"><a name="l14577"></a><span class="lineno">14577</span>&#160;    <span class="comment">// Dispatch pAllocations among defragmentators. Create them when necessary.</span></div>
-<div class="line"><a name="l14578"></a><span class="lineno">14578</span>&#160;    <span class="keywordflow">for</span>(uint32_t allocIndex = 0; allocIndex &lt; allocationCount; ++allocIndex)</div>
-<div class="line"><a name="l14579"></a><span class="lineno">14579</span>&#160;    {</div>
-<div class="line"><a name="l14580"></a><span class="lineno">14580</span>&#160;        <span class="keyword">const</span> <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> hAlloc = pAllocations[allocIndex];</div>
-<div class="line"><a name="l14581"></a><span class="lineno">14581</span>&#160;        VMA_ASSERT(hAlloc);</div>
-<div class="line"><a name="l14582"></a><span class="lineno">14582</span>&#160;        <span class="comment">// DedicatedAlloc cannot be defragmented.</span></div>
-<div class="line"><a name="l14583"></a><span class="lineno">14583</span>&#160;        <span class="keywordflow">if</span>((hAlloc-&gt;GetType() == VmaAllocation_T::ALLOCATION_TYPE_BLOCK) &amp;&amp;</div>
-<div class="line"><a name="l14584"></a><span class="lineno">14584</span>&#160;            <span class="comment">// Lost allocation cannot be defragmented.</span></div>
-<div class="line"><a name="l14585"></a><span class="lineno">14585</span>&#160;            (hAlloc-&gt;GetLastUseFrameIndex() != VMA_FRAME_INDEX_LOST))</div>
-<div class="line"><a name="l14586"></a><span class="lineno">14586</span>&#160;        {</div>
-<div class="line"><a name="l14587"></a><span class="lineno">14587</span>&#160;            VmaBlockVectorDefragmentationContext* pBlockVectorDefragCtx = VMA_NULL;</div>
-<div class="line"><a name="l14588"></a><span class="lineno">14588</span>&#160; </div>
-<div class="line"><a name="l14589"></a><span class="lineno">14589</span>&#160;            <span class="keyword">const</span> <a class="code" href="struct_vma_pool.html">VmaPool</a> hAllocPool = hAlloc-&gt;GetBlock()-&gt;GetParentPool();</div>
-<div class="line"><a name="l14590"></a><span class="lineno">14590</span>&#160;            <span class="comment">// This allocation belongs to custom pool.</span></div>
-<div class="line"><a name="l14591"></a><span class="lineno">14591</span>&#160;            <span class="keywordflow">if</span>(hAllocPool != VK_NULL_HANDLE)</div>
-<div class="line"><a name="l14592"></a><span class="lineno">14592</span>&#160;            {</div>
-<div class="line"><a name="l14593"></a><span class="lineno">14593</span>&#160;                <span class="comment">// Pools with algorithm other than default are not defragmented.</span></div>
-<div class="line"><a name="l14594"></a><span class="lineno">14594</span>&#160;                <span class="keywordflow">if</span>(hAllocPool-&gt;m_BlockVector.GetAlgorithm() == 0)</div>
-<div class="line"><a name="l14595"></a><span class="lineno">14595</span>&#160;                {</div>
-<div class="line"><a name="l14596"></a><span class="lineno">14596</span>&#160;                    <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> i = m_CustomPoolContexts.size(); i--; )</div>
-<div class="line"><a name="l14597"></a><span class="lineno">14597</span>&#160;                    {</div>
-<div class="line"><a name="l14598"></a><span class="lineno">14598</span>&#160;                        <span class="keywordflow">if</span>(m_CustomPoolContexts[i]-&gt;GetCustomPool() == hAllocPool)</div>
-<div class="line"><a name="l14599"></a><span class="lineno">14599</span>&#160;                        {</div>
-<div class="line"><a name="l14600"></a><span class="lineno">14600</span>&#160;                            pBlockVectorDefragCtx = m_CustomPoolContexts[i];</div>
-<div class="line"><a name="l14601"></a><span class="lineno">14601</span>&#160;                            <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l14602"></a><span class="lineno">14602</span>&#160;                        }</div>
-<div class="line"><a name="l14603"></a><span class="lineno">14603</span>&#160;                    }</div>
-<div class="line"><a name="l14604"></a><span class="lineno">14604</span>&#160;                    <span class="keywordflow">if</span>(!pBlockVectorDefragCtx)</div>
-<div class="line"><a name="l14605"></a><span class="lineno">14605</span>&#160;                    {</div>
-<div class="line"><a name="l14606"></a><span class="lineno">14606</span>&#160;                        pBlockVectorDefragCtx = vma_new(m_hAllocator, VmaBlockVectorDefragmentationContext)(</div>
-<div class="line"><a name="l14607"></a><span class="lineno">14607</span>&#160;                            m_hAllocator,</div>
-<div class="line"><a name="l14608"></a><span class="lineno">14608</span>&#160;                            hAllocPool,</div>
-<div class="line"><a name="l14609"></a><span class="lineno">14609</span>&#160;                            &amp;hAllocPool-&gt;m_BlockVector,</div>
-<div class="line"><a name="l14610"></a><span class="lineno">14610</span>&#160;                            m_CurrFrameIndex);</div>
-<div class="line"><a name="l14611"></a><span class="lineno">14611</span>&#160;                        m_CustomPoolContexts.push_back(pBlockVectorDefragCtx);</div>
-<div class="line"><a name="l14612"></a><span class="lineno">14612</span>&#160;                    }</div>
-<div class="line"><a name="l14613"></a><span class="lineno">14613</span>&#160;                }</div>
-<div class="line"><a name="l14614"></a><span class="lineno">14614</span>&#160;            }</div>
-<div class="line"><a name="l14615"></a><span class="lineno">14615</span>&#160;            <span class="comment">// This allocation belongs to default pool.</span></div>
-<div class="line"><a name="l14616"></a><span class="lineno">14616</span>&#160;            <span class="keywordflow">else</span></div>
-<div class="line"><a name="l14617"></a><span class="lineno">14617</span>&#160;            {</div>
-<div class="line"><a name="l14618"></a><span class="lineno">14618</span>&#160;                <span class="keyword">const</span> uint32_t memTypeIndex = hAlloc-&gt;GetMemoryTypeIndex();</div>
-<div class="line"><a name="l14619"></a><span class="lineno">14619</span>&#160;                pBlockVectorDefragCtx = m_DefaultPoolContexts[memTypeIndex];</div>
-<div class="line"><a name="l14620"></a><span class="lineno">14620</span>&#160;                <span class="keywordflow">if</span>(!pBlockVectorDefragCtx)</div>
-<div class="line"><a name="l14621"></a><span class="lineno">14621</span>&#160;                {</div>
-<div class="line"><a name="l14622"></a><span class="lineno">14622</span>&#160;                    pBlockVectorDefragCtx = vma_new(m_hAllocator, VmaBlockVectorDefragmentationContext)(</div>
-<div class="line"><a name="l14623"></a><span class="lineno">14623</span>&#160;                        m_hAllocator,</div>
-<div class="line"><a name="l14624"></a><span class="lineno">14624</span>&#160;                        VMA_NULL, <span class="comment">// hCustomPool</span></div>
-<div class="line"><a name="l14625"></a><span class="lineno">14625</span>&#160;                        m_hAllocator-&gt;m_pBlockVectors[memTypeIndex],</div>
-<div class="line"><a name="l14626"></a><span class="lineno">14626</span>&#160;                        m_CurrFrameIndex);</div>
-<div class="line"><a name="l14627"></a><span class="lineno">14627</span>&#160;                    m_DefaultPoolContexts[memTypeIndex] = pBlockVectorDefragCtx;</div>
-<div class="line"><a name="l14628"></a><span class="lineno">14628</span>&#160;                }</div>
-<div class="line"><a name="l14629"></a><span class="lineno">14629</span>&#160;            }</div>
-<div class="line"><a name="l14630"></a><span class="lineno">14630</span>&#160; </div>
-<div class="line"><a name="l14631"></a><span class="lineno">14631</span>&#160;            <span class="keywordflow">if</span>(pBlockVectorDefragCtx)</div>
-<div class="line"><a name="l14632"></a><span class="lineno">14632</span>&#160;            {</div>
-<div class="line"><a name="l14633"></a><span class="lineno">14633</span>&#160;                VkBool32* <span class="keyword">const</span> pChanged = (pAllocationsChanged != VMA_NULL) ?</div>
-<div class="line"><a name="l14634"></a><span class="lineno">14634</span>&#160;                    &amp;pAllocationsChanged[allocIndex] : VMA_NULL;</div>
-<div class="line"><a name="l14635"></a><span class="lineno">14635</span>&#160;                pBlockVectorDefragCtx-&gt;AddAllocation(hAlloc, pChanged);</div>
-<div class="line"><a name="l14636"></a><span class="lineno">14636</span>&#160;            }</div>
-<div class="line"><a name="l14637"></a><span class="lineno">14637</span>&#160;        }</div>
-<div class="line"><a name="l14638"></a><span class="lineno">14638</span>&#160;    }</div>
-<div class="line"><a name="l14639"></a><span class="lineno">14639</span>&#160;}</div>
-<div class="line"><a name="l14640"></a><span class="lineno">14640</span>&#160; </div>
-<div class="line"><a name="l14641"></a><span class="lineno">14641</span>&#160;VkResult VmaDefragmentationContext_T::Defragment(</div>
-<div class="line"><a name="l14642"></a><span class="lineno">14642</span>&#160;    VkDeviceSize maxCpuBytesToMove, uint32_t maxCpuAllocationsToMove,</div>
-<div class="line"><a name="l14643"></a><span class="lineno">14643</span>&#160;    VkDeviceSize maxGpuBytesToMove, uint32_t maxGpuAllocationsToMove,</div>
-<div class="line"><a name="l14644"></a><span class="lineno">14644</span>&#160;    VkCommandBuffer commandBuffer, <a class="code" href="struct_vma_defragmentation_stats.html">VmaDefragmentationStats</a>* pStats, <a class="code" href="vk__mem__alloc_8h.html#a88a77cef37e5d3c4fc9eb328885d048d">VmaDefragmentationFlags</a> flags)</div>
-<div class="line"><a name="l14645"></a><span class="lineno">14645</span>&#160;{</div>
-<div class="line"><a name="l14646"></a><span class="lineno">14646</span>&#160;    <span class="keywordflow">if</span>(pStats)</div>
-<div class="line"><a name="l14647"></a><span class="lineno">14647</span>&#160;    {</div>
-<div class="line"><a name="l14648"></a><span class="lineno">14648</span>&#160;        memset(pStats, 0, <span class="keyword">sizeof</span>(<a class="code" href="struct_vma_defragmentation_stats.html">VmaDefragmentationStats</a>));</div>
-<div class="line"><a name="l14649"></a><span class="lineno">14649</span>&#160;    }</div>
-<div class="line"><a name="l14650"></a><span class="lineno">14650</span>&#160; </div>
-<div class="line"><a name="l14651"></a><span class="lineno">14651</span>&#160;    <span class="keywordflow">if</span>(flags &amp; <a class="code" href="vk__mem__alloc_8h.html#a6552a65b71d16f378c6994b3ceaef50ca31af49446af2459284a568ce2f3fdd33">VMA_DEFRAGMENTATION_FLAG_INCREMENTAL</a>)</div>
-<div class="line"><a name="l14652"></a><span class="lineno">14652</span>&#160;    {</div>
-<div class="line"><a name="l14653"></a><span class="lineno">14653</span>&#160;        <span class="comment">// For incremental defragmetnations, we just earmark how much we can move</span></div>
-<div class="line"><a name="l14654"></a><span class="lineno">14654</span>&#160;        <span class="comment">// The real meat is in the defragmentation steps</span></div>
-<div class="line"><a name="l14655"></a><span class="lineno">14655</span>&#160;        m_MaxCpuBytesToMove = maxCpuBytesToMove;</div>
-<div class="line"><a name="l14656"></a><span class="lineno">14656</span>&#160;        m_MaxCpuAllocationsToMove = maxCpuAllocationsToMove;</div>
-<div class="line"><a name="l14657"></a><span class="lineno">14657</span>&#160; </div>
-<div class="line"><a name="l14658"></a><span class="lineno">14658</span>&#160;        m_MaxGpuBytesToMove = maxGpuBytesToMove;</div>
-<div class="line"><a name="l14659"></a><span class="lineno">14659</span>&#160;        m_MaxGpuAllocationsToMove = maxGpuAllocationsToMove;</div>
+<div class="line"><a name="l14537"></a><span class="lineno">14537</span>&#160;    <span class="keywordflow">return</span> result;</div>
+<div class="line"><a name="l14538"></a><span class="lineno">14538</span>&#160;}</div>
+<div class="line"><a name="l14539"></a><span class="lineno">14539</span>&#160; </div>
+<div class="line"><a name="l14540"></a><span class="lineno">14540</span>&#160;<span class="keywordtype">bool</span> VmaDefragmentationAlgorithm_Generic::MoveMakesSense(</div>
+<div class="line"><a name="l14541"></a><span class="lineno">14541</span>&#160;        <span class="keywordtype">size_t</span> dstBlockIndex, VkDeviceSize dstOffset,</div>
+<div class="line"><a name="l14542"></a><span class="lineno">14542</span>&#160;        <span class="keywordtype">size_t</span> srcBlockIndex, VkDeviceSize srcOffset)</div>
+<div class="line"><a name="l14543"></a><span class="lineno">14543</span>&#160;{</div>
+<div class="line"><a name="l14544"></a><span class="lineno">14544</span>&#160;    <span class="keywordflow">if</span>(dstBlockIndex &lt; srcBlockIndex)</div>
+<div class="line"><a name="l14545"></a><span class="lineno">14545</span>&#160;    {</div>
+<div class="line"><a name="l14546"></a><span class="lineno">14546</span>&#160;        <span class="keywordflow">return</span> <span class="keyword">true</span>;</div>
+<div class="line"><a name="l14547"></a><span class="lineno">14547</span>&#160;    }</div>
+<div class="line"><a name="l14548"></a><span class="lineno">14548</span>&#160;    <span class="keywordflow">if</span>(dstBlockIndex &gt; srcBlockIndex)</div>
+<div class="line"><a name="l14549"></a><span class="lineno">14549</span>&#160;    {</div>
+<div class="line"><a name="l14550"></a><span class="lineno">14550</span>&#160;        <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
+<div class="line"><a name="l14551"></a><span class="lineno">14551</span>&#160;    }</div>
+<div class="line"><a name="l14552"></a><span class="lineno">14552</span>&#160;    <span class="keywordflow">if</span>(dstOffset &lt; srcOffset)</div>
+<div class="line"><a name="l14553"></a><span class="lineno">14553</span>&#160;    {</div>
+<div class="line"><a name="l14554"></a><span class="lineno">14554</span>&#160;        <span class="keywordflow">return</span> <span class="keyword">true</span>;</div>
+<div class="line"><a name="l14555"></a><span class="lineno">14555</span>&#160;    }</div>
+<div class="line"><a name="l14556"></a><span class="lineno">14556</span>&#160;    <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
+<div class="line"><a name="l14557"></a><span class="lineno">14557</span>&#160;}</div>
+<div class="line"><a name="l14558"></a><span class="lineno">14558</span>&#160; </div>
+<div class="line"><a name="l14560"></a><span class="lineno">14560</span>&#160;<span class="comment">// VmaDefragmentationAlgorithm_Fast</span></div>
+<div class="line"><a name="l14561"></a><span class="lineno">14561</span>&#160; </div>
+<div class="line"><a name="l14562"></a><span class="lineno">14562</span>&#160;VmaDefragmentationAlgorithm_Fast::VmaDefragmentationAlgorithm_Fast(</div>
+<div class="line"><a name="l14563"></a><span class="lineno">14563</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator,</div>
+<div class="line"><a name="l14564"></a><span class="lineno">14564</span>&#160;    VmaBlockVector* pBlockVector,</div>
+<div class="line"><a name="l14565"></a><span class="lineno">14565</span>&#160;    uint32_t currentFrameIndex,</div>
+<div class="line"><a name="l14566"></a><span class="lineno">14566</span>&#160;    <span class="keywordtype">bool</span> overlappingMoveSupported) :</div>
+<div class="line"><a name="l14567"></a><span class="lineno">14567</span>&#160;    VmaDefragmentationAlgorithm(hAllocator, pBlockVector, currentFrameIndex),</div>
+<div class="line"><a name="l14568"></a><span class="lineno">14568</span>&#160;    m_OverlappingMoveSupported(overlappingMoveSupported),</div>
+<div class="line"><a name="l14569"></a><span class="lineno">14569</span>&#160;    m_AllocationCount(0),</div>
+<div class="line"><a name="l14570"></a><span class="lineno">14570</span>&#160;    m_AllAllocations(false),</div>
+<div class="line"><a name="l14571"></a><span class="lineno">14571</span>&#160;    m_BytesMoved(0),</div>
+<div class="line"><a name="l14572"></a><span class="lineno">14572</span>&#160;    m_AllocationsMoved(0),</div>
+<div class="line"><a name="l14573"></a><span class="lineno">14573</span>&#160;    m_BlockInfos(VmaStlAllocator&lt;BlockInfo&gt;(hAllocator-&gt;GetAllocationCallbacks()))</div>
+<div class="line"><a name="l14574"></a><span class="lineno">14574</span>&#160;{</div>
+<div class="line"><a name="l14575"></a><span class="lineno">14575</span>&#160;    VMA_ASSERT(VMA_DEBUG_MARGIN == 0);</div>
+<div class="line"><a name="l14576"></a><span class="lineno">14576</span>&#160; </div>
+<div class="line"><a name="l14577"></a><span class="lineno">14577</span>&#160;}</div>
+<div class="line"><a name="l14578"></a><span class="lineno">14578</span>&#160; </div>
+<div class="line"><a name="l14579"></a><span class="lineno">14579</span>&#160;VmaDefragmentationAlgorithm_Fast::~VmaDefragmentationAlgorithm_Fast()</div>
+<div class="line"><a name="l14580"></a><span class="lineno">14580</span>&#160;{</div>
+<div class="line"><a name="l14581"></a><span class="lineno">14581</span>&#160;}</div>
+<div class="line"><a name="l14582"></a><span class="lineno">14582</span>&#160; </div>
+<div class="line"><a name="l14583"></a><span class="lineno">14583</span>&#160;VkResult VmaDefragmentationAlgorithm_Fast::Defragment(</div>
+<div class="line"><a name="l14584"></a><span class="lineno">14584</span>&#160;    VmaVector&lt; VmaDefragmentationMove, VmaStlAllocator&lt;VmaDefragmentationMove&gt; &gt;&amp; moves,</div>
+<div class="line"><a name="l14585"></a><span class="lineno">14585</span>&#160;    VkDeviceSize maxBytesToMove,</div>
+<div class="line"><a name="l14586"></a><span class="lineno">14586</span>&#160;    uint32_t maxAllocationsToMove,</div>
+<div class="line"><a name="l14587"></a><span class="lineno">14587</span>&#160;    <a class="code" href="vk__mem__alloc_8h.html#a88a77cef37e5d3c4fc9eb328885d048d">VmaDefragmentationFlags</a> flags)</div>
+<div class="line"><a name="l14588"></a><span class="lineno">14588</span>&#160;{</div>
+<div class="line"><a name="l14589"></a><span class="lineno">14589</span>&#160;    VMA_ASSERT(m_AllAllocations || m_pBlockVector-&gt;CalcAllocationCount() == m_AllocationCount);</div>
+<div class="line"><a name="l14590"></a><span class="lineno">14590</span>&#160; </div>
+<div class="line"><a name="l14591"></a><span class="lineno">14591</span>&#160;    <span class="keyword">const</span> <span class="keywordtype">size_t</span> blockCount = m_pBlockVector-&gt;GetBlockCount();</div>
+<div class="line"><a name="l14592"></a><span class="lineno">14592</span>&#160;    <span class="keywordflow">if</span>(blockCount == 0 || maxBytesToMove == 0 || maxAllocationsToMove == 0)</div>
+<div class="line"><a name="l14593"></a><span class="lineno">14593</span>&#160;    {</div>
+<div class="line"><a name="l14594"></a><span class="lineno">14594</span>&#160;        <span class="keywordflow">return</span> VK_SUCCESS;</div>
+<div class="line"><a name="l14595"></a><span class="lineno">14595</span>&#160;    }</div>
+<div class="line"><a name="l14596"></a><span class="lineno">14596</span>&#160; </div>
+<div class="line"><a name="l14597"></a><span class="lineno">14597</span>&#160;    PreprocessMetadata();</div>
+<div class="line"><a name="l14598"></a><span class="lineno">14598</span>&#160; </div>
+<div class="line"><a name="l14599"></a><span class="lineno">14599</span>&#160;    <span class="comment">// Sort blocks in order from most destination.</span></div>
+<div class="line"><a name="l14600"></a><span class="lineno">14600</span>&#160; </div>
+<div class="line"><a name="l14601"></a><span class="lineno">14601</span>&#160;    m_BlockInfos.resize(blockCount);</div>
+<div class="line"><a name="l14602"></a><span class="lineno">14602</span>&#160;    <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> i = 0; i &lt; blockCount; ++i)</div>
+<div class="line"><a name="l14603"></a><span class="lineno">14603</span>&#160;    {</div>
+<div class="line"><a name="l14604"></a><span class="lineno">14604</span>&#160;        m_BlockInfos[i].origBlockIndex = i;</div>
+<div class="line"><a name="l14605"></a><span class="lineno">14605</span>&#160;    }</div>
+<div class="line"><a name="l14606"></a><span class="lineno">14606</span>&#160; </div>
+<div class="line"><a name="l14607"></a><span class="lineno">14607</span>&#160;    VMA_SORT(m_BlockInfos.begin(), m_BlockInfos.end(), [<span class="keyword">this</span>](<span class="keyword">const</span> BlockInfo&amp; lhs, <span class="keyword">const</span> BlockInfo&amp; rhs) -&gt; <span class="keywordtype">bool</span> {</div>
+<div class="line"><a name="l14608"></a><span class="lineno">14608</span>&#160;        return m_pBlockVector-&gt;GetBlock(lhs.origBlockIndex)-&gt;m_pMetadata-&gt;GetSumFreeSize() &lt;</div>
+<div class="line"><a name="l14609"></a><span class="lineno">14609</span>&#160;            m_pBlockVector-&gt;GetBlock(rhs.origBlockIndex)-&gt;m_pMetadata-&gt;GetSumFreeSize();</div>
+<div class="line"><a name="l14610"></a><span class="lineno">14610</span>&#160;    });</div>
+<div class="line"><a name="l14611"></a><span class="lineno">14611</span>&#160; </div>
+<div class="line"><a name="l14612"></a><span class="lineno">14612</span>&#160;    <span class="comment">// THE MAIN ALGORITHM</span></div>
+<div class="line"><a name="l14613"></a><span class="lineno">14613</span>&#160; </div>
+<div class="line"><a name="l14614"></a><span class="lineno">14614</span>&#160;    FreeSpaceDatabase freeSpaceDb;</div>
+<div class="line"><a name="l14615"></a><span class="lineno">14615</span>&#160; </div>
+<div class="line"><a name="l14616"></a><span class="lineno">14616</span>&#160;    <span class="keywordtype">size_t</span> dstBlockInfoIndex = 0;</div>
+<div class="line"><a name="l14617"></a><span class="lineno">14617</span>&#160;    <span class="keywordtype">size_t</span> dstOrigBlockIndex = m_BlockInfos[dstBlockInfoIndex].origBlockIndex;</div>
+<div class="line"><a name="l14618"></a><span class="lineno">14618</span>&#160;    VmaDeviceMemoryBlock* pDstBlock = m_pBlockVector-&gt;GetBlock(dstOrigBlockIndex);</div>
+<div class="line"><a name="l14619"></a><span class="lineno">14619</span>&#160;    VmaBlockMetadata_Generic* pDstMetadata = (VmaBlockMetadata_Generic*)pDstBlock-&gt;m_pMetadata;</div>
+<div class="line"><a name="l14620"></a><span class="lineno">14620</span>&#160;    VkDeviceSize dstBlockSize = pDstMetadata-&gt;GetSize();</div>
+<div class="line"><a name="l14621"></a><span class="lineno">14621</span>&#160;    VkDeviceSize dstOffset = 0;</div>
+<div class="line"><a name="l14622"></a><span class="lineno">14622</span>&#160; </div>
+<div class="line"><a name="l14623"></a><span class="lineno">14623</span>&#160;    <span class="keywordtype">bool</span> end = <span class="keyword">false</span>;</div>
+<div class="line"><a name="l14624"></a><span class="lineno">14624</span>&#160;    <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> srcBlockInfoIndex = 0; !end &amp;&amp; srcBlockInfoIndex &lt; blockCount; ++srcBlockInfoIndex)</div>
+<div class="line"><a name="l14625"></a><span class="lineno">14625</span>&#160;    {</div>
+<div class="line"><a name="l14626"></a><span class="lineno">14626</span>&#160;        <span class="keyword">const</span> <span class="keywordtype">size_t</span> srcOrigBlockIndex = m_BlockInfos[srcBlockInfoIndex].origBlockIndex;</div>
+<div class="line"><a name="l14627"></a><span class="lineno">14627</span>&#160;        VmaDeviceMemoryBlock* <span class="keyword">const</span> pSrcBlock = m_pBlockVector-&gt;GetBlock(srcOrigBlockIndex);</div>
+<div class="line"><a name="l14628"></a><span class="lineno">14628</span>&#160;        VmaBlockMetadata_Generic* <span class="keyword">const</span> pSrcMetadata = (VmaBlockMetadata_Generic*)pSrcBlock-&gt;m_pMetadata;</div>
+<div class="line"><a name="l14629"></a><span class="lineno">14629</span>&#160;        <span class="keywordflow">for</span>(VmaSuballocationList::iterator srcSuballocIt = pSrcMetadata-&gt;m_Suballocations.begin();</div>
+<div class="line"><a name="l14630"></a><span class="lineno">14630</span>&#160;            !end &amp;&amp; srcSuballocIt != pSrcMetadata-&gt;m_Suballocations.end(); )</div>
+<div class="line"><a name="l14631"></a><span class="lineno">14631</span>&#160;        {</div>
+<div class="line"><a name="l14632"></a><span class="lineno">14632</span>&#160;            VmaAllocation_T* <span class="keyword">const</span> pAlloc = srcSuballocIt-&gt;hAllocation;</div>
+<div class="line"><a name="l14633"></a><span class="lineno">14633</span>&#160;            <span class="keyword">const</span> VkDeviceSize srcAllocAlignment = pAlloc-&gt;GetAlignment();</div>
+<div class="line"><a name="l14634"></a><span class="lineno">14634</span>&#160;            <span class="keyword">const</span> VkDeviceSize srcAllocSize = srcSuballocIt-&gt;size;</div>
+<div class="line"><a name="l14635"></a><span class="lineno">14635</span>&#160;            <span class="keywordflow">if</span>(m_AllocationsMoved == maxAllocationsToMove ||</div>
+<div class="line"><a name="l14636"></a><span class="lineno">14636</span>&#160;                m_BytesMoved + srcAllocSize &gt; maxBytesToMove)</div>
+<div class="line"><a name="l14637"></a><span class="lineno">14637</span>&#160;            {</div>
+<div class="line"><a name="l14638"></a><span class="lineno">14638</span>&#160;                end = <span class="keyword">true</span>;</div>
+<div class="line"><a name="l14639"></a><span class="lineno">14639</span>&#160;                <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l14640"></a><span class="lineno">14640</span>&#160;            }</div>
+<div class="line"><a name="l14641"></a><span class="lineno">14641</span>&#160;            <span class="keyword">const</span> VkDeviceSize srcAllocOffset = srcSuballocIt-&gt;offset;</div>
+<div class="line"><a name="l14642"></a><span class="lineno">14642</span>&#160; </div>
+<div class="line"><a name="l14643"></a><span class="lineno">14643</span>&#160;            VmaDefragmentationMove move = {};</div>
+<div class="line"><a name="l14644"></a><span class="lineno">14644</span>&#160;            <span class="comment">// Try to place it in one of free spaces from the database.</span></div>
+<div class="line"><a name="l14645"></a><span class="lineno">14645</span>&#160;            <span class="keywordtype">size_t</span> freeSpaceInfoIndex;</div>
+<div class="line"><a name="l14646"></a><span class="lineno">14646</span>&#160;            VkDeviceSize dstAllocOffset;</div>
+<div class="line"><a name="l14647"></a><span class="lineno">14647</span>&#160;            <span class="keywordflow">if</span>(freeSpaceDb.Fetch(srcAllocAlignment, srcAllocSize,</div>
+<div class="line"><a name="l14648"></a><span class="lineno">14648</span>&#160;                freeSpaceInfoIndex, dstAllocOffset))</div>
+<div class="line"><a name="l14649"></a><span class="lineno">14649</span>&#160;            {</div>
+<div class="line"><a name="l14650"></a><span class="lineno">14650</span>&#160;                <span class="keywordtype">size_t</span> freeSpaceOrigBlockIndex = m_BlockInfos[freeSpaceInfoIndex].origBlockIndex;</div>
+<div class="line"><a name="l14651"></a><span class="lineno">14651</span>&#160;                VmaDeviceMemoryBlock* pFreeSpaceBlock = m_pBlockVector-&gt;GetBlock(freeSpaceOrigBlockIndex);</div>
+<div class="line"><a name="l14652"></a><span class="lineno">14652</span>&#160;                VmaBlockMetadata_Generic* pFreeSpaceMetadata = (VmaBlockMetadata_Generic*)pFreeSpaceBlock-&gt;m_pMetadata;</div>
+<div class="line"><a name="l14653"></a><span class="lineno">14653</span>&#160; </div>
+<div class="line"><a name="l14654"></a><span class="lineno">14654</span>&#160;                <span class="comment">// Same block</span></div>
+<div class="line"><a name="l14655"></a><span class="lineno">14655</span>&#160;                <span class="keywordflow">if</span>(freeSpaceInfoIndex == srcBlockInfoIndex)</div>
+<div class="line"><a name="l14656"></a><span class="lineno">14656</span>&#160;                {</div>
+<div class="line"><a name="l14657"></a><span class="lineno">14657</span>&#160;                    VMA_ASSERT(dstAllocOffset &lt;= srcAllocOffset);</div>
+<div class="line"><a name="l14658"></a><span class="lineno">14658</span>&#160; </div>
+<div class="line"><a name="l14659"></a><span class="lineno">14659</span>&#160;                    <span class="comment">// MOVE OPTION 1: Move the allocation inside the same block by decreasing offset.</span></div>
 <div class="line"><a name="l14660"></a><span class="lineno">14660</span>&#160; </div>
-<div class="line"><a name="l14661"></a><span class="lineno">14661</span>&#160;        <span class="keywordflow">if</span>(m_MaxCpuBytesToMove == 0 &amp;&amp; m_MaxCpuAllocationsToMove == 0 &amp;&amp;</div>
-<div class="line"><a name="l14662"></a><span class="lineno">14662</span>&#160;            m_MaxGpuBytesToMove == 0 &amp;&amp; m_MaxGpuAllocationsToMove == 0)</div>
-<div class="line"><a name="l14663"></a><span class="lineno">14663</span>&#160;            <span class="keywordflow">return</span> VK_SUCCESS;</div>
-<div class="line"><a name="l14664"></a><span class="lineno">14664</span>&#160; </div>
-<div class="line"><a name="l14665"></a><span class="lineno">14665</span>&#160;        <span class="keywordflow">return</span> VK_NOT_READY;</div>
-<div class="line"><a name="l14666"></a><span class="lineno">14666</span>&#160;    }</div>
-<div class="line"><a name="l14667"></a><span class="lineno">14667</span>&#160; </div>
-<div class="line"><a name="l14668"></a><span class="lineno">14668</span>&#160;    <span class="keywordflow">if</span>(commandBuffer == VK_NULL_HANDLE)</div>
-<div class="line"><a name="l14669"></a><span class="lineno">14669</span>&#160;    {</div>
-<div class="line"><a name="l14670"></a><span class="lineno">14670</span>&#160;        maxGpuBytesToMove = 0;</div>
-<div class="line"><a name="l14671"></a><span class="lineno">14671</span>&#160;        maxGpuAllocationsToMove = 0;</div>
-<div class="line"><a name="l14672"></a><span class="lineno">14672</span>&#160;    }</div>
+<div class="line"><a name="l14661"></a><span class="lineno">14661</span>&#160;                    VmaSuballocation suballoc = *srcSuballocIt;</div>
+<div class="line"><a name="l14662"></a><span class="lineno">14662</span>&#160;                    suballoc.offset = dstAllocOffset;</div>
+<div class="line"><a name="l14663"></a><span class="lineno">14663</span>&#160;                    suballoc.hAllocation-&gt;ChangeOffset(dstAllocOffset);</div>
+<div class="line"><a name="l14664"></a><span class="lineno">14664</span>&#160;                    m_BytesMoved += srcAllocSize;</div>
+<div class="line"><a name="l14665"></a><span class="lineno">14665</span>&#160;                    ++m_AllocationsMoved;</div>
+<div class="line"><a name="l14666"></a><span class="lineno">14666</span>&#160; </div>
+<div class="line"><a name="l14667"></a><span class="lineno">14667</span>&#160;                    VmaSuballocationList::iterator nextSuballocIt = srcSuballocIt;</div>
+<div class="line"><a name="l14668"></a><span class="lineno">14668</span>&#160;                    ++nextSuballocIt;</div>
+<div class="line"><a name="l14669"></a><span class="lineno">14669</span>&#160;                    pSrcMetadata-&gt;m_Suballocations.erase(srcSuballocIt);</div>
+<div class="line"><a name="l14670"></a><span class="lineno">14670</span>&#160;                    srcSuballocIt = nextSuballocIt;</div>
+<div class="line"><a name="l14671"></a><span class="lineno">14671</span>&#160; </div>
+<div class="line"><a name="l14672"></a><span class="lineno">14672</span>&#160;                    InsertSuballoc(pFreeSpaceMetadata, suballoc);</div>
 <div class="line"><a name="l14673"></a><span class="lineno">14673</span>&#160; </div>
-<div class="line"><a name="l14674"></a><span class="lineno">14674</span>&#160;    VkResult res = VK_SUCCESS;</div>
-<div class="line"><a name="l14675"></a><span class="lineno">14675</span>&#160; </div>
-<div class="line"><a name="l14676"></a><span class="lineno">14676</span>&#160;    <span class="comment">// Process default pools.</span></div>
-<div class="line"><a name="l14677"></a><span class="lineno">14677</span>&#160;    <span class="keywordflow">for</span>(uint32_t memTypeIndex = 0;</div>
-<div class="line"><a name="l14678"></a><span class="lineno">14678</span>&#160;        memTypeIndex &lt; m_hAllocator-&gt;GetMemoryTypeCount() &amp;&amp; res &gt;= VK_SUCCESS;</div>
-<div class="line"><a name="l14679"></a><span class="lineno">14679</span>&#160;        ++memTypeIndex)</div>
-<div class="line"><a name="l14680"></a><span class="lineno">14680</span>&#160;    {</div>
-<div class="line"><a name="l14681"></a><span class="lineno">14681</span>&#160;        VmaBlockVectorDefragmentationContext* pBlockVectorCtx = m_DefaultPoolContexts[memTypeIndex];</div>
-<div class="line"><a name="l14682"></a><span class="lineno">14682</span>&#160;        <span class="keywordflow">if</span>(pBlockVectorCtx)</div>
-<div class="line"><a name="l14683"></a><span class="lineno">14683</span>&#160;        {</div>
-<div class="line"><a name="l14684"></a><span class="lineno">14684</span>&#160;            VMA_ASSERT(pBlockVectorCtx-&gt;GetBlockVector());</div>
-<div class="line"><a name="l14685"></a><span class="lineno">14685</span>&#160;            pBlockVectorCtx-&gt;GetBlockVector()-&gt;Defragment(</div>
-<div class="line"><a name="l14686"></a><span class="lineno">14686</span>&#160;                pBlockVectorCtx,</div>
-<div class="line"><a name="l14687"></a><span class="lineno">14687</span>&#160;                pStats, flags,</div>
-<div class="line"><a name="l14688"></a><span class="lineno">14688</span>&#160;                maxCpuBytesToMove, maxCpuAllocationsToMove,</div>
-<div class="line"><a name="l14689"></a><span class="lineno">14689</span>&#160;                maxGpuBytesToMove, maxGpuAllocationsToMove,</div>
-<div class="line"><a name="l14690"></a><span class="lineno">14690</span>&#160;                commandBuffer);</div>
-<div class="line"><a name="l14691"></a><span class="lineno">14691</span>&#160;            <span class="keywordflow">if</span>(pBlockVectorCtx-&gt;res != VK_SUCCESS)</div>
-<div class="line"><a name="l14692"></a><span class="lineno">14692</span>&#160;            {</div>
-<div class="line"><a name="l14693"></a><span class="lineno">14693</span>&#160;                res = pBlockVectorCtx-&gt;res;</div>
-<div class="line"><a name="l14694"></a><span class="lineno">14694</span>&#160;            }</div>
-<div class="line"><a name="l14695"></a><span class="lineno">14695</span>&#160;        }</div>
-<div class="line"><a name="l14696"></a><span class="lineno">14696</span>&#160;    }</div>
-<div class="line"><a name="l14697"></a><span class="lineno">14697</span>&#160; </div>
-<div class="line"><a name="l14698"></a><span class="lineno">14698</span>&#160;    <span class="comment">// Process custom pools.</span></div>
-<div class="line"><a name="l14699"></a><span class="lineno">14699</span>&#160;    <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> customCtxIndex = 0, customCtxCount = m_CustomPoolContexts.size();</div>
-<div class="line"><a name="l14700"></a><span class="lineno">14700</span>&#160;        customCtxIndex &lt; customCtxCount &amp;&amp; res &gt;= VK_SUCCESS;</div>
-<div class="line"><a name="l14701"></a><span class="lineno">14701</span>&#160;        ++customCtxIndex)</div>
-<div class="line"><a name="l14702"></a><span class="lineno">14702</span>&#160;    {</div>
-<div class="line"><a name="l14703"></a><span class="lineno">14703</span>&#160;        VmaBlockVectorDefragmentationContext* pBlockVectorCtx = m_CustomPoolContexts[customCtxIndex];</div>
-<div class="line"><a name="l14704"></a><span class="lineno">14704</span>&#160;        VMA_ASSERT(pBlockVectorCtx &amp;&amp; pBlockVectorCtx-&gt;GetBlockVector());</div>
-<div class="line"><a name="l14705"></a><span class="lineno">14705</span>&#160;        pBlockVectorCtx-&gt;GetBlockVector()-&gt;Defragment(</div>
-<div class="line"><a name="l14706"></a><span class="lineno">14706</span>&#160;            pBlockVectorCtx,</div>
-<div class="line"><a name="l14707"></a><span class="lineno">14707</span>&#160;            pStats, flags,</div>
-<div class="line"><a name="l14708"></a><span class="lineno">14708</span>&#160;            maxCpuBytesToMove, maxCpuAllocationsToMove,</div>
-<div class="line"><a name="l14709"></a><span class="lineno">14709</span>&#160;            maxGpuBytesToMove, maxGpuAllocationsToMove,</div>
-<div class="line"><a name="l14710"></a><span class="lineno">14710</span>&#160;            commandBuffer);</div>
-<div class="line"><a name="l14711"></a><span class="lineno">14711</span>&#160;        <span class="keywordflow">if</span>(pBlockVectorCtx-&gt;res != VK_SUCCESS)</div>
-<div class="line"><a name="l14712"></a><span class="lineno">14712</span>&#160;        {</div>
-<div class="line"><a name="l14713"></a><span class="lineno">14713</span>&#160;            res = pBlockVectorCtx-&gt;res;</div>
-<div class="line"><a name="l14714"></a><span class="lineno">14714</span>&#160;        }</div>
-<div class="line"><a name="l14715"></a><span class="lineno">14715</span>&#160;    }</div>
-<div class="line"><a name="l14716"></a><span class="lineno">14716</span>&#160; </div>
-<div class="line"><a name="l14717"></a><span class="lineno">14717</span>&#160;    <span class="keywordflow">return</span> res;</div>
-<div class="line"><a name="l14718"></a><span class="lineno">14718</span>&#160;}</div>
-<div class="line"><a name="l14719"></a><span class="lineno">14719</span>&#160; </div>
-<div class="line"><a name="l14720"></a><span class="lineno">14720</span>&#160;VkResult VmaDefragmentationContext_T::DefragmentPassBegin(<a class="code" href="struct_vma_defragmentation_pass_info.html">VmaDefragmentationPassInfo</a>* pInfo)</div>
-<div class="line"><a name="l14721"></a><span class="lineno">14721</span>&#160;{</div>
-<div class="line"><a name="l14722"></a><span class="lineno">14722</span>&#160;    <a class="code" href="struct_vma_defragmentation_pass_move_info.html">VmaDefragmentationPassMoveInfo</a>* pCurrentMove = pInfo-&gt;<a class="code" href="struct_vma_defragmentation_pass_info.html#acbd42d4a3357999da130a95cd99a3792">pMoves</a>;</div>
-<div class="line"><a name="l14723"></a><span class="lineno">14723</span>&#160;    uint32_t movesLeft = pInfo-&gt;<a class="code" href="struct_vma_defragmentation_pass_info.html#ac1086e657ba995f8d1f4e49b83dcfb6c">moveCount</a>;</div>
-<div class="line"><a name="l14724"></a><span class="lineno">14724</span>&#160; </div>
-<div class="line"><a name="l14725"></a><span class="lineno">14725</span>&#160;    <span class="comment">// Process default pools.</span></div>
-<div class="line"><a name="l14726"></a><span class="lineno">14726</span>&#160;    <span class="keywordflow">for</span>(uint32_t memTypeIndex = 0;</div>
-<div class="line"><a name="l14727"></a><span class="lineno">14727</span>&#160;        memTypeIndex &lt; m_hAllocator-&gt;GetMemoryTypeCount();</div>
-<div class="line"><a name="l14728"></a><span class="lineno">14728</span>&#160;        ++memTypeIndex)</div>
-<div class="line"><a name="l14729"></a><span class="lineno">14729</span>&#160;    {</div>
-<div class="line"><a name="l14730"></a><span class="lineno">14730</span>&#160;        VmaBlockVectorDefragmentationContext *pBlockVectorCtx = m_DefaultPoolContexts[memTypeIndex];</div>
-<div class="line"><a name="l14731"></a><span class="lineno">14731</span>&#160;        <span class="keywordflow">if</span>(pBlockVectorCtx)</div>
-<div class="line"><a name="l14732"></a><span class="lineno">14732</span>&#160;        {</div>
-<div class="line"><a name="l14733"></a><span class="lineno">14733</span>&#160;            VMA_ASSERT(pBlockVectorCtx-&gt;GetBlockVector());</div>
-<div class="line"><a name="l14734"></a><span class="lineno">14734</span>&#160; </div>
-<div class="line"><a name="l14735"></a><span class="lineno">14735</span>&#160;            <span class="keywordflow">if</span>(!pBlockVectorCtx-&gt;hasDefragmentationPlan)</div>
-<div class="line"><a name="l14736"></a><span class="lineno">14736</span>&#160;            {</div>
-<div class="line"><a name="l14737"></a><span class="lineno">14737</span>&#160;                pBlockVectorCtx-&gt;GetBlockVector()-&gt;Defragment(</div>
-<div class="line"><a name="l14738"></a><span class="lineno">14738</span>&#160;                    pBlockVectorCtx,</div>
-<div class="line"><a name="l14739"></a><span class="lineno">14739</span>&#160;                    m_pStats, m_Flags,</div>
-<div class="line"><a name="l14740"></a><span class="lineno">14740</span>&#160;                    m_MaxCpuBytesToMove, m_MaxCpuAllocationsToMove,</div>
-<div class="line"><a name="l14741"></a><span class="lineno">14741</span>&#160;                    m_MaxGpuBytesToMove, m_MaxGpuAllocationsToMove,</div>
-<div class="line"><a name="l14742"></a><span class="lineno">14742</span>&#160;                    VK_NULL_HANDLE);</div>
-<div class="line"><a name="l14743"></a><span class="lineno">14743</span>&#160; </div>
-<div class="line"><a name="l14744"></a><span class="lineno">14744</span>&#160;                <span class="keywordflow">if</span>(pBlockVectorCtx-&gt;res &lt; VK_SUCCESS)</div>
-<div class="line"><a name="l14745"></a><span class="lineno">14745</span>&#160;                    <span class="keywordflow">continue</span>;</div>
-<div class="line"><a name="l14746"></a><span class="lineno">14746</span>&#160; </div>
-<div class="line"><a name="l14747"></a><span class="lineno">14747</span>&#160;                pBlockVectorCtx-&gt;hasDefragmentationPlan = <span class="keyword">true</span>;</div>
-<div class="line"><a name="l14748"></a><span class="lineno">14748</span>&#160;            }</div>
+<div class="line"><a name="l14674"></a><span class="lineno">14674</span>&#160;                    move.srcBlockIndex = srcOrigBlockIndex;</div>
+<div class="line"><a name="l14675"></a><span class="lineno">14675</span>&#160;                    move.dstBlockIndex = freeSpaceOrigBlockIndex;</div>
+<div class="line"><a name="l14676"></a><span class="lineno">14676</span>&#160;                    move.srcOffset = srcAllocOffset;</div>
+<div class="line"><a name="l14677"></a><span class="lineno">14677</span>&#160;                    move.dstOffset = dstAllocOffset;</div>
+<div class="line"><a name="l14678"></a><span class="lineno">14678</span>&#160;                    move.size = srcAllocSize;</div>
+<div class="line"><a name="l14679"></a><span class="lineno">14679</span>&#160; </div>
+<div class="line"><a name="l14680"></a><span class="lineno">14680</span>&#160;                    moves.push_back(move);</div>
+<div class="line"><a name="l14681"></a><span class="lineno">14681</span>&#160;                }</div>
+<div class="line"><a name="l14682"></a><span class="lineno">14682</span>&#160;                <span class="comment">// Different block</span></div>
+<div class="line"><a name="l14683"></a><span class="lineno">14683</span>&#160;                <span class="keywordflow">else</span></div>
+<div class="line"><a name="l14684"></a><span class="lineno">14684</span>&#160;                {</div>
+<div class="line"><a name="l14685"></a><span class="lineno">14685</span>&#160;                    <span class="comment">// MOVE OPTION 2: Move the allocation to a different block.</span></div>
+<div class="line"><a name="l14686"></a><span class="lineno">14686</span>&#160; </div>
+<div class="line"><a name="l14687"></a><span class="lineno">14687</span>&#160;                    VMA_ASSERT(freeSpaceInfoIndex &lt; srcBlockInfoIndex);</div>
+<div class="line"><a name="l14688"></a><span class="lineno">14688</span>&#160; </div>
+<div class="line"><a name="l14689"></a><span class="lineno">14689</span>&#160;                    VmaSuballocation suballoc = *srcSuballocIt;</div>
+<div class="line"><a name="l14690"></a><span class="lineno">14690</span>&#160;                    suballoc.offset = dstAllocOffset;</div>
+<div class="line"><a name="l14691"></a><span class="lineno">14691</span>&#160;                    suballoc.hAllocation-&gt;ChangeBlockAllocation(m_hAllocator, pFreeSpaceBlock, dstAllocOffset);</div>
+<div class="line"><a name="l14692"></a><span class="lineno">14692</span>&#160;                    m_BytesMoved += srcAllocSize;</div>
+<div class="line"><a name="l14693"></a><span class="lineno">14693</span>&#160;                    ++m_AllocationsMoved;</div>
+<div class="line"><a name="l14694"></a><span class="lineno">14694</span>&#160; </div>
+<div class="line"><a name="l14695"></a><span class="lineno">14695</span>&#160;                    VmaSuballocationList::iterator nextSuballocIt = srcSuballocIt;</div>
+<div class="line"><a name="l14696"></a><span class="lineno">14696</span>&#160;                    ++nextSuballocIt;</div>
+<div class="line"><a name="l14697"></a><span class="lineno">14697</span>&#160;                    pSrcMetadata-&gt;m_Suballocations.erase(srcSuballocIt);</div>
+<div class="line"><a name="l14698"></a><span class="lineno">14698</span>&#160;                    srcSuballocIt = nextSuballocIt;</div>
+<div class="line"><a name="l14699"></a><span class="lineno">14699</span>&#160; </div>
+<div class="line"><a name="l14700"></a><span class="lineno">14700</span>&#160;                    InsertSuballoc(pFreeSpaceMetadata, suballoc);</div>
+<div class="line"><a name="l14701"></a><span class="lineno">14701</span>&#160; </div>
+<div class="line"><a name="l14702"></a><span class="lineno">14702</span>&#160;                    move.srcBlockIndex = srcOrigBlockIndex;</div>
+<div class="line"><a name="l14703"></a><span class="lineno">14703</span>&#160;                    move.dstBlockIndex = freeSpaceOrigBlockIndex;</div>
+<div class="line"><a name="l14704"></a><span class="lineno">14704</span>&#160;                    move.srcOffset = srcAllocOffset;</div>
+<div class="line"><a name="l14705"></a><span class="lineno">14705</span>&#160;                    move.dstOffset = dstAllocOffset;</div>
+<div class="line"><a name="l14706"></a><span class="lineno">14706</span>&#160;                    move.size = srcAllocSize;</div>
+<div class="line"><a name="l14707"></a><span class="lineno">14707</span>&#160; </div>
+<div class="line"><a name="l14708"></a><span class="lineno">14708</span>&#160;                    moves.push_back(move);</div>
+<div class="line"><a name="l14709"></a><span class="lineno">14709</span>&#160;                }</div>
+<div class="line"><a name="l14710"></a><span class="lineno">14710</span>&#160;            }</div>
+<div class="line"><a name="l14711"></a><span class="lineno">14711</span>&#160;            <span class="keywordflow">else</span></div>
+<div class="line"><a name="l14712"></a><span class="lineno">14712</span>&#160;            {</div>
+<div class="line"><a name="l14713"></a><span class="lineno">14713</span>&#160;                dstAllocOffset = VmaAlignUp(dstOffset, srcAllocAlignment);</div>
+<div class="line"><a name="l14714"></a><span class="lineno">14714</span>&#160; </div>
+<div class="line"><a name="l14715"></a><span class="lineno">14715</span>&#160;                <span class="comment">// If the allocation doesn&#39;t fit before the end of dstBlock, forward to next block.</span></div>
+<div class="line"><a name="l14716"></a><span class="lineno">14716</span>&#160;                <span class="keywordflow">while</span>(dstBlockInfoIndex &lt; srcBlockInfoIndex &amp;&amp;</div>
+<div class="line"><a name="l14717"></a><span class="lineno">14717</span>&#160;                    dstAllocOffset + srcAllocSize &gt; dstBlockSize)</div>
+<div class="line"><a name="l14718"></a><span class="lineno">14718</span>&#160;                {</div>
+<div class="line"><a name="l14719"></a><span class="lineno">14719</span>&#160;                    <span class="comment">// But before that, register remaining free space at the end of dst block.</span></div>
+<div class="line"><a name="l14720"></a><span class="lineno">14720</span>&#160;                    freeSpaceDb.Register(dstBlockInfoIndex, dstOffset, dstBlockSize - dstOffset);</div>
+<div class="line"><a name="l14721"></a><span class="lineno">14721</span>&#160; </div>
+<div class="line"><a name="l14722"></a><span class="lineno">14722</span>&#160;                    ++dstBlockInfoIndex;</div>
+<div class="line"><a name="l14723"></a><span class="lineno">14723</span>&#160;                    dstOrigBlockIndex = m_BlockInfos[dstBlockInfoIndex].origBlockIndex;</div>
+<div class="line"><a name="l14724"></a><span class="lineno">14724</span>&#160;                    pDstBlock = m_pBlockVector-&gt;GetBlock(dstOrigBlockIndex);</div>
+<div class="line"><a name="l14725"></a><span class="lineno">14725</span>&#160;                    pDstMetadata = (VmaBlockMetadata_Generic*)pDstBlock-&gt;m_pMetadata;</div>
+<div class="line"><a name="l14726"></a><span class="lineno">14726</span>&#160;                    dstBlockSize = pDstMetadata-&gt;GetSize();</div>
+<div class="line"><a name="l14727"></a><span class="lineno">14727</span>&#160;                    dstOffset = 0;</div>
+<div class="line"><a name="l14728"></a><span class="lineno">14728</span>&#160;                    dstAllocOffset = 0;</div>
+<div class="line"><a name="l14729"></a><span class="lineno">14729</span>&#160;                }</div>
+<div class="line"><a name="l14730"></a><span class="lineno">14730</span>&#160; </div>
+<div class="line"><a name="l14731"></a><span class="lineno">14731</span>&#160;                <span class="comment">// Same block</span></div>
+<div class="line"><a name="l14732"></a><span class="lineno">14732</span>&#160;                <span class="keywordflow">if</span>(dstBlockInfoIndex == srcBlockInfoIndex)</div>
+<div class="line"><a name="l14733"></a><span class="lineno">14733</span>&#160;                {</div>
+<div class="line"><a name="l14734"></a><span class="lineno">14734</span>&#160;                    VMA_ASSERT(dstAllocOffset &lt;= srcAllocOffset);</div>
+<div class="line"><a name="l14735"></a><span class="lineno">14735</span>&#160; </div>
+<div class="line"><a name="l14736"></a><span class="lineno">14736</span>&#160;                    <span class="keyword">const</span> <span class="keywordtype">bool</span> overlap = dstAllocOffset + srcAllocSize &gt; srcAllocOffset;</div>
+<div class="line"><a name="l14737"></a><span class="lineno">14737</span>&#160; </div>
+<div class="line"><a name="l14738"></a><span class="lineno">14738</span>&#160;                    <span class="keywordtype">bool</span> skipOver = overlap;</div>
+<div class="line"><a name="l14739"></a><span class="lineno">14739</span>&#160;                    <span class="keywordflow">if</span>(overlap &amp;&amp; m_OverlappingMoveSupported &amp;&amp; dstAllocOffset &lt; srcAllocOffset)</div>
+<div class="line"><a name="l14740"></a><span class="lineno">14740</span>&#160;                    {</div>
+<div class="line"><a name="l14741"></a><span class="lineno">14741</span>&#160;                        <span class="comment">// If destination and source place overlap, skip if it would move it</span></div>
+<div class="line"><a name="l14742"></a><span class="lineno">14742</span>&#160;                        <span class="comment">// by only &lt; 1/64 of its size.</span></div>
+<div class="line"><a name="l14743"></a><span class="lineno">14743</span>&#160;                        skipOver = (srcAllocOffset - dstAllocOffset) * 64 &lt; srcAllocSize;</div>
+<div class="line"><a name="l14744"></a><span class="lineno">14744</span>&#160;                    }</div>
+<div class="line"><a name="l14745"></a><span class="lineno">14745</span>&#160; </div>
+<div class="line"><a name="l14746"></a><span class="lineno">14746</span>&#160;                    <span class="keywordflow">if</span>(skipOver)</div>
+<div class="line"><a name="l14747"></a><span class="lineno">14747</span>&#160;                    {</div>
+<div class="line"><a name="l14748"></a><span class="lineno">14748</span>&#160;                        freeSpaceDb.Register(dstBlockInfoIndex, dstOffset, srcAllocOffset - dstOffset);</div>
 <div class="line"><a name="l14749"></a><span class="lineno">14749</span>&#160; </div>
-<div class="line"><a name="l14750"></a><span class="lineno">14750</span>&#160;            <span class="keyword">const</span> uint32_t processed = pBlockVectorCtx-&gt;GetBlockVector()-&gt;ProcessDefragmentations(</div>
-<div class="line"><a name="l14751"></a><span class="lineno">14751</span>&#160;                pBlockVectorCtx,</div>
-<div class="line"><a name="l14752"></a><span class="lineno">14752</span>&#160;                pCurrentMove, movesLeft);</div>
-<div class="line"><a name="l14753"></a><span class="lineno">14753</span>&#160; </div>
-<div class="line"><a name="l14754"></a><span class="lineno">14754</span>&#160;            movesLeft -= processed;</div>
-<div class="line"><a name="l14755"></a><span class="lineno">14755</span>&#160;            pCurrentMove += processed;</div>
-<div class="line"><a name="l14756"></a><span class="lineno">14756</span>&#160;        }</div>
-<div class="line"><a name="l14757"></a><span class="lineno">14757</span>&#160;    }</div>
-<div class="line"><a name="l14758"></a><span class="lineno">14758</span>&#160; </div>
-<div class="line"><a name="l14759"></a><span class="lineno">14759</span>&#160;    <span class="comment">// Process custom pools.</span></div>
-<div class="line"><a name="l14760"></a><span class="lineno">14760</span>&#160;    <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> customCtxIndex = 0, customCtxCount = m_CustomPoolContexts.size();</div>
-<div class="line"><a name="l14761"></a><span class="lineno">14761</span>&#160;        customCtxIndex &lt; customCtxCount;</div>
-<div class="line"><a name="l14762"></a><span class="lineno">14762</span>&#160;        ++customCtxIndex)</div>
-<div class="line"><a name="l14763"></a><span class="lineno">14763</span>&#160;    {</div>
-<div class="line"><a name="l14764"></a><span class="lineno">14764</span>&#160;        VmaBlockVectorDefragmentationContext *pBlockVectorCtx = m_CustomPoolContexts[customCtxIndex];</div>
-<div class="line"><a name="l14765"></a><span class="lineno">14765</span>&#160;        VMA_ASSERT(pBlockVectorCtx &amp;&amp; pBlockVectorCtx-&gt;GetBlockVector());</div>
-<div class="line"><a name="l14766"></a><span class="lineno">14766</span>&#160; </div>
-<div class="line"><a name="l14767"></a><span class="lineno">14767</span>&#160;        <span class="keywordflow">if</span>(!pBlockVectorCtx-&gt;hasDefragmentationPlan)</div>
-<div class="line"><a name="l14768"></a><span class="lineno">14768</span>&#160;        {</div>
-<div class="line"><a name="l14769"></a><span class="lineno">14769</span>&#160;            pBlockVectorCtx-&gt;GetBlockVector()-&gt;Defragment(</div>
-<div class="line"><a name="l14770"></a><span class="lineno">14770</span>&#160;                pBlockVectorCtx,</div>
-<div class="line"><a name="l14771"></a><span class="lineno">14771</span>&#160;                m_pStats, m_Flags,</div>
-<div class="line"><a name="l14772"></a><span class="lineno">14772</span>&#160;                m_MaxCpuBytesToMove, m_MaxCpuAllocationsToMove,</div>
-<div class="line"><a name="l14773"></a><span class="lineno">14773</span>&#160;                m_MaxGpuBytesToMove, m_MaxGpuAllocationsToMove,</div>
-<div class="line"><a name="l14774"></a><span class="lineno">14774</span>&#160;                VK_NULL_HANDLE);</div>
-<div class="line"><a name="l14775"></a><span class="lineno">14775</span>&#160; </div>
-<div class="line"><a name="l14776"></a><span class="lineno">14776</span>&#160;            <span class="keywordflow">if</span>(pBlockVectorCtx-&gt;res &lt; VK_SUCCESS)</div>
-<div class="line"><a name="l14777"></a><span class="lineno">14777</span>&#160;                <span class="keywordflow">continue</span>;</div>
-<div class="line"><a name="l14778"></a><span class="lineno">14778</span>&#160; </div>
-<div class="line"><a name="l14779"></a><span class="lineno">14779</span>&#160;            pBlockVectorCtx-&gt;hasDefragmentationPlan = <span class="keyword">true</span>;</div>
-<div class="line"><a name="l14780"></a><span class="lineno">14780</span>&#160;        }</div>
-<div class="line"><a name="l14781"></a><span class="lineno">14781</span>&#160; </div>
-<div class="line"><a name="l14782"></a><span class="lineno">14782</span>&#160;        <span class="keyword">const</span> uint32_t processed = pBlockVectorCtx-&gt;GetBlockVector()-&gt;ProcessDefragmentations(</div>
-<div class="line"><a name="l14783"></a><span class="lineno">14783</span>&#160;            pBlockVectorCtx,</div>
-<div class="line"><a name="l14784"></a><span class="lineno">14784</span>&#160;            pCurrentMove, movesLeft);</div>
-<div class="line"><a name="l14785"></a><span class="lineno">14785</span>&#160; </div>
-<div class="line"><a name="l14786"></a><span class="lineno">14786</span>&#160;        movesLeft -= processed;</div>
-<div class="line"><a name="l14787"></a><span class="lineno">14787</span>&#160;        pCurrentMove += processed;</div>
-<div class="line"><a name="l14788"></a><span class="lineno">14788</span>&#160;    }</div>
-<div class="line"><a name="l14789"></a><span class="lineno">14789</span>&#160; </div>
-<div class="line"><a name="l14790"></a><span class="lineno">14790</span>&#160;    pInfo-&gt;<a class="code" href="struct_vma_defragmentation_pass_info.html#ac1086e657ba995f8d1f4e49b83dcfb6c">moveCount</a> = pInfo-&gt;<a class="code" href="struct_vma_defragmentation_pass_info.html#ac1086e657ba995f8d1f4e49b83dcfb6c">moveCount</a> - movesLeft;</div>
+<div class="line"><a name="l14750"></a><span class="lineno">14750</span>&#160;                        dstOffset = srcAllocOffset + srcAllocSize;</div>
+<div class="line"><a name="l14751"></a><span class="lineno">14751</span>&#160;                        ++srcSuballocIt;</div>
+<div class="line"><a name="l14752"></a><span class="lineno">14752</span>&#160;                    }</div>
+<div class="line"><a name="l14753"></a><span class="lineno">14753</span>&#160;                    <span class="comment">// MOVE OPTION 1: Move the allocation inside the same block by decreasing offset.</span></div>
+<div class="line"><a name="l14754"></a><span class="lineno">14754</span>&#160;                    <span class="keywordflow">else</span></div>
+<div class="line"><a name="l14755"></a><span class="lineno">14755</span>&#160;                    {</div>
+<div class="line"><a name="l14756"></a><span class="lineno">14756</span>&#160;                        srcSuballocIt-&gt;offset = dstAllocOffset;</div>
+<div class="line"><a name="l14757"></a><span class="lineno">14757</span>&#160;                        srcSuballocIt-&gt;hAllocation-&gt;ChangeOffset(dstAllocOffset);</div>
+<div class="line"><a name="l14758"></a><span class="lineno">14758</span>&#160;                        dstOffset = dstAllocOffset + srcAllocSize;</div>
+<div class="line"><a name="l14759"></a><span class="lineno">14759</span>&#160;                        m_BytesMoved += srcAllocSize;</div>
+<div class="line"><a name="l14760"></a><span class="lineno">14760</span>&#160;                        ++m_AllocationsMoved;</div>
+<div class="line"><a name="l14761"></a><span class="lineno">14761</span>&#160;                        ++srcSuballocIt;</div>
+<div class="line"><a name="l14762"></a><span class="lineno">14762</span>&#160; </div>
+<div class="line"><a name="l14763"></a><span class="lineno">14763</span>&#160;                        move.srcBlockIndex = srcOrigBlockIndex;</div>
+<div class="line"><a name="l14764"></a><span class="lineno">14764</span>&#160;                        move.dstBlockIndex = dstOrigBlockIndex;</div>
+<div class="line"><a name="l14765"></a><span class="lineno">14765</span>&#160;                        move.srcOffset = srcAllocOffset;</div>
+<div class="line"><a name="l14766"></a><span class="lineno">14766</span>&#160;                        move.dstOffset = dstAllocOffset;</div>
+<div class="line"><a name="l14767"></a><span class="lineno">14767</span>&#160;                        move.size = srcAllocSize;</div>
+<div class="line"><a name="l14768"></a><span class="lineno">14768</span>&#160; </div>
+<div class="line"><a name="l14769"></a><span class="lineno">14769</span>&#160;                        moves.push_back(move);</div>
+<div class="line"><a name="l14770"></a><span class="lineno">14770</span>&#160;                    }</div>
+<div class="line"><a name="l14771"></a><span class="lineno">14771</span>&#160;                }</div>
+<div class="line"><a name="l14772"></a><span class="lineno">14772</span>&#160;                <span class="comment">// Different block</span></div>
+<div class="line"><a name="l14773"></a><span class="lineno">14773</span>&#160;                <span class="keywordflow">else</span></div>
+<div class="line"><a name="l14774"></a><span class="lineno">14774</span>&#160;                {</div>
+<div class="line"><a name="l14775"></a><span class="lineno">14775</span>&#160;                    <span class="comment">// MOVE OPTION 2: Move the allocation to a different block.</span></div>
+<div class="line"><a name="l14776"></a><span class="lineno">14776</span>&#160; </div>
+<div class="line"><a name="l14777"></a><span class="lineno">14777</span>&#160;                    VMA_ASSERT(dstBlockInfoIndex &lt; srcBlockInfoIndex);</div>
+<div class="line"><a name="l14778"></a><span class="lineno">14778</span>&#160;                    VMA_ASSERT(dstAllocOffset + srcAllocSize &lt;= dstBlockSize);</div>
+<div class="line"><a name="l14779"></a><span class="lineno">14779</span>&#160; </div>
+<div class="line"><a name="l14780"></a><span class="lineno">14780</span>&#160;                    VmaSuballocation suballoc = *srcSuballocIt;</div>
+<div class="line"><a name="l14781"></a><span class="lineno">14781</span>&#160;                    suballoc.offset = dstAllocOffset;</div>
+<div class="line"><a name="l14782"></a><span class="lineno">14782</span>&#160;                    suballoc.hAllocation-&gt;ChangeBlockAllocation(m_hAllocator, pDstBlock, dstAllocOffset);</div>
+<div class="line"><a name="l14783"></a><span class="lineno">14783</span>&#160;                    dstOffset = dstAllocOffset + srcAllocSize;</div>
+<div class="line"><a name="l14784"></a><span class="lineno">14784</span>&#160;                    m_BytesMoved += srcAllocSize;</div>
+<div class="line"><a name="l14785"></a><span class="lineno">14785</span>&#160;                    ++m_AllocationsMoved;</div>
+<div class="line"><a name="l14786"></a><span class="lineno">14786</span>&#160; </div>
+<div class="line"><a name="l14787"></a><span class="lineno">14787</span>&#160;                    VmaSuballocationList::iterator nextSuballocIt = srcSuballocIt;</div>
+<div class="line"><a name="l14788"></a><span class="lineno">14788</span>&#160;                    ++nextSuballocIt;</div>
+<div class="line"><a name="l14789"></a><span class="lineno">14789</span>&#160;                    pSrcMetadata-&gt;m_Suballocations.erase(srcSuballocIt);</div>
+<div class="line"><a name="l14790"></a><span class="lineno">14790</span>&#160;                    srcSuballocIt = nextSuballocIt;</div>
 <div class="line"><a name="l14791"></a><span class="lineno">14791</span>&#160; </div>
-<div class="line"><a name="l14792"></a><span class="lineno">14792</span>&#160;    <span class="keywordflow">return</span> VK_SUCCESS;</div>
-<div class="line"><a name="l14793"></a><span class="lineno">14793</span>&#160;}</div>
-<div class="line"><a name="l14794"></a><span class="lineno">14794</span>&#160;VkResult VmaDefragmentationContext_T::DefragmentPassEnd()</div>
-<div class="line"><a name="l14795"></a><span class="lineno">14795</span>&#160;{</div>
-<div class="line"><a name="l14796"></a><span class="lineno">14796</span>&#160;    VkResult res = VK_SUCCESS;</div>
-<div class="line"><a name="l14797"></a><span class="lineno">14797</span>&#160; </div>
-<div class="line"><a name="l14798"></a><span class="lineno">14798</span>&#160;    <span class="comment">// Process default pools.</span></div>
-<div class="line"><a name="l14799"></a><span class="lineno">14799</span>&#160;    <span class="keywordflow">for</span>(uint32_t memTypeIndex = 0;</div>
-<div class="line"><a name="l14800"></a><span class="lineno">14800</span>&#160;        memTypeIndex &lt; m_hAllocator-&gt;GetMemoryTypeCount();</div>
-<div class="line"><a name="l14801"></a><span class="lineno">14801</span>&#160;        ++memTypeIndex)</div>
-<div class="line"><a name="l14802"></a><span class="lineno">14802</span>&#160;    {</div>
-<div class="line"><a name="l14803"></a><span class="lineno">14803</span>&#160;        VmaBlockVectorDefragmentationContext *pBlockVectorCtx = m_DefaultPoolContexts[memTypeIndex];</div>
-<div class="line"><a name="l14804"></a><span class="lineno">14804</span>&#160;        <span class="keywordflow">if</span>(pBlockVectorCtx)</div>
-<div class="line"><a name="l14805"></a><span class="lineno">14805</span>&#160;        {</div>
-<div class="line"><a name="l14806"></a><span class="lineno">14806</span>&#160;            VMA_ASSERT(pBlockVectorCtx-&gt;GetBlockVector());</div>
+<div class="line"><a name="l14792"></a><span class="lineno">14792</span>&#160;                    pDstMetadata-&gt;m_Suballocations.push_back(suballoc);</div>
+<div class="line"><a name="l14793"></a><span class="lineno">14793</span>&#160; </div>
+<div class="line"><a name="l14794"></a><span class="lineno">14794</span>&#160;                    move.srcBlockIndex = srcOrigBlockIndex;</div>
+<div class="line"><a name="l14795"></a><span class="lineno">14795</span>&#160;                    move.dstBlockIndex = dstOrigBlockIndex;</div>
+<div class="line"><a name="l14796"></a><span class="lineno">14796</span>&#160;                    move.srcOffset = srcAllocOffset;</div>
+<div class="line"><a name="l14797"></a><span class="lineno">14797</span>&#160;                    move.dstOffset = dstAllocOffset;</div>
+<div class="line"><a name="l14798"></a><span class="lineno">14798</span>&#160;                    move.size = srcAllocSize;</div>
+<div class="line"><a name="l14799"></a><span class="lineno">14799</span>&#160; </div>
+<div class="line"><a name="l14800"></a><span class="lineno">14800</span>&#160;                    moves.push_back(move);</div>
+<div class="line"><a name="l14801"></a><span class="lineno">14801</span>&#160;                }</div>
+<div class="line"><a name="l14802"></a><span class="lineno">14802</span>&#160;            }</div>
+<div class="line"><a name="l14803"></a><span class="lineno">14803</span>&#160;        }</div>
+<div class="line"><a name="l14804"></a><span class="lineno">14804</span>&#160;    }</div>
+<div class="line"><a name="l14805"></a><span class="lineno">14805</span>&#160; </div>
+<div class="line"><a name="l14806"></a><span class="lineno">14806</span>&#160;    m_BlockInfos.clear();</div>
 <div class="line"><a name="l14807"></a><span class="lineno">14807</span>&#160; </div>
-<div class="line"><a name="l14808"></a><span class="lineno">14808</span>&#160;            <span class="keywordflow">if</span>(!pBlockVectorCtx-&gt;hasDefragmentationPlan)</div>
-<div class="line"><a name="l14809"></a><span class="lineno">14809</span>&#160;            {</div>
-<div class="line"><a name="l14810"></a><span class="lineno">14810</span>&#160;                res = VK_NOT_READY;</div>
-<div class="line"><a name="l14811"></a><span class="lineno">14811</span>&#160;                <span class="keywordflow">continue</span>;</div>
-<div class="line"><a name="l14812"></a><span class="lineno">14812</span>&#160;            }</div>
-<div class="line"><a name="l14813"></a><span class="lineno">14813</span>&#160; </div>
-<div class="line"><a name="l14814"></a><span class="lineno">14814</span>&#160;            pBlockVectorCtx-&gt;GetBlockVector()-&gt;CommitDefragmentations(</div>
-<div class="line"><a name="l14815"></a><span class="lineno">14815</span>&#160;                pBlockVectorCtx, m_pStats);</div>
-<div class="line"><a name="l14816"></a><span class="lineno">14816</span>&#160; </div>
-<div class="line"><a name="l14817"></a><span class="lineno">14817</span>&#160;            <span class="keywordflow">if</span>(pBlockVectorCtx-&gt;defragmentationMoves.size() != pBlockVectorCtx-&gt;defragmentationMovesCommitted)</div>
-<div class="line"><a name="l14818"></a><span class="lineno">14818</span>&#160;                res = VK_NOT_READY;</div>
-<div class="line"><a name="l14819"></a><span class="lineno">14819</span>&#160;        }</div>
-<div class="line"><a name="l14820"></a><span class="lineno">14820</span>&#160;    }</div>
-<div class="line"><a name="l14821"></a><span class="lineno">14821</span>&#160; </div>
-<div class="line"><a name="l14822"></a><span class="lineno">14822</span>&#160;    <span class="comment">// Process custom pools.</span></div>
-<div class="line"><a name="l14823"></a><span class="lineno">14823</span>&#160;    <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> customCtxIndex = 0, customCtxCount = m_CustomPoolContexts.size();</div>
-<div class="line"><a name="l14824"></a><span class="lineno">14824</span>&#160;        customCtxIndex &lt; customCtxCount;</div>
-<div class="line"><a name="l14825"></a><span class="lineno">14825</span>&#160;        ++customCtxIndex)</div>
-<div class="line"><a name="l14826"></a><span class="lineno">14826</span>&#160;    {</div>
-<div class="line"><a name="l14827"></a><span class="lineno">14827</span>&#160;        VmaBlockVectorDefragmentationContext *pBlockVectorCtx = m_CustomPoolContexts[customCtxIndex];</div>
-<div class="line"><a name="l14828"></a><span class="lineno">14828</span>&#160;        VMA_ASSERT(pBlockVectorCtx &amp;&amp; pBlockVectorCtx-&gt;GetBlockVector());</div>
-<div class="line"><a name="l14829"></a><span class="lineno">14829</span>&#160; </div>
-<div class="line"><a name="l14830"></a><span class="lineno">14830</span>&#160;        <span class="keywordflow">if</span>(!pBlockVectorCtx-&gt;hasDefragmentationPlan)</div>
-<div class="line"><a name="l14831"></a><span class="lineno">14831</span>&#160;        {</div>
-<div class="line"><a name="l14832"></a><span class="lineno">14832</span>&#160;            res = VK_NOT_READY;</div>
-<div class="line"><a name="l14833"></a><span class="lineno">14833</span>&#160;            <span class="keywordflow">continue</span>;</div>
-<div class="line"><a name="l14834"></a><span class="lineno">14834</span>&#160;        }</div>
-<div class="line"><a name="l14835"></a><span class="lineno">14835</span>&#160; </div>
-<div class="line"><a name="l14836"></a><span class="lineno">14836</span>&#160;        pBlockVectorCtx-&gt;GetBlockVector()-&gt;CommitDefragmentations(</div>
-<div class="line"><a name="l14837"></a><span class="lineno">14837</span>&#160;            pBlockVectorCtx, m_pStats);</div>
-<div class="line"><a name="l14838"></a><span class="lineno">14838</span>&#160; </div>
-<div class="line"><a name="l14839"></a><span class="lineno">14839</span>&#160;        <span class="keywordflow">if</span>(pBlockVectorCtx-&gt;defragmentationMoves.size() != pBlockVectorCtx-&gt;defragmentationMovesCommitted)</div>
-<div class="line"><a name="l14840"></a><span class="lineno">14840</span>&#160;            res = VK_NOT_READY;</div>
-<div class="line"><a name="l14841"></a><span class="lineno">14841</span>&#160;    }</div>
-<div class="line"><a name="l14842"></a><span class="lineno">14842</span>&#160; </div>
-<div class="line"><a name="l14843"></a><span class="lineno">14843</span>&#160;    <span class="keywordflow">return</span> res;</div>
-<div class="line"><a name="l14844"></a><span class="lineno">14844</span>&#160;}</div>
-<div class="line"><a name="l14845"></a><span class="lineno">14845</span>&#160; </div>
-<div class="line"><a name="l14847"></a><span class="lineno">14847</span>&#160;<span class="comment">// VmaRecorder</span></div>
-<div class="line"><a name="l14848"></a><span class="lineno">14848</span>&#160; </div>
-<div class="line"><a name="l14849"></a><span class="lineno">14849</span>&#160;<span class="preprocessor">#if VMA_RECORDING_ENABLED</span></div>
-<div class="line"><a name="l14850"></a><span class="lineno">14850</span>&#160; </div>
-<div class="line"><a name="l14851"></a><span class="lineno">14851</span>&#160;VmaRecorder::VmaRecorder() :</div>
-<div class="line"><a name="l14852"></a><span class="lineno">14852</span>&#160;    m_UseMutex(true),</div>
-<div class="line"><a name="l14853"></a><span class="lineno">14853</span>&#160;    m_Flags(0),</div>
-<div class="line"><a name="l14854"></a><span class="lineno">14854</span>&#160;    m_File(VMA_NULL),</div>
-<div class="line"><a name="l14855"></a><span class="lineno">14855</span>&#160;    m_RecordingStartTime(std::chrono::high_resolution_clock::now())</div>
-<div class="line"><a name="l14856"></a><span class="lineno">14856</span>&#160;{</div>
-<div class="line"><a name="l14857"></a><span class="lineno">14857</span>&#160;}</div>
-<div class="line"><a name="l14858"></a><span class="lineno">14858</span>&#160; </div>
-<div class="line"><a name="l14859"></a><span class="lineno">14859</span>&#160;VkResult VmaRecorder::Init(<span class="keyword">const</span> <a class="code" href="struct_vma_record_settings.html">VmaRecordSettings</a>&amp; settings, <span class="keywordtype">bool</span> useMutex)</div>
-<div class="line"><a name="l14860"></a><span class="lineno">14860</span>&#160;{</div>
-<div class="line"><a name="l14861"></a><span class="lineno">14861</span>&#160;    m_UseMutex = useMutex;</div>
-<div class="line"><a name="l14862"></a><span class="lineno">14862</span>&#160;    m_Flags = settings.<a class="code" href="struct_vma_record_settings.html#ad8fdcc92119ae7a8c08c1a564c01d63a">flags</a>;</div>
-<div class="line"><a name="l14863"></a><span class="lineno">14863</span>&#160; </div>
-<div class="line"><a name="l14864"></a><span class="lineno">14864</span>&#160;<span class="preprocessor">#if defined(_WIN32)</span></div>
-<div class="line"><a name="l14865"></a><span class="lineno">14865</span>&#160;    <span class="comment">// Open file for writing.</span></div>
-<div class="line"><a name="l14866"></a><span class="lineno">14866</span>&#160;    errno_t err = fopen_s(&amp;m_File, settings.<a class="code" href="struct_vma_record_settings.html#a6cb1fdbf6bcb610b68f2010dd629e89d">pFilePath</a>, <span class="stringliteral">&quot;wb&quot;</span>);</div>
-<div class="line"><a name="l14867"></a><span class="lineno">14867</span>&#160; </div>
-<div class="line"><a name="l14868"></a><span class="lineno">14868</span>&#160;    <span class="keywordflow">if</span>(err != 0)</div>
-<div class="line"><a name="l14869"></a><span class="lineno">14869</span>&#160;    {</div>
-<div class="line"><a name="l14870"></a><span class="lineno">14870</span>&#160;        <span class="keywordflow">return</span> VK_ERROR_INITIALIZATION_FAILED;</div>
-<div class="line"><a name="l14871"></a><span class="lineno">14871</span>&#160;    }</div>
-<div class="line"><a name="l14872"></a><span class="lineno">14872</span>&#160;<span class="preprocessor">#else</span></div>
-<div class="line"><a name="l14873"></a><span class="lineno">14873</span>&#160;    <span class="comment">// Open file for writing.</span></div>
-<div class="line"><a name="l14874"></a><span class="lineno">14874</span>&#160;    m_File = fopen(settings.<a class="code" href="struct_vma_record_settings.html#a6cb1fdbf6bcb610b68f2010dd629e89d">pFilePath</a>, <span class="stringliteral">&quot;wb&quot;</span>);</div>
-<div class="line"><a name="l14875"></a><span class="lineno">14875</span>&#160; </div>
-<div class="line"><a name="l14876"></a><span class="lineno">14876</span>&#160;    <span class="keywordflow">if</span>(m_File == 0)</div>
-<div class="line"><a name="l14877"></a><span class="lineno">14877</span>&#160;    {</div>
-<div class="line"><a name="l14878"></a><span class="lineno">14878</span>&#160;        <span class="keywordflow">return</span> VK_ERROR_INITIALIZATION_FAILED;</div>
-<div class="line"><a name="l14879"></a><span class="lineno">14879</span>&#160;    }</div>
-<div class="line"><a name="l14880"></a><span class="lineno">14880</span>&#160;<span class="preprocessor">#endif</span></div>
-<div class="line"><a name="l14881"></a><span class="lineno">14881</span>&#160; </div>
-<div class="line"><a name="l14882"></a><span class="lineno">14882</span>&#160;    <span class="comment">// Write header.</span></div>
-<div class="line"><a name="l14883"></a><span class="lineno">14883</span>&#160;    fprintf(m_File, <span class="stringliteral">&quot;%s\n&quot;</span>, <span class="stringliteral">&quot;Vulkan Memory Allocator,Calls recording&quot;</span>);</div>
-<div class="line"><a name="l14884"></a><span class="lineno">14884</span>&#160;    fprintf(m_File, <span class="stringliteral">&quot;%s\n&quot;</span>, <span class="stringliteral">&quot;1,8&quot;</span>);</div>
-<div class="line"><a name="l14885"></a><span class="lineno">14885</span>&#160; </div>
-<div class="line"><a name="l14886"></a><span class="lineno">14886</span>&#160;    <span class="keywordflow">return</span> VK_SUCCESS;</div>
-<div class="line"><a name="l14887"></a><span class="lineno">14887</span>&#160;}</div>
-<div class="line"><a name="l14888"></a><span class="lineno">14888</span>&#160; </div>
-<div class="line"><a name="l14889"></a><span class="lineno">14889</span>&#160;VmaRecorder::~VmaRecorder()</div>
-<div class="line"><a name="l14890"></a><span class="lineno">14890</span>&#160;{</div>
-<div class="line"><a name="l14891"></a><span class="lineno">14891</span>&#160;    <span class="keywordflow">if</span>(m_File != VMA_NULL)</div>
-<div class="line"><a name="l14892"></a><span class="lineno">14892</span>&#160;    {</div>
-<div class="line"><a name="l14893"></a><span class="lineno">14893</span>&#160;        fclose(m_File);</div>
-<div class="line"><a name="l14894"></a><span class="lineno">14894</span>&#160;    }</div>
-<div class="line"><a name="l14895"></a><span class="lineno">14895</span>&#160;}</div>
-<div class="line"><a name="l14896"></a><span class="lineno">14896</span>&#160; </div>
-<div class="line"><a name="l14897"></a><span class="lineno">14897</span>&#160;<span class="keywordtype">void</span> VmaRecorder::RecordCreateAllocator(uint32_t frameIndex)</div>
-<div class="line"><a name="l14898"></a><span class="lineno">14898</span>&#160;{</div>
-<div class="line"><a name="l14899"></a><span class="lineno">14899</span>&#160;    CallParams callParams;</div>
-<div class="line"><a name="l14900"></a><span class="lineno">14900</span>&#160;    GetBasicParams(callParams);</div>
-<div class="line"><a name="l14901"></a><span class="lineno">14901</span>&#160; </div>
-<div class="line"><a name="l14902"></a><span class="lineno">14902</span>&#160;    VmaMutexLock lock(m_FileMutex, m_UseMutex);</div>
-<div class="line"><a name="l14903"></a><span class="lineno">14903</span>&#160;    fprintf(m_File, <span class="stringliteral">&quot;%u,%.3f,%u,vmaCreateAllocator\n&quot;</span>, callParams.threadId, callParams.time, frameIndex);</div>
-<div class="line"><a name="l14904"></a><span class="lineno">14904</span>&#160;    Flush();</div>
-<div class="line"><a name="l14905"></a><span class="lineno">14905</span>&#160;}</div>
-<div class="line"><a name="l14906"></a><span class="lineno">14906</span>&#160; </div>
-<div class="line"><a name="l14907"></a><span class="lineno">14907</span>&#160;<span class="keywordtype">void</span> VmaRecorder::RecordDestroyAllocator(uint32_t frameIndex)</div>
-<div class="line"><a name="l14908"></a><span class="lineno">14908</span>&#160;{</div>
-<div class="line"><a name="l14909"></a><span class="lineno">14909</span>&#160;    CallParams callParams;</div>
-<div class="line"><a name="l14910"></a><span class="lineno">14910</span>&#160;    GetBasicParams(callParams);</div>
-<div class="line"><a name="l14911"></a><span class="lineno">14911</span>&#160; </div>
-<div class="line"><a name="l14912"></a><span class="lineno">14912</span>&#160;    VmaMutexLock lock(m_FileMutex, m_UseMutex);</div>
-<div class="line"><a name="l14913"></a><span class="lineno">14913</span>&#160;    fprintf(m_File, <span class="stringliteral">&quot;%u,%.3f,%u,vmaDestroyAllocator\n&quot;</span>, callParams.threadId, callParams.time, frameIndex);</div>
-<div class="line"><a name="l14914"></a><span class="lineno">14914</span>&#160;    Flush();</div>
-<div class="line"><a name="l14915"></a><span class="lineno">14915</span>&#160;}</div>
-<div class="line"><a name="l14916"></a><span class="lineno">14916</span>&#160; </div>
-<div class="line"><a name="l14917"></a><span class="lineno">14917</span>&#160;<span class="keywordtype">void</span> VmaRecorder::RecordCreatePool(uint32_t frameIndex, <span class="keyword">const</span> <a class="code" href="struct_vma_pool_create_info.html">VmaPoolCreateInfo</a>&amp; createInfo, <a class="code" href="struct_vma_pool.html">VmaPool</a> pool)</div>
-<div class="line"><a name="l14918"></a><span class="lineno">14918</span>&#160;{</div>
-<div class="line"><a name="l14919"></a><span class="lineno">14919</span>&#160;    CallParams callParams;</div>
-<div class="line"><a name="l14920"></a><span class="lineno">14920</span>&#160;    GetBasicParams(callParams);</div>
-<div class="line"><a name="l14921"></a><span class="lineno">14921</span>&#160; </div>
-<div class="line"><a name="l14922"></a><span class="lineno">14922</span>&#160;    VmaMutexLock lock(m_FileMutex, m_UseMutex);</div>
-<div class="line"><a name="l14923"></a><span class="lineno">14923</span>&#160;    fprintf(m_File, <span class="stringliteral">&quot;%u,%.3f,%u,vmaCreatePool,%u,%u,%llu,%llu,%llu,%u,%p\n&quot;</span>, callParams.threadId, callParams.time, frameIndex,</div>
-<div class="line"><a name="l14924"></a><span class="lineno">14924</span>&#160;        createInfo.<a class="code" href="struct_vma_pool_create_info.html#a596fa76b685d3f1f688f84a709a5b319">memoryTypeIndex</a>,</div>
-<div class="line"><a name="l14925"></a><span class="lineno">14925</span>&#160;        createInfo.<a class="code" href="struct_vma_pool_create_info.html#a8405139f63d078340ae74513a59f5446">flags</a>,</div>
-<div class="line"><a name="l14926"></a><span class="lineno">14926</span>&#160;        createInfo.<a class="code" href="struct_vma_pool_create_info.html#aa4265160536cdb9be821b7686c16c676">blockSize</a>,</div>
-<div class="line"><a name="l14927"></a><span class="lineno">14927</span>&#160;        (uint64_t)createInfo.<a class="code" href="struct_vma_pool_create_info.html#ad8006fb803185c0a699d30f3e9a865ae">minBlockCount</a>,</div>
-<div class="line"><a name="l14928"></a><span class="lineno">14928</span>&#160;        (uint64_t)createInfo.<a class="code" href="struct_vma_pool_create_info.html#ae41142f2834fcdc82baa4883c187b75c">maxBlockCount</a>,</div>
-<div class="line"><a name="l14929"></a><span class="lineno">14929</span>&#160;        createInfo.<a class="code" href="struct_vma_pool_create_info.html#a9437e43ffbb644dbbf7fc4e50cfad6aa">frameInUseCount</a>,</div>
-<div class="line"><a name="l14930"></a><span class="lineno">14930</span>&#160;        pool);</div>
-<div class="line"><a name="l14931"></a><span class="lineno">14931</span>&#160;    Flush();</div>
-<div class="line"><a name="l14932"></a><span class="lineno">14932</span>&#160;}</div>
-<div class="line"><a name="l14933"></a><span class="lineno">14933</span>&#160; </div>
-<div class="line"><a name="l14934"></a><span class="lineno">14934</span>&#160;<span class="keywordtype">void</span> VmaRecorder::RecordDestroyPool(uint32_t frameIndex, <a class="code" href="struct_vma_pool.html">VmaPool</a> pool)</div>
-<div class="line"><a name="l14935"></a><span class="lineno">14935</span>&#160;{</div>
-<div class="line"><a name="l14936"></a><span class="lineno">14936</span>&#160;    CallParams callParams;</div>
-<div class="line"><a name="l14937"></a><span class="lineno">14937</span>&#160;    GetBasicParams(callParams);</div>
-<div class="line"><a name="l14938"></a><span class="lineno">14938</span>&#160; </div>
-<div class="line"><a name="l14939"></a><span class="lineno">14939</span>&#160;    VmaMutexLock lock(m_FileMutex, m_UseMutex);</div>
-<div class="line"><a name="l14940"></a><span class="lineno">14940</span>&#160;    fprintf(m_File, <span class="stringliteral">&quot;%u,%.3f,%u,vmaDestroyPool,%p\n&quot;</span>, callParams.threadId, callParams.time, frameIndex,</div>
-<div class="line"><a name="l14941"></a><span class="lineno">14941</span>&#160;        pool);</div>
-<div class="line"><a name="l14942"></a><span class="lineno">14942</span>&#160;    Flush();</div>
-<div class="line"><a name="l14943"></a><span class="lineno">14943</span>&#160;}</div>
-<div class="line"><a name="l14944"></a><span class="lineno">14944</span>&#160; </div>
-<div class="line"><a name="l14945"></a><span class="lineno">14945</span>&#160;<span class="keywordtype">void</span> VmaRecorder::RecordAllocateMemory(uint32_t frameIndex,</div>
-<div class="line"><a name="l14946"></a><span class="lineno">14946</span>&#160;        <span class="keyword">const</span> VkMemoryRequirements&amp; vkMemReq,</div>
-<div class="line"><a name="l14947"></a><span class="lineno">14947</span>&#160;        <span class="keyword">const</span> <a class="code" href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a>&amp; createInfo,</div>
-<div class="line"><a name="l14948"></a><span class="lineno">14948</span>&#160;        <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation)</div>
-<div class="line"><a name="l14949"></a><span class="lineno">14949</span>&#160;{</div>
-<div class="line"><a name="l14950"></a><span class="lineno">14950</span>&#160;    CallParams callParams;</div>
-<div class="line"><a name="l14951"></a><span class="lineno">14951</span>&#160;    GetBasicParams(callParams);</div>
-<div class="line"><a name="l14952"></a><span class="lineno">14952</span>&#160; </div>
-<div class="line"><a name="l14953"></a><span class="lineno">14953</span>&#160;    VmaMutexLock lock(m_FileMutex, m_UseMutex);</div>
-<div class="line"><a name="l14954"></a><span class="lineno">14954</span>&#160;    UserDataString userDataStr(createInfo.<a class="code" href="struct_vma_allocation_create_info.html#add09658ac14fe290ace25470ddd6d41b">flags</a>, createInfo.<a class="code" href="struct_vma_allocation_create_info.html#a8259e85c272683434f4abb4ddddffe19">pUserData</a>);</div>
-<div class="line"><a name="l14955"></a><span class="lineno">14955</span>&#160;    fprintf(m_File, <span class="stringliteral">&quot;%u,%.3f,%u,vmaAllocateMemory,%llu,%llu,%u,%u,%u,%u,%u,%u,%p,%p,%s\n&quot;</span>, callParams.threadId, callParams.time, frameIndex,</div>
-<div class="line"><a name="l14956"></a><span class="lineno">14956</span>&#160;        vkMemReq.size,</div>
-<div class="line"><a name="l14957"></a><span class="lineno">14957</span>&#160;        vkMemReq.alignment,</div>
-<div class="line"><a name="l14958"></a><span class="lineno">14958</span>&#160;        vkMemReq.memoryTypeBits,</div>
-<div class="line"><a name="l14959"></a><span class="lineno">14959</span>&#160;        createInfo.<a class="code" href="struct_vma_allocation_create_info.html#add09658ac14fe290ace25470ddd6d41b">flags</a>,</div>
-<div class="line"><a name="l14960"></a><span class="lineno">14960</span>&#160;        createInfo.<a class="code" href="struct_vma_allocation_create_info.html#accb8b06b1f677d858cb9af20705fa910">usage</a>,</div>
-<div class="line"><a name="l14961"></a><span class="lineno">14961</span>&#160;        createInfo.<a class="code" href="struct_vma_allocation_create_info.html#a9166390303ff42d783305bc31c2b6b90">requiredFlags</a>,</div>
-<div class="line"><a name="l14962"></a><span class="lineno">14962</span>&#160;        createInfo.<a class="code" href="struct_vma_allocation_create_info.html#a7fe8d81a1ad10b2a2faacacee5b15d6d">preferredFlags</a>,</div>
-<div class="line"><a name="l14963"></a><span class="lineno">14963</span>&#160;        createInfo.<a class="code" href="struct_vma_allocation_create_info.html#a3bf940c0271d85d6ba32a4d820075055">memoryTypeBits</a>,</div>
-<div class="line"><a name="l14964"></a><span class="lineno">14964</span>&#160;        createInfo.<a class="code" href="struct_vma_allocation_create_info.html#a6272c0555cfd1fe28bff1afeb6190150">pool</a>,</div>
-<div class="line"><a name="l14965"></a><span class="lineno">14965</span>&#160;        allocation,</div>
-<div class="line"><a name="l14966"></a><span class="lineno">14966</span>&#160;        userDataStr.GetString());</div>
-<div class="line"><a name="l14967"></a><span class="lineno">14967</span>&#160;    Flush();</div>
-<div class="line"><a name="l14968"></a><span class="lineno">14968</span>&#160;}</div>
-<div class="line"><a name="l14969"></a><span class="lineno">14969</span>&#160; </div>
-<div class="line"><a name="l14970"></a><span class="lineno">14970</span>&#160;<span class="keywordtype">void</span> VmaRecorder::RecordAllocateMemoryPages(uint32_t frameIndex,</div>
-<div class="line"><a name="l14971"></a><span class="lineno">14971</span>&#160;    <span class="keyword">const</span> VkMemoryRequirements&amp; vkMemReq,</div>
-<div class="line"><a name="l14972"></a><span class="lineno">14972</span>&#160;    <span class="keyword">const</span> <a class="code" href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a>&amp; createInfo,</div>
-<div class="line"><a name="l14973"></a><span class="lineno">14973</span>&#160;    uint64_t allocationCount,</div>
-<div class="line"><a name="l14974"></a><span class="lineno">14974</span>&#160;    <span class="keyword">const</span> <a class="code" href="struct_vma_allocation.html">VmaAllocation</a>* pAllocations)</div>
+<div class="line"><a name="l14808"></a><span class="lineno">14808</span>&#160;    PostprocessMetadata();</div>
+<div class="line"><a name="l14809"></a><span class="lineno">14809</span>&#160; </div>
+<div class="line"><a name="l14810"></a><span class="lineno">14810</span>&#160;    <span class="keywordflow">return</span> VK_SUCCESS;</div>
+<div class="line"><a name="l14811"></a><span class="lineno">14811</span>&#160;}</div>
+<div class="line"><a name="l14812"></a><span class="lineno">14812</span>&#160; </div>
+<div class="line"><a name="l14813"></a><span class="lineno">14813</span>&#160;<span class="keywordtype">void</span> VmaDefragmentationAlgorithm_Fast::PreprocessMetadata()</div>
+<div class="line"><a name="l14814"></a><span class="lineno">14814</span>&#160;{</div>
+<div class="line"><a name="l14815"></a><span class="lineno">14815</span>&#160;    <span class="keyword">const</span> <span class="keywordtype">size_t</span> blockCount = m_pBlockVector-&gt;GetBlockCount();</div>
+<div class="line"><a name="l14816"></a><span class="lineno">14816</span>&#160;    <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> blockIndex = 0; blockIndex &lt; blockCount; ++blockIndex)</div>
+<div class="line"><a name="l14817"></a><span class="lineno">14817</span>&#160;    {</div>
+<div class="line"><a name="l14818"></a><span class="lineno">14818</span>&#160;        VmaBlockMetadata_Generic* <span class="keyword">const</span> pMetadata =</div>
+<div class="line"><a name="l14819"></a><span class="lineno">14819</span>&#160;            (VmaBlockMetadata_Generic*)m_pBlockVector-&gt;GetBlock(blockIndex)-&gt;m_pMetadata;</div>
+<div class="line"><a name="l14820"></a><span class="lineno">14820</span>&#160;        pMetadata-&gt;m_FreeCount = 0;</div>
+<div class="line"><a name="l14821"></a><span class="lineno">14821</span>&#160;        pMetadata-&gt;m_SumFreeSize = pMetadata-&gt;GetSize();</div>
+<div class="line"><a name="l14822"></a><span class="lineno">14822</span>&#160;        pMetadata-&gt;m_FreeSuballocationsBySize.clear();</div>
+<div class="line"><a name="l14823"></a><span class="lineno">14823</span>&#160;        <span class="keywordflow">for</span>(VmaSuballocationList::iterator it = pMetadata-&gt;m_Suballocations.begin();</div>
+<div class="line"><a name="l14824"></a><span class="lineno">14824</span>&#160;            it != pMetadata-&gt;m_Suballocations.end(); )</div>
+<div class="line"><a name="l14825"></a><span class="lineno">14825</span>&#160;        {</div>
+<div class="line"><a name="l14826"></a><span class="lineno">14826</span>&#160;            <span class="keywordflow">if</span>(it-&gt;type == VMA_SUBALLOCATION_TYPE_FREE)</div>
+<div class="line"><a name="l14827"></a><span class="lineno">14827</span>&#160;            {</div>
+<div class="line"><a name="l14828"></a><span class="lineno">14828</span>&#160;                VmaSuballocationList::iterator nextIt = it;</div>
+<div class="line"><a name="l14829"></a><span class="lineno">14829</span>&#160;                ++nextIt;</div>
+<div class="line"><a name="l14830"></a><span class="lineno">14830</span>&#160;                pMetadata-&gt;m_Suballocations.erase(it);</div>
+<div class="line"><a name="l14831"></a><span class="lineno">14831</span>&#160;                it = nextIt;</div>
+<div class="line"><a name="l14832"></a><span class="lineno">14832</span>&#160;            }</div>
+<div class="line"><a name="l14833"></a><span class="lineno">14833</span>&#160;            <span class="keywordflow">else</span></div>
+<div class="line"><a name="l14834"></a><span class="lineno">14834</span>&#160;            {</div>
+<div class="line"><a name="l14835"></a><span class="lineno">14835</span>&#160;                ++it;</div>
+<div class="line"><a name="l14836"></a><span class="lineno">14836</span>&#160;            }</div>
+<div class="line"><a name="l14837"></a><span class="lineno">14837</span>&#160;        }</div>
+<div class="line"><a name="l14838"></a><span class="lineno">14838</span>&#160;    }</div>
+<div class="line"><a name="l14839"></a><span class="lineno">14839</span>&#160;}</div>
+<div class="line"><a name="l14840"></a><span class="lineno">14840</span>&#160; </div>
+<div class="line"><a name="l14841"></a><span class="lineno">14841</span>&#160;<span class="keywordtype">void</span> VmaDefragmentationAlgorithm_Fast::PostprocessMetadata()</div>
+<div class="line"><a name="l14842"></a><span class="lineno">14842</span>&#160;{</div>
+<div class="line"><a name="l14843"></a><span class="lineno">14843</span>&#160;    <span class="keyword">const</span> <span class="keywordtype">size_t</span> blockCount = m_pBlockVector-&gt;GetBlockCount();</div>
+<div class="line"><a name="l14844"></a><span class="lineno">14844</span>&#160;    <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> blockIndex = 0; blockIndex &lt; blockCount; ++blockIndex)</div>
+<div class="line"><a name="l14845"></a><span class="lineno">14845</span>&#160;    {</div>
+<div class="line"><a name="l14846"></a><span class="lineno">14846</span>&#160;        VmaBlockMetadata_Generic* <span class="keyword">const</span> pMetadata =</div>
+<div class="line"><a name="l14847"></a><span class="lineno">14847</span>&#160;            (VmaBlockMetadata_Generic*)m_pBlockVector-&gt;GetBlock(blockIndex)-&gt;m_pMetadata;</div>
+<div class="line"><a name="l14848"></a><span class="lineno">14848</span>&#160;        <span class="keyword">const</span> VkDeviceSize blockSize = pMetadata-&gt;GetSize();</div>
+<div class="line"><a name="l14849"></a><span class="lineno">14849</span>&#160; </div>
+<div class="line"><a name="l14850"></a><span class="lineno">14850</span>&#160;        <span class="comment">// No allocations in this block - entire area is free.</span></div>
+<div class="line"><a name="l14851"></a><span class="lineno">14851</span>&#160;        <span class="keywordflow">if</span>(pMetadata-&gt;m_Suballocations.empty())</div>
+<div class="line"><a name="l14852"></a><span class="lineno">14852</span>&#160;        {</div>
+<div class="line"><a name="l14853"></a><span class="lineno">14853</span>&#160;            pMetadata-&gt;m_FreeCount = 1;</div>
+<div class="line"><a name="l14854"></a><span class="lineno">14854</span>&#160;            <span class="comment">//pMetadata-&gt;m_SumFreeSize is already set to blockSize.</span></div>
+<div class="line"><a name="l14855"></a><span class="lineno">14855</span>&#160;            VmaSuballocation suballoc = {</div>
+<div class="line"><a name="l14856"></a><span class="lineno">14856</span>&#160;                0, <span class="comment">// offset</span></div>
+<div class="line"><a name="l14857"></a><span class="lineno">14857</span>&#160;                blockSize, <span class="comment">// size</span></div>
+<div class="line"><a name="l14858"></a><span class="lineno">14858</span>&#160;                VMA_NULL, <span class="comment">// hAllocation</span></div>
+<div class="line"><a name="l14859"></a><span class="lineno">14859</span>&#160;                VMA_SUBALLOCATION_TYPE_FREE };</div>
+<div class="line"><a name="l14860"></a><span class="lineno">14860</span>&#160;            pMetadata-&gt;m_Suballocations.push_back(suballoc);</div>
+<div class="line"><a name="l14861"></a><span class="lineno">14861</span>&#160;            pMetadata-&gt;RegisterFreeSuballocation(pMetadata-&gt;m_Suballocations.begin());</div>
+<div class="line"><a name="l14862"></a><span class="lineno">14862</span>&#160;        }</div>
+<div class="line"><a name="l14863"></a><span class="lineno">14863</span>&#160;        <span class="comment">// There are some allocations in this block.</span></div>
+<div class="line"><a name="l14864"></a><span class="lineno">14864</span>&#160;        <span class="keywordflow">else</span></div>
+<div class="line"><a name="l14865"></a><span class="lineno">14865</span>&#160;        {</div>
+<div class="line"><a name="l14866"></a><span class="lineno">14866</span>&#160;            VkDeviceSize offset = 0;</div>
+<div class="line"><a name="l14867"></a><span class="lineno">14867</span>&#160;            VmaSuballocationList::iterator it;</div>
+<div class="line"><a name="l14868"></a><span class="lineno">14868</span>&#160;            <span class="keywordflow">for</span>(it = pMetadata-&gt;m_Suballocations.begin();</div>
+<div class="line"><a name="l14869"></a><span class="lineno">14869</span>&#160;                it != pMetadata-&gt;m_Suballocations.end();</div>
+<div class="line"><a name="l14870"></a><span class="lineno">14870</span>&#160;                ++it)</div>
+<div class="line"><a name="l14871"></a><span class="lineno">14871</span>&#160;            {</div>
+<div class="line"><a name="l14872"></a><span class="lineno">14872</span>&#160;                VMA_ASSERT(it-&gt;type != VMA_SUBALLOCATION_TYPE_FREE);</div>
+<div class="line"><a name="l14873"></a><span class="lineno">14873</span>&#160;                VMA_ASSERT(it-&gt;offset &gt;= offset);</div>
+<div class="line"><a name="l14874"></a><span class="lineno">14874</span>&#160; </div>
+<div class="line"><a name="l14875"></a><span class="lineno">14875</span>&#160;                <span class="comment">// Need to insert preceding free space.</span></div>
+<div class="line"><a name="l14876"></a><span class="lineno">14876</span>&#160;                <span class="keywordflow">if</span>(it-&gt;offset &gt; offset)</div>
+<div class="line"><a name="l14877"></a><span class="lineno">14877</span>&#160;                {</div>
+<div class="line"><a name="l14878"></a><span class="lineno">14878</span>&#160;                    ++pMetadata-&gt;m_FreeCount;</div>
+<div class="line"><a name="l14879"></a><span class="lineno">14879</span>&#160;                    <span class="keyword">const</span> VkDeviceSize freeSize = it-&gt;offset - offset;</div>
+<div class="line"><a name="l14880"></a><span class="lineno">14880</span>&#160;                    VmaSuballocation suballoc = {</div>
+<div class="line"><a name="l14881"></a><span class="lineno">14881</span>&#160;                        offset, <span class="comment">// offset</span></div>
+<div class="line"><a name="l14882"></a><span class="lineno">14882</span>&#160;                        freeSize, <span class="comment">// size</span></div>
+<div class="line"><a name="l14883"></a><span class="lineno">14883</span>&#160;                        VMA_NULL, <span class="comment">// hAllocation</span></div>
+<div class="line"><a name="l14884"></a><span class="lineno">14884</span>&#160;                        VMA_SUBALLOCATION_TYPE_FREE };</div>
+<div class="line"><a name="l14885"></a><span class="lineno">14885</span>&#160;                    VmaSuballocationList::iterator precedingFreeIt = pMetadata-&gt;m_Suballocations.insert(it, suballoc);</div>
+<div class="line"><a name="l14886"></a><span class="lineno">14886</span>&#160;                    <span class="keywordflow">if</span>(freeSize &gt;= VMA_MIN_FREE_SUBALLOCATION_SIZE_TO_REGISTER)</div>
+<div class="line"><a name="l14887"></a><span class="lineno">14887</span>&#160;                    {</div>
+<div class="line"><a name="l14888"></a><span class="lineno">14888</span>&#160;                        pMetadata-&gt;m_FreeSuballocationsBySize.push_back(precedingFreeIt);</div>
+<div class="line"><a name="l14889"></a><span class="lineno">14889</span>&#160;                    }</div>
+<div class="line"><a name="l14890"></a><span class="lineno">14890</span>&#160;                }</div>
+<div class="line"><a name="l14891"></a><span class="lineno">14891</span>&#160; </div>
+<div class="line"><a name="l14892"></a><span class="lineno">14892</span>&#160;                pMetadata-&gt;m_SumFreeSize -= it-&gt;size;</div>
+<div class="line"><a name="l14893"></a><span class="lineno">14893</span>&#160;                offset = it-&gt;offset + it-&gt;size;</div>
+<div class="line"><a name="l14894"></a><span class="lineno">14894</span>&#160;            }</div>
+<div class="line"><a name="l14895"></a><span class="lineno">14895</span>&#160; </div>
+<div class="line"><a name="l14896"></a><span class="lineno">14896</span>&#160;            <span class="comment">// Need to insert trailing free space.</span></div>
+<div class="line"><a name="l14897"></a><span class="lineno">14897</span>&#160;            <span class="keywordflow">if</span>(offset &lt; blockSize)</div>
+<div class="line"><a name="l14898"></a><span class="lineno">14898</span>&#160;            {</div>
+<div class="line"><a name="l14899"></a><span class="lineno">14899</span>&#160;                ++pMetadata-&gt;m_FreeCount;</div>
+<div class="line"><a name="l14900"></a><span class="lineno">14900</span>&#160;                <span class="keyword">const</span> VkDeviceSize freeSize = blockSize - offset;</div>
+<div class="line"><a name="l14901"></a><span class="lineno">14901</span>&#160;                VmaSuballocation suballoc = {</div>
+<div class="line"><a name="l14902"></a><span class="lineno">14902</span>&#160;                    offset, <span class="comment">// offset</span></div>
+<div class="line"><a name="l14903"></a><span class="lineno">14903</span>&#160;                    freeSize, <span class="comment">// size</span></div>
+<div class="line"><a name="l14904"></a><span class="lineno">14904</span>&#160;                    VMA_NULL, <span class="comment">// hAllocation</span></div>
+<div class="line"><a name="l14905"></a><span class="lineno">14905</span>&#160;                    VMA_SUBALLOCATION_TYPE_FREE };</div>
+<div class="line"><a name="l14906"></a><span class="lineno">14906</span>&#160;                VMA_ASSERT(it == pMetadata-&gt;m_Suballocations.end());</div>
+<div class="line"><a name="l14907"></a><span class="lineno">14907</span>&#160;                VmaSuballocationList::iterator trailingFreeIt = pMetadata-&gt;m_Suballocations.insert(it, suballoc);</div>
+<div class="line"><a name="l14908"></a><span class="lineno">14908</span>&#160;                <span class="keywordflow">if</span>(freeSize &gt; VMA_MIN_FREE_SUBALLOCATION_SIZE_TO_REGISTER)</div>
+<div class="line"><a name="l14909"></a><span class="lineno">14909</span>&#160;                {</div>
+<div class="line"><a name="l14910"></a><span class="lineno">14910</span>&#160;                    pMetadata-&gt;m_FreeSuballocationsBySize.push_back(trailingFreeIt);</div>
+<div class="line"><a name="l14911"></a><span class="lineno">14911</span>&#160;                }</div>
+<div class="line"><a name="l14912"></a><span class="lineno">14912</span>&#160;            }</div>
+<div class="line"><a name="l14913"></a><span class="lineno">14913</span>&#160; </div>
+<div class="line"><a name="l14914"></a><span class="lineno">14914</span>&#160;            VMA_SORT(</div>
+<div class="line"><a name="l14915"></a><span class="lineno">14915</span>&#160;                pMetadata-&gt;m_FreeSuballocationsBySize.begin(),</div>
+<div class="line"><a name="l14916"></a><span class="lineno">14916</span>&#160;                pMetadata-&gt;m_FreeSuballocationsBySize.end(),</div>
+<div class="line"><a name="l14917"></a><span class="lineno">14917</span>&#160;                VmaSuballocationItemSizeLess());</div>
+<div class="line"><a name="l14918"></a><span class="lineno">14918</span>&#160;        }</div>
+<div class="line"><a name="l14919"></a><span class="lineno">14919</span>&#160; </div>
+<div class="line"><a name="l14920"></a><span class="lineno">14920</span>&#160;        VMA_HEAVY_ASSERT(pMetadata-&gt;Validate());</div>
+<div class="line"><a name="l14921"></a><span class="lineno">14921</span>&#160;    }</div>
+<div class="line"><a name="l14922"></a><span class="lineno">14922</span>&#160;}</div>
+<div class="line"><a name="l14923"></a><span class="lineno">14923</span>&#160; </div>
+<div class="line"><a name="l14924"></a><span class="lineno">14924</span>&#160;<span class="keywordtype">void</span> VmaDefragmentationAlgorithm_Fast::InsertSuballoc(VmaBlockMetadata_Generic* pMetadata, <span class="keyword">const</span> VmaSuballocation&amp; suballoc)</div>
+<div class="line"><a name="l14925"></a><span class="lineno">14925</span>&#160;{</div>
+<div class="line"><a name="l14926"></a><span class="lineno">14926</span>&#160;    <span class="comment">// TODO: Optimize somehow. Remember iterator instead of searching for it linearly.</span></div>
+<div class="line"><a name="l14927"></a><span class="lineno">14927</span>&#160;    VmaSuballocationList::iterator it = pMetadata-&gt;m_Suballocations.begin();</div>
+<div class="line"><a name="l14928"></a><span class="lineno">14928</span>&#160;    <span class="keywordflow">while</span>(it != pMetadata-&gt;m_Suballocations.end())</div>
+<div class="line"><a name="l14929"></a><span class="lineno">14929</span>&#160;    {</div>
+<div class="line"><a name="l14930"></a><span class="lineno">14930</span>&#160;        <span class="keywordflow">if</span>(it-&gt;offset &lt; suballoc.offset)</div>
+<div class="line"><a name="l14931"></a><span class="lineno">14931</span>&#160;        {</div>
+<div class="line"><a name="l14932"></a><span class="lineno">14932</span>&#160;            ++it;</div>
+<div class="line"><a name="l14933"></a><span class="lineno">14933</span>&#160;        }</div>
+<div class="line"><a name="l14934"></a><span class="lineno">14934</span>&#160;    }</div>
+<div class="line"><a name="l14935"></a><span class="lineno">14935</span>&#160;    pMetadata-&gt;m_Suballocations.insert(it, suballoc);</div>
+<div class="line"><a name="l14936"></a><span class="lineno">14936</span>&#160;}</div>
+<div class="line"><a name="l14937"></a><span class="lineno">14937</span>&#160; </div>
+<div class="line"><a name="l14939"></a><span class="lineno">14939</span>&#160;<span class="comment">// VmaBlockVectorDefragmentationContext</span></div>
+<div class="line"><a name="l14940"></a><span class="lineno">14940</span>&#160; </div>
+<div class="line"><a name="l14941"></a><span class="lineno">14941</span>&#160;VmaBlockVectorDefragmentationContext::VmaBlockVectorDefragmentationContext(</div>
+<div class="line"><a name="l14942"></a><span class="lineno">14942</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator,</div>
+<div class="line"><a name="l14943"></a><span class="lineno">14943</span>&#160;    <a class="code" href="struct_vma_pool.html">VmaPool</a> hCustomPool,</div>
+<div class="line"><a name="l14944"></a><span class="lineno">14944</span>&#160;    VmaBlockVector* pBlockVector,</div>
+<div class="line"><a name="l14945"></a><span class="lineno">14945</span>&#160;    uint32_t currFrameIndex) :</div>
+<div class="line"><a name="l14946"></a><span class="lineno">14946</span>&#160;    res(VK_SUCCESS),</div>
+<div class="line"><a name="l14947"></a><span class="lineno">14947</span>&#160;    mutexLocked(false),</div>
+<div class="line"><a name="l14948"></a><span class="lineno">14948</span>&#160;    blockContexts(VmaStlAllocator&lt;VmaBlockDefragmentationContext&gt;(hAllocator-&gt;GetAllocationCallbacks())),</div>
+<div class="line"><a name="l14949"></a><span class="lineno">14949</span>&#160;    defragmentationMoves(VmaStlAllocator&lt;VmaDefragmentationMove&gt;(hAllocator-&gt;GetAllocationCallbacks())),</div>
+<div class="line"><a name="l14950"></a><span class="lineno">14950</span>&#160;    defragmentationMovesProcessed(0),</div>
+<div class="line"><a name="l14951"></a><span class="lineno">14951</span>&#160;    defragmentationMovesCommitted(0),</div>
+<div class="line"><a name="l14952"></a><span class="lineno">14952</span>&#160;    hasDefragmentationPlan(0),</div>
+<div class="line"><a name="l14953"></a><span class="lineno">14953</span>&#160;    m_hAllocator(hAllocator),</div>
+<div class="line"><a name="l14954"></a><span class="lineno">14954</span>&#160;    m_hCustomPool(hCustomPool),</div>
+<div class="line"><a name="l14955"></a><span class="lineno">14955</span>&#160;    m_pBlockVector(pBlockVector),</div>
+<div class="line"><a name="l14956"></a><span class="lineno">14956</span>&#160;    m_CurrFrameIndex(currFrameIndex),</div>
+<div class="line"><a name="l14957"></a><span class="lineno">14957</span>&#160;    m_pAlgorithm(VMA_NULL),</div>
+<div class="line"><a name="l14958"></a><span class="lineno">14958</span>&#160;    m_Allocations(VmaStlAllocator&lt;AllocInfo&gt;(hAllocator-&gt;GetAllocationCallbacks())),</div>
+<div class="line"><a name="l14959"></a><span class="lineno">14959</span>&#160;    m_AllAllocations(false)</div>
+<div class="line"><a name="l14960"></a><span class="lineno">14960</span>&#160;{</div>
+<div class="line"><a name="l14961"></a><span class="lineno">14961</span>&#160;}</div>
+<div class="line"><a name="l14962"></a><span class="lineno">14962</span>&#160; </div>
+<div class="line"><a name="l14963"></a><span class="lineno">14963</span>&#160;VmaBlockVectorDefragmentationContext::~VmaBlockVectorDefragmentationContext()</div>
+<div class="line"><a name="l14964"></a><span class="lineno">14964</span>&#160;{</div>
+<div class="line"><a name="l14965"></a><span class="lineno">14965</span>&#160;    vma_delete(m_hAllocator, m_pAlgorithm);</div>
+<div class="line"><a name="l14966"></a><span class="lineno">14966</span>&#160;}</div>
+<div class="line"><a name="l14967"></a><span class="lineno">14967</span>&#160; </div>
+<div class="line"><a name="l14968"></a><span class="lineno">14968</span>&#160;<span class="keywordtype">void</span> VmaBlockVectorDefragmentationContext::AddAllocation(<a class="code" href="struct_vma_allocation.html">VmaAllocation</a> hAlloc, VkBool32* pChanged)</div>
+<div class="line"><a name="l14969"></a><span class="lineno">14969</span>&#160;{</div>
+<div class="line"><a name="l14970"></a><span class="lineno">14970</span>&#160;    AllocInfo info = { hAlloc, pChanged };</div>
+<div class="line"><a name="l14971"></a><span class="lineno">14971</span>&#160;    m_Allocations.push_back(info);</div>
+<div class="line"><a name="l14972"></a><span class="lineno">14972</span>&#160;}</div>
+<div class="line"><a name="l14973"></a><span class="lineno">14973</span>&#160; </div>
+<div class="line"><a name="l14974"></a><span class="lineno">14974</span>&#160;<span class="keywordtype">void</span> VmaBlockVectorDefragmentationContext::Begin(<span class="keywordtype">bool</span> overlappingMoveSupported, <a class="code" href="vk__mem__alloc_8h.html#a88a77cef37e5d3c4fc9eb328885d048d">VmaDefragmentationFlags</a> flags)</div>
 <div class="line"><a name="l14975"></a><span class="lineno">14975</span>&#160;{</div>
-<div class="line"><a name="l14976"></a><span class="lineno">14976</span>&#160;    CallParams callParams;</div>
-<div class="line"><a name="l14977"></a><span class="lineno">14977</span>&#160;    GetBasicParams(callParams);</div>
+<div class="line"><a name="l14976"></a><span class="lineno">14976</span>&#160;    <span class="keyword">const</span> <span class="keywordtype">bool</span> allAllocations = m_AllAllocations ||</div>
+<div class="line"><a name="l14977"></a><span class="lineno">14977</span>&#160;        m_Allocations.size() == m_pBlockVector-&gt;CalcAllocationCount();</div>
 <div class="line"><a name="l14978"></a><span class="lineno">14978</span>&#160; </div>
-<div class="line"><a name="l14979"></a><span class="lineno">14979</span>&#160;    VmaMutexLock lock(m_FileMutex, m_UseMutex);</div>
-<div class="line"><a name="l14980"></a><span class="lineno">14980</span>&#160;    UserDataString userDataStr(createInfo.<a class="code" href="struct_vma_allocation_create_info.html#add09658ac14fe290ace25470ddd6d41b">flags</a>, createInfo.<a class="code" href="struct_vma_allocation_create_info.html#a8259e85c272683434f4abb4ddddffe19">pUserData</a>);</div>
-<div class="line"><a name="l14981"></a><span class="lineno">14981</span>&#160;    fprintf(m_File, <span class="stringliteral">&quot;%u,%.3f,%u,vmaAllocateMemoryPages,%llu,%llu,%u,%u,%u,%u,%u,%u,%p,&quot;</span>, callParams.threadId, callParams.time, frameIndex,</div>
-<div class="line"><a name="l14982"></a><span class="lineno">14982</span>&#160;        vkMemReq.size,</div>
-<div class="line"><a name="l14983"></a><span class="lineno">14983</span>&#160;        vkMemReq.alignment,</div>
-<div class="line"><a name="l14984"></a><span class="lineno">14984</span>&#160;        vkMemReq.memoryTypeBits,</div>
-<div class="line"><a name="l14985"></a><span class="lineno">14985</span>&#160;        createInfo.<a class="code" href="struct_vma_allocation_create_info.html#add09658ac14fe290ace25470ddd6d41b">flags</a>,</div>
-<div class="line"><a name="l14986"></a><span class="lineno">14986</span>&#160;        createInfo.<a class="code" href="struct_vma_allocation_create_info.html#accb8b06b1f677d858cb9af20705fa910">usage</a>,</div>
-<div class="line"><a name="l14987"></a><span class="lineno">14987</span>&#160;        createInfo.<a class="code" href="struct_vma_allocation_create_info.html#a9166390303ff42d783305bc31c2b6b90">requiredFlags</a>,</div>
-<div class="line"><a name="l14988"></a><span class="lineno">14988</span>&#160;        createInfo.<a class="code" href="struct_vma_allocation_create_info.html#a7fe8d81a1ad10b2a2faacacee5b15d6d">preferredFlags</a>,</div>
-<div class="line"><a name="l14989"></a><span class="lineno">14989</span>&#160;        createInfo.<a class="code" href="struct_vma_allocation_create_info.html#a3bf940c0271d85d6ba32a4d820075055">memoryTypeBits</a>,</div>
-<div class="line"><a name="l14990"></a><span class="lineno">14990</span>&#160;        createInfo.<a class="code" href="struct_vma_allocation_create_info.html#a6272c0555cfd1fe28bff1afeb6190150">pool</a>);</div>
-<div class="line"><a name="l14991"></a><span class="lineno">14991</span>&#160;    PrintPointerList(allocationCount, pAllocations);</div>
-<div class="line"><a name="l14992"></a><span class="lineno">14992</span>&#160;    fprintf(m_File, <span class="stringliteral">&quot;,%s\n&quot;</span>, userDataStr.GetString());</div>
-<div class="line"><a name="l14993"></a><span class="lineno">14993</span>&#160;    Flush();</div>
-<div class="line"><a name="l14994"></a><span class="lineno">14994</span>&#160;}</div>
-<div class="line"><a name="l14995"></a><span class="lineno">14995</span>&#160; </div>
-<div class="line"><a name="l14996"></a><span class="lineno">14996</span>&#160;<span class="keywordtype">void</span> VmaRecorder::RecordAllocateMemoryForBuffer(uint32_t frameIndex,</div>
-<div class="line"><a name="l14997"></a><span class="lineno">14997</span>&#160;    <span class="keyword">const</span> VkMemoryRequirements&amp; vkMemReq,</div>
-<div class="line"><a name="l14998"></a><span class="lineno">14998</span>&#160;    <span class="keywordtype">bool</span> requiresDedicatedAllocation,</div>
-<div class="line"><a name="l14999"></a><span class="lineno">14999</span>&#160;    <span class="keywordtype">bool</span> prefersDedicatedAllocation,</div>
-<div class="line"><a name="l15000"></a><span class="lineno">15000</span>&#160;    <span class="keyword">const</span> <a class="code" href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a>&amp; createInfo,</div>
-<div class="line"><a name="l15001"></a><span class="lineno">15001</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation)</div>
-<div class="line"><a name="l15002"></a><span class="lineno">15002</span>&#160;{</div>
-<div class="line"><a name="l15003"></a><span class="lineno">15003</span>&#160;    CallParams callParams;</div>
-<div class="line"><a name="l15004"></a><span class="lineno">15004</span>&#160;    GetBasicParams(callParams);</div>
-<div class="line"><a name="l15005"></a><span class="lineno">15005</span>&#160; </div>
-<div class="line"><a name="l15006"></a><span class="lineno">15006</span>&#160;    VmaMutexLock lock(m_FileMutex, m_UseMutex);</div>
-<div class="line"><a name="l15007"></a><span class="lineno">15007</span>&#160;    UserDataString userDataStr(createInfo.<a class="code" href="struct_vma_allocation_create_info.html#add09658ac14fe290ace25470ddd6d41b">flags</a>, createInfo.<a class="code" href="struct_vma_allocation_create_info.html#a8259e85c272683434f4abb4ddddffe19">pUserData</a>);</div>
-<div class="line"><a name="l15008"></a><span class="lineno">15008</span>&#160;    fprintf(m_File, <span class="stringliteral">&quot;%u,%.3f,%u,vmaAllocateMemoryForBuffer,%llu,%llu,%u,%u,%u,%u,%u,%u,%u,%u,%p,%p,%s\n&quot;</span>, callParams.threadId, callParams.time, frameIndex,</div>
-<div class="line"><a name="l15009"></a><span class="lineno">15009</span>&#160;        vkMemReq.size,</div>
-<div class="line"><a name="l15010"></a><span class="lineno">15010</span>&#160;        vkMemReq.alignment,</div>
-<div class="line"><a name="l15011"></a><span class="lineno">15011</span>&#160;        vkMemReq.memoryTypeBits,</div>
-<div class="line"><a name="l15012"></a><span class="lineno">15012</span>&#160;        requiresDedicatedAllocation ? 1 : 0,</div>
-<div class="line"><a name="l15013"></a><span class="lineno">15013</span>&#160;        prefersDedicatedAllocation ? 1 : 0,</div>
-<div class="line"><a name="l15014"></a><span class="lineno">15014</span>&#160;        createInfo.<a class="code" href="struct_vma_allocation_create_info.html#add09658ac14fe290ace25470ddd6d41b">flags</a>,</div>
-<div class="line"><a name="l15015"></a><span class="lineno">15015</span>&#160;        createInfo.<a class="code" href="struct_vma_allocation_create_info.html#accb8b06b1f677d858cb9af20705fa910">usage</a>,</div>
-<div class="line"><a name="l15016"></a><span class="lineno">15016</span>&#160;        createInfo.<a class="code" href="struct_vma_allocation_create_info.html#a9166390303ff42d783305bc31c2b6b90">requiredFlags</a>,</div>
-<div class="line"><a name="l15017"></a><span class="lineno">15017</span>&#160;        createInfo.<a class="code" href="struct_vma_allocation_create_info.html#a7fe8d81a1ad10b2a2faacacee5b15d6d">preferredFlags</a>,</div>
-<div class="line"><a name="l15018"></a><span class="lineno">15018</span>&#160;        createInfo.<a class="code" href="struct_vma_allocation_create_info.html#a3bf940c0271d85d6ba32a4d820075055">memoryTypeBits</a>,</div>
-<div class="line"><a name="l15019"></a><span class="lineno">15019</span>&#160;        createInfo.<a class="code" href="struct_vma_allocation_create_info.html#a6272c0555cfd1fe28bff1afeb6190150">pool</a>,</div>
-<div class="line"><a name="l15020"></a><span class="lineno">15020</span>&#160;        allocation,</div>
-<div class="line"><a name="l15021"></a><span class="lineno">15021</span>&#160;        userDataStr.GetString());</div>
-<div class="line"><a name="l15022"></a><span class="lineno">15022</span>&#160;    Flush();</div>
-<div class="line"><a name="l15023"></a><span class="lineno">15023</span>&#160;}</div>
-<div class="line"><a name="l15024"></a><span class="lineno">15024</span>&#160; </div>
-<div class="line"><a name="l15025"></a><span class="lineno">15025</span>&#160;<span class="keywordtype">void</span> VmaRecorder::RecordAllocateMemoryForImage(uint32_t frameIndex,</div>
-<div class="line"><a name="l15026"></a><span class="lineno">15026</span>&#160;    <span class="keyword">const</span> VkMemoryRequirements&amp; vkMemReq,</div>
-<div class="line"><a name="l15027"></a><span class="lineno">15027</span>&#160;    <span class="keywordtype">bool</span> requiresDedicatedAllocation,</div>
-<div class="line"><a name="l15028"></a><span class="lineno">15028</span>&#160;    <span class="keywordtype">bool</span> prefersDedicatedAllocation,</div>
-<div class="line"><a name="l15029"></a><span class="lineno">15029</span>&#160;    <span class="keyword">const</span> <a class="code" href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a>&amp; createInfo,</div>
-<div class="line"><a name="l15030"></a><span class="lineno">15030</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation)</div>
-<div class="line"><a name="l15031"></a><span class="lineno">15031</span>&#160;{</div>
-<div class="line"><a name="l15032"></a><span class="lineno">15032</span>&#160;    CallParams callParams;</div>
-<div class="line"><a name="l15033"></a><span class="lineno">15033</span>&#160;    GetBasicParams(callParams);</div>
-<div class="line"><a name="l15034"></a><span class="lineno">15034</span>&#160; </div>
-<div class="line"><a name="l15035"></a><span class="lineno">15035</span>&#160;    VmaMutexLock lock(m_FileMutex, m_UseMutex);</div>
-<div class="line"><a name="l15036"></a><span class="lineno">15036</span>&#160;    UserDataString userDataStr(createInfo.<a class="code" href="struct_vma_allocation_create_info.html#add09658ac14fe290ace25470ddd6d41b">flags</a>, createInfo.<a class="code" href="struct_vma_allocation_create_info.html#a8259e85c272683434f4abb4ddddffe19">pUserData</a>);</div>
-<div class="line"><a name="l15037"></a><span class="lineno">15037</span>&#160;    fprintf(m_File, <span class="stringliteral">&quot;%u,%.3f,%u,vmaAllocateMemoryForImage,%llu,%llu,%u,%u,%u,%u,%u,%u,%u,%u,%p,%p,%s\n&quot;</span>, callParams.threadId, callParams.time, frameIndex,</div>
-<div class="line"><a name="l15038"></a><span class="lineno">15038</span>&#160;        vkMemReq.size,</div>
-<div class="line"><a name="l15039"></a><span class="lineno">15039</span>&#160;        vkMemReq.alignment,</div>
-<div class="line"><a name="l15040"></a><span class="lineno">15040</span>&#160;        vkMemReq.memoryTypeBits,</div>
-<div class="line"><a name="l15041"></a><span class="lineno">15041</span>&#160;        requiresDedicatedAllocation ? 1 : 0,</div>
-<div class="line"><a name="l15042"></a><span class="lineno">15042</span>&#160;        prefersDedicatedAllocation ? 1 : 0,</div>
-<div class="line"><a name="l15043"></a><span class="lineno">15043</span>&#160;        createInfo.<a class="code" href="struct_vma_allocation_create_info.html#add09658ac14fe290ace25470ddd6d41b">flags</a>,</div>
-<div class="line"><a name="l15044"></a><span class="lineno">15044</span>&#160;        createInfo.<a class="code" href="struct_vma_allocation_create_info.html#accb8b06b1f677d858cb9af20705fa910">usage</a>,</div>
-<div class="line"><a name="l15045"></a><span class="lineno">15045</span>&#160;        createInfo.<a class="code" href="struct_vma_allocation_create_info.html#a9166390303ff42d783305bc31c2b6b90">requiredFlags</a>,</div>
-<div class="line"><a name="l15046"></a><span class="lineno">15046</span>&#160;        createInfo.<a class="code" href="struct_vma_allocation_create_info.html#a7fe8d81a1ad10b2a2faacacee5b15d6d">preferredFlags</a>,</div>
-<div class="line"><a name="l15047"></a><span class="lineno">15047</span>&#160;        createInfo.<a class="code" href="struct_vma_allocation_create_info.html#a3bf940c0271d85d6ba32a4d820075055">memoryTypeBits</a>,</div>
-<div class="line"><a name="l15048"></a><span class="lineno">15048</span>&#160;        createInfo.<a class="code" href="struct_vma_allocation_create_info.html#a6272c0555cfd1fe28bff1afeb6190150">pool</a>,</div>
-<div class="line"><a name="l15049"></a><span class="lineno">15049</span>&#160;        allocation,</div>
-<div class="line"><a name="l15050"></a><span class="lineno">15050</span>&#160;        userDataStr.GetString());</div>
-<div class="line"><a name="l15051"></a><span class="lineno">15051</span>&#160;    Flush();</div>
-<div class="line"><a name="l15052"></a><span class="lineno">15052</span>&#160;}</div>
-<div class="line"><a name="l15053"></a><span class="lineno">15053</span>&#160; </div>
-<div class="line"><a name="l15054"></a><span class="lineno">15054</span>&#160;<span class="keywordtype">void</span> VmaRecorder::RecordFreeMemory(uint32_t frameIndex,</div>
-<div class="line"><a name="l15055"></a><span class="lineno">15055</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation)</div>
-<div class="line"><a name="l15056"></a><span class="lineno">15056</span>&#160;{</div>
-<div class="line"><a name="l15057"></a><span class="lineno">15057</span>&#160;    CallParams callParams;</div>
-<div class="line"><a name="l15058"></a><span class="lineno">15058</span>&#160;    GetBasicParams(callParams);</div>
-<div class="line"><a name="l15059"></a><span class="lineno">15059</span>&#160; </div>
-<div class="line"><a name="l15060"></a><span class="lineno">15060</span>&#160;    VmaMutexLock lock(m_FileMutex, m_UseMutex);</div>
-<div class="line"><a name="l15061"></a><span class="lineno">15061</span>&#160;    fprintf(m_File, <span class="stringliteral">&quot;%u,%.3f,%u,vmaFreeMemory,%p\n&quot;</span>, callParams.threadId, callParams.time, frameIndex,</div>
-<div class="line"><a name="l15062"></a><span class="lineno">15062</span>&#160;        allocation);</div>
-<div class="line"><a name="l15063"></a><span class="lineno">15063</span>&#160;    Flush();</div>
-<div class="line"><a name="l15064"></a><span class="lineno">15064</span>&#160;}</div>
-<div class="line"><a name="l15065"></a><span class="lineno">15065</span>&#160; </div>
-<div class="line"><a name="l15066"></a><span class="lineno">15066</span>&#160;<span class="keywordtype">void</span> VmaRecorder::RecordFreeMemoryPages(uint32_t frameIndex,</div>
-<div class="line"><a name="l15067"></a><span class="lineno">15067</span>&#160;    uint64_t allocationCount,</div>
-<div class="line"><a name="l15068"></a><span class="lineno">15068</span>&#160;    <span class="keyword">const</span> <a class="code" href="struct_vma_allocation.html">VmaAllocation</a>* pAllocations)</div>
-<div class="line"><a name="l15069"></a><span class="lineno">15069</span>&#160;{</div>
-<div class="line"><a name="l15070"></a><span class="lineno">15070</span>&#160;    CallParams callParams;</div>
-<div class="line"><a name="l15071"></a><span class="lineno">15071</span>&#160;    GetBasicParams(callParams);</div>
+<div class="line"><a name="l14979"></a><span class="lineno">14979</span>&#160;<span class="comment">    /********************************</span></div>
+<div class="line"><a name="l14980"></a><span class="lineno">14980</span>&#160;<span class="comment">    HERE IS THE CHOICE OF DEFRAGMENTATION ALGORITHM.</span></div>
+<div class="line"><a name="l14981"></a><span class="lineno">14981</span>&#160;<span class="comment">    ********************************/</span></div>
+<div class="line"><a name="l14982"></a><span class="lineno">14982</span>&#160; </div>
+<div class="line"><a name="l14983"></a><span class="lineno">14983</span>&#160;    <span class="comment">/*</span></div>
+<div class="line"><a name="l14984"></a><span class="lineno">14984</span>&#160;<span class="comment">    Fast algorithm is supported only when certain criteria are met:</span></div>
+<div class="line"><a name="l14985"></a><span class="lineno">14985</span>&#160;<span class="comment">    - VMA_DEBUG_MARGIN is 0.</span></div>
+<div class="line"><a name="l14986"></a><span class="lineno">14986</span>&#160;<span class="comment">    - All allocations in this block vector are moveable.</span></div>
+<div class="line"><a name="l14987"></a><span class="lineno">14987</span>&#160;<span class="comment">    - There is no possibility of image/buffer granularity conflict.</span></div>
+<div class="line"><a name="l14988"></a><span class="lineno">14988</span>&#160;<span class="comment">    - The defragmentation is not incremental</span></div>
+<div class="line"><a name="l14989"></a><span class="lineno">14989</span>&#160;<span class="comment">    */</span></div>
+<div class="line"><a name="l14990"></a><span class="lineno">14990</span>&#160;    <span class="keywordflow">if</span>(VMA_DEBUG_MARGIN == 0 &amp;&amp;</div>
+<div class="line"><a name="l14991"></a><span class="lineno">14991</span>&#160;        allAllocations &amp;&amp;</div>
+<div class="line"><a name="l14992"></a><span class="lineno">14992</span>&#160;        !m_pBlockVector-&gt;IsBufferImageGranularityConflictPossible() &amp;&amp;</div>
+<div class="line"><a name="l14993"></a><span class="lineno">14993</span>&#160;        !(flags &amp; <a class="code" href="vk__mem__alloc_8h.html#a6552a65b71d16f378c6994b3ceaef50ca31af49446af2459284a568ce2f3fdd33">VMA_DEFRAGMENTATION_FLAG_INCREMENTAL</a>))</div>
+<div class="line"><a name="l14994"></a><span class="lineno">14994</span>&#160;    {</div>
+<div class="line"><a name="l14995"></a><span class="lineno">14995</span>&#160;        m_pAlgorithm = vma_new(m_hAllocator, VmaDefragmentationAlgorithm_Fast)(</div>
+<div class="line"><a name="l14996"></a><span class="lineno">14996</span>&#160;            m_hAllocator, m_pBlockVector, m_CurrFrameIndex, overlappingMoveSupported);</div>
+<div class="line"><a name="l14997"></a><span class="lineno">14997</span>&#160;    }</div>
+<div class="line"><a name="l14998"></a><span class="lineno">14998</span>&#160;    <span class="keywordflow">else</span></div>
+<div class="line"><a name="l14999"></a><span class="lineno">14999</span>&#160;    {</div>
+<div class="line"><a name="l15000"></a><span class="lineno">15000</span>&#160;        m_pAlgorithm = vma_new(m_hAllocator, VmaDefragmentationAlgorithm_Generic)(</div>
+<div class="line"><a name="l15001"></a><span class="lineno">15001</span>&#160;            m_hAllocator, m_pBlockVector, m_CurrFrameIndex, overlappingMoveSupported);</div>
+<div class="line"><a name="l15002"></a><span class="lineno">15002</span>&#160;    }</div>
+<div class="line"><a name="l15003"></a><span class="lineno">15003</span>&#160; </div>
+<div class="line"><a name="l15004"></a><span class="lineno">15004</span>&#160;    <span class="keywordflow">if</span>(allAllocations)</div>
+<div class="line"><a name="l15005"></a><span class="lineno">15005</span>&#160;    {</div>
+<div class="line"><a name="l15006"></a><span class="lineno">15006</span>&#160;        m_pAlgorithm-&gt;AddAll();</div>
+<div class="line"><a name="l15007"></a><span class="lineno">15007</span>&#160;    }</div>
+<div class="line"><a name="l15008"></a><span class="lineno">15008</span>&#160;    <span class="keywordflow">else</span></div>
+<div class="line"><a name="l15009"></a><span class="lineno">15009</span>&#160;    {</div>
+<div class="line"><a name="l15010"></a><span class="lineno">15010</span>&#160;        <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> i = 0, count = m_Allocations.size(); i &lt; count; ++i)</div>
+<div class="line"><a name="l15011"></a><span class="lineno">15011</span>&#160;        {</div>
+<div class="line"><a name="l15012"></a><span class="lineno">15012</span>&#160;            m_pAlgorithm-&gt;AddAllocation(m_Allocations[i].hAlloc, m_Allocations[i].pChanged);</div>
+<div class="line"><a name="l15013"></a><span class="lineno">15013</span>&#160;        }</div>
+<div class="line"><a name="l15014"></a><span class="lineno">15014</span>&#160;    }</div>
+<div class="line"><a name="l15015"></a><span class="lineno">15015</span>&#160;}</div>
+<div class="line"><a name="l15016"></a><span class="lineno">15016</span>&#160; </div>
+<div class="line"><a name="l15018"></a><span class="lineno">15018</span>&#160;<span class="comment">// VmaDefragmentationContext</span></div>
+<div class="line"><a name="l15019"></a><span class="lineno">15019</span>&#160; </div>
+<div class="line"><a name="l15020"></a><span class="lineno">15020</span>&#160;VmaDefragmentationContext_T::VmaDefragmentationContext_T(</div>
+<div class="line"><a name="l15021"></a><span class="lineno">15021</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator,</div>
+<div class="line"><a name="l15022"></a><span class="lineno">15022</span>&#160;    uint32_t currFrameIndex,</div>
+<div class="line"><a name="l15023"></a><span class="lineno">15023</span>&#160;    uint32_t flags,</div>
+<div class="line"><a name="l15024"></a><span class="lineno">15024</span>&#160;    <a class="code" href="struct_vma_defragmentation_stats.html">VmaDefragmentationStats</a>* pStats) :</div>
+<div class="line"><a name="l15025"></a><span class="lineno">15025</span>&#160;    m_hAllocator(hAllocator),</div>
+<div class="line"><a name="l15026"></a><span class="lineno">15026</span>&#160;    m_CurrFrameIndex(currFrameIndex),</div>
+<div class="line"><a name="l15027"></a><span class="lineno">15027</span>&#160;    m_Flags(flags),</div>
+<div class="line"><a name="l15028"></a><span class="lineno">15028</span>&#160;    m_pStats(pStats),</div>
+<div class="line"><a name="l15029"></a><span class="lineno">15029</span>&#160;    m_CustomPoolContexts(VmaStlAllocator&lt;VmaBlockVectorDefragmentationContext*&gt;(hAllocator-&gt;GetAllocationCallbacks()))</div>
+<div class="line"><a name="l15030"></a><span class="lineno">15030</span>&#160;{</div>
+<div class="line"><a name="l15031"></a><span class="lineno">15031</span>&#160;    memset(m_DefaultPoolContexts, 0, <span class="keyword">sizeof</span>(m_DefaultPoolContexts));</div>
+<div class="line"><a name="l15032"></a><span class="lineno">15032</span>&#160;}</div>
+<div class="line"><a name="l15033"></a><span class="lineno">15033</span>&#160; </div>
+<div class="line"><a name="l15034"></a><span class="lineno">15034</span>&#160;VmaDefragmentationContext_T::~VmaDefragmentationContext_T()</div>
+<div class="line"><a name="l15035"></a><span class="lineno">15035</span>&#160;{</div>
+<div class="line"><a name="l15036"></a><span class="lineno">15036</span>&#160;    <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> i = m_CustomPoolContexts.size(); i--; )</div>
+<div class="line"><a name="l15037"></a><span class="lineno">15037</span>&#160;    {</div>
+<div class="line"><a name="l15038"></a><span class="lineno">15038</span>&#160;        VmaBlockVectorDefragmentationContext* pBlockVectorCtx = m_CustomPoolContexts[i];</div>
+<div class="line"><a name="l15039"></a><span class="lineno">15039</span>&#160;        pBlockVectorCtx-&gt;GetBlockVector()-&gt;DefragmentationEnd(pBlockVectorCtx, m_Flags, m_pStats);</div>
+<div class="line"><a name="l15040"></a><span class="lineno">15040</span>&#160;        vma_delete(m_hAllocator, pBlockVectorCtx);</div>
+<div class="line"><a name="l15041"></a><span class="lineno">15041</span>&#160;    }</div>
+<div class="line"><a name="l15042"></a><span class="lineno">15042</span>&#160;    <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> i = m_hAllocator-&gt;m_MemProps.memoryTypeCount; i--; )</div>
+<div class="line"><a name="l15043"></a><span class="lineno">15043</span>&#160;    {</div>
+<div class="line"><a name="l15044"></a><span class="lineno">15044</span>&#160;        VmaBlockVectorDefragmentationContext* pBlockVectorCtx = m_DefaultPoolContexts[i];</div>
+<div class="line"><a name="l15045"></a><span class="lineno">15045</span>&#160;        <span class="keywordflow">if</span>(pBlockVectorCtx)</div>
+<div class="line"><a name="l15046"></a><span class="lineno">15046</span>&#160;        {</div>
+<div class="line"><a name="l15047"></a><span class="lineno">15047</span>&#160;            pBlockVectorCtx-&gt;GetBlockVector()-&gt;DefragmentationEnd(pBlockVectorCtx, m_Flags, m_pStats);</div>
+<div class="line"><a name="l15048"></a><span class="lineno">15048</span>&#160;            vma_delete(m_hAllocator, pBlockVectorCtx);</div>
+<div class="line"><a name="l15049"></a><span class="lineno">15049</span>&#160;        }</div>
+<div class="line"><a name="l15050"></a><span class="lineno">15050</span>&#160;    }</div>
+<div class="line"><a name="l15051"></a><span class="lineno">15051</span>&#160;}</div>
+<div class="line"><a name="l15052"></a><span class="lineno">15052</span>&#160; </div>
+<div class="line"><a name="l15053"></a><span class="lineno">15053</span>&#160;<span class="keywordtype">void</span> VmaDefragmentationContext_T::AddPools(uint32_t poolCount, <span class="keyword">const</span> <a class="code" href="struct_vma_pool.html">VmaPool</a>* pPools)</div>
+<div class="line"><a name="l15054"></a><span class="lineno">15054</span>&#160;{</div>
+<div class="line"><a name="l15055"></a><span class="lineno">15055</span>&#160;    <span class="keywordflow">for</span>(uint32_t poolIndex = 0; poolIndex &lt; poolCount; ++poolIndex)</div>
+<div class="line"><a name="l15056"></a><span class="lineno">15056</span>&#160;    {</div>
+<div class="line"><a name="l15057"></a><span class="lineno">15057</span>&#160;        <a class="code" href="struct_vma_pool.html">VmaPool</a> pool = pPools[poolIndex];</div>
+<div class="line"><a name="l15058"></a><span class="lineno">15058</span>&#160;        VMA_ASSERT(pool);</div>
+<div class="line"><a name="l15059"></a><span class="lineno">15059</span>&#160;        <span class="comment">// Pools with algorithm other than default are not defragmented.</span></div>
+<div class="line"><a name="l15060"></a><span class="lineno">15060</span>&#160;        <span class="keywordflow">if</span>(pool-&gt;m_BlockVector.GetAlgorithm() == 0)</div>
+<div class="line"><a name="l15061"></a><span class="lineno">15061</span>&#160;        {</div>
+<div class="line"><a name="l15062"></a><span class="lineno">15062</span>&#160;            VmaBlockVectorDefragmentationContext* pBlockVectorDefragCtx = VMA_NULL;</div>
+<div class="line"><a name="l15063"></a><span class="lineno">15063</span>&#160; </div>
+<div class="line"><a name="l15064"></a><span class="lineno">15064</span>&#160;            <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> i = m_CustomPoolContexts.size(); i--; )</div>
+<div class="line"><a name="l15065"></a><span class="lineno">15065</span>&#160;            {</div>
+<div class="line"><a name="l15066"></a><span class="lineno">15066</span>&#160;                <span class="keywordflow">if</span>(m_CustomPoolContexts[i]-&gt;GetCustomPool() == pool)</div>
+<div class="line"><a name="l15067"></a><span class="lineno">15067</span>&#160;                {</div>
+<div class="line"><a name="l15068"></a><span class="lineno">15068</span>&#160;                    pBlockVectorDefragCtx = m_CustomPoolContexts[i];</div>
+<div class="line"><a name="l15069"></a><span class="lineno">15069</span>&#160;                    <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l15070"></a><span class="lineno">15070</span>&#160;                }</div>
+<div class="line"><a name="l15071"></a><span class="lineno">15071</span>&#160;            }</div>
 <div class="line"><a name="l15072"></a><span class="lineno">15072</span>&#160; </div>
-<div class="line"><a name="l15073"></a><span class="lineno">15073</span>&#160;    VmaMutexLock lock(m_FileMutex, m_UseMutex);</div>
-<div class="line"><a name="l15074"></a><span class="lineno">15074</span>&#160;    fprintf(m_File, <span class="stringliteral">&quot;%u,%.3f,%u,vmaFreeMemoryPages,&quot;</span>, callParams.threadId, callParams.time, frameIndex);</div>
-<div class="line"><a name="l15075"></a><span class="lineno">15075</span>&#160;    PrintPointerList(allocationCount, pAllocations);</div>
-<div class="line"><a name="l15076"></a><span class="lineno">15076</span>&#160;    fprintf(m_File, <span class="stringliteral">&quot;\n&quot;</span>);</div>
-<div class="line"><a name="l15077"></a><span class="lineno">15077</span>&#160;    Flush();</div>
-<div class="line"><a name="l15078"></a><span class="lineno">15078</span>&#160;}</div>
-<div class="line"><a name="l15079"></a><span class="lineno">15079</span>&#160; </div>
-<div class="line"><a name="l15080"></a><span class="lineno">15080</span>&#160;<span class="keywordtype">void</span> VmaRecorder::RecordSetAllocationUserData(uint32_t frameIndex,</div>
-<div class="line"><a name="l15081"></a><span class="lineno">15081</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation,</div>
-<div class="line"><a name="l15082"></a><span class="lineno">15082</span>&#160;    <span class="keyword">const</span> <span class="keywordtype">void</span>* pUserData)</div>
-<div class="line"><a name="l15083"></a><span class="lineno">15083</span>&#160;{</div>
-<div class="line"><a name="l15084"></a><span class="lineno">15084</span>&#160;    CallParams callParams;</div>
-<div class="line"><a name="l15085"></a><span class="lineno">15085</span>&#160;    GetBasicParams(callParams);</div>
-<div class="line"><a name="l15086"></a><span class="lineno">15086</span>&#160; </div>
-<div class="line"><a name="l15087"></a><span class="lineno">15087</span>&#160;    VmaMutexLock lock(m_FileMutex, m_UseMutex);</div>
-<div class="line"><a name="l15088"></a><span class="lineno">15088</span>&#160;    UserDataString userDataStr(</div>
-<div class="line"><a name="l15089"></a><span class="lineno">15089</span>&#160;        allocation-&gt;IsUserDataString() ? <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597aa6f24f821cd6a7c5e4a443f7bf59c520">VMA_ALLOCATION_CREATE_USER_DATA_COPY_STRING_BIT</a> : 0,</div>
-<div class="line"><a name="l15090"></a><span class="lineno">15090</span>&#160;        pUserData);</div>
-<div class="line"><a name="l15091"></a><span class="lineno">15091</span>&#160;    fprintf(m_File, <span class="stringliteral">&quot;%u,%.3f,%u,vmaSetAllocationUserData,%p,%s\n&quot;</span>, callParams.threadId, callParams.time, frameIndex,</div>
-<div class="line"><a name="l15092"></a><span class="lineno">15092</span>&#160;        allocation,</div>
-<div class="line"><a name="l15093"></a><span class="lineno">15093</span>&#160;        userDataStr.GetString());</div>
-<div class="line"><a name="l15094"></a><span class="lineno">15094</span>&#160;    Flush();</div>
-<div class="line"><a name="l15095"></a><span class="lineno">15095</span>&#160;}</div>
-<div class="line"><a name="l15096"></a><span class="lineno">15096</span>&#160; </div>
-<div class="line"><a name="l15097"></a><span class="lineno">15097</span>&#160;<span class="keywordtype">void</span> VmaRecorder::RecordCreateLostAllocation(uint32_t frameIndex,</div>
-<div class="line"><a name="l15098"></a><span class="lineno">15098</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation)</div>
-<div class="line"><a name="l15099"></a><span class="lineno">15099</span>&#160;{</div>
-<div class="line"><a name="l15100"></a><span class="lineno">15100</span>&#160;    CallParams callParams;</div>
-<div class="line"><a name="l15101"></a><span class="lineno">15101</span>&#160;    GetBasicParams(callParams);</div>
-<div class="line"><a name="l15102"></a><span class="lineno">15102</span>&#160; </div>
-<div class="line"><a name="l15103"></a><span class="lineno">15103</span>&#160;    VmaMutexLock lock(m_FileMutex, m_UseMutex);</div>
-<div class="line"><a name="l15104"></a><span class="lineno">15104</span>&#160;    fprintf(m_File, <span class="stringliteral">&quot;%u,%.3f,%u,vmaCreateLostAllocation,%p\n&quot;</span>, callParams.threadId, callParams.time, frameIndex,</div>
-<div class="line"><a name="l15105"></a><span class="lineno">15105</span>&#160;        allocation);</div>
-<div class="line"><a name="l15106"></a><span class="lineno">15106</span>&#160;    Flush();</div>
-<div class="line"><a name="l15107"></a><span class="lineno">15107</span>&#160;}</div>
-<div class="line"><a name="l15108"></a><span class="lineno">15108</span>&#160; </div>
-<div class="line"><a name="l15109"></a><span class="lineno">15109</span>&#160;<span class="keywordtype">void</span> VmaRecorder::RecordMapMemory(uint32_t frameIndex,</div>
-<div class="line"><a name="l15110"></a><span class="lineno">15110</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation)</div>
-<div class="line"><a name="l15111"></a><span class="lineno">15111</span>&#160;{</div>
-<div class="line"><a name="l15112"></a><span class="lineno">15112</span>&#160;    CallParams callParams;</div>
-<div class="line"><a name="l15113"></a><span class="lineno">15113</span>&#160;    GetBasicParams(callParams);</div>
-<div class="line"><a name="l15114"></a><span class="lineno">15114</span>&#160; </div>
-<div class="line"><a name="l15115"></a><span class="lineno">15115</span>&#160;    VmaMutexLock lock(m_FileMutex, m_UseMutex);</div>
-<div class="line"><a name="l15116"></a><span class="lineno">15116</span>&#160;    fprintf(m_File, <span class="stringliteral">&quot;%u,%.3f,%u,vmaMapMemory,%p\n&quot;</span>, callParams.threadId, callParams.time, frameIndex,</div>
-<div class="line"><a name="l15117"></a><span class="lineno">15117</span>&#160;        allocation);</div>
-<div class="line"><a name="l15118"></a><span class="lineno">15118</span>&#160;    Flush();</div>
-<div class="line"><a name="l15119"></a><span class="lineno">15119</span>&#160;}</div>
-<div class="line"><a name="l15120"></a><span class="lineno">15120</span>&#160; </div>
-<div class="line"><a name="l15121"></a><span class="lineno">15121</span>&#160;<span class="keywordtype">void</span> VmaRecorder::RecordUnmapMemory(uint32_t frameIndex,</div>
-<div class="line"><a name="l15122"></a><span class="lineno">15122</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation)</div>
-<div class="line"><a name="l15123"></a><span class="lineno">15123</span>&#160;{</div>
-<div class="line"><a name="l15124"></a><span class="lineno">15124</span>&#160;    CallParams callParams;</div>
-<div class="line"><a name="l15125"></a><span class="lineno">15125</span>&#160;    GetBasicParams(callParams);</div>
-<div class="line"><a name="l15126"></a><span class="lineno">15126</span>&#160; </div>
-<div class="line"><a name="l15127"></a><span class="lineno">15127</span>&#160;    VmaMutexLock lock(m_FileMutex, m_UseMutex);</div>
-<div class="line"><a name="l15128"></a><span class="lineno">15128</span>&#160;    fprintf(m_File, <span class="stringliteral">&quot;%u,%.3f,%u,vmaUnmapMemory,%p\n&quot;</span>, callParams.threadId, callParams.time, frameIndex,</div>
-<div class="line"><a name="l15129"></a><span class="lineno">15129</span>&#160;        allocation);</div>
-<div class="line"><a name="l15130"></a><span class="lineno">15130</span>&#160;    Flush();</div>
-<div class="line"><a name="l15131"></a><span class="lineno">15131</span>&#160;}</div>
-<div class="line"><a name="l15132"></a><span class="lineno">15132</span>&#160; </div>
-<div class="line"><a name="l15133"></a><span class="lineno">15133</span>&#160;<span class="keywordtype">void</span> VmaRecorder::RecordFlushAllocation(uint32_t frameIndex,</div>
-<div class="line"><a name="l15134"></a><span class="lineno">15134</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation, VkDeviceSize offset, VkDeviceSize size)</div>
-<div class="line"><a name="l15135"></a><span class="lineno">15135</span>&#160;{</div>
-<div class="line"><a name="l15136"></a><span class="lineno">15136</span>&#160;    CallParams callParams;</div>
-<div class="line"><a name="l15137"></a><span class="lineno">15137</span>&#160;    GetBasicParams(callParams);</div>
-<div class="line"><a name="l15138"></a><span class="lineno">15138</span>&#160; </div>
-<div class="line"><a name="l15139"></a><span class="lineno">15139</span>&#160;    VmaMutexLock lock(m_FileMutex, m_UseMutex);</div>
-<div class="line"><a name="l15140"></a><span class="lineno">15140</span>&#160;    fprintf(m_File, <span class="stringliteral">&quot;%u,%.3f,%u,vmaFlushAllocation,%p,%llu,%llu\n&quot;</span>, callParams.threadId, callParams.time, frameIndex,</div>
-<div class="line"><a name="l15141"></a><span class="lineno">15141</span>&#160;        allocation,</div>
-<div class="line"><a name="l15142"></a><span class="lineno">15142</span>&#160;        offset,</div>
-<div class="line"><a name="l15143"></a><span class="lineno">15143</span>&#160;        size);</div>
-<div class="line"><a name="l15144"></a><span class="lineno">15144</span>&#160;    Flush();</div>
-<div class="line"><a name="l15145"></a><span class="lineno">15145</span>&#160;}</div>
+<div class="line"><a name="l15073"></a><span class="lineno">15073</span>&#160;            <span class="keywordflow">if</span>(!pBlockVectorDefragCtx)</div>
+<div class="line"><a name="l15074"></a><span class="lineno">15074</span>&#160;            {</div>
+<div class="line"><a name="l15075"></a><span class="lineno">15075</span>&#160;                pBlockVectorDefragCtx = vma_new(m_hAllocator, VmaBlockVectorDefragmentationContext)(</div>
+<div class="line"><a name="l15076"></a><span class="lineno">15076</span>&#160;                    m_hAllocator,</div>
+<div class="line"><a name="l15077"></a><span class="lineno">15077</span>&#160;                    pool,</div>
+<div class="line"><a name="l15078"></a><span class="lineno">15078</span>&#160;                    &amp;pool-&gt;m_BlockVector,</div>
+<div class="line"><a name="l15079"></a><span class="lineno">15079</span>&#160;                    m_CurrFrameIndex);</div>
+<div class="line"><a name="l15080"></a><span class="lineno">15080</span>&#160;                m_CustomPoolContexts.push_back(pBlockVectorDefragCtx);</div>
+<div class="line"><a name="l15081"></a><span class="lineno">15081</span>&#160;            }</div>
+<div class="line"><a name="l15082"></a><span class="lineno">15082</span>&#160; </div>
+<div class="line"><a name="l15083"></a><span class="lineno">15083</span>&#160;            pBlockVectorDefragCtx-&gt;AddAll();</div>
+<div class="line"><a name="l15084"></a><span class="lineno">15084</span>&#160;        }</div>
+<div class="line"><a name="l15085"></a><span class="lineno">15085</span>&#160;    }</div>
+<div class="line"><a name="l15086"></a><span class="lineno">15086</span>&#160;}</div>
+<div class="line"><a name="l15087"></a><span class="lineno">15087</span>&#160; </div>
+<div class="line"><a name="l15088"></a><span class="lineno">15088</span>&#160;<span class="keywordtype">void</span> VmaDefragmentationContext_T::AddAllocations(</div>
+<div class="line"><a name="l15089"></a><span class="lineno">15089</span>&#160;    uint32_t allocationCount,</div>
+<div class="line"><a name="l15090"></a><span class="lineno">15090</span>&#160;    <span class="keyword">const</span> <a class="code" href="struct_vma_allocation.html">VmaAllocation</a>* pAllocations,</div>
+<div class="line"><a name="l15091"></a><span class="lineno">15091</span>&#160;    VkBool32* pAllocationsChanged)</div>
+<div class="line"><a name="l15092"></a><span class="lineno">15092</span>&#160;{</div>
+<div class="line"><a name="l15093"></a><span class="lineno">15093</span>&#160;    <span class="comment">// Dispatch pAllocations among defragmentators. Create them when necessary.</span></div>
+<div class="line"><a name="l15094"></a><span class="lineno">15094</span>&#160;    <span class="keywordflow">for</span>(uint32_t allocIndex = 0; allocIndex &lt; allocationCount; ++allocIndex)</div>
+<div class="line"><a name="l15095"></a><span class="lineno">15095</span>&#160;    {</div>
+<div class="line"><a name="l15096"></a><span class="lineno">15096</span>&#160;        <span class="keyword">const</span> <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> hAlloc = pAllocations[allocIndex];</div>
+<div class="line"><a name="l15097"></a><span class="lineno">15097</span>&#160;        VMA_ASSERT(hAlloc);</div>
+<div class="line"><a name="l15098"></a><span class="lineno">15098</span>&#160;        <span class="comment">// DedicatedAlloc cannot be defragmented.</span></div>
+<div class="line"><a name="l15099"></a><span class="lineno">15099</span>&#160;        <span class="keywordflow">if</span>((hAlloc-&gt;GetType() == VmaAllocation_T::ALLOCATION_TYPE_BLOCK) &amp;&amp;</div>
+<div class="line"><a name="l15100"></a><span class="lineno">15100</span>&#160;            <span class="comment">// Lost allocation cannot be defragmented.</span></div>
+<div class="line"><a name="l15101"></a><span class="lineno">15101</span>&#160;            (hAlloc-&gt;GetLastUseFrameIndex() != VMA_FRAME_INDEX_LOST))</div>
+<div class="line"><a name="l15102"></a><span class="lineno">15102</span>&#160;        {</div>
+<div class="line"><a name="l15103"></a><span class="lineno">15103</span>&#160;            VmaBlockVectorDefragmentationContext* pBlockVectorDefragCtx = VMA_NULL;</div>
+<div class="line"><a name="l15104"></a><span class="lineno">15104</span>&#160; </div>
+<div class="line"><a name="l15105"></a><span class="lineno">15105</span>&#160;            <span class="keyword">const</span> <a class="code" href="struct_vma_pool.html">VmaPool</a> hAllocPool = hAlloc-&gt;GetBlock()-&gt;GetParentPool();</div>
+<div class="line"><a name="l15106"></a><span class="lineno">15106</span>&#160;            <span class="comment">// This allocation belongs to custom pool.</span></div>
+<div class="line"><a name="l15107"></a><span class="lineno">15107</span>&#160;            <span class="keywordflow">if</span>(hAllocPool != VK_NULL_HANDLE)</div>
+<div class="line"><a name="l15108"></a><span class="lineno">15108</span>&#160;            {</div>
+<div class="line"><a name="l15109"></a><span class="lineno">15109</span>&#160;                <span class="comment">// Pools with algorithm other than default are not defragmented.</span></div>
+<div class="line"><a name="l15110"></a><span class="lineno">15110</span>&#160;                <span class="keywordflow">if</span>(hAllocPool-&gt;m_BlockVector.GetAlgorithm() == 0)</div>
+<div class="line"><a name="l15111"></a><span class="lineno">15111</span>&#160;                {</div>
+<div class="line"><a name="l15112"></a><span class="lineno">15112</span>&#160;                    <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> i = m_CustomPoolContexts.size(); i--; )</div>
+<div class="line"><a name="l15113"></a><span class="lineno">15113</span>&#160;                    {</div>
+<div class="line"><a name="l15114"></a><span class="lineno">15114</span>&#160;                        <span class="keywordflow">if</span>(m_CustomPoolContexts[i]-&gt;GetCustomPool() == hAllocPool)</div>
+<div class="line"><a name="l15115"></a><span class="lineno">15115</span>&#160;                        {</div>
+<div class="line"><a name="l15116"></a><span class="lineno">15116</span>&#160;                            pBlockVectorDefragCtx = m_CustomPoolContexts[i];</div>
+<div class="line"><a name="l15117"></a><span class="lineno">15117</span>&#160;                            <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l15118"></a><span class="lineno">15118</span>&#160;                        }</div>
+<div class="line"><a name="l15119"></a><span class="lineno">15119</span>&#160;                    }</div>
+<div class="line"><a name="l15120"></a><span class="lineno">15120</span>&#160;                    <span class="keywordflow">if</span>(!pBlockVectorDefragCtx)</div>
+<div class="line"><a name="l15121"></a><span class="lineno">15121</span>&#160;                    {</div>
+<div class="line"><a name="l15122"></a><span class="lineno">15122</span>&#160;                        pBlockVectorDefragCtx = vma_new(m_hAllocator, VmaBlockVectorDefragmentationContext)(</div>
+<div class="line"><a name="l15123"></a><span class="lineno">15123</span>&#160;                            m_hAllocator,</div>
+<div class="line"><a name="l15124"></a><span class="lineno">15124</span>&#160;                            hAllocPool,</div>
+<div class="line"><a name="l15125"></a><span class="lineno">15125</span>&#160;                            &amp;hAllocPool-&gt;m_BlockVector,</div>
+<div class="line"><a name="l15126"></a><span class="lineno">15126</span>&#160;                            m_CurrFrameIndex);</div>
+<div class="line"><a name="l15127"></a><span class="lineno">15127</span>&#160;                        m_CustomPoolContexts.push_back(pBlockVectorDefragCtx);</div>
+<div class="line"><a name="l15128"></a><span class="lineno">15128</span>&#160;                    }</div>
+<div class="line"><a name="l15129"></a><span class="lineno">15129</span>&#160;                }</div>
+<div class="line"><a name="l15130"></a><span class="lineno">15130</span>&#160;            }</div>
+<div class="line"><a name="l15131"></a><span class="lineno">15131</span>&#160;            <span class="comment">// This allocation belongs to default pool.</span></div>
+<div class="line"><a name="l15132"></a><span class="lineno">15132</span>&#160;            <span class="keywordflow">else</span></div>
+<div class="line"><a name="l15133"></a><span class="lineno">15133</span>&#160;            {</div>
+<div class="line"><a name="l15134"></a><span class="lineno">15134</span>&#160;                <span class="keyword">const</span> uint32_t memTypeIndex = hAlloc-&gt;GetMemoryTypeIndex();</div>
+<div class="line"><a name="l15135"></a><span class="lineno">15135</span>&#160;                pBlockVectorDefragCtx = m_DefaultPoolContexts[memTypeIndex];</div>
+<div class="line"><a name="l15136"></a><span class="lineno">15136</span>&#160;                <span class="keywordflow">if</span>(!pBlockVectorDefragCtx)</div>
+<div class="line"><a name="l15137"></a><span class="lineno">15137</span>&#160;                {</div>
+<div class="line"><a name="l15138"></a><span class="lineno">15138</span>&#160;                    pBlockVectorDefragCtx = vma_new(m_hAllocator, VmaBlockVectorDefragmentationContext)(</div>
+<div class="line"><a name="l15139"></a><span class="lineno">15139</span>&#160;                        m_hAllocator,</div>
+<div class="line"><a name="l15140"></a><span class="lineno">15140</span>&#160;                        VMA_NULL, <span class="comment">// hCustomPool</span></div>
+<div class="line"><a name="l15141"></a><span class="lineno">15141</span>&#160;                        m_hAllocator-&gt;m_pBlockVectors[memTypeIndex],</div>
+<div class="line"><a name="l15142"></a><span class="lineno">15142</span>&#160;                        m_CurrFrameIndex);</div>
+<div class="line"><a name="l15143"></a><span class="lineno">15143</span>&#160;                    m_DefaultPoolContexts[memTypeIndex] = pBlockVectorDefragCtx;</div>
+<div class="line"><a name="l15144"></a><span class="lineno">15144</span>&#160;                }</div>
+<div class="line"><a name="l15145"></a><span class="lineno">15145</span>&#160;            }</div>
 <div class="line"><a name="l15146"></a><span class="lineno">15146</span>&#160; </div>
-<div class="line"><a name="l15147"></a><span class="lineno">15147</span>&#160;<span class="keywordtype">void</span> VmaRecorder::RecordInvalidateAllocation(uint32_t frameIndex,</div>
-<div class="line"><a name="l15148"></a><span class="lineno">15148</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation, VkDeviceSize offset, VkDeviceSize size)</div>
-<div class="line"><a name="l15149"></a><span class="lineno">15149</span>&#160;{</div>
-<div class="line"><a name="l15150"></a><span class="lineno">15150</span>&#160;    CallParams callParams;</div>
-<div class="line"><a name="l15151"></a><span class="lineno">15151</span>&#160;    GetBasicParams(callParams);</div>
-<div class="line"><a name="l15152"></a><span class="lineno">15152</span>&#160; </div>
-<div class="line"><a name="l15153"></a><span class="lineno">15153</span>&#160;    VmaMutexLock lock(m_FileMutex, m_UseMutex);</div>
-<div class="line"><a name="l15154"></a><span class="lineno">15154</span>&#160;    fprintf(m_File, <span class="stringliteral">&quot;%u,%.3f,%u,vmaInvalidateAllocation,%p,%llu,%llu\n&quot;</span>, callParams.threadId, callParams.time, frameIndex,</div>
-<div class="line"><a name="l15155"></a><span class="lineno">15155</span>&#160;        allocation,</div>
-<div class="line"><a name="l15156"></a><span class="lineno">15156</span>&#160;        offset,</div>
-<div class="line"><a name="l15157"></a><span class="lineno">15157</span>&#160;        size);</div>
-<div class="line"><a name="l15158"></a><span class="lineno">15158</span>&#160;    Flush();</div>
-<div class="line"><a name="l15159"></a><span class="lineno">15159</span>&#160;}</div>
-<div class="line"><a name="l15160"></a><span class="lineno">15160</span>&#160; </div>
-<div class="line"><a name="l15161"></a><span class="lineno">15161</span>&#160;<span class="keywordtype">void</span> VmaRecorder::RecordCreateBuffer(uint32_t frameIndex,</div>
-<div class="line"><a name="l15162"></a><span class="lineno">15162</span>&#160;    <span class="keyword">const</span> VkBufferCreateInfo&amp; bufCreateInfo,</div>
-<div class="line"><a name="l15163"></a><span class="lineno">15163</span>&#160;    <span class="keyword">const</span> <a class="code" href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a>&amp; allocCreateInfo,</div>
-<div class="line"><a name="l15164"></a><span class="lineno">15164</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation)</div>
-<div class="line"><a name="l15165"></a><span class="lineno">15165</span>&#160;{</div>
-<div class="line"><a name="l15166"></a><span class="lineno">15166</span>&#160;    CallParams callParams;</div>
-<div class="line"><a name="l15167"></a><span class="lineno">15167</span>&#160;    GetBasicParams(callParams);</div>
-<div class="line"><a name="l15168"></a><span class="lineno">15168</span>&#160; </div>
-<div class="line"><a name="l15169"></a><span class="lineno">15169</span>&#160;    VmaMutexLock lock(m_FileMutex, m_UseMutex);</div>
-<div class="line"><a name="l15170"></a><span class="lineno">15170</span>&#160;    UserDataString userDataStr(allocCreateInfo.<a class="code" href="struct_vma_allocation_create_info.html#add09658ac14fe290ace25470ddd6d41b">flags</a>, allocCreateInfo.<a class="code" href="struct_vma_allocation_create_info.html#a8259e85c272683434f4abb4ddddffe19">pUserData</a>);</div>
-<div class="line"><a name="l15171"></a><span class="lineno">15171</span>&#160;    fprintf(m_File, <span class="stringliteral">&quot;%u,%.3f,%u,vmaCreateBuffer,%u,%llu,%u,%u,%u,%u,%u,%u,%u,%p,%p,%s\n&quot;</span>, callParams.threadId, callParams.time, frameIndex,</div>
-<div class="line"><a name="l15172"></a><span class="lineno">15172</span>&#160;        bufCreateInfo.flags,</div>
-<div class="line"><a name="l15173"></a><span class="lineno">15173</span>&#160;        bufCreateInfo.size,</div>
-<div class="line"><a name="l15174"></a><span class="lineno">15174</span>&#160;        bufCreateInfo.usage,</div>
-<div class="line"><a name="l15175"></a><span class="lineno">15175</span>&#160;        bufCreateInfo.sharingMode,</div>
-<div class="line"><a name="l15176"></a><span class="lineno">15176</span>&#160;        allocCreateInfo.<a class="code" href="struct_vma_allocation_create_info.html#add09658ac14fe290ace25470ddd6d41b">flags</a>,</div>
-<div class="line"><a name="l15177"></a><span class="lineno">15177</span>&#160;        allocCreateInfo.<a class="code" href="struct_vma_allocation_create_info.html#accb8b06b1f677d858cb9af20705fa910">usage</a>,</div>
-<div class="line"><a name="l15178"></a><span class="lineno">15178</span>&#160;        allocCreateInfo.<a class="code" href="struct_vma_allocation_create_info.html#a9166390303ff42d783305bc31c2b6b90">requiredFlags</a>,</div>
-<div class="line"><a name="l15179"></a><span class="lineno">15179</span>&#160;        allocCreateInfo.<a class="code" href="struct_vma_allocation_create_info.html#a7fe8d81a1ad10b2a2faacacee5b15d6d">preferredFlags</a>,</div>
-<div class="line"><a name="l15180"></a><span class="lineno">15180</span>&#160;        allocCreateInfo.<a class="code" href="struct_vma_allocation_create_info.html#a3bf940c0271d85d6ba32a4d820075055">memoryTypeBits</a>,</div>
-<div class="line"><a name="l15181"></a><span class="lineno">15181</span>&#160;        allocCreateInfo.<a class="code" href="struct_vma_allocation_create_info.html#a6272c0555cfd1fe28bff1afeb6190150">pool</a>,</div>
-<div class="line"><a name="l15182"></a><span class="lineno">15182</span>&#160;        allocation,</div>
-<div class="line"><a name="l15183"></a><span class="lineno">15183</span>&#160;        userDataStr.GetString());</div>
-<div class="line"><a name="l15184"></a><span class="lineno">15184</span>&#160;    Flush();</div>
-<div class="line"><a name="l15185"></a><span class="lineno">15185</span>&#160;}</div>
-<div class="line"><a name="l15186"></a><span class="lineno">15186</span>&#160; </div>
-<div class="line"><a name="l15187"></a><span class="lineno">15187</span>&#160;<span class="keywordtype">void</span> VmaRecorder::RecordCreateImage(uint32_t frameIndex,</div>
-<div class="line"><a name="l15188"></a><span class="lineno">15188</span>&#160;    <span class="keyword">const</span> VkImageCreateInfo&amp; imageCreateInfo,</div>
-<div class="line"><a name="l15189"></a><span class="lineno">15189</span>&#160;    <span class="keyword">const</span> <a class="code" href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a>&amp; allocCreateInfo,</div>
-<div class="line"><a name="l15190"></a><span class="lineno">15190</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation)</div>
-<div class="line"><a name="l15191"></a><span class="lineno">15191</span>&#160;{</div>
-<div class="line"><a name="l15192"></a><span class="lineno">15192</span>&#160;    CallParams callParams;</div>
-<div class="line"><a name="l15193"></a><span class="lineno">15193</span>&#160;    GetBasicParams(callParams);</div>
-<div class="line"><a name="l15194"></a><span class="lineno">15194</span>&#160; </div>
-<div class="line"><a name="l15195"></a><span class="lineno">15195</span>&#160;    VmaMutexLock lock(m_FileMutex, m_UseMutex);</div>
-<div class="line"><a name="l15196"></a><span class="lineno">15196</span>&#160;    UserDataString userDataStr(allocCreateInfo.<a class="code" href="struct_vma_allocation_create_info.html#add09658ac14fe290ace25470ddd6d41b">flags</a>, allocCreateInfo.<a class="code" href="struct_vma_allocation_create_info.html#a8259e85c272683434f4abb4ddddffe19">pUserData</a>);</div>
-<div class="line"><a name="l15197"></a><span class="lineno">15197</span>&#160;    fprintf(m_File, <span class="stringliteral">&quot;%u,%.3f,%u,vmaCreateImage,%u,%u,%u,%u,%u,%u,%u,%u,%u,%u,%u,%u,%u,%u,%u,%u,%u,%u,%p,%p,%s\n&quot;</span>, callParams.threadId, callParams.time, frameIndex,</div>
-<div class="line"><a name="l15198"></a><span class="lineno">15198</span>&#160;        imageCreateInfo.flags,</div>
-<div class="line"><a name="l15199"></a><span class="lineno">15199</span>&#160;        imageCreateInfo.imageType,</div>
-<div class="line"><a name="l15200"></a><span class="lineno">15200</span>&#160;        imageCreateInfo.format,</div>
-<div class="line"><a name="l15201"></a><span class="lineno">15201</span>&#160;        imageCreateInfo.extent.width,</div>
-<div class="line"><a name="l15202"></a><span class="lineno">15202</span>&#160;        imageCreateInfo.extent.height,</div>
-<div class="line"><a name="l15203"></a><span class="lineno">15203</span>&#160;        imageCreateInfo.extent.depth,</div>
-<div class="line"><a name="l15204"></a><span class="lineno">15204</span>&#160;        imageCreateInfo.mipLevels,</div>
-<div class="line"><a name="l15205"></a><span class="lineno">15205</span>&#160;        imageCreateInfo.arrayLayers,</div>
-<div class="line"><a name="l15206"></a><span class="lineno">15206</span>&#160;        imageCreateInfo.samples,</div>
-<div class="line"><a name="l15207"></a><span class="lineno">15207</span>&#160;        imageCreateInfo.tiling,</div>
-<div class="line"><a name="l15208"></a><span class="lineno">15208</span>&#160;        imageCreateInfo.usage,</div>
-<div class="line"><a name="l15209"></a><span class="lineno">15209</span>&#160;        imageCreateInfo.sharingMode,</div>
-<div class="line"><a name="l15210"></a><span class="lineno">15210</span>&#160;        imageCreateInfo.initialLayout,</div>
-<div class="line"><a name="l15211"></a><span class="lineno">15211</span>&#160;        allocCreateInfo.<a class="code" href="struct_vma_allocation_create_info.html#add09658ac14fe290ace25470ddd6d41b">flags</a>,</div>
-<div class="line"><a name="l15212"></a><span class="lineno">15212</span>&#160;        allocCreateInfo.<a class="code" href="struct_vma_allocation_create_info.html#accb8b06b1f677d858cb9af20705fa910">usage</a>,</div>
-<div class="line"><a name="l15213"></a><span class="lineno">15213</span>&#160;        allocCreateInfo.<a class="code" href="struct_vma_allocation_create_info.html#a9166390303ff42d783305bc31c2b6b90">requiredFlags</a>,</div>
-<div class="line"><a name="l15214"></a><span class="lineno">15214</span>&#160;        allocCreateInfo.<a class="code" href="struct_vma_allocation_create_info.html#a7fe8d81a1ad10b2a2faacacee5b15d6d">preferredFlags</a>,</div>
-<div class="line"><a name="l15215"></a><span class="lineno">15215</span>&#160;        allocCreateInfo.<a class="code" href="struct_vma_allocation_create_info.html#a3bf940c0271d85d6ba32a4d820075055">memoryTypeBits</a>,</div>
-<div class="line"><a name="l15216"></a><span class="lineno">15216</span>&#160;        allocCreateInfo.<a class="code" href="struct_vma_allocation_create_info.html#a6272c0555cfd1fe28bff1afeb6190150">pool</a>,</div>
-<div class="line"><a name="l15217"></a><span class="lineno">15217</span>&#160;        allocation,</div>
-<div class="line"><a name="l15218"></a><span class="lineno">15218</span>&#160;        userDataStr.GetString());</div>
-<div class="line"><a name="l15219"></a><span class="lineno">15219</span>&#160;    Flush();</div>
-<div class="line"><a name="l15220"></a><span class="lineno">15220</span>&#160;}</div>
-<div class="line"><a name="l15221"></a><span class="lineno">15221</span>&#160; </div>
-<div class="line"><a name="l15222"></a><span class="lineno">15222</span>&#160;<span class="keywordtype">void</span> VmaRecorder::RecordDestroyBuffer(uint32_t frameIndex,</div>
-<div class="line"><a name="l15223"></a><span class="lineno">15223</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation)</div>
-<div class="line"><a name="l15224"></a><span class="lineno">15224</span>&#160;{</div>
-<div class="line"><a name="l15225"></a><span class="lineno">15225</span>&#160;    CallParams callParams;</div>
-<div class="line"><a name="l15226"></a><span class="lineno">15226</span>&#160;    GetBasicParams(callParams);</div>
-<div class="line"><a name="l15227"></a><span class="lineno">15227</span>&#160; </div>
-<div class="line"><a name="l15228"></a><span class="lineno">15228</span>&#160;    VmaMutexLock lock(m_FileMutex, m_UseMutex);</div>
-<div class="line"><a name="l15229"></a><span class="lineno">15229</span>&#160;    fprintf(m_File, <span class="stringliteral">&quot;%u,%.3f,%u,vmaDestroyBuffer,%p\n&quot;</span>, callParams.threadId, callParams.time, frameIndex,</div>
-<div class="line"><a name="l15230"></a><span class="lineno">15230</span>&#160;        allocation);</div>
-<div class="line"><a name="l15231"></a><span class="lineno">15231</span>&#160;    Flush();</div>
-<div class="line"><a name="l15232"></a><span class="lineno">15232</span>&#160;}</div>
-<div class="line"><a name="l15233"></a><span class="lineno">15233</span>&#160; </div>
-<div class="line"><a name="l15234"></a><span class="lineno">15234</span>&#160;<span class="keywordtype">void</span> VmaRecorder::RecordDestroyImage(uint32_t frameIndex,</div>
-<div class="line"><a name="l15235"></a><span class="lineno">15235</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation)</div>
-<div class="line"><a name="l15236"></a><span class="lineno">15236</span>&#160;{</div>
-<div class="line"><a name="l15237"></a><span class="lineno">15237</span>&#160;    CallParams callParams;</div>
-<div class="line"><a name="l15238"></a><span class="lineno">15238</span>&#160;    GetBasicParams(callParams);</div>
-<div class="line"><a name="l15239"></a><span class="lineno">15239</span>&#160; </div>
-<div class="line"><a name="l15240"></a><span class="lineno">15240</span>&#160;    VmaMutexLock lock(m_FileMutex, m_UseMutex);</div>
-<div class="line"><a name="l15241"></a><span class="lineno">15241</span>&#160;    fprintf(m_File, <span class="stringliteral">&quot;%u,%.3f,%u,vmaDestroyImage,%p\n&quot;</span>, callParams.threadId, callParams.time, frameIndex,</div>
-<div class="line"><a name="l15242"></a><span class="lineno">15242</span>&#160;        allocation);</div>
-<div class="line"><a name="l15243"></a><span class="lineno">15243</span>&#160;    Flush();</div>
-<div class="line"><a name="l15244"></a><span class="lineno">15244</span>&#160;}</div>
-<div class="line"><a name="l15245"></a><span class="lineno">15245</span>&#160; </div>
-<div class="line"><a name="l15246"></a><span class="lineno">15246</span>&#160;<span class="keywordtype">void</span> VmaRecorder::RecordTouchAllocation(uint32_t frameIndex,</div>
-<div class="line"><a name="l15247"></a><span class="lineno">15247</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation)</div>
-<div class="line"><a name="l15248"></a><span class="lineno">15248</span>&#160;{</div>
-<div class="line"><a name="l15249"></a><span class="lineno">15249</span>&#160;    CallParams callParams;</div>
-<div class="line"><a name="l15250"></a><span class="lineno">15250</span>&#160;    GetBasicParams(callParams);</div>
-<div class="line"><a name="l15251"></a><span class="lineno">15251</span>&#160; </div>
-<div class="line"><a name="l15252"></a><span class="lineno">15252</span>&#160;    VmaMutexLock lock(m_FileMutex, m_UseMutex);</div>
-<div class="line"><a name="l15253"></a><span class="lineno">15253</span>&#160;    fprintf(m_File, <span class="stringliteral">&quot;%u,%.3f,%u,vmaTouchAllocation,%p\n&quot;</span>, callParams.threadId, callParams.time, frameIndex,</div>
-<div class="line"><a name="l15254"></a><span class="lineno">15254</span>&#160;        allocation);</div>
-<div class="line"><a name="l15255"></a><span class="lineno">15255</span>&#160;    Flush();</div>
-<div class="line"><a name="l15256"></a><span class="lineno">15256</span>&#160;}</div>
-<div class="line"><a name="l15257"></a><span class="lineno">15257</span>&#160; </div>
-<div class="line"><a name="l15258"></a><span class="lineno">15258</span>&#160;<span class="keywordtype">void</span> VmaRecorder::RecordGetAllocationInfo(uint32_t frameIndex,</div>
-<div class="line"><a name="l15259"></a><span class="lineno">15259</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation)</div>
-<div class="line"><a name="l15260"></a><span class="lineno">15260</span>&#160;{</div>
-<div class="line"><a name="l15261"></a><span class="lineno">15261</span>&#160;    CallParams callParams;</div>
-<div class="line"><a name="l15262"></a><span class="lineno">15262</span>&#160;    GetBasicParams(callParams);</div>
-<div class="line"><a name="l15263"></a><span class="lineno">15263</span>&#160; </div>
-<div class="line"><a name="l15264"></a><span class="lineno">15264</span>&#160;    VmaMutexLock lock(m_FileMutex, m_UseMutex);</div>
-<div class="line"><a name="l15265"></a><span class="lineno">15265</span>&#160;    fprintf(m_File, <span class="stringliteral">&quot;%u,%.3f,%u,vmaGetAllocationInfo,%p\n&quot;</span>, callParams.threadId, callParams.time, frameIndex,</div>
-<div class="line"><a name="l15266"></a><span class="lineno">15266</span>&#160;        allocation);</div>
-<div class="line"><a name="l15267"></a><span class="lineno">15267</span>&#160;    Flush();</div>
-<div class="line"><a name="l15268"></a><span class="lineno">15268</span>&#160;}</div>
+<div class="line"><a name="l15147"></a><span class="lineno">15147</span>&#160;            <span class="keywordflow">if</span>(pBlockVectorDefragCtx)</div>
+<div class="line"><a name="l15148"></a><span class="lineno">15148</span>&#160;            {</div>
+<div class="line"><a name="l15149"></a><span class="lineno">15149</span>&#160;                VkBool32* <span class="keyword">const</span> pChanged = (pAllocationsChanged != VMA_NULL) ?</div>
+<div class="line"><a name="l15150"></a><span class="lineno">15150</span>&#160;                    &amp;pAllocationsChanged[allocIndex] : VMA_NULL;</div>
+<div class="line"><a name="l15151"></a><span class="lineno">15151</span>&#160;                pBlockVectorDefragCtx-&gt;AddAllocation(hAlloc, pChanged);</div>
+<div class="line"><a name="l15152"></a><span class="lineno">15152</span>&#160;            }</div>
+<div class="line"><a name="l15153"></a><span class="lineno">15153</span>&#160;        }</div>
+<div class="line"><a name="l15154"></a><span class="lineno">15154</span>&#160;    }</div>
+<div class="line"><a name="l15155"></a><span class="lineno">15155</span>&#160;}</div>
+<div class="line"><a name="l15156"></a><span class="lineno">15156</span>&#160; </div>
+<div class="line"><a name="l15157"></a><span class="lineno">15157</span>&#160;VkResult VmaDefragmentationContext_T::Defragment(</div>
+<div class="line"><a name="l15158"></a><span class="lineno">15158</span>&#160;    VkDeviceSize maxCpuBytesToMove, uint32_t maxCpuAllocationsToMove,</div>
+<div class="line"><a name="l15159"></a><span class="lineno">15159</span>&#160;    VkDeviceSize maxGpuBytesToMove, uint32_t maxGpuAllocationsToMove,</div>
+<div class="line"><a name="l15160"></a><span class="lineno">15160</span>&#160;    VkCommandBuffer commandBuffer, <a class="code" href="struct_vma_defragmentation_stats.html">VmaDefragmentationStats</a>* pStats, <a class="code" href="vk__mem__alloc_8h.html#a88a77cef37e5d3c4fc9eb328885d048d">VmaDefragmentationFlags</a> flags)</div>
+<div class="line"><a name="l15161"></a><span class="lineno">15161</span>&#160;{</div>
+<div class="line"><a name="l15162"></a><span class="lineno">15162</span>&#160;    <span class="keywordflow">if</span>(pStats)</div>
+<div class="line"><a name="l15163"></a><span class="lineno">15163</span>&#160;    {</div>
+<div class="line"><a name="l15164"></a><span class="lineno">15164</span>&#160;        memset(pStats, 0, <span class="keyword">sizeof</span>(<a class="code" href="struct_vma_defragmentation_stats.html">VmaDefragmentationStats</a>));</div>
+<div class="line"><a name="l15165"></a><span class="lineno">15165</span>&#160;    }</div>
+<div class="line"><a name="l15166"></a><span class="lineno">15166</span>&#160; </div>
+<div class="line"><a name="l15167"></a><span class="lineno">15167</span>&#160;    <span class="keywordflow">if</span>(flags &amp; <a class="code" href="vk__mem__alloc_8h.html#a6552a65b71d16f378c6994b3ceaef50ca31af49446af2459284a568ce2f3fdd33">VMA_DEFRAGMENTATION_FLAG_INCREMENTAL</a>)</div>
+<div class="line"><a name="l15168"></a><span class="lineno">15168</span>&#160;    {</div>
+<div class="line"><a name="l15169"></a><span class="lineno">15169</span>&#160;        <span class="comment">// For incremental defragmetnations, we just earmark how much we can move</span></div>
+<div class="line"><a name="l15170"></a><span class="lineno">15170</span>&#160;        <span class="comment">// The real meat is in the defragmentation steps</span></div>
+<div class="line"><a name="l15171"></a><span class="lineno">15171</span>&#160;        m_MaxCpuBytesToMove = maxCpuBytesToMove;</div>
+<div class="line"><a name="l15172"></a><span class="lineno">15172</span>&#160;        m_MaxCpuAllocationsToMove = maxCpuAllocationsToMove;</div>
+<div class="line"><a name="l15173"></a><span class="lineno">15173</span>&#160; </div>
+<div class="line"><a name="l15174"></a><span class="lineno">15174</span>&#160;        m_MaxGpuBytesToMove = maxGpuBytesToMove;</div>
+<div class="line"><a name="l15175"></a><span class="lineno">15175</span>&#160;        m_MaxGpuAllocationsToMove = maxGpuAllocationsToMove;</div>
+<div class="line"><a name="l15176"></a><span class="lineno">15176</span>&#160; </div>
+<div class="line"><a name="l15177"></a><span class="lineno">15177</span>&#160;        <span class="keywordflow">if</span>(m_MaxCpuBytesToMove == 0 &amp;&amp; m_MaxCpuAllocationsToMove == 0 &amp;&amp;</div>
+<div class="line"><a name="l15178"></a><span class="lineno">15178</span>&#160;            m_MaxGpuBytesToMove == 0 &amp;&amp; m_MaxGpuAllocationsToMove == 0)</div>
+<div class="line"><a name="l15179"></a><span class="lineno">15179</span>&#160;            <span class="keywordflow">return</span> VK_SUCCESS;</div>
+<div class="line"><a name="l15180"></a><span class="lineno">15180</span>&#160; </div>
+<div class="line"><a name="l15181"></a><span class="lineno">15181</span>&#160;        <span class="keywordflow">return</span> VK_NOT_READY;</div>
+<div class="line"><a name="l15182"></a><span class="lineno">15182</span>&#160;    }</div>
+<div class="line"><a name="l15183"></a><span class="lineno">15183</span>&#160; </div>
+<div class="line"><a name="l15184"></a><span class="lineno">15184</span>&#160;    <span class="keywordflow">if</span>(commandBuffer == VK_NULL_HANDLE)</div>
+<div class="line"><a name="l15185"></a><span class="lineno">15185</span>&#160;    {</div>
+<div class="line"><a name="l15186"></a><span class="lineno">15186</span>&#160;        maxGpuBytesToMove = 0;</div>
+<div class="line"><a name="l15187"></a><span class="lineno">15187</span>&#160;        maxGpuAllocationsToMove = 0;</div>
+<div class="line"><a name="l15188"></a><span class="lineno">15188</span>&#160;    }</div>
+<div class="line"><a name="l15189"></a><span class="lineno">15189</span>&#160; </div>
+<div class="line"><a name="l15190"></a><span class="lineno">15190</span>&#160;    VkResult res = VK_SUCCESS;</div>
+<div class="line"><a name="l15191"></a><span class="lineno">15191</span>&#160; </div>
+<div class="line"><a name="l15192"></a><span class="lineno">15192</span>&#160;    <span class="comment">// Process default pools.</span></div>
+<div class="line"><a name="l15193"></a><span class="lineno">15193</span>&#160;    <span class="keywordflow">for</span>(uint32_t memTypeIndex = 0;</div>
+<div class="line"><a name="l15194"></a><span class="lineno">15194</span>&#160;        memTypeIndex &lt; m_hAllocator-&gt;GetMemoryTypeCount() &amp;&amp; res &gt;= VK_SUCCESS;</div>
+<div class="line"><a name="l15195"></a><span class="lineno">15195</span>&#160;        ++memTypeIndex)</div>
+<div class="line"><a name="l15196"></a><span class="lineno">15196</span>&#160;    {</div>
+<div class="line"><a name="l15197"></a><span class="lineno">15197</span>&#160;        VmaBlockVectorDefragmentationContext* pBlockVectorCtx = m_DefaultPoolContexts[memTypeIndex];</div>
+<div class="line"><a name="l15198"></a><span class="lineno">15198</span>&#160;        <span class="keywordflow">if</span>(pBlockVectorCtx)</div>
+<div class="line"><a name="l15199"></a><span class="lineno">15199</span>&#160;        {</div>
+<div class="line"><a name="l15200"></a><span class="lineno">15200</span>&#160;            VMA_ASSERT(pBlockVectorCtx-&gt;GetBlockVector());</div>
+<div class="line"><a name="l15201"></a><span class="lineno">15201</span>&#160;            pBlockVectorCtx-&gt;GetBlockVector()-&gt;Defragment(</div>
+<div class="line"><a name="l15202"></a><span class="lineno">15202</span>&#160;                pBlockVectorCtx,</div>
+<div class="line"><a name="l15203"></a><span class="lineno">15203</span>&#160;                pStats, flags,</div>
+<div class="line"><a name="l15204"></a><span class="lineno">15204</span>&#160;                maxCpuBytesToMove, maxCpuAllocationsToMove,</div>
+<div class="line"><a name="l15205"></a><span class="lineno">15205</span>&#160;                maxGpuBytesToMove, maxGpuAllocationsToMove,</div>
+<div class="line"><a name="l15206"></a><span class="lineno">15206</span>&#160;                commandBuffer);</div>
+<div class="line"><a name="l15207"></a><span class="lineno">15207</span>&#160;            <span class="keywordflow">if</span>(pBlockVectorCtx-&gt;res != VK_SUCCESS)</div>
+<div class="line"><a name="l15208"></a><span class="lineno">15208</span>&#160;            {</div>
+<div class="line"><a name="l15209"></a><span class="lineno">15209</span>&#160;                res = pBlockVectorCtx-&gt;res;</div>
+<div class="line"><a name="l15210"></a><span class="lineno">15210</span>&#160;            }</div>
+<div class="line"><a name="l15211"></a><span class="lineno">15211</span>&#160;        }</div>
+<div class="line"><a name="l15212"></a><span class="lineno">15212</span>&#160;    }</div>
+<div class="line"><a name="l15213"></a><span class="lineno">15213</span>&#160; </div>
+<div class="line"><a name="l15214"></a><span class="lineno">15214</span>&#160;    <span class="comment">// Process custom pools.</span></div>
+<div class="line"><a name="l15215"></a><span class="lineno">15215</span>&#160;    <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> customCtxIndex = 0, customCtxCount = m_CustomPoolContexts.size();</div>
+<div class="line"><a name="l15216"></a><span class="lineno">15216</span>&#160;        customCtxIndex &lt; customCtxCount &amp;&amp; res &gt;= VK_SUCCESS;</div>
+<div class="line"><a name="l15217"></a><span class="lineno">15217</span>&#160;        ++customCtxIndex)</div>
+<div class="line"><a name="l15218"></a><span class="lineno">15218</span>&#160;    {</div>
+<div class="line"><a name="l15219"></a><span class="lineno">15219</span>&#160;        VmaBlockVectorDefragmentationContext* pBlockVectorCtx = m_CustomPoolContexts[customCtxIndex];</div>
+<div class="line"><a name="l15220"></a><span class="lineno">15220</span>&#160;        VMA_ASSERT(pBlockVectorCtx &amp;&amp; pBlockVectorCtx-&gt;GetBlockVector());</div>
+<div class="line"><a name="l15221"></a><span class="lineno">15221</span>&#160;        pBlockVectorCtx-&gt;GetBlockVector()-&gt;Defragment(</div>
+<div class="line"><a name="l15222"></a><span class="lineno">15222</span>&#160;            pBlockVectorCtx,</div>
+<div class="line"><a name="l15223"></a><span class="lineno">15223</span>&#160;            pStats, flags,</div>
+<div class="line"><a name="l15224"></a><span class="lineno">15224</span>&#160;            maxCpuBytesToMove, maxCpuAllocationsToMove,</div>
+<div class="line"><a name="l15225"></a><span class="lineno">15225</span>&#160;            maxGpuBytesToMove, maxGpuAllocationsToMove,</div>
+<div class="line"><a name="l15226"></a><span class="lineno">15226</span>&#160;            commandBuffer);</div>
+<div class="line"><a name="l15227"></a><span class="lineno">15227</span>&#160;        <span class="keywordflow">if</span>(pBlockVectorCtx-&gt;res != VK_SUCCESS)</div>
+<div class="line"><a name="l15228"></a><span class="lineno">15228</span>&#160;        {</div>
+<div class="line"><a name="l15229"></a><span class="lineno">15229</span>&#160;            res = pBlockVectorCtx-&gt;res;</div>
+<div class="line"><a name="l15230"></a><span class="lineno">15230</span>&#160;        }</div>
+<div class="line"><a name="l15231"></a><span class="lineno">15231</span>&#160;    }</div>
+<div class="line"><a name="l15232"></a><span class="lineno">15232</span>&#160; </div>
+<div class="line"><a name="l15233"></a><span class="lineno">15233</span>&#160;    <span class="keywordflow">return</span> res;</div>
+<div class="line"><a name="l15234"></a><span class="lineno">15234</span>&#160;}</div>
+<div class="line"><a name="l15235"></a><span class="lineno">15235</span>&#160; </div>
+<div class="line"><a name="l15236"></a><span class="lineno">15236</span>&#160;VkResult VmaDefragmentationContext_T::DefragmentPassBegin(<a class="code" href="struct_vma_defragmentation_pass_info.html">VmaDefragmentationPassInfo</a>* pInfo)</div>
+<div class="line"><a name="l15237"></a><span class="lineno">15237</span>&#160;{</div>
+<div class="line"><a name="l15238"></a><span class="lineno">15238</span>&#160;    <a class="code" href="struct_vma_defragmentation_pass_move_info.html">VmaDefragmentationPassMoveInfo</a>* pCurrentMove = pInfo-&gt;<a class="code" href="struct_vma_defragmentation_pass_info.html#acbd42d4a3357999da130a95cd99a3792">pMoves</a>;</div>
+<div class="line"><a name="l15239"></a><span class="lineno">15239</span>&#160;    uint32_t movesLeft = pInfo-&gt;<a class="code" href="struct_vma_defragmentation_pass_info.html#ac1086e657ba995f8d1f4e49b83dcfb6c">moveCount</a>;</div>
+<div class="line"><a name="l15240"></a><span class="lineno">15240</span>&#160; </div>
+<div class="line"><a name="l15241"></a><span class="lineno">15241</span>&#160;    <span class="comment">// Process default pools.</span></div>
+<div class="line"><a name="l15242"></a><span class="lineno">15242</span>&#160;    <span class="keywordflow">for</span>(uint32_t memTypeIndex = 0;</div>
+<div class="line"><a name="l15243"></a><span class="lineno">15243</span>&#160;        memTypeIndex &lt; m_hAllocator-&gt;GetMemoryTypeCount();</div>
+<div class="line"><a name="l15244"></a><span class="lineno">15244</span>&#160;        ++memTypeIndex)</div>
+<div class="line"><a name="l15245"></a><span class="lineno">15245</span>&#160;    {</div>
+<div class="line"><a name="l15246"></a><span class="lineno">15246</span>&#160;        VmaBlockVectorDefragmentationContext *pBlockVectorCtx = m_DefaultPoolContexts[memTypeIndex];</div>
+<div class="line"><a name="l15247"></a><span class="lineno">15247</span>&#160;        <span class="keywordflow">if</span>(pBlockVectorCtx)</div>
+<div class="line"><a name="l15248"></a><span class="lineno">15248</span>&#160;        {</div>
+<div class="line"><a name="l15249"></a><span class="lineno">15249</span>&#160;            VMA_ASSERT(pBlockVectorCtx-&gt;GetBlockVector());</div>
+<div class="line"><a name="l15250"></a><span class="lineno">15250</span>&#160; </div>
+<div class="line"><a name="l15251"></a><span class="lineno">15251</span>&#160;            <span class="keywordflow">if</span>(!pBlockVectorCtx-&gt;hasDefragmentationPlan)</div>
+<div class="line"><a name="l15252"></a><span class="lineno">15252</span>&#160;            {</div>
+<div class="line"><a name="l15253"></a><span class="lineno">15253</span>&#160;                pBlockVectorCtx-&gt;GetBlockVector()-&gt;Defragment(</div>
+<div class="line"><a name="l15254"></a><span class="lineno">15254</span>&#160;                    pBlockVectorCtx,</div>
+<div class="line"><a name="l15255"></a><span class="lineno">15255</span>&#160;                    m_pStats, m_Flags,</div>
+<div class="line"><a name="l15256"></a><span class="lineno">15256</span>&#160;                    m_MaxCpuBytesToMove, m_MaxCpuAllocationsToMove,</div>
+<div class="line"><a name="l15257"></a><span class="lineno">15257</span>&#160;                    m_MaxGpuBytesToMove, m_MaxGpuAllocationsToMove,</div>
+<div class="line"><a name="l15258"></a><span class="lineno">15258</span>&#160;                    VK_NULL_HANDLE);</div>
+<div class="line"><a name="l15259"></a><span class="lineno">15259</span>&#160; </div>
+<div class="line"><a name="l15260"></a><span class="lineno">15260</span>&#160;                <span class="keywordflow">if</span>(pBlockVectorCtx-&gt;res &lt; VK_SUCCESS)</div>
+<div class="line"><a name="l15261"></a><span class="lineno">15261</span>&#160;                    <span class="keywordflow">continue</span>;</div>
+<div class="line"><a name="l15262"></a><span class="lineno">15262</span>&#160; </div>
+<div class="line"><a name="l15263"></a><span class="lineno">15263</span>&#160;                pBlockVectorCtx-&gt;hasDefragmentationPlan = <span class="keyword">true</span>;</div>
+<div class="line"><a name="l15264"></a><span class="lineno">15264</span>&#160;            }</div>
+<div class="line"><a name="l15265"></a><span class="lineno">15265</span>&#160; </div>
+<div class="line"><a name="l15266"></a><span class="lineno">15266</span>&#160;            <span class="keyword">const</span> uint32_t processed = pBlockVectorCtx-&gt;GetBlockVector()-&gt;ProcessDefragmentations(</div>
+<div class="line"><a name="l15267"></a><span class="lineno">15267</span>&#160;                pBlockVectorCtx,</div>
+<div class="line"><a name="l15268"></a><span class="lineno">15268</span>&#160;                pCurrentMove, movesLeft);</div>
 <div class="line"><a name="l15269"></a><span class="lineno">15269</span>&#160; </div>
-<div class="line"><a name="l15270"></a><span class="lineno">15270</span>&#160;<span class="keywordtype">void</span> VmaRecorder::RecordMakePoolAllocationsLost(uint32_t frameIndex,</div>
-<div class="line"><a name="l15271"></a><span class="lineno">15271</span>&#160;    <a class="code" href="struct_vma_pool.html">VmaPool</a> pool)</div>
-<div class="line"><a name="l15272"></a><span class="lineno">15272</span>&#160;{</div>
-<div class="line"><a name="l15273"></a><span class="lineno">15273</span>&#160;    CallParams callParams;</div>
-<div class="line"><a name="l15274"></a><span class="lineno">15274</span>&#160;    GetBasicParams(callParams);</div>
-<div class="line"><a name="l15275"></a><span class="lineno">15275</span>&#160; </div>
-<div class="line"><a name="l15276"></a><span class="lineno">15276</span>&#160;    VmaMutexLock lock(m_FileMutex, m_UseMutex);</div>
-<div class="line"><a name="l15277"></a><span class="lineno">15277</span>&#160;    fprintf(m_File, <span class="stringliteral">&quot;%u,%.3f,%u,vmaMakePoolAllocationsLost,%p\n&quot;</span>, callParams.threadId, callParams.time, frameIndex,</div>
-<div class="line"><a name="l15278"></a><span class="lineno">15278</span>&#160;        pool);</div>
-<div class="line"><a name="l15279"></a><span class="lineno">15279</span>&#160;    Flush();</div>
-<div class="line"><a name="l15280"></a><span class="lineno">15280</span>&#160;}</div>
-<div class="line"><a name="l15281"></a><span class="lineno">15281</span>&#160; </div>
-<div class="line"><a name="l15282"></a><span class="lineno">15282</span>&#160;<span class="keywordtype">void</span> VmaRecorder::RecordDefragmentationBegin(uint32_t frameIndex,</div>
-<div class="line"><a name="l15283"></a><span class="lineno">15283</span>&#160;    <span class="keyword">const</span> <a class="code" href="struct_vma_defragmentation_info2.html">VmaDefragmentationInfo2</a>&amp; info,</div>
-<div class="line"><a name="l15284"></a><span class="lineno">15284</span>&#160;    <a class="code" href="struct_vma_defragmentation_context.html">VmaDefragmentationContext</a> ctx)</div>
-<div class="line"><a name="l15285"></a><span class="lineno">15285</span>&#160;{</div>
-<div class="line"><a name="l15286"></a><span class="lineno">15286</span>&#160;    CallParams callParams;</div>
-<div class="line"><a name="l15287"></a><span class="lineno">15287</span>&#160;    GetBasicParams(callParams);</div>
-<div class="line"><a name="l15288"></a><span class="lineno">15288</span>&#160; </div>
-<div class="line"><a name="l15289"></a><span class="lineno">15289</span>&#160;    VmaMutexLock lock(m_FileMutex, m_UseMutex);</div>
-<div class="line"><a name="l15290"></a><span class="lineno">15290</span>&#160;    fprintf(m_File, <span class="stringliteral">&quot;%u,%.3f,%u,vmaDefragmentationBegin,%u,&quot;</span>, callParams.threadId, callParams.time, frameIndex,</div>
-<div class="line"><a name="l15291"></a><span class="lineno">15291</span>&#160;        info.<a class="code" href="struct_vma_defragmentation_info2.html#a53e844ee5633e229cf6daf14b2d9fff9">flags</a>);</div>
-<div class="line"><a name="l15292"></a><span class="lineno">15292</span>&#160;    PrintPointerList(info.<a class="code" href="struct_vma_defragmentation_info2.html#a3cf86ab32c1da779b4923d301a3056ba">allocationCount</a>, info.<a class="code" href="struct_vma_defragmentation_info2.html#ab6d288f29d028156cf73542d630a2e32">pAllocations</a>);</div>
-<div class="line"><a name="l15293"></a><span class="lineno">15293</span>&#160;    fprintf(m_File, <span class="stringliteral">&quot;,&quot;</span>);</div>
-<div class="line"><a name="l15294"></a><span class="lineno">15294</span>&#160;    PrintPointerList(info.<a class="code" href="struct_vma_defragmentation_info2.html#a7e70aa2a1081d849dcc7829b19d3ec9d">poolCount</a>, info.<a class="code" href="struct_vma_defragmentation_info2.html#a3c9c6aa5c97d5670f8e362b3a6f3029b">pPools</a>);</div>
-<div class="line"><a name="l15295"></a><span class="lineno">15295</span>&#160;    fprintf(m_File, <span class="stringliteral">&quot;,%llu,%u,%llu,%u,%p,%p\n&quot;</span>,</div>
-<div class="line"><a name="l15296"></a><span class="lineno">15296</span>&#160;        info.<a class="code" href="struct_vma_defragmentation_info2.html#af78e1ea40c22d85137b65f6b384a4d0a">maxCpuBytesToMove</a>,</div>
-<div class="line"><a name="l15297"></a><span class="lineno">15297</span>&#160;        info.<a class="code" href="struct_vma_defragmentation_info2.html#a94c2c7223d52878445a8cccce396b671">maxCpuAllocationsToMove</a>,</div>
-<div class="line"><a name="l15298"></a><span class="lineno">15298</span>&#160;        info.<a class="code" href="struct_vma_defragmentation_info2.html#a4ddbc898d0afe1518f863a3763628f08">maxGpuBytesToMove</a>,</div>
-<div class="line"><a name="l15299"></a><span class="lineno">15299</span>&#160;        info.<a class="code" href="struct_vma_defragmentation_info2.html#a40d53d33e71ba0b66f844ed63c05a3f6">maxGpuAllocationsToMove</a>,</div>
-<div class="line"><a name="l15300"></a><span class="lineno">15300</span>&#160;        info.<a class="code" href="struct_vma_defragmentation_info2.html#a7f71f39590c5316771493d2333f9c1bd">commandBuffer</a>,</div>
-<div class="line"><a name="l15301"></a><span class="lineno">15301</span>&#160;        ctx);</div>
-<div class="line"><a name="l15302"></a><span class="lineno">15302</span>&#160;    Flush();</div>
-<div class="line"><a name="l15303"></a><span class="lineno">15303</span>&#160;}</div>
-<div class="line"><a name="l15304"></a><span class="lineno">15304</span>&#160; </div>
-<div class="line"><a name="l15305"></a><span class="lineno">15305</span>&#160;<span class="keywordtype">void</span> VmaRecorder::RecordDefragmentationEnd(uint32_t frameIndex,</div>
-<div class="line"><a name="l15306"></a><span class="lineno">15306</span>&#160;    <a class="code" href="struct_vma_defragmentation_context.html">VmaDefragmentationContext</a> ctx)</div>
-<div class="line"><a name="l15307"></a><span class="lineno">15307</span>&#160;{</div>
-<div class="line"><a name="l15308"></a><span class="lineno">15308</span>&#160;    CallParams callParams;</div>
-<div class="line"><a name="l15309"></a><span class="lineno">15309</span>&#160;    GetBasicParams(callParams);</div>
-<div class="line"><a name="l15310"></a><span class="lineno">15310</span>&#160; </div>
-<div class="line"><a name="l15311"></a><span class="lineno">15311</span>&#160;    VmaMutexLock lock(m_FileMutex, m_UseMutex);</div>
-<div class="line"><a name="l15312"></a><span class="lineno">15312</span>&#160;    fprintf(m_File, <span class="stringliteral">&quot;%u,%.3f,%u,vmaDefragmentationEnd,%p\n&quot;</span>, callParams.threadId, callParams.time, frameIndex,</div>
-<div class="line"><a name="l15313"></a><span class="lineno">15313</span>&#160;        ctx);</div>
-<div class="line"><a name="l15314"></a><span class="lineno">15314</span>&#160;    Flush();</div>
-<div class="line"><a name="l15315"></a><span class="lineno">15315</span>&#160;}</div>
-<div class="line"><a name="l15316"></a><span class="lineno">15316</span>&#160; </div>
-<div class="line"><a name="l15317"></a><span class="lineno">15317</span>&#160;<span class="keywordtype">void</span> VmaRecorder::RecordSetPoolName(uint32_t frameIndex,</div>
-<div class="line"><a name="l15318"></a><span class="lineno">15318</span>&#160;    <a class="code" href="struct_vma_pool.html">VmaPool</a> pool,</div>
-<div class="line"><a name="l15319"></a><span class="lineno">15319</span>&#160;    <span class="keyword">const</span> <span class="keywordtype">char</span>* name)</div>
-<div class="line"><a name="l15320"></a><span class="lineno">15320</span>&#160;{</div>
-<div class="line"><a name="l15321"></a><span class="lineno">15321</span>&#160;    CallParams callParams;</div>
-<div class="line"><a name="l15322"></a><span class="lineno">15322</span>&#160;    GetBasicParams(callParams);</div>
+<div class="line"><a name="l15270"></a><span class="lineno">15270</span>&#160;            movesLeft -= processed;</div>
+<div class="line"><a name="l15271"></a><span class="lineno">15271</span>&#160;            pCurrentMove += processed;</div>
+<div class="line"><a name="l15272"></a><span class="lineno">15272</span>&#160;        }</div>
+<div class="line"><a name="l15273"></a><span class="lineno">15273</span>&#160;    }</div>
+<div class="line"><a name="l15274"></a><span class="lineno">15274</span>&#160; </div>
+<div class="line"><a name="l15275"></a><span class="lineno">15275</span>&#160;    <span class="comment">// Process custom pools.</span></div>
+<div class="line"><a name="l15276"></a><span class="lineno">15276</span>&#160;    <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> customCtxIndex = 0, customCtxCount = m_CustomPoolContexts.size();</div>
+<div class="line"><a name="l15277"></a><span class="lineno">15277</span>&#160;        customCtxIndex &lt; customCtxCount;</div>
+<div class="line"><a name="l15278"></a><span class="lineno">15278</span>&#160;        ++customCtxIndex)</div>
+<div class="line"><a name="l15279"></a><span class="lineno">15279</span>&#160;    {</div>
+<div class="line"><a name="l15280"></a><span class="lineno">15280</span>&#160;        VmaBlockVectorDefragmentationContext *pBlockVectorCtx = m_CustomPoolContexts[customCtxIndex];</div>
+<div class="line"><a name="l15281"></a><span class="lineno">15281</span>&#160;        VMA_ASSERT(pBlockVectorCtx &amp;&amp; pBlockVectorCtx-&gt;GetBlockVector());</div>
+<div class="line"><a name="l15282"></a><span class="lineno">15282</span>&#160; </div>
+<div class="line"><a name="l15283"></a><span class="lineno">15283</span>&#160;        <span class="keywordflow">if</span>(!pBlockVectorCtx-&gt;hasDefragmentationPlan)</div>
+<div class="line"><a name="l15284"></a><span class="lineno">15284</span>&#160;        {</div>
+<div class="line"><a name="l15285"></a><span class="lineno">15285</span>&#160;            pBlockVectorCtx-&gt;GetBlockVector()-&gt;Defragment(</div>
+<div class="line"><a name="l15286"></a><span class="lineno">15286</span>&#160;                pBlockVectorCtx,</div>
+<div class="line"><a name="l15287"></a><span class="lineno">15287</span>&#160;                m_pStats, m_Flags,</div>
+<div class="line"><a name="l15288"></a><span class="lineno">15288</span>&#160;                m_MaxCpuBytesToMove, m_MaxCpuAllocationsToMove,</div>
+<div class="line"><a name="l15289"></a><span class="lineno">15289</span>&#160;                m_MaxGpuBytesToMove, m_MaxGpuAllocationsToMove,</div>
+<div class="line"><a name="l15290"></a><span class="lineno">15290</span>&#160;                VK_NULL_HANDLE);</div>
+<div class="line"><a name="l15291"></a><span class="lineno">15291</span>&#160; </div>
+<div class="line"><a name="l15292"></a><span class="lineno">15292</span>&#160;            <span class="keywordflow">if</span>(pBlockVectorCtx-&gt;res &lt; VK_SUCCESS)</div>
+<div class="line"><a name="l15293"></a><span class="lineno">15293</span>&#160;                <span class="keywordflow">continue</span>;</div>
+<div class="line"><a name="l15294"></a><span class="lineno">15294</span>&#160; </div>
+<div class="line"><a name="l15295"></a><span class="lineno">15295</span>&#160;            pBlockVectorCtx-&gt;hasDefragmentationPlan = <span class="keyword">true</span>;</div>
+<div class="line"><a name="l15296"></a><span class="lineno">15296</span>&#160;        }</div>
+<div class="line"><a name="l15297"></a><span class="lineno">15297</span>&#160; </div>
+<div class="line"><a name="l15298"></a><span class="lineno">15298</span>&#160;        <span class="keyword">const</span> uint32_t processed = pBlockVectorCtx-&gt;GetBlockVector()-&gt;ProcessDefragmentations(</div>
+<div class="line"><a name="l15299"></a><span class="lineno">15299</span>&#160;            pBlockVectorCtx,</div>
+<div class="line"><a name="l15300"></a><span class="lineno">15300</span>&#160;            pCurrentMove, movesLeft);</div>
+<div class="line"><a name="l15301"></a><span class="lineno">15301</span>&#160; </div>
+<div class="line"><a name="l15302"></a><span class="lineno">15302</span>&#160;        movesLeft -= processed;</div>
+<div class="line"><a name="l15303"></a><span class="lineno">15303</span>&#160;        pCurrentMove += processed;</div>
+<div class="line"><a name="l15304"></a><span class="lineno">15304</span>&#160;    }</div>
+<div class="line"><a name="l15305"></a><span class="lineno">15305</span>&#160; </div>
+<div class="line"><a name="l15306"></a><span class="lineno">15306</span>&#160;    pInfo-&gt;<a class="code" href="struct_vma_defragmentation_pass_info.html#ac1086e657ba995f8d1f4e49b83dcfb6c">moveCount</a> = pInfo-&gt;<a class="code" href="struct_vma_defragmentation_pass_info.html#ac1086e657ba995f8d1f4e49b83dcfb6c">moveCount</a> - movesLeft;</div>
+<div class="line"><a name="l15307"></a><span class="lineno">15307</span>&#160; </div>
+<div class="line"><a name="l15308"></a><span class="lineno">15308</span>&#160;    <span class="keywordflow">return</span> VK_SUCCESS;</div>
+<div class="line"><a name="l15309"></a><span class="lineno">15309</span>&#160;}</div>
+<div class="line"><a name="l15310"></a><span class="lineno">15310</span>&#160;VkResult VmaDefragmentationContext_T::DefragmentPassEnd()</div>
+<div class="line"><a name="l15311"></a><span class="lineno">15311</span>&#160;{</div>
+<div class="line"><a name="l15312"></a><span class="lineno">15312</span>&#160;    VkResult res = VK_SUCCESS;</div>
+<div class="line"><a name="l15313"></a><span class="lineno">15313</span>&#160; </div>
+<div class="line"><a name="l15314"></a><span class="lineno">15314</span>&#160;    <span class="comment">// Process default pools.</span></div>
+<div class="line"><a name="l15315"></a><span class="lineno">15315</span>&#160;    <span class="keywordflow">for</span>(uint32_t memTypeIndex = 0;</div>
+<div class="line"><a name="l15316"></a><span class="lineno">15316</span>&#160;        memTypeIndex &lt; m_hAllocator-&gt;GetMemoryTypeCount();</div>
+<div class="line"><a name="l15317"></a><span class="lineno">15317</span>&#160;        ++memTypeIndex)</div>
+<div class="line"><a name="l15318"></a><span class="lineno">15318</span>&#160;    {</div>
+<div class="line"><a name="l15319"></a><span class="lineno">15319</span>&#160;        VmaBlockVectorDefragmentationContext *pBlockVectorCtx = m_DefaultPoolContexts[memTypeIndex];</div>
+<div class="line"><a name="l15320"></a><span class="lineno">15320</span>&#160;        <span class="keywordflow">if</span>(pBlockVectorCtx)</div>
+<div class="line"><a name="l15321"></a><span class="lineno">15321</span>&#160;        {</div>
+<div class="line"><a name="l15322"></a><span class="lineno">15322</span>&#160;            VMA_ASSERT(pBlockVectorCtx-&gt;GetBlockVector());</div>
 <div class="line"><a name="l15323"></a><span class="lineno">15323</span>&#160; </div>
-<div class="line"><a name="l15324"></a><span class="lineno">15324</span>&#160;    VmaMutexLock lock(m_FileMutex, m_UseMutex);</div>
-<div class="line"><a name="l15325"></a><span class="lineno">15325</span>&#160;    fprintf(m_File, <span class="stringliteral">&quot;%u,%.3f,%u,vmaSetPoolName,%p,%s\n&quot;</span>, callParams.threadId, callParams.time, frameIndex,</div>
-<div class="line"><a name="l15326"></a><span class="lineno">15326</span>&#160;        pool, name != VMA_NULL ? name : <span class="stringliteral">&quot;&quot;</span>);</div>
-<div class="line"><a name="l15327"></a><span class="lineno">15327</span>&#160;    Flush();</div>
-<div class="line"><a name="l15328"></a><span class="lineno">15328</span>&#160;}</div>
+<div class="line"><a name="l15324"></a><span class="lineno">15324</span>&#160;            <span class="keywordflow">if</span>(!pBlockVectorCtx-&gt;hasDefragmentationPlan)</div>
+<div class="line"><a name="l15325"></a><span class="lineno">15325</span>&#160;            {</div>
+<div class="line"><a name="l15326"></a><span class="lineno">15326</span>&#160;                res = VK_NOT_READY;</div>
+<div class="line"><a name="l15327"></a><span class="lineno">15327</span>&#160;                <span class="keywordflow">continue</span>;</div>
+<div class="line"><a name="l15328"></a><span class="lineno">15328</span>&#160;            }</div>
 <div class="line"><a name="l15329"></a><span class="lineno">15329</span>&#160; </div>
-<div class="line"><a name="l15330"></a><span class="lineno">15330</span>&#160;VmaRecorder::UserDataString::UserDataString(<a class="code" href="vk__mem__alloc_8h.html#a5225e5e11f8376f6a31a1791f3d6e817">VmaAllocationCreateFlags</a> allocFlags, <span class="keyword">const</span> <span class="keywordtype">void</span>* pUserData)</div>
-<div class="line"><a name="l15331"></a><span class="lineno">15331</span>&#160;{</div>
-<div class="line"><a name="l15332"></a><span class="lineno">15332</span>&#160;    <span class="keywordflow">if</span>(pUserData != VMA_NULL)</div>
-<div class="line"><a name="l15333"></a><span class="lineno">15333</span>&#160;    {</div>
-<div class="line"><a name="l15334"></a><span class="lineno">15334</span>&#160;        <span class="keywordflow">if</span>((allocFlags &amp; <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597aa6f24f821cd6a7c5e4a443f7bf59c520">VMA_ALLOCATION_CREATE_USER_DATA_COPY_STRING_BIT</a>) != 0)</div>
-<div class="line"><a name="l15335"></a><span class="lineno">15335</span>&#160;        {</div>
-<div class="line"><a name="l15336"></a><span class="lineno">15336</span>&#160;            m_Str = (<span class="keyword">const</span> <span class="keywordtype">char</span>*)pUserData;</div>
-<div class="line"><a name="l15337"></a><span class="lineno">15337</span>&#160;        }</div>
-<div class="line"><a name="l15338"></a><span class="lineno">15338</span>&#160;        <span class="keywordflow">else</span></div>
-<div class="line"><a name="l15339"></a><span class="lineno">15339</span>&#160;        {</div>
-<div class="line"><a name="l15340"></a><span class="lineno">15340</span>&#160;            <span class="comment">// If VMA_ALLOCATION_CREATE_USER_DATA_COPY_STRING_BIT is not specified, convert the string&#39;s memory address to a string and store it.</span></div>
-<div class="line"><a name="l15341"></a><span class="lineno">15341</span>&#160;            snprintf(m_PtrStr, 17, <span class="stringliteral">&quot;%p&quot;</span>, pUserData);</div>
-<div class="line"><a name="l15342"></a><span class="lineno">15342</span>&#160;            m_Str = m_PtrStr;</div>
-<div class="line"><a name="l15343"></a><span class="lineno">15343</span>&#160;        }</div>
-<div class="line"><a name="l15344"></a><span class="lineno">15344</span>&#160;    }</div>
-<div class="line"><a name="l15345"></a><span class="lineno">15345</span>&#160;    <span class="keywordflow">else</span></div>
-<div class="line"><a name="l15346"></a><span class="lineno">15346</span>&#160;    {</div>
-<div class="line"><a name="l15347"></a><span class="lineno">15347</span>&#160;        m_Str = <span class="stringliteral">&quot;&quot;</span>;</div>
-<div class="line"><a name="l15348"></a><span class="lineno">15348</span>&#160;    }</div>
-<div class="line"><a name="l15349"></a><span class="lineno">15349</span>&#160;}</div>
-<div class="line"><a name="l15350"></a><span class="lineno">15350</span>&#160; </div>
-<div class="line"><a name="l15351"></a><span class="lineno">15351</span>&#160;<span class="keywordtype">void</span> VmaRecorder::WriteConfiguration(</div>
-<div class="line"><a name="l15352"></a><span class="lineno">15352</span>&#160;    <span class="keyword">const</span> VkPhysicalDeviceProperties&amp; devProps,</div>
-<div class="line"><a name="l15353"></a><span class="lineno">15353</span>&#160;    <span class="keyword">const</span> VkPhysicalDeviceMemoryProperties&amp; memProps,</div>
-<div class="line"><a name="l15354"></a><span class="lineno">15354</span>&#160;    uint32_t vulkanApiVersion,</div>
-<div class="line"><a name="l15355"></a><span class="lineno">15355</span>&#160;    <span class="keywordtype">bool</span> dedicatedAllocationExtensionEnabled,</div>
-<div class="line"><a name="l15356"></a><span class="lineno">15356</span>&#160;    <span class="keywordtype">bool</span> bindMemory2ExtensionEnabled,</div>
-<div class="line"><a name="l15357"></a><span class="lineno">15357</span>&#160;    <span class="keywordtype">bool</span> memoryBudgetExtensionEnabled,</div>
-<div class="line"><a name="l15358"></a><span class="lineno">15358</span>&#160;    <span class="keywordtype">bool</span> deviceCoherentMemoryExtensionEnabled)</div>
-<div class="line"><a name="l15359"></a><span class="lineno">15359</span>&#160;{</div>
-<div class="line"><a name="l15360"></a><span class="lineno">15360</span>&#160;    fprintf(m_File, <span class="stringliteral">&quot;Config,Begin\n&quot;</span>);</div>
+<div class="line"><a name="l15330"></a><span class="lineno">15330</span>&#160;            pBlockVectorCtx-&gt;GetBlockVector()-&gt;CommitDefragmentations(</div>
+<div class="line"><a name="l15331"></a><span class="lineno">15331</span>&#160;                pBlockVectorCtx, m_pStats);</div>
+<div class="line"><a name="l15332"></a><span class="lineno">15332</span>&#160; </div>
+<div class="line"><a name="l15333"></a><span class="lineno">15333</span>&#160;            <span class="keywordflow">if</span>(pBlockVectorCtx-&gt;defragmentationMoves.size() != pBlockVectorCtx-&gt;defragmentationMovesCommitted)</div>
+<div class="line"><a name="l15334"></a><span class="lineno">15334</span>&#160;                res = VK_NOT_READY;</div>
+<div class="line"><a name="l15335"></a><span class="lineno">15335</span>&#160;        }</div>
+<div class="line"><a name="l15336"></a><span class="lineno">15336</span>&#160;    }</div>
+<div class="line"><a name="l15337"></a><span class="lineno">15337</span>&#160; </div>
+<div class="line"><a name="l15338"></a><span class="lineno">15338</span>&#160;    <span class="comment">// Process custom pools.</span></div>
+<div class="line"><a name="l15339"></a><span class="lineno">15339</span>&#160;    <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> customCtxIndex = 0, customCtxCount = m_CustomPoolContexts.size();</div>
+<div class="line"><a name="l15340"></a><span class="lineno">15340</span>&#160;        customCtxIndex &lt; customCtxCount;</div>
+<div class="line"><a name="l15341"></a><span class="lineno">15341</span>&#160;        ++customCtxIndex)</div>
+<div class="line"><a name="l15342"></a><span class="lineno">15342</span>&#160;    {</div>
+<div class="line"><a name="l15343"></a><span class="lineno">15343</span>&#160;        VmaBlockVectorDefragmentationContext *pBlockVectorCtx = m_CustomPoolContexts[customCtxIndex];</div>
+<div class="line"><a name="l15344"></a><span class="lineno">15344</span>&#160;        VMA_ASSERT(pBlockVectorCtx &amp;&amp; pBlockVectorCtx-&gt;GetBlockVector());</div>
+<div class="line"><a name="l15345"></a><span class="lineno">15345</span>&#160; </div>
+<div class="line"><a name="l15346"></a><span class="lineno">15346</span>&#160;        <span class="keywordflow">if</span>(!pBlockVectorCtx-&gt;hasDefragmentationPlan)</div>
+<div class="line"><a name="l15347"></a><span class="lineno">15347</span>&#160;        {</div>
+<div class="line"><a name="l15348"></a><span class="lineno">15348</span>&#160;            res = VK_NOT_READY;</div>
+<div class="line"><a name="l15349"></a><span class="lineno">15349</span>&#160;            <span class="keywordflow">continue</span>;</div>
+<div class="line"><a name="l15350"></a><span class="lineno">15350</span>&#160;        }</div>
+<div class="line"><a name="l15351"></a><span class="lineno">15351</span>&#160; </div>
+<div class="line"><a name="l15352"></a><span class="lineno">15352</span>&#160;        pBlockVectorCtx-&gt;GetBlockVector()-&gt;CommitDefragmentations(</div>
+<div class="line"><a name="l15353"></a><span class="lineno">15353</span>&#160;            pBlockVectorCtx, m_pStats);</div>
+<div class="line"><a name="l15354"></a><span class="lineno">15354</span>&#160; </div>
+<div class="line"><a name="l15355"></a><span class="lineno">15355</span>&#160;        <span class="keywordflow">if</span>(pBlockVectorCtx-&gt;defragmentationMoves.size() != pBlockVectorCtx-&gt;defragmentationMovesCommitted)</div>
+<div class="line"><a name="l15356"></a><span class="lineno">15356</span>&#160;            res = VK_NOT_READY;</div>
+<div class="line"><a name="l15357"></a><span class="lineno">15357</span>&#160;    }</div>
+<div class="line"><a name="l15358"></a><span class="lineno">15358</span>&#160; </div>
+<div class="line"><a name="l15359"></a><span class="lineno">15359</span>&#160;    <span class="keywordflow">return</span> res;</div>
+<div class="line"><a name="l15360"></a><span class="lineno">15360</span>&#160;}</div>
 <div class="line"><a name="l15361"></a><span class="lineno">15361</span>&#160; </div>
-<div class="line"><a name="l15362"></a><span class="lineno">15362</span>&#160;    fprintf(m_File, <span class="stringliteral">&quot;VulkanApiVersion,%u,%u\n&quot;</span>, VK_VERSION_MAJOR(vulkanApiVersion), VK_VERSION_MINOR(vulkanApiVersion));</div>
-<div class="line"><a name="l15363"></a><span class="lineno">15363</span>&#160; </div>
-<div class="line"><a name="l15364"></a><span class="lineno">15364</span>&#160;    fprintf(m_File, <span class="stringliteral">&quot;PhysicalDevice,apiVersion,%u\n&quot;</span>, devProps.apiVersion);</div>
-<div class="line"><a name="l15365"></a><span class="lineno">15365</span>&#160;    fprintf(m_File, <span class="stringliteral">&quot;PhysicalDevice,driverVersion,%u\n&quot;</span>, devProps.driverVersion);</div>
-<div class="line"><a name="l15366"></a><span class="lineno">15366</span>&#160;    fprintf(m_File, <span class="stringliteral">&quot;PhysicalDevice,vendorID,%u\n&quot;</span>, devProps.vendorID);</div>
-<div class="line"><a name="l15367"></a><span class="lineno">15367</span>&#160;    fprintf(m_File, <span class="stringliteral">&quot;PhysicalDevice,deviceID,%u\n&quot;</span>, devProps.deviceID);</div>
-<div class="line"><a name="l15368"></a><span class="lineno">15368</span>&#160;    fprintf(m_File, <span class="stringliteral">&quot;PhysicalDevice,deviceType,%u\n&quot;</span>, devProps.deviceType);</div>
-<div class="line"><a name="l15369"></a><span class="lineno">15369</span>&#160;    fprintf(m_File, <span class="stringliteral">&quot;PhysicalDevice,deviceName,%s\n&quot;</span>, devProps.deviceName);</div>
-<div class="line"><a name="l15370"></a><span class="lineno">15370</span>&#160; </div>
-<div class="line"><a name="l15371"></a><span class="lineno">15371</span>&#160;    fprintf(m_File, <span class="stringliteral">&quot;PhysicalDeviceLimits,maxMemoryAllocationCount,%u\n&quot;</span>, devProps.limits.maxMemoryAllocationCount);</div>
-<div class="line"><a name="l15372"></a><span class="lineno">15372</span>&#160;    fprintf(m_File, <span class="stringliteral">&quot;PhysicalDeviceLimits,bufferImageGranularity,%llu\n&quot;</span>, devProps.limits.bufferImageGranularity);</div>
-<div class="line"><a name="l15373"></a><span class="lineno">15373</span>&#160;    fprintf(m_File, <span class="stringliteral">&quot;PhysicalDeviceLimits,nonCoherentAtomSize,%llu\n&quot;</span>, devProps.limits.nonCoherentAtomSize);</div>
+<div class="line"><a name="l15363"></a><span class="lineno">15363</span>&#160;<span class="comment">// VmaRecorder</span></div>
+<div class="line"><a name="l15364"></a><span class="lineno">15364</span>&#160; </div>
+<div class="line"><a name="l15365"></a><span class="lineno">15365</span>&#160;<span class="preprocessor">#if VMA_RECORDING_ENABLED</span></div>
+<div class="line"><a name="l15366"></a><span class="lineno">15366</span>&#160; </div>
+<div class="line"><a name="l15367"></a><span class="lineno">15367</span>&#160;VmaRecorder::VmaRecorder() :</div>
+<div class="line"><a name="l15368"></a><span class="lineno">15368</span>&#160;    m_UseMutex(true),</div>
+<div class="line"><a name="l15369"></a><span class="lineno">15369</span>&#160;    m_Flags(0),</div>
+<div class="line"><a name="l15370"></a><span class="lineno">15370</span>&#160;    m_File(VMA_NULL),</div>
+<div class="line"><a name="l15371"></a><span class="lineno">15371</span>&#160;    m_RecordingStartTime(std::chrono::high_resolution_clock::now())</div>
+<div class="line"><a name="l15372"></a><span class="lineno">15372</span>&#160;{</div>
+<div class="line"><a name="l15373"></a><span class="lineno">15373</span>&#160;}</div>
 <div class="line"><a name="l15374"></a><span class="lineno">15374</span>&#160; </div>
-<div class="line"><a name="l15375"></a><span class="lineno">15375</span>&#160;    fprintf(m_File, <span class="stringliteral">&quot;PhysicalDeviceMemory,HeapCount,%u\n&quot;</span>, memProps.memoryHeapCount);</div>
-<div class="line"><a name="l15376"></a><span class="lineno">15376</span>&#160;    <span class="keywordflow">for</span>(uint32_t i = 0; i &lt; memProps.memoryHeapCount; ++i)</div>
-<div class="line"><a name="l15377"></a><span class="lineno">15377</span>&#160;    {</div>
-<div class="line"><a name="l15378"></a><span class="lineno">15378</span>&#160;        fprintf(m_File, <span class="stringliteral">&quot;PhysicalDeviceMemory,Heap,%u,size,%llu\n&quot;</span>, i, memProps.memoryHeaps[i].size);</div>
-<div class="line"><a name="l15379"></a><span class="lineno">15379</span>&#160;        fprintf(m_File, <span class="stringliteral">&quot;PhysicalDeviceMemory,Heap,%u,flags,%u\n&quot;</span>, i, memProps.memoryHeaps[i].flags);</div>
-<div class="line"><a name="l15380"></a><span class="lineno">15380</span>&#160;    }</div>
-<div class="line"><a name="l15381"></a><span class="lineno">15381</span>&#160;    fprintf(m_File, <span class="stringliteral">&quot;PhysicalDeviceMemory,TypeCount,%u\n&quot;</span>, memProps.memoryTypeCount);</div>
-<div class="line"><a name="l15382"></a><span class="lineno">15382</span>&#160;    <span class="keywordflow">for</span>(uint32_t i = 0; i &lt; memProps.memoryTypeCount; ++i)</div>
-<div class="line"><a name="l15383"></a><span class="lineno">15383</span>&#160;    {</div>
-<div class="line"><a name="l15384"></a><span class="lineno">15384</span>&#160;        fprintf(m_File, <span class="stringliteral">&quot;PhysicalDeviceMemory,Type,%u,heapIndex,%u\n&quot;</span>, i, memProps.memoryTypes[i].heapIndex);</div>
-<div class="line"><a name="l15385"></a><span class="lineno">15385</span>&#160;        fprintf(m_File, <span class="stringliteral">&quot;PhysicalDeviceMemory,Type,%u,propertyFlags,%u\n&quot;</span>, i, memProps.memoryTypes[i].propertyFlags);</div>
-<div class="line"><a name="l15386"></a><span class="lineno">15386</span>&#160;    }</div>
-<div class="line"><a name="l15387"></a><span class="lineno">15387</span>&#160; </div>
-<div class="line"><a name="l15388"></a><span class="lineno">15388</span>&#160;    fprintf(m_File, <span class="stringliteral">&quot;Extension,VK_KHR_dedicated_allocation,%u\n&quot;</span>, dedicatedAllocationExtensionEnabled ? 1 : 0);</div>
-<div class="line"><a name="l15389"></a><span class="lineno">15389</span>&#160;    fprintf(m_File, <span class="stringliteral">&quot;Extension,VK_KHR_bind_memory2,%u\n&quot;</span>, bindMemory2ExtensionEnabled ? 1 : 0);</div>
-<div class="line"><a name="l15390"></a><span class="lineno">15390</span>&#160;    fprintf(m_File, <span class="stringliteral">&quot;Extension,VK_EXT_memory_budget,%u\n&quot;</span>, memoryBudgetExtensionEnabled ? 1 : 0);</div>
-<div class="line"><a name="l15391"></a><span class="lineno">15391</span>&#160;    fprintf(m_File, <span class="stringliteral">&quot;Extension,VK_AMD_device_coherent_memory,%u\n&quot;</span>, deviceCoherentMemoryExtensionEnabled ? 1 : 0);</div>
-<div class="line"><a name="l15392"></a><span class="lineno">15392</span>&#160; </div>
-<div class="line"><a name="l15393"></a><span class="lineno">15393</span>&#160;    fprintf(m_File, <span class="stringliteral">&quot;Macro,VMA_DEBUG_ALWAYS_DEDICATED_MEMORY,%u\n&quot;</span>, VMA_DEBUG_ALWAYS_DEDICATED_MEMORY ? 1 : 0);</div>
-<div class="line"><a name="l15394"></a><span class="lineno">15394</span>&#160;    fprintf(m_File, <span class="stringliteral">&quot;Macro,VMA_DEBUG_ALIGNMENT,%llu\n&quot;</span>, (VkDeviceSize)VMA_DEBUG_ALIGNMENT);</div>
-<div class="line"><a name="l15395"></a><span class="lineno">15395</span>&#160;    fprintf(m_File, <span class="stringliteral">&quot;Macro,VMA_DEBUG_MARGIN,%llu\n&quot;</span>, (VkDeviceSize)VMA_DEBUG_MARGIN);</div>
-<div class="line"><a name="l15396"></a><span class="lineno">15396</span>&#160;    fprintf(m_File, <span class="stringliteral">&quot;Macro,VMA_DEBUG_INITIALIZE_ALLOCATIONS,%u\n&quot;</span>, VMA_DEBUG_INITIALIZE_ALLOCATIONS ? 1 : 0);</div>
-<div class="line"><a name="l15397"></a><span class="lineno">15397</span>&#160;    fprintf(m_File, <span class="stringliteral">&quot;Macro,VMA_DEBUG_DETECT_CORRUPTION,%u\n&quot;</span>, VMA_DEBUG_DETECT_CORRUPTION ? 1 : 0);</div>
-<div class="line"><a name="l15398"></a><span class="lineno">15398</span>&#160;    fprintf(m_File, <span class="stringliteral">&quot;Macro,VMA_DEBUG_GLOBAL_MUTEX,%u\n&quot;</span>, VMA_DEBUG_GLOBAL_MUTEX ? 1 : 0);</div>
-<div class="line"><a name="l15399"></a><span class="lineno">15399</span>&#160;    fprintf(m_File, <span class="stringliteral">&quot;Macro,VMA_DEBUG_MIN_BUFFER_IMAGE_GRANULARITY,%llu\n&quot;</span>, (VkDeviceSize)VMA_DEBUG_MIN_BUFFER_IMAGE_GRANULARITY);</div>
-<div class="line"><a name="l15400"></a><span class="lineno">15400</span>&#160;    fprintf(m_File, <span class="stringliteral">&quot;Macro,VMA_SMALL_HEAP_MAX_SIZE,%llu\n&quot;</span>, (VkDeviceSize)VMA_SMALL_HEAP_MAX_SIZE);</div>
-<div class="line"><a name="l15401"></a><span class="lineno">15401</span>&#160;    fprintf(m_File, <span class="stringliteral">&quot;Macro,VMA_DEFAULT_LARGE_HEAP_BLOCK_SIZE,%llu\n&quot;</span>, (VkDeviceSize)VMA_DEFAULT_LARGE_HEAP_BLOCK_SIZE);</div>
-<div class="line"><a name="l15402"></a><span class="lineno">15402</span>&#160; </div>
-<div class="line"><a name="l15403"></a><span class="lineno">15403</span>&#160;    fprintf(m_File, <span class="stringliteral">&quot;Config,End\n&quot;</span>);</div>
-<div class="line"><a name="l15404"></a><span class="lineno">15404</span>&#160;}</div>
-<div class="line"><a name="l15405"></a><span class="lineno">15405</span>&#160; </div>
-<div class="line"><a name="l15406"></a><span class="lineno">15406</span>&#160;<span class="keywordtype">void</span> VmaRecorder::GetBasicParams(CallParams&amp; outParams)</div>
-<div class="line"><a name="l15407"></a><span class="lineno">15407</span>&#160;{</div>
-<div class="line"><a name="l15408"></a><span class="lineno">15408</span>&#160;<span class="preprocessor">    #if defined(_WIN32)</span></div>
-<div class="line"><a name="l15409"></a><span class="lineno">15409</span>&#160;        outParams.threadId = GetCurrentThreadId();</div>
-<div class="line"><a name="l15410"></a><span class="lineno">15410</span>&#160;<span class="preprocessor">    #else</span></div>
-<div class="line"><a name="l15411"></a><span class="lineno">15411</span>&#160;        <span class="comment">// Use C++11 features to get thread id and convert it to uint32_t.</span></div>
-<div class="line"><a name="l15412"></a><span class="lineno">15412</span>&#160;        <span class="comment">// There is room for optimization since sstream is quite slow.</span></div>
-<div class="line"><a name="l15413"></a><span class="lineno">15413</span>&#160;        <span class="comment">// Is there a better way to convert std::this_thread::get_id() to uint32_t?</span></div>
-<div class="line"><a name="l15414"></a><span class="lineno">15414</span>&#160;        std::thread::id thread_id = std::this_thread::get_id();</div>
-<div class="line"><a name="l15415"></a><span class="lineno">15415</span>&#160;        stringstream thread_id_to_string_converter;</div>
-<div class="line"><a name="l15416"></a><span class="lineno">15416</span>&#160;        thread_id_to_string_converter &lt;&lt; thread_id;</div>
-<div class="line"><a name="l15417"></a><span class="lineno">15417</span>&#160;        <span class="keywordtype">string</span> thread_id_as_string = thread_id_to_string_converter.str();</div>
-<div class="line"><a name="l15418"></a><span class="lineno">15418</span>&#160;        outParams.threadId = <span class="keyword">static_cast&lt;</span>uint32_t<span class="keyword">&gt;</span>(std::stoi(thread_id_as_string.c_str()));</div>
-<div class="line"><a name="l15419"></a><span class="lineno">15419</span>&#160;<span class="preprocessor">    #endif</span></div>
-<div class="line"><a name="l15420"></a><span class="lineno">15420</span>&#160;    </div>
-<div class="line"><a name="l15421"></a><span class="lineno">15421</span>&#160;    <span class="keyword">auto</span> current_time = std::chrono::high_resolution_clock::now();</div>
+<div class="line"><a name="l15375"></a><span class="lineno">15375</span>&#160;VkResult VmaRecorder::Init(<span class="keyword">const</span> <a class="code" href="struct_vma_record_settings.html">VmaRecordSettings</a>&amp; settings, <span class="keywordtype">bool</span> useMutex)</div>
+<div class="line"><a name="l15376"></a><span class="lineno">15376</span>&#160;{</div>
+<div class="line"><a name="l15377"></a><span class="lineno">15377</span>&#160;    m_UseMutex = useMutex;</div>
+<div class="line"><a name="l15378"></a><span class="lineno">15378</span>&#160;    m_Flags = settings.<a class="code" href="struct_vma_record_settings.html#ad8fdcc92119ae7a8c08c1a564c01d63a">flags</a>;</div>
+<div class="line"><a name="l15379"></a><span class="lineno">15379</span>&#160; </div>
+<div class="line"><a name="l15380"></a><span class="lineno">15380</span>&#160;<span class="preprocessor">#if defined(_WIN32)</span></div>
+<div class="line"><a name="l15381"></a><span class="lineno">15381</span>&#160;    <span class="comment">// Open file for writing.</span></div>
+<div class="line"><a name="l15382"></a><span class="lineno">15382</span>&#160;    errno_t err = fopen_s(&amp;m_File, settings.<a class="code" href="struct_vma_record_settings.html#a6cb1fdbf6bcb610b68f2010dd629e89d">pFilePath</a>, <span class="stringliteral">&quot;wb&quot;</span>);</div>
+<div class="line"><a name="l15383"></a><span class="lineno">15383</span>&#160; </div>
+<div class="line"><a name="l15384"></a><span class="lineno">15384</span>&#160;    <span class="keywordflow">if</span>(err != 0)</div>
+<div class="line"><a name="l15385"></a><span class="lineno">15385</span>&#160;    {</div>
+<div class="line"><a name="l15386"></a><span class="lineno">15386</span>&#160;        <span class="keywordflow">return</span> VK_ERROR_INITIALIZATION_FAILED;</div>
+<div class="line"><a name="l15387"></a><span class="lineno">15387</span>&#160;    }</div>
+<div class="line"><a name="l15388"></a><span class="lineno">15388</span>&#160;<span class="preprocessor">#else</span></div>
+<div class="line"><a name="l15389"></a><span class="lineno">15389</span>&#160;    <span class="comment">// Open file for writing.</span></div>
+<div class="line"><a name="l15390"></a><span class="lineno">15390</span>&#160;    m_File = fopen(settings.<a class="code" href="struct_vma_record_settings.html#a6cb1fdbf6bcb610b68f2010dd629e89d">pFilePath</a>, <span class="stringliteral">&quot;wb&quot;</span>);</div>
+<div class="line"><a name="l15391"></a><span class="lineno">15391</span>&#160; </div>
+<div class="line"><a name="l15392"></a><span class="lineno">15392</span>&#160;    <span class="keywordflow">if</span>(m_File == 0)</div>
+<div class="line"><a name="l15393"></a><span class="lineno">15393</span>&#160;    {</div>
+<div class="line"><a name="l15394"></a><span class="lineno">15394</span>&#160;        <span class="keywordflow">return</span> VK_ERROR_INITIALIZATION_FAILED;</div>
+<div class="line"><a name="l15395"></a><span class="lineno">15395</span>&#160;    }</div>
+<div class="line"><a name="l15396"></a><span class="lineno">15396</span>&#160;<span class="preprocessor">#endif</span></div>
+<div class="line"><a name="l15397"></a><span class="lineno">15397</span>&#160; </div>
+<div class="line"><a name="l15398"></a><span class="lineno">15398</span>&#160;    <span class="comment">// Write header.</span></div>
+<div class="line"><a name="l15399"></a><span class="lineno">15399</span>&#160;    fprintf(m_File, <span class="stringliteral">&quot;%s\n&quot;</span>, <span class="stringliteral">&quot;Vulkan Memory Allocator,Calls recording&quot;</span>);</div>
+<div class="line"><a name="l15400"></a><span class="lineno">15400</span>&#160;    fprintf(m_File, <span class="stringliteral">&quot;%s\n&quot;</span>, <span class="stringliteral">&quot;1,8&quot;</span>);</div>
+<div class="line"><a name="l15401"></a><span class="lineno">15401</span>&#160; </div>
+<div class="line"><a name="l15402"></a><span class="lineno">15402</span>&#160;    <span class="keywordflow">return</span> VK_SUCCESS;</div>
+<div class="line"><a name="l15403"></a><span class="lineno">15403</span>&#160;}</div>
+<div class="line"><a name="l15404"></a><span class="lineno">15404</span>&#160; </div>
+<div class="line"><a name="l15405"></a><span class="lineno">15405</span>&#160;VmaRecorder::~VmaRecorder()</div>
+<div class="line"><a name="l15406"></a><span class="lineno">15406</span>&#160;{</div>
+<div class="line"><a name="l15407"></a><span class="lineno">15407</span>&#160;    <span class="keywordflow">if</span>(m_File != VMA_NULL)</div>
+<div class="line"><a name="l15408"></a><span class="lineno">15408</span>&#160;    {</div>
+<div class="line"><a name="l15409"></a><span class="lineno">15409</span>&#160;        fclose(m_File);</div>
+<div class="line"><a name="l15410"></a><span class="lineno">15410</span>&#160;    }</div>
+<div class="line"><a name="l15411"></a><span class="lineno">15411</span>&#160;}</div>
+<div class="line"><a name="l15412"></a><span class="lineno">15412</span>&#160; </div>
+<div class="line"><a name="l15413"></a><span class="lineno">15413</span>&#160;<span class="keywordtype">void</span> VmaRecorder::RecordCreateAllocator(uint32_t frameIndex)</div>
+<div class="line"><a name="l15414"></a><span class="lineno">15414</span>&#160;{</div>
+<div class="line"><a name="l15415"></a><span class="lineno">15415</span>&#160;    CallParams callParams;</div>
+<div class="line"><a name="l15416"></a><span class="lineno">15416</span>&#160;    GetBasicParams(callParams);</div>
+<div class="line"><a name="l15417"></a><span class="lineno">15417</span>&#160; </div>
+<div class="line"><a name="l15418"></a><span class="lineno">15418</span>&#160;    VmaMutexLock lock(m_FileMutex, m_UseMutex);</div>
+<div class="line"><a name="l15419"></a><span class="lineno">15419</span>&#160;    fprintf(m_File, <span class="stringliteral">&quot;%u,%.3f,%u,vmaCreateAllocator\n&quot;</span>, callParams.threadId, callParams.time, frameIndex);</div>
+<div class="line"><a name="l15420"></a><span class="lineno">15420</span>&#160;    Flush();</div>
+<div class="line"><a name="l15421"></a><span class="lineno">15421</span>&#160;}</div>
 <div class="line"><a name="l15422"></a><span class="lineno">15422</span>&#160; </div>
-<div class="line"><a name="l15423"></a><span class="lineno">15423</span>&#160;    outParams.time = std::chrono::duration&lt;double, std::chrono::seconds::period&gt;(current_time - m_RecordingStartTime).count();</div>
-<div class="line"><a name="l15424"></a><span class="lineno">15424</span>&#160;}</div>
-<div class="line"><a name="l15425"></a><span class="lineno">15425</span>&#160; </div>
-<div class="line"><a name="l15426"></a><span class="lineno">15426</span>&#160;<span class="keywordtype">void</span> VmaRecorder::PrintPointerList(uint64_t count, <span class="keyword">const</span> <a class="code" href="struct_vma_allocation.html">VmaAllocation</a>* pItems)</div>
-<div class="line"><a name="l15427"></a><span class="lineno">15427</span>&#160;{</div>
-<div class="line"><a name="l15428"></a><span class="lineno">15428</span>&#160;    <span class="keywordflow">if</span>(count)</div>
-<div class="line"><a name="l15429"></a><span class="lineno">15429</span>&#160;    {</div>
-<div class="line"><a name="l15430"></a><span class="lineno">15430</span>&#160;        fprintf(m_File, <span class="stringliteral">&quot;%p&quot;</span>, pItems[0]);</div>
-<div class="line"><a name="l15431"></a><span class="lineno">15431</span>&#160;        <span class="keywordflow">for</span>(uint64_t i = 1; i &lt; count; ++i)</div>
-<div class="line"><a name="l15432"></a><span class="lineno">15432</span>&#160;        {</div>
-<div class="line"><a name="l15433"></a><span class="lineno">15433</span>&#160;            fprintf(m_File, <span class="stringliteral">&quot; %p&quot;</span>, pItems[i]);</div>
-<div class="line"><a name="l15434"></a><span class="lineno">15434</span>&#160;        }</div>
-<div class="line"><a name="l15435"></a><span class="lineno">15435</span>&#160;    }</div>
-<div class="line"><a name="l15436"></a><span class="lineno">15436</span>&#160;}</div>
+<div class="line"><a name="l15423"></a><span class="lineno">15423</span>&#160;<span class="keywordtype">void</span> VmaRecorder::RecordDestroyAllocator(uint32_t frameIndex)</div>
+<div class="line"><a name="l15424"></a><span class="lineno">15424</span>&#160;{</div>
+<div class="line"><a name="l15425"></a><span class="lineno">15425</span>&#160;    CallParams callParams;</div>
+<div class="line"><a name="l15426"></a><span class="lineno">15426</span>&#160;    GetBasicParams(callParams);</div>
+<div class="line"><a name="l15427"></a><span class="lineno">15427</span>&#160; </div>
+<div class="line"><a name="l15428"></a><span class="lineno">15428</span>&#160;    VmaMutexLock lock(m_FileMutex, m_UseMutex);</div>
+<div class="line"><a name="l15429"></a><span class="lineno">15429</span>&#160;    fprintf(m_File, <span class="stringliteral">&quot;%u,%.3f,%u,vmaDestroyAllocator\n&quot;</span>, callParams.threadId, callParams.time, frameIndex);</div>
+<div class="line"><a name="l15430"></a><span class="lineno">15430</span>&#160;    Flush();</div>
+<div class="line"><a name="l15431"></a><span class="lineno">15431</span>&#160;}</div>
+<div class="line"><a name="l15432"></a><span class="lineno">15432</span>&#160; </div>
+<div class="line"><a name="l15433"></a><span class="lineno">15433</span>&#160;<span class="keywordtype">void</span> VmaRecorder::RecordCreatePool(uint32_t frameIndex, <span class="keyword">const</span> <a class="code" href="struct_vma_pool_create_info.html">VmaPoolCreateInfo</a>&amp; createInfo, <a class="code" href="struct_vma_pool.html">VmaPool</a> pool)</div>
+<div class="line"><a name="l15434"></a><span class="lineno">15434</span>&#160;{</div>
+<div class="line"><a name="l15435"></a><span class="lineno">15435</span>&#160;    CallParams callParams;</div>
+<div class="line"><a name="l15436"></a><span class="lineno">15436</span>&#160;    GetBasicParams(callParams);</div>
 <div class="line"><a name="l15437"></a><span class="lineno">15437</span>&#160; </div>
-<div class="line"><a name="l15438"></a><span class="lineno">15438</span>&#160;<span class="keywordtype">void</span> VmaRecorder::Flush()</div>
-<div class="line"><a name="l15439"></a><span class="lineno">15439</span>&#160;{</div>
-<div class="line"><a name="l15440"></a><span class="lineno">15440</span>&#160;    <span class="keywordflow">if</span>((m_Flags &amp; <a class="code" href="vk__mem__alloc_8h.html#a4dd2c44642312a147a4e93373a6e64d2a8e7ab322e8732654be627c4ea8f36cc7">VMA_RECORD_FLUSH_AFTER_CALL_BIT</a>) != 0)</div>
-<div class="line"><a name="l15441"></a><span class="lineno">15441</span>&#160;    {</div>
-<div class="line"><a name="l15442"></a><span class="lineno">15442</span>&#160;        fflush(m_File);</div>
-<div class="line"><a name="l15443"></a><span class="lineno">15443</span>&#160;    }</div>
-<div class="line"><a name="l15444"></a><span class="lineno">15444</span>&#160;}</div>
-<div class="line"><a name="l15445"></a><span class="lineno">15445</span>&#160; </div>
-<div class="line"><a name="l15446"></a><span class="lineno">15446</span>&#160;<span class="preprocessor">#endif // #if VMA_RECORDING_ENABLED</span></div>
-<div class="line"><a name="l15447"></a><span class="lineno">15447</span>&#160; </div>
-<div class="line"><a name="l15449"></a><span class="lineno">15449</span>&#160;<span class="comment">// VmaAllocationObjectAllocator</span></div>
-<div class="line"><a name="l15450"></a><span class="lineno">15450</span>&#160; </div>
-<div class="line"><a name="l15451"></a><span class="lineno">15451</span>&#160;VmaAllocationObjectAllocator::VmaAllocationObjectAllocator(<span class="keyword">const</span> VkAllocationCallbacks* pAllocationCallbacks) :</div>
-<div class="line"><a name="l15452"></a><span class="lineno">15452</span>&#160;    m_Allocator(pAllocationCallbacks, 1024)</div>
-<div class="line"><a name="l15453"></a><span class="lineno">15453</span>&#160;{</div>
-<div class="line"><a name="l15454"></a><span class="lineno">15454</span>&#160;}</div>
-<div class="line"><a name="l15455"></a><span class="lineno">15455</span>&#160; </div>
-<div class="line"><a name="l15456"></a><span class="lineno">15456</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span>... Types&gt; <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> VmaAllocationObjectAllocator::Allocate(Types... args)</div>
-<div class="line"><a name="l15457"></a><span class="lineno">15457</span>&#160;{</div>
-<div class="line"><a name="l15458"></a><span class="lineno">15458</span>&#160;    VmaMutexLock mutexLock(m_Mutex);</div>
-<div class="line"><a name="l15459"></a><span class="lineno">15459</span>&#160;    <span class="keywordflow">return</span> m_Allocator.Alloc&lt;Types...&gt;(std::forward&lt;Types&gt;(args)...);</div>
-<div class="line"><a name="l15460"></a><span class="lineno">15460</span>&#160;}</div>
-<div class="line"><a name="l15461"></a><span class="lineno">15461</span>&#160; </div>
-<div class="line"><a name="l15462"></a><span class="lineno">15462</span>&#160;<span class="keywordtype">void</span> VmaAllocationObjectAllocator::Free(<a class="code" href="struct_vma_allocation.html">VmaAllocation</a> hAlloc)</div>
-<div class="line"><a name="l15463"></a><span class="lineno">15463</span>&#160;{</div>
-<div class="line"><a name="l15464"></a><span class="lineno">15464</span>&#160;    VmaMutexLock mutexLock(m_Mutex);</div>
-<div class="line"><a name="l15465"></a><span class="lineno">15465</span>&#160;    m_Allocator.Free(hAlloc);</div>
-<div class="line"><a name="l15466"></a><span class="lineno">15466</span>&#160;}</div>
-<div class="line"><a name="l15467"></a><span class="lineno">15467</span>&#160; </div>
-<div class="line"><a name="l15469"></a><span class="lineno">15469</span>&#160;<span class="comment">// VmaAllocator_T</span></div>
-<div class="line"><a name="l15470"></a><span class="lineno">15470</span>&#160; </div>
-<div class="line"><a name="l15471"></a><span class="lineno">15471</span>&#160;VmaAllocator_T::VmaAllocator_T(<span class="keyword">const</span> <a class="code" href="struct_vma_allocator_create_info.html">VmaAllocatorCreateInfo</a>* pCreateInfo) :</div>
-<div class="line"><a name="l15472"></a><span class="lineno">15472</span>&#160;    m_UseMutex((pCreateInfo-&gt;flags &amp; <a class="code" href="vk__mem__alloc_8h.html#a4f87c9100d154a65a4ad495f7763cf7ca4816ddaed324ba110172ca608a20f29d">VMA_ALLOCATOR_CREATE_EXTERNALLY_SYNCHRONIZED_BIT</a>) == 0),</div>
-<div class="line"><a name="l15473"></a><span class="lineno">15473</span>&#160;    m_VulkanApiVersion(pCreateInfo-&gt;vulkanApiVersion != 0 ? pCreateInfo-&gt;vulkanApiVersion : VK_API_VERSION_1_0),</div>
-<div class="line"><a name="l15474"></a><span class="lineno">15474</span>&#160;    m_UseKhrDedicatedAllocation((pCreateInfo-&gt;flags &amp; <a class="code" href="vk__mem__alloc_8h.html#a4f87c9100d154a65a4ad495f7763cf7cace7da7cc6e71a625dfa763c55a597878">VMA_ALLOCATOR_CREATE_KHR_DEDICATED_ALLOCATION_BIT</a>) != 0),</div>
-<div class="line"><a name="l15475"></a><span class="lineno">15475</span>&#160;    m_UseKhrBindMemory2((pCreateInfo-&gt;flags &amp; <a class="code" href="vk__mem__alloc_8h.html#a4f87c9100d154a65a4ad495f7763cf7ca8fb75bf07cd184ab903596295e863dee">VMA_ALLOCATOR_CREATE_KHR_BIND_MEMORY2_BIT</a>) != 0),</div>
-<div class="line"><a name="l15476"></a><span class="lineno">15476</span>&#160;    m_UseExtMemoryBudget((pCreateInfo-&gt;flags &amp; <a class="code" href="vk__mem__alloc_8h.html#a4f87c9100d154a65a4ad495f7763cf7ca4d4687863f7bd4b418c6006dc04400b0">VMA_ALLOCATOR_CREATE_EXT_MEMORY_BUDGET_BIT</a>) != 0),</div>
-<div class="line"><a name="l15477"></a><span class="lineno">15477</span>&#160;    m_UseAmdDeviceCoherentMemory((pCreateInfo-&gt;flags &amp; <a class="code" href="vk__mem__alloc_8h.html#a4f87c9100d154a65a4ad495f7763cf7ca2acce4886d8078552efa38878413970f">VMA_ALLOCATOR_CREATE_AMD_DEVICE_COHERENT_MEMORY_BIT</a>) != 0),</div>
-<div class="line"><a name="l15478"></a><span class="lineno">15478</span>&#160;    m_UseKhrBufferDeviceAddress((pCreateInfo-&gt;flags &amp; <a class="code" href="vk__mem__alloc_8h.html#a4f87c9100d154a65a4ad495f7763cf7ca5f1b28b0414319d1687e1f2b30ab0089">VMA_ALLOCATOR_CREATE_BUFFER_DEVICE_ADDRESS_BIT</a>) != 0),</div>
-<div class="line"><a name="l15479"></a><span class="lineno">15479</span>&#160;    m_hDevice(pCreateInfo-&gt;device),</div>
-<div class="line"><a name="l15480"></a><span class="lineno">15480</span>&#160;    m_hInstance(pCreateInfo-&gt;instance),</div>
-<div class="line"><a name="l15481"></a><span class="lineno">15481</span>&#160;    m_AllocationCallbacksSpecified(pCreateInfo-&gt;pAllocationCallbacks != VMA_NULL),</div>
-<div class="line"><a name="l15482"></a><span class="lineno">15482</span>&#160;    m_AllocationCallbacks(pCreateInfo-&gt;pAllocationCallbacks ?</div>
-<div class="line"><a name="l15483"></a><span class="lineno">15483</span>&#160;        *pCreateInfo-&gt;pAllocationCallbacks : VmaEmptyAllocationCallbacks),</div>
-<div class="line"><a name="l15484"></a><span class="lineno">15484</span>&#160;    m_AllocationObjectAllocator(&amp;m_AllocationCallbacks),</div>
-<div class="line"><a name="l15485"></a><span class="lineno">15485</span>&#160;    m_HeapSizeLimitMask(0),</div>
-<div class="line"><a name="l15486"></a><span class="lineno">15486</span>&#160;    m_PreferredLargeHeapBlockSize(0),</div>
-<div class="line"><a name="l15487"></a><span class="lineno">15487</span>&#160;    m_PhysicalDevice(pCreateInfo-&gt;physicalDevice),</div>
-<div class="line"><a name="l15488"></a><span class="lineno">15488</span>&#160;    m_CurrentFrameIndex(0),</div>
-<div class="line"><a name="l15489"></a><span class="lineno">15489</span>&#160;    m_GpuDefragmentationMemoryTypeBits(UINT32_MAX),</div>
-<div class="line"><a name="l15490"></a><span class="lineno">15490</span>&#160;    m_Pools(VmaStlAllocator&lt;<a class="code" href="struct_vma_pool.html">VmaPool</a>&gt;(GetAllocationCallbacks())),</div>
-<div class="line"><a name="l15491"></a><span class="lineno">15491</span>&#160;    m_NextPoolId(0),</div>
-<div class="line"><a name="l15492"></a><span class="lineno">15492</span>&#160;    m_GlobalMemoryTypeBits(UINT32_MAX)</div>
-<div class="line"><a name="l15493"></a><span class="lineno">15493</span>&#160;#if <a class="code" href="vk__mem__alloc_8h.html#a1f0c126759fc96ccb6e2d23c101d770c">VMA_RECORDING_ENABLED</a></div>
-<div class="line"><a name="l15494"></a><span class="lineno">15494</span>&#160;    ,m_pRecorder(VMA_NULL)</div>
-<div class="line"><a name="l15495"></a><span class="lineno">15495</span>&#160;#endif</div>
-<div class="line"><a name="l15496"></a><span class="lineno">15496</span>&#160;{</div>
-<div class="line"><a name="l15497"></a><span class="lineno">15497</span>&#160;    <span class="keywordflow">if</span>(m_VulkanApiVersion &gt;= VK_MAKE_VERSION(1, 1, 0))</div>
-<div class="line"><a name="l15498"></a><span class="lineno">15498</span>&#160;    {</div>
-<div class="line"><a name="l15499"></a><span class="lineno">15499</span>&#160;        m_UseKhrDedicatedAllocation = <span class="keyword">false</span>;</div>
-<div class="line"><a name="l15500"></a><span class="lineno">15500</span>&#160;        m_UseKhrBindMemory2 = <span class="keyword">false</span>;</div>
-<div class="line"><a name="l15501"></a><span class="lineno">15501</span>&#160;    }</div>
-<div class="line"><a name="l15502"></a><span class="lineno">15502</span>&#160; </div>
-<div class="line"><a name="l15503"></a><span class="lineno">15503</span>&#160;    <span class="keywordflow">if</span>(VMA_DEBUG_DETECT_CORRUPTION)</div>
-<div class="line"><a name="l15504"></a><span class="lineno">15504</span>&#160;    {</div>
-<div class="line"><a name="l15505"></a><span class="lineno">15505</span>&#160;        <span class="comment">// Needs to be multiply of uint32_t size because we are going to write VMA_CORRUPTION_DETECTION_MAGIC_VALUE to it.</span></div>
-<div class="line"><a name="l15506"></a><span class="lineno">15506</span>&#160;        VMA_ASSERT(VMA_DEBUG_MARGIN % <span class="keyword">sizeof</span>(uint32_t) == 0);</div>
-<div class="line"><a name="l15507"></a><span class="lineno">15507</span>&#160;    }</div>
-<div class="line"><a name="l15508"></a><span class="lineno">15508</span>&#160; </div>
-<div class="line"><a name="l15509"></a><span class="lineno">15509</span>&#160;    VMA_ASSERT(pCreateInfo-&gt;<a class="code" href="struct_vma_allocator_create_info.html#a08230f04ae6ccf8a78150a9e829a7156">physicalDevice</a> &amp;&amp; pCreateInfo-&gt;<a class="code" href="struct_vma_allocator_create_info.html#ad924ddd77b04039c88d0c09b0ffcd500">device</a> &amp;&amp; pCreateInfo-&gt;<a class="code" href="struct_vma_allocator_create_info.html#a70dd42e29b1df1d1b9b61532ae0b370b">instance</a>);</div>
-<div class="line"><a name="l15510"></a><span class="lineno">15510</span>&#160; </div>
-<div class="line"><a name="l15511"></a><span class="lineno">15511</span>&#160;    <span class="keywordflow">if</span>(m_VulkanApiVersion &lt; VK_MAKE_VERSION(1, 1, 0))</div>
-<div class="line"><a name="l15512"></a><span class="lineno">15512</span>&#160;    {</div>
-<div class="line"><a name="l15513"></a><span class="lineno">15513</span>&#160;<span class="preprocessor">#if !(VMA_DEDICATED_ALLOCATION)</span></div>
-<div class="line"><a name="l15514"></a><span class="lineno">15514</span>&#160;        <span class="keywordflow">if</span>((pCreateInfo-&gt;<a class="code" href="struct_vma_allocator_create_info.html#a392ea2ecbaff93f91a7c49f735ad4346">flags</a> &amp; <a class="code" href="vk__mem__alloc_8h.html#a4f87c9100d154a65a4ad495f7763cf7cace7da7cc6e71a625dfa763c55a597878">VMA_ALLOCATOR_CREATE_KHR_DEDICATED_ALLOCATION_BIT</a>) != 0)</div>
-<div class="line"><a name="l15515"></a><span class="lineno">15515</span>&#160;        {</div>
-<div class="line"><a name="l15516"></a><span class="lineno">15516</span>&#160;            VMA_ASSERT(0 &amp;&amp; <span class="stringliteral">&quot;VMA_ALLOCATOR_CREATE_KHR_DEDICATED_ALLOCATION_BIT set but required extensions are disabled by preprocessor macros.&quot;</span>);</div>
-<div class="line"><a name="l15517"></a><span class="lineno">15517</span>&#160;        }</div>
-<div class="line"><a name="l15518"></a><span class="lineno">15518</span>&#160;<span class="preprocessor">#endif</span></div>
-<div class="line"><a name="l15519"></a><span class="lineno">15519</span>&#160;<span class="preprocessor">#if !(VMA_BIND_MEMORY2)</span></div>
-<div class="line"><a name="l15520"></a><span class="lineno">15520</span>&#160;        <span class="keywordflow">if</span>((pCreateInfo-&gt;<a class="code" href="struct_vma_allocator_create_info.html#a392ea2ecbaff93f91a7c49f735ad4346">flags</a> &amp; <a class="code" href="vk__mem__alloc_8h.html#a4f87c9100d154a65a4ad495f7763cf7ca8fb75bf07cd184ab903596295e863dee">VMA_ALLOCATOR_CREATE_KHR_BIND_MEMORY2_BIT</a>) != 0)</div>
-<div class="line"><a name="l15521"></a><span class="lineno">15521</span>&#160;        {</div>
-<div class="line"><a name="l15522"></a><span class="lineno">15522</span>&#160;            VMA_ASSERT(0 &amp;&amp; <span class="stringliteral">&quot;VMA_ALLOCATOR_CREATE_KHR_BIND_MEMORY2_BIT set but required extension is disabled by preprocessor macros.&quot;</span>);</div>
-<div class="line"><a name="l15523"></a><span class="lineno">15523</span>&#160;        }</div>
-<div class="line"><a name="l15524"></a><span class="lineno">15524</span>&#160;<span class="preprocessor">#endif</span></div>
-<div class="line"><a name="l15525"></a><span class="lineno">15525</span>&#160;    }</div>
-<div class="line"><a name="l15526"></a><span class="lineno">15526</span>&#160;<span class="preprocessor">#if !(VMA_MEMORY_BUDGET)</span></div>
-<div class="line"><a name="l15527"></a><span class="lineno">15527</span>&#160;    <span class="keywordflow">if</span>((pCreateInfo-&gt;<a class="code" href="struct_vma_allocator_create_info.html#a392ea2ecbaff93f91a7c49f735ad4346">flags</a> &amp; <a class="code" href="vk__mem__alloc_8h.html#a4f87c9100d154a65a4ad495f7763cf7ca4d4687863f7bd4b418c6006dc04400b0">VMA_ALLOCATOR_CREATE_EXT_MEMORY_BUDGET_BIT</a>) != 0)</div>
-<div class="line"><a name="l15528"></a><span class="lineno">15528</span>&#160;    {</div>
-<div class="line"><a name="l15529"></a><span class="lineno">15529</span>&#160;        VMA_ASSERT(0 &amp;&amp; <span class="stringliteral">&quot;VMA_ALLOCATOR_CREATE_EXT_MEMORY_BUDGET_BIT set but required extension is disabled by preprocessor macros.&quot;</span>);</div>
-<div class="line"><a name="l15530"></a><span class="lineno">15530</span>&#160;    }</div>
-<div class="line"><a name="l15531"></a><span class="lineno">15531</span>&#160;<span class="preprocessor">#endif</span></div>
-<div class="line"><a name="l15532"></a><span class="lineno">15532</span>&#160;<span class="preprocessor">#if !(VMA_BUFFER_DEVICE_ADDRESS)</span></div>
-<div class="line"><a name="l15533"></a><span class="lineno">15533</span>&#160;    <span class="keywordflow">if</span>(m_UseKhrBufferDeviceAddress)</div>
-<div class="line"><a name="l15534"></a><span class="lineno">15534</span>&#160;    {</div>
-<div class="line"><a name="l15535"></a><span class="lineno">15535</span>&#160;        VMA_ASSERT(0 &amp;&amp; <span class="stringliteral">&quot;VMA_ALLOCATOR_CREATE_BUFFER_DEVICE_ADDRESS_BIT is set but required extension or Vulkan 1.2 is not available in your Vulkan header or its support in VMA has been disabled by a preprocessor macro.&quot;</span>);</div>
-<div class="line"><a name="l15536"></a><span class="lineno">15536</span>&#160;    }</div>
-<div class="line"><a name="l15537"></a><span class="lineno">15537</span>&#160;<span class="preprocessor">#endif</span></div>
-<div class="line"><a name="l15538"></a><span class="lineno">15538</span>&#160;<span class="preprocessor">#if VMA_VULKAN_VERSION &lt; 1002000</span></div>
-<div class="line"><a name="l15539"></a><span class="lineno">15539</span>&#160;    <span class="keywordflow">if</span>(m_VulkanApiVersion &gt;= VK_MAKE_VERSION(1, 2, 0))</div>
-<div class="line"><a name="l15540"></a><span class="lineno">15540</span>&#160;    {</div>
-<div class="line"><a name="l15541"></a><span class="lineno">15541</span>&#160;        VMA_ASSERT(0 &amp;&amp; <span class="stringliteral">&quot;vulkanApiVersion &gt;= VK_API_VERSION_1_2 but required Vulkan version is disabled by preprocessor macros.&quot;</span>);</div>
-<div class="line"><a name="l15542"></a><span class="lineno">15542</span>&#160;    }</div>
-<div class="line"><a name="l15543"></a><span class="lineno">15543</span>&#160;<span class="preprocessor">#endif</span></div>
-<div class="line"><a name="l15544"></a><span class="lineno">15544</span>&#160;<span class="preprocessor">#if VMA_VULKAN_VERSION &lt; 1001000</span></div>
-<div class="line"><a name="l15545"></a><span class="lineno">15545</span>&#160;    <span class="keywordflow">if</span>(m_VulkanApiVersion &gt;= VK_MAKE_VERSION(1, 1, 0))</div>
-<div class="line"><a name="l15546"></a><span class="lineno">15546</span>&#160;    {</div>
-<div class="line"><a name="l15547"></a><span class="lineno">15547</span>&#160;        VMA_ASSERT(0 &amp;&amp; <span class="stringliteral">&quot;vulkanApiVersion &gt;= VK_API_VERSION_1_1 but required Vulkan version is disabled by preprocessor macros.&quot;</span>);</div>
-<div class="line"><a name="l15548"></a><span class="lineno">15548</span>&#160;    }</div>
-<div class="line"><a name="l15549"></a><span class="lineno">15549</span>&#160;<span class="preprocessor">#endif</span></div>
+<div class="line"><a name="l15438"></a><span class="lineno">15438</span>&#160;    VmaMutexLock lock(m_FileMutex, m_UseMutex);</div>
+<div class="line"><a name="l15439"></a><span class="lineno">15439</span>&#160;    fprintf(m_File, <span class="stringliteral">&quot;%u,%.3f,%u,vmaCreatePool,%u,%u,%llu,%llu,%llu,%u,%p\n&quot;</span>, callParams.threadId, callParams.time, frameIndex,</div>
+<div class="line"><a name="l15440"></a><span class="lineno">15440</span>&#160;        createInfo.<a class="code" href="struct_vma_pool_create_info.html#a596fa76b685d3f1f688f84a709a5b319">memoryTypeIndex</a>,</div>
+<div class="line"><a name="l15441"></a><span class="lineno">15441</span>&#160;        createInfo.<a class="code" href="struct_vma_pool_create_info.html#a8405139f63d078340ae74513a59f5446">flags</a>,</div>
+<div class="line"><a name="l15442"></a><span class="lineno">15442</span>&#160;        createInfo.<a class="code" href="struct_vma_pool_create_info.html#aa4265160536cdb9be821b7686c16c676">blockSize</a>,</div>
+<div class="line"><a name="l15443"></a><span class="lineno">15443</span>&#160;        (uint64_t)createInfo.<a class="code" href="struct_vma_pool_create_info.html#ad8006fb803185c0a699d30f3e9a865ae">minBlockCount</a>,</div>
+<div class="line"><a name="l15444"></a><span class="lineno">15444</span>&#160;        (uint64_t)createInfo.<a class="code" href="struct_vma_pool_create_info.html#ae41142f2834fcdc82baa4883c187b75c">maxBlockCount</a>,</div>
+<div class="line"><a name="l15445"></a><span class="lineno">15445</span>&#160;        createInfo.<a class="code" href="struct_vma_pool_create_info.html#a9437e43ffbb644dbbf7fc4e50cfad6aa">frameInUseCount</a>,</div>
+<div class="line"><a name="l15446"></a><span class="lineno">15446</span>&#160;        pool);</div>
+<div class="line"><a name="l15447"></a><span class="lineno">15447</span>&#160;    Flush();</div>
+<div class="line"><a name="l15448"></a><span class="lineno">15448</span>&#160;}</div>
+<div class="line"><a name="l15449"></a><span class="lineno">15449</span>&#160; </div>
+<div class="line"><a name="l15450"></a><span class="lineno">15450</span>&#160;<span class="keywordtype">void</span> VmaRecorder::RecordDestroyPool(uint32_t frameIndex, <a class="code" href="struct_vma_pool.html">VmaPool</a> pool)</div>
+<div class="line"><a name="l15451"></a><span class="lineno">15451</span>&#160;{</div>
+<div class="line"><a name="l15452"></a><span class="lineno">15452</span>&#160;    CallParams callParams;</div>
+<div class="line"><a name="l15453"></a><span class="lineno">15453</span>&#160;    GetBasicParams(callParams);</div>
+<div class="line"><a name="l15454"></a><span class="lineno">15454</span>&#160; </div>
+<div class="line"><a name="l15455"></a><span class="lineno">15455</span>&#160;    VmaMutexLock lock(m_FileMutex, m_UseMutex);</div>
+<div class="line"><a name="l15456"></a><span class="lineno">15456</span>&#160;    fprintf(m_File, <span class="stringliteral">&quot;%u,%.3f,%u,vmaDestroyPool,%p\n&quot;</span>, callParams.threadId, callParams.time, frameIndex,</div>
+<div class="line"><a name="l15457"></a><span class="lineno">15457</span>&#160;        pool);</div>
+<div class="line"><a name="l15458"></a><span class="lineno">15458</span>&#160;    Flush();</div>
+<div class="line"><a name="l15459"></a><span class="lineno">15459</span>&#160;}</div>
+<div class="line"><a name="l15460"></a><span class="lineno">15460</span>&#160; </div>
+<div class="line"><a name="l15461"></a><span class="lineno">15461</span>&#160;<span class="keywordtype">void</span> VmaRecorder::RecordAllocateMemory(uint32_t frameIndex,</div>
+<div class="line"><a name="l15462"></a><span class="lineno">15462</span>&#160;        <span class="keyword">const</span> VkMemoryRequirements&amp; vkMemReq,</div>
+<div class="line"><a name="l15463"></a><span class="lineno">15463</span>&#160;        <span class="keyword">const</span> <a class="code" href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a>&amp; createInfo,</div>
+<div class="line"><a name="l15464"></a><span class="lineno">15464</span>&#160;        <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation)</div>
+<div class="line"><a name="l15465"></a><span class="lineno">15465</span>&#160;{</div>
+<div class="line"><a name="l15466"></a><span class="lineno">15466</span>&#160;    CallParams callParams;</div>
+<div class="line"><a name="l15467"></a><span class="lineno">15467</span>&#160;    GetBasicParams(callParams);</div>
+<div class="line"><a name="l15468"></a><span class="lineno">15468</span>&#160; </div>
+<div class="line"><a name="l15469"></a><span class="lineno">15469</span>&#160;    VmaMutexLock lock(m_FileMutex, m_UseMutex);</div>
+<div class="line"><a name="l15470"></a><span class="lineno">15470</span>&#160;    UserDataString userDataStr(createInfo.<a class="code" href="struct_vma_allocation_create_info.html#add09658ac14fe290ace25470ddd6d41b">flags</a>, createInfo.<a class="code" href="struct_vma_allocation_create_info.html#a8259e85c272683434f4abb4ddddffe19">pUserData</a>);</div>
+<div class="line"><a name="l15471"></a><span class="lineno">15471</span>&#160;    fprintf(m_File, <span class="stringliteral">&quot;%u,%.3f,%u,vmaAllocateMemory,%llu,%llu,%u,%u,%u,%u,%u,%u,%p,%p,%s\n&quot;</span>, callParams.threadId, callParams.time, frameIndex,</div>
+<div class="line"><a name="l15472"></a><span class="lineno">15472</span>&#160;        vkMemReq.size,</div>
+<div class="line"><a name="l15473"></a><span class="lineno">15473</span>&#160;        vkMemReq.alignment,</div>
+<div class="line"><a name="l15474"></a><span class="lineno">15474</span>&#160;        vkMemReq.memoryTypeBits,</div>
+<div class="line"><a name="l15475"></a><span class="lineno">15475</span>&#160;        createInfo.<a class="code" href="struct_vma_allocation_create_info.html#add09658ac14fe290ace25470ddd6d41b">flags</a>,</div>
+<div class="line"><a name="l15476"></a><span class="lineno">15476</span>&#160;        createInfo.<a class="code" href="struct_vma_allocation_create_info.html#accb8b06b1f677d858cb9af20705fa910">usage</a>,</div>
+<div class="line"><a name="l15477"></a><span class="lineno">15477</span>&#160;        createInfo.<a class="code" href="struct_vma_allocation_create_info.html#a9166390303ff42d783305bc31c2b6b90">requiredFlags</a>,</div>
+<div class="line"><a name="l15478"></a><span class="lineno">15478</span>&#160;        createInfo.<a class="code" href="struct_vma_allocation_create_info.html#a7fe8d81a1ad10b2a2faacacee5b15d6d">preferredFlags</a>,</div>
+<div class="line"><a name="l15479"></a><span class="lineno">15479</span>&#160;        createInfo.<a class="code" href="struct_vma_allocation_create_info.html#a3bf940c0271d85d6ba32a4d820075055">memoryTypeBits</a>,</div>
+<div class="line"><a name="l15480"></a><span class="lineno">15480</span>&#160;        createInfo.<a class="code" href="struct_vma_allocation_create_info.html#a6272c0555cfd1fe28bff1afeb6190150">pool</a>,</div>
+<div class="line"><a name="l15481"></a><span class="lineno">15481</span>&#160;        allocation,</div>
+<div class="line"><a name="l15482"></a><span class="lineno">15482</span>&#160;        userDataStr.GetString());</div>
+<div class="line"><a name="l15483"></a><span class="lineno">15483</span>&#160;    Flush();</div>
+<div class="line"><a name="l15484"></a><span class="lineno">15484</span>&#160;}</div>
+<div class="line"><a name="l15485"></a><span class="lineno">15485</span>&#160; </div>
+<div class="line"><a name="l15486"></a><span class="lineno">15486</span>&#160;<span class="keywordtype">void</span> VmaRecorder::RecordAllocateMemoryPages(uint32_t frameIndex,</div>
+<div class="line"><a name="l15487"></a><span class="lineno">15487</span>&#160;    <span class="keyword">const</span> VkMemoryRequirements&amp; vkMemReq,</div>
+<div class="line"><a name="l15488"></a><span class="lineno">15488</span>&#160;    <span class="keyword">const</span> <a class="code" href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a>&amp; createInfo,</div>
+<div class="line"><a name="l15489"></a><span class="lineno">15489</span>&#160;    uint64_t allocationCount,</div>
+<div class="line"><a name="l15490"></a><span class="lineno">15490</span>&#160;    <span class="keyword">const</span> <a class="code" href="struct_vma_allocation.html">VmaAllocation</a>* pAllocations)</div>
+<div class="line"><a name="l15491"></a><span class="lineno">15491</span>&#160;{</div>
+<div class="line"><a name="l15492"></a><span class="lineno">15492</span>&#160;    CallParams callParams;</div>
+<div class="line"><a name="l15493"></a><span class="lineno">15493</span>&#160;    GetBasicParams(callParams);</div>
+<div class="line"><a name="l15494"></a><span class="lineno">15494</span>&#160; </div>
+<div class="line"><a name="l15495"></a><span class="lineno">15495</span>&#160;    VmaMutexLock lock(m_FileMutex, m_UseMutex);</div>
+<div class="line"><a name="l15496"></a><span class="lineno">15496</span>&#160;    UserDataString userDataStr(createInfo.<a class="code" href="struct_vma_allocation_create_info.html#add09658ac14fe290ace25470ddd6d41b">flags</a>, createInfo.<a class="code" href="struct_vma_allocation_create_info.html#a8259e85c272683434f4abb4ddddffe19">pUserData</a>);</div>
+<div class="line"><a name="l15497"></a><span class="lineno">15497</span>&#160;    fprintf(m_File, <span class="stringliteral">&quot;%u,%.3f,%u,vmaAllocateMemoryPages,%llu,%llu,%u,%u,%u,%u,%u,%u,%p,&quot;</span>, callParams.threadId, callParams.time, frameIndex,</div>
+<div class="line"><a name="l15498"></a><span class="lineno">15498</span>&#160;        vkMemReq.size,</div>
+<div class="line"><a name="l15499"></a><span class="lineno">15499</span>&#160;        vkMemReq.alignment,</div>
+<div class="line"><a name="l15500"></a><span class="lineno">15500</span>&#160;        vkMemReq.memoryTypeBits,</div>
+<div class="line"><a name="l15501"></a><span class="lineno">15501</span>&#160;        createInfo.<a class="code" href="struct_vma_allocation_create_info.html#add09658ac14fe290ace25470ddd6d41b">flags</a>,</div>
+<div class="line"><a name="l15502"></a><span class="lineno">15502</span>&#160;        createInfo.<a class="code" href="struct_vma_allocation_create_info.html#accb8b06b1f677d858cb9af20705fa910">usage</a>,</div>
+<div class="line"><a name="l15503"></a><span class="lineno">15503</span>&#160;        createInfo.<a class="code" href="struct_vma_allocation_create_info.html#a9166390303ff42d783305bc31c2b6b90">requiredFlags</a>,</div>
+<div class="line"><a name="l15504"></a><span class="lineno">15504</span>&#160;        createInfo.<a class="code" href="struct_vma_allocation_create_info.html#a7fe8d81a1ad10b2a2faacacee5b15d6d">preferredFlags</a>,</div>
+<div class="line"><a name="l15505"></a><span class="lineno">15505</span>&#160;        createInfo.<a class="code" href="struct_vma_allocation_create_info.html#a3bf940c0271d85d6ba32a4d820075055">memoryTypeBits</a>,</div>
+<div class="line"><a name="l15506"></a><span class="lineno">15506</span>&#160;        createInfo.<a class="code" href="struct_vma_allocation_create_info.html#a6272c0555cfd1fe28bff1afeb6190150">pool</a>);</div>
+<div class="line"><a name="l15507"></a><span class="lineno">15507</span>&#160;    PrintPointerList(allocationCount, pAllocations);</div>
+<div class="line"><a name="l15508"></a><span class="lineno">15508</span>&#160;    fprintf(m_File, <span class="stringliteral">&quot;,%s\n&quot;</span>, userDataStr.GetString());</div>
+<div class="line"><a name="l15509"></a><span class="lineno">15509</span>&#160;    Flush();</div>
+<div class="line"><a name="l15510"></a><span class="lineno">15510</span>&#160;}</div>
+<div class="line"><a name="l15511"></a><span class="lineno">15511</span>&#160; </div>
+<div class="line"><a name="l15512"></a><span class="lineno">15512</span>&#160;<span class="keywordtype">void</span> VmaRecorder::RecordAllocateMemoryForBuffer(uint32_t frameIndex,</div>
+<div class="line"><a name="l15513"></a><span class="lineno">15513</span>&#160;    <span class="keyword">const</span> VkMemoryRequirements&amp; vkMemReq,</div>
+<div class="line"><a name="l15514"></a><span class="lineno">15514</span>&#160;    <span class="keywordtype">bool</span> requiresDedicatedAllocation,</div>
+<div class="line"><a name="l15515"></a><span class="lineno">15515</span>&#160;    <span class="keywordtype">bool</span> prefersDedicatedAllocation,</div>
+<div class="line"><a name="l15516"></a><span class="lineno">15516</span>&#160;    <span class="keyword">const</span> <a class="code" href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a>&amp; createInfo,</div>
+<div class="line"><a name="l15517"></a><span class="lineno">15517</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation)</div>
+<div class="line"><a name="l15518"></a><span class="lineno">15518</span>&#160;{</div>
+<div class="line"><a name="l15519"></a><span class="lineno">15519</span>&#160;    CallParams callParams;</div>
+<div class="line"><a name="l15520"></a><span class="lineno">15520</span>&#160;    GetBasicParams(callParams);</div>
+<div class="line"><a name="l15521"></a><span class="lineno">15521</span>&#160; </div>
+<div class="line"><a name="l15522"></a><span class="lineno">15522</span>&#160;    VmaMutexLock lock(m_FileMutex, m_UseMutex);</div>
+<div class="line"><a name="l15523"></a><span class="lineno">15523</span>&#160;    UserDataString userDataStr(createInfo.<a class="code" href="struct_vma_allocation_create_info.html#add09658ac14fe290ace25470ddd6d41b">flags</a>, createInfo.<a class="code" href="struct_vma_allocation_create_info.html#a8259e85c272683434f4abb4ddddffe19">pUserData</a>);</div>
+<div class="line"><a name="l15524"></a><span class="lineno">15524</span>&#160;    fprintf(m_File, <span class="stringliteral">&quot;%u,%.3f,%u,vmaAllocateMemoryForBuffer,%llu,%llu,%u,%u,%u,%u,%u,%u,%u,%u,%p,%p,%s\n&quot;</span>, callParams.threadId, callParams.time, frameIndex,</div>
+<div class="line"><a name="l15525"></a><span class="lineno">15525</span>&#160;        vkMemReq.size,</div>
+<div class="line"><a name="l15526"></a><span class="lineno">15526</span>&#160;        vkMemReq.alignment,</div>
+<div class="line"><a name="l15527"></a><span class="lineno">15527</span>&#160;        vkMemReq.memoryTypeBits,</div>
+<div class="line"><a name="l15528"></a><span class="lineno">15528</span>&#160;        requiresDedicatedAllocation ? 1 : 0,</div>
+<div class="line"><a name="l15529"></a><span class="lineno">15529</span>&#160;        prefersDedicatedAllocation ? 1 : 0,</div>
+<div class="line"><a name="l15530"></a><span class="lineno">15530</span>&#160;        createInfo.<a class="code" href="struct_vma_allocation_create_info.html#add09658ac14fe290ace25470ddd6d41b">flags</a>,</div>
+<div class="line"><a name="l15531"></a><span class="lineno">15531</span>&#160;        createInfo.<a class="code" href="struct_vma_allocation_create_info.html#accb8b06b1f677d858cb9af20705fa910">usage</a>,</div>
+<div class="line"><a name="l15532"></a><span class="lineno">15532</span>&#160;        createInfo.<a class="code" href="struct_vma_allocation_create_info.html#a9166390303ff42d783305bc31c2b6b90">requiredFlags</a>,</div>
+<div class="line"><a name="l15533"></a><span class="lineno">15533</span>&#160;        createInfo.<a class="code" href="struct_vma_allocation_create_info.html#a7fe8d81a1ad10b2a2faacacee5b15d6d">preferredFlags</a>,</div>
+<div class="line"><a name="l15534"></a><span class="lineno">15534</span>&#160;        createInfo.<a class="code" href="struct_vma_allocation_create_info.html#a3bf940c0271d85d6ba32a4d820075055">memoryTypeBits</a>,</div>
+<div class="line"><a name="l15535"></a><span class="lineno">15535</span>&#160;        createInfo.<a class="code" href="struct_vma_allocation_create_info.html#a6272c0555cfd1fe28bff1afeb6190150">pool</a>,</div>
+<div class="line"><a name="l15536"></a><span class="lineno">15536</span>&#160;        allocation,</div>
+<div class="line"><a name="l15537"></a><span class="lineno">15537</span>&#160;        userDataStr.GetString());</div>
+<div class="line"><a name="l15538"></a><span class="lineno">15538</span>&#160;    Flush();</div>
+<div class="line"><a name="l15539"></a><span class="lineno">15539</span>&#160;}</div>
+<div class="line"><a name="l15540"></a><span class="lineno">15540</span>&#160; </div>
+<div class="line"><a name="l15541"></a><span class="lineno">15541</span>&#160;<span class="keywordtype">void</span> VmaRecorder::RecordAllocateMemoryForImage(uint32_t frameIndex,</div>
+<div class="line"><a name="l15542"></a><span class="lineno">15542</span>&#160;    <span class="keyword">const</span> VkMemoryRequirements&amp; vkMemReq,</div>
+<div class="line"><a name="l15543"></a><span class="lineno">15543</span>&#160;    <span class="keywordtype">bool</span> requiresDedicatedAllocation,</div>
+<div class="line"><a name="l15544"></a><span class="lineno">15544</span>&#160;    <span class="keywordtype">bool</span> prefersDedicatedAllocation,</div>
+<div class="line"><a name="l15545"></a><span class="lineno">15545</span>&#160;    <span class="keyword">const</span> <a class="code" href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a>&amp; createInfo,</div>
+<div class="line"><a name="l15546"></a><span class="lineno">15546</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation)</div>
+<div class="line"><a name="l15547"></a><span class="lineno">15547</span>&#160;{</div>
+<div class="line"><a name="l15548"></a><span class="lineno">15548</span>&#160;    CallParams callParams;</div>
+<div class="line"><a name="l15549"></a><span class="lineno">15549</span>&#160;    GetBasicParams(callParams);</div>
 <div class="line"><a name="l15550"></a><span class="lineno">15550</span>&#160; </div>
-<div class="line"><a name="l15551"></a><span class="lineno">15551</span>&#160;    memset(&amp;m_DeviceMemoryCallbacks, 0 ,<span class="keyword">sizeof</span>(m_DeviceMemoryCallbacks));</div>
-<div class="line"><a name="l15552"></a><span class="lineno">15552</span>&#160;    memset(&amp;m_PhysicalDeviceProperties, 0, <span class="keyword">sizeof</span>(m_PhysicalDeviceProperties));</div>
-<div class="line"><a name="l15553"></a><span class="lineno">15553</span>&#160;    memset(&amp;m_MemProps, 0, <span class="keyword">sizeof</span>(m_MemProps));</div>
-<div class="line"><a name="l15554"></a><span class="lineno">15554</span>&#160;        </div>
-<div class="line"><a name="l15555"></a><span class="lineno">15555</span>&#160;    memset(&amp;m_pBlockVectors, 0, <span class="keyword">sizeof</span>(m_pBlockVectors));</div>
-<div class="line"><a name="l15556"></a><span class="lineno">15556</span>&#160;    memset(&amp;m_pDedicatedAllocations, 0, <span class="keyword">sizeof</span>(m_pDedicatedAllocations));</div>
-<div class="line"><a name="l15557"></a><span class="lineno">15557</span>&#160;    memset(&amp;m_VulkanFunctions, 0, <span class="keyword">sizeof</span>(m_VulkanFunctions));</div>
-<div class="line"><a name="l15558"></a><span class="lineno">15558</span>&#160; </div>
-<div class="line"><a name="l15559"></a><span class="lineno">15559</span>&#160;    <span class="keywordflow">if</span>(pCreateInfo-&gt;<a class="code" href="struct_vma_allocator_create_info.html#af1380969b5e1ea4c3184a877892d260e">pDeviceMemoryCallbacks</a> != VMA_NULL)</div>
-<div class="line"><a name="l15560"></a><span class="lineno">15560</span>&#160;    {</div>
-<div class="line"><a name="l15561"></a><span class="lineno">15561</span>&#160;        m_DeviceMemoryCallbacks.<a class="code" href="struct_vma_device_memory_callbacks.html#a24052de0937ddd54015a2df0363903c6">pUserData</a> = pCreateInfo-&gt;<a class="code" href="struct_vma_allocator_create_info.html#af1380969b5e1ea4c3184a877892d260e">pDeviceMemoryCallbacks</a>-&gt;<a class="code" href="struct_vma_device_memory_callbacks.html#a24052de0937ddd54015a2df0363903c6">pUserData</a>;</div>
-<div class="line"><a name="l15562"></a><span class="lineno">15562</span>&#160;        m_DeviceMemoryCallbacks.<a class="code" href="struct_vma_device_memory_callbacks.html#a4f17f7b255101e733b44d5633aceabfb">pfnAllocate</a> = pCreateInfo-&gt;<a class="code" href="struct_vma_allocator_create_info.html#af1380969b5e1ea4c3184a877892d260e">pDeviceMemoryCallbacks</a>-&gt;<a class="code" href="struct_vma_device_memory_callbacks.html#a4f17f7b255101e733b44d5633aceabfb">pfnAllocate</a>;</div>
-<div class="line"><a name="l15563"></a><span class="lineno">15563</span>&#160;        m_DeviceMemoryCallbacks.<a class="code" href="struct_vma_device_memory_callbacks.html#abe8a3328bbc916f6f712fdb6b299444c">pfnFree</a> = pCreateInfo-&gt;<a class="code" href="struct_vma_allocator_create_info.html#af1380969b5e1ea4c3184a877892d260e">pDeviceMemoryCallbacks</a>-&gt;<a class="code" href="struct_vma_device_memory_callbacks.html#abe8a3328bbc916f6f712fdb6b299444c">pfnFree</a>;</div>
-<div class="line"><a name="l15564"></a><span class="lineno">15564</span>&#160;    }</div>
-<div class="line"><a name="l15565"></a><span class="lineno">15565</span>&#160; </div>
-<div class="line"><a name="l15566"></a><span class="lineno">15566</span>&#160;    ImportVulkanFunctions(pCreateInfo-&gt;<a class="code" href="struct_vma_allocator_create_info.html#a3dc197be3227da7338b1643f70db36bd">pVulkanFunctions</a>);</div>
-<div class="line"><a name="l15567"></a><span class="lineno">15567</span>&#160; </div>
-<div class="line"><a name="l15568"></a><span class="lineno">15568</span>&#160;    (*m_VulkanFunctions.vkGetPhysicalDeviceProperties)(m_PhysicalDevice, &amp;m_PhysicalDeviceProperties);</div>
-<div class="line"><a name="l15569"></a><span class="lineno">15569</span>&#160;    (*m_VulkanFunctions.vkGetPhysicalDeviceMemoryProperties)(m_PhysicalDevice, &amp;m_MemProps);</div>
-<div class="line"><a name="l15570"></a><span class="lineno">15570</span>&#160; </div>
-<div class="line"><a name="l15571"></a><span class="lineno">15571</span>&#160;    VMA_ASSERT(VmaIsPow2(VMA_DEBUG_ALIGNMENT));</div>
-<div class="line"><a name="l15572"></a><span class="lineno">15572</span>&#160;    VMA_ASSERT(VmaIsPow2(VMA_DEBUG_MIN_BUFFER_IMAGE_GRANULARITY));</div>
-<div class="line"><a name="l15573"></a><span class="lineno">15573</span>&#160;    VMA_ASSERT(VmaIsPow2(m_PhysicalDeviceProperties.limits.bufferImageGranularity));</div>
-<div class="line"><a name="l15574"></a><span class="lineno">15574</span>&#160;    VMA_ASSERT(VmaIsPow2(m_PhysicalDeviceProperties.limits.nonCoherentAtomSize));</div>
+<div class="line"><a name="l15551"></a><span class="lineno">15551</span>&#160;    VmaMutexLock lock(m_FileMutex, m_UseMutex);</div>
+<div class="line"><a name="l15552"></a><span class="lineno">15552</span>&#160;    UserDataString userDataStr(createInfo.<a class="code" href="struct_vma_allocation_create_info.html#add09658ac14fe290ace25470ddd6d41b">flags</a>, createInfo.<a class="code" href="struct_vma_allocation_create_info.html#a8259e85c272683434f4abb4ddddffe19">pUserData</a>);</div>
+<div class="line"><a name="l15553"></a><span class="lineno">15553</span>&#160;    fprintf(m_File, <span class="stringliteral">&quot;%u,%.3f,%u,vmaAllocateMemoryForImage,%llu,%llu,%u,%u,%u,%u,%u,%u,%u,%u,%p,%p,%s\n&quot;</span>, callParams.threadId, callParams.time, frameIndex,</div>
+<div class="line"><a name="l15554"></a><span class="lineno">15554</span>&#160;        vkMemReq.size,</div>
+<div class="line"><a name="l15555"></a><span class="lineno">15555</span>&#160;        vkMemReq.alignment,</div>
+<div class="line"><a name="l15556"></a><span class="lineno">15556</span>&#160;        vkMemReq.memoryTypeBits,</div>
+<div class="line"><a name="l15557"></a><span class="lineno">15557</span>&#160;        requiresDedicatedAllocation ? 1 : 0,</div>
+<div class="line"><a name="l15558"></a><span class="lineno">15558</span>&#160;        prefersDedicatedAllocation ? 1 : 0,</div>
+<div class="line"><a name="l15559"></a><span class="lineno">15559</span>&#160;        createInfo.<a class="code" href="struct_vma_allocation_create_info.html#add09658ac14fe290ace25470ddd6d41b">flags</a>,</div>
+<div class="line"><a name="l15560"></a><span class="lineno">15560</span>&#160;        createInfo.<a class="code" href="struct_vma_allocation_create_info.html#accb8b06b1f677d858cb9af20705fa910">usage</a>,</div>
+<div class="line"><a name="l15561"></a><span class="lineno">15561</span>&#160;        createInfo.<a class="code" href="struct_vma_allocation_create_info.html#a9166390303ff42d783305bc31c2b6b90">requiredFlags</a>,</div>
+<div class="line"><a name="l15562"></a><span class="lineno">15562</span>&#160;        createInfo.<a class="code" href="struct_vma_allocation_create_info.html#a7fe8d81a1ad10b2a2faacacee5b15d6d">preferredFlags</a>,</div>
+<div class="line"><a name="l15563"></a><span class="lineno">15563</span>&#160;        createInfo.<a class="code" href="struct_vma_allocation_create_info.html#a3bf940c0271d85d6ba32a4d820075055">memoryTypeBits</a>,</div>
+<div class="line"><a name="l15564"></a><span class="lineno">15564</span>&#160;        createInfo.<a class="code" href="struct_vma_allocation_create_info.html#a6272c0555cfd1fe28bff1afeb6190150">pool</a>,</div>
+<div class="line"><a name="l15565"></a><span class="lineno">15565</span>&#160;        allocation,</div>
+<div class="line"><a name="l15566"></a><span class="lineno">15566</span>&#160;        userDataStr.GetString());</div>
+<div class="line"><a name="l15567"></a><span class="lineno">15567</span>&#160;    Flush();</div>
+<div class="line"><a name="l15568"></a><span class="lineno">15568</span>&#160;}</div>
+<div class="line"><a name="l15569"></a><span class="lineno">15569</span>&#160; </div>
+<div class="line"><a name="l15570"></a><span class="lineno">15570</span>&#160;<span class="keywordtype">void</span> VmaRecorder::RecordFreeMemory(uint32_t frameIndex,</div>
+<div class="line"><a name="l15571"></a><span class="lineno">15571</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation)</div>
+<div class="line"><a name="l15572"></a><span class="lineno">15572</span>&#160;{</div>
+<div class="line"><a name="l15573"></a><span class="lineno">15573</span>&#160;    CallParams callParams;</div>
+<div class="line"><a name="l15574"></a><span class="lineno">15574</span>&#160;    GetBasicParams(callParams);</div>
 <div class="line"><a name="l15575"></a><span class="lineno">15575</span>&#160; </div>
-<div class="line"><a name="l15576"></a><span class="lineno">15576</span>&#160;    m_PreferredLargeHeapBlockSize = (pCreateInfo-&gt;<a class="code" href="struct_vma_allocator_create_info.html#a8e4714298e3121cdd8b214a1ae7a637a">preferredLargeHeapBlockSize</a> != 0) ?</div>
-<div class="line"><a name="l15577"></a><span class="lineno">15577</span>&#160;        pCreateInfo-&gt;<a class="code" href="struct_vma_allocator_create_info.html#a8e4714298e3121cdd8b214a1ae7a637a">preferredLargeHeapBlockSize</a> : <span class="keyword">static_cast&lt;</span>VkDeviceSize<span class="keyword">&gt;</span>(VMA_DEFAULT_LARGE_HEAP_BLOCK_SIZE);</div>
-<div class="line"><a name="l15578"></a><span class="lineno">15578</span>&#160; </div>
-<div class="line"><a name="l15579"></a><span class="lineno">15579</span>&#160;    m_GlobalMemoryTypeBits = CalculateGlobalMemoryTypeBits();</div>
-<div class="line"><a name="l15580"></a><span class="lineno">15580</span>&#160; </div>
-<div class="line"><a name="l15581"></a><span class="lineno">15581</span>&#160;    <span class="keywordflow">if</span>(pCreateInfo-&gt;<a class="code" href="struct_vma_allocator_create_info.html#a31c192aa6cbffa33279f6d9f0c47c44b">pHeapSizeLimit</a> != VMA_NULL)</div>
-<div class="line"><a name="l15582"></a><span class="lineno">15582</span>&#160;    {</div>
-<div class="line"><a name="l15583"></a><span class="lineno">15583</span>&#160;        <span class="keywordflow">for</span>(uint32_t heapIndex = 0; heapIndex &lt; GetMemoryHeapCount(); ++heapIndex)</div>
-<div class="line"><a name="l15584"></a><span class="lineno">15584</span>&#160;        {</div>
-<div class="line"><a name="l15585"></a><span class="lineno">15585</span>&#160;            <span class="keyword">const</span> VkDeviceSize limit = pCreateInfo-&gt;<a class="code" href="struct_vma_allocator_create_info.html#a31c192aa6cbffa33279f6d9f0c47c44b">pHeapSizeLimit</a>[heapIndex];</div>
-<div class="line"><a name="l15586"></a><span class="lineno">15586</span>&#160;            <span class="keywordflow">if</span>(limit != VK_WHOLE_SIZE)</div>
-<div class="line"><a name="l15587"></a><span class="lineno">15587</span>&#160;            {</div>
-<div class="line"><a name="l15588"></a><span class="lineno">15588</span>&#160;                m_HeapSizeLimitMask |= 1u &lt;&lt; heapIndex;</div>
-<div class="line"><a name="l15589"></a><span class="lineno">15589</span>&#160;                <span class="keywordflow">if</span>(limit &lt; m_MemProps.memoryHeaps[heapIndex].size)</div>
-<div class="line"><a name="l15590"></a><span class="lineno">15590</span>&#160;                {</div>
-<div class="line"><a name="l15591"></a><span class="lineno">15591</span>&#160;                    m_MemProps.memoryHeaps[heapIndex].size = limit;</div>
-<div class="line"><a name="l15592"></a><span class="lineno">15592</span>&#160;                }</div>
-<div class="line"><a name="l15593"></a><span class="lineno">15593</span>&#160;            }</div>
-<div class="line"><a name="l15594"></a><span class="lineno">15594</span>&#160;        }</div>
-<div class="line"><a name="l15595"></a><span class="lineno">15595</span>&#160;    }</div>
-<div class="line"><a name="l15596"></a><span class="lineno">15596</span>&#160; </div>
-<div class="line"><a name="l15597"></a><span class="lineno">15597</span>&#160;    <span class="keywordflow">for</span>(uint32_t memTypeIndex = 0; memTypeIndex &lt; GetMemoryTypeCount(); ++memTypeIndex)</div>
-<div class="line"><a name="l15598"></a><span class="lineno">15598</span>&#160;    {</div>
-<div class="line"><a name="l15599"></a><span class="lineno">15599</span>&#160;        <span class="keyword">const</span> VkDeviceSize preferredBlockSize = CalcPreferredBlockSize(memTypeIndex);</div>
-<div class="line"><a name="l15600"></a><span class="lineno">15600</span>&#160; </div>
-<div class="line"><a name="l15601"></a><span class="lineno">15601</span>&#160;        m_pBlockVectors[memTypeIndex] = vma_new(<span class="keyword">this</span>, VmaBlockVector)(</div>
-<div class="line"><a name="l15602"></a><span class="lineno">15602</span>&#160;            <span class="keyword">this</span>,</div>
-<div class="line"><a name="l15603"></a><span class="lineno">15603</span>&#160;            VK_NULL_HANDLE, <span class="comment">// hParentPool</span></div>
-<div class="line"><a name="l15604"></a><span class="lineno">15604</span>&#160;            memTypeIndex,</div>
-<div class="line"><a name="l15605"></a><span class="lineno">15605</span>&#160;            preferredBlockSize,</div>
-<div class="line"><a name="l15606"></a><span class="lineno">15606</span>&#160;            0,</div>
-<div class="line"><a name="l15607"></a><span class="lineno">15607</span>&#160;            SIZE_MAX,</div>
-<div class="line"><a name="l15608"></a><span class="lineno">15608</span>&#160;            GetBufferImageGranularity(),</div>
-<div class="line"><a name="l15609"></a><span class="lineno">15609</span>&#160;            pCreateInfo-&gt;<a class="code" href="struct_vma_allocator_create_info.html#a21ea188dd212b8171cb9ecbed4a2a3a7">frameInUseCount</a>,</div>
-<div class="line"><a name="l15610"></a><span class="lineno">15610</span>&#160;            <span class="keyword">false</span>, <span class="comment">// explicitBlockSize</span></div>
-<div class="line"><a name="l15611"></a><span class="lineno">15611</span>&#160;            <span class="keyword">false</span>); <span class="comment">// linearAlgorithm</span></div>
-<div class="line"><a name="l15612"></a><span class="lineno">15612</span>&#160;        <span class="comment">// No need to call m_pBlockVectors[memTypeIndex][blockVectorTypeIndex]-&gt;CreateMinBlocks here,</span></div>
-<div class="line"><a name="l15613"></a><span class="lineno">15613</span>&#160;        <span class="comment">// becase minBlockCount is 0.</span></div>
-<div class="line"><a name="l15614"></a><span class="lineno">15614</span>&#160;        m_pDedicatedAllocations[memTypeIndex] = vma_new(<span class="keyword">this</span>, AllocationVectorType)(VmaStlAllocator&lt;VmaAllocation&gt;(GetAllocationCallbacks()));</div>
-<div class="line"><a name="l15615"></a><span class="lineno">15615</span>&#160; </div>
-<div class="line"><a name="l15616"></a><span class="lineno">15616</span>&#160;    }</div>
-<div class="line"><a name="l15617"></a><span class="lineno">15617</span>&#160;}</div>
+<div class="line"><a name="l15576"></a><span class="lineno">15576</span>&#160;    VmaMutexLock lock(m_FileMutex, m_UseMutex);</div>
+<div class="line"><a name="l15577"></a><span class="lineno">15577</span>&#160;    fprintf(m_File, <span class="stringliteral">&quot;%u,%.3f,%u,vmaFreeMemory,%p\n&quot;</span>, callParams.threadId, callParams.time, frameIndex,</div>
+<div class="line"><a name="l15578"></a><span class="lineno">15578</span>&#160;        allocation);</div>
+<div class="line"><a name="l15579"></a><span class="lineno">15579</span>&#160;    Flush();</div>
+<div class="line"><a name="l15580"></a><span class="lineno">15580</span>&#160;}</div>
+<div class="line"><a name="l15581"></a><span class="lineno">15581</span>&#160; </div>
+<div class="line"><a name="l15582"></a><span class="lineno">15582</span>&#160;<span class="keywordtype">void</span> VmaRecorder::RecordFreeMemoryPages(uint32_t frameIndex,</div>
+<div class="line"><a name="l15583"></a><span class="lineno">15583</span>&#160;    uint64_t allocationCount,</div>
+<div class="line"><a name="l15584"></a><span class="lineno">15584</span>&#160;    <span class="keyword">const</span> <a class="code" href="struct_vma_allocation.html">VmaAllocation</a>* pAllocations)</div>
+<div class="line"><a name="l15585"></a><span class="lineno">15585</span>&#160;{</div>
+<div class="line"><a name="l15586"></a><span class="lineno">15586</span>&#160;    CallParams callParams;</div>
+<div class="line"><a name="l15587"></a><span class="lineno">15587</span>&#160;    GetBasicParams(callParams);</div>
+<div class="line"><a name="l15588"></a><span class="lineno">15588</span>&#160; </div>
+<div class="line"><a name="l15589"></a><span class="lineno">15589</span>&#160;    VmaMutexLock lock(m_FileMutex, m_UseMutex);</div>
+<div class="line"><a name="l15590"></a><span class="lineno">15590</span>&#160;    fprintf(m_File, <span class="stringliteral">&quot;%u,%.3f,%u,vmaFreeMemoryPages,&quot;</span>, callParams.threadId, callParams.time, frameIndex);</div>
+<div class="line"><a name="l15591"></a><span class="lineno">15591</span>&#160;    PrintPointerList(allocationCount, pAllocations);</div>
+<div class="line"><a name="l15592"></a><span class="lineno">15592</span>&#160;    fprintf(m_File, <span class="stringliteral">&quot;\n&quot;</span>);</div>
+<div class="line"><a name="l15593"></a><span class="lineno">15593</span>&#160;    Flush();</div>
+<div class="line"><a name="l15594"></a><span class="lineno">15594</span>&#160;}</div>
+<div class="line"><a name="l15595"></a><span class="lineno">15595</span>&#160; </div>
+<div class="line"><a name="l15596"></a><span class="lineno">15596</span>&#160;<span class="keywordtype">void</span> VmaRecorder::RecordSetAllocationUserData(uint32_t frameIndex,</div>
+<div class="line"><a name="l15597"></a><span class="lineno">15597</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation,</div>
+<div class="line"><a name="l15598"></a><span class="lineno">15598</span>&#160;    <span class="keyword">const</span> <span class="keywordtype">void</span>* pUserData)</div>
+<div class="line"><a name="l15599"></a><span class="lineno">15599</span>&#160;{</div>
+<div class="line"><a name="l15600"></a><span class="lineno">15600</span>&#160;    CallParams callParams;</div>
+<div class="line"><a name="l15601"></a><span class="lineno">15601</span>&#160;    GetBasicParams(callParams);</div>
+<div class="line"><a name="l15602"></a><span class="lineno">15602</span>&#160; </div>
+<div class="line"><a name="l15603"></a><span class="lineno">15603</span>&#160;    VmaMutexLock lock(m_FileMutex, m_UseMutex);</div>
+<div class="line"><a name="l15604"></a><span class="lineno">15604</span>&#160;    UserDataString userDataStr(</div>
+<div class="line"><a name="l15605"></a><span class="lineno">15605</span>&#160;        allocation-&gt;IsUserDataString() ? <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597aa6f24f821cd6a7c5e4a443f7bf59c520">VMA_ALLOCATION_CREATE_USER_DATA_COPY_STRING_BIT</a> : 0,</div>
+<div class="line"><a name="l15606"></a><span class="lineno">15606</span>&#160;        pUserData);</div>
+<div class="line"><a name="l15607"></a><span class="lineno">15607</span>&#160;    fprintf(m_File, <span class="stringliteral">&quot;%u,%.3f,%u,vmaSetAllocationUserData,%p,%s\n&quot;</span>, callParams.threadId, callParams.time, frameIndex,</div>
+<div class="line"><a name="l15608"></a><span class="lineno">15608</span>&#160;        allocation,</div>
+<div class="line"><a name="l15609"></a><span class="lineno">15609</span>&#160;        userDataStr.GetString());</div>
+<div class="line"><a name="l15610"></a><span class="lineno">15610</span>&#160;    Flush();</div>
+<div class="line"><a name="l15611"></a><span class="lineno">15611</span>&#160;}</div>
+<div class="line"><a name="l15612"></a><span class="lineno">15612</span>&#160; </div>
+<div class="line"><a name="l15613"></a><span class="lineno">15613</span>&#160;<span class="keywordtype">void</span> VmaRecorder::RecordCreateLostAllocation(uint32_t frameIndex,</div>
+<div class="line"><a name="l15614"></a><span class="lineno">15614</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation)</div>
+<div class="line"><a name="l15615"></a><span class="lineno">15615</span>&#160;{</div>
+<div class="line"><a name="l15616"></a><span class="lineno">15616</span>&#160;    CallParams callParams;</div>
+<div class="line"><a name="l15617"></a><span class="lineno">15617</span>&#160;    GetBasicParams(callParams);</div>
 <div class="line"><a name="l15618"></a><span class="lineno">15618</span>&#160; </div>
-<div class="line"><a name="l15619"></a><span class="lineno">15619</span>&#160;VkResult VmaAllocator_T::Init(<span class="keyword">const</span> <a class="code" href="struct_vma_allocator_create_info.html">VmaAllocatorCreateInfo</a>* pCreateInfo)</div>
-<div class="line"><a name="l15620"></a><span class="lineno">15620</span>&#160;{</div>
-<div class="line"><a name="l15621"></a><span class="lineno">15621</span>&#160;    VkResult res = VK_SUCCESS;</div>
-<div class="line"><a name="l15622"></a><span class="lineno">15622</span>&#160; </div>
-<div class="line"><a name="l15623"></a><span class="lineno">15623</span>&#160;    <span class="keywordflow">if</span>(pCreateInfo-&gt;<a class="code" href="struct_vma_allocator_create_info.html#ace2aa4877b16a42b0b7673d4e26000ee">pRecordSettings</a> != VMA_NULL &amp;&amp;</div>
-<div class="line"><a name="l15624"></a><span class="lineno">15624</span>&#160;        !VmaStrIsEmpty(pCreateInfo-&gt;<a class="code" href="struct_vma_allocator_create_info.html#ace2aa4877b16a42b0b7673d4e26000ee">pRecordSettings</a>-&gt;<a class="code" href="struct_vma_record_settings.html#a6cb1fdbf6bcb610b68f2010dd629e89d">pFilePath</a>))</div>
-<div class="line"><a name="l15625"></a><span class="lineno">15625</span>&#160;    {</div>
-<div class="line"><a name="l15626"></a><span class="lineno">15626</span>&#160;<span class="preprocessor">#if VMA_RECORDING_ENABLED</span></div>
-<div class="line"><a name="l15627"></a><span class="lineno">15627</span>&#160;        m_pRecorder = vma_new(<span class="keyword">this</span>, VmaRecorder)();</div>
-<div class="line"><a name="l15628"></a><span class="lineno">15628</span>&#160;        res = m_pRecorder-&gt;Init(*pCreateInfo-&gt;<a class="code" href="struct_vma_allocator_create_info.html#ace2aa4877b16a42b0b7673d4e26000ee">pRecordSettings</a>, m_UseMutex);</div>
-<div class="line"><a name="l15629"></a><span class="lineno">15629</span>&#160;        <span class="keywordflow">if</span>(res != VK_SUCCESS)</div>
-<div class="line"><a name="l15630"></a><span class="lineno">15630</span>&#160;        {</div>
-<div class="line"><a name="l15631"></a><span class="lineno">15631</span>&#160;            <span class="keywordflow">return</span> res;</div>
-<div class="line"><a name="l15632"></a><span class="lineno">15632</span>&#160;        }</div>
-<div class="line"><a name="l15633"></a><span class="lineno">15633</span>&#160;        m_pRecorder-&gt;WriteConfiguration(</div>
-<div class="line"><a name="l15634"></a><span class="lineno">15634</span>&#160;            m_PhysicalDeviceProperties,</div>
-<div class="line"><a name="l15635"></a><span class="lineno">15635</span>&#160;            m_MemProps,</div>
-<div class="line"><a name="l15636"></a><span class="lineno">15636</span>&#160;            m_VulkanApiVersion,</div>
-<div class="line"><a name="l15637"></a><span class="lineno">15637</span>&#160;            m_UseKhrDedicatedAllocation,</div>
-<div class="line"><a name="l15638"></a><span class="lineno">15638</span>&#160;            m_UseKhrBindMemory2,</div>
-<div class="line"><a name="l15639"></a><span class="lineno">15639</span>&#160;            m_UseExtMemoryBudget,</div>
-<div class="line"><a name="l15640"></a><span class="lineno">15640</span>&#160;            m_UseAmdDeviceCoherentMemory);</div>
-<div class="line"><a name="l15641"></a><span class="lineno">15641</span>&#160;        m_pRecorder-&gt;RecordCreateAllocator(GetCurrentFrameIndex());</div>
-<div class="line"><a name="l15642"></a><span class="lineno">15642</span>&#160;<span class="preprocessor">#else</span></div>
-<div class="line"><a name="l15643"></a><span class="lineno">15643</span>&#160;        VMA_ASSERT(0 &amp;&amp; <span class="stringliteral">&quot;VmaAllocatorCreateInfo::pRecordSettings used, but not supported due to VMA_RECORDING_ENABLED not defined to 1.&quot;</span>);</div>
-<div class="line"><a name="l15644"></a><span class="lineno">15644</span>&#160;        <span class="keywordflow">return</span> VK_ERROR_FEATURE_NOT_PRESENT;</div>
-<div class="line"><a name="l15645"></a><span class="lineno">15645</span>&#160;<span class="preprocessor">#endif</span></div>
-<div class="line"><a name="l15646"></a><span class="lineno">15646</span>&#160;    }</div>
-<div class="line"><a name="l15647"></a><span class="lineno">15647</span>&#160; </div>
-<div class="line"><a name="l15648"></a><span class="lineno">15648</span>&#160;<span class="preprocessor">#if VMA_MEMORY_BUDGET</span></div>
-<div class="line"><a name="l15649"></a><span class="lineno">15649</span>&#160;    <span class="keywordflow">if</span>(m_UseExtMemoryBudget)</div>
-<div class="line"><a name="l15650"></a><span class="lineno">15650</span>&#160;    {</div>
-<div class="line"><a name="l15651"></a><span class="lineno">15651</span>&#160;        UpdateVulkanBudget();</div>
-<div class="line"><a name="l15652"></a><span class="lineno">15652</span>&#160;    }</div>
-<div class="line"><a name="l15653"></a><span class="lineno">15653</span>&#160;<span class="preprocessor">#endif // #if VMA_MEMORY_BUDGET</span></div>
+<div class="line"><a name="l15619"></a><span class="lineno">15619</span>&#160;    VmaMutexLock lock(m_FileMutex, m_UseMutex);</div>
+<div class="line"><a name="l15620"></a><span class="lineno">15620</span>&#160;    fprintf(m_File, <span class="stringliteral">&quot;%u,%.3f,%u,vmaCreateLostAllocation,%p\n&quot;</span>, callParams.threadId, callParams.time, frameIndex,</div>
+<div class="line"><a name="l15621"></a><span class="lineno">15621</span>&#160;        allocation);</div>
+<div class="line"><a name="l15622"></a><span class="lineno">15622</span>&#160;    Flush();</div>
+<div class="line"><a name="l15623"></a><span class="lineno">15623</span>&#160;}</div>
+<div class="line"><a name="l15624"></a><span class="lineno">15624</span>&#160; </div>
+<div class="line"><a name="l15625"></a><span class="lineno">15625</span>&#160;<span class="keywordtype">void</span> VmaRecorder::RecordMapMemory(uint32_t frameIndex,</div>
+<div class="line"><a name="l15626"></a><span class="lineno">15626</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation)</div>
+<div class="line"><a name="l15627"></a><span class="lineno">15627</span>&#160;{</div>
+<div class="line"><a name="l15628"></a><span class="lineno">15628</span>&#160;    CallParams callParams;</div>
+<div class="line"><a name="l15629"></a><span class="lineno">15629</span>&#160;    GetBasicParams(callParams);</div>
+<div class="line"><a name="l15630"></a><span class="lineno">15630</span>&#160; </div>
+<div class="line"><a name="l15631"></a><span class="lineno">15631</span>&#160;    VmaMutexLock lock(m_FileMutex, m_UseMutex);</div>
+<div class="line"><a name="l15632"></a><span class="lineno">15632</span>&#160;    fprintf(m_File, <span class="stringliteral">&quot;%u,%.3f,%u,vmaMapMemory,%p\n&quot;</span>, callParams.threadId, callParams.time, frameIndex,</div>
+<div class="line"><a name="l15633"></a><span class="lineno">15633</span>&#160;        allocation);</div>
+<div class="line"><a name="l15634"></a><span class="lineno">15634</span>&#160;    Flush();</div>
+<div class="line"><a name="l15635"></a><span class="lineno">15635</span>&#160;}</div>
+<div class="line"><a name="l15636"></a><span class="lineno">15636</span>&#160; </div>
+<div class="line"><a name="l15637"></a><span class="lineno">15637</span>&#160;<span class="keywordtype">void</span> VmaRecorder::RecordUnmapMemory(uint32_t frameIndex,</div>
+<div class="line"><a name="l15638"></a><span class="lineno">15638</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation)</div>
+<div class="line"><a name="l15639"></a><span class="lineno">15639</span>&#160;{</div>
+<div class="line"><a name="l15640"></a><span class="lineno">15640</span>&#160;    CallParams callParams;</div>
+<div class="line"><a name="l15641"></a><span class="lineno">15641</span>&#160;    GetBasicParams(callParams);</div>
+<div class="line"><a name="l15642"></a><span class="lineno">15642</span>&#160; </div>
+<div class="line"><a name="l15643"></a><span class="lineno">15643</span>&#160;    VmaMutexLock lock(m_FileMutex, m_UseMutex);</div>
+<div class="line"><a name="l15644"></a><span class="lineno">15644</span>&#160;    fprintf(m_File, <span class="stringliteral">&quot;%u,%.3f,%u,vmaUnmapMemory,%p\n&quot;</span>, callParams.threadId, callParams.time, frameIndex,</div>
+<div class="line"><a name="l15645"></a><span class="lineno">15645</span>&#160;        allocation);</div>
+<div class="line"><a name="l15646"></a><span class="lineno">15646</span>&#160;    Flush();</div>
+<div class="line"><a name="l15647"></a><span class="lineno">15647</span>&#160;}</div>
+<div class="line"><a name="l15648"></a><span class="lineno">15648</span>&#160; </div>
+<div class="line"><a name="l15649"></a><span class="lineno">15649</span>&#160;<span class="keywordtype">void</span> VmaRecorder::RecordFlushAllocation(uint32_t frameIndex,</div>
+<div class="line"><a name="l15650"></a><span class="lineno">15650</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation, VkDeviceSize offset, VkDeviceSize size)</div>
+<div class="line"><a name="l15651"></a><span class="lineno">15651</span>&#160;{</div>
+<div class="line"><a name="l15652"></a><span class="lineno">15652</span>&#160;    CallParams callParams;</div>
+<div class="line"><a name="l15653"></a><span class="lineno">15653</span>&#160;    GetBasicParams(callParams);</div>
 <div class="line"><a name="l15654"></a><span class="lineno">15654</span>&#160; </div>
-<div class="line"><a name="l15655"></a><span class="lineno">15655</span>&#160;    <span class="keywordflow">return</span> res;</div>
-<div class="line"><a name="l15656"></a><span class="lineno">15656</span>&#160;}</div>
-<div class="line"><a name="l15657"></a><span class="lineno">15657</span>&#160; </div>
-<div class="line"><a name="l15658"></a><span class="lineno">15658</span>&#160;VmaAllocator_T::~VmaAllocator_T()</div>
-<div class="line"><a name="l15659"></a><span class="lineno">15659</span>&#160;{</div>
-<div class="line"><a name="l15660"></a><span class="lineno">15660</span>&#160;<span class="preprocessor">#if VMA_RECORDING_ENABLED</span></div>
-<div class="line"><a name="l15661"></a><span class="lineno">15661</span>&#160;    <span class="keywordflow">if</span>(m_pRecorder != VMA_NULL)</div>
-<div class="line"><a name="l15662"></a><span class="lineno">15662</span>&#160;    {</div>
-<div class="line"><a name="l15663"></a><span class="lineno">15663</span>&#160;        m_pRecorder-&gt;RecordDestroyAllocator(GetCurrentFrameIndex());</div>
-<div class="line"><a name="l15664"></a><span class="lineno">15664</span>&#160;        vma_delete(<span class="keyword">this</span>, m_pRecorder);</div>
-<div class="line"><a name="l15665"></a><span class="lineno">15665</span>&#160;    }</div>
-<div class="line"><a name="l15666"></a><span class="lineno">15666</span>&#160;<span class="preprocessor">#endif</span></div>
-<div class="line"><a name="l15667"></a><span class="lineno">15667</span>&#160;    </div>
-<div class="line"><a name="l15668"></a><span class="lineno">15668</span>&#160;    VMA_ASSERT(m_Pools.empty());</div>
-<div class="line"><a name="l15669"></a><span class="lineno">15669</span>&#160; </div>
-<div class="line"><a name="l15670"></a><span class="lineno">15670</span>&#160;    <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> i = GetMemoryTypeCount(); i--; )</div>
-<div class="line"><a name="l15671"></a><span class="lineno">15671</span>&#160;    {</div>
-<div class="line"><a name="l15672"></a><span class="lineno">15672</span>&#160;        <span class="keywordflow">if</span>(m_pDedicatedAllocations[i] != VMA_NULL &amp;&amp; !m_pDedicatedAllocations[i]-&gt;empty())</div>
-<div class="line"><a name="l15673"></a><span class="lineno">15673</span>&#160;        {</div>
-<div class="line"><a name="l15674"></a><span class="lineno">15674</span>&#160;            VMA_ASSERT(0 &amp;&amp; <span class="stringliteral">&quot;Unfreed dedicated allocations found.&quot;</span>);</div>
-<div class="line"><a name="l15675"></a><span class="lineno">15675</span>&#160;        }</div>
+<div class="line"><a name="l15655"></a><span class="lineno">15655</span>&#160;    VmaMutexLock lock(m_FileMutex, m_UseMutex);</div>
+<div class="line"><a name="l15656"></a><span class="lineno">15656</span>&#160;    fprintf(m_File, <span class="stringliteral">&quot;%u,%.3f,%u,vmaFlushAllocation,%p,%llu,%llu\n&quot;</span>, callParams.threadId, callParams.time, frameIndex,</div>
+<div class="line"><a name="l15657"></a><span class="lineno">15657</span>&#160;        allocation,</div>
+<div class="line"><a name="l15658"></a><span class="lineno">15658</span>&#160;        offset,</div>
+<div class="line"><a name="l15659"></a><span class="lineno">15659</span>&#160;        size);</div>
+<div class="line"><a name="l15660"></a><span class="lineno">15660</span>&#160;    Flush();</div>
+<div class="line"><a name="l15661"></a><span class="lineno">15661</span>&#160;}</div>
+<div class="line"><a name="l15662"></a><span class="lineno">15662</span>&#160; </div>
+<div class="line"><a name="l15663"></a><span class="lineno">15663</span>&#160;<span class="keywordtype">void</span> VmaRecorder::RecordInvalidateAllocation(uint32_t frameIndex,</div>
+<div class="line"><a name="l15664"></a><span class="lineno">15664</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation, VkDeviceSize offset, VkDeviceSize size)</div>
+<div class="line"><a name="l15665"></a><span class="lineno">15665</span>&#160;{</div>
+<div class="line"><a name="l15666"></a><span class="lineno">15666</span>&#160;    CallParams callParams;</div>
+<div class="line"><a name="l15667"></a><span class="lineno">15667</span>&#160;    GetBasicParams(callParams);</div>
+<div class="line"><a name="l15668"></a><span class="lineno">15668</span>&#160; </div>
+<div class="line"><a name="l15669"></a><span class="lineno">15669</span>&#160;    VmaMutexLock lock(m_FileMutex, m_UseMutex);</div>
+<div class="line"><a name="l15670"></a><span class="lineno">15670</span>&#160;    fprintf(m_File, <span class="stringliteral">&quot;%u,%.3f,%u,vmaInvalidateAllocation,%p,%llu,%llu\n&quot;</span>, callParams.threadId, callParams.time, frameIndex,</div>
+<div class="line"><a name="l15671"></a><span class="lineno">15671</span>&#160;        allocation,</div>
+<div class="line"><a name="l15672"></a><span class="lineno">15672</span>&#160;        offset,</div>
+<div class="line"><a name="l15673"></a><span class="lineno">15673</span>&#160;        size);</div>
+<div class="line"><a name="l15674"></a><span class="lineno">15674</span>&#160;    Flush();</div>
+<div class="line"><a name="l15675"></a><span class="lineno">15675</span>&#160;}</div>
 <div class="line"><a name="l15676"></a><span class="lineno">15676</span>&#160; </div>
-<div class="line"><a name="l15677"></a><span class="lineno">15677</span>&#160;        vma_delete(<span class="keyword">this</span>, m_pDedicatedAllocations[i]);</div>
-<div class="line"><a name="l15678"></a><span class="lineno">15678</span>&#160;        vma_delete(<span class="keyword">this</span>, m_pBlockVectors[i]);</div>
-<div class="line"><a name="l15679"></a><span class="lineno">15679</span>&#160;    }</div>
-<div class="line"><a name="l15680"></a><span class="lineno">15680</span>&#160;}</div>
-<div class="line"><a name="l15681"></a><span class="lineno">15681</span>&#160; </div>
-<div class="line"><a name="l15682"></a><span class="lineno">15682</span>&#160;<span class="keywordtype">void</span> VmaAllocator_T::ImportVulkanFunctions(<span class="keyword">const</span> <a class="code" href="struct_vma_vulkan_functions.html">VmaVulkanFunctions</a>* pVulkanFunctions)</div>
-<div class="line"><a name="l15683"></a><span class="lineno">15683</span>&#160;{</div>
-<div class="line"><a name="l15684"></a><span class="lineno">15684</span>&#160;<span class="preprocessor">#if VMA_STATIC_VULKAN_FUNCTIONS == 1</span></div>
-<div class="line"><a name="l15685"></a><span class="lineno">15685</span>&#160;    ImportVulkanFunctions_Static();</div>
-<div class="line"><a name="l15686"></a><span class="lineno">15686</span>&#160;<span class="preprocessor">#endif</span></div>
-<div class="line"><a name="l15687"></a><span class="lineno">15687</span>&#160; </div>
-<div class="line"><a name="l15688"></a><span class="lineno">15688</span>&#160;    <span class="keywordflow">if</span>(pVulkanFunctions != VMA_NULL)</div>
-<div class="line"><a name="l15689"></a><span class="lineno">15689</span>&#160;    {</div>
-<div class="line"><a name="l15690"></a><span class="lineno">15690</span>&#160;        ImportVulkanFunctions_Custom(pVulkanFunctions);</div>
-<div class="line"><a name="l15691"></a><span class="lineno">15691</span>&#160;    }</div>
-<div class="line"><a name="l15692"></a><span class="lineno">15692</span>&#160; </div>
-<div class="line"><a name="l15693"></a><span class="lineno">15693</span>&#160;<span class="preprocessor">#if VMA_DYNAMIC_VULKAN_FUNCTIONS == 1</span></div>
-<div class="line"><a name="l15694"></a><span class="lineno">15694</span>&#160;    ImportVulkanFunctions_Dynamic();</div>
-<div class="line"><a name="l15695"></a><span class="lineno">15695</span>&#160;<span class="preprocessor">#endif</span></div>
-<div class="line"><a name="l15696"></a><span class="lineno">15696</span>&#160; </div>
-<div class="line"><a name="l15697"></a><span class="lineno">15697</span>&#160;    ValidateVulkanFunctions();</div>
-<div class="line"><a name="l15698"></a><span class="lineno">15698</span>&#160;}</div>
-<div class="line"><a name="l15699"></a><span class="lineno">15699</span>&#160; </div>
-<div class="line"><a name="l15700"></a><span class="lineno">15700</span>&#160;<span class="preprocessor">#if VMA_STATIC_VULKAN_FUNCTIONS == 1</span></div>
-<div class="line"><a name="l15701"></a><span class="lineno">15701</span>&#160; </div>
-<div class="line"><a name="l15702"></a><span class="lineno">15702</span>&#160;<span class="keywordtype">void</span> VmaAllocator_T::ImportVulkanFunctions_Static()</div>
-<div class="line"><a name="l15703"></a><span class="lineno">15703</span>&#160;{</div>
-<div class="line"><a name="l15704"></a><span class="lineno">15704</span>&#160;    <span class="comment">// Vulkan 1.0</span></div>
-<div class="line"><a name="l15705"></a><span class="lineno">15705</span>&#160;    m_VulkanFunctions.vkGetPhysicalDeviceProperties = (PFN_vkGetPhysicalDeviceProperties)vkGetPhysicalDeviceProperties;</div>
-<div class="line"><a name="l15706"></a><span class="lineno">15706</span>&#160;    m_VulkanFunctions.vkGetPhysicalDeviceMemoryProperties = (PFN_vkGetPhysicalDeviceMemoryProperties)vkGetPhysicalDeviceMemoryProperties;</div>
-<div class="line"><a name="l15707"></a><span class="lineno">15707</span>&#160;    m_VulkanFunctions.vkAllocateMemory = (PFN_vkAllocateMemory)vkAllocateMemory;</div>
-<div class="line"><a name="l15708"></a><span class="lineno">15708</span>&#160;    m_VulkanFunctions.vkFreeMemory = (PFN_vkFreeMemory)vkFreeMemory;</div>
-<div class="line"><a name="l15709"></a><span class="lineno">15709</span>&#160;    m_VulkanFunctions.vkMapMemory = (PFN_vkMapMemory)vkMapMemory;</div>
-<div class="line"><a name="l15710"></a><span class="lineno">15710</span>&#160;    m_VulkanFunctions.vkUnmapMemory = (PFN_vkUnmapMemory)vkUnmapMemory;</div>
-<div class="line"><a name="l15711"></a><span class="lineno">15711</span>&#160;    m_VulkanFunctions.vkFlushMappedMemoryRanges = (PFN_vkFlushMappedMemoryRanges)vkFlushMappedMemoryRanges;</div>
-<div class="line"><a name="l15712"></a><span class="lineno">15712</span>&#160;    m_VulkanFunctions.vkInvalidateMappedMemoryRanges = (PFN_vkInvalidateMappedMemoryRanges)vkInvalidateMappedMemoryRanges;</div>
-<div class="line"><a name="l15713"></a><span class="lineno">15713</span>&#160;    m_VulkanFunctions.vkBindBufferMemory = (PFN_vkBindBufferMemory)vkBindBufferMemory;</div>
-<div class="line"><a name="l15714"></a><span class="lineno">15714</span>&#160;    m_VulkanFunctions.vkBindImageMemory = (PFN_vkBindImageMemory)vkBindImageMemory;</div>
-<div class="line"><a name="l15715"></a><span class="lineno">15715</span>&#160;    m_VulkanFunctions.vkGetBufferMemoryRequirements = (PFN_vkGetBufferMemoryRequirements)vkGetBufferMemoryRequirements;</div>
-<div class="line"><a name="l15716"></a><span class="lineno">15716</span>&#160;    m_VulkanFunctions.vkGetImageMemoryRequirements = (PFN_vkGetImageMemoryRequirements)vkGetImageMemoryRequirements;</div>
-<div class="line"><a name="l15717"></a><span class="lineno">15717</span>&#160;    m_VulkanFunctions.vkCreateBuffer = (PFN_vkCreateBuffer)vkCreateBuffer;</div>
-<div class="line"><a name="l15718"></a><span class="lineno">15718</span>&#160;    m_VulkanFunctions.vkDestroyBuffer = (PFN_vkDestroyBuffer)vkDestroyBuffer;</div>
-<div class="line"><a name="l15719"></a><span class="lineno">15719</span>&#160;    m_VulkanFunctions.vkCreateImage = (PFN_vkCreateImage)vkCreateImage;</div>
-<div class="line"><a name="l15720"></a><span class="lineno">15720</span>&#160;    m_VulkanFunctions.vkDestroyImage = (PFN_vkDestroyImage)vkDestroyImage;</div>
-<div class="line"><a name="l15721"></a><span class="lineno">15721</span>&#160;    m_VulkanFunctions.vkCmdCopyBuffer = (PFN_vkCmdCopyBuffer)vkCmdCopyBuffer;</div>
-<div class="line"><a name="l15722"></a><span class="lineno">15722</span>&#160; </div>
-<div class="line"><a name="l15723"></a><span class="lineno">15723</span>&#160;    <span class="comment">// Vulkan 1.1</span></div>
-<div class="line"><a name="l15724"></a><span class="lineno">15724</span>&#160;<span class="preprocessor">#if VMA_VULKAN_VERSION &gt;= 1001000</span></div>
-<div class="line"><a name="l15725"></a><span class="lineno">15725</span>&#160;    <span class="keywordflow">if</span>(m_VulkanApiVersion &gt;= VK_MAKE_VERSION(1, 1, 0))</div>
-<div class="line"><a name="l15726"></a><span class="lineno">15726</span>&#160;    {</div>
-<div class="line"><a name="l15727"></a><span class="lineno">15727</span>&#160;        m_VulkanFunctions.vkGetBufferMemoryRequirements2KHR = (PFN_vkGetBufferMemoryRequirements2)vkGetBufferMemoryRequirements2;</div>
-<div class="line"><a name="l15728"></a><span class="lineno">15728</span>&#160;        m_VulkanFunctions.vkGetImageMemoryRequirements2KHR = (PFN_vkGetImageMemoryRequirements2)vkGetImageMemoryRequirements2;</div>
-<div class="line"><a name="l15729"></a><span class="lineno">15729</span>&#160;        m_VulkanFunctions.vkBindBufferMemory2KHR = (PFN_vkBindBufferMemory2)vkBindBufferMemory2;</div>
-<div class="line"><a name="l15730"></a><span class="lineno">15730</span>&#160;        m_VulkanFunctions.vkBindImageMemory2KHR = (PFN_vkBindImageMemory2)vkBindImageMemory2;</div>
-<div class="line"><a name="l15731"></a><span class="lineno">15731</span>&#160;        m_VulkanFunctions.vkGetPhysicalDeviceMemoryProperties2KHR = (PFN_vkGetPhysicalDeviceMemoryProperties2)vkGetPhysicalDeviceMemoryProperties2;</div>
-<div class="line"><a name="l15732"></a><span class="lineno">15732</span>&#160;    }</div>
-<div class="line"><a name="l15733"></a><span class="lineno">15733</span>&#160;<span class="preprocessor">#endif</span></div>
-<div class="line"><a name="l15734"></a><span class="lineno">15734</span>&#160;}</div>
-<div class="line"><a name="l15735"></a><span class="lineno">15735</span>&#160; </div>
-<div class="line"><a name="l15736"></a><span class="lineno">15736</span>&#160;<span class="preprocessor">#endif // #if VMA_STATIC_VULKAN_FUNCTIONS == 1</span></div>
+<div class="line"><a name="l15677"></a><span class="lineno">15677</span>&#160;<span class="keywordtype">void</span> VmaRecorder::RecordCreateBuffer(uint32_t frameIndex,</div>
+<div class="line"><a name="l15678"></a><span class="lineno">15678</span>&#160;    <span class="keyword">const</span> VkBufferCreateInfo&amp; bufCreateInfo,</div>
+<div class="line"><a name="l15679"></a><span class="lineno">15679</span>&#160;    <span class="keyword">const</span> <a class="code" href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a>&amp; allocCreateInfo,</div>
+<div class="line"><a name="l15680"></a><span class="lineno">15680</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation)</div>
+<div class="line"><a name="l15681"></a><span class="lineno">15681</span>&#160;{</div>
+<div class="line"><a name="l15682"></a><span class="lineno">15682</span>&#160;    CallParams callParams;</div>
+<div class="line"><a name="l15683"></a><span class="lineno">15683</span>&#160;    GetBasicParams(callParams);</div>
+<div class="line"><a name="l15684"></a><span class="lineno">15684</span>&#160; </div>
+<div class="line"><a name="l15685"></a><span class="lineno">15685</span>&#160;    VmaMutexLock lock(m_FileMutex, m_UseMutex);</div>
+<div class="line"><a name="l15686"></a><span class="lineno">15686</span>&#160;    UserDataString userDataStr(allocCreateInfo.<a class="code" href="struct_vma_allocation_create_info.html#add09658ac14fe290ace25470ddd6d41b">flags</a>, allocCreateInfo.<a class="code" href="struct_vma_allocation_create_info.html#a8259e85c272683434f4abb4ddddffe19">pUserData</a>);</div>
+<div class="line"><a name="l15687"></a><span class="lineno">15687</span>&#160;    fprintf(m_File, <span class="stringliteral">&quot;%u,%.3f,%u,vmaCreateBuffer,%u,%llu,%u,%u,%u,%u,%u,%u,%u,%p,%p,%s\n&quot;</span>, callParams.threadId, callParams.time, frameIndex,</div>
+<div class="line"><a name="l15688"></a><span class="lineno">15688</span>&#160;        bufCreateInfo.flags,</div>
+<div class="line"><a name="l15689"></a><span class="lineno">15689</span>&#160;        bufCreateInfo.size,</div>
+<div class="line"><a name="l15690"></a><span class="lineno">15690</span>&#160;        bufCreateInfo.usage,</div>
+<div class="line"><a name="l15691"></a><span class="lineno">15691</span>&#160;        bufCreateInfo.sharingMode,</div>
+<div class="line"><a name="l15692"></a><span class="lineno">15692</span>&#160;        allocCreateInfo.<a class="code" href="struct_vma_allocation_create_info.html#add09658ac14fe290ace25470ddd6d41b">flags</a>,</div>
+<div class="line"><a name="l15693"></a><span class="lineno">15693</span>&#160;        allocCreateInfo.<a class="code" href="struct_vma_allocation_create_info.html#accb8b06b1f677d858cb9af20705fa910">usage</a>,</div>
+<div class="line"><a name="l15694"></a><span class="lineno">15694</span>&#160;        allocCreateInfo.<a class="code" href="struct_vma_allocation_create_info.html#a9166390303ff42d783305bc31c2b6b90">requiredFlags</a>,</div>
+<div class="line"><a name="l15695"></a><span class="lineno">15695</span>&#160;        allocCreateInfo.<a class="code" href="struct_vma_allocation_create_info.html#a7fe8d81a1ad10b2a2faacacee5b15d6d">preferredFlags</a>,</div>
+<div class="line"><a name="l15696"></a><span class="lineno">15696</span>&#160;        allocCreateInfo.<a class="code" href="struct_vma_allocation_create_info.html#a3bf940c0271d85d6ba32a4d820075055">memoryTypeBits</a>,</div>
+<div class="line"><a name="l15697"></a><span class="lineno">15697</span>&#160;        allocCreateInfo.<a class="code" href="struct_vma_allocation_create_info.html#a6272c0555cfd1fe28bff1afeb6190150">pool</a>,</div>
+<div class="line"><a name="l15698"></a><span class="lineno">15698</span>&#160;        allocation,</div>
+<div class="line"><a name="l15699"></a><span class="lineno">15699</span>&#160;        userDataStr.GetString());</div>
+<div class="line"><a name="l15700"></a><span class="lineno">15700</span>&#160;    Flush();</div>
+<div class="line"><a name="l15701"></a><span class="lineno">15701</span>&#160;}</div>
+<div class="line"><a name="l15702"></a><span class="lineno">15702</span>&#160; </div>
+<div class="line"><a name="l15703"></a><span class="lineno">15703</span>&#160;<span class="keywordtype">void</span> VmaRecorder::RecordCreateImage(uint32_t frameIndex,</div>
+<div class="line"><a name="l15704"></a><span class="lineno">15704</span>&#160;    <span class="keyword">const</span> VkImageCreateInfo&amp; imageCreateInfo,</div>
+<div class="line"><a name="l15705"></a><span class="lineno">15705</span>&#160;    <span class="keyword">const</span> <a class="code" href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a>&amp; allocCreateInfo,</div>
+<div class="line"><a name="l15706"></a><span class="lineno">15706</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation)</div>
+<div class="line"><a name="l15707"></a><span class="lineno">15707</span>&#160;{</div>
+<div class="line"><a name="l15708"></a><span class="lineno">15708</span>&#160;    CallParams callParams;</div>
+<div class="line"><a name="l15709"></a><span class="lineno">15709</span>&#160;    GetBasicParams(callParams);</div>
+<div class="line"><a name="l15710"></a><span class="lineno">15710</span>&#160; </div>
+<div class="line"><a name="l15711"></a><span class="lineno">15711</span>&#160;    VmaMutexLock lock(m_FileMutex, m_UseMutex);</div>
+<div class="line"><a name="l15712"></a><span class="lineno">15712</span>&#160;    UserDataString userDataStr(allocCreateInfo.<a class="code" href="struct_vma_allocation_create_info.html#add09658ac14fe290ace25470ddd6d41b">flags</a>, allocCreateInfo.<a class="code" href="struct_vma_allocation_create_info.html#a8259e85c272683434f4abb4ddddffe19">pUserData</a>);</div>
+<div class="line"><a name="l15713"></a><span class="lineno">15713</span>&#160;    fprintf(m_File, <span class="stringliteral">&quot;%u,%.3f,%u,vmaCreateImage,%u,%u,%u,%u,%u,%u,%u,%u,%u,%u,%u,%u,%u,%u,%u,%u,%u,%u,%p,%p,%s\n&quot;</span>, callParams.threadId, callParams.time, frameIndex,</div>
+<div class="line"><a name="l15714"></a><span class="lineno">15714</span>&#160;        imageCreateInfo.flags,</div>
+<div class="line"><a name="l15715"></a><span class="lineno">15715</span>&#160;        imageCreateInfo.imageType,</div>
+<div class="line"><a name="l15716"></a><span class="lineno">15716</span>&#160;        imageCreateInfo.format,</div>
+<div class="line"><a name="l15717"></a><span class="lineno">15717</span>&#160;        imageCreateInfo.extent.width,</div>
+<div class="line"><a name="l15718"></a><span class="lineno">15718</span>&#160;        imageCreateInfo.extent.height,</div>
+<div class="line"><a name="l15719"></a><span class="lineno">15719</span>&#160;        imageCreateInfo.extent.depth,</div>
+<div class="line"><a name="l15720"></a><span class="lineno">15720</span>&#160;        imageCreateInfo.mipLevels,</div>
+<div class="line"><a name="l15721"></a><span class="lineno">15721</span>&#160;        imageCreateInfo.arrayLayers,</div>
+<div class="line"><a name="l15722"></a><span class="lineno">15722</span>&#160;        imageCreateInfo.samples,</div>
+<div class="line"><a name="l15723"></a><span class="lineno">15723</span>&#160;        imageCreateInfo.tiling,</div>
+<div class="line"><a name="l15724"></a><span class="lineno">15724</span>&#160;        imageCreateInfo.usage,</div>
+<div class="line"><a name="l15725"></a><span class="lineno">15725</span>&#160;        imageCreateInfo.sharingMode,</div>
+<div class="line"><a name="l15726"></a><span class="lineno">15726</span>&#160;        imageCreateInfo.initialLayout,</div>
+<div class="line"><a name="l15727"></a><span class="lineno">15727</span>&#160;        allocCreateInfo.<a class="code" href="struct_vma_allocation_create_info.html#add09658ac14fe290ace25470ddd6d41b">flags</a>,</div>
+<div class="line"><a name="l15728"></a><span class="lineno">15728</span>&#160;        allocCreateInfo.<a class="code" href="struct_vma_allocation_create_info.html#accb8b06b1f677d858cb9af20705fa910">usage</a>,</div>
+<div class="line"><a name="l15729"></a><span class="lineno">15729</span>&#160;        allocCreateInfo.<a class="code" href="struct_vma_allocation_create_info.html#a9166390303ff42d783305bc31c2b6b90">requiredFlags</a>,</div>
+<div class="line"><a name="l15730"></a><span class="lineno">15730</span>&#160;        allocCreateInfo.<a class="code" href="struct_vma_allocation_create_info.html#a7fe8d81a1ad10b2a2faacacee5b15d6d">preferredFlags</a>,</div>
+<div class="line"><a name="l15731"></a><span class="lineno">15731</span>&#160;        allocCreateInfo.<a class="code" href="struct_vma_allocation_create_info.html#a3bf940c0271d85d6ba32a4d820075055">memoryTypeBits</a>,</div>
+<div class="line"><a name="l15732"></a><span class="lineno">15732</span>&#160;        allocCreateInfo.<a class="code" href="struct_vma_allocation_create_info.html#a6272c0555cfd1fe28bff1afeb6190150">pool</a>,</div>
+<div class="line"><a name="l15733"></a><span class="lineno">15733</span>&#160;        allocation,</div>
+<div class="line"><a name="l15734"></a><span class="lineno">15734</span>&#160;        userDataStr.GetString());</div>
+<div class="line"><a name="l15735"></a><span class="lineno">15735</span>&#160;    Flush();</div>
+<div class="line"><a name="l15736"></a><span class="lineno">15736</span>&#160;}</div>
 <div class="line"><a name="l15737"></a><span class="lineno">15737</span>&#160; </div>
-<div class="line"><a name="l15738"></a><span class="lineno">15738</span>&#160;<span class="keywordtype">void</span> VmaAllocator_T::ImportVulkanFunctions_Custom(<span class="keyword">const</span> <a class="code" href="struct_vma_vulkan_functions.html">VmaVulkanFunctions</a>* pVulkanFunctions)</div>
-<div class="line"><a name="l15739"></a><span class="lineno">15739</span>&#160;{</div>
-<div class="line"><a name="l15740"></a><span class="lineno">15740</span>&#160;    VMA_ASSERT(pVulkanFunctions != VMA_NULL);</div>
-<div class="line"><a name="l15741"></a><span class="lineno">15741</span>&#160; </div>
-<div class="line"><a name="l15742"></a><span class="lineno">15742</span>&#160;<span class="preprocessor">#define VMA_COPY_IF_NOT_NULL(funcName) \</span></div>
-<div class="line"><a name="l15743"></a><span class="lineno">15743</span>&#160;<span class="preprocessor">    if(pVulkanFunctions-&gt;funcName != VMA_NULL) m_VulkanFunctions.funcName = pVulkanFunctions-&gt;funcName;</span></div>
-<div class="line"><a name="l15744"></a><span class="lineno">15744</span>&#160; </div>
-<div class="line"><a name="l15745"></a><span class="lineno">15745</span>&#160;    VMA_COPY_IF_NOT_NULL(vkGetPhysicalDeviceProperties);</div>
-<div class="line"><a name="l15746"></a><span class="lineno">15746</span>&#160;    VMA_COPY_IF_NOT_NULL(vkGetPhysicalDeviceMemoryProperties);</div>
-<div class="line"><a name="l15747"></a><span class="lineno">15747</span>&#160;    VMA_COPY_IF_NOT_NULL(vkAllocateMemory);</div>
-<div class="line"><a name="l15748"></a><span class="lineno">15748</span>&#160;    VMA_COPY_IF_NOT_NULL(vkFreeMemory);</div>
-<div class="line"><a name="l15749"></a><span class="lineno">15749</span>&#160;    VMA_COPY_IF_NOT_NULL(vkMapMemory);</div>
-<div class="line"><a name="l15750"></a><span class="lineno">15750</span>&#160;    VMA_COPY_IF_NOT_NULL(vkUnmapMemory);</div>
-<div class="line"><a name="l15751"></a><span class="lineno">15751</span>&#160;    VMA_COPY_IF_NOT_NULL(vkFlushMappedMemoryRanges);</div>
-<div class="line"><a name="l15752"></a><span class="lineno">15752</span>&#160;    VMA_COPY_IF_NOT_NULL(vkInvalidateMappedMemoryRanges);</div>
-<div class="line"><a name="l15753"></a><span class="lineno">15753</span>&#160;    VMA_COPY_IF_NOT_NULL(vkBindBufferMemory);</div>
-<div class="line"><a name="l15754"></a><span class="lineno">15754</span>&#160;    VMA_COPY_IF_NOT_NULL(vkBindImageMemory);</div>
-<div class="line"><a name="l15755"></a><span class="lineno">15755</span>&#160;    VMA_COPY_IF_NOT_NULL(vkGetBufferMemoryRequirements);</div>
-<div class="line"><a name="l15756"></a><span class="lineno">15756</span>&#160;    VMA_COPY_IF_NOT_NULL(vkGetImageMemoryRequirements);</div>
-<div class="line"><a name="l15757"></a><span class="lineno">15757</span>&#160;    VMA_COPY_IF_NOT_NULL(vkCreateBuffer);</div>
-<div class="line"><a name="l15758"></a><span class="lineno">15758</span>&#160;    VMA_COPY_IF_NOT_NULL(vkDestroyBuffer);</div>
-<div class="line"><a name="l15759"></a><span class="lineno">15759</span>&#160;    VMA_COPY_IF_NOT_NULL(vkCreateImage);</div>
-<div class="line"><a name="l15760"></a><span class="lineno">15760</span>&#160;    VMA_COPY_IF_NOT_NULL(vkDestroyImage);</div>
-<div class="line"><a name="l15761"></a><span class="lineno">15761</span>&#160;    VMA_COPY_IF_NOT_NULL(vkCmdCopyBuffer);</div>
-<div class="line"><a name="l15762"></a><span class="lineno">15762</span>&#160; </div>
-<div class="line"><a name="l15763"></a><span class="lineno">15763</span>&#160;<span class="preprocessor">#if VMA_DEDICATED_ALLOCATION || VMA_VULKAN_VERSION &gt;= 1001000</span></div>
-<div class="line"><a name="l15764"></a><span class="lineno">15764</span>&#160;    VMA_COPY_IF_NOT_NULL(vkGetBufferMemoryRequirements2KHR);</div>
-<div class="line"><a name="l15765"></a><span class="lineno">15765</span>&#160;    VMA_COPY_IF_NOT_NULL(vkGetImageMemoryRequirements2KHR);</div>
-<div class="line"><a name="l15766"></a><span class="lineno">15766</span>&#160;<span class="preprocessor">#endif</span></div>
+<div class="line"><a name="l15738"></a><span class="lineno">15738</span>&#160;<span class="keywordtype">void</span> VmaRecorder::RecordDestroyBuffer(uint32_t frameIndex,</div>
+<div class="line"><a name="l15739"></a><span class="lineno">15739</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation)</div>
+<div class="line"><a name="l15740"></a><span class="lineno">15740</span>&#160;{</div>
+<div class="line"><a name="l15741"></a><span class="lineno">15741</span>&#160;    CallParams callParams;</div>
+<div class="line"><a name="l15742"></a><span class="lineno">15742</span>&#160;    GetBasicParams(callParams);</div>
+<div class="line"><a name="l15743"></a><span class="lineno">15743</span>&#160; </div>
+<div class="line"><a name="l15744"></a><span class="lineno">15744</span>&#160;    VmaMutexLock lock(m_FileMutex, m_UseMutex);</div>
+<div class="line"><a name="l15745"></a><span class="lineno">15745</span>&#160;    fprintf(m_File, <span class="stringliteral">&quot;%u,%.3f,%u,vmaDestroyBuffer,%p\n&quot;</span>, callParams.threadId, callParams.time, frameIndex,</div>
+<div class="line"><a name="l15746"></a><span class="lineno">15746</span>&#160;        allocation);</div>
+<div class="line"><a name="l15747"></a><span class="lineno">15747</span>&#160;    Flush();</div>
+<div class="line"><a name="l15748"></a><span class="lineno">15748</span>&#160;}</div>
+<div class="line"><a name="l15749"></a><span class="lineno">15749</span>&#160; </div>
+<div class="line"><a name="l15750"></a><span class="lineno">15750</span>&#160;<span class="keywordtype">void</span> VmaRecorder::RecordDestroyImage(uint32_t frameIndex,</div>
+<div class="line"><a name="l15751"></a><span class="lineno">15751</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation)</div>
+<div class="line"><a name="l15752"></a><span class="lineno">15752</span>&#160;{</div>
+<div class="line"><a name="l15753"></a><span class="lineno">15753</span>&#160;    CallParams callParams;</div>
+<div class="line"><a name="l15754"></a><span class="lineno">15754</span>&#160;    GetBasicParams(callParams);</div>
+<div class="line"><a name="l15755"></a><span class="lineno">15755</span>&#160; </div>
+<div class="line"><a name="l15756"></a><span class="lineno">15756</span>&#160;    VmaMutexLock lock(m_FileMutex, m_UseMutex);</div>
+<div class="line"><a name="l15757"></a><span class="lineno">15757</span>&#160;    fprintf(m_File, <span class="stringliteral">&quot;%u,%.3f,%u,vmaDestroyImage,%p\n&quot;</span>, callParams.threadId, callParams.time, frameIndex,</div>
+<div class="line"><a name="l15758"></a><span class="lineno">15758</span>&#160;        allocation);</div>
+<div class="line"><a name="l15759"></a><span class="lineno">15759</span>&#160;    Flush();</div>
+<div class="line"><a name="l15760"></a><span class="lineno">15760</span>&#160;}</div>
+<div class="line"><a name="l15761"></a><span class="lineno">15761</span>&#160; </div>
+<div class="line"><a name="l15762"></a><span class="lineno">15762</span>&#160;<span class="keywordtype">void</span> VmaRecorder::RecordTouchAllocation(uint32_t frameIndex,</div>
+<div class="line"><a name="l15763"></a><span class="lineno">15763</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation)</div>
+<div class="line"><a name="l15764"></a><span class="lineno">15764</span>&#160;{</div>
+<div class="line"><a name="l15765"></a><span class="lineno">15765</span>&#160;    CallParams callParams;</div>
+<div class="line"><a name="l15766"></a><span class="lineno">15766</span>&#160;    GetBasicParams(callParams);</div>
 <div class="line"><a name="l15767"></a><span class="lineno">15767</span>&#160; </div>
-<div class="line"><a name="l15768"></a><span class="lineno">15768</span>&#160;<span class="preprocessor">#if VMA_BIND_MEMORY2 || VMA_VULKAN_VERSION &gt;= 1001000</span></div>
-<div class="line"><a name="l15769"></a><span class="lineno">15769</span>&#160;    VMA_COPY_IF_NOT_NULL(vkBindBufferMemory2KHR);</div>
-<div class="line"><a name="l15770"></a><span class="lineno">15770</span>&#160;    VMA_COPY_IF_NOT_NULL(vkBindImageMemory2KHR);</div>
-<div class="line"><a name="l15771"></a><span class="lineno">15771</span>&#160;<span class="preprocessor">#endif</span></div>
-<div class="line"><a name="l15772"></a><span class="lineno">15772</span>&#160; </div>
-<div class="line"><a name="l15773"></a><span class="lineno">15773</span>&#160;<span class="preprocessor">#if VMA_MEMORY_BUDGET</span></div>
-<div class="line"><a name="l15774"></a><span class="lineno">15774</span>&#160;    VMA_COPY_IF_NOT_NULL(vkGetPhysicalDeviceMemoryProperties2KHR);</div>
-<div class="line"><a name="l15775"></a><span class="lineno">15775</span>&#160;<span class="preprocessor">#endif</span></div>
-<div class="line"><a name="l15776"></a><span class="lineno">15776</span>&#160; </div>
-<div class="line"><a name="l15777"></a><span class="lineno">15777</span>&#160;<span class="preprocessor">#undef VMA_COPY_IF_NOT_NULL</span></div>
-<div class="line"><a name="l15778"></a><span class="lineno">15778</span>&#160;}</div>
+<div class="line"><a name="l15768"></a><span class="lineno">15768</span>&#160;    VmaMutexLock lock(m_FileMutex, m_UseMutex);</div>
+<div class="line"><a name="l15769"></a><span class="lineno">15769</span>&#160;    fprintf(m_File, <span class="stringliteral">&quot;%u,%.3f,%u,vmaTouchAllocation,%p\n&quot;</span>, callParams.threadId, callParams.time, frameIndex,</div>
+<div class="line"><a name="l15770"></a><span class="lineno">15770</span>&#160;        allocation);</div>
+<div class="line"><a name="l15771"></a><span class="lineno">15771</span>&#160;    Flush();</div>
+<div class="line"><a name="l15772"></a><span class="lineno">15772</span>&#160;}</div>
+<div class="line"><a name="l15773"></a><span class="lineno">15773</span>&#160; </div>
+<div class="line"><a name="l15774"></a><span class="lineno">15774</span>&#160;<span class="keywordtype">void</span> VmaRecorder::RecordGetAllocationInfo(uint32_t frameIndex,</div>
+<div class="line"><a name="l15775"></a><span class="lineno">15775</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation)</div>
+<div class="line"><a name="l15776"></a><span class="lineno">15776</span>&#160;{</div>
+<div class="line"><a name="l15777"></a><span class="lineno">15777</span>&#160;    CallParams callParams;</div>
+<div class="line"><a name="l15778"></a><span class="lineno">15778</span>&#160;    GetBasicParams(callParams);</div>
 <div class="line"><a name="l15779"></a><span class="lineno">15779</span>&#160; </div>
-<div class="line"><a name="l15780"></a><span class="lineno">15780</span>&#160;<span class="preprocessor">#if VMA_DYNAMIC_VULKAN_FUNCTIONS == 1</span></div>
-<div class="line"><a name="l15781"></a><span class="lineno">15781</span>&#160; </div>
-<div class="line"><a name="l15782"></a><span class="lineno">15782</span>&#160;<span class="keywordtype">void</span> VmaAllocator_T::ImportVulkanFunctions_Dynamic()</div>
-<div class="line"><a name="l15783"></a><span class="lineno">15783</span>&#160;{</div>
-<div class="line"><a name="l15784"></a><span class="lineno">15784</span>&#160;<span class="preprocessor">#define VMA_FETCH_INSTANCE_FUNC(memberName, functionPointerType, functionNameString) \</span></div>
-<div class="line"><a name="l15785"></a><span class="lineno">15785</span>&#160;<span class="preprocessor">    if(m_VulkanFunctions.memberName == VMA_NULL) \</span></div>
-<div class="line"><a name="l15786"></a><span class="lineno">15786</span>&#160;<span class="preprocessor">        m_VulkanFunctions.memberName = \</span></div>
-<div class="line"><a name="l15787"></a><span class="lineno">15787</span>&#160;<span class="preprocessor">            (functionPointerType)vkGetInstanceProcAddr(m_hInstance, functionNameString);</span></div>
-<div class="line"><a name="l15788"></a><span class="lineno">15788</span>&#160;<span class="preprocessor">#define VMA_FETCH_DEVICE_FUNC(memberName, functionPointerType, functionNameString) \</span></div>
-<div class="line"><a name="l15789"></a><span class="lineno">15789</span>&#160;<span class="preprocessor">    if(m_VulkanFunctions.memberName == VMA_NULL) \</span></div>
-<div class="line"><a name="l15790"></a><span class="lineno">15790</span>&#160;<span class="preprocessor">        m_VulkanFunctions.memberName = \</span></div>
-<div class="line"><a name="l15791"></a><span class="lineno">15791</span>&#160;<span class="preprocessor">            (functionPointerType)vkGetDeviceProcAddr(m_hDevice, functionNameString);</span></div>
-<div class="line"><a name="l15792"></a><span class="lineno">15792</span>&#160; </div>
-<div class="line"><a name="l15793"></a><span class="lineno">15793</span>&#160;    VMA_FETCH_INSTANCE_FUNC(vkGetPhysicalDeviceProperties, PFN_vkGetPhysicalDeviceProperties, <span class="stringliteral">&quot;vkGetPhysicalDeviceProperties&quot;</span>);</div>
-<div class="line"><a name="l15794"></a><span class="lineno">15794</span>&#160;    VMA_FETCH_INSTANCE_FUNC(vkGetPhysicalDeviceMemoryProperties, PFN_vkGetPhysicalDeviceMemoryProperties, <span class="stringliteral">&quot;vkGetPhysicalDeviceMemoryProperties&quot;</span>);</div>
-<div class="line"><a name="l15795"></a><span class="lineno">15795</span>&#160;    VMA_FETCH_DEVICE_FUNC(vkAllocateMemory, PFN_vkAllocateMemory, <span class="stringliteral">&quot;vkAllocateMemory&quot;</span>);</div>
-<div class="line"><a name="l15796"></a><span class="lineno">15796</span>&#160;    VMA_FETCH_DEVICE_FUNC(vkFreeMemory, PFN_vkFreeMemory, <span class="stringliteral">&quot;vkFreeMemory&quot;</span>);</div>
-<div class="line"><a name="l15797"></a><span class="lineno">15797</span>&#160;    VMA_FETCH_DEVICE_FUNC(vkMapMemory, PFN_vkMapMemory, <span class="stringliteral">&quot;vkMapMemory&quot;</span>);</div>
-<div class="line"><a name="l15798"></a><span class="lineno">15798</span>&#160;    VMA_FETCH_DEVICE_FUNC(vkUnmapMemory, PFN_vkUnmapMemory, <span class="stringliteral">&quot;vkUnmapMemory&quot;</span>);</div>
-<div class="line"><a name="l15799"></a><span class="lineno">15799</span>&#160;    VMA_FETCH_DEVICE_FUNC(vkFlushMappedMemoryRanges, PFN_vkFlushMappedMemoryRanges, <span class="stringliteral">&quot;vkFlushMappedMemoryRanges&quot;</span>);</div>
-<div class="line"><a name="l15800"></a><span class="lineno">15800</span>&#160;    VMA_FETCH_DEVICE_FUNC(vkInvalidateMappedMemoryRanges, PFN_vkInvalidateMappedMemoryRanges, <span class="stringliteral">&quot;vkInvalidateMappedMemoryRanges&quot;</span>);</div>
-<div class="line"><a name="l15801"></a><span class="lineno">15801</span>&#160;    VMA_FETCH_DEVICE_FUNC(vkBindBufferMemory, PFN_vkBindBufferMemory, <span class="stringliteral">&quot;vkBindBufferMemory&quot;</span>);</div>
-<div class="line"><a name="l15802"></a><span class="lineno">15802</span>&#160;    VMA_FETCH_DEVICE_FUNC(vkBindImageMemory, PFN_vkBindImageMemory, <span class="stringliteral">&quot;vkBindImageMemory&quot;</span>);</div>
-<div class="line"><a name="l15803"></a><span class="lineno">15803</span>&#160;    VMA_FETCH_DEVICE_FUNC(vkGetBufferMemoryRequirements, PFN_vkGetBufferMemoryRequirements, <span class="stringliteral">&quot;vkGetBufferMemoryRequirements&quot;</span>);</div>
-<div class="line"><a name="l15804"></a><span class="lineno">15804</span>&#160;    VMA_FETCH_DEVICE_FUNC(vkGetImageMemoryRequirements, PFN_vkGetImageMemoryRequirements, <span class="stringliteral">&quot;vkGetImageMemoryRequirements&quot;</span>);</div>
-<div class="line"><a name="l15805"></a><span class="lineno">15805</span>&#160;    VMA_FETCH_DEVICE_FUNC(vkCreateBuffer, PFN_vkCreateBuffer, <span class="stringliteral">&quot;vkCreateBuffer&quot;</span>);</div>
-<div class="line"><a name="l15806"></a><span class="lineno">15806</span>&#160;    VMA_FETCH_DEVICE_FUNC(vkDestroyBuffer, PFN_vkDestroyBuffer, <span class="stringliteral">&quot;vkDestroyBuffer&quot;</span>);</div>
-<div class="line"><a name="l15807"></a><span class="lineno">15807</span>&#160;    VMA_FETCH_DEVICE_FUNC(vkCreateImage, PFN_vkCreateImage, <span class="stringliteral">&quot;vkCreateImage&quot;</span>);</div>
-<div class="line"><a name="l15808"></a><span class="lineno">15808</span>&#160;    VMA_FETCH_DEVICE_FUNC(vkDestroyImage, PFN_vkDestroyImage, <span class="stringliteral">&quot;vkDestroyImage&quot;</span>);</div>
-<div class="line"><a name="l15809"></a><span class="lineno">15809</span>&#160;    VMA_FETCH_DEVICE_FUNC(vkCmdCopyBuffer, PFN_vkCmdCopyBuffer, <span class="stringliteral">&quot;vkCmdCopyBuffer&quot;</span>);</div>
-<div class="line"><a name="l15810"></a><span class="lineno">15810</span>&#160; </div>
-<div class="line"><a name="l15811"></a><span class="lineno">15811</span>&#160;<span class="preprocessor">#if VMA_DEDICATED_ALLOCATION</span></div>
-<div class="line"><a name="l15812"></a><span class="lineno">15812</span>&#160;    <span class="keywordflow">if</span>(m_UseKhrDedicatedAllocation)</div>
-<div class="line"><a name="l15813"></a><span class="lineno">15813</span>&#160;    {</div>
-<div class="line"><a name="l15814"></a><span class="lineno">15814</span>&#160;        VMA_FETCH_DEVICE_FUNC(vkGetBufferMemoryRequirements2KHR, PFN_vkGetBufferMemoryRequirements2KHR, <span class="stringliteral">&quot;vkGetBufferMemoryRequirements2KHR&quot;</span>);</div>
-<div class="line"><a name="l15815"></a><span class="lineno">15815</span>&#160;        VMA_FETCH_DEVICE_FUNC(vkGetImageMemoryRequirements2KHR, PFN_vkGetImageMemoryRequirements2KHR, <span class="stringliteral">&quot;vkGetImageMemoryRequirements2KHR&quot;</span>);</div>
-<div class="line"><a name="l15816"></a><span class="lineno">15816</span>&#160;    }</div>
-<div class="line"><a name="l15817"></a><span class="lineno">15817</span>&#160;<span class="preprocessor">#endif</span></div>
-<div class="line"><a name="l15818"></a><span class="lineno">15818</span>&#160; </div>
-<div class="line"><a name="l15819"></a><span class="lineno">15819</span>&#160;<span class="preprocessor">#if VMA_BIND_MEMORY2</span></div>
-<div class="line"><a name="l15820"></a><span class="lineno">15820</span>&#160;    <span class="keywordflow">if</span>(m_UseKhrBindMemory2)</div>
-<div class="line"><a name="l15821"></a><span class="lineno">15821</span>&#160;    {</div>
-<div class="line"><a name="l15822"></a><span class="lineno">15822</span>&#160;        VMA_FETCH_DEVICE_FUNC(vkBindBufferMemory2KHR, PFN_vkBindBufferMemory2KHR, <span class="stringliteral">&quot;vkBindBufferMemory2KHR&quot;</span>);</div>
-<div class="line"><a name="l15823"></a><span class="lineno">15823</span>&#160;        VMA_FETCH_DEVICE_FUNC(vkBindImageMemory2KHR, PFN_vkBindImageMemory2KHR, <span class="stringliteral">&quot;vkBindImageMemory2KHR&quot;</span>);</div>
-<div class="line"><a name="l15824"></a><span class="lineno">15824</span>&#160;    }</div>
-<div class="line"><a name="l15825"></a><span class="lineno">15825</span>&#160;<span class="preprocessor">#endif // #if VMA_BIND_MEMORY2</span></div>
+<div class="line"><a name="l15780"></a><span class="lineno">15780</span>&#160;    VmaMutexLock lock(m_FileMutex, m_UseMutex);</div>
+<div class="line"><a name="l15781"></a><span class="lineno">15781</span>&#160;    fprintf(m_File, <span class="stringliteral">&quot;%u,%.3f,%u,vmaGetAllocationInfo,%p\n&quot;</span>, callParams.threadId, callParams.time, frameIndex,</div>
+<div class="line"><a name="l15782"></a><span class="lineno">15782</span>&#160;        allocation);</div>
+<div class="line"><a name="l15783"></a><span class="lineno">15783</span>&#160;    Flush();</div>
+<div class="line"><a name="l15784"></a><span class="lineno">15784</span>&#160;}</div>
+<div class="line"><a name="l15785"></a><span class="lineno">15785</span>&#160; </div>
+<div class="line"><a name="l15786"></a><span class="lineno">15786</span>&#160;<span class="keywordtype">void</span> VmaRecorder::RecordMakePoolAllocationsLost(uint32_t frameIndex,</div>
+<div class="line"><a name="l15787"></a><span class="lineno">15787</span>&#160;    <a class="code" href="struct_vma_pool.html">VmaPool</a> pool)</div>
+<div class="line"><a name="l15788"></a><span class="lineno">15788</span>&#160;{</div>
+<div class="line"><a name="l15789"></a><span class="lineno">15789</span>&#160;    CallParams callParams;</div>
+<div class="line"><a name="l15790"></a><span class="lineno">15790</span>&#160;    GetBasicParams(callParams);</div>
+<div class="line"><a name="l15791"></a><span class="lineno">15791</span>&#160; </div>
+<div class="line"><a name="l15792"></a><span class="lineno">15792</span>&#160;    VmaMutexLock lock(m_FileMutex, m_UseMutex);</div>
+<div class="line"><a name="l15793"></a><span class="lineno">15793</span>&#160;    fprintf(m_File, <span class="stringliteral">&quot;%u,%.3f,%u,vmaMakePoolAllocationsLost,%p\n&quot;</span>, callParams.threadId, callParams.time, frameIndex,</div>
+<div class="line"><a name="l15794"></a><span class="lineno">15794</span>&#160;        pool);</div>
+<div class="line"><a name="l15795"></a><span class="lineno">15795</span>&#160;    Flush();</div>
+<div class="line"><a name="l15796"></a><span class="lineno">15796</span>&#160;}</div>
+<div class="line"><a name="l15797"></a><span class="lineno">15797</span>&#160; </div>
+<div class="line"><a name="l15798"></a><span class="lineno">15798</span>&#160;<span class="keywordtype">void</span> VmaRecorder::RecordDefragmentationBegin(uint32_t frameIndex,</div>
+<div class="line"><a name="l15799"></a><span class="lineno">15799</span>&#160;    <span class="keyword">const</span> <a class="code" href="struct_vma_defragmentation_info2.html">VmaDefragmentationInfo2</a>&amp; info,</div>
+<div class="line"><a name="l15800"></a><span class="lineno">15800</span>&#160;    <a class="code" href="struct_vma_defragmentation_context.html">VmaDefragmentationContext</a> ctx)</div>
+<div class="line"><a name="l15801"></a><span class="lineno">15801</span>&#160;{</div>
+<div class="line"><a name="l15802"></a><span class="lineno">15802</span>&#160;    CallParams callParams;</div>
+<div class="line"><a name="l15803"></a><span class="lineno">15803</span>&#160;    GetBasicParams(callParams);</div>
+<div class="line"><a name="l15804"></a><span class="lineno">15804</span>&#160; </div>
+<div class="line"><a name="l15805"></a><span class="lineno">15805</span>&#160;    VmaMutexLock lock(m_FileMutex, m_UseMutex);</div>
+<div class="line"><a name="l15806"></a><span class="lineno">15806</span>&#160;    fprintf(m_File, <span class="stringliteral">&quot;%u,%.3f,%u,vmaDefragmentationBegin,%u,&quot;</span>, callParams.threadId, callParams.time, frameIndex,</div>
+<div class="line"><a name="l15807"></a><span class="lineno">15807</span>&#160;        info.<a class="code" href="struct_vma_defragmentation_info2.html#a53e844ee5633e229cf6daf14b2d9fff9">flags</a>);</div>
+<div class="line"><a name="l15808"></a><span class="lineno">15808</span>&#160;    PrintPointerList(info.<a class="code" href="struct_vma_defragmentation_info2.html#a3cf86ab32c1da779b4923d301a3056ba">allocationCount</a>, info.<a class="code" href="struct_vma_defragmentation_info2.html#ab6d288f29d028156cf73542d630a2e32">pAllocations</a>);</div>
+<div class="line"><a name="l15809"></a><span class="lineno">15809</span>&#160;    fprintf(m_File, <span class="stringliteral">&quot;,&quot;</span>);</div>
+<div class="line"><a name="l15810"></a><span class="lineno">15810</span>&#160;    PrintPointerList(info.<a class="code" href="struct_vma_defragmentation_info2.html#a7e70aa2a1081d849dcc7829b19d3ec9d">poolCount</a>, info.<a class="code" href="struct_vma_defragmentation_info2.html#a3c9c6aa5c97d5670f8e362b3a6f3029b">pPools</a>);</div>
+<div class="line"><a name="l15811"></a><span class="lineno">15811</span>&#160;    fprintf(m_File, <span class="stringliteral">&quot;,%llu,%u,%llu,%u,%p,%p\n&quot;</span>,</div>
+<div class="line"><a name="l15812"></a><span class="lineno">15812</span>&#160;        info.<a class="code" href="struct_vma_defragmentation_info2.html#af78e1ea40c22d85137b65f6b384a4d0a">maxCpuBytesToMove</a>,</div>
+<div class="line"><a name="l15813"></a><span class="lineno">15813</span>&#160;        info.<a class="code" href="struct_vma_defragmentation_info2.html#a94c2c7223d52878445a8cccce396b671">maxCpuAllocationsToMove</a>,</div>
+<div class="line"><a name="l15814"></a><span class="lineno">15814</span>&#160;        info.<a class="code" href="struct_vma_defragmentation_info2.html#a4ddbc898d0afe1518f863a3763628f08">maxGpuBytesToMove</a>,</div>
+<div class="line"><a name="l15815"></a><span class="lineno">15815</span>&#160;        info.<a class="code" href="struct_vma_defragmentation_info2.html#a40d53d33e71ba0b66f844ed63c05a3f6">maxGpuAllocationsToMove</a>,</div>
+<div class="line"><a name="l15816"></a><span class="lineno">15816</span>&#160;        info.<a class="code" href="struct_vma_defragmentation_info2.html#a7f71f39590c5316771493d2333f9c1bd">commandBuffer</a>,</div>
+<div class="line"><a name="l15817"></a><span class="lineno">15817</span>&#160;        ctx);</div>
+<div class="line"><a name="l15818"></a><span class="lineno">15818</span>&#160;    Flush();</div>
+<div class="line"><a name="l15819"></a><span class="lineno">15819</span>&#160;}</div>
+<div class="line"><a name="l15820"></a><span class="lineno">15820</span>&#160; </div>
+<div class="line"><a name="l15821"></a><span class="lineno">15821</span>&#160;<span class="keywordtype">void</span> VmaRecorder::RecordDefragmentationEnd(uint32_t frameIndex,</div>
+<div class="line"><a name="l15822"></a><span class="lineno">15822</span>&#160;    <a class="code" href="struct_vma_defragmentation_context.html">VmaDefragmentationContext</a> ctx)</div>
+<div class="line"><a name="l15823"></a><span class="lineno">15823</span>&#160;{</div>
+<div class="line"><a name="l15824"></a><span class="lineno">15824</span>&#160;    CallParams callParams;</div>
+<div class="line"><a name="l15825"></a><span class="lineno">15825</span>&#160;    GetBasicParams(callParams);</div>
 <div class="line"><a name="l15826"></a><span class="lineno">15826</span>&#160; </div>
-<div class="line"><a name="l15827"></a><span class="lineno">15827</span>&#160;<span class="preprocessor">#if VMA_MEMORY_BUDGET</span></div>
-<div class="line"><a name="l15828"></a><span class="lineno">15828</span>&#160;    <span class="keywordflow">if</span>(m_UseExtMemoryBudget &amp;&amp; m_VulkanApiVersion &lt; VK_MAKE_VERSION(1, 1, 0))</div>
-<div class="line"><a name="l15829"></a><span class="lineno">15829</span>&#160;    {</div>
-<div class="line"><a name="l15830"></a><span class="lineno">15830</span>&#160;        VMA_FETCH_INSTANCE_FUNC(vkGetPhysicalDeviceMemoryProperties2KHR, PFN_vkGetPhysicalDeviceMemoryProperties2KHR, <span class="stringliteral">&quot;vkGetPhysicalDeviceMemoryProperties2KHR&quot;</span>);</div>
-<div class="line"><a name="l15831"></a><span class="lineno">15831</span>&#160;    }</div>
-<div class="line"><a name="l15832"></a><span class="lineno">15832</span>&#160;<span class="preprocessor">#endif // #if VMA_MEMORY_BUDGET</span></div>
-<div class="line"><a name="l15833"></a><span class="lineno">15833</span>&#160; </div>
-<div class="line"><a name="l15834"></a><span class="lineno">15834</span>&#160;<span class="preprocessor">#undef VMA_FETCH_DEVICE_FUNC</span></div>
-<div class="line"><a name="l15835"></a><span class="lineno">15835</span>&#160;<span class="preprocessor">#undef VMA_FETCH_INSTANCE_FUNC</span></div>
-<div class="line"><a name="l15836"></a><span class="lineno">15836</span>&#160;}</div>
-<div class="line"><a name="l15837"></a><span class="lineno">15837</span>&#160; </div>
-<div class="line"><a name="l15838"></a><span class="lineno">15838</span>&#160;<span class="preprocessor">#endif // #if VMA_DYNAMIC_VULKAN_FUNCTIONS == 1</span></div>
+<div class="line"><a name="l15827"></a><span class="lineno">15827</span>&#160;    VmaMutexLock lock(m_FileMutex, m_UseMutex);</div>
+<div class="line"><a name="l15828"></a><span class="lineno">15828</span>&#160;    fprintf(m_File, <span class="stringliteral">&quot;%u,%.3f,%u,vmaDefragmentationEnd,%p\n&quot;</span>, callParams.threadId, callParams.time, frameIndex,</div>
+<div class="line"><a name="l15829"></a><span class="lineno">15829</span>&#160;        ctx);</div>
+<div class="line"><a name="l15830"></a><span class="lineno">15830</span>&#160;    Flush();</div>
+<div class="line"><a name="l15831"></a><span class="lineno">15831</span>&#160;}</div>
+<div class="line"><a name="l15832"></a><span class="lineno">15832</span>&#160; </div>
+<div class="line"><a name="l15833"></a><span class="lineno">15833</span>&#160;<span class="keywordtype">void</span> VmaRecorder::RecordSetPoolName(uint32_t frameIndex,</div>
+<div class="line"><a name="l15834"></a><span class="lineno">15834</span>&#160;    <a class="code" href="struct_vma_pool.html">VmaPool</a> pool,</div>
+<div class="line"><a name="l15835"></a><span class="lineno">15835</span>&#160;    <span class="keyword">const</span> <span class="keywordtype">char</span>* name)</div>
+<div class="line"><a name="l15836"></a><span class="lineno">15836</span>&#160;{</div>
+<div class="line"><a name="l15837"></a><span class="lineno">15837</span>&#160;    CallParams callParams;</div>
+<div class="line"><a name="l15838"></a><span class="lineno">15838</span>&#160;    GetBasicParams(callParams);</div>
 <div class="line"><a name="l15839"></a><span class="lineno">15839</span>&#160; </div>
-<div class="line"><a name="l15840"></a><span class="lineno">15840</span>&#160;<span class="keywordtype">void</span> VmaAllocator_T::ValidateVulkanFunctions()</div>
-<div class="line"><a name="l15841"></a><span class="lineno">15841</span>&#160;{</div>
-<div class="line"><a name="l15842"></a><span class="lineno">15842</span>&#160;    VMA_ASSERT(m_VulkanFunctions.vkGetPhysicalDeviceProperties != VMA_NULL);</div>
-<div class="line"><a name="l15843"></a><span class="lineno">15843</span>&#160;    VMA_ASSERT(m_VulkanFunctions.vkGetPhysicalDeviceMemoryProperties != VMA_NULL);</div>
-<div class="line"><a name="l15844"></a><span class="lineno">15844</span>&#160;    VMA_ASSERT(m_VulkanFunctions.vkAllocateMemory != VMA_NULL);</div>
-<div class="line"><a name="l15845"></a><span class="lineno">15845</span>&#160;    VMA_ASSERT(m_VulkanFunctions.vkFreeMemory != VMA_NULL);</div>
-<div class="line"><a name="l15846"></a><span class="lineno">15846</span>&#160;    VMA_ASSERT(m_VulkanFunctions.vkMapMemory != VMA_NULL);</div>
-<div class="line"><a name="l15847"></a><span class="lineno">15847</span>&#160;    VMA_ASSERT(m_VulkanFunctions.vkUnmapMemory != VMA_NULL);</div>
-<div class="line"><a name="l15848"></a><span class="lineno">15848</span>&#160;    VMA_ASSERT(m_VulkanFunctions.vkFlushMappedMemoryRanges != VMA_NULL);</div>
-<div class="line"><a name="l15849"></a><span class="lineno">15849</span>&#160;    VMA_ASSERT(m_VulkanFunctions.vkInvalidateMappedMemoryRanges != VMA_NULL);</div>
-<div class="line"><a name="l15850"></a><span class="lineno">15850</span>&#160;    VMA_ASSERT(m_VulkanFunctions.vkBindBufferMemory != VMA_NULL);</div>
-<div class="line"><a name="l15851"></a><span class="lineno">15851</span>&#160;    VMA_ASSERT(m_VulkanFunctions.vkBindImageMemory != VMA_NULL);</div>
-<div class="line"><a name="l15852"></a><span class="lineno">15852</span>&#160;    VMA_ASSERT(m_VulkanFunctions.vkGetBufferMemoryRequirements != VMA_NULL);</div>
-<div class="line"><a name="l15853"></a><span class="lineno">15853</span>&#160;    VMA_ASSERT(m_VulkanFunctions.vkGetImageMemoryRequirements != VMA_NULL);</div>
-<div class="line"><a name="l15854"></a><span class="lineno">15854</span>&#160;    VMA_ASSERT(m_VulkanFunctions.vkCreateBuffer != VMA_NULL);</div>
-<div class="line"><a name="l15855"></a><span class="lineno">15855</span>&#160;    VMA_ASSERT(m_VulkanFunctions.vkDestroyBuffer != VMA_NULL);</div>
-<div class="line"><a name="l15856"></a><span class="lineno">15856</span>&#160;    VMA_ASSERT(m_VulkanFunctions.vkCreateImage != VMA_NULL);</div>
-<div class="line"><a name="l15857"></a><span class="lineno">15857</span>&#160;    VMA_ASSERT(m_VulkanFunctions.vkDestroyImage != VMA_NULL);</div>
-<div class="line"><a name="l15858"></a><span class="lineno">15858</span>&#160;    VMA_ASSERT(m_VulkanFunctions.vkCmdCopyBuffer != VMA_NULL);</div>
-<div class="line"><a name="l15859"></a><span class="lineno">15859</span>&#160; </div>
-<div class="line"><a name="l15860"></a><span class="lineno">15860</span>&#160;<span class="preprocessor">#if VMA_DEDICATED_ALLOCATION || VMA_VULKAN_VERSION &gt;= 1001000</span></div>
-<div class="line"><a name="l15861"></a><span class="lineno">15861</span>&#160;    <span class="keywordflow">if</span>(m_VulkanApiVersion &gt;= VK_MAKE_VERSION(1, 1, 0) || m_UseKhrDedicatedAllocation)</div>
+<div class="line"><a name="l15840"></a><span class="lineno">15840</span>&#160;    VmaMutexLock lock(m_FileMutex, m_UseMutex);</div>
+<div class="line"><a name="l15841"></a><span class="lineno">15841</span>&#160;    fprintf(m_File, <span class="stringliteral">&quot;%u,%.3f,%u,vmaSetPoolName,%p,%s\n&quot;</span>, callParams.threadId, callParams.time, frameIndex,</div>
+<div class="line"><a name="l15842"></a><span class="lineno">15842</span>&#160;        pool, name != VMA_NULL ? name : <span class="stringliteral">&quot;&quot;</span>);</div>
+<div class="line"><a name="l15843"></a><span class="lineno">15843</span>&#160;    Flush();</div>
+<div class="line"><a name="l15844"></a><span class="lineno">15844</span>&#160;}</div>
+<div class="line"><a name="l15845"></a><span class="lineno">15845</span>&#160; </div>
+<div class="line"><a name="l15846"></a><span class="lineno">15846</span>&#160;VmaRecorder::UserDataString::UserDataString(<a class="code" href="vk__mem__alloc_8h.html#a5225e5e11f8376f6a31a1791f3d6e817">VmaAllocationCreateFlags</a> allocFlags, <span class="keyword">const</span> <span class="keywordtype">void</span>* pUserData)</div>
+<div class="line"><a name="l15847"></a><span class="lineno">15847</span>&#160;{</div>
+<div class="line"><a name="l15848"></a><span class="lineno">15848</span>&#160;    <span class="keywordflow">if</span>(pUserData != VMA_NULL)</div>
+<div class="line"><a name="l15849"></a><span class="lineno">15849</span>&#160;    {</div>
+<div class="line"><a name="l15850"></a><span class="lineno">15850</span>&#160;        <span class="keywordflow">if</span>((allocFlags &amp; <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597aa6f24f821cd6a7c5e4a443f7bf59c520">VMA_ALLOCATION_CREATE_USER_DATA_COPY_STRING_BIT</a>) != 0)</div>
+<div class="line"><a name="l15851"></a><span class="lineno">15851</span>&#160;        {</div>
+<div class="line"><a name="l15852"></a><span class="lineno">15852</span>&#160;            m_Str = (<span class="keyword">const</span> <span class="keywordtype">char</span>*)pUserData;</div>
+<div class="line"><a name="l15853"></a><span class="lineno">15853</span>&#160;        }</div>
+<div class="line"><a name="l15854"></a><span class="lineno">15854</span>&#160;        <span class="keywordflow">else</span></div>
+<div class="line"><a name="l15855"></a><span class="lineno">15855</span>&#160;        {</div>
+<div class="line"><a name="l15856"></a><span class="lineno">15856</span>&#160;            <span class="comment">// If VMA_ALLOCATION_CREATE_USER_DATA_COPY_STRING_BIT is not specified, convert the string&#39;s memory address to a string and store it.</span></div>
+<div class="line"><a name="l15857"></a><span class="lineno">15857</span>&#160;            snprintf(m_PtrStr, 17, <span class="stringliteral">&quot;%p&quot;</span>, pUserData);</div>
+<div class="line"><a name="l15858"></a><span class="lineno">15858</span>&#160;            m_Str = m_PtrStr;</div>
+<div class="line"><a name="l15859"></a><span class="lineno">15859</span>&#160;        }</div>
+<div class="line"><a name="l15860"></a><span class="lineno">15860</span>&#160;    }</div>
+<div class="line"><a name="l15861"></a><span class="lineno">15861</span>&#160;    <span class="keywordflow">else</span></div>
 <div class="line"><a name="l15862"></a><span class="lineno">15862</span>&#160;    {</div>
-<div class="line"><a name="l15863"></a><span class="lineno">15863</span>&#160;        VMA_ASSERT(m_VulkanFunctions.vkGetBufferMemoryRequirements2KHR != VMA_NULL);</div>
-<div class="line"><a name="l15864"></a><span class="lineno">15864</span>&#160;        VMA_ASSERT(m_VulkanFunctions.vkGetImageMemoryRequirements2KHR != VMA_NULL);</div>
-<div class="line"><a name="l15865"></a><span class="lineno">15865</span>&#160;    }</div>
-<div class="line"><a name="l15866"></a><span class="lineno">15866</span>&#160;<span class="preprocessor">#endif</span></div>
-<div class="line"><a name="l15867"></a><span class="lineno">15867</span>&#160; </div>
-<div class="line"><a name="l15868"></a><span class="lineno">15868</span>&#160;<span class="preprocessor">#if VMA_BIND_MEMORY2 || VMA_VULKAN_VERSION &gt;= 1001000</span></div>
-<div class="line"><a name="l15869"></a><span class="lineno">15869</span>&#160;    <span class="keywordflow">if</span>(m_VulkanApiVersion &gt;= VK_MAKE_VERSION(1, 1, 0) || m_UseKhrBindMemory2)</div>
-<div class="line"><a name="l15870"></a><span class="lineno">15870</span>&#160;    {</div>
-<div class="line"><a name="l15871"></a><span class="lineno">15871</span>&#160;        VMA_ASSERT(m_VulkanFunctions.vkBindBufferMemory2KHR != VMA_NULL);</div>
-<div class="line"><a name="l15872"></a><span class="lineno">15872</span>&#160;        VMA_ASSERT(m_VulkanFunctions.vkBindImageMemory2KHR != VMA_NULL);</div>
-<div class="line"><a name="l15873"></a><span class="lineno">15873</span>&#160;    }</div>
-<div class="line"><a name="l15874"></a><span class="lineno">15874</span>&#160;<span class="preprocessor">#endif</span></div>
-<div class="line"><a name="l15875"></a><span class="lineno">15875</span>&#160; </div>
-<div class="line"><a name="l15876"></a><span class="lineno">15876</span>&#160;<span class="preprocessor">#if VMA_MEMORY_BUDGET || VMA_VULKAN_VERSION &gt;= 1001000</span></div>
-<div class="line"><a name="l15877"></a><span class="lineno">15877</span>&#160;    <span class="keywordflow">if</span>(m_UseExtMemoryBudget || m_VulkanApiVersion &gt;= VK_MAKE_VERSION(1, 1, 0))</div>
-<div class="line"><a name="l15878"></a><span class="lineno">15878</span>&#160;    {</div>
-<div class="line"><a name="l15879"></a><span class="lineno">15879</span>&#160;        VMA_ASSERT(m_VulkanFunctions.vkGetPhysicalDeviceMemoryProperties2KHR != VMA_NULL);</div>
-<div class="line"><a name="l15880"></a><span class="lineno">15880</span>&#160;    }</div>
-<div class="line"><a name="l15881"></a><span class="lineno">15881</span>&#160;<span class="preprocessor">#endif</span></div>
-<div class="line"><a name="l15882"></a><span class="lineno">15882</span>&#160;}</div>
-<div class="line"><a name="l15883"></a><span class="lineno">15883</span>&#160; </div>
-<div class="line"><a name="l15884"></a><span class="lineno">15884</span>&#160;VkDeviceSize VmaAllocator_T::CalcPreferredBlockSize(uint32_t memTypeIndex)</div>
-<div class="line"><a name="l15885"></a><span class="lineno">15885</span>&#160;{</div>
-<div class="line"><a name="l15886"></a><span class="lineno">15886</span>&#160;    <span class="keyword">const</span> uint32_t heapIndex = MemoryTypeIndexToHeapIndex(memTypeIndex);</div>
-<div class="line"><a name="l15887"></a><span class="lineno">15887</span>&#160;    <span class="keyword">const</span> VkDeviceSize heapSize = m_MemProps.memoryHeaps[heapIndex].size;</div>
-<div class="line"><a name="l15888"></a><span class="lineno">15888</span>&#160;    <span class="keyword">const</span> <span class="keywordtype">bool</span> isSmallHeap = heapSize &lt;= VMA_SMALL_HEAP_MAX_SIZE;</div>
-<div class="line"><a name="l15889"></a><span class="lineno">15889</span>&#160;    <span class="keywordflow">return</span> VmaAlignUp(isSmallHeap ? (heapSize / 8) : m_PreferredLargeHeapBlockSize, (VkDeviceSize)32);</div>
-<div class="line"><a name="l15890"></a><span class="lineno">15890</span>&#160;}</div>
-<div class="line"><a name="l15891"></a><span class="lineno">15891</span>&#160; </div>
-<div class="line"><a name="l15892"></a><span class="lineno">15892</span>&#160;VkResult VmaAllocator_T::AllocateMemoryOfType(</div>
-<div class="line"><a name="l15893"></a><span class="lineno">15893</span>&#160;    VkDeviceSize size,</div>
-<div class="line"><a name="l15894"></a><span class="lineno">15894</span>&#160;    VkDeviceSize alignment,</div>
-<div class="line"><a name="l15895"></a><span class="lineno">15895</span>&#160;    <span class="keywordtype">bool</span> dedicatedAllocation,</div>
-<div class="line"><a name="l15896"></a><span class="lineno">15896</span>&#160;    VkBuffer dedicatedBuffer,</div>
-<div class="line"><a name="l15897"></a><span class="lineno">15897</span>&#160;    VkBufferUsageFlags dedicatedBufferUsage,</div>
-<div class="line"><a name="l15898"></a><span class="lineno">15898</span>&#160;    VkImage dedicatedImage,</div>
-<div class="line"><a name="l15899"></a><span class="lineno">15899</span>&#160;    <span class="keyword">const</span> <a class="code" href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a>&amp; createInfo,</div>
-<div class="line"><a name="l15900"></a><span class="lineno">15900</span>&#160;    uint32_t memTypeIndex,</div>
-<div class="line"><a name="l15901"></a><span class="lineno">15901</span>&#160;    VmaSuballocationType suballocType,</div>
-<div class="line"><a name="l15902"></a><span class="lineno">15902</span>&#160;    <span class="keywordtype">size_t</span> allocationCount,</div>
-<div class="line"><a name="l15903"></a><span class="lineno">15903</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a>* pAllocations)</div>
-<div class="line"><a name="l15904"></a><span class="lineno">15904</span>&#160;{</div>
-<div class="line"><a name="l15905"></a><span class="lineno">15905</span>&#160;    VMA_ASSERT(pAllocations != VMA_NULL);</div>
-<div class="line"><a name="l15906"></a><span class="lineno">15906</span>&#160;    VMA_DEBUG_LOG(<span class="stringliteral">&quot;  AllocateMemory: MemoryTypeIndex=%u, AllocationCount=%zu, Size=%llu&quot;</span>, memTypeIndex, allocationCount, size);</div>
-<div class="line"><a name="l15907"></a><span class="lineno">15907</span>&#160; </div>
-<div class="line"><a name="l15908"></a><span class="lineno">15908</span>&#160;    <a class="code" href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a> finalCreateInfo = createInfo;</div>
-<div class="line"><a name="l15909"></a><span class="lineno">15909</span>&#160; </div>
-<div class="line"><a name="l15910"></a><span class="lineno">15910</span>&#160;    <span class="comment">// If memory type is not HOST_VISIBLE, disable MAPPED.</span></div>
-<div class="line"><a name="l15911"></a><span class="lineno">15911</span>&#160;    <span class="keywordflow">if</span>((finalCreateInfo.<a class="code" href="struct_vma_allocation_create_info.html#add09658ac14fe290ace25470ddd6d41b">flags</a> &amp; <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a11da372cc3a82931c5e5d6146cd9dd1f">VMA_ALLOCATION_CREATE_MAPPED_BIT</a>) != 0 &amp;&amp;</div>
-<div class="line"><a name="l15912"></a><span class="lineno">15912</span>&#160;        (m_MemProps.memoryTypes[memTypeIndex].propertyFlags &amp; VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT) == 0)</div>
-<div class="line"><a name="l15913"></a><span class="lineno">15913</span>&#160;    {</div>
-<div class="line"><a name="l15914"></a><span class="lineno">15914</span>&#160;        finalCreateInfo.<a class="code" href="struct_vma_allocation_create_info.html#add09658ac14fe290ace25470ddd6d41b">flags</a> &amp;= ~<a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a11da372cc3a82931c5e5d6146cd9dd1f">VMA_ALLOCATION_CREATE_MAPPED_BIT</a>;</div>
-<div class="line"><a name="l15915"></a><span class="lineno">15915</span>&#160;    }</div>
-<div class="line"><a name="l15916"></a><span class="lineno">15916</span>&#160;    <span class="comment">// If memory is lazily allocated, it should be always dedicated.</span></div>
-<div class="line"><a name="l15917"></a><span class="lineno">15917</span>&#160;    <span class="keywordflow">if</span>(finalCreateInfo.<a class="code" href="struct_vma_allocation_create_info.html#accb8b06b1f677d858cb9af20705fa910">usage</a> == <a class="code" href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305cca835333d9072db63a653818030e17614d">VMA_MEMORY_USAGE_GPU_LAZILY_ALLOCATED</a>)</div>
-<div class="line"><a name="l15918"></a><span class="lineno">15918</span>&#160;    {</div>
-<div class="line"><a name="l15919"></a><span class="lineno">15919</span>&#160;        finalCreateInfo.<a class="code" href="struct_vma_allocation_create_info.html#add09658ac14fe290ace25470ddd6d41b">flags</a> |= <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a3fc311d855c2ff53f1090ef5c722b38f">VMA_ALLOCATION_CREATE_DEDICATED_MEMORY_BIT</a>;</div>
-<div class="line"><a name="l15920"></a><span class="lineno">15920</span>&#160;    }</div>
+<div class="line"><a name="l15863"></a><span class="lineno">15863</span>&#160;        m_Str = <span class="stringliteral">&quot;&quot;</span>;</div>
+<div class="line"><a name="l15864"></a><span class="lineno">15864</span>&#160;    }</div>
+<div class="line"><a name="l15865"></a><span class="lineno">15865</span>&#160;}</div>
+<div class="line"><a name="l15866"></a><span class="lineno">15866</span>&#160; </div>
+<div class="line"><a name="l15867"></a><span class="lineno">15867</span>&#160;<span class="keywordtype">void</span> VmaRecorder::WriteConfiguration(</div>
+<div class="line"><a name="l15868"></a><span class="lineno">15868</span>&#160;    <span class="keyword">const</span> VkPhysicalDeviceProperties&amp; devProps,</div>
+<div class="line"><a name="l15869"></a><span class="lineno">15869</span>&#160;    <span class="keyword">const</span> VkPhysicalDeviceMemoryProperties&amp; memProps,</div>
+<div class="line"><a name="l15870"></a><span class="lineno">15870</span>&#160;    uint32_t vulkanApiVersion,</div>
+<div class="line"><a name="l15871"></a><span class="lineno">15871</span>&#160;    <span class="keywordtype">bool</span> dedicatedAllocationExtensionEnabled,</div>
+<div class="line"><a name="l15872"></a><span class="lineno">15872</span>&#160;    <span class="keywordtype">bool</span> bindMemory2ExtensionEnabled,</div>
+<div class="line"><a name="l15873"></a><span class="lineno">15873</span>&#160;    <span class="keywordtype">bool</span> memoryBudgetExtensionEnabled,</div>
+<div class="line"><a name="l15874"></a><span class="lineno">15874</span>&#160;    <span class="keywordtype">bool</span> deviceCoherentMemoryExtensionEnabled)</div>
+<div class="line"><a name="l15875"></a><span class="lineno">15875</span>&#160;{</div>
+<div class="line"><a name="l15876"></a><span class="lineno">15876</span>&#160;    fprintf(m_File, <span class="stringliteral">&quot;Config,Begin\n&quot;</span>);</div>
+<div class="line"><a name="l15877"></a><span class="lineno">15877</span>&#160; </div>
+<div class="line"><a name="l15878"></a><span class="lineno">15878</span>&#160;    fprintf(m_File, <span class="stringliteral">&quot;VulkanApiVersion,%u,%u\n&quot;</span>, VK_VERSION_MAJOR(vulkanApiVersion), VK_VERSION_MINOR(vulkanApiVersion));</div>
+<div class="line"><a name="l15879"></a><span class="lineno">15879</span>&#160; </div>
+<div class="line"><a name="l15880"></a><span class="lineno">15880</span>&#160;    fprintf(m_File, <span class="stringliteral">&quot;PhysicalDevice,apiVersion,%u\n&quot;</span>, devProps.apiVersion);</div>
+<div class="line"><a name="l15881"></a><span class="lineno">15881</span>&#160;    fprintf(m_File, <span class="stringliteral">&quot;PhysicalDevice,driverVersion,%u\n&quot;</span>, devProps.driverVersion);</div>
+<div class="line"><a name="l15882"></a><span class="lineno">15882</span>&#160;    fprintf(m_File, <span class="stringliteral">&quot;PhysicalDevice,vendorID,%u\n&quot;</span>, devProps.vendorID);</div>
+<div class="line"><a name="l15883"></a><span class="lineno">15883</span>&#160;    fprintf(m_File, <span class="stringliteral">&quot;PhysicalDevice,deviceID,%u\n&quot;</span>, devProps.deviceID);</div>
+<div class="line"><a name="l15884"></a><span class="lineno">15884</span>&#160;    fprintf(m_File, <span class="stringliteral">&quot;PhysicalDevice,deviceType,%u\n&quot;</span>, devProps.deviceType);</div>
+<div class="line"><a name="l15885"></a><span class="lineno">15885</span>&#160;    fprintf(m_File, <span class="stringliteral">&quot;PhysicalDevice,deviceName,%s\n&quot;</span>, devProps.deviceName);</div>
+<div class="line"><a name="l15886"></a><span class="lineno">15886</span>&#160; </div>
+<div class="line"><a name="l15887"></a><span class="lineno">15887</span>&#160;    fprintf(m_File, <span class="stringliteral">&quot;PhysicalDeviceLimits,maxMemoryAllocationCount,%u\n&quot;</span>, devProps.limits.maxMemoryAllocationCount);</div>
+<div class="line"><a name="l15888"></a><span class="lineno">15888</span>&#160;    fprintf(m_File, <span class="stringliteral">&quot;PhysicalDeviceLimits,bufferImageGranularity,%llu\n&quot;</span>, devProps.limits.bufferImageGranularity);</div>
+<div class="line"><a name="l15889"></a><span class="lineno">15889</span>&#160;    fprintf(m_File, <span class="stringliteral">&quot;PhysicalDeviceLimits,nonCoherentAtomSize,%llu\n&quot;</span>, devProps.limits.nonCoherentAtomSize);</div>
+<div class="line"><a name="l15890"></a><span class="lineno">15890</span>&#160; </div>
+<div class="line"><a name="l15891"></a><span class="lineno">15891</span>&#160;    fprintf(m_File, <span class="stringliteral">&quot;PhysicalDeviceMemory,HeapCount,%u\n&quot;</span>, memProps.memoryHeapCount);</div>
+<div class="line"><a name="l15892"></a><span class="lineno">15892</span>&#160;    <span class="keywordflow">for</span>(uint32_t i = 0; i &lt; memProps.memoryHeapCount; ++i)</div>
+<div class="line"><a name="l15893"></a><span class="lineno">15893</span>&#160;    {</div>
+<div class="line"><a name="l15894"></a><span class="lineno">15894</span>&#160;        fprintf(m_File, <span class="stringliteral">&quot;PhysicalDeviceMemory,Heap,%u,size,%llu\n&quot;</span>, i, memProps.memoryHeaps[i].size);</div>
+<div class="line"><a name="l15895"></a><span class="lineno">15895</span>&#160;        fprintf(m_File, <span class="stringliteral">&quot;PhysicalDeviceMemory,Heap,%u,flags,%u\n&quot;</span>, i, memProps.memoryHeaps[i].flags);</div>
+<div class="line"><a name="l15896"></a><span class="lineno">15896</span>&#160;    }</div>
+<div class="line"><a name="l15897"></a><span class="lineno">15897</span>&#160;    fprintf(m_File, <span class="stringliteral">&quot;PhysicalDeviceMemory,TypeCount,%u\n&quot;</span>, memProps.memoryTypeCount);</div>
+<div class="line"><a name="l15898"></a><span class="lineno">15898</span>&#160;    <span class="keywordflow">for</span>(uint32_t i = 0; i &lt; memProps.memoryTypeCount; ++i)</div>
+<div class="line"><a name="l15899"></a><span class="lineno">15899</span>&#160;    {</div>
+<div class="line"><a name="l15900"></a><span class="lineno">15900</span>&#160;        fprintf(m_File, <span class="stringliteral">&quot;PhysicalDeviceMemory,Type,%u,heapIndex,%u\n&quot;</span>, i, memProps.memoryTypes[i].heapIndex);</div>
+<div class="line"><a name="l15901"></a><span class="lineno">15901</span>&#160;        fprintf(m_File, <span class="stringliteral">&quot;PhysicalDeviceMemory,Type,%u,propertyFlags,%u\n&quot;</span>, i, memProps.memoryTypes[i].propertyFlags);</div>
+<div class="line"><a name="l15902"></a><span class="lineno">15902</span>&#160;    }</div>
+<div class="line"><a name="l15903"></a><span class="lineno">15903</span>&#160; </div>
+<div class="line"><a name="l15904"></a><span class="lineno">15904</span>&#160;    fprintf(m_File, <span class="stringliteral">&quot;Extension,VK_KHR_dedicated_allocation,%u\n&quot;</span>, dedicatedAllocationExtensionEnabled ? 1 : 0);</div>
+<div class="line"><a name="l15905"></a><span class="lineno">15905</span>&#160;    fprintf(m_File, <span class="stringliteral">&quot;Extension,VK_KHR_bind_memory2,%u\n&quot;</span>, bindMemory2ExtensionEnabled ? 1 : 0);</div>
+<div class="line"><a name="l15906"></a><span class="lineno">15906</span>&#160;    fprintf(m_File, <span class="stringliteral">&quot;Extension,VK_EXT_memory_budget,%u\n&quot;</span>, memoryBudgetExtensionEnabled ? 1 : 0);</div>
+<div class="line"><a name="l15907"></a><span class="lineno">15907</span>&#160;    fprintf(m_File, <span class="stringliteral">&quot;Extension,VK_AMD_device_coherent_memory,%u\n&quot;</span>, deviceCoherentMemoryExtensionEnabled ? 1 : 0);</div>
+<div class="line"><a name="l15908"></a><span class="lineno">15908</span>&#160; </div>
+<div class="line"><a name="l15909"></a><span class="lineno">15909</span>&#160;    fprintf(m_File, <span class="stringliteral">&quot;Macro,VMA_DEBUG_ALWAYS_DEDICATED_MEMORY,%u\n&quot;</span>, VMA_DEBUG_ALWAYS_DEDICATED_MEMORY ? 1 : 0);</div>
+<div class="line"><a name="l15910"></a><span class="lineno">15910</span>&#160;    fprintf(m_File, <span class="stringliteral">&quot;Macro,VMA_DEBUG_ALIGNMENT,%llu\n&quot;</span>, (VkDeviceSize)VMA_DEBUG_ALIGNMENT);</div>
+<div class="line"><a name="l15911"></a><span class="lineno">15911</span>&#160;    fprintf(m_File, <span class="stringliteral">&quot;Macro,VMA_DEBUG_MARGIN,%llu\n&quot;</span>, (VkDeviceSize)VMA_DEBUG_MARGIN);</div>
+<div class="line"><a name="l15912"></a><span class="lineno">15912</span>&#160;    fprintf(m_File, <span class="stringliteral">&quot;Macro,VMA_DEBUG_INITIALIZE_ALLOCATIONS,%u\n&quot;</span>, VMA_DEBUG_INITIALIZE_ALLOCATIONS ? 1 : 0);</div>
+<div class="line"><a name="l15913"></a><span class="lineno">15913</span>&#160;    fprintf(m_File, <span class="stringliteral">&quot;Macro,VMA_DEBUG_DETECT_CORRUPTION,%u\n&quot;</span>, VMA_DEBUG_DETECT_CORRUPTION ? 1 : 0);</div>
+<div class="line"><a name="l15914"></a><span class="lineno">15914</span>&#160;    fprintf(m_File, <span class="stringliteral">&quot;Macro,VMA_DEBUG_GLOBAL_MUTEX,%u\n&quot;</span>, VMA_DEBUG_GLOBAL_MUTEX ? 1 : 0);</div>
+<div class="line"><a name="l15915"></a><span class="lineno">15915</span>&#160;    fprintf(m_File, <span class="stringliteral">&quot;Macro,VMA_DEBUG_MIN_BUFFER_IMAGE_GRANULARITY,%llu\n&quot;</span>, (VkDeviceSize)VMA_DEBUG_MIN_BUFFER_IMAGE_GRANULARITY);</div>
+<div class="line"><a name="l15916"></a><span class="lineno">15916</span>&#160;    fprintf(m_File, <span class="stringliteral">&quot;Macro,VMA_SMALL_HEAP_MAX_SIZE,%llu\n&quot;</span>, (VkDeviceSize)VMA_SMALL_HEAP_MAX_SIZE);</div>
+<div class="line"><a name="l15917"></a><span class="lineno">15917</span>&#160;    fprintf(m_File, <span class="stringliteral">&quot;Macro,VMA_DEFAULT_LARGE_HEAP_BLOCK_SIZE,%llu\n&quot;</span>, (VkDeviceSize)VMA_DEFAULT_LARGE_HEAP_BLOCK_SIZE);</div>
+<div class="line"><a name="l15918"></a><span class="lineno">15918</span>&#160; </div>
+<div class="line"><a name="l15919"></a><span class="lineno">15919</span>&#160;    fprintf(m_File, <span class="stringliteral">&quot;Config,End\n&quot;</span>);</div>
+<div class="line"><a name="l15920"></a><span class="lineno">15920</span>&#160;}</div>
 <div class="line"><a name="l15921"></a><span class="lineno">15921</span>&#160; </div>
-<div class="line"><a name="l15922"></a><span class="lineno">15922</span>&#160;    VmaBlockVector* <span class="keyword">const</span> blockVector = m_pBlockVectors[memTypeIndex];</div>
-<div class="line"><a name="l15923"></a><span class="lineno">15923</span>&#160;    VMA_ASSERT(blockVector);</div>
-<div class="line"><a name="l15924"></a><span class="lineno">15924</span>&#160; </div>
-<div class="line"><a name="l15925"></a><span class="lineno">15925</span>&#160;    <span class="keyword">const</span> VkDeviceSize preferredBlockSize = blockVector-&gt;GetPreferredBlockSize();</div>
-<div class="line"><a name="l15926"></a><span class="lineno">15926</span>&#160;    <span class="keywordtype">bool</span> preferDedicatedMemory =</div>
-<div class="line"><a name="l15927"></a><span class="lineno">15927</span>&#160;        VMA_DEBUG_ALWAYS_DEDICATED_MEMORY ||</div>
-<div class="line"><a name="l15928"></a><span class="lineno">15928</span>&#160;        dedicatedAllocation ||</div>
-<div class="line"><a name="l15929"></a><span class="lineno">15929</span>&#160;        <span class="comment">// Heuristics: Allocate dedicated memory if requested size if greater than half of preferred block size.</span></div>
-<div class="line"><a name="l15930"></a><span class="lineno">15930</span>&#160;        size &gt; preferredBlockSize / 2;</div>
-<div class="line"><a name="l15931"></a><span class="lineno">15931</span>&#160; </div>
-<div class="line"><a name="l15932"></a><span class="lineno">15932</span>&#160;    <span class="keywordflow">if</span>(preferDedicatedMemory &amp;&amp;</div>
-<div class="line"><a name="l15933"></a><span class="lineno">15933</span>&#160;        (finalCreateInfo.<a class="code" href="struct_vma_allocation_create_info.html#add09658ac14fe290ace25470ddd6d41b">flags</a> &amp; <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a89759603401014eb325eb22a3839f2ff">VMA_ALLOCATION_CREATE_NEVER_ALLOCATE_BIT</a>) == 0 &amp;&amp;</div>
-<div class="line"><a name="l15934"></a><span class="lineno">15934</span>&#160;        finalCreateInfo.<a class="code" href="struct_vma_allocation_create_info.html#a6272c0555cfd1fe28bff1afeb6190150">pool</a> == VK_NULL_HANDLE)</div>
-<div class="line"><a name="l15935"></a><span class="lineno">15935</span>&#160;    {</div>
-<div class="line"><a name="l15936"></a><span class="lineno">15936</span>&#160;        finalCreateInfo.<a class="code" href="struct_vma_allocation_create_info.html#add09658ac14fe290ace25470ddd6d41b">flags</a> |= <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a3fc311d855c2ff53f1090ef5c722b38f">VMA_ALLOCATION_CREATE_DEDICATED_MEMORY_BIT</a>;</div>
-<div class="line"><a name="l15937"></a><span class="lineno">15937</span>&#160;    }</div>
+<div class="line"><a name="l15922"></a><span class="lineno">15922</span>&#160;<span class="keywordtype">void</span> VmaRecorder::GetBasicParams(CallParams&amp; outParams)</div>
+<div class="line"><a name="l15923"></a><span class="lineno">15923</span>&#160;{</div>
+<div class="line"><a name="l15924"></a><span class="lineno">15924</span>&#160;<span class="preprocessor">    #if defined(_WIN32)</span></div>
+<div class="line"><a name="l15925"></a><span class="lineno">15925</span>&#160;        outParams.threadId = GetCurrentThreadId();</div>
+<div class="line"><a name="l15926"></a><span class="lineno">15926</span>&#160;<span class="preprocessor">    #else</span></div>
+<div class="line"><a name="l15927"></a><span class="lineno">15927</span>&#160;        <span class="comment">// Use C++11 features to get thread id and convert it to uint32_t.</span></div>
+<div class="line"><a name="l15928"></a><span class="lineno">15928</span>&#160;        <span class="comment">// There is room for optimization since sstream is quite slow.</span></div>
+<div class="line"><a name="l15929"></a><span class="lineno">15929</span>&#160;        <span class="comment">// Is there a better way to convert std::this_thread::get_id() to uint32_t?</span></div>
+<div class="line"><a name="l15930"></a><span class="lineno">15930</span>&#160;        std::thread::id thread_id = std::this_thread::get_id();</div>
+<div class="line"><a name="l15931"></a><span class="lineno">15931</span>&#160;        std::stringstream thread_id_to_string_converter;</div>
+<div class="line"><a name="l15932"></a><span class="lineno">15932</span>&#160;        thread_id_to_string_converter &lt;&lt; thread_id;</div>
+<div class="line"><a name="l15933"></a><span class="lineno">15933</span>&#160;        std::string thread_id_as_string = thread_id_to_string_converter.str();</div>
+<div class="line"><a name="l15934"></a><span class="lineno">15934</span>&#160;        outParams.threadId = <span class="keyword">static_cast&lt;</span>uint32_t<span class="keyword">&gt;</span>(std::stoi(thread_id_as_string.c_str()));</div>
+<div class="line"><a name="l15935"></a><span class="lineno">15935</span>&#160;<span class="preprocessor">    #endif</span></div>
+<div class="line"><a name="l15936"></a><span class="lineno">15936</span>&#160; </div>
+<div class="line"><a name="l15937"></a><span class="lineno">15937</span>&#160;    <span class="keyword">auto</span> current_time = std::chrono::high_resolution_clock::now();</div>
 <div class="line"><a name="l15938"></a><span class="lineno">15938</span>&#160; </div>
-<div class="line"><a name="l15939"></a><span class="lineno">15939</span>&#160;    <span class="keywordflow">if</span>((finalCreateInfo.<a class="code" href="struct_vma_allocation_create_info.html#add09658ac14fe290ace25470ddd6d41b">flags</a> &amp; <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a3fc311d855c2ff53f1090ef5c722b38f">VMA_ALLOCATION_CREATE_DEDICATED_MEMORY_BIT</a>) != 0)</div>
-<div class="line"><a name="l15940"></a><span class="lineno">15940</span>&#160;    {</div>
-<div class="line"><a name="l15941"></a><span class="lineno">15941</span>&#160;        <span class="keywordflow">if</span>((finalCreateInfo.<a class="code" href="struct_vma_allocation_create_info.html#add09658ac14fe290ace25470ddd6d41b">flags</a> &amp; <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a89759603401014eb325eb22a3839f2ff">VMA_ALLOCATION_CREATE_NEVER_ALLOCATE_BIT</a>) != 0)</div>
-<div class="line"><a name="l15942"></a><span class="lineno">15942</span>&#160;        {</div>
-<div class="line"><a name="l15943"></a><span class="lineno">15943</span>&#160;            <span class="keywordflow">return</span> VK_ERROR_OUT_OF_DEVICE_MEMORY;</div>
-<div class="line"><a name="l15944"></a><span class="lineno">15944</span>&#160;        }</div>
-<div class="line"><a name="l15945"></a><span class="lineno">15945</span>&#160;        <span class="keywordflow">else</span></div>
-<div class="line"><a name="l15946"></a><span class="lineno">15946</span>&#160;        {</div>
-<div class="line"><a name="l15947"></a><span class="lineno">15947</span>&#160;            <span class="keywordflow">return</span> AllocateDedicatedMemory(</div>
-<div class="line"><a name="l15948"></a><span class="lineno">15948</span>&#160;                size,</div>
-<div class="line"><a name="l15949"></a><span class="lineno">15949</span>&#160;                suballocType,</div>
-<div class="line"><a name="l15950"></a><span class="lineno">15950</span>&#160;                memTypeIndex,</div>
-<div class="line"><a name="l15951"></a><span class="lineno">15951</span>&#160;                (finalCreateInfo.<a class="code" href="struct_vma_allocation_create_info.html#add09658ac14fe290ace25470ddd6d41b">flags</a> &amp; <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597ab8b1764f3e9022368e440c057783b92d">VMA_ALLOCATION_CREATE_WITHIN_BUDGET_BIT</a>) != 0,</div>
-<div class="line"><a name="l15952"></a><span class="lineno">15952</span>&#160;                (finalCreateInfo.<a class="code" href="struct_vma_allocation_create_info.html#add09658ac14fe290ace25470ddd6d41b">flags</a> &amp; <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a11da372cc3a82931c5e5d6146cd9dd1f">VMA_ALLOCATION_CREATE_MAPPED_BIT</a>) != 0,</div>
-<div class="line"><a name="l15953"></a><span class="lineno">15953</span>&#160;                (finalCreateInfo.<a class="code" href="struct_vma_allocation_create_info.html#add09658ac14fe290ace25470ddd6d41b">flags</a> &amp; <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597aa6f24f821cd6a7c5e4a443f7bf59c520">VMA_ALLOCATION_CREATE_USER_DATA_COPY_STRING_BIT</a>) != 0,</div>
-<div class="line"><a name="l15954"></a><span class="lineno">15954</span>&#160;                finalCreateInfo.<a class="code" href="struct_vma_allocation_create_info.html#a8259e85c272683434f4abb4ddddffe19">pUserData</a>,</div>
-<div class="line"><a name="l15955"></a><span class="lineno">15955</span>&#160;                dedicatedBuffer,</div>
-<div class="line"><a name="l15956"></a><span class="lineno">15956</span>&#160;                dedicatedBufferUsage,</div>
-<div class="line"><a name="l15957"></a><span class="lineno">15957</span>&#160;                dedicatedImage,</div>
-<div class="line"><a name="l15958"></a><span class="lineno">15958</span>&#160;                allocationCount,</div>
-<div class="line"><a name="l15959"></a><span class="lineno">15959</span>&#160;                pAllocations);</div>
-<div class="line"><a name="l15960"></a><span class="lineno">15960</span>&#160;        }</div>
-<div class="line"><a name="l15961"></a><span class="lineno">15961</span>&#160;    }</div>
-<div class="line"><a name="l15962"></a><span class="lineno">15962</span>&#160;    <span class="keywordflow">else</span></div>
-<div class="line"><a name="l15963"></a><span class="lineno">15963</span>&#160;    {</div>
-<div class="line"><a name="l15964"></a><span class="lineno">15964</span>&#160;        VkResult res = blockVector-&gt;Allocate(</div>
-<div class="line"><a name="l15965"></a><span class="lineno">15965</span>&#160;            m_CurrentFrameIndex.load(),</div>
-<div class="line"><a name="l15966"></a><span class="lineno">15966</span>&#160;            size,</div>
-<div class="line"><a name="l15967"></a><span class="lineno">15967</span>&#160;            alignment,</div>
-<div class="line"><a name="l15968"></a><span class="lineno">15968</span>&#160;            finalCreateInfo,</div>
-<div class="line"><a name="l15969"></a><span class="lineno">15969</span>&#160;            suballocType,</div>
-<div class="line"><a name="l15970"></a><span class="lineno">15970</span>&#160;            allocationCount,</div>
-<div class="line"><a name="l15971"></a><span class="lineno">15971</span>&#160;            pAllocations);</div>
-<div class="line"><a name="l15972"></a><span class="lineno">15972</span>&#160;        <span class="keywordflow">if</span>(res == VK_SUCCESS)</div>
-<div class="line"><a name="l15973"></a><span class="lineno">15973</span>&#160;        {</div>
-<div class="line"><a name="l15974"></a><span class="lineno">15974</span>&#160;            <span class="keywordflow">return</span> res;</div>
-<div class="line"><a name="l15975"></a><span class="lineno">15975</span>&#160;        }</div>
-<div class="line"><a name="l15976"></a><span class="lineno">15976</span>&#160; </div>
-<div class="line"><a name="l15977"></a><span class="lineno">15977</span>&#160;        <span class="comment">// 5. Try dedicated memory.</span></div>
-<div class="line"><a name="l15978"></a><span class="lineno">15978</span>&#160;        <span class="keywordflow">if</span>((finalCreateInfo.<a class="code" href="struct_vma_allocation_create_info.html#add09658ac14fe290ace25470ddd6d41b">flags</a> &amp; <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a89759603401014eb325eb22a3839f2ff">VMA_ALLOCATION_CREATE_NEVER_ALLOCATE_BIT</a>) != 0)</div>
-<div class="line"><a name="l15979"></a><span class="lineno">15979</span>&#160;        {</div>
-<div class="line"><a name="l15980"></a><span class="lineno">15980</span>&#160;            <span class="keywordflow">return</span> VK_ERROR_OUT_OF_DEVICE_MEMORY;</div>
-<div class="line"><a name="l15981"></a><span class="lineno">15981</span>&#160;        }</div>
-<div class="line"><a name="l15982"></a><span class="lineno">15982</span>&#160;        <span class="keywordflow">else</span></div>
-<div class="line"><a name="l15983"></a><span class="lineno">15983</span>&#160;        {</div>
-<div class="line"><a name="l15984"></a><span class="lineno">15984</span>&#160;            res = AllocateDedicatedMemory(</div>
-<div class="line"><a name="l15985"></a><span class="lineno">15985</span>&#160;                size,</div>
-<div class="line"><a name="l15986"></a><span class="lineno">15986</span>&#160;                suballocType,</div>
-<div class="line"><a name="l15987"></a><span class="lineno">15987</span>&#160;                memTypeIndex,</div>
-<div class="line"><a name="l15988"></a><span class="lineno">15988</span>&#160;                (finalCreateInfo.<a class="code" href="struct_vma_allocation_create_info.html#add09658ac14fe290ace25470ddd6d41b">flags</a> &amp; <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597ab8b1764f3e9022368e440c057783b92d">VMA_ALLOCATION_CREATE_WITHIN_BUDGET_BIT</a>) != 0,</div>
-<div class="line"><a name="l15989"></a><span class="lineno">15989</span>&#160;                (finalCreateInfo.<a class="code" href="struct_vma_allocation_create_info.html#add09658ac14fe290ace25470ddd6d41b">flags</a> &amp; <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a11da372cc3a82931c5e5d6146cd9dd1f">VMA_ALLOCATION_CREATE_MAPPED_BIT</a>) != 0,</div>
-<div class="line"><a name="l15990"></a><span class="lineno">15990</span>&#160;                (finalCreateInfo.<a class="code" href="struct_vma_allocation_create_info.html#add09658ac14fe290ace25470ddd6d41b">flags</a> &amp; <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597aa6f24f821cd6a7c5e4a443f7bf59c520">VMA_ALLOCATION_CREATE_USER_DATA_COPY_STRING_BIT</a>) != 0,</div>
-<div class="line"><a name="l15991"></a><span class="lineno">15991</span>&#160;                finalCreateInfo.<a class="code" href="struct_vma_allocation_create_info.html#a8259e85c272683434f4abb4ddddffe19">pUserData</a>,</div>
-<div class="line"><a name="l15992"></a><span class="lineno">15992</span>&#160;                dedicatedBuffer,</div>
-<div class="line"><a name="l15993"></a><span class="lineno">15993</span>&#160;                dedicatedBufferUsage,</div>
-<div class="line"><a name="l15994"></a><span class="lineno">15994</span>&#160;                dedicatedImage,</div>
-<div class="line"><a name="l15995"></a><span class="lineno">15995</span>&#160;                allocationCount,</div>
-<div class="line"><a name="l15996"></a><span class="lineno">15996</span>&#160;                pAllocations);</div>
-<div class="line"><a name="l15997"></a><span class="lineno">15997</span>&#160;            <span class="keywordflow">if</span>(res == VK_SUCCESS)</div>
-<div class="line"><a name="l15998"></a><span class="lineno">15998</span>&#160;            {</div>
-<div class="line"><a name="l15999"></a><span class="lineno">15999</span>&#160;                <span class="comment">// Succeeded: AllocateDedicatedMemory function already filld pMemory, nothing more to do here.</span></div>
-<div class="line"><a name="l16000"></a><span class="lineno">16000</span>&#160;                VMA_DEBUG_LOG(<span class="stringliteral">&quot;    Allocated as DedicatedMemory&quot;</span>);</div>
-<div class="line"><a name="l16001"></a><span class="lineno">16001</span>&#160;                <span class="keywordflow">return</span> VK_SUCCESS;</div>
-<div class="line"><a name="l16002"></a><span class="lineno">16002</span>&#160;            }</div>
-<div class="line"><a name="l16003"></a><span class="lineno">16003</span>&#160;            <span class="keywordflow">else</span></div>
-<div class="line"><a name="l16004"></a><span class="lineno">16004</span>&#160;            {</div>
-<div class="line"><a name="l16005"></a><span class="lineno">16005</span>&#160;                <span class="comment">// Everything failed: Return error code.</span></div>
-<div class="line"><a name="l16006"></a><span class="lineno">16006</span>&#160;                VMA_DEBUG_LOG(<span class="stringliteral">&quot;    vkAllocateMemory FAILED&quot;</span>);</div>
-<div class="line"><a name="l16007"></a><span class="lineno">16007</span>&#160;                <span class="keywordflow">return</span> res;</div>
-<div class="line"><a name="l16008"></a><span class="lineno">16008</span>&#160;            }</div>
-<div class="line"><a name="l16009"></a><span class="lineno">16009</span>&#160;        }</div>
-<div class="line"><a name="l16010"></a><span class="lineno">16010</span>&#160;    }</div>
-<div class="line"><a name="l16011"></a><span class="lineno">16011</span>&#160;}</div>
-<div class="line"><a name="l16012"></a><span class="lineno">16012</span>&#160; </div>
-<div class="line"><a name="l16013"></a><span class="lineno">16013</span>&#160;VkResult VmaAllocator_T::AllocateDedicatedMemory(</div>
-<div class="line"><a name="l16014"></a><span class="lineno">16014</span>&#160;    VkDeviceSize size,</div>
-<div class="line"><a name="l16015"></a><span class="lineno">16015</span>&#160;    VmaSuballocationType suballocType,</div>
-<div class="line"><a name="l16016"></a><span class="lineno">16016</span>&#160;    uint32_t memTypeIndex,</div>
-<div class="line"><a name="l16017"></a><span class="lineno">16017</span>&#160;    <span class="keywordtype">bool</span> withinBudget,</div>
-<div class="line"><a name="l16018"></a><span class="lineno">16018</span>&#160;    <span class="keywordtype">bool</span> map,</div>
-<div class="line"><a name="l16019"></a><span class="lineno">16019</span>&#160;    <span class="keywordtype">bool</span> isUserDataString,</div>
-<div class="line"><a name="l16020"></a><span class="lineno">16020</span>&#160;    <span class="keywordtype">void</span>* pUserData,</div>
-<div class="line"><a name="l16021"></a><span class="lineno">16021</span>&#160;    VkBuffer dedicatedBuffer,</div>
-<div class="line"><a name="l16022"></a><span class="lineno">16022</span>&#160;    VkBufferUsageFlags dedicatedBufferUsage,</div>
-<div class="line"><a name="l16023"></a><span class="lineno">16023</span>&#160;    VkImage dedicatedImage,</div>
-<div class="line"><a name="l16024"></a><span class="lineno">16024</span>&#160;    <span class="keywordtype">size_t</span> allocationCount,</div>
-<div class="line"><a name="l16025"></a><span class="lineno">16025</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a>* pAllocations)</div>
-<div class="line"><a name="l16026"></a><span class="lineno">16026</span>&#160;{</div>
-<div class="line"><a name="l16027"></a><span class="lineno">16027</span>&#160;    VMA_ASSERT(allocationCount &gt; 0 &amp;&amp; pAllocations);</div>
-<div class="line"><a name="l16028"></a><span class="lineno">16028</span>&#160; </div>
-<div class="line"><a name="l16029"></a><span class="lineno">16029</span>&#160;    <span class="keywordflow">if</span>(withinBudget)</div>
-<div class="line"><a name="l16030"></a><span class="lineno">16030</span>&#160;    {</div>
-<div class="line"><a name="l16031"></a><span class="lineno">16031</span>&#160;        <span class="keyword">const</span> uint32_t heapIndex = MemoryTypeIndexToHeapIndex(memTypeIndex);</div>
-<div class="line"><a name="l16032"></a><span class="lineno">16032</span>&#160;        <a class="code" href="struct_vma_budget.html">VmaBudget</a> heapBudget = {};</div>
-<div class="line"><a name="l16033"></a><span class="lineno">16033</span>&#160;        GetBudget(&amp;heapBudget, heapIndex, 1);</div>
-<div class="line"><a name="l16034"></a><span class="lineno">16034</span>&#160;        <span class="keywordflow">if</span>(heapBudget.<a class="code" href="struct_vma_budget.html#a84dd1ecca8b0110259eb206dbadb11f6">usage</a> + size * allocationCount &gt; heapBudget.<a class="code" href="struct_vma_budget.html#ab82e1d1754c2d210d0bdf90220bc6cdd">budget</a>)</div>
-<div class="line"><a name="l16035"></a><span class="lineno">16035</span>&#160;        {</div>
-<div class="line"><a name="l16036"></a><span class="lineno">16036</span>&#160;            <span class="keywordflow">return</span> VK_ERROR_OUT_OF_DEVICE_MEMORY;</div>
-<div class="line"><a name="l16037"></a><span class="lineno">16037</span>&#160;        }</div>
-<div class="line"><a name="l16038"></a><span class="lineno">16038</span>&#160;    }</div>
-<div class="line"><a name="l16039"></a><span class="lineno">16039</span>&#160; </div>
-<div class="line"><a name="l16040"></a><span class="lineno">16040</span>&#160;    VkMemoryAllocateInfo allocInfo = { VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO };</div>
-<div class="line"><a name="l16041"></a><span class="lineno">16041</span>&#160;    allocInfo.memoryTypeIndex = memTypeIndex;</div>
-<div class="line"><a name="l16042"></a><span class="lineno">16042</span>&#160;    allocInfo.allocationSize = size;</div>
-<div class="line"><a name="l16043"></a><span class="lineno">16043</span>&#160; </div>
-<div class="line"><a name="l16044"></a><span class="lineno">16044</span>&#160;<span class="preprocessor">#if VMA_DEDICATED_ALLOCATION || VMA_VULKAN_VERSION &gt;= 1001000</span></div>
-<div class="line"><a name="l16045"></a><span class="lineno">16045</span>&#160;    VkMemoryDedicatedAllocateInfoKHR dedicatedAllocInfo = { VK_STRUCTURE_TYPE_MEMORY_DEDICATED_ALLOCATE_INFO_KHR };</div>
-<div class="line"><a name="l16046"></a><span class="lineno">16046</span>&#160;    <span class="keywordflow">if</span>(m_UseKhrDedicatedAllocation || m_VulkanApiVersion &gt;= VK_MAKE_VERSION(1, 1, 0))</div>
-<div class="line"><a name="l16047"></a><span class="lineno">16047</span>&#160;    {</div>
-<div class="line"><a name="l16048"></a><span class="lineno">16048</span>&#160;        <span class="keywordflow">if</span>(dedicatedBuffer != VK_NULL_HANDLE)</div>
-<div class="line"><a name="l16049"></a><span class="lineno">16049</span>&#160;        {</div>
-<div class="line"><a name="l16050"></a><span class="lineno">16050</span>&#160;            VMA_ASSERT(dedicatedImage == VK_NULL_HANDLE);</div>
-<div class="line"><a name="l16051"></a><span class="lineno">16051</span>&#160;            dedicatedAllocInfo.buffer = dedicatedBuffer;</div>
-<div class="line"><a name="l16052"></a><span class="lineno">16052</span>&#160;            VmaPnextChainPushFront(&amp;allocInfo, &amp;dedicatedAllocInfo);</div>
-<div class="line"><a name="l16053"></a><span class="lineno">16053</span>&#160;        }</div>
-<div class="line"><a name="l16054"></a><span class="lineno">16054</span>&#160;        <span class="keywordflow">else</span> <span class="keywordflow">if</span>(dedicatedImage != VK_NULL_HANDLE)</div>
-<div class="line"><a name="l16055"></a><span class="lineno">16055</span>&#160;        {</div>
-<div class="line"><a name="l16056"></a><span class="lineno">16056</span>&#160;            dedicatedAllocInfo.image = dedicatedImage;</div>
-<div class="line"><a name="l16057"></a><span class="lineno">16057</span>&#160;            VmaPnextChainPushFront(&amp;allocInfo, &amp;dedicatedAllocInfo);</div>
-<div class="line"><a name="l16058"></a><span class="lineno">16058</span>&#160;        }</div>
+<div class="line"><a name="l15939"></a><span class="lineno">15939</span>&#160;    outParams.time = std::chrono::duration&lt;double, std::chrono::seconds::period&gt;(current_time - m_RecordingStartTime).count();</div>
+<div class="line"><a name="l15940"></a><span class="lineno">15940</span>&#160;}</div>
+<div class="line"><a name="l15941"></a><span class="lineno">15941</span>&#160; </div>
+<div class="line"><a name="l15942"></a><span class="lineno">15942</span>&#160;<span class="keywordtype">void</span> VmaRecorder::PrintPointerList(uint64_t count, <span class="keyword">const</span> <a class="code" href="struct_vma_allocation.html">VmaAllocation</a>* pItems)</div>
+<div class="line"><a name="l15943"></a><span class="lineno">15943</span>&#160;{</div>
+<div class="line"><a name="l15944"></a><span class="lineno">15944</span>&#160;    <span class="keywordflow">if</span>(count)</div>
+<div class="line"><a name="l15945"></a><span class="lineno">15945</span>&#160;    {</div>
+<div class="line"><a name="l15946"></a><span class="lineno">15946</span>&#160;        fprintf(m_File, <span class="stringliteral">&quot;%p&quot;</span>, pItems[0]);</div>
+<div class="line"><a name="l15947"></a><span class="lineno">15947</span>&#160;        <span class="keywordflow">for</span>(uint64_t i = 1; i &lt; count; ++i)</div>
+<div class="line"><a name="l15948"></a><span class="lineno">15948</span>&#160;        {</div>
+<div class="line"><a name="l15949"></a><span class="lineno">15949</span>&#160;            fprintf(m_File, <span class="stringliteral">&quot; %p&quot;</span>, pItems[i]);</div>
+<div class="line"><a name="l15950"></a><span class="lineno">15950</span>&#160;        }</div>
+<div class="line"><a name="l15951"></a><span class="lineno">15951</span>&#160;    }</div>
+<div class="line"><a name="l15952"></a><span class="lineno">15952</span>&#160;}</div>
+<div class="line"><a name="l15953"></a><span class="lineno">15953</span>&#160; </div>
+<div class="line"><a name="l15954"></a><span class="lineno">15954</span>&#160;<span class="keywordtype">void</span> VmaRecorder::Flush()</div>
+<div class="line"><a name="l15955"></a><span class="lineno">15955</span>&#160;{</div>
+<div class="line"><a name="l15956"></a><span class="lineno">15956</span>&#160;    <span class="keywordflow">if</span>((m_Flags &amp; <a class="code" href="vk__mem__alloc_8h.html#a4dd2c44642312a147a4e93373a6e64d2a8e7ab322e8732654be627c4ea8f36cc7">VMA_RECORD_FLUSH_AFTER_CALL_BIT</a>) != 0)</div>
+<div class="line"><a name="l15957"></a><span class="lineno">15957</span>&#160;    {</div>
+<div class="line"><a name="l15958"></a><span class="lineno">15958</span>&#160;        fflush(m_File);</div>
+<div class="line"><a name="l15959"></a><span class="lineno">15959</span>&#160;    }</div>
+<div class="line"><a name="l15960"></a><span class="lineno">15960</span>&#160;}</div>
+<div class="line"><a name="l15961"></a><span class="lineno">15961</span>&#160; </div>
+<div class="line"><a name="l15962"></a><span class="lineno">15962</span>&#160;<span class="preprocessor">#endif </span><span class="comment">// #if VMA_RECORDING_ENABLED</span></div>
+<div class="line"><a name="l15963"></a><span class="lineno">15963</span>&#160; </div>
+<div class="line"><a name="l15965"></a><span class="lineno">15965</span>&#160;<span class="comment">// VmaAllocationObjectAllocator</span></div>
+<div class="line"><a name="l15966"></a><span class="lineno">15966</span>&#160; </div>
+<div class="line"><a name="l15967"></a><span class="lineno">15967</span>&#160;VmaAllocationObjectAllocator::VmaAllocationObjectAllocator(<span class="keyword">const</span> VkAllocationCallbacks* pAllocationCallbacks) :</div>
+<div class="line"><a name="l15968"></a><span class="lineno">15968</span>&#160;    m_Allocator(pAllocationCallbacks, 1024)</div>
+<div class="line"><a name="l15969"></a><span class="lineno">15969</span>&#160;{</div>
+<div class="line"><a name="l15970"></a><span class="lineno">15970</span>&#160;}</div>
+<div class="line"><a name="l15971"></a><span class="lineno">15971</span>&#160; </div>
+<div class="line"><a name="l15972"></a><span class="lineno">15972</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span>... Types&gt; <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> VmaAllocationObjectAllocator::Allocate(Types... args)</div>
+<div class="line"><a name="l15973"></a><span class="lineno">15973</span>&#160;{</div>
+<div class="line"><a name="l15974"></a><span class="lineno">15974</span>&#160;    VmaMutexLock mutexLock(m_Mutex);</div>
+<div class="line"><a name="l15975"></a><span class="lineno">15975</span>&#160;    <span class="keywordflow">return</span> m_Allocator.Alloc&lt;Types...&gt;(std::forward&lt;Types&gt;(args)...);</div>
+<div class="line"><a name="l15976"></a><span class="lineno">15976</span>&#160;}</div>
+<div class="line"><a name="l15977"></a><span class="lineno">15977</span>&#160; </div>
+<div class="line"><a name="l15978"></a><span class="lineno">15978</span>&#160;<span class="keywordtype">void</span> VmaAllocationObjectAllocator::Free(<a class="code" href="struct_vma_allocation.html">VmaAllocation</a> hAlloc)</div>
+<div class="line"><a name="l15979"></a><span class="lineno">15979</span>&#160;{</div>
+<div class="line"><a name="l15980"></a><span class="lineno">15980</span>&#160;    VmaMutexLock mutexLock(m_Mutex);</div>
+<div class="line"><a name="l15981"></a><span class="lineno">15981</span>&#160;    m_Allocator.Free(hAlloc);</div>
+<div class="line"><a name="l15982"></a><span class="lineno">15982</span>&#160;}</div>
+<div class="line"><a name="l15983"></a><span class="lineno">15983</span>&#160; </div>
+<div class="line"><a name="l15985"></a><span class="lineno">15985</span>&#160;<span class="comment">// VmaAllocator_T</span></div>
+<div class="line"><a name="l15986"></a><span class="lineno">15986</span>&#160; </div>
+<div class="line"><a name="l15987"></a><span class="lineno">15987</span>&#160;VmaAllocator_T::VmaAllocator_T(<span class="keyword">const</span> <a class="code" href="struct_vma_allocator_create_info.html">VmaAllocatorCreateInfo</a>* pCreateInfo) :</div>
+<div class="line"><a name="l15988"></a><span class="lineno">15988</span>&#160;    m_UseMutex((pCreateInfo-&gt;flags &amp; <a class="code" href="vk__mem__alloc_8h.html#a4f87c9100d154a65a4ad495f7763cf7ca4816ddaed324ba110172ca608a20f29d">VMA_ALLOCATOR_CREATE_EXTERNALLY_SYNCHRONIZED_BIT</a>) == 0),</div>
+<div class="line"><a name="l15989"></a><span class="lineno">15989</span>&#160;    m_VulkanApiVersion(pCreateInfo-&gt;vulkanApiVersion != 0 ? pCreateInfo-&gt;vulkanApiVersion : VK_API_VERSION_1_0),</div>
+<div class="line"><a name="l15990"></a><span class="lineno">15990</span>&#160;    m_UseKhrDedicatedAllocation((pCreateInfo-&gt;flags &amp; <a class="code" href="vk__mem__alloc_8h.html#a4f87c9100d154a65a4ad495f7763cf7cace7da7cc6e71a625dfa763c55a597878">VMA_ALLOCATOR_CREATE_KHR_DEDICATED_ALLOCATION_BIT</a>) != 0),</div>
+<div class="line"><a name="l15991"></a><span class="lineno">15991</span>&#160;    m_UseKhrBindMemory2((pCreateInfo-&gt;flags &amp; <a class="code" href="vk__mem__alloc_8h.html#a4f87c9100d154a65a4ad495f7763cf7ca8fb75bf07cd184ab903596295e863dee">VMA_ALLOCATOR_CREATE_KHR_BIND_MEMORY2_BIT</a>) != 0),</div>
+<div class="line"><a name="l15992"></a><span class="lineno">15992</span>&#160;    m_UseExtMemoryBudget((pCreateInfo-&gt;flags &amp; <a class="code" href="vk__mem__alloc_8h.html#a4f87c9100d154a65a4ad495f7763cf7ca4d4687863f7bd4b418c6006dc04400b0">VMA_ALLOCATOR_CREATE_EXT_MEMORY_BUDGET_BIT</a>) != 0),</div>
+<div class="line"><a name="l15993"></a><span class="lineno">15993</span>&#160;    m_UseAmdDeviceCoherentMemory((pCreateInfo-&gt;flags &amp; <a class="code" href="vk__mem__alloc_8h.html#a4f87c9100d154a65a4ad495f7763cf7ca2acce4886d8078552efa38878413970f">VMA_ALLOCATOR_CREATE_AMD_DEVICE_COHERENT_MEMORY_BIT</a>) != 0),</div>
+<div class="line"><a name="l15994"></a><span class="lineno">15994</span>&#160;    m_UseKhrBufferDeviceAddress((pCreateInfo-&gt;flags &amp; <a class="code" href="vk__mem__alloc_8h.html#a4f87c9100d154a65a4ad495f7763cf7ca5f1b28b0414319d1687e1f2b30ab0089">VMA_ALLOCATOR_CREATE_BUFFER_DEVICE_ADDRESS_BIT</a>) != 0),</div>
+<div class="line"><a name="l15995"></a><span class="lineno">15995</span>&#160;    m_UseExtMemoryPriority((pCreateInfo-&gt;flags &amp; <a class="code" href="vk__mem__alloc_8h.html#a4f87c9100d154a65a4ad495f7763cf7caffdd7a5169be3dbd7cbf6b3619e4f78a">VMA_ALLOCATOR_CREATE_EXT_MEMORY_PRIORITY_BIT</a>) != 0),</div>
+<div class="line"><a name="l15996"></a><span class="lineno">15996</span>&#160;    m_hDevice(pCreateInfo-&gt;device),</div>
+<div class="line"><a name="l15997"></a><span class="lineno">15997</span>&#160;    m_hInstance(pCreateInfo-&gt;instance),</div>
+<div class="line"><a name="l15998"></a><span class="lineno">15998</span>&#160;    m_AllocationCallbacksSpecified(pCreateInfo-&gt;pAllocationCallbacks != VMA_NULL),</div>
+<div class="line"><a name="l15999"></a><span class="lineno">15999</span>&#160;    m_AllocationCallbacks(pCreateInfo-&gt;pAllocationCallbacks ?</div>
+<div class="line"><a name="l16000"></a><span class="lineno">16000</span>&#160;        *pCreateInfo-&gt;pAllocationCallbacks : VmaEmptyAllocationCallbacks),</div>
+<div class="line"><a name="l16001"></a><span class="lineno">16001</span>&#160;    m_AllocationObjectAllocator(&amp;m_AllocationCallbacks),</div>
+<div class="line"><a name="l16002"></a><span class="lineno">16002</span>&#160;    m_HeapSizeLimitMask(0),</div>
+<div class="line"><a name="l16003"></a><span class="lineno">16003</span>&#160;    m_DeviceMemoryCount(0),</div>
+<div class="line"><a name="l16004"></a><span class="lineno">16004</span>&#160;    m_PreferredLargeHeapBlockSize(0),</div>
+<div class="line"><a name="l16005"></a><span class="lineno">16005</span>&#160;    m_PhysicalDevice(pCreateInfo-&gt;physicalDevice),</div>
+<div class="line"><a name="l16006"></a><span class="lineno">16006</span>&#160;    m_CurrentFrameIndex(0),</div>
+<div class="line"><a name="l16007"></a><span class="lineno">16007</span>&#160;    m_GpuDefragmentationMemoryTypeBits(UINT32_MAX),</div>
+<div class="line"><a name="l16008"></a><span class="lineno">16008</span>&#160;    m_NextPoolId(0),</div>
+<div class="line"><a name="l16009"></a><span class="lineno">16009</span>&#160;    m_GlobalMemoryTypeBits(UINT32_MAX)</div>
+<div class="line"><a name="l16010"></a><span class="lineno">16010</span>&#160;#if <a class="code" href="vk__mem__alloc_8h.html#a1f0c126759fc96ccb6e2d23c101d770c">VMA_RECORDING_ENABLED</a></div>
+<div class="line"><a name="l16011"></a><span class="lineno">16011</span>&#160;    ,m_pRecorder(VMA_NULL)</div>
+<div class="line"><a name="l16012"></a><span class="lineno">16012</span>&#160;#endif</div>
+<div class="line"><a name="l16013"></a><span class="lineno">16013</span>&#160;{</div>
+<div class="line"><a name="l16014"></a><span class="lineno">16014</span>&#160;    <span class="keywordflow">if</span>(m_VulkanApiVersion &gt;= VK_MAKE_VERSION(1, 1, 0))</div>
+<div class="line"><a name="l16015"></a><span class="lineno">16015</span>&#160;    {</div>
+<div class="line"><a name="l16016"></a><span class="lineno">16016</span>&#160;        m_UseKhrDedicatedAllocation = <span class="keyword">false</span>;</div>
+<div class="line"><a name="l16017"></a><span class="lineno">16017</span>&#160;        m_UseKhrBindMemory2 = <span class="keyword">false</span>;</div>
+<div class="line"><a name="l16018"></a><span class="lineno">16018</span>&#160;    }</div>
+<div class="line"><a name="l16019"></a><span class="lineno">16019</span>&#160; </div>
+<div class="line"><a name="l16020"></a><span class="lineno">16020</span>&#160;    <span class="keywordflow">if</span>(VMA_DEBUG_DETECT_CORRUPTION)</div>
+<div class="line"><a name="l16021"></a><span class="lineno">16021</span>&#160;    {</div>
+<div class="line"><a name="l16022"></a><span class="lineno">16022</span>&#160;        <span class="comment">// Needs to be multiply of uint32_t size because we are going to write VMA_CORRUPTION_DETECTION_MAGIC_VALUE to it.</span></div>
+<div class="line"><a name="l16023"></a><span class="lineno">16023</span>&#160;        VMA_ASSERT(VMA_DEBUG_MARGIN % <span class="keyword">sizeof</span>(uint32_t) == 0);</div>
+<div class="line"><a name="l16024"></a><span class="lineno">16024</span>&#160;    }</div>
+<div class="line"><a name="l16025"></a><span class="lineno">16025</span>&#160; </div>
+<div class="line"><a name="l16026"></a><span class="lineno">16026</span>&#160;    VMA_ASSERT(pCreateInfo-&gt;<a class="code" href="struct_vma_allocator_create_info.html#a08230f04ae6ccf8a78150a9e829a7156">physicalDevice</a> &amp;&amp; pCreateInfo-&gt;<a class="code" href="struct_vma_allocator_create_info.html#ad924ddd77b04039c88d0c09b0ffcd500">device</a> &amp;&amp; pCreateInfo-&gt;<a class="code" href="struct_vma_allocator_create_info.html#a70dd42e29b1df1d1b9b61532ae0b370b">instance</a>);</div>
+<div class="line"><a name="l16027"></a><span class="lineno">16027</span>&#160; </div>
+<div class="line"><a name="l16028"></a><span class="lineno">16028</span>&#160;    <span class="keywordflow">if</span>(m_VulkanApiVersion &lt; VK_MAKE_VERSION(1, 1, 0))</div>
+<div class="line"><a name="l16029"></a><span class="lineno">16029</span>&#160;    {</div>
+<div class="line"><a name="l16030"></a><span class="lineno">16030</span>&#160;<span class="preprocessor">#if !(VMA_DEDICATED_ALLOCATION)</span></div>
+<div class="line"><a name="l16031"></a><span class="lineno">16031</span>&#160;        <span class="keywordflow">if</span>((pCreateInfo-&gt;<a class="code" href="struct_vma_allocator_create_info.html#a392ea2ecbaff93f91a7c49f735ad4346">flags</a> &amp; <a class="code" href="vk__mem__alloc_8h.html#a4f87c9100d154a65a4ad495f7763cf7cace7da7cc6e71a625dfa763c55a597878">VMA_ALLOCATOR_CREATE_KHR_DEDICATED_ALLOCATION_BIT</a>) != 0)</div>
+<div class="line"><a name="l16032"></a><span class="lineno">16032</span>&#160;        {</div>
+<div class="line"><a name="l16033"></a><span class="lineno">16033</span>&#160;            VMA_ASSERT(0 &amp;&amp; <span class="stringliteral">&quot;VMA_ALLOCATOR_CREATE_KHR_DEDICATED_ALLOCATION_BIT set but required extensions are disabled by preprocessor macros.&quot;</span>);</div>
+<div class="line"><a name="l16034"></a><span class="lineno">16034</span>&#160;        }</div>
+<div class="line"><a name="l16035"></a><span class="lineno">16035</span>&#160;<span class="preprocessor">#endif</span></div>
+<div class="line"><a name="l16036"></a><span class="lineno">16036</span>&#160;<span class="preprocessor">#if !(VMA_BIND_MEMORY2)</span></div>
+<div class="line"><a name="l16037"></a><span class="lineno">16037</span>&#160;        <span class="keywordflow">if</span>((pCreateInfo-&gt;<a class="code" href="struct_vma_allocator_create_info.html#a392ea2ecbaff93f91a7c49f735ad4346">flags</a> &amp; <a class="code" href="vk__mem__alloc_8h.html#a4f87c9100d154a65a4ad495f7763cf7ca8fb75bf07cd184ab903596295e863dee">VMA_ALLOCATOR_CREATE_KHR_BIND_MEMORY2_BIT</a>) != 0)</div>
+<div class="line"><a name="l16038"></a><span class="lineno">16038</span>&#160;        {</div>
+<div class="line"><a name="l16039"></a><span class="lineno">16039</span>&#160;            VMA_ASSERT(0 &amp;&amp; <span class="stringliteral">&quot;VMA_ALLOCATOR_CREATE_KHR_BIND_MEMORY2_BIT set but required extension is disabled by preprocessor macros.&quot;</span>);</div>
+<div class="line"><a name="l16040"></a><span class="lineno">16040</span>&#160;        }</div>
+<div class="line"><a name="l16041"></a><span class="lineno">16041</span>&#160;<span class="preprocessor">#endif</span></div>
+<div class="line"><a name="l16042"></a><span class="lineno">16042</span>&#160;    }</div>
+<div class="line"><a name="l16043"></a><span class="lineno">16043</span>&#160;<span class="preprocessor">#if !(VMA_MEMORY_BUDGET)</span></div>
+<div class="line"><a name="l16044"></a><span class="lineno">16044</span>&#160;    <span class="keywordflow">if</span>((pCreateInfo-&gt;<a class="code" href="struct_vma_allocator_create_info.html#a392ea2ecbaff93f91a7c49f735ad4346">flags</a> &amp; <a class="code" href="vk__mem__alloc_8h.html#a4f87c9100d154a65a4ad495f7763cf7ca4d4687863f7bd4b418c6006dc04400b0">VMA_ALLOCATOR_CREATE_EXT_MEMORY_BUDGET_BIT</a>) != 0)</div>
+<div class="line"><a name="l16045"></a><span class="lineno">16045</span>&#160;    {</div>
+<div class="line"><a name="l16046"></a><span class="lineno">16046</span>&#160;        VMA_ASSERT(0 &amp;&amp; <span class="stringliteral">&quot;VMA_ALLOCATOR_CREATE_EXT_MEMORY_BUDGET_BIT set but required extension is disabled by preprocessor macros.&quot;</span>);</div>
+<div class="line"><a name="l16047"></a><span class="lineno">16047</span>&#160;    }</div>
+<div class="line"><a name="l16048"></a><span class="lineno">16048</span>&#160;<span class="preprocessor">#endif</span></div>
+<div class="line"><a name="l16049"></a><span class="lineno">16049</span>&#160;<span class="preprocessor">#if !(VMA_BUFFER_DEVICE_ADDRESS)</span></div>
+<div class="line"><a name="l16050"></a><span class="lineno">16050</span>&#160;    <span class="keywordflow">if</span>(m_UseKhrBufferDeviceAddress)</div>
+<div class="line"><a name="l16051"></a><span class="lineno">16051</span>&#160;    {</div>
+<div class="line"><a name="l16052"></a><span class="lineno">16052</span>&#160;        VMA_ASSERT(0 &amp;&amp; <span class="stringliteral">&quot;VMA_ALLOCATOR_CREATE_BUFFER_DEVICE_ADDRESS_BIT is set but required extension or Vulkan 1.2 is not available in your Vulkan header or its support in VMA has been disabled by a preprocessor macro.&quot;</span>);</div>
+<div class="line"><a name="l16053"></a><span class="lineno">16053</span>&#160;    }</div>
+<div class="line"><a name="l16054"></a><span class="lineno">16054</span>&#160;<span class="preprocessor">#endif</span></div>
+<div class="line"><a name="l16055"></a><span class="lineno">16055</span>&#160;<span class="preprocessor">#if VMA_VULKAN_VERSION &lt; 1002000</span></div>
+<div class="line"><a name="l16056"></a><span class="lineno">16056</span>&#160;    <span class="keywordflow">if</span>(m_VulkanApiVersion &gt;= VK_MAKE_VERSION(1, 2, 0))</div>
+<div class="line"><a name="l16057"></a><span class="lineno">16057</span>&#160;    {</div>
+<div class="line"><a name="l16058"></a><span class="lineno">16058</span>&#160;        VMA_ASSERT(0 &amp;&amp; <span class="stringliteral">&quot;vulkanApiVersion &gt;= VK_API_VERSION_1_2 but required Vulkan version is disabled by preprocessor macros.&quot;</span>);</div>
 <div class="line"><a name="l16059"></a><span class="lineno">16059</span>&#160;    }</div>
-<div class="line"><a name="l16060"></a><span class="lineno">16060</span>&#160;<span class="preprocessor">#endif // #if VMA_DEDICATED_ALLOCATION || VMA_VULKAN_VERSION &gt;= 1001000</span></div>
-<div class="line"><a name="l16061"></a><span class="lineno">16061</span>&#160; </div>
-<div class="line"><a name="l16062"></a><span class="lineno">16062</span>&#160;<span class="preprocessor">#if VMA_BUFFER_DEVICE_ADDRESS</span></div>
-<div class="line"><a name="l16063"></a><span class="lineno">16063</span>&#160;    VkMemoryAllocateFlagsInfoKHR allocFlagsInfo = { VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_FLAGS_INFO_KHR };</div>
-<div class="line"><a name="l16064"></a><span class="lineno">16064</span>&#160;    <span class="keywordflow">if</span>(m_UseKhrBufferDeviceAddress)</div>
-<div class="line"><a name="l16065"></a><span class="lineno">16065</span>&#160;    {</div>
-<div class="line"><a name="l16066"></a><span class="lineno">16066</span>&#160;        <span class="keywordtype">bool</span> canContainBufferWithDeviceAddress = <span class="keyword">true</span>;</div>
-<div class="line"><a name="l16067"></a><span class="lineno">16067</span>&#160;        <span class="keywordflow">if</span>(dedicatedBuffer != VK_NULL_HANDLE)</div>
-<div class="line"><a name="l16068"></a><span class="lineno">16068</span>&#160;        {</div>
-<div class="line"><a name="l16069"></a><span class="lineno">16069</span>&#160;            canContainBufferWithDeviceAddress = dedicatedBufferUsage == UINT32_MAX || <span class="comment">// Usage flags unknown</span></div>
-<div class="line"><a name="l16070"></a><span class="lineno">16070</span>&#160;                (dedicatedBufferUsage &amp; VK_BUFFER_USAGE_SHADER_DEVICE_ADDRESS_BIT_EXT) != 0;</div>
-<div class="line"><a name="l16071"></a><span class="lineno">16071</span>&#160;        }</div>
-<div class="line"><a name="l16072"></a><span class="lineno">16072</span>&#160;        <span class="keywordflow">else</span> <span class="keywordflow">if</span>(dedicatedImage != VK_NULL_HANDLE)</div>
-<div class="line"><a name="l16073"></a><span class="lineno">16073</span>&#160;        {</div>
-<div class="line"><a name="l16074"></a><span class="lineno">16074</span>&#160;            canContainBufferWithDeviceAddress = <span class="keyword">false</span>;</div>
-<div class="line"><a name="l16075"></a><span class="lineno">16075</span>&#160;        }</div>
-<div class="line"><a name="l16076"></a><span class="lineno">16076</span>&#160;        <span class="keywordflow">if</span>(canContainBufferWithDeviceAddress)</div>
-<div class="line"><a name="l16077"></a><span class="lineno">16077</span>&#160;        {</div>
-<div class="line"><a name="l16078"></a><span class="lineno">16078</span>&#160;            allocFlagsInfo.flags = VK_MEMORY_ALLOCATE_DEVICE_ADDRESS_BIT_KHR;</div>
-<div class="line"><a name="l16079"></a><span class="lineno">16079</span>&#160;            VmaPnextChainPushFront(&amp;allocInfo, &amp;allocFlagsInfo);</div>
-<div class="line"><a name="l16080"></a><span class="lineno">16080</span>&#160;        }</div>
-<div class="line"><a name="l16081"></a><span class="lineno">16081</span>&#160;    }</div>
-<div class="line"><a name="l16082"></a><span class="lineno">16082</span>&#160;<span class="preprocessor">#endif // #if VMA_BUFFER_DEVICE_ADDRESS</span></div>
-<div class="line"><a name="l16083"></a><span class="lineno">16083</span>&#160; </div>
-<div class="line"><a name="l16084"></a><span class="lineno">16084</span>&#160;    <span class="keywordtype">size_t</span> allocIndex;</div>
-<div class="line"><a name="l16085"></a><span class="lineno">16085</span>&#160;    VkResult res = VK_SUCCESS;</div>
-<div class="line"><a name="l16086"></a><span class="lineno">16086</span>&#160;    <span class="keywordflow">for</span>(allocIndex = 0; allocIndex &lt; allocationCount; ++allocIndex)</div>
-<div class="line"><a name="l16087"></a><span class="lineno">16087</span>&#160;    {</div>
-<div class="line"><a name="l16088"></a><span class="lineno">16088</span>&#160;        res = AllocateDedicatedMemoryPage(</div>
-<div class="line"><a name="l16089"></a><span class="lineno">16089</span>&#160;            size,</div>
-<div class="line"><a name="l16090"></a><span class="lineno">16090</span>&#160;            suballocType,</div>
-<div class="line"><a name="l16091"></a><span class="lineno">16091</span>&#160;            memTypeIndex,</div>
-<div class="line"><a name="l16092"></a><span class="lineno">16092</span>&#160;            allocInfo,</div>
-<div class="line"><a name="l16093"></a><span class="lineno">16093</span>&#160;            map,</div>
-<div class="line"><a name="l16094"></a><span class="lineno">16094</span>&#160;            isUserDataString,</div>
-<div class="line"><a name="l16095"></a><span class="lineno">16095</span>&#160;            pUserData,</div>
-<div class="line"><a name="l16096"></a><span class="lineno">16096</span>&#160;            pAllocations + allocIndex);</div>
-<div class="line"><a name="l16097"></a><span class="lineno">16097</span>&#160;        <span class="keywordflow">if</span>(res != VK_SUCCESS)</div>
-<div class="line"><a name="l16098"></a><span class="lineno">16098</span>&#160;        {</div>
-<div class="line"><a name="l16099"></a><span class="lineno">16099</span>&#160;            <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l16100"></a><span class="lineno">16100</span>&#160;        }</div>
-<div class="line"><a name="l16101"></a><span class="lineno">16101</span>&#160;    }</div>
+<div class="line"><a name="l16060"></a><span class="lineno">16060</span>&#160;<span class="preprocessor">#endif</span></div>
+<div class="line"><a name="l16061"></a><span class="lineno">16061</span>&#160;<span class="preprocessor">#if VMA_VULKAN_VERSION &lt; 1001000</span></div>
+<div class="line"><a name="l16062"></a><span class="lineno">16062</span>&#160;    <span class="keywordflow">if</span>(m_VulkanApiVersion &gt;= VK_MAKE_VERSION(1, 1, 0))</div>
+<div class="line"><a name="l16063"></a><span class="lineno">16063</span>&#160;    {</div>
+<div class="line"><a name="l16064"></a><span class="lineno">16064</span>&#160;        VMA_ASSERT(0 &amp;&amp; <span class="stringliteral">&quot;vulkanApiVersion &gt;= VK_API_VERSION_1_1 but required Vulkan version is disabled by preprocessor macros.&quot;</span>);</div>
+<div class="line"><a name="l16065"></a><span class="lineno">16065</span>&#160;    }</div>
+<div class="line"><a name="l16066"></a><span class="lineno">16066</span>&#160;<span class="preprocessor">#endif</span></div>
+<div class="line"><a name="l16067"></a><span class="lineno">16067</span>&#160;<span class="preprocessor">#if !(VMA_MEMORY_PRIORITY)</span></div>
+<div class="line"><a name="l16068"></a><span class="lineno">16068</span>&#160;    <span class="keywordflow">if</span>(m_UseExtMemoryPriority)</div>
+<div class="line"><a name="l16069"></a><span class="lineno">16069</span>&#160;    {</div>
+<div class="line"><a name="l16070"></a><span class="lineno">16070</span>&#160;        VMA_ASSERT(0 &amp;&amp; <span class="stringliteral">&quot;VMA_ALLOCATOR_CREATE_EXT_MEMORY_PRIORITY_BIT is set but required extension is not available in your Vulkan header or its support in VMA has been disabled by a preprocessor macro.&quot;</span>);</div>
+<div class="line"><a name="l16071"></a><span class="lineno">16071</span>&#160;    }</div>
+<div class="line"><a name="l16072"></a><span class="lineno">16072</span>&#160;<span class="preprocessor">#endif</span></div>
+<div class="line"><a name="l16073"></a><span class="lineno">16073</span>&#160; </div>
+<div class="line"><a name="l16074"></a><span class="lineno">16074</span>&#160;    memset(&amp;m_DeviceMemoryCallbacks, 0 ,<span class="keyword">sizeof</span>(m_DeviceMemoryCallbacks));</div>
+<div class="line"><a name="l16075"></a><span class="lineno">16075</span>&#160;    memset(&amp;m_PhysicalDeviceProperties, 0, <span class="keyword">sizeof</span>(m_PhysicalDeviceProperties));</div>
+<div class="line"><a name="l16076"></a><span class="lineno">16076</span>&#160;    memset(&amp;m_MemProps, 0, <span class="keyword">sizeof</span>(m_MemProps));</div>
+<div class="line"><a name="l16077"></a><span class="lineno">16077</span>&#160; </div>
+<div class="line"><a name="l16078"></a><span class="lineno">16078</span>&#160;    memset(&amp;m_pBlockVectors, 0, <span class="keyword">sizeof</span>(m_pBlockVectors));</div>
+<div class="line"><a name="l16079"></a><span class="lineno">16079</span>&#160;    memset(&amp;m_VulkanFunctions, 0, <span class="keyword">sizeof</span>(m_VulkanFunctions));</div>
+<div class="line"><a name="l16080"></a><span class="lineno">16080</span>&#160; </div>
+<div class="line"><a name="l16081"></a><span class="lineno">16081</span>&#160;    <span class="keywordflow">if</span>(pCreateInfo-&gt;<a class="code" href="struct_vma_allocator_create_info.html#af1380969b5e1ea4c3184a877892d260e">pDeviceMemoryCallbacks</a> != VMA_NULL)</div>
+<div class="line"><a name="l16082"></a><span class="lineno">16082</span>&#160;    {</div>
+<div class="line"><a name="l16083"></a><span class="lineno">16083</span>&#160;        m_DeviceMemoryCallbacks.<a class="code" href="struct_vma_device_memory_callbacks.html#a24052de0937ddd54015a2df0363903c6">pUserData</a> = pCreateInfo-&gt;<a class="code" href="struct_vma_allocator_create_info.html#af1380969b5e1ea4c3184a877892d260e">pDeviceMemoryCallbacks</a>-&gt;<a class="code" href="struct_vma_device_memory_callbacks.html#a24052de0937ddd54015a2df0363903c6">pUserData</a>;</div>
+<div class="line"><a name="l16084"></a><span class="lineno">16084</span>&#160;        m_DeviceMemoryCallbacks.<a class="code" href="struct_vma_device_memory_callbacks.html#a4f17f7b255101e733b44d5633aceabfb">pfnAllocate</a> = pCreateInfo-&gt;<a class="code" href="struct_vma_allocator_create_info.html#af1380969b5e1ea4c3184a877892d260e">pDeviceMemoryCallbacks</a>-&gt;<a class="code" href="struct_vma_device_memory_callbacks.html#a4f17f7b255101e733b44d5633aceabfb">pfnAllocate</a>;</div>
+<div class="line"><a name="l16085"></a><span class="lineno">16085</span>&#160;        m_DeviceMemoryCallbacks.<a class="code" href="struct_vma_device_memory_callbacks.html#abe8a3328bbc916f6f712fdb6b299444c">pfnFree</a> = pCreateInfo-&gt;<a class="code" href="struct_vma_allocator_create_info.html#af1380969b5e1ea4c3184a877892d260e">pDeviceMemoryCallbacks</a>-&gt;<a class="code" href="struct_vma_device_memory_callbacks.html#abe8a3328bbc916f6f712fdb6b299444c">pfnFree</a>;</div>
+<div class="line"><a name="l16086"></a><span class="lineno">16086</span>&#160;    }</div>
+<div class="line"><a name="l16087"></a><span class="lineno">16087</span>&#160; </div>
+<div class="line"><a name="l16088"></a><span class="lineno">16088</span>&#160;    ImportVulkanFunctions(pCreateInfo-&gt;<a class="code" href="struct_vma_allocator_create_info.html#a3dc197be3227da7338b1643f70db36bd">pVulkanFunctions</a>);</div>
+<div class="line"><a name="l16089"></a><span class="lineno">16089</span>&#160; </div>
+<div class="line"><a name="l16090"></a><span class="lineno">16090</span>&#160;    (*m_VulkanFunctions.vkGetPhysicalDeviceProperties)(m_PhysicalDevice, &amp;m_PhysicalDeviceProperties);</div>
+<div class="line"><a name="l16091"></a><span class="lineno">16091</span>&#160;    (*m_VulkanFunctions.vkGetPhysicalDeviceMemoryProperties)(m_PhysicalDevice, &amp;m_MemProps);</div>
+<div class="line"><a name="l16092"></a><span class="lineno">16092</span>&#160; </div>
+<div class="line"><a name="l16093"></a><span class="lineno">16093</span>&#160;    VMA_ASSERT(VmaIsPow2(VMA_DEBUG_ALIGNMENT));</div>
+<div class="line"><a name="l16094"></a><span class="lineno">16094</span>&#160;    VMA_ASSERT(VmaIsPow2(VMA_DEBUG_MIN_BUFFER_IMAGE_GRANULARITY));</div>
+<div class="line"><a name="l16095"></a><span class="lineno">16095</span>&#160;    VMA_ASSERT(VmaIsPow2(m_PhysicalDeviceProperties.limits.bufferImageGranularity));</div>
+<div class="line"><a name="l16096"></a><span class="lineno">16096</span>&#160;    VMA_ASSERT(VmaIsPow2(m_PhysicalDeviceProperties.limits.nonCoherentAtomSize));</div>
+<div class="line"><a name="l16097"></a><span class="lineno">16097</span>&#160; </div>
+<div class="line"><a name="l16098"></a><span class="lineno">16098</span>&#160;    m_PreferredLargeHeapBlockSize = (pCreateInfo-&gt;<a class="code" href="struct_vma_allocator_create_info.html#a8e4714298e3121cdd8b214a1ae7a637a">preferredLargeHeapBlockSize</a> != 0) ?</div>
+<div class="line"><a name="l16099"></a><span class="lineno">16099</span>&#160;        pCreateInfo-&gt;<a class="code" href="struct_vma_allocator_create_info.html#a8e4714298e3121cdd8b214a1ae7a637a">preferredLargeHeapBlockSize</a> : <span class="keyword">static_cast&lt;</span>VkDeviceSize<span class="keyword">&gt;</span>(VMA_DEFAULT_LARGE_HEAP_BLOCK_SIZE);</div>
+<div class="line"><a name="l16100"></a><span class="lineno">16100</span>&#160; </div>
+<div class="line"><a name="l16101"></a><span class="lineno">16101</span>&#160;    m_GlobalMemoryTypeBits = CalculateGlobalMemoryTypeBits();</div>
 <div class="line"><a name="l16102"></a><span class="lineno">16102</span>&#160; </div>
-<div class="line"><a name="l16103"></a><span class="lineno">16103</span>&#160;    <span class="keywordflow">if</span>(res == VK_SUCCESS)</div>
+<div class="line"><a name="l16103"></a><span class="lineno">16103</span>&#160;    <span class="keywordflow">if</span>(pCreateInfo-&gt;<a class="code" href="struct_vma_allocator_create_info.html#a31c192aa6cbffa33279f6d9f0c47c44b">pHeapSizeLimit</a> != VMA_NULL)</div>
 <div class="line"><a name="l16104"></a><span class="lineno">16104</span>&#160;    {</div>
-<div class="line"><a name="l16105"></a><span class="lineno">16105</span>&#160;        <span class="comment">// Register them in m_pDedicatedAllocations.</span></div>
+<div class="line"><a name="l16105"></a><span class="lineno">16105</span>&#160;        <span class="keywordflow">for</span>(uint32_t heapIndex = 0; heapIndex &lt; GetMemoryHeapCount(); ++heapIndex)</div>
 <div class="line"><a name="l16106"></a><span class="lineno">16106</span>&#160;        {</div>
-<div class="line"><a name="l16107"></a><span class="lineno">16107</span>&#160;            VmaMutexLockWrite lock(m_DedicatedAllocationsMutex[memTypeIndex], m_UseMutex);</div>
-<div class="line"><a name="l16108"></a><span class="lineno">16108</span>&#160;            AllocationVectorType* pDedicatedAllocations = m_pDedicatedAllocations[memTypeIndex];</div>
-<div class="line"><a name="l16109"></a><span class="lineno">16109</span>&#160;            VMA_ASSERT(pDedicatedAllocations);</div>
-<div class="line"><a name="l16110"></a><span class="lineno">16110</span>&#160;            <span class="keywordflow">for</span>(allocIndex = 0; allocIndex &lt; allocationCount; ++allocIndex)</div>
-<div class="line"><a name="l16111"></a><span class="lineno">16111</span>&#160;            {</div>
-<div class="line"><a name="l16112"></a><span class="lineno">16112</span>&#160;                VmaVectorInsertSorted&lt;VmaPointerLess&gt;(*pDedicatedAllocations, pAllocations[allocIndex]);</div>
-<div class="line"><a name="l16113"></a><span class="lineno">16113</span>&#160;            }</div>
-<div class="line"><a name="l16114"></a><span class="lineno">16114</span>&#160;        }</div>
-<div class="line"><a name="l16115"></a><span class="lineno">16115</span>&#160; </div>
-<div class="line"><a name="l16116"></a><span class="lineno">16116</span>&#160;        VMA_DEBUG_LOG(<span class="stringliteral">&quot;    Allocated DedicatedMemory Count=%zu, MemoryTypeIndex=#%u&quot;</span>, allocationCount, memTypeIndex);</div>
+<div class="line"><a name="l16107"></a><span class="lineno">16107</span>&#160;            <span class="keyword">const</span> VkDeviceSize limit = pCreateInfo-&gt;<a class="code" href="struct_vma_allocator_create_info.html#a31c192aa6cbffa33279f6d9f0c47c44b">pHeapSizeLimit</a>[heapIndex];</div>
+<div class="line"><a name="l16108"></a><span class="lineno">16108</span>&#160;            <span class="keywordflow">if</span>(limit != VK_WHOLE_SIZE)</div>
+<div class="line"><a name="l16109"></a><span class="lineno">16109</span>&#160;            {</div>
+<div class="line"><a name="l16110"></a><span class="lineno">16110</span>&#160;                m_HeapSizeLimitMask |= 1u &lt;&lt; heapIndex;</div>
+<div class="line"><a name="l16111"></a><span class="lineno">16111</span>&#160;                <span class="keywordflow">if</span>(limit &lt; m_MemProps.memoryHeaps[heapIndex].size)</div>
+<div class="line"><a name="l16112"></a><span class="lineno">16112</span>&#160;                {</div>
+<div class="line"><a name="l16113"></a><span class="lineno">16113</span>&#160;                    m_MemProps.memoryHeaps[heapIndex].size = limit;</div>
+<div class="line"><a name="l16114"></a><span class="lineno">16114</span>&#160;                }</div>
+<div class="line"><a name="l16115"></a><span class="lineno">16115</span>&#160;            }</div>
+<div class="line"><a name="l16116"></a><span class="lineno">16116</span>&#160;        }</div>
 <div class="line"><a name="l16117"></a><span class="lineno">16117</span>&#160;    }</div>
-<div class="line"><a name="l16118"></a><span class="lineno">16118</span>&#160;    <span class="keywordflow">else</span></div>
-<div class="line"><a name="l16119"></a><span class="lineno">16119</span>&#160;    {</div>
-<div class="line"><a name="l16120"></a><span class="lineno">16120</span>&#160;        <span class="comment">// Free all already created allocations.</span></div>
-<div class="line"><a name="l16121"></a><span class="lineno">16121</span>&#160;        <span class="keywordflow">while</span>(allocIndex--)</div>
-<div class="line"><a name="l16122"></a><span class="lineno">16122</span>&#160;        {</div>
-<div class="line"><a name="l16123"></a><span class="lineno">16123</span>&#160;            <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> currAlloc = pAllocations[allocIndex];</div>
-<div class="line"><a name="l16124"></a><span class="lineno">16124</span>&#160;            VkDeviceMemory hMemory = currAlloc-&gt;GetMemory();</div>
-<div class="line"><a name="l16125"></a><span class="lineno">16125</span>&#160;    </div>
-<div class="line"><a name="l16126"></a><span class="lineno">16126</span>&#160;            <span class="comment">/*</span></div>
-<div class="line"><a name="l16127"></a><span class="lineno">16127</span>&#160;<span class="comment">            There is no need to call this, because Vulkan spec allows to skip vkUnmapMemory</span></div>
-<div class="line"><a name="l16128"></a><span class="lineno">16128</span>&#160;<span class="comment">            before vkFreeMemory.</span></div>
-<div class="line"><a name="l16129"></a><span class="lineno">16129</span>&#160;<span class="comment"></span> </div>
-<div class="line"><a name="l16130"></a><span class="lineno">16130</span>&#160;<span class="comment">            if(currAlloc-&gt;GetMappedData() != VMA_NULL)</span></div>
-<div class="line"><a name="l16131"></a><span class="lineno">16131</span>&#160;<span class="comment">            {</span></div>
-<div class="line"><a name="l16132"></a><span class="lineno">16132</span>&#160;<span class="comment">                (*m_VulkanFunctions.vkUnmapMemory)(m_hDevice, hMemory);</span></div>
-<div class="line"><a name="l16133"></a><span class="lineno">16133</span>&#160;<span class="comment">            }</span></div>
-<div class="line"><a name="l16134"></a><span class="lineno">16134</span>&#160;<span class="comment">            */</span></div>
-<div class="line"><a name="l16135"></a><span class="lineno">16135</span>&#160;    </div>
-<div class="line"><a name="l16136"></a><span class="lineno">16136</span>&#160;            FreeVulkanMemory(memTypeIndex, currAlloc-&gt;GetSize(), hMemory);</div>
-<div class="line"><a name="l16137"></a><span class="lineno">16137</span>&#160;            m_Budget.RemoveAllocation(MemoryTypeIndexToHeapIndex(memTypeIndex), currAlloc-&gt;GetSize());</div>
-<div class="line"><a name="l16138"></a><span class="lineno">16138</span>&#160;            currAlloc-&gt;SetUserData(<span class="keyword">this</span>, VMA_NULL);</div>
-<div class="line"><a name="l16139"></a><span class="lineno">16139</span>&#160;            m_AllocationObjectAllocator.Free(currAlloc);</div>
-<div class="line"><a name="l16140"></a><span class="lineno">16140</span>&#160;        }</div>
-<div class="line"><a name="l16141"></a><span class="lineno">16141</span>&#160; </div>
-<div class="line"><a name="l16142"></a><span class="lineno">16142</span>&#160;        memset(pAllocations, 0, <span class="keyword">sizeof</span>(<a class="code" href="struct_vma_allocation.html">VmaAllocation</a>) * allocationCount);</div>
-<div class="line"><a name="l16143"></a><span class="lineno">16143</span>&#160;    }</div>
-<div class="line"><a name="l16144"></a><span class="lineno">16144</span>&#160; </div>
-<div class="line"><a name="l16145"></a><span class="lineno">16145</span>&#160;    <span class="keywordflow">return</span> res;</div>
-<div class="line"><a name="l16146"></a><span class="lineno">16146</span>&#160;}</div>
-<div class="line"><a name="l16147"></a><span class="lineno">16147</span>&#160; </div>
-<div class="line"><a name="l16148"></a><span class="lineno">16148</span>&#160;VkResult VmaAllocator_T::AllocateDedicatedMemoryPage(</div>
-<div class="line"><a name="l16149"></a><span class="lineno">16149</span>&#160;    VkDeviceSize size,</div>
-<div class="line"><a name="l16150"></a><span class="lineno">16150</span>&#160;    VmaSuballocationType suballocType,</div>
-<div class="line"><a name="l16151"></a><span class="lineno">16151</span>&#160;    uint32_t memTypeIndex,</div>
-<div class="line"><a name="l16152"></a><span class="lineno">16152</span>&#160;    <span class="keyword">const</span> VkMemoryAllocateInfo&amp; allocInfo,</div>
-<div class="line"><a name="l16153"></a><span class="lineno">16153</span>&#160;    <span class="keywordtype">bool</span> map,</div>
-<div class="line"><a name="l16154"></a><span class="lineno">16154</span>&#160;    <span class="keywordtype">bool</span> isUserDataString,</div>
-<div class="line"><a name="l16155"></a><span class="lineno">16155</span>&#160;    <span class="keywordtype">void</span>* pUserData,</div>
-<div class="line"><a name="l16156"></a><span class="lineno">16156</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a>* pAllocation)</div>
-<div class="line"><a name="l16157"></a><span class="lineno">16157</span>&#160;{</div>
-<div class="line"><a name="l16158"></a><span class="lineno">16158</span>&#160;    VkDeviceMemory hMemory = VK_NULL_HANDLE;</div>
-<div class="line"><a name="l16159"></a><span class="lineno">16159</span>&#160;    VkResult res = AllocateVulkanMemory(&amp;allocInfo, &amp;hMemory);</div>
-<div class="line"><a name="l16160"></a><span class="lineno">16160</span>&#160;    <span class="keywordflow">if</span>(res &lt; 0)</div>
-<div class="line"><a name="l16161"></a><span class="lineno">16161</span>&#160;    {</div>
-<div class="line"><a name="l16162"></a><span class="lineno">16162</span>&#160;        VMA_DEBUG_LOG(<span class="stringliteral">&quot;    vkAllocateMemory FAILED&quot;</span>);</div>
-<div class="line"><a name="l16163"></a><span class="lineno">16163</span>&#160;        <span class="keywordflow">return</span> res;</div>
-<div class="line"><a name="l16164"></a><span class="lineno">16164</span>&#160;    }</div>
-<div class="line"><a name="l16165"></a><span class="lineno">16165</span>&#160; </div>
-<div class="line"><a name="l16166"></a><span class="lineno">16166</span>&#160;    <span class="keywordtype">void</span>* pMappedData = VMA_NULL;</div>
-<div class="line"><a name="l16167"></a><span class="lineno">16167</span>&#160;    <span class="keywordflow">if</span>(map)</div>
-<div class="line"><a name="l16168"></a><span class="lineno">16168</span>&#160;    {</div>
-<div class="line"><a name="l16169"></a><span class="lineno">16169</span>&#160;        res = (*m_VulkanFunctions.vkMapMemory)(</div>
-<div class="line"><a name="l16170"></a><span class="lineno">16170</span>&#160;            m_hDevice,</div>
-<div class="line"><a name="l16171"></a><span class="lineno">16171</span>&#160;            hMemory,</div>
-<div class="line"><a name="l16172"></a><span class="lineno">16172</span>&#160;            0,</div>
-<div class="line"><a name="l16173"></a><span class="lineno">16173</span>&#160;            VK_WHOLE_SIZE,</div>
-<div class="line"><a name="l16174"></a><span class="lineno">16174</span>&#160;            0,</div>
-<div class="line"><a name="l16175"></a><span class="lineno">16175</span>&#160;            &amp;pMappedData);</div>
-<div class="line"><a name="l16176"></a><span class="lineno">16176</span>&#160;        <span class="keywordflow">if</span>(res &lt; 0)</div>
-<div class="line"><a name="l16177"></a><span class="lineno">16177</span>&#160;        {</div>
-<div class="line"><a name="l16178"></a><span class="lineno">16178</span>&#160;            VMA_DEBUG_LOG(<span class="stringliteral">&quot;    vkMapMemory FAILED&quot;</span>);</div>
-<div class="line"><a name="l16179"></a><span class="lineno">16179</span>&#160;            FreeVulkanMemory(memTypeIndex, size, hMemory);</div>
-<div class="line"><a name="l16180"></a><span class="lineno">16180</span>&#160;            <span class="keywordflow">return</span> res;</div>
-<div class="line"><a name="l16181"></a><span class="lineno">16181</span>&#160;        }</div>
-<div class="line"><a name="l16182"></a><span class="lineno">16182</span>&#160;    }</div>
-<div class="line"><a name="l16183"></a><span class="lineno">16183</span>&#160; </div>
-<div class="line"><a name="l16184"></a><span class="lineno">16184</span>&#160;    *pAllocation = m_AllocationObjectAllocator.Allocate(m_CurrentFrameIndex.load(), isUserDataString);</div>
-<div class="line"><a name="l16185"></a><span class="lineno">16185</span>&#160;    (*pAllocation)-&gt;InitDedicatedAllocation(memTypeIndex, hMemory, suballocType, pMappedData, size);</div>
-<div class="line"><a name="l16186"></a><span class="lineno">16186</span>&#160;    (*pAllocation)-&gt;SetUserData(<span class="keyword">this</span>, pUserData);</div>
-<div class="line"><a name="l16187"></a><span class="lineno">16187</span>&#160;    m_Budget.AddAllocation(MemoryTypeIndexToHeapIndex(memTypeIndex), size);</div>
-<div class="line"><a name="l16188"></a><span class="lineno">16188</span>&#160;    <span class="keywordflow">if</span>(VMA_DEBUG_INITIALIZE_ALLOCATIONS)</div>
-<div class="line"><a name="l16189"></a><span class="lineno">16189</span>&#160;    {</div>
-<div class="line"><a name="l16190"></a><span class="lineno">16190</span>&#160;        FillAllocation(*pAllocation, VMA_ALLOCATION_FILL_PATTERN_CREATED);</div>
-<div class="line"><a name="l16191"></a><span class="lineno">16191</span>&#160;    }</div>
-<div class="line"><a name="l16192"></a><span class="lineno">16192</span>&#160; </div>
-<div class="line"><a name="l16193"></a><span class="lineno">16193</span>&#160;    <span class="keywordflow">return</span> VK_SUCCESS;</div>
-<div class="line"><a name="l16194"></a><span class="lineno">16194</span>&#160;}</div>
-<div class="line"><a name="l16195"></a><span class="lineno">16195</span>&#160; </div>
-<div class="line"><a name="l16196"></a><span class="lineno">16196</span>&#160;<span class="keywordtype">void</span> VmaAllocator_T::GetBufferMemoryRequirements(</div>
-<div class="line"><a name="l16197"></a><span class="lineno">16197</span>&#160;    VkBuffer hBuffer,</div>
-<div class="line"><a name="l16198"></a><span class="lineno">16198</span>&#160;    VkMemoryRequirements&amp; memReq,</div>
-<div class="line"><a name="l16199"></a><span class="lineno">16199</span>&#160;    <span class="keywordtype">bool</span>&amp; requiresDedicatedAllocation,</div>
-<div class="line"><a name="l16200"></a><span class="lineno">16200</span>&#160;    <span class="keywordtype">bool</span>&amp; prefersDedicatedAllocation)<span class="keyword"> const</span></div>
-<div class="line"><a name="l16201"></a><span class="lineno">16201</span>&#160;<span class="keyword"></span>{</div>
-<div class="line"><a name="l16202"></a><span class="lineno">16202</span>&#160;<span class="preprocessor">#if VMA_DEDICATED_ALLOCATION || VMA_VULKAN_VERSION &gt;= 1001000</span></div>
-<div class="line"><a name="l16203"></a><span class="lineno">16203</span>&#160;    <span class="keywordflow">if</span>(m_UseKhrDedicatedAllocation || m_VulkanApiVersion &gt;= VK_MAKE_VERSION(1, 1, 0))</div>
-<div class="line"><a name="l16204"></a><span class="lineno">16204</span>&#160;    {</div>
-<div class="line"><a name="l16205"></a><span class="lineno">16205</span>&#160;        VkBufferMemoryRequirementsInfo2KHR memReqInfo = { VK_STRUCTURE_TYPE_BUFFER_MEMORY_REQUIREMENTS_INFO_2_KHR };</div>
-<div class="line"><a name="l16206"></a><span class="lineno">16206</span>&#160;        memReqInfo.buffer = hBuffer;</div>
+<div class="line"><a name="l16118"></a><span class="lineno">16118</span>&#160; </div>
+<div class="line"><a name="l16119"></a><span class="lineno">16119</span>&#160;    <span class="keywordflow">for</span>(uint32_t memTypeIndex = 0; memTypeIndex &lt; GetMemoryTypeCount(); ++memTypeIndex)</div>
+<div class="line"><a name="l16120"></a><span class="lineno">16120</span>&#160;    {</div>
+<div class="line"><a name="l16121"></a><span class="lineno">16121</span>&#160;        <span class="keyword">const</span> VkDeviceSize preferredBlockSize = CalcPreferredBlockSize(memTypeIndex);</div>
+<div class="line"><a name="l16122"></a><span class="lineno">16122</span>&#160; </div>
+<div class="line"><a name="l16123"></a><span class="lineno">16123</span>&#160;        m_pBlockVectors[memTypeIndex] = vma_new(<span class="keyword">this</span>, VmaBlockVector)(</div>
+<div class="line"><a name="l16124"></a><span class="lineno">16124</span>&#160;            <span class="keyword">this</span>,</div>
+<div class="line"><a name="l16125"></a><span class="lineno">16125</span>&#160;            VK_NULL_HANDLE, <span class="comment">// hParentPool</span></div>
+<div class="line"><a name="l16126"></a><span class="lineno">16126</span>&#160;            memTypeIndex,</div>
+<div class="line"><a name="l16127"></a><span class="lineno">16127</span>&#160;            preferredBlockSize,</div>
+<div class="line"><a name="l16128"></a><span class="lineno">16128</span>&#160;            0,</div>
+<div class="line"><a name="l16129"></a><span class="lineno">16129</span>&#160;            SIZE_MAX,</div>
+<div class="line"><a name="l16130"></a><span class="lineno">16130</span>&#160;            GetBufferImageGranularity(),</div>
+<div class="line"><a name="l16131"></a><span class="lineno">16131</span>&#160;            pCreateInfo-&gt;<a class="code" href="struct_vma_allocator_create_info.html#a21ea188dd212b8171cb9ecbed4a2a3a7">frameInUseCount</a>,</div>
+<div class="line"><a name="l16132"></a><span class="lineno">16132</span>&#160;            <span class="keyword">false</span>, <span class="comment">// explicitBlockSize</span></div>
+<div class="line"><a name="l16133"></a><span class="lineno">16133</span>&#160;            <span class="keyword">false</span>, <span class="comment">// linearAlgorithm</span></div>
+<div class="line"><a name="l16134"></a><span class="lineno">16134</span>&#160;            0.5f); <span class="comment">// priority (0.5 is the default per Vulkan spec)</span></div>
+<div class="line"><a name="l16135"></a><span class="lineno">16135</span>&#160;        <span class="comment">// No need to call m_pBlockVectors[memTypeIndex][blockVectorTypeIndex]-&gt;CreateMinBlocks here,</span></div>
+<div class="line"><a name="l16136"></a><span class="lineno">16136</span>&#160;        <span class="comment">// becase minBlockCount is 0.</span></div>
+<div class="line"><a name="l16137"></a><span class="lineno">16137</span>&#160;    }</div>
+<div class="line"><a name="l16138"></a><span class="lineno">16138</span>&#160;}</div>
+<div class="line"><a name="l16139"></a><span class="lineno">16139</span>&#160; </div>
+<div class="line"><a name="l16140"></a><span class="lineno">16140</span>&#160;VkResult VmaAllocator_T::Init(<span class="keyword">const</span> <a class="code" href="struct_vma_allocator_create_info.html">VmaAllocatorCreateInfo</a>* pCreateInfo)</div>
+<div class="line"><a name="l16141"></a><span class="lineno">16141</span>&#160;{</div>
+<div class="line"><a name="l16142"></a><span class="lineno">16142</span>&#160;    VkResult res = VK_SUCCESS;</div>
+<div class="line"><a name="l16143"></a><span class="lineno">16143</span>&#160; </div>
+<div class="line"><a name="l16144"></a><span class="lineno">16144</span>&#160;    <span class="keywordflow">if</span>(pCreateInfo-&gt;<a class="code" href="struct_vma_allocator_create_info.html#ace2aa4877b16a42b0b7673d4e26000ee">pRecordSettings</a> != VMA_NULL &amp;&amp;</div>
+<div class="line"><a name="l16145"></a><span class="lineno">16145</span>&#160;        !VmaStrIsEmpty(pCreateInfo-&gt;<a class="code" href="struct_vma_allocator_create_info.html#ace2aa4877b16a42b0b7673d4e26000ee">pRecordSettings</a>-&gt;<a class="code" href="struct_vma_record_settings.html#a6cb1fdbf6bcb610b68f2010dd629e89d">pFilePath</a>))</div>
+<div class="line"><a name="l16146"></a><span class="lineno">16146</span>&#160;    {</div>
+<div class="line"><a name="l16147"></a><span class="lineno">16147</span>&#160;<span class="preprocessor">#if VMA_RECORDING_ENABLED</span></div>
+<div class="line"><a name="l16148"></a><span class="lineno">16148</span>&#160;        m_pRecorder = vma_new(<span class="keyword">this</span>, VmaRecorder)();</div>
+<div class="line"><a name="l16149"></a><span class="lineno">16149</span>&#160;        res = m_pRecorder-&gt;Init(*pCreateInfo-&gt;<a class="code" href="struct_vma_allocator_create_info.html#ace2aa4877b16a42b0b7673d4e26000ee">pRecordSettings</a>, m_UseMutex);</div>
+<div class="line"><a name="l16150"></a><span class="lineno">16150</span>&#160;        <span class="keywordflow">if</span>(res != VK_SUCCESS)</div>
+<div class="line"><a name="l16151"></a><span class="lineno">16151</span>&#160;        {</div>
+<div class="line"><a name="l16152"></a><span class="lineno">16152</span>&#160;            <span class="keywordflow">return</span> res;</div>
+<div class="line"><a name="l16153"></a><span class="lineno">16153</span>&#160;        }</div>
+<div class="line"><a name="l16154"></a><span class="lineno">16154</span>&#160;        m_pRecorder-&gt;WriteConfiguration(</div>
+<div class="line"><a name="l16155"></a><span class="lineno">16155</span>&#160;            m_PhysicalDeviceProperties,</div>
+<div class="line"><a name="l16156"></a><span class="lineno">16156</span>&#160;            m_MemProps,</div>
+<div class="line"><a name="l16157"></a><span class="lineno">16157</span>&#160;            m_VulkanApiVersion,</div>
+<div class="line"><a name="l16158"></a><span class="lineno">16158</span>&#160;            m_UseKhrDedicatedAllocation,</div>
+<div class="line"><a name="l16159"></a><span class="lineno">16159</span>&#160;            m_UseKhrBindMemory2,</div>
+<div class="line"><a name="l16160"></a><span class="lineno">16160</span>&#160;            m_UseExtMemoryBudget,</div>
+<div class="line"><a name="l16161"></a><span class="lineno">16161</span>&#160;            m_UseAmdDeviceCoherentMemory);</div>
+<div class="line"><a name="l16162"></a><span class="lineno">16162</span>&#160;        m_pRecorder-&gt;RecordCreateAllocator(GetCurrentFrameIndex());</div>
+<div class="line"><a name="l16163"></a><span class="lineno">16163</span>&#160;<span class="preprocessor">#else</span></div>
+<div class="line"><a name="l16164"></a><span class="lineno">16164</span>&#160;        VMA_ASSERT(0 &amp;&amp; <span class="stringliteral">&quot;VmaAllocatorCreateInfo::pRecordSettings used, but not supported due to VMA_RECORDING_ENABLED not defined to 1.&quot;</span>);</div>
+<div class="line"><a name="l16165"></a><span class="lineno">16165</span>&#160;        <span class="keywordflow">return</span> VK_ERROR_FEATURE_NOT_PRESENT;</div>
+<div class="line"><a name="l16166"></a><span class="lineno">16166</span>&#160;<span class="preprocessor">#endif</span></div>
+<div class="line"><a name="l16167"></a><span class="lineno">16167</span>&#160;    }</div>
+<div class="line"><a name="l16168"></a><span class="lineno">16168</span>&#160; </div>
+<div class="line"><a name="l16169"></a><span class="lineno">16169</span>&#160;<span class="preprocessor">#if VMA_MEMORY_BUDGET</span></div>
+<div class="line"><a name="l16170"></a><span class="lineno">16170</span>&#160;    <span class="keywordflow">if</span>(m_UseExtMemoryBudget)</div>
+<div class="line"><a name="l16171"></a><span class="lineno">16171</span>&#160;    {</div>
+<div class="line"><a name="l16172"></a><span class="lineno">16172</span>&#160;        UpdateVulkanBudget();</div>
+<div class="line"><a name="l16173"></a><span class="lineno">16173</span>&#160;    }</div>
+<div class="line"><a name="l16174"></a><span class="lineno">16174</span>&#160;<span class="preprocessor">#endif </span><span class="comment">// #if VMA_MEMORY_BUDGET</span></div>
+<div class="line"><a name="l16175"></a><span class="lineno">16175</span>&#160; </div>
+<div class="line"><a name="l16176"></a><span class="lineno">16176</span>&#160;    <span class="keywordflow">return</span> res;</div>
+<div class="line"><a name="l16177"></a><span class="lineno">16177</span>&#160;}</div>
+<div class="line"><a name="l16178"></a><span class="lineno">16178</span>&#160; </div>
+<div class="line"><a name="l16179"></a><span class="lineno">16179</span>&#160;VmaAllocator_T::~VmaAllocator_T()</div>
+<div class="line"><a name="l16180"></a><span class="lineno">16180</span>&#160;{</div>
+<div class="line"><a name="l16181"></a><span class="lineno">16181</span>&#160;<span class="preprocessor">#if VMA_RECORDING_ENABLED</span></div>
+<div class="line"><a name="l16182"></a><span class="lineno">16182</span>&#160;    <span class="keywordflow">if</span>(m_pRecorder != VMA_NULL)</div>
+<div class="line"><a name="l16183"></a><span class="lineno">16183</span>&#160;    {</div>
+<div class="line"><a name="l16184"></a><span class="lineno">16184</span>&#160;        m_pRecorder-&gt;RecordDestroyAllocator(GetCurrentFrameIndex());</div>
+<div class="line"><a name="l16185"></a><span class="lineno">16185</span>&#160;        vma_delete(<span class="keyword">this</span>, m_pRecorder);</div>
+<div class="line"><a name="l16186"></a><span class="lineno">16186</span>&#160;    }</div>
+<div class="line"><a name="l16187"></a><span class="lineno">16187</span>&#160;<span class="preprocessor">#endif</span></div>
+<div class="line"><a name="l16188"></a><span class="lineno">16188</span>&#160; </div>
+<div class="line"><a name="l16189"></a><span class="lineno">16189</span>&#160;    VMA_ASSERT(m_Pools.IsEmpty());</div>
+<div class="line"><a name="l16190"></a><span class="lineno">16190</span>&#160; </div>
+<div class="line"><a name="l16191"></a><span class="lineno">16191</span>&#160;    <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> memTypeIndex = GetMemoryTypeCount(); memTypeIndex--; )</div>
+<div class="line"><a name="l16192"></a><span class="lineno">16192</span>&#160;    {</div>
+<div class="line"><a name="l16193"></a><span class="lineno">16193</span>&#160;        <span class="keywordflow">if</span>(!m_DedicatedAllocations[memTypeIndex].IsEmpty())</div>
+<div class="line"><a name="l16194"></a><span class="lineno">16194</span>&#160;        {</div>
+<div class="line"><a name="l16195"></a><span class="lineno">16195</span>&#160;            VMA_ASSERT(0 &amp;&amp; <span class="stringliteral">&quot;Unfreed dedicated allocations found.&quot;</span>);</div>
+<div class="line"><a name="l16196"></a><span class="lineno">16196</span>&#160;        }</div>
+<div class="line"><a name="l16197"></a><span class="lineno">16197</span>&#160; </div>
+<div class="line"><a name="l16198"></a><span class="lineno">16198</span>&#160;        vma_delete(<span class="keyword">this</span>, m_pBlockVectors[memTypeIndex]);</div>
+<div class="line"><a name="l16199"></a><span class="lineno">16199</span>&#160;    }</div>
+<div class="line"><a name="l16200"></a><span class="lineno">16200</span>&#160;}</div>
+<div class="line"><a name="l16201"></a><span class="lineno">16201</span>&#160; </div>
+<div class="line"><a name="l16202"></a><span class="lineno">16202</span>&#160;<span class="keywordtype">void</span> VmaAllocator_T::ImportVulkanFunctions(<span class="keyword">const</span> <a class="code" href="struct_vma_vulkan_functions.html">VmaVulkanFunctions</a>* pVulkanFunctions)</div>
+<div class="line"><a name="l16203"></a><span class="lineno">16203</span>&#160;{</div>
+<div class="line"><a name="l16204"></a><span class="lineno">16204</span>&#160;<span class="preprocessor">#if VMA_STATIC_VULKAN_FUNCTIONS == 1</span></div>
+<div class="line"><a name="l16205"></a><span class="lineno">16205</span>&#160;    ImportVulkanFunctions_Static();</div>
+<div class="line"><a name="l16206"></a><span class="lineno">16206</span>&#160;<span class="preprocessor">#endif</span></div>
 <div class="line"><a name="l16207"></a><span class="lineno">16207</span>&#160; </div>
-<div class="line"><a name="l16208"></a><span class="lineno">16208</span>&#160;        VkMemoryDedicatedRequirementsKHR memDedicatedReq = { VK_STRUCTURE_TYPE_MEMORY_DEDICATED_REQUIREMENTS_KHR };</div>
-<div class="line"><a name="l16209"></a><span class="lineno">16209</span>&#160; </div>
-<div class="line"><a name="l16210"></a><span class="lineno">16210</span>&#160;        VkMemoryRequirements2KHR memReq2 = { VK_STRUCTURE_TYPE_MEMORY_REQUIREMENTS_2_KHR };</div>
-<div class="line"><a name="l16211"></a><span class="lineno">16211</span>&#160;        VmaPnextChainPushFront(&amp;memReq2, &amp;memDedicatedReq);</div>
+<div class="line"><a name="l16208"></a><span class="lineno">16208</span>&#160;    <span class="keywordflow">if</span>(pVulkanFunctions != VMA_NULL)</div>
+<div class="line"><a name="l16209"></a><span class="lineno">16209</span>&#160;    {</div>
+<div class="line"><a name="l16210"></a><span class="lineno">16210</span>&#160;        ImportVulkanFunctions_Custom(pVulkanFunctions);</div>
+<div class="line"><a name="l16211"></a><span class="lineno">16211</span>&#160;    }</div>
 <div class="line"><a name="l16212"></a><span class="lineno">16212</span>&#160; </div>
-<div class="line"><a name="l16213"></a><span class="lineno">16213</span>&#160;        (*m_VulkanFunctions.vkGetBufferMemoryRequirements2KHR)(m_hDevice, &amp;memReqInfo, &amp;memReq2);</div>
-<div class="line"><a name="l16214"></a><span class="lineno">16214</span>&#160; </div>
-<div class="line"><a name="l16215"></a><span class="lineno">16215</span>&#160;        memReq = memReq2.memoryRequirements;</div>
-<div class="line"><a name="l16216"></a><span class="lineno">16216</span>&#160;        requiresDedicatedAllocation = (memDedicatedReq.requiresDedicatedAllocation != VK_FALSE);</div>
-<div class="line"><a name="l16217"></a><span class="lineno">16217</span>&#160;        prefersDedicatedAllocation  = (memDedicatedReq.prefersDedicatedAllocation  != VK_FALSE);</div>
-<div class="line"><a name="l16218"></a><span class="lineno">16218</span>&#160;    }</div>
-<div class="line"><a name="l16219"></a><span class="lineno">16219</span>&#160;    <span class="keywordflow">else</span></div>
-<div class="line"><a name="l16220"></a><span class="lineno">16220</span>&#160;<span class="preprocessor">#endif // #if VMA_DEDICATED_ALLOCATION || VMA_VULKAN_VERSION &gt;= 1001000</span></div>
-<div class="line"><a name="l16221"></a><span class="lineno">16221</span>&#160;    {</div>
-<div class="line"><a name="l16222"></a><span class="lineno">16222</span>&#160;        (*m_VulkanFunctions.vkGetBufferMemoryRequirements)(m_hDevice, hBuffer, &amp;memReq);</div>
-<div class="line"><a name="l16223"></a><span class="lineno">16223</span>&#160;        requiresDedicatedAllocation = <span class="keyword">false</span>;</div>
-<div class="line"><a name="l16224"></a><span class="lineno">16224</span>&#160;        prefersDedicatedAllocation  = <span class="keyword">false</span>;</div>
-<div class="line"><a name="l16225"></a><span class="lineno">16225</span>&#160;    }</div>
-<div class="line"><a name="l16226"></a><span class="lineno">16226</span>&#160;}</div>
-<div class="line"><a name="l16227"></a><span class="lineno">16227</span>&#160; </div>
-<div class="line"><a name="l16228"></a><span class="lineno">16228</span>&#160;<span class="keywordtype">void</span> VmaAllocator_T::GetImageMemoryRequirements(</div>
-<div class="line"><a name="l16229"></a><span class="lineno">16229</span>&#160;    VkImage hImage,</div>
-<div class="line"><a name="l16230"></a><span class="lineno">16230</span>&#160;    VkMemoryRequirements&amp; memReq,</div>
-<div class="line"><a name="l16231"></a><span class="lineno">16231</span>&#160;    <span class="keywordtype">bool</span>&amp; requiresDedicatedAllocation,</div>
-<div class="line"><a name="l16232"></a><span class="lineno">16232</span>&#160;    <span class="keywordtype">bool</span>&amp; prefersDedicatedAllocation)<span class="keyword"> const</span></div>
-<div class="line"><a name="l16233"></a><span class="lineno">16233</span>&#160;<span class="keyword"></span>{</div>
-<div class="line"><a name="l16234"></a><span class="lineno">16234</span>&#160;<span class="preprocessor">#if VMA_DEDICATED_ALLOCATION || VMA_VULKAN_VERSION &gt;= 1001000</span></div>
-<div class="line"><a name="l16235"></a><span class="lineno">16235</span>&#160;    <span class="keywordflow">if</span>(m_UseKhrDedicatedAllocation || m_VulkanApiVersion &gt;= VK_MAKE_VERSION(1, 1, 0))</div>
-<div class="line"><a name="l16236"></a><span class="lineno">16236</span>&#160;    {</div>
-<div class="line"><a name="l16237"></a><span class="lineno">16237</span>&#160;        VkImageMemoryRequirementsInfo2KHR memReqInfo = { VK_STRUCTURE_TYPE_IMAGE_MEMORY_REQUIREMENTS_INFO_2_KHR };</div>
-<div class="line"><a name="l16238"></a><span class="lineno">16238</span>&#160;        memReqInfo.image = hImage;</div>
-<div class="line"><a name="l16239"></a><span class="lineno">16239</span>&#160; </div>
-<div class="line"><a name="l16240"></a><span class="lineno">16240</span>&#160;        VkMemoryDedicatedRequirementsKHR memDedicatedReq = { VK_STRUCTURE_TYPE_MEMORY_DEDICATED_REQUIREMENTS_KHR };</div>
-<div class="line"><a name="l16241"></a><span class="lineno">16241</span>&#160; </div>
-<div class="line"><a name="l16242"></a><span class="lineno">16242</span>&#160;        VkMemoryRequirements2KHR memReq2 = { VK_STRUCTURE_TYPE_MEMORY_REQUIREMENTS_2_KHR };</div>
-<div class="line"><a name="l16243"></a><span class="lineno">16243</span>&#160;        VmaPnextChainPushFront(&amp;memReq2, &amp;memDedicatedReq);</div>
-<div class="line"><a name="l16244"></a><span class="lineno">16244</span>&#160; </div>
-<div class="line"><a name="l16245"></a><span class="lineno">16245</span>&#160;        (*m_VulkanFunctions.vkGetImageMemoryRequirements2KHR)(m_hDevice, &amp;memReqInfo, &amp;memReq2);</div>
-<div class="line"><a name="l16246"></a><span class="lineno">16246</span>&#160; </div>
-<div class="line"><a name="l16247"></a><span class="lineno">16247</span>&#160;        memReq = memReq2.memoryRequirements;</div>
-<div class="line"><a name="l16248"></a><span class="lineno">16248</span>&#160;        requiresDedicatedAllocation = (memDedicatedReq.requiresDedicatedAllocation != VK_FALSE);</div>
-<div class="line"><a name="l16249"></a><span class="lineno">16249</span>&#160;        prefersDedicatedAllocation  = (memDedicatedReq.prefersDedicatedAllocation  != VK_FALSE);</div>
-<div class="line"><a name="l16250"></a><span class="lineno">16250</span>&#160;    }</div>
-<div class="line"><a name="l16251"></a><span class="lineno">16251</span>&#160;    <span class="keywordflow">else</span></div>
-<div class="line"><a name="l16252"></a><span class="lineno">16252</span>&#160;<span class="preprocessor">#endif // #if VMA_DEDICATED_ALLOCATION || VMA_VULKAN_VERSION &gt;= 1001000</span></div>
-<div class="line"><a name="l16253"></a><span class="lineno">16253</span>&#160;    {</div>
-<div class="line"><a name="l16254"></a><span class="lineno">16254</span>&#160;        (*m_VulkanFunctions.vkGetImageMemoryRequirements)(m_hDevice, hImage, &amp;memReq);</div>
-<div class="line"><a name="l16255"></a><span class="lineno">16255</span>&#160;        requiresDedicatedAllocation = <span class="keyword">false</span>;</div>
-<div class="line"><a name="l16256"></a><span class="lineno">16256</span>&#160;        prefersDedicatedAllocation  = <span class="keyword">false</span>;</div>
-<div class="line"><a name="l16257"></a><span class="lineno">16257</span>&#160;    }</div>
-<div class="line"><a name="l16258"></a><span class="lineno">16258</span>&#160;}</div>
-<div class="line"><a name="l16259"></a><span class="lineno">16259</span>&#160; </div>
-<div class="line"><a name="l16260"></a><span class="lineno">16260</span>&#160;VkResult VmaAllocator_T::AllocateMemory(</div>
-<div class="line"><a name="l16261"></a><span class="lineno">16261</span>&#160;    <span class="keyword">const</span> VkMemoryRequirements&amp; vkMemReq,</div>
-<div class="line"><a name="l16262"></a><span class="lineno">16262</span>&#160;    <span class="keywordtype">bool</span> requiresDedicatedAllocation,</div>
-<div class="line"><a name="l16263"></a><span class="lineno">16263</span>&#160;    <span class="keywordtype">bool</span> prefersDedicatedAllocation,</div>
-<div class="line"><a name="l16264"></a><span class="lineno">16264</span>&#160;    VkBuffer dedicatedBuffer,</div>
-<div class="line"><a name="l16265"></a><span class="lineno">16265</span>&#160;    VkBufferUsageFlags dedicatedBufferUsage,</div>
-<div class="line"><a name="l16266"></a><span class="lineno">16266</span>&#160;    VkImage dedicatedImage,</div>
-<div class="line"><a name="l16267"></a><span class="lineno">16267</span>&#160;    <span class="keyword">const</span> <a class="code" href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a>&amp; createInfo,</div>
-<div class="line"><a name="l16268"></a><span class="lineno">16268</span>&#160;    VmaSuballocationType suballocType,</div>
-<div class="line"><a name="l16269"></a><span class="lineno">16269</span>&#160;    <span class="keywordtype">size_t</span> allocationCount,</div>
-<div class="line"><a name="l16270"></a><span class="lineno">16270</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a>* pAllocations)</div>
-<div class="line"><a name="l16271"></a><span class="lineno">16271</span>&#160;{</div>
-<div class="line"><a name="l16272"></a><span class="lineno">16272</span>&#160;    memset(pAllocations, 0, <span class="keyword">sizeof</span>(<a class="code" href="struct_vma_allocation.html">VmaAllocation</a>) * allocationCount);</div>
-<div class="line"><a name="l16273"></a><span class="lineno">16273</span>&#160; </div>
-<div class="line"><a name="l16274"></a><span class="lineno">16274</span>&#160;    VMA_ASSERT(VmaIsPow2(vkMemReq.alignment));</div>
-<div class="line"><a name="l16275"></a><span class="lineno">16275</span>&#160; </div>
-<div class="line"><a name="l16276"></a><span class="lineno">16276</span>&#160;    <span class="keywordflow">if</span>(vkMemReq.size == 0)</div>
-<div class="line"><a name="l16277"></a><span class="lineno">16277</span>&#160;    {</div>
-<div class="line"><a name="l16278"></a><span class="lineno">16278</span>&#160;        <span class="keywordflow">return</span> VK_ERROR_VALIDATION_FAILED_EXT;</div>
-<div class="line"><a name="l16279"></a><span class="lineno">16279</span>&#160;    }</div>
-<div class="line"><a name="l16280"></a><span class="lineno">16280</span>&#160;    <span class="keywordflow">if</span>((createInfo.<a class="code" href="struct_vma_allocation_create_info.html#add09658ac14fe290ace25470ddd6d41b">flags</a> &amp; <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a3fc311d855c2ff53f1090ef5c722b38f">VMA_ALLOCATION_CREATE_DEDICATED_MEMORY_BIT</a>) != 0 &amp;&amp;</div>
-<div class="line"><a name="l16281"></a><span class="lineno">16281</span>&#160;        (createInfo.<a class="code" href="struct_vma_allocation_create_info.html#add09658ac14fe290ace25470ddd6d41b">flags</a> &amp; <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a89759603401014eb325eb22a3839f2ff">VMA_ALLOCATION_CREATE_NEVER_ALLOCATE_BIT</a>) != 0)</div>
-<div class="line"><a name="l16282"></a><span class="lineno">16282</span>&#160;    {</div>
-<div class="line"><a name="l16283"></a><span class="lineno">16283</span>&#160;        VMA_ASSERT(0 &amp;&amp; <span class="stringliteral">&quot;Specifying VMA_ALLOCATION_CREATE_DEDICATED_MEMORY_BIT together with VMA_ALLOCATION_CREATE_NEVER_ALLOCATE_BIT makes no sense.&quot;</span>);</div>
-<div class="line"><a name="l16284"></a><span class="lineno">16284</span>&#160;        <span class="keywordflow">return</span> VK_ERROR_OUT_OF_DEVICE_MEMORY;</div>
-<div class="line"><a name="l16285"></a><span class="lineno">16285</span>&#160;    }</div>
-<div class="line"><a name="l16286"></a><span class="lineno">16286</span>&#160;    <span class="keywordflow">if</span>((createInfo.<a class="code" href="struct_vma_allocation_create_info.html#add09658ac14fe290ace25470ddd6d41b">flags</a> &amp; <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a11da372cc3a82931c5e5d6146cd9dd1f">VMA_ALLOCATION_CREATE_MAPPED_BIT</a>) != 0 &amp;&amp;</div>
-<div class="line"><a name="l16287"></a><span class="lineno">16287</span>&#160;        (createInfo.<a class="code" href="struct_vma_allocation_create_info.html#add09658ac14fe290ace25470ddd6d41b">flags</a> &amp; <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a5f436af6c8fe8540573a6d22627a6fd2">VMA_ALLOCATION_CREATE_CAN_BECOME_LOST_BIT</a>) != 0)</div>
-<div class="line"><a name="l16288"></a><span class="lineno">16288</span>&#160;    {</div>
-<div class="line"><a name="l16289"></a><span class="lineno">16289</span>&#160;        VMA_ASSERT(0 &amp;&amp; <span class="stringliteral">&quot;Specifying VMA_ALLOCATION_CREATE_MAPPED_BIT together with VMA_ALLOCATION_CREATE_CAN_BECOME_LOST_BIT is invalid.&quot;</span>);</div>
-<div class="line"><a name="l16290"></a><span class="lineno">16290</span>&#160;        <span class="keywordflow">return</span> VK_ERROR_OUT_OF_DEVICE_MEMORY;</div>
-<div class="line"><a name="l16291"></a><span class="lineno">16291</span>&#160;    }</div>
-<div class="line"><a name="l16292"></a><span class="lineno">16292</span>&#160;    <span class="keywordflow">if</span>(requiresDedicatedAllocation)</div>
-<div class="line"><a name="l16293"></a><span class="lineno">16293</span>&#160;    {</div>
-<div class="line"><a name="l16294"></a><span class="lineno">16294</span>&#160;        <span class="keywordflow">if</span>((createInfo.<a class="code" href="struct_vma_allocation_create_info.html#add09658ac14fe290ace25470ddd6d41b">flags</a> &amp; <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a89759603401014eb325eb22a3839f2ff">VMA_ALLOCATION_CREATE_NEVER_ALLOCATE_BIT</a>) != 0)</div>
-<div class="line"><a name="l16295"></a><span class="lineno">16295</span>&#160;        {</div>
-<div class="line"><a name="l16296"></a><span class="lineno">16296</span>&#160;            VMA_ASSERT(0 &amp;&amp; <span class="stringliteral">&quot;VMA_ALLOCATION_CREATE_NEVER_ALLOCATE_BIT specified while dedicated allocation is required.&quot;</span>);</div>
-<div class="line"><a name="l16297"></a><span class="lineno">16297</span>&#160;            <span class="keywordflow">return</span> VK_ERROR_OUT_OF_DEVICE_MEMORY;</div>
-<div class="line"><a name="l16298"></a><span class="lineno">16298</span>&#160;        }</div>
-<div class="line"><a name="l16299"></a><span class="lineno">16299</span>&#160;        <span class="keywordflow">if</span>(createInfo.<a class="code" href="struct_vma_allocation_create_info.html#a6272c0555cfd1fe28bff1afeb6190150">pool</a> != VK_NULL_HANDLE)</div>
-<div class="line"><a name="l16300"></a><span class="lineno">16300</span>&#160;        {</div>
-<div class="line"><a name="l16301"></a><span class="lineno">16301</span>&#160;            VMA_ASSERT(0 &amp;&amp; <span class="stringliteral">&quot;Pool specified while dedicated allocation is required.&quot;</span>);</div>
-<div class="line"><a name="l16302"></a><span class="lineno">16302</span>&#160;            <span class="keywordflow">return</span> VK_ERROR_OUT_OF_DEVICE_MEMORY;</div>
-<div class="line"><a name="l16303"></a><span class="lineno">16303</span>&#160;        }</div>
-<div class="line"><a name="l16304"></a><span class="lineno">16304</span>&#160;    }</div>
-<div class="line"><a name="l16305"></a><span class="lineno">16305</span>&#160;    <span class="keywordflow">if</span>((createInfo.<a class="code" href="struct_vma_allocation_create_info.html#a6272c0555cfd1fe28bff1afeb6190150">pool</a> != VK_NULL_HANDLE) &amp;&amp;</div>
-<div class="line"><a name="l16306"></a><span class="lineno">16306</span>&#160;        ((createInfo.<a class="code" href="struct_vma_allocation_create_info.html#add09658ac14fe290ace25470ddd6d41b">flags</a> &amp; (<a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a3fc311d855c2ff53f1090ef5c722b38f">VMA_ALLOCATION_CREATE_DEDICATED_MEMORY_BIT</a>)) != 0))</div>
-<div class="line"><a name="l16307"></a><span class="lineno">16307</span>&#160;    {</div>
-<div class="line"><a name="l16308"></a><span class="lineno">16308</span>&#160;        VMA_ASSERT(0 &amp;&amp; <span class="stringliteral">&quot;Specifying VMA_ALLOCATION_CREATE_DEDICATED_MEMORY_BIT when pool != null is invalid.&quot;</span>);</div>
-<div class="line"><a name="l16309"></a><span class="lineno">16309</span>&#160;        <span class="keywordflow">return</span> VK_ERROR_OUT_OF_DEVICE_MEMORY;</div>
-<div class="line"><a name="l16310"></a><span class="lineno">16310</span>&#160;    }</div>
-<div class="line"><a name="l16311"></a><span class="lineno">16311</span>&#160; </div>
-<div class="line"><a name="l16312"></a><span class="lineno">16312</span>&#160;    <span class="keywordflow">if</span>(createInfo.<a class="code" href="struct_vma_allocation_create_info.html#a6272c0555cfd1fe28bff1afeb6190150">pool</a> != VK_NULL_HANDLE)</div>
-<div class="line"><a name="l16313"></a><span class="lineno">16313</span>&#160;    {</div>
-<div class="line"><a name="l16314"></a><span class="lineno">16314</span>&#160;        <span class="keyword">const</span> VkDeviceSize alignmentForPool = VMA_MAX(</div>
-<div class="line"><a name="l16315"></a><span class="lineno">16315</span>&#160;            vkMemReq.alignment,</div>
-<div class="line"><a name="l16316"></a><span class="lineno">16316</span>&#160;            GetMemoryTypeMinAlignment(createInfo.<a class="code" href="struct_vma_allocation_create_info.html#a6272c0555cfd1fe28bff1afeb6190150">pool</a>-&gt;m_BlockVector.GetMemoryTypeIndex()));</div>
-<div class="line"><a name="l16317"></a><span class="lineno">16317</span>&#160; </div>
-<div class="line"><a name="l16318"></a><span class="lineno">16318</span>&#160;        <a class="code" href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a> createInfoForPool = createInfo;</div>
-<div class="line"><a name="l16319"></a><span class="lineno">16319</span>&#160;        <span class="comment">// If memory type is not HOST_VISIBLE, disable MAPPED.</span></div>
-<div class="line"><a name="l16320"></a><span class="lineno">16320</span>&#160;        <span class="keywordflow">if</span>((createInfoForPool.<a class="code" href="struct_vma_allocation_create_info.html#add09658ac14fe290ace25470ddd6d41b">flags</a> &amp; <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a11da372cc3a82931c5e5d6146cd9dd1f">VMA_ALLOCATION_CREATE_MAPPED_BIT</a>) != 0 &amp;&amp;</div>
-<div class="line"><a name="l16321"></a><span class="lineno">16321</span>&#160;            (m_MemProps.memoryTypes[createInfo.<a class="code" href="struct_vma_allocation_create_info.html#a6272c0555cfd1fe28bff1afeb6190150">pool</a>-&gt;m_BlockVector.GetMemoryTypeIndex()].propertyFlags &amp; VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT) == 0)</div>
-<div class="line"><a name="l16322"></a><span class="lineno">16322</span>&#160;        {</div>
-<div class="line"><a name="l16323"></a><span class="lineno">16323</span>&#160;            createInfoForPool.<a class="code" href="struct_vma_allocation_create_info.html#add09658ac14fe290ace25470ddd6d41b">flags</a> &amp;= ~<a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a11da372cc3a82931c5e5d6146cd9dd1f">VMA_ALLOCATION_CREATE_MAPPED_BIT</a>;</div>
-<div class="line"><a name="l16324"></a><span class="lineno">16324</span>&#160;        }</div>
-<div class="line"><a name="l16325"></a><span class="lineno">16325</span>&#160; </div>
-<div class="line"><a name="l16326"></a><span class="lineno">16326</span>&#160;        <span class="keywordflow">return</span> createInfo.<a class="code" href="struct_vma_allocation_create_info.html#a6272c0555cfd1fe28bff1afeb6190150">pool</a>-&gt;m_BlockVector.Allocate(</div>
-<div class="line"><a name="l16327"></a><span class="lineno">16327</span>&#160;            m_CurrentFrameIndex.load(),</div>
-<div class="line"><a name="l16328"></a><span class="lineno">16328</span>&#160;            vkMemReq.size,</div>
-<div class="line"><a name="l16329"></a><span class="lineno">16329</span>&#160;            alignmentForPool,</div>
-<div class="line"><a name="l16330"></a><span class="lineno">16330</span>&#160;            createInfoForPool,</div>
-<div class="line"><a name="l16331"></a><span class="lineno">16331</span>&#160;            suballocType,</div>
-<div class="line"><a name="l16332"></a><span class="lineno">16332</span>&#160;            allocationCount,</div>
-<div class="line"><a name="l16333"></a><span class="lineno">16333</span>&#160;            pAllocations);</div>
-<div class="line"><a name="l16334"></a><span class="lineno">16334</span>&#160;    }</div>
-<div class="line"><a name="l16335"></a><span class="lineno">16335</span>&#160;    <span class="keywordflow">else</span></div>
-<div class="line"><a name="l16336"></a><span class="lineno">16336</span>&#160;    {</div>
-<div class="line"><a name="l16337"></a><span class="lineno">16337</span>&#160;        <span class="comment">// Bit mask of memory Vulkan types acceptable for this allocation.</span></div>
-<div class="line"><a name="l16338"></a><span class="lineno">16338</span>&#160;        uint32_t memoryTypeBits = vkMemReq.memoryTypeBits;</div>
-<div class="line"><a name="l16339"></a><span class="lineno">16339</span>&#160;        uint32_t memTypeIndex = UINT32_MAX;</div>
-<div class="line"><a name="l16340"></a><span class="lineno">16340</span>&#160;        VkResult res = <a class="code" href="vk__mem__alloc_8h.html#aef15a94b58fbcb0fe706d5720e84a74a">vmaFindMemoryTypeIndex</a>(<span class="keyword">this</span>, memoryTypeBits, &amp;createInfo, &amp;memTypeIndex);</div>
-<div class="line"><a name="l16341"></a><span class="lineno">16341</span>&#160;        <span class="keywordflow">if</span>(res == VK_SUCCESS)</div>
-<div class="line"><a name="l16342"></a><span class="lineno">16342</span>&#160;        {</div>
-<div class="line"><a name="l16343"></a><span class="lineno">16343</span>&#160;            VkDeviceSize alignmentForMemType = VMA_MAX(</div>
-<div class="line"><a name="l16344"></a><span class="lineno">16344</span>&#160;                vkMemReq.alignment,</div>
-<div class="line"><a name="l16345"></a><span class="lineno">16345</span>&#160;                GetMemoryTypeMinAlignment(memTypeIndex));</div>
-<div class="line"><a name="l16346"></a><span class="lineno">16346</span>&#160; </div>
-<div class="line"><a name="l16347"></a><span class="lineno">16347</span>&#160;            res = AllocateMemoryOfType(</div>
-<div class="line"><a name="l16348"></a><span class="lineno">16348</span>&#160;                vkMemReq.size,</div>
-<div class="line"><a name="l16349"></a><span class="lineno">16349</span>&#160;                alignmentForMemType,</div>
-<div class="line"><a name="l16350"></a><span class="lineno">16350</span>&#160;                requiresDedicatedAllocation || prefersDedicatedAllocation,</div>
-<div class="line"><a name="l16351"></a><span class="lineno">16351</span>&#160;                dedicatedBuffer,</div>
-<div class="line"><a name="l16352"></a><span class="lineno">16352</span>&#160;                dedicatedBufferUsage,</div>
-<div class="line"><a name="l16353"></a><span class="lineno">16353</span>&#160;                dedicatedImage,</div>
-<div class="line"><a name="l16354"></a><span class="lineno">16354</span>&#160;                createInfo,</div>
-<div class="line"><a name="l16355"></a><span class="lineno">16355</span>&#160;                memTypeIndex,</div>
-<div class="line"><a name="l16356"></a><span class="lineno">16356</span>&#160;                suballocType,</div>
-<div class="line"><a name="l16357"></a><span class="lineno">16357</span>&#160;                allocationCount,</div>
-<div class="line"><a name="l16358"></a><span class="lineno">16358</span>&#160;                pAllocations);</div>
-<div class="line"><a name="l16359"></a><span class="lineno">16359</span>&#160;            <span class="comment">// Succeeded on first try.</span></div>
-<div class="line"><a name="l16360"></a><span class="lineno">16360</span>&#160;            <span class="keywordflow">if</span>(res == VK_SUCCESS)</div>
-<div class="line"><a name="l16361"></a><span class="lineno">16361</span>&#160;            {</div>
-<div class="line"><a name="l16362"></a><span class="lineno">16362</span>&#160;                <span class="keywordflow">return</span> res;</div>
-<div class="line"><a name="l16363"></a><span class="lineno">16363</span>&#160;            }</div>
-<div class="line"><a name="l16364"></a><span class="lineno">16364</span>&#160;            <span class="comment">// Allocation from this memory type failed. Try other compatible memory types.</span></div>
-<div class="line"><a name="l16365"></a><span class="lineno">16365</span>&#160;            <span class="keywordflow">else</span></div>
-<div class="line"><a name="l16366"></a><span class="lineno">16366</span>&#160;            {</div>
-<div class="line"><a name="l16367"></a><span class="lineno">16367</span>&#160;                <span class="keywordflow">for</span>(;;)</div>
-<div class="line"><a name="l16368"></a><span class="lineno">16368</span>&#160;                {</div>
-<div class="line"><a name="l16369"></a><span class="lineno">16369</span>&#160;                    <span class="comment">// Remove old memTypeIndex from list of possibilities.</span></div>
-<div class="line"><a name="l16370"></a><span class="lineno">16370</span>&#160;                    memoryTypeBits &amp;= ~(1u &lt;&lt; memTypeIndex);</div>
-<div class="line"><a name="l16371"></a><span class="lineno">16371</span>&#160;                    <span class="comment">// Find alternative memTypeIndex.</span></div>
-<div class="line"><a name="l16372"></a><span class="lineno">16372</span>&#160;                    res = <a class="code" href="vk__mem__alloc_8h.html#aef15a94b58fbcb0fe706d5720e84a74a">vmaFindMemoryTypeIndex</a>(<span class="keyword">this</span>, memoryTypeBits, &amp;createInfo, &amp;memTypeIndex);</div>
-<div class="line"><a name="l16373"></a><span class="lineno">16373</span>&#160;                    <span class="keywordflow">if</span>(res == VK_SUCCESS)</div>
-<div class="line"><a name="l16374"></a><span class="lineno">16374</span>&#160;                    {</div>
-<div class="line"><a name="l16375"></a><span class="lineno">16375</span>&#160;                        alignmentForMemType = VMA_MAX(</div>
-<div class="line"><a name="l16376"></a><span class="lineno">16376</span>&#160;                            vkMemReq.alignment,</div>
-<div class="line"><a name="l16377"></a><span class="lineno">16377</span>&#160;                            GetMemoryTypeMinAlignment(memTypeIndex));</div>
-<div class="line"><a name="l16378"></a><span class="lineno">16378</span>&#160;                        </div>
-<div class="line"><a name="l16379"></a><span class="lineno">16379</span>&#160;                        res = AllocateMemoryOfType(</div>
-<div class="line"><a name="l16380"></a><span class="lineno">16380</span>&#160;                            vkMemReq.size,</div>
-<div class="line"><a name="l16381"></a><span class="lineno">16381</span>&#160;                            alignmentForMemType,</div>
-<div class="line"><a name="l16382"></a><span class="lineno">16382</span>&#160;                            requiresDedicatedAllocation || prefersDedicatedAllocation,</div>
-<div class="line"><a name="l16383"></a><span class="lineno">16383</span>&#160;                            dedicatedBuffer,</div>
-<div class="line"><a name="l16384"></a><span class="lineno">16384</span>&#160;                            dedicatedBufferUsage,</div>
-<div class="line"><a name="l16385"></a><span class="lineno">16385</span>&#160;                            dedicatedImage,</div>
-<div class="line"><a name="l16386"></a><span class="lineno">16386</span>&#160;                            createInfo,</div>
-<div class="line"><a name="l16387"></a><span class="lineno">16387</span>&#160;                            memTypeIndex,</div>
-<div class="line"><a name="l16388"></a><span class="lineno">16388</span>&#160;                            suballocType,</div>
-<div class="line"><a name="l16389"></a><span class="lineno">16389</span>&#160;                            allocationCount,</div>
-<div class="line"><a name="l16390"></a><span class="lineno">16390</span>&#160;                            pAllocations);</div>
-<div class="line"><a name="l16391"></a><span class="lineno">16391</span>&#160;                        <span class="comment">// Allocation from this alternative memory type succeeded.</span></div>
-<div class="line"><a name="l16392"></a><span class="lineno">16392</span>&#160;                        <span class="keywordflow">if</span>(res == VK_SUCCESS)</div>
-<div class="line"><a name="l16393"></a><span class="lineno">16393</span>&#160;                        {</div>
-<div class="line"><a name="l16394"></a><span class="lineno">16394</span>&#160;                            <span class="keywordflow">return</span> res;</div>
-<div class="line"><a name="l16395"></a><span class="lineno">16395</span>&#160;                        }</div>
-<div class="line"><a name="l16396"></a><span class="lineno">16396</span>&#160;                        <span class="comment">// else: Allocation from this memory type failed. Try next one - next loop iteration.</span></div>
-<div class="line"><a name="l16397"></a><span class="lineno">16397</span>&#160;                    }</div>
-<div class="line"><a name="l16398"></a><span class="lineno">16398</span>&#160;                    <span class="comment">// No other matching memory type index could be found.</span></div>
-<div class="line"><a name="l16399"></a><span class="lineno">16399</span>&#160;                    <span class="keywordflow">else</span></div>
-<div class="line"><a name="l16400"></a><span class="lineno">16400</span>&#160;                    {</div>
-<div class="line"><a name="l16401"></a><span class="lineno">16401</span>&#160;                        <span class="comment">// Not returning res, which is VK_ERROR_FEATURE_NOT_PRESENT, because we already failed to allocate once.</span></div>
-<div class="line"><a name="l16402"></a><span class="lineno">16402</span>&#160;                        <span class="keywordflow">return</span> VK_ERROR_OUT_OF_DEVICE_MEMORY;</div>
-<div class="line"><a name="l16403"></a><span class="lineno">16403</span>&#160;                    }</div>
-<div class="line"><a name="l16404"></a><span class="lineno">16404</span>&#160;                }</div>
-<div class="line"><a name="l16405"></a><span class="lineno">16405</span>&#160;            }</div>
-<div class="line"><a name="l16406"></a><span class="lineno">16406</span>&#160;        }</div>
-<div class="line"><a name="l16407"></a><span class="lineno">16407</span>&#160;        <span class="comment">// Can&#39;t find any single memory type maching requirements. res is VK_ERROR_FEATURE_NOT_PRESENT.</span></div>
-<div class="line"><a name="l16408"></a><span class="lineno">16408</span>&#160;        <span class="keywordflow">else</span></div>
-<div class="line"><a name="l16409"></a><span class="lineno">16409</span>&#160;            <span class="keywordflow">return</span> res;</div>
-<div class="line"><a name="l16410"></a><span class="lineno">16410</span>&#160;    }</div>
-<div class="line"><a name="l16411"></a><span class="lineno">16411</span>&#160;}</div>
-<div class="line"><a name="l16412"></a><span class="lineno">16412</span>&#160; </div>
-<div class="line"><a name="l16413"></a><span class="lineno">16413</span>&#160;<span class="keywordtype">void</span> VmaAllocator_T::FreeMemory(</div>
-<div class="line"><a name="l16414"></a><span class="lineno">16414</span>&#160;    <span class="keywordtype">size_t</span> allocationCount,</div>
-<div class="line"><a name="l16415"></a><span class="lineno">16415</span>&#160;    <span class="keyword">const</span> <a class="code" href="struct_vma_allocation.html">VmaAllocation</a>* pAllocations)</div>
+<div class="line"><a name="l16213"></a><span class="lineno">16213</span>&#160;<span class="preprocessor">#if VMA_DYNAMIC_VULKAN_FUNCTIONS == 1</span></div>
+<div class="line"><a name="l16214"></a><span class="lineno">16214</span>&#160;    ImportVulkanFunctions_Dynamic();</div>
+<div class="line"><a name="l16215"></a><span class="lineno">16215</span>&#160;<span class="preprocessor">#endif</span></div>
+<div class="line"><a name="l16216"></a><span class="lineno">16216</span>&#160; </div>
+<div class="line"><a name="l16217"></a><span class="lineno">16217</span>&#160;    ValidateVulkanFunctions();</div>
+<div class="line"><a name="l16218"></a><span class="lineno">16218</span>&#160;}</div>
+<div class="line"><a name="l16219"></a><span class="lineno">16219</span>&#160; </div>
+<div class="line"><a name="l16220"></a><span class="lineno">16220</span>&#160;<span class="preprocessor">#if VMA_STATIC_VULKAN_FUNCTIONS == 1</span></div>
+<div class="line"><a name="l16221"></a><span class="lineno">16221</span>&#160; </div>
+<div class="line"><a name="l16222"></a><span class="lineno">16222</span>&#160;<span class="keywordtype">void</span> VmaAllocator_T::ImportVulkanFunctions_Static()</div>
+<div class="line"><a name="l16223"></a><span class="lineno">16223</span>&#160;{</div>
+<div class="line"><a name="l16224"></a><span class="lineno">16224</span>&#160;    <span class="comment">// Vulkan 1.0</span></div>
+<div class="line"><a name="l16225"></a><span class="lineno">16225</span>&#160;    m_VulkanFunctions.vkGetPhysicalDeviceProperties = (PFN_vkGetPhysicalDeviceProperties)vkGetPhysicalDeviceProperties;</div>
+<div class="line"><a name="l16226"></a><span class="lineno">16226</span>&#160;    m_VulkanFunctions.vkGetPhysicalDeviceMemoryProperties = (PFN_vkGetPhysicalDeviceMemoryProperties)vkGetPhysicalDeviceMemoryProperties;</div>
+<div class="line"><a name="l16227"></a><span class="lineno">16227</span>&#160;    m_VulkanFunctions.vkAllocateMemory = (PFN_vkAllocateMemory)vkAllocateMemory;</div>
+<div class="line"><a name="l16228"></a><span class="lineno">16228</span>&#160;    m_VulkanFunctions.vkFreeMemory = (PFN_vkFreeMemory)vkFreeMemory;</div>
+<div class="line"><a name="l16229"></a><span class="lineno">16229</span>&#160;    m_VulkanFunctions.vkMapMemory = (PFN_vkMapMemory)vkMapMemory;</div>
+<div class="line"><a name="l16230"></a><span class="lineno">16230</span>&#160;    m_VulkanFunctions.vkUnmapMemory = (PFN_vkUnmapMemory)vkUnmapMemory;</div>
+<div class="line"><a name="l16231"></a><span class="lineno">16231</span>&#160;    m_VulkanFunctions.vkFlushMappedMemoryRanges = (PFN_vkFlushMappedMemoryRanges)vkFlushMappedMemoryRanges;</div>
+<div class="line"><a name="l16232"></a><span class="lineno">16232</span>&#160;    m_VulkanFunctions.vkInvalidateMappedMemoryRanges = (PFN_vkInvalidateMappedMemoryRanges)vkInvalidateMappedMemoryRanges;</div>
+<div class="line"><a name="l16233"></a><span class="lineno">16233</span>&#160;    m_VulkanFunctions.vkBindBufferMemory = (PFN_vkBindBufferMemory)vkBindBufferMemory;</div>
+<div class="line"><a name="l16234"></a><span class="lineno">16234</span>&#160;    m_VulkanFunctions.vkBindImageMemory = (PFN_vkBindImageMemory)vkBindImageMemory;</div>
+<div class="line"><a name="l16235"></a><span class="lineno">16235</span>&#160;    m_VulkanFunctions.vkGetBufferMemoryRequirements = (PFN_vkGetBufferMemoryRequirements)vkGetBufferMemoryRequirements;</div>
+<div class="line"><a name="l16236"></a><span class="lineno">16236</span>&#160;    m_VulkanFunctions.vkGetImageMemoryRequirements = (PFN_vkGetImageMemoryRequirements)vkGetImageMemoryRequirements;</div>
+<div class="line"><a name="l16237"></a><span class="lineno">16237</span>&#160;    m_VulkanFunctions.vkCreateBuffer = (PFN_vkCreateBuffer)vkCreateBuffer;</div>
+<div class="line"><a name="l16238"></a><span class="lineno">16238</span>&#160;    m_VulkanFunctions.vkDestroyBuffer = (PFN_vkDestroyBuffer)vkDestroyBuffer;</div>
+<div class="line"><a name="l16239"></a><span class="lineno">16239</span>&#160;    m_VulkanFunctions.vkCreateImage = (PFN_vkCreateImage)vkCreateImage;</div>
+<div class="line"><a name="l16240"></a><span class="lineno">16240</span>&#160;    m_VulkanFunctions.vkDestroyImage = (PFN_vkDestroyImage)vkDestroyImage;</div>
+<div class="line"><a name="l16241"></a><span class="lineno">16241</span>&#160;    m_VulkanFunctions.vkCmdCopyBuffer = (PFN_vkCmdCopyBuffer)vkCmdCopyBuffer;</div>
+<div class="line"><a name="l16242"></a><span class="lineno">16242</span>&#160; </div>
+<div class="line"><a name="l16243"></a><span class="lineno">16243</span>&#160;    <span class="comment">// Vulkan 1.1</span></div>
+<div class="line"><a name="l16244"></a><span class="lineno">16244</span>&#160;<span class="preprocessor">#if VMA_VULKAN_VERSION &gt;= 1001000</span></div>
+<div class="line"><a name="l16245"></a><span class="lineno">16245</span>&#160;    <span class="keywordflow">if</span>(m_VulkanApiVersion &gt;= VK_MAKE_VERSION(1, 1, 0))</div>
+<div class="line"><a name="l16246"></a><span class="lineno">16246</span>&#160;    {</div>
+<div class="line"><a name="l16247"></a><span class="lineno">16247</span>&#160;        m_VulkanFunctions.vkGetBufferMemoryRequirements2KHR = (PFN_vkGetBufferMemoryRequirements2)vkGetBufferMemoryRequirements2;</div>
+<div class="line"><a name="l16248"></a><span class="lineno">16248</span>&#160;        m_VulkanFunctions.vkGetImageMemoryRequirements2KHR = (PFN_vkGetImageMemoryRequirements2)vkGetImageMemoryRequirements2;</div>
+<div class="line"><a name="l16249"></a><span class="lineno">16249</span>&#160;        m_VulkanFunctions.vkBindBufferMemory2KHR = (PFN_vkBindBufferMemory2)vkBindBufferMemory2;</div>
+<div class="line"><a name="l16250"></a><span class="lineno">16250</span>&#160;        m_VulkanFunctions.vkBindImageMemory2KHR = (PFN_vkBindImageMemory2)vkBindImageMemory2;</div>
+<div class="line"><a name="l16251"></a><span class="lineno">16251</span>&#160;        m_VulkanFunctions.vkGetPhysicalDeviceMemoryProperties2KHR = (PFN_vkGetPhysicalDeviceMemoryProperties2)vkGetPhysicalDeviceMemoryProperties2;</div>
+<div class="line"><a name="l16252"></a><span class="lineno">16252</span>&#160;    }</div>
+<div class="line"><a name="l16253"></a><span class="lineno">16253</span>&#160;<span class="preprocessor">#endif</span></div>
+<div class="line"><a name="l16254"></a><span class="lineno">16254</span>&#160;}</div>
+<div class="line"><a name="l16255"></a><span class="lineno">16255</span>&#160; </div>
+<div class="line"><a name="l16256"></a><span class="lineno">16256</span>&#160;<span class="preprocessor">#endif </span><span class="comment">// #if VMA_STATIC_VULKAN_FUNCTIONS == 1</span></div>
+<div class="line"><a name="l16257"></a><span class="lineno">16257</span>&#160; </div>
+<div class="line"><a name="l16258"></a><span class="lineno">16258</span>&#160;<span class="keywordtype">void</span> VmaAllocator_T::ImportVulkanFunctions_Custom(<span class="keyword">const</span> <a class="code" href="struct_vma_vulkan_functions.html">VmaVulkanFunctions</a>* pVulkanFunctions)</div>
+<div class="line"><a name="l16259"></a><span class="lineno">16259</span>&#160;{</div>
+<div class="line"><a name="l16260"></a><span class="lineno">16260</span>&#160;    VMA_ASSERT(pVulkanFunctions != VMA_NULL);</div>
+<div class="line"><a name="l16261"></a><span class="lineno">16261</span>&#160; </div>
+<div class="line"><a name="l16262"></a><span class="lineno">16262</span>&#160;<span class="preprocessor">#define VMA_COPY_IF_NOT_NULL(funcName) \</span></div>
+<div class="line"><a name="l16263"></a><span class="lineno">16263</span>&#160;<span class="preprocessor">    if(pVulkanFunctions-&gt;funcName != VMA_NULL) m_VulkanFunctions.funcName = pVulkanFunctions-&gt;funcName;</span></div>
+<div class="line"><a name="l16264"></a><span class="lineno">16264</span>&#160; </div>
+<div class="line"><a name="l16265"></a><span class="lineno">16265</span>&#160;    VMA_COPY_IF_NOT_NULL(vkGetPhysicalDeviceProperties);</div>
+<div class="line"><a name="l16266"></a><span class="lineno">16266</span>&#160;    VMA_COPY_IF_NOT_NULL(vkGetPhysicalDeviceMemoryProperties);</div>
+<div class="line"><a name="l16267"></a><span class="lineno">16267</span>&#160;    VMA_COPY_IF_NOT_NULL(vkAllocateMemory);</div>
+<div class="line"><a name="l16268"></a><span class="lineno">16268</span>&#160;    VMA_COPY_IF_NOT_NULL(vkFreeMemory);</div>
+<div class="line"><a name="l16269"></a><span class="lineno">16269</span>&#160;    VMA_COPY_IF_NOT_NULL(vkMapMemory);</div>
+<div class="line"><a name="l16270"></a><span class="lineno">16270</span>&#160;    VMA_COPY_IF_NOT_NULL(vkUnmapMemory);</div>
+<div class="line"><a name="l16271"></a><span class="lineno">16271</span>&#160;    VMA_COPY_IF_NOT_NULL(vkFlushMappedMemoryRanges);</div>
+<div class="line"><a name="l16272"></a><span class="lineno">16272</span>&#160;    VMA_COPY_IF_NOT_NULL(vkInvalidateMappedMemoryRanges);</div>
+<div class="line"><a name="l16273"></a><span class="lineno">16273</span>&#160;    VMA_COPY_IF_NOT_NULL(vkBindBufferMemory);</div>
+<div class="line"><a name="l16274"></a><span class="lineno">16274</span>&#160;    VMA_COPY_IF_NOT_NULL(vkBindImageMemory);</div>
+<div class="line"><a name="l16275"></a><span class="lineno">16275</span>&#160;    VMA_COPY_IF_NOT_NULL(vkGetBufferMemoryRequirements);</div>
+<div class="line"><a name="l16276"></a><span class="lineno">16276</span>&#160;    VMA_COPY_IF_NOT_NULL(vkGetImageMemoryRequirements);</div>
+<div class="line"><a name="l16277"></a><span class="lineno">16277</span>&#160;    VMA_COPY_IF_NOT_NULL(vkCreateBuffer);</div>
+<div class="line"><a name="l16278"></a><span class="lineno">16278</span>&#160;    VMA_COPY_IF_NOT_NULL(vkDestroyBuffer);</div>
+<div class="line"><a name="l16279"></a><span class="lineno">16279</span>&#160;    VMA_COPY_IF_NOT_NULL(vkCreateImage);</div>
+<div class="line"><a name="l16280"></a><span class="lineno">16280</span>&#160;    VMA_COPY_IF_NOT_NULL(vkDestroyImage);</div>
+<div class="line"><a name="l16281"></a><span class="lineno">16281</span>&#160;    VMA_COPY_IF_NOT_NULL(vkCmdCopyBuffer);</div>
+<div class="line"><a name="l16282"></a><span class="lineno">16282</span>&#160; </div>
+<div class="line"><a name="l16283"></a><span class="lineno">16283</span>&#160;<span class="preprocessor">#if VMA_DEDICATED_ALLOCATION || VMA_VULKAN_VERSION &gt;= 1001000</span></div>
+<div class="line"><a name="l16284"></a><span class="lineno">16284</span>&#160;    VMA_COPY_IF_NOT_NULL(vkGetBufferMemoryRequirements2KHR);</div>
+<div class="line"><a name="l16285"></a><span class="lineno">16285</span>&#160;    VMA_COPY_IF_NOT_NULL(vkGetImageMemoryRequirements2KHR);</div>
+<div class="line"><a name="l16286"></a><span class="lineno">16286</span>&#160;<span class="preprocessor">#endif</span></div>
+<div class="line"><a name="l16287"></a><span class="lineno">16287</span>&#160; </div>
+<div class="line"><a name="l16288"></a><span class="lineno">16288</span>&#160;<span class="preprocessor">#if VMA_BIND_MEMORY2 || VMA_VULKAN_VERSION &gt;= 1001000</span></div>
+<div class="line"><a name="l16289"></a><span class="lineno">16289</span>&#160;    VMA_COPY_IF_NOT_NULL(vkBindBufferMemory2KHR);</div>
+<div class="line"><a name="l16290"></a><span class="lineno">16290</span>&#160;    VMA_COPY_IF_NOT_NULL(vkBindImageMemory2KHR);</div>
+<div class="line"><a name="l16291"></a><span class="lineno">16291</span>&#160;<span class="preprocessor">#endif</span></div>
+<div class="line"><a name="l16292"></a><span class="lineno">16292</span>&#160; </div>
+<div class="line"><a name="l16293"></a><span class="lineno">16293</span>&#160;<span class="preprocessor">#if VMA_MEMORY_BUDGET</span></div>
+<div class="line"><a name="l16294"></a><span class="lineno">16294</span>&#160;    VMA_COPY_IF_NOT_NULL(vkGetPhysicalDeviceMemoryProperties2KHR);</div>
+<div class="line"><a name="l16295"></a><span class="lineno">16295</span>&#160;<span class="preprocessor">#endif</span></div>
+<div class="line"><a name="l16296"></a><span class="lineno">16296</span>&#160; </div>
+<div class="line"><a name="l16297"></a><span class="lineno">16297</span>&#160;<span class="preprocessor">#undef VMA_COPY_IF_NOT_NULL</span></div>
+<div class="line"><a name="l16298"></a><span class="lineno">16298</span>&#160;}</div>
+<div class="line"><a name="l16299"></a><span class="lineno">16299</span>&#160; </div>
+<div class="line"><a name="l16300"></a><span class="lineno">16300</span>&#160;<span class="preprocessor">#if VMA_DYNAMIC_VULKAN_FUNCTIONS == 1</span></div>
+<div class="line"><a name="l16301"></a><span class="lineno">16301</span>&#160; </div>
+<div class="line"><a name="l16302"></a><span class="lineno">16302</span>&#160;<span class="keywordtype">void</span> VmaAllocator_T::ImportVulkanFunctions_Dynamic()</div>
+<div class="line"><a name="l16303"></a><span class="lineno">16303</span>&#160;{</div>
+<div class="line"><a name="l16304"></a><span class="lineno">16304</span>&#160;<span class="preprocessor">#define VMA_FETCH_INSTANCE_FUNC(memberName, functionPointerType, functionNameString) \</span></div>
+<div class="line"><a name="l16305"></a><span class="lineno">16305</span>&#160;<span class="preprocessor">    if(m_VulkanFunctions.memberName == VMA_NULL) \</span></div>
+<div class="line"><a name="l16306"></a><span class="lineno">16306</span>&#160;<span class="preprocessor">        m_VulkanFunctions.memberName = \</span></div>
+<div class="line"><a name="l16307"></a><span class="lineno">16307</span>&#160;<span class="preprocessor">            (functionPointerType)vkGetInstanceProcAddr(m_hInstance, functionNameString);</span></div>
+<div class="line"><a name="l16308"></a><span class="lineno">16308</span>&#160;<span class="preprocessor">#define VMA_FETCH_DEVICE_FUNC(memberName, functionPointerType, functionNameString) \</span></div>
+<div class="line"><a name="l16309"></a><span class="lineno">16309</span>&#160;<span class="preprocessor">    if(m_VulkanFunctions.memberName == VMA_NULL) \</span></div>
+<div class="line"><a name="l16310"></a><span class="lineno">16310</span>&#160;<span class="preprocessor">        m_VulkanFunctions.memberName = \</span></div>
+<div class="line"><a name="l16311"></a><span class="lineno">16311</span>&#160;<span class="preprocessor">            (functionPointerType)vkGetDeviceProcAddr(m_hDevice, functionNameString);</span></div>
+<div class="line"><a name="l16312"></a><span class="lineno">16312</span>&#160; </div>
+<div class="line"><a name="l16313"></a><span class="lineno">16313</span>&#160;    VMA_FETCH_INSTANCE_FUNC(vkGetPhysicalDeviceProperties, PFN_vkGetPhysicalDeviceProperties, <span class="stringliteral">&quot;vkGetPhysicalDeviceProperties&quot;</span>);</div>
+<div class="line"><a name="l16314"></a><span class="lineno">16314</span>&#160;    VMA_FETCH_INSTANCE_FUNC(vkGetPhysicalDeviceMemoryProperties, PFN_vkGetPhysicalDeviceMemoryProperties, <span class="stringliteral">&quot;vkGetPhysicalDeviceMemoryProperties&quot;</span>);</div>
+<div class="line"><a name="l16315"></a><span class="lineno">16315</span>&#160;    VMA_FETCH_DEVICE_FUNC(vkAllocateMemory, PFN_vkAllocateMemory, <span class="stringliteral">&quot;vkAllocateMemory&quot;</span>);</div>
+<div class="line"><a name="l16316"></a><span class="lineno">16316</span>&#160;    VMA_FETCH_DEVICE_FUNC(vkFreeMemory, PFN_vkFreeMemory, <span class="stringliteral">&quot;vkFreeMemory&quot;</span>);</div>
+<div class="line"><a name="l16317"></a><span class="lineno">16317</span>&#160;    VMA_FETCH_DEVICE_FUNC(vkMapMemory, PFN_vkMapMemory, <span class="stringliteral">&quot;vkMapMemory&quot;</span>);</div>
+<div class="line"><a name="l16318"></a><span class="lineno">16318</span>&#160;    VMA_FETCH_DEVICE_FUNC(vkUnmapMemory, PFN_vkUnmapMemory, <span class="stringliteral">&quot;vkUnmapMemory&quot;</span>);</div>
+<div class="line"><a name="l16319"></a><span class="lineno">16319</span>&#160;    VMA_FETCH_DEVICE_FUNC(vkFlushMappedMemoryRanges, PFN_vkFlushMappedMemoryRanges, <span class="stringliteral">&quot;vkFlushMappedMemoryRanges&quot;</span>);</div>
+<div class="line"><a name="l16320"></a><span class="lineno">16320</span>&#160;    VMA_FETCH_DEVICE_FUNC(vkInvalidateMappedMemoryRanges, PFN_vkInvalidateMappedMemoryRanges, <span class="stringliteral">&quot;vkInvalidateMappedMemoryRanges&quot;</span>);</div>
+<div class="line"><a name="l16321"></a><span class="lineno">16321</span>&#160;    VMA_FETCH_DEVICE_FUNC(vkBindBufferMemory, PFN_vkBindBufferMemory, <span class="stringliteral">&quot;vkBindBufferMemory&quot;</span>);</div>
+<div class="line"><a name="l16322"></a><span class="lineno">16322</span>&#160;    VMA_FETCH_DEVICE_FUNC(vkBindImageMemory, PFN_vkBindImageMemory, <span class="stringliteral">&quot;vkBindImageMemory&quot;</span>);</div>
+<div class="line"><a name="l16323"></a><span class="lineno">16323</span>&#160;    VMA_FETCH_DEVICE_FUNC(vkGetBufferMemoryRequirements, PFN_vkGetBufferMemoryRequirements, <span class="stringliteral">&quot;vkGetBufferMemoryRequirements&quot;</span>);</div>
+<div class="line"><a name="l16324"></a><span class="lineno">16324</span>&#160;    VMA_FETCH_DEVICE_FUNC(vkGetImageMemoryRequirements, PFN_vkGetImageMemoryRequirements, <span class="stringliteral">&quot;vkGetImageMemoryRequirements&quot;</span>);</div>
+<div class="line"><a name="l16325"></a><span class="lineno">16325</span>&#160;    VMA_FETCH_DEVICE_FUNC(vkCreateBuffer, PFN_vkCreateBuffer, <span class="stringliteral">&quot;vkCreateBuffer&quot;</span>);</div>
+<div class="line"><a name="l16326"></a><span class="lineno">16326</span>&#160;    VMA_FETCH_DEVICE_FUNC(vkDestroyBuffer, PFN_vkDestroyBuffer, <span class="stringliteral">&quot;vkDestroyBuffer&quot;</span>);</div>
+<div class="line"><a name="l16327"></a><span class="lineno">16327</span>&#160;    VMA_FETCH_DEVICE_FUNC(vkCreateImage, PFN_vkCreateImage, <span class="stringliteral">&quot;vkCreateImage&quot;</span>);</div>
+<div class="line"><a name="l16328"></a><span class="lineno">16328</span>&#160;    VMA_FETCH_DEVICE_FUNC(vkDestroyImage, PFN_vkDestroyImage, <span class="stringliteral">&quot;vkDestroyImage&quot;</span>);</div>
+<div class="line"><a name="l16329"></a><span class="lineno">16329</span>&#160;    VMA_FETCH_DEVICE_FUNC(vkCmdCopyBuffer, PFN_vkCmdCopyBuffer, <span class="stringliteral">&quot;vkCmdCopyBuffer&quot;</span>);</div>
+<div class="line"><a name="l16330"></a><span class="lineno">16330</span>&#160; </div>
+<div class="line"><a name="l16331"></a><span class="lineno">16331</span>&#160;<span class="preprocessor">#if VMA_VULKAN_VERSION &gt;= 1001000</span></div>
+<div class="line"><a name="l16332"></a><span class="lineno">16332</span>&#160;    <span class="keywordflow">if</span>(m_VulkanApiVersion &gt;= VK_MAKE_VERSION(1, 1, 0))</div>
+<div class="line"><a name="l16333"></a><span class="lineno">16333</span>&#160;    {</div>
+<div class="line"><a name="l16334"></a><span class="lineno">16334</span>&#160;        VMA_FETCH_DEVICE_FUNC(vkGetBufferMemoryRequirements2KHR, PFN_vkGetBufferMemoryRequirements2, <span class="stringliteral">&quot;vkGetBufferMemoryRequirements2&quot;</span>);</div>
+<div class="line"><a name="l16335"></a><span class="lineno">16335</span>&#160;        VMA_FETCH_DEVICE_FUNC(vkGetImageMemoryRequirements2KHR, PFN_vkGetImageMemoryRequirements2, <span class="stringliteral">&quot;vkGetImageMemoryRequirements2&quot;</span>);</div>
+<div class="line"><a name="l16336"></a><span class="lineno">16336</span>&#160;        VMA_FETCH_DEVICE_FUNC(vkBindBufferMemory2KHR, PFN_vkBindBufferMemory2, <span class="stringliteral">&quot;vkBindBufferMemory2&quot;</span>);</div>
+<div class="line"><a name="l16337"></a><span class="lineno">16337</span>&#160;        VMA_FETCH_DEVICE_FUNC(vkBindImageMemory2KHR, PFN_vkBindImageMemory2, <span class="stringliteral">&quot;vkBindImageMemory2&quot;</span>);</div>
+<div class="line"><a name="l16338"></a><span class="lineno">16338</span>&#160;        VMA_FETCH_INSTANCE_FUNC(vkGetPhysicalDeviceMemoryProperties2KHR, PFN_vkGetPhysicalDeviceMemoryProperties2, <span class="stringliteral">&quot;vkGetPhysicalDeviceMemoryProperties2&quot;</span>);</div>
+<div class="line"><a name="l16339"></a><span class="lineno">16339</span>&#160;    }</div>
+<div class="line"><a name="l16340"></a><span class="lineno">16340</span>&#160;<span class="preprocessor">#endif</span></div>
+<div class="line"><a name="l16341"></a><span class="lineno">16341</span>&#160; </div>
+<div class="line"><a name="l16342"></a><span class="lineno">16342</span>&#160;<span class="preprocessor">#if VMA_DEDICATED_ALLOCATION</span></div>
+<div class="line"><a name="l16343"></a><span class="lineno">16343</span>&#160;    <span class="keywordflow">if</span>(m_UseKhrDedicatedAllocation)</div>
+<div class="line"><a name="l16344"></a><span class="lineno">16344</span>&#160;    {</div>
+<div class="line"><a name="l16345"></a><span class="lineno">16345</span>&#160;        VMA_FETCH_DEVICE_FUNC(vkGetBufferMemoryRequirements2KHR, PFN_vkGetBufferMemoryRequirements2KHR, <span class="stringliteral">&quot;vkGetBufferMemoryRequirements2KHR&quot;</span>);</div>
+<div class="line"><a name="l16346"></a><span class="lineno">16346</span>&#160;        VMA_FETCH_DEVICE_FUNC(vkGetImageMemoryRequirements2KHR, PFN_vkGetImageMemoryRequirements2KHR, <span class="stringliteral">&quot;vkGetImageMemoryRequirements2KHR&quot;</span>);</div>
+<div class="line"><a name="l16347"></a><span class="lineno">16347</span>&#160;    }</div>
+<div class="line"><a name="l16348"></a><span class="lineno">16348</span>&#160;<span class="preprocessor">#endif</span></div>
+<div class="line"><a name="l16349"></a><span class="lineno">16349</span>&#160; </div>
+<div class="line"><a name="l16350"></a><span class="lineno">16350</span>&#160;<span class="preprocessor">#if VMA_BIND_MEMORY2</span></div>
+<div class="line"><a name="l16351"></a><span class="lineno">16351</span>&#160;    <span class="keywordflow">if</span>(m_UseKhrBindMemory2)</div>
+<div class="line"><a name="l16352"></a><span class="lineno">16352</span>&#160;    {</div>
+<div class="line"><a name="l16353"></a><span class="lineno">16353</span>&#160;        VMA_FETCH_DEVICE_FUNC(vkBindBufferMemory2KHR, PFN_vkBindBufferMemory2KHR, <span class="stringliteral">&quot;vkBindBufferMemory2KHR&quot;</span>);</div>
+<div class="line"><a name="l16354"></a><span class="lineno">16354</span>&#160;        VMA_FETCH_DEVICE_FUNC(vkBindImageMemory2KHR, PFN_vkBindImageMemory2KHR, <span class="stringliteral">&quot;vkBindImageMemory2KHR&quot;</span>);</div>
+<div class="line"><a name="l16355"></a><span class="lineno">16355</span>&#160;    }</div>
+<div class="line"><a name="l16356"></a><span class="lineno">16356</span>&#160;<span class="preprocessor">#endif </span><span class="comment">// #if VMA_BIND_MEMORY2</span></div>
+<div class="line"><a name="l16357"></a><span class="lineno">16357</span>&#160; </div>
+<div class="line"><a name="l16358"></a><span class="lineno">16358</span>&#160;<span class="preprocessor">#if VMA_MEMORY_BUDGET</span></div>
+<div class="line"><a name="l16359"></a><span class="lineno">16359</span>&#160;    <span class="keywordflow">if</span>(m_UseExtMemoryBudget)</div>
+<div class="line"><a name="l16360"></a><span class="lineno">16360</span>&#160;    {</div>
+<div class="line"><a name="l16361"></a><span class="lineno">16361</span>&#160;        VMA_FETCH_INSTANCE_FUNC(vkGetPhysicalDeviceMemoryProperties2KHR, PFN_vkGetPhysicalDeviceMemoryProperties2KHR, <span class="stringliteral">&quot;vkGetPhysicalDeviceMemoryProperties2KHR&quot;</span>);</div>
+<div class="line"><a name="l16362"></a><span class="lineno">16362</span>&#160;    }</div>
+<div class="line"><a name="l16363"></a><span class="lineno">16363</span>&#160;<span class="preprocessor">#endif </span><span class="comment">// #if VMA_MEMORY_BUDGET</span></div>
+<div class="line"><a name="l16364"></a><span class="lineno">16364</span>&#160; </div>
+<div class="line"><a name="l16365"></a><span class="lineno">16365</span>&#160;<span class="preprocessor">#undef VMA_FETCH_DEVICE_FUNC</span></div>
+<div class="line"><a name="l16366"></a><span class="lineno">16366</span>&#160;<span class="preprocessor">#undef VMA_FETCH_INSTANCE_FUNC</span></div>
+<div class="line"><a name="l16367"></a><span class="lineno">16367</span>&#160;}</div>
+<div class="line"><a name="l16368"></a><span class="lineno">16368</span>&#160; </div>
+<div class="line"><a name="l16369"></a><span class="lineno">16369</span>&#160;<span class="preprocessor">#endif </span><span class="comment">// #if VMA_DYNAMIC_VULKAN_FUNCTIONS == 1</span></div>
+<div class="line"><a name="l16370"></a><span class="lineno">16370</span>&#160; </div>
+<div class="line"><a name="l16371"></a><span class="lineno">16371</span>&#160;<span class="keywordtype">void</span> VmaAllocator_T::ValidateVulkanFunctions()</div>
+<div class="line"><a name="l16372"></a><span class="lineno">16372</span>&#160;{</div>
+<div class="line"><a name="l16373"></a><span class="lineno">16373</span>&#160;    VMA_ASSERT(m_VulkanFunctions.vkGetPhysicalDeviceProperties != VMA_NULL);</div>
+<div class="line"><a name="l16374"></a><span class="lineno">16374</span>&#160;    VMA_ASSERT(m_VulkanFunctions.vkGetPhysicalDeviceMemoryProperties != VMA_NULL);</div>
+<div class="line"><a name="l16375"></a><span class="lineno">16375</span>&#160;    VMA_ASSERT(m_VulkanFunctions.vkAllocateMemory != VMA_NULL);</div>
+<div class="line"><a name="l16376"></a><span class="lineno">16376</span>&#160;    VMA_ASSERT(m_VulkanFunctions.vkFreeMemory != VMA_NULL);</div>
+<div class="line"><a name="l16377"></a><span class="lineno">16377</span>&#160;    VMA_ASSERT(m_VulkanFunctions.vkMapMemory != VMA_NULL);</div>
+<div class="line"><a name="l16378"></a><span class="lineno">16378</span>&#160;    VMA_ASSERT(m_VulkanFunctions.vkUnmapMemory != VMA_NULL);</div>
+<div class="line"><a name="l16379"></a><span class="lineno">16379</span>&#160;    VMA_ASSERT(m_VulkanFunctions.vkFlushMappedMemoryRanges != VMA_NULL);</div>
+<div class="line"><a name="l16380"></a><span class="lineno">16380</span>&#160;    VMA_ASSERT(m_VulkanFunctions.vkInvalidateMappedMemoryRanges != VMA_NULL);</div>
+<div class="line"><a name="l16381"></a><span class="lineno">16381</span>&#160;    VMA_ASSERT(m_VulkanFunctions.vkBindBufferMemory != VMA_NULL);</div>
+<div class="line"><a name="l16382"></a><span class="lineno">16382</span>&#160;    VMA_ASSERT(m_VulkanFunctions.vkBindImageMemory != VMA_NULL);</div>
+<div class="line"><a name="l16383"></a><span class="lineno">16383</span>&#160;    VMA_ASSERT(m_VulkanFunctions.vkGetBufferMemoryRequirements != VMA_NULL);</div>
+<div class="line"><a name="l16384"></a><span class="lineno">16384</span>&#160;    VMA_ASSERT(m_VulkanFunctions.vkGetImageMemoryRequirements != VMA_NULL);</div>
+<div class="line"><a name="l16385"></a><span class="lineno">16385</span>&#160;    VMA_ASSERT(m_VulkanFunctions.vkCreateBuffer != VMA_NULL);</div>
+<div class="line"><a name="l16386"></a><span class="lineno">16386</span>&#160;    VMA_ASSERT(m_VulkanFunctions.vkDestroyBuffer != VMA_NULL);</div>
+<div class="line"><a name="l16387"></a><span class="lineno">16387</span>&#160;    VMA_ASSERT(m_VulkanFunctions.vkCreateImage != VMA_NULL);</div>
+<div class="line"><a name="l16388"></a><span class="lineno">16388</span>&#160;    VMA_ASSERT(m_VulkanFunctions.vkDestroyImage != VMA_NULL);</div>
+<div class="line"><a name="l16389"></a><span class="lineno">16389</span>&#160;    VMA_ASSERT(m_VulkanFunctions.vkCmdCopyBuffer != VMA_NULL);</div>
+<div class="line"><a name="l16390"></a><span class="lineno">16390</span>&#160; </div>
+<div class="line"><a name="l16391"></a><span class="lineno">16391</span>&#160;<span class="preprocessor">#if VMA_DEDICATED_ALLOCATION || VMA_VULKAN_VERSION &gt;= 1001000</span></div>
+<div class="line"><a name="l16392"></a><span class="lineno">16392</span>&#160;    <span class="keywordflow">if</span>(m_VulkanApiVersion &gt;= VK_MAKE_VERSION(1, 1, 0) || m_UseKhrDedicatedAllocation)</div>
+<div class="line"><a name="l16393"></a><span class="lineno">16393</span>&#160;    {</div>
+<div class="line"><a name="l16394"></a><span class="lineno">16394</span>&#160;        VMA_ASSERT(m_VulkanFunctions.vkGetBufferMemoryRequirements2KHR != VMA_NULL);</div>
+<div class="line"><a name="l16395"></a><span class="lineno">16395</span>&#160;        VMA_ASSERT(m_VulkanFunctions.vkGetImageMemoryRequirements2KHR != VMA_NULL);</div>
+<div class="line"><a name="l16396"></a><span class="lineno">16396</span>&#160;    }</div>
+<div class="line"><a name="l16397"></a><span class="lineno">16397</span>&#160;<span class="preprocessor">#endif</span></div>
+<div class="line"><a name="l16398"></a><span class="lineno">16398</span>&#160; </div>
+<div class="line"><a name="l16399"></a><span class="lineno">16399</span>&#160;<span class="preprocessor">#if VMA_BIND_MEMORY2 || VMA_VULKAN_VERSION &gt;= 1001000</span></div>
+<div class="line"><a name="l16400"></a><span class="lineno">16400</span>&#160;    <span class="keywordflow">if</span>(m_VulkanApiVersion &gt;= VK_MAKE_VERSION(1, 1, 0) || m_UseKhrBindMemory2)</div>
+<div class="line"><a name="l16401"></a><span class="lineno">16401</span>&#160;    {</div>
+<div class="line"><a name="l16402"></a><span class="lineno">16402</span>&#160;        VMA_ASSERT(m_VulkanFunctions.vkBindBufferMemory2KHR != VMA_NULL);</div>
+<div class="line"><a name="l16403"></a><span class="lineno">16403</span>&#160;        VMA_ASSERT(m_VulkanFunctions.vkBindImageMemory2KHR != VMA_NULL);</div>
+<div class="line"><a name="l16404"></a><span class="lineno">16404</span>&#160;    }</div>
+<div class="line"><a name="l16405"></a><span class="lineno">16405</span>&#160;<span class="preprocessor">#endif</span></div>
+<div class="line"><a name="l16406"></a><span class="lineno">16406</span>&#160; </div>
+<div class="line"><a name="l16407"></a><span class="lineno">16407</span>&#160;<span class="preprocessor">#if VMA_MEMORY_BUDGET || VMA_VULKAN_VERSION &gt;= 1001000</span></div>
+<div class="line"><a name="l16408"></a><span class="lineno">16408</span>&#160;    <span class="keywordflow">if</span>(m_UseExtMemoryBudget || m_VulkanApiVersion &gt;= VK_MAKE_VERSION(1, 1, 0))</div>
+<div class="line"><a name="l16409"></a><span class="lineno">16409</span>&#160;    {</div>
+<div class="line"><a name="l16410"></a><span class="lineno">16410</span>&#160;        VMA_ASSERT(m_VulkanFunctions.vkGetPhysicalDeviceMemoryProperties2KHR != VMA_NULL);</div>
+<div class="line"><a name="l16411"></a><span class="lineno">16411</span>&#160;    }</div>
+<div class="line"><a name="l16412"></a><span class="lineno">16412</span>&#160;<span class="preprocessor">#endif</span></div>
+<div class="line"><a name="l16413"></a><span class="lineno">16413</span>&#160;}</div>
+<div class="line"><a name="l16414"></a><span class="lineno">16414</span>&#160; </div>
+<div class="line"><a name="l16415"></a><span class="lineno">16415</span>&#160;VkDeviceSize VmaAllocator_T::CalcPreferredBlockSize(uint32_t memTypeIndex)</div>
 <div class="line"><a name="l16416"></a><span class="lineno">16416</span>&#160;{</div>
-<div class="line"><a name="l16417"></a><span class="lineno">16417</span>&#160;    VMA_ASSERT(pAllocations);</div>
-<div class="line"><a name="l16418"></a><span class="lineno">16418</span>&#160; </div>
-<div class="line"><a name="l16419"></a><span class="lineno">16419</span>&#160;    <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> allocIndex = allocationCount; allocIndex--; )</div>
-<div class="line"><a name="l16420"></a><span class="lineno">16420</span>&#160;    {</div>
-<div class="line"><a name="l16421"></a><span class="lineno">16421</span>&#160;        <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation = pAllocations[allocIndex];</div>
+<div class="line"><a name="l16417"></a><span class="lineno">16417</span>&#160;    <span class="keyword">const</span> uint32_t heapIndex = MemoryTypeIndexToHeapIndex(memTypeIndex);</div>
+<div class="line"><a name="l16418"></a><span class="lineno">16418</span>&#160;    <span class="keyword">const</span> VkDeviceSize heapSize = m_MemProps.memoryHeaps[heapIndex].size;</div>
+<div class="line"><a name="l16419"></a><span class="lineno">16419</span>&#160;    <span class="keyword">const</span> <span class="keywordtype">bool</span> isSmallHeap = heapSize &lt;= VMA_SMALL_HEAP_MAX_SIZE;</div>
+<div class="line"><a name="l16420"></a><span class="lineno">16420</span>&#160;    <span class="keywordflow">return</span> VmaAlignUp(isSmallHeap ? (heapSize / 8) : m_PreferredLargeHeapBlockSize, (VkDeviceSize)32);</div>
+<div class="line"><a name="l16421"></a><span class="lineno">16421</span>&#160;}</div>
 <div class="line"><a name="l16422"></a><span class="lineno">16422</span>&#160; </div>
-<div class="line"><a name="l16423"></a><span class="lineno">16423</span>&#160;        <span class="keywordflow">if</span>(allocation != VK_NULL_HANDLE)</div>
-<div class="line"><a name="l16424"></a><span class="lineno">16424</span>&#160;        {</div>
-<div class="line"><a name="l16425"></a><span class="lineno">16425</span>&#160;            <span class="keywordflow">if</span>(TouchAllocation(allocation))</div>
-<div class="line"><a name="l16426"></a><span class="lineno">16426</span>&#160;            {</div>
-<div class="line"><a name="l16427"></a><span class="lineno">16427</span>&#160;                <span class="keywordflow">if</span>(VMA_DEBUG_INITIALIZE_ALLOCATIONS)</div>
-<div class="line"><a name="l16428"></a><span class="lineno">16428</span>&#160;                {</div>
-<div class="line"><a name="l16429"></a><span class="lineno">16429</span>&#160;                    FillAllocation(allocation, VMA_ALLOCATION_FILL_PATTERN_DESTROYED);</div>
-<div class="line"><a name="l16430"></a><span class="lineno">16430</span>&#160;                }</div>
-<div class="line"><a name="l16431"></a><span class="lineno">16431</span>&#160; </div>
-<div class="line"><a name="l16432"></a><span class="lineno">16432</span>&#160;                <span class="keywordflow">switch</span>(allocation-&gt;GetType())</div>
-<div class="line"><a name="l16433"></a><span class="lineno">16433</span>&#160;                {</div>
-<div class="line"><a name="l16434"></a><span class="lineno">16434</span>&#160;                <span class="keywordflow">case</span> VmaAllocation_T::ALLOCATION_TYPE_BLOCK:</div>
-<div class="line"><a name="l16435"></a><span class="lineno">16435</span>&#160;                    {</div>
-<div class="line"><a name="l16436"></a><span class="lineno">16436</span>&#160;                        VmaBlockVector* pBlockVector = VMA_NULL;</div>
-<div class="line"><a name="l16437"></a><span class="lineno">16437</span>&#160;                        <a class="code" href="struct_vma_pool.html">VmaPool</a> hPool = allocation-&gt;GetBlock()-&gt;GetParentPool();</div>
-<div class="line"><a name="l16438"></a><span class="lineno">16438</span>&#160;                        <span class="keywordflow">if</span>(hPool != VK_NULL_HANDLE)</div>
-<div class="line"><a name="l16439"></a><span class="lineno">16439</span>&#160;                        {</div>
-<div class="line"><a name="l16440"></a><span class="lineno">16440</span>&#160;                            pBlockVector = &amp;hPool-&gt;m_BlockVector;</div>
-<div class="line"><a name="l16441"></a><span class="lineno">16441</span>&#160;                        }</div>
-<div class="line"><a name="l16442"></a><span class="lineno">16442</span>&#160;                        <span class="keywordflow">else</span></div>
-<div class="line"><a name="l16443"></a><span class="lineno">16443</span>&#160;                        {</div>
-<div class="line"><a name="l16444"></a><span class="lineno">16444</span>&#160;                            <span class="keyword">const</span> uint32_t memTypeIndex = allocation-&gt;GetMemoryTypeIndex();</div>
-<div class="line"><a name="l16445"></a><span class="lineno">16445</span>&#160;                            pBlockVector = m_pBlockVectors[memTypeIndex];</div>
-<div class="line"><a name="l16446"></a><span class="lineno">16446</span>&#160;                        }</div>
-<div class="line"><a name="l16447"></a><span class="lineno">16447</span>&#160;                        pBlockVector-&gt;Free(allocation);</div>
-<div class="line"><a name="l16448"></a><span class="lineno">16448</span>&#160;                    }</div>
-<div class="line"><a name="l16449"></a><span class="lineno">16449</span>&#160;                    <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l16450"></a><span class="lineno">16450</span>&#160;                <span class="keywordflow">case</span> VmaAllocation_T::ALLOCATION_TYPE_DEDICATED:</div>
-<div class="line"><a name="l16451"></a><span class="lineno">16451</span>&#160;                    FreeDedicatedMemory(allocation);</div>
-<div class="line"><a name="l16452"></a><span class="lineno">16452</span>&#160;                    <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l16453"></a><span class="lineno">16453</span>&#160;                <span class="keywordflow">default</span>:</div>
-<div class="line"><a name="l16454"></a><span class="lineno">16454</span>&#160;                    VMA_ASSERT(0);</div>
-<div class="line"><a name="l16455"></a><span class="lineno">16455</span>&#160;                }</div>
-<div class="line"><a name="l16456"></a><span class="lineno">16456</span>&#160;            }</div>
-<div class="line"><a name="l16457"></a><span class="lineno">16457</span>&#160; </div>
-<div class="line"><a name="l16458"></a><span class="lineno">16458</span>&#160;            <span class="comment">// Do this regardless of whether the allocation is lost. Lost allocations still account to Budget.AllocationBytes.</span></div>
-<div class="line"><a name="l16459"></a><span class="lineno">16459</span>&#160;            m_Budget.RemoveAllocation(MemoryTypeIndexToHeapIndex(allocation-&gt;GetMemoryTypeIndex()), allocation-&gt;GetSize());</div>
-<div class="line"><a name="l16460"></a><span class="lineno">16460</span>&#160;            allocation-&gt;SetUserData(<span class="keyword">this</span>, VMA_NULL);</div>
-<div class="line"><a name="l16461"></a><span class="lineno">16461</span>&#160;            m_AllocationObjectAllocator.Free(allocation);</div>
-<div class="line"><a name="l16462"></a><span class="lineno">16462</span>&#160;        }</div>
-<div class="line"><a name="l16463"></a><span class="lineno">16463</span>&#160;    }</div>
-<div class="line"><a name="l16464"></a><span class="lineno">16464</span>&#160;}</div>
-<div class="line"><a name="l16465"></a><span class="lineno">16465</span>&#160; </div>
-<div class="line"><a name="l16466"></a><span class="lineno">16466</span>&#160;VkResult VmaAllocator_T::ResizeAllocation(</div>
-<div class="line"><a name="l16467"></a><span class="lineno">16467</span>&#160;    <span class="keyword">const</span> <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> alloc,</div>
-<div class="line"><a name="l16468"></a><span class="lineno">16468</span>&#160;    VkDeviceSize newSize)</div>
-<div class="line"><a name="l16469"></a><span class="lineno">16469</span>&#160;{</div>
-<div class="line"><a name="l16470"></a><span class="lineno">16470</span>&#160;    <span class="comment">// This function is deprecated and so it does nothing. It&#39;s left for backward compatibility.</span></div>
-<div class="line"><a name="l16471"></a><span class="lineno">16471</span>&#160;    <span class="keywordflow">if</span>(newSize == 0 || alloc-&gt;GetLastUseFrameIndex() == VMA_FRAME_INDEX_LOST)</div>
-<div class="line"><a name="l16472"></a><span class="lineno">16472</span>&#160;    {</div>
-<div class="line"><a name="l16473"></a><span class="lineno">16473</span>&#160;        <span class="keywordflow">return</span> VK_ERROR_VALIDATION_FAILED_EXT;</div>
-<div class="line"><a name="l16474"></a><span class="lineno">16474</span>&#160;    }</div>
-<div class="line"><a name="l16475"></a><span class="lineno">16475</span>&#160;    <span class="keywordflow">if</span>(newSize == alloc-&gt;GetSize())</div>
-<div class="line"><a name="l16476"></a><span class="lineno">16476</span>&#160;    {</div>
-<div class="line"><a name="l16477"></a><span class="lineno">16477</span>&#160;        <span class="keywordflow">return</span> VK_SUCCESS;</div>
-<div class="line"><a name="l16478"></a><span class="lineno">16478</span>&#160;    }</div>
-<div class="line"><a name="l16479"></a><span class="lineno">16479</span>&#160;    <span class="keywordflow">return</span> VK_ERROR_OUT_OF_POOL_MEMORY;</div>
-<div class="line"><a name="l16480"></a><span class="lineno">16480</span>&#160;}</div>
-<div class="line"><a name="l16481"></a><span class="lineno">16481</span>&#160; </div>
-<div class="line"><a name="l16482"></a><span class="lineno">16482</span>&#160;<span class="keywordtype">void</span> VmaAllocator_T::CalculateStats(<a class="code" href="struct_vma_stats.html">VmaStats</a>* pStats)</div>
-<div class="line"><a name="l16483"></a><span class="lineno">16483</span>&#160;{</div>
-<div class="line"><a name="l16484"></a><span class="lineno">16484</span>&#160;    <span class="comment">// Initialize.</span></div>
-<div class="line"><a name="l16485"></a><span class="lineno">16485</span>&#160;    InitStatInfo(pStats-&gt;<a class="code" href="struct_vma_stats.html#a2e8f5b3353f2fefef3c27f29e245a1f9">total</a>);</div>
-<div class="line"><a name="l16486"></a><span class="lineno">16486</span>&#160;    <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> i = 0; i &lt; VK_MAX_MEMORY_TYPES; ++i)</div>
-<div class="line"><a name="l16487"></a><span class="lineno">16487</span>&#160;        InitStatInfo(pStats-&gt;<a class="code" href="struct_vma_stats.html#a13e3caf754be79352c42408756309331">memoryType</a>[i]);</div>
-<div class="line"><a name="l16488"></a><span class="lineno">16488</span>&#160;    <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> i = 0; i &lt; VK_MAX_MEMORY_HEAPS; ++i)</div>
-<div class="line"><a name="l16489"></a><span class="lineno">16489</span>&#160;        InitStatInfo(pStats-&gt;<a class="code" href="struct_vma_stats.html#a0e6611508c29a187f0fd14ff1a0329c0">memoryHeap</a>[i]);</div>
-<div class="line"><a name="l16490"></a><span class="lineno">16490</span>&#160;    </div>
-<div class="line"><a name="l16491"></a><span class="lineno">16491</span>&#160;    <span class="comment">// Process default pools.</span></div>
-<div class="line"><a name="l16492"></a><span class="lineno">16492</span>&#160;    <span class="keywordflow">for</span>(uint32_t memTypeIndex = 0; memTypeIndex &lt; GetMemoryTypeCount(); ++memTypeIndex)</div>
-<div class="line"><a name="l16493"></a><span class="lineno">16493</span>&#160;    {</div>
-<div class="line"><a name="l16494"></a><span class="lineno">16494</span>&#160;        VmaBlockVector* <span class="keyword">const</span> pBlockVector = m_pBlockVectors[memTypeIndex];</div>
-<div class="line"><a name="l16495"></a><span class="lineno">16495</span>&#160;        VMA_ASSERT(pBlockVector);</div>
-<div class="line"><a name="l16496"></a><span class="lineno">16496</span>&#160;        pBlockVector-&gt;AddStats(pStats);</div>
-<div class="line"><a name="l16497"></a><span class="lineno">16497</span>&#160;    }</div>
-<div class="line"><a name="l16498"></a><span class="lineno">16498</span>&#160; </div>
-<div class="line"><a name="l16499"></a><span class="lineno">16499</span>&#160;    <span class="comment">// Process custom pools.</span></div>
-<div class="line"><a name="l16500"></a><span class="lineno">16500</span>&#160;    {</div>
-<div class="line"><a name="l16501"></a><span class="lineno">16501</span>&#160;        VmaMutexLockRead lock(m_PoolsMutex, m_UseMutex);</div>
-<div class="line"><a name="l16502"></a><span class="lineno">16502</span>&#160;        <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> poolIndex = 0, poolCount = m_Pools.size(); poolIndex &lt; poolCount; ++poolIndex)</div>
-<div class="line"><a name="l16503"></a><span class="lineno">16503</span>&#160;        {</div>
-<div class="line"><a name="l16504"></a><span class="lineno">16504</span>&#160;            m_Pools[poolIndex]-&gt;m_BlockVector.AddStats(pStats);</div>
-<div class="line"><a name="l16505"></a><span class="lineno">16505</span>&#160;        }</div>
-<div class="line"><a name="l16506"></a><span class="lineno">16506</span>&#160;    }</div>
-<div class="line"><a name="l16507"></a><span class="lineno">16507</span>&#160; </div>
-<div class="line"><a name="l16508"></a><span class="lineno">16508</span>&#160;    <span class="comment">// Process dedicated allocations.</span></div>
-<div class="line"><a name="l16509"></a><span class="lineno">16509</span>&#160;    <span class="keywordflow">for</span>(uint32_t memTypeIndex = 0; memTypeIndex &lt; GetMemoryTypeCount(); ++memTypeIndex)</div>
-<div class="line"><a name="l16510"></a><span class="lineno">16510</span>&#160;    {</div>
-<div class="line"><a name="l16511"></a><span class="lineno">16511</span>&#160;        <span class="keyword">const</span> uint32_t memHeapIndex = MemoryTypeIndexToHeapIndex(memTypeIndex);</div>
-<div class="line"><a name="l16512"></a><span class="lineno">16512</span>&#160;        VmaMutexLockRead dedicatedAllocationsLock(m_DedicatedAllocationsMutex[memTypeIndex], m_UseMutex);</div>
-<div class="line"><a name="l16513"></a><span class="lineno">16513</span>&#160;        AllocationVectorType* <span class="keyword">const</span> pDedicatedAllocVector = m_pDedicatedAllocations[memTypeIndex];</div>
-<div class="line"><a name="l16514"></a><span class="lineno">16514</span>&#160;        VMA_ASSERT(pDedicatedAllocVector);</div>
-<div class="line"><a name="l16515"></a><span class="lineno">16515</span>&#160;        <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> allocIndex = 0, allocCount = pDedicatedAllocVector-&gt;size(); allocIndex &lt; allocCount; ++allocIndex)</div>
-<div class="line"><a name="l16516"></a><span class="lineno">16516</span>&#160;        {</div>
-<div class="line"><a name="l16517"></a><span class="lineno">16517</span>&#160;            <a class="code" href="struct_vma_stat_info.html">VmaStatInfo</a> allocationStatInfo;</div>
-<div class="line"><a name="l16518"></a><span class="lineno">16518</span>&#160;            (*pDedicatedAllocVector)[allocIndex]-&gt;DedicatedAllocCalcStatsInfo(allocationStatInfo);</div>
-<div class="line"><a name="l16519"></a><span class="lineno">16519</span>&#160;            VmaAddStatInfo(pStats-&gt;<a class="code" href="struct_vma_stats.html#a2e8f5b3353f2fefef3c27f29e245a1f9">total</a>, allocationStatInfo);</div>
-<div class="line"><a name="l16520"></a><span class="lineno">16520</span>&#160;            VmaAddStatInfo(pStats-&gt;<a class="code" href="struct_vma_stats.html#a13e3caf754be79352c42408756309331">memoryType</a>[memTypeIndex], allocationStatInfo);</div>
-<div class="line"><a name="l16521"></a><span class="lineno">16521</span>&#160;            VmaAddStatInfo(pStats-&gt;<a class="code" href="struct_vma_stats.html#a0e6611508c29a187f0fd14ff1a0329c0">memoryHeap</a>[memHeapIndex], allocationStatInfo);</div>
-<div class="line"><a name="l16522"></a><span class="lineno">16522</span>&#160;        }</div>
-<div class="line"><a name="l16523"></a><span class="lineno">16523</span>&#160;    }</div>
-<div class="line"><a name="l16524"></a><span class="lineno">16524</span>&#160; </div>
-<div class="line"><a name="l16525"></a><span class="lineno">16525</span>&#160;    <span class="comment">// Postprocess.</span></div>
-<div class="line"><a name="l16526"></a><span class="lineno">16526</span>&#160;    VmaPostprocessCalcStatInfo(pStats-&gt;<a class="code" href="struct_vma_stats.html#a2e8f5b3353f2fefef3c27f29e245a1f9">total</a>);</div>
-<div class="line"><a name="l16527"></a><span class="lineno">16527</span>&#160;    <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> i = 0; i &lt; GetMemoryTypeCount(); ++i)</div>
-<div class="line"><a name="l16528"></a><span class="lineno">16528</span>&#160;        VmaPostprocessCalcStatInfo(pStats-&gt;<a class="code" href="struct_vma_stats.html#a13e3caf754be79352c42408756309331">memoryType</a>[i]);</div>
-<div class="line"><a name="l16529"></a><span class="lineno">16529</span>&#160;    <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> i = 0; i &lt; GetMemoryHeapCount(); ++i)</div>
-<div class="line"><a name="l16530"></a><span class="lineno">16530</span>&#160;        VmaPostprocessCalcStatInfo(pStats-&gt;<a class="code" href="struct_vma_stats.html#a0e6611508c29a187f0fd14ff1a0329c0">memoryHeap</a>[i]);</div>
-<div class="line"><a name="l16531"></a><span class="lineno">16531</span>&#160;}</div>
-<div class="line"><a name="l16532"></a><span class="lineno">16532</span>&#160; </div>
-<div class="line"><a name="l16533"></a><span class="lineno">16533</span>&#160;<span class="keywordtype">void</span> VmaAllocator_T::GetBudget(<a class="code" href="struct_vma_budget.html">VmaBudget</a>* outBudget, uint32_t firstHeap, uint32_t heapCount)</div>
-<div class="line"><a name="l16534"></a><span class="lineno">16534</span>&#160;{</div>
-<div class="line"><a name="l16535"></a><span class="lineno">16535</span>&#160;<span class="preprocessor">#if VMA_MEMORY_BUDGET</span></div>
-<div class="line"><a name="l16536"></a><span class="lineno">16536</span>&#160;    <span class="keywordflow">if</span>(m_UseExtMemoryBudget)</div>
-<div class="line"><a name="l16537"></a><span class="lineno">16537</span>&#160;    {</div>
-<div class="line"><a name="l16538"></a><span class="lineno">16538</span>&#160;        <span class="keywordflow">if</span>(m_Budget.m_OperationsSinceBudgetFetch &lt; 30)</div>
-<div class="line"><a name="l16539"></a><span class="lineno">16539</span>&#160;        {</div>
-<div class="line"><a name="l16540"></a><span class="lineno">16540</span>&#160;            VmaMutexLockRead lockRead(m_Budget.m_BudgetMutex, m_UseMutex);</div>
-<div class="line"><a name="l16541"></a><span class="lineno">16541</span>&#160;            <span class="keywordflow">for</span>(uint32_t i = 0; i &lt; heapCount; ++i, ++outBudget)</div>
-<div class="line"><a name="l16542"></a><span class="lineno">16542</span>&#160;            {</div>
-<div class="line"><a name="l16543"></a><span class="lineno">16543</span>&#160;                <span class="keyword">const</span> uint32_t heapIndex = firstHeap + i;</div>
-<div class="line"><a name="l16544"></a><span class="lineno">16544</span>&#160; </div>
-<div class="line"><a name="l16545"></a><span class="lineno">16545</span>&#160;                outBudget-&gt;<a class="code" href="struct_vma_budget.html#a58b492901baab685f466199124e514a0">blockBytes</a> = m_Budget.m_BlockBytes[heapIndex];</div>
-<div class="line"><a name="l16546"></a><span class="lineno">16546</span>&#160;                outBudget-&gt;<a class="code" href="struct_vma_budget.html#a7e2a6583ebd63e194951c542563804d8">allocationBytes</a> = m_Budget.m_AllocationBytes[heapIndex];</div>
-<div class="line"><a name="l16547"></a><span class="lineno">16547</span>&#160; </div>
-<div class="line"><a name="l16548"></a><span class="lineno">16548</span>&#160;                <span class="keywordflow">if</span>(m_Budget.m_VulkanUsage[heapIndex] + outBudget-&gt;<a class="code" href="struct_vma_budget.html#a58b492901baab685f466199124e514a0">blockBytes</a> &gt; m_Budget.m_BlockBytesAtBudgetFetch[heapIndex])</div>
-<div class="line"><a name="l16549"></a><span class="lineno">16549</span>&#160;                {</div>
-<div class="line"><a name="l16550"></a><span class="lineno">16550</span>&#160;                    outBudget-&gt;<a class="code" href="struct_vma_budget.html#a84dd1ecca8b0110259eb206dbadb11f6">usage</a> = m_Budget.m_VulkanUsage[heapIndex] +</div>
-<div class="line"><a name="l16551"></a><span class="lineno">16551</span>&#160;                        outBudget-&gt;<a class="code" href="struct_vma_budget.html#a58b492901baab685f466199124e514a0">blockBytes</a> - m_Budget.m_BlockBytesAtBudgetFetch[heapIndex];</div>
-<div class="line"><a name="l16552"></a><span class="lineno">16552</span>&#160;                }</div>
-<div class="line"><a name="l16553"></a><span class="lineno">16553</span>&#160;                <span class="keywordflow">else</span></div>
-<div class="line"><a name="l16554"></a><span class="lineno">16554</span>&#160;                {</div>
-<div class="line"><a name="l16555"></a><span class="lineno">16555</span>&#160;                    outBudget-&gt;<a class="code" href="struct_vma_budget.html#a84dd1ecca8b0110259eb206dbadb11f6">usage</a> = 0;</div>
-<div class="line"><a name="l16556"></a><span class="lineno">16556</span>&#160;                }</div>
-<div class="line"><a name="l16557"></a><span class="lineno">16557</span>&#160; </div>
-<div class="line"><a name="l16558"></a><span class="lineno">16558</span>&#160;                <span class="comment">// Have to take MIN with heap size because explicit HeapSizeLimit is included in it.</span></div>
-<div class="line"><a name="l16559"></a><span class="lineno">16559</span>&#160;                outBudget-&gt;<a class="code" href="struct_vma_budget.html#ab82e1d1754c2d210d0bdf90220bc6cdd">budget</a> = VMA_MIN(</div>
-<div class="line"><a name="l16560"></a><span class="lineno">16560</span>&#160;                    m_Budget.m_VulkanBudget[heapIndex], m_MemProps.memoryHeaps[heapIndex].size);</div>
-<div class="line"><a name="l16561"></a><span class="lineno">16561</span>&#160;            }</div>
-<div class="line"><a name="l16562"></a><span class="lineno">16562</span>&#160;        }</div>
-<div class="line"><a name="l16563"></a><span class="lineno">16563</span>&#160;        <span class="keywordflow">else</span></div>
-<div class="line"><a name="l16564"></a><span class="lineno">16564</span>&#160;        {</div>
-<div class="line"><a name="l16565"></a><span class="lineno">16565</span>&#160;            UpdateVulkanBudget(); <span class="comment">// Outside of mutex lock</span></div>
-<div class="line"><a name="l16566"></a><span class="lineno">16566</span>&#160;            GetBudget(outBudget, firstHeap, heapCount); <span class="comment">// Recursion</span></div>
-<div class="line"><a name="l16567"></a><span class="lineno">16567</span>&#160;        }</div>
-<div class="line"><a name="l16568"></a><span class="lineno">16568</span>&#160;    }</div>
-<div class="line"><a name="l16569"></a><span class="lineno">16569</span>&#160;    <span class="keywordflow">else</span></div>
-<div class="line"><a name="l16570"></a><span class="lineno">16570</span>&#160;<span class="preprocessor">#endif</span></div>
-<div class="line"><a name="l16571"></a><span class="lineno">16571</span>&#160;    {</div>
-<div class="line"><a name="l16572"></a><span class="lineno">16572</span>&#160;        <span class="keywordflow">for</span>(uint32_t i = 0; i &lt; heapCount; ++i, ++outBudget)</div>
-<div class="line"><a name="l16573"></a><span class="lineno">16573</span>&#160;        {</div>
-<div class="line"><a name="l16574"></a><span class="lineno">16574</span>&#160;            <span class="keyword">const</span> uint32_t heapIndex = firstHeap + i;</div>
-<div class="line"><a name="l16575"></a><span class="lineno">16575</span>&#160; </div>
-<div class="line"><a name="l16576"></a><span class="lineno">16576</span>&#160;            outBudget-&gt;<a class="code" href="struct_vma_budget.html#a58b492901baab685f466199124e514a0">blockBytes</a> = m_Budget.m_BlockBytes[heapIndex];</div>
-<div class="line"><a name="l16577"></a><span class="lineno">16577</span>&#160;            outBudget-&gt;<a class="code" href="struct_vma_budget.html#a7e2a6583ebd63e194951c542563804d8">allocationBytes</a> = m_Budget.m_AllocationBytes[heapIndex];</div>
-<div class="line"><a name="l16578"></a><span class="lineno">16578</span>&#160; </div>
-<div class="line"><a name="l16579"></a><span class="lineno">16579</span>&#160;            outBudget-&gt;<a class="code" href="struct_vma_budget.html#a84dd1ecca8b0110259eb206dbadb11f6">usage</a> = outBudget-&gt;<a class="code" href="struct_vma_budget.html#a58b492901baab685f466199124e514a0">blockBytes</a>;</div>
-<div class="line"><a name="l16580"></a><span class="lineno">16580</span>&#160;            outBudget-&gt;<a class="code" href="struct_vma_budget.html#ab82e1d1754c2d210d0bdf90220bc6cdd">budget</a> = m_MemProps.memoryHeaps[heapIndex].size * 8 / 10; <span class="comment">// 80% heuristics.</span></div>
-<div class="line"><a name="l16581"></a><span class="lineno">16581</span>&#160;        }</div>
-<div class="line"><a name="l16582"></a><span class="lineno">16582</span>&#160;    }</div>
-<div class="line"><a name="l16583"></a><span class="lineno">16583</span>&#160;}</div>
-<div class="line"><a name="l16584"></a><span class="lineno">16584</span>&#160; </div>
-<div class="line"><a name="l16585"></a><span class="lineno">16585</span>&#160;<span class="keyword">static</span> <span class="keyword">const</span> uint32_t VMA_VENDOR_ID_AMD = 4098;</div>
-<div class="line"><a name="l16586"></a><span class="lineno">16586</span>&#160; </div>
-<div class="line"><a name="l16587"></a><span class="lineno">16587</span>&#160;VkResult VmaAllocator_T::DefragmentationBegin(</div>
-<div class="line"><a name="l16588"></a><span class="lineno">16588</span>&#160;    <span class="keyword">const</span> <a class="code" href="struct_vma_defragmentation_info2.html">VmaDefragmentationInfo2</a>&amp; info,</div>
-<div class="line"><a name="l16589"></a><span class="lineno">16589</span>&#160;    <a class="code" href="struct_vma_defragmentation_stats.html">VmaDefragmentationStats</a>* pStats,</div>
-<div class="line"><a name="l16590"></a><span class="lineno">16590</span>&#160;    <a class="code" href="struct_vma_defragmentation_context.html">VmaDefragmentationContext</a>* pContext)</div>
-<div class="line"><a name="l16591"></a><span class="lineno">16591</span>&#160;{</div>
-<div class="line"><a name="l16592"></a><span class="lineno">16592</span>&#160;    <span class="keywordflow">if</span>(info.<a class="code" href="struct_vma_defragmentation_info2.html#a76d51a644dc7f5405d0cdd0025ecd0cc">pAllocationsChanged</a> != VMA_NULL)</div>
-<div class="line"><a name="l16593"></a><span class="lineno">16593</span>&#160;    {</div>
-<div class="line"><a name="l16594"></a><span class="lineno">16594</span>&#160;        memset(info.<a class="code" href="struct_vma_defragmentation_info2.html#a76d51a644dc7f5405d0cdd0025ecd0cc">pAllocationsChanged</a>, 0, info.<a class="code" href="struct_vma_defragmentation_info2.html#a3cf86ab32c1da779b4923d301a3056ba">allocationCount</a> * <span class="keyword">sizeof</span>(VkBool32));</div>
-<div class="line"><a name="l16595"></a><span class="lineno">16595</span>&#160;    }</div>
-<div class="line"><a name="l16596"></a><span class="lineno">16596</span>&#160; </div>
-<div class="line"><a name="l16597"></a><span class="lineno">16597</span>&#160;    *pContext = vma_new(<span class="keyword">this</span>, VmaDefragmentationContext_T)(</div>
-<div class="line"><a name="l16598"></a><span class="lineno">16598</span>&#160;        <span class="keyword">this</span>, m_CurrentFrameIndex.load(), info.<a class="code" href="struct_vma_defragmentation_info2.html#a53e844ee5633e229cf6daf14b2d9fff9">flags</a>, pStats);</div>
-<div class="line"><a name="l16599"></a><span class="lineno">16599</span>&#160; </div>
-<div class="line"><a name="l16600"></a><span class="lineno">16600</span>&#160;    (*pContext)-&gt;AddPools(info.<a class="code" href="struct_vma_defragmentation_info2.html#a7e70aa2a1081d849dcc7829b19d3ec9d">poolCount</a>, info.<a class="code" href="struct_vma_defragmentation_info2.html#a3c9c6aa5c97d5670f8e362b3a6f3029b">pPools</a>);</div>
-<div class="line"><a name="l16601"></a><span class="lineno">16601</span>&#160;    (*pContext)-&gt;AddAllocations(</div>
-<div class="line"><a name="l16602"></a><span class="lineno">16602</span>&#160;        info.<a class="code" href="struct_vma_defragmentation_info2.html#a3cf86ab32c1da779b4923d301a3056ba">allocationCount</a>, info.<a class="code" href="struct_vma_defragmentation_info2.html#ab6d288f29d028156cf73542d630a2e32">pAllocations</a>, info.<a class="code" href="struct_vma_defragmentation_info2.html#a76d51a644dc7f5405d0cdd0025ecd0cc">pAllocationsChanged</a>);</div>
-<div class="line"><a name="l16603"></a><span class="lineno">16603</span>&#160; </div>
-<div class="line"><a name="l16604"></a><span class="lineno">16604</span>&#160;    VkResult res = (*pContext)-&gt;Defragment(</div>
-<div class="line"><a name="l16605"></a><span class="lineno">16605</span>&#160;        info.<a class="code" href="struct_vma_defragmentation_info2.html#af78e1ea40c22d85137b65f6b384a4d0a">maxCpuBytesToMove</a>, info.<a class="code" href="struct_vma_defragmentation_info2.html#a94c2c7223d52878445a8cccce396b671">maxCpuAllocationsToMove</a>,</div>
-<div class="line"><a name="l16606"></a><span class="lineno">16606</span>&#160;        info.<a class="code" href="struct_vma_defragmentation_info2.html#a4ddbc898d0afe1518f863a3763628f08">maxGpuBytesToMove</a>, info.<a class="code" href="struct_vma_defragmentation_info2.html#a40d53d33e71ba0b66f844ed63c05a3f6">maxGpuAllocationsToMove</a>,</div>
-<div class="line"><a name="l16607"></a><span class="lineno">16607</span>&#160;        info.<a class="code" href="struct_vma_defragmentation_info2.html#a7f71f39590c5316771493d2333f9c1bd">commandBuffer</a>, pStats, info.<a class="code" href="struct_vma_defragmentation_info2.html#a53e844ee5633e229cf6daf14b2d9fff9">flags</a>);</div>
-<div class="line"><a name="l16608"></a><span class="lineno">16608</span>&#160; </div>
-<div class="line"><a name="l16609"></a><span class="lineno">16609</span>&#160;    <span class="keywordflow">if</span>(res != VK_NOT_READY)</div>
-<div class="line"><a name="l16610"></a><span class="lineno">16610</span>&#160;    {</div>
-<div class="line"><a name="l16611"></a><span class="lineno">16611</span>&#160;        vma_delete(<span class="keyword">this</span>, *pContext);</div>
-<div class="line"><a name="l16612"></a><span class="lineno">16612</span>&#160;        *pContext = VMA_NULL;</div>
-<div class="line"><a name="l16613"></a><span class="lineno">16613</span>&#160;    }</div>
-<div class="line"><a name="l16614"></a><span class="lineno">16614</span>&#160; </div>
-<div class="line"><a name="l16615"></a><span class="lineno">16615</span>&#160;    <span class="keywordflow">return</span> res;</div>
-<div class="line"><a name="l16616"></a><span class="lineno">16616</span>&#160;}</div>
-<div class="line"><a name="l16617"></a><span class="lineno">16617</span>&#160; </div>
-<div class="line"><a name="l16618"></a><span class="lineno">16618</span>&#160;VkResult VmaAllocator_T::DefragmentationEnd(</div>
-<div class="line"><a name="l16619"></a><span class="lineno">16619</span>&#160;    <a class="code" href="struct_vma_defragmentation_context.html">VmaDefragmentationContext</a> context)</div>
-<div class="line"><a name="l16620"></a><span class="lineno">16620</span>&#160;{</div>
-<div class="line"><a name="l16621"></a><span class="lineno">16621</span>&#160;    vma_delete(<span class="keyword">this</span>, context);</div>
-<div class="line"><a name="l16622"></a><span class="lineno">16622</span>&#160;    <span class="keywordflow">return</span> VK_SUCCESS;</div>
-<div class="line"><a name="l16623"></a><span class="lineno">16623</span>&#160;}</div>
-<div class="line"><a name="l16624"></a><span class="lineno">16624</span>&#160; </div>
-<div class="line"><a name="l16625"></a><span class="lineno">16625</span>&#160;VkResult VmaAllocator_T::DefragmentationPassBegin(</div>
-<div class="line"><a name="l16626"></a><span class="lineno">16626</span>&#160;    <a class="code" href="struct_vma_defragmentation_pass_info.html">VmaDefragmentationPassInfo</a>* pInfo,</div>
-<div class="line"><a name="l16627"></a><span class="lineno">16627</span>&#160;    <a class="code" href="struct_vma_defragmentation_context.html">VmaDefragmentationContext</a> context)</div>
-<div class="line"><a name="l16628"></a><span class="lineno">16628</span>&#160;{</div>
-<div class="line"><a name="l16629"></a><span class="lineno">16629</span>&#160;    <span class="keywordflow">return</span> context-&gt;DefragmentPassBegin(pInfo);</div>
-<div class="line"><a name="l16630"></a><span class="lineno">16630</span>&#160;}</div>
-<div class="line"><a name="l16631"></a><span class="lineno">16631</span>&#160;VkResult VmaAllocator_T::DefragmentationPassEnd(</div>
-<div class="line"><a name="l16632"></a><span class="lineno">16632</span>&#160;    <a class="code" href="struct_vma_defragmentation_context.html">VmaDefragmentationContext</a> context)</div>
-<div class="line"><a name="l16633"></a><span class="lineno">16633</span>&#160;{</div>
-<div class="line"><a name="l16634"></a><span class="lineno">16634</span>&#160;    <span class="keywordflow">return</span> context-&gt;DefragmentPassEnd();</div>
-<div class="line"><a name="l16635"></a><span class="lineno">16635</span>&#160;    </div>
-<div class="line"><a name="l16636"></a><span class="lineno">16636</span>&#160;}</div>
-<div class="line"><a name="l16637"></a><span class="lineno">16637</span>&#160; </div>
-<div class="line"><a name="l16638"></a><span class="lineno">16638</span>&#160;<span class="keywordtype">void</span> VmaAllocator_T::GetAllocationInfo(<a class="code" href="struct_vma_allocation.html">VmaAllocation</a> hAllocation, <a class="code" href="struct_vma_allocation_info.html">VmaAllocationInfo</a>* pAllocationInfo)</div>
-<div class="line"><a name="l16639"></a><span class="lineno">16639</span>&#160;{</div>
-<div class="line"><a name="l16640"></a><span class="lineno">16640</span>&#160;    <span class="keywordflow">if</span>(hAllocation-&gt;CanBecomeLost())</div>
-<div class="line"><a name="l16641"></a><span class="lineno">16641</span>&#160;    {</div>
-<div class="line"><a name="l16642"></a><span class="lineno">16642</span>&#160;        <span class="comment">/*</span></div>
-<div class="line"><a name="l16643"></a><span class="lineno">16643</span>&#160;<span class="comment">        Warning: This is a carefully designed algorithm.</span></div>
-<div class="line"><a name="l16644"></a><span class="lineno">16644</span>&#160;<span class="comment">        Do not modify unless you really know what you&#39;re doing :)</span></div>
-<div class="line"><a name="l16645"></a><span class="lineno">16645</span>&#160;<span class="comment">        */</span></div>
-<div class="line"><a name="l16646"></a><span class="lineno">16646</span>&#160;        <span class="keyword">const</span> uint32_t localCurrFrameIndex = m_CurrentFrameIndex.load();</div>
-<div class="line"><a name="l16647"></a><span class="lineno">16647</span>&#160;        uint32_t localLastUseFrameIndex = hAllocation-&gt;GetLastUseFrameIndex();</div>
-<div class="line"><a name="l16648"></a><span class="lineno">16648</span>&#160;        <span class="keywordflow">for</span>(;;)</div>
-<div class="line"><a name="l16649"></a><span class="lineno">16649</span>&#160;        {</div>
-<div class="line"><a name="l16650"></a><span class="lineno">16650</span>&#160;            <span class="keywordflow">if</span>(localLastUseFrameIndex == VMA_FRAME_INDEX_LOST)</div>
-<div class="line"><a name="l16651"></a><span class="lineno">16651</span>&#160;            {</div>
-<div class="line"><a name="l16652"></a><span class="lineno">16652</span>&#160;                pAllocationInfo-&gt;<a class="code" href="struct_vma_allocation_info.html#a7f6b0aa58c135e488e6b40a388dad9d5">memoryType</a> = UINT32_MAX;</div>
-<div class="line"><a name="l16653"></a><span class="lineno">16653</span>&#160;                pAllocationInfo-&gt;<a class="code" href="struct_vma_allocation_info.html#ae0bfb7dfdf79a76ffefc9a94677a2f67">deviceMemory</a> = VK_NULL_HANDLE;</div>
-<div class="line"><a name="l16654"></a><span class="lineno">16654</span>&#160;                pAllocationInfo-&gt;<a class="code" href="struct_vma_allocation_info.html#a4a3c732388dbdc7a23f9365b00825268">offset</a> = 0;</div>
-<div class="line"><a name="l16655"></a><span class="lineno">16655</span>&#160;                pAllocationInfo-&gt;<a class="code" href="struct_vma_allocation_info.html#aac76d113a6a5ccbb09fea00fb25fd18f">size</a> = hAllocation-&gt;GetSize();</div>
-<div class="line"><a name="l16656"></a><span class="lineno">16656</span>&#160;                pAllocationInfo-&gt;<a class="code" href="struct_vma_allocation_info.html#a5eeffbe2d2f30f53370ff14aefbadbe2">pMappedData</a> = VMA_NULL;</div>
-<div class="line"><a name="l16657"></a><span class="lineno">16657</span>&#160;                pAllocationInfo-&gt;<a class="code" href="struct_vma_allocation_info.html#adc507656149c04de7ed95d0042ba2a13">pUserData</a> = hAllocation-&gt;GetUserData();</div>
-<div class="line"><a name="l16658"></a><span class="lineno">16658</span>&#160;                <span class="keywordflow">return</span>;</div>
-<div class="line"><a name="l16659"></a><span class="lineno">16659</span>&#160;            }</div>
-<div class="line"><a name="l16660"></a><span class="lineno">16660</span>&#160;            <span class="keywordflow">else</span> <span class="keywordflow">if</span>(localLastUseFrameIndex == localCurrFrameIndex)</div>
-<div class="line"><a name="l16661"></a><span class="lineno">16661</span>&#160;            {</div>
-<div class="line"><a name="l16662"></a><span class="lineno">16662</span>&#160;                pAllocationInfo-&gt;<a class="code" href="struct_vma_allocation_info.html#a7f6b0aa58c135e488e6b40a388dad9d5">memoryType</a> = hAllocation-&gt;GetMemoryTypeIndex();</div>
-<div class="line"><a name="l16663"></a><span class="lineno">16663</span>&#160;                pAllocationInfo-&gt;<a class="code" href="struct_vma_allocation_info.html#ae0bfb7dfdf79a76ffefc9a94677a2f67">deviceMemory</a> = hAllocation-&gt;GetMemory();</div>
-<div class="line"><a name="l16664"></a><span class="lineno">16664</span>&#160;                pAllocationInfo-&gt;<a class="code" href="struct_vma_allocation_info.html#a4a3c732388dbdc7a23f9365b00825268">offset</a> = hAllocation-&gt;GetOffset();</div>
-<div class="line"><a name="l16665"></a><span class="lineno">16665</span>&#160;                pAllocationInfo-&gt;<a class="code" href="struct_vma_allocation_info.html#aac76d113a6a5ccbb09fea00fb25fd18f">size</a> = hAllocation-&gt;GetSize();</div>
-<div class="line"><a name="l16666"></a><span class="lineno">16666</span>&#160;                pAllocationInfo-&gt;<a class="code" href="struct_vma_allocation_info.html#a5eeffbe2d2f30f53370ff14aefbadbe2">pMappedData</a> = VMA_NULL;</div>
-<div class="line"><a name="l16667"></a><span class="lineno">16667</span>&#160;                pAllocationInfo-&gt;<a class="code" href="struct_vma_allocation_info.html#adc507656149c04de7ed95d0042ba2a13">pUserData</a> = hAllocation-&gt;GetUserData();</div>
-<div class="line"><a name="l16668"></a><span class="lineno">16668</span>&#160;                <span class="keywordflow">return</span>;</div>
-<div class="line"><a name="l16669"></a><span class="lineno">16669</span>&#160;            }</div>
-<div class="line"><a name="l16670"></a><span class="lineno">16670</span>&#160;            <span class="keywordflow">else</span> <span class="comment">// Last use time earlier than current time.</span></div>
-<div class="line"><a name="l16671"></a><span class="lineno">16671</span>&#160;            {</div>
-<div class="line"><a name="l16672"></a><span class="lineno">16672</span>&#160;                <span class="keywordflow">if</span>(hAllocation-&gt;CompareExchangeLastUseFrameIndex(localLastUseFrameIndex, localCurrFrameIndex))</div>
-<div class="line"><a name="l16673"></a><span class="lineno">16673</span>&#160;                {</div>
-<div class="line"><a name="l16674"></a><span class="lineno">16674</span>&#160;                    localLastUseFrameIndex = localCurrFrameIndex;</div>
-<div class="line"><a name="l16675"></a><span class="lineno">16675</span>&#160;                }</div>
-<div class="line"><a name="l16676"></a><span class="lineno">16676</span>&#160;            }</div>
-<div class="line"><a name="l16677"></a><span class="lineno">16677</span>&#160;        }</div>
-<div class="line"><a name="l16678"></a><span class="lineno">16678</span>&#160;    }</div>
-<div class="line"><a name="l16679"></a><span class="lineno">16679</span>&#160;    <span class="keywordflow">else</span></div>
-<div class="line"><a name="l16680"></a><span class="lineno">16680</span>&#160;    {</div>
-<div class="line"><a name="l16681"></a><span class="lineno">16681</span>&#160;<span class="preprocessor">#if VMA_STATS_STRING_ENABLED</span></div>
-<div class="line"><a name="l16682"></a><span class="lineno">16682</span>&#160;        uint32_t localCurrFrameIndex = m_CurrentFrameIndex.load();</div>
-<div class="line"><a name="l16683"></a><span class="lineno">16683</span>&#160;        uint32_t localLastUseFrameIndex = hAllocation-&gt;GetLastUseFrameIndex();</div>
-<div class="line"><a name="l16684"></a><span class="lineno">16684</span>&#160;        <span class="keywordflow">for</span>(;;)</div>
-<div class="line"><a name="l16685"></a><span class="lineno">16685</span>&#160;        {</div>
-<div class="line"><a name="l16686"></a><span class="lineno">16686</span>&#160;            VMA_ASSERT(localLastUseFrameIndex != VMA_FRAME_INDEX_LOST);</div>
-<div class="line"><a name="l16687"></a><span class="lineno">16687</span>&#160;            <span class="keywordflow">if</span>(localLastUseFrameIndex == localCurrFrameIndex)</div>
-<div class="line"><a name="l16688"></a><span class="lineno">16688</span>&#160;            {</div>
-<div class="line"><a name="l16689"></a><span class="lineno">16689</span>&#160;                <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l16690"></a><span class="lineno">16690</span>&#160;            }</div>
-<div class="line"><a name="l16691"></a><span class="lineno">16691</span>&#160;            <span class="keywordflow">else</span> <span class="comment">// Last use time earlier than current time.</span></div>
-<div class="line"><a name="l16692"></a><span class="lineno">16692</span>&#160;            {</div>
-<div class="line"><a name="l16693"></a><span class="lineno">16693</span>&#160;                <span class="keywordflow">if</span>(hAllocation-&gt;CompareExchangeLastUseFrameIndex(localLastUseFrameIndex, localCurrFrameIndex))</div>
-<div class="line"><a name="l16694"></a><span class="lineno">16694</span>&#160;                {</div>
-<div class="line"><a name="l16695"></a><span class="lineno">16695</span>&#160;                    localLastUseFrameIndex = localCurrFrameIndex;</div>
-<div class="line"><a name="l16696"></a><span class="lineno">16696</span>&#160;                }</div>
-<div class="line"><a name="l16697"></a><span class="lineno">16697</span>&#160;            }</div>
-<div class="line"><a name="l16698"></a><span class="lineno">16698</span>&#160;        }</div>
-<div class="line"><a name="l16699"></a><span class="lineno">16699</span>&#160;<span class="preprocessor">#endif</span></div>
-<div class="line"><a name="l16700"></a><span class="lineno">16700</span>&#160; </div>
-<div class="line"><a name="l16701"></a><span class="lineno">16701</span>&#160;        pAllocationInfo-&gt;<a class="code" href="struct_vma_allocation_info.html#a7f6b0aa58c135e488e6b40a388dad9d5">memoryType</a> = hAllocation-&gt;GetMemoryTypeIndex();</div>
-<div class="line"><a name="l16702"></a><span class="lineno">16702</span>&#160;        pAllocationInfo-&gt;<a class="code" href="struct_vma_allocation_info.html#ae0bfb7dfdf79a76ffefc9a94677a2f67">deviceMemory</a> = hAllocation-&gt;GetMemory();</div>
-<div class="line"><a name="l16703"></a><span class="lineno">16703</span>&#160;        pAllocationInfo-&gt;<a class="code" href="struct_vma_allocation_info.html#a4a3c732388dbdc7a23f9365b00825268">offset</a> = hAllocation-&gt;GetOffset();</div>
-<div class="line"><a name="l16704"></a><span class="lineno">16704</span>&#160;        pAllocationInfo-&gt;<a class="code" href="struct_vma_allocation_info.html#aac76d113a6a5ccbb09fea00fb25fd18f">size</a> = hAllocation-&gt;GetSize();</div>
-<div class="line"><a name="l16705"></a><span class="lineno">16705</span>&#160;        pAllocationInfo-&gt;<a class="code" href="struct_vma_allocation_info.html#a5eeffbe2d2f30f53370ff14aefbadbe2">pMappedData</a> = hAllocation-&gt;GetMappedData();</div>
-<div class="line"><a name="l16706"></a><span class="lineno">16706</span>&#160;        pAllocationInfo-&gt;<a class="code" href="struct_vma_allocation_info.html#adc507656149c04de7ed95d0042ba2a13">pUserData</a> = hAllocation-&gt;GetUserData();</div>
-<div class="line"><a name="l16707"></a><span class="lineno">16707</span>&#160;    }</div>
-<div class="line"><a name="l16708"></a><span class="lineno">16708</span>&#160;}</div>
-<div class="line"><a name="l16709"></a><span class="lineno">16709</span>&#160; </div>
-<div class="line"><a name="l16710"></a><span class="lineno">16710</span>&#160;<span class="keywordtype">bool</span> VmaAllocator_T::TouchAllocation(<a class="code" href="struct_vma_allocation.html">VmaAllocation</a> hAllocation)</div>
-<div class="line"><a name="l16711"></a><span class="lineno">16711</span>&#160;{</div>
-<div class="line"><a name="l16712"></a><span class="lineno">16712</span>&#160;    <span class="comment">// This is a stripped-down version of VmaAllocator_T::GetAllocationInfo.</span></div>
-<div class="line"><a name="l16713"></a><span class="lineno">16713</span>&#160;    <span class="keywordflow">if</span>(hAllocation-&gt;CanBecomeLost())</div>
-<div class="line"><a name="l16714"></a><span class="lineno">16714</span>&#160;    {</div>
-<div class="line"><a name="l16715"></a><span class="lineno">16715</span>&#160;        uint32_t localCurrFrameIndex = m_CurrentFrameIndex.load();</div>
-<div class="line"><a name="l16716"></a><span class="lineno">16716</span>&#160;        uint32_t localLastUseFrameIndex = hAllocation-&gt;GetLastUseFrameIndex();</div>
-<div class="line"><a name="l16717"></a><span class="lineno">16717</span>&#160;        <span class="keywordflow">for</span>(;;)</div>
-<div class="line"><a name="l16718"></a><span class="lineno">16718</span>&#160;        {</div>
-<div class="line"><a name="l16719"></a><span class="lineno">16719</span>&#160;            <span class="keywordflow">if</span>(localLastUseFrameIndex == VMA_FRAME_INDEX_LOST)</div>
-<div class="line"><a name="l16720"></a><span class="lineno">16720</span>&#160;            {</div>
-<div class="line"><a name="l16721"></a><span class="lineno">16721</span>&#160;                <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
-<div class="line"><a name="l16722"></a><span class="lineno">16722</span>&#160;            }</div>
-<div class="line"><a name="l16723"></a><span class="lineno">16723</span>&#160;            <span class="keywordflow">else</span> <span class="keywordflow">if</span>(localLastUseFrameIndex == localCurrFrameIndex)</div>
-<div class="line"><a name="l16724"></a><span class="lineno">16724</span>&#160;            {</div>
-<div class="line"><a name="l16725"></a><span class="lineno">16725</span>&#160;                <span class="keywordflow">return</span> <span class="keyword">true</span>;</div>
-<div class="line"><a name="l16726"></a><span class="lineno">16726</span>&#160;            }</div>
-<div class="line"><a name="l16727"></a><span class="lineno">16727</span>&#160;            <span class="keywordflow">else</span> <span class="comment">// Last use time earlier than current time.</span></div>
-<div class="line"><a name="l16728"></a><span class="lineno">16728</span>&#160;            {</div>
-<div class="line"><a name="l16729"></a><span class="lineno">16729</span>&#160;                <span class="keywordflow">if</span>(hAllocation-&gt;CompareExchangeLastUseFrameIndex(localLastUseFrameIndex, localCurrFrameIndex))</div>
-<div class="line"><a name="l16730"></a><span class="lineno">16730</span>&#160;                {</div>
-<div class="line"><a name="l16731"></a><span class="lineno">16731</span>&#160;                    localLastUseFrameIndex = localCurrFrameIndex;</div>
-<div class="line"><a name="l16732"></a><span class="lineno">16732</span>&#160;                }</div>
-<div class="line"><a name="l16733"></a><span class="lineno">16733</span>&#160;            }</div>
-<div class="line"><a name="l16734"></a><span class="lineno">16734</span>&#160;        }</div>
-<div class="line"><a name="l16735"></a><span class="lineno">16735</span>&#160;    }</div>
-<div class="line"><a name="l16736"></a><span class="lineno">16736</span>&#160;    <span class="keywordflow">else</span></div>
+<div class="line"><a name="l16423"></a><span class="lineno">16423</span>&#160;VkResult VmaAllocator_T::AllocateMemoryOfType(</div>
+<div class="line"><a name="l16424"></a><span class="lineno">16424</span>&#160;    VkDeviceSize size,</div>
+<div class="line"><a name="l16425"></a><span class="lineno">16425</span>&#160;    VkDeviceSize alignment,</div>
+<div class="line"><a name="l16426"></a><span class="lineno">16426</span>&#160;    <span class="keywordtype">bool</span> dedicatedAllocation,</div>
+<div class="line"><a name="l16427"></a><span class="lineno">16427</span>&#160;    VkBuffer dedicatedBuffer,</div>
+<div class="line"><a name="l16428"></a><span class="lineno">16428</span>&#160;    VkBufferUsageFlags dedicatedBufferUsage,</div>
+<div class="line"><a name="l16429"></a><span class="lineno">16429</span>&#160;    VkImage dedicatedImage,</div>
+<div class="line"><a name="l16430"></a><span class="lineno">16430</span>&#160;    <span class="keyword">const</span> <a class="code" href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a>&amp; createInfo,</div>
+<div class="line"><a name="l16431"></a><span class="lineno">16431</span>&#160;    uint32_t memTypeIndex,</div>
+<div class="line"><a name="l16432"></a><span class="lineno">16432</span>&#160;    VmaSuballocationType suballocType,</div>
+<div class="line"><a name="l16433"></a><span class="lineno">16433</span>&#160;    <span class="keywordtype">size_t</span> allocationCount,</div>
+<div class="line"><a name="l16434"></a><span class="lineno">16434</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a>* pAllocations)</div>
+<div class="line"><a name="l16435"></a><span class="lineno">16435</span>&#160;{</div>
+<div class="line"><a name="l16436"></a><span class="lineno">16436</span>&#160;    VMA_ASSERT(pAllocations != VMA_NULL);</div>
+<div class="line"><a name="l16437"></a><span class="lineno">16437</span>&#160;    VMA_DEBUG_LOG(<span class="stringliteral">&quot;  AllocateMemory: MemoryTypeIndex=%u, AllocationCount=%zu, Size=%llu&quot;</span>, memTypeIndex, allocationCount, size);</div>
+<div class="line"><a name="l16438"></a><span class="lineno">16438</span>&#160; </div>
+<div class="line"><a name="l16439"></a><span class="lineno">16439</span>&#160;    <a class="code" href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a> finalCreateInfo = createInfo;</div>
+<div class="line"><a name="l16440"></a><span class="lineno">16440</span>&#160; </div>
+<div class="line"><a name="l16441"></a><span class="lineno">16441</span>&#160;    <span class="comment">// If memory type is not HOST_VISIBLE, disable MAPPED.</span></div>
+<div class="line"><a name="l16442"></a><span class="lineno">16442</span>&#160;    <span class="keywordflow">if</span>((finalCreateInfo.<a class="code" href="struct_vma_allocation_create_info.html#add09658ac14fe290ace25470ddd6d41b">flags</a> &amp; <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a11da372cc3a82931c5e5d6146cd9dd1f">VMA_ALLOCATION_CREATE_MAPPED_BIT</a>) != 0 &amp;&amp;</div>
+<div class="line"><a name="l16443"></a><span class="lineno">16443</span>&#160;        (m_MemProps.memoryTypes[memTypeIndex].propertyFlags &amp; VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT) == 0)</div>
+<div class="line"><a name="l16444"></a><span class="lineno">16444</span>&#160;    {</div>
+<div class="line"><a name="l16445"></a><span class="lineno">16445</span>&#160;        finalCreateInfo.<a class="code" href="struct_vma_allocation_create_info.html#add09658ac14fe290ace25470ddd6d41b">flags</a> &amp;= ~<a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a11da372cc3a82931c5e5d6146cd9dd1f">VMA_ALLOCATION_CREATE_MAPPED_BIT</a>;</div>
+<div class="line"><a name="l16446"></a><span class="lineno">16446</span>&#160;    }</div>
+<div class="line"><a name="l16447"></a><span class="lineno">16447</span>&#160;    <span class="comment">// If memory is lazily allocated, it should be always dedicated.</span></div>
+<div class="line"><a name="l16448"></a><span class="lineno">16448</span>&#160;    <span class="keywordflow">if</span>(finalCreateInfo.<a class="code" href="struct_vma_allocation_create_info.html#accb8b06b1f677d858cb9af20705fa910">usage</a> == <a class="code" href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305cca835333d9072db63a653818030e17614d">VMA_MEMORY_USAGE_GPU_LAZILY_ALLOCATED</a>)</div>
+<div class="line"><a name="l16449"></a><span class="lineno">16449</span>&#160;    {</div>
+<div class="line"><a name="l16450"></a><span class="lineno">16450</span>&#160;        finalCreateInfo.<a class="code" href="struct_vma_allocation_create_info.html#add09658ac14fe290ace25470ddd6d41b">flags</a> |= <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a3fc311d855c2ff53f1090ef5c722b38f">VMA_ALLOCATION_CREATE_DEDICATED_MEMORY_BIT</a>;</div>
+<div class="line"><a name="l16451"></a><span class="lineno">16451</span>&#160;    }</div>
+<div class="line"><a name="l16452"></a><span class="lineno">16452</span>&#160; </div>
+<div class="line"><a name="l16453"></a><span class="lineno">16453</span>&#160;    VmaBlockVector* <span class="keyword">const</span> blockVector = m_pBlockVectors[memTypeIndex];</div>
+<div class="line"><a name="l16454"></a><span class="lineno">16454</span>&#160;    VMA_ASSERT(blockVector);</div>
+<div class="line"><a name="l16455"></a><span class="lineno">16455</span>&#160; </div>
+<div class="line"><a name="l16456"></a><span class="lineno">16456</span>&#160;    <span class="keyword">const</span> VkDeviceSize preferredBlockSize = blockVector-&gt;GetPreferredBlockSize();</div>
+<div class="line"><a name="l16457"></a><span class="lineno">16457</span>&#160;    <span class="keywordtype">bool</span> preferDedicatedMemory =</div>
+<div class="line"><a name="l16458"></a><span class="lineno">16458</span>&#160;        VMA_DEBUG_ALWAYS_DEDICATED_MEMORY ||</div>
+<div class="line"><a name="l16459"></a><span class="lineno">16459</span>&#160;        dedicatedAllocation ||</div>
+<div class="line"><a name="l16460"></a><span class="lineno">16460</span>&#160;        <span class="comment">// Heuristics: Allocate dedicated memory if requested size if greater than half of preferred block size.</span></div>
+<div class="line"><a name="l16461"></a><span class="lineno">16461</span>&#160;        size &gt; preferredBlockSize / 2;</div>
+<div class="line"><a name="l16462"></a><span class="lineno">16462</span>&#160; </div>
+<div class="line"><a name="l16463"></a><span class="lineno">16463</span>&#160;    <span class="keywordflow">if</span>(preferDedicatedMemory &amp;&amp;</div>
+<div class="line"><a name="l16464"></a><span class="lineno">16464</span>&#160;        (finalCreateInfo.<a class="code" href="struct_vma_allocation_create_info.html#add09658ac14fe290ace25470ddd6d41b">flags</a> &amp; <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a89759603401014eb325eb22a3839f2ff">VMA_ALLOCATION_CREATE_NEVER_ALLOCATE_BIT</a>) == 0 &amp;&amp;</div>
+<div class="line"><a name="l16465"></a><span class="lineno">16465</span>&#160;        finalCreateInfo.<a class="code" href="struct_vma_allocation_create_info.html#a6272c0555cfd1fe28bff1afeb6190150">pool</a> == VK_NULL_HANDLE)</div>
+<div class="line"><a name="l16466"></a><span class="lineno">16466</span>&#160;    {</div>
+<div class="line"><a name="l16467"></a><span class="lineno">16467</span>&#160;        finalCreateInfo.<a class="code" href="struct_vma_allocation_create_info.html#add09658ac14fe290ace25470ddd6d41b">flags</a> |= <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a3fc311d855c2ff53f1090ef5c722b38f">VMA_ALLOCATION_CREATE_DEDICATED_MEMORY_BIT</a>;</div>
+<div class="line"><a name="l16468"></a><span class="lineno">16468</span>&#160;    }</div>
+<div class="line"><a name="l16469"></a><span class="lineno">16469</span>&#160; </div>
+<div class="line"><a name="l16470"></a><span class="lineno">16470</span>&#160;    <span class="keywordflow">if</span>((finalCreateInfo.<a class="code" href="struct_vma_allocation_create_info.html#add09658ac14fe290ace25470ddd6d41b">flags</a> &amp; <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a3fc311d855c2ff53f1090ef5c722b38f">VMA_ALLOCATION_CREATE_DEDICATED_MEMORY_BIT</a>) != 0)</div>
+<div class="line"><a name="l16471"></a><span class="lineno">16471</span>&#160;    {</div>
+<div class="line"><a name="l16472"></a><span class="lineno">16472</span>&#160;        <span class="keywordflow">if</span>((finalCreateInfo.<a class="code" href="struct_vma_allocation_create_info.html#add09658ac14fe290ace25470ddd6d41b">flags</a> &amp; <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a89759603401014eb325eb22a3839f2ff">VMA_ALLOCATION_CREATE_NEVER_ALLOCATE_BIT</a>) != 0)</div>
+<div class="line"><a name="l16473"></a><span class="lineno">16473</span>&#160;        {</div>
+<div class="line"><a name="l16474"></a><span class="lineno">16474</span>&#160;            <span class="keywordflow">return</span> VK_ERROR_OUT_OF_DEVICE_MEMORY;</div>
+<div class="line"><a name="l16475"></a><span class="lineno">16475</span>&#160;        }</div>
+<div class="line"><a name="l16476"></a><span class="lineno">16476</span>&#160;        <span class="keywordflow">else</span></div>
+<div class="line"><a name="l16477"></a><span class="lineno">16477</span>&#160;        {</div>
+<div class="line"><a name="l16478"></a><span class="lineno">16478</span>&#160;            <span class="keywordflow">return</span> AllocateDedicatedMemory(</div>
+<div class="line"><a name="l16479"></a><span class="lineno">16479</span>&#160;                size,</div>
+<div class="line"><a name="l16480"></a><span class="lineno">16480</span>&#160;                suballocType,</div>
+<div class="line"><a name="l16481"></a><span class="lineno">16481</span>&#160;                memTypeIndex,</div>
+<div class="line"><a name="l16482"></a><span class="lineno">16482</span>&#160;                (finalCreateInfo.<a class="code" href="struct_vma_allocation_create_info.html#add09658ac14fe290ace25470ddd6d41b">flags</a> &amp; <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597ab8b1764f3e9022368e440c057783b92d">VMA_ALLOCATION_CREATE_WITHIN_BUDGET_BIT</a>) != 0,</div>
+<div class="line"><a name="l16483"></a><span class="lineno">16483</span>&#160;                (finalCreateInfo.<a class="code" href="struct_vma_allocation_create_info.html#add09658ac14fe290ace25470ddd6d41b">flags</a> &amp; <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a11da372cc3a82931c5e5d6146cd9dd1f">VMA_ALLOCATION_CREATE_MAPPED_BIT</a>) != 0,</div>
+<div class="line"><a name="l16484"></a><span class="lineno">16484</span>&#160;                (finalCreateInfo.<a class="code" href="struct_vma_allocation_create_info.html#add09658ac14fe290ace25470ddd6d41b">flags</a> &amp; <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597aa6f24f821cd6a7c5e4a443f7bf59c520">VMA_ALLOCATION_CREATE_USER_DATA_COPY_STRING_BIT</a>) != 0,</div>
+<div class="line"><a name="l16485"></a><span class="lineno">16485</span>&#160;                finalCreateInfo.<a class="code" href="struct_vma_allocation_create_info.html#a8259e85c272683434f4abb4ddddffe19">pUserData</a>,</div>
+<div class="line"><a name="l16486"></a><span class="lineno">16486</span>&#160;                finalCreateInfo.<a class="code" href="struct_vma_allocation_create_info.html#a983d39e1a2e63649d78a960aa2fdd0f7">priority</a>,</div>
+<div class="line"><a name="l16487"></a><span class="lineno">16487</span>&#160;                dedicatedBuffer,</div>
+<div class="line"><a name="l16488"></a><span class="lineno">16488</span>&#160;                dedicatedBufferUsage,</div>
+<div class="line"><a name="l16489"></a><span class="lineno">16489</span>&#160;                dedicatedImage,</div>
+<div class="line"><a name="l16490"></a><span class="lineno">16490</span>&#160;                allocationCount,</div>
+<div class="line"><a name="l16491"></a><span class="lineno">16491</span>&#160;                pAllocations);</div>
+<div class="line"><a name="l16492"></a><span class="lineno">16492</span>&#160;        }</div>
+<div class="line"><a name="l16493"></a><span class="lineno">16493</span>&#160;    }</div>
+<div class="line"><a name="l16494"></a><span class="lineno">16494</span>&#160;    <span class="keywordflow">else</span></div>
+<div class="line"><a name="l16495"></a><span class="lineno">16495</span>&#160;    {</div>
+<div class="line"><a name="l16496"></a><span class="lineno">16496</span>&#160;        VkResult res = blockVector-&gt;Allocate(</div>
+<div class="line"><a name="l16497"></a><span class="lineno">16497</span>&#160;            m_CurrentFrameIndex.load(),</div>
+<div class="line"><a name="l16498"></a><span class="lineno">16498</span>&#160;            size,</div>
+<div class="line"><a name="l16499"></a><span class="lineno">16499</span>&#160;            alignment,</div>
+<div class="line"><a name="l16500"></a><span class="lineno">16500</span>&#160;            finalCreateInfo,</div>
+<div class="line"><a name="l16501"></a><span class="lineno">16501</span>&#160;            suballocType,</div>
+<div class="line"><a name="l16502"></a><span class="lineno">16502</span>&#160;            allocationCount,</div>
+<div class="line"><a name="l16503"></a><span class="lineno">16503</span>&#160;            pAllocations);</div>
+<div class="line"><a name="l16504"></a><span class="lineno">16504</span>&#160;        <span class="keywordflow">if</span>(res == VK_SUCCESS)</div>
+<div class="line"><a name="l16505"></a><span class="lineno">16505</span>&#160;        {</div>
+<div class="line"><a name="l16506"></a><span class="lineno">16506</span>&#160;            <span class="keywordflow">return</span> res;</div>
+<div class="line"><a name="l16507"></a><span class="lineno">16507</span>&#160;        }</div>
+<div class="line"><a name="l16508"></a><span class="lineno">16508</span>&#160; </div>
+<div class="line"><a name="l16509"></a><span class="lineno">16509</span>&#160;        <span class="comment">// 5. Try dedicated memory.</span></div>
+<div class="line"><a name="l16510"></a><span class="lineno">16510</span>&#160;        <span class="keywordflow">if</span>((finalCreateInfo.<a class="code" href="struct_vma_allocation_create_info.html#add09658ac14fe290ace25470ddd6d41b">flags</a> &amp; <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a89759603401014eb325eb22a3839f2ff">VMA_ALLOCATION_CREATE_NEVER_ALLOCATE_BIT</a>) != 0)</div>
+<div class="line"><a name="l16511"></a><span class="lineno">16511</span>&#160;        {</div>
+<div class="line"><a name="l16512"></a><span class="lineno">16512</span>&#160;            <span class="keywordflow">return</span> VK_ERROR_OUT_OF_DEVICE_MEMORY;</div>
+<div class="line"><a name="l16513"></a><span class="lineno">16513</span>&#160;        }</div>
+<div class="line"><a name="l16514"></a><span class="lineno">16514</span>&#160; </div>
+<div class="line"><a name="l16515"></a><span class="lineno">16515</span>&#160;        <span class="comment">// Protection against creating each allocation as dedicated when we reach or exceed heap size/budget,</span></div>
+<div class="line"><a name="l16516"></a><span class="lineno">16516</span>&#160;        <span class="comment">// which can quickly deplete maxMemoryAllocationCount: Don&#39;t try dedicated allocations when above</span></div>
+<div class="line"><a name="l16517"></a><span class="lineno">16517</span>&#160;        <span class="comment">// 3/4 of the maximum allocation count.</span></div>
+<div class="line"><a name="l16518"></a><span class="lineno">16518</span>&#160;        <span class="keywordflow">if</span>(m_DeviceMemoryCount.load() &gt; m_PhysicalDeviceProperties.limits.maxMemoryAllocationCount * 3 / 4)</div>
+<div class="line"><a name="l16519"></a><span class="lineno">16519</span>&#160;        {</div>
+<div class="line"><a name="l16520"></a><span class="lineno">16520</span>&#160;            <span class="keywordflow">return</span> VK_ERROR_OUT_OF_DEVICE_MEMORY;</div>
+<div class="line"><a name="l16521"></a><span class="lineno">16521</span>&#160;        }</div>
+<div class="line"><a name="l16522"></a><span class="lineno">16522</span>&#160; </div>
+<div class="line"><a name="l16523"></a><span class="lineno">16523</span>&#160;        res = AllocateDedicatedMemory(</div>
+<div class="line"><a name="l16524"></a><span class="lineno">16524</span>&#160;            size,</div>
+<div class="line"><a name="l16525"></a><span class="lineno">16525</span>&#160;            suballocType,</div>
+<div class="line"><a name="l16526"></a><span class="lineno">16526</span>&#160;            memTypeIndex,</div>
+<div class="line"><a name="l16527"></a><span class="lineno">16527</span>&#160;            (finalCreateInfo.<a class="code" href="struct_vma_allocation_create_info.html#add09658ac14fe290ace25470ddd6d41b">flags</a> &amp; <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597ab8b1764f3e9022368e440c057783b92d">VMA_ALLOCATION_CREATE_WITHIN_BUDGET_BIT</a>) != 0,</div>
+<div class="line"><a name="l16528"></a><span class="lineno">16528</span>&#160;            (finalCreateInfo.<a class="code" href="struct_vma_allocation_create_info.html#add09658ac14fe290ace25470ddd6d41b">flags</a> &amp; <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a11da372cc3a82931c5e5d6146cd9dd1f">VMA_ALLOCATION_CREATE_MAPPED_BIT</a>) != 0,</div>
+<div class="line"><a name="l16529"></a><span class="lineno">16529</span>&#160;            (finalCreateInfo.<a class="code" href="struct_vma_allocation_create_info.html#add09658ac14fe290ace25470ddd6d41b">flags</a> &amp; <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597aa6f24f821cd6a7c5e4a443f7bf59c520">VMA_ALLOCATION_CREATE_USER_DATA_COPY_STRING_BIT</a>) != 0,</div>
+<div class="line"><a name="l16530"></a><span class="lineno">16530</span>&#160;            finalCreateInfo.<a class="code" href="struct_vma_allocation_create_info.html#a8259e85c272683434f4abb4ddddffe19">pUserData</a>,</div>
+<div class="line"><a name="l16531"></a><span class="lineno">16531</span>&#160;            finalCreateInfo.<a class="code" href="struct_vma_allocation_create_info.html#a983d39e1a2e63649d78a960aa2fdd0f7">priority</a>,</div>
+<div class="line"><a name="l16532"></a><span class="lineno">16532</span>&#160;            dedicatedBuffer,</div>
+<div class="line"><a name="l16533"></a><span class="lineno">16533</span>&#160;            dedicatedBufferUsage,</div>
+<div class="line"><a name="l16534"></a><span class="lineno">16534</span>&#160;            dedicatedImage,</div>
+<div class="line"><a name="l16535"></a><span class="lineno">16535</span>&#160;            allocationCount,</div>
+<div class="line"><a name="l16536"></a><span class="lineno">16536</span>&#160;            pAllocations);</div>
+<div class="line"><a name="l16537"></a><span class="lineno">16537</span>&#160;        <span class="keywordflow">if</span>(res == VK_SUCCESS)</div>
+<div class="line"><a name="l16538"></a><span class="lineno">16538</span>&#160;        {</div>
+<div class="line"><a name="l16539"></a><span class="lineno">16539</span>&#160;            <span class="comment">// Succeeded: AllocateDedicatedMemory function already filld pMemory, nothing more to do here.</span></div>
+<div class="line"><a name="l16540"></a><span class="lineno">16540</span>&#160;            VMA_DEBUG_LOG(<span class="stringliteral">&quot;    Allocated as DedicatedMemory&quot;</span>);</div>
+<div class="line"><a name="l16541"></a><span class="lineno">16541</span>&#160;            <span class="keywordflow">return</span> VK_SUCCESS;</div>
+<div class="line"><a name="l16542"></a><span class="lineno">16542</span>&#160;        }</div>
+<div class="line"><a name="l16543"></a><span class="lineno">16543</span>&#160;        <span class="keywordflow">else</span></div>
+<div class="line"><a name="l16544"></a><span class="lineno">16544</span>&#160;        {</div>
+<div class="line"><a name="l16545"></a><span class="lineno">16545</span>&#160;            <span class="comment">// Everything failed: Return error code.</span></div>
+<div class="line"><a name="l16546"></a><span class="lineno">16546</span>&#160;            VMA_DEBUG_LOG(<span class="stringliteral">&quot;    vkAllocateMemory FAILED&quot;</span>);</div>
+<div class="line"><a name="l16547"></a><span class="lineno">16547</span>&#160;            <span class="keywordflow">return</span> res;</div>
+<div class="line"><a name="l16548"></a><span class="lineno">16548</span>&#160;        }</div>
+<div class="line"><a name="l16549"></a><span class="lineno">16549</span>&#160;    }</div>
+<div class="line"><a name="l16550"></a><span class="lineno">16550</span>&#160;}</div>
+<div class="line"><a name="l16551"></a><span class="lineno">16551</span>&#160; </div>
+<div class="line"><a name="l16552"></a><span class="lineno">16552</span>&#160;VkResult VmaAllocator_T::AllocateDedicatedMemory(</div>
+<div class="line"><a name="l16553"></a><span class="lineno">16553</span>&#160;    VkDeviceSize size,</div>
+<div class="line"><a name="l16554"></a><span class="lineno">16554</span>&#160;    VmaSuballocationType suballocType,</div>
+<div class="line"><a name="l16555"></a><span class="lineno">16555</span>&#160;    uint32_t memTypeIndex,</div>
+<div class="line"><a name="l16556"></a><span class="lineno">16556</span>&#160;    <span class="keywordtype">bool</span> withinBudget,</div>
+<div class="line"><a name="l16557"></a><span class="lineno">16557</span>&#160;    <span class="keywordtype">bool</span> map,</div>
+<div class="line"><a name="l16558"></a><span class="lineno">16558</span>&#160;    <span class="keywordtype">bool</span> isUserDataString,</div>
+<div class="line"><a name="l16559"></a><span class="lineno">16559</span>&#160;    <span class="keywordtype">void</span>* pUserData,</div>
+<div class="line"><a name="l16560"></a><span class="lineno">16560</span>&#160;    <span class="keywordtype">float</span> priority,</div>
+<div class="line"><a name="l16561"></a><span class="lineno">16561</span>&#160;    VkBuffer dedicatedBuffer,</div>
+<div class="line"><a name="l16562"></a><span class="lineno">16562</span>&#160;    VkBufferUsageFlags dedicatedBufferUsage,</div>
+<div class="line"><a name="l16563"></a><span class="lineno">16563</span>&#160;    VkImage dedicatedImage,</div>
+<div class="line"><a name="l16564"></a><span class="lineno">16564</span>&#160;    <span class="keywordtype">size_t</span> allocationCount,</div>
+<div class="line"><a name="l16565"></a><span class="lineno">16565</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a>* pAllocations)</div>
+<div class="line"><a name="l16566"></a><span class="lineno">16566</span>&#160;{</div>
+<div class="line"><a name="l16567"></a><span class="lineno">16567</span>&#160;    VMA_ASSERT(allocationCount &gt; 0 &amp;&amp; pAllocations);</div>
+<div class="line"><a name="l16568"></a><span class="lineno">16568</span>&#160; </div>
+<div class="line"><a name="l16569"></a><span class="lineno">16569</span>&#160;    <span class="keywordflow">if</span>(withinBudget)</div>
+<div class="line"><a name="l16570"></a><span class="lineno">16570</span>&#160;    {</div>
+<div class="line"><a name="l16571"></a><span class="lineno">16571</span>&#160;        <span class="keyword">const</span> uint32_t heapIndex = MemoryTypeIndexToHeapIndex(memTypeIndex);</div>
+<div class="line"><a name="l16572"></a><span class="lineno">16572</span>&#160;        <a class="code" href="struct_vma_budget.html">VmaBudget</a> heapBudget = {};</div>
+<div class="line"><a name="l16573"></a><span class="lineno">16573</span>&#160;        GetBudget(&amp;heapBudget, heapIndex, 1);</div>
+<div class="line"><a name="l16574"></a><span class="lineno">16574</span>&#160;        <span class="keywordflow">if</span>(heapBudget.<a class="code" href="struct_vma_budget.html#a84dd1ecca8b0110259eb206dbadb11f6">usage</a> + size * allocationCount &gt; heapBudget.<a class="code" href="struct_vma_budget.html#ab82e1d1754c2d210d0bdf90220bc6cdd">budget</a>)</div>
+<div class="line"><a name="l16575"></a><span class="lineno">16575</span>&#160;        {</div>
+<div class="line"><a name="l16576"></a><span class="lineno">16576</span>&#160;            <span class="keywordflow">return</span> VK_ERROR_OUT_OF_DEVICE_MEMORY;</div>
+<div class="line"><a name="l16577"></a><span class="lineno">16577</span>&#160;        }</div>
+<div class="line"><a name="l16578"></a><span class="lineno">16578</span>&#160;    }</div>
+<div class="line"><a name="l16579"></a><span class="lineno">16579</span>&#160; </div>
+<div class="line"><a name="l16580"></a><span class="lineno">16580</span>&#160;    VkMemoryAllocateInfo allocInfo = { VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO };</div>
+<div class="line"><a name="l16581"></a><span class="lineno">16581</span>&#160;    allocInfo.memoryTypeIndex = memTypeIndex;</div>
+<div class="line"><a name="l16582"></a><span class="lineno">16582</span>&#160;    allocInfo.allocationSize = size;</div>
+<div class="line"><a name="l16583"></a><span class="lineno">16583</span>&#160; </div>
+<div class="line"><a name="l16584"></a><span class="lineno">16584</span>&#160;<span class="preprocessor">#if VMA_DEDICATED_ALLOCATION || VMA_VULKAN_VERSION &gt;= 1001000</span></div>
+<div class="line"><a name="l16585"></a><span class="lineno">16585</span>&#160;    VkMemoryDedicatedAllocateInfoKHR dedicatedAllocInfo = { VK_STRUCTURE_TYPE_MEMORY_DEDICATED_ALLOCATE_INFO_KHR };</div>
+<div class="line"><a name="l16586"></a><span class="lineno">16586</span>&#160;    <span class="keywordflow">if</span>(m_UseKhrDedicatedAllocation || m_VulkanApiVersion &gt;= VK_MAKE_VERSION(1, 1, 0))</div>
+<div class="line"><a name="l16587"></a><span class="lineno">16587</span>&#160;    {</div>
+<div class="line"><a name="l16588"></a><span class="lineno">16588</span>&#160;        <span class="keywordflow">if</span>(dedicatedBuffer != VK_NULL_HANDLE)</div>
+<div class="line"><a name="l16589"></a><span class="lineno">16589</span>&#160;        {</div>
+<div class="line"><a name="l16590"></a><span class="lineno">16590</span>&#160;            VMA_ASSERT(dedicatedImage == VK_NULL_HANDLE);</div>
+<div class="line"><a name="l16591"></a><span class="lineno">16591</span>&#160;            dedicatedAllocInfo.buffer = dedicatedBuffer;</div>
+<div class="line"><a name="l16592"></a><span class="lineno">16592</span>&#160;            VmaPnextChainPushFront(&amp;allocInfo, &amp;dedicatedAllocInfo);</div>
+<div class="line"><a name="l16593"></a><span class="lineno">16593</span>&#160;        }</div>
+<div class="line"><a name="l16594"></a><span class="lineno">16594</span>&#160;        <span class="keywordflow">else</span> <span class="keywordflow">if</span>(dedicatedImage != VK_NULL_HANDLE)</div>
+<div class="line"><a name="l16595"></a><span class="lineno">16595</span>&#160;        {</div>
+<div class="line"><a name="l16596"></a><span class="lineno">16596</span>&#160;            dedicatedAllocInfo.image = dedicatedImage;</div>
+<div class="line"><a name="l16597"></a><span class="lineno">16597</span>&#160;            VmaPnextChainPushFront(&amp;allocInfo, &amp;dedicatedAllocInfo);</div>
+<div class="line"><a name="l16598"></a><span class="lineno">16598</span>&#160;        }</div>
+<div class="line"><a name="l16599"></a><span class="lineno">16599</span>&#160;    }</div>
+<div class="line"><a name="l16600"></a><span class="lineno">16600</span>&#160;<span class="preprocessor">#endif </span><span class="comment">// #if VMA_DEDICATED_ALLOCATION || VMA_VULKAN_VERSION &gt;= 1001000</span></div>
+<div class="line"><a name="l16601"></a><span class="lineno">16601</span>&#160; </div>
+<div class="line"><a name="l16602"></a><span class="lineno">16602</span>&#160;<span class="preprocessor">#if VMA_BUFFER_DEVICE_ADDRESS</span></div>
+<div class="line"><a name="l16603"></a><span class="lineno">16603</span>&#160;    VkMemoryAllocateFlagsInfoKHR allocFlagsInfo = { VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_FLAGS_INFO_KHR };</div>
+<div class="line"><a name="l16604"></a><span class="lineno">16604</span>&#160;    <span class="keywordflow">if</span>(m_UseKhrBufferDeviceAddress)</div>
+<div class="line"><a name="l16605"></a><span class="lineno">16605</span>&#160;    {</div>
+<div class="line"><a name="l16606"></a><span class="lineno">16606</span>&#160;        <span class="keywordtype">bool</span> canContainBufferWithDeviceAddress = <span class="keyword">true</span>;</div>
+<div class="line"><a name="l16607"></a><span class="lineno">16607</span>&#160;        <span class="keywordflow">if</span>(dedicatedBuffer != VK_NULL_HANDLE)</div>
+<div class="line"><a name="l16608"></a><span class="lineno">16608</span>&#160;        {</div>
+<div class="line"><a name="l16609"></a><span class="lineno">16609</span>&#160;            canContainBufferWithDeviceAddress = dedicatedBufferUsage == UINT32_MAX || <span class="comment">// Usage flags unknown</span></div>
+<div class="line"><a name="l16610"></a><span class="lineno">16610</span>&#160;                (dedicatedBufferUsage &amp; VK_BUFFER_USAGE_SHADER_DEVICE_ADDRESS_BIT_EXT) != 0;</div>
+<div class="line"><a name="l16611"></a><span class="lineno">16611</span>&#160;        }</div>
+<div class="line"><a name="l16612"></a><span class="lineno">16612</span>&#160;        <span class="keywordflow">else</span> <span class="keywordflow">if</span>(dedicatedImage != VK_NULL_HANDLE)</div>
+<div class="line"><a name="l16613"></a><span class="lineno">16613</span>&#160;        {</div>
+<div class="line"><a name="l16614"></a><span class="lineno">16614</span>&#160;            canContainBufferWithDeviceAddress = <span class="keyword">false</span>;</div>
+<div class="line"><a name="l16615"></a><span class="lineno">16615</span>&#160;        }</div>
+<div class="line"><a name="l16616"></a><span class="lineno">16616</span>&#160;        <span class="keywordflow">if</span>(canContainBufferWithDeviceAddress)</div>
+<div class="line"><a name="l16617"></a><span class="lineno">16617</span>&#160;        {</div>
+<div class="line"><a name="l16618"></a><span class="lineno">16618</span>&#160;            allocFlagsInfo.flags = VK_MEMORY_ALLOCATE_DEVICE_ADDRESS_BIT_KHR;</div>
+<div class="line"><a name="l16619"></a><span class="lineno">16619</span>&#160;            VmaPnextChainPushFront(&amp;allocInfo, &amp;allocFlagsInfo);</div>
+<div class="line"><a name="l16620"></a><span class="lineno">16620</span>&#160;        }</div>
+<div class="line"><a name="l16621"></a><span class="lineno">16621</span>&#160;    }</div>
+<div class="line"><a name="l16622"></a><span class="lineno">16622</span>&#160;<span class="preprocessor">#endif </span><span class="comment">// #if VMA_BUFFER_DEVICE_ADDRESS</span></div>
+<div class="line"><a name="l16623"></a><span class="lineno">16623</span>&#160; </div>
+<div class="line"><a name="l16624"></a><span class="lineno">16624</span>&#160;<span class="preprocessor">#if VMA_MEMORY_PRIORITY</span></div>
+<div class="line"><a name="l16625"></a><span class="lineno">16625</span>&#160;    VkMemoryPriorityAllocateInfoEXT priorityInfo = { VK_STRUCTURE_TYPE_MEMORY_PRIORITY_ALLOCATE_INFO_EXT };</div>
+<div class="line"><a name="l16626"></a><span class="lineno">16626</span>&#160;    <span class="keywordflow">if</span>(m_UseExtMemoryPriority)</div>
+<div class="line"><a name="l16627"></a><span class="lineno">16627</span>&#160;    {</div>
+<div class="line"><a name="l16628"></a><span class="lineno">16628</span>&#160;        priorityInfo.priority = priority;</div>
+<div class="line"><a name="l16629"></a><span class="lineno">16629</span>&#160;        VmaPnextChainPushFront(&amp;allocInfo, &amp;priorityInfo);</div>
+<div class="line"><a name="l16630"></a><span class="lineno">16630</span>&#160;    }</div>
+<div class="line"><a name="l16631"></a><span class="lineno">16631</span>&#160;<span class="preprocessor">#endif </span><span class="comment">// #if VMA_MEMORY_PRIORITY</span></div>
+<div class="line"><a name="l16632"></a><span class="lineno">16632</span>&#160; </div>
+<div class="line"><a name="l16633"></a><span class="lineno">16633</span>&#160;    <span class="keywordtype">size_t</span> allocIndex;</div>
+<div class="line"><a name="l16634"></a><span class="lineno">16634</span>&#160;    VkResult res = VK_SUCCESS;</div>
+<div class="line"><a name="l16635"></a><span class="lineno">16635</span>&#160;    <span class="keywordflow">for</span>(allocIndex = 0; allocIndex &lt; allocationCount; ++allocIndex)</div>
+<div class="line"><a name="l16636"></a><span class="lineno">16636</span>&#160;    {</div>
+<div class="line"><a name="l16637"></a><span class="lineno">16637</span>&#160;        res = AllocateDedicatedMemoryPage(</div>
+<div class="line"><a name="l16638"></a><span class="lineno">16638</span>&#160;            size,</div>
+<div class="line"><a name="l16639"></a><span class="lineno">16639</span>&#160;            suballocType,</div>
+<div class="line"><a name="l16640"></a><span class="lineno">16640</span>&#160;            memTypeIndex,</div>
+<div class="line"><a name="l16641"></a><span class="lineno">16641</span>&#160;            allocInfo,</div>
+<div class="line"><a name="l16642"></a><span class="lineno">16642</span>&#160;            map,</div>
+<div class="line"><a name="l16643"></a><span class="lineno">16643</span>&#160;            isUserDataString,</div>
+<div class="line"><a name="l16644"></a><span class="lineno">16644</span>&#160;            pUserData,</div>
+<div class="line"><a name="l16645"></a><span class="lineno">16645</span>&#160;            pAllocations + allocIndex);</div>
+<div class="line"><a name="l16646"></a><span class="lineno">16646</span>&#160;        <span class="keywordflow">if</span>(res != VK_SUCCESS)</div>
+<div class="line"><a name="l16647"></a><span class="lineno">16647</span>&#160;        {</div>
+<div class="line"><a name="l16648"></a><span class="lineno">16648</span>&#160;            <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l16649"></a><span class="lineno">16649</span>&#160;        }</div>
+<div class="line"><a name="l16650"></a><span class="lineno">16650</span>&#160;    }</div>
+<div class="line"><a name="l16651"></a><span class="lineno">16651</span>&#160; </div>
+<div class="line"><a name="l16652"></a><span class="lineno">16652</span>&#160;    <span class="keywordflow">if</span>(res == VK_SUCCESS)</div>
+<div class="line"><a name="l16653"></a><span class="lineno">16653</span>&#160;    {</div>
+<div class="line"><a name="l16654"></a><span class="lineno">16654</span>&#160;        <span class="comment">// Register them in m_DedicatedAllocations.</span></div>
+<div class="line"><a name="l16655"></a><span class="lineno">16655</span>&#160;        {</div>
+<div class="line"><a name="l16656"></a><span class="lineno">16656</span>&#160;            VmaMutexLockWrite lock(m_DedicatedAllocationsMutex[memTypeIndex], m_UseMutex);</div>
+<div class="line"><a name="l16657"></a><span class="lineno">16657</span>&#160;            DedicatedAllocationLinkedList&amp; dedicatedAllocations = m_DedicatedAllocations[memTypeIndex];</div>
+<div class="line"><a name="l16658"></a><span class="lineno">16658</span>&#160;            <span class="keywordflow">for</span>(allocIndex = 0; allocIndex &lt; allocationCount; ++allocIndex)</div>
+<div class="line"><a name="l16659"></a><span class="lineno">16659</span>&#160;            {</div>
+<div class="line"><a name="l16660"></a><span class="lineno">16660</span>&#160;                dedicatedAllocations.PushBack(pAllocations[allocIndex]);</div>
+<div class="line"><a name="l16661"></a><span class="lineno">16661</span>&#160;            }</div>
+<div class="line"><a name="l16662"></a><span class="lineno">16662</span>&#160;        }</div>
+<div class="line"><a name="l16663"></a><span class="lineno">16663</span>&#160; </div>
+<div class="line"><a name="l16664"></a><span class="lineno">16664</span>&#160;        VMA_DEBUG_LOG(<span class="stringliteral">&quot;    Allocated DedicatedMemory Count=%zu, MemoryTypeIndex=#%u&quot;</span>, allocationCount, memTypeIndex);</div>
+<div class="line"><a name="l16665"></a><span class="lineno">16665</span>&#160;    }</div>
+<div class="line"><a name="l16666"></a><span class="lineno">16666</span>&#160;    <span class="keywordflow">else</span></div>
+<div class="line"><a name="l16667"></a><span class="lineno">16667</span>&#160;    {</div>
+<div class="line"><a name="l16668"></a><span class="lineno">16668</span>&#160;        <span class="comment">// Free all already created allocations.</span></div>
+<div class="line"><a name="l16669"></a><span class="lineno">16669</span>&#160;        <span class="keywordflow">while</span>(allocIndex--)</div>
+<div class="line"><a name="l16670"></a><span class="lineno">16670</span>&#160;        {</div>
+<div class="line"><a name="l16671"></a><span class="lineno">16671</span>&#160;            <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> currAlloc = pAllocations[allocIndex];</div>
+<div class="line"><a name="l16672"></a><span class="lineno">16672</span>&#160;            VkDeviceMemory hMemory = currAlloc-&gt;GetMemory();</div>
+<div class="line"><a name="l16673"></a><span class="lineno">16673</span>&#160; </div>
+<div class="line"><a name="l16674"></a><span class="lineno">16674</span>&#160;            <span class="comment">/*</span></div>
+<div class="line"><a name="l16675"></a><span class="lineno">16675</span>&#160;<span class="comment">            There is no need to call this, because Vulkan spec allows to skip vkUnmapMemory</span></div>
+<div class="line"><a name="l16676"></a><span class="lineno">16676</span>&#160;<span class="comment">            before vkFreeMemory.</span></div>
+<div class="line"><a name="l16677"></a><span class="lineno">16677</span>&#160;<span class="comment"></span> </div>
+<div class="line"><a name="l16678"></a><span class="lineno">16678</span>&#160;<span class="comment">            if(currAlloc-&gt;GetMappedData() != VMA_NULL)</span></div>
+<div class="line"><a name="l16679"></a><span class="lineno">16679</span>&#160;<span class="comment">            {</span></div>
+<div class="line"><a name="l16680"></a><span class="lineno">16680</span>&#160;<span class="comment">                (*m_VulkanFunctions.vkUnmapMemory)(m_hDevice, hMemory);</span></div>
+<div class="line"><a name="l16681"></a><span class="lineno">16681</span>&#160;<span class="comment">            }</span></div>
+<div class="line"><a name="l16682"></a><span class="lineno">16682</span>&#160;<span class="comment">            */</span></div>
+<div class="line"><a name="l16683"></a><span class="lineno">16683</span>&#160; </div>
+<div class="line"><a name="l16684"></a><span class="lineno">16684</span>&#160;            FreeVulkanMemory(memTypeIndex, currAlloc-&gt;GetSize(), hMemory);</div>
+<div class="line"><a name="l16685"></a><span class="lineno">16685</span>&#160;            m_Budget.RemoveAllocation(MemoryTypeIndexToHeapIndex(memTypeIndex), currAlloc-&gt;GetSize());</div>
+<div class="line"><a name="l16686"></a><span class="lineno">16686</span>&#160;            currAlloc-&gt;SetUserData(<span class="keyword">this</span>, VMA_NULL);</div>
+<div class="line"><a name="l16687"></a><span class="lineno">16687</span>&#160;            m_AllocationObjectAllocator.Free(currAlloc);</div>
+<div class="line"><a name="l16688"></a><span class="lineno">16688</span>&#160;        }</div>
+<div class="line"><a name="l16689"></a><span class="lineno">16689</span>&#160; </div>
+<div class="line"><a name="l16690"></a><span class="lineno">16690</span>&#160;        memset(pAllocations, 0, <span class="keyword">sizeof</span>(<a class="code" href="struct_vma_allocation.html">VmaAllocation</a>) * allocationCount);</div>
+<div class="line"><a name="l16691"></a><span class="lineno">16691</span>&#160;    }</div>
+<div class="line"><a name="l16692"></a><span class="lineno">16692</span>&#160; </div>
+<div class="line"><a name="l16693"></a><span class="lineno">16693</span>&#160;    <span class="keywordflow">return</span> res;</div>
+<div class="line"><a name="l16694"></a><span class="lineno">16694</span>&#160;}</div>
+<div class="line"><a name="l16695"></a><span class="lineno">16695</span>&#160; </div>
+<div class="line"><a name="l16696"></a><span class="lineno">16696</span>&#160;VkResult VmaAllocator_T::AllocateDedicatedMemoryPage(</div>
+<div class="line"><a name="l16697"></a><span class="lineno">16697</span>&#160;    VkDeviceSize size,</div>
+<div class="line"><a name="l16698"></a><span class="lineno">16698</span>&#160;    VmaSuballocationType suballocType,</div>
+<div class="line"><a name="l16699"></a><span class="lineno">16699</span>&#160;    uint32_t memTypeIndex,</div>
+<div class="line"><a name="l16700"></a><span class="lineno">16700</span>&#160;    <span class="keyword">const</span> VkMemoryAllocateInfo&amp; allocInfo,</div>
+<div class="line"><a name="l16701"></a><span class="lineno">16701</span>&#160;    <span class="keywordtype">bool</span> map,</div>
+<div class="line"><a name="l16702"></a><span class="lineno">16702</span>&#160;    <span class="keywordtype">bool</span> isUserDataString,</div>
+<div class="line"><a name="l16703"></a><span class="lineno">16703</span>&#160;    <span class="keywordtype">void</span>* pUserData,</div>
+<div class="line"><a name="l16704"></a><span class="lineno">16704</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a>* pAllocation)</div>
+<div class="line"><a name="l16705"></a><span class="lineno">16705</span>&#160;{</div>
+<div class="line"><a name="l16706"></a><span class="lineno">16706</span>&#160;    VkDeviceMemory hMemory = VK_NULL_HANDLE;</div>
+<div class="line"><a name="l16707"></a><span class="lineno">16707</span>&#160;    VkResult res = AllocateVulkanMemory(&amp;allocInfo, &amp;hMemory);</div>
+<div class="line"><a name="l16708"></a><span class="lineno">16708</span>&#160;    <span class="keywordflow">if</span>(res &lt; 0)</div>
+<div class="line"><a name="l16709"></a><span class="lineno">16709</span>&#160;    {</div>
+<div class="line"><a name="l16710"></a><span class="lineno">16710</span>&#160;        VMA_DEBUG_LOG(<span class="stringliteral">&quot;    vkAllocateMemory FAILED&quot;</span>);</div>
+<div class="line"><a name="l16711"></a><span class="lineno">16711</span>&#160;        <span class="keywordflow">return</span> res;</div>
+<div class="line"><a name="l16712"></a><span class="lineno">16712</span>&#160;    }</div>
+<div class="line"><a name="l16713"></a><span class="lineno">16713</span>&#160; </div>
+<div class="line"><a name="l16714"></a><span class="lineno">16714</span>&#160;    <span class="keywordtype">void</span>* pMappedData = VMA_NULL;</div>
+<div class="line"><a name="l16715"></a><span class="lineno">16715</span>&#160;    <span class="keywordflow">if</span>(map)</div>
+<div class="line"><a name="l16716"></a><span class="lineno">16716</span>&#160;    {</div>
+<div class="line"><a name="l16717"></a><span class="lineno">16717</span>&#160;        res = (*m_VulkanFunctions.vkMapMemory)(</div>
+<div class="line"><a name="l16718"></a><span class="lineno">16718</span>&#160;            m_hDevice,</div>
+<div class="line"><a name="l16719"></a><span class="lineno">16719</span>&#160;            hMemory,</div>
+<div class="line"><a name="l16720"></a><span class="lineno">16720</span>&#160;            0,</div>
+<div class="line"><a name="l16721"></a><span class="lineno">16721</span>&#160;            VK_WHOLE_SIZE,</div>
+<div class="line"><a name="l16722"></a><span class="lineno">16722</span>&#160;            0,</div>
+<div class="line"><a name="l16723"></a><span class="lineno">16723</span>&#160;            &amp;pMappedData);</div>
+<div class="line"><a name="l16724"></a><span class="lineno">16724</span>&#160;        <span class="keywordflow">if</span>(res &lt; 0)</div>
+<div class="line"><a name="l16725"></a><span class="lineno">16725</span>&#160;        {</div>
+<div class="line"><a name="l16726"></a><span class="lineno">16726</span>&#160;            VMA_DEBUG_LOG(<span class="stringliteral">&quot;    vkMapMemory FAILED&quot;</span>);</div>
+<div class="line"><a name="l16727"></a><span class="lineno">16727</span>&#160;            FreeVulkanMemory(memTypeIndex, size, hMemory);</div>
+<div class="line"><a name="l16728"></a><span class="lineno">16728</span>&#160;            <span class="keywordflow">return</span> res;</div>
+<div class="line"><a name="l16729"></a><span class="lineno">16729</span>&#160;        }</div>
+<div class="line"><a name="l16730"></a><span class="lineno">16730</span>&#160;    }</div>
+<div class="line"><a name="l16731"></a><span class="lineno">16731</span>&#160; </div>
+<div class="line"><a name="l16732"></a><span class="lineno">16732</span>&#160;    *pAllocation = m_AllocationObjectAllocator.Allocate(m_CurrentFrameIndex.load(), isUserDataString);</div>
+<div class="line"><a name="l16733"></a><span class="lineno">16733</span>&#160;    (*pAllocation)-&gt;InitDedicatedAllocation(memTypeIndex, hMemory, suballocType, pMappedData, size);</div>
+<div class="line"><a name="l16734"></a><span class="lineno">16734</span>&#160;    (*pAllocation)-&gt;SetUserData(<span class="keyword">this</span>, pUserData);</div>
+<div class="line"><a name="l16735"></a><span class="lineno">16735</span>&#160;    m_Budget.AddAllocation(MemoryTypeIndexToHeapIndex(memTypeIndex), size);</div>
+<div class="line"><a name="l16736"></a><span class="lineno">16736</span>&#160;    <span class="keywordflow">if</span>(VMA_DEBUG_INITIALIZE_ALLOCATIONS)</div>
 <div class="line"><a name="l16737"></a><span class="lineno">16737</span>&#160;    {</div>
-<div class="line"><a name="l16738"></a><span class="lineno">16738</span>&#160;<span class="preprocessor">#if VMA_STATS_STRING_ENABLED</span></div>
-<div class="line"><a name="l16739"></a><span class="lineno">16739</span>&#160;        uint32_t localCurrFrameIndex = m_CurrentFrameIndex.load();</div>
-<div class="line"><a name="l16740"></a><span class="lineno">16740</span>&#160;        uint32_t localLastUseFrameIndex = hAllocation-&gt;GetLastUseFrameIndex();</div>
-<div class="line"><a name="l16741"></a><span class="lineno">16741</span>&#160;        <span class="keywordflow">for</span>(;;)</div>
-<div class="line"><a name="l16742"></a><span class="lineno">16742</span>&#160;        {</div>
-<div class="line"><a name="l16743"></a><span class="lineno">16743</span>&#160;            VMA_ASSERT(localLastUseFrameIndex != VMA_FRAME_INDEX_LOST);</div>
-<div class="line"><a name="l16744"></a><span class="lineno">16744</span>&#160;            <span class="keywordflow">if</span>(localLastUseFrameIndex == localCurrFrameIndex)</div>
-<div class="line"><a name="l16745"></a><span class="lineno">16745</span>&#160;            {</div>
-<div class="line"><a name="l16746"></a><span class="lineno">16746</span>&#160;                <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l16747"></a><span class="lineno">16747</span>&#160;            }</div>
-<div class="line"><a name="l16748"></a><span class="lineno">16748</span>&#160;            <span class="keywordflow">else</span> <span class="comment">// Last use time earlier than current time.</span></div>
-<div class="line"><a name="l16749"></a><span class="lineno">16749</span>&#160;            {</div>
-<div class="line"><a name="l16750"></a><span class="lineno">16750</span>&#160;                <span class="keywordflow">if</span>(hAllocation-&gt;CompareExchangeLastUseFrameIndex(localLastUseFrameIndex, localCurrFrameIndex))</div>
-<div class="line"><a name="l16751"></a><span class="lineno">16751</span>&#160;                {</div>
-<div class="line"><a name="l16752"></a><span class="lineno">16752</span>&#160;                    localLastUseFrameIndex = localCurrFrameIndex;</div>
-<div class="line"><a name="l16753"></a><span class="lineno">16753</span>&#160;                }</div>
-<div class="line"><a name="l16754"></a><span class="lineno">16754</span>&#160;            }</div>
-<div class="line"><a name="l16755"></a><span class="lineno">16755</span>&#160;        }</div>
-<div class="line"><a name="l16756"></a><span class="lineno">16756</span>&#160;<span class="preprocessor">#endif</span></div>
+<div class="line"><a name="l16738"></a><span class="lineno">16738</span>&#160;        FillAllocation(*pAllocation, VMA_ALLOCATION_FILL_PATTERN_CREATED);</div>
+<div class="line"><a name="l16739"></a><span class="lineno">16739</span>&#160;    }</div>
+<div class="line"><a name="l16740"></a><span class="lineno">16740</span>&#160; </div>
+<div class="line"><a name="l16741"></a><span class="lineno">16741</span>&#160;    <span class="keywordflow">return</span> VK_SUCCESS;</div>
+<div class="line"><a name="l16742"></a><span class="lineno">16742</span>&#160;}</div>
+<div class="line"><a name="l16743"></a><span class="lineno">16743</span>&#160; </div>
+<div class="line"><a name="l16744"></a><span class="lineno">16744</span>&#160;<span class="keywordtype">void</span> VmaAllocator_T::GetBufferMemoryRequirements(</div>
+<div class="line"><a name="l16745"></a><span class="lineno">16745</span>&#160;    VkBuffer hBuffer,</div>
+<div class="line"><a name="l16746"></a><span class="lineno">16746</span>&#160;    VkMemoryRequirements&amp; memReq,</div>
+<div class="line"><a name="l16747"></a><span class="lineno">16747</span>&#160;    <span class="keywordtype">bool</span>&amp; requiresDedicatedAllocation,</div>
+<div class="line"><a name="l16748"></a><span class="lineno">16748</span>&#160;    <span class="keywordtype">bool</span>&amp; prefersDedicatedAllocation)<span class="keyword"> const</span></div>
+<div class="line"><a name="l16749"></a><span class="lineno">16749</span>&#160;<span class="keyword"></span>{</div>
+<div class="line"><a name="l16750"></a><span class="lineno">16750</span>&#160;<span class="preprocessor">#if VMA_DEDICATED_ALLOCATION || VMA_VULKAN_VERSION &gt;= 1001000</span></div>
+<div class="line"><a name="l16751"></a><span class="lineno">16751</span>&#160;    <span class="keywordflow">if</span>(m_UseKhrDedicatedAllocation || m_VulkanApiVersion &gt;= VK_MAKE_VERSION(1, 1, 0))</div>
+<div class="line"><a name="l16752"></a><span class="lineno">16752</span>&#160;    {</div>
+<div class="line"><a name="l16753"></a><span class="lineno">16753</span>&#160;        VkBufferMemoryRequirementsInfo2KHR memReqInfo = { VK_STRUCTURE_TYPE_BUFFER_MEMORY_REQUIREMENTS_INFO_2_KHR };</div>
+<div class="line"><a name="l16754"></a><span class="lineno">16754</span>&#160;        memReqInfo.buffer = hBuffer;</div>
+<div class="line"><a name="l16755"></a><span class="lineno">16755</span>&#160; </div>
+<div class="line"><a name="l16756"></a><span class="lineno">16756</span>&#160;        VkMemoryDedicatedRequirementsKHR memDedicatedReq = { VK_STRUCTURE_TYPE_MEMORY_DEDICATED_REQUIREMENTS_KHR };</div>
 <div class="line"><a name="l16757"></a><span class="lineno">16757</span>&#160; </div>
-<div class="line"><a name="l16758"></a><span class="lineno">16758</span>&#160;        <span class="keywordflow">return</span> <span class="keyword">true</span>;</div>
-<div class="line"><a name="l16759"></a><span class="lineno">16759</span>&#160;    }</div>
-<div class="line"><a name="l16760"></a><span class="lineno">16760</span>&#160;}</div>
-<div class="line"><a name="l16761"></a><span class="lineno">16761</span>&#160; </div>
-<div class="line"><a name="l16762"></a><span class="lineno">16762</span>&#160;VkResult VmaAllocator_T::CreatePool(<span class="keyword">const</span> <a class="code" href="struct_vma_pool_create_info.html">VmaPoolCreateInfo</a>* pCreateInfo, <a class="code" href="struct_vma_pool.html">VmaPool</a>* pPool)</div>
-<div class="line"><a name="l16763"></a><span class="lineno">16763</span>&#160;{</div>
-<div class="line"><a name="l16764"></a><span class="lineno">16764</span>&#160;    VMA_DEBUG_LOG(<span class="stringliteral">&quot;  CreatePool: MemoryTypeIndex=%u, flags=%u&quot;</span>, pCreateInfo-&gt;<a class="code" href="struct_vma_pool_create_info.html#a596fa76b685d3f1f688f84a709a5b319">memoryTypeIndex</a>, pCreateInfo-&gt;<a class="code" href="struct_vma_pool_create_info.html#a8405139f63d078340ae74513a59f5446">flags</a>);</div>
-<div class="line"><a name="l16765"></a><span class="lineno">16765</span>&#160; </div>
-<div class="line"><a name="l16766"></a><span class="lineno">16766</span>&#160;    <a class="code" href="struct_vma_pool_create_info.html">VmaPoolCreateInfo</a> newCreateInfo = *pCreateInfo;</div>
-<div class="line"><a name="l16767"></a><span class="lineno">16767</span>&#160; </div>
-<div class="line"><a name="l16768"></a><span class="lineno">16768</span>&#160;    <span class="keywordflow">if</span>(newCreateInfo.<a class="code" href="struct_vma_pool_create_info.html#ae41142f2834fcdc82baa4883c187b75c">maxBlockCount</a> == 0)</div>
+<div class="line"><a name="l16758"></a><span class="lineno">16758</span>&#160;        VkMemoryRequirements2KHR memReq2 = { VK_STRUCTURE_TYPE_MEMORY_REQUIREMENTS_2_KHR };</div>
+<div class="line"><a name="l16759"></a><span class="lineno">16759</span>&#160;        VmaPnextChainPushFront(&amp;memReq2, &amp;memDedicatedReq);</div>
+<div class="line"><a name="l16760"></a><span class="lineno">16760</span>&#160; </div>
+<div class="line"><a name="l16761"></a><span class="lineno">16761</span>&#160;        (*m_VulkanFunctions.vkGetBufferMemoryRequirements2KHR)(m_hDevice, &amp;memReqInfo, &amp;memReq2);</div>
+<div class="line"><a name="l16762"></a><span class="lineno">16762</span>&#160; </div>
+<div class="line"><a name="l16763"></a><span class="lineno">16763</span>&#160;        memReq = memReq2.memoryRequirements;</div>
+<div class="line"><a name="l16764"></a><span class="lineno">16764</span>&#160;        requiresDedicatedAllocation = (memDedicatedReq.requiresDedicatedAllocation != VK_FALSE);</div>
+<div class="line"><a name="l16765"></a><span class="lineno">16765</span>&#160;        prefersDedicatedAllocation  = (memDedicatedReq.prefersDedicatedAllocation  != VK_FALSE);</div>
+<div class="line"><a name="l16766"></a><span class="lineno">16766</span>&#160;    }</div>
+<div class="line"><a name="l16767"></a><span class="lineno">16767</span>&#160;    <span class="keywordflow">else</span></div>
+<div class="line"><a name="l16768"></a><span class="lineno">16768</span>&#160;<span class="preprocessor">#endif </span><span class="comment">// #if VMA_DEDICATED_ALLOCATION || VMA_VULKAN_VERSION &gt;= 1001000</span></div>
 <div class="line"><a name="l16769"></a><span class="lineno">16769</span>&#160;    {</div>
-<div class="line"><a name="l16770"></a><span class="lineno">16770</span>&#160;        newCreateInfo.<a class="code" href="struct_vma_pool_create_info.html#ae41142f2834fcdc82baa4883c187b75c">maxBlockCount</a> = SIZE_MAX;</div>
-<div class="line"><a name="l16771"></a><span class="lineno">16771</span>&#160;    }</div>
-<div class="line"><a name="l16772"></a><span class="lineno">16772</span>&#160;    <span class="keywordflow">if</span>(newCreateInfo.<a class="code" href="struct_vma_pool_create_info.html#ad8006fb803185c0a699d30f3e9a865ae">minBlockCount</a> &gt; newCreateInfo.<a class="code" href="struct_vma_pool_create_info.html#ae41142f2834fcdc82baa4883c187b75c">maxBlockCount</a>)</div>
-<div class="line"><a name="l16773"></a><span class="lineno">16773</span>&#160;    {</div>
-<div class="line"><a name="l16774"></a><span class="lineno">16774</span>&#160;        <span class="keywordflow">return</span> VK_ERROR_INITIALIZATION_FAILED;</div>
-<div class="line"><a name="l16775"></a><span class="lineno">16775</span>&#160;    }</div>
-<div class="line"><a name="l16776"></a><span class="lineno">16776</span>&#160;    <span class="comment">// Memory type index out of range or forbidden.</span></div>
-<div class="line"><a name="l16777"></a><span class="lineno">16777</span>&#160;    <span class="keywordflow">if</span>(pCreateInfo-&gt;<a class="code" href="struct_vma_pool_create_info.html#a596fa76b685d3f1f688f84a709a5b319">memoryTypeIndex</a> &gt;= GetMemoryTypeCount() ||</div>
-<div class="line"><a name="l16778"></a><span class="lineno">16778</span>&#160;        ((1u &lt;&lt; pCreateInfo-&gt;<a class="code" href="struct_vma_pool_create_info.html#a596fa76b685d3f1f688f84a709a5b319">memoryTypeIndex</a>) &amp; m_GlobalMemoryTypeBits) == 0)</div>
-<div class="line"><a name="l16779"></a><span class="lineno">16779</span>&#160;    {</div>
-<div class="line"><a name="l16780"></a><span class="lineno">16780</span>&#160;        <span class="keywordflow">return</span> VK_ERROR_FEATURE_NOT_PRESENT;</div>
-<div class="line"><a name="l16781"></a><span class="lineno">16781</span>&#160;    }</div>
-<div class="line"><a name="l16782"></a><span class="lineno">16782</span>&#160; </div>
-<div class="line"><a name="l16783"></a><span class="lineno">16783</span>&#160;    <span class="keyword">const</span> VkDeviceSize preferredBlockSize = CalcPreferredBlockSize(newCreateInfo.<a class="code" href="struct_vma_pool_create_info.html#a596fa76b685d3f1f688f84a709a5b319">memoryTypeIndex</a>);</div>
-<div class="line"><a name="l16784"></a><span class="lineno">16784</span>&#160; </div>
-<div class="line"><a name="l16785"></a><span class="lineno">16785</span>&#160;    *pPool = vma_new(<span class="keyword">this</span>, VmaPool_T)(<span class="keyword">this</span>, newCreateInfo, preferredBlockSize);</div>
-<div class="line"><a name="l16786"></a><span class="lineno">16786</span>&#160; </div>
-<div class="line"><a name="l16787"></a><span class="lineno">16787</span>&#160;    VkResult res = (*pPool)-&gt;m_BlockVector.CreateMinBlocks();</div>
-<div class="line"><a name="l16788"></a><span class="lineno">16788</span>&#160;    <span class="keywordflow">if</span>(res != VK_SUCCESS)</div>
-<div class="line"><a name="l16789"></a><span class="lineno">16789</span>&#160;    {</div>
-<div class="line"><a name="l16790"></a><span class="lineno">16790</span>&#160;        vma_delete(<span class="keyword">this</span>, *pPool);</div>
-<div class="line"><a name="l16791"></a><span class="lineno">16791</span>&#160;        *pPool = VMA_NULL;</div>
-<div class="line"><a name="l16792"></a><span class="lineno">16792</span>&#160;        <span class="keywordflow">return</span> res;</div>
-<div class="line"><a name="l16793"></a><span class="lineno">16793</span>&#160;    }</div>
+<div class="line"><a name="l16770"></a><span class="lineno">16770</span>&#160;        (*m_VulkanFunctions.vkGetBufferMemoryRequirements)(m_hDevice, hBuffer, &amp;memReq);</div>
+<div class="line"><a name="l16771"></a><span class="lineno">16771</span>&#160;        requiresDedicatedAllocation = <span class="keyword">false</span>;</div>
+<div class="line"><a name="l16772"></a><span class="lineno">16772</span>&#160;        prefersDedicatedAllocation  = <span class="keyword">false</span>;</div>
+<div class="line"><a name="l16773"></a><span class="lineno">16773</span>&#160;    }</div>
+<div class="line"><a name="l16774"></a><span class="lineno">16774</span>&#160;}</div>
+<div class="line"><a name="l16775"></a><span class="lineno">16775</span>&#160; </div>
+<div class="line"><a name="l16776"></a><span class="lineno">16776</span>&#160;<span class="keywordtype">void</span> VmaAllocator_T::GetImageMemoryRequirements(</div>
+<div class="line"><a name="l16777"></a><span class="lineno">16777</span>&#160;    VkImage hImage,</div>
+<div class="line"><a name="l16778"></a><span class="lineno">16778</span>&#160;    VkMemoryRequirements&amp; memReq,</div>
+<div class="line"><a name="l16779"></a><span class="lineno">16779</span>&#160;    <span class="keywordtype">bool</span>&amp; requiresDedicatedAllocation,</div>
+<div class="line"><a name="l16780"></a><span class="lineno">16780</span>&#160;    <span class="keywordtype">bool</span>&amp; prefersDedicatedAllocation)<span class="keyword"> const</span></div>
+<div class="line"><a name="l16781"></a><span class="lineno">16781</span>&#160;<span class="keyword"></span>{</div>
+<div class="line"><a name="l16782"></a><span class="lineno">16782</span>&#160;<span class="preprocessor">#if VMA_DEDICATED_ALLOCATION || VMA_VULKAN_VERSION &gt;= 1001000</span></div>
+<div class="line"><a name="l16783"></a><span class="lineno">16783</span>&#160;    <span class="keywordflow">if</span>(m_UseKhrDedicatedAllocation || m_VulkanApiVersion &gt;= VK_MAKE_VERSION(1, 1, 0))</div>
+<div class="line"><a name="l16784"></a><span class="lineno">16784</span>&#160;    {</div>
+<div class="line"><a name="l16785"></a><span class="lineno">16785</span>&#160;        VkImageMemoryRequirementsInfo2KHR memReqInfo = { VK_STRUCTURE_TYPE_IMAGE_MEMORY_REQUIREMENTS_INFO_2_KHR };</div>
+<div class="line"><a name="l16786"></a><span class="lineno">16786</span>&#160;        memReqInfo.image = hImage;</div>
+<div class="line"><a name="l16787"></a><span class="lineno">16787</span>&#160; </div>
+<div class="line"><a name="l16788"></a><span class="lineno">16788</span>&#160;        VkMemoryDedicatedRequirementsKHR memDedicatedReq = { VK_STRUCTURE_TYPE_MEMORY_DEDICATED_REQUIREMENTS_KHR };</div>
+<div class="line"><a name="l16789"></a><span class="lineno">16789</span>&#160; </div>
+<div class="line"><a name="l16790"></a><span class="lineno">16790</span>&#160;        VkMemoryRequirements2KHR memReq2 = { VK_STRUCTURE_TYPE_MEMORY_REQUIREMENTS_2_KHR };</div>
+<div class="line"><a name="l16791"></a><span class="lineno">16791</span>&#160;        VmaPnextChainPushFront(&amp;memReq2, &amp;memDedicatedReq);</div>
+<div class="line"><a name="l16792"></a><span class="lineno">16792</span>&#160; </div>
+<div class="line"><a name="l16793"></a><span class="lineno">16793</span>&#160;        (*m_VulkanFunctions.vkGetImageMemoryRequirements2KHR)(m_hDevice, &amp;memReqInfo, &amp;memReq2);</div>
 <div class="line"><a name="l16794"></a><span class="lineno">16794</span>&#160; </div>
-<div class="line"><a name="l16795"></a><span class="lineno">16795</span>&#160;    <span class="comment">// Add to m_Pools.</span></div>
-<div class="line"><a name="l16796"></a><span class="lineno">16796</span>&#160;    {</div>
-<div class="line"><a name="l16797"></a><span class="lineno">16797</span>&#160;        VmaMutexLockWrite lock(m_PoolsMutex, m_UseMutex);</div>
-<div class="line"><a name="l16798"></a><span class="lineno">16798</span>&#160;        (*pPool)-&gt;SetId(m_NextPoolId++);</div>
-<div class="line"><a name="l16799"></a><span class="lineno">16799</span>&#160;        VmaVectorInsertSorted&lt;VmaPointerLess&gt;(m_Pools, *pPool);</div>
-<div class="line"><a name="l16800"></a><span class="lineno">16800</span>&#160;    }</div>
-<div class="line"><a name="l16801"></a><span class="lineno">16801</span>&#160; </div>
-<div class="line"><a name="l16802"></a><span class="lineno">16802</span>&#160;    <span class="keywordflow">return</span> VK_SUCCESS;</div>
-<div class="line"><a name="l16803"></a><span class="lineno">16803</span>&#160;}</div>
-<div class="line"><a name="l16804"></a><span class="lineno">16804</span>&#160; </div>
-<div class="line"><a name="l16805"></a><span class="lineno">16805</span>&#160;<span class="keywordtype">void</span> VmaAllocator_T::DestroyPool(<a class="code" href="struct_vma_pool.html">VmaPool</a> pool)</div>
-<div class="line"><a name="l16806"></a><span class="lineno">16806</span>&#160;{</div>
-<div class="line"><a name="l16807"></a><span class="lineno">16807</span>&#160;    <span class="comment">// Remove from m_Pools.</span></div>
-<div class="line"><a name="l16808"></a><span class="lineno">16808</span>&#160;    {</div>
-<div class="line"><a name="l16809"></a><span class="lineno">16809</span>&#160;        VmaMutexLockWrite lock(m_PoolsMutex, m_UseMutex);</div>
-<div class="line"><a name="l16810"></a><span class="lineno">16810</span>&#160;        <span class="keywordtype">bool</span> success = VmaVectorRemoveSorted&lt;VmaPointerLess&gt;(m_Pools, pool);</div>
-<div class="line"><a name="l16811"></a><span class="lineno">16811</span>&#160;        VMA_ASSERT(success &amp;&amp; <span class="stringliteral">&quot;Pool not found in Allocator.&quot;</span>);</div>
-<div class="line"><a name="l16812"></a><span class="lineno">16812</span>&#160;    }</div>
-<div class="line"><a name="l16813"></a><span class="lineno">16813</span>&#160; </div>
-<div class="line"><a name="l16814"></a><span class="lineno">16814</span>&#160;    vma_delete(<span class="keyword">this</span>, pool);</div>
-<div class="line"><a name="l16815"></a><span class="lineno">16815</span>&#160;}</div>
-<div class="line"><a name="l16816"></a><span class="lineno">16816</span>&#160; </div>
-<div class="line"><a name="l16817"></a><span class="lineno">16817</span>&#160;<span class="keywordtype">void</span> VmaAllocator_T::GetPoolStats(<a class="code" href="struct_vma_pool.html">VmaPool</a> pool, <a class="code" href="struct_vma_pool_stats.html">VmaPoolStats</a>* pPoolStats)</div>
-<div class="line"><a name="l16818"></a><span class="lineno">16818</span>&#160;{</div>
-<div class="line"><a name="l16819"></a><span class="lineno">16819</span>&#160;    pool-&gt;m_BlockVector.GetPoolStats(pPoolStats);</div>
-<div class="line"><a name="l16820"></a><span class="lineno">16820</span>&#160;}</div>
+<div class="line"><a name="l16795"></a><span class="lineno">16795</span>&#160;        memReq = memReq2.memoryRequirements;</div>
+<div class="line"><a name="l16796"></a><span class="lineno">16796</span>&#160;        requiresDedicatedAllocation = (memDedicatedReq.requiresDedicatedAllocation != VK_FALSE);</div>
+<div class="line"><a name="l16797"></a><span class="lineno">16797</span>&#160;        prefersDedicatedAllocation  = (memDedicatedReq.prefersDedicatedAllocation  != VK_FALSE);</div>
+<div class="line"><a name="l16798"></a><span class="lineno">16798</span>&#160;    }</div>
+<div class="line"><a name="l16799"></a><span class="lineno">16799</span>&#160;    <span class="keywordflow">else</span></div>
+<div class="line"><a name="l16800"></a><span class="lineno">16800</span>&#160;<span class="preprocessor">#endif </span><span class="comment">// #if VMA_DEDICATED_ALLOCATION || VMA_VULKAN_VERSION &gt;= 1001000</span></div>
+<div class="line"><a name="l16801"></a><span class="lineno">16801</span>&#160;    {</div>
+<div class="line"><a name="l16802"></a><span class="lineno">16802</span>&#160;        (*m_VulkanFunctions.vkGetImageMemoryRequirements)(m_hDevice, hImage, &amp;memReq);</div>
+<div class="line"><a name="l16803"></a><span class="lineno">16803</span>&#160;        requiresDedicatedAllocation = <span class="keyword">false</span>;</div>
+<div class="line"><a name="l16804"></a><span class="lineno">16804</span>&#160;        prefersDedicatedAllocation  = <span class="keyword">false</span>;</div>
+<div class="line"><a name="l16805"></a><span class="lineno">16805</span>&#160;    }</div>
+<div class="line"><a name="l16806"></a><span class="lineno">16806</span>&#160;}</div>
+<div class="line"><a name="l16807"></a><span class="lineno">16807</span>&#160; </div>
+<div class="line"><a name="l16808"></a><span class="lineno">16808</span>&#160;VkResult VmaAllocator_T::AllocateMemory(</div>
+<div class="line"><a name="l16809"></a><span class="lineno">16809</span>&#160;    <span class="keyword">const</span> VkMemoryRequirements&amp; vkMemReq,</div>
+<div class="line"><a name="l16810"></a><span class="lineno">16810</span>&#160;    <span class="keywordtype">bool</span> requiresDedicatedAllocation,</div>
+<div class="line"><a name="l16811"></a><span class="lineno">16811</span>&#160;    <span class="keywordtype">bool</span> prefersDedicatedAllocation,</div>
+<div class="line"><a name="l16812"></a><span class="lineno">16812</span>&#160;    VkBuffer dedicatedBuffer,</div>
+<div class="line"><a name="l16813"></a><span class="lineno">16813</span>&#160;    VkBufferUsageFlags dedicatedBufferUsage,</div>
+<div class="line"><a name="l16814"></a><span class="lineno">16814</span>&#160;    VkImage dedicatedImage,</div>
+<div class="line"><a name="l16815"></a><span class="lineno">16815</span>&#160;    <span class="keyword">const</span> <a class="code" href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a>&amp; createInfo,</div>
+<div class="line"><a name="l16816"></a><span class="lineno">16816</span>&#160;    VmaSuballocationType suballocType,</div>
+<div class="line"><a name="l16817"></a><span class="lineno">16817</span>&#160;    <span class="keywordtype">size_t</span> allocationCount,</div>
+<div class="line"><a name="l16818"></a><span class="lineno">16818</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a>* pAllocations)</div>
+<div class="line"><a name="l16819"></a><span class="lineno">16819</span>&#160;{</div>
+<div class="line"><a name="l16820"></a><span class="lineno">16820</span>&#160;    memset(pAllocations, 0, <span class="keyword">sizeof</span>(<a class="code" href="struct_vma_allocation.html">VmaAllocation</a>) * allocationCount);</div>
 <div class="line"><a name="l16821"></a><span class="lineno">16821</span>&#160; </div>
-<div class="line"><a name="l16822"></a><span class="lineno">16822</span>&#160;<span class="keywordtype">void</span> VmaAllocator_T::SetCurrentFrameIndex(uint32_t frameIndex)</div>
-<div class="line"><a name="l16823"></a><span class="lineno">16823</span>&#160;{</div>
-<div class="line"><a name="l16824"></a><span class="lineno">16824</span>&#160;    m_CurrentFrameIndex.store(frameIndex);</div>
-<div class="line"><a name="l16825"></a><span class="lineno">16825</span>&#160; </div>
-<div class="line"><a name="l16826"></a><span class="lineno">16826</span>&#160;<span class="preprocessor">#if VMA_MEMORY_BUDGET</span></div>
-<div class="line"><a name="l16827"></a><span class="lineno">16827</span>&#160;    <span class="keywordflow">if</span>(m_UseExtMemoryBudget)</div>
-<div class="line"><a name="l16828"></a><span class="lineno">16828</span>&#160;    {</div>
-<div class="line"><a name="l16829"></a><span class="lineno">16829</span>&#160;        UpdateVulkanBudget();</div>
-<div class="line"><a name="l16830"></a><span class="lineno">16830</span>&#160;    }</div>
-<div class="line"><a name="l16831"></a><span class="lineno">16831</span>&#160;<span class="preprocessor">#endif // #if VMA_MEMORY_BUDGET</span></div>
-<div class="line"><a name="l16832"></a><span class="lineno">16832</span>&#160;}</div>
-<div class="line"><a name="l16833"></a><span class="lineno">16833</span>&#160; </div>
-<div class="line"><a name="l16834"></a><span class="lineno">16834</span>&#160;<span class="keywordtype">void</span> VmaAllocator_T::MakePoolAllocationsLost(</div>
-<div class="line"><a name="l16835"></a><span class="lineno">16835</span>&#160;    <a class="code" href="struct_vma_pool.html">VmaPool</a> hPool,</div>
-<div class="line"><a name="l16836"></a><span class="lineno">16836</span>&#160;    <span class="keywordtype">size_t</span>* pLostAllocationCount)</div>
-<div class="line"><a name="l16837"></a><span class="lineno">16837</span>&#160;{</div>
-<div class="line"><a name="l16838"></a><span class="lineno">16838</span>&#160;    hPool-&gt;m_BlockVector.MakePoolAllocationsLost(</div>
-<div class="line"><a name="l16839"></a><span class="lineno">16839</span>&#160;        m_CurrentFrameIndex.load(),</div>
-<div class="line"><a name="l16840"></a><span class="lineno">16840</span>&#160;        pLostAllocationCount);</div>
-<div class="line"><a name="l16841"></a><span class="lineno">16841</span>&#160;}</div>
-<div class="line"><a name="l16842"></a><span class="lineno">16842</span>&#160; </div>
-<div class="line"><a name="l16843"></a><span class="lineno">16843</span>&#160;VkResult VmaAllocator_T::CheckPoolCorruption(<a class="code" href="struct_vma_pool.html">VmaPool</a> hPool)</div>
-<div class="line"><a name="l16844"></a><span class="lineno">16844</span>&#160;{</div>
-<div class="line"><a name="l16845"></a><span class="lineno">16845</span>&#160;    <span class="keywordflow">return</span> hPool-&gt;m_BlockVector.CheckCorruption();</div>
-<div class="line"><a name="l16846"></a><span class="lineno">16846</span>&#160;}</div>
-<div class="line"><a name="l16847"></a><span class="lineno">16847</span>&#160; </div>
-<div class="line"><a name="l16848"></a><span class="lineno">16848</span>&#160;VkResult VmaAllocator_T::CheckCorruption(uint32_t memoryTypeBits)</div>
-<div class="line"><a name="l16849"></a><span class="lineno">16849</span>&#160;{</div>
-<div class="line"><a name="l16850"></a><span class="lineno">16850</span>&#160;    VkResult finalRes = VK_ERROR_FEATURE_NOT_PRESENT;</div>
-<div class="line"><a name="l16851"></a><span class="lineno">16851</span>&#160; </div>
-<div class="line"><a name="l16852"></a><span class="lineno">16852</span>&#160;    <span class="comment">// Process default pools.</span></div>
-<div class="line"><a name="l16853"></a><span class="lineno">16853</span>&#160;    <span class="keywordflow">for</span>(uint32_t memTypeIndex = 0; memTypeIndex &lt; GetMemoryTypeCount(); ++memTypeIndex)</div>
-<div class="line"><a name="l16854"></a><span class="lineno">16854</span>&#160;    {</div>
-<div class="line"><a name="l16855"></a><span class="lineno">16855</span>&#160;        <span class="keywordflow">if</span>(((1u &lt;&lt; memTypeIndex) &amp; memoryTypeBits) != 0)</div>
-<div class="line"><a name="l16856"></a><span class="lineno">16856</span>&#160;        {</div>
-<div class="line"><a name="l16857"></a><span class="lineno">16857</span>&#160;            VmaBlockVector* <span class="keyword">const</span> pBlockVector = m_pBlockVectors[memTypeIndex];</div>
-<div class="line"><a name="l16858"></a><span class="lineno">16858</span>&#160;            VMA_ASSERT(pBlockVector);</div>
-<div class="line"><a name="l16859"></a><span class="lineno">16859</span>&#160;            VkResult localRes = pBlockVector-&gt;CheckCorruption();</div>
-<div class="line"><a name="l16860"></a><span class="lineno">16860</span>&#160;            <span class="keywordflow">switch</span>(localRes)</div>
-<div class="line"><a name="l16861"></a><span class="lineno">16861</span>&#160;            {</div>
-<div class="line"><a name="l16862"></a><span class="lineno">16862</span>&#160;            <span class="keywordflow">case</span> VK_ERROR_FEATURE_NOT_PRESENT:</div>
-<div class="line"><a name="l16863"></a><span class="lineno">16863</span>&#160;                <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l16864"></a><span class="lineno">16864</span>&#160;            <span class="keywordflow">case</span> VK_SUCCESS:</div>
-<div class="line"><a name="l16865"></a><span class="lineno">16865</span>&#160;                finalRes = VK_SUCCESS;</div>
-<div class="line"><a name="l16866"></a><span class="lineno">16866</span>&#160;                <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l16867"></a><span class="lineno">16867</span>&#160;            <span class="keywordflow">default</span>:</div>
-<div class="line"><a name="l16868"></a><span class="lineno">16868</span>&#160;                <span class="keywordflow">return</span> localRes;</div>
-<div class="line"><a name="l16869"></a><span class="lineno">16869</span>&#160;            }</div>
-<div class="line"><a name="l16870"></a><span class="lineno">16870</span>&#160;        }</div>
-<div class="line"><a name="l16871"></a><span class="lineno">16871</span>&#160;    }</div>
-<div class="line"><a name="l16872"></a><span class="lineno">16872</span>&#160; </div>
-<div class="line"><a name="l16873"></a><span class="lineno">16873</span>&#160;    <span class="comment">// Process custom pools.</span></div>
-<div class="line"><a name="l16874"></a><span class="lineno">16874</span>&#160;    {</div>
-<div class="line"><a name="l16875"></a><span class="lineno">16875</span>&#160;        VmaMutexLockRead lock(m_PoolsMutex, m_UseMutex);</div>
-<div class="line"><a name="l16876"></a><span class="lineno">16876</span>&#160;        <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> poolIndex = 0, poolCount = m_Pools.size(); poolIndex &lt; poolCount; ++poolIndex)</div>
-<div class="line"><a name="l16877"></a><span class="lineno">16877</span>&#160;        {</div>
-<div class="line"><a name="l16878"></a><span class="lineno">16878</span>&#160;            <span class="keywordflow">if</span>(((1u &lt;&lt; m_Pools[poolIndex]-&gt;m_BlockVector.GetMemoryTypeIndex()) &amp; memoryTypeBits) != 0)</div>
-<div class="line"><a name="l16879"></a><span class="lineno">16879</span>&#160;            {</div>
-<div class="line"><a name="l16880"></a><span class="lineno">16880</span>&#160;                VkResult localRes = m_Pools[poolIndex]-&gt;m_BlockVector.CheckCorruption();</div>
-<div class="line"><a name="l16881"></a><span class="lineno">16881</span>&#160;                <span class="keywordflow">switch</span>(localRes)</div>
-<div class="line"><a name="l16882"></a><span class="lineno">16882</span>&#160;                {</div>
-<div class="line"><a name="l16883"></a><span class="lineno">16883</span>&#160;                <span class="keywordflow">case</span> VK_ERROR_FEATURE_NOT_PRESENT:</div>
-<div class="line"><a name="l16884"></a><span class="lineno">16884</span>&#160;                    <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l16885"></a><span class="lineno">16885</span>&#160;                <span class="keywordflow">case</span> VK_SUCCESS:</div>
-<div class="line"><a name="l16886"></a><span class="lineno">16886</span>&#160;                    finalRes = VK_SUCCESS;</div>
-<div class="line"><a name="l16887"></a><span class="lineno">16887</span>&#160;                    <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l16888"></a><span class="lineno">16888</span>&#160;                <span class="keywordflow">default</span>:</div>
-<div class="line"><a name="l16889"></a><span class="lineno">16889</span>&#160;                    <span class="keywordflow">return</span> localRes;</div>
-<div class="line"><a name="l16890"></a><span class="lineno">16890</span>&#160;                }</div>
-<div class="line"><a name="l16891"></a><span class="lineno">16891</span>&#160;            }</div>
-<div class="line"><a name="l16892"></a><span class="lineno">16892</span>&#160;        }</div>
-<div class="line"><a name="l16893"></a><span class="lineno">16893</span>&#160;    }</div>
+<div class="line"><a name="l16822"></a><span class="lineno">16822</span>&#160;    VMA_ASSERT(VmaIsPow2(vkMemReq.alignment));</div>
+<div class="line"><a name="l16823"></a><span class="lineno">16823</span>&#160; </div>
+<div class="line"><a name="l16824"></a><span class="lineno">16824</span>&#160;    <span class="keywordflow">if</span>(vkMemReq.size == 0)</div>
+<div class="line"><a name="l16825"></a><span class="lineno">16825</span>&#160;    {</div>
+<div class="line"><a name="l16826"></a><span class="lineno">16826</span>&#160;        <span class="keywordflow">return</span> VK_ERROR_VALIDATION_FAILED_EXT;</div>
+<div class="line"><a name="l16827"></a><span class="lineno">16827</span>&#160;    }</div>
+<div class="line"><a name="l16828"></a><span class="lineno">16828</span>&#160;    <span class="keywordflow">if</span>((createInfo.<a class="code" href="struct_vma_allocation_create_info.html#add09658ac14fe290ace25470ddd6d41b">flags</a> &amp; <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a3fc311d855c2ff53f1090ef5c722b38f">VMA_ALLOCATION_CREATE_DEDICATED_MEMORY_BIT</a>) != 0 &amp;&amp;</div>
+<div class="line"><a name="l16829"></a><span class="lineno">16829</span>&#160;        (createInfo.<a class="code" href="struct_vma_allocation_create_info.html#add09658ac14fe290ace25470ddd6d41b">flags</a> &amp; <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a89759603401014eb325eb22a3839f2ff">VMA_ALLOCATION_CREATE_NEVER_ALLOCATE_BIT</a>) != 0)</div>
+<div class="line"><a name="l16830"></a><span class="lineno">16830</span>&#160;    {</div>
+<div class="line"><a name="l16831"></a><span class="lineno">16831</span>&#160;        VMA_ASSERT(0 &amp;&amp; <span class="stringliteral">&quot;Specifying VMA_ALLOCATION_CREATE_DEDICATED_MEMORY_BIT together with VMA_ALLOCATION_CREATE_NEVER_ALLOCATE_BIT makes no sense.&quot;</span>);</div>
+<div class="line"><a name="l16832"></a><span class="lineno">16832</span>&#160;        <span class="keywordflow">return</span> VK_ERROR_OUT_OF_DEVICE_MEMORY;</div>
+<div class="line"><a name="l16833"></a><span class="lineno">16833</span>&#160;    }</div>
+<div class="line"><a name="l16834"></a><span class="lineno">16834</span>&#160;    <span class="keywordflow">if</span>((createInfo.<a class="code" href="struct_vma_allocation_create_info.html#add09658ac14fe290ace25470ddd6d41b">flags</a> &amp; <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a11da372cc3a82931c5e5d6146cd9dd1f">VMA_ALLOCATION_CREATE_MAPPED_BIT</a>) != 0 &amp;&amp;</div>
+<div class="line"><a name="l16835"></a><span class="lineno">16835</span>&#160;        (createInfo.<a class="code" href="struct_vma_allocation_create_info.html#add09658ac14fe290ace25470ddd6d41b">flags</a> &amp; <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a5f436af6c8fe8540573a6d22627a6fd2">VMA_ALLOCATION_CREATE_CAN_BECOME_LOST_BIT</a>) != 0)</div>
+<div class="line"><a name="l16836"></a><span class="lineno">16836</span>&#160;    {</div>
+<div class="line"><a name="l16837"></a><span class="lineno">16837</span>&#160;        VMA_ASSERT(0 &amp;&amp; <span class="stringliteral">&quot;Specifying VMA_ALLOCATION_CREATE_MAPPED_BIT together with VMA_ALLOCATION_CREATE_CAN_BECOME_LOST_BIT is invalid.&quot;</span>);</div>
+<div class="line"><a name="l16838"></a><span class="lineno">16838</span>&#160;        <span class="keywordflow">return</span> VK_ERROR_OUT_OF_DEVICE_MEMORY;</div>
+<div class="line"><a name="l16839"></a><span class="lineno">16839</span>&#160;    }</div>
+<div class="line"><a name="l16840"></a><span class="lineno">16840</span>&#160;    <span class="keywordflow">if</span>(requiresDedicatedAllocation)</div>
+<div class="line"><a name="l16841"></a><span class="lineno">16841</span>&#160;    {</div>
+<div class="line"><a name="l16842"></a><span class="lineno">16842</span>&#160;        <span class="keywordflow">if</span>((createInfo.<a class="code" href="struct_vma_allocation_create_info.html#add09658ac14fe290ace25470ddd6d41b">flags</a> &amp; <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a89759603401014eb325eb22a3839f2ff">VMA_ALLOCATION_CREATE_NEVER_ALLOCATE_BIT</a>) != 0)</div>
+<div class="line"><a name="l16843"></a><span class="lineno">16843</span>&#160;        {</div>
+<div class="line"><a name="l16844"></a><span class="lineno">16844</span>&#160;            VMA_ASSERT(0 &amp;&amp; <span class="stringliteral">&quot;VMA_ALLOCATION_CREATE_NEVER_ALLOCATE_BIT specified while dedicated allocation is required.&quot;</span>);</div>
+<div class="line"><a name="l16845"></a><span class="lineno">16845</span>&#160;            <span class="keywordflow">return</span> VK_ERROR_OUT_OF_DEVICE_MEMORY;</div>
+<div class="line"><a name="l16846"></a><span class="lineno">16846</span>&#160;        }</div>
+<div class="line"><a name="l16847"></a><span class="lineno">16847</span>&#160;        <span class="keywordflow">if</span>(createInfo.<a class="code" href="struct_vma_allocation_create_info.html#a6272c0555cfd1fe28bff1afeb6190150">pool</a> != VK_NULL_HANDLE)</div>
+<div class="line"><a name="l16848"></a><span class="lineno">16848</span>&#160;        {</div>
+<div class="line"><a name="l16849"></a><span class="lineno">16849</span>&#160;            VMA_ASSERT(0 &amp;&amp; <span class="stringliteral">&quot;Pool specified while dedicated allocation is required.&quot;</span>);</div>
+<div class="line"><a name="l16850"></a><span class="lineno">16850</span>&#160;            <span class="keywordflow">return</span> VK_ERROR_OUT_OF_DEVICE_MEMORY;</div>
+<div class="line"><a name="l16851"></a><span class="lineno">16851</span>&#160;        }</div>
+<div class="line"><a name="l16852"></a><span class="lineno">16852</span>&#160;    }</div>
+<div class="line"><a name="l16853"></a><span class="lineno">16853</span>&#160;    <span class="keywordflow">if</span>((createInfo.<a class="code" href="struct_vma_allocation_create_info.html#a6272c0555cfd1fe28bff1afeb6190150">pool</a> != VK_NULL_HANDLE) &amp;&amp;</div>
+<div class="line"><a name="l16854"></a><span class="lineno">16854</span>&#160;        ((createInfo.<a class="code" href="struct_vma_allocation_create_info.html#add09658ac14fe290ace25470ddd6d41b">flags</a> &amp; (<a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a3fc311d855c2ff53f1090ef5c722b38f">VMA_ALLOCATION_CREATE_DEDICATED_MEMORY_BIT</a>)) != 0))</div>
+<div class="line"><a name="l16855"></a><span class="lineno">16855</span>&#160;    {</div>
+<div class="line"><a name="l16856"></a><span class="lineno">16856</span>&#160;        VMA_ASSERT(0 &amp;&amp; <span class="stringliteral">&quot;Specifying VMA_ALLOCATION_CREATE_DEDICATED_MEMORY_BIT when pool != null is invalid.&quot;</span>);</div>
+<div class="line"><a name="l16857"></a><span class="lineno">16857</span>&#160;        <span class="keywordflow">return</span> VK_ERROR_OUT_OF_DEVICE_MEMORY;</div>
+<div class="line"><a name="l16858"></a><span class="lineno">16858</span>&#160;    }</div>
+<div class="line"><a name="l16859"></a><span class="lineno">16859</span>&#160; </div>
+<div class="line"><a name="l16860"></a><span class="lineno">16860</span>&#160;    <span class="keywordflow">if</span>(createInfo.<a class="code" href="struct_vma_allocation_create_info.html#a6272c0555cfd1fe28bff1afeb6190150">pool</a> != VK_NULL_HANDLE)</div>
+<div class="line"><a name="l16861"></a><span class="lineno">16861</span>&#160;    {</div>
+<div class="line"><a name="l16862"></a><span class="lineno">16862</span>&#160;        <span class="keyword">const</span> VkDeviceSize alignmentForPool = VMA_MAX(</div>
+<div class="line"><a name="l16863"></a><span class="lineno">16863</span>&#160;            vkMemReq.alignment,</div>
+<div class="line"><a name="l16864"></a><span class="lineno">16864</span>&#160;            GetMemoryTypeMinAlignment(createInfo.<a class="code" href="struct_vma_allocation_create_info.html#a6272c0555cfd1fe28bff1afeb6190150">pool</a>-&gt;m_BlockVector.GetMemoryTypeIndex()));</div>
+<div class="line"><a name="l16865"></a><span class="lineno">16865</span>&#160; </div>
+<div class="line"><a name="l16866"></a><span class="lineno">16866</span>&#160;        <a class="code" href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a> createInfoForPool = createInfo;</div>
+<div class="line"><a name="l16867"></a><span class="lineno">16867</span>&#160;        <span class="comment">// If memory type is not HOST_VISIBLE, disable MAPPED.</span></div>
+<div class="line"><a name="l16868"></a><span class="lineno">16868</span>&#160;        <span class="keywordflow">if</span>((createInfoForPool.<a class="code" href="struct_vma_allocation_create_info.html#add09658ac14fe290ace25470ddd6d41b">flags</a> &amp; <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a11da372cc3a82931c5e5d6146cd9dd1f">VMA_ALLOCATION_CREATE_MAPPED_BIT</a>) != 0 &amp;&amp;</div>
+<div class="line"><a name="l16869"></a><span class="lineno">16869</span>&#160;            (m_MemProps.memoryTypes[createInfo.<a class="code" href="struct_vma_allocation_create_info.html#a6272c0555cfd1fe28bff1afeb6190150">pool</a>-&gt;m_BlockVector.GetMemoryTypeIndex()].propertyFlags &amp; VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT) == 0)</div>
+<div class="line"><a name="l16870"></a><span class="lineno">16870</span>&#160;        {</div>
+<div class="line"><a name="l16871"></a><span class="lineno">16871</span>&#160;            createInfoForPool.<a class="code" href="struct_vma_allocation_create_info.html#add09658ac14fe290ace25470ddd6d41b">flags</a> &amp;= ~<a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a11da372cc3a82931c5e5d6146cd9dd1f">VMA_ALLOCATION_CREATE_MAPPED_BIT</a>;</div>
+<div class="line"><a name="l16872"></a><span class="lineno">16872</span>&#160;        }</div>
+<div class="line"><a name="l16873"></a><span class="lineno">16873</span>&#160; </div>
+<div class="line"><a name="l16874"></a><span class="lineno">16874</span>&#160;        <span class="keywordflow">return</span> createInfo.<a class="code" href="struct_vma_allocation_create_info.html#a6272c0555cfd1fe28bff1afeb6190150">pool</a>-&gt;m_BlockVector.Allocate(</div>
+<div class="line"><a name="l16875"></a><span class="lineno">16875</span>&#160;            m_CurrentFrameIndex.load(),</div>
+<div class="line"><a name="l16876"></a><span class="lineno">16876</span>&#160;            vkMemReq.size,</div>
+<div class="line"><a name="l16877"></a><span class="lineno">16877</span>&#160;            alignmentForPool,</div>
+<div class="line"><a name="l16878"></a><span class="lineno">16878</span>&#160;            createInfoForPool,</div>
+<div class="line"><a name="l16879"></a><span class="lineno">16879</span>&#160;            suballocType,</div>
+<div class="line"><a name="l16880"></a><span class="lineno">16880</span>&#160;            allocationCount,</div>
+<div class="line"><a name="l16881"></a><span class="lineno">16881</span>&#160;            pAllocations);</div>
+<div class="line"><a name="l16882"></a><span class="lineno">16882</span>&#160;    }</div>
+<div class="line"><a name="l16883"></a><span class="lineno">16883</span>&#160;    <span class="keywordflow">else</span></div>
+<div class="line"><a name="l16884"></a><span class="lineno">16884</span>&#160;    {</div>
+<div class="line"><a name="l16885"></a><span class="lineno">16885</span>&#160;        <span class="comment">// Bit mask of memory Vulkan types acceptable for this allocation.</span></div>
+<div class="line"><a name="l16886"></a><span class="lineno">16886</span>&#160;        uint32_t memoryTypeBits = vkMemReq.memoryTypeBits;</div>
+<div class="line"><a name="l16887"></a><span class="lineno">16887</span>&#160;        uint32_t memTypeIndex = UINT32_MAX;</div>
+<div class="line"><a name="l16888"></a><span class="lineno">16888</span>&#160;        VkResult res = <a class="code" href="vk__mem__alloc_8h.html#aef15a94b58fbcb0fe706d5720e84a74a">vmaFindMemoryTypeIndex</a>(<span class="keyword">this</span>, memoryTypeBits, &amp;createInfo, &amp;memTypeIndex);</div>
+<div class="line"><a name="l16889"></a><span class="lineno">16889</span>&#160;        <span class="keywordflow">if</span>(res == VK_SUCCESS)</div>
+<div class="line"><a name="l16890"></a><span class="lineno">16890</span>&#160;        {</div>
+<div class="line"><a name="l16891"></a><span class="lineno">16891</span>&#160;            VkDeviceSize alignmentForMemType = VMA_MAX(</div>
+<div class="line"><a name="l16892"></a><span class="lineno">16892</span>&#160;                vkMemReq.alignment,</div>
+<div class="line"><a name="l16893"></a><span class="lineno">16893</span>&#160;                GetMemoryTypeMinAlignment(memTypeIndex));</div>
 <div class="line"><a name="l16894"></a><span class="lineno">16894</span>&#160; </div>
-<div class="line"><a name="l16895"></a><span class="lineno">16895</span>&#160;    <span class="keywordflow">return</span> finalRes;</div>
-<div class="line"><a name="l16896"></a><span class="lineno">16896</span>&#160;}</div>
-<div class="line"><a name="l16897"></a><span class="lineno">16897</span>&#160; </div>
-<div class="line"><a name="l16898"></a><span class="lineno">16898</span>&#160;<span class="keywordtype">void</span> VmaAllocator_T::CreateLostAllocation(<a class="code" href="struct_vma_allocation.html">VmaAllocation</a>* pAllocation)</div>
-<div class="line"><a name="l16899"></a><span class="lineno">16899</span>&#160;{</div>
-<div class="line"><a name="l16900"></a><span class="lineno">16900</span>&#160;    *pAllocation = m_AllocationObjectAllocator.Allocate(VMA_FRAME_INDEX_LOST, <span class="keyword">false</span>);</div>
-<div class="line"><a name="l16901"></a><span class="lineno">16901</span>&#160;    (*pAllocation)-&gt;InitLost();</div>
-<div class="line"><a name="l16902"></a><span class="lineno">16902</span>&#160;}</div>
-<div class="line"><a name="l16903"></a><span class="lineno">16903</span>&#160; </div>
-<div class="line"><a name="l16904"></a><span class="lineno">16904</span>&#160;VkResult VmaAllocator_T::AllocateVulkanMemory(<span class="keyword">const</span> VkMemoryAllocateInfo* pAllocateInfo, VkDeviceMemory* pMemory)</div>
-<div class="line"><a name="l16905"></a><span class="lineno">16905</span>&#160;{</div>
-<div class="line"><a name="l16906"></a><span class="lineno">16906</span>&#160;    <span class="keyword">const</span> uint32_t heapIndex = MemoryTypeIndexToHeapIndex(pAllocateInfo-&gt;memoryTypeIndex);</div>
-<div class="line"><a name="l16907"></a><span class="lineno">16907</span>&#160; </div>
-<div class="line"><a name="l16908"></a><span class="lineno">16908</span>&#160;    <span class="comment">// HeapSizeLimit is in effect for this heap.</span></div>
-<div class="line"><a name="l16909"></a><span class="lineno">16909</span>&#160;    <span class="keywordflow">if</span>((m_HeapSizeLimitMask &amp; (1u &lt;&lt; heapIndex)) != 0)</div>
-<div class="line"><a name="l16910"></a><span class="lineno">16910</span>&#160;    {</div>
-<div class="line"><a name="l16911"></a><span class="lineno">16911</span>&#160;        <span class="keyword">const</span> VkDeviceSize heapSize = m_MemProps.memoryHeaps[heapIndex].size;</div>
-<div class="line"><a name="l16912"></a><span class="lineno">16912</span>&#160;        VkDeviceSize blockBytes = m_Budget.m_BlockBytes[heapIndex];</div>
-<div class="line"><a name="l16913"></a><span class="lineno">16913</span>&#160;        <span class="keywordflow">for</span>(;;)</div>
-<div class="line"><a name="l16914"></a><span class="lineno">16914</span>&#160;        {</div>
-<div class="line"><a name="l16915"></a><span class="lineno">16915</span>&#160;            <span class="keyword">const</span> VkDeviceSize blockBytesAfterAllocation = blockBytes + pAllocateInfo-&gt;allocationSize;</div>
-<div class="line"><a name="l16916"></a><span class="lineno">16916</span>&#160;            <span class="keywordflow">if</span>(blockBytesAfterAllocation &gt; heapSize)</div>
-<div class="line"><a name="l16917"></a><span class="lineno">16917</span>&#160;            {</div>
-<div class="line"><a name="l16918"></a><span class="lineno">16918</span>&#160;                <span class="keywordflow">return</span> VK_ERROR_OUT_OF_DEVICE_MEMORY;</div>
-<div class="line"><a name="l16919"></a><span class="lineno">16919</span>&#160;            }</div>
-<div class="line"><a name="l16920"></a><span class="lineno">16920</span>&#160;            <span class="keywordflow">if</span>(m_Budget.m_BlockBytes[heapIndex].compare_exchange_strong(blockBytes, blockBytesAfterAllocation))</div>
-<div class="line"><a name="l16921"></a><span class="lineno">16921</span>&#160;            {</div>
-<div class="line"><a name="l16922"></a><span class="lineno">16922</span>&#160;                <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l16923"></a><span class="lineno">16923</span>&#160;            }</div>
-<div class="line"><a name="l16924"></a><span class="lineno">16924</span>&#160;        }</div>
-<div class="line"><a name="l16925"></a><span class="lineno">16925</span>&#160;    }</div>
-<div class="line"><a name="l16926"></a><span class="lineno">16926</span>&#160;    <span class="keywordflow">else</span></div>
-<div class="line"><a name="l16927"></a><span class="lineno">16927</span>&#160;    {</div>
-<div class="line"><a name="l16928"></a><span class="lineno">16928</span>&#160;        m_Budget.m_BlockBytes[heapIndex] += pAllocateInfo-&gt;allocationSize;</div>
-<div class="line"><a name="l16929"></a><span class="lineno">16929</span>&#160;    }</div>
-<div class="line"><a name="l16930"></a><span class="lineno">16930</span>&#160; </div>
-<div class="line"><a name="l16931"></a><span class="lineno">16931</span>&#160;    <span class="comment">// VULKAN CALL vkAllocateMemory.</span></div>
-<div class="line"><a name="l16932"></a><span class="lineno">16932</span>&#160;    VkResult res = (*m_VulkanFunctions.vkAllocateMemory)(m_hDevice, pAllocateInfo, GetAllocationCallbacks(), pMemory);</div>
-<div class="line"><a name="l16933"></a><span class="lineno">16933</span>&#160; </div>
-<div class="line"><a name="l16934"></a><span class="lineno">16934</span>&#160;    <span class="keywordflow">if</span>(res == VK_SUCCESS)</div>
-<div class="line"><a name="l16935"></a><span class="lineno">16935</span>&#160;    {</div>
-<div class="line"><a name="l16936"></a><span class="lineno">16936</span>&#160;<span class="preprocessor">#if VMA_MEMORY_BUDGET</span></div>
-<div class="line"><a name="l16937"></a><span class="lineno">16937</span>&#160;        ++m_Budget.m_OperationsSinceBudgetFetch;</div>
-<div class="line"><a name="l16938"></a><span class="lineno">16938</span>&#160;<span class="preprocessor">#endif</span></div>
-<div class="line"><a name="l16939"></a><span class="lineno">16939</span>&#160; </div>
-<div class="line"><a name="l16940"></a><span class="lineno">16940</span>&#160;        <span class="comment">// Informative callback.</span></div>
-<div class="line"><a name="l16941"></a><span class="lineno">16941</span>&#160;        <span class="keywordflow">if</span>(m_DeviceMemoryCallbacks.<a class="code" href="struct_vma_device_memory_callbacks.html#a4f17f7b255101e733b44d5633aceabfb">pfnAllocate</a> != VMA_NULL)</div>
-<div class="line"><a name="l16942"></a><span class="lineno">16942</span>&#160;        {</div>
-<div class="line"><a name="l16943"></a><span class="lineno">16943</span>&#160;            (*m_DeviceMemoryCallbacks.<a class="code" href="struct_vma_device_memory_callbacks.html#a4f17f7b255101e733b44d5633aceabfb">pfnAllocate</a>)(<span class="keyword">this</span>, pAllocateInfo-&gt;memoryTypeIndex, *pMemory, pAllocateInfo-&gt;allocationSize, m_DeviceMemoryCallbacks.<a class="code" href="struct_vma_device_memory_callbacks.html#a24052de0937ddd54015a2df0363903c6">pUserData</a>);</div>
-<div class="line"><a name="l16944"></a><span class="lineno">16944</span>&#160;        }</div>
-<div class="line"><a name="l16945"></a><span class="lineno">16945</span>&#160;    }</div>
-<div class="line"><a name="l16946"></a><span class="lineno">16946</span>&#160;    <span class="keywordflow">else</span></div>
-<div class="line"><a name="l16947"></a><span class="lineno">16947</span>&#160;    {</div>
-<div class="line"><a name="l16948"></a><span class="lineno">16948</span>&#160;        m_Budget.m_BlockBytes[heapIndex] -= pAllocateInfo-&gt;allocationSize;</div>
-<div class="line"><a name="l16949"></a><span class="lineno">16949</span>&#160;    }</div>
-<div class="line"><a name="l16950"></a><span class="lineno">16950</span>&#160; </div>
-<div class="line"><a name="l16951"></a><span class="lineno">16951</span>&#160;    <span class="keywordflow">return</span> res;</div>
-<div class="line"><a name="l16952"></a><span class="lineno">16952</span>&#160;}</div>
-<div class="line"><a name="l16953"></a><span class="lineno">16953</span>&#160; </div>
-<div class="line"><a name="l16954"></a><span class="lineno">16954</span>&#160;<span class="keywordtype">void</span> VmaAllocator_T::FreeVulkanMemory(uint32_t memoryType, VkDeviceSize size, VkDeviceMemory hMemory)</div>
-<div class="line"><a name="l16955"></a><span class="lineno">16955</span>&#160;{</div>
-<div class="line"><a name="l16956"></a><span class="lineno">16956</span>&#160;    <span class="comment">// Informative callback.</span></div>
-<div class="line"><a name="l16957"></a><span class="lineno">16957</span>&#160;    <span class="keywordflow">if</span>(m_DeviceMemoryCallbacks.<a class="code" href="struct_vma_device_memory_callbacks.html#abe8a3328bbc916f6f712fdb6b299444c">pfnFree</a> != VMA_NULL)</div>
-<div class="line"><a name="l16958"></a><span class="lineno">16958</span>&#160;    {</div>
-<div class="line"><a name="l16959"></a><span class="lineno">16959</span>&#160;        (*m_DeviceMemoryCallbacks.<a class="code" href="struct_vma_device_memory_callbacks.html#abe8a3328bbc916f6f712fdb6b299444c">pfnFree</a>)(<span class="keyword">this</span>, memoryType, hMemory, size, m_DeviceMemoryCallbacks.<a class="code" href="struct_vma_device_memory_callbacks.html#a24052de0937ddd54015a2df0363903c6">pUserData</a>);</div>
-<div class="line"><a name="l16960"></a><span class="lineno">16960</span>&#160;    }</div>
-<div class="line"><a name="l16961"></a><span class="lineno">16961</span>&#160; </div>
-<div class="line"><a name="l16962"></a><span class="lineno">16962</span>&#160;    <span class="comment">// VULKAN CALL vkFreeMemory.</span></div>
-<div class="line"><a name="l16963"></a><span class="lineno">16963</span>&#160;    (*m_VulkanFunctions.vkFreeMemory)(m_hDevice, hMemory, GetAllocationCallbacks());</div>
-<div class="line"><a name="l16964"></a><span class="lineno">16964</span>&#160; </div>
-<div class="line"><a name="l16965"></a><span class="lineno">16965</span>&#160;    m_Budget.m_BlockBytes[MemoryTypeIndexToHeapIndex(memoryType)] -= size;</div>
-<div class="line"><a name="l16966"></a><span class="lineno">16966</span>&#160;}</div>
-<div class="line"><a name="l16967"></a><span class="lineno">16967</span>&#160; </div>
-<div class="line"><a name="l16968"></a><span class="lineno">16968</span>&#160;VkResult VmaAllocator_T::BindVulkanBuffer(</div>
-<div class="line"><a name="l16969"></a><span class="lineno">16969</span>&#160;    VkDeviceMemory memory,</div>
-<div class="line"><a name="l16970"></a><span class="lineno">16970</span>&#160;    VkDeviceSize memoryOffset,</div>
-<div class="line"><a name="l16971"></a><span class="lineno">16971</span>&#160;    VkBuffer buffer,</div>
-<div class="line"><a name="l16972"></a><span class="lineno">16972</span>&#160;    <span class="keyword">const</span> <span class="keywordtype">void</span>* pNext)</div>
-<div class="line"><a name="l16973"></a><span class="lineno">16973</span>&#160;{</div>
-<div class="line"><a name="l16974"></a><span class="lineno">16974</span>&#160;    <span class="keywordflow">if</span>(pNext != VMA_NULL)</div>
-<div class="line"><a name="l16975"></a><span class="lineno">16975</span>&#160;    {</div>
-<div class="line"><a name="l16976"></a><span class="lineno">16976</span>&#160;<span class="preprocessor">#if VMA_VULKAN_VERSION &gt;= 1001000 || VMA_BIND_MEMORY2</span></div>
-<div class="line"><a name="l16977"></a><span class="lineno">16977</span>&#160;        <span class="keywordflow">if</span>((m_UseKhrBindMemory2 || m_VulkanApiVersion &gt;= VK_MAKE_VERSION(1, 1, 0)) &amp;&amp;</div>
-<div class="line"><a name="l16978"></a><span class="lineno">16978</span>&#160;            m_VulkanFunctions.vkBindBufferMemory2KHR != VMA_NULL)</div>
-<div class="line"><a name="l16979"></a><span class="lineno">16979</span>&#160;        {</div>
-<div class="line"><a name="l16980"></a><span class="lineno">16980</span>&#160;            VkBindBufferMemoryInfoKHR bindBufferMemoryInfo = { VK_STRUCTURE_TYPE_BIND_BUFFER_MEMORY_INFO_KHR };</div>
-<div class="line"><a name="l16981"></a><span class="lineno">16981</span>&#160;            bindBufferMemoryInfo.pNext = pNext;</div>
-<div class="line"><a name="l16982"></a><span class="lineno">16982</span>&#160;            bindBufferMemoryInfo.buffer = buffer;</div>
-<div class="line"><a name="l16983"></a><span class="lineno">16983</span>&#160;            bindBufferMemoryInfo.memory = memory;</div>
-<div class="line"><a name="l16984"></a><span class="lineno">16984</span>&#160;            bindBufferMemoryInfo.memoryOffset = memoryOffset;</div>
-<div class="line"><a name="l16985"></a><span class="lineno">16985</span>&#160;            <span class="keywordflow">return</span> (*m_VulkanFunctions.vkBindBufferMemory2KHR)(m_hDevice, 1, &amp;bindBufferMemoryInfo);</div>
-<div class="line"><a name="l16986"></a><span class="lineno">16986</span>&#160;        }</div>
-<div class="line"><a name="l16987"></a><span class="lineno">16987</span>&#160;        <span class="keywordflow">else</span></div>
-<div class="line"><a name="l16988"></a><span class="lineno">16988</span>&#160;<span class="preprocessor">#endif // #if VMA_VULKAN_VERSION &gt;= 1001000 || VMA_BIND_MEMORY2</span></div>
-<div class="line"><a name="l16989"></a><span class="lineno">16989</span>&#160;        {</div>
-<div class="line"><a name="l16990"></a><span class="lineno">16990</span>&#160;            <span class="keywordflow">return</span> VK_ERROR_EXTENSION_NOT_PRESENT;</div>
-<div class="line"><a name="l16991"></a><span class="lineno">16991</span>&#160;        }</div>
-<div class="line"><a name="l16992"></a><span class="lineno">16992</span>&#160;    }</div>
-<div class="line"><a name="l16993"></a><span class="lineno">16993</span>&#160;    <span class="keywordflow">else</span></div>
-<div class="line"><a name="l16994"></a><span class="lineno">16994</span>&#160;    {</div>
-<div class="line"><a name="l16995"></a><span class="lineno">16995</span>&#160;        <span class="keywordflow">return</span> (*m_VulkanFunctions.vkBindBufferMemory)(m_hDevice, buffer, memory, memoryOffset);</div>
-<div class="line"><a name="l16996"></a><span class="lineno">16996</span>&#160;    }</div>
-<div class="line"><a name="l16997"></a><span class="lineno">16997</span>&#160;}</div>
-<div class="line"><a name="l16998"></a><span class="lineno">16998</span>&#160; </div>
-<div class="line"><a name="l16999"></a><span class="lineno">16999</span>&#160;VkResult VmaAllocator_T::BindVulkanImage(</div>
-<div class="line"><a name="l17000"></a><span class="lineno">17000</span>&#160;    VkDeviceMemory memory,</div>
-<div class="line"><a name="l17001"></a><span class="lineno">17001</span>&#160;    VkDeviceSize memoryOffset,</div>
-<div class="line"><a name="l17002"></a><span class="lineno">17002</span>&#160;    VkImage image,</div>
-<div class="line"><a name="l17003"></a><span class="lineno">17003</span>&#160;    <span class="keyword">const</span> <span class="keywordtype">void</span>* pNext)</div>
-<div class="line"><a name="l17004"></a><span class="lineno">17004</span>&#160;{</div>
-<div class="line"><a name="l17005"></a><span class="lineno">17005</span>&#160;    <span class="keywordflow">if</span>(pNext != VMA_NULL)</div>
-<div class="line"><a name="l17006"></a><span class="lineno">17006</span>&#160;    {</div>
-<div class="line"><a name="l17007"></a><span class="lineno">17007</span>&#160;<span class="preprocessor">#if VMA_VULKAN_VERSION &gt;= 1001000 || VMA_BIND_MEMORY2</span></div>
-<div class="line"><a name="l17008"></a><span class="lineno">17008</span>&#160;        <span class="keywordflow">if</span>((m_UseKhrBindMemory2 || m_VulkanApiVersion &gt;= VK_MAKE_VERSION(1, 1, 0)) &amp;&amp;</div>
-<div class="line"><a name="l17009"></a><span class="lineno">17009</span>&#160;            m_VulkanFunctions.vkBindImageMemory2KHR != VMA_NULL)</div>
-<div class="line"><a name="l17010"></a><span class="lineno">17010</span>&#160;        {</div>
-<div class="line"><a name="l17011"></a><span class="lineno">17011</span>&#160;            VkBindImageMemoryInfoKHR bindBufferMemoryInfo = { VK_STRUCTURE_TYPE_BIND_IMAGE_MEMORY_INFO_KHR };</div>
-<div class="line"><a name="l17012"></a><span class="lineno">17012</span>&#160;            bindBufferMemoryInfo.pNext = pNext;</div>
-<div class="line"><a name="l17013"></a><span class="lineno">17013</span>&#160;            bindBufferMemoryInfo.image = image;</div>
-<div class="line"><a name="l17014"></a><span class="lineno">17014</span>&#160;            bindBufferMemoryInfo.memory = memory;</div>
-<div class="line"><a name="l17015"></a><span class="lineno">17015</span>&#160;            bindBufferMemoryInfo.memoryOffset = memoryOffset;</div>
-<div class="line"><a name="l17016"></a><span class="lineno">17016</span>&#160;            <span class="keywordflow">return</span> (*m_VulkanFunctions.vkBindImageMemory2KHR)(m_hDevice, 1, &amp;bindBufferMemoryInfo);</div>
-<div class="line"><a name="l17017"></a><span class="lineno">17017</span>&#160;        }</div>
-<div class="line"><a name="l17018"></a><span class="lineno">17018</span>&#160;        <span class="keywordflow">else</span></div>
-<div class="line"><a name="l17019"></a><span class="lineno">17019</span>&#160;<span class="preprocessor">#endif // #if VMA_BIND_MEMORY2</span></div>
-<div class="line"><a name="l17020"></a><span class="lineno">17020</span>&#160;        {</div>
-<div class="line"><a name="l17021"></a><span class="lineno">17021</span>&#160;            <span class="keywordflow">return</span> VK_ERROR_EXTENSION_NOT_PRESENT;</div>
-<div class="line"><a name="l17022"></a><span class="lineno">17022</span>&#160;        }</div>
-<div class="line"><a name="l17023"></a><span class="lineno">17023</span>&#160;    }</div>
-<div class="line"><a name="l17024"></a><span class="lineno">17024</span>&#160;    <span class="keywordflow">else</span></div>
+<div class="line"><a name="l16895"></a><span class="lineno">16895</span>&#160;            res = AllocateMemoryOfType(</div>
+<div class="line"><a name="l16896"></a><span class="lineno">16896</span>&#160;                vkMemReq.size,</div>
+<div class="line"><a name="l16897"></a><span class="lineno">16897</span>&#160;                alignmentForMemType,</div>
+<div class="line"><a name="l16898"></a><span class="lineno">16898</span>&#160;                requiresDedicatedAllocation || prefersDedicatedAllocation,</div>
+<div class="line"><a name="l16899"></a><span class="lineno">16899</span>&#160;                dedicatedBuffer,</div>
+<div class="line"><a name="l16900"></a><span class="lineno">16900</span>&#160;                dedicatedBufferUsage,</div>
+<div class="line"><a name="l16901"></a><span class="lineno">16901</span>&#160;                dedicatedImage,</div>
+<div class="line"><a name="l16902"></a><span class="lineno">16902</span>&#160;                createInfo,</div>
+<div class="line"><a name="l16903"></a><span class="lineno">16903</span>&#160;                memTypeIndex,</div>
+<div class="line"><a name="l16904"></a><span class="lineno">16904</span>&#160;                suballocType,</div>
+<div class="line"><a name="l16905"></a><span class="lineno">16905</span>&#160;                allocationCount,</div>
+<div class="line"><a name="l16906"></a><span class="lineno">16906</span>&#160;                pAllocations);</div>
+<div class="line"><a name="l16907"></a><span class="lineno">16907</span>&#160;            <span class="comment">// Succeeded on first try.</span></div>
+<div class="line"><a name="l16908"></a><span class="lineno">16908</span>&#160;            <span class="keywordflow">if</span>(res == VK_SUCCESS)</div>
+<div class="line"><a name="l16909"></a><span class="lineno">16909</span>&#160;            {</div>
+<div class="line"><a name="l16910"></a><span class="lineno">16910</span>&#160;                <span class="keywordflow">return</span> res;</div>
+<div class="line"><a name="l16911"></a><span class="lineno">16911</span>&#160;            }</div>
+<div class="line"><a name="l16912"></a><span class="lineno">16912</span>&#160;            <span class="comment">// Allocation from this memory type failed. Try other compatible memory types.</span></div>
+<div class="line"><a name="l16913"></a><span class="lineno">16913</span>&#160;            <span class="keywordflow">else</span></div>
+<div class="line"><a name="l16914"></a><span class="lineno">16914</span>&#160;            {</div>
+<div class="line"><a name="l16915"></a><span class="lineno">16915</span>&#160;                <span class="keywordflow">for</span>(;;)</div>
+<div class="line"><a name="l16916"></a><span class="lineno">16916</span>&#160;                {</div>
+<div class="line"><a name="l16917"></a><span class="lineno">16917</span>&#160;                    <span class="comment">// Remove old memTypeIndex from list of possibilities.</span></div>
+<div class="line"><a name="l16918"></a><span class="lineno">16918</span>&#160;                    memoryTypeBits &amp;= ~(1u &lt;&lt; memTypeIndex);</div>
+<div class="line"><a name="l16919"></a><span class="lineno">16919</span>&#160;                    <span class="comment">// Find alternative memTypeIndex.</span></div>
+<div class="line"><a name="l16920"></a><span class="lineno">16920</span>&#160;                    res = <a class="code" href="vk__mem__alloc_8h.html#aef15a94b58fbcb0fe706d5720e84a74a">vmaFindMemoryTypeIndex</a>(<span class="keyword">this</span>, memoryTypeBits, &amp;createInfo, &amp;memTypeIndex);</div>
+<div class="line"><a name="l16921"></a><span class="lineno">16921</span>&#160;                    <span class="keywordflow">if</span>(res == VK_SUCCESS)</div>
+<div class="line"><a name="l16922"></a><span class="lineno">16922</span>&#160;                    {</div>
+<div class="line"><a name="l16923"></a><span class="lineno">16923</span>&#160;                        alignmentForMemType = VMA_MAX(</div>
+<div class="line"><a name="l16924"></a><span class="lineno">16924</span>&#160;                            vkMemReq.alignment,</div>
+<div class="line"><a name="l16925"></a><span class="lineno">16925</span>&#160;                            GetMemoryTypeMinAlignment(memTypeIndex));</div>
+<div class="line"><a name="l16926"></a><span class="lineno">16926</span>&#160; </div>
+<div class="line"><a name="l16927"></a><span class="lineno">16927</span>&#160;                        res = AllocateMemoryOfType(</div>
+<div class="line"><a name="l16928"></a><span class="lineno">16928</span>&#160;                            vkMemReq.size,</div>
+<div class="line"><a name="l16929"></a><span class="lineno">16929</span>&#160;                            alignmentForMemType,</div>
+<div class="line"><a name="l16930"></a><span class="lineno">16930</span>&#160;                            requiresDedicatedAllocation || prefersDedicatedAllocation,</div>
+<div class="line"><a name="l16931"></a><span class="lineno">16931</span>&#160;                            dedicatedBuffer,</div>
+<div class="line"><a name="l16932"></a><span class="lineno">16932</span>&#160;                            dedicatedBufferUsage,</div>
+<div class="line"><a name="l16933"></a><span class="lineno">16933</span>&#160;                            dedicatedImage,</div>
+<div class="line"><a name="l16934"></a><span class="lineno">16934</span>&#160;                            createInfo,</div>
+<div class="line"><a name="l16935"></a><span class="lineno">16935</span>&#160;                            memTypeIndex,</div>
+<div class="line"><a name="l16936"></a><span class="lineno">16936</span>&#160;                            suballocType,</div>
+<div class="line"><a name="l16937"></a><span class="lineno">16937</span>&#160;                            allocationCount,</div>
+<div class="line"><a name="l16938"></a><span class="lineno">16938</span>&#160;                            pAllocations);</div>
+<div class="line"><a name="l16939"></a><span class="lineno">16939</span>&#160;                        <span class="comment">// Allocation from this alternative memory type succeeded.</span></div>
+<div class="line"><a name="l16940"></a><span class="lineno">16940</span>&#160;                        <span class="keywordflow">if</span>(res == VK_SUCCESS)</div>
+<div class="line"><a name="l16941"></a><span class="lineno">16941</span>&#160;                        {</div>
+<div class="line"><a name="l16942"></a><span class="lineno">16942</span>&#160;                            <span class="keywordflow">return</span> res;</div>
+<div class="line"><a name="l16943"></a><span class="lineno">16943</span>&#160;                        }</div>
+<div class="line"><a name="l16944"></a><span class="lineno">16944</span>&#160;                        <span class="comment">// else: Allocation from this memory type failed. Try next one - next loop iteration.</span></div>
+<div class="line"><a name="l16945"></a><span class="lineno">16945</span>&#160;                    }</div>
+<div class="line"><a name="l16946"></a><span class="lineno">16946</span>&#160;                    <span class="comment">// No other matching memory type index could be found.</span></div>
+<div class="line"><a name="l16947"></a><span class="lineno">16947</span>&#160;                    <span class="keywordflow">else</span></div>
+<div class="line"><a name="l16948"></a><span class="lineno">16948</span>&#160;                    {</div>
+<div class="line"><a name="l16949"></a><span class="lineno">16949</span>&#160;                        <span class="comment">// Not returning res, which is VK_ERROR_FEATURE_NOT_PRESENT, because we already failed to allocate once.</span></div>
+<div class="line"><a name="l16950"></a><span class="lineno">16950</span>&#160;                        <span class="keywordflow">return</span> VK_ERROR_OUT_OF_DEVICE_MEMORY;</div>
+<div class="line"><a name="l16951"></a><span class="lineno">16951</span>&#160;                    }</div>
+<div class="line"><a name="l16952"></a><span class="lineno">16952</span>&#160;                }</div>
+<div class="line"><a name="l16953"></a><span class="lineno">16953</span>&#160;            }</div>
+<div class="line"><a name="l16954"></a><span class="lineno">16954</span>&#160;        }</div>
+<div class="line"><a name="l16955"></a><span class="lineno">16955</span>&#160;        <span class="comment">// Can&#39;t find any single memory type maching requirements. res is VK_ERROR_FEATURE_NOT_PRESENT.</span></div>
+<div class="line"><a name="l16956"></a><span class="lineno">16956</span>&#160;        <span class="keywordflow">else</span></div>
+<div class="line"><a name="l16957"></a><span class="lineno">16957</span>&#160;            <span class="keywordflow">return</span> res;</div>
+<div class="line"><a name="l16958"></a><span class="lineno">16958</span>&#160;    }</div>
+<div class="line"><a name="l16959"></a><span class="lineno">16959</span>&#160;}</div>
+<div class="line"><a name="l16960"></a><span class="lineno">16960</span>&#160; </div>
+<div class="line"><a name="l16961"></a><span class="lineno">16961</span>&#160;<span class="keywordtype">void</span> VmaAllocator_T::FreeMemory(</div>
+<div class="line"><a name="l16962"></a><span class="lineno">16962</span>&#160;    <span class="keywordtype">size_t</span> allocationCount,</div>
+<div class="line"><a name="l16963"></a><span class="lineno">16963</span>&#160;    <span class="keyword">const</span> <a class="code" href="struct_vma_allocation.html">VmaAllocation</a>* pAllocations)</div>
+<div class="line"><a name="l16964"></a><span class="lineno">16964</span>&#160;{</div>
+<div class="line"><a name="l16965"></a><span class="lineno">16965</span>&#160;    VMA_ASSERT(pAllocations);</div>
+<div class="line"><a name="l16966"></a><span class="lineno">16966</span>&#160; </div>
+<div class="line"><a name="l16967"></a><span class="lineno">16967</span>&#160;    <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> allocIndex = allocationCount; allocIndex--; )</div>
+<div class="line"><a name="l16968"></a><span class="lineno">16968</span>&#160;    {</div>
+<div class="line"><a name="l16969"></a><span class="lineno">16969</span>&#160;        <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation = pAllocations[allocIndex];</div>
+<div class="line"><a name="l16970"></a><span class="lineno">16970</span>&#160; </div>
+<div class="line"><a name="l16971"></a><span class="lineno">16971</span>&#160;        <span class="keywordflow">if</span>(allocation != VK_NULL_HANDLE)</div>
+<div class="line"><a name="l16972"></a><span class="lineno">16972</span>&#160;        {</div>
+<div class="line"><a name="l16973"></a><span class="lineno">16973</span>&#160;            <span class="keywordflow">if</span>(TouchAllocation(allocation))</div>
+<div class="line"><a name="l16974"></a><span class="lineno">16974</span>&#160;            {</div>
+<div class="line"><a name="l16975"></a><span class="lineno">16975</span>&#160;                <span class="keywordflow">if</span>(VMA_DEBUG_INITIALIZE_ALLOCATIONS)</div>
+<div class="line"><a name="l16976"></a><span class="lineno">16976</span>&#160;                {</div>
+<div class="line"><a name="l16977"></a><span class="lineno">16977</span>&#160;                    FillAllocation(allocation, VMA_ALLOCATION_FILL_PATTERN_DESTROYED);</div>
+<div class="line"><a name="l16978"></a><span class="lineno">16978</span>&#160;                }</div>
+<div class="line"><a name="l16979"></a><span class="lineno">16979</span>&#160; </div>
+<div class="line"><a name="l16980"></a><span class="lineno">16980</span>&#160;                <span class="keywordflow">switch</span>(allocation-&gt;GetType())</div>
+<div class="line"><a name="l16981"></a><span class="lineno">16981</span>&#160;                {</div>
+<div class="line"><a name="l16982"></a><span class="lineno">16982</span>&#160;                <span class="keywordflow">case</span> VmaAllocation_T::ALLOCATION_TYPE_BLOCK:</div>
+<div class="line"><a name="l16983"></a><span class="lineno">16983</span>&#160;                    {</div>
+<div class="line"><a name="l16984"></a><span class="lineno">16984</span>&#160;                        VmaBlockVector* pBlockVector = VMA_NULL;</div>
+<div class="line"><a name="l16985"></a><span class="lineno">16985</span>&#160;                        <a class="code" href="struct_vma_pool.html">VmaPool</a> hPool = allocation-&gt;GetBlock()-&gt;GetParentPool();</div>
+<div class="line"><a name="l16986"></a><span class="lineno">16986</span>&#160;                        <span class="keywordflow">if</span>(hPool != VK_NULL_HANDLE)</div>
+<div class="line"><a name="l16987"></a><span class="lineno">16987</span>&#160;                        {</div>
+<div class="line"><a name="l16988"></a><span class="lineno">16988</span>&#160;                            pBlockVector = &amp;hPool-&gt;m_BlockVector;</div>
+<div class="line"><a name="l16989"></a><span class="lineno">16989</span>&#160;                        }</div>
+<div class="line"><a name="l16990"></a><span class="lineno">16990</span>&#160;                        <span class="keywordflow">else</span></div>
+<div class="line"><a name="l16991"></a><span class="lineno">16991</span>&#160;                        {</div>
+<div class="line"><a name="l16992"></a><span class="lineno">16992</span>&#160;                            <span class="keyword">const</span> uint32_t memTypeIndex = allocation-&gt;GetMemoryTypeIndex();</div>
+<div class="line"><a name="l16993"></a><span class="lineno">16993</span>&#160;                            pBlockVector = m_pBlockVectors[memTypeIndex];</div>
+<div class="line"><a name="l16994"></a><span class="lineno">16994</span>&#160;                        }</div>
+<div class="line"><a name="l16995"></a><span class="lineno">16995</span>&#160;                        pBlockVector-&gt;Free(allocation);</div>
+<div class="line"><a name="l16996"></a><span class="lineno">16996</span>&#160;                    }</div>
+<div class="line"><a name="l16997"></a><span class="lineno">16997</span>&#160;                    <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l16998"></a><span class="lineno">16998</span>&#160;                <span class="keywordflow">case</span> VmaAllocation_T::ALLOCATION_TYPE_DEDICATED:</div>
+<div class="line"><a name="l16999"></a><span class="lineno">16999</span>&#160;                    FreeDedicatedMemory(allocation);</div>
+<div class="line"><a name="l17000"></a><span class="lineno">17000</span>&#160;                    <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l17001"></a><span class="lineno">17001</span>&#160;                <span class="keywordflow">default</span>:</div>
+<div class="line"><a name="l17002"></a><span class="lineno">17002</span>&#160;                    VMA_ASSERT(0);</div>
+<div class="line"><a name="l17003"></a><span class="lineno">17003</span>&#160;                }</div>
+<div class="line"><a name="l17004"></a><span class="lineno">17004</span>&#160;            }</div>
+<div class="line"><a name="l17005"></a><span class="lineno">17005</span>&#160; </div>
+<div class="line"><a name="l17006"></a><span class="lineno">17006</span>&#160;            <span class="comment">// Do this regardless of whether the allocation is lost. Lost allocations still account to Budget.AllocationBytes.</span></div>
+<div class="line"><a name="l17007"></a><span class="lineno">17007</span>&#160;            m_Budget.RemoveAllocation(MemoryTypeIndexToHeapIndex(allocation-&gt;GetMemoryTypeIndex()), allocation-&gt;GetSize());</div>
+<div class="line"><a name="l17008"></a><span class="lineno">17008</span>&#160;            allocation-&gt;SetUserData(<span class="keyword">this</span>, VMA_NULL);</div>
+<div class="line"><a name="l17009"></a><span class="lineno">17009</span>&#160;            m_AllocationObjectAllocator.Free(allocation);</div>
+<div class="line"><a name="l17010"></a><span class="lineno">17010</span>&#160;        }</div>
+<div class="line"><a name="l17011"></a><span class="lineno">17011</span>&#160;    }</div>
+<div class="line"><a name="l17012"></a><span class="lineno">17012</span>&#160;}</div>
+<div class="line"><a name="l17013"></a><span class="lineno">17013</span>&#160; </div>
+<div class="line"><a name="l17014"></a><span class="lineno">17014</span>&#160;<span class="keywordtype">void</span> VmaAllocator_T::CalculateStats(<a class="code" href="struct_vma_stats.html">VmaStats</a>* pStats)</div>
+<div class="line"><a name="l17015"></a><span class="lineno">17015</span>&#160;{</div>
+<div class="line"><a name="l17016"></a><span class="lineno">17016</span>&#160;    <span class="comment">// Initialize.</span></div>
+<div class="line"><a name="l17017"></a><span class="lineno">17017</span>&#160;    InitStatInfo(pStats-&gt;<a class="code" href="struct_vma_stats.html#a2e8f5b3353f2fefef3c27f29e245a1f9">total</a>);</div>
+<div class="line"><a name="l17018"></a><span class="lineno">17018</span>&#160;    <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> i = 0; i &lt; VK_MAX_MEMORY_TYPES; ++i)</div>
+<div class="line"><a name="l17019"></a><span class="lineno">17019</span>&#160;        InitStatInfo(pStats-&gt;<a class="code" href="struct_vma_stats.html#a13e3caf754be79352c42408756309331">memoryType</a>[i]);</div>
+<div class="line"><a name="l17020"></a><span class="lineno">17020</span>&#160;    <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> i = 0; i &lt; VK_MAX_MEMORY_HEAPS; ++i)</div>
+<div class="line"><a name="l17021"></a><span class="lineno">17021</span>&#160;        InitStatInfo(pStats-&gt;<a class="code" href="struct_vma_stats.html#a0e6611508c29a187f0fd14ff1a0329c0">memoryHeap</a>[i]);</div>
+<div class="line"><a name="l17022"></a><span class="lineno">17022</span>&#160; </div>
+<div class="line"><a name="l17023"></a><span class="lineno">17023</span>&#160;    <span class="comment">// Process default pools.</span></div>
+<div class="line"><a name="l17024"></a><span class="lineno">17024</span>&#160;    <span class="keywordflow">for</span>(uint32_t memTypeIndex = 0; memTypeIndex &lt; GetMemoryTypeCount(); ++memTypeIndex)</div>
 <div class="line"><a name="l17025"></a><span class="lineno">17025</span>&#160;    {</div>
-<div class="line"><a name="l17026"></a><span class="lineno">17026</span>&#160;        <span class="keywordflow">return</span> (*m_VulkanFunctions.vkBindImageMemory)(m_hDevice, image, memory, memoryOffset);</div>
-<div class="line"><a name="l17027"></a><span class="lineno">17027</span>&#160;    }</div>
-<div class="line"><a name="l17028"></a><span class="lineno">17028</span>&#160;}</div>
-<div class="line"><a name="l17029"></a><span class="lineno">17029</span>&#160; </div>
-<div class="line"><a name="l17030"></a><span class="lineno">17030</span>&#160;VkResult VmaAllocator_T::Map(<a class="code" href="struct_vma_allocation.html">VmaAllocation</a> hAllocation, <span class="keywordtype">void</span>** ppData)</div>
-<div class="line"><a name="l17031"></a><span class="lineno">17031</span>&#160;{</div>
-<div class="line"><a name="l17032"></a><span class="lineno">17032</span>&#160;    <span class="keywordflow">if</span>(hAllocation-&gt;CanBecomeLost())</div>
-<div class="line"><a name="l17033"></a><span class="lineno">17033</span>&#160;    {</div>
-<div class="line"><a name="l17034"></a><span class="lineno">17034</span>&#160;        <span class="keywordflow">return</span> VK_ERROR_MEMORY_MAP_FAILED;</div>
-<div class="line"><a name="l17035"></a><span class="lineno">17035</span>&#160;    }</div>
-<div class="line"><a name="l17036"></a><span class="lineno">17036</span>&#160; </div>
-<div class="line"><a name="l17037"></a><span class="lineno">17037</span>&#160;    <span class="keywordflow">switch</span>(hAllocation-&gt;GetType())</div>
-<div class="line"><a name="l17038"></a><span class="lineno">17038</span>&#160;    {</div>
-<div class="line"><a name="l17039"></a><span class="lineno">17039</span>&#160;    <span class="keywordflow">case</span> VmaAllocation_T::ALLOCATION_TYPE_BLOCK:</div>
-<div class="line"><a name="l17040"></a><span class="lineno">17040</span>&#160;        {</div>
-<div class="line"><a name="l17041"></a><span class="lineno">17041</span>&#160;            VmaDeviceMemoryBlock* <span class="keyword">const</span> pBlock = hAllocation-&gt;GetBlock();</div>
-<div class="line"><a name="l17042"></a><span class="lineno">17042</span>&#160;            <span class="keywordtype">char</span> *pBytes = VMA_NULL;</div>
-<div class="line"><a name="l17043"></a><span class="lineno">17043</span>&#160;            VkResult res = pBlock-&gt;Map(<span class="keyword">this</span>, 1, (<span class="keywordtype">void</span>**)&amp;pBytes);</div>
-<div class="line"><a name="l17044"></a><span class="lineno">17044</span>&#160;            <span class="keywordflow">if</span>(res == VK_SUCCESS)</div>
-<div class="line"><a name="l17045"></a><span class="lineno">17045</span>&#160;            {</div>
-<div class="line"><a name="l17046"></a><span class="lineno">17046</span>&#160;                *ppData = pBytes + (ptrdiff_t)hAllocation-&gt;GetOffset();</div>
-<div class="line"><a name="l17047"></a><span class="lineno">17047</span>&#160;                hAllocation-&gt;BlockAllocMap();</div>
-<div class="line"><a name="l17048"></a><span class="lineno">17048</span>&#160;            }</div>
-<div class="line"><a name="l17049"></a><span class="lineno">17049</span>&#160;            <span class="keywordflow">return</span> res;</div>
-<div class="line"><a name="l17050"></a><span class="lineno">17050</span>&#160;        }</div>
-<div class="line"><a name="l17051"></a><span class="lineno">17051</span>&#160;    <span class="keywordflow">case</span> VmaAllocation_T::ALLOCATION_TYPE_DEDICATED:</div>
-<div class="line"><a name="l17052"></a><span class="lineno">17052</span>&#160;        <span class="keywordflow">return</span> hAllocation-&gt;DedicatedAllocMap(<span class="keyword">this</span>, ppData);</div>
-<div class="line"><a name="l17053"></a><span class="lineno">17053</span>&#160;    <span class="keywordflow">default</span>:</div>
-<div class="line"><a name="l17054"></a><span class="lineno">17054</span>&#160;        VMA_ASSERT(0);</div>
-<div class="line"><a name="l17055"></a><span class="lineno">17055</span>&#160;        <span class="keywordflow">return</span> VK_ERROR_MEMORY_MAP_FAILED;</div>
-<div class="line"><a name="l17056"></a><span class="lineno">17056</span>&#160;    }</div>
-<div class="line"><a name="l17057"></a><span class="lineno">17057</span>&#160;}</div>
-<div class="line"><a name="l17058"></a><span class="lineno">17058</span>&#160; </div>
-<div class="line"><a name="l17059"></a><span class="lineno">17059</span>&#160;<span class="keywordtype">void</span> VmaAllocator_T::Unmap(<a class="code" href="struct_vma_allocation.html">VmaAllocation</a> hAllocation)</div>
-<div class="line"><a name="l17060"></a><span class="lineno">17060</span>&#160;{</div>
-<div class="line"><a name="l17061"></a><span class="lineno">17061</span>&#160;    <span class="keywordflow">switch</span>(hAllocation-&gt;GetType())</div>
-<div class="line"><a name="l17062"></a><span class="lineno">17062</span>&#160;    {</div>
-<div class="line"><a name="l17063"></a><span class="lineno">17063</span>&#160;    <span class="keywordflow">case</span> VmaAllocation_T::ALLOCATION_TYPE_BLOCK:</div>
-<div class="line"><a name="l17064"></a><span class="lineno">17064</span>&#160;        {</div>
-<div class="line"><a name="l17065"></a><span class="lineno">17065</span>&#160;            VmaDeviceMemoryBlock* <span class="keyword">const</span> pBlock = hAllocation-&gt;GetBlock();</div>
-<div class="line"><a name="l17066"></a><span class="lineno">17066</span>&#160;            hAllocation-&gt;BlockAllocUnmap();</div>
-<div class="line"><a name="l17067"></a><span class="lineno">17067</span>&#160;            pBlock-&gt;Unmap(<span class="keyword">this</span>, 1);</div>
-<div class="line"><a name="l17068"></a><span class="lineno">17068</span>&#160;        }</div>
-<div class="line"><a name="l17069"></a><span class="lineno">17069</span>&#160;        <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l17070"></a><span class="lineno">17070</span>&#160;    <span class="keywordflow">case</span> VmaAllocation_T::ALLOCATION_TYPE_DEDICATED:</div>
-<div class="line"><a name="l17071"></a><span class="lineno">17071</span>&#160;        hAllocation-&gt;DedicatedAllocUnmap(<span class="keyword">this</span>);</div>
-<div class="line"><a name="l17072"></a><span class="lineno">17072</span>&#160;        <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l17073"></a><span class="lineno">17073</span>&#160;    <span class="keywordflow">default</span>:</div>
-<div class="line"><a name="l17074"></a><span class="lineno">17074</span>&#160;        VMA_ASSERT(0);</div>
-<div class="line"><a name="l17075"></a><span class="lineno">17075</span>&#160;    }</div>
-<div class="line"><a name="l17076"></a><span class="lineno">17076</span>&#160;}</div>
-<div class="line"><a name="l17077"></a><span class="lineno">17077</span>&#160; </div>
-<div class="line"><a name="l17078"></a><span class="lineno">17078</span>&#160;VkResult VmaAllocator_T::BindBufferMemory(</div>
-<div class="line"><a name="l17079"></a><span class="lineno">17079</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> hAllocation,</div>
-<div class="line"><a name="l17080"></a><span class="lineno">17080</span>&#160;    VkDeviceSize allocationLocalOffset,</div>
-<div class="line"><a name="l17081"></a><span class="lineno">17081</span>&#160;    VkBuffer hBuffer,</div>
-<div class="line"><a name="l17082"></a><span class="lineno">17082</span>&#160;    <span class="keyword">const</span> <span class="keywordtype">void</span>* pNext)</div>
-<div class="line"><a name="l17083"></a><span class="lineno">17083</span>&#160;{</div>
-<div class="line"><a name="l17084"></a><span class="lineno">17084</span>&#160;    VkResult res = VK_SUCCESS;</div>
-<div class="line"><a name="l17085"></a><span class="lineno">17085</span>&#160;    <span class="keywordflow">switch</span>(hAllocation-&gt;GetType())</div>
-<div class="line"><a name="l17086"></a><span class="lineno">17086</span>&#160;    {</div>
-<div class="line"><a name="l17087"></a><span class="lineno">17087</span>&#160;    <span class="keywordflow">case</span> VmaAllocation_T::ALLOCATION_TYPE_DEDICATED:</div>
-<div class="line"><a name="l17088"></a><span class="lineno">17088</span>&#160;        res = BindVulkanBuffer(hAllocation-&gt;GetMemory(), allocationLocalOffset, hBuffer, pNext);</div>
-<div class="line"><a name="l17089"></a><span class="lineno">17089</span>&#160;        <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l17090"></a><span class="lineno">17090</span>&#160;    <span class="keywordflow">case</span> VmaAllocation_T::ALLOCATION_TYPE_BLOCK:</div>
-<div class="line"><a name="l17091"></a><span class="lineno">17091</span>&#160;    {</div>
-<div class="line"><a name="l17092"></a><span class="lineno">17092</span>&#160;        VmaDeviceMemoryBlock* <span class="keyword">const</span> pBlock = hAllocation-&gt;GetBlock();</div>
-<div class="line"><a name="l17093"></a><span class="lineno">17093</span>&#160;        VMA_ASSERT(pBlock &amp;&amp; <span class="stringliteral">&quot;Binding buffer to allocation that doesn&#39;t belong to any block. Is the allocation lost?&quot;</span>);</div>
-<div class="line"><a name="l17094"></a><span class="lineno">17094</span>&#160;        res = pBlock-&gt;BindBufferMemory(<span class="keyword">this</span>, hAllocation, allocationLocalOffset, hBuffer, pNext);</div>
-<div class="line"><a name="l17095"></a><span class="lineno">17095</span>&#160;        <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l17096"></a><span class="lineno">17096</span>&#160;    }</div>
-<div class="line"><a name="l17097"></a><span class="lineno">17097</span>&#160;    <span class="keywordflow">default</span>:</div>
-<div class="line"><a name="l17098"></a><span class="lineno">17098</span>&#160;        VMA_ASSERT(0);</div>
-<div class="line"><a name="l17099"></a><span class="lineno">17099</span>&#160;    }</div>
-<div class="line"><a name="l17100"></a><span class="lineno">17100</span>&#160;    <span class="keywordflow">return</span> res;</div>
-<div class="line"><a name="l17101"></a><span class="lineno">17101</span>&#160;}</div>
-<div class="line"><a name="l17102"></a><span class="lineno">17102</span>&#160; </div>
-<div class="line"><a name="l17103"></a><span class="lineno">17103</span>&#160;VkResult VmaAllocator_T::BindImageMemory(</div>
-<div class="line"><a name="l17104"></a><span class="lineno">17104</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> hAllocation,</div>
-<div class="line"><a name="l17105"></a><span class="lineno">17105</span>&#160;    VkDeviceSize allocationLocalOffset,</div>
-<div class="line"><a name="l17106"></a><span class="lineno">17106</span>&#160;    VkImage hImage,</div>
-<div class="line"><a name="l17107"></a><span class="lineno">17107</span>&#160;    <span class="keyword">const</span> <span class="keywordtype">void</span>* pNext)</div>
-<div class="line"><a name="l17108"></a><span class="lineno">17108</span>&#160;{</div>
-<div class="line"><a name="l17109"></a><span class="lineno">17109</span>&#160;    VkResult res = VK_SUCCESS;</div>
-<div class="line"><a name="l17110"></a><span class="lineno">17110</span>&#160;    <span class="keywordflow">switch</span>(hAllocation-&gt;GetType())</div>
-<div class="line"><a name="l17111"></a><span class="lineno">17111</span>&#160;    {</div>
-<div class="line"><a name="l17112"></a><span class="lineno">17112</span>&#160;    <span class="keywordflow">case</span> VmaAllocation_T::ALLOCATION_TYPE_DEDICATED:</div>
-<div class="line"><a name="l17113"></a><span class="lineno">17113</span>&#160;        res = BindVulkanImage(hAllocation-&gt;GetMemory(), allocationLocalOffset, hImage, pNext);</div>
-<div class="line"><a name="l17114"></a><span class="lineno">17114</span>&#160;        <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l17115"></a><span class="lineno">17115</span>&#160;    <span class="keywordflow">case</span> VmaAllocation_T::ALLOCATION_TYPE_BLOCK:</div>
-<div class="line"><a name="l17116"></a><span class="lineno">17116</span>&#160;    {</div>
-<div class="line"><a name="l17117"></a><span class="lineno">17117</span>&#160;        VmaDeviceMemoryBlock* pBlock = hAllocation-&gt;GetBlock();</div>
-<div class="line"><a name="l17118"></a><span class="lineno">17118</span>&#160;        VMA_ASSERT(pBlock &amp;&amp; <span class="stringliteral">&quot;Binding image to allocation that doesn&#39;t belong to any block. Is the allocation lost?&quot;</span>);</div>
-<div class="line"><a name="l17119"></a><span class="lineno">17119</span>&#160;        res = pBlock-&gt;BindImageMemory(<span class="keyword">this</span>, hAllocation, allocationLocalOffset, hImage, pNext);</div>
-<div class="line"><a name="l17120"></a><span class="lineno">17120</span>&#160;        <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l17121"></a><span class="lineno">17121</span>&#160;    }</div>
-<div class="line"><a name="l17122"></a><span class="lineno">17122</span>&#160;    <span class="keywordflow">default</span>:</div>
-<div class="line"><a name="l17123"></a><span class="lineno">17123</span>&#160;        VMA_ASSERT(0);</div>
-<div class="line"><a name="l17124"></a><span class="lineno">17124</span>&#160;    }</div>
-<div class="line"><a name="l17125"></a><span class="lineno">17125</span>&#160;    <span class="keywordflow">return</span> res;</div>
-<div class="line"><a name="l17126"></a><span class="lineno">17126</span>&#160;}</div>
-<div class="line"><a name="l17127"></a><span class="lineno">17127</span>&#160; </div>
-<div class="line"><a name="l17128"></a><span class="lineno">17128</span>&#160;VkResult VmaAllocator_T::FlushOrInvalidateAllocation(</div>
-<div class="line"><a name="l17129"></a><span class="lineno">17129</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> hAllocation,</div>
-<div class="line"><a name="l17130"></a><span class="lineno">17130</span>&#160;    VkDeviceSize offset, VkDeviceSize size,</div>
-<div class="line"><a name="l17131"></a><span class="lineno">17131</span>&#160;    VMA_CACHE_OPERATION op)</div>
-<div class="line"><a name="l17132"></a><span class="lineno">17132</span>&#160;{</div>
-<div class="line"><a name="l17133"></a><span class="lineno">17133</span>&#160;    VkResult res = VK_SUCCESS;</div>
-<div class="line"><a name="l17134"></a><span class="lineno">17134</span>&#160; </div>
-<div class="line"><a name="l17135"></a><span class="lineno">17135</span>&#160;    VkMappedMemoryRange memRange = {};</div>
-<div class="line"><a name="l17136"></a><span class="lineno">17136</span>&#160;    <span class="keywordflow">if</span>(GetFlushOrInvalidateRange(hAllocation, offset, size, memRange))</div>
-<div class="line"><a name="l17137"></a><span class="lineno">17137</span>&#160;    {</div>
-<div class="line"><a name="l17138"></a><span class="lineno">17138</span>&#160;        <span class="keywordflow">switch</span>(op)</div>
-<div class="line"><a name="l17139"></a><span class="lineno">17139</span>&#160;        {</div>
-<div class="line"><a name="l17140"></a><span class="lineno">17140</span>&#160;        <span class="keywordflow">case</span> VMA_CACHE_FLUSH:</div>
-<div class="line"><a name="l17141"></a><span class="lineno">17141</span>&#160;            res = (*GetVulkanFunctions().vkFlushMappedMemoryRanges)(m_hDevice, 1, &amp;memRange);</div>
-<div class="line"><a name="l17142"></a><span class="lineno">17142</span>&#160;            <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l17143"></a><span class="lineno">17143</span>&#160;        <span class="keywordflow">case</span> VMA_CACHE_INVALIDATE:</div>
-<div class="line"><a name="l17144"></a><span class="lineno">17144</span>&#160;            res = (*GetVulkanFunctions().vkInvalidateMappedMemoryRanges)(m_hDevice, 1, &amp;memRange);</div>
-<div class="line"><a name="l17145"></a><span class="lineno">17145</span>&#160;            <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l17146"></a><span class="lineno">17146</span>&#160;        <span class="keywordflow">default</span>:</div>
-<div class="line"><a name="l17147"></a><span class="lineno">17147</span>&#160;            VMA_ASSERT(0);</div>
-<div class="line"><a name="l17148"></a><span class="lineno">17148</span>&#160;        }</div>
-<div class="line"><a name="l17149"></a><span class="lineno">17149</span>&#160;    }</div>
-<div class="line"><a name="l17150"></a><span class="lineno">17150</span>&#160;    <span class="comment">// else: Just ignore this call.</span></div>
-<div class="line"><a name="l17151"></a><span class="lineno">17151</span>&#160;    <span class="keywordflow">return</span> res;</div>
-<div class="line"><a name="l17152"></a><span class="lineno">17152</span>&#160;}</div>
-<div class="line"><a name="l17153"></a><span class="lineno">17153</span>&#160; </div>
-<div class="line"><a name="l17154"></a><span class="lineno">17154</span>&#160;VkResult VmaAllocator_T::FlushOrInvalidateAllocations(</div>
-<div class="line"><a name="l17155"></a><span class="lineno">17155</span>&#160;    uint32_t allocationCount,</div>
-<div class="line"><a name="l17156"></a><span class="lineno">17156</span>&#160;    <span class="keyword">const</span> <a class="code" href="struct_vma_allocation.html">VmaAllocation</a>* allocations,</div>
-<div class="line"><a name="l17157"></a><span class="lineno">17157</span>&#160;    <span class="keyword">const</span> VkDeviceSize* offsets, <span class="keyword">const</span> VkDeviceSize* sizes,</div>
-<div class="line"><a name="l17158"></a><span class="lineno">17158</span>&#160;    VMA_CACHE_OPERATION op)</div>
-<div class="line"><a name="l17159"></a><span class="lineno">17159</span>&#160;{</div>
-<div class="line"><a name="l17160"></a><span class="lineno">17160</span>&#160;    <span class="keyword">typedef</span> VmaStlAllocator&lt;VkMappedMemoryRange&gt; RangeAllocator;</div>
-<div class="line"><a name="l17161"></a><span class="lineno">17161</span>&#160;    <span class="keyword">typedef</span> VmaSmallVector&lt;VkMappedMemoryRange, RangeAllocator, 16&gt; RangeVector;</div>
-<div class="line"><a name="l17162"></a><span class="lineno">17162</span>&#160;    RangeVector ranges = RangeVector(RangeAllocator(GetAllocationCallbacks()));</div>
-<div class="line"><a name="l17163"></a><span class="lineno">17163</span>&#160;    </div>
-<div class="line"><a name="l17164"></a><span class="lineno">17164</span>&#160;    <span class="keywordflow">for</span>(uint32_t allocIndex = 0; allocIndex &lt; allocationCount; ++allocIndex)</div>
-<div class="line"><a name="l17165"></a><span class="lineno">17165</span>&#160;    {</div>
-<div class="line"><a name="l17166"></a><span class="lineno">17166</span>&#160;        <span class="keyword">const</span> <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> alloc = allocations[allocIndex];</div>
-<div class="line"><a name="l17167"></a><span class="lineno">17167</span>&#160;        <span class="keyword">const</span> VkDeviceSize offset = offsets != VMA_NULL ? offsets[allocIndex] : 0;</div>
-<div class="line"><a name="l17168"></a><span class="lineno">17168</span>&#160;        <span class="keyword">const</span> VkDeviceSize size = sizes != VMA_NULL ? sizes[allocIndex] : VK_WHOLE_SIZE;</div>
-<div class="line"><a name="l17169"></a><span class="lineno">17169</span>&#160;        VkMappedMemoryRange newRange;</div>
-<div class="line"><a name="l17170"></a><span class="lineno">17170</span>&#160;        <span class="keywordflow">if</span>(GetFlushOrInvalidateRange(alloc, offset, size, newRange))</div>
-<div class="line"><a name="l17171"></a><span class="lineno">17171</span>&#160;        {</div>
-<div class="line"><a name="l17172"></a><span class="lineno">17172</span>&#160;            ranges.push_back(newRange);</div>
-<div class="line"><a name="l17173"></a><span class="lineno">17173</span>&#160;        }</div>
-<div class="line"><a name="l17174"></a><span class="lineno">17174</span>&#160;    }</div>
-<div class="line"><a name="l17175"></a><span class="lineno">17175</span>&#160; </div>
-<div class="line"><a name="l17176"></a><span class="lineno">17176</span>&#160;    VkResult res = VK_SUCCESS;</div>
-<div class="line"><a name="l17177"></a><span class="lineno">17177</span>&#160;    <span class="keywordflow">if</span>(!ranges.empty())</div>
-<div class="line"><a name="l17178"></a><span class="lineno">17178</span>&#160;    {</div>
-<div class="line"><a name="l17179"></a><span class="lineno">17179</span>&#160;        <span class="keywordflow">switch</span>(op)</div>
-<div class="line"><a name="l17180"></a><span class="lineno">17180</span>&#160;        {</div>
-<div class="line"><a name="l17181"></a><span class="lineno">17181</span>&#160;        <span class="keywordflow">case</span> VMA_CACHE_FLUSH:</div>
-<div class="line"><a name="l17182"></a><span class="lineno">17182</span>&#160;            res = (*GetVulkanFunctions().vkFlushMappedMemoryRanges)(m_hDevice, (uint32_t)ranges.size(), ranges.data());</div>
-<div class="line"><a name="l17183"></a><span class="lineno">17183</span>&#160;            <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l17184"></a><span class="lineno">17184</span>&#160;        <span class="keywordflow">case</span> VMA_CACHE_INVALIDATE:</div>
-<div class="line"><a name="l17185"></a><span class="lineno">17185</span>&#160;            res = (*GetVulkanFunctions().vkInvalidateMappedMemoryRanges)(m_hDevice, (uint32_t)ranges.size(), ranges.data());</div>
-<div class="line"><a name="l17186"></a><span class="lineno">17186</span>&#160;            <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l17187"></a><span class="lineno">17187</span>&#160;        <span class="keywordflow">default</span>:</div>
-<div class="line"><a name="l17188"></a><span class="lineno">17188</span>&#160;            VMA_ASSERT(0);</div>
-<div class="line"><a name="l17189"></a><span class="lineno">17189</span>&#160;        }</div>
-<div class="line"><a name="l17190"></a><span class="lineno">17190</span>&#160;    }</div>
-<div class="line"><a name="l17191"></a><span class="lineno">17191</span>&#160;    <span class="comment">// else: Just ignore this call.</span></div>
-<div class="line"><a name="l17192"></a><span class="lineno">17192</span>&#160;    <span class="keywordflow">return</span> res;</div>
-<div class="line"><a name="l17193"></a><span class="lineno">17193</span>&#160;}</div>
-<div class="line"><a name="l17194"></a><span class="lineno">17194</span>&#160; </div>
-<div class="line"><a name="l17195"></a><span class="lineno">17195</span>&#160;<span class="keywordtype">void</span> VmaAllocator_T::FreeDedicatedMemory(<span class="keyword">const</span> <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation)</div>
-<div class="line"><a name="l17196"></a><span class="lineno">17196</span>&#160;{</div>
-<div class="line"><a name="l17197"></a><span class="lineno">17197</span>&#160;    VMA_ASSERT(allocation &amp;&amp; allocation-&gt;GetType() == VmaAllocation_T::ALLOCATION_TYPE_DEDICATED);</div>
-<div class="line"><a name="l17198"></a><span class="lineno">17198</span>&#160; </div>
-<div class="line"><a name="l17199"></a><span class="lineno">17199</span>&#160;    <span class="keyword">const</span> uint32_t memTypeIndex = allocation-&gt;GetMemoryTypeIndex();</div>
-<div class="line"><a name="l17200"></a><span class="lineno">17200</span>&#160;    {</div>
-<div class="line"><a name="l17201"></a><span class="lineno">17201</span>&#160;        VmaMutexLockWrite lock(m_DedicatedAllocationsMutex[memTypeIndex], m_UseMutex);</div>
-<div class="line"><a name="l17202"></a><span class="lineno">17202</span>&#160;        AllocationVectorType* <span class="keyword">const</span> pDedicatedAllocations = m_pDedicatedAllocations[memTypeIndex];</div>
-<div class="line"><a name="l17203"></a><span class="lineno">17203</span>&#160;        VMA_ASSERT(pDedicatedAllocations);</div>
-<div class="line"><a name="l17204"></a><span class="lineno">17204</span>&#160;        <span class="keywordtype">bool</span> success = VmaVectorRemoveSorted&lt;VmaPointerLess&gt;(*pDedicatedAllocations, allocation);</div>
-<div class="line"><a name="l17205"></a><span class="lineno">17205</span>&#160;        VMA_ASSERT(success);</div>
-<div class="line"><a name="l17206"></a><span class="lineno">17206</span>&#160;    }</div>
-<div class="line"><a name="l17207"></a><span class="lineno">17207</span>&#160; </div>
-<div class="line"><a name="l17208"></a><span class="lineno">17208</span>&#160;    VkDeviceMemory hMemory = allocation-&gt;GetMemory();</div>
-<div class="line"><a name="l17209"></a><span class="lineno">17209</span>&#160;    </div>
-<div class="line"><a name="l17210"></a><span class="lineno">17210</span>&#160;    <span class="comment">/*</span></div>
-<div class="line"><a name="l17211"></a><span class="lineno">17211</span>&#160;<span class="comment">    There is no need to call this, because Vulkan spec allows to skip vkUnmapMemory</span></div>
-<div class="line"><a name="l17212"></a><span class="lineno">17212</span>&#160;<span class="comment">    before vkFreeMemory.</span></div>
-<div class="line"><a name="l17213"></a><span class="lineno">17213</span>&#160;<span class="comment"></span> </div>
-<div class="line"><a name="l17214"></a><span class="lineno">17214</span>&#160;<span class="comment">    if(allocation-&gt;GetMappedData() != VMA_NULL)</span></div>
-<div class="line"><a name="l17215"></a><span class="lineno">17215</span>&#160;<span class="comment">    {</span></div>
-<div class="line"><a name="l17216"></a><span class="lineno">17216</span>&#160;<span class="comment">        (*m_VulkanFunctions.vkUnmapMemory)(m_hDevice, hMemory);</span></div>
-<div class="line"><a name="l17217"></a><span class="lineno">17217</span>&#160;<span class="comment">    }</span></div>
-<div class="line"><a name="l17218"></a><span class="lineno">17218</span>&#160;<span class="comment">    */</span></div>
-<div class="line"><a name="l17219"></a><span class="lineno">17219</span>&#160;    </div>
-<div class="line"><a name="l17220"></a><span class="lineno">17220</span>&#160;    FreeVulkanMemory(memTypeIndex, allocation-&gt;GetSize(), hMemory);</div>
-<div class="line"><a name="l17221"></a><span class="lineno">17221</span>&#160; </div>
-<div class="line"><a name="l17222"></a><span class="lineno">17222</span>&#160;    VMA_DEBUG_LOG(<span class="stringliteral">&quot;    Freed DedicatedMemory MemoryTypeIndex=%u&quot;</span>, memTypeIndex);</div>
-<div class="line"><a name="l17223"></a><span class="lineno">17223</span>&#160;}</div>
-<div class="line"><a name="l17224"></a><span class="lineno">17224</span>&#160; </div>
-<div class="line"><a name="l17225"></a><span class="lineno">17225</span>&#160;uint32_t VmaAllocator_T::CalculateGpuDefragmentationMemoryTypeBits()<span class="keyword"> const</span></div>
-<div class="line"><a name="l17226"></a><span class="lineno">17226</span>&#160;<span class="keyword"></span>{</div>
-<div class="line"><a name="l17227"></a><span class="lineno">17227</span>&#160;    VkBufferCreateInfo dummyBufCreateInfo;</div>
-<div class="line"><a name="l17228"></a><span class="lineno">17228</span>&#160;    VmaFillGpuDefragmentationBufferCreateInfo(dummyBufCreateInfo);</div>
-<div class="line"><a name="l17229"></a><span class="lineno">17229</span>&#160; </div>
-<div class="line"><a name="l17230"></a><span class="lineno">17230</span>&#160;    uint32_t memoryTypeBits = 0;</div>
-<div class="line"><a name="l17231"></a><span class="lineno">17231</span>&#160; </div>
-<div class="line"><a name="l17232"></a><span class="lineno">17232</span>&#160;    <span class="comment">// Create buffer.</span></div>
-<div class="line"><a name="l17233"></a><span class="lineno">17233</span>&#160;    VkBuffer buf = VK_NULL_HANDLE;</div>
-<div class="line"><a name="l17234"></a><span class="lineno">17234</span>&#160;    VkResult res = (*GetVulkanFunctions().vkCreateBuffer)(</div>
-<div class="line"><a name="l17235"></a><span class="lineno">17235</span>&#160;        m_hDevice, &amp;dummyBufCreateInfo, GetAllocationCallbacks(), &amp;buf);</div>
-<div class="line"><a name="l17236"></a><span class="lineno">17236</span>&#160;    <span class="keywordflow">if</span>(res == VK_SUCCESS)</div>
-<div class="line"><a name="l17237"></a><span class="lineno">17237</span>&#160;    {</div>
-<div class="line"><a name="l17238"></a><span class="lineno">17238</span>&#160;        <span class="comment">// Query for supported memory types.</span></div>
-<div class="line"><a name="l17239"></a><span class="lineno">17239</span>&#160;        VkMemoryRequirements memReq;</div>
-<div class="line"><a name="l17240"></a><span class="lineno">17240</span>&#160;        (*GetVulkanFunctions().vkGetBufferMemoryRequirements)(m_hDevice, buf, &amp;memReq);</div>
-<div class="line"><a name="l17241"></a><span class="lineno">17241</span>&#160;        memoryTypeBits = memReq.memoryTypeBits;</div>
-<div class="line"><a name="l17242"></a><span class="lineno">17242</span>&#160; </div>
-<div class="line"><a name="l17243"></a><span class="lineno">17243</span>&#160;        <span class="comment">// Destroy buffer.</span></div>
-<div class="line"><a name="l17244"></a><span class="lineno">17244</span>&#160;        (*GetVulkanFunctions().vkDestroyBuffer)(m_hDevice, buf, GetAllocationCallbacks());</div>
-<div class="line"><a name="l17245"></a><span class="lineno">17245</span>&#160;    }</div>
-<div class="line"><a name="l17246"></a><span class="lineno">17246</span>&#160; </div>
-<div class="line"><a name="l17247"></a><span class="lineno">17247</span>&#160;    <span class="keywordflow">return</span> memoryTypeBits;</div>
-<div class="line"><a name="l17248"></a><span class="lineno">17248</span>&#160;}</div>
-<div class="line"><a name="l17249"></a><span class="lineno">17249</span>&#160; </div>
-<div class="line"><a name="l17250"></a><span class="lineno">17250</span>&#160;uint32_t VmaAllocator_T::CalculateGlobalMemoryTypeBits()<span class="keyword"> const</span></div>
-<div class="line"><a name="l17251"></a><span class="lineno">17251</span>&#160;<span class="keyword"></span>{</div>
-<div class="line"><a name="l17252"></a><span class="lineno">17252</span>&#160;    <span class="comment">// Make sure memory information is already fetched.</span></div>
-<div class="line"><a name="l17253"></a><span class="lineno">17253</span>&#160;    VMA_ASSERT(GetMemoryTypeCount() &gt; 0);</div>
-<div class="line"><a name="l17254"></a><span class="lineno">17254</span>&#160; </div>
-<div class="line"><a name="l17255"></a><span class="lineno">17255</span>&#160;    uint32_t memoryTypeBits = UINT32_MAX;</div>
-<div class="line"><a name="l17256"></a><span class="lineno">17256</span>&#160; </div>
-<div class="line"><a name="l17257"></a><span class="lineno">17257</span>&#160;    <span class="keywordflow">if</span>(!m_UseAmdDeviceCoherentMemory)</div>
-<div class="line"><a name="l17258"></a><span class="lineno">17258</span>&#160;    {</div>
-<div class="line"><a name="l17259"></a><span class="lineno">17259</span>&#160;        <span class="comment">// Exclude memory types that have VK_MEMORY_PROPERTY_DEVICE_COHERENT_BIT_AMD.</span></div>
-<div class="line"><a name="l17260"></a><span class="lineno">17260</span>&#160;        <span class="keywordflow">for</span>(uint32_t memTypeIndex = 0; memTypeIndex &lt; GetMemoryTypeCount(); ++memTypeIndex)</div>
-<div class="line"><a name="l17261"></a><span class="lineno">17261</span>&#160;        {</div>
-<div class="line"><a name="l17262"></a><span class="lineno">17262</span>&#160;            <span class="keywordflow">if</span>((m_MemProps.memoryTypes[memTypeIndex].propertyFlags &amp; VK_MEMORY_PROPERTY_DEVICE_COHERENT_BIT_AMD_COPY) != 0)</div>
-<div class="line"><a name="l17263"></a><span class="lineno">17263</span>&#160;            {</div>
-<div class="line"><a name="l17264"></a><span class="lineno">17264</span>&#160;                memoryTypeBits &amp;= ~(1u &lt;&lt; memTypeIndex);</div>
+<div class="line"><a name="l17026"></a><span class="lineno">17026</span>&#160;        VmaBlockVector* <span class="keyword">const</span> pBlockVector = m_pBlockVectors[memTypeIndex];</div>
+<div class="line"><a name="l17027"></a><span class="lineno">17027</span>&#160;        VMA_ASSERT(pBlockVector);</div>
+<div class="line"><a name="l17028"></a><span class="lineno">17028</span>&#160;        pBlockVector-&gt;AddStats(pStats);</div>
+<div class="line"><a name="l17029"></a><span class="lineno">17029</span>&#160;    }</div>
+<div class="line"><a name="l17030"></a><span class="lineno">17030</span>&#160; </div>
+<div class="line"><a name="l17031"></a><span class="lineno">17031</span>&#160;    <span class="comment">// Process custom pools.</span></div>
+<div class="line"><a name="l17032"></a><span class="lineno">17032</span>&#160;    {</div>
+<div class="line"><a name="l17033"></a><span class="lineno">17033</span>&#160;        VmaMutexLockRead lock(m_PoolsMutex, m_UseMutex);</div>
+<div class="line"><a name="l17034"></a><span class="lineno">17034</span>&#160;        <span class="keywordflow">for</span>(<a class="code" href="struct_vma_pool.html">VmaPool</a> pool = m_Pools.Front(); pool != VMA_NULL; pool = m_Pools.GetNext(pool))</div>
+<div class="line"><a name="l17035"></a><span class="lineno">17035</span>&#160;        {</div>
+<div class="line"><a name="l17036"></a><span class="lineno">17036</span>&#160;            pool-&gt;m_BlockVector.AddStats(pStats);</div>
+<div class="line"><a name="l17037"></a><span class="lineno">17037</span>&#160;        }</div>
+<div class="line"><a name="l17038"></a><span class="lineno">17038</span>&#160;    }</div>
+<div class="line"><a name="l17039"></a><span class="lineno">17039</span>&#160; </div>
+<div class="line"><a name="l17040"></a><span class="lineno">17040</span>&#160;    <span class="comment">// Process dedicated allocations.</span></div>
+<div class="line"><a name="l17041"></a><span class="lineno">17041</span>&#160;    <span class="keywordflow">for</span>(uint32_t memTypeIndex = 0; memTypeIndex &lt; GetMemoryTypeCount(); ++memTypeIndex)</div>
+<div class="line"><a name="l17042"></a><span class="lineno">17042</span>&#160;    {</div>
+<div class="line"><a name="l17043"></a><span class="lineno">17043</span>&#160;        <span class="keyword">const</span> uint32_t memHeapIndex = MemoryTypeIndexToHeapIndex(memTypeIndex);</div>
+<div class="line"><a name="l17044"></a><span class="lineno">17044</span>&#160;        VmaMutexLockRead dedicatedAllocationsLock(m_DedicatedAllocationsMutex[memTypeIndex], m_UseMutex);</div>
+<div class="line"><a name="l17045"></a><span class="lineno">17045</span>&#160;        DedicatedAllocationLinkedList&amp; dedicatedAllocList = m_DedicatedAllocations[memTypeIndex];</div>
+<div class="line"><a name="l17046"></a><span class="lineno">17046</span>&#160;        <span class="keywordflow">for</span>(<a class="code" href="struct_vma_allocation.html">VmaAllocation</a> alloc = dedicatedAllocList.Front();</div>
+<div class="line"><a name="l17047"></a><span class="lineno">17047</span>&#160;            alloc != VMA_NULL; alloc = dedicatedAllocList.GetNext(alloc))</div>
+<div class="line"><a name="l17048"></a><span class="lineno">17048</span>&#160;        {</div>
+<div class="line"><a name="l17049"></a><span class="lineno">17049</span>&#160;            <a class="code" href="struct_vma_stat_info.html">VmaStatInfo</a> allocationStatInfo;</div>
+<div class="line"><a name="l17050"></a><span class="lineno">17050</span>&#160;            alloc-&gt;DedicatedAllocCalcStatsInfo(allocationStatInfo);</div>
+<div class="line"><a name="l17051"></a><span class="lineno">17051</span>&#160;            VmaAddStatInfo(pStats-&gt;<a class="code" href="struct_vma_stats.html#a2e8f5b3353f2fefef3c27f29e245a1f9">total</a>, allocationStatInfo);</div>
+<div class="line"><a name="l17052"></a><span class="lineno">17052</span>&#160;            VmaAddStatInfo(pStats-&gt;<a class="code" href="struct_vma_stats.html#a13e3caf754be79352c42408756309331">memoryType</a>[memTypeIndex], allocationStatInfo);</div>
+<div class="line"><a name="l17053"></a><span class="lineno">17053</span>&#160;            VmaAddStatInfo(pStats-&gt;<a class="code" href="struct_vma_stats.html#a0e6611508c29a187f0fd14ff1a0329c0">memoryHeap</a>[memHeapIndex], allocationStatInfo);</div>
+<div class="line"><a name="l17054"></a><span class="lineno">17054</span>&#160;        }</div>
+<div class="line"><a name="l17055"></a><span class="lineno">17055</span>&#160;    }</div>
+<div class="line"><a name="l17056"></a><span class="lineno">17056</span>&#160; </div>
+<div class="line"><a name="l17057"></a><span class="lineno">17057</span>&#160;    <span class="comment">// Postprocess.</span></div>
+<div class="line"><a name="l17058"></a><span class="lineno">17058</span>&#160;    VmaPostprocessCalcStatInfo(pStats-&gt;<a class="code" href="struct_vma_stats.html#a2e8f5b3353f2fefef3c27f29e245a1f9">total</a>);</div>
+<div class="line"><a name="l17059"></a><span class="lineno">17059</span>&#160;    <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> i = 0; i &lt; GetMemoryTypeCount(); ++i)</div>
+<div class="line"><a name="l17060"></a><span class="lineno">17060</span>&#160;        VmaPostprocessCalcStatInfo(pStats-&gt;<a class="code" href="struct_vma_stats.html#a13e3caf754be79352c42408756309331">memoryType</a>[i]);</div>
+<div class="line"><a name="l17061"></a><span class="lineno">17061</span>&#160;    <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> i = 0; i &lt; GetMemoryHeapCount(); ++i)</div>
+<div class="line"><a name="l17062"></a><span class="lineno">17062</span>&#160;        VmaPostprocessCalcStatInfo(pStats-&gt;<a class="code" href="struct_vma_stats.html#a0e6611508c29a187f0fd14ff1a0329c0">memoryHeap</a>[i]);</div>
+<div class="line"><a name="l17063"></a><span class="lineno">17063</span>&#160;}</div>
+<div class="line"><a name="l17064"></a><span class="lineno">17064</span>&#160; </div>
+<div class="line"><a name="l17065"></a><span class="lineno">17065</span>&#160;<span class="keywordtype">void</span> VmaAllocator_T::GetBudget(<a class="code" href="struct_vma_budget.html">VmaBudget</a>* outBudget, uint32_t firstHeap, uint32_t heapCount)</div>
+<div class="line"><a name="l17066"></a><span class="lineno">17066</span>&#160;{</div>
+<div class="line"><a name="l17067"></a><span class="lineno">17067</span>&#160;<span class="preprocessor">#if VMA_MEMORY_BUDGET</span></div>
+<div class="line"><a name="l17068"></a><span class="lineno">17068</span>&#160;    <span class="keywordflow">if</span>(m_UseExtMemoryBudget)</div>
+<div class="line"><a name="l17069"></a><span class="lineno">17069</span>&#160;    {</div>
+<div class="line"><a name="l17070"></a><span class="lineno">17070</span>&#160;        <span class="keywordflow">if</span>(m_Budget.m_OperationsSinceBudgetFetch &lt; 30)</div>
+<div class="line"><a name="l17071"></a><span class="lineno">17071</span>&#160;        {</div>
+<div class="line"><a name="l17072"></a><span class="lineno">17072</span>&#160;            VmaMutexLockRead lockRead(m_Budget.m_BudgetMutex, m_UseMutex);</div>
+<div class="line"><a name="l17073"></a><span class="lineno">17073</span>&#160;            <span class="keywordflow">for</span>(uint32_t i = 0; i &lt; heapCount; ++i, ++outBudget)</div>
+<div class="line"><a name="l17074"></a><span class="lineno">17074</span>&#160;            {</div>
+<div class="line"><a name="l17075"></a><span class="lineno">17075</span>&#160;                <span class="keyword">const</span> uint32_t heapIndex = firstHeap + i;</div>
+<div class="line"><a name="l17076"></a><span class="lineno">17076</span>&#160; </div>
+<div class="line"><a name="l17077"></a><span class="lineno">17077</span>&#160;                outBudget-&gt;<a class="code" href="struct_vma_budget.html#a58b492901baab685f466199124e514a0">blockBytes</a> = m_Budget.m_BlockBytes[heapIndex];</div>
+<div class="line"><a name="l17078"></a><span class="lineno">17078</span>&#160;                outBudget-&gt;<a class="code" href="struct_vma_budget.html#a7e2a6583ebd63e194951c542563804d8">allocationBytes</a> = m_Budget.m_AllocationBytes[heapIndex];</div>
+<div class="line"><a name="l17079"></a><span class="lineno">17079</span>&#160; </div>
+<div class="line"><a name="l17080"></a><span class="lineno">17080</span>&#160;                <span class="keywordflow">if</span>(m_Budget.m_VulkanUsage[heapIndex] + outBudget-&gt;<a class="code" href="struct_vma_budget.html#a58b492901baab685f466199124e514a0">blockBytes</a> &gt; m_Budget.m_BlockBytesAtBudgetFetch[heapIndex])</div>
+<div class="line"><a name="l17081"></a><span class="lineno">17081</span>&#160;                {</div>
+<div class="line"><a name="l17082"></a><span class="lineno">17082</span>&#160;                    outBudget-&gt;<a class="code" href="struct_vma_budget.html#a84dd1ecca8b0110259eb206dbadb11f6">usage</a> = m_Budget.m_VulkanUsage[heapIndex] +</div>
+<div class="line"><a name="l17083"></a><span class="lineno">17083</span>&#160;                        outBudget-&gt;<a class="code" href="struct_vma_budget.html#a58b492901baab685f466199124e514a0">blockBytes</a> - m_Budget.m_BlockBytesAtBudgetFetch[heapIndex];</div>
+<div class="line"><a name="l17084"></a><span class="lineno">17084</span>&#160;                }</div>
+<div class="line"><a name="l17085"></a><span class="lineno">17085</span>&#160;                <span class="keywordflow">else</span></div>
+<div class="line"><a name="l17086"></a><span class="lineno">17086</span>&#160;                {</div>
+<div class="line"><a name="l17087"></a><span class="lineno">17087</span>&#160;                    outBudget-&gt;<a class="code" href="struct_vma_budget.html#a84dd1ecca8b0110259eb206dbadb11f6">usage</a> = 0;</div>
+<div class="line"><a name="l17088"></a><span class="lineno">17088</span>&#160;                }</div>
+<div class="line"><a name="l17089"></a><span class="lineno">17089</span>&#160; </div>
+<div class="line"><a name="l17090"></a><span class="lineno">17090</span>&#160;                <span class="comment">// Have to take MIN with heap size because explicit HeapSizeLimit is included in it.</span></div>
+<div class="line"><a name="l17091"></a><span class="lineno">17091</span>&#160;                outBudget-&gt;<a class="code" href="struct_vma_budget.html#ab82e1d1754c2d210d0bdf90220bc6cdd">budget</a> = VMA_MIN(</div>
+<div class="line"><a name="l17092"></a><span class="lineno">17092</span>&#160;                    m_Budget.m_VulkanBudget[heapIndex], m_MemProps.memoryHeaps[heapIndex].size);</div>
+<div class="line"><a name="l17093"></a><span class="lineno">17093</span>&#160;            }</div>
+<div class="line"><a name="l17094"></a><span class="lineno">17094</span>&#160;        }</div>
+<div class="line"><a name="l17095"></a><span class="lineno">17095</span>&#160;        <span class="keywordflow">else</span></div>
+<div class="line"><a name="l17096"></a><span class="lineno">17096</span>&#160;        {</div>
+<div class="line"><a name="l17097"></a><span class="lineno">17097</span>&#160;            UpdateVulkanBudget(); <span class="comment">// Outside of mutex lock</span></div>
+<div class="line"><a name="l17098"></a><span class="lineno">17098</span>&#160;            GetBudget(outBudget, firstHeap, heapCount); <span class="comment">// Recursion</span></div>
+<div class="line"><a name="l17099"></a><span class="lineno">17099</span>&#160;        }</div>
+<div class="line"><a name="l17100"></a><span class="lineno">17100</span>&#160;    }</div>
+<div class="line"><a name="l17101"></a><span class="lineno">17101</span>&#160;    <span class="keywordflow">else</span></div>
+<div class="line"><a name="l17102"></a><span class="lineno">17102</span>&#160;<span class="preprocessor">#endif</span></div>
+<div class="line"><a name="l17103"></a><span class="lineno">17103</span>&#160;    {</div>
+<div class="line"><a name="l17104"></a><span class="lineno">17104</span>&#160;        <span class="keywordflow">for</span>(uint32_t i = 0; i &lt; heapCount; ++i, ++outBudget)</div>
+<div class="line"><a name="l17105"></a><span class="lineno">17105</span>&#160;        {</div>
+<div class="line"><a name="l17106"></a><span class="lineno">17106</span>&#160;            <span class="keyword">const</span> uint32_t heapIndex = firstHeap + i;</div>
+<div class="line"><a name="l17107"></a><span class="lineno">17107</span>&#160; </div>
+<div class="line"><a name="l17108"></a><span class="lineno">17108</span>&#160;            outBudget-&gt;<a class="code" href="struct_vma_budget.html#a58b492901baab685f466199124e514a0">blockBytes</a> = m_Budget.m_BlockBytes[heapIndex];</div>
+<div class="line"><a name="l17109"></a><span class="lineno">17109</span>&#160;            outBudget-&gt;<a class="code" href="struct_vma_budget.html#a7e2a6583ebd63e194951c542563804d8">allocationBytes</a> = m_Budget.m_AllocationBytes[heapIndex];</div>
+<div class="line"><a name="l17110"></a><span class="lineno">17110</span>&#160; </div>
+<div class="line"><a name="l17111"></a><span class="lineno">17111</span>&#160;            outBudget-&gt;<a class="code" href="struct_vma_budget.html#a84dd1ecca8b0110259eb206dbadb11f6">usage</a> = outBudget-&gt;<a class="code" href="struct_vma_budget.html#a58b492901baab685f466199124e514a0">blockBytes</a>;</div>
+<div class="line"><a name="l17112"></a><span class="lineno">17112</span>&#160;            outBudget-&gt;<a class="code" href="struct_vma_budget.html#ab82e1d1754c2d210d0bdf90220bc6cdd">budget</a> = m_MemProps.memoryHeaps[heapIndex].size * 8 / 10; <span class="comment">// 80% heuristics.</span></div>
+<div class="line"><a name="l17113"></a><span class="lineno">17113</span>&#160;        }</div>
+<div class="line"><a name="l17114"></a><span class="lineno">17114</span>&#160;    }</div>
+<div class="line"><a name="l17115"></a><span class="lineno">17115</span>&#160;}</div>
+<div class="line"><a name="l17116"></a><span class="lineno">17116</span>&#160; </div>
+<div class="line"><a name="l17117"></a><span class="lineno">17117</span>&#160;<span class="keyword">static</span> <span class="keyword">const</span> uint32_t VMA_VENDOR_ID_AMD = 4098;</div>
+<div class="line"><a name="l17118"></a><span class="lineno">17118</span>&#160; </div>
+<div class="line"><a name="l17119"></a><span class="lineno">17119</span>&#160;VkResult VmaAllocator_T::DefragmentationBegin(</div>
+<div class="line"><a name="l17120"></a><span class="lineno">17120</span>&#160;    <span class="keyword">const</span> <a class="code" href="struct_vma_defragmentation_info2.html">VmaDefragmentationInfo2</a>&amp; info,</div>
+<div class="line"><a name="l17121"></a><span class="lineno">17121</span>&#160;    <a class="code" href="struct_vma_defragmentation_stats.html">VmaDefragmentationStats</a>* pStats,</div>
+<div class="line"><a name="l17122"></a><span class="lineno">17122</span>&#160;    <a class="code" href="struct_vma_defragmentation_context.html">VmaDefragmentationContext</a>* pContext)</div>
+<div class="line"><a name="l17123"></a><span class="lineno">17123</span>&#160;{</div>
+<div class="line"><a name="l17124"></a><span class="lineno">17124</span>&#160;    <span class="keywordflow">if</span>(info.<a class="code" href="struct_vma_defragmentation_info2.html#a76d51a644dc7f5405d0cdd0025ecd0cc">pAllocationsChanged</a> != VMA_NULL)</div>
+<div class="line"><a name="l17125"></a><span class="lineno">17125</span>&#160;    {</div>
+<div class="line"><a name="l17126"></a><span class="lineno">17126</span>&#160;        memset(info.<a class="code" href="struct_vma_defragmentation_info2.html#a76d51a644dc7f5405d0cdd0025ecd0cc">pAllocationsChanged</a>, 0, info.<a class="code" href="struct_vma_defragmentation_info2.html#a3cf86ab32c1da779b4923d301a3056ba">allocationCount</a> * <span class="keyword">sizeof</span>(VkBool32));</div>
+<div class="line"><a name="l17127"></a><span class="lineno">17127</span>&#160;    }</div>
+<div class="line"><a name="l17128"></a><span class="lineno">17128</span>&#160; </div>
+<div class="line"><a name="l17129"></a><span class="lineno">17129</span>&#160;    *pContext = vma_new(<span class="keyword">this</span>, VmaDefragmentationContext_T)(</div>
+<div class="line"><a name="l17130"></a><span class="lineno">17130</span>&#160;        <span class="keyword">this</span>, m_CurrentFrameIndex.load(), info.<a class="code" href="struct_vma_defragmentation_info2.html#a53e844ee5633e229cf6daf14b2d9fff9">flags</a>, pStats);</div>
+<div class="line"><a name="l17131"></a><span class="lineno">17131</span>&#160; </div>
+<div class="line"><a name="l17132"></a><span class="lineno">17132</span>&#160;    (*pContext)-&gt;AddPools(info.<a class="code" href="struct_vma_defragmentation_info2.html#a7e70aa2a1081d849dcc7829b19d3ec9d">poolCount</a>, info.<a class="code" href="struct_vma_defragmentation_info2.html#a3c9c6aa5c97d5670f8e362b3a6f3029b">pPools</a>);</div>
+<div class="line"><a name="l17133"></a><span class="lineno">17133</span>&#160;    (*pContext)-&gt;AddAllocations(</div>
+<div class="line"><a name="l17134"></a><span class="lineno">17134</span>&#160;        info.<a class="code" href="struct_vma_defragmentation_info2.html#a3cf86ab32c1da779b4923d301a3056ba">allocationCount</a>, info.<a class="code" href="struct_vma_defragmentation_info2.html#ab6d288f29d028156cf73542d630a2e32">pAllocations</a>, info.<a class="code" href="struct_vma_defragmentation_info2.html#a76d51a644dc7f5405d0cdd0025ecd0cc">pAllocationsChanged</a>);</div>
+<div class="line"><a name="l17135"></a><span class="lineno">17135</span>&#160; </div>
+<div class="line"><a name="l17136"></a><span class="lineno">17136</span>&#160;    VkResult res = (*pContext)-&gt;Defragment(</div>
+<div class="line"><a name="l17137"></a><span class="lineno">17137</span>&#160;        info.<a class="code" href="struct_vma_defragmentation_info2.html#af78e1ea40c22d85137b65f6b384a4d0a">maxCpuBytesToMove</a>, info.<a class="code" href="struct_vma_defragmentation_info2.html#a94c2c7223d52878445a8cccce396b671">maxCpuAllocationsToMove</a>,</div>
+<div class="line"><a name="l17138"></a><span class="lineno">17138</span>&#160;        info.<a class="code" href="struct_vma_defragmentation_info2.html#a4ddbc898d0afe1518f863a3763628f08">maxGpuBytesToMove</a>, info.<a class="code" href="struct_vma_defragmentation_info2.html#a40d53d33e71ba0b66f844ed63c05a3f6">maxGpuAllocationsToMove</a>,</div>
+<div class="line"><a name="l17139"></a><span class="lineno">17139</span>&#160;        info.<a class="code" href="struct_vma_defragmentation_info2.html#a7f71f39590c5316771493d2333f9c1bd">commandBuffer</a>, pStats, info.<a class="code" href="struct_vma_defragmentation_info2.html#a53e844ee5633e229cf6daf14b2d9fff9">flags</a>);</div>
+<div class="line"><a name="l17140"></a><span class="lineno">17140</span>&#160; </div>
+<div class="line"><a name="l17141"></a><span class="lineno">17141</span>&#160;    <span class="keywordflow">if</span>(res != VK_NOT_READY)</div>
+<div class="line"><a name="l17142"></a><span class="lineno">17142</span>&#160;    {</div>
+<div class="line"><a name="l17143"></a><span class="lineno">17143</span>&#160;        vma_delete(<span class="keyword">this</span>, *pContext);</div>
+<div class="line"><a name="l17144"></a><span class="lineno">17144</span>&#160;        *pContext = VMA_NULL;</div>
+<div class="line"><a name="l17145"></a><span class="lineno">17145</span>&#160;    }</div>
+<div class="line"><a name="l17146"></a><span class="lineno">17146</span>&#160; </div>
+<div class="line"><a name="l17147"></a><span class="lineno">17147</span>&#160;    <span class="keywordflow">return</span> res;</div>
+<div class="line"><a name="l17148"></a><span class="lineno">17148</span>&#160;}</div>
+<div class="line"><a name="l17149"></a><span class="lineno">17149</span>&#160; </div>
+<div class="line"><a name="l17150"></a><span class="lineno">17150</span>&#160;VkResult VmaAllocator_T::DefragmentationEnd(</div>
+<div class="line"><a name="l17151"></a><span class="lineno">17151</span>&#160;    <a class="code" href="struct_vma_defragmentation_context.html">VmaDefragmentationContext</a> context)</div>
+<div class="line"><a name="l17152"></a><span class="lineno">17152</span>&#160;{</div>
+<div class="line"><a name="l17153"></a><span class="lineno">17153</span>&#160;    vma_delete(<span class="keyword">this</span>, context);</div>
+<div class="line"><a name="l17154"></a><span class="lineno">17154</span>&#160;    <span class="keywordflow">return</span> VK_SUCCESS;</div>
+<div class="line"><a name="l17155"></a><span class="lineno">17155</span>&#160;}</div>
+<div class="line"><a name="l17156"></a><span class="lineno">17156</span>&#160; </div>
+<div class="line"><a name="l17157"></a><span class="lineno">17157</span>&#160;VkResult VmaAllocator_T::DefragmentationPassBegin(</div>
+<div class="line"><a name="l17158"></a><span class="lineno">17158</span>&#160;    <a class="code" href="struct_vma_defragmentation_pass_info.html">VmaDefragmentationPassInfo</a>* pInfo,</div>
+<div class="line"><a name="l17159"></a><span class="lineno">17159</span>&#160;    <a class="code" href="struct_vma_defragmentation_context.html">VmaDefragmentationContext</a> context)</div>
+<div class="line"><a name="l17160"></a><span class="lineno">17160</span>&#160;{</div>
+<div class="line"><a name="l17161"></a><span class="lineno">17161</span>&#160;    <span class="keywordflow">return</span> context-&gt;DefragmentPassBegin(pInfo);</div>
+<div class="line"><a name="l17162"></a><span class="lineno">17162</span>&#160;}</div>
+<div class="line"><a name="l17163"></a><span class="lineno">17163</span>&#160;VkResult VmaAllocator_T::DefragmentationPassEnd(</div>
+<div class="line"><a name="l17164"></a><span class="lineno">17164</span>&#160;    <a class="code" href="struct_vma_defragmentation_context.html">VmaDefragmentationContext</a> context)</div>
+<div class="line"><a name="l17165"></a><span class="lineno">17165</span>&#160;{</div>
+<div class="line"><a name="l17166"></a><span class="lineno">17166</span>&#160;    <span class="keywordflow">return</span> context-&gt;DefragmentPassEnd();</div>
+<div class="line"><a name="l17167"></a><span class="lineno">17167</span>&#160; </div>
+<div class="line"><a name="l17168"></a><span class="lineno">17168</span>&#160;}</div>
+<div class="line"><a name="l17169"></a><span class="lineno">17169</span>&#160; </div>
+<div class="line"><a name="l17170"></a><span class="lineno">17170</span>&#160;<span class="keywordtype">void</span> VmaAllocator_T::GetAllocationInfo(<a class="code" href="struct_vma_allocation.html">VmaAllocation</a> hAllocation, <a class="code" href="struct_vma_allocation_info.html">VmaAllocationInfo</a>* pAllocationInfo)</div>
+<div class="line"><a name="l17171"></a><span class="lineno">17171</span>&#160;{</div>
+<div class="line"><a name="l17172"></a><span class="lineno">17172</span>&#160;    <span class="keywordflow">if</span>(hAllocation-&gt;CanBecomeLost())</div>
+<div class="line"><a name="l17173"></a><span class="lineno">17173</span>&#160;    {</div>
+<div class="line"><a name="l17174"></a><span class="lineno">17174</span>&#160;        <span class="comment">/*</span></div>
+<div class="line"><a name="l17175"></a><span class="lineno">17175</span>&#160;<span class="comment">        Warning: This is a carefully designed algorithm.</span></div>
+<div class="line"><a name="l17176"></a><span class="lineno">17176</span>&#160;<span class="comment">        Do not modify unless you really know what you&#39;re doing :)</span></div>
+<div class="line"><a name="l17177"></a><span class="lineno">17177</span>&#160;<span class="comment">        */</span></div>
+<div class="line"><a name="l17178"></a><span class="lineno">17178</span>&#160;        <span class="keyword">const</span> uint32_t localCurrFrameIndex = m_CurrentFrameIndex.load();</div>
+<div class="line"><a name="l17179"></a><span class="lineno">17179</span>&#160;        uint32_t localLastUseFrameIndex = hAllocation-&gt;GetLastUseFrameIndex();</div>
+<div class="line"><a name="l17180"></a><span class="lineno">17180</span>&#160;        <span class="keywordflow">for</span>(;;)</div>
+<div class="line"><a name="l17181"></a><span class="lineno">17181</span>&#160;        {</div>
+<div class="line"><a name="l17182"></a><span class="lineno">17182</span>&#160;            <span class="keywordflow">if</span>(localLastUseFrameIndex == VMA_FRAME_INDEX_LOST)</div>
+<div class="line"><a name="l17183"></a><span class="lineno">17183</span>&#160;            {</div>
+<div class="line"><a name="l17184"></a><span class="lineno">17184</span>&#160;                pAllocationInfo-&gt;<a class="code" href="struct_vma_allocation_info.html#a7f6b0aa58c135e488e6b40a388dad9d5">memoryType</a> = UINT32_MAX;</div>
+<div class="line"><a name="l17185"></a><span class="lineno">17185</span>&#160;                pAllocationInfo-&gt;<a class="code" href="struct_vma_allocation_info.html#ae0bfb7dfdf79a76ffefc9a94677a2f67">deviceMemory</a> = VK_NULL_HANDLE;</div>
+<div class="line"><a name="l17186"></a><span class="lineno">17186</span>&#160;                pAllocationInfo-&gt;<a class="code" href="struct_vma_allocation_info.html#a4a3c732388dbdc7a23f9365b00825268">offset</a> = 0;</div>
+<div class="line"><a name="l17187"></a><span class="lineno">17187</span>&#160;                pAllocationInfo-&gt;<a class="code" href="struct_vma_allocation_info.html#aac76d113a6a5ccbb09fea00fb25fd18f">size</a> = hAllocation-&gt;GetSize();</div>
+<div class="line"><a name="l17188"></a><span class="lineno">17188</span>&#160;                pAllocationInfo-&gt;<a class="code" href="struct_vma_allocation_info.html#a5eeffbe2d2f30f53370ff14aefbadbe2">pMappedData</a> = VMA_NULL;</div>
+<div class="line"><a name="l17189"></a><span class="lineno">17189</span>&#160;                pAllocationInfo-&gt;<a class="code" href="struct_vma_allocation_info.html#adc507656149c04de7ed95d0042ba2a13">pUserData</a> = hAllocation-&gt;GetUserData();</div>
+<div class="line"><a name="l17190"></a><span class="lineno">17190</span>&#160;                <span class="keywordflow">return</span>;</div>
+<div class="line"><a name="l17191"></a><span class="lineno">17191</span>&#160;            }</div>
+<div class="line"><a name="l17192"></a><span class="lineno">17192</span>&#160;            <span class="keywordflow">else</span> <span class="keywordflow">if</span>(localLastUseFrameIndex == localCurrFrameIndex)</div>
+<div class="line"><a name="l17193"></a><span class="lineno">17193</span>&#160;            {</div>
+<div class="line"><a name="l17194"></a><span class="lineno">17194</span>&#160;                pAllocationInfo-&gt;<a class="code" href="struct_vma_allocation_info.html#a7f6b0aa58c135e488e6b40a388dad9d5">memoryType</a> = hAllocation-&gt;GetMemoryTypeIndex();</div>
+<div class="line"><a name="l17195"></a><span class="lineno">17195</span>&#160;                pAllocationInfo-&gt;<a class="code" href="struct_vma_allocation_info.html#ae0bfb7dfdf79a76ffefc9a94677a2f67">deviceMemory</a> = hAllocation-&gt;GetMemory();</div>
+<div class="line"><a name="l17196"></a><span class="lineno">17196</span>&#160;                pAllocationInfo-&gt;<a class="code" href="struct_vma_allocation_info.html#a4a3c732388dbdc7a23f9365b00825268">offset</a> = hAllocation-&gt;GetOffset();</div>
+<div class="line"><a name="l17197"></a><span class="lineno">17197</span>&#160;                pAllocationInfo-&gt;<a class="code" href="struct_vma_allocation_info.html#aac76d113a6a5ccbb09fea00fb25fd18f">size</a> = hAllocation-&gt;GetSize();</div>
+<div class="line"><a name="l17198"></a><span class="lineno">17198</span>&#160;                pAllocationInfo-&gt;<a class="code" href="struct_vma_allocation_info.html#a5eeffbe2d2f30f53370ff14aefbadbe2">pMappedData</a> = VMA_NULL;</div>
+<div class="line"><a name="l17199"></a><span class="lineno">17199</span>&#160;                pAllocationInfo-&gt;<a class="code" href="struct_vma_allocation_info.html#adc507656149c04de7ed95d0042ba2a13">pUserData</a> = hAllocation-&gt;GetUserData();</div>
+<div class="line"><a name="l17200"></a><span class="lineno">17200</span>&#160;                <span class="keywordflow">return</span>;</div>
+<div class="line"><a name="l17201"></a><span class="lineno">17201</span>&#160;            }</div>
+<div class="line"><a name="l17202"></a><span class="lineno">17202</span>&#160;            <span class="keywordflow">else</span> <span class="comment">// Last use time earlier than current time.</span></div>
+<div class="line"><a name="l17203"></a><span class="lineno">17203</span>&#160;            {</div>
+<div class="line"><a name="l17204"></a><span class="lineno">17204</span>&#160;                <span class="keywordflow">if</span>(hAllocation-&gt;CompareExchangeLastUseFrameIndex(localLastUseFrameIndex, localCurrFrameIndex))</div>
+<div class="line"><a name="l17205"></a><span class="lineno">17205</span>&#160;                {</div>
+<div class="line"><a name="l17206"></a><span class="lineno">17206</span>&#160;                    localLastUseFrameIndex = localCurrFrameIndex;</div>
+<div class="line"><a name="l17207"></a><span class="lineno">17207</span>&#160;                }</div>
+<div class="line"><a name="l17208"></a><span class="lineno">17208</span>&#160;            }</div>
+<div class="line"><a name="l17209"></a><span class="lineno">17209</span>&#160;        }</div>
+<div class="line"><a name="l17210"></a><span class="lineno">17210</span>&#160;    }</div>
+<div class="line"><a name="l17211"></a><span class="lineno">17211</span>&#160;    <span class="keywordflow">else</span></div>
+<div class="line"><a name="l17212"></a><span class="lineno">17212</span>&#160;    {</div>
+<div class="line"><a name="l17213"></a><span class="lineno">17213</span>&#160;<span class="preprocessor">#if VMA_STATS_STRING_ENABLED</span></div>
+<div class="line"><a name="l17214"></a><span class="lineno">17214</span>&#160;        uint32_t localCurrFrameIndex = m_CurrentFrameIndex.load();</div>
+<div class="line"><a name="l17215"></a><span class="lineno">17215</span>&#160;        uint32_t localLastUseFrameIndex = hAllocation-&gt;GetLastUseFrameIndex();</div>
+<div class="line"><a name="l17216"></a><span class="lineno">17216</span>&#160;        <span class="keywordflow">for</span>(;;)</div>
+<div class="line"><a name="l17217"></a><span class="lineno">17217</span>&#160;        {</div>
+<div class="line"><a name="l17218"></a><span class="lineno">17218</span>&#160;            VMA_ASSERT(localLastUseFrameIndex != VMA_FRAME_INDEX_LOST);</div>
+<div class="line"><a name="l17219"></a><span class="lineno">17219</span>&#160;            <span class="keywordflow">if</span>(localLastUseFrameIndex == localCurrFrameIndex)</div>
+<div class="line"><a name="l17220"></a><span class="lineno">17220</span>&#160;            {</div>
+<div class="line"><a name="l17221"></a><span class="lineno">17221</span>&#160;                <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l17222"></a><span class="lineno">17222</span>&#160;            }</div>
+<div class="line"><a name="l17223"></a><span class="lineno">17223</span>&#160;            <span class="keywordflow">else</span> <span class="comment">// Last use time earlier than current time.</span></div>
+<div class="line"><a name="l17224"></a><span class="lineno">17224</span>&#160;            {</div>
+<div class="line"><a name="l17225"></a><span class="lineno">17225</span>&#160;                <span class="keywordflow">if</span>(hAllocation-&gt;CompareExchangeLastUseFrameIndex(localLastUseFrameIndex, localCurrFrameIndex))</div>
+<div class="line"><a name="l17226"></a><span class="lineno">17226</span>&#160;                {</div>
+<div class="line"><a name="l17227"></a><span class="lineno">17227</span>&#160;                    localLastUseFrameIndex = localCurrFrameIndex;</div>
+<div class="line"><a name="l17228"></a><span class="lineno">17228</span>&#160;                }</div>
+<div class="line"><a name="l17229"></a><span class="lineno">17229</span>&#160;            }</div>
+<div class="line"><a name="l17230"></a><span class="lineno">17230</span>&#160;        }</div>
+<div class="line"><a name="l17231"></a><span class="lineno">17231</span>&#160;<span class="preprocessor">#endif</span></div>
+<div class="line"><a name="l17232"></a><span class="lineno">17232</span>&#160; </div>
+<div class="line"><a name="l17233"></a><span class="lineno">17233</span>&#160;        pAllocationInfo-&gt;<a class="code" href="struct_vma_allocation_info.html#a7f6b0aa58c135e488e6b40a388dad9d5">memoryType</a> = hAllocation-&gt;GetMemoryTypeIndex();</div>
+<div class="line"><a name="l17234"></a><span class="lineno">17234</span>&#160;        pAllocationInfo-&gt;<a class="code" href="struct_vma_allocation_info.html#ae0bfb7dfdf79a76ffefc9a94677a2f67">deviceMemory</a> = hAllocation-&gt;GetMemory();</div>
+<div class="line"><a name="l17235"></a><span class="lineno">17235</span>&#160;        pAllocationInfo-&gt;<a class="code" href="struct_vma_allocation_info.html#a4a3c732388dbdc7a23f9365b00825268">offset</a> = hAllocation-&gt;GetOffset();</div>
+<div class="line"><a name="l17236"></a><span class="lineno">17236</span>&#160;        pAllocationInfo-&gt;<a class="code" href="struct_vma_allocation_info.html#aac76d113a6a5ccbb09fea00fb25fd18f">size</a> = hAllocation-&gt;GetSize();</div>
+<div class="line"><a name="l17237"></a><span class="lineno">17237</span>&#160;        pAllocationInfo-&gt;<a class="code" href="struct_vma_allocation_info.html#a5eeffbe2d2f30f53370ff14aefbadbe2">pMappedData</a> = hAllocation-&gt;GetMappedData();</div>
+<div class="line"><a name="l17238"></a><span class="lineno">17238</span>&#160;        pAllocationInfo-&gt;<a class="code" href="struct_vma_allocation_info.html#adc507656149c04de7ed95d0042ba2a13">pUserData</a> = hAllocation-&gt;GetUserData();</div>
+<div class="line"><a name="l17239"></a><span class="lineno">17239</span>&#160;    }</div>
+<div class="line"><a name="l17240"></a><span class="lineno">17240</span>&#160;}</div>
+<div class="line"><a name="l17241"></a><span class="lineno">17241</span>&#160; </div>
+<div class="line"><a name="l17242"></a><span class="lineno">17242</span>&#160;<span class="keywordtype">bool</span> VmaAllocator_T::TouchAllocation(<a class="code" href="struct_vma_allocation.html">VmaAllocation</a> hAllocation)</div>
+<div class="line"><a name="l17243"></a><span class="lineno">17243</span>&#160;{</div>
+<div class="line"><a name="l17244"></a><span class="lineno">17244</span>&#160;    <span class="comment">// This is a stripped-down version of VmaAllocator_T::GetAllocationInfo.</span></div>
+<div class="line"><a name="l17245"></a><span class="lineno">17245</span>&#160;    <span class="keywordflow">if</span>(hAllocation-&gt;CanBecomeLost())</div>
+<div class="line"><a name="l17246"></a><span class="lineno">17246</span>&#160;    {</div>
+<div class="line"><a name="l17247"></a><span class="lineno">17247</span>&#160;        uint32_t localCurrFrameIndex = m_CurrentFrameIndex.load();</div>
+<div class="line"><a name="l17248"></a><span class="lineno">17248</span>&#160;        uint32_t localLastUseFrameIndex = hAllocation-&gt;GetLastUseFrameIndex();</div>
+<div class="line"><a name="l17249"></a><span class="lineno">17249</span>&#160;        <span class="keywordflow">for</span>(;;)</div>
+<div class="line"><a name="l17250"></a><span class="lineno">17250</span>&#160;        {</div>
+<div class="line"><a name="l17251"></a><span class="lineno">17251</span>&#160;            <span class="keywordflow">if</span>(localLastUseFrameIndex == VMA_FRAME_INDEX_LOST)</div>
+<div class="line"><a name="l17252"></a><span class="lineno">17252</span>&#160;            {</div>
+<div class="line"><a name="l17253"></a><span class="lineno">17253</span>&#160;                <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
+<div class="line"><a name="l17254"></a><span class="lineno">17254</span>&#160;            }</div>
+<div class="line"><a name="l17255"></a><span class="lineno">17255</span>&#160;            <span class="keywordflow">else</span> <span class="keywordflow">if</span>(localLastUseFrameIndex == localCurrFrameIndex)</div>
+<div class="line"><a name="l17256"></a><span class="lineno">17256</span>&#160;            {</div>
+<div class="line"><a name="l17257"></a><span class="lineno">17257</span>&#160;                <span class="keywordflow">return</span> <span class="keyword">true</span>;</div>
+<div class="line"><a name="l17258"></a><span class="lineno">17258</span>&#160;            }</div>
+<div class="line"><a name="l17259"></a><span class="lineno">17259</span>&#160;            <span class="keywordflow">else</span> <span class="comment">// Last use time earlier than current time.</span></div>
+<div class="line"><a name="l17260"></a><span class="lineno">17260</span>&#160;            {</div>
+<div class="line"><a name="l17261"></a><span class="lineno">17261</span>&#160;                <span class="keywordflow">if</span>(hAllocation-&gt;CompareExchangeLastUseFrameIndex(localLastUseFrameIndex, localCurrFrameIndex))</div>
+<div class="line"><a name="l17262"></a><span class="lineno">17262</span>&#160;                {</div>
+<div class="line"><a name="l17263"></a><span class="lineno">17263</span>&#160;                    localLastUseFrameIndex = localCurrFrameIndex;</div>
+<div class="line"><a name="l17264"></a><span class="lineno">17264</span>&#160;                }</div>
 <div class="line"><a name="l17265"></a><span class="lineno">17265</span>&#160;            }</div>
 <div class="line"><a name="l17266"></a><span class="lineno">17266</span>&#160;        }</div>
 <div class="line"><a name="l17267"></a><span class="lineno">17267</span>&#160;    }</div>
-<div class="line"><a name="l17268"></a><span class="lineno">17268</span>&#160; </div>
-<div class="line"><a name="l17269"></a><span class="lineno">17269</span>&#160;    <span class="keywordflow">return</span> memoryTypeBits;</div>
-<div class="line"><a name="l17270"></a><span class="lineno">17270</span>&#160;}</div>
-<div class="line"><a name="l17271"></a><span class="lineno">17271</span>&#160; </div>
-<div class="line"><a name="l17272"></a><span class="lineno">17272</span>&#160;<span class="keywordtype">bool</span> VmaAllocator_T::GetFlushOrInvalidateRange(</div>
-<div class="line"><a name="l17273"></a><span class="lineno">17273</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation,</div>
-<div class="line"><a name="l17274"></a><span class="lineno">17274</span>&#160;    VkDeviceSize offset, VkDeviceSize size,</div>
-<div class="line"><a name="l17275"></a><span class="lineno">17275</span>&#160;    VkMappedMemoryRange&amp; outRange)<span class="keyword"> const</span></div>
-<div class="line"><a name="l17276"></a><span class="lineno">17276</span>&#160;<span class="keyword"></span>{</div>
-<div class="line"><a name="l17277"></a><span class="lineno">17277</span>&#160;    <span class="keyword">const</span> uint32_t memTypeIndex = allocation-&gt;GetMemoryTypeIndex();</div>
-<div class="line"><a name="l17278"></a><span class="lineno">17278</span>&#160;    <span class="keywordflow">if</span>(size &gt; 0 &amp;&amp; IsMemoryTypeNonCoherent(memTypeIndex))</div>
-<div class="line"><a name="l17279"></a><span class="lineno">17279</span>&#160;    {</div>
-<div class="line"><a name="l17280"></a><span class="lineno">17280</span>&#160;        <span class="keyword">const</span> VkDeviceSize nonCoherentAtomSize = m_PhysicalDeviceProperties.limits.nonCoherentAtomSize;</div>
-<div class="line"><a name="l17281"></a><span class="lineno">17281</span>&#160;        <span class="keyword">const</span> VkDeviceSize allocationSize = allocation-&gt;GetSize();</div>
-<div class="line"><a name="l17282"></a><span class="lineno">17282</span>&#160;        VMA_ASSERT(offset &lt;= allocationSize);</div>
-<div class="line"><a name="l17283"></a><span class="lineno">17283</span>&#160; </div>
-<div class="line"><a name="l17284"></a><span class="lineno">17284</span>&#160;        outRange.sType = VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE;</div>
-<div class="line"><a name="l17285"></a><span class="lineno">17285</span>&#160;        outRange.pNext = VMA_NULL;</div>
-<div class="line"><a name="l17286"></a><span class="lineno">17286</span>&#160;        outRange.memory = allocation-&gt;GetMemory();</div>
-<div class="line"><a name="l17287"></a><span class="lineno">17287</span>&#160; </div>
-<div class="line"><a name="l17288"></a><span class="lineno">17288</span>&#160;        <span class="keywordflow">switch</span>(allocation-&gt;GetType())</div>
-<div class="line"><a name="l17289"></a><span class="lineno">17289</span>&#160;        {</div>
-<div class="line"><a name="l17290"></a><span class="lineno">17290</span>&#160;        <span class="keywordflow">case</span> VmaAllocation_T::ALLOCATION_TYPE_DEDICATED:</div>
-<div class="line"><a name="l17291"></a><span class="lineno">17291</span>&#160;            outRange.offset = VmaAlignDown(offset, nonCoherentAtomSize);</div>
-<div class="line"><a name="l17292"></a><span class="lineno">17292</span>&#160;            <span class="keywordflow">if</span>(size == VK_WHOLE_SIZE)</div>
-<div class="line"><a name="l17293"></a><span class="lineno">17293</span>&#160;            {</div>
-<div class="line"><a name="l17294"></a><span class="lineno">17294</span>&#160;                outRange.size = allocationSize - outRange.offset;</div>
-<div class="line"><a name="l17295"></a><span class="lineno">17295</span>&#160;            }</div>
-<div class="line"><a name="l17296"></a><span class="lineno">17296</span>&#160;            <span class="keywordflow">else</span></div>
-<div class="line"><a name="l17297"></a><span class="lineno">17297</span>&#160;            {</div>
-<div class="line"><a name="l17298"></a><span class="lineno">17298</span>&#160;                VMA_ASSERT(offset + size &lt;= allocationSize);</div>
-<div class="line"><a name="l17299"></a><span class="lineno">17299</span>&#160;                outRange.size = VMA_MIN(</div>
-<div class="line"><a name="l17300"></a><span class="lineno">17300</span>&#160;                    VmaAlignUp(size + (offset - outRange.offset), nonCoherentAtomSize),</div>
-<div class="line"><a name="l17301"></a><span class="lineno">17301</span>&#160;                    allocationSize - outRange.offset);</div>
-<div class="line"><a name="l17302"></a><span class="lineno">17302</span>&#160;            }</div>
-<div class="line"><a name="l17303"></a><span class="lineno">17303</span>&#160;            <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l17304"></a><span class="lineno">17304</span>&#160;        <span class="keywordflow">case</span> VmaAllocation_T::ALLOCATION_TYPE_BLOCK:</div>
-<div class="line"><a name="l17305"></a><span class="lineno">17305</span>&#160;        {</div>
-<div class="line"><a name="l17306"></a><span class="lineno">17306</span>&#160;            <span class="comment">// 1. Still within this allocation.</span></div>
-<div class="line"><a name="l17307"></a><span class="lineno">17307</span>&#160;            outRange.offset = VmaAlignDown(offset, nonCoherentAtomSize);</div>
-<div class="line"><a name="l17308"></a><span class="lineno">17308</span>&#160;            <span class="keywordflow">if</span>(size == VK_WHOLE_SIZE)</div>
-<div class="line"><a name="l17309"></a><span class="lineno">17309</span>&#160;            {</div>
-<div class="line"><a name="l17310"></a><span class="lineno">17310</span>&#160;                size = allocationSize - offset;</div>
-<div class="line"><a name="l17311"></a><span class="lineno">17311</span>&#160;            }</div>
-<div class="line"><a name="l17312"></a><span class="lineno">17312</span>&#160;            <span class="keywordflow">else</span></div>
-<div class="line"><a name="l17313"></a><span class="lineno">17313</span>&#160;            {</div>
-<div class="line"><a name="l17314"></a><span class="lineno">17314</span>&#160;                VMA_ASSERT(offset + size &lt;= allocationSize);</div>
-<div class="line"><a name="l17315"></a><span class="lineno">17315</span>&#160;            }</div>
-<div class="line"><a name="l17316"></a><span class="lineno">17316</span>&#160;            outRange.size = VmaAlignUp(size + (offset - outRange.offset), nonCoherentAtomSize);</div>
-<div class="line"><a name="l17317"></a><span class="lineno">17317</span>&#160; </div>
-<div class="line"><a name="l17318"></a><span class="lineno">17318</span>&#160;            <span class="comment">// 2. Adjust to whole block.</span></div>
-<div class="line"><a name="l17319"></a><span class="lineno">17319</span>&#160;            <span class="keyword">const</span> VkDeviceSize allocationOffset = allocation-&gt;GetOffset();</div>
-<div class="line"><a name="l17320"></a><span class="lineno">17320</span>&#160;            VMA_ASSERT(allocationOffset % nonCoherentAtomSize == 0);</div>
-<div class="line"><a name="l17321"></a><span class="lineno">17321</span>&#160;            <span class="keyword">const</span> VkDeviceSize blockSize = allocation-&gt;GetBlock()-&gt;m_pMetadata-&gt;GetSize();</div>
-<div class="line"><a name="l17322"></a><span class="lineno">17322</span>&#160;            outRange.offset += allocationOffset;</div>
-<div class="line"><a name="l17323"></a><span class="lineno">17323</span>&#160;            outRange.size = VMA_MIN(outRange.size, blockSize - outRange.offset);</div>
-<div class="line"><a name="l17324"></a><span class="lineno">17324</span>&#160; </div>
-<div class="line"><a name="l17325"></a><span class="lineno">17325</span>&#160;            <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l17326"></a><span class="lineno">17326</span>&#160;        }</div>
-<div class="line"><a name="l17327"></a><span class="lineno">17327</span>&#160;        <span class="keywordflow">default</span>:</div>
-<div class="line"><a name="l17328"></a><span class="lineno">17328</span>&#160;            VMA_ASSERT(0);</div>
-<div class="line"><a name="l17329"></a><span class="lineno">17329</span>&#160;        }</div>
-<div class="line"><a name="l17330"></a><span class="lineno">17330</span>&#160;        <span class="keywordflow">return</span> <span class="keyword">true</span>;</div>
-<div class="line"><a name="l17331"></a><span class="lineno">17331</span>&#160;    }</div>
-<div class="line"><a name="l17332"></a><span class="lineno">17332</span>&#160;    <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
-<div class="line"><a name="l17333"></a><span class="lineno">17333</span>&#160;}</div>
-<div class="line"><a name="l17334"></a><span class="lineno">17334</span>&#160; </div>
-<div class="line"><a name="l17335"></a><span class="lineno">17335</span>&#160;<span class="preprocessor">#if VMA_MEMORY_BUDGET</span></div>
+<div class="line"><a name="l17268"></a><span class="lineno">17268</span>&#160;    <span class="keywordflow">else</span></div>
+<div class="line"><a name="l17269"></a><span class="lineno">17269</span>&#160;    {</div>
+<div class="line"><a name="l17270"></a><span class="lineno">17270</span>&#160;<span class="preprocessor">#if VMA_STATS_STRING_ENABLED</span></div>
+<div class="line"><a name="l17271"></a><span class="lineno">17271</span>&#160;        uint32_t localCurrFrameIndex = m_CurrentFrameIndex.load();</div>
+<div class="line"><a name="l17272"></a><span class="lineno">17272</span>&#160;        uint32_t localLastUseFrameIndex = hAllocation-&gt;GetLastUseFrameIndex();</div>
+<div class="line"><a name="l17273"></a><span class="lineno">17273</span>&#160;        <span class="keywordflow">for</span>(;;)</div>
+<div class="line"><a name="l17274"></a><span class="lineno">17274</span>&#160;        {</div>
+<div class="line"><a name="l17275"></a><span class="lineno">17275</span>&#160;            VMA_ASSERT(localLastUseFrameIndex != VMA_FRAME_INDEX_LOST);</div>
+<div class="line"><a name="l17276"></a><span class="lineno">17276</span>&#160;            <span class="keywordflow">if</span>(localLastUseFrameIndex == localCurrFrameIndex)</div>
+<div class="line"><a name="l17277"></a><span class="lineno">17277</span>&#160;            {</div>
+<div class="line"><a name="l17278"></a><span class="lineno">17278</span>&#160;                <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l17279"></a><span class="lineno">17279</span>&#160;            }</div>
+<div class="line"><a name="l17280"></a><span class="lineno">17280</span>&#160;            <span class="keywordflow">else</span> <span class="comment">// Last use time earlier than current time.</span></div>
+<div class="line"><a name="l17281"></a><span class="lineno">17281</span>&#160;            {</div>
+<div class="line"><a name="l17282"></a><span class="lineno">17282</span>&#160;                <span class="keywordflow">if</span>(hAllocation-&gt;CompareExchangeLastUseFrameIndex(localLastUseFrameIndex, localCurrFrameIndex))</div>
+<div class="line"><a name="l17283"></a><span class="lineno">17283</span>&#160;                {</div>
+<div class="line"><a name="l17284"></a><span class="lineno">17284</span>&#160;                    localLastUseFrameIndex = localCurrFrameIndex;</div>
+<div class="line"><a name="l17285"></a><span class="lineno">17285</span>&#160;                }</div>
+<div class="line"><a name="l17286"></a><span class="lineno">17286</span>&#160;            }</div>
+<div class="line"><a name="l17287"></a><span class="lineno">17287</span>&#160;        }</div>
+<div class="line"><a name="l17288"></a><span class="lineno">17288</span>&#160;<span class="preprocessor">#endif</span></div>
+<div class="line"><a name="l17289"></a><span class="lineno">17289</span>&#160; </div>
+<div class="line"><a name="l17290"></a><span class="lineno">17290</span>&#160;        <span class="keywordflow">return</span> <span class="keyword">true</span>;</div>
+<div class="line"><a name="l17291"></a><span class="lineno">17291</span>&#160;    }</div>
+<div class="line"><a name="l17292"></a><span class="lineno">17292</span>&#160;}</div>
+<div class="line"><a name="l17293"></a><span class="lineno">17293</span>&#160; </div>
+<div class="line"><a name="l17294"></a><span class="lineno">17294</span>&#160;VkResult VmaAllocator_T::CreatePool(<span class="keyword">const</span> <a class="code" href="struct_vma_pool_create_info.html">VmaPoolCreateInfo</a>* pCreateInfo, <a class="code" href="struct_vma_pool.html">VmaPool</a>* pPool)</div>
+<div class="line"><a name="l17295"></a><span class="lineno">17295</span>&#160;{</div>
+<div class="line"><a name="l17296"></a><span class="lineno">17296</span>&#160;    VMA_DEBUG_LOG(<span class="stringliteral">&quot;  CreatePool: MemoryTypeIndex=%u, flags=%u&quot;</span>, pCreateInfo-&gt;<a class="code" href="struct_vma_pool_create_info.html#a596fa76b685d3f1f688f84a709a5b319">memoryTypeIndex</a>, pCreateInfo-&gt;<a class="code" href="struct_vma_pool_create_info.html#a8405139f63d078340ae74513a59f5446">flags</a>);</div>
+<div class="line"><a name="l17297"></a><span class="lineno">17297</span>&#160; </div>
+<div class="line"><a name="l17298"></a><span class="lineno">17298</span>&#160;    <a class="code" href="struct_vma_pool_create_info.html">VmaPoolCreateInfo</a> newCreateInfo = *pCreateInfo;</div>
+<div class="line"><a name="l17299"></a><span class="lineno">17299</span>&#160; </div>
+<div class="line"><a name="l17300"></a><span class="lineno">17300</span>&#160;    <span class="keywordflow">if</span>(newCreateInfo.<a class="code" href="struct_vma_pool_create_info.html#ae41142f2834fcdc82baa4883c187b75c">maxBlockCount</a> == 0)</div>
+<div class="line"><a name="l17301"></a><span class="lineno">17301</span>&#160;    {</div>
+<div class="line"><a name="l17302"></a><span class="lineno">17302</span>&#160;        newCreateInfo.<a class="code" href="struct_vma_pool_create_info.html#ae41142f2834fcdc82baa4883c187b75c">maxBlockCount</a> = SIZE_MAX;</div>
+<div class="line"><a name="l17303"></a><span class="lineno">17303</span>&#160;    }</div>
+<div class="line"><a name="l17304"></a><span class="lineno">17304</span>&#160;    <span class="keywordflow">if</span>(newCreateInfo.<a class="code" href="struct_vma_pool_create_info.html#ad8006fb803185c0a699d30f3e9a865ae">minBlockCount</a> &gt; newCreateInfo.<a class="code" href="struct_vma_pool_create_info.html#ae41142f2834fcdc82baa4883c187b75c">maxBlockCount</a>)</div>
+<div class="line"><a name="l17305"></a><span class="lineno">17305</span>&#160;    {</div>
+<div class="line"><a name="l17306"></a><span class="lineno">17306</span>&#160;        <span class="keywordflow">return</span> VK_ERROR_INITIALIZATION_FAILED;</div>
+<div class="line"><a name="l17307"></a><span class="lineno">17307</span>&#160;    }</div>
+<div class="line"><a name="l17308"></a><span class="lineno">17308</span>&#160;    <span class="comment">// Memory type index out of range or forbidden.</span></div>
+<div class="line"><a name="l17309"></a><span class="lineno">17309</span>&#160;    <span class="keywordflow">if</span>(pCreateInfo-&gt;<a class="code" href="struct_vma_pool_create_info.html#a596fa76b685d3f1f688f84a709a5b319">memoryTypeIndex</a> &gt;= GetMemoryTypeCount() ||</div>
+<div class="line"><a name="l17310"></a><span class="lineno">17310</span>&#160;        ((1u &lt;&lt; pCreateInfo-&gt;<a class="code" href="struct_vma_pool_create_info.html#a596fa76b685d3f1f688f84a709a5b319">memoryTypeIndex</a>) &amp; m_GlobalMemoryTypeBits) == 0)</div>
+<div class="line"><a name="l17311"></a><span class="lineno">17311</span>&#160;    {</div>
+<div class="line"><a name="l17312"></a><span class="lineno">17312</span>&#160;        <span class="keywordflow">return</span> VK_ERROR_FEATURE_NOT_PRESENT;</div>
+<div class="line"><a name="l17313"></a><span class="lineno">17313</span>&#160;    }</div>
+<div class="line"><a name="l17314"></a><span class="lineno">17314</span>&#160; </div>
+<div class="line"><a name="l17315"></a><span class="lineno">17315</span>&#160;    <span class="keyword">const</span> VkDeviceSize preferredBlockSize = CalcPreferredBlockSize(newCreateInfo.<a class="code" href="struct_vma_pool_create_info.html#a596fa76b685d3f1f688f84a709a5b319">memoryTypeIndex</a>);</div>
+<div class="line"><a name="l17316"></a><span class="lineno">17316</span>&#160; </div>
+<div class="line"><a name="l17317"></a><span class="lineno">17317</span>&#160;    *pPool = vma_new(<span class="keyword">this</span>, VmaPool_T)(<span class="keyword">this</span>, newCreateInfo, preferredBlockSize);</div>
+<div class="line"><a name="l17318"></a><span class="lineno">17318</span>&#160; </div>
+<div class="line"><a name="l17319"></a><span class="lineno">17319</span>&#160;    VkResult res = (*pPool)-&gt;m_BlockVector.CreateMinBlocks();</div>
+<div class="line"><a name="l17320"></a><span class="lineno">17320</span>&#160;    <span class="keywordflow">if</span>(res != VK_SUCCESS)</div>
+<div class="line"><a name="l17321"></a><span class="lineno">17321</span>&#160;    {</div>
+<div class="line"><a name="l17322"></a><span class="lineno">17322</span>&#160;        vma_delete(<span class="keyword">this</span>, *pPool);</div>
+<div class="line"><a name="l17323"></a><span class="lineno">17323</span>&#160;        *pPool = VMA_NULL;</div>
+<div class="line"><a name="l17324"></a><span class="lineno">17324</span>&#160;        <span class="keywordflow">return</span> res;</div>
+<div class="line"><a name="l17325"></a><span class="lineno">17325</span>&#160;    }</div>
+<div class="line"><a name="l17326"></a><span class="lineno">17326</span>&#160; </div>
+<div class="line"><a name="l17327"></a><span class="lineno">17327</span>&#160;    <span class="comment">// Add to m_Pools.</span></div>
+<div class="line"><a name="l17328"></a><span class="lineno">17328</span>&#160;    {</div>
+<div class="line"><a name="l17329"></a><span class="lineno">17329</span>&#160;        VmaMutexLockWrite lock(m_PoolsMutex, m_UseMutex);</div>
+<div class="line"><a name="l17330"></a><span class="lineno">17330</span>&#160;        (*pPool)-&gt;SetId(m_NextPoolId++);</div>
+<div class="line"><a name="l17331"></a><span class="lineno">17331</span>&#160;        m_Pools.PushBack(*pPool);</div>
+<div class="line"><a name="l17332"></a><span class="lineno">17332</span>&#160;    }</div>
+<div class="line"><a name="l17333"></a><span class="lineno">17333</span>&#160; </div>
+<div class="line"><a name="l17334"></a><span class="lineno">17334</span>&#160;    <span class="keywordflow">return</span> VK_SUCCESS;</div>
+<div class="line"><a name="l17335"></a><span class="lineno">17335</span>&#160;}</div>
 <div class="line"><a name="l17336"></a><span class="lineno">17336</span>&#160; </div>
-<div class="line"><a name="l17337"></a><span class="lineno">17337</span>&#160;<span class="keywordtype">void</span> VmaAllocator_T::UpdateVulkanBudget()</div>
+<div class="line"><a name="l17337"></a><span class="lineno">17337</span>&#160;<span class="keywordtype">void</span> VmaAllocator_T::DestroyPool(<a class="code" href="struct_vma_pool.html">VmaPool</a> pool)</div>
 <div class="line"><a name="l17338"></a><span class="lineno">17338</span>&#160;{</div>
-<div class="line"><a name="l17339"></a><span class="lineno">17339</span>&#160;    VMA_ASSERT(m_UseExtMemoryBudget);</div>
-<div class="line"><a name="l17340"></a><span class="lineno">17340</span>&#160; </div>
-<div class="line"><a name="l17341"></a><span class="lineno">17341</span>&#160;    VkPhysicalDeviceMemoryProperties2KHR memProps = { VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MEMORY_PROPERTIES_2_KHR };</div>
-<div class="line"><a name="l17342"></a><span class="lineno">17342</span>&#160; </div>
-<div class="line"><a name="l17343"></a><span class="lineno">17343</span>&#160;    VkPhysicalDeviceMemoryBudgetPropertiesEXT budgetProps = { VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MEMORY_BUDGET_PROPERTIES_EXT };</div>
-<div class="line"><a name="l17344"></a><span class="lineno">17344</span>&#160;    VmaPnextChainPushFront(&amp;memProps, &amp;budgetProps);</div>
-<div class="line"><a name="l17345"></a><span class="lineno">17345</span>&#160; </div>
-<div class="line"><a name="l17346"></a><span class="lineno">17346</span>&#160;    GetVulkanFunctions().vkGetPhysicalDeviceMemoryProperties2KHR(m_PhysicalDevice, &amp;memProps);</div>
+<div class="line"><a name="l17339"></a><span class="lineno">17339</span>&#160;    <span class="comment">// Remove from m_Pools.</span></div>
+<div class="line"><a name="l17340"></a><span class="lineno">17340</span>&#160;    {</div>
+<div class="line"><a name="l17341"></a><span class="lineno">17341</span>&#160;        VmaMutexLockWrite lock(m_PoolsMutex, m_UseMutex);</div>
+<div class="line"><a name="l17342"></a><span class="lineno">17342</span>&#160;        m_Pools.Remove(pool);</div>
+<div class="line"><a name="l17343"></a><span class="lineno">17343</span>&#160;    }</div>
+<div class="line"><a name="l17344"></a><span class="lineno">17344</span>&#160; </div>
+<div class="line"><a name="l17345"></a><span class="lineno">17345</span>&#160;    vma_delete(<span class="keyword">this</span>, pool);</div>
+<div class="line"><a name="l17346"></a><span class="lineno">17346</span>&#160;}</div>
 <div class="line"><a name="l17347"></a><span class="lineno">17347</span>&#160; </div>
-<div class="line"><a name="l17348"></a><span class="lineno">17348</span>&#160;    {</div>
-<div class="line"><a name="l17349"></a><span class="lineno">17349</span>&#160;        VmaMutexLockWrite lockWrite(m_Budget.m_BudgetMutex, m_UseMutex);</div>
-<div class="line"><a name="l17350"></a><span class="lineno">17350</span>&#160; </div>
-<div class="line"><a name="l17351"></a><span class="lineno">17351</span>&#160;        <span class="keywordflow">for</span>(uint32_t heapIndex = 0; heapIndex &lt; GetMemoryHeapCount(); ++heapIndex)</div>
-<div class="line"><a name="l17352"></a><span class="lineno">17352</span>&#160;        {</div>
-<div class="line"><a name="l17353"></a><span class="lineno">17353</span>&#160;            m_Budget.m_VulkanUsage[heapIndex] = budgetProps.heapUsage[heapIndex];</div>
-<div class="line"><a name="l17354"></a><span class="lineno">17354</span>&#160;            m_Budget.m_VulkanBudget[heapIndex] = budgetProps.heapBudget[heapIndex];</div>
-<div class="line"><a name="l17355"></a><span class="lineno">17355</span>&#160;            m_Budget.m_BlockBytesAtBudgetFetch[heapIndex] = m_Budget.m_BlockBytes[heapIndex].load();</div>
+<div class="line"><a name="l17348"></a><span class="lineno">17348</span>&#160;<span class="keywordtype">void</span> VmaAllocator_T::GetPoolStats(<a class="code" href="struct_vma_pool.html">VmaPool</a> pool, <a class="code" href="struct_vma_pool_stats.html">VmaPoolStats</a>* pPoolStats)</div>
+<div class="line"><a name="l17349"></a><span class="lineno">17349</span>&#160;{</div>
+<div class="line"><a name="l17350"></a><span class="lineno">17350</span>&#160;    pool-&gt;m_BlockVector.GetPoolStats(pPoolStats);</div>
+<div class="line"><a name="l17351"></a><span class="lineno">17351</span>&#160;}</div>
+<div class="line"><a name="l17352"></a><span class="lineno">17352</span>&#160; </div>
+<div class="line"><a name="l17353"></a><span class="lineno">17353</span>&#160;<span class="keywordtype">void</span> VmaAllocator_T::SetCurrentFrameIndex(uint32_t frameIndex)</div>
+<div class="line"><a name="l17354"></a><span class="lineno">17354</span>&#160;{</div>
+<div class="line"><a name="l17355"></a><span class="lineno">17355</span>&#160;    m_CurrentFrameIndex.store(frameIndex);</div>
 <div class="line"><a name="l17356"></a><span class="lineno">17356</span>&#160; </div>
-<div class="line"><a name="l17357"></a><span class="lineno">17357</span>&#160;            <span class="comment">// Some bugged drivers return the budget incorrectly, e.g. 0 or much bigger than heap size.</span></div>
-<div class="line"><a name="l17358"></a><span class="lineno">17358</span>&#160;            <span class="keywordflow">if</span>(m_Budget.m_VulkanBudget[heapIndex] == 0)</div>
-<div class="line"><a name="l17359"></a><span class="lineno">17359</span>&#160;            {</div>
-<div class="line"><a name="l17360"></a><span class="lineno">17360</span>&#160;                m_Budget.m_VulkanBudget[heapIndex] = m_MemProps.memoryHeaps[heapIndex].size * 8 / 10; <span class="comment">// 80% heuristics.</span></div>
-<div class="line"><a name="l17361"></a><span class="lineno">17361</span>&#160;            }</div>
-<div class="line"><a name="l17362"></a><span class="lineno">17362</span>&#160;            <span class="keywordflow">else</span> <span class="keywordflow">if</span>(m_Budget.m_VulkanBudget[heapIndex] &gt; m_MemProps.memoryHeaps[heapIndex].size)</div>
-<div class="line"><a name="l17363"></a><span class="lineno">17363</span>&#160;            {</div>
-<div class="line"><a name="l17364"></a><span class="lineno">17364</span>&#160;                m_Budget.m_VulkanBudget[heapIndex] = m_MemProps.memoryHeaps[heapIndex].size;</div>
-<div class="line"><a name="l17365"></a><span class="lineno">17365</span>&#160;            }</div>
-<div class="line"><a name="l17366"></a><span class="lineno">17366</span>&#160;            <span class="keywordflow">if</span>(m_Budget.m_VulkanUsage[heapIndex] == 0 &amp;&amp; m_Budget.m_BlockBytesAtBudgetFetch[heapIndex] &gt; 0)</div>
-<div class="line"><a name="l17367"></a><span class="lineno">17367</span>&#160;            {</div>
-<div class="line"><a name="l17368"></a><span class="lineno">17368</span>&#160;                m_Budget.m_VulkanUsage[heapIndex] = m_Budget.m_BlockBytesAtBudgetFetch[heapIndex];</div>
-<div class="line"><a name="l17369"></a><span class="lineno">17369</span>&#160;            }</div>
-<div class="line"><a name="l17370"></a><span class="lineno">17370</span>&#160;        }</div>
-<div class="line"><a name="l17371"></a><span class="lineno">17371</span>&#160;        m_Budget.m_OperationsSinceBudgetFetch = 0;</div>
-<div class="line"><a name="l17372"></a><span class="lineno">17372</span>&#160;    }</div>
-<div class="line"><a name="l17373"></a><span class="lineno">17373</span>&#160;}</div>
-<div class="line"><a name="l17374"></a><span class="lineno">17374</span>&#160; </div>
-<div class="line"><a name="l17375"></a><span class="lineno">17375</span>&#160;<span class="preprocessor">#endif // #if VMA_MEMORY_BUDGET</span></div>
-<div class="line"><a name="l17376"></a><span class="lineno">17376</span>&#160; </div>
-<div class="line"><a name="l17377"></a><span class="lineno">17377</span>&#160;<span class="keywordtype">void</span> VmaAllocator_T::FillAllocation(<span class="keyword">const</span> <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> hAllocation, uint8_t pattern)</div>
-<div class="line"><a name="l17378"></a><span class="lineno">17378</span>&#160;{</div>
-<div class="line"><a name="l17379"></a><span class="lineno">17379</span>&#160;    <span class="keywordflow">if</span>(VMA_DEBUG_INITIALIZE_ALLOCATIONS &amp;&amp;</div>
-<div class="line"><a name="l17380"></a><span class="lineno">17380</span>&#160;        !hAllocation-&gt;CanBecomeLost() &amp;&amp;</div>
-<div class="line"><a name="l17381"></a><span class="lineno">17381</span>&#160;        (m_MemProps.memoryTypes[hAllocation-&gt;GetMemoryTypeIndex()].propertyFlags &amp; VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT) != 0)</div>
-<div class="line"><a name="l17382"></a><span class="lineno">17382</span>&#160;    {</div>
-<div class="line"><a name="l17383"></a><span class="lineno">17383</span>&#160;        <span class="keywordtype">void</span>* pData = VMA_NULL;</div>
-<div class="line"><a name="l17384"></a><span class="lineno">17384</span>&#160;        VkResult res = Map(hAllocation, &amp;pData);</div>
-<div class="line"><a name="l17385"></a><span class="lineno">17385</span>&#160;        <span class="keywordflow">if</span>(res == VK_SUCCESS)</div>
-<div class="line"><a name="l17386"></a><span class="lineno">17386</span>&#160;        {</div>
-<div class="line"><a name="l17387"></a><span class="lineno">17387</span>&#160;            memset(pData, (<span class="keywordtype">int</span>)pattern, (<span class="keywordtype">size_t</span>)hAllocation-&gt;GetSize());</div>
-<div class="line"><a name="l17388"></a><span class="lineno">17388</span>&#160;            FlushOrInvalidateAllocation(hAllocation, 0, VK_WHOLE_SIZE, VMA_CACHE_FLUSH);</div>
-<div class="line"><a name="l17389"></a><span class="lineno">17389</span>&#160;            Unmap(hAllocation);</div>
-<div class="line"><a name="l17390"></a><span class="lineno">17390</span>&#160;        }</div>
-<div class="line"><a name="l17391"></a><span class="lineno">17391</span>&#160;        <span class="keywordflow">else</span></div>
-<div class="line"><a name="l17392"></a><span class="lineno">17392</span>&#160;        {</div>
-<div class="line"><a name="l17393"></a><span class="lineno">17393</span>&#160;            VMA_ASSERT(0 &amp;&amp; <span class="stringliteral">&quot;VMA_DEBUG_INITIALIZE_ALLOCATIONS is enabled, but couldn&#39;t map memory to fill allocation.&quot;</span>);</div>
-<div class="line"><a name="l17394"></a><span class="lineno">17394</span>&#160;        }</div>
-<div class="line"><a name="l17395"></a><span class="lineno">17395</span>&#160;    }</div>
-<div class="line"><a name="l17396"></a><span class="lineno">17396</span>&#160;}</div>
-<div class="line"><a name="l17397"></a><span class="lineno">17397</span>&#160; </div>
-<div class="line"><a name="l17398"></a><span class="lineno">17398</span>&#160;uint32_t VmaAllocator_T::GetGpuDefragmentationMemoryTypeBits()</div>
-<div class="line"><a name="l17399"></a><span class="lineno">17399</span>&#160;{</div>
-<div class="line"><a name="l17400"></a><span class="lineno">17400</span>&#160;    uint32_t memoryTypeBits = m_GpuDefragmentationMemoryTypeBits.load();</div>
-<div class="line"><a name="l17401"></a><span class="lineno">17401</span>&#160;    <span class="keywordflow">if</span>(memoryTypeBits == UINT32_MAX)</div>
-<div class="line"><a name="l17402"></a><span class="lineno">17402</span>&#160;    {</div>
-<div class="line"><a name="l17403"></a><span class="lineno">17403</span>&#160;        memoryTypeBits = CalculateGpuDefragmentationMemoryTypeBits();</div>
-<div class="line"><a name="l17404"></a><span class="lineno">17404</span>&#160;        m_GpuDefragmentationMemoryTypeBits.store(memoryTypeBits);</div>
-<div class="line"><a name="l17405"></a><span class="lineno">17405</span>&#160;    }</div>
-<div class="line"><a name="l17406"></a><span class="lineno">17406</span>&#160;    <span class="keywordflow">return</span> memoryTypeBits;</div>
-<div class="line"><a name="l17407"></a><span class="lineno">17407</span>&#160;}</div>
-<div class="line"><a name="l17408"></a><span class="lineno">17408</span>&#160; </div>
-<div class="line"><a name="l17409"></a><span class="lineno">17409</span>&#160;<span class="preprocessor">#if VMA_STATS_STRING_ENABLED</span></div>
-<div class="line"><a name="l17410"></a><span class="lineno">17410</span>&#160; </div>
-<div class="line"><a name="l17411"></a><span class="lineno">17411</span>&#160;<span class="keywordtype">void</span> VmaAllocator_T::PrintDetailedMap(VmaJsonWriter&amp; json)</div>
-<div class="line"><a name="l17412"></a><span class="lineno">17412</span>&#160;{</div>
-<div class="line"><a name="l17413"></a><span class="lineno">17413</span>&#160;    <span class="keywordtype">bool</span> dedicatedAllocationsStarted = <span class="keyword">false</span>;</div>
-<div class="line"><a name="l17414"></a><span class="lineno">17414</span>&#160;    <span class="keywordflow">for</span>(uint32_t memTypeIndex = 0; memTypeIndex &lt; GetMemoryTypeCount(); ++memTypeIndex)</div>
-<div class="line"><a name="l17415"></a><span class="lineno">17415</span>&#160;    {</div>
-<div class="line"><a name="l17416"></a><span class="lineno">17416</span>&#160;        VmaMutexLockRead dedicatedAllocationsLock(m_DedicatedAllocationsMutex[memTypeIndex], m_UseMutex);</div>
-<div class="line"><a name="l17417"></a><span class="lineno">17417</span>&#160;        AllocationVectorType* <span class="keyword">const</span> pDedicatedAllocVector = m_pDedicatedAllocations[memTypeIndex];</div>
-<div class="line"><a name="l17418"></a><span class="lineno">17418</span>&#160;        VMA_ASSERT(pDedicatedAllocVector);</div>
-<div class="line"><a name="l17419"></a><span class="lineno">17419</span>&#160;        <span class="keywordflow">if</span>(pDedicatedAllocVector-&gt;empty() == <span class="keyword">false</span>)</div>
-<div class="line"><a name="l17420"></a><span class="lineno">17420</span>&#160;        {</div>
-<div class="line"><a name="l17421"></a><span class="lineno">17421</span>&#160;            <span class="keywordflow">if</span>(dedicatedAllocationsStarted == <span class="keyword">false</span>)</div>
-<div class="line"><a name="l17422"></a><span class="lineno">17422</span>&#160;            {</div>
-<div class="line"><a name="l17423"></a><span class="lineno">17423</span>&#160;                dedicatedAllocationsStarted = <span class="keyword">true</span>;</div>
-<div class="line"><a name="l17424"></a><span class="lineno">17424</span>&#160;                json.WriteString(<span class="stringliteral">&quot;DedicatedAllocations&quot;</span>);</div>
-<div class="line"><a name="l17425"></a><span class="lineno">17425</span>&#160;                json.BeginObject();</div>
-<div class="line"><a name="l17426"></a><span class="lineno">17426</span>&#160;            }</div>
-<div class="line"><a name="l17427"></a><span class="lineno">17427</span>&#160; </div>
-<div class="line"><a name="l17428"></a><span class="lineno">17428</span>&#160;            json.BeginString(<span class="stringliteral">&quot;Type &quot;</span>);</div>
-<div class="line"><a name="l17429"></a><span class="lineno">17429</span>&#160;            json.ContinueString(memTypeIndex);</div>
-<div class="line"><a name="l17430"></a><span class="lineno">17430</span>&#160;            json.EndString();</div>
-<div class="line"><a name="l17431"></a><span class="lineno">17431</span>&#160;                </div>
-<div class="line"><a name="l17432"></a><span class="lineno">17432</span>&#160;            json.BeginArray();</div>
-<div class="line"><a name="l17433"></a><span class="lineno">17433</span>&#160; </div>
-<div class="line"><a name="l17434"></a><span class="lineno">17434</span>&#160;            <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> i = 0; i &lt; pDedicatedAllocVector-&gt;size(); ++i)</div>
-<div class="line"><a name="l17435"></a><span class="lineno">17435</span>&#160;            {</div>
-<div class="line"><a name="l17436"></a><span class="lineno">17436</span>&#160;                json.BeginObject(<span class="keyword">true</span>);</div>
-<div class="line"><a name="l17437"></a><span class="lineno">17437</span>&#160;                <span class="keyword">const</span> <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> hAlloc = (*pDedicatedAllocVector)[i];</div>
-<div class="line"><a name="l17438"></a><span class="lineno">17438</span>&#160;                hAlloc-&gt;PrintParameters(json);</div>
-<div class="line"><a name="l17439"></a><span class="lineno">17439</span>&#160;                json.EndObject();</div>
-<div class="line"><a name="l17440"></a><span class="lineno">17440</span>&#160;            }</div>
-<div class="line"><a name="l17441"></a><span class="lineno">17441</span>&#160; </div>
-<div class="line"><a name="l17442"></a><span class="lineno">17442</span>&#160;            json.EndArray();</div>
-<div class="line"><a name="l17443"></a><span class="lineno">17443</span>&#160;        }</div>
-<div class="line"><a name="l17444"></a><span class="lineno">17444</span>&#160;    }</div>
-<div class="line"><a name="l17445"></a><span class="lineno">17445</span>&#160;    <span class="keywordflow">if</span>(dedicatedAllocationsStarted)</div>
-<div class="line"><a name="l17446"></a><span class="lineno">17446</span>&#160;    {</div>
-<div class="line"><a name="l17447"></a><span class="lineno">17447</span>&#160;        json.EndObject();</div>
-<div class="line"><a name="l17448"></a><span class="lineno">17448</span>&#160;    }</div>
-<div class="line"><a name="l17449"></a><span class="lineno">17449</span>&#160; </div>
-<div class="line"><a name="l17450"></a><span class="lineno">17450</span>&#160;    {</div>
-<div class="line"><a name="l17451"></a><span class="lineno">17451</span>&#160;        <span class="keywordtype">bool</span> allocationsStarted = <span class="keyword">false</span>;</div>
-<div class="line"><a name="l17452"></a><span class="lineno">17452</span>&#160;        <span class="keywordflow">for</span>(uint32_t memTypeIndex = 0; memTypeIndex &lt; GetMemoryTypeCount(); ++memTypeIndex)</div>
-<div class="line"><a name="l17453"></a><span class="lineno">17453</span>&#160;        {</div>
-<div class="line"><a name="l17454"></a><span class="lineno">17454</span>&#160;            <span class="keywordflow">if</span>(m_pBlockVectors[memTypeIndex]-&gt;IsEmpty() == <span class="keyword">false</span>)</div>
-<div class="line"><a name="l17455"></a><span class="lineno">17455</span>&#160;            {</div>
-<div class="line"><a name="l17456"></a><span class="lineno">17456</span>&#160;                <span class="keywordflow">if</span>(allocationsStarted == <span class="keyword">false</span>)</div>
-<div class="line"><a name="l17457"></a><span class="lineno">17457</span>&#160;                {</div>
-<div class="line"><a name="l17458"></a><span class="lineno">17458</span>&#160;                    allocationsStarted = <span class="keyword">true</span>;</div>
-<div class="line"><a name="l17459"></a><span class="lineno">17459</span>&#160;                    json.WriteString(<span class="stringliteral">&quot;DefaultPools&quot;</span>);</div>
-<div class="line"><a name="l17460"></a><span class="lineno">17460</span>&#160;                    json.BeginObject();</div>
-<div class="line"><a name="l17461"></a><span class="lineno">17461</span>&#160;                }</div>
-<div class="line"><a name="l17462"></a><span class="lineno">17462</span>&#160; </div>
-<div class="line"><a name="l17463"></a><span class="lineno">17463</span>&#160;                json.BeginString(<span class="stringliteral">&quot;Type &quot;</span>);</div>
-<div class="line"><a name="l17464"></a><span class="lineno">17464</span>&#160;                json.ContinueString(memTypeIndex);</div>
-<div class="line"><a name="l17465"></a><span class="lineno">17465</span>&#160;                json.EndString();</div>
-<div class="line"><a name="l17466"></a><span class="lineno">17466</span>&#160; </div>
-<div class="line"><a name="l17467"></a><span class="lineno">17467</span>&#160;                m_pBlockVectors[memTypeIndex]-&gt;PrintDetailedMap(json);</div>
-<div class="line"><a name="l17468"></a><span class="lineno">17468</span>&#160;            }</div>
-<div class="line"><a name="l17469"></a><span class="lineno">17469</span>&#160;        }</div>
-<div class="line"><a name="l17470"></a><span class="lineno">17470</span>&#160;        <span class="keywordflow">if</span>(allocationsStarted)</div>
-<div class="line"><a name="l17471"></a><span class="lineno">17471</span>&#160;        {</div>
-<div class="line"><a name="l17472"></a><span class="lineno">17472</span>&#160;            json.EndObject();</div>
-<div class="line"><a name="l17473"></a><span class="lineno">17473</span>&#160;        }</div>
-<div class="line"><a name="l17474"></a><span class="lineno">17474</span>&#160;    }</div>
-<div class="line"><a name="l17475"></a><span class="lineno">17475</span>&#160; </div>
-<div class="line"><a name="l17476"></a><span class="lineno">17476</span>&#160;    <span class="comment">// Custom pools</span></div>
-<div class="line"><a name="l17477"></a><span class="lineno">17477</span>&#160;    {</div>
-<div class="line"><a name="l17478"></a><span class="lineno">17478</span>&#160;        VmaMutexLockRead lock(m_PoolsMutex, m_UseMutex);</div>
-<div class="line"><a name="l17479"></a><span class="lineno">17479</span>&#160;        <span class="keyword">const</span> <span class="keywordtype">size_t</span> poolCount = m_Pools.size();</div>
-<div class="line"><a name="l17480"></a><span class="lineno">17480</span>&#160;        <span class="keywordflow">if</span>(poolCount &gt; 0)</div>
-<div class="line"><a name="l17481"></a><span class="lineno">17481</span>&#160;        {</div>
-<div class="line"><a name="l17482"></a><span class="lineno">17482</span>&#160;            json.WriteString(<span class="stringliteral">&quot;Pools&quot;</span>);</div>
-<div class="line"><a name="l17483"></a><span class="lineno">17483</span>&#160;            json.BeginObject();</div>
-<div class="line"><a name="l17484"></a><span class="lineno">17484</span>&#160;            <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> poolIndex = 0; poolIndex &lt; poolCount; ++poolIndex)</div>
-<div class="line"><a name="l17485"></a><span class="lineno">17485</span>&#160;            {</div>
-<div class="line"><a name="l17486"></a><span class="lineno">17486</span>&#160;                json.BeginString();</div>
-<div class="line"><a name="l17487"></a><span class="lineno">17487</span>&#160;                json.ContinueString(m_Pools[poolIndex]-&gt;GetId());</div>
-<div class="line"><a name="l17488"></a><span class="lineno">17488</span>&#160;                json.EndString();</div>
-<div class="line"><a name="l17489"></a><span class="lineno">17489</span>&#160; </div>
-<div class="line"><a name="l17490"></a><span class="lineno">17490</span>&#160;                m_Pools[poolIndex]-&gt;m_BlockVector.PrintDetailedMap(json);</div>
-<div class="line"><a name="l17491"></a><span class="lineno">17491</span>&#160;            }</div>
-<div class="line"><a name="l17492"></a><span class="lineno">17492</span>&#160;            json.EndObject();</div>
-<div class="line"><a name="l17493"></a><span class="lineno">17493</span>&#160;        }</div>
+<div class="line"><a name="l17357"></a><span class="lineno">17357</span>&#160;<span class="preprocessor">#if VMA_MEMORY_BUDGET</span></div>
+<div class="line"><a name="l17358"></a><span class="lineno">17358</span>&#160;    <span class="keywordflow">if</span>(m_UseExtMemoryBudget)</div>
+<div class="line"><a name="l17359"></a><span class="lineno">17359</span>&#160;    {</div>
+<div class="line"><a name="l17360"></a><span class="lineno">17360</span>&#160;        UpdateVulkanBudget();</div>
+<div class="line"><a name="l17361"></a><span class="lineno">17361</span>&#160;    }</div>
+<div class="line"><a name="l17362"></a><span class="lineno">17362</span>&#160;<span class="preprocessor">#endif </span><span class="comment">// #if VMA_MEMORY_BUDGET</span></div>
+<div class="line"><a name="l17363"></a><span class="lineno">17363</span>&#160;}</div>
+<div class="line"><a name="l17364"></a><span class="lineno">17364</span>&#160; </div>
+<div class="line"><a name="l17365"></a><span class="lineno">17365</span>&#160;<span class="keywordtype">void</span> VmaAllocator_T::MakePoolAllocationsLost(</div>
+<div class="line"><a name="l17366"></a><span class="lineno">17366</span>&#160;    <a class="code" href="struct_vma_pool.html">VmaPool</a> hPool,</div>
+<div class="line"><a name="l17367"></a><span class="lineno">17367</span>&#160;    <span class="keywordtype">size_t</span>* pLostAllocationCount)</div>
+<div class="line"><a name="l17368"></a><span class="lineno">17368</span>&#160;{</div>
+<div class="line"><a name="l17369"></a><span class="lineno">17369</span>&#160;    hPool-&gt;m_BlockVector.MakePoolAllocationsLost(</div>
+<div class="line"><a name="l17370"></a><span class="lineno">17370</span>&#160;        m_CurrentFrameIndex.load(),</div>
+<div class="line"><a name="l17371"></a><span class="lineno">17371</span>&#160;        pLostAllocationCount);</div>
+<div class="line"><a name="l17372"></a><span class="lineno">17372</span>&#160;}</div>
+<div class="line"><a name="l17373"></a><span class="lineno">17373</span>&#160; </div>
+<div class="line"><a name="l17374"></a><span class="lineno">17374</span>&#160;VkResult VmaAllocator_T::CheckPoolCorruption(<a class="code" href="struct_vma_pool.html">VmaPool</a> hPool)</div>
+<div class="line"><a name="l17375"></a><span class="lineno">17375</span>&#160;{</div>
+<div class="line"><a name="l17376"></a><span class="lineno">17376</span>&#160;    <span class="keywordflow">return</span> hPool-&gt;m_BlockVector.CheckCorruption();</div>
+<div class="line"><a name="l17377"></a><span class="lineno">17377</span>&#160;}</div>
+<div class="line"><a name="l17378"></a><span class="lineno">17378</span>&#160; </div>
+<div class="line"><a name="l17379"></a><span class="lineno">17379</span>&#160;VkResult VmaAllocator_T::CheckCorruption(uint32_t memoryTypeBits)</div>
+<div class="line"><a name="l17380"></a><span class="lineno">17380</span>&#160;{</div>
+<div class="line"><a name="l17381"></a><span class="lineno">17381</span>&#160;    VkResult finalRes = VK_ERROR_FEATURE_NOT_PRESENT;</div>
+<div class="line"><a name="l17382"></a><span class="lineno">17382</span>&#160; </div>
+<div class="line"><a name="l17383"></a><span class="lineno">17383</span>&#160;    <span class="comment">// Process default pools.</span></div>
+<div class="line"><a name="l17384"></a><span class="lineno">17384</span>&#160;    <span class="keywordflow">for</span>(uint32_t memTypeIndex = 0; memTypeIndex &lt; GetMemoryTypeCount(); ++memTypeIndex)</div>
+<div class="line"><a name="l17385"></a><span class="lineno">17385</span>&#160;    {</div>
+<div class="line"><a name="l17386"></a><span class="lineno">17386</span>&#160;        <span class="keywordflow">if</span>(((1u &lt;&lt; memTypeIndex) &amp; memoryTypeBits) != 0)</div>
+<div class="line"><a name="l17387"></a><span class="lineno">17387</span>&#160;        {</div>
+<div class="line"><a name="l17388"></a><span class="lineno">17388</span>&#160;            VmaBlockVector* <span class="keyword">const</span> pBlockVector = m_pBlockVectors[memTypeIndex];</div>
+<div class="line"><a name="l17389"></a><span class="lineno">17389</span>&#160;            VMA_ASSERT(pBlockVector);</div>
+<div class="line"><a name="l17390"></a><span class="lineno">17390</span>&#160;            VkResult localRes = pBlockVector-&gt;CheckCorruption();</div>
+<div class="line"><a name="l17391"></a><span class="lineno">17391</span>&#160;            <span class="keywordflow">switch</span>(localRes)</div>
+<div class="line"><a name="l17392"></a><span class="lineno">17392</span>&#160;            {</div>
+<div class="line"><a name="l17393"></a><span class="lineno">17393</span>&#160;            <span class="keywordflow">case</span> VK_ERROR_FEATURE_NOT_PRESENT:</div>
+<div class="line"><a name="l17394"></a><span class="lineno">17394</span>&#160;                <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l17395"></a><span class="lineno">17395</span>&#160;            <span class="keywordflow">case</span> VK_SUCCESS:</div>
+<div class="line"><a name="l17396"></a><span class="lineno">17396</span>&#160;                finalRes = VK_SUCCESS;</div>
+<div class="line"><a name="l17397"></a><span class="lineno">17397</span>&#160;                <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l17398"></a><span class="lineno">17398</span>&#160;            <span class="keywordflow">default</span>:</div>
+<div class="line"><a name="l17399"></a><span class="lineno">17399</span>&#160;                <span class="keywordflow">return</span> localRes;</div>
+<div class="line"><a name="l17400"></a><span class="lineno">17400</span>&#160;            }</div>
+<div class="line"><a name="l17401"></a><span class="lineno">17401</span>&#160;        }</div>
+<div class="line"><a name="l17402"></a><span class="lineno">17402</span>&#160;    }</div>
+<div class="line"><a name="l17403"></a><span class="lineno">17403</span>&#160; </div>
+<div class="line"><a name="l17404"></a><span class="lineno">17404</span>&#160;    <span class="comment">// Process custom pools.</span></div>
+<div class="line"><a name="l17405"></a><span class="lineno">17405</span>&#160;    {</div>
+<div class="line"><a name="l17406"></a><span class="lineno">17406</span>&#160;        VmaMutexLockRead lock(m_PoolsMutex, m_UseMutex);</div>
+<div class="line"><a name="l17407"></a><span class="lineno">17407</span>&#160;        <span class="keywordflow">for</span>(<a class="code" href="struct_vma_pool.html">VmaPool</a> pool = m_Pools.Front(); pool != VMA_NULL; pool = m_Pools.GetNext(pool))</div>
+<div class="line"><a name="l17408"></a><span class="lineno">17408</span>&#160;        {</div>
+<div class="line"><a name="l17409"></a><span class="lineno">17409</span>&#160;            <span class="keywordflow">if</span>(((1u &lt;&lt; pool-&gt;m_BlockVector.GetMemoryTypeIndex()) &amp; memoryTypeBits) != 0)</div>
+<div class="line"><a name="l17410"></a><span class="lineno">17410</span>&#160;            {</div>
+<div class="line"><a name="l17411"></a><span class="lineno">17411</span>&#160;                VkResult localRes = pool-&gt;m_BlockVector.CheckCorruption();</div>
+<div class="line"><a name="l17412"></a><span class="lineno">17412</span>&#160;                <span class="keywordflow">switch</span>(localRes)</div>
+<div class="line"><a name="l17413"></a><span class="lineno">17413</span>&#160;                {</div>
+<div class="line"><a name="l17414"></a><span class="lineno">17414</span>&#160;                <span class="keywordflow">case</span> VK_ERROR_FEATURE_NOT_PRESENT:</div>
+<div class="line"><a name="l17415"></a><span class="lineno">17415</span>&#160;                    <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l17416"></a><span class="lineno">17416</span>&#160;                <span class="keywordflow">case</span> VK_SUCCESS:</div>
+<div class="line"><a name="l17417"></a><span class="lineno">17417</span>&#160;                    finalRes = VK_SUCCESS;</div>
+<div class="line"><a name="l17418"></a><span class="lineno">17418</span>&#160;                    <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l17419"></a><span class="lineno">17419</span>&#160;                <span class="keywordflow">default</span>:</div>
+<div class="line"><a name="l17420"></a><span class="lineno">17420</span>&#160;                    <span class="keywordflow">return</span> localRes;</div>
+<div class="line"><a name="l17421"></a><span class="lineno">17421</span>&#160;                }</div>
+<div class="line"><a name="l17422"></a><span class="lineno">17422</span>&#160;            }</div>
+<div class="line"><a name="l17423"></a><span class="lineno">17423</span>&#160;        }</div>
+<div class="line"><a name="l17424"></a><span class="lineno">17424</span>&#160;    }</div>
+<div class="line"><a name="l17425"></a><span class="lineno">17425</span>&#160; </div>
+<div class="line"><a name="l17426"></a><span class="lineno">17426</span>&#160;    <span class="keywordflow">return</span> finalRes;</div>
+<div class="line"><a name="l17427"></a><span class="lineno">17427</span>&#160;}</div>
+<div class="line"><a name="l17428"></a><span class="lineno">17428</span>&#160; </div>
+<div class="line"><a name="l17429"></a><span class="lineno">17429</span>&#160;<span class="keywordtype">void</span> VmaAllocator_T::CreateLostAllocation(<a class="code" href="struct_vma_allocation.html">VmaAllocation</a>* pAllocation)</div>
+<div class="line"><a name="l17430"></a><span class="lineno">17430</span>&#160;{</div>
+<div class="line"><a name="l17431"></a><span class="lineno">17431</span>&#160;    *pAllocation = m_AllocationObjectAllocator.Allocate(VMA_FRAME_INDEX_LOST, <span class="keyword">false</span>);</div>
+<div class="line"><a name="l17432"></a><span class="lineno">17432</span>&#160;    (*pAllocation)-&gt;InitLost();</div>
+<div class="line"><a name="l17433"></a><span class="lineno">17433</span>&#160;}</div>
+<div class="line"><a name="l17434"></a><span class="lineno">17434</span>&#160; </div>
+<div class="line"><a name="l17435"></a><span class="lineno">17435</span>&#160;<span class="comment">// An object that increments given atomic but decrements it back in the destructor unless Commit() is called.</span></div>
+<div class="line"><a name="l17436"></a><span class="lineno">17436</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt;</div>
+<div class="line"><a name="l17437"></a><span class="lineno">17437</span>&#160;<span class="keyword">struct </span>AtomicTransactionalIncrement</div>
+<div class="line"><a name="l17438"></a><span class="lineno">17438</span>&#160;{</div>
+<div class="line"><a name="l17439"></a><span class="lineno">17439</span>&#160;<span class="keyword">public</span>:</div>
+<div class="line"><a name="l17440"></a><span class="lineno">17440</span>&#160;    <span class="keyword">typedef</span> std::atomic&lt;T&gt; AtomicT;</div>
+<div class="line"><a name="l17441"></a><span class="lineno">17441</span>&#160;    ~AtomicTransactionalIncrement()</div>
+<div class="line"><a name="l17442"></a><span class="lineno">17442</span>&#160;    {</div>
+<div class="line"><a name="l17443"></a><span class="lineno">17443</span>&#160;        <span class="keywordflow">if</span>(m_Atomic)</div>
+<div class="line"><a name="l17444"></a><span class="lineno">17444</span>&#160;            --(*m_Atomic);</div>
+<div class="line"><a name="l17445"></a><span class="lineno">17445</span>&#160;    }</div>
+<div class="line"><a name="l17446"></a><span class="lineno">17446</span>&#160;    T Increment(AtomicT* atomic)</div>
+<div class="line"><a name="l17447"></a><span class="lineno">17447</span>&#160;    {</div>
+<div class="line"><a name="l17448"></a><span class="lineno">17448</span>&#160;        m_Atomic = atomic;</div>
+<div class="line"><a name="l17449"></a><span class="lineno">17449</span>&#160;        <span class="keywordflow">return</span> m_Atomic-&gt;fetch_add(1);</div>
+<div class="line"><a name="l17450"></a><span class="lineno">17450</span>&#160;    }</div>
+<div class="line"><a name="l17451"></a><span class="lineno">17451</span>&#160;    <span class="keywordtype">void</span> Commit()</div>
+<div class="line"><a name="l17452"></a><span class="lineno">17452</span>&#160;    {</div>
+<div class="line"><a name="l17453"></a><span class="lineno">17453</span>&#160;        m_Atomic = <span class="keyword">nullptr</span>;</div>
+<div class="line"><a name="l17454"></a><span class="lineno">17454</span>&#160;    }</div>
+<div class="line"><a name="l17455"></a><span class="lineno">17455</span>&#160; </div>
+<div class="line"><a name="l17456"></a><span class="lineno">17456</span>&#160;<span class="keyword">private</span>:</div>
+<div class="line"><a name="l17457"></a><span class="lineno">17457</span>&#160;    AtomicT* m_Atomic = <span class="keyword">nullptr</span>;</div>
+<div class="line"><a name="l17458"></a><span class="lineno">17458</span>&#160;};</div>
+<div class="line"><a name="l17459"></a><span class="lineno">17459</span>&#160; </div>
+<div class="line"><a name="l17460"></a><span class="lineno">17460</span>&#160;VkResult VmaAllocator_T::AllocateVulkanMemory(<span class="keyword">const</span> VkMemoryAllocateInfo* pAllocateInfo, VkDeviceMemory* pMemory)</div>
+<div class="line"><a name="l17461"></a><span class="lineno">17461</span>&#160;{</div>
+<div class="line"><a name="l17462"></a><span class="lineno">17462</span>&#160;    AtomicTransactionalIncrement&lt;uint32_t&gt; deviceMemoryCountIncrement;</div>
+<div class="line"><a name="l17463"></a><span class="lineno">17463</span>&#160;    <span class="keyword">const</span> uint64_t prevDeviceMemoryCount = deviceMemoryCountIncrement.Increment(&amp;m_DeviceMemoryCount);</div>
+<div class="line"><a name="l17464"></a><span class="lineno">17464</span>&#160;<span class="preprocessor">#if VMA_DEBUG_DONT_EXCEED_MAX_MEMORY_ALLOCATION_COUNT</span></div>
+<div class="line"><a name="l17465"></a><span class="lineno">17465</span>&#160;    <span class="keywordflow">if</span>(prevDeviceMemoryCount &gt;= m_PhysicalDeviceProperties.limits.maxMemoryAllocationCount)</div>
+<div class="line"><a name="l17466"></a><span class="lineno">17466</span>&#160;    {</div>
+<div class="line"><a name="l17467"></a><span class="lineno">17467</span>&#160;        <span class="keywordflow">return</span> VK_ERROR_TOO_MANY_OBJECTS;</div>
+<div class="line"><a name="l17468"></a><span class="lineno">17468</span>&#160;    }</div>
+<div class="line"><a name="l17469"></a><span class="lineno">17469</span>&#160;<span class="preprocessor">#endif</span></div>
+<div class="line"><a name="l17470"></a><span class="lineno">17470</span>&#160; </div>
+<div class="line"><a name="l17471"></a><span class="lineno">17471</span>&#160;    <span class="keyword">const</span> uint32_t heapIndex = MemoryTypeIndexToHeapIndex(pAllocateInfo-&gt;memoryTypeIndex);</div>
+<div class="line"><a name="l17472"></a><span class="lineno">17472</span>&#160; </div>
+<div class="line"><a name="l17473"></a><span class="lineno">17473</span>&#160;    <span class="comment">// HeapSizeLimit is in effect for this heap.</span></div>
+<div class="line"><a name="l17474"></a><span class="lineno">17474</span>&#160;    <span class="keywordflow">if</span>((m_HeapSizeLimitMask &amp; (1u &lt;&lt; heapIndex)) != 0)</div>
+<div class="line"><a name="l17475"></a><span class="lineno">17475</span>&#160;    {</div>
+<div class="line"><a name="l17476"></a><span class="lineno">17476</span>&#160;        <span class="keyword">const</span> VkDeviceSize heapSize = m_MemProps.memoryHeaps[heapIndex].size;</div>
+<div class="line"><a name="l17477"></a><span class="lineno">17477</span>&#160;        VkDeviceSize blockBytes = m_Budget.m_BlockBytes[heapIndex];</div>
+<div class="line"><a name="l17478"></a><span class="lineno">17478</span>&#160;        <span class="keywordflow">for</span>(;;)</div>
+<div class="line"><a name="l17479"></a><span class="lineno">17479</span>&#160;        {</div>
+<div class="line"><a name="l17480"></a><span class="lineno">17480</span>&#160;            <span class="keyword">const</span> VkDeviceSize blockBytesAfterAllocation = blockBytes + pAllocateInfo-&gt;allocationSize;</div>
+<div class="line"><a name="l17481"></a><span class="lineno">17481</span>&#160;            <span class="keywordflow">if</span>(blockBytesAfterAllocation &gt; heapSize)</div>
+<div class="line"><a name="l17482"></a><span class="lineno">17482</span>&#160;            {</div>
+<div class="line"><a name="l17483"></a><span class="lineno">17483</span>&#160;                <span class="keywordflow">return</span> VK_ERROR_OUT_OF_DEVICE_MEMORY;</div>
+<div class="line"><a name="l17484"></a><span class="lineno">17484</span>&#160;            }</div>
+<div class="line"><a name="l17485"></a><span class="lineno">17485</span>&#160;            <span class="keywordflow">if</span>(m_Budget.m_BlockBytes[heapIndex].compare_exchange_strong(blockBytes, blockBytesAfterAllocation))</div>
+<div class="line"><a name="l17486"></a><span class="lineno">17486</span>&#160;            {</div>
+<div class="line"><a name="l17487"></a><span class="lineno">17487</span>&#160;                <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l17488"></a><span class="lineno">17488</span>&#160;            }</div>
+<div class="line"><a name="l17489"></a><span class="lineno">17489</span>&#160;        }</div>
+<div class="line"><a name="l17490"></a><span class="lineno">17490</span>&#160;    }</div>
+<div class="line"><a name="l17491"></a><span class="lineno">17491</span>&#160;    <span class="keywordflow">else</span></div>
+<div class="line"><a name="l17492"></a><span class="lineno">17492</span>&#160;    {</div>
+<div class="line"><a name="l17493"></a><span class="lineno">17493</span>&#160;        m_Budget.m_BlockBytes[heapIndex] += pAllocateInfo-&gt;allocationSize;</div>
 <div class="line"><a name="l17494"></a><span class="lineno">17494</span>&#160;    }</div>
-<div class="line"><a name="l17495"></a><span class="lineno">17495</span>&#160;}</div>
-<div class="line"><a name="l17496"></a><span class="lineno">17496</span>&#160; </div>
-<div class="line"><a name="l17497"></a><span class="lineno">17497</span>&#160;<span class="preprocessor">#endif // #if VMA_STATS_STRING_ENABLED</span></div>
+<div class="line"><a name="l17495"></a><span class="lineno">17495</span>&#160; </div>
+<div class="line"><a name="l17496"></a><span class="lineno">17496</span>&#160;    <span class="comment">// VULKAN CALL vkAllocateMemory.</span></div>
+<div class="line"><a name="l17497"></a><span class="lineno">17497</span>&#160;    VkResult res = (*m_VulkanFunctions.vkAllocateMemory)(m_hDevice, pAllocateInfo, GetAllocationCallbacks(), pMemory);</div>
 <div class="line"><a name="l17498"></a><span class="lineno">17498</span>&#160; </div>
-<div class="line"><a name="l17500"></a><span class="lineno">17500</span>&#160;<span class="comment">// Public interface</span></div>
-<div class="line"><a name="l17501"></a><span class="lineno">17501</span>&#160; </div>
-<div class="line"><a name="l17502"></a><span class="lineno">17502</span>&#160;VMA_CALL_PRE VkResult VMA_CALL_POST <a class="code" href="vk__mem__alloc_8h.html#a200692051ddb34240248234f5f4c17bb">vmaCreateAllocator</a>(</div>
-<div class="line"><a name="l17503"></a><span class="lineno">17503</span>&#160;    <span class="keyword">const</span> <a class="code" href="struct_vma_allocator_create_info.html">VmaAllocatorCreateInfo</a>* pCreateInfo,</div>
-<div class="line"><a name="l17504"></a><span class="lineno">17504</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a>* pAllocator)</div>
-<div class="line"><a name="l17505"></a><span class="lineno">17505</span>&#160;{</div>
-<div class="line"><a name="l17506"></a><span class="lineno">17506</span>&#160;    VMA_ASSERT(pCreateInfo &amp;&amp; pAllocator);</div>
-<div class="line"><a name="l17507"></a><span class="lineno">17507</span>&#160;    VMA_ASSERT(pCreateInfo-&gt;<a class="code" href="struct_vma_allocator_create_info.html#ae0ffc55139b54520a6bb704b29ffc285">vulkanApiVersion</a> == 0 ||</div>
-<div class="line"><a name="l17508"></a><span class="lineno">17508</span>&#160;        (VK_VERSION_MAJOR(pCreateInfo-&gt;<a class="code" href="struct_vma_allocator_create_info.html#ae0ffc55139b54520a6bb704b29ffc285">vulkanApiVersion</a>) == 1 &amp;&amp; VK_VERSION_MINOR(pCreateInfo-&gt;<a class="code" href="struct_vma_allocator_create_info.html#ae0ffc55139b54520a6bb704b29ffc285">vulkanApiVersion</a>) &lt;= 2));</div>
-<div class="line"><a name="l17509"></a><span class="lineno">17509</span>&#160;    VMA_DEBUG_LOG(<span class="stringliteral">&quot;vmaCreateAllocator&quot;</span>);</div>
-<div class="line"><a name="l17510"></a><span class="lineno">17510</span>&#160;    *pAllocator = vma_new(pCreateInfo-&gt;<a class="code" href="struct_vma_allocator_create_info.html#a6e409087e3be55400d0e4ccbe43c608d">pAllocationCallbacks</a>, VmaAllocator_T)(pCreateInfo);</div>
-<div class="line"><a name="l17511"></a><span class="lineno">17511</span>&#160;    <span class="keywordflow">return</span> (*pAllocator)-&gt;Init(pCreateInfo);</div>
-<div class="line"><a name="l17512"></a><span class="lineno">17512</span>&#160;}</div>
-<div class="line"><a name="l17513"></a><span class="lineno">17513</span>&#160; </div>
-<div class="line"><a name="l17514"></a><span class="lineno">17514</span>&#160;VMA_CALL_PRE <span class="keywordtype">void</span> VMA_CALL_POST <a class="code" href="vk__mem__alloc_8h.html#aa8d164061c88f22fb1fd3c8f3534bc1d">vmaDestroyAllocator</a>(</div>
-<div class="line"><a name="l17515"></a><span class="lineno">17515</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator)</div>
-<div class="line"><a name="l17516"></a><span class="lineno">17516</span>&#160;{</div>
-<div class="line"><a name="l17517"></a><span class="lineno">17517</span>&#160;    <span class="keywordflow">if</span>(allocator != VK_NULL_HANDLE)</div>
-<div class="line"><a name="l17518"></a><span class="lineno">17518</span>&#160;    {</div>
-<div class="line"><a name="l17519"></a><span class="lineno">17519</span>&#160;        VMA_DEBUG_LOG(<span class="stringliteral">&quot;vmaDestroyAllocator&quot;</span>);</div>
-<div class="line"><a name="l17520"></a><span class="lineno">17520</span>&#160;        VkAllocationCallbacks allocationCallbacks = allocator-&gt;m_AllocationCallbacks;</div>
-<div class="line"><a name="l17521"></a><span class="lineno">17521</span>&#160;        vma_delete(&amp;allocationCallbacks, allocator);</div>
-<div class="line"><a name="l17522"></a><span class="lineno">17522</span>&#160;    }</div>
-<div class="line"><a name="l17523"></a><span class="lineno">17523</span>&#160;}</div>
-<div class="line"><a name="l17524"></a><span class="lineno">17524</span>&#160; </div>
-<div class="line"><a name="l17525"></a><span class="lineno">17525</span>&#160;VMA_CALL_PRE <span class="keywordtype">void</span> VMA_CALL_POST <a class="code" href="vk__mem__alloc_8h.html#afa02231a791b37255720d566a52683e7">vmaGetAllocatorInfo</a>(<a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator, <a class="code" href="struct_vma_allocator_info.html">VmaAllocatorInfo</a>* pAllocatorInfo)</div>
-<div class="line"><a name="l17526"></a><span class="lineno">17526</span>&#160;{</div>
-<div class="line"><a name="l17527"></a><span class="lineno">17527</span>&#160;    VMA_ASSERT(allocator &amp;&amp; pAllocatorInfo);</div>
-<div class="line"><a name="l17528"></a><span class="lineno">17528</span>&#160;    pAllocatorInfo-&gt;<a class="code" href="struct_vma_allocator_info.html#a2ed6a4d2d3fea039d66a13f15d0ce5fe">instance</a> = allocator-&gt;m_hInstance;</div>
-<div class="line"><a name="l17529"></a><span class="lineno">17529</span>&#160;    pAllocatorInfo-&gt;<a class="code" href="struct_vma_allocator_info.html#aba2b703f96e51d567717e1fb2935b47a">physicalDevice</a> = allocator-&gt;GetPhysicalDevice();</div>
-<div class="line"><a name="l17530"></a><span class="lineno">17530</span>&#160;    pAllocatorInfo-&gt;<a class="code" href="struct_vma_allocator_info.html#a012b4c485bf3b0ea8921352c5ee0c357">device</a> = allocator-&gt;m_hDevice;</div>
-<div class="line"><a name="l17531"></a><span class="lineno">17531</span>&#160;}</div>
-<div class="line"><a name="l17532"></a><span class="lineno">17532</span>&#160; </div>
-<div class="line"><a name="l17533"></a><span class="lineno">17533</span>&#160;VMA_CALL_PRE <span class="keywordtype">void</span> VMA_CALL_POST <a class="code" href="vk__mem__alloc_8h.html#aecabf7b6e91ea87d0316fa0a9e014fe0">vmaGetPhysicalDeviceProperties</a>(</div>
-<div class="line"><a name="l17534"></a><span class="lineno">17534</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div>
-<div class="line"><a name="l17535"></a><span class="lineno">17535</span>&#160;    <span class="keyword">const</span> VkPhysicalDeviceProperties **ppPhysicalDeviceProperties)</div>
-<div class="line"><a name="l17536"></a><span class="lineno">17536</span>&#160;{</div>
-<div class="line"><a name="l17537"></a><span class="lineno">17537</span>&#160;    VMA_ASSERT(allocator &amp;&amp; ppPhysicalDeviceProperties);</div>
-<div class="line"><a name="l17538"></a><span class="lineno">17538</span>&#160;    *ppPhysicalDeviceProperties = &amp;allocator-&gt;m_PhysicalDeviceProperties;</div>
-<div class="line"><a name="l17539"></a><span class="lineno">17539</span>&#160;}</div>
-<div class="line"><a name="l17540"></a><span class="lineno">17540</span>&#160; </div>
-<div class="line"><a name="l17541"></a><span class="lineno">17541</span>&#160;VMA_CALL_PRE <span class="keywordtype">void</span> VMA_CALL_POST <a class="code" href="vk__mem__alloc_8h.html#ab88db292a17974f911182543fda52d19">vmaGetMemoryProperties</a>(</div>
-<div class="line"><a name="l17542"></a><span class="lineno">17542</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div>
-<div class="line"><a name="l17543"></a><span class="lineno">17543</span>&#160;    <span class="keyword">const</span> VkPhysicalDeviceMemoryProperties** ppPhysicalDeviceMemoryProperties)</div>
-<div class="line"><a name="l17544"></a><span class="lineno">17544</span>&#160;{</div>
-<div class="line"><a name="l17545"></a><span class="lineno">17545</span>&#160;    VMA_ASSERT(allocator &amp;&amp; ppPhysicalDeviceMemoryProperties);</div>
-<div class="line"><a name="l17546"></a><span class="lineno">17546</span>&#160;    *ppPhysicalDeviceMemoryProperties = &amp;allocator-&gt;m_MemProps;</div>
-<div class="line"><a name="l17547"></a><span class="lineno">17547</span>&#160;}</div>
-<div class="line"><a name="l17548"></a><span class="lineno">17548</span>&#160; </div>
-<div class="line"><a name="l17549"></a><span class="lineno">17549</span>&#160;VMA_CALL_PRE <span class="keywordtype">void</span> VMA_CALL_POST <a class="code" href="vk__mem__alloc_8h.html#a8701444752eb5de4464adb5a2b514bca">vmaGetMemoryTypeProperties</a>(</div>
-<div class="line"><a name="l17550"></a><span class="lineno">17550</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div>
-<div class="line"><a name="l17551"></a><span class="lineno">17551</span>&#160;    uint32_t memoryTypeIndex,</div>
-<div class="line"><a name="l17552"></a><span class="lineno">17552</span>&#160;    VkMemoryPropertyFlags* pFlags)</div>
-<div class="line"><a name="l17553"></a><span class="lineno">17553</span>&#160;{</div>
-<div class="line"><a name="l17554"></a><span class="lineno">17554</span>&#160;    VMA_ASSERT(allocator &amp;&amp; pFlags);</div>
-<div class="line"><a name="l17555"></a><span class="lineno">17555</span>&#160;    VMA_ASSERT(memoryTypeIndex &lt; allocator-&gt;GetMemoryTypeCount());</div>
-<div class="line"><a name="l17556"></a><span class="lineno">17556</span>&#160;    *pFlags = allocator-&gt;m_MemProps.memoryTypes[memoryTypeIndex].propertyFlags;</div>
-<div class="line"><a name="l17557"></a><span class="lineno">17557</span>&#160;}</div>
-<div class="line"><a name="l17558"></a><span class="lineno">17558</span>&#160; </div>
-<div class="line"><a name="l17559"></a><span class="lineno">17559</span>&#160;VMA_CALL_PRE <span class="keywordtype">void</span> VMA_CALL_POST <a class="code" href="vk__mem__alloc_8h.html#ade56bf8dc9f5a5eaddf5f119ed525236">vmaSetCurrentFrameIndex</a>(</div>
-<div class="line"><a name="l17560"></a><span class="lineno">17560</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div>
-<div class="line"><a name="l17561"></a><span class="lineno">17561</span>&#160;    uint32_t frameIndex)</div>
-<div class="line"><a name="l17562"></a><span class="lineno">17562</span>&#160;{</div>
-<div class="line"><a name="l17563"></a><span class="lineno">17563</span>&#160;    VMA_ASSERT(allocator);</div>
-<div class="line"><a name="l17564"></a><span class="lineno">17564</span>&#160;    VMA_ASSERT(frameIndex != VMA_FRAME_INDEX_LOST);</div>
-<div class="line"><a name="l17565"></a><span class="lineno">17565</span>&#160; </div>
-<div class="line"><a name="l17566"></a><span class="lineno">17566</span>&#160;    VMA_DEBUG_GLOBAL_MUTEX_LOCK</div>
+<div class="line"><a name="l17499"></a><span class="lineno">17499</span>&#160;    <span class="keywordflow">if</span>(res == VK_SUCCESS)</div>
+<div class="line"><a name="l17500"></a><span class="lineno">17500</span>&#160;    {</div>
+<div class="line"><a name="l17501"></a><span class="lineno">17501</span>&#160;<span class="preprocessor">#if VMA_MEMORY_BUDGET</span></div>
+<div class="line"><a name="l17502"></a><span class="lineno">17502</span>&#160;        ++m_Budget.m_OperationsSinceBudgetFetch;</div>
+<div class="line"><a name="l17503"></a><span class="lineno">17503</span>&#160;<span class="preprocessor">#endif</span></div>
+<div class="line"><a name="l17504"></a><span class="lineno">17504</span>&#160; </div>
+<div class="line"><a name="l17505"></a><span class="lineno">17505</span>&#160;        <span class="comment">// Informative callback.</span></div>
+<div class="line"><a name="l17506"></a><span class="lineno">17506</span>&#160;        <span class="keywordflow">if</span>(m_DeviceMemoryCallbacks.<a class="code" href="struct_vma_device_memory_callbacks.html#a4f17f7b255101e733b44d5633aceabfb">pfnAllocate</a> != VMA_NULL)</div>
+<div class="line"><a name="l17507"></a><span class="lineno">17507</span>&#160;        {</div>
+<div class="line"><a name="l17508"></a><span class="lineno">17508</span>&#160;            (*m_DeviceMemoryCallbacks.<a class="code" href="struct_vma_device_memory_callbacks.html#a4f17f7b255101e733b44d5633aceabfb">pfnAllocate</a>)(<span class="keyword">this</span>, pAllocateInfo-&gt;memoryTypeIndex, *pMemory, pAllocateInfo-&gt;allocationSize, m_DeviceMemoryCallbacks.<a class="code" href="struct_vma_device_memory_callbacks.html#a24052de0937ddd54015a2df0363903c6">pUserData</a>);</div>
+<div class="line"><a name="l17509"></a><span class="lineno">17509</span>&#160;        }</div>
+<div class="line"><a name="l17510"></a><span class="lineno">17510</span>&#160; </div>
+<div class="line"><a name="l17511"></a><span class="lineno">17511</span>&#160;        deviceMemoryCountIncrement.Commit();</div>
+<div class="line"><a name="l17512"></a><span class="lineno">17512</span>&#160;    }</div>
+<div class="line"><a name="l17513"></a><span class="lineno">17513</span>&#160;    <span class="keywordflow">else</span></div>
+<div class="line"><a name="l17514"></a><span class="lineno">17514</span>&#160;    {</div>
+<div class="line"><a name="l17515"></a><span class="lineno">17515</span>&#160;        m_Budget.m_BlockBytes[heapIndex] -= pAllocateInfo-&gt;allocationSize;</div>
+<div class="line"><a name="l17516"></a><span class="lineno">17516</span>&#160;    }</div>
+<div class="line"><a name="l17517"></a><span class="lineno">17517</span>&#160; </div>
+<div class="line"><a name="l17518"></a><span class="lineno">17518</span>&#160;    <span class="keywordflow">return</span> res;</div>
+<div class="line"><a name="l17519"></a><span class="lineno">17519</span>&#160;}</div>
+<div class="line"><a name="l17520"></a><span class="lineno">17520</span>&#160; </div>
+<div class="line"><a name="l17521"></a><span class="lineno">17521</span>&#160;<span class="keywordtype">void</span> VmaAllocator_T::FreeVulkanMemory(uint32_t memoryType, VkDeviceSize size, VkDeviceMemory hMemory)</div>
+<div class="line"><a name="l17522"></a><span class="lineno">17522</span>&#160;{</div>
+<div class="line"><a name="l17523"></a><span class="lineno">17523</span>&#160;    <span class="comment">// Informative callback.</span></div>
+<div class="line"><a name="l17524"></a><span class="lineno">17524</span>&#160;    <span class="keywordflow">if</span>(m_DeviceMemoryCallbacks.<a class="code" href="struct_vma_device_memory_callbacks.html#abe8a3328bbc916f6f712fdb6b299444c">pfnFree</a> != VMA_NULL)</div>
+<div class="line"><a name="l17525"></a><span class="lineno">17525</span>&#160;    {</div>
+<div class="line"><a name="l17526"></a><span class="lineno">17526</span>&#160;        (*m_DeviceMemoryCallbacks.<a class="code" href="struct_vma_device_memory_callbacks.html#abe8a3328bbc916f6f712fdb6b299444c">pfnFree</a>)(<span class="keyword">this</span>, memoryType, hMemory, size, m_DeviceMemoryCallbacks.<a class="code" href="struct_vma_device_memory_callbacks.html#a24052de0937ddd54015a2df0363903c6">pUserData</a>);</div>
+<div class="line"><a name="l17527"></a><span class="lineno">17527</span>&#160;    }</div>
+<div class="line"><a name="l17528"></a><span class="lineno">17528</span>&#160; </div>
+<div class="line"><a name="l17529"></a><span class="lineno">17529</span>&#160;    <span class="comment">// VULKAN CALL vkFreeMemory.</span></div>
+<div class="line"><a name="l17530"></a><span class="lineno">17530</span>&#160;    (*m_VulkanFunctions.vkFreeMemory)(m_hDevice, hMemory, GetAllocationCallbacks());</div>
+<div class="line"><a name="l17531"></a><span class="lineno">17531</span>&#160; </div>
+<div class="line"><a name="l17532"></a><span class="lineno">17532</span>&#160;    m_Budget.m_BlockBytes[MemoryTypeIndexToHeapIndex(memoryType)] -= size;</div>
+<div class="line"><a name="l17533"></a><span class="lineno">17533</span>&#160; </div>
+<div class="line"><a name="l17534"></a><span class="lineno">17534</span>&#160;    --m_DeviceMemoryCount;</div>
+<div class="line"><a name="l17535"></a><span class="lineno">17535</span>&#160;}</div>
+<div class="line"><a name="l17536"></a><span class="lineno">17536</span>&#160; </div>
+<div class="line"><a name="l17537"></a><span class="lineno">17537</span>&#160;VkResult VmaAllocator_T::BindVulkanBuffer(</div>
+<div class="line"><a name="l17538"></a><span class="lineno">17538</span>&#160;    VkDeviceMemory memory,</div>
+<div class="line"><a name="l17539"></a><span class="lineno">17539</span>&#160;    VkDeviceSize memoryOffset,</div>
+<div class="line"><a name="l17540"></a><span class="lineno">17540</span>&#160;    VkBuffer buffer,</div>
+<div class="line"><a name="l17541"></a><span class="lineno">17541</span>&#160;    <span class="keyword">const</span> <span class="keywordtype">void</span>* pNext)</div>
+<div class="line"><a name="l17542"></a><span class="lineno">17542</span>&#160;{</div>
+<div class="line"><a name="l17543"></a><span class="lineno">17543</span>&#160;    <span class="keywordflow">if</span>(pNext != VMA_NULL)</div>
+<div class="line"><a name="l17544"></a><span class="lineno">17544</span>&#160;    {</div>
+<div class="line"><a name="l17545"></a><span class="lineno">17545</span>&#160;<span class="preprocessor">#if VMA_VULKAN_VERSION &gt;= 1001000 || VMA_BIND_MEMORY2</span></div>
+<div class="line"><a name="l17546"></a><span class="lineno">17546</span>&#160;        <span class="keywordflow">if</span>((m_UseKhrBindMemory2 || m_VulkanApiVersion &gt;= VK_MAKE_VERSION(1, 1, 0)) &amp;&amp;</div>
+<div class="line"><a name="l17547"></a><span class="lineno">17547</span>&#160;            m_VulkanFunctions.vkBindBufferMemory2KHR != VMA_NULL)</div>
+<div class="line"><a name="l17548"></a><span class="lineno">17548</span>&#160;        {</div>
+<div class="line"><a name="l17549"></a><span class="lineno">17549</span>&#160;            VkBindBufferMemoryInfoKHR bindBufferMemoryInfo = { VK_STRUCTURE_TYPE_BIND_BUFFER_MEMORY_INFO_KHR };</div>
+<div class="line"><a name="l17550"></a><span class="lineno">17550</span>&#160;            bindBufferMemoryInfo.pNext = pNext;</div>
+<div class="line"><a name="l17551"></a><span class="lineno">17551</span>&#160;            bindBufferMemoryInfo.buffer = buffer;</div>
+<div class="line"><a name="l17552"></a><span class="lineno">17552</span>&#160;            bindBufferMemoryInfo.memory = memory;</div>
+<div class="line"><a name="l17553"></a><span class="lineno">17553</span>&#160;            bindBufferMemoryInfo.memoryOffset = memoryOffset;</div>
+<div class="line"><a name="l17554"></a><span class="lineno">17554</span>&#160;            <span class="keywordflow">return</span> (*m_VulkanFunctions.vkBindBufferMemory2KHR)(m_hDevice, 1, &amp;bindBufferMemoryInfo);</div>
+<div class="line"><a name="l17555"></a><span class="lineno">17555</span>&#160;        }</div>
+<div class="line"><a name="l17556"></a><span class="lineno">17556</span>&#160;        <span class="keywordflow">else</span></div>
+<div class="line"><a name="l17557"></a><span class="lineno">17557</span>&#160;<span class="preprocessor">#endif </span><span class="comment">// #if VMA_VULKAN_VERSION &gt;= 1001000 || VMA_BIND_MEMORY2</span></div>
+<div class="line"><a name="l17558"></a><span class="lineno">17558</span>&#160;        {</div>
+<div class="line"><a name="l17559"></a><span class="lineno">17559</span>&#160;            <span class="keywordflow">return</span> VK_ERROR_EXTENSION_NOT_PRESENT;</div>
+<div class="line"><a name="l17560"></a><span class="lineno">17560</span>&#160;        }</div>
+<div class="line"><a name="l17561"></a><span class="lineno">17561</span>&#160;    }</div>
+<div class="line"><a name="l17562"></a><span class="lineno">17562</span>&#160;    <span class="keywordflow">else</span></div>
+<div class="line"><a name="l17563"></a><span class="lineno">17563</span>&#160;    {</div>
+<div class="line"><a name="l17564"></a><span class="lineno">17564</span>&#160;        <span class="keywordflow">return</span> (*m_VulkanFunctions.vkBindBufferMemory)(m_hDevice, buffer, memory, memoryOffset);</div>
+<div class="line"><a name="l17565"></a><span class="lineno">17565</span>&#160;    }</div>
+<div class="line"><a name="l17566"></a><span class="lineno">17566</span>&#160;}</div>
 <div class="line"><a name="l17567"></a><span class="lineno">17567</span>&#160; </div>
-<div class="line"><a name="l17568"></a><span class="lineno">17568</span>&#160;    allocator-&gt;SetCurrentFrameIndex(frameIndex);</div>
-<div class="line"><a name="l17569"></a><span class="lineno">17569</span>&#160;}</div>
-<div class="line"><a name="l17570"></a><span class="lineno">17570</span>&#160; </div>
-<div class="line"><a name="l17571"></a><span class="lineno">17571</span>&#160;VMA_CALL_PRE <span class="keywordtype">void</span> VMA_CALL_POST <a class="code" href="vk__mem__alloc_8h.html#a333b61c1788cb23559177531e6a93ca3">vmaCalculateStats</a>(</div>
-<div class="line"><a name="l17572"></a><span class="lineno">17572</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div>
-<div class="line"><a name="l17573"></a><span class="lineno">17573</span>&#160;    <a class="code" href="struct_vma_stats.html">VmaStats</a>* pStats)</div>
-<div class="line"><a name="l17574"></a><span class="lineno">17574</span>&#160;{</div>
-<div class="line"><a name="l17575"></a><span class="lineno">17575</span>&#160;    VMA_ASSERT(allocator &amp;&amp; pStats);</div>
-<div class="line"><a name="l17576"></a><span class="lineno">17576</span>&#160;    VMA_DEBUG_GLOBAL_MUTEX_LOCK</div>
-<div class="line"><a name="l17577"></a><span class="lineno">17577</span>&#160;    allocator-&gt;CalculateStats(pStats);</div>
-<div class="line"><a name="l17578"></a><span class="lineno">17578</span>&#160;}</div>
-<div class="line"><a name="l17579"></a><span class="lineno">17579</span>&#160; </div>
-<div class="line"><a name="l17580"></a><span class="lineno">17580</span>&#160;VMA_CALL_PRE <span class="keywordtype">void</span> VMA_CALL_POST <a class="code" href="vk__mem__alloc_8h.html#aec0ed24ebea2d0099eed5f801daaefba">vmaGetBudget</a>(</div>
-<div class="line"><a name="l17581"></a><span class="lineno">17581</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div>
-<div class="line"><a name="l17582"></a><span class="lineno">17582</span>&#160;    <a class="code" href="struct_vma_budget.html">VmaBudget</a>* pBudget)</div>
-<div class="line"><a name="l17583"></a><span class="lineno">17583</span>&#160;{</div>
-<div class="line"><a name="l17584"></a><span class="lineno">17584</span>&#160;    VMA_ASSERT(allocator &amp;&amp; pBudget);</div>
-<div class="line"><a name="l17585"></a><span class="lineno">17585</span>&#160;    VMA_DEBUG_GLOBAL_MUTEX_LOCK</div>
-<div class="line"><a name="l17586"></a><span class="lineno">17586</span>&#160;    allocator-&gt;GetBudget(pBudget, 0, allocator-&gt;GetMemoryHeapCount());</div>
-<div class="line"><a name="l17587"></a><span class="lineno">17587</span>&#160;}</div>
-<div class="line"><a name="l17588"></a><span class="lineno">17588</span>&#160; </div>
-<div class="line"><a name="l17589"></a><span class="lineno">17589</span>&#160;<span class="preprocessor">#if VMA_STATS_STRING_ENABLED</span></div>
-<div class="line"><a name="l17590"></a><span class="lineno">17590</span>&#160; </div>
-<div class="line"><a name="l17591"></a><span class="lineno">17591</span>&#160;VMA_CALL_PRE <span class="keywordtype">void</span> VMA_CALL_POST <a class="code" href="vk__mem__alloc_8h.html#aa4fee7eb5253377599ef4fd38c93c2a0">vmaBuildStatsString</a>(</div>
-<div class="line"><a name="l17592"></a><span class="lineno">17592</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div>
-<div class="line"><a name="l17593"></a><span class="lineno">17593</span>&#160;    <span class="keywordtype">char</span>** ppStatsString,</div>
-<div class="line"><a name="l17594"></a><span class="lineno">17594</span>&#160;    VkBool32 detailedMap)</div>
-<div class="line"><a name="l17595"></a><span class="lineno">17595</span>&#160;{</div>
-<div class="line"><a name="l17596"></a><span class="lineno">17596</span>&#160;    VMA_ASSERT(allocator &amp;&amp; ppStatsString);</div>
-<div class="line"><a name="l17597"></a><span class="lineno">17597</span>&#160;    VMA_DEBUG_GLOBAL_MUTEX_LOCK</div>
+<div class="line"><a name="l17568"></a><span class="lineno">17568</span>&#160;VkResult VmaAllocator_T::BindVulkanImage(</div>
+<div class="line"><a name="l17569"></a><span class="lineno">17569</span>&#160;    VkDeviceMemory memory,</div>
+<div class="line"><a name="l17570"></a><span class="lineno">17570</span>&#160;    VkDeviceSize memoryOffset,</div>
+<div class="line"><a name="l17571"></a><span class="lineno">17571</span>&#160;    VkImage image,</div>
+<div class="line"><a name="l17572"></a><span class="lineno">17572</span>&#160;    <span class="keyword">const</span> <span class="keywordtype">void</span>* pNext)</div>
+<div class="line"><a name="l17573"></a><span class="lineno">17573</span>&#160;{</div>
+<div class="line"><a name="l17574"></a><span class="lineno">17574</span>&#160;    <span class="keywordflow">if</span>(pNext != VMA_NULL)</div>
+<div class="line"><a name="l17575"></a><span class="lineno">17575</span>&#160;    {</div>
+<div class="line"><a name="l17576"></a><span class="lineno">17576</span>&#160;<span class="preprocessor">#if VMA_VULKAN_VERSION &gt;= 1001000 || VMA_BIND_MEMORY2</span></div>
+<div class="line"><a name="l17577"></a><span class="lineno">17577</span>&#160;        <span class="keywordflow">if</span>((m_UseKhrBindMemory2 || m_VulkanApiVersion &gt;= VK_MAKE_VERSION(1, 1, 0)) &amp;&amp;</div>
+<div class="line"><a name="l17578"></a><span class="lineno">17578</span>&#160;            m_VulkanFunctions.vkBindImageMemory2KHR != VMA_NULL)</div>
+<div class="line"><a name="l17579"></a><span class="lineno">17579</span>&#160;        {</div>
+<div class="line"><a name="l17580"></a><span class="lineno">17580</span>&#160;            VkBindImageMemoryInfoKHR bindBufferMemoryInfo = { VK_STRUCTURE_TYPE_BIND_IMAGE_MEMORY_INFO_KHR };</div>
+<div class="line"><a name="l17581"></a><span class="lineno">17581</span>&#160;            bindBufferMemoryInfo.pNext = pNext;</div>
+<div class="line"><a name="l17582"></a><span class="lineno">17582</span>&#160;            bindBufferMemoryInfo.image = image;</div>
+<div class="line"><a name="l17583"></a><span class="lineno">17583</span>&#160;            bindBufferMemoryInfo.memory = memory;</div>
+<div class="line"><a name="l17584"></a><span class="lineno">17584</span>&#160;            bindBufferMemoryInfo.memoryOffset = memoryOffset;</div>
+<div class="line"><a name="l17585"></a><span class="lineno">17585</span>&#160;            <span class="keywordflow">return</span> (*m_VulkanFunctions.vkBindImageMemory2KHR)(m_hDevice, 1, &amp;bindBufferMemoryInfo);</div>
+<div class="line"><a name="l17586"></a><span class="lineno">17586</span>&#160;        }</div>
+<div class="line"><a name="l17587"></a><span class="lineno">17587</span>&#160;        <span class="keywordflow">else</span></div>
+<div class="line"><a name="l17588"></a><span class="lineno">17588</span>&#160;<span class="preprocessor">#endif </span><span class="comment">// #if VMA_BIND_MEMORY2</span></div>
+<div class="line"><a name="l17589"></a><span class="lineno">17589</span>&#160;        {</div>
+<div class="line"><a name="l17590"></a><span class="lineno">17590</span>&#160;            <span class="keywordflow">return</span> VK_ERROR_EXTENSION_NOT_PRESENT;</div>
+<div class="line"><a name="l17591"></a><span class="lineno">17591</span>&#160;        }</div>
+<div class="line"><a name="l17592"></a><span class="lineno">17592</span>&#160;    }</div>
+<div class="line"><a name="l17593"></a><span class="lineno">17593</span>&#160;    <span class="keywordflow">else</span></div>
+<div class="line"><a name="l17594"></a><span class="lineno">17594</span>&#160;    {</div>
+<div class="line"><a name="l17595"></a><span class="lineno">17595</span>&#160;        <span class="keywordflow">return</span> (*m_VulkanFunctions.vkBindImageMemory)(m_hDevice, image, memory, memoryOffset);</div>
+<div class="line"><a name="l17596"></a><span class="lineno">17596</span>&#160;    }</div>
+<div class="line"><a name="l17597"></a><span class="lineno">17597</span>&#160;}</div>
 <div class="line"><a name="l17598"></a><span class="lineno">17598</span>&#160; </div>
-<div class="line"><a name="l17599"></a><span class="lineno">17599</span>&#160;    VmaStringBuilder sb(allocator);</div>
-<div class="line"><a name="l17600"></a><span class="lineno">17600</span>&#160;    {</div>
-<div class="line"><a name="l17601"></a><span class="lineno">17601</span>&#160;        VmaJsonWriter json(allocator-&gt;GetAllocationCallbacks(), sb);</div>
-<div class="line"><a name="l17602"></a><span class="lineno">17602</span>&#160;        json.BeginObject();</div>
-<div class="line"><a name="l17603"></a><span class="lineno">17603</span>&#160; </div>
-<div class="line"><a name="l17604"></a><span class="lineno">17604</span>&#160;        <a class="code" href="struct_vma_budget.html">VmaBudget</a> budget[VK_MAX_MEMORY_HEAPS];</div>
-<div class="line"><a name="l17605"></a><span class="lineno">17605</span>&#160;        allocator-&gt;GetBudget(budget, 0, allocator-&gt;GetMemoryHeapCount());</div>
-<div class="line"><a name="l17606"></a><span class="lineno">17606</span>&#160; </div>
-<div class="line"><a name="l17607"></a><span class="lineno">17607</span>&#160;        <a class="code" href="struct_vma_stats.html">VmaStats</a> stats;</div>
-<div class="line"><a name="l17608"></a><span class="lineno">17608</span>&#160;        allocator-&gt;CalculateStats(&amp;stats);</div>
-<div class="line"><a name="l17609"></a><span class="lineno">17609</span>&#160; </div>
-<div class="line"><a name="l17610"></a><span class="lineno">17610</span>&#160;        json.WriteString(<span class="stringliteral">&quot;Total&quot;</span>);</div>
-<div class="line"><a name="l17611"></a><span class="lineno">17611</span>&#160;        VmaPrintStatInfo(json, stats.<a class="code" href="struct_vma_stats.html#a2e8f5b3353f2fefef3c27f29e245a1f9">total</a>);</div>
-<div class="line"><a name="l17612"></a><span class="lineno">17612</span>&#160;    </div>
-<div class="line"><a name="l17613"></a><span class="lineno">17613</span>&#160;        <span class="keywordflow">for</span>(uint32_t heapIndex = 0; heapIndex &lt; allocator-&gt;GetMemoryHeapCount(); ++heapIndex)</div>
-<div class="line"><a name="l17614"></a><span class="lineno">17614</span>&#160;        {</div>
-<div class="line"><a name="l17615"></a><span class="lineno">17615</span>&#160;            json.BeginString(<span class="stringliteral">&quot;Heap &quot;</span>);</div>
-<div class="line"><a name="l17616"></a><span class="lineno">17616</span>&#160;            json.ContinueString(heapIndex);</div>
-<div class="line"><a name="l17617"></a><span class="lineno">17617</span>&#160;            json.EndString();</div>
-<div class="line"><a name="l17618"></a><span class="lineno">17618</span>&#160;            json.BeginObject();</div>
-<div class="line"><a name="l17619"></a><span class="lineno">17619</span>&#160; </div>
-<div class="line"><a name="l17620"></a><span class="lineno">17620</span>&#160;            json.WriteString(<span class="stringliteral">&quot;Size&quot;</span>);</div>
-<div class="line"><a name="l17621"></a><span class="lineno">17621</span>&#160;            json.WriteNumber(allocator-&gt;m_MemProps.memoryHeaps[heapIndex].size);</div>
-<div class="line"><a name="l17622"></a><span class="lineno">17622</span>&#160; </div>
-<div class="line"><a name="l17623"></a><span class="lineno">17623</span>&#160;            json.WriteString(<span class="stringliteral">&quot;Flags&quot;</span>);</div>
-<div class="line"><a name="l17624"></a><span class="lineno">17624</span>&#160;            json.BeginArray(<span class="keyword">true</span>);</div>
-<div class="line"><a name="l17625"></a><span class="lineno">17625</span>&#160;            <span class="keywordflow">if</span>((allocator-&gt;m_MemProps.memoryHeaps[heapIndex].flags &amp; VK_MEMORY_HEAP_DEVICE_LOCAL_BIT) != 0)</div>
-<div class="line"><a name="l17626"></a><span class="lineno">17626</span>&#160;            {</div>
-<div class="line"><a name="l17627"></a><span class="lineno">17627</span>&#160;                json.WriteString(<span class="stringliteral">&quot;DEVICE_LOCAL&quot;</span>);</div>
-<div class="line"><a name="l17628"></a><span class="lineno">17628</span>&#160;            }</div>
-<div class="line"><a name="l17629"></a><span class="lineno">17629</span>&#160;            json.EndArray();</div>
-<div class="line"><a name="l17630"></a><span class="lineno">17630</span>&#160; </div>
-<div class="line"><a name="l17631"></a><span class="lineno">17631</span>&#160;            json.WriteString(<span class="stringliteral">&quot;Budget&quot;</span>);</div>
-<div class="line"><a name="l17632"></a><span class="lineno">17632</span>&#160;            json.BeginObject();</div>
-<div class="line"><a name="l17633"></a><span class="lineno">17633</span>&#160;            {</div>
-<div class="line"><a name="l17634"></a><span class="lineno">17634</span>&#160;                json.WriteString(<span class="stringliteral">&quot;BlockBytes&quot;</span>);</div>
-<div class="line"><a name="l17635"></a><span class="lineno">17635</span>&#160;                json.WriteNumber(budget[heapIndex].blockBytes);</div>
-<div class="line"><a name="l17636"></a><span class="lineno">17636</span>&#160;                json.WriteString(<span class="stringliteral">&quot;AllocationBytes&quot;</span>);</div>
-<div class="line"><a name="l17637"></a><span class="lineno">17637</span>&#160;                json.WriteNumber(budget[heapIndex].allocationBytes);</div>
-<div class="line"><a name="l17638"></a><span class="lineno">17638</span>&#160;                json.WriteString(<span class="stringliteral">&quot;Usage&quot;</span>);</div>
-<div class="line"><a name="l17639"></a><span class="lineno">17639</span>&#160;                json.WriteNumber(budget[heapIndex].usage);</div>
-<div class="line"><a name="l17640"></a><span class="lineno">17640</span>&#160;                json.WriteString(<span class="stringliteral">&quot;Budget&quot;</span>);</div>
-<div class="line"><a name="l17641"></a><span class="lineno">17641</span>&#160;                json.WriteNumber(budget[heapIndex].budget);</div>
-<div class="line"><a name="l17642"></a><span class="lineno">17642</span>&#160;            }</div>
-<div class="line"><a name="l17643"></a><span class="lineno">17643</span>&#160;            json.EndObject();</div>
-<div class="line"><a name="l17644"></a><span class="lineno">17644</span>&#160; </div>
-<div class="line"><a name="l17645"></a><span class="lineno">17645</span>&#160;            <span class="keywordflow">if</span>(stats.<a class="code" href="struct_vma_stats.html#a0e6611508c29a187f0fd14ff1a0329c0">memoryHeap</a>[heapIndex].<a class="code" href="struct_vma_stat_info.html#abc4bb7cd611900778464c56e50c970a4">blockCount</a> &gt; 0)</div>
-<div class="line"><a name="l17646"></a><span class="lineno">17646</span>&#160;            {</div>
-<div class="line"><a name="l17647"></a><span class="lineno">17647</span>&#160;                json.WriteString(<span class="stringliteral">&quot;Stats&quot;</span>);</div>
-<div class="line"><a name="l17648"></a><span class="lineno">17648</span>&#160;                VmaPrintStatInfo(json, stats.<a class="code" href="struct_vma_stats.html#a0e6611508c29a187f0fd14ff1a0329c0">memoryHeap</a>[heapIndex]);</div>
-<div class="line"><a name="l17649"></a><span class="lineno">17649</span>&#160;            }</div>
-<div class="line"><a name="l17650"></a><span class="lineno">17650</span>&#160; </div>
-<div class="line"><a name="l17651"></a><span class="lineno">17651</span>&#160;            <span class="keywordflow">for</span>(uint32_t typeIndex = 0; typeIndex &lt; allocator-&gt;GetMemoryTypeCount(); ++typeIndex)</div>
-<div class="line"><a name="l17652"></a><span class="lineno">17652</span>&#160;            {</div>
-<div class="line"><a name="l17653"></a><span class="lineno">17653</span>&#160;                <span class="keywordflow">if</span>(allocator-&gt;MemoryTypeIndexToHeapIndex(typeIndex) == heapIndex)</div>
-<div class="line"><a name="l17654"></a><span class="lineno">17654</span>&#160;                {</div>
-<div class="line"><a name="l17655"></a><span class="lineno">17655</span>&#160;                    json.BeginString(<span class="stringliteral">&quot;Type &quot;</span>);</div>
-<div class="line"><a name="l17656"></a><span class="lineno">17656</span>&#160;                    json.ContinueString(typeIndex);</div>
-<div class="line"><a name="l17657"></a><span class="lineno">17657</span>&#160;                    json.EndString();</div>
-<div class="line"><a name="l17658"></a><span class="lineno">17658</span>&#160; </div>
-<div class="line"><a name="l17659"></a><span class="lineno">17659</span>&#160;                    json.BeginObject();</div>
-<div class="line"><a name="l17660"></a><span class="lineno">17660</span>&#160; </div>
-<div class="line"><a name="l17661"></a><span class="lineno">17661</span>&#160;                    json.WriteString(<span class="stringliteral">&quot;Flags&quot;</span>);</div>
-<div class="line"><a name="l17662"></a><span class="lineno">17662</span>&#160;                    json.BeginArray(<span class="keyword">true</span>);</div>
-<div class="line"><a name="l17663"></a><span class="lineno">17663</span>&#160;                    VkMemoryPropertyFlags flags = allocator-&gt;m_MemProps.memoryTypes[typeIndex].propertyFlags;</div>
-<div class="line"><a name="l17664"></a><span class="lineno">17664</span>&#160;                    <span class="keywordflow">if</span>((flags &amp; VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT) != 0)</div>
-<div class="line"><a name="l17665"></a><span class="lineno">17665</span>&#160;                    {</div>
-<div class="line"><a name="l17666"></a><span class="lineno">17666</span>&#160;                        json.WriteString(<span class="stringliteral">&quot;DEVICE_LOCAL&quot;</span>);</div>
-<div class="line"><a name="l17667"></a><span class="lineno">17667</span>&#160;                    }</div>
-<div class="line"><a name="l17668"></a><span class="lineno">17668</span>&#160;                    <span class="keywordflow">if</span>((flags &amp; VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT) != 0)</div>
-<div class="line"><a name="l17669"></a><span class="lineno">17669</span>&#160;                    {</div>
-<div class="line"><a name="l17670"></a><span class="lineno">17670</span>&#160;                        json.WriteString(<span class="stringliteral">&quot;HOST_VISIBLE&quot;</span>);</div>
-<div class="line"><a name="l17671"></a><span class="lineno">17671</span>&#160;                    }</div>
-<div class="line"><a name="l17672"></a><span class="lineno">17672</span>&#160;                    <span class="keywordflow">if</span>((flags &amp; VK_MEMORY_PROPERTY_HOST_COHERENT_BIT) != 0)</div>
-<div class="line"><a name="l17673"></a><span class="lineno">17673</span>&#160;                    {</div>
-<div class="line"><a name="l17674"></a><span class="lineno">17674</span>&#160;                        json.WriteString(<span class="stringliteral">&quot;HOST_COHERENT&quot;</span>);</div>
-<div class="line"><a name="l17675"></a><span class="lineno">17675</span>&#160;                    }</div>
-<div class="line"><a name="l17676"></a><span class="lineno">17676</span>&#160;                    <span class="keywordflow">if</span>((flags &amp; VK_MEMORY_PROPERTY_HOST_CACHED_BIT) != 0)</div>
-<div class="line"><a name="l17677"></a><span class="lineno">17677</span>&#160;                    {</div>
-<div class="line"><a name="l17678"></a><span class="lineno">17678</span>&#160;                        json.WriteString(<span class="stringliteral">&quot;HOST_CACHED&quot;</span>);</div>
-<div class="line"><a name="l17679"></a><span class="lineno">17679</span>&#160;                    }</div>
-<div class="line"><a name="l17680"></a><span class="lineno">17680</span>&#160;                    <span class="keywordflow">if</span>((flags &amp; VK_MEMORY_PROPERTY_LAZILY_ALLOCATED_BIT) != 0)</div>
-<div class="line"><a name="l17681"></a><span class="lineno">17681</span>&#160;                    {</div>
-<div class="line"><a name="l17682"></a><span class="lineno">17682</span>&#160;                        json.WriteString(<span class="stringliteral">&quot;LAZILY_ALLOCATED&quot;</span>);</div>
-<div class="line"><a name="l17683"></a><span class="lineno">17683</span>&#160;                    }</div>
-<div class="line"><a name="l17684"></a><span class="lineno">17684</span>&#160;                    <span class="keywordflow">if</span>((flags &amp; VK_MEMORY_PROPERTY_PROTECTED_BIT) != 0)</div>
-<div class="line"><a name="l17685"></a><span class="lineno">17685</span>&#160;                    {</div>
-<div class="line"><a name="l17686"></a><span class="lineno">17686</span>&#160;                        json.WriteString(<span class="stringliteral">&quot; PROTECTED&quot;</span>);</div>
-<div class="line"><a name="l17687"></a><span class="lineno">17687</span>&#160;                    }</div>
-<div class="line"><a name="l17688"></a><span class="lineno">17688</span>&#160;                    <span class="keywordflow">if</span>((flags &amp; VK_MEMORY_PROPERTY_DEVICE_COHERENT_BIT_AMD_COPY) != 0)</div>
-<div class="line"><a name="l17689"></a><span class="lineno">17689</span>&#160;                    {</div>
-<div class="line"><a name="l17690"></a><span class="lineno">17690</span>&#160;                        json.WriteString(<span class="stringliteral">&quot; DEVICE_COHERENT&quot;</span>);</div>
-<div class="line"><a name="l17691"></a><span class="lineno">17691</span>&#160;                    }</div>
-<div class="line"><a name="l17692"></a><span class="lineno">17692</span>&#160;                    <span class="keywordflow">if</span>((flags &amp; VK_MEMORY_PROPERTY_DEVICE_UNCACHED_BIT_AMD_COPY) != 0)</div>
-<div class="line"><a name="l17693"></a><span class="lineno">17693</span>&#160;                    {</div>
-<div class="line"><a name="l17694"></a><span class="lineno">17694</span>&#160;                        json.WriteString(<span class="stringliteral">&quot; DEVICE_UNCACHED&quot;</span>);</div>
-<div class="line"><a name="l17695"></a><span class="lineno">17695</span>&#160;                    }</div>
-<div class="line"><a name="l17696"></a><span class="lineno">17696</span>&#160;                    json.EndArray();</div>
-<div class="line"><a name="l17697"></a><span class="lineno">17697</span>&#160; </div>
-<div class="line"><a name="l17698"></a><span class="lineno">17698</span>&#160;                    <span class="keywordflow">if</span>(stats.<a class="code" href="struct_vma_stats.html#a13e3caf754be79352c42408756309331">memoryType</a>[typeIndex].<a class="code" href="struct_vma_stat_info.html#abc4bb7cd611900778464c56e50c970a4">blockCount</a> &gt; 0)</div>
-<div class="line"><a name="l17699"></a><span class="lineno">17699</span>&#160;                    {</div>
-<div class="line"><a name="l17700"></a><span class="lineno">17700</span>&#160;                        json.WriteString(<span class="stringliteral">&quot;Stats&quot;</span>);</div>
-<div class="line"><a name="l17701"></a><span class="lineno">17701</span>&#160;                        VmaPrintStatInfo(json, stats.<a class="code" href="struct_vma_stats.html#a13e3caf754be79352c42408756309331">memoryType</a>[typeIndex]);</div>
-<div class="line"><a name="l17702"></a><span class="lineno">17702</span>&#160;                    }</div>
+<div class="line"><a name="l17599"></a><span class="lineno">17599</span>&#160;VkResult VmaAllocator_T::Map(<a class="code" href="struct_vma_allocation.html">VmaAllocation</a> hAllocation, <span class="keywordtype">void</span>** ppData)</div>
+<div class="line"><a name="l17600"></a><span class="lineno">17600</span>&#160;{</div>
+<div class="line"><a name="l17601"></a><span class="lineno">17601</span>&#160;    <span class="keywordflow">if</span>(hAllocation-&gt;CanBecomeLost())</div>
+<div class="line"><a name="l17602"></a><span class="lineno">17602</span>&#160;    {</div>
+<div class="line"><a name="l17603"></a><span class="lineno">17603</span>&#160;        <span class="keywordflow">return</span> VK_ERROR_MEMORY_MAP_FAILED;</div>
+<div class="line"><a name="l17604"></a><span class="lineno">17604</span>&#160;    }</div>
+<div class="line"><a name="l17605"></a><span class="lineno">17605</span>&#160; </div>
+<div class="line"><a name="l17606"></a><span class="lineno">17606</span>&#160;    <span class="keywordflow">switch</span>(hAllocation-&gt;GetType())</div>
+<div class="line"><a name="l17607"></a><span class="lineno">17607</span>&#160;    {</div>
+<div class="line"><a name="l17608"></a><span class="lineno">17608</span>&#160;    <span class="keywordflow">case</span> VmaAllocation_T::ALLOCATION_TYPE_BLOCK:</div>
+<div class="line"><a name="l17609"></a><span class="lineno">17609</span>&#160;        {</div>
+<div class="line"><a name="l17610"></a><span class="lineno">17610</span>&#160;            VmaDeviceMemoryBlock* <span class="keyword">const</span> pBlock = hAllocation-&gt;GetBlock();</div>
+<div class="line"><a name="l17611"></a><span class="lineno">17611</span>&#160;            <span class="keywordtype">char</span> *pBytes = VMA_NULL;</div>
+<div class="line"><a name="l17612"></a><span class="lineno">17612</span>&#160;            VkResult res = pBlock-&gt;Map(<span class="keyword">this</span>, 1, (<span class="keywordtype">void</span>**)&amp;pBytes);</div>
+<div class="line"><a name="l17613"></a><span class="lineno">17613</span>&#160;            <span class="keywordflow">if</span>(res == VK_SUCCESS)</div>
+<div class="line"><a name="l17614"></a><span class="lineno">17614</span>&#160;            {</div>
+<div class="line"><a name="l17615"></a><span class="lineno">17615</span>&#160;                *ppData = pBytes + (ptrdiff_t)hAllocation-&gt;GetOffset();</div>
+<div class="line"><a name="l17616"></a><span class="lineno">17616</span>&#160;                hAllocation-&gt;BlockAllocMap();</div>
+<div class="line"><a name="l17617"></a><span class="lineno">17617</span>&#160;            }</div>
+<div class="line"><a name="l17618"></a><span class="lineno">17618</span>&#160;            <span class="keywordflow">return</span> res;</div>
+<div class="line"><a name="l17619"></a><span class="lineno">17619</span>&#160;        }</div>
+<div class="line"><a name="l17620"></a><span class="lineno">17620</span>&#160;    <span class="keywordflow">case</span> VmaAllocation_T::ALLOCATION_TYPE_DEDICATED:</div>
+<div class="line"><a name="l17621"></a><span class="lineno">17621</span>&#160;        <span class="keywordflow">return</span> hAllocation-&gt;DedicatedAllocMap(<span class="keyword">this</span>, ppData);</div>
+<div class="line"><a name="l17622"></a><span class="lineno">17622</span>&#160;    <span class="keywordflow">default</span>:</div>
+<div class="line"><a name="l17623"></a><span class="lineno">17623</span>&#160;        VMA_ASSERT(0);</div>
+<div class="line"><a name="l17624"></a><span class="lineno">17624</span>&#160;        <span class="keywordflow">return</span> VK_ERROR_MEMORY_MAP_FAILED;</div>
+<div class="line"><a name="l17625"></a><span class="lineno">17625</span>&#160;    }</div>
+<div class="line"><a name="l17626"></a><span class="lineno">17626</span>&#160;}</div>
+<div class="line"><a name="l17627"></a><span class="lineno">17627</span>&#160; </div>
+<div class="line"><a name="l17628"></a><span class="lineno">17628</span>&#160;<span class="keywordtype">void</span> VmaAllocator_T::Unmap(<a class="code" href="struct_vma_allocation.html">VmaAllocation</a> hAllocation)</div>
+<div class="line"><a name="l17629"></a><span class="lineno">17629</span>&#160;{</div>
+<div class="line"><a name="l17630"></a><span class="lineno">17630</span>&#160;    <span class="keywordflow">switch</span>(hAllocation-&gt;GetType())</div>
+<div class="line"><a name="l17631"></a><span class="lineno">17631</span>&#160;    {</div>
+<div class="line"><a name="l17632"></a><span class="lineno">17632</span>&#160;    <span class="keywordflow">case</span> VmaAllocation_T::ALLOCATION_TYPE_BLOCK:</div>
+<div class="line"><a name="l17633"></a><span class="lineno">17633</span>&#160;        {</div>
+<div class="line"><a name="l17634"></a><span class="lineno">17634</span>&#160;            VmaDeviceMemoryBlock* <span class="keyword">const</span> pBlock = hAllocation-&gt;GetBlock();</div>
+<div class="line"><a name="l17635"></a><span class="lineno">17635</span>&#160;            hAllocation-&gt;BlockAllocUnmap();</div>
+<div class="line"><a name="l17636"></a><span class="lineno">17636</span>&#160;            pBlock-&gt;Unmap(<span class="keyword">this</span>, 1);</div>
+<div class="line"><a name="l17637"></a><span class="lineno">17637</span>&#160;        }</div>
+<div class="line"><a name="l17638"></a><span class="lineno">17638</span>&#160;        <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l17639"></a><span class="lineno">17639</span>&#160;    <span class="keywordflow">case</span> VmaAllocation_T::ALLOCATION_TYPE_DEDICATED:</div>
+<div class="line"><a name="l17640"></a><span class="lineno">17640</span>&#160;        hAllocation-&gt;DedicatedAllocUnmap(<span class="keyword">this</span>);</div>
+<div class="line"><a name="l17641"></a><span class="lineno">17641</span>&#160;        <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l17642"></a><span class="lineno">17642</span>&#160;    <span class="keywordflow">default</span>:</div>
+<div class="line"><a name="l17643"></a><span class="lineno">17643</span>&#160;        VMA_ASSERT(0);</div>
+<div class="line"><a name="l17644"></a><span class="lineno">17644</span>&#160;    }</div>
+<div class="line"><a name="l17645"></a><span class="lineno">17645</span>&#160;}</div>
+<div class="line"><a name="l17646"></a><span class="lineno">17646</span>&#160; </div>
+<div class="line"><a name="l17647"></a><span class="lineno">17647</span>&#160;VkResult VmaAllocator_T::BindBufferMemory(</div>
+<div class="line"><a name="l17648"></a><span class="lineno">17648</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> hAllocation,</div>
+<div class="line"><a name="l17649"></a><span class="lineno">17649</span>&#160;    VkDeviceSize allocationLocalOffset,</div>
+<div class="line"><a name="l17650"></a><span class="lineno">17650</span>&#160;    VkBuffer hBuffer,</div>
+<div class="line"><a name="l17651"></a><span class="lineno">17651</span>&#160;    <span class="keyword">const</span> <span class="keywordtype">void</span>* pNext)</div>
+<div class="line"><a name="l17652"></a><span class="lineno">17652</span>&#160;{</div>
+<div class="line"><a name="l17653"></a><span class="lineno">17653</span>&#160;    VkResult res = VK_SUCCESS;</div>
+<div class="line"><a name="l17654"></a><span class="lineno">17654</span>&#160;    <span class="keywordflow">switch</span>(hAllocation-&gt;GetType())</div>
+<div class="line"><a name="l17655"></a><span class="lineno">17655</span>&#160;    {</div>
+<div class="line"><a name="l17656"></a><span class="lineno">17656</span>&#160;    <span class="keywordflow">case</span> VmaAllocation_T::ALLOCATION_TYPE_DEDICATED:</div>
+<div class="line"><a name="l17657"></a><span class="lineno">17657</span>&#160;        res = BindVulkanBuffer(hAllocation-&gt;GetMemory(), allocationLocalOffset, hBuffer, pNext);</div>
+<div class="line"><a name="l17658"></a><span class="lineno">17658</span>&#160;        <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l17659"></a><span class="lineno">17659</span>&#160;    <span class="keywordflow">case</span> VmaAllocation_T::ALLOCATION_TYPE_BLOCK:</div>
+<div class="line"><a name="l17660"></a><span class="lineno">17660</span>&#160;    {</div>
+<div class="line"><a name="l17661"></a><span class="lineno">17661</span>&#160;        VmaDeviceMemoryBlock* <span class="keyword">const</span> pBlock = hAllocation-&gt;GetBlock();</div>
+<div class="line"><a name="l17662"></a><span class="lineno">17662</span>&#160;        VMA_ASSERT(pBlock &amp;&amp; <span class="stringliteral">&quot;Binding buffer to allocation that doesn&#39;t belong to any block. Is the allocation lost?&quot;</span>);</div>
+<div class="line"><a name="l17663"></a><span class="lineno">17663</span>&#160;        res = pBlock-&gt;BindBufferMemory(<span class="keyword">this</span>, hAllocation, allocationLocalOffset, hBuffer, pNext);</div>
+<div class="line"><a name="l17664"></a><span class="lineno">17664</span>&#160;        <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l17665"></a><span class="lineno">17665</span>&#160;    }</div>
+<div class="line"><a name="l17666"></a><span class="lineno">17666</span>&#160;    <span class="keywordflow">default</span>:</div>
+<div class="line"><a name="l17667"></a><span class="lineno">17667</span>&#160;        VMA_ASSERT(0);</div>
+<div class="line"><a name="l17668"></a><span class="lineno">17668</span>&#160;    }</div>
+<div class="line"><a name="l17669"></a><span class="lineno">17669</span>&#160;    <span class="keywordflow">return</span> res;</div>
+<div class="line"><a name="l17670"></a><span class="lineno">17670</span>&#160;}</div>
+<div class="line"><a name="l17671"></a><span class="lineno">17671</span>&#160; </div>
+<div class="line"><a name="l17672"></a><span class="lineno">17672</span>&#160;VkResult VmaAllocator_T::BindImageMemory(</div>
+<div class="line"><a name="l17673"></a><span class="lineno">17673</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> hAllocation,</div>
+<div class="line"><a name="l17674"></a><span class="lineno">17674</span>&#160;    VkDeviceSize allocationLocalOffset,</div>
+<div class="line"><a name="l17675"></a><span class="lineno">17675</span>&#160;    VkImage hImage,</div>
+<div class="line"><a name="l17676"></a><span class="lineno">17676</span>&#160;    <span class="keyword">const</span> <span class="keywordtype">void</span>* pNext)</div>
+<div class="line"><a name="l17677"></a><span class="lineno">17677</span>&#160;{</div>
+<div class="line"><a name="l17678"></a><span class="lineno">17678</span>&#160;    VkResult res = VK_SUCCESS;</div>
+<div class="line"><a name="l17679"></a><span class="lineno">17679</span>&#160;    <span class="keywordflow">switch</span>(hAllocation-&gt;GetType())</div>
+<div class="line"><a name="l17680"></a><span class="lineno">17680</span>&#160;    {</div>
+<div class="line"><a name="l17681"></a><span class="lineno">17681</span>&#160;    <span class="keywordflow">case</span> VmaAllocation_T::ALLOCATION_TYPE_DEDICATED:</div>
+<div class="line"><a name="l17682"></a><span class="lineno">17682</span>&#160;        res = BindVulkanImage(hAllocation-&gt;GetMemory(), allocationLocalOffset, hImage, pNext);</div>
+<div class="line"><a name="l17683"></a><span class="lineno">17683</span>&#160;        <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l17684"></a><span class="lineno">17684</span>&#160;    <span class="keywordflow">case</span> VmaAllocation_T::ALLOCATION_TYPE_BLOCK:</div>
+<div class="line"><a name="l17685"></a><span class="lineno">17685</span>&#160;    {</div>
+<div class="line"><a name="l17686"></a><span class="lineno">17686</span>&#160;        VmaDeviceMemoryBlock* pBlock = hAllocation-&gt;GetBlock();</div>
+<div class="line"><a name="l17687"></a><span class="lineno">17687</span>&#160;        VMA_ASSERT(pBlock &amp;&amp; <span class="stringliteral">&quot;Binding image to allocation that doesn&#39;t belong to any block. Is the allocation lost?&quot;</span>);</div>
+<div class="line"><a name="l17688"></a><span class="lineno">17688</span>&#160;        res = pBlock-&gt;BindImageMemory(<span class="keyword">this</span>, hAllocation, allocationLocalOffset, hImage, pNext);</div>
+<div class="line"><a name="l17689"></a><span class="lineno">17689</span>&#160;        <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l17690"></a><span class="lineno">17690</span>&#160;    }</div>
+<div class="line"><a name="l17691"></a><span class="lineno">17691</span>&#160;    <span class="keywordflow">default</span>:</div>
+<div class="line"><a name="l17692"></a><span class="lineno">17692</span>&#160;        VMA_ASSERT(0);</div>
+<div class="line"><a name="l17693"></a><span class="lineno">17693</span>&#160;    }</div>
+<div class="line"><a name="l17694"></a><span class="lineno">17694</span>&#160;    <span class="keywordflow">return</span> res;</div>
+<div class="line"><a name="l17695"></a><span class="lineno">17695</span>&#160;}</div>
+<div class="line"><a name="l17696"></a><span class="lineno">17696</span>&#160; </div>
+<div class="line"><a name="l17697"></a><span class="lineno">17697</span>&#160;VkResult VmaAllocator_T::FlushOrInvalidateAllocation(</div>
+<div class="line"><a name="l17698"></a><span class="lineno">17698</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> hAllocation,</div>
+<div class="line"><a name="l17699"></a><span class="lineno">17699</span>&#160;    VkDeviceSize offset, VkDeviceSize size,</div>
+<div class="line"><a name="l17700"></a><span class="lineno">17700</span>&#160;    VMA_CACHE_OPERATION op)</div>
+<div class="line"><a name="l17701"></a><span class="lineno">17701</span>&#160;{</div>
+<div class="line"><a name="l17702"></a><span class="lineno">17702</span>&#160;    VkResult res = VK_SUCCESS;</div>
 <div class="line"><a name="l17703"></a><span class="lineno">17703</span>&#160; </div>
-<div class="line"><a name="l17704"></a><span class="lineno">17704</span>&#160;                    json.EndObject();</div>
-<div class="line"><a name="l17705"></a><span class="lineno">17705</span>&#160;                }</div>
-<div class="line"><a name="l17706"></a><span class="lineno">17706</span>&#160;            }</div>
-<div class="line"><a name="l17707"></a><span class="lineno">17707</span>&#160; </div>
-<div class="line"><a name="l17708"></a><span class="lineno">17708</span>&#160;            json.EndObject();</div>
-<div class="line"><a name="l17709"></a><span class="lineno">17709</span>&#160;        }</div>
-<div class="line"><a name="l17710"></a><span class="lineno">17710</span>&#160;        <span class="keywordflow">if</span>(detailedMap == VK_TRUE)</div>
-<div class="line"><a name="l17711"></a><span class="lineno">17711</span>&#160;        {</div>
-<div class="line"><a name="l17712"></a><span class="lineno">17712</span>&#160;            allocator-&gt;PrintDetailedMap(json);</div>
-<div class="line"><a name="l17713"></a><span class="lineno">17713</span>&#160;        }</div>
-<div class="line"><a name="l17714"></a><span class="lineno">17714</span>&#160; </div>
-<div class="line"><a name="l17715"></a><span class="lineno">17715</span>&#160;        json.EndObject();</div>
-<div class="line"><a name="l17716"></a><span class="lineno">17716</span>&#160;    }</div>
-<div class="line"><a name="l17717"></a><span class="lineno">17717</span>&#160; </div>
-<div class="line"><a name="l17718"></a><span class="lineno">17718</span>&#160;    <span class="keyword">const</span> <span class="keywordtype">size_t</span> len = sb.GetLength();</div>
-<div class="line"><a name="l17719"></a><span class="lineno">17719</span>&#160;    <span class="keywordtype">char</span>* <span class="keyword">const</span> pChars = vma_new_array(allocator, <span class="keywordtype">char</span>, len + 1);</div>
-<div class="line"><a name="l17720"></a><span class="lineno">17720</span>&#160;    <span class="keywordflow">if</span>(len &gt; 0)</div>
-<div class="line"><a name="l17721"></a><span class="lineno">17721</span>&#160;    {</div>
-<div class="line"><a name="l17722"></a><span class="lineno">17722</span>&#160;        memcpy(pChars, sb.GetData(), len);</div>
-<div class="line"><a name="l17723"></a><span class="lineno">17723</span>&#160;    }</div>
-<div class="line"><a name="l17724"></a><span class="lineno">17724</span>&#160;    pChars[len] = <span class="charliteral">&#39;\0&#39;</span>;</div>
-<div class="line"><a name="l17725"></a><span class="lineno">17725</span>&#160;    *ppStatsString = pChars;</div>
-<div class="line"><a name="l17726"></a><span class="lineno">17726</span>&#160;}</div>
-<div class="line"><a name="l17727"></a><span class="lineno">17727</span>&#160; </div>
-<div class="line"><a name="l17728"></a><span class="lineno">17728</span>&#160;VMA_CALL_PRE <span class="keywordtype">void</span> VMA_CALL_POST <a class="code" href="vk__mem__alloc_8h.html#a3104eb30d8122c84dd8541063f145288">vmaFreeStatsString</a>(</div>
-<div class="line"><a name="l17729"></a><span class="lineno">17729</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div>
-<div class="line"><a name="l17730"></a><span class="lineno">17730</span>&#160;    <span class="keywordtype">char</span>* pStatsString)</div>
-<div class="line"><a name="l17731"></a><span class="lineno">17731</span>&#160;{</div>
-<div class="line"><a name="l17732"></a><span class="lineno">17732</span>&#160;    <span class="keywordflow">if</span>(pStatsString != VMA_NULL)</div>
-<div class="line"><a name="l17733"></a><span class="lineno">17733</span>&#160;    {</div>
-<div class="line"><a name="l17734"></a><span class="lineno">17734</span>&#160;        VMA_ASSERT(allocator);</div>
-<div class="line"><a name="l17735"></a><span class="lineno">17735</span>&#160;        <span class="keywordtype">size_t</span> len = strlen(pStatsString);</div>
-<div class="line"><a name="l17736"></a><span class="lineno">17736</span>&#160;        vma_delete_array(allocator, pStatsString, len + 1);</div>
-<div class="line"><a name="l17737"></a><span class="lineno">17737</span>&#160;    }</div>
-<div class="line"><a name="l17738"></a><span class="lineno">17738</span>&#160;}</div>
-<div class="line"><a name="l17739"></a><span class="lineno">17739</span>&#160; </div>
-<div class="line"><a name="l17740"></a><span class="lineno">17740</span>&#160;<span class="preprocessor">#endif // #if VMA_STATS_STRING_ENABLED</span></div>
-<div class="line"><a name="l17741"></a><span class="lineno">17741</span>&#160; </div>
-<div class="line"><a name="l17742"></a><span class="lineno">17742</span>&#160;<span class="comment">/*</span></div>
-<div class="line"><a name="l17743"></a><span class="lineno">17743</span>&#160;<span class="comment">This function is not protected by any mutex because it just reads immutable data.</span></div>
-<div class="line"><a name="l17744"></a><span class="lineno">17744</span>&#160;<span class="comment">*/</span></div>
-<div class="line"><a name="l17745"></a><span class="lineno">17745</span>&#160;VMA_CALL_PRE VkResult VMA_CALL_POST <a class="code" href="vk__mem__alloc_8h.html#aef15a94b58fbcb0fe706d5720e84a74a">vmaFindMemoryTypeIndex</a>(</div>
-<div class="line"><a name="l17746"></a><span class="lineno">17746</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div>
-<div class="line"><a name="l17747"></a><span class="lineno">17747</span>&#160;    uint32_t memoryTypeBits,</div>
-<div class="line"><a name="l17748"></a><span class="lineno">17748</span>&#160;    <span class="keyword">const</span> <a class="code" href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a>* pAllocationCreateInfo,</div>
-<div class="line"><a name="l17749"></a><span class="lineno">17749</span>&#160;    uint32_t* pMemoryTypeIndex)</div>
-<div class="line"><a name="l17750"></a><span class="lineno">17750</span>&#160;{</div>
-<div class="line"><a name="l17751"></a><span class="lineno">17751</span>&#160;    VMA_ASSERT(allocator != VK_NULL_HANDLE);</div>
-<div class="line"><a name="l17752"></a><span class="lineno">17752</span>&#160;    VMA_ASSERT(pAllocationCreateInfo != VMA_NULL);</div>
-<div class="line"><a name="l17753"></a><span class="lineno">17753</span>&#160;    VMA_ASSERT(pMemoryTypeIndex != VMA_NULL);</div>
-<div class="line"><a name="l17754"></a><span class="lineno">17754</span>&#160; </div>
-<div class="line"><a name="l17755"></a><span class="lineno">17755</span>&#160;    memoryTypeBits &amp;= allocator-&gt;GetGlobalMemoryTypeBits();</div>
-<div class="line"><a name="l17756"></a><span class="lineno">17756</span>&#160; </div>
-<div class="line"><a name="l17757"></a><span class="lineno">17757</span>&#160;    <span class="keywordflow">if</span>(pAllocationCreateInfo-&gt;<a class="code" href="struct_vma_allocation_create_info.html#a3bf940c0271d85d6ba32a4d820075055">memoryTypeBits</a> != 0)</div>
-<div class="line"><a name="l17758"></a><span class="lineno">17758</span>&#160;    {</div>
-<div class="line"><a name="l17759"></a><span class="lineno">17759</span>&#160;        memoryTypeBits &amp;= pAllocationCreateInfo-&gt;<a class="code" href="struct_vma_allocation_create_info.html#a3bf940c0271d85d6ba32a4d820075055">memoryTypeBits</a>;</div>
-<div class="line"><a name="l17760"></a><span class="lineno">17760</span>&#160;    }</div>
-<div class="line"><a name="l17761"></a><span class="lineno">17761</span>&#160;    </div>
-<div class="line"><a name="l17762"></a><span class="lineno">17762</span>&#160;    uint32_t requiredFlags = pAllocationCreateInfo-&gt;<a class="code" href="struct_vma_allocation_create_info.html#a9166390303ff42d783305bc31c2b6b90">requiredFlags</a>;</div>
-<div class="line"><a name="l17763"></a><span class="lineno">17763</span>&#160;    uint32_t preferredFlags = pAllocationCreateInfo-&gt;<a class="code" href="struct_vma_allocation_create_info.html#a7fe8d81a1ad10b2a2faacacee5b15d6d">preferredFlags</a>;</div>
-<div class="line"><a name="l17764"></a><span class="lineno">17764</span>&#160;    uint32_t notPreferredFlags = 0;</div>
-<div class="line"><a name="l17765"></a><span class="lineno">17765</span>&#160; </div>
-<div class="line"><a name="l17766"></a><span class="lineno">17766</span>&#160;    <span class="comment">// Convert usage to requiredFlags and preferredFlags.</span></div>
-<div class="line"><a name="l17767"></a><span class="lineno">17767</span>&#160;    <span class="keywordflow">switch</span>(pAllocationCreateInfo-&gt;<a class="code" href="struct_vma_allocation_create_info.html#accb8b06b1f677d858cb9af20705fa910">usage</a>)</div>
-<div class="line"><a name="l17768"></a><span class="lineno">17768</span>&#160;    {</div>
-<div class="line"><a name="l17769"></a><span class="lineno">17769</span>&#160;    <span class="keywordflow">case</span> <a class="code" href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305ccaf50d27e34e0925cf3a63db8c839121dd">VMA_MEMORY_USAGE_UNKNOWN</a>:</div>
-<div class="line"><a name="l17770"></a><span class="lineno">17770</span>&#160;        <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l17771"></a><span class="lineno">17771</span>&#160;    <span class="keywordflow">case</span> <a class="code" href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305ccac6b5dc1432d88647aa4cd456246eadf7">VMA_MEMORY_USAGE_GPU_ONLY</a>:</div>
-<div class="line"><a name="l17772"></a><span class="lineno">17772</span>&#160;        <span class="keywordflow">if</span>(!allocator-&gt;IsIntegratedGpu() || (preferredFlags &amp; VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT) == 0)</div>
-<div class="line"><a name="l17773"></a><span class="lineno">17773</span>&#160;        {</div>
-<div class="line"><a name="l17774"></a><span class="lineno">17774</span>&#160;            preferredFlags |= VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT;</div>
-<div class="line"><a name="l17775"></a><span class="lineno">17775</span>&#160;        }</div>
-<div class="line"><a name="l17776"></a><span class="lineno">17776</span>&#160;        <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l17777"></a><span class="lineno">17777</span>&#160;    <span class="keywordflow">case</span> <a class="code" href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305cca40bdf4cddeffeb12f43d45ca1286e0a5">VMA_MEMORY_USAGE_CPU_ONLY</a>:</div>
-<div class="line"><a name="l17778"></a><span class="lineno">17778</span>&#160;        requiredFlags |= VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT;</div>
-<div class="line"><a name="l17779"></a><span class="lineno">17779</span>&#160;        <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l17780"></a><span class="lineno">17780</span>&#160;    <span class="keywordflow">case</span> <a class="code" href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305cca9066b52c5a7079bb74a69aaf8b92ff67">VMA_MEMORY_USAGE_CPU_TO_GPU</a>:</div>
-<div class="line"><a name="l17781"></a><span class="lineno">17781</span>&#160;        requiredFlags |= VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;</div>
-<div class="line"><a name="l17782"></a><span class="lineno">17782</span>&#160;        <span class="keywordflow">if</span>(!allocator-&gt;IsIntegratedGpu() || (preferredFlags &amp; VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT) == 0)</div>
-<div class="line"><a name="l17783"></a><span class="lineno">17783</span>&#160;        {</div>
-<div class="line"><a name="l17784"></a><span class="lineno">17784</span>&#160;            preferredFlags |= VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT;</div>
-<div class="line"><a name="l17785"></a><span class="lineno">17785</span>&#160;        }</div>
-<div class="line"><a name="l17786"></a><span class="lineno">17786</span>&#160;        <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l17787"></a><span class="lineno">17787</span>&#160;    <span class="keywordflow">case</span> <a class="code" href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305cca7b586d2fdaf82a463b58f581ed72be27">VMA_MEMORY_USAGE_GPU_TO_CPU</a>:</div>
-<div class="line"><a name="l17788"></a><span class="lineno">17788</span>&#160;        requiredFlags |= VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;</div>
-<div class="line"><a name="l17789"></a><span class="lineno">17789</span>&#160;        preferredFlags |= VK_MEMORY_PROPERTY_HOST_CACHED_BIT;</div>
-<div class="line"><a name="l17790"></a><span class="lineno">17790</span>&#160;        <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l17791"></a><span class="lineno">17791</span>&#160;    <span class="keywordflow">case</span> <a class="code" href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305cca416a444d4d0fc20067c3f76f32ff2500">VMA_MEMORY_USAGE_CPU_COPY</a>:</div>
-<div class="line"><a name="l17792"></a><span class="lineno">17792</span>&#160;        notPreferredFlags |= VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT;</div>
-<div class="line"><a name="l17793"></a><span class="lineno">17793</span>&#160;        <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l17794"></a><span class="lineno">17794</span>&#160;    <span class="keywordflow">case</span> <a class="code" href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305cca835333d9072db63a653818030e17614d">VMA_MEMORY_USAGE_GPU_LAZILY_ALLOCATED</a>:</div>
-<div class="line"><a name="l17795"></a><span class="lineno">17795</span>&#160;        requiredFlags |= VK_MEMORY_PROPERTY_LAZILY_ALLOCATED_BIT;</div>
-<div class="line"><a name="l17796"></a><span class="lineno">17796</span>&#160;        <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l17797"></a><span class="lineno">17797</span>&#160;    <span class="keywordflow">default</span>:</div>
-<div class="line"><a name="l17798"></a><span class="lineno">17798</span>&#160;        VMA_ASSERT(0);</div>
-<div class="line"><a name="l17799"></a><span class="lineno">17799</span>&#160;        <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l17800"></a><span class="lineno">17800</span>&#160;    }</div>
-<div class="line"><a name="l17801"></a><span class="lineno">17801</span>&#160; </div>
-<div class="line"><a name="l17802"></a><span class="lineno">17802</span>&#160;    <span class="comment">// Avoid DEVICE_COHERENT unless explicitly requested.</span></div>
-<div class="line"><a name="l17803"></a><span class="lineno">17803</span>&#160;    <span class="keywordflow">if</span>(((pAllocationCreateInfo-&gt;<a class="code" href="struct_vma_allocation_create_info.html#a9166390303ff42d783305bc31c2b6b90">requiredFlags</a> | pAllocationCreateInfo-&gt;<a class="code" href="struct_vma_allocation_create_info.html#a7fe8d81a1ad10b2a2faacacee5b15d6d">preferredFlags</a>) &amp;</div>
-<div class="line"><a name="l17804"></a><span class="lineno">17804</span>&#160;        (VK_MEMORY_PROPERTY_DEVICE_COHERENT_BIT_AMD_COPY | VK_MEMORY_PROPERTY_DEVICE_UNCACHED_BIT_AMD_COPY)) == 0)</div>
-<div class="line"><a name="l17805"></a><span class="lineno">17805</span>&#160;    {</div>
-<div class="line"><a name="l17806"></a><span class="lineno">17806</span>&#160;        notPreferredFlags |= VK_MEMORY_PROPERTY_DEVICE_COHERENT_BIT_AMD_COPY;</div>
-<div class="line"><a name="l17807"></a><span class="lineno">17807</span>&#160;    }</div>
-<div class="line"><a name="l17808"></a><span class="lineno">17808</span>&#160; </div>
-<div class="line"><a name="l17809"></a><span class="lineno">17809</span>&#160;    *pMemoryTypeIndex = UINT32_MAX;</div>
-<div class="line"><a name="l17810"></a><span class="lineno">17810</span>&#160;    uint32_t minCost = UINT32_MAX;</div>
-<div class="line"><a name="l17811"></a><span class="lineno">17811</span>&#160;    <span class="keywordflow">for</span>(uint32_t memTypeIndex = 0, memTypeBit = 1;</div>
-<div class="line"><a name="l17812"></a><span class="lineno">17812</span>&#160;        memTypeIndex &lt; allocator-&gt;GetMemoryTypeCount();</div>
-<div class="line"><a name="l17813"></a><span class="lineno">17813</span>&#160;        ++memTypeIndex, memTypeBit &lt;&lt;= 1)</div>
-<div class="line"><a name="l17814"></a><span class="lineno">17814</span>&#160;    {</div>
-<div class="line"><a name="l17815"></a><span class="lineno">17815</span>&#160;        <span class="comment">// This memory type is acceptable according to memoryTypeBits bitmask.</span></div>
-<div class="line"><a name="l17816"></a><span class="lineno">17816</span>&#160;        <span class="keywordflow">if</span>((memTypeBit &amp; memoryTypeBits) != 0)</div>
-<div class="line"><a name="l17817"></a><span class="lineno">17817</span>&#160;        {</div>
-<div class="line"><a name="l17818"></a><span class="lineno">17818</span>&#160;            <span class="keyword">const</span> VkMemoryPropertyFlags currFlags =</div>
-<div class="line"><a name="l17819"></a><span class="lineno">17819</span>&#160;                allocator-&gt;m_MemProps.memoryTypes[memTypeIndex].propertyFlags;</div>
-<div class="line"><a name="l17820"></a><span class="lineno">17820</span>&#160;            <span class="comment">// This memory type contains requiredFlags.</span></div>
-<div class="line"><a name="l17821"></a><span class="lineno">17821</span>&#160;            <span class="keywordflow">if</span>((requiredFlags &amp; ~currFlags) == 0)</div>
-<div class="line"><a name="l17822"></a><span class="lineno">17822</span>&#160;            {</div>
-<div class="line"><a name="l17823"></a><span class="lineno">17823</span>&#160;                <span class="comment">// Calculate cost as number of bits from preferredFlags not present in this memory type.</span></div>
-<div class="line"><a name="l17824"></a><span class="lineno">17824</span>&#160;                uint32_t currCost = VmaCountBitsSet(preferredFlags &amp; ~currFlags) +</div>
-<div class="line"><a name="l17825"></a><span class="lineno">17825</span>&#160;                    VmaCountBitsSet(currFlags &amp; notPreferredFlags);</div>
-<div class="line"><a name="l17826"></a><span class="lineno">17826</span>&#160;                <span class="comment">// Remember memory type with lowest cost.</span></div>
-<div class="line"><a name="l17827"></a><span class="lineno">17827</span>&#160;                <span class="keywordflow">if</span>(currCost &lt; minCost)</div>
-<div class="line"><a name="l17828"></a><span class="lineno">17828</span>&#160;                {</div>
-<div class="line"><a name="l17829"></a><span class="lineno">17829</span>&#160;                    *pMemoryTypeIndex = memTypeIndex;</div>
-<div class="line"><a name="l17830"></a><span class="lineno">17830</span>&#160;                    <span class="keywordflow">if</span>(currCost == 0)</div>
-<div class="line"><a name="l17831"></a><span class="lineno">17831</span>&#160;                    {</div>
-<div class="line"><a name="l17832"></a><span class="lineno">17832</span>&#160;                        <span class="keywordflow">return</span> VK_SUCCESS;</div>
-<div class="line"><a name="l17833"></a><span class="lineno">17833</span>&#160;                    }</div>
-<div class="line"><a name="l17834"></a><span class="lineno">17834</span>&#160;                    minCost = currCost;</div>
-<div class="line"><a name="l17835"></a><span class="lineno">17835</span>&#160;                }</div>
-<div class="line"><a name="l17836"></a><span class="lineno">17836</span>&#160;            }</div>
-<div class="line"><a name="l17837"></a><span class="lineno">17837</span>&#160;        }</div>
-<div class="line"><a name="l17838"></a><span class="lineno">17838</span>&#160;    }</div>
-<div class="line"><a name="l17839"></a><span class="lineno">17839</span>&#160;    <span class="keywordflow">return</span> (*pMemoryTypeIndex != UINT32_MAX) ? VK_SUCCESS : VK_ERROR_FEATURE_NOT_PRESENT;</div>
-<div class="line"><a name="l17840"></a><span class="lineno">17840</span>&#160;}</div>
-<div class="line"><a name="l17841"></a><span class="lineno">17841</span>&#160; </div>
-<div class="line"><a name="l17842"></a><span class="lineno">17842</span>&#160;VMA_CALL_PRE VkResult VMA_CALL_POST <a class="code" href="vk__mem__alloc_8h.html#ae790ab9ffaf7667fb8f62523e6897888">vmaFindMemoryTypeIndexForBufferInfo</a>(</div>
-<div class="line"><a name="l17843"></a><span class="lineno">17843</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div>
-<div class="line"><a name="l17844"></a><span class="lineno">17844</span>&#160;    <span class="keyword">const</span> VkBufferCreateInfo* pBufferCreateInfo,</div>
-<div class="line"><a name="l17845"></a><span class="lineno">17845</span>&#160;    <span class="keyword">const</span> <a class="code" href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a>* pAllocationCreateInfo,</div>
-<div class="line"><a name="l17846"></a><span class="lineno">17846</span>&#160;    uint32_t* pMemoryTypeIndex)</div>
-<div class="line"><a name="l17847"></a><span class="lineno">17847</span>&#160;{</div>
-<div class="line"><a name="l17848"></a><span class="lineno">17848</span>&#160;    VMA_ASSERT(allocator != VK_NULL_HANDLE);</div>
-<div class="line"><a name="l17849"></a><span class="lineno">17849</span>&#160;    VMA_ASSERT(pBufferCreateInfo != VMA_NULL);</div>
-<div class="line"><a name="l17850"></a><span class="lineno">17850</span>&#160;    VMA_ASSERT(pAllocationCreateInfo != VMA_NULL);</div>
-<div class="line"><a name="l17851"></a><span class="lineno">17851</span>&#160;    VMA_ASSERT(pMemoryTypeIndex != VMA_NULL);</div>
-<div class="line"><a name="l17852"></a><span class="lineno">17852</span>&#160; </div>
-<div class="line"><a name="l17853"></a><span class="lineno">17853</span>&#160;    <span class="keyword">const</span> VkDevice hDev = allocator-&gt;m_hDevice;</div>
-<div class="line"><a name="l17854"></a><span class="lineno">17854</span>&#160;    VkBuffer hBuffer = VK_NULL_HANDLE;</div>
-<div class="line"><a name="l17855"></a><span class="lineno">17855</span>&#160;    VkResult res = allocator-&gt;GetVulkanFunctions().vkCreateBuffer(</div>
-<div class="line"><a name="l17856"></a><span class="lineno">17856</span>&#160;        hDev, pBufferCreateInfo, allocator-&gt;GetAllocationCallbacks(), &amp;hBuffer);</div>
-<div class="line"><a name="l17857"></a><span class="lineno">17857</span>&#160;    <span class="keywordflow">if</span>(res == VK_SUCCESS)</div>
-<div class="line"><a name="l17858"></a><span class="lineno">17858</span>&#160;    {</div>
-<div class="line"><a name="l17859"></a><span class="lineno">17859</span>&#160;        VkMemoryRequirements memReq = {};</div>
-<div class="line"><a name="l17860"></a><span class="lineno">17860</span>&#160;        allocator-&gt;GetVulkanFunctions().vkGetBufferMemoryRequirements(</div>
-<div class="line"><a name="l17861"></a><span class="lineno">17861</span>&#160;            hDev, hBuffer, &amp;memReq);</div>
-<div class="line"><a name="l17862"></a><span class="lineno">17862</span>&#160; </div>
-<div class="line"><a name="l17863"></a><span class="lineno">17863</span>&#160;        res = <a class="code" href="vk__mem__alloc_8h.html#aef15a94b58fbcb0fe706d5720e84a74a">vmaFindMemoryTypeIndex</a>(</div>
-<div class="line"><a name="l17864"></a><span class="lineno">17864</span>&#160;            allocator,</div>
-<div class="line"><a name="l17865"></a><span class="lineno">17865</span>&#160;            memReq.memoryTypeBits,</div>
-<div class="line"><a name="l17866"></a><span class="lineno">17866</span>&#160;            pAllocationCreateInfo,</div>
-<div class="line"><a name="l17867"></a><span class="lineno">17867</span>&#160;            pMemoryTypeIndex);</div>
-<div class="line"><a name="l17868"></a><span class="lineno">17868</span>&#160; </div>
-<div class="line"><a name="l17869"></a><span class="lineno">17869</span>&#160;        allocator-&gt;GetVulkanFunctions().vkDestroyBuffer(</div>
-<div class="line"><a name="l17870"></a><span class="lineno">17870</span>&#160;            hDev, hBuffer, allocator-&gt;GetAllocationCallbacks());</div>
-<div class="line"><a name="l17871"></a><span class="lineno">17871</span>&#160;    }</div>
-<div class="line"><a name="l17872"></a><span class="lineno">17872</span>&#160;    <span class="keywordflow">return</span> res;</div>
-<div class="line"><a name="l17873"></a><span class="lineno">17873</span>&#160;}</div>
-<div class="line"><a name="l17874"></a><span class="lineno">17874</span>&#160; </div>
-<div class="line"><a name="l17875"></a><span class="lineno">17875</span>&#160;VMA_CALL_PRE VkResult VMA_CALL_POST <a class="code" href="vk__mem__alloc_8h.html#a088da83d8eaf3ce9056d9ea0b981d472">vmaFindMemoryTypeIndexForImageInfo</a>(</div>
-<div class="line"><a name="l17876"></a><span class="lineno">17876</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div>
-<div class="line"><a name="l17877"></a><span class="lineno">17877</span>&#160;    <span class="keyword">const</span> VkImageCreateInfo* pImageCreateInfo,</div>
-<div class="line"><a name="l17878"></a><span class="lineno">17878</span>&#160;    <span class="keyword">const</span> <a class="code" href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a>* pAllocationCreateInfo,</div>
-<div class="line"><a name="l17879"></a><span class="lineno">17879</span>&#160;    uint32_t* pMemoryTypeIndex)</div>
-<div class="line"><a name="l17880"></a><span class="lineno">17880</span>&#160;{</div>
-<div class="line"><a name="l17881"></a><span class="lineno">17881</span>&#160;    VMA_ASSERT(allocator != VK_NULL_HANDLE);</div>
-<div class="line"><a name="l17882"></a><span class="lineno">17882</span>&#160;    VMA_ASSERT(pImageCreateInfo != VMA_NULL);</div>
-<div class="line"><a name="l17883"></a><span class="lineno">17883</span>&#160;    VMA_ASSERT(pAllocationCreateInfo != VMA_NULL);</div>
-<div class="line"><a name="l17884"></a><span class="lineno">17884</span>&#160;    VMA_ASSERT(pMemoryTypeIndex != VMA_NULL);</div>
-<div class="line"><a name="l17885"></a><span class="lineno">17885</span>&#160; </div>
-<div class="line"><a name="l17886"></a><span class="lineno">17886</span>&#160;    <span class="keyword">const</span> VkDevice hDev = allocator-&gt;m_hDevice;</div>
-<div class="line"><a name="l17887"></a><span class="lineno">17887</span>&#160;    VkImage hImage = VK_NULL_HANDLE;</div>
-<div class="line"><a name="l17888"></a><span class="lineno">17888</span>&#160;    VkResult res = allocator-&gt;GetVulkanFunctions().vkCreateImage(</div>
-<div class="line"><a name="l17889"></a><span class="lineno">17889</span>&#160;        hDev, pImageCreateInfo, allocator-&gt;GetAllocationCallbacks(), &amp;hImage);</div>
-<div class="line"><a name="l17890"></a><span class="lineno">17890</span>&#160;    <span class="keywordflow">if</span>(res == VK_SUCCESS)</div>
-<div class="line"><a name="l17891"></a><span class="lineno">17891</span>&#160;    {</div>
-<div class="line"><a name="l17892"></a><span class="lineno">17892</span>&#160;        VkMemoryRequirements memReq = {};</div>
-<div class="line"><a name="l17893"></a><span class="lineno">17893</span>&#160;        allocator-&gt;GetVulkanFunctions().vkGetImageMemoryRequirements(</div>
-<div class="line"><a name="l17894"></a><span class="lineno">17894</span>&#160;            hDev, hImage, &amp;memReq);</div>
-<div class="line"><a name="l17895"></a><span class="lineno">17895</span>&#160; </div>
-<div class="line"><a name="l17896"></a><span class="lineno">17896</span>&#160;        res = <a class="code" href="vk__mem__alloc_8h.html#aef15a94b58fbcb0fe706d5720e84a74a">vmaFindMemoryTypeIndex</a>(</div>
-<div class="line"><a name="l17897"></a><span class="lineno">17897</span>&#160;            allocator,</div>
-<div class="line"><a name="l17898"></a><span class="lineno">17898</span>&#160;            memReq.memoryTypeBits,</div>
-<div class="line"><a name="l17899"></a><span class="lineno">17899</span>&#160;            pAllocationCreateInfo,</div>
-<div class="line"><a name="l17900"></a><span class="lineno">17900</span>&#160;            pMemoryTypeIndex);</div>
+<div class="line"><a name="l17704"></a><span class="lineno">17704</span>&#160;    VkMappedMemoryRange memRange = {};</div>
+<div class="line"><a name="l17705"></a><span class="lineno">17705</span>&#160;    <span class="keywordflow">if</span>(GetFlushOrInvalidateRange(hAllocation, offset, size, memRange))</div>
+<div class="line"><a name="l17706"></a><span class="lineno">17706</span>&#160;    {</div>
+<div class="line"><a name="l17707"></a><span class="lineno">17707</span>&#160;        <span class="keywordflow">switch</span>(op)</div>
+<div class="line"><a name="l17708"></a><span class="lineno">17708</span>&#160;        {</div>
+<div class="line"><a name="l17709"></a><span class="lineno">17709</span>&#160;        <span class="keywordflow">case</span> VMA_CACHE_FLUSH:</div>
+<div class="line"><a name="l17710"></a><span class="lineno">17710</span>&#160;            res = (*GetVulkanFunctions().vkFlushMappedMemoryRanges)(m_hDevice, 1, &amp;memRange);</div>
+<div class="line"><a name="l17711"></a><span class="lineno">17711</span>&#160;            <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l17712"></a><span class="lineno">17712</span>&#160;        <span class="keywordflow">case</span> VMA_CACHE_INVALIDATE:</div>
+<div class="line"><a name="l17713"></a><span class="lineno">17713</span>&#160;            res = (*GetVulkanFunctions().vkInvalidateMappedMemoryRanges)(m_hDevice, 1, &amp;memRange);</div>
+<div class="line"><a name="l17714"></a><span class="lineno">17714</span>&#160;            <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l17715"></a><span class="lineno">17715</span>&#160;        <span class="keywordflow">default</span>:</div>
+<div class="line"><a name="l17716"></a><span class="lineno">17716</span>&#160;            VMA_ASSERT(0);</div>
+<div class="line"><a name="l17717"></a><span class="lineno">17717</span>&#160;        }</div>
+<div class="line"><a name="l17718"></a><span class="lineno">17718</span>&#160;    }</div>
+<div class="line"><a name="l17719"></a><span class="lineno">17719</span>&#160;    <span class="comment">// else: Just ignore this call.</span></div>
+<div class="line"><a name="l17720"></a><span class="lineno">17720</span>&#160;    <span class="keywordflow">return</span> res;</div>
+<div class="line"><a name="l17721"></a><span class="lineno">17721</span>&#160;}</div>
+<div class="line"><a name="l17722"></a><span class="lineno">17722</span>&#160; </div>
+<div class="line"><a name="l17723"></a><span class="lineno">17723</span>&#160;VkResult VmaAllocator_T::FlushOrInvalidateAllocations(</div>
+<div class="line"><a name="l17724"></a><span class="lineno">17724</span>&#160;    uint32_t allocationCount,</div>
+<div class="line"><a name="l17725"></a><span class="lineno">17725</span>&#160;    <span class="keyword">const</span> <a class="code" href="struct_vma_allocation.html">VmaAllocation</a>* allocations,</div>
+<div class="line"><a name="l17726"></a><span class="lineno">17726</span>&#160;    <span class="keyword">const</span> VkDeviceSize* offsets, <span class="keyword">const</span> VkDeviceSize* sizes,</div>
+<div class="line"><a name="l17727"></a><span class="lineno">17727</span>&#160;    VMA_CACHE_OPERATION op)</div>
+<div class="line"><a name="l17728"></a><span class="lineno">17728</span>&#160;{</div>
+<div class="line"><a name="l17729"></a><span class="lineno">17729</span>&#160;    <span class="keyword">typedef</span> VmaStlAllocator&lt;VkMappedMemoryRange&gt; RangeAllocator;</div>
+<div class="line"><a name="l17730"></a><span class="lineno">17730</span>&#160;    <span class="keyword">typedef</span> VmaSmallVector&lt;VkMappedMemoryRange, RangeAllocator, 16&gt; RangeVector;</div>
+<div class="line"><a name="l17731"></a><span class="lineno">17731</span>&#160;    RangeVector ranges = RangeVector(RangeAllocator(GetAllocationCallbacks()));</div>
+<div class="line"><a name="l17732"></a><span class="lineno">17732</span>&#160; </div>
+<div class="line"><a name="l17733"></a><span class="lineno">17733</span>&#160;    <span class="keywordflow">for</span>(uint32_t allocIndex = 0; allocIndex &lt; allocationCount; ++allocIndex)</div>
+<div class="line"><a name="l17734"></a><span class="lineno">17734</span>&#160;    {</div>
+<div class="line"><a name="l17735"></a><span class="lineno">17735</span>&#160;        <span class="keyword">const</span> <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> alloc = allocations[allocIndex];</div>
+<div class="line"><a name="l17736"></a><span class="lineno">17736</span>&#160;        <span class="keyword">const</span> VkDeviceSize offset = offsets != VMA_NULL ? offsets[allocIndex] : 0;</div>
+<div class="line"><a name="l17737"></a><span class="lineno">17737</span>&#160;        <span class="keyword">const</span> VkDeviceSize size = sizes != VMA_NULL ? sizes[allocIndex] : VK_WHOLE_SIZE;</div>
+<div class="line"><a name="l17738"></a><span class="lineno">17738</span>&#160;        VkMappedMemoryRange newRange;</div>
+<div class="line"><a name="l17739"></a><span class="lineno">17739</span>&#160;        <span class="keywordflow">if</span>(GetFlushOrInvalidateRange(alloc, offset, size, newRange))</div>
+<div class="line"><a name="l17740"></a><span class="lineno">17740</span>&#160;        {</div>
+<div class="line"><a name="l17741"></a><span class="lineno">17741</span>&#160;            ranges.push_back(newRange);</div>
+<div class="line"><a name="l17742"></a><span class="lineno">17742</span>&#160;        }</div>
+<div class="line"><a name="l17743"></a><span class="lineno">17743</span>&#160;    }</div>
+<div class="line"><a name="l17744"></a><span class="lineno">17744</span>&#160; </div>
+<div class="line"><a name="l17745"></a><span class="lineno">17745</span>&#160;    VkResult res = VK_SUCCESS;</div>
+<div class="line"><a name="l17746"></a><span class="lineno">17746</span>&#160;    <span class="keywordflow">if</span>(!ranges.empty())</div>
+<div class="line"><a name="l17747"></a><span class="lineno">17747</span>&#160;    {</div>
+<div class="line"><a name="l17748"></a><span class="lineno">17748</span>&#160;        <span class="keywordflow">switch</span>(op)</div>
+<div class="line"><a name="l17749"></a><span class="lineno">17749</span>&#160;        {</div>
+<div class="line"><a name="l17750"></a><span class="lineno">17750</span>&#160;        <span class="keywordflow">case</span> VMA_CACHE_FLUSH:</div>
+<div class="line"><a name="l17751"></a><span class="lineno">17751</span>&#160;            res = (*GetVulkanFunctions().vkFlushMappedMemoryRanges)(m_hDevice, (uint32_t)ranges.size(), ranges.data());</div>
+<div class="line"><a name="l17752"></a><span class="lineno">17752</span>&#160;            <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l17753"></a><span class="lineno">17753</span>&#160;        <span class="keywordflow">case</span> VMA_CACHE_INVALIDATE:</div>
+<div class="line"><a name="l17754"></a><span class="lineno">17754</span>&#160;            res = (*GetVulkanFunctions().vkInvalidateMappedMemoryRanges)(m_hDevice, (uint32_t)ranges.size(), ranges.data());</div>
+<div class="line"><a name="l17755"></a><span class="lineno">17755</span>&#160;            <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l17756"></a><span class="lineno">17756</span>&#160;        <span class="keywordflow">default</span>:</div>
+<div class="line"><a name="l17757"></a><span class="lineno">17757</span>&#160;            VMA_ASSERT(0);</div>
+<div class="line"><a name="l17758"></a><span class="lineno">17758</span>&#160;        }</div>
+<div class="line"><a name="l17759"></a><span class="lineno">17759</span>&#160;    }</div>
+<div class="line"><a name="l17760"></a><span class="lineno">17760</span>&#160;    <span class="comment">// else: Just ignore this call.</span></div>
+<div class="line"><a name="l17761"></a><span class="lineno">17761</span>&#160;    <span class="keywordflow">return</span> res;</div>
+<div class="line"><a name="l17762"></a><span class="lineno">17762</span>&#160;}</div>
+<div class="line"><a name="l17763"></a><span class="lineno">17763</span>&#160; </div>
+<div class="line"><a name="l17764"></a><span class="lineno">17764</span>&#160;<span class="keywordtype">void</span> VmaAllocator_T::FreeDedicatedMemory(<span class="keyword">const</span> <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation)</div>
+<div class="line"><a name="l17765"></a><span class="lineno">17765</span>&#160;{</div>
+<div class="line"><a name="l17766"></a><span class="lineno">17766</span>&#160;    VMA_ASSERT(allocation &amp;&amp; allocation-&gt;GetType() == VmaAllocation_T::ALLOCATION_TYPE_DEDICATED);</div>
+<div class="line"><a name="l17767"></a><span class="lineno">17767</span>&#160; </div>
+<div class="line"><a name="l17768"></a><span class="lineno">17768</span>&#160;    <span class="keyword">const</span> uint32_t memTypeIndex = allocation-&gt;GetMemoryTypeIndex();</div>
+<div class="line"><a name="l17769"></a><span class="lineno">17769</span>&#160;    {</div>
+<div class="line"><a name="l17770"></a><span class="lineno">17770</span>&#160;        VmaMutexLockWrite lock(m_DedicatedAllocationsMutex[memTypeIndex], m_UseMutex);</div>
+<div class="line"><a name="l17771"></a><span class="lineno">17771</span>&#160;        DedicatedAllocationLinkedList&amp; dedicatedAllocations = m_DedicatedAllocations[memTypeIndex];</div>
+<div class="line"><a name="l17772"></a><span class="lineno">17772</span>&#160;        dedicatedAllocations.Remove(allocation);</div>
+<div class="line"><a name="l17773"></a><span class="lineno">17773</span>&#160;    }</div>
+<div class="line"><a name="l17774"></a><span class="lineno">17774</span>&#160; </div>
+<div class="line"><a name="l17775"></a><span class="lineno">17775</span>&#160;    VkDeviceMemory hMemory = allocation-&gt;GetMemory();</div>
+<div class="line"><a name="l17776"></a><span class="lineno">17776</span>&#160; </div>
+<div class="line"><a name="l17777"></a><span class="lineno">17777</span>&#160;    <span class="comment">/*</span></div>
+<div class="line"><a name="l17778"></a><span class="lineno">17778</span>&#160;<span class="comment">    There is no need to call this, because Vulkan spec allows to skip vkUnmapMemory</span></div>
+<div class="line"><a name="l17779"></a><span class="lineno">17779</span>&#160;<span class="comment">    before vkFreeMemory.</span></div>
+<div class="line"><a name="l17780"></a><span class="lineno">17780</span>&#160;<span class="comment"></span> </div>
+<div class="line"><a name="l17781"></a><span class="lineno">17781</span>&#160;<span class="comment">    if(allocation-&gt;GetMappedData() != VMA_NULL)</span></div>
+<div class="line"><a name="l17782"></a><span class="lineno">17782</span>&#160;<span class="comment">    {</span></div>
+<div class="line"><a name="l17783"></a><span class="lineno">17783</span>&#160;<span class="comment">        (*m_VulkanFunctions.vkUnmapMemory)(m_hDevice, hMemory);</span></div>
+<div class="line"><a name="l17784"></a><span class="lineno">17784</span>&#160;<span class="comment">    }</span></div>
+<div class="line"><a name="l17785"></a><span class="lineno">17785</span>&#160;<span class="comment">    */</span></div>
+<div class="line"><a name="l17786"></a><span class="lineno">17786</span>&#160; </div>
+<div class="line"><a name="l17787"></a><span class="lineno">17787</span>&#160;    FreeVulkanMemory(memTypeIndex, allocation-&gt;GetSize(), hMemory);</div>
+<div class="line"><a name="l17788"></a><span class="lineno">17788</span>&#160; </div>
+<div class="line"><a name="l17789"></a><span class="lineno">17789</span>&#160;    VMA_DEBUG_LOG(<span class="stringliteral">&quot;    Freed DedicatedMemory MemoryTypeIndex=%u&quot;</span>, memTypeIndex);</div>
+<div class="line"><a name="l17790"></a><span class="lineno">17790</span>&#160;}</div>
+<div class="line"><a name="l17791"></a><span class="lineno">17791</span>&#160; </div>
+<div class="line"><a name="l17792"></a><span class="lineno">17792</span>&#160;uint32_t VmaAllocator_T::CalculateGpuDefragmentationMemoryTypeBits()<span class="keyword"> const</span></div>
+<div class="line"><a name="l17793"></a><span class="lineno">17793</span>&#160;<span class="keyword"></span>{</div>
+<div class="line"><a name="l17794"></a><span class="lineno">17794</span>&#160;    VkBufferCreateInfo dummyBufCreateInfo;</div>
+<div class="line"><a name="l17795"></a><span class="lineno">17795</span>&#160;    VmaFillGpuDefragmentationBufferCreateInfo(dummyBufCreateInfo);</div>
+<div class="line"><a name="l17796"></a><span class="lineno">17796</span>&#160; </div>
+<div class="line"><a name="l17797"></a><span class="lineno">17797</span>&#160;    uint32_t memoryTypeBits = 0;</div>
+<div class="line"><a name="l17798"></a><span class="lineno">17798</span>&#160; </div>
+<div class="line"><a name="l17799"></a><span class="lineno">17799</span>&#160;    <span class="comment">// Create buffer.</span></div>
+<div class="line"><a name="l17800"></a><span class="lineno">17800</span>&#160;    VkBuffer buf = VK_NULL_HANDLE;</div>
+<div class="line"><a name="l17801"></a><span class="lineno">17801</span>&#160;    VkResult res = (*GetVulkanFunctions().vkCreateBuffer)(</div>
+<div class="line"><a name="l17802"></a><span class="lineno">17802</span>&#160;        m_hDevice, &amp;dummyBufCreateInfo, GetAllocationCallbacks(), &amp;buf);</div>
+<div class="line"><a name="l17803"></a><span class="lineno">17803</span>&#160;    <span class="keywordflow">if</span>(res == VK_SUCCESS)</div>
+<div class="line"><a name="l17804"></a><span class="lineno">17804</span>&#160;    {</div>
+<div class="line"><a name="l17805"></a><span class="lineno">17805</span>&#160;        <span class="comment">// Query for supported memory types.</span></div>
+<div class="line"><a name="l17806"></a><span class="lineno">17806</span>&#160;        VkMemoryRequirements memReq;</div>
+<div class="line"><a name="l17807"></a><span class="lineno">17807</span>&#160;        (*GetVulkanFunctions().vkGetBufferMemoryRequirements)(m_hDevice, buf, &amp;memReq);</div>
+<div class="line"><a name="l17808"></a><span class="lineno">17808</span>&#160;        memoryTypeBits = memReq.memoryTypeBits;</div>
+<div class="line"><a name="l17809"></a><span class="lineno">17809</span>&#160; </div>
+<div class="line"><a name="l17810"></a><span class="lineno">17810</span>&#160;        <span class="comment">// Destroy buffer.</span></div>
+<div class="line"><a name="l17811"></a><span class="lineno">17811</span>&#160;        (*GetVulkanFunctions().vkDestroyBuffer)(m_hDevice, buf, GetAllocationCallbacks());</div>
+<div class="line"><a name="l17812"></a><span class="lineno">17812</span>&#160;    }</div>
+<div class="line"><a name="l17813"></a><span class="lineno">17813</span>&#160; </div>
+<div class="line"><a name="l17814"></a><span class="lineno">17814</span>&#160;    <span class="keywordflow">return</span> memoryTypeBits;</div>
+<div class="line"><a name="l17815"></a><span class="lineno">17815</span>&#160;}</div>
+<div class="line"><a name="l17816"></a><span class="lineno">17816</span>&#160; </div>
+<div class="line"><a name="l17817"></a><span class="lineno">17817</span>&#160;uint32_t VmaAllocator_T::CalculateGlobalMemoryTypeBits()<span class="keyword"> const</span></div>
+<div class="line"><a name="l17818"></a><span class="lineno">17818</span>&#160;<span class="keyword"></span>{</div>
+<div class="line"><a name="l17819"></a><span class="lineno">17819</span>&#160;    <span class="comment">// Make sure memory information is already fetched.</span></div>
+<div class="line"><a name="l17820"></a><span class="lineno">17820</span>&#160;    VMA_ASSERT(GetMemoryTypeCount() &gt; 0);</div>
+<div class="line"><a name="l17821"></a><span class="lineno">17821</span>&#160; </div>
+<div class="line"><a name="l17822"></a><span class="lineno">17822</span>&#160;    uint32_t memoryTypeBits = UINT32_MAX;</div>
+<div class="line"><a name="l17823"></a><span class="lineno">17823</span>&#160; </div>
+<div class="line"><a name="l17824"></a><span class="lineno">17824</span>&#160;    <span class="keywordflow">if</span>(!m_UseAmdDeviceCoherentMemory)</div>
+<div class="line"><a name="l17825"></a><span class="lineno">17825</span>&#160;    {</div>
+<div class="line"><a name="l17826"></a><span class="lineno">17826</span>&#160;        <span class="comment">// Exclude memory types that have VK_MEMORY_PROPERTY_DEVICE_COHERENT_BIT_AMD.</span></div>
+<div class="line"><a name="l17827"></a><span class="lineno">17827</span>&#160;        <span class="keywordflow">for</span>(uint32_t memTypeIndex = 0; memTypeIndex &lt; GetMemoryTypeCount(); ++memTypeIndex)</div>
+<div class="line"><a name="l17828"></a><span class="lineno">17828</span>&#160;        {</div>
+<div class="line"><a name="l17829"></a><span class="lineno">17829</span>&#160;            <span class="keywordflow">if</span>((m_MemProps.memoryTypes[memTypeIndex].propertyFlags &amp; VK_MEMORY_PROPERTY_DEVICE_COHERENT_BIT_AMD_COPY) != 0)</div>
+<div class="line"><a name="l17830"></a><span class="lineno">17830</span>&#160;            {</div>
+<div class="line"><a name="l17831"></a><span class="lineno">17831</span>&#160;                memoryTypeBits &amp;= ~(1u &lt;&lt; memTypeIndex);</div>
+<div class="line"><a name="l17832"></a><span class="lineno">17832</span>&#160;            }</div>
+<div class="line"><a name="l17833"></a><span class="lineno">17833</span>&#160;        }</div>
+<div class="line"><a name="l17834"></a><span class="lineno">17834</span>&#160;    }</div>
+<div class="line"><a name="l17835"></a><span class="lineno">17835</span>&#160; </div>
+<div class="line"><a name="l17836"></a><span class="lineno">17836</span>&#160;    <span class="keywordflow">return</span> memoryTypeBits;</div>
+<div class="line"><a name="l17837"></a><span class="lineno">17837</span>&#160;}</div>
+<div class="line"><a name="l17838"></a><span class="lineno">17838</span>&#160; </div>
+<div class="line"><a name="l17839"></a><span class="lineno">17839</span>&#160;<span class="keywordtype">bool</span> VmaAllocator_T::GetFlushOrInvalidateRange(</div>
+<div class="line"><a name="l17840"></a><span class="lineno">17840</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation,</div>
+<div class="line"><a name="l17841"></a><span class="lineno">17841</span>&#160;    VkDeviceSize offset, VkDeviceSize size,</div>
+<div class="line"><a name="l17842"></a><span class="lineno">17842</span>&#160;    VkMappedMemoryRange&amp; outRange)<span class="keyword"> const</span></div>
+<div class="line"><a name="l17843"></a><span class="lineno">17843</span>&#160;<span class="keyword"></span>{</div>
+<div class="line"><a name="l17844"></a><span class="lineno">17844</span>&#160;    <span class="keyword">const</span> uint32_t memTypeIndex = allocation-&gt;GetMemoryTypeIndex();</div>
+<div class="line"><a name="l17845"></a><span class="lineno">17845</span>&#160;    <span class="keywordflow">if</span>(size &gt; 0 &amp;&amp; IsMemoryTypeNonCoherent(memTypeIndex))</div>
+<div class="line"><a name="l17846"></a><span class="lineno">17846</span>&#160;    {</div>
+<div class="line"><a name="l17847"></a><span class="lineno">17847</span>&#160;        <span class="keyword">const</span> VkDeviceSize nonCoherentAtomSize = m_PhysicalDeviceProperties.limits.nonCoherentAtomSize;</div>
+<div class="line"><a name="l17848"></a><span class="lineno">17848</span>&#160;        <span class="keyword">const</span> VkDeviceSize allocationSize = allocation-&gt;GetSize();</div>
+<div class="line"><a name="l17849"></a><span class="lineno">17849</span>&#160;        VMA_ASSERT(offset &lt;= allocationSize);</div>
+<div class="line"><a name="l17850"></a><span class="lineno">17850</span>&#160; </div>
+<div class="line"><a name="l17851"></a><span class="lineno">17851</span>&#160;        outRange.sType = VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE;</div>
+<div class="line"><a name="l17852"></a><span class="lineno">17852</span>&#160;        outRange.pNext = VMA_NULL;</div>
+<div class="line"><a name="l17853"></a><span class="lineno">17853</span>&#160;        outRange.memory = allocation-&gt;GetMemory();</div>
+<div class="line"><a name="l17854"></a><span class="lineno">17854</span>&#160; </div>
+<div class="line"><a name="l17855"></a><span class="lineno">17855</span>&#160;        <span class="keywordflow">switch</span>(allocation-&gt;GetType())</div>
+<div class="line"><a name="l17856"></a><span class="lineno">17856</span>&#160;        {</div>
+<div class="line"><a name="l17857"></a><span class="lineno">17857</span>&#160;        <span class="keywordflow">case</span> VmaAllocation_T::ALLOCATION_TYPE_DEDICATED:</div>
+<div class="line"><a name="l17858"></a><span class="lineno">17858</span>&#160;            outRange.offset = VmaAlignDown(offset, nonCoherentAtomSize);</div>
+<div class="line"><a name="l17859"></a><span class="lineno">17859</span>&#160;            <span class="keywordflow">if</span>(size == VK_WHOLE_SIZE)</div>
+<div class="line"><a name="l17860"></a><span class="lineno">17860</span>&#160;            {</div>
+<div class="line"><a name="l17861"></a><span class="lineno">17861</span>&#160;                outRange.size = allocationSize - outRange.offset;</div>
+<div class="line"><a name="l17862"></a><span class="lineno">17862</span>&#160;            }</div>
+<div class="line"><a name="l17863"></a><span class="lineno">17863</span>&#160;            <span class="keywordflow">else</span></div>
+<div class="line"><a name="l17864"></a><span class="lineno">17864</span>&#160;            {</div>
+<div class="line"><a name="l17865"></a><span class="lineno">17865</span>&#160;                VMA_ASSERT(offset + size &lt;= allocationSize);</div>
+<div class="line"><a name="l17866"></a><span class="lineno">17866</span>&#160;                outRange.size = VMA_MIN(</div>
+<div class="line"><a name="l17867"></a><span class="lineno">17867</span>&#160;                    VmaAlignUp(size + (offset - outRange.offset), nonCoherentAtomSize),</div>
+<div class="line"><a name="l17868"></a><span class="lineno">17868</span>&#160;                    allocationSize - outRange.offset);</div>
+<div class="line"><a name="l17869"></a><span class="lineno">17869</span>&#160;            }</div>
+<div class="line"><a name="l17870"></a><span class="lineno">17870</span>&#160;            <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l17871"></a><span class="lineno">17871</span>&#160;        <span class="keywordflow">case</span> VmaAllocation_T::ALLOCATION_TYPE_BLOCK:</div>
+<div class="line"><a name="l17872"></a><span class="lineno">17872</span>&#160;        {</div>
+<div class="line"><a name="l17873"></a><span class="lineno">17873</span>&#160;            <span class="comment">// 1. Still within this allocation.</span></div>
+<div class="line"><a name="l17874"></a><span class="lineno">17874</span>&#160;            outRange.offset = VmaAlignDown(offset, nonCoherentAtomSize);</div>
+<div class="line"><a name="l17875"></a><span class="lineno">17875</span>&#160;            <span class="keywordflow">if</span>(size == VK_WHOLE_SIZE)</div>
+<div class="line"><a name="l17876"></a><span class="lineno">17876</span>&#160;            {</div>
+<div class="line"><a name="l17877"></a><span class="lineno">17877</span>&#160;                size = allocationSize - offset;</div>
+<div class="line"><a name="l17878"></a><span class="lineno">17878</span>&#160;            }</div>
+<div class="line"><a name="l17879"></a><span class="lineno">17879</span>&#160;            <span class="keywordflow">else</span></div>
+<div class="line"><a name="l17880"></a><span class="lineno">17880</span>&#160;            {</div>
+<div class="line"><a name="l17881"></a><span class="lineno">17881</span>&#160;                VMA_ASSERT(offset + size &lt;= allocationSize);</div>
+<div class="line"><a name="l17882"></a><span class="lineno">17882</span>&#160;            }</div>
+<div class="line"><a name="l17883"></a><span class="lineno">17883</span>&#160;            outRange.size = VmaAlignUp(size + (offset - outRange.offset), nonCoherentAtomSize);</div>
+<div class="line"><a name="l17884"></a><span class="lineno">17884</span>&#160; </div>
+<div class="line"><a name="l17885"></a><span class="lineno">17885</span>&#160;            <span class="comment">// 2. Adjust to whole block.</span></div>
+<div class="line"><a name="l17886"></a><span class="lineno">17886</span>&#160;            <span class="keyword">const</span> VkDeviceSize allocationOffset = allocation-&gt;GetOffset();</div>
+<div class="line"><a name="l17887"></a><span class="lineno">17887</span>&#160;            VMA_ASSERT(allocationOffset % nonCoherentAtomSize == 0);</div>
+<div class="line"><a name="l17888"></a><span class="lineno">17888</span>&#160;            <span class="keyword">const</span> VkDeviceSize blockSize = allocation-&gt;GetBlock()-&gt;m_pMetadata-&gt;GetSize();</div>
+<div class="line"><a name="l17889"></a><span class="lineno">17889</span>&#160;            outRange.offset += allocationOffset;</div>
+<div class="line"><a name="l17890"></a><span class="lineno">17890</span>&#160;            outRange.size = VMA_MIN(outRange.size, blockSize - outRange.offset);</div>
+<div class="line"><a name="l17891"></a><span class="lineno">17891</span>&#160; </div>
+<div class="line"><a name="l17892"></a><span class="lineno">17892</span>&#160;            <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l17893"></a><span class="lineno">17893</span>&#160;        }</div>
+<div class="line"><a name="l17894"></a><span class="lineno">17894</span>&#160;        <span class="keywordflow">default</span>:</div>
+<div class="line"><a name="l17895"></a><span class="lineno">17895</span>&#160;            VMA_ASSERT(0);</div>
+<div class="line"><a name="l17896"></a><span class="lineno">17896</span>&#160;        }</div>
+<div class="line"><a name="l17897"></a><span class="lineno">17897</span>&#160;        <span class="keywordflow">return</span> <span class="keyword">true</span>;</div>
+<div class="line"><a name="l17898"></a><span class="lineno">17898</span>&#160;    }</div>
+<div class="line"><a name="l17899"></a><span class="lineno">17899</span>&#160;    <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
+<div class="line"><a name="l17900"></a><span class="lineno">17900</span>&#160;}</div>
 <div class="line"><a name="l17901"></a><span class="lineno">17901</span>&#160; </div>
-<div class="line"><a name="l17902"></a><span class="lineno">17902</span>&#160;        allocator-&gt;GetVulkanFunctions().vkDestroyImage(</div>
-<div class="line"><a name="l17903"></a><span class="lineno">17903</span>&#160;            hDev, hImage, allocator-&gt;GetAllocationCallbacks());</div>
-<div class="line"><a name="l17904"></a><span class="lineno">17904</span>&#160;    }</div>
-<div class="line"><a name="l17905"></a><span class="lineno">17905</span>&#160;    <span class="keywordflow">return</span> res;</div>
-<div class="line"><a name="l17906"></a><span class="lineno">17906</span>&#160;}</div>
+<div class="line"><a name="l17902"></a><span class="lineno">17902</span>&#160;<span class="preprocessor">#if VMA_MEMORY_BUDGET</span></div>
+<div class="line"><a name="l17903"></a><span class="lineno">17903</span>&#160; </div>
+<div class="line"><a name="l17904"></a><span class="lineno">17904</span>&#160;<span class="keywordtype">void</span> VmaAllocator_T::UpdateVulkanBudget()</div>
+<div class="line"><a name="l17905"></a><span class="lineno">17905</span>&#160;{</div>
+<div class="line"><a name="l17906"></a><span class="lineno">17906</span>&#160;    VMA_ASSERT(m_UseExtMemoryBudget);</div>
 <div class="line"><a name="l17907"></a><span class="lineno">17907</span>&#160; </div>
-<div class="line"><a name="l17908"></a><span class="lineno">17908</span>&#160;VMA_CALL_PRE VkResult VMA_CALL_POST <a class="code" href="vk__mem__alloc_8h.html#a5c8770ded7c59c8caac6de0c2cb00b50">vmaCreatePool</a>(</div>
-<div class="line"><a name="l17909"></a><span class="lineno">17909</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div>
-<div class="line"><a name="l17910"></a><span class="lineno">17910</span>&#160;    <span class="keyword">const</span> <a class="code" href="struct_vma_pool_create_info.html">VmaPoolCreateInfo</a>* pCreateInfo,</div>
-<div class="line"><a name="l17911"></a><span class="lineno">17911</span>&#160;    <a class="code" href="struct_vma_pool.html">VmaPool</a>* pPool)</div>
-<div class="line"><a name="l17912"></a><span class="lineno">17912</span>&#160;{</div>
-<div class="line"><a name="l17913"></a><span class="lineno">17913</span>&#160;    VMA_ASSERT(allocator &amp;&amp; pCreateInfo &amp;&amp; pPool);</div>
-<div class="line"><a name="l17914"></a><span class="lineno">17914</span>&#160;    </div>
-<div class="line"><a name="l17915"></a><span class="lineno">17915</span>&#160;    VMA_DEBUG_LOG(<span class="stringliteral">&quot;vmaCreatePool&quot;</span>);</div>
-<div class="line"><a name="l17916"></a><span class="lineno">17916</span>&#160;    </div>
-<div class="line"><a name="l17917"></a><span class="lineno">17917</span>&#160;    VMA_DEBUG_GLOBAL_MUTEX_LOCK</div>
-<div class="line"><a name="l17918"></a><span class="lineno">17918</span>&#160;    </div>
-<div class="line"><a name="l17919"></a><span class="lineno">17919</span>&#160;    VkResult res = allocator-&gt;CreatePool(pCreateInfo, pPool);</div>
-<div class="line"><a name="l17920"></a><span class="lineno">17920</span>&#160;    </div>
-<div class="line"><a name="l17921"></a><span class="lineno">17921</span>&#160;<span class="preprocessor">#if VMA_RECORDING_ENABLED</span></div>
-<div class="line"><a name="l17922"></a><span class="lineno">17922</span>&#160;    <span class="keywordflow">if</span>(allocator-&gt;GetRecorder() != VMA_NULL)</div>
-<div class="line"><a name="l17923"></a><span class="lineno">17923</span>&#160;    {</div>
-<div class="line"><a name="l17924"></a><span class="lineno">17924</span>&#160;        allocator-&gt;GetRecorder()-&gt;RecordCreatePool(allocator-&gt;GetCurrentFrameIndex(), *pCreateInfo, *pPool);</div>
-<div class="line"><a name="l17925"></a><span class="lineno">17925</span>&#160;    }</div>
-<div class="line"><a name="l17926"></a><span class="lineno">17926</span>&#160;<span class="preprocessor">#endif</span></div>
-<div class="line"><a name="l17927"></a><span class="lineno">17927</span>&#160;    </div>
-<div class="line"><a name="l17928"></a><span class="lineno">17928</span>&#160;    <span class="keywordflow">return</span> res;</div>
-<div class="line"><a name="l17929"></a><span class="lineno">17929</span>&#160;}</div>
-<div class="line"><a name="l17930"></a><span class="lineno">17930</span>&#160; </div>
-<div class="line"><a name="l17931"></a><span class="lineno">17931</span>&#160;VMA_CALL_PRE <span class="keywordtype">void</span> VMA_CALL_POST <a class="code" href="vk__mem__alloc_8h.html#a5485779c8f1948238fc4e92232fa65e1">vmaDestroyPool</a>(</div>
-<div class="line"><a name="l17932"></a><span class="lineno">17932</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div>
-<div class="line"><a name="l17933"></a><span class="lineno">17933</span>&#160;    <a class="code" href="struct_vma_pool.html">VmaPool</a> pool)</div>
-<div class="line"><a name="l17934"></a><span class="lineno">17934</span>&#160;{</div>
-<div class="line"><a name="l17935"></a><span class="lineno">17935</span>&#160;    VMA_ASSERT(allocator);</div>
-<div class="line"><a name="l17936"></a><span class="lineno">17936</span>&#160;    </div>
-<div class="line"><a name="l17937"></a><span class="lineno">17937</span>&#160;    <span class="keywordflow">if</span>(pool == VK_NULL_HANDLE)</div>
-<div class="line"><a name="l17938"></a><span class="lineno">17938</span>&#160;    {</div>
-<div class="line"><a name="l17939"></a><span class="lineno">17939</span>&#160;        <span class="keywordflow">return</span>;</div>
-<div class="line"><a name="l17940"></a><span class="lineno">17940</span>&#160;    }</div>
-<div class="line"><a name="l17941"></a><span class="lineno">17941</span>&#160;    </div>
-<div class="line"><a name="l17942"></a><span class="lineno">17942</span>&#160;    VMA_DEBUG_LOG(<span class="stringliteral">&quot;vmaDestroyPool&quot;</span>);</div>
-<div class="line"><a name="l17943"></a><span class="lineno">17943</span>&#160;    </div>
-<div class="line"><a name="l17944"></a><span class="lineno">17944</span>&#160;    VMA_DEBUG_GLOBAL_MUTEX_LOCK</div>
-<div class="line"><a name="l17945"></a><span class="lineno">17945</span>&#160;    </div>
-<div class="line"><a name="l17946"></a><span class="lineno">17946</span>&#160;<span class="preprocessor">#if VMA_RECORDING_ENABLED</span></div>
-<div class="line"><a name="l17947"></a><span class="lineno">17947</span>&#160;    <span class="keywordflow">if</span>(allocator-&gt;GetRecorder() != VMA_NULL)</div>
-<div class="line"><a name="l17948"></a><span class="lineno">17948</span>&#160;    {</div>
-<div class="line"><a name="l17949"></a><span class="lineno">17949</span>&#160;        allocator-&gt;GetRecorder()-&gt;RecordDestroyPool(allocator-&gt;GetCurrentFrameIndex(), pool);</div>
-<div class="line"><a name="l17950"></a><span class="lineno">17950</span>&#160;    }</div>
-<div class="line"><a name="l17951"></a><span class="lineno">17951</span>&#160;<span class="preprocessor">#endif</span></div>
-<div class="line"><a name="l17952"></a><span class="lineno">17952</span>&#160; </div>
-<div class="line"><a name="l17953"></a><span class="lineno">17953</span>&#160;    allocator-&gt;DestroyPool(pool);</div>
-<div class="line"><a name="l17954"></a><span class="lineno">17954</span>&#160;}</div>
-<div class="line"><a name="l17955"></a><span class="lineno">17955</span>&#160; </div>
-<div class="line"><a name="l17956"></a><span class="lineno">17956</span>&#160;VMA_CALL_PRE <span class="keywordtype">void</span> VMA_CALL_POST <a class="code" href="vk__mem__alloc_8h.html#ae8bf76997b234ef68aad922616df4153">vmaGetPoolStats</a>(</div>
-<div class="line"><a name="l17957"></a><span class="lineno">17957</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div>
-<div class="line"><a name="l17958"></a><span class="lineno">17958</span>&#160;    <a class="code" href="struct_vma_pool.html">VmaPool</a> pool,</div>
-<div class="line"><a name="l17959"></a><span class="lineno">17959</span>&#160;    <a class="code" href="struct_vma_pool_stats.html">VmaPoolStats</a>* pPoolStats)</div>
-<div class="line"><a name="l17960"></a><span class="lineno">17960</span>&#160;{</div>
-<div class="line"><a name="l17961"></a><span class="lineno">17961</span>&#160;    VMA_ASSERT(allocator &amp;&amp; pool &amp;&amp; pPoolStats);</div>
-<div class="line"><a name="l17962"></a><span class="lineno">17962</span>&#160; </div>
-<div class="line"><a name="l17963"></a><span class="lineno">17963</span>&#160;    VMA_DEBUG_GLOBAL_MUTEX_LOCK</div>
+<div class="line"><a name="l17908"></a><span class="lineno">17908</span>&#160;    VkPhysicalDeviceMemoryProperties2KHR memProps = { VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MEMORY_PROPERTIES_2_KHR };</div>
+<div class="line"><a name="l17909"></a><span class="lineno">17909</span>&#160; </div>
+<div class="line"><a name="l17910"></a><span class="lineno">17910</span>&#160;    VkPhysicalDeviceMemoryBudgetPropertiesEXT budgetProps = { VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MEMORY_BUDGET_PROPERTIES_EXT };</div>
+<div class="line"><a name="l17911"></a><span class="lineno">17911</span>&#160;    VmaPnextChainPushFront(&amp;memProps, &amp;budgetProps);</div>
+<div class="line"><a name="l17912"></a><span class="lineno">17912</span>&#160; </div>
+<div class="line"><a name="l17913"></a><span class="lineno">17913</span>&#160;    GetVulkanFunctions().vkGetPhysicalDeviceMemoryProperties2KHR(m_PhysicalDevice, &amp;memProps);</div>
+<div class="line"><a name="l17914"></a><span class="lineno">17914</span>&#160; </div>
+<div class="line"><a name="l17915"></a><span class="lineno">17915</span>&#160;    {</div>
+<div class="line"><a name="l17916"></a><span class="lineno">17916</span>&#160;        VmaMutexLockWrite lockWrite(m_Budget.m_BudgetMutex, m_UseMutex);</div>
+<div class="line"><a name="l17917"></a><span class="lineno">17917</span>&#160; </div>
+<div class="line"><a name="l17918"></a><span class="lineno">17918</span>&#160;        <span class="keywordflow">for</span>(uint32_t heapIndex = 0; heapIndex &lt; GetMemoryHeapCount(); ++heapIndex)</div>
+<div class="line"><a name="l17919"></a><span class="lineno">17919</span>&#160;        {</div>
+<div class="line"><a name="l17920"></a><span class="lineno">17920</span>&#160;            m_Budget.m_VulkanUsage[heapIndex] = budgetProps.heapUsage[heapIndex];</div>
+<div class="line"><a name="l17921"></a><span class="lineno">17921</span>&#160;            m_Budget.m_VulkanBudget[heapIndex] = budgetProps.heapBudget[heapIndex];</div>
+<div class="line"><a name="l17922"></a><span class="lineno">17922</span>&#160;            m_Budget.m_BlockBytesAtBudgetFetch[heapIndex] = m_Budget.m_BlockBytes[heapIndex].load();</div>
+<div class="line"><a name="l17923"></a><span class="lineno">17923</span>&#160; </div>
+<div class="line"><a name="l17924"></a><span class="lineno">17924</span>&#160;            <span class="comment">// Some bugged drivers return the budget incorrectly, e.g. 0 or much bigger than heap size.</span></div>
+<div class="line"><a name="l17925"></a><span class="lineno">17925</span>&#160;            <span class="keywordflow">if</span>(m_Budget.m_VulkanBudget[heapIndex] == 0)</div>
+<div class="line"><a name="l17926"></a><span class="lineno">17926</span>&#160;            {</div>
+<div class="line"><a name="l17927"></a><span class="lineno">17927</span>&#160;                m_Budget.m_VulkanBudget[heapIndex] = m_MemProps.memoryHeaps[heapIndex].size * 8 / 10; <span class="comment">// 80% heuristics.</span></div>
+<div class="line"><a name="l17928"></a><span class="lineno">17928</span>&#160;            }</div>
+<div class="line"><a name="l17929"></a><span class="lineno">17929</span>&#160;            <span class="keywordflow">else</span> <span class="keywordflow">if</span>(m_Budget.m_VulkanBudget[heapIndex] &gt; m_MemProps.memoryHeaps[heapIndex].size)</div>
+<div class="line"><a name="l17930"></a><span class="lineno">17930</span>&#160;            {</div>
+<div class="line"><a name="l17931"></a><span class="lineno">17931</span>&#160;                m_Budget.m_VulkanBudget[heapIndex] = m_MemProps.memoryHeaps[heapIndex].size;</div>
+<div class="line"><a name="l17932"></a><span class="lineno">17932</span>&#160;            }</div>
+<div class="line"><a name="l17933"></a><span class="lineno">17933</span>&#160;            <span class="keywordflow">if</span>(m_Budget.m_VulkanUsage[heapIndex] == 0 &amp;&amp; m_Budget.m_BlockBytesAtBudgetFetch[heapIndex] &gt; 0)</div>
+<div class="line"><a name="l17934"></a><span class="lineno">17934</span>&#160;            {</div>
+<div class="line"><a name="l17935"></a><span class="lineno">17935</span>&#160;                m_Budget.m_VulkanUsage[heapIndex] = m_Budget.m_BlockBytesAtBudgetFetch[heapIndex];</div>
+<div class="line"><a name="l17936"></a><span class="lineno">17936</span>&#160;            }</div>
+<div class="line"><a name="l17937"></a><span class="lineno">17937</span>&#160;        }</div>
+<div class="line"><a name="l17938"></a><span class="lineno">17938</span>&#160;        m_Budget.m_OperationsSinceBudgetFetch = 0;</div>
+<div class="line"><a name="l17939"></a><span class="lineno">17939</span>&#160;    }</div>
+<div class="line"><a name="l17940"></a><span class="lineno">17940</span>&#160;}</div>
+<div class="line"><a name="l17941"></a><span class="lineno">17941</span>&#160; </div>
+<div class="line"><a name="l17942"></a><span class="lineno">17942</span>&#160;<span class="preprocessor">#endif </span><span class="comment">// #if VMA_MEMORY_BUDGET</span></div>
+<div class="line"><a name="l17943"></a><span class="lineno">17943</span>&#160; </div>
+<div class="line"><a name="l17944"></a><span class="lineno">17944</span>&#160;<span class="keywordtype">void</span> VmaAllocator_T::FillAllocation(<span class="keyword">const</span> <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> hAllocation, uint8_t pattern)</div>
+<div class="line"><a name="l17945"></a><span class="lineno">17945</span>&#160;{</div>
+<div class="line"><a name="l17946"></a><span class="lineno">17946</span>&#160;    <span class="keywordflow">if</span>(VMA_DEBUG_INITIALIZE_ALLOCATIONS &amp;&amp;</div>
+<div class="line"><a name="l17947"></a><span class="lineno">17947</span>&#160;        !hAllocation-&gt;CanBecomeLost() &amp;&amp;</div>
+<div class="line"><a name="l17948"></a><span class="lineno">17948</span>&#160;        (m_MemProps.memoryTypes[hAllocation-&gt;GetMemoryTypeIndex()].propertyFlags &amp; VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT) != 0)</div>
+<div class="line"><a name="l17949"></a><span class="lineno">17949</span>&#160;    {</div>
+<div class="line"><a name="l17950"></a><span class="lineno">17950</span>&#160;        <span class="keywordtype">void</span>* pData = VMA_NULL;</div>
+<div class="line"><a name="l17951"></a><span class="lineno">17951</span>&#160;        VkResult res = Map(hAllocation, &amp;pData);</div>
+<div class="line"><a name="l17952"></a><span class="lineno">17952</span>&#160;        <span class="keywordflow">if</span>(res == VK_SUCCESS)</div>
+<div class="line"><a name="l17953"></a><span class="lineno">17953</span>&#160;        {</div>
+<div class="line"><a name="l17954"></a><span class="lineno">17954</span>&#160;            memset(pData, (<span class="keywordtype">int</span>)pattern, (<span class="keywordtype">size_t</span>)hAllocation-&gt;GetSize());</div>
+<div class="line"><a name="l17955"></a><span class="lineno">17955</span>&#160;            FlushOrInvalidateAllocation(hAllocation, 0, VK_WHOLE_SIZE, VMA_CACHE_FLUSH);</div>
+<div class="line"><a name="l17956"></a><span class="lineno">17956</span>&#160;            Unmap(hAllocation);</div>
+<div class="line"><a name="l17957"></a><span class="lineno">17957</span>&#160;        }</div>
+<div class="line"><a name="l17958"></a><span class="lineno">17958</span>&#160;        <span class="keywordflow">else</span></div>
+<div class="line"><a name="l17959"></a><span class="lineno">17959</span>&#160;        {</div>
+<div class="line"><a name="l17960"></a><span class="lineno">17960</span>&#160;            VMA_ASSERT(0 &amp;&amp; <span class="stringliteral">&quot;VMA_DEBUG_INITIALIZE_ALLOCATIONS is enabled, but couldn&#39;t map memory to fill allocation.&quot;</span>);</div>
+<div class="line"><a name="l17961"></a><span class="lineno">17961</span>&#160;        }</div>
+<div class="line"><a name="l17962"></a><span class="lineno">17962</span>&#160;    }</div>
+<div class="line"><a name="l17963"></a><span class="lineno">17963</span>&#160;}</div>
 <div class="line"><a name="l17964"></a><span class="lineno">17964</span>&#160; </div>
-<div class="line"><a name="l17965"></a><span class="lineno">17965</span>&#160;    allocator-&gt;GetPoolStats(pool, pPoolStats);</div>
-<div class="line"><a name="l17966"></a><span class="lineno">17966</span>&#160;}</div>
-<div class="line"><a name="l17967"></a><span class="lineno">17967</span>&#160; </div>
-<div class="line"><a name="l17968"></a><span class="lineno">17968</span>&#160;VMA_CALL_PRE <span class="keywordtype">void</span> VMA_CALL_POST <a class="code" href="vk__mem__alloc_8h.html#a736bd6cbda886f36c891727e73bd4024">vmaMakePoolAllocationsLost</a>(</div>
-<div class="line"><a name="l17969"></a><span class="lineno">17969</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div>
-<div class="line"><a name="l17970"></a><span class="lineno">17970</span>&#160;    <a class="code" href="struct_vma_pool.html">VmaPool</a> pool,</div>
-<div class="line"><a name="l17971"></a><span class="lineno">17971</span>&#160;    <span class="keywordtype">size_t</span>* pLostAllocationCount)</div>
-<div class="line"><a name="l17972"></a><span class="lineno">17972</span>&#160;{</div>
-<div class="line"><a name="l17973"></a><span class="lineno">17973</span>&#160;    VMA_ASSERT(allocator &amp;&amp; pool);</div>
-<div class="line"><a name="l17974"></a><span class="lineno">17974</span>&#160; </div>
-<div class="line"><a name="l17975"></a><span class="lineno">17975</span>&#160;    VMA_DEBUG_GLOBAL_MUTEX_LOCK</div>
-<div class="line"><a name="l17976"></a><span class="lineno">17976</span>&#160; </div>
-<div class="line"><a name="l17977"></a><span class="lineno">17977</span>&#160;<span class="preprocessor">#if VMA_RECORDING_ENABLED</span></div>
-<div class="line"><a name="l17978"></a><span class="lineno">17978</span>&#160;    <span class="keywordflow">if</span>(allocator-&gt;GetRecorder() != VMA_NULL)</div>
-<div class="line"><a name="l17979"></a><span class="lineno">17979</span>&#160;    {</div>
-<div class="line"><a name="l17980"></a><span class="lineno">17980</span>&#160;        allocator-&gt;GetRecorder()-&gt;RecordMakePoolAllocationsLost(allocator-&gt;GetCurrentFrameIndex(), pool);</div>
-<div class="line"><a name="l17981"></a><span class="lineno">17981</span>&#160;    }</div>
-<div class="line"><a name="l17982"></a><span class="lineno">17982</span>&#160;<span class="preprocessor">#endif</span></div>
-<div class="line"><a name="l17983"></a><span class="lineno">17983</span>&#160; </div>
-<div class="line"><a name="l17984"></a><span class="lineno">17984</span>&#160;    allocator-&gt;MakePoolAllocationsLost(pool, pLostAllocationCount);</div>
-<div class="line"><a name="l17985"></a><span class="lineno">17985</span>&#160;}</div>
-<div class="line"><a name="l17986"></a><span class="lineno">17986</span>&#160; </div>
-<div class="line"><a name="l17987"></a><span class="lineno">17987</span>&#160;VMA_CALL_PRE VkResult VMA_CALL_POST <a class="code" href="vk__mem__alloc_8h.html#ad535935619c7a549bf837e1bb0068f89">vmaCheckPoolCorruption</a>(<a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator, <a class="code" href="struct_vma_pool.html">VmaPool</a> pool)</div>
-<div class="line"><a name="l17988"></a><span class="lineno">17988</span>&#160;{</div>
-<div class="line"><a name="l17989"></a><span class="lineno">17989</span>&#160;    VMA_ASSERT(allocator &amp;&amp; pool);</div>
-<div class="line"><a name="l17990"></a><span class="lineno">17990</span>&#160; </div>
-<div class="line"><a name="l17991"></a><span class="lineno">17991</span>&#160;    VMA_DEBUG_GLOBAL_MUTEX_LOCK</div>
-<div class="line"><a name="l17992"></a><span class="lineno">17992</span>&#160; </div>
-<div class="line"><a name="l17993"></a><span class="lineno">17993</span>&#160;    VMA_DEBUG_LOG(<span class="stringliteral">&quot;vmaCheckPoolCorruption&quot;</span>);</div>
-<div class="line"><a name="l17994"></a><span class="lineno">17994</span>&#160; </div>
-<div class="line"><a name="l17995"></a><span class="lineno">17995</span>&#160;    <span class="keywordflow">return</span> allocator-&gt;CheckPoolCorruption(pool);</div>
-<div class="line"><a name="l17996"></a><span class="lineno">17996</span>&#160;}</div>
+<div class="line"><a name="l17965"></a><span class="lineno">17965</span>&#160;uint32_t VmaAllocator_T::GetGpuDefragmentationMemoryTypeBits()</div>
+<div class="line"><a name="l17966"></a><span class="lineno">17966</span>&#160;{</div>
+<div class="line"><a name="l17967"></a><span class="lineno">17967</span>&#160;    uint32_t memoryTypeBits = m_GpuDefragmentationMemoryTypeBits.load();</div>
+<div class="line"><a name="l17968"></a><span class="lineno">17968</span>&#160;    <span class="keywordflow">if</span>(memoryTypeBits == UINT32_MAX)</div>
+<div class="line"><a name="l17969"></a><span class="lineno">17969</span>&#160;    {</div>
+<div class="line"><a name="l17970"></a><span class="lineno">17970</span>&#160;        memoryTypeBits = CalculateGpuDefragmentationMemoryTypeBits();</div>
+<div class="line"><a name="l17971"></a><span class="lineno">17971</span>&#160;        m_GpuDefragmentationMemoryTypeBits.store(memoryTypeBits);</div>
+<div class="line"><a name="l17972"></a><span class="lineno">17972</span>&#160;    }</div>
+<div class="line"><a name="l17973"></a><span class="lineno">17973</span>&#160;    <span class="keywordflow">return</span> memoryTypeBits;</div>
+<div class="line"><a name="l17974"></a><span class="lineno">17974</span>&#160;}</div>
+<div class="line"><a name="l17975"></a><span class="lineno">17975</span>&#160; </div>
+<div class="line"><a name="l17976"></a><span class="lineno">17976</span>&#160;<span class="preprocessor">#if VMA_STATS_STRING_ENABLED</span></div>
+<div class="line"><a name="l17977"></a><span class="lineno">17977</span>&#160; </div>
+<div class="line"><a name="l17978"></a><span class="lineno">17978</span>&#160;<span class="keywordtype">void</span> VmaAllocator_T::PrintDetailedMap(VmaJsonWriter&amp; json)</div>
+<div class="line"><a name="l17979"></a><span class="lineno">17979</span>&#160;{</div>
+<div class="line"><a name="l17980"></a><span class="lineno">17980</span>&#160;    <span class="keywordtype">bool</span> dedicatedAllocationsStarted = <span class="keyword">false</span>;</div>
+<div class="line"><a name="l17981"></a><span class="lineno">17981</span>&#160;    <span class="keywordflow">for</span>(uint32_t memTypeIndex = 0; memTypeIndex &lt; GetMemoryTypeCount(); ++memTypeIndex)</div>
+<div class="line"><a name="l17982"></a><span class="lineno">17982</span>&#160;    {</div>
+<div class="line"><a name="l17983"></a><span class="lineno">17983</span>&#160;        VmaMutexLockRead dedicatedAllocationsLock(m_DedicatedAllocationsMutex[memTypeIndex], m_UseMutex);</div>
+<div class="line"><a name="l17984"></a><span class="lineno">17984</span>&#160;        DedicatedAllocationLinkedList&amp; dedicatedAllocList = m_DedicatedAllocations[memTypeIndex];</div>
+<div class="line"><a name="l17985"></a><span class="lineno">17985</span>&#160;        <span class="keywordflow">if</span>(!dedicatedAllocList.IsEmpty())</div>
+<div class="line"><a name="l17986"></a><span class="lineno">17986</span>&#160;        {</div>
+<div class="line"><a name="l17987"></a><span class="lineno">17987</span>&#160;            <span class="keywordflow">if</span>(dedicatedAllocationsStarted == <span class="keyword">false</span>)</div>
+<div class="line"><a name="l17988"></a><span class="lineno">17988</span>&#160;            {</div>
+<div class="line"><a name="l17989"></a><span class="lineno">17989</span>&#160;                dedicatedAllocationsStarted = <span class="keyword">true</span>;</div>
+<div class="line"><a name="l17990"></a><span class="lineno">17990</span>&#160;                json.WriteString(<span class="stringliteral">&quot;DedicatedAllocations&quot;</span>);</div>
+<div class="line"><a name="l17991"></a><span class="lineno">17991</span>&#160;                json.BeginObject();</div>
+<div class="line"><a name="l17992"></a><span class="lineno">17992</span>&#160;            }</div>
+<div class="line"><a name="l17993"></a><span class="lineno">17993</span>&#160; </div>
+<div class="line"><a name="l17994"></a><span class="lineno">17994</span>&#160;            json.BeginString(<span class="stringliteral">&quot;Type &quot;</span>);</div>
+<div class="line"><a name="l17995"></a><span class="lineno">17995</span>&#160;            json.ContinueString(memTypeIndex);</div>
+<div class="line"><a name="l17996"></a><span class="lineno">17996</span>&#160;            json.EndString();</div>
 <div class="line"><a name="l17997"></a><span class="lineno">17997</span>&#160; </div>
-<div class="line"><a name="l17998"></a><span class="lineno">17998</span>&#160;VMA_CALL_PRE <span class="keywordtype">void</span> VMA_CALL_POST <a class="code" href="vk__mem__alloc_8h.html#af09b4e4eafdbee812e8d73ddf960f030">vmaGetPoolName</a>(</div>
-<div class="line"><a name="l17999"></a><span class="lineno">17999</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div>
-<div class="line"><a name="l18000"></a><span class="lineno">18000</span>&#160;    <a class="code" href="struct_vma_pool.html">VmaPool</a> pool,</div>
-<div class="line"><a name="l18001"></a><span class="lineno">18001</span>&#160;    <span class="keyword">const</span> <span class="keywordtype">char</span>** ppName)</div>
-<div class="line"><a name="l18002"></a><span class="lineno">18002</span>&#160;{</div>
-<div class="line"><a name="l18003"></a><span class="lineno">18003</span>&#160;    VMA_ASSERT(allocator &amp;&amp; pool &amp;&amp; ppName);</div>
-<div class="line"><a name="l18004"></a><span class="lineno">18004</span>&#160;    </div>
-<div class="line"><a name="l18005"></a><span class="lineno">18005</span>&#160;    VMA_DEBUG_LOG(<span class="stringliteral">&quot;vmaGetPoolName&quot;</span>);</div>
-<div class="line"><a name="l18006"></a><span class="lineno">18006</span>&#160; </div>
-<div class="line"><a name="l18007"></a><span class="lineno">18007</span>&#160;    VMA_DEBUG_GLOBAL_MUTEX_LOCK</div>
-<div class="line"><a name="l18008"></a><span class="lineno">18008</span>&#160; </div>
-<div class="line"><a name="l18009"></a><span class="lineno">18009</span>&#160;    *ppName = pool-&gt;GetName();</div>
-<div class="line"><a name="l18010"></a><span class="lineno">18010</span>&#160;}</div>
-<div class="line"><a name="l18011"></a><span class="lineno">18011</span>&#160; </div>
-<div class="line"><a name="l18012"></a><span class="lineno">18012</span>&#160;VMA_CALL_PRE <span class="keywordtype">void</span> VMA_CALL_POST <a class="code" href="vk__mem__alloc_8h.html#adbae3a0b4ab078024462fc85c37f3b58">vmaSetPoolName</a>(</div>
-<div class="line"><a name="l18013"></a><span class="lineno">18013</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div>
-<div class="line"><a name="l18014"></a><span class="lineno">18014</span>&#160;    <a class="code" href="struct_vma_pool.html">VmaPool</a> pool,</div>
-<div class="line"><a name="l18015"></a><span class="lineno">18015</span>&#160;    <span class="keyword">const</span> <span class="keywordtype">char</span>* pName)</div>
-<div class="line"><a name="l18016"></a><span class="lineno">18016</span>&#160;{</div>
-<div class="line"><a name="l18017"></a><span class="lineno">18017</span>&#160;    VMA_ASSERT(allocator &amp;&amp; pool);</div>
-<div class="line"><a name="l18018"></a><span class="lineno">18018</span>&#160; </div>
-<div class="line"><a name="l18019"></a><span class="lineno">18019</span>&#160;    VMA_DEBUG_LOG(<span class="stringliteral">&quot;vmaSetPoolName&quot;</span>);</div>
-<div class="line"><a name="l18020"></a><span class="lineno">18020</span>&#160; </div>
-<div class="line"><a name="l18021"></a><span class="lineno">18021</span>&#160;    VMA_DEBUG_GLOBAL_MUTEX_LOCK</div>
-<div class="line"><a name="l18022"></a><span class="lineno">18022</span>&#160; </div>
-<div class="line"><a name="l18023"></a><span class="lineno">18023</span>&#160;    pool-&gt;SetName(pName);</div>
-<div class="line"><a name="l18024"></a><span class="lineno">18024</span>&#160; </div>
-<div class="line"><a name="l18025"></a><span class="lineno">18025</span>&#160;<span class="preprocessor">#if VMA_RECORDING_ENABLED</span></div>
-<div class="line"><a name="l18026"></a><span class="lineno">18026</span>&#160;    <span class="keywordflow">if</span>(allocator-&gt;GetRecorder() != VMA_NULL)</div>
-<div class="line"><a name="l18027"></a><span class="lineno">18027</span>&#160;    {</div>
-<div class="line"><a name="l18028"></a><span class="lineno">18028</span>&#160;        allocator-&gt;GetRecorder()-&gt;RecordSetPoolName(allocator-&gt;GetCurrentFrameIndex(), pool, pName);</div>
-<div class="line"><a name="l18029"></a><span class="lineno">18029</span>&#160;    }</div>
-<div class="line"><a name="l18030"></a><span class="lineno">18030</span>&#160;<span class="preprocessor">#endif</span></div>
-<div class="line"><a name="l18031"></a><span class="lineno">18031</span>&#160;}</div>
+<div class="line"><a name="l17998"></a><span class="lineno">17998</span>&#160;            json.BeginArray();</div>
+<div class="line"><a name="l17999"></a><span class="lineno">17999</span>&#160; </div>
+<div class="line"><a name="l18000"></a><span class="lineno">18000</span>&#160;            <span class="keywordflow">for</span>(<a class="code" href="struct_vma_allocation.html">VmaAllocation</a> alloc = dedicatedAllocList.Front();</div>
+<div class="line"><a name="l18001"></a><span class="lineno">18001</span>&#160;                alloc != VMA_NULL; alloc = dedicatedAllocList.GetNext(alloc))</div>
+<div class="line"><a name="l18002"></a><span class="lineno">18002</span>&#160;            {</div>
+<div class="line"><a name="l18003"></a><span class="lineno">18003</span>&#160;                json.BeginObject(<span class="keyword">true</span>);</div>
+<div class="line"><a name="l18004"></a><span class="lineno">18004</span>&#160;                alloc-&gt;PrintParameters(json);</div>
+<div class="line"><a name="l18005"></a><span class="lineno">18005</span>&#160;                json.EndObject();</div>
+<div class="line"><a name="l18006"></a><span class="lineno">18006</span>&#160;            }</div>
+<div class="line"><a name="l18007"></a><span class="lineno">18007</span>&#160; </div>
+<div class="line"><a name="l18008"></a><span class="lineno">18008</span>&#160;            json.EndArray();</div>
+<div class="line"><a name="l18009"></a><span class="lineno">18009</span>&#160;        }</div>
+<div class="line"><a name="l18010"></a><span class="lineno">18010</span>&#160;    }</div>
+<div class="line"><a name="l18011"></a><span class="lineno">18011</span>&#160;    <span class="keywordflow">if</span>(dedicatedAllocationsStarted)</div>
+<div class="line"><a name="l18012"></a><span class="lineno">18012</span>&#160;    {</div>
+<div class="line"><a name="l18013"></a><span class="lineno">18013</span>&#160;        json.EndObject();</div>
+<div class="line"><a name="l18014"></a><span class="lineno">18014</span>&#160;    }</div>
+<div class="line"><a name="l18015"></a><span class="lineno">18015</span>&#160; </div>
+<div class="line"><a name="l18016"></a><span class="lineno">18016</span>&#160;    {</div>
+<div class="line"><a name="l18017"></a><span class="lineno">18017</span>&#160;        <span class="keywordtype">bool</span> allocationsStarted = <span class="keyword">false</span>;</div>
+<div class="line"><a name="l18018"></a><span class="lineno">18018</span>&#160;        <span class="keywordflow">for</span>(uint32_t memTypeIndex = 0; memTypeIndex &lt; GetMemoryTypeCount(); ++memTypeIndex)</div>
+<div class="line"><a name="l18019"></a><span class="lineno">18019</span>&#160;        {</div>
+<div class="line"><a name="l18020"></a><span class="lineno">18020</span>&#160;            <span class="keywordflow">if</span>(m_pBlockVectors[memTypeIndex]-&gt;IsEmpty() == <span class="keyword">false</span>)</div>
+<div class="line"><a name="l18021"></a><span class="lineno">18021</span>&#160;            {</div>
+<div class="line"><a name="l18022"></a><span class="lineno">18022</span>&#160;                <span class="keywordflow">if</span>(allocationsStarted == <span class="keyword">false</span>)</div>
+<div class="line"><a name="l18023"></a><span class="lineno">18023</span>&#160;                {</div>
+<div class="line"><a name="l18024"></a><span class="lineno">18024</span>&#160;                    allocationsStarted = <span class="keyword">true</span>;</div>
+<div class="line"><a name="l18025"></a><span class="lineno">18025</span>&#160;                    json.WriteString(<span class="stringliteral">&quot;DefaultPools&quot;</span>);</div>
+<div class="line"><a name="l18026"></a><span class="lineno">18026</span>&#160;                    json.BeginObject();</div>
+<div class="line"><a name="l18027"></a><span class="lineno">18027</span>&#160;                }</div>
+<div class="line"><a name="l18028"></a><span class="lineno">18028</span>&#160; </div>
+<div class="line"><a name="l18029"></a><span class="lineno">18029</span>&#160;                json.BeginString(<span class="stringliteral">&quot;Type &quot;</span>);</div>
+<div class="line"><a name="l18030"></a><span class="lineno">18030</span>&#160;                json.ContinueString(memTypeIndex);</div>
+<div class="line"><a name="l18031"></a><span class="lineno">18031</span>&#160;                json.EndString();</div>
 <div class="line"><a name="l18032"></a><span class="lineno">18032</span>&#160; </div>
-<div class="line"><a name="l18033"></a><span class="lineno">18033</span>&#160;VMA_CALL_PRE VkResult VMA_CALL_POST <a class="code" href="vk__mem__alloc_8h.html#abf28077dbf82d0908b8acbe8ee8dd9b8">vmaAllocateMemory</a>(</div>
-<div class="line"><a name="l18034"></a><span class="lineno">18034</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div>
-<div class="line"><a name="l18035"></a><span class="lineno">18035</span>&#160;    <span class="keyword">const</span> VkMemoryRequirements* pVkMemoryRequirements,</div>
-<div class="line"><a name="l18036"></a><span class="lineno">18036</span>&#160;    <span class="keyword">const</span> <a class="code" href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a>* pCreateInfo,</div>
-<div class="line"><a name="l18037"></a><span class="lineno">18037</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a>* pAllocation,</div>
-<div class="line"><a name="l18038"></a><span class="lineno">18038</span>&#160;    <a class="code" href="struct_vma_allocation_info.html">VmaAllocationInfo</a>* pAllocationInfo)</div>
-<div class="line"><a name="l18039"></a><span class="lineno">18039</span>&#160;{</div>
-<div class="line"><a name="l18040"></a><span class="lineno">18040</span>&#160;    VMA_ASSERT(allocator &amp;&amp; pVkMemoryRequirements &amp;&amp; pCreateInfo &amp;&amp; pAllocation);</div>
+<div class="line"><a name="l18033"></a><span class="lineno">18033</span>&#160;                m_pBlockVectors[memTypeIndex]-&gt;PrintDetailedMap(json);</div>
+<div class="line"><a name="l18034"></a><span class="lineno">18034</span>&#160;            }</div>
+<div class="line"><a name="l18035"></a><span class="lineno">18035</span>&#160;        }</div>
+<div class="line"><a name="l18036"></a><span class="lineno">18036</span>&#160;        <span class="keywordflow">if</span>(allocationsStarted)</div>
+<div class="line"><a name="l18037"></a><span class="lineno">18037</span>&#160;        {</div>
+<div class="line"><a name="l18038"></a><span class="lineno">18038</span>&#160;            json.EndObject();</div>
+<div class="line"><a name="l18039"></a><span class="lineno">18039</span>&#160;        }</div>
+<div class="line"><a name="l18040"></a><span class="lineno">18040</span>&#160;    }</div>
 <div class="line"><a name="l18041"></a><span class="lineno">18041</span>&#160; </div>
-<div class="line"><a name="l18042"></a><span class="lineno">18042</span>&#160;    VMA_DEBUG_LOG(<span class="stringliteral">&quot;vmaAllocateMemory&quot;</span>);</div>
-<div class="line"><a name="l18043"></a><span class="lineno">18043</span>&#160; </div>
-<div class="line"><a name="l18044"></a><span class="lineno">18044</span>&#160;    VMA_DEBUG_GLOBAL_MUTEX_LOCK</div>
-<div class="line"><a name="l18045"></a><span class="lineno">18045</span>&#160; </div>
-<div class="line"><a name="l18046"></a><span class="lineno">18046</span>&#160;    VkResult result = allocator-&gt;AllocateMemory(</div>
-<div class="line"><a name="l18047"></a><span class="lineno">18047</span>&#160;        *pVkMemoryRequirements,</div>
-<div class="line"><a name="l18048"></a><span class="lineno">18048</span>&#160;        <span class="keyword">false</span>, <span class="comment">// requiresDedicatedAllocation</span></div>
-<div class="line"><a name="l18049"></a><span class="lineno">18049</span>&#160;        <span class="keyword">false</span>, <span class="comment">// prefersDedicatedAllocation</span></div>
-<div class="line"><a name="l18050"></a><span class="lineno">18050</span>&#160;        VK_NULL_HANDLE, <span class="comment">// dedicatedBuffer</span></div>
-<div class="line"><a name="l18051"></a><span class="lineno">18051</span>&#160;        UINT32_MAX, <span class="comment">// dedicatedBufferUsage</span></div>
-<div class="line"><a name="l18052"></a><span class="lineno">18052</span>&#160;        VK_NULL_HANDLE, <span class="comment">// dedicatedImage</span></div>
-<div class="line"><a name="l18053"></a><span class="lineno">18053</span>&#160;        *pCreateInfo,</div>
-<div class="line"><a name="l18054"></a><span class="lineno">18054</span>&#160;        VMA_SUBALLOCATION_TYPE_UNKNOWN,</div>
-<div class="line"><a name="l18055"></a><span class="lineno">18055</span>&#160;        1, <span class="comment">// allocationCount</span></div>
-<div class="line"><a name="l18056"></a><span class="lineno">18056</span>&#160;        pAllocation);</div>
-<div class="line"><a name="l18057"></a><span class="lineno">18057</span>&#160; </div>
-<div class="line"><a name="l18058"></a><span class="lineno">18058</span>&#160;<span class="preprocessor">#if VMA_RECORDING_ENABLED</span></div>
-<div class="line"><a name="l18059"></a><span class="lineno">18059</span>&#160;    <span class="keywordflow">if</span>(allocator-&gt;GetRecorder() != VMA_NULL)</div>
-<div class="line"><a name="l18060"></a><span class="lineno">18060</span>&#160;    {</div>
-<div class="line"><a name="l18061"></a><span class="lineno">18061</span>&#160;        allocator-&gt;GetRecorder()-&gt;RecordAllocateMemory(</div>
-<div class="line"><a name="l18062"></a><span class="lineno">18062</span>&#160;            allocator-&gt;GetCurrentFrameIndex(),</div>
-<div class="line"><a name="l18063"></a><span class="lineno">18063</span>&#160;            *pVkMemoryRequirements,</div>
-<div class="line"><a name="l18064"></a><span class="lineno">18064</span>&#160;            *pCreateInfo,</div>
-<div class="line"><a name="l18065"></a><span class="lineno">18065</span>&#160;            *pAllocation);</div>
-<div class="line"><a name="l18066"></a><span class="lineno">18066</span>&#160;    }</div>
-<div class="line"><a name="l18067"></a><span class="lineno">18067</span>&#160;<span class="preprocessor">#endif</span></div>
-<div class="line"><a name="l18068"></a><span class="lineno">18068</span>&#160;        </div>
-<div class="line"><a name="l18069"></a><span class="lineno">18069</span>&#160;    <span class="keywordflow">if</span>(pAllocationInfo != VMA_NULL &amp;&amp; result == VK_SUCCESS)</div>
-<div class="line"><a name="l18070"></a><span class="lineno">18070</span>&#160;    {</div>
-<div class="line"><a name="l18071"></a><span class="lineno">18071</span>&#160;        allocator-&gt;GetAllocationInfo(*pAllocation, pAllocationInfo);</div>
-<div class="line"><a name="l18072"></a><span class="lineno">18072</span>&#160;    }</div>
-<div class="line"><a name="l18073"></a><span class="lineno">18073</span>&#160; </div>
-<div class="line"><a name="l18074"></a><span class="lineno">18074</span>&#160;    <span class="keywordflow">return</span> result;</div>
-<div class="line"><a name="l18075"></a><span class="lineno">18075</span>&#160;}</div>
-<div class="line"><a name="l18076"></a><span class="lineno">18076</span>&#160; </div>
-<div class="line"><a name="l18077"></a><span class="lineno">18077</span>&#160;VMA_CALL_PRE VkResult VMA_CALL_POST <a class="code" href="vk__mem__alloc_8h.html#ad37e82e492b3de38fc3f4cffd9ad0ae1">vmaAllocateMemoryPages</a>(</div>
-<div class="line"><a name="l18078"></a><span class="lineno">18078</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div>
-<div class="line"><a name="l18079"></a><span class="lineno">18079</span>&#160;    <span class="keyword">const</span> VkMemoryRequirements* pVkMemoryRequirements,</div>
-<div class="line"><a name="l18080"></a><span class="lineno">18080</span>&#160;    <span class="keyword">const</span> <a class="code" href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a>* pCreateInfo,</div>
-<div class="line"><a name="l18081"></a><span class="lineno">18081</span>&#160;    <span class="keywordtype">size_t</span> allocationCount,</div>
-<div class="line"><a name="l18082"></a><span class="lineno">18082</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a>* pAllocations,</div>
-<div class="line"><a name="l18083"></a><span class="lineno">18083</span>&#160;    <a class="code" href="struct_vma_allocation_info.html">VmaAllocationInfo</a>* pAllocationInfo)</div>
-<div class="line"><a name="l18084"></a><span class="lineno">18084</span>&#160;{</div>
-<div class="line"><a name="l18085"></a><span class="lineno">18085</span>&#160;    <span class="keywordflow">if</span>(allocationCount == 0)</div>
-<div class="line"><a name="l18086"></a><span class="lineno">18086</span>&#160;    {</div>
-<div class="line"><a name="l18087"></a><span class="lineno">18087</span>&#160;        <span class="keywordflow">return</span> VK_SUCCESS;</div>
-<div class="line"><a name="l18088"></a><span class="lineno">18088</span>&#160;    }</div>
+<div class="line"><a name="l18042"></a><span class="lineno">18042</span>&#160;    <span class="comment">// Custom pools</span></div>
+<div class="line"><a name="l18043"></a><span class="lineno">18043</span>&#160;    {</div>
+<div class="line"><a name="l18044"></a><span class="lineno">18044</span>&#160;        VmaMutexLockRead lock(m_PoolsMutex, m_UseMutex);</div>
+<div class="line"><a name="l18045"></a><span class="lineno">18045</span>&#160;        <span class="keywordflow">if</span>(!m_Pools.IsEmpty())</div>
+<div class="line"><a name="l18046"></a><span class="lineno">18046</span>&#160;        {</div>
+<div class="line"><a name="l18047"></a><span class="lineno">18047</span>&#160;            json.WriteString(<span class="stringliteral">&quot;Pools&quot;</span>);</div>
+<div class="line"><a name="l18048"></a><span class="lineno">18048</span>&#160;            json.BeginObject();</div>
+<div class="line"><a name="l18049"></a><span class="lineno">18049</span>&#160;            <span class="keywordflow">for</span>(<a class="code" href="struct_vma_pool.html">VmaPool</a> pool = m_Pools.Front(); pool != VMA_NULL; pool = m_Pools.GetNext(pool))</div>
+<div class="line"><a name="l18050"></a><span class="lineno">18050</span>&#160;            {</div>
+<div class="line"><a name="l18051"></a><span class="lineno">18051</span>&#160;                json.BeginString();</div>
+<div class="line"><a name="l18052"></a><span class="lineno">18052</span>&#160;                json.ContinueString(pool-&gt;GetId());</div>
+<div class="line"><a name="l18053"></a><span class="lineno">18053</span>&#160;                json.EndString();</div>
+<div class="line"><a name="l18054"></a><span class="lineno">18054</span>&#160; </div>
+<div class="line"><a name="l18055"></a><span class="lineno">18055</span>&#160;                pool-&gt;m_BlockVector.PrintDetailedMap(json);</div>
+<div class="line"><a name="l18056"></a><span class="lineno">18056</span>&#160;            }</div>
+<div class="line"><a name="l18057"></a><span class="lineno">18057</span>&#160;            json.EndObject();</div>
+<div class="line"><a name="l18058"></a><span class="lineno">18058</span>&#160;        }</div>
+<div class="line"><a name="l18059"></a><span class="lineno">18059</span>&#160;    }</div>
+<div class="line"><a name="l18060"></a><span class="lineno">18060</span>&#160;}</div>
+<div class="line"><a name="l18061"></a><span class="lineno">18061</span>&#160; </div>
+<div class="line"><a name="l18062"></a><span class="lineno">18062</span>&#160;<span class="preprocessor">#endif </span><span class="comment">// #if VMA_STATS_STRING_ENABLED</span></div>
+<div class="line"><a name="l18063"></a><span class="lineno">18063</span>&#160; </div>
+<div class="line"><a name="l18065"></a><span class="lineno">18065</span>&#160;<span class="comment">// Public interface</span></div>
+<div class="line"><a name="l18066"></a><span class="lineno">18066</span>&#160; </div>
+<div class="line"><a name="l18067"></a><span class="lineno">18067</span>&#160;VMA_CALL_PRE VkResult VMA_CALL_POST <a class="code" href="vk__mem__alloc_8h.html#a200692051ddb34240248234f5f4c17bb">vmaCreateAllocator</a>(</div>
+<div class="line"><a name="l18068"></a><span class="lineno">18068</span>&#160;    <span class="keyword">const</span> <a class="code" href="struct_vma_allocator_create_info.html">VmaAllocatorCreateInfo</a>* pCreateInfo,</div>
+<div class="line"><a name="l18069"></a><span class="lineno">18069</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a>* pAllocator)</div>
+<div class="line"><a name="l18070"></a><span class="lineno">18070</span>&#160;{</div>
+<div class="line"><a name="l18071"></a><span class="lineno">18071</span>&#160;    VMA_ASSERT(pCreateInfo &amp;&amp; pAllocator);</div>
+<div class="line"><a name="l18072"></a><span class="lineno">18072</span>&#160;    VMA_ASSERT(pCreateInfo-&gt;<a class="code" href="struct_vma_allocator_create_info.html#ae0ffc55139b54520a6bb704b29ffc285">vulkanApiVersion</a> == 0 ||</div>
+<div class="line"><a name="l18073"></a><span class="lineno">18073</span>&#160;        (VK_VERSION_MAJOR(pCreateInfo-&gt;<a class="code" href="struct_vma_allocator_create_info.html#ae0ffc55139b54520a6bb704b29ffc285">vulkanApiVersion</a>) == 1 &amp;&amp; VK_VERSION_MINOR(pCreateInfo-&gt;<a class="code" href="struct_vma_allocator_create_info.html#ae0ffc55139b54520a6bb704b29ffc285">vulkanApiVersion</a>) &lt;= 2));</div>
+<div class="line"><a name="l18074"></a><span class="lineno">18074</span>&#160;    VMA_DEBUG_LOG(<span class="stringliteral">&quot;vmaCreateAllocator&quot;</span>);</div>
+<div class="line"><a name="l18075"></a><span class="lineno">18075</span>&#160;    *pAllocator = vma_new(pCreateInfo-&gt;<a class="code" href="struct_vma_allocator_create_info.html#a6e409087e3be55400d0e4ccbe43c608d">pAllocationCallbacks</a>, VmaAllocator_T)(pCreateInfo);</div>
+<div class="line"><a name="l18076"></a><span class="lineno">18076</span>&#160;    <span class="keywordflow">return</span> (*pAllocator)-&gt;Init(pCreateInfo);</div>
+<div class="line"><a name="l18077"></a><span class="lineno">18077</span>&#160;}</div>
+<div class="line"><a name="l18078"></a><span class="lineno">18078</span>&#160; </div>
+<div class="line"><a name="l18079"></a><span class="lineno">18079</span>&#160;VMA_CALL_PRE <span class="keywordtype">void</span> VMA_CALL_POST <a class="code" href="vk__mem__alloc_8h.html#aa8d164061c88f22fb1fd3c8f3534bc1d">vmaDestroyAllocator</a>(</div>
+<div class="line"><a name="l18080"></a><span class="lineno">18080</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator)</div>
+<div class="line"><a name="l18081"></a><span class="lineno">18081</span>&#160;{</div>
+<div class="line"><a name="l18082"></a><span class="lineno">18082</span>&#160;    <span class="keywordflow">if</span>(allocator != VK_NULL_HANDLE)</div>
+<div class="line"><a name="l18083"></a><span class="lineno">18083</span>&#160;    {</div>
+<div class="line"><a name="l18084"></a><span class="lineno">18084</span>&#160;        VMA_DEBUG_LOG(<span class="stringliteral">&quot;vmaDestroyAllocator&quot;</span>);</div>
+<div class="line"><a name="l18085"></a><span class="lineno">18085</span>&#160;        VkAllocationCallbacks allocationCallbacks = allocator-&gt;m_AllocationCallbacks;</div>
+<div class="line"><a name="l18086"></a><span class="lineno">18086</span>&#160;        vma_delete(&amp;allocationCallbacks, allocator);</div>
+<div class="line"><a name="l18087"></a><span class="lineno">18087</span>&#160;    }</div>
+<div class="line"><a name="l18088"></a><span class="lineno">18088</span>&#160;}</div>
 <div class="line"><a name="l18089"></a><span class="lineno">18089</span>&#160; </div>
-<div class="line"><a name="l18090"></a><span class="lineno">18090</span>&#160;    VMA_ASSERT(allocator &amp;&amp; pVkMemoryRequirements &amp;&amp; pCreateInfo &amp;&amp; pAllocations);</div>
-<div class="line"><a name="l18091"></a><span class="lineno">18091</span>&#160; </div>
-<div class="line"><a name="l18092"></a><span class="lineno">18092</span>&#160;    VMA_DEBUG_LOG(<span class="stringliteral">&quot;vmaAllocateMemoryPages&quot;</span>);</div>
-<div class="line"><a name="l18093"></a><span class="lineno">18093</span>&#160; </div>
-<div class="line"><a name="l18094"></a><span class="lineno">18094</span>&#160;    VMA_DEBUG_GLOBAL_MUTEX_LOCK</div>
-<div class="line"><a name="l18095"></a><span class="lineno">18095</span>&#160; </div>
-<div class="line"><a name="l18096"></a><span class="lineno">18096</span>&#160;    VkResult result = allocator-&gt;AllocateMemory(</div>
-<div class="line"><a name="l18097"></a><span class="lineno">18097</span>&#160;        *pVkMemoryRequirements,</div>
-<div class="line"><a name="l18098"></a><span class="lineno">18098</span>&#160;        <span class="keyword">false</span>, <span class="comment">// requiresDedicatedAllocation</span></div>
-<div class="line"><a name="l18099"></a><span class="lineno">18099</span>&#160;        <span class="keyword">false</span>, <span class="comment">// prefersDedicatedAllocation</span></div>
-<div class="line"><a name="l18100"></a><span class="lineno">18100</span>&#160;        VK_NULL_HANDLE, <span class="comment">// dedicatedBuffer</span></div>
-<div class="line"><a name="l18101"></a><span class="lineno">18101</span>&#160;        UINT32_MAX, <span class="comment">// dedicatedBufferUsage</span></div>
-<div class="line"><a name="l18102"></a><span class="lineno">18102</span>&#160;        VK_NULL_HANDLE, <span class="comment">// dedicatedImage</span></div>
-<div class="line"><a name="l18103"></a><span class="lineno">18103</span>&#160;        *pCreateInfo,</div>
-<div class="line"><a name="l18104"></a><span class="lineno">18104</span>&#160;        VMA_SUBALLOCATION_TYPE_UNKNOWN,</div>
-<div class="line"><a name="l18105"></a><span class="lineno">18105</span>&#160;        allocationCount,</div>
-<div class="line"><a name="l18106"></a><span class="lineno">18106</span>&#160;        pAllocations);</div>
-<div class="line"><a name="l18107"></a><span class="lineno">18107</span>&#160; </div>
-<div class="line"><a name="l18108"></a><span class="lineno">18108</span>&#160;<span class="preprocessor">#if VMA_RECORDING_ENABLED</span></div>
-<div class="line"><a name="l18109"></a><span class="lineno">18109</span>&#160;    <span class="keywordflow">if</span>(allocator-&gt;GetRecorder() != VMA_NULL)</div>
-<div class="line"><a name="l18110"></a><span class="lineno">18110</span>&#160;    {</div>
-<div class="line"><a name="l18111"></a><span class="lineno">18111</span>&#160;        allocator-&gt;GetRecorder()-&gt;RecordAllocateMemoryPages(</div>
-<div class="line"><a name="l18112"></a><span class="lineno">18112</span>&#160;            allocator-&gt;GetCurrentFrameIndex(),</div>
-<div class="line"><a name="l18113"></a><span class="lineno">18113</span>&#160;            *pVkMemoryRequirements,</div>
-<div class="line"><a name="l18114"></a><span class="lineno">18114</span>&#160;            *pCreateInfo,</div>
-<div class="line"><a name="l18115"></a><span class="lineno">18115</span>&#160;            (uint64_t)allocationCount,</div>
-<div class="line"><a name="l18116"></a><span class="lineno">18116</span>&#160;            pAllocations);</div>
-<div class="line"><a name="l18117"></a><span class="lineno">18117</span>&#160;    }</div>
-<div class="line"><a name="l18118"></a><span class="lineno">18118</span>&#160;<span class="preprocessor">#endif</span></div>
-<div class="line"><a name="l18119"></a><span class="lineno">18119</span>&#160;        </div>
-<div class="line"><a name="l18120"></a><span class="lineno">18120</span>&#160;    <span class="keywordflow">if</span>(pAllocationInfo != VMA_NULL &amp;&amp; result == VK_SUCCESS)</div>
-<div class="line"><a name="l18121"></a><span class="lineno">18121</span>&#160;    {</div>
-<div class="line"><a name="l18122"></a><span class="lineno">18122</span>&#160;        <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> i = 0; i &lt; allocationCount; ++i)</div>
-<div class="line"><a name="l18123"></a><span class="lineno">18123</span>&#160;        {</div>
-<div class="line"><a name="l18124"></a><span class="lineno">18124</span>&#160;            allocator-&gt;GetAllocationInfo(pAllocations[i], pAllocationInfo + i);</div>
-<div class="line"><a name="l18125"></a><span class="lineno">18125</span>&#160;        }</div>
-<div class="line"><a name="l18126"></a><span class="lineno">18126</span>&#160;    }</div>
-<div class="line"><a name="l18127"></a><span class="lineno">18127</span>&#160; </div>
-<div class="line"><a name="l18128"></a><span class="lineno">18128</span>&#160;    <span class="keywordflow">return</span> result;</div>
-<div class="line"><a name="l18129"></a><span class="lineno">18129</span>&#160;}</div>
+<div class="line"><a name="l18090"></a><span class="lineno">18090</span>&#160;VMA_CALL_PRE <span class="keywordtype">void</span> VMA_CALL_POST <a class="code" href="vk__mem__alloc_8h.html#afa02231a791b37255720d566a52683e7">vmaGetAllocatorInfo</a>(<a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator, <a class="code" href="struct_vma_allocator_info.html">VmaAllocatorInfo</a>* pAllocatorInfo)</div>
+<div class="line"><a name="l18091"></a><span class="lineno">18091</span>&#160;{</div>
+<div class="line"><a name="l18092"></a><span class="lineno">18092</span>&#160;    VMA_ASSERT(allocator &amp;&amp; pAllocatorInfo);</div>
+<div class="line"><a name="l18093"></a><span class="lineno">18093</span>&#160;    pAllocatorInfo-&gt;<a class="code" href="struct_vma_allocator_info.html#a2ed6a4d2d3fea039d66a13f15d0ce5fe">instance</a> = allocator-&gt;m_hInstance;</div>
+<div class="line"><a name="l18094"></a><span class="lineno">18094</span>&#160;    pAllocatorInfo-&gt;<a class="code" href="struct_vma_allocator_info.html#aba2b703f96e51d567717e1fb2935b47a">physicalDevice</a> = allocator-&gt;GetPhysicalDevice();</div>
+<div class="line"><a name="l18095"></a><span class="lineno">18095</span>&#160;    pAllocatorInfo-&gt;<a class="code" href="struct_vma_allocator_info.html#a012b4c485bf3b0ea8921352c5ee0c357">device</a> = allocator-&gt;m_hDevice;</div>
+<div class="line"><a name="l18096"></a><span class="lineno">18096</span>&#160;}</div>
+<div class="line"><a name="l18097"></a><span class="lineno">18097</span>&#160; </div>
+<div class="line"><a name="l18098"></a><span class="lineno">18098</span>&#160;VMA_CALL_PRE <span class="keywordtype">void</span> VMA_CALL_POST <a class="code" href="vk__mem__alloc_8h.html#aecabf7b6e91ea87d0316fa0a9e014fe0">vmaGetPhysicalDeviceProperties</a>(</div>
+<div class="line"><a name="l18099"></a><span class="lineno">18099</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div>
+<div class="line"><a name="l18100"></a><span class="lineno">18100</span>&#160;    <span class="keyword">const</span> VkPhysicalDeviceProperties **ppPhysicalDeviceProperties)</div>
+<div class="line"><a name="l18101"></a><span class="lineno">18101</span>&#160;{</div>
+<div class="line"><a name="l18102"></a><span class="lineno">18102</span>&#160;    VMA_ASSERT(allocator &amp;&amp; ppPhysicalDeviceProperties);</div>
+<div class="line"><a name="l18103"></a><span class="lineno">18103</span>&#160;    *ppPhysicalDeviceProperties = &amp;allocator-&gt;m_PhysicalDeviceProperties;</div>
+<div class="line"><a name="l18104"></a><span class="lineno">18104</span>&#160;}</div>
+<div class="line"><a name="l18105"></a><span class="lineno">18105</span>&#160; </div>
+<div class="line"><a name="l18106"></a><span class="lineno">18106</span>&#160;VMA_CALL_PRE <span class="keywordtype">void</span> VMA_CALL_POST <a class="code" href="vk__mem__alloc_8h.html#ab88db292a17974f911182543fda52d19">vmaGetMemoryProperties</a>(</div>
+<div class="line"><a name="l18107"></a><span class="lineno">18107</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div>
+<div class="line"><a name="l18108"></a><span class="lineno">18108</span>&#160;    <span class="keyword">const</span> VkPhysicalDeviceMemoryProperties** ppPhysicalDeviceMemoryProperties)</div>
+<div class="line"><a name="l18109"></a><span class="lineno">18109</span>&#160;{</div>
+<div class="line"><a name="l18110"></a><span class="lineno">18110</span>&#160;    VMA_ASSERT(allocator &amp;&amp; ppPhysicalDeviceMemoryProperties);</div>
+<div class="line"><a name="l18111"></a><span class="lineno">18111</span>&#160;    *ppPhysicalDeviceMemoryProperties = &amp;allocator-&gt;m_MemProps;</div>
+<div class="line"><a name="l18112"></a><span class="lineno">18112</span>&#160;}</div>
+<div class="line"><a name="l18113"></a><span class="lineno">18113</span>&#160; </div>
+<div class="line"><a name="l18114"></a><span class="lineno">18114</span>&#160;VMA_CALL_PRE <span class="keywordtype">void</span> VMA_CALL_POST <a class="code" href="vk__mem__alloc_8h.html#a8701444752eb5de4464adb5a2b514bca">vmaGetMemoryTypeProperties</a>(</div>
+<div class="line"><a name="l18115"></a><span class="lineno">18115</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div>
+<div class="line"><a name="l18116"></a><span class="lineno">18116</span>&#160;    uint32_t memoryTypeIndex,</div>
+<div class="line"><a name="l18117"></a><span class="lineno">18117</span>&#160;    VkMemoryPropertyFlags* pFlags)</div>
+<div class="line"><a name="l18118"></a><span class="lineno">18118</span>&#160;{</div>
+<div class="line"><a name="l18119"></a><span class="lineno">18119</span>&#160;    VMA_ASSERT(allocator &amp;&amp; pFlags);</div>
+<div class="line"><a name="l18120"></a><span class="lineno">18120</span>&#160;    VMA_ASSERT(memoryTypeIndex &lt; allocator-&gt;GetMemoryTypeCount());</div>
+<div class="line"><a name="l18121"></a><span class="lineno">18121</span>&#160;    *pFlags = allocator-&gt;m_MemProps.memoryTypes[memoryTypeIndex].propertyFlags;</div>
+<div class="line"><a name="l18122"></a><span class="lineno">18122</span>&#160;}</div>
+<div class="line"><a name="l18123"></a><span class="lineno">18123</span>&#160; </div>
+<div class="line"><a name="l18124"></a><span class="lineno">18124</span>&#160;VMA_CALL_PRE <span class="keywordtype">void</span> VMA_CALL_POST <a class="code" href="vk__mem__alloc_8h.html#ade56bf8dc9f5a5eaddf5f119ed525236">vmaSetCurrentFrameIndex</a>(</div>
+<div class="line"><a name="l18125"></a><span class="lineno">18125</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div>
+<div class="line"><a name="l18126"></a><span class="lineno">18126</span>&#160;    uint32_t frameIndex)</div>
+<div class="line"><a name="l18127"></a><span class="lineno">18127</span>&#160;{</div>
+<div class="line"><a name="l18128"></a><span class="lineno">18128</span>&#160;    VMA_ASSERT(allocator);</div>
+<div class="line"><a name="l18129"></a><span class="lineno">18129</span>&#160;    VMA_ASSERT(frameIndex != VMA_FRAME_INDEX_LOST);</div>
 <div class="line"><a name="l18130"></a><span class="lineno">18130</span>&#160; </div>
-<div class="line"><a name="l18131"></a><span class="lineno">18131</span>&#160;VMA_CALL_PRE VkResult VMA_CALL_POST <a class="code" href="vk__mem__alloc_8h.html#a7fdf64415b6c3d83c454f28d2c53df7b">vmaAllocateMemoryForBuffer</a>(</div>
-<div class="line"><a name="l18132"></a><span class="lineno">18132</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div>
-<div class="line"><a name="l18133"></a><span class="lineno">18133</span>&#160;    VkBuffer buffer,</div>
-<div class="line"><a name="l18134"></a><span class="lineno">18134</span>&#160;    <span class="keyword">const</span> <a class="code" href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a>* pCreateInfo,</div>
-<div class="line"><a name="l18135"></a><span class="lineno">18135</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a>* pAllocation,</div>
-<div class="line"><a name="l18136"></a><span class="lineno">18136</span>&#160;    <a class="code" href="struct_vma_allocation_info.html">VmaAllocationInfo</a>* pAllocationInfo)</div>
-<div class="line"><a name="l18137"></a><span class="lineno">18137</span>&#160;{</div>
-<div class="line"><a name="l18138"></a><span class="lineno">18138</span>&#160;    VMA_ASSERT(allocator &amp;&amp; buffer != VK_NULL_HANDLE &amp;&amp; pCreateInfo &amp;&amp; pAllocation);</div>
-<div class="line"><a name="l18139"></a><span class="lineno">18139</span>&#160; </div>
-<div class="line"><a name="l18140"></a><span class="lineno">18140</span>&#160;    VMA_DEBUG_LOG(<span class="stringliteral">&quot;vmaAllocateMemoryForBuffer&quot;</span>);</div>
-<div class="line"><a name="l18141"></a><span class="lineno">18141</span>&#160; </div>
-<div class="line"><a name="l18142"></a><span class="lineno">18142</span>&#160;    VMA_DEBUG_GLOBAL_MUTEX_LOCK</div>
-<div class="line"><a name="l18143"></a><span class="lineno">18143</span>&#160; </div>
-<div class="line"><a name="l18144"></a><span class="lineno">18144</span>&#160;    VkMemoryRequirements vkMemReq = {};</div>
-<div class="line"><a name="l18145"></a><span class="lineno">18145</span>&#160;    <span class="keywordtype">bool</span> requiresDedicatedAllocation = <span class="keyword">false</span>;</div>
-<div class="line"><a name="l18146"></a><span class="lineno">18146</span>&#160;    <span class="keywordtype">bool</span> prefersDedicatedAllocation = <span class="keyword">false</span>;</div>
-<div class="line"><a name="l18147"></a><span class="lineno">18147</span>&#160;    allocator-&gt;GetBufferMemoryRequirements(buffer, vkMemReq,</div>
-<div class="line"><a name="l18148"></a><span class="lineno">18148</span>&#160;        requiresDedicatedAllocation,</div>
-<div class="line"><a name="l18149"></a><span class="lineno">18149</span>&#160;        prefersDedicatedAllocation);</div>
-<div class="line"><a name="l18150"></a><span class="lineno">18150</span>&#160; </div>
-<div class="line"><a name="l18151"></a><span class="lineno">18151</span>&#160;    VkResult result = allocator-&gt;AllocateMemory(</div>
-<div class="line"><a name="l18152"></a><span class="lineno">18152</span>&#160;        vkMemReq,</div>
-<div class="line"><a name="l18153"></a><span class="lineno">18153</span>&#160;        requiresDedicatedAllocation,</div>
-<div class="line"><a name="l18154"></a><span class="lineno">18154</span>&#160;        prefersDedicatedAllocation,</div>
-<div class="line"><a name="l18155"></a><span class="lineno">18155</span>&#160;        buffer, <span class="comment">// dedicatedBuffer</span></div>
-<div class="line"><a name="l18156"></a><span class="lineno">18156</span>&#160;        UINT32_MAX, <span class="comment">// dedicatedBufferUsage</span></div>
-<div class="line"><a name="l18157"></a><span class="lineno">18157</span>&#160;        VK_NULL_HANDLE, <span class="comment">// dedicatedImage</span></div>
-<div class="line"><a name="l18158"></a><span class="lineno">18158</span>&#160;        *pCreateInfo,</div>
-<div class="line"><a name="l18159"></a><span class="lineno">18159</span>&#160;        VMA_SUBALLOCATION_TYPE_BUFFER,</div>
-<div class="line"><a name="l18160"></a><span class="lineno">18160</span>&#160;        1, <span class="comment">// allocationCount</span></div>
-<div class="line"><a name="l18161"></a><span class="lineno">18161</span>&#160;        pAllocation);</div>
-<div class="line"><a name="l18162"></a><span class="lineno">18162</span>&#160; </div>
-<div class="line"><a name="l18163"></a><span class="lineno">18163</span>&#160;<span class="preprocessor">#if VMA_RECORDING_ENABLED</span></div>
-<div class="line"><a name="l18164"></a><span class="lineno">18164</span>&#160;    <span class="keywordflow">if</span>(allocator-&gt;GetRecorder() != VMA_NULL)</div>
+<div class="line"><a name="l18131"></a><span class="lineno">18131</span>&#160;    VMA_DEBUG_GLOBAL_MUTEX_LOCK</div>
+<div class="line"><a name="l18132"></a><span class="lineno">18132</span>&#160; </div>
+<div class="line"><a name="l18133"></a><span class="lineno">18133</span>&#160;    allocator-&gt;SetCurrentFrameIndex(frameIndex);</div>
+<div class="line"><a name="l18134"></a><span class="lineno">18134</span>&#160;}</div>
+<div class="line"><a name="l18135"></a><span class="lineno">18135</span>&#160; </div>
+<div class="line"><a name="l18136"></a><span class="lineno">18136</span>&#160;VMA_CALL_PRE <span class="keywordtype">void</span> VMA_CALL_POST <a class="code" href="vk__mem__alloc_8h.html#a333b61c1788cb23559177531e6a93ca3">vmaCalculateStats</a>(</div>
+<div class="line"><a name="l18137"></a><span class="lineno">18137</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div>
+<div class="line"><a name="l18138"></a><span class="lineno">18138</span>&#160;    <a class="code" href="struct_vma_stats.html">VmaStats</a>* pStats)</div>
+<div class="line"><a name="l18139"></a><span class="lineno">18139</span>&#160;{</div>
+<div class="line"><a name="l18140"></a><span class="lineno">18140</span>&#160;    VMA_ASSERT(allocator &amp;&amp; pStats);</div>
+<div class="line"><a name="l18141"></a><span class="lineno">18141</span>&#160;    VMA_DEBUG_GLOBAL_MUTEX_LOCK</div>
+<div class="line"><a name="l18142"></a><span class="lineno">18142</span>&#160;    allocator-&gt;CalculateStats(pStats);</div>
+<div class="line"><a name="l18143"></a><span class="lineno">18143</span>&#160;}</div>
+<div class="line"><a name="l18144"></a><span class="lineno">18144</span>&#160; </div>
+<div class="line"><a name="l18145"></a><span class="lineno">18145</span>&#160;VMA_CALL_PRE <span class="keywordtype">void</span> VMA_CALL_POST <a class="code" href="vk__mem__alloc_8h.html#aec0ed24ebea2d0099eed5f801daaefba">vmaGetBudget</a>(</div>
+<div class="line"><a name="l18146"></a><span class="lineno">18146</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div>
+<div class="line"><a name="l18147"></a><span class="lineno">18147</span>&#160;    <a class="code" href="struct_vma_budget.html">VmaBudget</a>* pBudget)</div>
+<div class="line"><a name="l18148"></a><span class="lineno">18148</span>&#160;{</div>
+<div class="line"><a name="l18149"></a><span class="lineno">18149</span>&#160;    VMA_ASSERT(allocator &amp;&amp; pBudget);</div>
+<div class="line"><a name="l18150"></a><span class="lineno">18150</span>&#160;    VMA_DEBUG_GLOBAL_MUTEX_LOCK</div>
+<div class="line"><a name="l18151"></a><span class="lineno">18151</span>&#160;    allocator-&gt;GetBudget(pBudget, 0, allocator-&gt;GetMemoryHeapCount());</div>
+<div class="line"><a name="l18152"></a><span class="lineno">18152</span>&#160;}</div>
+<div class="line"><a name="l18153"></a><span class="lineno">18153</span>&#160; </div>
+<div class="line"><a name="l18154"></a><span class="lineno">18154</span>&#160;<span class="preprocessor">#if VMA_STATS_STRING_ENABLED</span></div>
+<div class="line"><a name="l18155"></a><span class="lineno">18155</span>&#160; </div>
+<div class="line"><a name="l18156"></a><span class="lineno">18156</span>&#160;VMA_CALL_PRE <span class="keywordtype">void</span> VMA_CALL_POST <a class="code" href="vk__mem__alloc_8h.html#aa4fee7eb5253377599ef4fd38c93c2a0">vmaBuildStatsString</a>(</div>
+<div class="line"><a name="l18157"></a><span class="lineno">18157</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div>
+<div class="line"><a name="l18158"></a><span class="lineno">18158</span>&#160;    <span class="keywordtype">char</span>** ppStatsString,</div>
+<div class="line"><a name="l18159"></a><span class="lineno">18159</span>&#160;    VkBool32 detailedMap)</div>
+<div class="line"><a name="l18160"></a><span class="lineno">18160</span>&#160;{</div>
+<div class="line"><a name="l18161"></a><span class="lineno">18161</span>&#160;    VMA_ASSERT(allocator &amp;&amp; ppStatsString);</div>
+<div class="line"><a name="l18162"></a><span class="lineno">18162</span>&#160;    VMA_DEBUG_GLOBAL_MUTEX_LOCK</div>
+<div class="line"><a name="l18163"></a><span class="lineno">18163</span>&#160; </div>
+<div class="line"><a name="l18164"></a><span class="lineno">18164</span>&#160;    VmaStringBuilder sb(allocator);</div>
 <div class="line"><a name="l18165"></a><span class="lineno">18165</span>&#160;    {</div>
-<div class="line"><a name="l18166"></a><span class="lineno">18166</span>&#160;        allocator-&gt;GetRecorder()-&gt;RecordAllocateMemoryForBuffer(</div>
-<div class="line"><a name="l18167"></a><span class="lineno">18167</span>&#160;            allocator-&gt;GetCurrentFrameIndex(),</div>
-<div class="line"><a name="l18168"></a><span class="lineno">18168</span>&#160;            vkMemReq,</div>
-<div class="line"><a name="l18169"></a><span class="lineno">18169</span>&#160;            requiresDedicatedAllocation,</div>
-<div class="line"><a name="l18170"></a><span class="lineno">18170</span>&#160;            prefersDedicatedAllocation,</div>
-<div class="line"><a name="l18171"></a><span class="lineno">18171</span>&#160;            *pCreateInfo,</div>
-<div class="line"><a name="l18172"></a><span class="lineno">18172</span>&#160;            *pAllocation);</div>
-<div class="line"><a name="l18173"></a><span class="lineno">18173</span>&#160;    }</div>
-<div class="line"><a name="l18174"></a><span class="lineno">18174</span>&#160;<span class="preprocessor">#endif</span></div>
-<div class="line"><a name="l18175"></a><span class="lineno">18175</span>&#160; </div>
-<div class="line"><a name="l18176"></a><span class="lineno">18176</span>&#160;    <span class="keywordflow">if</span>(pAllocationInfo &amp;&amp; result == VK_SUCCESS)</div>
-<div class="line"><a name="l18177"></a><span class="lineno">18177</span>&#160;    {</div>
-<div class="line"><a name="l18178"></a><span class="lineno">18178</span>&#160;        allocator-&gt;GetAllocationInfo(*pAllocation, pAllocationInfo);</div>
-<div class="line"><a name="l18179"></a><span class="lineno">18179</span>&#160;    }</div>
-<div class="line"><a name="l18180"></a><span class="lineno">18180</span>&#160; </div>
-<div class="line"><a name="l18181"></a><span class="lineno">18181</span>&#160;    <span class="keywordflow">return</span> result;</div>
-<div class="line"><a name="l18182"></a><span class="lineno">18182</span>&#160;}</div>
-<div class="line"><a name="l18183"></a><span class="lineno">18183</span>&#160; </div>
-<div class="line"><a name="l18184"></a><span class="lineno">18184</span>&#160;VMA_CALL_PRE VkResult VMA_CALL_POST <a class="code" href="vk__mem__alloc_8h.html#a0faa3f9e5fb233d29d1e00390650febb">vmaAllocateMemoryForImage</a>(</div>
-<div class="line"><a name="l18185"></a><span class="lineno">18185</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div>
-<div class="line"><a name="l18186"></a><span class="lineno">18186</span>&#160;    VkImage image,</div>
-<div class="line"><a name="l18187"></a><span class="lineno">18187</span>&#160;    <span class="keyword">const</span> <a class="code" href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a>* pCreateInfo,</div>
-<div class="line"><a name="l18188"></a><span class="lineno">18188</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a>* pAllocation,</div>
-<div class="line"><a name="l18189"></a><span class="lineno">18189</span>&#160;    <a class="code" href="struct_vma_allocation_info.html">VmaAllocationInfo</a>* pAllocationInfo)</div>
-<div class="line"><a name="l18190"></a><span class="lineno">18190</span>&#160;{</div>
-<div class="line"><a name="l18191"></a><span class="lineno">18191</span>&#160;    VMA_ASSERT(allocator &amp;&amp; image != VK_NULL_HANDLE &amp;&amp; pCreateInfo &amp;&amp; pAllocation);</div>
-<div class="line"><a name="l18192"></a><span class="lineno">18192</span>&#160; </div>
-<div class="line"><a name="l18193"></a><span class="lineno">18193</span>&#160;    VMA_DEBUG_LOG(<span class="stringliteral">&quot;vmaAllocateMemoryForImage&quot;</span>);</div>
-<div class="line"><a name="l18194"></a><span class="lineno">18194</span>&#160; </div>
-<div class="line"><a name="l18195"></a><span class="lineno">18195</span>&#160;    VMA_DEBUG_GLOBAL_MUTEX_LOCK</div>
-<div class="line"><a name="l18196"></a><span class="lineno">18196</span>&#160; </div>
-<div class="line"><a name="l18197"></a><span class="lineno">18197</span>&#160;    VkMemoryRequirements vkMemReq = {};</div>
-<div class="line"><a name="l18198"></a><span class="lineno">18198</span>&#160;    <span class="keywordtype">bool</span> requiresDedicatedAllocation = <span class="keyword">false</span>;</div>
-<div class="line"><a name="l18199"></a><span class="lineno">18199</span>&#160;    <span class="keywordtype">bool</span> prefersDedicatedAllocation  = <span class="keyword">false</span>;</div>
-<div class="line"><a name="l18200"></a><span class="lineno">18200</span>&#160;    allocator-&gt;GetImageMemoryRequirements(image, vkMemReq,</div>
-<div class="line"><a name="l18201"></a><span class="lineno">18201</span>&#160;        requiresDedicatedAllocation, prefersDedicatedAllocation);</div>
-<div class="line"><a name="l18202"></a><span class="lineno">18202</span>&#160; </div>
-<div class="line"><a name="l18203"></a><span class="lineno">18203</span>&#160;    VkResult result = allocator-&gt;AllocateMemory(</div>
-<div class="line"><a name="l18204"></a><span class="lineno">18204</span>&#160;        vkMemReq,</div>
-<div class="line"><a name="l18205"></a><span class="lineno">18205</span>&#160;        requiresDedicatedAllocation,</div>
-<div class="line"><a name="l18206"></a><span class="lineno">18206</span>&#160;        prefersDedicatedAllocation,</div>
-<div class="line"><a name="l18207"></a><span class="lineno">18207</span>&#160;        VK_NULL_HANDLE, <span class="comment">// dedicatedBuffer</span></div>
-<div class="line"><a name="l18208"></a><span class="lineno">18208</span>&#160;        UINT32_MAX, <span class="comment">// dedicatedBufferUsage</span></div>
-<div class="line"><a name="l18209"></a><span class="lineno">18209</span>&#160;        image, <span class="comment">// dedicatedImage</span></div>
-<div class="line"><a name="l18210"></a><span class="lineno">18210</span>&#160;        *pCreateInfo,</div>
-<div class="line"><a name="l18211"></a><span class="lineno">18211</span>&#160;        VMA_SUBALLOCATION_TYPE_IMAGE_UNKNOWN,</div>
-<div class="line"><a name="l18212"></a><span class="lineno">18212</span>&#160;        1, <span class="comment">// allocationCount</span></div>
-<div class="line"><a name="l18213"></a><span class="lineno">18213</span>&#160;        pAllocation);</div>
-<div class="line"><a name="l18214"></a><span class="lineno">18214</span>&#160; </div>
-<div class="line"><a name="l18215"></a><span class="lineno">18215</span>&#160;<span class="preprocessor">#if VMA_RECORDING_ENABLED</span></div>
-<div class="line"><a name="l18216"></a><span class="lineno">18216</span>&#160;    <span class="keywordflow">if</span>(allocator-&gt;GetRecorder() != VMA_NULL)</div>
-<div class="line"><a name="l18217"></a><span class="lineno">18217</span>&#160;    {</div>
-<div class="line"><a name="l18218"></a><span class="lineno">18218</span>&#160;        allocator-&gt;GetRecorder()-&gt;RecordAllocateMemoryForImage(</div>
-<div class="line"><a name="l18219"></a><span class="lineno">18219</span>&#160;            allocator-&gt;GetCurrentFrameIndex(),</div>
-<div class="line"><a name="l18220"></a><span class="lineno">18220</span>&#160;            vkMemReq,</div>
-<div class="line"><a name="l18221"></a><span class="lineno">18221</span>&#160;            requiresDedicatedAllocation,</div>
-<div class="line"><a name="l18222"></a><span class="lineno">18222</span>&#160;            prefersDedicatedAllocation,</div>
-<div class="line"><a name="l18223"></a><span class="lineno">18223</span>&#160;            *pCreateInfo,</div>
-<div class="line"><a name="l18224"></a><span class="lineno">18224</span>&#160;            *pAllocation);</div>
-<div class="line"><a name="l18225"></a><span class="lineno">18225</span>&#160;    }</div>
-<div class="line"><a name="l18226"></a><span class="lineno">18226</span>&#160;<span class="preprocessor">#endif</span></div>
-<div class="line"><a name="l18227"></a><span class="lineno">18227</span>&#160; </div>
-<div class="line"><a name="l18228"></a><span class="lineno">18228</span>&#160;    <span class="keywordflow">if</span>(pAllocationInfo &amp;&amp; result == VK_SUCCESS)</div>
-<div class="line"><a name="l18229"></a><span class="lineno">18229</span>&#160;    {</div>
-<div class="line"><a name="l18230"></a><span class="lineno">18230</span>&#160;        allocator-&gt;GetAllocationInfo(*pAllocation, pAllocationInfo);</div>
-<div class="line"><a name="l18231"></a><span class="lineno">18231</span>&#160;    }</div>
-<div class="line"><a name="l18232"></a><span class="lineno">18232</span>&#160; </div>
-<div class="line"><a name="l18233"></a><span class="lineno">18233</span>&#160;    <span class="keywordflow">return</span> result;</div>
-<div class="line"><a name="l18234"></a><span class="lineno">18234</span>&#160;}</div>
-<div class="line"><a name="l18235"></a><span class="lineno">18235</span>&#160; </div>
-<div class="line"><a name="l18236"></a><span class="lineno">18236</span>&#160;VMA_CALL_PRE <span class="keywordtype">void</span> VMA_CALL_POST <a class="code" href="vk__mem__alloc_8h.html#a5fea5518972ae9094b1526cbcb19b05f">vmaFreeMemory</a>(</div>
-<div class="line"><a name="l18237"></a><span class="lineno">18237</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div>
-<div class="line"><a name="l18238"></a><span class="lineno">18238</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation)</div>
-<div class="line"><a name="l18239"></a><span class="lineno">18239</span>&#160;{</div>
-<div class="line"><a name="l18240"></a><span class="lineno">18240</span>&#160;    VMA_ASSERT(allocator);</div>
-<div class="line"><a name="l18241"></a><span class="lineno">18241</span>&#160;    </div>
-<div class="line"><a name="l18242"></a><span class="lineno">18242</span>&#160;    <span class="keywordflow">if</span>(allocation == VK_NULL_HANDLE)</div>
-<div class="line"><a name="l18243"></a><span class="lineno">18243</span>&#160;    {</div>
-<div class="line"><a name="l18244"></a><span class="lineno">18244</span>&#160;        <span class="keywordflow">return</span>;</div>
-<div class="line"><a name="l18245"></a><span class="lineno">18245</span>&#160;    }</div>
-<div class="line"><a name="l18246"></a><span class="lineno">18246</span>&#160;    </div>
-<div class="line"><a name="l18247"></a><span class="lineno">18247</span>&#160;    VMA_DEBUG_LOG(<span class="stringliteral">&quot;vmaFreeMemory&quot;</span>);</div>
-<div class="line"><a name="l18248"></a><span class="lineno">18248</span>&#160;    </div>
-<div class="line"><a name="l18249"></a><span class="lineno">18249</span>&#160;    VMA_DEBUG_GLOBAL_MUTEX_LOCK</div>
-<div class="line"><a name="l18250"></a><span class="lineno">18250</span>&#160; </div>
-<div class="line"><a name="l18251"></a><span class="lineno">18251</span>&#160;<span class="preprocessor">#if VMA_RECORDING_ENABLED</span></div>
-<div class="line"><a name="l18252"></a><span class="lineno">18252</span>&#160;    <span class="keywordflow">if</span>(allocator-&gt;GetRecorder() != VMA_NULL)</div>
-<div class="line"><a name="l18253"></a><span class="lineno">18253</span>&#160;    {</div>
-<div class="line"><a name="l18254"></a><span class="lineno">18254</span>&#160;        allocator-&gt;GetRecorder()-&gt;RecordFreeMemory(</div>
-<div class="line"><a name="l18255"></a><span class="lineno">18255</span>&#160;            allocator-&gt;GetCurrentFrameIndex(),</div>
-<div class="line"><a name="l18256"></a><span class="lineno">18256</span>&#160;            allocation);</div>
-<div class="line"><a name="l18257"></a><span class="lineno">18257</span>&#160;    }</div>
-<div class="line"><a name="l18258"></a><span class="lineno">18258</span>&#160;<span class="preprocessor">#endif</span></div>
-<div class="line"><a name="l18259"></a><span class="lineno">18259</span>&#160;    </div>
-<div class="line"><a name="l18260"></a><span class="lineno">18260</span>&#160;    allocator-&gt;FreeMemory(</div>
-<div class="line"><a name="l18261"></a><span class="lineno">18261</span>&#160;        1, <span class="comment">// allocationCount</span></div>
-<div class="line"><a name="l18262"></a><span class="lineno">18262</span>&#160;        &amp;allocation);</div>
-<div class="line"><a name="l18263"></a><span class="lineno">18263</span>&#160;}</div>
-<div class="line"><a name="l18264"></a><span class="lineno">18264</span>&#160; </div>
-<div class="line"><a name="l18265"></a><span class="lineno">18265</span>&#160;VMA_CALL_PRE <span class="keywordtype">void</span> VMA_CALL_POST <a class="code" href="vk__mem__alloc_8h.html#a834b1e4aef395c0a1d56a28e69a4a17e">vmaFreeMemoryPages</a>(</div>
-<div class="line"><a name="l18266"></a><span class="lineno">18266</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div>
-<div class="line"><a name="l18267"></a><span class="lineno">18267</span>&#160;    <span class="keywordtype">size_t</span> allocationCount,</div>
-<div class="line"><a name="l18268"></a><span class="lineno">18268</span>&#160;    <span class="keyword">const</span> <a class="code" href="struct_vma_allocation.html">VmaAllocation</a>* pAllocations)</div>
-<div class="line"><a name="l18269"></a><span class="lineno">18269</span>&#160;{</div>
-<div class="line"><a name="l18270"></a><span class="lineno">18270</span>&#160;    <span class="keywordflow">if</span>(allocationCount == 0)</div>
-<div class="line"><a name="l18271"></a><span class="lineno">18271</span>&#160;    {</div>
-<div class="line"><a name="l18272"></a><span class="lineno">18272</span>&#160;        <span class="keywordflow">return</span>;</div>
-<div class="line"><a name="l18273"></a><span class="lineno">18273</span>&#160;    }</div>
-<div class="line"><a name="l18274"></a><span class="lineno">18274</span>&#160; </div>
-<div class="line"><a name="l18275"></a><span class="lineno">18275</span>&#160;    VMA_ASSERT(allocator);</div>
-<div class="line"><a name="l18276"></a><span class="lineno">18276</span>&#160;    </div>
-<div class="line"><a name="l18277"></a><span class="lineno">18277</span>&#160;    VMA_DEBUG_LOG(<span class="stringliteral">&quot;vmaFreeMemoryPages&quot;</span>);</div>
-<div class="line"><a name="l18278"></a><span class="lineno">18278</span>&#160;    </div>
-<div class="line"><a name="l18279"></a><span class="lineno">18279</span>&#160;    VMA_DEBUG_GLOBAL_MUTEX_LOCK</div>
-<div class="line"><a name="l18280"></a><span class="lineno">18280</span>&#160; </div>
-<div class="line"><a name="l18281"></a><span class="lineno">18281</span>&#160;<span class="preprocessor">#if VMA_RECORDING_ENABLED</span></div>
-<div class="line"><a name="l18282"></a><span class="lineno">18282</span>&#160;    <span class="keywordflow">if</span>(allocator-&gt;GetRecorder() != VMA_NULL)</div>
-<div class="line"><a name="l18283"></a><span class="lineno">18283</span>&#160;    {</div>
-<div class="line"><a name="l18284"></a><span class="lineno">18284</span>&#160;        allocator-&gt;GetRecorder()-&gt;RecordFreeMemoryPages(</div>
-<div class="line"><a name="l18285"></a><span class="lineno">18285</span>&#160;            allocator-&gt;GetCurrentFrameIndex(),</div>
-<div class="line"><a name="l18286"></a><span class="lineno">18286</span>&#160;            (uint64_t)allocationCount,</div>
-<div class="line"><a name="l18287"></a><span class="lineno">18287</span>&#160;            pAllocations);</div>
-<div class="line"><a name="l18288"></a><span class="lineno">18288</span>&#160;    }</div>
-<div class="line"><a name="l18289"></a><span class="lineno">18289</span>&#160;<span class="preprocessor">#endif</span></div>
-<div class="line"><a name="l18290"></a><span class="lineno">18290</span>&#160;    </div>
-<div class="line"><a name="l18291"></a><span class="lineno">18291</span>&#160;    allocator-&gt;FreeMemory(allocationCount, pAllocations);</div>
-<div class="line"><a name="l18292"></a><span class="lineno">18292</span>&#160;}</div>
-<div class="line"><a name="l18293"></a><span class="lineno">18293</span>&#160; </div>
-<div class="line"><a name="l18294"></a><span class="lineno">18294</span>&#160;VMA_CALL_PRE VkResult VMA_CALL_POST <a class="code" href="vk__mem__alloc_8h.html#a0ff488958ca72b28e545880463cb8696">vmaResizeAllocation</a>(</div>
-<div class="line"><a name="l18295"></a><span class="lineno">18295</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div>
-<div class="line"><a name="l18296"></a><span class="lineno">18296</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation,</div>
-<div class="line"><a name="l18297"></a><span class="lineno">18297</span>&#160;    VkDeviceSize newSize)</div>
-<div class="line"><a name="l18298"></a><span class="lineno">18298</span>&#160;{</div>
-<div class="line"><a name="l18299"></a><span class="lineno">18299</span>&#160;    VMA_ASSERT(allocator &amp;&amp; allocation);</div>
-<div class="line"><a name="l18300"></a><span class="lineno">18300</span>&#160;    </div>
-<div class="line"><a name="l18301"></a><span class="lineno">18301</span>&#160;    VMA_DEBUG_LOG(<span class="stringliteral">&quot;vmaResizeAllocation&quot;</span>);</div>
-<div class="line"><a name="l18302"></a><span class="lineno">18302</span>&#160;    </div>
-<div class="line"><a name="l18303"></a><span class="lineno">18303</span>&#160;    VMA_DEBUG_GLOBAL_MUTEX_LOCK</div>
-<div class="line"><a name="l18304"></a><span class="lineno">18304</span>&#160; </div>
-<div class="line"><a name="l18305"></a><span class="lineno">18305</span>&#160;    <span class="keywordflow">return</span> allocator-&gt;ResizeAllocation(allocation, newSize);</div>
-<div class="line"><a name="l18306"></a><span class="lineno">18306</span>&#160;}</div>
-<div class="line"><a name="l18307"></a><span class="lineno">18307</span>&#160; </div>
-<div class="line"><a name="l18308"></a><span class="lineno">18308</span>&#160;VMA_CALL_PRE <span class="keywordtype">void</span> VMA_CALL_POST <a class="code" href="vk__mem__alloc_8h.html#a86dd08aba8633bfa4ad0df2e76481d8b">vmaGetAllocationInfo</a>(</div>
-<div class="line"><a name="l18309"></a><span class="lineno">18309</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div>
-<div class="line"><a name="l18310"></a><span class="lineno">18310</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation,</div>
-<div class="line"><a name="l18311"></a><span class="lineno">18311</span>&#160;    <a class="code" href="struct_vma_allocation_info.html">VmaAllocationInfo</a>* pAllocationInfo)</div>
-<div class="line"><a name="l18312"></a><span class="lineno">18312</span>&#160;{</div>
-<div class="line"><a name="l18313"></a><span class="lineno">18313</span>&#160;    VMA_ASSERT(allocator &amp;&amp; allocation &amp;&amp; pAllocationInfo);</div>
-<div class="line"><a name="l18314"></a><span class="lineno">18314</span>&#160; </div>
-<div class="line"><a name="l18315"></a><span class="lineno">18315</span>&#160;    VMA_DEBUG_GLOBAL_MUTEX_LOCK</div>
-<div class="line"><a name="l18316"></a><span class="lineno">18316</span>&#160; </div>
-<div class="line"><a name="l18317"></a><span class="lineno">18317</span>&#160;<span class="preprocessor">#if VMA_RECORDING_ENABLED</span></div>
-<div class="line"><a name="l18318"></a><span class="lineno">18318</span>&#160;    <span class="keywordflow">if</span>(allocator-&gt;GetRecorder() != VMA_NULL)</div>
-<div class="line"><a name="l18319"></a><span class="lineno">18319</span>&#160;    {</div>
-<div class="line"><a name="l18320"></a><span class="lineno">18320</span>&#160;        allocator-&gt;GetRecorder()-&gt;RecordGetAllocationInfo(</div>
-<div class="line"><a name="l18321"></a><span class="lineno">18321</span>&#160;            allocator-&gt;GetCurrentFrameIndex(),</div>
-<div class="line"><a name="l18322"></a><span class="lineno">18322</span>&#160;            allocation);</div>
-<div class="line"><a name="l18323"></a><span class="lineno">18323</span>&#160;    }</div>
-<div class="line"><a name="l18324"></a><span class="lineno">18324</span>&#160;<span class="preprocessor">#endif</span></div>
+<div class="line"><a name="l18166"></a><span class="lineno">18166</span>&#160;        VmaJsonWriter json(allocator-&gt;GetAllocationCallbacks(), sb);</div>
+<div class="line"><a name="l18167"></a><span class="lineno">18167</span>&#160;        json.BeginObject();</div>
+<div class="line"><a name="l18168"></a><span class="lineno">18168</span>&#160; </div>
+<div class="line"><a name="l18169"></a><span class="lineno">18169</span>&#160;        <a class="code" href="struct_vma_budget.html">VmaBudget</a> budget[VK_MAX_MEMORY_HEAPS];</div>
+<div class="line"><a name="l18170"></a><span class="lineno">18170</span>&#160;        allocator-&gt;GetBudget(budget, 0, allocator-&gt;GetMemoryHeapCount());</div>
+<div class="line"><a name="l18171"></a><span class="lineno">18171</span>&#160; </div>
+<div class="line"><a name="l18172"></a><span class="lineno">18172</span>&#160;        <a class="code" href="struct_vma_stats.html">VmaStats</a> stats;</div>
+<div class="line"><a name="l18173"></a><span class="lineno">18173</span>&#160;        allocator-&gt;CalculateStats(&amp;stats);</div>
+<div class="line"><a name="l18174"></a><span class="lineno">18174</span>&#160; </div>
+<div class="line"><a name="l18175"></a><span class="lineno">18175</span>&#160;        json.WriteString(<span class="stringliteral">&quot;Total&quot;</span>);</div>
+<div class="line"><a name="l18176"></a><span class="lineno">18176</span>&#160;        VmaPrintStatInfo(json, stats.<a class="code" href="struct_vma_stats.html#a2e8f5b3353f2fefef3c27f29e245a1f9">total</a>);</div>
+<div class="line"><a name="l18177"></a><span class="lineno">18177</span>&#160; </div>
+<div class="line"><a name="l18178"></a><span class="lineno">18178</span>&#160;        <span class="keywordflow">for</span>(uint32_t heapIndex = 0; heapIndex &lt; allocator-&gt;GetMemoryHeapCount(); ++heapIndex)</div>
+<div class="line"><a name="l18179"></a><span class="lineno">18179</span>&#160;        {</div>
+<div class="line"><a name="l18180"></a><span class="lineno">18180</span>&#160;            json.BeginString(<span class="stringliteral">&quot;Heap &quot;</span>);</div>
+<div class="line"><a name="l18181"></a><span class="lineno">18181</span>&#160;            json.ContinueString(heapIndex);</div>
+<div class="line"><a name="l18182"></a><span class="lineno">18182</span>&#160;            json.EndString();</div>
+<div class="line"><a name="l18183"></a><span class="lineno">18183</span>&#160;            json.BeginObject();</div>
+<div class="line"><a name="l18184"></a><span class="lineno">18184</span>&#160; </div>
+<div class="line"><a name="l18185"></a><span class="lineno">18185</span>&#160;            json.WriteString(<span class="stringliteral">&quot;Size&quot;</span>);</div>
+<div class="line"><a name="l18186"></a><span class="lineno">18186</span>&#160;            json.WriteNumber(allocator-&gt;m_MemProps.memoryHeaps[heapIndex].size);</div>
+<div class="line"><a name="l18187"></a><span class="lineno">18187</span>&#160; </div>
+<div class="line"><a name="l18188"></a><span class="lineno">18188</span>&#160;            json.WriteString(<span class="stringliteral">&quot;Flags&quot;</span>);</div>
+<div class="line"><a name="l18189"></a><span class="lineno">18189</span>&#160;            json.BeginArray(<span class="keyword">true</span>);</div>
+<div class="line"><a name="l18190"></a><span class="lineno">18190</span>&#160;            <span class="keywordflow">if</span>((allocator-&gt;m_MemProps.memoryHeaps[heapIndex].flags &amp; VK_MEMORY_HEAP_DEVICE_LOCAL_BIT) != 0)</div>
+<div class="line"><a name="l18191"></a><span class="lineno">18191</span>&#160;            {</div>
+<div class="line"><a name="l18192"></a><span class="lineno">18192</span>&#160;                json.WriteString(<span class="stringliteral">&quot;DEVICE_LOCAL&quot;</span>);</div>
+<div class="line"><a name="l18193"></a><span class="lineno">18193</span>&#160;            }</div>
+<div class="line"><a name="l18194"></a><span class="lineno">18194</span>&#160;            json.EndArray();</div>
+<div class="line"><a name="l18195"></a><span class="lineno">18195</span>&#160; </div>
+<div class="line"><a name="l18196"></a><span class="lineno">18196</span>&#160;            json.WriteString(<span class="stringliteral">&quot;Budget&quot;</span>);</div>
+<div class="line"><a name="l18197"></a><span class="lineno">18197</span>&#160;            json.BeginObject();</div>
+<div class="line"><a name="l18198"></a><span class="lineno">18198</span>&#160;            {</div>
+<div class="line"><a name="l18199"></a><span class="lineno">18199</span>&#160;                json.WriteString(<span class="stringliteral">&quot;BlockBytes&quot;</span>);</div>
+<div class="line"><a name="l18200"></a><span class="lineno">18200</span>&#160;                json.WriteNumber(budget[heapIndex].blockBytes);</div>
+<div class="line"><a name="l18201"></a><span class="lineno">18201</span>&#160;                json.WriteString(<span class="stringliteral">&quot;AllocationBytes&quot;</span>);</div>
+<div class="line"><a name="l18202"></a><span class="lineno">18202</span>&#160;                json.WriteNumber(budget[heapIndex].allocationBytes);</div>
+<div class="line"><a name="l18203"></a><span class="lineno">18203</span>&#160;                json.WriteString(<span class="stringliteral">&quot;Usage&quot;</span>);</div>
+<div class="line"><a name="l18204"></a><span class="lineno">18204</span>&#160;                json.WriteNumber(budget[heapIndex].usage);</div>
+<div class="line"><a name="l18205"></a><span class="lineno">18205</span>&#160;                json.WriteString(<span class="stringliteral">&quot;Budget&quot;</span>);</div>
+<div class="line"><a name="l18206"></a><span class="lineno">18206</span>&#160;                json.WriteNumber(budget[heapIndex].budget);</div>
+<div class="line"><a name="l18207"></a><span class="lineno">18207</span>&#160;            }</div>
+<div class="line"><a name="l18208"></a><span class="lineno">18208</span>&#160;            json.EndObject();</div>
+<div class="line"><a name="l18209"></a><span class="lineno">18209</span>&#160; </div>
+<div class="line"><a name="l18210"></a><span class="lineno">18210</span>&#160;            <span class="keywordflow">if</span>(stats.<a class="code" href="struct_vma_stats.html#a0e6611508c29a187f0fd14ff1a0329c0">memoryHeap</a>[heapIndex].<a class="code" href="struct_vma_stat_info.html#abc4bb7cd611900778464c56e50c970a4">blockCount</a> &gt; 0)</div>
+<div class="line"><a name="l18211"></a><span class="lineno">18211</span>&#160;            {</div>
+<div class="line"><a name="l18212"></a><span class="lineno">18212</span>&#160;                json.WriteString(<span class="stringliteral">&quot;Stats&quot;</span>);</div>
+<div class="line"><a name="l18213"></a><span class="lineno">18213</span>&#160;                VmaPrintStatInfo(json, stats.<a class="code" href="struct_vma_stats.html#a0e6611508c29a187f0fd14ff1a0329c0">memoryHeap</a>[heapIndex]);</div>
+<div class="line"><a name="l18214"></a><span class="lineno">18214</span>&#160;            }</div>
+<div class="line"><a name="l18215"></a><span class="lineno">18215</span>&#160; </div>
+<div class="line"><a name="l18216"></a><span class="lineno">18216</span>&#160;            <span class="keywordflow">for</span>(uint32_t typeIndex = 0; typeIndex &lt; allocator-&gt;GetMemoryTypeCount(); ++typeIndex)</div>
+<div class="line"><a name="l18217"></a><span class="lineno">18217</span>&#160;            {</div>
+<div class="line"><a name="l18218"></a><span class="lineno">18218</span>&#160;                <span class="keywordflow">if</span>(allocator-&gt;MemoryTypeIndexToHeapIndex(typeIndex) == heapIndex)</div>
+<div class="line"><a name="l18219"></a><span class="lineno">18219</span>&#160;                {</div>
+<div class="line"><a name="l18220"></a><span class="lineno">18220</span>&#160;                    json.BeginString(<span class="stringliteral">&quot;Type &quot;</span>);</div>
+<div class="line"><a name="l18221"></a><span class="lineno">18221</span>&#160;                    json.ContinueString(typeIndex);</div>
+<div class="line"><a name="l18222"></a><span class="lineno">18222</span>&#160;                    json.EndString();</div>
+<div class="line"><a name="l18223"></a><span class="lineno">18223</span>&#160; </div>
+<div class="line"><a name="l18224"></a><span class="lineno">18224</span>&#160;                    json.BeginObject();</div>
+<div class="line"><a name="l18225"></a><span class="lineno">18225</span>&#160; </div>
+<div class="line"><a name="l18226"></a><span class="lineno">18226</span>&#160;                    json.WriteString(<span class="stringliteral">&quot;Flags&quot;</span>);</div>
+<div class="line"><a name="l18227"></a><span class="lineno">18227</span>&#160;                    json.BeginArray(<span class="keyword">true</span>);</div>
+<div class="line"><a name="l18228"></a><span class="lineno">18228</span>&#160;                    VkMemoryPropertyFlags flags = allocator-&gt;m_MemProps.memoryTypes[typeIndex].propertyFlags;</div>
+<div class="line"><a name="l18229"></a><span class="lineno">18229</span>&#160;                    <span class="keywordflow">if</span>((flags &amp; VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT) != 0)</div>
+<div class="line"><a name="l18230"></a><span class="lineno">18230</span>&#160;                    {</div>
+<div class="line"><a name="l18231"></a><span class="lineno">18231</span>&#160;                        json.WriteString(<span class="stringliteral">&quot;DEVICE_LOCAL&quot;</span>);</div>
+<div class="line"><a name="l18232"></a><span class="lineno">18232</span>&#160;                    }</div>
+<div class="line"><a name="l18233"></a><span class="lineno">18233</span>&#160;                    <span class="keywordflow">if</span>((flags &amp; VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT) != 0)</div>
+<div class="line"><a name="l18234"></a><span class="lineno">18234</span>&#160;                    {</div>
+<div class="line"><a name="l18235"></a><span class="lineno">18235</span>&#160;                        json.WriteString(<span class="stringliteral">&quot;HOST_VISIBLE&quot;</span>);</div>
+<div class="line"><a name="l18236"></a><span class="lineno">18236</span>&#160;                    }</div>
+<div class="line"><a name="l18237"></a><span class="lineno">18237</span>&#160;                    <span class="keywordflow">if</span>((flags &amp; VK_MEMORY_PROPERTY_HOST_COHERENT_BIT) != 0)</div>
+<div class="line"><a name="l18238"></a><span class="lineno">18238</span>&#160;                    {</div>
+<div class="line"><a name="l18239"></a><span class="lineno">18239</span>&#160;                        json.WriteString(<span class="stringliteral">&quot;HOST_COHERENT&quot;</span>);</div>
+<div class="line"><a name="l18240"></a><span class="lineno">18240</span>&#160;                    }</div>
+<div class="line"><a name="l18241"></a><span class="lineno">18241</span>&#160;                    <span class="keywordflow">if</span>((flags &amp; VK_MEMORY_PROPERTY_HOST_CACHED_BIT) != 0)</div>
+<div class="line"><a name="l18242"></a><span class="lineno">18242</span>&#160;                    {</div>
+<div class="line"><a name="l18243"></a><span class="lineno">18243</span>&#160;                        json.WriteString(<span class="stringliteral">&quot;HOST_CACHED&quot;</span>);</div>
+<div class="line"><a name="l18244"></a><span class="lineno">18244</span>&#160;                    }</div>
+<div class="line"><a name="l18245"></a><span class="lineno">18245</span>&#160;                    <span class="keywordflow">if</span>((flags &amp; VK_MEMORY_PROPERTY_LAZILY_ALLOCATED_BIT) != 0)</div>
+<div class="line"><a name="l18246"></a><span class="lineno">18246</span>&#160;                    {</div>
+<div class="line"><a name="l18247"></a><span class="lineno">18247</span>&#160;                        json.WriteString(<span class="stringliteral">&quot;LAZILY_ALLOCATED&quot;</span>);</div>
+<div class="line"><a name="l18248"></a><span class="lineno">18248</span>&#160;                    }</div>
+<div class="line"><a name="l18249"></a><span class="lineno">18249</span>&#160;<span class="preprocessor">#if VMA_VULKAN_VERSION &gt;= 1001000</span></div>
+<div class="line"><a name="l18250"></a><span class="lineno">18250</span>&#160;                    <span class="keywordflow">if</span>((flags &amp; VK_MEMORY_PROPERTY_PROTECTED_BIT) != 0)</div>
+<div class="line"><a name="l18251"></a><span class="lineno">18251</span>&#160;                    {</div>
+<div class="line"><a name="l18252"></a><span class="lineno">18252</span>&#160;                        json.WriteString(<span class="stringliteral">&quot;PROTECTED&quot;</span>);</div>
+<div class="line"><a name="l18253"></a><span class="lineno">18253</span>&#160;                    }</div>
+<div class="line"><a name="l18254"></a><span class="lineno">18254</span>&#160;<span class="preprocessor">#endif </span><span class="comment">// #if VMA_VULKAN_VERSION &gt;= 1001000</span></div>
+<div class="line"><a name="l18255"></a><span class="lineno">18255</span>&#160;<span class="preprocessor">#if VK_AMD_device_coherent_memory</span></div>
+<div class="line"><a name="l18256"></a><span class="lineno">18256</span>&#160;                    <span class="keywordflow">if</span>((flags &amp; VK_MEMORY_PROPERTY_DEVICE_COHERENT_BIT_AMD_COPY) != 0)</div>
+<div class="line"><a name="l18257"></a><span class="lineno">18257</span>&#160;                    {</div>
+<div class="line"><a name="l18258"></a><span class="lineno">18258</span>&#160;                        json.WriteString(<span class="stringliteral">&quot;DEVICE_COHERENT&quot;</span>);</div>
+<div class="line"><a name="l18259"></a><span class="lineno">18259</span>&#160;                    }</div>
+<div class="line"><a name="l18260"></a><span class="lineno">18260</span>&#160;                    <span class="keywordflow">if</span>((flags &amp; VK_MEMORY_PROPERTY_DEVICE_UNCACHED_BIT_AMD_COPY) != 0)</div>
+<div class="line"><a name="l18261"></a><span class="lineno">18261</span>&#160;                    {</div>
+<div class="line"><a name="l18262"></a><span class="lineno">18262</span>&#160;                        json.WriteString(<span class="stringliteral">&quot;DEVICE_UNCACHED&quot;</span>);</div>
+<div class="line"><a name="l18263"></a><span class="lineno">18263</span>&#160;                    }</div>
+<div class="line"><a name="l18264"></a><span class="lineno">18264</span>&#160;<span class="preprocessor">#endif </span><span class="comment">// #if VK_AMD_device_coherent_memory</span></div>
+<div class="line"><a name="l18265"></a><span class="lineno">18265</span>&#160;                    json.EndArray();</div>
+<div class="line"><a name="l18266"></a><span class="lineno">18266</span>&#160; </div>
+<div class="line"><a name="l18267"></a><span class="lineno">18267</span>&#160;                    <span class="keywordflow">if</span>(stats.<a class="code" href="struct_vma_stats.html#a13e3caf754be79352c42408756309331">memoryType</a>[typeIndex].<a class="code" href="struct_vma_stat_info.html#abc4bb7cd611900778464c56e50c970a4">blockCount</a> &gt; 0)</div>
+<div class="line"><a name="l18268"></a><span class="lineno">18268</span>&#160;                    {</div>
+<div class="line"><a name="l18269"></a><span class="lineno">18269</span>&#160;                        json.WriteString(<span class="stringliteral">&quot;Stats&quot;</span>);</div>
+<div class="line"><a name="l18270"></a><span class="lineno">18270</span>&#160;                        VmaPrintStatInfo(json, stats.<a class="code" href="struct_vma_stats.html#a13e3caf754be79352c42408756309331">memoryType</a>[typeIndex]);</div>
+<div class="line"><a name="l18271"></a><span class="lineno">18271</span>&#160;                    }</div>
+<div class="line"><a name="l18272"></a><span class="lineno">18272</span>&#160; </div>
+<div class="line"><a name="l18273"></a><span class="lineno">18273</span>&#160;                    json.EndObject();</div>
+<div class="line"><a name="l18274"></a><span class="lineno">18274</span>&#160;                }</div>
+<div class="line"><a name="l18275"></a><span class="lineno">18275</span>&#160;            }</div>
+<div class="line"><a name="l18276"></a><span class="lineno">18276</span>&#160; </div>
+<div class="line"><a name="l18277"></a><span class="lineno">18277</span>&#160;            json.EndObject();</div>
+<div class="line"><a name="l18278"></a><span class="lineno">18278</span>&#160;        }</div>
+<div class="line"><a name="l18279"></a><span class="lineno">18279</span>&#160;        <span class="keywordflow">if</span>(detailedMap == VK_TRUE)</div>
+<div class="line"><a name="l18280"></a><span class="lineno">18280</span>&#160;        {</div>
+<div class="line"><a name="l18281"></a><span class="lineno">18281</span>&#160;            allocator-&gt;PrintDetailedMap(json);</div>
+<div class="line"><a name="l18282"></a><span class="lineno">18282</span>&#160;        }</div>
+<div class="line"><a name="l18283"></a><span class="lineno">18283</span>&#160; </div>
+<div class="line"><a name="l18284"></a><span class="lineno">18284</span>&#160;        json.EndObject();</div>
+<div class="line"><a name="l18285"></a><span class="lineno">18285</span>&#160;    }</div>
+<div class="line"><a name="l18286"></a><span class="lineno">18286</span>&#160; </div>
+<div class="line"><a name="l18287"></a><span class="lineno">18287</span>&#160;    <span class="keyword">const</span> <span class="keywordtype">size_t</span> len = sb.GetLength();</div>
+<div class="line"><a name="l18288"></a><span class="lineno">18288</span>&#160;    <span class="keywordtype">char</span>* <span class="keyword">const</span> pChars = vma_new_array(allocator, <span class="keywordtype">char</span>, len + 1);</div>
+<div class="line"><a name="l18289"></a><span class="lineno">18289</span>&#160;    <span class="keywordflow">if</span>(len &gt; 0)</div>
+<div class="line"><a name="l18290"></a><span class="lineno">18290</span>&#160;    {</div>
+<div class="line"><a name="l18291"></a><span class="lineno">18291</span>&#160;        memcpy(pChars, sb.GetData(), len);</div>
+<div class="line"><a name="l18292"></a><span class="lineno">18292</span>&#160;    }</div>
+<div class="line"><a name="l18293"></a><span class="lineno">18293</span>&#160;    pChars[len] = <span class="charliteral">&#39;\0&#39;</span>;</div>
+<div class="line"><a name="l18294"></a><span class="lineno">18294</span>&#160;    *ppStatsString = pChars;</div>
+<div class="line"><a name="l18295"></a><span class="lineno">18295</span>&#160;}</div>
+<div class="line"><a name="l18296"></a><span class="lineno">18296</span>&#160; </div>
+<div class="line"><a name="l18297"></a><span class="lineno">18297</span>&#160;VMA_CALL_PRE <span class="keywordtype">void</span> VMA_CALL_POST <a class="code" href="vk__mem__alloc_8h.html#a3104eb30d8122c84dd8541063f145288">vmaFreeStatsString</a>(</div>
+<div class="line"><a name="l18298"></a><span class="lineno">18298</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div>
+<div class="line"><a name="l18299"></a><span class="lineno">18299</span>&#160;    <span class="keywordtype">char</span>* pStatsString)</div>
+<div class="line"><a name="l18300"></a><span class="lineno">18300</span>&#160;{</div>
+<div class="line"><a name="l18301"></a><span class="lineno">18301</span>&#160;    <span class="keywordflow">if</span>(pStatsString != VMA_NULL)</div>
+<div class="line"><a name="l18302"></a><span class="lineno">18302</span>&#160;    {</div>
+<div class="line"><a name="l18303"></a><span class="lineno">18303</span>&#160;        VMA_ASSERT(allocator);</div>
+<div class="line"><a name="l18304"></a><span class="lineno">18304</span>&#160;        <span class="keywordtype">size_t</span> len = strlen(pStatsString);</div>
+<div class="line"><a name="l18305"></a><span class="lineno">18305</span>&#160;        vma_delete_array(allocator, pStatsString, len + 1);</div>
+<div class="line"><a name="l18306"></a><span class="lineno">18306</span>&#160;    }</div>
+<div class="line"><a name="l18307"></a><span class="lineno">18307</span>&#160;}</div>
+<div class="line"><a name="l18308"></a><span class="lineno">18308</span>&#160; </div>
+<div class="line"><a name="l18309"></a><span class="lineno">18309</span>&#160;<span class="preprocessor">#endif </span><span class="comment">// #if VMA_STATS_STRING_ENABLED</span></div>
+<div class="line"><a name="l18310"></a><span class="lineno">18310</span>&#160; </div>
+<div class="line"><a name="l18311"></a><span class="lineno">18311</span>&#160;<span class="comment">/*</span></div>
+<div class="line"><a name="l18312"></a><span class="lineno">18312</span>&#160;<span class="comment">This function is not protected by any mutex because it just reads immutable data.</span></div>
+<div class="line"><a name="l18313"></a><span class="lineno">18313</span>&#160;<span class="comment">*/</span></div>
+<div class="line"><a name="l18314"></a><span class="lineno">18314</span>&#160;VMA_CALL_PRE VkResult VMA_CALL_POST <a class="code" href="vk__mem__alloc_8h.html#aef15a94b58fbcb0fe706d5720e84a74a">vmaFindMemoryTypeIndex</a>(</div>
+<div class="line"><a name="l18315"></a><span class="lineno">18315</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div>
+<div class="line"><a name="l18316"></a><span class="lineno">18316</span>&#160;    uint32_t memoryTypeBits,</div>
+<div class="line"><a name="l18317"></a><span class="lineno">18317</span>&#160;    <span class="keyword">const</span> <a class="code" href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a>* pAllocationCreateInfo,</div>
+<div class="line"><a name="l18318"></a><span class="lineno">18318</span>&#160;    uint32_t* pMemoryTypeIndex)</div>
+<div class="line"><a name="l18319"></a><span class="lineno">18319</span>&#160;{</div>
+<div class="line"><a name="l18320"></a><span class="lineno">18320</span>&#160;    VMA_ASSERT(allocator != VK_NULL_HANDLE);</div>
+<div class="line"><a name="l18321"></a><span class="lineno">18321</span>&#160;    VMA_ASSERT(pAllocationCreateInfo != VMA_NULL);</div>
+<div class="line"><a name="l18322"></a><span class="lineno">18322</span>&#160;    VMA_ASSERT(pMemoryTypeIndex != VMA_NULL);</div>
+<div class="line"><a name="l18323"></a><span class="lineno">18323</span>&#160; </div>
+<div class="line"><a name="l18324"></a><span class="lineno">18324</span>&#160;    memoryTypeBits &amp;= allocator-&gt;GetGlobalMemoryTypeBits();</div>
 <div class="line"><a name="l18325"></a><span class="lineno">18325</span>&#160; </div>
-<div class="line"><a name="l18326"></a><span class="lineno">18326</span>&#160;    allocator-&gt;GetAllocationInfo(allocation, pAllocationInfo);</div>
-<div class="line"><a name="l18327"></a><span class="lineno">18327</span>&#160;}</div>
-<div class="line"><a name="l18328"></a><span class="lineno">18328</span>&#160; </div>
-<div class="line"><a name="l18329"></a><span class="lineno">18329</span>&#160;VMA_CALL_PRE VkBool32 VMA_CALL_POST <a class="code" href="vk__mem__alloc_8h.html#a43d8ba9673c846f049089a5029d5c73a">vmaTouchAllocation</a>(</div>
-<div class="line"><a name="l18330"></a><span class="lineno">18330</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div>
-<div class="line"><a name="l18331"></a><span class="lineno">18331</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation)</div>
-<div class="line"><a name="l18332"></a><span class="lineno">18332</span>&#160;{</div>
-<div class="line"><a name="l18333"></a><span class="lineno">18333</span>&#160;    VMA_ASSERT(allocator &amp;&amp; allocation);</div>
+<div class="line"><a name="l18326"></a><span class="lineno">18326</span>&#160;    <span class="keywordflow">if</span>(pAllocationCreateInfo-&gt;<a class="code" href="struct_vma_allocation_create_info.html#a3bf940c0271d85d6ba32a4d820075055">memoryTypeBits</a> != 0)</div>
+<div class="line"><a name="l18327"></a><span class="lineno">18327</span>&#160;    {</div>
+<div class="line"><a name="l18328"></a><span class="lineno">18328</span>&#160;        memoryTypeBits &amp;= pAllocationCreateInfo-&gt;<a class="code" href="struct_vma_allocation_create_info.html#a3bf940c0271d85d6ba32a4d820075055">memoryTypeBits</a>;</div>
+<div class="line"><a name="l18329"></a><span class="lineno">18329</span>&#160;    }</div>
+<div class="line"><a name="l18330"></a><span class="lineno">18330</span>&#160; </div>
+<div class="line"><a name="l18331"></a><span class="lineno">18331</span>&#160;    uint32_t requiredFlags = pAllocationCreateInfo-&gt;<a class="code" href="struct_vma_allocation_create_info.html#a9166390303ff42d783305bc31c2b6b90">requiredFlags</a>;</div>
+<div class="line"><a name="l18332"></a><span class="lineno">18332</span>&#160;    uint32_t preferredFlags = pAllocationCreateInfo-&gt;<a class="code" href="struct_vma_allocation_create_info.html#a7fe8d81a1ad10b2a2faacacee5b15d6d">preferredFlags</a>;</div>
+<div class="line"><a name="l18333"></a><span class="lineno">18333</span>&#160;    uint32_t notPreferredFlags = 0;</div>
 <div class="line"><a name="l18334"></a><span class="lineno">18334</span>&#160; </div>
-<div class="line"><a name="l18335"></a><span class="lineno">18335</span>&#160;    VMA_DEBUG_GLOBAL_MUTEX_LOCK</div>
-<div class="line"><a name="l18336"></a><span class="lineno">18336</span>&#160; </div>
-<div class="line"><a name="l18337"></a><span class="lineno">18337</span>&#160;<span class="preprocessor">#if VMA_RECORDING_ENABLED</span></div>
-<div class="line"><a name="l18338"></a><span class="lineno">18338</span>&#160;    <span class="keywordflow">if</span>(allocator-&gt;GetRecorder() != VMA_NULL)</div>
-<div class="line"><a name="l18339"></a><span class="lineno">18339</span>&#160;    {</div>
-<div class="line"><a name="l18340"></a><span class="lineno">18340</span>&#160;        allocator-&gt;GetRecorder()-&gt;RecordTouchAllocation(</div>
-<div class="line"><a name="l18341"></a><span class="lineno">18341</span>&#160;            allocator-&gt;GetCurrentFrameIndex(),</div>
-<div class="line"><a name="l18342"></a><span class="lineno">18342</span>&#160;            allocation);</div>
-<div class="line"><a name="l18343"></a><span class="lineno">18343</span>&#160;    }</div>
-<div class="line"><a name="l18344"></a><span class="lineno">18344</span>&#160;<span class="preprocessor">#endif</span></div>
-<div class="line"><a name="l18345"></a><span class="lineno">18345</span>&#160; </div>
-<div class="line"><a name="l18346"></a><span class="lineno">18346</span>&#160;    <span class="keywordflow">return</span> allocator-&gt;TouchAllocation(allocation);</div>
-<div class="line"><a name="l18347"></a><span class="lineno">18347</span>&#160;}</div>
-<div class="line"><a name="l18348"></a><span class="lineno">18348</span>&#160; </div>
-<div class="line"><a name="l18349"></a><span class="lineno">18349</span>&#160;VMA_CALL_PRE <span class="keywordtype">void</span> VMA_CALL_POST <a class="code" href="vk__mem__alloc_8h.html#af9147d31ffc11d62fc187bde283ed14f">vmaSetAllocationUserData</a>(</div>
-<div class="line"><a name="l18350"></a><span class="lineno">18350</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div>
-<div class="line"><a name="l18351"></a><span class="lineno">18351</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation,</div>
-<div class="line"><a name="l18352"></a><span class="lineno">18352</span>&#160;    <span class="keywordtype">void</span>* pUserData)</div>
-<div class="line"><a name="l18353"></a><span class="lineno">18353</span>&#160;{</div>
-<div class="line"><a name="l18354"></a><span class="lineno">18354</span>&#160;    VMA_ASSERT(allocator &amp;&amp; allocation);</div>
-<div class="line"><a name="l18355"></a><span class="lineno">18355</span>&#160; </div>
-<div class="line"><a name="l18356"></a><span class="lineno">18356</span>&#160;    VMA_DEBUG_GLOBAL_MUTEX_LOCK</div>
-<div class="line"><a name="l18357"></a><span class="lineno">18357</span>&#160; </div>
-<div class="line"><a name="l18358"></a><span class="lineno">18358</span>&#160;    allocation-&gt;SetUserData(allocator, pUserData);</div>
-<div class="line"><a name="l18359"></a><span class="lineno">18359</span>&#160; </div>
-<div class="line"><a name="l18360"></a><span class="lineno">18360</span>&#160;<span class="preprocessor">#if VMA_RECORDING_ENABLED</span></div>
-<div class="line"><a name="l18361"></a><span class="lineno">18361</span>&#160;    <span class="keywordflow">if</span>(allocator-&gt;GetRecorder() != VMA_NULL)</div>
-<div class="line"><a name="l18362"></a><span class="lineno">18362</span>&#160;    {</div>
-<div class="line"><a name="l18363"></a><span class="lineno">18363</span>&#160;        allocator-&gt;GetRecorder()-&gt;RecordSetAllocationUserData(</div>
-<div class="line"><a name="l18364"></a><span class="lineno">18364</span>&#160;            allocator-&gt;GetCurrentFrameIndex(),</div>
-<div class="line"><a name="l18365"></a><span class="lineno">18365</span>&#160;            allocation,</div>
-<div class="line"><a name="l18366"></a><span class="lineno">18366</span>&#160;            pUserData);</div>
-<div class="line"><a name="l18367"></a><span class="lineno">18367</span>&#160;    }</div>
-<div class="line"><a name="l18368"></a><span class="lineno">18368</span>&#160;<span class="preprocessor">#endif</span></div>
-<div class="line"><a name="l18369"></a><span class="lineno">18369</span>&#160;}</div>
+<div class="line"><a name="l18335"></a><span class="lineno">18335</span>&#160;    <span class="comment">// Convert usage to requiredFlags and preferredFlags.</span></div>
+<div class="line"><a name="l18336"></a><span class="lineno">18336</span>&#160;    <span class="keywordflow">switch</span>(pAllocationCreateInfo-&gt;<a class="code" href="struct_vma_allocation_create_info.html#accb8b06b1f677d858cb9af20705fa910">usage</a>)</div>
+<div class="line"><a name="l18337"></a><span class="lineno">18337</span>&#160;    {</div>
+<div class="line"><a name="l18338"></a><span class="lineno">18338</span>&#160;    <span class="keywordflow">case</span> <a class="code" href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305ccaf50d27e34e0925cf3a63db8c839121dd">VMA_MEMORY_USAGE_UNKNOWN</a>:</div>
+<div class="line"><a name="l18339"></a><span class="lineno">18339</span>&#160;        <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l18340"></a><span class="lineno">18340</span>&#160;    <span class="keywordflow">case</span> <a class="code" href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305ccac6b5dc1432d88647aa4cd456246eadf7">VMA_MEMORY_USAGE_GPU_ONLY</a>:</div>
+<div class="line"><a name="l18341"></a><span class="lineno">18341</span>&#160;        <span class="keywordflow">if</span>(!allocator-&gt;IsIntegratedGpu() || (preferredFlags &amp; VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT) == 0)</div>
+<div class="line"><a name="l18342"></a><span class="lineno">18342</span>&#160;        {</div>
+<div class="line"><a name="l18343"></a><span class="lineno">18343</span>&#160;            preferredFlags |= VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT;</div>
+<div class="line"><a name="l18344"></a><span class="lineno">18344</span>&#160;        }</div>
+<div class="line"><a name="l18345"></a><span class="lineno">18345</span>&#160;        <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l18346"></a><span class="lineno">18346</span>&#160;    <span class="keywordflow">case</span> <a class="code" href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305cca40bdf4cddeffeb12f43d45ca1286e0a5">VMA_MEMORY_USAGE_CPU_ONLY</a>:</div>
+<div class="line"><a name="l18347"></a><span class="lineno">18347</span>&#160;        requiredFlags |= VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT;</div>
+<div class="line"><a name="l18348"></a><span class="lineno">18348</span>&#160;        <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l18349"></a><span class="lineno">18349</span>&#160;    <span class="keywordflow">case</span> <a class="code" href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305cca9066b52c5a7079bb74a69aaf8b92ff67">VMA_MEMORY_USAGE_CPU_TO_GPU</a>:</div>
+<div class="line"><a name="l18350"></a><span class="lineno">18350</span>&#160;        requiredFlags |= VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;</div>
+<div class="line"><a name="l18351"></a><span class="lineno">18351</span>&#160;        <span class="keywordflow">if</span>(!allocator-&gt;IsIntegratedGpu() || (preferredFlags &amp; VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT) == 0)</div>
+<div class="line"><a name="l18352"></a><span class="lineno">18352</span>&#160;        {</div>
+<div class="line"><a name="l18353"></a><span class="lineno">18353</span>&#160;            preferredFlags |= VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT;</div>
+<div class="line"><a name="l18354"></a><span class="lineno">18354</span>&#160;        }</div>
+<div class="line"><a name="l18355"></a><span class="lineno">18355</span>&#160;        <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l18356"></a><span class="lineno">18356</span>&#160;    <span class="keywordflow">case</span> <a class="code" href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305cca7b586d2fdaf82a463b58f581ed72be27">VMA_MEMORY_USAGE_GPU_TO_CPU</a>:</div>
+<div class="line"><a name="l18357"></a><span class="lineno">18357</span>&#160;        requiredFlags |= VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;</div>
+<div class="line"><a name="l18358"></a><span class="lineno">18358</span>&#160;        preferredFlags |= VK_MEMORY_PROPERTY_HOST_CACHED_BIT;</div>
+<div class="line"><a name="l18359"></a><span class="lineno">18359</span>&#160;        <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l18360"></a><span class="lineno">18360</span>&#160;    <span class="keywordflow">case</span> <a class="code" href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305cca416a444d4d0fc20067c3f76f32ff2500">VMA_MEMORY_USAGE_CPU_COPY</a>:</div>
+<div class="line"><a name="l18361"></a><span class="lineno">18361</span>&#160;        notPreferredFlags |= VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT;</div>
+<div class="line"><a name="l18362"></a><span class="lineno">18362</span>&#160;        <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l18363"></a><span class="lineno">18363</span>&#160;    <span class="keywordflow">case</span> <a class="code" href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305cca835333d9072db63a653818030e17614d">VMA_MEMORY_USAGE_GPU_LAZILY_ALLOCATED</a>:</div>
+<div class="line"><a name="l18364"></a><span class="lineno">18364</span>&#160;        requiredFlags |= VK_MEMORY_PROPERTY_LAZILY_ALLOCATED_BIT;</div>
+<div class="line"><a name="l18365"></a><span class="lineno">18365</span>&#160;        <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l18366"></a><span class="lineno">18366</span>&#160;    <span class="keywordflow">default</span>:</div>
+<div class="line"><a name="l18367"></a><span class="lineno">18367</span>&#160;        VMA_ASSERT(0);</div>
+<div class="line"><a name="l18368"></a><span class="lineno">18368</span>&#160;        <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l18369"></a><span class="lineno">18369</span>&#160;    }</div>
 <div class="line"><a name="l18370"></a><span class="lineno">18370</span>&#160; </div>
-<div class="line"><a name="l18371"></a><span class="lineno">18371</span>&#160;VMA_CALL_PRE <span class="keywordtype">void</span> VMA_CALL_POST <a class="code" href="vk__mem__alloc_8h.html#ae5c9657d9e94756269145b01c05d16f1">vmaCreateLostAllocation</a>(</div>
-<div class="line"><a name="l18372"></a><span class="lineno">18372</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div>
-<div class="line"><a name="l18373"></a><span class="lineno">18373</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a>* pAllocation)</div>
-<div class="line"><a name="l18374"></a><span class="lineno">18374</span>&#160;{</div>
-<div class="line"><a name="l18375"></a><span class="lineno">18375</span>&#160;    VMA_ASSERT(allocator &amp;&amp; pAllocation);</div>
-<div class="line"><a name="l18376"></a><span class="lineno">18376</span>&#160; </div>
-<div class="line"><a name="l18377"></a><span class="lineno">18377</span>&#160;    VMA_DEBUG_GLOBAL_MUTEX_LOCK;</div>
-<div class="line"><a name="l18378"></a><span class="lineno">18378</span>&#160; </div>
-<div class="line"><a name="l18379"></a><span class="lineno">18379</span>&#160;    allocator-&gt;CreateLostAllocation(pAllocation);</div>
-<div class="line"><a name="l18380"></a><span class="lineno">18380</span>&#160; </div>
-<div class="line"><a name="l18381"></a><span class="lineno">18381</span>&#160;<span class="preprocessor">#if VMA_RECORDING_ENABLED</span></div>
-<div class="line"><a name="l18382"></a><span class="lineno">18382</span>&#160;    <span class="keywordflow">if</span>(allocator-&gt;GetRecorder() != VMA_NULL)</div>
+<div class="line"><a name="l18371"></a><span class="lineno">18371</span>&#160;    <span class="comment">// Avoid DEVICE_COHERENT unless explicitly requested.</span></div>
+<div class="line"><a name="l18372"></a><span class="lineno">18372</span>&#160;    <span class="keywordflow">if</span>(((pAllocationCreateInfo-&gt;<a class="code" href="struct_vma_allocation_create_info.html#a9166390303ff42d783305bc31c2b6b90">requiredFlags</a> | pAllocationCreateInfo-&gt;<a class="code" href="struct_vma_allocation_create_info.html#a7fe8d81a1ad10b2a2faacacee5b15d6d">preferredFlags</a>) &amp;</div>
+<div class="line"><a name="l18373"></a><span class="lineno">18373</span>&#160;        (VK_MEMORY_PROPERTY_DEVICE_COHERENT_BIT_AMD_COPY | VK_MEMORY_PROPERTY_DEVICE_UNCACHED_BIT_AMD_COPY)) == 0)</div>
+<div class="line"><a name="l18374"></a><span class="lineno">18374</span>&#160;    {</div>
+<div class="line"><a name="l18375"></a><span class="lineno">18375</span>&#160;        notPreferredFlags |= VK_MEMORY_PROPERTY_DEVICE_COHERENT_BIT_AMD_COPY;</div>
+<div class="line"><a name="l18376"></a><span class="lineno">18376</span>&#160;    }</div>
+<div class="line"><a name="l18377"></a><span class="lineno">18377</span>&#160; </div>
+<div class="line"><a name="l18378"></a><span class="lineno">18378</span>&#160;    *pMemoryTypeIndex = UINT32_MAX;</div>
+<div class="line"><a name="l18379"></a><span class="lineno">18379</span>&#160;    uint32_t minCost = UINT32_MAX;</div>
+<div class="line"><a name="l18380"></a><span class="lineno">18380</span>&#160;    <span class="keywordflow">for</span>(uint32_t memTypeIndex = 0, memTypeBit = 1;</div>
+<div class="line"><a name="l18381"></a><span class="lineno">18381</span>&#160;        memTypeIndex &lt; allocator-&gt;GetMemoryTypeCount();</div>
+<div class="line"><a name="l18382"></a><span class="lineno">18382</span>&#160;        ++memTypeIndex, memTypeBit &lt;&lt;= 1)</div>
 <div class="line"><a name="l18383"></a><span class="lineno">18383</span>&#160;    {</div>
-<div class="line"><a name="l18384"></a><span class="lineno">18384</span>&#160;        allocator-&gt;GetRecorder()-&gt;RecordCreateLostAllocation(</div>
-<div class="line"><a name="l18385"></a><span class="lineno">18385</span>&#160;            allocator-&gt;GetCurrentFrameIndex(),</div>
-<div class="line"><a name="l18386"></a><span class="lineno">18386</span>&#160;            *pAllocation);</div>
-<div class="line"><a name="l18387"></a><span class="lineno">18387</span>&#160;    }</div>
-<div class="line"><a name="l18388"></a><span class="lineno">18388</span>&#160;<span class="preprocessor">#endif</span></div>
-<div class="line"><a name="l18389"></a><span class="lineno">18389</span>&#160;}</div>
-<div class="line"><a name="l18390"></a><span class="lineno">18390</span>&#160; </div>
-<div class="line"><a name="l18391"></a><span class="lineno">18391</span>&#160;VMA_CALL_PRE VkResult VMA_CALL_POST <a class="code" href="vk__mem__alloc_8h.html#ad5bd1243512d099706de88168992f069">vmaMapMemory</a>(</div>
-<div class="line"><a name="l18392"></a><span class="lineno">18392</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div>
-<div class="line"><a name="l18393"></a><span class="lineno">18393</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation,</div>
-<div class="line"><a name="l18394"></a><span class="lineno">18394</span>&#160;    <span class="keywordtype">void</span>** ppData)</div>
-<div class="line"><a name="l18395"></a><span class="lineno">18395</span>&#160;{</div>
-<div class="line"><a name="l18396"></a><span class="lineno">18396</span>&#160;    VMA_ASSERT(allocator &amp;&amp; allocation &amp;&amp; ppData);</div>
-<div class="line"><a name="l18397"></a><span class="lineno">18397</span>&#160; </div>
-<div class="line"><a name="l18398"></a><span class="lineno">18398</span>&#160;    VMA_DEBUG_GLOBAL_MUTEX_LOCK</div>
-<div class="line"><a name="l18399"></a><span class="lineno">18399</span>&#160; </div>
-<div class="line"><a name="l18400"></a><span class="lineno">18400</span>&#160;    VkResult res = allocator-&gt;Map(allocation, ppData);</div>
-<div class="line"><a name="l18401"></a><span class="lineno">18401</span>&#160; </div>
-<div class="line"><a name="l18402"></a><span class="lineno">18402</span>&#160;<span class="preprocessor">#if VMA_RECORDING_ENABLED</span></div>
-<div class="line"><a name="l18403"></a><span class="lineno">18403</span>&#160;    <span class="keywordflow">if</span>(allocator-&gt;GetRecorder() != VMA_NULL)</div>
-<div class="line"><a name="l18404"></a><span class="lineno">18404</span>&#160;    {</div>
-<div class="line"><a name="l18405"></a><span class="lineno">18405</span>&#160;        allocator-&gt;GetRecorder()-&gt;RecordMapMemory(</div>
-<div class="line"><a name="l18406"></a><span class="lineno">18406</span>&#160;            allocator-&gt;GetCurrentFrameIndex(),</div>
-<div class="line"><a name="l18407"></a><span class="lineno">18407</span>&#160;            allocation);</div>
-<div class="line"><a name="l18408"></a><span class="lineno">18408</span>&#160;    }</div>
-<div class="line"><a name="l18409"></a><span class="lineno">18409</span>&#160;<span class="preprocessor">#endif</span></div>
+<div class="line"><a name="l18384"></a><span class="lineno">18384</span>&#160;        <span class="comment">// This memory type is acceptable according to memoryTypeBits bitmask.</span></div>
+<div class="line"><a name="l18385"></a><span class="lineno">18385</span>&#160;        <span class="keywordflow">if</span>((memTypeBit &amp; memoryTypeBits) != 0)</div>
+<div class="line"><a name="l18386"></a><span class="lineno">18386</span>&#160;        {</div>
+<div class="line"><a name="l18387"></a><span class="lineno">18387</span>&#160;            <span class="keyword">const</span> VkMemoryPropertyFlags currFlags =</div>
+<div class="line"><a name="l18388"></a><span class="lineno">18388</span>&#160;                allocator-&gt;m_MemProps.memoryTypes[memTypeIndex].propertyFlags;</div>
+<div class="line"><a name="l18389"></a><span class="lineno">18389</span>&#160;            <span class="comment">// This memory type contains requiredFlags.</span></div>
+<div class="line"><a name="l18390"></a><span class="lineno">18390</span>&#160;            <span class="keywordflow">if</span>((requiredFlags &amp; ~currFlags) == 0)</div>
+<div class="line"><a name="l18391"></a><span class="lineno">18391</span>&#160;            {</div>
+<div class="line"><a name="l18392"></a><span class="lineno">18392</span>&#160;                <span class="comment">// Calculate cost as number of bits from preferredFlags not present in this memory type.</span></div>
+<div class="line"><a name="l18393"></a><span class="lineno">18393</span>&#160;                uint32_t currCost = VmaCountBitsSet(preferredFlags &amp; ~currFlags) +</div>
+<div class="line"><a name="l18394"></a><span class="lineno">18394</span>&#160;                    VmaCountBitsSet(currFlags &amp; notPreferredFlags);</div>
+<div class="line"><a name="l18395"></a><span class="lineno">18395</span>&#160;                <span class="comment">// Remember memory type with lowest cost.</span></div>
+<div class="line"><a name="l18396"></a><span class="lineno">18396</span>&#160;                <span class="keywordflow">if</span>(currCost &lt; minCost)</div>
+<div class="line"><a name="l18397"></a><span class="lineno">18397</span>&#160;                {</div>
+<div class="line"><a name="l18398"></a><span class="lineno">18398</span>&#160;                    *pMemoryTypeIndex = memTypeIndex;</div>
+<div class="line"><a name="l18399"></a><span class="lineno">18399</span>&#160;                    <span class="keywordflow">if</span>(currCost == 0)</div>
+<div class="line"><a name="l18400"></a><span class="lineno">18400</span>&#160;                    {</div>
+<div class="line"><a name="l18401"></a><span class="lineno">18401</span>&#160;                        <span class="keywordflow">return</span> VK_SUCCESS;</div>
+<div class="line"><a name="l18402"></a><span class="lineno">18402</span>&#160;                    }</div>
+<div class="line"><a name="l18403"></a><span class="lineno">18403</span>&#160;                    minCost = currCost;</div>
+<div class="line"><a name="l18404"></a><span class="lineno">18404</span>&#160;                }</div>
+<div class="line"><a name="l18405"></a><span class="lineno">18405</span>&#160;            }</div>
+<div class="line"><a name="l18406"></a><span class="lineno">18406</span>&#160;        }</div>
+<div class="line"><a name="l18407"></a><span class="lineno">18407</span>&#160;    }</div>
+<div class="line"><a name="l18408"></a><span class="lineno">18408</span>&#160;    <span class="keywordflow">return</span> (*pMemoryTypeIndex != UINT32_MAX) ? VK_SUCCESS : VK_ERROR_FEATURE_NOT_PRESENT;</div>
+<div class="line"><a name="l18409"></a><span class="lineno">18409</span>&#160;}</div>
 <div class="line"><a name="l18410"></a><span class="lineno">18410</span>&#160; </div>
-<div class="line"><a name="l18411"></a><span class="lineno">18411</span>&#160;    <span class="keywordflow">return</span> res;</div>
-<div class="line"><a name="l18412"></a><span class="lineno">18412</span>&#160;}</div>
-<div class="line"><a name="l18413"></a><span class="lineno">18413</span>&#160; </div>
-<div class="line"><a name="l18414"></a><span class="lineno">18414</span>&#160;VMA_CALL_PRE <span class="keywordtype">void</span> VMA_CALL_POST <a class="code" href="vk__mem__alloc_8h.html#a9bc268595cb33f6ec4d519cfce81ff45">vmaUnmapMemory</a>(</div>
-<div class="line"><a name="l18415"></a><span class="lineno">18415</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div>
-<div class="line"><a name="l18416"></a><span class="lineno">18416</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation)</div>
-<div class="line"><a name="l18417"></a><span class="lineno">18417</span>&#160;{</div>
-<div class="line"><a name="l18418"></a><span class="lineno">18418</span>&#160;    VMA_ASSERT(allocator &amp;&amp; allocation);</div>
-<div class="line"><a name="l18419"></a><span class="lineno">18419</span>&#160; </div>
-<div class="line"><a name="l18420"></a><span class="lineno">18420</span>&#160;    VMA_DEBUG_GLOBAL_MUTEX_LOCK</div>
+<div class="line"><a name="l18411"></a><span class="lineno">18411</span>&#160;VMA_CALL_PRE VkResult VMA_CALL_POST <a class="code" href="vk__mem__alloc_8h.html#ae790ab9ffaf7667fb8f62523e6897888">vmaFindMemoryTypeIndexForBufferInfo</a>(</div>
+<div class="line"><a name="l18412"></a><span class="lineno">18412</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div>
+<div class="line"><a name="l18413"></a><span class="lineno">18413</span>&#160;    <span class="keyword">const</span> VkBufferCreateInfo* pBufferCreateInfo,</div>
+<div class="line"><a name="l18414"></a><span class="lineno">18414</span>&#160;    <span class="keyword">const</span> <a class="code" href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a>* pAllocationCreateInfo,</div>
+<div class="line"><a name="l18415"></a><span class="lineno">18415</span>&#160;    uint32_t* pMemoryTypeIndex)</div>
+<div class="line"><a name="l18416"></a><span class="lineno">18416</span>&#160;{</div>
+<div class="line"><a name="l18417"></a><span class="lineno">18417</span>&#160;    VMA_ASSERT(allocator != VK_NULL_HANDLE);</div>
+<div class="line"><a name="l18418"></a><span class="lineno">18418</span>&#160;    VMA_ASSERT(pBufferCreateInfo != VMA_NULL);</div>
+<div class="line"><a name="l18419"></a><span class="lineno">18419</span>&#160;    VMA_ASSERT(pAllocationCreateInfo != VMA_NULL);</div>
+<div class="line"><a name="l18420"></a><span class="lineno">18420</span>&#160;    VMA_ASSERT(pMemoryTypeIndex != VMA_NULL);</div>
 <div class="line"><a name="l18421"></a><span class="lineno">18421</span>&#160; </div>
-<div class="line"><a name="l18422"></a><span class="lineno">18422</span>&#160;<span class="preprocessor">#if VMA_RECORDING_ENABLED</span></div>
-<div class="line"><a name="l18423"></a><span class="lineno">18423</span>&#160;    <span class="keywordflow">if</span>(allocator-&gt;GetRecorder() != VMA_NULL)</div>
-<div class="line"><a name="l18424"></a><span class="lineno">18424</span>&#160;    {</div>
-<div class="line"><a name="l18425"></a><span class="lineno">18425</span>&#160;        allocator-&gt;GetRecorder()-&gt;RecordUnmapMemory(</div>
-<div class="line"><a name="l18426"></a><span class="lineno">18426</span>&#160;            allocator-&gt;GetCurrentFrameIndex(),</div>
-<div class="line"><a name="l18427"></a><span class="lineno">18427</span>&#160;            allocation);</div>
-<div class="line"><a name="l18428"></a><span class="lineno">18428</span>&#160;    }</div>
-<div class="line"><a name="l18429"></a><span class="lineno">18429</span>&#160;<span class="preprocessor">#endif</span></div>
-<div class="line"><a name="l18430"></a><span class="lineno">18430</span>&#160; </div>
-<div class="line"><a name="l18431"></a><span class="lineno">18431</span>&#160;    allocator-&gt;Unmap(allocation);</div>
-<div class="line"><a name="l18432"></a><span class="lineno">18432</span>&#160;}</div>
-<div class="line"><a name="l18433"></a><span class="lineno">18433</span>&#160; </div>
-<div class="line"><a name="l18434"></a><span class="lineno">18434</span>&#160;VMA_CALL_PRE VkResult VMA_CALL_POST <a class="code" href="vk__mem__alloc_8h.html#a30c37c1eec6025f397be41644f48490f">vmaFlushAllocation</a>(<a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator, <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation, VkDeviceSize offset, VkDeviceSize size)</div>
-<div class="line"><a name="l18435"></a><span class="lineno">18435</span>&#160;{</div>
-<div class="line"><a name="l18436"></a><span class="lineno">18436</span>&#160;    VMA_ASSERT(allocator &amp;&amp; allocation);</div>
+<div class="line"><a name="l18422"></a><span class="lineno">18422</span>&#160;    <span class="keyword">const</span> VkDevice hDev = allocator-&gt;m_hDevice;</div>
+<div class="line"><a name="l18423"></a><span class="lineno">18423</span>&#160;    VkBuffer hBuffer = VK_NULL_HANDLE;</div>
+<div class="line"><a name="l18424"></a><span class="lineno">18424</span>&#160;    VkResult res = allocator-&gt;GetVulkanFunctions().vkCreateBuffer(</div>
+<div class="line"><a name="l18425"></a><span class="lineno">18425</span>&#160;        hDev, pBufferCreateInfo, allocator-&gt;GetAllocationCallbacks(), &amp;hBuffer);</div>
+<div class="line"><a name="l18426"></a><span class="lineno">18426</span>&#160;    <span class="keywordflow">if</span>(res == VK_SUCCESS)</div>
+<div class="line"><a name="l18427"></a><span class="lineno">18427</span>&#160;    {</div>
+<div class="line"><a name="l18428"></a><span class="lineno">18428</span>&#160;        VkMemoryRequirements memReq = {};</div>
+<div class="line"><a name="l18429"></a><span class="lineno">18429</span>&#160;        allocator-&gt;GetVulkanFunctions().vkGetBufferMemoryRequirements(</div>
+<div class="line"><a name="l18430"></a><span class="lineno">18430</span>&#160;            hDev, hBuffer, &amp;memReq);</div>
+<div class="line"><a name="l18431"></a><span class="lineno">18431</span>&#160; </div>
+<div class="line"><a name="l18432"></a><span class="lineno">18432</span>&#160;        res = <a class="code" href="vk__mem__alloc_8h.html#aef15a94b58fbcb0fe706d5720e84a74a">vmaFindMemoryTypeIndex</a>(</div>
+<div class="line"><a name="l18433"></a><span class="lineno">18433</span>&#160;            allocator,</div>
+<div class="line"><a name="l18434"></a><span class="lineno">18434</span>&#160;            memReq.memoryTypeBits,</div>
+<div class="line"><a name="l18435"></a><span class="lineno">18435</span>&#160;            pAllocationCreateInfo,</div>
+<div class="line"><a name="l18436"></a><span class="lineno">18436</span>&#160;            pMemoryTypeIndex);</div>
 <div class="line"><a name="l18437"></a><span class="lineno">18437</span>&#160; </div>
-<div class="line"><a name="l18438"></a><span class="lineno">18438</span>&#160;    VMA_DEBUG_LOG(<span class="stringliteral">&quot;vmaFlushAllocation&quot;</span>);</div>
-<div class="line"><a name="l18439"></a><span class="lineno">18439</span>&#160; </div>
-<div class="line"><a name="l18440"></a><span class="lineno">18440</span>&#160;    VMA_DEBUG_GLOBAL_MUTEX_LOCK</div>
-<div class="line"><a name="l18441"></a><span class="lineno">18441</span>&#160; </div>
-<div class="line"><a name="l18442"></a><span class="lineno">18442</span>&#160;    <span class="keyword">const</span> VkResult res = allocator-&gt;FlushOrInvalidateAllocation(allocation, offset, size, VMA_CACHE_FLUSH);</div>
+<div class="line"><a name="l18438"></a><span class="lineno">18438</span>&#160;        allocator-&gt;GetVulkanFunctions().vkDestroyBuffer(</div>
+<div class="line"><a name="l18439"></a><span class="lineno">18439</span>&#160;            hDev, hBuffer, allocator-&gt;GetAllocationCallbacks());</div>
+<div class="line"><a name="l18440"></a><span class="lineno">18440</span>&#160;    }</div>
+<div class="line"><a name="l18441"></a><span class="lineno">18441</span>&#160;    <span class="keywordflow">return</span> res;</div>
+<div class="line"><a name="l18442"></a><span class="lineno">18442</span>&#160;}</div>
 <div class="line"><a name="l18443"></a><span class="lineno">18443</span>&#160; </div>
-<div class="line"><a name="l18444"></a><span class="lineno">18444</span>&#160;<span class="preprocessor">#if VMA_RECORDING_ENABLED</span></div>
-<div class="line"><a name="l18445"></a><span class="lineno">18445</span>&#160;    <span class="keywordflow">if</span>(allocator-&gt;GetRecorder() != VMA_NULL)</div>
-<div class="line"><a name="l18446"></a><span class="lineno">18446</span>&#160;    {</div>
-<div class="line"><a name="l18447"></a><span class="lineno">18447</span>&#160;        allocator-&gt;GetRecorder()-&gt;RecordFlushAllocation(</div>
-<div class="line"><a name="l18448"></a><span class="lineno">18448</span>&#160;            allocator-&gt;GetCurrentFrameIndex(),</div>
-<div class="line"><a name="l18449"></a><span class="lineno">18449</span>&#160;            allocation, offset, size);</div>
-<div class="line"><a name="l18450"></a><span class="lineno">18450</span>&#160;    }</div>
-<div class="line"><a name="l18451"></a><span class="lineno">18451</span>&#160;<span class="preprocessor">#endif</span></div>
-<div class="line"><a name="l18452"></a><span class="lineno">18452</span>&#160; </div>
-<div class="line"><a name="l18453"></a><span class="lineno">18453</span>&#160;    <span class="keywordflow">return</span> res;</div>
-<div class="line"><a name="l18454"></a><span class="lineno">18454</span>&#160;}</div>
-<div class="line"><a name="l18455"></a><span class="lineno">18455</span>&#160; </div>
-<div class="line"><a name="l18456"></a><span class="lineno">18456</span>&#160;VMA_CALL_PRE VkResult VMA_CALL_POST <a class="code" href="vk__mem__alloc_8h.html#aaa8412919139ef413a4215ac6a290fae">vmaInvalidateAllocation</a>(<a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator, <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation, VkDeviceSize offset, VkDeviceSize size)</div>
-<div class="line"><a name="l18457"></a><span class="lineno">18457</span>&#160;{</div>
-<div class="line"><a name="l18458"></a><span class="lineno">18458</span>&#160;    VMA_ASSERT(allocator &amp;&amp; allocation);</div>
-<div class="line"><a name="l18459"></a><span class="lineno">18459</span>&#160; </div>
-<div class="line"><a name="l18460"></a><span class="lineno">18460</span>&#160;    VMA_DEBUG_LOG(<span class="stringliteral">&quot;vmaInvalidateAllocation&quot;</span>);</div>
-<div class="line"><a name="l18461"></a><span class="lineno">18461</span>&#160; </div>
-<div class="line"><a name="l18462"></a><span class="lineno">18462</span>&#160;    VMA_DEBUG_GLOBAL_MUTEX_LOCK</div>
-<div class="line"><a name="l18463"></a><span class="lineno">18463</span>&#160; </div>
-<div class="line"><a name="l18464"></a><span class="lineno">18464</span>&#160;    <span class="keyword">const</span> VkResult res = allocator-&gt;FlushOrInvalidateAllocation(allocation, offset, size, VMA_CACHE_INVALIDATE);</div>
-<div class="line"><a name="l18465"></a><span class="lineno">18465</span>&#160; </div>
-<div class="line"><a name="l18466"></a><span class="lineno">18466</span>&#160;<span class="preprocessor">#if VMA_RECORDING_ENABLED</span></div>
-<div class="line"><a name="l18467"></a><span class="lineno">18467</span>&#160;    <span class="keywordflow">if</span>(allocator-&gt;GetRecorder() != VMA_NULL)</div>
-<div class="line"><a name="l18468"></a><span class="lineno">18468</span>&#160;    {</div>
-<div class="line"><a name="l18469"></a><span class="lineno">18469</span>&#160;        allocator-&gt;GetRecorder()-&gt;RecordInvalidateAllocation(</div>
-<div class="line"><a name="l18470"></a><span class="lineno">18470</span>&#160;            allocator-&gt;GetCurrentFrameIndex(),</div>
-<div class="line"><a name="l18471"></a><span class="lineno">18471</span>&#160;            allocation, offset, size);</div>
-<div class="line"><a name="l18472"></a><span class="lineno">18472</span>&#160;    }</div>
-<div class="line"><a name="l18473"></a><span class="lineno">18473</span>&#160;<span class="preprocessor">#endif</span></div>
-<div class="line"><a name="l18474"></a><span class="lineno">18474</span>&#160; </div>
-<div class="line"><a name="l18475"></a><span class="lineno">18475</span>&#160;    <span class="keywordflow">return</span> res;</div>
-<div class="line"><a name="l18476"></a><span class="lineno">18476</span>&#160;}</div>
-<div class="line"><a name="l18477"></a><span class="lineno">18477</span>&#160; </div>
-<div class="line"><a name="l18478"></a><span class="lineno">18478</span>&#160;VMA_CALL_PRE VkResult VMA_CALL_POST <a class="code" href="vk__mem__alloc_8h.html#ac3dd00da721875ed99fa8a881922bdfc">vmaFlushAllocations</a>(</div>
-<div class="line"><a name="l18479"></a><span class="lineno">18479</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div>
-<div class="line"><a name="l18480"></a><span class="lineno">18480</span>&#160;    uint32_t allocationCount,</div>
-<div class="line"><a name="l18481"></a><span class="lineno">18481</span>&#160;    <span class="keyword">const</span> <a class="code" href="struct_vma_allocation.html">VmaAllocation</a>* allocations,</div>
-<div class="line"><a name="l18482"></a><span class="lineno">18482</span>&#160;    <span class="keyword">const</span> VkDeviceSize* offsets,</div>
-<div class="line"><a name="l18483"></a><span class="lineno">18483</span>&#160;    <span class="keyword">const</span> VkDeviceSize* sizes)</div>
-<div class="line"><a name="l18484"></a><span class="lineno">18484</span>&#160;{</div>
-<div class="line"><a name="l18485"></a><span class="lineno">18485</span>&#160;    VMA_ASSERT(allocator);</div>
-<div class="line"><a name="l18486"></a><span class="lineno">18486</span>&#160; </div>
-<div class="line"><a name="l18487"></a><span class="lineno">18487</span>&#160;    <span class="keywordflow">if</span>(allocationCount == 0)</div>
-<div class="line"><a name="l18488"></a><span class="lineno">18488</span>&#160;    {</div>
-<div class="line"><a name="l18489"></a><span class="lineno">18489</span>&#160;        <span class="keywordflow">return</span> VK_SUCCESS;</div>
-<div class="line"><a name="l18490"></a><span class="lineno">18490</span>&#160;    }</div>
-<div class="line"><a name="l18491"></a><span class="lineno">18491</span>&#160; </div>
-<div class="line"><a name="l18492"></a><span class="lineno">18492</span>&#160;    VMA_ASSERT(allocations);</div>
-<div class="line"><a name="l18493"></a><span class="lineno">18493</span>&#160; </div>
-<div class="line"><a name="l18494"></a><span class="lineno">18494</span>&#160;    VMA_DEBUG_LOG(<span class="stringliteral">&quot;vmaFlushAllocations&quot;</span>);</div>
-<div class="line"><a name="l18495"></a><span class="lineno">18495</span>&#160; </div>
-<div class="line"><a name="l18496"></a><span class="lineno">18496</span>&#160;    VMA_DEBUG_GLOBAL_MUTEX_LOCK</div>
-<div class="line"><a name="l18497"></a><span class="lineno">18497</span>&#160; </div>
-<div class="line"><a name="l18498"></a><span class="lineno">18498</span>&#160;    <span class="keyword">const</span> VkResult res = allocator-&gt;FlushOrInvalidateAllocations(allocationCount, allocations, offsets, sizes, VMA_CACHE_FLUSH);</div>
+<div class="line"><a name="l18444"></a><span class="lineno">18444</span>&#160;VMA_CALL_PRE VkResult VMA_CALL_POST <a class="code" href="vk__mem__alloc_8h.html#a088da83d8eaf3ce9056d9ea0b981d472">vmaFindMemoryTypeIndexForImageInfo</a>(</div>
+<div class="line"><a name="l18445"></a><span class="lineno">18445</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div>
+<div class="line"><a name="l18446"></a><span class="lineno">18446</span>&#160;    <span class="keyword">const</span> VkImageCreateInfo* pImageCreateInfo,</div>
+<div class="line"><a name="l18447"></a><span class="lineno">18447</span>&#160;    <span class="keyword">const</span> <a class="code" href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a>* pAllocationCreateInfo,</div>
+<div class="line"><a name="l18448"></a><span class="lineno">18448</span>&#160;    uint32_t* pMemoryTypeIndex)</div>
+<div class="line"><a name="l18449"></a><span class="lineno">18449</span>&#160;{</div>
+<div class="line"><a name="l18450"></a><span class="lineno">18450</span>&#160;    VMA_ASSERT(allocator != VK_NULL_HANDLE);</div>
+<div class="line"><a name="l18451"></a><span class="lineno">18451</span>&#160;    VMA_ASSERT(pImageCreateInfo != VMA_NULL);</div>
+<div class="line"><a name="l18452"></a><span class="lineno">18452</span>&#160;    VMA_ASSERT(pAllocationCreateInfo != VMA_NULL);</div>
+<div class="line"><a name="l18453"></a><span class="lineno">18453</span>&#160;    VMA_ASSERT(pMemoryTypeIndex != VMA_NULL);</div>
+<div class="line"><a name="l18454"></a><span class="lineno">18454</span>&#160; </div>
+<div class="line"><a name="l18455"></a><span class="lineno">18455</span>&#160;    <span class="keyword">const</span> VkDevice hDev = allocator-&gt;m_hDevice;</div>
+<div class="line"><a name="l18456"></a><span class="lineno">18456</span>&#160;    VkImage hImage = VK_NULL_HANDLE;</div>
+<div class="line"><a name="l18457"></a><span class="lineno">18457</span>&#160;    VkResult res = allocator-&gt;GetVulkanFunctions().vkCreateImage(</div>
+<div class="line"><a name="l18458"></a><span class="lineno">18458</span>&#160;        hDev, pImageCreateInfo, allocator-&gt;GetAllocationCallbacks(), &amp;hImage);</div>
+<div class="line"><a name="l18459"></a><span class="lineno">18459</span>&#160;    <span class="keywordflow">if</span>(res == VK_SUCCESS)</div>
+<div class="line"><a name="l18460"></a><span class="lineno">18460</span>&#160;    {</div>
+<div class="line"><a name="l18461"></a><span class="lineno">18461</span>&#160;        VkMemoryRequirements memReq = {};</div>
+<div class="line"><a name="l18462"></a><span class="lineno">18462</span>&#160;        allocator-&gt;GetVulkanFunctions().vkGetImageMemoryRequirements(</div>
+<div class="line"><a name="l18463"></a><span class="lineno">18463</span>&#160;            hDev, hImage, &amp;memReq);</div>
+<div class="line"><a name="l18464"></a><span class="lineno">18464</span>&#160; </div>
+<div class="line"><a name="l18465"></a><span class="lineno">18465</span>&#160;        res = <a class="code" href="vk__mem__alloc_8h.html#aef15a94b58fbcb0fe706d5720e84a74a">vmaFindMemoryTypeIndex</a>(</div>
+<div class="line"><a name="l18466"></a><span class="lineno">18466</span>&#160;            allocator,</div>
+<div class="line"><a name="l18467"></a><span class="lineno">18467</span>&#160;            memReq.memoryTypeBits,</div>
+<div class="line"><a name="l18468"></a><span class="lineno">18468</span>&#160;            pAllocationCreateInfo,</div>
+<div class="line"><a name="l18469"></a><span class="lineno">18469</span>&#160;            pMemoryTypeIndex);</div>
+<div class="line"><a name="l18470"></a><span class="lineno">18470</span>&#160; </div>
+<div class="line"><a name="l18471"></a><span class="lineno">18471</span>&#160;        allocator-&gt;GetVulkanFunctions().vkDestroyImage(</div>
+<div class="line"><a name="l18472"></a><span class="lineno">18472</span>&#160;            hDev, hImage, allocator-&gt;GetAllocationCallbacks());</div>
+<div class="line"><a name="l18473"></a><span class="lineno">18473</span>&#160;    }</div>
+<div class="line"><a name="l18474"></a><span class="lineno">18474</span>&#160;    <span class="keywordflow">return</span> res;</div>
+<div class="line"><a name="l18475"></a><span class="lineno">18475</span>&#160;}</div>
+<div class="line"><a name="l18476"></a><span class="lineno">18476</span>&#160; </div>
+<div class="line"><a name="l18477"></a><span class="lineno">18477</span>&#160;VMA_CALL_PRE VkResult VMA_CALL_POST <a class="code" href="vk__mem__alloc_8h.html#a5c8770ded7c59c8caac6de0c2cb00b50">vmaCreatePool</a>(</div>
+<div class="line"><a name="l18478"></a><span class="lineno">18478</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div>
+<div class="line"><a name="l18479"></a><span class="lineno">18479</span>&#160;    <span class="keyword">const</span> <a class="code" href="struct_vma_pool_create_info.html">VmaPoolCreateInfo</a>* pCreateInfo,</div>
+<div class="line"><a name="l18480"></a><span class="lineno">18480</span>&#160;    <a class="code" href="struct_vma_pool.html">VmaPool</a>* pPool)</div>
+<div class="line"><a name="l18481"></a><span class="lineno">18481</span>&#160;{</div>
+<div class="line"><a name="l18482"></a><span class="lineno">18482</span>&#160;    VMA_ASSERT(allocator &amp;&amp; pCreateInfo &amp;&amp; pPool);</div>
+<div class="line"><a name="l18483"></a><span class="lineno">18483</span>&#160; </div>
+<div class="line"><a name="l18484"></a><span class="lineno">18484</span>&#160;    VMA_DEBUG_LOG(<span class="stringliteral">&quot;vmaCreatePool&quot;</span>);</div>
+<div class="line"><a name="l18485"></a><span class="lineno">18485</span>&#160; </div>
+<div class="line"><a name="l18486"></a><span class="lineno">18486</span>&#160;    VMA_DEBUG_GLOBAL_MUTEX_LOCK</div>
+<div class="line"><a name="l18487"></a><span class="lineno">18487</span>&#160; </div>
+<div class="line"><a name="l18488"></a><span class="lineno">18488</span>&#160;    VkResult res = allocator-&gt;CreatePool(pCreateInfo, pPool);</div>
+<div class="line"><a name="l18489"></a><span class="lineno">18489</span>&#160; </div>
+<div class="line"><a name="l18490"></a><span class="lineno">18490</span>&#160;<span class="preprocessor">#if VMA_RECORDING_ENABLED</span></div>
+<div class="line"><a name="l18491"></a><span class="lineno">18491</span>&#160;    <span class="keywordflow">if</span>(allocator-&gt;GetRecorder() != VMA_NULL)</div>
+<div class="line"><a name="l18492"></a><span class="lineno">18492</span>&#160;    {</div>
+<div class="line"><a name="l18493"></a><span class="lineno">18493</span>&#160;        allocator-&gt;GetRecorder()-&gt;RecordCreatePool(allocator-&gt;GetCurrentFrameIndex(), *pCreateInfo, *pPool);</div>
+<div class="line"><a name="l18494"></a><span class="lineno">18494</span>&#160;    }</div>
+<div class="line"><a name="l18495"></a><span class="lineno">18495</span>&#160;<span class="preprocessor">#endif</span></div>
+<div class="line"><a name="l18496"></a><span class="lineno">18496</span>&#160; </div>
+<div class="line"><a name="l18497"></a><span class="lineno">18497</span>&#160;    <span class="keywordflow">return</span> res;</div>
+<div class="line"><a name="l18498"></a><span class="lineno">18498</span>&#160;}</div>
 <div class="line"><a name="l18499"></a><span class="lineno">18499</span>&#160; </div>
-<div class="line"><a name="l18500"></a><span class="lineno">18500</span>&#160;<span class="preprocessor">#if VMA_RECORDING_ENABLED</span></div>
-<div class="line"><a name="l18501"></a><span class="lineno">18501</span>&#160;    <span class="keywordflow">if</span>(allocator-&gt;GetRecorder() != VMA_NULL)</div>
-<div class="line"><a name="l18502"></a><span class="lineno">18502</span>&#160;    {</div>
-<div class="line"><a name="l18503"></a><span class="lineno">18503</span>&#160;        <span class="comment">//TODO</span></div>
-<div class="line"><a name="l18504"></a><span class="lineno">18504</span>&#160;    }</div>
-<div class="line"><a name="l18505"></a><span class="lineno">18505</span>&#160;<span class="preprocessor">#endif</span></div>
-<div class="line"><a name="l18506"></a><span class="lineno">18506</span>&#160; </div>
-<div class="line"><a name="l18507"></a><span class="lineno">18507</span>&#160;    <span class="keywordflow">return</span> res;</div>
-<div class="line"><a name="l18508"></a><span class="lineno">18508</span>&#160;}</div>
-<div class="line"><a name="l18509"></a><span class="lineno">18509</span>&#160; </div>
-<div class="line"><a name="l18510"></a><span class="lineno">18510</span>&#160;VMA_CALL_PRE VkResult VMA_CALL_POST <a class="code" href="vk__mem__alloc_8h.html#ab25b558d75f7378ec944a1522fdcc3c5">vmaInvalidateAllocations</a>(</div>
-<div class="line"><a name="l18511"></a><span class="lineno">18511</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div>
-<div class="line"><a name="l18512"></a><span class="lineno">18512</span>&#160;    uint32_t allocationCount,</div>
-<div class="line"><a name="l18513"></a><span class="lineno">18513</span>&#160;    <span class="keyword">const</span> <a class="code" href="struct_vma_allocation.html">VmaAllocation</a>* allocations,</div>
-<div class="line"><a name="l18514"></a><span class="lineno">18514</span>&#160;    <span class="keyword">const</span> VkDeviceSize* offsets,</div>
-<div class="line"><a name="l18515"></a><span class="lineno">18515</span>&#160;    <span class="keyword">const</span> VkDeviceSize* sizes)</div>
-<div class="line"><a name="l18516"></a><span class="lineno">18516</span>&#160;{</div>
-<div class="line"><a name="l18517"></a><span class="lineno">18517</span>&#160;    VMA_ASSERT(allocator);</div>
-<div class="line"><a name="l18518"></a><span class="lineno">18518</span>&#160; </div>
-<div class="line"><a name="l18519"></a><span class="lineno">18519</span>&#160;    <span class="keywordflow">if</span>(allocationCount == 0)</div>
-<div class="line"><a name="l18520"></a><span class="lineno">18520</span>&#160;    {</div>
-<div class="line"><a name="l18521"></a><span class="lineno">18521</span>&#160;        <span class="keywordflow">return</span> VK_SUCCESS;</div>
-<div class="line"><a name="l18522"></a><span class="lineno">18522</span>&#160;    }</div>
-<div class="line"><a name="l18523"></a><span class="lineno">18523</span>&#160; </div>
-<div class="line"><a name="l18524"></a><span class="lineno">18524</span>&#160;    VMA_ASSERT(allocations);</div>
-<div class="line"><a name="l18525"></a><span class="lineno">18525</span>&#160; </div>
-<div class="line"><a name="l18526"></a><span class="lineno">18526</span>&#160;    VMA_DEBUG_LOG(<span class="stringliteral">&quot;vmaInvalidateAllocations&quot;</span>);</div>
-<div class="line"><a name="l18527"></a><span class="lineno">18527</span>&#160; </div>
-<div class="line"><a name="l18528"></a><span class="lineno">18528</span>&#160;    VMA_DEBUG_GLOBAL_MUTEX_LOCK</div>
-<div class="line"><a name="l18529"></a><span class="lineno">18529</span>&#160; </div>
-<div class="line"><a name="l18530"></a><span class="lineno">18530</span>&#160;    <span class="keyword">const</span> VkResult res = allocator-&gt;FlushOrInvalidateAllocations(allocationCount, allocations, offsets, sizes, VMA_CACHE_INVALIDATE);</div>
+<div class="line"><a name="l18500"></a><span class="lineno">18500</span>&#160;VMA_CALL_PRE <span class="keywordtype">void</span> VMA_CALL_POST <a class="code" href="vk__mem__alloc_8h.html#a5485779c8f1948238fc4e92232fa65e1">vmaDestroyPool</a>(</div>
+<div class="line"><a name="l18501"></a><span class="lineno">18501</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div>
+<div class="line"><a name="l18502"></a><span class="lineno">18502</span>&#160;    <a class="code" href="struct_vma_pool.html">VmaPool</a> pool)</div>
+<div class="line"><a name="l18503"></a><span class="lineno">18503</span>&#160;{</div>
+<div class="line"><a name="l18504"></a><span class="lineno">18504</span>&#160;    VMA_ASSERT(allocator);</div>
+<div class="line"><a name="l18505"></a><span class="lineno">18505</span>&#160; </div>
+<div class="line"><a name="l18506"></a><span class="lineno">18506</span>&#160;    <span class="keywordflow">if</span>(pool == VK_NULL_HANDLE)</div>
+<div class="line"><a name="l18507"></a><span class="lineno">18507</span>&#160;    {</div>
+<div class="line"><a name="l18508"></a><span class="lineno">18508</span>&#160;        <span class="keywordflow">return</span>;</div>
+<div class="line"><a name="l18509"></a><span class="lineno">18509</span>&#160;    }</div>
+<div class="line"><a name="l18510"></a><span class="lineno">18510</span>&#160; </div>
+<div class="line"><a name="l18511"></a><span class="lineno">18511</span>&#160;    VMA_DEBUG_LOG(<span class="stringliteral">&quot;vmaDestroyPool&quot;</span>);</div>
+<div class="line"><a name="l18512"></a><span class="lineno">18512</span>&#160; </div>
+<div class="line"><a name="l18513"></a><span class="lineno">18513</span>&#160;    VMA_DEBUG_GLOBAL_MUTEX_LOCK</div>
+<div class="line"><a name="l18514"></a><span class="lineno">18514</span>&#160; </div>
+<div class="line"><a name="l18515"></a><span class="lineno">18515</span>&#160;<span class="preprocessor">#if VMA_RECORDING_ENABLED</span></div>
+<div class="line"><a name="l18516"></a><span class="lineno">18516</span>&#160;    <span class="keywordflow">if</span>(allocator-&gt;GetRecorder() != VMA_NULL)</div>
+<div class="line"><a name="l18517"></a><span class="lineno">18517</span>&#160;    {</div>
+<div class="line"><a name="l18518"></a><span class="lineno">18518</span>&#160;        allocator-&gt;GetRecorder()-&gt;RecordDestroyPool(allocator-&gt;GetCurrentFrameIndex(), pool);</div>
+<div class="line"><a name="l18519"></a><span class="lineno">18519</span>&#160;    }</div>
+<div class="line"><a name="l18520"></a><span class="lineno">18520</span>&#160;<span class="preprocessor">#endif</span></div>
+<div class="line"><a name="l18521"></a><span class="lineno">18521</span>&#160; </div>
+<div class="line"><a name="l18522"></a><span class="lineno">18522</span>&#160;    allocator-&gt;DestroyPool(pool);</div>
+<div class="line"><a name="l18523"></a><span class="lineno">18523</span>&#160;}</div>
+<div class="line"><a name="l18524"></a><span class="lineno">18524</span>&#160; </div>
+<div class="line"><a name="l18525"></a><span class="lineno">18525</span>&#160;VMA_CALL_PRE <span class="keywordtype">void</span> VMA_CALL_POST <a class="code" href="vk__mem__alloc_8h.html#ae8bf76997b234ef68aad922616df4153">vmaGetPoolStats</a>(</div>
+<div class="line"><a name="l18526"></a><span class="lineno">18526</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div>
+<div class="line"><a name="l18527"></a><span class="lineno">18527</span>&#160;    <a class="code" href="struct_vma_pool.html">VmaPool</a> pool,</div>
+<div class="line"><a name="l18528"></a><span class="lineno">18528</span>&#160;    <a class="code" href="struct_vma_pool_stats.html">VmaPoolStats</a>* pPoolStats)</div>
+<div class="line"><a name="l18529"></a><span class="lineno">18529</span>&#160;{</div>
+<div class="line"><a name="l18530"></a><span class="lineno">18530</span>&#160;    VMA_ASSERT(allocator &amp;&amp; pool &amp;&amp; pPoolStats);</div>
 <div class="line"><a name="l18531"></a><span class="lineno">18531</span>&#160; </div>
-<div class="line"><a name="l18532"></a><span class="lineno">18532</span>&#160;<span class="preprocessor">#if VMA_RECORDING_ENABLED</span></div>
-<div class="line"><a name="l18533"></a><span class="lineno">18533</span>&#160;    <span class="keywordflow">if</span>(allocator-&gt;GetRecorder() != VMA_NULL)</div>
-<div class="line"><a name="l18534"></a><span class="lineno">18534</span>&#160;    {</div>
-<div class="line"><a name="l18535"></a><span class="lineno">18535</span>&#160;        <span class="comment">//TODO</span></div>
-<div class="line"><a name="l18536"></a><span class="lineno">18536</span>&#160;    }</div>
-<div class="line"><a name="l18537"></a><span class="lineno">18537</span>&#160;<span class="preprocessor">#endif</span></div>
-<div class="line"><a name="l18538"></a><span class="lineno">18538</span>&#160; </div>
-<div class="line"><a name="l18539"></a><span class="lineno">18539</span>&#160;    <span class="keywordflow">return</span> res;</div>
-<div class="line"><a name="l18540"></a><span class="lineno">18540</span>&#160;}</div>
-<div class="line"><a name="l18541"></a><span class="lineno">18541</span>&#160; </div>
-<div class="line"><a name="l18542"></a><span class="lineno">18542</span>&#160;VMA_CALL_PRE VkResult VMA_CALL_POST <a class="code" href="vk__mem__alloc_8h.html#a49329a7f030dafcf82f7b73334c22e98">vmaCheckCorruption</a>(<a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator, uint32_t memoryTypeBits)</div>
-<div class="line"><a name="l18543"></a><span class="lineno">18543</span>&#160;{</div>
-<div class="line"><a name="l18544"></a><span class="lineno">18544</span>&#160;    VMA_ASSERT(allocator);</div>
+<div class="line"><a name="l18532"></a><span class="lineno">18532</span>&#160;    VMA_DEBUG_GLOBAL_MUTEX_LOCK</div>
+<div class="line"><a name="l18533"></a><span class="lineno">18533</span>&#160; </div>
+<div class="line"><a name="l18534"></a><span class="lineno">18534</span>&#160;    allocator-&gt;GetPoolStats(pool, pPoolStats);</div>
+<div class="line"><a name="l18535"></a><span class="lineno">18535</span>&#160;}</div>
+<div class="line"><a name="l18536"></a><span class="lineno">18536</span>&#160; </div>
+<div class="line"><a name="l18537"></a><span class="lineno">18537</span>&#160;VMA_CALL_PRE <span class="keywordtype">void</span> VMA_CALL_POST <a class="code" href="vk__mem__alloc_8h.html#a736bd6cbda886f36c891727e73bd4024">vmaMakePoolAllocationsLost</a>(</div>
+<div class="line"><a name="l18538"></a><span class="lineno">18538</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div>
+<div class="line"><a name="l18539"></a><span class="lineno">18539</span>&#160;    <a class="code" href="struct_vma_pool.html">VmaPool</a> pool,</div>
+<div class="line"><a name="l18540"></a><span class="lineno">18540</span>&#160;    <span class="keywordtype">size_t</span>* pLostAllocationCount)</div>
+<div class="line"><a name="l18541"></a><span class="lineno">18541</span>&#160;{</div>
+<div class="line"><a name="l18542"></a><span class="lineno">18542</span>&#160;    VMA_ASSERT(allocator &amp;&amp; pool);</div>
+<div class="line"><a name="l18543"></a><span class="lineno">18543</span>&#160; </div>
+<div class="line"><a name="l18544"></a><span class="lineno">18544</span>&#160;    VMA_DEBUG_GLOBAL_MUTEX_LOCK</div>
 <div class="line"><a name="l18545"></a><span class="lineno">18545</span>&#160; </div>
-<div class="line"><a name="l18546"></a><span class="lineno">18546</span>&#160;    VMA_DEBUG_LOG(<span class="stringliteral">&quot;vmaCheckCorruption&quot;</span>);</div>
-<div class="line"><a name="l18547"></a><span class="lineno">18547</span>&#160; </div>
-<div class="line"><a name="l18548"></a><span class="lineno">18548</span>&#160;    VMA_DEBUG_GLOBAL_MUTEX_LOCK</div>
-<div class="line"><a name="l18549"></a><span class="lineno">18549</span>&#160; </div>
-<div class="line"><a name="l18550"></a><span class="lineno">18550</span>&#160;    <span class="keywordflow">return</span> allocator-&gt;CheckCorruption(memoryTypeBits);</div>
-<div class="line"><a name="l18551"></a><span class="lineno">18551</span>&#160;}</div>
+<div class="line"><a name="l18546"></a><span class="lineno">18546</span>&#160;<span class="preprocessor">#if VMA_RECORDING_ENABLED</span></div>
+<div class="line"><a name="l18547"></a><span class="lineno">18547</span>&#160;    <span class="keywordflow">if</span>(allocator-&gt;GetRecorder() != VMA_NULL)</div>
+<div class="line"><a name="l18548"></a><span class="lineno">18548</span>&#160;    {</div>
+<div class="line"><a name="l18549"></a><span class="lineno">18549</span>&#160;        allocator-&gt;GetRecorder()-&gt;RecordMakePoolAllocationsLost(allocator-&gt;GetCurrentFrameIndex(), pool);</div>
+<div class="line"><a name="l18550"></a><span class="lineno">18550</span>&#160;    }</div>
+<div class="line"><a name="l18551"></a><span class="lineno">18551</span>&#160;<span class="preprocessor">#endif</span></div>
 <div class="line"><a name="l18552"></a><span class="lineno">18552</span>&#160; </div>
-<div class="line"><a name="l18553"></a><span class="lineno">18553</span>&#160;VMA_CALL_PRE VkResult VMA_CALL_POST <a class="code" href="vk__mem__alloc_8h.html#a9f0f8f56db5f7f57fe4454f465142dac">vmaDefragment</a>(</div>
-<div class="line"><a name="l18554"></a><span class="lineno">18554</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div>
-<div class="line"><a name="l18555"></a><span class="lineno">18555</span>&#160;    <span class="keyword">const</span> <a class="code" href="struct_vma_allocation.html">VmaAllocation</a>* pAllocations,</div>
-<div class="line"><a name="l18556"></a><span class="lineno">18556</span>&#160;    <span class="keywordtype">size_t</span> allocationCount,</div>
-<div class="line"><a name="l18557"></a><span class="lineno">18557</span>&#160;    VkBool32* pAllocationsChanged,</div>
-<div class="line"><a name="l18558"></a><span class="lineno">18558</span>&#160;    <span class="keyword">const</span> <a class="code" href="struct_vma_defragmentation_info.html">VmaDefragmentationInfo</a> *pDefragmentationInfo,</div>
-<div class="line"><a name="l18559"></a><span class="lineno">18559</span>&#160;    <a class="code" href="struct_vma_defragmentation_stats.html">VmaDefragmentationStats</a>* pDefragmentationStats)</div>
-<div class="line"><a name="l18560"></a><span class="lineno">18560</span>&#160;{</div>
-<div class="line"><a name="l18561"></a><span class="lineno">18561</span>&#160;    <span class="comment">// Deprecated interface, reimplemented using new one.</span></div>
-<div class="line"><a name="l18562"></a><span class="lineno">18562</span>&#160; </div>
-<div class="line"><a name="l18563"></a><span class="lineno">18563</span>&#160;    <a class="code" href="struct_vma_defragmentation_info2.html">VmaDefragmentationInfo2</a> info2 = {};</div>
-<div class="line"><a name="l18564"></a><span class="lineno">18564</span>&#160;    info2.<a class="code" href="struct_vma_defragmentation_info2.html#a3cf86ab32c1da779b4923d301a3056ba">allocationCount</a> = (uint32_t)allocationCount;</div>
-<div class="line"><a name="l18565"></a><span class="lineno">18565</span>&#160;    info2.<a class="code" href="struct_vma_defragmentation_info2.html#ab6d288f29d028156cf73542d630a2e32">pAllocations</a> = pAllocations;</div>
-<div class="line"><a name="l18566"></a><span class="lineno">18566</span>&#160;    info2.<a class="code" href="struct_vma_defragmentation_info2.html#a76d51a644dc7f5405d0cdd0025ecd0cc">pAllocationsChanged</a> = pAllocationsChanged;</div>
-<div class="line"><a name="l18567"></a><span class="lineno">18567</span>&#160;    <span class="keywordflow">if</span>(pDefragmentationInfo != VMA_NULL)</div>
-<div class="line"><a name="l18568"></a><span class="lineno">18568</span>&#160;    {</div>
-<div class="line"><a name="l18569"></a><span class="lineno">18569</span>&#160;        info2.<a class="code" href="struct_vma_defragmentation_info2.html#a94c2c7223d52878445a8cccce396b671">maxCpuAllocationsToMove</a> = pDefragmentationInfo-&gt;<a class="code" href="struct_vma_defragmentation_info.html#aa7c7304e13c71f604c907196c4e28fbc">maxAllocationsToMove</a>;</div>
-<div class="line"><a name="l18570"></a><span class="lineno">18570</span>&#160;        info2.<a class="code" href="struct_vma_defragmentation_info2.html#af78e1ea40c22d85137b65f6b384a4d0a">maxCpuBytesToMove</a> = pDefragmentationInfo-&gt;<a class="code" href="struct_vma_defragmentation_info.html#acb311c940a777270e67e1b81c5ab6a1d">maxBytesToMove</a>;</div>
-<div class="line"><a name="l18571"></a><span class="lineno">18571</span>&#160;    }</div>
-<div class="line"><a name="l18572"></a><span class="lineno">18572</span>&#160;    <span class="keywordflow">else</span></div>
-<div class="line"><a name="l18573"></a><span class="lineno">18573</span>&#160;    {</div>
-<div class="line"><a name="l18574"></a><span class="lineno">18574</span>&#160;        info2.<a class="code" href="struct_vma_defragmentation_info2.html#a94c2c7223d52878445a8cccce396b671">maxCpuAllocationsToMove</a> = UINT32_MAX;</div>
-<div class="line"><a name="l18575"></a><span class="lineno">18575</span>&#160;        info2.<a class="code" href="struct_vma_defragmentation_info2.html#af78e1ea40c22d85137b65f6b384a4d0a">maxCpuBytesToMove</a> = VK_WHOLE_SIZE;</div>
-<div class="line"><a name="l18576"></a><span class="lineno">18576</span>&#160;    }</div>
-<div class="line"><a name="l18577"></a><span class="lineno">18577</span>&#160;    <span class="comment">// info2.flags, maxGpuAllocationsToMove, maxGpuBytesToMove, commandBuffer deliberately left zero.</span></div>
-<div class="line"><a name="l18578"></a><span class="lineno">18578</span>&#160; </div>
-<div class="line"><a name="l18579"></a><span class="lineno">18579</span>&#160;    <a class="code" href="struct_vma_defragmentation_context.html">VmaDefragmentationContext</a> ctx;</div>
-<div class="line"><a name="l18580"></a><span class="lineno">18580</span>&#160;    VkResult res = <a class="code" href="vk__mem__alloc_8h.html#a36ba776fd7fd5cb1e9359fdc0d8e6e8a">vmaDefragmentationBegin</a>(allocator, &amp;info2, pDefragmentationStats, &amp;ctx);</div>
-<div class="line"><a name="l18581"></a><span class="lineno">18581</span>&#160;    <span class="keywordflow">if</span>(res == VK_NOT_READY)</div>
-<div class="line"><a name="l18582"></a><span class="lineno">18582</span>&#160;    {</div>
-<div class="line"><a name="l18583"></a><span class="lineno">18583</span>&#160;        res = <a class="code" href="vk__mem__alloc_8h.html#a8774e20e91e245aae959ba63efa15dd2">vmaDefragmentationEnd</a>( allocator, ctx);</div>
-<div class="line"><a name="l18584"></a><span class="lineno">18584</span>&#160;    }</div>
-<div class="line"><a name="l18585"></a><span class="lineno">18585</span>&#160;    <span class="keywordflow">return</span> res;</div>
-<div class="line"><a name="l18586"></a><span class="lineno">18586</span>&#160;}</div>
+<div class="line"><a name="l18553"></a><span class="lineno">18553</span>&#160;    allocator-&gt;MakePoolAllocationsLost(pool, pLostAllocationCount);</div>
+<div class="line"><a name="l18554"></a><span class="lineno">18554</span>&#160;}</div>
+<div class="line"><a name="l18555"></a><span class="lineno">18555</span>&#160; </div>
+<div class="line"><a name="l18556"></a><span class="lineno">18556</span>&#160;VMA_CALL_PRE VkResult VMA_CALL_POST <a class="code" href="vk__mem__alloc_8h.html#ad535935619c7a549bf837e1bb0068f89">vmaCheckPoolCorruption</a>(<a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator, <a class="code" href="struct_vma_pool.html">VmaPool</a> pool)</div>
+<div class="line"><a name="l18557"></a><span class="lineno">18557</span>&#160;{</div>
+<div class="line"><a name="l18558"></a><span class="lineno">18558</span>&#160;    VMA_ASSERT(allocator &amp;&amp; pool);</div>
+<div class="line"><a name="l18559"></a><span class="lineno">18559</span>&#160; </div>
+<div class="line"><a name="l18560"></a><span class="lineno">18560</span>&#160;    VMA_DEBUG_GLOBAL_MUTEX_LOCK</div>
+<div class="line"><a name="l18561"></a><span class="lineno">18561</span>&#160; </div>
+<div class="line"><a name="l18562"></a><span class="lineno">18562</span>&#160;    VMA_DEBUG_LOG(<span class="stringliteral">&quot;vmaCheckPoolCorruption&quot;</span>);</div>
+<div class="line"><a name="l18563"></a><span class="lineno">18563</span>&#160; </div>
+<div class="line"><a name="l18564"></a><span class="lineno">18564</span>&#160;    <span class="keywordflow">return</span> allocator-&gt;CheckPoolCorruption(pool);</div>
+<div class="line"><a name="l18565"></a><span class="lineno">18565</span>&#160;}</div>
+<div class="line"><a name="l18566"></a><span class="lineno">18566</span>&#160; </div>
+<div class="line"><a name="l18567"></a><span class="lineno">18567</span>&#160;VMA_CALL_PRE <span class="keywordtype">void</span> VMA_CALL_POST <a class="code" href="vk__mem__alloc_8h.html#af09b4e4eafdbee812e8d73ddf960f030">vmaGetPoolName</a>(</div>
+<div class="line"><a name="l18568"></a><span class="lineno">18568</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div>
+<div class="line"><a name="l18569"></a><span class="lineno">18569</span>&#160;    <a class="code" href="struct_vma_pool.html">VmaPool</a> pool,</div>
+<div class="line"><a name="l18570"></a><span class="lineno">18570</span>&#160;    <span class="keyword">const</span> <span class="keywordtype">char</span>** ppName)</div>
+<div class="line"><a name="l18571"></a><span class="lineno">18571</span>&#160;{</div>
+<div class="line"><a name="l18572"></a><span class="lineno">18572</span>&#160;    VMA_ASSERT(allocator &amp;&amp; pool &amp;&amp; ppName);</div>
+<div class="line"><a name="l18573"></a><span class="lineno">18573</span>&#160; </div>
+<div class="line"><a name="l18574"></a><span class="lineno">18574</span>&#160;    VMA_DEBUG_LOG(<span class="stringliteral">&quot;vmaGetPoolName&quot;</span>);</div>
+<div class="line"><a name="l18575"></a><span class="lineno">18575</span>&#160; </div>
+<div class="line"><a name="l18576"></a><span class="lineno">18576</span>&#160;    VMA_DEBUG_GLOBAL_MUTEX_LOCK</div>
+<div class="line"><a name="l18577"></a><span class="lineno">18577</span>&#160; </div>
+<div class="line"><a name="l18578"></a><span class="lineno">18578</span>&#160;    *ppName = pool-&gt;GetName();</div>
+<div class="line"><a name="l18579"></a><span class="lineno">18579</span>&#160;}</div>
+<div class="line"><a name="l18580"></a><span class="lineno">18580</span>&#160; </div>
+<div class="line"><a name="l18581"></a><span class="lineno">18581</span>&#160;VMA_CALL_PRE <span class="keywordtype">void</span> VMA_CALL_POST <a class="code" href="vk__mem__alloc_8h.html#adbae3a0b4ab078024462fc85c37f3b58">vmaSetPoolName</a>(</div>
+<div class="line"><a name="l18582"></a><span class="lineno">18582</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div>
+<div class="line"><a name="l18583"></a><span class="lineno">18583</span>&#160;    <a class="code" href="struct_vma_pool.html">VmaPool</a> pool,</div>
+<div class="line"><a name="l18584"></a><span class="lineno">18584</span>&#160;    <span class="keyword">const</span> <span class="keywordtype">char</span>* pName)</div>
+<div class="line"><a name="l18585"></a><span class="lineno">18585</span>&#160;{</div>
+<div class="line"><a name="l18586"></a><span class="lineno">18586</span>&#160;    VMA_ASSERT(allocator &amp;&amp; pool);</div>
 <div class="line"><a name="l18587"></a><span class="lineno">18587</span>&#160; </div>
-<div class="line"><a name="l18588"></a><span class="lineno">18588</span>&#160;VMA_CALL_PRE VkResult VMA_CALL_POST <a class="code" href="vk__mem__alloc_8h.html#a36ba776fd7fd5cb1e9359fdc0d8e6e8a">vmaDefragmentationBegin</a>(</div>
-<div class="line"><a name="l18589"></a><span class="lineno">18589</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div>
-<div class="line"><a name="l18590"></a><span class="lineno">18590</span>&#160;    <span class="keyword">const</span> <a class="code" href="struct_vma_defragmentation_info2.html">VmaDefragmentationInfo2</a>* pInfo,</div>
-<div class="line"><a name="l18591"></a><span class="lineno">18591</span>&#160;    <a class="code" href="struct_vma_defragmentation_stats.html">VmaDefragmentationStats</a>* pStats,</div>
-<div class="line"><a name="l18592"></a><span class="lineno">18592</span>&#160;    <a class="code" href="struct_vma_defragmentation_context.html">VmaDefragmentationContext</a> *pContext)</div>
-<div class="line"><a name="l18593"></a><span class="lineno">18593</span>&#160;{</div>
-<div class="line"><a name="l18594"></a><span class="lineno">18594</span>&#160;    VMA_ASSERT(allocator &amp;&amp; pInfo &amp;&amp; pContext);</div>
-<div class="line"><a name="l18595"></a><span class="lineno">18595</span>&#160; </div>
-<div class="line"><a name="l18596"></a><span class="lineno">18596</span>&#160;    <span class="comment">// Degenerate case: Nothing to defragment.</span></div>
-<div class="line"><a name="l18597"></a><span class="lineno">18597</span>&#160;    <span class="keywordflow">if</span>(pInfo-&gt;<a class="code" href="struct_vma_defragmentation_info2.html#a3cf86ab32c1da779b4923d301a3056ba">allocationCount</a> == 0 &amp;&amp; pInfo-&gt;<a class="code" href="struct_vma_defragmentation_info2.html#a7e70aa2a1081d849dcc7829b19d3ec9d">poolCount</a> == 0)</div>
-<div class="line"><a name="l18598"></a><span class="lineno">18598</span>&#160;    {</div>
-<div class="line"><a name="l18599"></a><span class="lineno">18599</span>&#160;        <span class="keywordflow">return</span> VK_SUCCESS;</div>
-<div class="line"><a name="l18600"></a><span class="lineno">18600</span>&#160;    }</div>
+<div class="line"><a name="l18588"></a><span class="lineno">18588</span>&#160;    VMA_DEBUG_LOG(<span class="stringliteral">&quot;vmaSetPoolName&quot;</span>);</div>
+<div class="line"><a name="l18589"></a><span class="lineno">18589</span>&#160; </div>
+<div class="line"><a name="l18590"></a><span class="lineno">18590</span>&#160;    VMA_DEBUG_GLOBAL_MUTEX_LOCK</div>
+<div class="line"><a name="l18591"></a><span class="lineno">18591</span>&#160; </div>
+<div class="line"><a name="l18592"></a><span class="lineno">18592</span>&#160;    pool-&gt;SetName(pName);</div>
+<div class="line"><a name="l18593"></a><span class="lineno">18593</span>&#160; </div>
+<div class="line"><a name="l18594"></a><span class="lineno">18594</span>&#160;<span class="preprocessor">#if VMA_RECORDING_ENABLED</span></div>
+<div class="line"><a name="l18595"></a><span class="lineno">18595</span>&#160;    <span class="keywordflow">if</span>(allocator-&gt;GetRecorder() != VMA_NULL)</div>
+<div class="line"><a name="l18596"></a><span class="lineno">18596</span>&#160;    {</div>
+<div class="line"><a name="l18597"></a><span class="lineno">18597</span>&#160;        allocator-&gt;GetRecorder()-&gt;RecordSetPoolName(allocator-&gt;GetCurrentFrameIndex(), pool, pName);</div>
+<div class="line"><a name="l18598"></a><span class="lineno">18598</span>&#160;    }</div>
+<div class="line"><a name="l18599"></a><span class="lineno">18599</span>&#160;<span class="preprocessor">#endif</span></div>
+<div class="line"><a name="l18600"></a><span class="lineno">18600</span>&#160;}</div>
 <div class="line"><a name="l18601"></a><span class="lineno">18601</span>&#160; </div>
-<div class="line"><a name="l18602"></a><span class="lineno">18602</span>&#160;    VMA_ASSERT(pInfo-&gt;<a class="code" href="struct_vma_defragmentation_info2.html#a3cf86ab32c1da779b4923d301a3056ba">allocationCount</a> == 0 || pInfo-&gt;<a class="code" href="struct_vma_defragmentation_info2.html#ab6d288f29d028156cf73542d630a2e32">pAllocations</a> != VMA_NULL);</div>
-<div class="line"><a name="l18603"></a><span class="lineno">18603</span>&#160;    VMA_ASSERT(pInfo-&gt;<a class="code" href="struct_vma_defragmentation_info2.html#a7e70aa2a1081d849dcc7829b19d3ec9d">poolCount</a> == 0 || pInfo-&gt;<a class="code" href="struct_vma_defragmentation_info2.html#a3c9c6aa5c97d5670f8e362b3a6f3029b">pPools</a> != VMA_NULL);</div>
-<div class="line"><a name="l18604"></a><span class="lineno">18604</span>&#160;    VMA_HEAVY_ASSERT(VmaValidatePointerArray(pInfo-&gt;<a class="code" href="struct_vma_defragmentation_info2.html#a3cf86ab32c1da779b4923d301a3056ba">allocationCount</a>, pInfo-&gt;<a class="code" href="struct_vma_defragmentation_info2.html#ab6d288f29d028156cf73542d630a2e32">pAllocations</a>));</div>
-<div class="line"><a name="l18605"></a><span class="lineno">18605</span>&#160;    VMA_HEAVY_ASSERT(VmaValidatePointerArray(pInfo-&gt;<a class="code" href="struct_vma_defragmentation_info2.html#a7e70aa2a1081d849dcc7829b19d3ec9d">poolCount</a>, pInfo-&gt;<a class="code" href="struct_vma_defragmentation_info2.html#a3c9c6aa5c97d5670f8e362b3a6f3029b">pPools</a>));</div>
-<div class="line"><a name="l18606"></a><span class="lineno">18606</span>&#160; </div>
-<div class="line"><a name="l18607"></a><span class="lineno">18607</span>&#160;    VMA_DEBUG_LOG(<span class="stringliteral">&quot;vmaDefragmentationBegin&quot;</span>);</div>
-<div class="line"><a name="l18608"></a><span class="lineno">18608</span>&#160; </div>
-<div class="line"><a name="l18609"></a><span class="lineno">18609</span>&#160;    VMA_DEBUG_GLOBAL_MUTEX_LOCK</div>
+<div class="line"><a name="l18602"></a><span class="lineno">18602</span>&#160;VMA_CALL_PRE VkResult VMA_CALL_POST <a class="code" href="vk__mem__alloc_8h.html#abf28077dbf82d0908b8acbe8ee8dd9b8">vmaAllocateMemory</a>(</div>
+<div class="line"><a name="l18603"></a><span class="lineno">18603</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div>
+<div class="line"><a name="l18604"></a><span class="lineno">18604</span>&#160;    <span class="keyword">const</span> VkMemoryRequirements* pVkMemoryRequirements,</div>
+<div class="line"><a name="l18605"></a><span class="lineno">18605</span>&#160;    <span class="keyword">const</span> <a class="code" href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a>* pCreateInfo,</div>
+<div class="line"><a name="l18606"></a><span class="lineno">18606</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a>* pAllocation,</div>
+<div class="line"><a name="l18607"></a><span class="lineno">18607</span>&#160;    <a class="code" href="struct_vma_allocation_info.html">VmaAllocationInfo</a>* pAllocationInfo)</div>
+<div class="line"><a name="l18608"></a><span class="lineno">18608</span>&#160;{</div>
+<div class="line"><a name="l18609"></a><span class="lineno">18609</span>&#160;    VMA_ASSERT(allocator &amp;&amp; pVkMemoryRequirements &amp;&amp; pCreateInfo &amp;&amp; pAllocation);</div>
 <div class="line"><a name="l18610"></a><span class="lineno">18610</span>&#160; </div>
-<div class="line"><a name="l18611"></a><span class="lineno">18611</span>&#160;    VkResult res = allocator-&gt;DefragmentationBegin(*pInfo, pStats, pContext);</div>
+<div class="line"><a name="l18611"></a><span class="lineno">18611</span>&#160;    VMA_DEBUG_LOG(<span class="stringliteral">&quot;vmaAllocateMemory&quot;</span>);</div>
 <div class="line"><a name="l18612"></a><span class="lineno">18612</span>&#160; </div>
-<div class="line"><a name="l18613"></a><span class="lineno">18613</span>&#160;<span class="preprocessor">#if VMA_RECORDING_ENABLED</span></div>
-<div class="line"><a name="l18614"></a><span class="lineno">18614</span>&#160;    <span class="keywordflow">if</span>(allocator-&gt;GetRecorder() != VMA_NULL)</div>
-<div class="line"><a name="l18615"></a><span class="lineno">18615</span>&#160;    {</div>
-<div class="line"><a name="l18616"></a><span class="lineno">18616</span>&#160;        allocator-&gt;GetRecorder()-&gt;RecordDefragmentationBegin(</div>
-<div class="line"><a name="l18617"></a><span class="lineno">18617</span>&#160;            allocator-&gt;GetCurrentFrameIndex(), *pInfo, *pContext);</div>
-<div class="line"><a name="l18618"></a><span class="lineno">18618</span>&#160;    }</div>
-<div class="line"><a name="l18619"></a><span class="lineno">18619</span>&#160;<span class="preprocessor">#endif</span></div>
-<div class="line"><a name="l18620"></a><span class="lineno">18620</span>&#160; </div>
-<div class="line"><a name="l18621"></a><span class="lineno">18621</span>&#160;    <span class="keywordflow">return</span> res;</div>
-<div class="line"><a name="l18622"></a><span class="lineno">18622</span>&#160;}</div>
-<div class="line"><a name="l18623"></a><span class="lineno">18623</span>&#160; </div>
-<div class="line"><a name="l18624"></a><span class="lineno">18624</span>&#160;VMA_CALL_PRE VkResult VMA_CALL_POST <a class="code" href="vk__mem__alloc_8h.html#a8774e20e91e245aae959ba63efa15dd2">vmaDefragmentationEnd</a>(</div>
-<div class="line"><a name="l18625"></a><span class="lineno">18625</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div>
-<div class="line"><a name="l18626"></a><span class="lineno">18626</span>&#160;    <a class="code" href="struct_vma_defragmentation_context.html">VmaDefragmentationContext</a> context)</div>
-<div class="line"><a name="l18627"></a><span class="lineno">18627</span>&#160;{</div>
-<div class="line"><a name="l18628"></a><span class="lineno">18628</span>&#160;    VMA_ASSERT(allocator);</div>
-<div class="line"><a name="l18629"></a><span class="lineno">18629</span>&#160; </div>
-<div class="line"><a name="l18630"></a><span class="lineno">18630</span>&#160;    VMA_DEBUG_LOG(<span class="stringliteral">&quot;vmaDefragmentationEnd&quot;</span>);</div>
-<div class="line"><a name="l18631"></a><span class="lineno">18631</span>&#160; </div>
-<div class="line"><a name="l18632"></a><span class="lineno">18632</span>&#160;    <span class="keywordflow">if</span>(context != VK_NULL_HANDLE)</div>
-<div class="line"><a name="l18633"></a><span class="lineno">18633</span>&#160;    {</div>
-<div class="line"><a name="l18634"></a><span class="lineno">18634</span>&#160;        VMA_DEBUG_GLOBAL_MUTEX_LOCK</div>
-<div class="line"><a name="l18635"></a><span class="lineno">18635</span>&#160; </div>
-<div class="line"><a name="l18636"></a><span class="lineno">18636</span>&#160;<span class="preprocessor">#if VMA_RECORDING_ENABLED</span></div>
-<div class="line"><a name="l18637"></a><span class="lineno">18637</span>&#160;        <span class="keywordflow">if</span>(allocator-&gt;GetRecorder() != VMA_NULL)</div>
-<div class="line"><a name="l18638"></a><span class="lineno">18638</span>&#160;        {</div>
-<div class="line"><a name="l18639"></a><span class="lineno">18639</span>&#160;            allocator-&gt;GetRecorder()-&gt;RecordDefragmentationEnd(</div>
-<div class="line"><a name="l18640"></a><span class="lineno">18640</span>&#160;                allocator-&gt;GetCurrentFrameIndex(), context);</div>
-<div class="line"><a name="l18641"></a><span class="lineno">18641</span>&#160;        }</div>
-<div class="line"><a name="l18642"></a><span class="lineno">18642</span>&#160;<span class="preprocessor">#endif</span></div>
-<div class="line"><a name="l18643"></a><span class="lineno">18643</span>&#160; </div>
-<div class="line"><a name="l18644"></a><span class="lineno">18644</span>&#160;        <span class="keywordflow">return</span> allocator-&gt;DefragmentationEnd(context);</div>
-<div class="line"><a name="l18645"></a><span class="lineno">18645</span>&#160;    }</div>
-<div class="line"><a name="l18646"></a><span class="lineno">18646</span>&#160;    <span class="keywordflow">else</span></div>
-<div class="line"><a name="l18647"></a><span class="lineno">18647</span>&#160;    {</div>
-<div class="line"><a name="l18648"></a><span class="lineno">18648</span>&#160;        <span class="keywordflow">return</span> VK_SUCCESS;</div>
-<div class="line"><a name="l18649"></a><span class="lineno">18649</span>&#160;    }</div>
-<div class="line"><a name="l18650"></a><span class="lineno">18650</span>&#160;}</div>
-<div class="line"><a name="l18651"></a><span class="lineno">18651</span>&#160; </div>
-<div class="line"><a name="l18652"></a><span class="lineno">18652</span>&#160;VMA_CALL_PRE VkResult VMA_CALL_POST <a class="code" href="vk__mem__alloc_8h.html#ac0f01545b6262f7d4d128fc8f8e5c77b">vmaBeginDefragmentationPass</a>(</div>
-<div class="line"><a name="l18653"></a><span class="lineno">18653</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div>
-<div class="line"><a name="l18654"></a><span class="lineno">18654</span>&#160;    <a class="code" href="struct_vma_defragmentation_context.html">VmaDefragmentationContext</a> context,</div>
-<div class="line"><a name="l18655"></a><span class="lineno">18655</span>&#160;    <a class="code" href="struct_vma_defragmentation_pass_info.html">VmaDefragmentationPassInfo</a>* pInfo</div>
-<div class="line"><a name="l18656"></a><span class="lineno">18656</span>&#160;    )</div>
-<div class="line"><a name="l18657"></a><span class="lineno">18657</span>&#160;{</div>
-<div class="line"><a name="l18658"></a><span class="lineno">18658</span>&#160;    VMA_ASSERT(allocator);</div>
-<div class="line"><a name="l18659"></a><span class="lineno">18659</span>&#160;    VMA_ASSERT(pInfo);</div>
-<div class="line"><a name="l18660"></a><span class="lineno">18660</span>&#160;    VMA_HEAVY_ASSERT(VmaValidatePointerArray(pInfo-&gt;<a class="code" href="struct_vma_defragmentation_pass_info.html#ac1086e657ba995f8d1f4e49b83dcfb6c">moveCount</a>, pInfo-&gt;<a class="code" href="struct_vma_defragmentation_pass_info.html#acbd42d4a3357999da130a95cd99a3792">pMoves</a>));</div>
-<div class="line"><a name="l18661"></a><span class="lineno">18661</span>&#160; </div>
-<div class="line"><a name="l18662"></a><span class="lineno">18662</span>&#160;    VMA_DEBUG_LOG(<span class="stringliteral">&quot;vmaBeginDefragmentationPass&quot;</span>);</div>
-<div class="line"><a name="l18663"></a><span class="lineno">18663</span>&#160; </div>
-<div class="line"><a name="l18664"></a><span class="lineno">18664</span>&#160;    VMA_DEBUG_GLOBAL_MUTEX_LOCK</div>
-<div class="line"><a name="l18665"></a><span class="lineno">18665</span>&#160; </div>
-<div class="line"><a name="l18666"></a><span class="lineno">18666</span>&#160;    <span class="keywordflow">if</span>(context == VK_NULL_HANDLE)</div>
-<div class="line"><a name="l18667"></a><span class="lineno">18667</span>&#160;    {</div>
-<div class="line"><a name="l18668"></a><span class="lineno">18668</span>&#160;        pInfo-&gt;<a class="code" href="struct_vma_defragmentation_pass_info.html#ac1086e657ba995f8d1f4e49b83dcfb6c">moveCount</a> = 0;</div>
-<div class="line"><a name="l18669"></a><span class="lineno">18669</span>&#160;        <span class="keywordflow">return</span> VK_SUCCESS;</div>
-<div class="line"><a name="l18670"></a><span class="lineno">18670</span>&#160;    }</div>
-<div class="line"><a name="l18671"></a><span class="lineno">18671</span>&#160; </div>
-<div class="line"><a name="l18672"></a><span class="lineno">18672</span>&#160;    <span class="keywordflow">return</span> allocator-&gt;DefragmentationPassBegin(pInfo, context);</div>
-<div class="line"><a name="l18673"></a><span class="lineno">18673</span>&#160;}</div>
-<div class="line"><a name="l18674"></a><span class="lineno">18674</span>&#160;VMA_CALL_PRE VkResult VMA_CALL_POST <a class="code" href="vk__mem__alloc_8h.html#a1b9ffa538bed905af55c747cc48963bd">vmaEndDefragmentationPass</a>(</div>
-<div class="line"><a name="l18675"></a><span class="lineno">18675</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div>
-<div class="line"><a name="l18676"></a><span class="lineno">18676</span>&#160;    <a class="code" href="struct_vma_defragmentation_context.html">VmaDefragmentationContext</a> context)</div>
-<div class="line"><a name="l18677"></a><span class="lineno">18677</span>&#160;{</div>
-<div class="line"><a name="l18678"></a><span class="lineno">18678</span>&#160;    VMA_ASSERT(allocator);</div>
-<div class="line"><a name="l18679"></a><span class="lineno">18679</span>&#160; </div>
-<div class="line"><a name="l18680"></a><span class="lineno">18680</span>&#160;    VMA_DEBUG_LOG(<span class="stringliteral">&quot;vmaEndDefragmentationPass&quot;</span>);</div>
-<div class="line"><a name="l18681"></a><span class="lineno">18681</span>&#160;    VMA_DEBUG_GLOBAL_MUTEX_LOCK</div>
-<div class="line"><a name="l18682"></a><span class="lineno">18682</span>&#160; </div>
-<div class="line"><a name="l18683"></a><span class="lineno">18683</span>&#160;    <span class="keywordflow">if</span>(context == VK_NULL_HANDLE)</div>
-<div class="line"><a name="l18684"></a><span class="lineno">18684</span>&#160;        <span class="keywordflow">return</span> VK_SUCCESS;</div>
-<div class="line"><a name="l18685"></a><span class="lineno">18685</span>&#160; </div>
-<div class="line"><a name="l18686"></a><span class="lineno">18686</span>&#160;    <span class="keywordflow">return</span> allocator-&gt;DefragmentationPassEnd(context);</div>
-<div class="line"><a name="l18687"></a><span class="lineno">18687</span>&#160;}</div>
+<div class="line"><a name="l18613"></a><span class="lineno">18613</span>&#160;    VMA_DEBUG_GLOBAL_MUTEX_LOCK</div>
+<div class="line"><a name="l18614"></a><span class="lineno">18614</span>&#160; </div>
+<div class="line"><a name="l18615"></a><span class="lineno">18615</span>&#160;    VkResult result = allocator-&gt;AllocateMemory(</div>
+<div class="line"><a name="l18616"></a><span class="lineno">18616</span>&#160;        *pVkMemoryRequirements,</div>
+<div class="line"><a name="l18617"></a><span class="lineno">18617</span>&#160;        <span class="keyword">false</span>, <span class="comment">// requiresDedicatedAllocation</span></div>
+<div class="line"><a name="l18618"></a><span class="lineno">18618</span>&#160;        <span class="keyword">false</span>, <span class="comment">// prefersDedicatedAllocation</span></div>
+<div class="line"><a name="l18619"></a><span class="lineno">18619</span>&#160;        VK_NULL_HANDLE, <span class="comment">// dedicatedBuffer</span></div>
+<div class="line"><a name="l18620"></a><span class="lineno">18620</span>&#160;        UINT32_MAX, <span class="comment">// dedicatedBufferUsage</span></div>
+<div class="line"><a name="l18621"></a><span class="lineno">18621</span>&#160;        VK_NULL_HANDLE, <span class="comment">// dedicatedImage</span></div>
+<div class="line"><a name="l18622"></a><span class="lineno">18622</span>&#160;        *pCreateInfo,</div>
+<div class="line"><a name="l18623"></a><span class="lineno">18623</span>&#160;        VMA_SUBALLOCATION_TYPE_UNKNOWN,</div>
+<div class="line"><a name="l18624"></a><span class="lineno">18624</span>&#160;        1, <span class="comment">// allocationCount</span></div>
+<div class="line"><a name="l18625"></a><span class="lineno">18625</span>&#160;        pAllocation);</div>
+<div class="line"><a name="l18626"></a><span class="lineno">18626</span>&#160; </div>
+<div class="line"><a name="l18627"></a><span class="lineno">18627</span>&#160;<span class="preprocessor">#if VMA_RECORDING_ENABLED</span></div>
+<div class="line"><a name="l18628"></a><span class="lineno">18628</span>&#160;    <span class="keywordflow">if</span>(allocator-&gt;GetRecorder() != VMA_NULL)</div>
+<div class="line"><a name="l18629"></a><span class="lineno">18629</span>&#160;    {</div>
+<div class="line"><a name="l18630"></a><span class="lineno">18630</span>&#160;        allocator-&gt;GetRecorder()-&gt;RecordAllocateMemory(</div>
+<div class="line"><a name="l18631"></a><span class="lineno">18631</span>&#160;            allocator-&gt;GetCurrentFrameIndex(),</div>
+<div class="line"><a name="l18632"></a><span class="lineno">18632</span>&#160;            *pVkMemoryRequirements,</div>
+<div class="line"><a name="l18633"></a><span class="lineno">18633</span>&#160;            *pCreateInfo,</div>
+<div class="line"><a name="l18634"></a><span class="lineno">18634</span>&#160;            *pAllocation);</div>
+<div class="line"><a name="l18635"></a><span class="lineno">18635</span>&#160;    }</div>
+<div class="line"><a name="l18636"></a><span class="lineno">18636</span>&#160;<span class="preprocessor">#endif</span></div>
+<div class="line"><a name="l18637"></a><span class="lineno">18637</span>&#160; </div>
+<div class="line"><a name="l18638"></a><span class="lineno">18638</span>&#160;    <span class="keywordflow">if</span>(pAllocationInfo != VMA_NULL &amp;&amp; result == VK_SUCCESS)</div>
+<div class="line"><a name="l18639"></a><span class="lineno">18639</span>&#160;    {</div>
+<div class="line"><a name="l18640"></a><span class="lineno">18640</span>&#160;        allocator-&gt;GetAllocationInfo(*pAllocation, pAllocationInfo);</div>
+<div class="line"><a name="l18641"></a><span class="lineno">18641</span>&#160;    }</div>
+<div class="line"><a name="l18642"></a><span class="lineno">18642</span>&#160; </div>
+<div class="line"><a name="l18643"></a><span class="lineno">18643</span>&#160;    <span class="keywordflow">return</span> result;</div>
+<div class="line"><a name="l18644"></a><span class="lineno">18644</span>&#160;}</div>
+<div class="line"><a name="l18645"></a><span class="lineno">18645</span>&#160; </div>
+<div class="line"><a name="l18646"></a><span class="lineno">18646</span>&#160;VMA_CALL_PRE VkResult VMA_CALL_POST <a class="code" href="vk__mem__alloc_8h.html#ad37e82e492b3de38fc3f4cffd9ad0ae1">vmaAllocateMemoryPages</a>(</div>
+<div class="line"><a name="l18647"></a><span class="lineno">18647</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div>
+<div class="line"><a name="l18648"></a><span class="lineno">18648</span>&#160;    <span class="keyword">const</span> VkMemoryRequirements* pVkMemoryRequirements,</div>
+<div class="line"><a name="l18649"></a><span class="lineno">18649</span>&#160;    <span class="keyword">const</span> <a class="code" href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a>* pCreateInfo,</div>
+<div class="line"><a name="l18650"></a><span class="lineno">18650</span>&#160;    <span class="keywordtype">size_t</span> allocationCount,</div>
+<div class="line"><a name="l18651"></a><span class="lineno">18651</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a>* pAllocations,</div>
+<div class="line"><a name="l18652"></a><span class="lineno">18652</span>&#160;    <a class="code" href="struct_vma_allocation_info.html">VmaAllocationInfo</a>* pAllocationInfo)</div>
+<div class="line"><a name="l18653"></a><span class="lineno">18653</span>&#160;{</div>
+<div class="line"><a name="l18654"></a><span class="lineno">18654</span>&#160;    <span class="keywordflow">if</span>(allocationCount == 0)</div>
+<div class="line"><a name="l18655"></a><span class="lineno">18655</span>&#160;    {</div>
+<div class="line"><a name="l18656"></a><span class="lineno">18656</span>&#160;        <span class="keywordflow">return</span> VK_SUCCESS;</div>
+<div class="line"><a name="l18657"></a><span class="lineno">18657</span>&#160;    }</div>
+<div class="line"><a name="l18658"></a><span class="lineno">18658</span>&#160; </div>
+<div class="line"><a name="l18659"></a><span class="lineno">18659</span>&#160;    VMA_ASSERT(allocator &amp;&amp; pVkMemoryRequirements &amp;&amp; pCreateInfo &amp;&amp; pAllocations);</div>
+<div class="line"><a name="l18660"></a><span class="lineno">18660</span>&#160; </div>
+<div class="line"><a name="l18661"></a><span class="lineno">18661</span>&#160;    VMA_DEBUG_LOG(<span class="stringliteral">&quot;vmaAllocateMemoryPages&quot;</span>);</div>
+<div class="line"><a name="l18662"></a><span class="lineno">18662</span>&#160; </div>
+<div class="line"><a name="l18663"></a><span class="lineno">18663</span>&#160;    VMA_DEBUG_GLOBAL_MUTEX_LOCK</div>
+<div class="line"><a name="l18664"></a><span class="lineno">18664</span>&#160; </div>
+<div class="line"><a name="l18665"></a><span class="lineno">18665</span>&#160;    VkResult result = allocator-&gt;AllocateMemory(</div>
+<div class="line"><a name="l18666"></a><span class="lineno">18666</span>&#160;        *pVkMemoryRequirements,</div>
+<div class="line"><a name="l18667"></a><span class="lineno">18667</span>&#160;        <span class="keyword">false</span>, <span class="comment">// requiresDedicatedAllocation</span></div>
+<div class="line"><a name="l18668"></a><span class="lineno">18668</span>&#160;        <span class="keyword">false</span>, <span class="comment">// prefersDedicatedAllocation</span></div>
+<div class="line"><a name="l18669"></a><span class="lineno">18669</span>&#160;        VK_NULL_HANDLE, <span class="comment">// dedicatedBuffer</span></div>
+<div class="line"><a name="l18670"></a><span class="lineno">18670</span>&#160;        UINT32_MAX, <span class="comment">// dedicatedBufferUsage</span></div>
+<div class="line"><a name="l18671"></a><span class="lineno">18671</span>&#160;        VK_NULL_HANDLE, <span class="comment">// dedicatedImage</span></div>
+<div class="line"><a name="l18672"></a><span class="lineno">18672</span>&#160;        *pCreateInfo,</div>
+<div class="line"><a name="l18673"></a><span class="lineno">18673</span>&#160;        VMA_SUBALLOCATION_TYPE_UNKNOWN,</div>
+<div class="line"><a name="l18674"></a><span class="lineno">18674</span>&#160;        allocationCount,</div>
+<div class="line"><a name="l18675"></a><span class="lineno">18675</span>&#160;        pAllocations);</div>
+<div class="line"><a name="l18676"></a><span class="lineno">18676</span>&#160; </div>
+<div class="line"><a name="l18677"></a><span class="lineno">18677</span>&#160;<span class="preprocessor">#if VMA_RECORDING_ENABLED</span></div>
+<div class="line"><a name="l18678"></a><span class="lineno">18678</span>&#160;    <span class="keywordflow">if</span>(allocator-&gt;GetRecorder() != VMA_NULL)</div>
+<div class="line"><a name="l18679"></a><span class="lineno">18679</span>&#160;    {</div>
+<div class="line"><a name="l18680"></a><span class="lineno">18680</span>&#160;        allocator-&gt;GetRecorder()-&gt;RecordAllocateMemoryPages(</div>
+<div class="line"><a name="l18681"></a><span class="lineno">18681</span>&#160;            allocator-&gt;GetCurrentFrameIndex(),</div>
+<div class="line"><a name="l18682"></a><span class="lineno">18682</span>&#160;            *pVkMemoryRequirements,</div>
+<div class="line"><a name="l18683"></a><span class="lineno">18683</span>&#160;            *pCreateInfo,</div>
+<div class="line"><a name="l18684"></a><span class="lineno">18684</span>&#160;            (uint64_t)allocationCount,</div>
+<div class="line"><a name="l18685"></a><span class="lineno">18685</span>&#160;            pAllocations);</div>
+<div class="line"><a name="l18686"></a><span class="lineno">18686</span>&#160;    }</div>
+<div class="line"><a name="l18687"></a><span class="lineno">18687</span>&#160;<span class="preprocessor">#endif</span></div>
 <div class="line"><a name="l18688"></a><span class="lineno">18688</span>&#160; </div>
-<div class="line"><a name="l18689"></a><span class="lineno">18689</span>&#160;VMA_CALL_PRE VkResult VMA_CALL_POST <a class="code" href="vk__mem__alloc_8h.html#a6b0929b914b60cf2d45cac4bf3547470">vmaBindBufferMemory</a>(</div>
-<div class="line"><a name="l18690"></a><span class="lineno">18690</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div>
-<div class="line"><a name="l18691"></a><span class="lineno">18691</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation,</div>
-<div class="line"><a name="l18692"></a><span class="lineno">18692</span>&#160;    VkBuffer buffer)</div>
-<div class="line"><a name="l18693"></a><span class="lineno">18693</span>&#160;{</div>
-<div class="line"><a name="l18694"></a><span class="lineno">18694</span>&#160;    VMA_ASSERT(allocator &amp;&amp; allocation &amp;&amp; buffer);</div>
-<div class="line"><a name="l18695"></a><span class="lineno">18695</span>&#160; </div>
-<div class="line"><a name="l18696"></a><span class="lineno">18696</span>&#160;    VMA_DEBUG_LOG(<span class="stringliteral">&quot;vmaBindBufferMemory&quot;</span>);</div>
-<div class="line"><a name="l18697"></a><span class="lineno">18697</span>&#160; </div>
-<div class="line"><a name="l18698"></a><span class="lineno">18698</span>&#160;    VMA_DEBUG_GLOBAL_MUTEX_LOCK</div>
+<div class="line"><a name="l18689"></a><span class="lineno">18689</span>&#160;    <span class="keywordflow">if</span>(pAllocationInfo != VMA_NULL &amp;&amp; result == VK_SUCCESS)</div>
+<div class="line"><a name="l18690"></a><span class="lineno">18690</span>&#160;    {</div>
+<div class="line"><a name="l18691"></a><span class="lineno">18691</span>&#160;        <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> i = 0; i &lt; allocationCount; ++i)</div>
+<div class="line"><a name="l18692"></a><span class="lineno">18692</span>&#160;        {</div>
+<div class="line"><a name="l18693"></a><span class="lineno">18693</span>&#160;            allocator-&gt;GetAllocationInfo(pAllocations[i], pAllocationInfo + i);</div>
+<div class="line"><a name="l18694"></a><span class="lineno">18694</span>&#160;        }</div>
+<div class="line"><a name="l18695"></a><span class="lineno">18695</span>&#160;    }</div>
+<div class="line"><a name="l18696"></a><span class="lineno">18696</span>&#160; </div>
+<div class="line"><a name="l18697"></a><span class="lineno">18697</span>&#160;    <span class="keywordflow">return</span> result;</div>
+<div class="line"><a name="l18698"></a><span class="lineno">18698</span>&#160;}</div>
 <div class="line"><a name="l18699"></a><span class="lineno">18699</span>&#160; </div>
-<div class="line"><a name="l18700"></a><span class="lineno">18700</span>&#160;    <span class="keywordflow">return</span> allocator-&gt;BindBufferMemory(allocation, 0, buffer, VMA_NULL);</div>
-<div class="line"><a name="l18701"></a><span class="lineno">18701</span>&#160;}</div>
-<div class="line"><a name="l18702"></a><span class="lineno">18702</span>&#160; </div>
-<div class="line"><a name="l18703"></a><span class="lineno">18703</span>&#160;VMA_CALL_PRE VkResult VMA_CALL_POST <a class="code" href="vk__mem__alloc_8h.html#a927c944f45e0f2941182abb6f608e64a">vmaBindBufferMemory2</a>(</div>
-<div class="line"><a name="l18704"></a><span class="lineno">18704</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div>
-<div class="line"><a name="l18705"></a><span class="lineno">18705</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation,</div>
-<div class="line"><a name="l18706"></a><span class="lineno">18706</span>&#160;    VkDeviceSize allocationLocalOffset,</div>
-<div class="line"><a name="l18707"></a><span class="lineno">18707</span>&#160;    VkBuffer buffer,</div>
-<div class="line"><a name="l18708"></a><span class="lineno">18708</span>&#160;    <span class="keyword">const</span> <span class="keywordtype">void</span>* pNext)</div>
-<div class="line"><a name="l18709"></a><span class="lineno">18709</span>&#160;{</div>
-<div class="line"><a name="l18710"></a><span class="lineno">18710</span>&#160;    VMA_ASSERT(allocator &amp;&amp; allocation &amp;&amp; buffer);</div>
-<div class="line"><a name="l18711"></a><span class="lineno">18711</span>&#160; </div>
-<div class="line"><a name="l18712"></a><span class="lineno">18712</span>&#160;    VMA_DEBUG_LOG(<span class="stringliteral">&quot;vmaBindBufferMemory2&quot;</span>);</div>
-<div class="line"><a name="l18713"></a><span class="lineno">18713</span>&#160; </div>
-<div class="line"><a name="l18714"></a><span class="lineno">18714</span>&#160;    VMA_DEBUG_GLOBAL_MUTEX_LOCK</div>
-<div class="line"><a name="l18715"></a><span class="lineno">18715</span>&#160; </div>
-<div class="line"><a name="l18716"></a><span class="lineno">18716</span>&#160;    <span class="keywordflow">return</span> allocator-&gt;BindBufferMemory(allocation, allocationLocalOffset, buffer, pNext);</div>
-<div class="line"><a name="l18717"></a><span class="lineno">18717</span>&#160;}</div>
-<div class="line"><a name="l18718"></a><span class="lineno">18718</span>&#160; </div>
-<div class="line"><a name="l18719"></a><span class="lineno">18719</span>&#160;VMA_CALL_PRE VkResult VMA_CALL_POST <a class="code" href="vk__mem__alloc_8h.html#a3d3ca45799923aa5d138e9e5f9eb2da5">vmaBindImageMemory</a>(</div>
-<div class="line"><a name="l18720"></a><span class="lineno">18720</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div>
-<div class="line"><a name="l18721"></a><span class="lineno">18721</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation,</div>
-<div class="line"><a name="l18722"></a><span class="lineno">18722</span>&#160;    VkImage image)</div>
-<div class="line"><a name="l18723"></a><span class="lineno">18723</span>&#160;{</div>
-<div class="line"><a name="l18724"></a><span class="lineno">18724</span>&#160;    VMA_ASSERT(allocator &amp;&amp; allocation &amp;&amp; image);</div>
-<div class="line"><a name="l18725"></a><span class="lineno">18725</span>&#160; </div>
-<div class="line"><a name="l18726"></a><span class="lineno">18726</span>&#160;    VMA_DEBUG_LOG(<span class="stringliteral">&quot;vmaBindImageMemory&quot;</span>);</div>
-<div class="line"><a name="l18727"></a><span class="lineno">18727</span>&#160; </div>
-<div class="line"><a name="l18728"></a><span class="lineno">18728</span>&#160;    VMA_DEBUG_GLOBAL_MUTEX_LOCK</div>
-<div class="line"><a name="l18729"></a><span class="lineno">18729</span>&#160; </div>
-<div class="line"><a name="l18730"></a><span class="lineno">18730</span>&#160;    <span class="keywordflow">return</span> allocator-&gt;BindImageMemory(allocation, 0, image, VMA_NULL);</div>
-<div class="line"><a name="l18731"></a><span class="lineno">18731</span>&#160;}</div>
-<div class="line"><a name="l18732"></a><span class="lineno">18732</span>&#160; </div>
-<div class="line"><a name="l18733"></a><span class="lineno">18733</span>&#160;VMA_CALL_PRE VkResult VMA_CALL_POST <a class="code" href="vk__mem__alloc_8h.html#aa8251ee81b0045a443e35b8e8aa021bc">vmaBindImageMemory2</a>(</div>
-<div class="line"><a name="l18734"></a><span class="lineno">18734</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div>
-<div class="line"><a name="l18735"></a><span class="lineno">18735</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation,</div>
-<div class="line"><a name="l18736"></a><span class="lineno">18736</span>&#160;    VkDeviceSize allocationLocalOffset,</div>
-<div class="line"><a name="l18737"></a><span class="lineno">18737</span>&#160;    VkImage image,</div>
-<div class="line"><a name="l18738"></a><span class="lineno">18738</span>&#160;    <span class="keyword">const</span> <span class="keywordtype">void</span>* pNext)</div>
-<div class="line"><a name="l18739"></a><span class="lineno">18739</span>&#160;{</div>
-<div class="line"><a name="l18740"></a><span class="lineno">18740</span>&#160;    VMA_ASSERT(allocator &amp;&amp; allocation &amp;&amp; image);</div>
-<div class="line"><a name="l18741"></a><span class="lineno">18741</span>&#160; </div>
-<div class="line"><a name="l18742"></a><span class="lineno">18742</span>&#160;    VMA_DEBUG_LOG(<span class="stringliteral">&quot;vmaBindImageMemory2&quot;</span>);</div>
-<div class="line"><a name="l18743"></a><span class="lineno">18743</span>&#160; </div>
-<div class="line"><a name="l18744"></a><span class="lineno">18744</span>&#160;    VMA_DEBUG_GLOBAL_MUTEX_LOCK</div>
-<div class="line"><a name="l18745"></a><span class="lineno">18745</span>&#160; </div>
-<div class="line"><a name="l18746"></a><span class="lineno">18746</span>&#160;        <span class="keywordflow">return</span> allocator-&gt;BindImageMemory(allocation, allocationLocalOffset, image, pNext);</div>
-<div class="line"><a name="l18747"></a><span class="lineno">18747</span>&#160;}</div>
-<div class="line"><a name="l18748"></a><span class="lineno">18748</span>&#160; </div>
-<div class="line"><a name="l18749"></a><span class="lineno">18749</span>&#160;VMA_CALL_PRE VkResult VMA_CALL_POST <a class="code" href="vk__mem__alloc_8h.html#ac72ee55598617e8eecca384e746bab51">vmaCreateBuffer</a>(</div>
-<div class="line"><a name="l18750"></a><span class="lineno">18750</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div>
-<div class="line"><a name="l18751"></a><span class="lineno">18751</span>&#160;    <span class="keyword">const</span> VkBufferCreateInfo* pBufferCreateInfo,</div>
-<div class="line"><a name="l18752"></a><span class="lineno">18752</span>&#160;    <span class="keyword">const</span> <a class="code" href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a>* pAllocationCreateInfo,</div>
-<div class="line"><a name="l18753"></a><span class="lineno">18753</span>&#160;    VkBuffer* pBuffer,</div>
-<div class="line"><a name="l18754"></a><span class="lineno">18754</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a>* pAllocation,</div>
-<div class="line"><a name="l18755"></a><span class="lineno">18755</span>&#160;    <a class="code" href="struct_vma_allocation_info.html">VmaAllocationInfo</a>* pAllocationInfo)</div>
-<div class="line"><a name="l18756"></a><span class="lineno">18756</span>&#160;{</div>
-<div class="line"><a name="l18757"></a><span class="lineno">18757</span>&#160;    VMA_ASSERT(allocator &amp;&amp; pBufferCreateInfo &amp;&amp; pAllocationCreateInfo &amp;&amp; pBuffer &amp;&amp; pAllocation);</div>
-<div class="line"><a name="l18758"></a><span class="lineno">18758</span>&#160; </div>
-<div class="line"><a name="l18759"></a><span class="lineno">18759</span>&#160;    <span class="keywordflow">if</span>(pBufferCreateInfo-&gt;size == 0)</div>
-<div class="line"><a name="l18760"></a><span class="lineno">18760</span>&#160;    {</div>
-<div class="line"><a name="l18761"></a><span class="lineno">18761</span>&#160;        <span class="keywordflow">return</span> VK_ERROR_VALIDATION_FAILED_EXT;</div>
-<div class="line"><a name="l18762"></a><span class="lineno">18762</span>&#160;    }</div>
-<div class="line"><a name="l18763"></a><span class="lineno">18763</span>&#160;    <span class="keywordflow">if</span>((pBufferCreateInfo-&gt;usage &amp; VK_BUFFER_USAGE_SHADER_DEVICE_ADDRESS_BIT_COPY) != 0 &amp;&amp;</div>
-<div class="line"><a name="l18764"></a><span class="lineno">18764</span>&#160;        !allocator-&gt;m_UseKhrBufferDeviceAddress)</div>
-<div class="line"><a name="l18765"></a><span class="lineno">18765</span>&#160;    {</div>
-<div class="line"><a name="l18766"></a><span class="lineno">18766</span>&#160;        VMA_ASSERT(0 &amp;&amp; <span class="stringliteral">&quot;Creating a buffer with VK_BUFFER_USAGE_SHADER_DEVICE_ADDRESS_BIT is not valid if VMA_ALLOCATOR_CREATE_BUFFER_DEVICE_ADDRESS_BIT was not used.&quot;</span>);</div>
-<div class="line"><a name="l18767"></a><span class="lineno">18767</span>&#160;        <span class="keywordflow">return</span> VK_ERROR_VALIDATION_FAILED_EXT;</div>
-<div class="line"><a name="l18768"></a><span class="lineno">18768</span>&#160;    }</div>
-<div class="line"><a name="l18769"></a><span class="lineno">18769</span>&#160;    </div>
-<div class="line"><a name="l18770"></a><span class="lineno">18770</span>&#160;    VMA_DEBUG_LOG(<span class="stringliteral">&quot;vmaCreateBuffer&quot;</span>);</div>
-<div class="line"><a name="l18771"></a><span class="lineno">18771</span>&#160;    </div>
-<div class="line"><a name="l18772"></a><span class="lineno">18772</span>&#160;    VMA_DEBUG_GLOBAL_MUTEX_LOCK</div>
-<div class="line"><a name="l18773"></a><span class="lineno">18773</span>&#160; </div>
-<div class="line"><a name="l18774"></a><span class="lineno">18774</span>&#160;    *pBuffer = VK_NULL_HANDLE;</div>
-<div class="line"><a name="l18775"></a><span class="lineno">18775</span>&#160;    *pAllocation = VK_NULL_HANDLE;</div>
-<div class="line"><a name="l18776"></a><span class="lineno">18776</span>&#160; </div>
-<div class="line"><a name="l18777"></a><span class="lineno">18777</span>&#160;    <span class="comment">// 1. Create VkBuffer.</span></div>
-<div class="line"><a name="l18778"></a><span class="lineno">18778</span>&#160;    VkResult res = (*allocator-&gt;GetVulkanFunctions().vkCreateBuffer)(</div>
-<div class="line"><a name="l18779"></a><span class="lineno">18779</span>&#160;        allocator-&gt;m_hDevice,</div>
-<div class="line"><a name="l18780"></a><span class="lineno">18780</span>&#160;        pBufferCreateInfo,</div>
-<div class="line"><a name="l18781"></a><span class="lineno">18781</span>&#160;        allocator-&gt;GetAllocationCallbacks(),</div>
-<div class="line"><a name="l18782"></a><span class="lineno">18782</span>&#160;        pBuffer);</div>
-<div class="line"><a name="l18783"></a><span class="lineno">18783</span>&#160;    <span class="keywordflow">if</span>(res &gt;= 0)</div>
-<div class="line"><a name="l18784"></a><span class="lineno">18784</span>&#160;    {</div>
-<div class="line"><a name="l18785"></a><span class="lineno">18785</span>&#160;        <span class="comment">// 2. vkGetBufferMemoryRequirements.</span></div>
-<div class="line"><a name="l18786"></a><span class="lineno">18786</span>&#160;        VkMemoryRequirements vkMemReq = {};</div>
-<div class="line"><a name="l18787"></a><span class="lineno">18787</span>&#160;        <span class="keywordtype">bool</span> requiresDedicatedAllocation = <span class="keyword">false</span>;</div>
-<div class="line"><a name="l18788"></a><span class="lineno">18788</span>&#160;        <span class="keywordtype">bool</span> prefersDedicatedAllocation  = <span class="keyword">false</span>;</div>
-<div class="line"><a name="l18789"></a><span class="lineno">18789</span>&#160;        allocator-&gt;GetBufferMemoryRequirements(*pBuffer, vkMemReq,</div>
-<div class="line"><a name="l18790"></a><span class="lineno">18790</span>&#160;            requiresDedicatedAllocation, prefersDedicatedAllocation);</div>
-<div class="line"><a name="l18791"></a><span class="lineno">18791</span>&#160; </div>
-<div class="line"><a name="l18792"></a><span class="lineno">18792</span>&#160;        <span class="comment">// 3. Allocate memory using allocator.</span></div>
-<div class="line"><a name="l18793"></a><span class="lineno">18793</span>&#160;        res = allocator-&gt;AllocateMemory(</div>
-<div class="line"><a name="l18794"></a><span class="lineno">18794</span>&#160;            vkMemReq,</div>
-<div class="line"><a name="l18795"></a><span class="lineno">18795</span>&#160;            requiresDedicatedAllocation,</div>
-<div class="line"><a name="l18796"></a><span class="lineno">18796</span>&#160;            prefersDedicatedAllocation,</div>
-<div class="line"><a name="l18797"></a><span class="lineno">18797</span>&#160;            *pBuffer, <span class="comment">// dedicatedBuffer</span></div>
-<div class="line"><a name="l18798"></a><span class="lineno">18798</span>&#160;            pBufferCreateInfo-&gt;usage, <span class="comment">// dedicatedBufferUsage</span></div>
-<div class="line"><a name="l18799"></a><span class="lineno">18799</span>&#160;            VK_NULL_HANDLE, <span class="comment">// dedicatedImage</span></div>
-<div class="line"><a name="l18800"></a><span class="lineno">18800</span>&#160;            *pAllocationCreateInfo,</div>
-<div class="line"><a name="l18801"></a><span class="lineno">18801</span>&#160;            VMA_SUBALLOCATION_TYPE_BUFFER,</div>
-<div class="line"><a name="l18802"></a><span class="lineno">18802</span>&#160;            1, <span class="comment">// allocationCount</span></div>
-<div class="line"><a name="l18803"></a><span class="lineno">18803</span>&#160;            pAllocation);</div>
+<div class="line"><a name="l18700"></a><span class="lineno">18700</span>&#160;VMA_CALL_PRE VkResult VMA_CALL_POST <a class="code" href="vk__mem__alloc_8h.html#a7fdf64415b6c3d83c454f28d2c53df7b">vmaAllocateMemoryForBuffer</a>(</div>
+<div class="line"><a name="l18701"></a><span class="lineno">18701</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div>
+<div class="line"><a name="l18702"></a><span class="lineno">18702</span>&#160;    VkBuffer buffer,</div>
+<div class="line"><a name="l18703"></a><span class="lineno">18703</span>&#160;    <span class="keyword">const</span> <a class="code" href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a>* pCreateInfo,</div>
+<div class="line"><a name="l18704"></a><span class="lineno">18704</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a>* pAllocation,</div>
+<div class="line"><a name="l18705"></a><span class="lineno">18705</span>&#160;    <a class="code" href="struct_vma_allocation_info.html">VmaAllocationInfo</a>* pAllocationInfo)</div>
+<div class="line"><a name="l18706"></a><span class="lineno">18706</span>&#160;{</div>
+<div class="line"><a name="l18707"></a><span class="lineno">18707</span>&#160;    VMA_ASSERT(allocator &amp;&amp; buffer != VK_NULL_HANDLE &amp;&amp; pCreateInfo &amp;&amp; pAllocation);</div>
+<div class="line"><a name="l18708"></a><span class="lineno">18708</span>&#160; </div>
+<div class="line"><a name="l18709"></a><span class="lineno">18709</span>&#160;    VMA_DEBUG_LOG(<span class="stringliteral">&quot;vmaAllocateMemoryForBuffer&quot;</span>);</div>
+<div class="line"><a name="l18710"></a><span class="lineno">18710</span>&#160; </div>
+<div class="line"><a name="l18711"></a><span class="lineno">18711</span>&#160;    VMA_DEBUG_GLOBAL_MUTEX_LOCK</div>
+<div class="line"><a name="l18712"></a><span class="lineno">18712</span>&#160; </div>
+<div class="line"><a name="l18713"></a><span class="lineno">18713</span>&#160;    VkMemoryRequirements vkMemReq = {};</div>
+<div class="line"><a name="l18714"></a><span class="lineno">18714</span>&#160;    <span class="keywordtype">bool</span> requiresDedicatedAllocation = <span class="keyword">false</span>;</div>
+<div class="line"><a name="l18715"></a><span class="lineno">18715</span>&#160;    <span class="keywordtype">bool</span> prefersDedicatedAllocation = <span class="keyword">false</span>;</div>
+<div class="line"><a name="l18716"></a><span class="lineno">18716</span>&#160;    allocator-&gt;GetBufferMemoryRequirements(buffer, vkMemReq,</div>
+<div class="line"><a name="l18717"></a><span class="lineno">18717</span>&#160;        requiresDedicatedAllocation,</div>
+<div class="line"><a name="l18718"></a><span class="lineno">18718</span>&#160;        prefersDedicatedAllocation);</div>
+<div class="line"><a name="l18719"></a><span class="lineno">18719</span>&#160; </div>
+<div class="line"><a name="l18720"></a><span class="lineno">18720</span>&#160;    VkResult result = allocator-&gt;AllocateMemory(</div>
+<div class="line"><a name="l18721"></a><span class="lineno">18721</span>&#160;        vkMemReq,</div>
+<div class="line"><a name="l18722"></a><span class="lineno">18722</span>&#160;        requiresDedicatedAllocation,</div>
+<div class="line"><a name="l18723"></a><span class="lineno">18723</span>&#160;        prefersDedicatedAllocation,</div>
+<div class="line"><a name="l18724"></a><span class="lineno">18724</span>&#160;        buffer, <span class="comment">// dedicatedBuffer</span></div>
+<div class="line"><a name="l18725"></a><span class="lineno">18725</span>&#160;        UINT32_MAX, <span class="comment">// dedicatedBufferUsage</span></div>
+<div class="line"><a name="l18726"></a><span class="lineno">18726</span>&#160;        VK_NULL_HANDLE, <span class="comment">// dedicatedImage</span></div>
+<div class="line"><a name="l18727"></a><span class="lineno">18727</span>&#160;        *pCreateInfo,</div>
+<div class="line"><a name="l18728"></a><span class="lineno">18728</span>&#160;        VMA_SUBALLOCATION_TYPE_BUFFER,</div>
+<div class="line"><a name="l18729"></a><span class="lineno">18729</span>&#160;        1, <span class="comment">// allocationCount</span></div>
+<div class="line"><a name="l18730"></a><span class="lineno">18730</span>&#160;        pAllocation);</div>
+<div class="line"><a name="l18731"></a><span class="lineno">18731</span>&#160; </div>
+<div class="line"><a name="l18732"></a><span class="lineno">18732</span>&#160;<span class="preprocessor">#if VMA_RECORDING_ENABLED</span></div>
+<div class="line"><a name="l18733"></a><span class="lineno">18733</span>&#160;    <span class="keywordflow">if</span>(allocator-&gt;GetRecorder() != VMA_NULL)</div>
+<div class="line"><a name="l18734"></a><span class="lineno">18734</span>&#160;    {</div>
+<div class="line"><a name="l18735"></a><span class="lineno">18735</span>&#160;        allocator-&gt;GetRecorder()-&gt;RecordAllocateMemoryForBuffer(</div>
+<div class="line"><a name="l18736"></a><span class="lineno">18736</span>&#160;            allocator-&gt;GetCurrentFrameIndex(),</div>
+<div class="line"><a name="l18737"></a><span class="lineno">18737</span>&#160;            vkMemReq,</div>
+<div class="line"><a name="l18738"></a><span class="lineno">18738</span>&#160;            requiresDedicatedAllocation,</div>
+<div class="line"><a name="l18739"></a><span class="lineno">18739</span>&#160;            prefersDedicatedAllocation,</div>
+<div class="line"><a name="l18740"></a><span class="lineno">18740</span>&#160;            *pCreateInfo,</div>
+<div class="line"><a name="l18741"></a><span class="lineno">18741</span>&#160;            *pAllocation);</div>
+<div class="line"><a name="l18742"></a><span class="lineno">18742</span>&#160;    }</div>
+<div class="line"><a name="l18743"></a><span class="lineno">18743</span>&#160;<span class="preprocessor">#endif</span></div>
+<div class="line"><a name="l18744"></a><span class="lineno">18744</span>&#160; </div>
+<div class="line"><a name="l18745"></a><span class="lineno">18745</span>&#160;    <span class="keywordflow">if</span>(pAllocationInfo &amp;&amp; result == VK_SUCCESS)</div>
+<div class="line"><a name="l18746"></a><span class="lineno">18746</span>&#160;    {</div>
+<div class="line"><a name="l18747"></a><span class="lineno">18747</span>&#160;        allocator-&gt;GetAllocationInfo(*pAllocation, pAllocationInfo);</div>
+<div class="line"><a name="l18748"></a><span class="lineno">18748</span>&#160;    }</div>
+<div class="line"><a name="l18749"></a><span class="lineno">18749</span>&#160; </div>
+<div class="line"><a name="l18750"></a><span class="lineno">18750</span>&#160;    <span class="keywordflow">return</span> result;</div>
+<div class="line"><a name="l18751"></a><span class="lineno">18751</span>&#160;}</div>
+<div class="line"><a name="l18752"></a><span class="lineno">18752</span>&#160; </div>
+<div class="line"><a name="l18753"></a><span class="lineno">18753</span>&#160;VMA_CALL_PRE VkResult VMA_CALL_POST <a class="code" href="vk__mem__alloc_8h.html#a0faa3f9e5fb233d29d1e00390650febb">vmaAllocateMemoryForImage</a>(</div>
+<div class="line"><a name="l18754"></a><span class="lineno">18754</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div>
+<div class="line"><a name="l18755"></a><span class="lineno">18755</span>&#160;    VkImage image,</div>
+<div class="line"><a name="l18756"></a><span class="lineno">18756</span>&#160;    <span class="keyword">const</span> <a class="code" href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a>* pCreateInfo,</div>
+<div class="line"><a name="l18757"></a><span class="lineno">18757</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a>* pAllocation,</div>
+<div class="line"><a name="l18758"></a><span class="lineno">18758</span>&#160;    <a class="code" href="struct_vma_allocation_info.html">VmaAllocationInfo</a>* pAllocationInfo)</div>
+<div class="line"><a name="l18759"></a><span class="lineno">18759</span>&#160;{</div>
+<div class="line"><a name="l18760"></a><span class="lineno">18760</span>&#160;    VMA_ASSERT(allocator &amp;&amp; image != VK_NULL_HANDLE &amp;&amp; pCreateInfo &amp;&amp; pAllocation);</div>
+<div class="line"><a name="l18761"></a><span class="lineno">18761</span>&#160; </div>
+<div class="line"><a name="l18762"></a><span class="lineno">18762</span>&#160;    VMA_DEBUG_LOG(<span class="stringliteral">&quot;vmaAllocateMemoryForImage&quot;</span>);</div>
+<div class="line"><a name="l18763"></a><span class="lineno">18763</span>&#160; </div>
+<div class="line"><a name="l18764"></a><span class="lineno">18764</span>&#160;    VMA_DEBUG_GLOBAL_MUTEX_LOCK</div>
+<div class="line"><a name="l18765"></a><span class="lineno">18765</span>&#160; </div>
+<div class="line"><a name="l18766"></a><span class="lineno">18766</span>&#160;    VkMemoryRequirements vkMemReq = {};</div>
+<div class="line"><a name="l18767"></a><span class="lineno">18767</span>&#160;    <span class="keywordtype">bool</span> requiresDedicatedAllocation = <span class="keyword">false</span>;</div>
+<div class="line"><a name="l18768"></a><span class="lineno">18768</span>&#160;    <span class="keywordtype">bool</span> prefersDedicatedAllocation  = <span class="keyword">false</span>;</div>
+<div class="line"><a name="l18769"></a><span class="lineno">18769</span>&#160;    allocator-&gt;GetImageMemoryRequirements(image, vkMemReq,</div>
+<div class="line"><a name="l18770"></a><span class="lineno">18770</span>&#160;        requiresDedicatedAllocation, prefersDedicatedAllocation);</div>
+<div class="line"><a name="l18771"></a><span class="lineno">18771</span>&#160; </div>
+<div class="line"><a name="l18772"></a><span class="lineno">18772</span>&#160;    VkResult result = allocator-&gt;AllocateMemory(</div>
+<div class="line"><a name="l18773"></a><span class="lineno">18773</span>&#160;        vkMemReq,</div>
+<div class="line"><a name="l18774"></a><span class="lineno">18774</span>&#160;        requiresDedicatedAllocation,</div>
+<div class="line"><a name="l18775"></a><span class="lineno">18775</span>&#160;        prefersDedicatedAllocation,</div>
+<div class="line"><a name="l18776"></a><span class="lineno">18776</span>&#160;        VK_NULL_HANDLE, <span class="comment">// dedicatedBuffer</span></div>
+<div class="line"><a name="l18777"></a><span class="lineno">18777</span>&#160;        UINT32_MAX, <span class="comment">// dedicatedBufferUsage</span></div>
+<div class="line"><a name="l18778"></a><span class="lineno">18778</span>&#160;        image, <span class="comment">// dedicatedImage</span></div>
+<div class="line"><a name="l18779"></a><span class="lineno">18779</span>&#160;        *pCreateInfo,</div>
+<div class="line"><a name="l18780"></a><span class="lineno">18780</span>&#160;        VMA_SUBALLOCATION_TYPE_IMAGE_UNKNOWN,</div>
+<div class="line"><a name="l18781"></a><span class="lineno">18781</span>&#160;        1, <span class="comment">// allocationCount</span></div>
+<div class="line"><a name="l18782"></a><span class="lineno">18782</span>&#160;        pAllocation);</div>
+<div class="line"><a name="l18783"></a><span class="lineno">18783</span>&#160; </div>
+<div class="line"><a name="l18784"></a><span class="lineno">18784</span>&#160;<span class="preprocessor">#if VMA_RECORDING_ENABLED</span></div>
+<div class="line"><a name="l18785"></a><span class="lineno">18785</span>&#160;    <span class="keywordflow">if</span>(allocator-&gt;GetRecorder() != VMA_NULL)</div>
+<div class="line"><a name="l18786"></a><span class="lineno">18786</span>&#160;    {</div>
+<div class="line"><a name="l18787"></a><span class="lineno">18787</span>&#160;        allocator-&gt;GetRecorder()-&gt;RecordAllocateMemoryForImage(</div>
+<div class="line"><a name="l18788"></a><span class="lineno">18788</span>&#160;            allocator-&gt;GetCurrentFrameIndex(),</div>
+<div class="line"><a name="l18789"></a><span class="lineno">18789</span>&#160;            vkMemReq,</div>
+<div class="line"><a name="l18790"></a><span class="lineno">18790</span>&#160;            requiresDedicatedAllocation,</div>
+<div class="line"><a name="l18791"></a><span class="lineno">18791</span>&#160;            prefersDedicatedAllocation,</div>
+<div class="line"><a name="l18792"></a><span class="lineno">18792</span>&#160;            *pCreateInfo,</div>
+<div class="line"><a name="l18793"></a><span class="lineno">18793</span>&#160;            *pAllocation);</div>
+<div class="line"><a name="l18794"></a><span class="lineno">18794</span>&#160;    }</div>
+<div class="line"><a name="l18795"></a><span class="lineno">18795</span>&#160;<span class="preprocessor">#endif</span></div>
+<div class="line"><a name="l18796"></a><span class="lineno">18796</span>&#160; </div>
+<div class="line"><a name="l18797"></a><span class="lineno">18797</span>&#160;    <span class="keywordflow">if</span>(pAllocationInfo &amp;&amp; result == VK_SUCCESS)</div>
+<div class="line"><a name="l18798"></a><span class="lineno">18798</span>&#160;    {</div>
+<div class="line"><a name="l18799"></a><span class="lineno">18799</span>&#160;        allocator-&gt;GetAllocationInfo(*pAllocation, pAllocationInfo);</div>
+<div class="line"><a name="l18800"></a><span class="lineno">18800</span>&#160;    }</div>
+<div class="line"><a name="l18801"></a><span class="lineno">18801</span>&#160; </div>
+<div class="line"><a name="l18802"></a><span class="lineno">18802</span>&#160;    <span class="keywordflow">return</span> result;</div>
+<div class="line"><a name="l18803"></a><span class="lineno">18803</span>&#160;}</div>
 <div class="line"><a name="l18804"></a><span class="lineno">18804</span>&#160; </div>
-<div class="line"><a name="l18805"></a><span class="lineno">18805</span>&#160;<span class="preprocessor">#if VMA_RECORDING_ENABLED</span></div>
-<div class="line"><a name="l18806"></a><span class="lineno">18806</span>&#160;        <span class="keywordflow">if</span>(allocator-&gt;GetRecorder() != VMA_NULL)</div>
-<div class="line"><a name="l18807"></a><span class="lineno">18807</span>&#160;        {</div>
-<div class="line"><a name="l18808"></a><span class="lineno">18808</span>&#160;            allocator-&gt;GetRecorder()-&gt;RecordCreateBuffer(</div>
-<div class="line"><a name="l18809"></a><span class="lineno">18809</span>&#160;                allocator-&gt;GetCurrentFrameIndex(),</div>
-<div class="line"><a name="l18810"></a><span class="lineno">18810</span>&#160;                *pBufferCreateInfo,</div>
-<div class="line"><a name="l18811"></a><span class="lineno">18811</span>&#160;                *pAllocationCreateInfo,</div>
-<div class="line"><a name="l18812"></a><span class="lineno">18812</span>&#160;                *pAllocation);</div>
-<div class="line"><a name="l18813"></a><span class="lineno">18813</span>&#160;        }</div>
-<div class="line"><a name="l18814"></a><span class="lineno">18814</span>&#160;<span class="preprocessor">#endif</span></div>
+<div class="line"><a name="l18805"></a><span class="lineno">18805</span>&#160;VMA_CALL_PRE <span class="keywordtype">void</span> VMA_CALL_POST <a class="code" href="vk__mem__alloc_8h.html#a5fea5518972ae9094b1526cbcb19b05f">vmaFreeMemory</a>(</div>
+<div class="line"><a name="l18806"></a><span class="lineno">18806</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div>
+<div class="line"><a name="l18807"></a><span class="lineno">18807</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation)</div>
+<div class="line"><a name="l18808"></a><span class="lineno">18808</span>&#160;{</div>
+<div class="line"><a name="l18809"></a><span class="lineno">18809</span>&#160;    VMA_ASSERT(allocator);</div>
+<div class="line"><a name="l18810"></a><span class="lineno">18810</span>&#160; </div>
+<div class="line"><a name="l18811"></a><span class="lineno">18811</span>&#160;    <span class="keywordflow">if</span>(allocation == VK_NULL_HANDLE)</div>
+<div class="line"><a name="l18812"></a><span class="lineno">18812</span>&#160;    {</div>
+<div class="line"><a name="l18813"></a><span class="lineno">18813</span>&#160;        <span class="keywordflow">return</span>;</div>
+<div class="line"><a name="l18814"></a><span class="lineno">18814</span>&#160;    }</div>
 <div class="line"><a name="l18815"></a><span class="lineno">18815</span>&#160; </div>
-<div class="line"><a name="l18816"></a><span class="lineno">18816</span>&#160;        <span class="keywordflow">if</span>(res &gt;= 0)</div>
-<div class="line"><a name="l18817"></a><span class="lineno">18817</span>&#160;        {</div>
-<div class="line"><a name="l18818"></a><span class="lineno">18818</span>&#160;            <span class="comment">// 3. Bind buffer with memory.</span></div>
-<div class="line"><a name="l18819"></a><span class="lineno">18819</span>&#160;            <span class="keywordflow">if</span>((pAllocationCreateInfo-&gt;<a class="code" href="struct_vma_allocation_create_info.html#add09658ac14fe290ace25470ddd6d41b">flags</a> &amp; <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a2310568c62208af432724305fe29ccea">VMA_ALLOCATION_CREATE_DONT_BIND_BIT</a>) == 0)</div>
-<div class="line"><a name="l18820"></a><span class="lineno">18820</span>&#160;            {</div>
-<div class="line"><a name="l18821"></a><span class="lineno">18821</span>&#160;                res = allocator-&gt;BindBufferMemory(*pAllocation, 0, *pBuffer, VMA_NULL);</div>
-<div class="line"><a name="l18822"></a><span class="lineno">18822</span>&#160;            }</div>
-<div class="line"><a name="l18823"></a><span class="lineno">18823</span>&#160;            <span class="keywordflow">if</span>(res &gt;= 0)</div>
-<div class="line"><a name="l18824"></a><span class="lineno">18824</span>&#160;            {</div>
-<div class="line"><a name="l18825"></a><span class="lineno">18825</span>&#160;                <span class="comment">// All steps succeeded.</span></div>
-<div class="line"><a name="l18826"></a><span class="lineno">18826</span>&#160;<span class="preprocessor">                #if VMA_STATS_STRING_ENABLED</span></div>
-<div class="line"><a name="l18827"></a><span class="lineno">18827</span>&#160;                    (*pAllocation)-&gt;InitBufferImageUsage(pBufferCreateInfo-&gt;usage);</div>
-<div class="line"><a name="l18828"></a><span class="lineno">18828</span>&#160;<span class="preprocessor">                #endif</span></div>
-<div class="line"><a name="l18829"></a><span class="lineno">18829</span>&#160;                <span class="keywordflow">if</span>(pAllocationInfo != VMA_NULL)</div>
-<div class="line"><a name="l18830"></a><span class="lineno">18830</span>&#160;                {</div>
-<div class="line"><a name="l18831"></a><span class="lineno">18831</span>&#160;                    allocator-&gt;GetAllocationInfo(*pAllocation, pAllocationInfo);</div>
-<div class="line"><a name="l18832"></a><span class="lineno">18832</span>&#160;                }</div>
+<div class="line"><a name="l18816"></a><span class="lineno">18816</span>&#160;    VMA_DEBUG_LOG(<span class="stringliteral">&quot;vmaFreeMemory&quot;</span>);</div>
+<div class="line"><a name="l18817"></a><span class="lineno">18817</span>&#160; </div>
+<div class="line"><a name="l18818"></a><span class="lineno">18818</span>&#160;    VMA_DEBUG_GLOBAL_MUTEX_LOCK</div>
+<div class="line"><a name="l18819"></a><span class="lineno">18819</span>&#160; </div>
+<div class="line"><a name="l18820"></a><span class="lineno">18820</span>&#160;<span class="preprocessor">#if VMA_RECORDING_ENABLED</span></div>
+<div class="line"><a name="l18821"></a><span class="lineno">18821</span>&#160;    <span class="keywordflow">if</span>(allocator-&gt;GetRecorder() != VMA_NULL)</div>
+<div class="line"><a name="l18822"></a><span class="lineno">18822</span>&#160;    {</div>
+<div class="line"><a name="l18823"></a><span class="lineno">18823</span>&#160;        allocator-&gt;GetRecorder()-&gt;RecordFreeMemory(</div>
+<div class="line"><a name="l18824"></a><span class="lineno">18824</span>&#160;            allocator-&gt;GetCurrentFrameIndex(),</div>
+<div class="line"><a name="l18825"></a><span class="lineno">18825</span>&#160;            allocation);</div>
+<div class="line"><a name="l18826"></a><span class="lineno">18826</span>&#160;    }</div>
+<div class="line"><a name="l18827"></a><span class="lineno">18827</span>&#160;<span class="preprocessor">#endif</span></div>
+<div class="line"><a name="l18828"></a><span class="lineno">18828</span>&#160; </div>
+<div class="line"><a name="l18829"></a><span class="lineno">18829</span>&#160;    allocator-&gt;FreeMemory(</div>
+<div class="line"><a name="l18830"></a><span class="lineno">18830</span>&#160;        1, <span class="comment">// allocationCount</span></div>
+<div class="line"><a name="l18831"></a><span class="lineno">18831</span>&#160;        &amp;allocation);</div>
+<div class="line"><a name="l18832"></a><span class="lineno">18832</span>&#160;}</div>
 <div class="line"><a name="l18833"></a><span class="lineno">18833</span>&#160; </div>
-<div class="line"><a name="l18834"></a><span class="lineno">18834</span>&#160;                <span class="keywordflow">return</span> VK_SUCCESS;</div>
-<div class="line"><a name="l18835"></a><span class="lineno">18835</span>&#160;            }</div>
-<div class="line"><a name="l18836"></a><span class="lineno">18836</span>&#160;            allocator-&gt;FreeMemory(</div>
-<div class="line"><a name="l18837"></a><span class="lineno">18837</span>&#160;                1, <span class="comment">// allocationCount</span></div>
-<div class="line"><a name="l18838"></a><span class="lineno">18838</span>&#160;                pAllocation);</div>
-<div class="line"><a name="l18839"></a><span class="lineno">18839</span>&#160;            *pAllocation = VK_NULL_HANDLE;</div>
-<div class="line"><a name="l18840"></a><span class="lineno">18840</span>&#160;            (*allocator-&gt;GetVulkanFunctions().vkDestroyBuffer)(allocator-&gt;m_hDevice, *pBuffer, allocator-&gt;GetAllocationCallbacks());</div>
-<div class="line"><a name="l18841"></a><span class="lineno">18841</span>&#160;            *pBuffer = VK_NULL_HANDLE;</div>
-<div class="line"><a name="l18842"></a><span class="lineno">18842</span>&#160;            <span class="keywordflow">return</span> res;</div>
-<div class="line"><a name="l18843"></a><span class="lineno">18843</span>&#160;        }</div>
-<div class="line"><a name="l18844"></a><span class="lineno">18844</span>&#160;        (*allocator-&gt;GetVulkanFunctions().vkDestroyBuffer)(allocator-&gt;m_hDevice, *pBuffer, allocator-&gt;GetAllocationCallbacks());</div>
-<div class="line"><a name="l18845"></a><span class="lineno">18845</span>&#160;        *pBuffer = VK_NULL_HANDLE;</div>
-<div class="line"><a name="l18846"></a><span class="lineno">18846</span>&#160;        <span class="keywordflow">return</span> res;</div>
-<div class="line"><a name="l18847"></a><span class="lineno">18847</span>&#160;    }</div>
-<div class="line"><a name="l18848"></a><span class="lineno">18848</span>&#160;    <span class="keywordflow">return</span> res;</div>
-<div class="line"><a name="l18849"></a><span class="lineno">18849</span>&#160;}</div>
-<div class="line"><a name="l18850"></a><span class="lineno">18850</span>&#160; </div>
-<div class="line"><a name="l18851"></a><span class="lineno">18851</span>&#160;VMA_CALL_PRE <span class="keywordtype">void</span> VMA_CALL_POST <a class="code" href="vk__mem__alloc_8h.html#a0d9f4e4ba5bf9aab1f1c746387753d77">vmaDestroyBuffer</a>(</div>
-<div class="line"><a name="l18852"></a><span class="lineno">18852</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div>
-<div class="line"><a name="l18853"></a><span class="lineno">18853</span>&#160;    VkBuffer buffer,</div>
-<div class="line"><a name="l18854"></a><span class="lineno">18854</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation)</div>
-<div class="line"><a name="l18855"></a><span class="lineno">18855</span>&#160;{</div>
-<div class="line"><a name="l18856"></a><span class="lineno">18856</span>&#160;    VMA_ASSERT(allocator);</div>
-<div class="line"><a name="l18857"></a><span class="lineno">18857</span>&#160; </div>
-<div class="line"><a name="l18858"></a><span class="lineno">18858</span>&#160;    <span class="keywordflow">if</span>(buffer == VK_NULL_HANDLE &amp;&amp; allocation == VK_NULL_HANDLE)</div>
-<div class="line"><a name="l18859"></a><span class="lineno">18859</span>&#160;    {</div>
-<div class="line"><a name="l18860"></a><span class="lineno">18860</span>&#160;        <span class="keywordflow">return</span>;</div>
-<div class="line"><a name="l18861"></a><span class="lineno">18861</span>&#160;    }</div>
+<div class="line"><a name="l18834"></a><span class="lineno">18834</span>&#160;VMA_CALL_PRE <span class="keywordtype">void</span> VMA_CALL_POST <a class="code" href="vk__mem__alloc_8h.html#a834b1e4aef395c0a1d56a28e69a4a17e">vmaFreeMemoryPages</a>(</div>
+<div class="line"><a name="l18835"></a><span class="lineno">18835</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div>
+<div class="line"><a name="l18836"></a><span class="lineno">18836</span>&#160;    <span class="keywordtype">size_t</span> allocationCount,</div>
+<div class="line"><a name="l18837"></a><span class="lineno">18837</span>&#160;    <span class="keyword">const</span> <a class="code" href="struct_vma_allocation.html">VmaAllocation</a>* pAllocations)</div>
+<div class="line"><a name="l18838"></a><span class="lineno">18838</span>&#160;{</div>
+<div class="line"><a name="l18839"></a><span class="lineno">18839</span>&#160;    <span class="keywordflow">if</span>(allocationCount == 0)</div>
+<div class="line"><a name="l18840"></a><span class="lineno">18840</span>&#160;    {</div>
+<div class="line"><a name="l18841"></a><span class="lineno">18841</span>&#160;        <span class="keywordflow">return</span>;</div>
+<div class="line"><a name="l18842"></a><span class="lineno">18842</span>&#160;    }</div>
+<div class="line"><a name="l18843"></a><span class="lineno">18843</span>&#160; </div>
+<div class="line"><a name="l18844"></a><span class="lineno">18844</span>&#160;    VMA_ASSERT(allocator);</div>
+<div class="line"><a name="l18845"></a><span class="lineno">18845</span>&#160; </div>
+<div class="line"><a name="l18846"></a><span class="lineno">18846</span>&#160;    VMA_DEBUG_LOG(<span class="stringliteral">&quot;vmaFreeMemoryPages&quot;</span>);</div>
+<div class="line"><a name="l18847"></a><span class="lineno">18847</span>&#160; </div>
+<div class="line"><a name="l18848"></a><span class="lineno">18848</span>&#160;    VMA_DEBUG_GLOBAL_MUTEX_LOCK</div>
+<div class="line"><a name="l18849"></a><span class="lineno">18849</span>&#160; </div>
+<div class="line"><a name="l18850"></a><span class="lineno">18850</span>&#160;<span class="preprocessor">#if VMA_RECORDING_ENABLED</span></div>
+<div class="line"><a name="l18851"></a><span class="lineno">18851</span>&#160;    <span class="keywordflow">if</span>(allocator-&gt;GetRecorder() != VMA_NULL)</div>
+<div class="line"><a name="l18852"></a><span class="lineno">18852</span>&#160;    {</div>
+<div class="line"><a name="l18853"></a><span class="lineno">18853</span>&#160;        allocator-&gt;GetRecorder()-&gt;RecordFreeMemoryPages(</div>
+<div class="line"><a name="l18854"></a><span class="lineno">18854</span>&#160;            allocator-&gt;GetCurrentFrameIndex(),</div>
+<div class="line"><a name="l18855"></a><span class="lineno">18855</span>&#160;            (uint64_t)allocationCount,</div>
+<div class="line"><a name="l18856"></a><span class="lineno">18856</span>&#160;            pAllocations);</div>
+<div class="line"><a name="l18857"></a><span class="lineno">18857</span>&#160;    }</div>
+<div class="line"><a name="l18858"></a><span class="lineno">18858</span>&#160;<span class="preprocessor">#endif</span></div>
+<div class="line"><a name="l18859"></a><span class="lineno">18859</span>&#160; </div>
+<div class="line"><a name="l18860"></a><span class="lineno">18860</span>&#160;    allocator-&gt;FreeMemory(allocationCount, pAllocations);</div>
+<div class="line"><a name="l18861"></a><span class="lineno">18861</span>&#160;}</div>
 <div class="line"><a name="l18862"></a><span class="lineno">18862</span>&#160; </div>
-<div class="line"><a name="l18863"></a><span class="lineno">18863</span>&#160;    VMA_DEBUG_LOG(<span class="stringliteral">&quot;vmaDestroyBuffer&quot;</span>);</div>
-<div class="line"><a name="l18864"></a><span class="lineno">18864</span>&#160; </div>
-<div class="line"><a name="l18865"></a><span class="lineno">18865</span>&#160;    VMA_DEBUG_GLOBAL_MUTEX_LOCK</div>
-<div class="line"><a name="l18866"></a><span class="lineno">18866</span>&#160; </div>
-<div class="line"><a name="l18867"></a><span class="lineno">18867</span>&#160;<span class="preprocessor">#if VMA_RECORDING_ENABLED</span></div>
-<div class="line"><a name="l18868"></a><span class="lineno">18868</span>&#160;    <span class="keywordflow">if</span>(allocator-&gt;GetRecorder() != VMA_NULL)</div>
-<div class="line"><a name="l18869"></a><span class="lineno">18869</span>&#160;    {</div>
-<div class="line"><a name="l18870"></a><span class="lineno">18870</span>&#160;        allocator-&gt;GetRecorder()-&gt;RecordDestroyBuffer(</div>
-<div class="line"><a name="l18871"></a><span class="lineno">18871</span>&#160;            allocator-&gt;GetCurrentFrameIndex(),</div>
-<div class="line"><a name="l18872"></a><span class="lineno">18872</span>&#160;            allocation);</div>
-<div class="line"><a name="l18873"></a><span class="lineno">18873</span>&#160;    }</div>
-<div class="line"><a name="l18874"></a><span class="lineno">18874</span>&#160;<span class="preprocessor">#endif</span></div>
-<div class="line"><a name="l18875"></a><span class="lineno">18875</span>&#160; </div>
-<div class="line"><a name="l18876"></a><span class="lineno">18876</span>&#160;    <span class="keywordflow">if</span>(buffer != VK_NULL_HANDLE)</div>
-<div class="line"><a name="l18877"></a><span class="lineno">18877</span>&#160;    {</div>
-<div class="line"><a name="l18878"></a><span class="lineno">18878</span>&#160;        (*allocator-&gt;GetVulkanFunctions().vkDestroyBuffer)(allocator-&gt;m_hDevice, buffer, allocator-&gt;GetAllocationCallbacks());</div>
-<div class="line"><a name="l18879"></a><span class="lineno">18879</span>&#160;    }</div>
+<div class="line"><a name="l18863"></a><span class="lineno">18863</span>&#160;VMA_CALL_PRE <span class="keywordtype">void</span> VMA_CALL_POST <a class="code" href="vk__mem__alloc_8h.html#a86dd08aba8633bfa4ad0df2e76481d8b">vmaGetAllocationInfo</a>(</div>
+<div class="line"><a name="l18864"></a><span class="lineno">18864</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div>
+<div class="line"><a name="l18865"></a><span class="lineno">18865</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation,</div>
+<div class="line"><a name="l18866"></a><span class="lineno">18866</span>&#160;    <a class="code" href="struct_vma_allocation_info.html">VmaAllocationInfo</a>* pAllocationInfo)</div>
+<div class="line"><a name="l18867"></a><span class="lineno">18867</span>&#160;{</div>
+<div class="line"><a name="l18868"></a><span class="lineno">18868</span>&#160;    VMA_ASSERT(allocator &amp;&amp; allocation &amp;&amp; pAllocationInfo);</div>
+<div class="line"><a name="l18869"></a><span class="lineno">18869</span>&#160; </div>
+<div class="line"><a name="l18870"></a><span class="lineno">18870</span>&#160;    VMA_DEBUG_GLOBAL_MUTEX_LOCK</div>
+<div class="line"><a name="l18871"></a><span class="lineno">18871</span>&#160; </div>
+<div class="line"><a name="l18872"></a><span class="lineno">18872</span>&#160;<span class="preprocessor">#if VMA_RECORDING_ENABLED</span></div>
+<div class="line"><a name="l18873"></a><span class="lineno">18873</span>&#160;    <span class="keywordflow">if</span>(allocator-&gt;GetRecorder() != VMA_NULL)</div>
+<div class="line"><a name="l18874"></a><span class="lineno">18874</span>&#160;    {</div>
+<div class="line"><a name="l18875"></a><span class="lineno">18875</span>&#160;        allocator-&gt;GetRecorder()-&gt;RecordGetAllocationInfo(</div>
+<div class="line"><a name="l18876"></a><span class="lineno">18876</span>&#160;            allocator-&gt;GetCurrentFrameIndex(),</div>
+<div class="line"><a name="l18877"></a><span class="lineno">18877</span>&#160;            allocation);</div>
+<div class="line"><a name="l18878"></a><span class="lineno">18878</span>&#160;    }</div>
+<div class="line"><a name="l18879"></a><span class="lineno">18879</span>&#160;<span class="preprocessor">#endif</span></div>
 <div class="line"><a name="l18880"></a><span class="lineno">18880</span>&#160; </div>
-<div class="line"><a name="l18881"></a><span class="lineno">18881</span>&#160;    <span class="keywordflow">if</span>(allocation != VK_NULL_HANDLE)</div>
-<div class="line"><a name="l18882"></a><span class="lineno">18882</span>&#160;    {</div>
-<div class="line"><a name="l18883"></a><span class="lineno">18883</span>&#160;        allocator-&gt;FreeMemory(</div>
-<div class="line"><a name="l18884"></a><span class="lineno">18884</span>&#160;            1, <span class="comment">// allocationCount</span></div>
-<div class="line"><a name="l18885"></a><span class="lineno">18885</span>&#160;            &amp;allocation);</div>
-<div class="line"><a name="l18886"></a><span class="lineno">18886</span>&#160;    }</div>
-<div class="line"><a name="l18887"></a><span class="lineno">18887</span>&#160;}</div>
-<div class="line"><a name="l18888"></a><span class="lineno">18888</span>&#160; </div>
-<div class="line"><a name="l18889"></a><span class="lineno">18889</span>&#160;VMA_CALL_PRE VkResult VMA_CALL_POST <a class="code" href="vk__mem__alloc_8h.html#a02a94f25679275851a53e82eacbcfc73">vmaCreateImage</a>(</div>
-<div class="line"><a name="l18890"></a><span class="lineno">18890</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div>
-<div class="line"><a name="l18891"></a><span class="lineno">18891</span>&#160;    <span class="keyword">const</span> VkImageCreateInfo* pImageCreateInfo,</div>
-<div class="line"><a name="l18892"></a><span class="lineno">18892</span>&#160;    <span class="keyword">const</span> <a class="code" href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a>* pAllocationCreateInfo,</div>
-<div class="line"><a name="l18893"></a><span class="lineno">18893</span>&#160;    VkImage* pImage,</div>
-<div class="line"><a name="l18894"></a><span class="lineno">18894</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a>* pAllocation,</div>
-<div class="line"><a name="l18895"></a><span class="lineno">18895</span>&#160;    <a class="code" href="struct_vma_allocation_info.html">VmaAllocationInfo</a>* pAllocationInfo)</div>
-<div class="line"><a name="l18896"></a><span class="lineno">18896</span>&#160;{</div>
-<div class="line"><a name="l18897"></a><span class="lineno">18897</span>&#160;    VMA_ASSERT(allocator &amp;&amp; pImageCreateInfo &amp;&amp; pAllocationCreateInfo &amp;&amp; pImage &amp;&amp; pAllocation);</div>
-<div class="line"><a name="l18898"></a><span class="lineno">18898</span>&#160; </div>
-<div class="line"><a name="l18899"></a><span class="lineno">18899</span>&#160;    <span class="keywordflow">if</span>(pImageCreateInfo-&gt;extent.width == 0 ||</div>
-<div class="line"><a name="l18900"></a><span class="lineno">18900</span>&#160;        pImageCreateInfo-&gt;extent.height == 0 ||</div>
-<div class="line"><a name="l18901"></a><span class="lineno">18901</span>&#160;        pImageCreateInfo-&gt;extent.depth == 0 ||</div>
-<div class="line"><a name="l18902"></a><span class="lineno">18902</span>&#160;        pImageCreateInfo-&gt;mipLevels == 0 ||</div>
-<div class="line"><a name="l18903"></a><span class="lineno">18903</span>&#160;        pImageCreateInfo-&gt;arrayLayers == 0)</div>
-<div class="line"><a name="l18904"></a><span class="lineno">18904</span>&#160;    {</div>
-<div class="line"><a name="l18905"></a><span class="lineno">18905</span>&#160;        <span class="keywordflow">return</span> VK_ERROR_VALIDATION_FAILED_EXT;</div>
-<div class="line"><a name="l18906"></a><span class="lineno">18906</span>&#160;    }</div>
-<div class="line"><a name="l18907"></a><span class="lineno">18907</span>&#160; </div>
-<div class="line"><a name="l18908"></a><span class="lineno">18908</span>&#160;    VMA_DEBUG_LOG(<span class="stringliteral">&quot;vmaCreateImage&quot;</span>);</div>
-<div class="line"><a name="l18909"></a><span class="lineno">18909</span>&#160; </div>
-<div class="line"><a name="l18910"></a><span class="lineno">18910</span>&#160;    VMA_DEBUG_GLOBAL_MUTEX_LOCK</div>
-<div class="line"><a name="l18911"></a><span class="lineno">18911</span>&#160; </div>
-<div class="line"><a name="l18912"></a><span class="lineno">18912</span>&#160;    *pImage = VK_NULL_HANDLE;</div>
-<div class="line"><a name="l18913"></a><span class="lineno">18913</span>&#160;    *pAllocation = VK_NULL_HANDLE;</div>
+<div class="line"><a name="l18881"></a><span class="lineno">18881</span>&#160;    allocator-&gt;GetAllocationInfo(allocation, pAllocationInfo);</div>
+<div class="line"><a name="l18882"></a><span class="lineno">18882</span>&#160;}</div>
+<div class="line"><a name="l18883"></a><span class="lineno">18883</span>&#160; </div>
+<div class="line"><a name="l18884"></a><span class="lineno">18884</span>&#160;VMA_CALL_PRE VkBool32 VMA_CALL_POST <a class="code" href="vk__mem__alloc_8h.html#a43d8ba9673c846f049089a5029d5c73a">vmaTouchAllocation</a>(</div>
+<div class="line"><a name="l18885"></a><span class="lineno">18885</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div>
+<div class="line"><a name="l18886"></a><span class="lineno">18886</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation)</div>
+<div class="line"><a name="l18887"></a><span class="lineno">18887</span>&#160;{</div>
+<div class="line"><a name="l18888"></a><span class="lineno">18888</span>&#160;    VMA_ASSERT(allocator &amp;&amp; allocation);</div>
+<div class="line"><a name="l18889"></a><span class="lineno">18889</span>&#160; </div>
+<div class="line"><a name="l18890"></a><span class="lineno">18890</span>&#160;    VMA_DEBUG_GLOBAL_MUTEX_LOCK</div>
+<div class="line"><a name="l18891"></a><span class="lineno">18891</span>&#160; </div>
+<div class="line"><a name="l18892"></a><span class="lineno">18892</span>&#160;<span class="preprocessor">#if VMA_RECORDING_ENABLED</span></div>
+<div class="line"><a name="l18893"></a><span class="lineno">18893</span>&#160;    <span class="keywordflow">if</span>(allocator-&gt;GetRecorder() != VMA_NULL)</div>
+<div class="line"><a name="l18894"></a><span class="lineno">18894</span>&#160;    {</div>
+<div class="line"><a name="l18895"></a><span class="lineno">18895</span>&#160;        allocator-&gt;GetRecorder()-&gt;RecordTouchAllocation(</div>
+<div class="line"><a name="l18896"></a><span class="lineno">18896</span>&#160;            allocator-&gt;GetCurrentFrameIndex(),</div>
+<div class="line"><a name="l18897"></a><span class="lineno">18897</span>&#160;            allocation);</div>
+<div class="line"><a name="l18898"></a><span class="lineno">18898</span>&#160;    }</div>
+<div class="line"><a name="l18899"></a><span class="lineno">18899</span>&#160;<span class="preprocessor">#endif</span></div>
+<div class="line"><a name="l18900"></a><span class="lineno">18900</span>&#160; </div>
+<div class="line"><a name="l18901"></a><span class="lineno">18901</span>&#160;    <span class="keywordflow">return</span> allocator-&gt;TouchAllocation(allocation);</div>
+<div class="line"><a name="l18902"></a><span class="lineno">18902</span>&#160;}</div>
+<div class="line"><a name="l18903"></a><span class="lineno">18903</span>&#160; </div>
+<div class="line"><a name="l18904"></a><span class="lineno">18904</span>&#160;VMA_CALL_PRE <span class="keywordtype">void</span> VMA_CALL_POST <a class="code" href="vk__mem__alloc_8h.html#af9147d31ffc11d62fc187bde283ed14f">vmaSetAllocationUserData</a>(</div>
+<div class="line"><a name="l18905"></a><span class="lineno">18905</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div>
+<div class="line"><a name="l18906"></a><span class="lineno">18906</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation,</div>
+<div class="line"><a name="l18907"></a><span class="lineno">18907</span>&#160;    <span class="keywordtype">void</span>* pUserData)</div>
+<div class="line"><a name="l18908"></a><span class="lineno">18908</span>&#160;{</div>
+<div class="line"><a name="l18909"></a><span class="lineno">18909</span>&#160;    VMA_ASSERT(allocator &amp;&amp; allocation);</div>
+<div class="line"><a name="l18910"></a><span class="lineno">18910</span>&#160; </div>
+<div class="line"><a name="l18911"></a><span class="lineno">18911</span>&#160;    VMA_DEBUG_GLOBAL_MUTEX_LOCK</div>
+<div class="line"><a name="l18912"></a><span class="lineno">18912</span>&#160; </div>
+<div class="line"><a name="l18913"></a><span class="lineno">18913</span>&#160;    allocation-&gt;SetUserData(allocator, pUserData);</div>
 <div class="line"><a name="l18914"></a><span class="lineno">18914</span>&#160; </div>
-<div class="line"><a name="l18915"></a><span class="lineno">18915</span>&#160;    <span class="comment">// 1. Create VkImage.</span></div>
-<div class="line"><a name="l18916"></a><span class="lineno">18916</span>&#160;    VkResult res = (*allocator-&gt;GetVulkanFunctions().vkCreateImage)(</div>
-<div class="line"><a name="l18917"></a><span class="lineno">18917</span>&#160;        allocator-&gt;m_hDevice,</div>
-<div class="line"><a name="l18918"></a><span class="lineno">18918</span>&#160;        pImageCreateInfo,</div>
-<div class="line"><a name="l18919"></a><span class="lineno">18919</span>&#160;        allocator-&gt;GetAllocationCallbacks(),</div>
-<div class="line"><a name="l18920"></a><span class="lineno">18920</span>&#160;        pImage);</div>
-<div class="line"><a name="l18921"></a><span class="lineno">18921</span>&#160;    <span class="keywordflow">if</span>(res &gt;= 0)</div>
-<div class="line"><a name="l18922"></a><span class="lineno">18922</span>&#160;    {</div>
-<div class="line"><a name="l18923"></a><span class="lineno">18923</span>&#160;        VmaSuballocationType suballocType = pImageCreateInfo-&gt;tiling == VK_IMAGE_TILING_OPTIMAL ?</div>
-<div class="line"><a name="l18924"></a><span class="lineno">18924</span>&#160;            VMA_SUBALLOCATION_TYPE_IMAGE_OPTIMAL :</div>
-<div class="line"><a name="l18925"></a><span class="lineno">18925</span>&#160;            VMA_SUBALLOCATION_TYPE_IMAGE_LINEAR;</div>
-<div class="line"><a name="l18926"></a><span class="lineno">18926</span>&#160;        </div>
-<div class="line"><a name="l18927"></a><span class="lineno">18927</span>&#160;        <span class="comment">// 2. Allocate memory using allocator.</span></div>
-<div class="line"><a name="l18928"></a><span class="lineno">18928</span>&#160;        VkMemoryRequirements vkMemReq = {};</div>
-<div class="line"><a name="l18929"></a><span class="lineno">18929</span>&#160;        <span class="keywordtype">bool</span> requiresDedicatedAllocation = <span class="keyword">false</span>;</div>
-<div class="line"><a name="l18930"></a><span class="lineno">18930</span>&#160;        <span class="keywordtype">bool</span> prefersDedicatedAllocation  = <span class="keyword">false</span>;</div>
-<div class="line"><a name="l18931"></a><span class="lineno">18931</span>&#160;        allocator-&gt;GetImageMemoryRequirements(*pImage, vkMemReq,</div>
-<div class="line"><a name="l18932"></a><span class="lineno">18932</span>&#160;            requiresDedicatedAllocation, prefersDedicatedAllocation);</div>
+<div class="line"><a name="l18915"></a><span class="lineno">18915</span>&#160;<span class="preprocessor">#if VMA_RECORDING_ENABLED</span></div>
+<div class="line"><a name="l18916"></a><span class="lineno">18916</span>&#160;    <span class="keywordflow">if</span>(allocator-&gt;GetRecorder() != VMA_NULL)</div>
+<div class="line"><a name="l18917"></a><span class="lineno">18917</span>&#160;    {</div>
+<div class="line"><a name="l18918"></a><span class="lineno">18918</span>&#160;        allocator-&gt;GetRecorder()-&gt;RecordSetAllocationUserData(</div>
+<div class="line"><a name="l18919"></a><span class="lineno">18919</span>&#160;            allocator-&gt;GetCurrentFrameIndex(),</div>
+<div class="line"><a name="l18920"></a><span class="lineno">18920</span>&#160;            allocation,</div>
+<div class="line"><a name="l18921"></a><span class="lineno">18921</span>&#160;            pUserData);</div>
+<div class="line"><a name="l18922"></a><span class="lineno">18922</span>&#160;    }</div>
+<div class="line"><a name="l18923"></a><span class="lineno">18923</span>&#160;<span class="preprocessor">#endif</span></div>
+<div class="line"><a name="l18924"></a><span class="lineno">18924</span>&#160;}</div>
+<div class="line"><a name="l18925"></a><span class="lineno">18925</span>&#160; </div>
+<div class="line"><a name="l18926"></a><span class="lineno">18926</span>&#160;VMA_CALL_PRE <span class="keywordtype">void</span> VMA_CALL_POST <a class="code" href="vk__mem__alloc_8h.html#ae5c9657d9e94756269145b01c05d16f1">vmaCreateLostAllocation</a>(</div>
+<div class="line"><a name="l18927"></a><span class="lineno">18927</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div>
+<div class="line"><a name="l18928"></a><span class="lineno">18928</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a>* pAllocation)</div>
+<div class="line"><a name="l18929"></a><span class="lineno">18929</span>&#160;{</div>
+<div class="line"><a name="l18930"></a><span class="lineno">18930</span>&#160;    VMA_ASSERT(allocator &amp;&amp; pAllocation);</div>
+<div class="line"><a name="l18931"></a><span class="lineno">18931</span>&#160; </div>
+<div class="line"><a name="l18932"></a><span class="lineno">18932</span>&#160;    VMA_DEBUG_GLOBAL_MUTEX_LOCK;</div>
 <div class="line"><a name="l18933"></a><span class="lineno">18933</span>&#160; </div>
-<div class="line"><a name="l18934"></a><span class="lineno">18934</span>&#160;        res = allocator-&gt;AllocateMemory(</div>
-<div class="line"><a name="l18935"></a><span class="lineno">18935</span>&#160;            vkMemReq,</div>
-<div class="line"><a name="l18936"></a><span class="lineno">18936</span>&#160;            requiresDedicatedAllocation,</div>
-<div class="line"><a name="l18937"></a><span class="lineno">18937</span>&#160;            prefersDedicatedAllocation,</div>
-<div class="line"><a name="l18938"></a><span class="lineno">18938</span>&#160;            VK_NULL_HANDLE, <span class="comment">// dedicatedBuffer</span></div>
-<div class="line"><a name="l18939"></a><span class="lineno">18939</span>&#160;            UINT32_MAX, <span class="comment">// dedicatedBufferUsage</span></div>
-<div class="line"><a name="l18940"></a><span class="lineno">18940</span>&#160;            *pImage, <span class="comment">// dedicatedImage</span></div>
-<div class="line"><a name="l18941"></a><span class="lineno">18941</span>&#160;            *pAllocationCreateInfo,</div>
-<div class="line"><a name="l18942"></a><span class="lineno">18942</span>&#160;            suballocType,</div>
-<div class="line"><a name="l18943"></a><span class="lineno">18943</span>&#160;            1, <span class="comment">// allocationCount</span></div>
-<div class="line"><a name="l18944"></a><span class="lineno">18944</span>&#160;            pAllocation);</div>
+<div class="line"><a name="l18934"></a><span class="lineno">18934</span>&#160;    allocator-&gt;CreateLostAllocation(pAllocation);</div>
+<div class="line"><a name="l18935"></a><span class="lineno">18935</span>&#160; </div>
+<div class="line"><a name="l18936"></a><span class="lineno">18936</span>&#160;<span class="preprocessor">#if VMA_RECORDING_ENABLED</span></div>
+<div class="line"><a name="l18937"></a><span class="lineno">18937</span>&#160;    <span class="keywordflow">if</span>(allocator-&gt;GetRecorder() != VMA_NULL)</div>
+<div class="line"><a name="l18938"></a><span class="lineno">18938</span>&#160;    {</div>
+<div class="line"><a name="l18939"></a><span class="lineno">18939</span>&#160;        allocator-&gt;GetRecorder()-&gt;RecordCreateLostAllocation(</div>
+<div class="line"><a name="l18940"></a><span class="lineno">18940</span>&#160;            allocator-&gt;GetCurrentFrameIndex(),</div>
+<div class="line"><a name="l18941"></a><span class="lineno">18941</span>&#160;            *pAllocation);</div>
+<div class="line"><a name="l18942"></a><span class="lineno">18942</span>&#160;    }</div>
+<div class="line"><a name="l18943"></a><span class="lineno">18943</span>&#160;<span class="preprocessor">#endif</span></div>
+<div class="line"><a name="l18944"></a><span class="lineno">18944</span>&#160;}</div>
 <div class="line"><a name="l18945"></a><span class="lineno">18945</span>&#160; </div>
-<div class="line"><a name="l18946"></a><span class="lineno">18946</span>&#160;<span class="preprocessor">#if VMA_RECORDING_ENABLED</span></div>
-<div class="line"><a name="l18947"></a><span class="lineno">18947</span>&#160;        <span class="keywordflow">if</span>(allocator-&gt;GetRecorder() != VMA_NULL)</div>
-<div class="line"><a name="l18948"></a><span class="lineno">18948</span>&#160;        {</div>
-<div class="line"><a name="l18949"></a><span class="lineno">18949</span>&#160;            allocator-&gt;GetRecorder()-&gt;RecordCreateImage(</div>
-<div class="line"><a name="l18950"></a><span class="lineno">18950</span>&#160;                allocator-&gt;GetCurrentFrameIndex(),</div>
-<div class="line"><a name="l18951"></a><span class="lineno">18951</span>&#160;                *pImageCreateInfo,</div>
-<div class="line"><a name="l18952"></a><span class="lineno">18952</span>&#160;                *pAllocationCreateInfo,</div>
-<div class="line"><a name="l18953"></a><span class="lineno">18953</span>&#160;                *pAllocation);</div>
-<div class="line"><a name="l18954"></a><span class="lineno">18954</span>&#160;        }</div>
-<div class="line"><a name="l18955"></a><span class="lineno">18955</span>&#160;<span class="preprocessor">#endif</span></div>
+<div class="line"><a name="l18946"></a><span class="lineno">18946</span>&#160;VMA_CALL_PRE VkResult VMA_CALL_POST <a class="code" href="vk__mem__alloc_8h.html#ad5bd1243512d099706de88168992f069">vmaMapMemory</a>(</div>
+<div class="line"><a name="l18947"></a><span class="lineno">18947</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div>
+<div class="line"><a name="l18948"></a><span class="lineno">18948</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation,</div>
+<div class="line"><a name="l18949"></a><span class="lineno">18949</span>&#160;    <span class="keywordtype">void</span>** ppData)</div>
+<div class="line"><a name="l18950"></a><span class="lineno">18950</span>&#160;{</div>
+<div class="line"><a name="l18951"></a><span class="lineno">18951</span>&#160;    VMA_ASSERT(allocator &amp;&amp; allocation &amp;&amp; ppData);</div>
+<div class="line"><a name="l18952"></a><span class="lineno">18952</span>&#160; </div>
+<div class="line"><a name="l18953"></a><span class="lineno">18953</span>&#160;    VMA_DEBUG_GLOBAL_MUTEX_LOCK</div>
+<div class="line"><a name="l18954"></a><span class="lineno">18954</span>&#160; </div>
+<div class="line"><a name="l18955"></a><span class="lineno">18955</span>&#160;    VkResult res = allocator-&gt;Map(allocation, ppData);</div>
 <div class="line"><a name="l18956"></a><span class="lineno">18956</span>&#160; </div>
-<div class="line"><a name="l18957"></a><span class="lineno">18957</span>&#160;        <span class="keywordflow">if</span>(res &gt;= 0)</div>
-<div class="line"><a name="l18958"></a><span class="lineno">18958</span>&#160;        {</div>
-<div class="line"><a name="l18959"></a><span class="lineno">18959</span>&#160;            <span class="comment">// 3. Bind image with memory.</span></div>
-<div class="line"><a name="l18960"></a><span class="lineno">18960</span>&#160;            <span class="keywordflow">if</span>((pAllocationCreateInfo-&gt;<a class="code" href="struct_vma_allocation_create_info.html#add09658ac14fe290ace25470ddd6d41b">flags</a> &amp; <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a2310568c62208af432724305fe29ccea">VMA_ALLOCATION_CREATE_DONT_BIND_BIT</a>) == 0)</div>
-<div class="line"><a name="l18961"></a><span class="lineno">18961</span>&#160;            {</div>
-<div class="line"><a name="l18962"></a><span class="lineno">18962</span>&#160;                res = allocator-&gt;BindImageMemory(*pAllocation, 0, *pImage, VMA_NULL);</div>
-<div class="line"><a name="l18963"></a><span class="lineno">18963</span>&#160;            }</div>
-<div class="line"><a name="l18964"></a><span class="lineno">18964</span>&#160;            <span class="keywordflow">if</span>(res &gt;= 0)</div>
-<div class="line"><a name="l18965"></a><span class="lineno">18965</span>&#160;            {</div>
-<div class="line"><a name="l18966"></a><span class="lineno">18966</span>&#160;                <span class="comment">// All steps succeeded.</span></div>
-<div class="line"><a name="l18967"></a><span class="lineno">18967</span>&#160;<span class="preprocessor">                #if VMA_STATS_STRING_ENABLED</span></div>
-<div class="line"><a name="l18968"></a><span class="lineno">18968</span>&#160;                    (*pAllocation)-&gt;InitBufferImageUsage(pImageCreateInfo-&gt;usage);</div>
-<div class="line"><a name="l18969"></a><span class="lineno">18969</span>&#160;<span class="preprocessor">                #endif</span></div>
-<div class="line"><a name="l18970"></a><span class="lineno">18970</span>&#160;                <span class="keywordflow">if</span>(pAllocationInfo != VMA_NULL)</div>
-<div class="line"><a name="l18971"></a><span class="lineno">18971</span>&#160;                {</div>
-<div class="line"><a name="l18972"></a><span class="lineno">18972</span>&#160;                    allocator-&gt;GetAllocationInfo(*pAllocation, pAllocationInfo);</div>
-<div class="line"><a name="l18973"></a><span class="lineno">18973</span>&#160;                }</div>
+<div class="line"><a name="l18957"></a><span class="lineno">18957</span>&#160;<span class="preprocessor">#if VMA_RECORDING_ENABLED</span></div>
+<div class="line"><a name="l18958"></a><span class="lineno">18958</span>&#160;    <span class="keywordflow">if</span>(allocator-&gt;GetRecorder() != VMA_NULL)</div>
+<div class="line"><a name="l18959"></a><span class="lineno">18959</span>&#160;    {</div>
+<div class="line"><a name="l18960"></a><span class="lineno">18960</span>&#160;        allocator-&gt;GetRecorder()-&gt;RecordMapMemory(</div>
+<div class="line"><a name="l18961"></a><span class="lineno">18961</span>&#160;            allocator-&gt;GetCurrentFrameIndex(),</div>
+<div class="line"><a name="l18962"></a><span class="lineno">18962</span>&#160;            allocation);</div>
+<div class="line"><a name="l18963"></a><span class="lineno">18963</span>&#160;    }</div>
+<div class="line"><a name="l18964"></a><span class="lineno">18964</span>&#160;<span class="preprocessor">#endif</span></div>
+<div class="line"><a name="l18965"></a><span class="lineno">18965</span>&#160; </div>
+<div class="line"><a name="l18966"></a><span class="lineno">18966</span>&#160;    <span class="keywordflow">return</span> res;</div>
+<div class="line"><a name="l18967"></a><span class="lineno">18967</span>&#160;}</div>
+<div class="line"><a name="l18968"></a><span class="lineno">18968</span>&#160; </div>
+<div class="line"><a name="l18969"></a><span class="lineno">18969</span>&#160;VMA_CALL_PRE <span class="keywordtype">void</span> VMA_CALL_POST <a class="code" href="vk__mem__alloc_8h.html#a9bc268595cb33f6ec4d519cfce81ff45">vmaUnmapMemory</a>(</div>
+<div class="line"><a name="l18970"></a><span class="lineno">18970</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div>
+<div class="line"><a name="l18971"></a><span class="lineno">18971</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation)</div>
+<div class="line"><a name="l18972"></a><span class="lineno">18972</span>&#160;{</div>
+<div class="line"><a name="l18973"></a><span class="lineno">18973</span>&#160;    VMA_ASSERT(allocator &amp;&amp; allocation);</div>
 <div class="line"><a name="l18974"></a><span class="lineno">18974</span>&#160; </div>
-<div class="line"><a name="l18975"></a><span class="lineno">18975</span>&#160;                <span class="keywordflow">return</span> VK_SUCCESS;</div>
-<div class="line"><a name="l18976"></a><span class="lineno">18976</span>&#160;            }</div>
-<div class="line"><a name="l18977"></a><span class="lineno">18977</span>&#160;            allocator-&gt;FreeMemory(</div>
-<div class="line"><a name="l18978"></a><span class="lineno">18978</span>&#160;                1, <span class="comment">// allocationCount</span></div>
-<div class="line"><a name="l18979"></a><span class="lineno">18979</span>&#160;                pAllocation);</div>
-<div class="line"><a name="l18980"></a><span class="lineno">18980</span>&#160;            *pAllocation = VK_NULL_HANDLE;</div>
-<div class="line"><a name="l18981"></a><span class="lineno">18981</span>&#160;            (*allocator-&gt;GetVulkanFunctions().vkDestroyImage)(allocator-&gt;m_hDevice, *pImage, allocator-&gt;GetAllocationCallbacks());</div>
-<div class="line"><a name="l18982"></a><span class="lineno">18982</span>&#160;            *pImage = VK_NULL_HANDLE;</div>
-<div class="line"><a name="l18983"></a><span class="lineno">18983</span>&#160;            <span class="keywordflow">return</span> res;</div>
-<div class="line"><a name="l18984"></a><span class="lineno">18984</span>&#160;        }</div>
-<div class="line"><a name="l18985"></a><span class="lineno">18985</span>&#160;        (*allocator-&gt;GetVulkanFunctions().vkDestroyImage)(allocator-&gt;m_hDevice, *pImage, allocator-&gt;GetAllocationCallbacks());</div>
-<div class="line"><a name="l18986"></a><span class="lineno">18986</span>&#160;        *pImage = VK_NULL_HANDLE;</div>
-<div class="line"><a name="l18987"></a><span class="lineno">18987</span>&#160;        <span class="keywordflow">return</span> res;</div>
-<div class="line"><a name="l18988"></a><span class="lineno">18988</span>&#160;    }</div>
-<div class="line"><a name="l18989"></a><span class="lineno">18989</span>&#160;    <span class="keywordflow">return</span> res;</div>
-<div class="line"><a name="l18990"></a><span class="lineno">18990</span>&#160;}</div>
-<div class="line"><a name="l18991"></a><span class="lineno">18991</span>&#160; </div>
-<div class="line"><a name="l18992"></a><span class="lineno">18992</span>&#160;VMA_CALL_PRE <span class="keywordtype">void</span> VMA_CALL_POST <a class="code" href="vk__mem__alloc_8h.html#ae50d2cb3b4a3bfd4dd40987234e50e7e">vmaDestroyImage</a>(</div>
-<div class="line"><a name="l18993"></a><span class="lineno">18993</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div>
-<div class="line"><a name="l18994"></a><span class="lineno">18994</span>&#160;    VkImage image,</div>
-<div class="line"><a name="l18995"></a><span class="lineno">18995</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation)</div>
-<div class="line"><a name="l18996"></a><span class="lineno">18996</span>&#160;{</div>
-<div class="line"><a name="l18997"></a><span class="lineno">18997</span>&#160;    VMA_ASSERT(allocator);</div>
+<div class="line"><a name="l18975"></a><span class="lineno">18975</span>&#160;    VMA_DEBUG_GLOBAL_MUTEX_LOCK</div>
+<div class="line"><a name="l18976"></a><span class="lineno">18976</span>&#160; </div>
+<div class="line"><a name="l18977"></a><span class="lineno">18977</span>&#160;<span class="preprocessor">#if VMA_RECORDING_ENABLED</span></div>
+<div class="line"><a name="l18978"></a><span class="lineno">18978</span>&#160;    <span class="keywordflow">if</span>(allocator-&gt;GetRecorder() != VMA_NULL)</div>
+<div class="line"><a name="l18979"></a><span class="lineno">18979</span>&#160;    {</div>
+<div class="line"><a name="l18980"></a><span class="lineno">18980</span>&#160;        allocator-&gt;GetRecorder()-&gt;RecordUnmapMemory(</div>
+<div class="line"><a name="l18981"></a><span class="lineno">18981</span>&#160;            allocator-&gt;GetCurrentFrameIndex(),</div>
+<div class="line"><a name="l18982"></a><span class="lineno">18982</span>&#160;            allocation);</div>
+<div class="line"><a name="l18983"></a><span class="lineno">18983</span>&#160;    }</div>
+<div class="line"><a name="l18984"></a><span class="lineno">18984</span>&#160;<span class="preprocessor">#endif</span></div>
+<div class="line"><a name="l18985"></a><span class="lineno">18985</span>&#160; </div>
+<div class="line"><a name="l18986"></a><span class="lineno">18986</span>&#160;    allocator-&gt;Unmap(allocation);</div>
+<div class="line"><a name="l18987"></a><span class="lineno">18987</span>&#160;}</div>
+<div class="line"><a name="l18988"></a><span class="lineno">18988</span>&#160; </div>
+<div class="line"><a name="l18989"></a><span class="lineno">18989</span>&#160;VMA_CALL_PRE VkResult VMA_CALL_POST <a class="code" href="vk__mem__alloc_8h.html#a30c37c1eec6025f397be41644f48490f">vmaFlushAllocation</a>(<a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator, <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation, VkDeviceSize offset, VkDeviceSize size)</div>
+<div class="line"><a name="l18990"></a><span class="lineno">18990</span>&#160;{</div>
+<div class="line"><a name="l18991"></a><span class="lineno">18991</span>&#160;    VMA_ASSERT(allocator &amp;&amp; allocation);</div>
+<div class="line"><a name="l18992"></a><span class="lineno">18992</span>&#160; </div>
+<div class="line"><a name="l18993"></a><span class="lineno">18993</span>&#160;    VMA_DEBUG_LOG(<span class="stringliteral">&quot;vmaFlushAllocation&quot;</span>);</div>
+<div class="line"><a name="l18994"></a><span class="lineno">18994</span>&#160; </div>
+<div class="line"><a name="l18995"></a><span class="lineno">18995</span>&#160;    VMA_DEBUG_GLOBAL_MUTEX_LOCK</div>
+<div class="line"><a name="l18996"></a><span class="lineno">18996</span>&#160; </div>
+<div class="line"><a name="l18997"></a><span class="lineno">18997</span>&#160;    <span class="keyword">const</span> VkResult res = allocator-&gt;FlushOrInvalidateAllocation(allocation, offset, size, VMA_CACHE_FLUSH);</div>
 <div class="line"><a name="l18998"></a><span class="lineno">18998</span>&#160; </div>
-<div class="line"><a name="l18999"></a><span class="lineno">18999</span>&#160;    <span class="keywordflow">if</span>(image == VK_NULL_HANDLE &amp;&amp; allocation == VK_NULL_HANDLE)</div>
-<div class="line"><a name="l19000"></a><span class="lineno">19000</span>&#160;    {</div>
-<div class="line"><a name="l19001"></a><span class="lineno">19001</span>&#160;        <span class="keywordflow">return</span>;</div>
-<div class="line"><a name="l19002"></a><span class="lineno">19002</span>&#160;    }</div>
-<div class="line"><a name="l19003"></a><span class="lineno">19003</span>&#160; </div>
-<div class="line"><a name="l19004"></a><span class="lineno">19004</span>&#160;    VMA_DEBUG_LOG(<span class="stringliteral">&quot;vmaDestroyImage&quot;</span>);</div>
-<div class="line"><a name="l19005"></a><span class="lineno">19005</span>&#160; </div>
-<div class="line"><a name="l19006"></a><span class="lineno">19006</span>&#160;    VMA_DEBUG_GLOBAL_MUTEX_LOCK</div>
+<div class="line"><a name="l18999"></a><span class="lineno">18999</span>&#160;<span class="preprocessor">#if VMA_RECORDING_ENABLED</span></div>
+<div class="line"><a name="l19000"></a><span class="lineno">19000</span>&#160;    <span class="keywordflow">if</span>(allocator-&gt;GetRecorder() != VMA_NULL)</div>
+<div class="line"><a name="l19001"></a><span class="lineno">19001</span>&#160;    {</div>
+<div class="line"><a name="l19002"></a><span class="lineno">19002</span>&#160;        allocator-&gt;GetRecorder()-&gt;RecordFlushAllocation(</div>
+<div class="line"><a name="l19003"></a><span class="lineno">19003</span>&#160;            allocator-&gt;GetCurrentFrameIndex(),</div>
+<div class="line"><a name="l19004"></a><span class="lineno">19004</span>&#160;            allocation, offset, size);</div>
+<div class="line"><a name="l19005"></a><span class="lineno">19005</span>&#160;    }</div>
+<div class="line"><a name="l19006"></a><span class="lineno">19006</span>&#160;<span class="preprocessor">#endif</span></div>
 <div class="line"><a name="l19007"></a><span class="lineno">19007</span>&#160; </div>
-<div class="line"><a name="l19008"></a><span class="lineno">19008</span>&#160;<span class="preprocessor">#if VMA_RECORDING_ENABLED</span></div>
-<div class="line"><a name="l19009"></a><span class="lineno">19009</span>&#160;    <span class="keywordflow">if</span>(allocator-&gt;GetRecorder() != VMA_NULL)</div>
-<div class="line"><a name="l19010"></a><span class="lineno">19010</span>&#160;    {</div>
-<div class="line"><a name="l19011"></a><span class="lineno">19011</span>&#160;        allocator-&gt;GetRecorder()-&gt;RecordDestroyImage(</div>
-<div class="line"><a name="l19012"></a><span class="lineno">19012</span>&#160;            allocator-&gt;GetCurrentFrameIndex(),</div>
-<div class="line"><a name="l19013"></a><span class="lineno">19013</span>&#160;            allocation);</div>
-<div class="line"><a name="l19014"></a><span class="lineno">19014</span>&#160;    }</div>
-<div class="line"><a name="l19015"></a><span class="lineno">19015</span>&#160;<span class="preprocessor">#endif</span></div>
+<div class="line"><a name="l19008"></a><span class="lineno">19008</span>&#160;    <span class="keywordflow">return</span> res;</div>
+<div class="line"><a name="l19009"></a><span class="lineno">19009</span>&#160;}</div>
+<div class="line"><a name="l19010"></a><span class="lineno">19010</span>&#160; </div>
+<div class="line"><a name="l19011"></a><span class="lineno">19011</span>&#160;VMA_CALL_PRE VkResult VMA_CALL_POST <a class="code" href="vk__mem__alloc_8h.html#aaa8412919139ef413a4215ac6a290fae">vmaInvalidateAllocation</a>(<a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator, <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation, VkDeviceSize offset, VkDeviceSize size)</div>
+<div class="line"><a name="l19012"></a><span class="lineno">19012</span>&#160;{</div>
+<div class="line"><a name="l19013"></a><span class="lineno">19013</span>&#160;    VMA_ASSERT(allocator &amp;&amp; allocation);</div>
+<div class="line"><a name="l19014"></a><span class="lineno">19014</span>&#160; </div>
+<div class="line"><a name="l19015"></a><span class="lineno">19015</span>&#160;    VMA_DEBUG_LOG(<span class="stringliteral">&quot;vmaInvalidateAllocation&quot;</span>);</div>
 <div class="line"><a name="l19016"></a><span class="lineno">19016</span>&#160; </div>
-<div class="line"><a name="l19017"></a><span class="lineno">19017</span>&#160;    <span class="keywordflow">if</span>(image != VK_NULL_HANDLE)</div>
-<div class="line"><a name="l19018"></a><span class="lineno">19018</span>&#160;    {</div>
-<div class="line"><a name="l19019"></a><span class="lineno">19019</span>&#160;        (*allocator-&gt;GetVulkanFunctions().vkDestroyImage)(allocator-&gt;m_hDevice, image, allocator-&gt;GetAllocationCallbacks());</div>
-<div class="line"><a name="l19020"></a><span class="lineno">19020</span>&#160;    }</div>
-<div class="line"><a name="l19021"></a><span class="lineno">19021</span>&#160;    <span class="keywordflow">if</span>(allocation != VK_NULL_HANDLE)</div>
-<div class="line"><a name="l19022"></a><span class="lineno">19022</span>&#160;    {</div>
-<div class="line"><a name="l19023"></a><span class="lineno">19023</span>&#160;        allocator-&gt;FreeMemory(</div>
-<div class="line"><a name="l19024"></a><span class="lineno">19024</span>&#160;            1, <span class="comment">// allocationCount</span></div>
-<div class="line"><a name="l19025"></a><span class="lineno">19025</span>&#160;            &amp;allocation);</div>
-<div class="line"><a name="l19026"></a><span class="lineno">19026</span>&#160;    }</div>
-<div class="line"><a name="l19027"></a><span class="lineno">19027</span>&#160;}</div>
-<div class="line"><a name="l19028"></a><span class="lineno">19028</span>&#160; </div>
-<div class="line"><a name="l19029"></a><span class="lineno">19029</span>&#160;<span class="preprocessor">#endif // #ifdef VMA_IMPLEMENTATION</span></div>
-</div><!-- fragment --></div><!-- contents -->
-<div class="ttc" id="avk__mem__alloc_8h_html_a21813b2efdf3836767a9058cd8a94034"><div class="ttname"><a href="vk__mem__alloc_8h.html#a21813b2efdf3836767a9058cd8a94034">VmaStats</a></div><div class="ttdeci">struct VmaStats VmaStats</div><div class="ttdoc">General statistics from current state of Allocator.</div></div>
-<div class="ttc" id="astruct_vma_record_settings_html"><div class="ttname"><a href="struct_vma_record_settings.html">VmaRecordSettings</a></div><div class="ttdoc">Parameters for recording calls to VMA functions. To be used in VmaAllocatorCreateInfo::pRecordSetting...</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2254</div></div>
-<div class="ttc" id="astruct_vma_vulkan_functions_html_a2943bf99dfd784a0e8f599d987e22e6c"><div class="ttname"><a href="struct_vma_vulkan_functions.html#a2943bf99dfd784a0e8f599d987e22e6c">VmaVulkanFunctions::vkAllocateMemory</a></div><div class="ttdeci">PFN_vkAllocateMemory vkAllocateMemory</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2211</div></div>
-<div class="ttc" id="astruct_vma_device_memory_callbacks_html_abe8a3328bbc916f6f712fdb6b299444c"><div class="ttname"><a href="struct_vma_device_memory_callbacks.html#abe8a3328bbc916f6f712fdb6b299444c">VmaDeviceMemoryCallbacks::pfnFree</a></div><div class="ttdeci">PFN_vmaFreeDeviceMemoryFunction pfnFree</div><div class="ttdoc">Optional, can be null.</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2099</div></div>
-<div class="ttc" id="avk__mem__alloc_8h_html_a4dd2c44642312a147a4e93373a6e64d2a20dd17d69966dbffa054739d6090b85e"><div class="ttname"><a href="vk__mem__alloc_8h.html#a4dd2c44642312a147a4e93373a6e64d2a20dd17d69966dbffa054739d6090b85e">VMA_RECORD_FLAG_BITS_MAX_ENUM</a></div><div class="ttdeci">@ VMA_RECORD_FLAG_BITS_MAX_ENUM</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2248</div></div>
-<div class="ttc" id="astruct_vma_vulkan_functions_html_a77b7a74082823e865dd6546623468f96"><div class="ttname"><a href="struct_vma_vulkan_functions.html#a77b7a74082823e865dd6546623468f96">VmaVulkanFunctions::vkGetPhysicalDeviceProperties</a></div><div class="ttdeci">PFN_vkGetPhysicalDeviceProperties vkGetPhysicalDeviceProperties</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2209</div></div>
-<div class="ttc" id="astruct_vma_allocator_create_info_html_a08230f04ae6ccf8a78150a9e829a7156"><div class="ttname"><a href="struct_vma_allocator_create_info.html#a08230f04ae6ccf8a78150a9e829a7156">VmaAllocatorCreateInfo::physicalDevice</a></div><div class="ttdeci">VkPhysicalDevice physicalDevice</div><div class="ttdoc">Vulkan physical device.</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2274</div></div>
-<div class="ttc" id="avk__mem__alloc_8h_html_a9a7c45f9c863695d98c83fa5ac940fe7a13c8a444197c67866be9cb05599fc726"><div class="ttname"><a href="vk__mem__alloc_8h.html#a9a7c45f9c863695d98c83fa5ac940fe7a13c8a444197c67866be9cb05599fc726">VMA_POOL_CREATE_LINEAR_ALGORITHM_BIT</a></div><div class="ttdeci">@ VMA_POOL_CREATE_LINEAR_ALGORITHM_BIT</div><div class="ttdoc">Enables alternative, linear allocation algorithm in this pool.</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2871</div></div>
-<div class="ttc" id="astruct_vma_defragmentation_info2_html_a3cf86ab32c1da779b4923d301a3056ba"><div class="ttname"><a href="struct_vma_defragmentation_info2.html#a3cf86ab32c1da779b4923d301a3056ba">VmaDefragmentationInfo2::allocationCount</a></div><div class="ttdeci">uint32_t allocationCount</div><div class="ttdoc">Number of allocations in pAllocations array.</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:3478</div></div>
-<div class="ttc" id="astruct_vma_allocator_create_info_html_a21ea188dd212b8171cb9ecbed4a2a3a7"><div class="ttname"><a href="struct_vma_allocator_create_info.html#a21ea188dd212b8171cb9ecbed4a2a3a7">VmaAllocatorCreateInfo::frameInUseCount</a></div><div class="ttdeci">uint32_t frameInUseCount</div><div class="ttdoc">Maximum number of additional frames that are in use at the same time as current frame.</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2300</div></div>
-<div class="ttc" id="avk__mem__alloc_8h_html_a4f87c9100d154a65a4ad495f7763cf7ca4d4687863f7bd4b418c6006dc04400b0"><div class="ttname"><a href="vk__mem__alloc_8h.html#a4f87c9100d154a65a4ad495f7763cf7ca4d4687863f7bd4b418c6006dc04400b0">VMA_ALLOCATOR_CREATE_EXT_MEMORY_BUDGET_BIT</a></div><div class="ttdeci">@ VMA_ALLOCATOR_CREATE_EXT_MEMORY_BUDGET_BIT</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2162</div></div>
-<div class="ttc" id="astruct_vma_budget_html"><div class="ttname"><a href="struct_vma_budget.html">VmaBudget</a></div><div class="ttdoc">Statistics of current memory usage and available budget, in bytes, for specific memory heap.</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2473</div></div>
-<div class="ttc" id="astruct_vma_defragmentation_pass_move_info_html_a06eb0c8690aa0d3478a036753492e769"><div class="ttname"><a href="struct_vma_defragmentation_pass_move_info.html#a06eb0c8690aa0d3478a036753492e769">VmaDefragmentationPassMoveInfo::memory</a></div><div class="ttdeci">VkDeviceMemory memory</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:3546</div></div>
-<div class="ttc" id="astruct_vma_defragmentation_info2_html_a3c9c6aa5c97d5670f8e362b3a6f3029b"><div class="ttname"><a href="struct_vma_defragmentation_info2.html#a3c9c6aa5c97d5670f8e362b3a6f3029b">VmaDefragmentationInfo2::pPools</a></div><div class="ttdeci">const VmaPool * pPools</div><div class="ttdoc">Either null or pointer to array of pools to be defragmented.</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:3512</div></div>
-<div class="ttc" id="avk__mem__alloc_8h_html_aa5846affa1e9da3800e3e78fae2305cca835333d9072db63a653818030e17614d"><div class="ttname"><a href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305cca835333d9072db63a653818030e17614d">VMA_MEMORY_USAGE_GPU_LAZILY_ALLOCATED</a></div><div class="ttdeci">@ VMA_MEMORY_USAGE_GPU_LAZILY_ALLOCATED</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2617</div></div>
-<div class="ttc" id="avk__mem__alloc_8h_html_a2bf47f96bf92bed2a49461bd9af3acfa"><div class="ttname"><a href="vk__mem__alloc_8h.html#a2bf47f96bf92bed2a49461bd9af3acfa">VmaDefragmentationInfo</a></div><div class="ttdeci">struct VmaDefragmentationInfo VmaDefragmentationInfo</div><div class="ttdoc">Deprecated. Optional configuration parameters to be passed to function vmaDefragment().</div></div>
-<div class="ttc" id="astruct_vma_pool_stats_html"><div class="ttname"><a href="struct_vma_pool_stats.html">VmaPoolStats</a></div><div class="ttdoc">Describes parameter of existing VmaPool.</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2943</div></div>
-<div class="ttc" id="avk__mem__alloc_8h_html_ad9889c10c798b040d59c92f257cae597a839826775c62319466441f86496f036d"><div class="ttname"><a href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a839826775c62319466441f86496f036d">VMA_ALLOCATION_CREATE_STRATEGY_BEST_FIT_BIT</a></div><div class="ttdeci">@ VMA_ALLOCATION_CREATE_STRATEGY_BEST_FIT_BIT</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2700</div></div>
-<div class="ttc" id="avk__mem__alloc_8h_html_a4f87c9100d154a65a4ad495f7763cf7ca4816ddaed324ba110172ca608a20f29d"><div class="ttname"><a href="vk__mem__alloc_8h.html#a4f87c9100d154a65a4ad495f7763cf7ca4816ddaed324ba110172ca608a20f29d">VMA_ALLOCATOR_CREATE_EXTERNALLY_SYNCHRONIZED_BIT</a></div><div class="ttdeci">@ VMA_ALLOCATOR_CREATE_EXTERNALLY_SYNCHRONIZED_BIT</div><div class="ttdoc">Allocator and all objects created from it will not be synchronized internally, so you must guarantee ...</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2110</div></div>
-<div class="ttc" id="astruct_vma_pool_stats_html_ad7c54874724fce7b06aba526202d82a8"><div class="ttname"><a href="struct_vma_pool_stats.html#ad7c54874724fce7b06aba526202d82a8">VmaPoolStats::unusedSize</a></div><div class="ttdeci">VkDeviceSize unusedSize</div><div class="ttdoc">Total number of bytes in the pool not used by any VmaAllocation.</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2949</div></div>
-<div class="ttc" id="avk__mem__alloc_8h_html_ad9889c10c798b040d59c92f257cae597aa6f24f821cd6a7c5e4a443f7bf59c520"><div class="ttname"><a href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597aa6f24f821cd6a7c5e4a443f7bf59c520">VMA_ALLOCATION_CREATE_USER_DATA_COPY_STRING_BIT</a></div><div class="ttdeci">@ VMA_ALLOCATION_CREATE_USER_DATA_COPY_STRING_BIT</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2680</div></div>
-<div class="ttc" id="avk__mem__alloc_8h_html_a4dd2c44642312a147a4e93373a6e64d2"><div class="ttname"><a href="vk__mem__alloc_8h.html#a4dd2c44642312a147a4e93373a6e64d2">VmaRecordFlagBits</a></div><div class="ttdeci">VmaRecordFlagBits</div><div class="ttdoc">Flags to be used in VmaRecordSettings::flags.</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2240</div></div>
-<div class="ttc" id="avk__mem__alloc_8h_html_adbae3a0b4ab078024462fc85c37f3b58"><div class="ttname"><a href="vk__mem__alloc_8h.html#adbae3a0b4ab078024462fc85c37f3b58">vmaSetPoolName</a></div><div class="ttdeci">void vmaSetPoolName(VmaAllocator allocator, VmaPool pool, const char *pName)</div><div class="ttdoc">Sets name of a custom pool.</div></div>
-<div class="ttc" id="astruct_vma_device_memory_callbacks_html"><div class="ttname"><a href="struct_vma_device_memory_callbacks.html">VmaDeviceMemoryCallbacks</a></div><div class="ttdoc">Set of callbacks that the library will call for vkAllocateMemory and vkFreeMemory.</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2095</div></div>
-<div class="ttc" id="avk__mem__alloc_8h_html_a43d8ba9673c846f049089a5029d5c73a"><div class="ttname"><a href="vk__mem__alloc_8h.html#a43d8ba9673c846f049089a5029d5c73a">vmaTouchAllocation</a></div><div class="ttdeci">VkBool32 vmaTouchAllocation(VmaAllocator allocator, VmaAllocation allocation)</div><div class="ttdoc">Returns VK_TRUE if allocation is not lost and atomically marks it as used in current frame.</div></div>
-<div class="ttc" id="avk__mem__alloc_8h_html_ad9889c10c798b040d59c92f257cae597a5f436af6c8fe8540573a6d22627a6fd2"><div class="ttname"><a href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a5f436af6c8fe8540573a6d22627a6fd2">VMA_ALLOCATION_CREATE_CAN_BECOME_LOST_BIT</a></div><div class="ttdeci">@ VMA_ALLOCATION_CREATE_CAN_BECOME_LOST_BIT</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2667</div></div>
-<div class="ttc" id="astruct_vma_allocator_create_info_html_a8e4714298e3121cdd8b214a1ae7a637a"><div class="ttname"><a href="struct_vma_allocator_create_info.html#a8e4714298e3121cdd8b214a1ae7a637a">VmaAllocatorCreateInfo::preferredLargeHeapBlockSize</a></div><div class="ttdeci">VkDeviceSize preferredLargeHeapBlockSize</div><div class="ttdoc">Preferred size of a single VkDeviceMemory block to be allocated from large heaps &gt; 1 GiB....</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2280</div></div>
-<div class="ttc" id="avk__mem__alloc_8h_html_a4dd2c44642312a147a4e93373a6e64d2a8e7ab322e8732654be627c4ea8f36cc7"><div class="ttname"><a href="vk__mem__alloc_8h.html#a4dd2c44642312a147a4e93373a6e64d2a8e7ab322e8732654be627c4ea8f36cc7">VMA_RECORD_FLUSH_AFTER_CALL_BIT</a></div><div class="ttdeci">@ VMA_RECORD_FLUSH_AFTER_CALL_BIT</div><div class="ttdoc">Enables flush after recording every function call.</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2246</div></div>
-<div class="ttc" id="avk__mem__alloc_8h_html_a3bf110892ea2fb4649fedb68488d026a"><div class="ttname"><a href="vk__mem__alloc_8h.html#a3bf110892ea2fb4649fedb68488d026a">VmaAllocationCreateInfo</a></div><div class="ttdeci">struct VmaAllocationCreateInfo VmaAllocationCreateInfo</div></div>
-<div class="ttc" id="avk__mem__alloc_8h_html_a0ff488958ca72b28e545880463cb8696"><div class="ttname"><a href="vk__mem__alloc_8h.html#a0ff488958ca72b28e545880463cb8696">vmaResizeAllocation</a></div><div class="ttdeci">VkResult vmaResizeAllocation(VmaAllocator allocator, VmaAllocation allocation, VkDeviceSize newSize)</div><div class="ttdoc">Deprecated.</div></div>
-<div class="ttc" id="astruct_vma_vulkan_functions_html_acc798589736f0becb317fc2196c1d8b9"><div class="ttname"><a href="struct_vma_vulkan_functions.html#acc798589736f0becb317fc2196c1d8b9">VmaVulkanFunctions::vkUnmapMemory</a></div><div class="ttdeci">PFN_vkUnmapMemory vkUnmapMemory</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2214</div></div>
-<div class="ttc" id="astruct_vma_allocation_info_html_ae0bfb7dfdf79a76ffefc9a94677a2f67"><div class="ttname"><a href="struct_vma_allocation_info.html#ae0bfb7dfdf79a76ffefc9a94677a2f67">VmaAllocationInfo::deviceMemory</a></div><div class="ttdeci">VkDeviceMemory deviceMemory</div><div class="ttdoc">Handle to Vulkan memory object.</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:3086</div></div>
-<div class="ttc" id="astruct_vma_stat_info_html_ae06129c771bfebfd6468a7f4276502a9"><div class="ttname"><a href="struct_vma_stat_info.html#ae06129c771bfebfd6468a7f4276502a9">VmaStatInfo::unusedRangeCount</a></div><div class="ttdeci">uint32_t unusedRangeCount</div><div class="ttdoc">Number of free ranges of memory between allocations.</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2440</div></div>
-<div class="ttc" id="astruct_vma_allocation_create_info_html_a8259e85c272683434f4abb4ddddffe19"><div class="ttname"><a href="struct_vma_allocation_create_info.html#a8259e85c272683434f4abb4ddddffe19">VmaAllocationCreateInfo::pUserData</a></div><div class="ttdeci">void * pUserData</div><div class="ttdoc">Custom general-purpose pointer that will be stored in VmaAllocation, can be read as VmaAllocationInfo...</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2774</div></div>
-<div class="ttc" id="astruct_vma_stat_info_html_a5ba1a2476c4d39b10f7e2f7ebbb72ac4"><div class="ttname"><a href="struct_vma_stat_info.html#a5ba1a2476c4d39b10f7e2f7ebbb72ac4">VmaStatInfo::unusedRangeSizeMax</a></div><div class="ttdeci">VkDeviceSize unusedRangeSizeMax</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2446</div></div>
-<div class="ttc" id="astruct_vma_vulkan_functions_html_ab5c1f38dea3a2cf00dc9eb4f57218c49"><div class="ttname"><a href="struct_vma_vulkan_functions.html#ab5c1f38dea3a2cf00dc9eb4f57218c49">VmaVulkanFunctions::vkMapMemory</a></div><div class="ttdeci">PFN_vkMapMemory vkMapMemory</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2213</div></div>
-<div class="ttc" id="avk__mem__alloc_8h_html_a1f0c126759fc96ccb6e2d23c101d770c"><div class="ttname"><a href="vk__mem__alloc_8h.html#a1f0c126759fc96ccb6e2d23c101d770c">VMA_RECORDING_ENABLED</a></div><div class="ttdeci">#define VMA_RECORDING_ENABLED</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1911</div></div>
-<div class="ttc" id="astruct_vma_defragmentation_pass_move_info_html_a8ab4508bc03625b0653c880576be96c6"><div class="ttname"><a href="struct_vma_defragmentation_pass_move_info.html#a8ab4508bc03625b0653c880576be96c6">VmaDefragmentationPassMoveInfo::offset</a></div><div class="ttdeci">VkDeviceSize offset</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:3547</div></div>
-<div class="ttc" id="astruct_vma_defragmentation_pass_info_html_acbd42d4a3357999da130a95cd99a3792"><div class="ttname"><a href="struct_vma_defragmentation_pass_info.html#acbd42d4a3357999da130a95cd99a3792">VmaDefragmentationPassInfo::pMoves</a></div><div class="ttdeci">VmaDefragmentationPassMoveInfo * pMoves</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:3556</div></div>
-<div class="ttc" id="avk__mem__alloc_8h_html_ad9889c10c798b040d59c92f257cae597a33eb2052674f3ad92386c714a65fb777"><div class="ttname"><a href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a33eb2052674f3ad92386c714a65fb777">VMA_ALLOCATION_CREATE_STRATEGY_FIRST_FIT_BIT</a></div><div class="ttdeci">@ VMA_ALLOCATION_CREATE_STRATEGY_FIRST_FIT_BIT</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2711</div></div>
-<div class="ttc" id="avk__mem__alloc_8h_html_a9bc268595cb33f6ec4d519cfce81ff45"><div class="ttname"><a href="vk__mem__alloc_8h.html#a9bc268595cb33f6ec4d519cfce81ff45">vmaUnmapMemory</a></div><div class="ttdeci">void vmaUnmapMemory(VmaAllocator allocator, VmaAllocation allocation)</div><div class="ttdoc">Unmaps memory represented by given allocation, mapped previously using vmaMapMemory().</div></div>
-<div class="ttc" id="astruct_vma_allocator_info_html_a2ed6a4d2d3fea039d66a13f15d0ce5fe"><div class="ttname"><a href="struct_vma_allocator_info.html#a2ed6a4d2d3fea039d66a13f15d0ce5fe">VmaAllocatorInfo::instance</a></div><div class="ttdeci">VkInstance instance</div><div class="ttdoc">Handle to Vulkan instance object.</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2372</div></div>
-<div class="ttc" id="astruct_vma_budget_html_a84dd1ecca8b0110259eb206dbadb11f6"><div class="ttname"><a href="struct_vma_budget.html#a84dd1ecca8b0110259eb206dbadb11f6">VmaBudget::usage</a></div><div class="ttdeci">VkDeviceSize usage</div><div class="ttdoc">Estimated current memory usage of the program, in bytes.</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2497</div></div>
-<div class="ttc" id="astruct_vma_allocator_html"><div class="ttname"><a href="struct_vma_allocator.html">VmaAllocator</a></div><div class="ttdoc">Represents main object of this library initialized.</div></div>
-<div class="ttc" id="astruct_vma_vulkan_functions_html_ae5c0db8c89a3b82593dc16aa6a49fa3a"><div class="ttname"><a href="struct_vma_vulkan_functions.html#ae5c0db8c89a3b82593dc16aa6a49fa3a">VmaVulkanFunctions::vkCmdCopyBuffer</a></div><div class="ttdeci">PFN_vkCmdCopyBuffer vkCmdCopyBuffer</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2225</div></div>
-<div class="ttc" id="astruct_vma_allocator_create_info_html"><div class="ttname"><a href="struct_vma_allocator_create_info.html">VmaAllocatorCreateInfo</a></div><div class="ttdoc">Description of a Allocator to be created.</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2269</div></div>
-<div class="ttc" id="avk__mem__alloc_8h_html_ad9889c10c798b040d59c92f257cae597a89759603401014eb325eb22a3839f2ff"><div class="ttname"><a href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a89759603401014eb325eb22a3839f2ff">VMA_ALLOCATION_CREATE_NEVER_ALLOCATE_BIT</a></div><div class="ttdeci">@ VMA_ALLOCATION_CREATE_NEVER_ALLOCATE_BIT</div><div class="ttdoc">Set this flag to only try to allocate from existing VkDeviceMemory blocks and never create new such b...</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2641</div></div>
-<div class="ttc" id="astruct_vma_allocator_info_html_a012b4c485bf3b0ea8921352c5ee0c357"><div class="ttname"><a href="struct_vma_allocator_info.html#a012b4c485bf3b0ea8921352c5ee0c357">VmaAllocatorInfo::device</a></div><div class="ttdeci">VkDevice device</div><div class="ttdoc">Handle to Vulkan device object.</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2382</div></div>
-<div class="ttc" id="avk__mem__alloc_8h_html_a6552a65b71d16f378c6994b3ceaef50cab87ec33154803bfeb5ac2b379f1d6a97"><div class="ttname"><a href="vk__mem__alloc_8h.html#a6552a65b71d16f378c6994b3ceaef50cab87ec33154803bfeb5ac2b379f1d6a97">VMA_DEFRAGMENTATION_FLAG_BITS_MAX_ENUM</a></div><div class="ttdeci">@ VMA_DEFRAGMENTATION_FLAG_BITS_MAX_ENUM</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:3464</div></div>
-<div class="ttc" id="astruct_vma_pool_stats_html_ab4c8f52dd42ab01998f60f0b6acc722b"><div class="ttname"><a href="struct_vma_pool_stats.html#ab4c8f52dd42ab01998f60f0b6acc722b">VmaPoolStats::unusedRangeSizeMax</a></div><div class="ttdeci">VkDeviceSize unusedRangeSizeMax</div><div class="ttdoc">Size of the largest continuous free memory region available for new allocation.</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2962</div></div>
-<div class="ttc" id="avk__mem__alloc_8h_html_ad9889c10c798b040d59c92f257cae597ad242a04f802e25fef0b880afe8bb0a62"><div class="ttname"><a href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597ad242a04f802e25fef0b880afe8bb0a62">VMA_ALLOCATION_CREATE_STRATEGY_WORST_FIT_BIT</a></div><div class="ttdeci">@ VMA_ALLOCATION_CREATE_STRATEGY_WORST_FIT_BIT</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2704</div></div>
-<div class="ttc" id="avk__mem__alloc_8h_html_a4f87c9100d154a65a4ad495f7763cf7cace7da7cc6e71a625dfa763c55a597878"><div class="ttname"><a href="vk__mem__alloc_8h.html#a4f87c9100d154a65a4ad495f7763cf7cace7da7cc6e71a625dfa763c55a597878">VMA_ALLOCATOR_CREATE_KHR_DEDICATED_ALLOCATION_BIT</a></div><div class="ttdeci">@ VMA_ALLOCATOR_CREATE_KHR_DEDICATED_ALLOCATION_BIT</div><div class="ttdoc">Enables usage of VK_KHR_dedicated_allocation extension.</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2135</div></div>
-<div class="ttc" id="avk__mem__alloc_8h_html_ade56bf8dc9f5a5eaddf5f119ed525236"><div class="ttname"><a href="vk__mem__alloc_8h.html#ade56bf8dc9f5a5eaddf5f119ed525236">vmaSetCurrentFrameIndex</a></div><div class="ttdeci">void vmaSetCurrentFrameIndex(VmaAllocator allocator, uint32_t frameIndex)</div><div class="ttdoc">Sets index of the current frame.</div></div>
-<div class="ttc" id="astruct_vma_defragmentation_info_html_aa7c7304e13c71f604c907196c4e28fbc"><div class="ttname"><a href="struct_vma_defragmentation_info.html#aa7c7304e13c71f604c907196c4e28fbc">VmaDefragmentationInfo::maxAllocationsToMove</a></div><div class="ttdeci">uint32_t maxAllocationsToMove</div><div class="ttdoc">Maximum number of allocations that can be moved to different place.</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:3573</div></div>
-<div class="ttc" id="avk__mem__alloc_8h_html_ad9889c10c798b040d59c92f257cae597ab8b1764f3e9022368e440c057783b92d"><div class="ttname"><a href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597ab8b1764f3e9022368e440c057783b92d">VMA_ALLOCATION_CREATE_WITHIN_BUDGET_BIT</a></div><div class="ttdeci">@ VMA_ALLOCATION_CREATE_WITHIN_BUDGET_BIT</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2695</div></div>
-<div class="ttc" id="avk__mem__alloc_8h_html_aa5846affa1e9da3800e3e78fae2305cc"><div class="ttname"><a href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305cc">VmaMemoryUsage</a></div><div class="ttdeci">VmaMemoryUsage</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2556</div></div>
-<div class="ttc" id="avk__mem__alloc_8h_html_a834b1e4aef395c0a1d56a28e69a4a17e"><div class="ttname"><a href="vk__mem__alloc_8h.html#a834b1e4aef395c0a1d56a28e69a4a17e">vmaFreeMemoryPages</a></div><div class="ttdeci">void vmaFreeMemoryPages(VmaAllocator allocator, size_t allocationCount, const VmaAllocation *pAllocations)</div><div class="ttdoc">Frees memory and destroys multiple allocations.</div></div>
-<div class="ttc" id="avk__mem__alloc_8h_html_a8701444752eb5de4464adb5a2b514bca"><div class="ttname"><a href="vk__mem__alloc_8h.html#a8701444752eb5de4464adb5a2b514bca">vmaGetMemoryTypeProperties</a></div><div class="ttdeci">void vmaGetMemoryTypeProperties(VmaAllocator allocator, uint32_t memoryTypeIndex, VkMemoryPropertyFlags *pFlags)</div><div class="ttdoc">Given Memory Type Index, returns Property Flags of this memory type.</div></div>
-<div class="ttc" id="astruct_vma_stat_info_html_abc4bb7cd611900778464c56e50c970a4"><div class="ttname"><a href="struct_vma_stat_info.html#abc4bb7cd611900778464c56e50c970a4">VmaStatInfo::blockCount</a></div><div class="ttdeci">uint32_t blockCount</div><div class="ttdoc">Number of VkDeviceMemory Vulkan memory blocks allocated.</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2436</div></div>
-<div class="ttc" id="astruct_vma_pool_create_info_html_a596fa76b685d3f1f688f84a709a5b319"><div class="ttname"><a href="struct_vma_pool_create_info.html#a596fa76b685d3f1f688f84a709a5b319">VmaPoolCreateInfo::memoryTypeIndex</a></div><div class="ttdeci">uint32_t memoryTypeIndex</div><div class="ttdoc">Vulkan memory type index to allocate this pool from.</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2899</div></div>
-<div class="ttc" id="astruct_vma_pool_create_info_html_aa4265160536cdb9be821b7686c16c676"><div class="ttname"><a href="struct_vma_pool_create_info.html#aa4265160536cdb9be821b7686c16c676">VmaPoolCreateInfo::blockSize</a></div><div class="ttdeci">VkDeviceSize blockSize</div><div class="ttdoc">Size of a single VkDeviceMemory block to be allocated as part of this pool, in bytes....</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2911</div></div>
-<div class="ttc" id="astruct_vma_defragmentation_info2_html_a7e70aa2a1081d849dcc7829b19d3ec9d"><div class="ttname"><a href="struct_vma_defragmentation_info2.html#a7e70aa2a1081d849dcc7829b19d3ec9d">VmaDefragmentationInfo2::poolCount</a></div><div class="ttdeci">uint32_t poolCount</div><div class="ttdoc">Numer of pools in pPools array.</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:3496</div></div>
-<div class="ttc" id="astruct_vma_defragmentation_pass_move_info_html"><div class="ttname"><a href="struct_vma_defragmentation_pass_move_info.html">VmaDefragmentationPassMoveInfo</a></div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:3544</div></div>
-<div class="ttc" id="avk__mem__alloc_8h_html_aa4fee7eb5253377599ef4fd38c93c2a0"><div class="ttname"><a href="vk__mem__alloc_8h.html#aa4fee7eb5253377599ef4fd38c93c2a0">vmaBuildStatsString</a></div><div class="ttdeci">void vmaBuildStatsString(VmaAllocator allocator, char **ppStatsString, VkBool32 detailedMap)</div><div class="ttdoc">Builds and returns statistics as string in JSON format.</div></div>
-<div class="ttc" id="avk__mem__alloc_8h_html_a86dd08aba8633bfa4ad0df2e76481d8b"><div class="ttname"><a href="vk__mem__alloc_8h.html#a86dd08aba8633bfa4ad0df2e76481d8b">vmaGetAllocationInfo</a></div><div class="ttdeci">void vmaGetAllocationInfo(VmaAllocator allocator, VmaAllocation allocation, VmaAllocationInfo *pAllocationInfo)</div><div class="ttdoc">Returns current information about specified allocation and atomically marks it as used in current fra...</div></div>
-<div class="ttc" id="astruct_vma_pool_stats_html_ad1924eb54fffa45e9e0e65670c8fe5eb"><div class="ttname"><a href="struct_vma_pool_stats.html#ad1924eb54fffa45e9e0e65670c8fe5eb">VmaPoolStats::allocationCount</a></div><div class="ttdeci">size_t allocationCount</div><div class="ttdoc">Number of VmaAllocation objects created from this pool that were not destroyed or lost.</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2952</div></div>
-<div class="ttc" id="avk__mem__alloc_8h_html_acfe6863e160722c2c1bbcf7573fddc4d"><div class="ttname"><a href="vk__mem__alloc_8h.html#acfe6863e160722c2c1bbcf7573fddc4d">VmaAllocatorCreateFlags</a></div><div class="ttdeci">VkFlags VmaAllocatorCreateFlags</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2202</div></div>
-<div class="ttc" id="avk__mem__alloc_8h_html_a3104eb30d8122c84dd8541063f145288"><div class="ttname"><a href="vk__mem__alloc_8h.html#a3104eb30d8122c84dd8541063f145288">vmaFreeStatsString</a></div><div class="ttdeci">void vmaFreeStatsString(VmaAllocator allocator, char *pStatsString)</div></div>
-<div class="ttc" id="avk__mem__alloc_8h_html_a7fdf64415b6c3d83c454f28d2c53df7b"><div class="ttname"><a href="vk__mem__alloc_8h.html#a7fdf64415b6c3d83c454f28d2c53df7b">vmaAllocateMemoryForBuffer</a></div><div class="ttdeci">VkResult vmaAllocateMemoryForBuffer(VmaAllocator allocator, VkBuffer buffer, const VmaAllocationCreateInfo *pCreateInfo, VmaAllocation *pAllocation, VmaAllocationInfo *pAllocationInfo)</div></div>
-<div class="ttc" id="avk__mem__alloc_8h_html_abb0a8e3b5040d847571cca6c7f9a8074"><div class="ttname"><a href="vk__mem__alloc_8h.html#abb0a8e3b5040d847571cca6c7f9a8074">VmaVulkanFunctions</a></div><div class="ttdeci">struct VmaVulkanFunctions VmaVulkanFunctions</div><div class="ttdoc">Pointers to some Vulkan functions - a subset used by the library.</div></div>
-<div class="ttc" id="avk__mem__alloc_8h_html_a4f87c9100d154a65a4ad495f7763cf7cae4d5ad929caba5f23eb502b13bd5286c"><div class="ttname"><a href="vk__mem__alloc_8h.html#a4f87c9100d154a65a4ad495f7763cf7cae4d5ad929caba5f23eb502b13bd5286c">VMA_ALLOCATOR_CREATE_FLAG_BITS_MAX_ENUM</a></div><div class="ttdeci">@ VMA_ALLOCATOR_CREATE_FLAG_BITS_MAX_ENUM</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2200</div></div>
-<div class="ttc" id="avk__mem__alloc_8h_html_a6552a65b71d16f378c6994b3ceaef50c"><div class="ttname"><a href="vk__mem__alloc_8h.html#a6552a65b71d16f378c6994b3ceaef50c">VmaDefragmentationFlagBits</a></div><div class="ttdeci">VmaDefragmentationFlagBits</div><div class="ttdoc">Flags to be used in vmaDefragmentationBegin(). None at the moment. Reserved for future use.</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:3462</div></div>
-<div class="ttc" id="astruct_vma_allocation_info_html_a4a3c732388dbdc7a23f9365b00825268"><div class="ttname"><a href="struct_vma_allocation_info.html#a4a3c732388dbdc7a23f9365b00825268">VmaAllocationInfo::offset</a></div><div class="ttdeci">VkDeviceSize offset</div><div class="ttdoc">Offset into deviceMemory object to the beginning of this allocation, in bytes. (deviceMemory,...</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:3091</div></div>
-<div class="ttc" id="avk__mem__alloc_8h_html_ad9889c10c798b040d59c92f257cae597"><div class="ttname"><a href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597">VmaAllocationCreateFlagBits</a></div><div class="ttdeci">VmaAllocationCreateFlagBits</div><div class="ttdoc">Flags to be passed as VmaAllocationCreateInfo::flags.</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2623</div></div>
-<div class="ttc" id="astruct_vma_vulkan_functions_html_a60d25c33bba06bb8592e6875cbaa9830"><div class="ttname"><a href="struct_vma_vulkan_functions.html#a60d25c33bba06bb8592e6875cbaa9830">VmaVulkanFunctions::vkGetPhysicalDeviceMemoryProperties</a></div><div class="ttdeci">PFN_vkGetPhysicalDeviceMemoryProperties vkGetPhysicalDeviceMemoryProperties</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2210</div></div>
-<div class="ttc" id="avk__mem__alloc_8h_html_a2770e325ea42e087c1b91fdf46d0292a"><div class="ttname"><a href="vk__mem__alloc_8h.html#a2770e325ea42e087c1b91fdf46d0292a">VmaPoolCreateFlags</a></div><div class="ttdeci">VkFlags VmaPoolCreateFlags</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2892</div></div>
-<div class="ttc" id="avk__mem__alloc_8h_html_ae5c9657d9e94756269145b01c05d16f1"><div class="ttname"><a href="vk__mem__alloc_8h.html#ae5c9657d9e94756269145b01c05d16f1">vmaCreateLostAllocation</a></div><div class="ttdeci">void vmaCreateLostAllocation(VmaAllocator allocator, VmaAllocation *pAllocation)</div><div class="ttdoc">Creates new allocation that is in lost state from the beginning.</div></div>
-<div class="ttc" id="avk__mem__alloc_8h_html_ab25b558d75f7378ec944a1522fdcc3c5"><div class="ttname"><a href="vk__mem__alloc_8h.html#ab25b558d75f7378ec944a1522fdcc3c5">vmaInvalidateAllocations</a></div><div class="ttdeci">VkResult vmaInvalidateAllocations(VmaAllocator allocator, uint32_t allocationCount, const VmaAllocation *allocations, const VkDeviceSize *offsets, const VkDeviceSize *sizes)</div><div class="ttdoc">Invalidates memory of given set of allocations.</div></div>
-<div class="ttc" id="avk__mem__alloc_8h_html_a77692d3c8770ea8882d573206bd27b2b"><div class="ttname"><a href="vk__mem__alloc_8h.html#a77692d3c8770ea8882d573206bd27b2b">VmaDeviceMemoryCallbacks</a></div><div class="ttdeci">struct VmaDeviceMemoryCallbacks VmaDeviceMemoryCallbacks</div><div class="ttdoc">Set of callbacks that the library will call for vkAllocateMemory and vkFreeMemory.</div></div>
-<div class="ttc" id="avk__mem__alloc_8h_html_aecabf7b6e91ea87d0316fa0a9e014fe0"><div class="ttname"><a href="vk__mem__alloc_8h.html#aecabf7b6e91ea87d0316fa0a9e014fe0">vmaGetPhysicalDeviceProperties</a></div><div class="ttdeci">void vmaGetPhysicalDeviceProperties(VmaAllocator allocator, const VkPhysicalDeviceProperties **ppPhysicalDeviceProperties)</div></div>
-<div class="ttc" id="astruct_vma_allocation_create_info_html_a6272c0555cfd1fe28bff1afeb6190150"><div class="ttname"><a href="struct_vma_allocation_create_info.html#a6272c0555cfd1fe28bff1afeb6190150">VmaAllocationCreateInfo::pool</a></div><div class="ttdeci">VmaPool pool</div><div class="ttdoc">Pool that this allocation should be created in.</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2767</div></div>
-<div class="ttc" id="avk__mem__alloc_8h_html_ab88db292a17974f911182543fda52d19"><div class="ttname"><a href="vk__mem__alloc_8h.html#ab88db292a17974f911182543fda52d19">vmaGetMemoryProperties</a></div><div class="ttdeci">void vmaGetMemoryProperties(VmaAllocator allocator, const VkPhysicalDeviceMemoryProperties **ppPhysicalDeviceMemoryProperties)</div></div>
-<div class="ttc" id="astruct_vma_stats_html_a2e8f5b3353f2fefef3c27f29e245a1f9"><div class="ttname"><a href="struct_vma_stats.html#a2e8f5b3353f2fefef3c27f29e245a1f9">VmaStats::total</a></div><div class="ttdeci">VmaStatInfo total</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2454</div></div>
-<div class="ttc" id="avk__mem__alloc_8h_html_ad9889c10c798b040d59c92f257cae597a3fc311d855c2ff53f1090ef5c722b38f"><div class="ttname"><a href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a3fc311d855c2ff53f1090ef5c722b38f">VMA_ALLOCATION_CREATE_DEDICATED_MEMORY_BIT</a></div><div class="ttdeci">@ VMA_ALLOCATION_CREATE_DEDICATED_MEMORY_BIT</div><div class="ttdoc">Set this flag if the allocation should have its own memory block.</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2630</div></div>
-<div class="ttc" id="avk__mem__alloc_8h_html_a8774e20e91e245aae959ba63efa15dd2"><div class="ttname"><a href="vk__mem__alloc_8h.html#a8774e20e91e245aae959ba63efa15dd2">vmaDefragmentationEnd</a></div><div class="ttdeci">VkResult vmaDefragmentationEnd(VmaAllocator allocator, VmaDefragmentationContext context)</div><div class="ttdoc">Ends defragmentation process.</div></div>
-<div class="ttc" id="avk__mem__alloc_8h_html_a4f87c9100d154a65a4ad495f7763cf7ca8fb75bf07cd184ab903596295e863dee"><div class="ttname"><a href="vk__mem__alloc_8h.html#a4f87c9100d154a65a4ad495f7763cf7ca8fb75bf07cd184ab903596295e863dee">VMA_ALLOCATOR_CREATE_KHR_BIND_MEMORY2_BIT</a></div><div class="ttdeci">@ VMA_ALLOCATOR_CREATE_KHR_BIND_MEMORY2_BIT</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2150</div></div>
-<div class="ttc" id="astruct_vma_defragmentation_info2_html_a53e844ee5633e229cf6daf14b2d9fff9"><div class="ttname"><a href="struct_vma_defragmentation_info2.html#a53e844ee5633e229cf6daf14b2d9fff9">VmaDefragmentationInfo2::flags</a></div><div class="ttdeci">VmaDefragmentationFlags flags</div><div class="ttdoc">Reserved for future use. Should be 0.</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:3475</div></div>
-<div class="ttc" id="astruct_vma_vulkan_functions_html_a1338d96a128a5ade648b8d934907c637"><div class="ttname"><a href="struct_vma_vulkan_functions.html#a1338d96a128a5ade648b8d934907c637">VmaVulkanFunctions::vkBindImageMemory</a></div><div class="ttdeci">PFN_vkBindImageMemory vkBindImageMemory</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2218</div></div>
-<div class="ttc" id="astruct_vma_defragmentation_info2_html_a4ddbc898d0afe1518f863a3763628f08"><div class="ttname"><a href="struct_vma_defragmentation_info2.html#a4ddbc898d0afe1518f863a3763628f08">VmaDefragmentationInfo2::maxGpuBytesToMove</a></div><div class="ttdeci">VkDeviceSize maxGpuBytesToMove</div><div class="ttdoc">Maximum total numbers of bytes that can be copied while moving allocations to different places using ...</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:3527</div></div>
-<div class="ttc" id="astruct_vma_defragmentation_stats_html"><div class="ttname"><a href="struct_vma_defragmentation_stats.html">VmaDefragmentationStats</a></div><div class="ttdoc">Statistics returned by function vmaDefragment().</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:3577</div></div>
-<div class="ttc" id="avk__mem__alloc_8h_html_a5485779c8f1948238fc4e92232fa65e1"><div class="ttname"><a href="vk__mem__alloc_8h.html#a5485779c8f1948238fc4e92232fa65e1">vmaDestroyPool</a></div><div class="ttdeci">void vmaDestroyPool(VmaAllocator allocator, VmaPool pool)</div><div class="ttdoc">Destroys VmaPool object and frees Vulkan device memory.</div></div>
-<div class="ttc" id="astruct_vma_pool_stats_html_a326807b2de2b0931cee4ed9a5f2e420c"><div class="ttname"><a href="struct_vma_pool_stats.html#a326807b2de2b0931cee4ed9a5f2e420c">VmaPoolStats::size</a></div><div class="ttdeci">VkDeviceSize size</div><div class="ttdoc">Total amount of VkDeviceMemory allocated from Vulkan for this pool, in bytes.</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2946</div></div>
-<div class="ttc" id="astruct_vma_vulkan_functions_html_a4c658701778564d62034255b5dda91b4"><div class="ttname"><a href="struct_vma_vulkan_functions.html#a4c658701778564d62034255b5dda91b4">VmaVulkanFunctions::vkFreeMemory</a></div><div class="ttdeci">PFN_vkFreeMemory vkFreeMemory</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2212</div></div>
-<div class="ttc" id="avk__mem__alloc_8h_html_af3929a1a4547c592fc0b0e55ef452828"><div class="ttname"><a href="vk__mem__alloc_8h.html#af3929a1a4547c592fc0b0e55ef452828">VmaRecordFlags</a></div><div class="ttdeci">VkFlags VmaRecordFlags</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2250</div></div>
-<div class="ttc" id="avk__mem__alloc_8h_html_a30c37c1eec6025f397be41644f48490f"><div class="ttname"><a href="vk__mem__alloc_8h.html#a30c37c1eec6025f397be41644f48490f">vmaFlushAllocation</a></div><div class="ttdeci">VkResult vmaFlushAllocation(VmaAllocator allocator, VmaAllocation allocation, VkDeviceSize offset, VkDeviceSize size)</div><div class="ttdoc">Flushes memory of given allocation.</div></div>
-<div class="ttc" id="avk__mem__alloc_8h_html_aa5846affa1e9da3800e3e78fae2305cca40bdf4cddeffeb12f43d45ca1286e0a5"><div class="ttname"><a href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305cca40bdf4cddeffeb12f43d45ca1286e0a5">VMA_MEMORY_USAGE_CPU_ONLY</a></div><div class="ttdeci">@ VMA_MEMORY_USAGE_CPU_ONLY</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2587</div></div>
+<div class="line"><a name="l19017"></a><span class="lineno">19017</span>&#160;    VMA_DEBUG_GLOBAL_MUTEX_LOCK</div>
+<div class="line"><a name="l19018"></a><span class="lineno">19018</span>&#160; </div>
+<div class="line"><a name="l19019"></a><span class="lineno">19019</span>&#160;    <span class="keyword">const</span> VkResult res = allocator-&gt;FlushOrInvalidateAllocation(allocation, offset, size, VMA_CACHE_INVALIDATE);</div>
+<div class="line"><a name="l19020"></a><span class="lineno">19020</span>&#160; </div>
+<div class="line"><a name="l19021"></a><span class="lineno">19021</span>&#160;<span class="preprocessor">#if VMA_RECORDING_ENABLED</span></div>
+<div class="line"><a name="l19022"></a><span class="lineno">19022</span>&#160;    <span class="keywordflow">if</span>(allocator-&gt;GetRecorder() != VMA_NULL)</div>
+<div class="line"><a name="l19023"></a><span class="lineno">19023</span>&#160;    {</div>
+<div class="line"><a name="l19024"></a><span class="lineno">19024</span>&#160;        allocator-&gt;GetRecorder()-&gt;RecordInvalidateAllocation(</div>
+<div class="line"><a name="l19025"></a><span class="lineno">19025</span>&#160;            allocator-&gt;GetCurrentFrameIndex(),</div>
+<div class="line"><a name="l19026"></a><span class="lineno">19026</span>&#160;            allocation, offset, size);</div>
+<div class="line"><a name="l19027"></a><span class="lineno">19027</span>&#160;    }</div>
+<div class="line"><a name="l19028"></a><span class="lineno">19028</span>&#160;<span class="preprocessor">#endif</span></div>
+<div class="line"><a name="l19029"></a><span class="lineno">19029</span>&#160; </div>
+<div class="line"><a name="l19030"></a><span class="lineno">19030</span>&#160;    <span class="keywordflow">return</span> res;</div>
+<div class="line"><a name="l19031"></a><span class="lineno">19031</span>&#160;}</div>
+<div class="line"><a name="l19032"></a><span class="lineno">19032</span>&#160; </div>
+<div class="line"><a name="l19033"></a><span class="lineno">19033</span>&#160;VMA_CALL_PRE VkResult VMA_CALL_POST <a class="code" href="vk__mem__alloc_8h.html#ac3dd00da721875ed99fa8a881922bdfc">vmaFlushAllocations</a>(</div>
+<div class="line"><a name="l19034"></a><span class="lineno">19034</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div>
+<div class="line"><a name="l19035"></a><span class="lineno">19035</span>&#160;    uint32_t allocationCount,</div>
+<div class="line"><a name="l19036"></a><span class="lineno">19036</span>&#160;    <span class="keyword">const</span> <a class="code" href="struct_vma_allocation.html">VmaAllocation</a>* allocations,</div>
+<div class="line"><a name="l19037"></a><span class="lineno">19037</span>&#160;    <span class="keyword">const</span> VkDeviceSize* offsets,</div>
+<div class="line"><a name="l19038"></a><span class="lineno">19038</span>&#160;    <span class="keyword">const</span> VkDeviceSize* sizes)</div>
+<div class="line"><a name="l19039"></a><span class="lineno">19039</span>&#160;{</div>
+<div class="line"><a name="l19040"></a><span class="lineno">19040</span>&#160;    VMA_ASSERT(allocator);</div>
+<div class="line"><a name="l19041"></a><span class="lineno">19041</span>&#160; </div>
+<div class="line"><a name="l19042"></a><span class="lineno">19042</span>&#160;    <span class="keywordflow">if</span>(allocationCount == 0)</div>
+<div class="line"><a name="l19043"></a><span class="lineno">19043</span>&#160;    {</div>
+<div class="line"><a name="l19044"></a><span class="lineno">19044</span>&#160;        <span class="keywordflow">return</span> VK_SUCCESS;</div>
+<div class="line"><a name="l19045"></a><span class="lineno">19045</span>&#160;    }</div>
+<div class="line"><a name="l19046"></a><span class="lineno">19046</span>&#160; </div>
+<div class="line"><a name="l19047"></a><span class="lineno">19047</span>&#160;    VMA_ASSERT(allocations);</div>
+<div class="line"><a name="l19048"></a><span class="lineno">19048</span>&#160; </div>
+<div class="line"><a name="l19049"></a><span class="lineno">19049</span>&#160;    VMA_DEBUG_LOG(<span class="stringliteral">&quot;vmaFlushAllocations&quot;</span>);</div>
+<div class="line"><a name="l19050"></a><span class="lineno">19050</span>&#160; </div>
+<div class="line"><a name="l19051"></a><span class="lineno">19051</span>&#160;    VMA_DEBUG_GLOBAL_MUTEX_LOCK</div>
+<div class="line"><a name="l19052"></a><span class="lineno">19052</span>&#160; </div>
+<div class="line"><a name="l19053"></a><span class="lineno">19053</span>&#160;    <span class="keyword">const</span> VkResult res = allocator-&gt;FlushOrInvalidateAllocations(allocationCount, allocations, offsets, sizes, VMA_CACHE_FLUSH);</div>
+<div class="line"><a name="l19054"></a><span class="lineno">19054</span>&#160; </div>
+<div class="line"><a name="l19055"></a><span class="lineno">19055</span>&#160;<span class="preprocessor">#if VMA_RECORDING_ENABLED</span></div>
+<div class="line"><a name="l19056"></a><span class="lineno">19056</span>&#160;    <span class="keywordflow">if</span>(allocator-&gt;GetRecorder() != VMA_NULL)</div>
+<div class="line"><a name="l19057"></a><span class="lineno">19057</span>&#160;    {</div>
+<div class="line"><a name="l19058"></a><span class="lineno">19058</span>&#160;        <span class="comment">//TODO</span></div>
+<div class="line"><a name="l19059"></a><span class="lineno">19059</span>&#160;    }</div>
+<div class="line"><a name="l19060"></a><span class="lineno">19060</span>&#160;<span class="preprocessor">#endif</span></div>
+<div class="line"><a name="l19061"></a><span class="lineno">19061</span>&#160; </div>
+<div class="line"><a name="l19062"></a><span class="lineno">19062</span>&#160;    <span class="keywordflow">return</span> res;</div>
+<div class="line"><a name="l19063"></a><span class="lineno">19063</span>&#160;}</div>
+<div class="line"><a name="l19064"></a><span class="lineno">19064</span>&#160; </div>
+<div class="line"><a name="l19065"></a><span class="lineno">19065</span>&#160;VMA_CALL_PRE VkResult VMA_CALL_POST <a class="code" href="vk__mem__alloc_8h.html#ab25b558d75f7378ec944a1522fdcc3c5">vmaInvalidateAllocations</a>(</div>
+<div class="line"><a name="l19066"></a><span class="lineno">19066</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div>
+<div class="line"><a name="l19067"></a><span class="lineno">19067</span>&#160;    uint32_t allocationCount,</div>
+<div class="line"><a name="l19068"></a><span class="lineno">19068</span>&#160;    <span class="keyword">const</span> <a class="code" href="struct_vma_allocation.html">VmaAllocation</a>* allocations,</div>
+<div class="line"><a name="l19069"></a><span class="lineno">19069</span>&#160;    <span class="keyword">const</span> VkDeviceSize* offsets,</div>
+<div class="line"><a name="l19070"></a><span class="lineno">19070</span>&#160;    <span class="keyword">const</span> VkDeviceSize* sizes)</div>
+<div class="line"><a name="l19071"></a><span class="lineno">19071</span>&#160;{</div>
+<div class="line"><a name="l19072"></a><span class="lineno">19072</span>&#160;    VMA_ASSERT(allocator);</div>
+<div class="line"><a name="l19073"></a><span class="lineno">19073</span>&#160; </div>
+<div class="line"><a name="l19074"></a><span class="lineno">19074</span>&#160;    <span class="keywordflow">if</span>(allocationCount == 0)</div>
+<div class="line"><a name="l19075"></a><span class="lineno">19075</span>&#160;    {</div>
+<div class="line"><a name="l19076"></a><span class="lineno">19076</span>&#160;        <span class="keywordflow">return</span> VK_SUCCESS;</div>
+<div class="line"><a name="l19077"></a><span class="lineno">19077</span>&#160;    }</div>
+<div class="line"><a name="l19078"></a><span class="lineno">19078</span>&#160; </div>
+<div class="line"><a name="l19079"></a><span class="lineno">19079</span>&#160;    VMA_ASSERT(allocations);</div>
+<div class="line"><a name="l19080"></a><span class="lineno">19080</span>&#160; </div>
+<div class="line"><a name="l19081"></a><span class="lineno">19081</span>&#160;    VMA_DEBUG_LOG(<span class="stringliteral">&quot;vmaInvalidateAllocations&quot;</span>);</div>
+<div class="line"><a name="l19082"></a><span class="lineno">19082</span>&#160; </div>
+<div class="line"><a name="l19083"></a><span class="lineno">19083</span>&#160;    VMA_DEBUG_GLOBAL_MUTEX_LOCK</div>
+<div class="line"><a name="l19084"></a><span class="lineno">19084</span>&#160; </div>
+<div class="line"><a name="l19085"></a><span class="lineno">19085</span>&#160;    <span class="keyword">const</span> VkResult res = allocator-&gt;FlushOrInvalidateAllocations(allocationCount, allocations, offsets, sizes, VMA_CACHE_INVALIDATE);</div>
+<div class="line"><a name="l19086"></a><span class="lineno">19086</span>&#160; </div>
+<div class="line"><a name="l19087"></a><span class="lineno">19087</span>&#160;<span class="preprocessor">#if VMA_RECORDING_ENABLED</span></div>
+<div class="line"><a name="l19088"></a><span class="lineno">19088</span>&#160;    <span class="keywordflow">if</span>(allocator-&gt;GetRecorder() != VMA_NULL)</div>
+<div class="line"><a name="l19089"></a><span class="lineno">19089</span>&#160;    {</div>
+<div class="line"><a name="l19090"></a><span class="lineno">19090</span>&#160;        <span class="comment">//TODO</span></div>
+<div class="line"><a name="l19091"></a><span class="lineno">19091</span>&#160;    }</div>
+<div class="line"><a name="l19092"></a><span class="lineno">19092</span>&#160;<span class="preprocessor">#endif</span></div>
+<div class="line"><a name="l19093"></a><span class="lineno">19093</span>&#160; </div>
+<div class="line"><a name="l19094"></a><span class="lineno">19094</span>&#160;    <span class="keywordflow">return</span> res;</div>
+<div class="line"><a name="l19095"></a><span class="lineno">19095</span>&#160;}</div>
+<div class="line"><a name="l19096"></a><span class="lineno">19096</span>&#160; </div>
+<div class="line"><a name="l19097"></a><span class="lineno">19097</span>&#160;VMA_CALL_PRE VkResult VMA_CALL_POST <a class="code" href="vk__mem__alloc_8h.html#a49329a7f030dafcf82f7b73334c22e98">vmaCheckCorruption</a>(<a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator, uint32_t memoryTypeBits)</div>
+<div class="line"><a name="l19098"></a><span class="lineno">19098</span>&#160;{</div>
+<div class="line"><a name="l19099"></a><span class="lineno">19099</span>&#160;    VMA_ASSERT(allocator);</div>
+<div class="line"><a name="l19100"></a><span class="lineno">19100</span>&#160; </div>
+<div class="line"><a name="l19101"></a><span class="lineno">19101</span>&#160;    VMA_DEBUG_LOG(<span class="stringliteral">&quot;vmaCheckCorruption&quot;</span>);</div>
+<div class="line"><a name="l19102"></a><span class="lineno">19102</span>&#160; </div>
+<div class="line"><a name="l19103"></a><span class="lineno">19103</span>&#160;    VMA_DEBUG_GLOBAL_MUTEX_LOCK</div>
+<div class="line"><a name="l19104"></a><span class="lineno">19104</span>&#160; </div>
+<div class="line"><a name="l19105"></a><span class="lineno">19105</span>&#160;    <span class="keywordflow">return</span> allocator-&gt;CheckCorruption(memoryTypeBits);</div>
+<div class="line"><a name="l19106"></a><span class="lineno">19106</span>&#160;}</div>
+<div class="line"><a name="l19107"></a><span class="lineno">19107</span>&#160; </div>
+<div class="line"><a name="l19108"></a><span class="lineno">19108</span>&#160;VMA_CALL_PRE VkResult VMA_CALL_POST <a class="code" href="vk__mem__alloc_8h.html#a9f0f8f56db5f7f57fe4454f465142dac">vmaDefragment</a>(</div>
+<div class="line"><a name="l19109"></a><span class="lineno">19109</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div>
+<div class="line"><a name="l19110"></a><span class="lineno">19110</span>&#160;    <span class="keyword">const</span> <a class="code" href="struct_vma_allocation.html">VmaAllocation</a>* pAllocations,</div>
+<div class="line"><a name="l19111"></a><span class="lineno">19111</span>&#160;    <span class="keywordtype">size_t</span> allocationCount,</div>
+<div class="line"><a name="l19112"></a><span class="lineno">19112</span>&#160;    VkBool32* pAllocationsChanged,</div>
+<div class="line"><a name="l19113"></a><span class="lineno">19113</span>&#160;    <span class="keyword">const</span> <a class="code" href="struct_vma_defragmentation_info.html">VmaDefragmentationInfo</a> *pDefragmentationInfo,</div>
+<div class="line"><a name="l19114"></a><span class="lineno">19114</span>&#160;    <a class="code" href="struct_vma_defragmentation_stats.html">VmaDefragmentationStats</a>* pDefragmentationStats)</div>
+<div class="line"><a name="l19115"></a><span class="lineno">19115</span>&#160;{</div>
+<div class="line"><a name="l19116"></a><span class="lineno">19116</span>&#160;    <span class="comment">// Deprecated interface, reimplemented using new one.</span></div>
+<div class="line"><a name="l19117"></a><span class="lineno">19117</span>&#160; </div>
+<div class="line"><a name="l19118"></a><span class="lineno">19118</span>&#160;    <a class="code" href="struct_vma_defragmentation_info2.html">VmaDefragmentationInfo2</a> info2 = {};</div>
+<div class="line"><a name="l19119"></a><span class="lineno">19119</span>&#160;    info2.<a class="code" href="struct_vma_defragmentation_info2.html#a3cf86ab32c1da779b4923d301a3056ba">allocationCount</a> = (uint32_t)allocationCount;</div>
+<div class="line"><a name="l19120"></a><span class="lineno">19120</span>&#160;    info2.<a class="code" href="struct_vma_defragmentation_info2.html#ab6d288f29d028156cf73542d630a2e32">pAllocations</a> = pAllocations;</div>
+<div class="line"><a name="l19121"></a><span class="lineno">19121</span>&#160;    info2.<a class="code" href="struct_vma_defragmentation_info2.html#a76d51a644dc7f5405d0cdd0025ecd0cc">pAllocationsChanged</a> = pAllocationsChanged;</div>
+<div class="line"><a name="l19122"></a><span class="lineno">19122</span>&#160;    <span class="keywordflow">if</span>(pDefragmentationInfo != VMA_NULL)</div>
+<div class="line"><a name="l19123"></a><span class="lineno">19123</span>&#160;    {</div>
+<div class="line"><a name="l19124"></a><span class="lineno">19124</span>&#160;        info2.<a class="code" href="struct_vma_defragmentation_info2.html#a94c2c7223d52878445a8cccce396b671">maxCpuAllocationsToMove</a> = pDefragmentationInfo-&gt;<a class="code" href="struct_vma_defragmentation_info.html#aa7c7304e13c71f604c907196c4e28fbc">maxAllocationsToMove</a>;</div>
+<div class="line"><a name="l19125"></a><span class="lineno">19125</span>&#160;        info2.<a class="code" href="struct_vma_defragmentation_info2.html#af78e1ea40c22d85137b65f6b384a4d0a">maxCpuBytesToMove</a> = pDefragmentationInfo-&gt;<a class="code" href="struct_vma_defragmentation_info.html#acb311c940a777270e67e1b81c5ab6a1d">maxBytesToMove</a>;</div>
+<div class="line"><a name="l19126"></a><span class="lineno">19126</span>&#160;    }</div>
+<div class="line"><a name="l19127"></a><span class="lineno">19127</span>&#160;    <span class="keywordflow">else</span></div>
+<div class="line"><a name="l19128"></a><span class="lineno">19128</span>&#160;    {</div>
+<div class="line"><a name="l19129"></a><span class="lineno">19129</span>&#160;        info2.<a class="code" href="struct_vma_defragmentation_info2.html#a94c2c7223d52878445a8cccce396b671">maxCpuAllocationsToMove</a> = UINT32_MAX;</div>
+<div class="line"><a name="l19130"></a><span class="lineno">19130</span>&#160;        info2.<a class="code" href="struct_vma_defragmentation_info2.html#af78e1ea40c22d85137b65f6b384a4d0a">maxCpuBytesToMove</a> = VK_WHOLE_SIZE;</div>
+<div class="line"><a name="l19131"></a><span class="lineno">19131</span>&#160;    }</div>
+<div class="line"><a name="l19132"></a><span class="lineno">19132</span>&#160;    <span class="comment">// info2.flags, maxGpuAllocationsToMove, maxGpuBytesToMove, commandBuffer deliberately left zero.</span></div>
+<div class="line"><a name="l19133"></a><span class="lineno">19133</span>&#160; </div>
+<div class="line"><a name="l19134"></a><span class="lineno">19134</span>&#160;    <a class="code" href="struct_vma_defragmentation_context.html">VmaDefragmentationContext</a> ctx;</div>
+<div class="line"><a name="l19135"></a><span class="lineno">19135</span>&#160;    VkResult res = <a class="code" href="vk__mem__alloc_8h.html#a36ba776fd7fd5cb1e9359fdc0d8e6e8a">vmaDefragmentationBegin</a>(allocator, &amp;info2, pDefragmentationStats, &amp;ctx);</div>
+<div class="line"><a name="l19136"></a><span class="lineno">19136</span>&#160;    <span class="keywordflow">if</span>(res == VK_NOT_READY)</div>
+<div class="line"><a name="l19137"></a><span class="lineno">19137</span>&#160;    {</div>
+<div class="line"><a name="l19138"></a><span class="lineno">19138</span>&#160;        res = <a class="code" href="vk__mem__alloc_8h.html#a8774e20e91e245aae959ba63efa15dd2">vmaDefragmentationEnd</a>( allocator, ctx);</div>
+<div class="line"><a name="l19139"></a><span class="lineno">19139</span>&#160;    }</div>
+<div class="line"><a name="l19140"></a><span class="lineno">19140</span>&#160;    <span class="keywordflow">return</span> res;</div>
+<div class="line"><a name="l19141"></a><span class="lineno">19141</span>&#160;}</div>
+<div class="line"><a name="l19142"></a><span class="lineno">19142</span>&#160; </div>
+<div class="line"><a name="l19143"></a><span class="lineno">19143</span>&#160;VMA_CALL_PRE VkResult VMA_CALL_POST <a class="code" href="vk__mem__alloc_8h.html#a36ba776fd7fd5cb1e9359fdc0d8e6e8a">vmaDefragmentationBegin</a>(</div>
+<div class="line"><a name="l19144"></a><span class="lineno">19144</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div>
+<div class="line"><a name="l19145"></a><span class="lineno">19145</span>&#160;    <span class="keyword">const</span> <a class="code" href="struct_vma_defragmentation_info2.html">VmaDefragmentationInfo2</a>* pInfo,</div>
+<div class="line"><a name="l19146"></a><span class="lineno">19146</span>&#160;    <a class="code" href="struct_vma_defragmentation_stats.html">VmaDefragmentationStats</a>* pStats,</div>
+<div class="line"><a name="l19147"></a><span class="lineno">19147</span>&#160;    <a class="code" href="struct_vma_defragmentation_context.html">VmaDefragmentationContext</a> *pContext)</div>
+<div class="line"><a name="l19148"></a><span class="lineno">19148</span>&#160;{</div>
+<div class="line"><a name="l19149"></a><span class="lineno">19149</span>&#160;    VMA_ASSERT(allocator &amp;&amp; pInfo &amp;&amp; pContext);</div>
+<div class="line"><a name="l19150"></a><span class="lineno">19150</span>&#160; </div>
+<div class="line"><a name="l19151"></a><span class="lineno">19151</span>&#160;    <span class="comment">// Degenerate case: Nothing to defragment.</span></div>
+<div class="line"><a name="l19152"></a><span class="lineno">19152</span>&#160;    <span class="keywordflow">if</span>(pInfo-&gt;<a class="code" href="struct_vma_defragmentation_info2.html#a3cf86ab32c1da779b4923d301a3056ba">allocationCount</a> == 0 &amp;&amp; pInfo-&gt;<a class="code" href="struct_vma_defragmentation_info2.html#a7e70aa2a1081d849dcc7829b19d3ec9d">poolCount</a> == 0)</div>
+<div class="line"><a name="l19153"></a><span class="lineno">19153</span>&#160;    {</div>
+<div class="line"><a name="l19154"></a><span class="lineno">19154</span>&#160;        <span class="keywordflow">return</span> VK_SUCCESS;</div>
+<div class="line"><a name="l19155"></a><span class="lineno">19155</span>&#160;    }</div>
+<div class="line"><a name="l19156"></a><span class="lineno">19156</span>&#160; </div>
+<div class="line"><a name="l19157"></a><span class="lineno">19157</span>&#160;    VMA_ASSERT(pInfo-&gt;<a class="code" href="struct_vma_defragmentation_info2.html#a3cf86ab32c1da779b4923d301a3056ba">allocationCount</a> == 0 || pInfo-&gt;<a class="code" href="struct_vma_defragmentation_info2.html#ab6d288f29d028156cf73542d630a2e32">pAllocations</a> != VMA_NULL);</div>
+<div class="line"><a name="l19158"></a><span class="lineno">19158</span>&#160;    VMA_ASSERT(pInfo-&gt;<a class="code" href="struct_vma_defragmentation_info2.html#a7e70aa2a1081d849dcc7829b19d3ec9d">poolCount</a> == 0 || pInfo-&gt;<a class="code" href="struct_vma_defragmentation_info2.html#a3c9c6aa5c97d5670f8e362b3a6f3029b">pPools</a> != VMA_NULL);</div>
+<div class="line"><a name="l19159"></a><span class="lineno">19159</span>&#160;    VMA_HEAVY_ASSERT(VmaValidatePointerArray(pInfo-&gt;<a class="code" href="struct_vma_defragmentation_info2.html#a3cf86ab32c1da779b4923d301a3056ba">allocationCount</a>, pInfo-&gt;<a class="code" href="struct_vma_defragmentation_info2.html#ab6d288f29d028156cf73542d630a2e32">pAllocations</a>));</div>
+<div class="line"><a name="l19160"></a><span class="lineno">19160</span>&#160;    VMA_HEAVY_ASSERT(VmaValidatePointerArray(pInfo-&gt;<a class="code" href="struct_vma_defragmentation_info2.html#a7e70aa2a1081d849dcc7829b19d3ec9d">poolCount</a>, pInfo-&gt;<a class="code" href="struct_vma_defragmentation_info2.html#a3c9c6aa5c97d5670f8e362b3a6f3029b">pPools</a>));</div>
+<div class="line"><a name="l19161"></a><span class="lineno">19161</span>&#160; </div>
+<div class="line"><a name="l19162"></a><span class="lineno">19162</span>&#160;    VMA_DEBUG_LOG(<span class="stringliteral">&quot;vmaDefragmentationBegin&quot;</span>);</div>
+<div class="line"><a name="l19163"></a><span class="lineno">19163</span>&#160; </div>
+<div class="line"><a name="l19164"></a><span class="lineno">19164</span>&#160;    VMA_DEBUG_GLOBAL_MUTEX_LOCK</div>
+<div class="line"><a name="l19165"></a><span class="lineno">19165</span>&#160; </div>
+<div class="line"><a name="l19166"></a><span class="lineno">19166</span>&#160;    VkResult res = allocator-&gt;DefragmentationBegin(*pInfo, pStats, pContext);</div>
+<div class="line"><a name="l19167"></a><span class="lineno">19167</span>&#160; </div>
+<div class="line"><a name="l19168"></a><span class="lineno">19168</span>&#160;<span class="preprocessor">#if VMA_RECORDING_ENABLED</span></div>
+<div class="line"><a name="l19169"></a><span class="lineno">19169</span>&#160;    <span class="keywordflow">if</span>(allocator-&gt;GetRecorder() != VMA_NULL)</div>
+<div class="line"><a name="l19170"></a><span class="lineno">19170</span>&#160;    {</div>
+<div class="line"><a name="l19171"></a><span class="lineno">19171</span>&#160;        allocator-&gt;GetRecorder()-&gt;RecordDefragmentationBegin(</div>
+<div class="line"><a name="l19172"></a><span class="lineno">19172</span>&#160;            allocator-&gt;GetCurrentFrameIndex(), *pInfo, *pContext);</div>
+<div class="line"><a name="l19173"></a><span class="lineno">19173</span>&#160;    }</div>
+<div class="line"><a name="l19174"></a><span class="lineno">19174</span>&#160;<span class="preprocessor">#endif</span></div>
+<div class="line"><a name="l19175"></a><span class="lineno">19175</span>&#160; </div>
+<div class="line"><a name="l19176"></a><span class="lineno">19176</span>&#160;    <span class="keywordflow">return</span> res;</div>
+<div class="line"><a name="l19177"></a><span class="lineno">19177</span>&#160;}</div>
+<div class="line"><a name="l19178"></a><span class="lineno">19178</span>&#160; </div>
+<div class="line"><a name="l19179"></a><span class="lineno">19179</span>&#160;VMA_CALL_PRE VkResult VMA_CALL_POST <a class="code" href="vk__mem__alloc_8h.html#a8774e20e91e245aae959ba63efa15dd2">vmaDefragmentationEnd</a>(</div>
+<div class="line"><a name="l19180"></a><span class="lineno">19180</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div>
+<div class="line"><a name="l19181"></a><span class="lineno">19181</span>&#160;    <a class="code" href="struct_vma_defragmentation_context.html">VmaDefragmentationContext</a> context)</div>
+<div class="line"><a name="l19182"></a><span class="lineno">19182</span>&#160;{</div>
+<div class="line"><a name="l19183"></a><span class="lineno">19183</span>&#160;    VMA_ASSERT(allocator);</div>
+<div class="line"><a name="l19184"></a><span class="lineno">19184</span>&#160; </div>
+<div class="line"><a name="l19185"></a><span class="lineno">19185</span>&#160;    VMA_DEBUG_LOG(<span class="stringliteral">&quot;vmaDefragmentationEnd&quot;</span>);</div>
+<div class="line"><a name="l19186"></a><span class="lineno">19186</span>&#160; </div>
+<div class="line"><a name="l19187"></a><span class="lineno">19187</span>&#160;    <span class="keywordflow">if</span>(context != VK_NULL_HANDLE)</div>
+<div class="line"><a name="l19188"></a><span class="lineno">19188</span>&#160;    {</div>
+<div class="line"><a name="l19189"></a><span class="lineno">19189</span>&#160;        VMA_DEBUG_GLOBAL_MUTEX_LOCK</div>
+<div class="line"><a name="l19190"></a><span class="lineno">19190</span>&#160; </div>
+<div class="line"><a name="l19191"></a><span class="lineno">19191</span>&#160;<span class="preprocessor">#if VMA_RECORDING_ENABLED</span></div>
+<div class="line"><a name="l19192"></a><span class="lineno">19192</span>&#160;        <span class="keywordflow">if</span>(allocator-&gt;GetRecorder() != VMA_NULL)</div>
+<div class="line"><a name="l19193"></a><span class="lineno">19193</span>&#160;        {</div>
+<div class="line"><a name="l19194"></a><span class="lineno">19194</span>&#160;            allocator-&gt;GetRecorder()-&gt;RecordDefragmentationEnd(</div>
+<div class="line"><a name="l19195"></a><span class="lineno">19195</span>&#160;                allocator-&gt;GetCurrentFrameIndex(), context);</div>
+<div class="line"><a name="l19196"></a><span class="lineno">19196</span>&#160;        }</div>
+<div class="line"><a name="l19197"></a><span class="lineno">19197</span>&#160;<span class="preprocessor">#endif</span></div>
+<div class="line"><a name="l19198"></a><span class="lineno">19198</span>&#160; </div>
+<div class="line"><a name="l19199"></a><span class="lineno">19199</span>&#160;        <span class="keywordflow">return</span> allocator-&gt;DefragmentationEnd(context);</div>
+<div class="line"><a name="l19200"></a><span class="lineno">19200</span>&#160;    }</div>
+<div class="line"><a name="l19201"></a><span class="lineno">19201</span>&#160;    <span class="keywordflow">else</span></div>
+<div class="line"><a name="l19202"></a><span class="lineno">19202</span>&#160;    {</div>
+<div class="line"><a name="l19203"></a><span class="lineno">19203</span>&#160;        <span class="keywordflow">return</span> VK_SUCCESS;</div>
+<div class="line"><a name="l19204"></a><span class="lineno">19204</span>&#160;    }</div>
+<div class="line"><a name="l19205"></a><span class="lineno">19205</span>&#160;}</div>
+<div class="line"><a name="l19206"></a><span class="lineno">19206</span>&#160; </div>
+<div class="line"><a name="l19207"></a><span class="lineno">19207</span>&#160;VMA_CALL_PRE VkResult VMA_CALL_POST <a class="code" href="vk__mem__alloc_8h.html#ac0f01545b6262f7d4d128fc8f8e5c77b">vmaBeginDefragmentationPass</a>(</div>
+<div class="line"><a name="l19208"></a><span class="lineno">19208</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div>
+<div class="line"><a name="l19209"></a><span class="lineno">19209</span>&#160;    <a class="code" href="struct_vma_defragmentation_context.html">VmaDefragmentationContext</a> context,</div>
+<div class="line"><a name="l19210"></a><span class="lineno">19210</span>&#160;    <a class="code" href="struct_vma_defragmentation_pass_info.html">VmaDefragmentationPassInfo</a>* pInfo</div>
+<div class="line"><a name="l19211"></a><span class="lineno">19211</span>&#160;    )</div>
+<div class="line"><a name="l19212"></a><span class="lineno">19212</span>&#160;{</div>
+<div class="line"><a name="l19213"></a><span class="lineno">19213</span>&#160;    VMA_ASSERT(allocator);</div>
+<div class="line"><a name="l19214"></a><span class="lineno">19214</span>&#160;    VMA_ASSERT(pInfo);</div>
+<div class="line"><a name="l19215"></a><span class="lineno">19215</span>&#160; </div>
+<div class="line"><a name="l19216"></a><span class="lineno">19216</span>&#160;    VMA_DEBUG_LOG(<span class="stringliteral">&quot;vmaBeginDefragmentationPass&quot;</span>);</div>
+<div class="line"><a name="l19217"></a><span class="lineno">19217</span>&#160; </div>
+<div class="line"><a name="l19218"></a><span class="lineno">19218</span>&#160;    VMA_DEBUG_GLOBAL_MUTEX_LOCK</div>
+<div class="line"><a name="l19219"></a><span class="lineno">19219</span>&#160; </div>
+<div class="line"><a name="l19220"></a><span class="lineno">19220</span>&#160;    <span class="keywordflow">if</span>(context == VK_NULL_HANDLE)</div>
+<div class="line"><a name="l19221"></a><span class="lineno">19221</span>&#160;    {</div>
+<div class="line"><a name="l19222"></a><span class="lineno">19222</span>&#160;        pInfo-&gt;<a class="code" href="struct_vma_defragmentation_pass_info.html#ac1086e657ba995f8d1f4e49b83dcfb6c">moveCount</a> = 0;</div>
+<div class="line"><a name="l19223"></a><span class="lineno">19223</span>&#160;        <span class="keywordflow">return</span> VK_SUCCESS;</div>
+<div class="line"><a name="l19224"></a><span class="lineno">19224</span>&#160;    }</div>
+<div class="line"><a name="l19225"></a><span class="lineno">19225</span>&#160; </div>
+<div class="line"><a name="l19226"></a><span class="lineno">19226</span>&#160;    <span class="keywordflow">return</span> allocator-&gt;DefragmentationPassBegin(pInfo, context);</div>
+<div class="line"><a name="l19227"></a><span class="lineno">19227</span>&#160;}</div>
+<div class="line"><a name="l19228"></a><span class="lineno">19228</span>&#160;VMA_CALL_PRE VkResult VMA_CALL_POST <a class="code" href="vk__mem__alloc_8h.html#a1b9ffa538bed905af55c747cc48963bd">vmaEndDefragmentationPass</a>(</div>
+<div class="line"><a name="l19229"></a><span class="lineno">19229</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div>
+<div class="line"><a name="l19230"></a><span class="lineno">19230</span>&#160;    <a class="code" href="struct_vma_defragmentation_context.html">VmaDefragmentationContext</a> context)</div>
+<div class="line"><a name="l19231"></a><span class="lineno">19231</span>&#160;{</div>
+<div class="line"><a name="l19232"></a><span class="lineno">19232</span>&#160;    VMA_ASSERT(allocator);</div>
+<div class="line"><a name="l19233"></a><span class="lineno">19233</span>&#160; </div>
+<div class="line"><a name="l19234"></a><span class="lineno">19234</span>&#160;    VMA_DEBUG_LOG(<span class="stringliteral">&quot;vmaEndDefragmentationPass&quot;</span>);</div>
+<div class="line"><a name="l19235"></a><span class="lineno">19235</span>&#160;    VMA_DEBUG_GLOBAL_MUTEX_LOCK</div>
+<div class="line"><a name="l19236"></a><span class="lineno">19236</span>&#160; </div>
+<div class="line"><a name="l19237"></a><span class="lineno">19237</span>&#160;    <span class="keywordflow">if</span>(context == VK_NULL_HANDLE)</div>
+<div class="line"><a name="l19238"></a><span class="lineno">19238</span>&#160;        <span class="keywordflow">return</span> VK_SUCCESS;</div>
+<div class="line"><a name="l19239"></a><span class="lineno">19239</span>&#160; </div>
+<div class="line"><a name="l19240"></a><span class="lineno">19240</span>&#160;    <span class="keywordflow">return</span> allocator-&gt;DefragmentationPassEnd(context);</div>
+<div class="line"><a name="l19241"></a><span class="lineno">19241</span>&#160;}</div>
+<div class="line"><a name="l19242"></a><span class="lineno">19242</span>&#160; </div>
+<div class="line"><a name="l19243"></a><span class="lineno">19243</span>&#160;VMA_CALL_PRE VkResult VMA_CALL_POST <a class="code" href="vk__mem__alloc_8h.html#a6b0929b914b60cf2d45cac4bf3547470">vmaBindBufferMemory</a>(</div>
+<div class="line"><a name="l19244"></a><span class="lineno">19244</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div>
+<div class="line"><a name="l19245"></a><span class="lineno">19245</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation,</div>
+<div class="line"><a name="l19246"></a><span class="lineno">19246</span>&#160;    VkBuffer buffer)</div>
+<div class="line"><a name="l19247"></a><span class="lineno">19247</span>&#160;{</div>
+<div class="line"><a name="l19248"></a><span class="lineno">19248</span>&#160;    VMA_ASSERT(allocator &amp;&amp; allocation &amp;&amp; buffer);</div>
+<div class="line"><a name="l19249"></a><span class="lineno">19249</span>&#160; </div>
+<div class="line"><a name="l19250"></a><span class="lineno">19250</span>&#160;    VMA_DEBUG_LOG(<span class="stringliteral">&quot;vmaBindBufferMemory&quot;</span>);</div>
+<div class="line"><a name="l19251"></a><span class="lineno">19251</span>&#160; </div>
+<div class="line"><a name="l19252"></a><span class="lineno">19252</span>&#160;    VMA_DEBUG_GLOBAL_MUTEX_LOCK</div>
+<div class="line"><a name="l19253"></a><span class="lineno">19253</span>&#160; </div>
+<div class="line"><a name="l19254"></a><span class="lineno">19254</span>&#160;    <span class="keywordflow">return</span> allocator-&gt;BindBufferMemory(allocation, 0, buffer, VMA_NULL);</div>
+<div class="line"><a name="l19255"></a><span class="lineno">19255</span>&#160;}</div>
+<div class="line"><a name="l19256"></a><span class="lineno">19256</span>&#160; </div>
+<div class="line"><a name="l19257"></a><span class="lineno">19257</span>&#160;VMA_CALL_PRE VkResult VMA_CALL_POST <a class="code" href="vk__mem__alloc_8h.html#a927c944f45e0f2941182abb6f608e64a">vmaBindBufferMemory2</a>(</div>
+<div class="line"><a name="l19258"></a><span class="lineno">19258</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div>
+<div class="line"><a name="l19259"></a><span class="lineno">19259</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation,</div>
+<div class="line"><a name="l19260"></a><span class="lineno">19260</span>&#160;    VkDeviceSize allocationLocalOffset,</div>
+<div class="line"><a name="l19261"></a><span class="lineno">19261</span>&#160;    VkBuffer buffer,</div>
+<div class="line"><a name="l19262"></a><span class="lineno">19262</span>&#160;    <span class="keyword">const</span> <span class="keywordtype">void</span>* pNext)</div>
+<div class="line"><a name="l19263"></a><span class="lineno">19263</span>&#160;{</div>
+<div class="line"><a name="l19264"></a><span class="lineno">19264</span>&#160;    VMA_ASSERT(allocator &amp;&amp; allocation &amp;&amp; buffer);</div>
+<div class="line"><a name="l19265"></a><span class="lineno">19265</span>&#160; </div>
+<div class="line"><a name="l19266"></a><span class="lineno">19266</span>&#160;    VMA_DEBUG_LOG(<span class="stringliteral">&quot;vmaBindBufferMemory2&quot;</span>);</div>
+<div class="line"><a name="l19267"></a><span class="lineno">19267</span>&#160; </div>
+<div class="line"><a name="l19268"></a><span class="lineno">19268</span>&#160;    VMA_DEBUG_GLOBAL_MUTEX_LOCK</div>
+<div class="line"><a name="l19269"></a><span class="lineno">19269</span>&#160; </div>
+<div class="line"><a name="l19270"></a><span class="lineno">19270</span>&#160;    <span class="keywordflow">return</span> allocator-&gt;BindBufferMemory(allocation, allocationLocalOffset, buffer, pNext);</div>
+<div class="line"><a name="l19271"></a><span class="lineno">19271</span>&#160;}</div>
+<div class="line"><a name="l19272"></a><span class="lineno">19272</span>&#160; </div>
+<div class="line"><a name="l19273"></a><span class="lineno">19273</span>&#160;VMA_CALL_PRE VkResult VMA_CALL_POST <a class="code" href="vk__mem__alloc_8h.html#a3d3ca45799923aa5d138e9e5f9eb2da5">vmaBindImageMemory</a>(</div>
+<div class="line"><a name="l19274"></a><span class="lineno">19274</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div>
+<div class="line"><a name="l19275"></a><span class="lineno">19275</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation,</div>
+<div class="line"><a name="l19276"></a><span class="lineno">19276</span>&#160;    VkImage image)</div>
+<div class="line"><a name="l19277"></a><span class="lineno">19277</span>&#160;{</div>
+<div class="line"><a name="l19278"></a><span class="lineno">19278</span>&#160;    VMA_ASSERT(allocator &amp;&amp; allocation &amp;&amp; image);</div>
+<div class="line"><a name="l19279"></a><span class="lineno">19279</span>&#160; </div>
+<div class="line"><a name="l19280"></a><span class="lineno">19280</span>&#160;    VMA_DEBUG_LOG(<span class="stringliteral">&quot;vmaBindImageMemory&quot;</span>);</div>
+<div class="line"><a name="l19281"></a><span class="lineno">19281</span>&#160; </div>
+<div class="line"><a name="l19282"></a><span class="lineno">19282</span>&#160;    VMA_DEBUG_GLOBAL_MUTEX_LOCK</div>
+<div class="line"><a name="l19283"></a><span class="lineno">19283</span>&#160; </div>
+<div class="line"><a name="l19284"></a><span class="lineno">19284</span>&#160;    <span class="keywordflow">return</span> allocator-&gt;BindImageMemory(allocation, 0, image, VMA_NULL);</div>
+<div class="line"><a name="l19285"></a><span class="lineno">19285</span>&#160;}</div>
+<div class="line"><a name="l19286"></a><span class="lineno">19286</span>&#160; </div>
+<div class="line"><a name="l19287"></a><span class="lineno">19287</span>&#160;VMA_CALL_PRE VkResult VMA_CALL_POST <a class="code" href="vk__mem__alloc_8h.html#aa8251ee81b0045a443e35b8e8aa021bc">vmaBindImageMemory2</a>(</div>
+<div class="line"><a name="l19288"></a><span class="lineno">19288</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div>
+<div class="line"><a name="l19289"></a><span class="lineno">19289</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation,</div>
+<div class="line"><a name="l19290"></a><span class="lineno">19290</span>&#160;    VkDeviceSize allocationLocalOffset,</div>
+<div class="line"><a name="l19291"></a><span class="lineno">19291</span>&#160;    VkImage image,</div>
+<div class="line"><a name="l19292"></a><span class="lineno">19292</span>&#160;    <span class="keyword">const</span> <span class="keywordtype">void</span>* pNext)</div>
+<div class="line"><a name="l19293"></a><span class="lineno">19293</span>&#160;{</div>
+<div class="line"><a name="l19294"></a><span class="lineno">19294</span>&#160;    VMA_ASSERT(allocator &amp;&amp; allocation &amp;&amp; image);</div>
+<div class="line"><a name="l19295"></a><span class="lineno">19295</span>&#160; </div>
+<div class="line"><a name="l19296"></a><span class="lineno">19296</span>&#160;    VMA_DEBUG_LOG(<span class="stringliteral">&quot;vmaBindImageMemory2&quot;</span>);</div>
+<div class="line"><a name="l19297"></a><span class="lineno">19297</span>&#160; </div>
+<div class="line"><a name="l19298"></a><span class="lineno">19298</span>&#160;    VMA_DEBUG_GLOBAL_MUTEX_LOCK</div>
+<div class="line"><a name="l19299"></a><span class="lineno">19299</span>&#160; </div>
+<div class="line"><a name="l19300"></a><span class="lineno">19300</span>&#160;        <span class="keywordflow">return</span> allocator-&gt;BindImageMemory(allocation, allocationLocalOffset, image, pNext);</div>
+<div class="line"><a name="l19301"></a><span class="lineno">19301</span>&#160;}</div>
+<div class="line"><a name="l19302"></a><span class="lineno">19302</span>&#160; </div>
+<div class="line"><a name="l19303"></a><span class="lineno">19303</span>&#160;VMA_CALL_PRE VkResult VMA_CALL_POST <a class="code" href="vk__mem__alloc_8h.html#ac72ee55598617e8eecca384e746bab51">vmaCreateBuffer</a>(</div>
+<div class="line"><a name="l19304"></a><span class="lineno">19304</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div>
+<div class="line"><a name="l19305"></a><span class="lineno">19305</span>&#160;    <span class="keyword">const</span> VkBufferCreateInfo* pBufferCreateInfo,</div>
+<div class="line"><a name="l19306"></a><span class="lineno">19306</span>&#160;    <span class="keyword">const</span> <a class="code" href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a>* pAllocationCreateInfo,</div>
+<div class="line"><a name="l19307"></a><span class="lineno">19307</span>&#160;    VkBuffer* pBuffer,</div>
+<div class="line"><a name="l19308"></a><span class="lineno">19308</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a>* pAllocation,</div>
+<div class="line"><a name="l19309"></a><span class="lineno">19309</span>&#160;    <a class="code" href="struct_vma_allocation_info.html">VmaAllocationInfo</a>* pAllocationInfo)</div>
+<div class="line"><a name="l19310"></a><span class="lineno">19310</span>&#160;{</div>
+<div class="line"><a name="l19311"></a><span class="lineno">19311</span>&#160;    VMA_ASSERT(allocator &amp;&amp; pBufferCreateInfo &amp;&amp; pAllocationCreateInfo &amp;&amp; pBuffer &amp;&amp; pAllocation);</div>
+<div class="line"><a name="l19312"></a><span class="lineno">19312</span>&#160; </div>
+<div class="line"><a name="l19313"></a><span class="lineno">19313</span>&#160;    <span class="keywordflow">if</span>(pBufferCreateInfo-&gt;size == 0)</div>
+<div class="line"><a name="l19314"></a><span class="lineno">19314</span>&#160;    {</div>
+<div class="line"><a name="l19315"></a><span class="lineno">19315</span>&#160;        <span class="keywordflow">return</span> VK_ERROR_VALIDATION_FAILED_EXT;</div>
+<div class="line"><a name="l19316"></a><span class="lineno">19316</span>&#160;    }</div>
+<div class="line"><a name="l19317"></a><span class="lineno">19317</span>&#160;    <span class="keywordflow">if</span>((pBufferCreateInfo-&gt;usage &amp; VK_BUFFER_USAGE_SHADER_DEVICE_ADDRESS_BIT_COPY) != 0 &amp;&amp;</div>
+<div class="line"><a name="l19318"></a><span class="lineno">19318</span>&#160;        !allocator-&gt;m_UseKhrBufferDeviceAddress)</div>
+<div class="line"><a name="l19319"></a><span class="lineno">19319</span>&#160;    {</div>
+<div class="line"><a name="l19320"></a><span class="lineno">19320</span>&#160;        VMA_ASSERT(0 &amp;&amp; <span class="stringliteral">&quot;Creating a buffer with VK_BUFFER_USAGE_SHADER_DEVICE_ADDRESS_BIT is not valid if VMA_ALLOCATOR_CREATE_BUFFER_DEVICE_ADDRESS_BIT was not used.&quot;</span>);</div>
+<div class="line"><a name="l19321"></a><span class="lineno">19321</span>&#160;        <span class="keywordflow">return</span> VK_ERROR_VALIDATION_FAILED_EXT;</div>
+<div class="line"><a name="l19322"></a><span class="lineno">19322</span>&#160;    }</div>
+<div class="line"><a name="l19323"></a><span class="lineno">19323</span>&#160; </div>
+<div class="line"><a name="l19324"></a><span class="lineno">19324</span>&#160;    VMA_DEBUG_LOG(<span class="stringliteral">&quot;vmaCreateBuffer&quot;</span>);</div>
+<div class="line"><a name="l19325"></a><span class="lineno">19325</span>&#160; </div>
+<div class="line"><a name="l19326"></a><span class="lineno">19326</span>&#160;    VMA_DEBUG_GLOBAL_MUTEX_LOCK</div>
+<div class="line"><a name="l19327"></a><span class="lineno">19327</span>&#160; </div>
+<div class="line"><a name="l19328"></a><span class="lineno">19328</span>&#160;    *pBuffer = VK_NULL_HANDLE;</div>
+<div class="line"><a name="l19329"></a><span class="lineno">19329</span>&#160;    *pAllocation = VK_NULL_HANDLE;</div>
+<div class="line"><a name="l19330"></a><span class="lineno">19330</span>&#160; </div>
+<div class="line"><a name="l19331"></a><span class="lineno">19331</span>&#160;    <span class="comment">// 1. Create VkBuffer.</span></div>
+<div class="line"><a name="l19332"></a><span class="lineno">19332</span>&#160;    VkResult res = (*allocator-&gt;GetVulkanFunctions().vkCreateBuffer)(</div>
+<div class="line"><a name="l19333"></a><span class="lineno">19333</span>&#160;        allocator-&gt;m_hDevice,</div>
+<div class="line"><a name="l19334"></a><span class="lineno">19334</span>&#160;        pBufferCreateInfo,</div>
+<div class="line"><a name="l19335"></a><span class="lineno">19335</span>&#160;        allocator-&gt;GetAllocationCallbacks(),</div>
+<div class="line"><a name="l19336"></a><span class="lineno">19336</span>&#160;        pBuffer);</div>
+<div class="line"><a name="l19337"></a><span class="lineno">19337</span>&#160;    <span class="keywordflow">if</span>(res &gt;= 0)</div>
+<div class="line"><a name="l19338"></a><span class="lineno">19338</span>&#160;    {</div>
+<div class="line"><a name="l19339"></a><span class="lineno">19339</span>&#160;        <span class="comment">// 2. vkGetBufferMemoryRequirements.</span></div>
+<div class="line"><a name="l19340"></a><span class="lineno">19340</span>&#160;        VkMemoryRequirements vkMemReq = {};</div>
+<div class="line"><a name="l19341"></a><span class="lineno">19341</span>&#160;        <span class="keywordtype">bool</span> requiresDedicatedAllocation = <span class="keyword">false</span>;</div>
+<div class="line"><a name="l19342"></a><span class="lineno">19342</span>&#160;        <span class="keywordtype">bool</span> prefersDedicatedAllocation  = <span class="keyword">false</span>;</div>
+<div class="line"><a name="l19343"></a><span class="lineno">19343</span>&#160;        allocator-&gt;GetBufferMemoryRequirements(*pBuffer, vkMemReq,</div>
+<div class="line"><a name="l19344"></a><span class="lineno">19344</span>&#160;            requiresDedicatedAllocation, prefersDedicatedAllocation);</div>
+<div class="line"><a name="l19345"></a><span class="lineno">19345</span>&#160; </div>
+<div class="line"><a name="l19346"></a><span class="lineno">19346</span>&#160;        <span class="comment">// 3. Allocate memory using allocator.</span></div>
+<div class="line"><a name="l19347"></a><span class="lineno">19347</span>&#160;        res = allocator-&gt;AllocateMemory(</div>
+<div class="line"><a name="l19348"></a><span class="lineno">19348</span>&#160;            vkMemReq,</div>
+<div class="line"><a name="l19349"></a><span class="lineno">19349</span>&#160;            requiresDedicatedAllocation,</div>
+<div class="line"><a name="l19350"></a><span class="lineno">19350</span>&#160;            prefersDedicatedAllocation,</div>
+<div class="line"><a name="l19351"></a><span class="lineno">19351</span>&#160;            *pBuffer, <span class="comment">// dedicatedBuffer</span></div>
+<div class="line"><a name="l19352"></a><span class="lineno">19352</span>&#160;            pBufferCreateInfo-&gt;usage, <span class="comment">// dedicatedBufferUsage</span></div>
+<div class="line"><a name="l19353"></a><span class="lineno">19353</span>&#160;            VK_NULL_HANDLE, <span class="comment">// dedicatedImage</span></div>
+<div class="line"><a name="l19354"></a><span class="lineno">19354</span>&#160;            *pAllocationCreateInfo,</div>
+<div class="line"><a name="l19355"></a><span class="lineno">19355</span>&#160;            VMA_SUBALLOCATION_TYPE_BUFFER,</div>
+<div class="line"><a name="l19356"></a><span class="lineno">19356</span>&#160;            1, <span class="comment">// allocationCount</span></div>
+<div class="line"><a name="l19357"></a><span class="lineno">19357</span>&#160;            pAllocation);</div>
+<div class="line"><a name="l19358"></a><span class="lineno">19358</span>&#160; </div>
+<div class="line"><a name="l19359"></a><span class="lineno">19359</span>&#160;<span class="preprocessor">#if VMA_RECORDING_ENABLED</span></div>
+<div class="line"><a name="l19360"></a><span class="lineno">19360</span>&#160;        <span class="keywordflow">if</span>(allocator-&gt;GetRecorder() != VMA_NULL)</div>
+<div class="line"><a name="l19361"></a><span class="lineno">19361</span>&#160;        {</div>
+<div class="line"><a name="l19362"></a><span class="lineno">19362</span>&#160;            allocator-&gt;GetRecorder()-&gt;RecordCreateBuffer(</div>
+<div class="line"><a name="l19363"></a><span class="lineno">19363</span>&#160;                allocator-&gt;GetCurrentFrameIndex(),</div>
+<div class="line"><a name="l19364"></a><span class="lineno">19364</span>&#160;                *pBufferCreateInfo,</div>
+<div class="line"><a name="l19365"></a><span class="lineno">19365</span>&#160;                *pAllocationCreateInfo,</div>
+<div class="line"><a name="l19366"></a><span class="lineno">19366</span>&#160;                *pAllocation);</div>
+<div class="line"><a name="l19367"></a><span class="lineno">19367</span>&#160;        }</div>
+<div class="line"><a name="l19368"></a><span class="lineno">19368</span>&#160;<span class="preprocessor">#endif</span></div>
+<div class="line"><a name="l19369"></a><span class="lineno">19369</span>&#160; </div>
+<div class="line"><a name="l19370"></a><span class="lineno">19370</span>&#160;        <span class="keywordflow">if</span>(res &gt;= 0)</div>
+<div class="line"><a name="l19371"></a><span class="lineno">19371</span>&#160;        {</div>
+<div class="line"><a name="l19372"></a><span class="lineno">19372</span>&#160;            <span class="comment">// 3. Bind buffer with memory.</span></div>
+<div class="line"><a name="l19373"></a><span class="lineno">19373</span>&#160;            <span class="keywordflow">if</span>((pAllocationCreateInfo-&gt;<a class="code" href="struct_vma_allocation_create_info.html#add09658ac14fe290ace25470ddd6d41b">flags</a> &amp; <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a2310568c62208af432724305fe29ccea">VMA_ALLOCATION_CREATE_DONT_BIND_BIT</a>) == 0)</div>
+<div class="line"><a name="l19374"></a><span class="lineno">19374</span>&#160;            {</div>
+<div class="line"><a name="l19375"></a><span class="lineno">19375</span>&#160;                res = allocator-&gt;BindBufferMemory(*pAllocation, 0, *pBuffer, VMA_NULL);</div>
+<div class="line"><a name="l19376"></a><span class="lineno">19376</span>&#160;            }</div>
+<div class="line"><a name="l19377"></a><span class="lineno">19377</span>&#160;            <span class="keywordflow">if</span>(res &gt;= 0)</div>
+<div class="line"><a name="l19378"></a><span class="lineno">19378</span>&#160;            {</div>
+<div class="line"><a name="l19379"></a><span class="lineno">19379</span>&#160;                <span class="comment">// All steps succeeded.</span></div>
+<div class="line"><a name="l19380"></a><span class="lineno">19380</span>&#160;<span class="preprocessor">                #if VMA_STATS_STRING_ENABLED</span></div>
+<div class="line"><a name="l19381"></a><span class="lineno">19381</span>&#160;                    (*pAllocation)-&gt;InitBufferImageUsage(pBufferCreateInfo-&gt;usage);</div>
+<div class="line"><a name="l19382"></a><span class="lineno">19382</span>&#160;<span class="preprocessor">                #endif</span></div>
+<div class="line"><a name="l19383"></a><span class="lineno">19383</span>&#160;                <span class="keywordflow">if</span>(pAllocationInfo != VMA_NULL)</div>
+<div class="line"><a name="l19384"></a><span class="lineno">19384</span>&#160;                {</div>
+<div class="line"><a name="l19385"></a><span class="lineno">19385</span>&#160;                    allocator-&gt;GetAllocationInfo(*pAllocation, pAllocationInfo);</div>
+<div class="line"><a name="l19386"></a><span class="lineno">19386</span>&#160;                }</div>
+<div class="line"><a name="l19387"></a><span class="lineno">19387</span>&#160; </div>
+<div class="line"><a name="l19388"></a><span class="lineno">19388</span>&#160;                <span class="keywordflow">return</span> VK_SUCCESS;</div>
+<div class="line"><a name="l19389"></a><span class="lineno">19389</span>&#160;            }</div>
+<div class="line"><a name="l19390"></a><span class="lineno">19390</span>&#160;            allocator-&gt;FreeMemory(</div>
+<div class="line"><a name="l19391"></a><span class="lineno">19391</span>&#160;                1, <span class="comment">// allocationCount</span></div>
+<div class="line"><a name="l19392"></a><span class="lineno">19392</span>&#160;                pAllocation);</div>
+<div class="line"><a name="l19393"></a><span class="lineno">19393</span>&#160;            *pAllocation = VK_NULL_HANDLE;</div>
+<div class="line"><a name="l19394"></a><span class="lineno">19394</span>&#160;            (*allocator-&gt;GetVulkanFunctions().vkDestroyBuffer)(allocator-&gt;m_hDevice, *pBuffer, allocator-&gt;GetAllocationCallbacks());</div>
+<div class="line"><a name="l19395"></a><span class="lineno">19395</span>&#160;            *pBuffer = VK_NULL_HANDLE;</div>
+<div class="line"><a name="l19396"></a><span class="lineno">19396</span>&#160;            <span class="keywordflow">return</span> res;</div>
+<div class="line"><a name="l19397"></a><span class="lineno">19397</span>&#160;        }</div>
+<div class="line"><a name="l19398"></a><span class="lineno">19398</span>&#160;        (*allocator-&gt;GetVulkanFunctions().vkDestroyBuffer)(allocator-&gt;m_hDevice, *pBuffer, allocator-&gt;GetAllocationCallbacks());</div>
+<div class="line"><a name="l19399"></a><span class="lineno">19399</span>&#160;        *pBuffer = VK_NULL_HANDLE;</div>
+<div class="line"><a name="l19400"></a><span class="lineno">19400</span>&#160;        <span class="keywordflow">return</span> res;</div>
+<div class="line"><a name="l19401"></a><span class="lineno">19401</span>&#160;    }</div>
+<div class="line"><a name="l19402"></a><span class="lineno">19402</span>&#160;    <span class="keywordflow">return</span> res;</div>
+<div class="line"><a name="l19403"></a><span class="lineno">19403</span>&#160;}</div>
+<div class="line"><a name="l19404"></a><span class="lineno">19404</span>&#160; </div>
+<div class="line"><a name="l19405"></a><span class="lineno">19405</span>&#160;VMA_CALL_PRE <span class="keywordtype">void</span> VMA_CALL_POST <a class="code" href="vk__mem__alloc_8h.html#a0d9f4e4ba5bf9aab1f1c746387753d77">vmaDestroyBuffer</a>(</div>
+<div class="line"><a name="l19406"></a><span class="lineno">19406</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div>
+<div class="line"><a name="l19407"></a><span class="lineno">19407</span>&#160;    VkBuffer buffer,</div>
+<div class="line"><a name="l19408"></a><span class="lineno">19408</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation)</div>
+<div class="line"><a name="l19409"></a><span class="lineno">19409</span>&#160;{</div>
+<div class="line"><a name="l19410"></a><span class="lineno">19410</span>&#160;    VMA_ASSERT(allocator);</div>
+<div class="line"><a name="l19411"></a><span class="lineno">19411</span>&#160; </div>
+<div class="line"><a name="l19412"></a><span class="lineno">19412</span>&#160;    <span class="keywordflow">if</span>(buffer == VK_NULL_HANDLE &amp;&amp; allocation == VK_NULL_HANDLE)</div>
+<div class="line"><a name="l19413"></a><span class="lineno">19413</span>&#160;    {</div>
+<div class="line"><a name="l19414"></a><span class="lineno">19414</span>&#160;        <span class="keywordflow">return</span>;</div>
+<div class="line"><a name="l19415"></a><span class="lineno">19415</span>&#160;    }</div>
+<div class="line"><a name="l19416"></a><span class="lineno">19416</span>&#160; </div>
+<div class="line"><a name="l19417"></a><span class="lineno">19417</span>&#160;    VMA_DEBUG_LOG(<span class="stringliteral">&quot;vmaDestroyBuffer&quot;</span>);</div>
+<div class="line"><a name="l19418"></a><span class="lineno">19418</span>&#160; </div>
+<div class="line"><a name="l19419"></a><span class="lineno">19419</span>&#160;    VMA_DEBUG_GLOBAL_MUTEX_LOCK</div>
+<div class="line"><a name="l19420"></a><span class="lineno">19420</span>&#160; </div>
+<div class="line"><a name="l19421"></a><span class="lineno">19421</span>&#160;<span class="preprocessor">#if VMA_RECORDING_ENABLED</span></div>
+<div class="line"><a name="l19422"></a><span class="lineno">19422</span>&#160;    <span class="keywordflow">if</span>(allocator-&gt;GetRecorder() != VMA_NULL)</div>
+<div class="line"><a name="l19423"></a><span class="lineno">19423</span>&#160;    {</div>
+<div class="line"><a name="l19424"></a><span class="lineno">19424</span>&#160;        allocator-&gt;GetRecorder()-&gt;RecordDestroyBuffer(</div>
+<div class="line"><a name="l19425"></a><span class="lineno">19425</span>&#160;            allocator-&gt;GetCurrentFrameIndex(),</div>
+<div class="line"><a name="l19426"></a><span class="lineno">19426</span>&#160;            allocation);</div>
+<div class="line"><a name="l19427"></a><span class="lineno">19427</span>&#160;    }</div>
+<div class="line"><a name="l19428"></a><span class="lineno">19428</span>&#160;<span class="preprocessor">#endif</span></div>
+<div class="line"><a name="l19429"></a><span class="lineno">19429</span>&#160; </div>
+<div class="line"><a name="l19430"></a><span class="lineno">19430</span>&#160;    <span class="keywordflow">if</span>(buffer != VK_NULL_HANDLE)</div>
+<div class="line"><a name="l19431"></a><span class="lineno">19431</span>&#160;    {</div>
+<div class="line"><a name="l19432"></a><span class="lineno">19432</span>&#160;        (*allocator-&gt;GetVulkanFunctions().vkDestroyBuffer)(allocator-&gt;m_hDevice, buffer, allocator-&gt;GetAllocationCallbacks());</div>
+<div class="line"><a name="l19433"></a><span class="lineno">19433</span>&#160;    }</div>
+<div class="line"><a name="l19434"></a><span class="lineno">19434</span>&#160; </div>
+<div class="line"><a name="l19435"></a><span class="lineno">19435</span>&#160;    <span class="keywordflow">if</span>(allocation != VK_NULL_HANDLE)</div>
+<div class="line"><a name="l19436"></a><span class="lineno">19436</span>&#160;    {</div>
+<div class="line"><a name="l19437"></a><span class="lineno">19437</span>&#160;        allocator-&gt;FreeMemory(</div>
+<div class="line"><a name="l19438"></a><span class="lineno">19438</span>&#160;            1, <span class="comment">// allocationCount</span></div>
+<div class="line"><a name="l19439"></a><span class="lineno">19439</span>&#160;            &amp;allocation);</div>
+<div class="line"><a name="l19440"></a><span class="lineno">19440</span>&#160;    }</div>
+<div class="line"><a name="l19441"></a><span class="lineno">19441</span>&#160;}</div>
+<div class="line"><a name="l19442"></a><span class="lineno">19442</span>&#160; </div>
+<div class="line"><a name="l19443"></a><span class="lineno">19443</span>&#160;VMA_CALL_PRE VkResult VMA_CALL_POST <a class="code" href="vk__mem__alloc_8h.html#a02a94f25679275851a53e82eacbcfc73">vmaCreateImage</a>(</div>
+<div class="line"><a name="l19444"></a><span class="lineno">19444</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div>
+<div class="line"><a name="l19445"></a><span class="lineno">19445</span>&#160;    <span class="keyword">const</span> VkImageCreateInfo* pImageCreateInfo,</div>
+<div class="line"><a name="l19446"></a><span class="lineno">19446</span>&#160;    <span class="keyword">const</span> <a class="code" href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a>* pAllocationCreateInfo,</div>
+<div class="line"><a name="l19447"></a><span class="lineno">19447</span>&#160;    VkImage* pImage,</div>
+<div class="line"><a name="l19448"></a><span class="lineno">19448</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a>* pAllocation,</div>
+<div class="line"><a name="l19449"></a><span class="lineno">19449</span>&#160;    <a class="code" href="struct_vma_allocation_info.html">VmaAllocationInfo</a>* pAllocationInfo)</div>
+<div class="line"><a name="l19450"></a><span class="lineno">19450</span>&#160;{</div>
+<div class="line"><a name="l19451"></a><span class="lineno">19451</span>&#160;    VMA_ASSERT(allocator &amp;&amp; pImageCreateInfo &amp;&amp; pAllocationCreateInfo &amp;&amp; pImage &amp;&amp; pAllocation);</div>
+<div class="line"><a name="l19452"></a><span class="lineno">19452</span>&#160; </div>
+<div class="line"><a name="l19453"></a><span class="lineno">19453</span>&#160;    <span class="keywordflow">if</span>(pImageCreateInfo-&gt;extent.width == 0 ||</div>
+<div class="line"><a name="l19454"></a><span class="lineno">19454</span>&#160;        pImageCreateInfo-&gt;extent.height == 0 ||</div>
+<div class="line"><a name="l19455"></a><span class="lineno">19455</span>&#160;        pImageCreateInfo-&gt;extent.depth == 0 ||</div>
+<div class="line"><a name="l19456"></a><span class="lineno">19456</span>&#160;        pImageCreateInfo-&gt;mipLevels == 0 ||</div>
+<div class="line"><a name="l19457"></a><span class="lineno">19457</span>&#160;        pImageCreateInfo-&gt;arrayLayers == 0)</div>
+<div class="line"><a name="l19458"></a><span class="lineno">19458</span>&#160;    {</div>
+<div class="line"><a name="l19459"></a><span class="lineno">19459</span>&#160;        <span class="keywordflow">return</span> VK_ERROR_VALIDATION_FAILED_EXT;</div>
+<div class="line"><a name="l19460"></a><span class="lineno">19460</span>&#160;    }</div>
+<div class="line"><a name="l19461"></a><span class="lineno">19461</span>&#160; </div>
+<div class="line"><a name="l19462"></a><span class="lineno">19462</span>&#160;    VMA_DEBUG_LOG(<span class="stringliteral">&quot;vmaCreateImage&quot;</span>);</div>
+<div class="line"><a name="l19463"></a><span class="lineno">19463</span>&#160; </div>
+<div class="line"><a name="l19464"></a><span class="lineno">19464</span>&#160;    VMA_DEBUG_GLOBAL_MUTEX_LOCK</div>
+<div class="line"><a name="l19465"></a><span class="lineno">19465</span>&#160; </div>
+<div class="line"><a name="l19466"></a><span class="lineno">19466</span>&#160;    *pImage = VK_NULL_HANDLE;</div>
+<div class="line"><a name="l19467"></a><span class="lineno">19467</span>&#160;    *pAllocation = VK_NULL_HANDLE;</div>
+<div class="line"><a name="l19468"></a><span class="lineno">19468</span>&#160; </div>
+<div class="line"><a name="l19469"></a><span class="lineno">19469</span>&#160;    <span class="comment">// 1. Create VkImage.</span></div>
+<div class="line"><a name="l19470"></a><span class="lineno">19470</span>&#160;    VkResult res = (*allocator-&gt;GetVulkanFunctions().vkCreateImage)(</div>
+<div class="line"><a name="l19471"></a><span class="lineno">19471</span>&#160;        allocator-&gt;m_hDevice,</div>
+<div class="line"><a name="l19472"></a><span class="lineno">19472</span>&#160;        pImageCreateInfo,</div>
+<div class="line"><a name="l19473"></a><span class="lineno">19473</span>&#160;        allocator-&gt;GetAllocationCallbacks(),</div>
+<div class="line"><a name="l19474"></a><span class="lineno">19474</span>&#160;        pImage);</div>
+<div class="line"><a name="l19475"></a><span class="lineno">19475</span>&#160;    <span class="keywordflow">if</span>(res &gt;= 0)</div>
+<div class="line"><a name="l19476"></a><span class="lineno">19476</span>&#160;    {</div>
+<div class="line"><a name="l19477"></a><span class="lineno">19477</span>&#160;        VmaSuballocationType suballocType = pImageCreateInfo-&gt;tiling == VK_IMAGE_TILING_OPTIMAL ?</div>
+<div class="line"><a name="l19478"></a><span class="lineno">19478</span>&#160;            VMA_SUBALLOCATION_TYPE_IMAGE_OPTIMAL :</div>
+<div class="line"><a name="l19479"></a><span class="lineno">19479</span>&#160;            VMA_SUBALLOCATION_TYPE_IMAGE_LINEAR;</div>
+<div class="line"><a name="l19480"></a><span class="lineno">19480</span>&#160; </div>
+<div class="line"><a name="l19481"></a><span class="lineno">19481</span>&#160;        <span class="comment">// 2. Allocate memory using allocator.</span></div>
+<div class="line"><a name="l19482"></a><span class="lineno">19482</span>&#160;        VkMemoryRequirements vkMemReq = {};</div>
+<div class="line"><a name="l19483"></a><span class="lineno">19483</span>&#160;        <span class="keywordtype">bool</span> requiresDedicatedAllocation = <span class="keyword">false</span>;</div>
+<div class="line"><a name="l19484"></a><span class="lineno">19484</span>&#160;        <span class="keywordtype">bool</span> prefersDedicatedAllocation  = <span class="keyword">false</span>;</div>
+<div class="line"><a name="l19485"></a><span class="lineno">19485</span>&#160;        allocator-&gt;GetImageMemoryRequirements(*pImage, vkMemReq,</div>
+<div class="line"><a name="l19486"></a><span class="lineno">19486</span>&#160;            requiresDedicatedAllocation, prefersDedicatedAllocation);</div>
+<div class="line"><a name="l19487"></a><span class="lineno">19487</span>&#160; </div>
+<div class="line"><a name="l19488"></a><span class="lineno">19488</span>&#160;        res = allocator-&gt;AllocateMemory(</div>
+<div class="line"><a name="l19489"></a><span class="lineno">19489</span>&#160;            vkMemReq,</div>
+<div class="line"><a name="l19490"></a><span class="lineno">19490</span>&#160;            requiresDedicatedAllocation,</div>
+<div class="line"><a name="l19491"></a><span class="lineno">19491</span>&#160;            prefersDedicatedAllocation,</div>
+<div class="line"><a name="l19492"></a><span class="lineno">19492</span>&#160;            VK_NULL_HANDLE, <span class="comment">// dedicatedBuffer</span></div>
+<div class="line"><a name="l19493"></a><span class="lineno">19493</span>&#160;            UINT32_MAX, <span class="comment">// dedicatedBufferUsage</span></div>
+<div class="line"><a name="l19494"></a><span class="lineno">19494</span>&#160;            *pImage, <span class="comment">// dedicatedImage</span></div>
+<div class="line"><a name="l19495"></a><span class="lineno">19495</span>&#160;            *pAllocationCreateInfo,</div>
+<div class="line"><a name="l19496"></a><span class="lineno">19496</span>&#160;            suballocType,</div>
+<div class="line"><a name="l19497"></a><span class="lineno">19497</span>&#160;            1, <span class="comment">// allocationCount</span></div>
+<div class="line"><a name="l19498"></a><span class="lineno">19498</span>&#160;            pAllocation);</div>
+<div class="line"><a name="l19499"></a><span class="lineno">19499</span>&#160; </div>
+<div class="line"><a name="l19500"></a><span class="lineno">19500</span>&#160;<span class="preprocessor">#if VMA_RECORDING_ENABLED</span></div>
+<div class="line"><a name="l19501"></a><span class="lineno">19501</span>&#160;        <span class="keywordflow">if</span>(allocator-&gt;GetRecorder() != VMA_NULL)</div>
+<div class="line"><a name="l19502"></a><span class="lineno">19502</span>&#160;        {</div>
+<div class="line"><a name="l19503"></a><span class="lineno">19503</span>&#160;            allocator-&gt;GetRecorder()-&gt;RecordCreateImage(</div>
+<div class="line"><a name="l19504"></a><span class="lineno">19504</span>&#160;                allocator-&gt;GetCurrentFrameIndex(),</div>
+<div class="line"><a name="l19505"></a><span class="lineno">19505</span>&#160;                *pImageCreateInfo,</div>
+<div class="line"><a name="l19506"></a><span class="lineno">19506</span>&#160;                *pAllocationCreateInfo,</div>
+<div class="line"><a name="l19507"></a><span class="lineno">19507</span>&#160;                *pAllocation);</div>
+<div class="line"><a name="l19508"></a><span class="lineno">19508</span>&#160;        }</div>
+<div class="line"><a name="l19509"></a><span class="lineno">19509</span>&#160;<span class="preprocessor">#endif</span></div>
+<div class="line"><a name="l19510"></a><span class="lineno">19510</span>&#160; </div>
+<div class="line"><a name="l19511"></a><span class="lineno">19511</span>&#160;        <span class="keywordflow">if</span>(res &gt;= 0)</div>
+<div class="line"><a name="l19512"></a><span class="lineno">19512</span>&#160;        {</div>
+<div class="line"><a name="l19513"></a><span class="lineno">19513</span>&#160;            <span class="comment">// 3. Bind image with memory.</span></div>
+<div class="line"><a name="l19514"></a><span class="lineno">19514</span>&#160;            <span class="keywordflow">if</span>((pAllocationCreateInfo-&gt;<a class="code" href="struct_vma_allocation_create_info.html#add09658ac14fe290ace25470ddd6d41b">flags</a> &amp; <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a2310568c62208af432724305fe29ccea">VMA_ALLOCATION_CREATE_DONT_BIND_BIT</a>) == 0)</div>
+<div class="line"><a name="l19515"></a><span class="lineno">19515</span>&#160;            {</div>
+<div class="line"><a name="l19516"></a><span class="lineno">19516</span>&#160;                res = allocator-&gt;BindImageMemory(*pAllocation, 0, *pImage, VMA_NULL);</div>
+<div class="line"><a name="l19517"></a><span class="lineno">19517</span>&#160;            }</div>
+<div class="line"><a name="l19518"></a><span class="lineno">19518</span>&#160;            <span class="keywordflow">if</span>(res &gt;= 0)</div>
+<div class="line"><a name="l19519"></a><span class="lineno">19519</span>&#160;            {</div>
+<div class="line"><a name="l19520"></a><span class="lineno">19520</span>&#160;                <span class="comment">// All steps succeeded.</span></div>
+<div class="line"><a name="l19521"></a><span class="lineno">19521</span>&#160;<span class="preprocessor">                #if VMA_STATS_STRING_ENABLED</span></div>
+<div class="line"><a name="l19522"></a><span class="lineno">19522</span>&#160;                    (*pAllocation)-&gt;InitBufferImageUsage(pImageCreateInfo-&gt;usage);</div>
+<div class="line"><a name="l19523"></a><span class="lineno">19523</span>&#160;<span class="preprocessor">                #endif</span></div>
+<div class="line"><a name="l19524"></a><span class="lineno">19524</span>&#160;                <span class="keywordflow">if</span>(pAllocationInfo != VMA_NULL)</div>
+<div class="line"><a name="l19525"></a><span class="lineno">19525</span>&#160;                {</div>
+<div class="line"><a name="l19526"></a><span class="lineno">19526</span>&#160;                    allocator-&gt;GetAllocationInfo(*pAllocation, pAllocationInfo);</div>
+<div class="line"><a name="l19527"></a><span class="lineno">19527</span>&#160;                }</div>
+<div class="line"><a name="l19528"></a><span class="lineno">19528</span>&#160; </div>
+<div class="line"><a name="l19529"></a><span class="lineno">19529</span>&#160;                <span class="keywordflow">return</span> VK_SUCCESS;</div>
+<div class="line"><a name="l19530"></a><span class="lineno">19530</span>&#160;            }</div>
+<div class="line"><a name="l19531"></a><span class="lineno">19531</span>&#160;            allocator-&gt;FreeMemory(</div>
+<div class="line"><a name="l19532"></a><span class="lineno">19532</span>&#160;                1, <span class="comment">// allocationCount</span></div>
+<div class="line"><a name="l19533"></a><span class="lineno">19533</span>&#160;                pAllocation);</div>
+<div class="line"><a name="l19534"></a><span class="lineno">19534</span>&#160;            *pAllocation = VK_NULL_HANDLE;</div>
+<div class="line"><a name="l19535"></a><span class="lineno">19535</span>&#160;            (*allocator-&gt;GetVulkanFunctions().vkDestroyImage)(allocator-&gt;m_hDevice, *pImage, allocator-&gt;GetAllocationCallbacks());</div>
+<div class="line"><a name="l19536"></a><span class="lineno">19536</span>&#160;            *pImage = VK_NULL_HANDLE;</div>
+<div class="line"><a name="l19537"></a><span class="lineno">19537</span>&#160;            <span class="keywordflow">return</span> res;</div>
+<div class="line"><a name="l19538"></a><span class="lineno">19538</span>&#160;        }</div>
+<div class="line"><a name="l19539"></a><span class="lineno">19539</span>&#160;        (*allocator-&gt;GetVulkanFunctions().vkDestroyImage)(allocator-&gt;m_hDevice, *pImage, allocator-&gt;GetAllocationCallbacks());</div>
+<div class="line"><a name="l19540"></a><span class="lineno">19540</span>&#160;        *pImage = VK_NULL_HANDLE;</div>
+<div class="line"><a name="l19541"></a><span class="lineno">19541</span>&#160;        <span class="keywordflow">return</span> res;</div>
+<div class="line"><a name="l19542"></a><span class="lineno">19542</span>&#160;    }</div>
+<div class="line"><a name="l19543"></a><span class="lineno">19543</span>&#160;    <span class="keywordflow">return</span> res;</div>
+<div class="line"><a name="l19544"></a><span class="lineno">19544</span>&#160;}</div>
+<div class="line"><a name="l19545"></a><span class="lineno">19545</span>&#160; </div>
+<div class="line"><a name="l19546"></a><span class="lineno">19546</span>&#160;VMA_CALL_PRE <span class="keywordtype">void</span> VMA_CALL_POST <a class="code" href="vk__mem__alloc_8h.html#ae50d2cb3b4a3bfd4dd40987234e50e7e">vmaDestroyImage</a>(</div>
+<div class="line"><a name="l19547"></a><span class="lineno">19547</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div>
+<div class="line"><a name="l19548"></a><span class="lineno">19548</span>&#160;    VkImage image,</div>
+<div class="line"><a name="l19549"></a><span class="lineno">19549</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation)</div>
+<div class="line"><a name="l19550"></a><span class="lineno">19550</span>&#160;{</div>
+<div class="line"><a name="l19551"></a><span class="lineno">19551</span>&#160;    VMA_ASSERT(allocator);</div>
+<div class="line"><a name="l19552"></a><span class="lineno">19552</span>&#160; </div>
+<div class="line"><a name="l19553"></a><span class="lineno">19553</span>&#160;    <span class="keywordflow">if</span>(image == VK_NULL_HANDLE &amp;&amp; allocation == VK_NULL_HANDLE)</div>
+<div class="line"><a name="l19554"></a><span class="lineno">19554</span>&#160;    {</div>
+<div class="line"><a name="l19555"></a><span class="lineno">19555</span>&#160;        <span class="keywordflow">return</span>;</div>
+<div class="line"><a name="l19556"></a><span class="lineno">19556</span>&#160;    }</div>
+<div class="line"><a name="l19557"></a><span class="lineno">19557</span>&#160; </div>
+<div class="line"><a name="l19558"></a><span class="lineno">19558</span>&#160;    VMA_DEBUG_LOG(<span class="stringliteral">&quot;vmaDestroyImage&quot;</span>);</div>
+<div class="line"><a name="l19559"></a><span class="lineno">19559</span>&#160; </div>
+<div class="line"><a name="l19560"></a><span class="lineno">19560</span>&#160;    VMA_DEBUG_GLOBAL_MUTEX_LOCK</div>
+<div class="line"><a name="l19561"></a><span class="lineno">19561</span>&#160; </div>
+<div class="line"><a name="l19562"></a><span class="lineno">19562</span>&#160;<span class="preprocessor">#if VMA_RECORDING_ENABLED</span></div>
+<div class="line"><a name="l19563"></a><span class="lineno">19563</span>&#160;    <span class="keywordflow">if</span>(allocator-&gt;GetRecorder() != VMA_NULL)</div>
+<div class="line"><a name="l19564"></a><span class="lineno">19564</span>&#160;    {</div>
+<div class="line"><a name="l19565"></a><span class="lineno">19565</span>&#160;        allocator-&gt;GetRecorder()-&gt;RecordDestroyImage(</div>
+<div class="line"><a name="l19566"></a><span class="lineno">19566</span>&#160;            allocator-&gt;GetCurrentFrameIndex(),</div>
+<div class="line"><a name="l19567"></a><span class="lineno">19567</span>&#160;            allocation);</div>
+<div class="line"><a name="l19568"></a><span class="lineno">19568</span>&#160;    }</div>
+<div class="line"><a name="l19569"></a><span class="lineno">19569</span>&#160;<span class="preprocessor">#endif</span></div>
+<div class="line"><a name="l19570"></a><span class="lineno">19570</span>&#160; </div>
+<div class="line"><a name="l19571"></a><span class="lineno">19571</span>&#160;    <span class="keywordflow">if</span>(image != VK_NULL_HANDLE)</div>
+<div class="line"><a name="l19572"></a><span class="lineno">19572</span>&#160;    {</div>
+<div class="line"><a name="l19573"></a><span class="lineno">19573</span>&#160;        (*allocator-&gt;GetVulkanFunctions().vkDestroyImage)(allocator-&gt;m_hDevice, image, allocator-&gt;GetAllocationCallbacks());</div>
+<div class="line"><a name="l19574"></a><span class="lineno">19574</span>&#160;    }</div>
+<div class="line"><a name="l19575"></a><span class="lineno">19575</span>&#160;    <span class="keywordflow">if</span>(allocation != VK_NULL_HANDLE)</div>
+<div class="line"><a name="l19576"></a><span class="lineno">19576</span>&#160;    {</div>
+<div class="line"><a name="l19577"></a><span class="lineno">19577</span>&#160;        allocator-&gt;FreeMemory(</div>
+<div class="line"><a name="l19578"></a><span class="lineno">19578</span>&#160;            1, <span class="comment">// allocationCount</span></div>
+<div class="line"><a name="l19579"></a><span class="lineno">19579</span>&#160;            &amp;allocation);</div>
+<div class="line"><a name="l19580"></a><span class="lineno">19580</span>&#160;    }</div>
+<div class="line"><a name="l19581"></a><span class="lineno">19581</span>&#160;}</div>
+<div class="line"><a name="l19582"></a><span class="lineno">19582</span>&#160; </div>
+<div class="line"><a name="l19583"></a><span class="lineno">19583</span>&#160;<span class="preprocessor">#endif </span><span class="comment">// #ifdef VMA_IMPLEMENTATION</span></div>
+<div class="ttc" id="astruct_vma_allocation_create_info_html"><div class="ttname"><a href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a></div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2879</div></div>
+<div class="ttc" id="astruct_vma_allocation_create_info_html_a3bf940c0271d85d6ba32a4d820075055"><div class="ttname"><a href="struct_vma_allocation_create_info.html#a3bf940c0271d85d6ba32a4d820075055">VmaAllocationCreateInfo::memoryTypeBits</a></div><div class="ttdeci">uint32_t memoryTypeBits</div><div class="ttdoc">Bitmask containing one bit set for every memory type acceptable for this allocation.</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2905</div></div>
+<div class="ttc" id="astruct_vma_allocation_create_info_html_a6272c0555cfd1fe28bff1afeb6190150"><div class="ttname"><a href="struct_vma_allocation_create_info.html#a6272c0555cfd1fe28bff1afeb6190150">VmaAllocationCreateInfo::pool</a></div><div class="ttdeci">VmaPool pool</div><div class="ttdoc">Pool that this allocation should be created in.</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2911</div></div>
+<div class="ttc" id="astruct_vma_allocation_create_info_html_a7fe8d81a1ad10b2a2faacacee5b15d6d"><div class="ttname"><a href="struct_vma_allocation_create_info.html#a7fe8d81a1ad10b2a2faacacee5b15d6d">VmaAllocationCreateInfo::preferredFlags</a></div><div class="ttdeci">VkMemoryPropertyFlags preferredFlags</div><div class="ttdoc">Flags that preferably should be set in a memory type chosen for an allocation.</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2897</div></div>
+<div class="ttc" id="astruct_vma_allocation_create_info_html_a8259e85c272683434f4abb4ddddffe19"><div class="ttname"><a href="struct_vma_allocation_create_info.html#a8259e85c272683434f4abb4ddddffe19">VmaAllocationCreateInfo::pUserData</a></div><div class="ttdeci">void * pUserData</div><div class="ttdoc">Custom general-purpose pointer that will be stored in VmaAllocation, can be read as VmaAllocationInfo...</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2918</div></div>
+<div class="ttc" id="astruct_vma_allocation_create_info_html_a9166390303ff42d783305bc31c2b6b90"><div class="ttname"><a href="struct_vma_allocation_create_info.html#a9166390303ff42d783305bc31c2b6b90">VmaAllocationCreateInfo::requiredFlags</a></div><div class="ttdeci">VkMemoryPropertyFlags requiredFlags</div><div class="ttdoc">Flags that must be set in a Memory Type chosen for an allocation.</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2892</div></div>
+<div class="ttc" id="astruct_vma_allocation_create_info_html_a983d39e1a2e63649d78a960aa2fdd0f7"><div class="ttname"><a href="struct_vma_allocation_create_info.html#a983d39e1a2e63649d78a960aa2fdd0f7">VmaAllocationCreateInfo::priority</a></div><div class="ttdeci">float priority</div><div class="ttdoc">A floating-point value between 0 and 1, indicating the priority of the allocation relative to other m...</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2925</div></div>
+<div class="ttc" id="astruct_vma_allocation_create_info_html_accb8b06b1f677d858cb9af20705fa910"><div class="ttname"><a href="struct_vma_allocation_create_info.html#accb8b06b1f677d858cb9af20705fa910">VmaAllocationCreateInfo::usage</a></div><div class="ttdeci">VmaMemoryUsage usage</div><div class="ttdoc">Intended usage of memory.</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2887</div></div>
+<div class="ttc" id="astruct_vma_allocation_create_info_html_add09658ac14fe290ace25470ddd6d41b"><div class="ttname"><a href="struct_vma_allocation_create_info.html#add09658ac14fe290ace25470ddd6d41b">VmaAllocationCreateInfo::flags</a></div><div class="ttdeci">VmaAllocationCreateFlags flags</div><div class="ttdoc">Use VmaAllocationCreateFlagBits enum.</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2881</div></div>
 <div class="ttc" id="astruct_vma_allocation_html"><div class="ttname"><a href="struct_vma_allocation.html">VmaAllocation</a></div><div class="ttdoc">Represents single memory allocation.</div></div>
-<div class="ttc" id="avk__mem__alloc_8h_html_aa5846affa1e9da3800e3e78fae2305cca416a444d4d0fc20067c3f76f32ff2500"><div class="ttname"><a href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305cca416a444d4d0fc20067c3f76f32ff2500">VMA_MEMORY_USAGE_CPU_COPY</a></div><div class="ttdeci">@ VMA_MEMORY_USAGE_CPU_COPY</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2609</div></div>
-<div class="ttc" id="avk__mem__alloc_8h_html_af9147d31ffc11d62fc187bde283ed14f"><div class="ttname"><a href="vk__mem__alloc_8h.html#af9147d31ffc11d62fc187bde283ed14f">vmaSetAllocationUserData</a></div><div class="ttdeci">void vmaSetAllocationUserData(VmaAllocator allocator, VmaAllocation allocation, void *pUserData)</div><div class="ttdoc">Sets pUserData in given allocation to new value.</div></div>
-<div class="ttc" id="avk__mem__alloc_8h_html_a6552a65b71d16f378c6994b3ceaef50ca31af49446af2459284a568ce2f3fdd33"><div class="ttname"><a href="vk__mem__alloc_8h.html#a6552a65b71d16f378c6994b3ceaef50ca31af49446af2459284a568ce2f3fdd33">VMA_DEFRAGMENTATION_FLAG_INCREMENTAL</a></div><div class="ttdeci">@ VMA_DEFRAGMENTATION_FLAG_INCREMENTAL</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:3463</div></div>
-<div class="ttc" id="astruct_vma_allocator_create_info_html_ace2aa4877b16a42b0b7673d4e26000ee"><div class="ttname"><a href="struct_vma_allocator_create_info.html#ace2aa4877b16a42b0b7673d4e26000ee">VmaAllocatorCreateInfo::pRecordSettings</a></div><div class="ttdeci">const VmaRecordSettings * pRecordSettings</div><div class="ttdoc">Parameters for recording of VMA calls. Can be null.</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2338</div></div>
-<div class="ttc" id="astruct_vma_vulkan_functions_html_a94fc4f3a605d9880bb3c0ba2c2fc80b2"><div class="ttname"><a href="struct_vma_vulkan_functions.html#a94fc4f3a605d9880bb3c0ba2c2fc80b2">VmaVulkanFunctions::vkBindBufferMemory</a></div><div class="ttdeci">PFN_vkBindBufferMemory vkBindBufferMemory</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2217</div></div>
-<div class="ttc" id="astruct_vma_vulkan_functions_html_a5b92901df89a4194b0d12f6071d4d143"><div class="ttname"><a href="struct_vma_vulkan_functions.html#a5b92901df89a4194b0d12f6071d4d143">VmaVulkanFunctions::vkGetBufferMemoryRequirements</a></div><div class="ttdeci">PFN_vkGetBufferMemoryRequirements vkGetBufferMemoryRequirements</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2219</div></div>
-<div class="ttc" id="astruct_vma_defragmentation_info2_html_a7f71f39590c5316771493d2333f9c1bd"><div class="ttname"><a href="struct_vma_defragmentation_info2.html#a7f71f39590c5316771493d2333f9c1bd">VmaDefragmentationInfo2::commandBuffer</a></div><div class="ttdeci">VkCommandBuffer commandBuffer</div><div class="ttdoc">Optional. Command buffer where GPU copy commands will be posted.</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:3541</div></div>
-<div class="ttc" id="astruct_vma_stats_html"><div class="ttname"><a href="struct_vma_stats.html">VmaStats</a></div><div class="ttdoc">General statistics from current state of Allocator.</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2451</div></div>
-<div class="ttc" id="astruct_vma_pool_create_info_html_ad8006fb803185c0a699d30f3e9a865ae"><div class="ttname"><a href="struct_vma_pool_create_info.html#ad8006fb803185c0a699d30f3e9a865ae">VmaPoolCreateInfo::minBlockCount</a></div><div class="ttdeci">size_t minBlockCount</div><div class="ttdoc">Minimum number of blocks to be always allocated in this pool, even if they stay empty.</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2916</div></div>
-<div class="ttc" id="astruct_vma_allocator_create_info_html_ae0ffc55139b54520a6bb704b29ffc285"><div class="ttname"><a href="struct_vma_allocator_create_info.html#ae0ffc55139b54520a6bb704b29ffc285">VmaAllocatorCreateInfo::vulkanApiVersion</a></div><div class="ttdeci">uint32_t vulkanApiVersion</div><div class="ttdoc">Optional. The highest version of Vulkan that the application is designed to use.</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2352</div></div>
-<div class="ttc" id="astruct_vma_stat_info_html"><div class="ttname"><a href="struct_vma_stat_info.html">VmaStatInfo</a></div><div class="ttdoc">Calculated statistics of memory usage in entire allocator.</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2434</div></div>
-<div class="ttc" id="astruct_vma_defragmentation_stats_html_ab0cb9ac0dbc106c77e384ea676422f28"><div class="ttname"><a href="struct_vma_defragmentation_stats.html#ab0cb9ac0dbc106c77e384ea676422f28">VmaDefragmentationStats::bytesFreed</a></div><div class="ttdeci">VkDeviceSize bytesFreed</div><div class="ttdoc">Total number of bytes that have been released to the system by freeing empty VkDeviceMemory objects.</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:3581</div></div>
-<div class="ttc" id="avk__mem__alloc_8h_html_a9f0f8f56db5f7f57fe4454f465142dac"><div class="ttname"><a href="vk__mem__alloc_8h.html#a9f0f8f56db5f7f57fe4454f465142dac">vmaDefragment</a></div><div class="ttdeci">VkResult vmaDefragment(VmaAllocator allocator, const VmaAllocation *pAllocations, size_t allocationCount, VkBool32 *pAllocationsChanged, const VmaDefragmentationInfo *pDefragmentationInfo, VmaDefragmentationStats *pDefragmentationStats)</div><div class="ttdoc">Deprecated. Compacts memory by moving allocations.</div></div>
-<div class="ttc" id="astruct_vma_defragmentation_pass_info_html_ac1086e657ba995f8d1f4e49b83dcfb6c"><div class="ttname"><a href="struct_vma_defragmentation_pass_info.html#ac1086e657ba995f8d1f4e49b83dcfb6c">VmaDefragmentationPassInfo::moveCount</a></div><div class="ttdeci">uint32_t moveCount</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:3555</div></div>
-<div class="ttc" id="avk__mem__alloc_8h_html_aa5846affa1e9da3800e3e78fae2305ccac6b5dc1432d88647aa4cd456246eadf7"><div class="ttname"><a href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305ccac6b5dc1432d88647aa4cd456246eadf7">VMA_MEMORY_USAGE_GPU_ONLY</a></div><div class="ttdeci">@ VMA_MEMORY_USAGE_GPU_ONLY</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2577</div></div>
-<div class="ttc" id="avk__mem__alloc_8h_html_ac0f01545b6262f7d4d128fc8f8e5c77b"><div class="ttname"><a href="vk__mem__alloc_8h.html#ac0f01545b6262f7d4d128fc8f8e5c77b">vmaBeginDefragmentationPass</a></div><div class="ttdeci">VkResult vmaBeginDefragmentationPass(VmaAllocator allocator, VmaDefragmentationContext context, VmaDefragmentationPassInfo *pInfo)</div></div>
-<div class="ttc" id="avk__mem__alloc_8h_html_aef15a94b58fbcb0fe706d5720e84a74a"><div class="ttname"><a href="vk__mem__alloc_8h.html#aef15a94b58fbcb0fe706d5720e84a74a">vmaFindMemoryTypeIndex</a></div><div class="ttdeci">VkResult vmaFindMemoryTypeIndex(VmaAllocator allocator, uint32_t memoryTypeBits, const VmaAllocationCreateInfo *pAllocationCreateInfo, uint32_t *pMemoryTypeIndex)</div><div class="ttdoc">Helps to find memoryTypeIndex, given memoryTypeBits and VmaAllocationCreateInfo.</div></div>
-<div class="ttc" id="avk__mem__alloc_8h_html_ac3dd00da721875ed99fa8a881922bdfc"><div class="ttname"><a href="vk__mem__alloc_8h.html#ac3dd00da721875ed99fa8a881922bdfc">vmaFlushAllocations</a></div><div class="ttdeci">VkResult vmaFlushAllocations(VmaAllocator allocator, uint32_t allocationCount, const VmaAllocation *allocations, const VkDeviceSize *offsets, const VkDeviceSize *sizes)</div><div class="ttdoc">Flushes memory of given set of allocations.</div></div>
-<div class="ttc" id="avk__mem__alloc_8h_html_a5c8770ded7c59c8caac6de0c2cb00b50"><div class="ttname"><a href="vk__mem__alloc_8h.html#a5c8770ded7c59c8caac6de0c2cb00b50">vmaCreatePool</a></div><div class="ttdeci">VkResult vmaCreatePool(VmaAllocator allocator, const VmaPoolCreateInfo *pCreateInfo, VmaPool *pPool)</div><div class="ttdoc">Allocates Vulkan device memory and creates VmaPool object.</div></div>
-<div class="ttc" id="astruct_vma_stat_info_html_a1859d290aca2cd582d8dc25922092669"><div class="ttname"><a href="struct_vma_stat_info.html#a1859d290aca2cd582d8dc25922092669">VmaStatInfo::unusedBytes</a></div><div class="ttdeci">VkDeviceSize unusedBytes</div><div class="ttdoc">Total number of bytes occupied by unused ranges.</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2444</div></div>
-<div class="ttc" id="avk__mem__alloc_8h_html_a4f87c9100d154a65a4ad495f7763cf7ca5f1b28b0414319d1687e1f2b30ab0089"><div class="ttname"><a href="vk__mem__alloc_8h.html#a4f87c9100d154a65a4ad495f7763cf7ca5f1b28b0414319d1687e1f2b30ab0089">VMA_ALLOCATOR_CREATE_BUFFER_DEVICE_ADDRESS_BIT</a></div><div class="ttdeci">@ VMA_ALLOCATOR_CREATE_BUFFER_DEVICE_ADDRESS_BIT</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2198</div></div>
-<div class="ttc" id="avk__mem__alloc_8h_html_ad37e82e492b3de38fc3f4cffd9ad0ae1"><div class="ttname"><a href="vk__mem__alloc_8h.html#ad37e82e492b3de38fc3f4cffd9ad0ae1">vmaAllocateMemoryPages</a></div><div class="ttdeci">VkResult vmaAllocateMemoryPages(VmaAllocator allocator, const VkMemoryRequirements *pVkMemoryRequirements, const VmaAllocationCreateInfo *pCreateInfo, size_t allocationCount, VmaAllocation *pAllocations, VmaAllocationInfo *pAllocationInfo)</div><div class="ttdoc">General purpose memory allocation for multiple allocation objects at once.</div></div>
-<div class="ttc" id="astruct_vma_stat_info_html_ab0c6c73837e5a70c749fbd4f6064895a"><div class="ttname"><a href="struct_vma_stat_info.html#ab0c6c73837e5a70c749fbd4f6064895a">VmaStatInfo::usedBytes</a></div><div class="ttdeci">VkDeviceSize usedBytes</div><div class="ttdoc">Total number of bytes occupied by all allocations.</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2442</div></div>
-<div class="ttc" id="astruct_vma_allocator_create_info_html_a6e409087e3be55400d0e4ccbe43c608d"><div class="ttname"><a href="struct_vma_allocator_create_info.html#a6e409087e3be55400d0e4ccbe43c608d">VmaAllocatorCreateInfo::pAllocationCallbacks</a></div><div class="ttdeci">const VkAllocationCallbacks * pAllocationCallbacks</div><div class="ttdoc">Custom CPU memory allocation callbacks. Optional.</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2283</div></div>
-<div class="ttc" id="avk__mem__alloc_8h_html_a4f87c9100d154a65a4ad495f7763cf7c"><div class="ttname"><a href="vk__mem__alloc_8h.html#a4f87c9100d154a65a4ad495f7763cf7c">VmaAllocatorCreateFlagBits</a></div><div class="ttdeci">VmaAllocatorCreateFlagBits</div><div class="ttdoc">Flags for created VmaAllocator.</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2105</div></div>
-<div class="ttc" id="avk__mem__alloc_8h_html_a0faa3f9e5fb233d29d1e00390650febb"><div class="ttname"><a href="vk__mem__alloc_8h.html#a0faa3f9e5fb233d29d1e00390650febb">vmaAllocateMemoryForImage</a></div><div class="ttdeci">VkResult vmaAllocateMemoryForImage(VmaAllocator allocator, VkImage image, const VmaAllocationCreateInfo *pCreateInfo, VmaAllocation *pAllocation, VmaAllocationInfo *pAllocationInfo)</div><div class="ttdoc">Function similar to vmaAllocateMemoryForBuffer().</div></div>
-<div class="ttc" id="astruct_vma_pool_create_info_html_ae41142f2834fcdc82baa4883c187b75c"><div class="ttname"><a href="struct_vma_pool_create_info.html#ae41142f2834fcdc82baa4883c187b75c">VmaPoolCreateInfo::maxBlockCount</a></div><div class="ttdeci">size_t maxBlockCount</div><div class="ttdoc">Maximum number of blocks that can be allocated in this pool. Optional.</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2924</div></div>
-<div class="ttc" id="astruct_vma_pool_create_info_html"><div class="ttname"><a href="struct_vma_pool_create_info.html">VmaPoolCreateInfo</a></div><div class="ttdoc">Describes parameter of created VmaPool.</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2896</div></div>
-<div class="ttc" id="astruct_vma_device_memory_callbacks_html_a4f17f7b255101e733b44d5633aceabfb"><div class="ttname"><a href="struct_vma_device_memory_callbacks.html#a4f17f7b255101e733b44d5633aceabfb">VmaDeviceMemoryCallbacks::pfnAllocate</a></div><div class="ttdeci">PFN_vmaAllocateDeviceMemoryFunction pfnAllocate</div><div class="ttdoc">Optional, can be null.</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2097</div></div>
-<div class="ttc" id="astruct_vma_pool_html"><div class="ttname"><a href="struct_vma_pool.html">VmaPool</a></div><div class="ttdoc">Represents custom memory pool.</div></div>
-<div class="ttc" id="avk__mem__alloc_8h_html_aa5846affa1e9da3800e3e78fae2305cca7b586d2fdaf82a463b58f581ed72be27"><div class="ttname"><a href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305cca7b586d2fdaf82a463b58f581ed72be27">VMA_MEMORY_USAGE_GPU_TO_CPU</a></div><div class="ttdeci">@ VMA_MEMORY_USAGE_GPU_TO_CPU</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2603</div></div>
-<div class="ttc" id="avk__mem__alloc_8h_html_ad9889c10c798b040d59c92f257cae597a68686d0ce9beb0d4d1b9f2b8b1389a7e"><div class="ttname"><a href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a68686d0ce9beb0d4d1b9f2b8b1389a7e">VMA_ALLOCATION_CREATE_CAN_MAKE_OTHER_LOST_BIT</a></div><div class="ttdeci">@ VMA_ALLOCATION_CREATE_CAN_MAKE_OTHER_LOST_BIT</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2674</div></div>
-<div class="ttc" id="astruct_vma_pool_create_info_html_a8405139f63d078340ae74513a59f5446"><div class="ttname"><a href="struct_vma_pool_create_info.html#a8405139f63d078340ae74513a59f5446">VmaPoolCreateInfo::flags</a></div><div class="ttdeci">VmaPoolCreateFlags flags</div><div class="ttdoc">Use combination of VmaPoolCreateFlagBits.</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2902</div></div>
-<div class="ttc" id="avk__mem__alloc_8h_html_aa5846affa1e9da3800e3e78fae2305cca091e69437ef693e8d0d287f1c719ba6e"><div class="ttname"><a href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305cca091e69437ef693e8d0d287f1c719ba6e">VMA_MEMORY_USAGE_MAX_ENUM</a></div><div class="ttdeci">@ VMA_MEMORY_USAGE_MAX_ENUM</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2619</div></div>
-<div class="ttc" id="astruct_vma_stat_info_html_a537741e4d5cdddc1c0ab95ec650afaff"><div class="ttname"><a href="struct_vma_stat_info.html#a537741e4d5cdddc1c0ab95ec650afaff">VmaStatInfo::allocationCount</a></div><div class="ttdeci">uint32_t allocationCount</div><div class="ttdoc">Number of VmaAllocation allocation objects allocated.</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2438</div></div>
-<div class="ttc" id="astruct_vma_vulkan_functions_html_a5c1093bc32386a8060c37c9f282078a1"><div class="ttname"><a href="struct_vma_vulkan_functions.html#a5c1093bc32386a8060c37c9f282078a1">VmaVulkanFunctions::vkInvalidateMappedMemoryRanges</a></div><div class="ttdeci">PFN_vkInvalidateMappedMemoryRanges vkInvalidateMappedMemoryRanges</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2216</div></div>
-<div class="ttc" id="avk__mem__alloc_8h_html_abf28077dbf82d0908b8acbe8ee8dd9b8"><div class="ttname"><a href="vk__mem__alloc_8h.html#abf28077dbf82d0908b8acbe8ee8dd9b8">vmaAllocateMemory</a></div><div class="ttdeci">VkResult vmaAllocateMemory(VmaAllocator allocator, const VkMemoryRequirements *pVkMemoryRequirements, const VmaAllocationCreateInfo *pCreateInfo, VmaAllocation *pAllocation, VmaAllocationInfo *pAllocationInfo)</div><div class="ttdoc">General purpose memory allocation.</div></div>
-<div class="ttc" id="astruct_vma_defragmentation_info2_html"><div class="ttname"><a href="struct_vma_defragmentation_info2.html">VmaDefragmentationInfo2</a></div><div class="ttdoc">Parameters for defragmentation.</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:3472</div></div>
-<div class="ttc" id="astruct_vma_defragmentation_info_html_acb311c940a777270e67e1b81c5ab6a1d"><div class="ttname"><a href="struct_vma_defragmentation_info.html#acb311c940a777270e67e1b81c5ab6a1d">VmaDefragmentationInfo::maxBytesToMove</a></div><div class="ttdeci">VkDeviceSize maxBytesToMove</div><div class="ttdoc">Maximum total numbers of bytes that can be copied while moving allocations to different places.</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:3568</div></div>
-<div class="ttc" id="astruct_vma_budget_html_a58b492901baab685f466199124e514a0"><div class="ttname"><a href="struct_vma_budget.html#a58b492901baab685f466199124e514a0">VmaBudget::blockBytes</a></div><div class="ttdeci">VkDeviceSize blockBytes</div><div class="ttdoc">Sum size of all VkDeviceMemory blocks allocated from particular heap, in bytes.</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2476</div></div>
-<div class="ttc" id="astruct_vma_allocator_info_html"><div class="ttname"><a href="struct_vma_allocator_info.html">VmaAllocatorInfo</a></div><div class="ttdoc">Information about existing VmaAllocator object.</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2367</div></div>
-<div class="ttc" id="avk__mem__alloc_8h_html_a9a7c45f9c863695d98c83fa5ac940fe7a1c7312bea9ea246846b9054fd6bd6aec"><div class="ttname"><a href="vk__mem__alloc_8h.html#a9a7c45f9c863695d98c83fa5ac940fe7a1c7312bea9ea246846b9054fd6bd6aec">VMA_POOL_CREATE_FLAG_BITS_MAX_ENUM</a></div><div class="ttdeci">@ VMA_POOL_CREATE_FLAG_BITS_MAX_ENUM</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2890</div></div>
-<div class="ttc" id="astruct_vma_allocation_create_info_html_a9166390303ff42d783305bc31c2b6b90"><div class="ttname"><a href="struct_vma_allocation_create_info.html#a9166390303ff42d783305bc31c2b6b90">VmaAllocationCreateInfo::requiredFlags</a></div><div class="ttdeci">VkMemoryPropertyFlags requiredFlags</div><div class="ttdoc">Flags that must be set in a Memory Type chosen for an allocation.</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2748</div></div>
-<div class="ttc" id="avk__mem__alloc_8h_html_ad9889c10c798b040d59c92f257cae597a621b704103eb3360230c860acf36e706"><div class="ttname"><a href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a621b704103eb3360230c860acf36e706">VMA_ALLOCATION_CREATE_STRATEGY_MIN_FRAGMENTATION_BIT</a></div><div class="ttdeci">@ VMA_ALLOCATION_CREATE_STRATEGY_MIN_FRAGMENTATION_BIT</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2721</div></div>
-<div class="ttc" id="avk__mem__alloc_8h_html_aec5b57e29c97b5d69c6d5654d60df878"><div class="ttname"><a href="vk__mem__alloc_8h.html#aec5b57e29c97b5d69c6d5654d60df878">VmaStatInfo</a></div><div class="ttdeci">struct VmaStatInfo VmaStatInfo</div><div class="ttdoc">Calculated statistics of memory usage in entire allocator.</div></div>
-<div class="ttc" id="astruct_vma_stat_info_html_a1081a039964e566c672e7a2347f9e599"><div class="ttname"><a href="struct_vma_stat_info.html#a1081a039964e566c672e7a2347f9e599">VmaStatInfo::allocationSizeAvg</a></div><div class="ttdeci">VkDeviceSize allocationSizeAvg</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2445</div></div>
-<div class="ttc" id="avk__mem__alloc_8h_html_aa8d164061c88f22fb1fd3c8f3534bc1d"><div class="ttname"><a href="vk__mem__alloc_8h.html#aa8d164061c88f22fb1fd3c8f3534bc1d">vmaDestroyAllocator</a></div><div class="ttdeci">void vmaDestroyAllocator(VmaAllocator allocator)</div><div class="ttdoc">Destroys allocator object.</div></div>
-<div class="ttc" id="astruct_vma_allocator_create_info_html_af1380969b5e1ea4c3184a877892d260e"><div class="ttname"><a href="struct_vma_allocator_create_info.html#af1380969b5e1ea4c3184a877892d260e">VmaAllocatorCreateInfo::pDeviceMemoryCallbacks</a></div><div class="ttdeci">const VmaDeviceMemoryCallbacks * pDeviceMemoryCallbacks</div><div class="ttdoc">Informative callbacks for vkAllocateMemory, vkFreeMemory. Optional.</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2286</div></div>
-<div class="ttc" id="avk__mem__alloc_8h_html_ad9889c10c798b040d59c92f257cae597a8e16845d81ae3d27c47106d4770d5c7e"><div class="ttname"><a href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a8e16845d81ae3d27c47106d4770d5c7e">VMA_ALLOCATION_CREATE_STRATEGY_MASK</a></div><div class="ttdeci">@ VMA_ALLOCATION_CREATE_STRATEGY_MASK</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2725</div></div>
-<div class="ttc" id="astruct_vma_allocator_create_info_html_ad924ddd77b04039c88d0c09b0ffcd500"><div class="ttname"><a href="struct_vma_allocator_create_info.html#ad924ddd77b04039c88d0c09b0ffcd500">VmaAllocatorCreateInfo::device</a></div><div class="ttdeci">VkDevice device</div><div class="ttdoc">Vulkan device.</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2277</div></div>
-<div class="ttc" id="avk__mem__alloc_8h_html_a088da83d8eaf3ce9056d9ea0b981d472"><div class="ttname"><a href="vk__mem__alloc_8h.html#a088da83d8eaf3ce9056d9ea0b981d472">vmaFindMemoryTypeIndexForImageInfo</a></div><div class="ttdeci">VkResult vmaFindMemoryTypeIndexForImageInfo(VmaAllocator allocator, const VkImageCreateInfo *pImageCreateInfo, const VmaAllocationCreateInfo *pAllocationCreateInfo, uint32_t *pMemoryTypeIndex)</div><div class="ttdoc">Helps to find memoryTypeIndex, given VkImageCreateInfo and VmaAllocationCreateInfo.</div></div>
-<div class="ttc" id="avk__mem__alloc_8h_html_ad5bd1243512d099706de88168992f069"><div class="ttname"><a href="vk__mem__alloc_8h.html#ad5bd1243512d099706de88168992f069">vmaMapMemory</a></div><div class="ttdeci">VkResult vmaMapMemory(VmaAllocator allocator, VmaAllocation allocation, void **ppData)</div><div class="ttdoc">Maps memory represented by given allocation and returns pointer to it.</div></div>
-<div class="ttc" id="avk__mem__alloc_8h_html_a6b0929b914b60cf2d45cac4bf3547470"><div class="ttname"><a href="vk__mem__alloc_8h.html#a6b0929b914b60cf2d45cac4bf3547470">vmaBindBufferMemory</a></div><div class="ttdeci">VkResult vmaBindBufferMemory(VmaAllocator allocator, VmaAllocation allocation, VkBuffer buffer)</div><div class="ttdoc">Binds buffer to allocation.</div></div>
-<div class="ttc" id="astruct_vma_allocator_create_info_html_a31c192aa6cbffa33279f6d9f0c47c44b"><div class="ttname"><a href="struct_vma_allocator_create_info.html#a31c192aa6cbffa33279f6d9f0c47c44b">VmaAllocatorCreateInfo::pHeapSizeLimit</a></div><div class="ttdeci">const VkDeviceSize * pHeapSizeLimit</div><div class="ttdoc">Either null or a pointer to an array of limits on maximum number of bytes that can be allocated out o...</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2325</div></div>
-<div class="ttc" id="astruct_vma_defragmentation_pass_move_info_html_ae885c861c2dd8d622e6c19e281d035cc"><div class="ttname"><a href="struct_vma_defragmentation_pass_move_info.html#ae885c861c2dd8d622e6c19e281d035cc">VmaDefragmentationPassMoveInfo::allocation</a></div><div class="ttdeci">VmaAllocation allocation</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:3545</div></div>
-<div class="ttc" id="avk__mem__alloc_8h_html_a02a94f25679275851a53e82eacbcfc73"><div class="ttname"><a href="vk__mem__alloc_8h.html#a02a94f25679275851a53e82eacbcfc73">vmaCreateImage</a></div><div class="ttdeci">VkResult vmaCreateImage(VmaAllocator allocator, const VkImageCreateInfo *pImageCreateInfo, const VmaAllocationCreateInfo *pAllocationCreateInfo, VkImage *pImage, VmaAllocation *pAllocation, VmaAllocationInfo *pAllocationInfo)</div><div class="ttdoc">Function similar to vmaCreateBuffer().</div></div>
-<div class="ttc" id="avk__mem__alloc_8h_html_ae790ab9ffaf7667fb8f62523e6897888"><div class="ttname"><a href="vk__mem__alloc_8h.html#ae790ab9ffaf7667fb8f62523e6897888">vmaFindMemoryTypeIndexForBufferInfo</a></div><div class="ttdeci">VkResult vmaFindMemoryTypeIndexForBufferInfo(VmaAllocator allocator, const VkBufferCreateInfo *pBufferCreateInfo, const VmaAllocationCreateInfo *pAllocationCreateInfo, uint32_t *pMemoryTypeIndex)</div><div class="ttdoc">Helps to find memoryTypeIndex, given VkBufferCreateInfo and VmaAllocationCreateInfo.</div></div>
-<div class="ttc" id="astruct_vma_budget_html_ab82e1d1754c2d210d0bdf90220bc6cdd"><div class="ttname"><a href="struct_vma_budget.html#ab82e1d1754c2d210d0bdf90220bc6cdd">VmaBudget::budget</a></div><div class="ttdeci">VkDeviceSize budget</div><div class="ttdoc">Estimated amount of memory available to the program, in bytes.</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2508</div></div>
-<div class="ttc" id="avk__mem__alloc_8h_html_a4759a2d9f99c19ba7627553c847132f1"><div class="ttname"><a href="vk__mem__alloc_8h.html#a4759a2d9f99c19ba7627553c847132f1">VmaPoolStats</a></div><div class="ttdeci">struct VmaPoolStats VmaPoolStats</div><div class="ttdoc">Describes parameter of existing VmaPool.</div></div>
-<div class="ttc" id="avk__mem__alloc_8h_html_a72aebd522242d56abea67b4f47f6549e"><div class="ttname"><a href="vk__mem__alloc_8h.html#a72aebd522242d56abea67b4f47f6549e">VmaDefragmentationPassInfo</a></div><div class="ttdeci">struct VmaDefragmentationPassInfo VmaDefragmentationPassInfo</div><div class="ttdoc">Parameters for incremental defragmentation steps.</div></div>
-<div class="ttc" id="astruct_vma_vulkan_functions_html"><div class="ttname"><a href="struct_vma_vulkan_functions.html">VmaVulkanFunctions</a></div><div class="ttdoc">Pointers to some Vulkan functions - a subset used by the library.</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2208</div></div>
-<div class="ttc" id="astruct_vma_allocation_info_html_a5eeffbe2d2f30f53370ff14aefbadbe2"><div class="ttname"><a href="struct_vma_allocation_info.html#a5eeffbe2d2f30f53370ff14aefbadbe2">VmaAllocationInfo::pMappedData</a></div><div class="ttdeci">void * pMappedData</div><div class="ttdoc">Pointer to the beginning of this allocation as mapped data.</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:3105</div></div>
-<div class="ttc" id="astruct_vma_allocator_create_info_html_a392ea2ecbaff93f91a7c49f735ad4346"><div class="ttname"><a href="struct_vma_allocator_create_info.html#a392ea2ecbaff93f91a7c49f735ad4346">VmaAllocatorCreateInfo::flags</a></div><div class="ttdeci">VmaAllocatorCreateFlags flags</div><div class="ttdoc">Flags for created allocator. Use VmaAllocatorCreateFlagBits enum.</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2271</div></div>
-<div class="ttc" id="avk__mem__alloc_8h_html_a88a77cef37e5d3c4fc9eb328885d048d"><div class="ttname"><a href="vk__mem__alloc_8h.html#a88a77cef37e5d3c4fc9eb328885d048d">VmaDefragmentationFlags</a></div><div class="ttdeci">VkFlags VmaDefragmentationFlags</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:3466</div></div>
-<div class="ttc" id="astruct_vma_defragmentation_info2_html_ab6d288f29d028156cf73542d630a2e32"><div class="ttname"><a href="struct_vma_defragmentation_info2.html#ab6d288f29d028156cf73542d630a2e32">VmaDefragmentationInfo2::pAllocations</a></div><div class="ttdeci">const VmaAllocation * pAllocations</div><div class="ttdoc">Pointer to array of allocations that can be defragmented.</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:3487</div></div>
-<div class="ttc" id="avk__mem__alloc_8h_html_ae8bf76997b234ef68aad922616df4153"><div class="ttname"><a href="vk__mem__alloc_8h.html#ae8bf76997b234ef68aad922616df4153">vmaGetPoolStats</a></div><div class="ttdeci">void vmaGetPoolStats(VmaAllocator allocator, VmaPool pool, VmaPoolStats *pPoolStats)</div><div class="ttdoc">Retrieves statistics of existing VmaPool object.</div></div>
-<div class="ttc" id="astruct_vma_vulkan_functions_html_a23ebe70be515b9b5010a1d691200e325"><div class="ttname"><a href="struct_vma_vulkan_functions.html#a23ebe70be515b9b5010a1d691200e325">VmaVulkanFunctions::vkCreateImage</a></div><div class="ttdeci">PFN_vkCreateImage vkCreateImage</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2223</div></div>
-<div class="ttc" id="astruct_vma_device_memory_callbacks_html_a24052de0937ddd54015a2df0363903c6"><div class="ttname"><a href="struct_vma_device_memory_callbacks.html#a24052de0937ddd54015a2df0363903c6">VmaDeviceMemoryCallbacks::pUserData</a></div><div class="ttdeci">void * pUserData</div><div class="ttdoc">Optional, can be null.</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2101</div></div>
-<div class="ttc" id="avk__mem__alloc_8h_html_a16e21c877101493fce582664cd8754fc"><div class="ttname"><a href="vk__mem__alloc_8h.html#a16e21c877101493fce582664cd8754fc">VmaRecordSettings</a></div><div class="ttdeci">struct VmaRecordSettings VmaRecordSettings</div><div class="ttdoc">Parameters for recording calls to VMA functions. To be used in VmaAllocatorCreateInfo::pRecordSetting...</div></div>
-<div class="ttc" id="astruct_vma_stat_info_html_a2f9b3452af90c9768a30b7fb6ae194fc"><div class="ttname"><a href="struct_vma_stat_info.html#a2f9b3452af90c9768a30b7fb6ae194fc">VmaStatInfo::unusedRangeSizeAvg</a></div><div class="ttdeci">VkDeviceSize unusedRangeSizeAvg</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2446</div></div>
-<div class="ttc" id="avk__mem__alloc_8h_html_aa5846affa1e9da3800e3e78fae2305cca9066b52c5a7079bb74a69aaf8b92ff67"><div class="ttname"><a href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305cca9066b52c5a7079bb74a69aaf8b92ff67">VMA_MEMORY_USAGE_CPU_TO_GPU</a></div><div class="ttdeci">@ VMA_MEMORY_USAGE_CPU_TO_GPU</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2594</div></div>
-<div class="ttc" id="avk__mem__alloc_8h_html_ad9889c10c798b040d59c92f257cae597a0729e932b7ea170e3a128cad96c5cf6d"><div class="ttname"><a href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a0729e932b7ea170e3a128cad96c5cf6d">VMA_ALLOCATION_CREATE_STRATEGY_MIN_TIME_BIT</a></div><div class="ttdeci">@ VMA_ALLOCATION_CREATE_STRATEGY_MIN_TIME_BIT</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2718</div></div>
-<div class="ttc" id="avk__mem__alloc_8h_html_ad9889c10c798b040d59c92f257cae597a8af1210cf591784afa026d94998f735d"><div class="ttname"><a href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a8af1210cf591784afa026d94998f735d">VMA_ALLOCATION_CREATE_STRATEGY_MIN_MEMORY_BIT</a></div><div class="ttdeci">@ VMA_ALLOCATION_CREATE_STRATEGY_MIN_MEMORY_BIT</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2715</div></div>
-<div class="ttc" id="avk__mem__alloc_8h_html_a4f87c9100d154a65a4ad495f7763cf7ca2acce4886d8078552efa38878413970f"><div class="ttname"><a href="vk__mem__alloc_8h.html#a4f87c9100d154a65a4ad495f7763cf7ca2acce4886d8078552efa38878413970f">VMA_ALLOCATOR_CREATE_AMD_DEVICE_COHERENT_MEMORY_BIT</a></div><div class="ttdeci">@ VMA_ALLOCATOR_CREATE_AMD_DEVICE_COHERENT_MEMORY_BIT</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2180</div></div>
-<div class="ttc" id="avk__mem__alloc_8h_html_ad94034192259c2e34a4d1c5e27810403"><div class="ttname"><a href="vk__mem__alloc_8h.html#ad94034192259c2e34a4d1c5e27810403">VmaDefragmentationStats</a></div><div class="ttdeci">struct VmaDefragmentationStats VmaDefragmentationStats</div><div class="ttdoc">Statistics returned by function vmaDefragment().</div></div>
-<div class="ttc" id="astruct_vma_allocation_create_info_html_accb8b06b1f677d858cb9af20705fa910"><div class="ttname"><a href="struct_vma_allocation_create_info.html#accb8b06b1f677d858cb9af20705fa910">VmaAllocationCreateInfo::usage</a></div><div class="ttdeci">VmaMemoryUsage usage</div><div class="ttdoc">Intended usage of memory.</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2743</div></div>
-<div class="ttc" id="astruct_vma_stat_info_html_ade8b40bd3139c04aabd2fc538a356fea"><div class="ttname"><a href="struct_vma_stat_info.html#ade8b40bd3139c04aabd2fc538a356fea">VmaStatInfo::allocationSizeMin</a></div><div class="ttdeci">VkDeviceSize allocationSizeMin</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2445</div></div>
-<div class="ttc" id="avk__mem__alloc_8h_html_a927c944f45e0f2941182abb6f608e64a"><div class="ttname"><a href="vk__mem__alloc_8h.html#a927c944f45e0f2941182abb6f608e64a">vmaBindBufferMemory2</a></div><div class="ttdeci">VkResult vmaBindBufferMemory2(VmaAllocator allocator, VmaAllocation allocation, VkDeviceSize allocationLocalOffset, VkBuffer buffer, const void *pNext)</div><div class="ttdoc">Binds buffer to allocation with additional parameters.</div></div>
-<div class="ttc" id="astruct_vma_allocation_info_html_aac76d113a6a5ccbb09fea00fb25fd18f"><div class="ttname"><a href="struct_vma_allocation_info.html#aac76d113a6a5ccbb09fea00fb25fd18f">VmaAllocationInfo::size</a></div><div class="ttdeci">VkDeviceSize size</div><div class="ttdoc">Size of this allocation, in bytes.</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:3096</div></div>
-<div class="ttc" id="astruct_vma_record_settings_html_ad8fdcc92119ae7a8c08c1a564c01d63a"><div class="ttname"><a href="struct_vma_record_settings.html#ad8fdcc92119ae7a8c08c1a564c01d63a">VmaRecordSettings::flags</a></div><div class="ttdeci">VmaRecordFlags flags</div><div class="ttdoc">Flags for recording. Use VmaRecordFlagBits enum.</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2256</div></div>
-<div class="ttc" id="astruct_vma_vulkan_functions_html_a33c322f4c4ad2810f8a9c97a277572f9"><div class="ttname"><a href="struct_vma_vulkan_functions.html#a33c322f4c4ad2810f8a9c97a277572f9">VmaVulkanFunctions::vkFlushMappedMemoryRanges</a></div><div class="ttdeci">PFN_vkFlushMappedMemoryRanges vkFlushMappedMemoryRanges</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2215</div></div>
-<div class="ttc" id="astruct_vma_allocation_info_html_adc507656149c04de7ed95d0042ba2a13"><div class="ttname"><a href="struct_vma_allocation_info.html#adc507656149c04de7ed95d0042ba2a13">VmaAllocationInfo::pUserData</a></div><div class="ttdeci">void * pUserData</div><div class="ttdoc">Custom general-purpose pointer that was passed as VmaAllocationCreateInfo::pUserData or set using vma...</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:3110</div></div>
-<div class="ttc" id="avk__mem__alloc_8h_html_a736bd6cbda886f36c891727e73bd4024"><div class="ttname"><a href="vk__mem__alloc_8h.html#a736bd6cbda886f36c891727e73bd4024">vmaMakePoolAllocationsLost</a></div><div class="ttdeci">void vmaMakePoolAllocationsLost(VmaAllocator allocator, VmaPool pool, size_t *pLostAllocationCount)</div><div class="ttdoc">Marks all allocations in given pool as lost if they are not used in current frame or VmaPoolCreateInf...</div></div>
-<div class="ttc" id="avk__mem__alloc_8h_html_a9a7c45f9c863695d98c83fa5ac940fe7a9f1a499508a8edb4e8ba40aa0290a3d2"><div class="ttname"><a href="vk__mem__alloc_8h.html#a9a7c45f9c863695d98c83fa5ac940fe7a9f1a499508a8edb4e8ba40aa0290a3d2">VMA_POOL_CREATE_IGNORE_BUFFER_IMAGE_GRANULARITY_BIT</a></div><div class="ttdeci">@ VMA_POOL_CREATE_IGNORE_BUFFER_IMAGE_GRANULARITY_BIT</div><div class="ttdoc">Use this flag if you always allocate only buffers and linear images or only optimal images out of thi...</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2854</div></div>
-<div class="ttc" id="avk__mem__alloc_8h_html_aaa8412919139ef413a4215ac6a290fae"><div class="ttname"><a href="vk__mem__alloc_8h.html#aaa8412919139ef413a4215ac6a290fae">vmaInvalidateAllocation</a></div><div class="ttdeci">VkResult vmaInvalidateAllocation(VmaAllocator allocator, VmaAllocation allocation, VkDeviceSize offset, VkDeviceSize size)</div><div class="ttdoc">Invalidates memory of given allocation.</div></div>
-<div class="ttc" id="avk__mem__alloc_8h_html_ac72ee55598617e8eecca384e746bab51"><div class="ttname"><a href="vk__mem__alloc_8h.html#ac72ee55598617e8eecca384e746bab51">vmaCreateBuffer</a></div><div class="ttdeci">VkResult vmaCreateBuffer(VmaAllocator allocator, const VkBufferCreateInfo *pBufferCreateInfo, const VmaAllocationCreateInfo *pAllocationCreateInfo, VkBuffer *pBuffer, VmaAllocation *pAllocation, VmaAllocationInfo *pAllocationInfo)</div></div>
-<div class="ttc" id="astruct_vma_stats_html_a0e6611508c29a187f0fd14ff1a0329c0"><div class="ttname"><a href="struct_vma_stats.html#a0e6611508c29a187f0fd14ff1a0329c0">VmaStats::memoryHeap</a></div><div class="ttdeci">VmaStatInfo memoryHeap[VK_MAX_MEMORY_HEAPS]</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2453</div></div>
-<div class="ttc" id="astruct_vma_allocator_create_info_html_a3dc197be3227da7338b1643f70db36bd"><div class="ttname"><a href="struct_vma_allocator_create_info.html#a3dc197be3227da7338b1643f70db36bd">VmaAllocatorCreateInfo::pVulkanFunctions</a></div><div class="ttdeci">const VmaVulkanFunctions * pVulkanFunctions</div><div class="ttdoc">Pointers to Vulkan functions. Can be null.</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2331</div></div>
-<div class="ttc" id="astruct_vma_pool_stats_html_aa0b5cb45cef6f18571cefb03b9a230e7"><div class="ttname"><a href="struct_vma_pool_stats.html#aa0b5cb45cef6f18571cefb03b9a230e7">VmaPoolStats::blockCount</a></div><div class="ttdeci">size_t blockCount</div><div class="ttdoc">Number of VkDeviceMemory blocks allocated for this pool.</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2965</div></div>
-<div class="ttc" id="avk__mem__alloc_8h_html_a200692051ddb34240248234f5f4c17bb"><div class="ttname"><a href="vk__mem__alloc_8h.html#a200692051ddb34240248234f5f4c17bb">vmaCreateAllocator</a></div><div class="ttdeci">VkResult vmaCreateAllocator(const VmaAllocatorCreateInfo *pCreateInfo, VmaAllocator *pAllocator)</div><div class="ttdoc">Creates Allocator object.</div></div>
-<div class="ttc" id="avk__mem__alloc_8h_html_a49329a7f030dafcf82f7b73334c22e98"><div class="ttname"><a href="vk__mem__alloc_8h.html#a49329a7f030dafcf82f7b73334c22e98">vmaCheckCorruption</a></div><div class="ttdeci">VkResult vmaCheckCorruption(VmaAllocator allocator, uint32_t memoryTypeBits)</div><div class="ttdoc">Checks magic number in margins around all allocations in given memory types (in both default and cust...</div></div>
-<div class="ttc" id="astruct_vma_defragmentation_pass_info_html"><div class="ttname"><a href="struct_vma_defragmentation_pass_info.html">VmaDefragmentationPassInfo</a></div><div class="ttdoc">Parameters for incremental defragmentation steps.</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:3554</div></div>
-<div class="ttc" id="astruct_vma_stats_html_a13e3caf754be79352c42408756309331"><div class="ttname"><a href="struct_vma_stats.html#a13e3caf754be79352c42408756309331">VmaStats::memoryType</a></div><div class="ttdeci">VmaStatInfo memoryType[VK_MAX_MEMORY_TYPES]</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2452</div></div>
-<div class="ttc" id="avk__mem__alloc_8h_html_a5225e5e11f8376f6a31a1791f3d6e817"><div class="ttname"><a href="vk__mem__alloc_8h.html#a5225e5e11f8376f6a31a1791f3d6e817">VmaAllocationCreateFlags</a></div><div class="ttdeci">VkFlags VmaAllocationCreateFlags</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2732</div></div>
-<div class="ttc" id="astruct_vma_allocator_create_info_html_a70dd42e29b1df1d1b9b61532ae0b370b"><div class="ttname"><a href="struct_vma_allocator_create_info.html#a70dd42e29b1df1d1b9b61532ae0b370b">VmaAllocatorCreateInfo::instance</a></div><div class="ttdeci">VkInstance instance</div><div class="ttdoc">Handle to Vulkan instance object.</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2343</div></div>
-<div class="ttc" id="avk__mem__alloc_8h_html_aa5846affa1e9da3800e3e78fae2305ccaf50d27e34e0925cf3a63db8c839121dd"><div class="ttname"><a href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305ccaf50d27e34e0925cf3a63db8c839121dd">VMA_MEMORY_USAGE_UNKNOWN</a></div><div class="ttdeci">@ VMA_MEMORY_USAGE_UNKNOWN</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2560</div></div>
-<div class="ttc" id="astruct_vma_defragmentation_info2_html_a40d53d33e71ba0b66f844ed63c05a3f6"><div class="ttname"><a href="struct_vma_defragmentation_info2.html#a40d53d33e71ba0b66f844ed63c05a3f6">VmaDefragmentationInfo2::maxGpuAllocationsToMove</a></div><div class="ttdeci">uint32_t maxGpuAllocationsToMove</div><div class="ttdoc">Maximum number of allocations that can be moved to a different place using transfers on GPU side,...</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:3532</div></div>
-<div class="ttc" id="astruct_vma_vulkan_functions_html_a7e054606faddb07f0e8556f3ed317d45"><div class="ttname"><a href="struct_vma_vulkan_functions.html#a7e054606faddb07f0e8556f3ed317d45">VmaVulkanFunctions::vkDestroyBuffer</a></div><div class="ttdeci">PFN_vkDestroyBuffer vkDestroyBuffer</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2222</div></div>
-<div class="ttc" id="astruct_vma_pool_create_info_html_a9437e43ffbb644dbbf7fc4e50cfad6aa"><div class="ttname"><a href="struct_vma_pool_create_info.html#a9437e43ffbb644dbbf7fc4e50cfad6aa">VmaPoolCreateInfo::frameInUseCount</a></div><div class="ttdeci">uint32_t frameInUseCount</div><div class="ttdoc">Maximum number of additional frames that are in use at the same time as current frame.</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2938</div></div>
-<div class="ttc" id="astruct_vma_vulkan_functions_html_a90b898227039b1dcb3520f6e91f09ffa"><div class="ttname"><a href="struct_vma_vulkan_functions.html#a90b898227039b1dcb3520f6e91f09ffa">VmaVulkanFunctions::vkDestroyImage</a></div><div class="ttdeci">PFN_vkDestroyImage vkDestroyImage</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2224</div></div>
-<div class="ttc" id="astruct_vma_defragmentation_info2_html_af78e1ea40c22d85137b65f6b384a4d0a"><div class="ttname"><a href="struct_vma_defragmentation_info2.html#af78e1ea40c22d85137b65f6b384a4d0a">VmaDefragmentationInfo2::maxCpuBytesToMove</a></div><div class="ttdeci">VkDeviceSize maxCpuBytesToMove</div><div class="ttdoc">Maximum total numbers of bytes that can be copied while moving allocations to different places using ...</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:3517</div></div>
-<div class="ttc" id="avk__mem__alloc_8h_html_a1017aa83489c0eee8d2163d2bf253f67"><div class="ttname"><a href="vk__mem__alloc_8h.html#a1017aa83489c0eee8d2163d2bf253f67">VmaPoolCreateInfo</a></div><div class="ttdeci">struct VmaPoolCreateInfo VmaPoolCreateInfo</div><div class="ttdoc">Describes parameter of created VmaPool.</div></div>
-<div class="ttc" id="avk__mem__alloc_8h_html_af09b4e4eafdbee812e8d73ddf960f030"><div class="ttname"><a href="vk__mem__alloc_8h.html#af09b4e4eafdbee812e8d73ddf960f030">vmaGetPoolName</a></div><div class="ttdeci">void vmaGetPoolName(VmaAllocator allocator, VmaPool pool, const char **ppName)</div><div class="ttdoc">Retrieves name of a custom pool.</div></div>
-<div class="ttc" id="astruct_vma_allocation_info_html_a7f6b0aa58c135e488e6b40a388dad9d5"><div class="ttname"><a href="struct_vma_allocation_info.html#a7f6b0aa58c135e488e6b40a388dad9d5">VmaAllocationInfo::memoryType</a></div><div class="ttdeci">uint32_t memoryType</div><div class="ttdoc">Memory type index that this allocation was allocated from.</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:3077</div></div>
-<div class="ttc" id="avk__mem__alloc_8h_html_ae50d2cb3b4a3bfd4dd40987234e50e7e"><div class="ttname"><a href="vk__mem__alloc_8h.html#ae50d2cb3b4a3bfd4dd40987234e50e7e">vmaDestroyImage</a></div><div class="ttdeci">void vmaDestroyImage(VmaAllocator allocator, VkImage image, VmaAllocation allocation)</div><div class="ttdoc">Destroys Vulkan image and frees allocated memory.</div></div>
-<div class="ttc" id="avk__mem__alloc_8h_html_ad9889c10c798b040d59c92f257cae597a11da372cc3a82931c5e5d6146cd9dd1f"><div class="ttname"><a href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a11da372cc3a82931c5e5d6146cd9dd1f">VMA_ALLOCATION_CREATE_MAPPED_BIT</a></div><div class="ttdeci">@ VMA_ALLOCATION_CREATE_MAPPED_BIT</div><div class="ttdoc">Set this flag to use a memory that will be persistently mapped and retrieve pointer to it.</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2654</div></div>
-<div class="ttc" id="avk__mem__alloc_8h_html_a333b61c1788cb23559177531e6a93ca3"><div class="ttname"><a href="vk__mem__alloc_8h.html#a333b61c1788cb23559177531e6a93ca3">vmaCalculateStats</a></div><div class="ttdeci">void vmaCalculateStats(VmaAllocator allocator, VmaStats *pStats)</div><div class="ttdoc">Retrieves statistics from current state of the Allocator.</div></div>
-<div class="ttc" id="avk__mem__alloc_8h_html_a0d9f4e4ba5bf9aab1f1c746387753d77"><div class="ttname"><a href="vk__mem__alloc_8h.html#a0d9f4e4ba5bf9aab1f1c746387753d77">vmaDestroyBuffer</a></div><div class="ttdeci">void vmaDestroyBuffer(VmaAllocator allocator, VkBuffer buffer, VmaAllocation allocation)</div><div class="ttdoc">Destroys Vulkan buffer and frees allocated memory.</div></div>
-<div class="ttc" id="astruct_vma_vulkan_functions_html_ae8084315a25006271a2edfc3a447519f"><div class="ttname"><a href="struct_vma_vulkan_functions.html#ae8084315a25006271a2edfc3a447519f">VmaVulkanFunctions::vkCreateBuffer</a></div><div class="ttdeci">PFN_vkCreateBuffer vkCreateBuffer</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2221</div></div>
-<div class="ttc" id="avk__mem__alloc_8h_html_a7e1ed85f7799600b03ad51a77acc21f3"><div class="ttname"><a href="vk__mem__alloc_8h.html#a7e1ed85f7799600b03ad51a77acc21f3">PFN_vmaAllocateDeviceMemoryFunction</a></div><div class="ttdeci">void(VKAPI_PTR * PFN_vmaAllocateDeviceMemoryFunction)(VmaAllocator allocator, uint32_t memoryType, VkDeviceMemory memory, VkDeviceSize size, void *pUserData)</div><div class="ttdoc">Callback function called after successful vkAllocateMemory.</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2074</div></div>
-<div class="ttc" id="avk__mem__alloc_8h_html_afa02231a791b37255720d566a52683e7"><div class="ttname"><a href="vk__mem__alloc_8h.html#afa02231a791b37255720d566a52683e7">vmaGetAllocatorInfo</a></div><div class="ttdeci">void vmaGetAllocatorInfo(VmaAllocator allocator, VmaAllocatorInfo *pAllocatorInfo)</div><div class="ttdoc">Returns information about existing VmaAllocator object - handle to Vulkan device etc.</div></div>
-<div class="ttc" id="astruct_vma_pool_stats_html_ae4f3546ffa4d1e598b64d8e6134854f4"><div class="ttname"><a href="struct_vma_pool_stats.html#ae4f3546ffa4d1e598b64d8e6134854f4">VmaPoolStats::unusedRangeCount</a></div><div class="ttdeci">size_t unusedRangeCount</div><div class="ttdoc">Number of continuous memory ranges in the pool not used by any VmaAllocation.</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2955</div></div>
-<div class="ttc" id="avk__mem__alloc_8h_html_a9a7c45f9c863695d98c83fa5ac940fe7"><div class="ttname"><a href="vk__mem__alloc_8h.html#a9a7c45f9c863695d98c83fa5ac940fe7">VmaPoolCreateFlagBits</a></div><div class="ttdeci">VmaPoolCreateFlagBits</div><div class="ttdoc">Flags to be passed as VmaPoolCreateInfo::flags.</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2836</div></div>
-<div class="ttc" id="avk__mem__alloc_8h_html_a1cf7774606721026a68aabe3af2e5b50"><div class="ttname"><a href="vk__mem__alloc_8h.html#a1cf7774606721026a68aabe3af2e5b50">VmaAllocationInfo</a></div><div class="ttdeci">struct VmaAllocationInfo VmaAllocationInfo</div><div class="ttdoc">Parameters of VmaAllocation objects, that can be retrieved using function vmaGetAllocationInfo().</div></div>
-<div class="ttc" id="astruct_vma_defragmentation_stats_html_a36f9d5df2a10ba2a36b16e126d60572d"><div class="ttname"><a href="struct_vma_defragmentation_stats.html#a36f9d5df2a10ba2a36b16e126d60572d">VmaDefragmentationStats::bytesMoved</a></div><div class="ttdeci">VkDeviceSize bytesMoved</div><div class="ttdoc">Total number of bytes that have been copied while moving allocations to different places.</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:3579</div></div>
-<div class="ttc" id="astruct_vma_stat_info_html_aedeba931324f16589cd2416c0d2dd0d4"><div class="ttname"><a href="struct_vma_stat_info.html#aedeba931324f16589cd2416c0d2dd0d4">VmaStatInfo::unusedRangeSizeMin</a></div><div class="ttdeci">VkDeviceSize unusedRangeSizeMin</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2446</div></div>
-<div class="ttc" id="avk__mem__alloc_8h_html_ad9889c10c798b040d59c92f257cae597a42ba3a2d2c7117953210b7c3ef8da0df"><div class="ttname"><a href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a42ba3a2d2c7117953210b7c3ef8da0df">VMA_ALLOCATION_CREATE_UPPER_ADDRESS_BIT</a></div><div class="ttdeci">@ VMA_ALLOCATION_CREATE_UPPER_ADDRESS_BIT</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2685</div></div>
-<div class="ttc" id="avk__mem__alloc_8h_html_ad535935619c7a549bf837e1bb0068f89"><div class="ttname"><a href="vk__mem__alloc_8h.html#ad535935619c7a549bf837e1bb0068f89">vmaCheckPoolCorruption</a></div><div class="ttdeci">VkResult vmaCheckPoolCorruption(VmaAllocator allocator, VmaPool pool)</div><div class="ttdoc">Checks magic number in margins around all allocations in given memory pool in search for corruptions.</div></div>
-<div class="ttc" id="avk__mem__alloc_8h_html_a3d3ca45799923aa5d138e9e5f9eb2da5"><div class="ttname"><a href="vk__mem__alloc_8h.html#a3d3ca45799923aa5d138e9e5f9eb2da5">vmaBindImageMemory</a></div><div class="ttdeci">VkResult vmaBindImageMemory(VmaAllocator allocator, VmaAllocation allocation, VkImage image)</div><div class="ttdoc">Binds image to allocation.</div></div>
-<div class="ttc" id="avk__mem__alloc_8h_html_a154ccaaf53dc2c36378f80f0c4f3679b"><div class="ttname"><a href="vk__mem__alloc_8h.html#a154ccaaf53dc2c36378f80f0c4f3679b">PFN_vmaFreeDeviceMemoryFunction</a></div><div class="ttdeci">void(VKAPI_PTR * PFN_vmaFreeDeviceMemoryFunction)(VmaAllocator allocator, uint32_t memoryType, VkDeviceMemory memory, VkDeviceSize size, void *pUserData)</div><div class="ttdoc">Callback function called before vkFreeMemory.</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2081</div></div>
-<div class="ttc" id="avk__mem__alloc_8h_html_ad6799e8e2b1527abfc84d33bc44aeaf5"><div class="ttname"><a href="vk__mem__alloc_8h.html#ad6799e8e2b1527abfc84d33bc44aeaf5">VmaDefragmentationPassMoveInfo</a></div><div class="ttdeci">struct VmaDefragmentationPassMoveInfo VmaDefragmentationPassMoveInfo</div></div>
-<div class="ttc" id="astruct_vma_allocation_create_info_html_add09658ac14fe290ace25470ddd6d41b"><div class="ttname"><a href="struct_vma_allocation_create_info.html#add09658ac14fe290ace25470ddd6d41b">VmaAllocationCreateInfo::flags</a></div><div class="ttdeci">VmaAllocationCreateFlags flags</div><div class="ttdoc">Use VmaAllocationCreateFlagBits enum.</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2737</div></div>
-<div class="ttc" id="astruct_vma_vulkan_functions_html_a475f6f49f8debe4d10800592606d53f4"><div class="ttname"><a href="struct_vma_vulkan_functions.html#a475f6f49f8debe4d10800592606d53f4">VmaVulkanFunctions::vkGetImageMemoryRequirements</a></div><div class="ttdeci">PFN_vkGetImageMemoryRequirements vkGetImageMemoryRequirements</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2220</div></div>
-<div class="ttc" id="avk__mem__alloc_8h_html_aec0ed24ebea2d0099eed5f801daaefba"><div class="ttname"><a href="vk__mem__alloc_8h.html#aec0ed24ebea2d0099eed5f801daaefba">vmaGetBudget</a></div><div class="ttdeci">void vmaGetBudget(VmaAllocator allocator, VmaBudget *pBudget)</div><div class="ttdoc">Retrieves information about current memory budget for all memory heaps.</div></div>
-<div class="ttc" id="astruct_vma_allocation_create_info_html"><div class="ttname"><a href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a></div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2735</div></div>
-<div class="ttc" id="astruct_vma_allocation_create_info_html_a7fe8d81a1ad10b2a2faacacee5b15d6d"><div class="ttname"><a href="struct_vma_allocation_create_info.html#a7fe8d81a1ad10b2a2faacacee5b15d6d">VmaAllocationCreateInfo::preferredFlags</a></div><div class="ttdeci">VkMemoryPropertyFlags preferredFlags</div><div class="ttdoc">Flags that preferably should be set in a memory type chosen for an allocation.</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2753</div></div>
-<div class="ttc" id="avk__mem__alloc_8h_html_a36ba776fd7fd5cb1e9359fdc0d8e6e8a"><div class="ttname"><a href="vk__mem__alloc_8h.html#a36ba776fd7fd5cb1e9359fdc0d8e6e8a">vmaDefragmentationBegin</a></div><div class="ttdeci">VkResult vmaDefragmentationBegin(VmaAllocator allocator, const VmaDefragmentationInfo2 *pInfo, VmaDefragmentationStats *pStats, VmaDefragmentationContext *pContext)</div><div class="ttdoc">Begins defragmentation process.</div></div>
-<div class="ttc" id="avk__mem__alloc_8h_html_aa8251ee81b0045a443e35b8e8aa021bc"><div class="ttname"><a href="vk__mem__alloc_8h.html#aa8251ee81b0045a443e35b8e8aa021bc">vmaBindImageMemory2</a></div><div class="ttdeci">VkResult vmaBindImageMemory2(VmaAllocator allocator, VmaAllocation allocation, VkDeviceSize allocationLocalOffset, VkImage image, const void *pNext)</div><div class="ttdoc">Binds image to allocation with additional parameters.</div></div>
-<div class="ttc" id="avk__mem__alloc_8h_html_aa078667e71b1ef24e87a6a30d128381d"><div class="ttname"><a href="vk__mem__alloc_8h.html#aa078667e71b1ef24e87a6a30d128381d">VmaBudget</a></div><div class="ttdeci">struct VmaBudget VmaBudget</div><div class="ttdoc">Statistics of current memory usage and available budget, in bytes, for specific memory heap.</div></div>
-<div class="ttc" id="avk__mem__alloc_8h_html_a1b9ffa538bed905af55c747cc48963bd"><div class="ttname"><a href="vk__mem__alloc_8h.html#a1b9ffa538bed905af55c747cc48963bd">vmaEndDefragmentationPass</a></div><div class="ttdeci">VkResult vmaEndDefragmentationPass(VmaAllocator allocator, VmaDefragmentationContext context)</div></div>
-<div class="ttc" id="astruct_vma_defragmentation_info2_html_a76d51a644dc7f5405d0cdd0025ecd0cc"><div class="ttname"><a href="struct_vma_defragmentation_info2.html#a76d51a644dc7f5405d0cdd0025ecd0cc">VmaDefragmentationInfo2::pAllocationsChanged</a></div><div class="ttdeci">VkBool32 * pAllocationsChanged</div><div class="ttdoc">Optional, output. Pointer to array that will be filled with information whether the allocation at cer...</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:3493</div></div>
-<div class="ttc" id="astruct_vma_defragmentation_stats_html_aefeabf130022008eadd75999478af3f9"><div class="ttname"><a href="struct_vma_defragmentation_stats.html#aefeabf130022008eadd75999478af3f9">VmaDefragmentationStats::allocationsMoved</a></div><div class="ttdeci">uint32_t allocationsMoved</div><div class="ttdoc">Number of allocations that have been moved to different places.</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:3583</div></div>
-<div class="ttc" id="astruct_vma_allocation_create_info_html_a3bf940c0271d85d6ba32a4d820075055"><div class="ttname"><a href="struct_vma_allocation_create_info.html#a3bf940c0271d85d6ba32a4d820075055">VmaAllocationCreateInfo::memoryTypeBits</a></div><div class="ttdeci">uint32_t memoryTypeBits</div><div class="ttdoc">Bitmask containing one bit set for every memory type acceptable for this allocation.</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2761</div></div>
-<div class="ttc" id="astruct_vma_allocator_info_html_aba2b703f96e51d567717e1fb2935b47a"><div class="ttname"><a href="struct_vma_allocator_info.html#aba2b703f96e51d567717e1fb2935b47a">VmaAllocatorInfo::physicalDevice</a></div><div class="ttdeci">VkPhysicalDevice physicalDevice</div><div class="ttdoc">Handle to Vulkan physical device object.</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2377</div></div>
-<div class="ttc" id="astruct_vma_defragmentation_stats_html_a0113f1877904a5d1ee8f409216ff276b"><div class="ttname"><a href="struct_vma_defragmentation_stats.html#a0113f1877904a5d1ee8f409216ff276b">VmaDefragmentationStats::deviceMemoryBlocksFreed</a></div><div class="ttdeci">uint32_t deviceMemoryBlocksFreed</div><div class="ttdoc">Number of empty VkDeviceMemory objects that have been released to the system.</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:3585</div></div>
-<div class="ttc" id="astruct_vma_record_settings_html_a6cb1fdbf6bcb610b68f2010dd629e89d"><div class="ttname"><a href="struct_vma_record_settings.html#a6cb1fdbf6bcb610b68f2010dd629e89d">VmaRecordSettings::pFilePath</a></div><div class="ttdeci">const char * pFilePath</div><div class="ttdoc">Path to the file that should be written by the recording.</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2264</div></div>
-<div class="ttc" id="astruct_vma_stat_info_html_a17e9733a5ecd76287d4db6e66f71f50c"><div class="ttname"><a href="struct_vma_stat_info.html#a17e9733a5ecd76287d4db6e66f71f50c">VmaStatInfo::allocationSizeMax</a></div><div class="ttdeci">VkDeviceSize allocationSizeMax</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2445</div></div>
-<div class="ttc" id="astruct_vma_allocation_info_html"><div class="ttname"><a href="struct_vma_allocation_info.html">VmaAllocationInfo</a></div><div class="ttdoc">Parameters of VmaAllocation objects, that can be retrieved using function vmaGetAllocationInfo().</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:3072</div></div>
-<div class="ttc" id="avk__mem__alloc_8h_html_a9a7c45f9c863695d98c83fa5ac940fe7a97a0dc38e5161b780594d998d313d35e"><div class="ttname"><a href="vk__mem__alloc_8h.html#a9a7c45f9c863695d98c83fa5ac940fe7a97a0dc38e5161b780594d998d313d35e">VMA_POOL_CREATE_BUDDY_ALGORITHM_BIT</a></div><div class="ttdeci">@ VMA_POOL_CREATE_BUDDY_ALGORITHM_BIT</div><div class="ttdoc">Enables alternative, buddy allocation algorithm in this pool.</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2882</div></div>
-<div class="ttc" id="avk__mem__alloc_8h_html_a1988031b0223fdbd564250fa1edd942c"><div class="ttname"><a href="vk__mem__alloc_8h.html#a1988031b0223fdbd564250fa1edd942c">VmaAllocatorInfo</a></div><div class="ttdeci">struct VmaAllocatorInfo VmaAllocatorInfo</div><div class="ttdoc">Information about existing VmaAllocator object.</div></div>
-<div class="ttc" id="astruct_vma_budget_html_a7e2a6583ebd63e194951c542563804d8"><div class="ttname"><a href="struct_vma_budget.html#a7e2a6583ebd63e194951c542563804d8">VmaBudget::allocationBytes</a></div><div class="ttdeci">VkDeviceSize allocationBytes</div><div class="ttdoc">Sum size of all allocations created in particular heap, in bytes.</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2487</div></div>
-<div class="ttc" id="avk__mem__alloc_8h_html_ad9889c10c798b040d59c92f257cae597ae5633ec569f4899cf8f29e7385b2f882"><div class="ttname"><a href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597ae5633ec569f4899cf8f29e7385b2f882">VMA_ALLOCATION_CREATE_FLAG_BITS_MAX_ENUM</a></div><div class="ttdeci">@ VMA_ALLOCATION_CREATE_FLAG_BITS_MAX_ENUM</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2730</div></div>
+<div class="ttc" id="astruct_vma_allocation_info_html"><div class="ttname"><a href="struct_vma_allocation_info.html">VmaAllocationInfo</a></div><div class="ttdoc">Parameters of VmaAllocation objects, that can be retrieved using function vmaGetAllocationInfo().</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:3229</div></div>
+<div class="ttc" id="astruct_vma_allocation_info_html_a4a3c732388dbdc7a23f9365b00825268"><div class="ttname"><a href="struct_vma_allocation_info.html#a4a3c732388dbdc7a23f9365b00825268">VmaAllocationInfo::offset</a></div><div class="ttdeci">VkDeviceSize offset</div><div class="ttdoc">Offset in VkDeviceMemory object to the beginning of this allocation, in bytes. (deviceMemory,...</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:3253</div></div>
+<div class="ttc" id="astruct_vma_allocation_info_html_a5eeffbe2d2f30f53370ff14aefbadbe2"><div class="ttname"><a href="struct_vma_allocation_info.html#a5eeffbe2d2f30f53370ff14aefbadbe2">VmaAllocationInfo::pMappedData</a></div><div class="ttdeci">void * pMappedData</div><div class="ttdoc">Pointer to the beginning of this allocation as mapped data.</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:3273</div></div>
+<div class="ttc" id="astruct_vma_allocation_info_html_a7f6b0aa58c135e488e6b40a388dad9d5"><div class="ttname"><a href="struct_vma_allocation_info.html#a7f6b0aa58c135e488e6b40a388dad9d5">VmaAllocationInfo::memoryType</a></div><div class="ttdeci">uint32_t memoryType</div><div class="ttdoc">Memory type index that this allocation was allocated from.</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:3234</div></div>
+<div class="ttc" id="astruct_vma_allocation_info_html_aac76d113a6a5ccbb09fea00fb25fd18f"><div class="ttname"><a href="struct_vma_allocation_info.html#aac76d113a6a5ccbb09fea00fb25fd18f">VmaAllocationInfo::size</a></div><div class="ttdeci">VkDeviceSize size</div><div class="ttdoc">Size of this allocation, in bytes.</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:3264</div></div>
+<div class="ttc" id="astruct_vma_allocation_info_html_adc507656149c04de7ed95d0042ba2a13"><div class="ttname"><a href="struct_vma_allocation_info.html#adc507656149c04de7ed95d0042ba2a13">VmaAllocationInfo::pUserData</a></div><div class="ttdeci">void * pUserData</div><div class="ttdoc">Custom general-purpose pointer that was passed as VmaAllocationCreateInfo::pUserData or set using vma...</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:3278</div></div>
+<div class="ttc" id="astruct_vma_allocation_info_html_ae0bfb7dfdf79a76ffefc9a94677a2f67"><div class="ttname"><a href="struct_vma_allocation_info.html#ae0bfb7dfdf79a76ffefc9a94677a2f67">VmaAllocationInfo::deviceMemory</a></div><div class="ttdeci">VkDeviceMemory deviceMemory</div><div class="ttdoc">Handle to Vulkan memory object.</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:3243</div></div>
+<div class="ttc" id="astruct_vma_allocator_create_info_html"><div class="ttname"><a href="struct_vma_allocator_create_info.html">VmaAllocatorCreateInfo</a></div><div class="ttdoc">Description of a Allocator to be created.</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2413</div></div>
+<div class="ttc" id="astruct_vma_allocator_create_info_html_a08230f04ae6ccf8a78150a9e829a7156"><div class="ttname"><a href="struct_vma_allocator_create_info.html#a08230f04ae6ccf8a78150a9e829a7156">VmaAllocatorCreateInfo::physicalDevice</a></div><div class="ttdeci">VkPhysicalDevice physicalDevice</div><div class="ttdoc">Vulkan physical device.</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2418</div></div>
+<div class="ttc" id="astruct_vma_allocator_create_info_html_a21ea188dd212b8171cb9ecbed4a2a3a7"><div class="ttname"><a href="struct_vma_allocator_create_info.html#a21ea188dd212b8171cb9ecbed4a2a3a7">VmaAllocatorCreateInfo::frameInUseCount</a></div><div class="ttdeci">uint32_t frameInUseCount</div><div class="ttdoc">Maximum number of additional frames that are in use at the same time as current frame.</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2444</div></div>
+<div class="ttc" id="astruct_vma_allocator_create_info_html_a31c192aa6cbffa33279f6d9f0c47c44b"><div class="ttname"><a href="struct_vma_allocator_create_info.html#a31c192aa6cbffa33279f6d9f0c47c44b">VmaAllocatorCreateInfo::pHeapSizeLimit</a></div><div class="ttdeci">const VkDeviceSize * pHeapSizeLimit</div><div class="ttdoc">Either null or a pointer to an array of limits on maximum number of bytes that can be allocated out o...</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2469</div></div>
+<div class="ttc" id="astruct_vma_allocator_create_info_html_a392ea2ecbaff93f91a7c49f735ad4346"><div class="ttname"><a href="struct_vma_allocator_create_info.html#a392ea2ecbaff93f91a7c49f735ad4346">VmaAllocatorCreateInfo::flags</a></div><div class="ttdeci">VmaAllocatorCreateFlags flags</div><div class="ttdoc">Flags for created allocator. Use VmaAllocatorCreateFlagBits enum.</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2415</div></div>
+<div class="ttc" id="astruct_vma_allocator_create_info_html_a3dc197be3227da7338b1643f70db36bd"><div class="ttname"><a href="struct_vma_allocator_create_info.html#a3dc197be3227da7338b1643f70db36bd">VmaAllocatorCreateInfo::pVulkanFunctions</a></div><div class="ttdeci">const VmaVulkanFunctions * pVulkanFunctions</div><div class="ttdoc">Pointers to Vulkan functions. Can be null.</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2475</div></div>
+<div class="ttc" id="astruct_vma_allocator_create_info_html_a6e409087e3be55400d0e4ccbe43c608d"><div class="ttname"><a href="struct_vma_allocator_create_info.html#a6e409087e3be55400d0e4ccbe43c608d">VmaAllocatorCreateInfo::pAllocationCallbacks</a></div><div class="ttdeci">const VkAllocationCallbacks * pAllocationCallbacks</div><div class="ttdoc">Custom CPU memory allocation callbacks. Optional.</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2427</div></div>
+<div class="ttc" id="astruct_vma_allocator_create_info_html_a70dd42e29b1df1d1b9b61532ae0b370b"><div class="ttname"><a href="struct_vma_allocator_create_info.html#a70dd42e29b1df1d1b9b61532ae0b370b">VmaAllocatorCreateInfo::instance</a></div><div class="ttdeci">VkInstance instance</div><div class="ttdoc">Handle to Vulkan instance object.</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2487</div></div>
+<div class="ttc" id="astruct_vma_allocator_create_info_html_a8e4714298e3121cdd8b214a1ae7a637a"><div class="ttname"><a href="struct_vma_allocator_create_info.html#a8e4714298e3121cdd8b214a1ae7a637a">VmaAllocatorCreateInfo::preferredLargeHeapBlockSize</a></div><div class="ttdeci">VkDeviceSize preferredLargeHeapBlockSize</div><div class="ttdoc">Preferred size of a single VkDeviceMemory block to be allocated from large heaps &gt; 1 GiB....</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2424</div></div>
+<div class="ttc" id="astruct_vma_allocator_create_info_html_ace2aa4877b16a42b0b7673d4e26000ee"><div class="ttname"><a href="struct_vma_allocator_create_info.html#ace2aa4877b16a42b0b7673d4e26000ee">VmaAllocatorCreateInfo::pRecordSettings</a></div><div class="ttdeci">const VmaRecordSettings * pRecordSettings</div><div class="ttdoc">Parameters for recording of VMA calls. Can be null.</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2482</div></div>
+<div class="ttc" id="astruct_vma_allocator_create_info_html_ad924ddd77b04039c88d0c09b0ffcd500"><div class="ttname"><a href="struct_vma_allocator_create_info.html#ad924ddd77b04039c88d0c09b0ffcd500">VmaAllocatorCreateInfo::device</a></div><div class="ttdeci">VkDevice device</div><div class="ttdoc">Vulkan device.</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2421</div></div>
+<div class="ttc" id="astruct_vma_allocator_create_info_html_ae0ffc55139b54520a6bb704b29ffc285"><div class="ttname"><a href="struct_vma_allocator_create_info.html#ae0ffc55139b54520a6bb704b29ffc285">VmaAllocatorCreateInfo::vulkanApiVersion</a></div><div class="ttdeci">uint32_t vulkanApiVersion</div><div class="ttdoc">Optional. The highest version of Vulkan that the application is designed to use.</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2496</div></div>
+<div class="ttc" id="astruct_vma_allocator_create_info_html_af1380969b5e1ea4c3184a877892d260e"><div class="ttname"><a href="struct_vma_allocator_create_info.html#af1380969b5e1ea4c3184a877892d260e">VmaAllocatorCreateInfo::pDeviceMemoryCallbacks</a></div><div class="ttdeci">const VmaDeviceMemoryCallbacks * pDeviceMemoryCallbacks</div><div class="ttdoc">Informative callbacks for vkAllocateMemory, vkFreeMemory. Optional.</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2430</div></div>
+<div class="ttc" id="astruct_vma_allocator_html"><div class="ttname"><a href="struct_vma_allocator.html">VmaAllocator</a></div><div class="ttdoc">Represents main object of this library initialized.</div></div>
+<div class="ttc" id="astruct_vma_allocator_info_html"><div class="ttname"><a href="struct_vma_allocator_info.html">VmaAllocatorInfo</a></div><div class="ttdoc">Information about existing VmaAllocator object.</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2511</div></div>
+<div class="ttc" id="astruct_vma_allocator_info_html_a012b4c485bf3b0ea8921352c5ee0c357"><div class="ttname"><a href="struct_vma_allocator_info.html#a012b4c485bf3b0ea8921352c5ee0c357">VmaAllocatorInfo::device</a></div><div class="ttdeci">VkDevice device</div><div class="ttdoc">Handle to Vulkan device object.</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2526</div></div>
+<div class="ttc" id="astruct_vma_allocator_info_html_a2ed6a4d2d3fea039d66a13f15d0ce5fe"><div class="ttname"><a href="struct_vma_allocator_info.html#a2ed6a4d2d3fea039d66a13f15d0ce5fe">VmaAllocatorInfo::instance</a></div><div class="ttdeci">VkInstance instance</div><div class="ttdoc">Handle to Vulkan instance object.</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2516</div></div>
+<div class="ttc" id="astruct_vma_allocator_info_html_aba2b703f96e51d567717e1fb2935b47a"><div class="ttname"><a href="struct_vma_allocator_info.html#aba2b703f96e51d567717e1fb2935b47a">VmaAllocatorInfo::physicalDevice</a></div><div class="ttdeci">VkPhysicalDevice physicalDevice</div><div class="ttdoc">Handle to Vulkan physical device object.</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2521</div></div>
+<div class="ttc" id="astruct_vma_budget_html"><div class="ttname"><a href="struct_vma_budget.html">VmaBudget</a></div><div class="ttdoc">Statistics of current memory usage and available budget, in bytes, for specific memory heap.</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2617</div></div>
+<div class="ttc" id="astruct_vma_budget_html_a58b492901baab685f466199124e514a0"><div class="ttname"><a href="struct_vma_budget.html#a58b492901baab685f466199124e514a0">VmaBudget::blockBytes</a></div><div class="ttdeci">VkDeviceSize blockBytes</div><div class="ttdoc">Sum size of all VkDeviceMemory blocks allocated from particular heap, in bytes.</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2620</div></div>
+<div class="ttc" id="astruct_vma_budget_html_a7e2a6583ebd63e194951c542563804d8"><div class="ttname"><a href="struct_vma_budget.html#a7e2a6583ebd63e194951c542563804d8">VmaBudget::allocationBytes</a></div><div class="ttdeci">VkDeviceSize allocationBytes</div><div class="ttdoc">Sum size of all allocations created in particular heap, in bytes.</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2631</div></div>
+<div class="ttc" id="astruct_vma_budget_html_a84dd1ecca8b0110259eb206dbadb11f6"><div class="ttname"><a href="struct_vma_budget.html#a84dd1ecca8b0110259eb206dbadb11f6">VmaBudget::usage</a></div><div class="ttdeci">VkDeviceSize usage</div><div class="ttdoc">Estimated current memory usage of the program, in bytes.</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2641</div></div>
+<div class="ttc" id="astruct_vma_budget_html_ab82e1d1754c2d210d0bdf90220bc6cdd"><div class="ttname"><a href="struct_vma_budget.html#ab82e1d1754c2d210d0bdf90220bc6cdd">VmaBudget::budget</a></div><div class="ttdeci">VkDeviceSize budget</div><div class="ttdoc">Estimated amount of memory available to the program, in bytes.</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2652</div></div>
 <div class="ttc" id="astruct_vma_defragmentation_context_html"><div class="ttname"><a href="struct_vma_defragmentation_context.html">VmaDefragmentationContext</a></div><div class="ttdoc">Represents Opaque object that represents started defragmentation process.</div></div>
-<div class="ttc" id="avk__mem__alloc_8h_html_a9a7c45f9c863695d98c83fa5ac940fe7af4d270f8f42517a0f70037ceb6ac1d9c"><div class="ttname"><a href="vk__mem__alloc_8h.html#a9a7c45f9c863695d98c83fa5ac940fe7af4d270f8f42517a0f70037ceb6ac1d9c">VMA_POOL_CREATE_ALGORITHM_MASK</a></div><div class="ttdeci">@ VMA_POOL_CREATE_ALGORITHM_MASK</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2886</div></div>
-<div class="ttc" id="astruct_vma_defragmentation_info2_html_a94c2c7223d52878445a8cccce396b671"><div class="ttname"><a href="struct_vma_defragmentation_info2.html#a94c2c7223d52878445a8cccce396b671">VmaDefragmentationInfo2::maxCpuAllocationsToMove</a></div><div class="ttdeci">uint32_t maxCpuAllocationsToMove</div><div class="ttdoc">Maximum number of allocations that can be moved to a different place using transfers on CPU side,...</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:3522</div></div>
+<div class="ttc" id="astruct_vma_defragmentation_info2_html"><div class="ttname"><a href="struct_vma_defragmentation_info2.html">VmaDefragmentationInfo2</a></div><div class="ttdoc">Parameters for defragmentation.</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:3628</div></div>
+<div class="ttc" id="astruct_vma_defragmentation_info2_html_a3c9c6aa5c97d5670f8e362b3a6f3029b"><div class="ttname"><a href="struct_vma_defragmentation_info2.html#a3c9c6aa5c97d5670f8e362b3a6f3029b">VmaDefragmentationInfo2::pPools</a></div><div class="ttdeci">const VmaPool * pPools</div><div class="ttdoc">Either null or pointer to array of pools to be defragmented.</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:3668</div></div>
+<div class="ttc" id="astruct_vma_defragmentation_info2_html_a3cf86ab32c1da779b4923d301a3056ba"><div class="ttname"><a href="struct_vma_defragmentation_info2.html#a3cf86ab32c1da779b4923d301a3056ba">VmaDefragmentationInfo2::allocationCount</a></div><div class="ttdeci">uint32_t allocationCount</div><div class="ttdoc">Number of allocations in pAllocations array.</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:3634</div></div>
+<div class="ttc" id="astruct_vma_defragmentation_info2_html_a40d53d33e71ba0b66f844ed63c05a3f6"><div class="ttname"><a href="struct_vma_defragmentation_info2.html#a40d53d33e71ba0b66f844ed63c05a3f6">VmaDefragmentationInfo2::maxGpuAllocationsToMove</a></div><div class="ttdeci">uint32_t maxGpuAllocationsToMove</div><div class="ttdoc">Maximum number of allocations that can be moved to a different place using transfers on GPU side,...</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:3688</div></div>
+<div class="ttc" id="astruct_vma_defragmentation_info2_html_a4ddbc898d0afe1518f863a3763628f08"><div class="ttname"><a href="struct_vma_defragmentation_info2.html#a4ddbc898d0afe1518f863a3763628f08">VmaDefragmentationInfo2::maxGpuBytesToMove</a></div><div class="ttdeci">VkDeviceSize maxGpuBytesToMove</div><div class="ttdoc">Maximum total numbers of bytes that can be copied while moving allocations to different places using ...</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:3683</div></div>
+<div class="ttc" id="astruct_vma_defragmentation_info2_html_a53e844ee5633e229cf6daf14b2d9fff9"><div class="ttname"><a href="struct_vma_defragmentation_info2.html#a53e844ee5633e229cf6daf14b2d9fff9">VmaDefragmentationInfo2::flags</a></div><div class="ttdeci">VmaDefragmentationFlags flags</div><div class="ttdoc">Reserved for future use. Should be 0.</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:3631</div></div>
+<div class="ttc" id="astruct_vma_defragmentation_info2_html_a76d51a644dc7f5405d0cdd0025ecd0cc"><div class="ttname"><a href="struct_vma_defragmentation_info2.html#a76d51a644dc7f5405d0cdd0025ecd0cc">VmaDefragmentationInfo2::pAllocationsChanged</a></div><div class="ttdeci">VkBool32 * pAllocationsChanged</div><div class="ttdoc">Optional, output. Pointer to array that will be filled with information whether the allocation at cer...</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:3649</div></div>
+<div class="ttc" id="astruct_vma_defragmentation_info2_html_a7e70aa2a1081d849dcc7829b19d3ec9d"><div class="ttname"><a href="struct_vma_defragmentation_info2.html#a7e70aa2a1081d849dcc7829b19d3ec9d">VmaDefragmentationInfo2::poolCount</a></div><div class="ttdeci">uint32_t poolCount</div><div class="ttdoc">Numer of pools in pPools array.</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:3652</div></div>
+<div class="ttc" id="astruct_vma_defragmentation_info2_html_a7f71f39590c5316771493d2333f9c1bd"><div class="ttname"><a href="struct_vma_defragmentation_info2.html#a7f71f39590c5316771493d2333f9c1bd">VmaDefragmentationInfo2::commandBuffer</a></div><div class="ttdeci">VkCommandBuffer commandBuffer</div><div class="ttdoc">Optional. Command buffer where GPU copy commands will be posted.</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:3697</div></div>
+<div class="ttc" id="astruct_vma_defragmentation_info2_html_a94c2c7223d52878445a8cccce396b671"><div class="ttname"><a href="struct_vma_defragmentation_info2.html#a94c2c7223d52878445a8cccce396b671">VmaDefragmentationInfo2::maxCpuAllocationsToMove</a></div><div class="ttdeci">uint32_t maxCpuAllocationsToMove</div><div class="ttdoc">Maximum number of allocations that can be moved to a different place using transfers on CPU side,...</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:3678</div></div>
+<div class="ttc" id="astruct_vma_defragmentation_info2_html_ab6d288f29d028156cf73542d630a2e32"><div class="ttname"><a href="struct_vma_defragmentation_info2.html#ab6d288f29d028156cf73542d630a2e32">VmaDefragmentationInfo2::pAllocations</a></div><div class="ttdeci">const VmaAllocation * pAllocations</div><div class="ttdoc">Pointer to array of allocations that can be defragmented.</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:3643</div></div>
+<div class="ttc" id="astruct_vma_defragmentation_info2_html_af78e1ea40c22d85137b65f6b384a4d0a"><div class="ttname"><a href="struct_vma_defragmentation_info2.html#af78e1ea40c22d85137b65f6b384a4d0a">VmaDefragmentationInfo2::maxCpuBytesToMove</a></div><div class="ttdeci">VkDeviceSize maxCpuBytesToMove</div><div class="ttdoc">Maximum total numbers of bytes that can be copied while moving allocations to different places using ...</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:3673</div></div>
+<div class="ttc" id="astruct_vma_defragmentation_info_html"><div class="ttname"><a href="struct_vma_defragmentation_info.html">VmaDefragmentationInfo</a></div><div class="ttdoc">Deprecated. Optional configuration parameters to be passed to function vmaDefragment().</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:3719</div></div>
+<div class="ttc" id="astruct_vma_defragmentation_info_html_aa7c7304e13c71f604c907196c4e28fbc"><div class="ttname"><a href="struct_vma_defragmentation_info.html#aa7c7304e13c71f604c907196c4e28fbc">VmaDefragmentationInfo::maxAllocationsToMove</a></div><div class="ttdeci">uint32_t maxAllocationsToMove</div><div class="ttdoc">Maximum number of allocations that can be moved to different place.</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:3729</div></div>
+<div class="ttc" id="astruct_vma_defragmentation_info_html_acb311c940a777270e67e1b81c5ab6a1d"><div class="ttname"><a href="struct_vma_defragmentation_info.html#acb311c940a777270e67e1b81c5ab6a1d">VmaDefragmentationInfo::maxBytesToMove</a></div><div class="ttdeci">VkDeviceSize maxBytesToMove</div><div class="ttdoc">Maximum total numbers of bytes that can be copied while moving allocations to different places.</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:3724</div></div>
+<div class="ttc" id="astruct_vma_defragmentation_pass_info_html"><div class="ttname"><a href="struct_vma_defragmentation_pass_info.html">VmaDefragmentationPassInfo</a></div><div class="ttdoc">Parameters for incremental defragmentation steps.</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:3710</div></div>
+<div class="ttc" id="astruct_vma_defragmentation_pass_info_html_ac1086e657ba995f8d1f4e49b83dcfb6c"><div class="ttname"><a href="struct_vma_defragmentation_pass_info.html#ac1086e657ba995f8d1f4e49b83dcfb6c">VmaDefragmentationPassInfo::moveCount</a></div><div class="ttdeci">uint32_t moveCount</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:3711</div></div>
+<div class="ttc" id="astruct_vma_defragmentation_pass_info_html_acbd42d4a3357999da130a95cd99a3792"><div class="ttname"><a href="struct_vma_defragmentation_pass_info.html#acbd42d4a3357999da130a95cd99a3792">VmaDefragmentationPassInfo::pMoves</a></div><div class="ttdeci">VmaDefragmentationPassMoveInfo * pMoves</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:3712</div></div>
+<div class="ttc" id="astruct_vma_defragmentation_pass_move_info_html"><div class="ttname"><a href="struct_vma_defragmentation_pass_move_info.html">VmaDefragmentationPassMoveInfo</a></div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:3700</div></div>
+<div class="ttc" id="astruct_vma_defragmentation_pass_move_info_html_a06eb0c8690aa0d3478a036753492e769"><div class="ttname"><a href="struct_vma_defragmentation_pass_move_info.html#a06eb0c8690aa0d3478a036753492e769">VmaDefragmentationPassMoveInfo::memory</a></div><div class="ttdeci">VkDeviceMemory memory</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:3702</div></div>
+<div class="ttc" id="astruct_vma_defragmentation_pass_move_info_html_a8ab4508bc03625b0653c880576be96c6"><div class="ttname"><a href="struct_vma_defragmentation_pass_move_info.html#a8ab4508bc03625b0653c880576be96c6">VmaDefragmentationPassMoveInfo::offset</a></div><div class="ttdeci">VkDeviceSize offset</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:3703</div></div>
+<div class="ttc" id="astruct_vma_defragmentation_pass_move_info_html_ae885c861c2dd8d622e6c19e281d035cc"><div class="ttname"><a href="struct_vma_defragmentation_pass_move_info.html#ae885c861c2dd8d622e6c19e281d035cc">VmaDefragmentationPassMoveInfo::allocation</a></div><div class="ttdeci">VmaAllocation allocation</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:3701</div></div>
+<div class="ttc" id="astruct_vma_defragmentation_stats_html"><div class="ttname"><a href="struct_vma_defragmentation_stats.html">VmaDefragmentationStats</a></div><div class="ttdoc">Statistics returned by function vmaDefragment().</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:3733</div></div>
+<div class="ttc" id="astruct_vma_defragmentation_stats_html_a0113f1877904a5d1ee8f409216ff276b"><div class="ttname"><a href="struct_vma_defragmentation_stats.html#a0113f1877904a5d1ee8f409216ff276b">VmaDefragmentationStats::deviceMemoryBlocksFreed</a></div><div class="ttdeci">uint32_t deviceMemoryBlocksFreed</div><div class="ttdoc">Number of empty VkDeviceMemory objects that have been released to the system.</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:3741</div></div>
+<div class="ttc" id="astruct_vma_defragmentation_stats_html_a36f9d5df2a10ba2a36b16e126d60572d"><div class="ttname"><a href="struct_vma_defragmentation_stats.html#a36f9d5df2a10ba2a36b16e126d60572d">VmaDefragmentationStats::bytesMoved</a></div><div class="ttdeci">VkDeviceSize bytesMoved</div><div class="ttdoc">Total number of bytes that have been copied while moving allocations to different places.</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:3735</div></div>
+<div class="ttc" id="astruct_vma_defragmentation_stats_html_ab0cb9ac0dbc106c77e384ea676422f28"><div class="ttname"><a href="struct_vma_defragmentation_stats.html#ab0cb9ac0dbc106c77e384ea676422f28">VmaDefragmentationStats::bytesFreed</a></div><div class="ttdeci">VkDeviceSize bytesFreed</div><div class="ttdoc">Total number of bytes that have been released to the system by freeing empty VkDeviceMemory objects.</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:3737</div></div>
+<div class="ttc" id="astruct_vma_defragmentation_stats_html_aefeabf130022008eadd75999478af3f9"><div class="ttname"><a href="struct_vma_defragmentation_stats.html#aefeabf130022008eadd75999478af3f9">VmaDefragmentationStats::allocationsMoved</a></div><div class="ttdeci">uint32_t allocationsMoved</div><div class="ttdoc">Number of allocations that have been moved to different places.</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:3739</div></div>
+<div class="ttc" id="astruct_vma_device_memory_callbacks_html"><div class="ttname"><a href="struct_vma_device_memory_callbacks.html">VmaDeviceMemoryCallbacks</a></div><div class="ttdoc">Set of callbacks that the library will call for vkAllocateMemory and vkFreeMemory.</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2222</div></div>
+<div class="ttc" id="astruct_vma_device_memory_callbacks_html_a24052de0937ddd54015a2df0363903c6"><div class="ttname"><a href="struct_vma_device_memory_callbacks.html#a24052de0937ddd54015a2df0363903c6">VmaDeviceMemoryCallbacks::pUserData</a></div><div class="ttdeci">void * pUserData</div><div class="ttdoc">Optional, can be null.</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2228</div></div>
+<div class="ttc" id="astruct_vma_device_memory_callbacks_html_a4f17f7b255101e733b44d5633aceabfb"><div class="ttname"><a href="struct_vma_device_memory_callbacks.html#a4f17f7b255101e733b44d5633aceabfb">VmaDeviceMemoryCallbacks::pfnAllocate</a></div><div class="ttdeci">PFN_vmaAllocateDeviceMemoryFunction pfnAllocate</div><div class="ttdoc">Optional, can be null.</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2224</div></div>
+<div class="ttc" id="astruct_vma_device_memory_callbacks_html_abe8a3328bbc916f6f712fdb6b299444c"><div class="ttname"><a href="struct_vma_device_memory_callbacks.html#abe8a3328bbc916f6f712fdb6b299444c">VmaDeviceMemoryCallbacks::pfnFree</a></div><div class="ttdeci">PFN_vmaFreeDeviceMemoryFunction pfnFree</div><div class="ttdoc">Optional, can be null.</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2226</div></div>
+<div class="ttc" id="astruct_vma_pool_create_info_html"><div class="ttname"><a href="struct_vma_pool_create_info.html">VmaPoolCreateInfo</a></div><div class="ttdoc">Describes parameter of created VmaPool.</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:3047</div></div>
+<div class="ttc" id="astruct_vma_pool_create_info_html_a16e686c688f6725f119ebf6e24ab5274"><div class="ttname"><a href="struct_vma_pool_create_info.html#a16e686c688f6725f119ebf6e24ab5274">VmaPoolCreateInfo::priority</a></div><div class="ttdeci">float priority</div><div class="ttdoc">A floating-point value between 0 and 1, indicating the priority of the allocations in this pool relat...</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:3095</div></div>
+<div class="ttc" id="astruct_vma_pool_create_info_html_a596fa76b685d3f1f688f84a709a5b319"><div class="ttname"><a href="struct_vma_pool_create_info.html#a596fa76b685d3f1f688f84a709a5b319">VmaPoolCreateInfo::memoryTypeIndex</a></div><div class="ttdeci">uint32_t memoryTypeIndex</div><div class="ttdoc">Vulkan memory type index to allocate this pool from.</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:3050</div></div>
+<div class="ttc" id="astruct_vma_pool_create_info_html_a8405139f63d078340ae74513a59f5446"><div class="ttname"><a href="struct_vma_pool_create_info.html#a8405139f63d078340ae74513a59f5446">VmaPoolCreateInfo::flags</a></div><div class="ttdeci">VmaPoolCreateFlags flags</div><div class="ttdoc">Use combination of VmaPoolCreateFlagBits.</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:3053</div></div>
+<div class="ttc" id="astruct_vma_pool_create_info_html_a9437e43ffbb644dbbf7fc4e50cfad6aa"><div class="ttname"><a href="struct_vma_pool_create_info.html#a9437e43ffbb644dbbf7fc4e50cfad6aa">VmaPoolCreateInfo::frameInUseCount</a></div><div class="ttdeci">uint32_t frameInUseCount</div><div class="ttdoc">Maximum number of additional frames that are in use at the same time as current frame.</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:3089</div></div>
+<div class="ttc" id="astruct_vma_pool_create_info_html_aa4265160536cdb9be821b7686c16c676"><div class="ttname"><a href="struct_vma_pool_create_info.html#aa4265160536cdb9be821b7686c16c676">VmaPoolCreateInfo::blockSize</a></div><div class="ttdeci">VkDeviceSize blockSize</div><div class="ttdoc">Size of a single VkDeviceMemory block to be allocated as part of this pool, in bytes....</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:3062</div></div>
+<div class="ttc" id="astruct_vma_pool_create_info_html_ad8006fb803185c0a699d30f3e9a865ae"><div class="ttname"><a href="struct_vma_pool_create_info.html#ad8006fb803185c0a699d30f3e9a865ae">VmaPoolCreateInfo::minBlockCount</a></div><div class="ttdeci">size_t minBlockCount</div><div class="ttdoc">Minimum number of blocks to be always allocated in this pool, even if they stay empty.</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:3067</div></div>
+<div class="ttc" id="astruct_vma_pool_create_info_html_ae41142f2834fcdc82baa4883c187b75c"><div class="ttname"><a href="struct_vma_pool_create_info.html#ae41142f2834fcdc82baa4883c187b75c">VmaPoolCreateInfo::maxBlockCount</a></div><div class="ttdeci">size_t maxBlockCount</div><div class="ttdoc">Maximum number of blocks that can be allocated in this pool. Optional.</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:3075</div></div>
+<div class="ttc" id="astruct_vma_pool_html"><div class="ttname"><a href="struct_vma_pool.html">VmaPool</a></div><div class="ttdoc">Represents custom memory pool.</div></div>
+<div class="ttc" id="astruct_vma_pool_stats_html"><div class="ttname"><a href="struct_vma_pool_stats.html">VmaPoolStats</a></div><div class="ttdoc">Describes parameter of existing VmaPool.</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:3100</div></div>
+<div class="ttc" id="astruct_vma_pool_stats_html_a326807b2de2b0931cee4ed9a5f2e420c"><div class="ttname"><a href="struct_vma_pool_stats.html#a326807b2de2b0931cee4ed9a5f2e420c">VmaPoolStats::size</a></div><div class="ttdeci">VkDeviceSize size</div><div class="ttdoc">Total amount of VkDeviceMemory allocated from Vulkan for this pool, in bytes.</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:3103</div></div>
+<div class="ttc" id="astruct_vma_pool_stats_html_aa0b5cb45cef6f18571cefb03b9a230e7"><div class="ttname"><a href="struct_vma_pool_stats.html#aa0b5cb45cef6f18571cefb03b9a230e7">VmaPoolStats::blockCount</a></div><div class="ttdeci">size_t blockCount</div><div class="ttdoc">Number of VkDeviceMemory blocks allocated for this pool.</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:3122</div></div>
+<div class="ttc" id="astruct_vma_pool_stats_html_ab4c8f52dd42ab01998f60f0b6acc722b"><div class="ttname"><a href="struct_vma_pool_stats.html#ab4c8f52dd42ab01998f60f0b6acc722b">VmaPoolStats::unusedRangeSizeMax</a></div><div class="ttdeci">VkDeviceSize unusedRangeSizeMax</div><div class="ttdoc">Size of the largest continuous free memory region available for new allocation.</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:3119</div></div>
+<div class="ttc" id="astruct_vma_pool_stats_html_ad1924eb54fffa45e9e0e65670c8fe5eb"><div class="ttname"><a href="struct_vma_pool_stats.html#ad1924eb54fffa45e9e0e65670c8fe5eb">VmaPoolStats::allocationCount</a></div><div class="ttdeci">size_t allocationCount</div><div class="ttdoc">Number of VmaAllocation objects created from this pool that were not destroyed or lost.</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:3109</div></div>
+<div class="ttc" id="astruct_vma_pool_stats_html_ad7c54874724fce7b06aba526202d82a8"><div class="ttname"><a href="struct_vma_pool_stats.html#ad7c54874724fce7b06aba526202d82a8">VmaPoolStats::unusedSize</a></div><div class="ttdeci">VkDeviceSize unusedSize</div><div class="ttdoc">Total number of bytes in the pool not used by any VmaAllocation.</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:3106</div></div>
+<div class="ttc" id="astruct_vma_pool_stats_html_ae4f3546ffa4d1e598b64d8e6134854f4"><div class="ttname"><a href="struct_vma_pool_stats.html#ae4f3546ffa4d1e598b64d8e6134854f4">VmaPoolStats::unusedRangeCount</a></div><div class="ttdeci">size_t unusedRangeCount</div><div class="ttdoc">Number of continuous memory ranges in the pool not used by any VmaAllocation.</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:3112</div></div>
+<div class="ttc" id="astruct_vma_record_settings_html"><div class="ttname"><a href="struct_vma_record_settings.html">VmaRecordSettings</a></div><div class="ttdoc">Parameters for recording calls to VMA functions. To be used in VmaAllocatorCreateInfo::pRecordSetting...</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2398</div></div>
+<div class="ttc" id="astruct_vma_record_settings_html_a6cb1fdbf6bcb610b68f2010dd629e89d"><div class="ttname"><a href="struct_vma_record_settings.html#a6cb1fdbf6bcb610b68f2010dd629e89d">VmaRecordSettings::pFilePath</a></div><div class="ttdeci">const char * pFilePath</div><div class="ttdoc">Path to the file that should be written by the recording.</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2408</div></div>
+<div class="ttc" id="astruct_vma_record_settings_html_ad8fdcc92119ae7a8c08c1a564c01d63a"><div class="ttname"><a href="struct_vma_record_settings.html#ad8fdcc92119ae7a8c08c1a564c01d63a">VmaRecordSettings::flags</a></div><div class="ttdeci">VmaRecordFlags flags</div><div class="ttdoc">Flags for recording. Use VmaRecordFlagBits enum.</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2400</div></div>
+<div class="ttc" id="astruct_vma_stat_info_html"><div class="ttname"><a href="struct_vma_stat_info.html">VmaStatInfo</a></div><div class="ttdoc">Calculated statistics of memory usage in entire allocator.</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2578</div></div>
+<div class="ttc" id="astruct_vma_stat_info_html_a1081a039964e566c672e7a2347f9e599"><div class="ttname"><a href="struct_vma_stat_info.html#a1081a039964e566c672e7a2347f9e599">VmaStatInfo::allocationSizeAvg</a></div><div class="ttdeci">VkDeviceSize allocationSizeAvg</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2589</div></div>
+<div class="ttc" id="astruct_vma_stat_info_html_a17e9733a5ecd76287d4db6e66f71f50c"><div class="ttname"><a href="struct_vma_stat_info.html#a17e9733a5ecd76287d4db6e66f71f50c">VmaStatInfo::allocationSizeMax</a></div><div class="ttdeci">VkDeviceSize allocationSizeMax</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2589</div></div>
+<div class="ttc" id="astruct_vma_stat_info_html_a1859d290aca2cd582d8dc25922092669"><div class="ttname"><a href="struct_vma_stat_info.html#a1859d290aca2cd582d8dc25922092669">VmaStatInfo::unusedBytes</a></div><div class="ttdeci">VkDeviceSize unusedBytes</div><div class="ttdoc">Total number of bytes occupied by unused ranges.</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2588</div></div>
+<div class="ttc" id="astruct_vma_stat_info_html_a2f9b3452af90c9768a30b7fb6ae194fc"><div class="ttname"><a href="struct_vma_stat_info.html#a2f9b3452af90c9768a30b7fb6ae194fc">VmaStatInfo::unusedRangeSizeAvg</a></div><div class="ttdeci">VkDeviceSize unusedRangeSizeAvg</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2590</div></div>
+<div class="ttc" id="astruct_vma_stat_info_html_a537741e4d5cdddc1c0ab95ec650afaff"><div class="ttname"><a href="struct_vma_stat_info.html#a537741e4d5cdddc1c0ab95ec650afaff">VmaStatInfo::allocationCount</a></div><div class="ttdeci">uint32_t allocationCount</div><div class="ttdoc">Number of VmaAllocation allocation objects allocated.</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2582</div></div>
+<div class="ttc" id="astruct_vma_stat_info_html_a5ba1a2476c4d39b10f7e2f7ebbb72ac4"><div class="ttname"><a href="struct_vma_stat_info.html#a5ba1a2476c4d39b10f7e2f7ebbb72ac4">VmaStatInfo::unusedRangeSizeMax</a></div><div class="ttdeci">VkDeviceSize unusedRangeSizeMax</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2590</div></div>
+<div class="ttc" id="astruct_vma_stat_info_html_ab0c6c73837e5a70c749fbd4f6064895a"><div class="ttname"><a href="struct_vma_stat_info.html#ab0c6c73837e5a70c749fbd4f6064895a">VmaStatInfo::usedBytes</a></div><div class="ttdeci">VkDeviceSize usedBytes</div><div class="ttdoc">Total number of bytes occupied by all allocations.</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2586</div></div>
+<div class="ttc" id="astruct_vma_stat_info_html_abc4bb7cd611900778464c56e50c970a4"><div class="ttname"><a href="struct_vma_stat_info.html#abc4bb7cd611900778464c56e50c970a4">VmaStatInfo::blockCount</a></div><div class="ttdeci">uint32_t blockCount</div><div class="ttdoc">Number of VkDeviceMemory Vulkan memory blocks allocated.</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2580</div></div>
+<div class="ttc" id="astruct_vma_stat_info_html_ade8b40bd3139c04aabd2fc538a356fea"><div class="ttname"><a href="struct_vma_stat_info.html#ade8b40bd3139c04aabd2fc538a356fea">VmaStatInfo::allocationSizeMin</a></div><div class="ttdeci">VkDeviceSize allocationSizeMin</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2589</div></div>
+<div class="ttc" id="astruct_vma_stat_info_html_ae06129c771bfebfd6468a7f4276502a9"><div class="ttname"><a href="struct_vma_stat_info.html#ae06129c771bfebfd6468a7f4276502a9">VmaStatInfo::unusedRangeCount</a></div><div class="ttdeci">uint32_t unusedRangeCount</div><div class="ttdoc">Number of free ranges of memory between allocations.</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2584</div></div>
+<div class="ttc" id="astruct_vma_stat_info_html_aedeba931324f16589cd2416c0d2dd0d4"><div class="ttname"><a href="struct_vma_stat_info.html#aedeba931324f16589cd2416c0d2dd0d4">VmaStatInfo::unusedRangeSizeMin</a></div><div class="ttdeci">VkDeviceSize unusedRangeSizeMin</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2590</div></div>
+<div class="ttc" id="astruct_vma_stats_html"><div class="ttname"><a href="struct_vma_stats.html">VmaStats</a></div><div class="ttdoc">General statistics from current state of Allocator.</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2595</div></div>
+<div class="ttc" id="astruct_vma_stats_html_a0e6611508c29a187f0fd14ff1a0329c0"><div class="ttname"><a href="struct_vma_stats.html#a0e6611508c29a187f0fd14ff1a0329c0">VmaStats::memoryHeap</a></div><div class="ttdeci">VmaStatInfo memoryHeap[VK_MAX_MEMORY_HEAPS]</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2597</div></div>
+<div class="ttc" id="astruct_vma_stats_html_a13e3caf754be79352c42408756309331"><div class="ttname"><a href="struct_vma_stats.html#a13e3caf754be79352c42408756309331">VmaStats::memoryType</a></div><div class="ttdeci">VmaStatInfo memoryType[VK_MAX_MEMORY_TYPES]</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2596</div></div>
+<div class="ttc" id="astruct_vma_stats_html_a2e8f5b3353f2fefef3c27f29e245a1f9"><div class="ttname"><a href="struct_vma_stats.html#a2e8f5b3353f2fefef3c27f29e245a1f9">VmaStats::total</a></div><div class="ttdeci">VmaStatInfo total</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2598</div></div>
+<div class="ttc" id="astruct_vma_vulkan_functions_html"><div class="ttname"><a href="struct_vma_vulkan_functions.html">VmaVulkanFunctions</a></div><div class="ttdoc">Pointers to some Vulkan functions - a subset used by the library.</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2352</div></div>
+<div class="ttc" id="astruct_vma_vulkan_functions_html_a1338d96a128a5ade648b8d934907c637"><div class="ttname"><a href="struct_vma_vulkan_functions.html#a1338d96a128a5ade648b8d934907c637">VmaVulkanFunctions::vkBindImageMemory</a></div><div class="ttdeci">PFN_vkBindImageMemory vkBindImageMemory</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2362</div></div>
+<div class="ttc" id="astruct_vma_vulkan_functions_html_a23ebe70be515b9b5010a1d691200e325"><div class="ttname"><a href="struct_vma_vulkan_functions.html#a23ebe70be515b9b5010a1d691200e325">VmaVulkanFunctions::vkCreateImage</a></div><div class="ttdeci">PFN_vkCreateImage vkCreateImage</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2367</div></div>
+<div class="ttc" id="astruct_vma_vulkan_functions_html_a2943bf99dfd784a0e8f599d987e22e6c"><div class="ttname"><a href="struct_vma_vulkan_functions.html#a2943bf99dfd784a0e8f599d987e22e6c">VmaVulkanFunctions::vkAllocateMemory</a></div><div class="ttdeci">PFN_vkAllocateMemory vkAllocateMemory</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2355</div></div>
+<div class="ttc" id="astruct_vma_vulkan_functions_html_a33c322f4c4ad2810f8a9c97a277572f9"><div class="ttname"><a href="struct_vma_vulkan_functions.html#a33c322f4c4ad2810f8a9c97a277572f9">VmaVulkanFunctions::vkFlushMappedMemoryRanges</a></div><div class="ttdeci">PFN_vkFlushMappedMemoryRanges vkFlushMappedMemoryRanges</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2359</div></div>
+<div class="ttc" id="astruct_vma_vulkan_functions_html_a475f6f49f8debe4d10800592606d53f4"><div class="ttname"><a href="struct_vma_vulkan_functions.html#a475f6f49f8debe4d10800592606d53f4">VmaVulkanFunctions::vkGetImageMemoryRequirements</a></div><div class="ttdeci">PFN_vkGetImageMemoryRequirements vkGetImageMemoryRequirements</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2364</div></div>
+<div class="ttc" id="astruct_vma_vulkan_functions_html_a4c658701778564d62034255b5dda91b4"><div class="ttname"><a href="struct_vma_vulkan_functions.html#a4c658701778564d62034255b5dda91b4">VmaVulkanFunctions::vkFreeMemory</a></div><div class="ttdeci">PFN_vkFreeMemory vkFreeMemory</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2356</div></div>
+<div class="ttc" id="astruct_vma_vulkan_functions_html_a5b92901df89a4194b0d12f6071d4d143"><div class="ttname"><a href="struct_vma_vulkan_functions.html#a5b92901df89a4194b0d12f6071d4d143">VmaVulkanFunctions::vkGetBufferMemoryRequirements</a></div><div class="ttdeci">PFN_vkGetBufferMemoryRequirements vkGetBufferMemoryRequirements</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2363</div></div>
+<div class="ttc" id="astruct_vma_vulkan_functions_html_a5c1093bc32386a8060c37c9f282078a1"><div class="ttname"><a href="struct_vma_vulkan_functions.html#a5c1093bc32386a8060c37c9f282078a1">VmaVulkanFunctions::vkInvalidateMappedMemoryRanges</a></div><div class="ttdeci">PFN_vkInvalidateMappedMemoryRanges vkInvalidateMappedMemoryRanges</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2360</div></div>
+<div class="ttc" id="astruct_vma_vulkan_functions_html_a60d25c33bba06bb8592e6875cbaa9830"><div class="ttname"><a href="struct_vma_vulkan_functions.html#a60d25c33bba06bb8592e6875cbaa9830">VmaVulkanFunctions::vkGetPhysicalDeviceMemoryProperties</a></div><div class="ttdeci">PFN_vkGetPhysicalDeviceMemoryProperties vkGetPhysicalDeviceMemoryProperties</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2354</div></div>
+<div class="ttc" id="astruct_vma_vulkan_functions_html_a77b7a74082823e865dd6546623468f96"><div class="ttname"><a href="struct_vma_vulkan_functions.html#a77b7a74082823e865dd6546623468f96">VmaVulkanFunctions::vkGetPhysicalDeviceProperties</a></div><div class="ttdeci">PFN_vkGetPhysicalDeviceProperties vkGetPhysicalDeviceProperties</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2353</div></div>
+<div class="ttc" id="astruct_vma_vulkan_functions_html_a7e054606faddb07f0e8556f3ed317d45"><div class="ttname"><a href="struct_vma_vulkan_functions.html#a7e054606faddb07f0e8556f3ed317d45">VmaVulkanFunctions::vkDestroyBuffer</a></div><div class="ttdeci">PFN_vkDestroyBuffer vkDestroyBuffer</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2366</div></div>
+<div class="ttc" id="astruct_vma_vulkan_functions_html_a90b898227039b1dcb3520f6e91f09ffa"><div class="ttname"><a href="struct_vma_vulkan_functions.html#a90b898227039b1dcb3520f6e91f09ffa">VmaVulkanFunctions::vkDestroyImage</a></div><div class="ttdeci">PFN_vkDestroyImage vkDestroyImage</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2368</div></div>
+<div class="ttc" id="astruct_vma_vulkan_functions_html_a94fc4f3a605d9880bb3c0ba2c2fc80b2"><div class="ttname"><a href="struct_vma_vulkan_functions.html#a94fc4f3a605d9880bb3c0ba2c2fc80b2">VmaVulkanFunctions::vkBindBufferMemory</a></div><div class="ttdeci">PFN_vkBindBufferMemory vkBindBufferMemory</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2361</div></div>
+<div class="ttc" id="astruct_vma_vulkan_functions_html_ab5c1f38dea3a2cf00dc9eb4f57218c49"><div class="ttname"><a href="struct_vma_vulkan_functions.html#ab5c1f38dea3a2cf00dc9eb4f57218c49">VmaVulkanFunctions::vkMapMemory</a></div><div class="ttdeci">PFN_vkMapMemory vkMapMemory</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2357</div></div>
+<div class="ttc" id="astruct_vma_vulkan_functions_html_acc798589736f0becb317fc2196c1d8b9"><div class="ttname"><a href="struct_vma_vulkan_functions.html#acc798589736f0becb317fc2196c1d8b9">VmaVulkanFunctions::vkUnmapMemory</a></div><div class="ttdeci">PFN_vkUnmapMemory vkUnmapMemory</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2358</div></div>
+<div class="ttc" id="astruct_vma_vulkan_functions_html_ae5c0db8c89a3b82593dc16aa6a49fa3a"><div class="ttname"><a href="struct_vma_vulkan_functions.html#ae5c0db8c89a3b82593dc16aa6a49fa3a">VmaVulkanFunctions::vkCmdCopyBuffer</a></div><div class="ttdeci">PFN_vkCmdCopyBuffer vkCmdCopyBuffer</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2369</div></div>
+<div class="ttc" id="astruct_vma_vulkan_functions_html_ae8084315a25006271a2edfc3a447519f"><div class="ttname"><a href="struct_vma_vulkan_functions.html#ae8084315a25006271a2edfc3a447519f">VmaVulkanFunctions::vkCreateBuffer</a></div><div class="ttdeci">PFN_vkCreateBuffer vkCreateBuffer</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2365</div></div>
+<div class="ttc" id="avk__mem__alloc_8h_html_a02a94f25679275851a53e82eacbcfc73"><div class="ttname"><a href="vk__mem__alloc_8h.html#a02a94f25679275851a53e82eacbcfc73">vmaCreateImage</a></div><div class="ttdeci">VkResult vmaCreateImage(VmaAllocator allocator, const VkImageCreateInfo *pImageCreateInfo, const VmaAllocationCreateInfo *pAllocationCreateInfo, VkImage *pImage, VmaAllocation *pAllocation, VmaAllocationInfo *pAllocationInfo)</div><div class="ttdoc">Function similar to vmaCreateBuffer().</div></div>
+<div class="ttc" id="avk__mem__alloc_8h_html_a088da83d8eaf3ce9056d9ea0b981d472"><div class="ttname"><a href="vk__mem__alloc_8h.html#a088da83d8eaf3ce9056d9ea0b981d472">vmaFindMemoryTypeIndexForImageInfo</a></div><div class="ttdeci">VkResult vmaFindMemoryTypeIndexForImageInfo(VmaAllocator allocator, const VkImageCreateInfo *pImageCreateInfo, const VmaAllocationCreateInfo *pAllocationCreateInfo, uint32_t *pMemoryTypeIndex)</div><div class="ttdoc">Helps to find memoryTypeIndex, given VkImageCreateInfo and VmaAllocationCreateInfo.</div></div>
+<div class="ttc" id="avk__mem__alloc_8h_html_a0d9f4e4ba5bf9aab1f1c746387753d77"><div class="ttname"><a href="vk__mem__alloc_8h.html#a0d9f4e4ba5bf9aab1f1c746387753d77">vmaDestroyBuffer</a></div><div class="ttdeci">void vmaDestroyBuffer(VmaAllocator allocator, VkBuffer buffer, VmaAllocation allocation)</div><div class="ttdoc">Destroys Vulkan buffer and frees allocated memory.</div></div>
+<div class="ttc" id="avk__mem__alloc_8h_html_a0faa3f9e5fb233d29d1e00390650febb"><div class="ttname"><a href="vk__mem__alloc_8h.html#a0faa3f9e5fb233d29d1e00390650febb">vmaAllocateMemoryForImage</a></div><div class="ttdeci">VkResult vmaAllocateMemoryForImage(VmaAllocator allocator, VkImage image, const VmaAllocationCreateInfo *pCreateInfo, VmaAllocation *pAllocation, VmaAllocationInfo *pAllocationInfo)</div><div class="ttdoc">Function similar to vmaAllocateMemoryForBuffer().</div></div>
+<div class="ttc" id="avk__mem__alloc_8h_html_a1017aa83489c0eee8d2163d2bf253f67"><div class="ttname"><a href="vk__mem__alloc_8h.html#a1017aa83489c0eee8d2163d2bf253f67">VmaPoolCreateInfo</a></div><div class="ttdeci">struct VmaPoolCreateInfo VmaPoolCreateInfo</div><div class="ttdoc">Describes parameter of created VmaPool.</div></div>
+<div class="ttc" id="avk__mem__alloc_8h_html_a154ccaaf53dc2c36378f80f0c4f3679b"><div class="ttname"><a href="vk__mem__alloc_8h.html#a154ccaaf53dc2c36378f80f0c4f3679b">PFN_vmaFreeDeviceMemoryFunction</a></div><div class="ttdeci">void(VKAPI_PTR * PFN_vmaFreeDeviceMemoryFunction)(VmaAllocator allocator, uint32_t memoryType, VkDeviceMemory memory, VkDeviceSize size, void *pUserData)</div><div class="ttdoc">Callback function called before vkFreeMemory.</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2208</div></div>
+<div class="ttc" id="avk__mem__alloc_8h_html_a16e21c877101493fce582664cd8754fc"><div class="ttname"><a href="vk__mem__alloc_8h.html#a16e21c877101493fce582664cd8754fc">VmaRecordSettings</a></div><div class="ttdeci">struct VmaRecordSettings VmaRecordSettings</div><div class="ttdoc">Parameters for recording calls to VMA functions. To be used in VmaAllocatorCreateInfo::pRecordSetting...</div></div>
+<div class="ttc" id="avk__mem__alloc_8h_html_a1988031b0223fdbd564250fa1edd942c"><div class="ttname"><a href="vk__mem__alloc_8h.html#a1988031b0223fdbd564250fa1edd942c">VmaAllocatorInfo</a></div><div class="ttdeci">struct VmaAllocatorInfo VmaAllocatorInfo</div><div class="ttdoc">Information about existing VmaAllocator object.</div></div>
+<div class="ttc" id="avk__mem__alloc_8h_html_a1b9ffa538bed905af55c747cc48963bd"><div class="ttname"><a href="vk__mem__alloc_8h.html#a1b9ffa538bed905af55c747cc48963bd">vmaEndDefragmentationPass</a></div><div class="ttdeci">VkResult vmaEndDefragmentationPass(VmaAllocator allocator, VmaDefragmentationContext context)</div></div>
+<div class="ttc" id="avk__mem__alloc_8h_html_a1cf7774606721026a68aabe3af2e5b50"><div class="ttname"><a href="vk__mem__alloc_8h.html#a1cf7774606721026a68aabe3af2e5b50">VmaAllocationInfo</a></div><div class="ttdeci">struct VmaAllocationInfo VmaAllocationInfo</div><div class="ttdoc">Parameters of VmaAllocation objects, that can be retrieved using function vmaGetAllocationInfo().</div></div>
+<div class="ttc" id="avk__mem__alloc_8h_html_a1f0c126759fc96ccb6e2d23c101d770c"><div class="ttname"><a href="vk__mem__alloc_8h.html#a1f0c126759fc96ccb6e2d23c101d770c">VMA_RECORDING_ENABLED</a></div><div class="ttdeci">#define VMA_RECORDING_ENABLED</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2029</div></div>
+<div class="ttc" id="avk__mem__alloc_8h_html_a200692051ddb34240248234f5f4c17bb"><div class="ttname"><a href="vk__mem__alloc_8h.html#a200692051ddb34240248234f5f4c17bb">vmaCreateAllocator</a></div><div class="ttdeci">VkResult vmaCreateAllocator(const VmaAllocatorCreateInfo *pCreateInfo, VmaAllocator *pAllocator)</div><div class="ttdoc">Creates Allocator object.</div></div>
+<div class="ttc" id="avk__mem__alloc_8h_html_a21813b2efdf3836767a9058cd8a94034"><div class="ttname"><a href="vk__mem__alloc_8h.html#a21813b2efdf3836767a9058cd8a94034">VmaStats</a></div><div class="ttdeci">struct VmaStats VmaStats</div><div class="ttdoc">General statistics from current state of Allocator.</div></div>
+<div class="ttc" id="avk__mem__alloc_8h_html_a2770e325ea42e087c1b91fdf46d0292a"><div class="ttname"><a href="vk__mem__alloc_8h.html#a2770e325ea42e087c1b91fdf46d0292a">VmaPoolCreateFlags</a></div><div class="ttdeci">VkFlags VmaPoolCreateFlags</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:3043</div></div>
+<div class="ttc" id="avk__mem__alloc_8h_html_a2bf47f96bf92bed2a49461bd9af3acfa"><div class="ttname"><a href="vk__mem__alloc_8h.html#a2bf47f96bf92bed2a49461bd9af3acfa">VmaDefragmentationInfo</a></div><div class="ttdeci">struct VmaDefragmentationInfo VmaDefragmentationInfo</div><div class="ttdoc">Deprecated. Optional configuration parameters to be passed to function vmaDefragment().</div></div>
+<div class="ttc" id="avk__mem__alloc_8h_html_a30c37c1eec6025f397be41644f48490f"><div class="ttname"><a href="vk__mem__alloc_8h.html#a30c37c1eec6025f397be41644f48490f">vmaFlushAllocation</a></div><div class="ttdeci">VkResult vmaFlushAllocation(VmaAllocator allocator, VmaAllocation allocation, VkDeviceSize offset, VkDeviceSize size)</div><div class="ttdoc">Flushes memory of given allocation.</div></div>
+<div class="ttc" id="avk__mem__alloc_8h_html_a3104eb30d8122c84dd8541063f145288"><div class="ttname"><a href="vk__mem__alloc_8h.html#a3104eb30d8122c84dd8541063f145288">vmaFreeStatsString</a></div><div class="ttdeci">void vmaFreeStatsString(VmaAllocator allocator, char *pStatsString)</div></div>
+<div class="ttc" id="avk__mem__alloc_8h_html_a333b61c1788cb23559177531e6a93ca3"><div class="ttname"><a href="vk__mem__alloc_8h.html#a333b61c1788cb23559177531e6a93ca3">vmaCalculateStats</a></div><div class="ttdeci">void vmaCalculateStats(VmaAllocator allocator, VmaStats *pStats)</div><div class="ttdoc">Retrieves statistics from current state of the Allocator.</div></div>
+<div class="ttc" id="avk__mem__alloc_8h_html_a36ba776fd7fd5cb1e9359fdc0d8e6e8a"><div class="ttname"><a href="vk__mem__alloc_8h.html#a36ba776fd7fd5cb1e9359fdc0d8e6e8a">vmaDefragmentationBegin</a></div><div class="ttdeci">VkResult vmaDefragmentationBegin(VmaAllocator allocator, const VmaDefragmentationInfo2 *pInfo, VmaDefragmentationStats *pStats, VmaDefragmentationContext *pContext)</div><div class="ttdoc">Begins defragmentation process.</div></div>
+<div class="ttc" id="avk__mem__alloc_8h_html_a3bf110892ea2fb4649fedb68488d026a"><div class="ttname"><a href="vk__mem__alloc_8h.html#a3bf110892ea2fb4649fedb68488d026a">VmaAllocationCreateInfo</a></div><div class="ttdeci">struct VmaAllocationCreateInfo VmaAllocationCreateInfo</div></div>
+<div class="ttc" id="avk__mem__alloc_8h_html_a3d3ca45799923aa5d138e9e5f9eb2da5"><div class="ttname"><a href="vk__mem__alloc_8h.html#a3d3ca45799923aa5d138e9e5f9eb2da5">vmaBindImageMemory</a></div><div class="ttdeci">VkResult vmaBindImageMemory(VmaAllocator allocator, VmaAllocation allocation, VkImage image)</div><div class="ttdoc">Binds image to allocation.</div></div>
+<div class="ttc" id="avk__mem__alloc_8h_html_a43d8ba9673c846f049089a5029d5c73a"><div class="ttname"><a href="vk__mem__alloc_8h.html#a43d8ba9673c846f049089a5029d5c73a">vmaTouchAllocation</a></div><div class="ttdeci">VkBool32 vmaTouchAllocation(VmaAllocator allocator, VmaAllocation allocation)</div><div class="ttdoc">Returns VK_TRUE if allocation is not lost and atomically marks it as used in current frame.</div></div>
+<div class="ttc" id="avk__mem__alloc_8h_html_a4759a2d9f99c19ba7627553c847132f1"><div class="ttname"><a href="vk__mem__alloc_8h.html#a4759a2d9f99c19ba7627553c847132f1">VmaPoolStats</a></div><div class="ttdeci">struct VmaPoolStats VmaPoolStats</div><div class="ttdoc">Describes parameter of existing VmaPool.</div></div>
+<div class="ttc" id="avk__mem__alloc_8h_html_a49329a7f030dafcf82f7b73334c22e98"><div class="ttname"><a href="vk__mem__alloc_8h.html#a49329a7f030dafcf82f7b73334c22e98">vmaCheckCorruption</a></div><div class="ttdeci">VkResult vmaCheckCorruption(VmaAllocator allocator, uint32_t memoryTypeBits)</div><div class="ttdoc">Checks magic number in margins around all allocations in given memory types (in both default and cust...</div></div>
+<div class="ttc" id="avk__mem__alloc_8h_html_a4dd2c44642312a147a4e93373a6e64d2"><div class="ttname"><a href="vk__mem__alloc_8h.html#a4dd2c44642312a147a4e93373a6e64d2">VmaRecordFlagBits</a></div><div class="ttdeci">VmaRecordFlagBits</div><div class="ttdoc">Flags to be used in VmaRecordSettings::flags.</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2384</div></div>
+<div class="ttc" id="avk__mem__alloc_8h_html_a4dd2c44642312a147a4e93373a6e64d2a20dd17d69966dbffa054739d6090b85e"><div class="ttname"><a href="vk__mem__alloc_8h.html#a4dd2c44642312a147a4e93373a6e64d2a20dd17d69966dbffa054739d6090b85e">VMA_RECORD_FLAG_BITS_MAX_ENUM</a></div><div class="ttdeci">@ VMA_RECORD_FLAG_BITS_MAX_ENUM</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2392</div></div>
+<div class="ttc" id="avk__mem__alloc_8h_html_a4dd2c44642312a147a4e93373a6e64d2a8e7ab322e8732654be627c4ea8f36cc7"><div class="ttname"><a href="vk__mem__alloc_8h.html#a4dd2c44642312a147a4e93373a6e64d2a8e7ab322e8732654be627c4ea8f36cc7">VMA_RECORD_FLUSH_AFTER_CALL_BIT</a></div><div class="ttdeci">@ VMA_RECORD_FLUSH_AFTER_CALL_BIT</div><div class="ttdoc">Enables flush after recording every function call.</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2390</div></div>
+<div class="ttc" id="avk__mem__alloc_8h_html_a4f87c9100d154a65a4ad495f7763cf7c"><div class="ttname"><a href="vk__mem__alloc_8h.html#a4f87c9100d154a65a4ad495f7763cf7c">VmaAllocatorCreateFlagBits</a></div><div class="ttdeci">VmaAllocatorCreateFlagBits</div><div class="ttdoc">Flags for created VmaAllocator.</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2232</div></div>
+<div class="ttc" id="avk__mem__alloc_8h_html_a4f87c9100d154a65a4ad495f7763cf7ca2acce4886d8078552efa38878413970f"><div class="ttname"><a href="vk__mem__alloc_8h.html#a4f87c9100d154a65a4ad495f7763cf7ca2acce4886d8078552efa38878413970f">VMA_ALLOCATOR_CREATE_AMD_DEVICE_COHERENT_MEMORY_BIT</a></div><div class="ttdeci">@ VMA_ALLOCATOR_CREATE_AMD_DEVICE_COHERENT_MEMORY_BIT</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2307</div></div>
+<div class="ttc" id="avk__mem__alloc_8h_html_a4f87c9100d154a65a4ad495f7763cf7ca4816ddaed324ba110172ca608a20f29d"><div class="ttname"><a href="vk__mem__alloc_8h.html#a4f87c9100d154a65a4ad495f7763cf7ca4816ddaed324ba110172ca608a20f29d">VMA_ALLOCATOR_CREATE_EXTERNALLY_SYNCHRONIZED_BIT</a></div><div class="ttdeci">@ VMA_ALLOCATOR_CREATE_EXTERNALLY_SYNCHRONIZED_BIT</div><div class="ttdoc">Allocator and all objects created from it will not be synchronized internally, so you must guarantee ...</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2237</div></div>
+<div class="ttc" id="avk__mem__alloc_8h_html_a4f87c9100d154a65a4ad495f7763cf7ca4d4687863f7bd4b418c6006dc04400b0"><div class="ttname"><a href="vk__mem__alloc_8h.html#a4f87c9100d154a65a4ad495f7763cf7ca4d4687863f7bd4b418c6006dc04400b0">VMA_ALLOCATOR_CREATE_EXT_MEMORY_BUDGET_BIT</a></div><div class="ttdeci">@ VMA_ALLOCATOR_CREATE_EXT_MEMORY_BUDGET_BIT</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2289</div></div>
+<div class="ttc" id="avk__mem__alloc_8h_html_a4f87c9100d154a65a4ad495f7763cf7ca5f1b28b0414319d1687e1f2b30ab0089"><div class="ttname"><a href="vk__mem__alloc_8h.html#a4f87c9100d154a65a4ad495f7763cf7ca5f1b28b0414319d1687e1f2b30ab0089">VMA_ALLOCATOR_CREATE_BUFFER_DEVICE_ADDRESS_BIT</a></div><div class="ttdeci">@ VMA_ALLOCATOR_CREATE_BUFFER_DEVICE_ADDRESS_BIT</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2325</div></div>
+<div class="ttc" id="avk__mem__alloc_8h_html_a4f87c9100d154a65a4ad495f7763cf7ca8fb75bf07cd184ab903596295e863dee"><div class="ttname"><a href="vk__mem__alloc_8h.html#a4f87c9100d154a65a4ad495f7763cf7ca8fb75bf07cd184ab903596295e863dee">VMA_ALLOCATOR_CREATE_KHR_BIND_MEMORY2_BIT</a></div><div class="ttdeci">@ VMA_ALLOCATOR_CREATE_KHR_BIND_MEMORY2_BIT</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2277</div></div>
+<div class="ttc" id="avk__mem__alloc_8h_html_a4f87c9100d154a65a4ad495f7763cf7cace7da7cc6e71a625dfa763c55a597878"><div class="ttname"><a href="vk__mem__alloc_8h.html#a4f87c9100d154a65a4ad495f7763cf7cace7da7cc6e71a625dfa763c55a597878">VMA_ALLOCATOR_CREATE_KHR_DEDICATED_ALLOCATION_BIT</a></div><div class="ttdeci">@ VMA_ALLOCATOR_CREATE_KHR_DEDICATED_ALLOCATION_BIT</div><div class="ttdoc">Enables usage of VK_KHR_dedicated_allocation extension.</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2262</div></div>
+<div class="ttc" id="avk__mem__alloc_8h_html_a4f87c9100d154a65a4ad495f7763cf7cae4d5ad929caba5f23eb502b13bd5286c"><div class="ttname"><a href="vk__mem__alloc_8h.html#a4f87c9100d154a65a4ad495f7763cf7cae4d5ad929caba5f23eb502b13bd5286c">VMA_ALLOCATOR_CREATE_FLAG_BITS_MAX_ENUM</a></div><div class="ttdeci">@ VMA_ALLOCATOR_CREATE_FLAG_BITS_MAX_ENUM</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2344</div></div>
+<div class="ttc" id="avk__mem__alloc_8h_html_a4f87c9100d154a65a4ad495f7763cf7caffdd7a5169be3dbd7cbf6b3619e4f78a"><div class="ttname"><a href="vk__mem__alloc_8h.html#a4f87c9100d154a65a4ad495f7763cf7caffdd7a5169be3dbd7cbf6b3619e4f78a">VMA_ALLOCATOR_CREATE_EXT_MEMORY_PRIORITY_BIT</a></div><div class="ttdeci">@ VMA_ALLOCATOR_CREATE_EXT_MEMORY_PRIORITY_BIT</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2342</div></div>
+<div class="ttc" id="avk__mem__alloc_8h_html_a5225e5e11f8376f6a31a1791f3d6e817"><div class="ttname"><a href="vk__mem__alloc_8h.html#a5225e5e11f8376f6a31a1791f3d6e817">VmaAllocationCreateFlags</a></div><div class="ttdeci">VkFlags VmaAllocationCreateFlags</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2876</div></div>
+<div class="ttc" id="avk__mem__alloc_8h_html_a5485779c8f1948238fc4e92232fa65e1"><div class="ttname"><a href="vk__mem__alloc_8h.html#a5485779c8f1948238fc4e92232fa65e1">vmaDestroyPool</a></div><div class="ttdeci">void vmaDestroyPool(VmaAllocator allocator, VmaPool pool)</div><div class="ttdoc">Destroys VmaPool object and frees Vulkan device memory.</div></div>
+<div class="ttc" id="avk__mem__alloc_8h_html_a5c8770ded7c59c8caac6de0c2cb00b50"><div class="ttname"><a href="vk__mem__alloc_8h.html#a5c8770ded7c59c8caac6de0c2cb00b50">vmaCreatePool</a></div><div class="ttdeci">VkResult vmaCreatePool(VmaAllocator allocator, const VmaPoolCreateInfo *pCreateInfo, VmaPool *pPool)</div><div class="ttdoc">Allocates Vulkan device memory and creates VmaPool object.</div></div>
 <div class="ttc" id="avk__mem__alloc_8h_html_a5fea5518972ae9094b1526cbcb19b05f"><div class="ttname"><a href="vk__mem__alloc_8h.html#a5fea5518972ae9094b1526cbcb19b05f">vmaFreeMemory</a></div><div class="ttdeci">void vmaFreeMemory(VmaAllocator allocator, const VmaAllocation allocation)</div><div class="ttdoc">Frees memory previously allocated using vmaAllocateMemory(), vmaAllocateMemoryForBuffer(),...</div></div>
-<div class="ttc" id="astruct_vma_defragmentation_info_html"><div class="ttname"><a href="struct_vma_defragmentation_info.html">VmaDefragmentationInfo</a></div><div class="ttdoc">Deprecated. Optional configuration parameters to be passed to function vmaDefragment().</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:3563</div></div>
-<div class="ttc" id="avk__mem__alloc_8h_html_ad9889c10c798b040d59c92f257cae597a2310568c62208af432724305fe29ccea"><div class="ttname"><a href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a2310568c62208af432724305fe29ccea">VMA_ALLOCATION_CREATE_DONT_BIND_BIT</a></div><div class="ttdeci">@ VMA_ALLOCATION_CREATE_DONT_BIND_BIT</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2691</div></div>
+<div class="ttc" id="avk__mem__alloc_8h_html_a6552a65b71d16f378c6994b3ceaef50c"><div class="ttname"><a href="vk__mem__alloc_8h.html#a6552a65b71d16f378c6994b3ceaef50c">VmaDefragmentationFlagBits</a></div><div class="ttdeci">VmaDefragmentationFlagBits</div><div class="ttdoc">Flags to be used in vmaDefragmentationBegin(). None at the moment. Reserved for future use.</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:3618</div></div>
+<div class="ttc" id="avk__mem__alloc_8h_html_a6552a65b71d16f378c6994b3ceaef50ca31af49446af2459284a568ce2f3fdd33"><div class="ttname"><a href="vk__mem__alloc_8h.html#a6552a65b71d16f378c6994b3ceaef50ca31af49446af2459284a568ce2f3fdd33">VMA_DEFRAGMENTATION_FLAG_INCREMENTAL</a></div><div class="ttdeci">@ VMA_DEFRAGMENTATION_FLAG_INCREMENTAL</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:3619</div></div>
+<div class="ttc" id="avk__mem__alloc_8h_html_a6552a65b71d16f378c6994b3ceaef50cab87ec33154803bfeb5ac2b379f1d6a97"><div class="ttname"><a href="vk__mem__alloc_8h.html#a6552a65b71d16f378c6994b3ceaef50cab87ec33154803bfeb5ac2b379f1d6a97">VMA_DEFRAGMENTATION_FLAG_BITS_MAX_ENUM</a></div><div class="ttdeci">@ VMA_DEFRAGMENTATION_FLAG_BITS_MAX_ENUM</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:3620</div></div>
+<div class="ttc" id="avk__mem__alloc_8h_html_a6b0929b914b60cf2d45cac4bf3547470"><div class="ttname"><a href="vk__mem__alloc_8h.html#a6b0929b914b60cf2d45cac4bf3547470">vmaBindBufferMemory</a></div><div class="ttdeci">VkResult vmaBindBufferMemory(VmaAllocator allocator, VmaAllocation allocation, VkBuffer buffer)</div><div class="ttdoc">Binds buffer to allocation.</div></div>
+<div class="ttc" id="avk__mem__alloc_8h_html_a72aebd522242d56abea67b4f47f6549e"><div class="ttname"><a href="vk__mem__alloc_8h.html#a72aebd522242d56abea67b4f47f6549e">VmaDefragmentationPassInfo</a></div><div class="ttdeci">struct VmaDefragmentationPassInfo VmaDefragmentationPassInfo</div><div class="ttdoc">Parameters for incremental defragmentation steps.</div></div>
+<div class="ttc" id="avk__mem__alloc_8h_html_a736bd6cbda886f36c891727e73bd4024"><div class="ttname"><a href="vk__mem__alloc_8h.html#a736bd6cbda886f36c891727e73bd4024">vmaMakePoolAllocationsLost</a></div><div class="ttdeci">void vmaMakePoolAllocationsLost(VmaAllocator allocator, VmaPool pool, size_t *pLostAllocationCount)</div><div class="ttdoc">Marks all allocations in given pool as lost if they are not used in current frame or VmaPoolCreateInf...</div></div>
+<div class="ttc" id="avk__mem__alloc_8h_html_a77692d3c8770ea8882d573206bd27b2b"><div class="ttname"><a href="vk__mem__alloc_8h.html#a77692d3c8770ea8882d573206bd27b2b">VmaDeviceMemoryCallbacks</a></div><div class="ttdeci">struct VmaDeviceMemoryCallbacks VmaDeviceMemoryCallbacks</div><div class="ttdoc">Set of callbacks that the library will call for vkAllocateMemory and vkFreeMemory.</div></div>
+<div class="ttc" id="avk__mem__alloc_8h_html_a7e1ed85f7799600b03ad51a77acc21f3"><div class="ttname"><a href="vk__mem__alloc_8h.html#a7e1ed85f7799600b03ad51a77acc21f3">PFN_vmaAllocateDeviceMemoryFunction</a></div><div class="ttdeci">void(VKAPI_PTR * PFN_vmaAllocateDeviceMemoryFunction)(VmaAllocator allocator, uint32_t memoryType, VkDeviceMemory memory, VkDeviceSize size, void *pUserData)</div><div class="ttdoc">Callback function called after successful vkAllocateMemory.</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2201</div></div>
+<div class="ttc" id="avk__mem__alloc_8h_html_a7fdf64415b6c3d83c454f28d2c53df7b"><div class="ttname"><a href="vk__mem__alloc_8h.html#a7fdf64415b6c3d83c454f28d2c53df7b">vmaAllocateMemoryForBuffer</a></div><div class="ttdeci">VkResult vmaAllocateMemoryForBuffer(VmaAllocator allocator, VkBuffer buffer, const VmaAllocationCreateInfo *pCreateInfo, VmaAllocation *pAllocation, VmaAllocationInfo *pAllocationInfo)</div></div>
+<div class="ttc" id="avk__mem__alloc_8h_html_a834b1e4aef395c0a1d56a28e69a4a17e"><div class="ttname"><a href="vk__mem__alloc_8h.html#a834b1e4aef395c0a1d56a28e69a4a17e">vmaFreeMemoryPages</a></div><div class="ttdeci">void vmaFreeMemoryPages(VmaAllocator allocator, size_t allocationCount, const VmaAllocation *pAllocations)</div><div class="ttdoc">Frees memory and destroys multiple allocations.</div></div>
+<div class="ttc" id="avk__mem__alloc_8h_html_a86dd08aba8633bfa4ad0df2e76481d8b"><div class="ttname"><a href="vk__mem__alloc_8h.html#a86dd08aba8633bfa4ad0df2e76481d8b">vmaGetAllocationInfo</a></div><div class="ttdeci">void vmaGetAllocationInfo(VmaAllocator allocator, VmaAllocation allocation, VmaAllocationInfo *pAllocationInfo)</div><div class="ttdoc">Returns current information about specified allocation and atomically marks it as used in current fra...</div></div>
+<div class="ttc" id="avk__mem__alloc_8h_html_a8701444752eb5de4464adb5a2b514bca"><div class="ttname"><a href="vk__mem__alloc_8h.html#a8701444752eb5de4464adb5a2b514bca">vmaGetMemoryTypeProperties</a></div><div class="ttdeci">void vmaGetMemoryTypeProperties(VmaAllocator allocator, uint32_t memoryTypeIndex, VkMemoryPropertyFlags *pFlags)</div><div class="ttdoc">Given Memory Type Index, returns Property Flags of this memory type.</div></div>
+<div class="ttc" id="avk__mem__alloc_8h_html_a8774e20e91e245aae959ba63efa15dd2"><div class="ttname"><a href="vk__mem__alloc_8h.html#a8774e20e91e245aae959ba63efa15dd2">vmaDefragmentationEnd</a></div><div class="ttdeci">VkResult vmaDefragmentationEnd(VmaAllocator allocator, VmaDefragmentationContext context)</div><div class="ttdoc">Ends defragmentation process.</div></div>
+<div class="ttc" id="avk__mem__alloc_8h_html_a88a77cef37e5d3c4fc9eb328885d048d"><div class="ttname"><a href="vk__mem__alloc_8h.html#a88a77cef37e5d3c4fc9eb328885d048d">VmaDefragmentationFlags</a></div><div class="ttdeci">VkFlags VmaDefragmentationFlags</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:3622</div></div>
+<div class="ttc" id="avk__mem__alloc_8h_html_a927c944f45e0f2941182abb6f608e64a"><div class="ttname"><a href="vk__mem__alloc_8h.html#a927c944f45e0f2941182abb6f608e64a">vmaBindBufferMemory2</a></div><div class="ttdeci">VkResult vmaBindBufferMemory2(VmaAllocator allocator, VmaAllocation allocation, VkDeviceSize allocationLocalOffset, VkBuffer buffer, const void *pNext)</div><div class="ttdoc">Binds buffer to allocation with additional parameters.</div></div>
+<div class="ttc" id="avk__mem__alloc_8h_html_a9a7c45f9c863695d98c83fa5ac940fe7"><div class="ttname"><a href="vk__mem__alloc_8h.html#a9a7c45f9c863695d98c83fa5ac940fe7">VmaPoolCreateFlagBits</a></div><div class="ttdeci">VmaPoolCreateFlagBits</div><div class="ttdoc">Flags to be passed as VmaPoolCreateInfo::flags.</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2987</div></div>
+<div class="ttc" id="avk__mem__alloc_8h_html_a9a7c45f9c863695d98c83fa5ac940fe7a13c8a444197c67866be9cb05599fc726"><div class="ttname"><a href="vk__mem__alloc_8h.html#a9a7c45f9c863695d98c83fa5ac940fe7a13c8a444197c67866be9cb05599fc726">VMA_POOL_CREATE_LINEAR_ALGORITHM_BIT</a></div><div class="ttdeci">@ VMA_POOL_CREATE_LINEAR_ALGORITHM_BIT</div><div class="ttdoc">Enables alternative, linear allocation algorithm in this pool.</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:3022</div></div>
+<div class="ttc" id="avk__mem__alloc_8h_html_a9a7c45f9c863695d98c83fa5ac940fe7a1c7312bea9ea246846b9054fd6bd6aec"><div class="ttname"><a href="vk__mem__alloc_8h.html#a9a7c45f9c863695d98c83fa5ac940fe7a1c7312bea9ea246846b9054fd6bd6aec">VMA_POOL_CREATE_FLAG_BITS_MAX_ENUM</a></div><div class="ttdeci">@ VMA_POOL_CREATE_FLAG_BITS_MAX_ENUM</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:3041</div></div>
+<div class="ttc" id="avk__mem__alloc_8h_html_a9a7c45f9c863695d98c83fa5ac940fe7a97a0dc38e5161b780594d998d313d35e"><div class="ttname"><a href="vk__mem__alloc_8h.html#a9a7c45f9c863695d98c83fa5ac940fe7a97a0dc38e5161b780594d998d313d35e">VMA_POOL_CREATE_BUDDY_ALGORITHM_BIT</a></div><div class="ttdeci">@ VMA_POOL_CREATE_BUDDY_ALGORITHM_BIT</div><div class="ttdoc">Enables alternative, buddy allocation algorithm in this pool.</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:3033</div></div>
+<div class="ttc" id="avk__mem__alloc_8h_html_a9a7c45f9c863695d98c83fa5ac940fe7a9f1a499508a8edb4e8ba40aa0290a3d2"><div class="ttname"><a href="vk__mem__alloc_8h.html#a9a7c45f9c863695d98c83fa5ac940fe7a9f1a499508a8edb4e8ba40aa0290a3d2">VMA_POOL_CREATE_IGNORE_BUFFER_IMAGE_GRANULARITY_BIT</a></div><div class="ttdeci">@ VMA_POOL_CREATE_IGNORE_BUFFER_IMAGE_GRANULARITY_BIT</div><div class="ttdoc">Use this flag if you always allocate only buffers and linear images or only optimal images out of thi...</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:3005</div></div>
+<div class="ttc" id="avk__mem__alloc_8h_html_a9a7c45f9c863695d98c83fa5ac940fe7af4d270f8f42517a0f70037ceb6ac1d9c"><div class="ttname"><a href="vk__mem__alloc_8h.html#a9a7c45f9c863695d98c83fa5ac940fe7af4d270f8f42517a0f70037ceb6ac1d9c">VMA_POOL_CREATE_ALGORITHM_MASK</a></div><div class="ttdeci">@ VMA_POOL_CREATE_ALGORITHM_MASK</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:3037</div></div>
+<div class="ttc" id="avk__mem__alloc_8h_html_a9bc268595cb33f6ec4d519cfce81ff45"><div class="ttname"><a href="vk__mem__alloc_8h.html#a9bc268595cb33f6ec4d519cfce81ff45">vmaUnmapMemory</a></div><div class="ttdeci">void vmaUnmapMemory(VmaAllocator allocator, VmaAllocation allocation)</div><div class="ttdoc">Unmaps memory represented by given allocation, mapped previously using vmaMapMemory().</div></div>
+<div class="ttc" id="avk__mem__alloc_8h_html_a9f0f8f56db5f7f57fe4454f465142dac"><div class="ttname"><a href="vk__mem__alloc_8h.html#a9f0f8f56db5f7f57fe4454f465142dac">vmaDefragment</a></div><div class="ttdeci">VkResult vmaDefragment(VmaAllocator allocator, const VmaAllocation *pAllocations, size_t allocationCount, VkBool32 *pAllocationsChanged, const VmaDefragmentationInfo *pDefragmentationInfo, VmaDefragmentationStats *pDefragmentationStats)</div><div class="ttdoc">Deprecated. Compacts memory by moving allocations.</div></div>
+<div class="ttc" id="avk__mem__alloc_8h_html_aa078667e71b1ef24e87a6a30d128381d"><div class="ttname"><a href="vk__mem__alloc_8h.html#aa078667e71b1ef24e87a6a30d128381d">VmaBudget</a></div><div class="ttdeci">struct VmaBudget VmaBudget</div><div class="ttdoc">Statistics of current memory usage and available budget, in bytes, for specific memory heap.</div></div>
+<div class="ttc" id="avk__mem__alloc_8h_html_aa4fee7eb5253377599ef4fd38c93c2a0"><div class="ttname"><a href="vk__mem__alloc_8h.html#aa4fee7eb5253377599ef4fd38c93c2a0">vmaBuildStatsString</a></div><div class="ttdeci">void vmaBuildStatsString(VmaAllocator allocator, char **ppStatsString, VkBool32 detailedMap)</div><div class="ttdoc">Builds and returns statistics as string in JSON format.</div></div>
+<div class="ttc" id="avk__mem__alloc_8h_html_aa5846affa1e9da3800e3e78fae2305cc"><div class="ttname"><a href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305cc">VmaMemoryUsage</a></div><div class="ttdeci">VmaMemoryUsage</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2700</div></div>
+<div class="ttc" id="avk__mem__alloc_8h_html_aa5846affa1e9da3800e3e78fae2305cca091e69437ef693e8d0d287f1c719ba6e"><div class="ttname"><a href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305cca091e69437ef693e8d0d287f1c719ba6e">VMA_MEMORY_USAGE_MAX_ENUM</a></div><div class="ttdeci">@ VMA_MEMORY_USAGE_MAX_ENUM</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2763</div></div>
+<div class="ttc" id="avk__mem__alloc_8h_html_aa5846affa1e9da3800e3e78fae2305cca40bdf4cddeffeb12f43d45ca1286e0a5"><div class="ttname"><a href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305cca40bdf4cddeffeb12f43d45ca1286e0a5">VMA_MEMORY_USAGE_CPU_ONLY</a></div><div class="ttdeci">@ VMA_MEMORY_USAGE_CPU_ONLY</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2731</div></div>
+<div class="ttc" id="avk__mem__alloc_8h_html_aa5846affa1e9da3800e3e78fae2305cca416a444d4d0fc20067c3f76f32ff2500"><div class="ttname"><a href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305cca416a444d4d0fc20067c3f76f32ff2500">VMA_MEMORY_USAGE_CPU_COPY</a></div><div class="ttdeci">@ VMA_MEMORY_USAGE_CPU_COPY</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2753</div></div>
+<div class="ttc" id="avk__mem__alloc_8h_html_aa5846affa1e9da3800e3e78fae2305cca7b586d2fdaf82a463b58f581ed72be27"><div class="ttname"><a href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305cca7b586d2fdaf82a463b58f581ed72be27">VMA_MEMORY_USAGE_GPU_TO_CPU</a></div><div class="ttdeci">@ VMA_MEMORY_USAGE_GPU_TO_CPU</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2747</div></div>
+<div class="ttc" id="avk__mem__alloc_8h_html_aa5846affa1e9da3800e3e78fae2305cca835333d9072db63a653818030e17614d"><div class="ttname"><a href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305cca835333d9072db63a653818030e17614d">VMA_MEMORY_USAGE_GPU_LAZILY_ALLOCATED</a></div><div class="ttdeci">@ VMA_MEMORY_USAGE_GPU_LAZILY_ALLOCATED</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2761</div></div>
+<div class="ttc" id="avk__mem__alloc_8h_html_aa5846affa1e9da3800e3e78fae2305cca9066b52c5a7079bb74a69aaf8b92ff67"><div class="ttname"><a href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305cca9066b52c5a7079bb74a69aaf8b92ff67">VMA_MEMORY_USAGE_CPU_TO_GPU</a></div><div class="ttdeci">@ VMA_MEMORY_USAGE_CPU_TO_GPU</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2738</div></div>
+<div class="ttc" id="avk__mem__alloc_8h_html_aa5846affa1e9da3800e3e78fae2305ccac6b5dc1432d88647aa4cd456246eadf7"><div class="ttname"><a href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305ccac6b5dc1432d88647aa4cd456246eadf7">VMA_MEMORY_USAGE_GPU_ONLY</a></div><div class="ttdeci">@ VMA_MEMORY_USAGE_GPU_ONLY</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2721</div></div>
+<div class="ttc" id="avk__mem__alloc_8h_html_aa5846affa1e9da3800e3e78fae2305ccaf50d27e34e0925cf3a63db8c839121dd"><div class="ttname"><a href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305ccaf50d27e34e0925cf3a63db8c839121dd">VMA_MEMORY_USAGE_UNKNOWN</a></div><div class="ttdeci">@ VMA_MEMORY_USAGE_UNKNOWN</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2704</div></div>
+<div class="ttc" id="avk__mem__alloc_8h_html_aa8251ee81b0045a443e35b8e8aa021bc"><div class="ttname"><a href="vk__mem__alloc_8h.html#aa8251ee81b0045a443e35b8e8aa021bc">vmaBindImageMemory2</a></div><div class="ttdeci">VkResult vmaBindImageMemory2(VmaAllocator allocator, VmaAllocation allocation, VkDeviceSize allocationLocalOffset, VkImage image, const void *pNext)</div><div class="ttdoc">Binds image to allocation with additional parameters.</div></div>
+<div class="ttc" id="avk__mem__alloc_8h_html_aa8d164061c88f22fb1fd3c8f3534bc1d"><div class="ttname"><a href="vk__mem__alloc_8h.html#aa8d164061c88f22fb1fd3c8f3534bc1d">vmaDestroyAllocator</a></div><div class="ttdeci">void vmaDestroyAllocator(VmaAllocator allocator)</div><div class="ttdoc">Destroys allocator object.</div></div>
+<div class="ttc" id="avk__mem__alloc_8h_html_aaa8412919139ef413a4215ac6a290fae"><div class="ttname"><a href="vk__mem__alloc_8h.html#aaa8412919139ef413a4215ac6a290fae">vmaInvalidateAllocation</a></div><div class="ttdeci">VkResult vmaInvalidateAllocation(VmaAllocator allocator, VmaAllocation allocation, VkDeviceSize offset, VkDeviceSize size)</div><div class="ttdoc">Invalidates memory of given allocation.</div></div>
+<div class="ttc" id="avk__mem__alloc_8h_html_ab25b558d75f7378ec944a1522fdcc3c5"><div class="ttname"><a href="vk__mem__alloc_8h.html#ab25b558d75f7378ec944a1522fdcc3c5">vmaInvalidateAllocations</a></div><div class="ttdeci">VkResult vmaInvalidateAllocations(VmaAllocator allocator, uint32_t allocationCount, const VmaAllocation *allocations, const VkDeviceSize *offsets, const VkDeviceSize *sizes)</div><div class="ttdoc">Invalidates memory of given set of allocations.</div></div>
+<div class="ttc" id="avk__mem__alloc_8h_html_ab88db292a17974f911182543fda52d19"><div class="ttname"><a href="vk__mem__alloc_8h.html#ab88db292a17974f911182543fda52d19">vmaGetMemoryProperties</a></div><div class="ttdeci">void vmaGetMemoryProperties(VmaAllocator allocator, const VkPhysicalDeviceMemoryProperties **ppPhysicalDeviceMemoryProperties)</div></div>
+<div class="ttc" id="avk__mem__alloc_8h_html_abb0a8e3b5040d847571cca6c7f9a8074"><div class="ttname"><a href="vk__mem__alloc_8h.html#abb0a8e3b5040d847571cca6c7f9a8074">VmaVulkanFunctions</a></div><div class="ttdeci">struct VmaVulkanFunctions VmaVulkanFunctions</div><div class="ttdoc">Pointers to some Vulkan functions - a subset used by the library.</div></div>
+<div class="ttc" id="avk__mem__alloc_8h_html_abf28077dbf82d0908b8acbe8ee8dd9b8"><div class="ttname"><a href="vk__mem__alloc_8h.html#abf28077dbf82d0908b8acbe8ee8dd9b8">vmaAllocateMemory</a></div><div class="ttdeci">VkResult vmaAllocateMemory(VmaAllocator allocator, const VkMemoryRequirements *pVkMemoryRequirements, const VmaAllocationCreateInfo *pCreateInfo, VmaAllocation *pAllocation, VmaAllocationInfo *pAllocationInfo)</div><div class="ttdoc">General purpose memory allocation.</div></div>
+<div class="ttc" id="avk__mem__alloc_8h_html_ac0f01545b6262f7d4d128fc8f8e5c77b"><div class="ttname"><a href="vk__mem__alloc_8h.html#ac0f01545b6262f7d4d128fc8f8e5c77b">vmaBeginDefragmentationPass</a></div><div class="ttdeci">VkResult vmaBeginDefragmentationPass(VmaAllocator allocator, VmaDefragmentationContext context, VmaDefragmentationPassInfo *pInfo)</div></div>
+<div class="ttc" id="avk__mem__alloc_8h_html_ac3dd00da721875ed99fa8a881922bdfc"><div class="ttname"><a href="vk__mem__alloc_8h.html#ac3dd00da721875ed99fa8a881922bdfc">vmaFlushAllocations</a></div><div class="ttdeci">VkResult vmaFlushAllocations(VmaAllocator allocator, uint32_t allocationCount, const VmaAllocation *allocations, const VkDeviceSize *offsets, const VkDeviceSize *sizes)</div><div class="ttdoc">Flushes memory of given set of allocations.</div></div>
+<div class="ttc" id="avk__mem__alloc_8h_html_ac72ee55598617e8eecca384e746bab51"><div class="ttname"><a href="vk__mem__alloc_8h.html#ac72ee55598617e8eecca384e746bab51">vmaCreateBuffer</a></div><div class="ttdeci">VkResult vmaCreateBuffer(VmaAllocator allocator, const VkBufferCreateInfo *pBufferCreateInfo, const VmaAllocationCreateInfo *pAllocationCreateInfo, VkBuffer *pBuffer, VmaAllocation *pAllocation, VmaAllocationInfo *pAllocationInfo)</div></div>
+<div class="ttc" id="avk__mem__alloc_8h_html_acfe6863e160722c2c1bbcf7573fddc4d"><div class="ttname"><a href="vk__mem__alloc_8h.html#acfe6863e160722c2c1bbcf7573fddc4d">VmaAllocatorCreateFlags</a></div><div class="ttdeci">VkFlags VmaAllocatorCreateFlags</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2346</div></div>
+<div class="ttc" id="avk__mem__alloc_8h_html_ad37e82e492b3de38fc3f4cffd9ad0ae1"><div class="ttname"><a href="vk__mem__alloc_8h.html#ad37e82e492b3de38fc3f4cffd9ad0ae1">vmaAllocateMemoryPages</a></div><div class="ttdeci">VkResult vmaAllocateMemoryPages(VmaAllocator allocator, const VkMemoryRequirements *pVkMemoryRequirements, const VmaAllocationCreateInfo *pCreateInfo, size_t allocationCount, VmaAllocation *pAllocations, VmaAllocationInfo *pAllocationInfo)</div><div class="ttdoc">General purpose memory allocation for multiple allocation objects at once.</div></div>
+<div class="ttc" id="avk__mem__alloc_8h_html_ad535935619c7a549bf837e1bb0068f89"><div class="ttname"><a href="vk__mem__alloc_8h.html#ad535935619c7a549bf837e1bb0068f89">vmaCheckPoolCorruption</a></div><div class="ttdeci">VkResult vmaCheckPoolCorruption(VmaAllocator allocator, VmaPool pool)</div><div class="ttdoc">Checks magic number in margins around all allocations in given memory pool in search for corruptions.</div></div>
+<div class="ttc" id="avk__mem__alloc_8h_html_ad5bd1243512d099706de88168992f069"><div class="ttname"><a href="vk__mem__alloc_8h.html#ad5bd1243512d099706de88168992f069">vmaMapMemory</a></div><div class="ttdeci">VkResult vmaMapMemory(VmaAllocator allocator, VmaAllocation allocation, void **ppData)</div><div class="ttdoc">Maps memory represented by given allocation and returns pointer to it.</div></div>
+<div class="ttc" id="avk__mem__alloc_8h_html_ad6799e8e2b1527abfc84d33bc44aeaf5"><div class="ttname"><a href="vk__mem__alloc_8h.html#ad6799e8e2b1527abfc84d33bc44aeaf5">VmaDefragmentationPassMoveInfo</a></div><div class="ttdeci">struct VmaDefragmentationPassMoveInfo VmaDefragmentationPassMoveInfo</div></div>
 <div class="ttc" id="avk__mem__alloc_8h_html_ad6daeffaa670ce6d11a203a6224c9937"><div class="ttname"><a href="vk__mem__alloc_8h.html#ad6daeffaa670ce6d11a203a6224c9937">VmaDefragmentationInfo2</a></div><div class="ttdeci">struct VmaDefragmentationInfo2 VmaDefragmentationInfo2</div><div class="ttdoc">Parameters for defragmentation.</div></div>
+<div class="ttc" id="avk__mem__alloc_8h_html_ad94034192259c2e34a4d1c5e27810403"><div class="ttname"><a href="vk__mem__alloc_8h.html#ad94034192259c2e34a4d1c5e27810403">VmaDefragmentationStats</a></div><div class="ttdeci">struct VmaDefragmentationStats VmaDefragmentationStats</div><div class="ttdoc">Statistics returned by function vmaDefragment().</div></div>
+<div class="ttc" id="avk__mem__alloc_8h_html_ad9889c10c798b040d59c92f257cae597"><div class="ttname"><a href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597">VmaAllocationCreateFlagBits</a></div><div class="ttdeci">VmaAllocationCreateFlagBits</div><div class="ttdoc">Flags to be passed as VmaAllocationCreateInfo::flags.</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2767</div></div>
+<div class="ttc" id="avk__mem__alloc_8h_html_ad9889c10c798b040d59c92f257cae597a0729e932b7ea170e3a128cad96c5cf6d"><div class="ttname"><a href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a0729e932b7ea170e3a128cad96c5cf6d">VMA_ALLOCATION_CREATE_STRATEGY_MIN_TIME_BIT</a></div><div class="ttdeci">@ VMA_ALLOCATION_CREATE_STRATEGY_MIN_TIME_BIT</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2862</div></div>
+<div class="ttc" id="avk__mem__alloc_8h_html_ad9889c10c798b040d59c92f257cae597a11da372cc3a82931c5e5d6146cd9dd1f"><div class="ttname"><a href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a11da372cc3a82931c5e5d6146cd9dd1f">VMA_ALLOCATION_CREATE_MAPPED_BIT</a></div><div class="ttdeci">@ VMA_ALLOCATION_CREATE_MAPPED_BIT</div><div class="ttdoc">Set this flag to use a memory that will be persistently mapped and retrieve pointer to it.</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2798</div></div>
+<div class="ttc" id="avk__mem__alloc_8h_html_ad9889c10c798b040d59c92f257cae597a2310568c62208af432724305fe29ccea"><div class="ttname"><a href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a2310568c62208af432724305fe29ccea">VMA_ALLOCATION_CREATE_DONT_BIND_BIT</a></div><div class="ttdeci">@ VMA_ALLOCATION_CREATE_DONT_BIND_BIT</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2835</div></div>
+<div class="ttc" id="avk__mem__alloc_8h_html_ad9889c10c798b040d59c92f257cae597a33eb2052674f3ad92386c714a65fb777"><div class="ttname"><a href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a33eb2052674f3ad92386c714a65fb777">VMA_ALLOCATION_CREATE_STRATEGY_FIRST_FIT_BIT</a></div><div class="ttdeci">@ VMA_ALLOCATION_CREATE_STRATEGY_FIRST_FIT_BIT</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2855</div></div>
+<div class="ttc" id="avk__mem__alloc_8h_html_ad9889c10c798b040d59c92f257cae597a3fc311d855c2ff53f1090ef5c722b38f"><div class="ttname"><a href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a3fc311d855c2ff53f1090ef5c722b38f">VMA_ALLOCATION_CREATE_DEDICATED_MEMORY_BIT</a></div><div class="ttdeci">@ VMA_ALLOCATION_CREATE_DEDICATED_MEMORY_BIT</div><div class="ttdoc">Set this flag if the allocation should have its own memory block.</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2774</div></div>
+<div class="ttc" id="avk__mem__alloc_8h_html_ad9889c10c798b040d59c92f257cae597a42ba3a2d2c7117953210b7c3ef8da0df"><div class="ttname"><a href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a42ba3a2d2c7117953210b7c3ef8da0df">VMA_ALLOCATION_CREATE_UPPER_ADDRESS_BIT</a></div><div class="ttdeci">@ VMA_ALLOCATION_CREATE_UPPER_ADDRESS_BIT</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2829</div></div>
+<div class="ttc" id="avk__mem__alloc_8h_html_ad9889c10c798b040d59c92f257cae597a5f436af6c8fe8540573a6d22627a6fd2"><div class="ttname"><a href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a5f436af6c8fe8540573a6d22627a6fd2">VMA_ALLOCATION_CREATE_CAN_BECOME_LOST_BIT</a></div><div class="ttdeci">@ VMA_ALLOCATION_CREATE_CAN_BECOME_LOST_BIT</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2811</div></div>
+<div class="ttc" id="avk__mem__alloc_8h_html_ad9889c10c798b040d59c92f257cae597a621b704103eb3360230c860acf36e706"><div class="ttname"><a href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a621b704103eb3360230c860acf36e706">VMA_ALLOCATION_CREATE_STRATEGY_MIN_FRAGMENTATION_BIT</a></div><div class="ttdeci">@ VMA_ALLOCATION_CREATE_STRATEGY_MIN_FRAGMENTATION_BIT</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2865</div></div>
+<div class="ttc" id="avk__mem__alloc_8h_html_ad9889c10c798b040d59c92f257cae597a68686d0ce9beb0d4d1b9f2b8b1389a7e"><div class="ttname"><a href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a68686d0ce9beb0d4d1b9f2b8b1389a7e">VMA_ALLOCATION_CREATE_CAN_MAKE_OTHER_LOST_BIT</a></div><div class="ttdeci">@ VMA_ALLOCATION_CREATE_CAN_MAKE_OTHER_LOST_BIT</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2818</div></div>
+<div class="ttc" id="avk__mem__alloc_8h_html_ad9889c10c798b040d59c92f257cae597a839826775c62319466441f86496f036d"><div class="ttname"><a href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a839826775c62319466441f86496f036d">VMA_ALLOCATION_CREATE_STRATEGY_BEST_FIT_BIT</a></div><div class="ttdeci">@ VMA_ALLOCATION_CREATE_STRATEGY_BEST_FIT_BIT</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2844</div></div>
+<div class="ttc" id="avk__mem__alloc_8h_html_ad9889c10c798b040d59c92f257cae597a89759603401014eb325eb22a3839f2ff"><div class="ttname"><a href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a89759603401014eb325eb22a3839f2ff">VMA_ALLOCATION_CREATE_NEVER_ALLOCATE_BIT</a></div><div class="ttdeci">@ VMA_ALLOCATION_CREATE_NEVER_ALLOCATE_BIT</div><div class="ttdoc">Set this flag to only try to allocate from existing VkDeviceMemory blocks and never create new such b...</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2785</div></div>
+<div class="ttc" id="avk__mem__alloc_8h_html_ad9889c10c798b040d59c92f257cae597a8af1210cf591784afa026d94998f735d"><div class="ttname"><a href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a8af1210cf591784afa026d94998f735d">VMA_ALLOCATION_CREATE_STRATEGY_MIN_MEMORY_BIT</a></div><div class="ttdeci">@ VMA_ALLOCATION_CREATE_STRATEGY_MIN_MEMORY_BIT</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2859</div></div>
+<div class="ttc" id="avk__mem__alloc_8h_html_ad9889c10c798b040d59c92f257cae597a8e16845d81ae3d27c47106d4770d5c7e"><div class="ttname"><a href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a8e16845d81ae3d27c47106d4770d5c7e">VMA_ALLOCATION_CREATE_STRATEGY_MASK</a></div><div class="ttdeci">@ VMA_ALLOCATION_CREATE_STRATEGY_MASK</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2869</div></div>
+<div class="ttc" id="avk__mem__alloc_8h_html_ad9889c10c798b040d59c92f257cae597aa6f24f821cd6a7c5e4a443f7bf59c520"><div class="ttname"><a href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597aa6f24f821cd6a7c5e4a443f7bf59c520">VMA_ALLOCATION_CREATE_USER_DATA_COPY_STRING_BIT</a></div><div class="ttdeci">@ VMA_ALLOCATION_CREATE_USER_DATA_COPY_STRING_BIT</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2824</div></div>
+<div class="ttc" id="avk__mem__alloc_8h_html_ad9889c10c798b040d59c92f257cae597ab8b1764f3e9022368e440c057783b92d"><div class="ttname"><a href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597ab8b1764f3e9022368e440c057783b92d">VMA_ALLOCATION_CREATE_WITHIN_BUDGET_BIT</a></div><div class="ttdeci">@ VMA_ALLOCATION_CREATE_WITHIN_BUDGET_BIT</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2839</div></div>
+<div class="ttc" id="avk__mem__alloc_8h_html_ad9889c10c798b040d59c92f257cae597ad242a04f802e25fef0b880afe8bb0a62"><div class="ttname"><a href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597ad242a04f802e25fef0b880afe8bb0a62">VMA_ALLOCATION_CREATE_STRATEGY_WORST_FIT_BIT</a></div><div class="ttdeci">@ VMA_ALLOCATION_CREATE_STRATEGY_WORST_FIT_BIT</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2848</div></div>
+<div class="ttc" id="avk__mem__alloc_8h_html_ad9889c10c798b040d59c92f257cae597ae5633ec569f4899cf8f29e7385b2f882"><div class="ttname"><a href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597ae5633ec569f4899cf8f29e7385b2f882">VMA_ALLOCATION_CREATE_FLAG_BITS_MAX_ENUM</a></div><div class="ttdeci">@ VMA_ALLOCATION_CREATE_FLAG_BITS_MAX_ENUM</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2874</div></div>
+<div class="ttc" id="avk__mem__alloc_8h_html_adbae3a0b4ab078024462fc85c37f3b58"><div class="ttname"><a href="vk__mem__alloc_8h.html#adbae3a0b4ab078024462fc85c37f3b58">vmaSetPoolName</a></div><div class="ttdeci">void vmaSetPoolName(VmaAllocator allocator, VmaPool pool, const char *pName)</div><div class="ttdoc">Sets name of a custom pool.</div></div>
+<div class="ttc" id="avk__mem__alloc_8h_html_ade56bf8dc9f5a5eaddf5f119ed525236"><div class="ttname"><a href="vk__mem__alloc_8h.html#ade56bf8dc9f5a5eaddf5f119ed525236">vmaSetCurrentFrameIndex</a></div><div class="ttdeci">void vmaSetCurrentFrameIndex(VmaAllocator allocator, uint32_t frameIndex)</div><div class="ttdoc">Sets index of the current frame.</div></div>
+<div class="ttc" id="avk__mem__alloc_8h_html_ae50d2cb3b4a3bfd4dd40987234e50e7e"><div class="ttname"><a href="vk__mem__alloc_8h.html#ae50d2cb3b4a3bfd4dd40987234e50e7e">vmaDestroyImage</a></div><div class="ttdeci">void vmaDestroyImage(VmaAllocator allocator, VkImage image, VmaAllocation allocation)</div><div class="ttdoc">Destroys Vulkan image and frees allocated memory.</div></div>
+<div class="ttc" id="avk__mem__alloc_8h_html_ae5c9657d9e94756269145b01c05d16f1"><div class="ttname"><a href="vk__mem__alloc_8h.html#ae5c9657d9e94756269145b01c05d16f1">vmaCreateLostAllocation</a></div><div class="ttdeci">void vmaCreateLostAllocation(VmaAllocator allocator, VmaAllocation *pAllocation)</div><div class="ttdoc">Creates new allocation that is in lost state from the beginning.</div></div>
+<div class="ttc" id="avk__mem__alloc_8h_html_ae790ab9ffaf7667fb8f62523e6897888"><div class="ttname"><a href="vk__mem__alloc_8h.html#ae790ab9ffaf7667fb8f62523e6897888">vmaFindMemoryTypeIndexForBufferInfo</a></div><div class="ttdeci">VkResult vmaFindMemoryTypeIndexForBufferInfo(VmaAllocator allocator, const VkBufferCreateInfo *pBufferCreateInfo, const VmaAllocationCreateInfo *pAllocationCreateInfo, uint32_t *pMemoryTypeIndex)</div><div class="ttdoc">Helps to find memoryTypeIndex, given VkBufferCreateInfo and VmaAllocationCreateInfo.</div></div>
+<div class="ttc" id="avk__mem__alloc_8h_html_ae8bf76997b234ef68aad922616df4153"><div class="ttname"><a href="vk__mem__alloc_8h.html#ae8bf76997b234ef68aad922616df4153">vmaGetPoolStats</a></div><div class="ttdeci">void vmaGetPoolStats(VmaAllocator allocator, VmaPool pool, VmaPoolStats *pPoolStats)</div><div class="ttdoc">Retrieves statistics of existing VmaPool object.</div></div>
+<div class="ttc" id="avk__mem__alloc_8h_html_aec0ed24ebea2d0099eed5f801daaefba"><div class="ttname"><a href="vk__mem__alloc_8h.html#aec0ed24ebea2d0099eed5f801daaefba">vmaGetBudget</a></div><div class="ttdeci">void vmaGetBudget(VmaAllocator allocator, VmaBudget *pBudget)</div><div class="ttdoc">Retrieves information about current memory budget for all memory heaps.</div></div>
+<div class="ttc" id="avk__mem__alloc_8h_html_aec5b57e29c97b5d69c6d5654d60df878"><div class="ttname"><a href="vk__mem__alloc_8h.html#aec5b57e29c97b5d69c6d5654d60df878">VmaStatInfo</a></div><div class="ttdeci">struct VmaStatInfo VmaStatInfo</div><div class="ttdoc">Calculated statistics of memory usage in entire allocator.</div></div>
+<div class="ttc" id="avk__mem__alloc_8h_html_aecabf7b6e91ea87d0316fa0a9e014fe0"><div class="ttname"><a href="vk__mem__alloc_8h.html#aecabf7b6e91ea87d0316fa0a9e014fe0">vmaGetPhysicalDeviceProperties</a></div><div class="ttdeci">void vmaGetPhysicalDeviceProperties(VmaAllocator allocator, const VkPhysicalDeviceProperties **ppPhysicalDeviceProperties)</div></div>
+<div class="ttc" id="avk__mem__alloc_8h_html_aef15a94b58fbcb0fe706d5720e84a74a"><div class="ttname"><a href="vk__mem__alloc_8h.html#aef15a94b58fbcb0fe706d5720e84a74a">vmaFindMemoryTypeIndex</a></div><div class="ttdeci">VkResult vmaFindMemoryTypeIndex(VmaAllocator allocator, uint32_t memoryTypeBits, const VmaAllocationCreateInfo *pAllocationCreateInfo, uint32_t *pMemoryTypeIndex)</div><div class="ttdoc">Helps to find memoryTypeIndex, given memoryTypeBits and VmaAllocationCreateInfo.</div></div>
+<div class="ttc" id="avk__mem__alloc_8h_html_af09b4e4eafdbee812e8d73ddf960f030"><div class="ttname"><a href="vk__mem__alloc_8h.html#af09b4e4eafdbee812e8d73ddf960f030">vmaGetPoolName</a></div><div class="ttdeci">void vmaGetPoolName(VmaAllocator allocator, VmaPool pool, const char **ppName)</div><div class="ttdoc">Retrieves name of a custom pool.</div></div>
+<div class="ttc" id="avk__mem__alloc_8h_html_af3929a1a4547c592fc0b0e55ef452828"><div class="ttname"><a href="vk__mem__alloc_8h.html#af3929a1a4547c592fc0b0e55ef452828">VmaRecordFlags</a></div><div class="ttdeci">VkFlags VmaRecordFlags</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2394</div></div>
+<div class="ttc" id="avk__mem__alloc_8h_html_af9147d31ffc11d62fc187bde283ed14f"><div class="ttname"><a href="vk__mem__alloc_8h.html#af9147d31ffc11d62fc187bde283ed14f">vmaSetAllocationUserData</a></div><div class="ttdeci">void vmaSetAllocationUserData(VmaAllocator allocator, VmaAllocation allocation, void *pUserData)</div><div class="ttdoc">Sets pUserData in given allocation to new value.</div></div>
+<div class="ttc" id="avk__mem__alloc_8h_html_afa02231a791b37255720d566a52683e7"><div class="ttname"><a href="vk__mem__alloc_8h.html#afa02231a791b37255720d566a52683e7">vmaGetAllocatorInfo</a></div><div class="ttdeci">void vmaGetAllocatorInfo(VmaAllocator allocator, VmaAllocatorInfo *pAllocatorInfo)</div><div class="ttdoc">Returns information about existing VmaAllocator object - handle to Vulkan device etc.</div></div>
+</div><!-- fragment --></div><!-- contents -->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated by &#160;<a href="http://www.doxygen.org/index.html">
-<img class="footer" src="doxygen.png" alt="doxygen"/>
-</a> 1.8.18
+Generated by&#160;<a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.1
 </small></address>
 </body>
 </html>
diff --git a/third_party/vulkan_memory_allocator/docs/html/vk_amd_device_coherent_memory.html b/third_party/vulkan_memory_allocator/docs/html/vk_amd_device_coherent_memory.html
index 675febc..54d3537 100644
--- a/third_party/vulkan_memory_allocator/docs/html/vk_amd_device_coherent_memory.html
+++ b/third_party/vulkan_memory_allocator/docs/html/vk_amd_device_coherent_memory.html
@@ -3,7 +3,7 @@
 <head>
 <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
 <meta http-equiv="X-UA-Compatible" content="IE=9"/>
-<meta name="generator" content="Doxygen 1.8.18"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
 <meta name="viewport" content="width=device-width, initial-scale=1"/>
 <title>Vulkan Memory Allocator: VK_AMD_device_coherent_memory</title>
 <link href="tabs.css" rel="stylesheet" type="text/css"/>
@@ -29,10 +29,10 @@
 </table>
 </div>
 <!-- end header part -->
-<!-- Generated by Doxygen 1.8.18 -->
+<!-- Generated by Doxygen 1.9.1 -->
 <script type="text/javascript">
 /* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
-var searchBox = new SearchBox("searchBox", "search",false,'Search');
+var searchBox = new SearchBox("searchBox", "search",false,'Search','.html');
 /* @license-end */
 </script>
 <script type="text/javascript" src="menudata.js"></script>
@@ -94,9 +94,7 @@
 </div><!-- PageDoc -->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated by &#160;<a href="http://www.doxygen.org/index.html">
-<img class="footer" src="doxygen.png" alt="doxygen"/>
-</a> 1.8.18
+Generated by&#160;<a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.1
 </small></address>
 </body>
 </html>
diff --git a/third_party/vulkan_memory_allocator/docs/html/vk_khr_dedicated_allocation.html b/third_party/vulkan_memory_allocator/docs/html/vk_khr_dedicated_allocation.html
index cffe4b8..ad8f83d 100644
--- a/third_party/vulkan_memory_allocator/docs/html/vk_khr_dedicated_allocation.html
+++ b/third_party/vulkan_memory_allocator/docs/html/vk_khr_dedicated_allocation.html
@@ -3,7 +3,7 @@
 <head>
 <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
 <meta http-equiv="X-UA-Compatible" content="IE=9"/>
-<meta name="generator" content="Doxygen 1.8.18"/>
+<meta name="generator" content="Doxygen 1.9.1"/>
 <meta name="viewport" content="width=device-width, initial-scale=1"/>
 <title>Vulkan Memory Allocator: VK_KHR_dedicated_allocation</title>
 <link href="tabs.css" rel="stylesheet" type="text/css"/>
@@ -29,10 +29,10 @@
 </table>
 </div>
 <!-- end header part -->
-<!-- Generated by Doxygen 1.8.18 -->
+<!-- Generated by Doxygen 1.9.1 -->
 <script type="text/javascript">
 /* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
-var searchBox = new SearchBox("searchBox", "search",false,'Search');
+var searchBox = new SearchBox("searchBox", "search",false,'Search','.html');
 /* @license-end */
 </script>
 <script type="text/javascript" src="menudata.js"></script>
@@ -78,27 +78,24 @@
 </ul>
 <p>If you enabled these extensions:</p>
 <p>2 . Use <a class="el" href="vk__mem__alloc_8h.html#a4f87c9100d154a65a4ad495f7763cf7cace7da7cc6e71a625dfa763c55a597878" title="Enables usage of VK_KHR_dedicated_allocation extension.">VMA_ALLOCATOR_CREATE_KHR_DEDICATED_ALLOCATION_BIT</a> flag when creating your <a class="el" href="struct_vma_allocator.html" title="Represents main object of this library initialized.">VmaAllocator</a>`to inform the library that you enabled required extensions and you want the library to use them.</p>
-<div class="fragment"><div class="line">allocatorInfo.<a class="code" href="struct_vma_allocator_create_info.html#a392ea2ecbaff93f91a7c49f735ad4346">flags</a> |= <a class="code" href="vk__mem__alloc_8h.html#a4f87c9100d154a65a4ad495f7763cf7cace7da7cc6e71a625dfa763c55a597878">VMA_ALLOCATOR_CREATE_KHR_DEDICATED_ALLOCATION_BIT</a>;</div>
+<div class="fragment"><div class="line">allocatorInfo.flags |= <a class="code" href="vk__mem__alloc_8h.html#a4f87c9100d154a65a4ad495f7763cf7cace7da7cc6e71a625dfa763c55a597878">VMA_ALLOCATOR_CREATE_KHR_DEDICATED_ALLOCATION_BIT</a>;</div>
 <div class="line"> </div>
 <div class="line"><a class="code" href="vk__mem__alloc_8h.html#a200692051ddb34240248234f5f4c17bb">vmaCreateAllocator</a>(&amp;allocatorInfo, &amp;allocator);</div>
+<div class="ttc" id="avk__mem__alloc_8h_html_a200692051ddb34240248234f5f4c17bb"><div class="ttname"><a href="vk__mem__alloc_8h.html#a200692051ddb34240248234f5f4c17bb">vmaCreateAllocator</a></div><div class="ttdeci">VkResult vmaCreateAllocator(const VmaAllocatorCreateInfo *pCreateInfo, VmaAllocator *pAllocator)</div><div class="ttdoc">Creates Allocator object.</div></div>
+<div class="ttc" id="avk__mem__alloc_8h_html_a4f87c9100d154a65a4ad495f7763cf7cace7da7cc6e71a625dfa763c55a597878"><div class="ttname"><a href="vk__mem__alloc_8h.html#a4f87c9100d154a65a4ad495f7763cf7cace7da7cc6e71a625dfa763c55a597878">VMA_ALLOCATOR_CREATE_KHR_DEDICATED_ALLOCATION_BIT</a></div><div class="ttdeci">@ VMA_ALLOCATOR_CREATE_KHR_DEDICATED_ALLOCATION_BIT</div><div class="ttdoc">Enables usage of VK_KHR_dedicated_allocation extension.</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2262</div></div>
 </div><!-- fragment --><p>That's all. The extension will be automatically used whenever you create a buffer using <a class="el" href="vk__mem__alloc_8h.html#ac72ee55598617e8eecca384e746bab51">vmaCreateBuffer()</a> or image using <a class="el" href="vk__mem__alloc_8h.html#a02a94f25679275851a53e82eacbcfc73" title="Function similar to vmaCreateBuffer().">vmaCreateImage()</a>.</p>
 <p>When using the extension together with Vulkan Validation Layer, you will receive warnings like this: </p><pre class="fragment">vkBindBufferMemory(): Binding memory to buffer 0x33 but vkGetBufferMemoryRequirements() has not been called on that buffer.
-</pre><p>It is OK, you should just ignore it. It happens because you use function <code>vkGetBufferMemoryRequirements2KHR()</code> instead of standard <code>vkGetBufferMemoryRequirements()</code>, while the validation layer seems to be unaware of it.</p>
+</pre><p> It is OK, you should just ignore it. It happens because you use function <code>vkGetBufferMemoryRequirements2KHR()</code> instead of standard <code>vkGetBufferMemoryRequirements()</code>, while the validation layer seems to be unaware of it.</p>
 <p>To learn more about this extension, see:</p>
 <ul>
-<li><a href="https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/chap44.html#VK_KHR_dedicated_allocation">VK_KHR_dedicated_allocation in Vulkan specification</a></li>
+<li><a href="https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/chap50.html#VK_KHR_dedicated_allocation">VK_KHR_dedicated_allocation in Vulkan specification</a></li>
 <li><a href="http://asawicki.info/articles/VK_KHR_dedicated_allocation.php5">VK_KHR_dedicated_allocation unofficial manual</a> </li>
 </ul>
 </div></div><!-- contents -->
 </div><!-- PageDoc -->
-<div class="ttc" id="avk__mem__alloc_8h_html_a4f87c9100d154a65a4ad495f7763cf7cace7da7cc6e71a625dfa763c55a597878"><div class="ttname"><a href="vk__mem__alloc_8h.html#a4f87c9100d154a65a4ad495f7763cf7cace7da7cc6e71a625dfa763c55a597878">VMA_ALLOCATOR_CREATE_KHR_DEDICATED_ALLOCATION_BIT</a></div><div class="ttdeci">@ VMA_ALLOCATOR_CREATE_KHR_DEDICATED_ALLOCATION_BIT</div><div class="ttdoc">Enables usage of VK_KHR_dedicated_allocation extension.</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2135</div></div>
-<div class="ttc" id="astruct_vma_allocator_create_info_html_a392ea2ecbaff93f91a7c49f735ad4346"><div class="ttname"><a href="struct_vma_allocator_create_info.html#a392ea2ecbaff93f91a7c49f735ad4346">VmaAllocatorCreateInfo::flags</a></div><div class="ttdeci">VmaAllocatorCreateFlags flags</div><div class="ttdoc">Flags for created allocator. Use VmaAllocatorCreateFlagBits enum.</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2271</div></div>
-<div class="ttc" id="avk__mem__alloc_8h_html_a200692051ddb34240248234f5f4c17bb"><div class="ttname"><a href="vk__mem__alloc_8h.html#a200692051ddb34240248234f5f4c17bb">vmaCreateAllocator</a></div><div class="ttdeci">VkResult vmaCreateAllocator(const VmaAllocatorCreateInfo *pCreateInfo, VmaAllocator *pAllocator)</div><div class="ttdoc">Creates Allocator object.</div></div>
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated by &#160;<a href="http://www.doxygen.org/index.html">
-<img class="footer" src="doxygen.png" alt="doxygen"/>
-</a> 1.8.18
+Generated by&#160;<a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.1
 </small></address>
 </body>
 </html>
diff --git a/third_party/vulkan_memory_allocator/src/vk_mem_alloc.h b/third_party/vulkan_memory_allocator/include/vk_mem_alloc.h
similarity index 95%
rename from third_party/vulkan_memory_allocator/src/vk_mem_alloc.h
rename to third_party/vulkan_memory_allocator/include/vk_mem_alloc.h
index 917e369..c2d1730 100644
--- a/third_party/vulkan_memory_allocator/src/vk_mem_alloc.h
+++ b/third_party/vulkan_memory_allocator/include/vk_mem_alloc.h
@@ -1,5 +1,5 @@
 //
-// Copyright (c) 2017-2020 Advanced Micro Devices, Inc. All rights reserved.
+// Copyright (c) 2017-2021 Advanced Micro Devices, Inc. All rights reserved.
 //
 // Permission is hereby granted, free of charge, to any person obtaining a copy
 // of this software and associated documentation files (the "Software"), to deal
@@ -25,9 +25,9 @@
 
 /** \mainpage Vulkan Memory Allocator
 
-<b>Version 3.0.0-development</b> (2020-03-23)
+<b>Version 3.0.0-development</b> (2021-02-16)
 
-Copyright (c) 2017-2020 Advanced Micro Devices, Inc. All rights reserved. \n
+Copyright (c) 2017-2021 Advanced Micro Devices, Inc. All rights reserved. \n
 License: MIT
 
 Documentation of all members: vk_mem_alloc.h
@@ -53,6 +53,7 @@
   - \subpage staying_within_budget
     - [Querying for budget](@ref staying_within_budget_querying_for_budget)
     - [Controlling memory usage](@ref staying_within_budget_controlling_memory_usage)
+  - \subpage resource_aliasing
   - \subpage custom_memory_pools
     - [Choosing memory type index](@ref custom_memory_pools_MemTypeIndex)
     - [Linear allocation algorithm](@ref linear_algorithm)
@@ -121,7 +122,7 @@
 
 -# Include "vk_mem_alloc.h" file in each CPP file where you want to use the library.
    This includes declarations of all members of the library.
--# In exacly one CPP file define following macro before this include.
+-# In exactly one CPP file define following macro before this include.
    It enables also internal definitions.
 
 \code
@@ -141,6 +142,15 @@
 `WINVER` for Windows, `VK_USE_PLATFORM_WIN32_KHR` for Vulkan), you must define
 them before every `#include` of this library.
 
+You may need to configure the way you import Vulkan functions.
+
+- By default, VMA assumes you you link statically with Vulkan API. If this is not the case,
+  `#define VMA_STATIC_VULKAN_FUNCTIONS 0` before `#include` of the VMA implementation and use another way.
+- You can `#define VMA_DYNAMIC_VULKAN_FUNCTIONS 1` and make sure `vkGetInstanceProcAddr` and `vkGetDeviceProcAddr` globals are defined.
+  All the remaining Vulkan functions will be fetched automatically.
+- Finally, you can provide your own pointers to all Vulkan functions needed by VMA using structure member
+  VmaAllocatorCreateInfo::pVulkanFunctions, if you fetched them in some custom way e.g. using some loader like [Volk](https://github.com/zeux/volk).
+
 
 \section quick_start_initialization Initialization
 
@@ -152,6 +162,7 @@
 
 \code
 VmaAllocatorCreateInfo allocatorInfo = {};
+allocatorInfo.vulkanApiVersion = VK_API_VERSION_1_2;
 allocatorInfo.physicalDevice = physicalDevice;
 allocatorInfo.device = device;
 allocatorInfo.instance = instance;
@@ -160,6 +171,13 @@
 vmaCreateAllocator(&allocatorInfo, &allocator);
 \endcode
 
+Only members `physicalDevice`, `device`, `instance` are required.
+However, you should inform the library which Vulkan version do you use by setting
+VmaAllocatorCreateInfo::vulkanApiVersion and which extensions did you enable
+by setting VmaAllocatorCreateInfo::flags (like #VMA_ALLOCATOR_CREATE_BUFFER_DEVICE_ADDRESS_BIT for VK_KHR_buffer_device_address).
+Otherwise, VMA would use only features of Vulkan 1.0 core with no extensions.
+
+
 \section quick_start_resource_allocation Resource allocation
 
 When you want to create a buffer or image:
@@ -301,6 +319,7 @@
 vmaCreateBuffer(allocator, &bufferInfo, &allocInfo, &buffer, &allocation, nullptr);
 \endcode
 
+
 \section choosing_memory_type_custom_memory_pools Custom memory pools
 
 If you allocate from custom memory pool, all the ways of specifying memory
@@ -421,12 +440,10 @@
   block is migrated by WDDM to system RAM, which degrades performance. It doesn't
   matter if that particular memory block is actually used by the command buffer
   being submitted.
-- On Mac/MoltenVK there is a known bug - [Issue #175](https://github.com/KhronosGroup/MoltenVK/issues/175)
-  which requires unmapping before GPU can see updated texture.
 - Keeping many large memory blocks mapped may impact performance or stability of some debugging tools.
 
 \section memory_mapping_cache_control Cache flush and invalidate
-  
+
 Memory in Vulkan doesn't need to be unmapped before using it on GPU,
 but unless a memory types has `VK_MEMORY_PROPERTY_HOST_COHERENT_BIT` flag set,
 you need to manually **invalidate** cache before reading of mapped pointer
@@ -478,7 +495,7 @@
 
 VkMemoryPropertyFlags memFlags;
 vmaGetMemoryTypeProperties(allocator, allocInfo.memoryType, &memFlags);
-if((memFlags & VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT) == 0)
+if((memFlags & VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT) != 0)
 {
     // Allocation ended up in mappable memory. You can map it and access it directly.
     void* mappedData;
@@ -513,7 +530,7 @@
 VmaAllocationInfo allocInfo;
 vmaCreateBuffer(allocator, &bufCreateInfo, &allocCreateInfo, &buf, &alloc, &allocInfo);
 
-if(allocInfo.pUserData != nullptr)
+if(allocInfo.pMappedData != nullptr)
 {
     // Allocation ended up in mappable memory.
     // It's persistently mapped. You can access it directly.
@@ -599,6 +616,114 @@
 fit within budget.
 
 
+\page resource_aliasing Resource aliasing (overlap)
+
+New explicit graphics APIs (Vulkan and Direct3D 12), thanks to manual memory
+management, give an opportunity to alias (overlap) multiple resources in the
+same region of memory - a feature not available in the old APIs (Direct3D 11, OpenGL).
+It can be useful to save video memory, but it must be used with caution.
+
+For example, if you know the flow of your whole render frame in advance, you
+are going to use some intermediate textures or buffers only during a small range of render passes,
+and you know these ranges don't overlap in time, you can bind these resources to
+the same place in memory, even if they have completely different parameters (width, height, format etc.).
+
+![Resource aliasing (overlap)](../gfx/Aliasing.png)
+
+Such scenario is possible using VMA, but you need to create your images manually.
+Then you need to calculate parameters of an allocation to be made using formula:
+
+- allocation size = max(size of each image)
+- allocation alignment = max(alignment of each image)
+- allocation memoryTypeBits = bitwise AND(memoryTypeBits of each image)
+
+Following example shows two different images bound to the same place in memory,
+allocated to fit largest of them.
+
+\code
+// A 512x512 texture to be sampled.
+VkImageCreateInfo img1CreateInfo = { VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO };
+img1CreateInfo.imageType = VK_IMAGE_TYPE_2D;
+img1CreateInfo.extent.width = 512;
+img1CreateInfo.extent.height = 512;
+img1CreateInfo.extent.depth = 1;
+img1CreateInfo.mipLevels = 10;
+img1CreateInfo.arrayLayers = 1;
+img1CreateInfo.format = VK_FORMAT_R8G8B8A8_SRGB;
+img1CreateInfo.tiling = VK_IMAGE_TILING_OPTIMAL;
+img1CreateInfo.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
+img1CreateInfo.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_SAMPLED_BIT;
+img1CreateInfo.samples = VK_SAMPLE_COUNT_1_BIT;
+
+// A full screen texture to be used as color attachment.
+VkImageCreateInfo img2CreateInfo = { VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO };
+img2CreateInfo.imageType = VK_IMAGE_TYPE_2D;
+img2CreateInfo.extent.width = 1920;
+img2CreateInfo.extent.height = 1080;
+img2CreateInfo.extent.depth = 1;
+img2CreateInfo.mipLevels = 1;
+img2CreateInfo.arrayLayers = 1;
+img2CreateInfo.format = VK_FORMAT_R8G8B8A8_UNORM;
+img2CreateInfo.tiling = VK_IMAGE_TILING_OPTIMAL;
+img2CreateInfo.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
+img2CreateInfo.usage = VK_IMAGE_USAGE_SAMPLED_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
+img2CreateInfo.samples = VK_SAMPLE_COUNT_1_BIT;
+
+VkImage img1;
+res = vkCreateImage(device, &img1CreateInfo, nullptr, &img1);
+VkImage img2;
+res = vkCreateImage(device, &img2CreateInfo, nullptr, &img2);
+
+VkMemoryRequirements img1MemReq;
+vkGetImageMemoryRequirements(device, img1, &img1MemReq);
+VkMemoryRequirements img2MemReq;
+vkGetImageMemoryRequirements(device, img2, &img2MemReq);
+
+VkMemoryRequirements finalMemReq = {};
+finalMemReq.size = std::max(img1MemReq.size, img2MemReq.size);
+finalMemReq.alignment = std::max(img1MemReq.alignment, img2MemReq.alignment);
+finalMemReq.memoryTypeBits = img1MemReq.memoryTypeBits & img2MemReq.memoryTypeBits;
+// Validate if(finalMemReq.memoryTypeBits != 0)
+
+VmaAllocationCreateInfo allocCreateInfo = {};
+allocCreateInfo.usage = VMA_MEMORY_USAGE_GPU_ONLY;
+
+VmaAllocation alloc;
+res = vmaAllocateMemory(allocator, &finalMemReq, &allocCreateInfo, &alloc, nullptr);
+
+res = vmaBindImageMemory(allocator, alloc, img1);
+res = vmaBindImageMemory(allocator, alloc, img2);
+
+// You can use img1, img2 here, but not at the same time!
+
+vmaFreeMemory(allocator, alloc);
+vkDestroyImage(allocator, img2, nullptr);
+vkDestroyImage(allocator, img1, nullptr);
+\endcode
+
+Remember that using resources that alias in memory requires proper synchronization.
+You need to issue a memory barrier to make sure commands that use `img1` and `img2`
+don't overlap on GPU timeline.
+You also need to treat a resource after aliasing as uninitialized - containing garbage data.
+For example, if you use `img1` and then want to use `img2`, you need to issue
+an image memory barrier for `img2` with `oldLayout` = `VK_IMAGE_LAYOUT_UNDEFINED`.
+
+Additional considerations:
+
+- Vulkan also allows to interpret contents of memory between aliasing resources consistently in some cases.
+See chapter 11.8. "Memory Aliasing" of Vulkan specification or `VK_IMAGE_CREATE_ALIAS_BIT` flag.
+- You can create more complex layout where different images and buffers are bound
+at different offsets inside one large allocation. For example, one can imagine
+a big texture used in some render passes, aliasing with a set of many small buffers
+used between in some further passes. To bind a resource at non-zero offset of an allocation,
+use vmaBindBufferMemory2() / vmaBindImageMemory2().
+- Before allocating memory for the resources you want to alias, check `memoryTypeBits`
+returned in memory requirements of each resource to make sure the bits overlap.
+Some GPUs may expose multiple memory types suitable e.g. only for buffers or
+images with `COLOR_ATTACHMENT` usage, so the sets of memory types supported by your
+resources may be disjoint. Aliasing them is not possible in that case.
+
+
 \page custom_memory_pools Custom memory pools
 
 A memory pool contains a number of `VkDeviceMemory` blocks.
@@ -822,7 +947,7 @@
 
 To mitigate this problem, you can use defragmentation feature:
 structure #VmaDefragmentationInfo2, function vmaDefragmentationBegin(), vmaDefragmentationEnd().
-Given set of allocations, 
+Given set of allocations,
 this function can move them to compact used memory, ensure more continuous free
 space and possibly also free some `VkDeviceMemory` blocks.
 
@@ -888,9 +1013,9 @@
         // Create new buffer with same parameters.
         VkBufferCreateInfo bufferInfo = ...;
         vkCreateBuffer(device, &bufferInfo, nullptr, &buffers[i]);
-            
+
         // You can make dummy call to vkGetBufferMemoryRequirements here to silence validation layer warning.
-            
+
         // Bind new buffer to new memory region. Data contained in it is already moved.
         VmaAllocationInfo allocInfo;
         vmaGetAllocationInfo(allocator, allocations[i], &allocInfo);
@@ -966,9 +1091,9 @@
         // Create new buffer with same parameters.
         VkBufferCreateInfo bufferInfo = ...;
         vkCreateBuffer(device, &bufferInfo, nullptr, &buffers[i]);
-            
+
         // You can make dummy call to vkGetBufferMemoryRequirements here to silence validation layer warning.
-            
+
         // Bind new buffer to new memory region. Data contained in it is already moved.
         VmaAllocationInfo allocInfo;
         vmaGetAllocationInfo(allocator, allocations[i], &allocInfo);
@@ -1005,7 +1130,7 @@
 
 Please don't expect memory to be fully compacted after defragmentation.
 Algorithms inside are based on some heuristics that try to maximize number of Vulkan
-memory blocks to make totally empty to release them, as well as to maximimze continuous
+memory blocks to make totally empty to release them, as well as to maximize continuous
 empty space inside remaining blocks, while minimizing the number and size of allocations that
 need to be moved. Some fragmentation may still remain - this is normal.
 
@@ -1362,7 +1487,7 @@
 
 You can also explicitly request checking margins of all allocations in all memory blocks
 that belong to specified memory types by using function vmaCheckCorruption(),
-or in memory blocks that belong to specified custom pool, by using function 
+or in memory blocks that belong to specified custom pool, by using function
 vmaCheckPoolCorruption().
 
 Margin validation (corruption detection) works only for memory types that are
@@ -1546,7 +1671,7 @@
 It is best to measure it and then make the decision.
 Some general recommendations:
 
-- On integrated graphics use (2) or (3) to avoid unnecesary time and memory overhead
+- On integrated graphics use (2) or (3) to avoid unnecessary time and memory overhead
   related to using a second copy and making transfer.
 - For small resources (e.g. constant buffers) use (2).
   Discrete AMD cards have special 256 MiB pool of video memory that is directly mappable.
@@ -1639,7 +1764,7 @@
 When device memory of certain heap runs out of free space, new allocations may
 fail (returning error code) or they may succeed, silently pushing some existing
 memory blocks from GPU VRAM to system RAM (which degrades performance). This
-behavior is implementation-dependant - it depends on GPU vendor and graphics
+behavior is implementation-dependent - it depends on GPU vendor and graphics
 driver.
 
 On AMD cards it can be controlled while creating Vulkan device object by using
@@ -1697,7 +1822,7 @@
 
 To learn more about this extension, see:
 
-- [VK_KHR_dedicated_allocation in Vulkan specification](https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/chap44.html#VK_KHR_dedicated_allocation)
+- [VK_KHR_dedicated_allocation in Vulkan specification](https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/chap50.html#VK_KHR_dedicated_allocation)
 - [VK_KHR_dedicated_allocation unofficial manual](http://asawicki.info/articles/VK_KHR_dedicated_allocation.php5)
 
 
@@ -1839,7 +1964,7 @@
     up together, especially on GPUs with unified memory like Intel.
 - *Non-linear image 0xebc91 is aliased with linear buffer 0xeb8e4 which may indicate a bug.*
   - It happens when you use lost allocations, and a new image or buffer is
-    created in place of an existing object that bacame lost.
+    created in place of an existing object that became lost.
   - It may happen also when you use [defragmentation](@ref defragmentation).
 
 \section general_considerations_allocation_algorithm Allocation algorithm
@@ -1862,7 +1987,7 @@
 
 Features deliberately excluded from the scope of this library:
 
-- Data transfer. Uploading (straming) and downloading data of buffers and images
+- Data transfer. Uploading (streaming) and downloading data of buffers and images
   between CPU and GPU memory and related synchronization is responsibility of the user.
   Defining some "texture" object that would automatically stream its data from a
   staging copy in CPU memory to GPU memory would rather be a feature of another,
@@ -1871,6 +1996,8 @@
   explicit memory type index and dedicated allocation anyway, so they don't
   interact with main features of this library. Such special purpose allocations
   should be made manually, using `vkCreateBuffer()` and `vkAllocateMemory()`.
+- Sub-allocation of parts of one large buffer. Although recommended as a good practice,
+  it is the user's responsibility to implement such logic on top of VMA.
 - Recreation of buffers and images. Although the library has functions for
   buffer and image creation (vmaCreateBuffer(), vmaCreateImage()), you need to
   recreate these objects yourself after defragmentation. That's because the big
@@ -1880,8 +2007,9 @@
   objects in CPU memory (not Vulkan memory), allocation failures are not checked
   and handled gracefully, because that would complicate code significantly and
   is usually not needed in desktop PC applications anyway.
+  Success of an allocation is just checked with an assert.
 - Code free of any compiler warnings. Maintaining the library to compile and
-  work correctly on so many different platforms is hard enough. Being free of 
+  work correctly on so many different platforms is hard enough. Being free of
   any warnings, on any version of any compiler, is simply not feasible.
 - This is a C++ library with C interface.
   Bindings or ports to any other programming languages are welcomed as external projects and
@@ -1889,16 +2017,6 @@
 
 */
 
-#if VMA_RECORDING_ENABLED
-    #include <chrono>
-    #if defined(_WIN32)
-        #include <windows.h>
-    #else
-        #include <sstream>
-        #include <thread>
-    #endif
-#endif
-
 #ifdef __cplusplus
 extern "C" {
 #endif
@@ -1911,7 +2029,7 @@
     #define VMA_RECORDING_ENABLED 0
 #endif
 
-#ifndef NOMINMAX
+#if !defined(NOMINMAX) && defined(VMA_IMPLEMENTATION)
     #define NOMINMAX // For windows.h
 #endif
 
@@ -1994,9 +2112,18 @@
     #endif
 #endif
 
+// Defined to 1 when VK_EXT_memory_priority device extension is defined in Vulkan headers.
+#if !defined(VMA_MEMORY_PRIORITY)
+    #if VK_EXT_memory_priority
+        #define VMA_MEMORY_PRIORITY 1
+    #else
+        #define VMA_MEMORY_PRIORITY 0
+    #endif
+#endif
+
 // Define these macros to decorate all public functions with additional code,
 // before and after returned type, appropriately. This may be useful for
-// exporing the functions when compiling VMA as a separate library. Example:
+// exporting the functions when compiling VMA as a separate library. Example:
 // #define VMA_CALL_PRE  __declspec(dllexport)
 // #define VMA_CALL_POST __cdecl
 #ifndef VMA_CALL_PRE
@@ -2113,7 +2240,7 @@
     The flag works only if VmaAllocatorCreateInfo::vulkanApiVersion `== VK_API_VERSION_1_0`.
     When it's `VK_API_VERSION_1_1`, the flag is ignored because the extension has been promoted to Vulkan 1.1.
 
-    Using this extenion will automatically allocate dedicated blocks of memory for
+    Using this extension will automatically allocate dedicated blocks of memory for
     some buffers and images instead of suballocating place for them out of bigger
     memory blocks (as if you explicitly used #VMA_ALLOCATION_CREATE_DEDICATED_MEMORY_BIT
     flag) when it is recommended by the driver. It may improve performance on some
@@ -2162,7 +2289,7 @@
     VMA_ALLOCATOR_CREATE_EXT_MEMORY_BUDGET_BIT = 0x00000008,
     /**
     Enables usage of VK_AMD_device_coherent_memory extension.
-    
+
     You may set this flag only if you:
 
     - found out that this device extension is supported and enabled it while creating Vulkan device passed as VmaAllocatorCreateInfo::device,
@@ -2172,7 +2299,7 @@
     The extension and accompanying device feature provide access to memory types with
     `VK_MEMORY_PROPERTY_DEVICE_COHERENT_BIT_AMD` and `VK_MEMORY_PROPERTY_DEVICE_UNCACHED_BIT_AMD` flags.
     They are useful mostly for writing breadcrumb markers - a common method for debugging GPU crash/hang/TDR.
-    
+
     When the extension is not enabled, such memory types are still enumerated, but their usage is illegal.
     To protect from this error, if you don't create the allocator with this flag, it will refuse to allocate any memory or create a custom pool in such memory type,
     returning `VK_ERROR_FEATURE_NOT_PRESENT`.
@@ -2187,15 +2314,32 @@
     1. (For Vulkan version < 1.2) Found as available and enabled device extension
     VK_KHR_buffer_device_address.
     This extension is promoted to core Vulkan 1.2.
-    2. Found as available and enabled device feature `VkPhysicalDeviceBufferDeviceAddressFeatures*::bufferDeviceAddress`.
+    2. Found as available and enabled device feature `VkPhysicalDeviceBufferDeviceAddressFeatures::bufferDeviceAddress`.
 
-    When this flag is set, you can create buffers with `VK_BUFFER_USAGE_SHADER_DEVICE_ADDRESS_BIT*` using VMA.
-    The library automatically adds `VK_MEMORY_ALLOCATE_DEVICE_ADDRESS_BIT*` to
+    When this flag is set, you can create buffers with `VK_BUFFER_USAGE_SHADER_DEVICE_ADDRESS_BIT` using VMA.
+    The library automatically adds `VK_MEMORY_ALLOCATE_DEVICE_ADDRESS_BIT` to
     allocated memory blocks wherever it might be needed.
 
     For more information, see documentation chapter \ref enabling_buffer_device_address.
     */
     VMA_ALLOCATOR_CREATE_BUFFER_DEVICE_ADDRESS_BIT = 0x00000020,
+    /**
+    Enables usage of VK_EXT_memory_priority extension in the library.
+
+    You may set this flag only if you found available and enabled this device extension,
+    along with `VkPhysicalDeviceMemoryPriorityFeaturesEXT::memoryPriority == VK_TRUE`,
+    while creating Vulkan device passed as VmaAllocatorCreateInfo::device.
+
+    When this flag is used, VmaAllocationCreateInfo::priority and VmaPoolCreateInfo::priority
+    are used to set priorities of allocated Vulkan memory. Without it, these variables are ignored.
+
+    A priority must be a floating-point value between 0 and 1, indicating the priority of the allocation relative to other memory allocations.
+    Larger values are higher priority. The granularity of the priorities is implementation-dependent.
+    It is automatically passed to every call to `vkAllocateMemory` done by the library using structure `VkMemoryPriorityAllocateInfoEXT`.
+    The value to be used for default priority is 0.5.
+    For more details, see the documentation of the VK_EXT_memory_priority extension.
+    */
+    VMA_ALLOCATOR_CREATE_EXT_MEMORY_PRIORITY_BIT = 0x00000040,
 
     VMA_ALLOCATOR_CREATE_FLAG_BITS_MAX_ENUM = 0x7FFFFFFF
 } VmaAllocatorCreateFlagBits;
@@ -2244,7 +2388,7 @@
     It may degrade performance though.
     */
     VMA_RECORD_FLUSH_AFTER_CALL_BIT = 0x00000001,
-    
+
     VMA_RECORD_FLAG_BITS_MAX_ENUM = 0x7FFFFFFF
 } VmaRecordFlagBits;
 typedef VkFlags VmaRecordFlags;
@@ -2342,11 +2486,11 @@
     */
     VkInstance VMA_NOT_NULL instance;
     /** \brief Optional. The highest version of Vulkan that the application is designed to use.
-    
+
     It must be a value in the format as created by macro `VK_MAKE_VERSION` or a constant like: `VK_API_VERSION_1_1`, `VK_API_VERSION_1_0`.
     The patch version number specified is ignored. Only the major and minor versions are considered.
     It must be less or equal (preferably equal) to value as passed to `vkCreateInstance` as `VkApplicationInfo::apiVersion`.
-    Only versions 1.0 and 1.1 are supported by the current implementation.
+    Only versions 1.0, 1.1, 1.2 are supported by the current implementation.
     Leaving it initialized to zero is equivalent to `VK_API_VERSION_1_0`.
     */
     uint32_t vulkanApiVersion;
@@ -2474,32 +2618,32 @@
     /** \brief Sum size of all `VkDeviceMemory` blocks allocated from particular heap, in bytes.
     */
     VkDeviceSize blockBytes;
-    
+
     /** \brief Sum size of all allocations created in particular heap, in bytes.
-    
+
     Usually less or equal than `blockBytes`.
     Difference `blockBytes - allocationBytes` is the amount of memory allocated but unused -
     available for new allocations or wasted due to fragmentation.
-    
+
     It might be greater than `blockBytes` if there are some allocations in lost state, as they account
     to this value as well.
     */
     VkDeviceSize allocationBytes;
-    
+
     /** \brief Estimated current memory usage of the program, in bytes.
-    
+
     Fetched from system using `VK_EXT_memory_budget` extension if enabled.
-    
+
     It might be different than `blockBytes` (usually higher) due to additional implicit objects
     also occupying the memory, like swapchain, pipelines, descriptor heaps, command buffers, or
     `VkDeviceMemory` blocks allocated outside of this library, if any.
     */
     VkDeviceSize usage;
-    
+
     /** \brief Estimated amount of memory available to the program, in bytes.
-    
+
     Fetched from system using `VK_EXT_memory_budget` extension if enabled.
-    
+
     It might be different (most probably smaller) than `VkMemoryHeap::size[heapIndex]` due to factors
     external to the program, like other programs also consuming system resources.
     Difference `budget - usage` is the amount of additional memory that can probably
@@ -2564,7 +2708,7 @@
     It is roughly equivalent of `D3D12_HEAP_TYPE_DEFAULT`.
 
     Usage:
-    
+
     - Resources written and read by device, e.g. images used as attachments.
     - Resources transferred from host once (immutable) or infrequently and read by
       device multiple times, e.g. textures to be sampled, vertex buffers, uniform
@@ -2609,7 +2753,7 @@
     VMA_MEMORY_USAGE_CPU_COPY = 5,
     /** Lazily allocated GPU memory having `VK_MEMORY_PROPERTY_LAZILY_ALLOCATED_BIT`.
     Exists mostly on mobile platforms. Using it on desktop PC or other GPUs with no such memory type present will fail the allocation.
-    
+
     Usage: Memory for transient attachment images (color attachments, depth attachments etc.), created with `VK_IMAGE_USAGE_TRANSIENT_ATTACHMENT_BIT`.
 
     Allocations with this usage are always created as dedicated - it implies #VMA_ALLOCATION_CREATE_DEDICATED_MEMORY_BIT.
@@ -2622,28 +2766,28 @@
 /// Flags to be passed as VmaAllocationCreateInfo::flags.
 typedef enum VmaAllocationCreateFlagBits {
     /** \brief Set this flag if the allocation should have its own memory block.
-    
+
     Use it for special, big resources, like fullscreen images used as attachments.
-   
+
     You should not use this flag if VmaAllocationCreateInfo::pool is not null.
     */
     VMA_ALLOCATION_CREATE_DEDICATED_MEMORY_BIT = 0x00000001,
 
     /** \brief Set this flag to only try to allocate from existing `VkDeviceMemory` blocks and never create new such block.
-    
+
     If new allocation cannot be placed in any of the existing blocks, allocation
     fails with `VK_ERROR_OUT_OF_DEVICE_MEMORY` error.
-    
+
     You should not use #VMA_ALLOCATION_CREATE_DEDICATED_MEMORY_BIT and
     #VMA_ALLOCATION_CREATE_NEVER_ALLOCATE_BIT at the same time. It makes no sense.
-    
+
     If VmaAllocationCreateInfo::pool is not null, this flag is implied and ignored. */
     VMA_ALLOCATION_CREATE_NEVER_ALLOCATE_BIT = 0x00000002,
     /** \brief Set this flag to use a memory that will be persistently mapped and retrieve pointer to it.
-    
+
     Pointer to mapped memory will be returned through VmaAllocationInfo::pMappedData.
 
-    Is it valid to use this flag for allocation made from memory type that is not
+    It is valid to use this flag for allocation made from memory type that is not
     `HOST_VISIBLE`. This flag is then ignored and memory is not mapped. This is
     useful if you need an allocation that is efficient to use on GPU
     (`DEVICE_LOCAL`) and still want to map it directly if possible on platforms that
@@ -2736,19 +2880,19 @@
     /// Use #VmaAllocationCreateFlagBits enum.
     VmaAllocationCreateFlags flags;
     /** \brief Intended usage of memory.
-    
+
     You can leave #VMA_MEMORY_USAGE_UNKNOWN if you specify memory requirements in other way. \n
     If `pool` is not null, this member is ignored.
     */
     VmaMemoryUsage usage;
     /** \brief Flags that must be set in a Memory Type chosen for an allocation.
-    
+
     Leave 0 if you specify memory requirements in other way. \n
     If `pool` is not null, this member is ignored.*/
     VkMemoryPropertyFlags requiredFlags;
     /** \brief Flags that preferably should be set in a memory type chosen for an allocation.
-    
-    Set to 0 if no additional flags are prefered. \n
+
+    Set to 0 if no additional flags are preferred. \n
     If `pool` is not null, this member is ignored. */
     VkMemoryPropertyFlags preferredFlags;
     /** \brief Bitmask containing one bit set for every memory type acceptable for this allocation.
@@ -2766,12 +2910,19 @@
     */
     VmaPool VMA_NULLABLE pool;
     /** \brief Custom general-purpose pointer that will be stored in #VmaAllocation, can be read as VmaAllocationInfo::pUserData and changed using vmaSetAllocationUserData().
-    
+
     If #VMA_ALLOCATION_CREATE_USER_DATA_COPY_STRING_BIT is used, it must be either
     null or pointer to a null-terminated string. The string will be then copied to
     internal buffer, so it doesn't need to be valid after allocation call.
     */
     void* VMA_NULLABLE pUserData;
+    /** \brief A floating-point value between 0 and 1, indicating the priority of the allocation relative to other memory allocations.
+    
+    It is used only when #VMA_ALLOCATOR_CREATE_EXT_MEMORY_PRIORITY_BIT flag was used during creation of the #VmaAllocator object
+    and this allocation ends up as dedicated or is explicitly forced as dedicated using #VMA_ALLOCATION_CREATE_DEDICATED_MEMORY_BIT.
+    Otherwise, it has the priority of a memory block where it is placed and this variable is ignored.
+    */
+    float priority;
 } VmaAllocationCreateInfo;
 
 /**
@@ -2917,7 +3068,7 @@
     /** \brief Maximum number of blocks that can be allocated in this pool. Optional.
 
     Set to 0 to use default, which is `SIZE_MAX`, which means no limit.
-    
+
     Set to same value as VmaPoolCreateInfo::minBlockCount to have fixed amount of memory allocated
     throughout whole lifetime of this pool.
     */
@@ -2936,6 +3087,12 @@
     become lost, set this value to 0.
     */
     uint32_t frameInUseCount;
+    /** \brief A floating-point value between 0 and 1, indicating the priority of the allocations in this pool relative to other memory allocations.
+
+    It is used only when #VMA_ALLOCATOR_CREATE_EXT_MEMORY_PRIORITY_BIT flag was used during creation of the #VmaAllocator object.
+    Otherwise, this variable is ignored.
+    */
+    float priority;
 } VmaPoolCreateInfo;
 
 /** \brief Describes parameter of existing #VmaPool.
@@ -3071,20 +3228,25 @@
 */
 typedef struct VmaAllocationInfo {
     /** \brief Memory type index that this allocation was allocated from.
-    
+
     It never changes.
     */
     uint32_t memoryType;
     /** \brief Handle to Vulkan memory object.
 
     Same memory object can be shared by multiple allocations.
-    
+
     It can change after call to vmaDefragment() if this allocation is passed to the function, or if allocation is lost.
 
     If the allocation is lost, it is equal to `VK_NULL_HANDLE`.
     */
     VkDeviceMemory VMA_NULLABLE_NON_DISPATCHABLE deviceMemory;
-    /** \brief Offset into deviceMemory object to the beginning of this allocation, in bytes. (deviceMemory, offset) pair is unique to this allocation.
+    /** \brief Offset in `VkDeviceMemory` object to the beginning of this allocation, in bytes. `(deviceMemory, offset)` pair is unique to this allocation.
+
+    You usually don't need to use this offset. If you create a buffer or an image together with the allocation using e.g. function
+    vmaCreateBuffer(), vmaCreateImage(), functions that operate on these resources refer to the beginning of the buffer or image,
+    not entire device memory block. Functions like vmaMapMemory(), vmaBindBufferMemory() also refer to the beginning of the allocation
+    and apply this offset automatically.
 
     It can change after call to vmaDefragment() if this allocation is passed to the function, or if allocation is lost.
     */
@@ -3092,6 +3254,12 @@
     /** \brief Size of this allocation, in bytes.
 
     It never changes, unless allocation is lost.
+
+    \note Allocation size returned in this variable may be greater than the size
+    requested for the resource e.g. as `VkBufferCreateInfo::size`. Whole size of the
+    allocation is accessible for operations on memory e.g. using a pointer after
+    mapping with vmaMapMemory(), but operations on the resource e.g. using
+    `vkCmdCopyBuffer` must be limited to the size of the resource.
     */
     VkDeviceSize size;
     /** \brief Pointer to the beginning of this allocation as mapped data.
@@ -3198,21 +3366,9 @@
     size_t allocationCount,
     const VmaAllocation VMA_NULLABLE * VMA_NOT_NULL VMA_LEN_IF_NOT_NULL(allocationCount) pAllocations);
 
-/** \brief Deprecated.
-
-\deprecated
-In version 2.2.0 it used to try to change allocation's size without moving or reallocating it.
-In current version it returns `VK_SUCCESS` only if `newSize` equals current allocation's size.
-Otherwise returns `VK_ERROR_OUT_OF_POOL_MEMORY`, indicating that allocation's size could not be changed.
-*/
-VMA_CALL_PRE VkResult VMA_CALL_POST vmaResizeAllocation(
-    VmaAllocator VMA_NOT_NULL allocator,
-    VmaAllocation VMA_NOT_NULL allocation,
-    VkDeviceSize newSize);
-
 /** \brief Returns current information about specified allocation and atomically marks it as used in current frame.
 
-Current paramters of given allocation are returned in `pAllocationInfo`.
+Current paramteres of given allocation are returned in `pAllocationInfo`.
 
 This function also atomically "touches" allocation - marks it as used in current frame,
 just like vmaTouchAllocation().
@@ -3286,7 +3442,7 @@
 Maps memory represented by given allocation to make it accessible to CPU code.
 When succeeded, `*ppData` contains pointer to first byte of this memory.
 If the allocation is part of bigger `VkDeviceMemory` block, the pointer is
-correctly offseted to the beginning of region assigned to this particular
+correctly offsetted to the beginning of region assigned to this particular
 allocation.
 
 Mapping is internally reference-counted and synchronized, so despite raw Vulkan
@@ -3511,7 +3667,7 @@
     */
     const VmaPool VMA_NOT_NULL * VMA_NULLABLE VMA_LEN_IF_NOT_NULL(poolCount) pPools;
     /** \brief Maximum total numbers of bytes that can be copied while moving allocations to different places using transfers on CPU side, like `memcpy()`, `memmove()`.
-    
+
     `VK_WHOLE_SIZE` means no limit.
     */
     VkDeviceSize maxCpuBytesToMove;
@@ -3521,7 +3677,7 @@
     */
     uint32_t maxCpuAllocationsToMove;
     /** \brief Maximum total numbers of bytes that can be copied while moving allocations to different places using transfers on GPU side, posted to `commandBuffer`.
-    
+
     `VK_WHOLE_SIZE` means no limit.
     */
     VkDeviceSize maxGpuBytesToMove;
@@ -3562,7 +3718,7 @@
 */
 typedef struct VmaDefragmentationInfo {
     /** \brief Maximum total numbers of bytes that can be copied while moving allocations to different places.
-    
+
     Default is `VK_WHOLE_SIZE`, which means no limit.
     */
     VkDeviceSize maxBytesToMove;
@@ -3706,13 +3862,13 @@
 
 /** \brief Binds buffer to allocation with additional parameters.
 
-@param allocationLocalOffset Additional offset to be added while binding, relative to the beginnig of the `allocation`. Normally it should be 0.
+@param allocationLocalOffset Additional offset to be added while binding, relative to the beginning of the `allocation`. Normally it should be 0.
 @param pNext A chain of structures to be attached to `VkBindBufferMemoryInfoKHR` structure used internally. Normally it should be null.
 
 This function is similar to vmaBindBufferMemory(), but it provides additional parameters.
 
 If `pNext` is not null, #VmaAllocator object must have been created with #VMA_ALLOCATOR_CREATE_KHR_BIND_MEMORY2_BIT flag
-or with VmaAllocatorCreateInfo::vulkanApiVersion `== VK_API_VERSION_1_1`. Otherwise the call fails.
+or with VmaAllocatorCreateInfo::vulkanApiVersion `>= VK_API_VERSION_1_1`. Otherwise the call fails.
 */
 VMA_CALL_PRE VkResult VMA_CALL_POST vmaBindBufferMemory2(
     VmaAllocator VMA_NOT_NULL allocator,
@@ -3740,13 +3896,13 @@
 
 /** \brief Binds image to allocation with additional parameters.
 
-@param allocationLocalOffset Additional offset to be added while binding, relative to the beginnig of the `allocation`. Normally it should be 0.
+@param allocationLocalOffset Additional offset to be added while binding, relative to the beginning of the `allocation`. Normally it should be 0.
 @param pNext A chain of structures to be attached to `VkBindImageMemoryInfoKHR` structure used internally. Normally it should be null.
 
 This function is similar to vmaBindImageMemory(), but it provides additional parameters.
 
 If `pNext` is not null, #VmaAllocator object must have been created with #VMA_ALLOCATOR_CREATE_KHR_BIND_MEMORY2_BIT flag
-or with VmaAllocatorCreateInfo::vulkanApiVersion `== VK_API_VERSION_1_1`. Otherwise the call fails.
+or with VmaAllocatorCreateInfo::vulkanApiVersion `>= VK_API_VERSION_1_1`. Otherwise the call fails.
 */
 VMA_CALL_PRE VkResult VMA_CALL_POST vmaBindImageMemory2(
     VmaAllocator VMA_NOT_NULL allocator,
@@ -3773,13 +3929,17 @@
 no longer need them using either convenience function vmaDestroyBuffer() or
 separately, using `vkDestroyBuffer()` and vmaFreeMemory().
 
-If VMA_ALLOCATOR_CREATE_KHR_DEDICATED_ALLOCATION_BIT flag was used,
+If #VMA_ALLOCATOR_CREATE_KHR_DEDICATED_ALLOCATION_BIT flag was used,
 VK_KHR_dedicated_allocation extension is used internally to query driver whether
 it requires or prefers the new buffer to have dedicated allocation. If yes,
 and if dedicated allocation is possible (VmaAllocationCreateInfo::pool is null
-and VMA_ALLOCATION_CREATE_NEVER_ALLOCATE_BIT is not used), it creates dedicated
+and #VMA_ALLOCATION_CREATE_NEVER_ALLOCATE_BIT is not used), it creates dedicated
 allocation for this buffer, just like when using
-VMA_ALLOCATION_CREATE_DEDICATED_MEMORY_BIT.
+#VMA_ALLOCATION_CREATE_DEDICATED_MEMORY_BIT.
+
+\note This function creates a new `VkBuffer`. Sub-allocation of parts of one large buffer,
+although recommended as a good practice, is out of scope of this library and could be implemented
+by the user as a higher-level logic on top of VMA.
 */
 VMA_CALL_PRE VkResult VMA_CALL_POST vmaCreateBuffer(
     VmaAllocator VMA_NOT_NULL allocator,
@@ -3849,6 +4009,16 @@
 #include <cstring>
 #include <utility>
 
+#if VMA_RECORDING_ENABLED
+    #include <chrono>
+    #if defined(_WIN32)
+        #include <windows.h>
+    #else
+        #include <sstream>
+        #include <thread>
+    #endif
+#endif
+
 /*******************************************************************************
 CONFIGURATION SECTION
 
@@ -3874,6 +4044,10 @@
 */
 #if !defined(VMA_DYNAMIC_VULKAN_FUNCTIONS)
     #define VMA_DYNAMIC_VULKAN_FUNCTIONS 1
+    #if defined(VK_NO_PROTOTYPES)
+        extern PFN_vkGetInstanceProcAddr vkGetInstanceProcAddr;
+        extern PFN_vkGetDeviceProcAddr vkGetDeviceProcAddr;
+    #endif
 #endif
 
 // Define this macro to 1 to make the library use STL containers instead of its own implementation.
@@ -3936,7 +4110,7 @@
 
 #if defined(__ANDROID_API__) && (__ANDROID_API__ < 16)
 #include <cstdlib>
-void *vma_aligned_alloc(size_t alignment, size_t size)
+static void* vma_aligned_alloc(size_t alignment, size_t size)
 {
     // alignment must be >= sizeof(void*)
     if(alignment < sizeof(void*))
@@ -3953,12 +4127,12 @@
 #include <AvailabilityMacros.h>
 #endif
 
-void *vma_aligned_alloc(size_t alignment, size_t size)
+static void* vma_aligned_alloc(size_t alignment, size_t size)
 {
 #if defined(__APPLE__) && (defined(MAC_OS_X_VERSION_10_16) || defined(__IPHONE_14_0))
 #if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_16 || __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_14_0
     // For C++14, usr/include/malloc/_malloc.h declares aligned_alloc()) only
-    // with the MacOSX11.0 SDK in Xcode 12 (which is what adds 
+    // with the MacOSX11.0 SDK in Xcode 12 (which is what adds
     // MAC_OS_X_VERSION_10_16), even though the function is marked
     // availabe for 10.15. That's why the preprocessor checks for 10.16 but
     // the __builtin_available checks for 10.15.
@@ -3979,17 +4153,29 @@
     return VMA_NULL;
 }
 #elif defined(_WIN32)
-void *vma_aligned_alloc(size_t alignment, size_t size)
+static void* vma_aligned_alloc(size_t alignment, size_t size)
 {
     return _aligned_malloc(size, alignment);
 }
 #else
-void *vma_aligned_alloc(size_t alignment, size_t size)
+static void* vma_aligned_alloc(size_t alignment, size_t size)
 {
     return aligned_alloc(alignment, size);
 }
 #endif
 
+#if defined(_WIN32)
+static void vma_aligned_free(void* ptr)
+{
+    _aligned_free(ptr);
+}
+#else
+static void vma_aligned_free(void* VMA_NULLABLE ptr)
+{
+    free(ptr);
+}
+#endif
+
 // If your compiler is not compatible with C++11 and definition of
 // aligned_alloc() function is missing, uncommeting following line may help:
 
@@ -4022,12 +4208,13 @@
    #define VMA_SYSTEM_ALIGNED_MALLOC(size, alignment) vma_aligned_alloc((alignment), (size))
 #endif
 
-#ifndef VMA_SYSTEM_FREE
-   #if defined(_WIN32)
-       #define VMA_SYSTEM_FREE(ptr)   _aligned_free(ptr)
+#ifndef VMA_SYSTEM_ALIGNED_FREE
+   // VMA_SYSTEM_FREE is the old name, but might have been defined by the user
+   #if defined(VMA_SYSTEM_FREE)
+      #define VMA_SYSTEM_ALIGNED_FREE(ptr)     VMA_SYSTEM_FREE(ptr)
    #else
-       #define VMA_SYSTEM_FREE(ptr)   free(ptr)
-   #endif
+      #define VMA_SYSTEM_ALIGNED_FREE(ptr)     vma_aligned_free(ptr)
+    #endif
 #endif
 
 #ifndef VMA_MIN
@@ -4058,15 +4245,15 @@
 
 // Define this macro to 1 to enable functions: vmaBuildStatsString, vmaFreeStatsString.
 #if VMA_STATS_STRING_ENABLED
-    static inline void VmaUint32ToStr(char* outStr, size_t strLen, uint32_t num)
+    static inline void VmaUint32ToStr(char* VMA_NOT_NULL outStr, size_t strLen, uint32_t num)
     {
         snprintf(outStr, strLen, "%u", static_cast<unsigned int>(num));
     }
-    static inline void VmaUint64ToStr(char* outStr, size_t strLen, uint64_t num)
+    static inline void VmaUint64ToStr(char* VMA_NOT_NULL outStr, size_t strLen, uint64_t num)
     {
         snprintf(outStr, strLen, "%llu", static_cast<unsigned long long>(num));
     }
-    static inline void VmaPtrToStr(char* outStr, size_t strLen, const void* ptr)
+    static inline void VmaPtrToStr(char* VMA_NOT_NULL outStr, size_t strLen, const void* ptr)
     {
         snprintf(outStr, strLen, "%p", ptr);
     }
@@ -4208,6 +4395,14 @@
     #define VMA_DEBUG_MIN_BUFFER_IMAGE_GRANULARITY (1)
 #endif
 
+#ifndef VMA_DEBUG_DONT_EXCEED_MAX_MEMORY_ALLOCATION_COUNT
+    /*
+    Set this to 1 to make VMA never exceed VkPhysicalDeviceLimits::maxMemoryAllocationCount
+    and return error instead of leaving up to Vulkan implementation what to do in such cases.
+    */
+    #define VMA_DEBUG_DONT_EXCEED_MAX_MEMORY_ALLOCATION_COUNT (0)
+#endif
+
 #ifndef VMA_SMALL_HEAP_MAX_SIZE
    /// Maximum size of a memory heap in Vulkan to consider it "small".
    #define VMA_SMALL_HEAP_MAX_SIZE (1024ull * 1024 * 1024)
@@ -4259,28 +4454,6 @@
     return c;
 }
 
-// Aligns given value up to nearest multiply of align value. For example: VmaAlignUp(11, 8) = 16.
-// Use types like uint32_t, uint64_t as T.
-template <typename T>
-static inline T VmaAlignUp(T val, T align)
-{
-    return (val + align - 1) / align * align;
-}
-// Aligns given value down to nearest multiply of align value. For example: VmaAlignUp(11, 8) = 8.
-// Use types like uint32_t, uint64_t as T.
-template <typename T>
-static inline T VmaAlignDown(T val, T align)
-{
-    return val / align * align;
-}
-
-// Division with mathematical rounding to nearest number.
-template <typename T>
-static inline T VmaRoundDiv(T x, T y)
-{
-    return (x + (y / (T)2)) / y;
-}
-
 /*
 Returns true if given number is a power of two.
 T must be unsigned integer number or signed integer but always nonnegative.
@@ -4292,6 +4465,30 @@
     return (x & (x-1)) == 0;
 }
 
+// Aligns given value up to nearest multiply of align value. For example: VmaAlignUp(11, 8) = 16.
+// Use types like uint32_t, uint64_t as T.
+template <typename T>
+static inline T VmaAlignUp(T val, T alignment)
+{
+    VMA_HEAVY_ASSERT(VmaIsPow2(alignment));
+    return (val + alignment - 1) & ~(alignment - 1);
+}
+// Aligns given value down to nearest multiply of align value. For example: VmaAlignUp(11, 8) = 8.
+// Use types like uint32_t, uint64_t as T.
+template <typename T>
+static inline T VmaAlignDown(T val, T alignment)
+{
+    VMA_HEAVY_ASSERT(VmaIsPow2(alignment));
+    return val & ~(alignment - 1);
+}
+
+// Division with mathematical rounding to nearest number.
+template <typename T>
+static inline T VmaRoundDiv(T x, T y)
+{
+    return (x + (y / (T)2)) / y;
+}
+
 // Returns smallest power of 2 greater or equal to v.
 static inline uint32_t VmaNextPow2(uint32_t v)
 {
@@ -4451,7 +4648,7 @@
     {
         VMA_SWAP(suballocType1, suballocType2);
     }
-    
+
     switch(suballocType1)
     {
     case VMA_SUBALLOCATION_TYPE_FREE:
@@ -4585,7 +4782,7 @@
     size_t down = 0, up = (end - beg);
     while(down < up)
     {
-        const size_t mid = (down + up) / 2;
+        const size_t mid = down + (up - down) / 2;  // Overflow-safe midpoint calculation
         if(cmp(*(beg+mid), key))
         {
             down = mid + 1;
@@ -4649,10 +4846,11 @@
 
 static void* VmaMalloc(const VkAllocationCallbacks* pAllocationCallbacks, size_t size, size_t alignment)
 {
+    void* result = VMA_NULL;
     if((pAllocationCallbacks != VMA_NULL) &&
         (pAllocationCallbacks->pfnAllocation != VMA_NULL))
     {
-        return (*pAllocationCallbacks->pfnAllocation)(
+        result = (*pAllocationCallbacks->pfnAllocation)(
             pAllocationCallbacks->pUserData,
             size,
             alignment,
@@ -4660,8 +4858,10 @@
     }
     else
     {
-        return VMA_SYSTEM_ALIGNED_MALLOC(size, alignment);
+        result = VMA_SYSTEM_ALIGNED_MALLOC(size, alignment);
     }
+    VMA_ASSERT(result != VMA_NULL && "CPU memory allocation failed.");
+    return result;
 }
 
 static void VmaFree(const VkAllocationCallbacks* pAllocationCallbacks, void* ptr)
@@ -4673,7 +4873,7 @@
     }
     else
     {
-        VMA_SYSTEM_FREE(ptr);
+        VMA_SYSTEM_ALIGNED_FREE(ptr);
     }
 }
 
@@ -4744,7 +4944,7 @@
 public:
     const VkAllocationCallbacks* const m_pCallbacks;
     typedef T value_type;
-    
+
     VmaStlAllocator(const VkAllocationCallbacks* pCallbacks) : m_pCallbacks(pCallbacks) { }
     template<typename U> VmaStlAllocator(const VmaStlAllocator<U>& src) : m_pCallbacks(src.m_pCallbacks) { }
 
@@ -4763,6 +4963,7 @@
     }
 
     VmaStlAllocator& operator=(const VmaStlAllocator& x) = delete;
+    VmaStlAllocator(const VmaStlAllocator&) = default;
 };
 
 #if VMA_USE_STL_VECTOR
@@ -4807,12 +5008,12 @@
         m_Capacity(count)
     {
     }
-    
+
     // This version of the constructor is here for compatibility with pre-C++14 std::vector.
     // value is unused.
     VmaVector(size_t count, const T& value, const AllocatorT& allocator)
         : VmaVector(count, allocator) {}
-    
+
     VmaVector(const VmaVector<T, AllocatorT>& src) :
         m_Allocator(src.m_Allocator),
         m_pArray(src.m_Count ? (T*)VmaAllocateArray<T>(src.m_Allocator.m_pCallbacks, src.m_Count) : VMA_NULL),
@@ -4824,7 +5025,7 @@
             memcpy(m_pArray, src.m_pArray, m_Count * sizeof(T));
         }
     }
-    
+
     ~VmaVector()
     {
         VmaFree(m_Allocator.m_pCallbacks, m_pArray);
@@ -4842,12 +5043,12 @@
         }
         return *this;
     }
-    
+
     bool empty() const { return m_Count == 0; }
     size_t size() const { return m_Count; }
     T* data() { return m_pArray; }
     const T* data() const { return m_pArray; }
-    
+
     T& operator[](size_t index)
     {
         VMA_HEAVY_ASSERT(index < m_Count);
@@ -4883,12 +5084,12 @@
     void reserve(size_t newCapacity, bool freeMemory = false)
     {
         newCapacity = VMA_MAX(newCapacity, m_Count);
-        
+
         if((newCapacity < m_Capacity) && !freeMemory)
         {
             newCapacity = m_Capacity;
         }
-        
+
         if(newCapacity != m_Capacity)
         {
             T* const newArray = newCapacity ? VmaAllocateArray<T>(m_Allocator, newCapacity) : VMA_NULL;
@@ -4902,17 +5103,13 @@
         }
     }
 
-    void resize(size_t newCount, bool freeMemory = false)
+    void resize(size_t newCount)
     {
         size_t newCapacity = m_Capacity;
         if(newCount > m_Capacity)
         {
             newCapacity = VMA_MAX(newCount, VMA_MAX(m_Capacity * 3 / 2, (size_t)8));
         }
-        else if(freeMemory)
-        {
-            newCapacity = newCount;
-        }
 
         if(newCapacity != m_Capacity)
         {
@@ -4930,9 +5127,25 @@
         m_Count = newCount;
     }
 
-    void clear(bool freeMemory = false)
+    void clear()
     {
-        resize(0, freeMemory);
+        resize(0);
+    }
+
+    void shrink_to_fit()
+    {
+        if(m_Capacity > m_Count)
+        {
+            T* newArray = VMA_NULL;
+            if(m_Count > 0)
+            {
+                newArray = VmaAllocateArray<T>(m_Allocator.m_pCallbacks, m_Count);
+                memcpy(newArray, m_pArray, m_Count * sizeof(T));
+            }
+            VmaFree(m_Allocator.m_pCallbacks, m_pArray);
+            m_Capacity = m_Count;
+            m_pArray = newArray;
+        }
     }
 
     void insert(size_t index, const T& src)
@@ -5112,12 +5325,16 @@
         if(newCount > N && m_Count > N)
         {
             // Any direction, staying in m_DynamicArray
-            m_DynamicArray.resize(newCount, freeMemory);
+            m_DynamicArray.resize(newCount);
+            if(freeMemory)
+            {
+                m_DynamicArray.shrink_to_fit();
+            }
         }
         else if(newCount > N && m_Count <= N)
         {
             // Growing, moving from m_StaticArray to m_DynamicArray
-            m_DynamicArray.resize(newCount, freeMemory);
+            m_DynamicArray.resize(newCount);
             if(m_Count > 0)
             {
                 memcpy(m_DynamicArray.data(), m_StaticArray, m_Count * sizeof(T));
@@ -5130,7 +5347,11 @@
             {
                 memcpy(m_StaticArray, m_DynamicArray.data(), newCount * sizeof(T));
             }
-            m_DynamicArray.resize(0, freeMemory);
+            m_DynamicArray.resize(0);
+            if(freeMemory)
+            {
+                m_DynamicArray.shrink_to_fit();
+            }
         }
         else
         {
@@ -5141,7 +5362,11 @@
 
     void clear(bool freeMemory = false)
     {
-        m_DynamicArray.clear(freeMemory);
+        m_DynamicArray.clear();
+        if(freeMemory)
+        {
+            m_DynamicArray.shrink_to_fit();
+        }
         m_Count = 0;
     }
 
@@ -5238,7 +5463,7 @@
         uint32_t Capacity;
         uint32_t FirstFreeIndex;
     };
-    
+
     const VkAllocationCallbacks* m_pAllocationCallbacks;
     const uint32_t m_FirstBlockCapacity;
     VmaVector< ItemBlock, VmaStlAllocator<ItemBlock> > m_ItemBlocks;
@@ -5296,11 +5521,11 @@
     for(size_t i = m_ItemBlocks.size(); i--; )
     {
         ItemBlock& block = m_ItemBlocks[i];
-        
+
         // Casting to union.
         Item* pItemPtr;
         memcpy(&pItemPtr, &ptr, sizeof(pItemPtr));
-        
+
         // Check if pItemPtr is in address range of this block.
         if((pItemPtr >= block.pItems) && (pItemPtr < block.pItems + block.Capacity))
         {
@@ -5377,7 +5602,7 @@
     ItemType* PushFront(const T& value);
     void PopBack();
     void PopFront();
-    
+
     // Item can be null - it means PushBack.
     ItemType* InsertBefore(ItemType* pItem);
     // Item can be null - it means PushFront.
@@ -5687,7 +5912,7 @@
             VMA_HEAVY_ASSERT(m_pList == rhs.m_pList);
             return m_pItem != rhs.m_pItem;
         }
-        
+
     private:
         VmaRawList<T>* m_pList;
         VmaListItem<T>* m_pItem;
@@ -5715,7 +5940,7 @@
             m_pItem(src.m_pItem)
         {
         }
-        
+
         const T& operator*() const
         {
             VMA_HEAVY_ASSERT(m_pItem != VMA_NULL);
@@ -5770,7 +5995,7 @@
             VMA_HEAVY_ASSERT(m_pList == rhs.m_pList);
             return m_pItem != rhs.m_pItem;
         }
-        
+
     private:
         const_iterator(const VmaRawList<T>* pList, const VmaListItem<T>* pItem) :
             m_pList(pList),
@@ -5807,6 +6032,222 @@
 #endif // #if VMA_USE_STL_LIST
 
 ////////////////////////////////////////////////////////////////////////////////
+// class VmaIntrusiveLinkedList
+
+/*
+Expected interface of ItemTypeTraits:
+struct MyItemTypeTraits
+{
+    typedef MyItem ItemType;
+    static ItemType* GetPrev(const ItemType* item) { return item->myPrevPtr; }
+    static ItemType* GetNext(const ItemType* item) { return item->myNextPtr; }
+    static ItemType*& AccessPrev(ItemType* item) { return item->myPrevPtr; }
+    static ItemType*& AccessNext(ItemType* item) { return item->myNextPtr; }
+};
+*/
+template<typename ItemTypeTraits>
+class VmaIntrusiveLinkedList
+{
+public:
+    typedef typename ItemTypeTraits::ItemType ItemType;
+    static ItemType* GetPrev(const ItemType* item) { return ItemTypeTraits::GetPrev(item); }
+    static ItemType* GetNext(const ItemType* item) { return ItemTypeTraits::GetNext(item); }
+    // Movable, not copyable.
+    VmaIntrusiveLinkedList() { }
+    VmaIntrusiveLinkedList(const VmaIntrusiveLinkedList<ItemTypeTraits>& src) = delete;
+    VmaIntrusiveLinkedList(VmaIntrusiveLinkedList<ItemTypeTraits>&& src) :
+        m_Front(src.m_Front), m_Back(src.m_Back), m_Count(src.m_Count)
+    {
+        src.m_Front = src.m_Back = VMA_NULL;
+        src.m_Count = 0;
+    }
+    ~VmaIntrusiveLinkedList()
+    {
+        VMA_HEAVY_ASSERT(IsEmpty());
+    }
+    VmaIntrusiveLinkedList<ItemTypeTraits>& operator=(const VmaIntrusiveLinkedList<ItemTypeTraits>& src) = delete;
+    VmaIntrusiveLinkedList<ItemTypeTraits>& operator=(VmaIntrusiveLinkedList<ItemTypeTraits>&& src)
+    {
+        if(&src != this)
+        {
+            VMA_HEAVY_ASSERT(IsEmpty());
+            m_Front = src.m_Front;
+            m_Back = src.m_Back;
+            m_Count = src.m_Count;
+            src.m_Front = src.m_Back = VMA_NULL;
+            src.m_Count = 0;
+        }
+        return *this;
+    }
+    void RemoveAll()
+    {
+        if(!IsEmpty())
+        {
+            ItemType* item = m_Back;
+            while(item != VMA_NULL)
+            {
+                ItemType* const prevItem = ItemTypeTraits::AccessPrev(item);
+                ItemTypeTraits::AccessPrev(item) = VMA_NULL;
+                ItemTypeTraits::AccessNext(item) = VMA_NULL;
+                item = prevItem;
+            }
+            m_Front = VMA_NULL;
+            m_Back = VMA_NULL;
+            m_Count = 0;
+        }
+    }
+    size_t GetCount() const { return m_Count; }
+    bool IsEmpty() const { return m_Count == 0; }
+    ItemType* Front() { return m_Front; }
+    const ItemType* Front() const { return m_Front; }
+    ItemType* Back() { return m_Back; }
+    const ItemType* Back() const { return m_Back; }
+    void PushBack(ItemType* item)
+    {
+        VMA_HEAVY_ASSERT(ItemTypeTraits::GetPrev(item) == VMA_NULL && ItemTypeTraits::GetNext(item) == VMA_NULL);
+        if(IsEmpty())
+        {
+            m_Front = item;
+            m_Back = item;
+            m_Count = 1;
+        }
+        else
+        {
+            ItemTypeTraits::AccessPrev(item) = m_Back;
+            ItemTypeTraits::AccessNext(m_Back) = item;
+            m_Back = item;
+            ++m_Count;
+        }
+    }
+    void PushFront(ItemType* item)
+    {
+        VMA_HEAVY_ASSERT(ItemTypeTraits::GetPrev(item) == VMA_NULL && ItemTypeTraits::GetNext(item) == VMA_NULL);
+        if(IsEmpty())
+        {
+            m_Front = item;
+            m_Back = item;
+            m_Count = 1;
+        }
+        else
+        {
+            ItemTypeTraits::AccessNext(item) = m_Front;
+            ItemTypeTraits::AccessPrev(m_Front) = item;
+            m_Front = item;
+            ++m_Count;
+        }
+    }
+    ItemType* PopBack()
+    {
+        VMA_HEAVY_ASSERT(m_Count > 0);
+        ItemType* const backItem = m_Back;
+        ItemType* const prevItem = ItemTypeTraits::GetPrev(backItem);
+        if(prevItem != VMA_NULL)
+        {
+            ItemTypeTraits::AccessNext(prevItem) = VMA_NULL;
+        }
+        m_Back = prevItem;
+        --m_Count;
+        ItemTypeTraits::AccessPrev(backItem) = VMA_NULL;
+        ItemTypeTraits::AccessNext(backItem) = VMA_NULL;
+        return backItem;
+    }
+    ItemType* PopFront()
+    {
+        VMA_HEAVY_ASSERT(m_Count > 0);
+        ItemType* const frontItem = m_Front;
+        ItemType* const nextItem = ItemTypeTraits::GetNext(frontItem);
+        if(nextItem != VMA_NULL)
+        {
+            ItemTypeTraits::AccessPrev(nextItem) = VMA_NULL;
+        }
+        m_Front = nextItem;
+        --m_Count;
+        ItemTypeTraits::AccessPrev(frontItem) = VMA_NULL;
+        ItemTypeTraits::AccessNext(frontItem) = VMA_NULL;
+        return frontItem;
+    }
+
+    // MyItem can be null - it means PushBack.
+    void InsertBefore(ItemType* existingItem, ItemType* newItem)
+    {
+        VMA_HEAVY_ASSERT(newItem != VMA_NULL && ItemTypeTraits::GetPrev(newItem) == VMA_NULL && ItemTypeTraits::GetNext(newItem) == VMA_NULL);
+        if(existingItem != VMA_NULL)
+        {
+            ItemType* const prevItem = ItemTypeTraits::GetPrev(existingItem);
+            ItemTypeTraits::AccessPrev(newItem) = prevItem;
+            ItemTypeTraits::AccessNext(newItem) = existingItem;
+            ItemTypeTraits::AccessPrev(existingItem) = newItem;
+            if(prevItem != VMA_NULL)
+            {
+                ItemTypeTraits::AccessNext(prevItem) = newItem;
+            }
+            else
+            {
+                VMA_HEAVY_ASSERT(m_Front == existingItem);
+                m_Front = newItem;
+            }
+            ++m_Count;
+        }
+        else
+            PushBack(newItem);
+    }
+    // MyItem can be null - it means PushFront.
+    void InsertAfter(ItemType* existingItem, ItemType* newItem)
+    {
+        VMA_HEAVY_ASSERT(newItem != VMA_NULL && ItemTypeTraits::GetPrev(newItem) == VMA_NULL && ItemTypeTraits::GetNext(newItem) == VMA_NULL);
+        if(existingItem != VMA_NULL)
+        {
+            ItemType* const nextItem = ItemTypeTraits::GetNext(existingItem);
+            ItemTypeTraits::AccessNext(newItem) = nextItem;
+            ItemTypeTraits::AccessPrev(newItem) = existingItem;
+            ItemTypeTraits::AccessNext(existingItem) = newItem;
+            if(nextItem != VMA_NULL)
+            {
+                ItemTypeTraits::AccessPrev(nextItem) = newItem;
+            }
+            else
+            {
+                VMA_HEAVY_ASSERT(m_Back == existingItem);
+                m_Back = newItem;
+            }
+            ++m_Count;
+        }
+        else
+            return PushFront(newItem);
+    }
+    void Remove(ItemType* item)
+    {
+        VMA_HEAVY_ASSERT(item != VMA_NULL && m_Count > 0);
+        if(ItemTypeTraits::GetPrev(item) != VMA_NULL)
+        {
+            ItemTypeTraits::AccessNext(ItemTypeTraits::AccessPrev(item)) = ItemTypeTraits::GetNext(item);
+        }
+        else
+        {
+            VMA_HEAVY_ASSERT(m_Front == item);
+            m_Front = ItemTypeTraits::GetNext(item);
+        }
+
+        if(ItemTypeTraits::GetNext(item) != VMA_NULL)
+        {
+            ItemTypeTraits::AccessPrev(ItemTypeTraits::AccessNext(item)) = ItemTypeTraits::GetPrev(item);
+        }
+        else
+        {
+            VMA_HEAVY_ASSERT(m_Back == item);
+            m_Back = ItemTypeTraits::GetPrev(item);
+        }
+        ItemTypeTraits::AccessPrev(item) = VMA_NULL;
+        ItemTypeTraits::AccessNext(item) = VMA_NULL;
+        --m_Count;
+    }
+private:
+    ItemType* m_Front = VMA_NULL;
+    ItemType* m_Back = VMA_NULL;
+    size_t m_Count = 0;
+};
+
+////////////////////////////////////////////////////////////////////////////////
 // class VmaMap
 
 // Unused in this version.
@@ -5849,7 +6290,7 @@
     void insert(const PairType& pair);
     iterator find(const KeyT& key);
     void erase(iterator it);
-    
+
 private:
     VmaVector< PairType, VmaStlAllocator<PairType> > m_Vector;
 };
@@ -5998,7 +6439,7 @@
     void ChangeBlockAllocation(
         VmaAllocator hAllocator,
         VmaDeviceMemoryBlock* block,
-        VkDeviceSize offset); 
+        VkDeviceSize offset);
 
     void ChangeOffset(VkDeviceSize newOffset);
 
@@ -6020,6 +6461,8 @@
         m_MapCount = (pMappedData != VMA_NULL) ? MAP_COUNT_FLAG_PERSISTENT_MAP : 0;
         m_DedicatedAllocation.m_hMemory = hMemory;
         m_DedicatedAllocation.m_pMappedData = pMappedData;
+        m_DedicatedAllocation.m_Prev = VMA_NULL;
+        m_DedicatedAllocation.m_Next = VMA_NULL;
     }
 
     ALLOCATION_TYPE GetType() const { return (ALLOCATION_TYPE)m_Type; }
@@ -6041,7 +6484,7 @@
     bool IsPersistentMap() const { return (m_MapCount & MAP_COUNT_FLAG_PERSISTENT_MAP) != 0; }
     void* GetMappedData() const;
     bool CanBecomeLost() const;
-    
+
     uint32_t GetLastUseFrameIndex() const
     {
         return m_LastUseFrameIndex.load();
@@ -6054,7 +6497,7 @@
     - If hAllocation.LastUseFrameIndex + frameInUseCount < allocator.CurrentFrameIndex,
       makes it lost by setting LastUseFrameIndex = VMA_FRAME_INDEX_LOST and returns true.
     - Else, returns false.
-    
+
     If hAllocation is already lost, assert - you should not call it then.
     If hAllocation was not created with CAN_BECOME_LOST_BIT, assert.
     */
@@ -6117,6 +6560,8 @@
     {
         VkDeviceMemory m_hMemory;
         void* m_pMappedData; // Not null means memory is mapped.
+        VmaAllocation_T* m_Prev;
+        VmaAllocation_T* m_Next;
     };
 
     union
@@ -6133,6 +6578,32 @@
 #endif
 
     void FreeUserDataString(VmaAllocator hAllocator);
+
+    friend struct VmaDedicatedAllocationListItemTraits;
+};
+
+struct VmaDedicatedAllocationListItemTraits
+{
+    typedef VmaAllocation_T ItemType;
+    static ItemType* GetPrev(const ItemType* item)
+    {
+        VMA_HEAVY_ASSERT(item->GetType() == VmaAllocation_T::ALLOCATION_TYPE_DEDICATED);
+        return item->m_DedicatedAllocation.m_Prev;
+    }
+    static ItemType* GetNext(const ItemType* item)
+    {
+        VMA_HEAVY_ASSERT(item->GetType() == VmaAllocation_T::ALLOCATION_TYPE_DEDICATED);
+        return item->m_DedicatedAllocation.m_Next;
+    }
+    static ItemType*& AccessPrev(ItemType* item)
+    {
+        VMA_HEAVY_ASSERT(item->GetType() == VmaAllocation_T::ALLOCATION_TYPE_DEDICATED);
+        return item->m_DedicatedAllocation.m_Prev;
+    }
+    static ItemType*& AccessNext(ItemType* item){
+        VMA_HEAVY_ASSERT(item->GetType() == VmaAllocation_T::ALLOCATION_TYPE_DEDICATED);
+        return item->m_DedicatedAllocation.m_Next;
+    }
 };
 
 /*
@@ -6350,7 +6821,7 @@
 
     ////////////////////////////////////////////////////////////////////////////////
     // For defragmentation
-    
+
     bool IsBufferImageGranularityConflictPossible(
         VkDeviceSize bufferImageGranularity,
         VmaSuballocationType& inOutPrevSuballocType) const;
@@ -6561,7 +7032,7 @@
     SuballocationVectorType& AccessSuballocations2nd() { return m_1stVectorIndex ? m_Suballocations0 : m_Suballocations1; }
     const SuballocationVectorType& AccessSuballocations1st() const { return m_1stVectorIndex ? m_Suballocations1 : m_Suballocations0; }
     const SuballocationVectorType& AccessSuballocations2nd() const { return m_1stVectorIndex ? m_Suballocations0 : m_Suballocations1; }
-    
+
     // Number of items in 1st vector with hAllocation = null at the beginning.
     size_t m_1stNullItemsBeginCount;
     // Number of other items in 1st vector with hAllocation = null somewhere in the middle.
@@ -6599,7 +7070,7 @@
 - m_UsableSize is this size aligned down to a power of two.
   All allocations and calculations happen relative to m_UsableSize.
 - GetUnusableSize() is the difference between them.
-  It is repoted as separate, unused range, not available for allocations.
+  It is reported as separate, unused range, not available for allocations.
 
 Node at level 0 has size = m_UsableSize.
 Each next level contains nodes with size 2 times smaller than current level.
@@ -6772,7 +7243,7 @@
         uint32_t algorithm);
     // Always call before destruction.
     void Destroy(VmaAllocator allocator);
-    
+
     VmaPool GetParentPool() const { return m_hParentPool; }
     VkDeviceMemory GetDeviceMemory() const { return m_hMemory; }
     uint32_t GetMemoryTypeIndex() const { return m_MemoryTypeIndex; }
@@ -6820,14 +7291,6 @@
     void* m_pMappedData;
 };
 
-struct VmaPointerLess
-{
-    bool operator()(const void* lhs, const void* rhs) const
-    {
-        return lhs < rhs;
-    }
-};
-
 struct VmaDefragmentationMove
 {
     size_t srcBlockIndex;
@@ -6862,7 +7325,8 @@
         VkDeviceSize bufferImageGranularity,
         uint32_t frameInUseCount,
         bool explicitBlockSize,
-        uint32_t algorithm);
+        uint32_t algorithm,
+        float priority);
     ~VmaBlockVector();
 
     VkResult CreateMinBlocks();
@@ -6945,6 +7409,7 @@
     const uint32_t m_FrameInUseCount;
     const bool m_ExplicitBlockSize;
     const uint32_t m_Algorithm;
+    const float m_Priority;
     VMA_RW_MUTEX m_Mutex;
 
     /* There can be at most one allocation that is completely empty (except when minBlockCount > 0) -
@@ -7029,6 +7494,18 @@
 private:
     uint32_t m_Id;
     char* m_Name;
+    VmaPool_T* m_PrevPool = VMA_NULL;
+    VmaPool_T* m_NextPool = VMA_NULL;
+    friend struct VmaPoolListItemTraits;
+};
+
+struct VmaPoolListItemTraits
+{
+    typedef VmaPool_T ItemType;
+    static ItemType* GetPrev(const ItemType* item) { return item->m_PrevPool; }
+    static ItemType* GetNext(const ItemType* item) { return item->m_NextPool; }
+    static ItemType*& AccessPrev(ItemType* item) { return item->m_PrevPool; }
+    static ItemType*& AccessNext(ItemType* item) { return item->m_NextPool; }
 };
 
 /*
@@ -7317,7 +7794,7 @@
                     }
                 }
             }
-            
+
             if(bestIndex != SIZE_MAX)
             {
                 outBlockInfoIndex = m_FreeSpaces[bestIndex].blockInfoIndex;
@@ -7448,7 +7925,7 @@
     Returns:
     - `VK_SUCCESS` if succeeded and object can be destroyed immediately.
     - `VK_NOT_READY` if succeeded but the object must remain alive until vmaDefragmentationEnd().
-    - Negative value if error occured and object can be destroyed immediately.
+    - Negative value if error occurred and object can be destroyed immediately.
     */
     VkResult Defragment(
         VkDeviceSize maxCpuBytesToMove, uint32_t maxCpuAllocationsToMove,
@@ -7688,13 +8165,14 @@
     bool m_UseExtMemoryBudget;
     bool m_UseAmdDeviceCoherentMemory;
     bool m_UseKhrBufferDeviceAddress;
+    bool m_UseExtMemoryPriority;
     VkDevice m_hDevice;
     VkInstance m_hInstance;
     bool m_AllocationCallbacksSpecified;
     VkAllocationCallbacks m_AllocationCallbacks;
     VmaDeviceMemoryCallbacks m_DeviceMemoryCallbacks;
     VmaAllocationObjectAllocator m_AllocationObjectAllocator;
-    
+
     // Each bit (1 << i) is set if HeapSizeLimit is enabled for that heap, so cannot allocate more than the heap size.
     uint32_t m_HeapSizeLimitMask;
 
@@ -7704,12 +8182,12 @@
     // Default pools.
     VmaBlockVector* m_pBlockVectors[VK_MAX_MEMORY_TYPES];
 
-    // Each vector is sorted by memory (handle value).
-    typedef VmaVector< VmaAllocation, VmaStlAllocator<VmaAllocation> > AllocationVectorType;
-    AllocationVectorType* m_pDedicatedAllocations[VK_MAX_MEMORY_TYPES];
+    typedef VmaIntrusiveLinkedList<VmaDedicatedAllocationListItemTraits> DedicatedAllocationLinkedList;
+    DedicatedAllocationLinkedList m_DedicatedAllocations[VK_MAX_MEMORY_TYPES];
     VMA_RW_MUTEX m_DedicatedAllocationsMutex[VK_MAX_MEMORY_TYPES];
 
     VmaCurrentBudgetData m_Budget;
+    VMA_ATOMIC_UINT32 m_DeviceMemoryCount; // Total number of VkDeviceMemory objects.
 
     VmaAllocator_T(const VmaAllocatorCreateInfo* pCreateInfo);
     VkResult Init(const VmaAllocatorCreateInfo* pCreateInfo);
@@ -7795,10 +8273,6 @@
         size_t allocationCount,
         const VmaAllocation* pAllocations);
 
-    VkResult ResizeAllocation(
-        const VmaAllocation alloc,
-        VkDeviceSize newSize);
-
     void CalculateStats(VmaStats* pStats);
 
     void GetBudget(
@@ -7894,10 +8368,11 @@
     VkPhysicalDevice m_PhysicalDevice;
     VMA_ATOMIC_UINT32 m_CurrentFrameIndex;
     VMA_ATOMIC_UINT32 m_GpuDefragmentationMemoryTypeBits; // UINT32_MAX means uninitialized.
-    
+
     VMA_RW_MUTEX m_PoolsMutex;
-    // Protected by m_PoolsMutex. Sorted by pointer value.
-    VmaVector<VmaPool, VmaStlAllocator<VmaPool> > m_Pools;
+    typedef VmaIntrusiveLinkedList<VmaPoolListItemTraits> PoolList;
+    // Protected by m_PoolsMutex.
+    PoolList m_Pools;
     uint32_t m_NextPoolId;
 
     VmaVulkanFunctions m_VulkanFunctions;
@@ -7958,6 +8433,7 @@
         bool map,
         bool isUserDataString,
         void* pUserData,
+        float priority,
         VkBuffer dedicatedBuffer,
         VkBufferUsageFlags dedicatedBufferUsage,
         VkImage dedicatedImage,
@@ -8115,10 +8591,10 @@
 
     void BeginObject(bool singleLine = false);
     void EndObject();
-    
+
     void BeginArray(bool singleLine = false);
     void EndArray();
-    
+
     void WriteString(const char* pStr);
     void BeginString(const char* pStr = VMA_NULL);
     void ContinueString(const char* pStr);
@@ -8126,7 +8602,7 @@
     void ContinueString(uint64_t n);
     void ContinueString_Pointer(const void* ptr);
     void EndString(const char* pStr = VMA_NULL);
-    
+
     void WriteNumber(uint32_t n);
     void WriteNumber(uint64_t n);
     void WriteBool(bool b);
@@ -8374,7 +8850,7 @@
     if(!m_Stack.empty() && !m_Stack.back().singleLineMode)
     {
         m_SB.AddNewLine();
-        
+
         size_t count = m_Stack.size();
         if(count > 0 && oneLess)
         {
@@ -8788,7 +9264,7 @@
     VmaAllocation hAllocation) const
 {
     json.BeginObject(true);
-        
+
     json.WriteString("Offset");
     json.WriteNumber(offset);
 
@@ -8802,7 +9278,7 @@
     VkDeviceSize size) const
 {
     json.BeginObject(true);
-        
+
     json.WriteString("Offset");
     json.WriteNumber(offset);
 
@@ -8862,7 +9338,7 @@
 bool VmaBlockMetadata_Generic::Validate() const
 {
     VMA_VALIDATE(!m_Suballocations.empty());
-    
+
     // Expected offset of new suballocation as calculated from previous ones.
     VkDeviceSize calculatedOffset = 0;
     // Expected number of free suballocations as calculated from traversing their list.
@@ -8880,7 +9356,7 @@
         ++suballocItem)
     {
         const VmaSuballocation& subAlloc = *suballocItem;
-        
+
         // Actual offset of this suballocation doesn't match expected one.
         VMA_VALIDATE(subAlloc.offset == calculatedOffset);
 
@@ -8923,7 +9399,7 @@
     for(size_t i = 0; i < m_FreeSuballocationsBySize.size(); ++i)
     {
         VmaSuballocationList::iterator suballocItem = m_FreeSuballocationsBySize[i];
-        
+
         // Only free suballocations can be registered in m_FreeSuballocationsBySize.
         VMA_VALIDATE(suballocItem->type == VMA_SUBALLOCATION_TYPE_FREE);
         // They must be sorted by size ascending.
@@ -8932,7 +9408,7 @@
         lastSize = suballocItem->size;
     }
 
-    // Check if totals match calculacted values.
+    // Check if totals match calculated values.
     VMA_VALIDATE(ValidateFreeSuballocationList());
     VMA_VALIDATE(calculatedOffset == GetSize());
     VMA_VALIDATE(calculatedSumFreeSize == m_SumFreeSize);
@@ -8965,7 +9441,7 @@
     const uint32_t rangeCount = (uint32_t)m_Suballocations.size();
     outInfo.allocationCount = rangeCount - m_FreeCount;
     outInfo.unusedRangeCount = m_FreeCount;
-    
+
     outInfo.unusedBytes = m_SumFreeSize;
     outInfo.usedBytes = GetSize() - outInfo.unusedBytes;
 
@@ -9224,7 +9700,7 @@
     VMA_HEAVY_ASSERT(Validate());
     VMA_ASSERT(pAllocationRequest->item != m_Suballocations.end());
     VMA_ASSERT(pAllocationRequest->item->type == VMA_SUBALLOCATION_TYPE_FREE);
-    
+
     return true;
 }
 
@@ -9401,7 +9877,7 @@
     VMA_ASSERT(allocType != VMA_SUBALLOCATION_TYPE_FREE);
     VMA_ASSERT(suballocItem != m_Suballocations.cend());
     VMA_ASSERT(pOffset != VMA_NULL);
-    
+
     *itemsToMakeLostCount = 0;
     *pSumFreeSize = 0;
     *pSumItemSize = 0;
@@ -9434,19 +9910,19 @@
 
         // Start from offset equal to beginning of this suballocation.
         *pOffset = suballocItem->offset;
-    
+
         // Apply VMA_DEBUG_MARGIN at the beginning.
         if(VMA_DEBUG_MARGIN > 0)
         {
             *pOffset += VMA_DEBUG_MARGIN;
         }
-    
+
         // Apply alignment.
         *pOffset = VmaAlignUp(*pOffset, allocAlignment);
 
         // Check previous suballocations for BufferImageGranularity conflicts.
         // Make bigger alignment if necessary.
-        if(bufferImageGranularity > 1)
+        if(bufferImageGranularity > 1 && bufferImageGranularity != allocAlignment)
         {
             bool bufferImageGranularityConflict = false;
             VmaSuballocationList::const_iterator prevSuballocItem = suballocItem;
@@ -9471,14 +9947,14 @@
                 *pOffset = VmaAlignUp(*pOffset, bufferImageGranularity);
             }
         }
-    
+
         // Now that we have final *pOffset, check if we are past suballocItem.
         // If yes, return false - this function should be called for another suballocItem as starting point.
         if(*pOffset >= suballocItem->offset + suballocItem->size)
         {
             return false;
         }
-    
+
         // Calculate padding at the beginning based on current offset.
         const VkDeviceSize paddingBegin = *pOffset - suballocItem->offset;
 
@@ -9530,7 +10006,7 @@
 
         // Check next suballocations for BufferImageGranularity conflicts.
         // If conflict exists, we must mark more allocations lost or fail.
-        if(bufferImageGranularity > 1)
+        if(allocSize % bufferImageGranularity || *pOffset % bufferImageGranularity)
         {
             VmaSuballocationList::const_iterator nextSuballocItem = lastSuballocItem;
             ++nextSuballocItem;
@@ -9577,19 +10053,19 @@
 
         // Start from offset equal to beginning of this suballocation.
         *pOffset = suballoc.offset;
-    
+
         // Apply VMA_DEBUG_MARGIN at the beginning.
         if(VMA_DEBUG_MARGIN > 0)
         {
             *pOffset += VMA_DEBUG_MARGIN;
         }
-    
+
         // Apply alignment.
         *pOffset = VmaAlignUp(*pOffset, allocAlignment);
-    
+
         // Check previous suballocations for BufferImageGranularity conflicts.
         // Make bigger alignment if necessary.
-        if(bufferImageGranularity > 1)
+        if(bufferImageGranularity > 1 && bufferImageGranularity != allocAlignment)
         {
             bool bufferImageGranularityConflict = false;
             VmaSuballocationList::const_iterator prevSuballocItem = suballocItem;
@@ -9614,7 +10090,7 @@
                 *pOffset = VmaAlignUp(*pOffset, bufferImageGranularity);
             }
         }
-    
+
         // Calculate padding at the beginning based on current offset.
         const VkDeviceSize paddingBegin = *pOffset - suballoc.offset;
 
@@ -9629,7 +10105,7 @@
 
         // Check next suballocations for BufferImageGranularity conflicts.
         // If conflict exists, allocation cannot be made here.
-        if(bufferImageGranularity > 1)
+        if(allocSize % bufferImageGranularity || *pOffset % bufferImageGranularity)
         {
             VmaSuballocationList::const_iterator nextSuballocItem = suballocItem;
             ++nextSuballocItem;
@@ -9661,7 +10137,7 @@
 {
     VMA_ASSERT(item != m_Suballocations.end());
     VMA_ASSERT(item->type == VMA_SUBALLOCATION_TYPE_FREE);
-    
+
     VmaSuballocationList::iterator nextItem = item;
     ++nextItem;
     VMA_ASSERT(nextItem != m_Suballocations.end());
@@ -9678,7 +10154,7 @@
     VmaSuballocation& suballoc = *suballocItem;
     suballoc.type = VMA_SUBALLOCATION_TYPE_FREE;
     suballoc.hAllocation = VK_NULL_HANDLE;
-    
+
     // Update totals.
     ++m_FreeCount;
     m_SumFreeSize += suballoc.size;
@@ -9686,7 +10162,7 @@
     // Merge with previous and/or next suballocation if it's also free.
     bool mergeWithNext = false;
     bool mergeWithPrev = false;
-    
+
     VmaSuballocationList::iterator nextItem = suballocItem;
     ++nextItem;
     if((nextItem != m_Suballocations.end()) && (nextItem->type == VMA_SUBALLOCATION_TYPE_FREE))
@@ -9984,7 +10460,7 @@
     {
         return size;
     }
-    
+
     const SuballocationVectorType& suballocations1st = AccessSuballocations1st();
 
     switch(m_2ndVectorMode)
@@ -9992,7 +10468,7 @@
     case SECOND_VECTOR_EMPTY:
         /*
         Available space is after end of 1st, as well as before beginning of 1st (which
-        whould make it a ring buffer).
+        would make it a ring buffer).
         */
         {
             const size_t suballocations1stCount = suballocations1st.size();
@@ -10071,7 +10547,7 @@
             if(nextAlloc2ndIndex < suballoc2ndCount)
             {
                 const VmaSuballocation& suballoc = suballocations2nd[nextAlloc2ndIndex];
-            
+
                 // 1. Process free space before this allocation.
                 if(lastOffset < suballoc.offset)
                 {
@@ -10082,13 +10558,13 @@
                     outInfo.unusedRangeSizeMin = VMA_MIN(outInfo.unusedRangeSizeMin, unusedRangeSize);
                     outInfo.unusedRangeSizeMax = VMA_MIN(outInfo.unusedRangeSizeMax, unusedRangeSize);
                 }
-            
+
                 // 2. Process this allocation.
                 // There is allocation with suballoc.offset, suballoc.size.
                 outInfo.usedBytes += suballoc.size;
                 outInfo.allocationSizeMin = VMA_MIN(outInfo.allocationSizeMin, suballoc.size);
                 outInfo.allocationSizeMax = VMA_MIN(outInfo.allocationSizeMax, suballoc.size);
-            
+
                 // 3. Prepare for next iteration.
                 lastOffset = suballoc.offset + suballoc.size;
                 ++nextAlloc2ndIndex;
@@ -10128,7 +10604,7 @@
         if(nextAlloc1stIndex < suballoc1stCount)
         {
             const VmaSuballocation& suballoc = suballocations1st[nextAlloc1stIndex];
-            
+
             // 1. Process free space before this allocation.
             if(lastOffset < suballoc.offset)
             {
@@ -10139,13 +10615,13 @@
                 outInfo.unusedRangeSizeMin = VMA_MIN(outInfo.unusedRangeSizeMin, unusedRangeSize);
                 outInfo.unusedRangeSizeMax = VMA_MIN(outInfo.unusedRangeSizeMax, unusedRangeSize);
             }
-            
+
             // 2. Process this allocation.
             // There is allocation with suballoc.offset, suballoc.size.
             outInfo.usedBytes += suballoc.size;
             outInfo.allocationSizeMin = VMA_MIN(outInfo.allocationSizeMin, suballoc.size);
             outInfo.allocationSizeMax = VMA_MIN(outInfo.allocationSizeMax, suballoc.size);
-            
+
             // 3. Prepare for next iteration.
             lastOffset = suballoc.offset + suballoc.size;
             ++nextAlloc1stIndex;
@@ -10184,7 +10660,7 @@
             if(nextAlloc2ndIndex != SIZE_MAX)
             {
                 const VmaSuballocation& suballoc = suballocations2nd[nextAlloc2ndIndex];
-            
+
                 // 1. Process free space before this allocation.
                 if(lastOffset < suballoc.offset)
                 {
@@ -10195,13 +10671,13 @@
                     outInfo.unusedRangeSizeMin = VMA_MIN(outInfo.unusedRangeSizeMin, unusedRangeSize);
                     outInfo.unusedRangeSizeMax = VMA_MIN(outInfo.unusedRangeSizeMax, unusedRangeSize);
                 }
-            
+
                 // 2. Process this allocation.
                 // There is allocation with suballoc.offset, suballoc.size.
                 outInfo.usedBytes += suballoc.size;
                 outInfo.allocationSizeMin = VMA_MIN(outInfo.allocationSizeMin, suballoc.size);
                 outInfo.allocationSizeMax = VMA_MIN(outInfo.allocationSizeMax, suballoc.size);
-            
+
                 // 3. Prepare for next iteration.
                 lastOffset = suballoc.offset + suballoc.size;
                 --nextAlloc2ndIndex;
@@ -10257,7 +10733,7 @@
             if(nextAlloc2ndIndex < suballoc2ndCount)
             {
                 const VmaSuballocation& suballoc = suballocations2nd[nextAlloc2ndIndex];
-            
+
                 // 1. Process free space before this allocation.
                 if(lastOffset < suballoc.offset)
                 {
@@ -10267,11 +10743,11 @@
                     ++inoutStats.unusedRangeCount;
                     inoutStats.unusedRangeSizeMax = VMA_MAX(inoutStats.unusedRangeSizeMax, unusedRangeSize);
                 }
-            
+
                 // 2. Process this allocation.
                 // There is allocation with suballoc.offset, suballoc.size.
                 ++inoutStats.allocationCount;
-            
+
                 // 3. Prepare for next iteration.
                 lastOffset = suballoc.offset + suballoc.size;
                 ++nextAlloc2ndIndex;
@@ -10310,7 +10786,7 @@
         if(nextAlloc1stIndex < suballoc1stCount)
         {
             const VmaSuballocation& suballoc = suballocations1st[nextAlloc1stIndex];
-            
+
             // 1. Process free space before this allocation.
             if(lastOffset < suballoc.offset)
             {
@@ -10320,11 +10796,11 @@
                 ++inoutStats.unusedRangeCount;
                 inoutStats.unusedRangeSizeMax = VMA_MAX(inoutStats.unusedRangeSizeMax, unusedRangeSize);
             }
-            
+
             // 2. Process this allocation.
             // There is allocation with suballoc.offset, suballoc.size.
             ++inoutStats.allocationCount;
-            
+
             // 3. Prepare for next iteration.
             lastOffset = suballoc.offset + suballoc.size;
             ++nextAlloc1stIndex;
@@ -10362,7 +10838,7 @@
             if(nextAlloc2ndIndex != SIZE_MAX)
             {
                 const VmaSuballocation& suballoc = suballocations2nd[nextAlloc2ndIndex];
-            
+
                 // 1. Process free space before this allocation.
                 if(lastOffset < suballoc.offset)
                 {
@@ -10372,11 +10848,11 @@
                     ++inoutStats.unusedRangeCount;
                     inoutStats.unusedRangeSizeMax = VMA_MAX(inoutStats.unusedRangeSizeMax, unusedRangeSize);
                 }
-            
+
                 // 2. Process this allocation.
                 // There is allocation with suballoc.offset, suballoc.size.
                 ++inoutStats.allocationCount;
-            
+
                 // 3. Prepare for next iteration.
                 lastOffset = suballoc.offset + suballoc.size;
                 --nextAlloc2ndIndex;
@@ -10434,19 +10910,19 @@
             if(nextAlloc2ndIndex < suballoc2ndCount)
             {
                 const VmaSuballocation& suballoc = suballocations2nd[nextAlloc2ndIndex];
-            
+
                 // 1. Process free space before this allocation.
                 if(lastOffset < suballoc.offset)
                 {
                     // There is free space from lastOffset to suballoc.offset.
                     ++unusedRangeCount;
                 }
-            
+
                 // 2. Process this allocation.
                 // There is allocation with suballoc.offset, suballoc.size.
                 ++alloc2ndCount;
                 usedBytes += suballoc.size;
-            
+
                 // 3. Prepare for next iteration.
                 lastOffset = suballoc.offset + suballoc.size;
                 ++nextAlloc2ndIndex;
@@ -10483,19 +10959,19 @@
         if(nextAlloc1stIndex < suballoc1stCount)
         {
             const VmaSuballocation& suballoc = suballocations1st[nextAlloc1stIndex];
-            
+
             // 1. Process free space before this allocation.
             if(lastOffset < suballoc.offset)
             {
                 // There is free space from lastOffset to suballoc.offset.
                 ++unusedRangeCount;
             }
-            
+
             // 2. Process this allocation.
             // There is allocation with suballoc.offset, suballoc.size.
             ++alloc1stCount;
             usedBytes += suballoc.size;
-            
+
             // 3. Prepare for next iteration.
             lastOffset = suballoc.offset + suballoc.size;
             ++nextAlloc1stIndex;
@@ -10530,19 +11006,19 @@
             if(nextAlloc2ndIndex != SIZE_MAX)
             {
                 const VmaSuballocation& suballoc = suballocations2nd[nextAlloc2ndIndex];
-            
+
                 // 1. Process free space before this allocation.
                 if(lastOffset < suballoc.offset)
                 {
                     // There is free space from lastOffset to suballoc.offset.
                     ++unusedRangeCount;
                 }
-            
+
                 // 2. Process this allocation.
                 // There is allocation with suballoc.offset, suballoc.size.
                 ++alloc2ndCount;
                 usedBytes += suballoc.size;
-            
+
                 // 3. Prepare for next iteration.
                 lastOffset = suballoc.offset + suballoc.size;
                 --nextAlloc2ndIndex;
@@ -10585,7 +11061,7 @@
             if(nextAlloc2ndIndex < suballoc2ndCount)
             {
                 const VmaSuballocation& suballoc = suballocations2nd[nextAlloc2ndIndex];
-            
+
                 // 1. Process free space before this allocation.
                 if(lastOffset < suballoc.offset)
                 {
@@ -10593,11 +11069,11 @@
                     const VkDeviceSize unusedRangeSize = suballoc.offset - lastOffset;
                     PrintDetailedMap_UnusedRange(json, lastOffset, unusedRangeSize);
                 }
-            
+
                 // 2. Process this allocation.
                 // There is allocation with suballoc.offset, suballoc.size.
                 PrintDetailedMap_Allocation(json, suballoc.offset, suballoc.hAllocation);
-            
+
                 // 3. Prepare for next iteration.
                 lastOffset = suballoc.offset + suballoc.size;
                 ++nextAlloc2ndIndex;
@@ -10632,7 +11108,7 @@
         if(nextAlloc1stIndex < suballoc1stCount)
         {
             const VmaSuballocation& suballoc = suballocations1st[nextAlloc1stIndex];
-            
+
             // 1. Process free space before this allocation.
             if(lastOffset < suballoc.offset)
             {
@@ -10640,11 +11116,11 @@
                 const VkDeviceSize unusedRangeSize = suballoc.offset - lastOffset;
                 PrintDetailedMap_UnusedRange(json, lastOffset, unusedRangeSize);
             }
-            
+
             // 2. Process this allocation.
             // There is allocation with suballoc.offset, suballoc.size.
             PrintDetailedMap_Allocation(json, suballoc.offset, suballoc.hAllocation);
-            
+
             // 3. Prepare for next iteration.
             lastOffset = suballoc.offset + suballoc.size;
             ++nextAlloc1stIndex;
@@ -10680,7 +11156,7 @@
             if(nextAlloc2ndIndex != SIZE_MAX)
             {
                 const VmaSuballocation& suballoc = suballocations2nd[nextAlloc2ndIndex];
-            
+
                 // 1. Process free space before this allocation.
                 if(lastOffset < suballoc.offset)
                 {
@@ -10688,11 +11164,11 @@
                     const VkDeviceSize unusedRangeSize = suballoc.offset - lastOffset;
                     PrintDetailedMap_UnusedRange(json, lastOffset, unusedRangeSize);
                 }
-            
+
                 // 2. Process this allocation.
                 // There is allocation with suballoc.offset, suballoc.size.
                 PrintDetailedMap_Allocation(json, suballoc.offset, suballoc.hAllocation);
-            
+
                 // 3. Prepare for next iteration.
                 lastOffset = suballoc.offset + suballoc.size;
                 --nextAlloc2ndIndex;
@@ -10797,7 +11273,7 @@
 
     // Check next suballocations from 2nd for BufferImageGranularity conflicts.
     // Make bigger alignment if necessary.
-    if(bufferImageGranularity > 1 && !suballocations2nd.empty())
+    if(bufferImageGranularity > 1 && bufferImageGranularity != allocAlignment && !suballocations2nd.empty())
     {
         bool bufferImageGranularityConflict = false;
         for(size_t nextSuballocIndex = suballocations2nd.size(); nextSuballocIndex--; )
@@ -10902,7 +11378,7 @@
 
         // Check previous suballocations for BufferImageGranularity conflicts.
         // Make bigger alignment if necessary.
-        if(bufferImageGranularity > 1 && !suballocations1st.empty())
+        if(bufferImageGranularity > 1 && bufferImageGranularity != allocAlignment && !suballocations1st.empty())
         {
             bool bufferImageGranularityConflict = false;
             for(size_t prevSuballocIndex = suballocations1st.size(); prevSuballocIndex--; )
@@ -10934,7 +11410,7 @@
         {
             // Check next suballocations for BufferImageGranularity conflicts.
             // If conflict exists, allocation cannot be made here.
-            if(bufferImageGranularity > 1 && m_2ndVectorMode == SECOND_VECTOR_DOUBLE_STACK)
+            if((allocSize % bufferImageGranularity || resultOffset % bufferImageGranularity) && m_2ndVectorMode == SECOND_VECTOR_DOUBLE_STACK)
             {
                 for(size_t nextSuballocIndex = suballocations2nd.size(); nextSuballocIndex--; )
                 {
@@ -10992,7 +11468,7 @@
 
         // Check previous suballocations for BufferImageGranularity conflicts.
         // Make bigger alignment if necessary.
-        if(bufferImageGranularity > 1 && !suballocations2nd.empty())
+        if(bufferImageGranularity > 1 && bufferImageGranularity != allocAlignment && !suballocations2nd.empty())
         {
             bool bufferImageGranularityConflict = false;
             for(size_t prevSuballocIndex = suballocations2nd.size(); prevSuballocIndex--; )
@@ -11050,7 +11526,7 @@
 
             // Check next suballocations for BufferImageGranularity conflicts.
             // If conflict exists, we must mark more allocations lost or fail.
-            if(bufferImageGranularity > 1)
+            if(allocSize % bufferImageGranularity || resultOffset % bufferImageGranularity)
             {
                 while(index1st < suballocations1st.size())
                 {
@@ -11096,7 +11572,7 @@
         {
             // Check next suballocations for BufferImageGranularity conflicts.
             // If conflict exists, allocation cannot be made here.
-            if(bufferImageGranularity > 1)
+            if(allocSize % bufferImageGranularity || resultOffset % bufferImageGranularity)
             {
                 for(size_t nextSuballocIndex = index1st;
                     nextSuballocIndex < suballocations1st.size();
@@ -11144,7 +11620,7 @@
     }
 
     VMA_ASSERT(m_2ndVectorMode == SECOND_VECTOR_EMPTY || m_2ndVectorMode == SECOND_VECTOR_RING_BUFFER);
-    
+
     // We always start from 1st.
     SuballocationVectorType* suballocations = &AccessSuballocations1st();
     size_t index = m_1stNullItemsBeginCount;
@@ -11192,15 +11668,15 @@
     }
 
     CleanupAfterFree();
-    //VMA_HEAVY_ASSERT(Validate()); // Already called by ClanupAfterFree().
-    
+    //VMA_HEAVY_ASSERT(Validate()); // Already called by CleanupAfterFree().
+
     return true;
 }
 
 uint32_t VmaBlockMetadata_Linear::MakeAllocationsLost(uint32_t currentFrameIndex, uint32_t frameInUseCount)
 {
     uint32_t lostAllocationCount = 0;
-    
+
     SuballocationVectorType& suballocations1st = AccessSuballocations1st();
     for(size_t i = m_1stNullItemsBeginCount, count = suballocations1st.size(); i < count; ++i)
     {
@@ -11624,7 +12100,7 @@
             node = node->free.next)
         {
             VMA_VALIDATE(node->type == Node::TYPE_FREE);
-            
+
             if(node->free.next == VMA_NULL)
             {
                 VMA_VALIDATE(m_FreeList[level].back == node);
@@ -11810,7 +12286,7 @@
 
     const uint32_t targetLevel = AllocSizeToLevel(allocSize);
     uint32_t currLevel = (uint32_t)(uintptr_t)request.customData;
-    
+
     Node* currNode = m_FreeList[currLevel].front;
     VMA_ASSERT(currNode != VMA_NULL && currNode->type == Node::TYPE_FREE);
     while(currNode->offset != request.offset)
@@ -11818,14 +12294,14 @@
         currNode = currNode->free.next;
         VMA_ASSERT(currNode != VMA_NULL && currNode->type == Node::TYPE_FREE);
     }
-    
+
     // Go down, splitting free nodes.
     while(currLevel < targetLevel)
     {
         // currNode is already first free node at currLevel.
         // Remove it from list of free nodes at this currLevel.
         RemoveFromFreeList(currLevel, currNode);
-         
+
         const uint32_t childrenLevel = currLevel + 1;
 
         // Create two free sub-nodes.
@@ -11987,7 +12463,7 @@
         vma_delete(GetAllocationCallbacks(), node->buddy);
         vma_delete(GetAllocationCallbacks(), node);
         parent->type = Node::TYPE_FREE;
-        
+
         node = parent;
         --level;
         //m_SumFreeSize += LevelToNodeSize(level) % 2; // Useful only when level node sizes can be non power of 2.
@@ -12101,7 +12577,7 @@
         PrintDetailedMap_UnusedRange(json, node->offset, levelNodeSize);
         break;
     case Node::TYPE_ALLOCATION:
-        {   
+        {
             PrintDetailedMap_Allocation(json, node->offset, node->allocation.alloc);
             const VkDeviceSize allocSize = node->allocation.alloc->GetSize();
             if(allocSize < levelNodeSize)
@@ -12165,6 +12641,7 @@
         break;
     default:
         VMA_ASSERT(0);
+        // Fall-through.
     case 0:
         m_pMetadata = vma_new(hAllocator, VmaBlockMetadata_Generic)(hAllocator);
     }
@@ -12189,7 +12666,7 @@
 {
     VMA_VALIDATE((m_hMemory != VK_NULL_HANDLE) &&
         (m_pMetadata->GetSize() != 0));
-    
+
     return m_pMetadata->Validate();
 }
 
@@ -12394,7 +12871,8 @@
         (createInfo.flags & VMA_POOL_CREATE_IGNORE_BUFFER_IMAGE_GRANULARITY_BIT) != 0 ? 1 : hAllocator->GetBufferImageGranularity(),
         createInfo.frameInUseCount,
         createInfo.blockSize != 0, // explicitBlockSize
-        createInfo.flags & VMA_POOL_CREATE_ALGORITHM_MASK), // algorithm
+        createInfo.flags & VMA_POOL_CREATE_ALGORITHM_MASK,
+        createInfo.priority), // algorithm
     m_Id(0),
     m_Name(VMA_NULL)
 {
@@ -12402,13 +12880,14 @@
 
 VmaPool_T::~VmaPool_T()
 {
+    VMA_ASSERT(m_PrevPool == VMA_NULL && m_NextPool == VMA_NULL);
 }
 
 void VmaPool_T::SetName(const char* pName)
 {
     const VkAllocationCallbacks* allocs = m_BlockVector.GetAllocator()->GetAllocationCallbacks();
     VmaFreeString(allocs, m_Name);
-    
+
     if(pName != VMA_NULL)
     {
         m_Name = VmaCreateStringCopy(allocs, pName);
@@ -12433,7 +12912,8 @@
     VkDeviceSize bufferImageGranularity,
     uint32_t frameInUseCount,
     bool explicitBlockSize,
-    uint32_t algorithm) :
+    uint32_t algorithm,
+    float priority) :
     m_hAllocator(hAllocator),
     m_hParentPool(hParentPool),
     m_MemoryTypeIndex(memoryTypeIndex),
@@ -12444,6 +12924,7 @@
     m_FrameInUseCount(frameInUseCount),
     m_ExplicitBlockSize(explicitBlockSize),
     m_Algorithm(algorithm),
+    m_Priority(priority),
     m_HasEmptyBlock(false),
     m_Blocks(VmaStlAllocator<VmaDeviceMemoryBlock*>(hAllocator->GetAllocationCallbacks())),
     m_NextBlockId(0)
@@ -12550,9 +13031,13 @@
     if(res != VK_SUCCESS)
     {
         // Free all already created allocations.
+        const uint32_t heapIndex = m_hAllocator->MemoryTypeIndexToHeapIndex(m_MemoryTypeIndex);
         while(allocIndex--)
         {
-            Free(pAllocations[allocIndex]);
+            VmaAllocation_T* const alloc = pAllocations[allocIndex];
+            const VkDeviceSize allocSize = alloc->GetSize();
+            Free(alloc);
+            m_hAllocator->m_Budget.RemoveAllocation(heapIndex, allocSize);
         }
         memset(pAllocations, 0, sizeof(VmaAllocation) * allocationCount);
     }
@@ -12572,7 +13057,7 @@
     bool canMakeOtherLost = (createInfo.flags & VMA_ALLOCATION_CREATE_CAN_MAKE_OTHER_LOST_BIT) != 0;
     const bool mapped = (createInfo.flags & VMA_ALLOCATION_CREATE_MAPPED_BIT) != 0;
     const bool isUserDataString = (createInfo.flags & VMA_ALLOCATION_CREATE_USER_DATA_COPY_STRING_BIT) != 0;
-    
+
     VkDeviceSize freeMemory;
     {
         const uint32_t heapIndex = m_hAllocator->MemoryTypeIndexToHeapIndex(m_MemoryTypeIndex);
@@ -12580,7 +13065,7 @@
         m_hAllocator->GetBudget(&heapBudget, heapIndex, 1);
         freeMemory = (heapBudget.usage < heapBudget.budget) ? (heapBudget.budget - heapBudget.usage) : 0;
     }
-    
+
     const bool canFallbackToDedicated = !IsCustomPool();
     const bool canCreateNewBlock =
         ((createInfo.flags & VMA_ALLOCATION_CREATE_NEVER_ALLOCATE_BIT) == 0) &&
@@ -13094,7 +13579,7 @@
                 return res;
             }
         }
-            
+
         *pAllocation = m_hAllocator->m_AllocationObjectAllocator.Allocate(currentFrameIndex, isUserDataString);
         pBlock->m_pMetadata->Alloc(currRequest, suballocType, size, *pAllocation);
         UpdateHasEmptyBlock();
@@ -13140,6 +13625,15 @@
     }
 #endif // #if VMA_BUFFER_DEVICE_ADDRESS
 
+#if VMA_MEMORY_PRIORITY
+    VkMemoryPriorityAllocateInfoEXT priorityInfo = { VK_STRUCTURE_TYPE_MEMORY_PRIORITY_ALLOCATE_INFO_EXT };
+    if(m_hAllocator->m_UseExtMemoryPriority)
+    {
+        priorityInfo.priority = m_Priority;
+        VmaPnextChainPushFront(&allocInfo, &priorityInfo);
+    }
+#endif // #if VMA_MEMORY_PRIORITY
+
     VkDeviceMemory mem = VK_NULL_HANDLE;
     VkResult res = m_hAllocator->AllocateVulkanMemory(&allocInfo, &mem);
     if(res < 0)
@@ -13489,7 +13983,7 @@
     VkCommandBuffer commandBuffer)
 {
     pCtx->res = VK_SUCCESS;
-    
+
     const VkMemoryPropertyFlags memPropFlags =
         m_hAllocator->m_MemProps.memoryTypes[m_MemoryTypeIndex].propertyFlags;
     const bool isHostVisible = (memPropFlags & VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT) != 0;
@@ -13568,13 +14062,13 @@
         {
             if(m_hAllocator->m_UseMutex)
                 m_Mutex.UnlockWrite();
-            
+
             if(pCtx->res >= VK_SUCCESS && !pCtx->defragmentationMoves.empty())
                 pCtx->res = VK_NOT_READY;
 
             return;
         }
-    
+
         if(pCtx->res >= VK_SUCCESS)
         {
             if(defragmentOnGpu)
@@ -13635,8 +14129,8 @@
     VmaDefragmentationPassMoveInfo* pMove, uint32_t maxMoves)
 {
     VmaMutexLockWrite lock(m_Mutex, m_hAllocator->m_UseMutex);
-    
-    const uint32_t moveCount = std::min(uint32_t(pCtx->defragmentationMoves.size()) - pCtx->defragmentationMovesProcessed, maxMoves);
+
+    const uint32_t moveCount = VMA_MIN(uint32_t(pCtx->defragmentationMoves.size()) - pCtx->defragmentationMovesProcessed, maxMoves);
 
     for(uint32_t i = 0; i < moveCount; ++ i)
     {
@@ -13659,7 +14153,7 @@
     VmaDefragmentationStats* pStats)
 {
     VmaMutexLockWrite lock(m_Mutex, m_hAllocator->m_UseMutex);
-    
+
     for(uint32_t i = pCtx->defragmentationMovesCommitted; i < pCtx->defragmentationMovesProcessed; ++ i)
     {
         const VmaDefragmentationMove &move = pCtx->defragmentationMoves[i];
@@ -13878,7 +14372,7 @@
                 srcAllocIndex = m_Blocks[srcBlockIndex]->m_Allocations.size() - 1;
             }
         }
-        
+
         BlockInfo* pSrcBlockInfo = m_Blocks[srcBlockIndex];
         AllocationInfo& allocInfo = pSrcBlockInfo->m_Allocations[srcAllocIndex];
 
@@ -13938,7 +14432,7 @@
                     pSrcBlockInfo->m_pBlock->m_pMetadata->FreeAtOffset(srcOffset);
                     allocInfo.m_hAllocation->ChangeBlockAllocation(m_hAllocator, pDstBlockInfo->m_pBlock, dstAllocRequest.offset);
                 }
-                
+
                 if(allocInfo.m_pChanged != VMA_NULL)
                 {
                     *allocInfo.m_pChanged = VK_TRUE;
@@ -14019,7 +14513,7 @@
         }
 
         pBlockInfo->CalcHasNonMovableAllocations();
-        
+
         // This is a choice based on research.
         // Option 1:
         pBlockInfo->SortAllocationsByOffsetDescending();
@@ -14169,7 +14663,7 @@
                     suballoc.hAllocation->ChangeOffset(dstAllocOffset);
                     m_BytesMoved += srcAllocSize;
                     ++m_AllocationsMoved;
-                    
+
                     VmaSuballocationList::iterator nextSuballocIt = srcSuballocIt;
                     ++nextSuballocIt;
                     pSrcMetadata->m_Suballocations.erase(srcSuballocIt);
@@ -14182,7 +14676,7 @@
                     move.srcOffset = srcAllocOffset;
                     move.dstOffset = dstAllocOffset;
                     move.size = srcAllocSize;
-                    
+
                     moves.push_back(move);
                 }
                 // Different block
@@ -14210,7 +14704,7 @@
                     move.srcOffset = srcAllocOffset;
                     move.dstOffset = dstAllocOffset;
                     move.size = srcAllocSize;
-                    
+
                     moves.push_back(move);
                 }
             }
@@ -14265,13 +14759,13 @@
                         m_BytesMoved += srcAllocSize;
                         ++m_AllocationsMoved;
                         ++srcSuballocIt;
-                        
+
                         move.srcBlockIndex = srcOrigBlockIndex;
                         move.dstBlockIndex = dstOrigBlockIndex;
                         move.srcOffset = srcAllocOffset;
                         move.dstOffset = dstAllocOffset;
                         move.size = srcAllocSize;
-                        
+
                         moves.push_back(move);
                     }
                 }
@@ -14302,7 +14796,7 @@
                     move.srcOffset = srcAllocOffset;
                     move.dstOffset = dstAllocOffset;
                     move.size = srcAllocSize;
-                    
+
                     moves.push_back(move);
                 }
             }
@@ -14310,7 +14804,7 @@
     }
 
     m_BlockInfos.clear();
-    
+
     PostprocessMetadata();
 
     return VK_SUCCESS;
@@ -14352,7 +14846,7 @@
         VmaBlockMetadata_Generic* const pMetadata =
             (VmaBlockMetadata_Generic*)m_pBlockVector->GetBlock(blockIndex)->m_pMetadata;
         const VkDeviceSize blockSize = pMetadata->GetSize();
-        
+
         // No allocations in this block - entire area is free.
         if(pMetadata->m_Suballocations.empty())
         {
@@ -14566,7 +15060,7 @@
         if(pool->m_BlockVector.GetAlgorithm() == 0)
         {
             VmaBlockVectorDefragmentationContext* pBlockVectorDefragCtx = VMA_NULL;
-            
+
             for(size_t i = m_CustomPoolContexts.size(); i--; )
             {
                 if(m_CustomPoolContexts[i]->GetCustomPool() == pool)
@@ -14575,7 +15069,7 @@
                     break;
                 }
             }
-            
+
             if(!pBlockVectorDefragCtx)
             {
                 pBlockVectorDefragCtx = vma_new(m_hAllocator, VmaBlockVectorDefragmentationContext)(
@@ -15434,12 +15928,12 @@
         // There is room for optimization since sstream is quite slow.
         // Is there a better way to convert std::this_thread::get_id() to uint32_t?
         std::thread::id thread_id = std::this_thread::get_id();
-        stringstream thread_id_to_string_converter;
+        std::stringstream thread_id_to_string_converter;
         thread_id_to_string_converter << thread_id;
-        string thread_id_as_string = thread_id_to_string_converter.str();
+        std::string thread_id_as_string = thread_id_to_string_converter.str();
         outParams.threadId = static_cast<uint32_t>(std::stoi(thread_id_as_string.c_str()));
     #endif
-    
+
     auto current_time = std::chrono::high_resolution_clock::now();
 
     outParams.time = std::chrono::duration<double, std::chrono::seconds::period>(current_time - m_RecordingStartTime).count();
@@ -15498,6 +15992,7 @@
     m_UseExtMemoryBudget((pCreateInfo->flags & VMA_ALLOCATOR_CREATE_EXT_MEMORY_BUDGET_BIT) != 0),
     m_UseAmdDeviceCoherentMemory((pCreateInfo->flags & VMA_ALLOCATOR_CREATE_AMD_DEVICE_COHERENT_MEMORY_BIT) != 0),
     m_UseKhrBufferDeviceAddress((pCreateInfo->flags & VMA_ALLOCATOR_CREATE_BUFFER_DEVICE_ADDRESS_BIT) != 0),
+    m_UseExtMemoryPriority((pCreateInfo->flags & VMA_ALLOCATOR_CREATE_EXT_MEMORY_PRIORITY_BIT) != 0),
     m_hDevice(pCreateInfo->device),
     m_hInstance(pCreateInfo->instance),
     m_AllocationCallbacksSpecified(pCreateInfo->pAllocationCallbacks != VMA_NULL),
@@ -15505,11 +16000,11 @@
         *pCreateInfo->pAllocationCallbacks : VmaEmptyAllocationCallbacks),
     m_AllocationObjectAllocator(&m_AllocationCallbacks),
     m_HeapSizeLimitMask(0),
+    m_DeviceMemoryCount(0),
     m_PreferredLargeHeapBlockSize(0),
     m_PhysicalDevice(pCreateInfo->physicalDevice),
     m_CurrentFrameIndex(0),
     m_GpuDefragmentationMemoryTypeBits(UINT32_MAX),
-    m_Pools(VmaStlAllocator<VmaPool>(GetAllocationCallbacks())),
     m_NextPoolId(0),
     m_GlobalMemoryTypeBits(UINT32_MAX)
 #if VMA_RECORDING_ENABLED
@@ -15569,13 +16064,18 @@
         VMA_ASSERT(0 && "vulkanApiVersion >= VK_API_VERSION_1_1 but required Vulkan version is disabled by preprocessor macros.");
     }
 #endif
+#if !(VMA_MEMORY_PRIORITY)
+    if(m_UseExtMemoryPriority)
+    {
+        VMA_ASSERT(0 && "VMA_ALLOCATOR_CREATE_EXT_MEMORY_PRIORITY_BIT is set but required extension is not available in your Vulkan header or its support in VMA has been disabled by a preprocessor macro.");
+    }
+#endif
 
     memset(&m_DeviceMemoryCallbacks, 0 ,sizeof(m_DeviceMemoryCallbacks));
     memset(&m_PhysicalDeviceProperties, 0, sizeof(m_PhysicalDeviceProperties));
     memset(&m_MemProps, 0, sizeof(m_MemProps));
-        
+
     memset(&m_pBlockVectors, 0, sizeof(m_pBlockVectors));
-    memset(&m_pDedicatedAllocations, 0, sizeof(m_pDedicatedAllocations));
     memset(&m_VulkanFunctions, 0, sizeof(m_VulkanFunctions));
 
     if(pCreateInfo->pDeviceMemoryCallbacks != VMA_NULL)
@@ -15630,11 +16130,10 @@
             GetBufferImageGranularity(),
             pCreateInfo->frameInUseCount,
             false, // explicitBlockSize
-            false); // linearAlgorithm
+            false, // linearAlgorithm
+            0.5f); // priority (0.5 is the default per Vulkan spec)
         // No need to call m_pBlockVectors[memTypeIndex][blockVectorTypeIndex]->CreateMinBlocks here,
         // becase minBlockCount is 0.
-        m_pDedicatedAllocations[memTypeIndex] = vma_new(this, AllocationVectorType)(VmaStlAllocator<VmaAllocation>(GetAllocationCallbacks()));
-
     }
 }
 
@@ -15686,18 +16185,17 @@
         vma_delete(this, m_pRecorder);
     }
 #endif
-    
-    VMA_ASSERT(m_Pools.empty());
 
-    for(size_t i = GetMemoryTypeCount(); i--; )
+    VMA_ASSERT(m_Pools.IsEmpty());
+
+    for(size_t memTypeIndex = GetMemoryTypeCount(); memTypeIndex--; )
     {
-        if(m_pDedicatedAllocations[i] != VMA_NULL && !m_pDedicatedAllocations[i]->empty())
+        if(!m_DedicatedAllocations[memTypeIndex].IsEmpty())
         {
             VMA_ASSERT(0 && "Unfreed dedicated allocations found.");
         }
 
-        vma_delete(this, m_pDedicatedAllocations[i]);
-        vma_delete(this, m_pBlockVectors[i]);
+        vma_delete(this, m_pBlockVectors[memTypeIndex]);
     }
 }
 
@@ -15985,6 +16483,7 @@
                 (finalCreateInfo.flags & VMA_ALLOCATION_CREATE_MAPPED_BIT) != 0,
                 (finalCreateInfo.flags & VMA_ALLOCATION_CREATE_USER_DATA_COPY_STRING_BIT) != 0,
                 finalCreateInfo.pUserData,
+                finalCreateInfo.priority,
                 dedicatedBuffer,
                 dedicatedBufferUsage,
                 dedicatedImage,
@@ -16012,33 +16511,40 @@
         {
             return VK_ERROR_OUT_OF_DEVICE_MEMORY;
         }
+
+        // Protection against creating each allocation as dedicated when we reach or exceed heap size/budget,
+        // which can quickly deplete maxMemoryAllocationCount: Don't try dedicated allocations when above
+        // 3/4 of the maximum allocation count.
+        if(m_DeviceMemoryCount.load() > m_PhysicalDeviceProperties.limits.maxMemoryAllocationCount * 3 / 4)
+        {
+            return VK_ERROR_OUT_OF_DEVICE_MEMORY;
+        }
+
+        res = AllocateDedicatedMemory(
+            size,
+            suballocType,
+            memTypeIndex,
+            (finalCreateInfo.flags & VMA_ALLOCATION_CREATE_WITHIN_BUDGET_BIT) != 0,
+            (finalCreateInfo.flags & VMA_ALLOCATION_CREATE_MAPPED_BIT) != 0,
+            (finalCreateInfo.flags & VMA_ALLOCATION_CREATE_USER_DATA_COPY_STRING_BIT) != 0,
+            finalCreateInfo.pUserData,
+            finalCreateInfo.priority,
+            dedicatedBuffer,
+            dedicatedBufferUsage,
+            dedicatedImage,
+            allocationCount,
+            pAllocations);
+        if(res == VK_SUCCESS)
+        {
+            // Succeeded: AllocateDedicatedMemory function already filld pMemory, nothing more to do here.
+            VMA_DEBUG_LOG("    Allocated as DedicatedMemory");
+            return VK_SUCCESS;
+        }
         else
         {
-            res = AllocateDedicatedMemory(
-                size,
-                suballocType,
-                memTypeIndex,
-                (finalCreateInfo.flags & VMA_ALLOCATION_CREATE_WITHIN_BUDGET_BIT) != 0,
-                (finalCreateInfo.flags & VMA_ALLOCATION_CREATE_MAPPED_BIT) != 0,
-                (finalCreateInfo.flags & VMA_ALLOCATION_CREATE_USER_DATA_COPY_STRING_BIT) != 0,
-                finalCreateInfo.pUserData,
-                dedicatedBuffer,
-                dedicatedBufferUsage,
-                dedicatedImage,
-                allocationCount,
-                pAllocations);
-            if(res == VK_SUCCESS)
-            {
-                // Succeeded: AllocateDedicatedMemory function already filld pMemory, nothing more to do here.
-                VMA_DEBUG_LOG("    Allocated as DedicatedMemory");
-                return VK_SUCCESS;
-            }
-            else
-            {
-                // Everything failed: Return error code.
-                VMA_DEBUG_LOG("    vkAllocateMemory FAILED");
-                return res;
-            }
+            // Everything failed: Return error code.
+            VMA_DEBUG_LOG("    vkAllocateMemory FAILED");
+            return res;
         }
     }
 }
@@ -16051,6 +16557,7 @@
     bool map,
     bool isUserDataString,
     void* pUserData,
+    float priority,
     VkBuffer dedicatedBuffer,
     VkBufferUsageFlags dedicatedBufferUsage,
     VkImage dedicatedImage,
@@ -16114,6 +16621,15 @@
     }
 #endif // #if VMA_BUFFER_DEVICE_ADDRESS
 
+#if VMA_MEMORY_PRIORITY
+    VkMemoryPriorityAllocateInfoEXT priorityInfo = { VK_STRUCTURE_TYPE_MEMORY_PRIORITY_ALLOCATE_INFO_EXT };
+    if(m_UseExtMemoryPriority)
+    {
+        priorityInfo.priority = priority;
+        VmaPnextChainPushFront(&allocInfo, &priorityInfo);
+    }
+#endif // #if VMA_MEMORY_PRIORITY
+
     size_t allocIndex;
     VkResult res = VK_SUCCESS;
     for(allocIndex = 0; allocIndex < allocationCount; ++allocIndex)
@@ -16135,14 +16651,13 @@
 
     if(res == VK_SUCCESS)
     {
-        // Register them in m_pDedicatedAllocations.
+        // Register them in m_DedicatedAllocations.
         {
             VmaMutexLockWrite lock(m_DedicatedAllocationsMutex[memTypeIndex], m_UseMutex);
-            AllocationVectorType* pDedicatedAllocations = m_pDedicatedAllocations[memTypeIndex];
-            VMA_ASSERT(pDedicatedAllocations);
+            DedicatedAllocationLinkedList& dedicatedAllocations = m_DedicatedAllocations[memTypeIndex];
             for(allocIndex = 0; allocIndex < allocationCount; ++allocIndex)
             {
-                VmaVectorInsertSorted<VmaPointerLess>(*pDedicatedAllocations, pAllocations[allocIndex]);
+                dedicatedAllocations.PushBack(pAllocations[allocIndex]);
             }
         }
 
@@ -16155,7 +16670,7 @@
         {
             VmaAllocation currAlloc = pAllocations[allocIndex];
             VkDeviceMemory hMemory = currAlloc->GetMemory();
-    
+
             /*
             There is no need to call this, because Vulkan spec allows to skip vkUnmapMemory
             before vkFreeMemory.
@@ -16165,7 +16680,7 @@
                 (*m_VulkanFunctions.vkUnmapMemory)(m_hDevice, hMemory);
             }
             */
-    
+
             FreeVulkanMemory(memTypeIndex, currAlloc->GetSize(), hMemory);
             m_Budget.RemoveAllocation(MemoryTypeIndexToHeapIndex(memTypeIndex), currAlloc->GetSize());
             currAlloc->SetUserData(this, VMA_NULL);
@@ -16408,7 +16923,7 @@
                         alignmentForMemType = VMA_MAX(
                             vkMemReq.alignment,
                             GetMemoryTypeMinAlignment(memTypeIndex));
-                        
+
                         res = AllocateMemoryOfType(
                             vkMemReq.size,
                             alignmentForMemType,
@@ -16496,22 +17011,6 @@
     }
 }
 
-VkResult VmaAllocator_T::ResizeAllocation(
-    const VmaAllocation alloc,
-    VkDeviceSize newSize)
-{
-    // This function is deprecated and so it does nothing. It's left for backward compatibility.
-    if(newSize == 0 || alloc->GetLastUseFrameIndex() == VMA_FRAME_INDEX_LOST)
-    {
-        return VK_ERROR_VALIDATION_FAILED_EXT;
-    }
-    if(newSize == alloc->GetSize())
-    {
-        return VK_SUCCESS;
-    }
-    return VK_ERROR_OUT_OF_POOL_MEMORY;
-}
-
 void VmaAllocator_T::CalculateStats(VmaStats* pStats)
 {
     // Initialize.
@@ -16520,7 +17019,7 @@
         InitStatInfo(pStats->memoryType[i]);
     for(size_t i = 0; i < VK_MAX_MEMORY_HEAPS; ++i)
         InitStatInfo(pStats->memoryHeap[i]);
-    
+
     // Process default pools.
     for(uint32_t memTypeIndex = 0; memTypeIndex < GetMemoryTypeCount(); ++memTypeIndex)
     {
@@ -16532,9 +17031,9 @@
     // Process custom pools.
     {
         VmaMutexLockRead lock(m_PoolsMutex, m_UseMutex);
-        for(size_t poolIndex = 0, poolCount = m_Pools.size(); poolIndex < poolCount; ++poolIndex)
+        for(VmaPool pool = m_Pools.Front(); pool != VMA_NULL; pool = m_Pools.GetNext(pool))
         {
-            m_Pools[poolIndex]->m_BlockVector.AddStats(pStats);
+            pool->m_BlockVector.AddStats(pStats);
         }
     }
 
@@ -16543,12 +17042,12 @@
     {
         const uint32_t memHeapIndex = MemoryTypeIndexToHeapIndex(memTypeIndex);
         VmaMutexLockRead dedicatedAllocationsLock(m_DedicatedAllocationsMutex[memTypeIndex], m_UseMutex);
-        AllocationVectorType* const pDedicatedAllocVector = m_pDedicatedAllocations[memTypeIndex];
-        VMA_ASSERT(pDedicatedAllocVector);
-        for(size_t allocIndex = 0, allocCount = pDedicatedAllocVector->size(); allocIndex < allocCount; ++allocIndex)
+        DedicatedAllocationLinkedList& dedicatedAllocList = m_DedicatedAllocations[memTypeIndex];
+        for(VmaAllocation alloc = dedicatedAllocList.Front();
+            alloc != VMA_NULL; alloc = dedicatedAllocList.GetNext(alloc))
         {
             VmaStatInfo allocationStatInfo;
-            (*pDedicatedAllocVector)[allocIndex]->DedicatedAllocCalcStatsInfo(allocationStatInfo);
+            alloc->DedicatedAllocCalcStatsInfo(allocationStatInfo);
             VmaAddStatInfo(pStats->total, allocationStatInfo);
             VmaAddStatInfo(pStats->memoryType[memTypeIndex], allocationStatInfo);
             VmaAddStatInfo(pStats->memoryHeap[memHeapIndex], allocationStatInfo);
@@ -16665,7 +17164,7 @@
     VmaDefragmentationContext context)
 {
     return context->DefragmentPassEnd();
-    
+
 }
 
 void VmaAllocator_T::GetAllocationInfo(VmaAllocation hAllocation, VmaAllocationInfo* pAllocationInfo)
@@ -16829,7 +17328,7 @@
     {
         VmaMutexLockWrite lock(m_PoolsMutex, m_UseMutex);
         (*pPool)->SetId(m_NextPoolId++);
-        VmaVectorInsertSorted<VmaPointerLess>(m_Pools, *pPool);
+        m_Pools.PushBack(*pPool);
     }
 
     return VK_SUCCESS;
@@ -16840,8 +17339,7 @@
     // Remove from m_Pools.
     {
         VmaMutexLockWrite lock(m_PoolsMutex, m_UseMutex);
-        bool success = VmaVectorRemoveSorted<VmaPointerLess>(m_Pools, pool);
-        VMA_ASSERT(success && "Pool not found in Allocator.");
+        m_Pools.Remove(pool);
     }
 
     vma_delete(this, pool);
@@ -16906,11 +17404,11 @@
     // Process custom pools.
     {
         VmaMutexLockRead lock(m_PoolsMutex, m_UseMutex);
-        for(size_t poolIndex = 0, poolCount = m_Pools.size(); poolIndex < poolCount; ++poolIndex)
+        for(VmaPool pool = m_Pools.Front(); pool != VMA_NULL; pool = m_Pools.GetNext(pool))
         {
-            if(((1u << m_Pools[poolIndex]->m_BlockVector.GetMemoryTypeIndex()) & memoryTypeBits) != 0)
+            if(((1u << pool->m_BlockVector.GetMemoryTypeIndex()) & memoryTypeBits) != 0)
             {
-                VkResult localRes = m_Pools[poolIndex]->m_BlockVector.CheckCorruption();
+                VkResult localRes = pool->m_BlockVector.CheckCorruption();
                 switch(localRes)
                 {
                 case VK_ERROR_FEATURE_NOT_PRESENT:
@@ -16934,8 +17432,42 @@
     (*pAllocation)->InitLost();
 }
 
+// An object that increments given atomic but decrements it back in the destructor unless Commit() is called.
+template<typename T>
+struct AtomicTransactionalIncrement
+{
+public:
+    typedef std::atomic<T> AtomicT;
+    ~AtomicTransactionalIncrement()
+    {
+        if(m_Atomic)
+            --(*m_Atomic);
+    }
+    T Increment(AtomicT* atomic)
+    {
+        m_Atomic = atomic;
+        return m_Atomic->fetch_add(1);
+    }
+    void Commit()
+    {
+        m_Atomic = nullptr;
+    }
+
+private:
+    AtomicT* m_Atomic = nullptr;
+};
+
 VkResult VmaAllocator_T::AllocateVulkanMemory(const VkMemoryAllocateInfo* pAllocateInfo, VkDeviceMemory* pMemory)
 {
+    AtomicTransactionalIncrement<uint32_t> deviceMemoryCountIncrement;
+    const uint64_t prevDeviceMemoryCount = deviceMemoryCountIncrement.Increment(&m_DeviceMemoryCount);
+#if VMA_DEBUG_DONT_EXCEED_MAX_MEMORY_ALLOCATION_COUNT
+    if(prevDeviceMemoryCount >= m_PhysicalDeviceProperties.limits.maxMemoryAllocationCount)
+    {
+        return VK_ERROR_TOO_MANY_OBJECTS;
+    }
+#endif
+
     const uint32_t heapIndex = MemoryTypeIndexToHeapIndex(pAllocateInfo->memoryTypeIndex);
 
     // HeapSizeLimit is in effect for this heap.
@@ -16975,6 +17507,8 @@
         {
             (*m_DeviceMemoryCallbacks.pfnAllocate)(this, pAllocateInfo->memoryTypeIndex, *pMemory, pAllocateInfo->allocationSize, m_DeviceMemoryCallbacks.pUserData);
         }
+
+        deviceMemoryCountIncrement.Commit();
     }
     else
     {
@@ -16996,6 +17530,8 @@
     (*m_VulkanFunctions.vkFreeMemory)(m_hDevice, hMemory, GetAllocationCallbacks());
 
     m_Budget.m_BlockBytes[MemoryTypeIndexToHeapIndex(memoryType)] -= size;
+
+    --m_DeviceMemoryCount;
 }
 
 VkResult VmaAllocator_T::BindVulkanBuffer(
@@ -17193,7 +17729,7 @@
     typedef VmaStlAllocator<VkMappedMemoryRange> RangeAllocator;
     typedef VmaSmallVector<VkMappedMemoryRange, RangeAllocator, 16> RangeVector;
     RangeVector ranges = RangeVector(RangeAllocator(GetAllocationCallbacks()));
-    
+
     for(uint32_t allocIndex = 0; allocIndex < allocationCount; ++allocIndex)
     {
         const VmaAllocation alloc = allocations[allocIndex];
@@ -17232,14 +17768,12 @@
     const uint32_t memTypeIndex = allocation->GetMemoryTypeIndex();
     {
         VmaMutexLockWrite lock(m_DedicatedAllocationsMutex[memTypeIndex], m_UseMutex);
-        AllocationVectorType* const pDedicatedAllocations = m_pDedicatedAllocations[memTypeIndex];
-        VMA_ASSERT(pDedicatedAllocations);
-        bool success = VmaVectorRemoveSorted<VmaPointerLess>(*pDedicatedAllocations, allocation);
-        VMA_ASSERT(success);
+        DedicatedAllocationLinkedList& dedicatedAllocations = m_DedicatedAllocations[memTypeIndex];
+        dedicatedAllocations.Remove(allocation);
     }
 
     VkDeviceMemory hMemory = allocation->GetMemory();
-    
+
     /*
     There is no need to call this, because Vulkan spec allows to skip vkUnmapMemory
     before vkFreeMemory.
@@ -17249,7 +17783,7 @@
         (*m_VulkanFunctions.vkUnmapMemory)(m_hDevice, hMemory);
     }
     */
-    
+
     FreeVulkanMemory(memTypeIndex, allocation->GetSize(), hMemory);
 
     VMA_DEBUG_LOG("    Freed DedicatedMemory MemoryTypeIndex=%u", memTypeIndex);
@@ -17447,9 +17981,8 @@
     for(uint32_t memTypeIndex = 0; memTypeIndex < GetMemoryTypeCount(); ++memTypeIndex)
     {
         VmaMutexLockRead dedicatedAllocationsLock(m_DedicatedAllocationsMutex[memTypeIndex], m_UseMutex);
-        AllocationVectorType* const pDedicatedAllocVector = m_pDedicatedAllocations[memTypeIndex];
-        VMA_ASSERT(pDedicatedAllocVector);
-        if(pDedicatedAllocVector->empty() == false)
+        DedicatedAllocationLinkedList& dedicatedAllocList = m_DedicatedAllocations[memTypeIndex];
+        if(!dedicatedAllocList.IsEmpty())
         {
             if(dedicatedAllocationsStarted == false)
             {
@@ -17461,14 +17994,14 @@
             json.BeginString("Type ");
             json.ContinueString(memTypeIndex);
             json.EndString();
-                
+
             json.BeginArray();
 
-            for(size_t i = 0; i < pDedicatedAllocVector->size(); ++i)
+            for(VmaAllocation alloc = dedicatedAllocList.Front();
+                alloc != VMA_NULL; alloc = dedicatedAllocList.GetNext(alloc))
             {
                 json.BeginObject(true);
-                const VmaAllocation hAlloc = (*pDedicatedAllocVector)[i];
-                hAlloc->PrintParameters(json);
+                alloc->PrintParameters(json);
                 json.EndObject();
             }
 
@@ -17509,18 +18042,17 @@
     // Custom pools
     {
         VmaMutexLockRead lock(m_PoolsMutex, m_UseMutex);
-        const size_t poolCount = m_Pools.size();
-        if(poolCount > 0)
+        if(!m_Pools.IsEmpty())
         {
             json.WriteString("Pools");
             json.BeginObject();
-            for(size_t poolIndex = 0; poolIndex < poolCount; ++poolIndex)
+            for(VmaPool pool = m_Pools.Front(); pool != VMA_NULL; pool = m_Pools.GetNext(pool))
             {
                 json.BeginString();
-                json.ContinueString(m_Pools[poolIndex]->GetId());
+                json.ContinueString(pool->GetId());
                 json.EndString();
 
-                m_Pools[poolIndex]->m_BlockVector.PrintDetailedMap(json);
+                pool->m_BlockVector.PrintDetailedMap(json);
             }
             json.EndObject();
         }
@@ -17642,7 +18174,7 @@
 
         json.WriteString("Total");
         VmaPrintStatInfo(json, stats.total);
-    
+
         for(uint32_t heapIndex = 0; heapIndex < allocator->GetMemoryHeapCount(); ++heapIndex)
         {
             json.BeginString("Heap ");
@@ -17714,18 +18246,22 @@
                     {
                         json.WriteString("LAZILY_ALLOCATED");
                     }
+#if VMA_VULKAN_VERSION >= 1001000
                     if((flags & VK_MEMORY_PROPERTY_PROTECTED_BIT) != 0)
                     {
-                        json.WriteString(" PROTECTED");
+                        json.WriteString("PROTECTED");
                     }
+#endif // #if VMA_VULKAN_VERSION >= 1001000
+#if VK_AMD_device_coherent_memory
                     if((flags & VK_MEMORY_PROPERTY_DEVICE_COHERENT_BIT_AMD_COPY) != 0)
                     {
-                        json.WriteString(" DEVICE_COHERENT");
+                        json.WriteString("DEVICE_COHERENT");
                     }
                     if((flags & VK_MEMORY_PROPERTY_DEVICE_UNCACHED_BIT_AMD_COPY) != 0)
                     {
-                        json.WriteString(" DEVICE_UNCACHED");
+                        json.WriteString("DEVICE_UNCACHED");
                     }
+#endif // #if VK_AMD_device_coherent_memory
                     json.EndArray();
 
                     if(stats.memoryType[typeIndex].blockCount > 0)
@@ -17791,7 +18327,7 @@
     {
         memoryTypeBits &= pAllocationCreateInfo->memoryTypeBits;
     }
-    
+
     uint32_t requiredFlags = pAllocationCreateInfo->requiredFlags;
     uint32_t preferredFlags = pAllocationCreateInfo->preferredFlags;
     uint32_t notPreferredFlags = 0;
@@ -17944,20 +18480,20 @@
     VmaPool* pPool)
 {
     VMA_ASSERT(allocator && pCreateInfo && pPool);
-    
+
     VMA_DEBUG_LOG("vmaCreatePool");
-    
+
     VMA_DEBUG_GLOBAL_MUTEX_LOCK
-    
+
     VkResult res = allocator->CreatePool(pCreateInfo, pPool);
-    
+
 #if VMA_RECORDING_ENABLED
     if(allocator->GetRecorder() != VMA_NULL)
     {
         allocator->GetRecorder()->RecordCreatePool(allocator->GetCurrentFrameIndex(), *pCreateInfo, *pPool);
     }
 #endif
-    
+
     return res;
 }
 
@@ -17966,16 +18502,16 @@
     VmaPool pool)
 {
     VMA_ASSERT(allocator);
-    
+
     if(pool == VK_NULL_HANDLE)
     {
         return;
     }
-    
+
     VMA_DEBUG_LOG("vmaDestroyPool");
-    
+
     VMA_DEBUG_GLOBAL_MUTEX_LOCK
-    
+
 #if VMA_RECORDING_ENABLED
     if(allocator->GetRecorder() != VMA_NULL)
     {
@@ -18034,7 +18570,7 @@
     const char** ppName)
 {
     VMA_ASSERT(allocator && pool && ppName);
-    
+
     VMA_DEBUG_LOG("vmaGetPoolName");
 
     VMA_DEBUG_GLOBAL_MUTEX_LOCK
@@ -18098,7 +18634,7 @@
             *pAllocation);
     }
 #endif
-        
+
     if(pAllocationInfo != VMA_NULL && result == VK_SUCCESS)
     {
         allocator->GetAllocationInfo(*pAllocation, pAllocationInfo);
@@ -18149,7 +18685,7 @@
             pAllocations);
     }
 #endif
-        
+
     if(pAllocationInfo != VMA_NULL && result == VK_SUCCESS)
     {
         for(size_t i = 0; i < allocationCount; ++i)
@@ -18271,14 +18807,14 @@
     VmaAllocation allocation)
 {
     VMA_ASSERT(allocator);
-    
+
     if(allocation == VK_NULL_HANDLE)
     {
         return;
     }
-    
+
     VMA_DEBUG_LOG("vmaFreeMemory");
-    
+
     VMA_DEBUG_GLOBAL_MUTEX_LOCK
 
 #if VMA_RECORDING_ENABLED
@@ -18289,7 +18825,7 @@
             allocation);
     }
 #endif
-    
+
     allocator->FreeMemory(
         1, // allocationCount
         &allocation);
@@ -18306,9 +18842,9 @@
     }
 
     VMA_ASSERT(allocator);
-    
+
     VMA_DEBUG_LOG("vmaFreeMemoryPages");
-    
+
     VMA_DEBUG_GLOBAL_MUTEX_LOCK
 
 #if VMA_RECORDING_ENABLED
@@ -18320,24 +18856,10 @@
             pAllocations);
     }
 #endif
-    
+
     allocator->FreeMemory(allocationCount, pAllocations);
 }
 
-VMA_CALL_PRE VkResult VMA_CALL_POST vmaResizeAllocation(
-    VmaAllocator allocator,
-    VmaAllocation allocation,
-    VkDeviceSize newSize)
-{
-    VMA_ASSERT(allocator && allocation);
-    
-    VMA_DEBUG_LOG("vmaResizeAllocation");
-    
-    VMA_DEBUG_GLOBAL_MUTEX_LOCK
-
-    return allocator->ResizeAllocation(allocation, newSize);
-}
-
 VMA_CALL_PRE void VMA_CALL_POST vmaGetAllocationInfo(
     VmaAllocator allocator,
     VmaAllocation allocation,
@@ -18798,9 +19320,9 @@
         VMA_ASSERT(0 && "Creating a buffer with VK_BUFFER_USAGE_SHADER_DEVICE_ADDRESS_BIT is not valid if VMA_ALLOCATOR_CREATE_BUFFER_DEVICE_ADDRESS_BIT was not used.");
         return VK_ERROR_VALIDATION_FAILED_EXT;
     }
-    
+
     VMA_DEBUG_LOG("vmaCreateBuffer");
-    
+
     VMA_DEBUG_GLOBAL_MUTEX_LOCK
 
     *pBuffer = VK_NULL_HANDLE;
@@ -18955,7 +19477,7 @@
         VmaSuballocationType suballocType = pImageCreateInfo->tiling == VK_IMAGE_TILING_OPTIMAL ?
             VMA_SUBALLOCATION_TYPE_IMAGE_OPTIMAL :
             VMA_SUBALLOCATION_TYPE_IMAGE_LINEAR;
-        
+
         // 2. Allocate memory using allocator.
         VkMemoryRequirements vkMemReq = {};
         bool requiresDedicatedAllocation = false;
diff --git a/third_party/vulkan_memory_allocator/premake/LICENSE.txt b/third_party/vulkan_memory_allocator/premake/LICENSE.txt
deleted file mode 100644
index e7611e6..0000000
--- a/third_party/vulkan_memory_allocator/premake/LICENSE.txt
+++ /dev/null
@@ -1,27 +0,0 @@
-Copyright (c) 2003-2016 Jason Perkins and individual contributors.
-All rights reserved.
-
-Redistribution and use in source and binary forms, with or without modification,
-are permitted provided that the following conditions are met:
-
-  1. Redistributions of source code must retain the above copyright notice,
-     this list of conditions and the following disclaimer.
-
-  2. Redistributions in binary form must reproduce the above copyright notice,
-     this list of conditions and the following disclaimer in the documentation
-     and/or other materials provided with the distribution.
-
-  3. Neither the name of Premake nor the names of its contributors may be
-     used to endorse or promote products derived from this software without
-     specific prior written permission.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
-ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
-DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
-FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
-SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
-CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
-OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/third_party/vulkan_memory_allocator/premake/premake5.exe b/third_party/vulkan_memory_allocator/premake/premake5.exe
deleted file mode 100644
index 9048d51..0000000
--- a/third_party/vulkan_memory_allocator/premake/premake5.exe
+++ /dev/null
Binary files differ
diff --git a/third_party/vulkan_memory_allocator/premake/premake5.lua b/third_party/vulkan_memory_allocator/premake/premake5.lua
deleted file mode 100644
index 80de8e2..0000000
--- a/third_party/vulkan_memory_allocator/premake/premake5.lua
+++ /dev/null
@@ -1,99 +0,0 @@
--- _ACTION is a premake global variable and for our usage will be vs2012, vs2013, etc.
--- Strip "vs" from this string to make a suffix for solution and project files.
-_SUFFIX = _ACTION
-
-workspace "VulkanSample"
-configurations { "Debug", "Release" }
-platforms { "x64", "Linux-x64" }
-location "../build"
-filename ("VulkanSample_" .. _SUFFIX)
-startproject "VulkanSample"
-
-filter "platforms:x64"
-system "Windows"
-architecture "x64"
-includedirs { "$(VULKAN_SDK)/Include" }
-libdirs { "$(VULKAN_SDK)/Lib" }
-
-filter "platforms:Linux-x64"
-system "Linux"
-architecture "x64"
-includedirs { "$(VULKAN_SDK)/include" }
-libdirs { "$(VULKAN_SDK)/lib" }
-
-
-project "VulkanSample"
-kind "ConsoleApp"
-language "C++"
-location "../build"
-filename ("VulkanSample_" .. _SUFFIX)
-targetdir "../bin"
-objdir "../build/Desktop_%{_SUFFIX}/%{cfg.platform}/%{cfg.buildcfg}"
-floatingpoint "Fast"
-files { "../src/*.h", "../src/*.cpp" }
-flags { "NoPCH", "FatalWarnings" }
-characterset "Unicode"
-
-filter "configurations:Debug"
-defines { "_DEBUG", "DEBUG" }
-flags { }
-targetsuffix ("_Debug_" .. _SUFFIX)
-
-filter "configurations:Release"
-defines { "NDEBUG" }
-optimize "On"
-flags { "LinkTimeOptimization" }
-targetsuffix ("_Release_" .. _SUFFIX)
-
-filter { "platforms:x64" }
-defines { "WIN32", "_CONSOLE", "PROFILE", "_WINDOWS", "_WIN32_WINNT=0x0601" }
-links { "vulkan-1" }
-
-filter { "platforms:Linux-x64" }
-buildoptions { "-std=c++0x" }
-links { "vulkan" }
-
-filter { "configurations:Debug", "platforms:x64" }
-buildoptions { "/MDd" }
-
-filter { "configurations:Release", "platforms:Windows-x64" }
-buildoptions { "/MD" }
-
-
-project "VmaReplay"
-removeplatforms { "Linux-x64" }
-kind "ConsoleApp"
-language "C++"
-location "../build"
-filename ("VmaReplay_" .. _SUFFIX)
-targetdir "../bin"
-objdir "../build/Desktop_%{_SUFFIX}/%{cfg.platform}/%{cfg.buildcfg}"
-floatingpoint "Fast"
-files { "../src/VmaReplay/*.h", "../src/VmaReplay/*.cpp" }
-flags { "NoPCH", "FatalWarnings" }
-characterset "Default"
-
-filter "configurations:Debug"
-defines { "_DEBUG", "DEBUG" }
-flags { }
-targetsuffix ("_Debug_" .. _SUFFIX)
-
-filter "configurations:Release"
-defines { "NDEBUG" }
-optimize "On"
-flags { "LinkTimeOptimization" }
-targetsuffix ("_Release_" .. _SUFFIX)
-
-filter { "platforms:x64" }
-defines { "WIN32", "_CONSOLE", "PROFILE", "_WINDOWS", "_WIN32_WINNT=0x0601" }
-links { "vulkan-1" }
-
-filter { "platforms:Linux-x64" }
-buildoptions { "-std=c++0x" }
-links { "vulkan" }
-
-filter { "configurations:Debug", "platforms:x64" }
-buildoptions { "/MDd" }
-
-filter { "configurations:Release", "platforms:Windows-x64" }
-buildoptions { "/MD" }
diff --git a/third_party/vulkan_memory_allocator/src/CMakeLists.txt b/third_party/vulkan_memory_allocator/src/CMakeLists.txt
new file mode 100644
index 0000000..eccf82e
--- /dev/null
+++ b/third_party/vulkan_memory_allocator/src/CMakeLists.txt
@@ -0,0 +1,92 @@
+set(VMA_LIBRARY_SOURCE_FILES
+    VmaUsage.cpp
+)
+
+add_library(VulkanMemoryAllocator ${VMA_LIBRARY_SOURCE_FILES})
+
+set_target_properties(
+    VulkanMemoryAllocator PROPERTIES
+
+    CXX_EXTENSIONS OFF
+    # Use C++14
+    CXX_STANDARD 14
+    CXX_STANDARD_REQUIRED ON
+)
+
+target_include_directories(VulkanMemoryAllocator PUBLIC ${PROJECT_SOURCE_DIR}/include)
+
+# Only link to Vulkan if static linking is used
+if (NOT ${VMA_DYNAMIC_VULKAN_FUNCTIONS})
+    target_link_libraries(VulkanMemoryAllocator PUBLIC Vulkan::Vulkan)
+endif()
+
+target_compile_definitions(
+    VulkanMemoryAllocator
+
+    PUBLIC
+    VMA_USE_STL_CONTAINERS=$<BOOL:${VMA_USE_STL_CONTAINERS}>
+    VMA_DYNAMIC_VULKAN_FUNCTIONS=$<BOOL:${VMA_DYNAMIC_VULKAN_FUNCTIONS}>
+    VMA_DEBUG_ALWAYS_DEDICATED_MEMORY=$<BOOL:${VMA_DEBUG_ALWAYS_DEDICATED_MEMORY}>
+    VMA_DEBUG_INITIALIZE_ALLOCATIONS=$<BOOL:${VMA_DEBUG_INITIALIZE_ALLOCATIONS}>
+    VMA_DEBUG_GLOBAL_MUTEX=$<BOOL:${VMA_DEBUG_GLOBAL_MUTEX}>
+    VMA_DEBUG_DONT_EXCEED_MAX_MEMORY_ALLOCATION_COUNT=$<BOOL:${VMA_DEBUG_DONT_EXCEED_MAX_MEMORY_ALLOCATION_COUNT}>
+    VMA_RECORDING_ENABLED=$<BOOL:${VMA_RECORDING_ENABLED}>
+)
+
+if (VMA_BUILD_SAMPLE)
+    if(WIN32)
+        set(VMA_SAMPLE_SOURCE_FILES
+            Common.cpp
+            SparseBindingTest.cpp
+            Tests.cpp
+            VulkanSample.cpp
+        )
+
+        add_executable(VmaSample ${VMA_SAMPLE_SOURCE_FILES})
+
+        # Visual Studio specific settings
+        if(${CMAKE_GENERATOR} MATCHES "Visual Studio.*")
+            # Use Unicode instead of multibyte set
+            add_compile_definitions(UNICODE _UNICODE)
+            
+            # Set VmaSample as startup project
+            set_property(DIRECTORY ${PROJECT_SOURCE_DIR} PROPERTY VS_STARTUP_PROJECT "VmaSample")
+            
+            # Enable multithreaded compiling
+            target_compile_options(VmaSample PRIVATE "/MP")
+
+            # Set working directory for Visual Studio debugger
+            set_target_properties(
+                VmaSample
+                PROPERTIES VS_DEBUGGER_WORKING_DIRECTORY "${PROJECT_SOURCE_DIR}/bin"
+            )
+        endif()
+
+        set_target_properties(
+            VmaSample PROPERTIES
+
+            CXX_EXTENSIONS OFF
+            # Use C++14
+            CXX_STANDARD 14
+            CXX_STANDARD_REQUIRED ON
+        )
+
+        target_link_libraries(
+            VmaSample
+
+            PRIVATE
+            VulkanMemoryAllocator
+            Vulkan::Vulkan
+        )
+    else()
+        message(STATUS "VmaSample application is not supported to Linux")
+    endif()
+endif()
+
+if(VMA_BUILD_SAMPLE_SHADERS)
+    add_subdirectory(Shaders)
+endif()
+
+if(VMA_BUILD_REPLAY)
+    add_subdirectory(VmaReplay)
+endif()
diff --git a/third_party/vulkan_memory_allocator/src/Common.cpp b/third_party/vulkan_memory_allocator/src/Common.cpp
index 5ef7928..b4bf54f 100644
--- a/third_party/vulkan_memory_allocator/src/Common.cpp
+++ b/third_party/vulkan_memory_allocator/src/Common.cpp
@@ -1,5 +1,5 @@
 //
-// Copyright (c) 2017-2020 Advanced Micro Devices, Inc. All rights reserved.
+// Copyright (c) 2017-2021 Advanced Micro Devices, Inc. All rights reserved.
 //
 // Permission is hereby granted, free of charge, to any person obtaining a copy
 // of this software and associated documentation files (the "Software"), to deal
@@ -45,7 +45,7 @@
     switch(color)
     {
     case CONSOLE_COLOR::INFO:
-        attr = FOREGROUND_INTENSITY;;
+        attr = FOREGROUND_INTENSITY;
         break;
     case CONSOLE_COLOR::NORMAL:
         attr = FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE;
@@ -177,4 +177,152 @@
         assert(0);
 }
 
+std::wstring SizeToStr(size_t size)
+{
+    if(size == 0)
+        return L"0";
+    wchar_t result[32];
+    double size2 = (double)size;
+    if (size2 >= 1024.0*1024.0*1024.0*1024.0)
+    {
+        swprintf_s(result, L"%.2f TB", size2 / (1024.0*1024.0*1024.0*1024.0));
+    }
+    else if (size2 >= 1024.0*1024.0*1024.0)
+    {
+        swprintf_s(result, L"%.2f GB", size2 / (1024.0*1024.0*1024.0));
+    }
+    else if (size2 >= 1024.0*1024.0)
+    {
+        swprintf_s(result, L"%.2f MB", size2 / (1024.0*1024.0));
+    }
+    else if (size2 >= 1024.0)
+    {
+        swprintf_s(result, L"%.2f KB", size2 / 1024.0);
+    }
+    else
+        swprintf_s(result, L"%llu B", size);
+    return result;
+}
+
+bool ConvertCharsToUnicode(std::wstring *outStr, const std::string &s, unsigned codePage)
+{
+    if (s.empty())
+    {
+        outStr->clear();
+        return true;
+    }
+
+    // Phase 1 - Get buffer size.
+    const int size = MultiByteToWideChar(codePage, 0, s.data(), (int)s.length(), NULL, 0);
+    if (size == 0)
+    {
+        outStr->clear();
+        return false;
+    }
+
+    // Phase 2 - Do conversion.
+    std::unique_ptr<wchar_t[]> buf(new wchar_t[(size_t)size]);
+    int result = MultiByteToWideChar(codePage, 0, s.data(), (int)s.length(), buf.get(), size);
+    if (result == 0)
+    {
+        outStr->clear();
+        return false;
+    }
+
+    outStr->assign(buf.get(), (size_t)size);
+    return true;
+}
+
+bool ConvertCharsToUnicode(std::wstring *outStr, const char *s, size_t sCharCount, unsigned codePage)
+{
+    if (sCharCount == 0)
+    {
+        outStr->clear();
+        return true;
+    }
+
+    assert(sCharCount <= (size_t)INT_MAX);
+
+    // Phase 1 - Get buffer size.
+    int size = MultiByteToWideChar(codePage, 0, s, (int)sCharCount, NULL, 0);
+    if (size == 0)
+    {
+        outStr->clear();
+        return false;
+    }
+
+    // Phase 2 - Do conversion.
+    std::unique_ptr<wchar_t[]> buf(new wchar_t[(size_t)size]);
+    int result = MultiByteToWideChar(codePage, 0, s, (int)sCharCount, buf.get(), size);
+    if (result == 0)
+    {
+        outStr->clear();
+        return false;
+    }
+
+    outStr->assign(buf.get(), (size_t)size);
+    return true;
+}
+
+const wchar_t* PhysicalDeviceTypeToStr(VkPhysicalDeviceType type)
+{
+    // Skipping common prefix VK_PHYSICAL_DEVICE_TYPE_
+    static const wchar_t* const VALUES[] = {
+        L"OTHER",
+        L"INTEGRATED_GPU",
+        L"DISCRETE_GPU",
+        L"VIRTUAL_GPU",
+        L"CPU",
+    };
+    return (uint32_t)type < _countof(VALUES) ? VALUES[(uint32_t)type] : L"";
+}
+
+const wchar_t* VendorIDToStr(uint32_t vendorID)
+{
+    switch(vendorID)
+    {
+    // Skipping common prefix VK_VENDOR_ID_ for these:
+    case 0x10001: return L"VIV";
+    case 0x10002: return L"VSI";
+    case 0x10003: return L"KAZAN";
+    case 0x10004: return L"CODEPLAY";
+    case 0x10005: return L"MESA";
+    case 0x10006: return L"POCL";
+    // Others...
+    case VENDOR_ID_AMD: return L"AMD";
+    case VENDOR_ID_NVIDIA: return L"NVIDIA";
+    case VENDOR_ID_INTEL: return L"Intel";
+    case 0x1010: return L"ImgTec";
+    case 0x13B5: return L"ARM";
+    case 0x5143: return L"Qualcomm";
+    }
+    return L"";
+}
+
+#if VMA_VULKAN_VERSION >= 1002000
+const wchar_t* DriverIDToStr(VkDriverId driverID)
+{
+    // Skipping common prefix VK_DRIVER_ID_
+    static const wchar_t* const VALUES[] = {
+        L"",
+        L"AMD_PROPRIETARY",
+        L"AMD_OPEN_SOURCE",
+        L"MESA_RADV",
+        L"NVIDIA_PROPRIETARY",
+        L"INTEL_PROPRIETARY_WINDOWS",
+        L"INTEL_OPEN_SOURCE_MESA",
+        L"IMAGINATION_PROPRIETARY",
+        L"QUALCOMM_PROPRIETARY",
+        L"ARM_PROPRIETARY",
+        L"GOOGLE_SWIFTSHADER",
+        L"GGP_PROPRIETARY",
+        L"BROADCOM_PROPRIETARY",
+        L"MESA_LLVMPIPE",
+        L"MOLTENVK",
+    };
+    return (uint32_t)driverID < _countof(VALUES) ? VALUES[(uint32_t)driverID] : L"";
+}
+#endif // #if VMA_VULKAN_VERSION >= 1002000
+
+
 #endif // #ifdef _WIN32
diff --git a/third_party/vulkan_memory_allocator/src/Common.h b/third_party/vulkan_memory_allocator/src/Common.h
index 3d4f3b1..4e2a0dd 100644
--- a/third_party/vulkan_memory_allocator/src/Common.h
+++ b/third_party/vulkan_memory_allocator/src/Common.h
@@ -1,5 +1,5 @@
 //
-// Copyright (c) 2017-2020 Advanced Micro Devices, Inc. All rights reserved.
+// Copyright (c) 2017-2021 Advanced Micro Devices, Inc. All rights reserved.
 //
 // Permission is hereby granted, free of charge, to any person obtaining a copy
 // of this software and associated documentation files (the "Software"), to deal
@@ -48,28 +48,27 @@
 typedef std::chrono::high_resolution_clock::time_point time_point;
 typedef std::chrono::high_resolution_clock::duration duration;
 
-#ifdef _DEBUG
-    #define TEST(expr) do { \
-            if(!(expr)) { \
-                assert(0 && #expr); \
-            } \
-        } while(0)
-#else
-    #define TEST(expr) do { \
-            if(!(expr)) { \
-                throw std::runtime_error("TEST FAILED: " #expr); \
-            } \
-        } while(0)
-#endif
+#define STRINGIZE(x) STRINGIZE2(x)
+#define STRINGIZE2(x) #x
+#define LINE_STRING STRINGIZE(__LINE__)
+#define TEST(expr)  do { if(!(expr)) { \
+        assert(0 && #expr); \
+        throw std::runtime_error(__FILE__ "(" LINE_STRING "): ( " #expr " ) == false"); \
+    } } while(false)
+#define ERR_GUARD_VULKAN(expr)  do { if((expr) < 0) { \
+        assert(0 && #expr); \
+        throw std::runtime_error(__FILE__ "(" LINE_STRING "): VkResult( " #expr " ) < 0"); \
+    } } while(false)
 
-#define ERR_GUARD_VULKAN(expr) TEST((expr) >= 0)
+static const uint32_t VENDOR_ID_AMD = 0x1002;
+static const uint32_t VENDOR_ID_NVIDIA = 0x10DE;
+static const uint32_t VENDOR_ID_INTEL = 0x8086;
 
 extern VkInstance g_hVulkanInstance;
 extern VkPhysicalDevice g_hPhysicalDevice;
 extern VkDevice g_hDevice;
 extern VkInstance g_hVulkanInstance;
 extern VmaAllocator g_hAllocator;
-extern bool g_MemoryAliasingWarningEnabled;
 extern bool VK_AMD_device_coherent_memory_enabled;
 
 void SetAllocatorCreateInfo(VmaAllocatorCreateInfo& outInfo);
@@ -323,6 +322,18 @@
 
 void SaveFile(const wchar_t* filePath, const void* data, size_t dataSize);
 
+std::wstring SizeToStr(size_t size);
+// As codePage use e.g. CP_ACP for native Windows 1-byte codepage or CP_UTF8.
+bool ConvertCharsToUnicode(std::wstring *outStr, const std::string &s, unsigned codePage);
+bool ConvertCharsToUnicode(std::wstring *outStr, const char *s, size_t sCharCount, unsigned codePage);
+
+const wchar_t* PhysicalDeviceTypeToStr(VkPhysicalDeviceType type);
+const wchar_t* VendorIDToStr(uint32_t vendorID);
+
+#if VMA_VULKAN_VERSION >= 1002000
+const wchar_t* DriverIDToStr(VkDriverId driverID);
+#endif
+
 #endif // #ifdef _WIN32
 
 #endif
diff --git a/third_party/vulkan_memory_allocator/src/Shaders/CMakeLists.txt b/third_party/vulkan_memory_allocator/src/Shaders/CMakeLists.txt
new file mode 100644
index 0000000..f85ab78
--- /dev/null
+++ b/third_party/vulkan_memory_allocator/src/Shaders/CMakeLists.txt
@@ -0,0 +1,32 @@
+# This file will only be executed if VMA_BUILD_SAMPLE_SHADERS is set to ON
+
+find_program(GLSL_VALIDATOR glslangValidator REQUIRED)
+
+if(NOT GLSL_VALIDATOR)
+    message(FATAL_ERROR "glslangValidator not found!")
+endif()
+
+set(SHADERS
+    Shader.vert
+    Shader.frag
+    SparseBindingTest.comp
+)
+
+# Compile each shader using glslangValidator
+foreach(SHADER ${SHADERS})
+    get_filename_component(FILE_NAME ${SHADER} NAME)
+    
+    # Put the .spv files into the bin folder
+    set(SPIRV ${PROJECT_SOURCE_DIR}/bin/${FILE_NAME}.spv)
+
+    add_custom_command(
+        OUTPUT ${SPIRV}
+        # Use the same file name and append .spv to the compiled shader
+        COMMAND ${GLSL_VALIDATOR} -V ${CMAKE_CURRENT_SOURCE_DIR}/${SHADER} -o ${SPIRV}
+        DEPENDS ${SHADER}
+    )
+
+    list(APPEND SPIRV_FILES ${SPIRV})
+endforeach()
+
+add_custom_target(VmaSampleShaders ALL DEPENDS ${SPIRV_FILES})
diff --git a/third_party/vulkan_memory_allocator/src/Shaders/Shader.frag b/third_party/vulkan_memory_allocator/src/Shaders/Shader.frag
index 6c32d89..daf5888 100644
--- a/third_party/vulkan_memory_allocator/src/Shaders/Shader.frag
+++ b/third_party/vulkan_memory_allocator/src/Shaders/Shader.frag
@@ -1,5 +1,5 @@
 //
-// Copyright (c) 2017-2020 Advanced Micro Devices, Inc. All rights reserved.
+// Copyright (c) 2017-2021 Advanced Micro Devices, Inc. All rights reserved.
 //
 // Permission is hereby granted, free of charge, to any person obtaining a copy
 // of this software and associated documentation files (the "Software"), to deal
diff --git a/third_party/vulkan_memory_allocator/src/Shaders/Shader.vert b/third_party/vulkan_memory_allocator/src/Shaders/Shader.vert
index 8349579..7652943 100644
--- a/third_party/vulkan_memory_allocator/src/Shaders/Shader.vert
+++ b/third_party/vulkan_memory_allocator/src/Shaders/Shader.vert
@@ -1,5 +1,5 @@
 //
-// Copyright (c) 2017-2020 Advanced Micro Devices, Inc. All rights reserved.
+// Copyright (c) 2017-2021 Advanced Micro Devices, Inc. All rights reserved.
 //
 // Permission is hereby granted, free of charge, to any person obtaining a copy
 // of this software and associated documentation files (the "Software"), to deal
diff --git a/third_party/vulkan_memory_allocator/src/Shaders/SparseBindingTest.comp b/third_party/vulkan_memory_allocator/src/Shaders/SparseBindingTest.comp
index 102637d..1e7d63b 100644
--- a/third_party/vulkan_memory_allocator/src/Shaders/SparseBindingTest.comp
+++ b/third_party/vulkan_memory_allocator/src/Shaders/SparseBindingTest.comp
@@ -1,5 +1,5 @@
 //
-// Copyright (c) 2018-2020 Advanced Micro Devices, Inc. All rights reserved.
+// Copyright (c) 2018-2021 Advanced Micro Devices, Inc. All rights reserved.
 //
 // Permission is hereby granted, free of charge, to any person obtaining a copy
 // of this software and associated documentation files (the "Software"), to deal
diff --git a/third_party/vulkan_memory_allocator/src/SparseBindingTest.cpp b/third_party/vulkan_memory_allocator/src/SparseBindingTest.cpp
index 4562cf4..0430a1b 100644
--- a/third_party/vulkan_memory_allocator/src/SparseBindingTest.cpp
+++ b/third_party/vulkan_memory_allocator/src/SparseBindingTest.cpp
@@ -1,5 +1,5 @@
 //
-// Copyright (c) 2017-2020 Advanced Micro Devices, Inc. All rights reserved.
+// Copyright (c) 2017-2021 Advanced Micro Devices, Inc. All rights reserved.
 //
 // Permission is hereby granted, free of charge, to any person obtaining a copy
 // of this software and associated documentation files (the "Software"), to deal
@@ -532,6 +532,8 @@
 
 void TestSparseBinding()
 {
+    wprintf(L"TESTING SPARSE BINDING:\n");
+
     struct ImageInfo
     {
         std::unique_ptr<BaseImage> image;
@@ -545,7 +547,7 @@
 
     RandomNumberGenerator rand(4652467);
 
-    for(uint32_t i = 0; i < frameCount; ++i)
+    for(uint32_t frameIndex = 0; frameIndex < frameCount; ++frameIndex)
     {
         // Bump frame index.
         ++g_FrameIndex;
@@ -560,11 +562,11 @@
         images.push_back(std::move(imageInfo));
 
         // Delete all images that expired.
-        for(size_t i = images.size(); i--; )
+        for(size_t imageIndex = images.size(); imageIndex--; )
         {
-            if(g_FrameIndex >= images[i].endFrame)
+            if(g_FrameIndex >= images[imageIndex].endFrame)
             {
-                images.erase(images.begin() + i);
+                images.erase(images.begin() + imageIndex);
             }
         }
     }
@@ -588,6 +590,8 @@
 
     // Free remaining images.
     images.clear();
+
+    wprintf(L"Done.\n");
 }
 
 #endif // #ifdef _WIN32
diff --git a/third_party/vulkan_memory_allocator/src/SparseBindingTest.h b/third_party/vulkan_memory_allocator/src/SparseBindingTest.h
index 05a6aa8..33dbd35 100644
--- a/third_party/vulkan_memory_allocator/src/SparseBindingTest.h
+++ b/third_party/vulkan_memory_allocator/src/SparseBindingTest.h
@@ -1,5 +1,5 @@
 //
-// Copyright (c) 2017-2020 Advanced Micro Devices, Inc. All rights reserved.
+// Copyright (c) 2017-2021 Advanced Micro Devices, Inc. All rights reserved.
 //
 // Permission is hereby granted, free of charge, to any person obtaining a copy
 // of this software and associated documentation files (the "Software"), to deal
diff --git a/third_party/vulkan_memory_allocator/src/Tests.cpp b/third_party/vulkan_memory_allocator/src/Tests.cpp
index ee5fae1..be547f7 100644
--- a/third_party/vulkan_memory_allocator/src/Tests.cpp
+++ b/third_party/vulkan_memory_allocator/src/Tests.cpp
@@ -1,5 +1,5 @@
 //
-// Copyright (c) 2017-2020 Advanced Micro Devices, Inc. All rights reserved.
+// Copyright (c) 2017-2021 Advanced Micro Devices, Inc. All rights reserved.
 //
 // Permission is hereby granted, free of charge, to any person obtaining a copy
 // of this software and associated documentation files (the "Software"), to deal
@@ -34,10 +34,12 @@
 
 extern VkCommandBuffer g_hTemporaryCommandBuffer;
 extern const VkAllocationCallbacks* g_Allocs;
-extern bool g_BufferDeviceAddressEnabled;
-extern PFN_vkGetBufferDeviceAddressEXT g_vkGetBufferDeviceAddressEXT;
+extern bool VK_KHR_buffer_device_address_enabled;
+extern bool VK_EXT_memory_priority_enabled;
+extern PFN_vkGetBufferDeviceAddressKHR g_vkGetBufferDeviceAddressKHR;
 void BeginSingleTimeCommands();
 void EndSingleTimeCommands();
+void SetDebugUtilsObjectName(VkObjectType type, uint64_t handle, const char* name);
 
 #ifndef VMA_DEBUG_MARGIN
     #define VMA_DEBUG_MARGIN 0
@@ -1720,7 +1722,6 @@
 static void TestDefragmentationGpu()
 {
     wprintf(L"Test defragmentation GPU\n");
-    g_MemoryAliasingWarningEnabled = false;
 
     std::vector<AllocInfo> allocations;
 
@@ -1854,8 +1855,6 @@
     {
         allocations[i].Destroy();
     }
-
-    g_MemoryAliasingWarningEnabled = true;
 }
 
 static void ProcessDefragmentationStepInfo(VmaDefragmentationPassInfo &stepInfo)
@@ -2043,7 +2042,6 @@
 static void TestDefragmentationIncrementalBasic()
 {
     wprintf(L"Test defragmentation incremental basic\n");
-    g_MemoryAliasingWarningEnabled = false;
 
     std::vector<AllocInfo> allocations;
 
@@ -2223,15 +2221,12 @@
     {
         allocations[i].Destroy();
     }
-
-    g_MemoryAliasingWarningEnabled = true;
 }
 
 void TestDefragmentationIncrementalComplex()
 {
     wprintf(L"Test defragmentation incremental complex\n");
-    g_MemoryAliasingWarningEnabled = false;
-
+    
     std::vector<AllocInfo> allocations;
 
     // Create that many allocations to surely fill 3 new blocks of 256 MB.
@@ -2438,8 +2433,6 @@
     {
         additionalAllocations[i].Destroy();
     }
-
-    g_MemoryAliasingWarningEnabled = true;
 }
 
 
@@ -2641,6 +2634,8 @@
 
 static void TestBasics()
 {
+    wprintf(L"Test basics\n");
+
     VkResult res;
 
     TestGetAllocatorInfo();
@@ -2691,6 +2686,41 @@
     TestInvalidAllocations();
 }
 
+static void TestAllocationVersusResourceSize()
+{
+    wprintf(L"Test allocation versus resource size\n");
+
+    VkBufferCreateInfo bufCreateInfo = { VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO };
+    bufCreateInfo.size = 22921; // Prime number
+    bufCreateInfo.usage = VK_BUFFER_USAGE_TRANSFER_SRC_BIT | VK_BUFFER_USAGE_TRANSFER_DST_BIT;
+
+    VmaAllocationCreateInfo allocCreateInfo = {};
+    allocCreateInfo.usage = VMA_MEMORY_USAGE_CPU_ONLY;
+
+    for(uint32_t i = 0; i < 2; ++i)
+    {
+        allocCreateInfo.flags = (i == 1) ? VMA_ALLOCATION_CREATE_DEDICATED_MEMORY_BIT : 0;
+
+        AllocInfo info;
+        info.CreateBuffer(bufCreateInfo, allocCreateInfo);
+        
+        VmaAllocationInfo allocInfo = {};
+        vmaGetAllocationInfo(g_hAllocator, info.m_Allocation, &allocInfo);
+        //wprintf(L"  Buffer size = %llu, allocation size = %llu\n", bufCreateInfo.size, allocInfo.size);
+
+        // Map and test accessing entire area of the allocation, not only the buffer.
+        void* mappedPtr = nullptr;
+        VkResult res = vmaMapMemory(g_hAllocator, info.m_Allocation, &mappedPtr);
+        TEST(res == VK_SUCCESS);
+
+        memset(mappedPtr, 0xCC, (size_t)allocInfo.size);
+
+        vmaUnmapMemory(g_hAllocator, info.m_Allocation);
+
+        info.Destroy();
+    }
+}
+
 static void TestPool_MinBlockCount()
 {
 #if defined(VMA_DEBUG_MARGIN) && VMA_DEBUG_MARGIN > 0
@@ -3772,7 +3802,7 @@
 {
     wprintf(L"Test buffer device address\n");
 
-    assert(g_BufferDeviceAddressEnabled);
+    assert(VK_KHR_buffer_device_address_enabled);
 
     VkBufferCreateInfo bufCreateInfo = { VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO };
     bufCreateInfo.size = 0x10000;
@@ -3795,12 +3825,40 @@
 
         VkBufferDeviceAddressInfoEXT bufferDeviceAddressInfo = { VK_STRUCTURE_TYPE_BUFFER_DEVICE_ADDRESS_INFO_EXT };
         bufferDeviceAddressInfo.buffer = bufInfo.Buffer;
-        //assert(g_vkGetBufferDeviceAddressEXT != nullptr);
-        if(g_vkGetBufferDeviceAddressEXT != nullptr)
-        {
-            VkDeviceAddress addr = g_vkGetBufferDeviceAddressEXT(g_hDevice, &bufferDeviceAddressInfo);
-            TEST(addr != 0);
-        }
+        TEST(g_vkGetBufferDeviceAddressKHR != nullptr);
+        VkDeviceAddress addr = g_vkGetBufferDeviceAddressKHR(g_hDevice, &bufferDeviceAddressInfo);
+        TEST(addr != 0);
+
+        vmaDestroyBuffer(g_hAllocator, bufInfo.Buffer, bufInfo.Allocation);
+    }
+}
+
+static void TestMemoryPriority()
+{
+    wprintf(L"Test memory priority\n");
+
+    assert(VK_EXT_memory_priority_enabled);
+
+    VkBufferCreateInfo bufCreateInfo = { VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO };
+    bufCreateInfo.size = 0x10000;
+    bufCreateInfo.usage = VK_BUFFER_USAGE_TRANSFER_DST_BIT | VK_BUFFER_USAGE_VERTEX_BUFFER_BIT;
+
+    VmaAllocationCreateInfo allocCreateInfo = {};
+    allocCreateInfo.usage = VMA_MEMORY_USAGE_GPU_ONLY;
+    allocCreateInfo.priority = 1.f;
+
+    for(uint32_t testIndex = 0; testIndex < 2; ++testIndex)
+    {
+        // 1st is placed, 2nd is dedicated.
+        if(testIndex == 1)
+            allocCreateInfo.flags |= VMA_ALLOCATION_CREATE_DEDICATED_MEMORY_BIT;
+
+        BufferInfo bufInfo = {};
+        VkResult res = vmaCreateBuffer(g_hAllocator, &bufCreateInfo, &allocCreateInfo,
+            &bufInfo.Buffer, &bufInfo.Allocation, nullptr);
+        TEST(res == VK_SUCCESS);
+
+        // There is nothing we can do to validate the priority.
 
         vmaDestroyBuffer(g_hAllocator, bufInfo.Buffer, bufInfo.Allocation);
     }
@@ -4287,27 +4345,27 @@
             return sum + allocSize.Probability;
         });
 
-    VkBufferCreateInfo bufferInfo = { VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO };
-    bufferInfo.size = 256; // Whatever.
-    bufferInfo.usage = VK_BUFFER_USAGE_VERTEX_BUFFER_BIT | VK_BUFFER_USAGE_INDEX_BUFFER_BIT | VK_BUFFER_USAGE_TRANSFER_DST_BIT;
+    VkBufferCreateInfo bufferTemplateInfo = { VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO };
+    bufferTemplateInfo.size = 256; // Whatever.
+    bufferTemplateInfo.usage = VK_BUFFER_USAGE_VERTEX_BUFFER_BIT | VK_BUFFER_USAGE_INDEX_BUFFER_BIT | VK_BUFFER_USAGE_TRANSFER_DST_BIT;
 
-    VkImageCreateInfo imageInfo = { VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO };
-    imageInfo.imageType = VK_IMAGE_TYPE_2D;
-    imageInfo.extent.width = 256; // Whatever.
-    imageInfo.extent.height = 256; // Whatever.
-    imageInfo.extent.depth = 1;
-    imageInfo.mipLevels = 1;
-    imageInfo.arrayLayers = 1;
-    imageInfo.format = VK_FORMAT_R8G8B8A8_UNORM;
-    imageInfo.tiling = VK_IMAGE_TILING_OPTIMAL; // LINEAR if CPU memory.
-    imageInfo.initialLayout = VK_IMAGE_LAYOUT_PREINITIALIZED;
-    imageInfo.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_SAMPLED_BIT; // TRANSFER_SRC if CPU memory.
-    imageInfo.samples = VK_SAMPLE_COUNT_1_BIT;
+    VkImageCreateInfo imageTemplateInfo = { VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO };
+    imageTemplateInfo.imageType = VK_IMAGE_TYPE_2D;
+    imageTemplateInfo.extent.width = 256; // Whatever.
+    imageTemplateInfo.extent.height = 256; // Whatever.
+    imageTemplateInfo.extent.depth = 1;
+    imageTemplateInfo.mipLevels = 1;
+    imageTemplateInfo.arrayLayers = 1;
+    imageTemplateInfo.format = VK_FORMAT_R8G8B8A8_UNORM;
+    imageTemplateInfo.tiling = VK_IMAGE_TILING_OPTIMAL; // LINEAR if CPU memory.
+    imageTemplateInfo.initialLayout = VK_IMAGE_LAYOUT_PREINITIALIZED;
+    imageTemplateInfo.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_SAMPLED_BIT; // TRANSFER_SRC if CPU memory.
+    imageTemplateInfo.samples = VK_SAMPLE_COUNT_1_BIT;
 
     uint32_t bufferMemoryTypeBits = UINT32_MAX;
     {
         VkBuffer dummyBuffer;
-        VkResult res = vkCreateBuffer(g_hDevice, &bufferInfo, g_Allocs, &dummyBuffer);
+        VkResult res = vkCreateBuffer(g_hDevice, &bufferTemplateInfo, g_Allocs, &dummyBuffer);
         TEST(res == VK_SUCCESS);
 
         VkMemoryRequirements memReq;
@@ -4320,7 +4378,7 @@
     uint32_t imageMemoryTypeBits = UINT32_MAX;
     {
         VkImage dummyImage;
-        VkResult res = vkCreateImage(g_hDevice, &imageInfo, g_Allocs, &dummyImage);
+        VkResult res = vkCreateImage(g_hDevice, &imageTemplateInfo, g_Allocs, &dummyImage);
         TEST(res == VK_SUCCESS);
 
         VkMemoryRequirements memReq;
@@ -4348,32 +4406,67 @@
         TEST(0);
 
     VmaPoolCreateInfo poolCreateInfo = {};
-    poolCreateInfo.memoryTypeIndex = 0;
     poolCreateInfo.minBlockCount = 1;
     poolCreateInfo.maxBlockCount = 1;
     poolCreateInfo.blockSize = config.PoolSize;
     poolCreateInfo.frameInUseCount = 1;
 
-    VmaAllocationCreateInfo dummyAllocCreateInfo = {};
-    dummyAllocCreateInfo.usage = VMA_MEMORY_USAGE_GPU_ONLY;
-    vmaFindMemoryTypeIndex(g_hAllocator, memoryTypeBits, &dummyAllocCreateInfo, &poolCreateInfo.memoryTypeIndex);
+    const VkPhysicalDeviceMemoryProperties* memProps = nullptr;
+    vmaGetMemoryProperties(g_hAllocator, &memProps);
 
-    VmaPool pool;
-    VkResult res = vmaCreatePool(g_hAllocator, &poolCreateInfo, &pool);
-    TEST(res == VK_SUCCESS);
+    VmaPool pool = VK_NULL_HANDLE;
+    VkResult res;
+    // Loop over memory types because we sometimes allocate a big block here,
+    // while the most eligible DEVICE_LOCAL heap may be only 256 MB on some GPUs.
+    while(memoryTypeBits)
+    {
+        VmaAllocationCreateInfo dummyAllocCreateInfo = {};
+        dummyAllocCreateInfo.usage = VMA_MEMORY_USAGE_GPU_ONLY;
+        vmaFindMemoryTypeIndex(g_hAllocator, memoryTypeBits, &dummyAllocCreateInfo, &poolCreateInfo.memoryTypeIndex);
+
+        const uint32_t heapIndex = memProps->memoryTypes[poolCreateInfo.memoryTypeIndex].heapIndex;
+        // Protection against validation layer error when trying to allocate a block larger than entire heap size,
+        // which may be only 256 MB on some platforms.
+        if(poolCreateInfo.blockSize * poolCreateInfo.minBlockCount < memProps->memoryHeaps[heapIndex].size)
+        {
+            res = vmaCreatePool(g_hAllocator, &poolCreateInfo, &pool);
+            if(res == VK_SUCCESS)
+                break;
+        }
+        memoryTypeBits &= ~(1u << poolCreateInfo.memoryTypeIndex);
+    }
+    TEST(pool);
 
     // Start time measurement - after creating pool and initializing data structures.
     time_point timeBeg = std::chrono::high_resolution_clock::now();
 
     ////////////////////////////////////////////////////////////////////////////////
     // ThreadProc
-    auto ThreadProc = [&](
+    auto ThreadProc = [&config, allocationSizeProbabilitySum, pool](
         PoolTestThreadResult* outThreadResult,
         uint32_t randSeed,
         HANDLE frameStartEvent,
         HANDLE frameEndEvent) -> void
     {
         RandomNumberGenerator threadRand{randSeed};
+        VkResult res = VK_SUCCESS;
+
+        VkBufferCreateInfo bufferInfo = { VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO };
+        bufferInfo.size = 256; // Whatever.
+        bufferInfo.usage = VK_BUFFER_USAGE_VERTEX_BUFFER_BIT | VK_BUFFER_USAGE_INDEX_BUFFER_BIT | VK_BUFFER_USAGE_TRANSFER_DST_BIT;
+
+        VkImageCreateInfo imageInfo = { VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO };
+        imageInfo.imageType = VK_IMAGE_TYPE_2D;
+        imageInfo.extent.width = 256; // Whatever.
+        imageInfo.extent.height = 256; // Whatever.
+        imageInfo.extent.depth = 1;
+        imageInfo.mipLevels = 1;
+        imageInfo.arrayLayers = 1;
+        imageInfo.format = VK_FORMAT_R8G8B8A8_UNORM;
+        imageInfo.tiling = VK_IMAGE_TILING_OPTIMAL; // LINEAR if CPU memory.
+        imageInfo.initialLayout = VK_IMAGE_LAYOUT_PREINITIALIZED;
+        imageInfo.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_SAMPLED_BIT; // TRANSFER_SRC if CPU memory.
+        imageInfo.samples = VK_SAMPLE_COUNT_1_BIT;
 
         outThreadResult->AllocationTimeMin = duration::max();
         outThreadResult->AllocationTimeSum = duration::zero();
@@ -4390,16 +4483,62 @@
 
         struct Item
         {
-            VkDeviceSize BufferSize;
-            VkExtent2D ImageSize;
-            VkBuffer Buf;
-            VkImage Image;
-            VmaAllocation Alloc;
+            VkDeviceSize BufferSize = 0;
+            VkExtent2D ImageSize = { 0, 0 };
+            VkBuffer Buf = VK_NULL_HANDLE;
+            VkImage Image = VK_NULL_HANDLE;
+            VmaAllocation Alloc = VK_NULL_HANDLE;
             
+            Item() { }
+            Item(Item&& src) :
+                BufferSize(src.BufferSize), ImageSize(src.ImageSize), Buf(src.Buf), Image(src.Image), Alloc(src.Alloc)
+            {
+                src.BufferSize = 0;
+                src.ImageSize = {0, 0};
+                src.Buf = VK_NULL_HANDLE;
+                src.Image = VK_NULL_HANDLE;
+                src.Alloc = VK_NULL_HANDLE;
+            }
+            Item(const Item& src) = delete;
+            ~Item()
+            {
+                DestroyResources();
+            }
+            Item& operator=(Item&& src)
+            {
+                if(&src != this)
+                {
+                    DestroyResources();
+                    BufferSize = src.BufferSize; ImageSize = src.ImageSize;
+                    Buf = src.Buf; Image = src.Image; Alloc = src.Alloc;
+                    src.BufferSize = 0;
+                    src.ImageSize = {0, 0};
+                    src.Buf = VK_NULL_HANDLE;
+                    src.Image = VK_NULL_HANDLE;
+                    src.Alloc = VK_NULL_HANDLE;
+                }
+                return *this;
+            }
+            Item& operator=(const Item& src) = delete;
+            void DestroyResources()
+            {
+                if(Buf)
+                {
+                    assert(Image == VK_NULL_HANDLE);
+                    vmaDestroyBuffer(g_hAllocator, Buf, Alloc);
+                    Buf = VK_NULL_HANDLE;
+                }
+                else
+                {
+                    vmaDestroyImage(g_hAllocator, Image, Alloc);
+                    Image = VK_NULL_HANDLE;
+                }
+                Alloc = VK_NULL_HANDLE;
+            }
             VkDeviceSize CalcSizeBytes() const
             {
                 return BufferSize +
-                    ImageSize.width * ImageSize.height * 4;
+                    4ull * ImageSize.width * ImageSize.height;
             }
         };
         std::vector<Item> unusedItems, usedItems;
@@ -4441,11 +4580,13 @@
                 }
             }
 
-            unusedItems.push_back(item);
+            unusedItems.push_back(std::move(item));
         }
 
         auto Allocate = [&](Item& item) -> VkResult
         {
+            assert(item.Buf == VK_NULL_HANDLE && item.Image == VK_NULL_HANDLE && item.Alloc == VK_NULL_HANDLE);
+
             VmaAllocationCreateInfo allocCreateInfo = {};
             allocCreateInfo.pool = pool;
             allocCreateInfo.flags = VMA_ALLOCATION_CREATE_CAN_BECOME_LOST_BIT |
@@ -4454,8 +4595,14 @@
             if(item.BufferSize)
             {
                 bufferInfo.size = item.BufferSize;
-                PoolAllocationTimeRegisterObj timeRegisterObj(*outThreadResult);
-                return vmaCreateBuffer(g_hAllocator, &bufferInfo, &allocCreateInfo, &item.Buf, &item.Alloc, nullptr);
+                VkResult res = VK_SUCCESS;
+                {
+                    PoolAllocationTimeRegisterObj timeRegisterObj(*outThreadResult);
+                    res = vmaCreateBuffer(g_hAllocator, &bufferInfo, &allocCreateInfo, &item.Buf, &item.Alloc, nullptr);
+                }
+                if(res == VK_SUCCESS)
+                    SetDebugUtilsObjectName(VK_OBJECT_TYPE_BUFFER, (uint64_t)item.Buf, "TestPool_Benchmark_Buffer");
+                return res;
             }
             else
             {
@@ -4463,8 +4610,14 @@
 
                 imageInfo.extent.width = item.ImageSize.width;
                 imageInfo.extent.height = item.ImageSize.height;
-                PoolAllocationTimeRegisterObj timeRegisterObj(*outThreadResult);
-                return vmaCreateImage(g_hAllocator, &imageInfo, &allocCreateInfo, &item.Image, &item.Alloc, nullptr);
+                VkResult res = VK_SUCCESS;
+                {
+                    PoolAllocationTimeRegisterObj timeRegisterObj(*outThreadResult);
+                    res = vmaCreateImage(g_hAllocator, &imageInfo, &allocCreateInfo, &item.Image, &item.Alloc, nullptr);
+                }
+                if(res == VK_SUCCESS)
+                    SetDebugUtilsObjectName(VK_OBJECT_TYPE_IMAGE, (uint64_t)item.Image, "TestPool_Benchmark_Image");
+                return res;
             }
         };
 
@@ -4479,8 +4632,10 @@
             for(size_t i = 0; i < bufsToMakeUnused; ++i)
             {
                 size_t index = threadRand.Generate() % usedItems.size();
-                unusedItems.push_back(usedItems[index]);
-                usedItems.erase(usedItems.begin() + index);
+                auto it = usedItems.begin() + index;
+                Item item = std::move(*it);
+                usedItems.erase(it);
+                unusedItems.push_back(std::move(item));
             }
 
             // Determine which bufs we want to use in this frame.
@@ -4491,15 +4646,19 @@
             while(usedBufCount < usedItems.size())
             {
                 size_t index = threadRand.Generate() % usedItems.size();
-                unusedItems.push_back(usedItems[index]);
-                usedItems.erase(usedItems.begin() + index);
+                auto it = usedItems.begin() + index;
+                Item item = std::move(*it);
+                usedItems.erase(it);
+                unusedItems.push_back(std::move(item));
             }
             // Move some unused to used.
             while(usedBufCount > usedItems.size())
             {
                 size_t index = threadRand.Generate() % unusedItems.size();
-                usedItems.push_back(unusedItems[index]);
-                unusedItems.erase(unusedItems.begin() + index);
+                auto it = unusedItems.begin() + index;
+                Item item = std::move(*it);
+                unusedItems.erase(it);
+                usedItems.push_back(std::move(item));
             }
 
             uint32_t touchExistingCount = 0;
@@ -4518,8 +4677,7 @@
                     ++outThreadResult->AllocationCount;
                     if(res != VK_SUCCESS)
                     {
-                        item.Alloc = VK_NULL_HANDLE;
-                        item.Buf = VK_NULL_HANDLE;
+                        assert(item.Alloc == VK_NULL_HANDLE && item.Buf == VK_NULL_HANDLE && item.Image == VK_NULL_HANDLE);
                         ++outThreadResult->FailedAllocationCount;
                         outThreadResult->FailedAllocationTotalSize += item.CalcSizeBytes();
                         ++createFailedCount;
@@ -4540,14 +4698,9 @@
                         // Destroy.
                         {
                             PoolDeallocationTimeRegisterObj timeRegisterObj(*outThreadResult);
-                            if(item.Buf)
-                                vmaDestroyBuffer(g_hAllocator, item.Buf, item.Alloc);
-                            else
-                                vmaDestroyImage(g_hAllocator, item.Image, item.Alloc);
+                            item.DestroyResources();
                             ++outThreadResult->DeallocationCount;
                         }
-                        item.Alloc = VK_NULL_HANDLE;
-                        item.Buf = VK_NULL_HANDLE;
 
                         ++outThreadResult->LostAllocationCount;
                         outThreadResult->LostAllocationTotalSize += item.CalcSizeBytes();
@@ -4558,6 +4711,7 @@
                         // Creation failed.
                         if(res != VK_SUCCESS)
                         {
+                            TEST(item.Alloc == VK_NULL_HANDLE && item.Buf == VK_NULL_HANDLE && item.Image == VK_NULL_HANDLE);
                             ++outThreadResult->FailedAllocationCount;
                             outThreadResult->FailedAllocationTotalSize += item.CalcSizeBytes();
                             ++createFailedCount;
@@ -4584,19 +4738,13 @@
         for(size_t i = usedItems.size(); i--; )
         {
             PoolDeallocationTimeRegisterObj timeRegisterObj(*outThreadResult);
-            if(usedItems[i].Buf)
-                vmaDestroyBuffer(g_hAllocator, usedItems[i].Buf, usedItems[i].Alloc);
-            else
-                vmaDestroyImage(g_hAllocator, usedItems[i].Image, usedItems[i].Alloc);
+            usedItems[i].DestroyResources();
             ++outThreadResult->DeallocationCount;
         }
         for(size_t i = unusedItems.size(); i--; )
         {
             PoolDeallocationTimeRegisterObj timeRegisterOb(*outThreadResult);
-            if(unusedItems[i].Buf)
-                vmaDestroyBuffer(g_hAllocator, unusedItems[i].Buf, unusedItems[i].Alloc);
-            else
-                vmaDestroyImage(g_hAllocator, unusedItems[i].Image, unusedItems[i].Alloc);
+            unusedItems[i].DestroyResources();
             ++outThreadResult->DeallocationCount;
         }
     };
@@ -5059,6 +5207,87 @@
     }
 }
 
+static void TestAliasing()
+{
+    wprintf(L"Testing aliasing...\n");
+
+    /*
+    This is just a simple test, more like a code sample to demonstrate it's possible.
+    */
+
+    // A 512x512 texture to be sampled.
+    VkImageCreateInfo img1CreateInfo = { VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO };
+    img1CreateInfo.imageType = VK_IMAGE_TYPE_2D;
+    img1CreateInfo.extent.width = 512;
+    img1CreateInfo.extent.height = 512;
+    img1CreateInfo.extent.depth = 1;
+    img1CreateInfo.mipLevels = 10;
+    img1CreateInfo.arrayLayers = 1;
+    img1CreateInfo.format = VK_FORMAT_R8G8B8A8_SRGB;
+    img1CreateInfo.tiling = VK_IMAGE_TILING_OPTIMAL;
+    img1CreateInfo.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
+    img1CreateInfo.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_SAMPLED_BIT;
+    img1CreateInfo.samples = VK_SAMPLE_COUNT_1_BIT;
+
+    // A full screen texture to be used as color attachment.
+    VkImageCreateInfo img2CreateInfo = { VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO };
+    img2CreateInfo.imageType = VK_IMAGE_TYPE_2D;
+    img2CreateInfo.extent.width = 1920;
+    img2CreateInfo.extent.height = 1080;
+    img2CreateInfo.extent.depth = 1;
+    img2CreateInfo.mipLevels = 1;
+    img2CreateInfo.arrayLayers = 1;
+    img2CreateInfo.format = VK_FORMAT_R8G8B8A8_UNORM;
+    img2CreateInfo.tiling = VK_IMAGE_TILING_OPTIMAL;
+    img2CreateInfo.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
+    img2CreateInfo.usage = VK_IMAGE_USAGE_SAMPLED_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
+    img2CreateInfo.samples = VK_SAMPLE_COUNT_1_BIT;
+
+    VkImage img1 = VK_NULL_HANDLE;
+    ERR_GUARD_VULKAN(vkCreateImage(g_hDevice, &img1CreateInfo, g_Allocs, &img1));
+    VkImage img2 = VK_NULL_HANDLE;
+    ERR_GUARD_VULKAN(vkCreateImage(g_hDevice, &img2CreateInfo, g_Allocs, &img2));
+
+    VkMemoryRequirements img1MemReq = {};
+    vkGetImageMemoryRequirements(g_hDevice, img1, &img1MemReq);
+    VkMemoryRequirements img2MemReq = {};
+    vkGetImageMemoryRequirements(g_hDevice, img2, &img2MemReq);
+
+    VkMemoryRequirements finalMemReq = {};
+    finalMemReq.size = std::max(img1MemReq.size, img2MemReq.size);
+    finalMemReq.alignment = std::max(img1MemReq.alignment, img2MemReq.alignment);
+    finalMemReq.memoryTypeBits = img1MemReq.memoryTypeBits & img2MemReq.memoryTypeBits;
+    if(finalMemReq.memoryTypeBits != 0)
+    {
+        wprintf(L"  size: max(%llu, %llu) = %llu\n",
+            img1MemReq.size, img2MemReq.size, finalMemReq.size);
+        wprintf(L"  alignment: max(%llu, %llu) = %llu\n",
+            img1MemReq.alignment, img2MemReq.alignment, finalMemReq.alignment);
+        wprintf(L"  memoryTypeBits: %u & %u = %u\n",
+            img1MemReq.memoryTypeBits, img2MemReq.memoryTypeBits, finalMemReq.memoryTypeBits);
+
+        VmaAllocationCreateInfo allocCreateInfo = {};
+        allocCreateInfo.usage = VMA_MEMORY_USAGE_GPU_ONLY;
+
+        VmaAllocation alloc = VK_NULL_HANDLE;
+        ERR_GUARD_VULKAN(vmaAllocateMemory(g_hAllocator, &finalMemReq, &allocCreateInfo, &alloc, nullptr));
+
+        ERR_GUARD_VULKAN(vmaBindImageMemory(g_hAllocator, alloc, img1));
+        ERR_GUARD_VULKAN(vmaBindImageMemory(g_hAllocator, alloc, img2));
+
+        // You can use img1, img2 here, but not at the same time!
+
+        vmaFreeMemory(g_hAllocator, alloc);
+    }
+    else
+    {
+        wprintf(L"  Textures cannot alias!\n");
+    }
+
+    vkDestroyImage(g_hDevice, img2, g_Allocs);
+    vkDestroyImage(g_hDevice, img1, g_Allocs);
+}
+
 static void TestMapping()
 {
     wprintf(L"Testing mapping...\n");
@@ -5546,16 +5775,16 @@
     config.TotalItemCount = config.UsedItemCountMax * 10;
     config.UsedItemCountMin = config.UsedItemCountMax * 80 / 100;
 
-    g_MemoryAliasingWarningEnabled = false;
     PoolTestResult result = {};
     TestPool_Benchmark(result, config);
-    g_MemoryAliasingWarningEnabled = true;
 
     WritePoolTestResult(file, "Code desc", "Test desc", config, result);
 }
 
 static void PerformMainTests(FILE* file)
 {
+    wprintf(L"MAIN TESTS:\n");
+
     uint32_t repeatCount = 1;
     if(ConfigType >= CONFIG_TYPE_MAXIMUM) repeatCount = 3;
 
@@ -5821,6 +6050,8 @@
 
 static void PerformPoolTests(FILE* file)
 {
+    wprintf(L"POOL TESTS:\n");
+
     const size_t AVG_RESOURCES_PER_POOL = 300;
 
     uint32_t repeatCount = 1;
@@ -6033,9 +6264,7 @@
                             printf("%s #%u\n", testDescription, (uint32_t)repeat);
 
                             PoolTestResult result{};
-                            g_MemoryAliasingWarningEnabled = false;
                             TestPool_Benchmark(result, config);
-                            g_MemoryAliasingWarningEnabled = true;
                             WritePoolTestResult(file, CODE_DESCRIPTION, testDescription, config, result);
                         }
                     }
@@ -6296,6 +6525,7 @@
     // # Simple tests
 
     TestBasics();
+    TestAllocationVersusResourceSize();
     //TestGpuData(); // Not calling this because it's just testing the testing environment.
 #if VMA_DEBUG_MARGIN
     TestDebugMargin();
@@ -6310,6 +6540,7 @@
     TestMemoryUsage();
     TestDeviceCoherentMemory();
     TestBudget();
+    TestAliasing();
     TestMapping();
     TestDeviceLocalMapped();
     TestMappingMultithreaded();
@@ -6320,8 +6551,10 @@
     BasicTestBuddyAllocator();
     BasicTestAllocatePages();
 
-    if(g_BufferDeviceAddressEnabled)
+    if(VK_KHR_buffer_device_address_enabled)
         TestBufferDeviceAddress();
+    if(VK_EXT_memory_priority_enabled)
+        TestMemoryPriority();
 
     {
         FILE* file;
@@ -6353,7 +6586,7 @@
     
     fclose(file);
     
-    wprintf(L"Done.\n");
+    wprintf(L"Done, all PASSED.\n");
 }
 
 #endif // #ifdef _WIN32
diff --git a/third_party/vulkan_memory_allocator/src/Tests.h b/third_party/vulkan_memory_allocator/src/Tests.h
index 50f4ac8..4b3cb87 100644
--- a/third_party/vulkan_memory_allocator/src/Tests.h
+++ b/third_party/vulkan_memory_allocator/src/Tests.h
@@ -1,5 +1,5 @@
 //
-// Copyright (c) 2017-2020 Advanced Micro Devices, Inc. All rights reserved.
+// Copyright (c) 2017-2021 Advanced Micro Devices, Inc. All rights reserved.
 //
 // Permission is hereby granted, free of charge, to any person obtaining a copy
 // of this software and associated documentation files (the "Software"), to deal
diff --git a/third_party/vulkan_memory_allocator/src/VmaReplay/CMakeLists.txt b/third_party/vulkan_memory_allocator/src/VmaReplay/CMakeLists.txt
new file mode 100644
index 0000000..a53f9c9
--- /dev/null
+++ b/third_party/vulkan_memory_allocator/src/VmaReplay/CMakeLists.txt
@@ -0,0 +1,24 @@
+# This file will only be executed if VMA_BUILD_REPLAY is set to ON
+
+if (WIN32)
+    set(VMA_REPLAY_SOURCE_FILES
+        Common.cpp
+        Constants.cpp
+        VmaReplay.cpp
+        VmaUsage.cpp
+    )
+
+    add_executable(VmaReplay ${VMA_REPLAY_SOURCE_FILES})
+
+    # Enable multithreaded compiling
+    target_compile_options(VmaReplay PRIVATE "/MP")
+
+    target_link_libraries(
+        VmaReplay
+
+        PRIVATE
+        Vulkan::Vulkan
+    )
+else()
+    message(STATUS "VmaReplay is not supported on Linux")
+endif()
diff --git a/third_party/vulkan_memory_allocator/src/VmaReplay/Common.cpp b/third_party/vulkan_memory_allocator/src/VmaReplay/Common.cpp
index a66e973..54039dd 100644
--- a/third_party/vulkan_memory_allocator/src/VmaReplay/Common.cpp
+++ b/third_party/vulkan_memory_allocator/src/VmaReplay/Common.cpp
@@ -1,5 +1,5 @@
 //
-// Copyright (c) 2017-2020 Advanced Micro Devices, Inc. All rights reserved.
+// Copyright (c) 2017-2021 Advanced Micro Devices, Inc. All rights reserved.
 //
 // Permission is hereby granted, free of charge, to any person obtaining a copy
 // of this software and associated documentation files (the "Software"), to deal
diff --git a/third_party/vulkan_memory_allocator/src/VmaReplay/Common.h b/third_party/vulkan_memory_allocator/src/VmaReplay/Common.h
index 4f130a4..8c839b0 100644
--- a/third_party/vulkan_memory_allocator/src/VmaReplay/Common.h
+++ b/third_party/vulkan_memory_allocator/src/VmaReplay/Common.h
@@ -1,5 +1,5 @@
 //
-// Copyright (c) 2017-2020 Advanced Micro Devices, Inc. All rights reserved.
+// Copyright (c) 2017-2021 Advanced Micro Devices, Inc. All rights reserved.
 //
 // Permission is hereby granted, free of charge, to any person obtaining a copy
 // of this software and associated documentation files (the "Software"), to deal
diff --git a/third_party/vulkan_memory_allocator/src/VmaReplay/Constants.cpp b/third_party/vulkan_memory_allocator/src/VmaReplay/Constants.cpp
index 865cb80..150b346 100644
--- a/third_party/vulkan_memory_allocator/src/VmaReplay/Constants.cpp
+++ b/third_party/vulkan_memory_allocator/src/VmaReplay/Constants.cpp
@@ -1,5 +1,5 @@
 //
-// Copyright (c) 2017-2020 Advanced Micro Devices, Inc. All rights reserved.
+// Copyright (c) 2017-2021 Advanced Micro Devices, Inc. All rights reserved.
 //
 // Permission is hereby granted, free of charge, to any person obtaining a copy
 // of this software and associated documentation files (the "Software"), to deal
diff --git a/third_party/vulkan_memory_allocator/src/VmaReplay/Constants.h b/third_party/vulkan_memory_allocator/src/VmaReplay/Constants.h
index d6d6812..959681f 100644
--- a/third_party/vulkan_memory_allocator/src/VmaReplay/Constants.h
+++ b/third_party/vulkan_memory_allocator/src/VmaReplay/Constants.h
@@ -1,5 +1,5 @@
 //
-// Copyright (c) 2017-2020 Advanced Micro Devices, Inc. All rights reserved.
+// Copyright (c) 2017-2021 Advanced Micro Devices, Inc. All rights reserved.
 //
 // Permission is hereby granted, free of charge, to any person obtaining a copy
 // of this software and associated documentation files (the "Software"), to deal
@@ -37,7 +37,7 @@
     CMD_LINE_OPT_USER_DATA,
     CMD_LINE_OPT_VK_KHR_DEDICATED_ALLOCATION,
     CMD_LINE_OPT_VK_EXT_MEMORY_BUDGET,
-    CMD_LINE_OPT_VK_LAYER_LUNARG_STANDARD_VALIDATION,
+    CMD_LINE_OPT_VK_LAYER_KHRONOS_VALIDATION,
     CMD_LINE_OPT_MEM_STATS,
     CMD_LINE_OPT_DUMP_STATS_AFTER_LINE,
     CMD_LINE_OPT_DEFRAGMENT_AFTER_LINE,
diff --git a/third_party/vulkan_memory_allocator/src/VmaReplay/VmaReplay.cpp b/third_party/vulkan_memory_allocator/src/VmaReplay/VmaReplay.cpp
index 552555b..562dcc1 100644
--- a/third_party/vulkan_memory_allocator/src/VmaReplay/VmaReplay.cpp
+++ b/third_party/vulkan_memory_allocator/src/VmaReplay/VmaReplay.cpp
@@ -1,5 +1,5 @@
 //
-// Copyright (c) 2018-2020 Advanced Micro Devices, Inc. All rights reserved.
+// Copyright (c) 2018-2021 Advanced Micro Devices, Inc. All rights reserved.
 //
 // Permission is hereby granted, free of charge, to any person obtaining a copy
 // of this software and associated documentation files (the "Software"), to deal
@@ -670,8 +670,8 @@
 static RangeSequence<size_t> g_LineRanges;
 static bool g_UserDataEnabled = true;
 static bool g_MemStatsEnabled = false;
-VULKAN_EXTENSION_REQUEST g_VK_LAYER_LUNARG_standard_validation = VULKAN_EXTENSION_REQUEST::DEFAULT;
-VULKAN_EXTENSION_REQUEST g_VK_EXT_memory_budget_request        = VULKAN_EXTENSION_REQUEST::DEFAULT;
+VULKAN_EXTENSION_REQUEST g_VK_LAYER_KHRONOS_validation           = VULKAN_EXTENSION_REQUEST::DEFAULT;
+VULKAN_EXTENSION_REQUEST g_VK_EXT_memory_budget_request          = VULKAN_EXTENSION_REQUEST::DEFAULT;
 VULKAN_EXTENSION_REQUEST g_VK_AMD_device_coherent_memory_request = VULKAN_EXTENSION_REQUEST::DEFAULT;
 
 struct StatsAfterLineEntry
@@ -1494,53 +1494,16 @@
 ////////////////////////////////////////////////////////////////////////////////
 // class Player
 
-static const char* const VALIDATION_LAYER_NAME = "VK_LAYER_LUNARG_standard_validation";
+static const char* const VALIDATION_LAYER_NAME = "VK_LAYER_KHRONOS_validation";
 
-static const bool g_MemoryAliasingWarningEnabled = false;
-
-static VKAPI_ATTR VkBool32 VKAPI_CALL MyDebugReportCallback(
-    VkDebugReportFlagsEXT flags,
-    VkDebugReportObjectTypeEXT objectType,
-    uint64_t object,
-    size_t location,
-    int32_t messageCode,
-    const char* pLayerPrefix,
-    const char* pMessage,
-    void* pUserData)
+static VkBool32 VKAPI_PTR MyDebugReportCallback(
+    VkDebugUtilsMessageSeverityFlagBitsEXT           messageSeverity,
+    VkDebugUtilsMessageTypeFlagsEXT                  messageTypes,
+    const VkDebugUtilsMessengerCallbackDataEXT*      pCallbackData,
+    void*                                            pUserData)
 {
-    // "Non-linear image 0xebc91 is aliased with linear buffer 0xeb8e4 which may indicate a bug."
-    if(!g_MemoryAliasingWarningEnabled && flags == VK_DEBUG_REPORT_WARNING_BIT_EXT &&
-        (strstr(pMessage, " is aliased with non-linear ") || strstr(pMessage, " is aliased with linear ")))
-    {
-        return VK_FALSE;
-    }
-
-    // Ignoring because when VK_KHR_dedicated_allocation extension is enabled,
-    // vkGetBufferMemoryRequirements2KHR function is used instead, while Validation
-    // Layer seems to be unaware of it.
-    if (strstr(pMessage, "but vkGetBufferMemoryRequirements() has not been called on that buffer") != nullptr)
-    {
-        return VK_FALSE;
-    }
-    if (strstr(pMessage, "but vkGetImageMemoryRequirements() has not been called on that image") != nullptr)
-    {
-        return VK_FALSE;
-    }
-    
-    /*
-    "Mapping an image with layout VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL can result in undefined behavior if this memory is used by the device. Only GENERAL or PREINITIALIZED should be used."
-    Ignoring because we map entire VkDeviceMemory blocks, where different types of
-    images and buffers may end up together, especially on GPUs with unified memory
-    like Intel.
-    */
-    if(strstr(pMessage, "Mapping an image with layout") != nullptr &&
-        strstr(pMessage, "can result in undefined behavior if this memory is used by the device") != nullptr)
-    {
-        return VK_FALSE;
-    }
-
-    printf("%s \xBA %s\n", pLayerPrefix, pMessage);
-
+    assert(pCallbackData && pCallbackData->pMessageIdName && pCallbackData->pMessage);
+    printf("%s \xBA %s\n", pCallbackData->pMessageIdName, pCallbackData->pMessage);
     return VK_FALSE;
 }
 
@@ -1609,10 +1572,9 @@
     const VkPhysicalDeviceProperties* m_DevProps = nullptr;
     const VkPhysicalDeviceMemoryProperties* m_MemProps = nullptr;
 
-    PFN_vkCreateDebugReportCallbackEXT m_pvkCreateDebugReportCallbackEXT;
-    PFN_vkDebugReportMessageEXT m_pvkDebugReportMessageEXT;
-    PFN_vkDestroyDebugReportCallbackEXT m_pvkDestroyDebugReportCallbackEXT;
-    VkDebugReportCallbackEXT m_hCallback;
+    PFN_vkCreateDebugUtilsMessengerEXT m_vkCreateDebugUtilsMessengerEXT = nullptr;
+    PFN_vkDestroyDebugUtilsMessengerEXT m_vkDestroyDebugUtilsMessengerEXT = nullptr;
+    VkDebugUtilsMessengerEXT m_DebugUtilsMessenger = VK_NULL_HANDLE;
 
     uint32_t m_VmaFrameIndex = 0;
 
@@ -1659,6 +1621,7 @@
     int InitVulkan();
     void FinalizeVulkan();
     void RegisterDebugCallbacks();
+    void UnregisterDebugCallbacks();
 
     // If parmeter count doesn't match, issues warning and returns false.
     bool ValidateFunctionParameterCount(size_t lineNumber, const CsvSplit& csvSplit, size_t expectedParamCount, bool lastUnbound);
@@ -2018,7 +1981,7 @@
         IsLayerSupported(instanceLayerProps.data(), instanceLayerProps.size(), VALIDATION_LAYER_NAME);
 
     bool validationLayersEnabled = false;
-    switch(g_VK_LAYER_LUNARG_standard_validation)
+    switch(g_VK_LAYER_KHRONOS_validation)
     {
     case VULKAN_EXTENSION_REQUEST::DISABLED:
         break;
@@ -2053,10 +2016,10 @@
     if(validationLayersEnabled)
     {
         instanceLayers.push_back(VALIDATION_LAYER_NAME);
-        enabledInstanceExtensions.push_back("VK_EXT_debug_report");
     }
 
     bool VK_KHR_get_physical_device_properties2_enabled = false;
+    bool VK_EXT_debug_utils_enabled = false;
     for(const auto& extensionProperties : availableInstanceExtensions)
     {
         if(strcmp(extensionProperties.extensionName, VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME) == 0)
@@ -2064,6 +2027,14 @@
             enabledInstanceExtensions.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
             VK_KHR_get_physical_device_properties2_enabled = true;
         }
+        else if(strcmp(extensionProperties.extensionName, VK_EXT_DEBUG_UTILS_EXTENSION_NAME) == 0)
+        {
+            if(validationLayersEnabled)
+            {
+                enabledInstanceExtensions.push_back("VK_EXT_debug_utils");
+                VK_EXT_debug_utils_enabled = true;
+            }
+        }
     }
 
     VkApplicationInfo appInfo = { VK_STRUCTURE_TYPE_APPLICATION_INFO };
@@ -2087,7 +2058,7 @@
         return RESULT_ERROR_VULKAN;
     }
 
-    if(validationLayersEnabled)
+    if(VK_EXT_debug_utils_enabled)
     {
         RegisterDebugCallbacks();
     }
@@ -2388,11 +2359,7 @@
         m_Device = nullptr;
     }
 
-    if(m_pvkDestroyDebugReportCallbackEXT && m_hCallback != VK_NULL_HANDLE)
-    {
-        m_pvkDestroyDebugReportCallbackEXT(m_VulkanInstance, m_hCallback, nullptr);
-        m_hCallback = VK_NULL_HANDLE;
-    }
+    UnregisterDebugCallbacks();
 
     if(m_VulkanInstance != VK_NULL_HANDLE)
     {
@@ -2403,29 +2370,41 @@
 
 void Player::RegisterDebugCallbacks()
 {
-    m_pvkCreateDebugReportCallbackEXT =
-        reinterpret_cast<PFN_vkCreateDebugReportCallbackEXT>
-            (vkGetInstanceProcAddr(m_VulkanInstance, "vkCreateDebugReportCallbackEXT"));
-    m_pvkDebugReportMessageEXT =
-        reinterpret_cast<PFN_vkDebugReportMessageEXT>
-            (vkGetInstanceProcAddr(m_VulkanInstance, "vkDebugReportMessageEXT"));
-    m_pvkDestroyDebugReportCallbackEXT =
-        reinterpret_cast<PFN_vkDestroyDebugReportCallbackEXT>
-            (vkGetInstanceProcAddr(m_VulkanInstance, "vkDestroyDebugReportCallbackEXT"));
-    assert(m_pvkCreateDebugReportCallbackEXT);
-    assert(m_pvkDebugReportMessageEXT);
-    assert(m_pvkDestroyDebugReportCallbackEXT);
+    static const VkDebugUtilsMessageSeverityFlagsEXT DEBUG_UTILS_MESSENGER_MESSAGE_SEVERITY =
+        //VK_DEBUG_UTILS_MESSAGE_SEVERITY_VERBOSE_BIT_EXT |
+        //VK_DEBUG_UTILS_MESSAGE_SEVERITY_INFO_BIT_EXT |
+        VK_DEBUG_UTILS_MESSAGE_SEVERITY_WARNING_BIT_EXT |
+        VK_DEBUG_UTILS_MESSAGE_SEVERITY_ERROR_BIT_EXT;
+    static const VkDebugUtilsMessageTypeFlagsEXT DEBUG_UTILS_MESSENGER_MESSAGE_TYPE =
+        VK_DEBUG_UTILS_MESSAGE_TYPE_GENERAL_BIT_EXT |
+        VK_DEBUG_UTILS_MESSAGE_TYPE_VALIDATION_BIT_EXT |
+        VK_DEBUG_UTILS_MESSAGE_TYPE_PERFORMANCE_BIT_EXT;
 
-    VkDebugReportCallbackCreateInfoEXT callbackCreateInfo = { VK_STRUCTURE_TYPE_DEBUG_REPORT_CREATE_INFO_EXT };
-    callbackCreateInfo.flags = //VK_DEBUG_REPORT_INFORMATION_BIT_EXT |
-        VK_DEBUG_REPORT_ERROR_BIT_EXT |
-        VK_DEBUG_REPORT_WARNING_BIT_EXT |
-        VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT /*|
-        VK_DEBUG_REPORT_DEBUG_BIT_EXT*/;
-    callbackCreateInfo.pfnCallback = &MyDebugReportCallback;
+    m_vkCreateDebugUtilsMessengerEXT = (PFN_vkCreateDebugUtilsMessengerEXT)vkGetInstanceProcAddr(
+        m_VulkanInstance, "vkCreateDebugUtilsMessengerEXT");
+    m_vkDestroyDebugUtilsMessengerEXT = (PFN_vkDestroyDebugUtilsMessengerEXT)vkGetInstanceProcAddr(
+        m_VulkanInstance, "vkDestroyDebugUtilsMessengerEXT");
+    assert(m_vkCreateDebugUtilsMessengerEXT);
+    assert(m_vkDestroyDebugUtilsMessengerEXT);
 
-    VkResult res = m_pvkCreateDebugReportCallbackEXT(m_VulkanInstance, &callbackCreateInfo, nullptr, &m_hCallback);
-    assert(res == VK_SUCCESS);
+    VkDebugUtilsMessengerCreateInfoEXT messengerCreateInfo = { VK_STRUCTURE_TYPE_DEBUG_UTILS_MESSENGER_CREATE_INFO_EXT };
+    messengerCreateInfo.messageSeverity = DEBUG_UTILS_MESSENGER_MESSAGE_SEVERITY;
+    messengerCreateInfo.messageType = DEBUG_UTILS_MESSENGER_MESSAGE_TYPE;
+    messengerCreateInfo.pfnUserCallback = MyDebugReportCallback;
+    VkResult res = m_vkCreateDebugUtilsMessengerEXT(m_VulkanInstance, &messengerCreateInfo, nullptr, &m_DebugUtilsMessenger);
+    if(res != VK_SUCCESS)
+    {
+        printf("ERROR: vkCreateDebugUtilsMessengerEXT failed (%d)\n", res);
+        m_DebugUtilsMessenger = VK_NULL_HANDLE;
+    }
+}
+
+void Player::UnregisterDebugCallbacks()
+{
+    if(m_DebugUtilsMessenger)
+    {
+        m_vkDestroyDebugUtilsMessengerEXT(m_VulkanInstance, m_DebugUtilsMessenger, nullptr);
+    }
 }
 
 void Player::Defragment()
@@ -3704,7 +3683,8 @@
                 const auto it = m_Allocations.find(origPtr);
                 if(it != m_Allocations.end())
                 {
-                    vmaResizeAllocation(m_Allocator, it->second.allocation, newSize);
+                    // Do nothing - the function was deprecated and has been removed.
+                    //vmaResizeAllocation(m_Allocator, it->second.allocation, newSize);
                     UpdateMemStats();
                 }
                 else
@@ -3991,7 +3971,7 @@
         "    --PhysicalDevice <Index> - Choice of Vulkan physical device. Default: 0.\n"
         "    --UserData <Value> - 0 to disable or 1 to enable setting pUserData during playback.\n"
         "        Default is 1. Affects both creation of buffers and images, as well as calls to vmaSetAllocationUserData.\n"
-        "    --VK_LAYER_LUNARG_standard_validation <Value> - 0 to disable or 1 to enable validation layers.\n"
+        "    --VK_LAYER_KHRONOS_validation <Value> - 0 to disable or 1 to enable validation layers.\n"
         "        By default the layers are silently enabled if available.\n"
         "    --VK_EXT_memory_budget <Value> - 0 to disable or 1 to enable this extension.\n"
         "        By default the extension is silently enabled if available.\n"
@@ -4214,7 +4194,7 @@
     cmdLineParser.RegisterOpt(CMD_LINE_OPT_PHYSICAL_DEVICE, "PhysicalDevice", true);
     cmdLineParser.RegisterOpt(CMD_LINE_OPT_USER_DATA, "UserData", true);
     cmdLineParser.RegisterOpt(CMD_LINE_OPT_VK_EXT_MEMORY_BUDGET, "VK_EXT_memory_budget", true);
-    cmdLineParser.RegisterOpt(CMD_LINE_OPT_VK_LAYER_LUNARG_STANDARD_VALIDATION, VALIDATION_LAYER_NAME, true);
+    cmdLineParser.RegisterOpt(CMD_LINE_OPT_VK_LAYER_KHRONOS_VALIDATION, VALIDATION_LAYER_NAME, true);
     cmdLineParser.RegisterOpt(CMD_LINE_OPT_MEM_STATS, "MemStats", true);
     cmdLineParser.RegisterOpt(CMD_LINE_OPT_DUMP_STATS_AFTER_LINE, "DumpStatsAfterLine", true);
     cmdLineParser.RegisterOpt(CMD_LINE_OPT_DEFRAGMENT_AFTER_LINE, "DefragmentAfterLine", true);
@@ -4288,12 +4268,12 @@
                     }
                 }
                 break;
-            case CMD_LINE_OPT_VK_LAYER_LUNARG_STANDARD_VALIDATION:
+            case CMD_LINE_OPT_VK_LAYER_KHRONOS_VALIDATION:
                 {
                     bool newValue;
                     if(StrRangeToBool(StrRange(cmdLineParser.GetParameter()), newValue))
                     {
-                        g_VK_LAYER_LUNARG_standard_validation = newValue ?
+                        g_VK_LAYER_KHRONOS_validation = newValue ?
                             VULKAN_EXTENSION_REQUEST::ENABLED :
                             VULKAN_EXTENSION_REQUEST::DISABLED;
                     }
diff --git a/third_party/vulkan_memory_allocator/src/VmaReplay/VmaUsage.cpp b/third_party/vulkan_memory_allocator/src/VmaReplay/VmaUsage.cpp
index f2a1447..c4a6db2 100644
--- a/third_party/vulkan_memory_allocator/src/VmaReplay/VmaUsage.cpp
+++ b/third_party/vulkan_memory_allocator/src/VmaReplay/VmaUsage.cpp
@@ -1,5 +1,5 @@
 //
-// Copyright (c) 2017-2020 Advanced Micro Devices, Inc. All rights reserved.
+// Copyright (c) 2017-2021 Advanced Micro Devices, Inc. All rights reserved.
 //
 // Permission is hereby granted, free of charge, to any person obtaining a copy
 // of this software and associated documentation files (the "Software"), to deal
diff --git a/third_party/vulkan_memory_allocator/src/VmaReplay/VmaUsage.h b/third_party/vulkan_memory_allocator/src/VmaReplay/VmaUsage.h
index 47b3f51..3bc5b46 100644
--- a/third_party/vulkan_memory_allocator/src/VmaReplay/VmaUsage.h
+++ b/third_party/vulkan_memory_allocator/src/VmaReplay/VmaUsage.h
@@ -1,5 +1,5 @@
 //
-// Copyright (c) 2017-2020 Advanced Micro Devices, Inc. All rights reserved.
+// Copyright (c) 2017-2021 Advanced Micro Devices, Inc. All rights reserved.
 //
 // Permission is hereby granted, free of charge, to any person obtaining a copy
 // of this software and associated documentation files (the "Software"), to deal
@@ -45,6 +45,6 @@
 #pragma warning(disable: 4189) // local variable is initialized but not referenced
 #pragma warning(disable: 4324) // structure was padded due to alignment specifier
 
-#include "../vk_mem_alloc.h"
+#include "../../include/vk_mem_alloc.h"
 
 #pragma warning(pop)
diff --git a/third_party/vulkan_memory_allocator/src/VmaUsage.cpp b/third_party/vulkan_memory_allocator/src/VmaUsage.cpp
index 12400db..b7f5498 100644
--- a/third_party/vulkan_memory_allocator/src/VmaUsage.cpp
+++ b/third_party/vulkan_memory_allocator/src/VmaUsage.cpp
@@ -1,5 +1,5 @@
 //
-// Copyright (c) 2017-2020 Advanced Micro Devices, Inc. All rights reserved.
+// Copyright (c) 2017-2021 Advanced Micro Devices, Inc. All rights reserved.
 //
 // Permission is hereby granted, free of charge, to any person obtaining a copy
 // of this software and associated documentation files (the "Software"), to deal
diff --git a/third_party/vulkan_memory_allocator/src/VmaUsage.h b/third_party/vulkan_memory_allocator/src/VmaUsage.h
index 8069c5c..524186a 100644
--- a/third_party/vulkan_memory_allocator/src/VmaUsage.h
+++ b/third_party/vulkan_memory_allocator/src/VmaUsage.h
@@ -1,5 +1,5 @@
 //
-// Copyright (c) 2017-2020 Advanced Micro Devices, Inc. All rights reserved.
+// Copyright (c) 2017-2021 Advanced Micro Devices, Inc. All rights reserved.
 //
 // Permission is hereby granted, free of charge, to any person obtaining a copy
 // of this software and associated documentation files (the "Software"), to deal
@@ -48,21 +48,15 @@
 */
 
 //#define VMA_HEAVY_ASSERT(expr) assert(expr)
-//#define VMA_USE_STL_CONTAINERS 1
 //#define VMA_DEDICATED_ALLOCATION 0
 //#define VMA_DEBUG_MARGIN 16
 //#define VMA_DEBUG_DETECT_CORRUPTION 1
-//#define VMA_DEBUG_INITIALIZE_ALLOCATIONS 1
-//#define VMA_RECORDING_ENABLED 1
 //#define VMA_DEBUG_MIN_BUFFER_IMAGE_GRANULARITY 256
 //#define VMA_USE_STL_SHARED_MUTEX 0
-//#define VMA_DEBUG_GLOBAL_MUTEX 1
 //#define VMA_MEMORY_BUDGET 0
-#define VMA_STATIC_VULKAN_FUNCTIONS 0
-#define VMA_DYNAMIC_VULKAN_FUNCTIONS 1
 
-//#define VMA_VULKAN_VERSION 1002000 // Vulkan 1.2
-#define VMA_VULKAN_VERSION 1001000 // Vulkan 1.1
+#define VMA_VULKAN_VERSION 1002000 // Vulkan 1.2
+//#define VMA_VULKAN_VERSION 1001000 // Vulkan 1.1
 //#define VMA_VULKAN_VERSION 1000000 // Vulkan 1.0
 
 /*
@@ -89,7 +83,7 @@
     #pragma clang diagnostic ignored "-Wnullability-completeness"
 #endif
 
-#include "vk_mem_alloc.h"
+#include "../include/vk_mem_alloc.h"
 
 #ifdef __clang__
     #pragma clang diagnostic pop
diff --git a/third_party/vulkan_memory_allocator/src/VulkanSample.cpp b/third_party/vulkan_memory_allocator/src/VulkanSample.cpp
index 4510efa..a313083 100644
--- a/third_party/vulkan_memory_allocator/src/VulkanSample.cpp
+++ b/third_party/vulkan_memory_allocator/src/VulkanSample.cpp
@@ -1,5 +1,5 @@
 //
-// Copyright (c) 2017-2020 Advanced Micro Devices, Inc. All rights reserved.
+// Copyright (c) 2017-2021 Advanced Micro Devices, Inc. All rights reserved.
 //
 // Permission is hereby granted, free of charge, to any person obtaining a copy
 // of this software and associated documentation files (the "Software"), to deal
@@ -27,11 +27,14 @@
 #include "VmaUsage.h"
 #include "Common.h"
 #include <atomic>
+#include <Shlwapi.h>
+
+#pragma comment(lib, "shlwapi.lib")
 
 static const char* const SHADER_PATH1 = "./";
 static const char* const SHADER_PATH2 = "../bin/";
 static const wchar_t* const WINDOW_CLASS_NAME = L"VULKAN_MEMORY_ALLOCATOR_SAMPLE";
-static const char* const VALIDATION_LAYER_NAME = "VK_LAYER_LUNARG_standard_validation";
+static const char* const VALIDATION_LAYER_NAME = "VK_LAYER_KHRONOS_validation";
 static const char* const APP_TITLE_A =     "Vulkan Memory Allocator Sample 2.4.0";
 static const wchar_t* const APP_TITLE_W = L"Vulkan Memory Allocator Sample 2.4.0";
 
@@ -40,11 +43,19 @@
 static void* const CUSTOM_CPU_ALLOCATION_CALLBACK_USER_DATA = (void*)(intptr_t)43564544;
 static const bool USE_CUSTOM_CPU_ALLOCATION_CALLBACKS = true;
 
+enum class ExitCode : int
+{
+    GPUList = 2,
+    Help = 1,
+    Success = 0,
+    RuntimeError = -1,
+    CommandLineError = -2,
+};
+
 VkPhysicalDevice g_hPhysicalDevice;
 VkDevice g_hDevice;
 VmaAllocator g_hAllocator;
 VkInstance g_hVulkanInstance;
-bool g_MemoryAliasingWarningEnabled = true;
 
 bool g_EnableValidationLayer = true;
 bool VK_KHR_get_memory_requirements2_enabled = false;
@@ -53,13 +64,13 @@
 bool VK_KHR_bind_memory2_enabled = false;
 bool VK_EXT_memory_budget_enabled = false;
 bool VK_AMD_device_coherent_memory_enabled = false;
-bool VK_EXT_buffer_device_address_enabled = false;
 bool VK_KHR_buffer_device_address_enabled = false;
+bool VK_EXT_memory_priority_enabled = false;
+bool VK_EXT_debug_utils_enabled = false;
 bool g_SparseBindingEnabled = false;
-bool g_BufferDeviceAddressEnabled = false;
 
 // # Pointers to functions from extensions
-PFN_vkGetBufferDeviceAddressEXT g_vkGetBufferDeviceAddressEXT;
+PFN_vkGetBufferDeviceAddressKHR g_vkGetBufferDeviceAddressKHR;
 
 static HINSTANCE g_hAppInstance;
 static HWND g_hWnd;
@@ -95,10 +106,18 @@
 static std::vector<VkSurfaceFormatKHR> g_SurfaceFormats;
 static std::vector<VkPresentModeKHR> g_PresentModes;
 
-static PFN_vkCreateDebugReportCallbackEXT g_pvkCreateDebugReportCallbackEXT;
-static PFN_vkDebugReportMessageEXT g_pvkDebugReportMessageEXT;
-static PFN_vkDestroyDebugReportCallbackEXT g_pvkDestroyDebugReportCallbackEXT;
-static VkDebugReportCallbackEXT g_hCallback;
+static const VkDebugUtilsMessageSeverityFlagsEXT DEBUG_UTILS_MESSENGER_MESSAGE_SEVERITY =
+    //VK_DEBUG_UTILS_MESSAGE_SEVERITY_VERBOSE_BIT_EXT |
+    //VK_DEBUG_UTILS_MESSAGE_SEVERITY_INFO_BIT_EXT |
+    VK_DEBUG_UTILS_MESSAGE_SEVERITY_WARNING_BIT_EXT |
+    VK_DEBUG_UTILS_MESSAGE_SEVERITY_ERROR_BIT_EXT;
+static const VkDebugUtilsMessageTypeFlagsEXT DEBUG_UTILS_MESSENGER_MESSAGE_TYPE =
+    VK_DEBUG_UTILS_MESSAGE_TYPE_GENERAL_BIT_EXT |
+    VK_DEBUG_UTILS_MESSAGE_TYPE_VALIDATION_BIT_EXT |
+    VK_DEBUG_UTILS_MESSAGE_TYPE_PERFORMANCE_BIT_EXT;
+static PFN_vkCreateDebugUtilsMessengerEXT vkCreateDebugUtilsMessengerEXT_Func;
+static PFN_vkDestroyDebugUtilsMessengerEXT vkDestroyDebugUtilsMessengerEXT_Func;
+static PFN_vkSetDebugUtilsObjectNameEXT vkSetDebugUtilsObjectNameEXT_Func;
 
 static VkQueue g_hGraphicsQueue;
 VkQueue g_hSparseBindingQueue;
@@ -171,6 +190,75 @@
 
 const VkAllocationCallbacks* g_Allocs;
 
+struct GPUSelection
+{
+    uint32_t Index = UINT32_MAX;
+    std::wstring Substring;
+};
+
+class VulkanUsage
+{
+public:
+    void Init();
+    ~VulkanUsage();
+    void PrintPhysicalDeviceList() const;
+    // If failed, returns VK_NULL_HANDLE.
+    VkPhysicalDevice SelectPhysicalDevice(const GPUSelection& GPUSelection) const;
+
+private:
+    VkDebugUtilsMessengerEXT m_DebugUtilsMessenger = VK_NULL_HANDLE;
+
+    void RegisterDebugCallbacks();
+    static bool IsLayerSupported(const VkLayerProperties* pProps, size_t propCount, const char* pLayerName);
+};
+
+struct CommandLineParameters
+{
+    bool m_Help = false;
+    bool m_List = false;
+    GPUSelection m_GPUSelection;
+
+    bool Parse(int argc, wchar_t** argv)
+    {
+        for(int i = 1; i < argc; ++i)
+        {
+            if(_wcsicmp(argv[i], L"-h") == 0 || _wcsicmp(argv[i], L"--Help") == 0)
+            {
+                m_Help = true;
+            }
+            else if(_wcsicmp(argv[i], L"-l") == 0 || _wcsicmp(argv[i], L"--List") == 0)
+            {
+                m_List = true;
+            }
+            else if((_wcsicmp(argv[i], L"-g") == 0 || _wcsicmp(argv[i], L"--GPU") == 0) && i + 1 < argc)
+            {
+                m_GPUSelection.Substring = argv[i + 1];
+                ++i;
+            }
+            else if((_wcsicmp(argv[i], L"-i") == 0 || _wcsicmp(argv[i], L"--GPUIndex") == 0) && i + 1 < argc)
+            {
+                m_GPUSelection.Index = _wtoi(argv[i + 1]);
+                ++i;
+            }
+            else
+                return false;
+        }
+        return true;
+    }
+} g_CommandLineParameters;
+
+void SetDebugUtilsObjectName(VkObjectType type, uint64_t handle, const char* name)
+{
+    if(vkSetDebugUtilsObjectNameEXT_Func == nullptr)
+        return;
+
+    VkDebugUtilsObjectNameInfoEXT info = { VK_STRUCTURE_TYPE_DEBUG_UTILS_OBJECT_NAME_INFO_EXT };
+    info.objectType = type;
+    info.objectHandle = handle;
+    info.pObjectName = name;
+    vkSetDebugUtilsObjectNameEXT_Func(g_hDevice, &info);
+}
+
 void BeginSingleTimeCommands()
 {
     VkCommandBufferBeginInfo cmdBufBeginInfo = { VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO };
@@ -208,67 +296,37 @@
         out.clear();
 }
 
-VKAPI_ATTR VkBool32 VKAPI_CALL MyDebugReportCallback(
-    VkDebugReportFlagsEXT flags,
-    VkDebugReportObjectTypeEXT objectType,
-    uint64_t object,
-    size_t location,
-    int32_t messageCode,
-    const char* pLayerPrefix,
-    const char* pMessage,
-    void* pUserData)
+static VkBool32 VKAPI_PTR MyDebugReportCallback(
+    VkDebugUtilsMessageSeverityFlagBitsEXT           messageSeverity,
+    VkDebugUtilsMessageTypeFlagsEXT                  messageTypes,
+    const VkDebugUtilsMessengerCallbackDataEXT*      pCallbackData,
+    void*                                            pUserData)
 {
-    // "Non-linear image 0xebc91 is aliased with linear buffer 0xeb8e4 which may indicate a bug."
-    if(!g_MemoryAliasingWarningEnabled && flags == VK_DEBUG_REPORT_WARNING_BIT_EXT &&
-        (strstr(pMessage, " is aliased with non-linear ") || strstr(pMessage, " is aliased with linear ")))
-    {
-        return VK_FALSE;
-    }
+    assert(pCallbackData && pCallbackData->pMessageIdName && pCallbackData->pMessage);
 
-    // Ignoring because when VK_KHR_dedicated_allocation extension is enabled,
-    // vkGetBufferMemoryRequirements2KHR function is used instead, while Validation
-    // Layer seems to be unaware of it.
-    if (strstr(pMessage, "but vkGetBufferMemoryRequirements() has not been called on that buffer") != nullptr)
+    switch(messageSeverity)
     {
-        return VK_FALSE;
-    }
-    if (strstr(pMessage, "but vkGetImageMemoryRequirements() has not been called on that image") != nullptr)
-    {
-        return VK_FALSE;
-    }
-
-    /*
-    "Mapping an image with layout VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL can result in undefined behavior if this memory is used by the device. Only GENERAL or PREINITIALIZED should be used."
-    Ignoring because we map entire VkDeviceMemory blocks, where different types of
-    images and buffers may end up together, especially on GPUs with unified memory
-    like Intel.
-    */
-    if(strstr(pMessage, "Mapping an image with layout") != nullptr &&
-        strstr(pMessage, "can result in undefined behavior if this memory is used by the device") != nullptr)
-    {
-        return VK_FALSE;
-    }
-    
-    switch(flags)
-    {
-    case VK_DEBUG_REPORT_WARNING_BIT_EXT:
+    case VK_DEBUG_UTILS_MESSAGE_SEVERITY_WARNING_BIT_EXT:
         SetConsoleColor(CONSOLE_COLOR::WARNING);
         break;
-    case VK_DEBUG_REPORT_ERROR_BIT_EXT:
+    case VK_DEBUG_UTILS_MESSAGE_SEVERITY_ERROR_BIT_EXT:
         SetConsoleColor(CONSOLE_COLOR::ERROR_);
         break;
-    default:
+    case VK_DEBUG_UTILS_MESSAGE_SEVERITY_INFO_BIT_EXT:
+        SetConsoleColor(CONSOLE_COLOR::NORMAL);
+        break;
+    default: // VK_DEBUG_UTILS_MESSAGE_SEVERITY_VERBOSE_BIT_EXT
         SetConsoleColor(CONSOLE_COLOR::INFO);
     }
 
-    printf("%s \xBA %s\n", pLayerPrefix, pMessage);
+    printf("%s \xBA %s\n", pCallbackData->pMessageIdName, pCallbackData->pMessage);
 
     SetConsoleColor(CONSOLE_COLOR::NORMAL);
 
-    if(flags == VK_DEBUG_REPORT_WARNING_BIT_EXT ||
-        flags == VK_DEBUG_REPORT_ERROR_BIT_EXT)
+    if(messageSeverity == VK_DEBUG_UTILS_MESSAGE_SEVERITY_WARNING_BIT_EXT ||
+        messageSeverity == VK_DEBUG_UTILS_MESSAGE_SEVERITY_ERROR_BIT_EXT)
     {
-        OutputDebugStringA(pMessage);
+        OutputDebugStringA(pCallbackData->pMessage);
         OutputDebugStringA("\n");
     }
 
@@ -323,6 +381,223 @@
     return result;
 }
 
+static constexpr uint32_t GetVulkanApiVersion()
+{
+#if VMA_VULKAN_VERSION == 1002000
+    return VK_API_VERSION_1_2;
+#elif VMA_VULKAN_VERSION == 1001000
+    return VK_API_VERSION_1_1;
+#elif VMA_VULKAN_VERSION == 1000000
+    return VK_API_VERSION_1_0;
+#else
+#error Invalid VMA_VULKAN_VERSION.
+    return UINT32_MAX;
+#endif
+}
+
+void VulkanUsage::Init()
+{
+    g_hAppInstance = (HINSTANCE)GetModuleHandle(NULL);
+
+    if(USE_CUSTOM_CPU_ALLOCATION_CALLBACKS)
+    {
+        g_Allocs = &g_CpuAllocationCallbacks;
+    }
+
+    uint32_t instanceLayerPropCount = 0;
+    ERR_GUARD_VULKAN( vkEnumerateInstanceLayerProperties(&instanceLayerPropCount, nullptr) );
+    std::vector<VkLayerProperties> instanceLayerProps(instanceLayerPropCount);
+    if(instanceLayerPropCount > 0)
+    {
+        ERR_GUARD_VULKAN( vkEnumerateInstanceLayerProperties(&instanceLayerPropCount, instanceLayerProps.data()) );
+    }
+
+    if(g_EnableValidationLayer)
+    {
+        if(IsLayerSupported(instanceLayerProps.data(), instanceLayerProps.size(), VALIDATION_LAYER_NAME) == false)
+        {
+            wprintf(L"Layer \"%hs\" not supported.", VALIDATION_LAYER_NAME);
+            g_EnableValidationLayer = false;
+        }
+    }
+
+    uint32_t availableInstanceExtensionCount = 0;
+    ERR_GUARD_VULKAN( vkEnumerateInstanceExtensionProperties(nullptr, &availableInstanceExtensionCount, nullptr) );
+    std::vector<VkExtensionProperties> availableInstanceExtensions(availableInstanceExtensionCount);
+    if(availableInstanceExtensionCount > 0)
+    {
+        ERR_GUARD_VULKAN( vkEnumerateInstanceExtensionProperties(nullptr, &availableInstanceExtensionCount, availableInstanceExtensions.data()) );
+    }
+
+    std::vector<const char*> enabledInstanceExtensions;
+    enabledInstanceExtensions.push_back(VK_KHR_SURFACE_EXTENSION_NAME);
+    enabledInstanceExtensions.push_back(VK_KHR_WIN32_SURFACE_EXTENSION_NAME);
+
+    std::vector<const char*> instanceLayers;
+    if(g_EnableValidationLayer)
+    {
+        instanceLayers.push_back(VALIDATION_LAYER_NAME);
+    }
+
+    for(const auto& extensionProperties : availableInstanceExtensions)
+    {
+        if(strcmp(extensionProperties.extensionName, VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME) == 0)
+        {
+            if(GetVulkanApiVersion() == VK_API_VERSION_1_0)
+            {   
+                enabledInstanceExtensions.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
+                VK_KHR_get_physical_device_properties2_enabled = true;
+            }
+        }
+        else if(strcmp(extensionProperties.extensionName, VK_EXT_DEBUG_UTILS_EXTENSION_NAME) == 0)
+        {
+            enabledInstanceExtensions.push_back(VK_EXT_DEBUG_UTILS_EXTENSION_NAME);
+            VK_EXT_debug_utils_enabled = true;
+        }
+    }
+
+    VkApplicationInfo appInfo = { VK_STRUCTURE_TYPE_APPLICATION_INFO };
+    appInfo.pApplicationName = APP_TITLE_A;
+    appInfo.applicationVersion = VK_MAKE_VERSION(1, 0, 0);
+    appInfo.pEngineName = "Adam Sawicki Engine";
+    appInfo.engineVersion = VK_MAKE_VERSION(1, 0, 0);
+    appInfo.apiVersion = GetVulkanApiVersion();
+
+    VkInstanceCreateInfo instInfo = { VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO };
+    instInfo.pApplicationInfo = &appInfo;
+    instInfo.enabledExtensionCount = static_cast<uint32_t>(enabledInstanceExtensions.size());
+    instInfo.ppEnabledExtensionNames = enabledInstanceExtensions.data();
+    instInfo.enabledLayerCount = static_cast<uint32_t>(instanceLayers.size());
+    instInfo.ppEnabledLayerNames = instanceLayers.data();
+
+    wprintf(L"Vulkan API version used: ");
+    switch(appInfo.apiVersion)
+    {
+    case VK_API_VERSION_1_0: wprintf(L"1.0\n"); break;
+    case VK_API_VERSION_1_1: wprintf(L"1.1\n"); break;
+    case VK_API_VERSION_1_2: wprintf(L"1.2\n"); break;
+    default: assert(0);
+    }
+
+    ERR_GUARD_VULKAN( vkCreateInstance(&instInfo, g_Allocs, &g_hVulkanInstance) );
+
+    if(VK_EXT_debug_utils_enabled)
+    {
+        RegisterDebugCallbacks();
+    }
+}
+
+VulkanUsage::~VulkanUsage()
+{
+    if(m_DebugUtilsMessenger)
+    {
+        vkDestroyDebugUtilsMessengerEXT_Func(g_hVulkanInstance, m_DebugUtilsMessenger, g_Allocs);
+    }
+
+    if(g_hVulkanInstance)
+    {
+        vkDestroyInstance(g_hVulkanInstance, g_Allocs);
+        g_hVulkanInstance = VK_NULL_HANDLE;
+    }
+}
+
+void VulkanUsage::PrintPhysicalDeviceList() const
+{
+    uint32_t deviceCount = 0;
+    ERR_GUARD_VULKAN(vkEnumeratePhysicalDevices(g_hVulkanInstance, &deviceCount, nullptr));
+    std::vector<VkPhysicalDevice> physicalDevices(deviceCount);
+    if(deviceCount > 0)
+    {
+        ERR_GUARD_VULKAN(vkEnumeratePhysicalDevices(g_hVulkanInstance, &deviceCount, physicalDevices.data()));
+    }
+
+    for(size_t i = 0; i < deviceCount; ++i)
+    {
+        VkPhysicalDeviceProperties props = {};
+        vkGetPhysicalDeviceProperties(physicalDevices[i], &props);
+        wprintf(L"Physical device %zu: %hs\n", i, props.deviceName);
+    }
+}
+
+VkPhysicalDevice VulkanUsage::SelectPhysicalDevice(const GPUSelection& GPUSelection) const
+{
+    uint32_t deviceCount = 0;
+    ERR_GUARD_VULKAN(vkEnumeratePhysicalDevices(g_hVulkanInstance, &deviceCount, nullptr));
+    std::vector<VkPhysicalDevice> physicalDevices(deviceCount);
+    if(deviceCount > 0)
+    {
+        ERR_GUARD_VULKAN(vkEnumeratePhysicalDevices(g_hVulkanInstance, &deviceCount, physicalDevices.data()));
+    }
+
+    if(GPUSelection.Index != UINT32_MAX)
+    {
+        // Cannot specify both index and name.
+        if(!GPUSelection.Substring.empty())
+        {
+            return VK_NULL_HANDLE;
+        }
+
+        return GPUSelection.Index < deviceCount ? physicalDevices[GPUSelection.Index] : VK_NULL_HANDLE;
+    }
+
+    if(!GPUSelection.Substring.empty())
+    {
+        VkPhysicalDevice result = VK_NULL_HANDLE;
+        std::wstring name;
+        for(uint32_t i = 0; i < deviceCount; ++i)
+        {
+            VkPhysicalDeviceProperties props = {};
+            vkGetPhysicalDeviceProperties(physicalDevices[i], &props);
+            if(ConvertCharsToUnicode(&name, props.deviceName, strlen(props.deviceName), CP_UTF8) &&
+                StrStrI(name.c_str(), GPUSelection.Substring.c_str()))
+            {
+                // Second matching device found - error.
+                if(result != VK_NULL_HANDLE)
+                {
+                    return VK_NULL_HANDLE;
+                }
+                // First matching device found.
+                result = physicalDevices[i];
+            }
+        }
+        // Found or not, return it.
+        return result;
+    }
+
+    // Select first one.
+    return deviceCount > 0 ? physicalDevices[0] : VK_NULL_HANDLE;
+}
+
+void VulkanUsage::RegisterDebugCallbacks()
+{
+    vkCreateDebugUtilsMessengerEXT_Func = (PFN_vkCreateDebugUtilsMessengerEXT)vkGetInstanceProcAddr(
+        g_hVulkanInstance, "vkCreateDebugUtilsMessengerEXT");
+    vkDestroyDebugUtilsMessengerEXT_Func = (PFN_vkDestroyDebugUtilsMessengerEXT)vkGetInstanceProcAddr(
+        g_hVulkanInstance, "vkDestroyDebugUtilsMessengerEXT");
+    vkSetDebugUtilsObjectNameEXT_Func = (PFN_vkSetDebugUtilsObjectNameEXT)vkGetInstanceProcAddr(
+        g_hVulkanInstance, "vkSetDebugUtilsObjectNameEXT");
+    assert(vkCreateDebugUtilsMessengerEXT_Func);
+    assert(vkDestroyDebugUtilsMessengerEXT_Func);
+    assert(vkSetDebugUtilsObjectNameEXT_Func);
+
+    VkDebugUtilsMessengerCreateInfoEXT messengerCreateInfo = { VK_STRUCTURE_TYPE_DEBUG_UTILS_MESSENGER_CREATE_INFO_EXT };
+    messengerCreateInfo.messageSeverity = DEBUG_UTILS_MESSENGER_MESSAGE_SEVERITY;
+    messengerCreateInfo.messageType = DEBUG_UTILS_MESSENGER_MESSAGE_TYPE;
+    messengerCreateInfo.pfnUserCallback = MyDebugReportCallback;
+    ERR_GUARD_VULKAN( vkCreateDebugUtilsMessengerEXT_Func(g_hVulkanInstance, &messengerCreateInfo, g_Allocs, &m_DebugUtilsMessenger) );
+}
+
+bool VulkanUsage::IsLayerSupported(const VkLayerProperties* pProps, size_t propCount, const char* pLayerName)
+{
+    const VkLayerProperties* propsEnd = pProps + propCount;
+    return std::find_if(
+        pProps,
+        propsEnd,
+        [pLayerName](const VkLayerProperties& prop) -> bool {
+        return strcmp(pLayerName, prop.layerName) == 0;
+    }) != propsEnd;
+}
+
 struct Vertex
 {
     float pos[3];
@@ -585,43 +860,6 @@
     mat4 ModelViewProj;
 };
 
-static void RegisterDebugCallbacks()
-{
-    g_pvkCreateDebugReportCallbackEXT =
-        reinterpret_cast<PFN_vkCreateDebugReportCallbackEXT>
-            (vkGetInstanceProcAddr(g_hVulkanInstance, "vkCreateDebugReportCallbackEXT"));
-    g_pvkDebugReportMessageEXT =
-        reinterpret_cast<PFN_vkDebugReportMessageEXT>
-            (vkGetInstanceProcAddr(g_hVulkanInstance, "vkDebugReportMessageEXT"));
-    g_pvkDestroyDebugReportCallbackEXT =
-        reinterpret_cast<PFN_vkDestroyDebugReportCallbackEXT>
-            (vkGetInstanceProcAddr(g_hVulkanInstance, "vkDestroyDebugReportCallbackEXT"));
-    assert(g_pvkCreateDebugReportCallbackEXT);
-    assert(g_pvkDebugReportMessageEXT);
-    assert(g_pvkDestroyDebugReportCallbackEXT);
-
-    VkDebugReportCallbackCreateInfoEXT callbackCreateInfo = { VK_STRUCTURE_TYPE_DEBUG_REPORT_CREATE_INFO_EXT };
-    callbackCreateInfo.flags = //VK_DEBUG_REPORT_INFORMATION_BIT_EXT |
-        VK_DEBUG_REPORT_ERROR_BIT_EXT |
-        VK_DEBUG_REPORT_WARNING_BIT_EXT |
-        VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT /*|
-        VK_DEBUG_REPORT_DEBUG_BIT_EXT*/;
-    callbackCreateInfo.pfnCallback = &MyDebugReportCallback;
-
-    ERR_GUARD_VULKAN( g_pvkCreateDebugReportCallbackEXT(g_hVulkanInstance, &callbackCreateInfo, g_Allocs, &g_hCallback) );
-}
-
-static bool IsLayerSupported(const VkLayerProperties* pProps, size_t propCount, const char* pLayerName)
-{
-    const VkLayerProperties* propsEnd = pProps + propCount;
-    return std::find_if(
-        pProps,
-        propsEnd,
-        [pLayerName](const VkLayerProperties& prop) -> bool {
-            return strcmp(pLayerName, prop.layerName) == 0;
-        }) != propsEnd;
-}
-
 static VkFormat FindSupportedFormat(
     const std::vector<VkFormat>& candidates,
     VkImageTiling tiling,
@@ -1119,25 +1357,11 @@
     }
 }
 
-static constexpr uint32_t GetVulkanApiVersion()
-{
-#if VMA_VULKAN_VERSION == 1002000
-    return VK_API_VERSION_1_2;
-#elif VMA_VULKAN_VERSION == 1001000
-    return VK_API_VERSION_1_1;
-#elif VMA_VULKAN_VERSION == 1000000
-    return VK_API_VERSION_1_0;
-#else
-    #error Invalid VMA_VULKAN_VERSION.
-    return UINT32_MAX;
-#endif
-}
-
 static void PrintEnabledFeatures()
 {
+    wprintf(L"Enabled extensions and features:\n");
     wprintf(L"Validation layer: %d\n", g_EnableValidationLayer ? 1 : 0);
     wprintf(L"Sparse binding: %d\n", g_SparseBindingEnabled ? 1 : 0);
-    wprintf(L"Buffer device address: %d\n", g_BufferDeviceAddressEnabled ? 1 : 0);
     if(GetVulkanApiVersion() == VK_API_VERSION_1_0)
     {
         wprintf(L"VK_KHR_get_memory_requirements2: %d\n", VK_KHR_get_memory_requirements2_enabled ? 1 : 0);
@@ -1147,8 +1371,15 @@
     }
     wprintf(L"VK_EXT_memory_budget: %d\n", VK_EXT_memory_budget_enabled ? 1 : 0);
     wprintf(L"VK_AMD_device_coherent_memory: %d\n", VK_AMD_device_coherent_memory_enabled ? 1 : 0);
-    wprintf(L"VK_KHR_buffer_device_address: %d\n", VK_KHR_buffer_device_address_enabled ? 1 : 0);
-    wprintf(L"VK_EXT_buffer_device_address: %d\n", VK_EXT_buffer_device_address_enabled ? 1 : 0);
+    if(GetVulkanApiVersion() < VK_API_VERSION_1_2)
+    {
+        wprintf(L"VK_KHR_buffer_device_address: %d\n", VK_KHR_buffer_device_address_enabled ? 1 : 0);
+    }
+    else
+    {
+        wprintf(L"bufferDeviceAddress: %d\n", VK_KHR_buffer_device_address_enabled ? 1 : 0);
+    }
+    wprintf(L"VK_EXT_memory_priority: %d\n", VK_EXT_memory_priority ? 1 : 0);
 }
 
 void SetAllocatorCreateInfo(VmaAllocatorCreateInfo& outInfo)
@@ -1179,10 +1410,16 @@
     {
         outInfo.flags |= VMA_ALLOCATOR_CREATE_AMD_DEVICE_COHERENT_MEMORY_BIT;
     }
-    if(g_BufferDeviceAddressEnabled)
+    if(VK_KHR_buffer_device_address_enabled)
     {
         outInfo.flags |= VMA_ALLOCATOR_CREATE_BUFFER_DEVICE_ADDRESS_BIT;
     }
+#if !defined(VMA_MEMORY_PRIORITY) || VMA_MEMORY_PRIORITY == 1
+    if(VK_EXT_memory_priority_enabled)
+    {
+        outInfo.flags |= VMA_ALLOCATOR_CREATE_EXT_MEMORY_PRIORITY_BIT;
+    }
+#endif
 
     if(USE_CUSTOM_CPU_ALLOCATION_CALLBACKS)
     {
@@ -1207,94 +1444,317 @@
 
 static void PrintPhysicalDeviceProperties(const VkPhysicalDeviceProperties& properties)
 {
-    wprintf(L"Physical device:\n");
-    wprintf(L"    Driver version: 0x%X\n", properties.driverVersion);
-    wprintf(L"    Vendor ID: 0x%X\n", properties.vendorID);
-    wprintf(L"    Device ID: 0x%X\n", properties.deviceID);
-    wprintf(L"    Device type: %u\n", properties.deviceType);
-    wprintf(L"    Device name: %hs\n", properties.deviceName);
+    wprintf(L"physicalDeviceProperties:\n");
+    wprintf(L"    driverVersion: 0x%X\n", properties.driverVersion);
+    wprintf(L"    vendorID: 0x%X (%s)\n", properties.vendorID, VendorIDToStr(properties.vendorID));
+    wprintf(L"    deviceID: 0x%X\n", properties.deviceID);
+    wprintf(L"    deviceType: %u (%s)\n", properties.deviceType, PhysicalDeviceTypeToStr(properties.deviceType));
+    wprintf(L"    deviceName: %hs\n", properties.deviceName);
+    wprintf(L"    limits:\n");
+    wprintf(L"        maxMemoryAllocationCount: %u\n", properties.limits.maxMemoryAllocationCount);
+    wprintf(L"        bufferImageGranularity: %llu B\n", properties.limits.bufferImageGranularity);
+    wprintf(L"        nonCoherentAtomSize: %llu B\n", properties.limits.nonCoherentAtomSize);
 }
 
-static void InitializeApplication()
+#if VMA_VULKAN_VERSION >= 1002000
+static void PrintPhysicalDeviceVulkan11Properties(const VkPhysicalDeviceVulkan11Properties& properties)
 {
-    if(USE_CUSTOM_CPU_ALLOCATION_CALLBACKS)
-    {
-        g_Allocs = &g_CpuAllocationCallbacks;
-    }
+    wprintf(L"physicalDeviceVulkan11Properties:\n");
+    std::wstring sizeStr = SizeToStr(properties.maxMemoryAllocationSize);
+    wprintf(L"    maxMemoryAllocationSize: %llu B (%s)\n", properties.maxMemoryAllocationSize, sizeStr.c_str());
+}
+static void PrintPhysicalDeviceVulkan12Properties(const VkPhysicalDeviceVulkan12Properties& properties)
+{
+    wprintf(L"physicalDeviceVulkan12Properties:\n");
+    std::wstring str = DriverIDToStr(properties.driverID);
+    wprintf(L"    driverID: %u (%s)\n", properties.driverID, str.c_str());
+    wprintf(L"    driverName: %hs\n", properties.driverName);
+    wprintf(L"    driverInfo: %hs\n", properties.driverInfo);
+}
+#endif // #if VMA_VULKAN_VERSION > 1002000
 
-    uint32_t instanceLayerPropCount = 0;
-    ERR_GUARD_VULKAN( vkEnumerateInstanceLayerProperties(&instanceLayerPropCount, nullptr) );
-    std::vector<VkLayerProperties> instanceLayerProps(instanceLayerPropCount);
-    if(instanceLayerPropCount > 0)
-    {
-        ERR_GUARD_VULKAN( vkEnumerateInstanceLayerProperties(&instanceLayerPropCount, instanceLayerProps.data()) );
-    }
+static void AddFlagToStr(std::wstring& inout, const wchar_t* flagStr)
+{
+    if(!inout.empty())
+        inout += L", ";
+    inout += flagStr;
+}
 
-    if(g_EnableValidationLayer == true)
+static std::wstring HeapFlagsToStr(VkMemoryHeapFlags flags)
+{
+    std::wstring result;
+    if(flags & VK_MEMORY_HEAP_DEVICE_LOCAL_BIT)
+        AddFlagToStr(result, L"DEVICE_LOCAL");
+    if(flags & VK_MEMORY_HEAP_MULTI_INSTANCE_BIT)
+        AddFlagToStr(result, L"MULTI_INSTANCE");
+    return result;
+}
+
+static std::wstring PropertyFlagsToStr(VkMemoryPropertyFlags flags)
+{
+    std::wstring result;
+    if(flags & VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT)
+        AddFlagToStr(result, L"DEVICE_LOCAL");
+    if(flags & VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT)
+        AddFlagToStr(result, L"HOST_VISIBLE");
+    if(flags & VK_MEMORY_PROPERTY_HOST_COHERENT_BIT)
+        AddFlagToStr(result, L"HOST_COHERENT");
+    if(flags & VK_MEMORY_PROPERTY_HOST_CACHED_BIT)
+        AddFlagToStr(result, L"HOST_CACHED");
+    if(flags & VK_MEMORY_PROPERTY_LAZILY_ALLOCATED_BIT)
+        AddFlagToStr(result, L"LAZILY_ALLOCATED");
+
+#if VMA_VULKAN_VERSION >= 1001000
+    if(flags & VK_MEMORY_PROPERTY_PROTECTED_BIT)
+        AddFlagToStr(result, L"PROTECTED");
+#endif
+
+#if VK_AMD_device_coherent_memory
+    if(flags & VK_MEMORY_PROPERTY_DEVICE_COHERENT_BIT_AMD)
+        AddFlagToStr(result, L"DEVICE_COHERENT (AMD)");
+    if(flags & VK_MEMORY_PROPERTY_DEVICE_UNCACHED_BIT_AMD)
+        AddFlagToStr(result, L"DEVICE_UNCACHED (AMD)");
+#endif
+
+    return result;
+}
+
+static void PrintMemoryTypes()
+{
+    wprintf(L"MEMORY HEAPS:\n");
+    const VkPhysicalDeviceMemoryProperties* memProps = nullptr;
+    vmaGetMemoryProperties(g_hAllocator, &memProps);
+
+    wprintf(L"heapCount=%u, typeCount=%u\n", memProps->memoryHeapCount, memProps->memoryTypeCount);
+
+    std::wstring sizeStr, flagsStr;
+    for(uint32_t heapIndex = 0; heapIndex < memProps->memoryHeapCount; ++heapIndex)
     {
-        if(IsLayerSupported(instanceLayerProps.data(), instanceLayerProps.size(), VALIDATION_LAYER_NAME) == false)
+        const VkMemoryHeap& heap = memProps->memoryHeaps[heapIndex];
+        sizeStr = SizeToStr(heap.size);
+        flagsStr = HeapFlagsToStr(heap.flags);
+        wprintf(L"Heap %u: %llu B (%s) %s\n", heapIndex, heap.size, sizeStr.c_str(), flagsStr.c_str());
+        
+        for(uint32_t typeIndex = 0; typeIndex < memProps->memoryTypeCount; ++typeIndex)
         {
-            wprintf(L"Layer \"%hs\" not supported.", VALIDATION_LAYER_NAME);
-            g_EnableValidationLayer = false;
+            const VkMemoryType& type = memProps->memoryTypes[typeIndex];
+            if(type.heapIndex == heapIndex)
+            {
+                flagsStr = PropertyFlagsToStr(type.propertyFlags);
+                wprintf(L"    Type %u: %s\n", typeIndex, flagsStr.c_str());
+            }
         }
     }
+}
 
-    uint32_t availableInstanceExtensionCount = 0;
-    ERR_GUARD_VULKAN( vkEnumerateInstanceExtensionProperties(nullptr, &availableInstanceExtensionCount, nullptr) );
-    std::vector<VkExtensionProperties> availableInstanceExtensions(availableInstanceExtensionCount);
-    if(availableInstanceExtensionCount > 0)
+#if 0
+template<typename It, typename MapFunc>
+inline VkDeviceSize MapSum(It beg, It end, MapFunc mapFunc)
+{
+    VkDeviceSize result = 0;
+    for(It it = beg; it != end; ++it)
+        result += mapFunc(*it);
+    return result;
+}
+#endif
+
+static bool CanCreateVertexBuffer(uint32_t allowedMemoryTypeBits)
+{
+    VkBufferCreateInfo bufCreateInfo = { VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO };
+    bufCreateInfo.size = 0x10000;
+    bufCreateInfo.usage = VK_BUFFER_USAGE_VERTEX_BUFFER_BIT | VK_BUFFER_USAGE_TRANSFER_DST_BIT;
+
+    VkBuffer buf = VK_NULL_HANDLE;
+    VkResult res = vkCreateBuffer(g_hDevice, &bufCreateInfo, g_Allocs, &buf);
+    assert(res == VK_SUCCESS);
+
+    VkMemoryRequirements memReq = {};
+    vkGetBufferMemoryRequirements(g_hDevice, buf, &memReq);
+
+    vkDestroyBuffer(g_hDevice, buf, g_Allocs);
+
+    return (memReq.memoryTypeBits & allowedMemoryTypeBits) != 0;
+}
+
+static bool CanCreateOptimalSampledImage(uint32_t allowedMemoryTypeBits)
+{
+    VkImageCreateInfo imgCreateInfo = { VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO };
+    imgCreateInfo.imageType = VK_IMAGE_TYPE_2D;
+    imgCreateInfo.extent.width = 256;
+    imgCreateInfo.extent.height = 256;
+    imgCreateInfo.extent.depth = 1;
+    imgCreateInfo.mipLevels = 1;
+    imgCreateInfo.arrayLayers = 1;
+    imgCreateInfo.format = VK_FORMAT_R8G8B8A8_UNORM;
+    imgCreateInfo.tiling = VK_IMAGE_TILING_OPTIMAL;
+    imgCreateInfo.initialLayout = VK_IMAGE_LAYOUT_PREINITIALIZED;
+    imgCreateInfo.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_SAMPLED_BIT;
+    imgCreateInfo.samples = VK_SAMPLE_COUNT_1_BIT;
+
+    VkImage img = VK_NULL_HANDLE;
+    VkResult res = vkCreateImage(g_hDevice, &imgCreateInfo, g_Allocs, &img);
+    assert(res == VK_SUCCESS);
+
+    VkMemoryRequirements memReq = {};
+    vkGetImageMemoryRequirements(g_hDevice, img, &memReq);
+
+    vkDestroyImage(g_hDevice, img, g_Allocs);
+
+    return (memReq.memoryTypeBits & allowedMemoryTypeBits) != 0;
+}
+
+static void PrintMemoryConclusions()
+{
+    wprintf(L"Conclusions:\n");
+
+    const VkPhysicalDeviceProperties* props = nullptr;
+    const VkPhysicalDeviceMemoryProperties* memProps = nullptr;
+    vmaGetPhysicalDeviceProperties(g_hAllocator, &props);
+    vmaGetMemoryProperties(g_hAllocator, &memProps);
+
+    const uint32_t heapCount = memProps->memoryHeapCount;
+
+    uint32_t deviceLocalHeapCount = 0;
+    uint32_t hostVisibleHeapCount = 0;
+    uint32_t deviceLocalAndHostVisibleHeapCount = 0;
+    VkDeviceSize deviceLocalHeapSumSize = 0;
+    VkDeviceSize hostVisibleHeapSumSize = 0;
+    VkDeviceSize deviceLocalAndHostVisibleHeapSumSize = 0;
+
+    for(uint32_t heapIndex = 0; heapIndex < heapCount; ++heapIndex)
     {
-        ERR_GUARD_VULKAN( vkEnumerateInstanceExtensionProperties(nullptr, &availableInstanceExtensionCount, availableInstanceExtensions.data()) );
-    }
-
-    std::vector<const char*> enabledInstanceExtensions;
-    enabledInstanceExtensions.push_back(VK_KHR_SURFACE_EXTENSION_NAME);
-    enabledInstanceExtensions.push_back(VK_KHR_WIN32_SURFACE_EXTENSION_NAME);
-
-    std::vector<const char*> instanceLayers;
-    if(g_EnableValidationLayer == true)
-    {
-        instanceLayers.push_back(VALIDATION_LAYER_NAME);
-        enabledInstanceExtensions.push_back("VK_EXT_debug_report");
-    }
-
-    for(const auto& extensionProperties : availableInstanceExtensions)
-    {
-        if(strcmp(extensionProperties.extensionName, VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME) == 0)
+        const VkMemoryHeap& heap = memProps->memoryHeaps[heapIndex];
+        const bool isDeviceLocal = (heap.flags & VK_MEMORY_HEAP_DEVICE_LOCAL_BIT) != 0;
+        bool isHostVisible = false;
+        for(uint32_t typeIndex = 0; typeIndex < memProps->memoryTypeCount; ++typeIndex)
         {
-            if(GetVulkanApiVersion() == VK_API_VERSION_1_0)
-            {   
-                enabledInstanceExtensions.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
-                VK_KHR_get_physical_device_properties2_enabled = true;
+            const VkMemoryType& type = memProps->memoryTypes[typeIndex];
+            if(type.heapIndex == heapIndex && (type.propertyFlags & VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT))
+            {
+                isHostVisible = true;
+                break;
+            }
+        }
+        if(isDeviceLocal)
+        {
+            ++deviceLocalHeapCount;
+            deviceLocalHeapSumSize += heap.size;
+        }
+        if(isHostVisible)
+        {
+            ++hostVisibleHeapCount;
+            hostVisibleHeapSumSize += heap.size;
+            if(isDeviceLocal)
+            {
+                ++deviceLocalAndHostVisibleHeapCount;
+                deviceLocalAndHostVisibleHeapSumSize += heap.size;
             }
         }
     }
 
-    VkApplicationInfo appInfo = { VK_STRUCTURE_TYPE_APPLICATION_INFO };
-    appInfo.pApplicationName = APP_TITLE_A;
-    appInfo.applicationVersion = VK_MAKE_VERSION(1, 0, 0);
-    appInfo.pEngineName = "Adam Sawicki Engine";
-    appInfo.engineVersion = VK_MAKE_VERSION(1, 0, 0);
-    appInfo.apiVersion = GetVulkanApiVersion();
-
-    VkInstanceCreateInfo instInfo = { VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO };
-    instInfo.pApplicationInfo = &appInfo;
-    instInfo.enabledExtensionCount = static_cast<uint32_t>(enabledInstanceExtensions.size());
-    instInfo.ppEnabledExtensionNames = enabledInstanceExtensions.data();
-    instInfo.enabledLayerCount = static_cast<uint32_t>(instanceLayers.size());
-    instInfo.ppEnabledLayerNames = instanceLayers.data();
-
-    wprintf(L"Vulkan API version: ");
-    switch(appInfo.apiVersion)
+    uint32_t hostVisibleNotHostCoherentTypeCount = 0;
+    uint32_t notDeviceLocalNotHostVisibleTypeCount = 0;
+    uint32_t amdSpecificTypeCount = 0;
+    uint32_t lazilyAllocatedTypeCount = 0;
+    uint32_t allTypeBits = 0;
+    uint32_t deviceLocalTypeBits = 0;
+    for(uint32_t typeIndex = 0; typeIndex < memProps->memoryTypeCount; ++typeIndex)
     {
-    case VK_API_VERSION_1_0: wprintf(L"1.0\n"); break;
-    case VK_API_VERSION_1_1: wprintf(L"1.1\n"); break;
-    case VK_API_VERSION_1_2: wprintf(L"1.2\n"); break;
-    default: assert(0);
+        const VkMemoryType& type = memProps->memoryTypes[typeIndex];
+        allTypeBits |= 1u << typeIndex;
+        if(type.propertyFlags & VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT)
+        {
+            deviceLocalTypeBits |= 1u << typeIndex;
+        }
+        if((type.propertyFlags & VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT) &&
+            (type.propertyFlags & VK_MEMORY_PROPERTY_HOST_COHERENT_BIT) == 0)
+        {
+            ++hostVisibleNotHostCoherentTypeCount;
+        }
+        if((type.propertyFlags & VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT) == 0 &&
+            (type.propertyFlags & VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT) == 0)
+        {
+            ++notDeviceLocalNotHostVisibleTypeCount;
+        }
+        if(type.propertyFlags & (VK_MEMORY_PROPERTY_DEVICE_COHERENT_BIT_AMD | VK_MEMORY_PROPERTY_DEVICE_UNCACHED_BIT_AMD))
+        {
+            ++amdSpecificTypeCount;
+        }
+        if(type.propertyFlags & VK_MEMORY_PROPERTY_LAZILY_ALLOCATED_BIT)
+        {
+            ++lazilyAllocatedTypeCount;
+        }
     }
 
-    ERR_GUARD_VULKAN( vkCreateInstance(&instInfo, g_Allocs, &g_hVulkanInstance) );
+    assert(deviceLocalHeapCount > 0);
+    if(deviceLocalHeapCount == heapCount)
+        wprintf(L"- All heaps are DEVICE_LOCAL.\n");
+    else
+        wprintf(L"- %u heaps are DEVICE_LOCAL, total %s.\n", deviceLocalHeapCount, SizeToStr(deviceLocalHeapSumSize).c_str());
 
+    assert(hostVisibleHeapCount > 0);
+    if(hostVisibleHeapCount == heapCount)
+        wprintf(L"- All heaps are HOST_VISIBLE.\n");
+    else
+        wprintf(L"- %u heaps are HOST_VISIBLE, total %s.\n", deviceLocalHeapCount, SizeToStr(hostVisibleHeapSumSize).c_str());
+
+    if(deviceLocalHeapCount < heapCount && hostVisibleHeapCount < heapCount)
+    {
+        if(deviceLocalAndHostVisibleHeapCount == 0)
+            wprintf(L"- No heaps are DEVICE_LOCAL and HOST_VISIBLE.\n");
+        if(deviceLocalAndHostVisibleHeapCount == heapCount)
+            wprintf(L"- All heaps are DEVICE_LOCAL and HOST_VISIBLE.\n");
+        else
+            wprintf(L"- %u heaps are DEVICE_LOCAL and HOST_VISIBLE, total %s.\n", deviceLocalAndHostVisibleHeapCount, SizeToStr(deviceLocalAndHostVisibleHeapSumSize).c_str());
+    }
+
+    if(hostVisibleNotHostCoherentTypeCount == 0)
+        wprintf(L"- No types are HOST_VISIBLE but not HOST_COHERENT.\n");
+    else
+        wprintf(L"- %u types are HOST_VISIBLE but not HOST_COHERENT.\n", hostVisibleNotHostCoherentTypeCount);
+
+    if(notDeviceLocalNotHostVisibleTypeCount == 0)
+        wprintf(L"- No types are not DEVICE_LOCAL and not HOST_VISIBLE.\n");
+    else
+        wprintf(L"- %u types are not DEVICE_LOCAL and not HOST_VISIBLE.\n", notDeviceLocalNotHostVisibleTypeCount);
+
+    if(amdSpecificTypeCount == 0)
+        wprintf(L"- No types are AMD-specific DEVICE_COHERENT or DEVICE_UNCACHED.\n");
+    else
+        wprintf(L"- %u types are AMD-specific DEVICE_COHERENT or DEVICE_UNCACHED.\n", amdSpecificTypeCount);
+
+    if(lazilyAllocatedTypeCount == 0)
+        wprintf(L"- No types are LAZILY_ALLOCATED.\n");
+    else
+        wprintf(L"- %u types are LAZILY_ALLOCATED.\n", lazilyAllocatedTypeCount);
+
+    if(props->vendorID == VENDOR_ID_AMD &&
+        props->deviceType == VK_PHYSICAL_DEVICE_TYPE_DISCRETE_GPU &&
+        deviceLocalAndHostVisibleHeapSumSize > 256llu * 1024 * 1024)
+    {
+        wprintf(L"- AMD Smart Access Memory (SAM) is enabled!\n");
+    }
+
+    if(deviceLocalHeapCount < heapCount)
+    {
+        const uint32_t nonDeviceLocalTypeBits = ~deviceLocalTypeBits & allTypeBits;
+        
+        if(CanCreateVertexBuffer(nonDeviceLocalTypeBits))
+            wprintf(L"- A buffer with VERTEX_BUFFER usage can be created in some non-DEVICE_LOCAL type.\n");
+        else
+            wprintf(L"- A buffer with VERTEX_BUFFER usage cannot be created in some non-DEVICE_LOCAL type.\n");
+
+        if(CanCreateOptimalSampledImage(nonDeviceLocalTypeBits))
+            wprintf(L"- An image with OPTIMAL tiling and SAMPLED usage can be created in some non-DEVICE_LOCAL type.\n");
+        else
+            wprintf(L"- An image with OPTIMAL tiling and SAMPLED usage cannot be created in some non-DEVICE_LOCAL type.\n");
+    }
+
+    //wprintf(L"\n");
+}
+
+static void InitializeApplication()
+{
     // Create VkSurfaceKHR.
     VkWin32SurfaceCreateInfoKHR surfaceInfo = { VK_STRUCTURE_TYPE_WIN32_SURFACE_CREATE_INFO_KHR };
     surfaceInfo.hinstance = g_hAppInstance;
@@ -1302,20 +1762,6 @@
     VkResult result = vkCreateWin32SurfaceKHR(g_hVulkanInstance, &surfaceInfo, g_Allocs, &g_hSurface);
     assert(result == VK_SUCCESS);
 
-    if(g_EnableValidationLayer == true)
-        RegisterDebugCallbacks();
-
-    // Find physical device
-
-    uint32_t deviceCount = 0;
-    ERR_GUARD_VULKAN( vkEnumeratePhysicalDevices(g_hVulkanInstance, &deviceCount, nullptr) );
-    assert(deviceCount > 0);
-
-    std::vector<VkPhysicalDevice> physicalDevices(deviceCount);
-    ERR_GUARD_VULKAN( vkEnumeratePhysicalDevices(g_hVulkanInstance, &deviceCount, physicalDevices.data()) );
-
-    g_hPhysicalDevice = physicalDevices[0];
-
     // Query for device extensions
 
     uint32_t physicalDeviceExtensionPropertyCount = 0;
@@ -1364,25 +1810,43 @@
                 VK_KHR_buffer_device_address_enabled = true;
             }
         }
-        else if(strcmp(physicalDeviceExtensionProperties[i].extensionName, VK_EXT_BUFFER_DEVICE_ADDRESS_EXTENSION_NAME) == 0)
-        {
-            if(GetVulkanApiVersion() < VK_API_VERSION_1_2)
-            {
-                VK_EXT_buffer_device_address_enabled = true;
-            }
-        }
+        else if(strcmp(physicalDeviceExtensionProperties[i].extensionName, VK_EXT_MEMORY_PRIORITY_EXTENSION_NAME) == 0)
+            VK_EXT_memory_priority_enabled = true;
     }
 
-    if(VK_EXT_buffer_device_address_enabled && VK_KHR_buffer_device_address_enabled)
-        VK_EXT_buffer_device_address_enabled = false;
+    if(GetVulkanApiVersion() >= VK_API_VERSION_1_2)
+        VK_KHR_buffer_device_address_enabled = true; // Promoted to core Vulkan 1.2.
 
     // Query for features
 
+#if VMA_VULKAN_VERSION >= 1001000
+    VkPhysicalDeviceProperties2 physicalDeviceProperties2 = { VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROPERTIES_2 };
+    
+#if VMA_VULKAN_VERSION >= 1002000
+    // Vulkan spec says structure VkPhysicalDeviceVulkan11Properties is "Provided by VK_VERSION_1_2" - is this a mistake? Assuming not...
+    VkPhysicalDeviceVulkan11Properties physicalDeviceVulkan11Properties = { VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_1_PROPERTIES };
+    VkPhysicalDeviceVulkan12Properties physicalDeviceVulkan12Properties = { VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_PROPERTIES };
+    PnextChainPushFront(&physicalDeviceProperties2, &physicalDeviceVulkan11Properties);
+    PnextChainPushFront(&physicalDeviceProperties2, &physicalDeviceVulkan12Properties);
+#endif
+
+    vkGetPhysicalDeviceProperties2(g_hPhysicalDevice, &physicalDeviceProperties2);
+
+    PrintPhysicalDeviceProperties(physicalDeviceProperties2.properties);
+#if VMA_VULKAN_VERSION >= 1002000
+    PrintPhysicalDeviceVulkan11Properties(physicalDeviceVulkan11Properties);
+    PrintPhysicalDeviceVulkan12Properties(physicalDeviceVulkan12Properties);
+#endif
+
+#else // #if VMA_VULKAN_VERSION >= 1001000
     VkPhysicalDeviceProperties physicalDeviceProperties = {};
     vkGetPhysicalDeviceProperties(g_hPhysicalDevice, &physicalDeviceProperties);
-
     PrintPhysicalDeviceProperties(physicalDeviceProperties);
 
+#endif // #if VMA_VULKAN_VERSION >= 1001000
+
+    wprintf(L"\n");
+
     VkPhysicalDeviceFeatures2 physicalDeviceFeatures = { VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2 };
     
     VkPhysicalDeviceCoherentMemoryFeaturesAMD physicalDeviceCoherentMemoryFeatures = { VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COHERENT_MEMORY_FEATURES_AMD };
@@ -1391,12 +1855,18 @@
         PnextChainPushFront(&physicalDeviceFeatures, &physicalDeviceCoherentMemoryFeatures);
     }
     
-    VkPhysicalDeviceBufferDeviceAddressFeaturesEXT physicalDeviceBufferDeviceAddressFeatures = { VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_BUFFER_DEVICE_ADDRESS_FEATURES_EXT };
-    if(VK_KHR_buffer_device_address_enabled || VK_EXT_buffer_device_address_enabled || GetVulkanApiVersion() >= VK_API_VERSION_1_2)
+    VkPhysicalDeviceBufferDeviceAddressFeaturesKHR physicalDeviceBufferDeviceAddressFeatures = { VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_BUFFER_DEVICE_ADDRESS_FEATURES_KHR };
+    if(VK_KHR_buffer_device_address_enabled)
     {
         PnextChainPushFront(&physicalDeviceFeatures, &physicalDeviceBufferDeviceAddressFeatures);
     }
 
+    VkPhysicalDeviceMemoryPriorityFeaturesEXT physicalDeviceMemoryPriorityFeatures = { VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MEMORY_PRIORITY_FEATURES_EXT };
+    if(VK_EXT_memory_priority_enabled)
+    {
+        PnextChainPushFront(&physicalDeviceFeatures, &physicalDeviceMemoryPriorityFeatures);
+    }
+
     vkGetPhysicalDeviceFeatures2(g_hPhysicalDevice, &physicalDeviceFeatures);
 
     g_SparseBindingEnabled = physicalDeviceFeatures.features.sparseBinding != 0;
@@ -1404,8 +1874,10 @@
     // The extension is supported as fake with no real support for this feature? Don't use it.
     if(VK_AMD_device_coherent_memory_enabled && !physicalDeviceCoherentMemoryFeatures.deviceCoherentMemory)
         VK_AMD_device_coherent_memory_enabled = false;
-    if(VK_KHR_buffer_device_address_enabled || VK_EXT_buffer_device_address_enabled || GetVulkanApiVersion() >= VK_API_VERSION_1_2)
-        g_BufferDeviceAddressEnabled = physicalDeviceBufferDeviceAddressFeatures.bufferDeviceAddress != VK_FALSE;
+    if(VK_KHR_buffer_device_address_enabled && !physicalDeviceBufferDeviceAddressFeatures.bufferDeviceAddress)
+        VK_KHR_buffer_device_address_enabled = false;
+    if(VK_EXT_memory_priority_enabled && !physicalDeviceMemoryPriorityFeatures.memoryPriority)
+        VK_EXT_memory_priority_enabled = false;
 
     // Find queue family index
 
@@ -1494,10 +1966,10 @@
         enabledDeviceExtensions.push_back(VK_EXT_MEMORY_BUDGET_EXTENSION_NAME);
     if(VK_AMD_device_coherent_memory_enabled)
         enabledDeviceExtensions.push_back(VK_AMD_DEVICE_COHERENT_MEMORY_EXTENSION_NAME);
-    if(VK_KHR_buffer_device_address_enabled)
+    if(VK_KHR_buffer_device_address_enabled && GetVulkanApiVersion() < VK_API_VERSION_1_2)
         enabledDeviceExtensions.push_back(VK_KHR_BUFFER_DEVICE_ADDRESS_EXTENSION_NAME);
-    if(VK_EXT_buffer_device_address_enabled)
-        enabledDeviceExtensions.push_back(VK_EXT_BUFFER_DEVICE_ADDRESS_EXTENSION_NAME);
+    if(VK_EXT_memory_priority_enabled)
+        enabledDeviceExtensions.push_back(VK_EXT_MEMORY_PRIORITY_EXTENSION_NAME);
 
     VkPhysicalDeviceFeatures2 deviceFeatures = { VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2 };
     deviceFeatures.features.samplerAnisotropy = VK_TRUE;
@@ -1508,12 +1980,16 @@
         physicalDeviceCoherentMemoryFeatures.deviceCoherentMemory = VK_TRUE;
         PnextChainPushBack(&deviceFeatures, &physicalDeviceCoherentMemoryFeatures);
     }
-    if(g_BufferDeviceAddressEnabled)
+    if(VK_KHR_buffer_device_address_enabled)
     {
-        physicalDeviceBufferDeviceAddressFeatures = { VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_BUFFER_DEVICE_ADDRESS_FEATURES_EXT };
+        physicalDeviceBufferDeviceAddressFeatures = { VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_BUFFER_DEVICE_ADDRESS_FEATURES_KHR };
         physicalDeviceBufferDeviceAddressFeatures.bufferDeviceAddress = VK_TRUE;
         PnextChainPushBack(&deviceFeatures, &physicalDeviceBufferDeviceAddressFeatures);
     }
+    if(VK_EXT_memory_priority_enabled)
+    {
+        PnextChainPushBack(&deviceFeatures, &physicalDeviceMemoryPriorityFeatures);
+    }
 
     VkDeviceCreateInfo deviceCreateInfo = { VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO };
     deviceCreateInfo.pNext = &deviceFeatures;
@@ -1527,48 +2003,17 @@
     ERR_GUARD_VULKAN( vkCreateDevice(g_hPhysicalDevice, &deviceCreateInfo, g_Allocs, &g_hDevice) );
 
     // Fetch pointers to extension functions
-    if(g_BufferDeviceAddressEnabled)
+    if(VK_KHR_buffer_device_address_enabled)
     {
         if(GetVulkanApiVersion() >= VK_API_VERSION_1_2)
         {
-            g_vkGetBufferDeviceAddressEXT = (PFN_vkGetBufferDeviceAddressEXT)vkGetDeviceProcAddr(g_hDevice, "vkGetBufferDeviceAddress");
-            //assert(g_vkGetBufferDeviceAddressEXT != nullptr);
-            /*
-            For some reason this doesn't work, the pointer is NULL :( None of the below methods help.
-
-            Validation layers also report following error:
-            [ VUID-VkMemoryAllocateInfo-flags-03331 ] Object: VK_NULL_HANDLE (Type = 0) | If VK_MEMORY_ALLOCATE_DEVICE_ADDRESS_BIT_KHR is set, bufferDeviceAddress must be enabled. The Vulkan spec states: If VkMemoryAllocateFlagsInfo::flags includes VK_MEMORY_ALLOCATE_DEVICE_ADDRESS_BIT, the bufferDeviceAddress feature must be enabled (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkMemoryAllocateInfo-flags-03331)
-            Despite I'm posting VkPhysicalDeviceBufferDeviceAddressFeaturesEXT::bufferDeviceAddress = VK_TRUE in VkDeviceCreateInfo::pNext chain.
-
-            if(g_vkGetBufferDeviceAddressEXT == nullptr)
-            {
-                g_vkGetBufferDeviceAddressEXT = &vkGetBufferDeviceAddress; // Doesn't run, cannot find entry point...
-            }
-
-            if(g_vkGetBufferDeviceAddressEXT == nullptr)
-            {
-                g_vkGetBufferDeviceAddressEXT = (PFN_vkGetBufferDeviceAddressEXT)vkGetInstanceProcAddr(g_hVulkanInstance, "vkGetBufferDeviceAddress");
-            }
-            if(g_vkGetBufferDeviceAddressEXT == nullptr)
-            {
-                g_vkGetBufferDeviceAddressEXT = (PFN_vkGetBufferDeviceAddressEXT)vkGetDeviceProcAddr(g_hDevice, "vkGetBufferDeviceAddressKHR");
-            }
-            if(g_vkGetBufferDeviceAddressEXT == nullptr)
-            {
-                g_vkGetBufferDeviceAddressEXT = (PFN_vkGetBufferDeviceAddressEXT)vkGetDeviceProcAddr(g_hDevice, "vkGetBufferDeviceAddressEXT");
-            }
-            */
+            g_vkGetBufferDeviceAddressKHR = (PFN_vkGetBufferDeviceAddressEXT)vkGetDeviceProcAddr(g_hDevice, "vkGetBufferDeviceAddress");
         }
         else if(VK_KHR_buffer_device_address_enabled)
         {
-            g_vkGetBufferDeviceAddressEXT = (PFN_vkGetBufferDeviceAddressEXT)vkGetDeviceProcAddr(g_hDevice, "vkGetBufferDeviceAddressKHR");
-            assert(g_vkGetBufferDeviceAddressEXT != nullptr);
+            g_vkGetBufferDeviceAddressKHR = (PFN_vkGetBufferDeviceAddressEXT)vkGetDeviceProcAddr(g_hDevice, "vkGetBufferDeviceAddressKHR");
         }
-        else if(VK_EXT_buffer_device_address_enabled)
-        {
-            g_vkGetBufferDeviceAddressEXT = (PFN_vkGetBufferDeviceAddressEXT)vkGetDeviceProcAddr(g_hDevice, "vkGetBufferDeviceAddressEXT");
-            assert(g_vkGetBufferDeviceAddressEXT != nullptr);
-        }
+        assert(g_vkGetBufferDeviceAddressKHR != nullptr);
     }
 
     // Create memory allocator
@@ -1577,7 +2022,12 @@
     SetAllocatorCreateInfo(allocatorInfo);
     ERR_GUARD_VULKAN( vmaCreateAllocator(&allocatorInfo, &g_hAllocator) );
 
+    PrintMemoryTypes();
+    wprintf(L"\n");
+    PrintMemoryConclusions();
+    wprintf(L"\n");
     PrintEnabledFeatures();
+    wprintf(L"\n");
 
     // Retrieve queues (don't need to be destroyed).
 
@@ -1782,23 +2232,11 @@
         g_hDevice = nullptr;
     }
 
-    if(g_pvkDestroyDebugReportCallbackEXT && g_hCallback != VK_NULL_HANDLE)
-    {
-        g_pvkDestroyDebugReportCallbackEXT(g_hVulkanInstance, g_hCallback, g_Allocs);
-        g_hCallback = VK_NULL_HANDLE;
-    }
-
     if(g_hSurface != VK_NULL_HANDLE)
     {
         vkDestroySurfaceKHR(g_hVulkanInstance, g_hSurface, g_Allocs);
         g_hSurface = VK_NULL_HANDLE;
     }
-
-    if(g_hVulkanInstance != VK_NULL_HANDLE)
-    {
-        vkDestroyInstance(g_hVulkanInstance, g_Allocs);
-        g_hVulkanInstance = VK_NULL_HANDLE;
-    }
 }
 
 static void PrintAllocatorStats()
@@ -1961,6 +2399,18 @@
     }
 }
 
+#define CATCH_PRINT_ERROR(extraCatchCode) \
+    catch(const std::exception& ex) \
+    { \
+        fwprintf(stderr, L"ERROR: %hs\n", ex.what()); \
+        extraCatchCode \
+    } \
+    catch(...) \
+    { \
+        fwprintf(stderr, L"UNKNOWN ERROR.\n"); \
+        extraCatchCode \
+    }
+
 static LRESULT WINAPI WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
 {
     switch(msg)
@@ -1968,12 +2418,20 @@
     case WM_CREATE:
         // This is intentionally assigned here because we are now inside CreateWindow, before it returns.
         g_hWnd = hWnd;
-        InitializeApplication();
-        PrintAllocatorStats();
+        try
+        {
+            InitializeApplication();
+        }
+        CATCH_PRINT_ERROR(return -1;)
+        //PrintAllocatorStats();
         return 0;
 
     case WM_DESTROY:
-        FinalizeApplication();
+        try
+        {
+            FinalizeApplication();
+        }
+        CATCH_PRINT_ERROR(;)
         PostQuitMessage(0);
         return 0;
 
@@ -1985,11 +2443,21 @@
 
     case WM_SIZE:
         if((wParam == SIZE_MAXIMIZED) || (wParam == SIZE_RESTORED))
-            HandlePossibleSizeChange();
+        {
+            try
+            {
+                HandlePossibleSizeChange();
+            }
+            CATCH_PRINT_ERROR(DestroyWindow(hWnd);)
+        }
         return 0;
 
     case WM_EXITSIZEMOVE:
-        HandlePossibleSizeChange();
+        try
+        {
+            HandlePossibleSizeChange();
+        }
+        CATCH_PRINT_ERROR(DestroyWindow(hWnd);)
         return 0;
 
     case WM_KEYDOWN:
@@ -2003,17 +2471,18 @@
             {
                 Test();
             }
-            catch(const std::exception& ex)
-            {
-                printf("ERROR: %s\n", ex.what());
-            }
+            CATCH_PRINT_ERROR(;)
             break;
         case 'S':
             try
             {
                 if(g_SparseBindingEnabled)
                 {
-                    TestSparseBinding();
+                    try
+                    {
+                        TestSparseBinding();
+                    }
+                    CATCH_PRINT_ERROR(;)
                 }
                 else
                 {
@@ -2035,10 +2504,24 @@
     return DefWindowProc(hWnd, msg, wParam, lParam);
 }
 
-int main()
+static void PrintLogo()
 {
-    g_hAppInstance = (HINSTANCE)GetModuleHandle(NULL);
+    wprintf(L"%s\n", APP_TITLE_W);
+}
 
+static void PrintHelp()
+{
+    wprintf(
+        L"Command line syntax:\n"
+        L"-h, --Help   Print this information\n"
+        L"-l, --List   Print list of GPUs\n"
+        L"-g S, --GPU S   Select GPU with name containing S\n"
+        L"-i N, --GPUIndex N   Select GPU index N\n"
+    );
+}
+
+int MainWindow()
+{
     WNDCLASSEX wndClassDesc = { sizeof(WNDCLASSEX) };
     wndClassDesc.style = CS_VREDRAW | CS_HREDRAW | CS_DBLCLKS;
     wndClassDesc.hbrBackground = NULL;
@@ -2076,11 +2559,51 @@
             DrawFrame();
     }
 
-    TEST(g_CpuAllocCount.load() == 0);
-
-    return 0;
+    return (int)msg.wParam;;
 }
 
+int Main2(int argc, wchar_t** argv)
+{
+    PrintLogo();
+
+    if(!g_CommandLineParameters.Parse(argc, argv))
+    {
+        wprintf(L"ERROR: Invalid command line syntax.\n");
+        PrintHelp();
+        return (int)ExitCode::CommandLineError;
+    }
+
+    if(g_CommandLineParameters.m_Help)
+    {
+        PrintHelp();
+        return (int)ExitCode::Help;
+    }
+
+    VulkanUsage vulkanUsage;
+    vulkanUsage.Init();
+
+    if(g_CommandLineParameters.m_List)
+    {
+        vulkanUsage.PrintPhysicalDeviceList();
+        return (int)ExitCode::GPUList;
+    }
+
+    g_hPhysicalDevice = vulkanUsage.SelectPhysicalDevice(g_CommandLineParameters.m_GPUSelection);
+    TEST(g_hPhysicalDevice);
+
+    return MainWindow();
+}
+
+int wmain(int argc, wchar_t** argv)
+{
+    try
+    {
+        return Main2(argc, argv);
+        TEST(g_CpuAllocCount.load() == 0);
+    }
+    CATCH_PRINT_ERROR(return (int)ExitCode::RuntimeError;)
+} 
+
 #else // #ifdef _WIN32
 
 #include "VmaUsage.h"
diff --git a/third_party/vulkan_memory_allocator/tools/VmaDumpVis/VmaDumpVis.py b/third_party/vulkan_memory_allocator/tools/VmaDumpVis/VmaDumpVis.py
index 2b459b1..ee32005 100644
--- a/third_party/vulkan_memory_allocator/tools/VmaDumpVis/VmaDumpVis.py
+++ b/third_party/vulkan_memory_allocator/tools/VmaDumpVis/VmaDumpVis.py
@@ -1,5 +1,5 @@
 #
-# Copyright (c) 2018-2020 Advanced Micro Devices, Inc. All rights reserved.
+# Copyright (c) 2018-2021 Advanced Micro Devices, Inc. All rights reserved.
 #
 # Permission is hereby granted, free of charge, to any person obtaining a copy
 # of this software and associated documentation files (the "Software"), to deal
diff --git a/third_party/vulkan_memory_allocator/vma.cpp b/third_party/vulkan_memory_allocator/vma.cpp
index d5284f7..254e7f6 100644
--- a/third_party/vulkan_memory_allocator/vma.cpp
+++ b/third_party/vulkan_memory_allocator/vma.cpp
@@ -5,4 +5,4 @@
 #include <vulkan/vulkan.h>
 
 #define VMA_IMPLEMENTATION
-#include "src/vk_mem_alloc.h"
+#include "include/vk_mem_alloc.h"
diff --git a/third_party/zlib/google/zip_internal.cc b/third_party/zlib/google/zip_internal.cc
index 653a2ab..00e9eef 100644
--- a/third_party/zlib/google/zip_internal.cc
+++ b/third_party/zlib/google/zip_internal.cc
@@ -8,9 +8,13 @@
 #include <string.h>
 
 #include <algorithm>
+#include <unordered_set>
 
+#include "base/files/file_path.h"
 #include "base/logging.h"
+#include "base/no_destructor.h"
 #include "base/notreached.h"
+#include "base/strings/string_util.h"
 #include "base/strings/utf_string_conversions.h"
 
 #if defined(USE_SYSTEM_MINIZIP)
@@ -36,9 +40,9 @@
 } WIN32FILE_IOWIN;
 
 // This function is derived from third_party/minizip/iowin32.c.
-// Its only difference is that it treats the char* as UTF8 and
+// Its only difference is that it treats the filename as UTF-8 and
 // uses the Unicode version of CreateFile.
-void* ZipOpenFunc(void *opaque, const char* filename, int mode) {
+void* ZipOpenFunc(void* opaque, const void* filename, int mode) {
   DWORD desired_access = 0, creation_disposition = 0;
   DWORD share_mode = 0, flags_and_attributes = 0;
   HANDLE file = 0;
@@ -56,10 +60,11 @@
     creation_disposition = CREATE_ALWAYS;
   }
 
-  std::wstring filenamew = base::UTF8ToWide(filename);
-  if ((filename != NULL) && (desired_access != 0)) {
-    file = CreateFile(filenamew.c_str(), desired_access, share_mode, NULL,
-                      creation_disposition, flags_and_attributes, NULL);
+  if (filename != nullptr && desired_access != 0) {
+    file = CreateFileW(
+        base::UTF8ToWide(static_cast<const char*>(filename)).c_str(),
+        desired_access, share_mode, nullptr, creation_disposition,
+        flags_and_attributes, nullptr);
   }
 
   if (file == INVALID_HANDLE_VALUE)
@@ -79,11 +84,11 @@
 }
 #endif
 
-#if defined(OS_POSIX)
+#if defined(OS_POSIX) || defined(OS_FUCHSIA)
 // Callback function for zlib that opens a file stream from a file descriptor.
 // Since we do not own the file descriptor, dup it so that we can fdopen/fclose
 // a file stream.
-void* FdOpenFileFunc(void* opaque, const char* filename, int mode) {
+void* FdOpenFileFunc(void* opaque, const void* filename, int mode) {
   FILE* file = NULL;
   const char* mode_fopen = NULL;
 
@@ -105,15 +110,15 @@
 
 int FdCloseFileFunc(void* opaque, void* stream) {
   fclose(static_cast<FILE*>(stream));
-  free(opaque); // malloc'ed in FillFdOpenFileFunc()
+  free(opaque);  // malloc'ed in FillFdOpenFileFunc()
   return 0;
 }
 
 // Fills |pzlib_filecunc_def| appropriately to handle the zip file
 // referred to by |fd|.
-void FillFdOpenFileFunc(zlib_filefunc_def* pzlib_filefunc_def, int fd) {
-  fill_fopen_filefunc(pzlib_filefunc_def);
-  pzlib_filefunc_def->zopen_file = FdOpenFileFunc;
+void FillFdOpenFileFunc(zlib_filefunc64_def* pzlib_filefunc_def, int fd) {
+  fill_fopen64_filefunc(pzlib_filefunc_def);
+  pzlib_filefunc_def->zopen64_file = FdOpenFileFunc;
   pzlib_filefunc_def->zclose_file = FdCloseFileFunc;
   int* ptr_fd = static_cast<int*>(malloc(sizeof(fd)));
   *ptr_fd = fd;
@@ -124,7 +129,7 @@
 #if defined(OS_WIN)
 // Callback function for zlib that opens a file stream from a Windows handle.
 // Does not take ownership of the handle.
-void* HandleOpenFileFunc(void* opaque, const char* filename, int mode) {
+void* HandleOpenFileFunc(void* opaque, const void* /*filename*/, int mode) {
   WIN32FILE_IOWIN file_ret;
   file_ret.hf = static_cast<HANDLE>(opaque);
   file_ret.error = 0;
@@ -138,7 +143,7 @@
 }
 
 int HandleCloseFileFunc(void* opaque, void* stream) {
-  free(stream); // malloc'ed in HandleOpenFileFunc()
+  free(stream);  // malloc'ed in HandleOpenFileFunc()
   return 0;
 }
 #endif
@@ -148,8 +153,8 @@
 // expect their opaque parameters refer to this struct.
 struct ZipBuffer {
   const char* data;  // weak
-  size_t length;
-  size_t offset;
+  ZPOS64_T length;
+  ZPOS64_T offset;
 };
 
 // Opens the specified file. When this function returns a non-NULL pointer, zlib
@@ -158,7 +163,7 @@
 // given opaque parameter and returns it because this parameter stores all
 // information needed for uncompressing data. (This function does not support
 // writing compressed data and it returns NULL for this case.)
-void* OpenZipBuffer(void* opaque, const char* /*filename*/, int mode) {
+void* OpenZipBuffer(void* opaque, const void* /*filename*/, int mode) {
   if ((mode & ZLIB_FILEFUNC_MODE_READWRITEFILTER) != ZLIB_FILEFUNC_MODE_READ) {
     NOTREACHED();
     return NULL;
@@ -175,10 +180,11 @@
 uLong ReadZipBuffer(void* opaque, void* /*stream*/, void* buf, uLong size) {
   ZipBuffer* buffer = static_cast<ZipBuffer*>(opaque);
   DCHECK_LE(buffer->offset, buffer->length);
-  size_t remaining_bytes = buffer->length - buffer->offset;
+  ZPOS64_T remaining_bytes = buffer->length - buffer->offset;
   if (!buffer || !buffer->data || !remaining_bytes)
     return 0;
-  size = std::min(size, static_cast<uLong>(remaining_bytes));
+  if (size > remaining_bytes)
+    size = remaining_bytes;
   memcpy(buf, &buffer->data[buffer->offset], size);
   buffer->offset += size;
   return size;
@@ -195,21 +201,23 @@
 }
 
 // Returns the offset from the beginning of the data.
-long GetOffsetOfZipBuffer(void* opaque, void* /*stream*/) {
+ZPOS64_T GetOffsetOfZipBuffer(void* opaque, void* /*stream*/) {
   ZipBuffer* buffer = static_cast<ZipBuffer*>(opaque);
   if (!buffer)
     return -1;
-  return static_cast<long>(buffer->offset);
+  return buffer->offset;
 }
 
 // Moves the current offset to the specified position.
-long SeekZipBuffer(void* opaque, void* /*stream*/, uLong offset, int origin) {
+long SeekZipBuffer(void* opaque,
+                   void* /*stream*/,
+                   ZPOS64_T offset,
+                   int origin) {
   ZipBuffer* buffer = static_cast<ZipBuffer*>(opaque);
   if (!buffer)
     return -1;
   if (origin == ZLIB_FILEFUNC_SEEK_CUR) {
-    buffer->offset = std::min(buffer->offset + static_cast<size_t>(offset),
-                              buffer->length);
+    buffer->offset = std::min(buffer->offset + offset, buffer->length);
     return 0;
   }
   if (origin == ZLIB_FILEFUNC_SEEK_END) {
@@ -217,7 +225,7 @@
     return 0;
   }
   if (origin == ZLIB_FILEFUNC_SEEK_SET) {
-    buffer->offset = std::min(buffer->length, static_cast<size_t>(offset));
+    buffer->offset = std::min(buffer->length, offset);
     return 0;
   }
   NOTREACHED();
@@ -268,33 +276,33 @@
 namespace internal {
 
 unzFile OpenForUnzipping(const std::string& file_name_utf8) {
-  zlib_filefunc_def* zip_func_ptrs = NULL;
+  zlib_filefunc64_def* zip_func_ptrs = nullptr;
 #if defined(OS_WIN)
-  zlib_filefunc_def zip_funcs;
-  fill_win32_filefunc(&zip_funcs);
-  zip_funcs.zopen_file = ZipOpenFunc;
+  zlib_filefunc64_def zip_funcs;
+  fill_win32_filefunc64(&zip_funcs);
+  zip_funcs.zopen64_file = ZipOpenFunc;
   zip_func_ptrs = &zip_funcs;
 #endif
-  return unzOpen2(file_name_utf8.c_str(), zip_func_ptrs);
+  return unzOpen2_64(file_name_utf8.c_str(), zip_func_ptrs);
 }
 
-#if defined(OS_POSIX)
+#if defined(OS_POSIX) || defined(OS_FUCHSIA)
 unzFile OpenFdForUnzipping(int zip_fd) {
-  zlib_filefunc_def zip_funcs;
+  zlib_filefunc64_def zip_funcs;
   FillFdOpenFileFunc(&zip_funcs, zip_fd);
   // Passing dummy "fd" filename to zlib.
-  return unzOpen2("fd", &zip_funcs);
+  return unzOpen2_64("fd", &zip_funcs);
 }
 #endif
 
 #if defined(OS_WIN)
 unzFile OpenHandleForUnzipping(HANDLE zip_handle) {
-  zlib_filefunc_def zip_funcs;
-  fill_win32_filefunc(&zip_funcs);
-  zip_funcs.zopen_file = HandleOpenFileFunc;
+  zlib_filefunc64_def zip_funcs;
+  fill_win32_filefunc64(&zip_funcs);
+  zip_funcs.zopen64_file = HandleOpenFileFunc;
   zip_funcs.zclose_file = HandleCloseFileFunc;
   zip_funcs.opaque = zip_handle;
-  return unzOpen2("fd", &zip_funcs);
+  return unzOpen2_64("fd", &zip_funcs);
 }
 #endif
 
@@ -310,72 +318,152 @@
   buffer->length = data.length();
   buffer->offset = 0;
 
-  zlib_filefunc_def zip_functions;
-  zip_functions.zopen_file = OpenZipBuffer;
+  zlib_filefunc64_def zip_functions;
+  zip_functions.zopen64_file = OpenZipBuffer;
   zip_functions.zread_file = ReadZipBuffer;
   zip_functions.zwrite_file = WriteZipBuffer;
-  zip_functions.ztell_file = GetOffsetOfZipBuffer;
-  zip_functions.zseek_file = SeekZipBuffer;
+  zip_functions.ztell64_file = GetOffsetOfZipBuffer;
+  zip_functions.zseek64_file = SeekZipBuffer;
   zip_functions.zclose_file = CloseZipBuffer;
   zip_functions.zerror_file = GetErrorOfZipBuffer;
-  zip_functions.opaque = static_cast<void*>(buffer);
-  return unzOpen2(NULL, &zip_functions);
+  zip_functions.opaque = buffer;
+  return unzOpen2_64(nullptr, &zip_functions);
 }
 
 zipFile OpenForZipping(const std::string& file_name_utf8, int append_flag) {
-  zlib_filefunc_def* zip_func_ptrs = NULL;
+  zlib_filefunc64_def* zip_func_ptrs = nullptr;
 #if defined(OS_WIN)
-  zlib_filefunc_def zip_funcs;
-  fill_win32_filefunc(&zip_funcs);
-  zip_funcs.zopen_file = ZipOpenFunc;
+  zlib_filefunc64_def zip_funcs;
+  fill_win32_filefunc64(&zip_funcs);
+  zip_funcs.zopen64_file = ZipOpenFunc;
   zip_func_ptrs = &zip_funcs;
 #endif
-  return zipOpen2(file_name_utf8.c_str(),
-                  append_flag,
-                  NULL,  // global comment
-                  zip_func_ptrs);
+  return zipOpen2_64(file_name_utf8.c_str(), append_flag, nullptr,
+                     zip_func_ptrs);
 }
 
 #if defined(OS_POSIX)
 zipFile OpenFdForZipping(int zip_fd, int append_flag) {
-  zlib_filefunc_def zip_funcs;
+  zlib_filefunc64_def zip_funcs;
   FillFdOpenFileFunc(&zip_funcs, zip_fd);
   // Passing dummy "fd" filename to zlib.
-  return zipOpen2("fd", append_flag, NULL, &zip_funcs);
+  return zipOpen2_64("fd", append_flag, nullptr, &zip_funcs);
 }
 #endif
 
 bool ZipOpenNewFileInZip(zipFile zip_file,
                          const std::string& str_path,
-                         base::Time last_modified_time) {
+                         base::Time last_modified_time,
+                         Compression compression) {
   // Section 4.4.4 http://www.pkware.com/documents/casestudies/APPNOTE.TXT
   // Setting the Language encoding flag so the file is told to be in utf-8.
   const uLong LANGUAGE_ENCODING_FLAG = 0x1 << 11;
 
-  zip_fileinfo file_info = TimeToZipFileInfo(last_modified_time);
-  if (ZIP_OK != zipOpenNewFileInZip4(zip_file,          // file
-                                     str_path.c_str(),  // filename
-                                     &file_info,        // zip_fileinfo
-                                     NULL,              // extrafield_local,
-                                     0u,                // size_extrafield_local
-                                     NULL,              // extrafield_global
-                                     0u,          // size_extrafield_global
-                                     NULL,        // comment
-                                     Z_DEFLATED,  // method
-                                     Z_DEFAULT_COMPRESSION,  // level
-                                     0,                      // raw
-                                     -MAX_WBITS,             // windowBits
-                                     DEF_MEM_LEVEL,          // memLevel
-                                     Z_DEFAULT_STRATEGY,     // strategy
-                                     NULL,                   // password
-                                     0,                      // crcForCrypting
-                                     0,                      // versionMadeBy
-                                     LANGUAGE_ENCODING_FLAG)) {  // flagBase
-    DLOG(ERROR) << "Could not open zip file entry " << str_path;
+  const zip_fileinfo file_info = TimeToZipFileInfo(last_modified_time);
+  const int err = zipOpenNewFileInZip4_64(
+      /*file=*/zip_file,
+      /*filename=*/str_path.c_str(),
+      /*zip_fileinfo=*/&file_info,
+      /*extrafield_local=*/nullptr,
+      /*size_extrafield_local=*/0u,
+      /*extrafield_global=*/nullptr,
+      /*size_extrafield_global=*/0u,
+      /*comment=*/nullptr,
+      /*method=*/compression,
+      /*level=*/Z_DEFAULT_COMPRESSION,
+      /*raw=*/0,
+      /*windowBits=*/-MAX_WBITS,
+      /*memLevel=*/DEF_MEM_LEVEL,
+      /*strategy=*/Z_DEFAULT_STRATEGY,
+      /*password=*/nullptr,
+      /*crcForCrypting=*/0,
+      /*versionMadeBy=*/0,
+      /*flagBase=*/LANGUAGE_ENCODING_FLAG,
+      /*zip64=*/1);
+
+  if (err != ZIP_OK) {
+    DLOG(ERROR) << "Cannot open ZIP file entry '" << str_path
+                << "': zipOpenNewFileInZip4_64 returned " << err;
     return false;
   }
+
   return true;
 }
 
+Compression GetCompressionMethod(const base::FilePath& path) {
+  // Get the filename extension in lower case.
+  const base::FilePath::StringType ext =
+      base::ToLowerASCII(path.FinalExtension());
+
+  if (ext.empty())
+    return kDeflated;
+
+  using StringPiece = base::FilePath::StringPieceType;
+
+  // Skip the leading dot.
+  StringPiece ext_without_dot = ext;
+  DCHECK_EQ(ext_without_dot.front(), FILE_PATH_LITERAL('.'));
+  ext_without_dot.remove_prefix(1);
+
+  // Well known filename extensions of files that a likely to be already
+  // compressed. The extensions are in lower case without the leading dot.
+  static const base::NoDestructor<
+      std::unordered_set<StringPiece, base::StringPieceHashImpl<StringPiece>>>
+      exts(std::initializer_list<StringPiece>{
+          FILE_PATH_LITERAL("3g2"),   //
+          FILE_PATH_LITERAL("3gp"),   //
+          FILE_PATH_LITERAL("7z"),    //
+          FILE_PATH_LITERAL("7zip"),  //
+          FILE_PATH_LITERAL("aac"),   //
+          FILE_PATH_LITERAL("avi"),   //
+          FILE_PATH_LITERAL("bz"),    //
+          FILE_PATH_LITERAL("bz2"),   //
+          FILE_PATH_LITERAL("crx"),   //
+          FILE_PATH_LITERAL("gif"),   //
+          FILE_PATH_LITERAL("gz"),    //
+          FILE_PATH_LITERAL("jar"),   //
+          FILE_PATH_LITERAL("jpeg"),  //
+          FILE_PATH_LITERAL("jpg"),   //
+          FILE_PATH_LITERAL("lz"),    //
+          FILE_PATH_LITERAL("m2v"),   //
+          FILE_PATH_LITERAL("m4p"),   //
+          FILE_PATH_LITERAL("m4v"),   //
+          FILE_PATH_LITERAL("mng"),   //
+          FILE_PATH_LITERAL("mov"),   //
+          FILE_PATH_LITERAL("mp2"),   //
+          FILE_PATH_LITERAL("mp3"),   //
+          FILE_PATH_LITERAL("mp4"),   //
+          FILE_PATH_LITERAL("mpe"),   //
+          FILE_PATH_LITERAL("mpeg"),  //
+          FILE_PATH_LITERAL("mpg"),   //
+          FILE_PATH_LITERAL("mpv"),   //
+          FILE_PATH_LITERAL("ogg"),   //
+          FILE_PATH_LITERAL("ogv"),   //
+          FILE_PATH_LITERAL("png"),   //
+          FILE_PATH_LITERAL("qt"),    //
+          FILE_PATH_LITERAL("rar"),   //
+          FILE_PATH_LITERAL("taz"),   //
+          FILE_PATH_LITERAL("tb2"),   //
+          FILE_PATH_LITERAL("tbz"),   //
+          FILE_PATH_LITERAL("tbz2"),  //
+          FILE_PATH_LITERAL("tgz"),   //
+          FILE_PATH_LITERAL("tlz"),   //
+          FILE_PATH_LITERAL("tz"),    //
+          FILE_PATH_LITERAL("tz2"),   //
+          FILE_PATH_LITERAL("vob"),   //
+          FILE_PATH_LITERAL("webm"),  //
+          FILE_PATH_LITERAL("wma"),   //
+          FILE_PATH_LITERAL("wmv"),   //
+          FILE_PATH_LITERAL("xz"),    //
+          FILE_PATH_LITERAL("z"),     //
+          FILE_PATH_LITERAL("zip"),   //
+      });
+
+  if (exts->count(ext_without_dot))
+    return kStored;
+
+  return kDeflated;
+}
+
 }  // namespace internal
 }  // namespace zip
diff --git a/third_party/zlib/google/zip_internal.h b/third_party/zlib/google/zip_internal.h
index 49fb902..c7feba6 100644
--- a/third_party/zlib/google/zip_internal.h
+++ b/third_party/zlib/google/zip_internal.h
@@ -35,7 +35,7 @@
 // Windows.
 unzFile OpenForUnzipping(const std::string& file_name_utf8);
 
-#if defined(OS_POSIX)
+#if defined(OS_POSIX) || defined(OS_FUCHSIA)
 // Opens the file referred to by |zip_fd| for unzipping.
 unzFile OpenFdForUnzipping(int zip_fd);
 #endif
@@ -60,10 +60,24 @@
 zipFile OpenFdForZipping(int zip_fd, int append_flag);
 #endif
 
-// Wrapper around zipOpenNewFileInZip4 which passes most common options.
+// Compression methods.
+enum Compression {
+  kStored = 0,             // Stored (no compression)
+  kDeflated = Z_DEFLATED,  // Deflated
+};
+
+// Adds a file (or directory) entry to the ZIP archive.
 bool ZipOpenNewFileInZip(zipFile zip_file,
                          const std::string& str_path,
-                         base::Time last_modified_time);
+                         base::Time last_modified_time,
+                         Compression compression);
+
+// Selects the best compression method for the given file. The heuristic is
+// based on the filename extension. By default, the compression method is
+// kDeflated. But if the given path has an extension indicating a well known
+// file format which is likely to be already compressed (eg ZIP, RAR, JPG,
+// PNG...) then the compression method is simply kStored.
+Compression GetCompressionMethod(const base::FilePath& path);
 
 const int kZipMaxPath = 256;
 const int kZipBufSize = 8192;
diff --git a/third_party/zlib/google/zip_reader.cc b/third_party/zlib/google/zip_reader.cc
index 8ddd8df..2ad1398 100644
--- a/third_party/zlib/google/zip_reader.cc
+++ b/third_party/zlib/google/zip_reader.cc
@@ -157,7 +157,7 @@
 bool ZipReader::OpenFromPlatformFile(base::PlatformFile zip_fd) {
   DCHECK(!zip_file_);
 
-#if defined(OS_POSIX)
+#if defined(OS_POSIX) || defined(OS_FUCHSIA)
   zip_file_ = internal::OpenFdForUnzipping(zip_fd);
 #elif defined(OS_WIN)
   zip_file_ = internal::OpenHandleForUnzipping(zip_fd);
diff --git a/third_party/zlib/google/zip_unittest.cc b/third_party/zlib/google/zip_unittest.cc
index 03d389e..876f3eb 100644
--- a/third_party/zlib/google/zip_unittest.cc
+++ b/third_party/zlib/google/zip_unittest.cc
@@ -26,8 +26,12 @@
 #include "testing/gtest/include/gtest/gtest.h"
 #include "testing/platform_test.h"
 #include "third_party/zlib/google/zip.h"
+#include "third_party/zlib/google/zip_internal.h"
 #include "third_party/zlib/google/zip_reader.h"
 
+// Convenience macro to create a file path from a string literal.
+#define FP(path) base::FilePath(FILE_PATH_LITERAL(path))
+
 namespace {
 
 bool CreateFile(const std::string& content,
@@ -58,7 +62,7 @@
 
   VirtualFileSystem() {
     base::FilePath test_dir;
-    base::FilePath foo_txt_path = test_dir.Append(FILE_PATH_LITERAL("foo.txt"));
+    base::FilePath foo_txt_path = test_dir.AppendASCII("foo.txt");
 
     base::FilePath file_path;
     base::File file;
@@ -66,15 +70,13 @@
     DCHECK(success);
     files_[foo_txt_path] = std::move(file);
 
-    base::FilePath bar_dir = test_dir.Append(FILE_PATH_LITERAL("bar"));
-    base::FilePath bar1_txt_path =
-        bar_dir.Append(FILE_PATH_LITERAL("bar1.txt"));
+    base::FilePath bar_dir = test_dir.AppendASCII("bar");
+    base::FilePath bar1_txt_path = bar_dir.AppendASCII("bar1.txt");
     success = CreateFile(kBar1Content, &file_path, &file);
     DCHECK(success);
     files_[bar1_txt_path] = std::move(file);
 
-    base::FilePath bar2_txt_path =
-        bar_dir.Append(FILE_PATH_LITERAL("bar2.txt"));
+    base::FilePath bar2_txt_path = bar_dir.AppendASCII("bar2.txt");
     success = CreateFile(kBar2Content, &file_path, &file);
     DCHECK(success);
     files_[bar2_txt_path] = std::move(file);
@@ -172,22 +174,20 @@
     test_dir_ = temp_dir_.GetPath();
 
     base::FilePath zip_path(test_dir_);
-    zip_contents_.insert(zip_path.Append(FILE_PATH_LITERAL("foo.txt")));
-    zip_path = zip_path.Append(FILE_PATH_LITERAL("foo"));
+    zip_contents_.insert(zip_path.AppendASCII("foo.txt"));
+    zip_path = zip_path.AppendASCII("foo");
     zip_contents_.insert(zip_path);
-    zip_contents_.insert(zip_path.Append(FILE_PATH_LITERAL("bar.txt")));
-    zip_path = zip_path.Append(FILE_PATH_LITERAL("bar"));
+    zip_contents_.insert(zip_path.AppendASCII("bar.txt"));
+    zip_path = zip_path.AppendASCII("bar");
     zip_contents_.insert(zip_path);
-    zip_contents_.insert(zip_path.Append(FILE_PATH_LITERAL("baz.txt")));
-    zip_contents_.insert(zip_path.Append(FILE_PATH_LITERAL("quux.txt")));
-    zip_contents_.insert(zip_path.Append(FILE_PATH_LITERAL(".hidden")));
+    zip_contents_.insert(zip_path.AppendASCII("baz.txt"));
+    zip_contents_.insert(zip_path.AppendASCII("quux.txt"));
+    zip_contents_.insert(zip_path.AppendASCII(".hidden"));
 
     // Include a subset of files in |zip_file_list_| to test ZipFiles().
-    zip_file_list_.push_back(base::FilePath(FILE_PATH_LITERAL("foo.txt")));
-    zip_file_list_.push_back(
-        base::FilePath(FILE_PATH_LITERAL("foo/bar/quux.txt")));
-    zip_file_list_.push_back(
-        base::FilePath(FILE_PATH_LITERAL("foo/bar/.hidden")));
+    zip_file_list_.push_back(FP("foo.txt"));
+    zip_file_list_.push_back(FP("foo/bar/quux.txt"));
+    zip_file_list_.push_back(FP("foo/bar/.hidden"));
   }
 
   virtual void TearDown() { PlatformTest::TearDown(); }
@@ -224,7 +224,7 @@
         base::FileEnumerator::FILES | base::FileEnumerator::DIRECTORIES);
     base::FilePath unzipped_entry_path = files.Next();
     size_t count = 0;
-    while (!unzipped_entry_path.value().empty()) {
+    while (!unzipped_entry_path.empty()) {
       EXPECT_EQ(zip_contents_.count(unzipped_entry_path), 1U)
           << "Couldn't find " << unzipped_entry_path.value();
       count++;
@@ -232,28 +232,15 @@
       if (base::PathExists(unzipped_entry_path) &&
           !base::DirectoryExists(unzipped_entry_path)) {
         // It's a file, check its contents are what we zipped.
-        // TODO(774156): figure out why the commented out EXPECT_TRUE below
-        // fails on the build bots (but not on the try-bots).
         base::FilePath relative_path;
-        bool append_relative_path_success =
-            test_dir_.AppendRelativePath(unzipped_entry_path, &relative_path);
-        if (!append_relative_path_success) {
-          LOG(ERROR) << "Append relative path failed, params: " << test_dir_
-                     << " and " << unzipped_entry_path;
-        }
+        ASSERT_TRUE(
+            test_dir_.AppendRelativePath(unzipped_entry_path, &relative_path))
+            << "Cannot append relative path failed, params: '" << test_dir_
+            << "' and '" << unzipped_entry_path << "'";
         base::FilePath original_path = original_dir.Append(relative_path);
-        const bool equal =
-            base::ContentsEqual(original_path, unzipped_entry_path);
-        if (equal) {
-          LOG(INFO) << "Original and unzipped file '" << relative_path
-                    << "' are equal";
-        } else {
-          LOG(ERROR) << "Original and unzipped file '" << relative_path
-                     << "' are different";
-        }
-        // EXPECT_TRUE(base::ContentsEqual(original_path, unzipped_entry_path))
-        //    << "Contents differ between original " << original_path.value()
-        //    << " and unzipped file " << unzipped_entry_path.value();
+        EXPECT_TRUE(base::ContentsEqual(original_path, unzipped_entry_path))
+            << "Original file '" << original_path << "' and unzipped file '"
+            << unzipped_entry_path << "' have different contents";
       }
       unzipped_entry_path = files.Next();
     }
@@ -575,17 +562,17 @@
   ASSERT_TRUE(scoped_temp_dir.CreateUniqueTempDir());
   const base::FilePath& temp_dir = scoped_temp_dir.GetPath();
   ASSERT_TRUE(zip::Unzip(zip_file, temp_dir));
-  base::FilePath bar_dir = temp_dir.Append(FILE_PATH_LITERAL("bar"));
+  base::FilePath bar_dir = temp_dir.AppendASCII("bar");
   EXPECT_TRUE(base::DirectoryExists(bar_dir));
   std::string file_content;
-  EXPECT_TRUE(base::ReadFileToString(
-      temp_dir.Append(FILE_PATH_LITERAL("foo.txt")), &file_content));
+  EXPECT_TRUE(
+      base::ReadFileToString(temp_dir.AppendASCII("foo.txt"), &file_content));
   EXPECT_EQ(VirtualFileSystem::kFooContent, file_content);
-  EXPECT_TRUE(base::ReadFileToString(
-      bar_dir.Append(FILE_PATH_LITERAL("bar1.txt")), &file_content));
+  EXPECT_TRUE(
+      base::ReadFileToString(bar_dir.AppendASCII("bar1.txt"), &file_content));
   EXPECT_EQ(VirtualFileSystem::kBar1Content, file_content);
-  EXPECT_TRUE(base::ReadFileToString(
-      bar_dir.Append(FILE_PATH_LITERAL("bar2.txt")), &file_content));
+  EXPECT_TRUE(
+      base::ReadFileToString(bar_dir.AppendASCII("bar2.txt"), &file_content));
   EXPECT_EQ(VirtualFileSystem::kBar2Content, file_content);
 }
 
@@ -710,4 +697,121 @@
   }
 }
 
+// Tests zip::internal::GetCompressionMethod()
+TEST_F(ZipTest, GetCompressionMethod) {
+  using zip::internal::GetCompressionMethod;
+  using zip::internal::kDeflated;
+  using zip::internal::kStored;
+
+  EXPECT_EQ(GetCompressionMethod(FP("")), kDeflated);
+  EXPECT_EQ(GetCompressionMethod(FP("NoExtension")), kDeflated);
+  EXPECT_EQ(GetCompressionMethod(FP("Folder.zip").Append(FP("NoExtension"))),
+            kDeflated);
+  EXPECT_EQ(GetCompressionMethod(FP("Name.txt")), kDeflated);
+  EXPECT_EQ(GetCompressionMethod(FP("Name.zip")), kStored);
+  EXPECT_EQ(GetCompressionMethod(FP("Name....zip")), kStored);
+  EXPECT_EQ(GetCompressionMethod(FP("Name.zip")), kStored);
+  EXPECT_EQ(GetCompressionMethod(FP("NAME.ZIP")), kStored);
+  EXPECT_EQ(GetCompressionMethod(FP("Name.gz")), kStored);
+  EXPECT_EQ(GetCompressionMethod(FP("Name.tar.gz")), kStored);
+  EXPECT_EQ(GetCompressionMethod(FP("Name.tar")), kDeflated);
+
+  // This one is controversial.
+  EXPECT_EQ(GetCompressionMethod(FP(".zip")), kStored);
+}
+
+// Tests that files put inside a ZIP are effectively compressed.
+TEST_F(ZipTest, Compressed) {
+  base::ScopedTempDir temp_dir;
+  ASSERT_TRUE(temp_dir.CreateUniqueTempDir());
+
+  const base::FilePath src_dir = temp_dir.GetPath().AppendASCII("input");
+  EXPECT_TRUE(base::CreateDirectory(src_dir));
+
+  // Create some dummy source files.
+  for (const base::StringPiece s : {"foo", "bar.txt", ".hidden"}) {
+    base::File f(src_dir.AppendASCII(s),
+                 base::File::FLAG_CREATE | base::File::FLAG_WRITE);
+    ASSERT_TRUE(f.SetLength(5000));
+  }
+
+  // Zip the source files.
+  const base::FilePath dest_file = temp_dir.GetPath().AppendASCII("dest.zip");
+  EXPECT_TRUE(zip::Zip({.src_dir = src_dir,
+                        .dest_file = dest_file,
+                        .include_hidden_files = true}));
+
+  // Since the source files compress well, the destination ZIP file should be
+  // smaller than the source files.
+  int64_t dest_file_size;
+  ASSERT_TRUE(base::GetFileSize(dest_file, &dest_file_size));
+  EXPECT_GT(dest_file_size, 300);
+  EXPECT_LT(dest_file_size, 1000);
+}
+
+// Tests that a ZIP put inside a ZIP is simply stored instead of being
+// compressed.
+TEST_F(ZipTest, NestedZip) {
+  base::ScopedTempDir temp_dir;
+  ASSERT_TRUE(temp_dir.CreateUniqueTempDir());
+
+  const base::FilePath src_dir = temp_dir.GetPath().AppendASCII("input");
+  EXPECT_TRUE(base::CreateDirectory(src_dir));
+
+  // Create a dummy ZIP file. This is not a valid ZIP file, but for the purpose
+  // of this test, it doesn't really matter.
+  const int64_t src_size = 5000;
+
+  {
+    base::File f(src_dir.AppendASCII("src.zip"),
+                 base::File::FLAG_CREATE | base::File::FLAG_WRITE);
+    ASSERT_TRUE(f.SetLength(src_size));
+  }
+
+  // Zip the dummy ZIP file.
+  const base::FilePath dest_file = temp_dir.GetPath().AppendASCII("dest.zip");
+  EXPECT_TRUE(zip::Zip({.src_dir = src_dir, .dest_file = dest_file}));
+
+  // Since the dummy source (inner) ZIP file should simply be stored in the
+  // destination (outer) ZIP file, the destination file should be bigger than
+  // the source file, but not much bigger.
+  int64_t dest_file_size;
+  ASSERT_TRUE(base::GetFileSize(dest_file, &dest_file_size));
+  EXPECT_GT(dest_file_size, src_size + 100);
+  EXPECT_LT(dest_file_size, src_size + 300);
+}
+
+// Tests that there is no 2GB or 4GB limits. Tests that big files can be zipped
+// (crbug.com/1207737) and that big ZIP files can be created
+// (crbug.com/1221447).
+TEST_F(ZipTest, DISABLED_BigFile) {
+  base::ScopedTempDir temp_dir;
+  ASSERT_TRUE(temp_dir.CreateUniqueTempDir());
+
+  const base::FilePath src_dir = temp_dir.GetPath().AppendASCII("input");
+  EXPECT_TRUE(base::CreateDirectory(src_dir));
+
+  // Create a big dummy ZIP file. This is not a valid ZIP file, but for the
+  // purpose of this test, it doesn't really matter.
+  const int64_t src_size = 5'000'000'000;
+
+  {
+    base::File f(src_dir.AppendASCII("src.zip"),
+                 base::File::FLAG_CREATE | base::File::FLAG_WRITE);
+    ASSERT_TRUE(f.SetLength(src_size));
+  }
+
+  // Zip the dummy ZIP file.
+  const base::FilePath dest_file = temp_dir.GetPath().AppendASCII("dest.zip");
+  EXPECT_TRUE(zip::Zip({.src_dir = src_dir, .dest_file = dest_file}));
+
+  // Since the dummy source (inner) ZIP file should simply be stored in the
+  // destination (outer) ZIP file, the destination file should be bigger than
+  // the source file, but not much bigger.
+  int64_t dest_file_size;
+  ASSERT_TRUE(base::GetFileSize(dest_file, &dest_file_size));
+  EXPECT_GT(dest_file_size, src_size + 100);
+  EXPECT_LT(dest_file_size, src_size + 300);
+}
+
 }  // namespace
diff --git a/third_party/zlib/google/zip_writer.cc b/third_party/zlib/google/zip_writer.cc
index 90b56ed..3e2345a 100644
--- a/third_party/zlib/google/zip_writer.cc
+++ b/third_party/zlib/google/zip_writer.cc
@@ -74,13 +74,21 @@
                                  bool is_directory,
                                  base::Time last_modified) {
   std::string str_path = path.AsUTF8Unsafe();
+
 #if defined(OS_WIN)
   base::ReplaceSubstringsAfterOffset(&str_path, 0u, "\\", "/");
 #endif
-  if (is_directory)
-    str_path += "/";
 
-  return zip::internal::ZipOpenNewFileInZip(zip_file_, str_path, last_modified);
+  Compression compression = kDeflated;
+
+  if (is_directory) {
+    str_path += "/";
+  } else {
+    compression = GetCompressionMethod(path);
+  }
+
+  return zip::internal::ZipOpenNewFileInZip(zip_file_, str_path, last_modified,
+                                            compression);
 }
 
 bool ZipWriter::CloseNewFileEntry() {
diff --git a/util/BUILD.gn b/util/BUILD.gn
index e9c8575..5f3ff32 100644
--- a/util/BUILD.gn
+++ b/util/BUILD.gn
@@ -15,7 +15,6 @@
   "OSWindow.cpp",
   "OSWindow.h",
   "com_utils.h",
-  "frame_capture_test_utils.h",
   "geometry_utils.cpp",
   "geometry_utils.h",
   "keyboard.h",
@@ -154,6 +153,21 @@
   ]
 }
 
+if (angle_has_frame_capture) {
+  angle_source_set("angle_frame_capture_test_utils") {
+    testonly = true
+    sources = [
+      "capture/frame_capture_test_utils.cpp",
+      "capture/frame_capture_test_utils.h",
+    ]
+    deps = [
+      "$angle_root:angle_common",
+      "$angle_root:angle_compression",
+      "$angle_root/third_party/rapidjson",
+    ]
+  }
+}
+
 config("angle_util_config") {
   # Force users to include "util/header.h" instead of just "header.h".
   include_dirs = [ ".." ]
diff --git a/util/EGLPlatformParameters.h b/util/EGLPlatformParameters.h
index 6c66ff3..1933118 100644
--- a/util/EGLPlatformParameters.h
+++ b/util/EGLPlatformParameters.h
@@ -19,7 +19,7 @@
 // The GLES driver type determines what shared object we use to load the GLES entry points.
 // AngleEGL loads from ANGLE's version of libEGL, libGLESv2, and libGLESv1_CM.
 // SystemEGL uses the system copies of libEGL, libGLESv2, and libGLESv1_CM.
-// SystemWGL loads Windows GL with the GLES compatiblity extensions. See util/WGLWindow.h.
+// SystemWGL loads Windows GL with the GLES compatibility extensions. See util/WGLWindow.h.
 enum class GLESDriverType
 {
     AngleEGL,
@@ -65,7 +65,8 @@
                         robustness, emulatedPrerotation, asyncCommandQueueFeatureVulkan,
                         hasExplicitMemBarrierFeatureMtl, hasCheapRenderPassFeatureMtl,
                         forceBufferGPUStorageFeatureMtl, supportsVulkanViewportFlip, emulatedVAOs,
-                        directSPIRVGeneration);
+                        directSPIRVGeneration, captureLimits, forceRobustResourceInit,
+                        directMetalGeneration, forceInitShaderVariables);
     }
 
     EGLint renderer                               = EGL_PLATFORM_ANGLE_TYPE_DEFAULT_ANGLE;
@@ -89,7 +90,12 @@
     EGLint supportsVulkanViewportFlip             = EGL_DONT_CARE;
     EGLint emulatedVAOs                           = EGL_DONT_CARE;
     EGLint directSPIRVGeneration                  = EGL_DONT_CARE;
-    angle::PlatformMethods *platformMethods       = nullptr;
+    EGLint captureLimits                          = EGL_DONT_CARE;
+    EGLint forceRobustResourceInit                = EGL_DONT_CARE;
+    EGLint directMetalGeneration                  = EGL_DONT_CARE;
+    EGLint forceInitShaderVariables               = EGL_DONT_CARE;
+
+    angle::PlatformMethods *platformMethods = nullptr;
 };
 
 inline bool operator<(const EGLPlatformParameters &a, const EGLPlatformParameters &b)
diff --git a/util/EGLWindow.cpp b/util/EGLWindow.cpp
index b212082..da87a99 100644
--- a/util/EGLWindow.cpp
+++ b/util/EGLWindow.cpp
@@ -16,6 +16,11 @@
 #include "platform/PlatformMethods.h"
 #include "util/OSWindow.h"
 
+namespace
+{
+constexpr EGLint kDefaultSwapInterval = 1;
+}  // anonymous namespace
+
 // ConfigParameters implementation.
 ConfigParameters::ConfigParameters()
     : redBits(-1),
@@ -32,7 +37,9 @@
       clientArraysEnabled(true),
       robustAccess(false),
       samples(-1),
-      resetStrategy(EGL_NO_RESET_NOTIFICATION_EXT)
+      resetStrategy(EGL_NO_RESET_NOTIFICATION_EXT),
+      colorSpace(EGL_COLORSPACE_LINEAR),
+      swapInterval(kDefaultSwapInterval)
 {}
 
 ConfigParameters::~ConfigParameters() = default;
@@ -195,6 +202,7 @@
     if (params.transformFeedbackFeature == EGL_FALSE)
     {
         disabledFeatureOverrides.push_back("supportsTransformFeedbackExtension");
+        disabledFeatureOverrides.push_back("supportsGeometryStreamsCapability");
         disabledFeatureOverrides.push_back("emulateTransformFeedback");
     }
 
@@ -258,6 +266,11 @@
         enabledFeatureOverrides.push_back("directSPIRVGeneration");
     }
 
+    if (params.directMetalGeneration == EGL_TRUE)
+    {
+        enabledFeatureOverrides.push_back("directMetalGeneration");
+    }
+
     if (params.hasExplicitMemBarrierFeatureMtl == EGL_FALSE)
     {
         disabledFeatureOverrides.push_back("has_explicit_mem_barrier_mtl");
@@ -278,6 +291,21 @@
         enabledFeatureOverrides.push_back("sync_vertex_arrays_to_default");
     }
 
+    if (params.captureLimits == EGL_TRUE)
+    {
+        enabledFeatureOverrides.push_back("enable_capture_limits");
+    }
+
+    if (params.forceRobustResourceInit == EGL_TRUE)
+    {
+        enabledFeatureOverrides.push_back("forceRobustResourceInit");
+    }
+
+    if (params.forceInitShaderVariables == EGL_TRUE)
+    {
+        enabledFeatureOverrides.push_back("forceInitShaderVariables");
+    }
+
     const bool hasFeatureControlANGLE =
         strstr(extensionString, "EGL_ANGLE_feature_control") != nullptr;
 
@@ -418,6 +446,27 @@
                                                                              : EGL_FALSE);
     }
 
+    bool hasGLColorSpace = strstr(displayExtensions, "EGL_KHR_gl_colorspace") != nullptr;
+    if (!hasGLColorSpace && mConfigParams.colorSpace != EGL_COLORSPACE_LINEAR)
+    {
+        fprintf(stderr, "Mising EGL_KHR_gl_colorspace.\n");
+        destroyGL();
+        return false;
+    }
+    if (hasGLColorSpace)
+    {
+        surfaceAttributes.push_back(EGL_GL_COLORSPACE_KHR);
+        surfaceAttributes.push_back(mConfigParams.colorSpace);
+    }
+
+    bool hasCreateSurfaceSwapInterval =
+        strstr(displayExtensions, "EGL_ANGLE_create_surface_swap_interval") != nullptr;
+    if (hasCreateSurfaceSwapInterval && mConfigParams.swapInterval != kDefaultSwapInterval)
+    {
+        surfaceAttributes.push_back(EGL_SWAP_INTERVAL_ANGLE);
+        surfaceAttributes.push_back(mConfigParams.swapInterval);
+    }
+
     surfaceAttributes.push_back(EGL_NONE);
 
     osWindow->resetNativeWindow();
@@ -438,7 +487,18 @@
     return true;
 }
 
-EGLContext EGLWindow::createContext(EGLContext share) const
+GLWindowContext EGLWindow::getCurrentContextGeneric()
+{
+    return reinterpret_cast<GLWindowContext>(mContext);
+}
+
+GLWindowContext EGLWindow::createContextGeneric(GLWindowContext share)
+{
+    EGLContext shareContext = reinterpret_cast<EGLContext>(share);
+    return reinterpret_cast<GLWindowContext>(createContext(shareContext));
+}
+
+EGLContext EGLWindow::createContext(EGLContext share)
 {
     const char *displayExtensions = eglQueryString(mDisplay, EGL_EXTENSIONS);
 
@@ -721,9 +781,20 @@
     return EGL_FALSE;
 }
 
+bool EGLWindow::makeCurrentGeneric(GLWindowContext context)
+{
+    EGLContext eglContext = reinterpret_cast<EGLContext>(context);
+    return makeCurrent(eglContext);
+}
+
 bool EGLWindow::makeCurrent()
 {
-    if (eglMakeCurrent(mDisplay, mSurface, mSurface, mContext) == EGL_FALSE ||
+    return makeCurrent(mContext);
+}
+
+bool EGLWindow::makeCurrent(EGLContext context)
+{
+    if (eglMakeCurrent(mDisplay, mSurface, mSurface, context) == EGL_FALSE ||
         eglGetError() != EGL_SUCCESS)
     {
         fprintf(stderr, "Error during eglMakeCurrent.\n");
diff --git a/util/EGLWindow.h b/util/EGLWindow.h
index 1b441b8..1cf9394 100644
--- a/util/EGLWindow.h
+++ b/util/EGLWindow.h
@@ -57,8 +57,12 @@
     EGLint samples;
     Optional<bool> contextProgramCacheEnabled;
     EGLenum resetStrategy;
+    EGLenum colorSpace;
+    EGLint swapInterval;
 };
 
+using GLWindowContext = struct GLWindowHandleContext_T *;
+
 class ANGLE_UTIL_EXPORT GLWindowBase : angle::NonCopyable
 {
   public:
@@ -80,6 +84,11 @@
     virtual bool hasError() const                                   = 0;
     virtual bool setSwapInterval(EGLint swapInterval)               = 0;
     virtual angle::GenericProc getProcAddress(const char *name)     = 0;
+    // EGLContext and HGLRC (WGL) are both "handles", which are implemented as pointers.
+    // Use void* here and let the underlying implementation handle interpreting the type correctly.
+    virtual GLWindowContext getCurrentContextGeneric()                  = 0;
+    virtual GLWindowContext createContextGeneric(GLWindowContext share) = 0;
+    virtual bool makeCurrentGeneric(GLWindowContext context)            = 0;
 
     bool isMultisample() const { return mConfigParams.multisample; }
     bool isDebugEnabled() const { return mConfigParams.debug; }
@@ -128,6 +137,10 @@
     bool hasError() const override;
     bool setSwapInterval(EGLint swapInterval) override;
     angle::GenericProc getProcAddress(const char *name) override;
+    // Initializes EGL resources.
+    GLWindowContext getCurrentContextGeneric() override;
+    GLWindowContext createContextGeneric(GLWindowContext share) override;
+    bool makeCurrentGeneric(GLWindowContext context) override;
 
     // Only initializes the Display.
     bool initializeDisplay(OSWindow *osWindow,
@@ -141,7 +154,9 @@
                            const ConfigParameters &params);
 
     // Create an EGL context with this window's configuration
-    EGLContext createContext(EGLContext share) const;
+    EGLContext createContext(EGLContext share);
+    // Make the EGL context current
+    bool makeCurrent(EGLContext context);
 
     // Only initializes the Context.
     bool initializeContext();
@@ -153,7 +168,6 @@
 
   private:
     EGLWindow(EGLint glesMajorVersion, EGLint glesMinorVersion);
-
     ~EGLWindow() override;
 
     EGLConfig mConfig;
diff --git a/util/capture/frame_capture_test_utils.cpp b/util/capture/frame_capture_test_utils.cpp
new file mode 100644
index 0000000..afb6e6e
--- /dev/null
+++ b/util/capture/frame_capture_test_utils.cpp
@@ -0,0 +1,116 @@
+//
+// Copyright 2021 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.
+//
+// frame_capture_test_utils:
+//   Helper functions for capture and replay of traces.
+//
+
+#include "frame_capture_test_utils.h"
+
+#include "common/string_utils.h"
+
+#include <rapidjson/document.h>
+#include <rapidjson/istreamwrapper.h>
+#include <fstream>
+
+namespace angle
+{
+namespace
+{
+bool LoadJSONFromFile(const std::string &fileName, rapidjson::Document *doc)
+{
+    std::ifstream ifs(fileName);
+    if (!ifs.is_open())
+    {
+        return false;
+    }
+
+    rapidjson::IStreamWrapper inWrapper(ifs);
+    doc->ParseStream(inWrapper);
+    return !doc->HasParseError();
+}
+}  // namespace
+
+bool LoadTraceNamesFromJSON(const std::string jsonFilePath, std::vector<std::string> *namesOut)
+{
+    rapidjson::Document doc;
+    if (!LoadJSONFromFile(jsonFilePath, &doc))
+    {
+        return false;
+    }
+
+    if (!doc.IsObject() || !doc.HasMember("traces") || !doc["traces"].IsArray())
+    {
+        return false;
+    }
+
+    // Read trace json into a list of trace names.
+    std::vector<std::string> traces;
+
+    rapidjson::Document::Array traceArray = doc["traces"].GetArray();
+    for (rapidjson::SizeType arrayIndex = 0; arrayIndex < traceArray.Size(); ++arrayIndex)
+    {
+        const rapidjson::Document::ValueType &arrayElement = traceArray[arrayIndex];
+
+        if (!arrayElement.IsString())
+        {
+            return false;
+        }
+
+        std::vector<std::string> traceAndVersion;
+        angle::SplitStringAlongWhitespace(arrayElement.GetString(), &traceAndVersion);
+        traces.push_back(traceAndVersion[0]);
+    }
+
+    *namesOut = std::move(traces);
+    return true;
+}
+
+bool LoadTraceInfoFromJSON(const std::string &traceName,
+                           const std::string &traceJsonPath,
+                           TraceInfo *traceInfoOut)
+{
+    rapidjson::Document doc;
+    if (!LoadJSONFromFile(traceJsonPath, &doc))
+    {
+        return false;
+    }
+
+    if (!doc.IsObject() || !doc.HasMember("TraceMetadata"))
+    {
+        return false;
+    }
+
+    const rapidjson::Document::Object &meta = doc["TraceMetadata"].GetObject();
+
+    strncpy(traceInfoOut->name, traceName.c_str(), kTraceInfoMaxNameLen);
+    traceInfoOut->contextClientMajorVersion = meta["ContextClientMajorVersion"].GetInt();
+    traceInfoOut->contextClientMinorVersion = meta["ContextClientMinorVersion"].GetInt();
+    traceInfoOut->frameEnd                  = meta["FrameEnd"].GetInt();
+    traceInfoOut->frameStart                = meta["FrameStart"].GetInt();
+    traceInfoOut->drawSurfaceHeight         = meta["DrawSurfaceHeight"].GetInt();
+    traceInfoOut->drawSurfaceWidth          = meta["DrawSurfaceWidth"].GetInt();
+    traceInfoOut->drawSurfaceColorSpace     = meta["DrawSurfaceColorSpace"].GetInt();
+
+    traceInfoOut->displayPlatformType = meta["DisplayPlatformType"].GetInt();
+    traceInfoOut->displayDeviceType   = meta["DisplayDeviceType"].GetInt();
+
+    traceInfoOut->configRedBits     = meta["ConfigRedBits"].GetInt();
+    traceInfoOut->configGreenBits   = meta["ConfigGreenBits"].GetInt();
+    traceInfoOut->configBlueBits    = meta["ConfigBlueBits"].GetInt();
+    traceInfoOut->configAlphaBits   = meta["ConfigAlphaBits"].GetInt();
+    traceInfoOut->configDepthBits   = meta["ConfigDepthBits"].GetInt();
+    traceInfoOut->configStencilBits = meta["ConfigStencilBits"].GetInt();
+
+    traceInfoOut->isBinaryDataCompressed = meta["IsBinaryDataCompressed"].GetBool();
+    traceInfoOut->areClientArraysEnabled = meta["AreClientArraysEnabled"].GetBool();
+    traceInfoOut->isBindGeneratesResourcesEnabled =
+        meta["IsBindGeneratesResourcesEnabled"].GetBool();
+    traceInfoOut->isWebGLCompatibilityEnabled = meta["IsWebGLCompatibilityEnabled"].GetBool();
+    traceInfoOut->isRobustResourceInitEnabled = meta["IsRobustResourceInitEnabled"].GetBool();
+
+    return true;
+}
+}  // namespace angle
diff --git a/util/frame_capture_test_utils.h b/util/capture/frame_capture_test_utils.h
similarity index 61%
rename from util/frame_capture_test_utils.h
rename to util/capture/frame_capture_test_utils.h
index cc08adb..2c4c581 100644
--- a/util/frame_capture_test_utils.h
+++ b/util/capture/frame_capture_test_utils.h
@@ -7,8 +7,8 @@
 //   Helper functions for capture and replay of traces.
 //
 
-#ifndef UTIL_FRAME_CAPTURE_TEST_UTILS_H_
-#define UTIL_FRAME_CAPTURE_TEST_UTILS_H_
+#ifndef UTIL_CAPTURE_FRAME_CAPTURE_TEST_UTILS_H_
+#define UTIL_CAPTURE_FRAME_CAPTURE_TEST_UTILS_H_
 
 #include <iostream>
 #include <memory>
@@ -17,6 +17,7 @@
 #include <vector>
 
 #include "common/angleutils.h"
+#include "common/debug.h"
 #include "common/system_utils.h"
 
 #define USE_SYSTEM_ZLIB
@@ -50,15 +51,17 @@
     return uncompressedData.release();
 }
 
-using DecompressCallback = uint8_t *(*)(const std::vector<uint8_t> &);
+using DecompressCallback              = uint8_t *(*)(const std::vector<uint8_t> &);
+using ValidateSerializedStateCallback = void (*)(const char *, const char *, uint32_t);
 
-using SetBinaryDataDecompressCallbackFunc = void (*)(DecompressCallback);
-using SetBinaryDataDirFunc                = void (*)(const char *);
-using SetupReplayFunc                     = void (*)();
-using ReplayFrameFunc                     = void (*)(uint32_t);
-using ResetReplayFunc                     = void (*)();
-using FinishReplayFunc                    = void (*)();
-using GetSerializedContextStateFunc       = const char *(*)(uint32_t);
+using SetBinaryDataDecompressCallbackFunc    = void (*)(DecompressCallback);
+using SetBinaryDataDirFunc                   = void (*)(const char *);
+using SetupReplayFunc                        = void (*)();
+using ReplayFrameFunc                        = void (*)(uint32_t);
+using ResetReplayFunc                        = void (*)();
+using FinishReplayFunc                       = void (*)();
+using GetSerializedContextStateFunc          = const char *(*)(uint32_t);
+using SetValidateSerializedStateCallbackFunc = void (*)(ValidateSerializedStateCallback);
 
 class TraceLibrary
 {
@@ -79,7 +82,10 @@
         mTraceLibrary.reset(OpenSharedLibrary(traceName.c_str(), SearchType::ModuleDir));
     }
 
-    bool valid() const { return mTraceLibrary != nullptr; }
+    bool valid() const
+    {
+        return (mTraceLibrary != nullptr) && (mTraceLibrary->getNative() != nullptr);
+    }
 
     void setBinaryDataDir(const char *dataDir)
     {
@@ -104,6 +110,12 @@
         return callFunc<GetSerializedContextStateFunc>("GetSerializedContextState", frameIndex);
     }
 
+    void setValidateSerializedStateCallback(ValidateSerializedStateCallback callback)
+    {
+        return callFunc<SetValidateSerializedStateCallbackFunc>(
+            "SetValidateSerializedStateCallback", callback);
+    }
+
   private:
     template <typename FuncT, typename... ArgsT>
     typename std::result_of<FuncT(ArgsT...)>::type callFunc(const char *funcName, ArgsT... args)
@@ -121,6 +133,37 @@
     std::unique_ptr<Library> mTraceLibrary;
 };
 
+static constexpr size_t kTraceInfoMaxNameLen = 128;
+
+struct TraceInfo
+{
+    char name[kTraceInfoMaxNameLen];
+    uint32_t contextClientMajorVersion;
+    uint32_t contextClientMinorVersion;
+    uint32_t frameStart;
+    uint32_t frameEnd;
+    uint32_t drawSurfaceWidth;
+    uint32_t drawSurfaceHeight;
+    uint32_t drawSurfaceColorSpace;
+    uint32_t displayPlatformType;
+    uint32_t displayDeviceType;
+    int configRedBits;
+    int configBlueBits;
+    int configGreenBits;
+    int configAlphaBits;
+    int configDepthBits;
+    int configStencilBits;
+    bool isBinaryDataCompressed;
+    bool areClientArraysEnabled;
+    bool isBindGeneratesResourcesEnabled;
+    bool isWebGLCompatibilityEnabled;
+    bool isRobustResourceInitEnabled;
+};
+
+bool LoadTraceNamesFromJSON(const std::string jsonFilePath, std::vector<std::string> *namesOut);
+bool LoadTraceInfoFromJSON(const std::string &traceName,
+                           const std::string &traceJsonPath,
+                           TraceInfo *traceInfoOut);
 }  // namespace angle
 
-#endif  // UTIL_FRAME_CAPTURE_TEST_UTILS_H_
+#endif  // UTIL_CAPTURE_FRAME_CAPTURE_TEST_UTILS_H_
diff --git a/util/display/DisplayPixmap.cpp b/util/display/DisplayPixmap.cpp
index 27d2734..67c0874 100644
--- a/util/display/DisplayPixmap.cpp
+++ b/util/display/DisplayPixmap.cpp
@@ -8,7 +8,7 @@
 
 #include "util/OSPixmap.h"
 
-#if defined(ANGLE_USE_VULKAN_DISPLAY)
+#if defined(ANGLE_USE_VULKAN_DISPLAY) && defined(EGL_NO_X11)
 OSPixmap *CreateOSPixmap()
 {
     return nullptr;
diff --git a/util/display/DisplayWindow.cpp b/util/display/DisplayWindow.cpp
index d11f522..6cd0053 100644
--- a/util/display/DisplayWindow.cpp
+++ b/util/display/DisplayWindow.cpp
@@ -79,7 +79,7 @@
 }
 
 // static
-#if defined(ANGLE_USE_VULKAN_DISPLAY)
+#if defined(ANGLE_USE_VULKAN_DISPLAY) && defined(EGL_NO_X11)
 OSWindow *OSWindow::New()
 {
     return new DisplayWindow();
diff --git a/util/gles_loader_autogen.cpp b/util/gles_loader_autogen.cpp
index e036678..3d8e338 100644
--- a/util/gles_loader_autogen.cpp
+++ b/util/gles_loader_autogen.cpp
@@ -573,6 +573,8 @@
 ANGLE_UTIL_EXPORT PFNGLCOPYTEXTURECHROMIUMPROC l_glCopyTextureCHROMIUM;
 ANGLE_UTIL_EXPORT PFNGLCOVERAGEMODULATIONCHROMIUMPROC l_glCoverageModulationCHROMIUM;
 ANGLE_UTIL_EXPORT PFNGLLOSECONTEXTCHROMIUMPROC l_glLoseContextCHROMIUM;
+ANGLE_UTIL_EXPORT PFNGLEGLIMAGETARGETTEXSTORAGEEXTPROC l_glEGLImageTargetTexStorageEXT;
+ANGLE_UTIL_EXPORT PFNGLEGLIMAGETARGETTEXTURESTORAGEEXTPROC l_glEGLImageTargetTextureStorageEXT;
 ANGLE_UTIL_EXPORT PFNGLBINDFRAGDATALOCATIONEXTPROC l_glBindFragDataLocationEXT;
 ANGLE_UTIL_EXPORT PFNGLBINDFRAGDATALOCATIONINDEXEDEXTPROC l_glBindFragDataLocationIndexedEXT;
 ANGLE_UTIL_EXPORT PFNGLGETFRAGDATAINDEXEXTPROC l_glGetFragDataIndexEXT;
@@ -1688,6 +1690,11 @@
         loadProc("glCoverageModulationCHROMIUM"));
     l_glLoseContextCHROMIUM =
         reinterpret_cast<PFNGLLOSECONTEXTCHROMIUMPROC>(loadProc("glLoseContextCHROMIUM"));
+    l_glEGLImageTargetTexStorageEXT = reinterpret_cast<PFNGLEGLIMAGETARGETTEXSTORAGEEXTPROC>(
+        loadProc("glEGLImageTargetTexStorageEXT"));
+    l_glEGLImageTargetTextureStorageEXT =
+        reinterpret_cast<PFNGLEGLIMAGETARGETTEXTURESTORAGEEXTPROC>(
+            loadProc("glEGLImageTargetTextureStorageEXT"));
     l_glBindFragDataLocationEXT =
         reinterpret_cast<PFNGLBINDFRAGDATALOCATIONEXTPROC>(loadProc("glBindFragDataLocationEXT"));
     l_glBindFragDataLocationIndexedEXT = reinterpret_cast<PFNGLBINDFRAGDATALOCATIONINDEXEDEXTPROC>(
diff --git a/util/gles_loader_autogen.h b/util/gles_loader_autogen.h
index cada84e..af81502 100644
--- a/util/gles_loader_autogen.h
+++ b/util/gles_loader_autogen.h
@@ -568,6 +568,8 @@
 #define glCopyTextureCHROMIUM l_glCopyTextureCHROMIUM
 #define glCoverageModulationCHROMIUM l_glCoverageModulationCHROMIUM
 #define glLoseContextCHROMIUM l_glLoseContextCHROMIUM
+#define glEGLImageTargetTexStorageEXT l_glEGLImageTargetTexStorageEXT
+#define glEGLImageTargetTextureStorageEXT l_glEGLImageTargetTextureStorageEXT
 #define glBindFragDataLocationEXT l_glBindFragDataLocationEXT
 #define glBindFragDataLocationIndexedEXT l_glBindFragDataLocationIndexedEXT
 #define glGetFragDataIndexEXT l_glGetFragDataIndexEXT
@@ -1381,6 +1383,9 @@
 ANGLE_UTIL_EXPORT extern PFNGLCOPYTEXTURECHROMIUMPROC l_glCopyTextureCHROMIUM;
 ANGLE_UTIL_EXPORT extern PFNGLCOVERAGEMODULATIONCHROMIUMPROC l_glCoverageModulationCHROMIUM;
 ANGLE_UTIL_EXPORT extern PFNGLLOSECONTEXTCHROMIUMPROC l_glLoseContextCHROMIUM;
+ANGLE_UTIL_EXPORT extern PFNGLEGLIMAGETARGETTEXSTORAGEEXTPROC l_glEGLImageTargetTexStorageEXT;
+ANGLE_UTIL_EXPORT extern PFNGLEGLIMAGETARGETTEXTURESTORAGEEXTPROC
+    l_glEGLImageTargetTextureStorageEXT;
 ANGLE_UTIL_EXPORT extern PFNGLBINDFRAGDATALOCATIONEXTPROC l_glBindFragDataLocationEXT;
 ANGLE_UTIL_EXPORT extern PFNGLBINDFRAGDATALOCATIONINDEXEDEXTPROC l_glBindFragDataLocationIndexedEXT;
 ANGLE_UTIL_EXPORT extern PFNGLGETFRAGDATAINDEXEXTPROC l_glGetFragDataIndexEXT;
diff --git a/util/test_utils.h b/util/test_utils.h
index 746ea44..2774418 100644
--- a/util/test_utils.h
+++ b/util/test_utils.h
@@ -44,7 +44,7 @@
 // Get temporary directory.
 bool GetTempDir(char *tempDirOut, uint32_t maxDirNameLen);
 
-// Creates a temporary file. The full path is placed in |path|, and the
+// Creates a temporary file. The full path is placed in |tempFileNameOut|, 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.
 bool CreateTemporaryFile(char *tempFileNameOut, uint32_t maxFileNameLen);
diff --git a/util/windows/WGLWindow.cpp b/util/windows/WGLWindow.cpp
index 9de1c68..83b8d86 100644
--- a/util/windows/WGLWindow.cpp
+++ b/util/windows/WGLWindow.cpp
@@ -116,61 +116,9 @@
         }
     }
 
-    mWGLContext = _wglCreateContext(mDeviceContext);
-    if (!mWGLContext)
+    mWGLContext = createContext(configParams, nullptr);
+    if (mWGLContext == nullptr)
     {
-        std::cerr << "Failed to create a WGL context." << std::endl;
-        return false;
-    }
-
-    if (!makeCurrent())
-    {
-        return false;
-    }
-
-    // Reload entry points to capture extensions.
-    angle::LoadWGL(GetProcAddressWithFallback);
-
-    if (!_wglGetExtensionsStringARB)
-    {
-        std::cerr << "Driver does not expose wglGetExtensionsStringARB." << std::endl;
-        return false;
-    }
-
-    const char *extensionsString = _wglGetExtensionsStringARB(mDeviceContext);
-
-    std::vector<std::string> extensions;
-    angle::SplitStringAlongWhitespace(extensionsString, &extensions);
-
-    if (!HasExtension(extensions, "WGL_EXT_create_context_es2_profile"))
-    {
-        std::cerr << "Driver does not expose WGL_EXT_create_context_es2_profile." << std::endl;
-        return false;
-    }
-
-    if (configParams.webGLCompatibility.valid() || configParams.robustResourceInit.valid())
-    {
-        std::cerr << "WGLWindow does not support the requested feature set." << std::endl;
-        return false;
-    }
-
-    // Tear down the context and create another with ES2 compatibility.
-    _wglDeleteContext(mWGLContext);
-
-    // This could be extended to cover ES1 compatiblity.
-    int kCreateAttribs[] = {WGL_CONTEXT_MAJOR_VERSION_ARB,
-                            mClientMajorVersion,
-                            WGL_CONTEXT_MINOR_VERSION_ARB,
-                            mClientMinorVersion,
-                            WGL_CONTEXT_PROFILE_MASK_ARB,
-                            WGL_CONTEXT_ES2_PROFILE_BIT_EXT,
-                            0,
-                            0};
-
-    mWGLContext = _wglCreateContextAttribsARB(mDeviceContext, nullptr, kCreateAttribs);
-    if (!mWGLContext)
-    {
-        std::cerr << "Failed to create an ES2 compatible WGL context." << std::endl;
         return false;
     }
 
@@ -186,6 +134,70 @@
     return true;
 }
 
+HGLRC WGLWindow::createContext(const ConfigParameters &configParams, HGLRC shareContext)
+{
+    HGLRC context = _wglCreateContext(mDeviceContext);
+    if (!context)
+    {
+        std::cerr << "Failed to create a WGL context." << std::endl;
+        return context;
+    }
+
+    if (!makeCurrent(context))
+    {
+        std::cerr << "Failed to make WGL context current." << std::endl;
+        return context;
+    }
+
+    // Reload entry points to capture extensions.
+    angle::LoadWGL(GetProcAddressWithFallback);
+
+    if (!_wglGetExtensionsStringARB)
+    {
+        std::cerr << "Driver does not expose wglGetExtensionsStringARB." << std::endl;
+        return context;
+    }
+
+    const char *extensionsString = _wglGetExtensionsStringARB(mDeviceContext);
+
+    std::vector<std::string> extensions;
+    angle::SplitStringAlongWhitespace(extensionsString, &extensions);
+
+    if (!HasExtension(extensions, "WGL_EXT_create_context_es2_profile"))
+    {
+        std::cerr << "Driver does not expose WGL_EXT_create_context_es2_profile." << std::endl;
+        return context;
+    }
+
+    if (mConfigParams.webGLCompatibility.valid() || mConfigParams.robustResourceInit.valid())
+    {
+        std::cerr << "WGLWindow does not support the requested feature set." << std::endl;
+        return context;
+    }
+
+    // Tear down the context and create another with ES2 compatibility.
+    _wglDeleteContext(context);
+
+    // This could be extended to cover ES1 compatiblity.
+    int kCreateAttribs[] = {WGL_CONTEXT_MAJOR_VERSION_ARB,
+                            mClientMajorVersion,
+                            WGL_CONTEXT_MINOR_VERSION_ARB,
+                            mClientMinorVersion,
+                            WGL_CONTEXT_PROFILE_MASK_ARB,
+                            WGL_CONTEXT_ES2_PROFILE_BIT_EXT,
+                            0,
+                            0};
+
+    context = _wglCreateContextAttribsARB(mDeviceContext, shareContext, kCreateAttribs);
+    if (!context)
+    {
+        std::cerr << "Failed to create an ES2 compatible WGL context." << std::endl;
+        return context;
+    }
+
+    return context;
+}
+
 void WGLWindow::destroyGL()
 {
     if (mWGLContext)
@@ -206,9 +218,39 @@
     return mWGLContext != nullptr;
 }
 
+GLWindowContext WGLWindow::getCurrentContextGeneric()
+{
+    return reinterpret_cast<GLWindowContext>(mWGLContext);
+}
+
+GLWindowContext WGLWindow::createContextGeneric(GLWindowContext share)
+{
+    HGLRC shareContext = reinterpret_cast<HGLRC>(share);
+    HGLRC newContext   = createContext(mConfigParams, shareContext);
+
+    // createContext() calls makeCurrent(newContext), so we need to restore the current context.
+    if (!makeCurrent())
+    {
+        return nullptr;
+    }
+
+    return reinterpret_cast<GLWindowContext>(newContext);
+}
+
 bool WGLWindow::makeCurrent()
 {
-    if (_wglMakeCurrent(mDeviceContext, mWGLContext) == FALSE)
+    return makeCurrent(mWGLContext);
+}
+
+bool WGLWindow::makeCurrentGeneric(GLWindowContext context)
+{
+    HGLRC wglContext = reinterpret_cast<HGLRC>(context);
+    return makeCurrent(wglContext);
+}
+
+bool WGLWindow::makeCurrent(HGLRC context)
+{
+    if (_wglMakeCurrent(mDeviceContext, context) == FALSE)
     {
         std::cerr << "Error during wglMakeCurrent.\n";
         return false;
diff --git a/util/windows/WGLWindow.h b/util/windows/WGLWindow.h
index 6565935..0e19764 100644
--- a/util/windows/WGLWindow.h
+++ b/util/windows/WGLWindow.h
@@ -35,12 +35,20 @@
                       const ConfigParameters &configParams) override;
     void destroyGL() override;
     bool isGLInitialized() const override;
-
     bool makeCurrent() override;
     void swap() override;
     bool hasError() const override;
     bool setSwapInterval(EGLint swapInterval) override;
     angle::GenericProc getProcAddress(const char *name) override;
+    // Initializes WGL resources.
+    GLWindowContext getCurrentContextGeneric() override;
+    GLWindowContext createContextGeneric(GLWindowContext share) override;
+    bool makeCurrentGeneric(GLWindowContext context) override;
+
+    // Create a WGL context with this window's configuration
+    HGLRC createContext(const ConfigParameters &configParams, HGLRC shareContext);
+    // Make the WGL context current
+    bool makeCurrent(HGLRC context);
 
   private:
     WGLWindow(int glesMajorVersion, int glesMinorVersion);